ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggNzI2MDg0Mi4uZGZhYjEyZiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTk2LDQgKzk2LDYgQEAKIFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgogVG9ueSBMdWNrIDx0b255Lmx1Y2tAaW50ZWwuY29tPgogVHN1bmVvIFlvc2hpb2thIDxUc3VuZW8uWW9zaGlva2FAZi1zZWN1cmUuY29tPgorVXdlIEtsZWluZS1Lw7ZuaWcgPFV3ZS5LbGVpbmUtS29lbmlnQGRpZ2kuY29tPgorVXdlIEtsZWluZS1Lw7ZuaWcgPHVrbGVpbmVrQGluZm9ybWF0aWsudW5pLWZyZWlidXJnLmRlPgogVmFsZGlzIEtsZXRuaWVrcyA8VmFsZGlzLktsZXRuaWVrc0B2dC5lZHU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAppbmRleCA1YjVhYmE0Li43Mjg2YWQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKQEAgLTIxLDYgKzIxLDkgQEAKIAktIGxpc3Qgb2YgY2hhbmdlcyB0aGF0IGJyZWFrIG9sZGVyIHNvZnR3YXJlIHBhY2thZ2VzLgogQ29kaW5nU3R5bGUKIAktIGhvdyB0aGUgYm9zcyBsaWtlcyB0aGUgQyBjb2RlIGluIHRoZSBrZXJuZWwgdG8gbG9vay4KK2RldmVsb3BtZW50LXByb2Nlc3MvCisJLSBBbiBleHRlbmRlZCB0dXRvcmlhbCBvbiBob3cgdG8gd29yayB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKKwkgIHByb2Nlc3MuCiBETUEtQVBJLnR4dAogCS0gRE1BIEFQSSwgcGNpXyBBUEkgJiBleHRlbnNpb25zIGZvciBub24tY29uc2lzdGVudCBtZW1vcnkgbWFjaGluZXMuCiBETUEtSVNBLUxQQy50eHQKQEAgLTE1OSw4ICsxNjIsNiBAQAogCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCiBoaWdodWlkLnR4dAogCS0gbm90ZXMgb24gdGhlIGNoYW5nZSBmcm9tIDE2IGJpdCB0byAzMiBiaXQgdXNlci9ncm91cCBJRHMuCi1ocGV0LnR4dAotCS0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eC4KIHRpbWVycy8KIAktIGluZm8gb24gdGhlIHRpbWVyIHJlbGF0ZWQgdG9waWNzCiBod19yYW5kb20udHh0CkBAIC0yNTEsOCArMjUyLDYgQEAKIAktIGhvdyB0byBleGVjdXRlIE1vbm8tYmFzZWQgLk5FVCBiaW5hcmllcyB3aXRoIHRoZSBoZWxwIG9mIEJJTkZNVF9NSVNDLgogbW94YS1zbWFydGlvCiAJLSBmaWxlIHdpdGggaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCi1tdHJyLnR4dAotCS0gaG93IHRvIHVzZSBQUHJvIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KIG11dGV4LWRlc2lnbi50eHQKIAktIGluZm8gb24gdGhlIGdlbmVyaWMgbXV0ZXggc3Vic3lzdGVtLgogbmFtZXNwYWNlcy8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcmVndWxhdG9yIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKaW5kZXggNzlhNGE3NS4uMzczMWY2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IKQEAgLTEsNyArMSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N0YXRlCiBEYXRlOgkJQXByaWwgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgc3RhdGUuCkBAIC0yNyw3ICsyNyw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3R5cGUKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQl0eXBlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3IgdHlwZS4KQEAgLTUxLDcgKzUxLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWljcm92b2x0cwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSBzZXR0aW5nCkBAIC02NSw3ICs2NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL21pY3JvYW1wcwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dCBjdXJyZW50IGxpbWl0CkBAIC03OSw3ICs3OSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL29wbW9kZQogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW9wbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlIHNldHRpbmcuCkBAIC0xMDIsNyArMTAyLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWluX21pY3Jvdm9sdHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltaW5fbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWluaW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCkBAIC0xMTYsNyArMTE2LDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWF4X21pY3Jvdm9sdHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltYXhfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWF4aW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCkBAIC0xMzAsNyArMTMwLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vbWluX21pY3JvYW1wcwogRGF0ZToJCUFwcmlsIDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pbl9taWNyb2FtcHMuIFRoaXMgaG9sZHMgdGhlIG1pbmltdW0gc2FmZSB3b3JraW5nIHJlZ3VsYXRvcgpAQCAtMTQ1LDcgKzE0NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL21heF9taWNyb2FtcHMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltYXhfbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSBtYXhpbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKQEAgLTE1NywxMCArMTU3LDIzIEBACiAJCXBsYXRmb3JtIGNvZGUuCiAKIAorV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9uYW1lCitEYXRlOgkJT2N0b2JlciAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjgKK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CitEZXNjcmlwdGlvbjoKKwkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQluYW1lLiBUaGlzIGhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSByZWd1bGF0b3IgZm9yCisJCWRpc3BsYXkgcHVycG9zZXMuCisKKwkJTk9URTogdGhpcyB3aWxsIGJlIGVtcHR5IGlmIG5vIHN1aXRhYmxlIG5hbWUgaXMgcHJvdmlkZWQKKwkJYnkgcGxhdGZvcm0gb3IgcmVndWxhdG9yIGRyaXZlcnMuCisKKwogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9udW1fdXNlcnMKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQludW1fdXNlcnMuIFRoaXMgaG9sZHMgdGhlIG51bWJlciBvZiBjb25zdW1lciBkZXZpY2VzIHRoYXQKQEAgLTE3MCw3ICsxODMsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9yZXF1ZXN0ZWRfbWljcm9hbXBzCiBEYXRlOgkJQXByaWwgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJcmVxdWVzdGVkX21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgdG90YWwgcmVxdWVzdGVkIGxvYWQKQEAgLTE4MSw3ICsxOTQsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9wYXJlbnQKIERhdGU6CQlBcHJpbCAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgbGluayBjYWxsZWQgcGFyZW50LgogCQlUaGlzIHBvaW50cyB0byB0aGUgcGFyZW50IG9yIHN1cHBseSByZWd1bGF0b3IgaWYgb25lIGV4aXN0cy4KQEAgLTE4OSw3ICsyMDIsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQKQEAgLTIwMyw3ICsyMTYsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX2Rpc2tfbWljcm92b2x0cwogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dApAQCAtMjE3LDcgKzIzMCw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0CkBAIC0yMzEsNyArMjQ0LDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9tZW1fbW9kZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX21lbV9tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKQEAgLTI0NSw3ICsyNTgsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX2Rpc2tfbW9kZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCkBAIC0yNTgsNyArMjcxLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X21vZGUKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2Ci1Db250YWN0OglMaWFtIEdpcmR3b29kIDxsZ0BvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CitDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246CiAJCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9zdGFuZGJ5X21vZGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZQpAQCAtMjcyLDcgKzI4NSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfbWVtX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIHN0YXRlCkBAIC0yODcsNyArMzAwLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9kaXNrX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgotQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgogCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfZGlza19zdGF0ZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBzdGF0ZQpAQCAtMzAyLDcgKzMxNSw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKLUNvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxnQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KK0NvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKIAkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX3N0YW5kYnlfc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZ3BpbyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZ3BpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFiODA5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ncGlvCkBAIC0wLDAgKzEsMjYgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2dwaW8vCitEYXRlOgkJSnVseSAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjcKK0NvbnRhY3Q6CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CisKKyAgQXMgYSBLY29uZmlnIG9wdGlvbiwgaW5kaXZpZHVhbCBHUElPIHNpZ25hbHMgbWF5IGJlIGFjY2Vzc2VkIGZyb20KKyAgdXNlcnNwYWNlLiAgR1BJT3MgYXJlIG9ubHkgbWFkZSBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIGJ5IGFuIGV4cGxpY2l0CisgICJleHBvcnQiIG9wZXJhdGlvbi4gIElmIGEgZ2l2ZW4gR1BJTyBpcyBub3QgY2xhaW1lZCBmb3IgdXNlIGJ5CisgIGtlcm5lbCBjb2RlLCBpdCBtYXkgYmUgZXhwb3J0ZWQgYnkgdXNlcnNwYWNlIChhbmQgdW5leHBvcnRlZCBsYXRlcikuCisgIEtlcm5lbCBjb2RlIG1heSBleHBvcnQgaXQgZm9yIGNvbXBsZXRlIG9yIHBhcnRpYWwgYWNjZXNzLgorCisgIEdQSU9zIGFyZSBpZGVudGlmaWVkIGFzIHRoZXkgYXJlIGluc2lkZSB0aGUga2VybmVsLCB1c2luZyBpbnRlZ2VycyBpbgorICB0aGUgcmFuZ2UgMC4uSU5UX01BWC4gIFNlZSBEb2N1bWVudGF0aW9uL2dwaW8udHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICAgL3N5cy9jbGFzcy9ncGlvCisJL2V4cG9ydCAuLi4gYXNrcyB0aGUga2VybmVsIHRvIGV4cG9ydCBhIEdQSU8gdG8gdXNlcnNwYWNlCisJL3VuZXhwb3J0IC4uLiB0byByZXR1cm4gYSBHUElPIHRvIHRoZSBrZXJuZWwKKwkvZ3Bpb04gLi4uIGZvciBlYWNoIGV4cG9ydGVkIEdQSU8gI04KKwkgICAgL3ZhbHVlIC4uLiBhbHdheXMgcmVhZGFibGUsIHdyaXRlcyBmYWlsIGZvciBpbnB1dCBHUElPcworCSAgICAvZGlyZWN0aW9uIC4uLiByL3cgYXM6IGluLCBvdXQgKGRlZmF1bHQgbG93KTsgd3JpdGU6IGhpZ2gsIGxvdworCS9ncGlvY2hpcE4gLi4uIGZvciBlYWNoIGdwaW9jaGlwOyAjTiBpcyBpdHMgZmlyc3QgR1BJTworCSAgICAvYmFzZSAuLi4gKHIvbykgc2FtZSBhcyBOCisJICAgIC9sYWJlbCAuLi4gKHIvbykgZGVzY3JpcHRpdmUsIG5vdCBuZWNlc3NhcmlseSB1bmlxdWUKKwkgICAgL25ncGlvIC4uLiAoci9vKSBudW1iZXIgb2YgR1BJT3M7IG51bWJlcmVkIE4gdG8gTiArIChuZ3BpbyAtIDEpCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcHJvZmlsaW5nIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wcm9maWxpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyZDhiOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcHJvZmlsaW5nCkBAIC0wLDAgKzEsMTMgQEAKK1doYXQ6CQkvc3lzL2tlcm5lbC9wcm9maWxlCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CURhdmUgSGFuc2VuIDxkYXZlQGxpbnV4LnZuZXQuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQkvc3lzL2tlcm5lbC9wcm9maWxlIGlzIHRoZSBydW50aW1lIGVxdWl2YWxlbnQKKwkJb2YgdGhlIGJvb3QtdGltZSBwcm9maWxlPSBvcHRpb24uCisKKwkJWW91IGNhbiBnZXQgdGhlIHNhbWUgZWZmZWN0IHJ1bm5pbmc6CisKKwkJCWVjaG8gMiA+IC9zeXMva2VybmVsL3Byb2ZpbGUKKworCQlhcyB5b3Ugd291bGQgYnkgaXNzdWluZyBwcm9maWxlPTIgb24gdGhlIGJvb3QKKwkJY29tbWFuZCBsaW5lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKaW5kZXggZDhiNjNkMS4uYjhlODY0NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CkBAIC0zMzcsNyArMzM3LDcgQEAKIAlpbnQgaSwgY291bnQgPSBkbWFfbWFwX3NnKGRldiwgc2dsaXN0LCBuZW50cywgZGlyZWN0aW9uKTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCi0JZm9yIChpID0gMCwgc2cgPSBzZ2xpc3Q7IGkgPCBjb3VudDsgaSsrLCBzZysrKSB7CisJZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgY291bnQsIGkpIHsKIAkJaHdfYWRkcmVzc1tpXSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKIAkJaHdfbGVuW2ldID0gc2dfZG1hX2xlbihzZyk7CiAJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAppbmRleCBiNDYzZWNkLi5jNzRmZWM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dApAQCAtNzQwLDcgKzc0MCw3IEBACiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwogCiAJZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIGFkZHIsIHNpemUsIGRpcmVjdGlvbik7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihkbWFfaGFuZGxlKSkgeworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocGRldiwgZG1hX2hhbmRsZSkpIHsKIAkJLyoKIAkJICogcmVkdWNlIGN1cnJlbnQgRE1BIG1hcHBpbmcgdXNhZ2UsCiAJCSAqIGRlbGF5IGFuZCB0cnkgYWdhaW4gbGF0ZXIgb3IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCAxNjE1MzUwLi5mYWJjMDY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogIyBUbyBhZGQgYSBuZXcgYm9vayB0aGUgb25seSBzdGVwIHJlcXVpcmVkIGlzIHRvIGFkZCB0aGUgYm9vayB0byB0aGUKICMgbGlzdCBvZiBET0NCT09LUy4KIAotRE9DQk9PS1MgOj0gd2FuYm9vay54bWwgejg1MzBib29rLnhtbCBtY2Fib29rLnhtbCB2aWRlb2Jvb2sueG1sIFwKK0RPQ0JPT0tTIDo9IHdhbmJvb2sueG1sIHo4NTMwYm9vay54bWwgbWNhYm9vay54bWwgXAogCSAgICBrZXJuZWwtaGFja2luZy54bWwga2VybmVsLWxvY2tpbmcueG1sIGRldmljZWlvYm9vay54bWwgXAogCSAgICBwcm9jZnMtZ3VpZGUueG1sIHdyaXRpbmdfdXNiX2RyaXZlci54bWwgbmV0d29ya2luZy54bWwgXAogCSAgICBrZXJuZWwtYXBpLnhtbCBmaWxlc3lzdGVtcy54bWwgbHNtLnhtbCB1c2IueG1sIGtnZGIueG1sIFwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IGI3YjE0ODIuLjlkMDA1OGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMjgzLDYgKzI4Myw3IEBACiAgIDxjaGFwdGVyIGlkPSJzZWN1cml0eSI+CiAgICAgIDx0aXRsZT5TZWN1cml0eSBGcmFtZXdvcms8L3RpdGxlPgogIUlzZWN1cml0eS9zZWN1cml0eS5jCishRXNlY3VyaXR5L2lub2RlLmMKICAgPC9jaGFwdGVyPgogCiAgIDxjaGFwdGVyIGlkPSJhdWRpdCI+CkBAIC0zNjQsNiArMzY1LDEwIEBACiAhRWJsb2NrL2Jsay1iYXJyaWVyLmMKICFFYmxvY2svYmxrLXRhZy5jCiAhSWJsb2NrL2Jsay10YWcuYworIUVibG9jay9ibGstaW50ZWdyaXR5LmMKKyFJYmxvY2svYmxrdHJhY2UuYworIUlibG9jay9nZW5oZC5jCishRWJsb2NrL2dlbmhkLmMKICAgPC9jaGFwdGVyPgogCiAgIDxjaGFwdGVyIGlkPSJjaHJkZXYiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21hYzgwMjExLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWFjODAyMTEudG1wbAppbmRleCBiNjUxZTBhLi43N2MzYzIwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWFjODAyMTEudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWFjODAyMTEudG1wbApAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIHRoaXMgdGhvdWdoIGFuZCB0aGUgcmVjb21tZW5kYXRpb24gdG8gYWxsb3cgb25seSBhIHNpbmdsZQogICAgICAgICBpbnRlcmZhY2UgaW4gU1RBIG1vZGUgYXQgZmlyc3QhCiAgICAgICA8L3BhcmE+Ci0hRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2lmX3R5cGVzCiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2lmX2luaXRfY29uZgogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9pZl9jb25mCiAgICAgPC9jaGFwdGVyPgpAQCAtMTc3LDggKzE3Niw3IEBACiAgICAgICAgIDx0aXRsZT5mdW5jdGlvbnMvZGVmaW5pdGlvbnM8L3RpdGxlPgogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9yeF9zdGF0dXMKICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBtYWM4MDIxMV9yeF9mbGFncwotIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV90eF9jb250cm9sCi0hRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX3R4X3N0YXR1c19mbGFncworIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV90eF9pbmZvCiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX3J4CiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX3J4X2lycXNhZmUKICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfdHhfc3RhdHVzCkBAIC0xODksMTIgKzE4NywxMSBAQAogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9jdHN0b3NlbGZfZHVyYXRpb24KICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfZ2VuZXJpY19mcmFtZV9kdXJhdGlvbgogIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiCi0hRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX2dldF9oZHJsZW4KKyFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfaGRybGVuCiAhRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX3dha2VfcXVldWUKICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfc3RvcF9xdWV1ZQotIUZpbmNsdWRlL25ldC9tYWM4MDIxMS5oIGllZWU4MDIxMV9zdGFydF9xdWV1ZXMKLSFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfc3RvcF9xdWV1ZXMKICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfd2FrZV9xdWV1ZXMKKyFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfc3RvcF9xdWV1ZXMKICAgICAgIDwvc2VjdDE+CiAgICAgPC9jaGFwdGVyPgogCkBAIC0yMzAsOCArMjI3LDcgQEAKICAgICAgIDx0aXRsZT5NdWx0aXBsZSBxdWV1ZXMgYW5kIFFvUyBzdXBwb3J0PC90aXRsZT4KICAgICAgIDxwYXJhPlRCRDwvcGFyYT4KICFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zCi0hRmluY2x1ZGUvbmV0L21hYzgwMjExLmggaWVlZTgwMjExX3R4X3F1ZXVlX3N0YXRzX2RhdGEKLSFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfdHhfcXVldWUKKyFGaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMKICAgICA8L2NoYXB0ZXI+CiAKICAgICA8Y2hhcHRlciBpZD0iQVAiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCmluZGV4IDhhNWRjNmUuLjllYmE0YjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKQEAgLTE0LDE3ICsxNCwyMCBAQAogCTxvdGhlcm5hbWU+KEouQS5LLik8L290aGVybmFtZT4KIAk8c3VybmFtZT5Nb3V3PC9zdXJuYW1lPgogCTxhZmZpbGlhdGlvbj4KLQkgIDxvcmduYW1lPkRlbGZ0IFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neTwvb3JnbmFtZT4KLQkgIDxvcmdkaXY+RmFjdWx0eSBvZiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IGFuZCBTeXN0ZW1zPC9vcmdkaXY+CiAJICA8YWRkcmVzcz4KLSAgICAgICAgICAgIDxlbWFpbD5KLkEuSy5Nb3V3QGl0cy50dWRlbGZ0Lm5sPC9lbWFpbD4KLSAgICAgICAgICAgIDxwb2I+UE8gQk9YIDUwMzE8L3BvYj4KLSAgICAgICAgICAgIDxwb3N0Y29kZT4yNjAwIEdBPC9wb3N0Y29kZT4KLSAgICAgICAgICAgIDxjaXR5PkRlbGZ0PC9jaXR5PgotICAgICAgICAgICAgPGNvdW50cnk+VGhlIE5ldGhlcmxhbmRzPC9jb3VudHJ5PgorICAgICAgICAgICAgPGVtYWlsPm1vdXdAbmwubGludXgub3JnPC9lbWFpbD4KICAgICAgICAgICA8L2FkZHJlc3M+CiAJPC9hZmZpbGlhdGlvbj4KICAgICAgIDwvYXV0aG9yPgorICAgICAgPG90aGVyY3JlZGl0PgorCTxjb250cmliPgorCVRoaXMgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gd2VyZSB3cml0dGVuIHdoaWxlIHdvcmtpbmcgb24gdGhlCisJTEFSVCBjb21wdXRpbmcgYm9hcmQKKwkoPHVsaW5rIHVybD0iaHR0cDovL3d3dy5sYXJ0bWFrZXIubmwvIj5odHRwOi8vd3d3LmxhcnRtYWtlci5ubC88L3VsaW5rPiksCisJd2hpY2ggd2FzIHNwb25zb3JlZCBieSB0aGUgRGVsdCBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kgcHJvamVjdHMKKwlNb2JpbGUgTXVsdGktbWVkaWEgQ29tbXVuaWNhdGlvbnMgYW5kIFViaXF1aXRvdXMgQ29tbXVuaWNhdGlvbnMuCisJPC9jb250cmliPgorICAgICAgPC9vdGhlcmNyZWRpdD4KICAgICA8L2F1dGhvcmdyb3VwPgogCiAgICAgPHJldmhpc3Rvcnk+CkBAIC0xMDksMTggKzExMiw2IEBACiAgICAgPC9wYXJhPgogCiAgICAgPHBhcmE+Ci0gICAgICBUaGlzIGRvY3VtZW50YXRpb24gd2FzIHdyaXR0ZW4gd2hpbGUgd29ya2luZyBvbiB0aGUgTEFSVAotICAgICAgY29tcHV0aW5nIGJvYXJkICg8dWxpbmsKLSAgICAgIHVybD0iaHR0cDovL3d3dy5sYXJ0LnR1ZGVsZnQubmwvIj5odHRwOi8vd3d3LmxhcnQudHVkZWxmdC5ubC88L3VsaW5rPiksCi0gICAgICB3aGljaCBpcyBzcG9uc29yZWQgYnkgdGhlIE1vYmlsZSBNdWx0aS1tZWRpYSBDb21tdW5pY2F0aW9ucwotICAgICAgKDx1bGluawotICAgICAgdXJsPSJodHRwOi8vd3d3Lm1tYy50dWRlbGZ0Lm5sLyI+aHR0cDovL3d3dy5tbWMudHVkZWxmdC5ubC88L3VsaW5rPikKLSAgICAgIGFuZCBVYmlxdWl0b3VzIENvbW11bmljYXRpb25zICg8dWxpbmsKLSAgICAgIHVybD0iaHR0cDovL3d3dy51Ymljb20udHVkZWxmdC5ubC8iPmh0dHA6Ly93d3cudWJpY29tLnR1ZGVsZnQubmwvPC91bGluaz4pCi0gICAgICBwcm9qZWN0cy4KLSAgICA8L3BhcmE+Ci0KLSAgICA8cGFyYT4KICAgICAgIEVyaWsKICAgICA8L3BhcmE+CiAgIDwvcHJlZmFjZT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnNfZXhhbXBsZS5jIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmc19leGFtcGxlLmMKaW5kZXggMmYzZGUwZi4uOGM2Mzk2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmc19leGFtcGxlLmMKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmc19leGFtcGxlLmMKQEAgLTEsMjggKzEsMTYgQEAKIC8qCiAgKiBwcm9jZnNfZXhhbXBsZS5jOiBhbiBleGFtcGxlIHByb2MgaW50ZXJmYWNlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLCBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIEVyaWsgTW91dyAobW91d0BubC5saW51eC5vcmcpCiAgKgogICogVGhpcyBmaWxlIGFjY29tcGFuaWVzIHRoZSBwcm9jZnMtZ3VpZGUgaW4gdGhlIExpbnV4IGtlcm5lbAogICogc291cmNlLiBJdHMgbWFpbiB1c2UgaXMgdG8gZGVtb25zdHJhdGUgdGhlIGNvbmNlcHRzIGFuZAogICogZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgZ3VpZGUuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBkZXZlbG9wZWQgd2hpbGUgd29ya2luZyBvbiB0aGUgTEFSVAotICogY29tcHV0aW5nIGJvYXJkIChodHRwOi8vd3d3LmxhcnQudHVkZWxmdC5ubC8pLCB3aGljaCBpcwotICogc3BvbnNvcmVkIGJ5IHRoZSBNb2JpbGUgTXVsdGktbWVkaWEgQ29tbXVuaWNhdGlvbnMKLSAqIChodHRwOi8vd3d3Lm1tYy50dWRlbGZ0Lm5sLykgYW5kIFViaXF1aXRvdXMgQ29tbXVuaWNhdGlvbnMgCi0gKiAoaHR0cDovL3d3dy51Ymljb20udHVkZWxmdC5ubC8pIHByb2plY3RzLgotICoKLSAqIFRoZSBhdXRob3IgY2FuIGJlIHJlYWNoZWQgYXQ6Ci0gKgotICogIEVyaWsgTW91dwotICogIEluZm9ybWF0aW9uIGFuZCBDb21tdW5pY2F0aW9uIFRoZW9yeSBHcm91cAotICogIEZhY3VsdHkgb2YgSW5mb3JtYXRpb24gVGVjaG5vbG9neSBhbmQgU3lzdGVtcwotICogIERlbGZ0IFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neQotICogIFAuTy4gQm94IDUwMzEKLSAqICAyNjAwIEdBIERlbGZ0Ci0gKiAgVGhlIE5ldGhlcmxhbmRzCi0gKgorICogY29tcHV0aW5nIGJvYXJkIChodHRwOi8vd3d3LmxhcnRtYWtlci5ubCksIHdoaWNoIHdhcyBzcG9uc29yZWQKKyAqIGJ5IHRoZSBEZWx0IFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSBwcm9qZWN0cyBNb2JpbGUgTXVsdGktbWVkaWEKKyAqIENvbW11bmljYXRpb25zIGFuZCBVYmlxdWl0b3VzIENvbW11bmljYXRpb25zLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQogICogaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzI1OTQuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3ZpZGVvYm9vay50bXBsCisrKyAvZGV2L251bGwKQEAgLTEsMTY1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCi0JImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbXT4KLQotPGJvb2sgaWQ9IlY0TEd1aWRlIj4KLSA8Ym9va2luZm8+Ci0gIDx0aXRsZT5WaWRlbzRMaW51eCBQcm9ncmFtbWluZzwvdGl0bGU+Ci0gIAotICA8YXV0aG9yZ3JvdXA+Ci0gICA8YXV0aG9yPgotICAgIDxmaXJzdG5hbWU+QWxhbjwvZmlyc3RuYW1lPgotICAgIDxzdXJuYW1lPkNveDwvc3VybmFtZT4KLSAgICA8YWZmaWxpYXRpb24+Ci0gICAgIDxhZGRyZXNzPgotICAgICAgPGVtYWlsPmFsYW5AcmVkaGF0LmNvbTwvZW1haWw+Ci0gICAgIDwvYWRkcmVzcz4KLSAgICA8L2FmZmlsaWF0aW9uPgotICAgPC9hdXRob3I+Ci0gIDwvYXV0aG9yZ3JvdXA+Ci0KLSAgPGNvcHlyaWdodD4KLSAgIDx5ZWFyPjIwMDA8L3llYXI+Ci0gICA8aG9sZGVyPkFsYW4gQ294PC9ob2xkZXI+Ci0gIDwvY29weXJpZ2h0PgotCi0gIDxsZWdhbG5vdGljZT4KLSAgIDxwYXJhPgotICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotICAgICB2ZXJzaW9uLgotICAgPC9wYXJhPgotICAgICAgCi0gICA8cGFyYT4KLSAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgPC9wYXJhPgotICAgICAgCi0gICA8cGFyYT4KLSAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICAgTUEgMDIxMTEtMTMwNyBVU0EKLSAgIDwvcGFyYT4KLSAgICAgIAotICAgPHBhcmE+Ci0gICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQotICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCi0gICA8L3BhcmE+Ci0gIDwvbGVnYWxub3RpY2U+Ci0gPC9ib29raW5mbz4KLQotPHRvYz48L3RvYz4KLQotICA8Y2hhcHRlciBpZD0iaW50cm8iPgotICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+Ci0gIDxwYXJhPgotICAgICAgICBQYXJ0cyBvZiB0aGlzIGRvY3VtZW50IGZpcnN0IGFwcGVhcmVkIGluIExpbnV4IE1hZ2F6aW5lIHVuZGVyIGEKLSAgICAgICAgbmluZXR5IGRheSBleGNsdXNpdml0eS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVmlkZW80TGludXggaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGNvbW1vbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UKLSAgICAgICAgZm9yIHRoZSBtYW55IFRWIGFuZCBjYXB0dXJlIGNhcmRzIG5vdyBvbiB0aGUgbWFya2V0LCBhcyB3ZWxsIGFzCi0gICAgICAgIHBhcmFsbGVsIHBvcnQgYW5kIFVTQiB2aWRlbyBjYW1lcmFzLiBSYWRpbywgdGVsZXRleHQgZGVjb2RlcnMgYW5kCi0gICAgICAgIHZlcnRpY2FsIGJsYW5raW5nIGRhdGEgaW50ZXJmYWNlcyBhcmUgYWxzbyBwcm92aWRlZC4KLSAgPC9wYXJhPgotICA8L2NoYXB0ZXI+Ci0gIDxjaGFwdGVyIGlkPSJyYWRpbyI+Ci0gICAgICAgIDx0aXRsZT5SYWRpbyBEZXZpY2VzPC90aXRsZT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZXJlIGFyZSBhIHdpZGUgdmFyaWV0eSBvZiByYWRpbyBpbnRlcmZhY2VzIGF2YWlsYWJsZSBmb3IgUEMncywgYW5kIHRoZXNlCi0gICAgICAgIGFyZSBnZW5lcmFsbHkgdmVyeSBzaW1wbGUgdG8gcHJvZ3JhbS4gVGhlIGJpZ2dlc3QgcHJvYmxlbSB3aXRoIHN1cHBvcnRpbmcKLSAgICAgICAgc3VjaCBkZXZpY2VzIGlzIG5vcm1hbGx5IGV4dHJhY3RpbmcgZG9jdW1lbnRhdGlvbiBmcm9tIHRoZSB2ZW5kb3IuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSByYWRpbyBpbnRlcmZhY2Ugc3VwcG9ydHMgYSBzaW1wbGUgc2V0IG9mIGNvbnRyb2wgaW9jdGxzIHN0YW5kYXJkaXNlZAotICAgICAgICBhY3Jvc3MgYWxsIHJhZGlvIGFuZCB0diBpbnRlcmZhY2VzLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHJlYWQgb3Igd3JpdGUsIHdoaWNoCi0gICAgICAgIGFyZSB1c2VkIGZvciB2aWRlbyBzdHJlYW1zLiBUaGUgcmVhc29uIHJhZGlvIGNhcmRzIGRvIG5vdCBhbGxvdyB5b3UgdG8gcmVhZAotICAgICAgICB0aGUgYXVkaW8gc3RyZWFtIGludG8gYW4gYXBwbGljYXRpb24gaXMgdGhhdCB3aXRob3V0IGV4Y2VwdGlvbiB0aGV5IHByb3ZpZGUKLSAgICAgICAgYSBjb25uZWN0aW9uIG9uIHRvIGEgc291bmRjYXJkLiBTb3VuZGNhcmRzIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIHJhZGlvCi0gICAgICAgIGRhdGEganVzdCBmaW5lLiAKLSAgPC9wYXJhPgotICA8c2VjdDEgaWQ9InJlZ2lzdGVycmFkaW8iPgotICA8dGl0bGU+UmVnaXN0ZXJpbmcgUmFkaW8gRGV2aWNlczwvdGl0bGU+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgVmlkZW80bGludXggY29yZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIHJlZ2lzdGVyaW5nIGRldmljZXMuIFRoZQotICAgICAgICBmaXJzdCBzdGVwIGluIHdyaXRpbmcgb3VyIHJhZGlvIGNhcmQgZHJpdmVyIGlzIHRvIHJlZ2lzdGVyIGl0LgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBteV9yYWRpbwotewotICAgICAgICAiTXkgcmFkaW8iLAotICAgICAgICBWSURfVFlQRV9UVU5FUiwKLSAgICAgICAgcmFkaW9fb3Blbi4KLSAgICAgICAgcmFkaW9fY2xvc2UsCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIC8qIG5vIHJlYWQgKi8KLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgIC8qIG5vIHdyaXRlICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIC8qIG5vIHBvbGwgKi8KLSAgICAgICAgcmFkaW9faW9jdGwsCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIC8qIG5vIHNwZWNpYWwgaW5pdCBmdW5jdGlvbiAqLwotICAgICAgICBOVUxMICAgICAgICAgICAgICAgIC8qIG5vIHByaXZhdGUgZGF0YSAqLwotfTsKLQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBUaGlzIGRlY2xhcmVzIG91ciB2aWRlbzRsaW51eCBkZXZpY2UgZHJpdmVyIGludGVyZmFjZS4gVGhlIFZJRF9UWVBFXyB2YWx1ZQotICAgICAgICBkZWZpbmVzIHdoYXQga2luZCBvZiBhbiBpbnRlcmZhY2Ugd2UgYXJlLCBhbmQgZGVmaW5lcyBiYXNpYyBjYXBhYmlsaXRpZXMuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSBvbmx5IGRlZmluZWQgdmFsdWUgcmVsZXZhbnQgZm9yIGEgcmFkaW8gY2FyZCBpcyBWSURfVFlQRV9UVU5FUiB3aGljaAotICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIGNhbiBiZSB0dW5lZC4gQ2xlYXJseSBvdXIgcmFkaW8gaXMgZ29pbmcgdG8gaGF2ZSBzb21lCi0gICAgICAgIHdheSB0byBjaGFuZ2UgY2hhbm5lbCBzbyBpdCBpcyB0dW5lYWJsZS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgV2UgZGVjbGFyZSBhbiBvcGVuIGFuZCBjbG9zZSByb3V0aW5lLCBidXQgd2UgZG8gbm90IG5lZWQgcmVhZCBvciB3cml0ZSwKLSAgICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgdmlkZW8gZGF0YSB0byBvciBmcm9tIHRoZSBjYXJkIGl0c2VsZi4gQXMKLSAgICAgICAgd2UgaGF2ZSBubyByZWFkIG9yIHdyaXRlIHRoZXJlIGlzIG5vIHBvbGwgZnVuY3Rpb24uCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSBwcml2YXRlIGluaXRpYWxpc2UgZnVuY3Rpb24gaXMgcnVuIHdoZW4gdGhlIGRldmljZSBpcyByZWdpc3RlcmVkLiBJbgotICAgICAgICB0aGlzIGRyaXZlciB3ZSd2ZSBhbHJlYWR5IGRvbmUgYWxsIHRoZSB3b3JrIG5lZWRlZC4gVGhlIGZpbmFsIHBvaW50ZXIgaXMgYQotICAgICAgICBwcml2YXRlIGRhdGEgcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBkZXZpY2UgZHJpdmVyIHRvIGF0dGFjaCBhbmQKLSAgICAgICAgcmV0cmlldmUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFdlIHNldCB0aGlzIGZpZWxkICJwcml2IiB0byBOVUxMIGZvcgotICAgICAgICB0aGUgbW9tZW50LgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBIYXZpbmcgdGhlIHN0cnVjdHVyZSBkZWZpbmVkIGlzIGFsbCB2ZXJ5IHdlbGwgYnV0IHdlIG5vdyBuZWVkIHRvIHJlZ2lzdGVyIGl0Ci0gICAgICAgIHdpdGggdGhlIGtlcm5lbC4gCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLXN0YXRpYyBpbnQgaW8gPSAweDMyMDsKLQotaW50IF9faW5pdCBteXJhZGlvX2luaXQoc3RydWN0IHZpZGVvX2luaXQgKnYpCi17Ci0gICAgICAgIGlmKCFyZXF1ZXN0X3JlZ2lvbihpbywgTVlfSU9fU0laRSwgIm15cmFkaW8iKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAKLSAgICAgICAgICAgICAgICAgICAgIm15cmFkaW86IHBvcnQgMHglMDNYIGlzIGluIHVzZS5cbiIsIGlvKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodmlkZW9fZGV2aWNlX3JlZ2lzdGVyKCZhbXA7bXlfcmFkaW8sIFZGTF9UWVBFX1JBRElPKT09LTEpIHsKLSAgICAgICAgICAgICAgICByZWxlYXNlX3JlZ2lvbihpbywgTVlfSU9fU0laRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0JCQotICAgICAgICByZXR1cm4gMDsKLX0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVGhlIGZpcnN0IHN0YWdlIG9mIHRoZSBpbml0aWFsaXNhdGlvbiwgYXMgaXMgbm9ybWFsbHkgdGhlIGNhc2UsIGlzIHRvIGNoZWNrIAotICAgICAgICB0aGF0IHRoZSBJL08gc3BhY2Ugd2UgYXJlIGFib3V0IHRvIGZpZGRsZSB3aXRoIGRvZXNuJ3QgYmVsb25nIHRvIHNvbWUgb3RoZXIgCi0gICAgICAgIGRyaXZlci4gSWYgaXQgaXMgd2UgbGVhdmUgd2VsbCBhbG9uZS4gSWYgdGhlIHVzZXIgZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIAotICAgICAgICB3cm9uZyBkZXZpY2UgdGhlbiB3ZSB3aWxsIHNwb3QgdGhpcy4gVGhlc2UgcG9saWNpZXMgd2lsbCBnZW5lcmFsbHkgYXZvaWQgCi0gICAgICAgIGNyYXNoaW5nIHRoZSBtYWNoaW5lLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBOb3cgd2UgYXNrIHRoZSBWaWRlbzRMaW51eCBsYXllciB0byByZWdpc3RlciB0aGUgZGV2aWNlIGZvciB1cy4gV2UgaGFuZCBpdAotICAgICAgICBvdXIgY2FyZWZ1bGx5IGRlc2lnbmVkIHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgYW5kIGFsc28gdGVsbCBpdCB3aGljaCBncm91cAotICAgICAgICBvZiBkZXZpY2VzIHdlIHdhbnQgaXQgcmVnaXN0ZXJlZCB3aXRoLiBJbiB0aGlzIGNhc2UgVkZMX1RZUEVfUkFESU8uCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSB0eXBlcyBhdmFpbGFibGUgYXJlCi0gIDwvcGFyYT4KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0iRGV2aWNlX1R5cGVzIj48dGl0bGU+RGV2aWNlIFR5cGVzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMyIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgPGVudHJ5PlZGTF9UWVBFX1JBRElPPC9lbnRyeT48ZW50cnk+L2Rldi9yYWRpb3tufTwvZW50cnk+PGVudHJ5PgotCi0gICAgICAgIFJhZGlvIGRldmljZXMgYXJlIGFzc2lnbmVkIGluIHRoaXMgYmxvY2suIEFzIHdpdGggYWxsIG9mIHRoZXNlCi0gICAgICAgIHNlbGVjdGlvbnMgdGhlIGFjdHVhbCBudW1iZXIgYXNzaWdubWVudCBpcyBkb25lIGJ5IHRoZSB2aWRlbyBsYXllcgotICAgICAgICBhY2NvcmRpam5nIHRvIHdoYXQgaXMgZnJlZS48L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5WRkxfVFlQRV9HUkFCQkVSPC9lbnRyeT48ZW50cnk+L2Rldi92aWRlb3tufTwvZW50cnk+PGVudHJ5PgotICAgICAgICBWaWRlbyBjYXB0dXJlIGRldmljZXMgYW5kIGFsc28gLS0gY291bnRlci1pbnR1aXRpdmVseSBmb3IgdGhlIG5hbWUgLS0KLSAgICAgICAgaGFyZHdhcmUgdmlkZW8gcGxheWJhY2sgZGV2aWNlcyBzdWNoIGFzIE1QRUcyIGNhcmRzLjwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZGTF9UWVBFX1ZCSTwvZW50cnk+PGVudHJ5Pi9kZXYvdmJpe259PC9lbnRyeT48ZW50cnk+Ci0gICAgICAgIFRoZSBWQkkgZGV2aWNlcyBjYXB0dXJlIHRoZSBoaWRkZW4gbGluZXMgb24gYSB0ZWxldmlzaW9uIHBpY3R1cmUKLSAgICAgICAgdGhhdCBjYXJyeSBmdXJ0aGVyIGluZm9ybWF0aW9uIGxpa2UgY2xvc2VkIGNhcHRpb24gZGF0YSwgdGVsZXRleHQKLSAgICAgICAgKHByaW1hcmlseSBpbiBFdXJvcGUpIGFuZCBub3cgSW50ZXJjYXN0IGFuZCB0aGUgQVRWRUMgaW50ZXJuZXQKLSAgICAgICAgdGVsZXZpc2lvbiBlbmNvZGluZ3MuPC9lbnRyeT4KLQk8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+VkZMX1RZUEVfVlRYPC9lbnRyeT48ZW50cnk+L2Rldi92dHhbbn08L2VudHJ5PjxlbnRyeT4KLSAgICAgICAgVlRYIGlzICdWaWRlb3RleHQnIGFsc28ga25vd24gYXMgJ1RlbGV0ZXh0Jy4gVGhpcyBpcyBhIHN5c3RlbSBmb3IKLSAgICAgICAgc2VuZGluZyBudW1iZXJlZCwgNDB4MjUsIG1vc3RseSB0ZXh0dWFsIHBhZ2UgaW1hZ2VzIG92ZXIgdGhlIGhpZGRlbgotICAgICAgICBsaW5lcy4gVW5saWtlIHRoZSAvZGV2L3ZiaSBpbnRlcmZhY2VzLCB0aGlzIGlzIGZvciAnc21hcnQnIGRlY29kZXIgCi0gICAgICAgIGNoaXBzLiAoVGhlIHVzZSBvZiB0aGUgd29yZCBzbWFydCBoZXJlIGhhcyB0byBiZSB0YWtlbiBpbiBjb250ZXh0LAotICAgICAgICB0aGUgc21hcnRlc3QgdGVsZXRleHQgY2hpcHMgYXJlIGZhaXJseSBkdW1iIHBpZWNlcyBvZiB0ZWNobm9sb2d5KS4KLQk8L2VudHJ5PgotICAgIDwvcm93PgotICAgIDwvdGJvZHk+Ci0gICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIGFyZSBtb3N0IGRlZmluaXRlbHkgYSByYWRpby4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgRmluYWxseSB3ZSBhbGxvY2F0ZSBvdXIgSS9PIHNwYWNlIHNvIHRoYXQgbm9ib2R5IHRyZWFkcyBvbiB1cyBhbmQgcmV0dXJuIDAKLSAgICAgICAgdG8gc2lnbmlmeSBnZW5lcmFsIGhhcHBpbmVzcyB3aXRoIHRoZSBzdGF0ZSBvZiB0aGUgdW5pdmVyc2UuCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPHNlY3QxIGlkPSJvcGVucmFkaW8iPgotICA8dGl0bGU+T3BlbmluZyBBbmQgQ2xvc2luZyBUaGUgUmFkaW88L3RpdGxlPgotCi0gIDxwYXJhPgotICAgICAgICBUaGUgZnVuY3Rpb25zIHdlIGRlY2xhcmVkIGluIG91ciB2aWRlb19kZXZpY2UgYXJlIG1vc3RseSB2ZXJ5IHNpbXBsZS4KLSAgICAgICAgRmlyc3RseSB3ZSBjYW4gZHJvcCBpbiB3aGF0IGlzIGJhc2ljYWxseSBzdGFuZGFyZCBjb2RlIGZvciBvcGVuIGFuZCBjbG9zZS4gCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLXN0YXRpYyBpbnQgdXNlcnMgPSAwOwotCi1zdGF0aWMgaW50IHJhZGlvX29wZW4oc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBpbnQgZmxhZ3MpCi17Ci0gICAgICAgIGlmKHVzZXJzKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIHVzZXJzKys7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBBdCBvcGVuIHRpbWUgd2UgbmVlZCB0byBkbyBub3RoaW5nIGJ1dCBjaGVjayBpZiBzb21lb25lIGVsc2UgaXMgYWxzbyB1c2luZwotICAgICAgICB0aGUgcmFkaW8gY2FyZC4gSWYgbm9ib2R5IGlzIHVzaW5nIGl0IHdlIG1ha2UgYSBub3RlIHRoYXQgd2UgYXJlIHVzaW5nIGl0LAotICAgICAgICB0aGVuIHdlIGVuc3VyZSB0aGF0IG5vYm9keSB1bmxvYWRzIG91ciBkcml2ZXIgb24gdXMuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLXN0YXRpYyBpbnQgcmFkaW9fY2xvc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KQotewotICAgICAgICB1c2Vycy0tOwotfQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBBdCBjbG9zZSB0aW1lIHdlIHNpbXBseSBuZWVkIHRvIHJlZHVjZSB0aGUgdXNlciBjb3VudCBhbmQgYWxsb3cgdGhlIG1vZHVsZQotICAgICAgICB0byBiZWNvbWUgdW5sb2FkYWJsZS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgSWYgeW91IGFyZSBzaGFycCB5b3Ugd2lsbCBoYXZlIG5vdGljZWQgbmVpdGhlciB0aGUgb3BlbiBub3IgdGhlIGNsb3NlCi0gICAgICAgIHJvdXRpbmVzIGF0dGVtcHQgdG8gcmVzZXQgb3IgY2hhbmdlIHRoZSByYWRpbyBzZXR0aW5ncy4gVGhpcyBpcyBpbnRlbnRpb25hbC4KLSAgICAgICAgSXQgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNldCB1cCB0aGUgcmFkaW8gYW5kIGV4aXQuIEl0IGF2b2lkcyBhIHVzZXIKLSAgICAgICAgaGF2aW5nIHRvIGxlYXZlIGFuIGFwcGxpY2F0aW9uIHJ1bm5pbmcgYWxsIHRoZSB0aW1lIGp1c3QgdG8gbGlzdGVuIHRvIHRoZQotICAgICAgICByYWRpby4gCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPHNlY3QxIGlkPSJpb2N0bHJhZGlvIj4KLSAgPHRpdGxlPlRoZSBJb2N0bCBJbnRlcmZhY2U8L3RpdGxlPgotICA8cGFyYT4KLSAgICAgICAgVGhpcyBsZWF2ZXMgdGhlIGlvY3RsIHJvdXRpbmUsIHdpdGhvdXQgd2hpY2ggdGhlIGRyaXZlciB3aWxsIG5vdCBiZQotICAgICAgICB0ZXJyaWJseSB1c2VmdWwgdG8gYW55b25lLgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi1zdGF0aWMgaW50IHJhZGlvX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotICAgICAgICBzd2l0Y2goY21kKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWSURJT0NHQ0FQOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnR5cGUgPSBWSURfVFlQRV9UVU5FUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuY2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5hdWRpb3MgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5tYXh3aWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Lm1pbndpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYubWF4aGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYubWluaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh2Lm5hbWUsICJNeSBSYWRpbyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyKGFyZywgJmFtcDt2LCBzaXplb2YodikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVklESU9DR0NBUCBpcyB0aGUgZmlyc3QgaW9jdGwgYWxsIHZpZGVvNGxpbnV4IGRldmljZXMgbXVzdCBzdXBwb3J0LiBJdAotICAgICAgICBhbGxvd3MgdGhlIGFwcGxpY2F0aW9ucyB0byBmaW5kIG91dCB3aGF0IHNvcnQgb2YgYSBjYXJkIHRoZXkgaGF2ZSBmb3VuZCBhbmQKLSAgICAgICAgdG8gZmlndXJlIG91dCB3aGF0IHRoZXkgd2FudCB0byBkbyBhYm91dCBpdC4gVGhlIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlIGFyZQotICA8L3BhcmE+Ci0gICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NhcGFiaWxpdHlfZmllbGRzIj48dGl0bGU+c3RydWN0IHZpZGVvX2NhcGFiaWxpdHkgZmllbGRzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgPGVudHJ5Pm5hbWU8L2VudHJ5PjxlbnRyeT5UaGUgZGV2aWNlIHRleHQgbmFtZS4gVGhpcyBpcyBpbnRlbmRlZCBmb3IgdGhlIHVzZXIuPC9lbnRyeT4KLQk8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+Y2hhbm5lbHM8L2VudHJ5PjxlbnRyeT5UaGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjaGFubmVscyB5b3UgY2FuIHR1bmUgb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgY2FyZC4gSXQgY291bGQgZXZlbiBieSB6ZXJvIGZvciBhIGNhcmQgdGhhdCBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vIHR1bmluZyBjYXBhYmlsaXR5LiBGb3Igb3VyIHNpbXBsZSBGTSByYWRpbyBpdCBpcyAxLiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFuIEFNL0ZNIHJhZGlvIHdvdWxkIHJlcG9ydCAyLjwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PmF1ZGlvczwvZW50cnk+PGVudHJ5PlRoZSBudW1iZXIgb2YgYXVkaW8gaW5wdXRzIG9uIHRoaXMgZGV2aWNlLiBGb3Igb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpbyB0aGVyZSBpcyBvbmx5IG9uZSBhdWRpbyBpbnB1dC48L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5taW53aWR0aCxtaW5oZWlnaHQ8L2VudHJ5PjxlbnRyeT5UaGUgc21hbGxlc3Qgc2l6ZSB0aGUgY2FyZCBpcyBjYXBhYmxlIG9mIGNhcHR1cmluZwotCQkgICAgICAgIGltYWdlcyBpbi4gV2Ugc2V0IHRoZXNlIHRvIHplcm8uIFJhZGlvcyBkbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgcGljdHVyZXM8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5tYXh3aWR0aCxtYXhoZWlnaHQ8L2VudHJ5PjxlbnRyeT5UaGUgbGFyZ2VzdCBpbWFnZSBzaXplIHRoZSBjYXJkIGlzIGNhcGFibGUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nLiBGb3Igb3VyIHJhZGlvIHdlIHJlcG9ydCAwLgotCQkJCTwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PnR5cGU8L2VudHJ5PjxlbnRyeT5UaGlzIHJlcG9ydHMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgZGV2aWNlLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgdGhlIGZpZWxkIHdlIGZpbGxlZCBpbiBpbiB0aGUgc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19kZXZpY2Ugd2hlbiByZWdpc3RlcmluZy48L2VudHJ5PgotICAgIDwvcm93PgotICAgIDwvdGJvZHk+Ci0gICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLSAgPHBhcmE+Ci0gICAgICAgIEhhdmluZyBmaWxsZWQgaW4gdGhlIGZpZWxkcywgd2UgdXNlIGNvcHlfdG9fdXNlciB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgaW50bwotICAgICAgICB0aGUgdXNlcnMgYnVmZmVyLiBJZiB0aGUgY29weSBmYWlscyB3ZSByZXR1cm4gYW4gRUZBVUxUIHRvIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICBzbyB0aGF0IGl0IGtub3dzIGl0IHRyaWVkIHRvIGZlZWQgdXMgZ2FyYmFnZS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlIG5leHQgcGFpciBvZiBpb2N0bCBvcGVyYXRpb25zIHNlbGVjdCB3aGljaCB0dW5lciBpcyB0byBiZSB1c2VkIGFuZCBsZXQKLSAgICAgICAgdGhlIGFwcGxpY2F0aW9uIGZpbmQgdGhlIHR1bmVyIHByb3BlcnRpZXMuIFdlIGhhdmUgb25seSBhIHNpbmdsZSBGTSBiYW5kCi0gICAgICAgIHR1bmVyIGluIG91ciBleGFtcGxlIGRldmljZS4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DR1RVTkVSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb190dW5lciB2OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkhPTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodi50dW5lcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnJhbmdlbG93PSg4NyoxNjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnJhbmdlaGlnaD0oMTA4KjE2MDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuZmxhZ3MgPSBWSURFT19UVU5FUl9MT1c7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Lm1vZGUgPSBWSURFT19NT0RFX0FVVE87Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnNpZ25hbCA9IDB4RkZGRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh2Lm5hbWUsICJGTSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyKCZhbXA7diwgYXJnLCBzaXplb2YodikpIT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVGhlIFZJRElPQ0dUVU5FUiBpb2N0bCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHF1ZXJ5IGEgdHVuZXIuIFRoZSBhcHBsaWNhdGlvbgotICAgICAgICBzZXRzIHRoZSB0dW5lciBmaWVsZCB0byB0aGUgdHVuZXIgbnVtYmVyIGl0IHdpc2hlcyB0byBxdWVyeS4gVGhlIHF1ZXJ5IGRvZXMKLSAgICAgICAgbm90IGNoYW5nZSB0aGUgdHVuZXIgdGhhdCBpcyBiZWluZyB1c2VkLCBpdCBtZXJlbHkgZW5xdWlyZXMgYWJvdXQgdGhlIHR1bmVyCi0gICAgICAgIGluIHF1ZXN0aW9uLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBXZSBoYXZlIGV4YWN0bHkgb25lIHR1bmVyIHNvIGFmdGVyIGNvcHlpbmcgdGhlIHVzZXIgYnVmZmVyIHRvIG91ciB0ZW1wb3JhcnkKLSAgICAgICAgc3RydWN0dXJlIHdlIGNvbXBsYWluIGlmIHRoZXkgYXNrZWQgZm9yIGEgdHVuZXIgb3RoZXIgdGhhbiB0dW5lciAwLiAKLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlIHZpZGVvX3R1bmVyIHN0cnVjdHVyZSBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHMKLSAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb190dW5lcl9maWVsZHMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fdHVuZXIgZmllbGRzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgPGVudHJ5PmludCB0dW5lcjwvZW50cnk+PGVudHJ5PlRoZSBudW1iZXIgb2YgdGhlIHR1bmVyIGluIHF1ZXN0aW9uPC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5jaGFyIG5hbWVbMzJdPC9lbnRyeT48ZW50cnk+QSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgdHVuZXIuICJGTSIgd2lsbCBkbyBmaW5lLgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdGhlIGFwcGxpY2F0aW9uLjwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+dTMyIGZsYWdzPC9lbnRyeT4KLSAgICAgICAgPGVudHJ5PlR1bmVyIGNhcGFiaWxpdHkgZmxhZ3M8L2VudHJ5PgotICAgPC9yb3c+Ci0gICA8cm93PgotICAgICAgICA8ZW50cnk+dTE2IG1vZGU8L2VudHJ5PjxlbnRyeT5UaGUgY3VycmVudCByZWNlcHRpb24gbW9kZTwvZW50cnk+Ci0KLSAgIDwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT51MTYgc2lnbmFsPC9lbnRyeT48ZW50cnk+VGhlIHNpZ25hbCBzdHJlbmd0aCBzY2FsZWQgYmV0d2VlbiAwIGFuZCA2NTUzNS4gSWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGEgZGV2aWNlIGNhbm5vdCB0ZWxsIHRoZSBzaWduYWwgc3RyZW5ndGggaXQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgNjU1MzUuIE1hbnkgc2ltcGxlIGNhcmRzIGNvbnRhaW4gb25seSBhIAotICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsL25vIHNpZ25hbCBiaXQuIFN1Y2ggY2FyZHMgd2lsbCByZXBvcnQgZWl0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAwIG9yIDY1NTM1LjwvZW50cnk+Ci0KLSAgIDwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT51MzIgcmFuZ2Vsb3csIHJhbmdlaGlnaDwvZW50cnk+PGVudHJ5PgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJhbmdlIG9mIGZyZXF1ZW5jaWVzIHN1cHBvcnRlZCBieSB0aGUgcmFkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIFRWLiBJdCBpcyBzY2FsZWQgYWNjb3JkaW5nIHRvIHRoZSBWSURFT19UVU5FUl9MT1cKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcuPC9lbnRyeT4KLQotICAgIDwvcm93PgotICAgIDwvdGJvZHk+Ci0gICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLQotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb190dW5lcl9mbGFncyI+PHRpdGxlPnN0cnVjdCB2aWRlb190dW5lciBmbGFnczwvdGl0bGU+Ci0gICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KLSAgIDx0Ym9keT4KLSAgIDxyb3c+Ci0JPGVudHJ5PlZJREVPX1RVTkVSX1BBTDwvZW50cnk+PGVudHJ5PkEgUEFMIFRWIHR1bmVyPC9lbnRyeT4KLQk8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+VklERU9fVFVORVJfTlRTQzwvZW50cnk+PGVudHJ5PkFuIE5UU0MgKFVTKSBUViB0dW5lcjwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX1RVTkVSX1NFQ0FNPC9lbnRyeT48ZW50cnk+QSBTRUNBTSAoRnJlbmNoKSBUViB0dW5lcjwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX1RVTkVSX0xPVzwvZW50cnk+PGVudHJ5PgotICAgICAgICAgICAgIFRoZSB0dW5lciBmcmVxdWVuY3kgaXMgc2NhbGVkIGluIDEvMTZ0aCBvZiBhIEtIegotICAgICAgICAgICAgIHN0ZXBzLiBJZiBub3QgaXQgaXMgaW4gMS8xNnRoIG9mIGEgTUh6IHN0ZXBzCi0JPC9lbnRyeT4KLQk8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+VklERU9fVFVORVJfTk9STTwvZW50cnk+PGVudHJ5PlRoZSB0dW5lciBjYW4gc2V0IGl0cyBmb3JtYXQ8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5WSURFT19UVU5FUl9TVEVSRU9fT048L2VudHJ5PjxlbnRyeT5UaGUgdHVuZXIgaXMgY3VycmVudGx5IHJlY2VpdmluZyBhIHN0ZXJlbyBzaWduYWw8L2VudHJ5PgotICAgICAgICA8L3Jvdz4KLSAgICA8L3Rib2R5PgotICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fdHVuZXJfbW9kZXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fdHVuZXIgbW9kZXM8L3RpdGxlPgotICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+Ci0gICA8dGJvZHk+Ci0gICA8cm93PgotICAgICAgICAgICAgICAgIDxlbnRyeT5WSURFT19NT0RFX1BBTDwvZW50cnk+PGVudHJ5PlBBTCBGb3JtYXQ8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fTU9ERV9OVFNDPC9lbnRyeT48ZW50cnk+TlRTQyBGb3JtYXQgKFVTQSk8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fTU9ERV9TRUNBTTwvZW50cnk+PGVudHJ5PkZyZW5jaCBGb3JtYXQ8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fTU9ERV9BVVRPPC9lbnRyeT48ZW50cnk+QSBkZXZpY2UgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFYgZm9ybWF0IHN3aXRjaGluZzwvZW50cnk+Ci0gICA8L3Jvdz4KLSAgICA8L3Rib2R5PgotICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgc2V0dGluZ3MgZm9yIHRoZSByYWRpbyBjYXJkIGFyZSB0aHVzIGZhaXJseSBzaW1wbGUuIFdlIHJlcG9ydCB0aGF0IHdlCi0gICAgICAgIGFyZSBhIHR1bmVyIGNhbGxlZCAiRk0iIGZvciBGTSByYWRpby4gSW4gb3JkZXIgdG8gZ2V0IHRoZSBiZXN0IHR1bmluZwotICAgICAgICByZXNvbHV0aW9uIHdlIHJlcG9ydCBWSURFT19UVU5FUl9MT1cgYW5kIHNlbGVjdCB0dW5pbmcgdG8gMS8xNnRoIG9mIEtIei4gSXRzCi0gICAgICAgIHVubGlrZWx5IG91ciBjYXJkIGNhbiBkbyB0aGF0IHJlc29sdXRpb24gYnV0IGl0IGlzIGEgZmFpciBiZXQgdGhlIGNhcmQgY2FuCi0gICAgICAgIGRvIGJldHRlciB0aGFuIDEvMTZ0aCBvZiBhIE1Iei4gVklERU9fVFVORVJfTE9XIGlzIGFwcHJvcHJpYXRlIHRvIGFsbW9zdCBhbGwKLSAgICAgICAgcmFkaW8gdXNhZ2UuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIHJlcG9ydCB0aGF0IHRoZSB0dW5lciBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgZGVjaWRpbmcgd2hhdCBmb3JtYXQgaXQgaXMKLSAgICAgICAgcmVjZWl2aW5nIC0gdHJ1ZSBlbm91Z2ggYXMgaXQgb25seSBoYW5kbGVzIEZNIHJhZGlvLiBPdXIgZXhhbXBsZSBjYXJkIGlzCi0gICAgICAgIGFsc28gaW5jYXBhYmxlIG9mIGRldGVjdGluZyBzdGVyZW8gb3Igc2lnbmFsIHN0cmVuZ3RocyBzbyBpdCByZXBvcnRzIGEKLSAgICAgICAgc3RyZW5ndGggb2YgMHhGRkZGIChtYXhpbXVtKSBhbmQgbm8gc3RlcmVvIGRldGVjdGVkLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUbyBmaW5pc2ggb2ZmIHdlIHNldCB0aGUgcmFuZ2UgdGhhdCBjYW4gYmUgdHVuZWQgdG8gYmUgODctMTA4TWh6LCB0aGUgbm9ybWFsCi0gICAgICAgIEZNIGJyb2FkY2FzdCByYWRpbyByYW5nZS4gSXQgaXMgaW1wb3J0YW50IHRvIGZpbmQgb3V0IHdoYXQgdGhlIGNhcmQgaXMKLSAgICAgICAgYWN0dWFsbHkgY2FwYWJsZSBvZiB0dW5pbmcuIEl0IGlzIGVhc3kgZW5vdWdoIHRvIHNpbXBseSB1c2UgdGhlIEZNIGJyb2FkY2FzdAotICAgICAgICByYW5nZS4gVW5mb3J0dW5hdGVseSBpZiB5b3UgZG8gdGhpcyB5b3Ugd2lsbCBkaXNjb3ZlciB0aGUgRk0gYnJvYWRjYXN0Ci0gICAgICAgIHJhbmdlcyBpbiB0aGUgVVNBLCBFdXJvcGUgYW5kIEphcGFuIGFyZSBhbGwgc3VidGx5IGRpZmZlcmVudCBhbmQgc29tZSB1c2VycwotICAgICAgICBjYW5ub3QgcmVjZWl2ZSBhbGwgdGhlIHN0YXRpb25zIHRoZXkgd2lzaC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGFsc28gbmVlZHMgdG8gYmUgYWJsZSB0byBzZXQgdGhlIHR1bmVyIGl0IHdpc2hlcyB0byB1c2UuIEluCi0gICAgICAgIG91ciBjYXNlLCB3aXRoIGEgc2luZ2xlIHR1bmVyIHRoaXMgaXMgcmF0aGVyIHNpbXBsZSB0byBhcnJhbmdlLgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DU1RVTkVSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb190dW5lciB2OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodi50dW5lciAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgV2UgY29weSB0aGUgdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgaW50byBrZXJuZWwgbWVtb3J5IHNvIHdlIGNhbiBleGFtaW5lIGl0LiAKLSAgICAgICAgSWYgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGEgdHVuZXIgb3RoZXIgdGhhbiB6ZXJvIHdlIHJlamVjdCB0aGUgcmVxdWVzdC4gSWYgCi0gICAgICAgIHRoZXkgd2FudGVkIHR1bmVyIDAgdGhlbiwgc3VycHJpc2luZ2x5IGVub3VnaCwgdGhhdCBpcyB0aGUgY3VycmVudCB0dW5lciBhbHJlYWR5LgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgbmV4dCB0d28gaW9jdGxzIHdlIG5lZWQgdG8gcHJvdmlkZSBhcmUgdG8gZ2V0IGFuZCBzZXQgdGhlIGZyZXF1ZW5jeSBvZgotICAgICAgICB0aGUgcmFkaW8uIFRoZXNlIGJvdGggdXNlIGFuIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQgd2hpY2ggaXMgdGhlIGZyZXF1ZW5jeS4KLSAgICAgICAgVGhlIHNjYWxlIG9mIHRoZSBmcmVxdWVuY3kgZGVwZW5kcyBvbiB0aGUgVklERU9fVFVORVJfTE9XIGZsYWcgYXMgSQotICAgICAgICBtZW50aW9uZWQgZWFybGllciBvbi4gU2luY2Ugd2UgaGF2ZSBWSURFT19UVU5FUl9MT1cgc2V0IHRoaXMgd2lsbCBiZSBpbgotICAgICAgICAxLzE2dGhzIG9mIGEgS0h6LgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF9mcmVxOwotCi0KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DR0ZSRVE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO2N1cnJlbnRfZnJlcSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgUXVlcnlpbmcgdGhlIGZyZXF1ZW5jeSBpbiBvdXIgY2FzZSBpcyByZWxhdGl2ZWx5IHNpbXBsZS4gT3VyIHJhZGlvIGNhcmQgaXMKLSAgICAgICAgdG9vIGR1bWIgdG8gbGV0IHVzIHF1ZXJ5IHRoZSBzaWduYWwgc3RyZW5ndGggc28gd2UgcmVtZW1iZXIgb3VyIHNldHRpbmcgaWYgCi0gICAgICAgIHdlIGtub3cgaXQuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGNvcHkgaXQgdG8gdGhlIHVzZXIuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFZJRElPQ1NGUkVROgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBmcmVxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoYXJnLCAmYW1wO2ZyZXEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykpIT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhcmR3YXJlX3NldF9mcmVxKGZyZXEpJmx0OzApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9mcmVxID0gZnJlcTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgU2V0dGluZyB0aGUgZnJlcXVlbmN5IGlzIGEgbGl0dGxlIG1vcmUgY29tcGxleC4gV2UgYmVnaW4gYnkgY29weWluZyB0aGUKLSAgICAgICAgZGVzaXJlZCBmcmVxdWVuY3kgaW50byBrZXJuZWwgc3BhY2UuIE5leHQgd2UgY2FsbCBhIGhhcmR3YXJlIHNwZWNpZmljIHJvdXRpbmUKLSAgICAgICAgdG8gc2V0IHRoZSByYWRpbyB1cC4gVGhpcyBtaWdodCBiZSBhcyBzaW1wbGUgYXMgc29tZSBzY2FsaW5nIGFuZCBhIGZldwotICAgICAgICB3cml0ZXMgdG8gYW4gSS9PIHBvcnQuIEZvciBtb3N0IHJhZGlvIGNhcmRzIGl0IHR1cm5zIG91dCBhIGdvb2QgZGVhbCBtb3JlCi0gICAgICAgIGNvbXBsaWNhdGVkIGFuZCBtYXkgaW52b2x2ZSBwcm9ncmFtbWluZyB0aGluZ3MgbGlrZSBhIHBoYXNlIGxvY2tlZCBsb29wIG9uCi0gICAgICAgIHRoZSBjYXJkLiBUaGlzIGlzIHdoYXQgZG9jdW1lbnRhdGlvbiBpcyBmb3IuIAotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgZmluYWwgc2V0IG9mIG9wZXJhdGlvbnMgd2UgbmVlZCB0byBwcm92aWRlIGZvciBvdXIgcmFkaW8gYXJlIHRoZSAKLSAgICAgICAgdm9sdW1lIGNvbnRyb2xzLiBOb3QgYWxsIHJhZGlvIGNhcmRzIGNhbiBldmVuIGRvIHZvbHVtZSBjb250cm9sLiBBZnRlciBhbGwKLSAgICAgICAgdGhlcmUgaXMgYSBwZXJmZWN0bHkgZ29vZCB2b2x1bWUgY29udHJvbCBvbiB0aGUgc291bmQgY2FyZC4gV2Ugd2lsbCBhc3N1bWUKLSAgICAgICAgb3VyIHJhZGlvIGNhcmQgaGFzIGEgc2ltcGxlIDQgc3RlcCB2b2x1bWUgY29udHJvbC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlcmUgYXJlIHR3byBpb2N0bHMgd2l0aCBhdWRpbyB3ZSBuZWVkIHRvIHN1cHBvcnQKLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLXN0YXRpYyBpbnQgY3VycmVudF92b2x1bWU9MDsKLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DR0FVRElPOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19hdWRpbyB2OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodi5hdWRpbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYudm9sdW1lID0gMTYzODQqY3VycmVudF92b2x1bWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnN0ZXAgPSAxNjM4NDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh2Lm5hbWUsICJSYWRpbyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5tb2RlID0gVklERU9fU09VTkRfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuYmFsYW5jZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LmJhc2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdi50cmVibGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoYXJnLiAmYW1wO3YsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBNdWNoIGxpa2UgdGhlIHR1bmVyIHdlIHN0YXJ0IGJ5IGNvcHlpbmcgdGhlIHVzZXIgc3RydWN0dXJlIGludG8ga2VybmVsCi0gICAgICAgIHNwYWNlLiBBZ2FpbiB3ZSBjaGVjayBpZiB0aGUgdXNlciBoYXMgYXNrZWQgZm9yIGEgdmFsaWQgYXVkaW8gaW5wdXQuIFdlIGhhdmUKLSAgICAgICAgb25seSBpbnB1dCAwIGFuZCB3ZSBwdW50IGlmIHRoZXkgYXNrIGZvciBhbm90aGVyIGlucHV0LgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGVuIHdlIGZpbGwgaW4gdGhlIHZpZGVvX2F1ZGlvIHN0cnVjdHVyZS4gVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQKLSAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19hdWRpb19maWVsZHMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fYXVkaW8gZmllbGRzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgIDxlbnRyeT5hdWRpbzwvZW50cnk+PGVudHJ5PlRoZSBpbnB1dCB0aGUgdXNlciB3aXNoZXMgdG8gcXVlcnk8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT52b2x1bWU8L2VudHJ5PjxlbnRyeT5UaGUgdm9sdW1lIHNldHRpbmcgb24gYSBzY2FsZSBvZiAwLTY1NTM1PC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICA8ZW50cnk+YmFzZTwvZW50cnk+PGVudHJ5PlRoZSBiYXNlIGxldmVsIG9uIGEgc2NhbGUgb2YgMC02NTUzNTwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgPGVudHJ5PnRyZWJsZTwvZW50cnk+PGVudHJ5PlRoZSB0cmVibGUgbGV2ZWwgb24gYSBzY2FsZSBvZiAwLTY1NTM1PC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICA8ZW50cnk+ZmxhZ3M8L2VudHJ5PjxlbnRyeT5UaGUgZmVhdHVyZXMgdGhpcyBhdWRpbyBkZXZpY2Ugc3VwcG9ydHMKLSAgIDwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgPGVudHJ5Pm5hbWU8L2VudHJ5PjxlbnRyeT5BIHRleHQgbmFtZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLiBXZSBwaWNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICJSYWRpbyIgYXMgaXQgZXhwbGFpbnMgdGhpbmdzIHF1aXRlIG5pY2VseS48L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT5tb2RlPC9lbnRyeT48ZW50cnk+VGhlIGN1cnJlbnQgcmVjZXB0aW9uIG1vZGUgZm9yIHRoZSBhdWRpbwotCi0gICAgICAgICAgICAgICAgV2UgcmVwb3J0IE1PTk8gYmVjYXVzZSBvdXIgY2FyZCBpcyB0b28gc3R1cGlkIHRvIGtub3cgaWYgaXQgaXMgaW4KLSAgICAgICAgICAgICAgICBtb25vIG9yIHN0ZXJlby4gCi0gICA8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT5iYWxhbmNlPC9lbnRyeT48ZW50cnk+VGhlIHN0ZXJlbyBiYWxhbmNlIG9uIGEgc2NhbGUgb2YgMC02NTUzNSwgMzI3NjggaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZS48L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT5zdGVwPC9lbnRyeT48ZW50cnk+VGhlIHN0ZXAgYnkgd2hpY2ggdGhlIHZvbHVtZSBjb250cm9sIGp1bXBzLiBUaGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGhlbHAgbWFrZSBpdCBlYXN5IGZvciBhcHBsaWNhdGlvbnMgdG8gc2V0IAotICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVyIGJlaGF2aW91ci48L2VudHJ5PgotICAgPC9yb3c+Ci0gICA8L3Rib2R5PgotICAgPC90Z3JvdXA+Ci0gICA8L3RhYmxlPgotCi0gICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2F1ZGlvX2ZsYWdzIj48dGl0bGU+c3RydWN0IHZpZGVvX2F1ZGlvIGZsYWdzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fQVVESU9fTVVURTwvZW50cnk+PGVudHJ5PlRoZSBhdWRpbyBpcyBjdXJyZW50bHkgbXV0ZWQuIFdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgZmFrZSB0aGlzIGluIG91ciBkcml2ZXIgYnV0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlIG5vdCB0byBib3RoZXIuPC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICAgICAgICAgICAgICAgPGVudHJ5PlZJREVPX0FVRElPX01VVEFCTEU8L2VudHJ5PjxlbnRyeT5UaGUgaW5wdXQgaGFzIGEgbXV0ZSBvcHRpb248L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fQVVESU9fVFJFQkxFPC9lbnRyeT48ZW50cnk+VGhlICBpbnB1dCBoYXMgYSB0cmVibGUgY29udHJvbDwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgICAgICAgICAgICAgIDxlbnRyeT5WSURFT19BVURJT19CQVNTPC9lbnRyeT48ZW50cnk+VGhlIGlucHV0IGhhcyBhIGJhc2UgY29udHJvbDwvZW50cnk+Ci0gICA8L3Jvdz4KLSAgIDwvdGJvZHk+Ci0gICA8L3Rncm91cD4KLSAgIDwvdGFibGU+Ci0KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fYXVkaW9fbW9kZXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fYXVkaW8gbW9kZXM8L3RpdGxlPgotICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+Ci0gICA8dGJvZHk+Ci0gICA8cm93PgotICAgICAgICAgICAgICAgIDxlbnRyeT5WSURFT19TT1VORF9NT05PPC9lbnRyeT48ZW50cnk+TW9ubyBzb3VuZDwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgICAgICAgICAgICAgIDxlbnRyeT5WSURFT19TT1VORF9TVEVSRU88L2VudHJ5PjxlbnRyeT5TdGVyZW8gc291bmQ8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fU09VTkRfTEFORzE8L2VudHJ5PjxlbnRyeT5BbHRlcm5hdGl2ZSBsYW5ndWFnZSAxIChUViBzcGVjaWZpYyk8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgICAgICAgICA8ZW50cnk+VklERU9fU09VTkRfTEFORzI8L2VudHJ5PjxlbnRyeT5BbHRlcm5hdGl2ZSBsYW5ndWFnZSAyIChUViBzcGVjaWZpYyk8L2VudHJ5PgotICAgPC9yb3c+Ci0gICA8L3Rib2R5PgotICAgPC90Z3JvdXA+Ci0gICA8L3RhYmxlPgotICA8cGFyYT4KLSAgICAgICAgSGF2aW5nIGZpbGxlZCBpbiB0aGUgc3RydWN0dXJlIHdlIGNvcHkgaXQgYmFjayB0byB1c2VyIHNwYWNlLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgVklESU9DU0FVRElPIGlvY3RsIGFsbG93cyB0aGUgdXNlciB0byBzZXQgdGhlIGF1ZGlvIHBhcmFtZXRlcnMgaW4gdGhlCi0gICAgICAgIHZpZGVvX2F1ZGlvIHN0cnVjdHVyZS4gVGhlIGRyaXZlciBkb2VzIGl0cyBiZXN0IHRvIGhvbm91ciB0aGUgcmVxdWVzdC4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFZJRElPQ1NBVURJTzoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fYXVkaW8gdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZhbXA7diwgYXJnLCBzaXplb2YodikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYuYXVkaW8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF92b2x1bWUgPSB2LzE2Mzg0OwotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2V0X3ZvbHVtZShjdXJyZW50X3ZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIEluIG91ciBjYXNlIHRoZXJlIGlzIHZlcnkgbGl0dGxlIHRoYXQgdGhlIHVzZXIgY2FuIHNldC4gVGhlIHZvbHVtZSBpcwotICAgICAgICBiYXNpY2FsbHkgdGhlIGxpbWl0LiBOb3RlIHRoYXQgd2UgY291bGQgcHJldGVuZCB0byBoYXZlIGEgbXV0ZSBmZWF0dXJlCi0gICAgICAgIGJ5IHJld3JpdGluZyB0aGlzIHRvIAotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DU0FVRElPOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19hdWRpbyB2OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodi5hdWRpbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZvbHVtZSA9IHYvMTYzODQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2LmZsYWdzJmFtcDtWSURFT19BVURJT19NVVRFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV9zZXRfdm9sdW1lKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV9zZXRfdm9sdW1lKGN1cnJlbnRfdm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbXV0ZWQgPSB2LmZsYWdzICZhbXA7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPX0FVRElPX01VVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIFRoaXMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvIHRoZSBWSURJT0NHQVVESU8gY29kZSB0byByZXBvcnQgdGhlCi0gICAgICAgIHN0YXRlIG9mIHRoZSBtdXRlIGZsYWcgd2Ugc2F2ZSBhbmQgdG8gcmVwb3J0IHRoZSBjYXJkIGhhcyBhIG11dGUgZnVuY3Rpb24sCi0gICAgICAgIHdpbGwgYWxsb3cgYXBwbGljYXRpb25zIHRvIHVzZSBhIG11dGUgZmFjaWxpdHkgd2l0aCB0aGlzIGNhcmQuIEl0IGlzCi0gICAgICAgIHF1ZXN0aW9uYWJsZSB3aGV0aGVyIHRoaXMgaXMgYSBnb29kIGlkZWEgaG93ZXZlci4gVXNlciBhcHBsaWNhdGlvbnMgY2FuIGFscmVhZHkKLSAgICAgICAgZmFrZSB0aGlzIHRoZW1zZWx2ZXMgYW5kIGtlcm5lbCBzcGFjZSBpcyBwcmVjaW91cy4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgV2Ugbm93IGhhdmUgYSB3b3JraW5nIHJhZGlvIGlvY3RsIGhhbmRsZXIuIFNvIHdlIGp1c3Qgd3JhcCB1cCB0aGUgZnVuY3Rpb24KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtRU5PSU9DVExDTUQ7Ci19Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIGFuZCBwYXNzIHRoZSBWaWRlbzRMaW51eCBsYXllciBiYWNrIGFuIGVycm9yIHNvIHRoYXQgaXQga25vd3Mgd2UgZGlkIG5vdAotICAgICAgICB1bmRlcnN0YW5kIHRoZSByZXF1ZXN0IHdlIGdvdCBwYXNzZWQuCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPHNlY3QxIGlkPSJtb2RyYWRpbyI+Ci0gIDx0aXRsZT5Nb2R1bGUgV3JhcHBlcjwvdGl0bGU+Ci0gIDxwYXJhPgotICAgICAgICBGaW5hbGx5IHdlIGFkZCBpbiB0aGUgdXN1YWwgbW9kdWxlIHdyYXBwaW5nIGFuZCB0aGUgZHJpdmVyIGlzIGRvbmUuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0jaWZuZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IGlvID0gMHgzMDA7Ci0KLSNlbHNlCi0KLXN0YXRpYyBpbnQgaW8gPSAtMTsKLQotI2VuZGlmCi0KLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciBhbiBpbWFnaW5hcnkgcmFkaW8gY2FyZC4iKTsKLW1vZHVsZV9wYXJhbShpbywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgY2FyZC4iKTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotICAgICAgICBpZihpbz09LTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgCi0gICAgICAgICAiWW91IG11c3Qgc2V0IGFuIEkvTyBhZGRyZXNzIHdpdGggaW89MHg/Pz9cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBteXJhZGlvX2luaXQoTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwKHZvaWQpCi17Ci0gICAgICAgIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZhbXA7bXlfcmFkaW8pOwotICAgICAgICByZWxlYXNlX3JlZ2lvbihpbywgTVlfSU9fU0laRSk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoY2xlYW51cCk7Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIEluIHRoaXMgZXhhbXBsZSB3ZSBzZXQgdGhlIElPIGJhc2UgYnkgZGVmYXVsdCBpZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGludG8KLSAgICAgICAgdGhlIGtlcm5lbDogeW91IGNhbiBzdGlsbCBzZXQgaXQgdXNpbmcgIm15X3JhZGlvLmlycSIgaWYgdGhpcyBmaWxlIGlzIGNhbGxlZCA8ZmlsZW5hbWU+bXlfcmFkaW8uYzwvZmlsZW5hbWU+LiBGb3IgdGhlIG1vZHVsZSB3ZSByZXF1aXJlIHRoZQotICAgICAgICB1c2VyIHNldHMgdGhlIHBhcmFtZXRlci4gV2Ugc2V0IGlvIHRvIGEgbm9uc2Vuc2UgcG9ydCAoLTEpIHNvIHRoYXQgd2UgY2FuCi0gICAgICAgIHRlbGwgaWYgdGhlIHVzZXIgc3VwcGxpZWQgYW4gaW8gcGFyYW1ldGVyIG9yIG5vdC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgV2UgdXNlIE1PRFVMRV8gZGVmaW5lcyB0byBnaXZlIGFuIGF1dGhvciBmb3IgdGhlIGNhcmQgZHJpdmVyIGFuZCBhCi0gICAgICAgIGRlc2NyaXB0aW9uLiBXZSBhbHNvIHVzZSB0aGVtIHRvIGRlY2xhcmUgdGhhdCBpbyBpcyBhbiBpbnRlZ2VyIGFuZCBpdCBpcyB0aGUKLSAgICAgICAgYWRkcmVzcyBvZiB0aGUgY2FyZCwgYW5kIGNhbiBiZSByZWFkIGJ5IGFueW9uZSBmcm9tIHN5c2ZzLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgY2xlYW4tdXAgcm91dGluZSB1bnJlZ2lzdGVycyB0aGUgdmlkZW9fZGV2aWNlIHdlIHJlZ2lzdGVyZWQsIGFuZCBmcmVlcwotICAgICAgICB1cCB0aGUgSS9PIHNwYWNlLiBOb3RlIHRoYXQgdGhlIHVucmVnaXN0ZXIgdGFrZXMgdGhlIGFjdHVhbCB2aWRlb19kZXZpY2UKLSAgICAgICAgc3RydWN0dXJlIGFzIGl0cyBhcmd1bWVudC4gVW5saWtlIHRoZSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0dXJlIHdoaWNoIGNhbiBiZQotICAgICAgICBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcyBvZiBhIGRldmljZSBhIHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgYXMgYW4gYWN0dWFsCi0gICAgICAgIGluc3RhbmNlIG9mIHRoZSBkZXZpY2UuIElmIHlvdSBhcmUgcmVnaXN0ZXJpbmcgbXVsdGlwbGUgcmFkaW8gZGV2aWNlcyB5b3UKLSAgICAgICAgbmVlZCB0byBmaWxsIGluIG9uZSBzdHJ1Y3R1cmUgcGVyIGRldmljZSAobW9zdCBsaWtlbHkgYnkgc2V0dGluZyB1cCBhCi0gICAgICAgIHRlbXBsYXRlIGFuZCBjb3B5aW5nIGl0IHRvIGVhY2ggb2YgdGhlIGFjdHVhbCBkZXZpY2Ugc3RydWN0dXJlcykuCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotICA8Y2hhcHRlciBpZD0iVmlkZW9fQ2FwdHVyZV9EZXZpY2VzIj4KLSAgICAgICAgPHRpdGxlPlZpZGVvIENhcHR1cmUgRGV2aWNlczwvdGl0bGU+Ci0gIDxzZWN0MSBpZD0iaW50cm92aWQiPgotICA8dGl0bGU+VmlkZW8gQ2FwdHVyZSBEZXZpY2UgVHlwZXM8L3RpdGxlPgotICA8cGFyYT4KLSAgICAgICAgVGhlIHZpZGVvIGNhcHR1cmUgZGV2aWNlcyBzaGFyZSB0aGUgc2FtZSBpbnRlcmZhY2VzIGFzIHJhZGlvIGRldmljZXMuIEluCi0gICAgICAgIG9yZGVyIHRvIGV4cGxhaW4gdGhlIHZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIEkgd2lsbCB1c2UgdGhlIGV4YW1wbGUgb2YgYQotICAgICAgICBjYW1lcmEgdGhhdCBoYXMgbm8gdHVuZXJzIG9yIGF1ZGlvIGlucHV0LiBUaGlzIGtlZXBzIHRoZSBleGFtcGxlIHJlbGF0aXZlbHkKLSAgICAgICAgY2xlYW4uIFRvIGdldCBib3RoIGNvbWJpbmUgdGhlIHR3byBkcml2ZXIgZXhhbXBsZXMuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFZpZGVvIGNhcHR1cmUgZGV2aWNlcyBkaXZpZGUgaW50byBmb3VyIGNhdGVnb3JpZXMuIEEgbGl0dGxlIHRlY2hub2xvZ3kKLSAgICAgICAgYmFja2dyb3VuZGVyLiBGdWxsIG1vdGlvbiB2aWRlbyBldmVuIGF0IHRlbGV2aXNpb24gcmVzb2x1dGlvbiAod2hpY2ggaXMKLSAgICAgICAgYWN0dWFsbHkgZmFpcmx5IGxvdykgaXMgcHJldHR5IHJlc291cmNlLWludGVuc2l2ZS4gWW91IGFyZSBjb250aW51YWxseQotICAgICAgICBwYXNzaW5nIG1lZ2FieXRlcyBvZiBkYXRhIGV2ZXJ5IHNlY29uZCBmcm9tIHRoZSBjYXB0dXJlIGNhcmQgdG8gdGhlIGRpc3BsYXkuIAotICAgICAgICBzZXZlcmFsIGFsdGVybmF0aXZlIGFwcHJvYWNoZXMgaGF2ZSBlbWVyZ2VkIGJlY2F1c2UgY29weWluZyB0aGlzIHRocm91Z2ggdGhlIAotICAgICAgICBwcm9jZXNzb3IgYW5kIHRoZSB1c2VyIHByb2dyYW0gaXMgYSBwYXJ0aWN1bGFybHkgYmFkIGlkZWEgLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgZmlyc3QgaXMgdG8gYWRkIHRoZSB0ZWxldmlzaW9uIGltYWdlIG9udG8gdGhlIHZpZGVvIG91dHB1dCBkaXJlY3RseS4KLSAgICAgICAgVGhpcyBpcyBhbHNvIGhvdyBzb21lIDNEIGNhcmRzIHdvcmsuIFRoZXNlIGJhc2ljIGNhcmRzIGNhbiBnZW5lcmFsbHkgZHJvcCB0aGUKLSAgICAgICAgdmlkZW8gaW50byBhbnkgY2hvc2VuIHJlY3RhbmdsZSBvZiB0aGUgZGlzcGxheS4gQ2FyZHMgbGlrZSB0aGlzLCB3aGljaAotICAgICAgICBpbmNsdWRlIG1vc3QgbXBlZzEgY2FyZHMgdGhhdCB1c2VkIHRoZSBmZWF0dXJlIGNvbm5lY3RvciwgIGFyZW4ndCB2ZXJ5Ci0gICAgICAgIGZyaWVuZGx5IGluIGEgd2luZG93aW5nIGVudmlyb25tZW50LiBUaGV5IGRvbid0IHVuZGVyc3RhbmQgd2luZG93cyBvcgotICAgICAgICBjbGlwcGluZy4gVGhlIHZpZGVvIHdpbmRvdyBpcyBhbHdheXMgb24gdGhlIHRvcCBvZiB0aGUgZGlzcGxheS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgQ2hyb21hIGtleWluZyBpcyBhIHRlY2huaXF1ZSB1c2VkIGJ5IGNhcmRzIHRvIGdldCBhcm91bmQgdGhpcy4gSXQgaXMgYW4gb2xkCi0gICAgICAgIHRlbGV2aXNpb24gbWl4aW5nIHRyaWNrIHdoZXJlIHlvdSBtYXJrIGFsbCB0aGUgYXJlYXMgeW91IHdpc2ggdG8gcmVwbGFjZQotICAgICAgICB3aXRoIGEgc2luZ2xlIGNsZWFyIGNvbG91ciB0aGF0IGlzbid0IHVzZWQgaW4gdGhlIGltYWdlIC0gVFYgcGVvcGxlIHVzZSBhbgotICAgICAgICBpbmNyZWRpYmx5IGJyaWdodCBibHVlIHdoaWxlIGNvbXB1dGluZyBwZW9wbGUgb2Z0ZW4gdXNlIGEgcGFydGljdWxhcmx5Ci0gICAgICAgIHZpcnVsZW50IHB1cnBsZS4gQnJpZ2h0IGJsdWUgb2NjdXJzIG9uIHRoZSBkZXNrdG9wLiBBbnlvbmUgd2l0aCB2aXJ1bGVudAotICAgICAgICBwdXJwbGUgd2luZG93cyBoYXMgYW5vdGhlciBwcm9ibGVtIGJlc2lkZXMgdGhlaXIgVFYgb3ZlcmxheS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlIHRoaXJkIGFwcHJvYWNoIGlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgY2FwdHVyZSBjYXJkIHRvIHRoZSB2aWRlbwotICAgICAgICBjYXJkLCBidXQgdG8gZG8gaXQgZGlyZWN0bHkgYWNyb3NzIHRoZSBQQ0kgYnVzLiBUaGlzIHJlbGlldmVzIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgZnJvbSBkb2luZyB0aGUgd29yayBidXQgZG9lcyByZXF1aXJlIHNvbWUgc21hcnRuZXNzIG9uIHRoZSBwYXJ0IG9mIHRoZSB2aWRlbwotICAgICAgICBjYXB0dXJlIGNoaXAsIGFzIHdlbGwgYXMgYSBzdWl0YWJsZSB2aWRlbyBjYXJkLiBQcm9ncmFtbWluZyB0aGlzIGtpbmQgb2YKLSAgICAgICAgY2FyZCBhbmQgbW9yZSBzbyBkZWJ1Z2dpbmcgaXQgY2FuIGJlIGV4dHJlbWVseSB0cmlja3kuIFRoZXJlIGFyZSBzb21lIHF1aXRlCi0gICAgICAgIGNvbXBsaWNhdGVkIGludGVyYWN0aW9ucyB3aXRoIHRoZSBkaXNwbGF5IGFuZCB5b3UgbWF5IGFsc28gaGF2ZSB0byBjb3BlIHdpdGgKLSAgICAgICAgdmFyaW91cyBjaGlwc2V0IGJ1Z3MgdGhhdCBzaG93IHVwIHdoZW4gUENJIGNhcmRzIHN0YXJ0IHRhbGtpbmcgdG8gZWFjaAotICAgICAgICBvdGhlci4gCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRvIGtlZXAgb3VyIGV4YW1wbGUgZmFpcmx5IHNpbXBsZSB3ZSB3aWxsIGFzc3VtZSBhIGNhcmQgdGhhdCBzdXBwb3J0cwotICAgICAgICBvdmVybGF5aW5nIGEgZmxhdCByZWN0YW5ndWxhciBpbWFnZSBvbnRvIHRoZSBmcmFtZSBidWZmZXIgb3V0cHV0LCBhbmQgd2hpY2gKLSAgICAgICAgY2FuIGFsc28gY2FwdHVyZSBzdHVmZiBpbnRvIHByb2Nlc3NvciBtZW1vcnkuCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPHNlY3QxIGlkPSJyZWd2aWQiPgotICA8dGl0bGU+UmVnaXN0ZXJpbmcgVmlkZW8gQ2FwdHVyZSBEZXZpY2VzPC90aXRsZT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoaXMgdGltZSB3ZSBuZWVkIHRvIGFkZCBtb3JlIGZ1bmN0aW9ucyBmb3Igb3VyIGNhbWVyYSBkZXZpY2UuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgbXlfY2FtZXJhCi17Ci0gICAgICAgICJNeSBDYW1lcmEiLAotICAgICAgICBWSURfVFlQRV9PVkVSTEFZfFZJRF9UWVBFX1NDQUxFU3xcCi0gICAgICAgIFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfQ0hST01BS0VZLAotICAgICAgICBjYW1lcmFfb3Blbi4KLSAgICAgICAgY2FtZXJhX2Nsb3NlLAotICAgICAgICBjYW1lcmFfcmVhZCwgICAgICAvKiBubyByZWFkICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgIC8qIG5vIHdyaXRlICovCi0gICAgICAgIGNhbWVyYV9wb2xsLCAgICAgIC8qIG5vIHBvbGwgKi8KLSAgICAgICAgY2FtZXJhX2lvY3RsLAotICAgICAgICBOVUxMLCAgICAgICAgICAgICAvKiBubyBzcGVjaWFsIGluaXQgZnVuY3Rpb24gKi8KLSAgICAgICAgTlVMTCAgICAgICAgICAgICAgLyogbm8gcHJpdmF0ZSBkYXRhICovCi19OwotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgV2UgbmVlZCBhIHJlYWQoKSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIGZvciBjYXB0dXJpbmcgZGF0YSBmcm9tCi0gICAgICAgIHRoZSBjYXJkLCBhbmQgd2UgbmVlZCBhIHBvbGwgZnVuY3Rpb24gc28gdGhhdCBhIGRyaXZlciBjYW4gd2FpdCBmb3IgdGhlIG5leHQKLSAgICAgICAgZnJhbWUgdG8gYmUgY2FwdHVyZWQuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIHVzZSB0aGUgZXh0cmEgdmlkZW8gY2FwYWJpbGl0eSBmbGFncyB0aGF0IGRpZCBub3QgYXBwbHkgdG8gdGhlCi0gICAgICAgIHJhZGlvIGludGVyZmFjZS4gVGhlIHZpZGVvIHJlbGF0ZWQgZmxhZ3MgYXJlCi0gIDwvcGFyYT4KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0iQ2FwdHVyZV9DYXBhYmlsaXRpZXMiPjx0aXRsZT5DYXB0dXJlIENhcGFiaWxpdGllczwvdGl0bGU+Ci0gICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KLSAgIDx0Ym9keT4KLSAgIDxyb3c+Ci08ZW50cnk+VklEX1RZUEVfQ0FQVFVSRTwvZW50cnk+PGVudHJ5PldlIHN1cHBvcnQgaW1hZ2UgY2FwdHVyZTwvZW50cnk+Ci08L3Jvdz48cm93PgotPGVudHJ5PlZJRF9UWVBFX1RFTEVURVhUPC9lbnRyeT48ZW50cnk+QSB0ZWxldGV4dCBjYXB0dXJlIGRldmljZSAodmJpe25dKTwvZW50cnk+Ci08L3Jvdz48cm93PgotPGVudHJ5PlZJRF9UWVBFX09WRVJMQVk8L2VudHJ5PjxlbnRyeT5UaGUgaW1hZ2UgY2FuIGJlIGRpcmVjdGx5IG92ZXJsYWlkIG9udG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGJ1ZmZlcjwvZW50cnk+Ci08L3Jvdz48cm93PgotPGVudHJ5PlZJRF9UWVBFX0NIUk9NQUtFWTwvZW50cnk+PGVudHJ5PkNocm9tYWtleSBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hpY2ggcGFydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGltYWdlIHRvIGRpc3BsYXk8L2VudHJ5PgotPC9yb3c+PHJvdz4KLTxlbnRyeT5WSURfVFlQRV9DTElQUElORzwvZW50cnk+PGVudHJ5Pkl0IGlzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIGJvYXJkIGEgbGlzdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0YW5nbGVzIHRvIGRyYXcgYXJvdW5kLiA8L2VudHJ5PgotPC9yb3c+PHJvdz4KLTxlbnRyeT5WSURfVFlQRV9GUkFNRVJBTTwvZW50cnk+PGVudHJ5PlRoZSB2aWRlbyBjYXB0dXJlIGdvZXMgaW50byB0aGUgdmlkZW8gbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY3R1YWxseSBjaGFuZ2VzIGl0LiBBcHBsaWNhdGlvbnMgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBrbm93IHRoaXMgc28gdGhleSBjYW4gY2xlYW4gdXAgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQ8L2VudHJ5PgotPC9yb3c+PHJvdz4KLTxlbnRyeT5WSURfVFlQRV9TQ0FMRVM8L2VudHJ5PjxlbnRyeT5UaGUgaW1hZ2UgY2FuIGJlIHNjYWxlZCB0byB2YXJpb3VzIHNpemVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBiZWluZyBhIHNpbmdsZSBmaXhlZCBzaXplLjwvZW50cnk+Ci08L3Jvdz48cm93PgotPGVudHJ5PlZJRF9UWVBFX01PTk9DSFJPTUU8L2VudHJ5PjxlbnRyeT5UaGUgY2FwdHVyZSB3aWxsIGJlIG1vbm9jaHJvbWUuIFRoaXMgaXNuJ3QgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uIHNpbmNlIGEgbW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEgb24gYSBjb2xvdXIgY2FwdHVyZSBjYXJkIHdpbGwgc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZSBtb25vIG91dHB1dC48L2VudHJ5PgotPC9yb3c+PHJvdz4KLTxlbnRyeT5WSURfVFlQRV9TVUJDQVBUVVJFPC9lbnRyeT48ZW50cnk+VGhlIGNhcmQgYWxsb3dzIG9ubHkgcGFydCBvZiBpdHMgZmllbGQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyB0byBiZSBjYXB0dXJlZC4gVGhpcyBlbmFibGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB0byBhdm9pZCBjb3B5aW5nIGFsbCBvZiBhIGxhcmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGludG8gbWVtb3J5IHdoZW4gb25seSBzb21lIHNlY3Rpb24gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQuPC9lbnRyeT4KLSAgICA8L3Jvdz4KLSAgICA8L3Rib2R5PgotICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0gIDxwYXJhPgotICAgICAgICBXZSBzZXQgVklEX1RZUEVfQ0FQVFVSRSBzbyB0aGF0IHdlIGFyZSBzZWVuIGFzIGEgY2FwdHVyZSBjYXJkLAotICAgICAgICBWSURfVFlQRV9DSFJPTUFLRVkgc28gdGhlIGFwcGxpY2F0aW9uIGtub3dzIGl0IGlzIHRpbWUgdG8gZHJhdyBpbiB2aXJ1bGVudAotICAgICAgICBwdXJwbGUsIGFuZCBWSURfVFlQRV9TQ0FMRVMgYmVjYXVzZSB3ZSBjYW4gYmUgcmVzaXplZC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgT3VyIHNldHVwIGlzIGZhaXJseSBzaW1pbGFyLiBUaGlzIHRpbWUgd2UgYWxzbyB3YW50IGFuIGludGVycnVwdCBsaW5lCi0gICAgICAgIGZvciB0aGUgJ2ZyYW1lIGNhcHR1cmVkJyBzaWduYWwuIE5vdCBhbGwgY2FyZHMgaGF2ZSB0aGlzIHNvIHNvbWUgb2YgdGhlbQotICAgICAgICBjYW5ub3QgaGFuZGxlIHBvbGwoKS4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotc3RhdGljIGludCBpbyA9IDB4MzIwOwotc3RhdGljIGludCBpcnEgPSAxMTsKLQotaW50IF9faW5pdCBteWNhbWVyYV9pbml0KHN0cnVjdCB2aWRlb19pbml0ICp2KQotewotICAgICAgICBpZighcmVxdWVzdF9yZWdpb24oaW8sIE1ZX0lPX1NJWkUsICJteWNhbWVyYSIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSIAotICAgICAgICAgICAgICAgICAgICAgICJteWNhbWVyYTogcG9ydCAweCUwM1ggaXMgaW4gdXNlLlxuIiwgaW8pOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih2aWRlb19kZXZpY2VfcmVnaXN0ZXIoJmFtcDtteV9jYW1lcmEsIAotICAgICAgICAgICAgVkZMX1RZUEVfR1JBQkJFUik9PS0xKSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oaW8sIE1ZX0lPX1NJWkUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBUaGlzIGlzIGxpdHRsZSBjaGFuZ2VkIGZyb20gdGhlIG5lZWRzIG9mIHRoZSByYWRpbyBjYXJkLiBXZSBzcGVjaWZ5Ci0gICAgICAgIFZGTF9UWVBFX0dSQUJCRVIgdGhpcyB0aW1lIGFzIHdlIHdhbnQgdG8gYmUgYWxsb2NhdGVkIGEgL2Rldi92aWRlbyBuYW1lLgotICA8L3BhcmE+Ci0gIDwvc2VjdDE+Ci0gIDxzZWN0MSBpZD0ib3B2aWQiPgotICA8dGl0bGU+T3BlbmluZyBBbmQgQ2xvc2luZyBUaGUgQ2FwdHVyZSBEZXZpY2U8L3RpdGxlPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotc3RhdGljIGludCB1c2VycyA9IDA7Ci0KLXN0YXRpYyBpbnQgY2FtZXJhX29wZW4oc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBpbnQgZmxhZ3MpCi17Ci0gICAgICAgIGlmKHVzZXJzKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIGlmKHJlcXVlc3RfaXJxKGlycSwgY2FtZXJhX2lycSwgMCwgImNhbWVyYSIsIGRldikmbHQ7MCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB1c2VycysrOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNhbWVyYV9jbG9zZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYpCi17Ci0gICAgICAgIHVzZXJzLS07Ci0gICAgICAgIGZyZWVfaXJxKGlycSwgZGV2KTsKLX0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSBvcGVuIGFuZCBjbG9zZSByb3V0aW5lcyBhcmUgYWxzbyBxdWl0ZSBzaW1pbGFyLiBUaGUgb25seSByZWFsIGNoYW5nZSBpcwotICAgICAgICB0aGF0IHdlIG5vdyByZXF1ZXN0IGFuIGludGVycnVwdCBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgaW50ZXJydXB0IGxpbmUuIElmIHdlCi0gICAgICAgIGNhbm5vdCBnZXQgdGhlIGludGVycnVwdCB3ZSByZXBvcnQgRUJVU1kgdG8gdGhlIGFwcGxpY2F0aW9uIGFuZCBnaXZlIHVwLgotICA8L3BhcmE+Ci0gIDwvc2VjdDE+Ci0gIDxzZWN0MSBpZD0iaXJxdmlkIj4KLSAgPHRpdGxlPkludGVycnVwdCBIYW5kbGluZzwvdGl0bGU+Ci0gIDxwYXJhPgotICAgICAgICBPdXIgZXhhbXBsZSBoYW5kbGVyIGlzIGZvciBhbiBJU0EgYnVzIGRldmljZS4gSWYgaXQgd2FzIFBDSSB5b3Ugd291bGQgYmUKLSAgICAgICAgYWJsZSB0byBzaGFyZSB0aGUgaW50ZXJydXB0IGFuZCB3b3VsZCBoYXZlIHNldCBJUlFGX1NIQVJFRCB0byBpbmRpY2F0ZSBhCi0gICAgICAgIHNoYXJlZCBJUlEuIFdlIHBhc3MgdGhlIGRldmljZSBwb2ludGVyIGFzIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhcmd1bWVudC4gV2UKLSAgICAgICAgZG9uJ3QgbmVlZCB0byBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQgb25lIGNhcmQgYnV0IGRvaW5nIHRoaXMgd2lsbCBtYWtlIGl0Ci0gICAgICAgIGVhc2llciB0byB1cGdyYWRlIHRoZSBkcml2ZXIgZm9yIG11bHRpcGxlIGRldmljZXMgaW4gdGhlIGZ1dHVyZS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgT3VyIGludGVycnVwdCByb3V0aW5lIG5lZWRzIHRvIGRvIGxpdHRsZSBpZiB3ZSBhc3N1bWUgdGhlIGNhcmQgY2FuIHNpbXBseQotICAgICAgICBxdWV1ZSBvbmUgZnJhbWUgdG8gYmUgcmVhZCBhZnRlciBpdCBjYXB0dXJlcyBpdC4gCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLXN0YXRpYyBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqY2FwdHVyZV93YWl0Owotc3RhdGljIGludCBjYXB0dXJlX3JlYWR5ID0gMDsKLQotc3RhdGljIHZvaWQgY2FtZXJhX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLSAgICAgICAgY2FwdHVyZV9yZWFkeT0xOwotICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmFtcDtjYXB0dXJlX3dhaXQpOwotfQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVGhlIGludGVycnVwdCBoYW5kbGVyIGlzIG5pY2UgYW5kIHNpbXBsZSBmb3IgdGhpcyBjYXJkIGFzIHdlIGFyZSBhc3N1bWluZwotICAgICAgICB0aGUgY2FyZCBpcyBidWZmZXJpbmcgdGhlIGZyYW1lIGZvciB1cy4gVGhpcyBtZWFucyB3ZSBoYXZlIGxpdHRsZSB0byBkbyBidXQKLSAgICAgICAgd2FrZSB1cCAgICAgICAgYW55Ym9keSBpbnRlcmVzdGVkLiBXZSBhbHNvIHNldCBhIGNhcHR1cmVfcmVhZHkgZmxhZywgYXMgd2UgbWF5Ci0gICAgICAgIGNhcHR1cmUgYSBmcmFtZSBiZWZvcmUgYW4gYXBwbGljYXRpb24gbmVlZHMgaXQuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGtub3cKLSAgICAgICAgdGhhdCBhIGZyYW1lIGlzIHJlYWR5LiBJZiB3ZSBoYWQgdG8gY29sbGVjdCB0aGUgZnJhbWUgb24gdGhlIGludGVycnVwdCBsaWZlCi0gICAgICAgIHdvdWxkIGJlIG1vcmUgY29tcGxleC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgVGhlIHR3byBuZXcgcm91dGluZXMgd2UgbmVlZCB0byBzdXBwbHkgYXJlIGNhbWVyYV9yZWFkIHdoaWNoIHJldHVybnMgYQotICAgICAgICBmcmFtZSwgYW5kIGNhbWVyYV9wb2xsIHdoaWNoIHdhaXRzIGZvciBhIGZyYW1lIHRvIGJlY29tZSByZWFkeS4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotc3RhdGljIGludCBjYW1lcmFfcG9sbChzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIAotCXN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZSAqd2FpdCkKLXsKLSAgICAgICAgcG9sbF93YWl0KGZpbGUsICZhbXA7Y2FwdHVyZV93YWl0LCB3YWl0KTsKLSAgICAgICAgaWYoY2FwdHVyZV9yZWFkKQotICAgICAgICAgICAgICAgIHJldHVybiBQT0xMSU58UE9MTFJETk9STTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIE91ciB3YWl0IHF1ZXVlIGZvciBwb2xsaW5nIGlzIHRoZSBjYXB0dXJlX3dhaXQgcXVldWUuIFRoaXMgd2lsbCBjYXVzZSB0aGUKLSAgICAgICAgdGFzayB0byBiZSB3b2tlbiB1cCBieSBvdXIgY2FtZXJhX2lycSByb3V0aW5lLiBXZSBjaGVjayBjYXB0dXJlX3JlYWQgdG8gc2VlCi0gICAgICAgIGlmIHRoZXJlIGlzIGFuIGltYWdlIHByZXNlbnQgYW5kIGlmIHNvIHJlcG9ydCB0aGF0IGl0IGlzIHJlYWRhYmxlLgotICA8L3BhcmE+Ci0gIDwvc2VjdDE+Ci0gIDxzZWN0MSBpZD0icmR2aWQiPgotICA8dGl0bGU+UmVhZGluZyBUaGUgVmlkZW8gSW1hZ2U8L3RpdGxlPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotc3RhdGljIGxvbmcgY2FtZXJhX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0gICAgICAgIHN0cnVjdCB3YWl0X3F1ZXVlIHdhaXQgPSB7IGN1cnJlbnQsIE5VTEwgfTsKLSAgICAgICAgdTggKnB0cjsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgYWRkX3dhaXRfcXVldWUoJmFtcDtjYXB0dXJlX3dhaXQsICZhbXA7d2FpdCk7Ci0KLSAgICAgICAgd2hpbGUoIWNhcHR1cmVfcmVhZHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihmaWxlLT5mbGFncyZhbXA7T19OREVMQVkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmFtcDtjYXB0dXJlX3dhaXQsICZhbXA7d2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZhbXA7Y2FwdHVyZV93YWl0LCAmYW1wO3dhaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZSgpOwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZhbXA7Y2FwdHVyZV93YWl0LCAmYW1wO3dhaXQpOwotICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVGhlIGZpcnN0IHRoaW5nIHdlIGhhdmUgdG8gZG8gaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhaXRzIHVudGlsCi0gICAgICAgIHRoZSBuZXh0IGZyYW1lIGlzIHJlYWR5LiBUaGUgY29kZSBoZXJlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIG1vdXNlIGNvZGUKLSAgICAgICAgd2UgdXNlZCBlYXJsaWVyIGluIHRoaXMgY2hhcHRlci4gSXQgaXMgb25lIG9mIHRoZSBjb21tb24gYnVpbGRpbmcgYmxvY2tzIG9mCi0gICAgICAgIExpbnV4IGRldmljZSBkcml2ZXIgY29kZSBhbmQgcHJvYmFibHkgb25lIHdoaWNoIHlvdSB3aWxsIGZpbmQgb2NjdXJzIGluIGFueQotICAgICAgICBkcml2ZXJzIHlvdSB3cml0ZS4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgV2Ugd2FpdCBmb3IgYSBmcmFtZSB0byBiZSByZWFkeSwgb3IgZm9yIGEgc2lnbmFsIHRvIGludGVycnVwdCBvdXIgd2FpdGluZy4gSWYgYQotICAgICAgICBzaWduYWwgb2NjdXJzIHdlIG5lZWQgdG8gcmV0dXJuIGZyb20gdGhlIHN5c3RlbSBjYWxsIHNvIHRoYXQgdGhlIHNpZ25hbCBjYW4KLSAgICAgICAgYmUgc2VudCB0byB0aGUgYXBwbGljYXRpb24gaXRzZWxmLiBXZSBhbHNvIGNoZWNrIHRvIHNlZSBpZiB0aGUgdXNlciBhY3R1YWxseQotICAgICAgICB3YW50ZWQgdG8gYXZvaWQgd2FpdGluZyAtIGllICBpZiB0aGV5IGFyZSB1c2luZyBub24tYmxvY2tpbmcgSS9PIGFuZCBoYXZlIG90aGVyIHRoaW5ncyAKLSAgICAgICAgdG8gZ2V0IG9uIHdpdGguCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIE5leHQgd2UgY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjYXJkIHRvIHRoZSB1c2VyIGFwcGxpY2F0aW9uLiBUaGlzIGlzIHJhcmVseQotICAgICAgICBhcyBlYXN5IGFzIG91ciBleGFtcGxlIG1ha2VzIG91dC4gV2Ugd2lsbCBhZGQgY2FwdHVyZV93LCBhbmQgY2FwdHVyZV9oIGhlcmUKLSAgICAgICAgdG8gaG9sZCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2FwdHVyZWQgaW1hZ2UuIFdlIGFzc3VtZSB0aGUgY2FyZCBvbmx5Ci0gICAgICAgIHN1cHBvcnRzIDI0Yml0IFJHQiBmb3Igbm93LgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi0KLSAgICAgICAgY2FwdHVyZV9yZWFkeSA9IDA7Ci0KLSAgICAgICAgcHRyPSh1OCAqKWJ1ZjsKLSAgICAgICAgbGVuID0gY2FwdHVyZV93ICogMyAqIGNhcHR1cmVfaDsgLyogMjRiaXQgUkdCICovCi0KLSAgICAgICAgaWYobGVuPmNvdW50KQotICAgICAgICAgICAgICAgIGxlbj1jb3VudDsgIC8qIERvZXNuJ3QgYWxsIGZpdCAqLwotCi0gICAgICAgIGZvcihpPTA7IGkmbHQ7bGVuOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXRfdXNlcihpbmIoaW8rSU1BR0VfREFUQSksIHB0cik7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIH0KLQotICAgICAgICBoYXJkd2FyZV9yZXN0YXJ0X2NhcHR1cmUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIGk7Ci19Ci0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIEZvciBhIHJlYWwgaGFyZHdhcmUgZGV2aWNlIHlvdSB3b3VsZCB0cnkgdG8gYXZvaWQgdGhlIGxvb3Agd2l0aCBwdXRfdXNlcigpLgotICAgICAgICBFYWNoIGNhbGwgdG8gcHV0X3VzZXIoKSBoYXMgYSB0aW1lIG92ZXJoZWFkIGNoZWNraW5nIHdoZXRoZXIgdGhlIGFjY2Vzc2VzIHRvIHVzZXIKLSAgICAgICAgc3BhY2UgYXJlIGFsbG93ZWQuIEl0IHdvdWxkIGJlIGJldHRlciB0byByZWFkIGEgbGluZSBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlcgotICAgICAgICB0aGVuIGNvcHkgdGhpcyB0byB1c2VyIHNwYWNlIGluIG9uZSBnby4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgSGF2aW5nIGNhcHR1cmVkIHRoZSBpbWFnZSBhbmQgcHV0IGl0IGludG8gdXNlciBzcGFjZSB3ZSBjYW4ga2ljayB0aGUgY2FyZCB0bwotICAgICAgICBnZXQgdGhlIG5leHQgZnJhbWUgYWNxdWlyZWQuCi0gIDwvcGFyYT4KLSAgPC9zZWN0MT4KLSAgPHNlY3QxIGlkPSJpb2N2aWQiPgotICA8dGl0bGU+VmlkZW8gSW9jdGwgSGFuZGxpbmc8L3RpdGxlPgotICA8cGFyYT4KLSAgICAgICAgQXMgd2l0aCB0aGUgcmFkaW8gZHJpdmVyIHRoZSBtYWpvciBjb250cm9sIGludGVyZmFjZSBpcyB2aWEgdGhlIGlvY3RsKCkKLSAgICAgICAgZnVuY3Rpb24uIFZpZGVvIGNhcHR1cmUgZGV2aWNlcyBzdXBwb3J0IHRoZSBzYW1lIHR1bmVyIGNhbGxzIGFzIGEgcmFkaW8KLSAgICAgICAgZGV2aWNlIGFuZCBhbHNvIHN1cHBvcnQgYWRkaXRpb25hbCBjYWxscyB0byBjb250cm9sIGhvdyB0aGUgdmlkZW8gZnVuY3Rpb25zCi0gICAgICAgIGFyZSBoYW5kbGVkLiBJbiB0aGlzIHNpbXBsZSBleGFtcGxlIHRoZSBjYXJkIGhhcyBubyB0dW5lcnMgdG8gYXZvaWQgbWFraW5nCi0gICAgICAgIHRoZSBjb2RlIGNvbXBsZXguIAotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi0KLXN0YXRpYyBpbnQgY2FtZXJhX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotICAgICAgICBzd2l0Y2goY21kKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWSURJT0NHQ0FQOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJRF9UWVBFX0NIUk9NQUtFWXxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURfVFlQRV9TQ0FMRVN8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklEX1RZUEVfT1ZFUkxBWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuY2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5hdWRpb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5tYXh3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYubWlud2lkdGggPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYubWF4aGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5taW5oZWlnaHQgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh2Lm5hbWUsICJNeSBDYW1lcmEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcihhcmcsICZhbXA7diwgc2l6ZW9mKHYpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgVGhlIGZpcnN0IGlvY3RsIHdlIG11c3Qgc3VwcG9ydCBhbmQgd2hpY2ggYWxsIHZpZGVvIGNhcHR1cmUgYW5kIHJhZGlvCi0gICAgICAgIGRldmljZXMgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgaXMgVklESU9DR0NBUC4gVGhpcyBiZWhhdmVzIGV4YWN0bHkgdGhlIHNhbWUKLSAgICAgICAgYXMgd2l0aCBhIHJhZGlvIGRldmljZS4gVGhpcyB0aW1lLCBob3dldmVyLCB3ZSByZXBvcnQgdGhlIGV4dHJhIGNhcGFiaWxpdGllcwotICAgICAgICB3ZSBvdXRsaW5lZCBlYXJsaWVyIG9uIHdoZW4gZGVmaW5pbmcgb3VyIHZpZGVvX2RldiBzdHJ1Y3R1cmUuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIG5vdyBzZXQgdGhlIHZpZGVvIGZsYWdzIHNheWluZyB0aGF0IHdlIHN1cHBvcnQgb3ZlcmxheSwgY2FwdHVyZSwKLSAgICAgICAgc2NhbGluZyBhbmQgY2hyb21ha2V5LiBXZSBhbHNvIHJlcG9ydCBzaXplIGxpbWl0cyAtIG91ciBzbWFsbGVzdCBpbWFnZSBpcwotICAgICAgICAxNngxNiBwaXhlbHMsIG91ciBsYXJnZXN0IGlzIDY0MHg0ODAuIAotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgd2UgcmVwb3J0IG5vIGF1ZGlvIGFuZCBubyB0dW5pbmcgY2FwYWJpbGl0aWVzIGF0IGFsbC4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+ICAgICAgICAKLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DR0NIQU46Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZpZGVvX2NoYW5uZWwgdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZhbXA7diwgYXJnLCBzaXplb2YodikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYuY2hhbm5lbCAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuZmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdi50dW5lcnMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Lm5vcm0gPSBWSURFT19NT0RFX0FVVE87Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkodi5uYW1lLCAiQ2FtZXJhIElucHV0Iik7YnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIFRoaXMgZm9sbG93cyB3aGF0IGlzIHZlcnkgbXVjaCB0aGUgc3RhbmRhcmQgd2F5IGFuIGlvY3RsIGhhbmRsZXIgbG9va3MKLSAgICAgICAgaW4gTGludXguIFdlIGNvcHkgdGhlIGRhdGEgaW50byBhIGtlcm5lbCBzcGFjZSB2YXJpYWJsZSBhbmQgd2UgY2hlY2sgdGhhdCB0aGUKLSAgICAgICAgcmVxdWVzdCBpcyB2YWxpZCAoaW4gdGhpcyBjYXNlIHRoYXQgdGhlIGlucHV0IGlzIDApLiBGaW5hbGx5IHdlIGNvcHkgdGhlCi0gICAgICAgIGNhbWVyYSBpbmZvIGJhY2sgdG8gdGhlIHVzZXIuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSBWSURJT0NHQ0hBTiBpb2N0bCBhbGxvd3MgYSB1c2VyIHRvIGFzayBhYm91dCB2aWRlbyBjaGFubmVscyAodGhhdCBpcwotICAgICAgICBpbnB1dHMgdG8gdGhlIHZpZGVvIGNhcmQpLiBPdXIgZXhhbXBsZSBjYXJkIGhhcyBhIHNpbmdsZSBjYW1lcmEgaW5wdXQuIFRoZQotICAgICAgICBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZSBhcmUKLSAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19jaGFubmVsX2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIGZpZWxkczwvdGl0bGU+Ci0gICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KLSAgIDx0Ym9keT4KLSAgIDxyb3c+Ci0KLSAgIDxlbnRyeT5jaGFubmVsPC9lbnRyeT48ZW50cnk+VGhlIGNoYW5uZWwgbnVtYmVyIHdlIGFyZSBzZWxlY3Rpbmc8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT5uYW1lPC9lbnRyeT48ZW50cnk+VGhlIG5hbWUgZm9yIHRoaXMgY2hhbm5lbC4gVGhpcyBpcyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICAgIHRvIGRlc2NyaWJlIHRoZSBwb3J0IHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgICAgICAgIEFwcHJvcHJpYXRlIG5hbWVzIGFyZSB0aGVyZWZvcmUgdGhpbmdzIGxpa2UKLSAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIiAiU0NBUlQgaW5wdXQiPC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICA8ZW50cnk+ZmxhZ3M8L2VudHJ5PjxlbnRyeT5DaGFubmVsIHByb3BlcnRpZXM8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT50eXBlPC9lbnRyeT48ZW50cnk+SW5wdXQgdHlwZTwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgPGVudHJ5Pm5vcm08L2VudHJ5PjxlbnRyeT5UaGUgY3VycmVudCB0ZWxldmlzaW9uIGVuY29kaW5nIGJlaW5nIHVzZWQKLSAgICAgICAgICAgICAgICAgICBpZiByZWxldmFudCBmb3IgdGhpcyBjaGFubmVsLgotICAgIDwvZW50cnk+Ci0gICAgPC9yb3c+Ci0gICAgPC90Ym9keT4KLSAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fY2hhbm5lbF9mbGFncyI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIGZsYWdzPC90aXRsZT4KLSAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KLSAgICA8dGJvZHk+Ci0gICAgPHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX1ZDX1RVTkVSPC9lbnRyeT48ZW50cnk+Q2hhbm5lbCBoYXMgYSB0dW5lci48L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX1ZDX0FVRElPPC9lbnRyeT48ZW50cnk+Q2hhbm5lbCBoYXMgYXVkaW8uPC9lbnRyeT4KLSAgICA8L3Jvdz4KLSAgICA8L3Rib2R5PgotICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19jaGFubmVsX3R5cGVzIj48dGl0bGU+c3RydWN0IHZpZGVvX2NoYW5uZWwgdHlwZXM8L3RpdGxlPgotICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgIDx0Ym9keT4KLSAgICA8cm93PgotICAgICAgICA8ZW50cnk+VklERU9fVFlQRV9UVjwvZW50cnk+PGVudHJ5PlRlbGV2aXNpb24gaW5wdXQuPC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5WSURFT19UWVBFX0NBTUVSQTwvZW50cnk+PGVudHJ5PkZpeGVkIGNhbWVyYSBpbnB1dC48L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLQk8ZW50cnk+MDwvZW50cnk+PGVudHJ5PlR5cGUgaXMgdW5rbm93bi48L2VudHJ5PgotICAgIDwvcm93PgotICAgIDwvdGJvZHk+Ci0gICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLSAgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NoYW5uZWxfbm9ybXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2hhbm5lbCBub3JtczwvdGl0bGU+Ci0gICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+Ci0gICAgPHRib2R5PgotICAgIDxyb3c+Ci0gICAgICAgIDxlbnRyeT5WSURFT19NT0RFX1BBTDwvZW50cnk+PGVudHJ5PlBBTCBlbmNvZGVkIFRlbGV2aXNpb248L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX01PREVfTlRTQzwvZW50cnk+PGVudHJ5Pk5UU0MgKFVTKSBlbmNvZGVkIFRlbGV2aXNpb248L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PlZJREVPX01PREVfU0VDQU08L2VudHJ5PjxlbnRyeT5TRUNBTSAoRnJlbmNoKSBUZWxldmlzaW9uIDwvZW50cnk+Ci0gICA8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+VklERU9fTU9ERV9BVVRPPC9lbnRyeT48ZW50cnk+QXV0b21hdGljIHN3aXRjaGluZywgb3IgZm9ybWF0IGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHRlcjwvZW50cnk+Ci0gICAgPC9yb3c+Ci0gICAgPC90Ym9keT4KLSAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotICAgIDxwYXJhPgotICAgICAgICBUaGUgY29ycmVzcG9uZGluZyBWSURJT0NTQ0hBTiBpb2N0bCBhbGxvd3MgYSB1c2VyIHRvIGNoYW5nZSBjaGFubmVsIGFuZCB0bwotICAgICAgICByZXF1ZXN0IHRoZSBub3JtIGlzIGNoYW5nZWQgLSBmb3IgZXhhbXBsZSB0byBzd2l0Y2ggYmV0d2VlbiBhIFBBTCBvciBhbiBOVFNDCi0gICAgICAgIGZvcm1hdCBjYW1lcmEuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFZJRElPQ1NDSEFOOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19jaGFubmVsIHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmYW1wO3YsIGFyZywgc2l6ZW9mKHYpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2LmNoYW5uZWwgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2Lm5vcm0gIT0gVklERU9fTU9ERV9BVVRPKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjYWxsIGluIG91ciBkcml2ZXIgaXMgcmVtYXJrYWJseSBlYXN5LiBCZWNhdXNlIHdlCi0gICAgICAgIGFyZSBhc3N1bWluZyBmaXhlZCBmb3JtYXQgaGFyZHdhcmUgd2UgbmVlZCBvbmx5IGNoZWNrIHRoYXQgdGhlIHVzZXIgaGFzIG5vdAotICAgICAgICB0cmllZCB0byBjaGFuZ2UgYW55dGhpbmcuIAotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgdXNlciBhbHNvIG5lZWRzIHRvIGJlIGFibGUgdG8gY29uZmlndXJlIGFuZCBhZGp1c3QgdGhlIHBpY3R1cmUgdGhleSBhcmUKLSAgICAgICAgc2VlaW5nLiBUaGlzIGlzIG11Y2ggbGlrZSBhZGp1c3RpbmcgYSB0ZWxldmlzaW9uIHNldC4gQSB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgIGFsc28gbmVlZHMgdG8ga25vdyB0aGUgcGFsZXR0ZSBiZWluZyB1c2VkIHNvIHRoYXQgaXQga25vd3MgaG93IHRvIGRpc3BsYXkKLSAgICAgICAgdGhlIGltYWdlIHRoYXQgaGFzIGJlZW4gY2FwdHVyZWQuIFRoZSBWSURJT0NHUElDVCBhbmQgVklESU9DU1BJQ1QgaW9jdGwKLSAgICAgICAgY2FsbHMgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBWSURJT0NHUElDVAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19waWN0dXJlIHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LmJyaWdodG5lc3MgPSBoYXJkd2FyZV9icmlnaHRuZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Lmh1ZSA9IGhhcmR3YXJlX2h1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdi5jb2xvdXIgPSBoYXJkd2FyZV9zYXR1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LmNvbnRyYXN0ID0gaGFyZHdhcmVfYnJpZ2h0bmVzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IHNldHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2LndoaXRlbmVzcyA9IDMyNzY4OwotICAgICAgICAgICAgICAgICAgICAgICAgdi5kZXB0aCA9IDI0OyAgICAgICAgICAgLyogMjRiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHYucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoJmFtcDt2LCBhcmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgYnJpZ2h0bmVzcywgaHVlLCBjb2xvciwgYW5kIGNvbnRyYXN0IHByb3ZpZGUgdGhlIHBpY3R1cmUgY29udHJvbHMgdGhhdAotICAgICAgICBhcmUgYWtpbiB0byBhIGNvbnZlbnRpb25hbCB0ZWxldmlzaW9uLiBXaGl0ZW5lc3MgcHJvdmlkZXMgYWRkaXRpb25hbAotICAgICAgICBjb250cm9sIGZvciBncmV5c2NhbGUgaW1hZ2VzLiBBbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBzY2FsZWQgYmV0d2VlbiAwLTY1NTM1Ci0gICAgICAgIGFuZCBoYXZlIDMyNzY4IGFzIHRoZSBtaWQgcG9pbnQgc2V0dGluZy4gVGhlIHNjYWxpbmcgbWVhbnMgdGhhdCBhcHBsaWNhdGlvbnMKLSAgICAgICAgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGNhcGFiaWxpdHkgcmFuZ2Ugb2YgdGhlIGhhcmR3YXJlIGJ1dCBjYW4gbGV0Ci0gICAgICAgIGl0IG1ha2UgYSBiZXN0IGVmZm9ydCBhdHRlbXB0LgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBPdXIgZGVwdGggaXMgMjQsIGFzIHRoaXMgaXMgaW4gYml0cy4gV2Ugd2lsbCBiZSByZXR1cm5pbmcgUkdCMjQgZm9ybWF0LiBUaGlzCi0gICAgICAgIGhhcyBvbmUgYnl0ZSBvZiByZWQsIHRoZW4gb25lIG9mIGdyZWVuLCB0aGVuIG9uZSBvZiBibHVlLiBUaGlzIHRoZW4gcmVwZWF0cwotICAgICAgICBmb3IgZXZlcnkgb3RoZXIgcGl4ZWwgaW4gdGhlIGltYWdlLiBUaGUgb3RoZXIgY29tbW9uIGZvcm1hdHMgdGhlIGludGVyZmFjZSAKLSAgICAgICAgZGVmaW5lcyBhcmUKLSAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJGcmFtZWJ1ZmZlcl9FbmNvZGluZ3MiPjx0aXRsZT5GcmFtZWJ1ZmZlciBFbmNvZGluZ3M8L3RpdGxlPgotICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+Ci0gICA8dGJvZHk+Ci0gICA8cm93PgotICAgPGVudHJ5PkdSRVk8L2VudHJ5PjxlbnRyeT5MaW5lYXIgZ3JleXNjYWxlLiBUaGlzIGlzIGZvciBzaW1wbGUgY2FtZXJhcyBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWtlPC9lbnRyeT4KLSAgIDwvcm93Pjxyb3c+Ci0gICA8ZW50cnk+UkdCNTY1PC9lbnRyeT48ZW50cnk+VGhlIHRvcCA1IGJpdHMgaG9sZCAzMiByZWQgbGV2ZWxzLCB0aGUgbmV4dCBzaXggYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCBncmVlbiBhbmQgdGhlIGxvdyA1IGJpdHMgaG9sZCBibHVlLiA8L2VudHJ5PgotICAgPC9yb3c+PHJvdz4KLSAgIDxlbnRyeT5SR0I1NTU8L2VudHJ5PjxlbnRyeT5UaGUgdG9wIGJpdCBpcyBjbGVhci4gVGhlIHJlZCBncmVlbiBhbmQgYmx1ZSBsZXZlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggb2NjdXB5IGZpdmUgYml0cy48L2VudHJ5PgotICAgIDwvcm93PgotICAgIDwvdGJvZHk+Ci0gICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLSAgPHBhcmE+Ci0gICAgICAgIEFkZGl0aW9uYWwgbW9kZXMgYXJlIHN1cHBvcnQgZm9yIFlVViBjYXB0dXJlIGZvcm1hdHMuIFRoZXNlIGFyZSBjb21tb24gZm9yCi0gICAgICAgIFRWIGFuZCB2aWRlbyBjb25mZXJlbmNpbmcgYXBwbGljYXRpb25zLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgVklESU9DU1BJQ1QgaW9jdGwgYWxsb3dzIGEgdXNlciB0byBzZXQgc29tZSBvZiB0aGUgcGljdHVyZSBwYXJhbWV0ZXJzLgotICAgICAgICBFeGFjdGx5IHdoaWNoIG9uZXMgYXJlIHN1cHBvcnRlZCBkZXBlbmRzIGhlYXZpbHkgb24gdGhlIGNhcmQgaXRzZWxmLiBJdCBpcwotICAgICAgICBwb3NzaWJsZSB0byBzdXBwb3J0IG1hbnkgbW9kZXMgYW5kIGVmZmVjdHMgaW4gc29mdHdhcmUuIEluIGdlbmVyYWwgZG9pbmcKLSAgICAgICAgdGhpcyBpbiB0aGUga2VybmVsIGlzIGEgYmFkIGlkZWEuIFZpZGVvIGNhcHR1cmUgaXMgYSBwZXJmb3JtYW5jZS1zZW5zaXRpdmUKLSAgICAgICAgYXBwbGljYXRpb24gYW5kIHRoZSBwcm9ncmFtcyBjYW4gb2Z0ZW4gZG8gYmV0dGVyIGlmIHRoZXkgYXJlbid0IGJlaW5nCi0gICAgICAgICdoZWxwZWQnIGJ5IGFuIG92ZXJrZWVuIGRyaXZlciB3cml0ZXIuIFRodXMgZm9yIG91ciBkZXZpY2Ugd2Ugd2lsbCByZXBvcnQKLSAgICAgICAgUkdCMjQgb25seSBhbmQgcmVmdXNlIHRvIGFsbG93IGEgY2hhbmdlLgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi0gICAgICAgICAgICAgICAgY2FzZSBWSURJT0NTUElDVDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmFtcDt2LCBhcmcsIHNpemVvZih2KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodi5kZXB0aCE9MjQgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2LnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SR0IyNCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfaGFyZHdhcmVfYnJpZ2h0bmVzcyh2LmJyaWdodG5lc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2hhcmR3YXJlX2h1ZSh2Lmh1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfaGFyZHdhcmVfc2F0dXJhdGlvbih2LmNvbG91cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfaGFyZHdhcmVfYnJpZ2h0bmVzcyh2LmNvbnRyYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBXZSBjaGVjayB0aGUgdXNlciBoYXMgbm90IHRyaWVkIHRvIGNoYW5nZSB0aGUgcGFsZXR0ZSBvciB0aGUgZGVwdGguIFdlIGRvCi0gICAgICAgIG5vdCB3YW50IHRvIGNhcnJ5IG91dCBzb21lIG9mIHRoZSBjaGFuZ2VzIGFuZCB0aGVuIHJldHVybiBhbiBlcnJvci4gVGhpcyBtYXkKLSAgICAgICAgY29uZnVzZSB0aGUgYXBwbGljYXRpb24gd2hpY2ggd2lsbCBiZSBhc3N1bWluZyBubyBjaGFuZ2Ugb2NjdXJyZWQuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIEluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gc2V0IHRoZSBwaWN0dXJlIGNvbnRyb2xzIHRvCi0gICAgICAgIGdldCB0aGUgcmlnaHQgY2FwdHVyZSBpbWFnZXMsIG1hbnkgY2FyZHMgbmVlZCB0byBrbm93IHdoYXQgdGhleSBhcmUKLSAgICAgICAgZGlzcGxheWluZyBvbnRvIHdoZW4gZ2VuZXJhdGluZyBvdmVybGF5IG91dHB1dC4gSW4gc29tZSBjYXNlcyBnZXR0aW5nIHRoaXMKLSAgICAgICAgd3JvbmcgZXZlbiBtYWtlcyBhIG5hc3R5IG1lc3Mgb3IgbWF5IGNyYXNoIHRoZSBjb21wdXRlci4gRm9yIHRoYXQgcmVhc29uCi0gICAgICAgIHRoZSBWSURJT0NTQlVGIGlvY3RsIHVzZWQgdG8gc2V0IHVwIHRoZSBmcmFtZSBidWZmZXIgaW5mb3JtYXRpb24gbWF5IHdlbGwKLSAgICAgICAgb25seSBiZSB1c2FibGUgYnkgcm9vdC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLSAgICAgICAgV2Ugd2lsbCBhc3N1bWUgb3VyIGNhcmQgaXMgb25lIG9mIHRoZSBvbGQgSVNBIGRldmljZXMgd2l0aCBmZWF0dXJlIGNvbm5lY3RvcgotICAgICAgICBhbmQgb25seSBzdXBwb3J0cyBhIGNvdXBsZSBvZiBzdGFuZGFyZCB2aWRlbyBtb2Rlcy4gVmVyeSBjb21tb24gZm9yIG9sZGVyCi0gICAgICAgIGNhcmRzIGFsdGhvdWdoIHRoZSBQQ0kgZGV2aWNlcyBhcmUgd2F5IHNtYXJ0ZXIgdGhhbiB0aGlzLgotICA8L3BhcmE+Ci0gIDxwcm9ncmFtbGlzdGluZz4KLQotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2J1ZmZlciBjYXB0dXJlX2ZiOwotCi0gICAgICAgICAgICAgICAgY2FzZSBWSURJT0NHRkJVRjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO2NhcHR1cmVfZmIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FwdHVyZV9mYikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotCi0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIGtlZXAgdGhlIGZyYW1lIGJ1ZmZlciBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybWF0IHRoZSBpb2N0bCB1c2VzLiBUaGlzCi0gICAgICAgIG1ha2VzIGl0IG5pY2UgYW5kIGVhc3kgdG8gd29yayB3aXRoIGluIHRoZSBpb2N0bCBjYWxscy4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFZJRElPQ1NGQlVGOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2aWRlb19idWZmZXIgdjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZhbXA7diwgYXJnLCBzaXplb2YodikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYud2lkdGghPTMyMCAmYW1wOyZhbXA7IHYud2lkdGghPTY0MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2LmhlaWdodCE9MjAwICZhbXA7JmFtcDsgdi5oZWlnaHQhPTI0MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOyB2LmhlaWdodCE9NDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7JmFtcDsgdi5oZWlnaHQgIT00ODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZhbXA7Y2FwdHVyZV9mYiwgJmFtcDt2LCBzaXplb2YodikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2V0X2ZiKCZhbXA7dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotCi0gIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gIDxwYXJhPgotICAgICAgICBUaGUgY2FwYWJsZSgpIGZ1bmN0aW9uIGNoZWNrcyBhIHVzZXIgaGFzIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5LiBUaGUgTGludXgKLSAgICAgICAgb3BlcmF0aW5nIHN5c3RlbSBoYXMgYSBzZXQgb2YgYWJvdXQgMzAgY2FwYWJpbGl0aWVzIGluZGljYXRpbmcgcHJpdmlsZWdlZAotICAgICAgICBhY2Nlc3MgdG8gc2VydmljZXMuIFRoZSBkZWZhdWx0IHNldCB1cCBnaXZlcyB0aGUgc3VwZXJ1c2VyICh1aWQgMCkgYWxsIG9mCi0gICAgICAgIHRoZW0gYW5kIG5vYm9keSBlbHNlIGhhcyBhbnkuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIGNoZWNrIHRoYXQgdGhlIHVzZXIgaGFzIHRoZSBTWVNfQURNSU4gY2FwYWJpbGl0eSwgdGhhdCBpcyB0aGV5IGFyZQotICAgICAgICBhbGxvd2VkIHRvIG9wZXJhdGUgYXMgdGhlIG1hY2hpbmUgYWRtaW5pc3RyYXRvci4gV2UgZG9uJ3Qgd2FudCBhbnlvbmUgYnV0Ci0gICAgICAgIHRoZSBhZG1pbmlzdHJhdG9yIG1ha2luZyBhIG1lc3Mgb2YgdGhlIGRpc3BsYXkuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIE5leHQgd2UgY2hlY2sgZm9yIHN0YW5kYXJkIFBDIHZpZGVvIG1vZGVzICgzMjAgb3IgNjQwIHdpZGUgd2l0aCBlaXRoZXIKLSAgICAgICAgRUdBIG9yIFZHQSBkZXB0aHMpLiBJZiB0aGUgbW9kZSBpcyBub3QgYSBzdGFuZGFyZCB2aWRlbyBtb2RlIHdlIHJlamVjdCBpdCBhcwotICAgICAgICBub3Qgc3VwcG9ydGVkIGJ5IG91ciBjYXJkLiBJZiB0aGUgbW9kZSBpcyBhY2NlcHRhYmxlIHdlIHNhdmUgaXQgc28gdGhhdAotICAgICAgICBWSURJT0NGQlVGIHdpbGwgZ2l2ZSB0aGUgcmlnaHQgYW5zd2VyIG5leHQgdGltZSBpdCBpcyBjYWxsZWQuICBUaGUKLSAgICAgICAgaGFyZHdhcmVfc2V0X2ZiKCkgZnVuY3Rpb24gaXMgc29tZSB1bmRlc2NyaWJlZCBjYXJkIHNwZWNpZmljIGZ1bmN0aW9uIHRvCi0gICAgICAgIHByb2dyYW0gdGhlIGNhcmQgZm9yIHRoZSBkZXNpcmVkIG1vZGUuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0gICAgICAgIEJlZm9yZSB0aGUgZHJpdmVyIGNhbiBkaXNwbGF5IGFuIG92ZXJsYXkgd2luZG93IGl0IG5lZWRzIHRvIGtub3cgd2hlcmUgdGhlCi0gICAgICAgIHdpbmRvdyBzaG91bGQgYmUgcGxhY2VkLCBhbmQgYWxzbyBob3cgbGFyZ2UgaXQgc2hvdWxkIGJlLiBJZiB0aGUgY2FyZAotICAgICAgICBzdXBwb3J0cyBjbGlwcGluZyBpdCBuZWVkcyB0byBrbm93IHdoaWNoIHJlY3RhbmdsZXMgdG8gb21pdCBmcm9tIHRoZQotICAgICAgICBkaXNwbGF5LiBUaGUgdmlkZW9fd2luZG93IHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSB3YXkgdGhlIGltYWdlIAotICAgICAgICBzaG91bGQgYmUgZGlzcGxheWVkLiAKLSAgIDwvcGFyYT4KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fd2luZG93X2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb193aW5kb3cgZmllbGRzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgPGVudHJ5PndpZHRoPC9lbnRyeT48ZW50cnk+VGhlIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgZGVzaXJlZCBpbWFnZS4gVGhlIGNhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heSB1c2UgYSBzbWFsbGVyIHNpemUgaWYgdGhpcyBzaXplIGlzIG5vdCBhdmFpbGFibGU8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5oZWlnaHQ8L2VudHJ5PjxlbnRyeT5UaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZS4gVGhlIGNhcmQgbWF5IHVzZSBhIHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaWYgdGhpcyBzaXplIGlzIG5vdCBhdmFpbGFibGUuPC9lbnRyeT4KLQk8L3Jvdz48cm93PgotICAgICAgICA8ZW50cnk+eDwvZW50cnk+PGVudHJ5PiAgIFRoZSBYIHBvc2l0aW9uIG9mIHRoZSB0b3AgbGVmdCBvZiB0aGUgd2luZG93LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gdGhlIGxlZnQgaGFuZCBlZGdlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS4gTm90IGFsbCBjYXJkcyBjYW4gZGlzcGxheSBpbWFnZXMgYWxpZ25lZCBvbgotICAgICAgICAgICAgICAgICAgICAgICAgYW55IHBpeGVsIGJvdW5kYXJ5LiBJZiB0aGUgcG9zaXRpb24gaXMgdW5zdWl0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhcmQgYWRqdXN0cyB0aGUgaW1hZ2UgcmlnaHQgYW5kIHJlZHVjZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aC48L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT55PC9lbnRyeT48ZW50cnk+ICAgVGhlIFkgcG9zaXRpb24gb2YgdGhlIHRvcCBsZWZ0IG9mIHRoZSB3aW5kb3cuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNvdW50ZWQgaW4gcGl4ZWxzIHJlbGF0aXZlIHRvIHRoZSB0b3AgZWRnZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUuIEFzIHdpdGggdGhlIHdpZHRoIGlmIHRoZSBjYXJkIGNhbm5vdAotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSAgc3RhcnRpbmcgb24gdGhpcyBsaW5lIGl0IHdpbGwgYWRqdXN0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLjwvZW50cnk+Ci0JPC9yb3c+PHJvdz4KLSAgICAgICAgPGVudHJ5PmNocm9tYWtleTwvZW50cnk+PGVudHJ5PlRoZSBjb2xvdXIgKGV4cHJlc3NlZCBpbiBSR0IzMiBmb3JtYXQpIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYWtleSBjb2xvdXIgaWYgY2hyb21hIGtleWluZyBpcyBiZWluZyB1c2VkLiA8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5jbGlwczwvZW50cnk+PGVudHJ5PkFuIGFycmF5IG9mIHJlY3RhbmdsZXMgdGhhdCBtdXN0IG5vdCBiZSBkcmF3bgotCQkJb3Zlci48L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5jbGlwY291bnQ8L2VudHJ5PjxlbnRyeT5UaGUgbnVtYmVyIG9mIGNsaXBzIGluIHRoaXMgYXJyYXkuPC9lbnRyeT4KLSAgICA8L3Jvdz4KLSAgICA8L3Rib2R5PgotICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0gICAgPHBhcmE+Ci0gICAgICAgIEVhY2ggY2xpcCBpcyBhIHN0cnVjdCB2aWRlb19jbGlwIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcwotICAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19jbGlwX2ZpZWxkcyI+PHRpdGxlPnZpZGVvX2NsaXAgZmllbGRzPC90aXRsZT4KLSAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgotICAgPHRib2R5PgotICAgPHJvdz4KLSAgICAgICAgPGVudHJ5PngsIHk8L2VudHJ5PjxlbnRyeT5Dby1vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIGRpc3BsYXk8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT53aWR0aCwgaGVpZ2h0PC9lbnRyeT48ZW50cnk+V2lkdGggYW5kIGhlaWdodCBpbiBwaXhlbHM8L2VudHJ5PgotCTwvcm93Pjxyb3c+Ci0gICAgICAgIDxlbnRyeT5uZXh0PC9lbnRyeT48ZW50cnk+QSBzcGFyZSBmaWVsZCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZTwvZW50cnk+Ci0gICAgPC9yb3c+Ci0gICAgPC90Ym9keT4KLSAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotICAgIDxwYXJhPgotICAgICAgICBUaGUgZHJpdmVyIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBpdCBhbHdheXMgZHJhd3MgaW4gdGhlIGFyZWEgcmVxdWVzdGVkIG9yIGEgICAgICAgIHNtYWxsZXIgYXJlYSwgYW5kIHRoYXQgaXQgbmV2ZXIgZHJhd3MgaW4gYW55IG9mIHRoZSBhcmVhcyB0aGF0IGFyZSBjbGlwcGVkLgotICAgICAgICBUaGlzIG1heSB3ZWxsIG1lYW4gaXQgaGFzIHRvIGxlYXZlIGFsb25lLiBzbWFsbCBhcmVhcyB0aGUgYXBwbGljYXRpb24gd2lzaGVkIHRvIGJlCi0gICAgICAgIGRyYXduLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBPdXIgZXhhbXBsZSBjYXJkIHVzZXMgY2hyb21ha2V5IHNvIGRvZXMgbm90IGhhdmUgdG8gYWRkcmVzcyBtb3N0IG9mIHRoZQotICAgICAgICBjbGlwcGluZy4gIFdlIHdpbGwgYWRkIGEgdmlkZW9fd2luZG93IHN0cnVjdHVyZSB0byBvdXIgZ2xvYmFsIHZhcmlhYmxlcyB0bwotICAgICAgICByZW1lbWJlciBvdXIgcGFyYW1ldGVycywgYXMgd2UgZGlkIHdpdGggdGhlIGZyYW1lIGJ1ZmZlci4KLSAgPC9wYXJhPgotICA8cHJvZ3JhbWxpc3Rpbmc+Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DR1dJTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoYXJnLCAmYW1wO2NhcHR1cmVfd2luLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FwdHVyZV93aW4pKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGNhc2UgVklESU9DU1dJTjoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlkZW9fd2luZG93IHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmYW1wO3YsIGFyZywgc2l6ZW9mKHYpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2LndpZHRoICZndDsgNjQwIHx8IHYuaGVpZ2h0ICZndDsgNDgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYud2lkdGggJmx0OyAxNiB8fCB2LmhlaWdodCAmbHQ7IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlX3NldF9rZXkodi5jaHJvbWFrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfc2V0X3dpbmRvdyh2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmYW1wO2NhcHR1cmVfd2luLCAmYW1wO3YsIHNpemVvZih2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlX3cgPSB2LndpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV9oID0gdi5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLSAgICAgICAgQmVjYXVzZSB3ZSBhcmUgdXNpbmcgQ2hyb21ha2V5IG91ciBzZXR1cCBpcyBmYWlybHkgc2ltcGxlLiBNb3N0bHkgd2UgaGF2ZSB0bwotICAgICAgICBjaGVjayB0aGUgdmFsdWVzIGFyZSBzYW5lIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgY2FwdHVyZSBjYXJkLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotICAgICAgICBXaXRoIGFsbCB0aGUgc2V0dXAgZG9uZSB3ZSBjYW4gbm93IHR1cm4gb24gdGhlIGFjdHVhbCBjYXB0dXJlL292ZXJsYXkuIFRoaXMKLSAgICAgICAgaXMgZG9uZSB3aXRoIHRoZSBWSURJT0NDQVBUVVJFIGlvY3RsLiBUaGlzIHRha2VzIGEgc2luZ2xlIGludGVnZXIgYXJndW1lbnQKLSAgICAgICAgd2hlcmUgMCBpcyBvbiBhbmQgMSBpcyBvZmYuCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLSAgICAgICAgICAgICAgICBjYXNlIFZJRElPQ0NBUFRVUkU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihnZXRfdXNlcih2LCAoaW50ICopYXJnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih2PT0wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZV9jYXB0dXJlX29mZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjYXB0dXJlX2ZiLndpZHRoID09IDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjYXB0dXJlX3cgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVfY2FwdHVyZV9vbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgPC9wcm9ncmFtbGlzdGluZz4KLSAgPHBhcmE+Ci0gICAgICAgIFdlIGdyYWIgdGhlIGZsYWcgZnJvbSB1c2VyIHNwYWNlIGFuZCBlaXRoZXIgZW5hYmxlIG9yIGRpc2FibGUgYWNjb3JkaW5nIHRvCi0gICAgICAgIGl0cyB2YWx1ZS4gVGhlcmUgaXMgb25lIHNtYWxsIGNvcm5lciBjYXNlIHdlIGhhdmUgdG8gY29uc2lkZXIgaGVyZS4gU3VwcG9zZQotICAgICAgICB0aGF0IHRoZSBjYXB0dXJlIHdhcyByZXF1ZXN0ZWQgYmVmb3JlIHRoZSB2aWRlbyB3aW5kb3cgb3IgdGhlIGZyYW1lIGJ1ZmZlcgotICAgICAgICBoYWQgYmVlbiBzZXQgdXAuIEluIHRob3NlIGNhc2VzIHRoZXJlIHdpbGwgYmUgdW5jb25maWd1cmVkIGZpZWxkcyBpbiBvdXIKLSAgICAgICAgY2FyZCBkYXRhLCBhcyB3ZWxsIGFzIHVuY29uZmlndXJlZCBoYXJkd2FyZSBzZXR0aW5ncy4gV2UgY2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQKLSAgICAgICAgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBmcmFtZSBidWZmZXIgb3IgdGhlIGNhcHR1cmUgd2luZG93IHdpZHRoIGlzIHplcm8uCi0gIDwvcGFyYT4KLSAgPHByb2dyYW1saXN0aW5nPgotCi0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9JT0NUTENNRDsKLSAgICAgICAgfQotfQotICA8L3Byb2dyYW1saXN0aW5nPgotICA8cGFyYT4KLQotICAgICAgICBXZSBkb24ndCBuZWVkIHRvIHN1cHBvcnQgYW55IG90aGVyIGlvY3Rscywgc28gaWYgd2UgZ2V0IHRoaXMgZmFyLCBpdCBpcyB0aW1lCi0gICAgICAgIHRvIHRlbGwgdGhlIHZpZGVvIGxheWVyIHRoYXQgd2UgZG9uJ3Qgbm93IHdoYXQgdGhlIHVzZXIgaXMgdGFsa2luZyBhYm91dC4KLSAgPC9wYXJhPgotICA8L3NlY3QxPgotICA8c2VjdDEgaWQ9ImVuZHZpZCI+Ci0gIDx0aXRsZT5PdGhlciBGdW5jdGlvbmFsaXR5PC90aXRsZT4KLSAgPHBhcmE+Ci0gICAgICAgIFRoZSBWaWRlbzRMaW51eCBsYXllciBzdXBwb3J0cyBhZGRpdGlvbmFsIGZlYXR1cmVzLCBpbmNsdWRpbmcgYSBoaWdoCi0gICAgICAgIHBlcmZvcm1hbmNlIG1tYXAoKSBiYXNlZCBjYXB0dXJlIG1vZGUgYW5kIGNhcHR1cmluZyBwYXJ0IG9mIHRoZSBpbWFnZS4gCi0gICAgICAgIFRoZXNlIGZlYXR1cmVzIGFyZSBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoZSBib29rLiAgWW91IHNob3VsZCBob3dldmVyIGhhdmUgZW5vdWdoIAotICAgICAgICBleGFtcGxlIGNvZGUgdG8gaW1wbGVtZW50IG1vc3Qgc2ltcGxlIHZpZGVvNGxpbnV4IGRldmljZXMgZm9yIHJhZGlvIGFuZCBUVgotICAgICAgICBjYXJkcy4KLSAgPC9wYXJhPgotICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0gIDxjaGFwdGVyIGlkPSJidWdzIj4KLSAgICAgPHRpdGxlPktub3duIEJ1Z3MgQW5kIEFzc3VtcHRpb25zPC90aXRsZT4KLSAgPHBhcmE+Ci0gIDx2YXJpYWJsZWxpc3Q+Ci0gICAgPHZhcmxpc3RlbnRyeT48dGVybT5NdWx0aXBsZSBPcGVuczwvdGVybT4KLSAgICA8bGlzdGl0ZW0+Ci0gICAgPHBhcmE+Ci0gICAgICAgIFRoZSBkcml2ZXIgYXNzdW1lcyBtdWx0aXBsZSBvcGVucyBzaG91bGQgbm90IGJlIGFsbG93ZWQuIEEgZHJpdmVyCi0gICAgICAgIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ1dCBub3QgY2xlYW5seS4KLSAgICA8L3BhcmE+Ci0gICAgPC9saXN0aXRlbT48L3Zhcmxpc3RlbnRyeT4KLQotICAgIDx2YXJsaXN0ZW50cnk+PHRlcm0+QVBJIERlZmljaWVuY2llczwvdGVybT4KLSAgICA8bGlzdGl0ZW0+Ci0gICAgPHBhcmE+Ci0gICAgICAgIFRoZSBleGlzdGluZyBBUEkgcG9vcmx5IHJlZmxlY3RzIGNvbXByZXNzaW9uIGNhcGFibGUgZGV2aWNlcy4gVGhlcmUKLSAgICAgICAgYXJlIHBsYW5zIGFmb290IHRvIG1lcmdlIFY0TCwgVjRMMiBhbmQgc29tZSBvdGhlciBpZGVhcyBpbnRvIGEKLSAgICAgICAgYmV0dGVyIGludGVyZmFjZS4KLSAgICA8L3BhcmE+Ci0gICAgPC9saXN0aXRlbT48L3Zhcmxpc3RlbnRyeT4KLSAgPC92YXJpYWJsZWxpc3Q+Ci0KLSAgPC9wYXJhPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InB1YmZ1bmN0aW9ucyI+Ci0gICAgIDx0aXRsZT5QdWJsaWMgRnVuY3Rpb25zIFByb3ZpZGVkPC90aXRsZT4KLSFFZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCi0gIDwvY2hhcHRlcj4KLQotPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9IT1dUTyBiL0RvY3VtZW50YXRpb24vSE9XVE8KaW5kZXggYzIzNzFjNS4uODQ5NWZjOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9IT1dUTworKysgYi9Eb2N1bWVudGF0aW9uL0hPV1RPCkBAIC03Nyw3ICs3Nyw4IEBACiBXaGVuIGEga2VybmVsIGNoYW5nZSBjYXVzZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSBrZXJuZWwgZXhwb3NlcyB0bwogdXNlcnNwYWNlIHRvIGNoYW5nZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3Ugc2VuZCB0aGUgaW5mb3JtYXRpb24gb3IKIGEgcGF0Y2ggdG8gdGhlIG1hbnVhbCBwYWdlcyBleHBsYWluaW5nIHRoZSBjaGFuZ2UgdG8gdGhlIG1hbnVhbCBwYWdlcwotbWFpbnRhaW5lciBhdCBtdGsubWFucGFnZXNAZ21haWwuY29tLgorbWFpbnRhaW5lciBhdCBtdGsubWFucGFnZXNAZ21haWwuY29tLCBhbmQgQ0MgdGhlIGxpc3QKK2xpbnV4LWFwaUB2Z2VyLmtlcm5lbC5vcmcuCiAKIEhlcmUgaXMgYSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlIGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgdGhhdCBhcmUKIHJlcXVpcmVkIHJlYWRpbmc6CkBAIC0xMTEsNyArMTEyLDcgQEAKIAogICAgIE90aGVyIGV4Y2VsbGVudCBkZXNjcmlwdGlvbnMgb2YgaG93IHRvIGNyZWF0ZSBwYXRjaGVzIHByb3Blcmx5IGFyZToKIAkiVGhlIFBlcmZlY3QgUGF0Y2giCi0JCWh0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzL3N0dWZmL3RwcC50eHQKKwkJaHR0cDovL3VzZXJ3ZWIua2VybmVsLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0CiAJIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdCIKIAkJaHR0cDovL2xpbnV4Lnl5ei51cy9wYXRjaC1mb3JtYXQuaHRtbAogCkBAIC02MTksNyArNjIwLDcgQEAKIEZvciBtb3JlIGRldGFpbHMgb24gd2hhdCB0aGlzIHNob3VsZCBhbGwgbG9vayBsaWtlLCBwbGVhc2Ugc2VlIHRoZQogQ2hhbmdlTG9nIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50OgogICAiVGhlIFBlcmZlY3QgUGF0Y2giCi0gICAgICBodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0CisgICAgICBodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CmluZGV4IGNmNTU2MmMuLjZlMjUzNDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dApAQCAtMjEwLDcgKzIxMCw3IEBACiAJCW51bWJlciBvZiB1cGRhdGVzIHBlciBncmFjZSBwZXJpb2QuCiAKIDkuCUFsbCBSQ1UgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlcywgd2hpY2ggaW5jbHVkZQotCXJjdV9kZXJlZmVyZW5jZSgpLCBsaXN0X2Zvcl9lYWNoX3JjdSgpLCBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgpLAorCXJjdV9kZXJlZmVyZW5jZSgpLCBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgpLAogCWxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KCksIGFuZCBsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1KCksCiAJbXVzdCBiZSBlaXRoZXIgd2l0aGluIGFuIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiBvcgogCW11c3QgYmUgcHJvdGVjdGVkIGJ5IGFwcHJvcHJpYXRlIHVwZGF0ZS1zaWRlIGxvY2tzLiAgUkNVCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1cmVmLnR4dAppbmRleCA0NTFkZTJhLi40MjAyYWQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3VyZWYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3JjdXJlZi50eHQKQEAgLTI5LDkgKzI5LDkgQEAKIAkJCQkJfQogCiBJZiB0aGlzIGxpc3QvYXJyYXkgaXMgbWFkZSBsb2NrIGZyZWUgdXNpbmcgUkNVIGFzIGluIGNoYW5naW5nIHRoZQotd3JpdGVfbG9jaygpIGluIGFkZCgpIGFuZCBkZWxldGUoKSB0byBzcGluX2xvY2sgYW5kIGNoYW5naW5nIHJlYWRfbG9jawotaW4gc2VhcmNoX2FuZF9yZWZlcmVuY2UgdG8gcmN1X3JlYWRfbG9jaygpLCB0aGUgYXRvbWljX2dldCBpbgotc2VhcmNoX2FuZF9yZWZlcmVuY2UgY291bGQgcG90ZW50aWFsbHkgaG9sZCByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCB3aGljaAord3JpdGVfbG9jaygpIGluIGFkZCgpIGFuZCBkZWxldGUoKSB0byBzcGluX2xvY2soKSBhbmQgY2hhbmdpbmcgcmVhZF9sb2NrKCkKK2luIHNlYXJjaF9hbmRfcmVmZXJlbmNlKCkgdG8gcmN1X3JlYWRfbG9jaygpLCB0aGUgYXRvbWljX2luYygpIGluCitzZWFyY2hfYW5kX3JlZmVyZW5jZSgpIGNvdWxkIHBvdGVudGlhbGx5IGhvbGQgcmVmZXJlbmNlIHRvIGFuIGVsZW1lbnQgd2hpY2gKIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBsaXN0L2FycmF5LiAgVXNlIGF0b21pY19pbmNfbm90X3plcm8oKQogaW4gdGhpcyBzY2VuYXJpbyBhcyBmb2xsb3dzOgogCkBAIC00MCwyMCArNDAsMjAgQEAKIHsJCQkJCXsKICAgICBhbGxvY19vYmplY3QJCQkgICAgcmN1X3JlYWRfbG9jaygpOwogICAgIC4uLgkJCQkJICAgIHNlYXJjaF9mb3JfZWxlbWVudAotICAgIGF0b21pY19zZXQoJmVsLT5yYywgMSk7CQkgICAgaWYgKGF0b21pY19pbmNfbm90X3plcm8oJmVsLT5yYykpIHsKLSAgICB3cml0ZV9sb2NrKCZsaXN0X2xvY2spOwkJICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKKyAgICBhdG9taWNfc2V0KCZlbC0+cmMsIDEpOwkJICAgIGlmICghYXRvbWljX2luY19ub3RfemVybygmZWwtPnJjKSkgeworICAgIHNwaW5fbG9jaygmbGlzdF9sb2NrKTsJCSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJCSAgICAgICAgcmV0dXJuIEZBSUw7CiAgICAgYWRkX2VsZW1lbnQJCQkJICAgIH0KICAgICAuLi4JCQkJCSAgICAuLi4KLSAgICB3cml0ZV91bmxvY2soJmxpc3RfbG9jayk7CQkgICAgcmN1X3JlYWRfdW5sb2NrKCk7CisgICAgc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CQkgICAgcmN1X3JlYWRfdW5sb2NrKCk7CiB9CQkJCQl9CiAzLgkJCQkJNC4KIHJlbGVhc2VfcmVmZXJlbmNlZCgpCQkJZGVsZXRlKCkKIHsJCQkJCXsKLSAgICAuLi4JCQkJCSAgICB3cml0ZV9sb2NrKCZsaXN0X2xvY2spOworICAgIC4uLgkJCQkJICAgIHNwaW5fbG9jaygmbGlzdF9sb2NrKTsKICAgICBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZWwtPnJjKSkgICAgICAgLi4uCiAgICAgICAgIGNhbGxfcmN1KCZlbC0+aGVhZCwgZWxfZnJlZSk7ICAgICAgIGRlbGV0ZV9lbGVtZW50Ci0gICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3VubG9jaygmbGlzdF9sb2NrKTsKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CiB9IAkJCQkJICAgIC4uLgogCQkJCQkgICAgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVsLT5yYykpCiAJCQkJCSAgICAgICAgY2FsbF9yY3UoJmVsLT5oZWFkLCBlbF9mcmVlKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0CmluZGV4IGUwNGQ2NDMuLjk2MTcwODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dApAQCAtNzg2LDggKzc4Niw2IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UKIAotCWxpc3RfZm9yX2VhY2hfcmN1CQkodG8gYmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZgotCQkJCQkgbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UpCiAJbGlzdF9mb3JfZWFjaF9jb250aW51ZV9yY3UJKHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgbmV3CiAJCQkJCSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JjdSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TQUsudHh0IGIvRG9jdW1lbnRhdGlvbi9TQUsudHh0CmluZGV4IGI5MDE5Y2EuLjc0YmUxNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU0FLLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1NBSy50eHQKQEAgLTEsNSArMSw1IEBACiBMaW51eCAyLjQuMiBTZWN1cmUgQXR0ZW50aW9uIEtleSAoU0FLKSBoYW5kbGluZwotMTggTWFyY2ggMjAwMSwgQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4KKzE4IE1hcmNoIDIwMDEsIEFuZHJldyBNb3J0b24KIAogQW4gb3BlcmF0aW5nIHN5c3RlbSdzIFNlY3VyZSBBdHRlbnRpb24gS2V5IGlzIGEgc2VjdXJpdHkgdG9vbCB3aGljaCBpcwogcHJvdmlkZWQgYXMgcHJvdGVjdGlvbiBhZ2FpbnN0IHRyb2phbiBwYXNzd29yZCBjYXB0dXJpbmcgcHJvZ3JhbXMuICBJdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TRUxpbnV4LnR4dCBiL0RvY3VtZW50YXRpb24vU0VMaW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlYWUwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1NFTGludXgudHh0CkBAIC0wLDAgKzEsMjcgQEAKK0lmIHlvdSB3YW50IHRvIHVzZSBTRUxpbnV4LCBjaGFuY2VzIGFyZSB5b3Ugd2lsbCB3YW50Cit0byB1c2UgdGhlIGRpc3Ryby1wcm92aWRlZCBwb2xpY2llcywgb3IgaW5zdGFsbCB0aGUKK2xhdGVzdCByZWZlcmVuY2UgcG9saWN5IHJlbGVhc2UgZnJvbQorCWh0dHA6Ly9vc3MudHJlc3lzLmNvbS9wcm9qZWN0cy9yZWZwb2xpY3kKKworSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBhIGR1bW15IHBvbGljeSBmb3IKK3Rlc3RpbmcsIHlvdSBjYW4gZG8gdXNpbmcgJ21kcCcgcHJvdmlkZWQgdW5kZXIKK3NjcmlwdHMvc2VsaW51eC4gIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBzZWxpbnV4Cit1c2Vyc3BhY2UgdG8gYmUgaW5zdGFsbGVkIC0gaW4gcGFydGljdWxhciB5b3Ugd2lsbAorbmVlZCBjaGVja3BvbGljeSB0byBjb21waWxlIGEga2VybmVsLCBhbmQgc2V0ZmlsZXMgYW5kCitmaXhmaWxlcyB0byBsYWJlbCB0aGUgZmlsZXN5c3RlbS4KKworCTEuIENvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIHNlbGludXggZW5hYmxlZC4KKwkyLiBUeXBlICdtYWtlJyB0byBjb21waWxlIG1kcC4KKwkzLiBNYWtlIHN1cmUgdGhhdCB5b3UgYXJlIG5vdCBydW5uaW5nIHdpdGgKKwkgICBTRUxpbnV4IGVuYWJsZWQgYW5kIGEgcmVhbCBwb2xpY3kuICBJZgorCSAgIHlvdSBhcmUsIHJlYm9vdCB3aXRoIHNlbGludXggZGlzYWJsZWQKKwkgICBiZWZvcmUgY29udGludWluZy4KKwk0LiBSdW4gaW5zdGFsbF9wb2xpY3kuc2g6CisJCWNkIHNjcmlwdHMvc2VsaW51eAorCQlzaCBpbnN0YWxsX3BvbGljeS5zaAorCitTdGVwIDQgd2lsbCBjcmVhdGUgYSBuZXcgZHVtbXkgcG9saWN5IHZhbGlkIGZvciB5b3VyCitrZXJuZWwsIHdpdGggYSBzaW5nbGUgc2VsaW51eCB1c2VyLCByb2xlLCBhbmQgdHlwZS4KK0l0IHdpbGwgY29tcGlsZSB0aGUgcG9saWN5LCB3aWxsIHNldCB5b3VyIFNFTElOVVhUWVBFIHRvCitkdW1teSBpbiAvZXRjL3NlbGludXgvY29uZmlnLCBpbnN0YWxsIHRoZSBjb21waWxlZCBwb2xpY3kKK2FzICdkdW1teScsIGFuZCByZWxhYmVsIHlvdXIgZmlsZXN5c3RlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0IGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKaW5kZXggZGExMGUwNy4uYWM1ZTBiMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKQEAgLTY3LDYgKzY3LDggQEAKIAogMTk6IEFsbCBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9BQkkvLgogICAgIFNlZSBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgUGF0Y2hlcyB0aGF0IGNoYW5nZSB1c2Vyc3BhY2UgaW50ZXJmYWNlcyBzaG91bGQgYmUgQ0NlZCB0bworICAgIGxpbnV4LWFwaUB2Z2VyLmtlcm5lbC5vcmcuCiAKIDIwOiBDaGVjayB0aGF0IGl0IGFsbCBwYXNzZXMgYG1ha2UgaGVhZGVyc19jaGVjaycuCiAKQEAgLTgzLDMgKzg1LDYgQEAKIDIzOiBUZXN0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIC1tbSBwYXRjaHNldCB0byBtYWtlIHN1cmUKICAgICB0aGF0IGl0IHN0aWxsIHdvcmtzIHdpdGggYWxsIG9mIHRoZSBvdGhlciBxdWV1ZWQgcGF0Y2hlcyBhbmQgdmFyaW91cwogICAgIGNoYW5nZXMgaW4gdGhlIFZNLCBWRlMsIGFuZCBvdGhlciBzdWJzeXN0ZW1zLgorCisyNDogQWxsIG1lbW9yeSBiYXJyaWVycyB7ZS5nLiwgYmFycmllcigpLCBybWIoKSwgd21iKCl9IG5lZWQgYSBjb21tZW50IGluIHRoZQorICAgIHNvdXJjZSBjb2RlIHRoYXQgZXhwbGFpbnMgdGhlIGxvZ2ljIG9mIHdoYXQgdGhleSBhcmUgZG9pbmcgYW5kIHdoeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCmluZGV4IDI0ZjJlYjQuLjk5ZTcyYTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwpAQCAtNDEsNyArNDEsNyBAQAogTGludXggMi42OgogCVRoZSBzYW1lIHJ1bGVzIGFwcGx5IGFzIDIuNCBleGNlcHQgdGhhdCB5b3Ugc2hvdWxkIGZvbGxvdyBsaW51eC1rZXJuZWwKIAl0byB0cmFjayBjaGFuZ2VzIGluIEFQSSdzLiBUaGUgZmluYWwgY29udGFjdCBwb2ludCBmb3IgTGludXggMi42Ci0Jc3VibWlzc2lvbnMgaXMgQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4uCisJc3VibWlzc2lvbnMgaXMgQW5kcmV3IE1vcnRvbi4KIAogV2hhdCBDcml0ZXJpYSBEZXRlcm1pbmUgQWNjZXB0YW5jZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggZjc5YWQ5Zi4uZjMwOWQzYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC03Nyw3ICs3Nyw3IEBACiBodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdAogCiBBbmRyZXcgTW9ydG9uJ3MgcGF0Y2ggc2NyaXB0czoKLWh0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzLworaHR0cDovL3VzZXJ3ZWIua2VybmVsLm9yZy9+YWtwbS9zdHVmZi9wYXRjaC1zY3JpcHRzLnRhci5negogSW5zdGVhZCBvZiB0aGVzZSBzY3JpcHRzLCBxdWlsdCBpcyB0aGUgcmVjb21tZW5kZWQgcGF0Y2ggbWFuYWdlbWVudAogdG9vbCAoc2VlIGFib3ZlKS4KIApAQCAtNDA1LDcgKzQwNSw3IEBACiBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhlIGRpc2N1c3Npb24KIAogCi0xNCkgVXNpbmcgVGVzdC1ieTogYW5kIFJldmlld2VkLWJ5OgorMTQpIFVzaW5nIFRlc3RlZC1ieTogYW5kIFJldmlld2VkLWJ5OgogCiBBIFRlc3RlZC1ieTogdGFnIGluZGljYXRlcyB0aGF0IHRoZSBwYXRjaCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVzdGVkIChpbgogc29tZSBlbnZpcm9ubWVudCkgYnkgdGhlIHBlcnNvbiBuYW1lZC4gIFRoaXMgdGFnIGluZm9ybXMgbWFpbnRhaW5lcnMgdGhhdApAQCAtNjUzLDcgKzY1Myw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEFuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCi0gIDxodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9zdHVmZi90cHAudHh0PgorICA8aHR0cDovL3VzZXJ3ZWIua2VybmVsLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0PgogCiBKZWZmIEdhcnppaywgIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdCIuCiAgIDxodHRwOi8vbGludXgueXl6LnVzL3BhdGNoLWZvcm1hdC5odG1sPgpAQCAtNjcyLDQgKzY3Miw5IEBACiAKIExpbnVzIFRvcnZhbGRzJ3MgbWFpbCBvbiB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdDoKICAgPGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDUvNC83LzE4Mz4KKworQW5kaSBLbGVlbiwgIk9uIHN1Ym1pdHRpbmcga2VybmVsIHBhdGNoZXMiCisgIFNvbWUgc3RyYXRlZ2llcyB0byBnZXQgZGlmZmljdWx0IG9yIGNvbnRyb3ZlcnNhbCBjaGFuZ2VzIGluLgorICBodHRwOi8vaGFsb2JhdGVzLmRlL29uLXN1Ym1pdHRpbmctcGF0Y2hlcy5wZGYKKwogLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4va2dkYi50eHQgYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluL2tnZGIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGY2YTQ4NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2JsYWNrZmluL2tnZGIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLQkJCUEgU2ltcGxlIEd1aWRlIHRvIENvbmZpZ3VyZSBLR0RCCi0KLQkJCVNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPgotCQkJCUF1Zy4gMjR0aCAyMDA2Ci0KLQotVGhpcyBLR0RCIHBhdGNoIGVuYWJsZXMgdGhlIGtlcm5lbCBkZXZlbG9wZXIgdG8gZG8gc291cmNlIGxldmVsIGRlYnVnZ2luZyBvbgotdGhlIGtlcm5lbCBmb3IgdGhlIEJsYWNrZmluIGFyY2hpdGVjdHVyZS4gIFRoZSBkZWJ1Z2dpbmcgd29ya3Mgb3ZlciBlaXRoZXIgdGhlCi1ldGhlcm5ldCBpbnRlcmZhY2Ugb3Igb25lIG9mIHRoZSB1YXJ0cy4gIEJvdGggc29mdHdhcmUgYnJlYWtwb2ludHMgYW5kCi1oYXJkd2FyZSBicmVha3BvaW50cyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbi4KLWh0dHA6Ly9kb2NzLmJsYWNrZmluLnVjbGludXgub3JnL2Rva3UucGhwP2lkPWtnZGIKLQotCi0yIGtub3duIGlzc3VlczoKLTEuIFRoaXMgYnVnOgotICAgICAgIGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy90cmFja2VyL2luZGV4LnBocD9mdW5jPWRldGFpbCZhaWQ9NTQ0Jmdyb3VwX2lkPTE4JmF0aWQ9MTQ1Ci0gICBUaGUgR0RCIGNsaWVudCBmb3IgQmxhY2tmaW4gdUNsaW51eCBjYXVzZXMgaW5jb3JyZWN0IHZhbHVlcyBvZiBsb2NhbAotICAgdmFyaWFibGVzIHRvIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIGJyZWFrcyB0aGUgcnVubmluZyBvZiBrZXJuZWwgaW4gR0RCLgotMi4gQmVjYXVzZSBvZiBhIGhhcmR3YXJlIGJ1ZyBpbiBCbGFja2ZpbiA1MzMgdjEuMC4zOgotICAgICAgIDA1MDAwMDY3IC0gV2F0Y2hwb2ludHMgKEhhcmR3YXJlIEJyZWFrcG9pbnRzKSBhcmUgbm90IHN1cHBvcnRlZAotICAgSGFyZHdhcmUgYnJlYWtwb2ludHMgY2Fubm90IGJlIHNldCBwcm9wZXJseS4KLQotCi1EZWJ1ZyBvdmVyIEV0aGVybmV0OgotIAotMS4gQ29tcGlsZSBhbmQgaW5zdGFsbCB0aGUgY3Jvc3MgcGxhdGZvcm0gdmVyc2lvbiBvZiBnZGIgZm9yIGJsYWNrZmluLCB3aGljaAotICAgY2FuIGJlIGZvdW5kIGF0ICQoQklOUk9PVCkvYmZpbi1lbGYtZ2RiLgotCi0yLiBBcHBseSB0aGlzIHBhdGNoIHRvIHRoZSAyLjYueCBrZXJuZWwuICBTZWxlY3QgdGhlIG1lbnVjb25maWcgb3B0aW9uIHVuZGVyCi0gICAiS2VybmVsIGhhY2tpbmciIC0+ICJLZXJuZWwgZGVidWdnaW5nIiAtPiAiS0dEQjoga2VybmVsIGRlYnVnIHdpdGggcmVtb3RlIGdkYiIuCi0gICBXaXRoIHRoaXMgc2VsZWN0ZWQsIG9wdGlvbiAiRnVsbCBTeW1ib2xpYy9Tb3VyY2UgRGVidWdnaW5nIHN1cHBvcnQiIGFuZCAKLSAgICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBmcmFtZSBwb2ludGVycyIgYXJlIGFsc28gc2VsZWN0ZWQuCi0KLTMuIFNlbGVjdCBvcHRpb24gIktHREI6IGNvbm5lY3Qgb3ZlciAoRXRoZXJuZXQpIi4gIEFkZCAia2dkYm9lPUB0YXJnZXQtSVAvLEBob3N0LUlQLyIgdG8KLSAgIHRoZSBvcHRpb24gIkNvbXBpbGVkLWluIEtlcm5lbCBCb290IFBhcmFtZXRlciIgdW5kZXIgIktlcm5lbCBoYWNraW5nIi4KLQotNC4gQ29ubmVjdCBtaW5pY29tIHRvIHRoZSBzZXJpYWwgcG9ydCBhbmQgYm9vdCB0aGUga2VybmVsIGltYWdlLgotCi01LiBDb25maWd1cmUgdGhlIElQICIvPiBpZmNvbmZpZyBldGgwIHRhcmdldC1JUCIKLQotNi4gU3RhcnQgR0RCIGNsaWVudCAiYmZpbi1lbGYtZ2RiIHZtbGludXgiLgotCi03LiBDb25uZWN0IHRvIHRoZSB0YXJnZXQgIihnZGIpIHRhcmdldCByZW1vdGUgdWRwOnRhcmdldC1JUDo2NDQzIi4KLQotOC4gU2V0IHNvZnR3YXJlIGJyZWFrcG9pbnQgIihnZGIpIGJyZWFrIHN5c19vcGVuIi4KLQotOS4gQ29udGludWUgIihnZGIpIGMiLgotCi0xMC4gUnVuIGxzIGluIHRoZSB0YXJnZXQgY29uc29sZSAiLz4gbHMiLgotCi0xMS4gQnJlYWtwb2ludCBoaXRzLiAiQnJlYWtwb2ludCAxOiBzeXNfb3BlbiguLi4iCi0KLTEyLiBEaXNwbGF5IGxvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb24gcGFyYW10ZXJzLgotICAgICgqKSBUaGlzIG9wZXJhdGlvbiBnaXZlcyB3cm9uZyByZXN1bHRzLCBzZWUga25vd24gaXNzdWUgMS4KLQotMTMuIFNpbmdsZSBzdGVwcGluZyAiKGdkYikgc2kiLgotCi0xNC4gUmVtb3ZlIGJyZWFrcG9pbnQgMS4gIihnZGIpIGRlbCAxIgotCi0xNS4gU2V0IGhhcmR3YXJlIGJyZWFrcG9pbnQgIihnZGIpIGhicmVhayBzeXNfb3BlbiIuCi0KLTE2LiBDb250aW51ZSAiKGdkYikgYyIuCi0KLTE3LiBSdW4gbHMgaW4gdGhlIHRhcmdldCBjb25zb2xlICIvPiBscyIuCi0KLTE4LiBIYXJkd2FyZSBicmVha3BvaW50IGhpdHMuICJCcmVha3BvaW50IDE6IHN5c19vcGVuKC4uLiIuCi0gICAgKCopIFRoaXMgaGFyZHdhcmUgYnJlYWtwb2ludCB3aWxsIG5vdCBiZSBoaXQsIHNlZSBrbm93biBpc3N1ZSAyLgotCi0xOS4gQ29udGludWUgIihnZGIpIGMiLgotCi0yMC4gSW50ZXJydXB0IHRoZSB0YXJnZXQgaW4gR0RCICJDdHJsK0MiLgotCi0yMS4gRGV0YWNoIGZyb20gdGhlIHRhcmdldCAiKGdkYikgZGV0YWNoIi4KLQotMjIuIEV4aXQgR0RCICIoZ2RiKSBxdWl0Ii4KLQotCi1EZWJ1ZyBvdmVyIHRoZSBVQVJUOgotCi0xLiBDb21waWxlIGFuZCBpbnN0YWxsIHRoZSBjcm9zcyBwbGF0Zm9ybSB2ZXJzaW9uIG9mIGdkYiBmb3IgYmxhY2tmaW4sIHdoaWNoCi0gICBjYW4gYmUgZm91bmQgYXQgJChCSU5ST09UKS9iZmluLWVsZi1nZGIuCi0KLTIuIEFwcGx5IHRoaXMgcGF0Y2ggdG8gdGhlIDIuNi54IGtlcm5lbC4gIFNlbGVjdCB0aGUgbWVudWNvbmZpZyBvcHRpb24gdW5kZXIKLSAgICJLZXJuZWwgaGFja2luZyIgLT4gIktlcm5lbCBkZWJ1Z2dpbmciIC0+ICJLR0RCOiBrZXJuZWwgZGVidWcgd2l0aCByZW1vdGUgZ2RiIi4KLSAgIFdpdGggdGhpcyBzZWxlY3RlZCwgb3B0aW9uICJGdWxsIFN5bWJvbGljL1NvdXJjZSBEZWJ1Z2dpbmcgc3VwcG9ydCIgYW5kIAotICAgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHBvaW50ZXJzIiBhcmUgYWxzbyBzZWxlY3RlZC4KLQotMy4gU2VsZWN0IG9wdGlvbiAiS0dEQjogY29ubmVjdCBvdmVyIChVQVJUKSIuICBTZXQgIktHREI6IFVBUlQgcG9ydCBudW1iZXIiIHRvIGJlCi0gICBhIGRpZmZlcmVudCBvbmUgZnJvbSB0aGUgY29uc29sZS4gIERvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIG1vZGUgb2YKLSAgIGJsYWNrZmluIHNlcmlhbCBkcml2ZXIgdG8gUElPLiAgT3RoZXJ3aXNlIGtnZGIgd29ya3MgaW5jb3JyZWN0bHkgb24gVUFSVC4KLSAKLTQuIElmIHlvdSB3YW50IGNvbm5lY3QgdG8ga2dkYiB3aGVuIHRoZSBrZXJuZWwgYm9vdHMsIGVuYWJsZQotICAgIktHREI6IFdhaXQgZm9yIGdkYiBjb25uZWN0aW9uIGVhcmx5IiAKLQotNS4gQ29tcGlsZSBrZXJuZWwuCi0KLTYuIENvbm5lY3QgbWluaWNvbSB0byB0aGUgc2VyaWFsIHBvcnQgb2YgdGhlIGNvbnNvbGUgYW5kIGJvb3QgdGhlIGtlcm5lbCBpbWFnZS4KLQotNy4gU3RhcnQgR0RCIGNsaWVudCAiYmZpbi1lbGYtZ2RiIHZtbGludXgiLgotCi04LiBTZXQgdGhlIGJhdWQgcmF0ZSBpbiBHREIgIihnZGIpIHNldCByZW1vdGViYXVkIDU3NjAwIi4KLQotOS4gQ29ubmVjdCB0byB0aGUgdGFyZ2V0IG9uIHRoZSBzZWNvbmQgc2VyaWFsIHBvcnQgIihnZGIpIHRhcmdldCByZW1vdGUgL2Rldi90dHlTMSIuCi0KLTEwLiBTZXQgc29mdHdhcmUgYnJlYWtwb2ludCAiKGdkYikgYnJlYWsgc3lzX29wZW4iLgotCi0xMS4gQ29udGludWUgIihnZGIpIGMiLiAKLQotMTIuIFJ1biBscyBpbiB0aGUgdGFyZ2V0IGNvbnNvbGUgIi8+IGxzIi4gCi0KLTEzLiBBIGJyZWFrcG9pbnQgaXMgaGl0LiAiQnJlYWtwb2ludCAxOiBzeXNfb3BlbiguLi4iCi0KLTE0LiBBbGwgb3RoZXIgb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgdGhhdCBpbiBLR0RCIG92ZXIgRXRoZXJuZXQuIAotCi0KLURlYnVnIG92ZXIgdGhlIHNhbWUgVUFSVCBhcyBjb25zb2xlOgotCi0xLiBDb21waWxlIGFuZCBpbnN0YWxsIHRoZSBjcm9zcyBwbGF0Zm9ybSB2ZXJzaW9uIG9mIGdkYiBmb3IgYmxhY2tmaW4sIHdoaWNoCi0gICBjYW4gYmUgZm91bmQgYXQgJChCSU5ST09UKS9iZmluLWVsZi1nZGIuCi0KLTIuIEFwcGx5IHRoaXMgcGF0Y2ggdG8gdGhlIDIuNi54IGtlcm5lbC4gIFNlbGVjdCB0aGUgbWVudWNvbmZpZyBvcHRpb24gdW5kZXIKLSAgICJLZXJuZWwgaGFja2luZyIgLT4gIktlcm5lbCBkZWJ1Z2dpbmciIC0+ICJLR0RCOiBrZXJuZWwgZGVidWcgd2l0aCByZW1vdGUgZ2RiIi4KLSAgIFdpdGggdGhpcyBzZWxlY3RlZCwgb3B0aW9uICJGdWxsIFN5bWJvbGljL1NvdXJjZSBEZWJ1Z2dpbmcgc3VwcG9ydCIgYW5kIAotICAgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHBvaW50ZXJzIiBhcmUgYWxzbyBzZWxlY3RlZC4KLQotMy4gU2VsZWN0IG9wdGlvbiAiS0dEQjogY29ubmVjdCBvdmVyIFVBUlQiLiAgU2V0ICJLR0RCOiBVQVJUIHBvcnQgbnVtYmVyIiB0byBjb25zb2xlLgotICAgRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgbW9kZSBvZiBibGFja2ZpbiBzZXJpYWwgZHJpdmVyIHRvIFBJTy4KLSAgIE90aGVyd2lzZSBrZ2RiIHdvcmtzIGluY29ycmVjdGx5IG9uIFVBUlQuCi0gCi00LiBJZiB5b3Ugd2FudCBjb25uZWN0IHRvIGtnZGIgd2hlbiB0aGUga2VybmVsIGJvb3RzLCBlbmFibGUKLSAgICJLR0RCOiBXYWl0IGZvciBnZGIgY29ubmVjdGlvbiBlYXJseSIgCi0KLTUuIENvbm5lY3QgbWluaWNvbSB0byB0aGUgc2VyaWFsIHBvcnQgYW5kIGJvb3QgdGhlIGtlcm5lbCBpbWFnZS4gCi0KLTYuIChPcHRpb25hbCkgQXNrIHRhcmdldCB0byB3YWl0IGZvciBnZGIgY29ubmVjdGlvbiBieSBlbnRlcmluZyBDdHJsK0EuIEluIG1pbmljb20sIHlvdSBzaG91bGQgZW50ZXIgQ3RybCtBK0EuCi0KLTcuIFN0YXJ0IEdEQiBjbGllbnQgImJmaW4tZWxmLWdkYiB2bWxpbnV4Ii4KLQotOC4gU2V0IHRoZSBiYXVkIHJhdGUgaW4gR0RCICIoZ2RiKSBzZXQgcmVtb3RlYmF1ZCA1NzYwMCIuCi0KLTkuIENvbm5lY3QgdG8gdGhlIHRhcmdldCAiKGdkYikgdGFyZ2V0IHJlbW90ZSAvZGV2L3R0eVMwIi4KLQotMTAuIFNldCBzb2Z0d2FyZSBicmVha3BvaW50ICIoZ2RiKSBicmVhayBzeXNfb3BlbiIuCi0KLTExLiBDb250aW51ZSAiKGdkYikgYyIuIFRoZW4gZW50ZXIgQ3RybCtDIHR3aWNlIHRvIHN0b3AgR0RCIGNvbm5lY3Rpb24uCi0KLTEyLiBSdW4gbHMgaW4gdGhlIHRhcmdldCBjb25zb2xlICIvPiBscyIuIER1bW15IHN0cmluZyBjYW4gYmUgc2VlbiBvbiB0aGUgY29uc29sZS4KLQotMTMuIFRoZW4gY29ubmVjdCB0aGUgZ2RiIHRvIHRhcmdldCBhZ2Fpbi4gIihnZGIpIHRhcmdldCByZW1vdGUgL2Rldi90dHlTMCIuCi0gICAgTm93IHlvdSB3aWxsIGZpbmQgYSBicmVha3BvaW50IGlzIGhpdC4gIkJyZWFrcG9pbnQgMTogc3lzX29wZW4oLi4uIgotCi0xNC4gQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gS0dEQiBvdmVyIEV0aGVybmV0LiAgVGhlIG9ubHkKLSAgICBkaWZmZXJlbmNlIGlzIHRoYXQgYWZ0ZXIgY29udGludWUgY29tbWFuZCBpbiBHREIsIHBsZWFzZSBzdG9wIEdEQgotICAgIGNvbm5lY3Rpb24gYnkgMiAiQ3RybCtDInMgYW5kIGNvbm5lY3QgYWdhaW4gYWZ0ZXIgYnJlYWtwb2ludHMgYXJlIGhpdCBvcgotICAgIEN0cmwrQSBpcyBlbnRlcmVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9kYXRhLWludGVncml0eS50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2RhdGEtaW50ZWdyaXR5LnR4dAppbmRleCBlOWRjOGQ4Li5lOGNhMDQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL2RhdGEtaW50ZWdyaXR5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2RhdGEtaW50ZWdyaXR5LnR4dApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgICAgICByZXRyaWV2ZSB0aGUgdGFnIGJ1ZmZlciB1c2luZyBiaW9faW50ZWdyaXR5X2dldF90YWcoKS4KIAogCi02LjMgUEFTU0lORyBFWElTVElORyBJTlRFR1JJVFkgTUVUQURBVEEKKzUuMyBQQVNTSU5HIEVYSVNUSU5HIElOVEVHUklUWSBNRVRBREFUQQogCiAgICAgRmlsZXN5c3RlbXMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgdGhlaXIgb3duIGludGVncml0eSBtZXRhZGF0YSBvcgogICAgIGFyZSBjYXBhYmxlIG9mIHRyYW5zZmVycmluZyBJTUQgZnJvbSB1c2VyIHNwYWNlIGNhbiB1c2UgdGhlCkBAIC0yODMsNyArMjgzLDcgQEAKICAgICAgIGludGVncml0eSB1cG9uIGNvbXBsZXRpb24uCiAKIAotNi40IFJFR0lTVEVSSU5HIEEgQkxPQ0sgREVWSUNFIEFTIENBUEFCTEUgT0YgRVhDSEFOR0lORyBJTlRFR1JJVFkKKzUuNCBSRUdJU1RFUklORyBBIEJMT0NLIERFVklDRSBBUyBDQVBBQkxFIE9GIEVYQ0hBTkdJTkcgSU5URUdSSVRZCiAgICAgTUVUQURBVEEKIAogICAgIFRvIGVuYWJsZSBpbnRlZ3JpdHkgZXhjaGFuZ2Ugb24gYSBibG9jayBkZXZpY2UgdGhlIGdlbmRpc2sgbXVzdCBiZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svZGVhZGxpbmUtaW9zY2hlZC50eHQKaW5kZXggYzIzY2FiMS4uNzI1NzY3NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQudHh0CkBAIC0zMCwxMiArMzAsMTggQEAKIFNpbWlsYXIgdG8gcmVhZF9leHBpcmUgbWVudGlvbmVkIGFib3ZlLCBidXQgZm9yIHdyaXRlcy4KIAogCi1maWZvX2JhdGNoCitmaWZvX2JhdGNoCShudW1iZXIgb2YgcmVxdWVzdHMpCiAtLS0tLS0tLS0tCiAKLVdoZW4gYSByZWFkIHJlcXVlc3QgZXhwaXJlcyBpdHMgZGVhZGxpbmUsIHdlIG11c3QgbW92ZSBzb21lIHJlcXVlc3RzIGZyb20KLXRoZSBzb3J0ZWQgaW8gc2NoZWR1bGVyIGxpc3QgdG8gdGhlIGJsb2NrIGRldmljZSBkaXNwYXRjaCBxdWV1ZS4gZmlmb19iYXRjaAotY29udHJvbHMgaG93IG1hbnkgcmVxdWVzdHMgd2UgbW92ZS4KK1JlcXVlc3RzIGFyZSBncm91cGVkIGludG8gYGBiYXRjaGVzJycgb2YgYSBwYXJ0aWN1bGFyIGRhdGEgZGlyZWN0aW9uIChyZWFkIG9yCit3cml0ZSkgd2hpY2ggYXJlIHNlcnZpY2VkIGluIGluY3JlYXNpbmcgc2VjdG9yIG9yZGVyLiAgVG8gbGltaXQgZXh0cmEgc2Vla2luZywKK2RlYWRsaW5lIGV4cGlyaWVzIGFyZSBvbmx5IGNoZWNrZWQgYmV0d2VlbiBiYXRjaGVzLiAgZmlmb19iYXRjaCBjb250cm9scyB0aGUKK21heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHBlciBiYXRjaC4KKworVGhpcyBwYXJhbWV0ZXIgdHVuZXMgdGhlIGJhbGFuY2UgYmV0d2VlbiBwZXItcmVxdWVzdCBsYXRlbmN5IGFuZCBhZ2dyZWdhdGUKK3Rocm91Z2hwdXQuICBXaGVuIGxvdyBsYXRlbmN5IGlzIHRoZSBwcmltYXJ5IGNvbmNlcm4sIHNtYWxsZXIgaXMgYmV0dGVyICh3aGVyZQorYSB2YWx1ZSBvZiAxIHlpZWxkcyBmaXJzdC1jb21lIGZpcnN0LXNlcnZlZCBiZWhhdmlvdXIpLiAgSW5jcmVhc2luZyBmaWZvX2JhdGNoCitnZW5lcmFsbHkgaW1wcm92ZXMgdGhyb3VnaHB1dCwgYXQgdGhlIGNvc3Qgb2YgbGF0ZW5jeSB2YXJpYXRpb24uCiAKIAogd3JpdGVzX3N0YXJ2ZWQJKG51bWJlciBvZiBkaXNwYXRjaGVzKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9pZGUtY2QgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lkZS1jZAppbmRleCA5MWMwZGNjLi4yYzU1OGNkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lkZS1jZAorKysgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lkZS1jZApAQCAtMTQ1LDggKzE0NSw3IEBACiAKIFRvIHBsYXkgYW4gYXVkaW8gQ0QsIHlvdSBzaG91bGQgZmlyc3QgdW5tb3VudCBhbmQgcmVtb3ZlIGFueSBkYXRhCiBDRFJPTS4gIEFueSBvZiB0aGUgQ0RST00gcGxheWVyIHByb2dyYW1zIHNob3VsZCB0aGVuIHdvcmsgKHdvcmttYW4sCi13b3JrYm9uZSwgY2RwbGF5ZXIsIGV0Yy4pLiAgTGFja2luZyBhbnl0aGluZyBlbHNlLCB5b3UgY291bGQgdXNlIHRoZQotY2R0ZXN0ZXIgcHJvZ3JhbSBpbiBEb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkLgord29ya2JvbmUsIGNkcGxheWVyLCBldGMuKS4KIAogT24gYSBmZXcgZHJpdmVzLCB5b3UgY2FuIHJlYWQgZGlnaXRhbCBhdWRpbyBkaXJlY3RseSB1c2luZyBhIHByb2dyYW0KIHN1Y2ggYXMgY2RkYTJ3YXYuICBUaGUgb25seSB0eXBlcyBvZiBkcml2ZSB3aGljaCBJJ3ZlIGhlYXJkIHN1cHBvcnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvaW5kZXgudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9pbmRleC50eHQKaW5kZXggZmZkYjUzMi4uM2QwYjkxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9pbmRleC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9pbmRleC50eHQKQEAgLTM1LDExICszNSw5IEBACiAtLS0tLS0tLS0tLS0KIFRoZXJlIGlzIGEgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2luZyBDVlMgY29tbWl0IGFuZCBnZW5lcmFsIGxpc3Qgd2hlcmUKIHlvdSBjYW4gcmVwb3J0IGJ1Z3MsIHByb2JsZW1zIG9yIHN1Ym1pdCBwYXRjaGVzLiBUbyBwb3N0IGEgbWVzc2FnZSwKLXNlbmQgYW4gZW1haWwgdG8gY3B1ZnJlcUBsaXN0cy5saW51eC5vcmcudWssIHRvIHN1YnNjcmliZSBnbyB0bwotaHR0cDovL2xpc3RzLmxpbnV4Lm9yZy51ay9tYWlsbWFuL2xpc3RpbmZvL2NwdWZyZXEuIFByZXZpb3VzIHBvc3QgdG8gdGhlCi1tYWlsaW5nIGxpc3QgYXJlIGF2YWlsYWJsZSB0byBzdWJzY3JpYmVycyBhdAotaHR0cDovL2xpc3RzLmxpbnV4Lm9yZy51ay9tYWlsbWFuL3ByaXZhdGUvY3B1ZnJlcS8uCi0KK3NlbmQgYW4gZW1haWwgdG8gY3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmcsIHRvIHN1YnNjcmliZSBnbyB0bworaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwjY3B1ZnJlcSBhbmQgZm9sbG93IHRoZQoraW5zdHJ1Y3Rpb25zIHRoZXJlLgogCiBMaW5rcwogLS0tLS0KQEAgLTUwLDcgKzQ4LDcgQEAKICogaHR0cDovL2N2cy5hcm0ubGludXgub3JnLnVrLwogCiB0aGUgQ1BVRnJlcSBNYWlsaW5nIGxpc3Q6Ci0qIGh0dHA6Ly9saXN0cy5saW51eC5vcmcudWsvbWFpbG1hbi9saXN0aW5mby9jcHVmcmVxCisqIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sI2NwdWZyZXEKIAogQ2xvY2sgYW5kIHZvbHRhZ2Ugc2NhbGluZyBmb3IgdGhlIFNBLTExMDA6CiAqIGh0dHA6Ly93d3cubGFydG1ha2VyLm5sL3Byb2plY3RzL3NjYWxpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CmluZGV4IDFmNWE5MjQuLjQ3ZTU2OGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dApAQCAtNjM1LDE0ICs2MzUsMTYgQEAKIAogVGhlcmUgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBhYm92ZS4gIElmIGhvdHBsdWcgZnVuY3Rpb25hbGl0eSBpcyB1c2VkCiB0byByZW1vdmUgYWxsIHRoZSBDUFVzIHRoYXQgYXJlIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhIGNwdXNldCwKLXRoZW4gdGhlIGtlcm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBjcHVzX2FsbG93ZWQgb2YgYWxsCi10YXNrcyBhdHRhY2hlZCB0byBDUFVzIGluIHRoYXQgY3B1c2V0IHRvIGFsbG93IGFsbCBDUFVzLiAgV2hlbiBtZW1vcnkKLWhvdHBsdWcgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZpbmcgTWVtb3J5IE5vZGVzIGlzIGF2YWlsYWJsZSwgYQotc2ltaWxhciBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYXBwbHkgdGhlcmUgYXMgd2VsbC4gIEluIGdlbmVyYWwsCi10aGUga2VybmVsIHByZWZlcnMgdG8gdmlvbGF0ZSBjcHVzZXQgcGxhY2VtZW50LCBvdmVyIHN0YXJ2aW5nIGEgdGFzawotdGhhdCBoYXMgaGFkIGFsbCBpdHMgYWxsb3dlZCBDUFVzIG9yIE1lbW9yeSBOb2RlcyB0YWtlbiBvZmZsaW5lLiAgVXNlcgotY29kZSBzaG91bGQgcmVjb25maWd1cmUgY3B1c2V0cyB0byBvbmx5IHJlZmVyIHRvIG9ubGluZSBDUFVzIGFuZCBNZW1vcnkKLU5vZGVzIHdoZW4gdXNpbmcgaG90cGx1ZyB0byBhZGQgb3IgcmVtb3ZlIHN1Y2ggcmVzb3VyY2VzLgordGhlbiBhbGwgdGhlIHRhc2tzIGluIHRoYXQgY3B1c2V0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIG5lYXJlc3QgYW5jZXN0b3IKK3dpdGggbm9uLWVtcHR5IGNwdXMuICBCdXQgdGhlIG1vdmluZyBvZiBzb21lIChvciBhbGwpIHRhc2tzIG1pZ2h0IGZhaWwgaWYKK2NwdXNldCBpcyBib3VuZCB3aXRoIGFub3RoZXIgY2dyb3VwIHN1YnN5c3RlbSB3aGljaCBoYXMgc29tZSByZXN0cmljdGlvbnMKK29uIHRhc2sgYXR0YWNoaW5nLiAgSW4gdGhpcyBmYWlsaW5nIGNhc2UsIHRob3NlIHRhc2tzIHdpbGwgc3RheQoraW4gdGhlIG9yaWdpbmFsIGNwdXNldCwgYW5kIHRoZSBrZXJuZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZQordGhlaXIgY3B1c19hbGxvd2VkIHRvIGFsbG93IGFsbCBvbmxpbmUgQ1BVcy4gIFdoZW4gbWVtb3J5IGhvdHBsdWcKK2Z1bmN0aW9uYWxpdHkgZm9yIHJlbW92aW5nIE1lbW9yeSBOb2RlcyBpcyBhdmFpbGFibGUsIGEgc2ltaWxhciBleGNlcHRpb24KK2lzIGV4cGVjdGVkIHRvIGFwcGx5IHRoZXJlIGFzIHdlbGwuICBJbiBnZW5lcmFsLCB0aGUga2VybmVsIHByZWZlcnMgdG8KK3Zpb2xhdGUgY3B1c2V0IHBsYWNlbWVudCwgb3ZlciBzdGFydmluZyBhIHRhc2sgdGhhdCBoYXMgaGFkIGFsbAoraXRzIGFsbG93ZWQgQ1BVcyBvciBNZW1vcnkgTm9kZXMgdGFrZW4gb2ZmbGluZS4KIAogVGhlcmUgaXMgYSBzZWNvbmQgZXhjZXB0aW9uIHRvIHRoZSBhYm92ZS4gIEdGUF9BVE9NSUMgcmVxdWVzdHMgYXJlCiBrZXJuZWwgaW50ZXJuYWwgYWxsb2NhdGlvbnMgdGhhdCBtdXN0IGJlIHNhdGlzZmllZCwgaW1tZWRpYXRlbHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NyaXMvUkVBRE1FIGIvRG9jdW1lbnRhdGlvbi9jcmlzL1JFQURNRQppbmRleCA3OTVhMWRhLi5kOWIwODY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyaXMvUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vY3Jpcy9SRUFETUUKQEAgLTI3LDcgKzI3LDcgQEAKIFRoZSBFVFJBWCAxMDBMWCBjaGlwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Gb3IgcmVmZXJlbmNlLCBwbGFzZSBzZWUgdGhlIHByZXNzLXJlbGVhc2U6CitGb3IgcmVmZXJlbmNlLCBwbGVhc2Ugc2VlIHRoZSBwcmVzcy1yZWxlYXNlOgogCiBodHRwOi8vd3d3LmF4aXMuY29tL25ld3MvdXMvMDAxMTAxX2V0cmF4Lmh0bQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRybyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8xLkludHJvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzJjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRybwpAQCAtMCwwICsxLDI3NCBAQAorMTogQSBHVUlERSBUTyBUSEUgS0VSTkVMIERFVkVMT1BNRU5UIFBST0NFU1MKKworVGhlIHB1cnBvc2Ugb2YgdGhpcyBkb2N1bWVudCBpcyB0byBoZWxwIGRldmVsb3BlcnMgKGFuZCB0aGVpciBtYW5hZ2VycykKK3dvcmsgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHdpdGggYSBtaW5pbXVtIG9mIGZydXN0cmF0aW9uLiAgSXQgaXMKK2FuIGF0dGVtcHQgdG8gZG9jdW1lbnQgaG93IHRoaXMgY29tbXVuaXR5IHdvcmtzIGluIGEgd2F5IHdoaWNoIGlzCithY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBhcmUgbm90IGludGltYXRlbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwKK2RldmVsb3BtZW50IChvciwgaW5kZWVkLCBmcmVlIHNvZnR3YXJlIGRldmVsb3BtZW50IGluIGdlbmVyYWwpLiAgV2hpbGUKK3RoZXJlIGlzIHNvbWUgdGVjaG5pY2FsIG1hdGVyaWFsIGhlcmUsIHRoaXMgaXMgdmVyeSBtdWNoIGEgcHJvY2Vzcy1vcmllbnRlZAorZGlzY3Vzc2lvbiB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGEgZGVlcCBrbm93bGVkZ2Ugb2Yga2VybmVsIHByb2dyYW1taW5nIHRvCit1bmRlcnN0YW5kLgorCisKKzEuMTogRVhFQ1VUSVZFIFNVTU1BUlkKKworVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzCithbmQgdGhlIGtpbmRzIG9mIGZydXN0cmF0aW9ucyB0aGF0IGRldmVsb3BlcnMgYW5kIHRoZWlyIGVtcGxveWVycyBjYW4KK2VuY291bnRlciB0aGVyZS4gIFRoZXJlIGFyZSBhIGdyZWF0IG1hbnkgcmVhc29ucyB3aHkga2VybmVsIGNvZGUgc2hvdWxkIGJlCittZXJnZWQgaW50byB0aGUgb2ZmaWNpYWwgKCJtYWlubGluZSIpIGtlcm5lbCwgaW5jbHVkaW5nIGF1dG9tYXRpYworYXZhaWxhYmlsaXR5IHRvIHVzZXJzLCBjb21tdW5pdHkgc3VwcG9ydCBpbiBtYW55IGZvcm1zLCBhbmQgdGhlIGFiaWxpdHkgdG8KK2luZmx1ZW5jZSB0aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIENvZGUgY29udHJpYnV0ZWQgdG8gdGhlCitMaW51eCBrZXJuZWwgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UuCisKK1NlY3Rpb24gMiBpbnRyb2R1Y2VzIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLCB0aGUga2VybmVsIHJlbGVhc2UgY3ljbGUsIGFuZAordGhlIG1lY2hhbmljcyBvZiB0aGUgbWVyZ2Ugd2luZG93LiAgVGhlIHZhcmlvdXMgcGhhc2VzIGluIHRoZSBwYXRjaAorZGV2ZWxvcG1lbnQsIHJldmlldywgYW5kIG1lcmdpbmcgY3ljbGUgYXJlIGNvdmVyZWQuICBUaGVyZSBpcyBzb21lCitkaXNjdXNzaW9uIG9mIHRvb2xzIGFuZCBtYWlsaW5nIGxpc3RzLiAgRGV2ZWxvcGVycyB3YW50aW5nIHRvIGdldCBzdGFydGVkCit3aXRoIGtlcm5lbCBkZXZlbG9wbWVudCBhcmUgZW5jb3VyYWdlZCB0byB0cmFjayBkb3duIGFuZCBmaXggYnVncyBhcyBhbgoraW5pdGlhbCBleGVyY2lzZS4KKworU2VjdGlvbiAzIGNvdmVycyBlYXJseS1zdGFnZSBwcm9qZWN0IHBsYW5uaW5nLCB3aXRoIGFuIGVtcGhhc2lzIG9uCitpbnZvbHZpbmcgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBzb29uIGFzIHBvc3NpYmxlLgorCitTZWN0aW9uIDQgaXMgYWJvdXQgdGhlIGNvZGluZyBwcm9jZXNzOyBzZXZlcmFsIHBpdGZhbGxzIHdoaWNoIGhhdmUgYmVlbgorZW5jb3VudGVyZWQgYnkgb3RoZXIgZGV2ZWxvcGVycyBhcmUgZGlzY3Vzc2VkLiAgU29tZSByZXF1aXJlbWVudHMgZm9yCitwYXRjaGVzIGFyZSBjb3ZlcmVkLCBhbmQgdGhlcmUgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIHRvb2xzCit3aGljaCBjYW4gaGVscCB0byBlbnN1cmUgdGhhdCBrZXJuZWwgcGF0Y2hlcyBhcmUgY29ycmVjdC4KKworU2VjdGlvbiA1IHRhbGtzIGFib3V0IHRoZSBwcm9jZXNzIG9mIHBvc3RpbmcgcGF0Y2hlcyBmb3IgcmV2aWV3LiAgVG8gYmUKK3Rha2VuIHNlcmlvdXNseSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCBwYXRjaGVzIG11c3QgYmUgcHJvcGVybHkKK2Zvcm1hdHRlZCBhbmQgZGVzY3JpYmVkLCBhbmQgdGhleSBtdXN0IGJlIHNlbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLgorRm9sbG93aW5nIHRoZSBhZHZpY2UgaW4gdGhpcyBzZWN0aW9uIHNob3VsZCBoZWxwIHRvIGVuc3VyZSB0aGUgYmVzdAorcG9zc2libGUgcmVjZXB0aW9uIGZvciB5b3VyIHdvcmsuCisKK1NlY3Rpb24gNiBjb3ZlcnMgd2hhdCBoYXBwZW5zIGFmdGVyIHBvc3RpbmcgcGF0Y2hlczsgdGhlIGpvYiBpcyBmYXIgZnJvbQorZG9uZSBhdCB0aGF0IHBvaW50LiAgV29ya2luZyB3aXRoIHJldmlld2VycyBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUKK2RldmVsb3BtZW50IHByb2Nlc3M7IHRoaXMgc2VjdGlvbiBvZmZlcnMgYSBudW1iZXIgb2YgdGlwcyBvbiBob3cgdG8gYXZvaWQKK3Byb2JsZW1zIGF0IHRoaXMgaW1wb3J0YW50IHN0YWdlLiAgRGV2ZWxvcGVycyBhcmUgY2F1dGlvbmVkIGFnYWluc3QKK2Fzc3VtaW5nIHRoYXQgdGhlIGpvYiBpcyBkb25lIHdoZW4gYSBwYXRjaCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCisKK1NlY3Rpb24gNyBpbnRyb2R1Y2VzIGEgY291cGxlIG9mICJhZHZhbmNlZCIgdG9waWNzOiBtYW5hZ2luZyBwYXRjaGVzIHdpdGgKK2dpdCBhbmQgcmV2aWV3aW5nIHBhdGNoZXMgcG9zdGVkIGJ5IG90aGVycy4KKworU2VjdGlvbiA4IGNvbmNsdWRlcyB0aGUgZG9jdW1lbnQgd2l0aCBwb2ludGVycyB0byBzb3VyY2VzIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiBrZXJuZWwgZGV2ZWxvcG1lbnQuCisKKworMS4yOiBXSEFUIFRISVMgRE9DVU1FTlQgSVMgQUJPVVQKKworVGhlIExpbnV4IGtlcm5lbCwgYXQgb3ZlciA2IG1pbGxpb24gbGluZXMgb2YgY29kZSBhbmQgd2VsbCBvdmVyIDEwMDAgYWN0aXZlCitjb250cmlidXRvcnMsIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBhY3RpdmUgZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cworaW4gZXhpc3RlbmNlLiAgU2luY2UgaXRzIGh1bWJsZSBiZWdpbm5pbmcgaW4gMTk5MSwgdGhpcyBrZXJuZWwgaGFzIGV2b2x2ZWQKK2ludG8gYSBiZXN0LW9mLWJyZWVkIG9wZXJhdGluZyBzeXN0ZW0gY29tcG9uZW50IHdoaWNoIHJ1bnMgb24gcG9ja2V0LXNpemVkCitkaWdpdGFsIG11c2ljIHBsYXllcnMsIGRlc2t0b3AgUENzLCB0aGUgbGFyZ2VzdCBzdXBlcmNvbXB1dGVycyBpbgorZXhpc3RlbmNlLCBhbmQgYWxsIHR5cGVzIG9mIHN5c3RlbXMgaW4gYmV0d2Vlbi4gIEl0IGlzIGEgcm9idXN0LCBlZmZpY2llbnQsCithbmQgc2NhbGFibGUgc29sdXRpb24gZm9yIGFsbW9zdCBhbnkgc2l0dWF0aW9uLgorCitXaXRoIHRoZSBncm93dGggb2YgTGludXggaGFzIGNvbWUgYW4gaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBkZXZlbG9wZXJzCisoYW5kIGNvbXBhbmllcykgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiBpdHMgZGV2ZWxvcG1lbnQuICBIYXJkd2FyZQordmVuZG9ycyB3YW50IHRvIGVuc3VyZSB0aGF0IExpbnV4IHN1cHBvcnRzIHRoZWlyIHByb2R1Y3RzIHdlbGwsIG1ha2luZwordGhvc2UgcHJvZHVjdHMgYXR0cmFjdGl2ZSB0byBMaW51eCB1c2Vycy4gIEVtYmVkZGVkIHN5c3RlbXMgdmVuZG9ycywgd2hvCit1c2UgTGludXggYXMgYSBjb21wb25lbnQgaW4gYW4gaW50ZWdyYXRlZCBwcm9kdWN0LCB3YW50IExpbnV4IHRvIGJlIGFzCitjYXBhYmxlIGFuZCB3ZWxsLXN1aXRlZCB0byB0aGUgdGFzayBhdCBoYW5kIGFzIHBvc3NpYmxlLiAgRGlzdHJpYnV0b3JzIGFuZAorb3RoZXIgc29mdHdhcmUgdmVuZG9ycyB3aG8gYmFzZSB0aGVpciBwcm9kdWN0cyBvbiBMaW51eCBoYXZlIGEgY2xlYXIKK2ludGVyZXN0IGluIHRoZSBjYXBhYmlsaXRpZXMsIHBlcmZvcm1hbmNlLCBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlIExpbnV4CitrZXJuZWwuICBBbmQgZW5kIHVzZXJzLCB0b28sIHdpbGwgb2Z0ZW4gd2lzaCB0byBjaGFuZ2UgTGludXggdG8gbWFrZSBpdAorYmV0dGVyIHN1aXQgdGhlaXIgbmVlZHMuCisKK09uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGZlYXR1cmVzIG9mIExpbnV4IGlzIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSB0bwordGhlc2UgZGV2ZWxvcGVyczsgYW55Ym9keSB3aXRoIHRoZSByZXF1aXNpdGUgc2tpbGxzIGNhbiBpbXByb3ZlIExpbnV4IGFuZAoraW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2YgaXRzIGRldmVsb3BtZW50LiAgUHJvcHJpZXRhcnkgcHJvZHVjdHMgY2Fubm90CitvZmZlciB0aGlzIGtpbmQgb2Ygb3Blbm5lc3MsIHdoaWNoIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGZyZWUgc29mdHdhcmUKK3Byb2Nlc3MuICBCdXQsIGlmIGFueXRoaW5nLCB0aGUga2VybmVsIGlzIGV2ZW4gbW9yZSBvcGVuIHRoYW4gbW9zdCBvdGhlcgorZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cy4gIEEgdHlwaWNhbCB0aHJlZS1tb250aCBrZXJuZWwgZGV2ZWxvcG1lbnQgY3ljbGUgY2FuCitpbnZvbHZlIG92ZXIgMTAwMCBkZXZlbG9wZXJzIHdvcmtpbmcgZm9yIG1vcmUgdGhhbiAxMDAgZGlmZmVyZW50IGNvbXBhbmllcworKG9yIGZvciBubyBjb21wYW55IGF0IGFsbCkuCisKK1dvcmtpbmcgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBpcyBub3QgZXNwZWNpYWxseSBoYXJkLiAgQnV0LAordGhhdCBub3R3aXRoc3RhbmRpbmcsIG1hbnkgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBoYXZlIGV4cGVyaWVuY2VkCitkaWZmaWN1bHRpZXMgd2hlbiB0cnlpbmcgdG8gZG8ga2VybmVsIHdvcmsuICBUaGUga2VybmVsIGNvbW11bml0eSBoYXMKK2V2b2x2ZWQgaXRzIG93biBkaXN0aW5jdCB3YXlzIG9mIG9wZXJhdGluZyB3aGljaCBhbGxvdyBpdCB0byBmdW5jdGlvbgorc21vb3RobHkgKGFuZCBwcm9kdWNlIGEgaGlnaC1xdWFsaXR5IHByb2R1Y3QpIGluIGFuIGVudmlyb25tZW50IHdoZXJlCit0aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZSBhcmUgYmVpbmcgY2hhbmdlZCBldmVyeSBkYXkuICBTbyBpdCBpcyBub3QKK3N1cnByaXNpbmcgdGhhdCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWZmZXJzIGdyZWF0bHkgZnJvbQorcHJvcHJpZXRhcnkgZGV2ZWxvcG1lbnQgbWV0aG9kcy4KKworVGhlIGtlcm5lbCdzIGRldmVsb3BtZW50IHByb2Nlc3MgbWF5IGNvbWUgYWNyb3NzIGFzIHN0cmFuZ2UgYW5kCitpbnRpbWlkYXRpbmcgdG8gbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBhcmUgZ29vZCByZWFzb25zIGFuZCBzb2xpZAorZXhwZXJpZW5jZSBiZWhpbmQgaXQuICBBIGRldmVsb3BlciB3aG8gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUga2VybmVsCitjb21tdW5pdHkncyB3YXlzIChvciwgd29yc2UsIHdobyB0cmllcyB0byBmbG91dCBvciBjaXJjdW12ZW50IHRoZW0pIHdpbGwKK2hhdmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlIGluIHN0b3JlLiAgVGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgd2hpbGUKK2JlaW5nIGhlbHBmdWwgdG8gdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gbGVhcm4sIGhhcyBsaXR0bGUgdGltZSBmb3IgdGhvc2UKK3dobyB3aWxsIG5vdCBsaXN0ZW4gb3Igd2hvIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgorCitJdCBpcyBob3BlZCB0aGF0IHRob3NlIHdobyByZWFkIHRoaXMgZG9jdW1lbnQgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQKK2ZydXN0cmF0aW5nIGV4cGVyaWVuY2UuICBUaGVyZSBpcyBhIGxvdCBvZiBtYXRlcmlhbCBoZXJlLCBidXQgdGhlIGVmZm9ydAoraW52b2x2ZWQgaW4gcmVhZGluZyBpdCB3aWxsIGJlIHJlcGFpZCBpbiBzaG9ydCBvcmRlci4gIFRoZSBkZXZlbG9wbWVudAorY29tbXVuaXR5IGlzIGFsd2F5cyBpbiBuZWVkIG9mIGRldmVsb3BlcnMgd2hvIHdpbGwgaGVscCB0byBtYWtlIHRoZSBrZXJuZWwKK2JldHRlcjsgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZCBoZWxwIHlvdSAtIG9yIHRob3NlIHdobyB3b3JrIGZvciB5b3UgLQoram9pbiBvdXIgY29tbXVuaXR5LgorCisKKzEuMzogQ1JFRElUUworCitUaGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuICBJdCBoYXMgYmVlbgoraW1wcm92ZWQgYnkgY29tbWVudHMgZnJvbSBKb2hhbm5lcyBCZXJnLCBKYW1lcyBCZXJyeSwgQWxleCBDaGlhbmcsIFJvbGFuZAorRHJlaWVyLCBSYW5keSBEdW5sYXAsIEpha2UgRWRnZSwgSmlyaSBLb3NpbmEsIE1hdHQgTWFja2FsbCwgQXJ0aHVyIE1hcnNoLAorQW1hbmRhIE1jUGhlcnNvbiwgQW5kcmV3IE1vcnRvbiwgQW5kcmV3IFByaWNlLCBUc3VnaWthenUgU2hpYmF0YSwgYW5kCitKb2NoZW4gVm/Dny4gCisKK1RoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IHRoZSBMaW51eCBGb3VuZGF0aW9uOyB0aGFua3MgZXNwZWNpYWxseSB0bworQW1hbmRhIE1jUGhlcnNvbiwgd2hvIHNhdyB0aGUgdmFsdWUgb2YgdGhpcyBlZmZvcnQgYW5kIG1hZGUgaXQgYWxsIGhhcHBlbi4KKworCisxLjQ6IFRIRSBJTVBPUlRBTkNFIE9GIEdFVFRJTkcgQ09ERSBJTlRPIFRIRSBNQUlOTElORQorCitTb21lIGNvbXBhbmllcyBhbmQgZGV2ZWxvcGVycyBvY2Nhc2lvbmFsbHkgd29uZGVyIHdoeSB0aGV5IHNob3VsZCBib3RoZXIKK2xlYXJuaW5nIGhvdyB0byB3b3JrIHdpdGggdGhlIGtlcm5lbCBjb21tdW5pdHkgYW5kIGdldCB0aGVpciBjb2RlIGludG8gdGhlCittYWlubGluZSBrZXJuZWwgKHRoZSAibWFpbmxpbmUiIGJlaW5nIHRoZSBrZXJuZWwgbWFpbnRhaW5lZCBieSBMaW51cworVG9ydmFsZHMgYW5kIHVzZWQgYXMgYSBiYXNlIGJ5IExpbnV4IGRpc3RyaWJ1dG9ycykuICBJbiB0aGUgc2hvcnQgdGVybSwKK2NvbnRyaWJ1dGluZyBjb2RlIGNhbiBsb29rIGxpa2UgYW4gYXZvaWRhYmxlIGV4cGVuc2U7IGl0IHNlZW1zIGVhc2llciB0bworanVzdCBrZWVwIHRoZSBjb2RlIHNlcGFyYXRlIGFuZCBzdXBwb3J0IHVzZXJzIGRpcmVjdGx5LiAgVGhlIHRydXRoIG9mIHRoZQorbWF0dGVyIGlzIHRoYXQga2VlcGluZyBjb2RlIHNlcGFyYXRlICgib3V0IG9mIHRyZWUiKSBpcyBhIGZhbHNlIGVjb25vbXkuCisKK0FzIGEgd2F5IG9mIGlsbHVzdHJhdGluZyB0aGUgY29zdHMgb2Ygb3V0LW9mLXRyZWUgY29kZSwgaGVyZSBhcmUgYSBmZXcKK3JlbGV2YW50IGFzcGVjdHMgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzOyBtb3N0IG9mIHRoZXNlIHdpbGwgYmUKK2Rpc2N1c3NlZCBpbiBncmVhdGVyIGRldGFpbCBsYXRlciBpbiB0aGlzIGRvY3VtZW50LiAgQ29uc2lkZXI6CisKKy0gQ29kZSB3aGljaCBoYXMgYmVlbiBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsIGlzIGF2YWlsYWJsZSB0byBhbGwKKyAgTGludXggdXNlcnMuICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcHJlc2VudCBvbiBhbGwgZGlzdHJpYnV0aW9ucyB3aGljaAorICBlbmFibGUgaXQuICBUaGVyZSBpcyBubyBuZWVkIGZvciBkcml2ZXIgZGlza3MsIGRvd25sb2Fkcywgb3IgdGhlIGhhc3NsZXMKKyAgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBtdWx0aXBsZSBkaXN0cmlidXRpb25zOyBpdCBhbGwganVzdAorICB3b3JrcywgZm9yIHRoZSBkZXZlbG9wZXIgYW5kIGZvciB0aGUgdXNlci4gIEluY29ycG9yYXRpb24gaW50byB0aGUKKyAgbWFpbmxpbmUgc29sdmVzIGEgbGFyZ2UgbnVtYmVyIG9mIGRpc3RyaWJ1dGlvbiBhbmQgc3VwcG9ydCBwcm9ibGVtcy4KKworLSBXaGlsZSBrZXJuZWwgZGV2ZWxvcGVycyBzdHJpdmUgdG8gbWFpbnRhaW4gYSBzdGFibGUgaW50ZXJmYWNlIHRvIHVzZXIKKyAgc3BhY2UsIHRoZSBpbnRlcm5hbCBrZXJuZWwgQVBJIGlzIGluIGNvbnN0YW50IGZsdXguICBUaGUgbGFjayBvZiBhIHN0YWJsZQorICBpbnRlcm5hbCBpbnRlcmZhY2UgaXMgYSBkZWxpYmVyYXRlIGRlc2lnbiBkZWNpc2lvbjsgaXQgYWxsb3dzIGZ1bmRhbWVudGFsCisgIGltcHJvdmVtZW50cyB0byBiZSBtYWRlIGF0IGFueSB0aW1lIGFuZCByZXN1bHRzIGluIGhpZ2hlci1xdWFsaXR5IGNvZGUuCisgIEJ1dCBvbmUgcmVzdWx0IG9mIHRoYXQgcG9saWN5IGlzIHRoYXQgYW55IG91dC1vZi10cmVlIGNvZGUgcmVxdWlyZXMKKyAgY29uc3RhbnQgdXBrZWVwIGlmIGl0IGlzIHRvIHdvcmsgd2l0aCBuZXcga2VybmVscy4gIE1haW50YWluaW5nCisgIG91dC1vZi10cmVlIGNvZGUgcmVxdWlyZXMgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiB3b3JrIGp1c3QgdG8ga2VlcCB0aGF0CisgIGNvZGUgd29ya2luZy4KKworICBDb2RlIHdoaWNoIGlzIGluIHRoZSBtYWlubGluZSwgaW5zdGVhZCwgZG9lcyBub3QgcmVxdWlyZSB0aGlzIHdvcmsgYXMgdGhlCisgIHJlc3VsdCBvZiBhIHNpbXBsZSBydWxlIHJlcXVpcmluZyBhbnkgZGV2ZWxvcGVyIHdobyBtYWtlcyBhbiBBUEkgY2hhbmdlCisgIHRvIGFsc28gZml4IGFueSBjb2RlIHRoYXQgYnJlYWtzIGFzIHRoZSByZXN1bHQgb2YgdGhhdCBjaGFuZ2UuICBTbyBjb2RlCisgIHdoaWNoIGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBoYXMgc2lnbmlmaWNhbnRseSBsb3dlcgorICBtYWludGVuYW5jZSBjb3N0cy4KKworLSBCZXlvbmQgdGhhdCwgY29kZSB3aGljaCBpcyBpbiB0aGUga2VybmVsIHdpbGwgb2Z0ZW4gYmUgaW1wcm92ZWQgYnkgb3RoZXIKKyAgZGV2ZWxvcGVycy4gIFN1cnByaXNpbmcgcmVzdWx0cyBjYW4gY29tZSBmcm9tIGVtcG93ZXJpbmcgeW91ciB1c2VyCisgIGNvbW11bml0eSBhbmQgY3VzdG9tZXJzIHRvIGltcHJvdmUgeW91ciBwcm9kdWN0LgorCistIEtlcm5lbCBjb2RlIGlzIHN1YmplY3RlZCB0byByZXZpZXcsIGJvdGggYmVmb3JlIGFuZCBhZnRlciBtZXJnaW5nIGludG8KKyAgdGhlIG1haW5saW5lLiAgTm8gbWF0dGVyIGhvdyBzdHJvbmcgdGhlIG9yaWdpbmFsIGRldmVsb3BlcidzIHNraWxscyBhcmUsCisgIHRoaXMgcmV2aWV3IHByb2Nlc3MgaW52YXJpYWJseSBmaW5kcyB3YXlzIGluIHdoaWNoIHRoZSBjb2RlIGNhbiBiZQorICBpbXByb3ZlZC4gIE9mdGVuIHJldmlldyBmaW5kcyBzZXZlcmUgYnVncyBhbmQgc2VjdXJpdHkgcHJvYmxlbXMuICBUaGlzIGlzCisgIGVzcGVjaWFsbHkgdHJ1ZSBmb3IgY29kZSB3aGljaCBoYXMgYmVlbiBkZXZlbG9wZWQgaW4gYSBjbG9zZWQKKyAgZW52aXJvbm1lbnQ7IHN1Y2ggY29kZSBiZW5lZml0cyBzdHJvbmdseSBmcm9tIHJldmlldyBieSBvdXRzaWRlCisgIGRldmVsb3BlcnMuICBPdXQtb2YtdHJlZSBjb2RlIGlzIGxvd2VyLXF1YWxpdHkgY29kZS4KKworLSBQYXJ0aWNpcGF0aW9uIGluIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzIGlzIHlvdXIgd2F5IHRvIGluZmx1ZW5jZSB0aGUKKyAgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIFVzZXJzIHdobyBjb21wbGFpbiBmcm9tIHRoZSBzaWRlbGluZXMKKyAgYXJlIGhlYXJkLCBidXQgYWN0aXZlIGRldmVsb3BlcnMgaGF2ZSBhIHN0cm9uZ2VyIHZvaWNlIC0gYW5kIHRoZSBhYmlsaXR5CisgIHRvIGltcGxlbWVudCBjaGFuZ2VzIHdoaWNoIG1ha2UgdGhlIGtlcm5lbCB3b3JrIGJldHRlciBmb3IgdGhlaXIgbmVlZHMuCisKKy0gV2hlbiBjb2RlIGlzIG1haW50YWluZWQgc2VwYXJhdGVseSwgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSB0aGlyZCBwYXJ0eQorICB3aWxsIGNvbnRyaWJ1dGUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgYSBzaW1pbGFyIGZlYXR1cmUgYWx3YXlzCisgIGV4aXN0cy4gIFNob3VsZCB0aGF0IGhhcHBlbiwgZ2V0dGluZyB5b3VyIGNvZGUgbWVyZ2VkIHdpbGwgYmVjb21lIG11Y2gKKyAgaGFyZGVyIC0gdG8gdGhlIHBvaW50IG9mIGltcG9zc2liaWxpdHkuICBUaGVuIHlvdSB3aWxsIGJlIGZhY2VkIHdpdGggdGhlCisgIHVucGxlYXNhbnQgYWx0ZXJuYXRpdmVzIG9mIGVpdGhlciAoMSkgbWFpbnRhaW5pbmcgYSBub25zdGFuZGFyZCBmZWF0dXJlCisgIG91dCBvZiB0cmVlIGluZGVmaW5pdGVseSwgb3IgKDIpIGFiYW5kb25pbmcgeW91ciBjb2RlIGFuZCBtaWdyYXRpbmcgeW91cgorICB1c2VycyBvdmVyIHRvIHRoZSBpbi10cmVlIHZlcnNpb24uCisKKy0gQ29udHJpYnV0aW9uIG9mIGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIGFjdGlvbiB3aGljaCBtYWtlcyB0aGUgd2hvbGUKKyAgcHJvY2VzcyB3b3JrLiAgQnkgY29udHJpYnV0aW5nIHlvdXIgY29kZSB5b3UgY2FuIGFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0bworICB0aGUga2VybmVsIGFuZCBwcm92aWRlIGNhcGFiaWxpdGllcyBhbmQgZXhhbXBsZXMgd2hpY2ggYXJlIG9mIHVzZSB0bworICBvdGhlciBrZXJuZWwgZGV2ZWxvcGVycy4gIElmIHlvdSBoYXZlIGRldmVsb3BlZCBjb2RlIGZvciBMaW51eCAob3IgYXJlCisgIHRoaW5raW5nIGFib3V0IGRvaW5nIHNvKSwgeW91IGNsZWFybHkgaGF2ZSBhbiBpbnRlcmVzdCBpbiB0aGUgY29udGludWVkCisgIHN1Y2Nlc3Mgb2YgdGhpcyBwbGF0Zm9ybTsgY29udHJpYnV0aW5nIGNvZGUgaXMgb25lIG9mIHRoZSBiZXN0IHdheXMgdG8KKyAgaGVscCBlbnN1cmUgdGhhdCBzdWNjZXNzLgorCitBbGwgb2YgdGhlIHJlYXNvbmluZyBhYm92ZSBhcHBsaWVzIHRvIGFueSBvdXQtb2YtdHJlZSBrZXJuZWwgY29kZSwKK2luY2x1ZGluZyBjb2RlIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIGluIHByb3ByaWV0YXJ5LCBiaW5hcnktb25seSBmb3JtLgorVGhlcmUgYXJlLCBob3dldmVyLCBhZGRpdGlvbmFsIGZhY3RvcnMgd2hpY2ggc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudAorYmVmb3JlIGNvbnNpZGVyaW5nIGFueSBzb3J0IG9mIGJpbmFyeS1vbmx5IGtlcm5lbCBjb2RlIGRpc3RyaWJ1dGlvbi4gIFRoZXNlCitpbmNsdWRlOgorCistIFRoZSBsZWdhbCBpc3N1ZXMgYXJvdW5kIHRoZSBkaXN0cmlidXRpb24gb2YgcHJvcHJpZXRhcnkga2VybmVsIG1vZHVsZXMKKyAgYXJlIGNsb3VkeSBhdCBiZXN0OyBxdWl0ZSBhIGZldyBrZXJuZWwgY29weXJpZ2h0IGhvbGRlcnMgYmVsaWV2ZSB0aGF0CisgIG1vc3QgYmluYXJ5LW9ubHkgbW9kdWxlcyBhcmUgZGVyaXZlZCBwcm9kdWN0cyBvZiB0aGUga2VybmVsIGFuZCB0aGF0LCBhcworICBhIHJlc3VsdCwgdGhlaXIgZGlzdHJpYnV0aW9uIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgbGljZW5zZSAoYWJvdXQgd2hpY2ggbW9yZSB3aWxsIGJlIHNhaWQgYmVsb3cpLiAgWW91ciBhdXRob3IgaXMgbm90IGEKKyAgbGF3eWVyLCBhbmQgbm90aGluZyBpbiB0aGlzIGRvY3VtZW50IGNhbiBwb3NzaWJseSBiZSBjb25zaWRlcmVkIHRvIGJlCisgIGxlZ2FsIGFkdmljZS4gIFRoZSB0cnVlIGxlZ2FsIHN0YXR1cyBvZiBjbG9zZWQtc291cmNlIG1vZHVsZXMgY2FuIG9ubHkgYmUKKyAgZGV0ZXJtaW5lZCBieSB0aGUgY291cnRzLiAgQnV0IHRoZSB1bmNlcnRhaW50eSB3aGljaCBoYXVudHMgdGhvc2UgbW9kdWxlcworICBpcyB0aGVyZSByZWdhcmRsZXNzLgorCistIEJpbmFyeSBtb2R1bGVzIGdyZWF0bHkgaW5jcmVhc2UgdGhlIGRpZmZpY3VsdHkgb2YgZGVidWdnaW5nIGtlcm5lbAorICBwcm9ibGVtcywgdG8gdGhlIHBvaW50IHRoYXQgbW9zdCBrZXJuZWwgZGV2ZWxvcGVycyB3aWxsIG5vdCBldmVuIHRyeS4gIFNvCisgIHRoZSBkaXN0cmlidXRpb24gb2YgYmluYXJ5LW9ubHkgbW9kdWxlcyB3aWxsIG1ha2UgaXQgaGFyZGVyIGZvciB5b3VyCisgIHVzZXJzIHRvIGdldCBzdXBwb3J0IGZyb20gdGhlIGNvbW11bml0eS4KKworLSBTdXBwb3J0IGlzIGFsc28gaGFyZGVyIGZvciBkaXN0cmlidXRvcnMgb2YgYmluYXJ5LW9ubHkgbW9kdWxlcywgd2hvIG11c3QKKyAgcHJvdmlkZSBhIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBmb3IgZXZlcnkgZGlzdHJpYnV0aW9uIGFuZCBldmVyeSBrZXJuZWwKKyAgdmVyc2lvbiB0aGV5IHdpc2ggdG8gc3VwcG9ydC4gIERvemVucyBvZiBidWlsZHMgb2YgYSBzaW5nbGUgbW9kdWxlIGNhbgorICBiZSByZXF1aXJlZCB0byBwcm92aWRlIHJlYXNvbmFibHkgY29tcHJlaGVuc2l2ZSBjb3ZlcmFnZSwgYW5kIHlvdXIgdXNlcnMKKyAgd2lsbCBoYXZlIHRvIHVwZ3JhZGUgeW91ciBtb2R1bGUgc2VwYXJhdGVseSBldmVyeSB0aW1lIHRoZXkgdXBncmFkZSB0aGVpcgorICBrZXJuZWwuCisKKy0gRXZlcnl0aGluZyB0aGF0IHdhcyBzYWlkIGFib3ZlIGFib3V0IGNvZGUgcmV2aWV3IGFwcGxpZXMgZG91Ymx5IHRvCisgIGNsb3NlZC1zb3VyY2UgY29kZS4gIFNpbmNlIHRoaXMgY29kZSBpcyBub3QgYXZhaWxhYmxlIGF0IGFsbCwgaXQgY2Fubm90CisgIGhhdmUgYmVlbiByZXZpZXdlZCBieSB0aGUgY29tbXVuaXR5IGFuZCB3aWxsLCBiZXlvbmQgZG91YnQsIGhhdmUgc2VyaW91cworICBwcm9ibGVtcy4gCisKK01ha2VycyBvZiBlbWJlZGRlZCBzeXN0ZW1zLCBpbiBwYXJ0aWN1bGFyLCBtYXkgYmUgdGVtcHRlZCB0byBkaXNyZWdhcmQgbXVjaAorb2Ygd2hhdCBoYXMgYmVlbiBzYWlkIGluIHRoaXMgc2VjdGlvbiBpbiB0aGUgYmVsaWVmIHRoYXQgdGhleSBhcmUgc2hpcHBpbmcKK2Egc2VsZi1jb250YWluZWQgcHJvZHVjdCB3aGljaCB1c2VzIGEgZnJvemVuIGtlcm5lbCB2ZXJzaW9uIGFuZCByZXF1aXJlcyBubworbW9yZSBkZXZlbG9wbWVudCBhZnRlciBpdHMgcmVsZWFzZS4gIFRoaXMgYXJndW1lbnQgbWlzc2VzIHRoZSB2YWx1ZSBvZgord2lkZXNwcmVhZCBjb2RlIHJldmlldyBhbmQgdGhlIHZhbHVlIG9mIGFsbG93aW5nIHlvdXIgdXNlcnMgdG8gYWRkCitjYXBhYmlsaXRpZXMgdG8geW91ciBwcm9kdWN0LiAgQnV0IHRoZXNlIHByb2R1Y3RzLCB0b28sIGhhdmUgYSBsaW1pdGVkCitjb21tZXJjaWFsIGxpZmUsIGFmdGVyIHdoaWNoIGEgbmV3IHZlcnNpb24gbXVzdCBiZSByZWxlYXNlZC4gIEF0IHRoYXQKK3BvaW50LCB2ZW5kb3JzIHdob3NlIGNvZGUgaXMgaW4gdGhlIG1haW5saW5lIGFuZCB3ZWxsIG1haW50YWluZWQgd2lsbCBiZQorbXVjaCBiZXR0ZXIgcG9zaXRpb25lZCB0byBnZXQgdGhlIG5ldyBwcm9kdWN0IHJlYWR5IGZvciBtYXJrZXQgcXVpY2tseS4KKworCisxLjU6IExJQ0VOU0lORworCitDb2RlIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBMaW51eCBrZXJuZWwgdW5kZXIgYSBudW1iZXIgb2YgbGljZW5zZXMsIGJ1dCBhbGwKK2NvZGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKEdQTHYyKSwgd2hpY2ggaXMgdGhlIGxpY2Vuc2UgY292ZXJpbmcgdGhlIGtlcm5lbCBkaXN0cmlidXRpb24gYXMgYSB3aG9sZS4KK0luIHByYWN0aWNlLCB0aGF0IG1lYW5zIHRoYXQgYWxsIGNvZGUgY29udHJpYnV0aW9ucyBhcmUgY292ZXJlZCBlaXRoZXIgYnkKK0dQTHYyICh3aXRoLCBvcHRpb25hbGx5LCBsYW5ndWFnZSBhbGxvd2luZyBkaXN0cmlidXRpb24gdW5kZXIgbGF0ZXIKK3ZlcnNpb25zIG9mIHRoZSBHUEwpIG9yIHRoZSB0aHJlZS1jbGF1c2UgQlNEIGxpY2Vuc2UuICBBbnkgY29udHJpYnV0aW9ucword2hpY2ggYXJlIG5vdCBjb3ZlcmVkIGJ5IGEgY29tcGF0aWJsZSBsaWNlbnNlIHdpbGwgbm90IGJlIGFjY2VwdGVkIGludG8gdGhlCitrZXJuZWwuCisKK0NvcHlyaWdodCBhc3NpZ25tZW50cyBhcmUgbm90IHJlcXVpcmVkIChvciByZXF1ZXN0ZWQpIGZvciBjb2RlIGNvbnRyaWJ1dGVkCit0byB0aGUga2VybmVsLiAgQWxsIGNvZGUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbCByZXRhaW5zIGl0cworb3JpZ2luYWwgb3duZXJzaGlwOyBhcyBhIHJlc3VsdCwgdGhlIGtlcm5lbCBub3cgaGFzIHRob3VzYW5kcyBvZiBvd25lcnMuCisKK09uZSBpbXBsaWNhdGlvbiBvZiB0aGlzIG93bmVyc2hpcCBzdHJ1Y3R1cmUgaXMgdGhhdCBhbnkgYXR0ZW1wdCB0byBjaGFuZ2UKK3RoZSBsaWNlbnNpbmcgb2YgdGhlIGtlcm5lbCBpcyBkb29tZWQgdG8gYWxtb3N0IGNlcnRhaW4gZmFpbHVyZS4gIFRoZXJlIGFyZQorZmV3IHByYWN0aWNhbCBzY2VuYXJpb3Mgd2hlcmUgdGhlIGFncmVlbWVudCBvZiBhbGwgY29weXJpZ2h0IGhvbGRlcnMgY291bGQKK2JlIG9idGFpbmVkIChvciB0aGVpciBjb2RlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsKS4gIFNvLCBpbiBwYXJ0aWN1bGFyLAordGhlcmUgaXMgbm8gcHJvc3BlY3Qgb2YgYSBtaWdyYXRpb24gdG8gdmVyc2lvbiAzIG9mIHRoZSBHUEwgaW4gdGhlCitmb3Jlc2VlYWJsZSBmdXR1cmUuCisKK0l0IGlzIGltcGVyYXRpdmUgdGhhdCBhbGwgY29kZSBjb250cmlidXRlZCB0byB0aGUga2VybmVsIGJlIGxlZ2l0aW1hdGVseQorZnJlZSBzb2Z0d2FyZS4gIEZvciB0aGF0IHJlYXNvbiwgY29kZSBmcm9tIGFub255bW91cyAob3IgcHNldWRvbnltb3VzKQorY29udHJpYnV0b3JzIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgQWxsIGNvbnRyaWJ1dG9ycyBhcmUgcmVxdWlyZWQgdG8gInNpZ24KK29mZiIgb24gdGhlaXIgY29kZSwgc3RhdGluZyB0aGF0IHRoZSBjb2RlIGNhbiBiZSBkaXN0cmlidXRlZCB3aXRoIHRoZQora2VybmVsIHVuZGVyIHRoZSBHUEwuICBDb2RlIHdoaWNoIGhhcyBub3QgYmVlbiBsaWNlbnNlZCBhcyBmcmVlIHNvZnR3YXJlIGJ5CitpdHMgb3duZXIsIG9yIHdoaWNoIHJpc2tzIGNyZWF0aW5nIGNvcHlyaWdodC1yZWxhdGVkIHByb2JsZW1zIGZvciB0aGUKK2tlcm5lbCAoc3VjaCBhcyBjb2RlIHdoaWNoIGRlcml2ZXMgZnJvbSByZXZlcnNlLWVuZ2luZWVyaW5nIGVmZm9ydHMgbGFja2luZworcHJvcGVyIHNhZmVndWFyZHMpIGNhbm5vdCBiZSBjb250cmlidXRlZC4KKworUXVlc3Rpb25zIGFib3V0IGNvcHlyaWdodC1yZWxhdGVkIGlzc3VlcyBhcmUgY29tbW9uIG9uIExpbnV4IGRldmVsb3BtZW50CittYWlsaW5nIGxpc3RzLiAgU3VjaCBxdWVzdGlvbnMgd2lsbCBub3JtYWxseSByZWNlaXZlIG5vIHNob3J0YWdlIG9mCithbnN3ZXJzLCBidXQgb25lIHNob3VsZCBiZWFyIGluIG1pbmQgdGhhdCB0aGUgcGVvcGxlIGFuc3dlcmluZyB0aG9zZQorcXVlc3Rpb25zIGFyZSBub3QgbGF3eWVycyBhbmQgY2Fubm90IHByb3ZpZGUgbGVnYWwgYWR2aWNlLiAgSWYgeW91IGhhdmUKK2xlZ2FsIHF1ZXN0aW9ucyByZWxhdGluZyB0byBMaW51eCBzb3VyY2UgY29kZSwgdGhlcmUgaXMgbm8gc3Vic3RpdHV0ZSBmb3IKK3RhbGtpbmcgd2l0aCBhIGxhd3llciB3aG8gdW5kZXJzdGFuZHMgdGhpcyBmaWVsZC4gIFJlbHlpbmcgb24gYW5zd2Vycworb2J0YWluZWQgb24gdGVjaG5pY2FsIG1haWxpbmcgbGlzdHMgaXMgYSByaXNreSBhZmZhaXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2VzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUwMzIxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2VzcwpAQCAtMCwwICsxLDQ1OSBAQAorMjogSE9XIFRIRSBERVZFTE9QTUVOVCBQUk9DRVNTIFdPUktTCisKK0xpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBpbiB0aGUgZWFybHkgMTk5MCdzIHdhcyBhIHByZXR0eSBsb29zZSBhZmZhaXIsCit3aXRoIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVycyBvZiB1c2VycyBhbmQgZGV2ZWxvcGVycyBpbnZvbHZlZC4gIFdpdGggYQordXNlciBiYXNlIGluIHRoZSBtaWxsaW9ucyBhbmQgd2l0aCBzb21lIDIsMDAwIGRldmVsb3BlcnMgaW52b2x2ZWQgb3ZlciB0aGUKK2NvdXJzZSBvZiBvbmUgeWVhciwgdGhlIGtlcm5lbCBoYXMgc2luY2UgaGFkIHRvIGV2b2x2ZSBhIG51bWJlciBvZgorcHJvY2Vzc2VzIHRvIGtlZXAgZGV2ZWxvcG1lbnQgaGFwcGVuaW5nIHNtb290aGx5LiAgQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mCitob3cgdGhlIHByb2Nlc3Mgd29ya3MgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYW4gZWZmZWN0aXZlIHBhcnQgb2YgaXQuCisKKworMi4xOiBUSEUgQklHIFBJQ1RVUkUKKworVGhlIGtlcm5lbCBkZXZlbG9wZXJzIHVzZSBhIGxvb3NlbHkgdGltZS1iYXNlZCByZWxlYXNlIHByb2Nlc3MsIHdpdGggYSBuZXcKK21ham9yIGtlcm5lbCByZWxlYXNlIGhhcHBlbmluZyBldmVyeSB0d28gb3IgdGhyZWUgbW9udGhzLiAgVGhlIHJlY2VudAorcmVsZWFzZSBoaXN0b3J5IGxvb2tzIGxpa2UgdGhpczoKKworCTIuNi4yNglKdWx5IDEzLCAyMDA4CisJMi42LjI1CUFwcmlsIDE2LCAyMDA4CisJMi42LjI0CUphbnVhcnkgMjQsIDIwMDgKKwkyLjYuMjMJT2N0b2JlciA5LCAyMDA3CisJMi42LjIyCUp1bHkgOCwgMjAwNworCTIuNi4yMQlBcHJpbCAyNSwgMjAwNworCTIuNi4yMAlGZWJydWFyeSA0LCAyMDA3CisKK0V2ZXJ5IDIuNi54IHJlbGVhc2UgaXMgYSBtYWpvciBrZXJuZWwgcmVsZWFzZSB3aXRoIG5ldyBmZWF0dXJlcywgaW50ZXJuYWwKK0FQSSBjaGFuZ2VzLCBhbmQgbW9yZS4gIEEgdHlwaWNhbCAyLjYgcmVsZWFzZSBjYW4gY29udGFpbiBvdmVyIDEwLDAwMAorY2hhbmdlc2V0cyB3aXRoIGNoYW5nZXMgdG8gc2V2ZXJhbCBodW5kcmVkIHRob3VzYW5kIGxpbmVzIG9mIGNvZGUuICAyLjYgaXMKK3RodXMgdGhlIGxlYWRpbmcgZWRnZSBvZiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQ7IHRoZSBrZXJuZWwgdXNlcyBhCityb2xsaW5nIGRldmVsb3BtZW50IG1vZGVsIHdoaWNoIGlzIGNvbnRpbnVhbGx5IGludGVncmF0aW5nIG1ham9yIGNoYW5nZXMuCisKK0EgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgZGlzY2lwbGluZSBpcyBmb2xsb3dlZCB3aXRoIHJlZ2FyZCB0byB0aGUKK21lcmdpbmcgb2YgcGF0Y2hlcyBmb3IgZWFjaCByZWxlYXNlLiAgQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGRldmVsb3BtZW50CitjeWNsZSwgdGhlICJtZXJnZSB3aW5kb3ciIGlzIHNhaWQgdG8gYmUgb3Blbi4gIEF0IHRoYXQgdGltZSwgY29kZSB3aGljaCBpcworZGVlbWVkIHRvIGJlIHN1ZmZpY2llbnRseSBzdGFibGUgKGFuZCB3aGljaCBpcyBhY2NlcHRlZCBieSB0aGUgZGV2ZWxvcG1lbnQKK2NvbW11bml0eSkgaXMgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4gIFRoZSBidWxrIG9mIGNoYW5nZXMgZm9yIGEKK25ldyBkZXZlbG9wbWVudCBjeWNsZSAoYW5kIGFsbCBvZiB0aGUgbWFqb3IgY2hhbmdlcykgd2lsbCBiZSBtZXJnZWQgZHVyaW5nCit0aGlzIHRpbWUsIGF0IGEgcmF0ZSBhcHByb2FjaGluZyAxLDAwMCBjaGFuZ2VzICgicGF0Y2hlcywiIG9yICJjaGFuZ2VzZXRzIikKK3BlciBkYXkuCisKKyhBcyBhbiBhc2lkZSwgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGNoYW5nZXMgaW50ZWdyYXRlZCBkdXJpbmcgdGhlCittZXJnZSB3aW5kb3cgZG8gbm90IGNvbWUgb3V0IG9mIHRoaW4gYWlyOyB0aGV5IGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRlc3RlZCwKK2FuZCBzdGFnZWQgYWhlYWQgb2YgdGltZS4gIEhvdyB0aGF0IHByb2Nlc3Mgd29ya3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4KK2RldGFpbCBsYXRlciBvbikuCisKK1RoZSBtZXJnZSB3aW5kb3cgbGFzdHMgZm9yIHR3byB3ZWVrcy4gIEF0IHRoZSBlbmQgb2YgdGhpcyB0aW1lLCBMaW51cworVG9ydmFsZHMgd2lsbCBkZWNsYXJlIHRoYXQgdGhlIHdpbmRvdyBpcyBjbG9zZWQgYW5kIHJlbGVhc2UgdGhlIGZpcnN0IG9mCit0aGUgInJjIiBrZXJuZWxzLiAgRm9yIHRoZSBrZXJuZWwgd2hpY2ggaXMgZGVzdGluZWQgdG8gYmUgMi42LjI2LCBmb3IKK2V4YW1wbGUsIHRoZSByZWxlYXNlIHdoaWNoIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2Ugd2luZG93IHdpbGwgYmUKK2NhbGxlZCAyLjYuMjYtcmMxLiAgVGhlIC1yYzEgcmVsZWFzZSBpcyB0aGUgc2lnbmFsIHRoYXQgdGhlIHRpbWUgdG8gbWVyZ2UKK25ldyBmZWF0dXJlcyBoYXMgcGFzc2VkLCBhbmQgdGhhdCB0aGUgdGltZSB0byBzdGFiaWxpemUgdGhlIG5leHQga2VybmVsIGhhcworYmVndW4uCisKK092ZXIgdGhlIG5leHQgc2l4IHRvIHRlbiB3ZWVrcywgb25seSBwYXRjaGVzIHdoaWNoIGZpeCBwcm9ibGVtcyBzaG91bGQgYmUKK3N1Ym1pdHRlZCB0byB0aGUgbWFpbmxpbmUuICBPbiBvY2Nhc2lvbiBhIG1vcmUgc2lnbmlmaWNhbnQgY2hhbmdlIHdpbGwgYmUKK2FsbG93ZWQsIGJ1dCBzdWNoIG9jY2FzaW9ucyBhcmUgcmFyZTsgZGV2ZWxvcGVycyB3aG8gdHJ5IHRvIG1lcmdlIG5ldworZmVhdHVyZXMgb3V0c2lkZSBvZiB0aGUgbWVyZ2Ugd2luZG93IHRlbmQgdG8gZ2V0IGFuIHVuZnJpZW5kbHkgcmVjZXB0aW9uLgorQXMgYSBnZW5lcmFsIHJ1bGUsIGlmIHlvdSBtaXNzIHRoZSBtZXJnZSB3aW5kb3cgZm9yIGEgZ2l2ZW4gZmVhdHVyZSwgdGhlCitiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGRldmVsb3BtZW50IGN5Y2xlLiAgKEFuIG9jY2FzaW9uYWwKK2V4Y2VwdGlvbiBpcyBtYWRlIGZvciBkcml2ZXJzIGZvciBwcmV2aW91c2x5LXVuc3VwcG9ydGVkIGhhcmR3YXJlOyBpZiB0aGV5Cit0b3VjaCBubyBpbi10cmVlIGNvZGUsIHRoZXkgY2Fubm90IGNhdXNlIHJlZ3Jlc3Npb25zIGFuZCBzaG91bGQgYmUgc2FmZSB0bworYWRkIGF0IGFueSB0aW1lKS4KKworQXMgZml4ZXMgbWFrZSB0aGVpciB3YXkgaW50byB0aGUgbWFpbmxpbmUsIHRoZSBwYXRjaCByYXRlIHdpbGwgc2xvdyBvdmVyCit0aW1lLiAgTGludXMgcmVsZWFzZXMgbmV3IC1yYyBrZXJuZWxzIGFib3V0IG9uY2UgYSB3ZWVrOyBhIG5vcm1hbCBzZXJpZXMKK3dpbGwgZ2V0IHVwIHRvIHNvbWV3aGVyZSBiZXR3ZWVuIC1yYzYgYW5kIC1yYzkgYmVmb3JlIHRoZSBrZXJuZWwgaXMKK2NvbnNpZGVyZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSBhbmQgdGhlIGZpbmFsIDIuNi54IHJlbGVhc2UgaXMgbWFkZS4KK0F0IHRoYXQgcG9pbnQgdGhlIHdob2xlIHByb2Nlc3Mgc3RhcnRzIG92ZXIgYWdhaW4uCisKK0FzIGFuIGV4YW1wbGUsIGhlcmUgaXMgaG93IHRoZSAyLjYuMjUgZGV2ZWxvcG1lbnQgY3ljbGUgd2VudCAoYWxsIGRhdGVzIGluCisyMDA4KTogCisKKwlKYW51YXJ5IDI0CTIuNi4yNCBzdGFibGUgcmVsZWFzZQorCUZlYnJ1YXJ5IDEwCTIuNi4yNS1yYzEsIG1lcmdlIHdpbmRvdyBjbG9zZXMKKwlGZWJydWFyeSAxNQkyLjYuMjUtcmMyCisJRmVicnVhcnkgMjQJMi42LjI1LXJjMworCU1hcmNoIDQJIAkyLjYuMjUtcmM0CisJTWFyY2ggOQkJMi42LjI1LXJjNQorCU1hcmNoIDE2CTIuNi4yNS1yYzYKKwlNYXJjaCAyNQkyLjYuMjUtcmM3CisJQXByaWwgMQkJMi42LjI1LXJjOAorCUFwcmlsIDExCTIuNi4yNS1yYzkKKwlBcHJpbCAxNgkyLjYuMjUgc3RhYmxlIHJlbGVhc2UKKworSG93IGRvIHRoZSBkZXZlbG9wZXJzIGRlY2lkZSB3aGVuIHRvIGNsb3NlIHRoZSBkZXZlbG9wbWVudCBjeWNsZSBhbmQgY3JlYXRlCit0aGUgc3RhYmxlIHJlbGVhc2U/ICBUaGUgbW9zdCBzaWduaWZpY2FudCBtZXRyaWMgdXNlZCBpcyB0aGUgbGlzdCBvZgorcmVncmVzc2lvbnMgZnJvbSBwcmV2aW91cyByZWxlYXNlcy4gIE5vIGJ1Z3MgYXJlIHdlbGNvbWUsIGJ1dCB0aG9zZSB3aGljaAorYnJlYWsgc3lzdGVtcyB3aGljaCB3b3JrZWQgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXNwZWNpYWxseQorc2VyaW91cy4gIEZvciB0aGlzIHJlYXNvbiwgcGF0Y2hlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyBhcmUgbG9va2VkIHVwb24KK3VuZmF2b3JhYmx5IGFuZCBhcmUgcXVpdGUgbGlrZWx5IHRvIGJlIHJldmVydGVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbgorcGVyaW9kLiAKKworVGhlIGRldmVsb3BlcnMnIGdvYWwgaXMgdG8gZml4IGFsbCBrbm93biByZWdyZXNzaW9ucyBiZWZvcmUgdGhlIHN0YWJsZQorcmVsZWFzZSBpcyBtYWRlLiAgSW4gdGhlIHJlYWwgd29ybGQsIHRoaXMga2luZCBvZiBwZXJmZWN0aW9uIGlzIGhhcmQgdG8KK2FjaGlldmU7IHRoZXJlIGFyZSBqdXN0IHRvbyBtYW55IHZhcmlhYmxlcyBpbiBhIHByb2plY3Qgb2YgdGhpcyBzaXplLgorVGhlcmUgY29tZXMgYSBwb2ludCB3aGVyZSBkZWxheWluZyB0aGUgZmluYWwgcmVsZWFzZSBqdXN0IG1ha2VzIHRoZSBwcm9ibGVtCit3b3JzZTsgdGhlIHBpbGUgb2YgY2hhbmdlcyB3YWl0aW5nIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3cgd2lsbCBncm93CitsYXJnZXIsIGNyZWF0aW5nIGV2ZW4gbW9yZSByZWdyZXNzaW9ucyB0aGUgbmV4dCB0aW1lIGFyb3VuZC4gIFNvIG1vc3QgMi42LngKK2tlcm5lbHMgZ28gb3V0IHdpdGggYSBoYW5kZnVsIG9mIGtub3duIHJlZ3Jlc3Npb25zIHRob3VnaCwgaG9wZWZ1bGx5LCBub25lCitvZiB0aGVtIGFyZSBzZXJpb3VzLgorCitPbmNlIGEgc3RhYmxlIHJlbGVhc2UgaXMgbWFkZSwgaXRzIG9uZ29pbmcgbWFpbnRlbmFuY2UgaXMgcGFzc2VkIG9mZiB0byB0aGUKKyJzdGFibGUgdGVhbSwiIGN1cnJlbnRseSBjb21wcmlzZWQgb2YgR3JlZyBLcm9haC1IYXJ0bWFuIGFuZCBDaHJpcyBXcmlnaHQuCitUaGUgc3RhYmxlIHRlYW0gd2lsbCByZWxlYXNlIG9jY2FzaW9uYWwgdXBkYXRlcyB0byB0aGUgc3RhYmxlIHJlbGVhc2UgdXNpbmcKK3RoZSAyLjYueC55IG51bWJlcmluZyBzY2hlbWUuICBUbyBiZSBjb25zaWRlcmVkIGZvciBhbiB1cGRhdGUgcmVsZWFzZSwgYQorcGF0Y2ggbXVzdCAoMSkgZml4IGEgc2lnbmlmaWNhbnQgYnVnLCBhbmQgKDIpIGFscmVhZHkgYmUgbWVyZ2VkIGludG8gdGhlCittYWlubGluZSBmb3IgdGhlIG5leHQgZGV2ZWxvcG1lbnQga2VybmVsLiAgQ29udGludWluZyBvdXIgMi42LjI1IGV4YW1wbGUsCit0aGUgaGlzdG9yeSAoYXMgb2YgdGhpcyB3cml0aW5nKSBpczoKKworCU1heSAxCQkyLjYuMjUuMQorCU1heSA2CQkyLjYuMjUuMiAKKwlNYXkgOQkJMi42LjI1LjMgCisJTWF5IDE1CQkyLjYuMjUuNAorCUp1bmUgNwkJMi42LjI1LjUKKwlKdW5lIDkJCTIuNi4yNS42CisJSnVuZSAxNgkJMi42LjI1LjcKKwlKdW5lIDIxCQkyLjYuMjUuOAorCUp1bmUgMjQJCTIuNi4yNS45CisKK1N0YWJsZSB1cGRhdGVzIGZvciBhIGdpdmVuIGtlcm5lbCBhcmUgbWFkZSBmb3IgYXBwcm94aW1hdGVseSBzaXggbW9udGhzOworYWZ0ZXIgdGhhdCwgdGhlIG1haW50ZW5hbmNlIG9mIHN0YWJsZSByZWxlYXNlcyBpcyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5CitvZiB0aGUgZGlzdHJpYnV0b3JzIHdoaWNoIGhhdmUgc2hpcHBlZCB0aGF0IHBhcnRpY3VsYXIga2VybmVsLgorCisKKzIuMjogVEhFIExJRkVDWUNMRSBPRiBBIFBBVENICisKK1BhdGNoZXMgZG8gbm90IGdvIGRpcmVjdGx5IGZyb20gdGhlIGRldmVsb3BlcidzIGtleWJvYXJkIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBUaGVyZSBpcywgaW5zdGVhZCwgYSBzb21ld2hhdCBpbnZvbHZlZCAoaWYgc29tZXdoYXQgaW5mb3JtYWwpCitwcm9jZXNzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGVhY2ggcGF0Y2ggaXMgcmV2aWV3ZWQgZm9yIHF1YWxpdHkgYW5kIHRoYXQKK2VhY2ggcGF0Y2ggaW1wbGVtZW50cyBhIGNoYW5nZSB3aGljaCBpcyBkZXNpcmFibGUgdG8gaGF2ZSBpbiB0aGUgbWFpbmxpbmUuCitUaGlzIHByb2Nlc3MgY2FuIGhhcHBlbiBxdWlja2x5IGZvciBtaW5vciBmaXhlcywgb3IsIGluIHRoZSBjYXNlIG9mIGxhcmdlCithbmQgY29udHJvdmVyc2lhbCBjaGFuZ2VzLCBnbyBvbiBmb3IgeWVhcnMuICBNdWNoIGRldmVsb3BlciBmcnVzdHJhdGlvbgorY29tZXMgZnJvbSBhIGxhY2sgb2YgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHByb2Nlc3Mgb3IgZnJvbSBhdHRlbXB0cyB0bworY2lyY3VtdmVudCBpdC4gIAorCitJbiB0aGUgaG9wZXMgb2YgcmVkdWNpbmcgdGhhdCBmcnVzdHJhdGlvbiwgdGhpcyBkb2N1bWVudCB3aWxsIGRlc2NyaWJlIGhvdworYSBwYXRjaCBnZXRzIGludG8gdGhlIGtlcm5lbC4gIFdoYXQgZm9sbG93cyBiZWxvdyBpcyBhbiBpbnRyb2R1Y3Rpb24gd2hpY2gKK2Rlc2NyaWJlcyB0aGUgcHJvY2VzcyBpbiBhIHNvbWV3aGF0IGlkZWFsaXplZCB3YXkuICBBIG11Y2ggbW9yZSBkZXRhaWxlZAordHJlYXRtZW50IHdpbGwgY29tZSBpbiBsYXRlciBzZWN0aW9ucy4KKworVGhlIHN0YWdlcyB0aGF0IGEgcGF0Y2ggZ29lcyB0aHJvdWdoIGFyZSwgZ2VuZXJhbGx5OgorCisgLSBEZXNpZ24uICBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIHJlcXVpcmVtZW50cyBmb3IgdGhlIHBhdGNoIC0gYW5kIHRoZSB3YXkKKyAgIHRob3NlIHJlcXVpcmVtZW50cyB3aWxsIGJlIG1ldCAtIGFyZSBsYWlkIG91dC4gIERlc2lnbiB3b3JrIGlzIG9mdGVuCisgICBkb25lIHdpdGhvdXQgaW52b2x2aW5nIHRoZSBjb21tdW5pdHksIGJ1dCBpdCBpcyBiZXR0ZXIgdG8gZG8gdGhpcyB3b3JrCisgICBpbiB0aGUgb3BlbiBpZiBhdCBhbGwgcG9zc2libGU7IGl0IGNhbiBzYXZlIGEgbG90IG9mIHRpbWUgcmVkZXNpZ25pbmcKKyAgIHRoaW5ncyBsYXRlci4KKworIC0gRWFybHkgcmV2aWV3LiAgUGF0Y2hlcyBhcmUgcG9zdGVkIHRvIHRoZSByZWxldmFudCBtYWlsaW5nIGxpc3QsIGFuZAorICAgZGV2ZWxvcGVycyBvbiB0aGF0IGxpc3QgcmVwbHkgd2l0aCBhbnkgY29tbWVudHMgdGhleSBtYXkgaGF2ZS4gIFRoaXMKKyAgIHByb2Nlc3Mgc2hvdWxkIHR1cm4gdXAgYW55IG1ham9yIHByb2JsZW1zIHdpdGggYSBwYXRjaCBpZiBhbGwgZ29lcworICAgd2VsbC4KKworIC0gV2lkZXIgcmV2aWV3LiAgV2hlbiB0aGUgcGF0Y2ggaXMgZ2V0dGluZyBjbG9zZSB0byByZWFkeSBmb3IgbWFpbmxpbmUKKyAgIGluY2x1c2lvbiwgaXQgd2lsbCBiZSBhY2NlcHRlZCBieSBhIHJlbGV2YW50IHN1YnN5c3RlbSBtYWludGFpbmVyIC0KKyAgIHRob3VnaCB0aGlzIGFjY2VwdGFuY2UgaXMgbm90IGEgZ3VhcmFudGVlIHRoYXQgdGhlIHBhdGNoIHdpbGwgbWFrZSBpdAorICAgYWxsIHRoZSB3YXkgdG8gdGhlIG1haW5saW5lLiAgVGhlIHBhdGNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgbWFpbnRhaW5lcidzCisgICBzdWJzeXN0ZW0gdHJlZSBhbmQgaW50byB0aGUgc3RhZ2luZyB0cmVlcyAoZGVzY3JpYmVkIGJlbG93KS4gIFdoZW4gdGhlCisgICBwcm9jZXNzIHdvcmtzLCB0aGlzIHN0ZXAgbGVhZHMgdG8gbW9yZSBleHRlbnNpdmUgcmV2aWV3IG9mIHRoZSBwYXRjaCBhbmQKKyAgIHRoZSBkaXNjb3Zlcnkgb2YgYW55IHByb2JsZW1zIHJlc3VsdGluZyBmcm9tIHRoZSBpbnRlZ3JhdGlvbiBvZiB0aGlzCisgICBwYXRjaCB3aXRoIHdvcmsgYmVpbmcgZG9uZSBieSBvdGhlcnMuCisKKyAtIE1lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUuICBFdmVudHVhbGx5LCBhIHN1Y2Nlc3NmdWwgcGF0Y2ggd2lsbCBiZQorICAgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIHJlcG9zaXRvcnkgbWFuYWdlZCBieSBMaW51cyBUb3J2YWxkcy4gIE1vcmUKKyAgIGNvbW1lbnRzIGFuZC9vciBwcm9ibGVtcyBtYXkgc3VyZmFjZSBhdCB0aGlzIHRpbWU7IGl0IGlzIGltcG9ydGFudCB0aGF0CisgICB0aGUgZGV2ZWxvcGVyIGJlIHJlc3BvbnNpdmUgdG8gdGhlc2UgYW5kIGZpeCBhbnkgaXNzdWVzIHdoaWNoIGFyaXNlLgorCisgLSBTdGFibGUgcmVsZWFzZS4gIFRoZSBudW1iZXIgb2YgdXNlcnMgcG90ZW50aWFsbHkgYWZmZWN0ZWQgYnkgdGhlIHBhdGNoCisgICBpcyBub3cgbGFyZ2UsIHNvLCBvbmNlIGFnYWluLCBuZXcgcHJvYmxlbXMgbWF5IGFyaXNlLgorCisgLSBMb25nLXRlcm0gbWFpbnRlbmFuY2UuICBXaGlsZSBpdCBpcyBjZXJ0YWlubHkgcG9zc2libGUgZm9yIGEgZGV2ZWxvcGVyCisgICB0byBmb3JnZXQgYWJvdXQgY29kZSBhZnRlciBtZXJnaW5nIGl0LCB0aGF0IHNvcnQgb2YgYmVoYXZpb3IgdGVuZHMgdG8KKyAgIGxlYXZlIGEgcG9vciBpbXByZXNzaW9uIGluIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuICBNZXJnaW5nIGNvZGUKKyAgIGVsaW1pbmF0ZXMgc29tZSBvZiB0aGUgbWFpbnRlbmFuY2UgYnVyZGVuLCBpbiB0aGF0IG90aGVycyB3aWxsIGZpeAorICAgcHJvYmxlbXMgY2F1c2VkIGJ5IEFQSSBjaGFuZ2VzLiAgQnV0IHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIgc2hvdWxkCisgICBjb250aW51ZSB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSBpZiBpdCBpcyB0byByZW1haW4gdXNlZnVsCisgICBpbiB0aGUgbG9uZ2VyIHRlcm0uCisKK09uZSBvZiB0aGUgbGFyZ2VzdCBtaXN0YWtlcyBtYWRlIGJ5IGtlcm5lbCBkZXZlbG9wZXJzIChvciB0aGVpciBlbXBsb3llcnMpCitpcyB0byB0cnkgdG8gY3V0IHRoZSBwcm9jZXNzIGRvd24gdG8gYSBzaW5nbGUgIm1lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUiCitzdGVwLiAgVGhpcyBhcHByb2FjaCBpbnZhcmlhYmx5IGxlYWRzIHRvIGZydXN0cmF0aW9uIGZvciBldmVyeWJvZHkKK2ludm9sdmVkLgorCisKKzIuMzogSE9XIFBBVENIRVMgR0VUIElOVE8gVEhFIEtFUk5FTAorCitUaGVyZSBpcyBleGFjdGx5IG9uZSBwZXJzb24gd2hvIGNhbiBtZXJnZSBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lIGtlcm5lbAorcmVwb3NpdG9yeTogTGludXMgVG9ydmFsZHMuICBCdXQsIG9mIHRoZSBvdmVyIDEyLDAwMCBwYXRjaGVzIHdoaWNoIHdlbnQKK2ludG8gdGhlIDIuNi4yNSBrZXJuZWwsIG9ubHkgMjUwIChhcm91bmQgMiUpIHdlcmUgZGlyZWN0bHkgY2hvc2VuIGJ5IExpbnVzCitoaW1zZWxmLiAgVGhlIGtlcm5lbCBwcm9qZWN0IGhhcyBsb25nIHNpbmNlIGdyb3duIHRvIGEgc2l6ZSB3aGVyZSBubyBzaW5nbGUKK2RldmVsb3BlciBjb3VsZCBwb3NzaWJseSBpbnNwZWN0IGFuZCBzZWxlY3QgZXZlcnkgcGF0Y2ggdW5hc3Npc3RlZC4gIFRoZQord2F5IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyBoYXZlIGFkZHJlc3NlZCB0aGlzIGdyb3d0aCBpcyB0aHJvdWdoIHRoZSB1c2Ugb2YKK2EgbGlldXRlbmFudCBzeXN0ZW0gYnVpbHQgYXJvdW5kIGEgY2hhaW4gb2YgdHJ1c3QuCisKK1RoZSBrZXJuZWwgY29kZSBiYXNlIGlzIGxvZ2ljYWxseSBicm9rZW4gZG93biBpbnRvIGEgc2V0IG9mIHN1YnN5c3RlbXM6CituZXR3b3JraW5nLCBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgc3VwcG9ydCwgbWVtb3J5IG1hbmFnZW1lbnQsIHZpZGVvCitkZXZpY2VzLCBldGMuICBNb3N0IHN1YnN5c3RlbXMgaGF2ZSBhIGRlc2lnbmF0ZWQgbWFpbnRhaW5lciwgYSBkZXZlbG9wZXIKK3dobyBoYXMgb3ZlcmFsbCByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGNvZGUgd2l0aGluIHRoYXQgc3Vic3lzdGVtLiAgVGhlc2UKK3N1YnN5c3RlbSBtYWludGFpbmVycyBhcmUgdGhlIGdhdGVrZWVwZXJzIChpbiBhIGxvb3NlIHdheSkgZm9yIHRoZSBwb3J0aW9uCitvZiB0aGUga2VybmVsIHRoZXkgbWFuYWdlOyB0aGV5IGFyZSB0aGUgb25lcyB3aG8gd2lsbCAodXN1YWxseSkgYWNjZXB0IGEKK3BhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgorCitTdWJzeXN0ZW0gbWFpbnRhaW5lcnMgZWFjaCBtYW5hZ2UgdGhlaXIgb3duIHZlcnNpb24gb2YgdGhlIGtlcm5lbCBzb3VyY2UKK3RyZWUsIHVzdWFsbHkgKGJ1dCBjZXJ0YWlubHkgbm90IGFsd2F5cykgdXNpbmcgdGhlIGdpdCBzb3VyY2UgbWFuYWdlbWVudAordG9vbC4gIFRvb2xzIGxpa2UgZ2l0IChhbmQgcmVsYXRlZCB0b29scyBsaWtlIHF1aWx0IG9yIG1lcmN1cmlhbCkgYWxsb3cKK21haW50YWluZXJzIHRvIHRyYWNrIGEgbGlzdCBvZiBwYXRjaGVzLCBpbmNsdWRpbmcgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbgorYW5kIG90aGVyIG1ldGFkYXRhLiAgQXQgYW55IGdpdmVuIHRpbWUsIHRoZSBtYWludGFpbmVyIGNhbiBpZGVudGlmeSB3aGljaAorcGF0Y2hlcyBpbiBoaXMgb3IgaGVyIHJlcG9zaXRvcnkgYXJlIG5vdCBmb3VuZCBpbiB0aGUgbWFpbmxpbmUuCisKK1doZW4gdGhlIG1lcmdlIHdpbmRvdyBvcGVucywgdG9wLWxldmVsIG1haW50YWluZXJzIHdpbGwgYXNrIExpbnVzIHRvICJwdWxsIgordGhlIHBhdGNoZXMgdGhleSBoYXZlIHNlbGVjdGVkIGZvciBtZXJnaW5nIGZyb20gdGhlaXIgcmVwb3NpdG9yaWVzLiAgSWYKK0xpbnVzIGFncmVlcywgdGhlIHN0cmVhbSBvZiBwYXRjaGVzIHdpbGwgZmxvdyB1cCBpbnRvIGhpcyByZXBvc2l0b3J5LAorYmVjb21pbmcgcGFydCBvZiB0aGUgbWFpbmxpbmUga2VybmVsLiAgVGhlIGFtb3VudCBvZiBhdHRlbnRpb24gdGhhdCBMaW51cworcGF5cyB0byBzcGVjaWZpYyBwYXRjaGVzIHJlY2VpdmVkIGluIGEgcHVsbCBvcGVyYXRpb24gdmFyaWVzLiAgSXQgaXMgY2xlYXIKK3RoYXQsIHNvbWV0aW1lcywgaGUgbG9va3MgcXVpdGUgY2xvc2VseS4gIEJ1dCwgYXMgYSBnZW5lcmFsIHJ1bGUsIExpbnVzCit0cnVzdHMgdGhlIHN1YnN5c3RlbSBtYWludGFpbmVycyB0byBub3Qgc2VuZCBiYWQgcGF0Y2hlcyB1cHN0cmVhbS4KKworU3Vic3lzdGVtIG1haW50YWluZXJzLCBpbiB0dXJuLCBjYW4gcHVsbCBwYXRjaGVzIGZyb20gb3RoZXIgbWFpbnRhaW5lcnMuCitGb3IgZXhhbXBsZSwgdGhlIG5ldHdvcmtpbmcgdHJlZSBpcyBidWlsdCBmcm9tIHBhdGNoZXMgd2hpY2ggYWNjdW11bGF0ZWQKK2ZpcnN0IGluIHRyZWVzIGRlZGljYXRlZCB0byBuZXR3b3JrIGRldmljZSBkcml2ZXJzLCB3aXJlbGVzcyBuZXR3b3JraW5nLAorZXRjLiAgVGhpcyBjaGFpbiBvZiByZXBvc2l0b3JpZXMgY2FuIGJlIGFyYml0cmFyaWx5IGxvbmcsIHRob3VnaCBpdCByYXJlbHkKK2V4Y2VlZHMgdHdvIG9yIHRocmVlIGxpbmtzLiAgU2luY2UgZWFjaCBtYWludGFpbmVyIGluIHRoZSBjaGFpbiB0cnVzdHMKK3Rob3NlIG1hbmFnaW5nIGxvd2VyLWxldmVsIHRyZWVzLCB0aGlzIHByb2Nlc3MgaXMga25vd24gYXMgdGhlICJjaGFpbiBvZgordHJ1c3QuIiAKKworQ2xlYXJseSwgaW4gYSBzeXN0ZW0gbGlrZSB0aGlzLCBnZXR0aW5nIHBhdGNoZXMgaW50byB0aGUga2VybmVsIGRlcGVuZHMgb24KK2ZpbmRpbmcgdGhlIHJpZ2h0IG1haW50YWluZXIuICBTZW5kaW5nIHBhdGNoZXMgZGlyZWN0bHkgdG8gTGludXMgaXMgbm90Citub3JtYWxseSB0aGUgcmlnaHQgd2F5IHRvIGdvLgorCisKKzIuNDogU1RBR0lORyBUUkVFUworCitUaGUgY2hhaW4gb2Ygc3Vic3lzdGVtIHRyZWVzIGd1aWRlcyB0aGUgZmxvdyBvZiBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCwKK2J1dCBpdCBhbHNvIHJhaXNlcyBhbiBpbnRlcmVzdGluZyBxdWVzdGlvbjogd2hhdCBpZiBzb21lYm9keSB3YW50cyB0byBsb29rCithdCBhbGwgb2YgdGhlIHBhdGNoZXMgd2hpY2ggYXJlIGJlaW5nIHByZXBhcmVkIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3c/CitEZXZlbG9wZXJzIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiB3aGF0IG90aGVyIGNoYW5nZXMgYXJlIHBlbmRpbmcgdG8gc2VlCit3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmxpY3RzIHRvIHdvcnJ5IGFib3V0OyBhIHBhdGNoIHdoaWNoIGNoYW5nZXMgYQorY29yZSBrZXJuZWwgZnVuY3Rpb24gcHJvdG90eXBlLCBmb3IgZXhhbXBsZSwgd2lsbCBjb25mbGljdCB3aXRoIGFueSBvdGhlcgorcGF0Y2hlcyB3aGljaCB1c2UgdGhlIG9sZGVyIGZvcm0gb2YgdGhhdCBmdW5jdGlvbi4gIFJldmlld2VycyBhbmQgdGVzdGVycword2FudCBhY2Nlc3MgdG8gdGhlIGNoYW5nZXMgaW4gdGhlaXIgaW50ZWdyYXRlZCBmb3JtIGJlZm9yZSBhbGwgb2YgdGhvc2UKK2NoYW5nZXMgbGFuZCBpbiB0aGUgbWFpbmxpbmUga2VybmVsLiAgT25lIGNvdWxkIHB1bGwgY2hhbmdlcyBmcm9tIGFsbCBvZgordGhlIGludGVyZXN0aW5nIHN1YnN5c3RlbSB0cmVlcywgYnV0IHRoYXQgd291bGQgYmUgYSBiaWcgYW5kIGVycm9yLXByb25lCitqb2IuCisKK1RoZSBhbnN3ZXIgY29tZXMgaW4gdGhlIGZvcm0gb2Ygc3RhZ2luZyB0cmVlcywgd2hlcmUgc3Vic3lzdGVtIHRyZWVzIGFyZQorY29sbGVjdGVkIGZvciB0ZXN0aW5nIGFuZCByZXZpZXcuICBUaGUgb2xkZXIgb2YgdGhlc2UgdHJlZXMsIG1haW50YWluZWQgYnkKK0FuZHJldyBNb3J0b24sIGlzIGNhbGxlZCAiLW1tIiAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCB3aGljaCBpcyBob3cgaXQgZ290CitzdGFydGVkKS4gIFRoZSAtbW0gdHJlZSBpbnRlZ3JhdGVzIHBhdGNoZXMgZnJvbSBhIGxvbmcgbGlzdCBvZiBzdWJzeXN0ZW0KK3RyZWVzOyBpdCBhbHNvIGhhcyBzb21lIHBhdGNoZXMgYWltZWQgYXQgaGVscGluZyB3aXRoIGRlYnVnZ2luZy4gIAorCitCZXlvbmQgdGhhdCwgLW1tIGNvbnRhaW5zIGEgc2lnbmlmaWNhbnQgY29sbGVjdGlvbiBvZiBwYXRjaGVzIHdoaWNoIGhhdmUKK2JlZW4gc2VsZWN0ZWQgYnkgQW5kcmV3IGRpcmVjdGx5LiAgVGhlc2UgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHBvc3RlZCBvbiBhCittYWlsaW5nIGxpc3QsIG9yIHRoZXkgbWF5IGFwcGx5IHRvIGEgcGFydCBvZiB0aGUga2VybmVsIGZvciB3aGljaCB0aGVyZSBpcworbm8gZGVzaWduYXRlZCBzdWJzeXN0ZW0gdHJlZS4gIEFzIGEgcmVzdWx0LCAtbW0gb3BlcmF0ZXMgYXMgYSBzb3J0IG9mCitzdWJzeXN0ZW0gdHJlZSBvZiBsYXN0IHJlc29ydDsgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb2J2aW91cyBwYXRoIGZvciBhCitwYXRjaCBpbnRvIHRoZSBtYWlubGluZSwgaXQgaXMgbGlrZWx5IHRvIGVuZCB1cCBpbiAtbW0uICBNaXNjZWxsYW5lb3VzCitwYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGUgaW4gLW1tIHdpbGwgZXZlbnR1YWxseSBlaXRoZXIgYmUgZm9yd2FyZGVkIG9uIHRvCithbiBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gdHJlZSBvciBiZSBzZW50IGRpcmVjdGx5IHRvIExpbnVzLiAgSW4gYSB0eXBpY2FsCitkZXZlbG9wbWVudCBjeWNsZSwgYXBwcm94aW1hdGVseSAxMCUgb2YgdGhlIHBhdGNoZXMgZ29pbmcgaW50byB0aGUgbWFpbmxpbmUKK2dldCB0aGVyZSB2aWEgLW1tLgorCitUaGUgY3VycmVudCAtbW0gcGF0Y2ggY2FuIGFsd2F5cyBiZSBmb3VuZCBmcm9tIHRoZSBmcm9udCBwYWdlIG9mCisKKwlodHRwOi8va2VybmVsLm9yZy8KKworVGhvc2Ugd2hvIHdhbnQgdG8gc2VlIHRoZSBjdXJyZW50IHN0YXRlIG9mIC1tbSBjYW4gZ2V0IHRoZSAiLW1tIG9mIHRoZQorbW9tZW50IiB0cmVlLCBmb3VuZCBhdDoKKworCWh0dHA6Ly91c2Vyd2ViLmtlcm5lbC5vcmcvfmFrcG0vbW1vdG0vCisKK1VzZSBvZiB0aGUgTU1PVE0gdHJlZSBpcyBsaWtlbHkgdG8gYmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlLCB0aG91Z2g7Cit0aGVyZSBpcyBhIGRlZmluaXRlIGNoYW5jZSB0aGF0IGl0IHdpbGwgbm90IGV2ZW4gY29tcGlsZS4KKworVGhlIG90aGVyIHN0YWdpbmcgdHJlZSwgc3RhcnRlZCBtb3JlIHJlY2VudGx5LCBpcyBsaW51eC1uZXh0LCBtYWludGFpbmVkIGJ5CitTdGVwaGVuIFJvdGh3ZWxsLiAgVGhlIGxpbnV4LW5leHQgdHJlZSBpcywgYnkgZGVzaWduLCBhIHNuYXBzaG90IG9mIHdoYXQKK3RoZSBtYWlubGluZSBpcyBleHBlY3RlZCB0byBsb29rIGxpa2UgYWZ0ZXIgdGhlIG5leHQgbWVyZ2Ugd2luZG93IGNsb3Nlcy4KK0xpbnV4LW5leHQgdHJlZXMgYXJlIGFubm91bmNlZCBvbiB0aGUgbGludXgta2VybmVsIGFuZCBsaW51eC1uZXh0IG1haWxpbmcKK2xpc3RzIHdoZW4gdGhleSBhcmUgYXNzZW1ibGVkOyB0aGV5IGNhbiBiZSBkb3dubG9hZGVkIGZyb206CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvc2ZyL2xpbnV4LW5leHQvCisKK1NvbWUgaW5mb3JtYXRpb24gYWJvdXQgbGludXgtbmV4dCBoYXMgYmVlbiBnYXRoZXJlZCBhdDoKKworCWh0dHA6Ly9saW51eC5mLXNlaWRlbC5kZS9saW51eC1uZXh0L3Btd2lraS8KKworSG93IHRoZSBsaW51eC1uZXh0IHRyZWUgd2lsbCBmaXQgaW50byB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpcyBzdGlsbAorY2hhbmdpbmcuICBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBmaXJzdCBmdWxsIGRldmVsb3BtZW50IGN5Y2xlIGludm9sdmluZworbGludXgtbmV4dCAoMi42LjI2KSBpcyBjb21pbmcgdG8gYW4gZW5kOyB0aHVzIGZhciwgaXQgaGFzIHByb3ZlZCB0byBiZSBhCit2YWx1YWJsZSByZXNvdXJjZSBmb3IgZmluZGluZyBhbmQgZml4aW5nIGludGVncmF0aW9uIHByb2JsZW1zIGJlZm9yZSB0aGUKK2JlZ2lubmluZyBvZiB0aGUgbWVyZ2Ugd2luZG93LiAgU2VlIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI4NzE1NS8gZm9yCittb3JlIGluZm9ybWF0aW9uIG9uIGhvdyBsaW51eC1uZXh0IGhhcyB3b3JrZWQgdG8gc2V0IHVwIHRoZSAyLjYuMjcgbWVyZ2UKK3dpbmRvdy4KKworU29tZSBkZXZlbG9wZXJzIGhhdmUgYmVndW4gdG8gc3VnZ2VzdCB0aGF0IGxpbnV4LW5leHQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlCit0YXJnZXQgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudCBhcyB3ZWxsLiAgVGhlIGxpbnV4LW5leHQgdHJlZSBkb2VzIHRlbmQgdG8gYmUKK2ZhciBhaGVhZCBvZiB0aGUgbWFpbmxpbmUgYW5kIGlzIG1vcmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIHRyZWUgaW50byB3aGljaAorYW55IG5ldyB3b3JrIHdpbGwgYmUgbWVyZ2VkLiAgVGhlIGRvd25zaWRlIHRvIHRoaXMgaWRlYSBpcyB0aGF0IHRoZQordm9sYXRpbGl0eSBvZiBsaW51eC1uZXh0IHRlbmRzIHRvIG1ha2UgaXQgYSBkaWZmaWN1bHQgZGV2ZWxvcG1lbnQgdGFyZ2V0LgorU2VlIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI4OTAxMy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYywgYW5kCitzdGF5IHR1bmVkOyBtdWNoIGlzIHN0aWxsIGluIGZsdXggd2hlcmUgbGludXgtbmV4dCBpcyBpbnZvbHZlZC4KKworCisyLjU6IFRPT0xTCisKK0FzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGFib3ZlIHRleHQsIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZXBlbmRzCitoZWF2aWx5IG9uIHRoZSBhYmlsaXR5IHRvIGhlcmQgY29sbGVjdGlvbnMgb2YgcGF0Y2hlcyBpbiB2YXJpb3VzCitkaXJlY3Rpb25zLiAgVGhlIHdob2xlIHRoaW5nIHdvdWxkIG5vdCB3b3JrIGFueXdoZXJlIG5lYXIgYXMgd2VsbCBhcyBpdAorZG9lcyB3aXRob3V0IHN1aXRhYmx5IHBvd2VyZnVsIHRvb2xzLiAgVHV0b3JpYWxzIG9uIGhvdyB0byB1c2UgdGhlc2UgdG9vbHMKK2FyZSB3ZWxsIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudCwgYnV0IHRoZXJlIGlzIHNwYWNlIGZvciBhIGZldworcG9pbnRlcnMuCisKK0J5IGZhciB0aGUgZG9taW5hbnQgc291cmNlIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW0gdXNlZCBieSB0aGUga2VybmVsCitjb21tdW5pdHkgaXMgZ2l0LiAgR2l0IGlzIG9uZSBvZiBhIG51bWJlciBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wKK3N5c3RlbXMgYmVpbmcgZGV2ZWxvcGVkIGluIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eS4gIEl0IGlzIHdlbGwgdHVuZWQKK2ZvciBrZXJuZWwgZGV2ZWxvcG1lbnQsIGluIHRoYXQgaXQgcGVyZm9ybXMgcXVpdGUgd2VsbCB3aGVuIGRlYWxpbmcgd2l0aAorbGFyZ2UgcmVwb3NpdG9yaWVzIGFuZCBsYXJnZSBudW1iZXJzIG9mIHBhdGNoZXMuICBJdCBhbHNvIGhhcyBhIHJlcHV0YXRpb24KK2ZvciBiZWluZyBkaWZmaWN1bHQgdG8gbGVhcm4gYW5kIHVzZSwgdGhvdWdoIGl0IGhhcyBnb3R0ZW4gYmV0dGVyIG92ZXIKK3RpbWUuICBTb21lIHNvcnQgb2YgZmFtaWxpYXJpdHkgd2l0aCBnaXQgaXMgYWxtb3N0IGEgcmVxdWlyZW1lbnQgZm9yIGtlcm5lbAorZGV2ZWxvcGVyczsgZXZlbiBpZiB0aGV5IGRvIG5vdCB1c2UgaXQgZm9yIHRoZWlyIG93biB3b3JrLCB0aGV5J2xsIG5lZWQgZ2l0Cit0byBrZWVwIHVwIHdpdGggd2hhdCBvdGhlciBkZXZlbG9wZXJzIChhbmQgdGhlIG1haW5saW5lKSBhcmUgZG9pbmcuCisKK0dpdCBpcyBub3cgcGFja2FnZWQgYnkgYWxtb3N0IGFsbCBMaW51eCBkaXN0cmlidXRpb25zLiAgVGhlcmUgaXMgYSBob21lCitwYWdlIGF0IAorCisJaHR0cDovL2dpdC5vci5jei8KKworVGhhdCBwYWdlIGhhcyBwb2ludGVycyB0byBkb2N1bWVudGF0aW9uIGFuZCB0dXRvcmlhbHMuICBPbmUgc2hvdWxkIGJlCithd2FyZSwgaW4gcGFydGljdWxhciwgb2YgdGhlIEtlcm5lbCBIYWNrZXIncyBHdWlkZSB0byBnaXQsIHdoaWNoIGhhcworaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8ga2VybmVsIGRldmVsb3BtZW50OgorCisJaHR0cDovL2xpbnV4Lnl5ei51cy9naXQtaG93dG8uaHRtbAorCitBbW9uZyB0aGUga2VybmVsIGRldmVsb3BlcnMgd2hvIGRvIG5vdCB1c2UgZ2l0LCB0aGUgbW9zdCBwb3B1bGFyIGNob2ljZSBpcworYWxtb3N0IGNlcnRhaW5seSBNZXJjdXJpYWw6CisKKwlodHRwOi8vd3d3LnNlbGVuaWMuY29tL21lcmN1cmlhbC8KKworTWVyY3VyaWFsIHNoYXJlcyBtYW55IGZlYXR1cmVzIHdpdGggZ2l0LCBidXQgaXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHdoaWNoCittYW55IGZpbmQgZWFzaWVyIHRvIHVzZS4KKworVGhlIG90aGVyIHRvb2wgd29ydGgga25vd2luZyBhYm91dCBpcyBRdWlsdDoKKworCWh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0LworCitRdWlsdCBpcyBhIHBhdGNoIG1hbmFnZW1lbnQgc3lzdGVtLCByYXRoZXIgdGhhbiBhIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQKK3N5c3RlbS4gIEl0IGRvZXMgbm90IHRyYWNrIGhpc3Rvcnkgb3ZlciB0aW1lOyBpdCBpcywgaW5zdGVhZCwgb3JpZW50ZWQKK3Rvd2FyZCB0cmFja2luZyBhIHNwZWNpZmljIHNldCBvZiBjaGFuZ2VzIGFnYWluc3QgYW4gZXZvbHZpbmcgY29kZSBiYXNlLgorU29tZSBtYWpvciBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgdXNlIHF1aWx0IHRvIG1hbmFnZSBwYXRjaGVzIGludGVuZGVkIHRvIGdvCit1cHN0cmVhbS4gIEZvciB0aGUgbWFuYWdlbWVudCBvZiBjZXJ0YWluIGtpbmRzIG9mIHRyZWVzICgtbW0sIGZvciBleGFtcGxlKSwKK3F1aWx0IGlzIHRoZSBiZXN0IHRvb2wgZm9yIHRoZSBqb2IuCisKKworMi42OiBNQUlMSU5HIExJU1RTCisKK0EgZ3JlYXQgZGVhbCBvZiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgd29yayBpcyBkb25lIGJ5IHdheSBvZiBtYWlsaW5nCitsaXN0cy4gIEl0IGlzIGhhcmQgdG8gYmUgYSBmdWxseS1mdW5jdGlvbmluZyBtZW1iZXIgb2YgdGhlIGNvbW11bml0eQord2l0aG91dCBqb2luaW5nIGF0IGxlYXN0IG9uZSBsaXN0IHNvbWV3aGVyZS4gIEJ1dCBMaW51eCBtYWlsaW5nIGxpc3RzIGFsc28KK3JlcHJlc2VudCBhIHBvdGVudGlhbCBoYXphcmQgdG8gZGV2ZWxvcGVycywgd2hvIHJpc2sgZ2V0dGluZyBidXJpZWQgdW5kZXIgYQorbG9hZCBvZiBlbGVjdHJvbmljIG1haWwsIHJ1bm5pbmcgYWZvdWwgb2YgdGhlIGNvbnZlbnRpb25zIHVzZWQgb24gdGhlIExpbnV4CitsaXN0cywgb3IgYm90aC4KKworTW9zdCBrZXJuZWwgbWFpbGluZyBsaXN0cyBhcmUgcnVuIG9uIHZnZXIua2VybmVsLm9yZzsgdGhlIG1hc3RlciBsaXN0IGNhbgorYmUgZm91bmQgYXQ6CisKKwlodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbAorCitUaGVyZSBhcmUgbGlzdHMgaG9zdGVkIGVsc2V3aGVyZSwgdGhvdWdoOyBhIG51bWJlciBvZiB0aGVtIGFyZSBhdAorbGlzdHMucmVkaGF0LmNvbS4KKworVGhlIGNvcmUgbWFpbGluZyBsaXN0IGZvciBrZXJuZWwgZGV2ZWxvcG1lbnQgaXMsIG9mIGNvdXJzZSwgbGludXgta2VybmVsLgorVGhpcyBsaXN0IGlzIGFuIGludGltaWRhdGluZyBwbGFjZSB0byBiZTsgdm9sdW1lIGNhbiByZWFjaCA1MDAgbWVzc2FnZXMgcGVyCitkYXksIHRoZSBhbW91bnQgb2Ygbm9pc2UgaXMgaGlnaCwgdGhlIGNvbnZlcnNhdGlvbiBjYW4gYmUgc2V2ZXJlbHkKK3RlY2huaWNhbCwgYW5kIHBhcnRpY2lwYW50cyBhcmUgbm90IGFsd2F5cyBjb25jZXJuZWQgd2l0aCBzaG93aW5nIGEgaGlnaAorZGVncmVlIG9mIHBvbGl0ZW5lc3MuICBCdXQgdGhlcmUgaXMgbm8gb3RoZXIgcGxhY2Ugd2hlcmUgdGhlIGtlcm5lbAorZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGNvbWVzIHRvZ2V0aGVyIGFzIGEgd2hvbGU7IGRldmVsb3BlcnMgd2hvIGF2b2lkIHRoaXMKK2xpc3Qgd2lsbCBtaXNzIGltcG9ydGFudCBpbmZvcm1hdGlvbi4KKworVGhlcmUgYXJlIGEgZmV3IGhpbnRzIHdoaWNoIGNhbiBoZWxwIHdpdGggbGludXgta2VybmVsIHN1cnZpdmFsOgorCistIEhhdmUgdGhlIGxpc3QgZGVsaXZlcmVkIHRvIGEgc2VwYXJhdGUgZm9sZGVyLCByYXRoZXIgdGhhbiB5b3VyIG1haW4KKyAgbWFpbGJveC4gIE9uZSBtdXN0IGJlIGFibGUgdG8gaWdub3JlIHRoZSBzdHJlYW0gZm9yIHN1c3RhaW5lZCBwZXJpb2RzIG9mCisgIHRpbWUuCisKKy0gRG8gbm90IHRyeSB0byBmb2xsb3cgZXZlcnkgY29udmVyc2F0aW9uIC0gbm9ib2R5IGVsc2UgZG9lcy4gIEl0IGlzCisgIGltcG9ydGFudCB0byBmaWx0ZXIgb24gYm90aCB0aGUgdG9waWMgb2YgaW50ZXJlc3QgKHRob3VnaCBub3RlIHRoYXQKKyAgbG9uZy1ydW5uaW5nIGNvbnZlcnNhdGlvbnMgY2FuIGRyaWZ0IGF3YXkgZnJvbSB0aGUgb3JpZ2luYWwgc3ViamVjdAorICB3aXRob3V0IGNoYW5naW5nIHRoZSBlbWFpbCBzdWJqZWN0IGxpbmUpIGFuZCB0aGUgcGVvcGxlIHdobyBhcmUKKyAgcGFydGljaXBhdGluZy4gIAorCistIERvIG5vdCBmZWVkIHRoZSB0cm9sbHMuICBJZiBzb21lYm9keSBpcyB0cnlpbmcgdG8gc3RpciB1cCBhbiBhbmdyeQorICByZXNwb25zZSwgaWdub3JlIHRoZW0uCisKKy0gV2hlbiByZXNwb25kaW5nIHRvIGxpbnV4LWtlcm5lbCBlbWFpbCAob3IgdGhhdCBvbiBvdGhlciBsaXN0cykgcHJlc2VydmUKKyAgdGhlIENjOiBoZWFkZXIgZm9yIGFsbCBpbnZvbHZlZC4gIEluIHRoZSBhYnNlbmNlIG9mIGEgc3Ryb25nIHJlYXNvbiAoc3VjaAorICBhcyBhbiBleHBsaWNpdCByZXF1ZXN0KSwgeW91IHNob3VsZCBuZXZlciByZW1vdmUgcmVjaXBpZW50cy4gIEFsd2F5cyBtYWtlCisgIHN1cmUgdGhhdCB0aGUgcGVyc29uIHlvdSBhcmUgcmVzcG9uZGluZyB0byBpcyBpbiB0aGUgQ2M6IGxpc3QuICBUaGlzCisgIGNvbnZlbnRpb24gYWxzbyBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGFzayB0byBiZSBjb3BpZWQgb24KKyAgcmVwbGllcyB0byB5b3VyIHBvc3RpbmdzLgorCistIFNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyAoYW5kIHRoZSBuZXQgYXMgYSB3aG9sZSkgYmVmb3JlIGFza2luZworICBxdWVzdGlvbnMuICBTb21lIGRldmVsb3BlcnMgY2FuIGdldCBpbXBhdGllbnQgd2l0aCBwZW9wbGUgd2hvIGNsZWFybHkKKyAgaGF2ZSBub3QgZG9uZSB0aGVpciBob21ld29yay4KKworLSBBdm9pZCB0b3AtcG9zdGluZyAodGhlIHByYWN0aWNlIG9mIHB1dHRpbmcgeW91ciBhbnN3ZXIgYWJvdmUgdGhlIHF1b3RlZAorICB0ZXh0IHlvdSBhcmUgcmVzcG9uZGluZyB0bykuICBJdCBtYWtlcyB5b3VyIHJlc3BvbnNlIGhhcmRlciB0byByZWFkIGFuZAorICBtYWtlcyBhIHBvb3IgaW1wcmVzc2lvbi4KKworLSBBc2sgb24gdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0LiAgTGludXgta2VybmVsIG1heSBiZSB0aGUgZ2VuZXJhbCBtZWV0aW5nCisgIHBvaW50LCBidXQgaXQgaXMgbm90IHRoZSBiZXN0IHBsYWNlIHRvIGZpbmQgZGV2ZWxvcGVycyBmcm9tIGFsbAorICBzdWJzeXN0ZW1zLgorCitUaGUgbGFzdCBwb2ludCAtIGZpbmRpbmcgdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0IC0gaXMgYSBjb21tb24gcGxhY2UgZm9yCitiZWdpbm5pbmcgZGV2ZWxvcGVycyB0byBnbyB3cm9uZy4gIFNvbWVib2R5IHdobyBhc2tzIGEgbmV0d29ya2luZy1yZWxhdGVkCitxdWVzdGlvbiBvbiBsaW51eC1rZXJuZWwgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlY2VpdmUgYSBwb2xpdGUgc3VnZ2VzdGlvbgordG8gYXNrIG9uIHRoZSBuZXRkZXYgbGlzdCBpbnN0ZWFkLCBhcyB0aGF0IGlzIHRoZSBsaXN0IGZyZXF1ZW50ZWQgYnkgbW9zdAorbmV0d29ya2luZyBkZXZlbG9wZXJzLiAgT3RoZXIgbGlzdHMgZXhpc3QgZm9yIHRoZSBTQ1NJLCB2aWRlbzRsaW51eCwgSURFLAorZmlsZXN5c3RlbSwgZXRjLiBzdWJzeXN0ZW1zLiAgVGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmb3IgbWFpbGluZyBsaXN0cyBpcworaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgcGFja2FnZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZS4KKworCisyLjc6IEdFVFRJTkcgU1RBUlRFRCBXSVRIIEtFUk5FTCBERVZFTE9QTUVOVAorCitRdWVzdGlvbnMgYWJvdXQgaG93IHRvIGdldCBzdGFydGVkIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGFyZQorY29tbW9uIC0gZnJvbSBib3RoIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMuICBFcXVhbGx5IGNvbW1vbiBhcmUgbWlzc3RlcHMKK3doaWNoIG1ha2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGhhcmRlciB0aGFuIGl0IGhhcyB0byBiZS4KKworQ29tcGFuaWVzIG9mdGVuIGxvb2sgdG8gaGlyZSB3ZWxsLWtub3duIGRldmVsb3BlcnMgdG8gZ2V0IGEgZGV2ZWxvcG1lbnQKK2dyb3VwIHN0YXJ0ZWQuICBUaGlzIGNhbiwgaW4gZmFjdCwgYmUgYW4gZWZmZWN0aXZlIHRlY2huaXF1ZS4gIEJ1dCBpdCBhbHNvCit0ZW5kcyB0byBiZSBleHBlbnNpdmUgYW5kIGRvZXMgbm90IGRvIG11Y2ggdG8gZ3JvdyB0aGUgcG9vbCBvZiBleHBlcmllbmNlZAora2VybmVsIGRldmVsb3BlcnMuICBJdCBpcyBwb3NzaWJsZSB0byBicmluZyBpbi1ob3VzZSBkZXZlbG9wZXJzIHVwIHRvIHNwZWVkCitvbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIGdpdmVuIHRoZSBpbnZlc3RtZW50IG9mIGEgYml0IG9mIHRpbWUuICBUYWtpbmcKK3RoaXMgdGltZSBjYW4gZW5kb3cgYW4gZW1wbG95ZXIgd2l0aCBhIGdyb3VwIG9mIGRldmVsb3BlcnMgd2hvIHVuZGVyc3RhbmQKK3RoZSBrZXJuZWwgYW5kIHRoZSBjb21wYW55IGJvdGgsIGFuZCB3aG8gY2FuIGhlbHAgdG8gdHJhaW4gb3RoZXJzIGFzIHdlbGwuCitPdmVyIHRoZSBtZWRpdW0gdGVybSwgdGhpcyBpcyBvZnRlbiB0aGUgbW9yZSBwcm9maXRhYmxlIGFwcHJvYWNoLgorCitJbmRpdmlkdWFsIGRldmVsb3BlcnMgYXJlIG9mdGVuLCB1bmRlcnN0YW5kYWJseSwgYXQgYSBsb3NzIGZvciBhIHBsYWNlIHRvCitzdGFydC4gIEJlZ2lubmluZyB3aXRoIGEgbGFyZ2UgcHJvamVjdCBjYW4gYmUgaW50aW1pZGF0aW5nOyBvbmUgb2Z0ZW4gd2FudHMKK3RvIHRlc3QgdGhlIHdhdGVycyB3aXRoIHNvbWV0aGluZyBzbWFsbGVyIGZpcnN0LiAgVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUKK3NvbWUgZGV2ZWxvcGVycyBqdW1wIGludG8gdGhlIGNyZWF0aW9uIG9mIHBhdGNoZXMgZml4aW5nIHNwZWxsaW5nIGVycm9ycyBvcgorbWlub3IgY29kaW5nIHN0eWxlIGlzc3Vlcy4gIFVuZm9ydHVuYXRlbHksIHN1Y2ggcGF0Y2hlcyBjcmVhdGUgYSBsZXZlbCBvZgorbm9pc2Ugd2hpY2ggaXMgZGlzdHJhY3RpbmcgZm9yIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZSwgc28sCitpbmNyZWFzaW5nbHksIHRoZXkgYXJlIGxvb2tlZCBkb3duIHVwb24uICBOZXcgZGV2ZWxvcGVycyB3aXNoaW5nIHRvCitpbnRyb2R1Y2UgdGhlbXNlbHZlcyB0byB0aGUgY29tbXVuaXR5IHdpbGwgbm90IGdldCB0aGUgc29ydCBvZiByZWNlcHRpb24KK3RoZXkgd2lzaCBmb3IgYnkgdGhlc2UgbWVhbnMuCisKK0FuZHJldyBNb3J0b24gZ2l2ZXMgdGhpcyBhZHZpY2UgZm9yIGFzcGlyaW5nIGtlcm5lbCBkZXZlbG9wZXJzCisKKwlUaGUgIzEgcHJvamVjdCBmb3IgYWxsIGtlcm5lbCBiZWdpbm5lcnMgc2hvdWxkIHN1cmVseSBiZSAibWFrZSBzdXJlCisJdGhhdCB0aGUga2VybmVsIHJ1bnMgcGVyZmVjdGx5IGF0IGFsbCB0aW1lcyBvbiBhbGwgbWFjaGluZXMgd2hpY2gKKwl5b3UgY2FuIGxheSB5b3VyIGhhbmRzIG9uIi4gIFVzdWFsbHkgdGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHdvcmsKKwl3aXRoIG90aGVycyBvbiBnZXR0aW5nIHRoaW5ncyBmaXhlZCB1cCAodGhpcyBjYW4gcmVxdWlyZQorCXBlcnNpc3RlbmNlISkgYnV0IHRoYXQncyBmaW5lIC0gaXQncyBhIHBhcnQgb2Yga2VybmVsIGRldmVsb3BtZW50LgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjgzOTgyLykuCisKK0luIHRoZSBhYnNlbmNlIG9mIG9idmlvdXMgcHJvYmxlbXMgdG8gZml4LCBkZXZlbG9wZXJzIGFyZSBhZHZpc2VkIHRvIGxvb2sKK2F0IHRoZSBjdXJyZW50IGxpc3RzIG9mIHJlZ3Jlc3Npb25zIGFuZCBvcGVuIGJ1Z3MgaW4gZ2VuZXJhbC4gIFRoZXJlIGlzCituZXZlciBhbnkgc2hvcnRhZ2Ugb2YgaXNzdWVzIGluIG5lZWQgb2YgZml4aW5nOyBieSBhZGRyZXNzaW5nIHRoZXNlIGlzc3VlcywKK2RldmVsb3BlcnMgd2lsbCBnYWluIGV4cGVyaWVuY2Ugd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSwgYXQgdGhlIHNhbWUgdGltZSwKK2J1aWxkaW5nIHJlc3BlY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzMuRWFybHktc3RhZ2UgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDdhMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzMuRWFybHktc3RhZ2UKQEAgLTAsMCArMSwxOTUgQEAKKzM6IEVBUkxZLVNUQUdFIFBMQU5OSU5HCisKK1doZW4gY29udGVtcGxhdGluZyBhIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCBpdCBjYW4gYmUgdGVtcHRpbmcKK3RvIGp1bXAgcmlnaHQgaW4gYW5kIHN0YXJ0IGNvZGluZy4gIEFzIHdpdGggYW55IHNpZ25pZmljYW50IHByb2plY3QsCit0aG91Z2gsIG11Y2ggb2YgdGhlIGdyb3VuZHdvcmsgZm9yIHN1Y2Nlc3MgaXMgYmVzdCBsYWlkIGJlZm9yZSB0aGUgZmlyc3QKK2xpbmUgb2YgY29kZSBpcyB3cml0dGVuLiAgU29tZSB0aW1lIHNwZW50IGluIGVhcmx5IHBsYW5uaW5nIGFuZAorY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSBmYXIgbW9yZSB0aW1lIGxhdGVyIG9uLgorCisKKzMuMTogU1BFQ0lGWUlORyBUSEUgUFJPQkxFTQorCitMaWtlIGFueSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhIHN1Y2Nlc3NmdWwga2VybmVsIGVuaGFuY2VtZW50IHN0YXJ0cyB3aXRoIGEKK2NsZWFyIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gIEluIHNvbWUgY2FzZXMsIHRoaXMgc3RlcCBpcworZWFzeTogd2hlbiBhIGRyaXZlciBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgaGFyZHdhcmUsIGZvcgorZXhhbXBsZS4gIEluIG90aGVycywgdGhvdWdoLCBpdCBpcyB0ZW1wdGluZyB0byBjb25mdXNlIHRoZSByZWFsIHByb2JsZW0KK3dpdGggdGhlIHByb3Bvc2VkIHNvbHV0aW9uLCBhbmQgdGhhdCBjYW4gbGVhZCB0byBkaWZmaWN1bHRpZXMuCisKK0NvbnNpZGVyIGFuIGV4YW1wbGU6IHNvbWUgeWVhcnMgYWdvLCBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCBMaW51eCBhdWRpbworc291Z2h0IGEgd2F5IHRvIHJ1biBhcHBsaWNhdGlvbnMgd2l0aG91dCBkcm9wb3V0cyBvciBvdGhlciBhcnRpZmFjdHMgY2F1c2VkCitieSBleGNlc3NpdmUgbGF0ZW5jeSBpbiB0aGUgc3lzdGVtLiAgVGhlIHNvbHV0aW9uIHRoZXkgYXJyaXZlZCBhdCB3YXMgYQora2VybmVsIG1vZHVsZSBpbnRlbmRlZCB0byBob29rIGludG8gdGhlIExpbnV4IFNlY3VyaXR5IE1vZHVsZSAoTFNNKQorZnJhbWV3b3JrOyB0aGlzIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmVkIHRvIGdpdmUgc3BlY2lmaWMgYXBwbGljYXRpb25zCithY2Nlc3MgdG8gdGhlIHJlYWx0aW1lIHNjaGVkdWxlci4gIFRoaXMgbW9kdWxlIHdhcyBpbXBsZW1lbnRlZCBhbmQgc2VudCB0bwordGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QsIHdoZXJlIGl0IGltbWVkaWF0ZWx5IHJhbiBpbnRvIHByb2JsZW1zLgorCitUbyB0aGUgYXVkaW8gZGV2ZWxvcGVycywgdGhpcyBzZWN1cml0eSBtb2R1bGUgd2FzIHN1ZmZpY2llbnQgdG8gc29sdmUgdGhlaXIKK2ltbWVkaWF0ZSBwcm9ibGVtLiAgVG8gdGhlIHdpZGVyIGtlcm5lbCBjb21tdW5pdHksIHRob3VnaCwgaXQgd2FzIHNlZW4gYXMgYQorbWlzdXNlIG9mIHRoZSBMU00gZnJhbWV3b3JrICh3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gY29uZmVyIHByaXZpbGVnZXMKK29udG8gcHJvY2Vzc2VzIHdoaWNoIHRoZXkgd291bGQgbm90IG90aGVyd2lzZSBoYXZlKSBhbmQgYSByaXNrIHRvIHN5c3RlbQorc3RhYmlsaXR5LiAgVGhlaXIgcHJlZmVycmVkIHNvbHV0aW9ucyBpbnZvbHZlZCByZWFsdGltZSBzY2hlZHVsaW5nIGFjY2VzcwordmlhIHRoZSBybGltaXQgbWVjaGFuaXNtIGZvciB0aGUgc2hvcnQgdGVybSwgYW5kIG9uZ29pbmcgbGF0ZW5jeSByZWR1Y3Rpb24KK3dvcmsgaW4gdGhlIGxvbmcgdGVybS4KKworVGhlIGF1ZGlvIGNvbW11bml0eSwgaG93ZXZlciwgY291bGQgbm90IHNlZSBwYXN0IHRoZSBwYXJ0aWN1bGFyIHNvbHV0aW9uCit0aGV5IGhhZCBpbXBsZW1lbnRlZDsgdGhleSB3ZXJlIHVud2lsbGluZyB0byBhY2NlcHQgYWx0ZXJuYXRpdmVzLiAgVGhlCityZXN1bHRpbmcgZGlzYWdyZWVtZW50IGxlZnQgdGhvc2UgZGV2ZWxvcGVycyBmZWVsaW5nIGRpc2lsbHVzaW9uZWQgd2l0aCB0aGUKK2VudGlyZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2Vzczsgb25lIG9mIHRoZW0gd2VudCBiYWNrIHRvIGFuIGF1ZGlvIGxpc3QKK2FuZCBwb3N0ZWQgdGhpczoKKworCVRoZXJlIGFyZSBhIG51bWJlciBvZiB2ZXJ5IGdvb2QgTGludXgga2VybmVsIGRldmVsb3BlcnMsIGJ1dCB0aGV5CisJdGVuZCB0byBnZXQgb3V0c2hvdXRlZCBieSBhIGxhcmdlIGNyb3dkIG9mIGFycm9nYW50IGZvb2xzLiBUcnlpbmcKKwl0byBjb21tdW5pY2F0ZSB1c2VyIHJlcXVpcmVtZW50cyB0byB0aGVzZSBwZW9wbGUgaXMgYSB3YXN0ZSBvZgorCXRpbWUuIFRoZXkgYXJlIG11Y2ggdG9vICJpbnRlbGxpZ2VudCIgdG8gbGlzdGVuIHRvIGxlc3NlciBtb3J0YWxzLgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMTMxNzc2LykuCisKK1RoZSByZWFsaXR5IG9mIHRoZSBzaXR1YXRpb24gd2FzIGRpZmZlcmVudDsgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdlcmUgZmFyCittb3JlIGNvbmNlcm5lZCBhYm91dCBzeXN0ZW0gc3RhYmlsaXR5LCBsb25nLXRlcm0gbWFpbnRlbmFuY2UsIGFuZCBmaW5kaW5nCit0aGUgcmlnaHQgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gdGhhbiB0aGV5IHdlcmUgd2l0aCBhIHNwZWNpZmljIG1vZHVsZS4KK1RoZSBtb3JhbCBvZiB0aGUgc3RvcnkgaXMgdG8gZm9jdXMgb24gdGhlIHByb2JsZW0gLSBub3QgYSBzcGVjaWZpYyBzb2x1dGlvbgorLSBhbmQgdG8gZGlzY3VzcyBpdCB3aXRoIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYmVmb3JlIGludmVzdGluZyBpbiB0aGUKK2NyZWF0aW9uIG9mIGEgYm9keSBvZiBjb2RlLgorCitTbywgd2hlbiBjb250ZW1wbGF0aW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIG9uZSBzaG91bGQgb2J0YWluCithbnN3ZXJzIHRvIGEgc2hvcnQgc2V0IG9mIHF1ZXN0aW9uczoKKworIC0gV2hhdCwgZXhhY3RseSwgaXMgdGhlIHByb2JsZW0gd2hpY2ggbmVlZHMgdG8gYmUgc29sdmVkPworCisgLSBXaG8gYXJlIHRoZSB1c2VycyBhZmZlY3RlZCBieSB0aGlzIHByb2JsZW0/ICBXaGljaCB1c2UgY2FzZXMgc2hvdWxkIHRoZQorICAgc29sdXRpb24gYWRkcmVzcz8KKworIC0gSG93IGRvZXMgdGhlIGtlcm5lbCBmYWxsIHNob3J0IGluIGFkZHJlc3NpbmcgdGhhdCBwcm9ibGVtIG5vdz8KKworT25seSB0aGVuIGRvZXMgaXQgbWFrZSBzZW5zZSB0byBzdGFydCBjb25zaWRlcmluZyBwb3NzaWJsZSBzb2x1dGlvbnMuCisKKworMy4yOiBFQVJMWSBESVNDVVNTSU9OCisKK1doZW4gcGxhbm5pbmcgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgbWFrZXMgZ3JlYXQgc2Vuc2UgdG8gaG9sZAorZGlzY3Vzc2lvbnMgd2l0aCB0aGUgY29tbXVuaXR5IGJlZm9yZSBsYXVuY2hpbmcgaW50byBpbXBsZW1lbnRhdGlvbi4gIEVhcmx5Citjb21tdW5pY2F0aW9uIGNhbiBzYXZlIHRpbWUgYW5kIHRyb3VibGUgaW4gYSBudW1iZXIgb2Ygd2F5czoKKworIC0gSXQgbWF5IHdlbGwgYmUgdGhhdCB0aGUgcHJvYmxlbSBpcyBhZGRyZXNzZWQgYnkgdGhlIGtlcm5lbCBpbiB3YXlzIHdoaWNoCisgICB5b3UgaGF2ZSBub3QgdW5kZXJzdG9vZC4gIFRoZSBMaW51eCBrZXJuZWwgaXMgbGFyZ2UgYW5kIGhhcyBhIG51bWJlciBvZgorICAgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcyB3aGljaCBhcmUgbm90IGltbWVkaWF0ZWx5IG9idmlvdXMuICBOb3QgYWxsCisgICBrZXJuZWwgY2FwYWJpbGl0aWVzIGFyZSBkb2N1bWVudGVkIGFzIHdlbGwgYXMgb25lIG1pZ2h0IGxpa2UsIGFuZCBpdCBpcworICAgZWFzeSB0byBtaXNzIHRoaW5ncy4gIFlvdXIgYXV0aG9yIGhhcyBzZWVuIHRoZSBwb3N0aW5nIG9mIGEgY29tcGxldGUKKyAgIGRyaXZlciB3aGljaCBkdXBsaWNhdGVkIGFuIGV4aXN0aW5nIGRyaXZlciB0aGF0IHRoZSBuZXcgYXV0aG9yIGhhZCBiZWVuCisgICB1bmF3YXJlIG9mLiAgQ29kZSB3aGljaCByZWludmVudHMgZXhpc3Rpbmcgd2hlZWxzIGlzIG5vdCBvbmx5IHdhc3RlZnVsOworICAgaXQgd2lsbCBhbHNvIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCisKKyAtIFRoZXJlIG1heSBiZSBlbGVtZW50cyBvZiB0aGUgcHJvcG9zZWQgc29sdXRpb24gd2hpY2ggd2lsbCBub3QgYmUKKyAgIGFjY2VwdGFibGUgZm9yIG1haW5saW5lIG1lcmdpbmcuICBJdCBpcyBiZXR0ZXIgdG8gZmluZCBvdXQgYWJvdXQKKyAgIHByb2JsZW1zIGxpa2UgdGhpcyBiZWZvcmUgd3JpdGluZyB0aGUgY29kZS4KKworIC0gSXQncyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IG90aGVyIGRldmVsb3BlcnMgaGF2ZSB0aG91Z2h0IGFib3V0IHRoZQorICAgcHJvYmxlbTsgdGhleSBtYXkgaGF2ZSBpZGVhcyBmb3IgYSBiZXR0ZXIgc29sdXRpb24sIGFuZCBtYXkgYmUgd2lsbGluZworICAgdG8gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgdGhhdCBzb2x1dGlvbi4KKworWWVhcnMgb2YgZXhwZXJpZW5jZSB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGhhdmUgdGF1Z2h0IGEKK2NsZWFyIGxlc3Nvbjoga2VybmVsIGNvZGUgd2hpY2ggaXMgZGVzaWduZWQgYW5kIGRldmVsb3BlZCBiZWhpbmQgY2xvc2VkCitkb29ycyBpbnZhcmlhYmx5IGhhcyBwcm9ibGVtcyB3aGljaCBhcmUgb25seSByZXZlYWxlZCB3aGVuIHRoZSBjb2RlIGlzCityZWxlYXNlZCBpbnRvIHRoZSBjb21tdW5pdHkuICBTb21ldGltZXMgdGhlc2UgcHJvYmxlbXMgYXJlIHNldmVyZSwKK3JlcXVpcmluZyBtb250aHMgb3IgeWVhcnMgb2YgZWZmb3J0IGJlZm9yZSB0aGUgY29kZSBjYW4gYmUgYnJvdWdodCB1cCB0bwordGhlIGtlcm5lbCBjb21tdW5pdHkncyBzdGFuZGFyZHMuICBTb21lIGV4YW1wbGVzIGluY2x1ZGU6CisKKyAtIFRoZSBEZXZpY2VzY2FwZSBuZXR3b3JrIHN0YWNrIHdhcyBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgZm9yCisgICBzaW5nbGUtcHJvY2Vzc29yIHN5c3RlbXMuICBJdCBjb3VsZCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lCisgICB1bnRpbCBpdCB3YXMgbWFkZSBzdWl0YWJsZSBmb3IgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIFJldHJvZml0dGluZworICAgbG9ja2luZyBhbmQgc3VjaCBpbnRvIGNvZGUgaXMgYSBkaWZmaWN1bHQgdGFzazsgYXMgYSByZXN1bHQsIHRoZSBtZXJnaW5nCisgICBvZiB0aGlzIGNvZGUgKG5vdyBjYWxsZWQgbWFjODAyMTEpIHdhcyBkZWxheWVkIGZvciBvdmVyIGEgeWVhci4KKworIC0gVGhlIFJlaXNlcjQgZmlsZXN5c3RlbSBpbmNsdWRlZCBhIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgd2hpY2gsIGluIHRoZQorICAgY29yZSBrZXJuZWwgZGV2ZWxvcGVycycgb3Bpbmlvbiwgc2hvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgIHZpcnR1YWwgZmlsZXN5c3RlbSBsYXllciBpbnN0ZWFkLiAgSXQgYWxzbyBpbmNsdWRlZCBmZWF0dXJlcyB3aGljaCBjb3VsZAorICAgbm90IGVhc2lseSBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGV4cG9zaW5nIHRoZSBzeXN0ZW0gdG8gdXNlci1jYXVzZWQKKyAgIGRlYWRsb2Nrcy4gIFRoZSBsYXRlIHJldmVsYXRpb24gb2YgdGhlc2UgcHJvYmxlbXMgLSBhbmQgcmVmdXNhbCB0bworICAgYWRkcmVzcyBzb21lIG9mIHRoZW0gLSBoYXMgY2F1c2VkIFJlaXNlcjQgdG8gc3RheSBvdXQgb2YgdGhlIG1haW5saW5lCisgICBrZXJuZWwuCisKKyAtIFRoZSBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUgbWFkZSB1c2Ugb2YgaW50ZXJuYWwgdmlydHVhbCBmaWxlc3lzdGVtCisgICBkYXRhIHN0cnVjdHVyZXMgaW4gd2F5cyB3aGljaCB3ZXJlIGNvbnNpZGVyZWQgdG8gYmUgdW5zYWZlIGFuZAorICAgdW5yZWxpYWJsZS4gIFRoaXMgY29kZSBoYXMgc2luY2UgYmVlbiBzaWduaWZpY2FudGx5IHJld29ya2VkLCBidXQKKyAgIHJlbWFpbnMgb3V0c2lkZSBvZiB0aGUgbWFpbmxpbmUuCisKK0luIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGEgZ3JlYXQgZGVhbCBvZiBwYWluIGFuZCBleHRyYSB3b3JrIGNvdWxkIGhhdmUgYmVlbgorYXZvaWRlZCB3aXRoIHNvbWUgZWFybHkgZGlzY3Vzc2lvbiB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcGVycy4KKworCiszLjM6IFdITyBETyBZT1UgVEFMSyBUTz8KKworV2hlbiBkZXZlbG9wZXJzIGRlY2lkZSB0byB0YWtlIHRoZWlyIHBsYW5zIHB1YmxpYywgdGhlIG5leHQgcXVlc3Rpb24gd2lsbAorYmU6IHdoZXJlIGRvIHdlIHN0YXJ0PyAgVGhlIGFuc3dlciBpcyB0byBmaW5kIHRoZSByaWdodCBtYWlsaW5nIGxpc3QocykgYW5kCit0aGUgcmlnaHQgbWFpbnRhaW5lci4gIEZvciBtYWlsaW5nIGxpc3RzLCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0byBsb29rIGluCit0aGUgTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSByZWxldmFudCBwbGFjZSB0byBwb3N0LiAgSWYgdGhlcmUgaXMgYSBzdWl0YWJsZQorc3Vic3lzdGVtIGxpc3QsIHBvc3RpbmcgdGhlcmUgaXMgb2Z0ZW4gcHJlZmVyYWJsZSB0byBwb3N0aW5nIG9uCitsaW51eC1rZXJuZWw7IHlvdSBhcmUgbW9yZSBsaWtlbHkgdG8gcmVhY2ggZGV2ZWxvcGVycyB3aXRoIGV4cGVydGlzZSBpbiB0aGUKK3JlbGV2YW50IHN1YnN5c3RlbSBhbmQgdGhlIGVudmlyb25tZW50IG1heSBiZSBtb3JlIHN1cHBvcnRpdmUuCisKK0ZpbmRpbmcgbWFpbnRhaW5lcnMgY2FuIGJlIGEgYml0IGhhcmRlci4gIEFnYWluLCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcwordGhlIHBsYWNlIHRvIHN0YXJ0LiAgVGhhdCBmaWxlIHRlbmRzIHRvIG5vdCBhbHdheXMgYmUgdXAgdG8gZGF0ZSwgdGhvdWdoLAorYW5kIG5vdCBhbGwgc3Vic3lzdGVtcyBhcmUgcmVwcmVzZW50ZWQgdGhlcmUuICBUaGUgcGVyc29uIGxpc3RlZCBpbiB0aGUKK01BSU5UQUlORVJTIGZpbGUgbWF5LCBpbiBmYWN0LCBub3QgYmUgdGhlIHBlcnNvbiB3aG8gaXMgYWN0dWFsbHkgYWN0aW5nIGluCit0aGF0IHJvbGUgY3VycmVudGx5LiAgU28sIHdoZW4gdGhlcmUgaXMgZG91YnQgYWJvdXQgd2hvIHRvIGNvbnRhY3QsIGEKK3VzZWZ1bCB0cmljayBpcyB0byB1c2UgZ2l0IChhbmQgImdpdCBsb2ciIGluIHBhcnRpY3VsYXIpIHRvIHNlZSB3aG8gaXMKK2N1cnJlbnRseSBhY3RpdmUgd2l0aGluIHRoZSBzdWJzeXN0ZW0gb2YgaW50ZXJlc3QuICBMb29rIGF0IHdobyBpcyB3cml0aW5nCitwYXRjaGVzLCBhbmQgd2hvLCBpZiBhbnlib2R5LCBpcyBhdHRhY2hpbmcgU2lnbmVkLW9mZi1ieSBsaW5lcyB0byB0aG9zZQorcGF0Y2hlcy4gIFRob3NlIGFyZSB0aGUgcGVvcGxlIHdobyB3aWxsIGJlIGJlc3QgcGxhY2VkIHRvIGhlbHAgd2l0aCBhIG5ldworZGV2ZWxvcG1lbnQgcHJvamVjdC4KKworSWYgYWxsIGVsc2UgZmFpbHMsIHRhbGtpbmcgdG8gQW5kcmV3IE1vcnRvbiBjYW4gYmUgYW4gZWZmZWN0aXZlIHdheSB0bwordHJhY2sgZG93biBhIG1haW50YWluZXIgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgY29kZS4KKworCiszLjQ6IFdIRU4gVE8gUE9TVD8KKworSWYgcG9zc2libGUsIHBvc3RpbmcgeW91ciBwbGFucyBkdXJpbmcgdGhlIGVhcmx5IHN0YWdlcyBjYW4gb25seSBiZQoraGVscGZ1bC4gIERlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCBhbmQgYW55IHBsYW5zIHRoYXQgaGF2ZSBiZWVuCittYWRlIG9uIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBkb25lLiAgQW55IGluZm9ybWF0aW9uIHlvdSBjYW4KK3Byb3ZpZGUgY2FuIGhlbHAgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBwcm92aWRlIHVzZWZ1bCBpbnB1dCBvbiB0aGUKK3Byb2plY3QuCisKK09uZSBkaXNjb3VyYWdpbmcgdGhpbmcgd2hpY2ggY2FuIGhhcHBlbiBhdCB0aGlzIHN0YWdlIGlzIG5vdCBhIGhvc3RpbGUKK3JlYWN0aW9uLCBidXQsIGluc3RlYWQsIGxpdHRsZSBvciBubyByZWFjdGlvbiBhdCBhbGwuICBUaGUgc2FkIHRydXRoIG9mIHRoZQorbWF0dGVyIGlzICgxKSBrZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGJlIGJ1c3ksICgyKSB0aGVyZSBpcyBubyBzaG9ydGFnZQorb2YgcGVvcGxlIHdpdGggZ3JhbmQgcGxhbnMgYW5kIGxpdHRsZSBjb2RlIChvciBldmVuIHByb3NwZWN0IG9mIGNvZGUpIHRvCitiYWNrIHRoZW0gdXAsIGFuZCAoMykgbm9ib2R5IGlzIG9ibGlnYXRlZCB0byByZXZpZXcgb3IgY29tbWVudCBvbiBpZGVhcworcG9zdGVkIGJ5IG90aGVycy4gIElmIGEgcmVxdWVzdC1mb3ItY29tbWVudHMgcG9zdGluZyB5aWVsZHMgbGl0dGxlIGluIHRoZQord2F5IG9mIGNvbW1lbnRzLCBkbyBub3QgYXNzdW1lIHRoYXQgaXQgbWVhbnMgdGhlcmUgaXMgbm8gaW50ZXJlc3QgaW4gdGhlCitwcm9qZWN0LiAgVW5mb3J0dW5hdGVseSwgeW91IGFsc28gY2Fubm90IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBwcm9ibGVtcword2l0aCB5b3VyIGlkZWEuICBUaGUgYmVzdCB0aGluZyB0byBkbyBpbiB0aGlzIHNpdHVhdGlvbiBpcyB0byBwcm9jZWVkLAora2VlcGluZyB0aGUgY29tbXVuaXR5IGluZm9ybWVkIGFzIHlvdSBnby4KKworCiszLjU6IEdFVFRJTkcgT0ZGSUNJQUwgQlVZLUlOCisKK0lmIHlvdXIgd29yayBpcyBiZWluZyBkb25lIGluIGEgY29ycG9yYXRlIGVudmlyb25tZW50IC0gYXMgbW9zdCBMaW51eAora2VybmVsIHdvcmsgaXMgLSB5b3UgbXVzdCwgb2J2aW91c2x5LCBoYXZlIHBlcm1pc3Npb24gZnJvbSBzdWl0YWJseQorZW1wb3dlcmVkIG1hbmFnZXJzIGJlZm9yZSB5b3UgY2FuIHBvc3QgeW91ciBjb21wYW55J3MgcGxhbnMgb3IgY29kZSB0byBhCitwdWJsaWMgbWFpbGluZyBsaXN0LiAgVGhlIHBvc3Rpbmcgb2YgY29kZSB3aGljaCBoYXMgbm90IGJlZW4gY2xlYXJlZCBmb3IKK3JlbGVhc2UgdW5kZXIgYSBHUEwtY29tcGF0aWJsZSBsaWNlbnNlIGNhbiBiZSBlc3BlY2lhbGx5IHByb2JsZW1hdGljOyB0aGUKK3Nvb25lciB0aGF0IGEgY29tcGFueSdzIG1hbmFnZW1lbnQgYW5kIGxlZ2FsIHN0YWZmIGNhbiBhZ3JlZSBvbiB0aGUgcG9zdGluZworb2YgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgdGhlIGJldHRlciBvZmYgZXZlcnlib2R5IGludm9sdmVkIHdpbGwgYmUuCisKK1NvbWUgcmVhZGVycyBtYXkgYmUgdGhpbmtpbmcgYXQgdGhpcyBwb2ludCB0aGF0IHRoZWlyIGtlcm5lbCB3b3JrIGlzCitpbnRlbmRlZCB0byBzdXBwb3J0IGEgcHJvZHVjdCB3aGljaCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBvZmZpY2lhbGx5CithY2tub3dsZWRnZWQgZXhpc3RlbmNlLiAgUmV2ZWFsaW5nIHRoZWlyIGVtcGxveWVyJ3MgcGxhbnMgb24gYSBwdWJsaWMKK21haWxpbmcgbGlzdCBtYXkgbm90IGJlIGEgdmlhYmxlIG9wdGlvbi4gIEluIGNhc2VzIGxpa2UgdGhpcywgaXQgaXMgd29ydGgKK2NvbnNpZGVyaW5nIHdoZXRoZXIgdGhlIHNlY3JlY3kgaXMgcmVhbGx5IG5lY2Vzc2FyeTsgdGhlcmUgaXMgb2Z0ZW4gbm8gcmVhbAorbmVlZCB0byBrZWVwIGRldmVsb3BtZW50IHBsYW5zIGJlaGluZCBjbG9zZWQgZG9vcnMuCisKK1RoYXQgc2FpZCwgdGhlcmUgYXJlIGFsc28gY2FzZXMgd2hlcmUgYSBjb21wYW55IGxlZ2l0aW1hdGVseSBjYW5ub3QKK2Rpc2Nsb3NlIGl0cyBwbGFucyBlYXJseSBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gIENvbXBhbmllcyB3aXRoCitleHBlcmllbmNlZCBrZXJuZWwgZGV2ZWxvcGVycyBtYXkgY2hvb3NlIHRvIHByb2NlZWQgaW4gYW4gb3Blbi1sb29wIG1hbm5lcgorb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0byBhdm9pZCBzZXJpb3VzIGludGVncmF0aW9uCitwcm9ibGVtcyBsYXRlci4gIEZvciBjb21wYW5pZXMgd2l0aG91dCB0aGF0IHNvcnQgb2YgaW4taG91c2UgZXhwZXJ0aXNlLCB0aGUKK2Jlc3Qgb3B0aW9uIGlzIG9mdGVuIHRvIGhpcmUgYW4gb3V0c2lkZSBkZXZlbG9wZXIgdG8gcmV2aWV3IHRoZSBwbGFucyB1bmRlcgorYSBub24tZGlzY2xvc3VyZSBhZ3JlZW1lbnQuICBUaGUgTGludXggRm91bmRhdGlvbiBvcGVyYXRlcyBhbiBOREEgcHJvZ3JhbQorZGVzaWduZWQgdG8gaGVscCB3aXRoIHRoaXMgc29ydCBvZiBzaXR1YXRpb247IG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kCithdDoKKworICAgIGh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9lbi9OREFfcHJvZ3JhbQorCitUaGlzIGtpbmQgb2YgcmV2aWV3IGlzIG9mdGVuIGVub3VnaCB0byBhdm9pZCBzZXJpb3VzIHByb2JsZW1zIGxhdGVyIG9uCit3aXRob3V0IHJlcXVpcmluZyBwdWJsaWMgZGlzY2xvc3VyZSBvZiB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRhY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCkBAIC0wLDAgKzEsMzg0IEBACis0OiBHRVRUSU5HIFRIRSBDT0RFIFJJR0hUCisKK1doaWxlIHRoZXJlIGlzIG11Y2ggdG8gYmUgc2FpZCBmb3IgYSBzb2xpZCBhbmQgY29tbXVuaXR5LW9yaWVudGVkIGRlc2lnbgorcHJvY2VzcywgdGhlIHByb29mIG9mIGFueSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCBpcyBpbiB0aGUgcmVzdWx0aW5nCitjb2RlLiAgSXQgaXMgdGhlIGNvZGUgd2hpY2ggd2lsbCBiZSBleGFtaW5lZCBieSBvdGhlciBkZXZlbG9wZXJzIGFuZCBtZXJnZWQKKyhvciBub3QpIGludG8gdGhlIG1haW5saW5lIHRyZWUuICBTbyBpdCBpcyB0aGUgcXVhbGl0eSBvZiB0aGlzIGNvZGUgd2hpY2gKK3dpbGwgZGV0ZXJtaW5lIHRoZSB1bHRpbWF0ZSBzdWNjZXNzIG9mIHRoZSBwcm9qZWN0LgorCitUaGlzIHNlY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIFdlJ2xsIHN0YXJ0IHdpdGggYSBsb29rIGF0IGEKK251bWJlciBvZiB3YXlzIGluIHdoaWNoIGtlcm5lbCBkZXZlbG9wZXJzIGNhbiBnbyB3cm9uZy4gIFRoZW4gdGhlIGZvY3VzCit3aWxsIHNoaWZ0IHRvd2FyZCBkb2luZyB0aGluZ3MgcmlnaHQgYW5kIHRoZSB0b29scyB3aGljaCBjYW4gaGVscCBpbiB0aGF0CitxdWVzdC4KKworCis0LjE6IFBJVEZBTExTCisKKyogQ29kaW5nIHN0eWxlCisKK1RoZSBrZXJuZWwgaGFzIGxvbmcgaGFkIGEgc3RhbmRhcmQgY29kaW5nIHN0eWxlLCBkZXNjcmliZWQgaW4KK0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGb3IgbXVjaCBvZiB0aGF0IHRpbWUsIHRoZSBwb2xpY2llcyBkZXNjcmliZWQKK2luIHRoYXQgZmlsZSB3ZXJlIHRha2VuIGFzIGJlaW5nLCBhdCBtb3N0LCBhZHZpc29yeS4gIEFzIGEgcmVzdWx0LCB0aGVyZSBpcworYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSBpbiB0aGUga2VybmVsIHdoaWNoIGRvZXMgbm90IG1lZXQgdGhlIGNvZGluZworc3R5bGUgZ3VpZGVsaW5lcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGF0IGNvZGUgbGVhZHMgdG8gdHdvIGluZGVwZW5kZW50CitoYXphcmRzIGZvciBrZXJuZWwgZGV2ZWxvcGVycy4KKworVGhlIGZpcnN0IG9mIHRoZXNlIGlzIHRvIGJlbGlldmUgdGhhdCB0aGUga2VybmVsIGNvZGluZyBzdGFuZGFyZHMgZG8gbm90CittYXR0ZXIgYW5kIGFyZSBub3QgZW5mb3JjZWQuICBUaGUgdHJ1dGggb2YgdGhlIG1hdHRlciBpcyB0aGF0IGFkZGluZyBuZXcKK2NvZGUgdG8gdGhlIGtlcm5lbCBpcyB2ZXJ5IGRpZmZpY3VsdCBpZiB0aGF0IGNvZGUgaXMgbm90IGNvZGVkIGFjY29yZGluZyB0bwordGhlIHN0YW5kYXJkOyBtYW55IGRldmVsb3BlcnMgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvZGUgYmUgcmVmb3JtYXR0ZWQKK2JlZm9yZSB0aGV5IHdpbGwgZXZlbiByZXZpZXcgaXQuICBBIGNvZGUgYmFzZSBhcyBsYXJnZSBhcyB0aGUga2VybmVsCityZXF1aXJlcyBzb21lIHVuaWZvcm1pdHkgb2YgY29kZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvCitxdWlja2x5IHVuZGVyc3RhbmQgYW55IHBhcnQgb2YgaXQuICBTbyB0aGVyZSBpcyBubyBsb25nZXIgcm9vbSBmb3IKK3N0cmFuZ2VseS1mb3JtYXR0ZWQgY29kZS4KKworT2NjYXNpb25hbGx5LCB0aGUga2VybmVsJ3MgY29kaW5nIHN0eWxlIHdpbGwgcnVuIGludG8gY29uZmxpY3Qgd2l0aCBhbgorZW1wbG95ZXIncyBtYW5kYXRlZCBzdHlsZS4gIEluIHN1Y2ggY2FzZXMsIHRoZSBrZXJuZWwncyBzdHlsZSB3aWxsIGhhdmUgdG8KK3dpbiBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIG1lcmdlZC4gIFB1dHRpbmcgY29kZSBpbnRvIHRoZSBrZXJuZWwgbWVhbnMKK2dpdmluZyB1cCBhIGRlZ3JlZSBvZiBjb250cm9sIGluIGEgbnVtYmVyIG9mIHdheXMgLSBpbmNsdWRpbmcgY29udHJvbCBvdmVyCitob3cgdGhlIGNvZGUgaXMgZm9ybWF0dGVkLgorCitUaGUgb3RoZXIgdHJhcCBpcyB0byBhc3N1bWUgdGhhdCBjb2RlIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGtlcm5lbCBpcwordXJnZW50bHkgaW4gbmVlZCBvZiBjb2Rpbmcgc3R5bGUgZml4ZXMuICBEZXZlbG9wZXJzIG1heSBzdGFydCB0byBnZW5lcmF0ZQorcmVmb3JtYXR0aW5nIHBhdGNoZXMgYXMgYSB3YXkgb2YgZ2FpbmluZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBwcm9jZXNzLCBvcgorYXMgYSB3YXkgb2YgZ2V0dGluZyB0aGVpciBuYW1lIGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzIC0gb3IgYm90aC4gIEJ1dAorcHVyZSBjb2Rpbmcgc3R5bGUgZml4ZXMgYXJlIHNlZW4gYXMgbm9pc2UgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eTsKK3RoZXkgdGVuZCB0byBnZXQgYSBjaGlsbHkgcmVjZXB0aW9uLiAgU28gdGhpcyB0eXBlIG9mIHBhdGNoIGlzIGJlc3QKK2F2b2lkZWQuICBJdCBpcyBuYXR1cmFsIHRvIGZpeCB0aGUgc3R5bGUgb2YgYSBwaWVjZSBvZiBjb2RlIHdoaWxlIHdvcmtpbmcKK29uIGl0IGZvciBvdGhlciByZWFzb25zLCBidXQgY29kaW5nIHN0eWxlIGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBtYWRlIGZvcgordGhlaXIgb3duIHNha2UuCisKK1RoZSBjb2Rpbmcgc3R5bGUgZG9jdW1lbnQgYWxzbyBzaG91bGQgbm90IGJlIHJlYWQgYXMgYW4gYWJzb2x1dGUgbGF3IHdoaWNoCitjYW4gbmV2ZXIgYmUgdHJhbnNncmVzc2VkLiAgSWYgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0byBnbyBhZ2FpbnN0IHRoZQorc3R5bGUgKGEgbGluZSB3aGljaCBiZWNvbWVzIGZhciBsZXNzIHJlYWRhYmxlIGlmIHNwbGl0IHRvIGZpdCB3aXRoaW4gdGhlCis4MC1jb2x1bW4gbGltaXQsIGZvciBleGFtcGxlKSwganVzdCBkbyBpdC4KKworCisqIEFic3RyYWN0aW9uIGxheWVycworCitDb21wdXRlciBTY2llbmNlIHByb2Zlc3NvcnMgdGVhY2ggc3R1ZGVudHMgdG8gbWFrZSBleHRlbnNpdmUgdXNlIG9mCithYnN0cmFjdGlvbiBsYXllcnMgaW4gdGhlIG5hbWUgb2YgZmxleGliaWxpdHkgYW5kIGluZm9ybWF0aW9uIGhpZGluZy4KK0NlcnRhaW5seSB0aGUga2VybmVsIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYWJzdHJhY3Rpb247IG5vIHByb2plY3QKK2ludm9sdmluZyBzZXZlcmFsIG1pbGxpb24gbGluZXMgb2YgY29kZSBjb3VsZCBkbyBvdGhlcndpc2UgYW5kIHN1cnZpdmUuCitCdXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBleGNlc3NpdmUgb3IgcHJlbWF0dXJlIGFic3RyYWN0aW9uIGNhbiBiZQoranVzdCBhcyBoYXJtZnVsIGFzIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uICBBYnN0cmFjdGlvbiBzaG91bGQgYmUgdXNlZCB0bwordGhlIGxldmVsIHJlcXVpcmVkIGFuZCBubyBmdXJ0aGVyLgorCitBdCBhIHNpbXBsZSBsZXZlbCwgY29uc2lkZXIgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4gYXJndW1lbnQgd2hpY2ggaXMKK2Fsd2F5cyBwYXNzZWQgYXMgemVybyBieSBhbGwgY2FsbGVycy4gIE9uZSBjb3VsZCByZXRhaW4gdGhhdCBhcmd1bWVudCBqdXN0CitpbiBjYXNlIHNvbWVib2R5IGV2ZW50dWFsbHkgbmVlZHMgdG8gdXNlIHRoZSBleHRyYSBmbGV4aWJpbGl0eSB0aGF0IGl0Citwcm92aWRlcy4gIEJ5IHRoYXQgdGltZSwgdGhvdWdoLCBjaGFuY2VzIGFyZSBnb29kIHRoYXQgdGhlIGNvZGUgd2hpY2gKK2ltcGxlbWVudHMgdGhpcyBleHRyYSBhcmd1bWVudCBoYXMgYmVlbiBicm9rZW4gaW4gc29tZSBzdWJ0bGUgd2F5IHdoaWNoIHdhcworbmV2ZXIgbm90aWNlZCAtIGJlY2F1c2UgaXQgaGFzIG5ldmVyIGJlZW4gdXNlZC4gIE9yLCB3aGVuIHRoZSBuZWVkIGZvcgorZXh0cmEgZmxleGliaWxpdHkgYXJpc2VzLCBpdCBkb2VzIG5vdCBkbyBzbyBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZQorcHJvZ3JhbW1lcidzIGVhcmx5IGV4cGVjdGF0aW9uLiAgS2VybmVsIGRldmVsb3BlcnMgd2lsbCByb3V0aW5lbHkgc3VibWl0CitwYXRjaGVzIHRvIHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzOyB0aGV5IHNob3VsZCwgaW4gZ2VuZXJhbCwgbm90IGJlIGFkZGVkCitpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0Fic3RyYWN0aW9uIGxheWVycyB3aGljaCBoaWRlIGFjY2VzcyB0byBoYXJkd2FyZSAtIG9mdGVuIHRvIGFsbG93IHRoZSBidWxrCitvZiBhIGRyaXZlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMgLSBhcmUgZXNwZWNpYWxseQorZnJvd25lZCB1cG9uLiAgU3VjaCBsYXllcnMgb2JzY3VyZSB0aGUgY29kZSBhbmQgbWF5IGltcG9zZSBhIHBlcmZvcm1hbmNlCitwZW5hbHR5OyB0aGV5IGRvIG5vdCBiZWxvbmcgaW4gdGhlIExpbnV4IGtlcm5lbC4KKworT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGNvcHlpbmcgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBjb2RlCitmcm9tIGFub3RoZXIga2VybmVsIHN1YnN5c3RlbSwgaXQgaXMgdGltZSB0byBhc2sgd2hldGhlciBpdCB3b3VsZCwgaW4gZmFjdCwKK21ha2Ugc2Vuc2UgdG8gcHVsbCBvdXQgc29tZSBvZiB0aGF0IGNvZGUgaW50byBhIHNlcGFyYXRlIGxpYnJhcnkgb3IgdG8KK2ltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHkgYXQgYSBoaWdoZXIgbGV2ZWwuICBUaGVyZSBpcyBubyB2YWx1ZSBpbgorcmVwbGljYXRpbmcgdGhlIHNhbWUgY29kZSB0aHJvdWdob3V0IHRoZSBrZXJuZWwuCisKKworKiAjaWZkZWYgYW5kIHByZXByb2Nlc3NvciB1c2UgaW4gZ2VuZXJhbAorCitUaGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gcHJlc2VudCBhIHBvd2VyZnVsIHRlbXB0YXRpb24gdG8gc29tZSBDCitwcm9ncmFtbWVycywgd2hvIHNlZSBpdCBhcyBhIHdheSB0byBlZmZpY2llbnRseSBlbmNvZGUgYSBncmVhdCBkZWFsIG9mCitmbGV4aWJpbGl0eSBpbnRvIGEgc291cmNlIGZpbGUuICBCdXQgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgQywgYW5kIGhlYXZ5Cit1c2Ugb2YgaXQgcmVzdWx0cyBpbiBjb2RlIHdoaWNoIGlzIG11Y2ggaGFyZGVyIGZvciBvdGhlcnMgdG8gcmVhZCBhbmQKK2hhcmRlciBmb3IgdGhlIGNvbXBpbGVyIHRvIGNoZWNrIGZvciBjb3JyZWN0bmVzcy4gIEhlYXZ5IHByZXByb2Nlc3NvciB1c2UKK2lzIGFsbW9zdCBhbHdheXMgYSBzaWduIG9mIGNvZGUgd2hpY2ggbmVlZHMgc29tZSBjbGVhbnVwIHdvcmsuCisKK0NvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmIGlzLCBpbmRlZWQsIGEgcG93ZXJmdWwgZmVhdHVyZSwgYW5kIGl0CitpcyB1c2VkIHdpdGhpbiB0aGUga2VybmVsLiAgQnV0IHRoZXJlIGlzIGxpdHRsZSBkZXNpcmUgdG8gc2VlIGNvZGUgd2hpY2ggaXMKK3Nwcmlua2xlZCBsaWJlcmFsbHkgd2l0aCAjaWZkZWYgYmxvY2tzLiAgQXMgYSBnZW5lcmFsIHJ1bGUsICNpZmRlZiB1c2UKK3Nob3VsZCBiZSBjb25maW5lZCB0byBoZWFkZXIgZmlsZXMgd2hlbmV2ZXIgcG9zc2libGUuCitDb25kaXRpb25hbGx5LWNvbXBpbGVkIGNvZGUgY2FuIGJlIGNvbmZpbmVkIHRvIGZ1bmN0aW9ucyB3aGljaCwgaWYgdGhlIGNvZGUKK2lzIG5vdCB0byBiZSBwcmVzZW50LCBzaW1wbHkgYmVjb21lIGVtcHR5LiAgVGhlIGNvbXBpbGVyIHdpbGwgdGhlbiBxdWlldGx5CitvcHRpbWl6ZSBvdXQgdGhlIGNhbGwgdG8gdGhlIGVtcHR5IGZ1bmN0aW9uLiAgVGhlIHJlc3VsdCBpcyBmYXIgY2xlYW5lcgorY29kZSB3aGljaCBpcyBlYXNpZXIgdG8gZm9sbG93LgorCitDIHByZXByb2Nlc3NvciBtYWNyb3MgcHJlc2VudCBhIG51bWJlciBvZiBoYXphcmRzLCBpbmNsdWRpbmcgcG9zc2libGUKK211bHRpcGxlIGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgd2l0aCBzaWRlIGVmZmVjdHMgYW5kIG5vIHR5cGUgc2FmZXR5LgorSWYgeW91IGFyZSB0ZW1wdGVkIHRvIGRlZmluZSBhIG1hY3JvLCBjb25zaWRlciBjcmVhdGluZyBhbiBpbmxpbmUgZnVuY3Rpb24KK2luc3RlYWQuICBUaGUgY29kZSB3aGljaCByZXN1bHRzIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBpbmxpbmUgZnVuY3Rpb25zIGFyZQorZWFzaWVyIHRvIHJlYWQsIGRvIG5vdCBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgbXVsdGlwbGUgdGltZXMsIGFuZCBhbGxvdwordGhlIGNvbXBpbGVyIHRvIHBlcmZvcm0gdHlwZSBjaGVja2luZyBvbiB0aGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUuCisKKworKiBJbmxpbmUgZnVuY3Rpb25zCisKK0lubGluZSBmdW5jdGlvbnMgcHJlc2VudCBhIGhhemFyZCBvZiB0aGVpciBvd24sIHRob3VnaC4gIFByb2dyYW1tZXJzIGNhbgorYmVjb21lIGVuYW1vcmVkIG9mIHRoZSBwZXJjZWl2ZWQgZWZmaWNpZW5jeSBpbmhlcmVudCBpbiBhdm9pZGluZyBhIGZ1bmN0aW9uCitjYWxsIGFuZCBmaWxsIGEgc291cmNlIGZpbGUgd2l0aCBpbmxpbmUgZnVuY3Rpb25zLiAgVGhvc2UgZnVuY3Rpb25zLAoraG93ZXZlciwgY2FuIGFjdHVhbGx5IHJlZHVjZSBwZXJmb3JtYW5jZS4gIFNpbmNlIHRoZWlyIGNvZGUgaXMgcmVwbGljYXRlZAorYXQgZWFjaCBjYWxsIHNpdGUsIHRoZXkgZW5kIHVwIGJsb2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZCBrZXJuZWwuCitUaGF0LCBpbiB0dXJuLCBjcmVhdGVzIHByZXNzdXJlIG9uIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgY2FjaGVzLCB3aGljaCBjYW4KK3Nsb3cgZXhlY3V0aW9uIGRyYW1hdGljYWxseS4gIElubGluZSBmdW5jdGlvbnMsIGFzIGEgcnVsZSwgc2hvdWxkIGJlIHF1aXRlCitzbWFsbCBhbmQgcmVsYXRpdmVseSByYXJlLiAgVGhlIGNvc3Qgb2YgYSBmdW5jdGlvbiBjYWxsLCBhZnRlciBhbGwsIGlzIG5vdAordGhhdCBoaWdoOyB0aGUgY3JlYXRpb24gb2YgbGFyZ2UgbnVtYmVycyBvZiBpbmxpbmUgZnVuY3Rpb25zIGlzIGEgY2xhc3NpYworZXhhbXBsZSBvZiBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgorCitJbiBnZW5lcmFsLCBrZXJuZWwgcHJvZ3JhbW1lcnMgaWdub3JlIGNhY2hlIGVmZmVjdHMgYXQgdGhlaXIgcGVyaWwuICBUaGUKK2NsYXNzaWMgdGltZS9zcGFjZSB0cmFkZW9mZiB0YXVnaHQgaW4gYmVnaW5uaW5nIGRhdGEgc3RydWN0dXJlcyBjbGFzc2VzCitvZnRlbiBkb2VzIG5vdCBhcHBseSB0byBjb250ZW1wb3JhcnkgaGFyZHdhcmUuICBTcGFjZSAqaXMqIHRpbWUsIGluIHRoYXQgYQorbGFyZ2VyIHByb2dyYW0gd2lsbCBydW4gc2xvd2VyIHRoYW4gb25lIHdoaWNoIGlzIG1vcmUgY29tcGFjdC4KKworCisqIExvY2tpbmcKKworSW4gTWF5LCAyMDA2LCB0aGUgIkRldmljZXNjYXBlIiBuZXR3b3JraW5nIHN0YWNrIHdhcywgd2l0aCBncmVhdAorZmFuZmFyZSwgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBhbmQgbWFkZSBhdmFpbGFibGUgZm9yIGluY2x1c2lvbiBpbiB0aGUKK21haW5saW5lIGtlcm5lbC4gIFRoaXMgZG9uYXRpb24gd2FzIHdlbGNvbWUgbmV3czsgc3VwcG9ydCBmb3Igd2lyZWxlc3MKK25ldHdvcmtpbmcgaW4gTGludXggd2FzIGNvbnNpZGVyZWQgc3Vic3RhbmRhcmQgYXQgYmVzdCwgYW5kIHRoZSBEZXZpY2VzY2FwZQorc3RhY2sgb2ZmZXJlZCB0aGUgcHJvbWlzZSBvZiBmaXhpbmcgdGhhdCBzaXR1YXRpb24uICBZZXQsIHRoaXMgY29kZSBkaWQgbm90CithY3R1YWxseSBtYWtlIGl0IGludG8gdGhlIG1haW5saW5lIHVudGlsIEp1bmUsIDIwMDcgKDIuNi4yMikuICBXaGF0CitoYXBwZW5lZD8KKworVGhpcyBjb2RlIHNob3dlZCBhIG51bWJlciBvZiBzaWducyBvZiBoYXZpbmcgYmVlbiBkZXZlbG9wZWQgYmVoaW5kCitjb3Jwb3JhdGUgZG9vcnMuICBCdXQgb25lIGxhcmdlIHByb2JsZW0gaW4gcGFydGljdWxhciB3YXMgdGhhdCBpdCB3YXMgbm90CitkZXNpZ25lZCB0byB3b3JrIG9uIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBCZWZvcmUgdGhpcyBuZXR3b3JraW5nIHN0YWNrCisobm93IGNhbGxlZCBtYWM4MDIxMSkgY291bGQgYmUgbWVyZ2VkLCBhIGxvY2tpbmcgc2NoZW1lIG5lZWRlZCB0byBiZQorcmV0cm9maXR0ZWQgb250byBpdC4gIAorCitPbmNlIHVwb24gYSB0aW1lLCBMaW51eCBrZXJuZWwgY29kZSBjb3VsZCBiZSBkZXZlbG9wZWQgd2l0aG91dCB0aGlua2luZworYWJvdXQgdGhlIGNvbmN1cnJlbmN5IGlzc3VlcyBwcmVzZW50ZWQgYnkgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIE5vdywKK2hvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgaXMgYmVpbmcgd3JpdHRlbiBvbiBhIGR1YWwtY29yZSBsYXB0b3AuICBFdmVuIG9uCitzaW5nbGUtcHJvY2Vzc29yIHN5c3RlbXMsIHdvcmsgYmVpbmcgZG9uZSB0byBpbXByb3ZlIHJlc3BvbnNpdmVuZXNzIHdpbGwKK3JhaXNlIHRoZSBsZXZlbCBvZiBjb25jdXJyZW5jeSB3aXRoaW4gdGhlIGtlcm5lbC4gIFRoZSBkYXlzIHdoZW4ga2VybmVsCitjb2RlIGNvdWxkIGJlIHdyaXR0ZW4gd2l0aG91dCB0aGlua2luZyBhYm91dCBsb2NraW5nIGFyZSBsb25nIHBhc3QuCisKK0FueSByZXNvdXJjZSAoZGF0YSBzdHJ1Y3R1cmVzLCBoYXJkd2FyZSByZWdpc3RlcnMsIGV0Yy4pIHdoaWNoIGNvdWxkIGJlCithY2Nlc3NlZCBjb25jdXJyZW50bHkgYnkgbW9yZSB0aGFuIG9uZSB0aHJlYWQgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorTmV3IGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gd2l0aCB0aGlzIHJlcXVpcmVtZW50IGluIG1pbmQ7IHJldHJvZml0dGluZworbG9ja2luZyBhZnRlciB0aGUgZmFjdCBpcyBhIHJhdGhlciBtb3JlIGRpZmZpY3VsdCB0YXNrLiAgS2VybmVsIGRldmVsb3BlcnMKK3Nob3VsZCB0YWtlIHRoZSB0aW1lIHRvIHVuZGVyc3RhbmQgdGhlIGF2YWlsYWJsZSBsb2NraW5nIHByaW1pdGl2ZXMgd2VsbAorZW5vdWdoIHRvIHBpY2sgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoZSBqb2IuICBDb2RlIHdoaWNoIHNob3dzIGEgbGFjayBvZgorYXR0ZW50aW9uIHRvIGNvbmN1cnJlbmN5IHdpbGwgaGF2ZSBhIGRpZmZpY3VsdCBwYXRoIGludG8gdGhlIG1haW5saW5lLgorCisKKyogUmVncmVzc2lvbnMKKworT25lIGZpbmFsIGhhemFyZCB3b3J0aCBtZW50aW9uaW5nIGlzIHRoaXM6IGl0IGNhbiBiZSB0ZW1wdGluZyB0byBtYWtlIGEKK2NoYW5nZSAod2hpY2ggbWF5IGJyaW5nIGJpZyBpbXByb3ZlbWVudHMpIHdoaWNoIGNhdXNlcyBzb21ldGhpbmcgdG8gYnJlYWsKK2ZvciBleGlzdGluZyB1c2Vycy4gIFRoaXMga2luZCBvZiBjaGFuZ2UgaXMgY2FsbGVkIGEgInJlZ3Jlc3Npb24sIiBhbmQKK3JlZ3Jlc3Npb25zIGhhdmUgYmVjb21lIG1vc3QgdW53ZWxjb21lIGluIHRoZSBtYWlubGluZSBrZXJuZWwuICBXaXRoIGZldworZXhjZXB0aW9ucywgY2hhbmdlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyB3aWxsIGJlIGJhY2tlZCBvdXQgaWYgdGhlCityZWdyZXNzaW9uIGNhbm5vdCBiZSBmaXhlZCBpbiBhIHRpbWVseSBtYW5uZXIuICBGYXIgYmV0dGVyIHRvIGF2b2lkIHRoZQorcmVncmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0l0IGlzIG9mdGVuIGFyZ3VlZCB0aGF0IGEgcmVncmVzc2lvbiBjYW4gYmUganVzdGlmaWVkIGlmIGl0IGNhdXNlcyB0aGluZ3MKK3RvIHdvcmsgZm9yIG1vcmUgcGVvcGxlIHRoYW4gaXQgY3JlYXRlcyBwcm9ibGVtcyBmb3IuICBXaHkgbm90IG1ha2UgYQorY2hhbmdlIGlmIGl0IGJyaW5ncyBuZXcgZnVuY3Rpb25hbGl0eSB0byB0ZW4gc3lzdGVtcyBmb3IgZWFjaCBvbmUgaXQKK2JyZWFrcz8gIFRoZSBiZXN0IGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdhcyBleHByZXNzZWQgYnkgTGludXMgaW4gSnVseSwKKzIwMDc6CisKKwlTbyB3ZSBkb24ndCBmaXggYnVncyBieSBpbnRyb2R1Y2luZyBuZXcgcHJvYmxlbXMuICBUaGF0IHdheSBsaWVzCisJbWFkbmVzcywgYW5kIG5vYm9keSBldmVyIGtub3dzIGlmIHlvdSBhY3R1YWxseSBtYWtlIGFueSByZWFsCisJcHJvZ3Jlc3MgYXQgYWxsLiBJcyBpdCB0d28gc3RlcHMgZm9yd2FyZHMsIG9uZSBzdGVwIGJhY2ssIG9yIG9uZQorCXN0ZXAgZm9yd2FyZCBhbmQgdHdvIHN0ZXBzIGJhY2s/CisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNDM0NjAvKS4KKworQW4gZXNwZWNpYWxseSB1bndlbGNvbWUgdHlwZSBvZiByZWdyZXNzaW9uIGlzIGFueSBzb3J0IG9mIGNoYW5nZSB0byB0aGUKK3VzZXItc3BhY2UgQUJJLiAgT25jZSBhbiBpbnRlcmZhY2UgaGFzIGJlZW4gZXhwb3J0ZWQgdG8gdXNlciBzcGFjZSwgaXQgbXVzdAorYmUgc3VwcG9ydGVkIGluZGVmaW5pdGVseS4gIFRoaXMgZmFjdCBtYWtlcyB0aGUgY3JlYXRpb24gb2YgdXNlci1zcGFjZQoraW50ZXJmYWNlcyBwYXJ0aWN1bGFybHkgY2hhbGxlbmdpbmc6IHNpbmNlIHRoZXkgY2Fubm90IGJlIGNoYW5nZWQgaW4KK2luY29tcGF0aWJsZSB3YXlzLCB0aGV5IG11c3QgYmUgZG9uZSByaWdodCB0aGUgZmlyc3QgdGltZS4gIEZvciB0aGlzCityZWFzb24sIGEgZ3JlYXQgZGVhbCBvZiB0aG91Z2h0LCBjbGVhciBkb2N1bWVudGF0aW9uLCBhbmQgd2lkZSByZXZpZXcgZm9yCit1c2VyLXNwYWNlIGludGVyZmFjZXMgaXMgYWx3YXlzIHJlcXVpcmVkLgorCisKKworNC4yOiBDT0RFIENIRUNLSU5HIFRPT0xTCisKK0ZvciBub3csIGF0IGxlYXN0LCB0aGUgd3JpdGluZyBvZiBlcnJvci1mcmVlIGNvZGUgcmVtYWlucyBhbiBpZGVhbCB0aGF0IGZldworb2YgdXMgY2FuIHJlYWNoLiAgV2hhdCB3ZSBjYW4gaG9wZSB0byBkbywgdGhvdWdoLCBpcyB0byBjYXRjaCBhbmQgZml4IGFzCittYW55IG9mIHRob3NlIGVycm9ycyBhcyBwb3NzaWJsZSBiZWZvcmUgb3VyIGNvZGUgZ29lcyBpbnRvIHRoZSBtYWlubGluZQora2VybmVsLiAgVG8gdGhhdCBlbmQsIHRoZSBrZXJuZWwgZGV2ZWxvcGVycyBoYXZlIHB1dCB0b2dldGhlciBhbiBpbXByZXNzaXZlCithcnJheSBvZiB0b29scyB3aGljaCBjYW4gY2F0Y2ggYSB3aWRlIHZhcmlldHkgb2Ygb2JzY3VyZSBwcm9ibGVtcyBpbiBhbgorYXV0b21hdGVkIHdheS4gIEFueSBwcm9ibGVtIGNhdWdodCBieSB0aGUgY29tcHV0ZXIgaXMgYSBwcm9ibGVtIHdoaWNoIHdpbGwKK25vdCBhZmZsaWN0IGEgdXNlciBsYXRlciBvbiwgc28gaXQgc3RhbmRzIHRvIHJlYXNvbiB0aGF0IHRoZSBhdXRvbWF0ZWQKK3Rvb2xzIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHBvc3NpYmxlLgorCitUaGUgZmlyc3Qgc3RlcCBpcyBzaW1wbHkgdG8gaGVlZCB0aGUgd2FybmluZ3MgcHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyLgorQ29udGVtcG9yYXJ5IHZlcnNpb25zIG9mIGdjYyBjYW4gZGV0ZWN0IChhbmQgd2FybiBhYm91dCkgYSBsYXJnZSBudW1iZXIgb2YKK3BvdGVudGlhbCBlcnJvcnMuICBRdWl0ZSBvZnRlbiwgdGhlc2Ugd2FybmluZ3MgcG9pbnQgdG8gcmVhbCBwcm9ibGVtcy4KK0NvZGUgc3VibWl0dGVkIGZvciByZXZpZXcgc2hvdWxkLCBhcyBhIHJ1bGUsIG5vdCBwcm9kdWNlIGFueSBjb21waWxlcgord2FybmluZ3MuICBXaGVuIHNpbGVuY2luZyB3YXJuaW5ncywgdGFrZSBjYXJlIHRvIHVuZGVyc3RhbmQgdGhlIHJlYWwgY2F1c2UKK2FuZCB0cnkgdG8gYXZvaWQgImZpeGVzIiB3aGljaCBtYWtlIHRoZSB3YXJuaW5nIGdvIGF3YXkgd2l0aG91dCBhZGRyZXNzaW5nCitpdHMgY2F1c2UuCisKK05vdGUgdGhhdCBub3QgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBCdWlsZCB0aGUKK2tlcm5lbCB3aXRoICJtYWtlIEVYVFJBX0NGTEFHUz0tVyIgdG8gZ2V0IHRoZSBmdWxsIHNldC4KKworVGhlIGtlcm5lbCBwcm92aWRlcyBzZXZlcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aGljaCB0dXJuIG9uIGRlYnVnZ2luZworZmVhdHVyZXM7IG1vc3Qgb2YgdGhlc2UgYXJlIGZvdW5kIGluIHRoZSAia2VybmVsIGhhY2tpbmciIHN1Ym1lbnUuICBTZXZlcmFsCitvZiB0aGVzZSBvcHRpb25zIHNob3VsZCBiZSB0dXJuZWQgb24gZm9yIGFueSBrZXJuZWwgdXNlZCBmb3IgZGV2ZWxvcG1lbnQgb3IKK3Rlc3RpbmcgcHVycG9zZXMuICBJbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIHR1cm4gb246CisKKyAtIEVOQUJMRV9XQVJOX0RFUFJFQ0FURUQsIEVOQUJMRV9NVVNUX0NIRUNLLCBhbmQgRlJBTUVfV0FSTiB0byBnZXQgYW4KKyAgIGV4dHJhIHNldCBvZiB3YXJuaW5ncyBmb3IgcHJvYmxlbXMgbGlrZSB0aGUgdXNlIG9mIGRlcHJlY2F0ZWQgaW50ZXJmYWNlcworICAgb3IgaWdub3JpbmcgYW4gaW1wb3J0YW50IHJldHVybiB2YWx1ZSBmcm9tIGEgZnVuY3Rpb24uICBUaGUgb3V0cHV0CisgICBnZW5lcmF0ZWQgYnkgdGhlc2Ugd2FybmluZ3MgY2FuIGJlIHZlcmJvc2UsIGJ1dCBvbmUgbmVlZCBub3Qgd29ycnkgYWJvdXQKKyAgIHdhcm5pbmdzIGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KKworIC0gREVCVUdfT0JKRUNUUyB3aWxsIGFkZCBjb2RlIHRvIHRyYWNrIHRoZSBsaWZldGltZSBvZiB2YXJpb3VzIG9iamVjdHMKKyAgIGNyZWF0ZWQgYnkgdGhlIGtlcm5lbCBhbmQgd2FybiB3aGVuIHRoaW5ncyBhcmUgZG9uZSBvdXQgb2Ygb3JkZXIuICBJZgorICAgeW91IGFyZSBhZGRpbmcgYSBzdWJzeXN0ZW0gd2hpY2ggY3JlYXRlcyAoYW5kIGV4cG9ydHMpIGNvbXBsZXggb2JqZWN0cworICAgb2YgaXRzIG93biwgY29uc2lkZXIgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBvYmplY3QgZGVidWdnaW5nCisgICBpbmZyYXN0cnVjdHVyZS4KKworIC0gREVCVUdfU0xBQiBjYW4gZmluZCBhIHZhcmlldHkgb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHVzZSBlcnJvcnM7IGl0CisgICBzaG91bGQgYmUgdXNlZCBvbiBtb3N0IGRldmVsb3BtZW50IGtlcm5lbHMuCisKKyAtIERFQlVHX1NQSU5MT0NLLCBERUJVR19TUElOTE9DS19TTEVFUCwgYW5kIERFQlVHX01VVEVYRVMgd2lsbCBmaW5kIGEKKyAgIG51bWJlciBvZiBjb21tb24gbG9ja2luZyBlcnJvcnMuCisKK1RoZXJlIGFyZSBxdWl0ZSBhIGZldyBvdGhlciBkZWJ1Z2dpbmcgb3B0aW9ucywgc29tZSBvZiB3aGljaCB3aWxsIGJlCitkaXNjdXNzZWQgYmVsb3cuICBTb21lIG9mIHRoZW0gaGF2ZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBhbmQKK3Nob3VsZCBub3QgYmUgdXNlZCBhbGwgb2YgdGhlIHRpbWUuICBCdXQgc29tZSB0aW1lIHNwZW50IGxlYXJuaW5nIHRoZQorYXZhaWxhYmxlIG9wdGlvbnMgd2lsbCBsaWtlbHkgYmUgcGFpZCBiYWNrIG1hbnkgdGltZXMgb3ZlciBpbiBzaG9ydCBvcmRlci4gCisKK09uZSBvZiB0aGUgaGVhdmllciBkZWJ1Z2dpbmcgdG9vbHMgaXMgdGhlIGxvY2tpbmcgY2hlY2tlciwgb3IgImxvY2tkZXAuIgorVGhpcyB0b29sIHdpbGwgdHJhY2sgdGhlIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIGV2ZXJ5IGxvY2sgKHNwaW5sb2NrIG9yCittdXRleCkgaW4gdGhlIHN5c3RlbSwgdGhlIG9yZGVyIGluIHdoaWNoIGxvY2tzIGFyZSBhY3F1aXJlZCByZWxhdGl2ZSB0bworZWFjaCBvdGhlciwgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVudmlyb25tZW50LCBhbmQgbW9yZS4gIEl0IGNhbiB0aGVuCitlbnN1cmUgdGhhdCBsb2NrcyBhcmUgYWx3YXlzIGFjcXVpcmVkIGluIHRoZSBzYW1lIG9yZGVyLCB0aGF0IHRoZSBzYW1lCitpbnRlcnJ1cHQgYXNzdW1wdGlvbnMgYXBwbHkgaW4gYWxsIHNpdHVhdGlvbnMsIGFuZCBzbyBvbi4gIEluIG90aGVyIHdvcmRzLAorbG9ja2RlcCBjYW4gZmluZCBhIG51bWJlciBvZiBzY2VuYXJpb3MgaW4gd2hpY2ggdGhlIHN5c3RlbSBjb3VsZCwgb24gcmFyZQorb2NjYXNpb24sIGRlYWRsb2NrLiAgVGhpcyBraW5kIG9mIHByb2JsZW0gY2FuIGJlIHBhaW5mdWwgKGZvciBib3RoCitkZXZlbG9wZXJzIGFuZCB1c2VycykgaW4gYSBkZXBsb3llZCBzeXN0ZW07IGxvY2tkZXAgYWxsb3dzIHRoZW0gdG8gYmUgZm91bmQKK2luIGFuIGF1dG9tYXRlZCBtYW5uZXIgYWhlYWQgb2YgdGltZS4gIENvZGUgd2l0aCBhbnkgc29ydCBvZiBub24tdHJpdmlhbAorbG9ja2luZyBzaG91bGQgYmUgcnVuIHdpdGggbG9ja2RlcCBlbmFibGVkIGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQgZm9yCitpbmNsdXNpb24uIAorCitBcyBhIGRpbGlnZW50IGtlcm5lbCBwcm9ncmFtbWVyLCB5b3Ugd2lsbCwgYmV5b25kIGRvdWJ0LCBjaGVjayB0aGUgcmV0dXJuCitzdGF0dXMgb2YgYW55IG9wZXJhdGlvbiAoc3VjaCBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uKSB3aGljaCBjYW4gZmFpbC4gIFRoZQorZmFjdCBvZiB0aGUgbWF0dGVyLCB0aG91Z2gsIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBmYWlsdXJlIHJlY292ZXJ5IHBhdGhzCithcmUsIHByb2JhYmx5LCBjb21wbGV0ZWx5IHVudGVzdGVkLiAgVW50ZXN0ZWQgY29kZSB0ZW5kcyB0byBiZSBicm9rZW4gY29kZTsKK3lvdSBjb3VsZCBiZSBtdWNoIG1vcmUgY29uZmlkZW50IG9mIHlvdXIgY29kZSBpZiBhbGwgdGhvc2UgZXJyb3ItaGFuZGxpbmcKK3BhdGhzIGhhZCBiZWVuIGV4ZXJjaXNlZCBhIGZldyB0aW1lcy4KKworVGhlIGtlcm5lbCBwcm92aWRlcyBhIGZhdWx0IGluamVjdGlvbiBmcmFtZXdvcmsgd2hpY2ggY2FuIGRvIGV4YWN0bHkgdGhhdCwKK2VzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBpbnZvbHZlZC4gIFdpdGggZmF1bHQgaW5qZWN0aW9uCitlbmFibGVkLCBhIGNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyB3aWxsIGJlIG1hZGUgdG8KK2ZhaWw7IHRoZXNlIGZhaWx1cmVzIGNhbiBiZSByZXN0cmljdGVkIHRvIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgY29kZS4KK1J1bm5pbmcgd2l0aCBmYXVsdCBpbmplY3Rpb24gZW5hYmxlZCBhbGxvd3MgdGhlIHByb2dyYW1tZXIgdG8gc2VlIGhvdyB0aGUKK2NvZGUgcmVzcG9uZHMgd2hlbiB0aGluZ3MgZ28gYmFkbHkuICBTZWUKK0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50ZXh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCitob3cgdG8gdXNlIHRoaXMgZmFjaWxpdHkuCisKK090aGVyIGtpbmRzIG9mIGVycm9ycyBjYW4gYmUgZm91bmQgd2l0aCB0aGUgInNwYXJzZSIgc3RhdGljIGFuYWx5c2lzIHRvb2wuCitXaXRoIHNwYXJzZSwgdGhlIHByb2dyYW1tZXIgY2FuIGJlIHdhcm5lZCBhYm91dCBjb25mdXNpb24gYmV0d2VlbgordXNlci1zcGFjZSBhbmQga2VybmVsLXNwYWNlIGFkZHJlc3NlcywgbWl4dHVyZSBvZiBiaWctZW5kaWFuIGFuZAorc21hbGwtZW5kaWFuIHF1YW50aXRpZXMsIHRoZSBwYXNzaW5nIG9mIGludGVnZXIgdmFsdWVzIHdoZXJlIGEgc2V0IG9mIGJpdAorZmxhZ3MgaXMgZXhwZWN0ZWQsIGFuZCBzbyBvbi4gIFNwYXJzZSBtdXN0IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5IChpdCBjYW4KK2JlIGZvdW5kIGF0IGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvZGV2ZWwvc3BhcnNlLyBpZiB5b3VyCitkaXN0cmlidXRvciBkb2VzIG5vdCBwYWNrYWdlIGl0KTsgaXQgY2FuIHRoZW4gYmUgcnVuIG9uIHRoZSBjb2RlIGJ5IGFkZGluZworIkM9MSIgdG8geW91ciBtYWtlIGNvbW1hbmQuCisKK090aGVyIGtpbmRzIG9mIHBvcnRhYmlsaXR5IGVycm9ycyBhcmUgYmVzdCBmb3VuZCBieSBjb21waWxpbmcgeW91ciBjb2RlIGZvcgorb3RoZXIgYXJjaGl0ZWN0dXJlcy4gIElmIHlvdSBkbyBub3QgaGFwcGVuIHRvIGhhdmUgYW4gUy8zOTAgc3lzdGVtIG9yIGEKK0JsYWNrZmluIGRldmVsb3BtZW50IGJvYXJkIGhhbmR5LCB5b3UgY2FuIHN0aWxsIHBlcmZvcm0gdGhlIGNvbXBpbGF0aW9uCitzdGVwLiAgQSBsYXJnZSBzZXQgb2YgY3Jvc3MgY29tcGlsZXJzIGZvciB4ODYgc3lzdGVtcyBjYW4gYmUgZm91bmQgYXQgCisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3Rvb2xzL2Nyb3NzdG9vbC8KKworU29tZSB0aW1lIHNwZW50IGluc3RhbGxpbmcgYW5kIHVzaW5nIHRoZXNlIGNvbXBpbGVycyB3aWxsIGhlbHAgYXZvaWQKK2VtYmFycmFzc21lbnQgbGF0ZXIuCisKKworNC4zOiBET0NVTUVOVEFUSU9OCisKK0RvY3VtZW50YXRpb24gaGFzIG9mdGVuIGJlZW4gbW9yZSB0aGUgZXhjZXB0aW9uIHRoYW4gdGhlIHJ1bGUgd2l0aCBrZXJuZWwKK2RldmVsb3BtZW50LiAgRXZlbiBzbywgYWRlcXVhdGUgZG9jdW1lbnRhdGlvbiB3aWxsIGhlbHAgdG8gZWFzZSB0aGUgbWVyZ2luZworb2YgbmV3IGNvZGUgaW50byB0aGUga2VybmVsLCBtYWtlIGxpZmUgZWFzaWVyIGZvciBvdGhlciBkZXZlbG9wZXJzLCBhbmQKK3dpbGwgYmUgaGVscGZ1bCBmb3IgeW91ciB1c2Vycy4gIEluIG1hbnkgY2FzZXMsIHRoZSBhZGRpdGlvbiBvZgorZG9jdW1lbnRhdGlvbiBoYXMgYmVjb21lIGVzc2VudGlhbGx5IG1hbmRhdG9yeS4KKworVGhlIGZpcnN0IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gZm9yIGFueSBwYXRjaCBpcyBpdHMgYXNzb2NpYXRlZAorY2hhbmdlbG9nLiAgTG9nIGVudHJpZXMgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgdGhlIGZvcm0KK29mIHRoZSBzb2x1dGlvbiwgdGhlIHBlb3BsZSB3aG8gd29ya2VkIG9uIHRoZSBwYXRjaCwgYW55IHJlbGV2YW50CitlZmZlY3RzIG9uIHBlcmZvcm1hbmNlLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0bwordW5kZXJzdGFuZCB0aGUgcGF0Y2guCisKK0FueSBjb2RlIHdoaWNoIGFkZHMgYSBuZXcgdXNlci1zcGFjZSBpbnRlcmZhY2UgLSBpbmNsdWRpbmcgbmV3IHN5c2ZzIG9yCisvcHJvYyBmaWxlcyAtIHNob3VsZCBpbmNsdWRlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBpbnRlcmZhY2Ugd2hpY2ggZW5hYmxlcwordXNlci1zcGFjZSBkZXZlbG9wZXJzIHRvIGtub3cgd2hhdCB0aGV5IGFyZSB3b3JraW5nIHdpdGguICBTZWUKK0RvY3VtZW50YXRpb24vQUJJL1JFQURNRSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyBkb2N1bWVudGF0aW9uIHNob3VsZAorYmUgZm9ybWF0dGVkIGFuZCB3aGF0IGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb3ZpZGVkLgorCitUaGUgZmlsZSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBkZXNjcmliZXMgYWxsIG9mIHRoZSBrZXJuZWwncworYm9vdC10aW1lIHBhcmFtZXRlcnMuICBBbnkgcGF0Y2ggd2hpY2ggYWRkcyBuZXcgcGFyYW1ldGVycyBzaG91bGQgYWRkIHRoZQorYXBwcm9wcmlhdGUgZW50cmllcyB0byB0aGlzIGZpbGUuCisKK0FueSBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgaGVscCB0ZXh0IHdoaWNoCitjbGVhcmx5IGV4cGxhaW5zIHRoZSBvcHRpb25zIGFuZCB3aGVuIHRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8gc2VsZWN0IHRoZW0uIAorCitJbnRlcm5hbCBBUEkgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3Vic3lzdGVtcyBpcyBkb2N1bWVudGVkIGJ5IHdheSBvZgorc3BlY2lhbGx5LWZvcm1hdHRlZCBjb21tZW50czsgdGhlc2UgY29tbWVudHMgY2FuIGJlIGV4dHJhY3RlZCBhbmQgZm9ybWF0dGVkCitpbiBhIG51bWJlciBvZiB3YXlzIGJ5IHRoZSAia2VybmVsLWRvYyIgc2NyaXB0LiAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGhpbgorYSBzdWJzeXN0ZW0gd2hpY2ggaGFzIGtlcm5lbGRvYyBjb21tZW50cywgeW91IHNob3VsZCBtYWludGFpbiB0aGVtIGFuZCBhZGQKK3RoZW0sIGFzIGFwcHJvcHJpYXRlLCBmb3IgZXh0ZXJuYWxseS1hdmFpbGFibGUgZnVuY3Rpb25zLiAgRXZlbiBpbiBhcmVhcword2hpY2ggaGF2ZSBub3QgYmVlbiBzbyBkb2N1bWVudGVkLCB0aGVyZSBpcyBubyBoYXJtIGluIGFkZGluZyBrZXJuZWxkb2MKK2NvbW1lbnRzIGZvciB0aGUgZnV0dXJlOyBpbmRlZWQsIHRoaXMgY2FuIGJlIGEgdXNlZnVsIGFjdGl2aXR5IGZvcgorYmVnaW5uaW5nIGtlcm5lbCBkZXZlbG9wZXJzLiAgVGhlIGZvcm1hdCBvZiB0aGVzZSBjb21tZW50cywgYWxvbmcgd2l0aCBzb21lCitpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3JlYXRlIGtlcm5lbGRvYyB0ZW1wbGF0ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlCitEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQuCisKK0FueWJvZHkgd2hvIHJlYWRzIHRocm91Z2ggYSBzaWduaWZpY2FudCBhbW91bnQgb2YgZXhpc3Rpbmcga2VybmVsIGNvZGUgd2lsbAorbm90ZSB0aGF0LCBvZnRlbiwgY29tbWVudHMgYXJlIG1vc3Qgbm90YWJsZSBieSB0aGVpciBhYnNlbmNlLiAgT25jZSBhZ2FpbiwKK3RoZSBleHBlY3RhdGlvbnMgZm9yIG5ldyBjb2RlIGFyZSBoaWdoZXIgdGhhbiB0aGV5IHdlcmUgaW4gdGhlIHBhc3Q7CittZXJnaW5nIHVuY29tbWVudGVkIGNvZGUgd2lsbCBiZSBoYXJkZXIuICBUaGF0IHNhaWQsIHRoZXJlIGlzIGxpdHRsZSBkZXNpcmUKK2ZvciB2ZXJib3NlbHktY29tbWVudGVkIGNvZGUuICBUaGUgY29kZSBzaG91bGQsIGl0c2VsZiwgYmUgcmVhZGFibGUsIHdpdGgKK2NvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIG1vcmUgc3VidGxlIGFzcGVjdHMuCisKK0NlcnRhaW4gdGhpbmdzIHNob3VsZCBhbHdheXMgYmUgY29tbWVudGVkLiAgVXNlcyBvZiBtZW1vcnkgYmFycmllcnMgc2hvdWxkCitiZSBhY2NvbXBhbmllZCBieSBhIGxpbmUgZXhwbGFpbmluZyB3aHkgdGhlIGJhcnJpZXIgaXMgbmVjZXNzYXJ5LiAgVGhlCitsb2NraW5nIHJ1bGVzIGZvciBkYXRhIHN0cnVjdHVyZXMgZ2VuZXJhbGx5IG5lZWQgdG8gYmUgZXhwbGFpbmVkIHNvbWV3aGVyZS4KK01ham9yIGRhdGEgc3RydWN0dXJlcyBuZWVkIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBpbiBnZW5lcmFsLgorTm9uLW9idmlvdXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gc2VwYXJhdGUgYml0cyBvZiBjb2RlIHNob3VsZCBiZSBwb2ludGVkCitvdXQuICBBbnl0aGluZyB3aGljaCBtaWdodCB0ZW1wdCBhIGNvZGUgamFuaXRvciB0byBtYWtlIGFuIGluY29ycmVjdAorImNsZWFudXAiIG5lZWRzIGEgY29tbWVudCBzYXlpbmcgd2h5IGl0IGlzIGRvbmUgdGhlIHdheSBpdCBpcy4gIEFuZCBzbyBvbi4KKworCis0LjQ6IElOVEVSTkFMIEFQSSBDSEFOR0VTCisKK1RoZSBiaW5hcnkgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwgdG8gdXNlciBzcGFjZSBjYW5ub3QgYmUgYnJva2VuCitleGNlcHQgdW5kZXIgdGhlIG1vc3Qgc2V2ZXJlIGNpcmN1bXN0YW5jZXMuICBUaGUga2VybmVsJ3MgaW50ZXJuYWwKK3Byb2dyYW1taW5nIGludGVyZmFjZXMsIGluc3RlYWQsIGFyZSBoaWdobHkgZmx1aWQgYW5kIGNhbiBiZSBjaGFuZ2VkIHdoZW4KK3RoZSBuZWVkIGFyaXNlcy4gIElmIHlvdSBmaW5kIHlvdXJzZWxmIGhhdmluZyB0byB3b3JrIGFyb3VuZCBhIGtlcm5lbCBBUEksCitvciBzaW1wbHkgbm90IHVzaW5nIGEgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBiZWNhdXNlIGl0IGRvZXMgbm90IG1lZXQgeW91cgorbmVlZHMsIHRoYXQgbWF5IGJlIGEgc2lnbiB0aGF0IHRoZSBBUEkgbmVlZHMgdG8gY2hhbmdlLiAgQXMgYSBrZXJuZWwKK2RldmVsb3BlciwgeW91IGFyZSBlbXBvd2VyZWQgdG8gbWFrZSBzdWNoIGNoYW5nZXMuCisKK1RoZXJlIGFyZSwgb2YgY291cnNlLCBzb21lIGNhdGNoZXMuICBBUEkgY2hhbmdlcyBjYW4gYmUgbWFkZSwgYnV0IHRoZXkgbmVlZAordG8gYmUgd2VsbCBqdXN0aWZpZWQuICBTbyBhbnkgcGF0Y2ggbWFraW5nIGFuIGludGVybmFsIEFQSSBjaGFuZ2Ugc2hvdWxkIGJlCithY2NvbXBhbmllZCBieSBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNoYW5nZSBpcyBhbmQgd2h5IGl0IGlzCituZWNlc3NhcnkuICBUaGlzIGtpbmQgb2YgY2hhbmdlIHNob3VsZCBhbHNvIGJlIGJyb2tlbiBvdXQgaW50byBhIHNlcGFyYXRlCitwYXRjaCwgcmF0aGVyIHRoYW4gYnVyaWVkIHdpdGhpbiBhIGxhcmdlciBwYXRjaC4KKworVGhlIG90aGVyIGNhdGNoIGlzIHRoYXQgYSBkZXZlbG9wZXIgd2hvIGNoYW5nZXMgYW4gaW50ZXJuYWwgQVBJIGlzCitnZW5lcmFsbHkgY2hhcmdlZCB3aXRoIHRoZSB0YXNrIG9mIGZpeGluZyBhbnkgY29kZSB3aXRoaW4gdGhlIGtlcm5lbCB0cmVlCit3aGljaCBpcyBicm9rZW4gYnkgdGhlIGNoYW5nZS4gIEZvciBhIHdpZGVseS11c2VkIGZ1bmN0aW9uLCB0aGlzIGR1dHkgY2FuCitsZWFkIHRvIGxpdGVyYWxseSBodW5kcmVkcyBvciB0aG91c2FuZHMgb2YgY2hhbmdlcyAtIG1hbnkgb2Ygd2hpY2ggYXJlCitsaWtlbHkgdG8gY29uZmxpY3Qgd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXIgZGV2ZWxvcGVycy4gIE5lZWRsZXNzIHRvCitzYXksIHRoaXMgY2FuIGJlIGEgbGFyZ2Ugam9iLCBzbyBpdCBpcyBiZXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUKK2p1c3RpZmljYXRpb24gaXMgc29saWQuCisKK1doZW4gbWFraW5nIGFuIGluY29tcGF0aWJsZSBBUEkgY2hhbmdlLCBvbmUgc2hvdWxkLCB3aGVuZXZlciBwb3NzaWJsZSwKK2Vuc3VyZSB0aGF0IGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXMgY2F1Z2h0IGJ5IHRoZSBjb21waWxlci4gIAorVGhpcyB3aWxsIGhlbHAgeW91IHRvIGJlIHN1cmUgdGhhdCB5b3UgaGF2ZSBmb3VuZCBhbGwgaW4tdHJlZSB1c2VzIG9mIHRoYXQKK2ludGVyZmFjZS4gIEl0IHdpbGwgYWxzbyBhbGVydCBkZXZlbG9wZXJzIG9mIG91dC1vZi10cmVlIGNvZGUgdGhhdCB0aGVyZSBpcworYSBjaGFuZ2UgdGhhdCB0aGV5IG5lZWQgdG8gcmVzcG9uZCB0by4gIFN1cHBvcnRpbmcgb3V0LW9mLXRyZWUgY29kZSBpcyBub3QKK3NvbWV0aGluZyB0aGF0IGtlcm5lbCBkZXZlbG9wZXJzIG5lZWQgdG8gYmUgd29ycmllZCBhYm91dCwgYnV0IHdlIGFsc28gZG8KK25vdCBoYXZlIHRvIG1ha2UgbGlmZSBoYXJkZXIgZm9yIG91dC1vZi10cmVlIGRldmVsb3BlcnMgdGhhbiBpdCBpdCBuZWVkcyB0bworYmUuIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ODEzMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcKQEAgLTAsMCArMSwyNzggQEAKKzU6IFBPU1RJTkcgUEFUQ0hFUworCitTb29uZXIgb3IgbGF0ZXIsIHRoZSB0aW1lIGNvbWVzIHdoZW4geW91ciB3b3JrIGlzIHJlYWR5IHRvIGJlIHByZXNlbnRlZCB0bwordGhlIGNvbW11bml0eSBmb3IgcmV2aWV3IGFuZCwgZXZlbnR1YWxseSwgaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBVbnN1cnByaXNpbmdseSwgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHkgaGFzIGV2b2x2ZWQgYSBzZXQKK29mIGNvbnZlbnRpb25zIGFuZCBwcm9jZWR1cmVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBwb3N0aW5nIG9mIHBhdGNoZXM7Citmb2xsb3dpbmcgdGhlbSB3aWxsIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgZXZlcnlib2R5IGludm9sdmVkLiAgVGhpcworZG9jdW1lbnQgd2lsbCBhdHRlbXB0IHRvIGNvdmVyIHRoZXNlIGV4cGVjdGF0aW9ucyBpbiByZWFzb25hYmxlIGRldGFpbDsKK21vcmUgaW5mb3JtYXRpb24gY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIGZpbGVzIFN1Ym1pdHRpbmdQYXRjaGVzLAorU3VibWl0dGluZ0RyaXZlcnMsIGFuZCBTdWJtaXRDaGVja2xpc3QgaW4gdGhlIGtlcm5lbCBkb2N1bWVudGF0aW9uCitkaXJlY3RvcnkuCisKKworNS4xOiBXSEVOIFRPIFBPU1QKKworVGhlcmUgaXMgYSBjb25zdGFudCB0ZW1wdGF0aW9uIHRvIGF2b2lkIHBvc3RpbmcgcGF0Y2hlcyBiZWZvcmUgdGhleSBhcmUKK2NvbXBsZXRlbHkgInJlYWR5LiIgIEZvciBzaW1wbGUgcGF0Y2hlcywgdGhhdCBpcyBub3QgYSBwcm9ibGVtLiAgSWYgdGhlCit3b3JrIGJlaW5nIGRvbmUgaXMgY29tcGxleCwgdGhvdWdoLCB0aGVyZSBpcyBhIGxvdCB0byBiZSBnYWluZWQgYnkgZ2V0dGluZworZmVlZGJhY2sgZnJvbSB0aGUgY29tbXVuaXR5IGJlZm9yZSB0aGUgd29yayBpcyBjb21wbGV0ZS4gIFNvIHlvdSBzaG91bGQKK2NvbnNpZGVyIHBvc3RpbmcgaW4tcHJvZ3Jlc3Mgd29yaywgb3IgZXZlbiBtYWtpbmcgYSBnaXQgdHJlZSBhdmFpbGFibGUgc28KK3RoYXQgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIGNhbiBjYXRjaCB1cCB3aXRoIHlvdXIgd29yayBhdCBhbnkgdGltZS4KKworV2hlbiBwb3N0aW5nIGNvZGUgd2hpY2ggaXMgbm90IHlldCBjb25zaWRlcmVkIHJlYWR5IGZvciBpbmNsdXNpb24sIGl0IGlzIGEKK2dvb2QgaWRlYSB0byBzYXkgc28gaW4gdGhlIHBvc3RpbmcgaXRzZWxmLiAgQWxzbyBtZW50aW9uIGFueSBtYWpvciB3b3JrCit3aGljaCByZW1haW5zIHRvIGJlIGRvbmUgYW5kIGFueSBrbm93biBwcm9ibGVtcy4gIEZld2VyIHBlb3BsZSB3aWxsIGxvb2sgYXQKK3BhdGNoZXMgd2hpY2ggYXJlIGtub3duIHRvIGJlIGhhbGYtYmFrZWQsIGJ1dCB0aG9zZSB3aG8gZG8gd2lsbCBjb21lIGluCit3aXRoIHRoZSBpZGVhIHRoYXQgdGhleSBjYW4gaGVscCB5b3UgZHJpdmUgdGhlIHdvcmsgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKworCis1LjI6IEJFRk9SRSBDUkVBVElORyBQQVRDSEVTCisKK1RoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3Mgd2hpY2ggc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHlvdSBjb25zaWRlcgorc2VuZGluZyBwYXRjaGVzIHRvIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuICBUaGVzZSBpbmNsdWRlOgorCisgLSBUZXN0IHRoZSBjb2RlIHRvIHRoZSBleHRlbnQgdGhhdCB5b3UgY2FuLiAgTWFrZSB1c2Ugb2YgdGhlIGtlcm5lbCdzCisgICBkZWJ1Z2dpbmcgdG9vbHMsIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgd2lsbCBidWlsZCB3aXRoIGFsbCByZWFzb25hYmxlCisgICBjb21iaW5hdGlvbnMgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLCB1c2UgY3Jvc3MtY29tcGlsZXJzIHRvIGJ1aWxkIGZvcgorICAgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMsIGV0Yy4KKworIC0gTWFrZSBzdXJlIHlvdXIgY29kZSBpcyBjb21wbGlhbnQgd2l0aCB0aGUga2VybmVsIGNvZGluZyBzdHlsZQorICAgZ3VpZGVsaW5lcy4KKworIC0gRG9lcyB5b3VyIGNoYW5nZSBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucz8gIElmIHNvLCB5b3Ugc2hvdWxkIHJ1bgorICAgYmVuY2htYXJrcyBzaG93aW5nIHdoYXQgdGhlIGltcGFjdCAob3IgYmVuZWZpdCkgb2YgeW91ciBjaGFuZ2UgaXM7IGEKKyAgIHN1bW1hcnkgb2YgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGggdGhlIHBhdGNoLgorCisgLSBCZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IHRvIHBvc3QgdGhlIGNvZGUuICBJZiB0aGlzIHdvcmsgd2FzIGRvbmUKKyAgIGZvciBhbiBlbXBsb3llciwgdGhlIGVtcGxveWVyIGxpa2VseSBoYXMgYSByaWdodCB0byB0aGUgd29yayBhbmQgbXVzdCBiZQorICAgYWdyZWVhYmxlIHdpdGggaXRzIHJlbGVhc2UgdW5kZXIgdGhlIEdQTC4KKworQXMgYSBnZW5lcmFsIHJ1bGUsIHB1dHRpbmcgaW4gc29tZSBleHRyYSB0aG91Z2h0IGJlZm9yZSBwb3N0aW5nIGNvZGUgYWxtb3N0CithbHdheXMgcGF5cyBiYWNrIHRoZSBlZmZvcnQgaW4gc2hvcnQgb3JkZXIuCisKKworNS4zOiBQQVRDSCBQUkVQQVJBVElPTgorCitUaGUgcHJlcGFyYXRpb24gb2YgcGF0Y2hlcyBmb3IgcG9zdGluZyBjYW4gYmUgYSBzdXJwcmlzaW5nIGFtb3VudCBvZiB3b3JrLAorYnV0LCBvbmNlIGFnYWluLCBhdHRlbXB0aW5nIHRvIHNhdmUgdGltZSBoZXJlIGlzIG5vdCBnZW5lcmFsbHkgYWR2aXNhYmxlCitldmVuIGluIHRoZSBzaG9ydCB0ZXJtLgorCitQYXRjaGVzIG11c3QgYmUgcHJlcGFyZWQgYWdhaW5zdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGtlcm5lbC4gIEFzIGEKK2dlbmVyYWwgcnVsZSwgYSBwYXRjaCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbWFpbmxpbmUgYXMgZm91bmQgaW4KK0xpbnVzJ3MgZ2l0IHRyZWUuICBJdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBtYWtlIHZlcnNpb25zIGFnYWluc3QgLW1tLAorbGludXgtbmV4dCwgb3IgYSBzdWJzeXN0ZW0gdHJlZSwgdGhvdWdoLCB0byBmYWNpbGl0YXRlIHdpZGVyIHRlc3RpbmcgYW5kCityZXZpZXcuICBEZXBlbmRpbmcgb24gdGhlIGFyZWEgb2YgeW91ciBwYXRjaCBhbmQgd2hhdCBpcyBnb2luZyBvbgorZWxzZXdoZXJlLCBiYXNpbmcgYSBwYXRjaCBhZ2FpbnN0IHRoZXNlIG90aGVyIHRyZWVzIGNhbiByZXF1aXJlIGEKK3NpZ25pZmljYW50IGFtb3VudCBvZiB3b3JrIHJlc29sdmluZyBjb25mbGljdHMgYW5kIGRlYWxpbmcgd2l0aCBBUEkKK2NoYW5nZXMuCisKK09ubHkgdGhlIG1vc3Qgc2ltcGxlIGNoYW5nZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBhIHNpbmdsZSBwYXRjaDsKK2V2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgYmUgbWFkZSBhcyBhIGxvZ2ljYWwgc2VyaWVzIG9mIGNoYW5nZXMuICBTcGxpdHRpbmcKK3VwIHBhdGNoZXMgaXMgYSBiaXQgb2YgYW4gYXJ0OyBzb21lIGRldmVsb3BlcnMgc3BlbmQgYSBsb25nIHRpbWUgZmlndXJpbmcKK291dCBob3cgdG8gZG8gaXQgaW4gdGhlIHdheSB0aGF0IHRoZSBjb21tdW5pdHkgZXhwZWN0cy4gIFRoZXJlIGFyZSBhIGZldworcnVsZXMgb2YgdGh1bWIsIGhvd2V2ZXIsIHdoaWNoIGNhbiBoZWxwIGNvbnNpZGVyYWJseToKKworIC0gVGhlIHBhdGNoIHNlcmllcyB5b3UgcG9zdCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgbm90IGJlIHRoZSBzZXJpZXMgb2YKKyAgIGNoYW5nZXMgZm91bmQgaW4geW91ciB3b3JraW5nIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLiAgSW5zdGVhZCwgdGhlCisgICBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgbmVlZCB0byBiZSBjb25zaWRlcmVkIGluIHRoZWlyIGZpbmFsIGZvcm0sIHRoZW4KKyAgIHNwbGl0IGFwYXJ0IGluIHdheXMgd2hpY2ggbWFrZSBzZW5zZS4gIFRoZSBkZXZlbG9wZXJzIGFyZSBpbnRlcmVzdGVkIGluCisgICBkaXNjcmV0ZSwgc2VsZi1jb250YWluZWQgY2hhbmdlcywgbm90IHRoZSBwYXRoIHlvdSB0b29rIHRvIGdldCB0byB0aG9zZQorICAgY2hhbmdlcy4KKworIC0gRWFjaCBsb2dpY2FsbHkgaW5kZXBlbmRlbnQgY2hhbmdlIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgYSBzZXBhcmF0ZQorICAgcGF0Y2guICBUaGVzZSBjaGFuZ2VzIGNhbiBiZSBzbWFsbCAoImFkZCBhIGZpZWxkIHRvIHRoaXMgc3RydWN0dXJlIikgb3IKKyAgIGxhcmdlIChhZGRpbmcgYSBzaWduaWZpY2FudCBuZXcgZHJpdmVyLCBmb3IgZXhhbXBsZSksIGJ1dCB0aGV5IHNob3VsZCBiZQorICAgY29uY2VwdHVhbGx5IHNtYWxsIGFuZCBhbWVuYWJsZSB0byBhIG9uZS1saW5lIGRlc2NyaXB0aW9uLiAgRWFjaCBwYXRjaAorICAgc2hvdWxkIG1ha2UgYSBzcGVjaWZpYyBjaGFuZ2Ugd2hpY2ggY2FuIGJlIHJldmlld2VkIG9uIGl0cyBvd24gYW5kCisgICB2ZXJpZmllZCB0byBkbyB3aGF0IGl0IHNheXMgaXQgZG9lcy4KKworIC0gQXMgYSB3YXkgb2YgcmVzdGF0aW5nIHRoZSBndWlkZWxpbmUgYWJvdmU6IGRvIG5vdCBtaXggZGlmZmVyZW50IHR5cGVzIG9mCisgICBjaGFuZ2VzIGluIHRoZSBzYW1lIHBhdGNoLiAgSWYgYSBzaW5nbGUgcGF0Y2ggZml4ZXMgYSBjcml0aWNhbCBzZWN1cml0eQorICAgYnVnLCByZWFycmFuZ2VzIGEgZmV3IHN0cnVjdHVyZXMsIGFuZCByZWZvcm1hdHMgdGhlIGNvZGUsIHRoZXJlIGlzIGEKKyAgIGdvb2QgY2hhbmNlIHRoYXQgaXQgd2lsbCBiZSBwYXNzZWQgb3ZlciBhbmQgdGhlIGltcG9ydGFudCBmaXggd2lsbCBiZQorICAgbG9zdC4KKworIC0gRWFjaCBwYXRjaCBzaG91bGQgeWllbGQgYSBrZXJuZWwgd2hpY2ggYnVpbGRzIGFuZCBydW5zIHByb3Blcmx5OyBpZiB5b3VyCisgICBwYXRjaCBzZXJpZXMgaXMgaW50ZXJydXB0ZWQgaW4gdGhlIG1pZGRsZSwgdGhlIHJlc3VsdCBzaG91bGQgc3RpbGwgYmUgYQorICAgd29ya2luZyBrZXJuZWwuICBQYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGEgcGF0Y2ggc2VyaWVzIGlzIGEgY29tbW9uCisgICBzY2VuYXJpbyB3aGVuIHRoZSAiZ2l0IGJpc2VjdCIgdG9vbCBpcyB1c2VkIHRvIGZpbmQgcmVncmVzc2lvbnM7IGlmIHRoZQorICAgcmVzdWx0IGlzIGEgYnJva2VuIGtlcm5lbCwgeW91IHdpbGwgbWFrZSBsaWZlIGhhcmRlciBmb3IgZGV2ZWxvcGVycyBhbmQKKyAgIHVzZXJzIHdobyBhcmUgZW5nYWdpbmcgaW4gdGhlIG5vYmxlIHdvcmsgb2YgdHJhY2tpbmcgZG93biBwcm9ibGVtcy4KKworIC0gRG8gbm90IG92ZXJkbyBpdCwgdGhvdWdoLiAgT25lIGRldmVsb3BlciByZWNlbnRseSBwb3N0ZWQgYSBzZXQgb2YgZWRpdHMKKyAgIHRvIGEgc2luZ2xlIGZpbGUgYXMgNTAwIHNlcGFyYXRlIHBhdGNoZXMgLSBhbiBhY3Qgd2hpY2ggZGlkIG5vdCBtYWtlIGhpbQorICAgdGhlIG1vc3QgcG9wdWxhciBwZXJzb24gb24gdGhlIGtlcm5lbCBtYWlsaW5nIGxpc3QuICBBIHNpbmdsZSBwYXRjaCBjYW4KKyAgIGJlIHJlYXNvbmFibHkgbGFyZ2UgYXMgbG9uZyBhcyBpdCBzdGlsbCBjb250YWlucyBhIHNpbmdsZSAqbG9naWNhbCoKKyAgIGNoYW5nZS4gCisKKyAtIEl0IGNhbiBiZSB0ZW1wdGluZyB0byBhZGQgYSB3aG9sZSBuZXcgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBhIHNlcmllcyBvZgorICAgcGF0Y2hlcywgYnV0IHRvIGxlYXZlIHRoYXQgaW5mcmFzdHJ1Y3R1cmUgdW51c2VkIHVudGlsIHRoZSBmaW5hbCBwYXRjaAorICAgaW4gdGhlIHNlcmllcyBlbmFibGVzIHRoZSB3aG9sZSB0aGluZy4gIFRoaXMgdGVtcHRhdGlvbiBzaG91bGQgYmUKKyAgIGF2b2lkZWQgaWYgcG9zc2libGU7IGlmIHRoYXQgc2VyaWVzIGFkZHMgcmVncmVzc2lvbnMsIGJpc2VjdGlvbiB3aWxsCisgICBmaW5nZXIgdGhlIGxhc3QgcGF0Y2ggYXMgdGhlIG9uZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0sIGV2ZW4gdGhvdWdoCisgICB0aGUgcmVhbCBidWcgaXMgZWxzZXdoZXJlLiAgV2hlbmV2ZXIgcG9zc2libGUsIGEgcGF0Y2ggd2hpY2ggYWRkcyBuZXcKKyAgIGNvZGUgc2hvdWxkIG1ha2UgdGhhdCBjb2RlIGFjdGl2ZSBpbW1lZGlhdGVseS4KKworV29ya2luZyB0byBjcmVhdGUgdGhlIHBlcmZlY3QgcGF0Y2ggc2VyaWVzIGNhbiBiZSBhIGZydXN0cmF0aW5nIHByb2Nlc3MKK3doaWNoIHRha2VzIHF1aXRlIGEgYml0IG9mIHRpbWUgYW5kIHRob3VnaHQgYWZ0ZXIgdGhlICJyZWFsIHdvcmsiIGhhcyBiZWVuCitkb25lLiAgV2hlbiBkb25lIHByb3Blcmx5LCB0aG91Z2gsIGl0IGlzIHRpbWUgd2VsbCBzcGVudC4KKworCis1LjQ6IFBBVENIIEZPUk1BVFRJTkcKKworU28gbm93IHlvdSBoYXZlIGEgcGVyZmVjdCBzZXJpZXMgb2YgcGF0Y2hlcyBmb3IgcG9zdGluZywgYnV0IHRoZSB3b3JrIGlzCitub3QgZG9uZSBxdWl0ZSB5ZXQuICBFYWNoIHBhdGNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgbWVzc2FnZSB3aGljaAorcXVpY2tseSBhbmQgY2xlYXJseSBjb21tdW5pY2F0ZXMgaXRzIHB1cnBvc2UgdG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLiAgVG8KK3RoYXQgZW5kLCBlYWNoIHBhdGNoIHdpbGwgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKKworIC0gQW4gb3B0aW9uYWwgIkZyb20iIGxpbmUgbmFtaW5nIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGhpcyBsaW5lIGlzCisgICBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIHBhc3Npbmcgb24gc29tZWJvZHkgZWxzZSdzIHBhdGNoIHZpYSBlbWFpbCwKKyAgIGJ1dCBpdCBuZXZlciBodXJ0cyB0byBhZGQgaXQgd2hlbiBpbiBkb3VidC4KKworIC0gQSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBwYXRjaCBkb2VzLiAgVGhpcyBtZXNzYWdlIHNob3VsZCBiZQorICAgZW5vdWdoIGZvciBhIHJlYWRlciB3aG8gc2VlcyBpdCB3aXRoIG5vIG90aGVyIGNvbnRleHQgdG8gZmlndXJlIG91dCB0aGUKKyAgIHNjb3BlIG9mIHRoZSBwYXRjaDsgaXQgaXMgdGhlIGxpbmUgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlICJzaG9ydCBmb3JtIgorICAgY2hhbmdlbG9ncy4gIFRoaXMgbWVzc2FnZSBpcyB1c3VhbGx5IGZvcm1hdHRlZCB3aXRoIHRoZSByZWxldmFudAorICAgc3Vic3lzdGVtIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwdXJwb3NlIG9mIHRoZSBwYXRjaC4gIEZvcgorICAgZXhhbXBsZToKKworCWdwaW86IGZpeCBidWlsZCBvbiBDT05GSUdfR1BJT19TWVNGUz1uCisKKyAtIEEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgIHBhdGNoLiAgVGhpcyBkZXNjcmlwdGlvbiBjYW4gYmUgYXMgbG9uZyBhcyBpcyByZXF1aXJlZDsgaXQgc2hvdWxkIHNheQorICAgd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBrZXJuZWwuCisKKyAtIE9uZSBvciBtb3JlIHRhZyBsaW5lcywgd2l0aCwgYXQgYSBtaW5pbXVtLCBvbmUgU2lnbmVkLW9mZi1ieTogbGluZSBmcm9tCisgICB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4gIFRhZ3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCisKK1RoZSBhYm92ZSB0aHJlZSBpdGVtcyBzaG91bGQsIG5vcm1hbGx5LCBiZSB0aGUgdGV4dCB1c2VkIHdoZW4gY29tbWl0dGluZwordGhlIGNoYW5nZSB0byBhIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLiAgVGhleSBhcmUgZm9sbG93ZWQgYnk6CisKKyAtIFRoZSBwYXRjaCBpdHNlbGYsIGluIHRoZSB1bmlmaWVkICgiLXUiKSBwYXRjaCBmb3JtYXQuICBVc2luZyB0aGUgIi1wIgorICAgb3B0aW9uIHRvIGRpZmYgd2lsbCBhc3NvY2lhdGUgZnVuY3Rpb24gbmFtZXMgd2l0aCBjaGFuZ2VzLCBtYWtpbmcgdGhlCisgICByZXN1bHRpbmcgcGF0Y2ggZWFzaWVyIGZvciBvdGhlcnMgdG8gcmVhZC4KKworWW91IHNob3VsZCBhdm9pZCBpbmNsdWRpbmcgY2hhbmdlcyB0byBpcnJlbGV2YW50IGZpbGVzICh0aG9zZSBnZW5lcmF0ZWQgYnkKK3RoZSBidWlsZCBwcm9jZXNzLCBmb3IgZXhhbXBsZSwgb3IgZWRpdG9yIGJhY2t1cCBmaWxlcykgaW4gdGhlIHBhdGNoLiAgVGhlCitmaWxlICJkb250ZGlmZiIgaW4gdGhlIERvY3VtZW50YXRpb24gZGlyZWN0b3J5IGNhbiBoZWxwIGluIHRoaXMgcmVnYXJkOworcGFzcyBpdCB0byBkaWZmIHdpdGggdGhlICItWCIgb3B0aW9uLgorCitUaGUgdGFncyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHZhcmlvdXMgZGV2ZWxvcGVycyBoYXZlCitiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBwYXRjaC4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgorZGV0YWlsIGluIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudDsgd2hhdCBmb2xsb3dzIGhlcmUgaXMgYSBicmllZgorc3VtbWFyeS4gIEVhY2ggb2YgdGhlc2UgbGluZXMgaGFzIHRoZSBmb3JtYXQ6CisKKwl0YWc6IEZ1bGwgTmFtZSA8ZW1haWwgYWRkcmVzcz4gIG9wdGlvbmFsLW90aGVyLXN0dWZmCisKK1RoZSB0YWdzIGluIGNvbW1vbiB1c2UgYXJlOgorCisgLSBTaWduZWQtb2ZmLWJ5OiB0aGlzIGlzIGEgZGV2ZWxvcGVyJ3MgY2VydGlmaWNhdGlvbiB0aGF0IGhlIG9yIHNoZSBoYXMKKyAgIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLiAgSXQgaXMgYW4KKyAgIGFncmVlbWVudCB0byB0aGUgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luLCB0aGUgZnVsbCB0ZXh0IG9mCisgICB3aGljaCBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4gIENvZGUgd2l0aG91dCBhCisgICBwcm9wZXIgc2lnbm9mZiBjYW5ub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lLgorCisgLSBBY2tlZC1ieTogaW5kaWNhdGVzIGFuIGFncmVlbWVudCBieSBhbm90aGVyIGRldmVsb3BlciAob2Z0ZW4gYQorICAgbWFpbnRhaW5lciBvZiB0aGUgcmVsZXZhbnQgY29kZSkgdGhhdCB0aGUgcGF0Y2ggaXMgYXBwcm9wcmlhdGUgZm9yCisgICBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLgorCisgLSBUZXN0ZWQtYnk6IHN0YXRlcyB0aGF0IHRoZSBuYW1lZCBwZXJzb24gaGFzIHRlc3RlZCB0aGUgcGF0Y2ggYW5kIGZvdW5kCisgICBpdCB0byB3b3JrLgorCisgLSBSZXZpZXdlZC1ieTogdGhlIG5hbWVkIGRldmVsb3BlciBoYXMgcmV2aWV3ZWQgdGhlIHBhdGNoIGZvciBjb3JyZWN0bmVzczsKKyAgIHNlZSB0aGUgcmV2aWV3ZXIncyBzdGF0ZW1lbnQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBmb3IgbW9yZQorICAgZGV0YWlsLgorCisgLSBSZXBvcnRlZC1ieTogbmFtZXMgYSB1c2VyIHdobyByZXBvcnRlZCBhIHByb2JsZW0gd2hpY2ggaXMgZml4ZWQgYnkgdGhpcworICAgcGF0Y2g7IHRoaXMgdGFnIGlzIHVzZWQgdG8gZ2l2ZSBjcmVkaXQgdG8gdGhlIChvZnRlbiB1bmRlcmFwcHJlY2lhdGVkKQorICAgcGVvcGxlIHdobyB0ZXN0IG91ciBjb2RlIGFuZCBsZXQgdXMga25vdyB3aGVuIHRoaW5ncyBkbyBub3Qgd29yaworICAgY29ycmVjdGx5LgorCisgLSBDYzogdGhlIG5hbWVkIHBlcnNvbiByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIHBhdGNoIGFuZCBoYWQgdGhlCisgICBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGl0LgorCitCZSBjYXJlZnVsIGluIHRoZSBhZGRpdGlvbiBvZiB0YWdzIHRvIHlvdXIgcGF0Y2hlczogb25seSBDYzogaXMgYXBwcm9wcmlhdGUKK2ZvciBhZGRpdGlvbiB3aXRob3V0IHRoZSBleHBsaWNpdCBwZXJtaXNzaW9uIG9mIHRoZSBwZXJzb24gbmFtZWQuCisKKworNS41OiBTRU5ESU5HIFRIRSBQQVRDSAorCitCZWZvcmUgeW91IG1haWwgeW91ciBwYXRjaGVzLCB0aGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgdGhpbmdzIHlvdSBzaG91bGQKK3Rha2UgY2FyZSBvZjoKKworIC0gQXJlIHlvdSBzdXJlIHRoYXQgeW91ciBtYWlsZXIgd2lsbCBub3QgY29ycnVwdCB0aGUgcGF0Y2hlcz8gIFBhdGNoZXMKKyAgIHdoaWNoIGhhdmUgaGFkIGdyYXR1aXRvdXMgd2hpdGUtc3BhY2UgY2hhbmdlcyBvciBsaW5lIHdyYXBwaW5nIHBlcmZvcm1lZAorICAgYnkgdGhlIG1haWwgY2xpZW50IHdpbGwgbm90IGFwcGx5IGF0IHRoZSBvdGhlciBlbmQsIGFuZCBvZnRlbiB3aWxsIG5vdAorICAgYmUgZXhhbWluZWQgaW4gYW55IGRldGFpbC4gIElmIHRoZXJlIGlzIGFueSBkb3VidCBhdCBhbGwsIG1haWwgdGhlIHBhdGNoCisgICB0byB5b3Vyc2VsZiBhbmQgY29udmluY2UgeW91cnNlbGYgdGhhdCBpdCBzaG93cyB1cCBpbnRhY3QuICAKKworICAgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBoYXMgc29tZSBoZWxwZnVsIGhpbnRzIG9uIG1ha2luZworICAgc3BlY2lmaWMgbWFpbCBjbGllbnRzIHdvcmsgZm9yIHNlbmRpbmcgcGF0Y2hlcy4KKworIC0gQXJlIHlvdSBzdXJlIHlvdXIgcGF0Y2ggaXMgZnJlZSBvZiBzaWxseSBtaXN0YWtlcz8gIFlvdSBzaG91bGQgYWx3YXlzCisgICBydW4gcGF0Y2hlcyB0aHJvdWdoIHNjcmlwdHMvY2hlY2twYXRjaC5wbCBhbmQgYWRkcmVzcyB0aGUgY29tcGxhaW50cyBpdAorICAgY29tZXMgdXAgd2l0aC4gIFBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCBjaGVja3BhdGNoLnBsLCB3aGlsZSBiZWluZyB0aGUKKyAgIGVtYm9kaW1lbnQgb2YgYSBmYWlyIGFtb3VudCBvZiB0aG91Z2h0IGFib3V0IHdoYXQga2VybmVsIHBhdGNoZXMgc2hvdWxkCisgICBsb29rIGxpa2UsIGlzIG5vdCBzbWFydGVyIHRoYW4geW91LiAgSWYgZml4aW5nIGEgY2hlY2twYXRjaC5wbCBjb21wbGFpbnQKKyAgIHdvdWxkIG1ha2UgdGhlIGNvZGUgd29yc2UsIGRvbid0IGRvIGl0LgorCitQYXRjaGVzIHNob3VsZCBhbHdheXMgYmUgc2VudCBhcyBwbGFpbiB0ZXh0LiAgUGxlYXNlIGRvIG5vdCBzZW5kIHRoZW0gYXMKK2F0dGFjaG1lbnRzOyB0aGF0IG1ha2VzIGl0IG11Y2ggaGFyZGVyIGZvciByZXZpZXdlcnMgdG8gcXVvdGUgc2VjdGlvbnMgb2YKK3RoZSBwYXRjaCBpbiB0aGVpciByZXBsaWVzLiAgSW5zdGVhZCwganVzdCBwdXQgdGhlIHBhdGNoIGRpcmVjdGx5IGludG8geW91cgorbWVzc2FnZS4KKworV2hlbiBtYWlsaW5nIHBhdGNoZXMsIGl0IGlzIGltcG9ydGFudCB0byBzZW5kIGNvcGllcyB0byBhbnlib2R5IHdobyBtaWdodAorYmUgaW50ZXJlc3RlZCBpbiBpdC4gIFVubGlrZSBzb21lIG90aGVyIHByb2plY3RzLCB0aGUga2VybmVsIGVuY291cmFnZXMKK3Blb3BsZSB0byBlcnIgb24gdGhlIHNpZGUgb2Ygc2VuZGluZyB0b28gbWFueSBjb3BpZXM7IGRvbid0IGFzc3VtZSB0aGF0IHRoZQorcmVsZXZhbnQgcGVvcGxlIHdpbGwgc2VlIHlvdXIgcG9zdGluZyBvbiB0aGUgbWFpbGluZyBsaXN0cy4gIEluIHBhcnRpY3VsYXIsCitjb3BpZXMgc2hvdWxkIGdvIHRvOgorCisgLSBUaGUgbWFpbnRhaW5lcihzKSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtKHMpLiAgQXMgZGVzY3JpYmVkIGVhcmxpZXIsCisgICB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcyB0aGUgZmlyc3QgcGxhY2UgdG8gbG9vayBmb3IgdGhlc2UgcGVvcGxlLgorCisgLSBPdGhlciBkZXZlbG9wZXJzIHdobyBoYXZlIGJlZW4gd29ya2luZyBpbiB0aGUgc2FtZSBhcmVhIC0gZXNwZWNpYWxseQorICAgdGhvc2Ugd2hvIG1pZ2h0IGJlIHdvcmtpbmcgdGhlcmUgbm93LiAgVXNpbmcgZ2l0IHRvIHNlZSB3aG8gZWxzZSBoYXMKKyAgIG1vZGlmaWVkIHRoZSBmaWxlcyB5b3UgYXJlIHdvcmtpbmcgb24gY2FuIGJlIGhlbHBmdWwuCisKKyAtIElmIHlvdSBhcmUgcmVzcG9uZGluZyB0byBhIGJ1ZyByZXBvcnQgb3IgYSBmZWF0dXJlIHJlcXVlc3QsIGNvcHkgdGhlCisgICBvcmlnaW5hbCBwb3N0ZXIgYXMgd2VsbC4KKworIC0gU2VuZCBhIGNvcHkgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgb3IsIGlmIG5vdGhpbmcgZWxzZSBhcHBsaWVzLAorICAgdGhlIGxpbnV4LWtlcm5lbCBsaXN0LgorCisgLSBJZiB5b3UgYXJlIGZpeGluZyBhIGJ1ZywgdGhpbmsgYWJvdXQgd2hldGhlciB0aGUgZml4IHNob3VsZCBnbyBpbnRvIHRoZQorICAgbmV4dCBzdGFibGUgdXBkYXRlLiAgSWYgc28sIHN0YWJsZUBrZXJuZWwub3JnIHNob3VsZCBnZXQgYSBjb3B5IG9mIHRoZQorICAgcGF0Y2guICBBbHNvIGFkZCBhICJDYzogc3RhYmxlQGtlcm5lbC5vcmciIHRvIHRoZSB0YWdzIHdpdGhpbiB0aGUgcGF0Y2gKKyAgIGl0c2VsZjsgdGhhdCB3aWxsIGNhdXNlIHRoZSBzdGFibGUgdGVhbSB0byBnZXQgYSBub3RpZmljYXRpb24gd2hlbiB5b3VyCisgICBmaXggZ29lcyBpbnRvIHRoZSBtYWlubGluZS4KKworV2hlbiBzZWxlY3RpbmcgcmVjaXBpZW50cyBmb3IgYSBwYXRjaCwgaXQgaXMgZ29vZCB0byBoYXZlIGFuIGlkZWEgb2Ygd2hvCit5b3UgdGhpbmsgd2lsbCBldmVudHVhbGx5IGFjY2VwdCB0aGUgcGF0Y2ggYW5kIGdldCBpdCBtZXJnZWQuICBXaGlsZSBpdAoraXMgcG9zc2libGUgdG8gc2VuZCBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIFRvcnZhbGRzIGFuZCBoYXZlIGhpbSBtZXJnZQordGhlbSwgdGhpbmdzIGFyZSBub3Qgbm9ybWFsbHkgZG9uZSB0aGF0IHdheS4gIExpbnVzIGlzIGJ1c3ksIGFuZCB0aGVyZSBhcmUKK3N1YnN5c3RlbSBtYWludGFpbmVycyB3aG8gd2F0Y2ggb3ZlciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsLiAgVXN1YWxseQoreW91IHdpbGwgYmUgd2FudGluZyB0aGF0IG1haW50YWluZXIgdG8gbWVyZ2UgeW91ciBwYXRjaGVzLiAgSWYgdGhlcmUgaXMgbm8KK29idmlvdXMgbWFpbnRhaW5lciwgQW5kcmV3IE1vcnRvbiBpcyBvZnRlbiB0aGUgcGF0Y2ggdGFyZ2V0IG9mIGxhc3QgcmVzb3J0LgorCitQYXRjaGVzIG5lZWQgZ29vZCBzdWJqZWN0IGxpbmVzLiAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgZm9yIGEgcGF0Y2ggbGluZSBpcworc29tZXRoaW5nIGxpa2U6CisKKwlbUEFUQ0ggbm4vbW1dIHN1YnN5czogb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHBhdGNoCisKK3doZXJlICJubiIgaXMgdGhlIG9yZGluYWwgbnVtYmVyIG9mIHRoZSBwYXRjaCwgIm1tIiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mCitwYXRjaGVzIGluIHRoZSBzZXJpZXMsIGFuZCAic3Vic3lzIiBpcyB0aGUgbmFtZSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtLgorQ2xlYXJseSwgbm4vbW0gY2FuIGJlIG9taXR0ZWQgZm9yIGEgc2luZ2xlLCBzdGFuZGFsb25lIHBhdGNoLiAgCisKK0lmIHlvdSBoYXZlIGEgc2lnbmlmaWNhbnQgc2VyaWVzIG9mIHBhdGNoZXMsIGl0IGlzIGN1c3RvbWFyeSB0byBzZW5kIGFuCitpbnRyb2R1Y3RvcnkgZGVzY3JpcHRpb24gYXMgcGFydCB6ZXJvLiAgVGhpcyBjb252ZW50aW9uIGlzIG5vdCB1bml2ZXJzYWxseQorZm9sbG93ZWQgdGhvdWdoOyBpZiB5b3UgdXNlIGl0LCByZW1lbWJlciB0aGF0IGluZm9ybWF0aW9uIGluIHRoZQoraW50cm9kdWN0aW9uIGRvZXMgbm90IG1ha2UgaXQgaW50byB0aGUga2VybmVsIGNoYW5nZWxvZ3MuICBTbyBwbGVhc2UgZW5zdXJlCit0aGF0IHRoZSBwYXRjaGVzLCB0aGVtc2VsdmVzLCBoYXZlIGNvbXBsZXRlIGNoYW5nZWxvZyBpbmZvcm1hdGlvbi4KKworSW4gZ2VuZXJhbCwgdGhlIHNlY29uZCBhbmQgZm9sbG93aW5nIHBhcnRzIG9mIGEgbXVsdGktcGFydCBwYXRjaCBzaG91bGQgYmUKK3NlbnQgYXMgYSByZXBseSB0byB0aGUgZmlyc3QgcGFydCBzbyB0aGF0IHRoZXkgYWxsIHRocmVhZCB0b2dldGhlciBhdCB0aGUKK3JlY2VpdmluZyBlbmQuICBUb29scyBsaWtlIGdpdCBhbmQgcXVpbHQgaGF2ZSBjb21tYW5kcyB0byBtYWlsIG91dCBhIHNldCBvZgorcGF0Y2hlcyB3aXRoIHRoZSBwcm9wZXIgdGhyZWFkaW5nLiAgSWYgeW91IGhhdmUgYSBsb25nIHNlcmllcywgdGhvdWdoLCBhbmQKK2FyZSB1c2luZyBnaXQsIHBsZWFzZSBwcm92aWRlIHRoZSAtLW5vLWNoYWluLXJlcGx5LXRvIG9wdGlvbiB0byBhdm9pZAorY3JlYXRpbmcgZXhjZXB0aW9uYWxseSBkZWVwIG5lc3RpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZiYTNkOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gKQEAgLTAsMCArMSwyMDIgQEAKKzY6IEZPTExPV1RIUk9VR0gKKworQXQgdGhpcyBwb2ludCwgeW91IGhhdmUgZm9sbG93ZWQgdGhlIGd1aWRlbGluZXMgZ2l2ZW4gc28gZmFyIGFuZCwgd2l0aCB0aGUKK2FkZGl0aW9uIG9mIHlvdXIgb3duIGVuZ2luZWVyaW5nIHNraWxscywgaGF2ZSBwb3N0ZWQgYSBwZXJmZWN0IHNlcmllcyBvZgorcGF0Y2hlcy4gIE9uZSBvZiB0aGUgYmlnZ2VzdCBtaXN0YWtlcyB0aGF0IGV2ZW4gZXhwZXJpZW5jZWQga2VybmVsCitkZXZlbG9wZXJzIGNhbiBtYWtlIGlzIHRvIGNvbmNsdWRlIHRoYXQgdGhlaXIgd29yayBpcyBub3cgZG9uZS4gIEluIHRydXRoLAorcG9zdGluZyBwYXRjaGVzIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW50byB0aGUgbmV4dCBzdGFnZSBvZiB0aGUgcHJvY2VzcywKK3dpdGgsIHBvc3NpYmx5LCBxdWl0ZSBhIGJpdCBvZiB3b3JrIHlldCB0byBiZSBkb25lLgorCitJdCBpcyBhIHJhcmUgcGF0Y2ggd2hpY2ggaXMgc28gZ29vZCBhdCBpdHMgZmlyc3QgcG9zdGluZyB0aGF0IHRoZXJlIGlzIG5vCityb29tIGZvciBpbXByb3ZlbWVudC4gIFRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyByZWNvZ25pemVzIHRoaXMgZmFjdCwKK2FuZCwgYXMgYSByZXN1bHQsIGlzIGhlYXZpbHkgb3JpZW50ZWQgdG93YXJkIHRoZSBpbXByb3ZlbWVudCBvZiBwb3N0ZWQKK2NvZGUuICBZb3UsIGFzIHRoZSBhdXRob3Igb2YgdGhhdCBjb2RlLCB3aWxsIGJlIGV4cGVjdGVkIHRvIHdvcmsgd2l0aCB0aGUKK2tlcm5lbCBjb21tdW5pdHkgdG8gZW5zdXJlIHRoYXQgeW91ciBjb2RlIGlzIHVwIHRvIHRoZSBrZXJuZWwncyBxdWFsaXR5CitzdGFuZGFyZHMuICBBIGZhaWx1cmUgdG8gcGFydGljaXBhdGUgaW4gdGhpcyBwcm9jZXNzIGlzIHF1aXRlIGxpa2VseSB0bworcHJldmVudCB0aGUgaW5jbHVzaW9uIG9mIHlvdXIgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZS4KKworCis2LjE6IFdPUktJTkcgV0lUSCBSRVZJRVdFUlMKKworQSBwYXRjaCBvZiBhbnkgc2lnbmlmaWNhbmNlIHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIG9mIGNvbW1lbnRzIGZyb20gb3RoZXIKK2RldmVsb3BlcnMgYXMgdGhleSByZXZpZXcgdGhlIGNvZGUuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGNhbiBiZSwgZm9yCittYW55IGRldmVsb3BlcnMsIHRoZSBtb3N0IGludGltaWRhdGluZyBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKK3Byb2Nlc3MuICBMaWZlIGNhbiBiZSBtYWRlIG11Y2ggZWFzaWVyLCB0aG91Z2gsIGlmIHlvdSBrZWVwIGEgZmV3IHRoaW5ncyBpbgorbWluZDoKKworIC0gSWYgeW91IGhhdmUgZXhwbGFpbmVkIHlvdXIgcGF0Y2ggd2VsbCwgcmV2aWV3ZXJzIHdpbGwgdW5kZXJzdGFuZCBpdHMKKyAgIHZhbHVlIGFuZCB3aHkgeW91IHdlbnQgdG8gdGhlIHRyb3VibGUgb2Ygd3JpdGluZyBpdC4gIEJ1dCB0aGF0IHZhbHVlCisgICB3aWxsIG5vdCBrZWVwIHRoZW0gZnJvbSBhc2tpbmcgYSBmdW5kYW1lbnRhbCBxdWVzdGlvbjogd2hhdCB3aWxsIGl0IGJlCisgICBsaWtlIHRvIG1haW50YWluIGEga2VybmVsIHdpdGggdGhpcyBjb2RlIGluIGl0IGZpdmUgb3IgdGVuIHllYXJzIGxhdGVyPworICAgTWFueSBvZiB0aGUgY2hhbmdlcyB5b3UgbWF5IGJlIGFza2VkIHRvIG1ha2UgLSBmcm9tIGNvZGluZyBzdHlsZSB0d2Vha3MKKyAgIHRvIHN1YnN0YW50aWFsIHJld3JpdGVzIC0gY29tZSBmcm9tIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgTGludXggd2lsbAorICAgc3RpbGwgYmUgYXJvdW5kIGFuZCB1bmRlciBkZXZlbG9wbWVudCBhIGRlY2FkZSBmcm9tIG5vdy4KKworIC0gQ29kZSByZXZpZXcgaXMgaGFyZCB3b3JrLCBhbmQgaXQgaXMgYSByZWxhdGl2ZWx5IHRoYW5rbGVzcyBvY2N1cGF0aW9uOworICAgcGVvcGxlIHJlbWVtYmVyIHdobyB3cm90ZSBrZXJuZWwgY29kZSwgYnV0IHRoZXJlIGlzIGxpdHRsZSBsYXN0aW5nIGZhbWUKKyAgIGZvciB0aG9zZSB3aG8gcmV2aWV3ZWQgaXQuICBTbyByZXZpZXdlcnMgY2FuIGdldCBncnVtcHksIGVzcGVjaWFsbHkgd2hlbgorICAgdGhleSBzZWUgdGhlIHNhbWUgbWlzdGFrZXMgYmVpbmcgbWFkZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYgeW91IGdldCBhCisgICByZXZpZXcgd2hpY2ggc2VlbXMgYW5ncnksIGluc3VsdGluZywgb3Igb3V0cmlnaHQgb2ZmZW5zaXZlLCByZXNpc3QgdGhlCisgICBpbXB1bHNlIHRvIHJlc3BvbmQgaW4ga2luZC4gIENvZGUgcmV2aWV3IGlzIGFib3V0IHRoZSBjb2RlLCBub3QgYWJvdXQKKyAgIHRoZSBwZW9wbGUsIGFuZCBjb2RlIHJldmlld2VycyBhcmUgbm90IGF0dGFja2luZyB5b3UgcGVyc29uYWxseS4KKworIC0gU2ltaWxhcmx5LCBjb2RlIHJldmlld2VycyBhcmUgbm90IHRyeWluZyB0byBwcm9tb3RlIHRoZWlyIGVtcGxveWVycycKKyAgIGFnZW5kYXMgYXQgdGhlIGV4cGVuc2Ugb2YgeW91ciBvd24uICBLZXJuZWwgZGV2ZWxvcGVycyBvZnRlbiBleHBlY3QgdG8KKyAgIGJlIHdvcmtpbmcgb24gdGhlIGtlcm5lbCB5ZWFycyBmcm9tIG5vdywgYnV0IHRoZXkgdW5kZXJzdGFuZCB0aGF0IHRoZWlyCisgICBlbXBsb3llciBjb3VsZCBjaGFuZ2UuICBUaGV5IHRydWx5IGFyZSwgYWxtb3N0IHdpdGhvdXQgZXhjZXB0aW9uLAorICAgd29ya2luZyB0b3dhcmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBiZXN0IGtlcm5lbCB0aGV5IGNhbjsgdGhleSBhcmUgbm90CisgICB0cnlpbmcgdG8gY3JlYXRlIGRpc2NvbWZvcnQgZm9yIHRoZWlyIGVtcGxveWVycycgY29tcGV0aXRvcnMuCisKK1doYXQgYWxsIG9mIHRoaXMgY29tZXMgZG93biB0byBpcyB0aGF0LCB3aGVuIHJldmlld2VycyBzZW5kIHlvdSBjb21tZW50cywKK3lvdSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIHRlY2huaWNhbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGV5IGFyZQorbWFraW5nLiAgRG8gbm90IGxldCB0aGVpciBmb3JtIG9mIGV4cHJlc3Npb24gb3IgeW91ciBvd24gcHJpZGUga2VlcCB0aGF0Citmcm9tIGhhcHBlbmluZy4gIFdoZW4geW91IGdldCByZXZpZXcgY29tbWVudHMgb24gYSBwYXRjaCwgdGFrZSB0aGUgdGltZSB0bwordW5kZXJzdGFuZCB3aGF0IHRoZSByZXZpZXdlciBpcyB0cnlpbmcgdG8gc2F5LiAgSWYgcG9zc2libGUsIGZpeCB0aGUgdGhpbmdzCit0aGF0IHRoZSByZXZpZXdlciBpcyBhc2tpbmcgeW91IHRvIGZpeC4gIEFuZCByZXNwb25kIGJhY2sgdG8gdGhlIHJldmlld2VyOgordGhhbmsgdGhlbSwgYW5kIGRlc2NyaWJlIGhvdyB5b3Ugd2lsbCBhbnN3ZXIgdGhlaXIgcXVlc3Rpb25zLgorCitOb3RlIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGFncmVlIHdpdGggZXZlcnkgY2hhbmdlIHN1Z2dlc3RlZCBieQorcmV2aWV3ZXJzLiAgSWYgeW91IGJlbGlldmUgdGhhdCB0aGUgcmV2aWV3ZXIgaGFzIG1pc3VuZGVyc3Rvb2QgeW91ciBjb2RlLAorZXhwbGFpbiB3aGF0IGlzIHJlYWxseSBnb2luZyBvbi4gIElmIHlvdSBoYXZlIGEgdGVjaG5pY2FsIG9iamVjdGlvbiB0byBhCitzdWdnZXN0ZWQgY2hhbmdlLCBkZXNjcmliZSBpdCBhbmQganVzdGlmeSB5b3VyIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLiAgSWYKK3lvdXIgZXhwbGFuYXRpb25zIG1ha2Ugc2Vuc2UsIHRoZSByZXZpZXdlciB3aWxsIGFjY2VwdCB0aGVtLiAgU2hvdWxkIHlvdXIKK2V4cGxhbmF0aW9uIG5vdCBwcm92ZSBwZXJzdWFzaXZlLCB0aG91Z2gsIGVzcGVjaWFsbHkgaWYgb3RoZXJzIHN0YXJ0IHRvCithZ3JlZSB3aXRoIHRoZSByZXZpZXdlciwgdGFrZSBzb21lIHRpbWUgdG8gdGhpbmsgdGhpbmdzIG92ZXIgYWdhaW4uICBJdCBjYW4KK2JlIGVhc3kgdG8gYmVjb21lIGJsaW5kZWQgYnkgeW91ciBvd24gc29sdXRpb24gdG8gYSBwcm9ibGVtIHRvIHRoZSBwb2ludAordGhhdCB5b3UgZG9uJ3QgcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBpcyBmdW5kYW1lbnRhbGx5IHdyb25nIG9yLCBwZXJoYXBzLAoreW91J3JlIG5vdCBldmVuIHNvbHZpbmcgdGhlIHJpZ2h0IHByb2JsZW0uCisKK09uZSBmYXRhbCBtaXN0YWtlIGlzIHRvIGlnbm9yZSByZXZpZXcgY29tbWVudHMgaW4gdGhlIGhvcGUgdGhhdCB0aGV5IHdpbGwKK2dvIGF3YXkuICBUaGV5IHdpbGwgbm90IGdvIGF3YXkuICBJZiB5b3UgcmVwb3N0IGNvZGUgd2l0aG91dCBoYXZpbmcKK3Jlc3BvbmRlZCB0byB0aGUgY29tbWVudHMgeW91IGdvdCB0aGUgdGltZSBiZWZvcmUsIHlvdSdyZSBsaWtlbHkgdG8gZmluZAordGhhdCB5b3VyIHBhdGNoZXMgZ28gbm93aGVyZS4KKworU3BlYWtpbmcgb2YgcmVwb3N0aW5nIGNvZGU6IHBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCByZXZpZXdlcnMgYXJlIG5vdAorZ29pbmcgdG8gcmVtZW1iZXIgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBjb2RlIHlvdSBwb3N0ZWQgdGhlIGxhc3QgdGltZQorYXJvdW5kLiAgU28gaXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlbWluZCByZXZpZXdlcnMgb2YgcHJldmlvdXNseQorcmFpc2VkIGlzc3VlcyBhbmQgaG93IHlvdSBkZWFsdCB3aXRoIHRoZW07IHRoZSBwYXRjaCBjaGFuZ2Vsb2cgaXMgYSBnb29kCitwbGFjZSBmb3IgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uLiAgUmV2aWV3ZXJzIHNob3VsZCBub3QgaGF2ZSB0byBzZWFyY2gKK3Rocm91Z2ggbGlzdCBhcmNoaXZlcyB0byBmYW1pbGlhcml6ZSB0aGVtc2VsdmVzIHdpdGggd2hhdCB3YXMgc2FpZCBsYXN0Cit0aW1lOyBpZiB5b3UgaGVscCB0aGVtIGdldCBhIHJ1bm5pbmcgc3RhcnQsIHRoZXkgd2lsbCBiZSBpbiBhIGJldHRlciBtb29kCit3aGVuIHRoZXkgcmV2aXNpdCB5b3VyIGNvZGUuCisKK1doYXQgaWYgeW91J3ZlIHRyaWVkIHRvIGRvIGV2ZXJ5dGhpbmcgcmlnaHQgYW5kIHRoaW5ncyBzdGlsbCBhcmVuJ3QgZ29pbmcKK2FueXdoZXJlPyAgTW9zdCB0ZWNobmljYWwgZGlzYWdyZWVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgdGhyb3VnaCBkaXNjdXNzaW9uLAorYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHNvbWVib2R5IHNpbXBseSBoYXMgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSWYgeW91Citob25lc3RseSBiZWxpZXZlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBnb2luZyBhZ2FpbnN0IHlvdSB3cm9uZ2x5LCB5b3UgY2FuCithbHdheXMgdHJ5IGFwcGVhbGluZyB0byBhIGhpZ2hlciBwb3dlci4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhhdCBoaWdoZXIKK3Bvd2VyIHRlbmRzIHRvIGJlIEFuZHJldyBNb3J0b24uICBBbmRyZXcgaGFzIGEgZ3JlYXQgZGVhbCBvZiByZXNwZWN0IGluIHRoZQora2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eTsgaGUgY2FuIG9mdGVuIHVuamFtIGEgc2l0dWF0aW9uIHdoaWNoIHNlZW1zIHRvCitiZSBob3BlbGVzc2x5IGJsb2NrZWQuICBBcHBlYWxpbmcgdG8gQW5kcmV3IHNob3VsZCBub3QgYmUgZG9uZSBsaWdodGx5LAordGhvdWdoLCBhbmQgbm90IGJlZm9yZSBhbGwgb3RoZXIgYWx0ZXJuYXRpdmVzIGhhdmUgYmVlbiBleHBsb3JlZC4gIEFuZCBiZWFyCitpbiBtaW5kLCBvZiBjb3Vyc2UsIHRoYXQgaGUgbWF5IG5vdCBhZ3JlZSB3aXRoIHlvdSBlaXRoZXIuCisKKworNi4yOiBXSEFUIEhBUFBFTlMgTkVYVAorCitJZiBhIHBhdGNoIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBnb29kIHRoaW5nIHRvIGFkZCB0byB0aGUga2VybmVsLCBhbmQgb25jZQorbW9zdCBvZiB0aGUgcmV2aWV3IGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQsIHRoZSBuZXh0IHN0ZXAgaXMgdXN1YWxseQorZW50cnkgaW50byBhIHN1YnN5c3RlbSBtYWludGFpbmVyJ3MgdHJlZS4gIEhvdyB0aGF0IHdvcmtzIHZhcmllcyBmcm9tIG9uZQorc3Vic3lzdGVtIHRvIHRoZSBuZXh0OyBlYWNoIG1haW50YWluZXIgaGFzIGhpcyBvciBoZXIgb3duIHdheSBvZiBkb2luZwordGhpbmdzLiAgSW4gcGFydGljdWxhciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgdHJlZSAtIG9uZSwgcGVyaGFwcywKK2RlZGljYXRlZCB0byBwYXRjaGVzIHBsYW5uZWQgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdywgYW5kIGFub3RoZXIgZm9yCitsb25nZXItdGVybSB3b3JrLiAgCisKK0ZvciBwYXRjaGVzIGFwcGx5aW5nIHRvIGFyZWFzIGZvciB3aGljaCB0aGVyZSBpcyBubyBvYnZpb3VzIHN1YnN5c3RlbSB0cmVlCisobWVtb3J5IG1hbmFnZW1lbnQgcGF0Y2hlcywgZm9yIGV4YW1wbGUpLCB0aGUgZGVmYXVsdCB0cmVlIG9mdGVuIGVuZHMgdXAKK2JlaW5nIC1tbS4gIFBhdGNoZXMgd2hpY2ggYWZmZWN0IG11bHRpcGxlIHN1YnN5c3RlbXMgY2FuIGFsc28gZW5kIHVwIGdvaW5nCit0aHJvdWdoIHRoZSAtbW0gdHJlZS4KKworSW5jbHVzaW9uIGludG8gYSBzdWJzeXN0ZW0gdHJlZSBjYW4gYnJpbmcgYSBoaWdoZXIgbGV2ZWwgb2YgdmlzaWJpbGl0eSB0byBhCitwYXRjaC4gIE5vdyBvdGhlciBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCB0aGF0IHRyZWUgd2lsbCBnZXQgdGhlIHBhdGNoIGJ5CitkZWZhdWx0LiAgU3Vic3lzdGVtIHRyZWVzIHR5cGljYWxseSBmZWVkIGludG8gLW1tIGFuZCBsaW51eC1uZXh0IGFzIHdlbGwsCittYWtpbmcgdGhlaXIgY29udGVudHMgdmlzaWJsZSB0byB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIGEgd2hvbGUuICBBdAordGhpcyBwb2ludCwgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgeW91IHdpbGwgZ2V0IG1vcmUgY29tbWVudHMgZnJvbSBhCituZXcgc2V0IG9mIHJldmlld2VyczsgdGhlc2UgY29tbWVudHMgbmVlZCB0byBiZSBhbnN3ZXJlZCBhcyBpbiB0aGUgcHJldmlvdXMKK3JvdW5kLgorCitXaGF0IG1heSBhbHNvIGhhcHBlbiBhdCB0aGlzIHBvaW50LCBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZiB5b3VyIHBhdGNoLAoraXMgdGhhdCBjb25mbGljdHMgd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXJzIHR1cm4gdXAuICBJbiB0aGUgd29yc3QKK2Nhc2UsIGhlYXZ5IHBhdGNoIGNvbmZsaWN0cyBjYW4gcmVzdWx0IGluIHNvbWUgd29yayBiZWluZyBwdXQgb24gdGhlIGJhY2sKK2J1cm5lciBzbyB0aGF0IHRoZSByZW1haW5pbmcgcGF0Y2hlcyBjYW4gYmUgd29ya2VkIGludG8gc2hhcGUgYW5kIG1lcmdlZC4KK090aGVyIHRpbWVzLCBjb25mbGljdCByZXNvbHV0aW9uIHdpbGwgaW52b2x2ZSB3b3JraW5nIHdpdGggdGhlIG90aGVyCitkZXZlbG9wZXJzIGFuZCwgcG9zc2libHksIG1vdmluZyBzb21lIHBhdGNoZXMgYmV0d2VlbiB0cmVlcyB0byBlbnN1cmUgdGhhdAorZXZlcnl0aGluZyBhcHBsaWVzIGNsZWFubHkuICBUaGlzIHdvcmsgY2FuIGJlIGEgcGFpbiwgYnV0IGNvdW50IHlvdXIKK2JsZXNzaW5nczogYmVmb3JlIHRoZSBhZHZlbnQgb2YgdGhlIGxpbnV4LW5leHQgdHJlZSwgdGhlc2UgY29uZmxpY3RzIG9mdGVuCitvbmx5IHR1cm5lZCB1cCBkdXJpbmcgdGhlIG1lcmdlIHdpbmRvdyBhbmQgaGFkIHRvIGJlIGFkZHJlc3NlZCBpbiBhIGh1cnJ5LgorTm93IHRoZXkgY2FuIGJlIHJlc29sdmVkIGF0IGxlaXN1cmUsIGJlZm9yZSB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLgorCitTb21lIGRheSwgaWYgYWxsIGdvZXMgd2VsbCwgeW91J2xsIGxvZyBvbiBhbmQgc2VlIHRoYXQgeW91ciBwYXRjaCBoYXMgYmVlbgorbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4gIENvbmdyYXR1bGF0aW9ucyEgIE9uY2UgdGhlIGNlbGVicmF0aW9uIGlzCitjb21wbGV0ZSAoYW5kIHlvdSBoYXZlIGFkZGVkIHlvdXJzZWxmIHRvIHRoZSBNQUlOVEFJTkVSUyBmaWxlKSwgdGhvdWdoLCBpdAoraXMgd29ydGggcmVtZW1iZXJpbmcgYW4gaW1wb3J0YW50IGxpdHRsZSBmYWN0OiB0aGUgam9iIHN0aWxsIGlzIG5vdCBkb25lLgorTWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZSBicmluZ3MgaXRzIG93biBjaGFsbGVuZ2VzLgorCitUbyBiZWdpbiB3aXRoLCB0aGUgdmlzaWJpbGl0eSBvZiB5b3VyIHBhdGNoIGhhcyBpbmNyZWFzZWQgeWV0IGFnYWluLiAgVGhlcmUKK21heSBiZSBhIG5ldyByb3VuZCBvZiBjb21tZW50cyBmcm9tIGRldmVsb3BlcnMgd2hvIGhhZCBub3QgYmVlbiBhd2FyZSBvZgordGhlIHBhdGNoIGJlZm9yZS4gIEl0IG1heSBiZSB0ZW1wdGluZyB0byBpZ25vcmUgdGhlbSwgc2luY2UgdGhlcmUgaXMgbm8KK2xvbmdlciBhbnkgcXVlc3Rpb24gb2YgeW91ciBjb2RlIGJlaW5nIG1lcmdlZC4gIFJlc2lzdCB0aGF0IHRlbXB0YXRpb24sCit0aG91Z2g7IHlvdSBzdGlsbCBuZWVkIHRvIGJlIHJlc3BvbnNpdmUgdG8gZGV2ZWxvcGVycyB3aG8gaGF2ZSBxdWVzdGlvbnMgb3IKK3N1Z2dlc3Rpb25zLgorCitNb3JlIGltcG9ydGFudGx5LCB0aG91Z2g6IGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBwdXRzIHlvdXIgY29kZSBpbnRvCit0aGUgaGFuZHMgb2YgYSBtdWNoIGxhcmdlciBncm91cCBvZiB0ZXN0ZXJzLiAgRXZlbiBpZiB5b3UgaGF2ZSBjb250cmlidXRlZAorYSBkcml2ZXIgZm9yIGhhcmR3YXJlIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLCB5b3Ugd2lsbCBiZSBzdXJwcmlzZWQgYnkKK2hvdyBtYW55IHBlb3BsZSB3aWxsIGJ1aWxkIHlvdXIgY29kZSBpbnRvIHRoZWlyIGtlcm5lbHMuICBBbmQsIG9mIGNvdXJzZSwKK3doZXJlIHRoZXJlIGFyZSB0ZXN0ZXJzLCB0aGVyZSB3aWxsIGJlIGJ1ZyByZXBvcnRzLgorCitUaGUgd29yc3Qgc29ydCBvZiBidWcgcmVwb3J0cyBhcmUgcmVncmVzc2lvbnMuICBJZiB5b3VyIHBhdGNoIGNhdXNlcyBhCityZWdyZXNzaW9uLCB5b3UnbGwgZmluZCBhbiB1bmNvbWZvcnRhYmxlIG51bWJlciBvZiBleWVzIHVwb24geW91OworcmVncmVzc2lvbnMgbmVlZCB0byBiZSBmaXhlZCBhcyBzb29uIGFzIHBvc3NpYmxlLiAgSWYgeW91IGFyZSB1bndpbGxpbmcgb3IKK3VuYWJsZSB0byBmaXggdGhlIHJlZ3Jlc3Npb24gKGFuZCBub2JvZHkgZWxzZSBkb2VzIGl0IGZvciB5b3UpLCB5b3VyIHBhdGNoCit3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgcmVtb3ZlZCBkdXJpbmcgdGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kLiAgQmV5b25kCituZWdhdGluZyBhbGwgb2YgdGhlIHdvcmsgeW91IGhhdmUgZG9uZSB0byBnZXQgeW91ciBwYXRjaCBpbnRvIHRoZSBtYWlubGluZSwKK2hhdmluZyBhIHBhdGNoIHB1bGxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZmFpbHVyZSB0byBmaXggYSByZWdyZXNzaW9uIGNvdWxkCit3ZWxsIG1ha2UgaXQgaGFyZGVyIGZvciB5b3UgdG8gZ2V0IHdvcmsgbWVyZ2VkIGluIHRoZSBmdXR1cmUuCisKK0FmdGVyIGFueSByZWdyZXNzaW9ucyBoYXZlIGJlZW4gZGVhbHQgd2l0aCwgdGhlcmUgbWF5IGJlIG90aGVyLCBvcmRpbmFyeQorYnVncyB0byBkZWFsIHdpdGguICBUaGUgc3RhYmlsaXphdGlvbiBwZXJpb2QgaXMgeW91ciBiZXN0IG9wcG9ydHVuaXR5IHRvCitmaXggdGhlc2UgYnVncyBhbmQgZW5zdXJlIHRoYXQgeW91ciBjb2RlJ3MgZGVidXQgaW4gYSBtYWlubGluZSBrZXJuZWwKK3JlbGVhc2UgaXMgYXMgc29saWQgYXMgcG9zc2libGUuICBTbywgcGxlYXNlLCBhbnN3ZXIgYnVnIHJlcG9ydHMsIGFuZCBmaXgKK3RoZSBwcm9ibGVtcyBpZiBhdCBhbGwgcG9zc2libGUuICBUaGF0J3Mgd2hhdCB0aGUgc3RhYmlsaXphdGlvbiBwZXJpb2QgaXMKK2ZvcjsgeW91IGNhbiBzdGFydCBjcmVhdGluZyBjb29sIG5ldyBwYXRjaGVzIG9uY2UgYW55IHByb2JsZW1zIHdpdGggdGhlIG9sZAorb25lcyBoYXZlIGJlZW4gdGFrZW4gY2FyZSBvZi4KKworQW5kIGRvbid0IGZvcmdldCB0aGF0IHRoZXJlIGFyZSBvdGhlciBtaWxlc3RvbmVzIHdoaWNoIG1heSBhbHNvIGNyZWF0ZSBidWcKK3JlcG9ydHM6IHRoZSBuZXh0IG1haW5saW5lIHN0YWJsZSByZWxlYXNlLCB3aGVuIHByb21pbmVudCBkaXN0cmlidXRvcnMgcGljawordXAgYSB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgY29udGFpbmluZyB5b3VyIHBhdGNoLCBldGMuICBDb250aW51aW5nIHRvCityZXNwb25kIHRvIHRoZXNlIHJlcG9ydHMgaXMgYSBtYXR0ZXIgb2YgYmFzaWMgcHJpZGUgaW4geW91ciB3b3JrLiAgSWYgdGhhdAoraXMgaW5zdWZmaWNpZW50IG1vdGl2YXRpb24sIHRob3VnaCwgaXQncyBhbHNvIHdvcnRoIGNvbnNpZGVyaW5nIHRoYXQgdGhlCitkZXZlbG9wbWVudCBjb21tdW5pdHkgcmVtZW1iZXJzIGRldmVsb3BlcnMgd2hvIGxvc2UgaW50ZXJlc3QgaW4gdGhlaXIgY29kZQorYWZ0ZXIgaXQncyBtZXJnZWQuICBUaGUgbmV4dCB0aW1lIHlvdSBwb3N0IGEgcGF0Y2gsIHRoZXkgd2lsbCBiZSBldmFsdWF0aW5nCitpdCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91IHdpbGwgbm90IGJlIGFyb3VuZCB0byBtYWludGFpbiBpdAorYWZ0ZXJ3YXJkLgorCisKKzYuMzogT1RIRVIgVEhJTkdTIFRIQVQgQ0FOIEhBUFBFTgorCitPbmUgZGF5LCB5b3UgbWF5IG9wZW4geW91ciBtYWlsIGNsaWVudCBhbmQgc2VlIHRoYXQgc29tZWJvZHkgaGFzIG1haWxlZCB5b3UKK2EgcGF0Y2ggdG8geW91ciBjb2RlLiAgVGhhdCBpcyBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgaGF2aW5nIHlvdXIgY29kZQorb3V0IHRoZXJlIGluIHRoZSBvcGVuLCBhZnRlciBhbGwuICBJZiB5b3UgYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHlvdSBjYW4KK2VpdGhlciBmb3J3YXJkIGl0IG9uIHRvIHRoZSBzdWJzeXN0ZW0gbWFpbnRhaW5lciAoYmUgc3VyZSB0byBpbmNsdWRlIGEKK3Byb3BlciBGcm9tOiBsaW5lIHNvIHRoYXQgdGhlIGF0dHJpYnV0aW9uIGlzIGNvcnJlY3QsIGFuZCBhZGQgYSBzaWdub2ZmIG9mCit5b3VyIG93biksIG9yIHNlbmQgYW4gQWNrZWQtYnk6IHJlc3BvbnNlIGJhY2sgYW5kIGxldCB0aGUgb3JpZ2luYWwgcG9zdGVyCitzZW5kIGl0IHVwd2FyZC4KKworSWYgeW91IGRpc2FncmVlIHdpdGggdGhlIHBhdGNoLCBzZW5kIGEgcG9saXRlIHJlc3BvbnNlIGV4cGxhaW5pbmcgd2h5LiAgSWYKK3Bvc3NpYmxlLCB0ZWxsIHRoZSBhdXRob3Igd2hhdCBjaGFuZ2VzIG5lZWQgdG8gYmUgbWFkZSB0byBtYWtlIHRoZSBwYXRjaAorYWNjZXB0YWJsZSB0byB5b3UuICBUaGVyZSBpcyBhIGNlcnRhaW4gcmVzaXN0YW5jZSB0byBtZXJnaW5nIHBhdGNoZXMgd2hpY2gKK2FyZSBvcHBvc2VkIGJ5IHRoZSBhdXRob3IgYW5kIG1haW50YWluZXIgb2YgdGhlIGNvZGUsIGJ1dCBpdCBvbmx5IGdvZXMgc28KK2Zhci4gIElmIHlvdSBhcmUgc2VlbiBhcyBuZWVkbGVzc2x5IGJsb2NraW5nIGdvb2Qgd29yaywgdGhvc2UgcGF0Y2hlcyB3aWxsCitldmVudHVhbGx5IGZsb3cgYXJvdW5kIHlvdSBhbmQgZ2V0IGludG8gdGhlIG1haW5saW5lIGFueXdheS4gIEluIHRoZSBMaW51eAora2VybmVsLCBub2JvZHkgaGFzIGFic29sdXRlIHZldG8gcG93ZXIgb3ZlciBhbnkgY29kZS4gIEV4Y2VwdCBtYXliZSBMaW51cy4KKworT24gdmVyeSByYXJlIG9jY2FzaW9uLCB5b3UgbWF5IHNlZSBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQ6IGFub3RoZXIKK2RldmVsb3BlciBwb3N0cyBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0uICBBdCB0aGF0IHBvaW50LAorY2hhbmNlcyBhcmUgdGhhdCBvbmUgb2YgdGhlIHR3byBwYXRjaGVzIHdpbGwgbm90IGJlIG1lcmdlZCwgYW5kICJtaW5lIHdhcworaGVyZSBmaXJzdCIgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgYSBjb21wZWxsaW5nIHRlY2huaWNhbCBhcmd1bWVudC4gIElmCitzb21lYm9keSBlbHNlJ3MgcGF0Y2ggZGlzcGxhY2VzIHlvdXJzIGFuZCBnZXRzIGludG8gdGhlIG1haW5saW5lLCB0aGVyZSBpcworcmVhbGx5IG9ubHkgb25lIHdheSB0byByZXNwb25kOiBiZSBwbGVhc2VkIHRoYXQgeW91ciBwcm9ibGVtIGdvdCBzb2x2ZWQgYW5kCitnZXQgb24gd2l0aCB5b3VyIHdvcmsuICBIYXZpbmcgb25lJ3Mgd29yayBzaG92ZWQgYXNpZGUgaW4gdGhpcyBtYW5uZXIgY2FuCitiZSBodXJ0ZnVsIGFuZCBkaXNjb3VyYWdpbmcsIGJ1dCB0aGUgY29tbXVuaXR5IHdpbGwgcmVtZW1iZXIgeW91ciByZWFjdGlvbgorbG9uZyBhZnRlciB0aGV5IGhhdmUgZm9yZ290dGVuIHdob3NlIHBhdGNoIGFjdHVhbGx5IGdvdCBtZXJnZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2Y3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcwpAQCAtMCwwICsxLDE3MyBAQAorNzogQURWQU5DRUQgVE9QSUNTCisKK0F0IHRoaXMgcG9pbnQsIGhvcGVmdWxseSwgeW91IGhhdmUgYSBoYW5kbGUgb24gaG93IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzCit3b3Jrcy4gIFRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gbGVhcm4sIGhvd2V2ZXIhICBUaGlzIHNlY3Rpb24gd2lsbCBjb3ZlciBhCitudW1iZXIgb2YgdG9waWNzIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGZvciBkZXZlbG9wZXJzIHdhbnRpbmcgdG8gYmVjb21lIGEKK3JlZ3VsYXIgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MuCisKKzcuMTogTUFOQUdJTkcgUEFUQ0hFUyBXSVRIIEdJVAorCitUaGUgdXNlIG9mIGRpc3RyaWJ1dGVkIHZlcnNpb24gY29udHJvbCBmb3IgdGhlIGtlcm5lbCBiZWdhbiBpbiBlYXJseSAyMDAyLAord2hlbiBMaW51cyBmaXJzdCBzdGFydGVkIHBsYXlpbmcgd2l0aCB0aGUgcHJvcHJpZXRhcnkgQml0S2VlcGVyCithcHBsaWNhdGlvbi4gIFdoaWxlIEJpdEtlZXBlciB3YXMgY29udHJvdmVyc2lhbCwgdGhlIGFwcHJvYWNoIHRvIHNvZnR3YXJlCit2ZXJzaW9uIG1hbmFnZW1lbnQgaXQgZW1ib2RpZWQgbW9zdCBjZXJ0YWlubHkgd2FzIG5vdC4gIERpc3RyaWJ1dGVkIHZlcnNpb24KK2NvbnRyb2wgZW5hYmxlZCBhbiBpbW1lZGlhdGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKK3Byb2plY3QuICBJbiBjdXJyZW50IHRpbWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBmcmVlIGFsdGVybmF0aXZlcyB0bworQml0S2VlcGVyLiAgRm9yIGJldHRlciBvciBmb3Igd29yc2UsIHRoZSBrZXJuZWwgcHJvamVjdCBoYXMgc2V0dGxlZCBvbiBnaXQKK2FzIGl0cyB0b29sIG9mIGNob2ljZS4KKworTWFuYWdpbmcgcGF0Y2hlcyB3aXRoIGdpdCBjYW4gbWFrZSBsaWZlIG11Y2ggZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVyLAorZXNwZWNpYWxseSBhcyB0aGUgdm9sdW1lIG9mIHRob3NlIHBhdGNoZXMgZ3Jvd3MuICBHaXQgYWxzbyBoYXMgaXRzIHJvdWdoCitlZGdlcyBhbmQgcG9zZXMgY2VydGFpbiBoYXphcmRzOyBpdCBpcyBhIHlvdW5nIGFuZCBwb3dlcmZ1bCB0b29sIHdoaWNoIGlzCitzdGlsbCBiZWluZyBjaXZpbGl6ZWQgYnkgaXRzIGRldmVsb3BlcnMuICBUaGlzIGRvY3VtZW50IHdpbGwgbm90IGF0dGVtcHQgdG8KK3RlYWNoIHRoZSByZWFkZXIgaG93IHRvIHVzZSBnaXQ7IHRoYXQgd291bGQgYmUgc3VmZmljaWVudCBtYXRlcmlhbCBmb3IgYQorbG9uZyBkb2N1bWVudCBpbiBpdHMgb3duIHJpZ2h0LiAgSW5zdGVhZCwgdGhlIGZvY3VzIGhlcmUgd2lsbCBiZSBvbiBob3cgZ2l0CitmaXRzIGludG8gdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGluIHBhcnRpY3VsYXIuICBEZXZlbG9wZXJzIHdobword2lzaCB0byBjb21lIHVwIHRvIHNwZWVkIHdpdGggZ2l0IHdpbGwgZmluZCBtb3JlIGluZm9ybWF0aW9uIGF0OgorCisJaHR0cDovL2dpdC5vci5jei8KKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL3VzZXItbWFudWFsLmh0bWwKKworYW5kIG9uIHZhcmlvdXMgdHV0b3JpYWxzIGZvdW5kIG9uIHRoZSB3ZWIuCisKK1RoZSBmaXJzdCBvcmRlciBvZiBidXNpbmVzcyBpcyB0byByZWFkIHRoZSBhYm92ZSBzaXRlcyBhbmQgZ2V0IGEgc29saWQKK3VuZGVyc3RhbmRpbmcgb2YgaG93IGdpdCB3b3JrcyBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdCB0byBtYWtlIHBhdGNoZXMKK2F2YWlsYWJsZSB0byBvdGhlcnMuICBBIGdpdC11c2luZyBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gb2J0YWluIGEgY29weQorb2YgdGhlIG1haW5saW5lIHJlcG9zaXRvcnksIGV4cGxvcmUgdGhlIHJldmlzaW9uIGhpc3RvcnksIGNvbW1pdCBjaGFuZ2VzIHRvCit0aGUgdHJlZSwgdXNlIGJyYW5jaGVzLCBldGMuICBBbiB1bmRlcnN0YW5kaW5nIG9mIGdpdCdzIHRvb2xzIGZvciB0aGUKK3Jld3JpdGluZyBvZiBoaXN0b3J5IChzdWNoIGFzIHJlYmFzZSkgaXMgYWxzbyB1c2VmdWwuICBHaXQgY29tZXMgd2l0aCBpdHMKK293biB0ZXJtaW5vbG9neSBhbmQgY29uY2VwdHM7IGEgbmV3IHVzZXIgb2YgZ2l0IHNob3VsZCBrbm93IGFib3V0IHJlZnMsCityZW1vdGUgYnJhbmNoZXMsIHRoZSBpbmRleCwgZmFzdC1mb3J3YXJkIG1lcmdlcywgcHVzaGVzIGFuZCBwdWxscywgZGV0YWNoZWQKK2hlYWRzLCBldGMuICBJdCBjYW4gYWxsIGJlIGEgbGl0dGxlIGludGltaWRhdGluZyBhdCB0aGUgb3V0c2V0LCBidXQgdGhlCitjb25jZXB0cyBhcmUgbm90IHRoYXQgaGFyZCB0byBncmFzcCB3aXRoIGEgYml0IG9mIHN0dWR5LgorCitVc2luZyBnaXQgdG8gZ2VuZXJhdGUgcGF0Y2hlcyBmb3Igc3VibWlzc2lvbiBieSBlbWFpbCBjYW4gYmUgYSBnb29kCitleGVyY2lzZSB3aGlsZSBjb21pbmcgdXAgdG8gc3BlZWQuCisKK1doZW4geW91IGFyZSByZWFkeSB0byBzdGFydCBwdXR0aW5nIHVwIGdpdCB0cmVlcyBmb3Igb3RoZXJzIHRvIGxvb2sgYXQsIHlvdQord2lsbCwgb2YgY291cnNlLCBuZWVkIGEgc2VydmVyIHRoYXQgY2FuIGJlIHB1bGxlZCBmcm9tLiAgU2V0dGluZyB1cCBzdWNoIGEKK3NlcnZlciB3aXRoIGdpdC1kYWVtb24gaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgaWYgeW91IGhhdmUgYSBzeXN0ZW0KK3doaWNoIGlzIGFjY2Vzc2libGUgdG8gdGhlIEludGVybmV0LiAgT3RoZXJ3aXNlLCBmcmVlLCBwdWJsaWMgaG9zdGluZyBzaXRlcworKEdpdGh1YiwgZm9yIGV4YW1wbGUpIGFyZSBzdGFydGluZyB0byBhcHBlYXIgb24gdGhlIG5ldC4gIEVzdGFibGlzaGVkCitkZXZlbG9wZXJzIGNhbiBnZXQgYW4gYWNjb3VudCBvbiBrZXJuZWwub3JnLCBidXQgdGhvc2UgYXJlIG5vdCBlYXN5IHRvIGNvbWUKK2J5OyBzZWUgaHR0cDovL2tlcm5lbC5vcmcvZmFxLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVGhlIG5vcm1hbCBnaXQgd29ya2Zsb3cgaW52b2x2ZXMgdGhlIHVzZSBvZiBhIGxvdCBvZiBicmFuY2hlcy4gIEVhY2ggbGluZQorb2YgZGV2ZWxvcG1lbnQgY2FuIGJlIHNlcGFyYXRlZCBpbnRvIGEgc2VwYXJhdGUgInRvcGljIGJyYW5jaCIgYW5kCittYWludGFpbmVkIGluZGVwZW5kZW50bHkuICBCcmFuY2hlcyBpbiBnaXQgYXJlIGNoZWFwLCB0aGVyZSBpcyBubyByZWFzb24gdG8KK25vdCBtYWtlIGZyZWUgdXNlIG9mIHRoZW0uICBBbmQsIGluIGFueSBjYXNlLCB5b3Ugc2hvdWxkIG5vdCBkbyB5b3VyCitkZXZlbG9wbWVudCBpbiBhbnkgYnJhbmNoIHdoaWNoIHlvdSBpbnRlbmQgdG8gYXNrIG90aGVycyB0byBwdWxsIGZyb20uCitQdWJsaWNseS1hdmFpbGFibGUgYnJhbmNoZXMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBjYXJlOyBtZXJnZSBpbiBwYXRjaGVzCitmcm9tIGRldmVsb3BtZW50IGJyYW5jaGVzIHdoZW4gdGhleSBhcmUgaW4gY29tcGxldGUgZm9ybSBhbmQgcmVhZHkgdG8gZ28gLQorbm90IGJlZm9yZS4KKworR2l0IHByb3ZpZGVzIHNvbWUgcG93ZXJmdWwgdG9vbHMgd2hpY2ggY2FuIGFsbG93IHlvdSB0byByZXdyaXRlIHlvdXIKK2RldmVsb3BtZW50IGhpc3RvcnkuICBBbiBpbmNvbnZlbmllbnQgcGF0Y2ggKG9uZSB3aGljaCBicmVha3MgYmlzZWN0aW9uLAorc2F5LCBvciB3aGljaCBoYXMgc29tZSBvdGhlciBzb3J0IG9mIG9idmlvdXMgYnVnKSBjYW4gYmUgZml4ZWQgaW4gcGxhY2Ugb3IKK21hZGUgdG8gZGlzYXBwZWFyIGZyb20gdGhlIGhpc3RvcnkgZW50aXJlbHkuICBBIHBhdGNoIHNlcmllcyBjYW4gYmUKK3Jld3JpdHRlbiBhcyBpZiBpdCBoYWQgYmVlbiB3cml0dGVuIG9uIHRvcCBvZiB0b2RheSdzIG1haW5saW5lLCBldmVuIHRob3VnaAoreW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIGl0IGZvciBtb250aHMuICBDaGFuZ2VzIGNhbiBiZSB0cmFuc3BhcmVudGx5CitzaGlmdGVkIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLiAgQW5kIHNvIG9uLiAgSnVkaWNpb3VzIHVzZSBvZiBnaXQncworYWJpbGl0eSB0byByZXZpc2UgaGlzdG9yeSBjYW4gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgY2xlYW4gcGF0Y2ggc2V0cyB3aXRoCitmZXdlciBwcm9ibGVtcy4KKworRXhjZXNzaXZlIHVzZSBvZiB0aGlzIGNhcGFiaWxpdHkgY2FuIGxlYWQgdG8gb3RoZXIgcHJvYmxlbXMsIHRob3VnaCwgYmV5b25kCithIHNpbXBsZSBvYnNlc3Npb24gZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGVyZmVjdCBwcm9qZWN0IGhpc3RvcnkuCitSZXdyaXRpbmcgaGlzdG9yeSB3aWxsIHJld3JpdGUgdGhlIGNoYW5nZXMgY29udGFpbmVkIGluIHRoYXQgaGlzdG9yeSwKK3R1cm5pbmcgYSB0ZXN0ZWQgKGhvcGVmdWxseSkga2VybmVsIHRyZWUgaW50byBhbiB1bnRlc3RlZCBvbmUuICBCdXQsIGJleW9uZAordGhhdCwgZGV2ZWxvcGVycyBjYW5ub3QgZWFzaWx5IGNvbGxhYm9yYXRlIGlmIHRoZXkgZG8gbm90IGhhdmUgYSBzaGFyZWQKK3ZpZXcgb2YgdGhlIHByb2plY3QgaGlzdG9yeTsgaWYgeW91IHJld3JpdGUgaGlzdG9yeSB3aGljaCBvdGhlciBkZXZlbG9wZXJzCitoYXZlIHB1bGxlZCBpbnRvIHRoZWlyIHJlcG9zaXRvcmllcywgeW91IHdpbGwgbWFrZSBsaWZlIG11Y2ggbW9yZSBkaWZmaWN1bHQKK2ZvciB0aG9zZSBkZXZlbG9wZXJzLiAgU28gYSBzaW1wbGUgcnVsZSBvZiB0aHVtYiBhcHBsaWVzIGhlcmU6IGhpc3RvcnkKK3doaWNoIGhhcyBiZWVuIGV4cG9ydGVkIHRvIG90aGVycyBzaG91bGQgZ2VuZXJhbGx5IGJlIHNlZW4gYXMgaW1tdXRhYmxlCit0aGVyZWFmdGVyLgorCitTbywgb25jZSB5b3UgcHVzaCBhIHNldCBvZiBjaGFuZ2VzIHRvIHlvdXIgcHVibGljbHktYXZhaWxhYmxlIHNlcnZlciwgdGhvc2UKK2NoYW5nZXMgc2hvdWxkIG5vdCBiZSByZXdyaXR0ZW4uICBHaXQgd2lsbCBhdHRlbXB0IHRvIGVuZm9yY2UgdGhpcyBydWxlIGlmCit5b3UgdHJ5IHRvIHB1c2ggY2hhbmdlcyB3aGljaCBkbyBub3QgcmVzdWx0IGluIGEgZmFzdC1mb3J3YXJkIG1lcmdlCisoaS5lLiBjaGFuZ2VzIHdoaWNoIGRvIG5vdCBzaGFyZSB0aGUgc2FtZSBoaXN0b3J5KS4gIEl0IGlzIHBvc3NpYmxlIHRvCitvdmVycmlkZSB0aGlzIGNoZWNrLCBhbmQgdGhlcmUgbWF5IGJlIHRpbWVzIHdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHJld3JpdGUKK2FuIGV4cG9ydGVkIHRyZWUuICBNb3ZpbmcgY2hhbmdlc2V0cyBiZXR3ZWVuIHRyZWVzIHRvIGF2b2lkIGNvbmZsaWN0cyBpbgorbGludXgtbmV4dCBpcyBvbmUgZXhhbXBsZS4gIEJ1dCBzdWNoIGFjdGlvbnMgc2hvdWxkIGJlIHJhcmUuICBUaGlzIGlzIG9uZQorb2YgdGhlIHJlYXNvbnMgd2h5IGRldmVsb3BtZW50IHNob3VsZCBiZSBkb25lIGluIHByaXZhdGUgYnJhbmNoZXMgKHdoaWNoCitjYW4gYmUgcmV3cml0dGVuIGlmIG5lY2Vzc2FyeSkgYW5kIG9ubHkgbW92ZWQgaW50byBwdWJsaWMgYnJhbmNoZXMgd2hlbgoraXQncyBpbiBhIHJlYXNvbmFibHkgYWR2YW5jZWQgc3RhdGUuCisKK0FzIHRoZSBtYWlubGluZSAob3Igb3RoZXIgdHJlZSB1cG9uIHdoaWNoIGEgc2V0IG9mIGNoYW5nZXMgaXMgYmFzZWQpCithZHZhbmNlcywgaXQgaXMgdGVtcHRpbmcgdG8gbWVyZ2Ugd2l0aCB0aGF0IHRyZWUgdG8gc3RheSBvbiB0aGUgbGVhZGluZworZWRnZS4gIEZvciBhIHByaXZhdGUgYnJhbmNoLCByZWJhc2luZyBjYW4gYmUgYW4gZWFzeSB3YXkgdG8ga2VlcCB1cCB3aXRoCithbm90aGVyIHRyZWUsIGJ1dCByZWJhc2luZyBpcyBub3QgYW4gb3B0aW9uIG9uY2UgYSB0cmVlIGlzIGV4cG9ydGVkIHRvIHRoZQord29ybGQuICBPbmNlIHRoYXQgaGFwcGVucywgYSBmdWxsIG1lcmdlIG11c3QgYmUgZG9uZS4gIE1lcmdpbmcgb2NjYXNpb25hbGx5CittYWtlcyBnb29kIHNlbnNlLCBidXQgb3Zlcmx5IGZyZXF1ZW50IG1lcmdlcyBjYW4gY2x1dHRlciB0aGUgaGlzdG9yeQorbmVlZGxlc3NseS4gIFN1Z2dlc3RlZCB0ZWNobmlxdWUgaW4gdGhpcyBjYXNlIGlzIHRvIG1lcmdlIGluZnJlcXVlbnRseSwgYW5kCitnZW5lcmFsbHkgb25seSBhdCBzcGVjaWZpYyByZWxlYXNlIHBvaW50cyAoc3VjaCBhcyBhIG1haW5saW5lIC1yYworcmVsZWFzZSkuICBJZiB5b3UgYXJlIG5lcnZvdXMgYWJvdXQgc3BlY2lmaWMgY2hhbmdlcywgeW91IGNhbiBhbHdheXMKK3BlcmZvcm0gdGVzdCBtZXJnZXMgaW4gYSBwcml2YXRlIGJyYW5jaC4gIFRoZSBnaXQgInJlcmVyZSIgdG9vbCBjYW4gYmUKK3VzZWZ1bCBpbiBzdWNoIHNpdHVhdGlvbnM7IGl0IHJlbWVtYmVycyBob3cgbWVyZ2UgY29uZmxpY3RzIHdlcmUgcmVzb2x2ZWQKK3NvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhlIHNhbWUgd29yayB0d2ljZS4KKworT25lIG9mIHRoZSBiaWdnZXN0IHJlY3VycmluZyBjb21wbGFpbnRzIGFib3V0IHRvb2xzIGxpa2UgZ2l0IGlzIHRoaXM6IHRoZQorbWFzcyBtb3ZlbWVudCBvZiBwYXRjaGVzIGZyb20gb25lIHJlcG9zaXRvcnkgdG8gYW5vdGhlciBtYWtlcyBpdCBlYXN5IHRvCitzbGlwIGluIGlsbC1hZHZpc2VkIGNoYW5nZXMgd2hpY2ggZ28gaW50byB0aGUgbWFpbmxpbmUgYmVsb3cgdGhlIHJldmlldworcmFkYXIuICBLZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGdldCB1bmhhcHB5IHdoZW4gdGhleSBzZWUgdGhhdCBraW5kIG9mCit0aGluZyBoYXBwZW5pbmc7IHB1dHRpbmcgdXAgYSBnaXQgdHJlZSB3aXRoIHVucmV2aWV3ZWQgb3Igb2ZmLXRvcGljIHBhdGNoZXMKK2NhbiBhZmZlY3QgeW91ciBhYmlsaXR5IHRvIGdldCB0cmVlcyBwdWxsZWQgaW4gdGhlIGZ1dHVyZS4gIFF1b3RpbmcgTGludXM6CisKKwlZb3UgY2FuIHNlbmQgbWUgcGF0Y2hlcywgYnV0IGZvciBtZSB0byBwdWxsIGEgZ2l0IHBhdGNoIGZyb20geW91LCBJCisJbmVlZCB0byBrbm93IHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGFuZCBJIG5lZWQgdG8gYmUgYWJsZQorCXRvIHRydXN0IHRoaW5ncyAqd2l0aG91dCogdGhlbiBoYXZpbmcgdG8gZ28gYW5kIGNoZWNrIGV2ZXJ5CisJaW5kaXZpZHVhbCBjaGFuZ2UgYnkgaGFuZC4KKworKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIyNDEzNS8pLiAgCisKK1RvIGF2b2lkIHRoaXMga2luZCBvZiBzaXR1YXRpb24sIGVuc3VyZSB0aGF0IGFsbCBwYXRjaGVzIHdpdGhpbiBhIGdpdmVuCiticmFuY2ggc3RpY2sgY2xvc2VseSB0byB0aGUgYXNzb2NpYXRlZCB0b3BpYzsgYSAiZHJpdmVyIGZpeGVzIiBicmFuY2gKK3Nob3VsZCBub3QgYmUgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4gIEFuZCwgbW9zdAoraW1wb3J0YW50bHksIGRvIG5vdCB1c2UgYSBnaXQgdHJlZSB0byBieXBhc3MgdGhlIHJldmlldyBwcm9jZXNzLiAgUG9zdCBhbgorb2NjYXNpb25hbCBzdW1tYXJ5IG9mIHRoZSB0cmVlIHRvIHRoZSByZWxldmFudCBsaXN0LCBhbmQsIHdoZW4gdGhlIHRpbWUgaXMKK3JpZ2h0LCByZXF1ZXN0IHRoYXQgdGhlIHRyZWUgYmUgaW5jbHVkZWQgaW4gbGludXgtbmV4dC4KKworSWYgYW5kIHdoZW4gb3RoZXJzIHN0YXJ0IHRvIHNlbmQgcGF0Y2hlcyBmb3IgaW5jbHVzaW9uIGludG8geW91ciB0cmVlLAorZG9uJ3QgZm9yZ2V0IHRvIHJldmlldyB0aGVtLiAgQWxzbyBlbnN1cmUgdGhhdCB5b3UgbWFpbnRhaW4gdGhlIGNvcnJlY3QKK2F1dGhvcnNoaXAgaW5mb3JtYXRpb247IHRoZSBnaXQgImFtIiB0b29sIGRvZXMgaXRzIGJlc3QgaW4gdGhpcyByZWdhcmQsIGJ1dAoreW91IG1heSBoYXZlIHRvIGFkZCBhICJGcm9tOiIgbGluZSB0byB0aGUgcGF0Y2ggaWYgaXQgaGFzIGJlZW4gcmVsYXllZCB0bworeW91IHZpYSBhIHRoaXJkIHBhcnR5LgorCitXaGVuIHJlcXVlc3RpbmcgYSBwdWxsLCBiZSBzdXJlIHRvIGdpdmUgYWxsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbjogd2hlcmUKK3lvdXIgdHJlZSBpcywgd2hhdCBicmFuY2ggdG8gcHVsbCwgYW5kIHdoYXQgY2hhbmdlcyB3aWxsIHJlc3VsdCBmcm9tIHRoZQorcHVsbC4gIFRoZSBnaXQgcmVxdWVzdC1wdWxsIGNvbW1hbmQgY2FuIGJlIGhlbHBmdWwgaW4gdGhpcyByZWdhcmQ7IGl0IHdpbGwKK2Zvcm1hdCB0aGUgcmVxdWVzdCBhcyBvdGhlciBkZXZlbG9wZXJzIGV4cGVjdCwgYW5kIHdpbGwgYWxzbyBjaGVjayB0byBiZQorc3VyZSB0aGF0IHlvdSBoYXZlIHJlbWVtYmVyZWQgdG8gcHVzaCB0aG9zZSBjaGFuZ2VzIHRvIHRoZSBwdWJsaWMgc2VydmVyLiAKKworCis3LjI6IFJFVklFV0lORyBQQVRDSEVTCisKK1NvbWUgcmVhZGVycyB3aWxsIGNlcnRhaW5seSBvYmplY3QgdG8gcHV0dGluZyB0aGlzIHNlY3Rpb24gd2l0aCAiYWR2YW5jZWQKK3RvcGljcyIgb24gdGhlIGdyb3VuZHMgdGhhdCBldmVuIGJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQgYmUKK3Jldmlld2luZyBwYXRjaGVzLiAgSXQgaXMgY2VydGFpbmx5IHRydWUgdGhhdCB0aGVyZSBpcyBubyBiZXR0ZXIgd2F5IHRvCitsZWFybiBob3cgdG8gcHJvZ3JhbSBpbiB0aGUga2VybmVsIGVudmlyb25tZW50IHRoYW4gYnkgbG9va2luZyBhdCBjb2RlCitwb3N0ZWQgYnkgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHJldmlld2VycyBhcmUgZm9yZXZlciBpbiBzaG9ydCBzdXBwbHk7IGJ5Citsb29raW5nIGF0IGNvZGUgeW91IGNhbiBtYWtlIGEgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9jZXNzIGFzIGEKK3dob2xlLgorCitSZXZpZXdpbmcgY29kZSBjYW4gYmUgYW4gaW50aW1pZGF0aW5nIHByb3NwZWN0LCBlc3BlY2lhbGx5IGZvciBhIG5ldyBrZXJuZWwKK2RldmVsb3BlciB3aG8gbWF5IHdlbGwgZmVlbCBuZXJ2b3VzIGFib3V0IHF1ZXN0aW9uaW5nIGNvZGUgLSBpbiBwdWJsaWMgLQord2hpY2ggaGFzIGJlZW4gcG9zdGVkIGJ5IHRob3NlIHdpdGggbW9yZSBleHBlcmllbmNlLiAgRXZlbiBjb2RlIHdyaXR0ZW4gYnkKK3RoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgY2FuIGJlIGltcHJvdmVkLCB0aG91Z2guICBQZXJoYXBzIHRoZSBiZXN0CitwaWVjZSBvZiBhZHZpY2UgZm9yIHJldmlld2VycyAoYWxsIHJldmlld2VycykgaXMgdGhpczogcGhyYXNlIHJldmlldworY29tbWVudHMgYXMgcXVlc3Rpb25zIHJhdGhlciB0aGFuIGNyaXRpY2lzbXMuICBBc2tpbmcgImhvdyBkb2VzIHRoZSBsb2NrCitnZXQgcmVsZWFzZWQgaW4gdGhpcyBwYXRoPyIgd2lsbCBhbHdheXMgd29yayBiZXR0ZXIgdGhhbiBzdGF0aW5nICJ0aGUKK2xvY2tpbmcgaGVyZSBpcyB3cm9uZy4iCisKK0RpZmZlcmVudCBkZXZlbG9wZXJzIHdpbGwgcmV2aWV3IGNvZGUgZnJvbSBkaWZmZXJlbnQgcG9pbnRzIG9mIHZpZXcuICBTb21lCithcmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGNvZGluZyBzdHlsZSBhbmQgd2hldGhlciBjb2RlIGxpbmVzIGhhdmUgdHJhaWxpbmcKK3doaXRlIHNwYWNlLiAgT3RoZXJzIHdpbGwgZm9jdXMgcHJpbWFyaWx5IG9uIHdoZXRoZXIgdGhlIGNoYW5nZSBpbXBsZW1lbnRlZAorYnkgdGhlIHBhdGNoIGFzIGEgd2hvbGUgaXMgYSBnb29kIHRoaW5nIGZvciB0aGUga2VybmVsIG9yIG5vdC4gIFlldCBvdGhlcnMKK3dpbGwgY2hlY2sgZm9yIHByb2JsZW1hdGljIGxvY2tpbmcsIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSwgcG9zc2libGUKK3NlY3VyaXR5IGlzc3VlcywgZHVwbGljYXRpb24gb2YgY29kZSBmb3VuZCBlbHNld2hlcmUsIGFkZXF1YXRlCitkb2N1bWVudGF0aW9uLCBhZHZlcnNlIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIHVzZXItc3BhY2UgQUJJIGNoYW5nZXMsIGV0Yy4KK0FsbCB0eXBlcyBvZiByZXZpZXcsIGlmIHRoZXkgbGVhZCB0byBiZXR0ZXIgY29kZSBnb2luZyBpbnRvIHRoZSBrZXJuZWwsIGFyZQord2VsY29tZSBhbmQgd29ydGh3aGlsZS4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzguQ29uY2x1c2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkwYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzguQ29uY2x1c2lvbgpAQCAtMCwwICsxLDc0IEBACis4OiBGT1IgTU9SRSBJTkZPUk1BVElPTgorCitUaGVyZSBhcmUgbnVtZXJvdXMgc291cmNlcyBvZiBpbmZvcm1hdGlvbiBvbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgYW5kCityZWxhdGVkIHRvcGljcy4gIEZpcnN0IGFtb25nIHRob3NlIHdpbGwgYWx3YXlzIGJlIHRoZSBEb2N1bWVudGF0aW9uCitkaXJlY3RvcnkgZm91bmQgaW4gdGhlIGtlcm5lbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiAgVGhlIHRvcC1sZXZlbCBIT1dUTworZmlsZSBpcyBhbiBpbXBvcnRhbnQgc3RhcnRpbmcgcG9pbnQ7IFN1Ym1pdHRpbmdQYXRjaGVzIGFuZAorU3VibWl0dGluZ0RyaXZlcnMgYXJlIGFsc28gc29tZXRoaW5nIHdoaWNoIGFsbCBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQKK3JlYWQuICBNYW55IGludGVybmFsIGtlcm5lbCBBUElzIGFyZSBkb2N1bWVudGVkIHVzaW5nIHRoZSBrZXJuZWxkb2MKK21lY2hhbmlzbTsgIm1ha2UgaHRtbGRvY3MiIG9yICJtYWtlIHBkZmRvY3MiIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRob3NlCitkb2N1bWVudHMgaW4gSFRNTCBvciBQREYgZm9ybWF0ICh0aG91Z2ggdGhlIHZlcnNpb24gb2YgVGVYIHNoaXBwZWQgYnkgc29tZQorZGlzdHJpYnV0aW9ucyBydW5zIGludG8gaW50ZXJuYWwgbGltaXRzIGFuZCBmYWlscyB0byBwcm9jZXNzIHRoZSBkb2N1bWVudHMKK3Byb3Blcmx5KS4KKworVmFyaW91cyB3ZWIgc2l0ZXMgZGlzY3VzcyBrZXJuZWwgZGV2ZWxvcG1lbnQgYXQgYWxsIGxldmVscyBvZiBkZXRhaWwuICBZb3VyCithdXRob3Igd291bGQgbGlrZSB0byBodW1ibHkgc3VnZ2VzdCBodHRwOi8vbHduLm5ldC8gYXMgYSBzb3VyY2U7CitpbmZvcm1hdGlvbiBvbiBtYW55IHNwZWNpZmljIGtlcm5lbCB0b3BpY3MgY2FuIGJlIGZvdW5kIHZpYSB0aGUgTFdOIGtlcm5lbAoraW5kZXggYXQ6CisKKwlodHRwOi8vbHduLm5ldC9LZXJuZWwvSW5kZXgvCisKK0JleW9uZCB0aGF0LCBhIHZhbHVhYmxlIHJlc291cmNlIGZvciBrZXJuZWwgZGV2ZWxvcGVycyBpczoKKworCWh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy8KKworSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbnV4LW5leHQgdHJlZSBnYXRoZXJzIGF0OgorCisJaHR0cDovL2xpbnV4LmYtc2VpZGVsLmRlL2xpbnV4LW5leHQvcG13aWtpLworCitBbmQsIG9mIGNvdXJzZSwgb25lIHNob3VsZCBub3QgZm9yZ2V0IGh0dHA6Ly9rZXJuZWwub3JnLywgdGhlIGRlZmluaXRpdmUKK2xvY2F0aW9uIGZvciBrZXJuZWwgcmVsZWFzZSBpbmZvcm1hdGlvbi4KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJvb2tzIG9uIGtlcm5lbCBkZXZlbG9wbWVudDoKKworCUxpbnV4IERldmljZSBEcml2ZXJzLCAzcmQgRWRpdGlvbiAoSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvCisJUnViaW5pLCBhbmQgR3JlZyBLcm9haC1IYXJ0bWFuKS4gIE9ubGluZSBhdAorCWh0dHA6Ly9sd24ubmV0L0tlcm5lbC9MREQzLy4KKworCUxpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCAoUm9iZXJ0IExvdmUpLgorCisJVW5kZXJzdGFuZGluZyB0aGUgTGludXggS2VybmVsIChEYW5pZWwgQm92ZXQgYW5kIE1hcmNvIENlc2F0aSkuCisKK0FsbCBvZiB0aGVzZSBib29rcyBzdWZmZXIgZnJvbSBhIGNvbW1vbiBmYXVsdCwgdGhvdWdoOiB0aGV5IHRlbmQgdG8gYmUKK3NvbWV3aGF0IG9ic29sZXRlIGJ5IHRoZSB0aW1lIHRoZXkgaGl0IHRoZSBzaGVsdmVzLCBhbmQgdGhleSBoYXZlIGJlZW4gb24KK3RoZSBzaGVsdmVzIGZvciBhIHdoaWxlIG5vdy4gIFN0aWxsLCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiBnb29kCitpbmZvcm1hdGlvbiB0byBiZSBmb3VuZCB0aGVyZS4KKworRG9jdW1lbnRhdGlvbiBmb3IgZ2l0IGNhbiBiZSBmb3VuZCBhdDoKKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLworCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdXNlci1tYW51YWwuaHRtbAorCisKKzk6IENPTkNMVVNJT04KKworQ29uZ3JhdHVsYXRpb25zIHRvIGFueWJvZHkgd2hvIGhhcyBtYWRlIGl0IHRocm91Z2ggdGhpcyBsb25nLXdpbmRlZAorZG9jdW1lbnQuICBIb3BlZnVsbHkgaXQgaGFzIHByb3ZpZGVkIGEgaGVscGZ1bCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKK0xpbnV4IGtlcm5lbCBpcyBkZXZlbG9wZWQgYW5kIGhvdyB5b3UgY2FuIHBhcnRpY2lwYXRlIGluIHRoYXQgcHJvY2Vzcy4KKworSW4gdGhlIGVuZCwgaXQncyB0aGUgcGFydGljaXBhdGlvbiB0aGF0IG1hdHRlcnMuICBBbnkgb3BlbiBzb3VyY2Ugc29mdHdhcmUKK3Byb2plY3QgaXMgbm8gbW9yZSB0aGFuIHRoZSBzdW0gb2Ygd2hhdCBpdHMgY29udHJpYnV0b3JzIHB1dCBpbnRvIGl0LiAgVGhlCitMaW51eCBrZXJuZWwgaGFzIHByb2dyZXNzZWQgYXMgcXVpY2tseSBhbmQgYXMgd2VsbCBhcyBpdCBoYXMgYmVjYXVzZSBpdCBoYXMKK2JlZW4gaGVscGVkIGJ5IGFuIGltcHJlc3NpdmVseSBsYXJnZSBncm91cCBvZiBkZXZlbG9wZXJzLCBhbGwgb2Ygd2hvbSBhcmUKK3dvcmtpbmcgdG8gbWFrZSBpdCBiZXR0ZXIuICBUaGUga2VybmVsIGlzIGEgcHJlbWllciBleGFtcGxlIG9mIHdoYXQgY2FuIGJlCitkb25lIHdoZW4gdGhvdXNhbmRzIG9mIHBlb3BsZSB3b3JrIHRvZ2V0aGVyIHRvd2FyZCBhIGNvbW1vbiBnb2FsLgorCitUaGUga2VybmVsIGNhbiBhbHdheXMgYmVuZWZpdCBmcm9tIGEgbGFyZ2VyIGRldmVsb3BlciBiYXNlLCB0aG91Z2guICBUaGVyZQoraXMgYWx3YXlzIG1vcmUgd29yayB0byBkby4gIEJ1dCwganVzdCBhcyBpbXBvcnRhbnRseSwgbW9zdCBvdGhlcgorcGFydGljaXBhbnRzIGluIHRoZSBMaW51eCBlY29zeXN0ZW0gY2FuIGJlbmVmaXQgdGhyb3VnaCBjb250cmlidXRpbmcgdG8gdGhlCitrZXJuZWwuICBHZXR0aW5nIGNvZGUgaW50byB0aGUgbWFpbmxpbmUgaXMgdGhlIGtleSB0byBoaWdoZXIgY29kZSBxdWFsaXR5LAorbG93ZXIgbWFpbnRlbmFuY2UgYW5kIGRpc3RyaWJ1dGlvbiBjb3N0cywgYSBoaWdoZXIgbGV2ZWwgb2YgaW5mbHVlbmNlIG92ZXIKK3RoZSBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LCBhbmQgbW9yZS4gIEl0IGlzIGEgc2l0dWF0aW9uIHdoZXJlCitldmVyeWJvZHkgaW52b2x2ZWQgd2lucy4gIEZpcmUgdXAgeW91ciBlZGl0b3IgYW5kIGNvbWUgam9pbiB1czsgeW91IHdpbGwgYmUKK21vcmUgdGhhbiB3ZWxjb21lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kb250ZGlmZiBiL0RvY3VtZW50YXRpb24vZG9udGRpZmYKaW5kZXggMjc4MDkzNS4uMWU4OWE1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kb250ZGlmZgorKysgYi9Eb2N1bWVudGF0aW9uL2RvbnRkaWZmCkBAIC0yLDExICsyLDEzIEBACiAqLmF1eAogKi5iaW4KICouY3BpbwotKi5jc3MKKyouY3NwCisqLmRzcAogKi5kdmkKKyouZWxmCiAqLmVwcwotKi5mdy5nZW4uUwogKi5mdworKi5nZW4uUwogKi5naWYKICouZ3JlcAogKi5ncnAKQEAgLTMwLDYgKzMyLDcgQEAKICoucwogKi5zZ21sCiAqLnNvCisqLnNvLmRiZwogKi5zeW10eXBlcwogKi50YWIuYwogKi50YWIuaApAQCAtMzgsMjQgKzQxLDE3IEBACiAqLnhtbAogKl9NT0RVTEVTCiAqX3ZnYTE2LmMKLSpjc2NvcGUqCiAqfgogKi45CiAqLjkuZ3oKIC4qCi0uY3Njb3BlCi0uZ2l0aWdub3JlCi0ubWFpbG1hcAogLm1tCiA1M2M3MDBfZC5oCi01M2M4eHhfZC5oKgotQ09QWUlORwotQ1JFRElUUwogQ1ZTCiBDaGFuZ2VTZXQKIEltYWdlCiBLZXJudHlwZXMKLU1PRFMudHh0CitNb2R1bGUubWFya2VycwogTW9kdWxlLnN5bXZlcnMKIFBFTkRJTkcKIFNDQ1MKQEAgLTczLDcgKzY5LDkgQEAKIGJib290c2VjdAogYmluMmMKIGJpbmtlcm5lbC5zcGVjCitiaW5vZmZzZXQKIGJvb3RzZWN0Citib3VuZHMuaAogYnNldHVwCiBidGZpeHVwcHJlcAogYnVpbGQKQEAgLTg5LDM5ICs4NywzNiBAQAogY29uZmlnX2RhdGEuZ3oqCiBjb25tYWtlaGFzaAogY29uc29sZW1hcF9kZWZ0YmwuYyoKK2NwdXN0ci5oCiBjcmMzMnRhYmxlLmgqCiBjc2NvcGUuKgotZGVma2V5bWFwLmMqCitkZWZrZXltYXAuYwogZGV2bGlzdC5oKgogZG9jcHJvYwotZHVtbXlfc3ltLmMqCiBlbGYyZWNvZmYKIGVsZmNvbmZpZy5oKgotZmlsZWxpc3QKIGZpeGRlcAogZm9yZTIwMGVfbWtmaXJtCiBmb3JlMjAwZV9wY2FfZncuYyoKIGdjb25mCiBnZW4tZGV2bGlzdAotZ2VuLWtkYl9jbWRzLmMqCiBnZW5fY3JjMzJ0YWJsZQogZ2VuX2luaXRfY3BpbwogZ2Vua3N5bXMKLWdlbnRibAogKl9ncmF5MjU2LmMKK2loZXgyZncKIGlrY29uZmlnLmgqCiBpbml0cmFtZnNfZGF0YS5jcGlvCiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CiBpbml0cmFtZnNfbGlzdAoga2FsbHN5bXMKIGtjb25maWcKLWtjb25maWcudGsKLWtleXdvcmRzLmMqCitrZXl3b3Jkcy5jCiBrc3ltLmMqCiBrc3ltLmgqCiBreGdldHRleHQKIGxrY19kZWZzLmgKLWxleC5jKgorbGV4LmMKIGxleC4qLmMKIGxvZ29fKi5jCiBsb2dvXypfY2x1dDIyNC5jCkBAIC0xMzAsNyArMTI1LDYgQEAKIG1hY2gtdHlwZXMKIG1hY2gtdHlwZXMuaAogbWFjaHR5cGVzLmgKLW1ha2VfdGltZXNfaAogbWFwCiBtYXVpX2Jvb3QuaAogbWNvbmYKQEAgLTEzOCw2ICsxMzIsNyBAQAogbWtfZWxmY29uZmlnCiBta2Jvb3QKIG1rYnVnYm9vdAorbWtjcHVzdHIKIG1rZGVwCiBta3ByZXAKIG1rdGFibGVzCkBAIC0xNDUsMTEgKzE0MCwxMiBAQAogbW9kcG9zdAogbW9kdWxlcy5vcmRlcgogbW9kdmVyc2lvbnMuaCoKK25jc2NvcGUuKgogb2Zmc2V0LmgKIG9mZnNldHMuaAogb3VpLmMqCi1wYXJzZS5jKgotcGFyc2UuaCoKK3BhcnNlLmMKK3BhcnNlLmgKIHBhdGNoZXMqCiBwY2EyMDBlLmJpbgogcGNhMjAwZV9lY2QuYmluMgpAQCAtMTU3LDcgKzE1Myw3IEBACiBwaWdneWJhY2sKIHBubXRvbG9nbwogcHBjX2RlZnMuaCoKLXByb21jb25fdGJsLmMqCitwcm9tY29uX3RibC5jCiBwc3NfYm9vdC5oCiBxY29uZgogcmFpZDZhbHRpdmVjKi5jCkBAIC0xNjgsMjcgKzE2NCwzOCBAQAogc2V0dXAKIHNldHVwLmJpbgogc2V0dXAuZWxmCi1zaW03MTBfZC5oKgogc0ltYWdlCiBzbV90YmwqCiBzcGxpdC1pbmNsdWRlCitzeXNjYWxsdGFiLmgKIHRhZ3MKIHRmdHBib290LmltZwogdGltZWNvbnN0LmgKIHRpbWVzLmgqCi10a3BhcnNlCiB0cml4X2Jvb3QuaAogdXRzcmVsZWFzZS5oKgordmRzby1zeW1zLmxkcwogdmRzby5sZHMKK3Zkc28zMi1pbnQ4MC1zeW1zLmxkcwordmRzbzMyLXN5bXMubGRzCit2ZHNvMzItc3lzY2FsbC1zeW1zLmxkcwordmRzbzMyLXN5c2VudGVyLXN5bXMubGRzCit2ZHNvMzIubGRzCit2ZHNvMzIuc28uZGJnCit2ZHNvNjQubGRzCit2ZHNvNjQuc28uZGJnCiB2ZXJzaW9uLmgqCiB2bWxpbnV4CiB2bWxpbnV4LSoKIHZtbGludXguYW91dAotdm1saW51eCoubGRzKgotdm1saW51eCouc2NyCit2bWxpbnV4LmxkcwogdnN5c2NhbGwubGRzCit2c3lzY2FsbF8zMi5sZHMKIHdhbnhsZncuaW5jCiB1SW1hZ2UKIHVuaWZkZWYKK3dha2V1cC5iaW4KK3dha2V1cC5lbGYKK3dha2V1cC5sZHMKIHpJbWFnZSoKIHpjb25mLmhhc2guYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi9pbnRlbGZiLnR4dCBiL0RvY3VtZW50YXRpb24vZmIvaW50ZWxmYi50eHQKaW5kZXggMjdhMzE2MC4uZGQ5ZTk0NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi9pbnRlbGZiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL2ludGVsZmIudHh0CkBAIC0xNCw2ICsxNCw3IEBACiAJSW50ZWwgOTE1R00KIAlJbnRlbCA5NDVHCiAJSW50ZWwgOTQ1R00KKwlJbnRlbCA5NDVHTUUKIAlJbnRlbCA5NjVHCiAJSW50ZWwgOTY1R00KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi91dmVzYWZiLnR4dCBiL0RvY3VtZW50YXRpb24vZmIvdXZlc2FmYi50eHQKaW5kZXggYmNmYzIzMy4uN2FjM2M0MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYi91dmVzYWZiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL3V2ZXNhZmIudHh0CkBAIC01Miw3ICs1Miw3IEBACiAKICB2aWRlbz11dmVzYWZiOjEwMjR4NzY4LTMyLG10cnI6Myx5d3JhcCAoY29tcGlsZWQgaW50byB0aGUga2VybmVsKQogCi0gIyBtb2Rwcm9iZSB1dmVzYWZiIG1vZGU9MTAyNHg3NjgtMzIgbXRycj0zIHNjcm9sbD15d3JhcCAgKG1vZHVsZSkKKyAjIG1vZHByb2JlIHV2ZXNhZmIgbW9kZV9vcHRpb249MTAyNHg3NjgtMzIgbXRycj0zIHNjcm9sbD15d3JhcCAgKG1vZHVsZSkKIAogQWNjZXB0ZWQgb3B0aW9uczoKIApAQCAtMTA1LDcgKzEwNSw3IEBACiA8bW9kZT4gIFRoZSBtb2RlIHlvdSB3YW50IHRvIHNldCwgaW4gdGhlIHN0YW5kYXJkIG1vZGVkYiBmb3JtYXQuICBSZWZlciB0bwogICAgICAgICBtb2RlZGIudHh0IGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiAgV2hlbiB1dmVzYWZiIGlzIGNvbXBpbGVkIGFzCiAgICAgICAgIGEgbW9kdWxlLCB0aGUgbW9kZSBzdHJpbmcgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIGEgdmFsdWUgb2YgdGhlCi0gICAgICAgICdtb2RlJyBvcHRpb24uCisgICAgICAgICdtb2RlX29wdGlvbicgb3B0aW9uLgogCiB2YmVtb2RlOngKICAgICAgICAgRm9yY2UgdGhlIHVzZSBvZiBWQkUgbW9kZSB4LiAgVGhlIG1vZGUgd2lsbCBvbmx5IGJlIHNldCBpZiBpdCdzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZiL3ZpYWZiLm1vZGVzIGIvRG9jdW1lbnRhdGlvbi9mYi92aWFmYi5tb2RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU1YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi92aWFmYi5tb2RlcwpAQCAtMCwwICsxLDg3MCBAQAorIworIworIyAgIFRoZXNlIGRhdGEgYXJlIGJhc2VkIG9uIHRoZSBDUlRDIHBhcmFtZXRlcnMgaW4KKyMKKyMgICAgICAgVklBIEludGVncmF0aW9uIEdyYXBoaWNzIENoaXAKKyMgICAgICAgKEMpIDIwMDQgVklBIFRlY2hub2xvZ2llcyBJbmMuCisjCisKKyMKKyMgICA2NDB4NDgwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDI1LjE3NSBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgNjQwICAgICA0ODAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDMxLjQ2OSBrSHogIDU5Ljk0IEh6CisjICAgU3luYyBXaWR0aCAgICAgIDMuODEzIHVzICAgIDAuMDY0IG1zCisjICAgICAgICAgICAgICAgMTIgY2hhcnMgICAgMiBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjYzNiB1cyAgICAwLjMxOCAgbXMKKyMgICAgICAgICAgICAgICAyIGNoYXJzICAgICAxMCBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAxLjkwNyB1cyAgICAxLjA0OCAgbXMKKyMgICAgICAgICAgICAgICA2IGNoYXJzICAgICAzMyBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAyNS40MjIgdXMgICAxNS4yNTMgbXMKKyMgICAgICAgICAgICAgICA4MCBjaGFycyAgICA0ODAgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgNi4zNTYgdXMgICAgMS40MzAgbXMKKyMgICAgICAgICAgICAgICAyMCBjaGFycyAgICA0NSBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBuZWdhdGl2ZSAgICBuZWdhdGl2ZQorIworCittb2RlICI2NDB4NDgwLTYwIgorIyBEOiAyNS4xNzUgTUh6LCBIOiAzMS40Njkga0h6LCBWOiA1OS45NCBIegorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDQ4MCAzMgorICAgIHRpbWluZ3MgMzk3MjIgNDggMTYgMzMgMTAgOTYgMiBlbmRtb2RlIG1vZGUgIjQ4MHg2NDAtNjAiCisjIEQ6IDI0LjgyMyBNSHosIEg6IDM5Ljc4MCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgNDgwIDY0MCA0ODAgNjQwIDMyIHRpbWluZ3MgMzk3MjIgNzIgMjQgMTkgMSA0OCAzIGVuZG1vZGUKKyMKKyMgICA2NDB4NDgwLCA3NSBIeiwgTm9uLUludGVybGFjZWQgKDMxLjUwIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA2NDAgICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgMzcuNTAwIGtIeiAgNzUuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMi4wMzIgdXMgICAgMC4wODAgbXMKKyMgICAgICAgICAgICAgICA4IGNoYXJzICAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNTA4IHVzICAgIDAuMDI3IG1zCisjICAgICAgICAgICAgICAgMiBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAzLjgxMCB1cyAgICAwLjQyNyBtcworIyAgICAgICAgICAgICAgIDE1IGNoYXJzICAgIDE2IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDIwLjMxNyB1cyAgIDEyLjgwMCBtcworIyAgICAgICAgICAgICAgIDgwIGNoYXJzICAgIDQ4MCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA2LjM0OSB1cyAgICAwLjUzMyBtcworIyAgICAgICAgICAgICAgIDI1IGNoYXJzICAgIDIwIGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIG5lZ2F0aXZlCisjCisgICAgbW9kZSAiNjQweDQ4MC03NSIKKyMgRDogMzEuNTAgTUh6LCBIOiAzNy41MDAga0h6LCBWOiA3NS4wMCBIegorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDQ4MCAzMiB0aW1pbmdzIDMxNzQ3IDEyMCAxNiAxNiAxIDY0IDMgZW5kbW9kZQorIworIyAgIDY0MHg0ODAsIDg1IEh6LCBOb24tSW50ZXJsYWNlZCAoMzYuMDAwIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA2NDAgICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICA0My4yNjkga0h6ICA4NS4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjU1NiB1cyAgICAwLjA2OSBtcworIyAgICAgICAgICAgICAgIDcgY2hhcnMgICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMS41NTYgdXMgICAgMC4wMjMgbXMKKyMgICAgICAgICAgICAgICA3IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuMjIyIHVzICAgIDAuNTc4IG1zCisjICAgICAgICAgICAgICAgMTAgY2hhcnMgICAgMjUgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTcuNzc4IHVzICAgMTEuMDkzIG1zCisjICAgICAgICAgICAgICAgODAgY2hhcnMgICAgNDgwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDUuMzMzIHVzICAgIDAuNjcwIG1zCisjICAgICAgICAgICAgICAgMjQgY2hhcnMgICAgMjkgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgbmVnYXRpdmUgICAgbmVnYXRpdmUKKyMKKyAgICBtb2RlICI2NDB4NDgwLTg1IgorIyBEOiAzNi4wMDAgTUh6LCBIOiA0My4yNjkga0h6LCBWOiA4NS4wMCBIegorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDQ4MCAzMiB0aW1pbmdzIDI3Nzc3IDgwIDU2IDI1IDEgNTYgMyBlbmRtb2RlCisjCisjICAgNjQweDQ4MCwgMTAwIEh6LCBOb24tSW50ZXJsYWNlZCAoNDMuMTYzIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA2NDAgICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgNTAuOTAwIGtIeiAgMTAwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuNDgzIHVzICAgIDAuMDU4IG1zCisjICAgICAgICAgICAgICAgOCBjaGFycyAgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjkyNyB1cyAgICAwLjAxOSBtcworIyAgICAgICAgICAgICAgIDUgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi40MDkgdXMgICAgMC40NzUgbXMKKyMgICAgICAgICAgICAgICAxMyBjaGFycyAgICAyNSBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAxNC44MjcgdXMgICA5LjQzMCBtcworIyAgICAgICAgICAgICAgIDgwIGNoYXJzICAgIDQ4MCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA0LjgxOSB1cyAgICAwLjU3MCBtcworIyAgICAgICAgICAgICAgIDI2IGNoYXJzICAgIDI5IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiNjQweDQ4MC0xMDAiCisjIEQ6IDQzLjE2MyBNSHosIEg6IDUwLjkwMCBrSHosIFY6IDEwMC4wMCBIegorICAgIGdlb21ldHJ5IDY0MCA0ODAgNjQwIDQ4MCAzMiB0aW1pbmdzIDIzMTY4IDEwNCA0MCAyNSAxIDY0IDMgZW5kbW9kZQorIworIyAgIDY0MHg0ODAsIDEyMCBIeiwgTm9uLUludGVybGFjZWQgKDUyLjQwNiBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgNjQwICAgICA0ODAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDYxLjgwMCBrSHogIDEyMC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjIyMSB1cyAgICAwLjA0OCBtcworIyAgICAgICAgICAgICAgIDggY2hhcnMgICAgICAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzYzIHVzICAgIDAuMDE2IG1zCisjICAgICAgICAgICAgICAgNSBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAxLjk4NCB1cyAgICAwLjQ5NiBtcworIyAgICAgICAgICAgICAgIDEzIGNoYXJzICAgIDMxIGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDEyLjIxMiB1cyAgIDcuNzY3IG1zCisjICAgICAgICAgICAgICAgODAgY2hhcnMgICAgNDgwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDMuOTY5IHVzICAgIDAuNTY2IG1zCisjICAgICAgICAgICAgICAgMjYgY2hhcnMgICAgMzUgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICI2NDB4NDgwLTEyMCIKKyMgRDogNTIuNDA2IE1IeiwgSDogNjEuODAwIGtIeiwgVjogMTIwLjAwIEh6CisgICAgZ2VvbWV0cnkgNjQwIDQ4MCA2NDAgNDgwIDMyIHRpbWluZ3MgMTkwODEgMTA0IDQwIDMxIDEgNjQgMyBlbmRtb2RlCisjCisjICAgNzIweDQ4MCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgyNi44ODAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDcyMCAgICAgNDgwCisjICAgU2NhbiBGcmVxdWVuY3kgICAgICAzMC4wMDAga0h6ICA2MC4yNDEgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMi42NzkgdXMgICAgMC4wOTkgbXMKKyMgICAgICAgICAgICAgICA5IGNoYXJzICAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNTk1IHVzICAgIDAuMDMzIG1zCisjICAgICAgICAgICAgICAgMiBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAzLjI3NCB1cyAgICAwLjQ2MiBtcworIyAgICAgICAgICAgICAgIDExIGNoYXJzICAgIDE0IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDI2Ljc4NiB1cyAgIDE2LjAwMCBtcworIyAgICAgICAgICAgICAgIDkwIGNoYXJzICAgIDQ4MCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA2LjU0OCB1cyAgICAwLjYwMCBtcworIyAgICAgICAgICAgICAgIDIyIGNoYXJzICAgIDE4IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiNzIweDQ4MC02MCIKKyMgRDogMjYuODgwIE1IeiwgSDogMzAuMDAwIGtIeiwgVjogNjAuMjQgSHoKKyAgICBnZW9tZXRyeSA3MjAgNDgwIDcyMCA0ODAgMzIgdGltaW5ncyAzNzIwMiA4OCAxNiAxNCAxIDcyIDMgZW5kbW9kZQorIworIyAgIDgwMHg0ODAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMjkuNTgxIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICAgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDgwMCAgICAgICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAyOS44OTIga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAyLjcwNCB1cyAgICAxMDAuNjA0IHVzCisjICAgICAgICAgICAgICAgICAgIDEwIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC41NDEgdXMgICAgMzMuNTM1IHVzCisjICAgICAgICAgICAgICAgICAgIDIgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMy4yNDUgdXMgICAgNDM1Ljk0OSB1cworIyAgICAgICAgICAgICAgICAgICAxMiBjaGFycyAgICAxMyBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAyNy4wNDQgdXMgICAxNi4wOTcgbXMKKyMgICAgICAgICAgICAgICAgICAgMTAwIGNoYXJzICAgNDgwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDYuNDkxIHVzICAgIDAuNTcwIG1zCisjICAgICAgICAgICAgICAgICAgIDI0IGNoYXJzICAgIDE3IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiODAweDQ4MC02MCIKKyMgRDogMjkuNTAwIE1IeiwgSDogMjkuNzM4IGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSA4MDAgNDgwIDgwMCA0ODAgMzIgdGltaW5ncyAzMzgwNSA5NiAyNCAxMCAzIDcyIDcgZW5kbW9kZQorIworIyAgIDcyMHg1NzYsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMzIuNjY4IE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA3MjAgICAgIDU3NgorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgMzUuODIwIGtIeiAgNjAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMi4yMDQgdXMgICAgMC4wODMgbXMKKyMgICAgICAgICAgICAgICA5IGNoYXJzICAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzM1IHVzICAgIDAuMDI3IG1zCisjICAgICAgICAgICAgICAgMyBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAyLjkzOSB1cyAgICAwLjQ1OSBtcworIyAgICAgICAgICAgICAgIDEyIGNoYXJzICAgIDE3IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDIyLjA0MCB1cyAgIDE2LjA4MCBtcworIyAgICAgICAgICAgICAgIDkwIGNoYXJzICAgIDQ3NiBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA1Ljg3NyB1cyAgICAwLjU4NiBtcworIyAgICAgICAgICAgICAgIDI0IGNoYXJzICAgIDIxIGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiNzIweDU3Ni02MCIKKyMgRDogMzIuNjY4IE1IeiwgSDogMzUuODIwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSA3MjAgNTc2IDcyMCA1NzYgMzIgdGltaW5ncyAzMDYxMSA5NiAyNCAxNyAxIDcyIDMgZW5kbW9kZQorIworIyAgIDgwMHg2MDAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoNDAuMDAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDgwMCAgICAgNjAwCisjICAgU2NhbiBGcmVxdWVuY3kgICAgICAzNy44Nzkga0h6ICA2MC4zMiBIegorIyAgIFN5bmMgV2lkdGggICAgICAzLjIwMCB1cyAgICAwLjEwNiBtcworIyAgICAgICAgICAgICAgIDE2IGNoYXJzICAgIDQgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMS4wMDAgdXMgICAgMC4wMjYgbXMKKyMgICAgICAgICAgICAgICA1IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuMjAwIHVzICAgIDAuNjA3IG1zCisjICAgICAgICAgICAgICAgMTEgY2hhcnMgICAgMjMgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMjAuMDAwIHVzICAgMTUuODQwIG1zCisjICAgICAgICAgICAgICAgMTAwIGNoYXJzICAgNjAwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDYuNDAwIHVzICAgIDAuNzM5IG1zCisjICAgICAgICAgICAgICAgMzIgY2hhcnMgICAgMjggbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICI4MDB4NjAwLTYwIgorIyBEOiA0MC4wMCBNSHosIEg6IDM3Ljg3OSBrSHosIFY6IDYwLjMyIEh6CisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgNjAwIDMyCisgICAgdGltaW5ncyAyNTAwMCA4OCA0MCAyMyAxIDEyOCA0IGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlCisjCisjICAgODAweDYwMCwgNzUgSHosIE5vbi1JbnRlcmxhY2VkICg0OS41MCBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgODAwICAgICA2MDAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDQ2Ljg3NSBrSHogIDc1LjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuNjE2IHVzICAgIDAuMDY0IG1zCisjICAgICAgICAgICAgICAgMTAgY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjMyMyB1cyAgICAwLjAyMSBtcworIyAgICAgICAgICAgICAgIDIgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMy4yMzIgdXMgICAgMC40NDggbXMKKyMgICAgICAgICAgICAgICAyMCBjaGFycyAgICAyMSBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAxNi4xNjIgdXMgICAxMi44MDAgbXMKKyMgICAgICAgICAgICAgICAxMDAgY2hhcnMgICA2MDAgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgNS4xNzIgdXMgICAgMC41MzMgbXMKKyMgICAgICAgICAgICAgICAzMiBjaGFycyAgICAyNSBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBwb3NpdGl2ZSAgICBwb3NpdGl2ZQorIworICAgIG1vZGUgIjgwMHg2MDAtNzUiCisjIEQ6IDQ5LjUwIE1IeiwgSDogNDYuODc1IGtIeiwgVjogNzUuMDAgSHoKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCA2MDAgMzIKKyAgICB0aW1pbmdzIDIwMjAzIDE2MCAxNiAyMSAxIDgwIDMgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUKKyMKKyMgICA4MDB4NjAwLCA4NSBIeiwgTm9uLUludGVybGFjZWQgKDU2LjI1IE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA4MDAgICAgIDYwMAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgNTMuNjc0IGtIeiAgODUuMDYxIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMTM4IHVzICAgIDAuMDU2IG1zCisjICAgICAgICAgICAgICAgOCBjaGFycyAgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjU2OSB1cyAgICAwLjAxOSBtcworIyAgICAgICAgICAgICAgIDQgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi43MDIgdXMgICAgMC41MDMgbXMKKyMgICAgICAgICAgICAgICAxOSBjaGFycyAgICAyNyBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAxNC4yMjIgdXMgICAxMS4xNzkgbXMKKyMgICAgICAgICAgICAgICAxMDAgY2hhcnMgICA2MDAgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgNC40MDkgdXMgICAgMC41NzggbXMKKyMgICAgICAgICAgICAgICAzMSBjaGFycyAgICAzMSBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBwb3NpdGl2ZSAgICBwb3NpdGl2ZQorIworICAgIG1vZGUgIjgwMHg2MDAtODUiCisjIEQ6IDU2LjI1IE1IeiwgSDogNTMuNjc0IGtIeiwgVjogODUuMDYxIEh6CisgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgNjAwIDMyCisgICAgdGltaW5ncyAxNzc3NyAxNTIgMzIgMjcgMSA2NCAzIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlCisjCisjICAgODAweDYwMCwgMTAwIEh6LCBOb24tSW50ZXJsYWNlZCAoNjcuNTAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDgwMCAgICAgNjAwCisjICAgU2NhbiBGcmVxdWVuY3kgICAgICA2Mi41MDAga0h6ICAxMDAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMC45NDggdXMgICAgMC4wNjQgbXMKKyMgICAgICAgICAgICAgICA4IGNoYXJzICAgICA0IGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuMDAwIHVzICAgIDAuMTEyIG1zCisjICAgICAgICAgICAgICAgMCBjaGFycyAgICAgNyBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAzLjIwMCB1cyAgICAwLjIyNCBtcworIyAgICAgICAgICAgICAgIDI3IGNoYXJzICAgIDE0IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDExLjg1MiB1cyAgIDkuNjAwIG1zCisjICAgICAgICAgICAgICAgMTAwIGNoYXJzICAgNjAwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDQuMTQ4IHVzICAgIDAuNDAwIG1zCisjICAgICAgICAgICAgICAgMzUgY2hhcnMgICAgMjUgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICI4MDB4NjAwLTEwMCIKKyMgRDogNjcuNTAgTUh6LCBIOiA2Mi41MDAga0h6LCBWOiAxMDAuMDAgSHoKKyAgICBnZW9tZXRyeSA4MDAgNjAwIDgwMCA2MDAgMzIKKyAgICB0aW1pbmdzIDE0NjY3IDIxNiAwIDE0IDcgNjQgNCBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDgwMHg2MDAsIDEyMCBIeiwgTm9uLUludGVybGFjZWQgKDgzLjk1MCBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgODAwICAgICA2MDAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgNzcuMTYwIGtIeiAgMTIwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMDQ4IHVzICAgIDAuMDM5IG1zCisjICAgICAgICAgICAgICAgMTEgY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjY2NyB1cyAgICAwLjAxMyBtcworIyAgICAgICAgICAgICAgIDcgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMS43MTUgdXMgICAgMC41MDcgbXMKKyMgICAgICAgICAgICAgICAxOCBjaGFycyAgICAzOSBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICA5LjUyOSB1cyAgICA3Ljc3NiBtcworIyAgICAgICAgICAgICAgIDEwMCBjaGFycyAgIDYwMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICAzLjQzMSB1cyAgICAwLjU1NyBtcworIyAgICAgICAgICAgICAgIDM2IGNoYXJzICAgIDQzIGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiODAweDYwMC0xMjAiCisjIEQ6IDgzLjk1MCBNSHosIEg6IDc3LjE2MCBrSHosIFY6IDEyMC4wMCBIegorICAgIGdlb21ldHJ5IDgwMCA2MDAgODAwIDYwMCAzMgorICAgIHRpbWluZ3MgMTE5MTIgMTQ0IDU2IDM5IDEgODggMyBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDg0OHg0ODAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMzEuNDkwIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA4NDggICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAyOS44MjAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAyLjc5NSB1cyAgICAwLjA5OSBtcworIyAgICAgICAgICAgICAgIDExIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC41MDggdXMgICAgMC4wMzMgbXMKKyMgICAgICAgICAgICAgICAyIGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDMuMzAzIHVzICAgIDAuNDI5IG1zCisjICAgICAgICAgICAgICAgMTMgY2hhcnMgICAgMTMgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMjYuOTI5IHVzICAgMTYuMDk3IG1zCisjICAgICAgICAgICAgICAgMTA2IGNoYXJzICAgNDgwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDYuNjA1IHVzICAgIDAuNTcwIG1zCisjICAgICAgICAgICAgICAgMjYgY2hhcnMgICAgMTcgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICI4NDh4NDgwLTYwIgorIyBEOiAzMS41MDAgTUh6LCBIOiAyOS44MzAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDg0OCA0ODAgODQ4IDQ4MCAzMgorICAgIHRpbWluZ3MgMzE3NDYgMTA0IDI0IDEyIDMgODAgNSBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDg1Nng0ODAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMzEuNzI4IE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICA4NTYgICAgIDQ4MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAyOS44MjAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAyLjc3NCB1cyAgICAwLjA5OSBtcworIyAgICAgICAgICAgICAgIDExIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC41MDQgdXMgICAgMC4wMzMgbXMKKyMgICAgICAgICAgICAgICAyIGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDMuNzI4IHVzICAgIDAuNDI5IG1zCisjICAgICAgICAgICAgICAgMTMgY2hhcnMgICAgMTMgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMjYuOTc5IHVzICAgMTYuMDk3IG1zCisjICAgICAgICAgICAgICAgMTA3IGNoYXJzICAgNDgwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDYuNTU2IHVzICAgIDAuNTcwIG1zCisjICAgICAgICAgICAgICAgMjYgY2hhcnMgICAgMTcgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICI4NTZ4NDgwLTYwIgorIyBEOiAzMS43MjggTUh6LCBIOiAyOS44MjAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDg1NiA0ODAgODU2IDQ4MCAzMgorICAgIHRpbWluZ3MgMzE1MTggMTA0IDE2IDEzIDEgODggMworICAgIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlIG1vZGUgIjk2MHg2MDAtNjAiCisjIEQ6IDQ1LjI1MCBNSHosIEg6IDM3LjIxMiBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgOTYwIDYwMCA5NjAgNjAwIDMyIHRpbWluZ3MgMjIwOTkgMTI4IDMyIDE1IDMgOTYgNiBlbmRtb2RlCisjCisjICAgMTAwMHg2MDAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoNDguMDY4IE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICAxMDAwICAgICA2MDAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgMzcuMzIwIGtIeiAgNjAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMi4xNjQgdXMgICAgMC4wODAgbXMKKyMgICAgICAgICAgICAgICAxMyBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuODMyIHVzICAgIDAuMDI3IG1zCisjICAgICAgICAgICAgICAgNSBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAyLjk5NiB1cyAgICAwLjQ4MyBtcworIyAgICAgICAgICAgICAgIDE4IGNoYXJzICAgIDE4IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDIwLjgwNCB1cyAgIDE2LjA3NyBtcworIyAgICAgICAgICAgICAgIDEyNSBjaGFycyAgIDYwMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA1Ljk5MSB1cyAgICAwLjU4OSBtcworIyAgICAgICAgICAgICAgIDM2IGNoYXJzICAgIDIyIGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiMTAwMHg2MDAtNjAiCisjIEQ6IDQ4LjA2OCBNSHosIEg6IDM3LjMyMCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTAwMCA2MDAgMTAwMCA2MDAgMzIKKyAgICB0aW1pbmdzIDIwODM0IDE0NCA0MCAxOCAxIDEwNCAzIGVuZG1vZGUgbW9kZSAiMTAyNHg1NzYtNjAiCisjIEQ6IDQ2Ljk5NiBNSHosIEg6IDM1LjgyMCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTAyNCA1NzYgMTAyNCA1NzYgMzIKKyAgICB0aW1pbmdzIDIxMjc4IDE0NCA0MCAxNyAxIDEwNCAzIGVuZG1vZGUgbW9kZSAiMTAyNHg2MDAtNjAiCisjIEQ6IDQ4Ljk2NCBNSHosIEg6IDM3LjMyMCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTAyNCA2MDAgMTAyNCA2MDAgMzIKKyAgICB0aW1pbmdzIDIwNDYxIDE0NCA0MCAxOCAxIDEwNCAzIGVuZG1vZGUgbW9kZSAiMTA4OHg2MTItNjAiCisjIEQ6IDUyLjk1MiBNSHosIEg6IDM4LjA0MCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTA4OCA2MTIgMTA4OCA2MTIgMzIgdGltaW5ncyAxODg3NyAxNTIgNDggMTYgMyAxMDQgNSBlbmRtb2RlCisjCisjICAgMTAyNHg1MTIsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoNDEuMjkxIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICAxMDI0ICAgIDUxMgorIyAgIFNjYW4gRnJlcXVlbmN5ICAzMS44NjAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAyLjUxOSB1cyAgICAwLjA5NCBtcworIyAgICAgICAgICAgICAgIDEzIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC43NzUgdXMgICAgMC4wMzEgbXMKKyMgICAgICAgICAgICAgICA0IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDMuMjk0IHVzICAgIDAuNDY1IG1zCisjICAgICAgICAgICAgICAgMTcgY2hhcnMgICAgMTUgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMjQuODAwIHVzICAgMTYuMDcwIG1zCisjICAgICAgICAgICAgICAgMTI4IGNoYXJzICAgNTEyIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDYuNTg3IHVzICAgIDAuNTk2IG1zCisjICAgICAgICAgICAgICAgMzQgY2hhcnMgICAgMTkgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMDI0eDUxMi02MCIKKyMgRDogNDEuMjkxIE1IeiwgSDogMzEuODYwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxMDI0IDUxMiAxMDI0IDUxMiAzMgorICAgIHRpbWluZ3MgMjQyMTggMTI2IDMyIDE1IDEgMTA0IDMgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUKKyMKKyMgICAxMDI0eDYwMCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICg0OC44NzUgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgICAgICAxMDI0ICAgICAgICA3NjgKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDM3LjI1MiBrSHogIDYwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgICAgICAyLjEyOCB1cyAgICA4MC41MzJ1cworIyAgICAgICAgICAgICAgICAgICAgICAgMTMgY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAgICAwLjgxOCB1cyAgICAgMjYuODQ0IHVzCisjICAgICAgICAgICAgICAgICAgICAgICA1IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgICAgICAyLjk0NiB1cyAgICA0ODMuMTkyIHVzCisjICAgICAgICAgICAgICAgICAgICAgICAxOCBjaGFycyAgICAxOCBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAgICAgMjAuOTUxIHVzICAgMTYuNjk3IG1zCisjICAgICAgICAgICAgICAgICAgICAgICAxMjggY2hhcnMgICA2MjIgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgICAgIDUuODkzIHVzICAgIDAuNTkxIG1zCisjICAgICAgICAgICAgICAgICAgICAgICAzNiBjaGFycyAgICAyMiBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICAgICAgbmVnYXRpdmUgICAgcG9zaXRpdmUKKyMKKyNtb2RlICIxMDI0eDYwMC02MCIKKyMgICAgICMgRDogNDguODc1IE1IeiwgSDogMzcuMjUyIGtIeiwgVjogNjAuMDAgSHoKKyMgICAgIGdlb21ldHJ5IDEwMjQgNjAwIDEwMjQgNjAwIDMyCisjICAgIHRpbWluZ3MgMjA0NjAgIDE0NCA0MCAxOCAxIDEwNCAgMworIyBlbmRtb2RlCisjCisjICAgMTAyNHg3NjgsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoNjUuMDAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEwMjQgICAgICAgIDc2OAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgNDguMzYzIGtIeiAgNjAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMi4wOTIgdXMgICAgMC4xMjQgbXMKKyMgICAgICAgICAgICAgICAxNyBjaGFycyAgICA2IGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuMzY5IHVzICAgIDAuMDYyIG1zCisjICAgICAgICAgICAgICAgMyBjaGFycyAgICAgMyBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAyLjQ2MiB1cyAgICAwLjYwMSBtcworIyAgICAgICAgICAgICAgIDIwIGNoYXJzICAgIDI5IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDE1Ljc1NCB1cyAgIDE1Ljg4MCBtcworIyAgICAgICAgICAgICAgIDEyOCBjaGFycyAgIDc2OCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA0LjkyMyB1cyAgICAwLjc4NiBtcworIyAgICAgICAgICAgICAgIDQwIGNoYXJzICAgIDM4IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIG5lZ2F0aXZlCisjCisgICAgbW9kZSAiMTAyNHg3NjgtNjAiCisjIEQ6IDY1LjAwIE1IeiwgSDogNDguMzYzIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxMDI0IDc2OCAxMDI0IDc2OCAzMiB0aW1pbmdzIDE1Mzg1IDE2MCAyNCAyOSAzIDEzNiA2IGVuZG1vZGUKKyMKKyMgICAxMDI0eDc2OCwgNzUgSHosIE5vbi1JbnRlcmxhY2VkICg3OC43NSBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTAyNCAgICAgICAgNzY4CisjICAgU2NhbiBGcmVxdWVuY3kgICAgICA2MC4wMjMga0h6ICA3NS4wMyBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjIxOSB1cyAgICAwLjA1MCBtcworIyAgICAgICAgICAgICAgIDEyIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC4yMDMgdXMgICAgMC4wMTcgbXMKKyMgICAgICAgICAgICAgICAyIGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuMjM1IHVzICAgIDAuNDY2IG1zCisjICAgICAgICAgICAgICAgMjIgY2hhcnMgICAgMjggbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTMuMDAzIHVzICAgMTIuNzk1IG1zCisjICAgICAgICAgICAgICAgMTI4IGNoYXJzICAgNzY4IGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDMuNjU3IHVzICAgIDAuNTMzIG1zCisjICAgICAgICAgICAgICAgMzYgY2hhcnMgICAgMzIgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMDI0eDc2OC03NSIKKyMgRDogNzguNzUgTUh6LCBIOiA2MC4wMjMga0h6LCBWOiA3NS4wMyBIegorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgNzY4IDMyCisgICAgdGltaW5ncyAxMjY5OSAxNzYgMTYgMjggMSA5NiAzIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlCisjCisjICAgMTAyNHg3NjgsIDg1IEh6LCBOb24tSW50ZXJsYWNlZCAoOTQuNTAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEwMjQgICAgICAgIDc2OAorIyAgIFNjYW4gRnJlcXVlbmN5ICA2OC42Nzcga0h6ICA4NS4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjAxNiB1cyAgICAwLjA0NCBtcworIyAgICAgICAgICAgICAgIDEyIGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC41MDggdXMgICAgMC4wMTUgbXMKKyMgICAgICAgICAgICAgICA2IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuMjAxIHVzICAgIDAuNTI0IG1zCisjICAgICAgICAgICAgICAgMjYgY2hhcnMgICAgMzYgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTAuODM2IHVzICAgMTEuMTgzIG1zCisjICAgICAgICAgICAgICAgMTI4IGNoYXJzICAgNzY4IGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDMuNzI1IHVzICAgIDAuNTgyIG1zCisjICAgICAgICAgICAgICAgNDQgY2hhcnMgICAgNDAgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMDI0eDc2OC04NSIKKyMgRDogOTQuNTAgTUh6LCBIOiA2OC42Nzcga0h6LCBWOiA4NS4wMCBIegorICAgIGdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgNzY4IDMyCisgICAgdGltaW5ncyAxMDU4MiAyMDggNDggMzYgMSA5NiAzIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlCisjCisjICAgMTAyNHg3NjgsIDEwMCBIeiwgTm9uLUludGVybGFjZWQgKDExMC4wIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICAxMDI0ICAgICAgICA3NjgKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDc5LjAyMyBrSHogIDk5Ljc4IEh6CisjICAgU3luYyBXaWR0aCAgICAgIDAuODAwIHVzICAgIDAuMTAxIG1zCisjICAgICAgICAgICAgICAgMTEgY2hhcnMgICAgOCBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjAwMCB1cyAgICAwLjAwMCBtcworIyAgICAgICAgICAgICAgIDAgY2hhcnMgICAgIDAgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi41NDUgdXMgICAgMC4yMDIgbXMKKyMgICAgICAgICAgICAgICAzNSBjaGFycyAgICAxNiBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICA5LjMwOSB1cyAgICA5LjcxOSBtcworIyAgICAgICAgICAgICAgIDEyOCBjaGFycyAgIDc2OCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICAzLjM0NSB1cyAgICAwLjMwNCBtcworIyAgICAgICAgICAgICAgIDQ2IGNoYXJzICAgIDI0IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIG5lZ2F0aXZlCisjCisgICAgbW9kZSAiMTAyNHg3NjgtMTAwIgorIyBEOiAxMTMuMyBNSHosIEg6IDc5LjAyMyBrSHosIFY6IDk5Ljc4IEh6CisgICAgZ2VvbWV0cnkgMTAyNCA3NjggMTAyNCA3NjggMzIKKyAgICB0aW1pbmdzIDg4MjUgMjgwIDAgMTYgMCA4OCA4IGVuZG1vZGUgbW9kZSAiMTE1Mng3MjAtNjAiCisjIEQ6IDY2Ljc1MCBNSHosIEg6IDQ0Ljg1OSBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTE1MiA3MjAgMTE1MiA3MjAgMzIgdGltaW5ncyAxNDk4MSAxNjggNTYgMTkgMyAxMTIgNiBlbmRtb2RlCisjCisjICAgMTE1Mng4NjQsIDc1IEh6LCBOb24tSW50ZXJsYWNlZCAoMTEwLjAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDExNTIgICAgICAgIDg2NAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgNzUuMTM3IGtIeiAgNzQuOTkgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMS4zMDkgdXMgICAgMC4xMDYgbXMKKyMgICAgICAgICAgICAgICAxOCBjaGFycyAgICA4IGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuMjQ1IHVzICAgIDAuNTk5IG1zCisjICAgICAgICAgICAgICAgMyBjaGFycyAgICAgNDUgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMS4yODIgdXMgICAgMS4xMzIgbXMKKyMgICAgICAgICAgICAgICAxOCBjaGFycyAgICA4NSBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAxMC40NzMgdXMgICAxMS40OTkgbXMKKyMgICAgICAgICAgICAgICAxNDQgY2hhcnMgICA4NjQgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgMi44MzYgdXMgICAgMS44MzcgbXMKKyMgICAgICAgICAgICAgICAzOSBjaGFycyAgICAxMzggbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMTUyeDg2NC03NSIKKyMgRDogMTEwLjAgTUh6LCBIOiA3NS4xMzcga0h6LCBWOiA3NC45OSBIegorICAgIGdlb21ldHJ5IDExNTIgODY0IDExNTIgODY0IDMyCisgICAgdGltaW5ncyA5MjU5IDE0NCAyNCA4NSA0NSAxNDQgOAorICAgIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlIG1vZGUgIjEyMDB4NzIwLTYwIgorIyBEOiA3MC4xODQgTUh6LCBIOiA0NC43NjAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDEyMDAgNzIwIDEyMDAgNzIwIDMyCisgICAgdGltaW5ncyAxNDI1MyAxODQgMjggMjIgMSAxMjggMyBlbmRtb2RlIG1vZGUgIjEyODB4NjAwLTYwIgorIyBEOiA2MS41MDMgTUh6LCBIOiAzNy4zMjAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDEyODAgNjAwIDEyODAgNjAwIDMyCisgICAgdGltaW5ncyAxNjI2MCAxODQgMjggMTggMSAxMjggMyBlbmRtb2RlIG1vZGUgIjEyODB4NzIwLTUwIgorIyBEOiA2MC40NjYgTUh6LCBIOiAzNy4wNTAga0h6LCBWOiA1MC4wMCBIegorICAgIGdlb21ldHJ5IDEyODAgNzIwIDEyODAgNzIwIDMyCisgICAgdGltaW5ncyAxNjUzOCAxNzYgNDggMTcgMSAxMjggMyBlbmRtb2RlIG1vZGUgIjEyODB4NzY4LTUwIgorIyBEOiA2NS4xNzggTUh6LCBIOiAzOS41NTAga0h6LCBWOiA1MC4wMCBIegorICAgIGdlb21ldHJ5IDEyODAgNzY4IDEyODAgNzY4IDMyIHRpbWluZ3MgMTUzNDIgMTg0IDI4IDE5IDEgMTI4IDMgZW5kbW9kZQorIworIyAgIDEyODB4NzY4LCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDgwLjEzNiBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTI4MCAgICA3NjgKKyMgICBTY2FuIEZyZXF1ZW5jeSAgNDcuNzAwIGtIeiAgNjAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMS42OTcgdXMgICAgMC4wNjMgbXMKKyMgICAgICAgICAgICAgICAxNyBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzk5IHVzICAgIDAuMDIxIG1zCisjICAgICAgICAgICAgICAgOCBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAyLjQ5NiB1cyAgICAwLjQ4MyBtcworIyAgICAgICAgICAgICAgIDI1IGNoYXJzICAgIDIzIGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDE1Ljk3MyB1cyAgIDE2LjEwMSBtcworIyAgICAgICAgICAgICAgIDE2MCBjaGFycyAgIDc2OCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA0Ljk5MiB1cyAgICAwLjU2NiBtcworIyAgICAgICAgICAgICAgIDUwIGNoYXJzICAgIDI3IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIHBvc2l0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiMTI4MHg3NjgtNjAiCisjIEQ6IDgwLjEzIE1IeiwgSDogNDcuNzAwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxMjgwIDc2OCAxMjgwIDc2OCAzMgorICAgIHRpbWluZ3MgMTI0ODAgMjAwIDQ4IDIzIDEgMTI2IDMgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUKKyMKKyMgICAxMjgweDgwMCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICg4My4zNzUgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEyODAgICAgODAwCisjICAgU2NhbiBGcmVxdWVuY3kgIDQ5LjYyOCBrSHogIDYwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuNjMxIHVzICAgIDYwLjQ1MCB1cworIyAgICAgICAgICAgICAgICAgICAxNyBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzY4IHVzICAgIDIwLjE1IHVzCisjICAgICAgICAgICAgICAgICAgIDggY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi4zOTkgdXMgICAgMC40ODMgbXMKKyMgICAgICAgICAgICAgICAgICAgMjUgY2hhcnMgICAgMjQgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTUuMzUyIHVzICAgMTYuMTIwIG1zCisjICAgICAgICAgICAgICAgICAgIDE2MCBjaGFycyAgIDgwMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA0Ljc5OCB1cyAgICAwLjU2NCBtcworIyAgICAgICAgICAgICAgICAgICA1MCBjaGFycyAgICAyOCBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBuZWd0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiMTI4MHg4MDAtNjAiCisjIEQ6IDgzLjUwMCBNSHosIEg6IDQ5LjcwMiBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTI4MCA4MDAgMTI4MCA4MDAgMzIgdGltaW5ncyAxMTk5NCAyMDAgNzIgMjIgMyAxMjggNiBlbmRtb2RlCisjCisjICAgMTI4MHg5NjAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMTA4LjAwIE1IeiBkb3RjbG9jaykKKyMKKyMgICAgICAgICAgICAgICBIb3Jpem9udGFsICBWZXJ0aWNhbAorIyAgIFJlc29sdXRpb24gICAgICAxMjgwICAgIDk2MAorIyAgIFNjYW4gRnJlcXVlbmN5ICA2MC4wMDAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjAzNyB1cyAgICAwLjA1MCBtcworIyAgICAgICAgICAgICAgIDE0IGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC44ODkgdXMgICAgMC4wMTcgbXMKKyMgICAgICAgICAgICAgICAxMiBjaGFycyAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuODg5IHVzICAgIDAuNjAwIG1zCisjICAgICAgICAgICAgICAgMzkgY2hhcnMgICAgMzYgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTEuODUyIHVzICAgMTYuMDAwIG1zCisjICAgICAgICAgICAgICAgMTYwIGNoYXJzICAgOTYwIGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDQuODE1IHVzICAgIDAuNjY3IG1zCisjICAgICAgICAgICAgICAgNjUgY2hhcnMgICAgNDAgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMjgweDk2MC02MCIKKyMgRDogMTA4LjAwIE1IeiwgSDogNjAuMDAwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxMjgwIDk2MCAxMjgwIDk2MCAzMgorICAgIHRpbWluZ3MgOTI1OSAzMTIgOTYgMzYgMSAxMTIgMyBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDEyODB4MTAyNCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgxMDguMDAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEyODAgICAgICAgIDEwMjQKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDYzLjk4MSBrSHogIDYwLjAyIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMDM3IHVzICAgIDAuMDQ3IG1zCisjICAgICAgICAgICAgICAgMTQgY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjQ0NCB1cyAgICAwLjAxNSBtcworIyAgICAgICAgICAgICAgIDYgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi4yOTcgdXMgICAgMC41OTQgbXMKKyMgICAgICAgICAgICAgICAzMSBjaGFycyAgICAzOCBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICAxMS44NTIgdXMgICAxNi4wMDUgbXMKKyMgICAgICAgICAgICAgICAxNjAgY2hhcnMgICAxMDI0IGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDMuNzc4IHVzICAgIDAuNjU2IG1zCisjICAgICAgICAgICAgICAgNTEgY2hhcnMgICAgNDIgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMjgweDEwMjQtNjAiCisjIEQ6IDEwOC4wMCBNSHosIEg6IDYzLjk4MSBrSHosIFY6IDYwLjAyIEh6CisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMTAyNCAzMgorICAgIHRpbWluZ3MgOTI2MCAyNDggNDggMzggMSAxMTIgMyBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDEyODB4MTAyNCwgNzUgSHosIE5vbi1JbnRlcmxhY2VkICgxMzUuMDAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEyODAgICAgICAgIDEwMjQKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDc5Ljk3NiBrSHogIDc1LjAyIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMDY3IHVzICAgIDAuMDM4IG1zCisjICAgICAgICAgICAgICAgMTggY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjExOSB1cyAgICAwLjAxMiBtcworIyAgICAgICAgICAgICAgIDIgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMS44MzcgdXMgICAgMC40NzUgbXMKKyMgICAgICAgICAgICAgICAzMSBjaGFycyAgICAzOCBsaW5lcworIyAgIEFjdGl2ZSBUaW1lICAgICA5LjQ4MSB1cyAgICAxMi44MDQgbXMKKyMgICAgICAgICAgICAgICAxNjAgY2hhcnMgICAxMDI0IGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDMuMDIyIHVzICAgIDAuNTI1IG1zCisjICAgICAgICAgICAgICAgNTEgY2hhcnMgICAgNDIgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMjgweDEwMjQtNzUiCisjIEQ6IDEzNS4wMCBNSHosIEg6IDc5Ljk3NiBrSHosIFY6IDc1LjAyIEh6CisgICAgZ2VvbWV0cnkgMTI4MCAxMDI0IDEyODAgMTAyNCAzMgorICAgIHRpbWluZ3MgNzQwOCAyNDggMTYgMzggMSAxNDQgMyBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDEyODB4MTAyNCwgODUgSHosIE5vbi1JbnRlcmxhY2VkICgxNTcuNTAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDEyODAgICAgICAgIDEwMjQKKyMgICBTY2FuIEZyZXF1ZW5jeSAgOTEuMTQ2IGtIeiAgODUuMDIgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMS4wMTYgdXMgICAgMC4wMzMgbXMKKyMgICAgICAgICAgICAgICAyMCBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNDA2IHVzICAgIDAuMDExIG1zCisjICAgICAgICAgICAgICAgOCBjaGFycyAgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAxLjQyMiB1cyAgICAwLjQ4MyBtcworIyAgICAgICAgICAgICAgIDI4IGNoYXJzICAgIDQ0IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDguMTI3IHVzICAgIDExLjIzNSBtcworIyAgICAgICAgICAgICAgIDE2MCBjaGFycyAgIDEwMjQgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgMi44NDQgdXMgICAgMC41MjcgbXMKKyMgICAgICAgICAgICAgICA1NiBjaGFycyAgICA0OCBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBwb3NpdGl2ZSAgICBwb3NpdGl2ZQorIworICAgIG1vZGUgIjEyODB4MTAyNC04NSIKKyMgRDogMTU3LjUwIE1IeiwgSDogOTEuMTQ2IGtIeiwgVjogODUuMDIgSHoKKyAgICBnZW9tZXRyeSAxMjgwIDEwMjQgMTI4MCAxMDI0IDMyCisgICAgdGltaW5ncyA2MzQ5IDIyNCA2NCA0NCAxIDE2MCAzCisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMTQ0MHg5MDAtNjAiCisjIEQ6IDEwNi41MDAgTUh6LCBIOiA1NS45MzUga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDE0NDAgOTAwIDE0NDAgOTAwIDMyCisgICAgdGltaW5ncyA5MzkwIDIzMiA4MCAyNSAzIDE1MiA2CisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMTQ0MHg5MDAtNzUiCisjIEQ6IDEzNi43NTAgTUh6LCBIOiA3MC42MzUga0h6LCBWOiA3NS4wMCBIegorICAgIGdlb21ldHJ5IDE0NDAgOTAwIDE0NDAgOTAwIDMyCisgICAgdGltaW5ncyA3MzE1IDI0OCA5NiAzMyAzIDE1MiA2IGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlCisjCisjICAgMTQ0MHgxMDUwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDEyNS4xMCBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTQ0MCAgICAgICAgMTA1MAorIyAgIFNjYW4gRnJlcXVlbmN5ICAgICAgNjUuMjIwIGtIeiAgNjAuMDAgSHoKKyMgICBTeW5jIFdpZHRoICAgICAgMS4yMDQgdXMgICAgMC4wNDYgbXMKKyMgICAgICAgICAgICAgICAxOSBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzYwIHVzICAgIDAuMDE1IG1zCisjICAgICAgICAgICAgICAgMTIgY2hhcnMgICAgMSBsaW5lcworIyAgIEJhY2sgUG9yY2ggICAgICAxLjk2NCB1cyAgICAwLjQ5NSBtcworIyAgICAgICAgICAgICAgIDMxIGNoYXJzICAgIDMzIGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDExLjQwNSB1cyAgIDE2LjA5OSBtcworIyAgICAgICAgICAgICAgIDE4MCBjaGFycyAgIDEwNTAgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgMy45MjggdXMgICAgMC41NjcgbXMKKyMgICAgICAgICAgICAgICA2MiBjaGFycyAgICAzNyBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBwb3NpdGl2ZSAgICBwb3NpdGl2ZQorIworICAgIG1vZGUgIjE0NDB4MTA1MC02MCIKKyMgRDogMTI1LjEwIE1IeiwgSDogNjUuMjIwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxNDQwIDEwNTAgMTQ0MCAxMDUwIDMyCisgICAgdGltaW5ncyA3OTkzIDI0OCA5NiAzMyAxIDE1MiAzCisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMTYwMHg5MDAtNjAiCisjIEQ6IDExOC4yNTAgTUh6LCBIOiA1NS45OTAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDE2MDAgOTAwIDE2MDAgOTAwIDMyCisgICAgdGltaW5ncyA4NDE1IDI1NiA4OCAyNiAzIDE2OCA1IGVuZG1vZGUgbW9kZSAiMTYwMHgxMDI0LTYwIgorIyBEOiAxMzYuMzU4IE1IeiwgSDogNjMuNjAwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxNjAwIDEwMjQgMTYwMCAxMDI0IDMyIHRpbWluZ3MgNzMxNSAyNzIgMTA0IDMyIDEgMTY4IDMgZW5kbW9kZQorIworIyAgIDE2MDB4MTIwMCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgxNTYuMDAgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDE2MDAgICAgICAgIDEyMDAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDc2LjIwMCBrSHogIDYwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMDI2IHVzICAgIDAuMTA1IG1zCisjICAgICAgICAgICAgICAgMjAgY2hhcnMgICAgOCBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjIwNSB1cyAgICAwLjEzMSBtcworIyAgICAgICAgICAgICAgIDQgY2hhcnMgICAgIDEwIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDEuNjM2IHVzICAgIDAuNjgyIG1zCisjICAgICAgICAgICAgICAgMzIgY2hhcnMgICAgNTIgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTAuMjU2IHVzICAgMTUuNzQ4IG1zCisjICAgICAgICAgICAgICAgMjAwIGNoYXJzICAgMTIwMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICAyLjg3MiB1cyAgICAwLjg2NiBtcworIyAgICAgICAgICAgICAgIDU2IGNoYXJzICAgIDY2IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIG5lZ2F0aXZlCisjCisgICAgbW9kZSAiMTYwMHgxMjAwLTYwIgorIyBEOiAxNTYuMDAgTUh6LCBIOiA3Ni4yMDAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDE2MDAgMTIwMCAxNjAwIDEyMDAgMzIgdGltaW5ncyA2MTcyIDI1NiAzMiA1MiAxMCAxNjAgOCBlbmRtb2RlCisjCisjICAgMTYwMHgxMjAwLCA3NSBIeiwgTm9uLUludGVybGFjZWQgKDIwMi41MCBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTYwMCAgICAgICAgMTIwMAorIyAgIFNjYW4gRnJlcXVlbmN5ICA5My43NTAga0h6ICA3NS4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAwLjk0OCB1cyAgICAwLjAzMiBtcworIyAgICAgICAgICAgICAgIDI0IGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC4zMTYgdXMgICAgMC4wMTEgbXMKKyMgICAgICAgICAgICAgICA4IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDEuNTAxIHVzICAgIDAuNDkxIG1zCisjICAgICAgICAgICAgICAgMzggY2hhcnMgICAgNDYgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgNy45MDEgdXMgICAgMTIuODAwIG1zCisjICAgICAgICAgICAgICAgMjAwIGNoYXJzICAgMTIwMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICAyLjc2NSB1cyAgICAwLjUzMyBtcworIyAgICAgICAgICAgICAgIDcwIGNoYXJzICAgIDUwIGxpbmVzCisjICAgUG9sYXJpdHkgICAgcG9zaXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxNjAweDEyMDAtNzUiCisjIEQ6IDIwMi41MCBNSHosIEg6IDkzLjc1MCBrSHosIFY6IDc1LjAwIEh6CisgICAgZ2VvbWV0cnkgMTYwMCAxMjAwIDE2MDAgMTIwMCAzMgorICAgIHRpbWluZ3MgNDkzOCAzMDQgNjQgNDYgMSAxOTIgMworICAgIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlIG1vZGUgIjE2ODB4MTA1MC02MCIKKyMgRDogMTQ2LjI1MCBNSHosIEg6IDY1LjI5MCBrSHosIFY6IDU5Ljk1NCBIegorICAgIGdlb21ldHJ5IDE2ODAgMTA1MCAxNjgwIDEwNTAgMzIKKyAgICB0aW1pbmdzIDY4MTQgMjgwIDEwNCAzMCAzIDE3NiA2CisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMTY4MHgxMDUwLTc1IgorIyBEOiAxODcuMDAwIE1IeiwgSDogODIuMzA2IGtIeiwgVjogNzQuODkyIEh6CisgICAgZ2VvbWV0cnkgMTY4MCAxMDUwIDE2ODAgMTA1MCAzMgorICAgIHRpbWluZ3MgNTM0OCAyOTYgMTIwIDQwIDMgMTc2IDYKKyAgICBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZSBtb2RlICIxNzkyeDEzNDQtNjAiCisjIEQ6IDIwMi45NzUgTUh6LCBIOiA4My40NjAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDE3OTIgMTM0NCAxNzkyIDEzNDQgMzIKKyAgICB0aW1pbmdzIDQ5MDIgMzIwIDEyOCA0MyAxIDE5MiAzCisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMTg1NngxMzkyLTYwIgorIyBEOiAyMTguNTcxIE1IeiwgSDogODYuNDYwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxODU2IDEzOTIgMTg1NiAxMzkyIDMyCisgICAgdGltaW5ncyA0NTc3IDMzNiAxMzYgNDUgMSAyMDAgMworICAgIGhzeW5jIGhpZ2ggdnN5bmMgaGlnaCBlbmRtb2RlIG1vZGUgIjE5MjB4MTIwMC02MCIKKyMgRDogMTkzLjI1MCBNSHosIEg6IDc0LjU1NiBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTkyMCAxMjAwIDE5MjAgMTIwMCAzMgorICAgIHRpbWluZ3MgNTE3MyAzMzYgMTM2IDM2IDMgMjAwIDYKKyAgICBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZSBtb2RlICIxOTIweDE0NDAtNjAiCisjIEQ6IDIzNC4wMDAgTUh6LCBIOjkwLjAwMCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTkyMCAxNDQwIDE5MjAgMTQ0MCAzMgorICAgIHRpbWluZ3MgNDI3NCAzNDQgMTI4IDU2IDEgMjA4IDMKKyAgICBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZSBtb2RlICIxOTIweDE0NDAtNzUiCisjIEQ6IDI5Ny4wMDAgTUh6LCBIOjExMi41MDAga0h6LCBWOiA3NS4wMCBIegorICAgIGdlb21ldHJ5IDE5MjAgMTQ0MCAxOTIwIDE0NDAgMzIKKyAgICB0aW1pbmdzIDMzNjcgMzUyIDE0NCA1NiAxIDIyNCAzCisgICAgaHN5bmMgaGlnaCB2c3luYyBoaWdoIGVuZG1vZGUgbW9kZSAiMjA0OHgxNTM2LTYwIgorIyBEOiAyNjcuMjUwIE1IeiwgSDogOTUuNDQ2IGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAyMDQ4IDE1MzYgMjA0OCAxNTM2IDMyCisgICAgdGltaW5ncyAzNzQyIDM3NiAxNTIgNDkgMyAyMjQgNCBoc3luYyBoaWdoIHZzeW5jIGhpZ2ggZW5kbW9kZQorIworIyAgIDEyODB4NzIwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDc0LjQ4MSBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTI4MCAgICAgICAgNzIwCisjICAgU2NhbiBGcmVxdWVuY3kgICAgICA0NC43NjAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjgyNiB1cyAgICA2Ny4wMjQgbXMKKyMgICAgICAgICAgICAgICAxNyBjaGFycyAgICAzIGxpbmVzCisjICAgRnJvbnQgUG9yY2ggICAgIDAuNzUyIHVzICAgIDIyLjM0MSBtcworIyAgICAgICAgICAgICAgIDcgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMi41NzggdXMgICAgNDkxLjUxMCBtcworIyAgICAgICAgICAgICAgIDI0IGNoYXJzICAgIDIyIGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDE3LjE4NiB1cyAgIDE2LjA4NiBtcworIyAgICAgICAgICAgICAgIDE2MCBjaGFycyAgIDcyMCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICA1LjE1NiB1cyAgICAwLjU4MSBtcworIyAgICAgICAgICAgICAgIDQ4IGNoYXJzICAgIDI2IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIG5lZ2F0aXZlCisjCisgICAgbW9kZSAiMTI4MHg3MjAtNjAiCisjIEQ6IDc0LjQ4MSBNSHosIEg6IDQ0Ljc2MCBrSHosIFY6IDYwLjAwIEh6CisgICAgZ2VvbWV0cnkgMTI4MCA3MjAgMTI4MCA3MjAgMzIgdGltaW5ncyAxMzQyNiAxOTIgNjQgMjIgMSAxMzYgMyBlbmRtb2RlCisjCisjICAgMTkyMHgxMDgwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDE3Mi43OTggTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDE5MjAgICAgICAgIDEwODAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDY3LjA4MCBrSHogIDYwLjAwIEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMjA0IHVzICAgIDQ0LjcyMyBtcworIyAgICAgICAgICAgICAgIDI2IGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC42OTQgdXMgICAgMTQuOTA4IG1zCisjICAgICAgICAgICAgICAgMTUgY2hhcnMgICAgIDEgbGluZXMKKyMgICBCYWNrIFBvcmNoICAgICAgMS44OTggdXMgICAgNTA2Ljg1NyBtcworIyAgICAgICAgICAgICAgIDQxIGNoYXJzICAgIDM0IGxpbmVzCisjICAgQWN0aXZlIFRpbWUgICAgIDExLjExMSB1cyAgIDE2LjEwMCBtcworIyAgICAgICAgICAgICAgIDI0MCBjaGFycyAgIDEwODAgbGluZXMKKyMgICBCbGFuayBUaW1lICAgICAgMy43OTYgdXMgICAgMC41NjYgbXMKKyMgICAgICAgICAgICAgICA4MiBjaGFycyAgICAzOCBsaW5lcworIyAgIFBvbGFyaXR5ICAgICAgICBuZWdhdGl2ZSAgICBuZWdhdGl2ZQorIworICAgIG1vZGUgIjE5MjB4MTA4MC02MCIKKyMgRDogNzQuNDgxIE1IeiwgSDogNjcuMDgwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxOTIwIDEwODAgMTkyMCAxMDgwIDMyIHRpbWluZ3MgNTc4NyAzMjggMTIwIDM0IDEgMjA4IDMgZW5kbW9kZQorIworIyAgIDE0MDB4MTA1MCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgxMjIuNjEgTUh6IGRvdGNsb2NrKQorIworIyAgICAgICAgICAgICAgIEhvcml6b250YWwgIFZlcnRpY2FsCisjICAgUmVzb2x1dGlvbiAgICAgIDE0MDAgICAgICAgIDEwNTAKKyMgICBTY2FuIEZyZXF1ZW5jeSAgICAgIDY1LjIxOCBrSHogIDU5Ljk5IEh6CisjICAgU3luYyBXaWR0aCAgICAgIDEuMDM3IHVzICAgIDAuMDQ3IG1zCisjICAgICAgICAgICAgICAgMTkgY2hhcnMgICAgMyBsaW5lcworIyAgIEZyb250IFBvcmNoICAgICAwLjQ0NCB1cyAgICAwLjAxNSBtcworIyAgICAgICAgICAgICAgIDExIGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDEuMTg1IHVzICAgIDAuMTg4IG1zCisjICAgICAgICAgICAgICAgMzAgY2hhcnMgICAgMzMgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTIuOTYzIHVzICAgMTYuNDExIG1zCisjICAgICAgICAgICAgICAgMTc1IGNoYXJzICAgMTA1MCBsaW5lcworIyAgIEJsYW5rIFRpbWUgICAgICAyLjY2NyB1cyAgICAwLjI1MCBtcworIyAgICAgICAgICAgICAgIDYwIGNoYXJzICAgIDM3IGxpbmVzCisjICAgUG9sYXJpdHkgICAgICAgIG5lZ2F0aXZlICAgIHBvc2l0aXZlCisjCisgICAgbW9kZSAiMTQwMHgxMDUwLTYwIgorIyBEOiAxMjIuNzUwIE1IeiwgSDogNjUuMzE3IGtIeiwgVjogNTkuOTkgSHoKKyAgICBnZW9tZXRyeSAxNDAwIDEwNTAgMTQwOCAxMDUwIDMyCisgICAgdGltaW5ncyA4MjE0IDIzMiA4OCAzMiAzIDE0NCA0IGVuZG1vZGUgbW9kZSAiMTQwMHgxMDUwLTc1IgorIyBEOiAxNTYuMDAwIE1IeiwgSDogODIuMjc4IGtIeiwgVjogNzQuODY3IEh6CisgICAgZ2VvbWV0cnkgMTQwMCAxMDUwIDE0MDggMTA1MCAzMiB0aW1pbmdzIDY0MTAgMjQ4IDEwNCA0MiAzIDE0NCA0IGVuZG1vZGUKKyMKKyMgICAxMzY2eDc2OCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICg4NS44NiBNSHogZG90Y2xvY2spCisjCisjICAgICAgICAgICAgICAgSG9yaXpvbnRhbCAgVmVydGljYWwKKyMgICBSZXNvbHV0aW9uICAgICAgMTM2NiAgICAgICAgNzY4CisjICAgU2NhbiBGcmVxdWVuY3kgICAgICA0Ny43MDAga0h6ICA2MC4wMCBIegorIyAgIFN5bmMgV2lkdGggICAgICAxLjY3NyB1cyAgICAwLjA2MyBtcworIyAgICAgICAgICAgICAgIDE4IGNoYXJzICAgIDMgbGluZXMKKyMgICBGcm9udCBQb3JjaCAgICAgMC44MzkgdXMgICAgMC4wMjEgbXMKKyMgICAgICAgICAgICAgICA5IGNoYXJzICAgICAxIGxpbmVzCisjICAgQmFjayBQb3JjaCAgICAgIDIuNTE2IHVzICAgIDAuNDgyIG1zCisjICAgICAgICAgICAgICAgMjcgY2hhcnMgICAgMjMgbGluZXMKKyMgICBBY3RpdmUgVGltZSAgICAgMTUuOTMzIHVzICAgMTYuMTAxIG1zCisjICAgICAgICAgICAgICAgMTcxIGNoYXJzICAgNzY4IGxpbmVzCisjICAgQmxhbmsgVGltZSAgICAgIDUuMDMxIHVzICAgIDAuNTY2IG1zCisjICAgICAgICAgICAgICAgNTQgY2hhcnMgICAgMjcgbGluZXMKKyMgICBQb2xhcml0eSAgICAgICAgbmVnYXRpdmUgICAgcG9zaXRpdmUKKyMKKyAgICBtb2RlICIxMzYweDc2OC02MCIKKyMgRDogODQuNzUwIE1IeiwgSDogNDcuNzIwIGtIeiwgVjogNjAuMDAgSHoKKyAgICBnZW9tZXRyeSAxMzYwIDc2OCAxMzYwIDc2OCAzMgorICAgIHRpbWluZ3MgMTE3OTkgMjA4IDcyIDIyIDMgMTM2IDUgZW5kbW9kZSBtb2RlICIxMzY2eDc2OC02MCIKKyMgRDogODUuODYgTUh6LCBIOiA0Ny43MDAga0h6LCBWOiA2MC4wMCBIegorICAgIGdlb21ldHJ5IDEzNjYgNzY4IDEzNjYgNzY4IDMyCisgICAgdGltaW5ncyAxMTY0NyAyMTYgNzIgMjMgMSAxNDQgMyBlbmRtb2RlIG1vZGUgIjEzNjZ4NzY4LTUwIgorIyBEOiA2OSw5MjQgTUh6LCBIOiAzOS41NTAga0h6LCBWOiA1MC4wMCBIegorICAgIGdlb21ldHJ5IDEzNjYgNzY4IDEzNjYgNzY4IDMyIHRpbWluZ3MgMTQzMDEgMjAwIDU2IDE5IDEgMTQ0IDMgZW5kbW9kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi92aWFmYi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZiL3ZpYWZiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RiZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYi92aWFmYi50eHQKQEAgLTAsMCArMSwyMTQgQEAKKworICAgICAgICBWSUEgSW50ZWdyYXRpb24gR3JhcGhpYyBDaGlwIENvbnNvbGUgRnJhbWVidWZmZXIgRHJpdmVyCisKK1tQbGF0Zm9ybV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgVGhlIGNvbnNvbGUgZnJhbWVidWZmZXIgZHJpdmVyIGlzIGZvciBncmFwaGljcyBjaGlwcyBvZgorICAgIFZJQSBVbmlDaHJvbWUgRmFtaWx5KENMRTI2NiwgUE04MDAgLyBDTjQwMCAvIENOMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgUDRNODAwQ0UgLyBQNE04MDBQcm8gLyBDTjcwMCAvIFZOODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1g3MDAgLyBWWDcwMCwgSzhNODkwLCBQNE04OTAsCisgICAgICAgICAgICAgICAgICAgICAgICBDTjg5NiAvIFA0TTkwMCwgVlg4MDApCisKK1tEcml2ZXIgZmVhdHVyZXNdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBEZXZpY2U6IENSVCwgTENELCBEVkkKKworICAgIFN1cHBvcnQgdmlhZmJfbW9kZToKKyAgICAgICAgQ1JUOgorICAgICAgICAgICAgNjQweDQ4MCg2MCwgNzUsIDg1LCAxMDAsIDEyMCBIeiksIDcyMHg0ODAoNjAgSHopLAorICAgICAgICAgICAgNzIweDU3Nig2MCBIeiksIDgwMHg2MDAoNjAsIDc1LCA4NSwgMTAwLCAxMjAgSHopLAorICAgICAgICAgICAgODQ4eDQ4MCg2MCBIeiksIDg1Nng0ODAoNjAgSHopLCAxMDI0eDUxMig2MCBIeiksCisgICAgICAgICAgICAxMDI0eDc2OCg2MCwgNzUsIDg1LCAxMDAgSHopLCAxMTUyeDg2NCg3NSBIeiksCisgICAgICAgICAgICAxMjgweDc2OCg2MCBIeiksIDEyODB4OTYwKDYwIEh6KSwgMTI4MHgxMDI0KDYwLCA3NSwgODUgSHopLAorICAgICAgICAgICAgMTQ0MHgxMDUwKDYwIEh6KSwgMTYwMHgxMjAwKDYwLCA3NSBIeiksIDEyODB4NzIwKDYwIEh6KSwKKyAgICAgICAgICAgIDE5MjB4MTA4MCg2MCBIeiksIDE0MDB4MTA1MCg2MCBIeiksIDgwMHg0ODAoNjAgSHopCisKKyAgICBjb2xvciBkZXB0aDogOCBicHAsIDE2IGJwcCwgMzIgYnBwIHN1cHBvcnRzLgorCisgICAgU3VwcG9ydCAyRCBoYXJkd2FyZSBhY2NlbGVyYXRvci4KKworW1VzaW5nIHRoZSB2aWFmYiBtb2R1bGVdCistLSAtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YXJ0IHZpYWZiIHdpdGggZGVmYXVsdCBzZXR0aW5nczoKKyAgICAgICAgI21vZHByb2JlIHZpYWZiCisKKyAgICBTdGFydCB2aWFmYiB3aXRoIHdpdGggdXNlciBvcHRpb25zOgorICAgICAgICAjbW9kcHJvYmUgdmlhZmIgdmlhZmJfbW9kZT04MDB4NjAwIHZpYWZiX2JwcD0xNiB2aWFmYl9yZWZyZXNoPTYwCisgICAgICAgICAgICAgICAgICB2aWFmYl9hY3RpdmVfZGV2PUNSVCtEVkkgdmlhZmJfZHZpX3BvcnQ9RFZQMQorICAgICAgICAgICAgICAgICAgdmlhZmJfbW9kZTE9MTAyNHg3NjggdmlhZmJfYnBwPTE2IHZpYWZiX3JlZnJlc2gxPTYwCisgICAgICAgICAgICAgICAgICB2aWFmYl9TQU1NX09OPTEKKworICAgIHZpYWZiX21vZGU6CisgICAgICAgIDY0MHg0ODAgKGRlZmF1bHQpCisgICAgICAgIDcyMHg0ODAKKyAgICAgICAgODAweDYwMAorICAgICAgICAxMDI0eDc2OAorICAgICAgICAuLi4uLi4KKworICAgIHZpYWZiX2JwcDoKKyAgICAgICAgOCwgMTYsIDMyIChkZWZhdWx0OjMyKQorCisgICAgdmlhZmJfcmVmcmVzaDoKKyAgICAgICAgNjAsIDc1LCA4NSwgMTAwLCAxMjAgKGRlZmF1bHQ6NjApCisKKyAgICB2aWFmYl9sY2RfZHNwX21ldGhvZDoKKyAgICAgICAgMCA6IGV4cGFuc2lvbiAoZGVmYXVsdCkKKyAgICAgICAgMSA6IGNlbnRlcmluZworCisgICAgdmlhZmJfbGNkX21vZGU6CisgICAgICAgIDAgOiBMQ0QgcGFuZWwgd2l0aCBMU0IgZGF0YSBmb3JtYXQgaW5wdXQgKGRlZmF1bHQpCisgICAgICAgIDEgOiBMQ0QgcGFuZWwgd2l0aCBNU0IgZGF0YSBmb3JtYXQgaW5wdXQKKworICAgIHZpYWZiX2xjZF9wYW5lbF9pZDoKKyAgICAgICAgMCA6IFJlc29sdXRpb246IDY0MHg0ODAsIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBFbmFibGUKKyAgICAgICAgMSA6IFJlc29sdXRpb246IDgwMHg2MDAsIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBFbmFibGUKKyAgICAgICAgMiA6IFJlc29sdXRpb246IDEwMjR4NzY4LCBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlIChkZWZhdWx0KQorICAgICAgICAzIDogUmVzb2x1dGlvbjogMTI4MHg3NjgsIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBFbmFibGUKKyAgICAgICAgNCA6IFJlc29sdXRpb246IDEyODB4MTAyNCwgQ2hhbm5lbDogZHVhbCwgRGl0aGVyaW5nOiBFbmFibGUKKyAgICAgICAgNSA6IFJlc29sdXRpb246IDE0MDB4MTA1MCwgQ2hhbm5lbDogZHVhbCwgRGl0aGVyaW5nOiBFbmFibGUKKyAgICAgICAgNiA6IFJlc29sdXRpb246IDE2MDB4MTIwMCwgQ2hhbm5lbDogZHVhbCwgRGl0aGVyaW5nOiBFbmFibGUKKworICAgICAgICA4IDogUmVzb2x1dGlvbjogODAweDQ4MCwgQ2hhbm5lbDogc2luZ2xlLCBEaXRoZXJpbmc6IEVuYWJsZQorICAgICAgICA5IDogUmVzb2x1dGlvbjogMTAyNHg3NjgsIENoYW5uZWw6IGR1YWwsIERpdGhlcmluZzogRW5hYmxlCisgICAgICAgIDEwOiBSZXNvbHV0aW9uOiAxMDI0eDc2OCwgQ2hhbm5lbDogc2luZ2xlLCBEaXRoZXJpbmc6IERpc2FibGUKKyAgICAgICAgMTE6IFJlc29sdXRpb246IDEwMjR4NzY4LCBDaGFubmVsOiBkdWFsLCBEaXRoZXJpbmc6IERpc2FibGUKKyAgICAgICAgMTI6IFJlc29sdXRpb246IDEyODB4NzY4LCBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRGlzYWJsZQorICAgICAgICAxMzogUmVzb2x1dGlvbjogMTI4MHgxMDI0LCBDaGFubmVsOiBkdWFsLCBEaXRoZXJpbmc6IERpc2FibGUKKyAgICAgICAgMTQ6IFJlc29sdXRpb246IDE0MDB4MTA1MCwgQ2hhbm5lbDogZHVhbCwgRGl0aGVyaW5nOiBEaXNhYmxlCisgICAgICAgIDE1OiBSZXNvbHV0aW9uOiAxNjAweDEyMDAsIENoYW5uZWw6IGR1YWwsIERpdGhlcmluZzogRGlzYWJsZQorICAgICAgICAxNjogUmVzb2x1dGlvbjogMTM2Nng3NjgsIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBEaXNhYmxlCisgICAgICAgIDE3OiBSZXNvbHV0aW9uOiAxMDI0eDYwMCwgQ2hhbm5lbDogc2luZ2xlLCBEaXRoZXJpbmc6IEVuYWJsZQorICAgICAgICAxODogUmVzb2x1dGlvbjogMTI4MHg3NjgsIENoYW5uZWw6IGR1YWwsIERpdGhlcmluZzogRW5hYmxlCisgICAgICAgIDE5OiBSZXNvbHV0aW9uOiAxMjgweDgwMCwgQ2hhbm5lbDogc2luZ2xlLCBEaXRoZXJpbmc6IEVuYWJsZQorCisgICAgdmlhZmJfYWNjZWw6CisgICAgICAgIDAgOiBObyAyRCBIYXJkd2FyZSBBY2NlbGVyYXRpb24KKyAgICAgICAgMSA6IDJEIEhhcmR3YXJlIEFjY2VsZXJhdGlvbiAoZGVmYXVsdCkKKworICAgIHZpYWZiX1NBTU1fT046CisgICAgICAgIDAgOiB2aWFmYl9TQU1NX09OIGRpc2FibGUgKGRlZmF1bHQpCisgICAgICAgIDEgOiB2aWFmYl9TQU1NX09OIGVuYWJsZQorCisgICAgdmlhZmJfbW9kZTE6IChzZWNvbmRhcnkgZGlzcGxheSBkZXZpY2UpCisgICAgICAgIDY0MHg0ODAgKGRlZmF1bHQpCisgICAgICAgIDcyMHg0ODAKKyAgICAgICAgODAweDYwMAorICAgICAgICAxMDI0eDc2OAorICAgICAgICAuLi4gLi4uCisKKyAgICB2aWFmYl9icHAxOiAoc2Vjb25kYXJ5IGRpc3BsYXkgZGV2aWNlKQorICAgICAgICA4LCAxNiwgMzIgKGRlZmF1bHQ6MzIpCisKKyAgICB2aWFmYl9yZWZyZXNoMTogKHNlY29uZGFyeSBkaXNwbGF5IGRldmljZSkKKyAgICAgICAgNjAsIDc1LCA4NSwgMTAwLCAxMjAgKGRlZmF1bHQ6NjApCisKKyAgICB2aWFmYl9hY3RpdmVfZGV2OgorICAgICAgICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYWN0aXZlIGRldmljZXMuKENSVCwgRFZJLCBDUlQrTENELi4uKQorICAgICAgICBEVkkgc3RhbmRzIGZvciBEVkkgb3IgSERNSSwgRS5nLiwgSWYgeW91IHdhbnQgdG8gZW5hYmxlIEhETUksCisgICAgICAgIHNldCB2aWFmYl9hY3RpdmVfZGV2PURWSS4gSW4gU0FNTSBjYXNlLCB0aGUgcHJldmlvdXMgb2YKKyAgICAgICAgdmlhZmJfYWN0aXZlX2RldiBpcyBwcmltYXJ5IGRldmljZSwgYW5kIHRoZSBmb2xsb3dpbmcgaXMKKyAgICAgICAgc2Vjb25kYXJ5IGRldmljZS4KKworICAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgVG8gZW5hYmxlIG9uZSBkZXZpY2UsIHN1Y2ggYXMgRFZJIG9ubHksIHdlIGNhbiB1c2U6CisgICAgICAgICAgICBtb2Rwcm9iZSB2aWFmYiB2aWFmYl9hY3RpdmVfZGV2PURWSQorICAgICAgICBUbyBlbmFibGUgdHdvIGRldmljZXMsIHN1Y2ggYXMgQ1JUK0RWSToKKyAgICAgICAgICAgIG1vZHByb2JlIHZpYWZiIHZpYWZiX2FjdGl2ZV9kZXY9Q1JUK0RWSTsKKworICAgICAgICBGb3IgRHVvVmlldyBjYXNlLCB3ZSBjYW4gdXNlOgorICAgICAgICAgICAgbW9kcHJvYmUgdmlhZmIgdmlhZmJfYWN0aXZlX2Rldj1DUlQrRFZJCisgICAgICAgICAgICBPUgorICAgICAgICAgICAgbW9kcHJvYmUgdmlhZmIgdmlhZmJfYWN0aXZlX2Rldj1EVkkrQ1JULi4uCisKKyAgICAgICAgRm9yIFNBTU0gY2FzZToKKyAgICAgICAgSWYgQ1JUIGlzIHByaW1hcnkgYW5kIERWSSBpcyBzZWNvbmRhcnksIHdlIHNob3VsZCB1c2U6CisgICAgICAgICAgICBtb2Rwcm9iZSB2aWFmYiB2aWFmYl9hY3RpdmVfZGV2PUNSVCtEVkkgdmlhZmJfU0FNTV9PTj0xLi4uCisgICAgICAgIElmIERWSSBpcyBwcmltYXJ5IGFuZCBDUlQgaXMgc2Vjb25kYXJ5LCB3ZSBzaG91bGQgdXNlOgorICAgICAgICAgICAgbW9kcHJvYmUgdmlhZmIgdmlhZmJfYWN0aXZlX2Rldj1EVkkrQ1JUIHZpYWZiX1NBTU1fT049MS4uLgorCisgICAgdmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQ6CisgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBkaXNwbGF5IGhhcmR3YXJlIGxheW91dCBmb3IgQ1g3MDAgY2hpcC4KKyAgICAgICAgMSA6IExDRCBvbmx5CisgICAgICAgIDIgOiBEVkkgb25seQorICAgICAgICAzIDogTENEK0RWSSAoZGVmYXVsdCkKKyAgICAgICAgNCA6IExDRDErTENEMiAoaW50ZXJuYWwgKyBpbnRlcm5hbCkKKyAgICAgICAgMTY6IExDRDErRXh0ZXJuYWxMQ0QyIChpbnRlcm5hbCArIGV4dGVybmFsKQorCisgICAgdmlhZmJfc2Vjb25kX3NpemU6CisgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHNlY29uZCBkZXZpY2UgbWVtb3J5IHNpemUoTUIpIGluIFNBTU0gY2FzZS4KKyAgICAgICAgVGhlIG1pbmltYWwgc2l6ZSBpcyAxNi4KKworICAgIHZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpOgorICAgICAgICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSBEVkkgb24gRVBJQSAtIE0KKyAgICAgICAgMCA6IE5vIERWSSBvbiBFUElBIC0gTSAoZGVmYXVsdCkKKyAgICAgICAgMSA6IERWSSBvbiBFUElBIC0gTQorCisgICAgdmlhZmJfYnVzX3dpZHRoOgorICAgICAgICBXaGVuIHVzaW5nIDI0IC0gQml0IEJ1cyBXaWR0aCBEaWdpdGFsIEludGVyZmFjZSwKKyAgICAgICAgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNldC4KKyAgICAgICAgMTI6IDEyLUJpdCBMVkRTIG9yIDEyLUJpdCBUTURTIChkZWZhdWx0KQorICAgICAgICAyNDogMjQtQml0IExWRFMgb3IgMjQtQml0IFRNRFMKKworICAgIHZpYWZiX2RldmljZV9sY2RfZHVhbGVkZ2U6CisgICAgICAgIFdoZW4gdXNpbmcgRHVhbCBFZGdlIFBhbmVsLCB0aGlzIG9wdGlvbiBzaG91bGQgYmUgc2V0LgorICAgICAgICAwIDogTm8gRHVhbCBFZGdlIFBhbmVsIChkZWZhdWx0KQorICAgICAgICAxIDogRHVhbCBFZGdlIFBhbmVsCisKKyAgICB2aWFmYl92aWRlb19kZXY6CisgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB2aWRlbyBvdXRwdXQgZGV2aWNlcyhDUlQsIERWSSwgTENEKSBmb3IKKyAgICAgICAgZHVvdmlldyBjYXNlLgorICAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgVG8gb3V0cHV0IHZpZGVvIG9uIERWSSwgd2Ugc2hvdWxkIHVzZToKKyAgICAgICAgICAgIG1vZHByb2JlIHZpYWZiIHZpYWZiX3ZpZGVvX2Rldj1EVkkuLi4KKworICAgIHZpYWZiX2xjZF9wb3J0OgorICAgICAgICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgTENEIG91dHB1dCBwb3J0LAorICAgICAgICBhdmFpbGFibGUgdmFsdWVzIGFyZSAiRFZQMCIgIkRWUDEiICJERlBfSElHSExPVyIgIkRGUF9ISUdIIiAiREZQX0xPVyIuCisgICAgICAgIGZvciBleHRlcm5hbCBMQ0QgKyBleHRlcm5hbCBEVkkgb24gQ1g3MDAoRXh0ZXJuYWwgTENEIGlzIG9uIERWUDApLAorICAgICAgICB3ZSBzaG91bGQgdXNlOgorICAgICAgICAgICAgbW9kcHJvYmUgdmlhZmIgdmlhZmJfbGNkX3BvcnQ9RFZQMC4uLgorCitOb3RlczoKKyAgICAxLiBDUlQgbWF5IG5vdCBkaXNwbGF5IHByb3Blcmx5IGZvciBEdW9WaWV3IENSVCAmIERWSSBkaXNwbGF5IGF0CisgICAgICAgdGhlICI2NDB4NDgwIiBQQUwgbW9kZSB3aXRoIERWSSBvdmVyc2NhbiBlbmFibGVkLgorICAgIDIuIFNBTU0gc3RhbmRzIGZvciBzaW5nbGUgYWRhcHRlciBtdWx0aSBtb25pdG9ycy4gSXQgaXMgZGlmZmVyZW50IGZyb20KKyAgICAgICBtdWx0aS1oZWFkIHNpbmNlIFNBTU0gc3VwcG9ydCBtdWx0aSBtb25pdG9yIGF0IGRyaXZlciBsYXllcnMsIHRodXMgZmJjb24KKyAgICAgICBsYXllciBkb2Vzbid0IGV2ZW4ga25vdyBhYm91dCBpdDsgU0FNTSdzIHNlY29uZCBzY3JlZW4gZG9lc24ndCBoYXZlIGEKKyAgICAgICBkZXZpY2Ugbm9kZSBmaWxlLCB0aHVzIGEgdXNlciBtb2RlIGFwcGxpY2F0aW9uIGNhbid0IGFjY2VzcyBpdCBkaXJlY3RseS4KKyAgICAgICBXaGVuIFNBTU0gaXMgZW5hYmxlZCwgdmlhZmJfbW9kZSBhbmQgdmlhZmJfbW9kZTEsIHZpYWZiX2JwcCBhbmQKKyAgICAgICB2aWFmYl9icHAxLCB2aWFmYl9yZWZyZXNoIGFuZCB2aWFmYl9yZWZyZXNoMSBjYW4gYmUgZGlmZmVyZW50LgorICAgIDMuIFdoZW4gY29uc29sZSBpcyBkZXBlbmRpbmcgb24gdmlhZmJpbmZvMSwgZHluYW1pY2FsbHkgY2hhbmdlIHJlc29sdXRpb24KKyAgICAgICBhbmQgYnBwLCBuZWVkIHRvIGNhbGwgVklBRkIgc3BlY2lmaWVkIGlvY3RsIGludGVyZmFjZSBWSUFGQl9TRVRfREVWSUNFCisgICAgICAgaW5zdGVhZCBvZiBjYWxsaW5nIGNvbW1vbiBpb2N0bCBmdW5jdGlvbiBGQklPUFVUX1ZTQ1JFRU5JTkZPIHNpbmNlCisgICAgICAgdmlhZmIgZG9lc24ndCBzdXBwb3J0IG11bHRpLWhlYWQgd2VsbCwgb3IgaXQgd2lsbCBjYXVzZSBzY3JlZW4gY3J1c2guCisgICAgNC4gVlg4MDAgMkQgYWNjZWxlcmF0b3IgaGFzbid0IGJlZW4gc3VwcG9ydGVkIGluIHRoaXMgZHJpdmVyIHlldC4gV2hlbgorICAgICAgIHVzaW5nIGRyaXZlciBvbiBWWDgwMCwgdGhlIGRyaXZlciB3aWxsIGRpc2FibGUgdGhlIGFjY2VsZXJhdGlvbgorICAgICAgIGZ1bmN0aW9uIGFzIGRlZmF1bHQuCisKKworW0NvbmZpZ3VyZSB2aWFmYiB3aXRoICJmYnNldCIgdG9vbF0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgImZic2V0IiBpcyBhbiBpbmJveCB1dGlsaXR5IG9mIExpbnV4LgorICAgIDEuIElucXVpcmUgY3VycmVudCB2aWFmYiBpbmZvcm1hdGlvbiwgdHlwZSwKKyAgICAgICAgICAgIyBmYnNldCAtaQorCisgICAgMi4gU2V0IHZhcmlvdXMgcmVzb2x1dGlvbnMgYW5kIHZpYWZiX3JlZnJlc2ggcmF0ZXMsCisgICAgICAgICAgICMgZmJzZXQgPHJlc29sdXRpb24tdmVydGljYWxfc3luYz4KKworICAgICAgIGV4YW1wbGUsCisgICAgICAgICAgICMgZmJzZXQgIjEwMjR4NzY4LTc1IgorICAgICAgIG9yCisgICAgICAgICAgICMgZmJzZXQgLWcgMTAyNCA3NjggMTAyNCA3NjggMzIKKyAgICAgICBDaGVjayB0aGUgZmlsZSAiL2V0Yy9mYi5tb2RlcyIgdG8gZmluZCBkaXNwbGF5IG1vZGVzIGF2YWlsYWJsZS4KKworICAgIDMuIFNldCB0aGUgY29sb3IgZGVwdGgsCisgICAgICAgICAgICMgZmJzZXQgLWRlcHRoIDx2YWx1ZT4KKworICAgICAgIGV4YW1wbGUsCisgICAgICAgICAgICMgZmJzZXQgLWRlcHRoIDE2CisKK1tCb290dXAgd2l0aCB2aWFmYl06CistLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8geW91ciBncnViLmNvbmY6CisgICAgYXBwZW5kID0gInZpZGVvPXZpYWZiOnZpYWZiX21vZGU9MTAyNHg3NjgsdmlhZmJfYnBwPTMyLHZpYWZiX3JlZnJlc2g9ODUiCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBlYjFhNDdiLi5mNWY4MTJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC02LDYgKzYsMjQgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CW9sZCBzdGF0aWMgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBhbmQgaWVlZTgwMjExX3JlZ2RvbSBtb2R1bGUgcGFyYW1ldGVyCitXaGVuOgkyLjYuMjkKK1doeToJVGhlIG9sZCByZWd1bGF0b3J5IGluZnJhc3RydWN0dXJlIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBuZXcgb25lCisJd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBzdGF0aWNhbGx5IGRlZmluZWQgcmVndWxhdG9yeSBkb21haW5zLiBXZSBkbworCW5vdCB3YW50IHRvIGtlZXAgc3RhdGljIHJlZ3VsYXRvcnkgZG9tYWlucyBpbiB0aGUga2VybmVsIGR1ZSB0byB0aGUKKwl0aGUgZHluYW1pYyBuYXR1cmUgb2YgcmVndWxhdG9yeSBsYXcgYW5kIGxvY2FsaXphdGlvbi4gV2Uga2VwdCBhcm91bmQKKwl0aGUgb2xkIHN0YXRpYyBkZWZpbml0aW9ucyBmb3IgdGhlIHJlZ3VsYXRvcnkgZG9tYWlucyBvZjoKKwkJKiBVUworCQkqIEpQCisJCSogRVUKKwlhbmQgdXNlZCBieSBkZWZhdWx0IHRoZSBVUyB3aGVuIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSB3YXMKKwlzZXQuIFdlIGFsc28ga2VwdCBhcm91bmQgdGhlIGllZWU4MDIxMV9yZWdkb20gbW9kdWxlIHBhcmFtZXRlciBpbiBjYXNlCisJc29tZSBhcHBsaWNhdGlvbnMgd2VyZSByZWx5aW5nIG9uIGl0LiBDaGFuZ2luZyByZWd1bGF0b3J5IGRvbWFpbnMKKwljYW4gbm93IGJlIGRvbmUgaW5zdGVhZCBieSB1c2luZyBubDgwMjExLCBhcyBpcyBkb25lIHdpdGggaXcuCitXaG86CUx1aXMgUi4gUm9kcmlndWV6IDxscm9kcmlndWV6QGF0aGVyb3MuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZQogV2hlbjoJSnVseSAyMDA3CiBXaHk6CUJyb2tlbiBkZXNpZ24gZm9yIHJ1bnRpbWUgY29udHJvbCBvdmVyIGRyaXZlciBwb3dlciBzdGF0ZXMsIGNvbmZ1c2luZwpAQCAtMjMyLDYgKzI1MCw5IEBACiAJLSB4dF9tYXJrIG1hdGNoIHJldmlzaW9uIDAKIAkgIChzdXBlcnNlZGVkIGJ5IHh0X21hcmsgbWF0Y2ggcmV2aXNpb24gMSkKIAorCS0geHRfcmVjZW50OiB0aGUgb2xkIGlwdF9yZWNlbnQgcHJvYyBkaXIKKwkgIChzdXBlcnNlZGVkIGJ5IC9wcm9jL25ldC94dF9yZWNlbnQpCisKIFdoZW46CUphbnVhcnkgMjAwOSBvciBMaW51eCAyLjcuMCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0CiBXaHk6CVN1cGVyc2VkZWQgYnkgbmV3ZXIgcmV2aXNpb25zIG9yIG1vZHVsZXMKIFdobzoJSmFuIEVuZ2VsaGFyZHQgPGplbmdlbGhAY29tcHV0ZXJnbWJoLmRlPgpAQCAtMjY2LDExICsyODcsMTkgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CW9sZCBzdHlsZSBzZXJpYWwgZHJpdmVyIGZvciBDb2xkRmlyZSAoQ09ORklHX1NFUklBTF9DT0xERklSRSkKLVdoZW46CTIuNi4yOAotV2h5OglUaGlzIGRyaXZlciBzdGlsbCB1c2VzIHRoZSBvbGQgaW50ZXJmYWNlIGFuZCBoYXMgYmVlbiByZXBsYWNlZAotCWJ5IENPTkZJR19TRVJJQUxfTUNGLgotV2hvOglTZWJhc3RpYW4gU2lld2lvciA8c2ViYXN0aWFuQGJyZWFrcG9pbnQuY2M+CitXaGF0OglyZW1vdmUgSElEIGNvbXBhdCBzdXBwb3J0CitXaGVuOgkyLjYuMjkKK1doeToJbmVlZGVkIG9ubHkgYXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdW50aWwgZGlzdHJvcyBmaXggdGhlbXNlbHZlcyB1cAorV2hvOglKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDogcHJpbnRfZm5fZGVzY3JpcHRvcl9zeW1ib2woKQorV2hlbjogT2N0b2JlciAyMDA5CitXaHk6ICBUaGUgJXBGIHZzcHJpbnRmIGZvcm1hdCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGluIGEKKyAgICAgIHNpbXBsZXIgd2F5LiAgcHJpbnRfZm5fZGVzY3JpcHRvcl9zeW1ib2woKSBpcyBkZXByZWNhdGVkIGJ1dAorICAgICAgc3RpbGwgcHJlc2VudCB0byBnaXZlIG91dC1vZi10cmVlIG1vZHVsZXMgdGltZSB0byBjaGFuZ2UuCitXaG86ICBCam9ybiBIZWxnYWFzIDxiam9ybi5oZWxnYWFzQGhwLmNvbT4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMyMiwzICszNTEsMTEgQEAKICAgICAgIGNvbnRyb2xsZWQgYnkgYSBrZXJuZWwvbW9kdWxlL3N5c2ZzL3N5c2N0bCBwYXJhbWV0ZXIuCiBXaG86ICBLcnp5c3p0b2YgUGlvdHIgT2xlZHpraSA8b2xlQGFucy5wbD4KIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6IGlkZS1zY3NpIChCTEtfREVWX0lERVNDU0kpCitXaGVuOiAyLjYuMjkKK1doeTogIFRoZSAyLjYga2VybmVsIHN1cHBvcnRzIGRpcmVjdCB3cml0aW5nIHRvIGlkZSBDRCBkcml2ZXMsIHdoaWNoCisgICAgICBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBpZGUtc2NzaS4gVGhlIG5ldyBtZXRob2QgaXMgbW9yZQorICAgICAgZWZmaWNpZW50IGluIGV2ZXJ5IHdheS4KK1dobzogIEZVSklUQSBUb21vbm9yaSA8ZnVqaXRhLnRvbW9ub3JpQGxhYi5udHQuY28uanA+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKaW5kZXggNjgwZmI1Ni4uODM2Mjg2MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwpAQCAtMTQ0LDggKzE0NCw4IEBACiAJdm9pZCAoKmtpbGxfc2IpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBsb2NraW5nIHJ1bGVzOgogCQltYXkgYmxvY2sJQktMCi1nZXRfc2IJCXllcwkJeWVzCi1raWxsX3NiCQl5ZXMJCXllcworZ2V0X3NiCQl5ZXMJCW5vCitraWxsX3NiCQl5ZXMJCW5vCiAKIC0+Z2V0X3NiKCkgcmV0dXJucyBlcnJvciBvciAwIHdpdGggbG9ja2VkIHN1cGVyYmxvY2sgYXR0YWNoZWQgdG8gdGhlIHZmc21vdW50CiAoZXhjbHVzaXZlIG9uIC0+c191bW91bnQpLgpAQCAtNDA5LDEyICs0MDksMTIgQEAKIHVubG9ja2VkX2lvY3RsOgkJbm8JKHNlZSBiZWxvdykKIGNvbXBhdF9pb2N0bDoJCW5vCiBtbWFwOgkJCW5vCi1vcGVuOgkJCW1heWJlCShzZWUgYmVsb3cpCitvcGVuOgkJCW5vCiBmbHVzaDoJCQlubwogcmVsZWFzZToJCW5vCiBmc3luYzoJCQlubwkoc2VlIGJlbG93KQogYWlvX2ZzeW5jOgkJbm8KLWZhc3luYzoJCQl5ZXMJKHNlZSBiZWxvdykKK2Zhc3luYzoJCQlubwogbG9jazoJCQl5ZXMKIHJlYWR2OgkJCW5vCiB3cml0ZXY6CQkJbm8KQEAgLTQzMSwxMyArNDMxLDYgQEAKIHNlbWFwaG9yZS4gIE5vdGUgc29tZSBmaWxlc3lzdGVtcyAoaS5lLiByZW1vdGUgb25lcykgcHJvdmlkZSBubwogcHJvdGVjdGlvbiBmb3IgaV9zaXplIHNvIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBCS0wuCiAKLS0+b3BlbigpIGxvY2tpbmcgaXMgaW4tdHJhbnNpdDogYmlnIGxvY2sgcGFydGlhbGx5IG1vdmVkIGludG8gdGhlIG1ldGhvZHMuCi1UaGUgb25seSBleGNlcHRpb24gaXMgLT5vcGVuKCkgaW4gdGhlIGluc3RhbmNlcyBvZiBmaWxlX29wZXJhdGlvbnMgdGhhdCBuZXZlcgotZW5kIHVwIGluIC0+aV9mb3AvLT5wcm9jX2ZvcHMsIGkuZS4gb25lcyB0aGF0IGJlbG9uZyB0byBjaGFyYWN0ZXIgZGV2aWNlcwotKGNocmRldl9vcGVuKCkgdGFrZXMgbG9jayBiZWZvcmUgcmVwbGFjaW5nIC0+Zl9vcCBhbmQgY2FsbGluZyB0aGUgc2Vjb25kYXJ5Ci1tZXRob2QuIEFzIHNvb24gYXMgd2UgZml4IHRoZSBoYW5kbGluZyBvZiBtb2R1bGUgcmVmZXJlbmNlIGNvdW50ZXJzIGFsbAotaW5zdGFuY2VzIG9mIC0+b3BlbigpIHdpbGwgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIEJLTC4KLQogTm90ZTogZXh0Ml9yZWxlYXNlKCkgd2FzICp0aGUqIHNvdXJjZSBvZiBjb250ZW50aW9uIG9uIGZzLWludGVuc2l2ZQogbG9hZHMgYW5kIGRyb3BwaW5nIEJLTCBvbiAtPnJlbGVhc2UoKSBoZWxwcyB0byBnZXQgcmlkIG9mIHRoYXQgKHdlIHN0aWxsCiBncmFiIEJLTCBmb3IgY2FzZXMgd2hlbiB3ZSBjbG9zZSBhIGZpbGUgdGhhdCBoYWQgYmVlbiBvcGVuZWQgci93LCBidXQgdGhhdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hdXRvZnM0LW1vdW50LWNvbnRyb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hdXRvZnM0LW1vdW50LWNvbnRyb2wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzQxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2F1dG9mczQtbW91bnQtY29udHJvbC50eHQKQEAgLTAsMCArMSwzOTMgQEAKKworTWlzY2VsbGFuZW91cyBEZXZpY2UgY29udHJvbCBvcGVyYXRpb25zIGZvciB0aGUgYXV0b2ZzNCBrZXJuZWwgbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgcHJvYmxlbQorPT09PT09PT09PT0KKworVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggYWN0aXZlIHJlc3RhcnRzIGluIGF1dG9mcyAodGhhdCBpcyB0byBzYXkKK3Jlc3RhcnRpbmcgYXV0b2ZzIHdoZW4gdGhlcmUgYXJlIGJ1c3kgbW91bnRzKS4KKworRHVyaW5nIG5vcm1hbCBvcGVyYXRpb24gYXV0b2ZzIHVzZXMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbmVkIG9uIHRoZQorZGlyZWN0b3J5IHRoYXQgaXMgYmVpbmcgbWFuYWdlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGlzc3VlIGNvbnRyb2wKK29wZXJhdGlvbnMuIFVzaW5nIGEgZmlsZSBkZXNjcmlwdG9yIGdpdmVzIGlvY3RsIG9wZXJhdGlvbnMgYWNjZXNzIHRvCithdXRvZnMgc3BlY2lmaWMgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBzdXBlciBibG9jay4gVGhlIG9wZXJhdGlvbnMKK2FyZSB0aGluZ3Mgc3VjaCBhcyBzZXR0aW5nIGFuIGF1dG9mcyBtb3VudCBjYXRhdG9uaWMsIHNldHRpbmcgdGhlCitleHBpcmUgdGltZW91dCBhbmQgcmVxdWVzdGluZyBleHBpcmUgY2hlY2tzLiBBcyBpcyBleHBsYWluZWQgYmVsb3csCitjZXJ0YWluIHR5cGVzIG9mIGF1dG9mcyB0cmlnZ2VyZWQgbW91bnRzIGNhbiBlbmQgdXAgY292ZXJpbmcgYW4gYXV0b2ZzCittb3VudCBpdHNlbGYgd2hpY2ggcHJldmVudHMgdXMgYmVpbmcgYWJsZSB0byB1c2Ugb3BlbigyKSB0byBvYnRhaW4gYQorZmlsZSBkZXNjcmlwdG9yIGZvciB0aGVzZSBvcGVyYXRpb25zIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUgb3Blbi4KKworQ3VycmVudGx5IGF1dG9mcyB1c2VzICJ1bW91bnQgLWwiIChsYXp5IHVtb3VudCkgdG8gY2xlYXIgYWN0aXZlIG1vdW50cworYXQgcmVzdGFydC4gV2hpbGUgdXNpbmcgbGF6eSB1bW91bnQgd29ya3MgZm9yIG1vc3QgY2FzZXMsIGFueXRoaW5nIHRoYXQKK25lZWRzIHRvIHdhbGsgYmFjayB1cCB0aGUgbW91bnQgdHJlZSB0byBjb25zdHJ1Y3QgYSBwYXRoLCBzdWNoIGFzCitnZXRjd2QoMikgYW5kIHRoZSBwcm9jIGZpbGUgc3lzdGVtIC9wcm9jLzxwaWQ+L2N3ZCwgbm8gbG9uZ2VyIHdvcmtzCitiZWNhdXNlIHRoZSBwb2ludCBmcm9tIHdoaWNoIHRoZSBwYXRoIGlzIGNvbnN0cnVjdGVkIGhhcyBiZWVuIGRldGFjaGVkCitmcm9tIHRoZSBtb3VudCB0cmVlLgorCitUaGUgYWN0dWFsIHByb2JsZW0gd2l0aCBhdXRvZnMgaXMgdGhhdCBpdCBjYW4ndCByZWNvbm5lY3QgdG8gZXhpc3RpbmcKK21vdW50cy4gSW1tZWRpYXRlbHkgb25lIHRoaW5rcyBvZiBqdXN0IGFkZGluZyB0aGUgYWJpbGl0eSB0byByZW1vdW50CithdXRvZnMgZmlsZSBzeXN0ZW1zIHdvdWxkIHNvbHZlIGl0LCBidXQgYWxhcywgdGhhdCBjYW4ndCB3b3JrLiBUaGlzIGlzCitiZWNhdXNlIGF1dG9mcyBkaXJlY3QgbW91bnRzIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgIm9uIGRlbWFuZCBtb3VudAorYW5kIGV4cGlyZSIgb2YgbmVzdGVkIG1vdW50IHRyZWVzIGhhdmUgdGhlIGZpbGUgc3lzdGVtIG1vdW50ZWQgZGlyZWN0bHkKK29uIHRvcCBvZiB0aGUgbW91bnQgdHJpZ2dlciBkaXJlY3RvcnkgZGVudHJ5LgorCitGb3IgZXhhbXBsZSwgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhdXRvbW91bnQgbWFwcywgZGlyZWN0IChpbiB0aGUga2VybmVsCittb2R1bGUgc291cmNlIHlvdSB3aWxsIHNlZSBhIHRoaXJkIHR5cGUgY2FsbGVkIGFuIG9mZnNldCwgd2hpY2ggaXMganVzdAorYSBkaXJlY3QgbW91bnQgaW4gZGlzZ3Vpc2UpIGFuZCBpbmRpcmVjdC4KKworSGVyZSBpcyBhIG1hc3RlciBtYXAgd2l0aCBkaXJlY3QgYW5kIGluZGlyZWN0IG1hcCBlbnRyaWVzOgorCisvLSAgICAgIC9ldGMvYXV0by5kaXJlY3QKKy90ZXN0ICAgL2V0Yy9hdXRvLmluZGlyZWN0CisKK2FuZCB0aGUgY29ycmVzcG9uZGluZyBtYXAgZmlsZXM6CisKKy9ldGMvYXV0by5kaXJlY3Q6CisKKy9hdXRvbW91bnQvZHBhcnNlL2c2ICBidWRnaWU6L2F1dG9mcy9leHBvcnQxCisvYXV0b21vdW50L2RwYXJzZS9nMSAgc2hhcms6L2F1dG9mcy9leHBvcnQxCithbmQgc28gb24uCisKKy9ldGMvYXV0by5pbmRpcmVjdDoKKworZzEgICAgc2hhcms6L2F1dG9mcy9leHBvcnQxCitnNiAgICBidWRnaWU6L2F1dG9mcy9leHBvcnQxCithbmQgc28gb24uCisKK0ZvciB0aGUgYWJvdmUgaW5kaXJlY3QgbWFwIGFuIGF1dG9mcyBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIG9uIC90ZXN0IGFuZAorbW91bnRzIGFyZSB0cmlnZ2VyZWQgZm9yIGVhY2ggc3ViLWRpcmVjdG9yeSBrZXkgYnkgdGhlIGlub2RlIGxvb2t1cAorb3BlcmF0aW9uLiBTbyB3ZSBzZWUgYSBtb3VudCBvZiBzaGFyazovYXV0b2ZzL2V4cG9ydDEgb24gL3Rlc3QvZzEsIGZvcgorZXhhbXBsZS4KKworVGhlIHdheSB0aGF0IGRpcmVjdCBtb3VudHMgYXJlIGhhbmRsZWQgaXMgYnkgbWFraW5nIGFuIGF1dG9mcyBtb3VudCBvbgorZWFjaCBmdWxsIHBhdGgsIHN1Y2ggYXMgL2F1dG9tb3VudC9kcGFyc2UvZzEsIGFuZCB1c2luZyBpdCBhcyBhIG1vdW50Cit0cmlnZ2VyLiBTbyB3aGVuIHdlIHdhbGsgb24gdGhlIHBhdGggd2UgbW91bnQgc2hhcms6L2F1dG9mcy9leHBvcnQxICJvbgordG9wIG9mIHRoaXMgbW91bnQgcG9pbnQiLiBTaW5jZSB0aGVzZSBhcmUgYWx3YXlzIGRpcmVjdG9yaWVzIHdlIGNhbgordXNlIHRoZSBmb2xsb3dfbGluayBpbm9kZSBvcGVyYXRpb24gdG8gdHJpZ2dlciB0aGUgbW91bnQuCisKK0J1dCwgZWFjaCBlbnRyeSBpbiBkaXJlY3QgYW5kIGluZGlyZWN0IG1hcHMgY2FuIGhhdmUgb2Zmc2V0cyAobWFraW5nCit0aGVtIG11bHRpLW1vdW50IG1hcCBlbnRyaWVzKS4KKworRm9yIGV4YW1wbGUsIGFuIGluZGlyZWN0IG1vdW50IG1hcCBlbnRyeSBjb3VsZCBhbHNvIGJlOgorCitnMSAgXAorICAgLyAgICAgICAgc2hhcms6L2F1dG9mcy9leHBvcnQ1L3Rlc3RpbmcvdGVzdCBcCisgICAvczEgICAgICBzaGFyazovYXV0b2ZzL2V4cG9ydC90ZXN0aW5nL3Rlc3QvczEgXAorICAgL3MyICAgICAgc2hhcms6L2F1dG9mcy9leHBvcnQ1L3Rlc3RpbmcvdGVzdC9zMiBcCisgICAvczEvc3MxICBzaGFyazovYXV0b2ZzL2V4cG9ydDEgXAorICAgL3MyL3NzMiAgc2hhcms6L2F1dG9mcy9leHBvcnQyCisKK2FuZCBhIHNpbWlsYXJseSBhIGRpcmVjdCBtb3VudCBtYXAgZW50cnkgY291bGQgYWxzbyBiZToKKworL2F1dG9tb3VudC9kcGFyc2UvZzEgXAorICAgIC8gICAgICAgc2hhcms6L2F1dG9mcy9leHBvcnQ1L3Rlc3RpbmcvdGVzdCBcCisgICAgL3MxICAgICBzaGFyazovYXV0b2ZzL2V4cG9ydC90ZXN0aW5nL3Rlc3QvczEgXAorICAgIC9zMiAgICAgc2hhcms6L2F1dG9mcy9leHBvcnQ1L3Rlc3RpbmcvdGVzdC9zMiBcCisgICAgL3MxL3NzMSBzaGFyazovYXV0b2ZzL2V4cG9ydDIgXAorICAgIC9zMi9zczIgc2hhcms6L2F1dG9mcy9leHBvcnQyCisKK09uZSBvZiB0aGUgaXNzdWVzIHdpdGggdmVyc2lvbiA0IG9mIGF1dG9mcyB3YXMgdGhhdCwgd2hlbiBtb3VudGluZyBhbgorZW50cnkgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBvZmZzZXRzLCBwb3NzaWJseSB3aXRoIG5lc3RpbmcsIHdlIG5lZWRlZAordG8gbW91bnQgYW5kIHVtb3VudCBhbGwgb2YgdGhlIG9mZnNldHMgYXMgYSBzaW5nbGUgdW5pdC4gTm90IHJlYWxseSBhCitwcm9ibGVtLCBleGNlcHQgZm9yIHBlb3BsZSB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIG9mZnNldHMgaW4gbWFwIGVudHJpZXMuCitUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIGZvciB0aGUgd2VsbCBrbm93biAiaG9zdHMiIG1hcCBhbmQgd2UgaGF2ZSBzZWVuCitjYXNlcyAoaW4gMi40KSB3aGVyZSB0aGUgYXZhaWxhYmxlIG51bWJlciBvZiBtb3VudHMgYXJlIGV4aGF1c3RlZCBvcgord2hlcmUgdGhlIG51bWJlciBvZiBwcml2aWxlZ2VkIHBvcnRzIGF2YWlsYWJsZSBpcyBleGhhdXN0ZWQuCisKK0luIHZlcnNpb24gNSB3ZSBtb3VudCBvbmx5IGFzIHdlIGdvIGRvd24gdGhlIHRyZWUgb2Ygb2Zmc2V0cyBhbmQKK3NpbWlsYXJseSBmb3IgZXhwaXJpbmcgdGhlbSB3aGljaCByZXNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbS4gVGhlcmUgaXMKK3NvbWV3aGF0IG1vcmUgZGV0YWlsIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBidXQgaXQgaXNuJ3QgbmVlZGVkIGZvciB0aGUKK3Nha2Ugb2YgdGhlIHByb2JsZW0gZXhwbGFuYXRpb24uIFRoZSBvbmUgaW1wb3J0YW50IGRldGFpbCBpcyB0aGF0IHRoZXNlCitvZmZzZXRzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIGRpcmVjdCBtb3VudHMKK2Fib3ZlIGFuZCBzbyB0aGUgbW91bnQgcG9pbnRzIGNhbiBiZSBjb3ZlcmVkIGJ5IGEgbW91bnQuCisKK1RoZSBjdXJyZW50IGF1dG9mcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlvY3RsIGZpbGUgZGVzY3JpcHRvciBvcGVuZWQKK29uIHRoZSBtb3VudCBwb2ludCBmb3IgY29udHJvbCBvcGVyYXRpb25zLiBUaGUgcmVmZXJlbmNlcyBoZWxkIGJ5IHRoZQorZGVzY3JpcHRvciBhcmUgYWNjb3VudGVkIGZvciBpbiBjaGVja3MgbWFkZSB0byBkZXRlcm1pbmUgaWYgYSBtb3VudCBpcworaW4gdXNlIGFuZCBpcyBhbHNvIHVzZWQgdG8gYWNjZXNzIGF1dG9mcyBmaWxlIHN5c3RlbSBpbmZvcm1hdGlvbiBoZWxkCitpbiB0aGUgbW91bnQgc3VwZXIgYmxvY2suIFNvIHRoZSB1c2Ugb2YgYSBmaWxlIGhhbmRsZSBuZWVkcyB0byBiZQorcmV0YWluZWQuCisKKworVGhlIFNvbHV0aW9uCis9PT09PT09PT09PT0KKworVG8gYmUgYWJsZSB0byByZXN0YXJ0IGF1dG9mcyBsZWF2aW5nIGV4aXN0aW5nIGRpcmVjdCwgaW5kaXJlY3QgYW5kCitvZmZzZXQgbW91bnRzIGluIHBsYWNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBvYnRhaW4gYSBmaWxlIGhhbmRsZQorZm9yIHRoZXNlIHBvdGVudGlhbGx5IGNvdmVyZWQgYXV0b2ZzIG1vdW50IHBvaW50cy4gUmF0aGVyIHRoYW4ganVzdAoraW1wbGVtZW50IGFuIGlzb2xhdGVkIG9wZXJhdGlvbiBpdCB3YXMgZGVjaWRlZCB0byByZS1pbXBsZW1lbnQgdGhlCitleGlzdGluZyBpb2N0bCBpbnRlcmZhY2UgYW5kIGFkZCBuZXcgb3BlcmF0aW9ucyB0byBwcm92aWRlIHRoaXMKK2Z1bmN0aW9uYWxpdHkuCisKK0luIGFkZGl0aW9uLCB0byBiZSBhYmxlIHRvIHJlY29uc3RydWN0IGEgbW91bnQgdHJlZSB0aGF0IGhhcyBidXN5IG1vdW50cywKK3RoZSB1aWQgYW5kIGdpZCBvZiB0aGUgbGFzdCB1c2VyIHRoYXQgdHJpZ2dlcmVkIHRoZSBtb3VudCBuZWVkcyB0byBiZQorYXZhaWxhYmxlIGJlY2F1c2UgdGhlc2UgY2FuIGJlIHVzZWQgYXMgbWFjcm8gc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbgorYXV0b2ZzIG1hcHMuIFRoZXkgYXJlIHJlY29yZGVkIGF0IG1vdW50IHJlcXVlc3QgdGltZSBhbmQgYW4gb3BlcmF0aW9uCitoYXMgYmVlbiBhZGRlZCB0byByZXRyaWV2ZSB0aGVtLgorCitTaW5jZSB3ZSdyZSByZS1pbXBsZW1lbnRpbmcgdGhlIGNvbnRyb2wgaW50ZXJmYWNlLCBhIGNvdXBsZSBvZiBvdGhlcgorcHJvYmxlbXMgd2l0aCB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlIGhhdmUgYmVlbiBhZGRyZXNzZWQuIEZpcnN0LCB3aGVuCithIG1vdW50IG9yIGV4cGlyZSBvcGVyYXRpb24gY29tcGxldGVzIGEgc3RhdHVzIGlzIHJldHVybmVkIHRvIHRoZQora2VybmVsIGJ5IGVpdGhlciBhICJzZW5kIHJlYWR5IiBvciBhICJzZW5kIGZhaWwiIG9wZXJhdGlvbi4gVGhlCisic2VuZCBmYWlsIiBvcGVyYXRpb24gb2YgdGhlIGlvY3RsIGludGVyZmFjZSBjb3VsZCBvbmx5IGV2ZXIgc2VuZAorRU5PRU5UIHNvIHRoZSByZS1pbXBsZW1lbnRhdGlvbiBhbGxvd3MgdXNlciBzcGFjZSB0byBzZW5kIGFuIGFjdHVhbAorc3RhdHVzLiBBbm90aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb24gaW4gdXNlciBzcGFjZSwgZm9yIHRob3NlIHVzaW5nCit2ZXJ5IGxhcmdlIG1hcHMsIGlzIGRpc2NvdmVyaW5nIGlmIGEgbW91bnQgaXMgcHJlc2VudC4gVXN1YWxseSB0aGlzCitpbnZvbHZlcyBzY2FubmluZyAvcHJvYy9tb3VudHMgYW5kIHNpbmNlIGl0IG5lZWRzIHRvIGJlIGRvbmUgcXVpdGUKK29mdGVuIGl0IGNhbiBpbnRyb2R1Y2Ugc2lnbmlmaWNhbnQgb3ZlcmhlYWQgd2hlbiB0aGVyZSBhcmUgbWFueSBlbnRyaWVzCitpbiB0aGUgbW91bnQgdGFibGUuIEFuIG9wZXJhdGlvbiB0byBsb29rdXAgdGhlIG1vdW50IHN0YXR1cyBvZiBhIG1vdW50Citwb2ludCBkZW50cnkgKGNvdmVyZWQgb3Igbm90KSBoYXMgYWxzbyBiZWVuIGFkZGVkLgorCitDdXJyZW50IGtlcm5lbCBkZXZlbG9wbWVudCBwb2xpY3kgcmVjb21tZW5kcyBhdm9pZGluZyB0aGUgdXNlIG9mIHRoZQoraW9jdGwgbWVjaGFuaXNtIGluIGZhdm9yIG9mIHN5c3RlbXMgc3VjaCBhcyBOZXRsaW5rLiBBbiBpbXBsZW1lbnRhdGlvbgordXNpbmcgdGhpcyBzeXN0ZW0gd2FzIGF0dGVtcHRlZCB0byBldmFsdWF0ZSBpdHMgc3VpdGFiaWxpdHkgYW5kIGl0IHdhcworZm91bmQgdG8gYmUgaW5hZGVxdWF0ZSwgaW4gdGhpcyBjYXNlLiBUaGUgR2VuZXJpYyBOZXRsaW5rIHN5c3RlbSB3YXMKK3VzZWQgZm9yIHRoaXMgYXMgcmF3IE5ldGxpbmsgd291bGQgbGVhZCB0byBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluCitjb21wbGV4aXR5LiBUaGVyZSdzIG5vIHF1ZXN0aW9uIHRoYXQgdGhlIEdlbmVyaWMgTmV0bGluayBzeXN0ZW0gaXMgYW4KK2VsZWdhbnQgc29sdXRpb24gZm9yIGNvbW1vbiBjYXNlIGlvY3RsIGZ1bmN0aW9ucyBidXQgaXQncyBub3QgYSBjb21wbGV0ZQorcmVwbGFjZW1lbnQgcHJvYmFibHkgYmVjYXVzZSBpdCdzIHByaW1hcnkgcHVycG9zZSBpbiBsaWZlIGlzIHRvIGJlIGEKK21lc3NhZ2UgYnVzIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHNwZWNpZmljYWxseSBhbiBpb2N0bCByZXBsYWNlbWVudC4KK1doaWxlIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kIHRoaXMgdGhlcmUgaXMgb25lIGNvbmNlcm4KK3RoYXQgbGVhZCB0byB0aGUgZGVjaXNpb24gdG8gbm90IHVzZSBpdC4gVGhpcyBpcyB0aGF0IHRoZSBhdXRvZnMKK2V4cGlyZSBpbiB0aGUgZGFlbW9uIGhhcyBiZWNvbWUgZmFyIHRvIGNvbXBsZXggYmVjYXVzZSB1bW91bnQKK2NhbmRpZGF0ZXMgYXJlIGVudW1lcmF0ZWQsIGFsbW9zdCBmb3Igbm8gb3RoZXIgcmVhc29uIHRoYW4gdG8gImNvdW50IgordGhlIG51bWJlciBvZiB0aW1lcyB0byBjYWxsIHRoZSBleHBpcmUgaW9jdGwuIFRoaXMgaW52b2x2ZXMgc2Nhbm5pbmcKK3RoZSBtb3VudCB0YWJsZSB3aGljaCBoYXMgcHJvdmVkIHRvIGJlIGEgYmlnIG92ZXJoZWFkIGZvciB1c2VycyB3aXRoCitsYXJnZSBtYXBzLiBUaGUgYmVzdCB3YXkgdG8gaW1wcm92ZSB0aGlzIGlzIHRyeSBhbmQgZ2V0IGJhY2sgdG8gdGhlCit3YXkgdGhlIGV4cGlyZSB3YXMgZG9uZSBsb25nIGFnby4gVGhhdCBpcywgd2hlbiBhbiBleHBpcmUgcmVxdWVzdCBpcworaXNzdWVkIGZvciBhIG1vdW50IChmaWxlIGhhbmRsZSkgd2Ugc2hvdWxkIGNvbnRpbnVhbGx5IGNhbGwgYmFjayB0bwordGhlIGRhZW1vbiB1bnRpbCB3ZSBjYW4ndCB1bW91bnQgYW55IG1vcmUgbW91bnRzLCB0aGVuIHJldHVybiB0aGUKK2FwcHJvcHJpYXRlIHN0YXR1cyB0byB0aGUgZGFlbW9uLiBBdCB0aGUgbW9tZW50IHdlIGp1c3QgZXhwaXJlIG9uZQorbW91bnQgYXQgYSB0aW1lLiBBIEdlbmVyaWMgTmV0bGluayBpbXBsZW1lbnRhdGlvbiB3b3VsZCBleGNsdWRlIHRoaXMKK3Bvc3NpYmlsaXR5IGZvciBmdXR1cmUgZGV2ZWxvcG1lbnQgZHVlIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlCittZXNzYWdlIGJ1cyBhcmNoaXRlY3R1cmUuCisKKworYXV0b2ZzNCBNaXNjZWxsYW5lb3VzIERldmljZSBtb3VudCBjb250cm9sIGludGVyZmFjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgY29udHJvbCBpbnRlcmZhY2UgaXMgb3BlbmluZyBhIGRldmljZSBub2RlLCB0eXBpY2FsbHkgL2Rldi9hdXRvZnMuCisKK0FsbCB0aGUgaW9jdGxzIHVzZSBhIGNvbW1vbiBzdHJ1Y3R1cmUgdG8gcGFzcyB0aGUgbmVlZGVkIHBhcmFtZXRlcgoraW5mb3JtYXRpb24gYW5kIHJldHVybiBvcGVyYXRpb24gcmVzdWx0czoKKworc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgeworCV9fdTMyIHZlcl9tYWpvcjsKKwlfX3UzMiB2ZXJfbWlub3I7CisJX191MzIgc2l6ZTsgICAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiBkYXRhIHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLworCV9fczMyIGlvY3RsZmQ7ICAgICAgICAgIC8qIGF1dG9tb3VudCBjb21tYW5kIGZkICovCisKKwlfX3UzMiBhcmcxOyAgICAgICAgICAgICAvKiBDb21tYW5kIHBhcmFtZXRlcnMgKi8KKwlfX3UzMiBhcmcyOworCisJY2hhciBwYXRoWzBdOworfTsKKworVGhlIGlvY3RsZmQgZmllbGQgaXMgYSBtb3VudCBwb2ludCBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gYXV0b2ZzIG1vdW50Citwb2ludC4gSXQgaXMgcmV0dXJuZWQgYnkgdGhlIG9wZW4gY2FsbCBhbmQgaXMgdXNlZCBieSBhbGwgY2FsbHMgZXhjZXB0Cit0aGUgY2hlY2sgZm9yIHdoZXRoZXIgYSBnaXZlbiBwYXRoIGlzIGEgbW91bnQgcG9pbnQsIHdoZXJlIGl0IG1heQorb3B0aW9uYWxseSBiZSB1c2VkIHRvIGNoZWNrIGEgc3BlY2lmaWMgbW91bnQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCittb3VudCBwb2ludCBmaWxlIGRlc2NyaXB0b3IsIGFuZCB3aGVuIHJlcXVlc3RpbmcgdGhlIHVpZCBhbmQgZ2lkIG9mIHRoZQorbGFzdCBzdWNjZXNzZnVsIG1vdW50IG9uIGEgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXV0b2ZzIGZpbGUgc3lzdGVtLgorCitUaGUgZmllbGRzIGFyZzEgYW5kIGFyZzIgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBvZgorY2FsbHMgbWFkZSBhcyBkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBwYXRoIGZpZWxkIGlzIHVzZWQgdG8gcGFzcyBhIHBhdGggd2hlcmUgaXQgaXMgbmVlZGVkIGFuZCB0aGUgc2l6ZSBmaWVsZAoraXMgdXNlZCBhY2NvdW50IGZvciB0aGUgaW5jcmVhc2VkIHN0cnVjdHVyZSBsZW5ndGggd2hlbiB0cmFuc2xhdGluZyB0aGUKK3N0cnVjdHVyZSBzZW50IGZyb20gdXNlciBzcGFjZS4KKworVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIGluaXRpYWxpemVkIGJlZm9yZSBzZXR0aW5nIHNwZWNpZmljIGZpZWxkcyBieSB1c2luZwordGhlIHZvaWQgZnVuY3Rpb24gY2FsbCBpbml0X2F1dG9mc19kZXZfaW9jdGwoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKikuCisKK0FsbCBvZiB0aGUgaW9jdGxzIHBlcmZvcm0gYSBjb3B5IG9mIHRoaXMgc3RydWN0dXJlIGZyb20gdXNlciBzcGFjZSB0bwora2VybmVsIHNwYWNlIGFuZCByZXR1cm4gLUVJTlZBTCBpZiB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuCit0aGUgc3RydWN0dXJlIHNpemUgaXRzZWxmLCAtRU5PTUVNIGlmIHRoZSBrZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMKK29yIC1FRkFVTFQgaWYgdGhlIGNvcHkgaXRzZWxmIGZhaWxzLiBPdGhlciBjaGVja3MgaW5jbHVkZSBhIHZlcnNpb24gY2hlY2sKK29mIHRoZSBjb21waWxlZCBpbiB1c2VyIHNwYWNlIHZlcnNpb24gYWdhaW5zdCB0aGUgbW9kdWxlIHZlcnNpb24gYW5kIGEKK21pc21hdGNoIHJlc3VsdHMgaW4gYSAtRUlOVkFMIHJldHVybi4gSWYgdGhlIHNpemUgZmllbGQgaXMgZ3JlYXRlciB0aGFuCit0aGUgc3RydWN0dXJlIHNpemUgdGhlbiBhIHBhdGggaXMgYXNzdW1lZCB0byBiZSBwcmVzZW50IGFuZCBpcyBjaGVja2VkIHRvCitlbnN1cmUgaXQgYmVnaW5zIHdpdGggYSAiLyIgYW5kIGlzIE5VTEwgdGVybWluYXRlZCwgb3RoZXJ3aXNlIC1FSU5WQUwgaXMKK3JldHVybmVkLiBGb2xsb3dpbmcgdGhlc2UgY2hlY2tzLCBmb3IgYWxsIGlvY3RsIGNvbW1hbmRzIGV4Y2VwdAorQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX0NNRCwgQVVUT0ZTX0RFVl9JT0NUTF9PUEVOTU9VTlRfQ01EIGFuZAorQVVUT0ZTX0RFVl9JT0NUTF9DTE9TRU1PVU5UX0NNRCB0aGUgaW9jdGxmZCBpcyB2YWxpZGF0ZWQgYW5kIGlmIGl0IGlzCitub3QgYSB2YWxpZCBkZXNjcmlwdG9yIG9yIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhbiBhdXRvZnMgbW91bnQgcG9pbnQKK2FuIGVycm9yIG9mIC1FQkFERiwgLUVOT1RUWSBvciAtRUlOVkFMIChub3QgYW4gYXV0b2ZzIGRlc2NyaXB0b3IpIGlzCityZXR1cm5lZC4KKworCitUaGUgaW9jdGxzCis9PT09PT09PT09CisKK0FuIGV4YW1wbGUgb2YgYW4gaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyB0aGlzIGludGVyZmFjZSBjYW4gYmUgc2VlbgoraW4gYXV0b2ZzIHZlcnNpb24gNS4wLjQgYW5kIGxhdGVyIGluIGZpbGUgbGliL2Rldi1pb2N0bC1saWIuYyBvZiB0aGUKK2Rpc3RyaWJ1dGlvbiB0YXIgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIGtlcm5lbC5vcmcgaW4gZGlyZWN0b3J5CisvcHViL2xpbnV4L2RhZW1vbnMvYXV0b2ZzL3Y1LgorCitUaGUgZGV2aWNlIG5vZGUgaW9jdGwgb3BlcmF0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGlzIGludGVyZmFjZSBhcmU6CisKKworQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2V0IHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBvZiB0aGUgYXV0b2ZzNCBkZXZpY2UgaW9jdGwga2VybmVsIG1vZHVsZQoraW1wbGVtZW50YXRpb24uIEl0IHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIGFzIGFuCitpbnB1dCBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIHBhc3NlZCBpbiBzdHJ1Y3R1cmUuCitJdCByZXR1cm5zIDAgb24gc3VjY2VzcyBvciB0aGUgZXJyb3IgLUVJTlZBTCBpZiBhIHZlcnNpb24gbWlzbWF0Y2ggaXMKK2RldGVjdGVkLgorCisKK0FVVE9GU19ERVZfSU9DVExfUFJPVE9WRVJfQ01EIGFuZCBBVVRPRlNfREVWX0lPQ1RMX1BST1RPU1VCVkVSX0NNRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dldCB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gb2YgdGhlIGF1dG9mczQgcHJvdG9jb2wgdmVyc2lvbiB1bmRlcnN0b29kCitieSBsb2FkZWQgbW9kdWxlLiBUaGlzIGNhbGwgcmVxdWlyZXMgYW4gaW5pdGlhbGl6ZWQgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwKK3dpdGggdGhlIGlvY3RsZmQgZmllbGQgc2V0IHRvIGEgdmFsaWQgYXV0b2ZzIG1vdW50IHBvaW50IGRlc2NyaXB0b3IKK2FuZCBzZXRzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBudW1iZXIgaW4gc3RydWN0dXJlIGZpZWxkIGFyZzEuIFRoZXNlCitjb21tYW5kcyByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG9uZSBvZiB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZXMgaWYKK3ZhbGlkYXRpb24gZmFpbHMuCisKKworQVVUT0ZTX0RFVl9JT0NUTF9PUEVOTU9VTlQgYW5kIEFVVE9GU19ERVZfSU9DVExfQ0xPU0VNT1VOVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPYnRhaW4gYW5kIHJlbGVhc2UgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIGFuIGF1dG9mcyBtYW5hZ2VkIG1vdW50IHBvaW50CitwYXRoLiBUaGUgb3BlbiBjYWxsIHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHdpdGgKK3RoZSB0aGUgcGF0aCBmaWVsZCBzZXQgYW5kIHRoZSBzaXplIGZpZWxkIGFkanVzdGVkIGFwcHJvcHJpYXRlbHkgYXMgd2VsbAorYXMgdGhlIGFyZzEgZmllbGQgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBhdXRvZnMgbW91bnQuIFRoZQorZGV2aWNlIG51bWJlciBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgbW91bnQgb3B0aW9ucyBzaG93biBpbgorL3Byb2MvbW91bnRzLiBUaGUgY2xvc2UgY2FsbCByZXF1aXJlcyBhbiBpbml0aWFsaXplZCBzdHJ1Y3QKK2F1dG9mc19kZXZfaW9jdCB3aXRoIHRoZSBpb2N0bGZkIGZpZWxkIHNldCB0byB0aGUgZGVzY3JpcHRvciBvYnRhaW5lZAorZnJvbSB0aGUgb3BlbiBjYWxsLiBUaGUgcmVsZWFzZSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGNhbiBhbHNvIGJlIGRvbmUKK3dpdGggY2xvc2UoMikgc28gYW55IG9wZW4gZGVzY3JpcHRvcnMgd2lsbCBhbHNvIGJlIGNsb3NlZCBhdCBwcm9jZXNzIGV4aXQuCitUaGUgY2xvc2UgY2FsbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW1wbGVtZW50ZWQgb3BlcmF0aW9ucyBsYXJnZWx5IGZvcgorY29tcGxldGVuZXNzIGFuZCB0byBwcm92aWRlIGZvciBhIGNvbnNpc3RlbnQgdXNlciBzcGFjZSBpbXBsZW1lbnRhdGlvbi4KKworCitBVVRPRlNfREVWX0lPQ1RMX1JFQURZX0NNRCBhbmQgQVVUT0ZTX0RFVl9JT0NUTF9GQUlMX0NNRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmV0dXJuIG1vdW50IGFuZCBleHBpcmUgcmVzdWx0IHN0YXR1cyBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGtlcm5lbC4KK0JvdGggb2YgdGhlc2UgY2FsbHMgcmVxdWlyZSBhbiBpbml0aWFsaXplZCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bAord2l0aCB0aGUgaW9jdGxmZCBmaWVsZCBzZXQgdG8gdGhlIGRlc2NyaXB0b3Igb2J0YWluZWQgZnJvbSB0aGUgb3BlbgorY2FsbCBhbmQgdGhlIGFyZzEgZmllbGQgc2V0IHRvIHRoZSB3YWl0IHF1ZXVlIHRva2VuIG51bWJlciwgcmVjZWl2ZWQKK2J5IHVzZXIgc3BhY2UgaW4gdGhlIGZvcmVnb2luZyBtb3VudCBvciBleHBpcmUgcmVxdWVzdC4gVGhlIGFyZzIgZmllbGQKK2lzIHNldCB0byB0aGUgc3RhdHVzIHRvIGJlIHJldHVybmVkLiBGb3IgdGhlIHJlYWR5IGNhbGwgdGhpcyBpcyBhbHdheXMKKzAgYW5kIGZvciB0aGUgZmFpbCBjYWxsIGl0IGlzIHNldCB0byB0aGUgZXJybm8gb2YgdGhlIG9wZXJhdGlvbi4KKworCitBVVRPRlNfREVWX0lPQ1RMX1NFVFBJUEVGRF9DTUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXQgdGhlIHBpcGUgZmlsZSBkZXNjcmlwdG9yIHVzZWQgZm9yIGtlcm5lbCBjb21tdW5pY2F0aW9uIHRvIHRoZSBkYWVtb24uCitOb3JtYWxseSB0aGlzIGlzIHNldCBhdCBtb3VudCB0aW1lIHVzaW5nIGFuIG9wdGlvbiBidXQgd2hlbiByZWNvbm5lY3RpbmcKK3RvIGEgZXhpc3RpbmcgbW91bnQgd2UgbmVlZCB0byB1c2UgdGhpcyB0byB0ZWxsIHRoZSBhdXRvZnMgbW91bnQgYWJvdXQKK3RoZSBuZXcga2VybmVsIHBpcGUgZGVzY3JpcHRvci4gSW4gb3JkZXIgdG8gcHJvdGVjdCBtb3VudHMgYWdhaW5zdAoraW5jb3JyZWN0bHkgc2V0dGluZyB0aGUgcGlwZSBkZXNjcmlwdG9yIHdlIGFsc28gcmVxdWlyZSB0aGF0IHRoZSBhdXRvZnMKK21vdW50IGJlIGNhdGF0b25pYyAoc2VlIG5leHQgY2FsbCkuCisKK1RoZSBjYWxsIHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHdpdGggdGhlCitpb2N0bGZkIGZpZWxkIHNldCB0byB0aGUgZGVzY3JpcHRvciBvYnRhaW5lZCBmcm9tIHRoZSBvcGVuIGNhbGwgYW5kCit0aGUgYXJnMSBmaWVsZCBzZXQgdG8gZGVzY3JpcHRvciBvZiB0aGUgcGlwZS4gT24gc3VjY2VzcyB0aGUgY2FsbAorYWxzbyBzZXRzIHRoZSBwcm9jZXNzIGdyb3VwIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNvbnRyb2xsaW5nIHByb2Nlc3MKKyhlZy4gdGhlIG93bmluZyBhdXRvbW91bnQoOCkgZGFlbW9uKSB0byB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgY2FsbGVyLgorCisKK0FVVE9GU19ERVZfSU9DVExfQ0FUQVRPTklDX0NNRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01ha2UgdGhlIGF1dG9mcyBtb3VudCBwb2ludCBjYXRhdG9uaWMuIFRoZSBhdXRvZnMgbW91bnQgd2lsbCBubyBsb25nZXIKK2lzc3VlIG1vdW50IHJlcXVlc3RzLCB0aGUga2VybmVsIGNvbW11bmljYXRpb24gcGlwZSBkZXNjcmlwdG9yIGlzIHJlbGVhc2VkCithbmQgYW55IHJlbWFpbmluZyB3YWl0cyBpbiB0aGUgcXVldWUgcmVsZWFzZWQuCisKK1RoZSBjYWxsIHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHdpdGggdGhlCitpb2N0bGZkIGZpZWxkIHNldCB0byB0aGUgZGVzY3JpcHRvciBvYnRhaW5lZCBmcm9tIHRoZSBvcGVuIGNhbGwuCisKKworQVVUT0ZTX0RFVl9JT0NUTF9USU1FT1VUX0NNRAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXQgdGhlIGV4cGlyZSB0aW1lb3V0IGZvciBtb3VudHMgd2l0aGluZyBhbiBhdXRvZnMgbW91bnQgcG9pbnQuCisKK1RoZSBjYWxsIHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHdpdGggdGhlCitpb2N0bGZkIGZpZWxkIHNldCB0byB0aGUgZGVzY3JpcHRvciBvYnRhaW5lZCBmcm9tIHRoZSBvcGVuIGNhbGwuCisKKworQVVUT0ZTX0RFVl9JT0NUTF9SRVFVRVNURVJfQ01ECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmV0dXJuIHRoZSB1aWQgYW5kIGdpZCBvZiB0aGUgbGFzdCBwcm9jZXNzIHRvIHN1Y2Nlc3NmdWxseSB0cmlnZ2VyIGEgdGhlCittb3VudCBvbiB0aGUgZ2l2ZW4gcGF0aCBkZW50cnkuCisKK1RoZSBjYWxsIHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHdpdGggdGhlIHBhdGgKK2ZpZWxkIHNldCB0byB0aGUgbW91bnQgcG9pbnQgaW4gcXVlc3Rpb24gYW5kIHRoZSBzaXplIGZpZWxkIGFkanVzdGVkCithcHByb3ByaWF0ZWx5IGFzIHdlbGwgYXMgdGhlIGFyZzEgZmllbGQgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZQorY29udGFpbmluZyBhdXRvZnMgbW91bnQuIFVwb24gcmV0dXJuIHRoZSBzdHJ1Y3QgZmllbGQgYXJnMSBjb250YWlucyB0aGUKK3VpZCBhbmQgYXJnMiB0aGUgZ2lkLgorCitXaGVuIHJlY29uc3RydWN0aW5nIGFuIGF1dG9mcyBtb3VudCB0cmVlIHdpdGggYWN0aXZlIG1vdW50cyB3ZSBuZWVkIHRvCityZS1jb25uZWN0IHRvIG1vdW50cyB0aGF0IG1heSBoYXZlIHVzZWQgdGhlIG9yaWdpbmFsIHByb2Nlc3MgdWlkIGFuZAorZ2lkIChvciBzdHJpbmcgdmFyaWF0aW9ucyBvZiB0aGVtKSBmb3IgbW91bnQgbG9va3VwcyB3aXRoaW4gdGhlIG1hcCBlbnRyeS4KK1RoaXMgY2FsbCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBvYnRhaW4gdGhpcyB1aWQgYW5kIGdpZCBzbyB0aGV5IG1heSBiZQordXNlZCBieSB1c2VyIHNwYWNlIGZvciB0aGUgbW91bnQgbWFwIGxvb2t1cHMuCisKKworQVVUT0ZTX0RFVl9JT0NUTF9FWFBJUkVfQ01ECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSXNzdWUgYW4gZXhwaXJlIHJlcXVlc3QgdG8gdGhlIGtlcm5lbCBmb3IgYW4gYXV0b2ZzIG1vdW50LiBUeXBpY2FsbHkKK3RoaXMgaW9jdGwgaXMgY2FsbGVkIHVudGlsIG5vIGZ1cnRoZXIgZXhwaXJlIGNhbmRpZGF0ZXMgYXJlIGZvdW5kLgorCitUaGUgY2FsbCByZXF1aXJlcyBhbiBpbml0aWFsaXplZCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCB3aXRoIHRoZQoraW9jdGxmZCBmaWVsZCBzZXQgdG8gdGhlIGRlc2NyaXB0b3Igb2J0YWluZWQgZnJvbSB0aGUgb3BlbiBjYWxsLiBJbgorYWRkaXRpb24gYW4gaW1tZWRpYXRlIGV4cGlyZSwgaW5kZXBlbmRlbnQgb2YgdGhlIG1vdW50IHRpbWVvdXQsIGNhbiBiZQorcmVxdWVzdGVkIGJ5IHNldHRpbmcgdGhlIGFyZzEgZmllbGQgdG8gMS4gSWYgbm8gZXhwaXJlIGNhbmRpZGF0ZXMgY2FuCitiZSBmb3VuZCB0aGUgaW9jdGwgcmV0dXJucyAtMSB3aXRoIGVycm5vIHNldCB0byBFQUdBSU4uCisKK1RoaXMgY2FsbCBjYXVzZXMgdGhlIGtlcm5lbCBtb2R1bGUgdG8gY2hlY2sgdGhlIG1vdW50IGNvcnJlc3BvbmRpbmcKK3RvIHRoZSBnaXZlbiBpb2N0bGZkIGZvciBtb3VudHMgdGhhdCBjYW4gYmUgZXhwaXJlZCwgaXNzdWVzIGFuIGV4cGlyZQorcmVxdWVzdCBiYWNrIHRvIHRoZSBkYWVtb24gYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uLgorCitBVVRPRlNfREVWX0lPQ1RMX0FTS1VNT1VOVF9DTUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDaGVja3MgaWYgYW4gYXV0b2ZzIG1vdW50IHBvaW50IGlzIGluIHVzZS4KKworVGhlIGNhbGwgcmVxdWlyZXMgYW4gaW5pdGlhbGl6ZWQgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgd2l0aCB0aGUKK2lvY3RsZmQgZmllbGQgc2V0IHRvIHRoZSBkZXNjcmlwdG9yIG9idGFpbmVkIGZyb20gdGhlIG9wZW4gY2FsbCBhbmQKK2l0IHJldHVybnMgdGhlIHJlc3VsdCBpbiB0aGUgYXJnMSBmaWVsZCwgMSBmb3IgYnVzeSBhbmQgMCBvdGhlcndpc2UuCisKKworQVVUT0ZTX0RFVl9JT0NUTF9JU01PVU5UUE9JTlRfQ01ECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hlY2sgaWYgdGhlIGdpdmVuIHBhdGggaXMgYSBtb3VudHBvaW50LgorCitUaGUgY2FsbCByZXF1aXJlcyBhbiBpbml0aWFsaXplZCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bC4gVGhlcmUgYXJlIHR3bworcG9zc2libGUgdmFyaWF0aW9ucy4gQm90aCB1c2UgdGhlIHBhdGggZmllbGQgc2V0IHRvIHRoZSBwYXRoIG9mIHRoZSBtb3VudAorcG9pbnQgdG8gY2hlY2sgYW5kIHRoZSBzaXplIGZpZWxkIGFkanVzdGVkIGFwcHJvcHJpYXRlbHkuIE9uZSB1c2VzIHRoZQoraW9jdGxmZCBmaWVsZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIG1vdW50IHBvaW50IHRvIGNoZWNrIHdoaWxlIHRoZSBvdGhlcgordmFyaWF0aW9uIHVzZXMgdGhlIHBhdGggYW5kIG9wdGlvbmFseSBhcmcxIHNldCB0byBhbiBhdXRvZnMgbW91bnQgdHlwZS4KK1RoZSBjYWxsIHJldHVybnMgMSBpZiB0aGlzIGlzIGEgbW91bnQgcG9pbnQgYW5kIHNldHMgYXJnMSB0byB0aGUgZGV2aWNlCitudW1iZXIgb2YgdGhlIG1vdW50IGFuZCBmaWVsZCBhcmcyIHRvIHRoZSByZWxldmFudCBzdXBlciBibG9jayBtYWdpYworbnVtYmVyIChkZXNjcmliZWQgYmVsb3cpIG9yIDAgaWYgaXQgaXNuJ3QgYSBtb3VudHBvaW50LiBJbiBib3RoIGNhc2VzCit0aGUgdGhlIGRldmljZSBudW1iZXIgKGFzIHJldHVybmVkIGJ5IG5ld19lbmNvZGVfZGV2KCkpIGlzIHJldHVybmVkCitpbiBmaWVsZCBhcmcxLgorCitJZiBzdXBwbGllZCB3aXRoIGEgZmlsZSBkZXNjcmlwdG9yIHdlJ3JlIGxvb2tpbmcgZm9yIGEgc3BlY2lmaWMgbW91bnQsCitub3QgbmVjZXNzYXJpbHkgYXQgdGhlIHRvcCBvZiB0aGUgbW91bnRlZCBzdGFjay4gSW4gdGhpcyBjYXNlIHRoZSBwYXRoCit0aGUgZGVzY3JpcHRvciBjb3JyZXNwb25kcyB0byBpcyBjb25zaWRlcmVkIGEgbW91bnRwb2ludCBpZiBpdCBpcyBpdHNlbGYKK2EgbW91bnRwb2ludCBvciBjb250YWlucyBhIG1vdW50LCBzdWNoIGFzIGEgbXVsdGktbW91bnQgd2l0aG91dCBhIHJvb3QKK21vdW50LiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIDEgaWYgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZHMgdG8gYSBtb3VudAorcG9pbnQgYW5kIGFuZCBhbHNvIHJldHVybnMgdGhlIHN1cGVyIG1hZ2ljIG9mIHRoZSBjb3ZlcmluZyBtb3VudCBpZiB0aGVyZQoraXMgb25lIG9yIDAgaWYgaXQgaXNuJ3QgYSBtb3VudHBvaW50LgorCitJZiBhIHBhdGggaXMgc3VwcGxpZWQgKGFuZCB0aGUgaW9jdGxmZCBmaWVsZCBpcyBzZXQgdG8gLTEpIHRoZW4gdGhlIHBhdGgKK2lzIGxvb2tlZCB1cCBhbmQgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgdGhlIHJvb3Qgb2YgYSBtb3VudC4gSWYgYQordHlwZSBpcyBhbHNvIGdpdmVuIHdlIGFyZSBsb29raW5nIGZvciBhIHBhcnRpY3VsYXIgYXV0b2ZzIG1vdW50IGFuZCBpZgorYSBtYXRjaCBpc24ndCBmb3VuZCBhIGZhaWwgaXMgcmV0dXJuZWQuIElmIHRoZSB0aGUgbG9jYXRlZCBwYXRoIGlzIHRoZQorcm9vdCBvZiBhIG1vdW50IDEgaXMgcmV0dXJuZWQgYWxvbmcgd2l0aCB0aGUgc3VwZXIgbWFnaWMgb2YgdGhlIG1vdW50CitvciAwIG90aGVyd2lzZS4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKaW5kZXggYjQ1ZjNjMWIuLjI5NWYyNmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dApAQCAtMTkzLDYgKzE5Myw1IEBACiBwcm9ncmFtczogCWh0dHA6Ly9lMmZzcHJvZ3Muc291cmNlZm9yZ2UubmV0LwogCQlodHRwOi8vZXh0MnJlc2l6ZS5zb3VyY2Vmb3JnZS5uZXQKIAotdXNlZnVsIGxpbmtzOglodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvZXh0My9leHQzLXVzYWdlLmh0bWwKLQkJaHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saWJyYXJ5L2wtZnM3LwordXNlZnVsIGxpbmtzOglodHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpYnJhcnkvbC1mczcvCiAJCWh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGludXgvbGlicmFyeS9sLWZzOC8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CmluZGV4IDBkNTM5NDkuLmViMTU0ZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dApAQCAtMzIsOSArMzIsOSBAQAogICAgIHlvdSB3aWxsIG5lZWQgdG8gbWVyZ2UgeW91ciBjaGFuZ2VzIHdpdGggdGhlIHZlcnNpb24gZnJvbSBlMmZzcHJvZ3MKICAgICAxLjQxLnguCiAKLSAgLSBDcmVhdGUgYSBuZXcgZmlsZXN5c3RlbSB1c2luZyB0aGUgZXh0NGRldiBmaWxlc3lzdGVtIHR5cGU6CisgIC0gQ3JlYXRlIGEgbmV3IGZpbGVzeXN0ZW0gdXNpbmcgdGhlIGV4dDQgZmlsZXN5c3RlbSB0eXBlOgogCi0gICAgCSMgbWtlMmZzIC10IGV4dDRkZXYgL2Rldi9oZGExCisgICAgCSMgbWtlMmZzIC10IGV4dDQgL2Rldi9oZGExCiAKICAgICBPciBjb25maWd1cmUgYW4gZXhpc3RpbmcgZXh0MyBmaWxlc3lzdGVtIHRvIHN1cHBvcnQgZXh0ZW50cyBhbmQgc2V0CiAgICAgdGhlIHRlc3RfZnMgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGl0J3Mgb2sgZm9yIGFuIGluLWRldmVsb3BtZW50CkBAIC00NywxMyArNDcsMTMgQEAKIAogICAgICAgICAjIHR1bmUyZnMgLUkgMjU2IC9kZXYvaGRhMQogCi0gICAgKE5vdGU6IHdlIGN1cnJlbnRseSBkbyBub3QgaGF2ZSB0b29scyB0byBjb252ZXJ0IGFuIGV4dDRkZXYKKyAgICAoTm90ZTogd2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIHRvb2xzIHRvIGNvbnZlcnQgYW4gZXh0NAogICAgIGZpbGVzeXN0ZW0gYmFjayB0byBleHQzOyBzbyBwbGVhc2UgZG8gbm90IGRvIHRyeSB0aGlzIG9uIHByb2R1Y3Rpb24KICAgICBmaWxlc3lzdGVtcy4pCiAKICAgLSBNb3VudGluZzoKIAotCSMgbW91bnQgLXQgZXh0NGRldiAvZGV2L2hkYTEgL3doZXJldmVyCisJIyBtb3VudCAtdCBleHQ0IC9kZXYvaGRhMSAvd2hlcmV2ZXIKIAogICAtIFdoZW4gY29tcGFyaW5nIHBlcmZvcm1hbmNlIHdpdGggb3RoZXIgZmlsZXN5c3RlbXMsIHJlbWVtYmVyIHRoYXQKICAgICBleHQzLzQgYnkgZGVmYXVsdCBvZmZlcnMgaGlnaGVyIGRhdGEgaW50ZWdyaXR5IGd1YXJhbnRlZXMgdGhhbiBtb3N0LgpAQCAtMTc3LDYgKzE3NywxMSBAQAogCQkJeW91ciBkaXNrcyBhcmUgYmF0dGVyeS1iYWNrZWQgaW4gb25lIHdheSBvciBhbm90aGVyLAogCQkJZGlzYWJsaW5nIGJhcnJpZXJzIG1heSBzYWZlbHkgaW1wcm92ZSBwZXJmb3JtYW5jZS4KIAoraW5vZGVfcmVhZGFoZWFkPW4JVGhpcyB0dW5pbmcgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBtYXhpbXVtCisJCQludW1iZXIgb2YgaW5vZGUgdGFibGUgYmxvY2tzIHRoYXQgZXh0NCdzIGlub2RlCisJCQl0YWJsZSByZWFkYWhlYWQgYWxnb3JpdGhtIHdpbGwgcHJlLXJlYWQgaW50bworCQkJdGhlIGJ1ZmZlciBjYWNoZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDMyIGJsb2Nrcy4KKwogb3Jsb3YJCSgqKQlUaGlzIGVuYWJsZXMgdGhlIG5ldyBPcmxvdiBibG9jayBhbGxvY2F0b3IuIEl0IGlzCiAJCQllbmFibGVkIGJ5IGRlZmF1bHQuCiAKQEAgLTIxOCw2ICsyMjMsMTEgQEAKIGVycm9ycz1jb250aW51ZQkJS2VlcCBnb2luZyBvbiBhIGZpbGVzeXN0ZW0gZXJyb3IuCiBlcnJvcnM9cGFuaWMJCVBhbmljIGFuZCBoYWx0IHRoZSBtYWNoaW5lIGlmIGFuIGVycm9yIG9jY3Vycy4KIAorZGF0YV9lcnI9aWdub3JlKCopCUp1c3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMKKwkJCWluIGEgZmlsZSBkYXRhIGJ1ZmZlciBpbiBvcmRlcmVkIG1vZGUuCitkYXRhX2Vycj1hYm9ydAkJQWJvcnQgdGhlIGpvdXJuYWwgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgZmlsZQorCQkJZGF0YSBidWZmZXIgaW4gb3JkZXJlZCBtb2RlLgorCiBncnBpZAkJCUdpdmUgb2JqZWN0cyB0aGUgc2FtZSBncm91cCBJRCBhcyB0aGVpciBjcmVhdG9yLgogYnNkZ3JvdXBzCiAKQEAgLTI1Miw2ICsyNjIsNyBAQAogZGVsYWxsb2MJKCopCURlZmVycmluZyBibG9jayBhbGxvY2F0aW9uIHVudGlsIHdyaXRlLW91dCB0aW1lLgogbm9kZWxhbGxvYwkJRGlzYWJsZSBkZWxheWVkIGFsbG9jYXRpb24uIEJsb2NrcyBhcmUgYWxsb2NhdGlvbgogCQkJd2hlbiBkYXRhIGlzIGNvcGllZCBmcm9tIHVzZXIgdG8gcGFnZSBjYWNoZS4KKwogRGF0YSBNb2RlCiA9PT09PT09PT0KIFRoZXJlIGFyZSAzIGRpZmZlcmVudCBkYXRhIG1vZGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9maWVtYXAudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9maWVtYXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlM2RlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZpZW1hcC50eHQKQEAgLTAsMCArMSwyMjggQEAKKz09PT09PT09PT09PQorRmllbWFwIElvY3RsCis9PT09PT09PT09PT0KKworVGhlIGZpZW1hcCBpb2N0bCBpcyBhbiBlZmZpY2llbnQgbWV0aG9kIGZvciB1c2Vyc3BhY2UgdG8gZ2V0IGZpbGUKK2V4dGVudCBtYXBwaW5ncy4gSW5zdGVhZCBvZiBibG9jay1ieS1ibG9jayBtYXBwaW5nIChzdWNoIGFzIGJtYXApLCBmaWVtYXAKK3JldHVybnMgYSBsaXN0IG9mIGV4dGVudHMuCisKKworUmVxdWVzdCBCYXNpY3MKKy0tLS0tLS0tLS0tLS0tCisKK0EgZmllbWFwIHJlcXVlc3QgaXMgZW5jb2RlZCB3aXRoaW4gc3RydWN0IGZpZW1hcDoKKworc3RydWN0IGZpZW1hcCB7CisJX191NjQJZm1fc3RhcnQ7CSAvKiBsb2dpY2FsIG9mZnNldCAoaW5jbHVzaXZlKSBhdAorCQkJCSAgKiB3aGljaCB0byBzdGFydCBtYXBwaW5nIChpbikgKi8KKwlfX3U2NAlmbV9sZW5ndGg7CSAvKiBsb2dpY2FsIGxlbmd0aCBvZiBtYXBwaW5nIHdoaWNoCisJCQkJICAqIHVzZXJzcGFjZSBjYXJlcyBhYm91dCAoaW4pICovCisJX191MzIJZm1fZmxhZ3M7CSAvKiBGSUVNQVBfRkxBR18qIGZsYWdzIGZvciByZXF1ZXN0IChpbi9vdXQpICovCisJX191MzIJZm1fbWFwcGVkX2V4dGVudHM7IC8qIG51bWJlciBvZiBleHRlbnRzIHRoYXQgd2VyZQorCQkJCSAgICAqIG1hcHBlZCAob3V0KSAqLworCV9fdTMyCWZtX2V4dGVudF9jb3VudDsgLyogc2l6ZSBvZiBmbV9leHRlbnRzIGFycmF5IChpbikgKi8KKwlfX3UzMglmbV9yZXNlcnZlZDsKKwlzdHJ1Y3QgZmllbWFwX2V4dGVudCBmbV9leHRlbnRzWzBdOyAvKiBhcnJheSBvZiBtYXBwZWQgZXh0ZW50cyAob3V0KSAqLworfTsKKworCitmbV9zdGFydCwgYW5kIGZtX2xlbmd0aCBzcGVjaWZ5IHRoZSBsb2dpY2FsIHJhbmdlIHdpdGhpbiB0aGUgZmlsZQord2hpY2ggdGhlIHByb2Nlc3Mgd291bGQgbGlrZSBtYXBwaW5ncyBmb3IuIEV4dGVudHMgcmV0dXJuZWQgbWlycm9yCit0aG9zZSBvbiBkaXNrIC0gdGhhdCBpcywgdGhlIGxvZ2ljYWwgb2Zmc2V0IG9mIHRoZSAxc3QgcmV0dXJuZWQgZXh0ZW50CittYXkgc3RhcnQgYmVmb3JlIGZtX3N0YXJ0LCBhbmQgdGhlIHJhbmdlIGNvdmVyZWQgYnkgdGhlIGxhc3QgcmV0dXJuZWQKK2V4dGVudCBtYXkgZW5kIGFmdGVyIGZtX2xlbmd0aC4gQWxsIG9mZnNldHMgYW5kIGxlbmd0aHMgYXJlIGluIGJ5dGVzLgorCitDZXJ0YWluIGZsYWdzIHRvIG1vZGlmeSB0aGUgd2F5IGluIHdoaWNoIG1hcHBpbmdzIGFyZSBsb29rZWQgdXAgY2FuIGJlCitzZXQgaW4gZm1fZmxhZ3MuIElmIHRoZSBrZXJuZWwgZG9lc24ndCB1bmRlcnN0YW5kIHNvbWUgcGFydGljdWxhcgorZmxhZ3MsIGl0IHdpbGwgcmV0dXJuIEVCQURSIGFuZCB0aGUgY29udGVudHMgb2YgZm1fZmxhZ3Mgd2lsbCBjb250YWluCit0aGUgc2V0IG9mIGZsYWdzIHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuIElmIHRoZSBrZXJuZWwgaXMgY29tcGF0aWJsZQord2l0aCBhbGwgZmxhZ3MgcGFzc2VkLCB0aGUgY29udGVudHMgb2YgZm1fZmxhZ3Mgd2lsbCBiZSB1bm1vZGlmaWVkLgorSXQgaXMgdXAgdG8gdXNlcnNwYWNlIHRvIGRldGVybWluZSB3aGV0aGVyIHJlamVjdGlvbiBvZiBhIHBhcnRpY3VsYXIKK2ZsYWcgaXMgZmF0YWwgdG8gaXQncyBvcGVyYXRpb24uIFRoaXMgc2NoZW1lIGlzIGludGVuZGVkIHRvIGFsbG93IHRoZQorZmllbWFwIGludGVyZmFjZSB0byBncm93IGluIHRoZSBmdXR1cmUgYnV0IHdpdGhvdXQgbG9zaW5nCitjb21wYXRpYmlsaXR5IHdpdGggb2xkIHNvZnR3YXJlLgorCitmbV9leHRlbnRfY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZtX2V4dGVudHNbXSBhcnJheQordGhhdCBjYW4gYmUgdXNlZCB0byByZXR1cm4gZXh0ZW50cy4gIElmIGZtX2V4dGVudF9jb3VudCBpcyB6ZXJvLCB0aGVuIHRoZQorZm1fZXh0ZW50c1tdIGFycmF5IGlzIGlnbm9yZWQgKG5vIGV4dGVudHMgd2lsbCBiZSByZXR1cm5lZCksIGFuZCB0aGUKK2ZtX21hcHBlZF9leHRlbnRzIGNvdW50IHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgbmVlZGVkIGluCitmbV9leHRlbnRzW10gdG8gaG9sZCB0aGUgZmlsZSdzIGN1cnJlbnQgbWFwcGluZy4gIE5vdGUgdGhhdCB0aGVyZSBpcworbm90aGluZyB0byBwcmV2ZW50IHRoZSBmaWxlIGZyb20gY2hhbmdpbmcgYmV0d2VlbiBjYWxscyB0byBGSUVNQVAuCisKK1RoZSBmb2xsb3dpbmcgZmxhZ3MgY2FuIGJlIHNldCBpbiBmbV9mbGFnczoKKworKiBGSUVNQVBfRkxBR19TWU5DCitJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUga2VybmVsIHdpbGwgc3luYyB0aGUgZmlsZSBiZWZvcmUgbWFwcGluZyBleHRlbnRzLgorCisqIEZJRU1BUF9GTEFHX1hBVFRSCitJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgZXh0ZW50cyByZXR1cm5lZCB3aWxsIGRlc2NyaWJlIHRoZSBpbm9kZXMKK2V4dGVuZGVkIGF0dHJpYnV0ZSBsb29rdXAgdHJlZSwgaW5zdGVhZCBvZiBpdCdzIGRhdGEgdHJlZS4KKworCitFeHRlbnQgTWFwcGluZworLS0tLS0tLS0tLS0tLS0KKworRXh0ZW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIHdpdGhpbiB0aGUgZW1iZWRkZWQgZm1fZXh0ZW50cyBhcnJheQord2hpY2ggdXNlcnNwYWNlIG11c3QgYWxsb2NhdGUgYWxvbmcgd2l0aCB0aGUgZmllbWFwIHN0cnVjdHVyZS4gVGhlCitudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZpZW1hcF9leHRlbnRzW10gYXJyYXkgc2hvdWxkIGJlIHBhc3NlZCB2aWEKK2ZtX2V4dGVudF9jb3VudC4gVGhlIG51bWJlciBvZiBleHRlbnRzIG1hcHBlZCBieSBrZXJuZWwgd2lsbCBiZQorcmV0dXJuZWQgdmlhIGZtX21hcHBlZF9leHRlbnRzLiBJZiB0aGUgbnVtYmVyIG9mIGZpZW1hcF9leHRlbnRzCithbGxvY2F0ZWQgaXMgbGVzcyB0aGFuIHdvdWxkIGJlIHJlcXVpcmVkIHRvIG1hcCB0aGUgcmVxdWVzdGVkIHJhbmdlLAordGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dGVudHMgdGhhdCBjYW4gYmUgbWFwcGVkIGluIHRoZSBmbV9leHRlbnRbXQorYXJyYXkgd2lsbCBiZSByZXR1cm5lZCBhbmQgZm1fbWFwcGVkX2V4dGVudHMgd2lsbCBiZSBlcXVhbCB0bworZm1fZXh0ZW50X2NvdW50LiBJbiB0aGF0IGNhc2UsIHRoZSBsYXN0IGV4dGVudCBpbiB0aGUgYXJyYXkgd2lsbCBub3QKK2NvbXBsZXRlIHRoZSByZXF1ZXN0ZWQgcmFuZ2UgYW5kIHdpbGwgbm90IGhhdmUgdGhlIEZJRU1BUF9FWFRFTlRfTEFTVAorZmxhZyBzZXQgKHNlZSB0aGUgbmV4dCBzZWN0aW9uIG9uIGV4dGVudCBmbGFncykuCisKK0VhY2ggZXh0ZW50IGlzIGRlc2NyaWJlZCBieSBhIHNpbmdsZSBmaWVtYXBfZXh0ZW50IHN0cnVjdHVyZSBhcworcmV0dXJuZWQgaW4gZm1fZXh0ZW50cy4KKworc3RydWN0IGZpZW1hcF9leHRlbnQgeworCV9fdTY0CWZlX2xvZ2ljYWw7ICAvKiBsb2dpY2FsIG9mZnNldCBpbiBieXRlcyBmb3IgdGhlIHN0YXJ0IG9mCisJCQkgICAgICAqIHRoZSBleHRlbnQgKi8KKwlfX3U2NAlmZV9waHlzaWNhbDsgLyogcGh5c2ljYWwgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGUgc3RhcnQKKwkJCSAgICAgICogb2YgdGhlIGV4dGVudCAqLworCV9fdTY0CWZlX2xlbmd0aDsgICAvKiBsZW5ndGggaW4gYnl0ZXMgZm9yIHRoZSBleHRlbnQgKi8KKwlfX3U2NAlmZV9yZXNlcnZlZDY0WzJdOworCV9fdTMyCWZlX2ZsYWdzOyAgICAvKiBGSUVNQVBfRVhURU5UXyogZmxhZ3MgZm9yIHRoaXMgZXh0ZW50ICovCisJX191MzIJZmVfcmVzZXJ2ZWRbM107Cit9OworCitBbGwgb2Zmc2V0cyBhbmQgbGVuZ3RocyBhcmUgaW4gYnl0ZXMgYW5kIG1pcnJvciB0aG9zZSBvbiBkaXNrLiAgSXQgaXMgdmFsaWQKK2ZvciBhbiBleHRlbnRzIGxvZ2ljYWwgb2Zmc2V0IHRvIHN0YXJ0IGJlZm9yZSB0aGUgcmVxdWVzdCBvciBpdCdzIGxvZ2ljYWwKK2xlbmd0aCB0byBleHRlbmQgcGFzdCB0aGUgcmVxdWVzdC4gIFVubGVzcyBGSUVNQVBfRVhURU5UX05PVF9BTElHTkVEIGlzCityZXR1cm5lZCwgZmVfbG9naWNhbCwgZmVfcGh5c2ljYWwsIGFuZCBmZV9sZW5ndGggd2lsbCBiZSBhbGlnbmVkIHRvIHRoZQorYmxvY2sgc2l6ZSBvZiB0aGUgZmlsZSBzeXN0ZW0uICBXaXRoIHRoZSBleGNlcHRpb24gb2YgZXh0ZW50cyBmbGFnZ2VkIGFzCitGSUVNQVBfRVhURU5UX01FUkdFRCwgYWRqYWNlbnQgZXh0ZW50cyB3aWxsIG5vdCBiZSBtZXJnZWQuCisKK1RoZSBmZV9mbGFncyBmaWVsZCBjb250YWlucyBmbGFncyB3aGljaCBkZXNjcmliZSB0aGUgZXh0ZW50IHJldHVybmVkLgorQSBzcGVjaWFsIGZsYWcsIEZJRU1BUF9FWFRFTlRfTEFTVCBpcyBhbHdheXMgc2V0IG9uIHRoZSBsYXN0IGV4dGVudCBpbgordGhlIGZpbGUgc28gdGhhdCB0aGUgcHJvY2VzcyBtYWtpbmcgZmllbWFwIGNhbGxzIGNhbiBkZXRlcm1pbmUgd2hlbiBubworbW9yZSBleHRlbnRzIGFyZSBhdmFpbGFibGUsIHdpdGhvdXQgaGF2aW5nIHRvIGNhbGwgdGhlIGlvY3RsIGFnYWluLgorCitTb21lIGZsYWdzIGFyZSBpbnRlbnRpb25hbGx5IHZhZ3VlIGFuZCB3aWxsIGFsd2F5cyBiZSBzZXQgaW4gdGhlCitwcmVzZW5jZSBvZiBvdGhlciBtb3JlIHNwZWNpZmljIGZsYWdzLiBUaGlzIHdheSBhIHByb2dyYW0gbG9va2luZyBmb3IKK2EgZ2VuZXJhbCBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIHRvIGtub3cgYWxsIGV4aXN0aW5nIGFuZCBmdXR1cmUgZmxhZ3MKK3doaWNoIGltcGx5IHRoYXQgcHJvcGVydHkuCisKK0ZvciBleGFtcGxlLCBpZiBGSUVNQVBfRVhURU5UX0RBVEFfSU5MSU5FIG9yIEZJRU1BUF9FWFRFTlRfREFUQV9UQUlMCithcmUgc2V0LCBGSUVNQVBfRVhURU5UX05PVF9BTElHTkVEIHdpbGwgYWxzbyBiZSBzZXQuIEEgcHJvZ3JhbSBsb29raW5nCitmb3IgaW5saW5lIG9yIHRhaWwtcGFja2VkIGRhdGEgY2FuIGtleSBvbiB0aGUgc3BlY2lmaWMgZmxhZy4gU29mdHdhcmUKK3doaWNoIHNpbXBseSBjYXJlcyBub3QgdG8gdHJ5IG9wZXJhdGluZyBvbiBub24tYWxpZ25lZCBleHRlbnRzCitob3dldmVyLCBjYW4ganVzdCBrZXkgb24gRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRCwgYW5kIG5vdCBoYXZlIHRvCit3b3JyeSBhYm91dCBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIGZsYWdzIHdoaWNoIG1pZ2h0IGltcGx5IHVuYWxpZ25lZAorZGF0YS4gTm90ZSB0aGF0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZSAtIGl0IHdvdWxkIGJlIHZhbGlkIGZvcgorRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRCB0byBhcHBlYXIgYWxvbmUuCisKKyogRklFTUFQX0VYVEVOVF9MQVNUCitUaGlzIGlzIHRoZSBsYXN0IGV4dGVudCBpbiB0aGUgZmlsZS4gQSBtYXBwaW5nIGF0dGVtcHQgcGFzdCB0aGlzCitleHRlbnQgd2lsbCByZXR1cm4gbm90aGluZy4KKworKiBGSUVNQVBfRVhURU5UX1VOS05PV04KK1RoZSBsb2NhdGlvbiBvZiB0aGlzIGV4dGVudCBpcyBjdXJyZW50bHkgdW5rbm93bi4gVGhpcyBtYXkgaW5kaWNhdGUKK3RoZSBkYXRhIGlzIHN0b3JlZCBvbiBhbiBpbmFjY2Vzc2libGUgdm9sdW1lIG9yIHRoYXQgbm8gc3RvcmFnZSBoYXMKK2JlZW4gYWxsb2NhdGVkIGZvciB0aGUgZmlsZSB5ZXQuCisKKyogRklFTUFQX0VYVEVOVF9ERUxBTExPQworICAtIFRoaXMgd2lsbCBhbHNvIHNldCBGSUVNQVBfRVhURU5UX1VOS05PV04uCitEZWxheWVkIGFsbG9jYXRpb24gLSB3aGlsZSB0aGVyZSBpcyBkYXRhIGZvciB0aGlzIGV4dGVudCwgaXQncworcGh5c2ljYWwgbG9jYXRpb24gaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQuCisKKyogRklFTUFQX0VYVEVOVF9FTkNPREVECitUaGlzIGV4dGVudCBkb2VzIG5vdCBjb25zaXN0IG9mIHBsYWluIGZpbGVzeXN0ZW0gYmxvY2tzIGJ1dCBpcworZW5jb2RlZCAoZS5nLiBlbmNyeXB0ZWQgb3IgY29tcHJlc3NlZCkuICBSZWFkaW5nIHRoZSBkYXRhIGluIHRoaXMKK2V4dGVudCB2aWEgSS9PIHRvIHRoZSBibG9jayBkZXZpY2Ugd2lsbCBoYXZlIHVuZGVmaW5lZCByZXN1bHRzLgorCitOb3RlIHRoYXQgaXQgaXMgKmFsd2F5cyogdW5kZWZpbmVkIHRvIHRyeSB0byB1cGRhdGUgdGhlIGRhdGEKK2luLXBsYWNlIGJ5IHdyaXRpbmcgdG8gdGhlIGluZGljYXRlZCBsb2NhdGlvbiB3aXRob3V0IHRoZQorYXNzaXN0YW5jZSBvZiB0aGUgZmlsZXN5c3RlbSwgb3IgdG8gYWNjZXNzIHRoZSBkYXRhIHVzaW5nIHRoZQoraW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIEZJRU1BUCBpbnRlcmZhY2Ugd2hpbGUgdGhlIGZpbGVzeXN0ZW0KK2lzIG1vdW50ZWQuICBJbiBvdGhlciB3b3JkcywgdXNlciBhcHBsaWNhdGlvbnMgbWF5IG9ubHkgcmVhZCB0aGUKK2V4dGVudCBkYXRhIHZpYSBJL08gdG8gdGhlIGJsb2NrIGRldmljZSB3aGlsZSB0aGUgZmlsZXN5c3RlbSBpcwordW5tb3VudGVkLCBhbmQgdGhlbiBvbmx5IGlmIHRoZSBGSUVNQVBfRVhURU5UX0VOQ09ERUQgZmxhZyBpcworY2xlYXI7IHVzZXIgYXBwbGljYXRpb25zIG11c3Qgbm90IHRyeSByZWFkaW5nIG9yIHdyaXRpbmcgdG8gdGhlCitmaWxlc3lzdGVtIHZpYSB0aGUgYmxvY2sgZGV2aWNlIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzLgorCisqIEZJRU1BUF9FWFRFTlRfREFUQV9FTkNSWVBURUQKKyAgLSBUaGlzIHdpbGwgYWxzbyBzZXQgRklFTUFQX0VYVEVOVF9FTkNPREVECitUaGUgZGF0YSBpbiB0aGlzIGV4dGVudCBoYXMgYmVlbiBlbmNyeXB0ZWQgYnkgdGhlIGZpbGUgc3lzdGVtLgorCisqIEZJRU1BUF9FWFRFTlRfTk9UX0FMSUdORUQKK0V4dGVudCBvZmZzZXRzIGFuZCBsZW5ndGggYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGJsb2NrIGFsaWduZWQuCisKKyogRklFTUFQX0VYVEVOVF9EQVRBX0lOTElORQorICBUaGlzIHdpbGwgYWxzbyBzZXQgRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRAorRGF0YSBpcyBsb2NhdGVkIHdpdGhpbiBhIG1ldGEgZGF0YSBibG9jay4KKworKiBGSUVNQVBfRVhURU5UX0RBVEFfVEFJTAorICBUaGlzIHdpbGwgYWxzbyBzZXQgRklFTUFQX0VYVEVOVF9OT1RfQUxJR05FRAorRGF0YSBpcyBwYWNrZWQgaW50byBhIGJsb2NrIHdpdGggZGF0YSBmcm9tIG90aGVyIGZpbGVzLgorCisqIEZJRU1BUF9FWFRFTlRfVU5XUklUVEVOCitVbndyaXR0ZW4gZXh0ZW50IC0gdGhlIGV4dGVudCBpcyBhbGxvY2F0ZWQgYnV0IGl0J3MgZGF0YSBoYXMgbm90IGJlZW4KK2luaXRpYWxpemVkLiAgVGhpcyBpbmRpY2F0ZXMgdGhlIGV4dGVudCdzIGRhdGEgd2lsbCBiZSBhbGwgemVybyBpZiByZWFkCit0aHJvdWdoIHRoZSBmaWxlc3lzdGVtIGJ1dCB0aGUgY29udGVudHMgYXJlIHVuZGVmaW5lZCBpZiByZWFkIGRpcmVjdGx5IGZyb20KK3RoZSBkZXZpY2UuCisKKyogRklFTUFQX0VYVEVOVF9NRVJHRUQKK1RoaXMgd2lsbCBiZSBzZXQgd2hlbiBhIGZpbGUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBpLmUuLCBpdCB1c2VzIGEgYmxvY2sKK2Jhc2VkIGFkZHJlc3Npbmcgc2NoZW1lLiAgU2luY2UgcmV0dXJuaW5nIGFuIGV4dGVudCBmb3IgZWFjaCBibG9jayBiYWNrIHRvCit1c2Vyc3BhY2Ugd291bGQgYmUgaGlnaGx5IGluZWZmaWNpZW50LCB0aGUga2VybmVsIHdpbGwgdHJ5IHRvIG1lcmdlIG1vc3QKK2FkamFjZW50IGJsb2NrcyBpbnRvICdleHRlbnRzJy4KKworCitWRlMgLT4gRmlsZSBTeXN0ZW0gSW1wbGVtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGaWxlIHN5c3RlbXMgd2lzaGluZyB0byBzdXBwb3J0IGZpZW1hcCBtdXN0IGltcGxlbWVudCBhIC0+ZmllbWFwIGNhbGxiYWNrIG9uCit0aGVpciBpbm9kZV9vcGVyYXRpb25zIHN0cnVjdHVyZS4gVGhlIGZzIC0+ZmllbWFwIGNhbGwgaXMgcmVzcG9uc2libGUgZm9yCitkZWZpbmluZyBpdCdzIHNldCBvZiBzdXBwb3J0ZWQgZmllbWFwIGZsYWdzLCBhbmQgY2FsbGluZyBhIGhlbHBlciBmdW5jdGlvbiBvbgorZWFjaCBkaXNjb3ZlcmVkIGV4dGVudDoKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgeworICAgICAgIC4uLgorCisgICAgICAgaW50ICgqZmllbWFwKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqLCB1NjQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICB1NjQgbGVuKTsKKworLT5maWVtYXAgaXMgcGFzc2VkIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gd2hpY2ggZGVzY3JpYmVzIHRoZQorZmllbWFwIHJlcXVlc3Q6CisKK3N0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8geworCXVuc2lnbmVkIGludCBmaV9mbGFnczsJCS8qIEZsYWdzIGFzIHBhc3NlZCBmcm9tIHVzZXIgKi8KKwl1bnNpZ25lZCBpbnQgZmlfZXh0ZW50c19tYXBwZWQ7CS8qIE51bWJlciBvZiBtYXBwZWQgZXh0ZW50cyAqLworCXVuc2lnbmVkIGludCBmaV9leHRlbnRzX21heDsJLyogU2l6ZSBvZiBmaWVtYXBfZXh0ZW50IGFycmF5ICovCisJc3RydWN0IGZpZW1hcF9leHRlbnQgKmZpX2V4dGVudHNfc3RhcnQ7CS8qIFN0YXJ0IG9mIGZpZW1hcF9leHRlbnQgYXJyYXkgKi8KK307CisKK0l0IGlzIGludGVuZGVkIHRoYXQgdGhlIGZpbGUgc3lzdGVtIHNob3VsZCBub3QgbmVlZCB0byBhY2Nlc3MgYW55IG9mIHRoaXMKK3N0cnVjdHVyZSBkaXJlY3RseS4KKworCitGbGFnIGNoZWNraW5nIHNob3VsZCBiZSBkb25lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIC0+ZmllbWFwIGNhbGxiYWNrIHZpYSB0aGUKK2ZpZW1hcF9jaGVja19mbGFncygpIGhlbHBlcjoKKworaW50IGZpZW1hcF9jaGVja19mbGFncyhzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLCB1MzIgZnNfZmxhZ3MpOworCitUaGUgc3RydWN0IGZpZWluZm8gc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyByZWNpZXZlZCBmcm9tIGlvY3RsX2ZpZW1hcCgpLiBUaGUKK3NldCBvZiBmaWVtYXAgZmxhZ3Mgd2hpY2ggdGhlIGZzIHVuZGVyc3RhbmRzIHNob3VsZCBiZSBwYXNzZWQgdmlhIGZzX2ZsYWdzLiBJZgorZmllbWFwX2NoZWNrX2ZsYWdzIGZpbmRzIGludmFsaWQgdXNlciBmbGFncywgaXQgd2lsbCBwbGFjZSB0aGUgYmFkIHZhbHVlcyBpbgorZmllaW5mby0+ZmlfZmxhZ3MgYW5kIHJldHVybiAtRUJBRFIuIElmIHRoZSBmaWxlIHN5c3RlbSBnZXRzIC1FQkFEUiwgZnJvbQorZmllbWFwX2NoZWNrX2ZsYWdzKCksIGl0IHNob3VsZCBpbW1lZGlhdGVseSBleGl0LCByZXR1cm5pbmcgdGhhdCBlcnJvciBiYWNrIHRvCitpb2N0bF9maWVtYXAoKS4KKworCitGb3IgZWFjaCBleHRlbnQgaW4gdGhlIHJlcXVlc3QgcmFuZ2UsIHRoZSBmaWxlIHN5c3RlbSBzaG91bGQgY2FsbAordGhlIGhlbHBlciBmdW5jdGlvbiwgZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoKToKKworaW50IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmluZm8sIHU2NCBsb2dpY2FsLAorCQkJICAgIHU2NCBwaHlzLCB1NjQgbGVuLCB1MzIgZmxhZ3MsIHUzMiBkZXYpOworCitmaWVtYXBfZmlsbF9uZXh0X2V4dGVudCgpIHdpbGwgdXNlIHRoZSBwYXNzZWQgdmFsdWVzIHRvIHBvcHVsYXRlIHRoZQorbmV4dCBmcmVlIGV4dGVudCBpbiB0aGUgZm1fZXh0ZW50cyBhcnJheS4gJ0dlbmVyYWwnIGV4dGVudCBmbGFncyB3aWxsCithdXRvbWF0aWNhbGx5IGJlIHNldCBmcm9tIHNwZWNpZmljIGZsYWdzIG9uIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBmaWxlCitzeXN0ZW0gc28gdGhhdCB0aGUgdXNlcnNwYWNlIEFQSSBpcyBub3QgYnJva2VuLgorCitmaWVtYXBfZmlsbF9uZXh0X2V4dGVudCgpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgMSB3aGVuIHRoZQordXNlci1zdXBwbGllZCBmbV9leHRlbnRzIGFycmF5IGlzIGZ1bGwuIElmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkCit3aGlsZSBjb3B5aW5nIHRoZSBleHRlbnQgdG8gdXNlciBtZW1vcnksIC1FRkFVTFQgd2lsbCBiZSByZXR1cm5lZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzcm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25mc3Jvb3QudHh0CmluZGV4IDMxYjMyOTEuLjY4YmFkZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmZzcm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uZnNyb290LnR4dApAQCAtMTY5LDcgKzE2OSw3IEBACiAzLjEpICBCb290aW5nIGZyb20gYSBmbG9wcHkgdXNpbmcgc3lzbGludXgKIAogCVdoZW4gYnVpbGRpbmcga2VybmVscywgYW4gZWFzeSB3YXkgdG8gY3JlYXRlIGEgYm9vdCBmbG9wcHkgdGhhdCB1c2VzCi0Jc3lzbGludXggaXMgdG8gdXNlIHRoZSB6ZGlzayBvciBiemRpc2sgbWFrZSB0YXJnZXRzIHdoaWNoIHVzZQorCXN5c2xpbnV4IGlzIHRvIHVzZSB0aGUgemRpc2sgb3IgYnpkaXNrIG1ha2UgdGFyZ2V0cyB3aGljaCB1c2UgemltYWdlCiAgICAgICAJYW5kIGJ6aW1hZ2UgaW1hZ2VzIHJlc3BlY3RpdmVseS4gQm90aCB0YXJnZXRzIGFjY2VwdCB0aGUKICAgICAgCUZEQVJHUyBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CmluZGV4IGMzMThhOGIuLjQzNDBjYzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CkBAIC03NiwzICs3Niw5IEBACiAJCQlsYXJnZSwgdGhlIGZzIHdpbGwgc2lsZW50bHkgcmV2ZXJ0IGl0IHRvIHRoZSBkZWZhdWx0LgogCQkJTG9jYWxhbGxvYyBpcyBub3QgZW5hYmxlZCBmb3IgbG9jYWwgbW91bnRzLgogbG9jYWxmbG9ja3MJCVRoaXMgZGlzYWJsZXMgY2x1c3RlciBhd2FyZSBmbG9jay4KK2lub2RlNjQJCQlJbmRpY2F0ZXMgdGhhdCBPY2ZzMiBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBpbm9kZXMgYXQKKwkJCWFueSBsb2NhdGlvbiBpbiB0aGUgZmlsZXN5c3RlbSwgaW5jbHVkaW5nIHRob3NlIHdoaWNoCisJCQl3aWxsIHJlc3VsdCBpbiBpbm9kZSBudW1iZXJzIG9jY3VweWluZyBtb3JlIHRoYW4gMzIKKwkJCWJpdHMgb2Ygc2lnbmlmaWNhbmNlLgordXNlcl94YXR0cgkoKikJRW5hYmxlcyBFeHRlbmRlZCBVc2VyIEF0dHJpYnV0ZXMuCitub3VzZXJfeGF0dHIJCURpc2FibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDM5NGViMmMuLmMwMzJiZjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtOTIzLDQ1ICs5MjMsNDQgQEAKIFRoZSAgICJwcm9jc19ibG9ja2VkIiBsaW5lIGdpdmVzICB0aGUgIG51bWJlciBvZiAgcHJvY2Vzc2VzIGN1cnJlbnRseSBibG9ja2VkLAogd2FpdGluZyBmb3IgSS9PIHRvIGNvbXBsZXRlLgogCisKIDEuOSBFeHQ0IGZpbGUgc3lzdGVtIHBhcmFtZXRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRXh0NCBmaWxlIHN5c3RlbSBoYXZlIG9uZSBkaXJlY3RvcnkgcGVyIHBhcnRpdGlvbiB1bmRlciAvcHJvYy9mcy9leHQ0LwotIyBscyAvcHJvYy9mcy9leHQ0L2hkYy8KLWdyb3VwX3ByZWFsbG9jICBtYXhfdG9fc2NhbiAgbWJfZ3JvdXBzICBtYl9oaXN0b3J5ICBtaW5fdG9fc2NhbiAgb3JkZXIyX3JlcQotc3RhdHMgIHN0cmVhbV9yZXEKIAotbWJfZ3JvdXBzOgotVGhpcyBmaWxlIGdpdmVzIHRoZSBkZXRhaWxzIG9mIG11bHRpYmxvY2sgYWxsb2NhdG9yIGJ1ZGR5IGNhY2hlIG9mIGZyZWUgYmxvY2tzCitJbmZvcm1hdGlvbiBhYm91dCBtb3VudGVkIGV4dDQgZmlsZSBzeXN0ZW1zIGNhbiBiZSBmb3VuZCBpbgorL3Byb2MvZnMvZXh0NC4gIEVhY2ggbW91bnRlZCBmaWxlc3lzdGVtIHdpbGwgaGF2ZSBhIGRpcmVjdG9yeSBpbgorL3Byb2MvZnMvZXh0NCBiYXNlZCBvbiBpdHMgZGV2aWNlIG5hbWUgKGkuZS4sIC9wcm9jL2ZzL2V4dDQvaGRjIG9yCisvcHJvYy9mcy9leHQ0L2RtLTApLiAgIFRoZSBmaWxlcyBpbiBlYWNoIHBlci1kZXZpY2UgZGlyZWN0b3J5IGFyZSBzaG93bgoraW4gVGFibGUgMS0xMCwgYmVsb3cuCiAKLW1iX2hpc3Rvcnk6Ci1NdWx0aWJsb2NrIGFsbG9jYXRpb24gaGlzdG9yeS4KK1RhYmxlIDEtMTA6IEZpbGVzIGluIC9wcm9jL2ZzL2V4dDQvPGRldm5hbWU+CisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyBGaWxlICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBtYl9ncm91cHMgICAgICAgZGV0YWlscyBvZiBtdWx0aWJsb2NrIGFsbG9jYXRvciBidWRkeSBjYWNoZSBvZiBmcmVlIGJsb2NrcworIG1iX2hpc3RvcnkgICAgICBtdWx0aWJsb2NrIGFsbG9jYXRpb24gaGlzdG9yeQorIHN0YXRzICAgICAgICAgICBjb250cm9scyB3aGV0aGVyIHRoZSBtdWx0aWJsb2NrIGFsbG9jYXRvciBzaG91bGQgc3RhcnQKKyAgICAgICAgICAgICAgICAgY29sbGVjdGluZyBzdGF0aXN0aWNzLCB3aGljaCBhcmUgc2hvd24gZHVyaW5nIHRoZSB1bm1vdW50CisgZ3JvdXBfcHJlYWxsb2MgIHRoZSBtdWx0aWJsb2NrIGFsbG9jYXRvciB3aWxsIHJvdW5kIHVwIGFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgcmVxdWVzdHMgdG8gYSBtdWx0aXBsZSBvZiB0aGlzIHR1bmluZyBwYXJhbWV0ZXIgaWYgdGhlCisgICAgICAgICAgICAgICAgIHN0cmlwZSBzaXplIGlzIG5vdCBzZXQgaW4gdGhlIGV4dDQgc3VwZXJibG9jaworIG1heF90b19zY2FuICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXh0ZW50cyB0aGUgbXVsdGlibG9jayBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgd2lsbCBzZWFyY2ggdG8gZmluZCB0aGUgYmVzdCBleHRlbnQKKyBtaW5fdG9fc2NhbiAgICAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGV4dGVudHMgdGhlIG11bHRpYmxvY2sgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgIHdpbGwgc2VhcmNoIHRvIGZpbmQgdGhlIGJlc3QgZXh0ZW50Cisgb3JkZXIyX3JlcSAgICAgIFR1bmluZyBwYXJhbWV0ZXIgd2hpY2ggY29udHJvbHMgdGhlIG1pbmltdW0gc2l6ZSBmb3IgCisgICAgICAgICAgICAgICAgIHJlcXVlc3RzIChhcyBhIHBvd2VyIG9mIDIpIHdoZXJlIHRoZSBidWRkeSBjYWNoZSBpcworICAgICAgICAgICAgICAgICB1c2VkCisgc3RyZWFtX3JlcSAgICAgIEZpbGVzIHdoaWNoIGhhdmUgZmV3ZXIgYmxvY2tzIHRoYW4gdGhpcyB0dW5hYmxlCisgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB3aWxsIGhhdmUgdGhlaXIgYmxvY2tzIGFsbG9jYXRlZCBvdXQgb2YgYQorICAgICAgICAgICAgICAgICBibG9jayBncm91cCBzcGVjaWZpYyBwcmVhbGxvY2F0aW9uIHBvb2wsIHNvIHRoYXQgc21hbGwKKyAgICAgICAgICAgICAgICAgZmlsZXMgYXJlIHBhY2tlZCBjbG9zZWx5IHRvZ2V0aGVyLiAgRWFjaCBsYXJnZSBmaWxlCisgICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSBpdHMgYmxvY2tzIGFsbG9jYXRlZCBvdXQgb2YgaXRzIG93biB1bmlxdWUKKyAgICAgICAgICAgICAgICAgcHJlYWxsb2NhdGlvbiBwb29sLgoraW5vZGVfcmVhZGFoZWFkICBUdW5pbmcgcGFyYW1ldGVyIHdoaWNoIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAgICAgICAgICAgICAgICBpbm9kZSB0YWJsZSBibG9ja3MgdGhhdCBleHQ0J3MgaW5vZGUgdGFibGUgcmVhZGFoZWFkCisgICAgICAgICAgICAgICAgIGFsZ29yaXRobSB3aWxsIHByZS1yZWFkIGludG8gdGhlIGJ1ZmZlciBjYWNoZQorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKLXN0YXRzOgotVGhpcyBmaWxlIGluZGljYXRlIHdoZXRoZXIgdGhlIG11bHRpYmxvY2sgYWxsb2NhdG9yIHNob3VsZCBzdGFydCBjb2xsZWN0aW5nCi1zdGF0aXN0aWNzLiBUaGUgc3RhdGlzdGljcyBhcmUgc2hvd24gZHVyaW5nIHVubW91bnQKLQotZ3JvdXBfcHJlYWxsb2M6Ci1UaGUgbXVsdGlibG9jayBhbGxvY2F0b3Igbm9ybWFsaXplIHRoZSBibG9jayBhbGxvY2F0aW9uIHJlcXVlc3QgdG8KLWdyb3VwX3ByZWFsbG9jIGZpbGVzeXN0ZW0gYmxvY2tzIGlmIHdlIGRvbid0IGhhdmUgc3RyaXAgdmFsdWUgc2V0LgotVGhlIHN0cmlwZSB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGF0IG1vdW50IHRpbWUgb3IgZHVyaW5nIG1rZTJmcy4KLQotbWF4X3RvX3NjYW46Ci1Ib3cgbG9uZyBtdWx0aWJsb2NrIGFsbG9jYXRvciBjYW4gbG9vayBmb3IgYSBiZXN0IGV4dGVudCAoaW4gZm91bmQgZXh0ZW50cykKLQotbWluX3RvX3NjYW46Ci1Ib3cgbG9uZyBtdWx0aWJsb2NrIGFsbG9jYXRvciAgbXVzdCBsb29rIGZvciBhIGJlc3QgZXh0ZW50Ci0KLW9yZGVyMl9yZXE6Ci1NdWx0aWJsb2NrIGFsbG9jYXRvciB1c2UgIDJeTiBzZWFyY2ggdXNpbmcgYnVkZGllcyBvbmx5IGZvciByZXF1ZXN0cyBncmVhdGVyCi10aGFuIG9yIGVxdWFsIHRvIG9yZGVyMl9yZXEuIFRoZSByZXF1ZXN0IHNpemUgaXMgc3BlY2ZpZWQgaW4gZmlsZSBzeXN0ZW0KLWJsb2Nrcy4gQSB2YWx1ZSBvZiAyIGluZGljYXRlIG9ubHkgaWYgdGhlIHJlcXVlc3RzIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLXRvIDQgYmxvY2tzLgotCi1zdHJlYW1fcmVxOgotRmlsZXMgc21hbGxlciB0aGFuIHN0cmVhbV9yZXEgYXJlIHNlcnZlZCBieSB0aGUgc3RyZWFtIGFsbG9jYXRvciwgd2hvc2UKLXB1cnBvc2UgaXMgdG8gcGFjayByZXF1ZXN0cyBhcyBjbG9zZSBlYWNoIHRvIG90aGVyIGFzIHBvc3NpYmxlIHRvCi1wcm9kdWNlIHNtb290aCBJL08gdHJhZmZpYy4gQXZhbHVlIG9mIDE2IGluZGljYXRlIHRoYXQgZmlsZSBzbWFsbGVyIHRoYW4gMTYKLWZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSB3aWxsIHVzZSBncm91cCBiYXNlZCBwcmVhbGxvY2F0aW9uLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1bW1hcnkKQEAgLTEzMjIsNiArMTMyMSwxOCBAQAogTk1JIHN3aXRjaCB0aGF0IG1vc3QgSUEzMiBzZXJ2ZXJzIGhhdmUgZmlyZXMgdW5rbm93biBOTUkgdXAsIGZvciBleGFtcGxlLgogSWYgYSBzeXN0ZW0gaGFuZ3MgdXAsIHRyeSBwcmVzc2luZyB0aGUgTk1JIHN3aXRjaC4KIAorcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRlZmF1bHQgTGludXggYmVoYXZpb3VyIG9uIGFuIE5NSSBvZiBlaXRoZXIgbWVtb3J5IG9yIHVua25vd24gaXMgdG8gY29udGludWUKK29wZXJhdGlvbi4gRm9yIG1hbnkgZW52aXJvbm1lbnRzIHN1Y2ggYXMgc2NpZW50aWZpYyBjb21wdXRpbmcgaXQgaXMgcHJlZmVyYWJsZQordGhhdCB0aGUgYm94IGlzIHRha2VuIG91dCBhbmQgdGhlIGVycm9yIGRlYWx0IHdpdGggdGhhbiBhbiB1bmNvcnJlY3RlZAorcGFyaXR5L0VDQyBlcnJvciBnZXQgcHJvcG9nYXRlZC4KKworQSBzbWFsbCBudW1iZXIgb2Ygc3lzdGVtcyBkbyBnZW5lcmF0ZSBOTUkncyBmb3IgYml6YXJyZSByYW5kb20gcmVhc29ucyBzdWNoIGFzCitwb3dlciBtYW5hZ2VtZW50IHNvIHRoZSBkZWZhdWx0IGlzIG9mZi4gVGhhdCBzeXNjdGwgd29ya3MgbGlrZSB0aGUgZXhpc3RpbmcKK3BhbmljIGNvbnRyb2xzIGFscmVhZHkgaW4gdGhhdCBkaXJlY3RvcnkuCisKIG5taV93YXRjaGRvZwogLS0tLS0tLS0tLS0tCiAKQEAgLTEzMzIsMTMgKzEzNDMsNiBAQAogQmVjYXVzZSB0aGUgTk1JIHdhdGNoZG9nIHNoYXJlcyByZWdpc3RlcnMgd2l0aCBvcHJvZmlsZSwgYnkgZGlzYWJsaW5nIHRoZSBOTUkKIHdhdGNoZG9nLCBvcHJvZmlsZSBtYXkgaGF2ZSBtb3JlIHJlZ2lzdGVycyB0byB1dGlsaXplLgogCi1tYXBzX3Byb3RlY3QKLS0tLS0tLS0tLS0tLQotCi1FbmFibGVzL0Rpc2FibGVzIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBwZXItcHJvY2VzcyBwcm9jIGVudHJpZXMgIm1hcHMiIGFuZAotInNtYXBzIi4gIFdoZW4gZW5hYmxlZCwgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIGZpbGVzIGFyZSB2aXNpYmxlIG9ubHkgdG8KLXJlYWRlcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBwdHJhY2UoKSB0aGUgZ2l2ZW4gcHJvY2Vzcy4KLQogbXNnbW5pCiAtLS0tLS0KIApAQCAtMjQxMyw2ICsyNDE3LDggQEAKICAgLSAoYml0IDEpIGFub255bW91cyBzaGFyZWQgbWVtb3J5CiAgIC0gKGJpdCAyKSBmaWxlLWJhY2tlZCBwcml2YXRlIG1lbW9yeQogICAtIChiaXQgMykgZmlsZS1iYWNrZWQgc2hhcmVkIG1lbW9yeQorICAtIChiaXQgNCkgRUxGIGhlYWRlciBwYWdlcyBpbiBmaWxlLWJhY2tlZCBwcml2YXRlIG1lbW9yeSBhcmVhcyAoaXQgaXMKKyAgICAgICAgICAgIGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBiaXQgMiBpcyBjbGVhcmVkKQogCiAgIE5vdGUgdGhhdCBNTUlPIHBhZ2VzIHN1Y2ggYXMgZnJhbWUgYnVmZmVyIGFyZSBuZXZlciBkdW1wZWQgYW5kIHZEU08gcGFnZXMKICAgYXJlIGFsd2F5cyBkdW1wZWQgcmVnYXJkbGVzcyBvZiB0aGUgYml0bWFzayBzdGF0dXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yYW1mcy1yb290ZnMtaW5pdHJhbWZzLnR4dAppbmRleCA3YmUyMzJiLi42MmZlOWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmFtZnMtcm9vdGZzLWluaXRyYW1mcy50eHQKQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgIHNsZWVwKDk5OTk5OTk5OSk7CiAgIH0KICAgRU9GCi0gIGdjYyAtc3RhdGljIGhlbGxvMi5jIC1vIGluaXQKKyAgZ2NjIC1zdGF0aWMgaGVsbG8uYyAtbyBpbml0CiAgIGVjaG8gaW5pdCB8IGNwaW8gLW8gLUggbmV3YyB8IGd6aXAgPiB0ZXN0LmNwaW8uZ3oKICAgIyBUZXN0aW5nIGV4dGVybmFsIGluaXRyYW1mcyB1c2luZyB0aGUgaW5pdHJkIGxvYWRpbmcgbWVjaGFuaXNtLgogICBxZW11IC1rZXJuZWwgL2Jvb3Qvdm1saW51eiAtaW5pdHJkIHRlc3QuY3Bpby5neiAvZGV2L3plcm8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CmluZGV4IDE4MDIyZTIuLmIxYjk4ODcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dApAQCAtMjQwLDYgKzI0MCwxMCBAQAogbmVlZGVkIHRvIG1hbmFnZSBhIHNpZ25hbCB0aGF0J3MgaW4gYWN0aXZlIHVzZS4gIFRoYXQgaXMsIHJlcXVlc3RpbmcgYQogR1BJTyBjYW4gc2VydmUgYXMgYSBraW5kIG9mIGxvY2suCiAKK1NvbWUgcGxhdGZvcm1zIG1heSBhbHNvIHVzZSBrbm93bGVkZ2UgYWJvdXQgd2hhdCBHUElPcyBhcmUgYWN0aXZlIGZvcgorcG93ZXIgbWFuYWdlbWVudCwgc3VjaCBhcyBieSBwb3dlcmluZyBkb3duIHVudXNlZCBjaGlwIHNlY3RvcnMgYW5kLCBtb3JlCitlYXNpbHksIGdhdGluZyBvZmYgdW51c2VkIGNsb2Nrcy4KKwogVGhlc2UgdHdvIGNhbGxzIGFyZSBvcHRpb25hbCBiZWNhdXNlIG5vdCBub3QgYWxsIGN1cnJlbnQgTGludXggcGxhdGZvcm1zCiBvZmZlciBzdWNoIGZ1bmN0aW9uYWxpdHkgaW4gdGhlaXIgR1BJTyBzdXBwb3J0OyBhIHZhbGlkIGltcGxlbWVudGF0aW9uCiBjb3VsZCByZXR1cm4gc3VjY2VzcyBmb3IgYWxsIGdwaW9fcmVxdWVzdCgpIGNhbGxzLiAgVW5saWtlIHRoZSBvdGhlciBjYWxscywKQEAgLTI2NCw3ICsyNjgsNyBAQAogCS8qIG1hcCBHUElPIG51bWJlcnMgdG8gSVJRIG51bWJlcnMgKi8KIAlpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7CiAKLQkvKiBtYXAgSVJRIG51bWJlcnMgdG8gR1BJTyBudW1iZXJzICovCisJLyogbWFwIElSUSBudW1iZXJzIHRvIEdQSU8gbnVtYmVycyAoYXZvaWQgdXNpbmcgdGhpcykgKi8KIAlpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKTsKIAogVGhvc2UgcmV0dXJuIGVpdGhlciB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgaW4gdGhlIG90aGVyIG5hbWVzcGFjZSwgb3IKQEAgLTI4NCw3ICsyODgsOCBAQAogCiBOb24tZXJyb3IgdmFsdWVzIHJldHVybmVkIGZyb20gaXJxX3RvX2dwaW8oKSB3b3VsZCBtb3N0IGNvbW1vbmx5IGJlIHVzZWQKIHdpdGggZ3Bpb19nZXRfdmFsdWUoKSwgZm9yIGV4YW1wbGUgdG8gaW5pdGlhbGl6ZSBvciB1cGRhdGUgZHJpdmVyIHN0YXRlCi13aGVuIHRoZSBJUlEgaXMgZWRnZS10cmlnZ2VyZWQuCit3aGVuIHRoZSBJUlEgaXMgZWRnZS10cmlnZ2VyZWQuICBOb3RlIHRoYXQgc29tZSBwbGF0Zm9ybXMgZG9uJ3Qgc3VwcG9ydAordGhpcyByZXZlcnNlIG1hcHBpbmcsIHNvIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgaXQuCiAKIAogRW11bGF0aW5nIE9wZW4gRHJhaW4gU2lnbmFscwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ocGV0LnR4dCBiL0RvY3VtZW50YXRpb24vaHBldC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDUyZDkuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9ocGV0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0JCUhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIERyaXZlciBmb3IgTGludXgKLQotVGhlIEhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIChIUEVUKSBoYXJkd2FyZSBpcyB0aGUgZnV0dXJlIHJlcGxhY2VtZW50Ci1mb3IgdGhlIDgyNTQgYW5kIFJlYWwgVGltZSBDbG9jayAoUlRDKSBwZXJpb2RpYyB0aW1lciBmdW5jdGlvbmFsaXR5LgotRWFjaCBIUEVUIGNhbiBoYXZlIHVwIHRvIDMyIHRpbWVycy4gIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUKLWZpcnN0IHR3byB0aW1lcnMgYXMgbGVnYWN5IHJlcGxhY2VtZW50cyBmb3IgODI1NCBhbmQgUlRDIHBlcmlvZGljIHRpbWVycy4KLUEgc3BlY2lmaWNhdGlvbiBkb25lIGJ5IEludGVsIGFuZCBNaWNyb3NvZnQgY2FuIGJlIGZvdW5kIGF0Ci08aHR0cDovL3d3dy5pbnRlbC5jb20vdGVjaG5vbG9neS9hcmNoaXRlY3R1cmUvaHBldHNwZWMuaHRtPi4KLQotVGhlIGRyaXZlciBzdXBwb3J0cyBkZXRlY3Rpb24gb2YgSFBFVCBkcml2ZXIgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24KLW9mIHRoZSBIUEVUIGJlZm9yZSB0aGUgZHJpdmVyIG1vZHVsZV9pbml0IHJvdXRpbmUgaXMgY2FsbGVkLiAgVGhpcyBlbmFibGVzCi1wbGF0Zm9ybSBjb2RlIHdoaWNoIHVzZXMgdGltZXIgMCBvciAxIGFzIHRoZSBtYWluIHRpbWVyIHRvIGludGVyY2VwdCBIUEVUCi1pbml0aWFsaXphdGlvbi4gIEFuIGV4YW1wbGUgb2YgdGhpcyBpbml0aWFsaXphdGlvbiBjYW4gYmUgZm91bmQgaW4KLWFyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMuCi0KLVRoZSBkcml2ZXIgcHJvdmlkZXMgdHdvIEFQSXMgd2hpY2ggYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgQVBJIGZvdW5kIGluCi10aGUgcnRjLmMgZHJpdmVyLiAgVGhlcmUgaXMgYSB1c2VyIHNwYWNlIEFQSSBhbmQgYSBrZXJuZWwgc3BhY2UgQVBJLgotQW4gZXhhbXBsZSB1c2VyIHNwYWNlIHByb2dyYW0gaXMgcHJvdmlkZWQgYmVsb3cuCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+Ci0KLQotZXh0ZXJuIHZvaWQgaHBldF9vcGVuX2Nsb3NlKGludCwgY29uc3QgY2hhciAqKik7Ci1leHRlcm4gdm9pZCBocGV0X2luZm8oaW50LCBjb25zdCBjaGFyICoqKTsKLWV4dGVybiB2b2lkIGhwZXRfcG9sbChpbnQsIGNvbnN0IGNoYXIgKiopOwotZXh0ZXJuIHZvaWQgaHBldF9mYXN5bmMoaW50LCBjb25zdCBjaGFyICoqKTsKLWV4dGVybiB2b2lkIGhwZXRfcmVhZChpbnQsIGNvbnN0IGNoYXIgKiopOwotCi0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotc3RydWN0IGhwZXRfY29tbWFuZCB7Ci0JY2hhcgkJKmNvbW1hbmQ7Ci0Jdm9pZAkJKCpmdW5jKShpbnQgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2KTsKLX0gaHBldF9jb21tYW5kW10gPSB7Ci0JewotCQkib3Blbi1jbG9zZSIsCi0JCWhwZXRfb3Blbl9jbG9zZQotCX0sCi0JewotCQkiaW5mbyIsCi0JCWhwZXRfaW5mbwotCX0sCi0JewotCQkicG9sbCIsCi0JCWhwZXRfcG9sbAotCX0sCi0JewotCQkiZmFzeW5jIiwKLQkJaHBldF9mYXN5bmMKLQl9LAotfTsKLQotaW50Ci1tYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqIGFyZ3YpCi17Ci0JaW50CWk7Ci0KLQlhcmdjLS07Ci0JYXJndisrOwotCi0JaWYgKCFhcmdjKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiLWhwZXQ6IHJlcXVpcmVzIGNvbW1hbmRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoaHBldF9jb21tYW5kKSAvIHNpemVvZiAoaHBldF9jb21tYW5kWzBdKSk7IGkrKykKLQkJaWYgKCFzdHJjbXAoYXJndlswXSwgaHBldF9jb21tYW5kW2ldLmNvbW1hbmQpKSB7Ci0JCQlhcmdjLS07Ci0JCQlhcmd2Kys7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIi1ocGV0OiBleGVjdXRpbmcgJXNcbiIsCi0JCQkJaHBldF9jb21tYW5kW2ldLmNvbW1hbmQpOwotCQkJaHBldF9jb21tYW5kW2ldLmZ1bmMoYXJnYywgYXJndik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JZnByaW50ZihzdGRlcnIsICJkb19ocGV0OiBjb21tYW5kICVzIG5vdCBpbXBsZW1lbnRlZFxuIiwgYXJndlswXSk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQKLWhwZXRfb3Blbl9jbG9zZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCi17Ci0JaW50CWZkOwotCi0JaWYgKGFyZ2MgIT0gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfb3Blbl9jbG9zZTogZGV2aWNlLW5hbWVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKLQlpZiAoZmQgPCAwKQotCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfb3Blbl9jbG9zZTogb3BlbiBmYWlsZWRcbiIpOwotCWVsc2UKLQkJY2xvc2UoZmQpOwotCi0JcmV0dXJuOwotfQotCi12b2lkCi1ocGV0X2luZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQotewotfQotCi12b2lkCi1ocGV0X3BvbGwoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQotewotCXVuc2lnbmVkIGxvbmcJCWZyZXE7Ci0JaW50CQkJaXRlcmF0aW9ucywgaSwgZmQ7Ci0Jc3RydWN0IHBvbGxmZAkJcGZkOwotCXN0cnVjdCBocGV0X2luZm8JaW5mbzsKLQlzdHJ1Y3QgdGltZXZhbAkJc3R2LCBldHY7Ci0Jc3RydWN0IHRpbWV6b25lCQl0ejsKLQlsb25nCQkJdXNlYzsKLQotCWlmIChhcmdjICE9IDMpIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IGRldmljZS1uYW1lIGZyZXEgaXRlcmF0aW9uc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcmVxID0gYXRvaShhcmd2WzFdKTsKLQlpdGVyYXRpb25zID0gYXRvaShhcmd2WzJdKTsKLQotCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWSk7Ci0KLQlpZiAoZmQgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBvcGVuIG9mICVzIGZhaWxlZFxuIiwgYXJndlswXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW9jdGwoZmQsIEhQRVRfSVJRRlJFUSwgZnJlcSkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBIUEVUX0lSUUZSRVEgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGlvY3RsKGZkLCBIUEVUX0lORk8sICZpbmZvKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IGZhaWxlZCB0byBnZXQgaW5mb1xuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBpbmZvLmhpX2ZsYWdzIDB4JWx4XG4iLCBpbmZvLmhpX2ZsYWdzKTsKLQotCWlmIChpbmZvLmhpX2ZsYWdzICYmIChpb2N0bChmZCwgSFBFVF9FUEksIDApIDwgMCkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IEhQRVRfRVBJIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChpb2N0bChmZCwgSFBFVF9JRV9PTiwgMCkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsLCBIUEVUX0lFX09OIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXBmZC5mZCA9IGZkOwotCXBmZC5ldmVudHMgPSBQT0xMSU47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0JCXBmZC5yZXZlbnRzID0gMDsKLQkJZ2V0dGltZW9mZGF5KCZzdHYsICZ0eik7Ci0JCWlmIChwb2xsKCZwZmQsIDEsIC0xKSA8IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogcG9sbCBmYWlsZWRcbiIpOwotCQllbHNlIHsKLQkJCWxvbmcgCWRhdGE7Ci0KLQkJCWdldHRpbWVvZmRheSgmZXR2LCAmdHopOwotCQkJdXNlYyA9IHN0di50dl9zZWMgKiAxMDAwMDAwICsgc3R2LnR2X3VzZWM7Ci0JCQl1c2VjID0gKGV0di50dl9zZWMgKiAxMDAwMDAwICsgZXR2LnR2X3VzZWMpIC0gdXNlYzsKLQotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJImhwZXRfcG9sbDogZXhwaXJlZCB0aW1lID0gMHglbHhcbiIsIHVzZWMpOwotCi0JCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogcmV2ZW50cyA9IDB4JXhcbiIsCi0JCQkJcGZkLnJldmVudHMpOwotCi0JCQlpZiAocmVhZChmZCwgJmRhdGEsIHNpemVvZihkYXRhKSkgIT0gc2l6ZW9mKGRhdGEpKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IHJlYWQgZmFpbGVkXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogZGF0YSAweCVseFxuIiwKLQkJCQkJZGF0YSk7Ci0JCX0KLQl9Ci0KLW91dDoKLQljbG9zZShmZCk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGhwZXRfc2lnaW9fY291bnQ7Ci0KLXN0YXRpYyB2b2lkCi1ocGV0X3NpZ2lvKGludCB2YWwpCi17Ci0JZnByaW50ZihzdGRlcnIsICJocGV0X3NpZ2lvOiBjYWxsZWRcbiIpOwotCWhwZXRfc2lnaW9fY291bnQrKzsKLX0KLQotdm9pZAotaHBldF9mYXN5bmMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQotewotCXVuc2lnbmVkIGxvbmcJCWZyZXE7Ci0JaW50CQkJaXRlcmF0aW9ucywgaSwgZmQsIHZhbHVlOwotCXNpZ190CQkJb2xkc2lnOwotCXN0cnVjdCBocGV0X2luZm8JaW5mbzsKLQotCWhwZXRfc2lnaW9fY291bnQgPSAwOwotCWZkID0gLTE7Ci0KLQlpZiAoKG9sZHNpZyA9IHNpZ25hbChTSUdJTywgaHBldF9zaWdpbykpID09IFNJR19FUlIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogZmFpbGVkIHRvIHNldCBzaWduYWwgaGFuZGxlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXJnYyAhPSAzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IGRldmljZS1uYW1lIGZyZXEgaXRlcmF0aW9uc1xuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWSk7Ci0KLQlpZiAoZmQgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IGZhaWxlZCB0byBvcGVuICVzXG4iLCBhcmd2WzBdKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JaWYgKChmY250bChmZCwgRl9TRVRPV04sIGdldHBpZCgpKSA9PSAxKSB8fAotCQkoKHZhbHVlID0gZmNudGwoZmQsIEZfR0VURkwpKSA9PSAxKSB8fAotCQkoZmNudGwoZmQsIEZfU0VURkwsIHZhbHVlIHwgT19BU1lOQykgPT0gMSkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogZmNudGwgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZnJlcSA9IGF0b2koYXJndlsxXSk7Ci0JaXRlcmF0aW9ucyA9IGF0b2koYXJndlsyXSk7Ci0KLQlpZiAoaW9jdGwoZmQsIEhQRVRfSVJRRlJFUSwgZnJlcSkgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IEhQRVRfSVJRRlJFUSBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoaW9jdGwoZmQsIEhQRVRfSU5GTywgJmluZm8pIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBmYWlsZWQgdG8gZ2V0IGluZm9cbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBpbmZvLmhpX2ZsYWdzIDB4JWx4XG4iLCBpbmZvLmhpX2ZsYWdzKTsKLQotCWlmIChpbmZvLmhpX2ZsYWdzICYmIChpb2N0bChmZCwgSFBFVF9FUEksIDApIDwgMCkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogSFBFVF9FUEkgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGlvY3RsKGZkLCBIUEVUX0lFX09OLCAwKSA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYywgSFBFVF9JRV9PTiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0JCSh2b2lkKSBwYXVzZSgpOwotCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBjb3VudCA9ICVkXG4iLCBocGV0X3NpZ2lvX2NvdW50KTsKLQl9Ci0KLW91dDoKLQlzaWduYWwoU0lHSU8sIG9sZHNpZyk7Ci0KLQlpZiAoZmQgPj0gMCkKLQkJY2xvc2UoZmQpOwotCi0JcmV0dXJuOwotfQotCi1UaGUga2VybmVsIEFQSSBoYXMgdGhyZWUgaW50ZXJmYWNlcyBleHBvcnRlZCBmcm9tIHRoZSBkcml2ZXI6Ci0KLQlocGV0X3JlZ2lzdGVyKHN0cnVjdCBocGV0X3Rhc2sgKnRwLCBpbnQgcGVyaW9kaWMpCi0JaHBldF91bnJlZ2lzdGVyKHN0cnVjdCBocGV0X3Rhc2sgKnRwKQotCWhwZXRfY29udHJvbChzdHJ1Y3QgaHBldF90YXNrICp0cCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0KLVRoZSBrZXJuZWwgbW9kdWxlIHVzaW5nIHRoaXMgaW50ZXJmYWNlIGZpbGxzIGluIHRoZSBodF9mdW5jIGFuZCBodF9kYXRhCi1tZW1iZXJzIG9mIHRoZSBocGV0X3Rhc2sgc3RydWN0dXJlIGJlZm9yZSBjYWxsaW5nIGhwZXRfcmVnaXN0ZXIuCi1ocGV0X2NvbnRyb2wgc2ltcGx5IHZlY3RvcnMgdG8gdGhlIGhwZXRfaW9jdGwgcm91dGluZSBhbmQgaGFzIHRoZSBzYW1lCi1jb21tYW5kcyBhbmQgcmVzcGVjdGl2ZSBhcmd1bWVudHMgYXMgdGhlIHVzZXIgQVBJLiAgaHBldF91bnJlZ2lzdGVyCi1pcyB1c2VkIHRvIHRlcm1pbmF0ZSB1c2FnZSBvZiB0aGUgSFBFVCB0aW1lciByZXNlcnZlZCBieSBocGV0X3JlZ2lzdGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDczIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDczCmluZGV4IDIxMjZkZTMuLjFjYmY2NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzMKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBBbmFsb2cgRGV2aWNlcyBBRFQ3NDczIGNoaXAgZmFtaWx5LgogCi1UaGUgTE04NSB1c2VzIHRoZSAyLXdpcmUgaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgU01CVVMgMi4wCitUaGUgQURUNzQ3MyB1c2VzIHRoZSAyLXdpcmUgaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgU01CVVMgMi4wCiBzcGVjaWZpY2F0aW9uLiBVc2luZyBhbiBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXIgaXQgbWVhc3VyZXMgdGhyZWUgKDMpCi10ZW1wZXJhdHVyZXMgYW5kIHR3byAoMikgdm9sdGFnZXMuIEl0IGhhcyB0aHJlZSAoMykgMTYtYml0IGNvdW50ZXJzIGZvcgordGVtcGVyYXR1cmVzIGFuZCB0d28gKDIpIHZvbHRhZ2VzLiBJdCBoYXMgZm91ciAoNCkgMTYtYml0IGNvdW50ZXJzIGZvcgogbWVhc3VyaW5nIGZhbiBzcGVlZC4gVGhlcmUgYXJlIHRocmVlICgzKSBQV00gb3V0cHV0cyB0aGF0IGNhbiBiZSB1c2VkCiB0byBjb250cm9sIGZhbiBzcGVlZC4KIAogQSBzb3BoaXN0aWNhdGVkIGNvbnRyb2wgc3lzdGVtIGZvciB0aGUgUFdNIG91dHB1dHMgaXMgZGVzaWduZWQgaW50byB0aGUKLUxNODUgdGhhdCBhbGxvd3MgZmFuIHNwZWVkIHRvIGJlIGFkanVzdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gYW55IG9mIHRoZQorQURUNzQ3MyB0aGF0IGFsbG93cyBmYW4gc3BlZWQgdG8gYmUgYWRqdXN0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiBhbnkgb2YgdGhlCiB0aHJlZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLiBFYWNoIFBXTSBvdXRwdXQgaXMgaW5kaXZpZHVhbGx5IGFkanVzdGFibGUgYW5kCiBwcm9ncmFtbWFibGUuIE9uY2UgY29uZmlndXJlZCwgdGhlIEFEVDc0NzMgd2lsbCBhZGp1c3QgdGhlIFBXTSBvdXRwdXRzIGluCiByZXNwb25zZSB0byB0aGUgbWVhc3VyZWQgdGVtcGVyYXR1cmVzIHdpdGhvdXQgZnVydGhlciBob3N0IGludGVydmVudGlvbi4KQEAgLTQ2LDE0ICs0Niw2IEBACiBUaGUgQW5hbG9nIERldmljZXMgZGF0YXNoZWV0IGlzIHZlcnkgZGV0YWlsZWQgYW5kIGRlc2NyaWJlcyBhIHByb2NlZHVyZSBmb3IKIGRldGVybWluaW5nIGFuIG9wdGltYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGF1dG9tYXRpYyBQV00gY29udHJvbC4KIAotSGFyZHdhcmUgQ29uZmlndXJhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBBRFQ3NDczIGNoaXBzIGhhdmUgYW4gb3B0aW9uYWwgU01CQUxFUlQgb3V0cHV0IHRoYXQgY2FuIGJlIHVzZWQgdG8KLXNpZ25hbCB0aGUgY2hpcHNldCBpbiBjYXNlIGEgbGltaXQgaXMgZXhjZWVkZWQgb3IgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcnMKLWZhaWwuIEluZGl2aWR1YWwgc2Vuc29yIGludGVycnVwdHMgY2FuIGJlIG1hc2tlZCBzbyB0aGV5IHdvbid0IHRyaWdnZXIKLVNNQkFMRVJULiBUaGUgU01CQUxFUlQgb3V0cHV0IGlmIGNvbmZpZ3VyZWQgcmVwbGFjZXMgdGhlIFBXTTIgZnVuY3Rpb24uCi0KIENvbmZpZ3VyYXRpb24gTm90ZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNjEsOCArNTMsOCBAQAogCiAqIFBXTSBDb250cm9sCiAKLSogcHdtI19hdXRvX3BvaW50MV9wd20gYW5kIHB3bSNfYXV0b19wb2ludDFfdGVtcCBhbmQKLSogcHdtI19hdXRvX3BvaW50Ml9wd20gYW5kIHB3bSNfYXV0b19wb2ludDJfdGVtcCAtCisqIHB3bSNfYXV0b19wb2ludDFfcHdtIGFuZCB0ZW1wI19hdXRvX3BvaW50MV90ZW1wIGFuZAorKiBwd20jX2F1dG9fcG9pbnQyX3B3bSBhbmQgdGVtcCNfYXV0b19wb2ludDJfdGVtcCAtCiAKIHBvaW50MTogU2V0IHRoZSBwd20gc3BlZWQgYXQgYSBsb3dlciB0ZW1wZXJhdHVyZSBib3VuZC4KIHBvaW50MjogU2V0IHRoZSBwd20gc3BlZWQgYXQgYSBoaWdoZXIgdGVtcGVyYXR1cmUgYm91bmQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZSBiL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCmluZGV4IDJkODQ1NzMuLjZkYmZkNWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCkBAIC0zMjksNiArMzI5LDEwIEBACiAJCQkJVW5pdDogbWljcm9XYXR0CiAJCQkJUk8KIAorcG93ZXJbMS0qXV9hdmVyYWdlX2ludGVydmFsCVBvd2VyIHVzZSBhdmVyYWdpbmcgaW50ZXJ2YWwKKwkJCQlVbml0OiBtaWxsaXNlY29uZHMKKwkJCQlSVworCiBwb3dlclsxLSpdX2F2ZXJhZ2VfaGlnaGVzdAlIaXN0b3JpY2FsIGF2ZXJhZ2UgbWF4aW11bSBwb3dlciB1c2UKIAkJCQlVbml0OiBtaWNyb1dhdHQKIAkJCQlSTwpAQCAtMzU0LDYgKzM1OCwxNCBAQAogCQkJCVdPCiAKICoqKioqKioqKioKKyogRW5lcmd5ICoKKyoqKioqKioqKioKKworZW5lcmd5WzEtKl1faW5wdXQJCUN1bXVsYXRpdmUgZW5lcmd5IHVzZQorCQkJCVVuaXQ6IG1pY3JvSm91bGUKKwkJCQlSTworCisqKioqKioqKioqCiAqIEFsYXJtcyAqCiAqKioqKioqKioqCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy12aWFwcm8KaW5kZXggMTQwNWZiNi4uMjJlZmVkZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy12aWFwcm8KKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy12aWFwcm8KQEAgLTE2LDYgKzE2LDkgQEAKICAgKiBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIENYNzAwCiAgICAgRGF0YXNoZWV0OiBhdmFpbGFibGUgb24gcmVxdWVzdCBhbmQgdW5kZXIgTkRBIGZyb20gVklBCiAKKyAgKiBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIFZYODAwL1ZYODIwCisgICAgRGF0YXNoZWV0OiBhdmFpbGFibGUgb24gaHR0cDovL2xpbnV4LnZpYS5jb20udHcKKwogQXV0aG9yczoKIAlLecO2c3RpIE3DpGxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKIAlNYXJrIEQuIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+LApAQCAtNDksNiArNTIsNyBAQAogIGRldmljZSAxMTA2OjMzNzIgICAoVlQ4MjM3UykKICBkZXZpY2UgMTEwNjozMjg3ICAgKFZUODI1MSkKICBkZXZpY2UgMTEwNjo4MzI0ICAgKENYNzAwKQorIGRldmljZSAxMTA2OjgzNTMgICAoVlg4MDAvVlg4MjApCiAKIElmIG5vbmUgb2YgdGhlc2Ugc2hvdyB1cCwgeW91IHNob3VsZCBsb29rIGluIHRoZSBCSU9TIGZvciBzZXR0aW5ncyBsaWtlCiBlbmFibGUgQUNQSSAvIFNNQnVzIG9yIGV2ZW4gVVNCLgpAQCAtNTcsNSArNjEsNSBAQAogVlQ4MjMxKSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMgSTJDIGJsb2NrIHRyYW5zYWN0aW9ucy4gU3VjaCB0cmFuc2FjdGlvbnMKIGFyZSBtYWlubHkgdXNlZnVsIHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8gRUVQUk9Ncy4KIAotVGhlIENYNzAwIGFkZGl0aW9uYWxseSBhcHBlYXJzIHRvIHN1cHBvcnQgU01CdXMgUEVDLCBhbHRob3VnaCB0aGlzIGRyaXZlcgotZG9lc24ndCBpbXBsZW1lbnQgaXQgeWV0LgorVGhlIENYNzAwL1ZYODAwL1ZYODIwIGFkZGl0aW9uYWxseSBhcHBlYXJzIHRvIHN1cHBvcnQgU01CdXMgUEVDLCBhbHRob3VnaAordGhpcyBkcml2ZXIgZG9lc24ndCBpbXBsZW1lbnQgaXQgeWV0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZSBiL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UKaW5kZXggOWRkNzkxMi4uM2U3NDJiYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9kZXYtaW50ZXJmYWNlCkBAIC00LDYgKzQsMTAgQEAKIAogRWFjaCByZWdpc3RlcmVkIGkyYyBhZGFwdGVyIGdldHMgYSBudW1iZXIsIGNvdW50aW5nIGZyb20gMC4gWW91IGNhbgogZXhhbWluZSAvc3lzL2NsYXNzL2kyYy1kZXYvIHRvIHNlZSB3aGF0IG51bWJlciBjb3JyZXNwb25kcyB0byB3aGljaCBhZGFwdGVyLgorQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBydW4gImkyY2RldGVjdCAtbCIgdG8gb2J0YWluIGEgZm9ybWF0ZWQgbGlzdCBvZiBhbGwKK2kyYyBhZGFwdGVycyBwcmVzZW50IG9uIHlvdXIgc3lzdGVtIGF0IGEgZ2l2ZW4gdGltZS4gaTJjZGV0ZWN0IGlzIHBhcnQgb2YKK3RoZSBpMmMtdG9vbHMgcGFja2FnZS4KKwogSTJDIGRldmljZSBmaWxlcyBhcmUgY2hhcmFjdGVyIGRldmljZSBmaWxlcyB3aXRoIG1ham9yIGRldmljZSBudW1iZXIgODkKIGFuZCBhIG1pbm9yIGRldmljZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyIGFzc2lnbmVkIGFzIAogZXhwbGFpbmVkIGFib3ZlLiBUaGV5IHNob3VsZCBiZSBjYWxsZWQgImkyYy0lZCIgKGkyYy0wLCBpMmMtMSwgLi4uLCAKQEAgLTE3LDMwICsyMSwzNCBAQAogZmlyc3QgdGhpbmcgdG8gZG8gaXMgIiNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+Ii4gUGxlYXNlIG5vdGUgdGhhdAogdGhlcmUgYXJlIHR3byBmaWxlcyBuYW1lZCAiaTJjLWRldi5oIiBvdXQgdGhlcmUsIG9uZSBpcyBkaXN0cmlidXRlZAogd2l0aCB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCBmcm9tIGtlcm5lbAotZHJpdmVyIGNvZGUsIHRoZSBvdGhlciBvbmUgaXMgZGlzdHJpYnV0ZWQgd2l0aCBsbV9zZW5zb3JzIGFuZCBpcworZHJpdmVyIGNvZGUsIHRoZSBvdGhlciBvbmUgaXMgZGlzdHJpYnV0ZWQgd2l0aCBpMmMtdG9vbHMgYW5kIGlzCiBtZWFudCB0byBiZSBpbmNsdWRlZCBmcm9tIHVzZXItc3BhY2UgcHJvZ3JhbXMuIFlvdSBvYnZpb3VzbHkgd2FudAogdGhlIHNlY29uZCBvbmUgaGVyZS4KIAogTm93LCB5b3UgaGF2ZSB0byBkZWNpZGUgd2hpY2ggYWRhcHRlciB5b3Ugd2FudCB0byBhY2Nlc3MuIFlvdSBzaG91bGQKLWluc3BlY3QgL3N5cy9jbGFzcy9pMmMtZGV2LyB0byBkZWNpZGUgdGhpcy4gQWRhcHRlciBudW1iZXJzIGFyZSBhc3NpZ25lZAotc29tZXdoYXQgZHluYW1pY2FsbHksIHNvIHlvdSBjYW4gbm90IGV2ZW4gYXNzdW1lIC9kZXYvaTJjLTAgaXMgdGhlCi1maXJzdCBhZGFwdGVyLgoraW5zcGVjdCAvc3lzL2NsYXNzL2kyYy1kZXYvIG9yIHJ1biAiaTJjZGV0ZWN0IC1sIiB0byBkZWNpZGUgdGhpcy4KK0FkYXB0ZXIgbnVtYmVycyBhcmUgYXNzaWduZWQgc29tZXdoYXQgZHluYW1pY2FsbHksIHNvIHlvdSBjYW4gbm90Cithc3N1bWUgbXVjaCBhYm91dCB0aGVtLiBUaGV5IGNhbiBldmVuIGNoYW5nZSBmcm9tIG9uZSBib290IHRvIHRoZSBuZXh0LgogCiBOZXh0IHRoaW5nLCBvcGVuIHRoZSBkZXZpY2UgZmlsZSwgYXMgZm9sbG93czoKKwogICBpbnQgZmlsZTsKICAgaW50IGFkYXB0ZXJfbnIgPSAyOyAvKiBwcm9iYWJseSBkeW5hbWljYWxseSBkZXRlcm1pbmVkICovCiAgIGNoYXIgZmlsZW5hbWVbMjBdOwogICAKLSAgc3ByaW50ZihmaWxlbmFtZSwiL2Rldi9pMmMtJWQiLGFkYXB0ZXJfbnIpOwotICBpZiAoKGZpbGUgPSBvcGVuKGZpbGVuYW1lLE9fUkRXUikpIDwgMCkgeworICBzbnByaW50ZihmaWxlbmFtZSwgMTksICIvZGV2L2kyYy0lZCIsIGFkYXB0ZXJfbnIpOworICBmaWxlID0gb3BlbihmaWxlbmFtZSwgT19SRFdSKTsKKyAgaWYgKGZpbGUgPCAwKSB7CiAgICAgLyogRVJST1IgSEFORExJTkc7IHlvdSBjYW4gY2hlY2sgZXJybm8gdG8gc2VlIHdoYXQgd2VudCB3cm9uZyAqLwogICAgIGV4aXQoMSk7CiAgIH0KIAogV2hlbiB5b3UgaGF2ZSBvcGVuZWQgdGhlIGRldmljZSwgeW91IG11c3Qgc3BlY2lmeSB3aXRoIHdoYXQgZGV2aWNlCiBhZGRyZXNzIHlvdSB3YW50IHRvIGNvbW11bmljYXRlOgorCiAgIGludCBhZGRyID0gMHg0MDsgLyogVGhlIEkyQyBhZGRyZXNzICovCi0gIGlmIChpb2N0bChmaWxlLEkyQ19TTEFWRSxhZGRyKSA8IDApIHsKKworICBpZiAoaW9jdGwoZmlsZSwgSTJDX1NMQVZFLCBhZGRyKSA8IDApIHsKICAgICAvKiBFUlJPUiBIQU5ETElORzsgeW91IGNhbiBjaGVjayBlcnJubyB0byBzZWUgd2hhdCB3ZW50IHdyb25nICovCiAgICAgZXhpdCgxKTsKICAgfQpAQCAtNDgsMzEgKzU2LDQxIEBACiBXZWxsLCB5b3UgYXJlIGFsbCBzZXQgdXAgbm93LiBZb3UgY2FuIG5vdyB1c2UgU01CdXMgY29tbWFuZHMgb3IgcGxhaW4KIEkyQyB0byBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgZGV2aWNlLiBTTUJ1cyBjb21tYW5kcyBhcmUgcHJlZmVycmVkIGlmCiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZW0uIEJvdGggYXJlIGlsbHVzdHJhdGVkIGJlbG93LgorCiAgIF9fdTggcmVnaXN0ZXIgPSAweDEwOyAvKiBEZXZpY2UgcmVnaXN0ZXIgdG8gYWNjZXNzICovCiAgIF9fczMyIHJlczsKICAgY2hhciBidWZbMTBdOworCiAgIC8qIFVzaW5nIFNNQnVzIGNvbW1hbmRzICovCi0gIHJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShmaWxlLHJlZ2lzdGVyKTsKKyAgcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGZpbGUsIHJlZ2lzdGVyKTsKICAgaWYgKHJlcyA8IDApIHsKICAgICAvKiBFUlJPUiBIQU5ETElORzogaTJjIHRyYW5zYWN0aW9uIGZhaWxlZCAqLwogICB9IGVsc2UgewogICAgIC8qIHJlcyBjb250YWlucyB0aGUgcmVhZCB3b3JkICovCiAgIH0KKwogICAvKiBVc2luZyBJMkMgV3JpdGUsIGVxdWl2YWxlbnQgb2YgCi0gICAgICAgICAgIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZmlsZSxyZWdpc3RlciwweDY1NDMpICovCisgICAgIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZmlsZSwgcmVnaXN0ZXIsIDB4NjU0MykgKi8KICAgYnVmWzBdID0gcmVnaXN0ZXI7CiAgIGJ1ZlsxXSA9IDB4NDM7CiAgIGJ1ZlsyXSA9IDB4NjU7Ci0gIGlmICggd3JpdGUoZmlsZSxidWYsMykgIT0gMykgeworICBpZiAod3JpdGUoZmlsZSwgYnVmLCAzKSAhID0zKSB7CiAgICAgLyogRVJST1IgSEFORExJTkc6IGkyYyB0cmFuc2FjdGlvbiBmYWlsZWQgKi8KICAgfQorCiAgIC8qIFVzaW5nIEkyQyBSZWFkLCBlcXVpdmFsZW50IG9mIGkyY19zbWJ1c19yZWFkX2J5dGUoZmlsZSkgKi8KLSAgaWYgKHJlYWQoZmlsZSxidWYsMSkgIT0gMSkgeworICBpZiAocmVhZChmaWxlLCBidWYsIDEpICE9IDEpIHsKICAgICAvKiBFUlJPUiBIQU5ETElORzogaTJjIHRyYW5zYWN0aW9uIGZhaWxlZCAqLwogICB9IGVsc2UgewogICAgIC8qIGJ1ZlswXSBjb250YWlucyB0aGUgcmVhZCBieXRlICovCiAgIH0KIAorTm90ZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIEkyQyBhbmQgU01CdXMgcHJvdG9jb2xzIGNhbiBiZSBhY2hpZXZlZCBieQordGhlIG1lYW5zIG9mIHJlYWQoKSBhbmQgd3JpdGUoKSBjYWxscy4gSW4gcGFydGljdWxhciwgc28tY2FsbGVkIGNvbWJpbmVkCit0cmFuc2FjdGlvbnMgKG1peGluZyByZWFkIGFuZCB3cml0ZSBtZXNzYWdlcyBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbikKK2FyZW4ndCBzdXBwb3J0ZWQuIEZvciB0aGlzIHJlYXNvbiwgdGhpcyBpbnRlcmZhY2UgaXMgYWxtb3N0IG5ldmVyIHVzZWQgYnkKK3VzZXItc3BhY2UgcHJvZ3JhbXMuCisKIElNUE9SVEFOVDogYmVjYXVzZSBvZiB0aGUgdXNlIG9mIGlubGluZSBmdW5jdGlvbnMsIHlvdSAqaGF2ZSogdG8gdXNlCiAnLU8nIG9yIHNvbWUgdmFyaWF0aW9uIHdoZW4geW91IGNvbXBpbGUgeW91ciBwcm9ncmFtIQogCkBAIC04MCwzMSArOTgsMjkgQEAKIEZ1bGwgaW50ZXJmYWNlIGRlc2NyaXB0aW9uCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgZm9sbG93aW5nIElPQ1RMcyBhcmUgZGVmaW5lZCBhbmQgZnVsbHkgc3VwcG9ydGVkIAotKHNlZSBhbHNvIGkyYy1kZXYuaCk6CitUaGUgZm9sbG93aW5nIElPQ1RMcyBhcmUgZGVmaW5lZDoKIAotaW9jdGwoZmlsZSxJMkNfU0xBVkUsbG9uZyBhZGRyKQoraW9jdGwoZmlsZSwgSTJDX1NMQVZFLCBsb25nIGFkZHIpCiAgIENoYW5nZSBzbGF2ZSBhZGRyZXNzLiBUaGUgYWRkcmVzcyBpcyBwYXNzZWQgaW4gdGhlIDcgbG93ZXIgYml0cyBvZiB0aGUKICAgYXJndW1lbnQgKGV4Y2VwdCBmb3IgMTAgYml0IGFkZHJlc3NlcywgcGFzc2VkIGluIHRoZSAxMCBsb3dlciBiaXRzIGluIHRoaXMKICAgY2FzZSkuCiAKLWlvY3RsKGZpbGUsSTJDX1RFTkJJVCxsb25nIHNlbGVjdCkKK2lvY3RsKGZpbGUsIEkyQ19URU5CSVQsIGxvbmcgc2VsZWN0KQogICBTZWxlY3RzIHRlbiBiaXQgYWRkcmVzc2VzIGlmIHNlbGVjdCBub3QgZXF1YWxzIDAsIHNlbGVjdHMgbm9ybWFsIDcgYml0CiAgIGFkZHJlc3NlcyBpZiBzZWxlY3QgZXF1YWxzIDAuIERlZmF1bHQgMC4gIFRoaXMgcmVxdWVzdCBpcyBvbmx5IHZhbGlkCiAgIGlmIHRoZSBhZGFwdGVyIGhhcyBJMkNfRlVOQ18xMEJJVF9BRERSLgogCi1pb2N0bChmaWxlLEkyQ19QRUMsbG9uZyBzZWxlY3QpCitpb2N0bChmaWxlLCBJMkNfUEVDLCBsb25nIHNlbGVjdCkKICAgU2VsZWN0cyBTTUJ1cyBQRUMgKHBhY2tldCBlcnJvciBjaGVja2luZykgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uCiAgIGlmIHNlbGVjdCBub3QgZXF1YWxzIDAsIGRpc2FibGVzIGlmIHNlbGVjdCBlcXVhbHMgMC4gRGVmYXVsdCAwLgogICBVc2VkIG9ubHkgZm9yIFNNQnVzIHRyYW5zYWN0aW9ucy4gIFRoaXMgcmVxdWVzdCBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlCiAgIHRoZSBhZGFwdGVyIGhhcyBJMkNfRlVOQ19TTUJVU19QRUM7IGl0IGlzIHN0aWxsIHNhZmUgaWYgbm90LCBpdCBqdXN0CiAgIGRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0LgogCi1pb2N0bChmaWxlLEkyQ19GVU5DUyx1bnNpZ25lZCBsb25nICpmdW5jcykKK2lvY3RsKGZpbGUsIEkyQ19GVU5DUywgdW5zaWduZWQgbG9uZyAqZnVuY3MpCiAgIEdldHMgdGhlIGFkYXB0ZXIgZnVuY3Rpb25hbGl0eSBhbmQgcHV0cyBpdCBpbiAqZnVuY3MuCiAKLWlvY3RsKGZpbGUsSTJDX1JEV1Isc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgKm1zZ3NldCkKLQoraW9jdGwoZmlsZSwgSTJDX1JEV1IsIHN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhICptc2dzZXQpCiAgIERvIGNvbWJpbmVkIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gd2l0aG91dCBzdG9wIGluIGJldHdlZW4uCiAgIE9ubHkgdmFsaWQgaWYgdGhlIGFkYXB0ZXIgaGFzIEkyQ19GVU5DX0kyQy4gIFRoZSBhcmd1bWVudCBpcwogICBhIHBvaW50ZXIgdG8gYQpAQCAtMTIwLDEwICsxMzYsOSBAQAogICBUaGUgc2xhdmUgYWRkcmVzcyBhbmQgd2hldGhlciB0byB1c2UgdGVuIGJpdCBhZGRyZXNzIG1vZGUgaGFzIHRvIGJlCiAgIHNldCBpbiBlYWNoIG1lc3NhZ2UsIG92ZXJyaWRpbmcgdGhlIHZhbHVlcyBzZXQgd2l0aCB0aGUgYWJvdmUgaW9jdGwncy4KIAotCi1PdGhlciB2YWx1ZXMgYXJlIE5PVCBzdXBwb3J0ZWQgYXQgdGhpcyBtb21lbnQsIGV4Y2VwdCBmb3IgSTJDX1NNQlVTLAotd2hpY2ggeW91IHNob3VsZCBuZXZlciBkaXJlY3RseSBjYWxsOyBpbnN0ZWFkLCB1c2UgdGhlIGFjY2VzcyBmdW5jdGlvbnMKLWJlbG93LgoraW9jdGwoZmlsZSwgSTJDX1NNQlVTLCBzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEgKmFyZ3MpCisgIE5vdCBtZWFudCB0byBiZSBjYWxsZWQgIGRpcmVjdGx5OyBpbnN0ZWFkLCB1c2UgdGhlIGFjY2VzcyBmdW5jdGlvbnMKKyAgYmVsb3cuCiAKIFlvdSBjYW4gZG8gcGxhaW4gaTJjIHRyYW5zYWN0aW9ucyBieSB1c2luZyByZWFkKDIpIGFuZCB3cml0ZSgyKSBjYWxscy4KIFlvdSBkbyBub3QgbmVlZCB0byBwYXNzIHRoZSBhZGRyZXNzIGJ5dGU7IGluc3RlYWQsIHNldCBpdCB0aHJvdWdoCkBAIC0xNDgsNyArMTYzLDUyIEBACiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIHJlYWQuIFRoZSBibG9jayBidWZmZXJzIG5lZWQgbm90IGJlIGxvbmdlcgogdGhhbiAzMiBieXRlcy4KIAotVGhlIGFib3ZlIGZ1bmN0aW9ucyBhcmUgYWxsIG1hY3JvcywgdGhhdCByZXNvbHZlIHRvIGNhbGxzIHRvIHRoZQotaTJjX3NtYnVzX2FjY2VzcyBmdW5jdGlvbiwgdGhhdCBvbiBpdHMgdHVybiBjYWxscyBhIHNwZWNpZmljIGlvY3RsCitUaGUgYWJvdmUgZnVuY3Rpb25zIGFyZSBhbGwgaW5saW5lIGZ1bmN0aW9ucywgdGhhdCByZXNvbHZlIHRvIGNhbGxzIHRvCit0aGUgaTJjX3NtYnVzX2FjY2VzcyBmdW5jdGlvbiwgdGhhdCBvbiBpdHMgdHVybiBjYWxscyBhIHNwZWNpZmljIGlvY3RsCiB3aXRoIHRoZSBkYXRhIGluIGEgc3BlY2lmaWMgZm9ybWF0LiBSZWFkIHRoZSBzb3VyY2UgY29kZSBpZiB5b3UKIHdhbnQgdG8ga25vdyB3aGF0IGhhcHBlbnMgYmVoaW5kIHRoZSBzY3JlZW5zLgorCisKK0ltcGxlbWVudGF0aW9uIGRldGFpbHMKKz09PT09PT09PT09PT09PT09PT09PT0KKworRm9yIHRoZSBpbnRlcmVzdGVkLCBoZXJlJ3MgdGhlIGNvZGUgZmxvdyB3aGljaCBoYXBwZW5zIGluc2lkZSB0aGUga2VybmVsCit3aGVuIHlvdSB1c2UgdGhlIC9kZXYgaW50ZXJmYWNlIHRvIEkyQzoKKworMSogWW91ciBwcm9ncmFtIG9wZW5zIC9kZXYvaTJjLU4gYW5kIGNhbGxzIGlvY3RsKCkgb24gaXQsIGFzIGRlc2NyaWJlZCBpbgorc2VjdGlvbiAiQyBleGFtcGxlIiBhYm92ZS4KKworMiogVGhlc2Ugb3BlbigpIGFuZCBpb2N0bCgpIGNhbGxzIGFyZSBoYW5kbGVkIGJ5IHRoZSBpMmMtZGV2IGtlcm5lbAorZHJpdmVyOiBzZWUgaTJjLWRldi5jOmkyY2Rldl9vcGVuKCkgYW5kIGkyYy1kZXYuYzppMmNkZXZfaW9jdGwoKSwKK3Jlc3BlY3RpdmVseS4gWW91IGNhbiB0aGluayBvZiBpMmMtZGV2IGFzIGEgZ2VuZXJpYyBJMkMgY2hpcCBkcml2ZXIKK3RoYXQgY2FuIGJlIHByb2dyYW1tZWQgZnJvbSB1c2VyLXNwYWNlLgorCiszKiBTb21lIGlvY3RsKCkgY2FsbHMgYXJlIGZvciBhZG1pbmlzdHJhdGl2ZSB0YXNrcyBhbmQgYXJlIGhhbmRsZWQgYnkKK2kyYy1kZXYgZGlyZWN0bHkuIEV4YW1wbGVzIGluY2x1ZGUgSTJDX1NMQVZFIChzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCitkZXZpY2UgeW91IHdhbnQgdG8gYWNjZXNzKSBhbmQgSTJDX1BFQyAoZW5hYmxlIG9yIGRpc2FibGUgU01CdXMgZXJyb3IKK2NoZWNraW5nIG9uIGZ1dHVyZSB0cmFuc2FjdGlvbnMuKQorCis0KiBPdGhlciBpb2N0bCgpIGNhbGxzIGFyZSBjb252ZXJ0ZWQgdG8gaW4ta2VybmVsIGZ1bmN0aW9uIGNhbGxzIGJ5CitpMmMtZGV2LiBFeGFtcGxlcyBpbmNsdWRlIEkyQ19GVU5DUywgd2hpY2ggcXVlcmllcyB0aGUgSTJDIGFkYXB0ZXIKK2Z1bmN0aW9uYWxpdHkgdXNpbmcgaTJjLmg6aTJjX2dldF9mdW5jdGlvbmFsaXR5KCksIGFuZCBJMkNfU01CVVMsIHdoaWNoCitwZXJmb3JtcyBhbiBTTUJ1cyB0cmFuc2FjdGlvbiB1c2luZyBpMmMtY29yZS5jOmkyY19zbWJ1c194ZmVyKCkuCisKK1RoZSBpMmMtZGV2IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgYWxsIHRoZSBwYXJhbWV0ZXJzIHRoYXQKK2NvbWUgZnJvbSB1c2VyLXNwYWNlIGZvciB2YWxpZGl0eS4gQWZ0ZXIgdGhpcyBwb2ludCwgdGhlcmUgaXMgbm8KK2RpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBjYWxscyB0aGF0IGNhbWUgZnJvbSB1c2VyLXNwYWNlIHRocm91Z2ggaTJjLWRldgorYW5kIGNhbGxzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCBieSBrZXJuZWwgSTJDIGNoaXAgZHJpdmVycworZGlyZWN0bHkuIFRoaXMgbWVhbnMgdGhhdCBJMkMgYnVzIGRyaXZlcnMgZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQKK2FueXRoaW5nIHNwZWNpYWwgdG8gc3VwcG9ydCBhY2Nlc3MgZnJvbSB1c2VyLXNwYWNlLgorCis1KiBUaGVzZSBpMmMtY29yZS5jL2kyYy5oIGZ1bmN0aW9ucyBhcmUgd3JhcHBlcnMgdG8gdGhlIGFjdHVhbAoraW1wbGVtZW50YXRpb24gb2YgeW91ciBJMkMgYnVzIGRyaXZlci4gRWFjaCBhZGFwdGVyIG11c3QgZGVjbGFyZQorY2FsbGJhY2sgZnVuY3Rpb25zIGltcGxlbWVudGluZyB0aGVzZSBzdGFuZGFyZCBjYWxscy4KK2kyYy5oOmkyY19nZXRfZnVuY3Rpb25hbGl0eSgpIGNhbGxzIGkyY19hZGFwdGVyLmFsZ28tPmZ1bmN0aW9uYWxpdHkoKSwKK3doaWxlIGkyYy1jb3JlLmM6aTJjX3NtYnVzX3hmZXIoKSBjYWxscyBlaXRoZXIKK2FkYXB0ZXIuYWxnby0+c21idXNfeGZlcigpIGlmIGl0IGlzIGltcGxlbWVudGVkLCBvciBpZiBub3QsCitpMmMtY29yZS5jOmkyY19zbWJ1c194ZmVyX2VtdWxhdGVkKCkgd2hpY2ggaW4gdHVybiBjYWxscworaTJjX2FkYXB0ZXIuYWxnby0+bWFzdGVyX3hmZXIoKS4KKworQWZ0ZXIgeW91ciBJMkMgYnVzIGRyaXZlciBoYXMgcHJvY2Vzc2VkIHRoZXNlIHJlcXVlc3RzLCBleGVjdXRpb24gcnVucwordXAgdGhlIGNhbGwgY2hhaW4sIHdpdGggYWxtb3N0IG5vIHByb2Nlc3NpbmcgZG9uZSwgZXhjZXB0IGJ5IGkyYy1kZXYgdG8KK3BhY2thZ2UgdGhlIHJldHVybmVkIGRhdGEsIGlmIGFueSwgaW4gc3VpdGFibGUgZm9ybWF0IGZvciB0aGUgaW9jdGwuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9zbWJ1cy1wcm90b2NvbCBiL0RvY3VtZW50YXRpb24vaTJjL3NtYnVzLXByb3RvY29sCmluZGV4IDI0YmZiNjVkLi45ZGY0NzQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9zbWJ1cy1wcm90b2NvbAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbWJ1cy1wcm90b2NvbApAQCAtMTA5LDggKzEwOSw4IEBACiBTIEFkZHIgV3IgW0FdIENvbW0gW0FdIERhdGFMb3cgW0FdIERhdGFIaWdoIFtBXSBQCiAKIAotU01CdXMgUHJvY2VzcyBDYWxsCi09PT09PT09PT09PT09PT09PT0KK1NNQnVzIFByb2Nlc3MgQ2FsbDogIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgY29tbWFuZCBzZWxlY3RzIGEgZGV2aWNlIHJlZ2lzdGVyICh0aHJvdWdoIHRoZSBDb21tIGJ5dGUpLCBzZW5kcwogMTYgYml0cyBvZiBkYXRhIHRvIGl0LCBhbmQgcmVhZHMgMTYgYml0cyBvZiBkYXRhIGluIHJldHVybi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwppbmRleCA2YjYxYjNhLi5kNzNlZTExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCkBAIC02MDYsNiArNjA2LDggQEAKICAgZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsIHU4IGNvbW1hbmQpOwogICBleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOworICBleHRlcm4gczMyIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSk7CiAgIGV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpOwogICBleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LApAQCAtNjIxLDggKzYyMyw2IEBACiBiZSBhZGRlZCBiYWNrIGxhdGVyIGlmIG5lZWRlZDoKIAogICBleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9xdWljayhzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggdmFsdWUpOwotICBleHRlcm4gczMyIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOwogICBleHRlcm4gczMyIGkyY19zbWJ1c19ibG9ja19wcm9jZXNzX2NhbGwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHU4IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICp2YWx1ZXMpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lhNjQva3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vaWE2NC9rdm0udHh0CmluZGV4IDkxNGQwN2YuLjg0ZjdjYjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWE2NC9rdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vaWE2NC9rdm0udHh0CkBAIC0xLDcgKzEsOCBAQAotQ3VycmVudGx5LCBrdm0gbW9kdWxlIGluIEVYUEVSSU1FTlRBTCBzdGFnZSBvbiBJQTY0LiBUaGlzIG1lYW5zIHRoYXQKLWludGVyZmFjZXMgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZS4gU28sIHBsYXNlIGhhZCBiZXR0ZXIgZG9uJ3QgcnVuCi1jcml0aWNhbCBhcHBsaWNhdGlvbnMgaW4gdmlydHVhbCBtYWNoaW5lLiBXZSB3aWxsIHRyeSBvdXIgYmVzdCB0byBtYWtlIGl0Ci1zdHJvbmcgaW4gZnV0dXJlIHZlcnNpb25zIQorQ3VycmVudGx5LCBrdm0gbW9kdWxlIGlzIGluIEVYUEVSSU1FTlRBTCBzdGFnZSBvbiBJQTY0LiBUaGlzIG1lYW5zIHRoYXQKK2ludGVyZmFjZXMgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZS4gU28sIHBsZWFzZSBkb24ndCBydW4gY3JpdGljYWwKK2FwcGxpY2F0aW9ucyBpbiB2aXJ0dWFsIG1hY2hpbmUuCitXZSB3aWxsIHRyeSBvdXIgYmVzdCB0byBpbXByb3ZlIGl0IGluIGZ1dHVyZSB2ZXJzaW9ucyEKKwogCQkJCUd1aWRlOiBIb3cgdG8gYm9vdCB1cCBndWVzdHMgb24ga3ZtL2lhNjQKIAogVGhpcyBndWlkZSBpcyB0byBkZXNjcmliZSBob3cgdG8gZW5hYmxlIGt2bSBzdXBwb3J0IGZvciBJQS02NCBzeXN0ZW1zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9jZHJvbS50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dAppbmRleCA2MmQ0YWY0Li41OWRmODFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dApAQCAtMjcxLDE0ICsyNzEsMTQgQEAKIAogCXVzYWdlOgogCi0JICBpb2N0bChmZCwgQ0RST01FSkVDVCwgMCk7CisJICBpb2N0bChmZCwgQ0RST01DTE9TRVRSQVksIDApOwogCiAJaW5wdXRzOgkJbm9uZQogCiAJb3V0cHV0czoJbm9uZQogCiAJZXJyb3IgcmV0dXJuczoKLQkgIEVOT1NZUwljZCBkcml2ZSBub3QgY2FwYWJsZSBvZiBlamVjdGluZworCSAgRU5PU1lTCWNkIGRyaXZlIG5vdCBjYXBhYmxlIG9mIGNsb3NpbmcgdGhlIHRyYXkKIAkgIEVCVVNZCQlvdGhlciBwcm9jZXNzZXMgYXJlIGFjY2Vzc2luZyBkcml2ZSwgb3IgZG9vciBpcyBsb2NrZWQKIAogCW5vdGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CmluZGV4IDBiZDMyNzQuLmM2ODQxZWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKQEAgLTE2OCwxMCArMTY4LDEwIEBACiBta2RpciAkQVJHVlswXSwwNzc3OwogJHN0YXRlID0gMDsKIHdoaWxlICg8U1RESU4+KSB7Ci0gICAgaWYgKC9eXC5USCBcIlteXCJdKlwiIDQgXCIoW15cIl0qKVwiLykgeworICAgIGlmICgvXlwuVEggXCJbXlwiXSpcIiA5IFwiKFteXCJdKilcIi8pIHsKIAlpZiAoJHN0YXRlID09IDEpIHsgY2xvc2UgT1VUIH0KIAkkc3RhdGUgPSAxOwotCSRmbiA9ICIkQVJHVlswXS8kMS40IjsKKwkkZm4gPSAiJEFSR1ZbMF0vJDEuOSI7CiAJcHJpbnQgU1RERVJSICJDcmVhdGluZyAkZm5cbiI7CiAJb3BlbiBPVVQsICI+JGZuIiBvciBkaWUgImNhbid0IG9wZW4gJGZuOiAkIVxuIjsKIAlwcmludCBPVVQgJF87CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDExNTA0NDQuLmRkMjhhMGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0yODQsNiArMjg0LDExIEBACiAJCQlpc29sYXRlIC0gZW5hYmxlIGRldmljZSBpc29sYXRpb24gKGVhY2ggZGV2aWNlLCBhcyBmYXIKIAkJCSAgICAgICAgICBhcyBwb3NzaWJsZSwgd2lsbCBnZXQgaXRzIG93biBwcm90ZWN0aW9uCiAJCQkgICAgICAgICAgZG9tYWluKQorCQkJZnVsbGZsdXNoIC0gZW5hYmxlIGZsdXNoaW5nIG9mIElPL1RMQiBlbnRyaWVzIHdoZW4KKwkJCQkgICAgdGhleSBhcmUgdW5tYXBwZWQuIE90aGVyd2lzZSB0aGV5IGFyZQorCQkJCSAgICBmbHVzaGVkIGJlZm9yZSB0aGV5IHdpbGwgYmUgcmV1c2VkLCB3aGljaAorCQkJCSAgICBpcyBhIGxvdCBvZiBmYXN0ZXIKKwogCWFtZF9pb21tdV9zaXplPSBbSFcsWDg2LTY0XQogCQkJRGVmaW5lIHRoZSBzaXplIG9mIHRoZSBhcGVydHVyZSBmb3IgdGhlIEFNRCBJT01NVQogCQkJZHJpdmVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgpAQCAtNDYzLDEyICs0NjgsNiBAQAogCQkJUmFuZ2U6IDAgLSA4MTkyCiAJCQlEZWZhdWx0OiA2NAogCi0JZGlzYWJsZV84MjU0X3RpbWVyCi0JZW5hYmxlXzgyNTRfdGltZXIKLQkJCVtJQTMyL1g4Nl82NF0gRGlzYWJsZS9FbmFibGUgaW50ZXJydXB0IDAgdGltZXIgcm91dGluZwotCQkJb3ZlciB0aGUgODI1NCBpbiBhZGRpdGlvbiB0byBvdmVyIHRoZSBJTy1BUElDLiBUaGUKLQkJCWtlcm5lbCB0cmllcyB0byBzZXQgYSBzZW5zaWJsZSBkZWZhdWx0LgotCiAJaHBldD0JCVtYODYtMzIsSFBFVF0gb3B0aW9uIHRvIGNvbnRyb2wgSFBFVCB1c2FnZQogCQkJRm9ybWF0OiB7IGVuYWJsZSAoZGVmYXVsdCkgfCBkaXNhYmxlIHwgZm9yY2UgfQogCQkJZGlzYWJsZTogZGlzYWJsZSBIUEVUIGFuZCB1c2UgUElUIGluc3RlYWQKQEAgLTY1OSwxMSArNjU4LDEyIEBACiAJZWFybHlwcmludGs9CVtYODYtMzIsWDg2LTY0LFNILEJMQUNLRklOXQogCQkJZWFybHlwcmludGs9dmdhCiAJCQllYXJseXByaW50az1zZXJpYWxbLHR0eVNuWyxiYXVkcmF0ZV1dCisJCQllYXJseXByaW50az1kYmdwCiAKIAkJCUFwcGVuZCAiLGtlZXAiIHRvIG5vdCBkaXNhYmxlIGl0IHdoZW4gdGhlIHJlYWwgY29uc29sZQogCQkJdGFrZXMgb3Zlci4KIAotCQkJT25seSB2Z2Egb3Igc2VyaWFsIGF0IGEgdGltZSwgbm90IGJvdGguCisJCQlPbmx5IHZnYSBvciBzZXJpYWwgb3IgdXNiIGRlYnVnIHBvcnQgYXQgYSB0aW1lLgogCiAJCQlDdXJyZW50bHkgb25seSB0dHlTMCBhbmQgdHR5UzEgYXJlIHN1cHBvcnRlZC4KIApAQCAtNzk2LDYgKzc5Niw3IEBACiAJCQlEZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUncyBodWdlIHBhZ2Ugc2l6ZQogCQkJaWYgbm90IHNwZWNpZmllZC4KIAorCWk4MDQyLmRlYnVnCVtIV10gVG9nZ2xlIGk4MDQyIGRlYnVnIG1vZGUKIAlpODA0Mi5kaXJlY3QJW0hXXSBQdXQga2V5Ym9hcmQgcG9ydCBpbnRvIG5vbi10cmFuc2xhdGVkIG1vZGUKIAlpODA0Mi5kdW1ia2JkCVtIV10gUHJldGVuZCB0aGF0IGNvbnRyb2xsZXIgY2FuIG9ubHkgcmVhZCBkYXRhIGZyb20KIAkJCSAgICAga2V5Ym9hcmQgYW5kIGNhbm5vdCBjb250cm9sIGl0cyBzdGF0ZQpAQCAtMTAyMCw2ICsxMDIxLDEwIEBACiAJCQkob25seSBzZXJpYWwgc3Vwb3J0ZWQgZm9yIG5vdykKIAkJCUZvcm1hdDogPHNlcmlhbF9kZXZpY2U+WyxiYXVkXQogCisJa21hYz0JCVtNSVBTXSBrb3JpbmEgZXRoZXJuZXQgTUFDIGFkZHJlc3MuCisJCQlDb25maWd1cmUgdGhlIFJvdXRlckJvYXJkIDUzMiBzZXJpZXMgb24tY2hpcAorCQkJRXRoZXJuZXQgYWRhcHRlciBNQUMgYWRkcmVzcy4KKwogCWwyY3I9CQlbUFBDXQogCiAJbDNjcj0JCVtQUENdCkBAIC0xMjI4LDYgKzEyMzMsMjkgQEAKIAkJCSAgICAgICAgIG9yCiAJCQkgICAgICAgICBtZW1tYXA9MHgxMDAwMCQweDE4NjkwMDAwCiAKKwltZW1vcnlfY29ycnVwdGlvbl9jaGVjaz0wLzEgW1g4Nl0KKwkJCVNvbWUgQklPU2VzIHNlZW0gdG8gY29ycnVwdCB0aGUgZmlyc3QgNjRrIG9mCisJCQltZW1vcnkgd2hlbiBkb2luZyB0aGluZ3MgbGlrZSBzdXNwZW5kL3Jlc3VtZS4KKwkJCVNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBzY2FuIHRoZSBtZW1vcnkKKwkJCWxvb2tpbmcgZm9yIGNvcnJ1cHRpb24uICBFbmFibGluZyB0aGlzIHdpbGwKKwkJCWJvdGggZGV0ZWN0IGNvcnJ1cHRpb24gYW5kIHByZXZlbnQgdGhlIGtlcm5lbAorCQkJZnJvbSB1c2luZyB0aGUgbWVtb3J5IGJlaW5nIGNvcnJ1cHRlZC4KKwkJCUhvd2V2ZXIsIGl0cyBpbnRlbmRlZCBhcyBhIGRpYWdub3N0aWMgdG9vbDsgaWYKKwkJCXJlcGVhdGFibGUgQklPUy1vcmlnaW5hdGVkIGNvcnJ1cHRpb24gYWx3YXlzCisJCQlhZmZlY3RzIHRoZSBzYW1lIG1lbW9yeSwgeW91IGNhbiB1c2UgbWVtbWFwPQorCQkJdG8gcHJldmVudCB0aGUga2VybmVsIGZyb20gdXNpbmcgdGhhdCBtZW1vcnkuCisKKwltZW1vcnlfY29ycnVwdGlvbl9jaGVja19zaXplPXNpemUgW1g4Nl0KKwkJCUJ5IGRlZmF1bHQgaXQgY2hlY2tzIGZvciBjb3JydXB0aW9uIGluIHRoZSBsb3cKKwkJCTY0aywgbWFraW5nIHRoaXMgbWVtb3J5IHVuYXZhaWxhYmxlIGZvciBub3JtYWwKKwkJCXVzZS4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBzY2FuIGZvcgorCQkJY29ycnVwdGlvbiBpbiBtb3JlIG9yIGxlc3MgbWVtb3J5LgorCisJbWVtb3J5X2NvcnJ1cHRpb25fY2hlY2tfcGVyaW9kPXNlY29uZHMgW1g4Nl0KKwkJCUJ5IGRlZmF1bHQgaXQgY2hlY2tzIGZvciBjb3JydXB0aW9uIGV2ZXJ5IDYwCisJCQlzZWNvbmRzLiAgVXNlIHRoaXMgcGFyYW1ldGVyIHRvIGNoZWNrIGF0IHNvbWUKKwkJCW90aGVyIHJhdGUuICAwIGRpc2FibGVzIHBlcmlvZGljIGNoZWNraW5nLgorCiAJbWVtdGVzdD0JW0tOTCxYODZdIEVuYWJsZSBtZW10ZXN0CiAJCQlGb3JtYXQ6IDxpbnRlZ2VyPgogCQkJcmFuZ2U6IDAsNCA6IHBhdHRlcm4gbnVtYmVyCkBAIC0xNDI1LDYgKzE0NTMsMTIgQEAKIAogCW5vbGFwaWNfdGltZXIJW1g4Ni0zMixBUElDXSBEbyBub3QgdXNlIHRoZSBsb2NhbCBBUElDIHRpbWVyLgogCisJbm94MmFwaWMJW1g4Ni02NCxBUElDXSBEbyBub3QgZW5hYmxlIHgyQVBJQyBtb2RlLgorCisJeDJhcGljX3BoeXMJW1g4Ni02NCxBUElDXSBVc2UgeDJhcGljIHBoeXNpY2FsIG1vZGUgaW5zdGVhZCBvZgorCQkJZGVmYXVsdCB4MmFwaWMgY2x1c3RlciBtb2RlIG9uIHBsYXRmb3JtcworCQkJc3VwcG9ydGluZyB4MmFwaWMuCisKIAlub2x0bGJzCQlbUFBDXSBEbyBub3QgdXNlIGxhcmdlIHBhZ2UvdGxiIGVudHJpZXMgZm9yIGtlcm5lbAogCQkJbG93bWVtIG1hcHBpbmcgb24gUFBDNDB4LgogCkBAIC0xNjgwLDYgKzE3MTQsMTEgQEAKIAkJCWF1dG9jb25maWd1cmF0aW9uLgogCQkJUmFuZ2VzIGFyZSBpbiBwYWlycyAobWVtb3J5IGJhc2UgYW5kIHNpemUpLgogCisJZHluYW1pY19wcmludGsKKwkJCUVuYWJsZXMgcHJfZGVidWcoKS9kZXZfZGJnKCkgY2FsbHMgaWYKKwkJCUNPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBoYXMgYmVlbiBlbmFibGVkLiBUaGVzZSBjYW4gYWxzbworCQkJYmUgc3dpdGNoZWQgb24vb2ZmIHZpYSA8ZGVidWdmcz4vZHluYW1pY19wcmludGsvbW9kdWxlcworCiAJcHJpbnQtZmF0YWwtc2lnbmFscz0KIAkJCVtLTkxdIGRlYnVnOiBwcmludCBmYXRhbCBzaWduYWxzCiAJCQlwcmludC1mYXRhbC1zaWduYWxzPTE6IHByaW50IHNlZ2ZhdWx0IGluZm8gdG8KQEAgLTE4ODIsNiArMTkyMSwxMiBAQAogCXNoYXBlcnM9CVtORVRdCiAJCQlNYXhpbWFsIG51bWJlciBvZiBzaGFwZXJzLgogCisJc2hvd19tc3I9CVt4ODZdIHNob3cgYm9vdC10aW1lIE1TUiBzZXR0aW5ncworCQkJRm9ybWF0OiB7IDxpbnRlZ2VyPiB9CisJCQlTaG93IGJvb3QtdGltZSAoQklPUy1pbml0aWFsaXplZCkgTVNSIHNldHRpbmdzLgorCQkJVGhlIHBhcmFtZXRlciBtZWFucyB0aGUgbnVtYmVyIG9mIENQVXMgdG8gc2hvdywKKwkJCWZvciBleGFtcGxlIDEgbWVhbnMgYm9vdCBDUFUgb25seS4KKwogCXNpbTcxMD0JCVtTQ1NJLEhXXQogCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL3Njc2kvc2ltNzEwLmMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va29iamVjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CmluZGV4IDUxYTgwMjEuLmY1ZDJhYWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dApAQCAtMTE4LDYgKzExOCwxMCBAQAogCiAgICAgaW50IGtvYmplY3RfcmVuYW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CiAKK05vdGUga29iamVjdF9yZW5hbWUgZG9lcyBwZXJmb3JtIGFueSBsb2NraW5nIG9yIGhhdmUgYSBzb2xpZCBub3Rpb24gb2YKK3doYXQgbmFtZXMgYXJlIHZhbGlkIHNvIHRoZSBwcm92aWRlIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc2FuaXR5IGNoZWNraW5nCithbmQgc2VyaWFsaXphdGlvbi4KKwogVGhlcmUgaXMgYSBmdW5jdGlvbiBjYWxsZWQga29iamVjdF9zZXRfbmFtZSgpIGJ1dCB0aGF0IGlzIGxlZ2FjeSBjcnVmdCBhbmQKIGlzIGJlaW5nIHJlbW92ZWQuICBJZiB5b3VyIGNvZGUgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCBpdCBpcwogaW5jb3JyZWN0IGFuZCBuZWVkcyB0byBiZSBmaXhlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy9kaXNrLXNob2NrLXByb3RlY3Rpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL2Rpc2stc2hvY2stcHJvdGVjdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2YmEyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy9kaXNrLXNob2NrLXByb3RlY3Rpb24udHh0CkBAIC0wLDAgKzEsMTQ5IEBACitIYXJkIGRpc2sgc2hvY2sgcHJvdGVjdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXV0aG9yOiBFbGlhcyBPbHRtYW5ucyA8ZW9AbmViZW5zYWNoZW4uZGU+CitMYXN0IG1vZGlmaWVkOiAyMDA4LTEwLTAzCisKKworMC4gQ29udGVudHMKKy0tLS0tLS0tLS0tCisKKzEuIEludHJvCisyLiBUaGUgaW50ZXJmYWNlCiszLiBSZWZlcmVuY2VzCis0LiBDUkVESVRTCisKKworMS4gSW50cm8KKy0tLS0tLS0tCisKK0FUQS9BVEFQSS03IHNwZWNpZmllcyB0aGUgSURMRSBJTU1FRElBVEUgY29tbWFuZCB3aXRoIHVubG9hZCBmZWF0dXJlLgorSXNzdWluZyB0aGlzIGNvbW1hbmQgc2hvdWxkIGNhdXNlIHRoZSBkcml2ZSB0byBzd2l0Y2ggdG8gaWRsZSBtb2RlIGFuZAordW5sb2FkIGRpc2sgaGVhZHMuIFRoaXMgZmVhdHVyZSBpcyBiZWluZyB1c2VkIGluIG1vZGVybiBsYXB0b3BzIGluCitjb25qdW5jdGlvbiB3aXRoIGFjY2VsZXJvbWV0ZXJzIGFuZCBhcHByb3ByaWF0ZSBzb2Z0d2FyZSB0byBpbXBsZW1lbnQKK2Egc2hvY2sgcHJvdGVjdGlvbiBmYWNpbGl0eS4gVGhlIGlkZWEgaXMgdG8gc3RvcCBhbGwgSS9PIG9wZXJhdGlvbnMgb24KK3RoZSBpbnRlcm5hbCBoYXJkIGRyaXZlIGFuZCBwYXJrIGl0cyBoZWFkcyBvbiB0aGUgcmFtcCB3aGVuIGNyaXRpY2FsCitzaXR1YXRpb25zIGFyZSBhbnRpY2lwYXRlZC4gVGhlIGRlc2lyZSB0byBoYXZlIHN1Y2ggYSBmZWF0dXJlCithdmFpbGFibGUgb24gR05VL0xpbnV4IHN5c3RlbXMgaGFzIGJlZW4gdGhlIG9yaWdpbmFsIG1vdGl2YXRpb24gdG8KK2ltcGxlbWVudCBhIGdlbmVyaWMgZGlzayBoZWFkIHBhcmtpbmcgaW50ZXJmYWNlIGluIHRoZSBMaW51eCBrZXJuZWwuCitQbGVhc2Ugbm90ZSwgaG93ZXZlciwgdGhhdCBvdGhlciBjb21wb25lbnRzIGhhdmUgdG8gYmUgc2V0IHVwIG9uIHlvdXIKK3N5c3RlbSBpbiBvcmRlciB0byBnZXQgZGlzayBzaG9jayBwcm90ZWN0aW9uIHdvcmtpbmcgKHNlZQorc2VjdGlvbiAzLiBSZWZlcmVuY2VzIGJlbG93IGZvciBwb2ludGVycyB0byBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGF0KS4KKworCisyLiBUaGUgaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBlYWNoIEFUQSBkZXZpY2UsIHRoZSBrZXJuZWwgZXhwb3J0cyB0aGUgZmlsZQorYmxvY2svKi9kZXZpY2UvdW5sb2FkX2hlYWRzIGluIHN5c2ZzIChoZXJlIGFzc3VtZWQgdG8gYmUgbW91bnRlZCB1bmRlcgorL3N5cykuIEFjY2VzcyB0byAvc3lzL2Jsb2NrLyovZGV2aWNlL3VubG9hZF9oZWFkcyBpcyBkZW5pZWQgd2l0aAorLUVPUE5PVFNVUFAgaWYgdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1bmxvYWQgZmVhdHVyZS4KK090aGVyd2lzZSwgd3JpdGluZyBhbiBpbnRlZ2VyIHZhbHVlIHRvIHRoaXMgZmlsZSB3aWxsIHRha2UgdGhlIGhlYWRzCitvZiB0aGUgcmVzcGVjdGl2ZSBkcml2ZSBvZmYgdGhlIHBsYXR0ZXIgYW5kIGJsb2NrIGFsbCBJL08gb3BlcmF0aW9ucworZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gV2hlbiB0aGUgdGltZW91dCBleHBpcmVzIGFuZAorbm8gZnVydGhlciBkaXNrIGhlYWQgcGFyayByZXF1ZXN0IGhhcyBiZWVuIGlzc3VlZCBpbiB0aGUgbWVhbnRpbWUsCitub3JtYWwgb3BlcmF0aW9uIHdpbGwgYmUgcmVzdW1lZC4gVGhlIG1heGltYWwgdmFsdWUgYWNjZXB0ZWQgZm9yIGEKK3RpbWVvdXQgaXMgMzAwMDAgbWlsbGlzZWNvbmRzLiBFeGNlZWRpbmcgdGhpcyBsaW1pdCB3aWxsIHJldHVybgorLUVPVkVSRkxPVywgYnV0IGhlYWRzIHdpbGwgYmUgcGFya2VkIGFueXdheSBhbmQgdGhlIHRpbWVvdXQgd2lsbCBiZQorc2V0IHRvIDMwIHNlY29uZHMuIEhvd2V2ZXIsIHlvdSBjYW4gYWx3YXlzIGNoYW5nZSBhIHRpbWVvdXQgdG8gYW55Cit2YWx1ZSBiZXR3ZWVuIDAgYW5kIDMwMDAwIGJ5IGlzc3VpbmcgYSBzdWJzZXF1ZW50IGhlYWQgcGFyayByZXF1ZXN0CitiZWZvcmUgdGhlIHRpbWVvdXQgb2YgdGhlIHByZXZpb3VzIG9uZSBoYXMgZXhwaXJlZC4gSW4gcGFydGljdWxhciwgdGhlCit0b3RhbCB0aW1lb3V0IGNhbiBleGNlZWQgMzAgc2Vjb25kcyBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHlvdSBjYW4KK2NhbmNlbCBhIHByZXZpb3VzbHkgc2V0IHRpbWVvdXQgYW5kIHJlc3VtZSBub3JtYWwgb3BlcmF0aW9uCitpbW1lZGlhdGVseSBieSBzcGVjaWZ5aW5nIGEgdGltZW91dCBvZiAwLiBWYWx1ZXMgYmVsb3cgLTIgYXJlIHJlamVjdGVkCit3aXRoIC1FSU5WQUwgKHNlZSBiZWxvdyBmb3IgdGhlIHNwZWNpYWwgbWVhbmluZyBvZiAtMSBhbmQgLTIpLiBJZiB0aGUKK3RpbWVvdXQgc3BlY2lmaWVkIGZvciBhIHJlY2VudCBoZWFkIHBhcmsgcmVxdWVzdCBoYXMgbm90IHlldCBleHBpcmVkLAorcmVhZGluZyBmcm9tIC9zeXMvYmxvY2svKi9kZXZpY2UvdW5sb2FkX2hlYWRzIHdpbGwgcmVwb3J0IHRoZSBudW1iZXIKK29mIG1pbGxpc2Vjb25kcyByZW1haW5pbmcgdW50aWwgbm9ybWFsIG9wZXJhdGlvbiB3aWxsIGJlIHJlc3VtZWQ7CitvdGhlcndpc2UsIHJlYWRpbmcgdGhlIHVubG9hZF9oZWFkcyBhdHRyaWJ1dGUgd2lsbCByZXR1cm4gMC4KKworRm9yIGV4YW1wbGUsIGRvIHRoZSBmb2xsb3dpbmcgaW4gb3JkZXIgdG8gcGFyayB0aGUgaGVhZHMgb2YgZHJpdmUKKy9kZXYvc2RhIGFuZCBzdG9wIGFsbCBJL08gb3BlcmF0aW9ucyBmb3IgZml2ZSBzZWNvbmRzOgorCisjIGVjaG8gNTAwMCA+IC9zeXMvYmxvY2svc2RhL2RldmljZS91bmxvYWRfaGVhZHMKKworQSBzaW1wbGUKKworIyBjYXQgL3N5cy9ibG9jay9zZGEvZGV2aWNlL3VubG9hZF9oZWFkcworCit3aWxsIHNob3cgeW91IGhvdyBtYW55IG1pbGxpc2Vjb25kcyBhcmUgbGVmdCBiZWZvcmUgbm9ybWFsIG9wZXJhdGlvbgord2lsbCBiZSByZXN1bWVkLgorCitBIHdvcmQgb2YgY2F1dGlvbjogVGhlIGZhY3QgdGhhdCB0aGUgaW50ZXJmYWNlIG9wZXJhdGVzIG9uIGEgYmFzaXMgb2YKK21pbGxpc2Vjb25kcyBtYXkgcmFpc2UgZXhwZWN0YXRpb25zIHRoYXQgY2Fubm90IGJlIHNhdGlzZmllZCBpbgorcmVhbGl0eS4gSW4gZmFjdCwgdGhlIEFUQSBzcGVjcyBjbGVhcmx5IHN0YXRlIHRoYXQgdGhlIHRpbWUgZm9yIGFuCit1bmxvYWQgb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGlzIHZlbmRvciBzcGVjaWZpYy4gVGhlIGhpbnQgaW4gQVRBLTcKK3RoYXQgdGhpcyB3aWxsIHR5cGljYWxseSBiZSB3aXRoaW4gNTAwIG1pbGxpc2Vjb25kcyBhcHBhcmVudGx5IGhhcworYmVlbiBkcm9wcGVkIGluIEFUQS04LgorCitUaGVyZSBpcyBhIHRlY2huaWNhbCBkZXRhaWwgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IG1heSBjYXVzZSBzb21lCitjb25mdXNpb24gYW5kIHNob3VsZCBiZSBkaXNjdXNzZWQgaGVyZS4gV2hlbiBhIGhlYWQgcGFyayByZXF1ZXN0IGhhcworYmVlbiBpc3N1ZWQgdG8gYSBkZXZpY2Ugc3VjY2Vzc2Z1bGx5LCBhbGwgSS9PIG9wZXJhdGlvbnMgb24gdGhlCitjb250cm9sbGVyIHBvcnQgdGhpcyBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gd2lsbCBiZSBkZWZlcnJlZC4gVGhhdCBpcwordG8gc2F5LCBhbnkgb3RoZXIgZGV2aWNlIHRoYXQgbWF5IGJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwb3J0IHdpbGwKK2JlIGFmZmVjdGVkIHRvby4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoYXQgYSBzdWJzZXF1ZW50IGhlYWQgdW5sb2FkCityZXF1ZXN0IHRvIHRoYXQgb3RoZXIgZGV2aWNlIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuIEZ1cnRoZXIKK29wZXJhdGlvbnMgb24gdGhhdCBwb3J0IHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgdGhlIHRpbWVvdXQgc3BlY2lmaWVkCitmb3IgZWl0aGVyIGRldmljZSBvbiB0aGUgcG9ydCBoYXMgZXhwaXJlZC4gQXMgZmFyIGFzIFBBVEEgKG9sZCBzdHlsZQorSURFKSBjb25maWd1cmF0aW9ucyBhcmUgY29uY2VybmVkLCB0aGVyZSBjYW4gb25seSBiZSB0d28gZGV2aWNlcworYXR0YWNoZWQgdG8gYW55IHNpbmdsZSBwb3J0LiBJbiBTQVRBIHdvcmxkIHdlIGhhdmUgcG9ydCBtdWx0aXBsaWVycword2hpY2ggbWVhbnMgdGhhdCBhIHVzZXItaXNzdWVkIGhlYWQgcGFya2luZyByZXF1ZXN0IHRvIG9uZSBkZXZpY2UgbWF5CithY3R1YWxseSByZXN1bHQgaW4gc3RvcHBpbmcgSS9PIHRvIGEgd2hvbGUgYnVuY2ggb2YgZGV2aWNlcy4gSG93ZXZlciwKK3NpbmNlIHRoaXMgZmVhdHVyZSBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIG9uIGxhcHRvcHMgYW5kIGRvZXMgbm90IHNlZW0KK3RvIGJlIHZlcnkgdXNlZnVsIGluIGFueSBvdGhlciBlbnZpcm9ubWVudCwgdGhlcmUgd2lsbCBiZSBtb3N0bHkgb25lCitkZXZpY2UgcGVyIHBvcnQuIEV2ZW4gaWYgdGhlIENEL0RWRCB3cml0ZXIgaGFwcGVucyB0byBiZSBjb25uZWN0ZWQgdG8KK3RoZSBzYW1lIHBvcnQgYXMgdGhlIGhhcmQgZHJpdmUsIGl0IGdlbmVyYWxseSAqc2hvdWxkKiByZWNvdmVyIGp1c3QKK2ZpbmUgZnJvbSB0aGUgb2NjYXNpb25hbCBidWZmZXIgdW5kZXItcnVuIGluY3VycmVkIGJ5IGEgaGVhZCBwYXJrCityZXF1ZXN0IHRvIHRoZSBIRC4gQWN0dWFsbHksIHdoZW4geW91IGFyZSB1c2luZyBhbiBpZGUgZHJpdmVyIHJhdGhlcgordGhhbiBpdHMgbGliYXRhIGNvdW50ZXJwYXJ0IChpLmUuIHlvdXIgZGlzayBpcyBjYWxsZWQgL2Rldi9oZGEKK2luc3RlYWQgb2YgL2Rldi9zZGEpLCB0aGVuIHBhcmtpbmcgdGhlIGhlYWRzIG9mIG9uZSBkcml2ZSAoZHJpdmUgWCkKK3dpbGwgZ2VuZXJhbGx5IG5vdCBhZmZlY3QgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIG9mIGFub3RoZXIgZHJpdmUKKyhkcml2ZSBZKSBvbiB0aGUgc2FtZSBwb3J0IGFzIGRlc2NyaWJlZCBhYm92ZS4gSXQgaXMgb25seSB3aGVuIGEgcG9ydAorcmVzZXQgaXMgcmVxdWlyZWQgdG8gcmVjb3ZlciBmcm9tIGFuIGV4Y2VwdGlvbiBvbiBkcml2ZSBZIHRoYXQgZnVydGhlcgorSS9PIG9wZXJhdGlvbnMgb24gdGhhdCBkcml2ZSAoYW5kIHRoZSByZXNldCBpdHNlbGYpIHdpbGwgYmUgZGVsYXllZAordW50aWwgZHJpdmUgWCBpcyBubyBsb25nZXIgaW4gdGhlIHBhcmtlZCBzdGF0ZS4KKworRmluYWxseSwgdGhlcmUgYXJlIHNvbWUgaGFyZCBkcml2ZXMgdGhhdCBvbmx5IGNvbXBseSB3aXRoIGFuIGVhcmxpZXIKK3ZlcnNpb24gb2YgdGhlIEFUQSBzdGFuZGFyZCB0aGFuIEFUQS03LCBidXQgZG8gc3VwcG9ydCB0aGUgdW5sb2FkCitmZWF0dXJlIG5vbmV0aGVsZXNzLiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyBzYWZlIHdheSBMaW51eCBjYW4KK2RldGVjdCB0aGVzZSBkZXZpY2VzLCBzbyB5b3Ugd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byB0aGUKK3VubG9hZF9oZWFkcyBhdHRyaWJ1dGUuIElmIHlvdSBrbm93IHRoYXQgeW91ciBkZXZpY2UgcmVhbGx5IGRvZXMKK3N1cHBvcnQgdGhlIHVubG9hZCBmZWF0dXJlIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhlIHZlbmRvciBvZiB5b3VyCitsYXB0b3Agb3IgdGhlIGhhcmQgZHJpdmUgaXRzZWxmIHRvbGQgeW91IHNvKSwgdGhlbiB5b3UgY2FuIHRlbGwgdGhlCitrZXJuZWwgdG8gZW5hYmxlIHRoZSB1c2FnZSBvZiB0aGlzIGZlYXR1cmUgZm9yIHRoYXQgZHJpdmUgYnkgd3JpdGluZwordGhlIHNwZWNpYWwgdmFsdWUgLTEgdG8gdGhlIHVubG9hZF9oZWFkcyBhdHRyaWJ1dGU6CisKKyMgZWNobyAtMSA+IC9zeXMvYmxvY2svc2RhL2RldmljZS91bmxvYWRfaGVhZHMKKword2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgZm9yIC9kZXYvc2RhLCBhbmQgZ2l2aW5nIC0yIGluc3RlYWQgb2YgLTEgd2lsbAorZGlzYWJsZSBpdCBhZ2Fpbi4KKworCiszLiBSZWZlcmVuY2VzCistLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBzZXZlcmFsIGxhcHRvcHMgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBmZWF0dXJpbmcgc2hvY2sKK3Byb3RlY3Rpb24gY2FwYWJpbGl0aWVzLiBBcyBtYW51ZmFjdHVyZXJzIGhhdmUgcmVmdXNlZCB0byBzdXBwb3J0IG9wZW4KK3NvdXJjZSBkZXZlbG9wbWVudCBvZiB0aGUgcmVxdWlyZWQgc29mdHdhcmUgY29tcG9uZW50cyBzbyBmYXIsIExpbnV4CitzdXBwb3J0IGZvciBzaG9jayBwcm90ZWN0aW9uIHZhcmllcyBjb25zaWRlcmFibHkgYmV0d2VlbiBkaWZmZXJlbnQKK2hhcmR3YXJlIGltcGxlbWVudGF0aW9ucy4gSWRlYWxseSwgdGhpcyBzZWN0aW9uIHNob3VsZCBjb250YWluIGEgbGlzdAorb2YgcG9pbnRlcnMgYXQgZGlmZmVyZW50IHByb2plY3RzIGFpbWluZyBhdCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzaG9jaworcHJvdGVjdGlvbiBvbiBkaWZmZXJlbnQgc3lzdGVtcy4gVW5mb3J0dW5hdGVseSwgSSBvbmx5IGtub3cgb2YgYQorc2luZ2xlIHByb2plY3Qgd2hpY2gsIGFsdGhvdWdoIHN0aWxsIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLCBpcyBmaXQKK2ZvciB1c2UuIFBsZWFzZSBmZWVsIGZyZWUgdG8gYWRkIHByb2plY3RzIHRoYXQgaGF2ZSBiZWVuIHRoZSB2aWN0aW1zCitvZiBteSBpZ25vcmFuY2UuCisKKy0gaHR0cDovL3d3dy50aGlua3dpa2kub3JnL3dpa2kvSERBUFMKKyAgU2VlIHRoaXMgcGFnZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgTGludXggc3VwcG9ydCBvZiB0aGUgaGFyZCBkaXNrCisgIGFjdGl2ZSBwcm90ZWN0aW9uIHN5c3RlbSBhcyBpbXBsZW1lbnRlZCBpbiBJQk0vTGVub3ZvIFRoaW5rcGFkcy4KKworCis0LiBDUkVESVRTCistLS0tLS0tLS0tCisKK1RoaXMgaW1wbGVtZW50YXRpb24gb2YgZGlzayBoZWFkIHBhcmtpbmcgaGFzIGJlZW4gaW5zcGlyZWQgYnkgYSBwYXRjaAorb3JpZ2luYWxseSBwdWJsaXNoZWQgYnkgSm9uIEVzY29tYmUgPGxpc3RzQGRyZXNjby5jby51az4uIE15IGVmZm9ydHMKK3RvIGRldmVsb3AgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmZWF0dXJlIHRoYXQgaXMgZml0IHRvIGJlIG1lcmdlZAoraW50byBtYWlubGluZSBoYXZlIGJlZW4gYWlkZWQgYnkgdmFyaW91cyBrZXJuZWwgZGV2ZWxvcGVycywgaW4KK3BhcnRpY3VsYXIgYnkgVGVqdW4gSGVvIGFuZCBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tdHJyLnR4dCBiL0RvY3VtZW50YXRpb24vbXRyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOWFjMzkuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9tdHJyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi1NVFJSIChNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcikgY29udHJvbAotMyBKdW4gMTk5OQotUmljaGFyZCBHb29jaAotPHJnb29jaEBhdG5mLmNzaXJvLmF1PgotCi0gIE9uIEludGVsIFA2IGZhbWlseSBwcm9jZXNzb3JzIChQZW50aXVtIFBybywgUGVudGl1bSBJSSBhbmQgbGF0ZXIpCi0gIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcnMgKE1UUlJzKSBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gIHByb2Nlc3NvciBhY2Nlc3MgdG8gbWVtb3J5IHJhbmdlcy4gVGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIHlvdSBoYXZlCi0gIGEgdmlkZW8gKFZHQSkgY2FyZCBvbiBhIFBDSSBvciBBR1AgYnVzLiBFbmFibGluZyB3cml0ZS1jb21iaW5pbmcKLSAgYWxsb3dzIGJ1cyB3cml0ZSB0cmFuc2ZlcnMgdG8gYmUgY29tYmluZWQgaW50byBhIGxhcmdlciB0cmFuc2ZlcgotICBiZWZvcmUgYnVyc3Rpbmcgb3ZlciB0aGUgUENJL0FHUCBidXMuIFRoaXMgY2FuIGluY3JlYXNlIHBlcmZvcm1hbmNlCi0gIG9mIGltYWdlIHdyaXRlIG9wZXJhdGlvbnMgMi41IHRpbWVzIG9yIG1vcmUuCi0KLSAgVGhlIEN5cml4IDZ4ODYsIDZ4ODZNWCBhbmQgTSBJSSBwcm9jZXNzb3JzIGhhdmUgQWRkcmVzcyBSYW5nZQotICBSZWdpc3RlcnMgKEFSUnMpIHdoaWNoIHByb3ZpZGUgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gTVRSUnMuIEZvcgotICB0aGVzZSwgdGhlIEFSUnMgYXJlIHVzZWQgdG8gZW11bGF0ZSB0aGUgTVRSUnMuCi0KLSAgVGhlIEFNRCBLNi0yIChzdGVwcGluZyA4IGFuZCBhYm92ZSkgYW5kIEs2LTMgcHJvY2Vzc29ycyBoYXZlIHR3bwotICBNVFJScy4gVGhlc2UgYXJlIHN1cHBvcnRlZC4gIFRoZSBBTUQgQXRobG9uIGZhbWlseSBwcm92aWRlIDggSW50ZWwKLSAgc3R5bGUgTVRSUnMuCi0gIAotICBUaGUgQ2VudGF1ciBDNiAoV2luQ2hpcCkgaGFzIDggTUNScywgYWxsb3dpbmcgd3JpdGUtY29tYmluaW5nLiBUaGVzZQotICBhcmUgc3VwcG9ydGVkLgotCi0gIFRoZSBWSUEgQ3lyaXggSUlJIGFuZCBWSUEgQzMgQ1BVcyBvZmZlciA4IEludGVsIHN0eWxlIE1UUlJzLgotCi0gIFRoZSBDT05GSUdfTVRSUiBvcHRpb24gY3JlYXRlcyBhIC9wcm9jL210cnIgZmlsZSB3aGljaCBtYXkgYmUgdXNlZAotICB0byBtYW5pcHVsYXRlIHlvdXIgTVRSUnMuIFR5cGljYWxseSB0aGUgWCBzZXJ2ZXIgc2hvdWxkIHVzZQotICB0aGlzLiBUaGlzIHNob3VsZCBoYXZlIGEgcmVhc29uYWJseSBnZW5lcmljIGludGVyZmFjZSBzbyB0aGF0Ci0gIHNpbWlsYXIgY29udHJvbCByZWdpc3RlcnMgb24gb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgZWFzaWx5Ci0gIHN1cHBvcnRlZC4KLQotCi1UaGVyZSBhcmUgdHdvIGludGVyZmFjZXMgdG8gL3Byb2MvbXRycjogb25lIGlzIGFuIEFTQ0lJIGludGVyZmFjZQotd2hpY2ggYWxsb3dzIHlvdSB0byByZWFkIGFuZCB3cml0ZS4gVGhlIG90aGVyIGlzIGFuIGlvY3RsKCkKLWludGVyZmFjZS4gVGhlIEFTQ0lJIGludGVyZmFjZSBpcyBtZWFudCBmb3IgYWRtaW5pc3RyYXRpb24uIFRoZQotaW9jdGwoKSBpbnRlcmZhY2UgaXMgbWVhbnQgZm9yIEMgcHJvZ3JhbXMgKGkuZS4gdGhlIFggc2VydmVyKS4gVGhlCi1pbnRlcmZhY2VzIGFyZSBkZXNjcmliZWQgYmVsb3csIHdpdGggc2FtcGxlIGNvbW1hbmRzIGFuZCBDIGNvZGUuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJlYWRpbmcgTVRSUnMgZnJvbSB0aGUgc2hlbGw6Ci0KLSUgY2F0IC9wcm9jL210cnIKLXJlZzAwOiBiYXNlPTB4MDAwMDAwMDAgKCAgIDBNQiksIHNpemU9IDEyOE1COiB3cml0ZS1iYWNrLCBjb3VudD0xCi1yZWcwMTogYmFzZT0weDA4MDAwMDAwICggMTI4TUIpLCBzaXplPSAgNjRNQjogd3JpdGUtYmFjaywgY291bnQ9MQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ3JlYXRpbmcgTVRSUnMgZnJvbSB0aGUgQy1zaGVsbDoKLSMgZWNobyAiYmFzZT0weGY4MDAwMDAwIHNpemU9MHg0MDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID4hIC9wcm9jL210cnIKLW9yIGlmIHlvdSB1c2UgYmFzaDoKLSMgZWNobyAiYmFzZT0weGY4MDAwMDAwIHNpemU9MHg0MDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID58IC9wcm9jL210cnIKLQotQW5kIHRoZSByZXN1bHQgdGhlcmVvZjoKLSUgY2F0IC9wcm9jL210cnIKLXJlZzAwOiBiYXNlPTB4MDAwMDAwMDAgKCAgIDBNQiksIHNpemU9IDEyOE1COiB3cml0ZS1iYWNrLCBjb3VudD0xCi1yZWcwMTogYmFzZT0weDA4MDAwMDAwICggMTI4TUIpLCBzaXplPSAgNjRNQjogd3JpdGUtYmFjaywgY291bnQ9MQotcmVnMDI6IGJhc2U9MHhmODAwMDAwMCAoMzk2OE1CKSwgc2l6ZT0gICA0TUI6IHdyaXRlLWNvbWJpbmluZywgY291bnQ9MQotCi1UaGlzIGlzIGZvciB2aWRlbyBSQU0gYXQgYmFzZSBhZGRyZXNzIDB4ZjgwMDAwMDAgYW5kIHNpemUgNCBtZWdhYnl0ZXMuIFRvCi1maW5kIG91dCB5b3VyIGJhc2UgYWRkcmVzcywgeW91IG5lZWQgdG8gbG9vayBhdCB0aGUgb3V0cHV0IG9mIHlvdXIgWAotc2VydmVyLCB3aGljaCB0ZWxscyB5b3Ugd2hlcmUgdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciBhZGRyZXNzIGlzLiBBCi10eXBpY2FsIGxpbmUgdGhhdCB5b3UgbWF5IGdldCBpczoKLQotKC0tKSBTMzogUENJOiA5NjggcmV2IDAsIExpbmVhciBGQiBAIDB4ZjgwMDAwMDAKLQotTm90ZSB0aGF0IHlvdSBzaG91bGQgb25seSB1c2UgdGhlIHZhbHVlIGZyb20gdGhlIFggc2VydmVyLCBhcyBpdCBtYXkKLW1vdmUgdGhlIGZyYW1lYnVmZmVyIGJhc2UgYWRkcmVzcywgc28gdGhlIG9ubHkgdmFsdWUgeW91IGNhbiB0cnVzdCBpcwotdGhhdCByZXBvcnRlZCBieSB0aGUgWCBzZXJ2ZXIuCi0KLVRvIGZpbmQgb3V0IHRoZSBzaXplIG9mIHlvdXIgZnJhbWVidWZmZXIgKHdoYXQsIHlvdSBkb24ndCBhY3R1YWxseQota25vdz8pLCB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCB0ZWxsIHlvdToKLQotKC0tKSBTMzogdmlkZW9yYW06ICA0MDk2awotCi1UaGF0J3MgNCBtZWdhYnl0ZXMsIHdoaWNoIGlzIDB4NDAwMDAwIGJ5dGVzIChpbiBoZXhhZGVjaW1hbCkuCi1BIHBhdGNoIGlzIGJlaW5nIHdyaXR0ZW4gZm9yIFhGcmVlODYgd2hpY2ggd2lsbCBtYWtlIHRoaXMgYXV0b21hdGljOgotaW4gb3RoZXIgd29yZHMgdGhlIFggc2VydmVyIHdpbGwgbWFuaXB1bGF0ZSAvcHJvYy9tdHJyIHVzaW5nIHRoZQotaW9jdGwoKSBpbnRlcmZhY2UsIHNvIHVzZXJzIHdvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuIElmIHlvdSB1c2UgYQotY29tbWVyY2lhbCBYIHNlcnZlciwgbG9iYnkgeW91ciB2ZW5kb3IgdG8gYWRkIHN1cHBvcnQgZm9yIE1UUlJzLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ3JlYXRpbmcgb3ZlcmxhcHBpbmcgTVRSUnM6Ci0KLSVlY2hvICJiYXNlPTB4ZmIwMDAwMDAgc2l6ZT0weDEwMDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID4vcHJvYy9tdHJyCi0lZWNobyAiYmFzZT0weGZiMDAwMDAwIHNpemU9MHgxMDAwIHR5cGU9dW5jYWNoYWJsZSIgPi9wcm9jL210cnIKLQotQW5kIHRoZSByZXN1bHRzOiBjYXQgL3Byb2MvbXRycgotcmVnMDA6IGJhc2U9MHgwMDAwMDAwMCAoICAgME1CKSwgc2l6ZT0gIDY0TUI6IHdyaXRlLWJhY2ssIGNvdW50PTEKLXJlZzAxOiBiYXNlPTB4ZmIwMDAwMDAgKDQwMTZNQiksIHNpemU9ICAxNk1COiB3cml0ZS1jb21iaW5pbmcsIGNvdW50PTEKLXJlZzAyOiBiYXNlPTB4ZmIwMDAwMDAgKDQwMTZNQiksIHNpemU9ICAgNGtCOiB1bmNhY2hhYmxlLCBjb3VudD0xCi0KLVNvbWUgY2FyZHMgKGVzcGVjaWFsbHkgVm9vZG9vIEdyYXBoaWNzIGJvYXJkcykgbmVlZCB0aGlzIDQga0IgYXJlYSAKLWV4Y2x1ZGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uIGJlY2F1c2UgaXQgaXMgdXNlZCBmb3IKLXJlZ2lzdGVycy4KLQotTk9URTogWW91IGNhbiBvbmx5IGNyZWF0ZSB0eXBlPXVuY2FjaGFibGUgcmVnaW9uLCBpZiB0aGUgZmlyc3QKLXJlZ2lvbiB0aGF0IHlvdSBjcmVhdGVkIGlzIHR5cGU9d3JpdGUtY29tYmluaW5nLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUmVtb3ZpbmcgTVRSUnMgZnJvbSB0aGUgQy1zaGVsbDoKLSUgZWNobyAiZGlzYWJsZT0yIiA+ISAvcHJvYy9tdHJyCi1vciB1c2luZyBiYXNoOgotJSBlY2hvICJkaXNhYmxlPTIiID58IC9wcm9jL210cnIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJlYWRpbmcgTVRSUnMgZnJvbSBhIEMgcHJvZ3JhbSB1c2luZyBpb2N0bCgpJ3M6Ci0KLS8qICBtdHJyLXNob3cuYwotCi0gICAgU291cmNlIGZpbGUgZm9yIG10cnItc2hvdyAoZXhhbXBsZSBwcm9ncmFtIHRvIHNob3cgTVRSUnMgdXNpbmcgaW9jdGwoKSdzKQotCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggIFJpY2hhcmQgR29vY2gKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gICAgUmljaGFyZCBHb29jaCBtYXkgYmUgcmVhY2hlZCBieSBlbWFpbCBhdCAgcmdvb2NoQGF0bmYuY3Npcm8uYXUKLSAgICBUaGUgcG9zdGFsIGFkZHJlc3MgaXM6Ci0gICAgICBSaWNoYXJkIEdvb2NoLCBjL28gQVRORiwgUC4gTy4gQm94IDc2LCBFcHBpbmcsIE4uUy5XLiwgMjEyMSwgQXVzdHJhbGlhLgotKi8KLQotLyoKLSAgICBUaGlzIHByb2dyYW0gd2lsbCB1c2UgYW4gaW9jdGwoKSBvbiAvcHJvYy9tdHJyIHRvIHNob3cgdGhlIGN1cnJlbnQgTVRSUgotICAgIHNldHRpbmdzLiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHJlYWRpbmcgL3Byb2MvbXRyci4KLQotCi0gICAgV3JpdHRlbiBieSAgICAgIFJpY2hhcmQgR29vY2ggICAxNy1ERUMtMTk5NwotCi0gICAgTGFzdCB1cGRhdGVkIGJ5IFJpY2hhcmQgR29vY2ggICAyLU1BWS0xOTk4Ci0KLQotKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzbS9tdHJyLmg+Ci0KLSNkZWZpbmUgVFJVRSAxCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgRVJSU1RSSU5HIHN0cmVycm9yIChlcnJubykKLQotc3RhdGljIGNoYXIgKm10cnJfc3RyaW5nc1tNVFJSX05VTV9UWVBFU10gPQotewotICAgICJ1bmNhY2hhYmxlIiwgICAgICAgICAgICAgICAvKiAwICovCi0gICAgIndyaXRlLWNvbWJpbmluZyIsICAgICAgICAgIC8qIDEgKi8KLSAgICAiPyIsICAgICAgICAgICAgICAgICAgICAgICAgLyogMiAqLwotICAgICI/IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAzICovCi0gICAgIndyaXRlLXRocm91Z2giLCAgICAgICAgICAgIC8qIDQgKi8KLSAgICAid3JpdGUtcHJvdGVjdCIsICAgICAgICAgICAgLyogNSAqLwotICAgICJ3cml0ZS1iYWNrIiwgICAgICAgICAgICAgICAvKiA2ICovCi19OwotCi1pbnQgbWFpbiAoKQotewotICAgIGludCBmZDsKLSAgICBzdHJ1Y3QgbXRycl9nZW50cnkgZ2VudHJ5OwotCi0gICAgaWYgKCAoIGZkID0gb3BlbiAoIi9wcm9jL210cnIiLCBPX1JET05MWSwgMCkgKSA9PSAtMSApCi0gICAgewotCWlmIChlcnJubyA9PSBFTk9FTlQpCi0JewotCSAgICBmcHV0cyAoIi9wcm9jL210cnIgbm90IGZvdW5kOiBub3Qgc3VwcG9ydGVkIG9yIHlvdSBkb24ndCBoYXZlIGEgUFBybz9cbiIsCi0JCSAgIHN0ZGVycik7Ci0JICAgIGV4aXQgKDEpOwotCX0KLQlmcHJpbnRmIChzdGRlcnIsICJFcnJvciBvcGVuaW5nIC9wcm9jL210cnJcdCVzXG4iLCBFUlJTVFJJTkcpOwotCWV4aXQgKDIpOwotICAgIH0KLSAgICBmb3IgKGdlbnRyeS5yZWdudW0gPSAwOyBpb2N0bCAoZmQsIE1UUlJJT0NfR0VUX0VOVFJZLCAmZ2VudHJ5KSA9PSAwOwotCSArK2dlbnRyeS5yZWdudW0pCi0gICAgewotCWlmIChnZW50cnkuc2l6ZSA8IDEpCi0JewotCSAgICBmcHJpbnRmIChzdGRlcnIsICJSZWdpc3RlcjogJXUgZGlzYWJsZWRcbiIsIGdlbnRyeS5yZWdudW0pOwotCSAgICBjb250aW51ZTsKLQl9Ci0JZnByaW50ZiAoc3RkZXJyLCAiUmVnaXN0ZXI6ICV1IGJhc2U6IDB4JWx4IHNpemU6IDB4JWx4IHR5cGU6ICVzXG4iLAotCQkgZ2VudHJ5LnJlZ251bSwgZ2VudHJ5LmJhc2UsIGdlbnRyeS5zaXplLAotCQkgbXRycl9zdHJpbmdzW2dlbnRyeS50eXBlXSk7Ci0gICAgfQotICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIGV4aXQgKDApOwotICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGRvaW5nIGlvY3RsKDIpIG9uIC9kZXYvbXRyclx0JXNcbiIsIEVSUlNUUklORyk7Ci0gICAgZXhpdCAoMyk7Ci19ICAgLyogIEVuZCBGdW5jdGlvbiBtYWluICAqLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQ3JlYXRpbmcgTVRSUnMgZnJvbSBhIEMgcHJvZ3JhbW1lIHVzaW5nIGlvY3RsKCknczoKLQotLyogIG10cnItYWRkLmMKLQotICAgIFNvdXJjZSBmaWxlIGZvciBtdHJyLWFkZCAoZXhhbXBsZSBwcm9ncmFtbWUgdG8gYWRkIGFuIE1UUlJzIHVzaW5nIGlvY3RsKCkpCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OCAgUmljaGFyZCBHb29jaAotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQotICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKLSAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCi0qLwotCi0vKgotICAgIFRoaXMgcHJvZ3JhbW1lIHdpbGwgdXNlIGFuIGlvY3RsKCkgb24gL3Byb2MvbXRyciB0byBhZGQgYW4gZW50cnkuIFRoZSBmaXJzdAotICAgIGF2YWlsYWJsZSBtdHJyIGlzIHVzZWQuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gd3JpdGluZyAvcHJvYy9tdHJyLgotCi0KLSAgICBXcml0dGVuIGJ5ICAgICAgUmljaGFyZCBHb29jaCAgIDE3LURFQy0xOTk3Ci0KLSAgICBMYXN0IHVwZGF0ZWQgYnkgUmljaGFyZCBHb29jaCAgIDItTUFZLTE5OTgKLQotCi0qLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL210cnIuaD4KLQotI2RlZmluZSBUUlVFIDEKLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBFUlJTVFJJTkcgc3RyZXJyb3IgKGVycm5vKQotCi1zdGF0aWMgY2hhciAqbXRycl9zdHJpbmdzW01UUlJfTlVNX1RZUEVTXSA9Ci17Ci0gICAgInVuY2FjaGFibGUiLCAgICAgICAgICAgICAgIC8qIDAgKi8KLSAgICAid3JpdGUtY29tYmluaW5nIiwgICAgICAgICAgLyogMSAqLwotICAgICI/IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCi0gICAgIj8iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgKi8KLSAgICAid3JpdGUtdGhyb3VnaCIsICAgICAgICAgICAgLyogNCAqLwotICAgICJ3cml0ZS1wcm90ZWN0IiwgICAgICAgICAgICAvKiA1ICovCi0gICAgIndyaXRlLWJhY2siLCAgICAgICAgICAgICAgIC8qIDYgKi8KLX07Ci0KLWludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGZkOwotICAgIHN0cnVjdCBtdHJyX3NlbnRyeSBzZW50cnk7Ci0KLSAgICBpZiAoYXJnYyAhPSA0KQotICAgIHsKLQlmcHJpbnRmIChzdGRlcnIsICJVc2FnZTpcdG10cnItYWRkIGJhc2Ugc2l6ZSB0eXBlXG4iKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgc2VudHJ5LmJhc2UgPSBzdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAwKTsKLSAgICBzZW50cnkuc2l6ZSA9IHN0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDApOwotICAgIGZvciAoc2VudHJ5LnR5cGUgPSAwOyBzZW50cnkudHlwZSA8IE1UUlJfTlVNX1RZUEVTOyArK3NlbnRyeS50eXBlKQotICAgIHsKLQlpZiAoc3RyY21wIChhcmd2WzNdLCBtdHJyX3N0cmluZ3Nbc2VudHJ5LnR5cGVdKSA9PSAwKSBicmVhazsKLSAgICB9Ci0gICAgaWYgKHNlbnRyeS50eXBlID49IE1UUlJfTlVNX1RZUEVTKQotICAgIHsKLQlmcHJpbnRmIChzdGRlcnIsICJJbGxlZ2FsIHR5cGU6IFwiJXNcIlxuIiwgYXJndlszXSk7Ci0JZXhpdCAoMik7Ci0gICAgfQotICAgIGlmICggKCBmZCA9IG9wZW4gKCIvcHJvYy9tdHJyIiwgT19XUk9OTFksIDApICkgPT0gLTEgKQotICAgIHsKLQlpZiAoZXJybm8gPT0gRU5PRU5UKQotCXsKLQkgICAgZnB1dHMgKCIvcHJvYy9tdHJyIG5vdCBmb3VuZDogbm90IHN1cHBvcnRlZCBvciB5b3UgZG9uJ3QgaGF2ZSBhIFBQcm8/XG4iLAotCQkgICBzdGRlcnIpOwotCSAgICBleGl0ICgzKTsKLQl9Ci0JZnByaW50ZiAoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyAvcHJvYy9tdHJyXHQlc1xuIiwgRVJSU1RSSU5HKTsKLQlleGl0ICg0KTsKLSAgICB9Ci0gICAgaWYgKGlvY3RsIChmZCwgTVRSUklPQ19BRERfRU5UUlksICZzZW50cnkpID09IC0xKQotICAgIHsKLQlmcHJpbnRmIChzdGRlcnIsICJFcnJvciBkb2luZyBpb2N0bCgyKSBvbiAvZGV2L210cnJcdCVzXG4iLCBFUlJTVFJJTkcpOwotCWV4aXQgKDUpOwotICAgIH0KLSAgICBmcHJpbnRmIChzdGRlcnIsICJTbGVlcGluZyBmb3IgNSBzZWNvbmRzIHNvIHlvdSBjYW4gc2VlIHRoZSBuZXcgZW50cnlcbiIpOwotICAgIHNsZWVwICg1KTsKLSAgICBjbG9zZSAoZmQpOwotICAgIGZwdXRzICgiSSd2ZSBqdXN0IGNsb3NlZCAvcHJvYy9tdHJyIHNvIG5vdyB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBnb25lXG4iLAotCSAgIHN0ZGVycik7Ci19ICAgLyogIEVuZCBGdW5jdGlvbiBtYWluICAqLwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL0xJQ0VOU0UucWxnZSBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9MSUNFTlNFLnFsZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzYjZlZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9MSUNFTlNFLnFsZ2UKQEAgLTAsMCArMSw0NiBAQAorQ29weXJpZ2h0IChjKSAgMjAwMy0yMDA4IFFMb2dpYyBDb3Jwb3JhdGlvbgorUUxvZ2ljIExpbnV4IE5ldHdvcmtpbmcgSEJBIERyaXZlcgorCitUaGlzIHByb2dyYW0gaW5jbHVkZXMgYSBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAyLjYgdGhhdCBtYXkgYmUKK2Rpc3RyaWJ1dGVkIHdpdGggUUxvZ2ljIGhhcmR3YXJlIHNwZWNpZmljIGZpcm13YXJlIGJpbmFyeSBmaWxlLgorWW91IG1heSBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgZGV2aWNlIGRyaXZlciBjb2RlIHVuZGVyIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uICh2ZXJzaW9uIDIgb3IgYSBsYXRlciB2ZXJzaW9uKS4KKworWW91IG1heSByZWRpc3RyaWJ1dGUgdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpcm13YXJlIGJpbmFyeSBmaWxlCit1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgorCisJMS4gUmVkaXN0cmlidXRpb24gb2Ygc291cmNlIGNvZGUgKG9ubHkgaWYgYXBwbGljYWJsZSksCisJICAgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZgorCSAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworCTIuIFJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorCSAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKwkgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKwkgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisJMy4gVGhlIG5hbWUgb2YgUUxvZ2ljIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0bworCSAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorCSAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisKK1JFR0FSRExFU1MgT0YgV0hBVCBMSUNFTlNJTkcgTUVDSEFOSVNNIElTIFVTRUQgT1IgQVBQTElDQUJMRSwKK1RISVMgUFJPR1JBTSBJUyBQUk9WSURFRCBCWSBRTE9HSUMgQ09SUE9SQVRJT04gIkFTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUgorQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitVU0VSIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTIFRIQVQgVVNFIE9GIFRISVMgUFJPR1JBTSBXSUxMIE5PVAorQ1JFQVRFIE9SIEdJVkUgR1JPVU5EUyBGT1IgQSBMSUNFTlNFIEJZIElNUExJQ0FUSU9OLCBFU1RPUFBFTCwgT1IKK09USEVSV0lTRSBJTiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyAoUEFURU5ULCBDT1BZUklHSFQsCitUUkFERSBTRUNSRVQsIE1BU0sgV09SSywgT1IgT1RIRVIgUFJPUFJJRVRBUlkgUklHSFQpIEVNQk9ESUVEIElOCitBTlkgT1RIRVIgUUxPR0lDIEhBUkRXQVJFIE9SIFNPRlRXQVJFIEVJVEhFUiBTT0xFTFkgT1IgSU4KK0NPTUJJTkFUSU9OIFdJVEggVEhJUyBQUk9HUkFNLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CmluZGV4IDI5N2JhN2IuLjIwMzViYzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CkBAIC0zNSw4ICszNSw5IEBACiAgICAgNi4xIGdlbmVyYWwgc2V0dGluZ3MKICAgICA2LjIgbG9jYWwgbG9vcGJhY2sgb2Ygc2VudCBmcmFtZXMKICAgICA2LjMgQ0FOIGNvbnRyb2xsZXIgaGFyZHdhcmUgZmlsdGVycwotICAgIDYuNCBjdXJyZW50bHkgc3VwcG9ydGVkIENBTiBoYXJkd2FyZQotICAgIDYuNSB0b2RvCisgICAgNi40IFRoZSB2aXJ0dWFsIENBTiBkcml2ZXIgKHZjYW4pCisgICAgNi41IGN1cnJlbnRseSBzdXBwb3J0ZWQgQ0FOIGhhcmR3YXJlCisgICAgNi42IHRvZG8KIAogICA3IENyZWRpdHMKIApAQCAtNTg0LDcgKzU4NSw0MiBAQAogICBAMTMzTUh6IHdpdGggZm91ciBTSkExMDAwIENBTiBjb250cm9sbGVycyBmcm9tIDIwMDIgdW5kZXIgaGVhdnkgYnVzCiAgIGxvYWQgd2l0aG91dCBhbnkgcHJvYmxlbXMgLi4uCiAKLSAgNi40IGN1cnJlbnRseSBzdXBwb3J0ZWQgQ0FOIGhhcmR3YXJlIChTZXB0ZW1iZXIgMjAwNykKKyAgNi40IFRoZSB2aXJ0dWFsIENBTiBkcml2ZXIgKHZjYW4pCisKKyAgU2ltaWxhciB0byB0aGUgbmV0d29yayBsb29wYmFjayBkZXZpY2VzLCB2Y2FuIG9mZmVycyBhIHZpcnR1YWwgbG9jYWwKKyAgQ0FOIGludGVyZmFjZS4gQSBmdWxsIHF1YWxpZmllZCBhZGRyZXNzIG9uIENBTiBjb25zaXN0cyBvZgorCisgIC0gYSB1bmlxdWUgQ0FOIElkZW50aWZpZXIgKENBTiBJRCkKKyAgLSB0aGUgQ0FOIGJ1cyB0aGlzIENBTiBJRCBpcyB0cmFuc21pdHRlZCBvbiAoZS5nLiBjYW4wKQorCisgIHNvIGluIGNvbW1vbiB1c2UgY2FzZXMgbW9yZSB0aGFuIG9uZSB2aXJ0dWFsIENBTiBpbnRlcmZhY2UgaXMgbmVlZGVkLgorCisgIFRoZSB2aXJ0dWFsIENBTiBpbnRlcmZhY2VzIGFsbG93IHRoZSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBvZiBDQU4KKyAgZnJhbWVzIHdpdGhvdXQgcmVhbCBDQU4gY29udHJvbGxlciBoYXJkd2FyZS4gVmlydHVhbCBDQU4gbmV0d29yaworICBkZXZpY2VzIGFyZSB1c3VhbGx5IG5hbWVkICd2Y2FuWCcsIGxpa2UgdmNhbjAgdmNhbjEgdmNhbjIgLi4uCisgIFdoZW4gY29tcGlsZWQgYXMgYSBtb2R1bGUgdGhlIHZpcnR1YWwgQ0FOIGRyaXZlciBtb2R1bGUgaXMgY2FsbGVkIHZjYW4ua28KKworICBTaW5jZSBMaW51eCBLZXJuZWwgdmVyc2lvbiAyLjYuMjQgdGhlIHZjYW4gZHJpdmVyIHN1cHBvcnRzIHRoZSBLZXJuZWwKKyAgbmV0bGluayBpbnRlcmZhY2UgdG8gY3JlYXRlIHZjYW4gbmV0d29yayBkZXZpY2VzLiBUaGUgY3JlYXRpb24gYW5kCisgIHJlbW92YWwgb2YgdmNhbiBuZXR3b3JrIGRldmljZXMgY2FuIGJlIG1hbmFnZWQgd2l0aCB0aGUgaXAoOCkgdG9vbDoKKworICAtIENyZWF0ZSBhIHZpcnR1YWwgQ0FOIG5ldHdvcmsgaW50ZXJmYWNlOgorICAgICAgIGlwIGxpbmsgYWRkIHR5cGUgdmNhbgorCisgIC0gQ3JlYXRlIGEgdmlydHVhbCBDQU4gbmV0d29yayBpbnRlcmZhY2Ugd2l0aCBhIHNwZWNpZmljIG5hbWUgJ3ZjYW40Mic6CisgICAgICAgaXAgbGluayBhZGQgZGV2IHZjYW40MiB0eXBlIHZjYW4KKworICAtIFJlbW92ZSBhICh2aXJ0dWFsIENBTikgbmV0d29yayBpbnRlcmZhY2UgJ3ZjYW40Mic6CisgICAgICAgaXAgbGluayBkZWwgdmNhbjQyCisKKyAgVGhlIHRvb2wgJ3ZjYW4nIGZyb20gdGhlIFNvY2tldENBTiBTVk4gcmVwb3NpdG9yeSBvbiBCZXJsaU9TIGlzIG9ic29sZXRlLgorCisgIFZpcnR1YWwgQ0FOIG5ldHdvcmsgZGV2aWNlIGNyZWF0aW9uIGluIG9sZGVyIEtlcm5lbHM6CisgIEluIExpbnV4IEtlcm5lbCB2ZXJzaW9ucyA8IDIuNi4yNCB0aGUgdmNhbiBkcml2ZXIgY3JlYXRlcyA0IHZjYW4KKyAgbmV0ZGV2aWNlcyBhdCBtb2R1bGUgbG9hZCB0aW1lIGJ5IGRlZmF1bHQuIFRoaXMgdmFsdWUgY2FuIGJlIGNoYW5nZWQKKyAgd2l0aCB0aGUgbW9kdWxlIHBhcmFtZXRlciAnbnVtZGV2Jy4gRS5nLiAnbW9kcHJvYmUgdmNhbiBudW1kZXY9OCcKKworICA2LjUgY3VycmVudGx5IHN1cHBvcnRlZCBDQU4gaGFyZHdhcmUKIAogICBPbiB0aGUgcHJvamVjdCB3ZWJzaXRlIGh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9zb2NrZXRjYW4KICAgdGhlcmUgYXJlIGRpZmZlcmVudCBkcml2ZXJzIGF2YWlsYWJsZToKQEAgLTYwMyw3ICs2MzksNyBAQAogCiAgIFBsZWFzZSBjaGVjayB0aGUgTWFpbGluZyBMaXN0cyBvbiB0aGUgYmVybGlvcyBPU1MgcHJvamVjdCB3ZWJzaXRlLgogCi0gIDYuNSB0b2RvIChTZXB0ZW1iZXIgMjAwNykKKyAgNi42IHRvZG8KIAogICBUaGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIENBTiBuZXR3b3JrIGRyaXZlcnMgaXMgc3RpbGwgYW4gb3BlbgogICBpc3N1ZSB0aGF0IGhhcyBub3QgYmVlbiBmaW5hbGl6ZWQgaW4gdGhlIHNvY2tldGNhbiBwcm9qZWN0LiBBbHNvIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NzODl4MC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAppbmRleCA2Mzg3ZDNkLi5jNzI1ZDMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dApAQCAtMyw3ICszLDcgQEAKIC0tLS0KIAogVGhpcyBkb2N1bWVudCB3YXMgY29udHJpYnV0ZWQgYnkgQ2lycnVzIExvZ2ljIGZvciBrZXJuZWwgMi4yLjUuICBUaGlzIHZlcnNpb24KLWhhcyBiZWVuIHVwZGF0ZWQgZm9yIDIuMy40OCBieSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CitoYXMgYmVlbiB1cGRhdGVkIGZvciAyLjMuNDggYnkgQW5kcmV3IE1vcnRvbi4KIAogQ2lycnVzIG1ha2UgYSBjb3B5IG9mIHRoaXMgZHJpdmVyIGF2YWlsYWJsZSBhdCB0aGVpciB3ZWJzaXRlLCBhcwogZGVzY3JpYmVkIGJlbG93LiAgSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2UgdGhlIGRyaXZlciB2ZXJzaW9uIHdoaWNoCkBAIC02OTAsNyArNjkwLDcgQEAKIDYuNCBDdXJyZW50IG1haW50YWluZXIKIAogSW4gRmVicnVhcnkgMjAwMCB0aGUgbWFpbnRlbmFuY2Ugb2YgdGhpcyBkcml2ZXIgd2FzIGFzc3VtZWQgYnkgQW5kcmV3Ci1Nb3J0b24gPGFrcG1AemlwLmNvbS5hdT4KK01vcnRvbi4KIAogNi41IEtlcm5lbCBtb2R1bGUgcGFyYW1ldGVycwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbXVsdGlxdWV1ZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbXVsdGlxdWV1ZS50eHQKaW5kZXggZDM5MWVhNi4uNGNhYTBlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL211bHRpcXVldWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9tdWx0aXF1ZXVlLnR4dApAQCAtMjQsNCArMjQsNTYgQEAKIGRldmljZSBpcyBzdGlsbCBvcGVyYXRpb25hbC4gIG5ldGRldi0+cXVldWVfbG9jayBpcyBzdGlsbCB1c2VkIHdoZW4gdGhlIGRldmljZQogY29tZXMgb25saW5lIG9yIHdoZW4gaXQncyBjb21wbGV0ZWx5IHNodXQgZG93biAodW5yZWdpc3Rlcl9uZXRkZXYoKSwgZXRjLikuCiAKLUF1dGhvcjogUGV0ZXIgUC4gV2Fza2lld2ljeiBKci4gPHBldGVyLnAud2Fza2lld2ljei5qckBpbnRlbC5jb20+CisKK1NlY3Rpb24gMjogUWRpc2Mgc3VwcG9ydCBmb3IgbXVsdGlxdWV1ZSBkZXZpY2VzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0N1cnJlbnRseSB0d28gcWRpc2NzIGFyZSBvcHRpbWl6ZWQgZm9yIG11bHRpcXVldWUgZGV2aWNlcy4gIFRoZSBmaXJzdCBpcyB0aGUKK2RlZmF1bHQgcGZpZm9fZmFzdCBxZGlzYy4gIFRoaXMgcWRpc2Mgc3VwcG9ydHMgb25lIHFkaXNjIHBlciBoYXJkd2FyZSBxdWV1ZS4KK0EgbmV3IHJvdW5kLXJvYmluIHFkaXNjLCBzY2hfbXVsdGlxIGFsc28gc3VwcG9ydHMgbXVsdGlwbGUgaGFyZHdhcmUgcXVldWVzLiBUaGUKK3FkaXNjIGlzIHJlc3BvbnNpYmxlIGZvciBjbGFzc2lmeWluZyB0aGUgc2tiJ3MgYW5kIHRoZW4gZGlyZWN0aW5nIHRoZSBza2IncyB0bworYmFuZHMgYW5kIHF1ZXVlcyBiYXNlZCBvbiB0aGUgdmFsdWUgaW4gc2tiLT5xdWV1ZV9tYXBwaW5nLiAgVXNlIHRoaXMgZmllbGQgaW4KK3RoZSBiYXNlIGRyaXZlciB0byBkZXRlcm1pbmUgd2hpY2ggcXVldWUgdG8gc2VuZCB0aGUgc2tiIHRvLgorCitzY2hfbXVsdGlxIGhhcyBiZWVuIGFkZGVkIGZvciBoYXJkd2FyZSB0aGF0IHdpc2hlcyB0byBhdm9pZCBoZWFkLW9mLWxpbmUKK2Jsb2NraW5nLiAgSXQgd2lsbCBjeWNsZSB0aG91Z2ggdGhlIGJhbmRzIGFuZCB2ZXJpZnkgdGhhdCB0aGUgaGFyZHdhcmUgcXVldWUKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgYmFuZCBpcyBub3Qgc3RvcHBlZCBwcmlvciB0byBkZXF1ZXVpbmcgYSBwYWNrZXQuCisKK09uIHFkaXNjIGxvYWQsIHRoZSBudW1iZXIgb2YgYmFuZHMgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBxdWV1ZXMgb24gdGhlCitoYXJkd2FyZS4gIE9uY2UgdGhlIGFzc29jaWF0aW9uIGlzIG1hZGUsIGFueSBza2Igd2l0aCBza2ItPnF1ZXVlX21hcHBpbmcgc2V0LAord2lsbCBiZSBxdWV1ZWQgdG8gdGhlIGJhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZSBxdWV1ZS4KKworCitTZWN0aW9uIDM6IEJyaWVmIGhvd3RvIHVzaW5nIE1VTFRJUSBmb3IgbXVsdGlxdWV1ZSBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHVzZXJzcGFjZSBjb21tYW5kICd0YywnIHBhcnQgb2YgdGhlIGlwcm91dGUyIHBhY2thZ2UsIGlzIHVzZWQgdG8gY29uZmlndXJlCitxZGlzY3MuICBUbyBhZGQgdGhlIE1VTFRJUSBxZGlzYyB0byB5b3VyIG5ldHdvcmsgZGV2aWNlLCBhc3N1bWluZyB0aGUgZGV2aWNlCitpcyBjYWxsZWQgZXRoMCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworIyB0YyBxZGlzYyBhZGQgZGV2IGV0aDAgcm9vdCBoYW5kbGUgMTogbXVsdGlxCisKK1RoZSBxZGlzYyB3aWxsIGFsbG9jYXRlIHRoZSBudW1iZXIgb2YgYmFuZHMgdG8gZXF1YWwgdGhlIG51bWJlciBvZiBxdWV1ZXMgdGhhdAordGhlIGRldmljZSByZXBvcnRzLCBhbmQgYnJpbmcgdGhlIHFkaXNjIG9ubGluZS4gIEFzc3VtaW5nIGV0aDAgaGFzIDQgVHgKK3F1ZXVlcywgdGhlIGJhbmQgbWFwcGluZyB3b3VsZCBsb29rIGxpa2U6CisKK2JhbmQgMCA9PiBxdWV1ZSAwCitiYW5kIDEgPT4gcXVldWUgMQorYmFuZCAyID0+IHF1ZXVlIDIKK2JhbmQgMyA9PiBxdWV1ZSAzCisKK1RyYWZmaWMgd2lsbCBiZWdpbiBmbG93aW5nIHRocm91Z2ggZWFjaCBxdWV1ZSBiYXNlZCBvbiBlaXRoZXIgdGhlIHNpbXBsZV90eF9oYXNoCitmdW5jdGlvbiBvciBiYXNlZCBvbiBuZXRkZXYtPnNlbGVjdF9xdWV1ZSgpIGlmIHlvdSBoYXZlIGl0IGRlZmluZWQuCisKK1RoZSBiZWhhdmlvciBvZiB0YyBmaWx0ZXJzIHJlbWFpbnMgdGhlIHNhbWUuICBIb3dldmVyIGEgbmV3IHRjIGFjdGlvbiwKK3NrYmVkaXQsIGhhcyBiZWVuIGFkZGVkLiAgQXNzdW1pbmcgeW91IHdhbnRlZCB0byByb3V0ZSBhbGwgdHJhZmZpYyB0byBhCitzcGVjaWZpYyBob3N0LCBmb3IgZXhhbXBsZSAxOTIuMTY4LjAuMywgdGhyb3VnaCBhIHNwZWNpZmljIHF1ZXVlIHlvdSBjb3VsZCB1c2UKK3RoaXMgYWN0aW9uIGFuZCBlc3RhYmxpc2ggYSBmaWx0ZXIgc3VjaCBhczoKKwordGMgZmlsdGVyIGFkZCBkZXYgZXRoMCBwYXJlbnQgMTogcHJvdG9jb2wgaXAgcHJpbyAxIHUzMiBcCisJbWF0Y2ggaXAgZHN0IDE5Mi4xNjguMC4zIFwKKwlhY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIDMKKworQXV0aG9yOiBBbGV4YW5kZXIgRHV5Y2sgPGFsZXhhbmRlci5oLmR1eWNrQGludGVsLmNvbT4KK09yaWdpbmFsIEF1dGhvcjogUGV0ZXIgUC4gV2Fza2lld2ljeiBKci4gPHBldGVyLnAud2Fza2lld2ljei5qckBpbnRlbC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGhvbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9waG9uZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDdlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGhvbmV0LnR4dApAQCAtMCwwICsxLDE3NSBAQAorTGludXggUGhvbmV0IHByb3RvY29sIGZhbWlseQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitQaG9uZXQgaXMgYSBwYWNrZXQgcHJvdG9jb2wgdXNlZCBieSBOb2tpYSBjZWxsdWxhciBtb2RlbXMgZm9yIGJvdGggSVBDCithbmQgUlBDLiBXaXRoIHRoZSBMaW51eCBQaG9uZXQgc29ja2V0IGZhbWlseSwgTGludXggaG9zdCBwcm9jZXNzZXMgY2FuCityZWNlaXZlIGFuZCBzZW5kIG1lc3NhZ2VzIGZyb20vdG8gdGhlIG1vZGVtLCBvciBhbnkgb3RoZXIgZXh0ZXJuYWwKK2RldmljZSBhdHRhY2hlZCB0byB0aGUgbW9kZW0uIFRoZSBtb2RlbSB0YWtlcyBjYXJlIG9mIHJvdXRpbmcuCisKK1Bob25ldCBwYWNrZXRzIGNhbiBiZSBleGNoYW5nZWQgdGhyb3VnaCB2YXJpb3VzIGhhcmR3YXJlIGNvbm5lY3Rpb25zCitkZXBlbmRpbmcgb24gdGhlIGRldmljZSwgc3VjaCBhczoKKyAgLSBVU0Igd2l0aCB0aGUgQ0RDIFBob25ldCBpbnRlcmZhY2UsCisgIC0gaW5mcmFyZWQsCisgIC0gQmx1ZXRvb3RoLAorICAtIGFuIFJTMjMyIHNlcmlhbCBwb3J0ICh3aXRoIGEgZGVkaWNhdGVkICJGQlVTIiBsaW5lIGRpc2NpcGxpbmUpLAorICAtIHRoZSBTU0kgYnVzIHdpdGggc29tZSBUSSBPTUFQIHByb2Nlc3NvcnMuCisKKworUGFja2V0cyBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tCisKK1Bob25ldCBwYWNrZXRzIGhhdmUgYSBjb21tb24gaGVhZGVyIGFzIGZvbGxvd3M6CisKKyAgc3RydWN0IHBob25ldGhkciB7CisgICAgdWludDhfdCAgcG5fbWVkaWE7ICAvKiBNZWRpYSB0eXBlIChsaW5rLWxheWVyIGlkZW50aWZpZXIpICovCisgICAgdWludDhfdCAgcG5fcmRldjsgICAvKiBSZWNlaXZlciBkZXZpY2UgSUQgKi8KKyAgICB1aW50OF90ICBwbl9zZGV2OyAgIC8qIFNlbmRlciBkZXZpY2UgSUQgKi8KKyAgICB1aW50OF90ICBwbl9yZXM7ICAgIC8qIFJlc291cmNlIElEIG9yIGZ1bmN0aW9uICovCisgICAgdWludDE2X3QgcG5fbGVuZ3RoOyAvKiBCaWctZW5kaWFuIG1lc3NhZ2UgYnl0ZSBsZW5ndGggKG1pbnVzIDYpICovCisgICAgdWludDhfdCAgcG5fcm9iajsgICAvKiBSZWNlaXZlciBvYmplY3QgSUQgKi8KKyAgICB1aW50OF90ICBwbl9zb2JqOyAgIC8qIFNlbmRlciBvYmplY3QgSUQgKi8KKyAgfTsKKworT24gTGludXgsIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpbmNsdWRlcyB0aGUgcG5fbWVkaWEgYnl0ZSAoc2VlIGJlbG93KS4KK1RoZSBuZXh0IDcgYnl0ZXMgYXJlIHBhcnQgb2YgdGhlIG5ldHdvcmstbGF5ZXIgaGVhZGVyLgorCitUaGUgZGV2aWNlIElEIGlzIHNwbGl0OiB0aGUgNiBoaWdoZXItb3JkZXIgYml0cyBjb25zaXR1dGUgdGhlIGRldmljZQorYWRkcmVzcywgd2hpbGUgdGhlIDIgbG93ZXItb3JkZXIgYml0cyBhcmUgdXNlZCBmb3IgbXVsdGlwbGV4aW5nLCBhcyBhcmUKK3RoZSA4LWJpdCBvYmplY3QgaWRlbnRpZmllcnMuIEFzIHN1Y2gsIFBob25ldCBjYW4gYmUgY29uc2lkZXJlZCBhcyBhCituZXR3b3JrIGxheWVyIHdpdGggNiBiaXRzIG9mIGFkZHJlc3Mgc3BhY2UgYW5kIDEwIGJpdHMgZm9yIHRyYW5zcG9ydAorcHJvdG9jb2wgKG11Y2ggbGlrZSBwb3J0IG51bWJlcnMgaW4gSVAgd29ybGQpLgorCitUaGUgbW9kZW0gYWx3YXlzIGhhcyBhZGRyZXNzIG51bWJlciB6ZXJvLiBBbGwgb3RoZXIgZGV2aWNlIGhhdmUgYSB0aGVpcgorb3duIDYtYml0IGFkZHJlc3MuCisKKworTGluayBsYXllcgorLS0tLS0tLS0tLQorCitQaG9uZXQgbGlua3MgYXJlIGFsd2F5cyBwb2ludC10by1wb2ludCBsaW5rcy4gVGhlIGxpbmsgbGF5ZXIgaGVhZGVyCitjb25zaXN0cyBvZiBhIHNpbmdsZSBQaG9uZXQgbWVkaWEgdHlwZSBieXRlLiBJdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZQorbGluayB0aHJvdWdoIHdoaWNoIHRoZSBwYWNrZXQgaXMgdHJhbnNtaXR0ZWQsIGZyb20gdGhlIG1vZGVtJ3MKK3BlcnNwZWN0aXZlLiBFYWNoIFBob25ldCBuZXR3b3JrIGRldmljZSBzaGFsbCBwcmVwZW5kIGFuZCBzZXQgdGhlIG1lZGlhCit0eXBlIGJ5dGUgYXMgYXBwcm9wcmlhdGUuIEZvciBjb252ZW5pZW5jZSwgYSBjb21tb24gcGhvbmV0X2hlYWRlcl9vcHMKK2xpbmstbGF5ZXIgaGVhZGVyIG9wZXJhdGlvbnMgc3RydWN0dXJlIGlzIHByb3ZpZGVkLiBJdCBzZXRzIHRoZQorbWVkaWEgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIG5ldHdvcmsgZGV2aWNlIGhhcmR3YXJlIGFkZHJlc3MuCisKK0xpbnV4IFBob25ldCBuZXR3b3JrIGludGVyZmFjZXMgc3VwcG9ydCBhIGRlZGljYXRlZCBsaW5rIGxheWVyIHBhY2tldHMKK3R5cGUgKEVUSF9QX1BIT05FVCkgd2hpY2ggaXMgb3V0IG9mIHRoZSBFdGhlcm5ldCB0eXBlIHJhbmdlLiBUaGV5IGNhbgorb25seSBzZW5kIGFuZCByZWNlaXZlIFBob25ldCBwYWNrZXRzLgorCitUaGUgdmlydHVhbCBUVU4gdHVubmVsIGRldmljZSBkcml2ZXIgY2FuIGFsc28gYmUgdXNlZCBmb3IgUGhvbmV0LiBUaGlzCityZXF1aXJlcyBJRkZfVFVOIG1vZGUsIF93aXRob3V0XyB0aGUgSUZGX05PX1BJIGZsYWcuIEluIHRoaXMgY2FzZSwKK3RoZXJlIGlzIG5vIGxpbmstbGF5ZXIgaGVhZGVyLCBzbyB0aGVyZSBpcyBubyBQaG9uZXQgbWVkaWEgdHlwZSBieXRlLgorCitOb3RlIHRoYXQgUGhvbmV0IGludGVyZmFjZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHJlLW9yZGVyIHBhY2tldHMsIHNvCitvbmx5IHRoZSAoZGVmYXVsdCkgTGludXggRklGTyBxZGlzYyBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZW0uCisKKworTmV0d29yayBsYXllcgorLS0tLS0tLS0tLS0tLQorCitUaGUgUGhvbmV0IHNvY2tldCBhZGRyZXNzIGZhbWlseSBtYXBzIHRoZSBQaG9uZXQgcGFja2V0IGhlYWRlcjoKKworICBzdHJ1Y3Qgc29ja2FkZHJfcG4geworICAgIHNhX2ZhbWlseV90IHNwbl9mYW1pbHk7ICAgIC8qIEFGX1BIT05FVCAqLworICAgIHVpbnQ4X3QgICAgIHNwbl9vYmo7ICAgICAgIC8qIE9iamVjdCBJRCAqLworICAgIHVpbnQ4X3QgICAgIHNwbl9kZXY7ICAgICAgIC8qIERldmljZSBJRCAqLworICAgIHVpbnQ4X3QgICAgIHNwbl9yZXNvdXJjZTsgIC8qIFJlc291cmNlIG9yIGZ1bmN0aW9uICovCisgICAgdWludDhfdCAgICAgc3BuX3plcm9bLi4uXTsgLyogUGFkZGluZyAqLworICB9OworCitUaGUgcmVzb3VyY2UgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gc2VuZGluZyBhbmQgcmVjZWl2aW5nOworSXQgaXMgaWdub3JlZCBieSBiaW5kKCkgYW5kIGdldHNvY2tuYW1lKCkuCisKKworTG93LWxldmVsIGRhdGFncmFtIHByb3RvY29sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXBwbGljYXRpb25zIGNhbiBzZW5kIFBob25ldCBtZXNzYWdlcyB1c2luZyB0aGUgUGhvbmV0IGRhdGFncmFtIHNvY2tldAorcHJvdG9jb2wgZnJvbSB0aGUgUEZfUEhPTkVUIGZhbWlseS4gRWFjaCBzb2NrZXQgaXMgYm91bmQgdG8gb25lIG9mIHRoZQorMl4xMCBvYmplY3QgSURzIGF2YWlsYWJsZSwgYW5kIGNhbiBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMgd2l0aCBhbnkKK290aGVyIHBlZXIuCisKKyAgc3RydWN0IHNvY2thZGRyX3BuIGFkZHIgPSB7IC5zcG5fZmFtaWx5ID0gQUZfUEhPTkVULCB9OworICBzc2l6ZV90IGxlbjsKKyAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgIGludCBmZDsKKworICBmZCA9IHNvY2tldChQRl9QSE9ORVQsIFNPQ0tfREdSQU0sIDApOworICBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisgIC8qIC4uLiAqLworCisgIHNlbmR0byhmZCwgbXNnLCBtc2dsZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgbGVuID0gcmVjdmZyb20oZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsCisgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOworCitUaGlzIHByb3RvY29sIGZvbGxvd3MgdGhlIFNPQ0tfREdSQU0gY29ubmVjdGlvbi1sZXNzIHNlbWFudGljcy4KK0hvd2V2ZXIsIGNvbm5lY3QoKSBhbmQgZ2V0cGVlcm5hbWUoKSBhcmUgbm90IHN1cHBvcnRlZCwgYXMgdGhleSBkaWQKK25vdCBzZWVtIHVzZWZ1bCB3aXRoIFBob25ldCB1c2FnZXMgKGNvdWxkIGJlIGFkZGVkIGVhc2lseSkuCisKKworUGhvbmV0IFBpcGUgcHJvdG9jb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBQaG9uZXQgUGlwZSBwcm90b2NvbCBpcyBhIHNpbXBsZSBzZXF1ZW5jZWQgcGFja2V0cyBwcm90b2NvbAord2l0aCBlbmQtdG8tZW5kIGNvbmdlc3Rpb24gY29udHJvbC4gSXQgdXNlcyB0aGUgcGFzc2l2ZSBsaXN0ZW5pbmcKK3NvY2tldCBwYXJhZGlnbS4gVGhlIGxpc3RlbmluZyBzb2NrZXQgaXMgYm91bmQgdG8gYW4gdW5pcXVlIGZyZWUgb2JqZWN0CitJRC4gRWFjaCBsaXN0ZW5pbmcgc29ja2V0IGNhbiBoYW5kbGUgdXAgdG8gMjU1IHNpbXVsdGFuZW91cworY29ubmVjdGlvbnMsIG9uZSBwZXIgYWNjZXB0KCknZCBzb2NrZXQuCisKKyAgaW50IGxmZCwgY2ZkOworCisgIGxmZCA9IHNvY2tldChQRl9QSE9ORVQsIFNPQ0tfU0VRUEFDS0VULCBQTl9QUk9UT19QSVBFKTsKKyAgbGlzdGVuIChsZmQsIElOVF9NQVgpOworCisgIC8qIC4uLiAqLworICBjZmQgPSBhY2NlcHQobGZkLCBOVUxMLCBOVUxMKTsKKyAgZm9yICg7OykKKyAgeworICAgIGNoYXIgYnVmWy4uLl07CisgICAgc3NpemVfdCBsZW4gPSByZWFkKGNmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICAvKiAuLi4gKi8KKworICAgIHdyaXRlKGNmZCwgbXNnLCBtc2dsZW4pOworICB9CisKK0Nvbm5lY3Rpb25zIGFyZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIHR3byBlbmRwb2ludHMgYnkgYSAidGhpcmQgcGFydHkiCithcHBsaWNhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGJvdGggZW5kcG9pbnRzIGFyZSBwYXNzaXZlOyBzbyBjb25uZWN0KCkKK2lzIG5vdCBwb3NzaWJsZS4KKworV0FSTklORzoKK1doZW4gcG9sbGluZyBhIGNvbm5lY3RlZCBwaXBlIHNvY2tldCBmb3Igd3JpdGFiaWxpdHksIHRoZXJlIGlzIGFuCitpbnRyaW5zaWMgcmFjZSBjb25kaXRpb24gd2hlcmVieSB3cml0YWJpbGl0eSBtaWdodCBiZSBsb3N0IGJldHdlZW4gdGhlCitwb2xsaW5nIGFuZCB0aGUgd3JpdGluZyBzeXN0ZW0gY2FsbHMuIEluIHRoaXMgY2FzZSwgdGhlIHNvY2tldCB3aWxsCitibG9jayB1bnRpbCB3cml0ZSBiZWNvbWVzIHBvc3NpYmxlIGFnYWluLCB1bmxlc3Mgbm9uLWJsb2NraW5nIG1vZGUKK2lzIGVuYWJsZWQuCisKKworVGhlIHBpcGUgcHJvdG9jb2wgcHJvdmlkZXMgdHdvIHNvY2tldCBvcHRpb25zIGF0IHRoZSBTT0xfUE5QSVBFIGxldmVsOgorCisgIFBOUElQRV9FTkNBUCBhY2NlcHRzIG9uZSBpbnRlZ2VyIHZhbHVlIChpbnQpIG9mOgorCisgICAgUE5QSVBFX0VOQ0FQX05PTkU6IFRoZSBzb2NrZXQgb3BlcmF0ZXMgbm9ybWFsbHkgKGRlZmF1bHQpLgorCisgICAgUE5QSVBFX0VOQ0FQX0lQOiBUaGUgc29ja2V0IGlzIHVzZWQgYXMgYSBiYWNrZW5kIGZvciBhIHZpcnR1YWwgSVAKKyAgICAgIGludGVyZmFjZS4gVGhpcyByZXF1aXJlcyBDQVBfTkVUX0FETUlOIGNhcGFiaWxpdHkuIEdQUlMgZGF0YQorICAgICAgc3VwcG9ydCBvbiBOb2tpYSBtb2RlbXMgY2FuIHVzZSB0aGlzLiBOb3RlIHRoYXQgdGhlIHNvY2tldCBjYW5ub3QKKyAgICAgIGJlIHJlbGlhYmx5IHBvbGwoKSdkIG9yIHJlYWQoKSBmcm9tIHdoaWxlIGluIHRoaXMgbW9kZS4KKworICBQTlBJUEVfSUZJTkRFWCBpcyBhIHJlYWQtb25seSBpbnRlZ2VyIHZhbHVlLiBJdCBjb250YWlucyB0aGUKKyAgICBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGNyZWF0ZWQgYnkgUE5QSVBFX0VOQ0FQLAorICAgIG9yIHplcm8gaWYgZW5jYXBzdWxhdGlvbiBpcyBvZmYuCisKKworQXV0aG9ycworLS0tLS0tLQorCitMaW51eCBQaG9uZXQgd2FzIGluaXRpYWxseSB3cml0dGVuIGJ5IFNha2FyaSBBaWx1cy4KK090aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIE1pa8OkIExpbGplYmVyZywgQW5kcmFzIERvbW9rb3MsCitDYXJsb3MgQ2hpbmVhIGFuZCBSw6ltaSBEZW5pcy1Db3VybW9udC4KK0NvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yZWd1bGF0b3J5LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yZWd1bGF0b3J5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY5ODlhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3JlZ3VsYXRvcnkudHh0CkBAIC0wLDAgKzEsMTk0IEBACitMaW51eCB3aXJlbGVzcyByZWd1bGF0b3J5IGRvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50IGdpdmVzIGEgYnJpZWYgcmV2aWV3IG92ZXIgaG93IHRoZSBMaW51eCB3aXJlbGVzcworcmVndWxhdG9yeSBpbmZyYXN0cnVjdHVyZSB3b3Jrcy4KKworTW9yZSB1cCB0byBkYXRlIGluZm9ybWF0aW9uIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgcHJvamVjdCdzIHdlYiBwYWdlOgorCitodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL1JlZ3VsYXRvcnkKKworS2VlcGluZyByZWd1bGF0b3J5IGRvbWFpbnMgaW4gdXNlcnNwYWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRHVlIHRvIHRoZSBkeW5hbWljIG5hdHVyZSBvZiByZWd1bGF0b3J5IGRvbWFpbnMgd2Uga2VlcCB0aGVtCitpbiB1c2Vyc3BhY2UgYW5kIHByb3ZpZGUgYSBmcmFtZXdvcmsgZm9yIHVzZXJzcGFjZSB0byB1cGxvYWQKK3RvIHRoZSBrZXJuZWwgb25lIHJlZ3VsYXRvcnkgZG9tYWluIHRvIGJlIHVzZWQgYXMgdGhlIGNlbnRyYWwKK2NvcmUgcmVndWxhdG9yeSBkb21haW4gYWxsIHdpcmVsZXNzIGRldmljZXMgc2hvdWxkIGFkaGVyZSB0by4KKworSG93IHRvIGdldCByZWd1bGF0b3J5IGRvbWFpbnMgdG8gdGhlIGtlcm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2Vyc3BhY2UgZ2V0cyBhIHJlZ3VsYXRvcnkgZG9tYWluIGluIHRoZSBrZXJuZWwgYnkgaGF2aW5nCithIHVzZXJzcGFjZSBhZ2VudCBidWlsZCBpdCBhbmQgc2VuZCBpdCB2aWEgbmw4MDIxMS4gT25seQorZXhwZWN0ZWQgcmVndWxhdG9yeSBkb21haW5zIHdpbGwgYmUgcmVzcGVjdGVkIGJ5IHRoZSBrZXJuZWwuCisKK0EgY3VycmVudGx5IGF2YWlsYWJsZSB1c2Vyc3BhY2UgYWdlbnQgd2hpY2ggY2FuIGFjY29tcGxpc2ggdGhpcworaXMgQ1JEQSAtIGNlbnRyYWwgcmVndWxhdG9yeSBkb21haW4gYWdlbnQuIEl0cyBkb2N1bWVudGVkIGhlcmU6CisKK2h0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvUmVndWxhdG9yeS9DUkRBCisKK0Vzc2VudGlhbGx5IHRoZSBrZXJuZWwgd2lsbCBzZW5kIGEgdWRldiBldmVudCB3aGVuIGl0IGtub3dzCitpdCBuZWVkcyBhIG5ldyByZWd1bGF0b3J5IGRvbWFpbi4gQSB1ZGV2IHJ1bGUgY2FuIGJlIHB1dCBpbiBwbGFjZQordG8gdHJpZ2dlciBjcmRhIHRvIHNlbmQgdGhlIHJlc3BlY3RpdmUgcmVndWxhdG9yeSBkb21haW4gZm9yIGEKK3NwZWNpZmljIElTTy9JRUMgMzE2NiBhbHBoYTIuCisKK0JlbG93IGlzIGFuIGV4YW1wbGUgdWRldiBydWxlIHdoaWNoIGNhbiBiZSB1c2VkOgorCisjIEV4YW1wbGUgZmlsZSwgc2hvdWxkIGJlIHB1dCBpbiAvZXRjL3VkZXYvcnVsZXMuZC9yZWd1bGF0b3J5LnJ1bGVzCitLRVJORUw9PSJyZWd1bGF0b3J5KiIsIEFDVElPTj09ImNoYW5nZSIsIFNVQlNZU1RFTT09InBsYXRmb3JtIiwgUlVOKz0iL3NiaW4vY3JkYSIKKworVGhlIGFscGhhMiBpcyBwYXNzZWQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdW5kZXIgdGhlIHZhcmlhYmxlIENPVU5UUlkuCisKK1dobyBhc2tzIGZvciByZWd1bGF0b3J5IGRvbWFpbnM/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFVzZXJzCisKK1VzZXJzIGNhbiB1c2UgaXc6CisKK2h0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL3VzZXJzL0RvY3VtZW50YXRpb24vaXcKKworQW4gZXhhbXBsZToKKworICAjIHNldCByZWd1bGF0b3J5IGRvbWFpbiB0byAiQ29zdGEgUmljYSIKKyAgaXcgcmVnIHNldCBDUgorCitUaGlzIHdpbGwgcmVxdWVzdCB0aGUga2VybmVsIHRvIHNldCB0aGUgcmVndWxhdG9yeSBkb21haW4gdG8KK3RoZSBzcGVjaWZpY2llZCBhbHBoYTIuIFRoZSBrZXJuZWwgaW4gdHVybiB3aWxsIHRoZW4gYXNrIHVzZXJzcGFjZQordG8gcHJvdmlkZSBhIHJlZ3VsYXRvcnkgZG9tYWluIGZvciB0aGUgYWxwaGEyIHNwZWNpZmllZCBieSB0aGUgdXNlcgorYnkgc2VuZGluZyBhIHVldmVudC4KKworKiBXaXJlbGVzcyBzdWJzeXN0ZW1zIGZvciBDb3VudHJ5IEluZm9ybWF0aW9uIGVsZW1lbnRzCisKK1RoZSBrZXJuZWwgd2lsbCBzZW5kIGEgdWV2ZW50IHRvIGluZm9ybSB1c2Vyc3BhY2UgYSBuZXcKK3JlZ3VsYXRvcnkgZG9tYWluIGlzIHJlcXVpcmVkLiBNb3JlIG9uIHRoaXMgdG8gYmUgYWRkZWQKK2FzIGl0cyBpbnRlZ3JhdGlvbiBpcyBhZGRlZC4KKworKiBEcml2ZXJzCisKK0lmIGRyaXZlcnMgZGV0ZXJtaW5lIHRoZXkgbmVlZCBhIHNwZWNpZmljIHJlZ3VsYXRvcnkgZG9tYWluCitzZXQgdGhleSBjYW4gaW5mb3JtIHRoZSB3aXJlbGVzcyBjb3JlIHVzaW5nIHJlZ3VsYXRvcnlfaGludCgpLgorVGhleSBoYXZlIHR3byBvcHRpb25zIC0tIHRoZXkgZWl0aGVyIHByb3ZpZGUgYW4gYWxwaGEyIHNvIHRoYXQKK2NyZGEgY2FuIHByb3ZpZGUgYmFjayBhIHJlZ3VsYXRvcnkgZG9tYWluIGZvciB0aGF0IGNvdW50cnkgb3IKK3RoZXkgY2FuIGJ1aWxkIHRoZWlyIG93biByZWd1bGF0b3J5IGRvbWFpbiBiYXNlZCBvbiBpbnRlcm5hbAorY3VzdG9tIGtub3dsZWRnZSBzbyB0aGUgd2lyZWxlc3MgY29yZSBjYW4gcmVzcGVjdCBpdC4KKworKk1vc3QqIGRyaXZlcnMgd2lsbCByZWx5IG9uIHRoZSBmaXJzdCBtZWNoYW5pc20gb2YgcHJvdmlkaW5nIGEKK3JlZ3VsYXRvcnkgaGludCB3aXRoIGFuIGFscGhhMi4gRm9yIHRoZXNlIGRyaXZlcnMgdGhlcmUgaXMgYW4gYWRkaXRpb25hbAorY2hlY2sgdGhhdCBjYW4gYmUgdXNlZCB0byBlbnN1cmUgY29tcGxpYW5jZSBiYXNlZCBvbiBjdXN0b20gRUVQUk9NCityZWd1bGF0b3J5IGRhdGEuIFRoaXMgYWRkaXRpb25hbCBjaGVjayBjYW4gYmUgdXNlZCBieSBkcml2ZXJzIGJ5CityZWdpc3RlcmluZyBvbiBpdHMgc3RydWN0IHdpcGh5IGEgcmVnX25vdGlmaWVyKCkgY2FsbGJhY2suIFRoaXMgbm90aWZpZXIKK2lzIGNhbGxlZCB3aGVuIHRoZSBjb3JlJ3MgcmVndWxhdG9yeSBkb21haW4gaGFzIGJlZW4gY2hhbmdlZC4gVGhlIGRyaXZlcgorY2FuIHVzZSB0aGlzIHRvIHJldmlldyB0aGUgY2hhbmdlcyBtYWRlIGFuZCBhbHNvIHJldmlldyB3aG8gbWFkZSB0aGVtCisoZHJpdmVyLCB1c2VyLCBjb3VudHJ5IElFKSBhbmQgZGV0ZXJtaW5lIHdoYXQgdG8gYWxsb3cgYmFzZWQgb24gaXRzCitpbnRlcm5hbCBFRVBST00gZGF0YS4gRGV2aWNlcyBkcml2ZXJzIHdpc2hpbmcgdG8gYmUgY2FwYWJsZSBvZiB3b3JsZAorcm9hbWluZyBzaG91bGQgdXNlIHRoaXMgY2FsbGJhY2suIE1vcmUgb24gd29ybGQgcm9hbWluZyB3aWxsIGJlCithZGRlZCB0byB0aGlzIGRvY3VtZW50IHdoZW4gaXRzIHN1cHBvcnQgaXMgZW5hYmxlZC4KKworRGV2aWNlIGRyaXZlcnMgd2hvIHByb3ZpZGUgdGhlaXIgb3duIGJ1aWx0IHJlZ3VsYXRvcnkgZG9tYWluCitkbyBub3QgbmVlZCBhIGNhbGxiYWNrIGFzIHRoZSBjaGFubmVscyByZWdpc3RlcmVkIGJ5IHRoZW0gYXJlCit0aGUgb25seSBvbmVzIHRoYXQgd2lsbCBiZSBhbGxvd2VkIGFuZCB0aGVyZWZvcmUgKmFkZGl0aW9uYWwqCitjYW5uZWxzIGNhbm5vdCBiZSBlbmFibGVkLgorCitFeGFtcGxlIGNvZGUgLSBkcml2ZXJzIGhpbnRpbmcgYW4gYWxwaGEyOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZXhhbXBsZSBjb21lcyBmcm9tIHRoZSB6ZDEyMTFydyBkZXZpY2UgZHJpdmVyLiBZb3UgY2FuIHN0YXJ0CitieSBoYXZpbmcgYSBtYXBwaW5nIG9mIHlvdXIgZGV2aWNlJ3MgRUVQUk9NIGNvdW50cnkvcmVndWxhdG9yeQorZG9tYWluIHZhbHVlIHRvIHRvIGEgc3BlY2lmaWMgYWxwaGEyIGFzIGZvbGxvd3M6CisKK3N0YXRpYyBzdHJ1Y3QgemRfcmVnX2FscGhhMl9tYXAgcmVnX2FscGhhMl9tYXBbXSA9IHsKKwl7IFpEX1JFR0RPTUFJTl9GQ0MsICJVUyIgfSwKKwl7IFpEX1JFR0RPTUFJTl9JQywgIkNBIiB9LAorCXsgWkRfUkVHRE9NQUlOX0VUU0ksICJERSIgfSwgLyogR2VuZXJpYyBFVFNJLCB1c2UgbW9zdCByZXN0cmljdGl2ZSAqLworCXsgWkRfUkVHRE9NQUlOX0pBUEFOLCAiSlAiIH0sCisJeyBaRF9SRUdET01BSU5fSkFQQU5fQURELCAiSlAiIH0sCisJeyBaRF9SRUdET01BSU5fU1BBSU4sICJFUyIgfSwKKwl7IFpEX1JFR0RPTUFJTl9GUkFOQ0UsICJGUiIgfSwKKworVGhlbiB5b3UgY2FuIGRlZmluZSBhIHJvdXRpbmUgdG8gbWFwIHlvdXIgcmVhZCBFRVBST00gdmFsdWUgdG8gYW4gYWxwaGEyLAorYXMgZm9sbG93czoKKworc3RhdGljIGludCB6ZF9yZWcyYWxwaGEyKHU4IHJlZ2RvbWFpbiwgY2hhciAqYWxwaGEyKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB6ZF9yZWdfYWxwaGEyX21hcCAqcmVnX21hcDsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVnX2FscGhhMl9tYXApOyBpKyspIHsKKwkJCXJlZ19tYXAgPSAmcmVnX2FscGhhMl9tYXBbaV07CisJCQlpZiAocmVnZG9tYWluID09IHJlZ19tYXAtPnJlZykgeworCQkJYWxwaGEyWzBdID0gcmVnX21hcC0+YWxwaGEyWzBdOworCQkJYWxwaGEyWzFdID0gcmVnX21hcC0+YWxwaGEyWzFdOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK0xhc3RseSwgeW91IGNhbiB0aGVuIGhpbnQgdG8gdGhlIGNvcmUgb2YgeW91ciBkaXNjb3ZlcmVkIGFscGhhMiwgaWYgYSBtYXRjaAord2FzIGZvdW5kLiBZb3UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHlvdSBoYXZlIHJlZ2lzdGVyZWQgeW91ciB3aXBoeS4gWW91CithcmUgZXhwZWN0ZWQgdG8gZG8gdGhpcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisKKwlyID0gemRfcmVnMmFscGhhMihtYWMtPnJlZ2RvbWFpbiwgYWxwaGEyKTsKKwlpZiAoIXIpCisJCXJlZ3VsYXRvcnlfaGludChody0+d2lwaHksIGFscGhhMiwgTlVMTCk7CisKK0V4YW1wbGUgY29kZSAtIGRyaXZlcnMgcHJvdmlkaW5nIGEgYnVpbHQgaW4gcmVndWxhdG9yeSBkb21haW46CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgaGF2ZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIHlvdSBjYW4gb2J0YWluIGZyb20geW91cgorZHJpdmVyIGFuZCB5b3UgKm5lZWQqIHRvIHVzZSB0aGlzIHdlIGxldCB5b3UgYnVpbGQgYSByZWd1bGF0b3J5IGRvbWFpbgorc3RydWN0dXJlIGFuZCBwYXNzIGl0IHRvIHRoZSB3aXJlbGVzcyBjb3JlLiBUbyBkbyB0aGlzIHlvdSBzaG91bGQKK2ttYWxsb2MoKSBhIHN0cnVjdHVyZSBiaWcgZW5vdWdoIHRvIGhvbGQgeW91ciByZWd1bGF0b3J5IGRvbWFpbgorc3RydWN0dXJlIGFuZCB5b3Ugc2hvdWxkIHRoZW4gZmlsbCBpdCB3aXRoIHlvdXIgZGF0YS4gRmluYWxseSB5b3Ugc2ltcGx5CitjYWxsIHJlZ3VsYXRvcnlfaGludCgpIHdpdGggdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHN0cnVjdHVyZSBpbiBpdC4KKworQmVsbG93IGlzIGEgc2ltcGxlIGV4YW1wbGUsIHdpdGggYSByZWd1bGF0b3J5IGRvbWFpbiBjYWNoZWQgdXNpbmcgdGhlIHN0YWNrLgorWW91ciBpbXBsZW1lbnRhdGlvbiBtYXkgdmFyeSAocmVhZCBFRVBST00gY2FjaGUgaW5zdGVhZCwgZm9yIGV4YW1wbGUpLgorCitFeGFtcGxlIGNhY2hlIG9mIHNvbWUgcmVndWxhdG9yeSBkb21haW4KKworc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gbXlkcml2ZXJfanBfcmVnZG9tID0geworCS5uX3JlZ19ydWxlcyA9IDMsCisJLmFscGhhMiA9ICAiSlAiLAorCS8vLmFscGhhMiA9ICAiOTkiLCAvKiBJZiBJIGhhdmUgbm8gYWxwaGEyIHRvIG1hcCBpdCB0byAqLworCS5yZWdfcnVsZXMgPSB7CisJCS8qIElFRUUgODAyLjExYi9nLCBjaGFubmVscyAxLi4xNCAqLworCQlSRUdfUlVMRSgyNDEyLTIwLCAyNDg0KzIwLCA0MCwgNiwgMjAsIDApLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDM0Li40OCAqLworCQlSRUdfUlVMRSg1MTcwLTIwLCA1MjQwKzIwLCA0MCwgNiwgMjAsCisJCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDUyLi42NCAqLworCQlSRUdfUlVMRSg1MjYwLTIwLCA1MzIwKzIwLCA0MCwgNiwgMjAsCisJCQlOTDgwMjExX1JSRl9OT19JQlNTIHwKKwkJCU5MODAyMTFfUlJGX0RGUyksCisJfQorfTsKKworVGhlbiBpbiBzb21lIHBhcnQgb2YgeW91ciBjb2RlIGFmdGVyIHlvdXIgd2lwaHkgaGFzIGJlZW4gcmVnaXN0ZXJlZDoKKworCWludCByOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZDsKKwlpbnQgc2l6ZV9vZl9yZWdkOworCWludCBudW1fcnVsZXMgPSBteWRyaXZlcl9qcF9yZWdkb20ubl9yZWdfcnVsZXM7CisJdW5zaWduZWQgaW50IGk7CisKKwlzaXplX29mX3JlZ2QgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4pICsKKwkJKG51bV9ydWxlcyAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKSk7CisKKwlyZCA9IGt6YWxsb2Moc2l6ZV9vZl9yZWdkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkKQorCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KHJkLCAmbXlkcml2ZXJfanBfcmVnZG9tLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4pKTsKKworCWZvciAoaT0wOyBpIDwgbnVtX3J1bGVzOyBpKyspIHsKKwkJbWVtY3B5KCZyZC0+cmVnX3J1bGVzW2ldLCAmbXlkcml2ZXJfanBfcmVnZG9tLnJlZ19ydWxlc1tpXSwKKwkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKSk7CisJfQorCXIgPSByZWd1bGF0b3J5X2hpbnQoaHctPndpcGh5LCBOVUxMLCByZCk7CisJaWYgKHIpIHsKKwkJa2ZyZWUocmQpOworCQlyZXR1cm4gcjsKKwl9CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90cHJveHkudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Rwcm94eS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1OTk2ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90cHJveHkudHh0CkBAIC0wLDAgKzEsODUgQEAKK1RyYW5zcGFyZW50IHByb3h5IHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmZWF0dXJlIGFkZHMgTGludXggMi4yLWxpa2UgdHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydCB0byBjdXJyZW50IGtlcm5lbHMuCitUbyB1c2UgaXQsIGVuYWJsZSBORVRGSUxURVJfVFBST1hZLCB0aGUgc29ja2V0IG1hdGNoIGFuZCB0aGUgVFBST1hZIHRhcmdldCBpbgoreW91ciBrZXJuZWwgY29uZmlnLiBZb3Ugd2lsbCBuZWVkIHBvbGljeSByb3V0aW5nIHRvbywgc28gYmUgc3VyZSB0byBlbmFibGUgdGhhdAorYXMgd2VsbC4KKworCisxLiBNYWtpbmcgbm9uLWxvY2FsIHNvY2tldHMgd29yaworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGlkZWEgaXMgdGhhdCB5b3UgaWRlbnRpZnkgcGFja2V0cyB3aXRoIGRlc3RpbmF0aW9uIGFkZHJlc3MgbWF0Y2hpbmcgYSBsb2NhbAorc29ja2V0IG9uIHlvdXIgYm94LCBzZXQgdGhlIHBhY2tldCBtYXJrIHRvIGEgY2VydGFpbiB2YWx1ZSwgYW5kIHRoZW4gbWF0Y2ggb24gdGhhdAordmFsdWUgdXNpbmcgcG9saWN5IHJvdXRpbmcgdG8gaGF2ZSB0aG9zZSBwYWNrZXRzIGRlbGl2ZXJlZCBsb2NhbGx5OgorCisjIGlwdGFibGVzIC10IG1hbmdsZSAtTiBESVZFUlQKKyMgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBSRVJPVVRJTkcgLXAgdGNwIC1tIHNvY2tldCAtaiBESVZFUlQKKyMgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIERJVkVSVCAtaiBNQVJLIC0tc2V0LW1hcmsgMQorIyBpcHRhYmxlcyAtdCBtYW5nbGUgLUEgRElWRVJUIC1qIEFDQ0VQVAorCisjIGlwIHJ1bGUgYWRkIGZ3bWFyayAxIGxvb2t1cCAxMDAKKyMgaXAgcm91dGUgYWRkIGxvY2FsIDAuMC4wLjAvMCBkZXYgbG8gdGFibGUgMTAwCisKK0JlY2F1c2Ugb2YgY2VydGFpbiByZXN0cmljdGlvbnMgaW4gdGhlIElQdjQgcm91dGluZyBvdXRwdXQgY29kZSB5b3UnbGwgaGF2ZSB0bworbW9kaWZ5IHlvdXIgYXBwbGljYXRpb24gdG8gYWxsb3cgaXQgdG8gc2VuZCBkYXRhZ3JhbXMgX2Zyb21fIG5vbi1sb2NhbCBJUAorYWRkcmVzc2VzLiBBbGwgeW91IGhhdmUgdG8gZG8gaXMgZW5hYmxlIHRoZSAoU09MX0lQLCBJUF9UUkFOU1BBUkVOVCkgc29ja2V0CitvcHRpb24gYmVmb3JlIGNhbGxpbmcgYmluZDoKKworZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworLyogLSA4PCAtKi8KK2ludCB2YWx1ZSA9IDE7CitzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIElQX1RSQU5TUEFSRU5ULCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworLyogLSA4PCAtKi8KK25hbWUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CituYW1lLnNpbl9wb3J0ID0gaHRvbnMoMHhDQUZFKTsKK25hbWUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoMHhERUFEQkVFRik7CitiaW5kKGZkLCAmbmFtZSwgc2l6ZW9mKG5hbWUpKTsKKworQSB0cml2aWFsIHBhdGNoIGZvciBuZXRjYXQgaXMgYXZhaWxhYmxlIGhlcmU6CitodHRwOi8vcGVvcGxlLm5ldGZpbHRlci5vcmcvaGlkZGVuL3Rwcm94eS9uZXRjYXQtaXBfdHJhbnNwYXJlbnQtc3VwcG9ydC5wYXRjaAorCisKKzIuIFJlZGlyZWN0aW5nIHRyYWZmaWMKKz09PT09PT09PT09PT09PT09PT09PT0KKworVHJhbnNwYXJlbnQgcHJveHlpbmcgb2Z0ZW4gaW52b2x2ZXMgImludGVyY2VwdGluZyIgdHJhZmZpYyBvbiBhIHJvdXRlci4gVGhpcyBpcwordXN1YWxseSBkb25lIHdpdGggdGhlIGlwdGFibGVzIFJFRElSRUNUIHRhcmdldDsgaG93ZXZlciwgdGhlcmUgYXJlIHNlcmlvdXMKK2xpbWl0YXRpb25zIG9mIHRoYXQgbWV0aG9kLiBPbmUgb2YgdGhlIG1ham9yIGlzc3VlcyBpcyB0aGF0IGl0IGFjdHVhbGx5Cittb2RpZmllcyB0aGUgcGFja2V0cyB0byBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgLS0gd2hpY2ggbWlnaHQgbm90IGJlCithY2NlcHRhYmxlIGluIGNlcnRhaW4gc2l0dWF0aW9ucy4gKFRoaW5rIG9mIHByb3h5aW5nIFVEUCBmb3IgZXhhbXBsZTogeW91IHdvbid0CitiZSBhYmxlIHRvIGZpbmQgb3V0IHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBhZGRyZXNzLiBFdmVuIGluIGNhc2Ugb2YgVENQCitnZXR0aW5nIHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHJhY3kuKQorCitUaGUgJ1RQUk9YWScgdGFyZ2V0IHByb3ZpZGVzIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSB3aXRob3V0IHJlbHlpbmcgb24gTkFULiBTaW1wbHkKK2FkZCBydWxlcyBsaWtlIHRoaXMgdG8gdGhlIGlwdGFibGVzIHJ1bGVzZXQgYWJvdmU6CisKKyMgaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBSRVJPVVRJTkcgLXAgdGNwIC0tZHBvcnQgODAgLWogVFBST1hZIFwKKyAgLS10cHJveHktbWFyayAweDEvMHgxIC0tb24tcG9ydCA1MDA4MAorCitOb3RlIHRoYXQgZm9yIHRoaXMgdG8gd29yayB5b3UnbGwgaGF2ZSB0byBtb2RpZnkgdGhlIHByb3h5IHRvIGVuYWJsZSAoU09MX0lQLAorSVBfVFJBTlNQQVJFTlQpIGZvciB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKworCiszLiBJcHRhYmxlcyBleHRlbnNpb25zCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHVzZSB0cHJveHkgeW91J2xsIG5lZWQgdG8gaGF2ZSB0aGUgJ3NvY2tldCcgYW5kICdUUFJPWFknIG1vZHVsZXMKK2NvbXBpbGVkIGZvciBpcHRhYmxlcy4gQSBwYXRjaGVkIHZlcnNpb24gb2YgaXB0YWJsZXMgaXMgYXZhaWxhYmxlCitoZXJlOiBodHRwOi8vZ2l0LmJhbGFiaXQuaHUvP3A9YmF6c2kvaXB0YWJsZXMtdHByb3h5LmdpdAorCisKKzQuIEFwcGxpY2F0aW9uIHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT0KKworNC4xLiBTcXVpZAorLS0tLS0tLS0tLQorCitTcXVpZCAzLkhFQUQgaGFzIHN1cHBvcnQgYnVpbHQtaW4uIFRvIHVzZSBpdCwgcGFzcworJy0tZW5hYmxlLWxpbnV4LW5ldGZpbHRlcicgdG8gY29uZmlndXJlIGFuZCBzZXQgdGhlICd0cHJveHknIG9wdGlvbiBvbgordGhlIEhUVFAgbGlzdGVuZXIgeW91IHJlZGlyZWN0IHRyYWZmaWMgdG8gd2l0aCB0aGUgVFBST1hZIGlwdGFibGVzCit0YXJnZXQuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgcGFnZSBvbiB0aGUgU3F1aWQKK3dpa2k6IGh0dHA6Ly93aWtpLnNxdWlkLWNhY2hlLm9yZy9GZWF0dXJlcy9UcHJveHk0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdm9ydGV4LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy92b3J0ZXgudHh0CmluZGV4IDYzNTZkM2YuLmJkNzA5NzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy92b3J0ZXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy92b3J0ZXgudHh0CkBAIC0xLDUgKzEsNSBAQAogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3ZvcnRleC50eHQKLUFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KK0FuZHJldyBNb3J0b24KIDMwIEFwcmlsIDIwMDAKIAogCkBAIC0xMSw3ICsxMSw3IEBACiBEb24gaXMgbm8gbG9uZ2VyIHRoZSBwcmltZSBtYWludGFpbmVyIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyLiAKIFBsZWFzZSByZXBvcnQgcHJvYmxlbXMgdG8gb25lIG9yIG1vcmUgb2Y6CiAKLSAgQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4KKyAgQW5kcmV3IE1vcnRvbgogICBOZXRkZXYgbWFpbGluZyBsaXN0IDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPgogICBMaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IDxsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnPgogCkBAIC0zMDUsMTEgKzMwNSw2IEBACiAKIAlmdHA6Ly9mdHAuM2NvbS5jb20vcHViL25pYy8zYzkweC8zYzkweHgyLmV4ZQogCi1Ecml2ZXIgdXBkYXRlcyBhbmQgYSBkZXRhaWxlZCBjaGFuZ2Vsb2cgZm9yIHRoZSBtb2RpZmljYXRpb25zIHdoaWNoCi13ZXJlIG1hZGUgZm9yIHRoZSAyLjMvMiw0IHNlcmllcyBrZXJuZWwgaXMgYXZhaWxhYmxlIGF0Ci0KLSAgICAgaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4LyMzYzU5eC1iYwotCiAKIEF1dG9uZWdvdGlhdGlvbiBub3RlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BjbWNpYS9kcml2ZXItY2hhbmdlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3BjbWNpYS9kcml2ZXItY2hhbmdlcy50eHQKaW5kZXggOTZmMTU1ZS4uMDU5OTM0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLWNoYW5nZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dApAQCAtMSw1ICsxLDExIEBACiBUaGlzIGZpbGUgZGV0YWlscyBjaGFuZ2VzIGluIDIuNiB3aGljaCBhZmZlY3QgUENNQ0lBIGNhcmQgZHJpdmVyIGF1dGhvcnM6CiAKKyogTmV3IGNvbmZpZ3VyYXRpb24gbG9vcCBoZWxwZXIgKGFzIG9mIDIuNi4yOCkKKyAgIEJ5IGNhbGxpbmcgcGNtY2lhX2xvb3BfY29uZmlnKCksIGEgZHJpdmVyIGNhbiBpdGVyYXRlIG92ZXIgYWxsIGF2YWlsYWJsZQorICAgY29uZmlndXJhdGlvbiBvcHRpb25zLiBEdXJpbmcgYSBkcml2ZXIncyBwcm9iZSgpIHBoYXNlLCBvbmUgZG9lc24ndCBuZWVkCisgICB0byB1c2UgcGNtY2lhX2dldF97Zmlyc3QsbmV4dH1fdHVwbGUsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YSBhbmQKKyAgIHBjbWNpYV9wYXJzZV90dXBsZSBkaXJlY3RseSBpbiBtb3N0IGlmIG5vdCBhbGwgY2FzZXMuCisKICogTmV3IHJlbGVhc2UgaGVscGVyIChhcyBvZiAyLjYuMTcpCiAgICBJbnN0ZWFkIG9mIGNhbGxpbmcgcGNtY2lhX3JlbGVhc2Vfe2NvbmZpZ3VyYXRpb24saW8saXJxLHdpbn0sIGFsbCB0aGF0J3MKICAgIG5lY2Vzc2FyeSBub3cgaXMgY2FsbGluZyBwY21jaWFfZGlzYWJsZV9kZXZpY2UuIEFzIHRoZXJlIGlzIG5vIHZhbGlkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL21hY2hpbmUudHh0CmluZGV4IGM5YTM1NjYuLmNlMzQ4N2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL21hY2hpbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL21hY2hpbmUudHh0CkBAIC0yLDE3ICsyLDggQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoZSByZWd1bGF0b3IgbWFjaGluZSBkcml2ZXIgaW50ZXJmYWNlIGlzIGludGVuZGVkIGZvciBib2FyZC9tYWNoaW5lIHNwZWNpZmljCi1pbml0aWFsaXNhdGlvbiBjb2RlIHRvIGNvbmZpZ3VyZSB0aGUgcmVndWxhdG9yIHN1YnN5c3RlbS4gVHlwaWNhbCB0aGluZ3MgdGhhdAotbWFjaGluZSBkcml2ZXJzIHdvdWxkIGRvIGFyZSA6LQoraW5pdGlhbGlzYXRpb24gY29kZSB0byBjb25maWd1cmUgdGhlIHJlZ3VsYXRvciBzdWJzeXN0ZW0uCiAKLSAxLiBSZWd1bGF0b3IgLT4gRGV2aWNlIG1hcHBpbmcuCi0gMi4gUmVndWxhdG9yIHN1cHBseSBjb25maWd1cmF0aW9uLgotIDMuIFBvd2VyIERvbWFpbiBjb25zdHJhaW50IHNldHRpbmcuCi0KLQotCi0xLiBSZWd1bGF0b3IgLT4gZGV2aWNlIG1hcHBpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBtYWNoaW5lIDotCiAKICAgUmVndWxhdG9yLTEgLSstPiBSZWd1bGF0b3ItMiAtLT4gW0NvbnN1bWVyIEEgQCAxLjggLSAyLjBWXQpAQCAtMjEsODEgKzEyLDgyIEBACiAKIFRoZSBkcml2ZXJzIGZvciBjb25zdW1lcnMgQSAmIEIgbXVzdCBiZSBtYXBwZWQgdG8gdGhlIGNvcnJlY3QgcmVndWxhdG9yIGluCiBvcmRlciB0byBjb250cm9sIHRoZWlyIHBvd2VyIHN1cHBseS4gVGhpcyBtYXBwaW5nIGNhbiBiZSBhY2hpZXZlZCBpbiBtYWNoaW5lCi1pbml0aWFsaXNhdGlvbiBjb2RlIGJ5IGNhbGxpbmcgOi0KK2luaXRpYWxpc2F0aW9uIGNvZGUgYnkgY3JlYXRpbmcgYSBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBmb3IKK2VhY2ggcmVndWxhdG9yLgogCi1pbnQgcmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5KGNvbnN0IGNoYXIgKnJlZ3VsYXRvciwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJCWNvbnN0IGNoYXIgKnN1cHBseSk7CitzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB7CisJc3RydWN0IGRldmljZSAqZGV2OwkvKiBjb25zdW1lciAqLworCWNvbnN0IGNoYXIgKnN1cHBseTsJLyogY29uc3VtZXIgc3VwcGx5IC0gZS5nLiAidmNjIiAqLworfTsKIAotYW5kIGlzIHNob3duIHdpdGggdGhlIGZvbGxvd2luZyBjb2RlIDotCitlLmcuIGZvciB0aGUgbWFjaGluZSBhYm92ZQogCi1yZWd1bGF0b3Jfc2V0X2RldmljZV9zdXBwbHkoIlJlZ3VsYXRvci0xIiwgZGV2QiwgIlZjYyIpOwotcmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5KCJSZWd1bGF0b3ItMiIsIGRldkEsICJWY2MiKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByZWd1bGF0b3IxX2NvbnN1bWVyc1tdID0geworeworCS5kZXYJPSAmcGxhdGZvcm1fY29uc3VtZXJCX2RldmljZS5kZXYsCisJLnN1cHBseQk9ICJWY2MiLAorfSx9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcmVndWxhdG9yMl9jb25zdW1lcnNbXSA9IHsKK3sKKwkuZGV2CT0gJnBsYXRmb3JtX2NvbnN1bWVyQV9kZXZpY2UuZGV2LAorCS5zdXBwbHkJPSAiVmNjIiwKK30sfTsKIAogVGhpcyBtYXBzIFJlZ3VsYXRvci0xIHRvIHRoZSAnVmNjJyBzdXBwbHkgZm9yIENvbnN1bWVyIEIgYW5kIG1hcHMgUmVndWxhdG9yLTIKIHRvIHRoZSAnVmNjJyBzdXBwbHkgZm9yIENvbnN1bWVyIEEuCiAKK0NvbnN0cmFpbnRzIGNhbiBub3cgYmUgcmVnaXN0ZXJlZCBieSBkZWZpbmluZyBhIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCitmb3IgZWFjaCByZWd1bGF0b3IgcG93ZXIgZG9tYWluLiBUaGlzIHN0cnVjdHVyZSBhbHNvIG1hcHMgdGhlIGNvbnN1bWVycwordG8gdGhlaXIgc3VwcGx5IHJlZ3VsYXRvciA6LQogCi0yLiBSZWd1bGF0b3Igc3VwcGx5IGNvbmZpZ3VyYXRpb24uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Db25zaWRlciB0aGUgZm9sbG93aW5nIG1hY2hpbmUgKGFnYWluKSA6LQotCi0gIFJlZ3VsYXRvci0xIC0rLT4gUmVndWxhdG9yLTIgLS0+IFtDb25zdW1lciBBIEAgMS44IC0gMi4wVl0KLSAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICstPiBbQ29uc3VtZXIgQiBAIDMuM1ZdCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcmVndWxhdG9yMV9kYXRhID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91ViA9IDMzMDAwMDAsCisJCS5tYXhfdVYgPSAzMzAwMDAwLAorCQkudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTCwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHJlZ3VsYXRvcjFfY29uc3VtZXJzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSByZWd1bGF0b3IxX2NvbnN1bWVycywKK307CiAKIFJlZ3VsYXRvci0xIHN1cHBsaWVzIHBvd2VyIHRvIFJlZ3VsYXRvci0yLiBUaGlzIHJlbGF0aW9uc2hpcCBtdXN0IGJlIHJlZ2lzdGVyZWQKIHdpdGggdGhlIGNvcmUgc28gdGhhdCBSZWd1bGF0b3ItMSBpcyBhbHNvIGVuYWJsZWQgd2hlbiBDb25zdW1lciBBIGVuYWJsZXMgaXQncwotc3VwcGx5IChSZWd1bGF0b3ItMikuCitzdXBwbHkgKFJlZ3VsYXRvci0yKS4gVGhlIHN1cHBseSByZWd1bGF0b3IgaXMgc2V0IGJ5IHRoZSBzdXBwbHlfcmVndWxhdG9yX2RldgorZmllbGQgYmVsb3c6LQogCi1UaGlzIHJlbGF0aW9uc2hpcCBjYW4gYmUgcmVnaXN0ZXIgd2l0aCB0aGUgY29yZSB2aWEgOi0KLQotaW50IHJlZ3VsYXRvcl9zZXRfc3VwcGx5KGNvbnN0IGNoYXIgKnJlZ3VsYXRvciwgY29uc3QgY2hhciAqcmVndWxhdG9yX3N1cHBseSk7Ci0KLUluIHRoaXMgZXhhbXBsZSB3ZSB3b3VsZCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlIDotCi0KLXJlZ3VsYXRvcl9zZXRfc3VwcGx5KCJSZWd1bGF0b3ItMiIsICJSZWd1bGF0b3ItMSIpOwotCi1SZWxhdGlvbnNoaXBzIGNhbiBiZSBxdWVyaWVkIGJ5IGNhbGxpbmcgOi0KLQotY29uc3QgY2hhciAqcmVndWxhdG9yX2dldF9zdXBwbHkoY29uc3QgY2hhciAqcmVndWxhdG9yKTsKLQotCi0zLiBQb3dlciBEb21haW4gY29uc3RyYWludCBzZXR0aW5nLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUVhY2ggcG93ZXIgZG9tYWluIHdpdGhpbiBhIHN5c3RlbSBoYXMgcGh5c2ljYWwgY29uc3RyYWludHMgb24gdm9sdGFnZSBhbmQKLWN1cnJlbnQuIFRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIHNvZnR3YXJlIHNvIHRoYXQgdGhlIHBvd2VyIGRvbWFpbiBpcyBhbHdheXMKLW9wZXJhdGVkIHdpdGhpbiBzcGVjaWZpY2F0aW9ucy4KLQotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBtYWNoaW5lIChhZ2FpbikgOi0KLQotICBSZWd1bGF0b3ItMSAtKy0+IFJlZ3VsYXRvci0yIC0tPiBbQ29uc3VtZXIgQSBAIDEuOCAtIDIuMFZdCi0gICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICArLT4gW0NvbnN1bWVyIEIgQCAzLjNWXQotCi1UaGlzIGdpdmVzIHVzIHR3byByZWd1bGF0b3JzIGFuZCB0d28gcG93ZXIgZG9tYWluczoKLQotICAgICAgICAgICAgICAgICAgIERvbWFpbiAxOiBSZWd1bGF0b3ItMiwgQ29uc3VtZXIgQi4KLSAgICAgICAgICAgICAgICAgICBEb21haW4gMjogQ29uc3VtZXIgQS4KLQotQ29uc3RyYWludHMgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgY2FsbGluZyA6LQotCi1pbnQgcmVndWxhdG9yX3NldF9wbGF0Zm9ybV9jb25zdHJhaW50cyhjb25zdCBjaGFyICpyZWd1bGF0b3IsCi0Jc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzKTsKLQotVGhlIGV4YW1wbGUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIDotCi0KLXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzIGRvbWFpbl8xID0gewotCS5taW5fdVYgPSAzMzAwMDAwLAotCS5tYXhfdVYgPSAzMzAwMDAwLAotCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMLAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJlZ3VsYXRvcjJfZGF0YSA9IHsKKwkuc3VwcGx5X3JlZ3VsYXRvcl9kZXYgPSAmcGxhdGZvcm1fcmVndWxhdG9yMV9kZXZpY2UuZGV2LAorCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91ViA9IDE4MDAwMDAsCisJCS5tYXhfdVYgPSAyMDAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUocmVndWxhdG9yMl9jb25zdW1lcnMpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IHJlZ3VsYXRvcjJfY29uc3VtZXJzLAogfTsKIAotc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgZG9tYWluXzIgPSB7Ci0JLm1pbl91ViA9IDE4MDAwMDAsCi0JLm1heF91ViA9IDIwMDAwMDAsCi0JLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAotCS52YWxpZF9tb2Rlc19tYXNrID0gUkVHVUxBVE9SX01PREVfTk9STUFMLAotfTsKK0ZpbmFsbHkgdGhlIHJlZ3VsYXRvciBkZXZpY2VzIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdXN1YWwgbWFubmVyLgogCi1yZWd1bGF0b3Jfc2V0X3BsYXRmb3JtX2NvbnN0cmFpbnRzKCJSZWd1bGF0b3ItMSIsICZkb21haW5fMSk7Ci1yZWd1bGF0b3Jfc2V0X3BsYXRmb3JtX2NvbnN0cmFpbnRzKCJSZWd1bGF0b3ItMiIsICZkb21haW5fMik7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWd1bGF0b3JfZGV2aWNlc1tdID0geworeworCS5uYW1lID0gInJlZ3VsYXRvciIsCisJLmlkID0gRENEQ18xLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnJlZ3VsYXRvcjFfZGF0YSwKKwl9LAorfSwKK3sKKwkubmFtZSA9ICJyZWd1bGF0b3IiLAorCS5pZCA9IERDRENfMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZyZWd1bGF0b3IyX2RhdGEsCisJfSwKK30sCit9OworLyogcmVnaXN0ZXIgcmVndWxhdG9yIDEgZGV2aWNlICovCitwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJndtODM1MF9yZWd1bGF0b3JfZGV2aWNlc1swXSk7CisKKy8qIHJlZ2lzdGVyIHJlZ3VsYXRvciAyIGRldmljZSAqLworcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ3bTgzNTBfcmVndWxhdG9yX2RldmljZXNbMV0pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKaW5kZXggYTY5MDUwMS4uNDIwMGFjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CkBAIC0xMCwxMSArMTAsMTEgQEAKIAogRHJpdmVycyBjYW4gcmVnaXN0ZXIgYSByZWd1bGF0b3IgYnkgY2FsbGluZyA6LQogCi1zdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yX3JlZ2lzdGVyKHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yX2Rlc2MsCi0JCQkJCSAgdm9pZCAqcmVnX2RhdGEpOworc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpyZWd1bGF0b3JfZGVzYyk7CiAKLVRoaXMgd2lsbCByZWdpc3RlciB0aGUgcmVndWxhdG9ycyBjYXBhYmlsaXRpZXMgYW5kIG9wZXJhdGlvbnMgdGhlIHJlZ3VsYXRvcgotY29yZS4gVGhlIGNvcmUgZG9lcyBub3QgdG91Y2ggcmVnX2RhdGEgKHByaXZhdGUgdG8gcmVndWxhdG9yIGRyaXZlcikuCitUaGlzIHdpbGwgcmVnaXN0ZXIgdGhlIHJlZ3VsYXRvcnMgY2FwYWJpbGl0aWVzIGFuZCBvcGVyYXRpb25zIHRvIHRoZSByZWd1bGF0b3IKK2NvcmUuCiAKIFJlZ3VsYXRvcnMgY2FuIGJlIHVucmVnaXN0ZXJlZCBieSBjYWxsaW5nIDotCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvczJyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zMnJhbS50eHQKaW5kZXggYjA1ZjUxMi4uMmViZGM2MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zMnJhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zMnJhbS50eHQKQEAgLTU0LDMgKzU0LDIxIEBACiB0aGF0ICJyYWRlb25mYiIgc2ltcGx5IGNhbm5vdCByZXN1bWUgdGhhdCBkZXZpY2UgLSBpdCB0cmllcyB0byBzZXQgdGhlCiBQTEwncywgYW5kIGl0IGp1c3QgX2hhbmdzXy4gVXNpbmcgdGhlIHJlZ3VsYXIgVkdBIGNvbnNvbGUgYW5kIGxldHRpbmcgWAogcmVzdW1lIGl0IGluc3RlYWQgd29ya3MgZmluZS4KKworTk9URQorPT09PQorcG1fdHJhY2UgdXNlcyB0aGUgc3lzdGVtJ3MgUmVhbCBUaW1lIENsb2NrIChSVEMpIHRvIHNhdmUgdGhlIG1hZ2ljIG51bWJlci4KK1JlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBSVEMgaXMgdGhlIG9ubHkgcmVsaWFibHkgYXZhaWxhYmxlIHBpZWNlIG9mCitoYXJkd2FyZSBkdXJpbmcgcmVzdW1lIG9wZXJhdGlvbnMgd2hlcmUgYSB2YWx1ZSBjYW4gYmUgc2V0IHRoYXQgd2lsbAorc3Vydml2ZSBhIHJlYm9vdC4KKworQ29uc2VxdWVuY2UgaXMgdGhhdCBhZnRlciBhIHJlc3VtZSAoZXZlbiBpZiBpdCBpcyBzdWNjZXNzZnVsKSB5b3VyIHN5c3RlbQorY2xvY2sgd2lsbCBoYXZlIGEgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFnaWMgbXVtYmVyIGluc3RlYWQgb2YgdGhlCitjb3JyZWN0IGRhdGUvdGltZSEgSXQgaXMgdGhlcmVmb3JlIGFkdmlzYWJsZSB0byB1c2UgYSBwcm9ncmFtIGxpa2UgbnRwLWRhdGUKK29yIHJkYXRlIHRvIHJlc2V0IHRoZSBjb3JyZWN0IGRhdGUvdGltZSBmcm9tIGFuIGV4dGVybmFsIHRpbWUgc291cmNlIHdoZW4KK3VzaW5nIHRoaXMgdHJhY2Ugb3B0aW9uLgorCitBcyB0aGUgY2xvY2sga2VlcHMgdGlja2luZyBpdCBpcyBhbHNvIGVzc2VudGlhbCB0aGF0IHRoZSByZWJvb3QgaXMgZG9uZQorcXVpY2tseSBhZnRlciB0aGUgcmVzdW1lIGZhaWx1cmUuIFRoZSB0cmFjZSBvcHRpb24gZG9lcyBub3QgdXNlIHRoZSBzZWNvbmRzCitvciB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIG1pbnV0ZXMgb2YgdGhlIFJUQywgYnV0IGEgdG9vIGxvbmcgZGVsYXkgd2lsbAorY29ycnVwdCB0aGUgbWFnaWMgdmFsdWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvMDAtSU5ERVgKaW5kZXggMjlkODM5Yy4uZTM5NjBiOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy8wMC1JTkRFWApAQCAtMTgsMTAgKzE4LDYgQEAKIAktIExpbnV4IDIuNi54IG9uIE1QQzUyeHggZmFtaWx5CiBtcGM1Mnh4LWRldmljZS10cmVlLWJpbmRpbmdzLnR4dAogCS0gTVBDNTIwMCBEZXZpY2UgVHJlZSBCaW5kaW5ncwotcHBjX2h0YWIudHh0Ci0JLSBpbmZvIGFib3V0IHRoZSBMaW51eC9QUEMgL3Byb2MvcHBjX2h0YWIgZW50cnkKLXNtcC50eHQKLQktIHVzZSBhbmQgc3RhdGUgaW5mbyBhYm91dCBMaW51eC9QUEMgb24gTVAgbWFjaGluZXMKIHNvdW5kLnR4dAogCS0gaW5mbyBvbiBzb3VuZCBzdXBwb3J0IHVuZGVyIExpbnV4L1BQQwogekltYWdlX2xheW91dC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsLzgzeHgtNTEyeC1wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvODN4eC01MTJ4LXBjaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNDY1MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsLzgzeHgtNTEyeC1wY2kudHh0CkBAIC0wLDAgKzEsNDAgQEAKKyogRnJlZXNjYWxlIDgzeHggYW5kIDUxMnggUENJIGJyaWRnZXMKKworRnJlZXNjYWxlIDgzeHggYW5kIDUxMnggU09DcyBpbmNsdWRlIHRoZSBzYW1lIHBjaSBicmlkZ2UgY29yZS4KKworODN4eC81MTJ4IHNwZWNpZmljIG5vdGVzOgorLSByZWc6IHNob3VsZCBjb250YWluIHR3byBhZGRyZXNzIGxlbmd0aCB0dXBsZXMKKyAgICBUaGUgZmlyc3QgaXMgZm9yIHRoZSBpbnRlcm5hbCBwY2kgYnJpZGdlIHJlZ2lzdGVycworICAgIFRoZSBzZWNvbmQgaXMgZm9yIHRoZSBwY2kgY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMKKworRXhhbXBsZSAoTVBDODMxM0VSREIpCisJcGNpMDogcGNpQGUwMDA4NTAwIHsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwRSAtbWluaSBQQ0kgKi8KKwkJCQkgMHg3MDAwIDB4MCAweDAgMHgxICZpcGljIDE4IDB4OAorCQkJCSAweDcwMDAgMHgwIDB4MCAweDIgJmlwaWMgMTggMHg4CisJCQkJIDB4NzAwMCAweDAgMHgwIDB4MyAmaXBpYyAxOCAweDgKKwkJCQkgMHg3MDAwIDB4MCAweDAgMHg0ICZpcGljIDE4IDB4OAorCisJCQkJLyogSURTRUwgMHgwRiAtIFBDSSBzbG90ICovCisJCQkJIDB4NzgwMCAweDAgMHgwIDB4MSAmaXBpYyAxNyAweDgKKwkJCQkgMHg3ODAwIDB4MCAweDAgMHgyICZpcGljIDE4IDB4OAorCQkJCSAweDc4MDAgMHgwIDB4MCAweDMgJmlwaWMgMTcgMHg4CisJCQkJIDB4NzgwMCAweDAgMHgwIDB4NCAmaXBpYyAxOCAweDg+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKKwkJaW50ZXJydXB0cyA9IDw2NiAweDg+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4MD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweDkwMDAwMDAwIDB4OTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKKwkJCSAgMHg0MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDB4MCAweDEwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhlMjAwMDAwMCAweDAgMHgwMDEwMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw2NjY2NjY2Nj47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgMHhlMDAwODMwMCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC84eHh4X2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvOHh4eF9ncGlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE1ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvOHh4eF9ncGlvLnR4dApAQCAtMCwwICsxLDQwIEBACitHUElPIGNvbnRyb2xsZXJzIG9uIE1QQzh4eHggU29DcworCitUaGlzIGlzIGZvciB0aGUgbm9uLVFFL0NQTS9HVVRzIEdQSU8gY29udHJvbGxlcnMgYXMgZm91bmQgb24KKzgzNDksIDg1NzIsIDg2MTAgYW5kIGNvbXBhdGlibGUuCisKK0V2ZXJ5IEdQSU8gY29udHJvbGxlciBub2RlIG11c3QgaGF2ZSAjZ3Bpby1jZWxscyBwcm9wZXJ0eSBkZWZpbmVkLAordGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdHJhbnNsYXRlIGdwaW8tc3BlY2lmaWVycy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJmc2wsPENISVA+LWdwaW8iIGZvbGxvd2VkIGJ5ICJmc2wsbXBjODM0OS1ncGlvIiBmb3IKKyAgODN4eCwgImZzbCxtcGM4NTcyLWdwaW8iIGZvciA4NXh4IGFuZCAiZnNsLG1wYzg2MTAtZ3BpbyIgZm9yIDg2eHguCistICNncGlvLWNlbGxzIDogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIgYW5kIHRoZQorICBzZWNvbmQgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgb3B0aW9uYWwgcGFyYW1ldGVycyAoY3VycmVudGx5IHVudXNlZCkuCisgLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG1hcHBpbmcgZm9yIEdQSU8gSVJRIChjdXJyZW50bHkgdW51c2VkKS4KKyAtIGludGVycnVwdC1wYXJlbnQgOiBQaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorICAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UuCistIGdwaW8tY29udHJvbGxlciA6IE1hcmtzIHRoZSBwb3J0IGFzIEdQSU8gY29udHJvbGxlci4KKworRXhhbXBsZSBvZiBncGlvLWNvbnRyb2xsZXIgbm9kZXMgZm9yIGEgTVBDODM0NyBTb0M6CisKKwlncGlvMTogZ3Bpby1jb250cm9sbGVyQGMwMCB7CisJCSNncGlvLWNlbGxzID0gPDI+OworCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ3LWdwaW8iLCAiZnNsLG1wYzgzNDktZ3BpbyI7CisJCXJlZyA9IDwweGMwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8NzQgMHg4PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCWdwaW8tY29udHJvbGxlcjsKKwl9OworCisJZ3BpbzI6IGdwaW8tY29udHJvbGxlckBkMDAgeworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0Ny1ncGlvIiwgImZzbCxtcGM4MzQ5LWdwaW8iOworCQlyZWcgPSA8MHhkMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDc1IDB4OD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQlncGlvLWNvbnRyb2xsZXI7CisJfTsKKworU2VlIGJvb3Rpbmctd2l0aG91dC1vZi50eHQgZm9yIGRldGFpbHMgb2YgaG93IHRvIHNwZWNpZnkgR1BJTworaW5mb3JtYXRpb24gZm9yIGRldmljZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9kbWEudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvZG1hLnR4dAppbmRleCA4NjgyNmRmLi5jYzQ1MzExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9kbWEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2RtYS50eHQKQEAgLTIwLDcgKzIwLDcgQEAKICAgICAgICAgLSBjb21wYXRpYmxlICAgICAgICA6IGNvbXBhdGlibGUgbGlzdCwgY29udGFpbnMgMiBlbnRyaWVzLCBmaXJzdCBpcwogCQkJICJmc2wsQ0hJUC1kbWEtY2hhbm5lbCIsIHdoZXJlIENISVAgaXMgdGhlIHByb2Nlc3NvcgogCQkJIChtcGM4MzQ5LCBtcGM4MzUwLCBldGMuKSBhbmQgdGhlIHNlY29uZCBpcwotCQkJICJmc2wsZWxvLWRtYS1jaGFubmVsIgorCQkJICJmc2wsZWxvLWRtYS1jaGFubmVsIi4gSG93ZXZlciwgc2VlIG5vdGUgYmVsb3cuCiAgICAgICAgIC0gcmVnICAgICAgICAgICAgICAgOiA8cmVnaXN0ZXJzIG1hcHBpbmcgZm9yIGNoYW5uZWw+CiAgICAgICAgIC0gY2VsbC1pbmRleCAgICAgICAgOiBkbWEgY2hhbm5lbCBpbmRleCBzdGFydHMgYXQgMC4KIApAQCAtODIsNyArODIsNyBAQAogICAgICAgICAtIGNvbXBhdGlibGUgICAgICAgIDogY29tcGF0aWJsZSBsaXN0LCBjb250YWlucyAyIGVudHJpZXMsIGZpcnN0IGlzCiAJCQkgImZzbCxDSElQLWRtYS1jaGFubmVsIiwgd2hlcmUgQ0hJUCBpcyB0aGUgcHJvY2Vzc29yCiAJCQkgKG1wYzg1NDAsIG1wYzg1NjAsIGV0Yy4pIGFuZCB0aGUgc2Vjb25kIGlzCi0JCQkgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIgorCQkJICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCIuIEhvd2V2ZXIsIHNlZSBub3RlIGJlbG93LgogICAgICAgICAtIGNlbGwtaW5kZXggICAgICAgIDogZG1hIGNoYW5uZWwgaW5kZXggc3RhcnRzIGF0IDAuCiAgICAgICAgIC0gcmVnICAgICAgICAgICAgICAgOiA8cmVnaXN0ZXJzIG1hcHBpbmcgZm9yIGNoYW5uZWw+CiAgICAgICAgIC0gaW50ZXJydXB0cyAgICAgICAgOiA8aW50ZXJydXB0IG1hcHBpbmcgZm9yIERNQSBjaGFubmVsIElSUT4KQEAgLTEyNSwzICsxMjUsMTIgQEAKIAkJCWludGVycnVwdHMgPSA8MTcgMj47CiAJCX07CiAJfTsKKworTm90ZSBvbiBETUEgY2hhbm5lbCBjb21wYXRpYmxlIHByb3BlcnRpZXM6IFRoZSBjb21wYXRpYmxlIHByb3BlcnR5IG11c3Qgc2F5CisiZnNsLGVsby1kbWEtY2hhbm5lbCIgb3IgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIiB0byBiZSB1c2VkIGJ5IHRoZSBFbG8gRE1BCitkcml2ZXIgKGZzbGRtYSkuICBBbnkgRE1BIGNoYW5uZWwgdXNlZCBieSBmc2xkbWEgY2Fubm90IGJlIHVzZWQgYnkgYW5vdGhlcgorRE1BIGRyaXZlciwgc3VjaCBhcyB0aGUgU1NJIHNvdW5kIGRyaXZlcnMgZm9yIHRoZSBNUEM4NjEwLiAgVGhlcmVmb3JlLCBhbnkgRE1BCitjaGFubmVsIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFub3RoZXIgZHJpdmVyIHNob3VsZCBub3QgdXNlCisiZnNsLGVsby1kbWEtY2hhbm5lbCIgb3IgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIi4gIEZvciB0aGUgU1NJIGRyaXZlcnMsIGZvcgorZXhhbXBsZSwgdGhlIGNvbXBhdGlibGUgcHJvcGVydHkgc2hvdWxkIGJlICJmc2wsc3NpLWRtYS1jaGFubmVsIi4gIFNlZSBzc2kudHh0Citmb3IgbW9yZSBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL3NzaS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9zc2kudHh0CmluZGV4IGQxMDA1NTUuLmEyZDk2MzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL3NzaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvc3NpLnR4dApAQCAtMjQsNiArMjQsMTIgQEAKIAkJICAgICJyai1tYXN0ZXIiIC0gci5qLiwgU1NJIGlzIGNsb2NrIG1hc3RlcgogCQkgICAgImFjOTctc2xhdmUiIC0gQUM5NyBtb2RlLCBTU0kgaXMgY2xvY2sgc2xhdmUKIAkJICAgICJhYzk3LW1hc3RlciIgLSBBQzk3IG1vZGUsIFNTSSBpcyBjbG9jayBtYXN0ZXIKKy0gZnNsLHBsYXliYWNrLWRtYTogcGhhbmRsZSB0byBhIG5vZGUgZm9yIHRoZSBETUEgY2hhbm5lbCB0byB1c2UgZm9yCisgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrIG9mIGF1ZGlvLiAgVGhpcyBpcyB0eXBpY2FsbHkgZGljdGF0ZWQgYnkgU09DCisgICAgICAgICAgICAgICAgICAgIGRlc2lnbi4gIFNlZSB0aGUgbm90ZXMgYmVsb3cuCistIGZzbCxjYXB0dXJlLWRtYTogIHBoYW5kbGUgdG8gYSBub2RlIGZvciB0aGUgRE1BIGNoYW5uZWwgdG8gdXNlIGZvcgorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlIChyZWNvcmRpbmcpIG9mIGF1ZGlvLiAgVGhpcyBpcyB0eXBpY2FsbHkgZGljdGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgYnkgU09DIGRlc2lnbi4gIFNlZSB0aGUgbm90ZXMgYmVsb3cuCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGNvZGVjLWhhbmRsZQkgIDogcGhhbmRsZSB0byBhICdjb2RlYycgbm9kZSB0aGF0IGRlZmluZXMgYW4gYXVkaW8KQEAgLTM2LDMgKzQyLDIwIEBACiBDaGlsZCAnY29kZWMnIG5vZGUgb3B0aW9uYWwgcHJvcGVydGllczoKIC0gY2xvY2stZnJlcXVlbmN5ICA6IFRoZSBmcmVxdWVuY3kgb2YgdGhlIGlucHV0IGNsb2NrLCB3aGljaCB0eXBpY2FsbHkKICAgICAgICAgICAgICAgICAgICAgIGNvbWVzIGZyb20gYW4gb24tYm9hcmQgZGVkaWNhdGVkIG9zY2lsbGF0b3IuCisKK05vdGVzIG9uIGZzbCxwbGF5YmFjay1kbWEgYW5kIGZzbCxjYXB0dXJlLWRtYToKKworT24gU09DcyB0aGF0IGhhdmUgYW4gU1NJLCBzcGVjaWZpYyBETUEgY2hhbm5lbHMgYXJlIGhhcmQtd2lyZWQgZm9yIHBsYXliYWNrCithbmQgY2FwdHVyZS4gIE9uIHRoZSBNUEM4NjEwLCBmb3IgZXhhbXBsZSwgU1NJMSBtdXN0IHVzZSBETUEgY2hhbm5lbCAwIGZvcgorcGxheWJhY2sgYW5kIERNQSBjaGFubmVsIDEgZm9yIGNhcHR1cmUuICBTU0kyIG11c3QgdXNlIERNQSBjaGFubmVsIDIgZm9yCitwbGF5YmFjayBhbmQgRE1BIGNoYW5uZWwgMyBmb3IgY2FwdHVyZS4gIFRoZSBkZXZlbG9wZXIgY2FuIGNob29zZSB3aGljaAorRE1BIGNvbnRyb2xsZXIgdG8gdXNlLCBidXQgdGhlIGNoYW5uZWxzIHRoZW1zZWx2ZXMgYXJlIGhhcmQtd2lyZWQuICBUaGUKK3B1cnBvc2Ugb2YgdGhlc2UgdHdvIHByb3BlcnRpZXMgaXMgdG8gcmVwcmVzZW50IHRoaXMgaGFyZHdhcmUgZGVzaWduLgorCitUaGUgZGV2aWNlIHRyZWUgbm9kZXMgZm9yIHRoZSBETUEgY2hhbm5lbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieQorImZzbCxwbGF5YmFjay1kbWEiIGFuZCAiZnNsLGNhcHR1cmUtZG1hIiBtdXN0IGJlIG1hcmtlZCBhcyBjb21wYXRpYmxlIHdpdGgKKyJmc2wsc3NpLWRtYS1jaGFubmVsIi4gIFRoZSBTT0Mtc3BlY2lmaWMgY29tcGF0aWJsZSBzdHJpbmcgKGUuZy4KKyJmc2wsbXBjODYxMC1kbWEtY2hhbm5lbCIpIGNhbiByZW1haW4uICBJZiB0aGVzZSBub2RlcyBhcmUgbGVmdCBhcworImZzbCxlbG8tZG1hLWNoYW5uZWwiIG9yICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCIsIHRoZW4gdGhlIGdlbmVyaWMgRWxvIERNQQorZHJpdmVycyAoZnNsZG1hKSB3aWxsIGF0dGVtcHQgdG8gdXNlIHRoZW0sIGFuZCBpdCB3aWxsIGNvbmZsaWN0IHdpdGggdGhlCitzb3VuZCBkcml2ZXJzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3BwY19odGFiLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9wcGNfaHRhYi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGM3ZGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3BwY19odGFiLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0gICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uIGFib3V0IC9wcm9jL3BwY19odGFiCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHJlbGF0ZWQgY29kZSB3YXMgd3JpdHRlbiBieSBtZSAoQ29ydCBEb3VnYW4pLCBwbGVhc2UKLWVtYWlsIG1lIChjb3J0QGZzbWxhYnMuY29tKSBpZiB5b3UgaGF2ZSBxdWVzdGlvbnMsIGNvbW1lbnRzIG9yIGNvcnJlY3Rpb25zLgotCi1MYXN0IENoYW5nZTogMi4xNi45OAotCi1UaGlzIGVudHJ5IGluIHRoZSBwcm9jIGRpcmVjdG9yeSBpcyByZWFkYWJsZSBieSBhbGwgdXNlcnMgYnV0IG9ubHkKLXdyaXRhYmxlIGJ5IHJvb3QuCi0KLVRoZSBwcGNfaHRhYiBpbnRlcmZhY2UgaXMgYSB1c2VyIGxldmVsIHdheSBvZiBhY2Nlc3NpbmcgdGhlCi1wZXJmb3JtYW5jZSBtb25pdG9yaW5nIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIHByb3ZpZGluZyBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIFBURSBoYXNoIHRhYmxlLgotCi0xLiBSZWFkaW5nCi0KLSAgUmVhZGluZyB0aGlzIGZpbGUgd2lsbCBnaXZlIHlvdSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQKLSAgaGFzaCB0YWJsZSB0aGF0IHNlcnZlcyBhcyBhbiBleHRlbmRlZCB0bGIgZm9yIHBhZ2UgdHJhbnNsYXRpb24gb24gdGhlCi0gIHBvd2VycGMuICBJdCB3aWxsIGFsc28gZ2l2ZSB5b3UgaW5mb3JtYXRpb24gYWJvdXQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQKLSAgc3BlY2lmaWMgdG8gdGhlIGNwdSB0aGF0IHlvdSBhcmUgdXNpbmcuCi0KLSAgRXhwbGFuYXRpb24gb2YgdGhlIDYwNCBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIEZpZWxkczoKLSAgICBNTUNSMCAtIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBNTUNSMCByZWdpc3RlcgotICAgIFBNQzEKLSAgICBQTUMyIC0gdGhlIHZhbHVlIG9mIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBhbmQgYQotICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB3aGF0IGV2ZW50cyB0aGV5IGFyZSBjb3VudGluZwotICAgICAgICAgICB3aGljaCBhcmUgYmFzZWQgb24gTU1DUjAgYml0IHNldHRpbmdzLgotICBFeHBsYW5hdGlvbiBvZiB0aGUgUFRFIEhhc2ggVGFibGUgZmllbGRzOgotCi0gICAgU2l6ZSAtIGhhc2ggdGFibGUgc2l6ZSBpbiBLYi4KLSAgICBCdWNrZXRzIC0gIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSB0YWJsZS4KLSAgICBBZGRyZXNzIC0gdGhlIHZpcnR1YWwga2VybmVsIGFkZHJlc3Mgb2YgdGhlIGhhc2ggdGFibGUgYmFzZS4KLSAgICBFbnRyaWVzIC0gdGhlIG51bWJlciBvZiBwdGVzIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgICBVc2VyL0tlcm5lbCAtIGhvdyBtYW55IHB0ZSdzIGFyZSBpbiB1c2UgYnkgdGhlIGtlcm5lbCBvciB1c2VyIGF0IHRoYXQgdGltZS4KLSAgICBPdmVyZmxvd3MgLSBIb3cgbWFueSBvZiB0aGUgZW50cmllcyBhcmUgaW4gdGhlaXIgc2Vjb25kYXJ5IGhhc2ggbG9jYXRpb24uCi0gICAgUGVyY2VudCBmdWxsIC0gcmF0aW8gb2YgZnJlZSBwdGUgZW50cmllcyB0byBpbiB1c2UgZW50cmllcy4KLSAgICBSZWxvYWRzIC0gQ291bnQgb2YgaG93IG1hbnkgaGFzaCB0YWJsZSBtaXNzZXMgaGF2ZSBvY2N1cnJlZAotICAgICAgICAgICAgICB0aGF0IHdlcmUgZml4ZWQgd2l0aCBhIHJlbG9hZCBmcm9tIHRoZSBsaW51eCB0YWJsZXMuCi0gICAgICAgICAgICAgIFNob3VsZCBhbHdheXMgYmUgMCBvbiA2MDMgYmFzZWQgbWFjaGluZXMuCi0gICAgTm9uLWVycm9yIE1pc3NlcyAtIENvdW50IG9mIGhvdyBtYW55IGhhc2ggdGFibGUgbWlzc2VzIGhhdmUgb2NjdXJyZWQKLSAgICAgICAgICAgICAgdGhhdCB3ZXJlIGNvbXBsZXRlZCB3aXRoIHRoZSBjcmVhdGlvbiBvZiBhIHB0ZSBpbiB0aGUgbGludXgKLSAgICAgICAgICAgICAgdGFibGVzIHdpdGggYSBjYWxsIHRvIGRvX3BhZ2VfZmF1bHQoKS4KLSAgICBFcnJvciBNaXNzZXMgLSBOdW1iZXIgb2YgbWlzc2VzIGR1ZSB0byBlcnJvcnMgc3VjaCBhcyBiYWQgYWRkcmVzcwotICAgICAgICAgICAgICBhbmQgcGVybWlzc2lvbiB2aW9sYXRpb25zLiAgVGhpcyBpbmNsdWRlcyBrZXJuZWwgYWNjZXNzIG9mCi0gICAgICAgICAgICAgIGJhZCB1c2VyIGFkZHJlc3NlcyB0aGF0IGFyZSBmaXhlZCB1cCBieSB0aGUgdHJhcCBoYW5kbGVyLgotCi0gIE5vdGUgdGhhdCBjYWxjdWxhdGlvbiBvZiB0aGUgZGF0YSBkaXNwbGF5ZWQgZnJvbSAvcHJvYy9wcGNfaHRhYiB0YWtlcwotICBhIGxvbmcgdGltZSBhbmQgc3BlbmRzIGEgZ3JlYXQgZGVhbCBvZiB0aW1lIGluIHRoZSBrZXJuZWwuICBJdCB3b3VsZAotICBiZSBxdWl0ZSBoYXJkIG9uIHBlcmZvcm1hbmNlIHRvIHJlYWQgdGhpcyBmaWxlIGNvbnN0YW50bHkuICBJbiB0aW1lCi0gIHRoZXJlIG1heSBiZSBhIGNvdW50ZXIgaW4gdGhlIGtlcm5lbCB0aGF0IGFsbG93cyBzdWNjZXNzaXZlIHJlYWRzIGZyb20KLSAgdGhpcyBmaWxlIG9ubHkgYWZ0ZXIgYSBnaXZlbiBhbW91bnQgb2YgdGltZSBoYXMgcGFzc2VkIHRvIHJlZHVjZSB0aGUKLSAgcG9zc2liaWxpdHkgb2YgYSB1c2VyIHNsb3dpbmcgdGhlIHN5c3RlbSBieSByZWFkaW5nIHRoaXMgZmlsZS4KLQotMi4gV3JpdGluZwotCi0gIFdyaXRpbmcgdG8gdGhlIHBwY19odGFiIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKLSAgdGhlIHBvd2VycGMgUFRFIGhhc2ggdGFibGUgYW5kIHNldHVwIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuCi0KLSAgUmVzaXppbmcgdGhlIFBURSBoYXNoIHRhYmxlIGlzIG5vdCBlbmFibGVkIHJpZ2h0IG5vdyBkdWUgdG8gbWFueQotICBjb21wbGljYXRpb25zIHdpdGggbW92aW5nIHRoZSBoYXNoIHRhYmxlLCByZWhhc2hpbmcgdGhlIGVudHJpZXMKLSAgYW5kIG1hbnkgbWFueSBTTVAgaXNzdWVzIHRoYXQgd291bGQgaGF2ZSB0byBiZSBkZWFsdCB3aXRoLgotCi0gIFdyaXRlIG9wdGlvbnMgdG8gcHBjX2h0YWI6Ci0gIAotICAgLSBUbyBzZXQgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgdG8gNjRLYjoKLQotICAgICAgZWNobyAnc2l6ZSA2NCcgPiAvcHJvYy9wcGNfaHRhYgotCi0gICAgIFRoZSBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NCBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KLSAgICAgNjQuCi0KLSAgIC0gVG8gdHVybiBvZmYgcGVyZm9ybWFuY2UgbW9uaXRvcmluZzoKLQotICAgICAgZWNobyAnb2ZmJyA+IC9wcm9jL3BwY19odGFiCi0KLSAgIC0gVG8gcmVzZXQgdGhlIGNvdW50ZXJzIHdpdGhvdXQgY2hhbmdpbmcgd2hhdCB0aGV5J3JlIGNvdW50aW5nOgotCi0gICAgICBlY2hvICdyZXNldCcgPiAvcHJvYy9wcGNfaHRhYgotCi0gICAgIE5vdGUgdGhhdCBjb3VudGluZyB3aWxsIGNvbnRpbnVlIGFmdGVyIHRoZSByZXNldCBpZiBpdCBpcyBlbmFibGVkLgotCi0gICAtIFRvIGNvdW50IG9ubHkgZXZlbnRzIGluIHVzZXIgbW9kZSBvciBvbmx5IGluIGtlcm5lbCBtb2RlOgotCi0gICAgICBlY2hvICd1c2VyJyA+IC9wcm9jL3BwY19odGFiCi0gICAgICAgLi4ub3IuLi4KLSAgICAgIGVjaG8gJ2tlcm5lbCcgPiAvcHJvYy9wcGNfaHRhYgotCi0gICAgIE5vdGUgdGhhdCB0aGVzZSB0d28gb3B0aW9ucyBhcmUgZXhjbHVzaXZlIG9mIG9uZSBhbm90aGVyIGFuZCB0aGUKLSAgICAgbGFjayBvZiBlaXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyBjb3VudHMgdXNlciBhbmQga2VybmVsLgotICAgICBVc2luZyAncmVzZXQnIGFuZCAnb2ZmJyByZXNldCB0aGVzZSBmbGFncy4KLQotICAgLSBUaGUgNjA0IGhhcyAyIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHdoaWNoIGNhbiBlYWNoIGNvdW50IGV2ZW50cyBmcm9tCi0gICAgIGEgc3BlY2lmaWMgc2V0IG9mIGV2ZW50cy4gIFRoZXNlIHNldHMgYXJlIGRpc2pvaW50IHNvIGl0IGlzIG5vdAotICAgICBwb3NzaWJsZSB0byBjb3VudCBfYW55XyBjb21iaW5hdGlvbiBvZiAyIGV2ZW50cy4gIE9uZSBldmVudCBjYW4KLSAgICAgYmUgY291bnRlZCBieSBQTUMxIGFuZCBvbmUgYnkgUE1DMi4KLQotICAgICBUbyBzdGFydCBjb3VudGluZyBhIHBhcnRpY3VsYXIgZXZlbnQgdXNlOgotCi0gICAgICBlY2hvICdldmVudCcgPiAvcHJvYy9wcGNfaHRhYgotCi0gICAgIGFuZCBjaG9vc2UgZnJvbSB0aGVzZSBldmVudHM6Ci0KLSAgICAgUE1DMQotICAgICAtLS0tCi0gICAgICAnaWMgbWlzcycgLSBpbnN0cnVjdGlvbiBjYWNoZSBtaXNzZXMKLSAgICAgICdkdGxiJyAtIGRhdGEgdGxiIG1pc3NlcyAobm90IGhhc2ggdGFibGUgbWlzc2VzKQotCi0gICAgIFBNQzIKLSAgICAgLS0tLQotICAgICAgJ2RjIG1pc3MnIC0gZGF0YSBjYWNoZSBtaXNzZXMKLSAgICAgICdpdGxiJyAtIGluc3RydWN0aW9uIHRsYiBtaXNzZXMgKG5vdCBoYXNoIHRhYmxlIG1pc3NlcykKLSAgICAgICdsb2FkIG1pc3MgdGltZScgLSBjeWNsZXMgdG8gY29tcGxldGUgYSBsb2FkIG1pc3MKLQotMy4gQnVncwotCi0gIFRoZSBQTUMxIGFuZCBQTUMyIGNvdW50ZXJzIGNhbiBvdmVyZmxvdyBhbmQgZ2l2ZSBubyBpbmRpY2F0aW9uIG9mIHRoYXQKLSAgaW4gL3Byb2MvcHBjX2h0YWIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvc21wLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9zbXAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU4MWI4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9zbXAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiBhYm91dCBMaW51eC9QUEMgU01QIG1vZGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcmVsYXRlZCBjb2RlIHdhcyB3cml0dGVuIGJ5IG1lCi0oQ29ydCBEb3VnYW4sIGNvcnRAZnNtbGFicy5jb20pIHBsZWFzZSBlbWFpbCBtZSBpZiB5b3UgaGF2ZSBxdWVzdGlvbnMsCi1jb21tZW50cyBvciBjb3JyZWN0aW9ucy4KLQotTGFzdCBDaGFuZ2U6IDMuMzEuOTkKLQotSWYgeW91IHdhbnQgdG8gaGVscCBieSB3cml0aW5nIGNvZGUgb3IgdGVzdGluZyBkaWZmZXJlbnQgaGFyZHdhcmUgcGxlYXNlCi1lbWFpbCBtZSEKLQotMS4gU3RhdGUgb2YgU3VwcG9ydGVkIEhhcmR3YXJlCi0KLSAgUG93ZXJTdXJnZSBBcmNoaXRlY3R1cmUgLSB0ZXN0ZWQgb24gVU1BWCBzOTAwLCBBcHBsZSA5NjAwCi0gICAgVGhlIHNlY29uZCBwcm9jZXNzb3Igb24gdGhpcyBtYWNoaW5lIGJvb3RzIHVwIGp1c3QgZmluZSBhbmQKLSAgICBlbnRlcnMgaXRzIGlkbGUgbG9vcC4gIEhvcGVmdWxseSBhIGNvbXBsZXRlbHkgd29ya2luZyBTTVAga2VybmVsCi0gICAgb24gdGhpcyBtYWNoaW5lIHdpbGwgYmUgZG9uZSBzaG9ydGx5LgotCi0gICAgVGhlIGNvZGUgbWFrZXMgdGhlIGFzc3VtcHRpb24gb2Ygb25seSB0d28gcHJvY2Vzc29ycy4gIFRoZSBjaGFuZ2VzCi0gICAgbmVjZXNzYXJ5IHRvIHdvcmsgd2l0aCBhbnkgbnVtYmVyIHdvdWxkIG5vdCBiZSBvdmVybHkgZGlmZmljdWx0IGJ1dAotICAgIEkgZG9uJ3QgaGF2ZSBhbnkgbWFjaGluZXMgd2l0aCA+MiBwcm9jZXNzb3JzIHNvIGl0J3Mgbm90IGhpZ2ggb24gbXkKLSAgICBsaXN0IG9mIHByaW9yaXRpZXMuICBJZiBhbnlvbmUgZWxzZSB3b3VsZCBsaWtlIGRvIHRvIHRoZSB3b3JrIGVtYWlsCi0gICAgbWUgYW5kIEkgY2FuIHBvaW50IG91dCB0aGUgcGxhY2VzIHRoYXQgbmVlZCBjaGFuZ2VkLiAgSWYgeW91IGhhdmUgPjIKLSAgICBwcm9jZXNzb3JzIGFuZCBkb24ndCB3YW50IHRvIGFkZCBzdXBwb3J0IHlvdXJzZWxmIGxldCBtZSBrbm93IGFuZCBJCi0gICAgY2FuIHRha2UgYSBsb29rIGludG8gaXQuCi0KLSAgQmVCb3gKLSAgICBCZUJveCBzdXBwb3J0IGhhc24ndCBiZWVuIGFkZGVkIHRvIHRoZSAyLjEuWCBrZXJuZWxzIGZyb20gMi4wLlgKLSAgICBidXQgd29yayBpcyBiZWluZyBkb25lIGFuZCBTTVAgc3VwcG9ydCBmb3IgQmVCb3ggaXMgaW4gdGhlIHdvcmtzLgotCi0gIENIUlAKLSAgICBDSFJQIFNNUCB3b3JrcyBhbmQgaXMgZmFpcmx5IHNvbGlkLiAgSXQncyBiZWVuIHRlc3RlZCBvbiB0aGUgSUJNIEY1MAotICAgIHdpdGggNCBwcm9jZXNzb3JzIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZmtpbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9yZmtpbGwudHh0CmluZGV4IDZmY2IzMDYuLmI2NWYwNzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcmZraWxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Jma2lsbC50eHQKQEAgLTM0MSw2ICszNDEsOCBAQAogMy4xIEd1aWRlbGluZXMgZm9yIHdpcmVsZXNzIGRldmljZSBkcml2ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorKGluIHRoaXMgdGV4dCwgcmZraWxsLT5mb28gbWVhbnMgdGhlIGZvbyBmaWVsZCBvZiBzdHJ1Y3QgcmZraWxsKS4KKwogMS4gRWFjaCBpbmRlcGVuZGVudCB0cmFuc21pdHRlciBpbiBhIHdpcmVsZXNzIGRldmljZSAodXN1YWxseSB0aGVyZSBpcyBvbmx5IG9uZQogdHJhbnNtaXR0ZXIgcGVyIGRldmljZSkgc2hvdWxkIGhhdmUgYSBTSU5HTEUgcmZraWxsIGNsYXNzIGF0dGFjaGVkIHRvIGl0LgogCkBAIC0zNjMsMTAgKzM2NSwzMiBAQAogd2hlbiBwb3NzaWJsZSkgdGhlIG92ZXJhbGwgdHJhbnNtaXR0ZXIgcmZraWxsIHN0YXRlLCBub3Qgb2YgYSBwYXJ0aWN1bGFyIHJma2lsbAogbGluZS4KIAotNS4gRHVyaW5nIHN1c3BlbmQsIHRoZSByZmtpbGwgY2xhc3Mgd2lsbCBhdHRlbXB0IHRvIHNvZnQtYmxvY2sgdGhlIHJhZGlvCi10aHJvdWdoIGEgY2FsbCB0byByZmtpbGwtPnRvZ2dsZV9yYWRpbywgYW5kIHdpbGwgdHJ5IHRvIHJlc3RvcmUgaXRzIHByZXZpb3VzCi1zdGF0ZSBkdXJpbmcgcmVzdW1lLiAgQWZ0ZXIgYSByZmtpbGwgY2xhc3MgaXMgc3VzcGVuZGVkLCBpdCB3aWxsICpub3QqIGNhbGwKLXJma2lsbC0+dG9nZ2xlX3JhZGlvIHVudGlsIGl0IGlzIHJlc3VtZWQuCis1LiBUaGUgd2lyZWxlc3MgZGV2aWNlIGRyaXZlciBNVVNUIE5PVCBsZWF2ZSB0aGUgdHJhbnNtaXR0ZXIgZW5hYmxlZCBkdXJpbmcKK3N1c3BlbmQgYW5kIGhpYmVybmF0aW9uIHVubGVzczoKKworCTUuMS4gVGhlIHRyYW5zbWl0dGVyIGhhcyB0byBiZSBlbmFibGVkIGZvciBzb21lIHNvcnQgb2YgZnVuY3Rpb25hbGl0eQorCWxpa2Ugd2FrZS1vbi13aXJlbGVzcy1wYWNrZXQgb3IgYXV0b25vbW91cyBwYWNrZWQgZm9yd2FyZGluZyBpbiBhIG1lc2gKKwluZXR3b3JrLCBhbmQgdGhhdCBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQgZm9yIHRoaXMgc3VzcGVuZC9oaWJlcm5hdGlvbgorCWN5Y2xlLgorCitBTkQKKworCTUuMi4gVGhlIGRldmljZSB3YXMgbm90IG9uIGEgdXNlci1yZXF1ZXN0ZWQgQkxPQ0tFRCBzdGF0ZSBiZWZvcmUKKwl0aGUgc3VzcGVuZCAoaS5lLiB0aGUgZHJpdmVyIG11c3QgTk9UIHVuYmxvY2sgYSBkZXZpY2UsIG5vdCBldmVuCisJdG8gc3VwcG9ydCB3YWtlLW9uLXdpcmVsZXNzLXBhY2tldCBvciByZW1haW4gaW4gdGhlIG1lc2gpLgorCitJbiBvdGhlciB3b3JkcywgdGhlcmUgaXMgYWJzb2x1dGVseSBubyBhbGxvd2VkIHNjZW5hcmlvIHdoZXJlIGEgZHJpdmVyIGNhbgorYXV0b21hdGljYWxseSB0YWtlIGFjdGlvbiB0byB1bmJsb2NrIGEgcmZraWxsIGNvbnRyb2xsZXIgKG9idmlvdXNseSwgdGhpcyBkZWFscword2l0aCBzY2VuYXJpb3Mgd2hlcmUgc29mdC1ibG9ja2luZyBvciBib3RoIHNvZnQgYW5kIGhhcmQgYmxvY2tpbmcgaXMgaGFwcGVuaW5nLgorU2NlbmFyaW9zIHdoZXJlIGhhcmR3YXJlIHJma2lsbCBsaW5lcyBhcmUgdGhlIG9ubHkgb25lcyBibG9ja2luZyB0aGUKK3RyYW5zbWl0dGVyIGFyZSBvdXRzaWRlIG9mIHRoaXMgcnVsZSwgc2luY2UgdGhlIHdpcmVsZXNzIGRldmljZSBkcml2ZXIgZG9lcyBub3QKK2NvbnRyb2wgaXRzIGlucHV0IGhhcmR3YXJlIHJma2lsbCBsaW5lcyBpbiB0aGUgZmlyc3QgcGxhY2UpLgorCis2LiBEdXJpbmcgcmVzdW1lLCByZmtpbGwgd2lsbCB0cnkgdG8gcmVzdG9yZSBpdHMgcHJldmlvdXMgc3RhdGUuCisKKzcuIEFmdGVyIGEgcmZraWxsIGNsYXNzIGlzIHN1c3BlbmRlZCwgaXQgd2lsbCAqbm90KiBjYWxsIHJma2lsbC0+dG9nZ2xlX3JhZGlvCit1bnRpbCBpdCBpcyByZXN1bWVkLgorCiAKIEV4YW1wbGUgb2YgYSBXTEFOIHdpcmVsZXNzIGRyaXZlciBjb25uZWN0ZWQgdG8gdGhlIHJma2lsbCBzdWJzeXN0ZW06CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPIGIvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPCmluZGV4IGJmMGJhYTEuLjMzOTIwN2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9Db21tb25JTworKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8KQEAgLTcwLDEzICs3MCwxOSBAQAogCiAgIE5vdGU6IFdoaWxlIGFscmVhZHkga25vd24gZGV2aWNlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0byBiZQogICAgICAgICBpZ25vcmVkLCB0aGVyZSB3aWxsIGJlIG5vIGVmZmVjdCBvbiB0aGVuLiBIb3dldmVyLCBpZiBzdWNoIGEgZGV2aWNlCi0JZGlzYXBwZWFycyBhbmQgdGhlbiByZWFwcGVhcnMsIGl0IHdpbGwgdGhlbiBiZSBpZ25vcmVkLgorCWRpc2FwcGVhcnMgYW5kIHRoZW4gcmVhcHBlYXJzLCBpdCB3aWxsIHRoZW4gYmUgaWdub3JlZC4gVG8gbWFrZQorCWtub3duIGRldmljZXMgZ28gYXdheSwgeW91IG5lZWQgdGhlICJwdXJnZSIgY29tbWFuZCAoc2VlIGJlbG93KS4KIAogICBGb3IgZXhhbXBsZSwKIAkiZWNobyBhZGQgMC4wLmEwMDAtMC4wLmFjY2MsIDAuMC5hZjAwLTAuMC5hZmZmID4gL3Byb2MvY2lvX2lnbm9yZSIKICAgd2lsbCBhZGQgMC4wLmEwMDAtMC4wLmFjY2MgYW5kIDAuMC5hZjAwLTAuMC5hZmZmIHRvIHRoZSBsaXN0IG9mIGlnbm9yZWQKICAgZGV2aWNlcy4KIAorICBZb3UgY2FuIHJlbW92ZSBhbHJlYWR5IGtub3duIGJ1dCBub3cgaWdub3JlZCBkZXZpY2VzIHZpYQorCSJlY2hvIHB1cmdlID4gL3Byb2MvY2lvX2lnbm9yZSIKKyAgQWxsIGRldmljZXMgaWdub3JlZCBidXQgc3RpbGwgcmVnaXN0ZXJlZCBhbmQgbm90IG9ubGluZSAoPSBub3QgaW4gdXNlKQorICB3aWxsIGJlIGRlcmVnaXN0ZXJlZCBhbmQgdGh1cyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKwogICBUaGUgZGV2aWNlcyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBieSBidXMgaWQgKDAueC5hYmNkKSBvciwgZm9yIDIuNCBiYWNrd2FyZAogICBjb21wYXRpYmlsaXR5LCBieSB0aGUgZGV2aWNlIG51bWJlciBpbiBoZXhhZGVjaW1hbCAoMHhhYmNkIG9yIGFiY2QpLiBEZXZpY2UKICAgbnVtYmVycyBnaXZlbiBhcyAweGFiY2Qgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyAwLjAuYWJjZC4KQEAgLTk4LDggKzEwNCw3IEBACiAgICAgaGFuZGxpbmcpLgogCiAgIC0gL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi9jaW9fbXNnL3NwcmludGYKLSAgICBWYXJpb3VzIGRlYnVnIG1lc3NhZ2VzIGZyb20gdGhlIGNvbW1vbiBJL08tbGF5ZXIsIGluY2x1ZGluZyBtZXNzYWdlcwotICAgIHByaW50ZWQgd2hlbiBjaW9fbXNnPXllcy4KKyAgICBWYXJpb3VzIGRlYnVnIG1lc3NhZ2VzIGZyb20gdGhlIGNvbW1vbiBJL08tbGF5ZXIuCiAKICAgLSAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL2Npb190cmFjZS9oZXhfYXNjaWkKICAgICBMb2dzIHRoZSBjYWxsaW5nIG9mIGZ1bmN0aW9ucyBpbiB0aGUgY29tbW9uIEkvTy1sYXllciBhbmQsIGlmIGFwcGxpY2FibGUsIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAppbmRleCA4OGJjYjg3Li45ZDhlYjU1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dApAQCAtMSwxNTEgKzEsMjQyIEBACi0KLVRoaXMgaXMgdGhlIENGUyBzY2hlZHVsZXIuCi0KLTgwJSBvZiBDRlMncyBkZXNpZ24gY2FuIGJlIHN1bW1lZCB1cCBpbiBhIHNpbmdsZSBzZW50ZW5jZTogQ0ZTIGJhc2ljYWxseQotbW9kZWxzIGFuICJpZGVhbCwgcHJlY2lzZSBtdWx0aS10YXNraW5nIENQVSIgb24gcmVhbCBoYXJkd2FyZS4KLQotIklkZWFsIG11bHRpLXRhc2tpbmcgQ1BVIiBpcyBhIChub24tZXhpc3RlbnQgIDotKSkgIENQVSB0aGF0IGhhcyAxMDAlCi1waHlzaWNhbCBwb3dlciBhbmQgd2hpY2ggY2FuIHJ1biBlYWNoIHRhc2sgYXQgcHJlY2lzZSBlcXVhbCBzcGVlZCwgaW4KLXBhcmFsbGVsLCBlYWNoIGF0IDEvbnJfcnVubmluZyBzcGVlZC4gRm9yIGV4YW1wbGU6IGlmIHRoZXJlIGFyZSAyIHRhc2tzCi1ydW5uaW5nIHRoZW4gaXQgcnVucyBlYWNoIGF0IDUwJSBwaHlzaWNhbCBwb3dlciAtIHRvdGFsbHkgaW4gcGFyYWxsZWwuCi0KLU9uIHJlYWwgaGFyZHdhcmUsIHdlIGNhbiBydW4gb25seSBhIHNpbmdsZSB0YXNrIGF0IG9uY2UsIHNvIHdoaWxlIHRoYXQKLW9uZSB0YXNrIHJ1bnMsIHRoZSBvdGhlciB0YXNrcyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGUgQ1BVIGFyZSBhdCBhCi1kaXNhZHZhbnRhZ2UgLSB0aGUgY3VycmVudCB0YXNrIGdldHMgYW4gdW5mYWlyIGFtb3VudCBvZiBDUFUgdGltZS4gSW4KLUNGUyB0aGlzIGZhaXJuZXNzIGltYmFsYW5jZSBpcyBleHByZXNzZWQgYW5kIHRyYWNrZWQgdmlhIHRoZSBwZXItdGFzawotcC0+d2FpdF9ydW50aW1lIChuYW5vc2VjLXVuaXQpIHZhbHVlLiAid2FpdF9ydW50aW1lIiBpcyB0aGUgYW1vdW50IG9mCi10aW1lIHRoZSB0YXNrIHNob3VsZCBub3cgcnVuIG9uIHRoZSBDUFUgZm9yIGl0IHRvIGJlY29tZSBjb21wbGV0ZWx5IGZhaXIKLWFuZCBiYWxhbmNlZC4KLQotKCBzbWFsbCBkZXRhaWw6IG9uICdpZGVhbCcgaGFyZHdhcmUsIHRoZSBwLT53YWl0X3J1bnRpbWUgdmFsdWUgd291bGQKLSAgYWx3YXlzIGJlIHplcm8gLSBubyB0YXNrIHdvdWxkIGV2ZXIgZ2V0ICdvdXQgb2YgYmFsYW5jZScgZnJvbSB0aGUKLSAgJ2lkZWFsJyBzaGFyZSBvZiBDUFUgdGltZS4gKQotCi1DRlMncyB0YXNrIHBpY2tpbmcgbG9naWMgaXMgYmFzZWQgb24gdGhpcyBwLT53YWl0X3J1bnRpbWUgdmFsdWUgYW5kIGl0Ci1pcyB0aHVzIHZlcnkgc2ltcGxlOiBpdCBhbHdheXMgdHJpZXMgdG8gcnVuIHRoZSB0YXNrIHdpdGggdGhlIGxhcmdlc3QKLXAtPndhaXRfcnVudGltZSB2YWx1ZS4gSW4gb3RoZXIgd29yZHMsIENGUyB0cmllcyB0byBydW4gdGhlIHRhc2sgd2l0aAotdGhlICdncmF2ZXN0IG5lZWQnIGZvciBtb3JlIENQVSB0aW1lLiBTbyBDRlMgYWx3YXlzIHRyaWVzIHRvIHNwbGl0IHVwCi1DUFUgdGltZSBiZXR3ZWVuIHJ1bm5hYmxlIHRhc2tzIGFzIGNsb3NlIHRvICdpZGVhbCBtdWx0aXRhc2tpbmcKLWhhcmR3YXJlJyBhcyBwb3NzaWJsZS4KLQotTW9zdCBvZiB0aGUgcmVzdCBvZiBDRlMncyBkZXNpZ24ganVzdCBmYWxscyBvdXQgb2YgdGhpcyByZWFsbHkgc2ltcGxlCi1jb25jZXB0LCB3aXRoIGEgZmV3IGFkZC1vbiBlbWJlbGxpc2htZW50cyBsaWtlIG5pY2UgbGV2ZWxzLAotbXVsdGlwcm9jZXNzaW5nIGFuZCB2YXJpb3VzIGFsZ29yaXRobSB2YXJpYW50cyB0byByZWNvZ25pemUgc2xlZXBlcnMuCi0KLUluIHByYWN0aWNlIGl0IHdvcmtzIGxpa2UgdGhpczogdGhlIHN5c3RlbSBydW5zIGEgdGFzayBhIGJpdCwgYW5kIHdoZW4KLXRoZSB0YXNrIHNjaGVkdWxlcyAob3IgYSBzY2hlZHVsZXIgdGljayBoYXBwZW5zKSB0aGUgdGFzaydzIENQVSB1c2FnZSBpcwotJ2FjY291bnRlZCBmb3InOiB0aGUgKHNtYWxsKSB0aW1lIGl0IGp1c3Qgc3BlbnQgdXNpbmcgdGhlIHBoeXNpY2FsIENQVQotaXMgZGVkdWN0ZWQgZnJvbSBwLT53YWl0X3J1bnRpbWUuIFttaW51cyB0aGUgJ2ZhaXIgc2hhcmUnIGl0IHdvdWxkIGhhdmUKLWdvdHRlbiBhbnl3YXldLiBPbmNlIHAtPndhaXRfcnVudGltZSBnZXRzIGxvdyBlbm91Z2ggc28gdGhhdCBhbm90aGVyCi10YXNrIGJlY29tZXMgdGhlICdsZWZ0bW9zdCB0YXNrJyBvZiB0aGUgdGltZS1vcmRlcmVkIHJidHJlZSBpdCBtYWludGFpbnMKLShwbHVzIGEgc21hbGwgYW1vdW50IG9mICdncmFudWxhcml0eScgZGlzdGFuY2UgcmVsYXRpdmUgdG8gdGhlIGxlZnRtb3N0Ci10YXNrIHNvIHRoYXQgd2UgZG8gbm90IG92ZXItc2NoZWR1bGUgdGFza3MgYW5kIHRyYXNoIHRoZSBjYWNoZSkgdGhlbiB0aGUKLW5ldyBsZWZ0bW9zdCB0YXNrIGlzIHBpY2tlZCBhbmQgdGhlIGN1cnJlbnQgdGFzayBpcyBwcmVlbXB0ZWQuCi0KLVRoZSBycS0+ZmFpcl9jbG9jayB2YWx1ZSB0cmFja3MgdGhlICdDUFUgdGltZSBhIHJ1bm5hYmxlIHRhc2sgd291bGQgaGF2ZQotZmFpcmx5IGdvdHRlbiwgaGFkIGl0IGJlZW4gcnVubmFibGUgZHVyaW5nIHRoYXQgdGltZScuIFNvIGJ5IHVzaW5nCi1ycS0+ZmFpcl9jbG9jayB2YWx1ZXMgd2UgY2FuIGFjY3VyYXRlbHkgdGltZXN0YW1wIGFuZCBtZWFzdXJlIHRoZQotJ2V4cGVjdGVkIENQVSB0aW1lJyBhIHRhc2sgc2hvdWxkIGhhdmUgZ290dGVuLiBBbGwgcnVubmFibGUgdGFza3MgYXJlCi1zb3J0ZWQgaW4gdGhlIHJidHJlZSBieSB0aGUgInJxLT5mYWlyX2Nsb2NrIC0gcC0+d2FpdF9ydW50aW1lIiBrZXksIGFuZAotQ0ZTIHBpY2tzIHRoZSAnbGVmdG1vc3QnIHRhc2sgYW5kIHN0aWNrcyB0byBpdC4gQXMgdGhlIHN5c3RlbSBwcm9ncmVzc2VzCi1mb3J3YXJkcywgbmV3bHkgd29rZW4gdGFza3MgYXJlIHB1dCBpbnRvIHRoZSB0cmVlIG1vcmUgYW5kIG1vcmUgdG8gdGhlCi1yaWdodCAtIHNsb3dseSBidXQgc3VyZWx5IGdpdmluZyBhIGNoYW5jZSBmb3IgZXZlcnkgdGFzayB0byBiZWNvbWUgdGhlCi0nbGVmdG1vc3QgdGFzaycgYW5kIHRodXMgZ2V0IG9uIHRoZSBDUFUgd2l0aGluIGEgZGV0ZXJtaW5pc3RpYyBhbW91bnQgb2YKLXRpbWUuCi0KLVNvbWUgaW1wbGVtZW50YXRpb24gZGV0YWlsczoKLQotIC0gdGhlIGludHJvZHVjdGlvbiBvZiBTY2hlZHVsaW5nIENsYXNzZXM6IGFuIGV4dGVuc2libGUgaGllcmFyY2h5IG9mCi0gICBzY2hlZHVsZXIgbW9kdWxlcy4gVGhlc2UgbW9kdWxlcyBlbmNhcHN1bGF0ZSBzY2hlZHVsaW5nIHBvbGljeQotICAgZGV0YWlscyBhbmQgYXJlIGhhbmRsZWQgYnkgdGhlIHNjaGVkdWxlciBjb3JlIHdpdGhvdXQgdGhlIGNvcmUKLSAgIGNvZGUgYXNzdW1pbmcgYWJvdXQgdGhlbSB0b28gbXVjaC4KLQotIC0gc2NoZWRfZmFpci5jIGltcGxlbWVudHMgdGhlICdDRlMgZGVza3RvcCBzY2hlZHVsZXInOiBpdCBpcyBhCi0gICByZXBsYWNlbWVudCBmb3IgdGhlIHZhbmlsbGEgc2NoZWR1bGVyJ3MgU0NIRURfT1RIRVIgaW50ZXJhY3Rpdml0eQotICAgY29kZS4KLQotICAgSSdkIGxpa2UgdG8gZ2l2ZSBjcmVkaXQgdG8gQ29uIEtvbGl2YXMgZm9yIHRoZSBnZW5lcmFsIGFwcHJvYWNoIGhlcmU6Ci0gICBoZSBoYXMgcHJvdmVuIHZpYSBSU0RML1NEIHRoYXQgJ2ZhaXIgc2NoZWR1bGluZycgaXMgcG9zc2libGUgYW5kIHRoYXQKLSAgIGl0IHJlc3VsdHMgaW4gYmV0dGVyIGRlc2t0b3Agc2NoZWR1bGluZy4gS3Vkb3MgQ29uIQotCi0gICBUaGUgQ0ZTIHBhdGNoIHVzZXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaCBhbmQgaW1wbGVtZW50YXRpb24KLSAgIGZyb20gUlNETC9TRC4gTXkgZ29hbCB3YXMgdG8gbWFrZSBDRlMncyBpbnRlcmFjdGl2aXR5IHF1YWxpdHkgZXhjZWVkCi0gICB0aGF0IG9mIFJTREwvU0QsIHdoaWNoIGlzIGEgaGlnaCBzdGFuZGFyZCB0byBtZWV0IDotKSBUZXN0aW5nCi0gICBmZWVkYmFjayBpcyB3ZWxjb21lIHRvIGRlY2lkZSB0aGlzIG9uZSB3YXkgb3IgYW5vdGhlci4gWyBhbmQsIGluIGFueQotICAgY2FzZSwgYWxsIG9mIFNEJ3MgbG9naWMgY291bGQgYmUgYWRkZWQgdmlhIGEga2VybmVsL3NjaGVkX3NkLmMgbW9kdWxlCi0gICBhcyB3ZWxsLCBpZiBDb24gaXMgaW50ZXJlc3RlZCBpbiBzdWNoIGFuIGFwcHJvYWNoLiBdCi0KLSAgIENGUydzIGRlc2lnbiBpcyBxdWl0ZSByYWRpY2FsOiBpdCBkb2VzIG5vdCB1c2UgcnVucXVldWVzLCBpdCB1c2VzIGEKLSAgIHRpbWUtb3JkZXJlZCByYnRyZWUgdG8gYnVpbGQgYSAndGltZWxpbmUnIG9mIGZ1dHVyZSB0YXNrIGV4ZWN1dGlvbiwKLSAgIGFuZCB0aHVzIGhhcyBubyAnYXJyYXkgc3dpdGNoJyBhcnRpZmFjdHMgKGJ5IHdoaWNoIGJvdGggdGhlIHZhbmlsbGEKLSAgIHNjaGVkdWxlciBhbmQgUlNETC9TRCBhcmUgYWZmZWN0ZWQpLgotCi0gICBDRlMgdXNlcyBuYW5vc2Vjb25kIGdyYW51bGFyaXR5IGFjY291bnRpbmcgYW5kIGRvZXMgbm90IHJlbHkgb24gYW55Ci0gICBqaWZmaWVzIG9yIG90aGVyIEhaIGRldGFpbC4gVGh1cyB0aGUgQ0ZTIHNjaGVkdWxlciBoYXMgbm8gbm90aW9uIG9mCi0gICAndGltZXNsaWNlcycgYW5kIGhhcyBubyBoZXVyaXN0aWNzIHdoYXRzb2V2ZXIuIFRoZXJlIGlzIG9ubHkgb25lCi0gICBjZW50cmFsIHR1bmFibGUgKHlvdSBoYXZlIHRvIHN3aXRjaCBvbiBDT05GSUdfU0NIRURfREVCVUcpOgotCi0gICAgICAgICAvcHJvYy9zeXMva2VybmVsL3NjaGVkX2dyYW51bGFyaXR5X25zCi0KLSAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHR1bmUgdGhlIHNjaGVkdWxlciBmcm9tICdkZXNrdG9wJyAobG93Ci0gICBsYXRlbmNpZXMpIHRvICdzZXJ2ZXInIChnb29kIGJhdGNoaW5nKSB3b3JrbG9hZHMuIEl0IGRlZmF1bHRzIHRvIGEKLSAgIHNldHRpbmcgc3VpdGFibGUgZm9yIGRlc2t0b3Agd29ya2xvYWRzLiBTQ0hFRF9CQVRDSCBpcyBoYW5kbGVkIGJ5IHRoZQotICAgQ0ZTIHNjaGVkdWxlciBtb2R1bGUgdG9vLgotCi0gICBEdWUgdG8gaXRzIGRlc2lnbiwgdGhlIENGUyBzY2hlZHVsZXIgaXMgbm90IHByb25lIHRvIGFueSBvZiB0aGUKLSAgICdhdHRhY2tzJyB0aGF0IGV4aXN0IHRvZGF5IGFnYWluc3QgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIHN0b2NrCi0gICBzY2hlZHVsZXI6IGZpZnR5cC5jLCB0aHVkLmMsIGNoZXcuYywgcmluZy10ZXN0LmMsIG1hc3NpdmVfaW50ci5jIGFsbAotICAgd29yayBmaW5lIGFuZCBkbyBub3QgaW1wYWN0IGludGVyYWN0aXZpdHkgYW5kIHByb2R1Y2UgdGhlIGV4cGVjdGVkCi0gICBiZWhhdmlvci4KLQotICAgdGhlIENGUyBzY2hlZHVsZXIgaGFzIGEgbXVjaCBzdHJvbmdlciBoYW5kbGluZyBvZiBuaWNlIGxldmVscyBhbmQKLSAgIFNDSEVEX0JBVENIOiBib3RoIHR5cGVzIG9mIHdvcmtsb2FkcyBzaG91bGQgYmUgaXNvbGF0ZWQgbXVjaCBtb3JlCi0gICBhZ3Jlc3NpdmVseSB0aGFuIHVuZGVyIHRoZSB2YW5pbGxhIHNjaGVkdWxlci4KLQotICAgKCBhbm90aGVyIGRldGFpbDogZHVlIHRvIG5hbm9zZWMgYWNjb3VudGluZyBhbmQgdGltZWxpbmUgc29ydGluZywKLSAgICAgc2NoZWRfeWllbGQoKSBzdXBwb3J0IGlzIHZlcnkgc2ltcGxlIHVuZGVyIENGUywgYW5kIGluIGZhY3QgdW5kZXIKLSAgICAgQ0ZTIHNjaGVkX3lpZWxkKCkgYmVoYXZlcyBtdWNoIGJldHRlciB0aGFuIHVuZGVyIGFueSBvdGhlcgotICAgICBzY2hlZHVsZXIgaSBoYXZlIHRlc3RlZCBzbyBmYXIuICkKLQotIC0gc2NoZWRfcnQuYyBpbXBsZW1lbnRzIFNDSEVEX0ZJRk8gYW5kIFNDSEVEX1JSIHNlbWFudGljcywgaW4gYSBzaW1wbGVyCi0gICB3YXkgdGhhbiB0aGUgdmFuaWxsYSBzY2hlZHVsZXIgZG9lcy4gSXQgdXNlcyAxMDAgcnVucXVldWVzIChmb3IgYWxsCi0gICAxMDAgUlQgcHJpb3JpdHkgbGV2ZWxzLCBpbnN0ZWFkIG9mIDE0MCBpbiB0aGUgdmFuaWxsYSBzY2hlZHVsZXIpCi0gICBhbmQgaXQgbmVlZHMgbm8gZXhwaXJlZCBhcnJheS4KLQotIC0gcmV3b3JrZWQvc2FuaXRpemVkIFNNUCBsb2FkLWJhbGFuY2luZzogdGhlIHJ1bnF1ZXVlLXdhbGtpbmcKLSAgIGFzc3VtcHRpb25zIGFyZSBnb25lIGZyb20gdGhlIGxvYWQtYmFsYW5jaW5nIGNvZGUgbm93LCBhbmQKLSAgIGl0ZXJhdG9ycyBvZiB0aGUgc2NoZWR1bGluZyBtb2R1bGVzIGFyZSB1c2VkLiBUaGUgYmFsYW5jaW5nIGNvZGUgZ290Ci0gICBxdWl0ZSBhIGJpdCBzaW1wbGVyIGFzIGEgcmVzdWx0LgorICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICBDRlMgU2NoZWR1bGVyCisgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PQogCiAKLUdyb3VwIHNjaGVkdWxlciBleHRlbnNpb24gdG8gQ0ZTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMS4gIE9WRVJWSUVXCiAKLU5vcm1hbGx5IHRoZSBzY2hlZHVsZXIgb3BlcmF0ZXMgb24gaW5kaXZpZHVhbCB0YXNrcyBhbmQgc3RyaXZlcyB0byBwcm92aWRlCi1mYWlyIENQVSB0aW1lIHRvIGVhY2ggdGFzay4gU29tZXRpbWVzLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGdyb3VwIHRhc2tzCi1hbmQgcHJvdmlkZSBmYWlyIENQVSB0aW1lIHRvIGVhY2ggc3VjaCB0YXNrIGdyb3VwLiBGb3IgZXhhbXBsZSwgaXQgbWF5Ci1iZSBkZXNpcmFibGUgdG8gZmlyc3QgcHJvdmlkZSBmYWlyIENQVSB0aW1lIHRvIGVhY2ggdXNlciBvbiB0aGUgc3lzdGVtCi1hbmQgdGhlbiB0byBlYWNoIHRhc2sgYmVsb25naW5nIHRvIGEgdXNlci4KK0NGUyBzdGFuZHMgZm9yICJDb21wbGV0ZWx5IEZhaXIgU2NoZWR1bGVyLCIgYW5kIGlzIHRoZSBuZXcgImRlc2t0b3AiIHByb2Nlc3MKK3NjaGVkdWxlciBpbXBsZW1lbnRlZCBieSBJbmdvIE1vbG5hciBhbmQgbWVyZ2VkIGluIExpbnV4IDIuNi4yMy4gIEl0IGlzIHRoZQorcmVwbGFjZW1lbnQgZm9yIHRoZSBwcmV2aW91cyB2YW5pbGxhIHNjaGVkdWxlcidzIFNDSEVEX09USEVSIGludGVyYWN0aXZpdHkKK2NvZGUuCiAKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEIHN0cml2ZXMgdG8gYWNoaWV2ZSBleGFjdGx5IHRoYXQuIEl0IGxldHMKLVNDSEVEX05PUk1BTC9CQVRDSCB0YXNrcyBiZSBiZSBncm91cGVkIGFuZCBkaXZpZGVzIENQVSB0aW1lIGZhaXJseSBhbW9uZyBzdWNoCi1ncm91cHMuIEF0IHByZXNlbnQsIHRoZXJlIGFyZSB0d28gKG11dHVhbGx5IGV4Y2x1c2l2ZSkgbWVjaGFuaXNtcyB0byBncm91cAotdGFza3MgZm9yIENQVSBiYW5kd2lkdGggY29udHJvbCBwdXJwb3NlOgorODAlIG9mIENGUydzIGRlc2lnbiBjYW4gYmUgc3VtbWVkIHVwIGluIGEgc2luZ2xlIHNlbnRlbmNlOiBDRlMgYmFzaWNhbGx5IG1vZGVscworYW4gImlkZWFsLCBwcmVjaXNlIG11bHRpLXRhc2tpbmcgQ1BVIiBvbiByZWFsIGhhcmR3YXJlLgogCi0JLSBCYXNlZCBvbiB1c2VyIGlkIChDT05GSUdfRkFJUl9VU0VSX1NDSEVEKQotCQlJbiB0aGlzIG9wdGlvbiwgdGFza3MgYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHVzZXIgaWQuCi0JLSBCYXNlZCBvbiAiY2dyb3VwIiBwc2V1ZG8gZmlsZXN5c3RlbSAoQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEKQotCQlUaGlzIG9wdGlvbnMgbGV0cyB0aGUgYWRtaW5pc3RyYXRvciBjcmVhdGUgYXJiaXRyYXJ5IGdyb3VwcwotCQlvZiB0YXNrcywgdXNpbmcgdGhlICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtLiBTZWUKLQkJRG9jdW1lbnRhdGlvbi9jZ3JvdXBzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCi0JCWZpbGVzeXN0ZW0uCisiSWRlYWwgbXVsdGktdGFza2luZyBDUFUiIGlzIGEgKG5vbi1leGlzdGVudCAgOi0pKSBDUFUgdGhhdCBoYXMgMTAwJSBwaHlzaWNhbAorcG93ZXIgYW5kIHdoaWNoIGNhbiBydW4gZWFjaCB0YXNrIGF0IHByZWNpc2UgZXF1YWwgc3BlZWQsIGluIHBhcmFsbGVsLCBlYWNoIGF0CisxL25yX3J1bm5pbmcgc3BlZWQuICBGb3IgZXhhbXBsZTogaWYgdGhlcmUgYXJlIDIgdGFza3MgcnVubmluZywgdGhlbiBpdCBydW5zCitlYWNoIGF0IDUwJSBwaHlzaWNhbCBwb3dlciAtLS0gaS5lLiwgYWN0dWFsbHkgaW4gcGFyYWxsZWwuCisKK09uIHJlYWwgaGFyZHdhcmUsIHdlIGNhbiBydW4gb25seSBhIHNpbmdsZSB0YXNrIGF0IG9uY2UsIHNvIHdlIGhhdmUgdG8KK2ludHJvZHVjZSB0aGUgY29uY2VwdCBvZiAidmlydHVhbCBydW50aW1lLiIgIFRoZSB2aXJ0dWFsIHJ1bnRpbWUgb2YgYSB0YXNrCitzcGVjaWZpZXMgd2hlbiBpdHMgbmV4dCB0aW1lc2xpY2Ugd291bGQgc3RhcnQgZXhlY3V0aW9uIG9uIHRoZSBpZGVhbAorbXVsdGktdGFza2luZyBDUFUgZGVzY3JpYmVkIGFib3ZlLiAgSW4gcHJhY3RpY2UsIHRoZSB2aXJ0dWFsIHJ1bnRpbWUgb2YgYSB0YXNrCitpcyBpdHMgYWN0dWFsIHJ1bnRpbWUgbm9ybWFsaXplZCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHJ1bm5pbmcgdGFza3MuCisKKworCisyLiAgRkVXIElNUExFTUVOVEFUSU9OIERFVEFJTFMKKworSW4gQ0ZTIHRoZSB2aXJ0dWFsIHJ1bnRpbWUgaXMgZXhwcmVzc2VkIGFuZCB0cmFja2VkIHZpYSB0aGUgcGVyLXRhc2sKK3AtPnNlLnZydW50aW1lIChuYW5vc2VjLXVuaXQpIHZhbHVlLiAgVGhpcyB3YXksIGl0J3MgcG9zc2libGUgdG8gYWNjdXJhdGVseQordGltZXN0YW1wIGFuZCBtZWFzdXJlIHRoZSAiZXhwZWN0ZWQgQ1BVIHRpbWUiIGEgdGFzayBzaG91bGQgaGF2ZSBnb3R0ZW4uCisKK1sgc21hbGwgZGV0YWlsOiBvbiAiaWRlYWwiIGhhcmR3YXJlLCBhdCBhbnkgdGltZSBhbGwgdGFza3Mgd291bGQgaGF2ZSB0aGUgc2FtZQorICBwLT5zZS52cnVudGltZSB2YWx1ZSAtLS0gaS5lLiwgdGFza3Mgd291bGQgZXhlY3V0ZSBzaW11bHRhbmVvdXNseSBhbmQgbm8gdGFzaworICB3b3VsZCBldmVyIGdldCAib3V0IG9mIGJhbGFuY2UiIGZyb20gdGhlICJpZGVhbCIgc2hhcmUgb2YgQ1BVIHRpbWUuICBdCisKK0NGUydzIHRhc2sgcGlja2luZyBsb2dpYyBpcyBiYXNlZCBvbiB0aGlzIHAtPnNlLnZydW50aW1lIHZhbHVlIGFuZCBpdCBpcyB0aHVzCit2ZXJ5IHNpbXBsZTogaXQgYWx3YXlzIHRyaWVzIHRvIHJ1biB0aGUgdGFzayB3aXRoIHRoZSBzbWFsbGVzdCBwLT5zZS52cnVudGltZQordmFsdWUgKGkuZS4sIHRoZSB0YXNrIHdoaWNoIGV4ZWN1dGVkIGxlYXN0IHNvIGZhcikuICBDRlMgYWx3YXlzIHRyaWVzIHRvIHNwbGl0Cit1cCBDUFUgdGltZSBiZXR3ZWVuIHJ1bm5hYmxlIHRhc2tzIGFzIGNsb3NlIHRvICJpZGVhbCBtdWx0aXRhc2tpbmcgaGFyZHdhcmUiIGFzCitwb3NzaWJsZS4KKworTW9zdCBvZiB0aGUgcmVzdCBvZiBDRlMncyBkZXNpZ24ganVzdCBmYWxscyBvdXQgb2YgdGhpcyByZWFsbHkgc2ltcGxlIGNvbmNlcHQsCit3aXRoIGEgZmV3IGFkZC1vbiBlbWJlbGxpc2htZW50cyBsaWtlIG5pY2UgbGV2ZWxzLCBtdWx0aXByb2Nlc3NpbmcgYW5kIHZhcmlvdXMKK2FsZ29yaXRobSB2YXJpYW50cyB0byByZWNvZ25pemUgc2xlZXBlcnMuCisKKworCiszLiAgVEhFIFJCVFJFRQorCitDRlMncyBkZXNpZ24gaXMgcXVpdGUgcmFkaWNhbDogaXQgZG9lcyBub3QgdXNlIHRoZSBvbGQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUKK3J1bnF1ZXVlcywgYnV0IGl0IHVzZXMgYSB0aW1lLW9yZGVyZWQgcmJ0cmVlIHRvIGJ1aWxkIGEgInRpbWVsaW5lIiBvZiBmdXR1cmUKK3Rhc2sgZXhlY3V0aW9uLCBhbmQgdGh1cyBoYXMgbm8gImFycmF5IHN3aXRjaCIgYXJ0aWZhY3RzIChieSB3aGljaCBib3RoIHRoZQorcHJldmlvdXMgdmFuaWxsYSBzY2hlZHVsZXIgYW5kIFJTREwvU0QgYXJlIGFmZmVjdGVkKS4KKworQ0ZTIGFsc28gbWFpbnRhaW5zIHRoZSBycS0+Y2ZzLm1pbl92cnVudGltZSB2YWx1ZSwgd2hpY2ggaXMgYSBtb25vdG9uaWMKK2luY3JlYXNpbmcgdmFsdWUgdHJhY2tpbmcgdGhlIHNtYWxsZXN0IHZydW50aW1lIGFtb25nIGFsbCB0YXNrcyBpbiB0aGUKK3J1bnF1ZXVlLiAgVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIGRvbmUgYnkgdGhlIHN5c3RlbSBpcyB0cmFja2VkIHVzaW5nCittaW5fdnJ1bnRpbWU7IHRoYXQgdmFsdWUgaXMgdXNlZCB0byBwbGFjZSBuZXdseSBhY3RpdmF0ZWQgZW50aXRpZXMgb24gdGhlIGxlZnQKK3NpZGUgb2YgdGhlIHRyZWUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKworVGhlIHRvdGFsIG51bWJlciBvZiBydW5uaW5nIHRhc2tzIGluIHRoZSBydW5xdWV1ZSBpcyBhY2NvdW50ZWQgdGhyb3VnaCB0aGUKK3JxLT5jZnMubG9hZCB2YWx1ZSwgd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGUgd2VpZ2h0cyBvZiB0aGUgdGFza3MgcXVldWVkIG9uIHRoZQorcnVucXVldWUuCisKK0NGUyBtYWludGFpbnMgYSB0aW1lLW9yZGVyZWQgcmJ0cmVlLCB3aGVyZSBhbGwgcnVubmFibGUgdGFza3MgYXJlIHNvcnRlZCBieSB0aGUKK3AtPnNlLnZydW50aW1lIGtleSAodGhlcmUgaXMgYSBzdWJ0cmFjdGlvbiB1c2luZyBycS0+Y2ZzLm1pbl92cnVudGltZSB0bworYWNjb3VudCBmb3IgcG9zc2libGUgd3JhcGFyb3VuZHMpLiAgQ0ZTIHBpY2tzIHRoZSAibGVmdG1vc3QiIHRhc2sgZnJvbSB0aGlzCit0cmVlIGFuZCBzdGlja3MgdG8gaXQuCitBcyB0aGUgc3lzdGVtIHByb2dyZXNzZXMgZm9yd2FyZHMsIHRoZSBleGVjdXRlZCB0YXNrcyBhcmUgcHV0IGludG8gdGhlIHRyZWUKK21vcmUgYW5kIG1vcmUgdG8gdGhlIHJpZ2h0IC0tLSBzbG93bHkgYnV0IHN1cmVseSBnaXZpbmcgYSBjaGFuY2UgZm9yIGV2ZXJ5IHRhc2sKK3RvIGJlY29tZSB0aGUgImxlZnRtb3N0IHRhc2siIGFuZCB0aHVzIGdldCBvbiB0aGUgQ1BVIHdpdGhpbiBhIGRldGVybWluaXN0aWMKK2Ftb3VudCBvZiB0aW1lLgorCitTdW1taW5nIHVwLCBDRlMgd29ya3MgbGlrZSB0aGlzOiBpdCBydW5zIGEgdGFzayBhIGJpdCwgYW5kIHdoZW4gdGhlIHRhc2sKK3NjaGVkdWxlcyAob3IgYSBzY2hlZHVsZXIgdGljayBoYXBwZW5zKSB0aGUgdGFzaydzIENQVSB1c2FnZSBpcyAiYWNjb3VudGVkCitmb3IiOiB0aGUgKHNtYWxsKSB0aW1lIGl0IGp1c3Qgc3BlbnQgdXNpbmcgdGhlIHBoeXNpY2FsIENQVSBpcyBhZGRlZCB0bworcC0+c2UudnJ1bnRpbWUuICBPbmNlIHAtPnNlLnZydW50aW1lIGdldHMgaGlnaCBlbm91Z2ggc28gdGhhdCBhbm90aGVyIHRhc2sKK2JlY29tZXMgdGhlICJsZWZ0bW9zdCB0YXNrIiBvZiB0aGUgdGltZS1vcmRlcmVkIHJidHJlZSBpdCBtYWludGFpbnMgKHBsdXMgYQorc21hbGwgYW1vdW50IG9mICJncmFudWxhcml0eSIgZGlzdGFuY2UgcmVsYXRpdmUgdG8gdGhlIGxlZnRtb3N0IHRhc2sgc28gdGhhdCB3ZQorZG8gbm90IG92ZXItc2NoZWR1bGUgdGFza3MgYW5kIHRyYXNoIHRoZSBjYWNoZSksIHRoZW4gdGhlIG5ldyBsZWZ0bW9zdCB0YXNrIGlzCitwaWNrZWQgYW5kIHRoZSBjdXJyZW50IHRhc2sgaXMgcHJlZW1wdGVkLgorCisKKworNC4gIFNPTUUgRkVBVFVSRVMgT0YgQ0ZTCisKK0NGUyB1c2VzIG5hbm9zZWNvbmQgZ3JhbnVsYXJpdHkgYWNjb3VudGluZyBhbmQgZG9lcyBub3QgcmVseSBvbiBhbnkgamlmZmllcyBvcgorb3RoZXIgSFogZGV0YWlsLiAgVGh1cyB0aGUgQ0ZTIHNjaGVkdWxlciBoYXMgbm8gbm90aW9uIG9mICJ0aW1lc2xpY2VzIiBpbiB0aGUKK3dheSB0aGUgcHJldmlvdXMgc2NoZWR1bGVyIGhhZCwgYW5kIGhhcyBubyBoZXVyaXN0aWNzIHdoYXRzb2V2ZXIuICBUaGVyZSBpcworb25seSBvbmUgY2VudHJhbCB0dW5hYmxlICh5b3UgaGF2ZSB0byBzd2l0Y2ggb24gQ09ORklHX1NDSEVEX0RFQlVHKToKKworICAgL3Byb2Mvc3lzL2tlcm5lbC9zY2hlZF9ncmFudWxhcml0eV9ucworCit3aGljaCBjYW4gYmUgdXNlZCB0byB0dW5lIHRoZSBzY2hlZHVsZXIgZnJvbSAiZGVza3RvcCIgKGkuZS4sIGxvdyBsYXRlbmNpZXMpIHRvCisic2VydmVyIiAoaS5lLiwgZ29vZCBiYXRjaGluZykgd29ya2xvYWRzLiAgSXQgZGVmYXVsdHMgdG8gYSBzZXR0aW5nIHN1aXRhYmxlCitmb3IgZGVza3RvcCB3b3JrbG9hZHMuICBTQ0hFRF9CQVRDSCBpcyBoYW5kbGVkIGJ5IHRoZSBDRlMgc2NoZWR1bGVyIG1vZHVsZSB0b28uCisKK0R1ZSB0byBpdHMgZGVzaWduLCB0aGUgQ0ZTIHNjaGVkdWxlciBpcyBub3QgcHJvbmUgdG8gYW55IG9mIHRoZSAiYXR0YWNrcyIgdGhhdAorZXhpc3QgdG9kYXkgYWdhaW5zdCB0aGUgaGV1cmlzdGljcyBvZiB0aGUgc3RvY2sgc2NoZWR1bGVyOiBmaWZ0eXAuYywgdGh1ZC5jLAorY2hldy5jLCByaW5nLXRlc3QuYywgbWFzc2l2ZV9pbnRyLmMgYWxsIHdvcmsgZmluZSBhbmQgZG8gbm90IGltcGFjdAoraW50ZXJhY3Rpdml0eSBhbmQgcHJvZHVjZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IuCisKK1RoZSBDRlMgc2NoZWR1bGVyIGhhcyBhIG11Y2ggc3Ryb25nZXIgaGFuZGxpbmcgb2YgbmljZSBsZXZlbHMgYW5kIFNDSEVEX0JBVENICit0aGFuIHRoZSBwcmV2aW91cyB2YW5pbGxhIHNjaGVkdWxlcjogYm90aCB0eXBlcyBvZiB3b3JrbG9hZHMgYXJlIGlzb2xhdGVkIG11Y2gKK21vcmUgYWdncmVzc2l2ZWx5LgorCitTTVAgbG9hZC1iYWxhbmNpbmcgaGFzIGJlZW4gcmV3b3JrZWQvc2FuaXRpemVkOiB0aGUgcnVucXVldWUtd2Fsa2luZworYXNzdW1wdGlvbnMgYXJlIGdvbmUgZnJvbSB0aGUgbG9hZC1iYWxhbmNpbmcgY29kZSBub3csIGFuZCBpdGVyYXRvcnMgb2YgdGhlCitzY2hlZHVsaW5nIG1vZHVsZXMgYXJlIHVzZWQuICBUaGUgYmFsYW5jaW5nIGNvZGUgZ290IHF1aXRlIGEgYml0IHNpbXBsZXIgYXMgYQorcmVzdWx0LgorCisKKworNS4gU2NoZWR1bGluZyBwb2xpY2llcworCitDRlMgaW1wbGVtZW50cyB0aHJlZSBzY2hlZHVsaW5nIHBvbGljaWVzOgorCisgIC0gU0NIRURfTk9STUFMICh0cmFkaXRpb25hbGx5IGNhbGxlZCBTQ0hFRF9PVEhFUik6IFRoZSBzY2hlZHVsaW5nCisgICAgcG9saWN5IHRoYXQgaXMgdXNlZCBmb3IgcmVndWxhciB0YXNrcy4KKworICAtIFNDSEVEX0JBVENIOiBEb2VzIG5vdCBwcmVlbXB0IG5lYXJseSBhcyBvZnRlbiBhcyByZWd1bGFyIHRhc2tzCisgICAgd291bGQsIHRoZXJlYnkgYWxsb3dpbmcgdGFza3MgdG8gcnVuIGxvbmdlciBhbmQgbWFrZSBiZXR0ZXIgdXNlIG9mCisgICAgY2FjaGVzIGJ1dCBhdCB0aGUgY29zdCBvZiBpbnRlcmFjdGl2aXR5LiBUaGlzIGlzIHdlbGwgc3VpdGVkIGZvcgorICAgIGJhdGNoIGpvYnMuCisKKyAgLSBTQ0hFRF9JRExFOiBUaGlzIGlzIGV2ZW4gd2Vha2VyIHRoYW4gbmljZSAxOSwgYnV0IGl0cyBub3QgYSB0cnVlCisgICAgaWRsZSB0aW1lciBzY2hlZHVsZXIgaW4gb3JkZXIgdG8gYXZvaWQgdG8gZ2V0IGludG8gcHJpb3JpdHkKKyAgICBpbnZlcnNpb24gcHJvYmxlbXMgd2hpY2ggd291bGQgZGVhZGxvY2sgdGhlIG1hY2hpbmUuCisKK1NDSEVEX0ZJRk8vX1JSIGFyZSBpbXBsZW1lbnRlZCBpbiBzY2hlZF9ydC5jIGFuZCBhcmUgYXMgc3BlY2lmaWVkIGJ5CitQT1NJWC4KKworVGhlIGNvbW1hbmQgY2hydCBmcm9tIHV0aWwtbGludXgtbmcgMi4xMy4xLjEgY2FuIHNldCBhbGwgb2YgdGhlc2UgZXhjZXB0CitTQ0hFRF9JRExFLgorCisKKworNi4gIFNDSEVEVUxJTkcgQ0xBU1NFUworCitUaGUgbmV3IENGUyBzY2hlZHVsZXIgaGFzIGJlZW4gZGVzaWduZWQgaW4gc3VjaCBhIHdheSB0byBpbnRyb2R1Y2UgIlNjaGVkdWxpbmcKK0NsYXNzZXMsIiBhbiBleHRlbnNpYmxlIGhpZXJhcmNoeSBvZiBzY2hlZHVsZXIgbW9kdWxlcy4gIFRoZXNlIG1vZHVsZXMKK2VuY2Fwc3VsYXRlIHNjaGVkdWxpbmcgcG9saWN5IGRldGFpbHMgYW5kIGFyZSBoYW5kbGVkIGJ5IHRoZSBzY2hlZHVsZXIgY29yZQord2l0aG91dCB0aGUgY29yZSBjb2RlIGFzc3VtaW5nIHRvbyBtdWNoIGFib3V0IHRoZW0uCisKK3NjaGVkX2ZhaXIuYyBpbXBsZW1lbnRzIHRoZSBDRlMgc2NoZWR1bGVyIGRlc2NyaWJlZCBhYm92ZS4KKworc2NoZWRfcnQuYyBpbXBsZW1lbnRzIFNDSEVEX0ZJRk8gYW5kIFNDSEVEX1JSIHNlbWFudGljcywgaW4gYSBzaW1wbGVyIHdheSB0aGFuCit0aGUgcHJldmlvdXMgdmFuaWxsYSBzY2hlZHVsZXIgZGlkLiAgSXQgdXNlcyAxMDAgcnVucXVldWVzIChmb3IgYWxsIDEwMCBSVAorcHJpb3JpdHkgbGV2ZWxzLCBpbnN0ZWFkIG9mIDE0MCBpbiB0aGUgcHJldmlvdXMgc2NoZWR1bGVyKSBhbmQgaXQgbmVlZHMgbm8KK2V4cGlyZWQgYXJyYXkuCisKK1NjaGVkdWxpbmcgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgdGhyb3VnaCB0aGUgc2NoZWRfY2xhc3Mgc3RydWN0dXJlLCB3aGljaAorY29udGFpbnMgaG9va3MgdG8gZnVuY3Rpb25zIHRoYXQgbXVzdCBiZSBjYWxsZWQgd2hlbmV2ZXIgYW4gaW50ZXJlc3RpbmcgZXZlbnQKK29jY3Vycy4KKworVGhpcyBpcyB0aGUgKHBhcnRpYWwpIGxpc3Qgb2YgdGhlIGhvb2tzOgorCisgLSBlbnF1ZXVlX3Rhc2soLi4uKQorCisgICBDYWxsZWQgd2hlbiBhIHRhc2sgZW50ZXJzIGEgcnVubmFibGUgc3RhdGUuCisgICBJdCBwdXRzIHRoZSBzY2hlZHVsaW5nIGVudGl0eSAodGFzaykgaW50byB0aGUgcmVkLWJsYWNrIHRyZWUgYW5kCisgICBpbmNyZW1lbnRzIHRoZSBucl9ydW5uaW5nIHZhcmlhYmxlLgorCisgLSBkZXF1ZXVlX3RyZWUoLi4uKQorCisgICBXaGVuIGEgdGFzayBpcyBubyBsb25nZXIgcnVubmFibGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGtlZXAgdGhlCisgICBjb3JyZXNwb25kaW5nIHNjaGVkdWxpbmcgZW50aXR5IG91dCBvZiB0aGUgcmVkLWJsYWNrIHRyZWUuICBJdCBkZWNyZW1lbnRzCisgICB0aGUgbnJfcnVubmluZyB2YXJpYWJsZS4KKworIC0geWllbGRfdGFzayguLi4pCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBkZXF1ZXVlIGZvbGxvd2VkIGJ5IGFuIGVucXVldWUsIHVubGVzcyB0aGUKKyAgIGNvbXBhdF95aWVsZCBzeXNjdGwgaXMgdHVybmVkIG9uOyBpbiB0aGF0IGNhc2UsIGl0IHBsYWNlcyB0aGUgc2NoZWR1bGluZworICAgZW50aXR5IGF0IHRoZSByaWdodC1tb3N0IGVuZCBvZiB0aGUgcmVkLWJsYWNrIHRyZWUuCisKKyAtIGNoZWNrX3ByZWVtcHRfY3VyciguLi4pCisKKyAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEgdGFzayB0aGF0IGVudGVyZWQgdGhlIHJ1bm5hYmxlIHN0YXRlIHNob3VsZAorICAgcHJlZW1wdCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzay4KKworIC0gcGlja19uZXh0X3Rhc2soLi4uKQorCisgICBUaGlzIGZ1bmN0aW9uIGNob29zZXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgdGFzayBlbGlnaWJsZSB0byBydW4gbmV4dC4KKworIC0gc2V0X2N1cnJfdGFzayguLi4pCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSB0YXNrIGNoYW5nZXMgaXRzIHNjaGVkdWxpbmcgY2xhc3Mgb3IgY2hhbmdlcworICAgaXRzIHRhc2sgZ3JvdXAuCisKKyAtIHRhc2tfdGljayguLi4pCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbW9zdGx5IGNhbGxlZCBmcm9tIHRpbWUgdGljayBmdW5jdGlvbnM7IGl0IG1pZ2h0IGxlYWQgdG8KKyAgIHByb2Nlc3Mgc3dpdGNoLiAgVGhpcyBkcml2ZXMgdGhlIHJ1bm5pbmcgcHJlZW1wdGlvbi4KKworIC0gdGFza19uZXcoLi4uKQorCisgICBUaGUgY29yZSBzY2hlZHVsZXIgZ2l2ZXMgdGhlIHNjaGVkdWxpbmcgbW9kdWxlIGFuIG9wcG9ydHVuaXR5IHRvIG1hbmFnZSBuZXcKKyAgIHRhc2sgc3RhcnR1cC4gIFRoZSBDRlMgc2NoZWR1bGluZyBtb2R1bGUgdXNlcyBpdCBmb3IgZ3JvdXAgc2NoZWR1bGluZywgd2hpbGUKKyAgIHRoZSBzY2hlZHVsaW5nIG1vZHVsZSBmb3IgYSByZWFsLXRpbWUgdGFzayBkb2VzIG5vdCB1c2UgaXQuCisKKworCis3LiAgR1JPVVAgU0NIRURVTEVSIEVYVEVOU0lPTlMgVE8gQ0ZTCisKK05vcm1hbGx5LCB0aGUgc2NoZWR1bGVyIG9wZXJhdGVzIG9uIGluZGl2aWR1YWwgdGFza3MgYW5kIHN0cml2ZXMgdG8gcHJvdmlkZQorZmFpciBDUFUgdGltZSB0byBlYWNoIHRhc2suICBTb21ldGltZXMsIGl0IG1heSBiZSBkZXNpcmFibGUgdG8gZ3JvdXAgdGFza3MgYW5kCitwcm92aWRlIGZhaXIgQ1BVIHRpbWUgdG8gZWFjaCBzdWNoIHRhc2sgZ3JvdXAuICBGb3IgZXhhbXBsZSwgaXQgbWF5IGJlCitkZXNpcmFibGUgdG8gZmlyc3QgcHJvdmlkZSBmYWlyIENQVSB0aW1lIHRvIGVhY2ggdXNlciBvbiB0aGUgc3lzdGVtIGFuZCB0aGVuIHRvCitlYWNoIHRhc2sgYmVsb25naW5nIHRvIGEgdXNlci4KKworQ09ORklHX0dST1VQX1NDSEVEIHN0cml2ZXMgdG8gYWNoaWV2ZSBleGFjdGx5IHRoYXQuICBJdCBsZXRzIHRhc2tzIHRvIGJlCitncm91cGVkIGFuZCBkaXZpZGVzIENQVSB0aW1lIGZhaXJseSBhbW9uZyBzdWNoIGdyb3Vwcy4KKworQ09ORklHX1JUX0dST1VQX1NDSEVEIHBlcm1pdHMgdG8gZ3JvdXAgcmVhbC10aW1lIChpLmUuLCBTQ0hFRF9GSUZPIGFuZAorU0NIRURfUlIpIHRhc2tzLgorCitDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCBwZXJtaXRzIHRvIGdyb3VwIENGUyAoaS5lLiwgU0NIRURfTk9STUFMIGFuZAorU0NIRURfQkFUQ0gpIHRhc2tzLgorCitBdCBwcmVzZW50LCB0aGVyZSBhcmUgdHdvIChtdXR1YWxseSBleGNsdXNpdmUpIG1lY2hhbmlzbXMgdG8gZ3JvdXAgdGFza3MgZm9yCitDUFUgYmFuZHdpZHRoIGNvbnRyb2wgcHVycG9zZXM6CisKKyAtIEJhc2VkIG9uIHVzZXIgaWQgKENPTkZJR19VU0VSX1NDSEVEKQorCisgICBXaXRoIHRoaXMgb3B0aW9uLCB0YXNrcyBhcmUgZ3JvdXBlZCBhY2NvcmRpbmcgdG8gdGhlaXIgdXNlciBpZC4KKworIC0gQmFzZWQgb24gImNncm91cCIgcHNldWRvIGZpbGVzeXN0ZW0gKENPTkZJR19DR1JPVVBfU0NIRUQpCisKKyAgIFRoaXMgb3B0aW9ucyBuZWVkcyBDT05GSUdfQ0dST1VQUyB0byBiZSBkZWZpbmVkLCBhbmQgbGV0cyB0aGUgYWRtaW5pc3RyYXRvcgorICAgY3JlYXRlIGFyYml0cmFyeSBncm91cHMgb2YgdGFza3MsIHVzaW5nIHRoZSAiY2dyb3VwIiBwc2V1ZG8gZmlsZXN5c3RlbS4gIFNlZQorICAgRG9jdW1lbnRhdGlvbi9jZ3JvdXBzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZpbGVzeXN0ZW0uCiAKIE9ubHkgb25lIG9mIHRoZXNlIG9wdGlvbnMgdG8gZ3JvdXAgdGFza3MgY2FuIGJlIGNob3NlbiBhbmQgbm90IGJvdGguCiAKLUdyb3VwIHNjaGVkdWxlciB0dW5hYmxlczoKLQotV2hlbiBDT05GSUdfRkFJUl9VU0VSX1NDSEVEIGlzIGRlZmluZWQsIGEgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgaW4gc3lzZnMgZm9yCi1lYWNoIG5ldyB1c2VyIGFuZCBhICJjcHVfc2hhcmUiIGZpbGUgaXMgYWRkZWQgaW4gdGhhdCBkaXJlY3RvcnkuCitXaGVuIENPTkZJR19VU0VSX1NDSEVEIGlzIGRlZmluZWQsIGEgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgaW4gc3lzZnMgZm9yIGVhY2ggbmV3Cit1c2VyIGFuZCBhICJjcHVfc2hhcmUiIGZpbGUgaXMgYWRkZWQgaW4gdGhhdCBkaXJlY3RvcnkuCiAKIAkjIGNkIC9zeXMva2VybmVsL3VpZHMKIAkjIGNhdCA1MTIvY3B1X3NoYXJlCQkjIERpc3BsYXkgdXNlciA1MTIncyBDUFUgc2hhcmUKQEAgLTE1NSwxNiArMjQ2LDE0IEBACiAJMjA0OAogCSMKIAotQ1BVIGJhbmR3aWR0aCBiZXR3ZWVuIHR3byB1c2VycyBhcmUgZGl2aWRlZCBpbiB0aGUgcmF0aW8gb2YgdGhlaXIgQ1BVIHNoYXJlcy4KLUZvciBleDogaWYgeW91IHdvdWxkIGxpa2UgdXNlciAicm9vdCIgdG8gZ2V0IHR3aWNlIHRoZSBiYW5kd2lkdGggb2YgdXNlcgotImd1ZXN0IiwgdGhlbiBzZXQgdGhlIGNwdV9zaGFyZSBmb3IgYm90aCB0aGUgdXNlcnMgc3VjaCB0aGF0ICJyb290IidzCi1jcHVfc2hhcmUgaXMgdHdpY2UgImd1ZXN0IidzIGNwdV9zaGFyZQorQ1BVIGJhbmR3aWR0aCBiZXR3ZWVuIHR3byB1c2VycyBpcyBkaXZpZGVkIGluIHRoZSByYXRpbyBvZiB0aGVpciBDUFUgc2hhcmVzLgorRm9yIGV4YW1wbGU6IGlmIHlvdSB3b3VsZCBsaWtlIHVzZXIgInJvb3QiIHRvIGdldCB0d2ljZSB0aGUgYmFuZHdpZHRoIG9mIHVzZXIKKyJndWVzdCwiIHRoZW4gc2V0IHRoZSBjcHVfc2hhcmUgZm9yIGJvdGggdGhlIHVzZXJzIHN1Y2ggdGhhdCAicm9vdCIncyBjcHVfc2hhcmUKK2lzIHR3aWNlICJndWVzdCIncyBjcHVfc2hhcmUuCiAKLQotV2hlbiBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgZGVmaW5lZCwgYSAiY3B1LnNoYXJlcyIgZmlsZSBpcyBjcmVhdGVkCi1mb3IgZWFjaCBncm91cCBjcmVhdGVkIHVzaW5nIHRoZSBwc2V1ZG8gZmlsZXN5c3RlbS4gU2VlIGV4YW1wbGUgc3RlcHMKLWJlbG93IHRvIGNyZWF0ZSB0YXNrIGdyb3VwcyBhbmQgbW9kaWZ5IHRoZWlyIENQVSBzaGFyZSB1c2luZyB0aGUgImNncm91cHMiCi1wc2V1ZG8gZmlsZXN5c3RlbQorV2hlbiBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIGRlZmluZWQsIGEgImNwdS5zaGFyZXMiIGZpbGUgaXMgY3JlYXRlZCBmb3IgZWFjaAorZ3JvdXAgY3JlYXRlZCB1c2luZyB0aGUgcHNldWRvIGZpbGVzeXN0ZW0uICBTZWUgZXhhbXBsZSBzdGVwcyBiZWxvdyB0byBjcmVhdGUKK3Rhc2sgZ3JvdXBzIGFuZCBtb2RpZnkgdGhlaXIgQ1BVIHNoYXJlIHVzaW5nIHRoZSAiY2dyb3VwcyIgcHNldWRvIGZpbGVzeXN0ZW0uCiAKIAkjIG1rZGlyIC9kZXYvY3B1Y3RsCiAJIyBtb3VudCAtdCBjZ3JvdXAgLW9jcHUgbm9uZSAvZGV2L2NwdWN0bApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZCBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWQKaW5kZXggMzc3OTZmZS4uZWFhNDgwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkCkBAIC00MDksNyArNDA5LDcgQEAKIAltZWdhcmFpZF9tYm94X3ByZXBhcmVfcHRocnUsIG1lZ2FyYWlkX21ib3hfcHJlcGFyZV9lcHRocnUsCiAJbWVnYXJhaWRfYnVzeXdhaXRfbWJveAogCi0JCS0gQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4sIDA4LjE5LjIwMDQKKwkJLSBBbmRyZXcgTW9ydG9uLCAwOC4xOS4yMDA0CiAJCWxpbnV4LXNjc2kgbWFpbGluZyBsaXN0CiAKIAkiU29tZXRoaW5nIGVsc2UgdG8gY2xlYW4gdXAgYWZ0ZXIgaW5jbHVzaW9uOiBldmVyeSBpbnN0YW5jZSBvZiBhbgpAQCAtNDcxLDEzICs0NzEsMTMgQEAKIHZpaS4JTW92ZSB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciB0aGUgbWFuYWdlbWVudCBtb2R1bGUgZnJvbQogCW1lZ2FyYWlkX21tLmggdG8gbWVnYXJhaWRfbW0uYwogCi0JCS0gQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4sIDA4LjE5LjIwMDQKKwkJLSBBbmRyZXcgTW9ydG9uLCAwOC4xOS4yMDA0CiAJCWxpbnV4LXNjc2kgbWFpbGluZyBsaXN0CiAKIHZpaWkuCUNoYW5nZSBkZWZhdWx0IHZhbHVlcyBmb3IgTUVHQVJBSURfTkVXR0VOLCBNRUdBUkFJRF9NTSwgYW5kCiAJTUVHQVJBSURfTUFJTEJPWCB0byAnbicgaW4gS2NvbmZpZy5tZWdhcmFpZAogCi0JCS0gQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4sIDA4LjE5LjIwMDQKKwkJLSBBbmRyZXcgTW9ydG9uLCAwOC4xOS4yMDA0CiAJCWxpbnV4LXNjc2kgbWFpbGluZyBsaXN0CiAKIGl4LglyZXBsYWNlIHVkZWxheSB3aXRoIG1zbGVlcApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKaW5kZXggNzUxNDNmMC4uMzhkMzI0ZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dApAQCAtNDM2LDYgKzQzNiw0MiBAQAogICAgIHdhcyB1cGRhdGVkIHRvIHJlbW92ZSBhbGwgdnBvcnRzIGZvciB0aGUgZmNfaG9zdCBhcyB3ZWxsLgogCiAKK1RyYW5zcG9ydCBzdXBwbGllZCBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHN1cHBsaWVkIGJ5IHRoZSBGQy10cmFuc3BvcnQgZm9yIHVzZSBieSBMTERzLgorCisgICBmY192cG9ydF9jcmVhdGUgLSBjcmVhdGUgYSB2cG9ydAorICAgZmNfdnBvcnRfdGVybWluYXRlIC0gZGV0YWNoIGFuZCByZW1vdmUgYSB2cG9ydAorCitEZXRhaWxzOgorCisvKioKKyAqIGZjX3Zwb3J0X2NyZWF0ZSAtIEFkbWluIEFwcCBvciBMTEREIHJlcXVlc3RzIGNyZWF0aW9uIG9mIGEgdnBvcnQKKyAqIEBzaG9zdDogICAgIHNjc2kgaG9zdCB0aGUgdmlydHVhbCBwb3J0IGlzIGNvbm5lY3RlZCB0by4KKyAqIEBpZHM6ICAgICAgIFRoZSB3b3JsZCB3aWRlIG5hbWVzLCBGQzQgcG9ydCByb2xlcywgZXRjIGZvcgorICogICAgICAgICAgICAgIHRoZSB2aXJ0dWFsIHBvcnQuCisgKgorICogTm90ZXM6CisgKiAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKi8KK3N0cnVjdCBmY192cG9ydCAqCitmY192cG9ydF9jcmVhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyAqaWRzKQorCisvKioKKyAqIGZjX3Zwb3J0X3Rlcm1pbmF0ZSAtIEFkbWluIEFwcCBvciBMTEREIHJlcXVlc3RzIHRlcm1pbmF0aW9uIG9mIGEgdnBvcnQKKyAqIEB2cG9ydDogICAgICBmY192cG9ydCB0byBiZSB0ZXJtaW5hdGVkCisgKgorICogQ2FsbHMgdGhlIExMREQgdnBvcnRfZGVsZXRlKCkgZnVuY3Rpb24sIHRoZW4gZGVhbGxvY2F0ZXMgYW5kIHJlbW92ZXMKKyAqIHRoZSB2cG9ydCBmcm9tIHRoZSBzaG9zdCBhbmQgb2JqZWN0IHRyZWUuCisgKgorICogTm90ZXM6CisgKiAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICovCitpbnQKK2ZjX3Zwb3J0X3Rlcm1pbmF0ZShzdHJ1Y3QgZmNfdnBvcnQgKnZwb3J0KQorCisKIENyZWRpdHMKID09PT09PT0KIFRoZSBmb2xsb3dpbmcgcGVvcGxlIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhpcyBkb2N1bWVudDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggYjExN2U0Mi4uZTBlNTRhMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTc0Niw4ICs3NDYsMTAgQEAKICAgTW9kdWxlIHNuZC1oZGEtaW50ZWwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIE1vZHVsZSBmb3IgSW50ZWwgSEQgQXVkaW8gKElDSDYsIElDSDZNLCBFU0IyLCBJQ0g3LCBJQ0g4KSwKLQkJQVRJIFNCNDUwLCBTQjYwMCwgUlM2MDAsCisgICAgTW9kdWxlIGZvciBJbnRlbCBIRCBBdWRpbyAoSUNINiwgSUNINk0sIEVTQjIsIElDSDcsIElDSDgsIElDSDksIElDSDEwLAorCQkJUENILCBTQ0gpLAorCQlBVEkgU0I0NTAsIFNCNjAwLCBSNjAwLCBSUzYwMCwgUlM2OTAsIFJTNzgwLCBSVjYxMCwgUlY2MjAsCisJCQlSVjYzMCwgUlY2MzUsIFJWNjcwLCBSVjc3MCwKIAkJVklBIFZUODI1MS9WVDgyMzdBLAogCQlTSVM5NjYsIFVMSSBNNTQ2MQogCkBAIC04MDcsNiArODA5LDcgQEAKIAlBTEMyNjAKIAkgIGhwCQlIUCBtYWNoaW5lcwogCSAgaHAtMzAxMwlIUCBtYWNoaW5lcyAoMzAxMy12YXJpYW50KQorCSAgaHAtZGM3NjAwCUhQIERDNzYwMAogCSAgZnVqaXRzdQlGdWppdHN1IFM3MDIwCiAJICBhY2VyCQlBY2VyIFRyYXZlbE1hdGUKIAkgIHdpbGwJCVdpbGwgbGFwdG9wcyAoUEIgVjc5MDApCkBAIC04MjgsOCArODMxLDExIEBACiAJICBoaXBwbwkJSGlwcG8gKEFUSSkgd2l0aCBqYWNrIGRldGVjdGlvbiwgU29ueSBVWC05MHMKIAkgIGhpcHBvXzEJSGlwcG8gKEJlbnEpIHdpdGggamFjayBkZXRlY3Rpb24KIAkgIHNvbnktYXNzYW1kCVNvbnkgQVNTQU1ECisJICB0b3NoaWJhLXMwNglUb3NoaWJhIFMwNgorCSAgdG9zaGliYS1yeDEJVG9zaGliYSBSWDEKIAkgIHVsdHJhCQlTYW1zdW5nIFExIFVsdHJhIFZpc3RhIG1vZGVsCiAJICBsZW5vdm8tMzAwMAlMZW5vdm8gMzAwMCB5NDEwCisJICBuZWMJCU5FQyBWZXJzYSBTOTEwMAogCSAgYmFzaWMJCWZpeGVkIHBpbiBhc3NpZ25tZW50IHcvbyBTUERJRgogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCkBAIC04MzgsNiArODQ0LDcgQEAKIAkgIDNzdGFjawkzLXN0YWNrIG1vZGVsCiAJICB0b3NoaWJhCVRvc2hpYmEgQTIwNQogCSAgYWNlcgkJQWNlciBsYXB0b3BzCisJICBhY2VyLWFzcGlyZQlBY2VyIEFzcGlyZSBPbmUKIAkgIGRlbGwJCURlbGwgT0VNIGxhcHRvcHMgKFZvc3RybyAxMjAwKQogCSAgemVwdG8JCVplcHRvIGxhcHRvcHMKIAkgIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzIGNhbgpAQCAtODQ3LDYgKzg1NCw5IEBACiAKIAlBTEMyNjkKIAkgIGJhc2ljCQlCYXNpYyBwcmVzZXQKKwkgIHF1YW50YQlRdWFudGEgRkwxCisJICBlZWVwYy1wNzAzCUFTVVMgRWVlcGMgUDcwMyBQOTAwQQorCSAgZWVlcGMtcDkwMQlBU1VTIEVlZXBjIFA5MDEgUzEwMQogCiAJQUxDNjYyLzY2MwogCSAgM3N0YWNrLWRpZwkzLXN0YWNrICgyLWNoYW5uZWwpIHdpdGggU1BESUYKQEAgLTg1NiwxMCArODY2LDE3IEBACiAJICBsZW5vdm8tMTAxZQkgTGVub3ZvIGxhcHRvcAogCSAgZWVlcGMtcDcwMQlBU1VTIEVlZXBjIFA3MDEKIAkgIGVlZXBjLWVwMjAJQVNVUyBFZWVwYyBFUDIwCisJICBlY3MJCUVDUy9Gb3hjb25uIG1vYm8KIAkgIG01MXZhCQlBU1VTIE01MVZBCiAJICBnNzF2CQlBU1VTIEc3MVYKIAkgIGgxMwkJQVNVUyBIMTMKIAkgIGc1MHYJCUFTVVMgRzUwVgorCSAgYXN1cy1tb2RlMQlBU1VTCisJICBhc3VzLW1vZGUyCUFTVVMKKwkgIGFzdXMtbW9kZTMJQVNVUworCSAgYXN1cy1tb2RlNAlBU1VTCisJICBhc3VzLW1vZGU1CUFTVVMKKwkgIGFzdXMtbW9kZTYJQVNVUwogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODgyLzg4NQpAQCAtODkxLDEyICs5MDgsMTQgQEAKIAkgIGxlbm92by0xMDFlCUxlbm92byAxMDFFCiAJICBsZW5vdm8tbmIwNzYzCUxlbm92byBOQjA3NjMKIAkgIGxlbm92by1tczcxOTUtZGlnIExlbm92byBNUzcxOTUKKwkgIGxlbm92by1za3kJTGVub3ZvIFNreQogCSAgaGFpZXItdzY2CUhhaWVyIFc2NgogCSAgM3N0YWNrLWhwCUhQIG1hY2hpbmVzIHdpdGggM3N0YWNrIChMdWNrbm93LCBTYW1iYSBib2FyZHMpCiAJICA2c3RhY2stZGVsbAlEZWxsIG1hY2hpbmVzIHdpdGggNnN0YWNrIChJbnNwaXJvbiA1MzApCiAJICBtaXRhYwkJTWl0YWMgODI1MkQKIAkgIGNsZXZvLW03MjAJQ2xldm8gTTcyMCBsYXB0b3Agc2VyaWVzCiAJICBmdWppdHN1LXBpMjUxNSBGdWppdHN1IEFNSUxPIFBpMjUxNQorCSAgM3N0YWNrLTZjaC1pbnRlbCBJbnRlbCBERzMzKiBib2FyZHMKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKIAogCUFMQzg2MS82NjAKQEAgLTkyOSw3ICs5NDgsNyBAQAogCSAgYWxsb3V0CTUtamFjayBpbiBiYWNrLCAyLWphY2sgaW4gZnJvbnQsIFNQRElGIG91dAogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCi0JQUQxODgyCisJQUQxODgyIC8gQUQxODgyQQogCSAgM3N0YWNrCTMtc3RhY2sgbW9kZSAoZGVmYXVsdCkKIAkgIDZzdGFjawk2LXN0YWNrIG1vZGUKIApAQCAtMTA3OSw3ICsxMDk4LDcgQEAKIAkgICAgcmVnaXN0ZXIgdmFsdWUgd2l0aG91dCBGSUZPIHNpemUgY29ycmVjdGlvbiBhcyB0aGUgY3VycmVudAogCSAgICBETUEgcG9pbnRlci4gIHBvc2l0aW9uX2ZpeD0yIHdpbGwgbWFrZSB0aGUgZHJpdmVyIHRvIHVzZQogCSAgICB0aGUgcG9zaXRpb24gYnVmZmVyIGluc3RlYWQgb2YgcmVhZGluZyBTRF9MUElCIHJlZ2lzdGVyLgotCSAgICAoVXN1YWxseSBTRF9MUExJQiByZWdpc3RlciBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlCisJICAgIChVc3VhbGx5IFNEX0xQSUIgcmVnaXN0ZXIgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZQogCSAgICBwb3NpdGlvbiBidWZmZXIuKQogCiAgICAgTkI6IElmIHlvdSBnZXQgbWFueSAiYXp4X2dldF9yZXNwb25zZSB0aW1lb3V0IiBtZXNzYWdlcyBhdApAQCAtMTE2Niw2ICsxMTg1LDcgQEAKIAkJCSogRXZlbnQgRWxlY3Ryb25pY3MsIEVaOAogICAgICAgICAgICAgICAgICAgICAgICAgKiBEaWdpZ3JhbSBWWDQ0MgogCQkJKiBMaW9uc3RyYWNzLCBNZWRpYXN0YXRvbgorCQkJKiBUZXJyYXNvbmlxIFRTIDg4CiAKICAgICBtb2RlbCAgICAgICAtIFVzZSB0aGUgZ2l2ZW4gYm9hcmQgbW9kZWwsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogCQkgIGRlbHRhMTAxMCwgZGlvMjQ5NiwgZGVsdGE2NiwgZGVsdGE0NCwgYXVkaW9waGlsZSwgZGVsdGE0MTAsCkBAIC0xMjAwLDcgKzEyMjAsMTAgQEAKIAkJCSogVGVycmFUZWMgUGhhc2UgMjIKIAkJCSogVGVycmFUZWMgUGhhc2UgMjgKIAkJCSogQXVkaW9UcmFrIFByb2RpZ3kgNy4xCi0JCQkqIEF1ZGlvVHJhayBQcm9kaWd5IDcuMUxUCisJCQkqIEF1ZGlvVHJhayBQcm9kaWd5IDcuMSBMVAorCQkJKiBBdWRpb1RyYWsgUHJvZGlneSA3LjEgWFQKKwkJCSogQXVkaW9UcmFrIFByb2RpZ3kgNy4xIEhJRkkKKwkJCSogQXVkaW9UcmFrIFByb2RpZ3kgNy4xIEhEMgogCQkJKiBBdWRpb1RyYWsgUHJvZGlneSAxOTIKIAkJCSogUG9udGlzIE1TMzAwCiAJCQkqIEFsYmF0cm9uIEs4WDgwMCBQcm8gSUkgCkBAIC0xMjExLDEyICsxMjM0LDE2IEBACiAJCQkqIFNodXR0bGUgU04yNVAKIAkJCSogT25reW8gU0UtOTBQQ0kKIAkJCSogT25reW8gU0UtMjAwUENJCisJCQkqIEVTSSBKdWxpQAorCQkJKiBIZXJjdWxlcyBGb3J0aXNzaW1vIElWCisJCQkqIEVHTy1TWVMgV2F2ZVRlcm1pbmFsIDE5Mk0KIAogICAgIG1vZGVsICAgICAgIC0gVXNlIHRoZSBnaXZlbiBib2FyZCBtb2RlbCwgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJCSAgcmV2bzUxLCByZXZvNzEsIGFtcDIwMDAsIHByb2RpZ3k3MSwgcHJvZGlneTcxbHQsCi0JCSAgcHJvZGlneTE5MiwgYXVyZW9uNTEsIGF1cmVvbjcxLCB1bml2ZXJzZSwgYXAxOTIsCi0JCSAgazh4ODAwLCBwaGFzZTIyLCBwaGFzZTI4LCBtczMwMCwgYXY3MTAsIHNlMjAwcGNpLAotCQkgIHNlOTBwY2kKKwkJICBwcm9kaWd5NzF4dCwgcHJvZGlneTcxaGlmaSwgcHJvZGlneWhkMiwgcHJvZGlneTE5MiwKKwkJICBqdWxpLCBhdXJlb241MSwgYXVyZW9uNzEsIHVuaXZlcnNlLCBhcDE5Miwgazh4ODAwLAorCQkgIHBoYXNlMjIsIHBoYXNlMjgsIG1zMzAwLCBhdjcxMCwgc2UyMDBwY2ksIHNlOTBwY2ksCisJCSAgZm9ydGlzc2ltbzQsIHNuMjVwLCBXVDE5Mk0KIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGNhcmRzIGFuZCBhdXRvcHJvYmUuCiAKQEAgLTEyNTUsNyArMTI4Miw3IEBACiAKICAgICBNb2R1bGUgZm9yIEFDJzk3IG1vdGhlcmJvYXJkcyBmcm9tIEludGVsIGFuZCBjb21wYXRpYmxlcy4KIAkJCSogSW50ZWwgaTgxMC84MTBFLCBpODE1LCBpODIwLCBpODMwLCBpODR4LCBNWDQ0MAotCQkJCUlDSDUsIElDSDYsIElDSDcsIEVTQjIKKwkJCQlJQ0g1LCBJQ0g2LCBJQ0g3LCA2MzAwRVNCLCBFU0IyCiAJCQkqIFNpUyA3MDEyIChTaVMgNzM1KQogCQkJKiBOVmlkaWEgTkZvcmNlLCBORm9yY2UyLCBORm9yY2UzLCBNQ1AwNCwgQ0s4MDQKIAkJCQkgQ0s4LCBDSzhTLCBNQ1A1MDEKQEAgLTE5NTEsNiArMTk3OCw4IEBACiAJCQkqIENISUMgIFRydWUgU291bmQgNER3YXZlCiAJCQkqIFNoYXJrICBQcmVkYXRvcjRELVBDSQogCQkJKiBKYXRvbiAgU29uaWNXYXZlIDRECisJCQkqIFNpUyBTSTcwMTggUENJIEF1ZGlvCisJCQkqIEhvb250ZWNoIFNvdW5kVHJhY2sgRGlnaXRhbCA0RFdhdmUgTlgKIAogICAgIHBjbV9jaGFubmVscyAgIC0gbWF4IGNoYW5uZWxzICh2b2ljZXMpIHJlc2VydmVkIGZvciBQQ00KICAgICB3YXZldGFibGVfc2l6ZSAtIG1heCB3YXZldGFibGUgc2l6ZSBpbiBrQiAoNC0/a2IpCkBAIC0xOTY2LDEyICsxOTk1LDI1IEBACiAKICAgICB2aWQgICAgICAgICAgICAgLSBWZW5kb3IgSUQgZm9yIHRoZSBkZXZpY2UgKG9wdGlvbmFsKQogICAgIHBpZCAgICAgICAgICAgICAtIFByb2R1Y3QgSUQgZm9yIHRoZSBkZXZpY2UgKG9wdGlvbmFsKQorICAgIG5ycGFja3MJICAgIC0gTWF4LiBudW1iZXIgb2YgcGFja2V0cyBwZXIgVVJCIChkZWZhdWx0OiA4KQorICAgIGFzeW5jX3VubGluayAgICAtIFVzZSBhc3luYyB1bmxpbmsgbW9kZSAoZGVmYXVsdDogeWVzKQogICAgIGRldmljZV9zZXR1cCAgICAtIERldmljZSBzcGVjaWZpYyBtYWdpYyBudW1iZXIgKG9wdGlvbmFsKQogICAgICAgICAgICAgICAgICAgICAtIEluZmx1ZW5jZSBkZXBlbmRzIG9uIHRoZSBkZXZpY2UKICAgICAgICAgICAgICAgICAgICAgLSBEZWZhdWx0OiAweDAwMDAgCisgICAgaWdub3JlX2N0bF9lcnJvciAtIElnbm9yZSBhbnkgVVNCLWNvbnRyb2xsZXIgcmVnYXJkaW5nIG1peGVyCisgICAgCQkgICAgICAgaW50ZXJmYWNlIChkZWZhdWx0OiBubykKIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGRldmljZXMsIGF1dG9wcm9iZSBhbmQgaG90cGx1Z2dpbmcuCiAKKyAgICBOQjogbnJwYWNrcyBwYXJhbWV0ZXIgY2FuIGJlIG1vZGlmaWVkIGR5bmFtaWNhbGx5IHZpYSBzeXNmcy4KKyAgICAgICAgRG9uJ3QgcHV0IHRoZSB2YWx1ZSBvdmVyIDIwLiAgQ2hhbmdpbmcgdmlhIHN5c2ZzIGhhcyBubyBzYW5pdHkKKwljaGVjay4KKyAgICBOQjogYXN5bmNfdW5saW5rPTAgd291bGQgY2F1c2UgT29wcy4gIEl0IHJlbWFpbnMganVzdCBmb3IKKyAgICAgICAgZGVidWdnaW5nIHB1cnBvc2UgKGlmIGFueSkuCisgICAgTkI6IGlnbm9yZV9jdGxfZXJyb3I9MSBtYXkgaGVscCB3aGVuIHlvdSBnZXQgYW4gZXJyb3IgYXQgYWNjZXNzaW5nCisgICAgICAgIHRoZSBtaXhlciBlbGVtZW50IHN1Y2ggYXMgVVJCIGVycm9yIC0yMi4gIFRoaXMgaGFwcGVucyBvbiBzb21lCisgICAgICAgIGJ1Z2d5IFVTQiBkZXZpY2Ugb3IgdGhlIGNvbnRyb2xsZXIuCisKICAgTW9kdWxlIHNuZC11c2ItY2FpYXEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjA3OCw3ICsyMTIwLDcgQEAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgTW9kdWxlIGZvciBzb3VuZCBjYXJkcyBiYXNlZCBvbiB0aGUgQXN1cyBBVjEwMC9BVjIwMCBjaGlwcywKLSAgICBpLmUuLCBYb25hciBEMSwgRFgsIEQyIGFuZCBEMlguCisgICAgaS5lLiwgWG9uYXIgRDEsIERYLCBEMiwgRDJYIGFuZCBIREFWMS4zIChEZWx1eGUpLgogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgYXV0b3Byb2JlIGFuZCBtdWx0aXBsZSBjYXJkcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCmluZGV4IGUxM2M0ZTYuLjg3YTdjMDdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC01MDczLDggKzUwNzMsNyBAQAogICAgICAgd2l0aCA8Y29uc3RhbnQ+U05EUlZfRE1BX1RZUEVfQ09OVElOVU9VUzwvY29uc3RhbnQ+IHR5cGUgYW5kIHRoZQogICAgICAgPGZ1bmN0aW9uPnNuZF9kbWFfY29udGludW91c19kYXRhKEdGUF9LRVJORUwpPC9mdW5jdGlvbj4gZGV2aWNlIHBvaW50ZXIsCiAgICAgICB3aGVyZSA8Y29uc3RhbnQ+R0ZQX0tFUk5FTDwvY29uc3RhbnQ+IGlzIHRoZSBrZXJuZWwgYWxsb2NhdGlvbiBmbGFnIHRvCi0gICAgICB1c2UuICBGb3IgdGhlIFNCVVMsIDxjb25zdGFudD5TTkRSVl9ETUFfVFlQRV9TQlVTPC9jb25zdGFudD4gYW5kCi0gICAgICA8ZnVuY3Rpb24+c25kX2RtYV9zYnVzX2RhdGEoc2J1c19kZXYpPC9mdW5jdGlvbj4gYXJlIHVzZWQgaW5zdGVhZC4KKyAgICAgIHVzZS4KICAgICAgIEZvciB0aGUgUENJIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMsIHVzZQogICAgICAgPGNvbnN0YW50PlNORFJWX0RNQV9UWVBFX0RFVl9TRzwvY29uc3RhbnQ+IHdpdGgKICAgICAgIDxmdW5jdGlvbj5zbmRfZG1hX3BjaV9kYXRhKHBjaSk8L2Z1bmN0aW9uPgpAQCAtNjEzNSw0NCArNjEzNCw1OCBAQAogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdGlvbj4KIAotICAgIDxzZWN0aW9uIGlkPSJ1c2VmdWwtZnVuY3Rpb25zLXNuZC1hc3NlcnQiPgotICAgICAgPHRpdGxlPjxmdW5jdGlvbj5zbmRfYXNzZXJ0KCk8L2Z1bmN0aW9uPjwvdGl0bGU+Ci0gICAgICA8cGFyYT4KLSAgICAgICAgPGZ1bmN0aW9uPnNuZF9hc3NlcnQoKTwvZnVuY3Rpb24+IG1hY3JvIGlzIHNpbWlsYXIgd2l0aCB0aGUKLSAgICAgIG5vcm1hbCA8ZnVuY3Rpb24+YXNzZXJ0KCk8L2Z1bmN0aW9uPiBtYWNyby4gRm9yIGV4YW1wbGUsICAKLQotICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgotICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KLTwhW0NEQVRBWwotICBzbmRfYXNzZXJ0KHBvaW50ZXIgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotXV0+Ci0gICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KLSAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+Ci0gICAgICA8L3BhcmE+Ci0KLSAgICAgIDxwYXJhPgotICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGFuZCB0aGUKLSAgICAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYWN0aW9uIGlmIGl0IGZhaWxzLiBXaGVuCi0gICAgICA8Y29uc3RhbnQ+Q09ORklHX1NORF9ERUJVRzwvY29uc3RhbnQ+LCBpcyBzZXQsIGl0IHdpbGwgc2hvdyBhbgotICAgICAgZXJyb3IgbWVzc2FnZSBzdWNoIGFzIDxjb21wdXRlcm91dHB1dD5CVUc/ICh4eHgpPC9jb21wdXRlcm91dHB1dD4KLSAgICAgIHRvZ2V0aGVyIHdpdGggc3RhY2sgdHJhY2UuCi0gICAgICA8L3BhcmE+Ci0gICAgICA8cGFyYT4KLQkgV2hlbiBubyBkZWJ1ZyBmbGFnIGlzIHNldCwgdGhpcyBtYWNybyBpcyBpZ25vcmVkLiAKLSAgICAgIDwvcGFyYT4KLSAgICA8L3NlY3Rpb24+Ci0KICAgICA8c2VjdGlvbiBpZD0idXNlZnVsLWZ1bmN0aW9ucy1zbmQtYnVnIj4KICAgICAgIDx0aXRsZT48ZnVuY3Rpb24+c25kX0JVRygpPC9mdW5jdGlvbj48L3RpdGxlPgogICAgICAgPHBhcmE+CiAgICAgICAgIEl0IHNob3dzIHRoZSA8Y29tcHV0ZXJvdXRwdXQ+QlVHPzwvY29tcHV0ZXJvdXRwdXQ+IG1lc3NhZ2UgYW5kCi0gICAgICBzdGFjayB0cmFjZSBhcyB3ZWxsIGFzIDxmdW5jdGlvbj5zbmRfYXNzZXJ0PC9mdW5jdGlvbj4gYXQgdGhlIHBvaW50LgorICAgICAgc3RhY2sgdHJhY2UgYXMgd2VsbCBhcyA8ZnVuY3Rpb24+c25kX0JVR19PTjwvZnVuY3Rpb24+IGF0IHRoZSBwb2ludC4KICAgICAgIEl0J3MgdXNlZnVsIHRvIHNob3cgdGhhdCBhIGZhdGFsIGVycm9yIGhhcHBlbnMgdGhlcmUuIAogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+CiAJIFdoZW4gbm8gZGVidWcgZmxhZyBpcyBzZXQsIHRoaXMgbWFjcm8gaXMgaWdub3JlZC4gCiAgICAgICA8L3BhcmE+CiAgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9InVzZWZ1bC1mdW5jdGlvbnMtc25kLWJ1Zy1vbiI+CisgICAgICA8dGl0bGU+PGZ1bmN0aW9uPnNuZF9CVUdfT04oKTwvZnVuY3Rpb24+PC90aXRsZT4KKyAgICAgIDxwYXJhPgorICAgICAgICA8ZnVuY3Rpb24+c25kX0JVR19PTigpPC9mdW5jdGlvbj4gbWFjcm8gaXMgc2ltaWxhciB3aXRoCisJPGZ1bmN0aW9uPldBUk5fT04oKTwvZnVuY3Rpb24+IG1hY3JvLiBGb3IgZXhhbXBsZSwgIAorCisgICAgICAgIDxpbmZvcm1hbGV4YW1wbGU+CisgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgorPCFbQ0RBVEFbCisgIHNuZF9CVUdfT04oIXBvaW50ZXIpOworXV0+CisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CisKKwlvciBpdCBjYW4gYmUgdXNlZCBhcyB0aGUgY29uZGl0aW9uLAorICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KKzwhW0NEQVRBWworICBpZiAoc25kX0JVR19PTihub25femVyb19pc19idWcpKQorICAgICAgICAgIHJldHVybiAtRUlOVkFMOworXV0+CisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CisKKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtYWNybyB0YWtlcyBhbiBjb25kaXRpb25hbCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLgorCVdoZW4gPGNvbnN0YW50PkNPTkZJR19TTkRfREVCVUc8L2NvbnN0YW50PiwgaXMgc2V0LCB0aGUKKwlleHByZXNzaW9uIGlzIGFjdHVhbGx5IGV2YWx1YXRlZC4gSWYgaXQncyBub24temVybywgaXQgc2hvd3MKKwl0aGUgd2FybmluZyBtZXNzYWdlIHN1Y2ggYXMKKwk8Y29tcHV0ZXJvdXRwdXQ+QlVHPyAoeHh4KTwvY29tcHV0ZXJvdXRwdXQ+CisJbm9ybWFsbHkgZm9sbG93ZWQgYnkgc3RhY2sgdHJhY2UuICBJdCByZXR1cm5zIHRoZSBldmFsdWF0ZWQKKwl2YWx1ZS4KKwlXaGVuIG5vIDxjb25zdGFudD5DT05GSUdfU05EX0RFQlVHPC9jb25zdGFudD4gaXMgc2V0LCB0aGlzCisJbWFjcm8gYWx3YXlzIHJldHVybnMgemVyby4KKyAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdGlvbj4KKwogICA8L2NoYXB0ZXI+CiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9kYXBtLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvZGFwbS50eHQKaW5kZXggYjJlZDY5OC4uNDZmOTY4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9kYXBtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2RhcG0udHh0CkBAIC0xMzUsMTEgKzEzNSw3IEBACiAKIHN0YXRpYyBpbnQgc3BpdHpfbWljX2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQqIHcsIGludCBldmVudCkKIHsKLQlpZihTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9NSUNfQklBUyk7Ci0JZWxzZQotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LCBTUElUWl9TQ1AyX01JQ19CSUFTKTsKLQorCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTUlDX0JJQVMsIFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjksMTEgKzI2NSw3IEBACiAvKiB0dXJuIHNwZWFrZXIgYW1wbGlmaWVyIG9uL29mZiBkZXBlbmRpbmcgb24gdXNlICovCiBzdGF0aWMgaW50IGNvcmdpX2FtcF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQogewotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQotCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfQVBNX09OKTsKLQllbHNlCi0JCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX0FQTV9PTik7Ci0KKwlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX0FQTV9PTiwgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BhcmMvc2J1c19kcml2ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vc3BhcmMvc2J1c19kcml2ZXJzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZTI4YS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwYXJjL3NidXNfZHJpdmVycy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotCi0JCVdyaXRpbmcgU0JVUyBEcml2ZXJzCi0KLQkgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQotCi0JVGhlIFNCVVMgZHJpdmVyIGludGVyZmFjZXMgb2YgdGhlIExpbnV4IGtlcm5lbCBoYXZlIGJlZW4KLXJldmFtcGVkIGNvbXBsZXRlbHkgZm9yIDIuNC54IGZvciBzZXZlcmFsIHJlYXNvbnMuICBGb3JlbW9zdCB3ZXJlCi1wZXJmb3JtYW5jZSBhbmQgY29tcGxleGl0eSBjb25jZXJucy4gIFRoaXMgZG9jdW1lbnQgZGV0YWlscyB0aGVzZQotbmV3IGludGVyZmFjZXMgYW5kIGhvdyB0aGV5IGFyZSB1c2VkIHRvIHdyaXRlIGFuIFNCVVMgZGV2aWNlIGRyaXZlci4KLQotCVNCVVMgZHJpdmVycyBuZWVkIHRvIGluY2x1ZGUgPGFzbS9zYnVzLmg+IHRvIGdldCBhY2Nlc3MKLXRvIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcyBkZXNjcmliZWQgaGVyZS4KLQotCQlQcm9iaW5nIGFuZCBEZXRlY3Rpb24KLQotCUVhY2ggU0JVUyBkZXZpY2UgaW5zaWRlIHRoZSBtYWNoaW5lIGlzIGRlc2NyaWJlZCBieSBhCi1zdHJ1Y3R1cmUgY2FsbGVkICJzdHJ1Y3Qgc2J1c19kZXYiLiAgTGlrZXdpc2UsIGVhY2ggU0JVUyBidXMKLWZvdW5kIGluIHRoZSBzeXN0ZW0gaXMgZGVzY3JpYmVkIGJ5IGEgInN0cnVjdCBzYnVzX2J1cyIuICBGb3IKLWVhY2ggU0JVUyBidXMsIHRoZSBkZXZpY2VzIHVuZGVybmVhdGggYXJlIGh1bmcgaW4gYSB0cmVlLWxpa2UKLWZhc2hpb24gb2ZmIG9mIHRoZSBidXMgc3RydWN0dXJlLgotCi0JVGhlIFNCVVMgZGV2aWNlIHN0cnVjdHVyZSBjb250YWlucyBlbm91Z2ggaW5mb3JtYXRpb24KLWZvciB5b3UgdG8gaW1wbGVtZW50IHlvdXIgZGV2aWNlIHByb2JpbmcgYWxnb3JpdGhtIGFuZCBvYnRhaW4KLXRoZSBiaXRzIG5lY2Vzc2FyeSB0byBydW4geW91ciBkZXZpY2UuICBUaGUgbW9zdCBjb21tb25seQotdXNlZCBtZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlLCBhbmQgdGhlaXIgdHlwaWNhbCB1c2FnZSwKLXdpbGwgYmUgZGV0YWlsZWQgYmVsb3cuCi0KLQlIZXJlIGlzIGEgcGllY2Ugb2Ygc2tlbGV0b24gY29kZSBmb3IgcGVyZm9ybWluZyBhIGRldmljZQotcHJvYmUgaW4gYW4gU0JVUyBkcml2ZXIgdW5kZXIgTGludXg6Ci0KLQlzdGF0aWMgaW50IF9fZGV2aW5pdCBteWRldmljZV9wcm9iZV9vbmUoc3RydWN0IHNidXNfZGV2ICpzZGV2KQotCXsKLQkJc3RydWN0IG15c2RldmljZSAqbXAgPSBremFsbG9jKHNpemVvZigqbXApLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAoIW1wKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJLi4uCi0JCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBtcCk7Ci0JCXJldHVybiAwOwotCQkuLi4KLQl9Ci0KLQlzdGF0aWMgaW50IF9fZGV2aW5pdCBteWRldmljZV9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCi0JewotCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwotCi0JCXJldHVybiBteWRldmljZV9wcm9iZV9vbmUoc2Rldik7Ci0JfQotCi0Jc3RhdGljIGludCBfX2RldmV4aXQgbXlkZXZpY2VfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKLQl7Ci0JCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7Ci0JCXN0cnVjdCBteWRldmljZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKLQotCQlyZXR1cm4gbXlkZXZpY2VfcmVtb3ZlX29uZShzZGV2LCBtcCk7Ci0JfQotCi0Jc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXlkZXZpY2VfbWF0Y2hbXSA9IHsKLQkJewotCQkJLm5hbWUgPSAibXlkZXZpY2UiLAotCQl9LAotCQl7fSwKLQl9OwotCi0JTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXlkZXZpY2VfbWF0Y2gpOwotCi0Jc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXlkZXZpY2VfZHJpdmVyID0gewotCQkubWF0Y2hfdGFibGUJPSBteWRldmljZV9tYXRjaCwKLQkJLnByb2JlCQk9IG15ZGV2aWNlX3Byb2JlLAotCQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG15ZGV2aWNlX3JlbW92ZSksCi0JCS5kcml2ZXIJCT0gewotCQkJLm5hbWUJCT0gIm15ZGV2aWNlIiwKLQkJfSwKLQl9OwotCi0Jc3RhdGljIGludCBfX2luaXQgbXlkZXZpY2VfaW5pdCh2b2lkKQotCXsKLQkJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmbXlkZXZpY2VfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgX19leGl0IG15ZGV2aWNlX2V4aXQodm9pZCkKLQl7Ci0JCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZteWRldmljZV9kcml2ZXIpOwotCX0KLQotCW1vZHVsZV9pbml0KG15ZGV2aWNlX2luaXQpOwotCW1vZHVsZV9leGl0KG15ZGV2aWNlX2V4aXQpOwotCi0JVGhlIG15ZGV2aWNlX21hdGNoIHRhYmxlIGlzIGEgc2VyaWVzIG9mIGVudHJpZXMgd2hpY2gKLWRlc2NyaWJlcyB3aGF0IFNCVVMgZGV2aWNlcyB5b3VyIGRyaXZlciBpcyBtZWFudCBmb3IuICBJbiB0aGUKLXNpbXBsZXN0IGNhc2UgeW91IHNwZWNpZnkgYSBzdHJpbmcgZm9yIHRoZSAnbmFtZScgZmllbGQuICBFdmVyeQotU0JVUyBkZXZpY2Ugd2l0aCBhICduYW1lJyBwcm9wZXJ0eSBtYXRjaGluZyB5b3VyIHN0cmluZyB3aWxsCi1iZSBwYXNzZWQgb25lLWJ5LW9uZSB0byB5b3VyIC5wcm9iZSBtZXRob2QuCi0KLQlZb3Ugc2hvdWxkIHN0b3JlIGF3YXkgeW91ciBkZXZpY2UgcHJpdmF0ZSBzdGF0ZSBzdHJ1Y3R1cmUKLXBvaW50ZXIgaW4gdGhlIGRydmRhdGEgYXJlYSBzbyB0aGF0IHlvdSBjYW4gcmV0cmlldmUgaXQgbGF0ZXIgb24KLWluIHlvdXIgLnJlbW92ZSBtZXRob2QuCi0KLQlBbnkgbWVtb3J5IGFsbG9jYXRlZCwgcmVnaXN0ZXJzIG1hcHBlZCwgSVJRcyByZWdpc3RlcmVkLAotZXRjLiBtdXN0IGJlIHVuZG9uZSBieSB5b3VyIC5yZW1vdmUgbWV0aG9kIHNvIHRoYXQgYWxsIHJlc291cmNlcwotb2YgeW91ciBkZXZpY2UgYXJlIHJlbGVhc2VkIGJ5IHRoZSB0aW1lIGl0IHJldHVybnMuCi0KLQlZb3Ugc2hvdWxkIF9OT1RfIHVzZSB0aGUgZm9yX2VhY2hfc2J1cygpLCBmb3JfZWFjaF9zYnVzZGV2KCksCi1hbmQgZm9yX2FsbF9zYnVzZGV2KCkgaW50ZXJmYWNlcy4gIFRoZXkgYXJlIGRlcHJlY2F0ZWQsIHdpbGwgYmUKLXJlbW92ZWQsIGFuZCBubyBuZXcgZHJpdmVyIHNob3VsZCByZWZlcmVuY2UgdGhlbSBldmVyLgotCi0JCU1hcHBpbmcgYW5kIEFjY2Vzc2luZyBJL08gUmVnaXN0ZXJzCi0KLQlFYWNoIFNCVVMgZGV2aWNlIHN0cnVjdHVyZSBjb250YWlucyBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycwotd2hpY2ggZGVzY3JpYmUgZWFjaCByZWdpc3RlciBzZXQuIFdlIGFidXNlIHN0cnVjdCByZXNvdXJjZSBmb3IgdGhhdC4KLVRoZXkgZWFjaCBjb3JyZXNwb25kIHRvIHRoZSAicmVnIiBwcm9wZXJ0aWVzIHByb3ZpZGVkIGJ5IHRoZSBPQlAgZmlybXdhcmUuCi0KLQlCZWZvcmUgeW91IGNhbiBhY2Nlc3MgeW91ciBkZXZpY2UncyByZWdpc3RlcnMgeW91IG11c3QgbWFwCi10aGVtLiAgQW5kIGxhdGVyIGlmIHlvdSB3aXNoIHRvIHNodXRkb3duIHlvdXIgZHJpdmVyIChmb3IgbW9kdWxlCi11bmxvYWQgb3Igc2ltaWxhcikgeW91IG11c3QgdW5tYXAgdGhlbS4gIFlvdSBtdXN0IHRyZWF0IHRoZW0gYXMKLWEgcmVzb3VyY2UsIHdoaWNoIHlvdSBhbGxvY2F0ZSAobWFwKSBiZWZvcmUgdXNpbmcgYW5kIGZyZWUgdXAKLSh1bm1hcCkgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KLQotCVRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhbiBvcGFxdWUgdmFsdWUKLXR5cGVkIGFzIGFuICJ1bnNpZ25lZCBsb25nIi4gIFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZQotb2YgdGhlIG1hcHBpbmcgaW50ZXJmYWNlLCBhbmQgdGhlIGFyZ3VtZW50cyB0byB0aGUgdW5tYXBwaW5nCi1pbnRlcmZhY2UuICBMZXQncyBzYXkgeW91IHdhbnQgdG8gbWFwIHRoZSBmaXJzdCBzZXQgb2YgcmVnaXN0ZXJzLgotUGVyaGFwcyBwYXJ0IG9mIHlvdXIgZHJpdmVyIHNvZnR3YXJlIHN0YXRlIHN0cnVjdHVyZSBsb29rcyBsaWtlOgotCi0Jc3RydWN0IG15ZGV2aWNlIHsKLQkJdW5zaWduZWQgbG9uZyBjb250cm9sX3JlZ3M7Ci0JICAgLi4uCi0JCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKLQkgICAuLi4KLQl9OwotCi0JQXQgaW5pdGlhbGl6YXRpb24gdGltZSB5b3UgdGhlbiB1c2UgdGhlIHNidXNfaW9yZW1hcAotaW50ZXJmYWNlIHRvIG1hcCBpbiB5b3VyIHJlZ2lzdGVycywgbGlrZSBzbzoKLQotCXN0YXRpYyB2b2lkIGluaXRfb25lX215ZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqc2RldikKLQl7Ci0JCXN0cnVjdCBteWRldmljZSAqbXA7Ci0JCS4uLgotCi0JCW1wLT5jb250cm9sX3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJCQlDT05UUk9MX1JFR1NfU0laRSwgIm15ZGV2aWNlIHJlZ3MiKTsKLQkJaWYgKCFtcC0+Y29udHJvbF9yZWdzKSB7Ci0JCQkvKiBGYWlsdXJlLCBjbGVhbnVwIGFuZCByZXR1cm4uICovCi0JCX0KLQl9Ci0KLQlTZWNvbmQgYXJndW1lbnQgdG8gc2J1c19pb3JlbWFwIGlzIGFuIG9mZnNldCBmb3IKLWNyYW5reSBkZXZpY2VzIHdpdGggYnJva2VuIE9CUCBQUk9NLiBUaGUgc2J1c19pb3JlbWFwIHVzZXMgb25seQotYSBzdGFydCBhZGRyZXNzIGFuZCBmbGFncyBmcm9tIHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmUuCi1UaGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIHJlc291cmNlIHRvIG1hcAotc2V2ZXJhbCBzZXRzIG9mIHJlZ2lzdGVycyBvciBldmVuIHRvIGZhYnJpY2F0ZSBhIHJlc291cmNlCi1zdHJ1Y3R1cmUgaWYgZHJpdmVyIGdldHMgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIHNvbWUgcHJpdmF0ZSBwbGFjZS4KLVRoaXMgcHJhY3RpY2UgaXMgZGlzY291cmFnZWQgdGhvdWdoLiBVc2Ugd2hhdGV2ZXIgT0JQIFBST00KLXByb3ZpZGVkIHRvIHlvdS4KLQotCUFuZCBoZXJlIGlzIGhvdyB5b3UgbWlnaHQgdW5tYXAgdGhlc2UgcmVnaXN0ZXJzIGxhdGVyIGF0Ci1kcml2ZXIgc2h1dGRvd24gb3IgbW9kdWxlIHVubG9hZCB0aW1lLCB1c2luZyB0aGUgc2J1c19pb3VubWFwCi1pbnRlcmZhY2U6Ci0KLQlzdGF0aWMgdm9pZCBteWRldmljZV91bm1hcF9yZWdzKHN0cnVjdCBteWRldmljZSAqbXApCi0JewotCQlzYnVzX2lvdW5tYXAobXAtPmNvbnRyb2xfcmVncywgQ09OVFJPTF9SRUdTX1NJWkUpOwotCX0KLQotCUZpbmFsbHksIHRvIGFjdHVhbGx5IGFjY2VzcyB5b3VyIHJlZ2lzdGVycyB0aGVyZSBhcmUgNgotaW50ZXJmYWNlIHJvdXRpbmVzIGF0IHlvdXIgZGlzcG9zYWwuICBBY2Nlc3NlcyBhcmUgYnl0ZSAoOCBiaXQpLAotd29yZCAoMTYgYml0KSwgb3IgbG9uZ3dvcmQgKDMyIGJpdCkgc2l6ZWQuICBIZXJlIHRoZXkgYXJlOgotCi0JdTggc2J1c19yZWFkYih1bnNpZ25lZCBsb25nIHJlZykJCS8qIHJlYWQgYnl0ZSAqLwotCXUxNiBzYnVzX3JlYWR3KHVuc2lnbmVkIGxvbmcgcmVnKQkJLyogcmVhZCB3b3JkICovCi0JdTMyIHNidXNfcmVhZGwodW5zaWduZWQgbG9uZyByZWcpCQkvKiByZWFkIGxvbmd3b3JkICovCi0Jdm9pZCBzYnVzX3dyaXRlYih1OCB2YWx1ZSwgdW5zaWduZWQgbG9uZyByZWcpCS8qIHdyaXRlIGJ5dGUgKi8KLQl2b2lkIHNidXNfd3JpdGV3KHUxNiB2YWx1ZSwgdW5zaWduZWQgbG9uZyByZWcpCS8qIHdyaXRlIHdvcmQgKi8KLQl2b2lkIHNidXNfd3JpdGVsKHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyByZWcpCS8qIHdyaXRlIGxvbmd3b3JkICovCi0KLQlTbywgbGV0J3Mgc2F5IHlvdXIgZGV2aWNlIGhhcyBhIGNvbnRyb2wgcmVnaXN0ZXIgb2Ygc29tZSBzb3J0Ci1hdCBvZmZzZXQgemVyby4gIFRoZSBmb2xsb3dpbmcgbWlnaHQgaW1wbGVtZW50IHJlc2V0dGluZyB5b3VyIGRldmljZToKLQotCSNkZWZpbmUgQ09OVFJPTAkJMHgwMFVMCi0KLQkjZGVmaW5lIENPTlRST0xfUkVTRVQJMHgwMDAwMDAwMQkvKiBSZXNldCBoYXJkd2FyZSAqLwotCi0Jc3RhdGljIHZvaWQgbXlkZXZpY2VfcmVzZXQoc3RydWN0IG15ZGV2aWNlICptcCkKLQl7Ci0JCXNidXNfd3JpdGVsKENPTlRST0xfUkVTRVQsIG1wLT5yZWdzICsgQ09OVFJPTCk7Ci0JfQotCi0JT3IgcGVyaGFwcyB0aGVyZSBpcyBhIGRhdGEgcG9ydCByZWdpc3RlciBhdCBhbiBvZmZzZXQgb2YKLTE2IGJ5dGVzIHdoaWNoIGFsbG93cyB5b3UgdG8gcmVhZCBieXRlcyBmcm9tIGEgZmlmbyBpbiB0aGUgZGV2aWNlOgotCi0JI2RlZmluZSBEQVRBCQkweDEwVUwKLQotCXN0YXRpYyB1OCBteWRldmljZV9nZXRfYnl0ZShzdHJ1Y3QgbXlkZXZpY2UgKm1wKQotCXsKLQkJcmV0dXJuIHNidXNfcmVhZGIobXAtPnJlZ3MgKyBEQVRBKTsKLQl9Ci0KLQlJdCdzIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGFuZCBjbHVlZnVsIHJlYWRlcnMgbWF5IGhhdmUKLW5vdGljZWQgdGhhdCB0aGVzZSBpbnRlcmZhY2VzIG1pbWljayB0aGUgUENJIGludGVyZmFjZXMgb2YgdGhlCi1MaW51eCBrZXJuZWwuICBUaGlzIHdhcyBub3QgYnkgYWNjaWRlbnQuCi0KLQlXQVJOSU5HOgotCi0JCURPIE5PVCB0cnkgdG8gdHJlYXQgdGhlc2Ugb3BhcXVlIHJlZ2lzdGVyIG1hcHBpbmcKLQkJdmFsdWVzIGFzIGEgbWVtb3J5IG1hcHBlZCBwb2ludGVyIHRvIHNvbWUgc3RydWN0dXJlCi0JCXdoaWNoIHlvdSBjYW4gZGVyZWZlcmVuY2UuCi0KLQkJSXQgbWF5IGJlIG1lbW9yeSBtYXBwZWQsIGl0IG1heSBub3QgYmUuICBJbiBmYWN0IGl0Ci0JCWNvdWxkIGJlIGEgcGh5c2ljYWwgYWRkcmVzcywgb3IgaXQgY291bGQgYmUgdGhlIHRpbWUKLQkJb2YgZGF5IHhvcidkIHdpdGggMHhkZWFkYmVlZi4gIDotKQotCi0JCVdoYXRldmVyIGl0IGlzLCBpdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFRoZQotCQlpbnRlcmZhY2Ugd2FzIGRvbmUgdGhpcyB3YXkgdG8gc2hpZWxkIHRoZSBkcml2ZXIKLQkJYXV0aG9yIGZyb20gc3VjaCBjb21wbGV4aXRpZXMuCi0KLQkJCURvaW5nIERWTUEKLQotCVNCVVMgZGV2aWNlcyBjYW4gcGVyZm9ybSBETUEgdHJhbnNhY3Rpb25zIGluIGEgd2F5IHNpbWlsYXIKLXRvIFBDSSBidXQgZGlzc2ltaWxhciB0byBJU0EsIGUuZy4gRE1BIG1hc3RlcnMgc3VwcGx5IGFkZHJlc3MuCi1JbiBjb250cmFzdCB0byBQQ0ksIGhvd2V2ZXIsIHRoYXQgYWRkcmVzcyAoYSBidXMgYWRkcmVzcykgaXMKLXRyYW5zbGF0ZWQgYnkgSU9NTVUgYmVmb3JlIGEgbWVtb3J5IGFjY2VzcyBpcyBwZXJmb3JtZWQgYW5kIHRoZXJlZm9yZQotaXQgaXMgdmlydHVhbC4gU3VuIGNhbGxzIHRoaXMgcHJvY2VkdXJlIERWTUEuCi0KLQlMaW51eCBzdXBwb3J0cyB0d28gc3R5bGVzIG9mIHVzaW5nIFNCVVMgRFZNQTogImNvbnNpc3RlbnQgbWVtb3J5IgotYW5kICJzdHJlYW1pbmcgRFZNQSIuIENQVSB2aWV3IG9mIGNvbnNpc3RlbnQgbWVtb3J5IGNodW5rIGlzLCB3ZWxsLAotY29uc2lzdGVudCB3aXRoIGEgdmlldyBvZiBhIGRldmljZS4gVGhpbmsgb2YgaXQgYXMgYW4gdW5jYWNoZWQgbWVtb3J5LgotVHlwaWNhbGx5IHRoaXMgd2F5IG9mIGRvaW5nIERWTUEgaXMgbm90IHZlcnkgZmFzdCBhbmQgZHJpdmVycyB1c2UgaXQKLW1vc3RseSBmb3IgY29udHJvbCBibG9ja3Mgb3IgcXVldWVzLiBPbiBzb21lIENQVXMgd2UgY2Fubm90IGZsdXNoIG9yCi1pbnZhbGlkYXRlIGluZGl2aWR1YWwgcGFnZXMgb3IgY2FjaGUgbGluZXMgYW5kIGRvaW5nIGV4cGxpY2l0IGZsdXNoaW5nCi1vdmVyIGV2ZXIgbGl0dGxlIGJ5dGUgaW4gZXZlcnkgY29udHJvbCBibG9jayB3b3VsZCBiZSB3YXN0ZWZ1bC4KLQotU3RyZWFtaW5nIERWTUEgaXMgYSBwcmVmZXJyZWQgd2F5IHRvIHRyYW5zZmVyIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4KLVRoaXMgcHJvY2VzcyB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIHdheToKLTEuIGEgQ1BVIHN0b3BzIGFjY2Vzc2luZyBhIGNlcnRhaW4gcGFydCBvZiBtZW1vcnksCi0gICBmbHVzaGVzIGl0cyBjYWNoZXMgY292ZXJpbmcgdGhhdCBtZW1vcnk7Ci0yLiBhIGRldmljZSBkb2VzIERWTUEgYWNjZXNzZXMsIHRoZW4gcG9zdHMgYW4gaW50ZXJydXB0OwotMy4gQ1BVIGludmFsaWRhdGVzIGl0cyBjYWNoZXMgYW5kIHN0YXJ0cyB0byBhY2Nlc3MgdGhlIG1lbW9yeS4KLQotQSBzaW5nbGUgc3RyZWFtaW5nIERWTUEgb3BlcmF0aW9uIGNhbiB0b3VjaCBzZXZlcmFsIGRpc2NvbnRpZ3VvdXMKLXJlZ2lvbnMgb2YgYSB2aXJ0dWFsIGJ1cyBhZGRyZXNzIHNwYWNlLiBUaGlzIGlzIGNhbGxlZCBhIHNjYXR0ZXItZ2F0aGVyCi1EVk1BLgotCi1bVEJEOiBXaHkgZG8gbm90IHdlIG5laXRoZXIgU29sYXJpcyBhdHRlbXB0IHRvIG1hcCBkaXNqb2ludCBwYWdlcwotaW50byBhIHNpbmdsZSB2aXJ0dWFsIGNodW5rIHdpdGggdGhlIGhlbHAgb2YgSU9NTVUsIHNvIHRoYXQgbm9uIFNHCi1EVk1BIG1hc3RlcnMgd291bGQgZG8gU0c/IEl0J2QgYmUgdmVyeSBoZWxwZnVsIGZvciBSQUlELl0KLQotCUluIG9yZGVyIHRvIHBlcmZvcm0gYSBjb25zaXN0ZW50IERWTUEgYSBkcml2ZXIgZG9lcyBzb21ldGhpbmcKLWxpa2UgdGhlIGZvbGxvd2luZzoKLQotCWNoYXIgKm1lbTsJCS8qIEFkZHJlc3MgaW4gdGhlIENQVSBzcGFjZSAqLwotCXUzMiBidXNhOwkJLyogQWRkcmVzcyBpbiB0aGUgU0J1cyBzcGFjZSAqLwotCi0JbWVtID0gKGNoYXIgKikgc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsIE1ZTUVNU0laRSwgJmJ1c2EpOwotCi0JVGhlbiBtZW0gaXMgdXNlZCB3aGVuIENQVSBhY2Nlc3NlcyB0aGlzIG1lbW9yeSBhbmQgdTMyCi1pcyBmZWQgdG8gdGhlIGRldmljZSBzbyB0aGF0IGl0IGNhbiBkbyBEVk1BLiBUaGlzIGlzIHR5cGljYWxseQotZG9uZSB3aXRoIGFuIHNidXNfd3JpdGVsKCkgaW50byBzb21lIGRldmljZSByZWdpc3Rlci4KLQotCURvIG5vdCBmb3JnZXQgdG8gZnJlZSB0aGUgRFZNQSByZXNvdXJjZXMgb25jZSB5b3UgYXJlIGRvbmU6Ci0KLQlzYnVzX2ZyZWVfY29uc2lzdGVudChzZGV2LCBNWU1FTVNJWkUsIG1lbSwgYnVzYSk7Ci0KLQlTdHJlYW1pbmcgRFZNQSBpcyBtb3JlIGludGVyZXN0aW5nLiBGaXJzdCB5b3UgYWxsb2NhdGUgc29tZQotbWVtb3J5IHN1aXRhYmxlIGZvciBpdCBvciBwaW4gZG93biBzb21lIHVzZXIgcGFnZXMuIFRoZW4gaXQgYWxsIHdvcmtzCi1saWtlIHRoaXM6Ci0KLQljaGFyICptZW0gPSBhcmd1bWVuMTsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGFyZ3VtZW50MjsKLQl1MzIgYnVzYTsJCS8qIEFkZHJlc3MgaW4gdGhlIFNCdXMgc3BhY2UgKi8KLQotCSptZW0gPSAxOwkJLyogQ1BVIGNhbiBhY2Nlc3MgKi8KLQlidXNhID0gc2J1c19tYXBfc2luZ2xlKHNkZXYsIG1lbSwgc2l6ZSk7Ci0JaWYgKGJ1c2EgPT0gMCkgLi4uLi4uLgotCi0JLyogVGVsbCB0aGUgZGV2aWNlIHRvIHVzZSBidXNhIGhlcmUgKi8KLQkvKiBDUFUgY2Fubm90IGFjY2VzcyB0aGUgbWVtb3J5IHdpdGhvdXQgc2J1c19kbWFfc3luY19zaW5nbGUoKSAqLwotCi0Jc2J1c191bm1hcF9zaW5nbGUoc2RldiwgYnVzYSwgc2l6ZSk7Ci0JaWYgKCptZW0gPT0gMCkgLi4uLgkvKiBDUFUgY2FuIGFjY2VzcyBhZ2FpbiAqLwotCi0JSXQgaXMgcG9zc2libGUgdG8gcmV0YWluIG1hcHBpbmdzIGFuZCBhc2sgdGhlIGRldmljZSB0bwotYWNjZXNzIGRhdGEgYWdhaW4gYW5kIGFnYWluIHdpdGhvdXQgY2FsbGluZyBzYnVzX3VubWFwX3NpbmdsZS4KLUhvd2V2ZXIsIENQVSBjYWNoZXMgbXVzdCBiZSBpbnZhbGlkYXRlZCB3aXRoIHNidXNfZG1hX3N5bmNfc2luZ2xlCi1iZWZvcmUgc3VjaCBhY2Nlc3MuCi0KLVtUQkQgYnV0IHdoYXQgYWJvdXQgd3JpdGViYWNrIGNhY2hlcyBoZXJlLi4uIGRvIHdlIGhhdmUgYW55P10KLQotCVRoZXJlIGlzIGFuIGVxdWl2YWxlbnQgc2V0IG9mIGZ1bmN0aW9ucyBkb2luZyB0aGUgc2FtZSB0aGluZwotb25seSB3aXRoIHNldmVyYWwgbWVtb3J5IHNlZ21lbnRzIGF0IG9uY2UgZm9yIGRldmljZXMgY2FwYWJsZSBvZgotc2NhdHRlci1nYXRoZXIgdHJhbnNmZXJzLiBVc2UgdGhlIFNvdXJjZSwgTHVrZS4KLQotCQkJRXhhbXBsZXMKLQotCWRyaXZlcnMvbmV0L3N1bmhtZS5jCi0JVGhpcyBpcyBhIGNvbXBsaWNhdGVkIGRyaXZlciB3aGljaCBpbGx1c3RyYXRlcyBtYW55IGNvbmNlcHRzCi1kaXNjdXNzZWQgYWJvdmUgYW5kIHBsdXMgaXQgaGFuZGxlcyBib3RoIFBDSSBhbmQgU0JVUyBib2FyZHMuCi0KLQlkcml2ZXJzL3Njc2kvZXNwLmMKLQlDaGVjayBpdCBvdXQgZm9yIHNjYXR0ZXItZ2F0aGVyIERWTUEuCi0KLQlkcml2ZXJzL3NidXMvY2hhci9icHAuYwotCUEgbm9uLURWTUEgZGV2aWNlLgotCi0JZHJpdmVycy9uZXQvc3VubGFuY2UuYwotCUxhbmNlIGRyaXZlciBhYnVzZXMgY29uc2lzdGVudCBtYXBwaW5ncyBmb3IgZGF0YSB0cmFuc2Zlci4KLUl0IGlzIGEgbmlmdHkgdHJpY2sgd2hpY2ggd2UgZG8gbm90IHBhcnRpY3VsYXJseSByZWNvbW1lbmQuLi4KLUp1c3QgY2hlY2sgaXQgb3V0IGFuZCBrbm93IHRoYXQgaXQncyBsZWdhbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3B4YTJ4eCBiL0RvY3VtZW50YXRpb24vc3BpL3B4YTJ4eAppbmRleCBiYmU4ZGVlLi42YmI5MTZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9weGEyeHgKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvcHhhMnh4CkBAIC05Niw3ICs5Niw3IEBACiBpbmZvcm1hdGlvbiB2aWEgdGhlIHN0cnVjdHVyZSAicHhhMnh4X3NwaV9jaGlwIiBmb3VuZCBpbgogImFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyeHhfc3BpLmgiLiAgVGhlIHB4YTJ4eF9zcGkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyCiB3aWxsIHVzZXMgdGhlIGNvbmZpZ3VyYXRpb24gd2hlbmV2ZXIgdGhlIGRyaXZlciBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgc2xhdmUKLWRldmljZS4KK2RldmljZS4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuCiAKIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgewogCXU4IHR4X3RocmVzaG9sZDsKQEAgLTExMiwxNCArMTEyLDE3IEBACiBwZXJmb3JtYW5jZSBvZiBweGEyeHhfc3BpIGRyaXZlciBhbmQgbWlzY29uZmlndXJhdGlvbiB3aWxsIHJlc3VsdCBpbiByeAogZmlmbyBvdmVycnVucyAoZXNwZWNpYWxseSBpbiBQSU8gbW9kZSB0cmFuc2ZlcnMpLiBHb29kIGRlZmF1bHQgdmFsdWVzIGFyZQogCi0JLnR4X3RocmVzaG9sZCA9IDEyLAotCS5yeF90aHJlc2hvbGQgPSA0LAorCS50eF90aHJlc2hvbGQgPSA4LAorCS5yeF90aHJlc2hvbGQgPSA4LAorCitUaGUgcmFuZ2UgaXMgMSB0byAxNiB3aGVyZSB6ZXJvIGluZGljYXRlcyAidXNlIGRlZmF1bHQiLgogCiBUaGUgInB4YTJ4eF9zcGlfY2hpcC5kbWFfYnVyc3Rfc2l6ZSIgZmllbGQgaXMgdXNlZCB0byBjb25maWd1cmUgUFhBMnh4IERNQQogZW5naW5lIGFuZCBpcyByZWxhdGVkIHRoZSAic3BpX2RldmljZS5iaXRzX3Blcl93b3JkIiBmaWVsZC4gIFJlYWQgYW5kIHVuZGVyc3RhbmQKIHRoZSBQWEEyeHggIkRldmVsb3BlciBNYW51YWwiIHNlY3Rpb25zIG9uIHRoZSBETUEgY29udHJvbGxlciBhbmQgU1NQIENvbnRyb2xsZXJzCiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmFsdWUuIEFuIFNTUCBjb25maWd1cmVkIGZvciBieXRlLXdpZGUgdHJhbnNmZXJzIHdvdWxkCi11c2UgYSB2YWx1ZSBvZiA4LgordXNlIGEgdmFsdWUgb2YgOC4gVGhlIGRyaXZlciB3aWxsIGRldGVybWluZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBpZgorZG1hX2J1cnN0X3NpemUgPT0gMC4KIAogVGhlICJweGEyeHhfc3BpX2NoaXAudGltZW91dCIgZmllbGRzIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkgaGFuZGxlCiB0cmFpbGluZyBieXRlcyBpbiB0aGUgU1NQIHJlY2VpdmVyIGZpZm8uICBUaGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcwpAQCAtMTM3LDcgKzE0MCwxMyBAQAogTlVMTCwgdGhlIHB4YTJ4eF9zcGkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIGFzc3VtZXMgdGhhdCB0aGUgU1NQIHBvcnQgaXMKIGNvbmZpZ3VyZWQgdG8gdXNlIFNTUEZSTSBpbnN0ZWFkLgogCi1OU1NQIFNBTFZFIFNBTVBMRQorTk9URTogdGhlIFNQSSBkcml2ZXIgY2Fubm90IGNvbnRyb2wgdGhlIGNoaXAgc2VsZWN0IGlmIFNTUEZSTSBpcyB1c2VkLCBzbyB0aGUKK2NoaXBzZWxlY3QgaXMgZHJvcHBlZCBhZnRlciBlYWNoIHNwaV90cmFuc2Zlci4gIE1vc3QgZGV2aWNlcyBuZWVkIGNoaXAgc2VsZWN0Cithc3NlcnRlZCBhcm91bmQgdGhlIGNvbXBsZXRlIG1lc3NhZ2UuICBVc2UgU1NQRlJNIGFzIGEgR1BJTyAodGhyb3VnaCBjc19jb250cm9sKQordG8gYWNjb21vZGF0ZSB0aGVzZSBjaGlwcy4KKworCitOU1NQIFNMQVZFIFNBTVBMRQogLS0tLS0tLS0tLS0tLS0tLS0KIFRoZSBweGEyeHhfc3BpX2NoaXAgc3RydWN0dXJlIGlzIHBhc3NlZCB0byB0aGUgcHhhMnh4X3NwaSBkcml2ZXIgaW4gdGhlCiAic3BpX2JvYXJkX2luZm8uY29udHJvbGxlcl9kYXRhIiBmaWVsZC4gQmVsb3cgaXMgYSBzYW1wbGUgY29uZmlndXJhdGlvbiB1c2luZwpAQCAtMjA2LDE4ICsyMTUsMjEgQEAKIAogRE1BIGFuZCBQSU8gSS9PIFN1cHBvcnQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgcHhhMnh4X3NwaSBkcml2ZXIgc3VwcG9ydCBib3RoIERNQSBhbmQgaW50ZXJydXB0IGRyaXZlbiBQSU8gbWVzc2FnZQotdHJhbnNmZXJzLiAgVGhlIGRyaXZlciBkZWZhdWx0cyB0byBQSU8gbW9kZSBhbmQgRE1BIHRyYW5zZmVycyBtdXN0IGVuYWJsZWQgYnkKLXNldHRpbmcgdGhlICJlbmFibGVfZG1hIiBmbGFnIGluIHRoZSAicHhhMnh4X3NwaV9tYXN0ZXIiIHN0cnVjdHVyZSBhbmQKLWVuc3VyaW5nIHRoYXQgdGhlICJweGEyeHhfc3BpX2NoaXAuZG1hX2J1cnN0X3NpemUiIGZpZWxkIGlzIG5vbi16ZXJvLiAgVGhlIERNQQotbW9kZSBzdXBwb3J0IGJvdGggY29oZXJlbnQgYW5kIHN0cmVhbSBiYXNlZCBETUEgbWFwcGluZ3MuCitUaGUgcHhhMnh4X3NwaSBkcml2ZXIgc3VwcG9ydHMgYm90aCBETUEgYW5kIGludGVycnVwdCBkcml2ZW4gUElPIG1lc3NhZ2UKK3RyYW5zZmVycy4gIFRoZSBkcml2ZXIgZGVmYXVsdHMgdG8gUElPIG1vZGUgYW5kIERNQSB0cmFuc2ZlcnMgbXVzdCBiZSBlbmFibGVkCitieSBzZXR0aW5nIHRoZSAiZW5hYmxlX2RtYSIgZmxhZyBpbiB0aGUgInB4YTJ4eF9zcGlfbWFzdGVyIiBzdHJ1Y3R1cmUuICBUaGUgRE1BCittb2RlIHN1cHBvcnRzIGJvdGggY29oZXJlbnQgYW5kIHN0cmVhbSBiYXNlZCBETUEgbWFwcGluZ3MuCiAKIFRoZSBmb2xsb3dpbmcgbG9naWMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgSS9PIHRvIGJlIHVzZWQgb24KIGEgcGVyICJzcGlfdHJhbnNmZXIiIGJhc2lzOgogCi1pZiAhZW5hYmxlX2RtYSBvciBkbWFfYnVyc3Rfc2l6ZSA9PSAwIHRoZW4KK2lmICFlbmFibGVfZG1hIHRoZW4KIAlhbHdheXMgdXNlIFBJTyB0cmFuc2ZlcnMKIAoraWYgc3BpX21lc3NhZ2UubGVuID4gODE5MSB0aGVuCisJcHJpbnQgInJhdGUgbGltaXRlZCIgd2FybmluZworCXVzZSBQSU8gdHJhbnNmZXJzCisKIGlmIHNwaV9tZXNzYWdlLmlzX2RtYV9tYXBwZWQgYW5kIHJ4X2RtYV9idWYgIT0gMCBhbmQgdHhfZG1hX2J1ZiAhPSAwIHRoZW4KIAl1c2UgY29oZXJlbnQgRE1BIG1vZGUKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKaW5kZXggMjc2YTdlNi4uZTFmZjBkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CkBAIC0zNTEsOSArMzUxLDEwIEBACiAKIHNvZnRsb2NrdXBfdGhyZXNoOgogCi1UaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGxvd2VyIHRoZSBzb2Z0bG9ja3VwIHRvbGVyYW5jZQotdGhyZXNob2xkLiBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgMTBzLiAgSWYgYSBjcHUgaXMgbG9ja2VkIHVwCi1mb3IgMTBzLCB0aGUga2VybmVsIGNvbXBsYWlucy4gIFZhbGlkIHZhbHVlcyBhcmUgMS02MHMuCitUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGxvd2VyIHRoZSBzb2Z0bG9ja3VwIHRvbGVyYW5jZSB0aHJlc2hvbGQuICBUaGUKK2RlZmF1bHQgdGhyZXNob2xkIGlzIDYwIHNlY29uZHMuICBJZiBhIGNwdSBpcyBsb2NrZWQgdXAgZm9yIDYwIHNlY29uZHMsCit0aGUga2VybmVsIGNvbXBsYWlucy4gIFZhbGlkIHZhbHVlcyBhcmUgMS02MCBzZWNvbmRzLiAgU2V0dGluZyB0aGlzCit0dW5hYmxlIHRvIHplcm8gd2lsbCBkaXNhYmxlIHRoZSBzb2Z0bG9ja3VwIGRldGVjdGlvbiBhbHRvZ2V0aGVyLgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RpbWVycy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vdGltZXJzLzAwLUlOREVYCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2RjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RpbWVycy8wMC1JTkRFWApAQCAtMCwwICsxLDEwIEBACiswMC1JTkRFWAorCS0gdGhpcyBmaWxlCitoaWdocmVzLnR4dAorCS0gSGlnaCByZXNvbHV0aW9uIHRpbWVycyBhbmQgZHluYW1pYyB0aWNrcyBkZXNpZ24gbm90ZXMKK2hwZXQudHh0CisJLSBIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lciBEcml2ZXIgZm9yIExpbnV4CitocnRpbWVycy50eHQKKwktIHN1YnN5c3RlbSBmb3IgaGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMKK3RpbWVyX3N0YXRzLnR4dAorCS0gdGltZXIgdXNhZ2Ugc3RhdGlzdGljcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90aW1lcnMvaHBldC50eHQgYi9Eb2N1bWVudGF0aW9uL3RpbWVycy9ocGV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2MwOWFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90aW1lcnMvaHBldC50eHQKQEAgLTAsMCArMSwyOTkgQEAKKwkJSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eAorCitUaGUgSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgKEhQRVQpIGhhcmR3YXJlIGZvbGxvd3MgYSBzcGVjaWZpY2F0aW9uCitieSBJbnRlbCBhbmQgTWljcm9zb2Z0IHdoaWNoIGNhbiBiZSBmb3VuZCBhdAorCisJaHR0cDovL3d3dy5pbnRlbC5jb20vdGVjaG5vbG9neS9hcmNoaXRlY3R1cmUvaHBldHNwZWMuaHRtCisKK0VhY2ggSFBFVCBoYXMgb25lIGZpeGVkLXJhdGUgY291bnRlciAoYXQgMTArIE1IeiwgaGVuY2UgIkhpZ2ggUHJlY2lzaW9uIikKK2FuZCB1cCB0byAzMiBjb21wYXJhdG9ycy4gIE5vcm1hbGx5IHRocmVlIG9yIG1vcmUgY29tcGFyYXRvcnMgYXJlIHByb3ZpZGVkLAorZWFjaCBvZiB3aGljaCBjYW4gZ2VuZXJhdGUgb25lc2hvdCBpbnRlcnVwdHMgYW5kIGF0IGxlYXN0IG9uZSBvZiB3aGljaCBoYXMKK2FkZGl0aW9uYWwgaGFyZHdhcmUgdG8gc3VwcG9ydCBwZXJpb2RpYyBpbnRlcnJ1cHRzLiAgVGhlIGNvbXBhcmF0b3JzIGFyZQorYWxzbyBjYWxsZWQgInRpbWVycyIsIHdoaWNoIGNhbiBiZSBtaXNsZWFkaW5nIHNpbmNlIHVzdWFsbHkgdGltZXJzIGFyZQoraW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlciAuLi4gdGhlc2Ugc2hhcmUgYSBjb3VudGVyLCBjb21wbGljYXRpbmcgcmVzZXRzLgorCitIUEVUIGRldmljZXMgY2FuIHN1cHBvcnQgdHdvIGludGVycnVwdCByb3V0aW5nIG1vZGVzLiAgSW4gb25lIG1vZGUsIHRoZQorY29tcGFyYXRvcnMgYXJlIGFkZGl0aW9uYWwgaW50ZXJydXB0IHNvdXJjZXMgd2l0aCBubyBwYXJ0aWN1bGFyIHN5c3RlbQorcm9sZS4gIE1hbnkgeDg2IEJJT1Mgd3JpdGVycyBkb24ndCByb3V0ZSBIUEVUIGludGVycnVwdHMgYXQgYWxsLCB3aGljaAorcHJldmVudHMgdXNlIG9mIHRoYXQgbW9kZS4gIFRoZXkgc3VwcG9ydCB0aGUgb3RoZXIgImxlZ2FjeSByZXBsYWNlbWVudCIKK21vZGUgd2hlcmUgdGhlIGZpcnN0IHR3byBjb21wYXJhdG9ycyBibG9jayBpbnRlcnJ1cHRzIGZyb20gODI1NCB0aW1lcnMKK2FuZCBmcm9tIHRoZSBSVEMuCisKK1RoZSBkcml2ZXIgc3VwcG9ydHMgZGV0ZWN0aW9uIG9mIEhQRVQgZHJpdmVyIGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uCitvZiB0aGUgSFBFVCBiZWZvcmUgdGhlIGRyaXZlciBtb2R1bGVfaW5pdCByb3V0aW5lIGlzIGNhbGxlZC4gIFRoaXMgZW5hYmxlcworcGxhdGZvcm0gY29kZSB3aGljaCB1c2VzIHRpbWVyIDAgb3IgMSBhcyB0aGUgbWFpbiB0aW1lciB0byBpbnRlcmNlcHQgSFBFVAoraW5pdGlhbGl6YXRpb24uICBBbiBleGFtcGxlIG9mIHRoaXMgaW5pdGlhbGl6YXRpb24gY2FuIGJlIGZvdW5kIGluCithcmNoL3g4Ni9rZXJuZWwvaHBldC5jLgorCitUaGUgZHJpdmVyIHByb3ZpZGVzIGEgdXNlcnNwYWNlIEFQSSB3aGljaCByZXNlbWJsZXMgdGhlIEFQSSBmb3VuZCBpbiB0aGUKK1JUQyBkcml2ZXIgZnJhbWV3b3JrLiAgQW4gZXhhbXBsZSB1c2VyIHNwYWNlIHByb2dyYW0gaXMgcHJvdmlkZWQgYmVsb3cuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+CisKKworZXh0ZXJuIHZvaWQgaHBldF9vcGVuX2Nsb3NlKGludCwgY29uc3QgY2hhciAqKik7CitleHRlcm4gdm9pZCBocGV0X2luZm8oaW50LCBjb25zdCBjaGFyICoqKTsKK2V4dGVybiB2b2lkIGhwZXRfcG9sbChpbnQsIGNvbnN0IGNoYXIgKiopOworZXh0ZXJuIHZvaWQgaHBldF9mYXN5bmMoaW50LCBjb25zdCBjaGFyICoqKTsKK2V4dGVybiB2b2lkIGhwZXRfcmVhZChpbnQsIGNvbnN0IGNoYXIgKiopOworCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RydWN0IGhwZXRfY29tbWFuZCB7CisJY2hhcgkJKmNvbW1hbmQ7CisJdm9pZAkJKCpmdW5jKShpbnQgYXJnYywgY29uc3QgY2hhciAqKiBhcmd2KTsKK30gaHBldF9jb21tYW5kW10gPSB7CisJeworCQkib3Blbi1jbG9zZSIsCisJCWhwZXRfb3Blbl9jbG9zZQorCX0sCisJeworCQkiaW5mbyIsCisJCWhwZXRfaW5mbworCX0sCisJeworCQkicG9sbCIsCisJCWhwZXRfcG9sbAorCX0sCisJeworCQkiZmFzeW5jIiwKKwkJaHBldF9mYXN5bmMKKwl9LAorfTsKKworaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqIGFyZ3YpCit7CisJaW50CWk7CisKKwlhcmdjLS07CisJYXJndisrOworCisJaWYgKCFhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiLWhwZXQ6IHJlcXVpcmVzIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoaHBldF9jb21tYW5kKSAvIHNpemVvZiAoaHBldF9jb21tYW5kWzBdKSk7IGkrKykKKwkJaWYgKCFzdHJjbXAoYXJndlswXSwgaHBldF9jb21tYW5kW2ldLmNvbW1hbmQpKSB7CisJCQlhcmdjLS07CisJCQlhcmd2Kys7CisJCQlmcHJpbnRmKHN0ZGVyciwgIi1ocGV0OiBleGVjdXRpbmcgJXNcbiIsCisJCQkJaHBldF9jb21tYW5kW2ldLmNvbW1hbmQpOworCQkJaHBldF9jb21tYW5kW2ldLmZ1bmMoYXJnYywgYXJndik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJZnByaW50ZihzdGRlcnIsICJkb19ocGV0OiBjb21tYW5kICVzIG5vdCBpbXBsZW1lbnRlZFxuIiwgYXJndlswXSk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQKK2hwZXRfb3Blbl9jbG9zZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJaW50CWZkOworCisJaWYgKGFyZ2MgIT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfb3Blbl9jbG9zZTogZGV2aWNlLW5hbWVcbiIpOworCQlyZXR1cm47CisJfQorCisJZmQgPSBvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfb3Blbl9jbG9zZTogb3BlbiBmYWlsZWRcbiIpOworCWVsc2UKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuOworfQorCit2b2lkCitocGV0X2luZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworfQorCit2b2lkCitocGV0X3BvbGwoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcJCWZyZXE7CisJaW50CQkJaXRlcmF0aW9ucywgaSwgZmQ7CisJc3RydWN0IHBvbGxmZAkJcGZkOworCXN0cnVjdCBocGV0X2luZm8JaW5mbzsKKwlzdHJ1Y3QgdGltZXZhbAkJc3R2LCBldHY7CisJc3RydWN0IHRpbWV6b25lCQl0ejsKKwlsb25nCQkJdXNlYzsKKworCWlmIChhcmdjICE9IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IGRldmljZS1uYW1lIGZyZXEgaXRlcmF0aW9uc1xuIik7CisJCXJldHVybjsKKwl9CisKKwlmcmVxID0gYXRvaShhcmd2WzFdKTsKKwlpdGVyYXRpb25zID0gYXRvaShhcmd2WzJdKTsKKworCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBvcGVuIG9mICVzIGZhaWxlZFxuIiwgYXJndlswXSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW9jdGwoZmQsIEhQRVRfSVJRRlJFUSwgZnJlcSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBIUEVUX0lSUUZSRVEgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlvY3RsKGZkLCBIUEVUX0lORk8sICZpbmZvKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IGZhaWxlZCB0byBnZXQgaW5mb1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsOiBpbmZvLmhpX2ZsYWdzIDB4JWx4XG4iLCBpbmZvLmhpX2ZsYWdzKTsKKworCWlmIChpbmZvLmhpX2ZsYWdzICYmIChpb2N0bChmZCwgSFBFVF9FUEksIDApIDwgMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IEhQRVRfRVBJIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpb2N0bChmZCwgSFBFVF9JRV9PTiwgMCkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9wb2xsLCBIUEVUX0lFX09OIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXBmZC5mZCA9IGZkOworCXBmZC5ldmVudHMgPSBQT0xMSU47CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisJCXBmZC5yZXZlbnRzID0gMDsKKwkJZ2V0dGltZW9mZGF5KCZzdHYsICZ0eik7CisJCWlmIChwb2xsKCZwZmQsIDEsIC0xKSA8IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogcG9sbCBmYWlsZWRcbiIpOworCQllbHNlIHsKKwkJCWxvbmcgCWRhdGE7CisKKwkJCWdldHRpbWVvZmRheSgmZXR2LCAmdHopOworCQkJdXNlYyA9IHN0di50dl9zZWMgKiAxMDAwMDAwICsgc3R2LnR2X3VzZWM7CisJCQl1c2VjID0gKGV0di50dl9zZWMgKiAxMDAwMDAwICsgZXR2LnR2X3VzZWMpIC0gdXNlYzsKKworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJImhwZXRfcG9sbDogZXhwaXJlZCB0aW1lID0gMHglbHhcbiIsIHVzZWMpOworCisJCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogcmV2ZW50cyA9IDB4JXhcbiIsCisJCQkJcGZkLnJldmVudHMpOworCisJCQlpZiAocmVhZChmZCwgJmRhdGEsIHNpemVvZihkYXRhKSkgIT0gc2l6ZW9mKGRhdGEpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJocGV0X3BvbGw6IHJlYWQgZmFpbGVkXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfcG9sbDogZGF0YSAweCVseFxuIiwKKwkJCQkJZGF0YSk7CisJCX0KKwl9CisKK291dDoKKwljbG9zZShmZCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGhwZXRfc2lnaW9fY291bnQ7CisKK3N0YXRpYyB2b2lkCitocGV0X3NpZ2lvKGludCB2YWwpCit7CisJZnByaW50ZihzdGRlcnIsICJocGV0X3NpZ2lvOiBjYWxsZWRcbiIpOworCWhwZXRfc2lnaW9fY291bnQrKzsKK30KKwordm9pZAoraHBldF9mYXN5bmMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcJCWZyZXE7CisJaW50CQkJaXRlcmF0aW9ucywgaSwgZmQsIHZhbHVlOworCXNpZ190CQkJb2xkc2lnOworCXN0cnVjdCBocGV0X2luZm8JaW5mbzsKKworCWhwZXRfc2lnaW9fY291bnQgPSAwOworCWZkID0gLTE7CisKKwlpZiAoKG9sZHNpZyA9IHNpZ25hbChTSUdJTywgaHBldF9zaWdpbykpID09IFNJR19FUlIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogZmFpbGVkIHRvIHNldCBzaWduYWwgaGFuZGxlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXJnYyAhPSAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IGRldmljZS1uYW1lIGZyZXEgaXRlcmF0aW9uc1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IGZhaWxlZCB0byBvcGVuICVzXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuOworCX0KKworCisJaWYgKChmY250bChmZCwgRl9TRVRPV04sIGdldHBpZCgpKSA9PSAxKSB8fAorCQkoKHZhbHVlID0gZmNudGwoZmQsIEZfR0VURkwpKSA9PSAxKSB8fAorCQkoZmNudGwoZmQsIEZfU0VURkwsIHZhbHVlIHwgT19BU1lOQykgPT0gMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogZmNudGwgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZnJlcSA9IGF0b2koYXJndlsxXSk7CisJaXRlcmF0aW9ucyA9IGF0b2koYXJndlsyXSk7CisKKwlpZiAoaW9jdGwoZmQsIEhQRVRfSVJRRlJFUSwgZnJlcSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaHBldF9mYXN5bmM6IEhQRVRfSVJRRlJFUSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW9jdGwoZmQsIEhQRVRfSU5GTywgJmluZm8pIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBmYWlsZWQgdG8gZ2V0IGluZm9cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBpbmZvLmhpX2ZsYWdzIDB4JWx4XG4iLCBpbmZvLmhpX2ZsYWdzKTsKKworCWlmIChpbmZvLmhpX2ZsYWdzICYmIChpb2N0bChmZCwgSFBFVF9FUEksIDApIDwgMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYzogSFBFVF9FUEkgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlvY3RsKGZkLCBIUEVUX0lFX09OLCAwKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJocGV0X2Zhc3luYywgSFBFVF9JRV9PTiBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisJCSh2b2lkKSBwYXVzZSgpOworCQlmcHJpbnRmKHN0ZGVyciwgImhwZXRfZmFzeW5jOiBjb3VudCA9ICVkXG4iLCBocGV0X3NpZ2lvX2NvdW50KTsKKwl9CisKK291dDoKKwlzaWduYWwoU0lHSU8sIG9sZHNpZyk7CisKKwlpZiAoZmQgPj0gMCkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvYW5jaG9ycy50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9hbmNob3JzLnR4dAppbmRleCA3MzA0YmNmLi41ZTZiNjRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9hbmNob3JzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9hbmNob3JzLnR4dApAQCAtNDIsOSArNDIsMjEgQEAKIGFyZSBjYWxsZWQgaW4gdGhlIHJldmVyc2UgdGVtcG9yYWwgb3JkZXIgdGhleSB3ZXJlIHN1Ym1pdHRlZC4KIFRoaXMgd2F5IG5vIGRhdGEgY2FuIGJlIHJlb3JkZXJlZC4KIAordXNiX3VubGlua19hbmNob3JlZF91cmJzKCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZnVuY3Rpb24gdW5saW5rcyBhbGwgVVJCcyBhc3NvY2lhdGVkIHdpdGggYW4gYW5jaG9yLiBUaGUgVVJCcworYXJlIHByb2Nlc3NlZCBpbiB0aGUgcmV2ZXJzZSB0ZW1wb3JhbCBvcmRlciB0aGV5IHdlcmUgc3VibWl0dGVkLgorVGhpcyBpcyBzaW1pbGFyIHRvIHVzYl9raWxsX2FuY2hvcmVkX3VyYnMoKSwgYnV0IGl0IHdpbGwgbm90IHNsZWVwLgorVGhlcmVmb3JlIG5vIGd1YXJhbnRlZSBpcyBtYWRlIHRoYXQgdGhlIFVSQnMgaGF2ZSBiZWVuIHVubGlua2VkIHdoZW4KK3RoZSBjYWxsIHJldHVybnMuIFRoZXkgbWF5IGJlIHVubGlua2VkIGxhdGVyIGJ1dCB3aWxsIGJlIHVubGlua2VkIGluCitmaW5pdGUgdGltZS4KKwogdXNiX3dhaXRfYW5jaG9yX2VtcHR5X3RpbWVvdXQoKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbGwgVVJCcyBhc3NvY2lhdGVkIHdpdGggYW4gYW5jaG9yIHRvIGZpbmlzaAogb3IgYSB0aW1lb3V0LCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuIEl0cyByZXR1cm4gdmFsdWUgd2lsbCB0ZWxsIHlvdQogd2hldGhlciB0aGUgdGltZW91dCB3YXMgcmVhY2hlZC4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKaW5kZXggZjMyZWZiNi4uNjBiYTY2OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgpAQCAtMTUwLDMgKzE1MCw0IEBACiAxNDkgLT4gVHlwaG9vbiBUVi1UdW5lciBQQ0kgKDUwNjg0KQogMTUwIC0+IEdlb3Zpc2lvbiBHVi02MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA4YTo3NjNjXQogMTUxIC0+IEtvenVtaSBLVFYtMDFDCisxNTIgLT4gRW5jb3JlIEVOTCBUVi1GTS0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDAwOjE4MDFdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKaW5kZXggZjBlNjEzYi4uNjQ4MjNjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQpAQCAtOSwzICs5LDUgQEAKICAgOCAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTcwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ODEwMV0KICAgOSAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ODAxMF0KICAxMCAtPiBEVmlDTyBGdXNpb25IRFRWNyBEdWFsIEV4cHJlc3MgICAgICAgICAgICAgICAgICAgICAgWzE4YWM6ZDYxOF0KKyAxMSAtPiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIER1YWwgRXhwcmVzcyAgICAgICAgICAgICAgICAgWzE4YWM6ZGI3OF0KKyAxMiAtPiBMZWFkdGVrIFdpbmZhc3QgUHhEVlIzMjAwIEggICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NjY4MV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAppbmRleCA3Y2Y1Njg1Li5hNTIyN2UzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CkBAIC02NiwzICs2NiwxMSBAQAogIDY1IC0+IERWaUNPIEZ1c2lvbkhEVFYgNyBHb2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkNjEwXQogIDY2IC0+IFByb2xpbmsgUGl4ZWx2aWV3IE1QRUcgODAwMEdUICAgICAgICAgICAgICAgICAgICAgICBbMTU1NDo0OTM1XQogIDY3IC0+IEt3b3JsZCBQbHVzVFYgSEQgUENJIDEyMCAoQVRTQyAxMjApICAgICAgICAgICAgICAgICBbMTdkZTowOGMxXQorIDY4IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlI0MDAwIERWQi1TL1MyL1QvSHlicmlkICAgICAgICAgICBbMDA3MDo2OTAwLDAwNzA6NjkwNCwwMDcwOjY5MDJdCisgNjkgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjQwMDAoTGl0ZSkgRFZCLVMvUzIgICAgICAgICAgICAgIFswMDcwOjY5MDUsMDA3MDo2OTA2XQorIDcwIC0+IFRlVmlpIFM0NjAgRFZCLVMvUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZDQ2MDo5MDIyXQorIDcxIC0+IE9taWNvbSBTUzQgRFZCLVMvUzIgUENJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQTA0NDoyMDExXQorIDcyIC0+IFRCUyA4OTIwIERWQi1TL1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbODkyMDo4ODg4XQorIDczIC0+IFRlVmlpIFM0MjAgRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZDQyMDo5MDIyXQorIDc0IC0+IFByb2xpbmsgUGl4ZWx2aWV3IEdsb2JhbCBFeHRyZW1lICAgICAgICAgICAgICAgICAgICBbMTU1NDo0OTc2XQorIDc1IC0+IFBST0YgNzMwMCBEVkItUy9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQjAzMzozMDMzXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAppbmRleCA4OWM3ZjMyLi4xODdjYzQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eApAQCAtMSw1ICsxLDUgQEAKICAgMCAtPiBVbmtub3duIEVNMjgwMCB2aWRlbyBncmFiYmVyICAgICAgICAgICAgIChlbTI4MDApICAgICAgICBbZWIxYToyODAwXQotICAxIC0+IFVua25vd24gRU0yNzUwLzI4eHggdmlkZW8gZ3JhYmJlciAgICAgICAgKGVtMjgyMC9lbTI4NDApIFtlYjFhOjI4MjAsZWIxYToyODIxLGViMWE6Mjg2MCxlYjFhOjI4NjEsZWIxYToyODcwLGViMWE6Mjg4MSxlYjFhOjI4ODNdCisgIDEgLT4gVW5rbm93biBFTTI3NTAvMjh4eCB2aWRlbyBncmFiYmVyICAgICAgICAoZW0yODIwL2VtMjg0MCkgW2ViMWE6MjgyMCxlYjFhOjI4NjAsZWIxYToyODYxLGViMWE6Mjg3MCxlYjFhOjI4ODEsZWIxYToyODgzXQogICAyIC0+IFRlcnJhdGVjIENpbmVyZ3kgMjUwIFVTQiAgICAgICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApIFswY2NkOjAwMzZdCiAgIDMgLT4gUGlubmFjbGUgUENUViBVU0IgMiAgICAgICAgICAgICAgICAgICAgICAoZW0yODIwL2VtMjg0MCkgWzIzMDQ6MDIwOF0KICAgNCAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIDIgICAgICAgICAgICAgICAgICAgIChlbTI4MjAvZW0yODQwKSBbMjA0MDo0MjAwLDIwNDA6NDIwMV0KQEAgLTEyLDcgKzEyLDcgQEAKICAxMSAtPiBUZXJyYXRlYyBIeWJyaWQgWFMgICAgICAgICAgICAgICAgICAgICAgIChlbTI4ODApICAgICAgICBbMGNjZDowMDQyXQogIDEyIC0+IEt3b3JsZCBQVlIgVFYgMjgwMCBSRiAgICAgICAgICAgICAgICAgICAgKGVtMjgyMC9lbTI4NDApCiAgMTMgLT4gVGVycmF0ZWMgUHJvZGlneSBYUyAgICAgICAgICAgICAgICAgICAgICAoZW0yODgwKSAgICAgICAgWzBjY2Q6MDA0N10KLSAxNCAtPiBQaXhlbHZpZXcgUHJvbGluayBQbGF5VFYgVVNCIDIuMCAgICAgICAgIChlbTI4MjAvZW0yODQwKQorIDE0IC0+IFBpeGVsdmlldyBQcm9saW5rIFBsYXlUViBVU0IgMi4wICAgICAgICAgKGVtMjgyMC9lbTI4NDApIFtlYjFhOjI4MjFdCiAgMTUgLT4gVi1HZWFyIFBvY2tldFRWICAgICAgICAgICAgICAgICAgICAgICAgICAoZW0yODAwKQogIDE2IC0+IEhhdXBwYXVnZSBXaW5UViBIVlIgOTUwICAgICAgICAgICAgICAgICAgKGVtMjg4MykgICAgICAgIFsyMDQwOjY1MTMsMjA0MDo2NTE3LDIwNDA6NjUxYiwyMDQwOjY1MWZdCiAgMTcgLT4gUGlubmFjbGUgUENUViBIRCBQcm8gU3RpY2sgICAgICAgICAgICAgICAoZW0yODgwKSAgICAgICAgWzIzMDQ6MDIyN10KQEAgLTQ2LDcgKzQ2LDcgQEAKICA0NSAtPiBQaW5uYWNsZSBQQ1RWIERWQi1UICAgICAgICAgICAgICAgICAgICAgIChlbTI4NzApCiAgNDYgLT4gQ29tcHJvLCBWaWRlb01hdGUgVTMgICAgICAgICAgICAgICAgICAgICAoZW0yODcwKSAgICAgICAgWzE4NWI6Mjg3MF0KICA0NyAtPiBLV29ybGQgRFZCLVQgMzA1VSAgICAgICAgICAgICAgICAgICAgICAgIChlbTI4ODApICAgICAgICBbZWIxYTplMzA1XQotIDQ4IC0+IEtXb3JsZCBEVkItVCAzMTBVICAgICAgICAgICAgICAgICAgICAgICAgKGVtMjg4MCkKKyA0OCAtPiBLV29ybGQgRFZCLVQgMzEwVSAgICAgICAgICAgICAgICAgICAgICAgIChlbTI4ODApICAgICAgICBbZWIxYTplMzEwXQogIDQ5IC0+IE1TSSBEaWdpVm94IEEvRCAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtMjg4MCkgICAgICAgIFtlYjFhOmUzMTBdCiAgNTAgLT4gTVNJIERpZ2lWb3ggQS9EIElJICAgICAgICAgICAgICAgICAgICAgICAoZW0yODgwKSAgICAgICAgW2ViMWE6ZTMyMF0KICA1MSAtPiBUZXJyYXRlYyBIeWJyaWQgWFMgU2VjYW0gICAgICAgICAgICAgICAgIChlbTI4ODApICAgICAgICBbMGNjZDowMDRjXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IDM5ODY4YWYuLmRjNjdlZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTc2LDcgKzc2LDcgQEAKICA3NSAtPiBBVmVyTWVkaWEgQVZlclRWSEQgTUNFIEExODAgICAgICAgICAgICAgIFsxNDYxOjEwNDRdCiAgNzYgLT4gU0tOZXQgTW9uc3RlclRWIE1vYmlsZSAgICAgICAgICAgICAgICAgICBbMTEzMTo0ZWU5XQogIDc3IC0+IFBpbm5hY2xlIFBDVFYgNDBpLzUwaS8xMTBpIChzYWE3MTMzKSAgICAgWzExYmQ6MDAyZV0KLSA3OCAtPiBBU1VTVGVLIFA3MTMxIER1YWwgICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NjIsMTA0Mzo0ODU3XQorIDc4IC0+IEFTVVNUZUsgUDcxMzEgRHVhbCAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg2Ml0KICA3OSAtPiBTZWRuYS9NdWNoVFYgUEMgVFYgQ2FyZGJ1cyBUVi9SYWRpbyAoSVRPMjUgUmV2OjJCKQogIDgwIC0+IEFTVVMgRGlnaW1hdHJpeCBUViAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6MDIxMF0KICA4MSAtPiBQaGlsaXBzIFRpZ2VyIHJlZmVyZW5jZSBkZXNpZ24gICAgICAgICAgIFsxMTMxOjIwMThdCkBAIC0xNDUsMyArMTQ1LDkgQEAKIDE0NCAtPiBCZWhvbGRlciBCZWhvbGRUViBNNiBFeHRyYSAgICAgICAgICAgICAgIFs1YWNlOjYxOTNdCiAxNDUgLT4gQVZlck1lZGlhIE1pbmlQQ0kgRFZCLVQgSHlicmlkIE0xMDMgICAgICBbMTQ2MTpmNjM2XQogMTQ2IC0+IEFTVVNUZUsgUDcxMzEgQW5hbG9nCisxNDcgLT4gQXN1cyBUaWdlciAzaW4xICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODc4XQorMTQ4IC0+IEVuY29yZSBFTkxUVi1GTSB2NS4zICAgICAgICAgICAgICAgICAgICAgWzFhN2Y6MjAwOF0KKzE0OSAtPiBBdmVybWVkaWEgUENJIHB1cmUgYW5hbG9nIChNMTM1QSkgICAgICAgIFsxNDYxOmYxMWRdCisxNTAgLT4gWm9naXMgUmVhbCBBbmdlbCAyMjAKKzE1MSAtPiBBRFMgVGVjaCBJbnN0YW50IEhEVFYgICAgICAgICAgICAgICAgICAgIFsxNDIxOjAzODBdCisxNTIgLT4gQXN1cyBUaWdlciBSZXY6MS4wMCAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODU3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lciBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKaW5kZXggMGUyMzk0Ni4uMzBiYmRkYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCkBAIC03NCwzICs3NCw0IEBACiB0dW5lcj03MyAtIFNhbXN1bmcgVENQRyA2MTIxUDMwQQogdHVuZXI9NzUgLSBQaGlsaXBzIFRFQTU3NjEgRk0gUmFkaW8KIHR1bmVyPTc2IC0gWGNlaXZlIDUwMDAgdHVuZXIKK3R1bmVyPTc3IC0gVENMIHR1bmVyIE1GMDJHSVAtNU4tRQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAppbmRleCAwZjAzOTAwLi4wMDQ4MThmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dApAQCAtNyw2ICs3LDcgQEAKIHh4eHgJCXZlbmQ6cHJvZAogLS0tLQogc3BjYTUwMQkJMDAwMDowMDAwCU15c3RGcm9tT3JpIFVua25vdyBDYW1lcmEKK201NjAyCQkwNDAyOjU2MDIJQUxpIFZpZGVvIENhbWVyYSBDb250cm9sbGVyCiBzcGNhNTAxCQkwNDBhOjAwMDIJS29kYWsgRFZDLTMyNQogc3BjYTUwMAkJMDQwYTowMzAwCUtvZGFrIEVaMjAwCiB6YzN4eAkJMDQxZTowNDFlCUNyZWF0aXZlIFdlYkNhbSBMaXZlIQpAQCAtNDIsNiArNDMsNyBAQAogemMzeHgJCTA0NTg6NzAwYwlHZW5pdXMgVmlkZW9DYW0gVjMKIHpjM3h4CQkwNDU4OjcwMGYJR2VuaXVzIFZpZGVvQ2FtIFdlYiBWMgogc29uaXhqCQkwNDU4OjcwMjUJR2VuaXVzIEV5ZSAzMTFRCitzb25peGoJCTA0NTg6NzAyZQlHZW5pdXMgU2xpbSAzMTAgTkIKIHNvbml4agkJMDQ1ZTowMGY1CU1pY3JvU29mdCBWWDMwMDAKIHNvbml4agkJMDQ1ZTowMGY3CU1pY3JvU29mdCBWWDEwMDAKIG92NTE5CQkwNDVlOjAyOGMJTWljcm8kb2Z0IHhib3ggY2FtCkBAIC04MSw3ICs4Myw3IEBACiBzcGNhNTYxCQkwNDZkOjA5MmMJTG9naXRlY2ggUUMgY2hhdCBFbGNoMgogc3BjYTU2MQkJMDQ2ZDowOTJkCUxvZ2l0ZWNoIFFDIEVsY2gyCiBzcGNhNTYxCQkwNDZkOjA5MmUJTG9naXRlY2ggUUMgRWxjaDIKLXNwY2E1NjEJCTA0NmQ6MDkyZglMb2dpdGVjaCBRQyBFbGNoMgorc3BjYTU2MQkJMDQ2ZDowOTJmCUxvZ2l0ZWNoICBRdWlja0NhbSBFeHByZXNzIFBsdXMKIHN1bnBsdXMJCTA0NmQ6MDk2MAlMb2dpdGVjaCBDbGlja1NtYXJ0IDQyMAogc3VucGx1cwkJMDQ3MTowMzIyCVBoaWxpcHMgRE1WQzEzMDBLCiB6YzN4eAkJMDQ3MTowMzI1CVBoaWxpcHMgU1BDIDIwMCBOQwpAQCAtOTYsNiArOTgsMjkgQEAKIHN1bnBsdXMJCTA0YTU6MzAwOAlCZW5xIERDIDE1MDAKIHN1bnBsdXMJCTA0YTU6MzAwYQlCZW5xIERDIDM0MTAKIHNwY2E1MDAJCTA0YTU6MzAwYwlCZW5xIERDIDEwMTYKK2ZpbmVwaXgJCTA0Y2I6MDEwNAlGdWppZmlsbSBGaW5lUGl4IDQ4MDAKK2ZpbmVwaXgJCTA0Y2I6MDEwOQlGdWppZmlsbSBGaW5lUGl4IEEyMDIKK2ZpbmVwaXgJCTA0Y2I6MDEwYglGdWppZmlsbSBGaW5lUGl4IEEyMDMKK2ZpbmVwaXgJCTA0Y2I6MDEwZglGdWppZmlsbSBGaW5lUGl4IEEyMDQKK2ZpbmVwaXgJCTA0Y2I6MDExMQlGdWppZmlsbSBGaW5lUGl4IEEyMDUKK2ZpbmVwaXgJCTA0Y2I6MDExMwlGdWppZmlsbSBGaW5lUGl4IEEyMTAKK2ZpbmVwaXgJCTA0Y2I6MDExNQlGdWppZmlsbSBGaW5lUGl4IEEzMDMKK2ZpbmVwaXgJCTA0Y2I6MDExNwlGdWppZmlsbSBGaW5lUGl4IEEzMTAKK2ZpbmVwaXgJCTA0Y2I6MDExOQlGdWppZmlsbSBGaW5lUGl4IEY0MDEKK2ZpbmVwaXgJCTA0Y2I6MDExYglGdWppZmlsbSBGaW5lUGl4IEY0MDIKK2ZpbmVwaXgJCTA0Y2I6MDExZAlGdWppZmlsbSBGaW5lUGl4IEY0MTAKK2ZpbmVwaXgJCTA0Y2I6MDEyMQlGdWppZmlsbSBGaW5lUGl4IEY2MDEKK2ZpbmVwaXgJCTA0Y2I6MDEyMwlGdWppZmlsbSBGaW5lUGl4IEY3MDAKK2ZpbmVwaXgJCTA0Y2I6MDEyNQlGdWppZmlsbSBGaW5lUGl4IE02MDMKK2ZpbmVwaXgJCTA0Y2I6MDEyNwlGdWppZmlsbSBGaW5lUGl4IFMzMDAKK2ZpbmVwaXgJCTA0Y2I6MDEyOQlGdWppZmlsbSBGaW5lUGl4IFMzMDQKK2ZpbmVwaXgJCTA0Y2I6MDEyYglGdWppZmlsbSBGaW5lUGl4IFM1MDAKK2ZpbmVwaXgJCTA0Y2I6MDEyZAlGdWppZmlsbSBGaW5lUGl4IFM2MDIKK2ZpbmVwaXgJCTA0Y2I6MDEyZglGdWppZmlsbSBGaW5lUGl4IFM3MDAKK2ZpbmVwaXgJCTA0Y2I6MDEzMQlGdWppZmlsbSBGaW5lUGl4IHVua25vd24gbW9kZWwKK2ZpbmVwaXgJCTA0Y2I6MDEzYglGdWppZmlsbSBGaW5lUGl4IHVua25vd24gbW9kZWwKK2ZpbmVwaXgJCTA0Y2I6MDEzZAlGdWppZmlsbSBGaW5lUGl4IHVua25vd24gbW9kZWwKK2ZpbmVwaXgJCTA0Y2I6MDEzZglGdWppZmlsbSBGaW5lUGl4IEY0MjAKIHN1bnBsdXMJCTA0ZjE6MTAwMQlKVkMgR0MgQTUwCiBzcGNhNTYxCQkwNGZjOjA1NjEJRmxleGNhbSAxMDAKIHN1bnBsdXMJCTA0ZmM6NTAwYwlTdW5wbHVzIENBNTAwQwpAQCAtMTgxLDYgKzIwNiw3IEBACiBwYWMyMDcJCTA5M2E6MjQ3MAlHZW5pdXMgR0YxMTIKIHBhYzIwNwkJMDkzYToyNDcxCUdlbml1cyBWaWRlb0NhbSBnZTExMQogcGFjMjA3CQkwOTNhOjI0NzIJR2VuaXVzIFZpZGVvQ2FtIGdlMTEwCitwYWMyMDcJCTA5M2E6MjQ3NglHZW5pdXMgZS1NZXNzZW5nZXIgMTEyCiBwYWM3MzExCQkwOTNhOjI2MDAJUEFDNzMxMSBUeXBob29uCiBwYWM3MzExCQkwOTNhOjI2MDEJUGhpbGlwcyBTUEMgNjEwIE5DCiBwYWM3MzExCQkwOTNhOjI2MDMJUEFDNzMxMgpAQCAtMTkwLDYgKzIxNiw3IEBACiBwYWM3MzExCQkwOTNhOjI2MjEJUEFDNzMxeAogcGFjNzMxMQkJMDkzYToyNjI0CVBBQzczMDIKIHBhYzczMTEJCTA5M2E6MjYyNglMYWJ0ZWMgMjIwMAorcGFjNzMxMQkJMDkzYToyNjJhCVdlYmNhbSAzMDBrCiB6YzN4eAkJMGFjODowMzAyCVotc3RhciBWaW1pY3JvIHpjMDMwMgogdmMwMzJ4CQkwYWM4OjAzMjEJVmltaWNybyBnZW5lcmljIHZjMDMyMQogdmMwMzJ4CQkwYWM4OjAzMjMJVmltaWNybyBWYzAzMjMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbTU2MDIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9tNTYwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1MGFiMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbTU2MDIudHh0CkBAIC0wLDAgKzEsMTIgQEAKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBBTGkgbTU2MDIgYnJpZGdlIGNvbm5lY3RlZAordG8gdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQgc2Vuc29yczoKK09tbmlWaXNpb24gT1Y5NjUwLAorU2Ftc3VuZyBzNWs4M2EsCitTYW1zdW5nIHM1azRhYSwKK01pY3JvbiBtdDltMTExLAorUGl4ZWwgcGx1cyBQTzEwMzAKKworVGhpcyBkcml2ZXIgbWltaWNzIHRoZSB3aW5kb3dzIGRyaXZlcnMsIHdoaWNoIGhhdmUgYSBicmFpbmRlYWQgaW1wbGVtZW50YXRpb24gc2VuZGluZyBiYXllci1lbmNvZGVkIGZyYW1lcyBhdCBWR0EgcmVzb2x1dGlvbi4KK0luIGEgcGVyZmVjdCB3b3JsZCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZXByb2dyYW0gdGhlIG01NjAyIGFuZCB0aGUgY29ubmVjdGVkIHNlbnNvciBpbiBoYXJkd2FyZSBpbnN0ZWFkLCBzdXBwb3J0aW5nIGEgcmFuZ2Ugb2YgcmVzb2x1dGlvbnMgYW5kIHBpeGVsZm9ybWF0cworCitBbnl3YXksIGhhdmUgZnVuIGFuZCBwbGVhc2UgcmVwb3J0IGFueSBidWdzIHRvIG01NjB4LWRyaXZlci1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc29jLWNhbWVyYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NvYy1jYW1lcmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NvYy1jYW1lcmEudHh0CkBAIC0wLDAgKzEsMTIwIEBACisJCQlTb2MtQ2FtZXJhIFN1YnN5c3RlbQorCQkJPT09PT09PT09PT09PT09PT09PT0KKworVGVybWlub2xvZ3kKKy0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgdGVybXMgYXJlIHVzZWQgaW4gdGhpcyBkb2N1bWVudDoKKyAtIGNhbWVyYSAvIGNhbWVyYSBkZXZpY2UgLyBjYW1lcmEgc2Vuc29yIC0gYSB2aWRlby1jYW1lcmEgc2Vuc29yIGNoaXAsIGNhcGFibGUKKyAgIG9mIGNvbm5lY3RpbmcgdG8gYSB2YXJpZXR5IG9mIHN5c3RlbXMgYW5kIGludGVyZmFjZXMsIHR5cGljYWxseSB1c2VzIGkyYyBmb3IKKyAgIGNvbnRyb2wgYW5kIGNvbmZpZ3VyYXRpb24sIGFuZCBhIHBhcmFsbGVsIG9yIGEgc2VyaWFsIGJ1cyBmb3IgZGF0YS4KKyAtIGNhbWVyYSBob3N0IC0gYW4gaW50ZXJmYWNlLCB0byB3aGljaCBhIGNhbWVyYSBpcyBjb25uZWN0ZWQuIFR5cGljYWxseSBhCisgICBzcGVjaWFsaXNlZCBpbnRlcmZhY2UsIHByZXNlbnQgb24gbWFueSBTb0NzLCBlLmcuLCBQWEEyN3ggYW5kIFBYQTN4eCwgU3VwZXJILAorICAgQVZSMzIsIGkuTVgyNywgaS5NWDMxLgorIC0gY2FtZXJhIGhvc3QgYnVzIC0gYSBjb25uZWN0aW9uIGJldHdlZW4gYSBjYW1lcmEgaG9zdCBhbmQgYSBjYW1lcmEuIENhbiBiZQorICAgcGFyYWxsZWwgb3Igc2VyaWFsLCBjb25zaXN0cyBvZiBkYXRhIGFuZCBjb250cm9sIGxpbmVzLCBlLmcuLCBjbG9jaywgdmVydGljYWwKKyAgIGFuZCBob3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBzaWduYWxzLgorCitQdXJwb3NlIG9mIHRoZSBzb2MtY2FtZXJhIHN1YnN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNvYy1jYW1lcmEgc3Vic3lzdGVtIHByb3ZpZGVzIGEgdW5pZmllZCBBUEkgYmV0d2VlbiBjYW1lcmEgaG9zdCBkcml2ZXJzIGFuZAorY2FtZXJhIHNlbnNvciBkcml2ZXJzLiBJdCBpbXBsZW1lbnRzIGEgVjRMMiBpbnRlcmZhY2UgdG8gdGhlIHVzZXIsIGN1cnJlbnRseQorb25seSB0aGUgbW1hcCBtZXRob2QgaXMgc3VwcG9ydGVkLgorCitUaGlzIHN1YnN5c3RlbSBoYXMgYmVlbiB3cml0dGVuIHRvIGNvbm5lY3QgZHJpdmVycyBmb3IgU3lzdGVtLW9uLUNoaXAgKFNvQykKK3ZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlcyB3aXRoIGRyaXZlcnMgZm9yIENNT1MgY2FtZXJhIHNlbnNvciBjaGlwcyB0byBlbmFibGUKK3RoZSByZXVzZSBvZiBzZW5zb3IgZHJpdmVycyB3aXRoIHZhcmlvdXMgaG9zdHMuIFRoZSBzdWJzeXN0ZW0gaGFzIGJlZW4gZGVzaWduZWQKK3RvIHN1cHBvcnQgbXVsdGlwbGUgY2FtZXJhIGhvc3QgaW50ZXJmYWNlcyBhbmQgbXVsdGlwbGUgY2FtZXJhcyBwZXIgaW50ZXJmYWNlLAorYWx0aG91Z2ggbW9zdCBhcHBsaWNhdGlvbnMgaGF2ZSBvbmx5IG9uZSBjYW1lcmEgc2Vuc29yLgorCitFeGlzdGluZyBkcml2ZXJzCistLS0tLS0tLS0tLS0tLS0tCisKK0FzIG9mIDIuNi4yNy1yYzQgdGhlcmUgYXJlIHR3byBob3N0IGRyaXZlcnMgaW4gdGhlIG1haW5saW5lOiBweGFfY2FtZXJhLmMgZm9yCitQWEEyN3ggU29DcyBhbmQgc2hfbW9iaWxlX2NldV9jYW1lcmEuYyBmb3IgU3VwZXJIIFNvQ3MsIGFuZCBmb3VyIHNlbnNvciBkcml2ZXJzOgorbXQ5bTAwMS5jLCBtdDltMTExLmMsIG10OXYwMjIuYyBhbmQgYSBnZW5lcmljIHNvY19jYW1lcmFfcGxhdGZvcm0uYyBkcml2ZXIuIFRoaXMKK2xpc3QgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHVwZGF0ZWQsIGxvb2sgZm9yIG1vcmUgZXhhbXBsZXMgaW4geW91ciB0cmVlLgorCitDYW1lcmEgaG9zdCBBUEkKKy0tLS0tLS0tLS0tLS0tLQorCitBIGhvc3QgY2FtZXJhIGRyaXZlciBpcyByZWdpc3RlcmVkIHVzaW5nIHRoZQorCitzb2NfY2FtZXJhX2hvc3RfcmVnaXN0ZXIoc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqKTsKKworZnVuY3Rpb24uIFRoZSBob3N0IG9iamVjdCBjYW4gYmUgaW5pdGlhbGl6ZWQgYXMgZm9sbG93czoKKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgcHhhX3NvY19jYW1lcmFfaG9zdCA9IHsKKwkuZHJ2X25hbWUJPSBQWEFfQ0FNX0RSVl9OQU1FLAorCS5vcHMJCT0gJnB4YV9zb2NfY2FtZXJhX2hvc3Rfb3BzLAorfTsKKworQWxsIGNhbWVyYSBob3N0IG1ldGhvZHMgYXJlIHBhc3NlZCBpbiBhIHN0cnVjdCBzb2NfY2FtZXJhX2hvc3Rfb3BzOgorCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfaG9zdF9vcHMgcHhhX3NvY19jYW1lcmFfaG9zdF9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hZGQJCT0gcHhhX2NhbWVyYV9hZGRfZGV2aWNlLAorCS5yZW1vdmUJCT0gcHhhX2NhbWVyYV9yZW1vdmVfZGV2aWNlLAorCS5zdXNwZW5kCT0gcHhhX2NhbWVyYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX2NhbWVyYV9yZXN1bWUsCisJLnNldF9mbXRfY2FwCT0gcHhhX2NhbWVyYV9zZXRfZm10X2NhcCwKKwkudHJ5X2ZtdF9jYXAJPSBweGFfY2FtZXJhX3RyeV9mbXRfY2FwLAorCS5pbml0X3ZpZGVvYnVmCT0gcHhhX2NhbWVyYV9pbml0X3ZpZGVvYnVmLAorCS5yZXFidWZzCT0gcHhhX2NhbWVyYV9yZXFidWZzLAorCS5wb2xsCQk9IHB4YV9jYW1lcmFfcG9sbCwKKwkucXVlcnljYXAJPSBweGFfY2FtZXJhX3F1ZXJ5Y2FwLAorCS50cnlfYnVzX3BhcmFtCT0gcHhhX2NhbWVyYV90cnlfYnVzX3BhcmFtLAorCS5zZXRfYnVzX3BhcmFtCT0gcHhhX2NhbWVyYV9zZXRfYnVzX3BhcmFtLAorfTsKKworLmFkZCBhbmQgLnJlbW92ZSBtZXRob2RzIGFyZSBjYWxsZWQgd2hlbiBhIHNlbnNvciBpcyBhdHRhY2hlZCB0byBvciBkZXRhY2hlZAorZnJvbSB0aGUgaG9zdCwgYXBhcnQgZnJvbSBwZXJmb3JtaW5nIGhvc3QtaW50ZXJuYWwgdGFza3MgdGhleSBzaGFsbCBhbHNvIGNhbGwKK3NlbnNvciBkcml2ZXIncyAuaW5pdCBhbmQgLnJlbGVhc2UgbWV0aG9kcyByZXNwZWN0aXZlbHkuIC5zdXNwZW5kIGFuZCAucmVzdW1lCittZXRob2RzIGltcGxlbWVudCBob3N0J3MgcG93ZXItbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5IGFuZCBpdHMgdGhlaXIKK3Jlc3BvbnNpYmlsaXR5IHRvIGNhbGwgcmVzcGVjdGl2ZSBzZW5zb3IncyBtZXRob2RzLiAudHJ5X2J1c19wYXJhbSBhbmQKKy5zZXRfYnVzX3BhcmFtIGFyZSB1c2VkIHRvIG5lZ290aWF0ZSBwaHlzaWNhbCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYmV0d2VlbiB0aGUKK2hvc3QgYW5kIHRoZSBzZW5zb3IuIC5pbml0X3ZpZGVvYnVmIGlzIGNhbGxlZCBieSBzb2MtY2FtZXJhIGNvcmUgd2hlbiBhCit2aWRlby1kZXZpY2UgaXMgb3BlbmVkLCBmdXJ0aGVyIHZpZGVvLWJ1ZmZlciBtYW5hZ2VtZW50IGlzIGltcGxlbWVudGVkIGNvbXBsZXRlbHkKK2J5IHRoZSBzcGVjaWZpYyBjYW1lcmEgaG9zdCBkcml2ZXIuIFRoZSByZXN0IG9mIHRoZSBtZXRob2RzIGFyZSBjYWxsZWQgZnJvbQorcmVzcGVjdGl2ZSBWNEwyIG9wZXJhdGlvbnMuCisKK0NhbWVyYSBBUEkKKy0tLS0tLS0tLS0KKworU2Vuc29yIGRyaXZlcnMgY2FuIHVzZSBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rLCB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlCitwbGF0Zm9ybSwgYW5kIHVzZWQgdG8gc3BlY2lmeSB0byB3aGljaCBjYW1lcmEgaG9zdCBidXMgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQsCithbmQgYXJiaXRyYXJpbHkgcHJvdmlkZSBwbGF0Zm9ybSAucG93ZXIgYW5kIC5yZXNldCBtZXRob2RzIGZvciB0aGUgY2FtZXJhLgorc29jX2NhbWVyYV9kZXZpY2VfcmVnaXN0ZXIoKSBhbmQgc29jX2NhbWVyYV9kZXZpY2VfdW5yZWdpc3RlcigpIGZ1bmN0aW9ucyBhcmUKK3VzZWQgdG8gYWRkIGEgc2Vuc29yIGRyaXZlciB0byBvciByZW1vdmUgb25lIGZyb20gdGhlIHN5c3RlbS4gVGhlIHJlZ2lzdHJhdGlvbgorZnVuY3Rpb24gdGFrZXMgYSBwb2ludGVyIHRvIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSBhcyB0aGUgb25seSBwYXJhbWV0ZXIuCitUaGlzIHN0cnVjdCBjYW4gYmUgaW5pdGlhbGl6ZWQgYXMgZm9sbG93czoKKworCS8qIGxpbmsgdG8gZHJpdmVyIG9wZXJhdGlvbnMgKi8KKwlpY2QtPm9wcwk9ICZtdDltMDAxX29wczsKKwkvKiBsaW5rIHRvIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIChlLmcuLCBpMmMpIGRldmljZSAqLworCWljZC0+Y29udHJvbAk9ICZjbGllbnQtPmRldjsKKwkvKiB3aW5kb3cgZ2VvbWV0cnkgKi8KKwlpY2QtPnhfbWluCT0gMjA7CisJaWNkLT55X21pbgk9IDEyOworCWljZC0+eF9jdXJyZW50CT0gMjA7CisJaWNkLT55X2N1cnJlbnQJPSAxMjsKKwlpY2QtPndpZHRoX21pbgk9IDQ4OworCWljZC0+d2lkdGhfbWF4CT0gMTI4MDsKKwlpY2QtPmhlaWdodF9taW4JPSAzMjsKKwlpY2QtPmhlaWdodF9tYXgJPSAxMDI0OworCWljZC0+eV9za2lwX3RvcAk9IDE7CisJLyogY2FtZXJhIGJ1cyBJRCwgdHlwaWNhbGx5IG9idGFpbmVkIGZyb20gcGxhdGZvcm0gZGF0YSAqLworCWljZC0+aWZhY2UJPSBpY2wtPmJ1c19pZDsKKworc3RydWN0IHNvY19jYW1lcmFfb3BzIHByb3ZpZGVzIC5wcm9iZSBhbmQgLnJlbW92ZSBtZXRob2RzLCB3aGljaCBhcmUgY2FsbGVkIGJ5Cit0aGUgc29jLWNhbWVyYSBjb3JlLCB3aGVuIGEgY2FtZXJhIGlzIG1hdGNoZWQgYWdhaW5zdCBvciByZW1vdmVkIGZyb20gYSBjYW1lcmEKK2hvc3QgYnVzLCAuaW5pdCwgLnJlbGVhc2UsIC5zdXNwZW5kLCBhbmQgLnJlc3VtZSBhcmUgY2FsbGVkIGZyb20gdGhlIGNhbWVyYSBob3N0Citkcml2ZXIgYXMgZGlzY3Vzc2VkIGFib3ZlLiBPdGhlciBtZW1iZXJzIG9mIHRoaXMgc3RydWN0IHByb3ZpZGUgcmVzcGVjdGl2ZSBWNEwyCitmdW5jdGlvbmFsaXR5LgorCitzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgYWxzbyBsaW5rcyB0byBhbiBhcnJheSBvZiBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCwKK2xpc3RpbmcgcGl4ZWwgZm9ybWF0cywgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEuCisKKy0tCitBdXRob3I6IEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vdzEvMDAtSU5ERVgKaW5kZXggNTI3MGNmNC4uY2I0OTgwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93MS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3cxLzAwLUlOREVYCkBAIC0xLDUgKzEsNyBAQAogMDAtSU5ERVgKIAktIFRoaXMgZmlsZQorc2xhdmVzLworCS0gRHJpdmVycyB0aGF0IHByb3ZpZGUgc3VwcG9ydCBmb3Igc3BlY2lmaWMgZmFtaWx5IGNvZGVzLgogbWFzdGVycy8KIAktIEluZGl2aWR1YWwgY2hpcHMgcHJvdmlkaW5nIDEtd2lyZSBidXNzZXMuCiB3MS5nZW5lcmljCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDkwIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MAppbmRleCAyMzlmOWFlLi4yODE3NmRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvZHMyNDkwCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKQEAgLTE2LDMgKzE2LDU1IEBACiBEUzk0OTAoUikgaXMgYSBVU0IgPC0+IFcxIGJ1cyBtYXN0ZXIgZGV2aWNlCiB3aGljaCBoYXMgMHg4MSBmYW1pbHkgSUQgaW50ZWdyYXRlZCBjaGlwIGFuZCBEUzI0OTAKIGxvdy1sZXZlbCBvcGVyYXRpb25hbCBjaGlwLgorCitOb3RlcyBhbmQgbGltaXRhdGlvbnMuCistIFRoZSB3ZWFrIHB1bGx1cCBjdXJyZW50IGlzIGEgbWluaW11bSBvZiAwLjltQSBhbmQgbWF4aW11bSBvZiA2LjBtQS4KKy0gVGhlIDVWIHN0cm9uZyBwdWxsdXAgaXMgc3VwcG9ydGVkIHdpdGggYSBtaW5pbXVtIG9mIDUuOW1BIGFuZCBhCisgIG1heGltdW0gb2YgMzAuNCBtQS4gIChGcm9tIERTMjQ5MC5wZGYpCistIFdoaWxlIHRoZSBkczI0OTAgc3VwcG9ydHMgYSBoYXJkd2FyZSBzZWFyY2ggdGhlIGNvZGUgZG9lc24ndCB0YWtlCisgIGFkdmFudGFnZSBvZiBpdCAoaW4gdGVzdGVkIGNhc2UgaXQgb25seSByZXR1cm5lZCBmaXJzdCBkZXZpY2UpLgorLSBUaGUgaGFyZHdhcmUgd2lsbCBkZXRlY3Qgd2hlbiBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgYnVzIG9uIHRoZQorICBuZXh0IGJ1cyAocmVzZXQ/KSBvcGVyYXRpb24sIGhvd2V2ZXIgb25seSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBhcworICB0aGUgY29yZSB3MSBjb2RlIGRvZXNuJ3QgbWFrZSB1c2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgQ29ubmVjdGluZworICBvbmUgZGV2aWNlIHRlbmRzIHRvIGdpdmUgbXVsdGlwbGUgbmV3IGRldmljZSBub3RpZmljYXRpb25zLgorLSBUaGUgbnVtYmVyIG9mIFVTQiBidXMgdHJhbnNhY3Rpb25zIGNvdWxkIGJlIHJlZHVjZWQgaWYgdzFfcmVzZXRfc2VuZAorICB3YXMgYWRkZWQgdG8gdGhlIEFQSS4gIFRoZSBuYW1lIGlzIGp1c3QgYSBzdWdnZXN0aW9uLiAgSXQgd291bGQgdGFrZQorICBhIHdyaXRlIGJ1ZmZlciBhbmQgYSByZWFkIGJ1ZmZlciAoYWxvbmcgd2l0aCBzaXplcykgYXMgYXJndW1lbnRzLgorICBUaGUgZHMyNDkwIGJsb2NrIEkvTyBjb21tYW5kIHN1cHBvcnRzIHJlc2V0LCB3cml0ZSBidWZmZXIsIHJlYWQKKyAgYnVmZmVyLCBhbmQgc3Ryb25nIHB1bGx1cCBhbGwgaW4gb25lIGNvbW1hbmQsIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKKyAgMSByZXNldCBidXMsIDIgd3JpdGUgdGhlIG1hdGNoIHJvbSBjb21tYW5kIGFuZCBzbGF2ZSByb20gaWQsIDMgYmxvY2sKKyAgd3JpdGUgYW5kIHJlYWQgZGF0YS4gIFRoZSB3cml0ZSBidWZmZXIgbmVlZHMgdG8gaGF2ZSB0aGUgbWF0Y2ggcm9tCisgIGNvbW1hbmQgYW5kIHNsYXZlIHJvbSBpZCBwcmVwZW5kZWQgdG8gdGhlIGZyb250IG9mIHRoZSByZXF1ZXN0ZWQKKyAgd3JpdGUgYnVmZmVyLCBib3RoIG9mIHdoaWNoIGFyZSBrbm93biB0byB0aGUgZHJpdmVyLgorLSBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgbm9ybWFsLCBmbGV4aWJsZSwgYW5kIG92ZXJkcml2ZSBidXMKKyAgY29tbXVuaWNhdGlvbiBzcGVlZHMsIGJ1dCBvbmx5IHRoZSBub3JtYWwgaXMgc3VwcG9ydGVkLgorLSBUaGUgcmVnaXN0ZXJlZCB3MV9idXNfbWFzdGVyIGZ1bmN0aW9ucyBkb24ndCBkZWZpbmUgZXJyb3IKKyAgY29uZGl0aW9ucy4gIElmIGEgYnVzIHNlYXJjaCBpcyBpbiBwcm9ncmVzcyBhbmQgdGhlIGRzMjQ5MCBpcworICByZW1vdmVkIGl0IGNhbiBwcm9kdWNlIGEgZ29vZCBhbW91bnQgb2YgZXJyb3Igb3V0cHV0IGJlZm9yZSB0aGUgYnVzCisgIHNlYXJjaCBmaW5pc2hlcy4KKy0gVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGRldGVjdGluZyBzb21lIGVycm9yIGNvbmRpdGlvbnMsIHN1Y2ggYXMKKyAgc2hvcnQsIGFsYXJtaW5nIHByZXNlbmNlIG9uIHJlc2V0LCBhbmQgbm8gcHJlc2VuY2Ugb24gcmVzZXQsIGJ1dCB0aGUKKyAgZHJpdmVyIGRvZXNuJ3QgcXVlcnkgdGhvc2UgdmFsdWVzLgorLSBUaGUgZHMyNDkwIHNwZWNpZmljYXRpb24gZG9lc24ndCBjb3ZlciBzaG9ydCBidWxrIGluIHJlYWRzIGluCisgIGRldGFpbCwgYnV0IG15IG9ic2VydmF0aW9uIGlzIGlmIGZld2VyIGJ5dGVzIGFyZSByZXF1ZXN0ZWQgdGhhbiBhcmUKKyAgYXZhaWxhYmxlLCB0aGUgYnVsayByZWFkIHdpbGwgcmV0dXJuIGFuIGVycm9yIGFuZCB0aGUgaGFyZHdhcmUgd2lsbAorICBjbGVhciB0aGUgZW50aXJlIGJ1bGsgaW4gYnVmZmVyLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gcmVhZCB0aGUKKyAgbWF4aW11bSBidWZmZXIgc2l6ZSB0byBub3QgcnVuIGludG8gdGhpcyBlcnJvciBjb25kaXRpb24sIG9ubHkgZXh0cmEKKyAgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBpcyBhIGxvZ2ljIGVycm9yIGluIHRoZSBkcml2ZXIuICBUaGUgY29kZSBzaG91bGQKKyAgc2hvdWxkIG1hdGNoIHJlYWRzIGFuZCB3cml0ZXMgYXMgd2VsbCBhcyBkYXRhIHNpemVzLiAgUmVhZHMgYW5kCisgIHdyaXRlcyBhcmUgc2VyaWFsaXplZCBhbmQgdGhlIHN0YXR1cyB2ZXJpZmllcyB0aGF0IHRoZSBjaGlwIGlzIGlkbGUKKyAgKGFuZCBkYXRhIGlzIGF2YWlsYWJsZSkgYmVmb3JlIHRoZSByZWFkIGlzIGV4ZWN1dGVkLCBzbyBpdCBzaG91bGQKKyAgbm90IGhhcHBlbi4KKy0gUnVubmluZyB4ODZfNjQgMi42LjI0IFVIQ0kgdW5kZXIgcWVtdSAwLjkuMCB1bmRlciB4ODZfNjQgMi42LjIyLXJjNgorICB3aXRoIGEgT0hDSSBjb250cm9sbGVyLCBkczI0OTAgcnVubmluZyBpbiB0aGUgZ3Vlc3Qgd291bGQgb3BlcmF0ZQorICBub3JtYWxseSB0aGUgZmlyc3QgdGltZSB0aGUgbW9kdWxlIHdhcyBsb2FkZWQgYWZ0ZXIgcWVtdSBhdHRhY2hlZAorICB0aGUgZHMyNDkwIGhhcmR3YXJlLCBidXQgaWYgdGhlIG1vZHVsZSB3YXMgdW5sb2FkZWQsIHRoZW4gcmVsb2FkZWQKKyAgbW9zdCBvZiB0aGUgdGltZSBvbmUgb2YgdGhlIGJ1bGsgb3V0IG9yIGluLCBhbmQgdXN1YWxseSB0aGUgYnVsayBpbgorICB3b3VsZCBmYWlsLiAgcWVtdSBzZXRzIGEgNTBtcyB0aW1lb3V0IGFuZCB0aGUgYnVsayBpbiB3b3VsZCB0aW1lb3V0CisgIGV2ZW4gd2hlbiB0aGUgc3RhdHVzIHNob3dzIGRhdGEgYXZhaWxhYmxlLiAgQSBidWxrIG91dCB3cml0ZSB3b3VsZAorICBzaG93IGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBidXQgdGhlIGRzMjQ5MCBzdGF0dXMgcmVnaXN0ZXIgd291bGQKKyAgc2hvdyAwIGJ5dGVzIHdyaXR0ZW4uICBEZXRhY2hpbmcgcWVtdSBmcm9tIHRoZSBkczI0OTAgaGFyZHdhcmUgYW5kCisgIHJlYXR0YWNoaW5nIHdvdWxkIGNsZWFyIHRoZSBwcm9ibGVtLiAgdXNibW9uIG91dHB1dCBpbiB0aGUgZ3Vlc3QgYW5kCisgIGhvc3QgZGlkIG5vdCBleHBsYWluIHRoZSBwcm9ibGVtLiAgTXkgZ3Vlc3MgaXMgYSBidWcgaW4gZWl0aGVyIHFlbXUKKyAgb3IgdGhlIGhvc3QgT1MgYW5kIG1vcmUgbGlrZWx5IHRoZSBob3N0IE9TLgorLS0gMDMtMDYtMjAwOCBEYXZpZCBGcmllcyA8RGF2aWRARnJpZXMubmV0PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy8wMC1JTkRFWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEwMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvMDAtSU5ERVgKQEAgLTAsMCArMSw0IEBACiswMC1JTkRFWAorCS0gVGhpcyBmaWxlCit3MV90aGVybQorCS0gVGhlIE1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIGRzMTgqMjAgdGVtcGVyYXR1cmUgc2Vuc29yLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvdzFfdGhlcm0gYi9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy93MV90aGVybQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDAzYWFhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvdzFfdGhlcm0KQEAgLTAsMCArMSw0MSBAQAorS2VybmVsIGRyaXZlciB3MV90aGVybQorPT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIE1heGltIGRzMTgqMjAgYmFzZWQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKworQXV0aG9yOiBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCit3MV90aGVybSBwcm92aWRlcyBiYXNpYyB0ZW1wZXJhdHVyZSBjb252ZXJzaW9uIGZvciBkczE4KjIwIGRldmljZXMuCitzdXBwb3J0ZWQgZmFtaWx5IGNvZGVzOgorVzFfVEhFUk1fRFMxOFMyMAkweDEwCitXMV9USEVSTV9EUzE4MjIJCTB4MjIKK1cxX1RIRVJNX0RTMThCMjAJMHgyOAorCitTdXBwb3J0IGlzIHByb3ZpZGVkIHRocm91Z2ggdGhlIHN5c2ZzIHcxX3NsYXZlIGZpbGUuICBFYWNoIG9wZW4gYW5kCityZWFkIHNlcXVlbmNlIHdpbGwgaW5pdGlhdGUgYSB0ZW1wZXJhdHVyZSBjb252ZXJzaW9uIHRoZW4gcHJvdmlkZSB0d28KK2xpbmVzIG9mIEFTQ0lJIG91dHB1dC4gIFRoZSBmaXJzdCBsaW5lIGNvbnRhaW5zIHRoZSBuaW5lIGhleCBieXRlcworcmVhZCBhbG9uZyB3aXRoIGEgY2FsY3VsYXRlZCBjcmMgdmFsdWUgYW5kIFlFUyBvciBOTyBpZiBpdCBtYXRjaGVkLgorSWYgdGhlIGNyYyBtYXRjaGVkIHRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlIHJldGFpbmVkLiAgVGhlIHNlY29uZCBsaW5lCitkaXNwbGF5cyB0aGUgcmV0YWluZWQgdmFsdWVzIGFsb25nIHdpdGggYSB0ZW1wZXJhdHVyZSBpbiBtaWxsaWRlZ3JlZXMKK0NlbnRpZ3JhZGUgYWZ0ZXIgdD0uCisKK1BhcmFzaXRlIHBvd2VyZWQgZGV2aWNlcyBhcmUgbGltaXRlZCB0byBvbmUgc2xhdmUgcGVyZm9ybWluZyBhCit0ZW1wZXJhdHVyZSBjb252ZXJzaW9uIGF0IGEgdGltZS4gIElmIG5vbmUgb2YgdGhlIGRldmljZXMgYXJlIHBhcmFzaXRlCitwb3dlcmVkIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNvbnZlcnQgYWxsIHRoZSBkZXZpY2VzIGF0IHRoZSBzYW1lCit0aW1lIGFuZCB0aGVuIGdvIGJhY2sgdG8gcmVhZCBpbmRpdmlkdWFsIHNlbnNvcnMuICBUaGF0IGlzbid0CitjdXJyZW50bHkgc3VwcG9ydGVkLiAgVGhlIGRyaXZlciBhbHNvIGRvZXNuJ3Qgc3VwcG9ydCByZWR1Y2VkCitwcmVjaXNpb24gKHdoaWNoIHdvdWxkIGFsc28gcmVkdWNlIHRoZSBjb252ZXJzaW9uIHRpbWUpLgorCitUaGUgbW9kdWxlIHBhcmFtZXRlciBzdHJvbmdfcHVsbHVwIGNhbiBiZSBzZXQgdG8gMCB0byBkaXNhYmxlIHRoZQorc3Ryb25nIHB1bGx1cCBvciAxIHRvIGVuYWJsZS4gIElmIGVuYWJsZWQgdGhlIDVWIHN0cm9uZyBwdWxsdXAgd2lsbCBiZQorZW5hYmxlZCB3aGVuIHRoZSBjb252ZXJzaW9uIGlzIHRha2luZyBwbGFjZSBwcm92aWRlZCB0aGUgbWFzdGVyIGRyaXZlcgorbXVzdCBzdXBwb3J0IHRoZSBzdHJvbmcgcHVsbHVwIChvciBpdCBmYWxscyBiYWNrIHRvIGEgcHVsbHVwCityZXNpc3RvcikuICBUaGUgRFMxOGIyMCB0ZW1wZXJhdHVyZSBzZW5zb3Igc3BlY2lmaWNhdGlvbiBsaXN0cyBhCittYXhpbXVtIGN1cnJlbnQgZHJhdyBvZiAxLjVtQSBhbmQgdGhhdCBhIDVrIHB1bGx1cCByZXNpc3RvciBpcyBub3QKK3N1ZmZpY2llbnQuICBUaGUgc3Ryb25nIHB1bGx1cCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIHRoZSBhZGRpdGlvbmFsCitjdXJyZW50IHJlcXVpcmVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS93MS5nZW5lcmljIGIvRG9jdW1lbnRhdGlvbi93MS93MS5nZW5lcmljCmluZGV4IDRjNjUwOWQuLmUzMzMzZWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEuZ2VuZXJpYworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLmdlbmVyaWMKQEAgLTc5LDEwICs3OSwxMyBAQAogPHh4LXh4eHh4eHh4eHh4eHg+IC0gYSBkaXJlY3RvcnkgZm9yIGEgZm91bmQgZGV2aWNlLiBUaGUgZm9ybWF0IGlzIGZhbWlseS1zZXJpYWwKIGJ1cyAgICAgICAgICAgICAgICAtIChzdGFuZGFyZCkgc3ltbGluayB0byB0aGUgdzEgYnVzCiBkcml2ZXIgICAgICAgICAgICAgLSAoc3RhbmRhcmQpIHN5bWxpbmsgdG8gdGhlIHcxIGRyaXZlcgordzFfbWFzdGVyX2FkZCAgICAgIC0gTWFudWFsbHkgcmVnaXN0ZXIgYSBzbGF2ZSBkZXZpY2UKIHcxX21hc3Rlcl9hdHRlbXB0cyAtIHRoZSBudW1iZXIgb2YgdGltZXMgYSBzZWFyY2ggd2FzIGF0dGVtcHRlZAogdzFfbWFzdGVyX21heF9zbGF2ZV9jb3VudAogICAgICAgICAgICAgICAgICAgIC0gdGhlIG1heGltdW0gc2xhdmVzIHRoYXQgbWF5IGJlIGF0dGFjaGVkIHRvIGEgbWFzdGVyCiB3MV9tYXN0ZXJfbmFtZSAgICAgLSB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlICh3MV9idXNfbWFzdGVyWCkKK3cxX21hc3Rlcl9wdWxsdXAgICAtIDVWIHN0cm9uZyBwdWxsdXAgMCBlbmFibGVkLCAxIGRpc2FibGVkCit3MV9tYXN0ZXJfcmVtb3ZlICAgLSBNYW51YWxseSByZW1vdmUgYSBzbGF2ZSBkZXZpY2UKIHcxX21hc3Rlcl9zZWFyY2ggICAtIHRoZSBudW1iZXIgb2Ygc2VhcmNoZXMgbGVmdCB0byBkbywgLTE9Y29udGludWFsIChkZWZhdWx0KQogdzFfbWFzdGVyX3NsYXZlX2NvdW50CiAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHNsYXZlcyBmb3VuZApAQCAtOTAsNyArOTMsMTMgQEAKIHcxX21hc3Rlcl90aW1lb3V0ICAtIHRoZSBkZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gc2VhcmNoZXMKIAogSWYgeW91IGhhdmUgYSB3MSBidXMgdGhhdCBuZXZlciBjaGFuZ2VzICh5b3UgZG9uJ3QgYWRkIG9yIHJlbW92ZSBkZXZpY2VzKSwKLXlvdSBjYW4gc2V0IHcxX21hc3Rlcl9zZWFyY2ggdG8gYSBwb3NpdGl2ZSB2YWx1ZSB0byBkaXNhYmxlIHNlYXJjaGVzLgoreW91IGNhbiBzZXQgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgc2VhcmNoX2NvdW50IHRvIGEgc21hbGwgcG9zaXRpdmUgbnVtYmVyCitmb3IgYW4gaW5pdGlhbGx5IHNtYWxsIG51bWJlciBvZiBidXMgc2VhcmNoZXMuICBBbHRlcm5hdGl2ZWx5IGl0IGNvdWxkIGJlCitzZXQgdG8gemVybywgdGhlbiBtYW51YWxseSBhZGQgdGhlIHNsYXZlIGRldmljZSBzZXJpYWwgbnVtYmVycyBieQordzFfbWFzdGVyX2FkZCBkZXZpY2UgZmlsZS4gIFRoZSB3MV9tYXN0ZXJfYWRkIGFuZCB3MV9tYXN0ZXJfcmVtb3ZlIGZpbGVzCitnZW5lcmFsbHkgb25seSBtYWtlIHNlbnNlIHdoZW4gc2VhcmNoaW5nIGlzIGRpc2FibGVkLCBhcyBhIHNlYXJjaCB3aWxsCityZWRldGVjdCBtYW51YWxseSByZW1vdmVkIGRldmljZXMgdGhhdCBhcmUgcHJlc2VudCBhbmQgdGltZW91dCBtYW51YWxseQorYWRkZWQgZGV2aWNlcyB0aGF0IGFyZW4ndCBvbiB0aGUgYnVzLgogCiAKIHcxIHNsYXZlIHN5c2ZzIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3g4Ni8wMC1JTkRFWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUzMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvMDAtSU5ERVgKQEAgLTAsMCArMSw0IEBACiswMC1JTkRFWAorCS0gdGhpcyBmaWxlCittdHJyLnR4dAorCS0gaG93IHRvIHVzZSB4ODYgTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXJzIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dCBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzAwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dApAQCAtMCwwICsxLDkwMCBAQAorCQkgICAgIFRIRSBMSU5VWC94ODYgQk9PVCBQUk9UT0NPTAorCQkgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbiB0aGUgeDg2IHBsYXRmb3JtLCB0aGUgTGludXgga2VybmVsIHVzZXMgYSByYXRoZXIgY29tcGxpY2F0ZWQgYm9vdAorY29udmVudGlvbi4gIFRoaXMgaGFzIGV2b2x2ZWQgcGFydGlhbGx5IGR1ZSB0byBoaXN0b3JpY2FsIGFzcGVjdHMsIGFzCit3ZWxsIGFzIHRoZSBkZXNpcmUgaW4gdGhlIGVhcmx5IGRheXMgdG8gaGF2ZSB0aGUga2VybmVsIGl0c2VsZiBiZSBhCitib290YWJsZSBpbWFnZSwgdGhlIGNvbXBsaWNhdGVkIFBDIG1lbW9yeSBtb2RlbCBhbmQgZHVlIHRvIGNoYW5nZWQKK2V4cGVjdGF0aW9ucyBpbiB0aGUgUEMgaW5kdXN0cnkgY2F1c2VkIGJ5IHRoZSBlZmZlY3RpdmUgZGVtaXNlIG9mCityZWFsLW1vZGUgRE9TIGFzIGEgbWFpbnN0cmVhbSBvcGVyYXRpbmcgc3lzdGVtLgorCitDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgdGhlIExpbnV4L3g4NiBib290IHByb3RvY29sIGV4aXN0LgorCitPbGQga2VybmVsczoJekltYWdlL0ltYWdlIHN1cHBvcnQgb25seS4gIFNvbWUgdmVyeSBlYXJseSBrZXJuZWxzCisJCW1heSBub3QgZXZlbiBzdXBwb3J0IGEgY29tbWFuZCBsaW5lLgorCitQcm90b2NvbCAyLjAwOgkoS2VybmVsIDEuMy43MykgQWRkZWQgYnpJbWFnZSBhbmQgaW5pdHJkIHN1cHBvcnQsIGFzCisJCXdlbGwgYXMgYSBmb3JtYWxpemVkIHdheSB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZQorCQlib290IGxvYWRlciBhbmQgdGhlIGtlcm5lbC4gIHNldHVwLlMgbWFkZSByZWxvY2F0YWJsZSwKKwkJYWx0aG91Z2ggdGhlIHRyYWRpdGlvbmFsIHNldHVwIGFyZWEgc3RpbGwgYXNzdW1lZAorCQl3cml0YWJsZS4KKworUHJvdG9jb2wgMi4wMToJKEtlcm5lbCAxLjMuNzYpIEFkZGVkIGEgaGVhcCBvdmVycnVuIHdhcm5pbmcuCisKK1Byb3RvY29sIDIuMDI6CShLZXJuZWwgMi40LjAtdGVzdDMtcHJlMykgTmV3IGNvbW1hbmQgbGluZSBwcm90b2NvbC4KKwkJTG93ZXIgdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgY2VpbGluZy4JTm8gb3ZlcndyaXRlCisJCW9mIHRoZSB0cmFkaXRpb25hbCBzZXR1cCBhcmVhLCB0aHVzIG1ha2luZyBib290aW5nCisJCXNhZmUgZm9yIHN5c3RlbXMgd2hpY2ggdXNlIHRoZSBFQkRBIGZyb20gU01NIG9yIDMyLWJpdAorCQlCSU9TIGVudHJ5IHBvaW50cy4gIHpJbWFnZSBkZXByZWNhdGVkIGJ1dCBzdGlsbAorCQlzdXBwb3J0ZWQuCisKK1Byb3RvY29sIDIuMDM6CShLZXJuZWwgMi40LjE4LXByZTEpIEV4cGxpY2l0bHkgbWFrZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUKKwkJaW5pdHJkIGFkZHJlc3MgYXZhaWxhYmxlIHRvIHRoZSBib290bG9hZGVyLgorCitQcm90b2NvbCAyLjA0OgkoS2VybmVsIDIuNi4xNCkgRXh0ZW5kIHRoZSBzeXNzaXplIGZpZWxkIHRvIGZvdXIgYnl0ZXMuCisKK1Byb3RvY29sIDIuMDU6CShLZXJuZWwgMi42LjIwKSBNYWtlIHByb3RlY3RlZCBtb2RlIGtlcm5lbCByZWxvY2F0YWJsZS4KKwkJSW50cm9kdWNlIHJlbG9jYXRhYmxlX2tlcm5lbCBhbmQga2VybmVsX2FsaWdubWVudCBmaWVsZHMuCisKK1Byb3RvY29sIDIuMDY6CShLZXJuZWwgMi42LjIyKSBBZGRlZCBhIGZpZWxkIHRoYXQgY29udGFpbnMgdGhlIHNpemUgb2YKKwkJdGhlIGJvb3QgY29tbWFuZCBsaW5lLgorCitQcm90b2NvbCAyLjA3OgkoS2VybmVsIDIuNi4yNCkgQWRkZWQgcGFyYXZpcnR1YWxpc2VkIGJvb3QgcHJvdG9jb2wuCisJCUludHJvZHVjZWQgaGFyZHdhcmVfc3ViYXJjaCBhbmQgaGFyZHdhcmVfc3ViYXJjaF9kYXRhCisJCWFuZCBLRUVQX1NFR01FTlRTIGZsYWcgaW4gbG9hZF9mbGFncy4KKworUHJvdG9jb2wgMi4wODoJKEtlcm5lbCAyLjYuMjYpIEFkZGVkIGNyYzMyIGNoZWNrc3VtIGFuZCBFTEYgZm9ybWF0CisJCXBheWxvYWQuIEludHJvZHVjZWQgcGF5bG9hZF9vZmZzZXQgYW5kIHBheWxvYWQgbGVuZ3RoCisJCWZpZWxkcyB0byBhaWQgaW4gbG9jYXRpbmcgdGhlIHBheWxvYWQuCisKK1Byb3RvY29sIDIuMDk6CShLZXJuZWwgMi42LjI2KSBBZGRlZCBhIGZpZWxkIG9mIDY0LWJpdCBwaHlzaWNhbAorCQlwb2ludGVyIHRvIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBzdHJ1Y3QJc2V0dXBfZGF0YS4KKworKioqKiBNRU1PUlkgTEFZT1VUCisKK1RoZSB0cmFkaXRpb25hbCBtZW1vcnkgbWFwIGZvciB0aGUga2VybmVsIGxvYWRlciwgdXNlZCBmb3IgSW1hZ2Ugb3IKK3pJbWFnZSBrZXJuZWxzLCB0eXBpY2FsbHkgbG9va3MgbGlrZToKKworCXwJCQkgfAorMEEwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCAgUmVzZXJ2ZWQgZm9yIEJJT1MJIHwJRG8gbm90IHVzZS4gIFJlc2VydmVkIGZvciBCSU9TIEVCREEuCiswOUEwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8ICBDb21tYW5kIGxpbmUJCSB8CisJfCAgU3RhY2svaGVhcAkJIHwJRm9yIHVzZSBieSB0aGUga2VybmVsIHJlYWwtbW9kZSBjb2RlLgorMDk4MDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCQorCXwgIEtlcm5lbCBzZXR1cAkJIHwJVGhlIGtlcm5lbCByZWFsLW1vZGUgY29kZS4KKzA5MDIwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgIEtlcm5lbCBib290IHNlY3RvcgkgfAlUaGUga2VybmVsIGxlZ2FjeSBib290IHNlY3Rvci4KKzA5MDAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgIFByb3RlY3RlZC1tb2RlIGtlcm5lbCB8CVRoZSBidWxrIG9mIHRoZSBrZXJuZWwgaW1hZ2UuCiswMTAwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8ICBCb290IGxvYWRlcgkJIHwJPC0gQm9vdCBzZWN0b3IgZW50cnkgcG9pbnQgMDAwMDo3QzAwCiswMDEwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8ICBSZXNlcnZlZCBmb3IgTUJSL0JJT1MgfAorMDAwODAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCAgVHlwaWNhbGx5IHVzZWQgYnkgTUJSIHwKKzAwMDYwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAKKwl8ICBCSU9TIHVzZSBvbmx5CSB8CiswMDAwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworCitXaGVuIHVzaW5nIGJ6SW1hZ2UsIHRoZSBwcm90ZWN0ZWQtbW9kZSBrZXJuZWwgd2FzIHJlbG9jYXRlZCB0bworMHgxMDAwMDAgKCJoaWdoIG1lbW9yeSIpLCBhbmQgdGhlIGtlcm5lbCByZWFsLW1vZGUgYmxvY2sgKGJvb3Qgc2VjdG9yLAorc2V0dXAsIGFuZCBzdGFjay9oZWFwKSB3YXMgbWFkZSByZWxvY2F0YWJsZSB0byBhbnkgYWRkcmVzcyBiZXR3ZWVuCisweDEwMDAwIGFuZCBlbmQgb2YgbG93IG1lbW9yeS4gVW5mb3J0dW5hdGVseSwgaW4gcHJvdG9jb2xzIDIuMDAgYW5kCisyLjAxIHRoZSAweDkwMDAwKyBtZW1vcnkgcmFuZ2UgaXMgc3RpbGwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWw7Cit0aGUgMi4wMiBwcm90b2NvbCByZXNvbHZlcyB0aGF0IHByb2JsZW0uCisKK0l0IGlzIGRlc2lyYWJsZSB0byBrZWVwIHRoZSAibWVtb3J5IGNlaWxpbmciIC0tIHRoZSBoaWdoZXN0IHBvaW50IGluCitsb3cgbWVtb3J5IHRvdWNoZWQgYnkgdGhlIGJvb3QgbG9hZGVyIC0tIGFzIGxvdyBhcyBwb3NzaWJsZSwgc2luY2UKK3NvbWUgbmV3ZXIgQklPU2VzIGhhdmUgYmVndW4gdG8gYWxsb2NhdGUgc29tZSByYXRoZXIgbGFyZ2UgYW1vdW50cyBvZgorbWVtb3J5LCBjYWxsZWQgdGhlIEV4dGVuZGVkIEJJT1MgRGF0YSBBcmVhLCBuZWFyIHRoZSB0b3Agb2YgbG93CittZW1vcnkuCSBUaGUgYm9vdCBsb2FkZXIgc2hvdWxkIHVzZSB0aGUgIklOVCAxMmgiIEJJT1MgY2FsbCB0byB2ZXJpZnkKK2hvdyBtdWNoIGxvdyBtZW1vcnkgaXMgYXZhaWxhYmxlLgorCitVbmZvcnR1bmF0ZWx5LCBpZiBJTlQgMTJoIHJlcG9ydHMgdGhhdCB0aGUgYW1vdW50IG9mIG1lbW9yeSBpcyB0b28KK2xvdywgdGhlcmUgaXMgdXN1YWxseSBub3RoaW5nIHRoZSBib290IGxvYWRlciBjYW4gZG8gYnV0IHRvIHJlcG9ydCBhbgorZXJyb3IgdG8gdGhlIHVzZXIuICBUaGUgYm9vdCBsb2FkZXIgc2hvdWxkIHRoZXJlZm9yZSBiZSBkZXNpZ25lZCB0bwordGFrZSB1cCBhcyBsaXR0bGUgc3BhY2UgaW4gbG93IG1lbW9yeSBhcyBpdCByZWFzb25hYmx5IGNhbi4gIEZvcgorekltYWdlIG9yIG9sZCBiekltYWdlIGtlcm5lbHMsIHdoaWNoIG5lZWQgZGF0YSB3cml0dGVuIGludG8gdGhlCisweDkwMDAwIHNlZ21lbnQsIHRoZSBib290IGxvYWRlciBzaG91bGQgbWFrZSBzdXJlIG5vdCB0byB1c2UgbWVtb3J5CithYm92ZSB0aGUgMHg5QTAwMCBwb2ludDsgdG9vIG1hbnkgQklPU2VzIHdpbGwgYnJlYWsgYWJvdmUgdGhhdCBwb2ludC4KKworRm9yIGEgbW9kZXJuIGJ6SW1hZ2Uga2VybmVsIHdpdGggYm9vdCBwcm90b2NvbCB2ZXJzaW9uID49IDIuMDIsIGEKK21lbW9yeSBsYXlvdXQgbGlrZSB0aGUgZm9sbG93aW5nIGlzIHN1Z2dlc3RlZDoKKworCX4gICAgICAgICAgICAgICAgICAgICAgICB+CisgICAgICAgIHwgIFByb3RlY3RlZC1tb2RlIGtlcm5lbCB8CisxMDAwMDAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCAgSS9PIG1lbW9yeSBob2xlCSB8CiswQTAwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8ICBSZXNlcnZlZCBmb3IgQklPUwkgfAlMZWF2ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHVudXNlZAorCX4gICAgICAgICAgICAgICAgICAgICAgICB+CisJfCAgQ29tbWFuZCBsaW5lCQkgfAkoQ2FuIGFsc28gYmUgYmVsb3cgdGhlIFgrMTAwMDAgbWFyaykKK1grMTAwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8ICBTdGFjay9oZWFwCQkgfAlGb3IgdXNlIGJ5IHRoZSBrZXJuZWwgcmVhbC1tb2RlIGNvZGUuCitYKzA4MDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCQorCXwgIEtlcm5lbCBzZXR1cAkJIHwJVGhlIGtlcm5lbCByZWFsLW1vZGUgY29kZS4KKwl8ICBLZXJuZWwgYm9vdCBzZWN0b3IJIHwJVGhlIGtlcm5lbCBsZWdhY3kgYm9vdCBzZWN0b3IuCitYICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCAgQm9vdCBsb2FkZXIJCSB8CTwtIEJvb3Qgc2VjdG9yIGVudHJ5IHBvaW50IDAwMDA6N0MwMAorMDAxMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCAgUmVzZXJ2ZWQgZm9yIE1CUi9CSU9TIHwKKzAwMDgwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgIFR5cGljYWxseSB1c2VkIGJ5IE1CUiB8CiswMDA2MDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgCisJfCAgQklPUyB1c2Ugb25seQkgfAorMDAwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKy4uLiB3aGVyZSB0aGUgYWRkcmVzcyBYIGlzIGFzIGxvdyBhcyB0aGUgZGVzaWduIG9mIHRoZSBib290IGxvYWRlcgorcGVybWl0cy4KKworCisqKioqIFRIRSBSRUFMLU1PREUgS0VSTkVMIEhFQURFUgorCitJbiB0aGUgZm9sbG93aW5nIHRleHQsIGFuZCBhbnl3aGVyZSBpbiB0aGUga2VybmVsIGJvb3Qgc2VxdWVuY2UsICJhCitzZWN0b3IiIHJlZmVycyB0byA1MTIgYnl0ZXMuICBJdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgYWN0dWFsIHNlY3Rvcgorc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBtZWRpdW0uCisKK1RoZSBmaXJzdCBzdGVwIGluIGxvYWRpbmcgYSBMaW51eCBrZXJuZWwgc2hvdWxkIGJlIHRvIGxvYWQgdGhlCityZWFsLW1vZGUgY29kZSAoYm9vdCBzZWN0b3IgYW5kIHNldHVwIGNvZGUpIGFuZCB0aGVuIGV4YW1pbmUgdGhlCitmb2xsb3dpbmcgaGVhZGVyIGF0IG9mZnNldCAweDAxZjEuICBUaGUgcmVhbC1tb2RlIGNvZGUgY2FuIHRvdGFsIHVwIHRvCiszMkssIGFsdGhvdWdoIHRoZSBib290IGxvYWRlciBtYXkgY2hvb3NlIHRvIGxvYWQgb25seSB0aGUgZmlyc3QgdHdvCitzZWN0b3JzICgxSykgYW5kIHRoZW4gZXhhbWluZSB0aGUgYm9vdHVwIHNlY3RvciBzaXplLgorCitUaGUgaGVhZGVyIGxvb2tzIGxpa2U6CisKK09mZnNldAlQcm90bwlOYW1lCQlNZWFuaW5nCisvU2l6ZQorCiswMUYxLzEJQUxMKDEJc2V0dXBfc2VjdHMJVGhlIHNpemUgb2YgdGhlIHNldHVwIGluIHNlY3RvcnMKKzAxRjIvMglBTEwJcm9vdF9mbGFncwlJZiBzZXQsIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZG9ubHkKKzAxRjQvNAkyLjA0KygyCXN5c3NpemUJCVRoZSBzaXplIG9mIHRoZSAzMi1iaXQgY29kZSBpbiAxNi1ieXRlIHBhcmFzCiswMUY4LzIJQUxMCXJhbV9zaXplCURPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seQorMDFGQS8yCUFMTAl2aWRfbW9kZQlWaWRlbyBtb2RlIGNvbnRyb2wKKzAxRkMvMglBTEwJcm9vdF9kZXYJRGVmYXVsdCByb290IGRldmljZSBudW1iZXIKKzAxRkUvMglBTEwJYm9vdF9mbGFnCTB4QUE1NSBtYWdpYyBudW1iZXIKKzAyMDAvMgkyLjAwKwlqdW1wCQlKdW1wIGluc3RydWN0aW9uCiswMjAyLzQJMi4wMCsJaGVhZGVyCQlNYWdpYyBzaWduYXR1cmUgIkhkclMiCiswMjA2LzIJMi4wMCsJdmVyc2lvbgkJQm9vdCBwcm90b2NvbCB2ZXJzaW9uIHN1cHBvcnRlZAorMDIwOC80CTIuMDArCXJlYWxtb2RlX3N3dGNoCUJvb3QgbG9hZGVyIGhvb2sgKHNlZSBiZWxvdykKKzAyMEMvMgkyLjAwKwlzdGFydF9zeXMJVGhlIGxvYWQtbG93IHNlZ21lbnQgKDB4MTAwMCkgKG9ic29sZXRlKQorMDIwRS8yCTIuMDArCWtlcm5lbF92ZXJzaW9uCVBvaW50ZXIgdG8ga2VybmVsIHZlcnNpb24gc3RyaW5nCiswMjEwLzEJMi4wMCsJdHlwZV9vZl9sb2FkZXIJQm9vdCBsb2FkZXIgaWRlbnRpZmllcgorMDIxMS8xCTIuMDArCWxvYWRmbGFncwlCb290IHByb3RvY29sIG9wdGlvbiBmbGFncworMDIxMi8yCTIuMDArCXNldHVwX21vdmVfc2l6ZQlNb3ZlIHRvIGhpZ2ggbWVtb3J5IHNpemUgKHVzZWQgd2l0aCBob29rcykKKzAyMTQvNAkyLjAwKwljb2RlMzJfc3RhcnQJQm9vdCBsb2FkZXIgaG9vayAoc2VlIGJlbG93KQorMDIxOC80CTIuMDArCXJhbWRpc2tfaW1hZ2UJaW5pdHJkIGxvYWQgYWRkcmVzcyAoc2V0IGJ5IGJvb3QgbG9hZGVyKQorMDIxQy80CTIuMDArCXJhbWRpc2tfc2l6ZQlpbml0cmQgc2l6ZSAoc2V0IGJ5IGJvb3QgbG9hZGVyKQorMDIyMC80CTIuMDArCWJvb3RzZWN0X2tsdWRnZQlETyBOT1QgVVNFIC0gZm9yIGJvb3RzZWN0LlMgdXNlIG9ubHkKKzAyMjQvMgkyLjAxKwloZWFwX2VuZF9wdHIJRnJlZSBtZW1vcnkgYWZ0ZXIgc2V0dXAgZW5kCiswMjI2LzIJTi9BCXBhZDEJCVVudXNlZAorMDIyOC80CTIuMDIrCWNtZF9saW5lX3B0cgkzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorMDIyQy80CTIuMDMrCWluaXRyZF9hZGRyX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiswMjMwLzQJMi4wNSsJa2VybmVsX2FsaWdubWVudCBQaHlzaWNhbCBhZGRyIGFsaWdubWVudCByZXF1aXJlZCBmb3Iga2VybmVsCiswMjM0LzEJMi4wNSsJcmVsb2NhdGFibGVfa2VybmVsIFdoZXRoZXIga2VybmVsIGlzIHJlbG9jYXRhYmxlIG9yIG5vdAorMDIzNS8zCU4vQQlwYWQyCQlVbnVzZWQKKzAyMzgvNAkyLjA2KwljbWRsaW5lX3NpemUJTWF4aW11bSBzaXplIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lCiswMjNDLzQJMi4wNysJaGFyZHdhcmVfc3ViYXJjaCBIYXJkd2FyZSBzdWJhcmNoaXRlY3R1cmUKKzAyNDAvOAkyLjA3KwloYXJkd2FyZV9zdWJhcmNoX2RhdGEgU3ViYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGRhdGEKKzAyNDgvNAkyLjA4KwlwYXlsb2FkX29mZnNldAlPZmZzZXQgb2Yga2VybmVsIHBheWxvYWQKKzAyNEMvNAkyLjA4KwlwYXlsb2FkX2xlbmd0aAlMZW5ndGggb2Yga2VybmVsIHBheWxvYWQKKzAyNTAvOAkyLjA5KwlzZXR1cF9kYXRhCTY0LWJpdCBwaHlzaWNhbCBwb2ludGVyIHRvIGxpbmtlZCBsaXN0CisJCQkJb2Ygc3RydWN0IHNldHVwX2RhdGEKKworKDEpIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHNldHVwX3NlY3RzIGZpZWxkIGNvbnRhaW5zIDAsIHRoZQorICAgIHJlYWwgdmFsdWUgaXMgNC4KKworKDIpIEZvciBib290IHByb3RvY29sIHByaW9yIHRvIDIuMDQsIHRoZSB1cHBlciB0d28gYnl0ZXMgb2YgdGhlIHN5c3NpemUKKyAgICBmaWVsZCBhcmUgdW51c2FibGUsIHdoaWNoIG1lYW5zIHRoZSBzaXplIG9mIGEgYnpJbWFnZSBrZXJuZWwKKyAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworSWYgdGhlICJIZHJTIiAoMHg1MzcyNjQ0OCkgbWFnaWMgbnVtYmVyIGlzIG5vdCBmb3VuZCBhdCBvZmZzZXQgMHgyMDIsCit0aGUgYm9vdCBwcm90b2NvbCB2ZXJzaW9uIGlzICJvbGQiLiAgTG9hZGluZyBhbiBvbGQga2VybmVsLCB0aGUKK2ZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhc3N1bWVkOgorCisJSW1hZ2UgdHlwZSA9IHpJbWFnZQorCWluaXRyZCBub3Qgc3VwcG9ydGVkCisJUmVhbC1tb2RlIGtlcm5lbCBtdXN0IGJlIGxvY2F0ZWQgYXQgMHg5MDAwMC4KKworT3RoZXJ3aXNlLCB0aGUgInZlcnNpb24iIGZpZWxkIGNvbnRhaW5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uLAorZS5nLiBwcm90b2NvbCB2ZXJzaW9uIDIuMDEgd2lsbCBjb250YWluIDB4MDIwMSBpbiB0aGlzIGZpZWxkLiAgV2hlbgorc2V0dGluZyBmaWVsZHMgaW4gdGhlIGhlYWRlciwgeW91IG11c3QgbWFrZSBzdXJlIG9ubHkgdG8gc2V0IGZpZWxkcworc3VwcG9ydGVkIGJ5IHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHVzZS4KKworCisqKioqIERFVEFJTFMgT0YgSEVBREVSIEZJRUxEUworCitGb3IgZWFjaCBmaWVsZCwgc29tZSBhcmUgaW5mb3JtYXRpb24gZnJvbSB0aGUga2VybmVsIHRvIHRoZSBib290bG9hZGVyCisoInJlYWQiKSwgc29tZSBhcmUgZXhwZWN0ZWQgdG8gYmUgZmlsbGVkIG91dCBieSB0aGUgYm9vdGxvYWRlcgorKCJ3cml0ZSIpLCBhbmQgc29tZSBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVhZCBhbmQgbW9kaWZpZWQgYnkgdGhlCitib290bG9hZGVyICgibW9kaWZ5IikuCisKK0FsbCBnZW5lcmFsIHB1cnBvc2UgYm9vdCBsb2FkZXJzIHNob3VsZCB3cml0ZSB0aGUgZmllbGRzIG1hcmtlZAorKG9ibGlnYXRvcnkpLiAgQm9vdCBsb2FkZXJzIHdobyB3YW50IHRvIGxvYWQgdGhlIGtlcm5lbCBhdCBhCitub25zdGFuZGFyZCBhZGRyZXNzIHNob3VsZCBmaWxsIGluIHRoZSBmaWVsZHMgbWFya2VkIChyZWxvYyk7IG90aGVyCitib290IGxvYWRlcnMgY2FuIGlnbm9yZSB0aG9zZSBmaWVsZHMuCisKK1RoZSBieXRlIG9yZGVyIG9mIGFsbCBmaWVsZHMgaXMgbGl0dGxlZW5kaWFuICh0aGlzIGlzIHg4NiwgYWZ0ZXIgYWxsLikKKworRmllbGQgbmFtZToJc2V0dXBfc2VjdHMKK1R5cGU6CQlyZWFkCitPZmZzZXQvc2l6ZToJMHgxZjEvMQorUHJvdG9jb2w6CUFMTAorCisgIFRoZSBzaXplIG9mIHRoZSBzZXR1cCBjb2RlIGluIDUxMi1ieXRlIHNlY3RvcnMuICBJZiB0aGlzIGZpZWxkIGlzCisgIDAsIHRoZSByZWFsIHZhbHVlIGlzIDQuICBUaGUgcmVhbC1tb2RlIGNvZGUgY29uc2lzdHMgb2YgdGhlIGJvb3QKKyAgc2VjdG9yIChhbHdheXMgb25lIDUxMi1ieXRlIHNlY3RvcikgcGx1cyB0aGUgc2V0dXAgY29kZS4KKworRmllbGQgbmFtZToJIHJvb3RfZmxhZ3MKK1R5cGU6CQkgbW9kaWZ5IChvcHRpb25hbCkKK09mZnNldC9zaXplOgkgMHgxZjIvMgorUHJvdG9jb2w6CSBBTEwKKworICBJZiB0aGlzIGZpZWxkIGlzIG5vbnplcm8sIHRoZSByb290IGRlZmF1bHRzIHRvIHJlYWRvbmx5LiAgVGhlIHVzZSBvZgorICB0aGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgInJvIiBvciAicnciIG9wdGlvbnMgb24gdGhlCisgIGNvbW1hbmQgbGluZSBpbnN0ZWFkLgorCitGaWVsZCBuYW1lOglzeXNzaXplCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MWY0LzQgKHByb3RvY29sIDIuMDQrKSAweDFmNC8yIChwcm90b2NvbCBBTEwpCitQcm90b2NvbDoJMi4wNCsKKworICBUaGUgc2l6ZSBvZiB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZSBpbiB1bml0cyBvZiAxNi1ieXRlIHBhcmFncmFwaHMuCisgIEZvciBwcm90b2NvbCB2ZXJzaW9ucyBvbGRlciB0aGFuIDIuMDQgdGhpcyBmaWVsZCBpcyBvbmx5IHR3byBieXRlcworICB3aWRlLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSB0cnVzdGVkIGZvciB0aGUgc2l6ZSBvZiBhIGtlcm5lbCBpZgorICB0aGUgTE9BRF9ISUdIIGZsYWcgaXMgc2V0LgorCitGaWVsZCBuYW1lOglyYW1fc2l6ZQorVHlwZToJCWtlcm5lbCBpbnRlcm5hbAorT2Zmc2V0L3NpemU6CTB4MWY4LzIKK1Byb3RvY29sOglBTEwKKworICBUaGlzIGZpZWxkIGlzIG9ic29sZXRlLgorCitGaWVsZCBuYW1lOgl2aWRfbW9kZQorVHlwZToJCW1vZGlmeSAob2JsaWdhdG9yeSkKK09mZnNldC9zaXplOgkweDFmYS8yCisKKyAgUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBvbiBTUEVDSUFMIENPTU1BTkQgTElORSBPUFRJT05TLgorCitGaWVsZCBuYW1lOglyb290X2RldgorVHlwZToJCW1vZGlmeSAob3B0aW9uYWwpCitPZmZzZXQvc2l6ZToJMHgxZmMvMgorUHJvdG9jb2w6CUFMTAorCisgIFRoZSBkZWZhdWx0IHJvb3QgZGV2aWNlIGRldmljZSBudW1iZXIuICBUaGUgdXNlIG9mIHRoaXMgZmllbGQgaXMKKyAgZGVwcmVjYXRlZCwgdXNlIHRoZSAicm9vdD0iIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lIGluc3RlYWQuCisKK0ZpZWxkIG5hbWU6CWJvb3RfZmxhZworVHlwZToJCXJlYWQKK09mZnNldC9zaXplOgkweDFmZS8yCitQcm90b2NvbDoJQUxMCisKKyAgQ29udGFpbnMgMHhBQTU1LiAgVGhpcyBpcyB0aGUgY2xvc2VzdCB0aGluZyBvbGQgTGludXgga2VybmVscyBoYXZlCisgIHRvIGEgbWFnaWMgbnVtYmVyLgorCitGaWVsZCBuYW1lOglqdW1wCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjAwLzIKK1Byb3RvY29sOgkyLjAwKworCisgIENvbnRhaW5zIGFuIHg4NiBqdW1wIGluc3RydWN0aW9uLCAweEVCIGZvbGxvd2VkIGJ5IGEgc2lnbmVkIG9mZnNldAorICByZWxhdGl2ZSB0byBieXRlIDB4MjAyLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YKKyAgdGhlIGhlYWRlci4KKworRmllbGQgbmFtZToJaGVhZGVyCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjAyLzQKK1Byb3RvY29sOgkyLjAwKworCisgIENvbnRhaW5zIHRoZSBtYWdpYyBudW1iZXIgIkhkclMiICgweDUzNzI2NDQ4KS4KKworRmllbGQgbmFtZToJdmVyc2lvbgorVHlwZToJCXJlYWQKK09mZnNldC9zaXplOgkweDIwNi8yCitQcm90b2NvbDoJMi4wMCsKKworICBDb250YWlucyB0aGUgYm9vdCBwcm90b2NvbCB2ZXJzaW9uLCBpbiAobWFqb3IgPDwgOCkrbWlub3IgZm9ybWF0LAorICBlLmcuIDB4MDIwNCBmb3IgdmVyc2lvbiAyLjA0LCBhbmQgMHgwYTExIGZvciBhIGh5cG90aGV0aWNhbCB2ZXJzaW9uCisgIDEwLjE3LgorCitGaWVsZCBuYW1lOglyZWFkbW9kZV9zd3RjaAorVHlwZToJCW1vZGlmeSAob3B0aW9uYWwpCitPZmZzZXQvc2l6ZToJMHgyMDgvNAorUHJvdG9jb2w6CTIuMDArCisKKyAgQm9vdCBsb2FkZXIgaG9vayAoc2VlIEFEVkFOQ0VEIEJPT1QgTE9BREVSIEhPT0tTIGJlbG93LikKKworRmllbGQgbmFtZToJc3RhcnRfc3lzCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjBjLzIKK1Byb3RvY29sOgkyLjAwKworCisgIFRoZSBsb2FkIGxvdyBzZWdtZW50ICgweDEwMDApLiAgT2Jzb2xldGUuCisKK0ZpZWxkIG5hbWU6CWtlcm5lbF92ZXJzaW9uCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjBlLzIKK1Byb3RvY29sOgkyLjAwKworCisgIElmIHNldCB0byBhIG5vbnplcm8gdmFsdWUsIGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIE5VTC10ZXJtaW5hdGVkCisgIGh1bWFuLXJlYWRhYmxlIGtlcm5lbCB2ZXJzaW9uIG51bWJlciBzdHJpbmcsIGxlc3MgMHgyMDAuICBUaGlzIGNhbgorICBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGtlcm5lbCB2ZXJzaW9uIHRvIHRoZSB1c2VyLiAgVGhpcyB2YWx1ZQorICBzaG91bGQgYmUgbGVzcyB0aGFuICgweDIwMCpzZXR1cF9zZWN0cykuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIDB4MWMwMCwgdGhlIGtlcm5lbCB2ZXJzaW9uCisgIG51bWJlciBzdHJpbmcgY2FuIGJlIGZvdW5kIGF0IG9mZnNldCAweDFlMDAgaW4gdGhlIGtlcm5lbCBmaWxlLgorICBUaGlzIGlzIGEgdmFsaWQgdmFsdWUgaWYgYW5kIG9ubHkgaWYgdGhlICJzZXR1cF9zZWN0cyIgZmllbGQKKyAgY29udGFpbnMgdGhlIHZhbHVlIDE1IG9yIGhpZ2hlciwgYXM6CisKKwkweDFjMDAgIDwgMTUqMHgyMDAgKD0gMHgxZTAwKSBidXQKKwkweDFjMDAgPj0gMTQqMHgyMDAgKD0gMHgxYzAwKQorCisJMHgxYzAwID4+IDkgPSAxNCwgc28gdGhlIG1pbmltdW0gdmFsdWUgZm9yIHNldHVwX3NlY3MgaXMgMTUuCisKK0ZpZWxkIG5hbWU6CXR5cGVfb2ZfbG9hZGVyCitUeXBlOgkJd3JpdGUgKG9ibGlnYXRvcnkpCitPZmZzZXQvc2l6ZToJMHgyMTAvMQorUHJvdG9jb2w6CTIuMDArCisKKyAgSWYgeW91ciBib290IGxvYWRlciBoYXMgYW4gYXNzaWduZWQgaWQgKHNlZSB0YWJsZSBiZWxvdyksIGVudGVyCisgIDB4VFYgaGVyZSwgd2hlcmUgVCBpcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgYm9vdCBsb2FkZXIgYW5kIFYgaXMKKyAgYSB2ZXJzaW9uIG51bWJlci4gIE90aGVyd2lzZSwgZW50ZXIgMHhGRiBoZXJlLgorCisgIEFzc2lnbmVkIGJvb3QgbG9hZGVyIGlkczoKKwkwICBMSUxPCQkJKDB4MDAgcmVzZXJ2ZWQgZm9yIHByZS0yLjAwIGJvb3Rsb2FkZXIpCisJMSAgTG9hZGxpbgorCTIgIGJvb3RzZWN0LWxvYWRlcgkoMHgyMCwgYWxsIG90aGVyIHZhbHVlcyByZXNlcnZlZCkKKwkzICBTWVNMSU5VWAorCTQgIEV0aGVyQm9vdAorCTUgIEVMSUxPCisJNyAgR1J1QgorCTggIFUtQk9PVAorCTkgIFhlbgorCUEgIEd1amluCisJQiAgUWVtdQorCisgIFBsZWFzZSBjb250YWN0IDxocGFAenl0b3IuY29tPiBpZiB5b3UgbmVlZCBhIGJvb3Rsb2FkZXIgSUQKKyAgdmFsdWUgYXNzaWduZWQuCisKK0ZpZWxkIG5hbWU6CWxvYWRmbGFncworVHlwZToJCW1vZGlmeSAob2JsaWdhdG9yeSkKK09mZnNldC9zaXplOgkweDIxMS8xCitQcm90b2NvbDoJMi4wMCsKKworICBUaGlzIGZpZWxkIGlzIGEgYml0bWFzay4KKworICBCaXQgMCAocmVhZCk6CUxPQURFRF9ISUdICisJLSBJZiAwLCB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZSBpcyBsb2FkZWQgYXQgMHgxMDAwMC4KKwktIElmIDEsIHRoZSBwcm90ZWN0ZWQtbW9kZSBjb2RlIGlzIGxvYWRlZCBhdCAweDEwMDAwMC4KKworICBCaXQgNSAod3JpdGUpOiBRVUlFVF9GTEFHCisJLSBJZiAwLCBwcmludCBlYXJseSBtZXNzYWdlcy4KKwktIElmIDEsIHN1cHByZXNzIGVhcmx5IG1lc3NhZ2VzLgorCQlUaGlzIHJlcXVlc3RzIHRvIHRoZSBrZXJuZWwgKGRlY29tcHJlc3NvciBhbmQgZWFybHkKKwkJa2VybmVsKSB0byBub3Qgd3JpdGUgZWFybHkgbWVzc2FnZXMgdGhhdCByZXF1aXJlCisJCWFjY2Vzc2luZyB0aGUgZGlzcGxheSBoYXJkd2FyZSBkaXJlY3RseS4KKworICBCaXQgNiAod3JpdGUpOiBLRUVQX1NFR01FTlRTCisJUHJvdG9jb2w6IDIuMDcrCisJLSBJZiAwLCByZWxvYWQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGluIHRoZSAzMmJpdCBlbnRyeSBwb2ludC4KKwktIElmIDEsIGRvIG5vdCByZWxvYWQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGluIHRoZSAzMmJpdCBlbnRyeSBwb2ludC4KKwkJQXNzdW1lIHRoYXQgJWNzICVkcyAlc3MgJWVzIGFyZSBhbGwgc2V0IHRvIGZsYXQgc2VnbWVudHMgd2l0aAorCQlhIGJhc2Ugb2YgMCAob3IgdGhlIGVxdWl2YWxlbnQgZm9yIHRoZWlyIGVudmlyb25tZW50KS4KKworICBCaXQgNyAod3JpdGUpOiBDQU5fVVNFX0hFQVAKKwlTZXQgdGhpcyBiaXQgdG8gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZQorCWhlYXBfZW5kX3B0ciBpcyB2YWxpZC4gIElmIHRoaXMgZmllbGQgaXMgY2xlYXIsIHNvbWUgc2V0dXAgY29kZQorCWZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBkaXNhYmxlZC4KKworRmllbGQgbmFtZToJc2V0dXBfbW92ZV9zaXplCitUeXBlOgkJbW9kaWZ5IChvYmxpZ2F0b3J5KQorT2Zmc2V0L3NpemU6CTB4MjEyLzIKK1Byb3RvY29sOgkyLjAwLTIuMDEKKworICBXaGVuIHVzaW5nIHByb3RvY29sIDIuMDAgb3IgMi4wMSwgaWYgdGhlIHJlYWwgbW9kZSBrZXJuZWwgaXMgbm90CisgIGxvYWRlZCBhdCAweDkwMDAwLCBpdCBnZXRzIG1vdmVkIHRoZXJlIGxhdGVyIGluIHRoZSBsb2FkaW5nCisgIHNlcXVlbmNlLiAgRmlsbCBpbiB0aGlzIGZpZWxkIGlmIHlvdSB3YW50IGFkZGl0aW9uYWwgZGF0YSAoc3VjaCBhcworICB0aGUga2VybmVsIGNvbW1hbmQgbGluZSkgbW92ZWQgaW4gYWRkaXRpb24gdG8gdGhlIHJlYWwtbW9kZSBrZXJuZWwKKyAgaXRzZWxmLgorCisgIFRoZSB1bml0IGlzIGJ5dGVzIHN0YXJ0aW5nIHdpdGggdGhlIGJlZ2lubmluZyBvZiB0aGUgYm9vdCBzZWN0b3IuCisgIAorICBUaGlzIGZpZWxkIGlzIGNhbiBiZSBpZ25vcmVkIHdoZW4gdGhlIHByb3RvY29sIGlzIDIuMDIgb3IgaGlnaGVyLCBvcgorICBpZiB0aGUgcmVhbC1tb2RlIGNvZGUgaXMgbG9hZGVkIGF0IDB4OTAwMDAuCisKK0ZpZWxkIG5hbWU6CWNvZGUzMl9zdGFydAorVHlwZToJCW1vZGlmeSAob3B0aW9uYWwsIHJlbG9jKQorT2Zmc2V0L3NpemU6CTB4MjE0LzQKK1Byb3RvY29sOgkyLjAwKworCisgIFRoZSBhZGRyZXNzIHRvIGp1bXAgdG8gaW4gcHJvdGVjdGVkIG1vZGUuICBUaGlzIGRlZmF1bHRzIHRvIHRoZSBsb2FkCisgIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCwgYW5kIGNhbiBiZSB1c2VkIGJ5IHRoZSBib290IGxvYWRlciB0bworICBkZXRlcm1pbmUgdGhlIHByb3BlciBsb2FkIGFkZHJlc3MuCisKKyAgVGhpcyBmaWVsZCBjYW4gYmUgbW9kaWZpZWQgZm9yIHR3byBwdXJwb3NlczoKKworICAxLiBhcyBhIGJvb3QgbG9hZGVyIGhvb2sgKHNlZSBBRFZBTkNFRCBCT09UIExPQURFUiBIT09LUyBiZWxvdy4pCisKKyAgMi4gaWYgYSBib290bG9hZGVyIHdoaWNoIGRvZXMgbm90IGluc3RhbGwgYSBob29rIGxvYWRzIGEKKyAgICAgcmVsb2NhdGFibGUga2VybmVsIGF0IGEgbm9uc3RhbmRhcmQgYWRkcmVzcyBpdCB3aWxsIGhhdmUgdG8gbW9kaWZ5CisgICAgIHRoaXMgZmllbGQgdG8gcG9pbnQgdG8gdGhlIGxvYWQgYWRkcmVzcy4KKworRmllbGQgbmFtZToJcmFtZGlza19pbWFnZQorVHlwZToJCXdyaXRlIChvYmxpZ2F0b3J5KQorT2Zmc2V0L3NpemU6CTB4MjE4LzQKK1Byb3RvY29sOgkyLjAwKworCisgIFRoZSAzMi1iaXQgbGluZWFyIGFkZHJlc3Mgb2YgdGhlIGluaXRpYWwgcmFtZGlzayBvciByYW1mcy4gIExlYXZlIGF0CisgIHplcm8gaWYgdGhlcmUgaXMgbm8gaW5pdGlhbCByYW1kaXNrL3JhbWZzLgorCitGaWVsZCBuYW1lOglyYW1kaXNrX3NpemUKK1R5cGU6CQl3cml0ZSAob2JsaWdhdG9yeSkKK09mZnNldC9zaXplOgkweDIxYy80CitQcm90b2NvbDoJMi4wMCsKKworICBTaXplIG9mIHRoZSBpbml0aWFsIHJhbWRpc2sgb3IgcmFtZnMuICBMZWF2ZSBhdCB6ZXJvIGlmIHRoZXJlIGlzIG5vCisgIGluaXRpYWwgcmFtZGlzay9yYW1mcy4KKworRmllbGQgbmFtZToJYm9vdHNlY3Rfa2x1ZGdlCitUeXBlOgkJa2VybmVsIGludGVybmFsCitPZmZzZXQvc2l6ZToJMHgyMjAvNAorUHJvdG9jb2w6CTIuMDArCisKKyAgVGhpcyBmaWVsZCBpcyBvYnNvbGV0ZS4KKworRmllbGQgbmFtZToJaGVhcF9lbmRfcHRyCitUeXBlOgkJd3JpdGUgKG9ibGlnYXRvcnkpCitPZmZzZXQvc2l6ZToJMHgyMjQvMgorUHJvdG9jb2w6CTIuMDErCisKKyAgU2V0IHRoaXMgZmllbGQgdG8gdGhlIG9mZnNldCAoZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWFsLW1vZGUKKyAgY29kZSkgb2YgdGhlIGVuZCBvZiB0aGUgc2V0dXAgc3RhY2svaGVhcCwgbWludXMgMHgwMjAwLgorCitGaWVsZCBuYW1lOgljbWRfbGluZV9wdHIKK1R5cGU6CQl3cml0ZSAob2JsaWdhdG9yeSkKK09mZnNldC9zaXplOgkweDIyOC80CitQcm90b2NvbDoJMi4wMisKKworICBTZXQgdGhpcyBmaWVsZCB0byB0aGUgbGluZWFyIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisgIFRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGNhbiBiZSBsb2NhdGVkIGFueXdoZXJlIGJldHdlZW4gdGhlIGVuZCBvZgorICB0aGUgc2V0dXAgaGVhcCBhbmQgMHhBMDAwMDsgaXQgZG9lcyBub3QgaGF2ZSB0byBiZSBsb2NhdGVkIGluIHRoZQorICBzYW1lIDY0SyBzZWdtZW50IGFzIHRoZSByZWFsLW1vZGUgY29kZSBpdHNlbGYuCisKKyAgRmlsbCBpbiB0aGlzIGZpZWxkIGV2ZW4gaWYgeW91ciBib290IGxvYWRlciBkb2VzIG5vdCBzdXBwb3J0IGEKKyAgY29tbWFuZCBsaW5lLCBpbiB3aGljaCBjYXNlIHlvdSBjYW4gcG9pbnQgdGhpcyB0byBhbiBlbXB0eSBzdHJpbmcKKyAgKG9yIGJldHRlciB5ZXQsIHRvIHRoZSBzdHJpbmcgImF1dG8iLikgIElmIHRoaXMgZmllbGQgaXMgbGVmdCBhdAorICB6ZXJvLCB0aGUga2VybmVsIHdpbGwgYXNzdW1lIHRoYXQgeW91ciBib290IGxvYWRlciBkb2VzIG5vdCBzdXBwb3J0CisgIHRoZSAyLjAyKyBwcm90b2NvbC4KKworRmllbGQgbmFtZToJaW5pdHJkX2FkZHJfbWF4CitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjJjLzQKK1Byb3RvY29sOgkyLjAzKworCisgIFRoZSBtYXhpbXVtIGFkZHJlc3MgdGhhdCBtYXkgYmUgb2NjdXBpZWQgYnkgdGhlIGluaXRpYWwKKyAgcmFtZGlzay9yYW1mcyBjb250ZW50cy4gIEZvciBib290IHByb3RvY29scyAyLjAyIG9yIGVhcmxpZXIsIHRoaXMKKyAgZmllbGQgaXMgbm90IHByZXNlbnQsIGFuZCB0aGUgbWF4aW11bSBhZGRyZXNzIGlzIDB4MzdGRkZGRkYuICAoVGhpcworICBhZGRyZXNzIGlzIGRlZmluZWQgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhpZ2hlc3Qgc2FmZSBieXRlLCBzbyBpZgorICB5b3VyIHJhbWRpc2sgaXMgZXhhY3RseSAxMzEwNzIgYnl0ZXMgbG9uZyBhbmQgdGhpcyBmaWVsZCBpcworICAweDM3RkZGRkZGLCB5b3UgY2FuIHN0YXJ0IHlvdXIgcmFtZGlzayBhdCAweDM3RkUwMDAwLikKKworRmllbGQgbmFtZToJa2VybmVsX2FsaWdubWVudAorVHlwZToJCXJlYWQgKHJlbG9jKQorT2Zmc2V0L3NpemU6CTB4MjMwLzQKK1Byb3RvY29sOgkyLjA1KworCisgIEFsaWdubWVudCB1bml0IHJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwgKGlmIHJlbG9jYXRhYmxlX2tlcm5lbCBpcyB0cnVlLikKKworRmllbGQgbmFtZToJcmVsb2NhdGFibGVfa2VybmVsCitUeXBlOgkJcmVhZCAocmVsb2MpCitPZmZzZXQvc2l6ZToJMHgyMzQvMQorUHJvdG9jb2w6CTIuMDUrCisKKyAgSWYgdGhpcyBmaWVsZCBpcyBub256ZXJvLCB0aGUgcHJvdGVjdGVkLW1vZGUgcGFydCBvZiB0aGUga2VybmVsIGNhbgorICBiZSBsb2FkZWQgYXQgYW55IGFkZHJlc3MgdGhhdCBzYXRpc2ZpZXMgdGhlIGtlcm5lbF9hbGlnbm1lbnQgZmllbGQuCisgIEFmdGVyIGxvYWRpbmcsIHRoZSBib290IGxvYWRlciBtdXN0IHNldCB0aGUgY29kZTMyX3N0YXJ0IGZpZWxkIHRvCisgIHBvaW50IHRvIHRoZSBsb2FkZWQgY29kZSwgb3IgdG8gYSBib290IGxvYWRlciBob29rLgorCitGaWVsZCBuYW1lOgljbWRsaW5lX3NpemUKK1R5cGU6CQlyZWFkCitPZmZzZXQvc2l6ZToJMHgyMzgvNAorUHJvdG9jb2w6CTIuMDYrCisKKyAgVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29tbWFuZCBsaW5lIHdpdGhvdXQgdGhlIHRlcm1pbmF0aW5nCisgIHplcm8uIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29tbWFuZCBsaW5lIGNhbiBjb250YWluIGF0IG1vc3QKKyAgY21kbGluZV9zaXplIGNoYXJhY3RlcnMuIFdpdGggcHJvdG9jb2wgdmVyc2lvbiAyLjA1IGFuZCBlYXJsaWVyLCB0aGUKKyAgbWF4aW11bSBzaXplIHdhcyAyNTUuCisKK0ZpZWxkIG5hbWU6CWhhcmR3YXJlX3N1YmFyY2gKK1R5cGU6CQl3cml0ZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIHg4Ni9QQykKK09mZnNldC9zaXplOgkweDIzYy80CitQcm90b2NvbDoJMi4wNysKKworICBJbiBhIHBhcmF2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCB0aGUgaGFyZHdhcmUgbG93IGxldmVsIGFyY2hpdGVjdHVyYWwKKyAgcGllY2VzIHN1Y2ggYXMgaW50ZXJydXB0IGhhbmRsaW5nLCBwYWdlIHRhYmxlIGhhbmRsaW5nLCBhbmQKKyAgYWNjZXNzaW5nIHByb2Nlc3MgY29udHJvbCByZWdpc3RlcnMgbmVlZHMgdG8gYmUgZG9uZSBkaWZmZXJlbnRseS4KKworICBUaGlzIGZpZWxkIGFsbG93cyB0aGUgYm9vdGxvYWRlciB0byBpbmZvcm0gdGhlIGtlcm5lbCB3ZSBhcmUgaW4gb25lCisgIG9uZSBvZiB0aG9zZSBlbnZpcm9ubWVudHMuCisKKyAgMHgwMDAwMDAwMAlUaGUgZGVmYXVsdCB4ODYvUEMgZW52aXJvbm1lbnQKKyAgMHgwMDAwMDAwMQlsZ3Vlc3QKKyAgMHgwMDAwMDAwMglYZW4KKworRmllbGQgbmFtZToJaGFyZHdhcmVfc3ViYXJjaF9kYXRhCitUeXBlOgkJd3JpdGUgKHN1YmFyY2gtZGVwZW5kZW50KQorT2Zmc2V0L3NpemU6CTB4MjQwLzgKK1Byb3RvY29sOgkyLjA3KworCisgIEEgcG9pbnRlciB0byBkYXRhIHRoYXQgaXMgc3BlY2lmaWMgdG8gaGFyZHdhcmUgc3ViYXJjaAorICBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSB1bnVzZWQgZm9yIHRoZSBkZWZhdWx0IHg4Ni9QQyBlbnZpcm9ubWVudCwKKyAgZG8gbm90IG1vZGlmeS4KKworRmllbGQgbmFtZToJcGF5bG9hZF9vZmZzZXQKK1R5cGU6CQlyZWFkCitPZmZzZXQvc2l6ZToJMHgyNDgvNAorUHJvdG9jb2w6CTIuMDgrCisKKyAgSWYgbm9uLXplcm8gdGhlbiB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIHRoZQorICByZWFsLW1vZGUgY29kZSB0byB0aGUgcGF5bG9hZC4KKworICBUaGUgcGF5bG9hZCBtYXkgYmUgY29tcHJlc3NlZC4gVGhlIGZvcm1hdCBvZiBib3RoIHRoZSBjb21wcmVzc2VkIGFuZAorICB1bmNvbXByZXNzZWQgZGF0YSBzaG91bGQgYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgc3RhbmRhcmQgbWFnaWMKKyAgbnVtYmVycy4gQ3VycmVudGx5IG9ubHkgZ3ppcCBjb21wcmVzc2VkIEVMRiBpcyB1c2VkLgorICAKK0ZpZWxkIG5hbWU6CXBheWxvYWRfbGVuZ3RoCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjRjLzQKK1Byb3RvY29sOgkyLjA4KworCisgIFRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQuCisKK0ZpZWxkIG5hbWU6CXNldHVwX2RhdGEKK1R5cGU6CQl3cml0ZSAoc3BlY2lhbCkKK09mZnNldC9zaXplOgkweDI1MC84CitQcm90b2NvbDoJMi4wOSsKKworICBUaGUgNjQtYml0IHBoeXNpY2FsIHBvaW50ZXIgdG8gTlVMTCB0ZXJtaW5hdGVkIHNpbmdsZSBsaW5rZWQgbGlzdCBvZgorICBzdHJ1Y3Qgc2V0dXBfZGF0YS4gVGhpcyBpcyB1c2VkIHRvIGRlZmluZSBhIG1vcmUgZXh0ZW5zaWJsZSBib290CisgIHBhcmFtZXRlcnMgcGFzc2luZyBtZWNoYW5pc20uIFRoZSBkZWZpbml0aW9uIG9mIHN0cnVjdCBzZXR1cF9kYXRhIGlzCisgIGFzIGZvbGxvdzoKKworICBzdHJ1Y3Qgc2V0dXBfZGF0YSB7CisJICB1NjQgbmV4dDsKKwkgIHUzMiB0eXBlOworCSAgdTMyIGxlbjsKKwkgIHU4ICBkYXRhWzBdOworICB9OworCisgIFdoZXJlLCB0aGUgbmV4dCBpcyBhIDY0LWJpdCBwaHlzaWNhbCBwb2ludGVyIHRvIHRoZSBuZXh0IG5vZGUgb2YKKyAgbGlua2VkIGxpc3QsIHRoZSBuZXh0IGZpZWxkIG9mIHRoZSBsYXN0IG5vZGUgaXMgMDsgdGhlIHR5cGUgaXMgdXNlZAorICB0byBpZGVudGlmeSB0aGUgY29udGVudHMgb2YgZGF0YTsgdGhlIGxlbiBpcyB0aGUgbGVuZ3RoIG9mIGRhdGEKKyAgZmllbGQ7IHRoZSBkYXRhIGhvbGRzIHRoZSByZWFsIHBheWxvYWQuCisKKyAgVGhpcyBsaXN0IG1heSBiZSBtb2RpZmllZCBhdCBhIG51bWJlciBvZiBwb2ludHMgZHVyaW5nIHRoZSBib290dXAKKyAgcHJvY2Vzcy4gIFRoZXJlZm9yZSwgd2hlbiBtb2RpZnlpbmcgdGhpcyBsaXN0IG9uZSBzaG91bGQgYWx3YXlzIG1ha2UKKyAgc3VyZSB0byBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgbGlua2VkIGxpc3QgYWxyZWFkeSBjb250YWlucworICBlbnRyaWVzLgorCisKKyoqKiogVEhFIElNQUdFIENIRUNLU1VNCisKK0Zyb20gYm9vdCBwcm90b2NvbCB2ZXJzaW9uIDIuMDggb253YXJkcyB0aGUgQ1JDLTMyIGlzIGNhbGN1bGF0ZWQgb3ZlcgordGhlIGVudGlyZSBmaWxlIHVzaW5nIHRoZSBjaGFyYWN0ZXJpc3RpYyBwb2x5bm9taWFsIDB4MDRDMTFEQjcgYW5kIGFuCitpbml0aWFsIHJlbWFpbmRlciBvZiAweGZmZmZmZmZmLiAgVGhlIGNoZWNrc3VtIGlzIGFwcGVuZGVkIHRvIHRoZQorZmlsZTsgdGhlcmVmb3JlIHRoZSBDUkMgb2YgdGhlIGZpbGUgdXAgdG8gdGhlIGxpbWl0IHNwZWNpZmllZCBpbiB0aGUKK3N5c3NpemUgZmllbGQgb2YgdGhlIGhlYWRlciBpcyBhbHdheXMgMC4KKworCisqKioqIFRIRSBLRVJORUwgQ09NTUFORCBMSU5FCisKK1RoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGhhcyBiZWNvbWUgYW4gaW1wb3J0YW50IHdheSBmb3IgdGhlIGJvb3QKK2xvYWRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBrZXJuZWwuICBTb21lIG9mIGl0cyBvcHRpb25zIGFyZSBhbHNvCityZWxldmFudCB0byB0aGUgYm9vdCBsb2FkZXIgaXRzZWxmLCBzZWUgInNwZWNpYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMiCitiZWxvdy4KKworVGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiBUaGUgbWF4aW11bQorbGVuZ3RoIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgZmllbGQgY21kbGluZV9zaXplLiAgQmVmb3JlIHByb3RvY29sCit2ZXJzaW9uIDIuMDYsIHRoZSBtYXhpbXVtIHdhcyAyNTUgY2hhcmFjdGVycy4gIEEgc3RyaW5nIHRoYXQgaXMgdG9vCitsb25nIHdpbGwgYmUgYXV0b21hdGljYWxseSB0cnVuY2F0ZWQgYnkgdGhlIGtlcm5lbC4KKworSWYgdGhlIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiBpcyAyLjAyIG9yIGxhdGVyLCB0aGUgYWRkcmVzcyBvZiB0aGUKK2tlcm5lbCBjb21tYW5kIGxpbmUgaXMgZ2l2ZW4gYnkgdGhlIGhlYWRlciBmaWVsZCBjbWRfbGluZV9wdHIgKHNlZQorYWJvdmUuKSAgVGhpcyBhZGRyZXNzIGNhbiBiZSBhbnl3aGVyZSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHNldHVwCitoZWFwIGFuZCAweEEwMDAwLgorCitJZiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpcyAqbm90KiAyLjAyIG9yIGhpZ2hlciwgdGhlIGtlcm5lbAorY29tbWFuZCBsaW5lIGlzIGVudGVyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKKworCUF0IG9mZnNldCAweDAwMjAgKHdvcmQpLCAiY21kX2xpbmVfbWFnaWMiLCBlbnRlciB0aGUgbWFnaWMKKwludW1iZXIgMHhBMzNGLgorCisJQXQgb2Zmc2V0IDB4MDAyMiAod29yZCksICJjbWRfbGluZV9vZmZzZXQiLCBlbnRlciB0aGUgb2Zmc2V0CisJb2YgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKKwlyZWFsLW1vZGUga2VybmVsKS4KKwkKKwlUaGUga2VybmVsIGNvbW1hbmQgbGluZSAqbXVzdCogYmUgd2l0aGluIHRoZSBtZW1vcnkgcmVnaW9uCisJY292ZXJlZCBieSBzZXR1cF9tb3ZlX3NpemUsIHNvIHlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhpcworCWZpZWxkLgorCisKKyoqKiogTUVNT1JZIExBWU9VVCBPRiBUSEUgUkVBTC1NT0RFIENPREUKKworVGhlIHJlYWwtbW9kZSBjb2RlIHJlcXVpcmVzIGEgc3RhY2svaGVhcCB0byBiZSBzZXQgdXAsIGFzIHdlbGwgYXMKK21lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lCitpbiB0aGUgcmVhbC1tb2RlIGFjY2Vzc2libGUgbWVtb3J5IGluIGJvdHRvbSBtZWdhYnl0ZS4KKworSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbW9kZXJuIG1hY2hpbmVzIG9mdGVuIGhhdmUgYSBzaXphYmxlIEV4dGVuZGVkCitCSU9TIERhdGEgQXJlYSAoRUJEQSkuICBBcyBhIHJlc3VsdCwgaXQgaXMgYWR2aXNhYmxlIHRvIHVzZSBhcyBsaXR0bGUKK29mIHRoZSBsb3cgbWVnYWJ5dGUgYXMgcG9zc2libGUuCisKK1VuZm9ydHVuYXRlbHksIHVuZGVyIHRoZSBmb2xsb3dpbmcgY2lyY3Vtc3RhbmNlcyB0aGUgMHg5MDAwMCBtZW1vcnkKK3NlZ21lbnQgaGFzIHRvIGJlIHVzZWQ6CisKKwktIFdoZW4gbG9hZGluZyBhIHpJbWFnZSBrZXJuZWwgKChsb2FkZmxhZ3MgJiAweDAxKSA9PSAwKS4KKwktIFdoZW4gbG9hZGluZyBhIDIuMDEgb3IgZWFybGllciBib290IHByb3RvY29sIGtlcm5lbC4KKworCSAgLT4gRm9yIHRoZSAyLjAwIGFuZCAyLjAxIGJvb3QgcHJvdG9jb2xzLCB0aGUgcmVhbC1tb2RlIGNvZGUKKwkgICAgIGNhbiBiZSBsb2FkZWQgYXQgYW5vdGhlciBhZGRyZXNzLCBidXQgaXQgaXMgaW50ZXJuYWxseQorCSAgICAgcmVsb2NhdGVkIHRvIDB4OTAwMDAuICBGb3IgdGhlICJvbGQiIHByb3RvY29sLCB0aGUKKwkgICAgIHJlYWwtbW9kZSBjb2RlIG11c3QgYmUgbG9hZGVkIGF0IDB4OTAwMDAuCisKK1doZW4gbG9hZGluZyBhdCAweDkwMDAwLCBhdm9pZCB1c2luZyBtZW1vcnkgYWJvdmUgMHg5YTAwMC4KKworRm9yIGJvb3QgcHJvdG9jb2wgMi4wMiBvciBoaWdoZXIsIHRoZSBjb21tYW5kIGxpbmUgZG9lcyBub3QgaGF2ZSB0byBiZQorbG9jYXRlZCBpbiB0aGUgc2FtZSA2NEsgc2VnbWVudCBhcyB0aGUgcmVhbC1tb2RlIHNldHVwIGNvZGU7IGl0IGlzCit0aHVzIHBlcm1pdHRlZCB0byBnaXZlIHRoZSBzdGFjay9oZWFwIHRoZSBmdWxsIDY0SyBzZWdtZW50IGFuZCBsb2NhdGUKK3RoZSBjb21tYW5kIGxpbmUgYWJvdmUgaXQuCisKK1RoZSBrZXJuZWwgY29tbWFuZCBsaW5lIHNob3VsZCBub3QgYmUgbG9jYXRlZCBiZWxvdyB0aGUgcmVhbC1tb2RlCitjb2RlLCBub3Igc2hvdWxkIGl0IGJlIGxvY2F0ZWQgaW4gaGlnaCBtZW1vcnkuCisKKworKioqKiBTQU1QTEUgQk9PVCBDT05GSUdVUkFUSU9OCisKK0FzIGEgc2FtcGxlIGNvbmZpZ3VyYXRpb24sIGFzc3VtZSB0aGUgZm9sbG93aW5nIGxheW91dCBvZiB0aGUgcmVhbAorbW9kZSBzZWdtZW50OgorCisgICAgV2hlbiBsb2FkaW5nIGJlbG93IDB4OTAwMDAsIHVzZSB0aGUgZW50aXJlIHNlZ21lbnQ6CisKKwkweDAwMDAtMHg3ZmZmCVJlYWwgbW9kZSBrZXJuZWwKKwkweDgwMDAtMHhkZmZmCVN0YWNrIGFuZCBoZWFwCisJMHhlMDAwLTB4ZmZmZglLZXJuZWwgY29tbWFuZCBsaW5lCisKKyAgICBXaGVuIGxvYWRpbmcgYXQgMHg5MDAwMCBPUiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpcyAyLjAxIG9yIGVhcmxpZXI6CisKKwkweDAwMDAtMHg3ZmZmCVJlYWwgbW9kZSBrZXJuZWwKKwkweDgwMDAtMHg5N2ZmCVN0YWNrIGFuZCBoZWFwCisJMHg5ODAwLTB4OWZmZglLZXJuZWwgY29tbWFuZCBsaW5lCisKK1N1Y2ggYSBib290IGxvYWRlciBzaG91bGQgZW50ZXIgdGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIGhlYWRlcjoKKworCXVuc2lnbmVkIGxvbmcgYmFzZV9wdHI7CS8qIGJhc2UgYWRkcmVzcyBmb3IgcmVhbC1tb2RlIHNlZ21lbnQgKi8KKworCWlmICggc2V0dXBfc2VjdHMgPT0gMCApIHsKKwkJc2V0dXBfc2VjdHMgPSA0OworCX0KKworCWlmICggcHJvdG9jb2wgPj0gMHgwMjAwICkgeworCQl0eXBlX29mX2xvYWRlciA9IDx0eXBlIGNvZGU+OworCQlpZiAoIGxvYWRpbmdfaW5pdHJkICkgeworCQkJcmFtZGlza19pbWFnZSA9IDxpbml0cmRfYWRkcmVzcz47CisJCQlyYW1kaXNrX3NpemUgPSA8aW5pdHJkX3NpemU+OworCQl9CisKKwkJaWYgKCBwcm90b2NvbCA+PSAweDAyMDIgJiYgbG9hZGZsYWdzICYgMHgwMSApCisJCQloZWFwX2VuZCA9IDB4ZTAwMDsKKwkJZWxzZQorCQkJaGVhcF9lbmQgPSAweDk4MDA7CisKKwkJaWYgKCBwcm90b2NvbCA+PSAweDAyMDEgKSB7CisJCQloZWFwX2VuZF9wdHIgPSBoZWFwX2VuZCAtIDB4MjAwOworCQkJbG9hZGZsYWdzIHw9IDB4ODA7IC8qIENBTl9VU0VfSEVBUCAqLworCQl9CisKKwkJaWYgKCBwcm90b2NvbCA+PSAweDAyMDIgKSB7CisJCQljbWRfbGluZV9wdHIgPSBiYXNlX3B0ciArIGhlYXBfZW5kOworCQkJc3RyY3B5KGNtZF9saW5lX3B0ciwgY21kbGluZSk7CisJCX0gZWxzZSB7CisJCQljbWRfbGluZV9tYWdpYwk9IDB4QTMzRjsKKwkJCWNtZF9saW5lX29mZnNldCA9IGhlYXBfZW5kOworCQkJc2V0dXBfbW92ZV9zaXplID0gaGVhcF9lbmQgKyBzdHJsZW4oY21kbGluZSkrMTsKKwkJCXN0cmNweShiYXNlX3B0citjbWRfbGluZV9vZmZzZXQsIGNtZGxpbmUpOworCQl9CisJfSBlbHNlIHsKKwkJLyogVmVyeSBvbGQga2VybmVsICovCisKKwkJaGVhcF9lbmQgPSAweDk4MDA7CisKKwkJY21kX2xpbmVfbWFnaWMJPSAweEEzM0Y7CisJCWNtZF9saW5lX29mZnNldCA9IGhlYXBfZW5kOworCisJCS8qIEEgdmVyeSBvbGQga2VybmVsIE1VU1QgaGF2ZSBpdHMgcmVhbC1tb2RlIGNvZGUKKwkJICAgbG9hZGVkIGF0IDB4OTAwMDAgKi8KKworCQlpZiAoIGJhc2VfcHRyICE9IDB4OTAwMDAgKSB7CisJCQkvKiBDb3B5IHRoZSByZWFsLW1vZGUga2VybmVsICovCisJCQltZW1jcHkoMHg5MDAwMCwgYmFzZV9wdHIsIChzZXR1cF9zZWN0cysxKSo1MTIpOworCQkJYmFzZV9wdHIgPSAweDkwMDAwOwkJIC8qIFJlbG9jYXRlZCAqLworCQl9CisKKwkJc3RyY3B5KDB4OTAwMDArY21kX2xpbmVfb2Zmc2V0LCBjbWRsaW5lKTsKKworCQkvKiBJdCBpcyByZWNvbW1lbmRlZCB0byBjbGVhciBtZW1vcnkgdXAgdG8gdGhlIDMySyBtYXJrICovCisJCW1lbXNldCgweDkwMDAwICsgKHNldHVwX3NlY3RzKzEpKjUxMiwgMCwKKwkJICAgICAgICg2NC0oc2V0dXBfc2VjdHMrMSkpKjUxMik7CisJfQorCisKKyoqKiogTE9BRElORyBUSEUgUkVTVCBPRiBUSEUgS0VSTkVMCisKK1RoZSAzMi1iaXQgKG5vbi1yZWFsLW1vZGUpIGtlcm5lbCBzdGFydHMgYXQgb2Zmc2V0IChzZXR1cF9zZWN0cysxKSo1MTIKK2luIHRoZSBrZXJuZWwgZmlsZSAoYWdhaW4sIGlmIHNldHVwX3NlY3RzID09IDAgdGhlIHJlYWwgdmFsdWUgaXMgNC4pCitJdCBzaG91bGQgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHgxMDAwMCBmb3IgSW1hZ2UvekltYWdlIGtlcm5lbHMgYW5kCisweDEwMDAwMCBmb3IgYnpJbWFnZSBrZXJuZWxzLgorCitUaGUga2VybmVsIGlzIGEgYnpJbWFnZSBrZXJuZWwgaWYgdGhlIHByb3RvY29sID49IDIuMDAgYW5kIHRoZSAweDAxCitiaXQgKExPQURfSElHSCkgaW4gdGhlIGxvYWRmbGFncyBmaWVsZCBpcyBzZXQ6CisKKwlpc19iekltYWdlID0gKHByb3RvY29sID49IDB4MDIwMCkgJiYgKGxvYWRmbGFncyAmIDB4MDEpOworCWxvYWRfYWRkcmVzcyA9IGlzX2J6SW1hZ2UgPyAweDEwMDAwMCA6IDB4MTAwMDA7CisKK05vdGUgdGhhdCBJbWFnZS96SW1hZ2Uga2VybmVscyBjYW4gYmUgdXAgdG8gNTEySyBpbiBzaXplLCBhbmQgdGh1cyB1c2UKK3RoZSBlbnRpcmUgMHgxMDAwMC0weDkwMDAwIHJhbmdlIG9mIG1lbW9yeS4gIFRoaXMgbWVhbnMgaXQgaXMgcHJldHR5CittdWNoIGEgcmVxdWlyZW1lbnQgZm9yIHRoZXNlIGtlcm5lbHMgdG8gbG9hZCB0aGUgcmVhbC1tb2RlIHBhcnQgYXQKKzB4OTAwMDAuICBiekltYWdlIGtlcm5lbHMgYWxsb3cgbXVjaCBtb3JlIGZsZXhpYmlsaXR5LgorCisKKyoqKiogU1BFQ0lBTCBDT01NQU5EIExJTkUgT1BUSU9OUworCitJZiB0aGUgY29tbWFuZCBsaW5lIHByb3ZpZGVkIGJ5IHRoZSBib290IGxvYWRlciBpcyBlbnRlcmVkIGJ5IHRoZQordXNlciwgdGhlIHVzZXIgbWF5IGV4cGVjdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHdvcmsuCitUaGV5IHNob3VsZCBub3JtYWxseSBub3QgYmUgZGVsZXRlZCBmcm9tIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGV2ZW4KK3Rob3VnaCBub3QgYWxsIG9mIHRoZW0gYXJlIGFjdHVhbGx5IG1lYW5pbmdmdWwgdG8gdGhlIGtlcm5lbC4gIEJvb3QKK2xvYWRlciBhdXRob3JzIHdobyBuZWVkIGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHRoZSBib290Citsb2FkZXIgaXRzZWxmIHNob3VsZCBnZXQgdGhlbSByZWdpc3RlcmVkIGluCitEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCB0byBtYWtlIHN1cmUgdGhleSB3aWxsIG5vdAorY29uZmxpY3Qgd2l0aCBhY3R1YWwga2VybmVsIG9wdGlvbnMgbm93IG9yIGluIHRoZSBmdXR1cmUuCisKKyAgdmdhPTxtb2RlPgorCTxtb2RlPiBoZXJlIGlzIGVpdGhlciBhbiBpbnRlZ2VyIChpbiBDIG5vdGF0aW9uLCBlaXRoZXIKKwlkZWNpbWFsLCBvY3RhbCwgb3IgaGV4YWRlY2ltYWwpIG9yIG9uZSBvZiB0aGUgc3RyaW5ncworCSJub3JtYWwiIChtZWFuaW5nIDB4RkZGRiksICJleHQiIChtZWFuaW5nIDB4RkZGRSkgb3IgImFzayIKKwkobWVhbmluZyAweEZGRkQpLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgZW50ZXJlZCBpbnRvIHRoZQorCXZpZF9tb2RlIGZpZWxkLCBhcyBpdCBpcyB1c2VkIGJ5IHRoZSBrZXJuZWwgYmVmb3JlIHRoZSBjb21tYW5kCisJbGluZSBpcyBwYXJzZWQuCisKKyAgbWVtPTxzaXplPgorCTxzaXplPiBpcyBhbiBpbnRlZ2VyIGluIEMgbm90YXRpb24gb3B0aW9uYWxseSBmb2xsb3dlZCBieQorCShjYXNlIGluc2Vuc2l0aXZlKSBLLCBNLCBHLCBULCBQIG9yIEUgKG1lYW5pbmcgPDwgMTAsIDw8IDIwLAorCTw8IDMwLCA8PCA0MCwgPDwgNTAgb3IgPDwgNjApLiAgVGhpcyBzcGVjaWZpZXMgdGhlIGVuZCBvZgorCW1lbW9yeSB0byB0aGUga2VybmVsLiBUaGlzIGFmZmVjdHMgdGhlIHBvc3NpYmxlIHBsYWNlbWVudCBvZgorCWFuIGluaXRyZCwgc2luY2UgYW4gaW5pdHJkIHNob3VsZCBiZSBwbGFjZWQgbmVhciBlbmQgb2YKKwltZW1vcnkuICBOb3RlIHRoYXQgdGhpcyBpcyBhbiBvcHRpb24gdG8gKmJvdGgqIHRoZSBrZXJuZWwgYW5kCisJdGhlIGJvb3Rsb2FkZXIhCisKKyAgaW5pdHJkPTxmaWxlPgorCUFuIGluaXRyZCBzaG91bGQgYmUgbG9hZGVkLiAgVGhlIG1lYW5pbmcgb2YgPGZpbGU+IGlzCisJb2J2aW91c2x5IGJvb3Rsb2FkZXItZGVwZW5kZW50LCBhbmQgc29tZSBib290IGxvYWRlcnMKKwkoZS5nLiBMSUxPKSBkbyBub3QgaGF2ZSBzdWNoIGEgY29tbWFuZC4KKworSW4gYWRkaXRpb24sIHNvbWUgYm9vdCBsb2FkZXJzIGFkZCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gdGhlCit1c2VyLXNwZWNpZmllZCBjb21tYW5kIGxpbmU6CisKKyAgQk9PVF9JTUFHRT08ZmlsZT4KKwlUaGUgYm9vdCBpbWFnZSB3aGljaCB3YXMgbG9hZGVkLiAgQWdhaW4sIHRoZSBtZWFuaW5nIG9mIDxmaWxlPgorCWlzIG9idmlvdXNseSBib290bG9hZGVyLWRlcGVuZGVudC4KKworICBhdXRvCisJVGhlIGtlcm5lbCB3YXMgYm9vdGVkIHdpdGhvdXQgZXhwbGljaXQgdXNlciBpbnRlcnZlbnRpb24uCisKK0lmIHRoZXNlIG9wdGlvbnMgYXJlIGFkZGVkIGJ5IHRoZSBib290IGxvYWRlciwgaXQgaXMgaGlnaGx5CityZWNvbW1lbmRlZCB0aGF0IHRoZXkgYXJlIGxvY2F0ZWQgKmZpcnN0KiwgYmVmb3JlIHRoZSB1c2VyLXNwZWNpZmllZAorb3IgY29uZmlndXJhdGlvbi1zcGVjaWZpZWQgY29tbWFuZCBsaW5lLiAgT3RoZXJ3aXNlLCAiaW5pdD0vYmluL3NoIgorZ2V0cyBjb25mdXNlZCBieSB0aGUgImF1dG8iIG9wdGlvbi4KKworCisqKioqIFJVTk5JTkcgVEhFIEtFUk5FTAorCitUaGUga2VybmVsIGlzIHN0YXJ0ZWQgYnkganVtcGluZyB0byB0aGUga2VybmVsIGVudHJ5IHBvaW50LCB3aGljaCBpcworbG9jYXRlZCBhdCAqc2VnbWVudCogb2Zmc2V0IDB4MjAgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbW9kZQora2VybmVsLiAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBsb2FkZWQgeW91ciByZWFsLW1vZGUga2VybmVsIGNvZGUgYXQKKzB4OTAwMDAsIHRoZSBrZXJuZWwgZW50cnkgcG9pbnQgaXMgOTAyMDowMDAwLgorCitBdCBlbnRyeSwgZHMgPSBlcyA9IHNzIHNob3VsZCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlIHJlYWwtbW9kZQora2VybmVsIGNvZGUgKDB4OTAwMCBpZiB0aGUgY29kZSBpcyBsb2FkZWQgYXQgMHg5MDAwMCksIHNwIHNob3VsZCBiZQorc2V0IHVwIHByb3Blcmx5LCBub3JtYWxseSBwb2ludGluZyB0byB0aGUgdG9wIG9mIHRoZSBoZWFwLCBhbmQKK2ludGVycnVwdHMgc2hvdWxkIGJlIGRpc2FibGVkLiAgRnVydGhlcm1vcmUsIHRvIGd1YXJkIGFnYWluc3QgYnVncyBpbgordGhlIGtlcm5lbCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgYm9vdCBsb2FkZXIgc2V0cyBmcyA9IGdzID0gZHMgPQorZXMgPSBzcy4KKworSW4gb3VyIGV4YW1wbGUgZnJvbSBhYm92ZSwgd2Ugd291bGQgZG86CisKKwkvKiBOb3RlOiBpbiB0aGUgY2FzZSBvZiB0aGUgIm9sZCIga2VybmVsIHByb3RvY29sLCBiYXNlX3B0ciBtdXN0CisJICAgYmUgPT0gMHg5MDAwMCBhdCB0aGlzIHBvaW50OyBzZWUgdGhlIHByZXZpb3VzIHNhbXBsZSBjb2RlICovCisKKwlzZWcgPSBiYXNlX3B0ciA+PiA0OworCisJY2xpKCk7CS8qIEVudGVyIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCEgKi8KKworCS8qIFNldCB1cCB0aGUgcmVhbC1tb2RlIGtlcm5lbCBzdGFjayAqLworCV9TUyA9IHNlZzsKKwlfU1AgPSBoZWFwX2VuZDsKKworCV9EUyA9IF9FUyA9IF9GUyA9IF9HUyA9IHNlZzsKKwlqbXBfZmFyKHNlZysweDIwLCAwKTsJLyogUnVuIHRoZSBrZXJuZWwgKi8KKworSWYgeW91ciBib290IHNlY3RvciBhY2Nlc3NlcyBhIGZsb3BweSBkcml2ZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8KK3N3aXRjaCBvZmYgdGhlIGZsb3BweSBtb3RvciBiZWZvcmUgcnVubmluZyB0aGUga2VybmVsLCBzaW5jZSB0aGUKK2tlcm5lbCBib290IGxlYXZlcyBpbnRlcnJ1cHRzIG9mZiBhbmQgdGh1cyB0aGUgbW90b3Igd2lsbCBub3QgYmUKK3N3aXRjaGVkIG9mZiwgZXNwZWNpYWxseSBpZiB0aGUgbG9hZGVkIGtlcm5lbCBoYXMgdGhlIGZsb3BweSBkcml2ZXIgYXMKK2EgZGVtYW5kLWxvYWRlZCBtb2R1bGUhCisKKworKioqKiBBRFZBTkNFRCBCT09UIExPQURFUiBIT09LUworCitJZiB0aGUgYm9vdCBsb2FkZXIgcnVucyBpbiBhIHBhcnRpY3VsYXJseSBob3N0aWxlIGVudmlyb25tZW50IChzdWNoIGFzCitMT0FETElOLCB3aGljaCBydW5zIHVuZGVyIERPUykgaXQgbWF5IGJlIGltcG9zc2libGUgdG8gZm9sbG93IHRoZQorc3RhbmRhcmQgbWVtb3J5IGxvY2F0aW9uIHJlcXVpcmVtZW50cy4gIFN1Y2ggYSBib290IGxvYWRlciBtYXkgdXNlIHRoZQorZm9sbG93aW5nIGhvb2tzIHRoYXQsIGlmIHNldCwgYXJlIGludm9rZWQgYnkgdGhlIGtlcm5lbCBhdCB0aGUKK2FwcHJvcHJpYXRlIHRpbWUuICBUaGUgdXNlIG9mIHRoZXNlIGhvb2tzIHNob3VsZCBwcm9iYWJseSBiZQorY29uc2lkZXJlZCBhbiBhYnNvbHV0ZWx5IGxhc3QgcmVzb3J0IQorCitJTVBPUlRBTlQ6IEFsbCB0aGUgaG9va3MgYXJlIHJlcXVpcmVkIHRvIHByZXNlcnZlICVlc3AsICVlYnAsICVlc2kgYW5kCislZWRpIGFjcm9zcyBpbnZvY2F0aW9uLgorCisgIHJlYWxtb2RlX3N3dGNoOgorCUEgMTYtYml0IHJlYWwgbW9kZSBmYXIgc3Vicm91dGluZSBpbnZva2VkIGltbWVkaWF0ZWx5IGJlZm9yZQorCWVudGVyaW5nIHByb3RlY3RlZCBtb2RlLiAgVGhlIGRlZmF1bHQgcm91dGluZSBkaXNhYmxlcyBOTUksIHNvCisJeW91ciByb3V0aW5lIHNob3VsZCBwcm9iYWJseSBkbyBzbywgdG9vLgorCisgIGNvZGUzMl9zdGFydDoKKwlBIDMyLWJpdCBmbGF0LW1vZGUgcm91dGluZSAqanVtcGVkKiB0byBpbW1lZGlhdGVseSBhZnRlciB0aGUKKwl0cmFuc2l0aW9uIHRvIHByb3RlY3RlZCBtb2RlLCBidXQgYmVmb3JlIHRoZSBrZXJuZWwgaXMKKwl1bmNvbXByZXNzZWQuICBObyBzZWdtZW50cywgZXhjZXB0IENTLCBhcmUgZ3VhcmFudGVlZCB0byBiZQorCXNldCB1cCAoY3VycmVudCBrZXJuZWxzIGRvLCBidXQgb2xkZXIgb25lcyBkbyBub3QpOyB5b3Ugc2hvdWxkCisJc2V0IHRoZW0gdXAgdG8gQk9PVF9EUyAoMHgxOCkgeW91cnNlbGYuCisKKwlBZnRlciBjb21wbGV0aW5nIHlvdXIgaG9vaywgeW91IHNob3VsZCBqdW1wIHRvIHRoZSBhZGRyZXNzCisJdGhhdCB3YXMgaW4gdGhpcyBmaWVsZCBiZWZvcmUgeW91ciBib290IGxvYWRlciBvdmVyd3JvdGUgaXQKKwkocmVsb2NhdGVkLCBpZiBhcHByb3ByaWF0ZS4pCisKKworKioqKiAzMi1iaXQgQk9PVCBQUk9UT0NPTAorCitGb3IgbWFjaGluZSB3aXRoIHNvbWUgbmV3IEJJT1Mgb3RoZXIgdGhhbiBsZWdhY3kgQklPUywgc3VjaCBhcyBFRkksCitMaW51eEJJT1MsIGV0YywgYW5kIGtleGVjLCB0aGUgMTYtYml0IHJlYWwgbW9kZSBzZXR1cCBjb2RlIGluIGtlcm5lbAorYmFzZWQgb24gbGVnYWN5IEJJT1MgY2FuIG5vdCBiZSB1c2VkLCBzbyBhIDMyLWJpdCBib290IHByb3RvY29sIG5lZWRzCit0byBiZSBkZWZpbmVkLgorCitJbiAzMi1iaXQgYm9vdCBwcm90b2NvbCwgdGhlIGZpcnN0IHN0ZXAgaW4gbG9hZGluZyBhIExpbnV4IGtlcm5lbAorc2hvdWxkIGJlIHRvIHNldHVwIHRoZSBib290IHBhcmFtZXRlcnMgKHN0cnVjdCBib290X3BhcmFtcywKK3RyYWRpdGlvbmFsbHkga25vd24gYXMgInplcm8gcGFnZSIpLiBUaGUgbWVtb3J5IGZvciBzdHJ1Y3QgYm9vdF9wYXJhbXMKK3Nob3VsZCBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHRvIGFsbCB6ZXJvLiBUaGVuIHRoZSBzZXR1cCBoZWFkZXIKK2Zyb20gb2Zmc2V0IDB4MDFmMSBvZiBrZXJuZWwgaW1hZ2Ugb24gc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHN0cnVjdAorYm9vdF9wYXJhbXMgYW5kIGV4YW1pbmVkLiBUaGUgZW5kIG9mIHNldHVwIGhlYWRlciBjYW4gYmUgY2FsY3VsYXRlZCBhcworZm9sbG93OgorCisJMHgwMjAyICsgYnl0ZSB2YWx1ZSBhdCBvZmZzZXQgMHgwMjAxCisKK0luIGFkZGl0aW9uIHRvIHJlYWQvbW9kaWZ5L3dyaXRlIHRoZSBzZXR1cCBoZWFkZXIgb2YgdGhlIHN0cnVjdAorYm9vdF9wYXJhbXMgYXMgdGhhdCBvZiAxNi1iaXQgYm9vdCBwcm90b2NvbCwgdGhlIGJvb3QgbG9hZGVyIHNob3VsZAorYWxzbyBmaWxsIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyBvZiB0aGUgc3RydWN0IGJvb3RfcGFyYW1zIGFzIHRoYXQKK2Rlc2NyaWJlZCBpbiB6ZXJvLXBhZ2UudHh0LgorCitBZnRlciBzZXR1cHBpbmcgdGhlIHN0cnVjdCBib290X3BhcmFtcywgdGhlIGJvb3QgbG9hZGVyIGNhbiBsb2FkIHRoZQorMzIvNjQtYml0IGtlcm5lbCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhhdCBvZiAxNi1iaXQgYm9vdCBwcm90b2NvbC4KKworSW4gMzItYml0IGJvb3QgcHJvdG9jb2wsIHRoZSBrZXJuZWwgaXMgc3RhcnRlZCBieSBqdW1waW5nIHRvIHRoZQorMzItYml0IGtlcm5lbCBlbnRyeSBwb2ludCwgd2hpY2ggaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgbG9hZGVkCiszMi82NC1iaXQga2VybmVsLgorCitBdCBlbnRyeSwgdGhlIENQVSBtdXN0IGJlIGluIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSB3aXRoIHBhZ2luZworZGlzYWJsZWQ7IGEgR0RUIG11c3QgYmUgbG9hZGVkIHdpdGggdGhlIGRlc2NyaXB0b3JzIGZvciBzZWxlY3RvcnMKK19fQk9PVF9DUygweDEwKSBhbmQgX19CT09UX0RTKDB4MTgpOyBib3RoIGRlc2NyaXB0b3JzIG11c3QgYmUgNEcgZmxhdAorc2VnbWVudDsgX19CT09TX0NTIG11c3QgaGF2ZSBleGVjdXRlL3JlYWQgcGVybWlzc2lvbiwgYW5kIF9fQk9PVF9EUworbXVzdCBoYXZlIHJlYWQvd3JpdGUgcGVybWlzc2lvbjsgQ1MgbXVzdCBiZSBfX0JPT1RfQ1MgYW5kIERTLCBFUywgU1MKK211c3QgYmUgX19CT09UX0RTOyBpbnRlcnJ1cHQgbXVzdCBiZSBkaXNhYmxlZDsgJWVzaSBtdXN0IGhvbGQgdGhlIGJhc2UKK2FkZHJlc3Mgb2YgdGhlIHN0cnVjdCBib290X3BhcmFtczsgJWVicCwgJWVkaSBhbmQgJWVieCBtdXN0IGJlIHplcm8uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9pMzg2L2Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvaTM4Ni9ib290LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3YmZlNS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9pMzg2L2Jvb3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLQkJICAgICBUSEUgTElOVVgveDg2IEJPT1QgUFJPVE9DT0wKLQkJICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT24gdGhlIHg4NiBwbGF0Zm9ybSwgdGhlIExpbnV4IGtlcm5lbCB1c2VzIGEgcmF0aGVyIGNvbXBsaWNhdGVkIGJvb3QKLWNvbnZlbnRpb24uICBUaGlzIGhhcyBldm9sdmVkIHBhcnRpYWxseSBkdWUgdG8gaGlzdG9yaWNhbCBhc3BlY3RzLCBhcwotd2VsbCBhcyB0aGUgZGVzaXJlIGluIHRoZSBlYXJseSBkYXlzIHRvIGhhdmUgdGhlIGtlcm5lbCBpdHNlbGYgYmUgYQotYm9vdGFibGUgaW1hZ2UsIHRoZSBjb21wbGljYXRlZCBQQyBtZW1vcnkgbW9kZWwgYW5kIGR1ZSB0byBjaGFuZ2VkCi1leHBlY3RhdGlvbnMgaW4gdGhlIFBDIGluZHVzdHJ5IGNhdXNlZCBieSB0aGUgZWZmZWN0aXZlIGRlbWlzZSBvZgotcmVhbC1tb2RlIERPUyBhcyBhIG1haW5zdHJlYW0gb3BlcmF0aW5nIHN5c3RlbS4KLQotQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIHZlcnNpb25zIG9mIHRoZSBMaW51eC94ODYgYm9vdCBwcm90b2NvbCBleGlzdC4KLQotT2xkIGtlcm5lbHM6CXpJbWFnZS9JbWFnZSBzdXBwb3J0IG9ubHkuICBTb21lIHZlcnkgZWFybHkga2VybmVscwotCQltYXkgbm90IGV2ZW4gc3VwcG9ydCBhIGNvbW1hbmQgbGluZS4KLQotUHJvdG9jb2wgMi4wMDoJKEtlcm5lbCAxLjMuNzMpIEFkZGVkIGJ6SW1hZ2UgYW5kIGluaXRyZCBzdXBwb3J0LCBhcwotCQl3ZWxsIGFzIGEgZm9ybWFsaXplZCB3YXkgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUKLQkJYm9vdCBsb2FkZXIgYW5kIHRoZSBrZXJuZWwuICBzZXR1cC5TIG1hZGUgcmVsb2NhdGFibGUsCi0JCWFsdGhvdWdoIHRoZSB0cmFkaXRpb25hbCBzZXR1cCBhcmVhIHN0aWxsIGFzc3VtZWQKLQkJd3JpdGFibGUuCi0KLVByb3RvY29sIDIuMDE6CShLZXJuZWwgMS4zLjc2KSBBZGRlZCBhIGhlYXAgb3ZlcnJ1biB3YXJuaW5nLgotCi1Qcm90b2NvbCAyLjAyOgkoS2VybmVsIDIuNC4wLXRlc3QzLXByZTMpIE5ldyBjb21tYW5kIGxpbmUgcHJvdG9jb2wuCi0JCUxvd2VyIHRoZSBjb252ZW50aW9uYWwgbWVtb3J5IGNlaWxpbmcuCU5vIG92ZXJ3cml0ZQotCQlvZiB0aGUgdHJhZGl0aW9uYWwgc2V0dXAgYXJlYSwgdGh1cyBtYWtpbmcgYm9vdGluZwotCQlzYWZlIGZvciBzeXN0ZW1zIHdoaWNoIHVzZSB0aGUgRUJEQSBmcm9tIFNNTSBvciAzMi1iaXQKLQkJQklPUyBlbnRyeSBwb2ludHMuICB6SW1hZ2UgZGVwcmVjYXRlZCBidXQgc3RpbGwKLQkJc3VwcG9ydGVkLgotCi1Qcm90b2NvbCAyLjAzOgkoS2VybmVsIDIuNC4xOC1wcmUxKSBFeHBsaWNpdGx5IG1ha2VzIHRoZSBoaWdoZXN0IHBvc3NpYmxlCi0JCWluaXRyZCBhZGRyZXNzIGF2YWlsYWJsZSB0byB0aGUgYm9vdGxvYWRlci4KLQotUHJvdG9jb2wgMi4wNDoJKEtlcm5lbCAyLjYuMTQpIEV4dGVuZCB0aGUgc3lzc2l6ZSBmaWVsZCB0byBmb3VyIGJ5dGVzLgotCi1Qcm90b2NvbCAyLjA1OgkoS2VybmVsIDIuNi4yMCkgTWFrZSBwcm90ZWN0ZWQgbW9kZSBrZXJuZWwgcmVsb2NhdGFibGUuCi0JCUludHJvZHVjZSByZWxvY2F0YWJsZV9rZXJuZWwgYW5kIGtlcm5lbF9hbGlnbm1lbnQgZmllbGRzLgotCi1Qcm90b2NvbCAyLjA2OgkoS2VybmVsIDIuNi4yMikgQWRkZWQgYSBmaWVsZCB0aGF0IGNvbnRhaW5zIHRoZSBzaXplIG9mCi0JCXRoZSBib290IGNvbW1hbmQgbGluZS4KLQotUHJvdG9jb2wgMi4wNzoJKEtlcm5lbCAyLjYuMjQpIEFkZGVkIHBhcmF2aXJ0dWFsaXNlZCBib290IHByb3RvY29sLgotCQlJbnRyb2R1Y2VkIGhhcmR3YXJlX3N1YmFyY2ggYW5kIGhhcmR3YXJlX3N1YmFyY2hfZGF0YQotCQlhbmQgS0VFUF9TRUdNRU5UUyBmbGFnIGluIGxvYWRfZmxhZ3MuCi0KLVByb3RvY29sIDIuMDg6CShLZXJuZWwgMi42LjI2KSBBZGRlZCBjcmMzMiBjaGVja3N1bSBhbmQgRUxGIGZvcm1hdAotCQlwYXlsb2FkLiBJbnRyb2R1Y2VkIHBheWxvYWRfb2Zmc2V0IGFuZCBwYXlsb2FkIGxlbmd0aAotCQlmaWVsZHMgdG8gYWlkIGluIGxvY2F0aW5nIHRoZSBwYXlsb2FkLgotCi1Qcm90b2NvbCAyLjA5OgkoS2VybmVsIDIuNi4yNikgQWRkZWQgYSBmaWVsZCBvZiA2NC1iaXQgcGh5c2ljYWwKLQkJcG9pbnRlciB0byBzaW5nbGUgbGlua2VkIGxpc3Qgb2Ygc3RydWN0CXNldHVwX2RhdGEuCi0KLSoqKiogTUVNT1JZIExBWU9VVAotCi1UaGUgdHJhZGl0aW9uYWwgbWVtb3J5IG1hcCBmb3IgdGhlIGtlcm5lbCBsb2FkZXIsIHVzZWQgZm9yIEltYWdlIG9yCi16SW1hZ2Uga2VybmVscywgdHlwaWNhbGx5IGxvb2tzIGxpa2U6Ci0KLQl8CQkJIHwKLTBBMDAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCXwgIFJlc2VydmVkIGZvciBCSU9TCSB8CURvIG5vdCB1c2UuICBSZXNlcnZlZCBmb3IgQklPUyBFQkRBLgotMDlBMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JfCAgQ29tbWFuZCBsaW5lCQkgfAotCXwgIFN0YWNrL2hlYXAJCSB8CUZvciB1c2UgYnkgdGhlIGtlcm5lbCByZWFsLW1vZGUgY29kZS4KLTA5ODAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwkKLQl8ICBLZXJuZWwgc2V0dXAJCSB8CVRoZSBrZXJuZWwgcmVhbC1tb2RlIGNvZGUuCi0wOTAyMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQl8ICBLZXJuZWwgYm9vdCBzZWN0b3IJIHwJVGhlIGtlcm5lbCBsZWdhY3kgYm9vdCBzZWN0b3IuCi0wOTAwMDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQl8ICBQcm90ZWN0ZWQtbW9kZSBrZXJuZWwgfAlUaGUgYnVsayBvZiB0aGUga2VybmVsIGltYWdlLgotMDEwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JfCAgQm9vdCBsb2FkZXIJCSB8CTwtIEJvb3Qgc2VjdG9yIGVudHJ5IHBvaW50IDAwMDA6N0MwMAotMDAxMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JfCAgUmVzZXJ2ZWQgZm9yIE1CUi9CSU9TIHwKLTAwMDgwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCXwgIFR5cGljYWxseSB1c2VkIGJ5IE1CUiB8Ci0wMDA2MDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgCi0JfCAgQklPUyB1c2Ugb25seQkgfAotMDAwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLQotV2hlbiB1c2luZyBiekltYWdlLCB0aGUgcHJvdGVjdGVkLW1vZGUga2VybmVsIHdhcyByZWxvY2F0ZWQgdG8KLTB4MTAwMDAwICgiaGlnaCBtZW1vcnkiKSwgYW5kIHRoZSBrZXJuZWwgcmVhbC1tb2RlIGJsb2NrIChib290IHNlY3RvciwKLXNldHVwLCBhbmQgc3RhY2svaGVhcCkgd2FzIG1hZGUgcmVsb2NhdGFibGUgdG8gYW55IGFkZHJlc3MgYmV0d2VlbgotMHgxMDAwMCBhbmQgZW5kIG9mIGxvdyBtZW1vcnkuIFVuZm9ydHVuYXRlbHksIGluIHByb3RvY29scyAyLjAwIGFuZAotMi4wMSB0aGUgMHg5MDAwMCsgbWVtb3J5IHJhbmdlIGlzIHN0aWxsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsOwotdGhlIDIuMDIgcHJvdG9jb2wgcmVzb2x2ZXMgdGhhdCBwcm9ibGVtLgotCi1JdCBpcyBkZXNpcmFibGUgdG8ga2VlcCB0aGUgIm1lbW9yeSBjZWlsaW5nIiAtLSB0aGUgaGlnaGVzdCBwb2ludCBpbgotbG93IG1lbW9yeSB0b3VjaGVkIGJ5IHRoZSBib290IGxvYWRlciAtLSBhcyBsb3cgYXMgcG9zc2libGUsIHNpbmNlCi1zb21lIG5ld2VyIEJJT1NlcyBoYXZlIGJlZ3VuIHRvIGFsbG9jYXRlIHNvbWUgcmF0aGVyIGxhcmdlIGFtb3VudHMgb2YKLW1lbW9yeSwgY2FsbGVkIHRoZSBFeHRlbmRlZCBCSU9TIERhdGEgQXJlYSwgbmVhciB0aGUgdG9wIG9mIGxvdwotbWVtb3J5LgkgVGhlIGJvb3QgbG9hZGVyIHNob3VsZCB1c2UgdGhlICJJTlQgMTJoIiBCSU9TIGNhbGwgdG8gdmVyaWZ5Ci1ob3cgbXVjaCBsb3cgbWVtb3J5IGlzIGF2YWlsYWJsZS4KLQotVW5mb3J0dW5hdGVseSwgaWYgSU5UIDEyaCByZXBvcnRzIHRoYXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgaXMgdG9vCi1sb3csIHRoZXJlIGlzIHVzdWFsbHkgbm90aGluZyB0aGUgYm9vdCBsb2FkZXIgY2FuIGRvIGJ1dCB0byByZXBvcnQgYW4KLWVycm9yIHRvIHRoZSB1c2VyLiAgVGhlIGJvb3QgbG9hZGVyIHNob3VsZCB0aGVyZWZvcmUgYmUgZGVzaWduZWQgdG8KLXRha2UgdXAgYXMgbGl0dGxlIHNwYWNlIGluIGxvdyBtZW1vcnkgYXMgaXQgcmVhc29uYWJseSBjYW4uICBGb3IKLXpJbWFnZSBvciBvbGQgYnpJbWFnZSBrZXJuZWxzLCB3aGljaCBuZWVkIGRhdGEgd3JpdHRlbiBpbnRvIHRoZQotMHg5MDAwMCBzZWdtZW50LCB0aGUgYm9vdCBsb2FkZXIgc2hvdWxkIG1ha2Ugc3VyZSBub3QgdG8gdXNlIG1lbW9yeQotYWJvdmUgdGhlIDB4OUEwMDAgcG9pbnQ7IHRvbyBtYW55IEJJT1NlcyB3aWxsIGJyZWFrIGFib3ZlIHRoYXQgcG9pbnQuCi0KLUZvciBhIG1vZGVybiBiekltYWdlIGtlcm5lbCB3aXRoIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiA+PSAyLjAyLCBhCi1tZW1vcnkgbGF5b3V0IGxpa2UgdGhlIGZvbGxvd2luZyBpcyBzdWdnZXN0ZWQ6Ci0KLQl+ICAgICAgICAgICAgICAgICAgICAgICAgfgotICAgICAgICB8ICBQcm90ZWN0ZWQtbW9kZSBrZXJuZWwgfAotMTAwMDAwICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCXwgIEkvTyBtZW1vcnkgaG9sZQkgfAotMEEwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JfCAgUmVzZXJ2ZWQgZm9yIEJJT1MJIHwJTGVhdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSB1bnVzZWQKLQl+ICAgICAgICAgICAgICAgICAgICAgICAgfgotCXwgIENvbW1hbmQgbGluZQkJIHwJKENhbiBhbHNvIGJlIGJlbG93IHRoZSBYKzEwMDAwIG1hcmspCi1YKzEwMDAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JfCAgU3RhY2svaGVhcAkJIHwJRm9yIHVzZSBieSB0aGUga2VybmVsIHJlYWwtbW9kZSBjb2RlLgotWCswODAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwkKLQl8ICBLZXJuZWwgc2V0dXAJCSB8CVRoZSBrZXJuZWwgcmVhbC1tb2RlIGNvZGUuCi0JfCAgS2VybmVsIGJvb3Qgc2VjdG9yCSB8CVRoZSBrZXJuZWwgbGVnYWN5IGJvb3Qgc2VjdG9yLgotWCAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCXwgIEJvb3QgbG9hZGVyCQkgfAk8LSBCb290IHNlY3RvciBlbnRyeSBwb2ludCAwMDAwOjdDMDAKLTAwMTAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCXwgIFJlc2VydmVkIGZvciBNQlIvQklPUyB8Ci0wMDA4MDAJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQl8ICBUeXBpY2FsbHkgdXNlZCBieSBNQlIgfAotMDAwNjAwCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIAotCXwgIEJJT1MgdXNlIG9ubHkJIHwKLTAwMDAwMAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCi0uLi4gd2hlcmUgdGhlIGFkZHJlc3MgWCBpcyBhcyBsb3cgYXMgdGhlIGRlc2lnbiBvZiB0aGUgYm9vdCBsb2FkZXIKLXBlcm1pdHMuCi0KLQotKioqKiBUSEUgUkVBTC1NT0RFIEtFUk5FTCBIRUFERVIKLQotSW4gdGhlIGZvbGxvd2luZyB0ZXh0LCBhbmQgYW55d2hlcmUgaW4gdGhlIGtlcm5lbCBib290IHNlcXVlbmNlLCAiYQotc2VjdG9yIiByZWZlcnMgdG8gNTEyIGJ5dGVzLiAgSXQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdHVhbCBzZWN0b3IKLXNpemUgb2YgdGhlIHVuZGVybHlpbmcgbWVkaXVtLgotCi1UaGUgZmlyc3Qgc3RlcCBpbiBsb2FkaW5nIGEgTGludXgga2VybmVsIHNob3VsZCBiZSB0byBsb2FkIHRoZQotcmVhbC1tb2RlIGNvZGUgKGJvb3Qgc2VjdG9yIGFuZCBzZXR1cCBjb2RlKSBhbmQgdGhlbiBleGFtaW5lIHRoZQotZm9sbG93aW5nIGhlYWRlciBhdCBvZmZzZXQgMHgwMWYxLiAgVGhlIHJlYWwtbW9kZSBjb2RlIGNhbiB0b3RhbCB1cCB0bwotMzJLLCBhbHRob3VnaCB0aGUgYm9vdCBsb2FkZXIgbWF5IGNob29zZSB0byBsb2FkIG9ubHkgdGhlIGZpcnN0IHR3bwotc2VjdG9ycyAoMUspIGFuZCB0aGVuIGV4YW1pbmUgdGhlIGJvb3R1cCBzZWN0b3Igc2l6ZS4KLQotVGhlIGhlYWRlciBsb29rcyBsaWtlOgotCi1PZmZzZXQJUHJvdG8JTmFtZQkJTWVhbmluZwotL1NpemUKLQotMDFGMS8xCUFMTCgxCXNldHVwX3NlY3RzCVRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzCi0wMUYyLzIJQUxMCXJvb3RfZmxhZ3MJSWYgc2V0LCB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWRvbmx5Ci0wMUY0LzQJMi4wNCsoMglzeXNzaXplCQlUaGUgc2l6ZSBvZiB0aGUgMzItYml0IGNvZGUgaW4gMTYtYnl0ZSBwYXJhcwotMDFGOC8yCUFMTAlyYW1fc2l6ZQlETyBOT1QgVVNFIC0gZm9yIGJvb3RzZWN0LlMgdXNlIG9ubHkKLTAxRkEvMglBTEwJdmlkX21vZGUJVmlkZW8gbW9kZSBjb250cm9sCi0wMUZDLzIJQUxMCXJvb3RfZGV2CURlZmF1bHQgcm9vdCBkZXZpY2UgbnVtYmVyCi0wMUZFLzIJQUxMCWJvb3RfZmxhZwkweEFBNTUgbWFnaWMgbnVtYmVyCi0wMjAwLzIJMi4wMCsJanVtcAkJSnVtcCBpbnN0cnVjdGlvbgotMDIwMi80CTIuMDArCWhlYWRlcgkJTWFnaWMgc2lnbmF0dXJlICJIZHJTIgotMDIwNi8yCTIuMDArCXZlcnNpb24JCUJvb3QgcHJvdG9jb2wgdmVyc2lvbiBzdXBwb3J0ZWQKLTAyMDgvNAkyLjAwKwlyZWFsbW9kZV9zd3RjaAlCb290IGxvYWRlciBob29rIChzZWUgYmVsb3cpCi0wMjBDLzIJMi4wMCsJc3RhcnRfc3lzCVRoZSBsb2FkLWxvdyBzZWdtZW50ICgweDEwMDApIChvYnNvbGV0ZSkKLTAyMEUvMgkyLjAwKwlrZXJuZWxfdmVyc2lvbglQb2ludGVyIHRvIGtlcm5lbCB2ZXJzaW9uIHN0cmluZwotMDIxMC8xCTIuMDArCXR5cGVfb2ZfbG9hZGVyCUJvb3QgbG9hZGVyIGlkZW50aWZpZXIKLTAyMTEvMQkyLjAwKwlsb2FkZmxhZ3MJQm9vdCBwcm90b2NvbCBvcHRpb24gZmxhZ3MKLTAyMTIvMgkyLjAwKwlzZXR1cF9tb3ZlX3NpemUJTW92ZSB0byBoaWdoIG1lbW9yeSBzaXplICh1c2VkIHdpdGggaG9va3MpCi0wMjE0LzQJMi4wMCsJY29kZTMyX3N0YXJ0CUJvb3QgbG9hZGVyIGhvb2sgKHNlZSBiZWxvdykKLTAyMTgvNAkyLjAwKwlyYW1kaXNrX2ltYWdlCWluaXRyZCBsb2FkIGFkZHJlc3MgKHNldCBieSBib290IGxvYWRlcikKLTAyMUMvNAkyLjAwKwlyYW1kaXNrX3NpemUJaW5pdHJkIHNpemUgKHNldCBieSBib290IGxvYWRlcikKLTAyMjAvNAkyLjAwKwlib290c2VjdF9rbHVkZ2UJRE8gTk9UIFVTRSAtIGZvciBib290c2VjdC5TIHVzZSBvbmx5Ci0wMjI0LzIJMi4wMSsJaGVhcF9lbmRfcHRyCUZyZWUgbWVtb3J5IGFmdGVyIHNldHVwIGVuZAotMDIyNi8yCU4vQQlwYWQxCQlVbnVzZWQKLTAyMjgvNAkyLjAyKwljbWRfbGluZV9wdHIJMzItYml0IHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKLTAyMkMvNAkyLjAzKwlpbml0cmRfYWRkcl9tYXgJSGlnaGVzdCBsZWdhbCBpbml0cmQgYWRkcmVzcwotMDIzMC80CTIuMDUrCWtlcm5lbF9hbGlnbm1lbnQgUGh5c2ljYWwgYWRkciBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIGtlcm5lbAotMDIzNC8xCTIuMDUrCXJlbG9jYXRhYmxlX2tlcm5lbCBXaGV0aGVyIGtlcm5lbCBpcyByZWxvY2F0YWJsZSBvciBub3QKLTAyMzUvMwlOL0EJcGFkMgkJVW51c2VkCi0wMjM4LzQJMi4wNisJY21kbGluZV9zaXplCU1heGltdW0gc2l6ZSBvZiB0aGUga2VybmVsIGNvbW1hbmQgbGluZQotMDIzQy80CTIuMDcrCWhhcmR3YXJlX3N1YmFyY2ggSGFyZHdhcmUgc3ViYXJjaGl0ZWN0dXJlCi0wMjQwLzgJMi4wNysJaGFyZHdhcmVfc3ViYXJjaF9kYXRhIFN1YmFyY2hpdGVjdHVyZS1zcGVjaWZpYyBkYXRhCi0wMjQ4LzQJMi4wOCsJcGF5bG9hZF9vZmZzZXQJT2Zmc2V0IG9mIGtlcm5lbCBwYXlsb2FkCi0wMjRDLzQJMi4wOCsJcGF5bG9hZF9sZW5ndGgJTGVuZ3RoIG9mIGtlcm5lbCBwYXlsb2FkCi0wMjUwLzgJMi4wOSsJc2V0dXBfZGF0YQk2NC1iaXQgcGh5c2ljYWwgcG9pbnRlciB0byBsaW5rZWQgbGlzdAotCQkJCW9mIHN0cnVjdCBzZXR1cF9kYXRhCi0KLSgxKSBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZSBzZXR1cF9zZWN0cyBmaWVsZCBjb250YWlucyAwLCB0aGUKLSAgICByZWFsIHZhbHVlIGlzIDQuCi0KLSgyKSBGb3IgYm9vdCBwcm90b2NvbCBwcmlvciB0byAyLjA0LCB0aGUgdXBwZXIgdHdvIGJ5dGVzIG9mIHRoZSBzeXNzaXplCi0gICAgZmllbGQgYXJlIHVudXNhYmxlLCB3aGljaCBtZWFucyB0aGUgc2l6ZSBvZiBhIGJ6SW1hZ2Uga2VybmVsCi0gICAgY2Fubm90IGJlIGRldGVybWluZWQuCi0KLUlmIHRoZSAiSGRyUyIgKDB4NTM3MjY0NDgpIG1hZ2ljIG51bWJlciBpcyBub3QgZm91bmQgYXQgb2Zmc2V0IDB4MjAyLAotdGhlIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiBpcyAib2xkIi4gIExvYWRpbmcgYW4gb2xkIGtlcm5lbCwgdGhlCi1mb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgYXNzdW1lZDoKLQotCUltYWdlIHR5cGUgPSB6SW1hZ2UKLQlpbml0cmQgbm90IHN1cHBvcnRlZAotCVJlYWwtbW9kZSBrZXJuZWwgbXVzdCBiZSBsb2NhdGVkIGF0IDB4OTAwMDAuCi0KLU90aGVyd2lzZSwgdGhlICJ2ZXJzaW9uIiBmaWVsZCBjb250YWlucyB0aGUgcHJvdG9jb2wgdmVyc2lvbiwKLWUuZy4gcHJvdG9jb2wgdmVyc2lvbiAyLjAxIHdpbGwgY29udGFpbiAweDAyMDEgaW4gdGhpcyBmaWVsZC4gIFdoZW4KLXNldHRpbmcgZmllbGRzIGluIHRoZSBoZWFkZXIsIHlvdSBtdXN0IG1ha2Ugc3VyZSBvbmx5IHRvIHNldCBmaWVsZHMKLXN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuCi0KLQotKioqKiBERVRBSUxTIE9GIEhFQURFUiBGSUVMRFMKLQotRm9yIGVhY2ggZmllbGQsIHNvbWUgYXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIGtlcm5lbCB0byB0aGUgYm9vdGxvYWRlcgotKCJyZWFkIiksIHNvbWUgYXJlIGV4cGVjdGVkIHRvIGJlIGZpbGxlZCBvdXQgYnkgdGhlIGJvb3Rsb2FkZXIKLSgid3JpdGUiKSwgYW5kIHNvbWUgYXJlIGV4cGVjdGVkIHRvIGJlIHJlYWQgYW5kIG1vZGlmaWVkIGJ5IHRoZQotYm9vdGxvYWRlciAoIm1vZGlmeSIpLgotCi1BbGwgZ2VuZXJhbCBwdXJwb3NlIGJvb3QgbG9hZGVycyBzaG91bGQgd3JpdGUgdGhlIGZpZWxkcyBtYXJrZWQKLShvYmxpZ2F0b3J5KS4gIEJvb3QgbG9hZGVycyB3aG8gd2FudCB0byBsb2FkIHRoZSBrZXJuZWwgYXQgYQotbm9uc3RhbmRhcmQgYWRkcmVzcyBzaG91bGQgZmlsbCBpbiB0aGUgZmllbGRzIG1hcmtlZCAocmVsb2MpOyBvdGhlcgotYm9vdCBsb2FkZXJzIGNhbiBpZ25vcmUgdGhvc2UgZmllbGRzLgotCi1UaGUgYnl0ZSBvcmRlciBvZiBhbGwgZmllbGRzIGlzIGxpdHRsZWVuZGlhbiAodGhpcyBpcyB4ODYsIGFmdGVyIGFsbC4pCi0KLUZpZWxkIG5hbWU6CXNldHVwX3NlY3RzCi1UeXBlOgkJcmVhZAotT2Zmc2V0L3NpemU6CTB4MWYxLzEKLVByb3RvY29sOglBTEwKLQotICBUaGUgc2l6ZSBvZiB0aGUgc2V0dXAgY29kZSBpbiA1MTItYnl0ZSBzZWN0b3JzLiAgSWYgdGhpcyBmaWVsZCBpcwotICAwLCB0aGUgcmVhbCB2YWx1ZSBpcyA0LiAgVGhlIHJlYWwtbW9kZSBjb2RlIGNvbnNpc3RzIG9mIHRoZSBib290Ci0gIHNlY3RvciAoYWx3YXlzIG9uZSA1MTItYnl0ZSBzZWN0b3IpIHBsdXMgdGhlIHNldHVwIGNvZGUuCi0KLUZpZWxkIG5hbWU6CSByb290X2ZsYWdzCi1UeXBlOgkJIG1vZGlmeSAob3B0aW9uYWwpCi1PZmZzZXQvc2l6ZToJIDB4MWYyLzIKLVByb3RvY29sOgkgQUxMCi0KLSAgSWYgdGhpcyBmaWVsZCBpcyBub256ZXJvLCB0aGUgcm9vdCBkZWZhdWx0cyB0byByZWFkb25seS4gIFRoZSB1c2Ugb2YKLSAgdGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkOyB1c2UgdGhlICJybyIgb3IgInJ3IiBvcHRpb25zIG9uIHRoZQotICBjb21tYW5kIGxpbmUgaW5zdGVhZC4KLQotRmllbGQgbmFtZToJc3lzc2l6ZQotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDFmNC80IChwcm90b2NvbCAyLjA0KykgMHgxZjQvMiAocHJvdG9jb2wgQUxMKQotUHJvdG9jb2w6CTIuMDQrCi0KLSAgVGhlIHNpemUgb2YgdGhlIHByb3RlY3RlZC1tb2RlIGNvZGUgaW4gdW5pdHMgb2YgMTYtYnl0ZSBwYXJhZ3JhcGhzLgotICBGb3IgcHJvdG9jb2wgdmVyc2lvbnMgb2xkZXIgdGhhbiAyLjA0IHRoaXMgZmllbGQgaXMgb25seSB0d28gYnl0ZXMKLSAgd2lkZSwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgdHJ1c3RlZCBmb3IgdGhlIHNpemUgb2YgYSBrZXJuZWwgaWYKLSAgdGhlIExPQURfSElHSCBmbGFnIGlzIHNldC4KLQotRmllbGQgbmFtZToJcmFtX3NpemUKLVR5cGU6CQlrZXJuZWwgaW50ZXJuYWwKLU9mZnNldC9zaXplOgkweDFmOC8yCi1Qcm90b2NvbDoJQUxMCi0KLSAgVGhpcyBmaWVsZCBpcyBvYnNvbGV0ZS4KLQotRmllbGQgbmFtZToJdmlkX21vZGUKLVR5cGU6CQltb2RpZnkgKG9ibGlnYXRvcnkpCi1PZmZzZXQvc2l6ZToJMHgxZmEvMgotCi0gIFBsZWFzZSBzZWUgdGhlIHNlY3Rpb24gb24gU1BFQ0lBTCBDT01NQU5EIExJTkUgT1BUSU9OUy4KLQotRmllbGQgbmFtZToJcm9vdF9kZXYKLVR5cGU6CQltb2RpZnkgKG9wdGlvbmFsKQotT2Zmc2V0L3NpemU6CTB4MWZjLzIKLVByb3RvY29sOglBTEwKLQotICBUaGUgZGVmYXVsdCByb290IGRldmljZSBkZXZpY2UgbnVtYmVyLiAgVGhlIHVzZSBvZiB0aGlzIGZpZWxkIGlzCi0gIGRlcHJlY2F0ZWQsIHVzZSB0aGUgInJvb3Q9IiBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSBpbnN0ZWFkLgotCi1GaWVsZCBuYW1lOglib290X2ZsYWcKLVR5cGU6CQlyZWFkCi1PZmZzZXQvc2l6ZToJMHgxZmUvMgotUHJvdG9jb2w6CUFMTAotCi0gIENvbnRhaW5zIDB4QUE1NS4gIFRoaXMgaXMgdGhlIGNsb3Nlc3QgdGhpbmcgb2xkIExpbnV4IGtlcm5lbHMgaGF2ZQotICB0byBhIG1hZ2ljIG51bWJlci4KLQotRmllbGQgbmFtZToJanVtcAotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDIwMC8yCi1Qcm90b2NvbDoJMi4wMCsKLQotICBDb250YWlucyBhbiB4ODYganVtcCBpbnN0cnVjdGlvbiwgMHhFQiBmb2xsb3dlZCBieSBhIHNpZ25lZCBvZmZzZXQKLSAgcmVsYXRpdmUgdG8gYnl0ZSAweDIwMi4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mCi0gIHRoZSBoZWFkZXIuCi0KLUZpZWxkIG5hbWU6CWhlYWRlcgotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDIwMi80Ci1Qcm90b2NvbDoJMi4wMCsKLQotICBDb250YWlucyB0aGUgbWFnaWMgbnVtYmVyICJIZHJTIiAoMHg1MzcyNjQ0OCkuCi0KLUZpZWxkIG5hbWU6CXZlcnNpb24KLVR5cGU6CQlyZWFkCi1PZmZzZXQvc2l6ZToJMHgyMDYvMgotUHJvdG9jb2w6CTIuMDArCi0KLSAgQ29udGFpbnMgdGhlIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiwgaW4gKG1ham9yIDw8IDgpK21pbm9yIGZvcm1hdCwKLSAgZS5nLiAweDAyMDQgZm9yIHZlcnNpb24gMi4wNCwgYW5kIDB4MGExMSBmb3IgYSBoeXBvdGhldGljYWwgdmVyc2lvbgotICAxMC4xNy4KLQotRmllbGQgbmFtZToJcmVhZG1vZGVfc3d0Y2gKLVR5cGU6CQltb2RpZnkgKG9wdGlvbmFsKQotT2Zmc2V0L3NpemU6CTB4MjA4LzQKLVByb3RvY29sOgkyLjAwKwotCi0gIEJvb3QgbG9hZGVyIGhvb2sgKHNlZSBBRFZBTkNFRCBCT09UIExPQURFUiBIT09LUyBiZWxvdy4pCi0KLUZpZWxkIG5hbWU6CXN0YXJ0X3N5cwotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDIwYy80Ci1Qcm90b2NvbDoJMi4wMCsKLQotICBUaGUgbG9hZCBsb3cgc2VnbWVudCAoMHgxMDAwKS4gIE9ic29sZXRlLgotCi1GaWVsZCBuYW1lOglrZXJuZWxfdmVyc2lvbgotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDIwZS8yCi1Qcm90b2NvbDoJMi4wMCsKLQotICBJZiBzZXQgdG8gYSBub256ZXJvIHZhbHVlLCBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBOVUwtdGVybWluYXRlZAotICBodW1hbi1yZWFkYWJsZSBrZXJuZWwgdmVyc2lvbiBudW1iZXIgc3RyaW5nLCBsZXNzIDB4MjAwLiAgVGhpcyBjYW4KLSAgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBrZXJuZWwgdmVyc2lvbiB0byB0aGUgdXNlci4gIFRoaXMgdmFsdWUKLSAgc2hvdWxkIGJlIGxlc3MgdGhhbiAoMHgyMDAqc2V0dXBfc2VjdHMpLgotCi0gIEZvciBleGFtcGxlLCBpZiB0aGlzIHZhbHVlIGlzIHNldCB0byAweDFjMDAsIHRoZSBrZXJuZWwgdmVyc2lvbgotICBudW1iZXIgc3RyaW5nIGNhbiBiZSBmb3VuZCBhdCBvZmZzZXQgMHgxZTAwIGluIHRoZSBrZXJuZWwgZmlsZS4KLSAgVGhpcyBpcyBhIHZhbGlkIHZhbHVlIGlmIGFuZCBvbmx5IGlmIHRoZSAic2V0dXBfc2VjdHMiIGZpZWxkCi0gIGNvbnRhaW5zIHRoZSB2YWx1ZSAxNSBvciBoaWdoZXIsIGFzOgotCi0JMHgxYzAwICA8IDE1KjB4MjAwICg9IDB4MWUwMCkgYnV0Ci0JMHgxYzAwID49IDE0KjB4MjAwICg9IDB4MWMwMCkKLQotCTB4MWMwMCA+PiA5ID0gMTQsIHNvIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBzZXR1cF9zZWNzIGlzIDE1LgotCi1GaWVsZCBuYW1lOgl0eXBlX29mX2xvYWRlcgotVHlwZToJCXdyaXRlIChvYmxpZ2F0b3J5KQotT2Zmc2V0L3NpemU6CTB4MjEwLzEKLVByb3RvY29sOgkyLjAwKwotCi0gIElmIHlvdXIgYm9vdCBsb2FkZXIgaGFzIGFuIGFzc2lnbmVkIGlkIChzZWUgdGFibGUgYmVsb3cpLCBlbnRlcgotICAweFRWIGhlcmUsIHdoZXJlIFQgaXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGJvb3QgbG9hZGVyIGFuZCBWIGlzCi0gIGEgdmVyc2lvbiBudW1iZXIuICBPdGhlcndpc2UsIGVudGVyIDB4RkYgaGVyZS4KLQotICBBc3NpZ25lZCBib290IGxvYWRlciBpZHM6Ci0JMCAgTElMTwkJCSgweDAwIHJlc2VydmVkIGZvciBwcmUtMi4wMCBib290bG9hZGVyKQotCTEgIExvYWRsaW4KLQkyICBib290c2VjdC1sb2FkZXIJKDB4MjAsIGFsbCBvdGhlciB2YWx1ZXMgcmVzZXJ2ZWQpCi0JMyAgU1lTTElOVVgKLQk0ICBFdGhlckJvb3QKLQk1ICBFTElMTwotCTcgIEdSdUIKLQk4ICBVLUJPT1QKLQk5ICBYZW4KLQlBICBHdWppbgotCUIgIFFlbXUKLQotICBQbGVhc2UgY29udGFjdCA8aHBhQHp5dG9yLmNvbT4gaWYgeW91IG5lZWQgYSBib290bG9hZGVyIElECi0gIHZhbHVlIGFzc2lnbmVkLgotCi1GaWVsZCBuYW1lOglsb2FkZmxhZ3MKLVR5cGU6CQltb2RpZnkgKG9ibGlnYXRvcnkpCi1PZmZzZXQvc2l6ZToJMHgyMTEvMQotUHJvdG9jb2w6CTIuMDArCi0KLSAgVGhpcyBmaWVsZCBpcyBhIGJpdG1hc2suCi0KLSAgQml0IDAgKHJlYWQpOglMT0FERURfSElHSAotCS0gSWYgMCwgdGhlIHByb3RlY3RlZC1tb2RlIGNvZGUgaXMgbG9hZGVkIGF0IDB4MTAwMDAuCi0JLSBJZiAxLCB0aGUgcHJvdGVjdGVkLW1vZGUgY29kZSBpcyBsb2FkZWQgYXQgMHgxMDAwMDAuCi0KLSAgQml0IDUgKHdyaXRlKTogUVVJRVRfRkxBRwotCS0gSWYgMCwgcHJpbnQgZWFybHkgbWVzc2FnZXMuCi0JLSBJZiAxLCBzdXBwcmVzcyBlYXJseSBtZXNzYWdlcy4KLQkJVGhpcyByZXF1ZXN0cyB0byB0aGUga2VybmVsIChkZWNvbXByZXNzb3IgYW5kIGVhcmx5Ci0JCWtlcm5lbCkgdG8gbm90IHdyaXRlIGVhcmx5IG1lc3NhZ2VzIHRoYXQgcmVxdWlyZQotCQlhY2Nlc3NpbmcgdGhlIGRpc3BsYXkgaGFyZHdhcmUgZGlyZWN0bHkuCi0KLSAgQml0IDYgKHdyaXRlKTogS0VFUF9TRUdNRU5UUwotCVByb3RvY29sOiAyLjA3KwotCS0gSWYgMCwgcmVsb2FkIHRoZSBzZWdtZW50IHJlZ2lzdGVycyBpbiB0aGUgMzJiaXQgZW50cnkgcG9pbnQuCi0JLSBJZiAxLCBkbyBub3QgcmVsb2FkIHRoZSBzZWdtZW50IHJlZ2lzdGVycyBpbiB0aGUgMzJiaXQgZW50cnkgcG9pbnQuCi0JCUFzc3VtZSB0aGF0ICVjcyAlZHMgJXNzICVlcyBhcmUgYWxsIHNldCB0byBmbGF0IHNlZ21lbnRzIHdpdGgKLQkJYSBiYXNlIG9mIDAgKG9yIHRoZSBlcXVpdmFsZW50IGZvciB0aGVpciBlbnZpcm9ubWVudCkuCi0KLSAgQml0IDcgKHdyaXRlKTogQ0FOX1VTRV9IRUFQCi0JU2V0IHRoaXMgYml0IHRvIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgZW50ZXJlZCBpbiB0aGUKLQloZWFwX2VuZF9wdHIgaXMgdmFsaWQuICBJZiB0aGlzIGZpZWxkIGlzIGNsZWFyLCBzb21lIHNldHVwIGNvZGUKLQlmdW5jdGlvbmFsaXR5IHdpbGwgYmUgZGlzYWJsZWQuCi0KLUZpZWxkIG5hbWU6CXNldHVwX21vdmVfc2l6ZQotVHlwZToJCW1vZGlmeSAob2JsaWdhdG9yeSkKLU9mZnNldC9zaXplOgkweDIxMi8yCi1Qcm90b2NvbDoJMi4wMC0yLjAxCi0KLSAgV2hlbiB1c2luZyBwcm90b2NvbCAyLjAwIG9yIDIuMDEsIGlmIHRoZSByZWFsIG1vZGUga2VybmVsIGlzIG5vdAotICBsb2FkZWQgYXQgMHg5MDAwMCwgaXQgZ2V0cyBtb3ZlZCB0aGVyZSBsYXRlciBpbiB0aGUgbG9hZGluZwotICBzZXF1ZW5jZS4gIEZpbGwgaW4gdGhpcyBmaWVsZCBpZiB5b3Ugd2FudCBhZGRpdGlvbmFsIGRhdGEgKHN1Y2ggYXMKLSAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUpIG1vdmVkIGluIGFkZGl0aW9uIHRvIHRoZSByZWFsLW1vZGUga2VybmVsCi0gIGl0c2VsZi4KLQotICBUaGUgdW5pdCBpcyBieXRlcyBzdGFydGluZyB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJvb3Qgc2VjdG9yLgotICAKLSAgVGhpcyBmaWVsZCBpcyBjYW4gYmUgaWdub3JlZCB3aGVuIHRoZSBwcm90b2NvbCBpcyAyLjAyIG9yIGhpZ2hlciwgb3IKLSAgaWYgdGhlIHJlYWwtbW9kZSBjb2RlIGlzIGxvYWRlZCBhdCAweDkwMDAwLgotCi1GaWVsZCBuYW1lOgljb2RlMzJfc3RhcnQKLVR5cGU6CQltb2RpZnkgKG9wdGlvbmFsLCByZWxvYykKLU9mZnNldC9zaXplOgkweDIxNC80Ci1Qcm90b2NvbDoJMi4wMCsKLQotICBUaGUgYWRkcmVzcyB0byBqdW1wIHRvIGluIHByb3RlY3RlZCBtb2RlLiAgVGhpcyBkZWZhdWx0cyB0byB0aGUgbG9hZAotICBhZGRyZXNzIG9mIHRoZSBrZXJuZWwsIGFuZCBjYW4gYmUgdXNlZCBieSB0aGUgYm9vdCBsb2FkZXIgdG8KLSAgZGV0ZXJtaW5lIHRoZSBwcm9wZXIgbG9hZCBhZGRyZXNzLgotCi0gIFRoaXMgZmllbGQgY2FuIGJlIG1vZGlmaWVkIGZvciB0d28gcHVycG9zZXM6Ci0KLSAgMS4gYXMgYSBib290IGxvYWRlciBob29rIChzZWUgQURWQU5DRUQgQk9PVCBMT0FERVIgSE9PS1MgYmVsb3cuKQotCi0gIDIuIGlmIGEgYm9vdGxvYWRlciB3aGljaCBkb2VzIG5vdCBpbnN0YWxsIGEgaG9vayBsb2FkcyBhCi0gICAgIHJlbG9jYXRhYmxlIGtlcm5lbCBhdCBhIG5vbnN0YW5kYXJkIGFkZHJlc3MgaXQgd2lsbCBoYXZlIHRvIG1vZGlmeQotICAgICB0aGlzIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBsb2FkIGFkZHJlc3MuCi0KLUZpZWxkIG5hbWU6CXJhbWRpc2tfaW1hZ2UKLVR5cGU6CQl3cml0ZSAob2JsaWdhdG9yeSkKLU9mZnNldC9zaXplOgkweDIxOC80Ci1Qcm90b2NvbDoJMi4wMCsKLQotICBUaGUgMzItYml0IGxpbmVhciBhZGRyZXNzIG9mIHRoZSBpbml0aWFsIHJhbWRpc2sgb3IgcmFtZnMuICBMZWF2ZSBhdAotICB6ZXJvIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgcmFtZGlzay9yYW1mcy4KLQotRmllbGQgbmFtZToJcmFtZGlza19zaXplCi1UeXBlOgkJd3JpdGUgKG9ibGlnYXRvcnkpCi1PZmZzZXQvc2l6ZToJMHgyMWMvNAotUHJvdG9jb2w6CTIuMDArCi0KLSAgU2l6ZSBvZiB0aGUgaW5pdGlhbCByYW1kaXNrIG9yIHJhbWZzLiAgTGVhdmUgYXQgemVybyBpZiB0aGVyZSBpcyBubwotICBpbml0aWFsIHJhbWRpc2svcmFtZnMuCi0KLUZpZWxkIG5hbWU6CWJvb3RzZWN0X2tsdWRnZQotVHlwZToJCWtlcm5lbCBpbnRlcm5hbAotT2Zmc2V0L3NpemU6CTB4MjIwLzQKLVByb3RvY29sOgkyLjAwKwotCi0gIFRoaXMgZmllbGQgaXMgb2Jzb2xldGUuCi0KLUZpZWxkIG5hbWU6CWhlYXBfZW5kX3B0cgotVHlwZToJCXdyaXRlIChvYmxpZ2F0b3J5KQotT2Zmc2V0L3NpemU6CTB4MjI0LzIKLVByb3RvY29sOgkyLjAxKwotCi0gIFNldCB0aGlzIGZpZWxkIHRvIHRoZSBvZmZzZXQgKGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhbC1tb2RlCi0gIGNvZGUpIG9mIHRoZSBlbmQgb2YgdGhlIHNldHVwIHN0YWNrL2hlYXAsIG1pbnVzIDB4MDIwMC4KLQotRmllbGQgbmFtZToJY21kX2xpbmVfcHRyCi1UeXBlOgkJd3JpdGUgKG9ibGlnYXRvcnkpCi1PZmZzZXQvc2l6ZToJMHgyMjgvNAotUHJvdG9jb2w6CTIuMDIrCi0KLSAgU2V0IHRoaXMgZmllbGQgdG8gdGhlIGxpbmVhciBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgotICBUaGUga2VybmVsIGNvbW1hbmQgbGluZSBjYW4gYmUgbG9jYXRlZCBhbnl3aGVyZSBiZXR3ZWVuIHRoZSBlbmQgb2YKLSAgdGhlIHNldHVwIGhlYXAgYW5kIDB4QTAwMDA7IGl0IGRvZXMgbm90IGhhdmUgdG8gYmUgbG9jYXRlZCBpbiB0aGUKLSAgc2FtZSA2NEsgc2VnbWVudCBhcyB0aGUgcmVhbC1tb2RlIGNvZGUgaXRzZWxmLgotCi0gIEZpbGwgaW4gdGhpcyBmaWVsZCBldmVuIGlmIHlvdXIgYm9vdCBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBhCi0gIGNvbW1hbmQgbGluZSwgaW4gd2hpY2ggY2FzZSB5b3UgY2FuIHBvaW50IHRoaXMgdG8gYW4gZW1wdHkgc3RyaW5nCi0gIChvciBiZXR0ZXIgeWV0LCB0byB0aGUgc3RyaW5nICJhdXRvIi4pICBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYXQKLSAgemVybywgdGhlIGtlcm5lbCB3aWxsIGFzc3VtZSB0aGF0IHlvdXIgYm9vdCBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydAotICB0aGUgMi4wMisgcHJvdG9jb2wuCi0KLUZpZWxkIG5hbWU6CWluaXRyZF9hZGRyX21heAotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDIyYy80Ci1Qcm90b2NvbDoJMi4wMysKLQotICBUaGUgbWF4aW11bSBhZGRyZXNzIHRoYXQgbWF5IGJlIG9jY3VwaWVkIGJ5IHRoZSBpbml0aWFsCi0gIHJhbWRpc2svcmFtZnMgY29udGVudHMuICBGb3IgYm9vdCBwcm90b2NvbHMgMi4wMiBvciBlYXJsaWVyLCB0aGlzCi0gIGZpZWxkIGlzIG5vdCBwcmVzZW50LCBhbmQgdGhlIG1heGltdW0gYWRkcmVzcyBpcyAweDM3RkZGRkZGLiAgKFRoaXMKLSAgYWRkcmVzcyBpcyBkZWZpbmVkIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBoaWdoZXN0IHNhZmUgYnl0ZSwgc28gaWYKLSAgeW91ciByYW1kaXNrIGlzIGV4YWN0bHkgMTMxMDcyIGJ5dGVzIGxvbmcgYW5kIHRoaXMgZmllbGQgaXMKLSAgMHgzN0ZGRkZGRiwgeW91IGNhbiBzdGFydCB5b3VyIHJhbWRpc2sgYXQgMHgzN0ZFMDAwMC4pCi0KLUZpZWxkIG5hbWU6CWtlcm5lbF9hbGlnbm1lbnQKLVR5cGU6CQlyZWFkIChyZWxvYykKLU9mZnNldC9zaXplOgkweDIzMC80Ci1Qcm90b2NvbDoJMi4wNSsKLQotICBBbGlnbm1lbnQgdW5pdCByZXF1aXJlZCBieSB0aGUga2VybmVsIChpZiByZWxvY2F0YWJsZV9rZXJuZWwgaXMgdHJ1ZS4pCi0KLUZpZWxkIG5hbWU6CXJlbG9jYXRhYmxlX2tlcm5lbAotVHlwZToJCXJlYWQgKHJlbG9jKQotT2Zmc2V0L3NpemU6CTB4MjM0LzEKLVByb3RvY29sOgkyLjA1KwotCi0gIElmIHRoaXMgZmllbGQgaXMgbm9uemVybywgdGhlIHByb3RlY3RlZC1tb2RlIHBhcnQgb2YgdGhlIGtlcm5lbCBjYW4KLSAgYmUgbG9hZGVkIGF0IGFueSBhZGRyZXNzIHRoYXQgc2F0aXNmaWVzIHRoZSBrZXJuZWxfYWxpZ25tZW50IGZpZWxkLgotICBBZnRlciBsb2FkaW5nLCB0aGUgYm9vdCBsb2FkZXIgbXVzdCBzZXQgdGhlIGNvZGUzMl9zdGFydCBmaWVsZCB0bwotICBwb2ludCB0byB0aGUgbG9hZGVkIGNvZGUsIG9yIHRvIGEgYm9vdCBsb2FkZXIgaG9vay4KLQotRmllbGQgbmFtZToJY21kbGluZV9zaXplCi1UeXBlOgkJcmVhZAotT2Zmc2V0L3NpemU6CTB4MjM4LzQKLVByb3RvY29sOgkyLjA2KwotCi0gIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IHRoZSB0ZXJtaW5hdGluZwotICB6ZXJvLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbW1hbmQgbGluZSBjYW4gY29udGFpbiBhdCBtb3N0Ci0gIGNtZGxpbmVfc2l6ZSBjaGFyYWN0ZXJzLiBXaXRoIHByb3RvY29sIHZlcnNpb24gMi4wNSBhbmQgZWFybGllciwgdGhlCi0gIG1heGltdW0gc2l6ZSB3YXMgMjU1LgotCi1GaWVsZCBuYW1lOgloYXJkd2FyZV9zdWJhcmNoCi1UeXBlOgkJd3JpdGUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byB4ODYvUEMpCi1PZmZzZXQvc2l6ZToJMHgyM2MvNAotUHJvdG9jb2w6CTIuMDcrCi0KLSAgSW4gYSBwYXJhdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQgdGhlIGhhcmR3YXJlIGxvdyBsZXZlbCBhcmNoaXRlY3R1cmFsCi0gIHBpZWNlcyBzdWNoIGFzIGludGVycnVwdCBoYW5kbGluZywgcGFnZSB0YWJsZSBoYW5kbGluZywgYW5kCi0gIGFjY2Vzc2luZyBwcm9jZXNzIGNvbnRyb2wgcmVnaXN0ZXJzIG5lZWRzIHRvIGJlIGRvbmUgZGlmZmVyZW50bHkuCi0KLSAgVGhpcyBmaWVsZCBhbGxvd3MgdGhlIGJvb3Rsb2FkZXIgdG8gaW5mb3JtIHRoZSBrZXJuZWwgd2UgYXJlIGluIG9uZQotICBvbmUgb2YgdGhvc2UgZW52aXJvbm1lbnRzLgotCi0gIDB4MDAwMDAwMDAJVGhlIGRlZmF1bHQgeDg2L1BDIGVudmlyb25tZW50Ci0gIDB4MDAwMDAwMDEJbGd1ZXN0Ci0gIDB4MDAwMDAwMDIJWGVuCi0KLUZpZWxkIG5hbWU6CWhhcmR3YXJlX3N1YmFyY2hfZGF0YQotVHlwZToJCXdyaXRlIChzdWJhcmNoLWRlcGVuZGVudCkKLU9mZnNldC9zaXplOgkweDI0MC84Ci1Qcm90b2NvbDoJMi4wNysKLQotICBBIHBvaW50ZXIgdG8gZGF0YSB0aGF0IGlzIHNwZWNpZmljIHRvIGhhcmR3YXJlIHN1YmFyY2gKLSAgVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgdW51c2VkIGZvciB0aGUgZGVmYXVsdCB4ODYvUEMgZW52aXJvbm1lbnQsCi0gIGRvIG5vdCBtb2RpZnkuCi0KLUZpZWxkIG5hbWU6CXBheWxvYWRfb2Zmc2V0Ci1UeXBlOgkJcmVhZAotT2Zmc2V0L3NpemU6CTB4MjQ4LzQKLVByb3RvY29sOgkyLjA4KwotCi0gIElmIG5vbi16ZXJvIHRoZW4gdGhpcyBmaWVsZCBjb250YWlucyB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiB0aGUKLSAgcmVhbC1tb2RlIGNvZGUgdG8gdGhlIHBheWxvYWQuCi0KLSAgVGhlIHBheWxvYWQgbWF5IGJlIGNvbXByZXNzZWQuIFRoZSBmb3JtYXQgb2YgYm90aCB0aGUgY29tcHJlc3NlZCBhbmQKLSAgdW5jb21wcmVzc2VkIGRhdGEgc2hvdWxkIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIHN0YW5kYXJkIG1hZ2ljCi0gIG51bWJlcnMuIEN1cnJlbnRseSBvbmx5IGd6aXAgY29tcHJlc3NlZCBFTEYgaXMgdXNlZC4KLSAgCi1GaWVsZCBuYW1lOglwYXlsb2FkX2xlbmd0aAotVHlwZToJCXJlYWQKLU9mZnNldC9zaXplOgkweDI0Yy80Ci1Qcm90b2NvbDoJMi4wOCsKLQotICBUaGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkLgotCi1GaWVsZCBuYW1lOglzZXR1cF9kYXRhCi1UeXBlOgkJd3JpdGUgKHNwZWNpYWwpCi1PZmZzZXQvc2l6ZToJMHgyNTAvOAotUHJvdG9jb2w6CTIuMDkrCi0KLSAgVGhlIDY0LWJpdCBwaHlzaWNhbCBwb2ludGVyIHRvIE5VTEwgdGVybWluYXRlZCBzaW5nbGUgbGlua2VkIGxpc3Qgb2YKLSAgc3RydWN0IHNldHVwX2RhdGEuIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUgYSBtb3JlIGV4dGVuc2libGUgYm9vdAotICBwYXJhbWV0ZXJzIHBhc3NpbmcgbWVjaGFuaXNtLiBUaGUgZGVmaW5pdGlvbiBvZiBzdHJ1Y3Qgc2V0dXBfZGF0YSBpcwotICBhcyBmb2xsb3c6Ci0KLSAgc3RydWN0IHNldHVwX2RhdGEgewotCSAgdTY0IG5leHQ7Ci0JICB1MzIgdHlwZTsKLQkgIHUzMiBsZW47Ci0JICB1OCAgZGF0YVswXTsKLSAgfTsKLQotICBXaGVyZSwgdGhlIG5leHQgaXMgYSA2NC1iaXQgcGh5c2ljYWwgcG9pbnRlciB0byB0aGUgbmV4dCBub2RlIG9mCi0gIGxpbmtlZCBsaXN0LCB0aGUgbmV4dCBmaWVsZCBvZiB0aGUgbGFzdCBub2RlIGlzIDA7IHRoZSB0eXBlIGlzIHVzZWQKLSAgdG8gaWRlbnRpZnkgdGhlIGNvbnRlbnRzIG9mIGRhdGE7IHRoZSBsZW4gaXMgdGhlIGxlbmd0aCBvZiBkYXRhCi0gIGZpZWxkOyB0aGUgZGF0YSBob2xkcyB0aGUgcmVhbCBwYXlsb2FkLgotCi0gIFRoaXMgbGlzdCBtYXkgYmUgbW9kaWZpZWQgYXQgYSBudW1iZXIgb2YgcG9pbnRzIGR1cmluZyB0aGUgYm9vdHVwCi0gIHByb2Nlc3MuICBUaGVyZWZvcmUsIHdoZW4gbW9kaWZ5aW5nIHRoaXMgbGlzdCBvbmUgc2hvdWxkIGFsd2F5cyBtYWtlCi0gIHN1cmUgdG8gY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGFscmVhZHkgY29udGFpbnMKLSAgZW50cmllcy4KLQotCi0qKioqIFRIRSBJTUFHRSBDSEVDS1NVTQotCi1Gcm9tIGJvb3QgcHJvdG9jb2wgdmVyc2lvbiAyLjA4IG9ud2FyZHMgdGhlIENSQy0zMiBpcyBjYWxjdWxhdGVkIG92ZXIKLXRoZSBlbnRpcmUgZmlsZSB1c2luZyB0aGUgY2hhcmFjdGVyaXN0aWMgcG9seW5vbWlhbCAweDA0QzExREI3IGFuZCBhbgotaW5pdGlhbCByZW1haW5kZXIgb2YgMHhmZmZmZmZmZi4gIFRoZSBjaGVja3N1bSBpcyBhcHBlbmRlZCB0byB0aGUKLWZpbGU7IHRoZXJlZm9yZSB0aGUgQ1JDIG9mIHRoZSBmaWxlIHVwIHRvIHRoZSBsaW1pdCBzcGVjaWZpZWQgaW4gdGhlCi1zeXNzaXplIGZpZWxkIG9mIHRoZSBoZWFkZXIgaXMgYWx3YXlzIDAuCi0KLQotKioqKiBUSEUgS0VSTkVMIENPTU1BTkQgTElORQotCi1UaGUga2VybmVsIGNvbW1hbmQgbGluZSBoYXMgYmVjb21lIGFuIGltcG9ydGFudCB3YXkgZm9yIHRoZSBib290Ci1sb2FkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUga2VybmVsLiAgU29tZSBvZiBpdHMgb3B0aW9ucyBhcmUgYWxzbwotcmVsZXZhbnQgdG8gdGhlIGJvb3QgbG9hZGVyIGl0c2VsZiwgc2VlICJzcGVjaWFsIGNvbW1hbmQgbGluZSBvcHRpb25zIgotYmVsb3cuCi0KLVRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gVGhlIG1heGltdW0KLWxlbmd0aCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGZpZWxkIGNtZGxpbmVfc2l6ZS4gIEJlZm9yZSBwcm90b2NvbAotdmVyc2lvbiAyLjA2LCB0aGUgbWF4aW11bSB3YXMgMjU1IGNoYXJhY3RlcnMuICBBIHN0cmluZyB0aGF0IGlzIHRvbwotbG9uZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHJ1bmNhdGVkIGJ5IHRoZSBrZXJuZWwuCi0KLUlmIHRoZSBib290IHByb3RvY29sIHZlcnNpb24gaXMgMi4wMiBvciBsYXRlciwgdGhlIGFkZHJlc3Mgb2YgdGhlCi1rZXJuZWwgY29tbWFuZCBsaW5lIGlzIGdpdmVuIGJ5IHRoZSBoZWFkZXIgZmllbGQgY21kX2xpbmVfcHRyIChzZWUKLWFib3ZlLikgIFRoaXMgYWRkcmVzcyBjYW4gYmUgYW55d2hlcmUgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBzZXR1cAotaGVhcCBhbmQgMHhBMDAwMC4KLQotSWYgdGhlIHByb3RvY29sIHZlcnNpb24gaXMgKm5vdCogMi4wMiBvciBoaWdoZXIsIHRoZSBrZXJuZWwKLWNvbW1hbmQgbGluZSBpcyBlbnRlcmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2w6Ci0KLQlBdCBvZmZzZXQgMHgwMDIwICh3b3JkKSwgImNtZF9saW5lX21hZ2ljIiwgZW50ZXIgdGhlIG1hZ2ljCi0JbnVtYmVyIDB4QTMzRi4KLQotCUF0IG9mZnNldCAweDAwMjIgKHdvcmQpLCAiY21kX2xpbmVfb2Zmc2V0IiwgZW50ZXIgdGhlIG9mZnNldAotCW9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0JcmVhbC1tb2RlIGtlcm5lbCkuCi0JCi0JVGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgKm11c3QqIGJlIHdpdGhpbiB0aGUgbWVtb3J5IHJlZ2lvbgotCWNvdmVyZWQgYnkgc2V0dXBfbW92ZV9zaXplLCBzbyB5b3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoaXMKLQlmaWVsZC4KLQotCi0qKioqIE1FTU9SWSBMQVlPVVQgT0YgVEhFIFJFQUwtTU9ERSBDT0RFCi0KLVRoZSByZWFsLW1vZGUgY29kZSByZXF1aXJlcyBhIHN0YWNrL2hlYXAgdG8gYmUgc2V0IHVwLCBhcyB3ZWxsIGFzCi1tZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZQotaW4gdGhlIHJlYWwtbW9kZSBhY2Nlc3NpYmxlIG1lbW9yeSBpbiBib3R0b20gbWVnYWJ5dGUuCi0KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IG1vZGVybiBtYWNoaW5lcyBvZnRlbiBoYXZlIGEgc2l6YWJsZSBFeHRlbmRlZAotQklPUyBEYXRhIEFyZWEgKEVCREEpLiAgQXMgYSByZXN1bHQsIGl0IGlzIGFkdmlzYWJsZSB0byB1c2UgYXMgbGl0dGxlCi1vZiB0aGUgbG93IG1lZ2FieXRlIGFzIHBvc3NpYmxlLgotCi1VbmZvcnR1bmF0ZWx5LCB1bmRlciB0aGUgZm9sbG93aW5nIGNpcmN1bXN0YW5jZXMgdGhlIDB4OTAwMDAgbWVtb3J5Ci1zZWdtZW50IGhhcyB0byBiZSB1c2VkOgotCi0JLSBXaGVuIGxvYWRpbmcgYSB6SW1hZ2Uga2VybmVsICgobG9hZGZsYWdzICYgMHgwMSkgPT0gMCkuCi0JLSBXaGVuIGxvYWRpbmcgYSAyLjAxIG9yIGVhcmxpZXIgYm9vdCBwcm90b2NvbCBrZXJuZWwuCi0KLQkgIC0+IEZvciB0aGUgMi4wMCBhbmQgMi4wMSBib290IHByb3RvY29scywgdGhlIHJlYWwtbW9kZSBjb2RlCi0JICAgICBjYW4gYmUgbG9hZGVkIGF0IGFub3RoZXIgYWRkcmVzcywgYnV0IGl0IGlzIGludGVybmFsbHkKLQkgICAgIHJlbG9jYXRlZCB0byAweDkwMDAwLiAgRm9yIHRoZSAib2xkIiBwcm90b2NvbCwgdGhlCi0JICAgICByZWFsLW1vZGUgY29kZSBtdXN0IGJlIGxvYWRlZCBhdCAweDkwMDAwLgotCi1XaGVuIGxvYWRpbmcgYXQgMHg5MDAwMCwgYXZvaWQgdXNpbmcgbWVtb3J5IGFib3ZlIDB4OWEwMDAuCi0KLUZvciBib290IHByb3RvY29sIDIuMDIgb3IgaGlnaGVyLCB0aGUgY29tbWFuZCBsaW5lIGRvZXMgbm90IGhhdmUgdG8gYmUKLWxvY2F0ZWQgaW4gdGhlIHNhbWUgNjRLIHNlZ21lbnQgYXMgdGhlIHJlYWwtbW9kZSBzZXR1cCBjb2RlOyBpdCBpcwotdGh1cyBwZXJtaXR0ZWQgdG8gZ2l2ZSB0aGUgc3RhY2svaGVhcCB0aGUgZnVsbCA2NEsgc2VnbWVudCBhbmQgbG9jYXRlCi10aGUgY29tbWFuZCBsaW5lIGFib3ZlIGl0LgotCi1UaGUga2VybmVsIGNvbW1hbmQgbGluZSBzaG91bGQgbm90IGJlIGxvY2F0ZWQgYmVsb3cgdGhlIHJlYWwtbW9kZQotY29kZSwgbm9yIHNob3VsZCBpdCBiZSBsb2NhdGVkIGluIGhpZ2ggbWVtb3J5LgotCi0KLSoqKiogU0FNUExFIEJPT1QgQ09ORklHVVJBVElPTgotCi1BcyBhIHNhbXBsZSBjb25maWd1cmF0aW9uLCBhc3N1bWUgdGhlIGZvbGxvd2luZyBsYXlvdXQgb2YgdGhlIHJlYWwKLW1vZGUgc2VnbWVudDoKLQotICAgIFdoZW4gbG9hZGluZyBiZWxvdyAweDkwMDAwLCB1c2UgdGhlIGVudGlyZSBzZWdtZW50OgotCi0JMHgwMDAwLTB4N2ZmZglSZWFsIG1vZGUga2VybmVsCi0JMHg4MDAwLTB4ZGZmZglTdGFjayBhbmQgaGVhcAotCTB4ZTAwMC0weGZmZmYJS2VybmVsIGNvbW1hbmQgbGluZQotCi0gICAgV2hlbiBsb2FkaW5nIGF0IDB4OTAwMDAgT1IgdGhlIHByb3RvY29sIHZlcnNpb24gaXMgMi4wMSBvciBlYXJsaWVyOgotCi0JMHgwMDAwLTB4N2ZmZglSZWFsIG1vZGUga2VybmVsCi0JMHg4MDAwLTB4OTdmZglTdGFjayBhbmQgaGVhcAotCTB4OTgwMC0weDlmZmYJS2VybmVsIGNvbW1hbmQgbGluZQotCi1TdWNoIGEgYm9vdCBsb2FkZXIgc2hvdWxkIGVudGVyIHRoZSBmb2xsb3dpbmcgZmllbGRzIGluIHRoZSBoZWFkZXI6Ci0KLQl1bnNpZ25lZCBsb25nIGJhc2VfcHRyOwkvKiBiYXNlIGFkZHJlc3MgZm9yIHJlYWwtbW9kZSBzZWdtZW50ICovCi0KLQlpZiAoIHNldHVwX3NlY3RzID09IDAgKSB7Ci0JCXNldHVwX3NlY3RzID0gNDsKLQl9Ci0KLQlpZiAoIHByb3RvY29sID49IDB4MDIwMCApIHsKLQkJdHlwZV9vZl9sb2FkZXIgPSA8dHlwZSBjb2RlPjsKLQkJaWYgKCBsb2FkaW5nX2luaXRyZCApIHsKLQkJCXJhbWRpc2tfaW1hZ2UgPSA8aW5pdHJkX2FkZHJlc3M+OwotCQkJcmFtZGlza19zaXplID0gPGluaXRyZF9zaXplPjsKLQkJfQotCi0JCWlmICggcHJvdG9jb2wgPj0gMHgwMjAyICYmIGxvYWRmbGFncyAmIDB4MDEgKQotCQkJaGVhcF9lbmQgPSAweGUwMDA7Ci0JCWVsc2UKLQkJCWhlYXBfZW5kID0gMHg5ODAwOwotCi0JCWlmICggcHJvdG9jb2wgPj0gMHgwMjAxICkgewotCQkJaGVhcF9lbmRfcHRyID0gaGVhcF9lbmQgLSAweDIwMDsKLQkJCWxvYWRmbGFncyB8PSAweDgwOyAvKiBDQU5fVVNFX0hFQVAgKi8KLQkJfQotCi0JCWlmICggcHJvdG9jb2wgPj0gMHgwMjAyICkgewotCQkJY21kX2xpbmVfcHRyID0gYmFzZV9wdHIgKyBoZWFwX2VuZDsKLQkJCXN0cmNweShjbWRfbGluZV9wdHIsIGNtZGxpbmUpOwotCQl9IGVsc2UgewotCQkJY21kX2xpbmVfbWFnaWMJPSAweEEzM0Y7Ci0JCQljbWRfbGluZV9vZmZzZXQgPSBoZWFwX2VuZDsKLQkJCXNldHVwX21vdmVfc2l6ZSA9IGhlYXBfZW5kICsgc3RybGVuKGNtZGxpbmUpKzE7Ci0JCQlzdHJjcHkoYmFzZV9wdHIrY21kX2xpbmVfb2Zmc2V0LCBjbWRsaW5lKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFZlcnkgb2xkIGtlcm5lbCAqLwotCi0JCWhlYXBfZW5kID0gMHg5ODAwOwotCi0JCWNtZF9saW5lX21hZ2ljCT0gMHhBMzNGOwotCQljbWRfbGluZV9vZmZzZXQgPSBoZWFwX2VuZDsKLQotCQkvKiBBIHZlcnkgb2xkIGtlcm5lbCBNVVNUIGhhdmUgaXRzIHJlYWwtbW9kZSBjb2RlCi0JCSAgIGxvYWRlZCBhdCAweDkwMDAwICovCi0KLQkJaWYgKCBiYXNlX3B0ciAhPSAweDkwMDAwICkgewotCQkJLyogQ29weSB0aGUgcmVhbC1tb2RlIGtlcm5lbCAqLwotCQkJbWVtY3B5KDB4OTAwMDAsIGJhc2VfcHRyLCAoc2V0dXBfc2VjdHMrMSkqNTEyKTsKLQkJCWJhc2VfcHRyID0gMHg5MDAwMDsJCSAvKiBSZWxvY2F0ZWQgKi8KLQkJfQotCi0JCXN0cmNweSgweDkwMDAwK2NtZF9saW5lX29mZnNldCwgY21kbGluZSk7Ci0KLQkJLyogSXQgaXMgcmVjb21tZW5kZWQgdG8gY2xlYXIgbWVtb3J5IHVwIHRvIHRoZSAzMksgbWFyayAqLwotCQltZW1zZXQoMHg5MDAwMCArIChzZXR1cF9zZWN0cysxKSo1MTIsIDAsCi0JCSAgICAgICAoNjQtKHNldHVwX3NlY3RzKzEpKSo1MTIpOwotCX0KLQotCi0qKioqIExPQURJTkcgVEhFIFJFU1QgT0YgVEhFIEtFUk5FTAotCi1UaGUgMzItYml0IChub24tcmVhbC1tb2RlKSBrZXJuZWwgc3RhcnRzIGF0IG9mZnNldCAoc2V0dXBfc2VjdHMrMSkqNTEyCi1pbiB0aGUga2VybmVsIGZpbGUgKGFnYWluLCBpZiBzZXR1cF9zZWN0cyA9PSAwIHRoZSByZWFsIHZhbHVlIGlzIDQuKQotSXQgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzIDB4MTAwMDAgZm9yIEltYWdlL3pJbWFnZSBrZXJuZWxzIGFuZAotMHgxMDAwMDAgZm9yIGJ6SW1hZ2Uga2VybmVscy4KLQotVGhlIGtlcm5lbCBpcyBhIGJ6SW1hZ2Uga2VybmVsIGlmIHRoZSBwcm90b2NvbCA+PSAyLjAwIGFuZCB0aGUgMHgwMQotYml0IChMT0FEX0hJR0gpIGluIHRoZSBsb2FkZmxhZ3MgZmllbGQgaXMgc2V0OgotCi0JaXNfYnpJbWFnZSA9IChwcm90b2NvbCA+PSAweDAyMDApICYmIChsb2FkZmxhZ3MgJiAweDAxKTsKLQlsb2FkX2FkZHJlc3MgPSBpc19iekltYWdlID8gMHgxMDAwMDAgOiAweDEwMDAwOwotCi1Ob3RlIHRoYXQgSW1hZ2UvekltYWdlIGtlcm5lbHMgY2FuIGJlIHVwIHRvIDUxMksgaW4gc2l6ZSwgYW5kIHRodXMgdXNlCi10aGUgZW50aXJlIDB4MTAwMDAtMHg5MDAwMCByYW5nZSBvZiBtZW1vcnkuICBUaGlzIG1lYW5zIGl0IGlzIHByZXR0eQotbXVjaCBhIHJlcXVpcmVtZW50IGZvciB0aGVzZSBrZXJuZWxzIHRvIGxvYWQgdGhlIHJlYWwtbW9kZSBwYXJ0IGF0Ci0weDkwMDAwLiAgYnpJbWFnZSBrZXJuZWxzIGFsbG93IG11Y2ggbW9yZSBmbGV4aWJpbGl0eS4KLQotCi0qKioqIFNQRUNJQUwgQ09NTUFORCBMSU5FIE9QVElPTlMKLQotSWYgdGhlIGNvbW1hbmQgbGluZSBwcm92aWRlZCBieSB0aGUgYm9vdCBsb2FkZXIgaXMgZW50ZXJlZCBieSB0aGUKLXVzZXIsIHRoZSB1c2VyIG1heSBleHBlY3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byB3b3JrLgotVGhleSBzaG91bGQgbm9ybWFsbHkgbm90IGJlIGRlbGV0ZWQgZnJvbSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBldmVuCi10aG91Z2ggbm90IGFsbCBvZiB0aGVtIGFyZSBhY3R1YWxseSBtZWFuaW5nZnVsIHRvIHRoZSBrZXJuZWwuICBCb290Ci1sb2FkZXIgYXV0aG9ycyB3aG8gbmVlZCBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciB0aGUgYm9vdAotbG9hZGVyIGl0c2VsZiBzaG91bGQgZ2V0IHRoZW0gcmVnaXN0ZXJlZCBpbgotRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgdG8gbWFrZSBzdXJlIHRoZXkgd2lsbCBub3QKLWNvbmZsaWN0IHdpdGggYWN0dWFsIGtlcm5lbCBvcHRpb25zIG5vdyBvciBpbiB0aGUgZnV0dXJlLgotCi0gIHZnYT08bW9kZT4KLQk8bW9kZT4gaGVyZSBpcyBlaXRoZXIgYW4gaW50ZWdlciAoaW4gQyBub3RhdGlvbiwgZWl0aGVyCi0JZGVjaW1hbCwgb2N0YWwsIG9yIGhleGFkZWNpbWFsKSBvciBvbmUgb2YgdGhlIHN0cmluZ3MKLQkibm9ybWFsIiAobWVhbmluZyAweEZGRkYpLCAiZXh0IiAobWVhbmluZyAweEZGRkUpIG9yICJhc2siCi0JKG1lYW5pbmcgMHhGRkZEKS4gIFRoaXMgdmFsdWUgc2hvdWxkIGJlIGVudGVyZWQgaW50byB0aGUKLQl2aWRfbW9kZSBmaWVsZCwgYXMgaXQgaXMgdXNlZCBieSB0aGUga2VybmVsIGJlZm9yZSB0aGUgY29tbWFuZAotCWxpbmUgaXMgcGFyc2VkLgotCi0gIG1lbT08c2l6ZT4KLQk8c2l6ZT4gaXMgYW4gaW50ZWdlciBpbiBDIG5vdGF0aW9uIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkKLQkoY2FzZSBpbnNlbnNpdGl2ZSkgSywgTSwgRywgVCwgUCBvciBFIChtZWFuaW5nIDw8IDEwLCA8PCAyMCwKLQk8PCAzMCwgPDwgNDAsIDw8IDUwIG9yIDw8IDYwKS4gIFRoaXMgc3BlY2lmaWVzIHRoZSBlbmQgb2YKLQltZW1vcnkgdG8gdGhlIGtlcm5lbC4gVGhpcyBhZmZlY3RzIHRoZSBwb3NzaWJsZSBwbGFjZW1lbnQgb2YKLQlhbiBpbml0cmQsIHNpbmNlIGFuIGluaXRyZCBzaG91bGQgYmUgcGxhY2VkIG5lYXIgZW5kIG9mCi0JbWVtb3J5LiAgTm90ZSB0aGF0IHRoaXMgaXMgYW4gb3B0aW9uIHRvICpib3RoKiB0aGUga2VybmVsIGFuZAotCXRoZSBib290bG9hZGVyIQotCi0gIGluaXRyZD08ZmlsZT4KLQlBbiBpbml0cmQgc2hvdWxkIGJlIGxvYWRlZC4gIFRoZSBtZWFuaW5nIG9mIDxmaWxlPiBpcwotCW9idmlvdXNseSBib290bG9hZGVyLWRlcGVuZGVudCwgYW5kIHNvbWUgYm9vdCBsb2FkZXJzCi0JKGUuZy4gTElMTykgZG8gbm90IGhhdmUgc3VjaCBhIGNvbW1hbmQuCi0KLUluIGFkZGl0aW9uLCBzb21lIGJvb3QgbG9hZGVycyBhZGQgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIHRoZQotdXNlci1zcGVjaWZpZWQgY29tbWFuZCBsaW5lOgotCi0gIEJPT1RfSU1BR0U9PGZpbGU+Ci0JVGhlIGJvb3QgaW1hZ2Ugd2hpY2ggd2FzIGxvYWRlZC4gIEFnYWluLCB0aGUgbWVhbmluZyBvZiA8ZmlsZT4KLQlpcyBvYnZpb3VzbHkgYm9vdGxvYWRlci1kZXBlbmRlbnQuCi0KLSAgYXV0bwotCVRoZSBrZXJuZWwgd2FzIGJvb3RlZCB3aXRob3V0IGV4cGxpY2l0IHVzZXIgaW50ZXJ2ZW50aW9uLgotCi1JZiB0aGVzZSBvcHRpb25zIGFyZSBhZGRlZCBieSB0aGUgYm9vdCBsb2FkZXIsIGl0IGlzIGhpZ2hseQotcmVjb21tZW5kZWQgdGhhdCB0aGV5IGFyZSBsb2NhdGVkICpmaXJzdCosIGJlZm9yZSB0aGUgdXNlci1zcGVjaWZpZWQKLW9yIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWVkIGNvbW1hbmQgbGluZS4gIE90aGVyd2lzZSwgImluaXQ9L2Jpbi9zaCIKLWdldHMgY29uZnVzZWQgYnkgdGhlICJhdXRvIiBvcHRpb24uCi0KLQotKioqKiBSVU5OSU5HIFRIRSBLRVJORUwKLQotVGhlIGtlcm5lbCBpcyBzdGFydGVkIGJ5IGp1bXBpbmcgdG8gdGhlIGtlcm5lbCBlbnRyeSBwb2ludCwgd2hpY2ggaXMKLWxvY2F0ZWQgYXQgKnNlZ21lbnQqIG9mZnNldCAweDIwIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWFsIG1vZGUKLWtlcm5lbC4gIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgbG9hZGVkIHlvdXIgcmVhbC1tb2RlIGtlcm5lbCBjb2RlIGF0Ci0weDkwMDAwLCB0aGUga2VybmVsIGVudHJ5IHBvaW50IGlzIDkwMjA6MDAwMC4KLQotQXQgZW50cnksIGRzID0gZXMgPSBzcyBzaG91bGQgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWFsLW1vZGUKLWtlcm5lbCBjb2RlICgweDkwMDAgaWYgdGhlIGNvZGUgaXMgbG9hZGVkIGF0IDB4OTAwMDApLCBzcCBzaG91bGQgYmUKLXNldCB1cCBwcm9wZXJseSwgbm9ybWFsbHkgcG9pbnRpbmcgdG8gdGhlIHRvcCBvZiB0aGUgaGVhcCwgYW5kCi1pbnRlcnJ1cHRzIHNob3VsZCBiZSBkaXNhYmxlZC4gIEZ1cnRoZXJtb3JlLCB0byBndWFyZCBhZ2FpbnN0IGJ1Z3MgaW4KLXRoZSBrZXJuZWwsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGJvb3QgbG9hZGVyIHNldHMgZnMgPSBncyA9IGRzID0KLWVzID0gc3MuCi0KLUluIG91ciBleGFtcGxlIGZyb20gYWJvdmUsIHdlIHdvdWxkIGRvOgotCi0JLyogTm90ZTogaW4gdGhlIGNhc2Ugb2YgdGhlICJvbGQiIGtlcm5lbCBwcm90b2NvbCwgYmFzZV9wdHIgbXVzdAotCSAgIGJlID09IDB4OTAwMDAgYXQgdGhpcyBwb2ludDsgc2VlIHRoZSBwcmV2aW91cyBzYW1wbGUgY29kZSAqLwotCi0Jc2VnID0gYmFzZV9wdHIgPj4gNDsKLQotCWNsaSgpOwkvKiBFbnRlciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQhICovCi0KLQkvKiBTZXQgdXAgdGhlIHJlYWwtbW9kZSBrZXJuZWwgc3RhY2sgKi8KLQlfU1MgPSBzZWc7Ci0JX1NQID0gaGVhcF9lbmQ7Ci0KLQlfRFMgPSBfRVMgPSBfRlMgPSBfR1MgPSBzZWc7Ci0Jam1wX2ZhcihzZWcrMHgyMCwgMCk7CS8qIFJ1biB0aGUga2VybmVsICovCi0KLUlmIHlvdXIgYm9vdCBzZWN0b3IgYWNjZXNzZXMgYSBmbG9wcHkgZHJpdmUsIGl0IGlzIHJlY29tbWVuZGVkIHRvCi1zd2l0Y2ggb2ZmIHRoZSBmbG9wcHkgbW90b3IgYmVmb3JlIHJ1bm5pbmcgdGhlIGtlcm5lbCwgc2luY2UgdGhlCi1rZXJuZWwgYm9vdCBsZWF2ZXMgaW50ZXJydXB0cyBvZmYgYW5kIHRodXMgdGhlIG1vdG9yIHdpbGwgbm90IGJlCi1zd2l0Y2hlZCBvZmYsIGVzcGVjaWFsbHkgaWYgdGhlIGxvYWRlZCBrZXJuZWwgaGFzIHRoZSBmbG9wcHkgZHJpdmVyIGFzCi1hIGRlbWFuZC1sb2FkZWQgbW9kdWxlIQotCi0KLSoqKiogQURWQU5DRUQgQk9PVCBMT0FERVIgSE9PS1MKLQotSWYgdGhlIGJvb3QgbG9hZGVyIHJ1bnMgaW4gYSBwYXJ0aWN1bGFybHkgaG9zdGlsZSBlbnZpcm9ubWVudCAoc3VjaCBhcwotTE9BRExJTiwgd2hpY2ggcnVucyB1bmRlciBET1MpIGl0IG1heSBiZSBpbXBvc3NpYmxlIHRvIGZvbGxvdyB0aGUKLXN0YW5kYXJkIG1lbW9yeSBsb2NhdGlvbiByZXF1aXJlbWVudHMuICBTdWNoIGEgYm9vdCBsb2FkZXIgbWF5IHVzZSB0aGUKLWZvbGxvd2luZyBob29rcyB0aGF0LCBpZiBzZXQsIGFyZSBpbnZva2VkIGJ5IHRoZSBrZXJuZWwgYXQgdGhlCi1hcHByb3ByaWF0ZSB0aW1lLiAgVGhlIHVzZSBvZiB0aGVzZSBob29rcyBzaG91bGQgcHJvYmFibHkgYmUKLWNvbnNpZGVyZWQgYW4gYWJzb2x1dGVseSBsYXN0IHJlc29ydCEKLQotSU1QT1JUQU5UOiBBbGwgdGhlIGhvb2tzIGFyZSByZXF1aXJlZCB0byBwcmVzZXJ2ZSAlZXNwLCAlZWJwLCAlZXNpIGFuZAotJWVkaSBhY3Jvc3MgaW52b2NhdGlvbi4KLQotICByZWFsbW9kZV9zd3RjaDoKLQlBIDE2LWJpdCByZWFsIG1vZGUgZmFyIHN1YnJvdXRpbmUgaW52b2tlZCBpbW1lZGlhdGVseSBiZWZvcmUKLQllbnRlcmluZyBwcm90ZWN0ZWQgbW9kZS4gIFRoZSBkZWZhdWx0IHJvdXRpbmUgZGlzYWJsZXMgTk1JLCBzbwotCXlvdXIgcm91dGluZSBzaG91bGQgcHJvYmFibHkgZG8gc28sIHRvby4KLQotICBjb2RlMzJfc3RhcnQ6Ci0JQSAzMi1iaXQgZmxhdC1tb2RlIHJvdXRpbmUgKmp1bXBlZCogdG8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi0JdHJhbnNpdGlvbiB0byBwcm90ZWN0ZWQgbW9kZSwgYnV0IGJlZm9yZSB0aGUga2VybmVsIGlzCi0JdW5jb21wcmVzc2VkLiAgTm8gc2VnbWVudHMsIGV4Y2VwdCBDUywgYXJlIGd1YXJhbnRlZWQgdG8gYmUKLQlzZXQgdXAgKGN1cnJlbnQga2VybmVscyBkbywgYnV0IG9sZGVyIG9uZXMgZG8gbm90KTsgeW91IHNob3VsZAotCXNldCB0aGVtIHVwIHRvIEJPT1RfRFMgKDB4MTgpIHlvdXJzZWxmLgotCi0JQWZ0ZXIgY29tcGxldGluZyB5b3VyIGhvb2ssIHlvdSBzaG91bGQganVtcCB0byB0aGUgYWRkcmVzcwotCXRoYXQgd2FzIGluIHRoaXMgZmllbGQgYmVmb3JlIHlvdXIgYm9vdCBsb2FkZXIgb3Zlcndyb3RlIGl0Ci0JKHJlbG9jYXRlZCwgaWYgYXBwcm9wcmlhdGUuKQotCi0KLSoqKiogMzItYml0IEJPT1QgUFJPVE9DT0wKLQotRm9yIG1hY2hpbmUgd2l0aCBzb21lIG5ldyBCSU9TIG90aGVyIHRoYW4gbGVnYWN5IEJJT1MsIHN1Y2ggYXMgRUZJLAotTGludXhCSU9TLCBldGMsIGFuZCBrZXhlYywgdGhlIDE2LWJpdCByZWFsIG1vZGUgc2V0dXAgY29kZSBpbiBrZXJuZWwKLWJhc2VkIG9uIGxlZ2FjeSBCSU9TIGNhbiBub3QgYmUgdXNlZCwgc28gYSAzMi1iaXQgYm9vdCBwcm90b2NvbCBuZWVkcwotdG8gYmUgZGVmaW5lZC4KLQotSW4gMzItYml0IGJvb3QgcHJvdG9jb2wsIHRoZSBmaXJzdCBzdGVwIGluIGxvYWRpbmcgYSBMaW51eCBrZXJuZWwKLXNob3VsZCBiZSB0byBzZXR1cCB0aGUgYm9vdCBwYXJhbWV0ZXJzIChzdHJ1Y3QgYm9vdF9wYXJhbXMsCi10cmFkaXRpb25hbGx5IGtub3duIGFzICJ6ZXJvIHBhZ2UiKS4gVGhlIG1lbW9yeSBmb3Igc3RydWN0IGJvb3RfcGFyYW1zCi1zaG91bGQgYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCB0byBhbGwgemVyby4gVGhlbiB0aGUgc2V0dXAgaGVhZGVyCi1mcm9tIG9mZnNldCAweDAxZjEgb2Yga2VybmVsIGltYWdlIG9uIHNob3VsZCBiZSBsb2FkZWQgaW50byBzdHJ1Y3QKLWJvb3RfcGFyYW1zIGFuZCBleGFtaW5lZC4gVGhlIGVuZCBvZiBzZXR1cCBoZWFkZXIgY2FuIGJlIGNhbGN1bGF0ZWQgYXMKLWZvbGxvdzoKLQotCTB4MDIwMiArIGJ5dGUgdmFsdWUgYXQgb2Zmc2V0IDB4MDIwMQotCi1JbiBhZGRpdGlvbiB0byByZWFkL21vZGlmeS93cml0ZSB0aGUgc2V0dXAgaGVhZGVyIG9mIHRoZSBzdHJ1Y3QKLWJvb3RfcGFyYW1zIGFzIHRoYXQgb2YgMTYtYml0IGJvb3QgcHJvdG9jb2wsIHRoZSBib290IGxvYWRlciBzaG91bGQKLWFsc28gZmlsbCB0aGUgYWRkaXRpb25hbCBmaWVsZHMgb2YgdGhlIHN0cnVjdCBib290X3BhcmFtcyBhcyB0aGF0Ci1kZXNjcmliZWQgaW4gemVyby1wYWdlLnR4dC4KLQotQWZ0ZXIgc2V0dXBwaW5nIHRoZSBzdHJ1Y3QgYm9vdF9wYXJhbXMsIHRoZSBib290IGxvYWRlciBjYW4gbG9hZCB0aGUKLTMyLzY0LWJpdCBrZXJuZWwgaW4gdGhlIHNhbWUgd2F5IGFzIHRoYXQgb2YgMTYtYml0IGJvb3QgcHJvdG9jb2wuCi0KLUluIDMyLWJpdCBib290IHByb3RvY29sLCB0aGUga2VybmVsIGlzIHN0YXJ0ZWQgYnkganVtcGluZyB0byB0aGUKLTMyLWJpdCBrZXJuZWwgZW50cnkgcG9pbnQsIHdoaWNoIGlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIGxvYWRlZAotMzIvNjQtYml0IGtlcm5lbC4KLQotQXQgZW50cnksIHRoZSBDUFUgbXVzdCBiZSBpbiAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgd2l0aCBwYWdpbmcKLWRpc2FibGVkOyBhIEdEVCBtdXN0IGJlIGxvYWRlZCB3aXRoIHRoZSBkZXNjcmlwdG9ycyBmb3Igc2VsZWN0b3JzCi1fX0JPT1RfQ1MoMHgxMCkgYW5kIF9fQk9PVF9EUygweDE4KTsgYm90aCBkZXNjcmlwdG9ycyBtdXN0IGJlIDRHIGZsYXQKLXNlZ21lbnQ7IF9fQk9PU19DUyBtdXN0IGhhdmUgZXhlY3V0ZS9yZWFkIHBlcm1pc3Npb24sIGFuZCBfX0JPT1RfRFMKLW11c3QgaGF2ZSByZWFkL3dyaXRlIHBlcm1pc3Npb247IENTIG11c3QgYmUgX19CT09UX0NTIGFuZCBEUywgRVMsIFNTCi1tdXN0IGJlIF9fQk9PVF9EUzsgaW50ZXJydXB0IG11c3QgYmUgZGlzYWJsZWQ7ICVlc2kgbXVzdCBob2xkIHRoZSBiYXNlCi1hZGRyZXNzIG9mIHRoZSBzdHJ1Y3QgYm9vdF9wYXJhbXM7ICVlYnAsICVlZGkgYW5kICVlYnggbXVzdCBiZSB6ZXJvLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvbXRyci50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni9tdHJyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA3MWRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvbXRyci50eHQKQEAgLTAsMCArMSwzMDUgQEAKK01UUlIgKE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyKSBjb250cm9sCiszIEp1biAxOTk5CitSaWNoYXJkIEdvb2NoCis8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisKKyAgT24gSW50ZWwgUDYgZmFtaWx5IHByb2Nlc3NvcnMgKFBlbnRpdW0gUHJvLCBQZW50aXVtIElJIGFuZCBsYXRlcikKKyAgdGhlIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyAoTVRSUnMpIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wKKyAgcHJvY2Vzc29yIGFjY2VzcyB0byBtZW1vcnkgcmFuZ2VzLiBUaGlzIGlzIG1vc3QgdXNlZnVsIHdoZW4geW91IGhhdmUKKyAgYSB2aWRlbyAoVkdBKSBjYXJkIG9uIGEgUENJIG9yIEFHUCBidXMuIEVuYWJsaW5nIHdyaXRlLWNvbWJpbmluZworICBhbGxvd3MgYnVzIHdyaXRlIHRyYW5zZmVycyB0byBiZSBjb21iaW5lZCBpbnRvIGEgbGFyZ2VyIHRyYW5zZmVyCisgIGJlZm9yZSBidXJzdGluZyBvdmVyIHRoZSBQQ0kvQUdQIGJ1cy4gVGhpcyBjYW4gaW5jcmVhc2UgcGVyZm9ybWFuY2UKKyAgb2YgaW1hZ2Ugd3JpdGUgb3BlcmF0aW9ucyAyLjUgdGltZXMgb3IgbW9yZS4KKworICBUaGUgQ3lyaXggNng4NiwgNng4Nk1YIGFuZCBNIElJIHByb2Nlc3NvcnMgaGF2ZSBBZGRyZXNzIFJhbmdlCisgIFJlZ2lzdGVycyAoQVJScykgd2hpY2ggcHJvdmlkZSBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSB0byBNVFJScy4gRm9yCisgIHRoZXNlLCB0aGUgQVJScyBhcmUgdXNlZCB0byBlbXVsYXRlIHRoZSBNVFJScy4KKworICBUaGUgQU1EIEs2LTIgKHN0ZXBwaW5nIDggYW5kIGFib3ZlKSBhbmQgSzYtMyBwcm9jZXNzb3JzIGhhdmUgdHdvCisgIE1UUlJzLiBUaGVzZSBhcmUgc3VwcG9ydGVkLiAgVGhlIEFNRCBBdGhsb24gZmFtaWx5IHByb3ZpZGUgOCBJbnRlbAorICBzdHlsZSBNVFJScy4KKworICBUaGUgQ2VudGF1ciBDNiAoV2luQ2hpcCkgaGFzIDggTUNScywgYWxsb3dpbmcgd3JpdGUtY29tYmluaW5nLiBUaGVzZQorICBhcmUgc3VwcG9ydGVkLgorCisgIFRoZSBWSUEgQ3lyaXggSUlJIGFuZCBWSUEgQzMgQ1BVcyBvZmZlciA4IEludGVsIHN0eWxlIE1UUlJzLgorCisgIFRoZSBDT05GSUdfTVRSUiBvcHRpb24gY3JlYXRlcyBhIC9wcm9jL210cnIgZmlsZSB3aGljaCBtYXkgYmUgdXNlZAorICB0byBtYW5pcHVsYXRlIHlvdXIgTVRSUnMuIFR5cGljYWxseSB0aGUgWCBzZXJ2ZXIgc2hvdWxkIHVzZQorICB0aGlzLiBUaGlzIHNob3VsZCBoYXZlIGEgcmVhc29uYWJseSBnZW5lcmljIGludGVyZmFjZSBzbyB0aGF0CisgIHNpbWlsYXIgY29udHJvbCByZWdpc3RlcnMgb24gb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgZWFzaWx5CisgIHN1cHBvcnRlZC4KKworCitUaGVyZSBhcmUgdHdvIGludGVyZmFjZXMgdG8gL3Byb2MvbXRycjogb25lIGlzIGFuIEFTQ0lJIGludGVyZmFjZQord2hpY2ggYWxsb3dzIHlvdSB0byByZWFkIGFuZCB3cml0ZS4gVGhlIG90aGVyIGlzIGFuIGlvY3RsKCkKK2ludGVyZmFjZS4gVGhlIEFTQ0lJIGludGVyZmFjZSBpcyBtZWFudCBmb3IgYWRtaW5pc3RyYXRpb24uIFRoZQoraW9jdGwoKSBpbnRlcmZhY2UgaXMgbWVhbnQgZm9yIEMgcHJvZ3JhbXMgKGkuZS4gdGhlIFggc2VydmVyKS4gVGhlCitpbnRlcmZhY2VzIGFyZSBkZXNjcmliZWQgYmVsb3csIHdpdGggc2FtcGxlIGNvbW1hbmRzIGFuZCBDIGNvZGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JlYWRpbmcgTVRSUnMgZnJvbSB0aGUgc2hlbGw6CisKKyUgY2F0IC9wcm9jL210cnIKK3JlZzAwOiBiYXNlPTB4MDAwMDAwMDAgKCAgIDBNQiksIHNpemU9IDEyOE1COiB3cml0ZS1iYWNrLCBjb3VudD0xCityZWcwMTogYmFzZT0weDA4MDAwMDAwICggMTI4TUIpLCBzaXplPSAgNjRNQjogd3JpdGUtYmFjaywgY291bnQ9MQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ3JlYXRpbmcgTVRSUnMgZnJvbSB0aGUgQy1zaGVsbDoKKyMgZWNobyAiYmFzZT0weGY4MDAwMDAwIHNpemU9MHg0MDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID4hIC9wcm9jL210cnIKK29yIGlmIHlvdSB1c2UgYmFzaDoKKyMgZWNobyAiYmFzZT0weGY4MDAwMDAwIHNpemU9MHg0MDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID58IC9wcm9jL210cnIKKworQW5kIHRoZSByZXN1bHQgdGhlcmVvZjoKKyUgY2F0IC9wcm9jL210cnIKK3JlZzAwOiBiYXNlPTB4MDAwMDAwMDAgKCAgIDBNQiksIHNpemU9IDEyOE1COiB3cml0ZS1iYWNrLCBjb3VudD0xCityZWcwMTogYmFzZT0weDA4MDAwMDAwICggMTI4TUIpLCBzaXplPSAgNjRNQjogd3JpdGUtYmFjaywgY291bnQ9MQorcmVnMDI6IGJhc2U9MHhmODAwMDAwMCAoMzk2OE1CKSwgc2l6ZT0gICA0TUI6IHdyaXRlLWNvbWJpbmluZywgY291bnQ9MQorCitUaGlzIGlzIGZvciB2aWRlbyBSQU0gYXQgYmFzZSBhZGRyZXNzIDB4ZjgwMDAwMDAgYW5kIHNpemUgNCBtZWdhYnl0ZXMuIFRvCitmaW5kIG91dCB5b3VyIGJhc2UgYWRkcmVzcywgeW91IG5lZWQgdG8gbG9vayBhdCB0aGUgb3V0cHV0IG9mIHlvdXIgWAorc2VydmVyLCB3aGljaCB0ZWxscyB5b3Ugd2hlcmUgdGhlIGxpbmVhciBmcmFtZWJ1ZmZlciBhZGRyZXNzIGlzLiBBCit0eXBpY2FsIGxpbmUgdGhhdCB5b3UgbWF5IGdldCBpczoKKworKC0tKSBTMzogUENJOiA5NjggcmV2IDAsIExpbmVhciBGQiBAIDB4ZjgwMDAwMDAKKworTm90ZSB0aGF0IHlvdSBzaG91bGQgb25seSB1c2UgdGhlIHZhbHVlIGZyb20gdGhlIFggc2VydmVyLCBhcyBpdCBtYXkKK21vdmUgdGhlIGZyYW1lYnVmZmVyIGJhc2UgYWRkcmVzcywgc28gdGhlIG9ubHkgdmFsdWUgeW91IGNhbiB0cnVzdCBpcwordGhhdCByZXBvcnRlZCBieSB0aGUgWCBzZXJ2ZXIuCisKK1RvIGZpbmQgb3V0IHRoZSBzaXplIG9mIHlvdXIgZnJhbWVidWZmZXIgKHdoYXQsIHlvdSBkb24ndCBhY3R1YWxseQora25vdz8pLCB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCB0ZWxsIHlvdToKKworKC0tKSBTMzogdmlkZW9yYW06ICA0MDk2aworCitUaGF0J3MgNCBtZWdhYnl0ZXMsIHdoaWNoIGlzIDB4NDAwMDAwIGJ5dGVzIChpbiBoZXhhZGVjaW1hbCkuCitBIHBhdGNoIGlzIGJlaW5nIHdyaXR0ZW4gZm9yIFhGcmVlODYgd2hpY2ggd2lsbCBtYWtlIHRoaXMgYXV0b21hdGljOgoraW4gb3RoZXIgd29yZHMgdGhlIFggc2VydmVyIHdpbGwgbWFuaXB1bGF0ZSAvcHJvYy9tdHJyIHVzaW5nIHRoZQoraW9jdGwoKSBpbnRlcmZhY2UsIHNvIHVzZXJzIHdvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuIElmIHlvdSB1c2UgYQorY29tbWVyY2lhbCBYIHNlcnZlciwgbG9iYnkgeW91ciB2ZW5kb3IgdG8gYWRkIHN1cHBvcnQgZm9yIE1UUlJzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ3JlYXRpbmcgb3ZlcmxhcHBpbmcgTVRSUnM6CisKKyVlY2hvICJiYXNlPTB4ZmIwMDAwMDAgc2l6ZT0weDEwMDAwMDAgdHlwZT13cml0ZS1jb21iaW5pbmciID4vcHJvYy9tdHJyCislZWNobyAiYmFzZT0weGZiMDAwMDAwIHNpemU9MHgxMDAwIHR5cGU9dW5jYWNoYWJsZSIgPi9wcm9jL210cnIKKworQW5kIHRoZSByZXN1bHRzOiBjYXQgL3Byb2MvbXRycgorcmVnMDA6IGJhc2U9MHgwMDAwMDAwMCAoICAgME1CKSwgc2l6ZT0gIDY0TUI6IHdyaXRlLWJhY2ssIGNvdW50PTEKK3JlZzAxOiBiYXNlPTB4ZmIwMDAwMDAgKDQwMTZNQiksIHNpemU9ICAxNk1COiB3cml0ZS1jb21iaW5pbmcsIGNvdW50PTEKK3JlZzAyOiBiYXNlPTB4ZmIwMDAwMDAgKDQwMTZNQiksIHNpemU9ICAgNGtCOiB1bmNhY2hhYmxlLCBjb3VudD0xCisKK1NvbWUgY2FyZHMgKGVzcGVjaWFsbHkgVm9vZG9vIEdyYXBoaWNzIGJvYXJkcykgbmVlZCB0aGlzIDQga0IgYXJlYQorZXhjbHVkZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24gYmVjYXVzZSBpdCBpcyB1c2VkIGZvcgorcmVnaXN0ZXJzLgorCitOT1RFOiBZb3UgY2FuIG9ubHkgY3JlYXRlIHR5cGU9dW5jYWNoYWJsZSByZWdpb24sIGlmIHRoZSBmaXJzdAorcmVnaW9uIHRoYXQgeW91IGNyZWF0ZWQgaXMgdHlwZT13cml0ZS1jb21iaW5pbmcuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZW1vdmluZyBNVFJScyBmcm9tIHRoZSBDLXNoZWxsOgorJSBlY2hvICJkaXNhYmxlPTIiID4hIC9wcm9jL210cnIKK29yIHVzaW5nIGJhc2g6CislIGVjaG8gImRpc2FibGU9MiIgPnwgL3Byb2MvbXRycgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUmVhZGluZyBNVFJScyBmcm9tIGEgQyBwcm9ncmFtIHVzaW5nIGlvY3RsKCknczoKKworLyogIG10cnItc2hvdy5jCisKKyAgICBTb3VyY2UgZmlsZSBmb3IgbXRyci1zaG93IChleGFtcGxlIHByb2dyYW0gdG8gc2hvdyBNVFJScyB1c2luZyBpb2N0bCgpJ3MpCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OCAgUmljaGFyZCBHb29jaAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQorICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKKyAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCisqLworCisvKgorICAgIFRoaXMgcHJvZ3JhbSB3aWxsIHVzZSBhbiBpb2N0bCgpIG9uIC9wcm9jL210cnIgdG8gc2hvdyB0aGUgY3VycmVudCBNVFJSCisgICAgc2V0dGluZ3MuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gcmVhZGluZyAvcHJvYy9tdHJyLgorCisKKyAgICBXcml0dGVuIGJ5ICAgICAgUmljaGFyZCBHb29jaCAgIDE3LURFQy0xOTk3CisKKyAgICBMYXN0IHVwZGF0ZWQgYnkgUmljaGFyZCBHb29jaCAgIDItTUFZLTE5OTgKKworCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBFUlJTVFJJTkcgc3RyZXJyb3IgKGVycm5vKQorCitzdGF0aWMgY2hhciAqbXRycl9zdHJpbmdzW01UUlJfTlVNX1RZUEVTXSA9Cit7CisgICAgInVuY2FjaGFibGUiLCAgICAgICAgICAgICAgIC8qIDAgKi8KKyAgICAid3JpdGUtY29tYmluaW5nIiwgICAgICAgICAgLyogMSAqLworICAgICI/IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCisgICAgIj8iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMgKi8KKyAgICAid3JpdGUtdGhyb3VnaCIsICAgICAgICAgICAgLyogNCAqLworICAgICJ3cml0ZS1wcm90ZWN0IiwgICAgICAgICAgICAvKiA1ICovCisgICAgIndyaXRlLWJhY2siLCAgICAgICAgICAgICAgIC8qIDYgKi8KK307CisKK2ludCBtYWluICgpCit7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBtdHJyX2dlbnRyeSBnZW50cnk7CisKKyAgICBpZiAoICggZmQgPSBvcGVuICgiL3Byb2MvbXRyciIsIE9fUkRPTkxZLCAwKSApID09IC0xICkKKyAgICB7CisJaWYgKGVycm5vID09IEVOT0VOVCkKKwl7CisJICAgIGZwdXRzICgiL3Byb2MvbXRyciBub3QgZm91bmQ6IG5vdCBzdXBwb3J0ZWQgb3IgeW91IGRvbid0IGhhdmUgYSBQUHJvP1xuIiwKKwkJICAgc3RkZXJyKTsKKwkgICAgZXhpdCAoMSk7CisJfQorCWZwcmludGYgKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgL3Byb2MvbXRyclx0JXNcbiIsIEVSUlNUUklORyk7CisJZXhpdCAoMik7CisgICAgfQorICAgIGZvciAoZ2VudHJ5LnJlZ251bSA9IDA7IGlvY3RsIChmZCwgTVRSUklPQ19HRVRfRU5UUlksICZnZW50cnkpID09IDA7CisJICsrZ2VudHJ5LnJlZ251bSkKKyAgICB7CisJaWYgKGdlbnRyeS5zaXplIDwgMSkKKwl7CisJICAgIGZwcmludGYgKHN0ZGVyciwgIlJlZ2lzdGVyOiAldSBkaXNhYmxlZFxuIiwgZ2VudHJ5LnJlZ251bSk7CisJICAgIGNvbnRpbnVlOworCX0KKwlmcHJpbnRmIChzdGRlcnIsICJSZWdpc3RlcjogJXUgYmFzZTogMHglbHggc2l6ZTogMHglbHggdHlwZTogJXNcbiIsCisJCSBnZW50cnkucmVnbnVtLCBnZW50cnkuYmFzZSwgZ2VudHJ5LnNpemUsCisJCSBtdHJyX3N0cmluZ3NbZ2VudHJ5LnR5cGVdKTsKKyAgICB9CisgICAgaWYgKGVycm5vID09IEVJTlZBTCkgZXhpdCAoMCk7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgZG9pbmcgaW9jdGwoMikgb24gL2Rldi9tdHJyXHQlc1xuIiwgRVJSU1RSSU5HKTsKKyAgICBleGl0ICgzKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIG1haW4gICovCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDcmVhdGluZyBNVFJScyBmcm9tIGEgQyBwcm9ncmFtbWUgdXNpbmcgaW9jdGwoKSdzOgorCisvKiAgbXRyci1hZGQuYworCisgICAgU291cmNlIGZpbGUgZm9yIG10cnItYWRkIChleGFtcGxlIHByb2dyYW1tZSB0byBhZGQgYW4gTVRSUnMgdXNpbmcgaW9jdGwoKSkKKworICAgIENvcHlyaWdodCAoQykgMTk5Ny0xOTk4ICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKyovCisKKy8qCisgICAgVGhpcyBwcm9ncmFtbWUgd2lsbCB1c2UgYW4gaW9jdGwoKSBvbiAvcHJvYy9tdHJyIHRvIGFkZCBhbiBlbnRyeS4gVGhlIGZpcnN0CisgICAgYXZhaWxhYmxlIG10cnIgaXMgdXNlZC4gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB3cml0aW5nIC9wcm9jL210cnIuCisKKworICAgIFdyaXR0ZW4gYnkgICAgICBSaWNoYXJkIEdvb2NoICAgMTctREVDLTE5OTcKKworICAgIExhc3QgdXBkYXRlZCBieSBSaWNoYXJkIEdvb2NoICAgMi1NQVktMTk5OAorCisKKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIEVSUlNUUklORyBzdHJlcnJvciAoZXJybm8pCisKK3N0YXRpYyBjaGFyICptdHJyX3N0cmluZ3NbTVRSUl9OVU1fVFlQRVNdID0KK3sKKyAgICAidW5jYWNoYWJsZSIsICAgICAgICAgICAgICAgLyogMCAqLworICAgICJ3cml0ZS1jb21iaW5pbmciLCAgICAgICAgICAvKiAxICovCisgICAgIj8iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKyAgICAiPyIsICAgICAgICAgICAgICAgICAgICAgICAgLyogMyAqLworICAgICJ3cml0ZS10aHJvdWdoIiwgICAgICAgICAgICAvKiA0ICovCisgICAgIndyaXRlLXByb3RlY3QiLCAgICAgICAgICAgIC8qIDUgKi8KKyAgICAid3JpdGUtYmFjayIsICAgICAgICAgICAgICAgLyogNiAqLworfTsKKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IG10cnJfc2VudHJ5IHNlbnRyeTsKKworICAgIGlmIChhcmdjICE9IDQpCisgICAgeworCWZwcmludGYgKHN0ZGVyciwgIlVzYWdlOlx0bXRyci1hZGQgYmFzZSBzaXplIHR5cGVcbiIpOworCWV4aXQgKDEpOworICAgIH0KKyAgICBzZW50cnkuYmFzZSA9IHN0cnRvdWwgKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgIHNlbnRyeS5zaXplID0gc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMCk7CisgICAgZm9yIChzZW50cnkudHlwZSA9IDA7IHNlbnRyeS50eXBlIDwgTVRSUl9OVU1fVFlQRVM7ICsrc2VudHJ5LnR5cGUpCisgICAgeworCWlmIChzdHJjbXAgKGFyZ3ZbM10sIG10cnJfc3RyaW5nc1tzZW50cnkudHlwZV0pID09IDApIGJyZWFrOworICAgIH0KKyAgICBpZiAoc2VudHJ5LnR5cGUgPj0gTVRSUl9OVU1fVFlQRVMpCisgICAgeworCWZwcmludGYgKHN0ZGVyciwgIklsbGVnYWwgdHlwZTogXCIlc1wiXG4iLCBhcmd2WzNdKTsKKwlleGl0ICgyKTsKKyAgICB9CisgICAgaWYgKCAoIGZkID0gb3BlbiAoIi9wcm9jL210cnIiLCBPX1dST05MWSwgMCkgKSA9PSAtMSApCisgICAgeworCWlmIChlcnJubyA9PSBFTk9FTlQpCisJeworCSAgICBmcHV0cyAoIi9wcm9jL210cnIgbm90IGZvdW5kOiBub3Qgc3VwcG9ydGVkIG9yIHlvdSBkb24ndCBoYXZlIGEgUFBybz9cbiIsCisJCSAgIHN0ZGVycik7CisJICAgIGV4aXQgKDMpOworCX0KKwlmcHJpbnRmIChzdGRlcnIsICJFcnJvciBvcGVuaW5nIC9wcm9jL210cnJcdCVzXG4iLCBFUlJTVFJJTkcpOworCWV4aXQgKDQpOworICAgIH0KKyAgICBpZiAoaW9jdGwgKGZkLCBNVFJSSU9DX0FERF9FTlRSWSwgJnNlbnRyeSkgPT0gLTEpCisgICAgeworCWZwcmludGYgKHN0ZGVyciwgIkVycm9yIGRvaW5nIGlvY3RsKDIpIG9uIC9kZXYvbXRyclx0JXNcbiIsIEVSUlNUUklORyk7CisJZXhpdCAoNSk7CisgICAgfQorICAgIGZwcmludGYgKHN0ZGVyciwgIlNsZWVwaW5nIGZvciA1IHNlY29uZHMgc28geW91IGNhbiBzZWUgdGhlIG5ldyBlbnRyeVxuIik7CisgICAgc2xlZXAgKDUpOworICAgIGNsb3NlIChmZCk7CisgICAgZnB1dHMgKCJJJ3ZlIGp1c3QgY2xvc2VkIC9wcm9jL210cnIgc28gbm93IHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGdvbmVcbiIsCisJICAgc3RkZXJyKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIG1haW4gICovCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9wYXQudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvcGF0LnR4dAppbmRleCAxNzk2NWY5Li5jOTNmZjVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9wYXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3BhdC50eHQKQEAgLTE0LDYgKzE0LDEwIEBACiBvbmVzIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lIGFyZSBXcml0ZS1iYWNrLCBVbmNhY2hlZCwKIFdyaXRlLWNvbWJpbmVkIGFuZCBVbmNhY2hlZCBNaW51cy4KIAorCitQQVQgQVBJcworLS0tLS0tLS0KKwogVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IEFQSXMgaW4gdGhlIGtlcm5lbCB0aGF0IGFsbG93cyBzZXR0aW5nIG9mIG1lbW9yeQogYXR0cmlidXRlcyBhdCB0aGUgcGFnZSBsZXZlbC4gSW4gb3JkZXIgdG8gYXZvaWQgYWxpYXNpbmcsIHRoZXNlIGludGVyZmFjZXMKIHNob3VsZCBiZSB1c2VkIHRob3VnaHRmdWxseS4gQmVsb3cgaXMgYSB0YWJsZSBvZiBpbnRlcmZhY2VzIGF2YWlsYWJsZSwKQEAgLTI2LDM4ICszMCwzOCBAQAogQVBJICAgICAgICAgICAgICAgICAgICB8ICAgIFJBTSAgIHwgIEFDUEksLi4uICB8ICBSZXNlcnZlZC9Ib2xlcyAgfAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotaW9yZW1hcCAgICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMgICAgICB8ICAgICAgIFVDICAgICAgICAgfAoraW9yZW1hcCAgICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMtICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogaW9yZW1hcF9jYWNoZSAgICAgICAgICB8ICAgIC0tICAgIHwgICAgV0IgICAgICB8ICAgICAgIFdCICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotaW9yZW1hcF9ub2NhY2hlICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMgICAgICB8ICAgICAgIFVDICAgICAgICAgfAoraW9yZW1hcF9ub2NhY2hlICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMtICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogaW9yZW1hcF93YyAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFdDICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotc2V0X21lbW9yeV91YyAgICAgICAgICB8ICAgIFVDICAgIHwgICAgLS0gICAgICB8ICAgICAgIC0tICAgICAgICAgfAorc2V0X21lbW9yeV91YyAgICAgICAgICB8ICAgIFVDLSAgIHwgICAgLS0gICAgICB8ICAgICAgIC0tICAgICAgICAgfAogIHNldF9tZW1vcnlfd2IgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogc2V0X21lbW9yeV93YyAgICAgICAgICB8ICAgIFdDICAgIHwgICAgLS0gICAgICB8ICAgICAgIC0tICAgICAgICAgfAogIHNldF9tZW1vcnlfd2IgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotcGNpIHN5c2ZzIHJlc291cmNlICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFVDICAgICAgICAgfAorcGNpIHN5c2ZzIHJlc291cmNlICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogcGNpIHN5c2ZzIHJlc291cmNlX3djICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFdDICAgICAgICAgfAogIGlzIElPUkVTT1VSQ0VfUFJFRkVUQ0h8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotcGNpIHByb2MgICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFVDICAgICAgICAgfAorcGNpIHByb2MgICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogICFQQ0lJT0NfV1JJVEVfQ09NQklORSB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogcGNpIHByb2MgICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFdDICAgICAgICAgfAogIFBDSUlPQ19XUklURV9DT01CSU5FICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMgICAgICB8ICAgICAgIFVDICAgICAgICAgfAorL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgIFdCL1dDL1VDLSB8ICAgIFdCL1dDL1VDLSAgICAgfAogIHJlYWQtd3JpdGUgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMgICAgICB8ICAgICAgIFVDICAgICAgICAgfAorL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgVUMtICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogIG1tYXAgU1lOQyBmbGFnICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgIFdCL1dDL1VDICB8ICAgIFdCL1dDL1VDICAgICAgfAorL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgIFdCL1dDL1VDLSB8ICAgIFdCL1dDL1VDLSAgICAgfAogIG1tYXAgIVNZTkMgZmxhZyAgICAgICB8ICAgICAgICAgIHwoZnJvbSBleGlzdC18ICAoZnJvbSBleGlzdC0gICAgfAogIGFuZCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgIGluZyBhbGlhcyl8ICAgIGluZyBhbGlhcykgICAgfAogIGFueSBhbGlhcyB0byB0aGlzIGFyZWF8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfApAQCAtNjgsNyArNzIsNyBAQAogIGFuZCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogIE1UUlIgc2F5cyBXQiAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAotL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgIFVDX01JTlVTICAgICAgfAorL2Rldi9tZW0gICAgICAgICAgICAgICB8ICAgIC0tICAgIHwgICAgLS0gICAgICB8ICAgICAgIFVDLSAgICAgICAgfAogIG1tYXAgIVNZTkMgZmxhZyAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogIG5vIGFsaWFzIHRvIHRoaXMgYXJlYSB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAogIGFuZCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfApAQCAtOTgsMyArMTAyLDM1IEBACiAKIERyaXZlcnMgc2hvdWxkIHVzZSBzZXRfbWVtb3J5X1t1Y3x3Y10gdG8gc2V0IGFjY2VzcyB0eXBlIGZvciBSQU0gcmFuZ2VzLgogCisKK1BBVCBkZWJ1Z2dpbmcKKy0tLS0tLS0tLS0tLS0KKworV2l0aCBDT05GSUdfREVCVUdfRlMgZW5hYmxlZCwgUEFUIG1lbXR5cGUgbGlzdCBjYW4gYmUgZXhhbWluZWQgYnkKKworIyBtb3VudCAtdCBkZWJ1Z2ZzIGRlYnVnZnMgL3N5cy9rZXJuZWwvZGVidWcKKyMgY2F0IC9zeXMva2VybmVsL2RlYnVnL3g4Ni9wYXRfbWVtdHlwZV9saXN0CitQQVQgbWVtdHlwZSBsaXN0OgordW5jYWNoZWQtbWludXMgQCAweDdmYWRmMDAwLTB4N2ZhZTAwMDAKK3VuY2FjaGVkLW1pbnVzIEAgMHg3ZmIxOTAwMC0weDdmYjFhMDAwCit1bmNhY2hlZC1taW51cyBAIDB4N2ZiMWEwMDAtMHg3ZmIxYjAwMAordW5jYWNoZWQtbWludXMgQCAweDdmYjFiMDAwLTB4N2ZiMWMwMDAKK3VuY2FjaGVkLW1pbnVzIEAgMHg3ZmIxYzAwMC0weDdmYjFkMDAwCit1bmNhY2hlZC1taW51cyBAIDB4N2ZiMWQwMDAtMHg3ZmIxZTAwMAordW5jYWNoZWQtbWludXMgQCAweDdmYjFlMDAwLTB4N2ZiMjUwMDAKK3VuY2FjaGVkLW1pbnVzIEAgMHg3ZmIyNTAwMC0weDdmYjI2MDAwCit1bmNhY2hlZC1taW51cyBAIDB4N2ZiMjYwMDAtMHg3ZmIyNzAwMAordW5jYWNoZWQtbWludXMgQCAweDdmYjI3MDAwLTB4N2ZiMjgwMDAKK3VuY2FjaGVkLW1pbnVzIEAgMHg3ZmIyODAwMC0weDdmYjJlMDAwCit1bmNhY2hlZC1taW51cyBAIDB4N2ZiMmUwMDAtMHg3ZmIyZjAwMAordW5jYWNoZWQtbWludXMgQCAweDdmYjJmMDAwLTB4N2ZiMzAwMDAKK3VuY2FjaGVkLW1pbnVzIEAgMHg3ZmIzMTAwMC0weDdmYjMyMDAwCit1bmNhY2hlZC1taW51cyBAIDB4ODAwMDAwMDAtMHg5MDAwMDAwMAorCitUaGlzIGxpc3Qgc2hvd3MgcGh5c2ljYWwgYWRkcmVzcyByYW5nZXMgYW5kIHZhcmlvdXMgUEFUIHNldHRpbmdzIHVzZWQgdG8KK2FjY2VzcyB0aG9zZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlcy4KKworQW5vdGhlciwgbW9yZSB2ZXJib3NlIHdheSBvZiBnZXR0aW5nIFBBVCByZWxhdGVkIGRlYnVnIG1lc3NhZ2VzIGlzIHdpdGgKKyJkZWJ1Z3BhdCIgYm9vdCBwYXJhbWV0ZXIuIFdpdGggdGhpcyBwYXJhbWV0ZXIsIHZhcmlvdXMgZGVidWcgbWVzc2FnZXMgYXJlCitwcmludGVkIHRvIGRtZXNnIGxvZy4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvaTM4Ni91c2ItbGVnYWN5LXN1cHBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvdXNiLWxlZ2FjeS1zdXBwb3J0LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi94ODYvaTM4Ni91c2ItbGVnYWN5LXN1cHBvcnQudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3g4Ni91c2ItbGVnYWN5LXN1cHBvcnQudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9ib290LW9wdGlvbnMudHh0CmluZGV4IGIwYzdiNmMuLjcyZmZiNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9ib290LW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9ib290LW9wdGlvbnMudHh0CkBAIC01NCwxMCArNTQsNiBAQAogCQkgYXBpY21haW50aW1lci4gVXNlZnVsIHdoZW4geW91ciBQSVQgdGltZXIgaXMgdG90YWxseQogCQkgYnJva2VuLgogCi0gICBkaXNhYmxlXzgyNTRfdGltZXIgLyBlbmFibGVfODI1NF90aW1lcgotCQkgRW5hYmxlIGludGVycnVwdCAwIHRpbWVyIHJvdXRpbmcgb3ZlciB0aGUgODI1NCBpbiBhZGRpdGlvbiB0byBvdmVyCi0JICAgICAgICAgdGhlIElPLUFQSUMuIFRoZSBrZXJuZWwgdHJpZXMgdG8gc2V0IGEgc2Vuc2libGUgZGVmYXVsdC4KLQogRWFybHkgQ29uc29sZQogCiAgICBzeW50YXg6IGVhcmx5cHJpbnRrPXZnYQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvaTM4Ni96ZXJvLXBhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi94ODYvaTM4Ni96ZXJvLXBhZ2UudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGFmMjc5NDUuLjUyNzAyYjAgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC03Miw2ICs3Miw3IEBACiBMOiBNYWlsaW5nIGxpc3QgdGhhdCBpcyByZWxldmFudCB0byB0aGlzIGFyZWEKIFc6IFdlYi1wYWdlIHdpdGggc3RhdHVzL2luZm8KIFQ6IFNDTSB0cmVlIHR5cGUgYW5kIGxvY2F0aW9uLiAgVHlwZSBpcyBvbmUgb2Y6IGdpdCwgaGcsIHF1aWx0LgorRjogQXBwbGljYWJsZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMKIFM6IFN0YXR1cywgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAKIAlTdXBwb3J0ZWQ6CVNvbWVvbmUgaXMgYWN0dWFsbHkgcGFpZCB0byBsb29rIGFmdGVyIHRoaXMuCkBAIC0xMDIsMTQgKzEwMywxNCBAQAogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCi0zVy1YWFhYIEFUQS1SQUlEIENPTlRST0xMRVIgRFJJVkVSCiszVy05WFhYIFNBVEEtUkFJRCBDT05UUk9MTEVSIERSSVZFUgogUDoJQWRhbSBSYWRmb3JkCiBNOglsaW51eHJhaWRAYW1jYy5jb20KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LmFtY2MuY29tCiBTOglTdXBwb3J0ZWQKIAotM1ctOVhYWCBTQVRBLVJBSUQgQ09OVFJPTExFUiBEUklWRVIKKzNXLVhYWFggQVRBLVJBSUQgQ09OVFJPTExFUiBEUklWRVIKIFA6CUFkYW0gUmFkZm9yZAogTToJbGludXhyYWlkQGFtY2MuY29tCiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpAQCAtMTYzLDE2ICsxNjQsMTEgQEAKIEw6CWxpbnV4LW02OGtAbGlzdHMubGludXgtbTY4ay5vcmcKIFM6CU1haW50YWluZWQKIAotQUZTIEZJTEVTWVNURU0gJiBBRl9SWFJQQyBTT0NLRVQgRE9NQUlOCi1QOglEYXZpZCBIb3dlbGxzCi1NOglkaG93ZWxsc0ByZWRoYXQuY29tCi1MOglsaW51eC1hZnNAbGlzdHMuaW5mcmFkZWFkLm9yZwotUzoJU3VwcG9ydGVkCi0KLUFJTwotUDoJQmVuamFtaW4gTGFIYWlzZQotTToJYmNybEBrdmFjay5vcmcKLUw6CWxpbnV4LWFpb0BrdmFjay5vcmcKK0FBQ1JBSUQgU0NTSSBSQUlEIERSSVZFUgorUDoJQWRhcHRlYyBPRU0gUmFpZCBTb2x1dGlvbnMKK006CWFhY3JhaWRAYWRhcHRlYy5jb20KK0w6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vd3d3LmFkYXB0ZWMuY29tLwogUzoJU3VwcG9ydGVkCiAKIEFCSVQgVUdVUlUgMSwyIEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCkBAIC0xOTMsMjcgKzE4OSw2IEBACiBMOglsaW51eC1hY2VuaWNAc3Vuc2l0ZS5kawogUzoJTWFpbnRhaW5lZAogCi1JUFMgU0NTSSBSQUlEIERSSVZFUgotUDoJQWRhcHRlYyBPRU0gUmFpZCBTb2x1dGlvbnMKLU06CWFhY3JhaWRAYWRhcHRlYy5jb20KLUw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LmFkYXB0ZWMuY29tLwotUzoJTWFpbnRhaW5lZAotCi1EUFRfSTJPIFNDU0kgUkFJRCBEUklWRVIKLVA6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCi1NOglhYWNyYWlkQGFkYXB0ZWMuY29tCi1MOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL3d3dy5hZGFwdGVjLmNvbS8KLVM6CU1haW50YWluZWQKLQotQUFDUkFJRCBTQ1NJIFJBSUQgRFJJVkVSCi1QOglBZGFwdGVjIE9FTSBSYWlkIFNvbHV0aW9ucwotTToJYWFjcmFpZEBhZGFwdGVjLmNvbQotTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly93d3cuYWRhcHRlYy5jb20vCi1TOglTdXBwb3J0ZWQKLQogQUNFUiBXTUkgTEFQVE9QIEVYVFJBUwogUDoJQ2FybG9zIENvcmJhY2hvCiBNOgljYXJsb3NAc3RyYW5nZXdvcmxkcy5jby51awpAQCAtMjcxLDIwICsyNDYsMjAgQEAKIFM6CVN1cHBvcnRlZAogCiBBQ1BJIFdNSSBEUklWRVIKLVA6ICAgICAgQ2FybG9zIENvcmJhY2hvCi1NOiAgICAgIGNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrCi1MOiAgICAgIGxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnCi1XOiAgICAgIGh0dHA6Ly93d3cubGVzc3dhdHRzLm9yZy9wcm9qZWN0cy9hY3BpLwotUzogICAgICBNYWludGFpbmVkCitQOglDYXJsb3MgQ29yYmFjaG8KK006CWNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrCitMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5sZXNzd2F0dHMub3JnL3Byb2plY3RzL2FjcGkvCitTOglNYWludGFpbmVkCiAKIEFEMTg4OSBBTFNBIFNPVU5EIERSSVZFUgotUDogICAgIEt5bGUgTWNNYXJ0aW4KLU06ICAgICBreWxlQG1jbWFydGluLmNhCi1QOiAgICAgVGhpYmF1dCBWYXJlbmUKLU06ICAgICBULUJvbmVAcGFyaXNjLWxpbnV4Lm9yZwotVzogICAgIGh0dHA6Ly93aWtpLnBhcmlzYy1saW51eC5vcmcvQUQxODg5Ci1MOiAgICAgbGludXgtcGFyaXNjQHZnZXIua2VybmVsLm9yZwotUzogICAgIE1haW50YWluZWQKK1A6CUt5bGUgTWNNYXJ0aW4KK006CWt5bGVAbWNtYXJ0aW4uY2EKK1A6CVRoaWJhdXQgVmFyZW5lCitNOglULUJvbmVAcGFyaXNjLWxpbnV4Lm9yZworVzoJaHR0cDovL3dpa2kucGFyaXNjLWxpbnV4Lm9yZy9BRDE4ODkKK0w6CWxpbnV4LXBhcmlzY0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKIAogQURNMTAyNSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgogUDoJSmVhbiBEZWx2YXJlCkBAIC0zMjcsNiArMzAyLDEyIEBACiBNOgl6aXBwZWxAbGludXgtbTY4ay5vcmcKIFM6CU1haW50YWluZWQKIAorQUZTIEZJTEVTWVNURU0gJiBBRl9SWFJQQyBTT0NLRVQgRE9NQUlOCitQOglEYXZpZCBIb3dlbGxzCitNOglkaG93ZWxsc0ByZWRoYXQuY29tCitMOglsaW51eC1hZnNAbGlzdHMuaW5mcmFkZWFkLm9yZworUzoJU3VwcG9ydGVkCisKIEFHUEdBUlQgRFJJVkVSCiBQOglEYXZpZCBBaXJsaWUKIE06CWFpcmxpZWRAbGludXguaWUKQEAgLTM0NSw2ICszMjYsMTIgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0FJTworUDoJQmVuamFtaW4gTGFIYWlzZQorTToJYmNybEBrdmFjay5vcmcKK0w6CWxpbnV4LWFpb0BrdmFjay5vcmcKK1M6CVN1cHBvcnRlZAorCiBBTENBVEVMIFNQRUVEVE9VQ0ggVVNCIERSSVZFUgogUDoJRHVuY2FuIFNhbmRzCiBNOglkdW5jYW4uc2FuZHNAZnJlZS5mcgpAQCAtMzg3LDggKzM3NCwxNCBAQAogUDoJSm9lcmcgUm9lZGVsCiBNOglqb2VyZy5yb2VkZWxAYW1kLmNvbQogTDoJaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKK1Q6CWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qb3JvL2xpbnV4LTIuNi1pb21tdS5naXQKIFM6CVN1cHBvcnRlZAogCitBTUQgTUlDUk9DT0RFIFVQREFURSBTVVBQT1JUCitQOiAgICAgIFBldGVyIE9ydWJhCitNOiAgICAgIHBldGVyLm9ydWJhQGFtZC5jb20KK1M6ICAgICAgU3VwcG9ydGVkCisKIEFNUyAoQXBwbGUgTW90aW9uIFNlbnNvcikgRFJJVkVSCiBQOglTdGVsaWFuIFBvcAogTToJc3RlbGlhbkBwb3BpZXMubmV0CkBAIC00NjYsNiArNDU5LDEyIEBACiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWsgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiAKK0FSTS9BRkVCOTI2MCBNQUNISU5FIFNVUFBPUlQKK1A6CVNlcmdleSBMYXBpbgorTToJc2xhcGluQG9zc2ZhbnMub3JnCitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWsgKHN1YnNjcmliZXJzLW9ubHkpCitTOglNYWludGFpbmVkCisKIEFSTS9BSkVDTyAxQVJNIE1BQ0hJTkUgU1VQUE9SVAogUDoJTGVubmVydCBCdXl0ZW5oZWsKIE06CWtlcm5lbEB3YW50c3RvZmx5Lm9yZwpAQCAtNDczLDExICs0NzIsMTEgQEAKIFM6CU1haW50YWluZWQKIAogQVJNL0FUTUVMIEFUOTFSTTkyMDAgQVJNIEFSQ0hJVEVDVFVSRQotUDogICAgICBBbmRyZXcgVmljdG9yCi1NOiAgICAgIGxpbnV4QG1heGltLm9yZy56YQotTDogICAgICBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWsgKHN1YnNjcmliZXJzLW9ubHkpCi1XOiAgICAgIGh0dHA6Ly9tYXhpbS5vcmcuemEvYXQ5MV8yNi5odG1sCi1TOiAgICAgIE1haW50YWluZWQKK1A6CUFuZHJldyBWaWN0b3IKK006CWxpbnV4QG1heGltLm9yZy56YQorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5hcm0ubGludXgub3JnLnVrIChzdWJzY3JpYmVycy1vbmx5KQorVzoJaHR0cDovL21heGltLm9yZy56YS9hdDkxXzI2Lmh0bWwKK1M6CU1haW50YWluZWQKIAogQVJNL0NJUlJVUyBMT0dJQyBFUDkzWFggQVJNIEFSQ0hJVEVDVFVSRQogUDoJTGVubmVydCBCdXl0ZW5oZWsKQEAgLTQ5MSw3ICs0OTAsNyBAQAogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5hcm0ubGludXgub3JnLnVrIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogCi1BUk0vQ09NUFVMQUIgQ00tWDI3MC9FTS1YMjcwIE1BQ0hJTkUgU1VQUE9SVAorQVJNL0NPTVBVTEFCIENNLVgyNzAvRU0tWDI3MCBhbmQgQ00tWDMwMCBNQUNISU5FIFNVUFBPUlQKIFA6CU1pa2UgUmFwb3BvcnQKIE06CW1pa2VAY29tcHVsYWIuY28uaWwKIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuYXJtLmxpbnV4Lm9yZy51ayAoc3Vic2NyaWJlcnMtb25seSkKQEAgLTUzMiwxMCArNTMxLDEwIEBACiBTOglNYWludGFpbmVkCiAKIEFSTS9IUCBKT1JOQURBIDdYWCBNQUNISU5FIFNVUFBPUlQKLVA6ICAgICAgS3Jpc3RvZmZlciBFcmljc29uCi1NOiAgICAgIGtyaXN0b2ZmZXIuZXJpY3NvbkBnbWFpbC5jb20KLVc6ICAgICAgd3d3LmpsaW1lLmNvbQotUzogICAgICBNYWludGFpbmVkCitQOglLcmlzdG9mZmVyIEVyaWNzb24KK006CWtyaXN0b2ZmZXIuZXJpY3NvbkBnbWFpbC5jb20KK1c6CXd3dy5qbGltZS5jb20KK1M6CU1haW50YWluZWQKIAogQVJNL0lOVEVMIElPUDMyWCBBUk0gQVJDSElURUNUVVJFCiBQOglMZW5uZXJ0IEJ1eXRlbmhlawpAQCAtNjIzLDYgKzYyMiwxMiBAQAogVzoJaHR0cDovL2hhY2tuZGV2LmNvbQogUzoJTWFpbnRhaW5lZAogCitBUk0vUEFMTVo3MiBTVVBQT1JUCitQOiAgICAgU2VyZ2V5IExhcGluCitNOiAgICAgc2xhcGluQG9zc2ZhbnMub3JnCitXOiAgICAgaHR0cDovL2hhY2tuZGV2LmNvbQorUzogICAgIE1haW50YWluZWQKKwogQVJNL1BMRUIgU1VQUE9SVAogUDoJUGV0ZXIgQ2h1YmIKIE06CXBsZWJAZ2VsYXRvLnVuc3cuZWR1LmF1CkBAIC03MTksNyArNzI0LDcgQEAKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMveHNjYWxlaW9wCiBTOglTdXBwb3J0ZWQKIAotQVRBIE9WRVIgRVRIRVJORVQgRFJJVkVSCitBVEEgT1ZFUiBFVEhFUk5FVCAoQU9FKSBEUklWRVIKIFA6CUVkIEwuIENhc2hpbgogTToJZWNhc2hpbkBjb3JhaWQuY29tCiBXOglodHRwOi8vd3d3LmNvcmFpZC5jb20vc3VwcG9ydC9saW51eApAQCAtNzUwLDExICs3NTUsMTMgQEAKIE06CXN5cmphbGFAc2NpLmZpCiBTOglNYWludGFpbmVkCiAKLUFUTDEgRVRIRVJORVQgRFJJVkVSCitBVExYIEVUSEVSTkVUIERSSVZFUlMKIFA6CUpheSBDbGlidXJuCiBNOglqY2xpYnVybkBnbWFpbC5jb20KIFA6CUNocmlzIFNub29rCiBNOgljc25vb2tAcmVkaGF0LmNvbQorUDoJSmllIFlhbmcKK006CWppZS55YW5nQGF0aGVyb3MuY29tCiBMOglhdGwxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hdGwxCiBXOglodHRwOi8vYXRsMS5zb3VyY2Vmb3JnZS5uZXQKQEAgLTg1MCwxMSArODU3LDQ4IEBACiBXOglodHRwOi8vd3d3LmxpbnV4LWF4MjUub3JnLwogUzoJTWFpbnRhaW5lZAogCitCNDMgV0lSRUxFU1MgRFJJVkVSCitQOglNaWNoYWVsIEJ1ZXNjaAorTToJbWJAYnUzc2NoLmRlCitQOglTdGVmYW5vIEJyaXZpbworTToJc3RlZmFuby5icml2aW9AcG9saW1pLml0CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9saW51eHdpcmVsZXNzLm9yZy9lbi91c2Vycy9Ecml2ZXJzL2I0MworUzoJTWFpbnRhaW5lZAorCitCNDNMRUdBQ1kgV0lSRUxFU1MgRFJJVkVSCitQOglMYXJyeSBGaW5nZXIKK006CUxhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQKK1A6CVN0ZWZhbm8gQnJpdmlvCitNOglzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2xpbnV4d2lyZWxlc3Mub3JnL2VuL3VzZXJzL0RyaXZlcnMvYjQzCitTOglNYWludGFpbmVkCisKIEJBQ0tMSUdIVCBDTEFTUy9TVUJTWVNURU0KIFA6CVJpY2hhcmQgUHVyZGllCiBNOglycHVyZGllQHJwc3lzLm5ldAogUzoJTWFpbnRhaW5lZAogCitCQVlDT00vSERMQ0RSViBEUklWRVJTIEZPUiBBWC4yNQorUDoJVGhvbWFzIFNhaWxlcgorTToJdC5zYWlsZXJAYWx1bW5pLmV0aHouY2gKK0w6CWxpbnV4LWhhbXNAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vd3d3LmJheWNvbS5vcmcvfnRvbS9oYW0vaGFtLmh0bWwKK1M6CU1haW50YWluZWQKKworQkVGUyBGSUxFIFNZU1RFTQorUDoJU2VyZ2V5IFMuIEtvc3R5bGlvdgorTToJcmF0aGFtYWhhdGFAcGhwNC5ydQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCitCRlMgRklMRSBTWVNURU0KK1A6CVRpZ3JhbiBBLiBBaXZhemlhbgorTToJdGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKIEJMQUNLRklOIEFSQ0hJVEVDVFVSRQogUDoJQnJ5YW4gV3UKIE06CWNvb2xvbmV5QGtlcm5lbC5vcmcKQEAgLTg5MCw0MyArOTM0LDYgQEAKIFc6CWh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZwogUzoJU3VwcG9ydGVkCiAKLUJBWUNPTS9IRExDRFJWIERSSVZFUlMgRk9SIEFYLjI1Ci1QOglUaG9tYXMgU2FpbGVyCi1NOgl0LnNhaWxlckBhbHVtbmkuZXRoei5jaAotTDoJbGludXgtaGFtc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly93d3cuYmF5Y29tLm9yZy9+dG9tL2hhbS9oYW0uaHRtbAotUzoJTWFpbnRhaW5lZAotCi1CNDMgV0lSRUxFU1MgRFJJVkVSCi1QOglNaWNoYWVsIEJ1ZXNjaAotTToJbWJAYnUzc2NoLmRlCi1QOglTdGVmYW5vIEJyaXZpbwotTToJc3RlZmFuby5icml2aW9AcG9saW1pLml0Ci1MOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9saW51eHdpcmVsZXNzLm9yZy9lbi91c2Vycy9Ecml2ZXJzL2I0MwotUzoJTWFpbnRhaW5lZAotCi1CNDNMRUdBQ1kgV0lSRUxFU1MgRFJJVkVSCi1QOglMYXJyeSBGaW5nZXIKLU06CUxhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQKLVA6CVN0ZWZhbm8gQnJpdmlvCi1NOglzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQKLUw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL2xpbnV4d2lyZWxlc3Mub3JnL2VuL3VzZXJzL0RyaXZlcnMvYjQzCi1TOglNYWludGFpbmVkCi0KLUJFRlMgRklMRSBTWVNURU0KLVA6CVNlcmdleSBTLiBLb3N0eWxpb3YKLU06CXJhdGhhbWFoYXRhQHBocDQucnUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQotQkZTIEZJTEUgU1lTVEVNCi1QOglUaWdyYW4gQS4gQWl2YXppYW4KLU06CXRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51awotTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCiBCTEFDS0ZJTiBJMkMgVFdJIERSSVZFUgogUDoJU29uaWMgWmhhbmcKIE06CXNvbmljLnpoYW5nQGFuYWxvZy5jb20KQEAgLTEwMTUsMjAgKzEwMjIsMTEgQEAKIFM6CU1haW50YWluZWQKIAogQ0FGRSBDTU9TIElOVEVHUkFURUQgQ0FNRVJBIENPTlRST0xMRVIgRFJJVkVSCi1QOiAgIAlKb25hdGhhbiBDb3JiZXQKK1A6CUpvbmF0aGFuIENvcmJldAogTToJY29yYmV0QGx3bi5uZXQKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogUzoJTWFpbnRhaW5lZAogCi1DQU4gTkVUV09SSyBMQVlFUgotUDoJVXJzIFRodWVybWFubgotTToJdXJzLnRodWVybWFubkB2b2xrc3dhZ2VuLmRlCi1QOglPbGl2ZXIgSGFydGtvcHAKLU06CW9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlCi1MOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlIChzdWJzY3JpYmVycy1vbmx5KQotVzoJaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL3NvY2tldGNhbi8KLVM6CU1haW50YWluZWQKLQogQ0FMR0FSWSB4ODYtNjQgSU9NTVUKIFA6CU11bGkgQmVuLVllaHVkYQogTToJbXVsaUBpbC5pYm0uY29tCkBAIC0xMDM4LDYgKzEwMzYsMTUgQEAKIEw6CWRpc2N1c3NAeDg2LTY0Lm9yZwogUzoJTWFpbnRhaW5lZAogCitDQU4gTkVUV09SSyBMQVlFUgorUDoJVXJzIFRodWVybWFubgorTToJdXJzLnRodWVybWFubkB2b2xrc3dhZ2VuLmRlCitQOglPbGl2ZXIgSGFydGtvcHAKK006CW9saXZlci5oYXJ0a29wcEB2b2xrc3dhZ2VuLmRlCitMOglzb2NrZXRjYW4tY29yZUBsaXN0cy5iZXJsaW9zLmRlIChzdWJzY3JpYmVycy1vbmx5KQorVzoJaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL3NvY2tldGNhbi8KK1M6CU1haW50YWluZWQKKwogQ0VMTCBCUk9BREJBTkQgRU5HSU5FIEFSQ0hJVEVDVFVSRQogUDoJQXJuZCBCZXJnbWFubgogTToJYXJuZEBhcm5kYi5kZQpAQCAtMTA3NywxOSArMTA4NCwxMSBAQAogTToJanNjaG9wcEBhdXN0aW4uaWJtLmNvbQogUzoJU3VwcG9ydGVkCiAKLUNPTU1PTiBJTlRFUk5FVCBGSUxFIFNZU1RFTSAoQ0lGUykKLVA6CVN0ZXZlIEZyZW5jaAotTToJc2ZyZW5jaEBzYW1iYS5vcmcKLUw6CWxpbnV4LWNpZnMtY2xpZW50QGxpc3RzLnNhbWJhLm9yZwotTDoJc2FtYmEtdGVjaG5pY2FsQGxpc3RzLnNhbWJhLm9yZwotVzoJaHR0cDovL2xpbnV4LWNpZnMuc2FtYmEub3JnLwotVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zZnJlbmNoL2NpZnMtMi42LmdpdAotUzoJU3VwcG9ydGVkCi0KLUNPTkZJR0ZTCi1QOglKb2VsIEJlY2tlcgotTToJam9lbC5iZWNrZXJAb3JhY2xlLmNvbQotTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworQ0lTQ08gMTBHIEVUSEVSTkVUIERSSVZFUgorUDoJU2NvdHQgRmVsZG1hbgorTToJc2NvZmVsZG1AY2lzY28uY29tCitQOglKb2UgRXlraG9sdAorTToJamV5a2hvbHRAY2lzY28uY29tCiBTOglTdXBwb3J0ZWQKIAogQ0lSUlVTIExPR0lDIEVQOTNYWCBFVEhFUk5FVCBEUklWRVIKQEAgLTExMjUsNiArMTEyNCwxNSBAQAogVzoJaHR0cDovL3d3dy5jb2RhLmNzLmNtdS5lZHUvCiBTOglNYWludGFpbmVkCiAKK0NPTU1PTiBJTlRFUk5FVCBGSUxFIFNZU1RFTSAoQ0lGUykKK1A6CVN0ZXZlIEZyZW5jaAorTToJc2ZyZW5jaEBzYW1iYS5vcmcKK0w6CWxpbnV4LWNpZnMtY2xpZW50QGxpc3RzLnNhbWJhLm9yZworTDoJc2FtYmEtdGVjaG5pY2FsQGxpc3RzLnNhbWJhLm9yZworVzoJaHR0cDovL2xpbnV4LWNpZnMuc2FtYmEub3JnLworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zZnJlbmNoL2NpZnMtMi42LmdpdAorUzoJU3VwcG9ydGVkCisKIENPTVBBQ1RQQ0kgSE9UUExVRyBDT1JFCiBQOglTY290dCBNdXJyYXkKIE06CXNjb3R0bUBzb21hbmV0d29ya3MuY29tCkBAIC0xMTY0LDYgKzExNzIsMTIgQEAKIFc6CWh0dHA6Ly9hY2Nlc3NydW5uZXIuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCitDT05GSUdGUworUDoJSm9lbCBCZWNrZXIKK006CWpvZWwuYmVja2VyQG9yYWNsZS5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorCiBDT05UUk9MIEdST1VQUyAoQ0dST1VQUykKIFA6CVBhdWwgTWVuYWdlCiBNOgltZW5hZ2VAZ29vZ2xlLmNvbQpAQCAtMTE5Niw5ICsxMjEwLDcgQEAKIFM6CU1haW50YWluZWQKIAogQ1BVU0VUUwotUDoJUGF1bCBKYWNrc29uCiBQOglQYXVsIE1lbmFnZQotTToJcGpAc2dpLmNvbQogTToJbWVuYWdlQGdvb2dsZS5jb20KIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuYnVsbG9wZW5zb3VyY2Uub3JnL2NwdXNldC8KQEAgLTEyODksNiArMTMwMSwyMCBAQAogTDoJbGludXgtaGFtc0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorREFWSUNPTSBGQVNUIEVUSEVSTkVUIChETUZFKSBORVRXT1JLIERSSVZFUgorUDoJVG9iaWFzIFJpbmdzdHJvbQorTToJdG9yaUB1bmhhcHB5Lm1pbmUubnUKK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworREMzOTAvQU01M0M5NzQgU0NTSSBkcml2ZXIKK1A6CUt1cnQgR2FybG9mZgorTToJZ2FybG9mZkBzdXNlLmRlCitXOglodHRwOi8vd3d3LmdhcmxvZmYuZGUva3VydC9saW51eC9kYzM5MC8KK1A6CUd1ZW5uYWRpIExpYWtob3ZldHNraQorTToJZy5saWFraG92ZXRza2lAZ214LmRlCitTOglNYWludGFpbmVkCisKIERDMzk1eCBTQ1NJIGRyaXZlcgogUDoJT2xpdmVyIE5ldWt1bQogTToJb2xpdmVyQG5ldWt1bS5uYW1lCkBAIC0xMzAxLDE0ICsxMzI3LDYgQEAKIEw6CWh0dHA6Ly9saXN0cy50d2liYmxlLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RjMzk1eC8KIFM6CU1haW50YWluZWQKIAotREMzOTAvQU01M0M5NzQgU0NTSSBkcml2ZXIKLVA6CUt1cnQgR2FybG9mZgotTToJZ2FybG9mZkBzdXNlLmRlCi1XOglodHRwOi8vd3d3LmdhcmxvZmYuZGUva3VydC9saW51eC9kYzM5MC8KLVA6CUd1ZW5uYWRpIExpYWtob3ZldHNraQotTToJZy5saWFraG92ZXRza2lAZ214LmRlCi1TOglNYWludGFpbmVkCi0KIERDQ1AgUFJPVE9DT0wKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwogTToJYWNtZUBnaG9zdHByb3RvY29scy5uZXQKQEAgLTEzMzksMTIgKzEzNTcsNiBAQAogTToJRG91Z2xhc19XYXJ6ZWNoYUBkZWxsLmNvbQogUzoJTWFpbnRhaW5lZAogCi1ERVZJQ0UtTUFQUEVSICAoTFZNKQotUDoJQWxhc2RhaXIgS2VyZ29uCi1MOglkbS1kZXZlbEByZWRoYXQuY29tCi1XOglodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2RtCi1TOglNYWludGFpbmVkCi0KIERFVklDRSBOVU1CRVIgUkVHSVNUUlkKIFA6CVRvcmJlbiBNYXRoaWFzZW4KIE06CWRldmljZUBsYW5hbmEub3JnCkBAIC0xMzUyLDE0ICsxMzY0LDIwIEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0RFVklDRS1NQVBQRVIgIChMVk0pCitQOglBbGFzZGFpciBLZXJnb24KK0w6CWRtLWRldmVsQHJlZGhhdC5jb20KK1c6CWh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vZG0KK1M6CU1haW50YWluZWQKKwogRElHSSBJTlRMLiBFUENBIERSSVZFUgogUDoJRGlnaSBJbnRlcm5hdGlvbmFsLCBJbmMKIE06CUVuZy5MaW51eEBkaWdpLmNvbQogTDoJRW5nLkxpbnV4QGRpZ2kuY29tCiBXOglodHRwOi8vd3d3LmRpZ2kuY29tCi1TOglPcnBoYW5lZAorUzoJT3JwaGFuCiAKLURJUkVDVE9SWSBOT1RJRklDQVRJT04KK0RJUkVDVE9SWSBOT1RJRklDQVRJT04gKEROT1RJRlkpCiBQOglTdGVwaGVuIFJvdGh3ZWxsCiBNOglzZnJAY2FuYi5hdXVnLm9yZy5hdQogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpAQCAtMTM3MywxMyArMTM5MSwxMyBAQAogVzoJaHR0cDovL3d3dy53aW4udHVlLm5sL35hZWIvcGFydGl0aW9ucy9wYXJ0aXRpb25fdHlwZXMtMS5odG1sCiBTOglNYWludGFpbmVkCiAKLURJU0tRVU9UQToKK0RJU0tRVU9UQQogUDoJSmFuIEthcmEKIE06CWphY2tAc3VzZS5jegogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCi1ESVNUUklCVVRFRCBMT0NLIE1BTkFHRVIKK0RJU1RSSUJVVEVEIExPQ0sgTUFOQUdFUiAoRExNKQogUDoJQ2hyaXN0aW5lIENhdWxmaWVsZAogTToJY2NhdWxmaWVAcmVkaGF0LmNvbQogUDoJRGF2aWQgVGVpZ2xhbmQKQEAgLTEzODksMTIgKzE0MDcsNiBAQAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90ZWlnbGFuZC9kbG0uZ2l0CiBTOglTdXBwb3J0ZWQKIAotREFWSUNPTSBGQVNUIEVUSEVSTkVUIChETUZFKSBORVRXT1JLIERSSVZFUgotUDoJVG9iaWFzIFJpbmdzdHJvbQotTToJdG9yaUB1bmhhcHB5Lm1pbmUubnUKLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogRE1BIEdFTkVSSUMgT0ZGTE9BRCBFTkdJTkUgU1VCU1lTVEVNCiBQOglNYWNpZWogU29zbm93c2tpCiBNOgltYWNpZWouc29zbm93c2tpQGludGVsLmNvbQpAQCAtMTQyMSwxMiArMTQzMywxMiBAQAogUzoJU3VwcG9ydGVkCiAKIERPQ1VNRU5UQVRJT04gKC9Eb2N1bWVudGF0aW9uIGRpcmVjdG9yeSkKLVA6ICAgICBNaWNoYWVsIEtlcnJpc2sKLU06ICAgICBtdGsubWFucGFnZXNAZ21haWwuY29tCi1QOiAgICAgUmFuZHkgRHVubGFwCi1NOiAgICAgcmR1bmxhcEB4ZW5vdGltZS5uZXQKLUw6ICAgICBsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCi1TOiAgICAgTWFpbnRhaW5lZAorUDoJTWljaGFlbCBLZXJyaXNrCitNOgltdGsubWFucGFnZXNAZ21haWwuY29tCitQOglSYW5keSBEdW5sYXAKK006CXJkdW5sYXBAeGVub3RpbWUubmV0CitMOglsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCiAKIERPVUJMRVRBTEsgRFJJVkVSCiBQOglKYW1lcyBSLiBWYW4gWmFuZHQKQEAgLTE0MzQsNiArMTQ0NiwxMyBAQAogTDoJYmxpbnV4LWxpc3RAcmVkaGF0LmNvbQogUzoJTWFpbnRhaW5lZAogCitEUFRfSTJPIFNDU0kgUkFJRCBEUklWRVIKK1A6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCitNOglhYWNyYWlkQGFkYXB0ZWMuY29tCitMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5hZGFwdGVjLmNvbS8KK1M6CU1haW50YWluZWQKKwogRFJJVkVSIENPUkUsIEtPQkpFQ1RTLCBBTkQgU1lTRlMKIFA6CUdyZWcgS3JvYWgtSGFydG1hbgogTToJZ3JlZ2toQHN1c2UuZGUKQEAgLTE0NTcsNyArMTQ3Niw3IEBACiBEVkIgU1VCU1lTVEVNIEFORCBEUklWRVJTCiBQOglMaW51eFRWLm9yZyBQcm9qZWN0CiBNOgl2NGwtZHZiLW1haW50YWluZXJAbGludXh0di5vcmcKLUw6IAlsaW51eC1kdmJAbGludXh0di5vcmcgKHN1YnNjcmlwdGlvbiByZXF1aXJlZCkKK0w6CWxpbnV4LWR2YkBsaW51eHR2Lm9yZyAoc3Vic2NyaXB0aW9uIHJlcXVpcmVkKQogVzoJaHR0cDovL2xpbnV4dHYub3JnLwogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL3Y0bC1kdmIuZ2l0CiBTOglNYWludGFpbmVkCkBAIC0xNTgyLDcgKzE2MDEsNyBAQAogVzoJaHR0cDovL2Flc2NoaS5jaC5ldS5vcmcvZWZzLwogUzoJT3JwaGFuCiAKLUVIQ0EgKElCTSBHWCBidXMgSW5maW5pQmFuZCBhZGFwdGVyKSBEUklWRVI6CitFSENBIChJQk0gR1ggYnVzIEluZmluaUJhbmQgYWRhcHRlcikgRFJJVkVSCiBQOglIb2FuZy1OYW0gTmd1eWVuCiBNOglobmd1eWVuQGRlLmlibS5jb20KIFA6CUNocmlzdG9waCBSYWlzY2gKQEAgLTE1OTMsNyArMTYxMiw3IEBACiBFTUJFRERFRCBMSU5VWAogUDoJUGF1bCBHb3J0bWFrZXIKIE06CXBhdWwuZ29ydG1ha2VyQHdpbmRyaXZlci5jb20KLVAJRGF2aWQgV29vZGhvdXNlCitQOglEYXZpZCBXb29kaG91c2UKIE06CWR3bXcyQGluZnJhZGVhZC5vcmcKIEw6CWxpbnV4LWVtYmVkZGVkQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZApAQCAtMTYxMCw2ICsxNjI5LDExIEBACiBNOgljaEBtdXJnYXRyb2lkLmNvbSwgY2hAaHBsLmhwLmNvbQogUzoJTWFpbnRhaW5lZAogCitFUFNPTiBTMUQxM1hYWCBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CUtyaXN0b2ZmZXIgRXJpY3NvbgorTToJa3Jpc3RvZmZlci5lcmljc29uQGdtYWlsLmNvbQorUzoJTWFpbnRhaW5lZAorCiBFVEhFUkVYUFJFU1MtMTYgTkVUV09SSyBEUklWRVIKIFA6CVBoaWxpcCBCbHVuZGVsbAogTToJcGhpbGJAZ251Lm9yZwpAQCAtMTYzOSw5ICsxNjYzLDEwIEBACiBTOglNYWludGFpbmVkCiAKIEVYVDQgRklMRSBTWVNURU0KLVA6CVN0ZXBoZW4gVHdlZWRpZSwgQW5kcmV3IE1vcnRvbgotTToJc2N0QHJlZGhhdC5jb20sIGFrcG1AbGludXgtZm91bmRhdGlvbi5vcmcsIGFkaWxnZXJAc3VuLmNvbQorUDoJVGhlb2RvcmUgVHMnbworTToJdHl0c29AbWl0LmVkdSwgYWRpbGdlckBzdW4uY29tCiBMOglsaW51eC1leHQ0QHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2V4dDQud2lraS5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKIEY3MTgwNUYgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVIKQEAgLTE2NjEsNiArMTY4Niw0MiBAQAogTToJYWtpbm9idS5taXRhQGdtYWlsLmNvbQogUzoJU3VwcG9ydGVkCiAKK0ZJTEUgTE9DS0lORyAoZmxvY2soKSBhbmQgZmNudGwoKS9sb2NrZigpKQorUDoJTWF0dGhldyBXaWxjb3gKK006CW1hdHRoZXdAd2lsLmN4CitMOglsaW51eC1mc2RldmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCitGSUxFU1lTVEVNUyAoVkZTIGFuZCBpbmZyYXN0cnVjdHVyZSkKK1A6CUFsZXhhbmRlciBWaXJvCitNOgl2aXJvQHplbml2LmxpbnV4Lm9yZy51aworTDoJbGludXgtZnNkZXZlbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworRklSRVdJUkUgU1VCU1lTVEVNIChkcml2ZXJzL2ZpcmV3aXJlLCA8bGludXgvZmlyZXdpcmUqLmg+KQorUDoJS3Jpc3RpYW4gSG9lZ3NiZXJnLCBTdGVmYW4gUmljaHRlcgorTToJa3JoQHJlZGhhdC5jb20sIHN0ZWZhbnJAczVyNi5pbi1iZXJsaW4uZGUKK0w6CWxpbnV4MTM5NC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly93d3cubGludXgxMzk0Lm9yZy8KK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvaWVlZTEzOTQvbGludXgxMzk0LTIuNi5naXQKK1M6CU1haW50YWluZWQKKworRklSTVdBUkUgTE9BREVSIChyZXF1ZXN0X2Zpcm13YXJlKQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJT3JwaGFuCisKK0ZQVSBFTVVMQVRPUgorUDoJQmlsbCBNZXR6ZW50aGVuCitNOgliaWxsbUBzdWJ1cmJpYS5uZXQKK1c6CWh0dHA6Ly9zdWJ1cmJpYS5uZXQvfmJpbGxtL2Zsb2F0aW5nLXBvaW50L2VtdWxhdG9yLworUzoJTWFpbnRhaW5lZAorCitGUkFNRSBSRUxBWSBETENJL0ZSQUQgKFNhbmdvbWEgZHJpdmVycyB0b28pCitQOglNaWtlIE1jTGFnYW4KK006CW1pa2UubWNsYWdhbkBsaW51eC5vcmcKK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogRlJBTUVCVUZGRVIgTEFZRVIKIFA6CUFudG9uaW5vIERhcGxhcwogTToJYWRhcGxhc0BnbWFpbC5jb20KQEAgLTE3MjYsNDIgKzE3ODcsNiBAQAogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKIFM6CVN1cHBvcnRlZAogCi1GSUxFIExPQ0tJTkcgKGZsb2NrKCkgYW5kIGZjbnRsKCkvbG9ja2YoKSkKLVA6CU1hdHRoZXcgV2lsY294Ci1NOgltYXR0aGV3QHdpbC5jeAotTDoJbGludXgtZnNkZXZlbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQotRklMRVNZU1RFTVMgKFZGUyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCi1QOglBbGV4YW5kZXIgVmlybwotTToJdmlyb0B6ZW5pdi5saW51eC5vcmcudWsKLUw6CWxpbnV4LWZzZGV2ZWxAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KLUZJUkVXSVJFIFNVQlNZU1RFTSAoZHJpdmVycy9maXJld2lyZSwgPGxpbnV4L2ZpcmV3aXJlKi5oPikKLVA6CUtyaXN0aWFuIEhvZWdzYmVyZywgU3RlZmFuIFJpY2h0ZXIKLU06CWtyaEByZWRoYXQuY29tLCBzdGVmYW5yQHM1cjYuaW4tYmVybGluLmRlCi1MOglsaW51eDEzOTQtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOglodHRwOi8vd3d3LmxpbnV4MTM5NC5vcmcvCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2llZWUxMzk0L2xpbnV4MTM5NC0yLjYuZ2l0Ci1TOglNYWludGFpbmVkCi0KLUZJUk1XQVJFIExPQURFUiAocmVxdWVzdF9maXJtd2FyZSkKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU9ycGhhbgotCi1GUFUgRU1VTEFUT1IKLVA6CUJpbGwgTWV0emVudGhlbgotTToJYmlsbG1Ac3VidXJiaWEubmV0Ci1XOglodHRwOi8vc3VidXJiaWEubmV0L35iaWxsbS9mbG9hdGluZy1wb2ludC9lbXVsYXRvci8KLVM6CU1haW50YWluZWQKLQotRlJBTUUgUkVMQVkgRExDSS9GUkFEIChTYW5nb21hIGRyaXZlcnMgdG9vKQotUDoJTWlrZSBNY0xhZ2FuCi1NOgltaWtlLm1jbGFnYW5AbGludXgub3JnCi1MOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIEZSRUVWWEZTIEZJTEVTWVNURU0KIFA6CUNocmlzdG9waCBIZWxsd2lnCiBNOgloY2hAaW5mcmFkZWFkLm9yZwpAQCAtMTc5NSw3ICsxODIwLDcgQEAKIFA6CVJpayBGYWl0aAogTToJZmFpdGhAY3MudW5jLmVkdQogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKLVM6CU9kZCBmaXhlcyAoZS5nLiwgbmV3IHNpZ25hdHVyZXMpCitTOglPZGQgRml4ZXMgKGUuZy4sIG5ldyBzaWduYXR1cmVzKQogCiBHRFQgU0NTSSBESVNLIEFSUkFZIENPTlRST0xMRVIgRFJJVkVSCiBQOglBY2hpbSBMZXVibmVyCkBAIC0xODMzLDE0ICsxODU4LDYgQEAKIFc6CWh0dHA6Ly9naWdhc2V0MzA3eC5zb3VyY2Vmb3JnZS5uZXQvCiBTOglNYWludGFpbmVkCiAKLUhBUkRXQVJFIE1PTklUT1JJTkcKLUw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKLVc6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvCi1TOglPcnBoYW5lZAotCi1IQVJEV0FSRSBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBDT1JFCi1TOglPcnBoYW5lZAotCiBIQVJEIERSSVZFIEFDVElWRSBQUk9URUNUSU9OIFNZU1RFTSAoSERBUFMpIERSSVZFUgogUDoJUm9iZXJ0IExvdmUKIE06CXJsb3ZlQHJsb3ZlLm9yZwpAQCAtMTg0OCw2ICsxODY1LDE0IEBACiBXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvcm1sL2hkYXBzLwogUzoJTWFpbnRhaW5lZAogCitIQVJEV0FSRSBNT05JVE9SSU5HCitMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCitXOglodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnLworUzoJT3JwaGFuCisKK0hBUkRXQVJFIFJBTkRPTSBOVU1CRVIgR0VORVJBVE9SIENPUkUKK1M6CU9ycGhhbgorCiBIQVJNT05ZIFNPVU5EIERSSVZFUgogUDoJS3lsZSBNY01hcnRpbgogTToJa3lsZUBtY21hcnRpbi5jYQpAQCAtMTg2MSw2ICsxODg2LDI0IEBACiBXOglodHRwOi8vd3d3Lm55eC5uZXQvfmFyb2JpbnNvCiBTOglNYWludGFpbmVkCiAKK0hFV0xFVFQtUEFDS0FSRCBGSUJSRSBDSEFOTkVMIDY0LWJpdC82Nk1IeiBQQ0kgbm9uLWludGVsbGlnZW50IEhCQQorUDoJQ2hpcmFnIEthbnRoYXJpYQorTToJY2hpcmFnLmthbnRoYXJpYUBocC5jb20KK0w6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQorUzoJTWFpbnRhaW5lZAorCitIRVdMRVRULVBBQ0tBUkQgU01BUlQyIFJBSUQgRFJJVkVSCitQOglDaGlyYWcgS2FudGhhcmlhCitNOgljaGlyYWcua2FudGhhcmlhQGhwLmNvbQorTDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitTOglNYWludGFpbmVkCisKK0hFV0xFVFQtUEFDS0FSRCBTTUFSVCBDSVNTIFJBSUQgRFJJVkVSIChjY2lzcykKK1A6CU1pa2UgTWlsbGVyCitNOgltaWtlLm1pbGxlckBocC5jb20KK0w6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQorUzoJU3VwcG9ydGVkCisKIEhGUyBGSUxFU1lTVEVNCiBQOglSb21hbiBaaXBwZWwKIE06CXppcHBlbEBsaW51eC1tNjhrLm9yZwpAQCAtMTg3NCw2ICsxOTE3LDE0IEBACiBXOglodHRwOi8vZHJhbWEub2J1ZGEua2FuZG8uaHUvfmZlcm8vY2dpLWJpbi9oZ2FmYi5zaHRtbAogUzoJTWFpbnRhaW5lZAogCitISUJFUk5BVElPTiAoYWthIFNvZnR3YXJlIFN1c3BlbmQsIGFrYSBzd3N1c3ApCitQOglQYXZlbCBNYWNoZWsKK006CXBhdmVsQHN1c2UuY3oKK1A6CVJhZmFlbCBKLiBXeXNvY2tpCitNOglyandAc2lzay5wbAorTDoJbGludXgtcG1AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKK1M6CVN1cHBvcnRlZAorCiBISUQgQ09SRSBMQVlFUgogUDoJSmlyaSBLb3NpbmEKIE06CWprb3NpbmFAc3VzZS5jegpAQCAtMTkwNiwyNCArMTk1Nyw2IEBACiBMOglsaW51eC1oaXBwaUBzdW5zaXRlLmRrCiBTOglNYWludGFpbmVkCiAKLUhFV0xFVFQtUEFDS0FSRCBGSUJSRSBDSEFOTkVMIDY0LWJpdC82Nk1IeiBQQ0kgbm9uLWludGVsbGlnZW50IEhCQQotUDoJQ2hpcmFnIEthbnRoYXJpYQotTToJY2hpcmFnLmthbnRoYXJpYUBocC5jb20KLUw6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQotUzoJTWFpbnRhaW5lZAotCi1IRVdMRVRULVBBQ0tBUkQgU01BUlQyIFJBSUQgRFJJVkVSCi1QOglDaGlyYWcgS2FudGhhcmlhCi1NOgljaGlyYWcua2FudGhhcmlhQGhwLmNvbQotTDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCi1TOglNYWludGFpbmVkCi0KLUhFV0xFVFQtUEFDS0FSRCBTTUFSVCBDSVNTIFJBSUQgRFJJVkVSIChjY2lzcykKLVA6CU1pa2UgTWlsbGVyCi1NOgltaWtlLm1pbGxlckBocC5jb20KLUw6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQotUzoJU3VwcG9ydGVkCi0KIEhPU1QgQVAgRFJJVkVSCiBQOglKb3VuaSBNYWxpbmVuCiBNOglqQHcxLmZpCkBAIC0xOTMyLDE2ICsxOTY1LDE2IEBACiBXOglodHRwOi8vaG9zdGFwLmVwaXRlc3QuZmkvCiBTOglNYWludGFpbmVkCiAKLUhQMTAwOglEcml2ZXIgZm9yIEhQIDEwLzEwMCBNYml0L3MgVm9pY2UgR3JhZGUgTmV0d29yayBBZGFwdGVyIFNlcmllcwotUDoJSmFyb3NsYXYgS3lzZWxhCi1NOglwZXJleEBwZXJleC5jegotUzoJTWFpbnRhaW5lZAotCiBIUCBDT01QQVEgVEMxMTAwIFRBQkxFVCBXTUkgRVhUUkFTIERSSVZFUgogUDoJQ2FybG9zIENvcmJhY2hvCiBNOgljYXJsb3NAc3RyYW5nZXdvcmxkcy5jby51awogUzoJT2RkIEZpeGVzCiAKK0hQMTAwOglEcml2ZXIgZm9yIEhQIDEwLzEwMCBNYml0L3MgVm9pY2UgR3JhZGUgTmV0d29yayBBZGFwdGVyIFNlcmllcworUDoJSmFyb3NsYXYgS3lzZWxhCitNOglwZXJleEBwZXJleC5jegorUzoJTWFpbnRhaW5lZAorCiBIUEVUOglIaWdoIFByZWNpc2lvbiBFdmVudCBUaW1lcnMgZHJpdmVyIChkcml2ZXJzL2NoYXIvaHBldC5jKQogUDoJQ2xlbWVucyBMYWRpc2NoCiBNOgljbGVtZW5zQGxhZGlzY2guZGUKQEAgLTE5ODIsNyArMjAxNSw3IEBACiBJMkMvU01CVVMgU1RVQiBEUklWRVIKIFA6CU1hcmsgTS4gSG9mZm1hbgogTToJbWhvZmZtYW5AbGlnaHRsaW5rLmNvbQotTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworTDoJaTJjQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiAKIEkyQyBTVUJTWVNURU0KQEAgLTIwMjEsMTQgKzIwNTQsNiBAQAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9hZWdsL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAotU04tSUE2NCAoSXRhbml1bSkgU1VCLVBMQVRGT1JNCi1QOglKZXMgU29yZW5zZW4KLU06CWplc0BzZ2kuY29tCi1MOglsaW51eC1hbHRpeEBzZ2kuY29tCi1MOglsaW51eC1pYTY0QHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL3d3dy5zZ2kuY29tL2FsdGl4Ci1TOglNYWludGFpbmVkCi0KIElCTSBNQ0EgU0NTSSBTVUJTWVNURU0gRFJJVkVSCiBQOglNaWNoYWVsIExhbmcKIE06CWxhbmdhMkBrcGgudW5pLW1haW56LmRlCkBAIC0yMTA2LDIwICsyMTMxLDEyIEBACiBQOglTZWFuIEhlZnR5CiBNOglzZWFuLmhlZnR5QGludGVsLmNvbQogUDoJSGFsIFJvc2Vuc3RvY2sKLU06CWhhbC5yb3NlbnN0b2NrQGdtYWlsLmNvbSAKK006CWhhbC5yb3NlbnN0b2NrQGdtYWlsLmNvbQogTDoJZ2VuZXJhbEBsaXN0cy5vcGVuZmFicmljcy5vcmcKIFc6CWh0dHA6Ly93d3cub3BlbmliLm9yZy8KIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvcm9sYW5kL2luZmluaWJhbmQuZ2l0CiBTOglTdXBwb3J0ZWQKIAotSU5QVVQgKEtFWUJPQVJELCBNT1VTRSwgSk9ZU1RJQ0ssIFRPVUNIU0NSRUVOKSBEUklWRVJTCi1QOglEbWl0cnkgVG9yb2tob3YKLU06CWRtaXRyeS50b3Jva2hvdkBnbWFpbC5jb20KLU06CWR0b3JAbWFpbC5ydQotTDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2R0b3IvaW5wdXQuZ2l0Ci1TOglNYWludGFpbmVkCi0KIElOT1RJRlkKIFA6CUpvaG4gTWNDdXRjaGFuCiBNOgl0dGJAdGVudGFjbGUuZGhzLm9yZwpAQCAtMjEyOCw2ICsyMTQ1LDE0IEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0lOUFVUIChLRVlCT0FSRCwgTU9VU0UsIEpPWVNUSUNLLCBUT1VDSFNDUkVFTikgRFJJVkVSUworUDoJRG1pdHJ5IFRvcm9raG92CitNOglkbWl0cnkudG9yb2tob3ZAZ21haWwuY29tCitNOglkdG9yQG1haWwucnUKK0w6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kdG9yL2lucHV0LmdpdAorUzoJTWFpbnRhaW5lZAorCiBJTlRFTCBGUkFNRUJVRkZFUiBEUklWRVIgKGV4Y2x1ZGluZyA4MTAgYW5kIDgxNSkKIFA6CVN5bHZhaW4gTWV5ZXIKIE06CXN5bHZhaW4ubWV5ZXJAd29ybGRvbmxpbmUuZnIKQEAgLTIyMzIsNyArMjI1Nyw3IEBACiBMOglsaW51eC1taXBzQGxpbnV4LW1pcHMub3JnCiBTOglNYWludGFpbmVkCiAKLUlQIE1BU1FVRVJBRElORzoKK0lQIE1BU1FVRVJBRElORwogUDoJSnVhbmpvIENpYXJsYW50ZQogTToJampjaWFybGFAcmFpei51bmN1LmVkdS5hcgogUzoJTWFpbnRhaW5lZApAQCAtMjI0Nyw3ICsyMjcyLDcgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotSVBBVEggRFJJVkVSOgorSVBBVEggRFJJVkVSCiBQOglSYWxwaCBDYW1wYmVsbAogTToJaW5maW5pcGF0aEBxbG9naWMuY29tCiBMOglnZW5lcmFsQGxpc3RzLm9wZW5mYWJyaWNzLm9yZwpAQCAtMjI2MSwxMyArMjI4NiwyNSBAQAogVzoJaHR0cDovL29wZW5pcG1pLnNvdXJjZWZvcmdlLm5ldC8KIFM6CVN1cHBvcnRlZAogCi1JUFggTkVUV09SSyBMQVlFUgotUDoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCi1NOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAotTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworSVBTIFNDU0kgUkFJRCBEUklWRVIKK1A6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCitNOglhYWNyYWlkQGFkYXB0ZWMuY29tCitMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5hZGFwdGVjLmNvbS8KIFM6CU1haW50YWluZWQKIAotSVBXSVJFTEVTIERSSVZFUgorSVBWUworUDoJV2Vuc29uZyBaaGFuZworTToJd2Vuc29uZ0BsaW51eC12cy5vcmcKK1A6CVNpbW9uIEhvcm1hbgorTToJaG9ybXNAdmVyZ2UubmV0LmF1CitQOglKdWxpYW4gQW5hc3Rhc292CitNOglqYUBzc2kuYmcKK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWx2cy1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworSVBXSVJFTEVTUyBEUklWRVIKIFA6CUppcmkgS29zaW5hCiBNOglqa29zaW5hQHN1c2UuY3oKIFA6CURhdmlkIFN0ZXJiYQpAQCAtMjI3NSw2ICsyMzEyLDEyIEBACiBTOglNYWludGFpbmVkCiBUOglnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamlrb3MvaXB3aXJlbGVzc19jcy5naXQKIAorSVBYIE5FVFdPUksgTEFZRVIKK1A6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbworTToJYWNtZUBnaG9zdHByb3RvY29scy5uZXQKK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogSVJEQSBTVUJTWVNURU0KIFA6CVNhbXVlbCBPcnRpegogTToJc2FtdWVsQHNvcnRpei5vcmcKQEAgLTIyODIsNiArMjMyNSwxMSBAQAogVzoJaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCitJU0FQTlAKK1A6CUphcm9zbGF2IEt5c2VsYQorTToJcGVyZXhAcGVyZXguY3oKK1M6CU1haW50YWluZWQKKwogSVNDU0kKIFA6CU1pa2UgQ2hyaXN0aWUKIE06CW1pY2hhZWxjQGNzLndpc2MuZWR1CkBAIC0yMjkwLDExICsyMzM4LDYgQEAKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9tbmMvbGludXgtMi42LWlzY3NpLmdpdAogUzoJTWFpbnRhaW5lZAogCi1JU0FQTlAKLVA6CUphcm9zbGF2IEt5c2VsYQotTToJcGVyZXhAcGVyZXguY3oKLVM6CU1haW50YWluZWQKLQogSVNETiBTVUJTWVNURU0KIFA6CUthcnN0ZW4gS2VpbAogTToJa2tlaWxAc3VzZS5kZQpAQCAtMjMxOSwyMyArMjM2Miw2IEBACiBXOglodHRwOi8vd3d3Lml2dHZkcml2ZXIub3JnCiBTOglNYWludGFpbmVkCiAKLUpPVVJOQUxMSU5HIEZMQVNIIEZJTEUgU1lTVEVNIFYyIChKRkZTMikKLVA6CURhdmlkIFdvb2Rob3VzZQotTToJZHdtdzJAaW5mcmFkZWFkLm9yZwotTDoJbGludXgtbXRkQGxpc3RzLmluZnJhZGVhZC5vcmcKLVc6CWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvZG9jL2pmZnMyLmh0bWwKLVM6CU1haW50YWluZWQKLQotVUJJIEZJTEUgU1lTVEVNIChVQklGUykKLVA6CUFydGVtIEJpdHl1dHNraXkKLU06CWRlZGVraW5kQGluZnJhZGVhZC5vcmcKLVA6CUFkcmlhbiBIdW50ZXIKLU06CWV4dC1hZHJpYW4uaHVudGVyQG5va2lhLmNvbQotTDoJbGludXgtbXRkQGxpc3RzLmluZnJhZGVhZC5vcmcKLVQ6CWdpdCBnaXQ6Ly9naXQuaW5mcmFkZWFkLm9yZy9+ZGVkZWtpbmQvdWJpZnMtMi42LmdpdAotVzoJaHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy9kb2MvdWJpZnMuaHRtbAotUzoJTWFpbnRhaW5lZAotCiBKRlMgRklMRVNZU1RFTQogUDoJRGF2ZSBLbGVpa2FtcAogTToJc2hhZ2d5QGF1c3Rpbi5pYm0uY29tCkBAIC0yMzQ0LDYgKzIzNzAsMTkgQEAKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc2hhZ2d5L2pmcy0yLjYuZ2l0CiBTOglTdXBwb3J0ZWQKIAorSk1FIE5FVFdPUksgRFJJVkVSCitQOglHdW8tRnUgVHNlbmcKK006CWNvb2xkYXZpZEBjb29sZGF2aWQub3JnCitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKK0pPVVJOQUxMSU5HIEZMQVNIIEZJTEUgU1lTVEVNIFYyIChKRkZTMikKK1A6CURhdmlkIFdvb2Rob3VzZQorTToJZHdtdzJAaW5mcmFkZWFkLm9yZworTDoJbGludXgtbXRkQGxpc3RzLmluZnJhZGVhZC5vcmcKK1c6CWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvZG9jL2pmZnMyLmh0bWwKK1M6CU1haW50YWluZWQKKwogSk9VUk5BTExJTkcgTEFZRVIgRk9SIEJMT0NLIERFVklDRVMgKEpCRCkKIFA6CVN0ZXBoZW4gVHdlZWRpZSwgQW5kcmV3IE1vcnRvbgogTToJc2N0QHJlZGhhdC5jb20sIGFrcG1AbGludXgtZm91bmRhdGlvbi5vcmcKQEAgLTI0MDksNyArMjQ0OCwxNCBAQAogCiBLRVJORUwgVklSVFVBTCBNQUNISU5FIChLVk0pCiBQOglBdmkgS2l2aXR5Ci1NOglhdmlAcXVtcmFuZXQuY29tCitNOglhdmlAcmVkaGF0LmNvbQorTDoJa3ZtQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2t2bS5xdW1yYW5ldC5jb20KK1M6CVN1cHBvcnRlZAorCitLRVJORUwgVklSVFVBTCBNQUNISU5FIChLVk0pIEZPUiBBTUQtVgorUDoJSm9lcmcgUm9lZGVsCitNOglqb2VyZy5yb2VkZWxAYW1kLmNvbQogTDoJa3ZtQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2t2bS5xdW1yYW5ldC5jb20KIFM6CVN1cHBvcnRlZApAQCAtMjU4MCwxMSArMjYyNiw2IEBACiBMOglsaW51eHBwYy1kZXZAb3psYWJzLm9yZwogUzoJU3VwcG9ydGVkCiAKLUxMQyAoODAyLjIpCi1QOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KLU06CWFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0Ci1TOglNYWludGFpbmVkCi0KIExJTlVYIFNFQ1VSSVRZIE1PRFVMRSAoTFNNKSBGUkFNRVdPUksKIFA6CUNocmlzIFdyaWdodAogTToJY2hyaXN3QHNvdXMtc29sLm9yZwpAQCAtMjU5Miw2ICsyNjMzLDExIEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Nocmlzdy9sc20tMi42LmdpdAogUzoJU3VwcG9ydGVkCiAKK0xMQyAoODAyLjIpCitQOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KK006CWFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CitTOglNYWludGFpbmVkCisKIExNODMgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCkBAIC0yNjkyLDE5ICsyNzM4LDEyIEBACiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLU1BUlZFTEwgWVVLT04gLyBTWVNLT05ORUNUIERSSVZFUgotUDoJTWlya28gTGluZG5lcgotTTogCW1saW5kbmVyQHN5c2tvbm5lY3QuZGUKLVA6CVJhbHBoIFJvZXNsZXIKLU06IAlycm9lc2xlckBzeXNrb25uZWN0LmRlCi1XOiAJaHR0cDovL3d3dy5zeXNrb25uZWN0LmNvbQotUzogCVN1cHBvcnRlZAotCiBNQU4tUEFHRVM6IE1BTlVBTCBQQUdFUyBGT1IgTElOVVggLS0gU2VjdGlvbnMgMiwgMywgNCwgNSwgYW5kIDcKIFA6CU1pY2hhZWwgS2VycmlzawogTToJbXRrLm1hbnBhZ2VzQGdtYWlsLmNvbQotVzogICAgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9kb2MvbWFuLXBhZ2VzCi1TOiAgICAgU3VwcG9ydGVkCitXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL21hbi1wYWdlcworTDoJbGludXgtbWFuQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCiAKIE1BUlZFTEwgTElCRVJUQVMgV0lSRUxFU1MgRFJJVkVSCiBQOglEYW4gV2lsbGlhbXMKQEAgLTI3MTgsNiArMjc1NywxNCBAQAogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKK01BUlZFTEwgWVVLT04gLyBTWVNLT05ORUNUIERSSVZFUgorUDoJTWlya28gTGluZG5lcgorTToJbWxpbmRuZXJAc3lza29ubmVjdC5kZQorUDoJUmFscGggUm9lc2xlcgorTToJcnJvZXNsZXJAc3lza29ubmVjdC5kZQorVzoJaHR0cDovL3d3dy5zeXNrb25uZWN0LmNvbQorUzoJU3VwcG9ydGVkCisKIE1BVFJPWCBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CVBldHIgVmFuZHJvdmVjCiBNOgl2YW5kcm92ZUB2Yy5jdnV0LmN6CkBAIC0yNzMzLDcgKzI3ODAsNyBAQAogTUVHQVJBSUQgU0NTSSBEUklWRVJTCiBQOglOZWVsYSBTeWFtIEtvbGxpCiBNOgltZWdhcmFpZGxpbnV4QGxzaS5jb20KLVM6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL21lZ2FyYWlkLmxzaWxvZ2ljLmNvbQogUzoJTWFpbnRhaW5lZAogCkBAIC0yNzU0LDE1ICsyODAxLDYgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotTUVJIE1OMTAzMDAvQU0zMyBQT1JUCi1QOglEYXZpZCBIb3dlbGxzCi1NOglkaG93ZWxsc0ByZWRoYXQuY29tCi1QOglLb2ljaGkgWWFzdXRha2UKLU06CXlhc3V0YWtlLmtvaWNoaUBqcC5wYW5hc29uaWMuY29tCi1MOglsaW51eC1hbTMzLWxpc3RAcmVkaGF0LmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCi1XOglmdHA6Ly9mdHAucmVkaGF0LmNvbS9wdWIvcmVkaGF0L2dudXByby9BTTMzLwotUzoJTWFpbnRhaW5lZAotCiBNRU1PUlkgVEVDSE5PTE9HWSBERVZJQ0VTIChNVEQpCiBQOglEYXZpZCBXb29kaG91c2UKIE06CWR3bXcyQGluZnJhZGVhZC5vcmcKQEAgLTI3NzEsMTQgKzI4MDksNiBAQAogVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL210ZC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKLVVOU09SVEVEIEJMT0NLIElNQUdFUyAoVUJJKQotUDoJQXJ0ZW0gQml0eXV0c2tpeQotTToJZGVkZWtpbmRAaW5mcmFkZWFkLm9yZwotVzoJaHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy8KLUw6CWxpbnV4LW10ZEBsaXN0cy5pbmZyYWRlYWQub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvfmRlZGVraW5kL3ViaS0yLjYuZ2l0Ci1TOglNYWludGFpbmVkCi0KIE1JQ1JPVEVLIFg2IFNDQU5ORVIKIFA6CU9saXZlciBOZXVrdW0KIE06CW9saXZlckBuZXVrdW0ubmFtZQpAQCAtMjg1MSw3ICsyODgxLDcgQEAKIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0CiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1TOglPZGQgZml4ZXMKK1M6CU9kZCBGaXhlcwogCiBNVUxUSVNPVU5EIFNPVU5EIERSSVZFUgogUDoJQW5kcmV3IFZlbGlhdGgKQEAgLTI4NjUsMTAgKzI4OTUsMTAgQEAKIFM6CU1haW50YWluZWQKIAogTVVTQiBNVUxUSVBPSU5UIEhJR0ggU1BFRUQgRFVBTC1ST0xFIENPTlRST0xMRVIKLVA6ICAgICBGZWxpcGUgQmFsYmkKLU06ICAgICBmZWxpcGUuYmFsYmlAbm9raWEuY29tCi1MOiAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotUzogICAgIE1haW50YWluZWQKK1A6CUZlbGlwZSBCYWxiaQorTToJZmVsaXBlLmJhbGJpQG5va2lhLmNvbQorTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAogCiBNWVJJQ09NIE1ZUkktMTBHIDEwR2JFIERSSVZFUiAoTVlSSTEwR0UpCiBQOglBbmRyZXcgR2FsbGF0aW4KQEAgLTI4ODAsNyArMjkxMCw3IEBACiBTOglTdXBwb3J0ZWQKIAogTkFUU0VNSSBFVEhFUk5FVCBEUklWRVIgKERQODM4MXgpCi1QOiAJVGltIEhvY2tpbgorUDoJVGltIEhvY2tpbgogTToJdGhvY2tpbkBob2NraW4ub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTMwMTAsMTcgKzMwNDAsNiBAQAogVzoJaHR0cDovL3d3dy5uZXR4ZW4uY29tCiBTOglTdXBwb3J0ZWQKIAotSVBWUwotUDoJV2Vuc29uZyBaaGFuZwotTToJd2Vuc29uZ0BsaW51eC12cy5vcmcKLVA6CVNpbW9uIEhvcm1hbgotTToJaG9ybXNAdmVyZ2UubmV0LmF1Ci1QOglKdWxpYW4gQW5hc3Rhc292Ci1NOglqYUBzc2kuYmcKLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKLUw6CWx2cy1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogTkZTLCBTVU5SUEMsIEFORCBMT0NLRCBDTElFTlRTCiBQOglUcm9uZCBNeWtsZWJ1c3QKIE06CVRyb25kLk15a2xlYnVzdEBuZXRhcHAuY29tCkBAIC0zMDY2LDIyICszMDg1LDYgQEAKIEw6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglNYWludGFpbmVkCiAKLU9QRU5DT1JFUyBJMkMgQlVTIERSSVZFUgotUDoJUGV0ZXIgS29yc2dhYXJkCi1NOglqYWNtZXRAc3Vuc2l0ZS5kawotTDoJaTJjQGxtLXNlbnNvcnMub3JnCi1TOglNYWludGFpbmVkCi0KLU9SQUNMRSBDTFVTVEVSIEZJTEVTWVNURU0gMiAoT0NGUzIpCi1QOglNYXJrIEZhc2hlaAotTToJbWZhc2hlaEBzdXNlLmNvbQotUDoJSm9lbCBCZWNrZXIKLU06CWpvZWwuYmVja2VyQG9yYWNsZS5jb20KLUw6CW9jZnMyLWRldmVsQG9zcy5vcmFjbGUuY29tIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKLVc6CWh0dHA6Ly9vc3Mub3JhY2xlLmNvbS9wcm9qZWN0cy9vY2ZzMi8KLVQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWZhc2hlaC9vY2ZzMi5naXQKLVM6CVN1cHBvcnRlZAotCiBPTUZTIEZJTEVTWVNURU0KIFA6CUJvYiBDb3BlbGFuZAogTToJbWVAYm9iY29wZWxhbmQuY29tCkBAIC0zMDk5LDcgKzMxMDIsNyBAQAogUzoJTWFpbnRhaW5lZAogCiBPTU5JVklTSU9OIE9WNzY3MCBTRU5TT1IgRFJJVkVSCi1QOiAgIAlKb25hdGhhbiBDb3JiZXQKK1A6CUpvbmF0aGFuIENvcmJldAogTToJY29yYmV0QGx3bi5uZXQKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogUzoJTWFpbnRhaW5lZApAQCAtMzExNywxMiArMzEyMCwyOCBAQAogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorT1BFTkNPUkVTIEkyQyBCVVMgRFJJVkVSCitQOglQZXRlciBLb3JzZ2FhcmQKK006CWphY21ldEBzdW5zaXRlLmRrCitMOglpMmNAbG0tc2Vuc29ycy5vcmcKK1M6CU1haW50YWluZWQKKwogT1BST0ZJTEUKIFA6CVJvYmVydCBSaWNodGVyCiBNOglyb2JlcnQucmljaHRlckBhbWQuY29tCiBMOglvcHJvZmlsZS1saXN0QGxpc3RzLnNmLm5ldAogUzoJTWFpbnRhaW5lZAogCitPUkFDTEUgQ0xVU1RFUiBGSUxFU1lTVEVNIDIgKE9DRlMyKQorUDoJTWFyayBGYXNoZWgKK006CW1mYXNoZWhAc3VzZS5jb20KK1A6CUpvZWwgQmVja2VyCitNOglqb2VsLmJlY2tlckBvcmFjbGUuY29tCitMOglvY2ZzMi1kZXZlbEBvc3Mub3JhY2xlLmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitXOglodHRwOi8vb3NzLm9yYWNsZS5jb20vcHJvamVjdHMvb2NmczIvCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21mYXNoZWgvb2NmczIuZ2l0CitTOglTdXBwb3J0ZWQKKwogT1JJTk9DTyBEUklWRVIKIFA6CVBhdmVsIFJvc2tpbgogTToJcHJvc2tpQGdudS5vcmcKQEAgLTMxMzQsNiArMzE1MywxNCBAQAogVzoJaHR0cDovL3d3dy5ub25nbnUub3JnL29yaW5vY28vCiBTOglNYWludGFpbmVkCiAKK1A1NCBXSVJFTEVTUyBEUklWRVIKK1A6CU1pY2hhZWwgV3UKK006CWZsYW1pbmdpY2VAc291cm1pbGsubmV0CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9wcmlzbTU0Lm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9td3UvbWFjODAyMTEtZHJpdmVycy5naXQKK1M6CU1haW50YWluZWQKKwogUEEgU0VNSSBFVEhFUk5FVCBEUklWRVIKIFA6CU9sb2YgSm9oYW5zc29uCiBNOglvbG9mQGxpeG9tLm5ldApAQCAtMzE0NiwxMCArMzE3MywzMiBAQAogTDoJaTJjQGxtLXNlbnNvcnMub3JnCiBTOglNYWludGFpbmVkCiAKK1BBTkFTT05JQyBNTjEwMzAwL0FNMzMgUE9SVAorUDoJRGF2aWQgSG93ZWxscworTToJZGhvd2VsbHNAcmVkaGF0LmNvbQorUDoJS29pY2hpIFlhc3V0YWtlCitNOgl5YXN1dGFrZS5rb2ljaGlAanAucGFuYXNvbmljLmNvbQorTDoJbGludXgtYW0zMy1saXN0QHJlZGhhdC5jb20gKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVzoJZnRwOi8vZnRwLnJlZGhhdC5jb20vcHViL3JlZGhhdC9nbnVwcm8vQU0zMy8KK1M6CU1haW50YWluZWQKKwogUEFSQUxMRUwgUE9SVCBTVVBQT1JUCiBMOglsaW51eC1wYXJwb3J0QGxpc3RzLmluZnJhZGVhZC5vcmcgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglPcnBoYW4KIAorUEFSQVZJUlRfT1BTIElOVEVSRkFDRQorUDoJSmVyZW15IEZpdHpoYXJkaW5nZQorTToJamVyZW15QHhlbnNvdXJjZS5jb20KK1A6CUNocmlzIFdyaWdodAorTToJY2hyaXN3QHNvdXMtc29sLm9yZworUDoJWmFjaGFyeSBBbXNkZW4KK006CXphY2hAdm13YXJlLmNvbQorUDoJUnVzdHkgUnVzc2VsbAorTToJcnVzdHlAcnVzdGNvcnAuY29tLmF1CitMOgl2aXJ0dWFsaXphdGlvbkBsaXN0cy5vc2RsLm9yZworTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIFBBUklERSBEUklWRVJTIEZPUiBQQVJBTExFTCBQT1JUIElERSBERVZJQ0VTCiBQOglUaW0gV2F1Z2gKIE06CXRpbUBjeWJlcmVsay5uZXQKQEAgLTMxNjksMTkgKzMyMTgsNiBAQAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9reWxlL3BhcmlzYy0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKLVBBUkFWSVJUX09QUyBJTlRFUkZBQ0UKLVA6CUplcmVteSBGaXR6aGFyZGluZ2UKLU06CWplcmVteUB4ZW5zb3VyY2UuY29tCi1QOglDaHJpcyBXcmlnaHQKLU06CWNocmlzd0Bzb3VzLXNvbC5vcmcKLVA6CVphY2hhcnkgQW1zZGVuCi1NOgl6YWNoQHZtd2FyZS5jb20KLVA6CVJ1c3R5IFJ1c3NlbGwKLU06CXJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdQotTDoJdmlydHVhbGl6YXRpb25AbGlzdHMub3NkbC5vcmcKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CVN1cHBvcnRlZAotCiBQQzg3MzYwIEhBUkRXQVJFIE1PTklUT1JJTkcgRFJJVkVSCiBQOglKaW0gQ3JvbWllCiBNOglqaW0uY3JvbWllQGdtYWlsLmNvbQpAQCAtMzIwOSw3ICszMjQ1LDcgQEAKIFM6CVN1cHBvcnRlZAogCiBQQ0kgSE9UUExVRyBDT1JFCi1QOiAJS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkKK1A6CUtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpCiBNOglrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20KIFM6CVN1cHBvcnRlZAogCkBAIC0zMzExLDE0ICszMzQ3LDYgQEAKIFc6CWZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL3JtbC9wcmVlbXB0LWtlcm5lbAogUzoJU3VwcG9ydGVkCiAKLVA1NCBXSVJFTEVTUyBEUklWRVIKLVA6CU1pY2hhZWwgV3UKLU06CWZsYW1pbmdpY2VAc291cm1pbGsubmV0Ci1MOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9wcmlzbTU0Lm9yZwotVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9td3UvbWFjODAyMTEtZHJpdmVycy5naXQKLVM6CU1haW50YWluZWQKLQogUFJJU001NCBXSVJFTEVTUyBEUklWRVIKIFA6CUx1aXMgUi4gUm9kcmlndWV6CiBNOgltY2dyb2ZAZ21haWwuY29tCkBAIC0zMzgzLDYgKzM0MTEsMTMgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogCitRTE9HSUMgUUxHRSAxMEdiIEVUSEVSTkVUIERSSVZFUgorUDoJUm9uIE1lcmNlcgorTToJbGludXgtZHJpdmVyQHFsb2dpYy5jb20KK006CXJvbi5tZXJjZXJAcWxvZ2ljLmNvbQorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIFFOWDQgRklMRVNZU1RFTQogUDoJQW5kZXJzIExhcnNlbgogTToJYWxAYWxhcnNlbi5uZXQKQEAgLTM0MDIsMTMgKzM0MzcsNyBAQAogTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKIAotUkFZTElOSy9XRUJHRUFSIDgwMi4xMSBXSVJFTEVTUyBMQU4gRFJJVkVSCi1QOglDb3JleSBUaG9tYXMKLU06CWNvcmV5dGhvbWFzQGNoYXJ0ZXIubmV0Ci1MOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQotUkFMSU5LIFJUMlgwMCBXTEFOIERSSVZFUgorUkFMSU5LIFJUMlgwMCBXSVJFTEVTUyBMQU4gRFJJVkVSCiBQOglydDJ4MDAgcHJvamVjdAogTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBMOglydDI0MDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CkBAIC0zNDMzLDYgKzM0NjIsMTggQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorUkFZTElOSy9XRUJHRUFSIDgwMi4xMSBXSVJFTEVTUyBMQU4gRFJJVkVSCitQOglDb3JleSBUaG9tYXMKK006CWNvcmV5dGhvbWFzQGNoYXJ0ZXIubmV0CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworUkNVVE9SVFVSRSBNT0RVTEUKK1A6CUpvc2ggVHJpcGxldHQKK006CWpvc2hAZnJlZWRlc2t0b3Aub3JnCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKIFJEQyBSLTMyMVggU29DCiBQOglGbG9yaWFuIEZhaW5lbGxpCiBNOglmbG9yaWFuLmZhaW5lbGxpQHRlbGVjb21pbnQuZXUKQEAgLTM0NTIsMTIgKzM0OTMsNiBAQAogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKLVJDVVRPUlRVUkUgTU9EVUxFCi1QOglKb3NoIFRyaXBsZXR0Ci1NOglqb3NoQGZyZWVkZXNrdG9wLm9yZwotTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCiBSRUFMIFRJTUUgQ0xPQ0sgRFJJVkVSCiBQOglQYXVsIEdvcnRtYWtlcgogTToJcF9nb3J0bWFrZXJAeWFob28uY29tCkBAIC0zNDgxLDYgKzM1MTYsOSBAQAogUzoJTWFpbnRhaW5lZAogRjoJbmV0L3Jma2lsbAogCitSSVNDT004IERSSVZFUgorUzoJT3JwaGFuCisKIFJPQ0tFVFBPUlQgRFJJVkVSCiBQOglDb210cm9sIENvcnAuCiBXOglodHRwOi8vd3d3LmNvbXRyb2wuY29tCkBAIC0zNDkzLDkgKzM1MzEsNiBAQAogVzoJaHR0cDovL3d3dy5saW51eC1heDI1Lm9yZy8KIFM6CU1haW50YWluZWQKIAotUklTQ09NOCBEUklWRVIKLVM6CU9ycGhhbgotCiBSVEw4MThYIFdJUkVMRVNTIERSSVZFUgogUDoJTWljaGFlbCBXdQogTToJZmxhbWluZ2ljZUBzb3VybWlsay5uZXQKQEAgLTM2MzUsNiArMzY3MCwxMiBAQAogTDoJc2RyaWNvaGNzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAorU0VDVVJFIERJR0lUQUwgSE9TVCBDT05UUk9MTEVSIElOVEVSRkFDRSAoU0RIQ0kpIERSSVZFUgorUDoJUGllcnJlIE9zc21hbgorTToJZHJ6ZXVzLXNkaGNpQGRyemV1cy5jeAorTDoJc2RoY2ktZGV2ZWxAbGlzdC5kcnpldXMuY3gKK1M6CU1haW50YWluZWQKKwogU0VDVVJJVFkgQ09OVEFDVAogUDoJU2VjdXJpdHkgT2ZmaWNlcnMKIE06CXNlY3VyaXR5QGtlcm5lbC5vcmcKQEAgLTM2NDksNyArMzY5MCw4IEBACiBNOgllcGFyaXNAcGFyaXNwbGFjZS5vcmcKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcgKGtlcm5lbCBpc3N1ZXMpCiBMOiAJc2VsaW51eEB0eWNoby5uc2EuZ292IChzdWJzY3JpYmVycy1vbmx5LCBnZW5lcmFsIGRpc2N1c3Npb24pCi1XOglodHRwOi8vd3d3Lm5zYS5nb3Yvc2VsaW51eAorVzoJaHR0cDovL3NlbGludXhwcm9qZWN0Lm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6cHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ptb3JyaXMvc2VjdXJpdHktdGVzdGluZy0yLjYuZ2l0CiBTOglTdXBwb3J0ZWQKIAogU0VOU0FCTEUgUEhBTlRPTQpAQCAtMzY1NywxOSArMzY5OSwxMyBAQAogTToJamlyaXNsYWJ5QGdtYWlsLmNvbQogUzoJTWFpbnRhaW5lZAogCi1TRVJJQUwgQVRBIChTQVRBKSBTVUJTWVNURU06CitTRVJJQUwgQVRBIChTQVRBKSBTVUJTWVNURU0KIFA6CUplZmYgR2FyemlrCiBNOglqZ2FyemlrQHBvYm94LmNvbQogTDoJbGludXgtaWRlQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qZ2FyemlrL2xpYmF0YS1kZXYuZ2l0CiBTOglTdXBwb3J0ZWQKIAotU0dJIFNOLUlBNjQgKEFsdGl4KSBTRVJJQUwgQ09OU09MRSBEUklWRVIKLVA6CVBhdCBHZWZyZQotTToJcGZnQHNnaS5jb20KLUw6CWxpbnV4LWlhNjRAdmdlci5rZXJuZWwub3JnCi1TOglTdXBwb3J0ZWQKLQogU0ZDIE5FVFdPUksgRFJJVkVSCiBQOglTdGV2ZSBIb2Rnc29uCiBQOglCZW4gSHV0Y2hpbmdzCkBAIC0zNjc3LDYgKzM3MTMsMTcgQEAKIE06CWxpbnV4LW5ldC1kcml2ZXJzQHNvbGFyZmxhcmUuY29tCiBTOglTdXBwb3J0ZWQKIAorU0dJIEdSVSBEUklWRVIKK1A6CUphY2sgU3RlaW5lcgorTToJc3RlaW5lckBzZ2kuY29tCitTOglNYWludGFpbmVkCisKK1NHSSBTTi1JQTY0IChBbHRpeCkgU0VSSUFMIENPTlNPTEUgRFJJVkVSCitQOglQYXQgR2VmcmUKK006CXBmZ0BzZ2kuY29tCitMOglsaW51eC1pYTY0QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIFNHSSBWSVNVQUwgV09SS1NUQVRJT04gMzIwIEFORCA1NDAKIFA6CUFuZHJleSBQYW5pbgogTToJcGF6a2VAZG9ucGFjLnJ1CkBAIC0zNjg0LDE2ICszNzMxLDI0IEBACiBXOglodHRwOi8vbGludXgtdmlzd3Muc2YubmV0CiBTOglNYWludGFpbmVkIGZvciAyLjYuCiAKLVNHSSBHUlUgRFJJVkVSCi1QOglKYWNrIFN0ZWluZXIKLU06CXN0ZWluZXJAc2dpLmNvbQotUzoJTWFpbnRhaW5lZAotCiBTR0kgWFAvWFBDL1hQTkVUIERSSVZFUgogUDoJRGVhbiBOZWxzb24KIE06CWRjbkBzZ2kuY29tCiBTOglNYWludGFpbmVkCiAKK1NIQVJQIExIIFNVUFBPUlQgKExINzk1MlggJiBMSDdBNDBYKQorUDoJTWFyYyBTaW5nZXIKK006CWVsZkBidWljaS5jb20KK1c6CWh0dHA6Ly9wcm9qZWN0cy5idWljaS5jb20vYXJtCitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmFybS5saW51eC5vcmcudWsJKHN1YnNjcmliZXJzLW9ubHkpCitTOglNYWludGFpbmVkCisKK1NIUEMgSE9UUExVRyBEUklWRVIKK1A6CUtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpCitNOglrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20KK0w6CWxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorCiBTSU1URUMgRUIxMTBBVFggKENoYWxpY2UgQ0FUUykKIFA6CUJlbiBEb29rcwogUDoJVmluY2VudCBTYW5kZXJzCkBAIC0zNzI0LDcgKzM3NzksNyBAQAogU0lTIDk2WCBJMkMvU01CVVMgRFJJVkVSCiBQOglNYXJrIE0uIEhvZmZtYW4KIE06CW1ob2ZmbWFuQGxpZ2h0bGluay5jb20KLUw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK0w6CWkyY0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogCiBTSVMgRlJBTUVCVUZGRVIgRFJJVkVSCkBAIC0zNzM5LDYgKzM3OTQsMTIgQEAKIFc6CWh0dHA6Ly93d3cud2luaXNjaGhvZmVyLmF0L2xpbnV4c2lzdXNidmdhLnNodG1sCiBTOglNYWludGFpbmVkCiAKK1NLR0UsIFNLWTIgMTAvMTAwLzEwMDAgR0lHQUJJVCBFVEhFUk5FVCBEUklWRVJTCitQOglTdGVwaGVuIEhlbW1pbmdlcgorTToJc2hlbW1pbmdlckBsaW51eC1mb3VuZGF0aW9uLm9yZworTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBTTEFCIEFMTE9DQVRPUgogUDoJQ2hyaXN0b3BoIExhbWV0ZXIKIE06CWNsQGxpbnV4LWZvdW5kYXRpb24ub3JnCkBAIC0zNzY1LDExICszODI2LDI0IEBACiBNOglibkBuaWFzZGlnaXRhbC5jb20KIFM6CU1haW50YWluZWQKIAorU04tSUE2NCAoSXRhbml1bSkgU1VCLVBMQVRGT1JNCitQOglKZXMgU29yZW5zZW4KK006CWplc0BzZ2kuY29tCitMOglsaW51eC1hbHRpeEBzZ2kuY29tCitMOglsaW51eC1pYTY0QHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5zZ2kuY29tL2FsdGl4CitTOglNYWludGFpbmVkCisKIFNPQy1DQU1FUkEgVjRMMiBTVUJTWVNURU0KLVA6ICAgICBHdWVubmFkaSBMaWFraG92ZXRza2kKLU06ICAgICBnLmxpYWtob3ZldHNraUBnbXguZGUKLUw6ICAgICB2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KLVM6ICAgICBNYWludGFpbmVkCitQOglHdWVubmFkaSBMaWFraG92ZXRza2kKK006CWcubGlha2hvdmV0c2tpQGdteC5kZQorTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitTOglNYWludGFpbmVkCisKK1NPRUtSSVMgTkVUNDhYWCBMRUQgU1VQUE9SVAorUDoJQ2hyaXMgQm9vdAorTToJYm9vdGNAYm9vdGMubmV0CitTOglNYWludGFpbmVkCiAKIFNPRlRXQVJFIFJBSUQgKE11bHRpcGxlIERpc2tzKSBTVVBQT1JUCiBQOglJbmdvIE1vbG5hcgpAQCAtMzc3OSwyNCArMzg1Myw2IEBACiBMOglsaW51eC1yYWlkQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKLUhJQkVSTkFUSU9OIChha2EgU29mdHdhcmUgU3VzcGVuZCwgYWthIHN3c3VzcCk6Ci1QOglQYXZlbCBNYWNoZWsKLU06CXBhdmVsQHN1c2UuY3oKLVA6CVJhZmFlbCBKLiBXeXNvY2tpCi1NOglyandAc2lzay5wbAotTDoJbGludXgtcG1AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKLVM6CVN1cHBvcnRlZAotCi1TVVNQRU5EIFRPIFJBTToKLVA6CUxlbiBCcm93bgotTToJbGVuLmJyb3duQGludGVsLmNvbQotUDoJUGF2ZWwgTWFjaGVrCi1NOglwYXZlbEBzdXNlLmN6Ci1QOglSYWZhZWwgSi4gV3lzb2NraQotTToJcmp3QHNpc2sucGwKLUw6CWxpbnV4LXBtQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCi1TOglTdXBwb3J0ZWQKLQogU09OSUMgTkVUV09SSyBEUklWRVIKIFA6CVRob21hcyBCb2dlbmRvZXJmZXIKIE06CXRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUKQEAgLTM4MjYsNzEgKzM4ODIsMjIgQEAKIFNPVU5ECiBQOglKYXJvc2xhdiBLeXNlbGEKIE06CXBlcmV4QHBlcmV4LmN6CitQOglUYWthc2hpIEl3YWkKK006CXRpd2FpQHN1c2UuZGUKIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAogU09VTkQgLSBTT0MgTEFZRVIgLyBEWU5BTUlDIEFVRElPIFBPV0VSIE1BTkFHRU1FTlQKIFA6CUxpYW0gR2lyZHdvb2QKLU06CWxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbQorTToJbHJnQHNsaW1sb2dpYy5jby51awogUDoJTWFyayBCcm93bgogTToJYnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20KIFQ6CWdpdCBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20vbGludXgtMi42LWFzb2MKIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAoc3Vic2NyaWJlcnMtb25seSkKK1c6CWh0dHA6Ly9hbHNhLXByb2plY3Qub3JnL21haW4vaW5kZXgucGhwL0FTb0MKIFM6CVN1cHBvcnRlZAogCi1TUEkgU1VCU1lTVEVNCi1QOglEYXZpZCBCcm93bmVsbAotTToJZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotTDoJc3BpLWRldmVsLWdlbmVyYWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1TOglNYWludGFpbmVkCi0KLVNQVSBGSUxFIFNZU1RFTQotUDoJSmVyZW15IEtlcnIKLU06CWprQG96bGFicy5vcmcKLUw6CWxpbnV4cHBjLWRldkBvemxhYnMub3JnCi1MOgljYmUtb3NzLWRldkBvemxhYnMub3JnCi1XOglodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvcG93ZXIvY2VsbC8KLVM6CVN1cHBvcnRlZAotCi1TVEFCTEUgQlJBTkNIOgotUDoJR3JlZyBLcm9haC1IYXJ0bWFuCi1NOglncmVnQGtyb2FoLmNvbQotUDoJQ2hyaXMgV3JpZ2h0Ci1NOgljaHJpc3dAc291cy1zb2wub3JnCi1MOglzdGFibGVAa2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCi1TSEFSUCBMSCBTVVBQT1JUIChMSDc5NTJYICYgTEg3QTQwWCkKLVA6CU1hcmMgU2luZ2VyCi1NOgllbGZAYnVpY2kuY29tCi1XOglodHRwOi8vcHJvamVjdHMuYnVpY2kuY29tL2FybQotTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5hcm0ubGludXgub3JnLnVrCShzdWJzY3JpYmVycy1vbmx5KQotUzoJTWFpbnRhaW5lZAotCi1TSFBDIEhPVFBMVUcgRFJJVkVSCi1QOglLcmlzdGVuIENhcmxzb24gQWNjYXJkaQotTToJa3Jpc3Rlbi5jLmFjY2FyZGlAaW50ZWwuY29tCi1MOglsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCi1TOglTdXBwb3J0ZWQKLQotU0VDVVJFIERJR0lUQUwgSE9TVCBDT05UUk9MTEVSIElOVEVSRkFDRSBEUklWRVIKLVA6CVBpZXJyZSBPc3NtYW4KLU06CWRyemV1cy1zZGhjaUBkcnpldXMuY3gKLUw6CXNkaGNpLWRldmVsQGxpc3QuZHJ6ZXVzLmN4Ci1TOglNYWludGFpbmVkCi0KLVNLR0UsIFNLWTIgMTAvMTAwLzEwMDAgR0lHQUJJVCBFVEhFUk5FVCBEUklWRVJTCi1QOglTdGVwaGVuIEhlbW1pbmdlcgotTToJc2hlbW1pbmdlckBsaW51eC1mb3VuZGF0aW9uLm9yZwotTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCi1TT0VLUklTIE5FVDQ4WFggTEVEIFNVUFBPUlQKLVA6CUNocmlzIEJvb3QKLU06CWJvb3RjQGJvb3RjLm5ldAotUzoJTWFpbnRhaW5lZAotCi1TUEFSQyAoc3BhcmMzMik6CitTUEFSQyAoc3BhcmMzMikKIFA6CVdpbGxpYW0gTC4gSXJ3aW4KIE06CXdsaUBob2xvbW9ycGh5LmNvbQogTDoJc3BhcmNsaW51eEB2Z2VyLmtlcm5lbC5vcmcKQEAgLTM5MDIsNiArMzkwOSwxMiBAQAogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZyA/CiBTOglTdXBwb3J0ZWQKIAorU1BJIFNVQlNZU1RFTQorUDoJRGF2aWQgQnJvd25lbGwKK006CWRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKK0w6CXNwaS1kZXZlbC1nZW5lcmFsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorUzoJTWFpbnRhaW5lZAorCiBTUElERVJORVQgTkVUV09SSyBEUklWRVIgZm9yIENFTEwKIFA6CUlzaGl6YWtpIEtvdQogTToJa291LmlzaGl6YWtpQHRvc2hpYmEuY28uanAKQEAgLTM5MTAsMTIgKzM5MjMsMjggQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogCitTUFUgRklMRSBTWVNURU0KK1A6CUplcmVteSBLZXJyCitNOglqa0BvemxhYnMub3JnCitMOglsaW51eHBwYy1kZXZAb3psYWJzLm9yZworTDoJY2JlLW9zcy1kZXZAb3psYWJzLm9yZworVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL3Bvd2VyL2NlbGwvCitTOglTdXBwb3J0ZWQKKwogU1JNIChBbHBoYSkgZW52aXJvbm1lbnQgYWNjZXNzCiBQOglKYW4tQmVuZWRpY3QgR2xhdwogTToJamJnbGF3QGx1Zy1vd2wuZGUKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorU1RBQkxFIEJSQU5DSDoKK1A6CUdyZWcgS3JvYWgtSGFydG1hbgorTToJZ3JlZ0Brcm9haC5jb20KK1A6CUNocmlzIFdyaWdodAorTToJY2hyaXN3QHNvdXMtc29sLm9yZworTDoJc3RhYmxlQGtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogU1RBUkZJUkUvRFVSQUxBTiBORVRXT1JLIERSSVZFUgogUDoJSW9uIEJhZHVsZXNjdQogTToJaW9udXRAY3MuY29sdW1iaWEuZWR1CkBAIC0zOTIzLDcgKzM5NTIsNyBAQAogCiBTVEFSTU9ERSBSQURJTyBJUCAoU1RSSVApIFBST1RPQ09MIERSSVZFUgogVzoJaHR0cDovL21vc3F1aXRvbmV0LlN0YW5mb3JkLkVEVS9zdHJpcC5odG1sCi1TOglVbnN1cHBvcnRlZCA/CitTOglPcnBoYW4KIAogU1RSQURJUyBNUEVHLTIgREVDT0RFUiBEUklWRVIKIFA6CU5hdGhhbiBMYXJlZG8KQEAgLTM5MzEsNiArMzk2MCwxMiBAQAogVzoJaHR0cDovL3d3dy5zdHJhZGlzLmNvbS8KIFM6CU1haW50YWluZWQKIAorU1VOMy8zWAorUDoJU2FtIENyZWFzZXkKK006CXNhbW15QHNhbW15Lm5ldAorVzoJaHR0cDovL3NhbW15Lm5ldC9zdW4zLworUzoJTWFpbnRhaW5lZAorCiBTVVBFUkgKIFA6CVBhdWwgTXVuZHQKIE06CWxldGhhbEBsaW51eC1zaC5vcmcKQEAgLTM5MzksMTEgKzM5NzQsMTUgQEAKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbGV0aGFsL3NoLTIuNi5naXQKIFM6CVN1cHBvcnRlZAogCi1TVU4zLzNYCi1QOglTYW0gQ3JlYXNleQotTToJc2FtbXlAc2FtbXkubmV0Ci1XOglodHRwOi8vc2FtbXkubmV0L3N1bjMvCi1TOglNYWludGFpbmVkCitTVVNQRU5EIFRPIFJBTQorUDoJTGVuIEJyb3duCitNOglsZW4uYnJvd25AaW50ZWwuY29tCitQOglQYXZlbCBNYWNoZWsKK006CXBhdmVsQHN1c2UuY3oKK1A6CVJhZmFlbCBKLiBXeXNvY2tpCitNOglyandAc2lzay5wbAorTDoJbGludXgtcG1AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKK1M6CVN1cHBvcnRlZAogCiBTVkdBIEhBTkRMSU5HCiBQOglNYXJ0aW4gTWFyZXMKQEAgLTM5ODksNyArNDAyOCw3IEBACiBNOgltYXJrLmdyb3NzQGludGVsLmNvbQogUzoJU3VwcG9ydGVkCiAKLVRFTlNJTElDQSBYVEVOU0EgUE9SVCAoeHRlbnNhKToKK1RFTlNJTElDQSBYVEVOU0EgUE9SVCAoeHRlbnNhKQogUDoJQ2hyaXMgWmFua2VsCiBNOgljaHJpc0B6YW5rZWwubmV0CiBTOglNYWludGFpbmVkCkBAIC00MDA0LDkgKzQwNDMsOSBAQAogUzoJTWFpbnRhaW5lZAogCiBUSSBGTEFTSCBNRURJQSBJTlRFUkZBQ0UgRFJJVkVSCi1QOiAgICAgIEFsZXggRHVib3YKLU06ICAgICAgb2FrYWRAeWFob28uY29tCi1TOiAgICAgIE1haW50YWluZWQKK1A6CUFsZXggRHVib3YKK006CW9ha2FkQHlhaG9vLmNvbQorUzoJTWFpbnRhaW5lZAogCiBUSSBPTUFQIE1NQyBJTlRFUkZBQ0UgRFJJVkVSCiBQOglDYXJsb3MgQWd1aWFyLCBBbmRlcnNvbiBCcmlnbGlhIGFuZCBTeWVkIEtoYXNpbQpAQCAtNDA2Miw3ICs0MTAxLDcgQEAKIFA6CU1hcmNlbCBTZWxob3JzdAogTToJdHBtQHNlbGhvcnN0Lm5ldAogVzoJaHR0cDovL3d3dy5wcm9zZWMucnViLmRlL3RwbS8KLUw6CXRwbWRkLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJdHBtZGQtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKIAogVFJJVklBTCBQQVRDSEVTCkBAIC00MTAzLDYgKzQxNDIsMTYgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1VCSSBGSUxFIFNZU1RFTSAoVUJJRlMpCitQOglBcnRlbSBCaXR5dXRza2l5CitNOglkZWRla2luZEBpbmZyYWRlYWQub3JnCitQOglBZHJpYW4gSHVudGVyCitNOglleHQtYWRyaWFuLmh1bnRlckBub2tpYS5jb20KK0w6CWxpbnV4LW10ZEBsaXN0cy5pbmZyYWRlYWQub3JnCitUOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvfmRlZGVraW5kL3ViaWZzLTIuNi5naXQKK1c6CWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvZG9jL3ViaWZzLmh0bWwKK1M6CU1haW50YWluZWQKKwogVUNMSU5VWCAoQU5EIE02OEtOT01NVSkKIFA6CUdyZWcgVW5nZXJlcgogTToJZ2VyZ0B1Y2xpbnV4Lm9yZwpAQCAtNDEyOCw3ICs0MTc3LDcgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotVWx0cmFTUEFSQyAoc3BhcmM2NCk6CitVbHRyYVNQQVJDIChzcGFyYzY0KQogUDoJRGF2aWQgUy4gTWlsbGVyCiBNOglkYXZlbUBkYXZlbWxvZnQubmV0CiBMOglzcGFyY2xpbnV4QHZnZXIua2VybmVsLm9yZwpAQCAtNDE0Miw2ICs0MTkxLDE0IEBACiBXOglodHRwOi8vd3d3Lmtlcm5lbC5kawogUzoJTWFpbnRhaW5lZAogCitVTlNPUlRFRCBCTE9DSyBJTUFHRVMgKFVCSSkKK1A6CUFydGVtIEJpdHl1dHNraXkKK006CWRlZGVraW5kQGluZnJhZGVhZC5vcmcKK1c6CWh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvCitMOglsaW51eC1tdGRAbGlzdHMuaW5mcmFkZWFkLm9yZworVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL35kZWRla2luZC91YmktMi42LmdpdAorUzoJTWFpbnRhaW5lZAorCiBVU0IgQUNNIERSSVZFUgogUDoJT2xpdmVyIE5ldWt1bQogTToJb2xpdmVyQG5ldWt1bS5uYW1lCkBAIC00MTUyLDEzICs0MjA5LDEzIEBACiBQOglQZXRlIFphaXRjZXYKIE06CXphaXRjZXZAcmVkaGF0LmNvbQogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIAogVVNCIENEQyBFVEhFUk5FVCBEUklWRVIKIFA6CUdyZWcgS3JvYWgtSGFydG1hbgogTToJZ3JlZ0Brcm9haC5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogVzoJaHR0cDovL3d3dy5rcm9haC5jb20vbGludXgtdXNiLwogCkBAIC00MTg1LDEzICs0MjQyLDEzIEBACiBVU0IgRUhDSSBEUklWRVIKIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU9kZCBGaXhlcwogCiBVU0IgRVQ2MVhbMTJdNTEgRFJJVkVSCiBQOglMdWNhIFJpc29saWEKIE06CWx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQKLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZApAQCAtNDE5OSwzMyArNDI1NiwzMyBAQAogVVNCIEdBREdFVC9QRVJJUEhFUkFMIFNVQlNZU1RFTQogUDoJRGF2aWQgQnJvd25lbGwKIE06CWRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5saW51eC11c2Iub3JnL2dhZGdldAogUzoJTWFpbnRhaW5lZAogCiBVU0IgSElEL0hJREJQIERSSVZFUlMgKFVTQiBLRVlCT0FSRFMsIE1JQ0UsIFJFTU9URSBDT05UUk9MUywgLi4uKQogUDoJSmlyaSBLb3NpbmEKIE06CWprb3NpbmFAc3VzZS5jegotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ppa29zL2hpZC5naXQKIFM6CU1haW50YWluZWQKIAogVVNCIElTUDExNlggRFJJVkVSCiBQOglPbGF2IEtvbmdhcwogTToJb2tAYXJ0ZWNkZXNpZ24uZWUKLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBVU0IgS0FXQVNBS0kgTFNJIERSSVZFUgogUDoJT2xpdmVyIE5ldWt1bQogTToJb2xpdmVyQG5ldWt1bS5uYW1lCi1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAogVVNCIE1BU1MgU1RPUkFHRSBEUklWRVIKIFA6CU1hdHRoZXcgRGhhcm0KIE06CW1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0Ci1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CXVzYi1zdG9yYWdlQGxpc3RzLm9uZS1leWVkLWFsaWVuLm5ldAogUzoJTWFpbnRhaW5lZAogVzoJaHR0cDovL3d3dy5vbmUtZXllZC1hbGllbi5uZXQvfm1kaGFybS9saW51eC11c2IvCkBAIC00MjMzLDI2ICs0MjkwLDI2IEBACiBVU0IgT0hDSSBEUklWRVIKIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0Ci1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU9kZCBGaXhlcwogCiBVU0IgT1BUSU9OLUNBUkQgRFJJVkVSCiBQOglNYXR0aGlhcyBVcmxpY2hzCiBNOglzbXVyZkBzbXVyZi5ub3Jpcy5kZQotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKIFVTQiBPVjUxMSBEUklWRVIKIFA6CU1hcmsgTWNDbGVsbGFuZAogTToJbW1jY2xlbGxAYmlnZm9vdC5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL2FscGhhLmR5bmRucy5vcmcvb3Y1MTEvCiBTOglNYWludGFpbmVkCiAKIFVTQiBQRUdBU1VTIERSSVZFUgogUDoJUGV0a28gTWFub2xvdgogTToJcGV0a2FuQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vcGVnYXN1czIuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZApAQCAtNDI2MCwxMyArNDMxNywxMyBAQAogVVNCIFBSSU5URVIgRFJJVkVSICh1c2JscCkKIFA6CVBldGUgWmFpdGNldgogTToJemFpdGNldkByZWRoYXQuY29tCi1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogCiBVU0IgUlRMODE1MCBEUklWRVIKIFA6CVBldGtvIE1hbm9sb3YKIE06CXBldGthbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3BlZ2FzdXMyLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKQEAgLTQyNzQsMjAgKzQzMzEsMjAgQEAKIFVTQiBTRTQwMSBEUklWRVIKIFA6CUplcm9lbiBWcmVla2VuCiBNOglwZTFyeHFAYW1zYXQub3JnCi1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuY2hlbGxvLm5sL35qLnZyZWVrZW4vc2U0MDEvCiBTOglNYWludGFpbmVkCiAKIFVTQiBTRVJJQUwgQkVMS0lOIEY1VTEwMyBEUklWRVIKIFA6CVdpbGxpYW0gR3JlYXRob3VzZQogTToJd2dyZWF0aG91c2VAc212YS5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBVU0IgU0VSSUFMIENZUFJFU1MgTTggRFJJVkVSCiBQOglMb25uaWUgTWVuZGV6CiBNOglkaWdub21lQGdtYWlsLmNvbQotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBXOglodHRwOi8vZ2VvY2l0aWVzLmNvbS9pMHhveDBpCiBXOglodHRwOi8vZmlyc3RsaWdodC5uZXQvY3ZzCkBAIC00MzAyLDM5ICs0MzU5LDQ1IEBACiBQOglQZXRlciBCZXJnZXIgYW5kIEFsIEJvcmNoZXJzCiBNOglwYmVyZ2VyQGJyaW1zb24uY29tCiBNOglhbGJvcmNoZXJzQHN0ZWluZXJwb2ludC5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBVU0IgU0VSSUFMIERSSVZFUgogUDoJR3JlZyBLcm9haC1IYXJ0bWFuCiBNOglncmVna2hAc3VzZS5kZQotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIAogVVNCIFNFUklBTCBFTVBFRyBFTVBFRy1DQVIgTUFSSyBJL0lJIERSSVZFUgogUDoJR2FyeSBCcnViYWtlcgogTToJeGF2eWVyQGl4Lm5ldGNvbS5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBVU0IgU0VSSUFMIEtFWVNQQU4gRFJJVkVSCiBQOglHcmVnIEtyb2FoLUhhcnRtYW4KIE06CWdyZWdAa3JvYWguY29tCi1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cua3JvYWguY29tL2xpbnV4LwogUzoJTWFpbnRhaW5lZAogCiBVU0IgU0VSSUFMIFdISVRFSEVBVCBEUklWRVIKIFA6CVN1cHBvcnQgRGVwYXJ0bWVudAogTToJc3VwcG9ydEBjb25uZWN0dGVjaC5jb20KLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5jb25uZWN0dGVjaC5jb20KIFM6CVN1cHBvcnRlZAogCitVU0IgU01TQzk1WFggRVRIRVJORVQgRFJJVkVSCitQOglTdGV2ZSBHbGVuZGlubmluZworTToJc3RldmUuZ2xlbmRpbm5pbmdAc21zYy5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorCiBVU0IgU045QzF4eCBEUklWRVIKIFA6CUx1Y2EgUmlzb2xpYQogTToJbHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdAotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCkBAIC00MzQyLDcgKzQ0MDUsNyBAQAogVVNCIFNVQlNZU1RFTQogUDoJR3JlZyBLcm9haC1IYXJ0bWFuCiBNOglncmVna2hAc3VzZS5kZQotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcKIFQ6CXF1aWx0IGtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvZ3JlZ2toL2dyZWdraC0yLjYvCiBTOglTdXBwb3J0ZWQKQEAgLTQzNTAsNyArNDQxMyw3IEBACiBVU0IgVUhDSSBEUklWRVIKIFA6CUFsYW4gU3Rlcm4KIE06CXN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHUKLUw6ICAgICAgbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBVU0IgIlVTQk5FVCIgRFJJVkVSIEZSQU1FV09SSwpAQCAtNDM2Myw3ICs0NDI2LDcgQEAKIFVTQiBWSURFTyBDTEFTUwogUDoJTGF1cmVudCBQaW5jaGFydAogTToJbGF1cmVudC5waW5jaGFydEBza3luZXQuYmUKLUw6CWxpbngtdXZjLWRldmVsQGJlcmxpb3MuZGUKK0w6CWxpbnV4LXV2Yy1kZXZlbEBsaXN0cy5iZXJsaW9zLmRlCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KIFc6CWh0dHA6Ly9saW51eC11dmMuYmVybGlvcy5kZQogUzoJTWFpbnRhaW5lZApAQCAtNDM3MSw3ICs0NDM0LDcgQEAKIFVTQiBXOTk2Wzg3XUNGIERSSVZFUgogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0Ci1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKQEAgLTQzODUsNyArNDQ0OCw3IEBACiBVU0IgWkMwMzAxIERSSVZFUgogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0Ci1MOiAgICAgIGxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKQEAgLTQzOTMsMTkgKzQ0NTYsMTkgQEAKIFVTQiBaRDEyMDEgRFJJVkVSCiBQOglKZXJvZW4gVnJlZWtlbgogTToJcGUxcnhxQGFtc2F0Lm9yZwotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vbGludXgtbGMxMDAwMjAuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKIFVTQiBaUjM2NFhYIERSSVZFUgogUDoJQW50b2luZSBKYWNxdWV0CiBNOglyb3lhbGVAemVyZXpvLmNvbQotTDogICAgICBsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KIFc6CWh0dHA6Ly9yb3lhbGUuemVyZXpvLmNvbS96cjM2NHh4LwogUzoJTWFpbnRhaW5lZAogCi1VU0VSLU1PREUgTElOVVgKK1VTRVItTU9ERSBMSU5VWCAoVU1MKQogUDoJSmVmZiBEaWtlCiBNOglqZGlrZUBhZGR0b2l0LmNvbQogTDoJdXNlci1tb2RlLWxpbnV4LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApAQCAtNDQyOSw3ICs0NDkyLDE0IEBACiBUOglnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL3V0aWxzL3V0aWwtbGludXgtbmcvdXRpbC1saW51eC1uZy5naXQKIFM6CU1haW50YWluZWQKIAotVkZBVC9GQVQvTVNET1MgRklMRVNZU1RFTToKK1VWRVNBRkIgRFJJVkVSCitQOglNaWNoYWwgSmFudXN6ZXdza2kKK006CXNwb2NrQGdlbnRvby5vcmcKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitXOglodHRwOi8vZGV2LmdlbnRvby5vcmcvfnNwb2NrL3Byb2plY3RzL3V2ZXNhZmIvCitTOglNYWludGFpbmVkCisKK1ZGQVQvRkFUL01TRE9TIEZJTEVTWVNURU0KIFA6CU9HQVdBIEhpcm9mdW1pCiBNOgloaXJvZnVtaUBtYWlsLnBhcmtuZXQuY28uanAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKQEAgLTQ0NDYsMTMgKzQ1MTYsMjEgQEAKIEw6CWkyY0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogCitWSUEgVU5JQ0hST01FKFBSTykvQ0hST01FOSBGUkFNRUJVRkZFUiBEUklWRVIKK1A6CUpvc2VwaCBDaGFuCitNOglKb3NlcGhDaGFuQHZpYS5jb20udHcKK1A6CVNjb3R0IEZhbmcKK006CVNjb3R0RmFuZ0B2aWF0ZWNoLmNvbS5jbgorTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1M6CU1haW50YWluZWQKKwogVklBIFZFTE9DSVRZIE5FVFdPUksgRFJJVkVSCiBQOglGcmFuY29pcyBSb21pZXUKIE06CXJvbWlldUBmci56b3JlaWwuY29tCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLVZJREVPIEZPUiBMSU5VWAorVklERU8gRk9SIExJTlVYIChWNEwpCiBQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKIE06CW1jaGVoYWJAaW5mcmFkZWFkLm9yZwogTToJdjRsLWR2Yi1tYWludGFpbmVyQGxpbnV4dHYub3JnCkBAIC00NDY5LDEwICs0NTQ3LDExIEBACiAKIFZPTFRBR0UgQU5EIENVUlJFTlQgUkVHVUxBVE9SIEZSQU1FV09SSwogUDoJTGlhbSBHaXJkd29vZAotTToJbGdAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tCitNOglscmdAc2xpbWxvZ2ljLmNvLnVrCiBQOglNYXJrIEJyb3duCiBNOglicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbQogVzoJaHR0cDovL29wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbS9ub2RlLzE1CitXOglodHRwOi8vd3d3LnNsaW1sb2dpYy5jby51ay8/cGFnZV9pZD01CiBUOglnaXQga2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbHJnL3ZvbHRhZ2UtMi42LmdpdAogUzoJU3VwcG9ydGVkCiAKQEAgLTQ1NDYsNyArNDYyNSw3IEBACiBQOglNYXJrIEJyb3duCiBNOglicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbQogUDoJTGlhbSBHaXJkd29vZAotTToJbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tCitNOglscmdAc2xpbWxvZ2ljLmNvLnVrCiBMOglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKIFQ6CWdpdCBnaXQ6Ly9vcGVuc291cmNlLndvbGZzb25taWNyby5jb20vbGludXgtMi42LXRvdWNoCiBXOglodHRwOi8vb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tL25vZGUvNwpAQCAtNDU1OCw2ICs0NjM3LDE3IEBACiBMOglsaW51eC14MjVAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1g4NiBBUkNISVRFQ1RVUkUgKDMyLUJJVCBBTkQgNjQtQklUKQorUDoJVGhvbWFzIEdsZWl4bmVyCitNOgl0Z2x4QGxpbnV0cm9uaXguZGUKK1A6CUluZ28gTW9sbmFyCitNOgltaW5nb0ByZWRoYXQuY29tCitQOglILiBQZXRlciBBbnZpbgorTToJaHBhQHp5dG9yLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworVDoJZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3g4Ni9saW51eC0yLjYteDg2LmdpdAorUzoJTWFpbnRhaW5lZAorCiBYRU4gSFlQRVJWSVNPUiBJTlRFUkZBQ0UKIFA6CUplcmVteSBGaXR6aGFyZGluZ2UKIE06CWplcmVteUB4ZW5zb3VyY2UuY29tCkBAIC00NTg5LDE3ICs0Njc5LDYgQEAKIEw6CWxpbnV4LXNlcmlhbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotWDg2IEFSQ0hJVEVDVFVSRSAoMzItQklUIEFORCA2NC1CSVQpCi1QOglUaG9tYXMgR2xlaXhuZXIKLU06CXRnbHhAbGludXRyb25peC5kZQotUDoJSW5nbyBNb2xuYXIKLU06CW1pbmdvQHJlZGhhdC5jb20KLVA6CUguIFBldGVyIEFudmluCi1NOglocGFAenl0b3IuY29tCi1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1UOglnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQveDg2L2xpbnV4LTIuNi14ODYuZ2l0Ci1TOglNYWludGFpbmVkCi0KIFlBTSBEUklWRVIgRk9SIEFYLjI1CiBQOglKZWFuLVBhdWwgUm91YmVsYXQKIE06CWpwckBmNmZiYi5vcmcKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZjQ0OGUwMC4uMTZlM2ZiYiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMgogUEFUQ0hMRVZFTCA9IDYKIFNVQkxFVkVMID0gMjcKLUVYVFJBVkVSU0lPTiA9IC1yYzUKK0VYVFJBVkVSU0lPTiA9CiBOQU1FID0gUm90YXJ5IFdvbWJhdAogCiAjICpET0NVTUVOVEFUSU9OKgpkaWZmIC0tZ2l0IGEvYXJjaC9LY29uZmlnIGIvYXJjaC9LY29uZmlnCmluZGV4IDM2NGM2ZGEuLmU2YWI1NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvS2NvbmZpZworKysgYi9hcmNoL0tjb25maWcKQEAgLTEzLDggKzEzLDIyIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBPUFJPRklMRV9JQlMKKwlib29sICJPUHJvZmlsZSBBTUQgSUJTIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBPUFJPRklMRSAmJiBTTVAgJiYgWDg2CisJaGVscAorICAgICAgICAgIEluc3RydWN0aW9uLUJhc2VkIFNhbXBsaW5nIChJQlMpIGlzIGEgbmV3IHByb2ZpbGluZworICAgICAgICAgIHRlY2huaXF1ZSB0aGF0IHByb3ZpZGVzIHJpY2gsIHByZWNpc2UgcHJvZ3JhbSBwZXJmb3JtYW5jZQorICAgICAgICAgIGluZm9ybWF0aW9uLiBJQlMgaXMgaW50cm9kdWNlZCBieSBBTUQgRmFtaWx5MTBoIHByb2Nlc3NvcnMKKyAgICAgICAgICAoQU1EIE9wdGVyb24gUXVhZC1Db3JlIHByb2Nlc3NvciDigJxCYXJjZWxvbmHigJ0pIHRvIG92ZXJjb21lCisgICAgICAgICAgdGhlIGxpbWl0YXRpb25zIG9mIGNvbnZlbnRpb25hbCBwZXJmb3JtYW5jZSBjb3VudGVyCisgICAgICAgICAgc2FtcGxpbmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBIQVZFX09QUk9GSUxFCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAogY29uZmlnIEtQUk9CRVMKIAlib29sICJLcHJvYmVzIgpAQCAtMjgsNyArNDIsNyBAQAogCSAgSWYgaW4gZG91YnQsIHNheSAiTiIuCiAKIGNvbmZpZyBIQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAloZWxwCiAJICBTb21lIGFyY2hpdGVjdHVyZXMgYXJlIHVuYWJsZSB0byBwZXJmb3JtIHVuYWxpZ25lZCBhY2Nlc3NlcwogCSAgd2l0aG91dCB0aGUgdXNlIG9mIGdldF91bmFsaWduZWQvcHV0X3VuYWxpZ25lZC4gT3RoZXJzIGFyZQpAQCAtNTEsMTMgKzY1LDEzIEBACiAJZGVwZW5kcyBvbiBLUFJPQkVTICYmIEhBVkVfS1JFVFBST0JFUwogCiBjb25maWcgSEFWRV9JT1JFTUFQX1BST1QKLQlkZWZfYm9vbCBuCisJYm9vbAogCiBjb25maWcgSEFWRV9LUFJPQkVTCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAogY29uZmlnIEhBVkVfS1JFVFBST0JFUwotCWRlZl9ib29sIG4KKwlib29sCiAKICMKICMgQW4gYXJjaCBzaG91bGQgc2VsZWN0IHRoaXMgaWYgaXQgcHJvdmlkZXMgYWxsIHRoZXNlIHRoaW5nczoKQEAgLTc1LDE2ICs4OSwxNiBAQAogIwlzaWduYWwgZGVsaXZlcnkJCWNhbGxzIHRyYWNlaG9va19zaWduYWxfaGFuZGxlcigpCiAjCiBjb25maWcgSEFWRV9BUkNIX1RSQUNFSE9PSwotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBIQVZFX0RNQV9BVFRSUwotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUwotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBIQVZFX0NMSwotCWRlZl9ib29sIG4KKwlib29sCiAJaGVscAogCSAgVGhlIDxsaW51eC9jbGsuaD4gY2FsbHMgc3VwcG9ydCBzb2Z0d2FyZSBjbG9jayBnYXRpbmcgYW5kCiAJICB0aHVzIGFyZSBhIGtleSBwb3dlciBtYW5hZ2VtZW50IHRvb2wgb24gbWFueSBzeXN0ZW1zLgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IDFiZWM1NWQuLmEwZjY0MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTUsNiArNSw3IEBACiBjb25maWcgQUxQSEEKIAlib29sCiAJZGVmYXVsdCB5CisJc2VsZWN0IEhBVkVfQU9VVAogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCiAJaGVscApAQCAtNjgsOSArNjksNiBAQAogCWRlcGVuZHMgb24gU01QCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKLQlkZWZfYm9vbCB5Ci0KIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKQEAgLTIyNCw4ICsyMjIsNyBAQAogCWJvb2wgIk1pYXRhIgogCWhlbHAKIAkgIFRoZSBEaWdpdGFsIFBlcnNvbmFsV29ya1N0YXRpb24gKFBXUyA0MzNhLCA0MzNhdSwgNTAwYSwgNTAwYXUsIDYwMGEsCi0JICBvciA2MDBhdSkuICBUaGVyZSBpcyBhbiBJbnN0YWxsYXRpb24gSE9XVE8gZm9yIHRoaXMgaGFyZHdhcmUgYXQKLQkgIDxodHRwOi8vZWlqay5ob21lbGludXgub3JnL35zdGVmYW4vbWlhdGEuaHRtbD4uCisJICBvciA2MDBhdSkuCiAKIGNvbmZpZyBBTFBIQV9NSUtBU0EKIAlib29sICJNaWthc2EiCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2Eub3V0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2Eub3V0LmgKaW5kZXggMDJjZTg0Ny4uYWNkYzY4MSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9hLm91dC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYS5vdXQuaApAQCAtOTUsNyArOTUsNyBAQAogICAgV29yc2UsIHdlIGhhdmUgdG8gbm90aWNlIHRoZSBzdGFydCBhZGRyZXNzIGJlZm9yZSBzd2FwcGluZyB0byB1c2UKICAgIC9zYmluL2xvYWRlciwgd2hpY2ggb2YgY291cnNlIGlzIF9ub3RfIGEgVEFTTyBhcHBsaWNhdGlvbi4gICovCiAjZGVmaW5lIFNFVF9BT1VUX1BFUlNPTkFMSVRZKEJGUE0sIEVYKSBcCi0Jc2V0X3BlcnNvbmFsaXR5ICgoKEJGUE0tPnNoX2JhbmcgfHwgRVguYWguZW50cnkgPCAweDEwMDAwMDAwMEwgXAorCXNldF9wZXJzb25hbGl0eSAoKChCRlBNLT50YXNvIHx8IEVYLmFoLmVudHJ5IDwgMHgxMDAwMDAwMDBMIFwKIAkJCSAgID8gQUREUl9MSU1JVF8zMkJJVCA6IDApIHwgUEVSX09TRjQpKQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggZmMxMDAyZS4uNWM3NWMxYiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAk6IGFtYXNrIChBTUFTS19DSVgpID8gImV2NiIgOiAiZXY2NyIpOwlcCiB9KQogCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShFWCwgSUJDUzIpCQkJCVwKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKEVYKQkJCQkJXAogCXNldF9wZXJzb25hbGl0eSgoKEVYKS5lX2ZsYWdzICYgRUZfQUxQSEFfMzJCSVQpCQlcCi0JICAgPyBQRVJfTElOVVhfMzJCSVQgOiAoSUJDUzIpID8gUEVSX1NWUjQgOiBQRVJfTElOVVgpCisJICAgPyBQRVJfTElOVVhfMzJCSVQgOiBQRVJfTElOVVgpCiAKIGV4dGVybiBpbnQgYWxwaGFfbDFpX2NhY2hlc2hhcGU7CiBleHRlcm4gaW50IGFscGhhX2wxZF9jYWNoZXNoYXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zdGF0ZnMuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc3RhdGZzLmgKaW5kZXggYWQxNTgzMC4uZGUzNWNkNCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zdGF0ZnMuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3N0YXRmcy5oCkBAIC0xLDYgKzEsMTAgQEAKICNpZm5kZWYgX0FMUEhBX1NUQVRGU19ICiAjZGVmaW5lIF9BTFBIQV9TVEFURlNfSAogCisvKiBBbHBoYSBpcyB0aGUgb25seSA2NC1iaXQgcGxhdGZvcm0gd2l0aCAzMi1iaXQgc3RhdGZzLiBBbmQgZG9lc24ndAorICAgZXZlbiBzZWVtIHRvIGltcGxlbWVudCBzdGF0ZnM2NCAqLworI2RlZmluZSBfX3N0YXRmc193b3JkIF9fdTMyCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zdGF0ZnMuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IDIxNzljNjAuLmI5MDk0ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCkBAIC00MSwxMyArNDEsNiBAQAogCXJldHVybiAocGFkZHIgPj4gKFBBR0VfU0hJRlQtMSkpIHwgMTsKIH0KIAotc3RhdGljIGlubGluZSBsb25nCi1jYWxjX25wYWdlcyhsb25nIGJ5dGVzKQotewotCXJldHVybiAoYnl0ZXMgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotfQotDAotCiAvKiBSZXR1cm4gdGhlIG1pbmltdW0gb2YgTUFYIG9yIHRoZSBmaXJzdCBwb3dlciBvZiB0d28gbGFyZ2VyCiAgICB0aGFuIG1haW4gbWVtb3J5LiAgKi8KIApAQCAtMjg3LDcgKzI4MCw3IEBACiAJaWYgKCFhcmVuYSB8fCBhcmVuYS0+ZG1hX2Jhc2UgKyBhcmVuYS0+c2l6ZSAtIDEgPiBtYXhfZG1hKQogCQlhcmVuYSA9IGhvc2UtPnNnX2lzYTsKIAotCW5wYWdlcyA9IGNhbGNfbnBhZ2VzKChwYWRkciAmIH5QQUdFX01BU0spICsgc2l6ZSk7CisJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHBhZGRyLCBzaXplLCBQQUdFX1NJWkUpOwogCiAJLyogRm9yY2UgYWxsb2NhdGlvbiB0byA2NEtCIGJvdW5kYXJ5IGZvciBJU0EgYnJpZGdlcy4gKi8KIAlpZiAocGRldiAmJiBwZGV2ID09IGlzYV9icmlkZ2UpCkBAIC0zODcsNyArMzgwLDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JbnBhZ2VzID0gY2FsY19ucGFnZXMoKGRtYV9hZGRyICYgflBBR0VfTUFTSykgKyBzaXplKTsKKwlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2FkZHIsIHNpemUsIFBBR0VfU0laRSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXJlbmEtPmxvY2ssIGZsYWdzKTsKIApAQCAtNTgwLDcgKzU3Myw3IEBACiAJICAgY29udGlndW91cy4gICovCiAKIAlwYWRkciAmPSB+UEFHRV9NQVNLOwotCW5wYWdlcyA9IGNhbGNfbnBhZ2VzKHBhZGRyICsgc2l6ZSk7CisJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHBhZGRyLCBzaXplLCBQQUdFX1NJWkUpOwogCWRtYV9vZnMgPSBpb21tdV9hcmVuYV9hbGxvYyhkZXYsIGFyZW5hLCBucGFnZXMsIDApOwogCWlmIChkbWFfb2ZzIDwgMCkgewogCQkvKiBJZiB3ZSBhdHRlbXB0ZWQgYSBkaXJlY3QgbWFwIGFib3ZlIGJ1dCBmYWlsZWQsIGRpZS4gICovCkBAIC02MTYsNyArNjA5LDcgQEAKIAkJCXNnKys7CiAJCX0KIAotCQlucGFnZXMgPSBjYWxjX25wYWdlcygocGFkZHIgJiB+UEFHRV9NQVNLKSArIHNpemUpOworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGFkZHIsIHNpemUsIFBBR0VfU0laRSk7CiAKIAkJcGFkZHIgJj0gUEFHRV9NQVNLOwogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2ksIHBhZGRyICs9IFBBR0VfU0laRSkKQEAgLTc3NSw3ICs3NjgsNyBAQAogCQlEQkdBKCIgICAgKCVsZCkgc2cgWyVseCwlbHhdXG4iLAogCQkgICAgIHNnIC0gZW5kICsgbmVudHMsIGFkZHIsIHNpemUpOwogCi0JCW5wYWdlcyA9IGNhbGNfbnBhZ2VzKChhZGRyICYgflBBR0VfTUFTSykgKyBzaXplKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHIsIHNpemUsIFBBR0VfU0laRSk7CiAJCW9mcyA9IChhZGRyIC0gYXJlbmEtPmRtYV9iYXNlKSA+PiBQQUdFX1NISUZUOwogCQlpb21tdV9hcmVuYV9mcmVlKGFyZW5hLCBvZnMsIG5wYWdlcyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKaW5kZXggODNkZjU0MS4uZTY1N2M0NSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgPGFzbS9od3JwYi5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTE0OSw2ICsxNTAsOSBAQAogCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOwogCWN1cnJlbnQtPmFjdGl2ZV9tbSA9ICZpbml0X21tOwogCisJLyogaW5mb3JtIHRoZSBub3RpZmllcnMgYWJvdXQgdGhlIG5ldyBjcHUgKi8KKwlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdWlkKTsKKwogCS8qIE11c3QgaGF2ZSBjb21wbGV0ZWx5IGFjY3VyYXRlIGJvZ29zLiAgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDcwZGJhMTYuLjQ4NTNmOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIGNvbmZpZyBBUk0KIAlib29sCiAJZGVmYXVsdCB5CisJc2VsZWN0IEhBVkVfQU9VVAogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBSVENfTElCCiAJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCkBAIC0xNDAsMTUgKzE0MSwxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAotCWRlZl9ib29sIHkKLQogY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCiAJYm9vbAogCiBjb25maWcgWk9ORV9ETUEKIAlib29sCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCkBAIC0xNzgsNiArMTc1LDExIEBACiBjb25maWcgT1BST0ZJTEVfQVJNMTFfQ09SRQogCWJvb2wKIAorY29uZmlnIE9QUk9GSUxFX0FSTVY3CisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQ1BVX1Y3ICYmICFTTVAKKwlib29sCisKIGVuZGlmCiAKIGNvbmZpZyBWRUNUT1JTX0JBU0UKQEAgLTI0NSw2ICsyNDcsNyBAQAogCXNlbGVjdCBUSU1FUl9BQ09STgogCXNlbGVjdCBJU0EKIAlzZWxlY3QgTk9fSU9QT1JUCisJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBDaXJydXMgTG9naWMgUFM3NTAwRkUgc3lzdGVtLW9uLWEtY2hpcC4KIApAQCAtMzA2LDYgKzMwOSw3IEBACiAJc2VsZWN0IFBMQVRfSU9QCiAJc2VsZWN0IFBDSQogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TSQorCXNlbGVjdCBWTVNQTElUXzFHCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgSW50ZWwncyBJT1AxM1hYIChYU2NhbGUpIGZhbWlseSBvZiBwcm9jZXNzb3JzLgogCkBAIC0zNTAsNiArMzU0LDcgQEAKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IFpPTkVfRE1BIGlmIFBDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEludGVsJ3MgSVhQNFhYIChYU2NhbGUpIGZhbWlseSBvZiBwcm9jZXNzb3JzLgogCkBAIC00MzQsNyArNDM5LDcgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIE1hcnZlbGwgT3Jpb24gNXggc2VyaWVzIFNvQ3M6CiAJICBPcmlvbi0xICg1MTgxKSwgT3Jpb24tVm9JUCAoNTE4MUwpLCBPcmlvbi1OQVMgKDUxODIpLAotCSAgT3Jpb24tMiAoNTI4MSkuCisJICBPcmlvbi0yICg1MjgxKSwgT3Jpb24tMS05MCAoNjE4MykuCiAKIGNvbmZpZyBBUkNIX1BOWDQwMDgKIAlib29sICJQaGlsaXBzIE5leHBlcmlhIFBOWDQwMDggTW9iaWxlIgpAQCAtNDY0LDYgKzQ2OSw3IEBACiAJc2VsZWN0IEhBVkVfUEFUQV9QTEFURk9STQogCXNlbGVjdCBJU0FfRE1BX0FQSQogCXNlbGVjdCBOT19JT1BPUlQKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJaGVscAogCSAgT24gdGhlIEFjb3JuIFJpc2MtUEMsIExpbnV4IGNhbiBzdXBwb3J0IHRoZSBpbnRlcm5hbCBJREUgZGlzayBhbmQKIAkgIENELVJPTSBpbnRlcmZhY2UsIHNlcmlhbCBhbmQgcGFyYWxsZWwgcG9ydCwgYW5kIHRoZSBmbG9wcHkgZHJpdmUuCkBAIC00NzEsOSArNDc3LDcgQEAKIGNvbmZpZyBBUkNIX1NBMTEwMAogCWJvb2wgIlNBMTEwMC1iYXNlZCIKIAlzZWxlY3QgSVNBCi0Jc2VsZWN0IEFSQ0hfRElTQ09OVElHTUVNX0VOQUJMRQogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKLQlzZWxlY3QgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCiAJc2VsZWN0IEFSQ0hfTVREX1hJUAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCkBAIC00OTcsNiArNTAxLDcgQEAKIAlib29sICJTaGFyayIKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IElTQV9ETUEKKwlzZWxlY3QgWk9ORV9ETUEKIAlzZWxlY3QgUENJCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFN0cm9uZ0FSTSBiYXNlZCBEaWdpdGFsIEROQVJEIG1hY2hpbmUsIGFsc28ga25vd24KQEAgLTUwNCw2ICs1MDksOCBAQAogCiBjb25maWcgQVJDSF9MSDdBNDBYCiAJYm9vbCAiU2hhcnAgTEg3QTQwWCIKKwlzZWxlY3QgQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlmICFMSDdBNDBYX0NPTlRJR01FTQorCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUgaWYgIUxIN0E0MFhfQ09OVElHTUVNCiAJaGVscAogCSAgU2F5IFkgaGVyZSBmb3Igc3lzdGVtcyBiYXNlZCBvbiBvbmUgb2YgdGhlIFNoYXJwIExIN0E0MFgKIAkgIFN5c3RlbSBvbiBhIENoaXAgcHJvY2Vzc29ycy4gIFRoZXNlIENQVXMgaW5jbHVkZSBhbiBBUk05MjJUCkBAIC01MTUsNyArNTIyLDkgQEAKIAlzZWxlY3QgR0VORVJJQ19USU1FCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgR0VORVJJQ19HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IFpPTkVfRE1BCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgVEkncyBEYVZpbmNpIHBsYXRmb3JtLgogCkBAIC03MzQsNiArNzQzLDI5IEBACiAKIAkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCiAKK2Nob2ljZQorCXByb21wdCAiTWVtb3J5IHNwbGl0IgorCWRlZmF1bHQgVk1TUExJVF8zRworCWhlbHAKKwkgIFNlbGVjdCB0aGUgZGVzaXJlZCBzcGxpdCBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBtZW1vcnkuCisKKwkgIElmIHlvdSBhcmUgbm90IGFic29sdXRlbHkgc3VyZSB3aGF0IHlvdSBhcmUgZG9pbmcsIGxlYXZlIHRoaXMKKwkgIG9wdGlvbiBhbG9uZSEKKworCWNvbmZpZyBWTVNQTElUXzNHCisJCWJvb2wgIjNHLzFHIHVzZXIva2VybmVsIHNwbGl0IgorCWNvbmZpZyBWTVNQTElUXzJHCisJCWJvb2wgIjJHLzJHIHVzZXIva2VybmVsIHNwbGl0IgorCWNvbmZpZyBWTVNQTElUXzFHCisJCWJvb2wgIjFHLzNHIHVzZXIva2VybmVsIHNwbGl0IgorZW5kY2hvaWNlCisKK2NvbmZpZyBQQUdFX09GRlNFVAorCWhleAorCWRlZmF1bHQgMHg0MDAwMDAwMCBpZiBWTVNQTElUXzFHCisJZGVmYXVsdCAweDgwMDAwMDAwIGlmIFZNU1BMSVRfMkcKKwlkZWZhdWx0IDB4QzAwMDAwMDAKKwogY29uZmlnIE5SX0NQVVMKIAlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMzIpIgogCXJhbmdlIDIgMzIKQEAgLTgxNSwyMCArODQ3LDE4IEBACiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBGTEFUTUVNCiAKKyMgRGlzY29udGlnbWVtIGlzIGRlcHJlY2F0ZWQKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlib29sCi0JZGVmYXVsdCAoQVJDSF9MSDdBNDBYICYmICFMSDdBNDBYX0NPTlRJR01FTSkKLQloZWxwCi0JICBTYXkgWSB0byBzdXBwb3J0IGVmZmljaWVudCBoYW5kbGluZyBvZiBkaXNjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeSwKLQkgIGZvciBhcmNoaXRlY3R1cmVzIHdoaWNoIGFyZSBlaXRoZXIgTlVNQSAoTm9uLVVuaWZvcm0gTWVtb3J5IEFjY2VzcykKLQkgIG9yIGhhdmUgaHVnZSBob2xlcyBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBmb3Igb3RoZXIgcmVhc29ucy4KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZtL251bWE+IGZvciBtb3JlLgogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJYm9vbAogCitjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAorCWRlZl9ib29sIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCiBjb25maWcgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCi0JYm9vbAorCWRlZl9ib29sIEFSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSAmJiBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAogY29uZmlnIE5PREVTX1NISUZUCiAJaW50CkBAIC04NDUsNyArODc1LDcgQEAKIAkJICAgQVJDSF9MVUJCT0NLIHx8IE1BQ0hfTUFJTlNUT05FIHx8IEFSQ0hfTkVUV0lOREVSIHx8IFwKIAkJICAgQVJDSF9PTUFQIHx8IEFSQ0hfUDcyMFQgfHwgQVJDSF9QWEFfSURQIHx8IFwKIAkJICAgQVJDSF9TQTExMDAgfHwgQVJDSF9TSEFSSyB8fCBBUkNIX1ZFUlNBVElMRSB8fCBcCi0JCSAgIEFSQ0hfQVQ5MSB8fCBNQUNIX1RSSVpFUFM0IHx8IEFSQ0hfREFWSU5DSSB8fCBcCisJCSAgIEFSQ0hfQVQ5MSB8fCBBUkNIX0RBVklOQ0kgfHwgXAogCQkgICBBUkNIX0tTODY5NSB8fCBNQUNIX1JEODhGNTE4MgogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgTEVEcyBvbiB5b3VyIG1hY2hpbmUgd2lsbCBiZSB1c2VkCkBAIC0xMDA1LDkgKzEwMzUsOSBAQAogCiBlbmRtZW51CiAKLWlmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9PTUFQIHx8IEFSQ0hfSU1YIHx8IEFSQ0hfUFhBKQorbWVudSAiQ1BVIFBvd2VyIE1hbmFnZW1lbnQiCiAKLW1lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKK2lmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9PTUFQIHx8IEFSQ0hfSU1YIHx8IEFSQ0hfUFhBKQogCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCkBAIC0xMDQ3LDEwICsxMDc3LDEyIEBACiAJZGVmYXVsdCB5CiAJc2VsZWN0IENQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRQogCi1lbmRtZW51Ci0KIGVuZGlmCiAKK3NvdXJjZSAiZHJpdmVycy9jcHVpZGxlL0tjb25maWciCisKK2VuZG1lbnUKKwogbWVudSAiRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uIgogCiBjb21tZW50ICJBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQiCkBAIC0xMjAyLDYgKzEyMzQsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3RoZXJtYWwvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3dhdGNoZG9nL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zc2IvS2NvbmZpZyIKQEAgLTEyMjIsNiArMTI1NiwxMCBAQAogCiBzb3VyY2UgImRyaXZlcnMvbW1jL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tZW1zdGljay9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvYWNjZXNzaWJpbGl0eS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbGVkcy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcnRjL0tjb25maWciCkBAIC0xMjMwLDYgKzEyNjgsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvZGNhL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3Vpby9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vTWFrZWZpbGUgYi9hcmNoL2FybS9NYWtlZmlsZQppbmRleCA3MDNhNDRmLi43ZDUxMjEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9NYWtlZmlsZQpAQCAtNDcsNyArNDcsNyBAQAogIyBOb3RlIHRoYXQgR0NDIGRvZXMgbm90IG51bWVyaWNhbGx5IGRlZmluZSBhbiBhcmNoaXRlY3R1cmUgdmVyc2lvbgogIyBtYWNybywgYnV0IGluc3RlYWQgZGVmaW5lcyBhIHdob2xlIHNlcmllcyBvZiBtYWNyb3Mgd2hpY2ggbWFrZXMKICMgdGVzdGluZyBmb3IgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgb3IgbGF0ZXIgcmF0aGVyIGltcG9zc2libGUuCi1hcmNoLSQoQ09ORklHX0NQVV8zMnY3KQkJOj0tRF9fTElOVVhfQVJNX0FSQ0hfXz03ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWFybXY3YSwtbWFyY2g9YXJtdjV0IC1XYSQoY29tbWEpLW1hcmNoPWFybXY3YSkKK2FyY2gtJChDT05GSUdfQ1BVXzMydjcpCQk6PS1EX19MSU5VWF9BUk1fQVJDSF9fPTcgJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YXJtdjctYSwtbWFyY2g9YXJtdjV0IC1XYSQoY29tbWEpLW1hcmNoPWFybXY3LWEpCiBhcmNoLSQoQ09ORklHX0NQVV8zMnY2KQkJOj0tRF9fTElOVVhfQVJNX0FSQ0hfXz02ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWFybXY2LC1tYXJjaD1hcm12NXQgLVdhJChjb21tYSktbWFyY2g9YXJtdjYpCiAjIE9ubHkgb3ZlcnJpZGUgdGhlIGNvbXBpbGVyIG9wdGlvbiBpZiBBUk12Ni4gVGhlIEFSTXY2SyBleHRlbnNpb25zIGFyZQogIyBhbHdheXMgYXZhaWxhYmxlIGluIEFSTXY3CkBAIC0xMTgsOSArMTE4LDEwIEBACiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDIzWFgpICAgIDo9IGl4cDIzeHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfT01BUDEpCSAgIDo9IG9tYXAxCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVAyKQkgICA6PSBvbWFwMgorIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PTUFQMykJICAgOj0gb21hcDIKICAgICBwbGF0LSQoQ09ORklHX0FSQ0hfT01BUCkJICAgOj0gb21hcAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TM0MyNDEwKQkgICA6PSBzM2MyNDEwIHMzYzI0MDAgczNjMjQxMiBzM2MyNDQwIHMzYzI0NDIgczNjMjQ0MwotICAgIHBsYXQtJChDT05GSUdfUExBVF9TM0MyNFhYKQkgICA6PSBzM2MyNHh4CisgICAgcGxhdC0kKENPTkZJR19QTEFUX1MzQzI0WFgpCSAgIDo9IHMzYzI0eHggczNjCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0xIN0E0MFgpCSAgIDo9IGxoN2E0MHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVkVSU0FUSUxFKSAgOj0gdmVyc2F0aWxlCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lNWCkJICAgOj0gaW14CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggOTQ0NjJhMC4uN2EwM2YyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtNzYsNyArNzYsNyBAQAogZW5kaWYKIAogRVhUUkFfQ0ZMQUdTICA6PSAtZnBpYyAtZm5vLWJ1aWx0aW4KLUVYVFJBX0FGTEFHUyAgOj0KK0VYVFJBX0FGTEFHUyAgOj0gLVdhLC1tYXJjaD1hbGwKIAogIyBTdXBwbHkgWlJFTEFERFIsIElOSVRSRF9QSFlTIGFuZCBQQVJBTVNfUEhZUyB0byB0aGUgZGVjb21wcmVzc29yIHZpYQogIyBsaW5rZXIgc3ltYm9scy4gIFdlIG9ubHkgZGVmaW5lIGluaXRyZF9waHlzIGFuZCBwYXJhbXNfcGh5cyBpZiB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGQ0MmY4OWIuLjg0YTFlMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNDIxLDYgKzQyMSw3IEBACiAJCWFkZAlyMSwgcjEsICMxMDQ4NTc2CiAJCXN0cglyMSwgW3IwXQogCQltb3YJcGMsIGxyCitFTkRQUk9DKF9fc2V0dXBfbW11KQogCiBfX2FybXY0X21tdV9jYWNoZV9vbjoKIAkJbW92CXIxMiwgbHIKQEAgLTgwMSw3ICs4MDIsNyBAQAogCQlhZGQJcjIsIHIyLCAjNAkJQCBhZGQgNCAobGluZSBsZW5ndGggb2Zmc2V0KQogCQlsZHIJcjQsID0weDNmZgogCQlhbmRzCXI0LCByNCwgcjEsIGxzciAjMwlAIGZpbmQgbWF4aW11bSBudW1iZXIgb24gdGhlIHdheSBzaXplCi0JCS53b3JkCTB4ZTE2ZjVmMTQJCUAgY2x6IHI1LCByNCAtIGZpbmQgYml0IHBvc2l0aW9uIG9mIHdheSBzaXplIGluY3JlbWVudAorCQljbHoJcjUsIHI0CQkJQCBmaW5kIGJpdCBwb3NpdGlvbiBvZiB3YXkgc2l6ZSBpbmNyZW1lbnQKIAkJbGRyCXI3LCA9MHg3ZmZmCiAJCWFuZHMJcjcsIHI3LCByMSwgbHNyICMxMwlAIGV4dHJhY3QgbWF4IG51bWJlciBvZiB0aGUgaW5kZXggc2l6ZQogbG9vcDI6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vS2NvbmZpZyBiL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnCmluZGV4IDNlMDczNDYuLjJlMzJhY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9LY29uZmlnCkBAIC0xMiw3ICsxMiw4IEBACiAKIGNvbmZpZyBTQTExMTEKIAlib29sCi0Jc2VsZWN0IERNQUJPVU5DRQorCXNlbGVjdCBETUFCT1VOQ0UgaWYgIUFSQ0hfUFhBCisJc2VsZWN0IFpPTkVfRE1BIGlmICFBUkNIX1BYQQogCiBjb25maWcgRE1BQk9VTkNFCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCmluZGV4IGFlY2M2YzMuLmYwMzBmMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYworKysgYi9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKQEAgLTE1NCw5ICsxNTQsNyBAQAogI2VuZGlmCiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7Ci0KIAlsaXN0X2FkZCgmYnVmLT5ub2RlLCAmZGV2aWNlX2luZm8tPnNhZmVfYnVmZmVycyk7Ci0KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2luZm8tPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBidWY7CkBAIC0yMDUsOCArMjAzLDIyIEBACiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAotbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCitzdGF0aWMgc3RydWN0IHNhZmVfYnVmZmVyICpmaW5kX3NhZmVfYnVmZmVyX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWRtYV9hZGRyX3QgZG1hX2FkZHIsIGNvbnN0IGNoYXIgKndoZXJlKQoreworCWlmICghZGV2IHx8ICFkZXYtPmFyY2hkYXRhLmRtYWJvdW5jZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpKSB7CisJCWlmIChkZXYpCisJCQlkZXZfZXJyKGRldiwgIlRyeWluZyB0byAlcyBpbnZhbGlkIG1hcHBpbmdcbiIsIHdoZXJlKTsKKwkJZWxzZQorCQkJcHJfZXJyKCJ1bmtub3duIGRldmljZTogVHJ5aW5nIHRvICVzIGludmFsaWQgbWFwcGluZ1xuIiwgd2hlcmUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZpbmRfc2FmZV9idWZmZXIoZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UsIGRtYV9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IG1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBkZXYtPmFyY2hkYXRhLmRtYWJvdW5jZTsKQEAgLTI3MCwzMyArMjgyLDIxIEBACiAJcmV0dXJuIGRtYV9hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXVubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IGRldi0+YXJjaGRhdGEuZG1hYm91bmNlOwotCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmID0gTlVMTDsKLQotCS8qCi0JICogVHJ5aW5nIHRvIHVubWFwIGFuIGludmFsaWQgbWFwcGluZwotCSAqLwotCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGRtYV9hZGRyKSkgewotCQlkZXZfZXJyKGRldiwgIlRyeWluZyB0byB1bm1hcCBpbnZhbGlkIG1hcHBpbmdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGRldmljZV9pbmZvKQotCQlidWYgPSBmaW5kX3NhZmVfYnVmZmVyKGRldmljZV9pbmZvLCBkbWFfYWRkcik7CisJc3RydWN0IHNhZmVfYnVmZmVyICpidWYgPSBmaW5kX3NhZmVfYnVmZmVyX2RldihkZXYsIGRtYV9hZGRyLCAidW5tYXAiKTsKIAogCWlmIChidWYpIHsKIAkJQlVHX09OKGJ1Zi0+c2l6ZSAhPSBzaXplKTsKKwkJQlVHX09OKGJ1Zi0+ZGlyZWN0aW9uICE9IGRpcik7CiAKIAkJZGV2X2RiZyhkZXYsCiAJCQkiJXM6IHVuc2FmZSBidWZmZXIgJXAgKGRtYT0lI3gpIG1hcHBlZCB0byAlcCAoZG1hPSUjeClcbiIsCiAJCQlfX2Z1bmNfXywgYnVmLT5wdHIsIHZpcnRfdG9fZG1hKGRldiwgYnVmLT5wdHIpLAogCQkJYnVmLT5zYWZlLCBidWYtPnNhZmVfZG1hX2FkZHIpOwogCi0JCURPX1NUQVRTICggZGV2aWNlX2luZm8tPmJvdW5jZV9jb3VudCsrICk7CisJCURPX1NUQVRTKGRldi0+YXJjaGRhdGEuZG1hYm91bmNlLT5ib3VuY2VfY291bnQrKyk7CiAKIAkJaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSB7CiAJCQl2b2lkICpwdHIgPSBidWYtPnB0cjsKQEAgLTMxNyw3NCArMzE3LDcgQEAKIAkJCWRtYWNfY2xlYW5fcmFuZ2UocHRyLCBwdHIgKyBzaXplKTsKIAkJCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEocHRyKSwgX19wYShwdHIpICsgc2l6ZSk7CiAJCX0KLQkJZnJlZV9zYWZlX2J1ZmZlcihkZXZpY2VfaW5mbywgYnVmKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IGRldi0+YXJjaGRhdGEuZG1hYm91bmNlOwotCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmID0gTlVMTDsKLQotCWlmIChkZXZpY2VfaW5mbykKLQkJYnVmID0gZmluZF9zYWZlX2J1ZmZlcihkZXZpY2VfaW5mbywgZG1hX2FkZHIpOwotCi0JaWYgKGJ1ZikgewotCQkvKgotCQkgKiBCb3RoIG9mIHRoZXNlIGNoZWNrcyBmcm9tIG9yaWdpbmFsIGNvZGUgbmVlZCB0byBiZQotCQkgKiBjb21tZW50ZWQgb3V0IGIvYyBzb21lIGRyaXZlcnMgcmVseSBvbiB0aGUgZm9sbG93aW5nOgotCQkgKgotCQkgKiAxKSBEcml2ZXJzIG1heSBtYXAgYSBsYXJnZSBjaHVuayBvZiBtZW1vcnkgaW50byBETUEgc3BhY2UKLQkJICogICAgYnV0IG9ubHkgc3luYyBhIHNtYWxsIHBvcnRpb24gb2YgaXQuIEdvb2QgZXhhbXBsZSBpcwotCQkgKiAgICBhbGxvY2F0aW5nIGEgbGFyZ2UgYnVmZmVyLCBtYXBwaW5nIGl0LCBhbmQgdGhlbgotCQkgKiAgICBicmVha2luZyBpdCB1cCBpbnRvIHNtYWxsIGRlc2NyaXB0b3JzLiBObyBwb2ludAotCQkgKiAgICBpbiBzeW5jaW5nIHRoZSB3aG9sZSBidWZmZXIgaWYgeW91IG9ubHkgaGF2ZSB0bwotCQkgKiAgICB0b3VjaCBvbmUgZGVzY3JpcHRvci4KLQkJICoKLQkJICogMikgQnVmZmVycyB0aGF0IGFyZSBtYXBwZWQgYXMgRE1BX0JJRElSRUNUSU9OQUwgYXJlCi0JCSAqICAgIHVzdWFsbHkgb25seSBzeW5jZWQgaW4gb25lIGRpciBhdCBhIHRpbWUuCi0JCSAqCi0JCSAqIFNlZSBkcml2ZXJzL25ldC9lZXBybzEwMC5jIGZvciBleGFtcGxlcyBvZiBib3RoIGNhc2VzLgotCQkgKgotCQkgKiAtZHMKLQkJICoKLQkJICogQlVHX09OKGJ1Zi0+c2l6ZSAhPSBzaXplKTsKLQkJICogQlVHX09OKGJ1Zi0+ZGlyZWN0aW9uICE9IGRpcik7Ci0JCSAqLwotCi0JCWRldl9kYmcoZGV2LAotCQkJIiVzOiB1bnNhZmUgYnVmZmVyICVwIChkbWE9JSN4KSBtYXBwZWQgdG8gJXAgKGRtYT0lI3gpXG4iLAotCQkJX19mdW5jX18sIGJ1Zi0+cHRyLCB2aXJ0X3RvX2RtYShkZXYsIGJ1Zi0+cHRyKSwKLQkJCWJ1Zi0+c2FmZSwgYnVmLT5zYWZlX2RtYV9hZGRyKTsKLQotCQlET19TVEFUUyAoIGRldmljZV9pbmZvLT5ib3VuY2VfY291bnQrKyApOwotCi0JCXN3aXRjaCAoZGlyKSB7Ci0JCWNhc2UgRE1BX0ZST01fREVWSUNFOgotCQkJZGV2X2RiZyhkZXYsCi0JCQkJIiVzOiBjb3B5IGJhY2sgc2FmZSAlcCB0byB1bnNhZmUgJXAgc2l6ZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYnVmLT5zYWZlLCBidWYtPnB0ciwgc2l6ZSk7Ci0JCQltZW1jcHkoYnVmLT5wdHIsIGJ1Zi0+c2FmZSwgc2l6ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBETUFfVE9fREVWSUNFOgotCQkJZGV2X2RiZyhkZXYsCi0JCQkJIiVzOiBjb3B5IG91dCB1bnNhZmUgJXAgdG8gc2FmZSAlcCwgc2l6ZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXyxidWYtPnB0ciwgYnVmLT5zYWZlLCBzaXplKTsKLQkJCW1lbWNweShidWYtPnNhZmUsIGJ1Zi0+cHRyLCBzaXplKTsKLQkJCWJyZWFrOwotCQljYXNlIERNQV9CSURJUkVDVElPTkFMOgotCQkJQlVHKCk7CS8qIGlzIHRoaXMgYWxsb3dlZD8gIHdoYXQgZG9lcyBpdCBtZWFuPyAqLwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCX0KLQkJLyoKLQkJICogTm8gbmVlZCB0byBzeW5jIHRoZSBzYWZlIGJ1ZmZlciAtIGl0IHdhcyBhbGxvY2F0ZWQKLQkJICogdmlhIHRoZSBjb2hlcmVudCBhbGxvY2F0b3JzLgotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7CisJCWZyZWVfc2FmZV9idWZmZXIoZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UsIGJ1Zik7CiAJfQogfQogCkBAIC0zOTYsMjEgKzMyOSwyOSBAQAogICogc3Vic3RpdHV0ZSB0aGUgc2FmZSBidWZmZXIgZm9yIHRoZSB1bnNhZmUgb25lLgogICogKGJhc2ljYWxseSBtb3ZlIHRoZSBidWZmZXIgZnJvbSBhbiB1bnNhZmUgYXJlYSB0byBhIHNhZmUgb25lKQogICovCi1kbWFfYWRkcl90Ci1kbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCitkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0KIAlkZXZfZGJnKGRldiwgIiVzKHB0cj0lcCxzaXplPSVkLGRpcj0leClcbiIsCiAJCV9fZnVuY19fLCBwdHIsIHNpemUsIGRpcik7CiAKLQlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyKSk7CiAKLQlkbWFfYWRkciA9IG1hcF9zaW5nbGUoZGV2LCBwdHIsIHNpemUsIGRpcik7Ci0KLQlyZXR1cm4gZG1hX2FkZHI7CisJcmV0dXJuIG1hcF9zaW5nbGUoZGV2LCBwdHIsIHNpemUsIGRpcik7CiB9CitFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2luZ2xlKTsKKworZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZGV2X2RiZyhkZXYsICIlcyhwYWdlPSVwLG9mZj0lI2x4LHNpemU9JXp4LGRpcj0leClcbiIsCisJCV9fZnVuY19fLCBwYWdlLCBvZmZzZXQsIHNpemUsIGRpcik7CisKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyKSk7CisKKwlyZXR1cm4gbWFwX3NpbmdsZShkZXYsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX21hcF9wYWdlKTsKIAogLyoKICAqIHNlZSBpZiBhIG1hcHBlZCBhZGRyZXNzIHdhcyByZWFsbHkgYSAic2FmZSIgYnVmZmVyIGFuZCBpZiBzbywgY29weQpAQCAtNDE5LDEyNiArMzYwLDc2IEBACiAgKiBzaG91bGQgYmUpCiAgKi8KIAotdm9pZAotZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAotCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQordm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKIAlkZXZfZGJnKGRldiwgIiVzKHB0cj0lcCxzaXplPSVkLGRpcj0leClcbiIsCiAJCV9fZnVuY19fLCAodm9pZCAqKSBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKIAotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCiAJdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7CiB9CitFWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zaW5nbGUpOwogCi1pbnQKLWRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK2ludCBkbWFib3VuY2Vfc3luY19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQl1bnNpZ25lZCBsb25nIG9mZiwgc2l6ZV90IHN6LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JaW50IGk7CisJc3RydWN0IHNhZmVfYnVmZmVyICpidWY7CiAKLQlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCi0JCV9fZnVuY19fLCBzZywgbmVudHMsIGRpcik7CisJZGV2X2RiZyhkZXYsICIlcyhkbWE9JSN4LG9mZj0lI2x4LHN6PSV6eCxkaXI9JXgpXG4iLAorCQlfX2Z1bmNfXywgYWRkciwgb2ZmLCBzeiwgZGlyKTsKIAotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCWJ1ZiA9IGZpbmRfc2FmZV9idWZmZXJfZGV2KGRldiwgYWRkciwgX19mdW5jX18pOworCWlmICghYnVmKQorCQlyZXR1cm4gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzZyk7Ci0JCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzZy0+b2Zmc2V0OwotCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2ctPmxlbmd0aDsKLQkJdm9pZCAqcHRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0OworCUJVR19PTihidWYtPmRpcmVjdGlvbiAhPSBkaXIpOwogCi0JCXNnLT5kbWFfYWRkcmVzcyA9Ci0JCQltYXBfc2luZ2xlKGRldiwgcHRyLCBsZW5ndGgsIGRpcik7CisJZGV2X2RiZyhkZXYsICIlczogdW5zYWZlIGJ1ZmZlciAlcCAoZG1hPSUjeCkgbWFwcGVkIHRvICVwIChkbWE9JSN4KVxuIiwKKwkJX19mdW5jX18sIGJ1Zi0+cHRyLCB2aXJ0X3RvX2RtYShkZXYsIGJ1Zi0+cHRyKSwKKwkJYnVmLT5zYWZlLCBidWYtPnNhZmVfZG1hX2FkZHIpOworCisJRE9fU1RBVFMoZGV2LT5hcmNoZGF0YS5kbWFib3VuY2UtPmJvdW5jZV9jb3VudCsrKTsKKworCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkgeworCQlkZXZfZGJnKGRldiwgIiVzOiBjb3B5IGJhY2sgc2FmZSAlcCB0byB1bnNhZmUgJXAgc2l6ZSAlZFxuIiwKKwkJCV9fZnVuY19fLCBidWYtPnNhZmUgKyBvZmYsIGJ1Zi0+cHRyICsgb2ZmLCBzeik7CisJCW1lbWNweShidWYtPnB0ciArIG9mZiwgYnVmLT5zYWZlICsgb2ZmLCBzeik7CiAJfQotCi0JcmV0dXJuIG5lbnRzOworCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkbWFib3VuY2Vfc3luY19mb3JfY3B1KTsKIAotdm9pZAotZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCitpbnQgZG1hYm91bmNlX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBvZmYsIHNpemVfdCBzeiwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCWludCBpOworCXN0cnVjdCBzYWZlX2J1ZmZlciAqYnVmOwogCi0JZGV2X2RiZyhkZXYsICIlcyhzZz0lcCxuZW50cz0lZCxkaXI9JXgpXG4iLAotCQlfX2Z1bmNfXywgc2csIG5lbnRzLCBkaXIpOworCWRldl9kYmcoZGV2LCAiJXMoZG1hPSUjeCxvZmY9JSNseCxzej0lengsZGlyPSV4KVxuIiwKKwkJX19mdW5jX18sIGFkZHIsIG9mZiwgc3osIGRpcik7CiAKLQlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKwlidWYgPSBmaW5kX3NhZmVfYnVmZmVyX2RldihkZXYsIGFkZHIsIF9fZnVuY19fKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQlkbWFfYWRkcl90IGRtYV9hZGRyID0gc2ctPmRtYV9hZGRyZXNzOwotCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2ctPmxlbmd0aDsKKwlCVUdfT04oYnVmLT5kaXJlY3Rpb24gIT0gZGlyKTsKIAotCQl1bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgbGVuZ3RoLCBkaXIpOworCWRldl9kYmcoZGV2LCAiJXM6IHVuc2FmZSBidWZmZXIgJXAgKGRtYT0lI3gpIG1hcHBlZCB0byAlcCAoZG1hPSUjeClcbiIsCisJCV9fZnVuY19fLCBidWYtPnB0ciwgdmlydF90b19kbWEoZGV2LCBidWYtPnB0ciksCisJCWJ1Zi0+c2FmZSwgYnVmLT5zYWZlX2RtYV9hZGRyKTsKKworCURPX1NUQVRTKGRldi0+YXJjaGRhdGEuZG1hYm91bmNlLT5ib3VuY2VfY291bnQrKyk7CisKKwlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IGNvcHkgb3V0IHVuc2FmZSAlcCB0byBzYWZlICVwLCBzaXplICVkXG4iLAorCQkJX19mdW5jX18sYnVmLT5wdHIgKyBvZmYsIGJ1Zi0+c2FmZSArIG9mZiwgc3opOworCQltZW1jcHkoYnVmLT5zYWZlICsgb2ZmLCBidWYtPnB0ciArIG9mZiwgc3opOwogCX0KKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1hYm91bmNlX3N5bmNfZm9yX2RldmljZSk7CiAKLXZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JZGV2X2RiZyhkZXYsICIlcyhkbWE9JSN4LG9mZj0lI2x4LHNpemU9JXp4LGRpcj0leClcbiIsCi0JCV9fZnVuY19fLCBkbWFfYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIpOwotCi0JaWYgKHN5bmNfc2luZ2xlKGRldiwgZG1hX2FkZHIsIG9mZnNldCArIHNpemUsIGRpcikpCi0JCWRtYV9jYWNoZV9tYWludChkbWFfdG9fdmlydChkZXYsIGRtYV9hZGRyKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUpOwotCi12b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCWRldl9kYmcoZGV2LCAiJXMoZG1hPSUjeCxvZmY9JSNseCxzaXplPSV6eCxkaXI9JXgpXG4iLAotCQlfX2Z1bmNfXywgZG1hX2FkZHIsIG9mZnNldCwgc2l6ZSwgZGlyKTsKLQotCWlmIChzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBvZmZzZXQgKyBzaXplLCBkaXIpKQotCQlkbWFfY2FjaGVfbWFpbnQoZG1hX3RvX3ZpcnQoZGV2LCBkbWFfYWRkcikgKyBvZmZzZXQsIHNpemUsIGRpcik7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKTsKLQotdm9pZAotZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlpbnQgaTsKLQotCWRldl9kYmcoZGV2LCAiJXMoc2c9JXAsbmVudHM9JWQsZGlyPSV4KVxuIiwKLQkJX19mdW5jX18sIHNnLCBuZW50cywgZGlyKTsKLQotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKLQkJZG1hX2FkZHJfdCBkbWFfYWRkciA9IHNnLT5kbWFfYWRkcmVzczsKLQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnLT5sZW5ndGg7Ci0KLQkJc3luY19zaW5nbGUoZGV2LCBkbWFfYWRkciwgbGVuZ3RoLCBkaXIpOwotCX0KLX0KLQotdm9pZAotZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlpbnQgaTsKLQotCWRldl9kYmcoZGV2LCAiJXMoc2c9JXAsbmVudHM9JWQsZGlyPSV4KVxuIiwKLQkJX19mdW5jX18sIHNnLCBuZW50cywgZGlyKTsKLQotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKLQkJZG1hX2FkZHJfdCBkbWFfYWRkciA9IHNnLT5kbWFfYWRkcmVzczsKLQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnLT5sZW5ndGg7Ci0KLQkJc3luY19zaW5nbGUoZGV2LCBkbWFfYWRkciwgbGVuZ3RoLCBkaXIpOwotCX0KLX0KLQotc3RhdGljIGludAotZG1hYm91bmNlX2luaXRfcG9vbChzdHJ1Y3QgZG1hYm91bmNlX3Bvb2wgKnBvb2wsIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgZG1hYm91bmNlX2luaXRfcG9vbChzdHJ1Y3QgZG1hYm91bmNlX3Bvb2wgKnBvb2wsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXBvb2wtPnNpemUgPSBzaXplOwogCURPX1NUQVRTKHBvb2wtPmFsbG9jcyA9IDApOwpAQCAtNTQ5LDkgKzQ0MCw4IEBACiAJcmV0dXJuIHBvb2wtPnBvb2wgPyAwIDogLUVOT01FTTsKIH0KIAotaW50Ci1kbWFib3VuY2VfcmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzbWFsbF9idWZmZXJfc2l6ZSwKLQkJCXVuc2lnbmVkIGxvbmcgbGFyZ2VfYnVmZmVyX3NpemUpCitpbnQgZG1hYm91bmNlX3JlZ2lzdGVyX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc21hbGxfYnVmZmVyX3NpemUsCisJCXVuc2lnbmVkIGxvbmcgbGFyZ2VfYnVmZmVyX3NpemUpCiB7CiAJc3RydWN0IGRtYWJvdW5jZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CiAJaW50IHJldDsKQEAgLTYwNyw5ICs0OTcsOSBAQAogCWtmcmVlKGRldmljZV9pbmZvKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KTsKIAotdm9pZAotZG1hYm91bmNlX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgZG1hYm91bmNlX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IGRldi0+YXJjaGRhdGEuZG1hYm91bmNlOwogCkBAIC02NDIsMTUgKzUzMiw2IEBACiAKIAlkZXZfaW5mbyhkZXYsICJkbWFib3VuY2U6IGRldmljZSB1bnJlZ2lzdGVyZWRcbiIpOwogfQotCi0KLUVYUE9SVF9TWU1CT0woZG1hX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0woZG1hX21hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NnX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTChkbWFfc3luY19zZ19mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woZG1hYm91bmNlX3JlZ2lzdGVyX2Rldik7CiBFWFBPUlRfU1lNQk9MKGRtYWJvdW5jZV91bnJlZ2lzdGVyX2Rldik7CiAKIE1PRFVMRV9BVVRIT1IoIkNocmlzdG9waGVyIEhvb3ZlciA8Y2hAaHBsLmhwLmNvbT4sIERlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+Iik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggMGM4OWJkMy4uN2ZjOTg2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMjcsOSArMjcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwppbmRleCA1ZmU5NTg4Li4yNzkzNDQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCkBAIC02NiwxNCArNjYsNiBAQAogICAgICAgIH0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGl0ODE1Ml9pcnEoaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7Ci0KLQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXQ4MTUyX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJpdDgxNTIiLAogCS5hY2sJCT0gaXQ4MTUyX21hc2tfaXJxLApAQCAtMTI4LDIxICsxMjAsMjEgQEAKIAkgICAgICAgYml0c19wZCAmPSAoKDEgPDwgSVQ4MTUyX1BEX0lSUV9DT1VOVCkgLSAxKTsKIAkgICAgICAgd2hpbGUgKGJpdHNfcGQpIHsKIAkJICAgICAgIGkgPSBfX2ZmcyhiaXRzX3BkKTsKLQkJICAgICAgIGl0ODE1Ml9pcnEoSVQ4MTUyX1BEX0lSUShpKSk7CisJCSAgICAgICBnZW5lcmljX2hhbmRsZV9pcnEoSVQ4MTUyX1BEX0lSUShpKSk7CiAJCSAgICAgICBiaXRzX3BkICY9IH4oMSA8PCBpKTsKIAkgICAgICAgfQogCiAJICAgICAgIGJpdHNfbHAgJj0gKCgxIDw8IElUODE1Ml9MUF9JUlFfQ09VTlQpIC0gMSk7CiAJICAgICAgIHdoaWxlIChiaXRzX2xwKSB7CiAJCSAgICAgICBpID0gX19mZnMoYml0c19scCk7Ci0JCSAgICAgICBpdDgxNTJfaXJxKElUODE1Ml9MUF9JUlEoaSkpOworCQkgICAgICAgZ2VuZXJpY19oYW5kbGVfaXJxKElUODE1Ml9MUF9JUlEoaSkpOwogCQkgICAgICAgYml0c19scCAmPSB+KDEgPDwgaSk7CiAJICAgICAgIH0KIAogCSAgICAgICBiaXRzX2xkICY9ICgoMSA8PCBJVDgxNTJfTERfSVJRX0NPVU5UKSAtIDEpOwogCSAgICAgICB3aGlsZSAoYml0c19sZCkgewogCQkgICAgICAgaSA9IF9fZmZzKGJpdHNfbGQpOwotCQkgICAgICAgaXQ4MTUyX2lycShJVDgxNTJfTERfSVJRKGkpKTsKKwkJICAgICAgIGdlbmVyaWNfaGFuZGxlX2lycShJVDgxNTJfTERfSVJRKGkpKTsKIAkJICAgICAgIGJpdHNfbGQgJj0gfigxIDw8IGkpOwogCSAgICAgICB9CiAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDI4MzA1MWUuLjdjNmI0YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYworKysgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtMTY5LDcgKzE2OSw2IEBACiBzdGF0aWMgdm9pZCBsb2NvbW9faGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IHJlcSwgaTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCS8qIEFja25vd2xlZGdlIHRoZSBwYXJlbnQgSVJRICovCkBAIC0xODEsMTAgKzE4MCw5IEBACiAJaWYgKHJlcSkgewogCQkvKiBnZW5lcmF0ZSB0aGUgbmV4dCBpbnRlcnJ1cHQocykgKi8KIAkJaXJxID0gTE9DT01PX0lSUV9TVEFSVDsKLQkJZCA9IGlycV9kZXNjICsgaXJxOwotCQlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKywgZCsrLCBpcnErKykgeworCQlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKywgaXJxKyspIHsKIAkJCWlmIChyZXEgJiAoMHgwMTAwIDw8IGkpKSB7Ci0JCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZCk7CisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCQl9CiAKIAkJfQpAQCAtMjIyLDEyICsyMjAsMTAgQEAKIAogc3RhdGljIHZvaWQgbG9jb21vX2tleV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCWlmIChsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpICYgMHgwMDAxKSB7Ci0JCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfS0VZX1NUQVJUOwotCQlkZXNjX2hhbmRsZV9pcnEoTE9DT01PX0lSUV9LRVlfU1RBUlQsIGQpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoTE9DT01PX0lSUV9LRVlfU1RBUlQpOwogCX0KIH0KIApAQCAtMjY4LDcgKzI2NCw2IEBACiBzdGF0aWMgdm9pZCBsb2NvbW9fZ3Bpb19oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpbnQgcmVxLCBpOwotCXN0cnVjdCBpcnFfZGVzYyAqZDsKIAl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCiAJcmVxID0gCWxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0dJUikgJgpAQCAtMjc3LDEwICsyNzIsOSBAQAogCiAJaWYgKHJlcSkgewogCQlpcnEgPSBMT0NPTU9fSVJRX0dQSU9fU1RBUlQ7Ci0JCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfR1BJT19TVEFSVDsKLQkJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrLCBpcnErKywgZCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKywgaXJxKyspIHsKIAkJCWlmIChyZXEgJiAoMHgwMDAxIDw8IGkpKSB7Ci0JCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZCk7CisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0zNjEsMTIgKzM1NSwxMCBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fbHRfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkOwogCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAKIAlpZiAobG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fTFRJTlQpICYgMHgwMDAxKSB7Ci0JCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfTFRfU1RBUlQ7Ci0JCWRlc2NfaGFuZGxlX2lycShMT0NPTU9fSVJRX0xUX1NUQVJULCBkKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKExPQ09NT19JUlFfTFRfU1RBUlQpOwogCX0KIH0KIApAQCAtNDA3LDE3ICszOTksMTUgQEAKIHN0YXRpYyB2b2lkIGxvY29tb19zcGlfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IHJlcSwgaTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCXJlcSA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSSArIExPQ09NT19TUElJUikgJiAweDAwMEY7CiAJaWYgKHJlcSkgewogCQlpcnEgPSBMT0NPTU9fSVJRX1NQSV9TVEFSVDsKLQkJZCA9IGlycV9kZXNjICsgaXJxOwogCi0JCWZvciAoaSA9IDA7IGkgPD0gMzsgaSsrLCBpcnErKywgZCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gMzsgaSsrLCBpcnErKykgewogCQkJaWYgKHJlcSAmICgweDAwMDEgPDwgaSkpIHsKLQkJCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkKTsKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCBlYzhhNTQ3Li5mYjg2ZjI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC0yNSwxMCArMjUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zY29vcC5jIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKaW5kZXggYWUzOTU1My4uNjk3YzY0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wYXJhbS5jIGIvYXJjaC9hcm0vY29tbW9uL3NoYXJwc2xfcGFyYW0uYwppbmRleCBhYWQ0ZDk0Li5kNTZjOTMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wYXJhbS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BhcmFtLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvc2hhcnBzbF9wYXJhbS5oPgogCkBAIC0zNiw2ICszNyw3IEBACiAjZGVmaW5lIFBIQURfTUFHSUMJTUFHSUNfQ0hHKCdQJywnSCcsJ0EnLCdEJykKIAogc3RydWN0IHNoYXJwc2xfcGFyYW1faW5mbyBzaGFycHNsX3BhcmFtOworRVhQT1JUX1NZTUJPTChzaGFycHNsX3BhcmFtKTsKIAogdm9pZCBzaGFycHNsX3NhdmVfcGFyYW0odm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi90aW1lLWFjb3JuLmMgYi9hcmNoL2FybS9jb21tb24vdGltZS1hY29ybi5jCmluZGV4IGRmMDk4M2EuLmRlZWVkNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi90aW1lLWFjb3JuLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3RpbWUtYWNvcm4uYwpAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi91ZW5naW5lLmMgYi9hcmNoL2FybS9jb21tb24vdWVuZ2luZS5jCmluZGV4IDdlY2QzYzAuLmI1MjBlNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi91ZW5naW5lLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3VlbmdpbmUuYwpAQCAtMTYsOSArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvdWVuZ2luZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JWFAyMDAwKQogI2RlZmluZSBJWFBfVUVOR0lORV9DU1JfVklSVF9CQVNFCUlYUDIwMDBfVUVOR0lORV9DU1JfVklSVF9CQVNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vdmlhODJjNTA1LmMgYi9hcmNoL2FybS9jb21tb24vdmlhODJjNTA1LmMKaW5kZXggNzlhODIwNi4uODQyMWQzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3ZpYTgyYzUwNS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi92aWE4MmM1MDUuYwpAQCAtNCw4ICs0LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vdmljLmMgYi9hcmNoL2FybS9jb21tb24vdmljLmMKaW5kZXggYzAyNmZhMi4uZjFlNGI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi92aWMuYwpAQCAtMjAsOCArMjAsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2FmZWI5MjYwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYWZlYjkyNjBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTA5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2FmZWI5MjYwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEyNTkgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzIKKyMgVHVlIEF1ZyAxMiAyMjozMDoxNiAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTE9eQorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTTdYMDBBIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCisKKyMKKyMgQXRtZWwgQVQ5MSBTeXN0ZW0tb24tQ2hpcAorIworIyBDT05GSUdfQVJDSF9BVDkxUk05MjAwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTFTQU05MjYwPXkKKyMgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFTQU05UkwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxU0FNOUcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFDQVA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MVg0MCBpcyBub3Qgc2V0CitDT05GSUdfQVQ5MV9QTUNfVU5JVD15CisKKyMKKyMgQVQ5MVNBTTkyNjAgVmFyaWFudHMKKyMKKyMgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjBfU0FNOVhFIGlzIG5vdCBzZXQKKworIworIyBBVDkxU0FNOTI2MCAvIEFUOTFTQU05WEUgQm9hcmQgVHlwZQorIworIyBDT05GSUdfTUFDSF9BVDkxU0FNOTI2MEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ0FNNjAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9TQU05X0w5MjYwIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0FGRUI5MjYwPXkKKyMgQ09ORklHX01BQ0hfVVNCX0E5MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfUUlMX0E5MjYwIGlzIG5vdCBzZXQKKworIworIyBBVDkxIEJvYXJkIE9wdGlvbnMKKyMKKworIworIyBBVDkxIEZlYXR1cmUgU2VsZWN0aW9ucworIworQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUz15CitDT05GSUdfQVQ5MV9USU1FUl9IWj0xMDAKK0NPTkZJR19BVDkxX0VBUkxZX0RCR1U9eQorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDAgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDEgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDIgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDMgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDQgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MV9FQVJMWV9VU0FSVDUgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTI2VD15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVRKPXkKK0NPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0NBQ0hFX1JPVU5EX1JPQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX09VVEVSX0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0haPTEwMAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlTMCwxMTUyMDAgaW5pdHJkPTB4MjExMDAwMDAsMzE0NTcyOCByb290PS9kZXYvcmFtMCBydyIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTVREX0RBVEFGTEFTSD15CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkQ9eQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfSURTPXkKKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0FUTUVMPXkKKyMgQ09ORklHX01URF9OQU5EX0FUTUVMX0VDQ19IVyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfQVRNRUxfRUNDX1NPRlQ9eQorIyBDT05GSUdfTVREX05BTkRfQVRNRUxfRUNDX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19BVE1FTF9QV00gaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUxfVENMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKK0NPTkZJR19BVE1FTF9TU0M9eQorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfTUFDQj15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVE1FTD15CitDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9BVE1FTF9QREM9eQorIyBDT05GSUdfU0VSSUFMX0FUTUVMX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CitDT05GSUdfSTJDX0FMR09CSVQ9eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworQ09ORklHX0kyQ19HUElPPXkKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CitDT05GSUdfQVQyND15CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfREVCVUc9eQorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfU1BJX0FUTUVMPXkKKyMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorQ09ORklHX1NQSV9TUElERVY9eQorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1VTQjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTTY2NTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9BVDkxPXkKK0NPTkZJR19VU0JfQVQ5MT15CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1pFUk89bQorIyBDT05GSUdfVVNCX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVEZTPW0KK0NPTkZJR19VU0JfRklMRV9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfU0VSSUFMPW0KKyMgQ09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorQ09ORklHX1JUQ19ERUJVRz15CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9GTTMxMzA9eQorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0FUOTFTQU05IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX1QxMERJRj15CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05cmxla19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05cmxla19kZWZjb25maWcKaW5kZXggMWM3NjY0Mi4uODExYmViYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9hdDkxc2FtOXJsZWtfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTlybGVrX2RlZmNvbmZpZwpAQCAtNDk2LDYgKzQ5Niw3IEBACiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9BVE1FTF9UU0FEQ0M9eQogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jbV94MzAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY21feDMwMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmMWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY21feDMwMF9kZWZjb25maWcKQEAgLTAsMCArMSwxNDY2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmMzCisjIFR1ZSBBdWcgMTkgMTE6MjY6NTQgMjAwOAorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iLWNtLXgzMDAiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xOAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEE9eQorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKKyMKKworIworIyBTdXBwb3J0ZWQgUFhBM3h4IFByb2Nlc3NvciBWYXJpYW50cworIworQ09ORklHX0NQVV9QWEEzMDA9eQorIyBDT05GSUdfQ1BVX1BYQTMxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUFhBMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9QWEE5MzAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HVU1TVElYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9FU0VSSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVFJJWkVQUzQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9FTV9YMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ09MSUJSSSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1pZTE9OSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTElUVExFVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVEFWT1JFVkIgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9TQUFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQVJNQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9DTV9YMzAwPXkKKyMgQ09ORklHX01BQ0hfTUFHSUNJQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9QQ00wMjcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEFfUEFMTSBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfRVpYIGlzIG5vdCBzZXQKK0NPTkZJR19QWEEzeHg9eQorIyBDT05GSUdfUFhBX1BXTSBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDMz15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKK0NPTkZJR19JT18zNj15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19PVVRFUl9DQUNIRT15CitDT05GSUdfQ0FDSEVfWFNDM0wyPXkKK0NPTkZJR19JV01NWFQ9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvbXRkYmxvY2s1IHJvb3Rmc3R5cGU9amZmczIgY29uc29sZT10dHlTMiwzODQwMCIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorQ09ORklHX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CitDT05GSUdfQlQ9bQorQ09ORklHX0JUX0wyQ0FQPW0KK0NPTkZJR19CVF9TQ089bQorQ09ORklHX0JUX1JGQ09NTT1tCitDT05GSUdfQlRfUkZDT01NX1RUWT15CitDT05GSUdfQlRfQk5FUD1tCitDT05GSUdfQlRfQk5FUF9NQ19GSUxURVI9eQorQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSPXkKK0NPTkZJR19CVF9ISURQPW0KKworIworIyBCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19CVF9IQ0lVU0I9bQorQ09ORklHX0JUX0hDSVVTQl9TQ089eQorIyBDT05GSUdfQlRfSENJQlRTRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSVVBUlQgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJVkhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTgwMjExPW0KKyMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfSUVFRTgwMjExX0NSWVBUX1dFUD1tCitDT05GSUdfSUVFRTgwMjExX0NSWVBUX0NDTVA9bQorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQPW0KKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NIQVJQX1NMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkQ9eQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9IMTkwMCBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfSURTPXkKKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfU0hBUlBTTCBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfUFhBM3h4PXkKKyMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfTE9XTEVWRUw9eQorIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKK0NPTkZJR19ETTkwMDA9eQorQ09ORklHX0RNOTAwMF9ERUJVR0xFVkVMPTAKK0NPTkZJR19ETTkwMDBfRk9SQ0VfU0lNUExFX1BIWV9QT0xMPXkKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0xBTl84MDIxMT15CitDT05GSUdfTElCRVJUQVM9bQorIyBDT05GSUdfTElCRVJUQVNfVVNCIGlzIG5vdCBzZXQKK0NPTkZJR19MSUJFUlRBU19TRElPPW0KKyMgQ09ORklHX0xJQkVSVEFTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRDEyMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9STkRJU19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUQVAgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CitDT05GSUdfS0VZQk9BUkRfUFhBMjd4PW0KKyMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QWEE9eQorIyBDT05GSUdfSTJDX1BYQV9TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKK0NPTkZJR19HUElPX1BDQTk1M1g9eQorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfQ0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CisKKyMKKyMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9QWEE9eQorIyBDT05GSUdfRkJfUFhBX1NNQVJUUEFORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUFhBX1BBUkFNRVRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1cxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQU0yMDBFUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UUz15CisjIENPTkZJR19GT05UXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfNngxMT15CisjIENPTkZJR19GT05UXzd4MTQgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UXzEweDE4IGlzIG5vdCBzZXQKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CitDT05GSUdfU09VTkQ9bQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX1RJTUVSPW0KK0NPTkZJR19TTkRfUENNPW0KKyMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENNX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQorQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorQ09ORklHX1NORF9BUk09eQorIyBDT05GSUdfU05EX1BYQTJYWF9BQzk3IGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVVNCPXkKKyMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz1tCitDT05GSUdfU05EX1BYQTJYWF9TT0M9bQorIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorQ09ORklHX0hJRF9ERUJVRz15CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVVNCX0hEUkMgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TSUVSUkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9bQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPW0KK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfTU1DX1BYQT1tCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPXkKKworIworIyBMRUQgZHJpdmVycworIworIyBDT05GSUdfTEVEU19QQ0E5NTMyIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX0dQSU89eQorIyBDT05GSUdfTEVEU19QQ0E5NTVYIGlzIG5vdCBzZXQKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKKyMgQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CisjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TQTExMDA9eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1NVTU1BUlk9eQorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKK0NPTkZJR19DSUZTPW0KKyMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0NJRlNfV0VBS19QV19IQVNIPXkKKyMgQ09ORklHX0NJRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9bQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCitDT05GSUdfQ1JZUFRPX0FFUz1tCisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVJDND1tCisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfVDEwRElGPXkKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCmluZGV4IDBjNTU2MjguLjgxZmFkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9qb3JuYWRhNzIwX2RlZmNvbmZpZwpAQCAtMSw4NCArMSwxNzQgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMjM6MTA6MzUgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNgorIyBUdWUgU2VwIDE2IDE4OjU2OjU4IDIwMDgKICMKIENPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiBDT05GSUdfTU1VPXkKLUNPTkZJR19VSUQxNj15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVD15CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0FSQ0hfTVREX1hJUD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwogIyBHZW5lcmFsIHNldHVwCiAjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogCiAjCiAjIFN5c3RlbSBUeXBlCiAjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NBMTEwMD15CiAjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVNNN1gwMEEgaXMgbm90IHNldAorQ09ORklHX0RNQUJPVU5DRT15CiAKICMKICMgU0ExMXgwIEltcGxlbWVudGF0aW9ucwpAQCAtOTEsMTIgKzE4MSwyMSBAQAogIyBDT05GSUdfU0ExMTAwX0gzODAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBMTEwMF9CQURHRTQgaXMgbm90IHNldAogQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwPXkKK0NPTkZJR19TQTExMDBfSk9STkFEQTcyMF9TU1A9eQogIyBDT05GSUdfU0ExMTAwX0hBQ0tLSVQgaXMgbm90IHNldAogIyBDT05GSUdfU0ExMTAwX0xBUlQgaXMgbm90IHNldAogIyBDT05GSUdfU0ExMTAwX1BMRUIgaXMgbm90IHNldAogIyBDT05GSUdfU0ExMTAwX1NIQU5OT04gaXMgbm90IHNldAogIyBDT05GSUdfU0ExMTAwX1NJTVBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfU1NQIGlzIG5vdCBzZXQKK0NPTkZJR19TQTExMDBfU1NQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwNSw0NCArMjA0LDcxIEBACiBDT05GSUdfQ1BVX1NBMTEwMD15CiBDT05GSUdfQ1BVXzMydjQ9eQogQ09ORklHX0NQVV9BQlJUX0VWND15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CiBDT05GSUdfQ1BVX0NBQ0hFX1Y0V0I9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfVExCX1Y0V0I9eQotQ09ORklHX0NQVV9NSU5JQ0FDSEU9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQogCiAjCiAjIFByb2Nlc3NvciBGZWF0dXJlcwogIworIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfU0ExMTExPXkKLUNPTkZJR19ETUFCT1VOQ0U9eQogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9OQogCiAjCiAjIEJ1cyBzdXBwb3J0CiAjCiBDT05GSUdfSVNBPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENDQVJEPXkKICMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUENNQ0lBPXkKK0NPTkZJR19QQ01DSUFfTE9BRF9DSVM9eQorQ09ORklHX1BDTUNJQV9JT0NUTD15CiAKICMKICMgUEMtY2FyZCBicmlkZ2VzCiAjCi1DT05GSUdfSTgyMzY1PXkKKyMgQ09ORklHX0k4MjM2NSBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKIENPTkZJR19QQ01DSUFfU0ExMTAwPXkKICMgQ09ORklHX1BDTUNJQV9TQTExMTEgaXMgbm90IHNldAotQ09ORklHX1BDQ0FSRF9OT05TVEFUSUM9eQogCiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIworQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfTk9ERVNfU0hJRlQ9MgorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUw9eQorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRElTQ09OVElHTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQogIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCkBAIC0xNTEsOCArMjc3LDkgQEAKICMKIENPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MAotQ09ORklHX0NNRExJTkU9ImtlZXBpbml0cmQgbWVtPTMyTSIKK0NPTkZJR19DTURMSU5FPSIiCiAjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTE3NCw3ICszMDEsNyBAQAogIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfQU9VVD1tCitDT05GSUdfQklORk1UX0FPVVQ9eQogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKIApAQCAtMTgyLDE4OCArMzA5LDEyIEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUE0gaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci1DT05GSUdfTVREX0RFQlVHPXkKLUNPTkZJR19NVERfREVCVUdfVkVSQk9TRT0xCi0jIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPW0KLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci0jIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9OT1NXQVA9eQotIyBDT05GSUdfTVREX0NGSV9CRV9CWVRFX1NXQVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVAgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci0jIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQotIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX1VUSUw9eQotIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwotIwotIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfU0ExMTAwPXkKLSMgQ09ORklHX01URF9FREI3MzEyIGlzIG5vdCBzZXQKLQotIwotIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxLTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAotCi0jCi0jIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1hEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPW0KLSMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9OQkQ9bQotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi1DT05GSUdfSURFPW0KLUNPTkZJR19CTEtfREVWX0lERT1tCi0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi0jIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURJU0s9bQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ1MgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFQ0Q9bQotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9bQotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIworIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorIyBDT05GSUdfQVBNX0VNVUxBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNzEsMTIgKzMyMiwxNyBAQAogIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogQ09ORklHX0lQX01VTFRJQ0FTVD15CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKICMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldApAQCAtMzg2LDMxICszNDIsNDIgQEAKICMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KLSMKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVI9eQogIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9DT05OVFJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUQUJMRVMgaXMgbm90IHNldAogCiAjCiAjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgogIwotIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldApAQCAtNDIwLDMwICszODcsMjIgQEAKICMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKICMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAogCiAjCiAjIE5ldHdvcmsgdGVzdGluZwogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwogIyBJckRBIHByb3RvY29scwogIwogQ09ORklHX0lSTEFOPW0KLSMgQ09ORklHX0lSTkVUIGlzIG5vdCBzZXQKIENPTkZJR19JUkNPTU09bQogIyBDT05GSUdfSVJEQV9VTFRSQSBpcyBub3Qgc2V0CiAKQEAgLTQ2OCw4OSArNDI3LDEwNSBAQAogIwogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKLSMgQ09ORklHX05TQ19GSVIgaXMgbm90IHNldAotIyBDT05GSUdfV0lOQk9ORF9GSVIgaXMgbm90IHNldAotIyBDT05GSUdfU01DX0lSQ0NfRklSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FMSV9GSVIgaXMgbm90IHNldAogQ09ORklHX1NBMTEwMF9GSVI9bQogIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTkJEPW0KKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFQ1M9eQorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorQ09ORklHX0lERV9QUk9DX0ZTPXkKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCisjIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVk9eQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCiAjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAogQ09ORklHX01JST1tCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjIFdpcmVsZXNzIExBTgogIwotQ09ORklHX05FVF9SQURJTz15Ci0KLSMKLSMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKLSMKLSMgQ09ORklHX1NUUklQIGlzIG5vdCBzZXQKLUNPTkZJR19BUkxBTj1tCi1DT05GSUdfV0FWRUxBTj1tCi1DT05GSUdfUENNQ0lBX1dBVkVMQU49bQotIyBDT05GSUdfUENNQ0lBX05FVFdBVkUgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIDgwMi4xMSBGcmVxdWVuY3kgSG9wcGluZyBjYXJkcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ01DSUFfUkFZQ1MgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0Ci0jCi1DT05GSUdfSEVSTUVTPW0KLSMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQKLSMKLUNPTkZJR19QQ01DSUFfSEVSTUVTPW0KLUNPTkZJR19BSVJPX0NTPW0KLSMgQ09ORklHX1BDTUNJQV9XTDM1MDEgaXMgbm90IHNldAotQ09ORklHX05FVF9XSVJFTEVTUz15Ci0KLSMKLSMgUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogQ09ORklHX05FVF9QQ01DSUE9eQogQ09ORklHX1BDTUNJQV8zQzU4OT1tCiBDT05GSUdfUENNQ0lBXzNDNTc0PW0KQEAgLTU2MCwzMiArNTM1LDIwIEBACiBDT05GSUdfUENNQ0lBX1NNQzkxQzkyPW0KIENPTkZJR19QQ01DSUFfWElSQzJQUz1tCiBDT05GSUdfUENNQ0lBX0FYTkVUPW0KLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9bQotIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfQVNZTkM9bQotIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfREVGTEFURT1tCi1DT05GSUdfUFBQX0JTRENPTVA9bQotIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTU5NSw3ICs1NTgsNiBAQAogQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTY0MAogQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTI0MAogIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKIApAQCAtNjAzLDIwICs1NjUsMzEgQEAKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKIENPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15Ci0jIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9IUDdYWD15CisjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CitDT05GSUdfVE9VQ0hTQ1JFRU5fSFA3WFg9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSFRDUEVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCiAjCkBAIC02MjUsMTcgKzU5OCwxOCBAQAogQ09ORklHX1NFUklPPXkKIENPTkZJR19TRVJJT19TRVJQT1JUPXkKICMgQ09ORklHX1NFUklPX1NBMTExMSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC02NTIsNjkgKzYyNiwxMjAgQEAKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIworQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MzIKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009bQogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogCiAjCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLQotIwogIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKICMKICMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwNDAgaXMgbm90IHNldAorIyBDT05GSUdfSVBXSVJFTEVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKK0NPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCisjIEkyQyBHUElPIGV4cGFuZGVyczoKICMKIAogIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19NQ1BfU0ExMVgwIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAKICMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAogIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKIENPTkZJR19GQj15Ci0jIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU09GVF9DVVJTT1IgaXMgbm90IHNldAorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCiAjIENPTkZJR19GQl9TQTExMDAgaXMgbm90IHNldAorQ09ORklHX0ZCX1MxRDEzWFhYPXkKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydApAQCAtNzIyLDk0ICs3NDcsMTEwIEBACiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCi1DT05GSUdfU09VTkQ9bQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIwotIyBDT05GSUdfU05EIGlzIG5vdCBzZXQKLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIwotIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfQ01PUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfU0ExMTAwPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBYRlMgc3VwcG9ydAotIworIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKLUNPTkZJR19JU085NjYwX0ZTPW0KLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAorIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAogCiAjCiAjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKICMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgogIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgUHNldWRvIGZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19ERVZGU19GUz15Ci1DT05GSUdfREVWRlNfTU9VTlQ9eQotQ09ORklHX0RFVkZTX0RFQlVHPXkKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCkBAIC04MjEsNzUgKzg2MiwxMjIgQEAKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfSkZGUzJfRlNfREVCVUc9MgotIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX1pMSUI9eQotQ09ORklHX0pGRlMyX1JUSU1FPXkKLSMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPW0KLUNPTkZJR19ORlNfVjM9eQotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19MT0NLRD1tCi1DT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvZmlsaW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTc9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjE9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjM9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjQ9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjY9bQorQ09ORklHX05MU19DT0RFUEFHRV84Njk9bQorQ09ORklHX05MU19DT0RFUEFHRV85MzY9bQorQ09ORklHX05MU19DT0RFUEFHRV85NTA9bQorQ09ORklHX05MU19DT0RFUEFHRV85MzI9bQorQ09ORklHX05MU19DT0RFUEFHRV85NDk9bQorQ09ORklHX05MU19DT0RFUEFHRV84NzQ9bQorQ09ORklHX05MU19JU084ODU5Xzg9bQorQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MT1tCitDT05GSUdfTkxTX0FTQ0lJPW0KK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KK0NPTkZJR19OTFNfSVNPODg1OV8yPW0KK0NPTkZJR19OTFNfSVNPODg1OV8zPW0KK0NPTkZJR19OTFNfSVNPODg1OV80PW0KK0NPTkZJR19OTFNfSVNPODg1OV81PW0KK0NPTkZJR19OTFNfSVNPODg1OV82PW0KK0NPTkZJR19OTFNfSVNPODg1OV83PW0KK0NPTkZJR19OTFNfSVNPODg1OV85PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTQ9bQorQ09ORklHX05MU19JU084ODU5XzE1PW0KK0NPTkZJR19OTFNfS09JOF9SPW0KK0NPTkZJR19OTFNfS09JOF9VPW0KK0NPTkZJR19OTFNfVVRGOD1tCisjIENPTkZJR19ETE0gaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1NMQUI9eQorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAogCkBAIC04OTgsMjEgKzk4NiwxMDAgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CiAKICMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKICMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29tYXAzX2JlYWdsZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXAzX2JlYWdsZV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MmQyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcDNfYmVhZ2xlX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEzMjEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzgKKyMgV2VkIE9jdCAgMSAxNzoxNDoyMiAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfT01BUD15CisjIENPTkZJR19BUkNIX01TTTdYMDBBIGlzIG5vdCBzZXQKKworIworIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfT01BUF9PVEc9eQorIyBDT05GSUdfQVJDSF9PTUFQMSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAyIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX09NQVAzPXkKKworIworIyBPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucworIworIyBDT05GSUdfT01BUF9ERUJVR19QT1dFUkRPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0RFQlVHX0NMT0NLRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfTVVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfTUNCU1AgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9NUFVfVElNRVIgaXMgbm90IHNldAorQ09ORklHX09NQVBfMzJLX1RJTUVSPXkKK0NPTkZJR19PTUFQXzMyS19USU1FUl9IWj0xMjgKK0NPTkZJR19PTUFQX0RNX1RJTUVSPXkKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDEgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMz15CitDT05GSUdfQVJDSF9PTUFQMzRYWD15CitDT05GSUdfQVJDSF9PTUFQMzQzMD15CisKKyMKKyMgT01BUCBCb2FyZCBUeXBlCisjCitDT05GSUdfTUFDSF9PTUFQM19CRUFHTEU9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVXzMydjZLPXkKK0NPTkZJR19DUFVfVjc9eQorQ09ORklHX0NQVV8zMnY3PXkKK0NPTkZJR19DUFVfQUJSVF9FVjc9eQorQ09ORklHX0NQVV9QQUJSVF9JRkFSPXkKK0NPTkZJR19DUFVfQ0FDSEVfVjc9eQorQ09ORklHX0NQVV9DQUNIRV9WSVBUPXkKK0NPTkZJR19DUFVfQ09QWV9WNj15CitDT05GSUdfQ1BVX1RMQl9WNz15CitDT05GSUdfQ1BVX0hBU19BU0lEPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQVJNX1RIVU1CRUUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFTX1RMU19SRUc9eQorIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEyOAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0hBU19IT0xFUz15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTovaG9tZS91c2VyL2J1aWxkcm9vdCBpcD0xOTIuMTY4LjAuMjoxOTIuMTY4LjAuMToxOTIuMTY4LjAuMToyNTUuMjU1LjI1NS4wOnRndDpldGgwOm9mZiBydyBjb25zb2xlPXR0eVMyLDExNTIwMG44IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKK0NPTkZJR19WRlA9eQorQ09ORklHX1ZGUHYzPXkKKyMgQ09ORklHX05FT04gaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPXkKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT15CisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EPXkKKyMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX01VU0VVTV9JRFMgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0lEUz15CisjIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTYzODQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTMyCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19PTUFQPXkKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTUDEzMDFfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CisjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fU1lTRlMgaXMgbm90IHNldAorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VDQjE0MDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKK0NPTkZJR19EQUI9eQorIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1M9eQorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01VU0JfSERSQz15CitDT05GSUdfVVNCX01VU0JfU09DPXkKKworIworIyBPTUFQIDM0M3ggaGlnaCBzcGVlZCBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9NVVNCX0hPU1Q9eQorIyBDT05GSUdfVVNCX01VU0JfUEVSSVBIRVJBTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVTQl9PVEcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMgaXMgbm90IHNldAorQ09ORklHX1VTQl9NVVNCX0hEUkNfSENEPXkKKyMgQ09ORklHX01VU0JfUElPX09OTFkgaXMgbm90IHNldAorQ09ORklHX1VTQl9JTlZFTlRSQV9ETUE9eQorIyBDT05GSUdfVVNCX1RJX0NQUElfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKKyMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1VTQjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX002NjU5Mj15CitDT05GSUdfVVNCX002NjU5Mj15CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRD15CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VUSD1tCitDT05GSUdfVVNCX0VUSF9STkRJUz15CisjIENPTkZJR19VU0JfR0FER0VURlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JRElfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUgaXMgbm90IHNldAorQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorIyBDT05GSUdfU0RJT19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX01NQ19TREhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorQ09ORklHX1FVT1RBPXkKKyMgQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HPXkKKyMgQ09ORklHX1FGTVRfVjEgaXMgbm90IHNldAorQ09ORklHX1FGTVRfVjI9eQorQ09ORklHX1FVT1RBQ1RMPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0NDSVRUPXkKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKK0NPTkZJR19MSUJDUkMzMkM9eQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9sZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2xkcF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4YTIxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9sZHBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA0NCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNQorIyBGcmkgT2N0IDEwIDExOjQ5OjQxIDIwMDgKKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfTU1VPXkKKyMgQ09ORklHX05PX0lPUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVD15CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfT01BUD15CisjIENPTkZJR19BUkNIX01TTTdYMDBBIGlzIG5vdCBzZXQKKworIworIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfT01BUF9PVEc9eQorIyBDT05GSUdfQVJDSF9PTUFQMSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAyIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX09NQVAzPXkKKworIworIyBPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucworIworIyBDT05GSUdfT01BUF9ERUJVR19QT1dFUkRPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0RFQlVHX0NMT0NLRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01VWD15CitDT05GSUdfT01BUF9NVVhfREVCVUc9eQorQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTPXkKK0NPTkZJR19PTUFQX01DQlNQPXkKKyMgQ09ORklHX09NQVBfTVBVX1RJTUVSIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQXzMyS19USU1FUj15CitDT05GSUdfT01BUF8zMktfVElNRVJfSFo9MTI4CitDT05GSUdfT01BUF9ETV9USU1FUj15CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDIgaXMgbm90IHNldAorQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDM9eQorQ09ORklHX09NQVBfU0VSSUFMX1dBS0U9eQorQ09ORklHX0FSQ0hfT01BUDM0WFg9eQorQ09ORklHX0FSQ0hfT01BUDM0MzA9eQorCisjCisjIE9NQVAgQm9hcmQgVHlwZQorIworIyBDT05GSUdfTUFDSF9PTUFQM19CRUFHTEUgaXMgbm90IHNldAorQ09ORklHX01BQ0hfT01BUF9MRFA9eQorIyBDT05GSUdfTUFDSF9PVkVSTyBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfMzJ2Nks9eQorQ09ORklHX0NQVV9WNz15CitDT05GSUdfQ1BVXzMydjc9eQorQ09ORklHX0NQVV9BQlJUX0VWNz15CitDT05GSUdfQ1BVX1BBQlJUX0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WNz15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQ9eQorQ09ORklHX0NQVV9DT1BZX1Y2PXkKK0NPTkZJR19DUFVfVExCX1Y3PXkKK0NPTkZJR19DUFVfSEFTX0FTSUQ9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19BUk1fVEhVTUJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfVExTX1JFRz15CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEyOAorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19PQUJJX0NPTVBBVD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0hBU19IT0xFUz15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTovaG9tZS91c2VyL2J1aWxkcm9vdCBpcD0xOTIuMTY4LjAuMjoxOTIuMTY4LjAuMToxOTIuMTY4LjAuMToyNTUuMjU1LjI1NS4wOnRndDpldGgwOm9mZiBydyBjb25zb2xlPXR0eVMyLDExNTIwMG44IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CitDT05GSUdfVkZQPXkKK0NPTkZJR19WRlB2Mz15CisjIENPTkZJR19ORU9OIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfTUlTQz15CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTE2Mzg0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDY9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0zMgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfT01BUD15CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTUDEzMDFfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX09NQVAyNFhYPXkKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQorQ09ORklHX0dQSU9MSUI9eQorIyBDT05GSUdfREVCVUdfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1NZU0ZTIGlzIG5vdCBzZXQKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMwMSBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DUDIzUzA4IGlzIG5vdCBzZXQKK0NPTkZJR19XMT15CisKKyMKKyMgMS13aXJlIEJ1cyBNYXN0ZXJzCisjCisjIENPTkZJR19XMV9NQVNURVJfRFMyNDgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxX01BU1RFUl9EUzFXTSBpcyBub3Qgc2V0CisjIENPTkZJR19XMV9NQVNURVJfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgMS13aXJlIFNsYXZlcworIworIyBDT05GSUdfVzFfU0xBVkVfVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVzFfU0xBVkVfU01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19XMV9TTEFWRV9EUzI0MzMgaXMgbm90IHNldAorIyBDT05GSUdfVzFfU0xBVkVfRFMyNzYwIGlzIG5vdCBzZXQKK0NPTkZJR19QT1dFUl9TVVBQTFk9eQorIyBDT05GSUdfUE9XRVJfU1VQUExZX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQV9QT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworQ09ORklHX0RBQj15CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPW0KKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKKyMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENNX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQorQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorQ09ORklHX1NORF9BUk09eQorQ09ORklHX1NORF9TUEk9eQorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfQ01PUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1BSSU5UX1FVT1RBX1dBUk5JTkc9eQorIyBDT05GSUdfUUZNVF9WMSBpcyBub3Qgc2V0CitDT05GSUdfUUZNVF9WMj15CitDT05GSUdfUVVPVEFDVEw9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTVVURVhFUz15CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD15CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX1QxMERJRj15CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorQ09ORklHX0xJQkNSQzMyQz15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29yaW9uNXhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vcmlvbjV4X2RlZmNvbmZpZwppbmRleCA0MDE3ZDgzLi5iMjQ1NmNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29yaW9uNXhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb3Jpb241eF9kZWZjb25maWcKQEAgLTE3NiwxNCArMTc2LDE3IEBACiBDT05GSUdfTUFDSF9ETlMzMjM9eQogQ09ORklHX01BQ0hfVFMyMDk9eQogQ09ORklHX01BQ0hfTElOS1NUQVRJT05fUFJPPXkKK0NPTkZJR19NQUNIX0xJTktTVEFUSU9OX01JTkk9eQogQ09ORklHX01BQ0hfVFM0MDk9eQogQ09ORklHX01BQ0hfV1JUMzUwTl9WMj15CiBDT05GSUdfTUFDSF9UUzc4WFg9eQogQ09ORklHX01BQ0hfTVYyMTIwPXkKK0NPTkZJR19NQUNIX0VETUlOSV9WMj15CiBDT05GSUdfTUFDSF9NU1MyPXkKIENPTkZJR19NQUNIX1dOUjg1NFQ9eQogQ09ORklHX01BQ0hfUkQ4OEY1MTgxTF9HRT15CiBDT05GSUdfTUFDSF9SRDg4RjUxODFMX0ZYTz15CitDT05GSUdfTUFDSF9SRDg4RjYxODNBUF9HRT15CiAKICMKICMgQm9vdCBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL292ZXJvX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb3Zlcm9fZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MjAwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL292ZXJvX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE4ODUgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzgKKyMgRnJpIE9jdCAgMyAxMTo1MDozNCAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX09QUk9GSUxFX0FSTVY3PXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUFJPRklMSU5HPXkKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX09QUk9GSUxFPXkKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CitDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CitDT05GSUdfTEJEPXkKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0xTRj15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX09NQVA9eQorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgVEkgT01BUCBJbXBsZW1lbnRhdGlvbnMKKyMKK0NPTkZJR19BUkNIX09NQVBfT1RHPXkKKyMgQ09ORklHX0FSQ0hfT01BUDEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQMiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9PTUFQMz15CisKKyMKKyMgT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKKyMgQ09ORklHX09NQVBfREVCVUdfUE9XRVJET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9ERUJVR19DTE9DS0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX01VWCBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9NQ0JTUD15CisjIENPTkZJR19PTUFQX01QVV9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfT01BUF8zMktfVElNRVI9eQorQ09ORklHX09NQVBfMzJLX1RJTUVSX0haPTEyOAorQ09ORklHX09NQVBfRE1fVElNRVI9eQorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMSBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzPXkKK0NPTkZJR19BUkNIX09NQVAzNFhYPXkKK0NPTkZJR19BUkNIX09NQVAzNDMwPXkKKworIworIyBPTUFQIEJvYXJkIFR5cGUKKyMKKyMgQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX09WRVJPPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKKworIworIyBQb3dlciBtYW5hZ2VtZW50CisjCisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV8zMnY2Sz15CitDT05GSUdfQ1BVX1Y3PXkKK0NPTkZJR19DUFVfMzJ2Nz15CitDT05GSUdfQ1BVX0FCUlRfRVY3PXkKK0NPTkZJR19DUFVfUEFCUlRfSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjc9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKK0NPTkZJR19BUk1fVEhVTUJFRT15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfVExTX1JFRz15CisjIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTI4CitDT05GSUdfQUVBQkk9eQorIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9IQVNfSE9MRVM9eQorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfTEVEUz15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0iIGRlYnVnICIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0tFWEVDPXkKK0NPTkZJR19BVEFHU19QUk9DPXkKKworIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CitDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTPXkKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19WRlA9eQorQ09ORklHX1ZGUHYzPXkKK0NPTkZJR19ORU9OPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD1tCitDT05GSUdfQklORk1UX01JU0M9eQorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT15CisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1RVTk5FTD1tCitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj1tCisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD1tCitDT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorQ09ORklHX0JUPXkKK0NPTkZJR19CVF9MMkNBUD15CitDT05GSUdfQlRfU0NPPXkKK0NPTkZJR19CVF9SRkNPTU09eQorQ09ORklHX0JUX1JGQ09NTV9UVFk9eQorQ09ORklHX0JUX0JORVA9eQorQ09ORklHX0JUX0JORVBfTUNfRklMVEVSPXkKK0NPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUj15CitDT05GSUdfQlRfSElEUD15CisKKyMKKyMgQmx1ZXRvb3RoIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfQlRfSENJVVNCPW0KK0NPTkZJR19CVF9IQ0lVU0JfU0NPPXkKKyMgQ09ORklHX0JUX0hDSUJUVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJUU0RJTyBpcyBub3Qgc2V0CitDT05GSUdfQlRfSENJVUFSVD15CitDT05GSUdfQlRfSENJVUFSVF9IND15CitDT05GSUdfQlRfSENJVUFSVF9CQ1NQPXkKKyMgQ09ORklHX0JUX0hDSVVBUlRfTEwgaXMgbm90IHNldAorQ09ORklHX0JUX0hDSUJDTTIwM1g9eQorQ09ORklHX0JUX0hDSUJQQTEwWD15CisjIENPTkZJR19CVF9IQ0lCRlVTQiBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lWSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworQ09ORklHX0NGRzgwMjExPXkKK0NPTkZJR19OTDgwMjExPXkKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CitDT05GSUdfTUFDODAyMTE9eQorCisjCisjIFJhdGUgY29udHJvbCBhbGdvcml0aG0gc2VsZWN0aW9uCisjCitDT05GSUdfTUFDODAyMTFfUkNfUElEPXkKK0NPTkZJR19NQUM4MDIxMV9SQ19ERUZBVUxUX1BJRD15CitDT05GSUdfTUFDODAyMTFfUkNfREVGQVVMVD0icGlkIgorIyBDT05GSUdfTUFDODAyMTFfTUVTSCBpcyBub3Qgc2V0CitDT05GSUdfTUFDODAyMTFfTEVEUz15CisjIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExX0RFQlVHX01FTlUgaXMgbm90IHNldAorQ09ORklHX0lFRUU4MDIxMT15CisjIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9XRVA9eQorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9DQ01QPXkKK0NPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUD15CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorQ09ORklHX0NEUk9NX1BLVENEVkQ9bQorQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CisjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CitDT05GSUdfRUVQUk9NXzkzQ1g2PW0KKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUkFJRF9BVFRSUz1tCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPW0KKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19NRD15CitDT05GSUdfQkxLX0RFVl9NRD1tCitDT05GSUdfTURfTElORUFSPW0KK0NPTkZJR19NRF9SQUlEMD1tCitDT05GSUdfTURfUkFJRDE9bQorQ09ORklHX01EX1JBSUQxMD1tCitDT05GSUdfTURfUkFJRDQ1Nj1tCitDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15CitDT05GSUdfTURfTVVMVElQQVRIPW0KK0NPTkZJR19NRF9GQVVMVFk9bQorQ09ORklHX0JMS19ERVZfRE09bQorIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX0RNX0NSWVBUPW0KK0NPTkZJR19ETV9TTkFQU0hPVD1tCitDT05GSUdfRE1fTUlSUk9SPW0KK0NPTkZJR19ETV9aRVJPPW0KK0NPTkZJR19ETV9NVUxUSVBBVEg9bQorQ09ORklHX0RNX0RFTEFZPW0KKyMgQ09ORklHX0RNX1VFVkVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9bQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CitDT05GSUdfVFVOPW0KKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dMQU5fODAyMTE9eQorQ09ORklHX0xJQkVSVEFTPXkKK0NPTkZJR19MSUJFUlRBU19VU0I9eQorQ09ORklHX0xJQkVSVEFTX1NESU89eQorQ09ORklHX0xJQkVSVEFTX0RFQlVHPXkKK0NPTkZJR19VU0JfWkQxMjAxPW0KKyMgQ09ORklHX1VTQl9ORVRfUk5ESVNfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfUlRMODE4Nz1tCisjIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CitDT05GSUdfUDU0X0NPTU1PTj1tCitDT05GSUdfUDU0X1VTQj1tCisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0hPU1RBUD1tCitDT05GSUdfSE9TVEFQX0ZJUk1XQVJFPXkKK0NPTkZJR19IT1NUQVBfRklSTVdBUkVfTlZSQU09eQorIyBDT05GSUdfQjQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0M0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19aRDEyMTFSVyBpcyBub3Qgc2V0CisjIENPTkZJR19SVDJYMDAgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCitDT05GSUdfVVNCX0NBVEM9bQorQ09ORklHX1VTQl9LQVdFVEg9bQorQ09ORklHX1VTQl9QRUdBU1VTPW0KK0NPTkZJR19VU0JfUlRMODE1MD1tCitDT05GSUdfVVNCX1VTQk5FVD15CitDT05GSUdfVVNCX05FVF9BWDg4MTdYPXkKK0NPTkZJR19VU0JfTkVUX0NEQ0VUSEVSPXkKK0NPTkZJR19VU0JfTkVUX0RNOTYwMT1tCitDT05GSUdfVVNCX05FVF9HTDYyMEE9bQorQ09ORklHX1VTQl9ORVRfTkVUMTA4MD1tCitDT05GSUdfVVNCX05FVF9QTFVTQj1tCitDT05GSUdfVVNCX05FVF9NQ1M3ODMwPW0KK0NPTkZJR19VU0JfTkVUX1JORElTX0hPU1Q9bQorQ09ORklHX1VTQl9ORVRfQ0RDX1NVQlNFVD1tCitDT05GSUdfVVNCX0FMSV9NNTYzMj15CitDT05GSUdfVVNCX0FOMjcyMD15CitDT05GSUdfVVNCX0JFTEtJTj15CitDT05GSUdfVVNCX0FSTUxJTlVYPXkKK0NPTkZJR19VU0JfRVBTT04yODg4PXkKK0NPTkZJR19VU0JfS0MyMTkwPXkKK0NPTkZJR19VU0JfTkVUX1pBVVJVUz1tCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUF9NUFBFPW0KK0NPTkZJR19QUFBPRT1tCisjIENPTkZJR19QUFBPTDJUUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9MSUZFQk9PSz15CitDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTMyCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19PTUFQPXkKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19FRVBST009eQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19JU1AxMzAxX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX1NQSV9PTUFQMjRYWD15CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKK0NPTkZJR19ERUJVR19HUElPPXkKK0NPTkZJR19HUElPX1NZU0ZTPXkKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMwMSBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DUDIzUzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKK0NPTkZJR19QT1dFUl9TVVBQTFk9bQorIyBDT05GSUdfUE9XRVJfU1VQUExZX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQV9QT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VDQjE0MDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworQ09ORklHX1ZJREVPX0RFVj1tCitDT05GSUdfVklERU9fVjRMMl9DT01NT049bQorQ09ORklHX1ZJREVPX0FMTE9XX1Y0TDE9eQorQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUPXkKK0NPTkZJR19EVkJfQ09SRT1tCitDT05GSUdfVklERU9fTUVESUE9bQorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworQ09ORklHX01FRElBX0FUVEFDSD15CitDT05GSUdfTUVESUFfVFVORVI9bQorIyBDT05GSUdfTUVESUFfVFVORVJfQ1VTVE9NSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19NRURJQV9UVU5FUl9TSU1QTEU9bQorQ09ORklHX01FRElBX1RVTkVSX1REQTgyOTA9bQorQ09ORklHX01FRElBX1RVTkVSX1REQTgyN1g9bQorQ09ORklHX01FRElBX1RVTkVSX1REQTE4MjcxPW0KK0NPTkZJR19NRURJQV9UVU5FUl9UREE5ODg3PW0KK0NPTkZJR19NRURJQV9UVU5FUl9URUE1NzYxPW0KK0NPTkZJR19NRURJQV9UVU5FUl9URUE1NzY3PW0KK0NPTkZJR19NRURJQV9UVU5FUl9NVDIwWFg9bQorQ09ORklHX01FRElBX1RVTkVSX01UMjA2MD1tCitDT05GSUdfTUVESUFfVFVORVJfTVQyMjY2PW0KK0NPTkZJR19NRURJQV9UVU5FUl9RVDEwMTA9bQorQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOD1tCitDT05GSUdfTUVESUFfVFVORVJfWEM1MDAwPW0KK0NPTkZJR19NRURJQV9UVU5FUl9NWEw1MDA1Uz1tCitDT05GSUdfVklERU9fVjRMMj1tCitDT05GSUdfVklERU9fVjRMMT1tCitDT05GSUdfVklERU9fVFZFRVBST009bQorQ09ORklHX1ZJREVPX1RVTkVSPW0KK0NPTkZJR19WSURFT19DQVBUVVJFX0RSSVZFUlM9eQorIyBDT05GSUdfVklERU9fQURWX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19IRUxQRVJfQ0hJUFNfQVVUTz15CitDT05GSUdfVklERU9fTVNQMzQwMD1tCitDT05GSUdfVklERU9fQ1M1M0wzMkE9bQorQ09ORklHX1ZJREVPX1dNODc3NT1tCitDT05GSUdfVklERU9fU0FBNzExWD1tCitDT05GSUdfVklERU9fQ1gyNTg0MD1tCitDT05GSUdfVklERU9fQ1gyMzQxWD1tCisjIENPTkZJR19WSURFT19WSVZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NQSUEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fQ1BJQTIgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0NkEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0OSBpcyBub3Qgc2V0CisjIENPTkZJR19UVU5FUl8zMDM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0FVMDgyOCBpcyBub3Qgc2V0CitDT05GSUdfVjRMX1VTQl9EUklWRVJTPXkKK0NPTkZJR19VU0JfVklERU9fQ0xBU1M9bQorQ09ORklHX1VTQl9WSURFT19DTEFTU19JTlBVVF9FVkRFVj15CisjIENPTkZJR19VU0JfR1NQQ0EgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX1BWUlVTQjI9bQorQ09ORklHX1ZJREVPX1BWUlVTQjJfU1lTRlM9eQorQ09ORklHX1ZJREVPX1BWUlVTQjJfRFZCPXkKKyMgQ09ORklHX1ZJREVPX1BWUlVTQjJfREVCVUdJRkMgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fRU0yOFhYIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19VU0JWSVNJT049bQorQ09ORklHX1ZJREVPX1VTQlZJREVPPW0KK0NPTkZJR19VU0JfVklDQU09bQorQ09ORklHX1VTQl9JQk1DQU09bQorQ09ORklHX1VTQl9LT05JQ0FXQz1tCitDT05GSUdfVVNCX1FVSUNLQ0FNX01FU1NFTkdFUj1tCisjIENPTkZJR19VU0JfRVQ2MVgyNTEgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09WQ0FNQ0hJUD1tCitDT05GSUdfVVNCX1c5OTY4Q0Y9bQorQ09ORklHX1VTQl9PVjUxMT1tCitDT05GSUdfVVNCX1NFNDAxPW0KK0NPTkZJR19VU0JfU045QzEwMj1tCitDT05GSUdfVVNCX1NUVjY4MD1tCisjIENPTkZJR19VU0JfWkMwMzAxIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfUFdDPW0KKyMgQ09ORklHX1VTQl9QV0NfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9aUjM2NFhYPW0KKyMgQ09ORklHX1VTQl9TVEtXRUJDQU0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1MyMjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPQ19DQU1FUkEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0hfTU9CSUxFX0NFVSBpcyBub3Qgc2V0CitDT05GSUdfUkFESU9fQURBUFRFUlM9eQorIyBDT05GSUdfVVNCX0RTQlIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NJNDcwWCBpcyBub3Qgc2V0CitDT05GSUdfRFZCX0NBUFRVUkVfRFJJVkVSUz15CisjIENPTkZJR19UVFBDSV9FRVBST00gaXMgbm90IHNldAorCisjCisjIFN1cHBvcnRlZCBVU0IgQWRhcHRlcnMKKyMKK0NPTkZJR19EVkJfVVNCPW0KKyMgQ09ORklHX0RWQl9VU0JfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0RWQl9VU0JfQTgwMD1tCitDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUI9bQorIyBDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUJfRkFVTFRZIGlzIG5vdCBzZXQKK0NPTkZJR19EVkJfVVNCX0RJQlVTQl9NQz1tCitDT05GSUdfRFZCX1VTQl9ESUIwNzAwPW0KK0NPTkZJR19EVkJfVVNCX1VNVF8wMTA9bQorQ09ORklHX0RWQl9VU0JfQ1hVU0I9bQorQ09ORklHX0RWQl9VU0JfTTkyMFg9bQorQ09ORklHX0RWQl9VU0JfR0w4NjE9bQorQ09ORklHX0RWQl9VU0JfQVU2NjEwPW0KK0NPTkZJR19EVkJfVVNCX0RJR0lUVj1tCitDT05GSUdfRFZCX1VTQl9WUDcwNDU9bQorQ09ORklHX0RWQl9VU0JfVlA3MDJYPW0KK0NPTkZJR19EVkJfVVNCX0dQOFBTSz1tCitDT05GSUdfRFZCX1VTQl9OT1ZBX1RfVVNCMj1tCitDT05GSUdfRFZCX1VTQl9UVFVTQjI9bQorQ09ORklHX0RWQl9VU0JfRFRUMjAwVT1tCitDT05GSUdfRFZCX1VTQl9PUEVSQTE9bQorQ09ORklHX0RWQl9VU0JfQUY5MDA1PW0KK0NPTkZJR19EVkJfVVNCX0FGOTAwNV9SRU1PVEU9bQorIyBDT05GSUdfRFZCX1VTQl9EVzIxMDIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1VTQl9BTllTRUUgaXMgbm90IHNldAorQ09ORklHX0RWQl9UVFVTQl9CVURHRVQ9bQorQ09ORklHX0RWQl9UVFVTQl9ERUM9bQorQ09ORklHX0RWQl9DSU5FUkdZVDI9bQorIyBDT05GSUdfRFZCX0NJTkVSR1lUMl9UVU5JTkcgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1NJQU5PX1NNUzFYWFggaXMgbm90IHNldAorCisjCisjIFN1cHBvcnRlZCBGbGV4Q29wSUkgKEIyQzIpIEFkYXB0ZXJzCisjCisjIENPTkZJR19EVkJfQjJDMl9GTEVYQ09QIGlzIG5vdCBzZXQKKworIworIyBTdXBwb3J0ZWQgRFZCIEZyb250ZW5kcworIworCisjCisjIEN1c3RvbWlzZSBEVkIgRnJvbnRlbmRzCisjCisjIENPTkZJR19EVkJfRkVfQ1VTVE9NSVNFIGlzIG5vdCBzZXQKKworIworIyBEVkItUyAoc2F0ZWxsaXRlKSBmcm9udGVuZHMKKyMKK0NPTkZJR19EVkJfQ1gyNDExMD1tCitDT05GSUdfRFZCX0NYMjQxMjM9bQorQ09ORklHX0RWQl9NVDMxMj1tCitDT05GSUdfRFZCX1M1SDE0MjA9bQorQ09ORklHX0RWQl9TVFYwMjk5PW0KK0NPTkZJR19EVkJfVERBODA4Mz1tCitDT05GSUdfRFZCX1REQTEwMDg2PW0KK0NPTkZJR19EVkJfVkVTMVg5Mz1tCitDT05GSUdfRFZCX1RVTkVSX0lURDEwMDA9bQorQ09ORklHX0RWQl9UREE4MjZYPW0KK0NPTkZJR19EVkJfVFVBNjEwMD1tCisKKyMKKyMgRFZCLVQgKHRlcnJlc3RyaWFsKSBmcm9udGVuZHMKKyMKK0NPTkZJR19EVkJfU1A4ODcwPW0KK0NPTkZJR19EVkJfU1A4ODdYPW0KK0NPTkZJR19EVkJfQ1gyMjcwMD1tCitDT05GSUdfRFZCX0NYMjI3MDI9bQorIyBDT05GSUdfRFZCX0RSWDM5N1hEIGlzIG5vdCBzZXQKK0NPTkZJR19EVkJfTDY0NzgxPW0KK0NPTkZJR19EVkJfVERBMTAwNFg9bQorQ09ORklHX0RWQl9OWFQ2MDAwPW0KK0NPTkZJR19EVkJfTVQzNTI9bQorQ09ORklHX0RWQl9aTDEwMzUzPW0KK0NPTkZJR19EVkJfRElCMzAwME1CPW0KK0NPTkZJR19EVkJfRElCMzAwME1DPW0KK0NPTkZJR19EVkJfRElCNzAwME09bQorQ09ORklHX0RWQl9ESUI3MDAwUD1tCitDT05GSUdfRFZCX1REQTEwMDQ4PW0KKworIworIyBEVkItQyAoY2FibGUpIGZyb250ZW5kcworIworQ09ORklHX0RWQl9WRVMxODIwPW0KK0NPTkZJR19EVkJfVERBMTAwMjE9bQorQ09ORklHX0RWQl9UREExMDAyMz1tCitDT05GSUdfRFZCX1NUVjAyOTc9bQorCisjCisjIEFUU0MgKE5vcnRoIEFtZXJpY2FuL0tvcmVhbiBUZXJyZXN0cmlhbC9DYWJsZSBEVFYpIGZyb250ZW5kcworIworQ09ORklHX0RWQl9OWFQyMDBYPW0KKyMgQ09ORklHX0RWQl9PUjUxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9PUjUxMTMyIGlzIG5vdCBzZXQKK0NPTkZJR19EVkJfQkNNMzUxMD1tCitDT05GSUdfRFZCX0xHRFQzMzBYPW0KK0NPTkZJR19EVkJfUzVIMTQwOT1tCitDT05GSUdfRFZCX0FVODUyMj1tCitDT05GSUdfRFZCX1M1SDE0MTE9bQorCisjCisjIERpZ2l0YWwgdGVycmVzdHJpYWwgb25seSB0dW5lcnMvUExMCisjCitDT05GSUdfRFZCX1BMTD1tCitDT05GSUdfRFZCX1RVTkVSX0RJQjAwNzA9bQorCisjCisjIFNFQyBjb250cm9sIGRldmljZXMgZm9yIERWQi1TCisjCitDT05GSUdfRFZCX0xOQlAyMT1tCisjIENPTkZJR19EVkJfSVNMNjQwNSBpcyBub3Qgc2V0CitDT05GSUdfRFZCX0lTTDY0MjE9bQorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ESVNQTEFZX1NVUFBPUlQ9eQorCisjCisjIERpc3BsYXkgaGFyZHdhcmUgZHJpdmVycworIworCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CitDT05GSUdfU05EX0hXREVQPXkKK0NPTkZJR19TTkRfUkFXTUlEST15CitDT05GSUdfU05EX1NFUVVFTkNFUj1tCisjIENPTkZJR19TTkRfU0VRX0RVTU1ZIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKK0NPTkZJR19TTkRfVkVSQk9TRV9QUklOVEs9eQorQ09ORklHX1NORF9ERUJVRz15CisjIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENNX1hSVU5fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9EUklWRVJTPXkKKyMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0FSTT15CitDT05GSUdfU05EX1NQST15CitDT05GSUdfU05EX1VTQj15CitDT05GSUdfU05EX1VTQl9BVURJTz15CitDT05GSUdfU05EX1VTQl9DQUlBUT1tCitDT05GSUdfU05EX1VTQl9DQUlBUV9JTlBVVD15CitDT05GSUdfU05EX1NPQz15CitDT05GSUdfU05EX09NQVBfU09DPXkKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKK0NPTkZJR19ISURfREVCVUc9eQorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9eQorIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CitDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKK0NPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9NVVNCX0hEUkM9eQorQ09ORklHX1VTQl9NVVNCX1NPQz15CisKKyMKKyMgT01BUCAzNDN4IGhpZ2ggc3BlZWQgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfTVVTQl9IT1NUPXkKKyMgQ09ORklHX1VTQl9NVVNCX1BFUklQSEVSQUwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfT1RHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTVVTQl9IRFJDX0hDRD15CitDT05GSUdfTVVTQl9QSU9fT05MWT15CisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCitDT05GSUdfVVNCX0FDTT1tCitDT05GSUdfVVNCX1BSSU5URVI9bQorQ09ORklHX1VTQl9XRE09eQorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworQ09ORklHX1VTQl9TRVJJQUw9bQorIyBDT05GSUdfVVNCX0VaVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FJUkNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NIMzQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9GVU5TT0ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVVVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1RPUk9MQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09USTY4NTggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TUENQOFg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSFA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCitDT05GSUdfVVNCX0VNSTYyPW0KK0NPTkZJR19VU0JfRU1JMjY9bQorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTEVHT1RPV0VSPW0KK0NPTkZJR19VU0JfTENEPW0KKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorQ09ORklHX1VTQl9MRUQ9bQorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FPXkKKworIworIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKK0NPTkZJR19TRElPX1VBUlQ9eQorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorCisjCisjIExFRCBkcml2ZXJzCisjCisjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorQ09ORklHX0xFRFNfR1BJTz15CisjIENPTkZJR19MRURTX1BDQTk1NVggaXMgbm90IHNldAorCisjCisjIExFRCBUcmlnZ2VycworIworQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CitDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CisjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfQ01PUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19YRlNfRlM9bQorIyBDT05GSUdfWEZTX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorQ09ORklHX1FVT1RBPXkKKyMgQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HPXkKKyMgQ09ORklHX1FGTVRfVjEgaXMgbm90IHNldAorQ09ORklHX1FGTVRfVjI9eQorQ09ORklHX1FVT1RBQ1RMPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz1tCitDT05GSUdfSk9MSUVUPXkKK0NPTkZJR19aSVNPRlM9eQorQ09ORklHX1VERl9GUz1tCitDT05GSUdfVURGX05MUz15CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKK0NPTkZJR19KRkZTMl9GU19YQVRUUj15CitDT05GSUdfSkZGUzJfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19KRkZTMl9GU19TRUNVUklUWT15CitDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUz15CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfTFpPPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CitDT05GSUdfSkZGUzJfUlVCSU49eQorIyBDT05GSUdfSkZGUzJfQ01PREVfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFk9eQorIyBDT05GSUdfSkZGUzJfQ01PREVfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DTU9ERV9GQVZPVVJMWk8gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKK0NPTkZJR19TQ0hFRFNUQVRTPXkKK0NPTkZJR19USU1FUl9TVEFUUz15CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTVVURVhFUz15CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0ZUUkFDRT15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19YT1JfQkxPQ0tTPW0KK0NPTkZJR19BU1lOQ19DT1JFPW0KK0NPTkZJR19BU1lOQ19NRU1DUFk9bQorQ09ORklHX0FTWU5DX1hPUj1tCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUVBRD1tCitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9bQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fR0YxMjhNVUw9bQorQ09ORklHX0NSWVBUT19OVUxMPW0KK0NPTkZJR19DUllQVE9fQ1JZUFREPW0KKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fVEVTVD1tCisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworQ09ORklHX0NSWVBUT19DQkM9eQorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPXkKK0NPTkZJR19DUllQVE9fTFJXPW0KK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0hNQUM9bQorQ09ORklHX0NSWVBUT19YQ0JDPW0KKworIworIyBEaWdlc3QKKyMKK0NPTkZJR19DUllQVE9fQ1JDMzJDPW0KK0NPTkZJR19DUllQVE9fTUQ0PW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9eQorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorQ09ORklHX0NSWVBUT19TSEEyNTY9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCisKKyMKKyMgQ2lwaGVycworIworQ09ORklHX0NSWVBUT19BRVM9eQorQ09ORklHX0NSWVBUT19BTlVCSVM9bQorQ09ORklHX0NSWVBUT19BUkM0PXkKK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQorQ09ORklHX0NSWVBUT19DQU1FTExJQT1tCitDT05GSUdfQ1JZUFRPX0NBU1Q1PW0KK0NPTkZJR19DUllQVE9fQ0FTVDY9bQorQ09ORklHX0NSWVBUT19ERVM9eQorQ09ORklHX0NSWVBUT19GQ1JZUFQ9bQorQ09ORklHX0NSWVBUT19LSEFaQUQ9bQorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fVEVBPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPW0KKworIworIyBDb21wcmVzc2lvbgorIworQ09ORklHX0NSWVBUT19ERUZMQVRFPW0KKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD15CitDT05GSUdfQ1JDMTY9bQorQ09ORklHX0NSQ19UMTBESUY9eQorQ09ORklHX0NSQ19JVFVfVD15CitDT05GSUdfQ1JDMzI9eQorQ09ORklHX0NSQzc9eQorQ09ORklHX0xJQkNSQzMyQz15CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX0xaT19DT01QUkVTUz15CitDT05GSUdfTFpPX0RFQ09NUFJFU1M9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9wYWxtejcyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvcGFsbXo3Ml9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0NWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcGFsbXo3Ml9kZWZjb25maWcKQEAgLTAsMCArMSw5NTEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzQKKyMgU3VuIEF1ZyAyNCAwMjoyOToyNyAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19IQVZFX1BXTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEE9eQorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfR1VNU1RJWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAorIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEFfRVNFUklFUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RSSVpFUFM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfRU1fWDI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xJVFRMRVRPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RBVk9SRVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU0FBUiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NQUdJQ0lBTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEFfUEFMTT15CisjIENPTkZJR19NQUNIX1BBTE1UWCBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9QQUxNWjcyPXkKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorQ09ORklHX1BYQTI3eD15CitDT05GSUdfUFhBX1BXTT15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudAorIworCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfWFNDQUxFPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX1BBQlJUX05PSUZBUj15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfT1VURVJfQ0FDSEUgaXMgbm90IHNldAorQ09ORklHX0lXTU1YVD15CitDT05GSUdfWFNDQUxFX1BNVT15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfSFo9MTAwCitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHkgcm9vdD0vZGV2L21tY2JsazAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19GUEVfTldGUEU9eQorIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19QTT15CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0xFRVA9eQorQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVBNX0VNVUxBVElPTj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9QWEEyN3g9eQorIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVRSSVggaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX1BYQSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QWEE9eQorIyBDT05GSUdfSTJDX1BYQV9TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1BYQTJYWCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKK0NPTkZJR19TUElfU1BJREVWPXkKKyMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CitDT05GSUdfR1BJT19TWVNGUz15CisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAorCisjCisjIFBDSSBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBTUEkgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfUE9XRVJfU1VQUExZPXkKKyMgQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUERBX1BPV0VSPXkKKyMgQ09ORklHX0FQTV9QT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfUFhBPXkKKyMgQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BYQV9QQVJBTUVURVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01CWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9XMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0FNMjAwRVBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CisjIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX1BXTT15CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0RJU1BMQVlfU1VQUE9SVD15CisKKyMKKyMgRGlzcGxheSBoYXJkd2FyZSBkcml2ZXJzCisjCisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CisjIENPTkZJR19GT05UXzh4MTYgaXMgbm90IHNldAorIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfN3gxNCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfMTB4MTggaXMgbm90IHNldAorIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfREVCVUc9eQorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorIyBDT05GSUdfU0RJT19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfUFhBPXkKKyMgQ09ORklHX01NQ19TREhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TQTExMDA9eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCisjCisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODY2CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJ1dGY4IgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0idXRmOCIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NjY9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9eQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorQ09ORklHX0RFQlVHX1VTRVI9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQ19UMTBESUY9eQorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmlwZXJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWZlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL3ZpcGVyX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE2NzggQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzQKKyMgVGh1IEF1ZyAyMSAxNzoxMjowNyAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19IQVZFX1BXTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xMworIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorIyBDT05GSUdfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX1RJTllfU0hNRU09eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImRlYWRsaW5lIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEE9eQorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfR1VNU1RJWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9JRFAgaXMgbm90IHNldAorIyBDT05GSUdfUFhBX1NIQVJQU0wgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfVklQRVI9eQorIyBDT05GSUdfQVJDSF9QWEFfRVNFUklFUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RSSVpFUFM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfRU1fWDI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xJVFRMRVRPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RBVk9SRVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU0FBUiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NQUdJQ0lBTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9QQUxNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorQ09ORklHX1BYQTI1eD15CitDT05GSUdfUFhBX1BXTT1tCitDT05GSUdfUFhBX0hBVkVfSVNBX0lSUVM9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX09VVEVSX0NBQ0hFIGlzIG5vdCBzZXQKK0NPTkZJR19JV01NWFQ9eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0NBUkQ9bQorIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUE9bQorQ09ORklHX1BDTUNJQV9MT0FEX0NJUz15CitDT05GSUdfUENNQ0lBX0lPQ1RMPXkKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKyMgQ09ORklHX0k4MjM2NSBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0lDIGlzIG5vdCBzZXQKK0NPTkZJR19QQ01DSUFfUFhBMlhYPW0KK0NPTkZJR19QQ01DSUFfUFJPQkU9eQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9MzE6MDIgcm9vdGZzdHlwZT1qZmZzMiBybyBjb25zb2xlPXR0eVMwLDExNTIwMCIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkU9bQorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9bQorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCitDT05GSUdfQ1BVX0ZSRVFfUFhBPXkKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKKyMgQ09ORklHX0ZQRV9OV0ZQRSBpcyBub3Qgc2V0CitDT05GSUdfRlBFX0ZBU1RGUEU9eQorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9TTEVFUD15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKKyMgQ09ORklHX0FQTV9FTVVMQVRJT04gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorQ09ORklHX0JUPW0KK0NPTkZJR19CVF9MMkNBUD1tCisjIENPTkZJR19CVF9TQ08gaXMgbm90IHNldAorQ09ORklHX0JUX1JGQ09NTT1tCitDT05GSUdfQlRfUkZDT01NX1RUWT15CitDT05GSUdfQlRfQk5FUD1tCisjIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9ISURQIGlzIG5vdCBzZXQKKworIworIyBCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19CVF9IQ0lVU0I9bQorIyBDT05GSUdfQlRfSENJVVNCX1NDTyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCVFVTQiBpcyBub3Qgc2V0CitDT05GSUdfQlRfSENJVUFSVD1tCitDT05GSUdfQlRfSENJVUFSVF9IND15CitDT05GSUdfQlRfSENJVUFSVF9CQ1NQPXkKKyMgQ09ORklHX0JUX0hDSVVBUlRfTEwgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJRFRMMSBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCVDNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJMVUVDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJUVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lWSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFODAyMTE9bQorIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFODAyMTFfQ1JZUFRfV0VQPW0KKyMgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9DQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9bQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPTAKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj1tCitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorQ09ORklHX01URF9SQU09eQorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ODAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0wCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKK0NPTkZJR19NVERfUFhBMlhYPXkKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NIQVJQX1NMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfU1BBUlNFX1JBTT15CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST1tCitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFRDMzI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRU5FUklDX05DUjUzODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRU5FUklDX05DUjUzODBfTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QQVMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M0MTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9UMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT1dMRVZFTF9QQ01DSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPW0KKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BNUCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1NGRj15CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTEVHQUNZIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1BDTUNJQT1tCisjIENPTkZJR19QQVRBX1FESSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkRfVkxCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19BWDg4Nzk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NNQyBpcyBub3Qgc2V0CitDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1BFR0FTVVM9bQorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorQ09ORklHX1VTQl9VU0JORVQ9bQorQ09ORklHX1VTQl9ORVRfQVg4ODE3WD1tCitDT05GSUdfVVNCX05FVF9DRENFVEhFUj1tCisjIENPTkZJR19VU0JfTkVUX0RNOTYwMSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0dMNjIwQSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX05FVF9ORVQxMDgwPW0KKyMgQ09ORklHX1VTQl9ORVRfUExVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9NQ1M3ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0NEQ19TVUJTRVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9ORVRfWkFVUlVTPW0KK0NPTkZJR19ORVRfUENNQ0lBPXkKKyMgQ09ORklHX1BDTUNJQV8zQzU4OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1BDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9OTUNMQU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1NNQzkxQzkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfQlNEQ09NUD1tCisjIENPTkZJR19QUFBfTVBQRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPTDJUUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9bQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKK0NPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVPW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9FTE89bQorQ09ORklHX1RPVUNIU0NSRUVOX01UT1VDSD1tCitDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPPW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9IVENQRU49bQorQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UPW0KK0NPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUPW0KK0NPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTj1tCisjIENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzPW0KK0NPTkZJR19JTlBVVF9NSVNDPXkKKyMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1VJTlBVVD1tCisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fTElCUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CisjIENPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19WVF9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9bQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ1MgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTUKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTUKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009bQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgUENNQ0lBIGNoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19TWU5DTElOS19DUyBpcyBub3Qgc2V0CisjIENPTkZJR19DQVJETUFOXzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKyMgQ09ORklHX0kyQ19IRUxQRVJfQVVUTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD15CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0dQSU89eQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1BYQT15CisjIENPTkZJR19JMkNfUFhBX1NMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX0VMRUtUT1IgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0dQSU9fU1lTRlM9eQorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIElTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVhDT01XRCBpcyBub3Qgc2V0CisjIENPTkZJR19XRFQgaXMgbm90IHNldAorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD1tCitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPW0KK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPW0KKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfUFhBPW0KKyMgQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9QWEFfUEFSQU1FVEVSUz15CisjIENPTkZJR19GQl9NQlggaXMgbm90IHNldAorIyBDT05GSUdfRkJfVzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BTTIwMEVQRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQorQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9bQorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPW0KKyMgQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX1BXTT1tCisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPW0KKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CitDT05GSUdfTE9HTz15CitDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKK0NPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKK0NPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQorQ09ORklHX1NPVU5EPW0KK0NPTkZJR19TTkQ9bQorQ09ORklHX1NORF9USU1FUj1tCitDT05GSUdfU05EX1BDTT1tCisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKK0NPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZNQVNURVI9eQorQ09ORklHX1NORF9BQzk3X0NPREVDPW0KK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0FSTT15CitDT05GSUdfU05EX1BYQTJYWF9QQ009bQorQ09ORklHX1NORF9QWEEyWFhfQUM5Nz1tCitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorQ09ORklHX1NORF9QQ01DSUE9eQorIyBDT05GSUdfU05EX1ZYUE9DS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QREFVRElPQ0YgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPW0KKyMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorCisjCisjIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQj1tCisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKK0NPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVU1BFTkQ9eQorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0lTUDExNlhfSENEPW0KKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NMODExX0hDRD1tCisjIENPTkZJR19VU0JfU0w4MTFfQ1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9SOEE2NjU5N19IQ0Q9bQorIyBDT05GSUdfVVNCX01VU0JfSERSQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCitDT05GSUdfVVNCX0FDTT1tCisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TSUVSUkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCitDT05GSUdfVVNCX1NFUklBTD1tCisjIENPTkZJR19VU0JfRVpVU0IgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQz15CisjIENPTkZJR19VU0JfU0VSSUFMX0FJUkNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NIMzQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9GVU5TT0ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUEFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVVVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMj1tCisjIENPTkZJR19VU0JfU0VSSUFMX01PUzc3MjAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1M3ODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9UT1JPTEEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9OQVZNQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PVEk2ODU4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU1BDUDhYNSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVQ9bQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfQU1ENTUzNlVEQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYPXkKK0NPTkZJR19VU0JfUFhBMjVYPW0KKyMgQ09ORklHX1VTQl9QWEEyNVhfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyN1ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VUSD1tCitDT05GSUdfVVNCX0VUSF9STkRJUz15CitDT05GSUdfVVNCX0dBREdFVEZTPW0KK0NPTkZJR19VU0JfRklMRV9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfU0VSSUFMPW0KKyMgQ09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfUFJJTlRFUj1tCisjIENPTkZJR19VU0JfQ0RDX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz1tCisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfRFMxMzA3PW0KKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NBMTEwMD1tCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBWb2x0YWdlIGFuZCBDdXJyZW50IHJlZ3VsYXRvcnMKKyMKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9bQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz1tCisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD1tCisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkZTRD1tCitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPW0KK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE1PW0KKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19IQVZFX0ZUUkFDRT15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKK0NPTkZJR19DUllQVE9fQUxHQVBJPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj1tCisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FSQzQ9bQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQ19UMTBESUY9bQorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy94bV94MjcwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MveG1feDI3MF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDBkOTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy94bV94MjcwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE3NDEgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI1Ci0jIFN1biBNYXkgMTEgMTU6MTI6NTIgMjAwOAotIwotQ09ORklHX0FSTT15Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQotQ09ORklHX0dFTkVSSUNfR1BJTz15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKLUNPTkZJR19NTVU9eQotIyBDT05GSUdfTk9fSU9QT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQotQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci1DT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19BUkNIX01URF9YSVA9eQotQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCi1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUtDT05GSUc9eQotQ09ORklHX0lLQ09ORklHX1BST0M9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLSMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19VSUQxNj15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLSMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfU0xVQj15Ci0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX09QUk9GSUxFPXkKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfS1BST0JFUz15Ci1DT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKLSMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST0NfUEFHRV9NT05JVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0NGUT15Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgotQ09ORklHX0NMQVNTSUNfUkNVPXkKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAotQ09ORklHX0FSQ0hfUFhBPXkKLSMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVNNN1gwMEEgaXMgbm90IHNldAotQ09ORklHX0RNQUJPVU5DRT15Ci0KLSMKLSMgSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMKLSMKLQotIwotIyBTZWxlY3QgdGFyZ2V0IGJvYXJkcwotIwotIyBDT05GSUdfQVJDSF9HVU1TVElYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1BYQV9FU0VSSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfVFJJWkVQUzQgaXMgbm90IHNldAotQ09ORklHX01BQ0hfRU1fWDI3MD15Ci0jIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX0xJVFRMRVRPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTUFDSF9BUk1DT1JFPXkKLSMgQ09ORklHX01BQ0hfTUFHSUNJQU4gaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9QQ00wMjcgaXMgbm90IHNldAotQ09ORklHX1BYQTI3eD15Ci0jIENPTkZJR19QWEFfUFdNIGlzIG5vdCBzZXQKLQotIwotIyBCb290IG9wdGlvbnMKLSMKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50Ci0jCi0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9YU0NBTEU9eQotQ09ORklHX0NQVV8zMnY1PXkKLUNPTkZJR19DUFVfQUJSVF9FVjVUPXkKLUNPTkZJR19DUFVfUEFCUlRfTk9JRkFSPXkKLUNPTkZJR19DUFVfQ0FDSEVfVklWVD15Ci1DT05GSUdfQ1BVX1RMQl9WNFdCST15Ci1DT05GSUdfQ1BVX0NQMTU9eQotQ09ORklHX0NQVV9DUDE1X01NVT15Ci0KLSMKLSMgUHJvY2Vzc29yIEZlYXR1cmVzCi0jCi1DT05GSUdfQVJNX1RIVU1CPXkKLSMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19PVVRFUl9DQUNIRSBpcyBub3Qgc2V0Ci1DT05GSUdfSVdNTVhUPXkKLUNPTkZJR19YU0NBTEVfUE1VPXkKLQotIwotIyBCdXMgc3VwcG9ydAotIwotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX1NZU0NBTEw9eQotQ09ORklHX1BDSV9IT1NUX0lURTgxNTI9eQotIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotQ09ORklHX1BDSV9MRUdBQ1k9eQotIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQ0NBUkQ9bQotIyBDT05GSUdfUENNQ0lBX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQ01DSUE9bQotQ09ORklHX1BDTUNJQV9MT0FEX0NJUz15Ci1DT05GSUdfUENNQ0lBX0lPQ1RMPXkKLUNPTkZJR19DQVJEQlVTPXkKLQotIwotIyBQQy1jYXJkIGJyaWRnZXMKLSMKLUNPTkZJR19ZRU5UQT1tCi0jIENPTkZJR19ZRU5UQV9PMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ZRU5UQV9SSUNPSCBpcyBub3Qgc2V0Ci1DT05GSUdfWUVOVEFfVEk9eQotIyBDT05GSUdfWUVOVEFfRU5FX1RVTkUgaXMgbm90IHNldAotIyBDT05GSUdfWUVOVEFfVE9TSElCQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QRDY3MjkgaXMgbm90IHNldAotIyBDT05GSUdfSTgyMDkyIGlzIG5vdCBzZXQKLUNPTkZJR19QQ01DSUFfUFhBMlhYPW0KLUNPTkZJR19QQ0NBUkRfTk9OU1RBVElDPW0KLQotIwotIyBLZXJuZWwgRmVhdHVyZXMKLSMKLUNPTkZJR19USUNLX09ORVNIT1Q9eQotQ09ORklHX05PX0haPXkKLSMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19IWj0xMDAKLUNPTkZJR19BRUFCST15Ci1DT05GSUdfT0FCSV9DT01QQVQ9eQotIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi1DT05GSUdfQk9VTkNFPXkKLUNPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0icm9vdD0xZjAzIG1lbT0zMk0iCi0jIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLQotIwotIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLSMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KLSMKLQotIwotIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKLSMKLUNPTkZJR19GUEVfTldGUEU9eQotIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLUNPTkZJR19QTT15Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkQ9eQotQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15Ci1DT05GSUdfQVBNX0VNVUxBVElPTj1tCi1DT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKLQotIwotIyBOZXR3b3JraW5nCi0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLSMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU4gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci1DT05GSUdfQlQ9bQotQ09ORklHX0JUX0wyQ0FQPW0KLUNPTkZJR19CVF9TQ089bQotQ09ORklHX0JUX1JGQ09NTT1tCi0jIENPTkZJR19CVF9SRkNPTU1fVFRZIGlzIG5vdCBzZXQKLUNPTkZJR19CVF9CTkVQPW0KLSMgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19CVF9ISURQPW0KLQotIwotIyBCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMKLSMKLUNPTkZJR19CVF9IQ0lVU0I9bQotQ09ORklHX0JUX0hDSVVTQl9TQ089eQotIyBDT05GSUdfQlRfSENJQlRTRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUX0hDSVVBUlQgaXMgbm90IHNldAotIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAotIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldAotIyBDT05GSUdfQlRfSENJRFRMMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVF9IQ0lCVDNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUX0hDSUJMVUVDQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUX0hDSUJUVUFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVF9IQ0lWSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIwotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotQ09ORklHX1dJUkVMRVNTX0VYVD15Ci0jIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCi0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREPXkKLSMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxLREVWUz15Ci1DT05GSUdfTVREX0JMT0NLPXkKLSMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAotIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0pFREVDUFJPQkU9eQotQ09ORklHX01URF9HRU5fUFJPQkU9eQotQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQotQ09ORklHX01URF9DRklfTk9TV0FQPXkKLSMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfR0VPTUVUUlkgaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci0jIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAotIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotQ09ORklHX01URF9DRklfU1RBQT15Ci1DT05GSUdfTVREX0NGSV9VVElMPXkKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgwCi1DT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4NDAwMDAwCi1DT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKLUNPTkZJR19NVERfUFhBMlhYPXkKLSMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1NIQVJQX1NMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9JTlRFTF9WUl9OT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAotCi0jCi0jIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotQ09ORklHX01URF9OQU5EPXkKLSMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX01VU0VVTV9JRFMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfSDE5MDAgaXMgbm90IHNldAotQ09ORklHX01URF9OQU5EX0lEUz15Ci0jIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX1NIQVJQU0wgaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfQ0FGRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX05BTkRfQ01fWDI3MD15Ci0jIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTkFORF9QTEFURk9STT15Ci0jIENPTkZJR19NVERfQUxBVURBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKLQotIwotIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKLSMKLSMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVj15Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0lERT15Ci0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfRE1BPXkKLSMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwotQ09ORklHX0JMS19ERVZfU0Q9eQotIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLSMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAotQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KLQotIwotIyBTQ1NJIFRyYW5zcG9ydHMKLSMKLSMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0lfTE9XTEVWRUw9eQotIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBPW0KLSMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1BNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBX1NGRj15Ci0jIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAotIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9JVDgyMTMgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX01BUlZFTEwgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTklOSkEzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAotQ09ORklHX1BBVEFfUENNQ0lBPW0KLSMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUM5MVggaXMgbm90IHNldAotQ09ORklHX0RNOTAwMD15Ci1DT05GSUdfRE05MDAwX0RFQlVHTEVWRUw9MQotIyBDT05GSUdfU01DOTExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUENJPXkKLSMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAotIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKLUNPTkZJR184MTM5VE9PPXkKLSMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SNjA0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAotIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQzkyMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCi0jIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKLUNPTkZJR19XTEFOXzgwMjExPXkKLSMgQ09ORklHX1BDTUNJQV9SQVlDUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFcyMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVzIyMDAgaXMgbm90IHNldAotQ09ORklHX0xJQkVSVEFTPW0KLSMgQ09ORklHX0xJQkVSVEFTX1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJFUlRBU19DUyBpcyBub3Qgc2V0Ci1DT05GSUdfTElCRVJUQVNfU0RJTz1tCi0jIENPTkZJR19MSUJFUlRBU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1pEMTIwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTkVUX1JORElTX1dMQU4gaXMgbm90IHNldAotIyBDT05GSUdfSVdMV0lGSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTmV0d29yayBBZGFwdGVycwotIwotIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ01DSUEgaXMgbm90IHNldAotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotQ09ORklHX1BQUD1tCi1DT05GSUdfUFBQX01VTFRJTElOSz15Ci1DT05GSUdfUFBQX0ZJTFRFUj15Ci1DT05GSUdfUFBQX0FTWU5DPW0KLSMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0Ci1DT05GSUdfUFBQX0RFRkxBVEU9bQotQ09ORklHX1BQUF9CU0RDT01QPW0KLSMgQ09ORklHX1BQUF9NUFBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUE9MMlRQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotQ09ORklHX1NMSEM9bQotIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX0VWREVWPXkKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0FQTVBPV0VSIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKLUNPTkZJR19LRVlCT0FSRF9QWEEyN3g9bQotIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLSMgQ09ORklHX1RPVUNIU0NSRUVOX0ZVSklUU1UgaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUgaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX01UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLUNPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwPW0KLUNPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFg9bQotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1IGlzIG5vdCBzZXQKLUNPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTI9eQotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWF9NQUlOU1RPTkUgaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBJL08gcG9ydHMKLSMKLUNPTkZJR19TRVJJTz15Ci0jIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotQ09ORklHX0RFVktNRU09eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX1BYQT15Ci1DT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MTYKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcwotIwotIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAotIyBDT05GSUdfQ0FSRE1BTl80MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBUkRNQU5fNDA0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFdJUkVMRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQk9BUkRJTkZPPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfUFhBPXkKLSMgQ09ORklHX0kyQ19QWEFfU0xBVkUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9HUElPX0xJQj15Ci0KLSMKLSMgR1BJTyBTdXBwb3J0Ci0jCi0jIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgR1BJTyBleHBhbmRlcnM6Ci0jCi0jIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgR1BJTyBleHBhbmRlcnM6Ci0jCi0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAotQ09ORklHX0ZCPXkKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci0jIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfREVGRVJSRURfSU89eQotIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0Ci0KLSMKLSMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZUODYyMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAotQ09ORklHX0ZCX1BYQT15Ci0jIENPTkZJR19GQl9QWEFfU01BUlRQQU5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfUFhBX1BBUkFNRVRFUlM9eQotQ09ORklHX0ZCX01CWD1tCi0jIENPTkZJR19GQl9BTTIwMEVQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLSMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UUyBpcyBub3Qgc2V0Ci1DT05GSUdfRk9OVF84eDg9eQotQ09ORklHX0ZPTlRfOHgxNj15Ci1DT05GSUdfTE9HTz15Ci1DT05GSUdfTE9HT19MSU5VWF9NT05PPXkKLUNPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKLUNPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCi1DT05GSUdfU09VTkQ9bQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIwotQ09ORklHX1NORD1tCi1DT05GSUdfU05EX1RJTUVSPW0KLUNPTkZJR19TTkRfUENNPW0KLSMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAotQ09ORklHX1NORF9PU1NFTVVMPXkKLUNPTkZJR19TTkRfTUlYRVJfT1NTPW0KLUNPTkZJR19TTkRfUENNX09TUz1tCi1DT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUz15Ci0jIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQotQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15Ci0jIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKLUNPTkZJR19TTkRfQUM5N19DT0RFQz1tCi0jIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFBDSSBkZXZpY2VzCi0jCi0jIENPTkZJR19TTkRfQUQxODg5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BTFMzMDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVzIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DQTAxMDYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfT1hZR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DUzQyODEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NTNDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfREFSTEEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfR0lOQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9MQVlMQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9EQVJMQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9HSU5BMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0xBWUxBMjQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01PTkEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRUNITzNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR08gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lORElHT0lPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR09ESiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERBX0lOVEVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSElGSUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JQ0UxNzEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JQ0UxNzI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTlRFTDhYMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTUFFU1RSTzMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9SSVBUSURFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJUlRVT1NPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAotCi0jCi0jIEFMU0EgQVJNIGRldmljZXMKLSMKLUNPTkZJR19TTkRfUFhBMlhYX1BDTT1tCi1DT05GSUdfU05EX1BYQTJYWF9BQzk3PW0KLQotIwotIyBVU0IgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBQQ01DSUEgZGV2aWNlcwotIwotIyBDT05GSUdfU05EX1ZYUE9DS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9QREFVRElPQ0YgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAotCi0jCi0jIEFMU0EgU29DIGF1ZGlvIGZvciBGcmVlc2NhbGUgU09DcwotIwotCi0jCi0jIFNvQyBBdWRpbyBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIE9NQVAKLSMKLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIwotIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAotQ09ORklHX0FDOTdfQlVTPW0KLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLUNPTkZJR19ISURfREVCVUc9eQotIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1NVUFBPUlQ9eQotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15Ci1DT05GSUdfVVNCPXkKLSMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0RFVklDRV9DTEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVU1BFTkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAotCi0jCi0jIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX09IQ0lfSENEPXkKLSMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAotQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQotIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotQ09ORklHX1VTQl9TVE9SQUdFPXkKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEltYWdpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQotCi0jCi0jIFVTQiBwb3J0IGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLUNPTkZJR19NTUM9bQotIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCi0jCi1DT05GSUdfTU1DX0JMT0NLPW0KLUNPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKLSMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCi0jCi1DT05GSUdfTU1DX1BYQT1tCi0jIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAotIyBDT05GSUdfTU1DX1RJRk1fU0QgaXMgbm90IHNldAotQ09ORklHX05FV19MRURTPXkKLUNPTkZJR19MRURTX0NMQVNTPXkKLQotIwotIyBMRUQgZHJpdmVycwotIwotIyBDT05GSUdfTEVEU19HUElPIGlzIG5vdCBzZXQKLUNPTkZJR19MRURTX0NNX1gyNzA9eQotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotQ09ORklHX0xFRFNfVFJJR0dFUlM9eQotIyBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSIGlzIG5vdCBzZXQKLUNPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKLSMgQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OIGlzIG5vdCBzZXQKLUNPTkZJR19SVENfTElCPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19IQ1RPU1lTPXkKLUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCi0jIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFJUQyBpbnRlcmZhY2VzCi0jCi1DT05GSUdfUlRDX0lOVEZfU1lTRlM9eQotQ09ORklHX1JUQ19JTlRGX1BST0M9eQotQ09ORklHX1JUQ19JTlRGX0RFVj15Ci0jIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgUlRDIGRyaXZlcnMKLSMKLSMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAotCi0jCi0jIFNQSSBSVEMgZHJpdmVycwotIwotCi0jCi0jIFBsYXRmb3JtIFJUQyBkcml2ZXJzCi0jCi0jIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9WMzAyMD15Ci0KLSMKLSMgb24tQ1BVIFJUQyBkcml2ZXJzCi0jCi1DT05GSUdfUlRDX0RSVl9TQTExMDA9eQotIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KQkQ9eQotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0lOT1RJRlk9eQotQ09ORklHX0lOT1RJRllfVVNFUj15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0ZBVF9GUz1tCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfVkZBVF9GUz1tCi1DT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3Ci1DT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCi0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX1NZU0NUTD15Ci1DT05GSUdfU1lTRlM9eQotQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0wCi1DT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQotIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX1NVTU1BUlk9eQotIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkZGUzJfWkxJQj15Ci0jIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAotQ09ORklHX0pGRlMyX1JUSU1FPXkKLSMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9bQotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCi1DT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCi0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfSVNPODg1OV8xPW0KLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfVVRGOD1tCi0jIENPTkZJR19ETE0gaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotQ09ORklHX0ZSQU1FX1dBUk49MAotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAotIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1VTRVI9eQotQ09ORklHX0RFQlVHX0VSUk9SUz15Ci0jIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfTEw9eQotIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE89eQotCi0jCi0jIENyeXB0byBjb3JlIG9yIGhlbHBlcgotIwotIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQotIwotIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbW9kZXMKLSMKLSMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKLQotIwotIyBIYXNoIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnZXN0Ci0jCi0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLQotIwotIyBDaXBoZXJzCi0jCi0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotCi0jCi0jIENvbXByZXNzaW9uCi0jCi0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0JJVFJFVkVSU0U9eQotIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQgaXMgbm90IHNldAotQ09ORklHX0NSQ19DQ0lUVD1tCi0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0NSQzcgaXMgbm90IHNldAotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1pMSUJfREVGTEFURT15Ci1DT05GSUdfUExJU1Q9eQotQ09ORklHX0hBU19JT01FTT15Ci1DT05GSUdfSEFTX0lPUE9SVD15Ci1DT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3htX3gyeHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy94bV94Mnh4X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODkxMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy94bV94Mnh4X2RlZmNvbmZpZwpAQCAtMCwwICsxLDE4MDYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzgKKyMgU3VuIE9jdCAgNSAxMTowNTozNiAyMDA4CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQ9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19BUkNIX01URF9YSVA9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CisjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQ0xLPXkKKyMgQ09ORklHX1BST0NfUEFHRV9NT05JVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9QWEE9eQorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU003WDAwQSBpcyBub3Qgc2V0CitDT05GSUdfRE1BQk9VTkNFPXkKKworIworIyBJbnRlbCBQWEEyeHgvUFhBM3h4IEltcGxlbWVudGF0aW9ucworIworIyBDT05GSUdfQVJDSF9HVU1TVElYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFJTlNUT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTVA5MDBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZJUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBX0VTRVJJRVMgaXMgbm90IHNldAorIyBDT05GSUdfVFJJWkVQU19QWEEgaXMgbm90IHNldAorQ09ORklHX01BQ0hfRU1fWDI3MD15CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9aWUxPTklURSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0xJVFRMRVRPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1RBVk9SRVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfU0FBUiBpcyBub3Qgc2V0CitDT05GSUdfTUFDSF9BUk1DT1JFPXkKKyMgQ09ORklHX01BQ0hfQ01fWDMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BR0lDSUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUlPQTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9QQUxNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorQ09ORklHX1BYQTI1eD15CitDT05GSUdfUFhBMjd4PXkKK0NPTkZJR19QWEFfU1NQPXkKKyMgQ09ORklHX1BYQV9QV00gaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworCisjCisjIFBvd2VyIG1hbmFnZW1lbnQKKyMKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV8zMj15CitDT05GSUdfQ1BVX1hTQ0FMRT15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQorQ09ORklHX0NQVV9QQUJSVF9OT0lGQVI9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX09VVEVSX0NBQ0hFIGlzIG5vdCBzZXQKK0NPTkZJR19JV01NWFQ9eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CitDT05GSUdfUENJX0hPU1RfSVRFODE1Mj15CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWT15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDQ0FSRD1tCisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT1tCitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorQ09ORklHX0NBUkRCVVM9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX1lFTlRBPW0KKyMgQ09ORklHX1lFTlRBX08yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTlRBX1JJQ09IIGlzIG5vdCBzZXQKK0NPTkZJR19ZRU5UQV9UST15CisjIENPTkZJR19ZRU5UQV9FTkVfVFVORSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRU5UQV9UT1NISUJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BENjcyOSBpcyBub3Qgc2V0CisjIENPTkZJR19JODIwOTIgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QWEEyWFg9bQorQ09ORklHX1BDQ0FSRF9OT05TVEFUSUM9bQorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCitDT05GSUdfQUVBQkk9eQorQ09ORklHX09BQklfQ09NUEFUPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fSEFTX0hPTEVTPXkKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQwOTYKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0icm9vdD0xZjAzIG1lbT0zMk0iCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKworIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9TTEVFUD15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKK0NPTkZJR19BUE1fRU1VTEFUSU9OPW0KK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorQ09ORklHX0JUPW0KK0NPTkZJR19CVF9MMkNBUD1tCitDT05GSUdfQlRfU0NPPW0KK0NPTkZJR19CVF9SRkNPTU09bQorIyBDT05GSUdfQlRfUkZDT01NX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfQlRfQk5FUD1tCisjIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUiBpcyBub3Qgc2V0CitDT05GSUdfQlRfSElEUD1tCisKKyMKKyMgQmx1ZXRvb3RoIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfQlRfSENJVVNCPW0KK0NPTkZJR19CVF9IQ0lVU0JfU0NPPXkKKyMgQ09ORklHX0JUX0hDSUJUVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJUU0RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJDTTIwM1ggaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQlBBMTBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJGVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSURUTDEgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQlQzQyBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCTFVFQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCVFVBUlQgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJVkhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0dFT01FVFJZIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PVFAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX1NUQUE9eQorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDQwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCitDT05GSUdfTVREX1BYQTJYWD15CisjIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0lNUEE3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TSEFSUF9TTCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0gxOTAwIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9HUElPPW0KK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9TSEFSUFNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0NBRkUgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0NNX1gyNzA9eQorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfUExBVEZPUk09eQorIyBDT05GSUdfTVREX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9NVlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT1dMRVZFTF9QQ01DSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPW0KKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1NGRj15CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMTMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTklOSkEzMiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUENNQ0lBPW0KKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgdHdvIHN0YWNrcywgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZworIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CitDT05GSUdfRE05MDAwPXkKK0NPTkZJR19ETTkwMDBfREVCVUdMRVZFTD0xCisjIENPTkZJR19ETTkwMDBfRk9SQ0VfU0lNUExFX1BIWV9QT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPTz15CisjIENPTkZJR184MTM5VE9PX1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PX1RVTkVfVFdJU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PXzgxMjkgaXMgbm90IHNldAorIyBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUjYwNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0xBTl84MDIxMT15CisjIENPTkZJR19QQ01DSUFfUkFZQ1MgaXMgbm90IHNldAorIyBDT05GSUdfSVBXMjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFcyMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19MSUJFUlRBUz1tCisjIENPTkZJR19MSUJFUlRBU19VU0IgaXMgbm90IHNldAorIyBDT05GSUdfTElCRVJUQVNfQ1MgaXMgbm90IHNldAorQ09ORklHX0xJQkVSVEFTX1NESU89bQorIyBDT05GSUdfTElCRVJUQVNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FJUk9fQ1MgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1dMMzUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRDEyMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9STkRJU19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUQVAgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDTUNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CitDT05GSUdfUFBQPW0KK0NPTkZJR19QUFBfTVVMVElMSU5LPXkKK0NPTkZJR19QUFBfRklMVEVSPXkKK0NPTkZJR19QUFBfQVNZTkM9bQorIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0wyVFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CitDT05GSUdfU0xIQz1tCisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVBNUE9XRVIgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX1BYQTI3eD1tCisjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFg9bQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzA1IGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTI9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1dNOTdYWF9NQUlOU1RPTkUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1BYQT15CitDT05GSUdfU0VSSUFMX1BYQV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MTYKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDA0MCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFdJUkVMRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUFhBPXkKKyMgQ09ORklHX0kyQ19QWEFfU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycworIworIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAorCisjCisjIFBDSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fQlQ4WFggaXMgbm90IHNldAorCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfVUNCMTQwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DQVJNSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9QWEE9eQorIyBDT05GSUdfRkJfUFhBX1NNQVJUUEFORUwgaXMgbm90IHNldAorQ09ORklHX0ZCX1BYQV9QQVJBTUVURVJTPXkKK0NPTkZJR19GQl9NQlg9bQorIyBDT05GSUdfRkJfVzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorQ09ORklHX0xPR089eQorQ09ORklHX0xPR09fTElOVVhfTU9OTz15CitDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKK0NPTkZJR19TT1VORD1tCitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTPW0KK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9WTUFTVEVSPXkKK0NPTkZJR19TTkRfQUM5N19DT0RFQz1tCitDT05GSUdfU05EX0RSSVZFUlM9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAorQ09ORklHX1NORF9QQ0k9eQorIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxTMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUF9NT0RFTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgzMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BWlQzMzI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CVDg3WCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ0EwMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09YWUdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hJRklFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0FSTT15CitDT05GSUdfU05EX1BYQTJYWF9QQ009bQorQ09ORklHX1NORF9QWEEyWFhfQUM5Nz1tCitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorQ09ORklHX1NORF9QQ01DSUE9eQorIyBDT05GSUdfU05EX1ZYUE9DS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QREFVRElPQ0YgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorQ09ORklHX0hJRF9ERUJVRz15CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVTQl9IRFJDIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9bQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPW0KK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfTU1DX1BYQT1tCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RJRk1fU0QgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1NEUklDT0hfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorCisjCisjIExFRCBkcml2ZXJzCisjCisjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19HUElPIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX0NNX1gyNzA9eQorIyBDT05GSUdfTEVEU19QQ0E5NTVYIGlzIG5vdCBzZXQKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKKyMgQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CisjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfVjMwMjA9eQorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfU0ExMTAwPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorCisjCisjIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycworIworIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DSUZTPW0KKyMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTkxTPW0KK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTAKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CitDT05GSUdfREVCVUdfRVJST1JTPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19MTD15CisjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9idWcuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J1Zy5oCmluZGV4IDdiNjIzNTEuLjRkODg0MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J1Zy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J1Zy5oCkBAIC0xMiw3ICsxMiw3IEBACiAjZWxzZQogCiAvKiB0aGlzIGp1c3QgY2F1c2VzIGFuIG9vcHMgKi8KLSNkZWZpbmUgQlVHKCkJCSgqKGludCAqKTAgPSAwKQorI2RlZmluZSBCVUcoKQkJZG8geyAqKGludCAqKTAgPSAwOyB9IHdoaWxlICgxKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDkwNzNkOWMuLmRlNmM1OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTQ0NCw5NCArNDQ0LDQgQEAKIAlkbWFjX2ludl9yYW5nZShzdGFydCwgc3RhcnQgKyBzaXplKTsKIH0KIAotI2RlZmluZSBfX2NhY2hlaWRfcHJlc2VudCh2YWwpCQkJKHZhbCAhPSByZWFkX2NwdWlkKENQVUlEX0lEKSkKLSNkZWZpbmUgX19jYWNoZWlkX3R5cGVfdjcodmFsKQkJCSgodmFsICYgKDcgPDwgMjkpKSA9PSAoNCA8PCAyOSkpCi0KLSNkZWZpbmUgX19jYWNoZWlkX3ZpdnRfcHJldjcodmFsKQkJKCh2YWwgJiAoMTUgPDwgMjUpKSAhPSAoMTQgPDwgMjUpKQotI2RlZmluZSBfX2NhY2hlaWRfdmlwdF9wcmV2Nyh2YWwpCQkoKHZhbCAmICgxNSA8PCAyNSkpID09ICgxNCA8PCAyNSkpCi0jZGVmaW5lIF9fY2FjaGVpZF92aXB0X25vbmFsaWFzaW5nX3ByZXY3KHZhbCkJKCh2YWwgJiAoMTUgPDwgMjUgfCAxIDw8IDIzKSkgPT0gKDE0IDw8IDI1KSkKLSNkZWZpbmUgX19jYWNoZWlkX3ZpcHRfYWxpYXNpbmdfcHJldjcodmFsKQkoKHZhbCAmICgxNSA8PCAyNSB8IDEgPDwgMjMpKSA9PSAoMTQgPDwgMjUgfCAxIDw8IDIzKSkKLQotI2RlZmluZSBfX2NhY2hlaWRfdml2dCh2YWwpCQkJKF9fY2FjaGVpZF90eXBlX3Y3KHZhbCkgPyAwIDogX19jYWNoZWlkX3ZpdnRfcHJldjcodmFsKSkKLSNkZWZpbmUgX19jYWNoZWlkX3ZpcHQodmFsKQkJCShfX2NhY2hlaWRfdHlwZV92Nyh2YWwpID8gMSA6IF9fY2FjaGVpZF92aXB0X3ByZXY3KHZhbCkpCi0jZGVmaW5lIF9fY2FjaGVpZF92aXB0X25vbmFsaWFzaW5nKHZhbCkJCShfX2NhY2hlaWRfdHlwZV92Nyh2YWwpID8gMSA6IF9fY2FjaGVpZF92aXB0X25vbmFsaWFzaW5nX3ByZXY3KHZhbCkpCi0jZGVmaW5lIF9fY2FjaGVpZF92aXB0X2FsaWFzaW5nKHZhbCkJCShfX2NhY2hlaWRfdHlwZV92Nyh2YWwpID8gMCA6IF9fY2FjaGVpZF92aXB0X2FsaWFzaW5nX3ByZXY3KHZhbCkpCi0jZGVmaW5lIF9fY2FjaGVpZF92aXZ0X2FzaWRfdGFnZ2VkX2luc3RyKHZhbCkJKF9fY2FjaGVpZF90eXBlX3Y3KHZhbCkgPyAoKHZhbCAmICgzIDw8IDE0KSkgPT0gKDEgPDwgMTQpKSA6IDApCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfQ0FDSEVfVklWVCkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9DQUNIRV9WSVBUKQotLyoKLSAqIFZJVlQgY2FjaGVzIG9ubHkKLSAqLwotI2RlZmluZSBjYWNoZV9pc192aXZ0KCkJCQkxCi0jZGVmaW5lIGNhY2hlX2lzX3ZpcHQoKQkJCTAKLSNkZWZpbmUgY2FjaGVfaXNfdmlwdF9ub25hbGlhc2luZygpCTAKLSNkZWZpbmUgY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpCTAKLSNkZWZpbmUgaWNhY2hlX2lzX3ZpdnRfYXNpZF90YWdnZWQoKQkwCi0KLSNlbGlmICFkZWZpbmVkKENPTkZJR19DUFVfQ0FDSEVfVklWVCkgJiYgZGVmaW5lZChDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQpCi0vKgotICogVklQVCBjYWNoZXMgb25seQotICovCi0jZGVmaW5lIGNhY2hlX2lzX3ZpdnQoKQkJCTAKLSNkZWZpbmUgY2FjaGVfaXNfdmlwdCgpCQkJMQotI2RlZmluZSBjYWNoZV9pc192aXB0X25vbmFsaWFzaW5nKCkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CVwKLQkJX19jYWNoZWlkX3ZpcHRfbm9uYWxpYXNpbmcoX192YWwpOwkJCVwKLQl9KQotCi0jZGVmaW5lIGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3ZhbCA9IHJlYWRfY3B1aWQoQ1BVSURfQ0FDSEVUWVBFKTsJXAotCQlfX2NhY2hlaWRfdmlwdF9hbGlhc2luZyhfX3ZhbCk7CQkJCVwKLQl9KQotCi0jZGVmaW5lIGljYWNoZV9pc192aXZ0X2FzaWRfdGFnZ2VkKCkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CVwKLQkJX19jYWNoZWlkX3ZpdnRfYXNpZF90YWdnZWRfaW5zdHIoX192YWwpOwkJXAotCX0pCi0KLSNlbHNlCi0vKgotICogVklWVCBvciBWSVBUIGNhY2hlcy4gIE5vdGUgdGhhdCB0aGlzIGlzIHVucmVsaWFibGUgc2luY2UgQVJNOTI2Ci0gKiBhbmQgVjYgQ1BVcyBzYXRpc2Z5IHRoZSAiKHZhbCAmICgxNSA8PCAyNSkpID09ICgxNCA8PCAyNSkiIHRlc3QuCi0gKiBUaGVyZSdzIG5vIHdheSB0byB0ZWxsIGZyb20gdGhlIENhY2hlVHlwZSByZWdpc3RlciB3aGF0IHR5cGUgKCEpCi0gKiB0aGUgY2FjaGUgaXMuCi0gKi8KLSNkZWZpbmUgY2FjaGVfaXNfdml2dCgpCQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CVwKLQkJKCFfX2NhY2hlaWRfcHJlc2VudChfX3ZhbCkpIHx8IF9fY2FjaGVpZF92aXZ0KF9fdmFsKTsJXAotCX0pCi0JCQotI2RlZmluZSBjYWNoZV9pc192aXB0KCkJCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3ZhbCA9IHJlYWRfY3B1aWQoQ1BVSURfQ0FDSEVUWVBFKTsJXAotCQlfX2NhY2hlaWRfcHJlc2VudChfX3ZhbCkgJiYgX19jYWNoZWlkX3ZpcHQoX192YWwpOwlcCi0JfSkKLQotI2RlZmluZSBjYWNoZV9pc192aXB0X25vbmFsaWFzaW5nKCkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CVwKLQkJX19jYWNoZWlkX3ByZXNlbnQoX192YWwpICYmCQkJCVwKLQkJIF9fY2FjaGVpZF92aXB0X25vbmFsaWFzaW5nKF9fdmFsKTsJCQlcCi0JfSkKLQotI2RlZmluZSBjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7CVwKLQkJX19jYWNoZWlkX3ByZXNlbnQoX192YWwpICYmCQkJCVwKLQkJIF9fY2FjaGVpZF92aXB0X2FsaWFzaW5nKF9fdmFsKTsJCQlcCi0JfSkKLQotI2RlZmluZSBpY2FjaGVfaXNfdml2dF9hc2lkX3RhZ2dlZCgpCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9fdmFsID0gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwlcCi0JCV9fY2FjaGVpZF9wcmVzZW50KF9fdmFsKSAmJgkJCQlcCi0JCSBfX2NhY2hlaWRfdml2dF9hc2lkX3RhZ2dlZF9pbnN0cihfX3ZhbCk7CQlcCi0JfSkKLQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E0YzJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGV0eXBlLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfX0FTTV9BUk1fQ0FDSEVUWVBFX0gKKyNkZWZpbmUgX19BU01fQVJNX0NBQ0hFVFlQRV9ICisKKyNkZWZpbmUgQ0FDSEVJRF9WSVZUCQkJKDEgPDwgMCkKKyNkZWZpbmUgQ0FDSEVJRF9WSVBUX05PTkFMSUFTSU5HCSgxIDw8IDEpCisjZGVmaW5lIENBQ0hFSURfVklQVF9BTElBU0lORwkJKDEgPDwgMikKKyNkZWZpbmUgQ0FDSEVJRF9WSVBUCQkJKENBQ0hFSURfVklQVF9BTElBU0lOR3xDQUNIRUlEX1ZJUFRfTk9OQUxJQVNJTkcpCisjZGVmaW5lIENBQ0hFSURfQVNJRF9UQUdHRUQJCSgxIDw8IDMpCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY2FjaGVpZDsKKworI2RlZmluZSBjYWNoZV9pc192aXZ0KCkJCQljYWNoZWlkX2lzKENBQ0hFSURfVklWVCkKKyNkZWZpbmUgY2FjaGVfaXNfdmlwdCgpCQkJY2FjaGVpZF9pcyhDQUNIRUlEX1ZJUFQpCisjZGVmaW5lIGNhY2hlX2lzX3ZpcHRfbm9uYWxpYXNpbmcoKQljYWNoZWlkX2lzKENBQ0hFSURfVklQVF9OT05BTElBU0lORykKKyNkZWZpbmUgY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpCWNhY2hlaWRfaXMoQ0FDSEVJRF9WSVBUX0FMSUFTSU5HKQorI2RlZmluZSBpY2FjaGVfaXNfdml2dF9hc2lkX3RhZ2dlZCgpCWNhY2hlaWRfaXMoQ0FDSEVJRF9BU0lEX1RBR0dFRCkKKworLyoKKyAqIF9fTElOVVhfQVJNX0FSQ0hfXyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgQ1BVIGFyY2hpdGVjdHVyZQorICogTWFzayBvdXQgc3VwcG9ydCB3aGljaCB3aWxsIG5ldmVyIGJlIHByZXNlbnQgb24gbmV3ZXIgQ1BVcy4KKyAqIC0gdjYrIGlzIG5ldmVyIFZJVlQKKyAqIC0gdjcrIFZJUFQgbmV2ZXIgYWxpYXNlcworICovCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKyNkZWZpbmUgX19DQUNIRUlEX0FSQ0hfTUlOCShDQUNIRUlEX1ZJUFRfTk9OQUxJQVNJTkcgfCBDQUNIRUlEX0FTSURfVEFHR0VEKQorI2VsaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKyNkZWZpbmUJX19DQUNIRUlEX0FSQ0hfTUlOCSh+Q0FDSEVJRF9WSVZUKQorI2Vsc2UKKyNkZWZpbmUgX19DQUNIRUlEX0FSQ0hfTUlOCSh+MCkKKyNlbmRpZgorCisvKgorICogTWFzayBvdXQgc3VwcG9ydCB3aGljaCBpc24ndCBjb25maWd1cmVkCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfQ0FDSEVfVklWVCkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9DQUNIRV9WSVBUKQorI2RlZmluZSBfX0NBQ0hFSURfQUxXQVlTCShDQUNIRUlEX1ZJVlQpCisjZGVmaW5lIF9fQ0FDSEVJRF9ORVZFUgkJKH5DQUNIRUlEX1ZJVlQpCisjZWxpZiAhZGVmaW5lZChDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQpICYmIGRlZmluZWQoQ09ORklHX0NQVV9DQUNIRV9WSVBUKQorI2RlZmluZSBfX0NBQ0hFSURfQUxXQVlTCSgwKQorI2RlZmluZSBfX0NBQ0hFSURfTkVWRVIJCShDQUNIRUlEX1ZJVlQpCisjZWxzZQorI2RlZmluZSBfX0NBQ0hFSURfQUxXQVlTCSgwKQorI2RlZmluZSBfX0NBQ0hFSURfTkVWRVIJCSgwKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKHB1cmUpKSBjYWNoZWlkX2lzKHVuc2lnbmVkIGludCBtYXNrKQoreworCXJldHVybiAoX19DQUNIRUlEX0FMV0FZUyAmIG1hc2spIHwKKwkgICAgICAgKH5fX0NBQ0hFSURfTkVWRVIgJiBfX0NBQ0hFSURfQVJDSF9NSU4gJiBtYXNrICYgY2FjaGVpZCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY250MzJfdG9fNjMuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NudDMyX3RvXzYzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGM4NzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY250MzJfdG9fNjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20vY250MzJfdG9fNjMuaCAtLSBleHRlbmQgYSAzMi1iaXQgY291bnRlciB0byA2MyBiaXRzCi0gKgotICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQotICogIENyZWF0ZWQ6CURlY2VtYmVyIDMsIDIwMDYKLSAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19JTkNMVURFX0NOVDMyX1RPXzYzX0hfXwotI2RlZmluZSBfX0lOQ0xVREVfQ05UMzJfVE9fNjNfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotLyoKLSAqIFByb3RvdHlwZTogdTY0IGNudDMyX3RvXzYzKHUzMiBjbnQpCi0gKiBNYW55IGhhcmR3YXJlIGNsb2NrIGNvdW50ZXJzIGFyZSBvbmx5IDMyIGJpdHMgd2lkZSBhbmQgdGhlcmVmb3JlIGhhdmUKLSAqIGEgcmVsYXRpdmVseSBzaG9ydCBwZXJpb2QgbWFraW5nIHdyYXAtYXJvdW5kcyByYXRoZXIgZnJlcXVlbnQuICBUaGlzCi0gKiBpcyBhIHByb2JsZW0gd2hlbiBpbXBsZW1lbnRpbmcgc2NoZWRfY2xvY2soKSBmb3IgZXhhbXBsZSwgd2hlcmUgYSA2NC1iaXQKLSAqIG5vbi13cmFwcGluZyBtb25vdG9uaWMgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgcmV0dXJuZWQuCi0gKgotICogVG8gb3ZlcmNvbWUgdGhhdCBsaW1pdGF0aW9uLCBsZXQncyBleHRlbmQgYSAzMi1iaXQgY291bnRlciB0byA2MyBiaXRzCi0gKiBpbiBhIGNvbXBsZXRlbHkgbG9jayBmcmVlIGZhc2hpb24uIEJpdHMgMCB0byAzMSBvZiB0aGUgY2xvY2sgYXJlIHByb3ZpZGVkCi0gKiBieSB0aGUgaGFyZHdhcmUgd2hpbGUgYml0cyAzMiB0byA2MiBhcmUgc3RvcmVkIGluIG1lbW9yeS4gIFRoZSB0b3AgYml0IGluCi0gKiBtZW1vcnkgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBoYXJkd2FyZSBjbG9jayBoYWxmLXBlcmlvZC4gIFdoZW4KLSAqIHRoZSB0b3AgYml0IG9mIGJvdGggY291bnRlcnMgKGhhcmR3YXJlIGFuZCBpbiBtZW1vcnkpIGRpZmZlciB0aGVuIHRoZQotICogbWVtb3J5IGlzIHVwZGF0ZWQgd2l0aCBhIG5ldyB2YWx1ZSwgaW5jcmVtZW50aW5nIGl0IHdoZW4gdGhlIGhhcmR3YXJlCi0gKiBjb3VudGVyIHdyYXBzIGFyb3VuZC4KLSAqCi0gKiBCZWNhdXNlIGEgd29yZCBzdG9yZSBpbiBtZW1vcnkgaXMgYXRvbWljIHRoZW4gdGhlIGluY3JlbWVudGVkIHZhbHVlIHdpbGwKLSAqIGFsd2F5cyBiZSBpbiBzeW5jaCB3aXRoIHRoZSB0b3AgYml0IGluZGljYXRpbmcgdG8gYW55IHBvdGVudGlhbCBjb25jdXJyZW50Ci0gKiByZWFkZXIgaWYgdGhlIHZhbHVlIGluIG1lbW9yeSBpcyB1cCB0byBkYXRlIG9yIG5vdCB3aXRoIHJlZ2FyZHMgdG8gdGhlCi0gKiBuZWVkZWQgaW5jcmVtZW50LiAgQW5kIGFueSByYWNlIGluIHVwZGF0aW5nIHRoZSB2YWx1ZSBpbiBtZW1vcnkgaXMgaGFybWxlc3MKLSAqIGFzIHRoZSBzYW1lIHZhbHVlIHdvdWxkIHNpbXBseSBiZSBzdG9yZWQgbW9yZSB0aGFuIG9uY2UuCi0gKgotICogVGhlIG9ubHkgcmVzdHJpY3Rpb24gZm9yIHRoZSBhbGdvcml0aG0gdG8gd29yayBwcm9wZXJseSBpcyB0aGF0IHRoaXMKLSAqIGNvZGUgbXVzdCBiZSBleGVjdXRlZCBhdCBsZWFzdCBvbmNlIHBlciBlYWNoIGhhbGYgcGVyaW9kIG9mIHRoZSAzMi1iaXQKLSAqIGNvdW50ZXIgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBzdGF0ZSBiaXQgaW4gbWVtb3J5LiBUaGlzIGlzIHVzdWFsbHkgbm90IGEKLSAqIHByb2JsZW0gaW4gcHJhY3RpY2UsIGJ1dCBpZiBpdCBpcyB0aGVuIGEga2VybmVsIHRpbWVyIGNvdWxkIGJlIHNjaGVkdWxlZAotICogdG8gbWFuYWdlIGZvciB0aGlzIGNvZGUgdG8gYmUgZXhlY3V0ZWQgb2Z0ZW4gZW5vdWdoLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgdG9wIGJpdCAoYml0IDYzKSBpbiB0aGUgcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIGNvbnNpZGVyZWQKLSAqIGFzIGdhcmJhZ2UuICBJdCBpcyBub3QgY2xlYXJlZCBoZXJlIGJlY2F1c2UgY2FsbGVycyBhcmUgbGlrZWx5IHRvIHVzZSBhCi0gKiBtdWx0aXBsaWVyIG9uIHRoZSByZXR1cm5lZCB2YWx1ZSB3aGljaCBjYW4gZ2V0IHJpZCBvZiB0aGUgdG9wIGJpdAotICogaW1wbGljaXRseSBieSBtYWtpbmcgdGhlIG11bHRpcGxpZXIgZXZlbiwgdGhlcmVmb3JlIHNhdmluZyBvbiBhIHJ1bnRpbWUKLSAqIGNsZWFyLWJpdCBpbnN0cnVjdGlvbi4gT3RoZXJ3aXNlIGNhbGxlciBtdXN0IHJlbWVtYmVyIHRvIGNsZWFyIHRoZSB0b3AKLSAqIGJpdCBleHBsaWNpdGx5LgotICovCi0KLS8qIHRoaXMgaXMgdXNlZCBvbmx5IHRvIGdpdmUgZ2NjIGEgY2x1ZSBhYm91dCBnb29kIGNvZGUgZ2VuZXJhdGlvbiAqLwotdHlwZWRlZiB1bmlvbiB7Ci0Jc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKLQkJdTMyIGxvLCBoaTsKLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCQl1MzIgaGksIGxvOwotI2VuZGlmCi0JfTsKLQl1NjQgdmFsOwotfSBjbnQzMl90b182M190OwotCi0jZGVmaW5lIGNudDMyX3RvXzYzKGNudF9sbykgXAotKHsgXAotCXN0YXRpYyB2b2xhdGlsZSB1MzIgX19tX2NudF9oaSA9IDA7IFwKLQljbnQzMl90b182M190IF9feDsgXAotCV9feC5oaSA9IF9fbV9jbnRfaGk7IFwKLQlfX3gubG8gPSAoY250X2xvKTsgXAotIAlpZiAodW5saWtlbHkoKHMzMikoX194LmhpIF4gX194LmxvKSA8IDApKSBcCi0JCV9fbV9jbnRfaGkgPSBfX3guaGkgPSAoX194LmhpIF4gMHg4MDAwMDAwMCkgKyAoX194LmhpID4+IDMxKTsgXAotCV9feC52YWw7IFwKLX0pCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWQyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfX0FTTV9BUk1fQ1BVVFlQRV9ICisjZGVmaW5lIF9fQVNNX0FSTV9DUFVUWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjZGVmaW5lIENQVUlEX0lECTAKKyNkZWZpbmUgQ1BVSURfQ0FDSEVUWVBFCTEKKyNkZWZpbmUgQ1BVSURfVENNCTIKKyNkZWZpbmUgQ1BVSURfVExCVFlQRQkzCisKKyNpZmRlZiBDT05GSUdfQ1BVX0NQMTUKKyNkZWZpbmUgcmVhZF9jcHVpZChyZWcpCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192YWw7CQkJCQlcCisJCWFzbSgibXJjCXAxNSwgMCwgJTAsIGMwLCBjMCwgIiBfX3N0cmluZ2lmeShyZWcpCVwKKwkJICAgIDogIj1yIiAoX192YWwpCQkJCQlcCisJCSAgICA6CQkJCQkJCVwKKwkJICAgIDogImNjIik7CQkJCQkJXAorCQlfX3ZhbDsJCQkJCQkJXAorCX0pCisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGludCBwcm9jZXNzb3JfaWQ7CisjZGVmaW5lIHJlYWRfY3B1aWQocmVnKSAocHJvY2Vzc29yX2lkKQorI2VuZGlmCisKKy8qCisgKiBUaGUgQ1BVIElEIG5ldmVyIGNoYW5nZXMgYXQgcnVuIHRpbWUsIHNvIHdlIG1pZ2h0IGFzIHdlbGwgdGVsbCB0aGUKKyAqIGNvbXBpbGVyIHRoYXQgaXQncyBjb25zdGFudC4gIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlYWQgdGhlIENQVSBJRAorICogcmF0aGVyIHRoYW4gZGlyZWN0bHkgcmVhZGluZyBwcm9jZXNzb3JfaWQgb3IgcmVhZF9jcHVpZCgpIGRpcmVjdGx5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfaWQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9JRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOworfQorCisvKgorICogSW50ZWwncyBYU2NhbGUzIGNvcmUgc3VwcG9ydHMgc29tZSB2NiBmZWF0dXJlcyAoc3VwZXJzZWN0aW9ucywgTDIpCisgKiBidXQgYWR2ZXJ0aXNlcyBpdHNlbGYgYXMgdjUgYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdjYgSVNBLiAgRm9yCisgKiB0aGlzIHJlYXNvbiwgd2UgbmVlZCBhIHdheSB0byBleHBsaWNpdGx5IHRlc3QgZm9yIHRoaXMgdHlwZSBvZiBDUFUuCisgKi8KKyNpZm5kZWYgQ09ORklHX0NQVV9YU0MzCisjZGVmaW5lIGNwdV9pc194c2MzKCkJMAorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9pc194c2MzKHZvaWQpCit7CisJaWYgKChyZWFkX2NwdWlkX2lkKCkgJiAweGZmZmZlMDAwKSA9PSAweDY5MDU2MDAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1hTQ0FMRSkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9YU0MzKQorI2RlZmluZQljcHVfaXNfeHNjYWxlKCkJMAorI2Vsc2UKKyNkZWZpbmUJY3B1X2lzX3hzY2FsZSgpCTEKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IDdiOTVkMjAuLjFjYjg2MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMTA0LDE1ICsxMDQsMTQgQEAKICAqIER1bW15IG5vbmNvaGVyZW50IGltcGxlbWVudGF0aW9uLiAgV2UgZG9uJ3QgcHJvdmlkZSBhIGRtYV9jYWNoZV9zeW5jCiAgKiBmdW5jdGlvbiBzbyBkcml2ZXJzIHVzaW5nIHRoaXMgQVBJIGFyZSBoaWdobGlnaHRlZCB3aXRoIGJ1aWxkIHdhcm5pbmdzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKgotZG1hX2FsbG9jX25vbmNvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwgZ2ZwX3QgZ2ZwKQorc3RhdGljIGlubGluZSB2b2lkICpkbWFfYWxsb2Nfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJZG1hX2FkZHJfdCAqaGFuZGxlLCBnZnBfdCBnZnApCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX2ZyZWVfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCi0JCSAgICAgZG1hX2FkZHJfdCBoYW5kbGUpCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgaGFuZGxlKQogewogfQogCkBAIC0xMjcsOCArMTI2LDcgQEAKICAqIHJldHVybiB0aGUgQ1BVLXZpZXdlZCBhZGRyZXNzLCBhbmQgc2V0cyBAaGFuZGxlIHRvIGJlIHRoZQogICogZGV2aWNlLXZpZXdlZCBhZGRyZXNzLgogICovCi1leHRlcm4gdm9pZCAqCi1kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLCBnZnBfdCBnZnApOworZXh0ZXJuIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7CiAKIC8qKgogICogZG1hX2ZyZWVfY29oZXJlbnQgLSBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgZG1hX2FsbG9jX2NvaGVyZW50CkBAIC0xNDMsOSArMTQxLDcgQEAKICAqIFJlZmVyZW5jZXMgdG8gbWVtb3J5IGFuZCBtYXBwaW5ncyBhc3NvY2lhdGVkIHdpdGggY3B1X2FkZHIvaGFuZGxlCiAgKiBkdXJpbmcgYW5kIGFmdGVyIHRoaXMgY2FsbCBleGVjdXRpbmcgYXJlIGlsbGVnYWwuCiAgKi8KLWV4dGVybiB2b2lkCi1kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwKLQkJICBkbWFfYWRkcl90IGhhbmRsZSk7CitleHRlcm4gdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgdm9pZCAqLCBkbWFfYWRkcl90KTsKIAogLyoqCiAgKiBkbWFfbW1hcF9jb2hlcmVudCAtIG1hcCBhIGNvaGVyZW50IERNQSBhbGxvY2F0aW9uIGludG8gdXNlciBzcGFjZQpAQCAtMTU5LDggKzE1NSw4IEBACiAgKiBpbnRvIHVzZXIgc3BhY2UuICBUaGUgY29oZXJlbnQgRE1BIGJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZCBieSB0aGUKICAqIGRyaXZlciB1bnRpbCB0aGUgdXNlciBzcGFjZSBtYXBwaW5nIGhhcyBiZWVuIHJlbGVhc2VkLgogICovCi1pbnQgZG1hX21tYXBfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJICAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSk7CitpbnQgZG1hX21tYXBfY29oZXJlbnQoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwKKwkJdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogCiAKIC8qKgpAQCAtMTc0LDI4MiArMTcwLDE2IEBACiAgKiByZXR1cm4gdGhlIENQVS12aWV3ZWQgYWRkcmVzcywgYW5kIHNldHMgQGhhbmRsZSB0byBiZSB0aGUKICAqIGRldmljZS12aWV3ZWQgYWRkcmVzcy4KICAqLwotZXh0ZXJuIHZvaWQgKgotZG1hX2FsbG9jX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsIGdmcF90IGdmcCk7CitleHRlcm4gdm9pZCAqZG1hX2FsbG9jX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLAorCQlnZnBfdCk7CiAKICNkZWZpbmUgZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRldixzaXplLGNwdV9hZGRyLGhhbmRsZSkgXAogCWRtYV9mcmVlX2NvaGVyZW50KGRldixzaXplLGNwdV9hZGRyLGhhbmRsZSkKIAotaW50IGRtYV9tbWFwX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUsIHNpemVfdCBzaXplKTsKK2ludCBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwKKwkJdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogCiAKLS8qKgotICogZG1hX21hcF9zaW5nbGUgLSBtYXAgYSBzaW5nbGUgYnVmZmVyIGZvciBzdHJlYW1pbmcgRE1BCi0gKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKLSAqIEBjcHVfYWRkcjogQ1BVIGRpcmVjdCBtYXBwZWQgYWRkcmVzcyBvZiBidWZmZXIKLSAqIEBzaXplOiBzaXplIG9mIGJ1ZmZlciB0byBtYXAKLSAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24KLSAqCi0gKiBFbnN1cmUgdGhhdCBhbnkgZGF0YSBoZWxkIGluIHRoZSBjYWNoZSBpcyBhcHByb3ByaWF0ZWx5IGRpc2NhcmRlZAotICogb3Igd3JpdHRlbiBiYWNrLgotICoKLSAqIFRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSBvbmNlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLiAgVGhlIENQVQotICogY2FuIHJlZ2FpbiBvd25lcnNoaXAgYnkgY2FsbGluZyBkbWFfdW5tYXBfc2luZ2xlKCkgb3IKLSAqIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCkuCi0gKi8KLSNpZm5kZWYgQ09ORklHX0RNQUJPVU5DRQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90Ci1kbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCWlmICghYXJjaF9pc19jb2hlcmVudCgpKQotCQlkbWFfY2FjaGVfbWFpbnQoY3B1X2FkZHIsIHNpemUsIGRpcik7Ci0KLQlyZXR1cm4gdmlydF90b19kbWEoZGV2LCBjcHVfYWRkcik7Ci19Ci0jZWxzZQotZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqLHZvaWQgKiwgc2l6ZV90LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7Ci0jZW5kaWYKLQotLyoqCi0gKiBkbWFfbWFwX3BhZ2UgLSBtYXAgYSBwb3J0aW9uIG9mIGEgcGFnZSBmb3Igc3RyZWFtaW5nIERNQQotICogQGRldjogdmFsaWQgc3RydWN0IGRldmljZSBwb2ludGVyLCBvciBOVUxMIGZvciBJU0EgYW5kIEVJU0EtbGlrZSBkZXZpY2VzCi0gKiBAcGFnZTogcGFnZSB0aGF0IGJ1ZmZlciByZXNpZGVzIGluCi0gKiBAb2Zmc2V0OiBvZmZzZXQgaW50byBwYWdlIGZvciBzdGFydCBvZiBidWZmZXIKLSAqIEBzaXplOiBzaXplIG9mIGJ1ZmZlciB0byBtYXAKLSAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24KLSAqCi0gKiBFbnN1cmUgdGhhdCBhbnkgZGF0YSBoZWxkIGluIHRoZSBjYWNoZSBpcyBhcHByb3ByaWF0ZWx5IGRpc2NhcmRlZAotICogb3Igd3JpdHRlbiBiYWNrLgotICoKLSAqIFRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSBvbmNlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLiAgVGhlIENQVQotICogY2FuIHJlZ2FpbiBvd25lcnNoaXAgYnkgY2FsbGluZyBkbWFfdW5tYXBfcGFnZSgpIG9yCi0gKiBkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgpLgotICovCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKLWRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAotCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKLX0KLQotLyoqCi0gKiBkbWFfdW5tYXBfc2luZ2xlIC0gdW5tYXAgYSBzaW5nbGUgYnVmZmVyIHByZXZpb3VzbHkgbWFwcGVkCi0gKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKLSAqIEBoYW5kbGU6IERNQSBhZGRyZXNzIG9mIGJ1ZmZlcgotICogQHNpemU6IHNpemUgb2YgYnVmZmVyIHRvIG1hcAotICogQGRpcjogRE1BIHRyYW5zZmVyIGRpcmVjdGlvbgotICoKLSAqIFVubWFwIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbi4gIFRoZSBoYW5kbGUgYW5kIHNpemUKLSAqIG11c3QgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIHByZXZpb3VzIGRtYV9tYXBfc2luZ2xlKCkgY2FsbC4KLSAqIEFsbCBvdGhlciB1c2FnZXMgYXJlIHVuZGVmaW5lZC4KLSAqCi0gKiBBZnRlciB0aGlzIGNhbGwsIHJlYWRzIGJ5IHRoZSBDUFUgdG8gdGhlIGJ1ZmZlciBhcmUgZ3VhcmFudGVlZCB0byBzZWUKLSAqIHdoYXRldmVyIHRoZSBkZXZpY2Ugd3JvdGUgdGhlcmUuCi0gKi8KLSNpZm5kZWYgQ09ORklHX0RNQUJPVU5DRQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsIHNpemVfdCBzaXplLAotCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCS8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLSNlbHNlCi1leHRlcm4gdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7Ci0jZW5kaWYKLQotLyoqCi0gKiBkbWFfdW5tYXBfcGFnZSAtIHVubWFwIGEgYnVmZmVyIHByZXZpb3VzbHkgbWFwcGVkIHRocm91Z2ggZG1hX21hcF9wYWdlKCkKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcwotICogQGhhbmRsZTogRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCi0gKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIgdG8gbWFwCi0gKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCi0gKgotICogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGhhbmRsZSBhbmQgc2l6ZQotICogbXVzdCBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgcHJldmlvdXMgZG1hX21hcF9zaW5nbGUoKSBjYWxsLgotICogQWxsIG90aGVyIHVzYWdlcyBhcmUgdW5kZWZpbmVkLgotICoKLSAqIEFmdGVyIHRoaXMgY2FsbCwgcmVhZHMgYnkgdGhlIENQVSB0byB0aGUgYnVmZmVyIGFyZSBndWFyYW50ZWVkIHRvIHNlZQotICogd2hhdGV2ZXIgdGhlIGRldmljZSB3cm90ZSB0aGVyZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBoYW5kbGUsIHNpemUsIGRpcik7Ci19Ci0KLS8qKgotICogZG1hX21hcF9zZyAtIG1hcCBhIHNldCBvZiBTRyBidWZmZXJzIGZvciBzdHJlYW1pbmcgbW9kZSBETUEKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcwotICogQHNnOiBsaXN0IG9mIGJ1ZmZlcnMKLSAqIEBuZW50czogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWFwCi0gKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCi0gKgotICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZwotICogbW9kZSBmb3IgRE1BLiAgVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUKLSAqIGFib3ZlIGRtYV9tYXBfc2luZ2xlIGludGVyZmFjZS4gIEhlcmUgdGhlIHNjYXR0ZXIgZ2F0aGVyIGxpc3QKLSAqIGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkbWEgYWRkcmVzcwotICogYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYSBzZ19kbWFfe2FkZHJlc3MsbGVuZ3RofShTRykuCi0gKgotICogTk9URTogQW4gaW1wbGVtZW50YXRpb24gbWF5IGJlIGFibGUgdG8gdXNlIGEgc21hbGxlciBudW1iZXIgb2YKLSAqICAgICAgIERNQSBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGFuIHRoZXJlIGFyZSBTRyB0YWJsZSBlbGVtZW50cy4KLSAqICAgICAgIChmb3IgZXhhbXBsZSB2aWEgdmlydHVhbCBtYXBwaW5nIGNhcGFiaWxpdGllcykKLSAqICAgICAgIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyL2xlbmd0aCBwYWlycyBhY3R1YWxseQotICogICAgICAgdXNlZCwgYXQgbW9zdCBuZW50cy4KLSAqCi0gKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIGRtYV9tYXBfc2luZ2xlIGFyZQotICogdGhlIHNhbWUgaGVyZS4KLSAqLwotI2lmbmRlZiBDT05GSUdfRE1BQk9VTkNFCi1zdGF0aWMgaW5saW5lIGludAotZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQljaGFyICp2aXJ0OwotCi0JCXNnLT5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fZG1hKGRldiwgc2dfcGFnZShzZykpICsgc2ctPm9mZnNldDsKLQkJdmlydCA9IHNnX3ZpcnQoc2cpOwotCi0JCWlmICghYXJjaF9pc19jb2hlcmVudCgpKQotCQkJZG1hX2NhY2hlX21haW50KHZpcnQsIHNnLT5sZW5ndGgsIGRpcik7Ci0JfQotCi0JcmV0dXJuIG5lbnRzOwotfQotI2Vsc2UKLWV4dGVybiBpbnQgZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKLSNlbmRpZgotCi0vKioKLSAqIGRtYV91bm1hcF9zZyAtIHVubWFwIGEgc2V0IG9mIFNHIGJ1ZmZlcnMgbWFwcGVkIGJ5IGRtYV9tYXBfc2cKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcwotICogQHNnOiBsaXN0IG9mIGJ1ZmZlcnMKLSAqIEBuZW50czogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWFwCi0gKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCi0gKgotICogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucy4KLSAqIEFnYWluLCBDUFUgcmVhZCBydWxlcyBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvcgotICogZG1hX3VubWFwX3NpbmdsZSgpIGFib3ZlLgotICovCi0jaWZuZGVmIENPTkZJR19ETUFCT1VOQ0UKLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAotCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotewotCi0JLyogbm90aGluZyB0byBkbyAqLwotfQotI2Vsc2UKLWV4dGVybiB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKLSNlbmRpZgotCi0KLS8qKgotICogZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcwotICogQGhhbmRsZTogRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCi0gKiBAb2Zmc2V0OiBvZmZzZXQgb2YgcmVnaW9uIHRvIHN0YXJ0IHN5bmMKLSAqIEBzaXplOiBzaXplIG9mIHJlZ2lvbiB0byBzeW5jCi0gKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uIChzYW1lIGFzIHBhc3NlZCB0byBkbWFfbWFwX3NpbmdsZSkKLSAqCi0gKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEKLSAqIHRyYW5zbGF0aW9uIGFmdGVyIGEgdHJhbnNmZXIuCi0gKgotICogSWYgeW91IHBlcmZvcm0gYSBkbWFfbWFwX3NpbmdsZSgpIGJ1dCB3aXNoIHRvIGludGVycm9nYXRlIHRoZQotICogYnVmZmVyIHVzaW5nIHRoZSBjcHUsIHlldCBkbyBub3Qgd2lzaCB0byB0ZWFyZG93biB0aGUgUENJIGRtYQotICogbWFwcGluZywgeW91IG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBkb2luZyBzby4gIEF0IHRoZQotICogbmV4dCBwb2ludCB5b3UgZ2l2ZSB0aGUgUENJIGRtYSBhZGRyZXNzIGJhY2sgdG8gdGhlIGNhcmQsIHlvdQotICogbXVzdCBmaXJzdCB0aGUgcGVyZm9ybSBhIGRtYV9zeW5jX2Zvcl9kZXZpY2UsIGFuZCB0aGVuIHRoZQotICogZGV2aWNlIGFnYWluIG93bnMgdGhlIGJ1ZmZlci4KLSAqLwotI2lmbmRlZiBDT05GSUdfRE1BQk9VTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCi0JCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaWYgKCFhcmNoX2lzX2NvaGVyZW50KCkpCi0JCWRtYV9jYWNoZV9tYWludChkbWFfdG9fdmlydChkZXYsIGhhbmRsZSkgKyBvZmZzZXQsIHNpemUsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwKLQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaWYgKCFhcmNoX2lzX2NvaGVyZW50KCkpCi0JCWRtYV9jYWNoZV9tYWludChkbWFfdG9fdmlydChkZXYsIGhhbmRsZSkgKyBvZmZzZXQsIHNpemUsIGRpcik7Ci19Ci0jZWxzZQotZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCB1bnNpZ25lZCBsb25nLCBzaXplX3QsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCwgdW5zaWduZWQgbG9uZywgc2l6ZV90LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShkZXYsIGhhbmRsZSwgMCwgc2l6ZSwgZGlyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShkZXYsIGhhbmRsZSwgMCwgc2l6ZSwgZGlyKTsKLX0KLQotCi0vKioKLSAqIGRtYV9zeW5jX3NnX2Zvcl9jcHUKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcwotICogQHNnOiBsaXN0IG9mIGJ1ZmZlcnMKLSAqIEBuZW50czogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWFwCi0gKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCi0gKgotICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzZXQgb2Ygc3RyZWFtaW5nCi0gKiBtb2RlIERNQSB0cmFuc2xhdGlvbnMgYWZ0ZXIgYSB0cmFuc2Zlci4KLSAqCi0gKiBUaGUgc2FtZSBhcyBkbWFfc3luY19zaW5nbGVfZm9yXyogYnV0IGZvciBhIHNjYXR0ZXItZ2F0aGVyIGxpc3QsCi0gKiBzYW1lIHJ1bGVzIGFuZCB1c2FnZS4KLSAqLwotI2lmbmRlZiBDT05GSUdfRE1BQk9VTkNFCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQljaGFyICp2aXJ0ID0gc2dfdmlydChzZyk7Ci0JCWlmICghYXJjaF9pc19jb2hlcmVudCgpKQotCQkJZG1hX2NhY2hlX21haW50KHZpcnQsIHNnLT5sZW5ndGgsIGRpcik7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQljaGFyICp2aXJ0ID0gc2dfdmlydChzZyk7Ci0JCWlmICghYXJjaF9pc19jb2hlcmVudCgpKQotCQkJZG1hX2NhY2hlX21haW50KHZpcnQsIHNnLT5sZW5ndGgsIGRpcik7Ci0JfQotfQotI2Vsc2UKLWV4dGVybiB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSosIHN0cnVjdCBzY2F0dGVybGlzdCosIGludCwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOwotZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlKiwgc3RydWN0IHNjYXR0ZXJsaXN0KiwgaW50LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19ETUFCT1VOQ0UKIC8qCiAgKiBGb3IgU0EtMTExMSwgSVhQNDI1LCBhbmQgQURJIHN5c3RlbXMgIHRoZSBkbWEtbWFwcGluZyBmdW5jdGlvbnMgYXJlICJtYWdpYyIKQEAgLTQ3NSw3ICsyMDUsOCBAQAogICogYXBwcm9wcmlhdGUgRE1BIHBvb2xzIGZvciB0aGUgZGV2aWNlLgogICoKICAqLwotZXh0ZXJuIGludCBkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IGRtYWJvdW5jZV9yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBsb25nLAorCQl1bnNpZ25lZCBsb25nKTsKIAogLyoqCiAgKiBkbWFib3VuY2VfdW5yZWdpc3Rlcl9kZXYKQEAgLTUwNiw3ICsyMzcsMTg0IEBACiAgKgogICovCiBleHRlcm4gaW50IGRtYV9uZWVkc19ib3VuY2Uoc3RydWN0IGRldmljZSosIGRtYV9hZGRyX3QsIHNpemVfdCk7CisKKy8qCisgKiBUaGUgRE1BIEFQSSwgaW1wbGVtZW50ZWQgYnkgZG1hYm91bmNlLmMuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucy4KKyAqLworZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqLCB2b2lkICosIHNpemVfdCwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHBhZ2UgKiwKKwkJdW5zaWduZWQgbG9uZywgc2l6ZV90LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CisKKy8qCisgKiBQcml2YXRlIGZ1bmN0aW9ucworICovCitpbnQgZG1hYm91bmNlX3N5bmNfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICosIGRtYV9hZGRyX3QsIHVuc2lnbmVkIGxvbmcsCisJCXNpemVfdCwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworaW50IGRtYWJvdW5jZV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCB1bnNpZ25lZCBsb25nLAorCQlzaXplX3QsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKKyNlbHNlCisjZGVmaW5lIGRtYWJvdW5jZV9zeW5jX2Zvcl9jcHUoZGV2LGRtYSxvZmYsc3osZGlyKQkoMSkKKyNkZWZpbmUgZG1hYm91bmNlX3N5bmNfZm9yX2RldmljZShkZXYsZG1hLG9mZixzeixkaXIpCSgxKQorCisKKy8qKgorICogZG1hX21hcF9zaW5nbGUgLSBtYXAgYSBzaW5nbGUgYnVmZmVyIGZvciBzdHJlYW1pbmcgRE1BCisgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKKyAqIEBjcHVfYWRkcjogQ1BVIGRpcmVjdCBtYXBwZWQgYWRkcmVzcyBvZiBidWZmZXIKKyAqIEBzaXplOiBzaXplIG9mIGJ1ZmZlciB0byBtYXAKKyAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAqCisgKiBFbnN1cmUgdGhhdCBhbnkgZGF0YSBoZWxkIGluIHRoZSBjYWNoZSBpcyBhcHByb3ByaWF0ZWx5IGRpc2NhcmRlZAorICogb3Igd3JpdHRlbiBiYWNrLgorICoKKyAqIFRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSBvbmNlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLiAgVGhlIENQVQorICogY2FuIHJlZ2FpbiBvd25lcnNoaXAgYnkgY2FsbGluZyBkbWFfdW5tYXBfc2luZ2xlKCkgb3IKKyAqIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLAorCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKworCWlmICghYXJjaF9pc19jb2hlcmVudCgpKQorCQlkbWFfY2FjaGVfbWFpbnQoY3B1X2FkZHIsIHNpemUsIGRpcik7CisKKwlyZXR1cm4gdmlydF90b19kbWEoZGV2LCBjcHVfYWRkcik7Cit9CisKKy8qKgorICogZG1hX21hcF9wYWdlIC0gbWFwIGEgcG9ydGlvbiBvZiBhIHBhZ2UgZm9yIHN0cmVhbWluZyBETUEKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcworICogQHBhZ2U6IHBhZ2UgdGhhdCBidWZmZXIgcmVzaWRlcyBpbgorICogQG9mZnNldDogb2Zmc2V0IGludG8gcGFnZSBmb3Igc3RhcnQgb2YgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIgdG8gbWFwCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKgorICogRW5zdXJlIHRoYXQgYW55IGRhdGEgaGVsZCBpbiB0aGUgY2FjaGUgaXMgYXBwcm9wcmlhdGVseSBkaXNjYXJkZWQKKyAqIG9yIHdyaXR0ZW4gYmFjay4KKyAqCisgKiBUaGUgZGV2aWNlIG93bnMgdGhpcyBtZW1vcnkgb25jZSB0aGlzIGNhbGwgaGFzIGNvbXBsZXRlZC4gIFRoZSBDUFUKKyAqIGNhbiByZWdhaW4gb3duZXJzaGlwIGJ5IGNhbGxpbmcgZG1hX3VubWFwX3BhZ2UoKS4KKyAqLworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOworCisJaWYgKCFhcmNoX2lzX2NvaGVyZW50KCkpCisJCWRtYV9jYWNoZV9tYWludChwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsIHNpemUsIGRpcik7CisKKwlyZXR1cm4gcGFnZV90b19kbWEoZGV2LCBwYWdlKSArIG9mZnNldDsKK30KKworLyoqCisgKiBkbWFfdW5tYXBfc2luZ2xlIC0gdW5tYXAgYSBzaW5nbGUgYnVmZmVyIHByZXZpb3VzbHkgbWFwcGVkCisgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKKyAqIEBoYW5kbGU6IERNQSBhZGRyZXNzIG9mIGJ1ZmZlcgorICogQHNpemU6IHNpemUgb2YgYnVmZmVyIChzYW1lIGFzIHBhc3NlZCB0byBkbWFfbWFwX3NpbmdsZSkKKyAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24gKHNhbWUgYXMgcGFzc2VkIHRvIGRtYV9tYXBfc2luZ2xlKQorICoKKyAqIFVubWFwIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbi4gIFRoZSBoYW5kbGUgYW5kIHNpemUKKyAqIG11c3QgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIHByZXZpb3VzIGRtYV9tYXBfc2luZ2xlKCkgY2FsbC4KKyAqIEFsbCBvdGhlciB1c2FnZXMgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBBZnRlciB0aGlzIGNhbGwsIHJlYWRzIGJ5IHRoZSBDUFUgdG8gdGhlIGJ1ZmZlciBhcmUgZ3VhcmFudGVlZCB0byBzZWUKKyAqIHdoYXRldmVyIHRoZSBkZXZpY2Ugd3JvdGUgdGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsCisJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJLyogbm90aGluZyB0byBkbyAqLworfQogI2VuZGlmIC8qIENPTkZJR19ETUFCT1VOQ0UgKi8KIAorLyoqCisgKiBkbWFfdW5tYXBfcGFnZSAtIHVubWFwIGEgYnVmZmVyIHByZXZpb3VzbHkgbWFwcGVkIHRocm91Z2ggZG1hX21hcF9wYWdlKCkKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcworICogQGhhbmRsZTogRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIgKHNhbWUgYXMgcGFzc2VkIHRvIGRtYV9tYXBfcGFnZSkKKyAqIEBkaXI6IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24gKHNhbWUgYXMgcGFzc2VkIHRvIGRtYV9tYXBfcGFnZSkKKyAqCisgKiBVbm1hcCBhIHBhZ2Ugc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGhhbmRsZSBhbmQgc2l6ZQorICogbXVzdCBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgcHJldmlvdXMgZG1hX21hcF9wYWdlKCkgY2FsbC4KKyAqIEFsbCBvdGhlciB1c2FnZXMgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBBZnRlciB0aGlzIGNhbGwsIHJlYWRzIGJ5IHRoZSBDUFUgdG8gdGhlIGJ1ZmZlciBhcmUgZ3VhcmFudGVlZCB0byBzZWUKKyAqIHdoYXRldmVyIHRoZSBkZXZpY2Ugd3JvdGUgdGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLAorCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBoYW5kbGUsIHNpemUsIGRpcik7Cit9CisKKy8qKgorICogZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcworICogQGhhbmRsZTogRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCisgKiBAb2Zmc2V0OiBvZmZzZXQgb2YgcmVnaW9uIHRvIHN0YXJ0IHN5bmMKKyAqIEBzaXplOiBzaXplIG9mIHJlZ2lvbiB0byBzeW5jCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uIChzYW1lIGFzIHBhc3NlZCB0byBkbWFfbWFwX3NpbmdsZSkKKyAqCisgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEKKyAqIHRyYW5zbGF0aW9uIGFmdGVyIGEgdHJhbnNmZXIuCisgKgorICogSWYgeW91IHBlcmZvcm0gYSBkbWFfbWFwX3NpbmdsZSgpIGJ1dCB3aXNoIHRvIGludGVycm9nYXRlIHRoZQorICogYnVmZmVyIHVzaW5nIHRoZSBjcHUsIHlldCBkbyBub3Qgd2lzaCB0byB0ZWFyZG93biB0aGUgUENJIGRtYQorICogbWFwcGluZywgeW91IG11c3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBkb2luZyBzby4gIEF0IHRoZQorICogbmV4dCBwb2ludCB5b3UgZ2l2ZSB0aGUgUENJIGRtYSBhZGRyZXNzIGJhY2sgdG8gdGhlIGNhcmQsIHlvdQorICogbXVzdCBmaXJzdCB0aGUgcGVyZm9ybSBhIGRtYV9zeW5jX2Zvcl9kZXZpY2UsIGFuZCB0aGVuIHRoZQorICogZGV2aWNlIGFnYWluIG93bnMgdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJZG1hX2FkZHJfdCBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKworCWRtYWJvdW5jZV9zeW5jX2Zvcl9jcHUoZGV2LCBoYW5kbGUsIG9mZnNldCwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJZG1hX2FkZHJfdCBoYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKworCWlmICghZG1hYm91bmNlX3N5bmNfZm9yX2RldmljZShkZXYsIGhhbmRsZSwgb2Zmc2V0LCBzaXplLCBkaXIpKQorCQlyZXR1cm47CisKKwlpZiAoIWFyY2hfaXNfY29oZXJlbnQoKSkKKwkJZG1hX2NhY2hlX21haW50KGRtYV90b192aXJ0KGRldiwgaGFuZGxlKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJZG1hX2FkZHJfdCBoYW5kbGUsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoZGV2LCBoYW5kbGUsIDAsIHNpemUsIGRpcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKGRldiwgaGFuZGxlLCAwLCBzaXplLCBkaXIpOworfQorCisvKgorICogVGhlIHNjYXR0ZXIgbGlzdCB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgbWV0aG9kcy4KKyAqLworZXh0ZXJuIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsCisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbik7CisKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA0Y2E3NTE2Li5hNTgzNzhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMyw3ICszLDYgQEAKIAogI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCiAgKi8KQEAgLTE3LDEyICsxNiwzNCBAQAogdHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKIAogdHlwZWRlZiBzdHJ1Y3QgdXNlcl9mcCBlbGZfZnByZWdzZXRfdDsKLSNlbmRpZgogCiAjZGVmaW5lIEVNX0FSTQk0MAotI2RlZmluZSBFRl9BUk1fQVBDUzI2IDB4MDgKLSNkZWZpbmUgRUZfQVJNX1NPRlRfRkxPQVQgMHgyMDAKLSNkZWZpbmUgRUZfQVJNX0VBQklfTUFTSyAweEZGMDAwMDAwCisKKyNkZWZpbmUgRUZfQVJNX0VBQklfTUFTSwkweGZmMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1VOS05PV04JMHgwMDAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIxCTB4MDEwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMgkweDAyMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjMJMHgwMzAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVI0CTB4MDQwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSNQkweDA1MDAwMDAwCisKKyNkZWZpbmUgRUZfQVJNX0JFOAkJMHgwMDgwMDAwMAkvKiBBQkkgNCw1ICovCisjZGVmaW5lIEVGX0FSTV9MRTgJCTB4MDA0MDAwMDAJLyogQUJJIDQsNSAqLworI2RlZmluZSBFRl9BUk1fTUFWRVJJQ0tfRkxPQVQJMHgwMDAwMDgwMAkvKiBBQkkgMCAqLworI2RlZmluZSBFRl9BUk1fVkZQX0ZMT0FUCTB4MDAwMDA0MDAJLyogQUJJIDAgKi8KKyNkZWZpbmUgRUZfQVJNX1NPRlRfRkxPQVQJMHgwMDAwMDIwMAkvKiBBQkkgMCAqLworI2RlZmluZSBFRl9BUk1fT0xEX0FCSQkJMHgwMDAwMDEwMAkvKiBBQkkgMCAqLworI2RlZmluZSBFRl9BUk1fTkVXX0FCSQkJMHgwMDAwMDA4MAkvKiBBQkkgMCAqLworI2RlZmluZSBFRl9BUk1fQUxJR044CQkweDAwMDAwMDQwCS8qIEFCSSAwICovCisjZGVmaW5lIEVGX0FSTV9QSUMJCTB4MDAwMDAwMjAJLyogQUJJIDAgKi8KKyNkZWZpbmUgRUZfQVJNX01BUFNZTVNGSVJTVAkweDAwMDAwMDEwCS8qIEFCSSAyICovCisjZGVmaW5lIEVGX0FSTV9BUENTX0ZMT0FUCTB4MDAwMDAwMTAJLyogQUJJIDAsIGZsb2F0cyBpbiBmcCByZWdzICovCisjZGVmaW5lIEVGX0FSTV9EWU5TWU1TVVNFU0VHSURYCTB4MDAwMDAwMDgJLyogQUJJIDIgKi8KKyNkZWZpbmUgRUZfQVJNX0FQQ1NfMjYJCTB4MDAwMDAwMDgJLyogQUJJIDAgKi8KKyNkZWZpbmUgRUZfQVJNX1NZTVNBUkVTT1JURUQJMHgwMDAwMDAwNAkvKiBBQkkgMSwyICovCisjZGVmaW5lIEVGX0FSTV9JTlRFUldPUksJMHgwMDAwMDAwNAkvKiBBQkkgMCAqLworI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkJCTB4MDAwMDAwMDIJLyogQWxsICovCisjZGVmaW5lIEVGX0FSTV9SRUxFWEVDCQkweDAwMDAwMDAxCS8qIEFsbCAqLwogCiAjZGVmaW5lIFJfQVJNX05PTkUJMAogI2RlZmluZSBSX0FSTV9QQzI0CTEKQEAgLTQxLDcgKzYyLDYgQEAKICNlbmRpZgogI2RlZmluZSBFTEZfQVJDSAlFTV9BUk0KIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KIC8qCiAgKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KICAqIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCkBAIC01OSwyNSArNzksMTcgQEAKICNkZWZpbmUgRUxGX1BMQVRGT1JNCShlbGZfcGxhdGZvcm0pCiAKIGV4dGVybiBjaGFyIGVsZl9wbGF0Zm9ybVtdOwotI2VuZGlmCisKK3N0cnVjdCBlbGYzMl9oZHI7CiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgogICovCi0jZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpICgoeCktPmVfbWFjaGluZSA9PSBFTV9BUk0gJiYgRUxGX1BST0NfT0soeCkpCitleHRlcm4gaW50IGVsZl9jaGVja19hcmNoKGNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKik7CisjZGVmaW5lIGVsZl9jaGVja19hcmNoIGVsZl9jaGVja19hcmNoCiAKLS8qCi0gKiAzMi1iaXQgY29kZSBpcyBhbHdheXMgT0suICBTb21lIGNwdXMgY2FuIGRvIDI2LWJpdCwgc29tZSBjYW4ndC4KLSAqLwotI2RlZmluZSBFTEZfUFJPQ19PSyh4KQkoRUxGX1RIVU1CX09LKHgpICYmIEVMRl8yNkJJVF9PSyh4KSkKLQotI2RlZmluZSBFTEZfVEhVTUJfT0soeCkgXAotCSgoZWxmX2h3Y2FwICYgSFdDQVBfVEhVTUIgJiYgKCh4KS0+ZV9lbnRyeSAmIDEpID09IDEpIHx8IFwKLQkgKCh4KS0+ZV9lbnRyeSAmIDMpID09IDApCi0KLSNkZWZpbmUgRUxGXzI2QklUX09LKHgpIFwKLQkoKGVsZl9od2NhcCAmIEhXQ0FQXzI2QklUICYmICh4KS0+ZV9mbGFncyAmIEVGX0FSTV9BUENTMjYpIHx8IFwKLQkgICgoeCktPmVfZmxhZ3MgJiBFRl9BUk1fQVBDUzI2KSA9PSAwKQorZXh0ZXJuIGludCBhcm1fZWxmX3JlYWRfaW1wbGllc19leGVjKGNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKiwgaW50KTsKKyNkZWZpbmUgZWxmX3JlYWRfaW1wbGllc19leGVjKGV4LHN0aykgYXJtX2VsZl9yZWFkX2ltcGxpZXNfZXhlYygmKGV4KSwgc3RrKQogCiAjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCiAjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCTQwOTYKQEAgLTk0LDIzICsxMDYsNyBAQAogICAgaGF2ZSBubyBzdWNoIGhhbmRsZXIuICAqLwogI2RlZmluZSBFTEZfUExBVF9JTklUKF9yLCBsb2FkX2FkZHIpCShfciktPkFSTV9yMCA9IDAKIAotLyoKLSAqIFNpbmNlIHRoZSBGUEEgY29wcm9jZXNzb3IgdXNlcyBDUDEgYW5kIENQMiwgYW5kIGlXTU1YdCB1c2VzIENQMAotICogYW5kIENQMSwgd2Ugb25seSBlbmFibGUgYWNjZXNzIHRvIHRoZSBpV01NWHQgY29wcm9jZXNzb3IgaWYgdGhlCi0gKiBiaW5hcnkgaXMgRUFCSSBvciBzb2Z0ZmxvYXQgKGFuZCB0aHVzLCBndWFyYW50ZWVkIG5vdCB0byB1c2UKLSAqIEZQQSBpbnN0cnVjdGlvbnMuKQotICovCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoKGV4KS5lX2ZsYWdzICYgRUZfQVJNX0FQQ1MyNikgewkJCVwKLQkJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOwkJCVwKLQkJfSBlbHNlIHsJCQkJCQlcCi0JCQlzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYXzMyQklUKTsJCVwKLQkJCWlmIChlbGZfaHdjYXAgJiBIV0NBUF9JV01NWFQgJiYgKGV4KS5lX2ZsYWdzICYgKEVGX0FSTV9FQUJJX01BU0sgfCBFRl9BUk1fU09GVF9GTE9BVCkpIFwKLQkJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7CVwKLQkJCWVsc2UJCQkJCQlcCi0JCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7CVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIGVsZl9zZXRfcGVyc29uYWxpdHkoY29uc3Qgc3RydWN0IGVsZjMyX2hkciAqKTsKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KQllbGZfc2V0X3BlcnNvbmFsaXR5KCYoZXgpKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDZhMzMyYTkuLjllZTc0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZnV0ZXguaApAQCAtMSw2ICsxLDEyNCBAQAotI2lmbmRlZiBfQVNNX0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9GVVRFWF9ICisjaWZuZGVmIF9BU01fQVJNX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9BUk1fRlVURVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX1NNUAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KIAotI2VuZGlmCisjZWxzZSAvKiAhU01QLCB3ZSBjYW4gd29yayBhcm91bmQgbGFjayBvZiBhdG9taWMgb3BzIGJ5IGRpc2FibGluZyBwcmVlbXB0aW9uICovCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AoaW5zbiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZykJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIxOglsZHJ0CSUxLCBbJTJdXG4iCQkJCVwKKwkiCSIgaW5zbiAiXG4iCQkJCQlcCisJIjI6CXN0cnQJJTAsIFslMl1cbiIJCQkJXAorCSIJbW92CSUwLCAjMFxuIgkJCQlcCisJIjM6XG4iCQkJCQkJCVwKKwkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCisJIgkuYWxpZ24JM1xuIgkJCQkJXAorCSIJLmxvbmcJMWIsIDRmLCAyYiwgNGZcbiIJCQlcCisJIgkucHJldmlvdXNcbiIJCQkJCVwKKwkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCisJIjQ6CW1vdgklMCwgJTRcbiIJCQkJXAorCSIJYgkzYlxuIgkJCQkJXAorCSIJLnByZXZpb3VzIgkJCQkJXAorCTogIj0mciIgKHJldCksICI9JnIiIChvbGR2YWwpCQkJCVwKKwk6ICJyIiAodWFkZHIpLCAiciIgKG9wYXJnKSwgIklyIiAoLUVGQVVMVCkJCVwKKwk6ICJjYyIsICJtZW1vcnkiKQorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CS8qIGltcGxpZXMgcHJlZW1wdF9kaXNhYmxlKCkgKi8KKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwkJX19mdXRleF9hdG9taWNfb3AoIm1vdgklMCwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJCV9fZnV0ZXhfYXRvbWljX29wKCJhZGQJJTAsICUxLCAlMyIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX09SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgib3JyCSUwLCAlMSwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiYW5kCSUwLCAlMSwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIH5vcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiZW9yCSUwLCAlMSwgJTMiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CS8qIHN1YnN1bWVzIHByZWVtcHRfZW5hYmxlKCkgKi8KKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROiByZXQgPSAob2xkdmFsID09IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9ORTogcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6IHJldCA9IChvbGR2YWwgPCBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6IHJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xFOiByZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDogcmV0ID0gKG9sZHZhbCA+IGNtcGFyZyk7IGJyZWFrOworCQlkZWZhdWx0OiByZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyhpbnQgX191c2VyICp1YWRkciwgaW50IG9sZHZhbCwgaW50IG5ld3ZhbCkKK3sKKwlpbnQgdmFsOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CS8qIGltcGxpZXMgcHJlZW1wdF9kaXNhYmxlKCkgKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJAZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWNcbiIKKwkiMToJbGRydAklMCwgWyUzXVxuIgorCSIJdGVxCSUwLCAlMVxuIgorCSIyOglzdHJlcXQJJTIsIFslM11cbiIKKwkiMzpcbiIKKwkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkiCS5hbGlnbgkzXG4iCisJIgkubG9uZwkxYiwgNGYsIDJiLCA0ZlxuIgorCSIJLnByZXZpb3VzXG4iCisJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJIjQ6CW1vdgklMCwgJTRcbiIKKwkiCWIJM2JcbiIKKwkiCS5wcmV2aW91cyIKKwk6ICI9JnIiICh2YWwpCisJOiAiciIgKG9sZHZhbCksICJyIiAobmV3dmFsKSwgInIiICh1YWRkciksICJJciIgKC1FRkFVTFQpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CS8qIHN1YnN1bWVzIHByZWVtcHRfZW5hYmxlKCkgKi8KKworCXJldHVybiB2YWw7Cit9CisKKyNlbmRpZiAvKiAhU01QICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9BUk1fRlVURVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggOTRhOTVkNy4uYTgwOTQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9pby5oCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIE1UX0RFVklDRQkJMAogI2RlZmluZSBNVF9ERVZJQ0VfTk9OU0hBUkVECTEKICNkZWZpbmUgTVRfREVWSUNFX0NBQ0hFRAkyCi0jZGVmaW5lIE1UX0RFVklDRV9JWFAyMDAwCTMKKyNkZWZpbmUgTVRfREVWSUNFX1dDCQkzCiAvKgogICogdHlwZXMgNCBvbndhcmRzIGNhbiBiZSBmb3VuZCBpbiBhc20vbWFjaC9tYXAuaCBhbmQgYXJlIHVuZGVmaW5lZAogICogZm9yIGlvcmVtYXAKQEAgLTIxNSwxMSArMjE1LDEzIEBACiAjZGVmaW5lIGlvcmVtYXAoY29va2llLHNpemUpCQlfX2FybV9pb3JlbWFwKGNvb2tpZSwgc2l6ZSwgTVRfREVWSUNFKQogI2RlZmluZSBpb3JlbWFwX25vY2FjaGUoY29va2llLHNpemUpCV9fYXJtX2lvcmVtYXAoY29va2llLCBzaXplLCBNVF9ERVZJQ0UpCiAjZGVmaW5lIGlvcmVtYXBfY2FjaGVkKGNvb2tpZSxzaXplKQlfX2FybV9pb3JlbWFwKGNvb2tpZSwgc2l6ZSwgTVRfREVWSUNFX0NBQ0hFRCkKKyNkZWZpbmUgaW9yZW1hcF93Yyhjb29raWUsc2l6ZSkJCV9fYXJtX2lvcmVtYXAoY29va2llLCBzaXplLCBNVF9ERVZJQ0VfV0MpCiAjZGVmaW5lIGlvdW5tYXAoY29va2llKQkJCV9faW91bm1hcChjb29raWUpCiAjZWxzZQogI2RlZmluZSBpb3JlbWFwKGNvb2tpZSxzaXplKQkJX19hcmNoX2lvcmVtYXAoKGNvb2tpZSksIChzaXplKSwgTVRfREVWSUNFKQogI2RlZmluZSBpb3JlbWFwX25vY2FjaGUoY29va2llLHNpemUpCV9fYXJjaF9pb3JlbWFwKChjb29raWUpLCAoc2l6ZSksIE1UX0RFVklDRSkKICNkZWZpbmUgaW9yZW1hcF9jYWNoZWQoY29va2llLHNpemUpCV9fYXJjaF9pb3JlbWFwKChjb29raWUpLCAoc2l6ZSksIE1UX0RFVklDRV9DQUNIRUQpCisjZGVmaW5lIGlvcmVtYXBfd2MoY29va2llLHNpemUpCQlfX2FyY2hfaW9yZW1hcCgoY29va2llKSwgKHNpemUpLCBNVF9ERVZJQ0VfV0MpCiAjZGVmaW5lIGlvdW5tYXAoY29va2llKQkJCV9fYXJjaF9pb3VubWFwKGNvb2tpZSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IGQ2Nzg2MDkuLmEwMDA5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0yMiw2ICsyMiwxMCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHN0cnVjdCBpcnFhY3Rpb247CiBleHRlcm4gdm9pZCBtaWdyYXRlX2lycXModm9pZCk7CisKK2V4dGVybiB2b2lkIGFzbV9kb19JUlEodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3ZvaWQgaW5pdF9JUlEodm9pZCk7CisKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2twcm9iZXMuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2twcm9iZXMuaAppbmRleCBhNWQwZDk5Li5iYjhhMTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rcHJvYmVzLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3Byb2Jlcy5oCkBAIC02MSw3ICs2MSw2IEBACiB2b2lkIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICopOwogdm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKTsKIAotaW50IGtwcm9iZV90cmFwX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cik7CiBpbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBmc3IpOwogaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oCmluZGV4IDA2ZjU4M2IuLmNiMTEzOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tYXAuaApAQCAtMjYsOSArMjYsNiBAQAogI2RlZmluZSBNVF9NRU1PUlkJCTgKICNkZWZpbmUgTVRfUk9NCQkJOQogCi0jZGVmaW5lIE1UX05PTlNIQVJFRF9ERVZJQ0UJTVRfREVWSUNFX05PTlNIQVJFRAotI2RlZmluZSBNVF9JWFAyMDAwX0RFVklDRQlNVF9ERVZJQ0VfSVhQMjAwMAotCiAjaWZkZWYgQ09ORklHX01NVQogZXh0ZXJuIHZvaWQgaW90YWJsZV9pbml0KHN0cnVjdCBtYXBfZGVzYyAqLCBpbnQpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvdWRjX3B4YTJ4eC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC91ZGNfcHhhMnh4LmgKaW5kZXggMjcwOTAyYy4uZjNlYWJmMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC91ZGNfcHhhMnh4LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC91ZGNfcHhhMnh4LmgKQEAgLTE4LDggKzE4LDcgQEAKIAkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAogCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdlaXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKIAkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgotCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgotCSAqIE5vdGUgdGhhdCBzb21ldGltZXMgdGhlIHNpZ25hbHMgZ28gdGhyb3VnaCBpbnZlcnRlcnMuLi4KKwkgKiBoZXJlLiAgTm90ZSB0aGF0IHNvbWV0aW1lcyB0aGUgc2lnbmFscyBnbyB0aHJvdWdoIGludmVydGVycy4uLgogCSAqLwogCWJvb2wJZ3Bpb192YnVzX2ludmVydGVkOwogCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYzE0NjgxOHJ0Yy5oCmluZGV4IGUxY2E0OGEuLjZiODg0ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWMxNDY4MThydGMuaApAQCAtNCw4ICs0LDggQEAKICNpZm5kZWYgX0FTTV9NQzE0NjgxOFJUQ19ICiAjZGVmaW5lIF9BU01fTUMxNDY4MThSVENfSAogCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2lmbmRlZiBSVENfUE9SVAogI2RlZmluZSBSVENfUE9SVCh4KQkoMHg3MCArICh4KSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggYmY3YzczNy4uODA5ZmY5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKQEAgLTEzLDMwICsxMywyNyBAQAogI2lmbmRlZiBfX0FTTV9BUk1fTUVNT1JZX0gKICNkZWZpbmUgX19BU01fQVJNX01FTU9SWV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CisjaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKwogLyoKICAqIEFsbG93IGZvciBjb25zdGFudHMgZGVmaW5lZCBoZXJlIHRvIGJlIHVzZWQgZnJvbSBhc3NlbWJseSBjb2RlCiAgKiBieSBwcmVwZW5kaW5nIHRoZSBVTCBzdWZmaXggb25seSB3aXRoIGFjdHVhbCBDIGNvZGUgY29tcGlsYXRpb24uCiAgKi8KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIFVMKHgpICh4IyNVTCkKLSNlbHNlCi0jZGVmaW5lIFVMKHgpICh4KQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjZGVmaW5lIFVMKHgpIF9BQyh4LCBVTCkKIAogI2lmZGVmIENPTkZJR19NTVUKIAotI2lmbmRlZiBUQVNLX1NJWkUKIC8qCisgKiBQQUdFX09GRlNFVCAtIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBrZXJuZWwgaW1hZ2UKICAqIFRBU0tfU0laRSAtIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB1c2VyIHNwYWNlIHRhc2suCiAgKiBUQVNLX1VOTUFQUEVEX0JBU0UgLSB0aGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIG1tYXAgVk0gYXJlYQogICovCi0jZGVmaW5lIFRBU0tfU0laRQkJVUwoMHhiZjAwMDAwMCkKLSNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCVVMKDB4NDAwMDAwMDApCi0jZW5kaWYKKyNkZWZpbmUgUEFHRV9PRkZTRVQJCVVMKENPTkZJR19QQUdFX09GRlNFVCkKKyNkZWZpbmUgVEFTS19TSVpFCQkoVUwoQ09ORklHX1BBR0VfT0ZGU0VUKSAtIFVMKDB4MDEwMDAwMDApKQorI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFVMKENPTkZJR19QQUdFX09GRlNFVCkgLyAzKQogCiAvKgogICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIDI2LWJpdCB1c2VyIHNwYWNlIHRhc2suCkBAIC00NCwxMyArNDEsNiBAQAogI2RlZmluZSBUQVNLX1NJWkVfMjYJCVVMKDB4MDQwMDAwMDApCiAKIC8qCi0gKiBQYWdlIG9mZnNldDogM0dCCi0gKi8KLSNpZm5kZWYgUEFHRV9PRkZTRVQKLSNkZWZpbmUgUEFHRV9PRkZTRVQJCVVMKDB4YzAwMDAwMDApCi0jZW5kaWYKLQotLyoKICAqIFRoZSBtb2R1bGUgc3BhY2UgbGl2ZXMgYmV0d2VlbiB0aGUgYWRkcmVzc2VzIGdpdmVuIGJ5IFRBU0tfU0laRQogICogYW5kIFBBR0VfT0ZGU0VUIC0gaXQgbXVzdCBiZSB3aXRoaW4gMzJNQiBvZiB0aGUga2VybmVsIHRleHQuCiAgKi8KQEAgLTE0NywxNyArMTM3LDExIEBACiAKICNpZm5kZWYgYXJjaF9hZGp1c3Rfem9uZXMKICNkZWZpbmUgYXJjaF9hZGp1c3Rfem9uZXMobm9kZSxzaXplLGhvbGVzKSBkbyB7IH0gd2hpbGUgKDApCisjZWxpZiAhZGVmaW5lZChDT05GSUdfWk9ORV9ETUEpCisjZXJyb3IgImN1c3RvbSBhcmNoX2FkanVzdF96b25lcygpIHJlcXVpcmVzIENPTkZJR19aT05FX0RNQSIKICNlbmRpZgogCiAvKgotICogQW1vdW50IG9mIG1lbW9yeSByZXNlcnZlZCBmb3IgdGhlIHZtYWxsb2MoKSBhcmVhLCBhbmQgbWluaW11bQotICogYWRkcmVzcyBmb3Igdm1hbGxvYyBtYXBwaW5ncy4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19yZXNlcnZlOwotCi0jZGVmaW5lIFZNQUxMT0NfTUlOCQkodm9pZCAqKShWTUFMTE9DX0VORCAtIHZtYWxsb2NfcmVzZXJ2ZSkKLQotLyoKICAqIFBGTnMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgYW55IHBoeXNpY2FsIHBhZ2U7IHRoaXMgbWVhbnMKICAqIFBGTiAwID09IHBoeXNpY2FsIGFkZHJlc3MgMC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBhMzAxZTQ0Li4wNTU5ZjM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IGNmMmUyNjguLmJlZDFjMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTE4NCw4ICsxODQsOSBAQAogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCi0jZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKLQkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKyNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKKwkoKChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFJFQURfSU1QTElFU19FWEVDKSA/IFZNX0VYRUMgOiAwKSB8IFwKKwkgVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKIAogLyoKICAqIFdpdGggRUFCSSBvbiBBUk12NSBhbmQgYWJvdmUgd2UgbXVzdCBoYXZlIDY0LWJpdCBhbGlnbmVkIHNsYWIgcG9pbnRlcnMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDcyMWMwM2QuLjkxOGQwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0zMCw3ICszMCw3IEBACiAgKiBUaGUgbmV0d29ya2luZyBhbmQgYmxvY2sgZGV2aWNlIGxheWVycyB1c2UgdGhpcyBib29sZWFuIGZvciBib3VuY2UKICAqIGJ1ZmZlciBkZWNpc2lvbnMuCiAgKi8KLSNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUyAgICAgKDApCisjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMgICAgICgxKQogCiAvKgogICogV2hldGhlciBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBpcyBhIG5vcCBkZXBlbmRzIHVwb24gdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggOGUyMWVmMS4uMTEwMjk1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTY0LDE0ICsxNjQsMzAgQEAKICNkZWZpbmUgTF9QVEVfUFJFU0VOVAkJKDEgPDwgMCkKICNkZWZpbmUgTF9QVEVfRklMRQkJKDEgPDwgMSkJLyogb25seSB3aGVuICFQUkVTRU5UICovCiAjZGVmaW5lIExfUFRFX1lPVU5HCQkoMSA8PCAxKQotI2RlZmluZSBMX1BURV9CVUZGRVJBQkxFCSgxIDw8IDIpCS8qIG1hdGNoZXMgUFRFICovCi0jZGVmaW5lIExfUFRFX0NBQ0hFQUJMRQkJKDEgPDwgMykJLyogbWF0Y2hlcyBQVEUgKi8KLSNkZWZpbmUgTF9QVEVfVVNFUgkJKDEgPDwgNCkKLSNkZWZpbmUgTF9QVEVfV1JJVEUJCSgxIDw8IDUpCi0jZGVmaW5lIExfUFRFX0VYRUMJCSgxIDw8IDYpCi0jZGVmaW5lIExfUFRFX0RJUlRZCQkoMSA8PCA3KQorI2RlZmluZSBMX1BURV9CVUZGRVJBQkxFCSgxIDw8IDIpCS8qIG9ic29sZXRlLCBtYXRjaGVzIFBURSAqLworI2RlZmluZSBMX1BURV9DQUNIRUFCTEUJCSgxIDw8IDMpCS8qIG9ic29sZXRlLCBtYXRjaGVzIFBURSAqLworI2RlZmluZSBMX1BURV9ESVJUWQkJKDEgPDwgNikKKyNkZWZpbmUgTF9QVEVfV1JJVEUJCSgxIDw8IDcpCisjZGVmaW5lIExfUFRFX1VTRVIJCSgxIDw8IDgpCisjZGVmaW5lIExfUFRFX0VYRUMJCSgxIDw8IDkpCiAjZGVmaW5lIExfUFRFX1NIQVJFRAkJKDEgPDwgMTApCS8qIHNoYXJlZCh2NiksIGNvaGVyZW50KHhzYzMpICovCiAKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG1lbW9yeSB0eXBlcywgZGVmaW5lZCB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAqIHByZS1BUk12NiBDUFVzIGNhY2hlYWJsZSBhbmQgYnVmZmVyYWJsZSBiaXRzOiAgIFhYQ0IKKyAqLworI2RlZmluZSBMX1BURV9NVF9VTkNBQ0hFRAkoMHgwMCA8PCAyKQkvKiAwMDAwICovCisjZGVmaW5lIExfUFRFX01UX0JVRkZFUkFCTEUJKDB4MDEgPDwgMikJLyogMDAwMSAqLworI2RlZmluZSBMX1BURV9NVF9XUklURVRIUk9VR0gJKDB4MDIgPDwgMikJLyogMDAxMCAqLworI2RlZmluZSBMX1BURV9NVF9XUklURUJBQ0sJKDB4MDMgPDwgMikJLyogMDAxMSAqLworI2RlZmluZSBMX1BURV9NVF9NSU5JQ0FDSEUJKDB4MDYgPDwgMikJLyogMDExMCAoc2ExMTAwLCB4c2NhbGUpICovCisjZGVmaW5lIExfUFRFX01UX1dSSVRFQUxMT0MJKDB4MDcgPDwgMikJLyogMDExMSAqLworI2RlZmluZSBMX1BURV9NVF9ERVZfU0hBUkVECSgweDA0IDw8IDIpCS8qIDAxMDAgKi8KKyNkZWZpbmUgTF9QVEVfTVRfREVWX05PTlNIQVJFRAkoMHgwYyA8PCAyKQkvKiAxMTAwICovCisjZGVmaW5lIExfUFRFX01UX0RFVl9XQwkJKDB4MDkgPDwgMikJLyogMTAwMSAqLworI2RlZmluZSBMX1BURV9NVF9ERVZfQ0FDSEVECSgweDBiIDw8IDIpCS8qIDEwMTEgKi8KKyNkZWZpbmUgTF9QVEVfTVRfTUFTSwkJKDB4MGYgPDwgMikKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoKQEAgLTE4MCwyMyArMTk2LDMwIEBACiAgKiBhcyB3ZWxsIGFzIGFueSBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IGJpdHMgbGlrZSBnbG9iYWwvQVNJRCBhbmQgU01QCiAgKiBzaGFyZWQgbWFwcGluZyBiaXRzLgogICovCi0jZGVmaW5lIF9MX1BURV9ERUZBVUxUCUxfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX0NBQ0hFQUJMRSB8IExfUFRFX0JVRkZFUkFCTEUKLSNkZWZpbmUgX0xfUFRFX1JFQUQJTF9QVEVfVVNFUiB8IExfUFRFX0VYRUMKKyNkZWZpbmUgX0xfUFRFX0RFRkFVTFQJTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCiAKIGV4dGVybiBwZ3Byb3RfdAkJcGdwcm90X3VzZXI7CiBleHRlcm4gcGdwcm90X3QJCXBncHJvdF9rZXJuZWw7CiAKLSNkZWZpbmUgUEFHRV9OT05FCXBncHJvdF91c2VyCi0jZGVmaW5lIFBBR0VfQ09QWQlfX3BncHJvdChwZ3Byb3RfdmFsKHBncHJvdF91c2VyKSB8IF9MX1BURV9SRUFEKQotI2RlZmluZSBQQUdFX1NIQVJFRAlfX3BncHJvdChwZ3Byb3RfdmFsKHBncHJvdF91c2VyKSB8IF9MX1BURV9SRUFEIHwgXAotCQkJCSBMX1BURV9XUklURSkKLSNkZWZpbmUgUEFHRV9SRUFET05MWQlfX3BncHJvdChwZ3Byb3RfdmFsKHBncHJvdF91c2VyKSB8IF9MX1BURV9SRUFEKQotI2RlZmluZSBQQUdFX0tFUk5FTAlwZ3Byb3Rfa2VybmVsCisjZGVmaW5lIF9NT0RfUFJPVChwLCBiKQlfX3BncHJvdChwZ3Byb3RfdmFsKHApIHwgKGIpKQogCi0jZGVmaW5lIF9fUEFHRV9OT05FCV9fcGdwcm90KF9MX1BURV9ERUZBVUxUKQotI2RlZmluZSBfX1BBR0VfQ09QWQlfX3BncHJvdChfTF9QVEVfREVGQVVMVCB8IF9MX1BURV9SRUFEKQotI2RlZmluZSBfX1BBR0VfU0hBUkVECV9fcGdwcm90KF9MX1BURV9ERUZBVUxUIHwgX0xfUFRFX1JFQUQgfCBMX1BURV9XUklURSkKLSNkZWZpbmUgX19QQUdFX1JFQURPTkxZCV9fcGdwcm90KF9MX1BURV9ERUZBVUxUIHwgX0xfUFRFX1JFQUQpCisjZGVmaW5lIFBBR0VfTk9ORQkJcGdwcm90X3VzZXIKKyNkZWZpbmUgUEFHRV9TSEFSRUQJCV9NT0RfUFJPVChwZ3Byb3RfdXNlciwgTF9QVEVfVVNFUiB8IExfUFRFX1dSSVRFKQorI2RlZmluZSBQQUdFX1NIQVJFRF9FWEVDCV9NT0RfUFJPVChwZ3Byb3RfdXNlciwgTF9QVEVfVVNFUiB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRVhFQykKKyNkZWZpbmUgUEFHRV9DT1BZCQlfTU9EX1BST1QocGdwcm90X3VzZXIsIExfUFRFX1VTRVIpCisjZGVmaW5lIFBBR0VfQ09QWV9FWEVDCQlfTU9EX1BST1QocGdwcm90X3VzZXIsIExfUFRFX1VTRVIgfCBMX1BURV9FWEVDKQorI2RlZmluZSBQQUdFX1JFQURPTkxZCQlfTU9EX1BST1QocGdwcm90X3VzZXIsIExfUFRFX1VTRVIpCisjZGVmaW5lIFBBR0VfUkVBRE9OTFlfRVhFQwlfTU9EX1BST1QocGdwcm90X3VzZXIsIExfUFRFX1VTRVIgfCBMX1BURV9FWEVDKQorI2RlZmluZSBQQUdFX0tFUk5FTAkJcGdwcm90X2tlcm5lbAorI2RlZmluZSBQQUdFX0tFUk5FTF9FWEVDCV9NT0RfUFJPVChwZ3Byb3Rfa2VybmVsLCBMX1BURV9FWEVDKQorCisjZGVmaW5lIF9fUEFHRV9OT05FCQlfX3BncHJvdChfTF9QVEVfREVGQVVMVCkKKyNkZWZpbmUgX19QQUdFX1NIQVJFRAkJX19wZ3Byb3QoX0xfUFRFX0RFRkFVTFQgfCBMX1BURV9VU0VSIHwgTF9QVEVfV1JJVEUpCisjZGVmaW5lIF9fUEFHRV9TSEFSRURfRVhFQwlfX3BncHJvdChfTF9QVEVfREVGQVVMVCB8IExfUFRFX1VTRVIgfCBMX1BURV9XUklURSB8IExfUFRFX0VYRUMpCisjZGVmaW5lIF9fUEFHRV9DT1BZCQlfX3BncHJvdChfTF9QVEVfREVGQVVMVCB8IExfUFRFX1VTRVIpCisjZGVmaW5lIF9fUEFHRV9DT1BZX0VYRUMJX19wZ3Byb3QoX0xfUFRFX0RFRkFVTFQgfCBMX1BURV9VU0VSIHwgTF9QVEVfRVhFQykKKyNkZWZpbmUgX19QQUdFX1JFQURPTkxZCQlfX3BncHJvdChfTF9QVEVfREVGQVVMVCB8IExfUFRFX1VTRVIpCisjZGVmaW5lIF9fUEFHRV9SRUFET05MWV9FWEVDCV9fcGdwcm90KF9MX1BURV9ERUZBVUxUIHwgTF9QVEVfVVNFUiB8IExfUFRFX0VYRUMpCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApAQCAtMjEyLDE5ICsyMzUsMTkgQEAKICNkZWZpbmUgX19QMDAxICBfX1BBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19QMDEwICBfX1BBR0VfQ09QWQogI2RlZmluZSBfX1AwMTEgIF9fUEFHRV9DT1BZCi0jZGVmaW5lIF9fUDEwMCAgX19QQUdFX1JFQURPTkxZCi0jZGVmaW5lIF9fUDEwMSAgX19QQUdFX1JFQURPTkxZCi0jZGVmaW5lIF9fUDExMCAgX19QQUdFX0NPUFkKLSNkZWZpbmUgX19QMTExICBfX1BBR0VfQ09QWQorI2RlZmluZSBfX1AxMDAgIF9fUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUDEwMSAgX19QQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19QMTEwICBfX1BBR0VfQ09QWV9FWEVDCisjZGVmaW5lIF9fUDExMSAgX19QQUdFX0NPUFlfRVhFQwogCiAjZGVmaW5lIF9fUzAwMCAgX19QQUdFX05PTkUKICNkZWZpbmUgX19TMDAxICBfX1BBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19TMDEwICBfX1BBR0VfU0hBUkVECiAjZGVmaW5lIF9fUzAxMSAgX19QQUdFX1NIQVJFRAotI2RlZmluZSBfX1MxMDAgIF9fUEFHRV9SRUFET05MWQotI2RlZmluZSBfX1MxMDEgIF9fUEFHRV9SRUFET05MWQotI2RlZmluZSBfX1MxMTAgIF9fUEFHRV9TSEFSRUQKLSNkZWZpbmUgX19TMTExICBfX1BBR0VfU0hBUkVECisjZGVmaW5lIF9fUzEwMCAgX19QQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19TMTAxICBfX1BBR0VfUkVBRE9OTFlfRVhFQworI2RlZmluZSBfX1MxMTAgIF9fUEFHRV9TSEFSRURfRVhFQworI2RlZmluZSBfX1MxMTEgIF9fUEFHRV9TSEFSRURfRVhFQwogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKQEAgLTI4Niw4ICszMDksMTAgQEAKIC8qCiAgKiBNYXJrIHRoZSBwcm90IHZhbHVlIGFzIHVuY2FjaGVhYmxlIGFuZCB1bmJ1ZmZlcmFibGUuCiAgKi8KLSNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KQlfX3BncHJvdChwZ3Byb3RfdmFsKHByb3QpICYgfihMX1BURV9DQUNIRUFCTEUgfCBMX1BURV9CVUZGRVJBQkxFKSkKLSNkZWZpbmUgcGdwcm90X3dyaXRlY29tYmluZShwcm90KSBfX3BncHJvdChwZ3Byb3RfdmFsKHByb3QpICYgfkxfUFRFX0NBQ0hFQUJMRSkKKyNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KSBcCisJX19wZ3Byb3QoKHBncHJvdF92YWwocHJvdCkgJiB+TF9QVEVfTVRfTUFTSykgfCBMX1BURV9NVF9VTkNBQ0hFRCkKKyNkZWZpbmUgcGdwcm90X3dyaXRlY29tYmluZShwcm90KSBcCisJX19wZ3Byb3QoKHBncHJvdF92YWwocHJvdCkgJiB+TF9QVEVfTVRfTUFTSykgfCBMX1BURV9NVF9CVUZGRVJBQkxFKQogCiAjZGVmaW5lIHBtZF9ub25lKHBtZCkJCSghcG1kX3ZhbChwbWQpKQogI2RlZmluZSBwbWRfcHJlc2VudChwbWQpCShwbWRfdmFsKHBtZCkpCkBAIC0zMjAsMTEgKzM0NSw2IEBACiAjZGVmaW5lIHBtZF9wYWdlKHBtZCkgdmlydF90b19wYWdlKF9fdmEocG1kX3ZhbChwbWQpKSkKIAogLyoKLSAqIFBlcm1hbmVudCBhZGRyZXNzIG9mIGEgcGFnZS4gV2UgbmV2ZXIgaGF2ZSBoaWdobWVtLCBzbyB0aGlzIGlzIHRyaXZpYWwuCi0gKi8KLSNkZWZpbmUgcGFnZXNfdG9fbWIoeCkJCSgoeCkgPj4gKDIwIC0gUEFHRV9TSElGVCkpCi0KLS8qCiAgKiBDb252ZXJzaW9uIGZ1bmN0aW9uczogY29udmVydCBhIHBhZ2UgYW5kIHByb3RlY3Rpb24gdG8gYSBwYWdlIGVudHJ5LAogICogYW5kIGEgcGFnZSBlbnRyeSBhbmQgcGFnZSBkaXJlY3RvcnkgdG8gdGhlIHBhZ2UgdGhleSByZWZlciB0by4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCBiNDE1YzBlLi43MzE5MjYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtNTQsNyArNTQsNiBAQAogI2RlZmluZSBQU1JfQ19CSVQJMHgyMDAwMDAwMAogI2RlZmluZSBQU1JfWl9CSVQJMHg0MDAwMDAwMAogI2RlZmluZSBQU1JfTl9CSVQJMHg4MDAwMDAwMAotI2RlZmluZSBQQ01BU0sJCTAKIAogLyoKICAqIEdyb3VwcyBvZiBQU1IgYml0cwpAQCAtMTM5LDExICsxMzgsNyBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIHBjX3BvaW50ZXIodikgXAotCSgodikgJiB+UENNQVNLKQotCi0jZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgXAotCShwY19wb2ludGVyKChyZWdzKS0+QVJNX3BjKSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkocmVncyktPkFSTV9wYwogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCA3YmJmMTA1Li5hNjU0MTNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTIwOSw2ICsyMDksMTcgQEAKIAlzdHJ1Y3QgbWVtYmFuayBiYW5rW05SX0JBTktTXTsKIH07CiAKKyNkZWZpbmUgZm9yX2VhY2hfbm9kZWJhbmsoaXRlcixtaSxubykJCQlcCisJZm9yIChpdGVyID0gMDsgaXRlciA8IG1pLT5ucl9iYW5rczsgaXRlcisrKQlcCisJCWlmIChtaS0+YmFua1tpdGVyXS5ub2RlID09IG5vKQorCisjZGVmaW5lIGJhbmtfcGZuX3N0YXJ0KGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCkKKyNkZWZpbmUgYmFua19wZm5fZW5kKGJhbmspCV9fcGh5c190b19wZm4oKGJhbmspLT5zdGFydCArIChiYW5rKS0+c2l6ZSkKKyNkZWZpbmUgYmFua19wZm5fc2l6ZShiYW5rKQkoKGJhbmspLT5zaXplID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIGJhbmtfcGh5c19zdGFydChiYW5rKQkoYmFuayktPnN0YXJ0CisjZGVmaW5lIGJhbmtfcGh5c19lbmQoYmFuaykJKChiYW5rKS0+c3RhcnQgKyAoYmFuayktPnNpemUpCisjZGVmaW5lIGJhbmtfcGh5c19zaXplKGJhbmspCShiYW5rKS0+c2l6ZQorCiAvKgogICogRWFybHkgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKaW5kZXggMjc3MTU4MS4uMDAwOTg2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKQEAgLTMsOCArMywyMiBAQAogCiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCi0jZGVmaW5lIE1BWF9QSFlTQUREUl9CSVRTCTMyCi0jZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJMzIKLSNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJTk9ERV9NRU1fU0laRV9CSVRTCisvKgorICogVHdvIGRlZmluaXRpb25zIGFyZSByZXF1aXJlZCBmb3Igc3BhcnNlbWVtOgorICoKKyAqIE1BWF9QSFlTTUVNX0JJVFM6IFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgYWRkcmVzcyBiaXRzIHJlcXVpcmVkCisgKiAgIHRvIGFkZHJlc3MgdGhlIGxhc3QgYnl0ZSBvZiBtZW1vcnkuCisgKgorICogU0VDVElPTl9TSVpFX0JJVFM6IFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgYWRkcmVzcyBiaXRzIHRvIGNvdmVyCisgKiAgIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYSBzZWN0aW9uLgorICoKKyAqIEVnLCBpZiB5b3UgaGF2ZSAyIGJhbmtzIG9mIHVwIHRvIDY0TUIgYXQgMHg4MDAwMDAwMCwgMHg4NDAwMDAwMCwKKyAqIHRoZW4gTUFYX1BIWVNNRU1fQklUUyBpcyAzMiwgU0VDVElPTl9TSVpFX0JJVFMgaXMgMjYuCisgKgorICogRGVmaW5lIHRoZXNlIGluIHlvdXIgbWFjaC9tZW1vcnkuaC4KKyAqLworI2lmICFkZWZpbmVkKFNFQ1RJT05fU0laRV9CSVRTKSB8fCAhZGVmaW5lZChNQVhfUEhZU01FTV9CSVRTKQorI2Vycm9yIFNwYXJzZW1lbSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0KKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N0YXRmcy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3RhdGZzLmgKaW5kZXggYTAyZTZhOC4uMDc5NDQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3RhdGZzLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3RhdGZzLmgKQEAgLTEsNDIgKzEsMTIgQEAKICNpZm5kZWYgX0FTTUFSTV9TVEFURlNfSAogI2RlZmluZSBfQVNNQVJNX1NUQVRGU19ICiAKLSNpZm5kZWYgX19LRVJORUxfU1RSSUNUX05BTUVTCi0jIGluY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci10eXBlZGVmIF9fa2VybmVsX2ZzaWRfdAlmc2lkX3Q7Ci0jZW5kaWYKLQotc3RydWN0IHN0YXRmcyB7Ci0JX191MzIgZl90eXBlOwotCV9fdTMyIGZfYnNpemU7Ci0JX191MzIgZl9ibG9ja3M7Ci0JX191MzIgZl9iZnJlZTsKLQlfX3UzMiBmX2JhdmFpbDsKLQlfX3UzMiBmX2ZpbGVzOwotCV9fdTMyIGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlfX3UzMiBmX25hbWVsZW47Ci0JX191MzIgZl9mcnNpemU7Ci0JX191MzIgZl9zcGFyZVs1XTsKLX07Ci0KIC8qCiAgKiBXaXRoIEVBQkkgdGhlcmUgaXMgNCBieXRlcyBvZiBwYWRkaW5nIGFkZGVkIHRvIHRoaXMgc3RydWN0dXJlLgogICogTGV0J3MgcGFjayBpdCBzbyB0aGUgcGFkZGluZyBnb2VzIGF3YXkgdG8gc2ltcGxpZnkgZHVhbCBBQkkgc3VwcG9ydC4KICAqIE5vdGUgdGhhdCB1c2VyIHNwYWNlIGRvZXMgTk9UIGhhdmUgdG8gcGFjayB0aGlzIHN0cnVjdHVyZS4KICAqLwotc3RydWN0IHN0YXRmczY0IHsKLQlfX3UzMiBmX3R5cGU7Ci0JX191MzIgZl9ic2l6ZTsKLQlfX3U2NCBmX2Jsb2NrczsKLQlfX3U2NCBmX2JmcmVlOwotCV9fdTY0IGZfYmF2YWlsOwotCV9fdTY0IGZfZmlsZXM7Ci0JX191NjQgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCV9fdTMyIGZfbmFtZWxlbjsKLQlfX3UzMiBmX2Zyc2l6ZTsKLQlfX3UzMiBmX3NwYXJlWzVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoNCkpKTsKKyNkZWZpbmUgQVJDSF9QQUNLX1NUQVRGUzY0IF9fYXR0cmlidXRlX18oKHBhY2tlZCxhbGlnbmVkKDQpKSkKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IDUxNGFmNzkuLjdhYWQ3ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC00MywxMSArNDMsNiBAQAogI2RlZmluZSBDUl9YUAkoMSA8PCAyMykJLyogRXh0ZW5kZWQgcGFnZSB0YWJsZXMJCQkqLwogI2RlZmluZSBDUl9WRQkoMSA8PCAyNCkJLyogVmVjdG9yZWQgaW50ZXJydXB0cwkJCSovCiAKLSNkZWZpbmUgQ1BVSURfSUQJMAotI2RlZmluZSBDUFVJRF9DQUNIRVRZUEUJMQotI2RlZmluZSBDUFVJRF9UQ00JMgotI2RlZmluZSBDUFVJRF9UTEJUWVBFCTMKLQogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhlIGNvbXBpbGVyIGRpZCBhY3R1YWxseSBhbGxvY2F0ZSB0aGUgcmVnaXN0ZXIgd2UKICAqIGFza2VkIGl0IGZvciBzb21lIGlubGluZSBhc3NlbWJseSBzZXF1ZW5jZXMuICBBcHBhcmVudGx5IHdlIGNhbid0IHRydXN0CkBAIC02MSwzNiArNTYsOCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogCi0jaWZkZWYgQ09ORklHX0NQVV9DUDE1Ci0jZGVmaW5lIHJlYWRfY3B1aWQocmVnKQkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9fdmFsOwkJCQkJXAotCQlhc20oIm1yYwlwMTUsIDAsICUwLCBjMCwgYzAsICIgX19zdHJpbmdpZnkocmVnKQlcCi0JCSAgICA6ICI9ciIgKF9fdmFsKQkJCQkJXAotCQkgICAgOgkJCQkJCQlcCi0JCSAgICA6ICJjYyIpOwkJCQkJCVwKLQkJX192YWw7CQkJCQkJCVwKLQl9KQotI2Vsc2UKLWV4dGVybiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwotI2RlZmluZSByZWFkX2NwdWlkKHJlZykgKHByb2Nlc3Nvcl9pZCkKLSNlbmRpZgotCi0vKgotICogVGhlIENQVSBJRCBuZXZlciBjaGFuZ2VzIGF0IHJ1biB0aW1lLCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHRlbGwgdGhlCi0gKiBjb21waWxlciB0aGF0IGl0J3MgY29uc3RhbnQuICBVc2UgdGhpcyBmdW5jdGlvbiB0byByZWFkIHRoZSBDUFUgSUQKLSAqIHJhdGhlciB0aGFuIGRpcmVjdGx5IHJlYWRpbmcgcHJvY2Vzc29yX2lkIG9yIHJlYWRfY3B1aWQoKSBkaXJlY3RseS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9jcHVpZF9pZCh2b2lkKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2NwdWlkX2lkKHZvaWQpCi17Ci0JcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfSUQpOwotfQotCiAjZGVmaW5lIF9fZXhjZXB0aW9uCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5leGNlcHRpb24udGV4dCIpKSkKIAogc3RydWN0IHRocmVhZF9pbmZvOwpAQCAtMTMxLDMxICs5OCw2IEBACiB2b2lkIGFybV9tYWNoaW5lX3Jlc3RhcnQoY2hhciBtb2RlKTsKIGV4dGVybiB2b2lkICgqYXJtX3BtX3Jlc3RhcnQpKGNoYXIgc3RyKTsKIAotLyoKLSAqIEludGVsJ3MgWFNjYWxlMyBjb3JlIHN1cHBvcnRzIHNvbWUgdjYgZmVhdHVyZXMgKHN1cGVyc2VjdGlvbnMsIEwyKQotICogYnV0IGFkdmVydGlzZXMgaXRzZWxmIGFzIHY1IGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHY2IElTQS4gIEZvcgotICogdGhpcyByZWFzb24sIHdlIG5lZWQgYSB3YXkgdG8gZXhwbGljaXRseSB0ZXN0IGZvciB0aGlzIHR5cGUgb2YgQ1BVLgotICovCi0jaWZuZGVmIENPTkZJR19DUFVfWFNDMwotI2RlZmluZSBjcHVfaXNfeHNjMygpCTAKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjcHVfaXNfeHNjMyh2b2lkKQotewotCWV4dGVybiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwotCi0JaWYgKChwcm9jZXNzb3JfaWQgJiAweGZmZmZlMDAwKSA9PSAweDY5MDU2MDAwKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1hTQ0FMRSkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9YU0MzKQotI2RlZmluZQljcHVfaXNfeHNjYWxlKCkJMAotI2Vsc2UKLSNkZWZpbmUJY3B1X2lzX3hzY2FsZSgpCTEKLSNlbmRpZgotCiAjZGVmaW5lIFVEQkdfVU5ERUZJTkVECSgxIDw8IDApCiAjZGVmaW5lIFVEQkdfU1lTQ0FMTAkoMSA8PCAxKQogI2RlZmluZSBVREJHX0JBREFCT1JUCSgxIDw8IDIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBlNTZmYTQ4Li42OGI5ZWM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTk4LDcgKzk4LDcgQEAKIH0KIAogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQlcCi0JKCh1bnNpZ25lZCBsb25nKShwY19wb2ludGVyKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1X2NvbnRleHQucGMpKSkKKwkoKHVuc2lnbmVkIGxvbmcpKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+Y3B1X2NvbnRleHQucGMpKQogI2RlZmluZSB0aHJlYWRfc2F2ZWRfZnAodHNrKQlcCiAJKCh1bnNpZ25lZCBsb25nKSh0YXNrX3RocmVhZF9pbmZvKHRzayktPmNwdV9jb250ZXh0LmZwKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGQwZjUxZmYuLmU5OGVjNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTIyNSw3ICsyMjUsNyBAQAogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2J5dGUoeCxhZGRyLGVycikJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCSIxOglsZHJidAklMSxbJTJdLCMwXG4iCQkJCVwKKwkiMToJbGRyYnQJJTEsWyUyXVxuIgkJCQlcCiAJIjI6XG4iCQkJCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCiAJIgkuYWxpZ24JMlxuIgkJCQkJXApAQCAtMjYxLDcgKzI2MSw3IEBACiAKICNkZWZpbmUgX19nZXRfdXNlcl9hc21fd29yZCh4LGFkZHIsZXJyKQkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JIjE6CWxkcnQJJTEsWyUyXSwjMFxuIgkJCQlcCisJIjE6CWxkcnQJJTEsWyUyXVxuIgkJCQlcCiAJIjI6XG4iCQkJCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCiAJIgkuYWxpZ24JMlxuIgkJCQkJXApAQCAtMzA2LDcgKzMwNiw3IEBACiAKICNkZWZpbmUgX19wdXRfdXNlcl9hc21fYnl0ZSh4LF9fcHVfYWRkcixlcnIpCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCSIxOglzdHJidAklMSxbJTJdLCMwXG4iCQkJCVwKKwkiMToJc3RyYnQJJTEsWyUyXVxuIgkJCQlcCiAJIjI6XG4iCQkJCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCiAJIgkuYWxpZ24JMlxuIgkJCQkJXApAQCAtMzM5LDcgKzMzOSw3IEBACiAKICNkZWZpbmUgX19wdXRfdXNlcl9hc21fd29yZCh4LF9fcHVfYWRkcixlcnIpCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCSIxOglzdHJ0CSUxLFslMl0sIzBcbiIJCQkJXAorCSIxOglzdHJ0CSUxLFslMl1cbiIJCQkJXAogCSIyOlxuIgkJCQkJCQlcCiAJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAogCSIJLmFsaWduCTJcbiIJCQkJCVwKQEAgLTM2NSw3ICszNjUsNyBAQAogI2RlZmluZSBfX3B1dF91c2VyX2FzbV9kd29yZCh4LF9fcHVfYWRkcixlcnIpCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAogCSIxOglzdHJ0CSIgX19yZWdfb3BlcjEgIiwgWyUxXSwgIzRcbiIJCVwKLQkiMjoJc3RydAkiIF9fcmVnX29wZXIwICIsIFslMV0sICMwXG4iCQlcCisJIjI6CXN0cnQJIiBfX3JlZ19vcGVyMCAiLCBbJTFdXG4iCQlcCiAJIjM6XG4iCQkJCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCiAJIgkuYWxpZ24JMlxuIgkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmdhLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS92Z2EuaAppbmRleCA2YTNjZDJhMi4uMjUwYTRkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmdhLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmdhLmgKQEAgLTEsOCArMSw4IEBACiAjaWZuZGVmIEFTTUFSTV9WR0FfSAogI2RlZmluZSBBU01BUk1fVkdBX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykJKFBDSU1FTV9CQVNFICsgKHgpKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMWQyOTZmYy4uNDMwNTM0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogCiAjIE9iamVjdCBmaWxlIGxpc3RzLgogCi1vYmoteQkJOj0gY29tcGF0Lm8gZW50cnktYXJtdi5vIGVudHJ5LWNvbW1vbi5vIGlycS5vIFwKK29iai15CQk6PSBjb21wYXQubyBlbGYubyBlbnRyeS1hcm12Lm8gZW50cnktY29tbW9uLm8gaXJxLm8gXAogCQkgICBwcm9jZXNzLm8gcHRyYWNlLm8gc2V0dXAubyBzaWduYWwubyBcCiAJCSAgIHN5c19hcm0ubyBzdGFja3RyYWNlLm8gdGltZS5vIHRyYXBzLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwppbmRleCBjYzdiMjQ2Li4yMzU3YjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYwpAQCAtMTMsMTEgKzEzLDExIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCmluZGV4IGU1NzQ3NTQuLjE3YTU5YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY3J1bmNoLmMgYi9hcmNoL2FybS9rZXJuZWwvY3J1bmNoLmMKaW5kZXggM2I2YTFjMi4uOTk5OTVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2NydW5jaC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jcnVuY2guYwpAQCAtMTUsOSArMTUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9lcDkzeHgtcmVncy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0cnVjdCBjcnVuY2hfc3RhdGUgKmNydW5jaF9vd25lcjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RlYnVnLlMgYi9hcmNoL2FybS9rZXJuZWwvZGVidWcuUwppbmRleCA5NTUwZmYwLi5mNTNjNTgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGVidWcuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZGVidWcuUwpAQCAtODksMTAgKzg5LDEyIEBACiBFTlRSWShwcmludGhleDgpCiAJCW1vdglyMSwgIzgKIAkJYglwcmludGhleAorRU5EUFJPQyhwcmludGhleDgpCiAKIEVOVFJZKHByaW50aGV4NCkKIAkJbW92CXIxLCAjNAogCQliCXByaW50aGV4CitFTkRQUk9DKHByaW50aGV4NCkKIAogRU5UUlkocHJpbnRoZXgyKQogCQltb3YJcjEsICMyCkBAIC0xMTAsNiArMTEyLDcgQEAKIAkJYm5lCTFiCiAJCW1vdglyMCwgcjIKIAkJYglwcmludGFzY2lpCitFTkRQUk9DKHByaW50aGV4MikKIAogCQkubHRvcmcKIApAQCAtMTI3LDExICsxMzAsMTMgQEAKIAkJdGVxbmUJcjEsICMwCiAJCWJuZQkxYgogCQltb3YJcGMsIGxyCitFTkRQUk9DKHByaW50YXNjaWkpCiAKIEVOVFJZKHByaW50Y2gpCiAJCWFkZHJ1YXJ0IHIzCiAJCW1vdglyMSwgcjAKIAkJbW92CXIwLCAjMAogCQliCTFiCitFTkRQUk9DKHByaW50Y2gpCiAKIGhleGJ1ZjoJCS5zcGFjZSAxNgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEtaXNhLmMKaW5kZXggMmYwODBhMy4uNGEzYTUwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RtYS1pc2EuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZG1hLWlzYS5jCkBAIC0xOSwxMCArMTksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KIAogI2RlZmluZSBJU0FfRE1BX01PREVfUkVBRAkweDQ0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZG1hLmMgYi9hcmNoL2FybS9rZXJuZWwvZG1hLmMKaW5kZXggYmE5OWEyMC4uZDAwNjA4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RtYS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kbWEuYwpAQCAtMjYsMjMgKzI2LDYgQEAKIHN0YXRpYyBkbWFfdCBkbWFfY2hhbltNQVhfRE1BX0NIQU5ORUxTXTsKIAogLyoKLSAqIEdldCBkbWEgbGlzdCBmb3IgL3Byb2MvZG1hCi0gKi8KLWludCBnZXRfZG1hX2xpc3QoY2hhciAqYnVmKQotewotCWRtYV90ICpkbWE7Ci0JY2hhciAqcCA9IGJ1ZjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDAsIGRtYSA9IGRtYV9jaGFuOyBpIDwgTUFYX0RNQV9DSEFOTkVMUzsgaSsrLCBkbWErKykKLQkJaWYgKGRtYS0+bG9jaykKLQkJCXAgKz0gc3ByaW50ZihwLCAiJTJkOiAlMTRzICVzXG4iLCBpLAotCQkJCSAgICAgZG1hLT5kX29wcy0+dHlwZSwgZG1hLT5kZXZpY2VfaWQpOwotCi0JcmV0dXJuIHAgLSBidWY7Ci19Ci0KLS8qCiAgKiBSZXF1ZXN0IERNQSBjaGFubmVsCiAgKgogICogT24gY2VydGFpbiBwbGF0Zm9ybXMsIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0IGFzIHdlbGwuLi4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggN2E1MDU3NS4uNjBjMDc5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTU4Nyw4ICs1ODcsNyBAQAogCQkJcGVuZGluZyA9IGVjYXJkX2RlZmF1bHRfb3BzLmlycXBlbmRpbmcoZWMpOwogCiAJCWlmIChwZW5kaW5nKSB7Ci0JCQlzdHJ1Y3QgaXJxX2Rlc2MgKmQgPSBpcnFfZGVzYyArIGVjLT5pcnE7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoZWMtPmlycSwgZCk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZWMtPmlycSk7CiAJCQljYWxsZWQgKys7CiAJCX0KIAl9CkBAIC02MjIsNyArNjIxLDYgQEAKIAkJZWNhcmRfdCAqZWMgPSBzbG90X3RvX2VjYXJkKHNsb3QpOwogCiAJCWlmIChlYy0+Y2xhaW1lZCkgewotCQkJc3RydWN0IGlycV9kZXNjICpkID0gaXJxX2Rlc2MgKyBlYy0+aXJxOwogCQkJLyoKIAkJCSAqIHRoaXMgdWdseSBjb2RlIGlzIHNvIHRoYXQgd2UgY2FuIG9wZXJhdGUgYQogCQkJICogcHJpb3JpdG9yaXNpbmcgc3lzdGVtOgpAQCAtNjM1LDcgKzYzMyw3IEBACiAJCQkgKiBTZXJpYWwgY2FyZHMgc2hvdWxkIGdvIGluIDAvMSwgZXRoZXJuZXQvc2NzaSBpbiAyLzMKIAkJCSAqIG90aGVyd2lzZSB5b3Ugd2lsbCBsb3NlIHNlcmlhbCBkYXRhIGF0IGhpZ2ggc3BlZWRzIQogCQkJICovCi0JCQlkZXNjX2hhbmRsZV9pcnEoZWMtPmlycSwgZCk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZWMtPmlycSk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYXJkJWQ6IGludGVycnVwdCBmcm9tIHVuY2xhaW1lZCAiCiAJCQkgICAgICAgImNhcmQ/Pz9cbiIsIHNsb3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VsZi5jIGIvYXJjaC9hcm0va2VybmVsL2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2YzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwvZWxmLmMKQEAgLTAsMCArMSw3OSBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisKK2ludCBlbGZfY2hlY2tfYXJjaChjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICp4KQoreworCXVuc2lnbmVkIGludCBlZmxhZ3M7CisKKwkvKiBNYWtlIHN1cmUgaXQncyBhbiBBUk0gZXhlY3V0YWJsZSAqLworCWlmICh4LT5lX21hY2hpbmUgIT0gRU1fQVJNKQorCQlyZXR1cm4gMDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgZW50cnkgYWRkcmVzcyBpcyByZWFzb25hYmxlICovCisJaWYgKHgtPmVfZW50cnkgJiAxKSB7CisJCWlmICghKGVsZl9od2NhcCAmIEhXQ0FQX1RIVU1CKSkKKwkJCXJldHVybiAwOworCX0gZWxzZSBpZiAoeC0+ZV9lbnRyeSAmIDMpCisJCXJldHVybiAwOworCisJZWZsYWdzID0geC0+ZV9mbGFnczsKKwlpZiAoKGVmbGFncyAmIEVGX0FSTV9FQUJJX01BU0spID09IEVGX0FSTV9FQUJJX1VOS05PV04pIHsKKwkJLyogQVBDUzI2IGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUgQ1BVIHN1cHBvcnRzIGl0ICovCisJCWlmICgoZWZsYWdzICYgRUZfQVJNX0FQQ1NfMjYpICYmICEoZWxmX2h3Y2FwICYgSFdDQVBfMjZCSVQpKQorCQkJcmV0dXJuIDA7CisKKwkJLyogVkZQIHJlcXVpcmVzIHRoZSBzdXBwb3J0aW5nIGNvZGUgKi8KKwkJaWYgKChlZmxhZ3MgJiBFRl9BUk1fVkZQX0ZMT0FUKSAmJiAhKGVsZl9od2NhcCAmIEhXQ0FQX1ZGUCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGVsZl9jaGVja19hcmNoKTsKKwordm9pZCBlbGZfc2V0X3BlcnNvbmFsaXR5KGNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKngpCit7CisJdW5zaWduZWQgaW50IGVmbGFncyA9IHgtPmVfZmxhZ3M7CisJdW5zaWduZWQgaW50IHBlcnNvbmFsaXR5ID0gUEVSX0xJTlVYXzMyQklUOworCisJLyoKKwkgKiBBUENTLTI2IGlzIG9ubHkgdmFsaWQgZm9yIE9BQkkgZXhlY3V0YWJsZXMKKwkgKi8KKwlpZiAoKGVmbGFncyAmIEVGX0FSTV9FQUJJX01BU0spID09IEVGX0FSTV9FQUJJX1VOS05PV04pIHsKKwkJaWYgKGVmbGFncyAmIEVGX0FSTV9BUENTXzI2KQorCQkJcGVyc29uYWxpdHkgPSBQRVJfTElOVVg7CisJfQorCisJc2V0X3BlcnNvbmFsaXR5KHBlcnNvbmFsaXR5KTsKKworCS8qCisJICogU2luY2UgdGhlIEZQQSBjb3Byb2Nlc3NvciB1c2VzIENQMSBhbmQgQ1AyLCBhbmQgaVdNTVh0IHVzZXMgQ1AwCisJICogYW5kIENQMSwgd2Ugb25seSBlbmFibGUgYWNjZXNzIHRvIHRoZSBpV01NWHQgY29wcm9jZXNzb3IgaWYgdGhlCisJICogYmluYXJ5IGlzIEVBQkkgb3Igc29mdGZsb2F0IChhbmQgdGh1cywgZ3VhcmFudGVlZCBub3QgdG8gdXNlCisJICogRlBBIGluc3RydWN0aW9ucy4pCisJICovCisJaWYgKGVsZl9od2NhcCAmIEhXQ0FQX0lXTU1YVCAmJgorCSAgICBlZmxhZ3MgJiAoRUZfQVJNX0VBQklfTUFTSyB8IEVGX0FSTV9TT0ZUX0ZMT0FUKSkgeworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7CisJfSBlbHNlIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChlbGZfc2V0X3BlcnNvbmFsaXR5KTsKKworLyoKKyAqIFNldCBSRUFEX0lNUExJRVNfRVhFQyBpZjoKKyAqICAtIHRoZSBiaW5hcnkgcmVxdWlyZXMgYW4gZXhlY3V0YWJsZSBzdGFjaworICogIC0gd2UncmUgcnVubmluZyBvbiBhIENQVSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgTlguCisgKi8KK2ludCBhcm1fZWxmX3JlYWRfaW1wbGllc19leGVjKGNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKngsIGludCBleGVjdXRhYmxlX3N0YWNrKQoreworCWlmIChleGVjdXRhYmxlX3N0YWNrICE9IEVYU1RBQ0tfRU5BQkxFX1gpCisJCXJldHVybiAxOworCWlmIChjcHVfYXJjaGl0ZWN0dXJlKCkgPD0gQ1BVX0FSQ0hfQVJNdjYpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhcm1fZWxmX3JlYWRfaW1wbGllc19leGVjKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCmluZGV4IDYxN2U1MDkuLjc3YjA0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtNzYsMTQgKzc2LDE3IEBACiBfX3BhYnRfaW52YWxpZDoKIAlpbnZfZW50cnkgQkFEX1BSRUZFVENICiAJYgljb21tb25faW52YWxpZAorRU5EUFJPQyhfX3BhYnRfaW52YWxpZCkKIAogX19kYWJ0X2ludmFsaWQ6CiAJaW52X2VudHJ5IEJBRF9EQVRBCiAJYgljb21tb25faW52YWxpZAorRU5EUFJPQyhfX2RhYnRfaW52YWxpZCkKIAogX19pcnFfaW52YWxpZDoKIAlpbnZfZW50cnkgQkFEX0lSUQogCWIJY29tbW9uX2ludmFsaWQKK0VORFBST0MoX19pcnFfaW52YWxpZCkKIAogX191bmRfaW52YWxpZDoKIAlpbnZfZW50cnkgQkFEX1VOREVGSU5TVFIKQEAgLTEwNyw2ICsxMTAsNyBAQAogCiAJbW92CXIwLCBzcAogCWIJYmFkX21vZGUKK0VORFBST0MoX191bmRfaW52YWxpZCkKIAogLyoKICAqIFNWQyBtb2RlIGhhbmRsZXJzCkBAIC0xOTIsNiArMTk2LDcgQEAKIAlsZHIJcjAsIFtzcCwgI1NfUFNSXQogCW1zcglzcHNyX2N4c2YsIHIwCiAJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIGxvYWQgcjAgLSBwYywgY3BzcgorRU5EUFJPQyhfX2RhYnRfc3ZjKQogCiAJLmFsaWduCTUKIF9faXJxX3N2YzoKQEAgLTIyMyw2ICsyMjgsNyBAQAogCWJsZXEJdHJhY2VfaGFyZGlycXNfb24KICNlbmRpZgogCWxkbWlhCXNwLCB7cjAgLSBwY31eCQkJQCBsb2FkIHIwIC0gcGMsIGNwc3IKK0VORFBST0MoX19pcnFfc3ZjKQogCiAJLmx0b3JnCiAKQEAgLTI3Miw2ICsyNzgsNyBAQAogCWxkcglsciwgW3NwLCAjU19QU1JdCQlAIEdldCBTVkMgY3BzcgogCW1zcglzcHNyX2N4c2YsIGxyCiAJbGRtaWEJc3AsIHtyMCAtIHBjfV4JCQlAIFJlc3RvcmUgU1ZDIHJlZ2lzdGVycworRU5EUFJPQyhfX3VuZF9zdmMpCiAKIAkuYWxpZ24JNQogX19wYWJ0X3N2YzoKQEAgLTMxMyw2ICszMjAsNyBAQAogCWxkcglyMCwgW3NwLCAjU19QU1JdCiAJbXNyCXNwc3JfY3hzZiwgcjAKIAlsZG1pYQlzcCwge3IwIC0gcGN9XgkJCUAgbG9hZCByMCAtIHBjLCBjcHNyCitFTkRQUk9DKF9fcGFidF9zdmMpCiAKIAkuYWxpZ24JNQogLkxDY3JhbGlnbjoKQEAgLTQxMiw2ICs0MjAsNyBAQAogCW1vdglyMiwgc3AKIAlhZHIJbHIsIHJldF9mcm9tX2V4Y2VwdGlvbgogCWIJZG9fRGF0YUFib3J0CitFTkRQUk9DKF9fZGFidF91c3IpCiAKIAkuYWxpZ24JNQogX19pcnFfdXNyOgpAQCAtNDQxLDYgKzQ1MCw3IEBACiAKIAltb3YJd2h5LCAjMAogCWIJcmV0X3RvX3VzZXIKK0VORFBST0MoX19pcnFfdXNyKQogCiAJLmx0b3JnCiAKQEAgLTQ3NCw2ICs0ODQsNyBAQAogI2Vsc2UKIAliCV9fdW5kX3Vzcl91bmtub3duCiAjZW5kaWYKK0VORFBST0MoX191bmRfdXNyKQogCiAJQAogCUAgZmFsbHRocm91Z2ggdG8gY2FsbF9mcGUKQEAgLTY0Miw2ICs2NTMsNyBAQAogCW1vdglyMCwgc3AKIAlhZHIJbHIsIHJldF9mcm9tX2V4Y2VwdGlvbgogCWIJZG9fdW5kZWZpbnN0cgorRU5EUFJPQyhfX3VuZF91c3JfdW5rbm93bikKIAogCS5hbGlnbgk1CiBfX3BhYnRfdXNyOgpAQCAtNjY2LDYgKzY3OCw4IEBACiAJZ2V0X3RocmVhZF9pbmZvIHRzawogCW1vdgl3aHksICMwCiAJYglyZXRfdG9fdXNlcgorRU5EUFJPQyhfX3BhYnRfdXNyKQorRU5EUFJPQyhyZXRfZnJvbV9leGNlcHRpb24pCiAKIC8qCiAgKiBSZWdpc3RlciBzd2l0Y2ggZm9yIEFSTXYzIGFuZCBBUk12NCBwcm9jZXNzb3JzCkBAIC03MDIsNiArNzE2LDcgQEAKIAlibAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbgogCW1vdglyMCwgcjUKIAlsZG1pYQlyNCwge3I0IC0gc2wsIGZwLCBzcCwgcGN9CUAgTG9hZCBhbGwgcmVncyBzYXZlZCBwcmV2aW91c2x5CitFTkRQUk9DKF9fc3dpdGNoX3RvKQogCiAJX19JTklUCiAKQEAgLTEwMjksNiArMTA0NCw3IEBACiAJbW92CXIwLCBzcAogCWxkcglsciwgW3BjLCBsciwgbHNsICMyXQogCW1vdnMJcGMsIGxyCQkJQCBicmFuY2ggdG8gaGFuZGxlciBpbiBTVkMgbW9kZQorRU5EUFJPQyh2ZWN0b3JfXG5hbWUpCiAJLmVuZG0KIAogCS5nbG9ibAlfX3N0dWJzX3N0YXJ0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggMDYwZDdlMi4uM2FhMTRkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtNzcsNiArNzcsNyBAQAogCW1vdglyMCwgcjAKIAlhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFIC0gU19QQwogCW1vdnMJcGMsIGxyCQkJCUAgcmV0dXJuICYgbW92ZSBzcHNyX3N2YyBpbnRvIGNwc3IKK0VORFBST0MocmV0X3RvX3VzZXIpCiAKIC8qCiAgKiBUaGlzIGlzIGhvdyB3ZSByZXR1cm4gZnJvbSBhIGZvcmsuCkBAIC05Miw3ICs5Myw3IEBACiAJbW92CXIwLCAjMQkJCQlAIHRyYWNlIGV4aXQgW0lQID0gMV0KIAlibAlzeXNjYWxsX3RyYWNlCiAJYglyZXRfc2xvd19zeXNjYWxsCi0JCitFTkRQUk9DKHJldF9mcm9tX2ZvcmspCiAKIAkuZXF1IE5SX3N5c2NhbGxzLDAKICNkZWZpbmUgQ0FMTCh4KSAuZXF1IE5SX3N5c2NhbGxzLE5SX3N5c2NhbGxzKzEKQEAgLTI2OSw2ICsyNzAsNyBAQAogCWVvcglyMCwgc2NubywgI19fTlJfU1lTQ0FMTF9CQVNFCUAgcHV0IE9TIG51bWJlciBiYWNrCiAJYmNzCWFybV9zeXNjYWxsCQogCWIJc3lzX25pX3N5c2NhbGwJCQlAIG5vdCBwcml2YXRlIGZ1bmMKK0VORFBST0ModmVjdG9yX3N3aSkKIAogCS8qCiAJICogVGhpcyBpcyB0aGUgcmVhbGx5IHNsb3cgcGF0aC4gIFdlJ3JlIGdvaW5nIHRvIGJlIGRvaW5nCkBAIC0zMjYsNyArMzI4LDYgQEAKICAqLwogQCByMCA9IHN5c2NhbGwgbnVtYmVyCiBAIHI4ID0gc3lzY2FsbCB0YWJsZQotCQkudHlwZQlzeXNfc3lzY2FsbCwgI2Z1bmN0aW9uCiBzeXNfc3lzY2FsbDoKIAkJYmljCXNjbm8sIHIwLCAjX19OUl9PQUJJX1NZU0NBTExfQkFTRQogCQljbXAJc2NubywgI19fTlJfc3lzY2FsbCAtIF9fTlJfU1lTQ0FMTF9CQVNFCkBAIC0zMzgsNTMgKzMzOSw2NSBAQAogCQltb3ZsbwlyMywgcjQKIAkJbGRybG8JcGMsIFt0YmwsIHNjbm8sIGxzbCAjMl0KIAkJYglzeXNfbmlfc3lzY2FsbAorRU5EUFJPQyhzeXNfc3lzY2FsbCkKIAogc3lzX2Zvcmtfd3JhcHBlcjoKIAkJYWRkCXIwLCBzcCwgI1NfT0ZGCiAJCWIJc3lzX2ZvcmsKK0VORFBST0Moc3lzX2Zvcmtfd3JhcHBlcikKIAogc3lzX3Zmb3JrX3dyYXBwZXI6CiAJCWFkZAlyMCwgc3AsICNTX09GRgogCQliCXN5c192Zm9yaworRU5EUFJPQyhzeXNfdmZvcmtfd3JhcHBlcikKIAogc3lzX2V4ZWN2ZV93cmFwcGVyOgogCQlhZGQJcjMsIHNwLCAjU19PRkYKIAkJYglzeXNfZXhlY3ZlCitFTkRQUk9DKHN5c19leGVjdmVfd3JhcHBlcikKIAogc3lzX2Nsb25lX3dyYXBwZXI6CiAJCWFkZAlpcCwgc3AsICNTX09GRgogCQlzdHIJaXAsIFtzcCwgIzRdCiAJCWIJc3lzX2Nsb25lCitFTkRQUk9DKHN5c19jbG9uZV93cmFwcGVyKQogCiBzeXNfc2lnc3VzcGVuZF93cmFwcGVyOgogCQlhZGQJcjMsIHNwLCAjU19PRkYKIAkJYglzeXNfc2lnc3VzcGVuZAorRU5EUFJPQyhzeXNfc2lnc3VzcGVuZF93cmFwcGVyKQogCiBzeXNfcnRfc2lnc3VzcGVuZF93cmFwcGVyOgogCQlhZGQJcjIsIHNwLCAjU19PRkYKIAkJYglzeXNfcnRfc2lnc3VzcGVuZAorRU5EUFJPQyhzeXNfcnRfc2lnc3VzcGVuZF93cmFwcGVyKQogCiBzeXNfc2lncmV0dXJuX3dyYXBwZXI6CiAJCWFkZAlyMCwgc3AsICNTX09GRgogCQliCXN5c19zaWdyZXR1cm4KK0VORFBST0Moc3lzX3NpZ3JldHVybl93cmFwcGVyKQogCiBzeXNfcnRfc2lncmV0dXJuX3dyYXBwZXI6CiAJCWFkZAlyMCwgc3AsICNTX09GRgogCQliCXN5c19ydF9zaWdyZXR1cm4KK0VORFBST0Moc3lzX3J0X3NpZ3JldHVybl93cmFwcGVyKQogCiBzeXNfc2lnYWx0c3RhY2tfd3JhcHBlcjoKIAkJbGRyCXIyLCBbc3AsICNTX09GRiArIFNfU1BdCiAJCWIJZG9fc2lnYWx0c3RhY2sKK0VORFBST0Moc3lzX3NpZ2FsdHN0YWNrX3dyYXBwZXIpCiAKIHN5c19zdGF0ZnM2NF93cmFwcGVyOgogCQl0ZXEJcjEsICM4OAogCQltb3ZlcQlyMSwgIzg0CiAJCWIJc3lzX3N0YXRmczY0CitFTkRQUk9DKHN5c19zdGF0ZnM2NF93cmFwcGVyKQogCiBzeXNfZnN0YXRmczY0X3dyYXBwZXI6CiAJCXRlcQlyMSwgIzg4CiAJCW1vdmVxCXIxLCAjODQKIAkJYglzeXNfZnN0YXRmczY0CitFTkRQUk9DKHN5c19mc3RhdGZzNjRfd3JhcHBlcikKIAogLyoKICAqIE5vdGU6IG9mZl80ayAocjUpIGlzIGFsd2F5cyB1bml0cyBvZiA0Sy4gIElmIHdlIGNhbid0IGRvIHRoZSByZXF1ZXN0ZWQKQEAgLTQwMiwxMSArNDE1LDE0IEBACiAJCXN0cglyNSwgW3NwLCAjNF0KIAkJYglkb19tbWFwMgogI2VuZGlmCitFTkRQUk9DKHN5c19tbWFwMikKIAogRU5UUlkocGFib3J0X2lmYXIpCiAJCW1yYwlwMTUsIDAsIHIwLCBjcjYsIGNyMCwgMgogRU5UUlkocGFib3J0X25vaWZhcikKIAkJbW92CXBjLCBscgorRU5EUFJPQyhwYWJvcnRfaWZhcikKK0VORFBST0MocGFib3J0X25vaWZhcikKIAogI2lmZGVmIENPTkZJR19PQUJJX0NPTVBBVAogCkBAIC00MTcsMjYgKzQzMywzMSBAQAogc3lzX29hYmlfcHJlYWQ2NDoKIAkJc3RtaWEJc3AsIHtyMywgcjR9CiAJCWIJc3lzX3ByZWFkNjQKK0VORFBST0Moc3lzX29hYmlfcHJlYWQ2NCkKIAogc3lzX29hYmlfcHdyaXRlNjQ6CiAJCXN0bWlhCXNwLCB7cjMsIHI0fQogCQliCXN5c19wd3JpdGU2NAorRU5EUFJPQyhzeXNfb2FiaV9wd3JpdGU2NCkKIAogc3lzX29hYmlfdHJ1bmNhdGU2NDoKIAkJbW92CXIzLCByMgogCQltb3YJcjIsIHIxCiAJCWIJc3lzX3RydW5jYXRlNjQKK0VORFBST0Moc3lzX29hYmlfdHJ1bmNhdGU2NCkKIAogc3lzX29hYmlfZnRydW5jYXRlNjQ6CiAJCW1vdglyMywgcjIKIAkJbW92CXIyLCByMQogCQliCXN5c19mdHJ1bmNhdGU2NAorRU5EUFJPQyhzeXNfb2FiaV9mdHJ1bmNhdGU2NCkKIAogc3lzX29hYmlfcmVhZGFoZWFkOgogCQlzdHIJcjMsIFtzcF0KIAkJbW92CXIzLCByMgogCQltb3YJcjIsIHIxCiAJCWIJc3lzX3JlYWRhaGVhZAorRU5EUFJPQyhzeXNfb2FiaV9yZWFkYWhlYWQpCiAKIC8qCiAgKiBMZXQncyBkZWNsYXJlIGEgc2Vjb25kIHN5c2NhbGwgdGFibGUgZm9yIG9sZCBBQkkgYmluYXJpZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9maXEuYyBiL2FyY2gvYXJtL2tlcm5lbC9maXEuYwppbmRleCBlOGU5MDM0Li4zNmY4MWQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZmlxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2ZpcS5jCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8YXNtL2ZpcS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9fZmlxX2luc247CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLWNvbW1vbi5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKaW5kZXggMWMzYzZlYS4uYmRlNTJkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtY29tbW9uLlMKQEAgLTM2LDcgKzM2LDYgQEAKICAqICByMiAgPSBhdGFncyBwb2ludGVyCiAgKiAgcjkgID0gcHJvY2Vzc29yIElECiAgKi8KLQkudHlwZQlfX21tYXBfc3dpdGNoZWQsICVmdW5jdGlvbgogX19tbWFwX3N3aXRjaGVkOgogCWFkcglyMywgX19zd2l0Y2hfZGF0YSArIDQKIApAQCAtNTksNiArNTgsNyBAQAogCWJpYwlyNCwgcjAsICNDUl9BCQkJQCBDbGVhciAnQScgYml0CiAJc3RtaWEJcjcsIHtyMCwgcjR9CQkJQCBTYXZlIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzCiAJYglzdGFydF9rZXJuZWwKK0VORFBST0MoX19tbWFwX3N3aXRjaGVkKQogCiAvKgogICogRXhjZXB0aW9uIGhhbmRsaW5nLiAgU29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIHdlIGNhbid0IHByb2NlZWQuICBXZQpAQCAtNjksOCArNjksNiBAQAogICogYW5kIGhvcGUgZm9yIHRoZSBiZXN0ICh1c2VmdWwgaWYgYm9vdGxvYWRlciBmYWlscyB0byBwYXNzIGEgcHJvcGVyCiAgKiBtYWNoaW5lIElEIGZvciBleGFtcGxlKS4KICAqLwotCi0JLnR5cGUJX19lcnJvcl9wLCAlZnVuY3Rpb24KIF9fZXJyb3JfcDoKICNpZmRlZiBDT05GSUdfREVCVUdfTEwKIAlhZHIJcjAsIHN0cl9wMQpAQCAtODQsOCArODIsOCBAQAogc3RyX3AyOgkuYXNjaXoJIikuXG4iCiAJLmFsaWduCiAjZW5kaWYKK0VORFBST0MoX19lcnJvcl9wKQogCi0JLnR5cGUJX19lcnJvcl9hLCAlZnVuY3Rpb24KIF9fZXJyb3JfYToKICNpZmRlZiBDT05GSUdfREVCVUdfTEwKIAltb3YJcjQsIHIxCQkJCUAgcHJlc2VydmUgbWFjaGluZSBJRApAQCAtMTE1LDEzICsxMTMsMTQgQEAKIAlhZHIJcjAsIHN0cl9hMwogCWJsCXByaW50YXNjaWkKIAliCV9fZXJyb3IKK0VORFBST0MoX19lcnJvcl9hKQorCiBzdHJfYTE6CS5hc2NpegkiXG5FcnJvcjogdW5yZWNvZ25pemVkL3Vuc3VwcG9ydGVkIG1hY2hpbmUgSUQgKHIxID0gMHgiCiBzdHJfYTI6CS5hc2NpegkiKS5cblxuQXZhaWxhYmxlIG1hY2hpbmUgc3VwcG9ydDpcblxuSUQgKGhleClcdE5BTUVcbiIKIHN0cl9hMzoJLmFzY2l6CSJcblBsZWFzZSBjaGVjayB5b3VyIGtlcm5lbCBjb25maWcgYW5kL29yIGJvb3Rsb2FkZXIuXG4iCiAJLmFsaWduCiAjZW5kaWYKIAotCS50eXBlCV9fZXJyb3IsICVmdW5jdGlvbgogX19lcnJvcjoKICNpZmRlZiBDT05GSUdfQVJDSF9SUEMKIC8qCkBAIC0xMzgsNiArMTM3LDcgQEAKICNlbmRpZgogMToJbW92CXIwLCByMAogCWIJMWIKK0VORFBST0MoX19lcnJvcikKIAogCiAvKgpAQCAtMTUzLDcgKzE1Myw2IEBACiAgKglyNSA9IHByb2NfaW5mbyBwb2ludGVyIGluIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKICAqCXI5ID0gY3B1aWQgKHByZXNlcnZlZCkKICAqLwotCS50eXBlCV9fbG9va3VwX3Byb2Nlc3Nvcl90eXBlLCAlZnVuY3Rpb24KIF9fbG9va3VwX3Byb2Nlc3Nvcl90eXBlOgogCWFkcglyMywgM2YKIAlsZG1kYQlyMywge3I1IC0gcjd9CkBAIC0xNjksNiArMTY4LDcgQEAKIAlibG8JMWIKIAltb3YJcjUsICMwCQkJCUAgdW5rbm93biBwcm9jZXNzb3IKIDI6CW1vdglwYywgbHIKK0VORFBST0MoX19sb29rdXBfcHJvY2Vzc29yX3R5cGUpCiAKIC8qCiAgKiBUaGlzIHByb3ZpZGVzIGEgQy1BUEkgdmVyc2lvbiBvZiB0aGUgYWJvdmUgZnVuY3Rpb24uCkBAIC0xNzksNiArMTc5LDcgQEAKIAlibAlfX2xvb2t1cF9wcm9jZXNzb3JfdHlwZQogCW1vdglyMCwgcjUKIAlsZG1mZAlzcCEsIHtyNCAtIHI3LCByOSwgcGN9CitFTkRQUk9DKGxvb2t1cF9wcm9jZXNzb3JfdHlwZSkKIAogLyoKICAqIExvb2sgaW4gPGFzbS9wcm9jaW5mby5oPiBhbmQgYXJjaC9hcm0va2VybmVsL2FyY2guW2NoXSBmb3IKQEAgLTIwMSw3ICsyMDIsNiBAQAogICogIHIzLCByNCwgcjYgY29ycnVwdGVkCiAgKiAgcjUgPSBtYWNoX2luZm8gcG9pbnRlciBpbiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCiAgKi8KLQkudHlwZQlfX2xvb2t1cF9tYWNoaW5lX3R5cGUsICVmdW5jdGlvbgogX19sb29rdXBfbWFjaGluZV90eXBlOgogCWFkcglyMywgM2IKIAlsZG1pYQlyMywge3I0LCByNSwgcjZ9CkBAIC0yMTYsNiArMjE2LDcgQEAKIAlibG8JMWIKIAltb3YJcjUsICMwCQkJCUAgdW5rbm93biBtYWNoaW5lCiAyOgltb3YJcGMsIGxyCitFTkRQUk9DKF9fbG9va3VwX21hY2hpbmVfdHlwZSkKIAogLyoKICAqIFRoaXMgcHJvdmlkZXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBmdW5jdGlvbi4KQEAgLTIyNiw2ICsyMjcsNyBAQAogCWJsCV9fbG9va3VwX21hY2hpbmVfdHlwZQogCW1vdglyMCwgcjUKIAlsZG1mZAlzcCEsIHtyNCAtIHI2LCBwY30KK0VORFBST0MobG9va3VwX21hY2hpbmVfdHlwZSkKIAogLyogRGV0ZXJtaW5lIHZhbGlkaXR5IG9mIHRoZSByMiBhdGFncyBwb2ludGVyLiAgVGhlIGhldXJpc3RpYyByZXF1aXJlcwogICogdGhhdCB0aGUgcG9pbnRlciBiZSBhbGlnbmVkLCBpbiB0aGUgZmlyc3QgMTZrIG9mIHBoeXNpY2FsIFJBTSBhbmQKQEAgLTIzOSw4ICsyNDEsNiBAQAogICogIHIyIGVpdGhlciB2YWxpZCBhdGFncyBwb2ludGVyLCBvciB6ZXJvCiAgKiAgcjUsIHI2IGNvcnJ1cHRlZAogICovCi0KLQkudHlwZQlfX3ZldF9hdGFncywgJWZ1bmN0aW9uCiBfX3ZldF9hdGFnczoKIAl0c3QJcjIsICMweDMJCQlAIGFsaWduZWQ/CiAJYm5lCTFmCkBAIC0yNTcsMyArMjU3LDQgQEAKIAogMToJbW92CXIyLCAjMAogCW1vdglwYywgbHIKK0VORFBST0MoX192ZXRfYXRhZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUwppbmRleCAyNzMyOWJkLi5jYzg3ZTE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKQEAgLTMzLDcgKzMzLDYgQEAKICAqCiAgKi8KIAkuc2VjdGlvbiAiLnRleHQuaGVhZCIsICJheCIKLQkudHlwZQlzdGV4dCwgJWZ1bmN0aW9uCiBFTlRSWShzdGV4dCkKIAltc3IJY3Bzcl9jLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUgQCBlbnN1cmUgc3ZjIG1vZGUKIAkJCQkJCUAgYW5kIGlycXMgZGlzYWJsZWQKQEAgLTUzLDExICs1MiwxMSBAQAogCQkJCQkJQCB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZQogCWFkcglsciwgX19hZnRlcl9wcm9jX2luaXQJCUAgcmV0dXJuIChQSUMpIGFkZHJlc3MKIAlhZGQJcGMsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCitFTkRQUk9DKHN0ZXh0KQogCiAvKgogICogU2V0IHRoZSBDb250cm9sIFJlZ2lzdGVyIGFuZCBSZWFkIHRoZSBwcm9jZXNzIElELgogICovCi0JLnR5cGUJX19hZnRlcl9wcm9jX2luaXQsICVmdW5jdGlvbgogX19hZnRlcl9wcm9jX2luaXQ6CiAjaWZkZWYgQ09ORklHX0NQVV9DUDE1CiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCByZWFkIGNvbnRyb2wgcmVnCkBAIC04NSw2ICs4NCw3IEBACiAKIAltb3YJcGMsIHIxMwkJCQlAIGNsZWFyIHRoZSBCU1MgYW5kIGp1bXAKIAkJCQkJCUAgdG8gc3RhcnRfa2VybmVsCitFTkRQUk9DKF9fYWZ0ZXJfcHJvY19pbml0KQogCS5sdG9yZwogCiAjaW5jbHVkZSAiaGVhZC1jb21tb24uUyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCmluZGV4IGJmZjRjNmUuLjIxZTE3ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtNzUsNyArNzUsNiBAQAogICogY2lyY3Vtc3RhbmNlcywgekltYWdlKSBpcyBmb3IuCiAgKi8KIAkuc2VjdGlvbiAiLnRleHQuaGVhZCIsICJheCIKLQkudHlwZQlzdGV4dCwgJWZ1bmN0aW9uCiBFTlRSWShzdGV4dCkKIAltc3IJY3Bzcl9jLCAjUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUgQCBlbnN1cmUgc3ZjIG1vZGUKIAkJCQkJCUAgYW5kIGlycXMgZGlzYWJsZWQKQEAgLTEwMCw5ICs5OSw5IEBACiAJCQkJCQlAIG1tdSBoYXMgYmVlbiBlbmFibGVkCiAJYWRyCWxyLCBfX2VuYWJsZV9tbXUJCUAgcmV0dXJuIChQSUMpIGFkZHJlc3MKIAlhZGQJcGMsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCitFTkRQUk9DKHN0ZXh0KQogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQotCS50eXBlICAgc2Vjb25kYXJ5X3N0YXJ0dXAsICNmdW5jdGlvbgogRU5UUlkoc2Vjb25kYXJ5X3N0YXJ0dXApCiAJLyoKIAkgKiBDb21tb24gZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLgpAQCAtMTI4LDYgKzEyNyw3IEBACiAJYWRyCWxyLCBfX2VuYWJsZV9tbXUJCUAgcmV0dXJuIGFkZHJlc3MKIAlhZGQJcGMsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCUAgaW5pdGlhbGlzZSBwcm9jZXNzb3IKIAkJCQkJCUAgKHJldHVybiBjb250cm9sIHJlZykKK0VORFBST0Moc2Vjb25kYXJ5X3N0YXJ0dXApCiAKIAkvKgogCSAqIHI2ICA9ICZzZWNvbmRhcnlfZGF0YQpAQCAtMTM2LDYgKzEzNiw3IEBACiAJbGRyCXNwLCBbcjcsICM0XQkJCUAgZ2V0IHNlY29uZGFyeV9kYXRhLnN0YWNrCiAJbW92CWZwLCAjMAogCWIJc2Vjb25kYXJ5X3N0YXJ0X2tlcm5lbAorRU5EUFJPQyhfX3NlY29uZGFyeV9zd2l0Y2hlZCkKIAogCS50eXBlCV9fc2Vjb25kYXJ5X2RhdGEsICVvYmplY3QKIF9fc2Vjb25kYXJ5X2RhdGE6CkBAIC0xNTEsNyArMTUyLDYgQEAKICAqIHRoaXMgaXMganVzdCBsb2FkaW5nIHRoZSBwYWdlIHRhYmxlIHBvaW50ZXIgYW5kIGRvbWFpbiBhY2Nlc3MKICAqIHJlZ2lzdGVycy4KICAqLwotCS50eXBlCV9fZW5hYmxlX21tdSwgJWZ1bmN0aW9uCiBfX2VuYWJsZV9tbXU6CiAjaWZkZWYgQ09ORklHX0FMSUdOTUVOVF9UUkFQCiAJb3JyCXIwLCByMCwgI0NSX0EKQEAgLTE3NCw2ICsxNzQsNyBAQAogCW1jcglwMTUsIDAsIHI1LCBjMywgYzAsIDAJCUAgbG9hZCBkb21haW4gYWNjZXNzIHJlZ2lzdGVyCiAJbWNyCXAxNSwgMCwgcjQsIGMyLCBjMCwgMAkJQCBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcgogCWIJX190dXJuX21tdV9vbgorRU5EUFJPQyhfX2VuYWJsZV9tbXUpCiAKIC8qCiAgKiBFbmFibGUgdGhlIE1NVS4gIFRoaXMgY29tcGxldGVseSBjaGFuZ2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHZpc2libGUKQEAgLTE4Nyw3ICsxODgsNiBAQAogICogb3RoZXIgcmVnaXN0ZXJzIGRlcGVuZCBvbiB0aGUgZnVuY3Rpb24gY2FsbGVkIHVwb24gY29tcGxldGlvbgogICovCiAJLmFsaWduCTUKLQkudHlwZQlfX3R1cm5fbW11X29uLCAlZnVuY3Rpb24KIF9fdHVybl9tbXVfb246CiAJbW92CXIwLCByMAogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgd3JpdGUgY29udHJvbCByZWcKQEAgLTE5NSw3ICsxOTUsNyBAQAogCW1vdglyMywgcjMKIAltb3YJcjMsIHIzCiAJbW92CXBjLCByMTMKLQorRU5EUFJPQyhfX3R1cm5fbW11X29uKQogCiAKIC8qCkBAIC0yMTEsNyArMjExLDYgQEAKICAqICByMCwgcjMsIHI2LCByNyBjb3JydXB0ZWQKICAqICByNCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcwogICovCi0JLnR5cGUJX19jcmVhdGVfcGFnZV90YWJsZXMsICVmdW5jdGlvbgogX19jcmVhdGVfcGFnZV90YWJsZXM6CiAJcGd0YmwJcjQJCQkJQCBwYWdlIHRhYmxlIGFkZHJlc3MKIApAQCAtMzI1LDYgKzMyNCw3IEBACiAjZW5kaWYKICNlbmRpZgogCW1vdglwYywgbHIKK0VORFBST0MoX19jcmVhdGVfcGFnZV90YWJsZXMpCiAJLmx0b3JnCiAKICNpbmNsdWRlICJoZWFkLWNvbW1vbi5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9hcm0va2VybmVsL2luaXRfdGFzay5jCmluZGV4IDhiOGM5ZDMuLjBiYmY4MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL2FybS9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTgsOCArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogc3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgaW5pdF9mcyA9IElOSVRfRlM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaW8uYyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCmluZGV4IDFmNjgyMmQuLmY0NDcwMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pby5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pby5jCkBAIC0xLDcgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAvKgogICogQ29weSBkYXRhIGZyb20gSU8gbWVtb3J5IHNwYWNlIHRvICJyZWFsIiBtZW1vcnkgc3BhY2UuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKaW5kZXggZjg4ZWZiMS4uMmYzZWI3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtMTEyLDE4ICsxMTIsMTcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbiBhc21fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKworCWlycV9lbnRlcigpOwogCiAJLyoKIAkgKiBTb21lIGhhcmR3YXJlIGdpdmVzIHJhbmRvbWx5IHdyb25nIGludGVycnVwdHMuICBSYXRoZXIKIAkgKiB0aGFuIGNyYXNoaW5nLCBkbyBzb21ldGhpbmcgc2Vuc2libGUuCiAJICovCiAJaWYgKGlycSA+PSBOUl9JUlFTKQotCQlkZXNjID0gJmJhZF9pcnFfZGVzYzsKLQotCWlycV9lbnRlcigpOwotCi0JZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCWhhbmRsZV9iYWRfaXJxKGlycSwgJmJhZF9pcnFfZGVzYyk7CisJZWxzZQorCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAogCS8qIEFUOTEgc3BlY2lmaWMgd29ya2Fyb3VuZCAqLwogCWlycV9maW5pc2goaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2FybS9rZXJuZWwva2dkYi5jCmluZGV4IGFhZmZhZWMuLmJhOGNjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2tnZGIuYwpAQCAtMTExLDggKzExMSw2IEBACiAJY2FzZSAnRCc6CiAJY2FzZSAnayc6CiAJY2FzZSAnYyc6Ci0JCWtnZGJfY29udHRocmVhZCA9IE5VTEw7Ci0KIAkJLyoKIAkJICogVHJ5IHRvIHJlYWQgb3B0aW9uYWwgcGFyYW1ldGVyLCBwYyB1bmNoYW5nZWQgaWYgbm8gcGFybS4KIAkJICogSWYgdGhpcyB3YXMgYSBjb21waWxlZCBicmVha3BvaW50LCB3ZSBuZWVkIHRvIG1vdmUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWRlY29kZS5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKaW5kZXggYjQ1NjViYi4uZGExZjk0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtZGVjb2RlLmMKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCiAJaWYgKCF1Yml0KQogCQlhZGRyIC09IHJlZ19jb3VudDsKLQlhZGRyICs9ICghcGJpdCBeICF1Yml0KTsKKwlhZGRyICs9ICghcGJpdCA9PSAhdWJpdCk7CiAKIAlyZWdfYml0X3ZlY3RvciA9IGluc24gJiAweGZmZmY7CiAJd2hpbGUgKHJlZ19iaXRfdmVjdG9yKSB7CkBAIC01MDMsNyArNTAzLDcgQEAKIAlpZiAod2JpdCkgewogCQlpZiAoIXViaXQpCiAJCQlhZGRyIC09IHJlZ19jb3VudDsKLQkJYWRkciAtPSAoIXBiaXQgXiAhdWJpdCk7CisJCWFkZHIgLT0gKCFwYml0ID09ICF1Yml0KTsKIAkJcmVncy0+dXJlZ3Nbcm5dID0gKGxvbmcpYWRkcjsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYwppbmRleCBkMjg1MTNmMS4uM2Y5YWJlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCkBAIC0yMDAsOSArMjAwLDEyIEBACiAJfQogfQogCi1pbnQga3Byb2JlX3RyYXBfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQorc3RhdGljIGludCBfX2twcm9iZXMga3Byb2JlX3RyYXBfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWtwcm9iZV9oYW5kbGVyKHJlZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvYXJtL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKaW5kZXggZmFlNWJlYi4uNDQwZGM2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC02LDEwICs2LDEwIEBACiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCmluZGV4IGE2ODI1OWEuLjkyMDNiYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlpZiAoIWFyZWEpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gX192bWFsbG9jX2FyZWEoYXJlYSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUxfRVhFQyk7CiB9CiAjZWxzZSAvKiBDT05GSUdfTU1VICovCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggM2ZkODgyMy4uZDNlYTZmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yOCwxMiArMjgsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKIHN0YXRpYyBjb25zdCBjaGFyICpwcm9jZXNzb3JfbW9kZXNbXSA9IHsKQEAgLTI2NywzNSArMjY3LDYgQEAKIAlfX2JhY2t0cmFjZSgpOwogfQogCi12b2lkIHNob3dfZnByZWdzKHN0cnVjdCB1c2VyX2ZwICpyZWdzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQl1bnNpZ25lZCBsb25nICpwOwotCQljaGFyIHR5cGU7Ci0KLQkJcCA9ICh1bnNpZ25lZCBsb25nICopKHJlZ3MtPmZwcmVncyArIGkpOwotCi0JCXN3aXRjaCAocmVncy0+ZnR5cGVbaV0pIHsKLQkJCWNhc2UgMTogdHlwZSA9ICdmJzsgYnJlYWs7Ci0JCQljYXNlIDI6IHR5cGUgPSAnZCc7IGJyZWFrOwotCQkJY2FzZSAzOiB0eXBlID0gJ2UnOyBicmVhazsKLQkJCWRlZmF1bHQ6IHR5cGUgPSAnPyc7IGJyZWFrOwotCQl9Ci0JCWlmIChyZWdzLT5pbml0X2ZsYWcpCi0JCQl0eXBlID0gJz8nOwotCi0JCXByaW50aygiICBmJWQoJWMpOiAlMDhseCAlMDhseCAlMDhseCVjIiwKLQkJCWksIHR5cGUsIHBbMF0sIHBbMV0sIHBbMl0sIGkgJiAxID8gJ1xuJyA6ICcgJyk7Ci0JfQotCQkJCi0KLQlwcmludGsoIkZQU1I6ICUwOGx4IEZQQ1I6ICUwOGx4XG4iLAotCQkodW5zaWduZWQgbG9uZylyZWdzLT5mcHNyLAotCQkodW5zaWduZWQgbG9uZylyZWdzLT5mcGNyKTsKLX0KLQogLyoKICAqIEZyZWUgY3VycmVudCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4uCiAgKi8KQEAgLTQxNCw3ICszODUsNyBAQAogCWRvIHsKIAkJaWYgKGZwIDwgc3RhY2tfc3RhcnQgfHwgZnAgPiBzdGFja19lbmQpCiAJCQlyZXR1cm4gMDsKLQkJbHIgPSBwY19wb2ludGVyICgoKHVuc2lnbmVkIGxvbmcgKilmcClbLTFdKTsKKwkJbHIgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbLTFdOwogCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhscikpCiAJCQlyZXR1cm4gbHI7CiAJCWZwID0gKih1bnNpZ25lZCBsb25nICopIChmcCAtIDEyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwppbmRleCA0YjA1ZGM1Li5kZjY1M2VhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KQEAgLTEyNiw3ICsxMjYsNyBAQAogCiAJdmFsID0gZ2V0X3VzZXJfcmVnKGNoaWxkLCByZWcpOwogCWlmIChyZWcgPT0gMTUpCi0JCXZhbCA9IHBjX3BvaW50ZXIodmFsICsgOCk7CisJCXZhbCArPSA4OwogCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTI3OCw4ICsyNzgsNyBAQAogCQkJCWVsc2UKIAkJCQkJYmFzZSAtPSBhbHVvcDI7CiAJCQl9Ci0JCQlpZiAocmVhZF91MzIoY2hpbGQsIGJhc2UsICZhbHQpID09IDApCi0JCQkJYWx0ID0gcGNfcG9pbnRlcihhbHQpOworCQkJcmVhZF91MzIoY2hpbGQsIGJhc2UsICZhbHQpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zMDUsOCArMzA0LDcgQEAKIAogCQkJYmFzZSA9IHB0cmFjZV9nZXRybihjaGlsZCwgaW5zbik7CiAKLQkJCWlmIChyZWFkX3UzMihjaGlsZCwgYmFzZSArIG5yX3JlZ3MsICZhbHQpID09IDApCi0JCQkJYWx0ID0gcGNfcG9pbnRlcihhbHQpOworCQkJcmVhZF91MzIoY2hpbGQsIGJhc2UgKyBucl9yZWdzLCAmYWx0KTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCAyY2E3MDM4Li4xZjFlZWNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtMjYsMTEgKzI2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hldHlwZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNTksMTMgKzYxLDE0IEBACiAKIGV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBtZW1pbmZvICosIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgcmVib290X3NldHVwKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKLWV4dGVybiB2b2lkIF9zdGV4dCwgX3RleHQsIF9ldGV4dCwgX19kYXRhX3N0YXJ0LCBfZWRhdGEsIF9lbmQ7CitleHRlcm4gdm9pZCBfdGV4dCwgX2V0ZXh0LCBfX2RhdGFfc3RhcnQsIF9lZGF0YSwgX2VuZDsKIAogdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKIEVYUE9SVF9TWU1CT0wocHJvY2Vzc29yX2lkKTsKIHVuc2lnbmVkIGludCBfX21hY2hpbmVfYXJjaF90eXBlOwogRVhQT1JUX1NZTUJPTChfX21hY2hpbmVfYXJjaF90eXBlKTsKK3Vuc2lnbmVkIGludCBjYWNoZWlkOworRVhQT1JUX1NZTUJPTChjYWNoZWlkKTsKIAogdW5zaWduZWQgaW50IF9fYXRhZ3NfcG9pbnRlciBfX2luaXRkYXRhOwogCkBAIC04MSw4ICs4NCw2IEBACiB1bnNpZ25lZCBpbnQgZWxmX2h3Y2FwOwogRVhQT1JUX1NZTUJPTChlbGZfaHdjYXApOwogCi11bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgdm1hbGxvY19yZXNlcnZlID0gMTI4IDw8IDIwOwotCiAKICNpZmRlZiBNVUxUSV9DUFUKIHN0cnVjdCBwcm9jZXNzb3IgcHJvY2Vzc29yOwpAQCAtMTExLDkgKzExMiw2IEBACiBjaGFyIGVsZl9wbGF0Zm9ybVtFTEZfUExBVEZPUk1fU0laRV07CiBFWFBPUlRfU1lNQk9MKGVsZl9wbGF0Zm9ybSk7CiAKLXVuc2lnbmVkIGxvbmcgcGh5c19pbml0cmRfc3RhcnQgX19pbml0ZGF0YSA9IDA7Ci11bnNpZ25lZCBsb25nIHBoeXNfaW5pdHJkX3NpemUgX19pbml0ZGF0YSA9IDA7Ci0KIHN0YXRpYyBzdHJ1Y3QgbWVtaW5mbyBtZW1pbmZvIF9faW5pdGRhdGEgPSB7IDAsIH07CiBzdGF0aWMgY29uc3QgY2hhciAqY3B1X25hbWU7CiBzdGF0aWMgY29uc3QgY2hhciAqbWFjaGluZV9uYW1lOwpAQCAtMTc4LDYzICsxNzYsNiBAQAogI2RlZmluZSBscDEgaW9fcmVzWzFdCiAjZGVmaW5lIGxwMiBpb19yZXNbMl0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlX3R5cGVzWzE2XSA9IHsKLQkid3JpdGUtdGhyb3VnaCIsCi0JIndyaXRlLWJhY2siLAotCSJ3cml0ZS1iYWNrIiwKLQkidW5kZWZpbmVkIDMiLAotCSJ1bmRlZmluZWQgNCIsCi0JInVuZGVmaW5lZCA1IiwKLQkid3JpdGUtYmFjayIsCi0JIndyaXRlLWJhY2siLAotCSJ1bmRlZmluZWQgOCIsCi0JInVuZGVmaW5lZCA5IiwKLQkidW5kZWZpbmVkIDEwIiwKLQkidW5kZWZpbmVkIDExIiwKLQkidW5kZWZpbmVkIDEyIiwKLQkidW5kZWZpbmVkIDEzIiwKLQkid3JpdGUtYmFjayIsCi0JInVuZGVmaW5lZCAxNSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfY2xlYW5bMTZdID0gewotCSJub3QgcmVxdWlyZWQiLAotCSJyZWFkLWJsb2NrIiwKLQkiY3AxNSBjNyBvcHMiLAotCSJ1bmRlZmluZWQgMyIsCi0JInVuZGVmaW5lZCA0IiwKLQkidW5kZWZpbmVkIDUiLAotCSJjcDE1IGM3IG9wcyIsCi0JImNwMTUgYzcgb3BzIiwKLQkidW5kZWZpbmVkIDgiLAotCSJ1bmRlZmluZWQgOSIsCi0JInVuZGVmaW5lZCAxMCIsCi0JInVuZGVmaW5lZCAxMSIsCi0JInVuZGVmaW5lZCAxMiIsCi0JInVuZGVmaW5lZCAxMyIsCi0JImNwMTUgYzcgb3BzIiwKLQkidW5kZWZpbmVkIDE1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjYWNoZV9sb2NrZG93blsxNl0gPSB7Ci0JIm5vdCBzdXBwb3J0ZWQiLAotCSJub3Qgc3VwcG9ydGVkIiwKLQkibm90IHN1cHBvcnRlZCIsCi0JInVuZGVmaW5lZCAzIiwKLQkidW5kZWZpbmVkIDQiLAotCSJ1bmRlZmluZWQgNSIsCi0JImZvcm1hdCBBIiwKLQkiZm9ybWF0IEIiLAotCSJ1bmRlZmluZWQgOCIsCi0JInVuZGVmaW5lZCA5IiwKLQkidW5kZWZpbmVkIDEwIiwKLQkidW5kZWZpbmVkIDExIiwKLQkidW5kZWZpbmVkIDEyIiwKLQkidW5kZWZpbmVkIDEzIiwKLQkiZm9ybWF0IEMiLAotCSJ1bmRlZmluZWQgMTUiLAotfTsKLQogc3RhdGljIGNvbnN0IGNoYXIgKnByb2NfYXJjaFtdID0gewogCSJ1bmRlZmluZWQvdW5rbm93biIsCiAJIjMiLApAQCAtMjU1LDYxICsxOTYsMTkgQEAKIAkiPygxNykiLAogfTsKIAotI2RlZmluZSBDQUNIRV9UWVBFKHgpCSgoKHgpID4+IDI1KSAmIDE1KQotI2RlZmluZSBDQUNIRV9TKHgpCSgoeCkgJiAoMSA8PCAyNCkpCi0jZGVmaW5lIENBQ0hFX0RTSVpFKHgpCSgoKHgpID4+IDEyKSAmIDQwOTUpCS8qIG9ubHkgaWYgUz0xICovCi0jZGVmaW5lIENBQ0hFX0lTSVpFKHgpCSgoeCkgJiA0MDk1KQotCi0jZGVmaW5lIENBQ0hFX1NJWkUoeSkJKCgoeSkgPj4gNikgJiA3KQotI2RlZmluZSBDQUNIRV9BU1NPQyh5KQkoKCh5KSA+PiAzKSAmIDcpCi0jZGVmaW5lIENBQ0hFX00oeSkJKCh5KSAmICgxIDw8IDIpKQotI2RlZmluZSBDQUNIRV9MSU5FKHkpCSgoeSkgJiAzKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9jYWNoZShjb25zdCBjaGFyICpwcmVmaXgsIGludCBjcHUsIHVuc2lnbmVkIGludCBjYWNoZSkKLXsKLQl1bnNpZ25lZCBpbnQgbXVsdCA9IDIgKyAoQ0FDSEVfTShjYWNoZSkgPyAxIDogMCk7Ci0KLQlwcmludGsoIkNQVSV1OiAlczogJWQgYnl0ZXMsIGFzc29jaWF0aXZpdHkgJWQsICVkIGJ5dGUgbGluZXMsICVkIHNldHNcbiIsCi0JCWNwdSwgcHJlZml4LAotCQltdWx0IDw8ICg4ICsgQ0FDSEVfU0laRShjYWNoZSkpLAotCQkobXVsdCA8PCBDQUNIRV9BU1NPQyhjYWNoZSkpID4+IDEsCi0JCTggPDwgQ0FDSEVfTElORShjYWNoZSksCi0JCTEgPDwgKDYgKyBDQUNIRV9TSVpFKGNhY2hlKSAtIENBQ0hFX0FTU09DKGNhY2hlKSAtCi0JCQlDQUNIRV9MSU5FKGNhY2hlKSkpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZHVtcF9jcHVfaW5mbyhpbnQgY3B1KQotewotCXVuc2lnbmVkIGludCBpbmZvID0gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwotCi0JaWYgKGluZm8gIT0gcHJvY2Vzc29yX2lkKSB7Ci0JCXByaW50aygiQ1BVJXU6IEQgJXMgJXMgY2FjaGVcbiIsIGNwdSwgY2FjaGVfaXNfdml2dCgpID8gIlZJVlQiIDogIlZJUFQiLAotCQkgICAgICAgY2FjaGVfdHlwZXNbQ0FDSEVfVFlQRShpbmZvKV0pOwotCQlpZiAoQ0FDSEVfUyhpbmZvKSkgewotCQkJZHVtcF9jYWNoZSgiSSBjYWNoZSIsIGNwdSwgQ0FDSEVfSVNJWkUoaW5mbykpOwotCQkJZHVtcF9jYWNoZSgiRCBjYWNoZSIsIGNwdSwgQ0FDSEVfRFNJWkUoaW5mbykpOwotCQl9IGVsc2UgewotCQkJZHVtcF9jYWNoZSgiY2FjaGUiLCBjcHUsIENBQ0hFX0lTSVpFKGluZm8pKTsKLQkJfQotCX0KLQotCWlmIChhcmNoX2lzX2NvaGVyZW50KCkpCi0JCXByaW50aygiQ2FjaGUgY29oZXJlbmN5IGVuYWJsZWRcbiIpOwotfQotCiBpbnQgY3B1X2FyY2hpdGVjdHVyZSh2b2lkKQogewogCWludCBjcHVfYXJjaDsKIAotCWlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4ZjAwMCkgPT0gMCkgeworCWlmICgocmVhZF9jcHVpZF9pZCgpICYgMHgwMDA4ZjAwMCkgPT0gMCkgewogCQljcHVfYXJjaCA9IENQVV9BUkNIX1VOS05PV047Ci0JfSBlbHNlIGlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4ZjAwMCkgPT0gMHgwMDAwNzAwMCkgewotCQljcHVfYXJjaCA9IChwcm9jZXNzb3JfaWQgJiAoMSA8PCAyMykpID8gQ1BVX0FSQ0hfQVJNdjRUIDogQ1BVX0FSQ0hfQVJNdjM7Ci0JfSBlbHNlIGlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4MDAwMCkgPT0gMHgwMDAwMDAwMCkgewotCQljcHVfYXJjaCA9IChwcm9jZXNzb3JfaWQgPj4gMTYpICYgNzsKKwl9IGVsc2UgaWYgKChyZWFkX2NwdWlkX2lkKCkgJiAweDAwMDhmMDAwKSA9PSAweDAwMDA3MDAwKSB7CisJCWNwdV9hcmNoID0gKHJlYWRfY3B1aWRfaWQoKSAmICgxIDw8IDIzKSkgPyBDUFVfQVJDSF9BUk12NFQgOiBDUFVfQVJDSF9BUk12MzsKKwl9IGVsc2UgaWYgKChyZWFkX2NwdWlkX2lkKCkgJiAweDAwMDgwMDAwKSA9PSAweDAwMDAwMDAwKSB7CisJCWNwdV9hcmNoID0gKHJlYWRfY3B1aWRfaWQoKSA+PiAxNikgJiA3OwogCQlpZiAoY3B1X2FyY2gpCiAJCQljcHVfYXJjaCArPSBDUFVfQVJDSF9BUk12MzsKLQl9IGVsc2UgaWYgKChwcm9jZXNzb3JfaWQgJiAweDAwMGYwMDAwKSA9PSAweDAwMGYwMDAwKSB7CisJfSBlbHNlIGlmICgocmVhZF9jcHVpZF9pZCgpICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkgewogCQl1bnNpZ25lZCBpbnQgbW1mcjA7CiAKIAkJLyogUmV2aXNlZCBDUFVJRCBmb3JtYXQuIFJlYWQgdGhlIE1lbW9yeSBNb2RlbCBGZWF0dXJlCkBAIC0zMzAsNiArMjI5LDM0IEBACiAJcmV0dXJuIGNwdV9hcmNoOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgY2FjaGVpZF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNhY2hldHlwZSA9IHJlYWRfY3B1aWRfY2FjaGV0eXBlKCk7CisJdW5zaWduZWQgaW50IGFyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CisKKwlpZiAoYXJjaCA+PSBDUFVfQVJDSF9BUk12NykgeworCQljYWNoZWlkID0gQ0FDSEVJRF9WSVBUX05PTkFMSUFTSU5HOworCQlpZiAoKGNhY2hldHlwZSAmICgzIDw8IDE0KSkgPT0gMSA8PCAxNCkKKwkJCWNhY2hlaWQgfD0gQ0FDSEVJRF9BU0lEX1RBR0dFRDsKKwl9IGVsc2UgaWYgKGFyY2ggPj0gQ1BVX0FSQ0hfQVJNdjYpIHsKKwkJaWYgKGNhY2hldHlwZSAmICgxIDw8IDIzKSkKKwkJCWNhY2hlaWQgPSBDQUNIRUlEX1ZJUFRfQUxJQVNJTkc7CisJCWVsc2UKKwkJCWNhY2hlaWQgPSBDQUNIRUlEX1ZJUFRfTk9OQUxJQVNJTkc7CisJfSBlbHNlIHsKKwkJY2FjaGVpZCA9IENBQ0hFSURfVklWVDsKKwl9CisKKwlwcmludGsoIkNQVTogJXMgZGF0YSBjYWNoZSwgJXMgaW5zdHJ1Y3Rpb24gY2FjaGVcbiIsCisJCWNhY2hlX2lzX3ZpdnQoKSA/ICJWSVZUIiA6CisJCWNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSA/ICJWSVBUIGFsaWFzaW5nIiA6CisJCWNhY2hlX2lzX3ZpcHRfbm9uYWxpYXNpbmcoKSA/ICJWSVBUIG5vbmFsaWFzaW5nIiA6ICJ1bmtub3duIiwKKwkJY2FjaGVfaXNfdml2dCgpID8gIlZJVlQiIDoKKwkJaWNhY2hlX2lzX3ZpdnRfYXNpZF90YWdnZWQoKSA/ICJWSVZUIEFTSUQgdGFnZ2VkIiA6CisJCWNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSA/ICJWSVBUIGFsaWFzaW5nIiA6CisJCWNhY2hlX2lzX3ZpcHRfbm9uYWxpYXNpbmcoKSA/ICJWSVBUIG5vbmFsaWFzaW5nIiA6ICJ1bmtub3duIik7Cit9CisKIC8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgcmUtdXNlIHRoZSBhc3NlbWJseSBjb2RlIGluIGhlYWQuUywgd2hpY2gKICAqIGFscmVhZHkgcHJvdmlkZSB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eS4KQEAgLTM0NiwxMCArMjczLDEwIEBACiAJICogdHlwZXMuICBUaGUgbGlua2VyIGJ1aWxkcyB0aGlzIHRhYmxlIGZvciB1cyBmcm9tIHRoZQogCSAqIGVudHJpZXMgaW4gYXJjaC9hcm0vbW0vcHJvYy0qLlMKIAkgKi8KLQlsaXN0ID0gbG9va3VwX3Byb2Nlc3Nvcl90eXBlKHByb2Nlc3Nvcl9pZCk7CisJbGlzdCA9IGxvb2t1cF9wcm9jZXNzb3JfdHlwZShyZWFkX2NwdWlkX2lkKCkpOwogCWlmICghbGlzdCkgewogCQlwcmludGsoIkNQVSBjb25maWd1cmF0aW9uIGJvdGNoZWQgKElEICUwOHgpLCB1bmFibGUgIgotCQkgICAgICAgInRvIGNvbnRpbnVlLlxuIiwgcHJvY2Vzc29yX2lkKTsKKwkJICAgICAgICJ0byBjb250aW51ZS5cbiIsIHJlYWRfY3B1aWRfaWQoKSk7CiAJCXdoaWxlICgxKTsKIAl9CiAKQEAgLTM2OSw3ICsyOTYsNyBAQAogI2VuZGlmCiAKIAlwcmludGsoIkNQVTogJXMgWyUwOHhdIHJldmlzaW9uICVkIChBUk12JXMpLCBjcj0lMDhseFxuIiwKLQkgICAgICAgY3B1X25hbWUsIHByb2Nlc3Nvcl9pZCwgKGludClwcm9jZXNzb3JfaWQgJiAxNSwKKwkgICAgICAgY3B1X25hbWUsIHJlYWRfY3B1aWRfaWQoKSwgcmVhZF9jcHVpZF9pZCgpICYgMTUsCiAJICAgICAgIHByb2NfYXJjaFtjcHVfYXJjaGl0ZWN0dXJlKCldLCBjcl9hbGlnbm1lbnQpOwogCiAJc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bWFjaGluZSwgIiVzJWMiLCBsaXN0LT5hcmNoX25hbWUsIEVORElBTk5FU1MpOwpAQCAtMzc5LDE0ICszMDYsMTQgQEAKIAllbGZfaHdjYXAgJj0gfkhXQ0FQX1RIVU1COwogI2VuZGlmCiAKKwljYWNoZWlkX2luaXQoKTsKIAljcHVfcHJvY19pbml0KCk7CiB9CiAKIC8qCiAgKiBjcHVfaW5pdCAtIGluaXRpYWxpc2Ugb25lIENQVS4KICAqCi0gKiBjcHVfaW5pdCBkdW1wcyB0aGUgY2FjaGUgaW5mb3JtYXRpb24sIGluaXRpYWxpc2VzIFNNUCBzcGVjaWZpYwotICogaW5mb3JtYXRpb24sIGFuZCBzZXRzIHVwIHRoZSBwZXItQ1BVIHN0YWNrcy4KKyAqIGNwdV9pbml0IHNldHMgdXAgdGhlIHBlci1DUFUgc3RhY2tzLgogICovCiB2b2lkIGNwdV9pbml0KHZvaWQpCiB7CkBAIC0zOTgsOSArMzI1LDYgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykKLQkJZHVtcF9jcHVfaW5mbyhjcHUpOwotCiAJLyoKIAkgKiBzZXR1cCBzdGFja3MgZm9yIHJlLWVudHJhbnQgZXhjZXB0aW9uIGhhbmRsZXJzCiAJICovCkBAIC00NDMsMjAgKzM2Nyw2IEBACiAJcmV0dXJuIGxpc3Q7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9pbml0cmQoY2hhciAqKnApCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZTsKLQotCXN0YXJ0ID0gbWVtcGFyc2UoKnAsIHApOwotCWlmICgqKnAgPT0gJywnKSB7Ci0JCXNpemUgPSBtZW1wYXJzZSgoKnApICsgMSwgcCk7Ci0KLQkJcGh5c19pbml0cmRfc3RhcnQgPSBzdGFydDsKLQkJcGh5c19pbml0cmRfc2l6ZSA9IHNpemU7Ci0JfQotfQotX19lYXJseV9wYXJhbSgiaW5pdHJkPSIsIGVhcmx5X2luaXRyZCk7Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBhcm1fYWRkX21lbW9yeSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IG1lbWJhbmsgKmJhbms7CkBAIC01MDMsMTcgKzQxMyw2IEBACiBfX2Vhcmx5X3BhcmFtKCJtZW09IiwgZWFybHlfbWVtKTsKIAogLyoKLSAqIHZtYWxsb2M9c2l6ZSBmb3JjZXMgdGhlIHZtYWxsb2MgYXJlYSB0byBiZSBleGFjdGx5ICdzaXplJwotICogYnl0ZXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgKG9yIGRlY3JlYXNlKSB0aGUgdm1hbGxvYwotICogYXJlYSAtIHRoZSBkZWZhdWx0IGlzIDEyOG0uCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV92bWFsbG9jKGNoYXIgKiphcmcpCi17Ci0Jdm1hbGxvY19yZXNlcnZlID0gbWVtcGFyc2UoKmFyZywgYXJnKTsKLX0KLV9fZWFybHlfcGFyYW0oInZtYWxsb2M9IiwgZWFybHlfdm1hbGxvYyk7Ci0KLS8qCiAgKiBJbml0aWFsIHBhcnNpbmcgb2YgdGhlIGNvbW1hbmQgbGluZS4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX2NtZGxpbmUoY2hhciAqKmNtZGxpbmVfcCwgY2hhciAqZnJvbSkKQEAgLTUyNywxMiArNDI2LDEyIEBACiAJCQlzdHJ1Y3QgZWFybHlfcGFyYW1zICpwOwogCiAJCQlmb3IgKHAgPSAmX19lYXJseV9iZWdpbjsgcCA8ICZfX2Vhcmx5X2VuZDsgcCsrKSB7Ci0JCQkJaW50IGxlbiA9IHN0cmxlbihwLT5hcmcpOworCQkJCWludCBhcmdsZW4gPSBzdHJsZW4ocC0+YXJnKTsKIAotCQkJCWlmIChtZW1jbXAoZnJvbSwgcC0+YXJnLCBsZW4pID09IDApIHsKKwkJCQlpZiAobWVtY21wKGZyb20sIHAtPmFyZywgYXJnbGVuKSA9PSAwKSB7CiAJCQkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCiAJCQkJCQl0byAtPSAxOwotCQkJCQlmcm9tICs9IGxlbjsKKwkJCQkJZnJvbSArPSBhcmdsZW47CiAJCQkJCXAtPmZuKCZmcm9tKTsKIAogCQkJCQl3aGlsZSAoKmZyb20gIT0gJyAnICYmICpmcm9tICE9ICdcMCcpCkBAIC01NzksMTggKzQ3OCwxMyBAQAogCWtlcm5lbF9kYXRhLmVuZCAgICAgPSB2aXJ0X3RvX3BoeXMoJl9lbmQgLSAxKTsKIAogCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHZpcnRfc3RhcnQsIHZpcnRfZW5kOwotCiAJCWlmIChtaS0+YmFua1tpXS5zaXplID09IDApCiAJCQljb250aW51ZTsKIAotCQl2aXJ0X3N0YXJ0ID0gX19waHlzX3RvX3ZpcnQobWktPmJhbmtbaV0uc3RhcnQpOwotCQl2aXJ0X2VuZCAgID0gdmlydF9zdGFydCArIG1pLT5iYW5rW2ldLnNpemUgLSAxOwotCiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZigqcmVzKSk7CiAJCXJlcy0+bmFtZSAgPSAiU3lzdGVtIFJBTSI7Ci0JCXJlcy0+c3RhcnQgPSBfX3ZpcnRfdG9fcGh5cyh2aXJ0X3N0YXJ0KTsKLQkJcmVzLT5lbmQgICA9IF9fdmlydF90b19waHlzKHZpcnRfZW5kKTsKKwkJcmVzLT5zdGFydCA9IG1pLT5iYW5rW2ldLnN0YXJ0OworCQlyZXMtPmVuZCAgID0gbWktPmJhbmtbaV0uc3RhcnQgKyBtaS0+YmFua1tpXS5zaXplIC0gMTsKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwogCiAJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwpAQCAtNjk0LDI2ICs1ODgsNiBAQAogCiBfX3RhZ3RhYmxlKEFUQUdfUkFNRElTSywgcGFyc2VfdGFnX3JhbWRpc2spOwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfaW5pdHJkKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKLXsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJBVEFHX0lOSVRSRCBpcyBkZXByZWNhdGVkOyAiCi0JCSJwbGVhc2UgdXBkYXRlIHlvdXIgYm9vdGxvYWRlci5cbiIpOwotCXBoeXNfaW5pdHJkX3N0YXJ0ID0gX192aXJ0X3RvX3BoeXModGFnLT51LmluaXRyZC5zdGFydCk7Ci0JcGh5c19pbml0cmRfc2l6ZSA9IHRhZy0+dS5pbml0cmQuc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotX190YWd0YWJsZShBVEFHX0lOSVRSRCwgcGFyc2VfdGFnX2luaXRyZCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19pbml0cmQyKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKLXsKLQlwaHlzX2luaXRyZF9zdGFydCA9IHRhZy0+dS5pbml0cmQuc3RhcnQ7Ci0JcGh5c19pbml0cmRfc2l6ZSA9IHRhZy0+dS5pbml0cmQuc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotX190YWd0YWJsZShBVEFHX0lOSVRSRDIsIHBhcnNlX3RhZ19pbml0cmQyKTsKLQogc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX3NlcmlhbG5yKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKIHsKIAlzeXN0ZW1fc2VyaWFsX2xvdyA9IHRhZy0+dS5zZXJpYWxuci5sb3c7CkBAIC05MDEsMjggKzc3NSwxMiBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyB2b2lkCi1jX3Nob3dfY2FjaGUoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBpbnQgY2FjaGUpCi17Ci0JdW5zaWduZWQgaW50IG11bHQgPSAyICsgKENBQ0hFX00oY2FjaGUpID8gMSA6IDApOwotCi0Jc2VxX3ByaW50ZihtLCAiJXMgc2l6ZVx0XHQ6ICVkXG4iCi0JCSAgICAgICIlcyBhc3NvY1x0XHQ6ICVkXG4iCi0JCSAgICAgICIlcyBsaW5lIGxlbmd0aFx0OiAlZFxuIgotCQkgICAgICAiJXMgc2V0c1x0XHQ6ICVkXG4iLAotCQl0eXBlLCBtdWx0IDw8ICg4ICsgQ0FDSEVfU0laRShjYWNoZSkpLAotCQl0eXBlLCAobXVsdCA8PCBDQUNIRV9BU1NPQyhjYWNoZSkpID4+IDEsCi0JCXR5cGUsIDggPDwgQ0FDSEVfTElORShjYWNoZSksCi0JCXR5cGUsIDEgPDwgKDYgKyBDQUNIRV9TSVpFKGNhY2hlKSAtIENBQ0hFX0FTU09DKGNhY2hlKSAtCi0JCQkgICAgQ0FDSEVfTElORShjYWNoZSkpKTsKLX0KLQogc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCWludCBpOwogCiAJc2VxX3ByaW50ZihtLCAiUHJvY2Vzc29yXHQ6ICVzIHJldiAlZCAoJXMpXG4iLAotCQkgICBjcHVfbmFtZSwgKGludClwcm9jZXNzb3JfaWQgJiAxNSwgZWxmX3BsYXRmb3JtKTsKKwkJICAgY3B1X25hbWUsIHJlYWRfY3B1aWRfaWQoKSAmIDE1LCBlbGZfcGxhdGZvcm0pOwogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKQogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewpAQCAtOTQ5LDQ3ICs4MDcsMjYgQEAKIAkJaWYgKGVsZl9od2NhcCAmICgxIDw8IGkpKQogCQkJc2VxX3ByaW50ZihtLCAiJXMgIiwgaHdjYXBfc3RyW2ldKTsKIAotCXNlcV9wcmludGYobSwgIlxuQ1BVIGltcGxlbWVudGVyXHQ6IDB4JTAyeFxuIiwgcHJvY2Vzc29yX2lkID4+IDI0KTsKKwlzZXFfcHJpbnRmKG0sICJcbkNQVSBpbXBsZW1lbnRlclx0OiAweCUwMnhcbiIsIHJlYWRfY3B1aWRfaWQoKSA+PiAyNCk7CiAJc2VxX3ByaW50ZihtLCAiQ1BVIGFyY2hpdGVjdHVyZTogJXNcbiIsIHByb2NfYXJjaFtjcHVfYXJjaGl0ZWN0dXJlKCldKTsKIAotCWlmICgocHJvY2Vzc29yX2lkICYgMHgwMDA4ZjAwMCkgPT0gMHgwMDAwMDAwMCkgeworCWlmICgocmVhZF9jcHVpZF9pZCgpICYgMHgwMDA4ZjAwMCkgPT0gMHgwMDAwMDAwMCkgewogCQkvKiBwcmUtQVJNNyAqLwotCQlzZXFfcHJpbnRmKG0sICJDUFUgcGFydFx0OiAlMDd4XG4iLCBwcm9jZXNzb3JfaWQgPj4gNCk7CisJCXNlcV9wcmludGYobSwgIkNQVSBwYXJ0XHQ6ICUwN3hcbiIsIHJlYWRfY3B1aWRfaWQoKSA+PiA0KTsKIAl9IGVsc2UgewotCQlpZiAoKHByb2Nlc3Nvcl9pZCAmIDB4MDAwOGYwMDApID09IDB4MDAwMDcwMDApIHsKKwkJaWYgKChyZWFkX2NwdWlkX2lkKCkgJiAweDAwMDhmMDAwKSA9PSAweDAwMDA3MDAwKSB7CiAJCQkvKiBBUk03ICovCiAJCQlzZXFfcHJpbnRmKG0sICJDUFUgdmFyaWFudFx0OiAweCUwMnhcbiIsCi0JCQkJICAgKHByb2Nlc3Nvcl9pZCA+PiAxNikgJiAxMjcpOworCQkJCSAgIChyZWFkX2NwdWlkX2lkKCkgPj4gMTYpICYgMTI3KTsKIAkJfSBlbHNlIHsKIAkJCS8qIHBvc3QtQVJNNyAqLwogCQkJc2VxX3ByaW50ZihtLCAiQ1BVIHZhcmlhbnRcdDogMHgleFxuIiwKLQkJCQkgICAocHJvY2Vzc29yX2lkID4+IDIwKSAmIDE1KTsKKwkJCQkgICAocmVhZF9jcHVpZF9pZCgpID4+IDIwKSAmIDE1KTsKIAkJfQogCQlzZXFfcHJpbnRmKG0sICJDUFUgcGFydFx0OiAweCUwM3hcbiIsCi0JCQkgICAocHJvY2Vzc29yX2lkID4+IDQpICYgMHhmZmYpOworCQkJICAgKHJlYWRfY3B1aWRfaWQoKSA+PiA0KSAmIDB4ZmZmKTsKIAl9Ci0Jc2VxX3ByaW50ZihtLCAiQ1BVIHJldmlzaW9uXHQ6ICVkXG4iLCBwcm9jZXNzb3JfaWQgJiAxNSk7Ci0KLQl7Ci0JCXVuc2lnbmVkIGludCBjYWNoZV9pbmZvID0gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwotCQlpZiAoY2FjaGVfaW5mbyAhPSBwcm9jZXNzb3JfaWQpIHsKLQkJCXNlcV9wcmludGYobSwgIkNhY2hlIHR5cGVcdDogJXNcbiIKLQkJCQkgICAgICAiQ2FjaGUgY2xlYW5cdDogJXNcbiIKLQkJCQkgICAgICAiQ2FjaGUgbG9ja2Rvd25cdDogJXNcbiIKLQkJCQkgICAgICAiQ2FjaGUgZm9ybWF0XHQ6ICVzXG4iLAotCQkJCSAgIGNhY2hlX3R5cGVzW0NBQ0hFX1RZUEUoY2FjaGVfaW5mbyldLAotCQkJCSAgIGNhY2hlX2NsZWFuW0NBQ0hFX1RZUEUoY2FjaGVfaW5mbyldLAotCQkJCSAgIGNhY2hlX2xvY2tkb3duW0NBQ0hFX1RZUEUoY2FjaGVfaW5mbyldLAotCQkJCSAgIENBQ0hFX1MoY2FjaGVfaW5mbykgPyAiSGFydmFyZCIgOiAiVW5pZmllZCIpOwotCi0JCQlpZiAoQ0FDSEVfUyhjYWNoZV9pbmZvKSkgewotCQkJCWNfc2hvd19jYWNoZShtLCAiSSIsIENBQ0hFX0lTSVpFKGNhY2hlX2luZm8pKTsKLQkJCQljX3Nob3dfY2FjaGUobSwgIkQiLCBDQUNIRV9EU0laRShjYWNoZV9pbmZvKSk7Ci0JCQl9IGVsc2UgewotCQkJCWNfc2hvd19jYWNoZShtLCAiQ2FjaGUiLCBDQUNIRV9JU0laRShjYWNoZV9pbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9CisJc2VxX3ByaW50ZihtLCAiQ1BVIHJldmlzaW9uXHQ6ICVkXG4iLCByZWFkX2NwdWlkX2lkKCkgJiAxNSk7CiAKIAlzZXFfcHV0cyhtLCAiXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCmluZGV4IGVmMmY4NmEuLjgwYjhiNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKQEAgLTExLDExICsxMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAjaW5jbHVkZSAicHRyYWNlLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggZTk4NDJmNi4uZTQyYTc0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtMjc3LDYgKzI3Nyw3IEBACiAJLyoKIAkgKiBFbmFibGUgbG9jYWwgaW50ZXJydXB0cy4KIAkgKi8KKwlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWxvY2FsX2ZpcV9lbmFibGUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKaW5kZXggMDEyODY4Ny4uYjNlYzY0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCkBAIC0yNyw4ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBkb19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG9sZF9sZW4sCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N5c19vYWJpLWNvbXBhdC5jIGIvYXJjaC9hcm0va2VybmVsL3N5c19vYWJpLWNvbXBhdC5jCmluZGV4IDk2YWI1ZjUuLjQyNjIzZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfb2FiaS1jb21wYXQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3lzX29hYmktY29tcGF0LmMKQEAgLTgyLDcgKzgyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogc3RydWN0IG9sZGFiaV9zdGF0NjQgewogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9kZXY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwppbmRleCAzNjhkMTcxLi5jNjhiNDRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogCWlmIChpbl9sb2NrX2Z1bmN0aW9ucyhwYykpIHsKIAkJZnAgPSByZWdzLT5BUk1fZnA7Ci0JCXBjID0gcGNfcG9pbnRlcigoKHVuc2lnbmVkIGxvbmcgKilmcClbLTFdKTsKKwkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbLTFdOwogCX0KIAogCXJldHVybiBwYzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggODcyZjFmOC4uNTdlNjg3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTE5LDE1ICsxOSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgInB0cmFjZS5oIgogI2luY2x1ZGUgInNpZ25hbC5oIgpAQCAtNjksNyArNjcsOCBAQAogICovCiBzdGF0aWMgaW50IHZlcmlmeV9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQogewotCWlmIChzcCA8IFBBR0VfT0ZGU0VUIHx8IChzcCA+ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5ICYmIGhpZ2hfbWVtb3J5ICE9IDApKQorCWlmIChzcCA8IFBBR0VfT0ZGU0VUIHx8CisJICAgIChzcCA+ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5ICYmIGhpZ2hfbWVtb3J5ICE9IE5VTEwpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwpAQCAtMzI4LDE3ICszMjcsNiBAQAogCQlnZXRfdXNlcihpbnN0ciwgKHUzMiBfX3VzZXIgKilwYyk7CiAJfQogCi0jaWZkZWYgQ09ORklHX0tQUk9CRVMKLQkvKgotCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgcmVjdXJzaXZlIGtwcm9iZXMsIHNvIHdlIGNhbid0IGNhbGwKLQkgKiB0aGUga3Byb2JlIHRyYXAgaGFuZGxlciB3aXRoIHRoZSB1bmRlZl9sb2NrIGhlbGQuCi0JICovCi0JaWYgKGluc3RyID09IEtQUk9CRV9CUkVBS1BPSU5UX0lOU1RSVUNUSU9OICYmICF1c2VyX21vZGUocmVncykpIHsKLQkJa3Byb2JlX3RyYXBfaGFuZGxlcihyZWdzLCBpbnN0cik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQogCWlmIChjYWxsX3VuZGVmX2hvb2socmVncywgaW5zdHIpID09IDApCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYyBiL2FyY2gvYXJtL2tlcm5lbC94c2NhbGUtY3AwLmMKaW5kZXggMTgwMDAwYi4uMTcxMjdkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYworKysgYi9hcmNoL2FybS9rZXJuZWwveHNjYWxlLWNwMC5jCkBAIC0xNCw4ICsxNCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX25vdGlmeS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHNwX3NhdmVfc3RhdGUodTMyICpzdGF0ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9hc2hsZGkzLlMgYi9hcmNoL2FybS9saWIvYXNobGRpMy5TCmluZGV4IDU1ZTU3YTFjLi4xMTU0ZDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvYXNobGRpMy5TCisrKyBiL2FyY2gvYXJtL2xpYi9hc2hsZGkzLlMKQEAgLTQ3LDMgKzQ3LDUgQEAKIAltb3YJYWwsIGFsLCBsc2wgcjIKIAltb3YJcGMsIGxyCiAKK0VORFBST0MoX19hc2hsZGkzKQorRU5EUFJPQyhfX2FlYWJpX2xsc2wpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYXNocmRpMy5TIGIvYXJjaC9hcm0vbGliL2FzaHJkaTMuUwppbmRleCAwYjMxMzk4Li45ZjhiMzU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvYXNocmRpMy5TCisrKyBiL2FyY2gvYXJtL2xpYi9hc2hyZGkzLlMKQEAgLTQ3LDMgKzQ3LDUgQEAKIAltb3YJYWgsIGFoLCBhc3IgcjIKIAltb3YJcGMsIGxyCiAKK0VORFBST0MoX19hc2hyZGkzKQorRU5EUFJPQyhfX2FlYWJpX2xhc3IpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYmFja3RyYWNlLlMgYi9hcmNoL2FybS9saWIvYmFja3RyYWNlLlMKaW5kZXggODRkYzg5MC4uYjA5NTFkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2JhY2t0cmFjZS5TCisrKyBiL2FyY2gvYXJtL2xpYi9iYWNrdHJhY2UuUwpAQCAtMzAsNiArMzAsOCBAQAogCiAjaWYgIWRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpIHx8ICFkZWZpbmVkKENPTkZJR19QUklOVEspCiAJCW1vdglwYywgbHIKK0VORFBST0MoX19iYWNrdHJhY2UpCitFTkRQUk9DKGNfYmFja3RyYWNlKQogI2Vsc2UKIAkJc3RtZmQJc3AhLCB7cjQgLSByOCwgbHJ9CUAgU2F2ZSBhbiBleHRyYSByZWdpc3RlciBzbyB3ZSBoYXZlIGEgbG9jYXRpb24uLi4KIAkJbW92cwlmcmFtZSwgcjAJCUAgaWYgZnJhbWUgcG9pbnRlciBpcyB6ZXJvCkBAIC0xMDMsNiArMTA1LDggQEAKIAkJbW92CXIxLCBmcmFtZQogCQlibAlwcmludGsKIG5vX2ZyYW1lOglsZG1mZAlzcCEsIHtyNCAtIHI4LCBwY30KK0VORFBST0MoX19iYWNrdHJhY2UpCitFTkRQUk9DKGNfYmFja3RyYWNlKQogCQkKIAkJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKIAkJLmFsaWduCTMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jaGFuZ2ViaXQuUyBiL2FyY2gvYXJtL2xpYi9jaGFuZ2ViaXQuUwppbmRleCAzODk1NjdjLi44MGYzMTE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY2hhbmdlYml0LlMKKysrIGIvYXJjaC9hcm0vbGliL2NoYW5nZWJpdC5TCkBAIC0xOSwzICsxOSw1IEBACiAJCWVvcglyMCwgcjAsICMweDE4CQlAIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZwogRU5UUlkoX2NoYW5nZV9iaXRfbGUpCiAJYml0b3AJZW9yCitFTkRQUk9DKF9jaGFuZ2VfYml0X2JlKQorRU5EUFJPQyhfY2hhbmdlX2JpdF9sZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jbGVhcl91c2VyLlMgYi9hcmNoL2FybS9saWIvY2xlYXJfdXNlci5TCmluZGV4IGVjYjI4ZGMuLjRkNmJjNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jbGVhcl91c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL2NsZWFyX3VzZXIuUwpAQCAtNDEsOSArNDEsMTAgQEAKIFVTRVIoCQlzdHJuZWJ0CXIyLCBbcjBdLCAjMSkKIFVTRVIoCQlzdHJuZWJ0CXIyLCBbcjBdLCAjMSkKIAkJdHN0CXIxLCAjMQkJCUAgeDEgeDAgeDEgeDAgeDEgeDAgeDEKLVVTRVIoCQlzdHJuZWJ0CXIyLCBbcjBdLCAjMSkKK1VTRVIoCQlzdHJuZWJ0CXIyLCBbcjBdKQogCQltb3YJcjAsICMwCiAJCWxkbWZkCXNwISwge3IxLCBwY30KK0VORFBST0MoX19jbGVhcl91c2VyKQogCiAJCS5zZWN0aW9uIC5maXh1cCwiYXgiCiAJCS5hbGlnbgkwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY2xlYXJiaXQuUyBiL2FyY2gvYXJtL2xpYi9jbGVhcmJpdC5TCmluZGV4IDM0NzUxNjUuLjFhNjNlNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jbGVhcmJpdC5TCisrKyBiL2FyY2gvYXJtL2xpYi9jbGVhcmJpdC5TCkBAIC0yMCwzICsyMCw1IEBACiAJCWVvcglyMCwgcjAsICMweDE4CQlAIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcmluZwogRU5UUlkoX2NsZWFyX2JpdF9sZSkKIAliaXRvcAliaWMKK0VORFBST0MoX2NsZWFyX2JpdF9iZSkKK0VORFBST0MoX2NsZWFyX2JpdF9sZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jb3B5X2Zyb21fdXNlci5TIGIvYXJjaC9hcm0vbGliL2NvcHlfZnJvbV91c2VyLlMKaW5kZXggNmI3MzYzYy4uNTY3OTlhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2NvcHlfZnJvbV91c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL2NvcHlfZnJvbV91c2VyLlMKQEAgLTg3LDYgKzg3LDggQEAKIAogI2luY2x1ZGUgImNvcHlfdGVtcGxhdGUuUyIKIAorRU5EUFJPQyhfX2NvcHlfZnJvbV91c2VyKQorCiAJLnNlY3Rpb24gLmZpeHVwLCJheCIKIAkuYWxpZ24gMAogCWNvcHlfYWJvcnRfcHJlYW1ibGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUyBiL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUwppbmRleCA2NjZjOTljLi42YWUwNGRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TCkBAIC00NCwzICs0NCw0IEBACiAJUExEKAlsZG1lcWlhIHIxISwge3IzLCByNCwgaXAsIGxyfQkpCiAJUExEKAliZXEJMmIJCQkpCiAJCWxkbWZkCXNwISwge3I0LCBwY30JCQlACTMKK0VORFBST0MoY29weV9wYWdlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfdG9fdXNlci5TIGIvYXJjaC9hcm0vbGliL2NvcHlfdG9fdXNlci5TCmluZGV4IDUyMjRkOTQuLjIyZjk2OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3RvX3VzZXIuUworKysgYi9hcmNoL2FybS9saWIvY29weV90b191c2VyLlMKQEAgLTkwLDYgKzkwLDggQEAKIAogI2luY2x1ZGUgImNvcHlfdGVtcGxhdGUuUyIKIAorRU5EUFJPQyhfX2NvcHlfdG9fdXNlcikKKwogCS5zZWN0aW9uIC5maXh1cCwiYXgiCiAJLmFsaWduIDAKIAljb3B5X2Fib3J0X3ByZWFtYmxlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bWlwdjYuUyBiL2FyY2gvYXJtL2xpYi9jc3VtaXB2Ni5TCmluZGV4IDk2MjE0NjkuLjNhYzZlZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtaXB2Ni5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtaXB2Ni5TCkBAIC0yOSw0ICsyOSw1IEBACiAJCWFkY3MJcjAsIHIwLCByMgogCQlhZGNzCXIwLCByMCwgIzAKIAkJbGRtZmQJc3AhLCB7cGN9CitFTkRQUk9DKF9fY3N1bV9pcHY2X21hZ2ljKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWwuUyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbC5TCmluZGV4IGE3OGRhZTUuLjMxZDNjYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbC5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbC5TCkBAIC0xMzksMyArMTM5LDQgQEAKIAkJdHN0CWxlbiwgIzB4MWMKIAkJYm5lCTRiCiAJCWIJLkxsZXNzNAorRU5EUFJPQyhjc3VtX3BhcnRpYWwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5LlMgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5LlMKaW5kZXggMjFlZmZlMC4uZDAzZmM3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weS5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHkuUwpAQCAtMTgsMTMgKzE4LDExIEBACiAgKi8KIAogCQkubWFjcm8Jc2F2ZV9yZWdzCi0JCW1vdglpcCwgc3AKLQkJc3RtZmQJc3AhLCB7cjEsIHI0IC0gcjgsIGZwLCBpcCwgbHIsIHBjfQotCQlzdWIJZnAsIGlwLCAjNAorCQlzdG1mZAlzcCEsIHtyMSwgcjQgLSByOCwgbHJ9CiAJCS5lbmRtCiAKIAkJLm1hY3JvCWxvYWRfcmVncwotCQlsZG1mZAlzcCwge3IxLCByNCAtIHI4LCBmcCwgc3AsIHBjfQorCQlsZG1mZAlzcCEsIHtyMSwgcjQgLSByOCwgcGN9CiAJCS5lbmRtCiAKIAkJLm1hY3JvCWxvYWQxYiwgcmVnMQpAQCAtNTAsNSArNDgsNiBAQAogCQkuZW5kbQogCiAjZGVmaW5lIEZOX0VOVFJZCUVOVFJZKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spCisjZGVmaW5lIEZOX0VYSVQJCUVORFBST0MoY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaykKIAogI2luY2x1ZGUgImNzdW1wYXJ0aWFsY29weWdlbmVyaWMuUyIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TCmluZGV4IGM1MGU4ZjUuLmQ2MjBhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHlnZW5lcmljLlMKKysrIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwpAQCAtMzI5LDMgKzMyOSw0IEBACiAJCWFkY3MJc3VtLCBzdW0sIHI0LCBwdXNoICMyNAogCQltb3YJcjUsIHI0LCBnZXRfYnl0ZV8xCiAJCWIJLkxleGl0CitGTl9FWElUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TIGIvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUwppbmRleCBjM2I5M2UyLi4xNDY3N2ZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCisrKyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKQEAgLTE4LDEzICsxOCwxMSBAQAogCQkudGV4dAogCiAJCS5tYWNybwlzYXZlX3JlZ3MKLQkJbW92CWlwLCBzcAotCQlzdG1mZAlzcCEsIHtyMSAtIHIyLCByNCAtIHI4LCBmcCwgaXAsIGxyLCBwY30KLQkJc3ViCWZwLCBpcCwgIzQKKwkJc3RtZmQJc3AhLCB7cjEsIHIyLCByNCAtIHI4LCBscn0KIAkJLmVuZG0KIAogCQkubWFjcm8JbG9hZF9yZWdzCi0JCWxkbWZkCXNwLCB7cjEsIHIyLCByNC1yOCwgZnAsIHNwLCBwY30KKwkJbGRtZmQJc3AhLCB7cjEsIHIyLCByNCAtIHI4LCBwY30KIAkJLmVuZG0KIAogCQkubWFjcm8JbG9hZDFiLAlyZWcxCkBAIC04Miw2ICs4MCw3IEBACiAgKi8KIAogI2RlZmluZSBGTl9FTlRSWQlFTlRSWShjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpCisjZGVmaW5lIEZOX0VYSVQJCUVORFBST0MoY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKQogCiAjaW5jbHVkZSAiY3N1bXBhcnRpYWxjb3B5Z2VuZXJpYy5TIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZGVsYXkuUyBiL2FyY2gvYXJtL2xpYi9kZWxheS5TCmluZGV4IDkzMGE3MDIuLjhkNmE4NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9kZWxheS5TCisrKyBiL2FyY2gvYXJtL2xpYi9kZWxheS5TCkBAIC02MCwzICs2MCw2IEBACiAjZW5kaWYKIAkJYmhpCV9fZGVsYXkKIAkJbW92CXBjLCBscgorRU5EUFJPQyhfX3VkZWxheSkKK0VORFBST0MoX19jb25zdF91ZGVsYXkpCitFTkRQUk9DKF9fZGVsYXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZGl2NjQuUyBiL2FyY2gvYXJtL2xpYi9kaXY2NC5TCmluZGV4IDU4ZWVmNjYuLjE0MjVlNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9kaXY2NC5TCisrKyBiL2FyY2gvYXJtL2xpYi9kaXY2NC5TCkBAIC0xOTgsMyArMTk4LDQgQEAKIAltb3YJeGgsICMwCiAJbGRyCXBjLCBbc3BdLCAjOAogCitFTkRQUk9DKF9fZG9fZGl2NjQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZmluZGJpdC5TIGIvYXJjaC9hcm0vbGliL2ZpbmRiaXQuUwppbmRleCBhNWNhMDI0Li44YzRkZWZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvZmluZGJpdC5TCisrKyBiL2FyY2gvYXJtL2xpYi9maW5kYml0LlMKQEAgLTMzLDYgKzMzLDcgQEAKIAkJYmxvCTFiCiAzOgkJbW92CXIwLCByMQkJCUAgbm8gZnJlZSBiaXRzCiAJCW1vdglwYywgbHIKK0VORFBST0MoX2ZpbmRfZmlyc3RfemVyb19iaXRfbGUpCiAKIC8qCiAgKiBQdXJwb3NlICA6IEZpbmQgbmV4dCAnemVybycgYml0CkBAIC01MCw2ICs1MSw3IEBACiAJCW9ycglyMiwgcjIsICM3CQlAIGlmIHplcm8sIHRoZW4gbm8gYml0cyBoZXJlCiAJCWFkZAlyMiwgcjIsICMxCQlAIGFsaWduIGJpdCBwb2ludGVyCiAJCWIJMmIJCQlAIGxvb3AgZm9yIG5leHQgYml0CitFTkRQUk9DKF9maW5kX25leHRfemVyb19iaXRfbGUpCiAKIC8qCiAgKiBQdXJwb3NlICA6IEZpbmQgYSAnb25lJyBiaXQKQEAgLTY3LDYgKzY5LDcgQEAKIAkJYmxvCTFiCiAzOgkJbW92CXIwLCByMQkJCUAgbm8gZnJlZSBiaXRzCiAJCW1vdglwYywgbHIKK0VORFBST0MoX2ZpbmRfZmlyc3RfYml0X2xlKQogCiAvKgogICogUHVycG9zZSAgOiBGaW5kIG5leHQgJ29uZScgYml0CkBAIC04Myw2ICs4Niw3IEBACiAJCW9ycglyMiwgcjIsICM3CQlAIGlmIHplcm8sIHRoZW4gbm8gYml0cyBoZXJlCiAJCWFkZAlyMiwgcjIsICMxCQlAIGFsaWduIGJpdCBwb2ludGVyCiAJCWIJMmIJCQlAIGxvb3AgZm9yIG5leHQgYml0CitFTkRQUk9DKF9maW5kX25leHRfYml0X2xlKQogCiAjaWZkZWYgX19BUk1FQl9fCiAKQEAgLTk5LDYgKzEwMyw3IEBACiAJCWJsbwkxYgogMzoJCW1vdglyMCwgcjEJCQlAIG5vIGZyZWUgYml0cwogCQltb3YJcGMsIGxyCitFTkRQUk9DKF9maW5kX2ZpcnN0X3plcm9fYml0X2JlKQogCiBFTlRSWShfZmluZF9uZXh0X3plcm9fYml0X2JlKQogCQl0ZXEJcjEsICMwCkBAIC0xMTMsNiArMTE4LDcgQEAKIAkJb3JyCXIyLCByMiwgIzcJCUAgaWYgemVybywgdGhlbiBubyBiaXRzIGhlcmUKIAkJYWRkCXIyLCByMiwgIzEJCUAgYWxpZ24gYml0IHBvaW50ZXIKIAkJYgkyYgkJCUAgbG9vcCBmb3IgbmV4dCBiaXQKK0VORFBST0MoX2ZpbmRfbmV4dF96ZXJvX2JpdF9iZSkKIAogRU5UUlkoX2ZpbmRfZmlyc3RfYml0X2JlKQogCQl0ZXEJcjEsICMwCkBAIC0xMjcsNiArMTMzLDcgQEAKIAkJYmxvCTFiCiAzOgkJbW92CXIwLCByMQkJCUAgbm8gZnJlZSBiaXRzCiAJCW1vdglwYywgbHIKK0VORFBST0MoX2ZpbmRfZmlyc3RfYml0X2JlKQogCiBFTlRSWShfZmluZF9uZXh0X2JpdF9iZSkKIAkJdGVxCXIxLCAjMApAQCAtMTQwLDYgKzE0Nyw3IEBACiAJCW9ycglyMiwgcjIsICM3CQlAIGlmIHplcm8sIHRoZW4gbm8gYml0cyBoZXJlCiAJCWFkZAlyMiwgcjIsICMxCQlAIGFsaWduIGJpdCBwb2ludGVyCiAJCWIJMmIJCQlAIGxvb3AgZm9yIG5leHQgYml0CitFTkRQUk9DKF9maW5kX25leHRfYml0X2JlKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2dldHVzZXIuUyBiL2FyY2gvYXJtL2xpYi9nZXR1c2VyLlMKaW5kZXggMjAzNGQ0ZC4uNjc2MzA4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2dldHVzZXIuUworKysgYi9hcmNoL2FybS9saWIvZ2V0dXNlci5TCkBAIC0yNiwxNiArMjYsMTYgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAuCiAgKiBOb3RlIGFsc28gdGhhdCBpdCBpcyBpbnRlbmRlZCB0aGF0IF9fZ2V0X3VzZXJfYmFkIGlzIG5vdCBnbG9iYWwuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKLQkuZ2xvYmFsCV9fZ2V0X3VzZXJfMQotX19nZXRfdXNlcl8xOgorRU5UUlkoX19nZXRfdXNlcl8xKQogMToJbGRyYnQJcjIsIFtyMF0KIAltb3YJcjAsICMwCiAJbW92CXBjLCBscgorRU5EUFJPQyhfX2dldF91c2VyXzEpCiAKLQkuZ2xvYmFsCV9fZ2V0X3VzZXJfMgotX19nZXRfdXNlcl8yOgorRU5UUlkoX19nZXRfdXNlcl8yKQogMjoJbGRyYnQJcjIsIFtyMF0sICMxCiAzOglsZHJidAlyMywgW3IwXQogI2lmbmRlZiBfX0FSTUVCX18KQEAgLTQ1LDE3ICs0NSwxOSBAQAogI2VuZGlmCiAJbW92CXIwLCAjMAogCW1vdglwYywgbHIKK0VORFBST0MoX19nZXRfdXNlcl8yKQogCi0JLmdsb2JhbAlfX2dldF91c2VyXzQKLV9fZ2V0X3VzZXJfNDoKK0VOVFJZKF9fZ2V0X3VzZXJfNCkKIDQ6CWxkcnQJcjIsIFtyMF0KIAltb3YJcjAsICMwCiAJbW92CXBjLCBscgorRU5EUFJPQyhfX2dldF91c2VyXzQpCiAKIF9fZ2V0X3VzZXJfYmFkOgogCW1vdglyMiwgIzAKIAltb3YJcjAsICMtRUZBVUxUCiAJbW92CXBjLCBscgorRU5EUFJPQyhfX2dldF91c2VyX2JhZCkKIAogLnNlY3Rpb24gX19leF90YWJsZSwgImEiCiAJLmxvbmcJMWIsIF9fZ2V0X3VzZXJfYmFkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8tcmVhZHNiLlMgYi9hcmNoL2FybS9saWIvaW8tcmVhZHNiLlMKaW5kZXggZmI5NjZhZC4uOWY0MjM4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2lvLXJlYWRzYi5TCisrKyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc2IuUwpAQCAtMTIwLDMgKzEyMCw0IEBACiAJCXN0cmd0YglyMywgW3IxXQogCiAJCWxkbWZkCXNwISwge3I0IC0gcjYsIHBjfQorRU5EUFJPQyhfX3Jhd19yZWFkc2IpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8tcmVhZHNsLlMgYi9hcmNoL2FybS9saWIvaW8tcmVhZHNsLlMKaW5kZXggNzVhOTEyMS4uNWZiOTdlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2lvLXJlYWRzbC5TCisrKyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc2wuUwpAQCAtNzYsMyArNzYsNCBAQAogODoJCW1vdglyMywgaXAsIGdldF9ieXRlXzAKIAkJc3RyYglyMywgW3IxLCAjMF0KIAkJbW92CXBjLCBscgorRU5EUFJPQyhfX3Jhd19yZWFkc2wpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8tcmVhZHN3LWFybXY0LlMgYi9hcmNoL2FybS9saWIvaW8tcmVhZHN3LWFybXY0LlMKaW5kZXggNGRiMWM1Zi4uMWYzOTNkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2lvLXJlYWRzdy1hcm12NC5TCisrKyBiL2FyY2gvYXJtL2xpYi9pby1yZWFkc3ctYXJtdjQuUwpAQCAtMTI4LDMgKzEyOCw0IEBACiAgICBfQkVfT05MWV8oCW1vdm5lCWlwLCBpcCwgbHNyICMyNAkJKQogCQlzdHJuZWIJaXAsIFtyMV0KIAkJbGRtZmQJc3AhLCB7cjQsIHBjfQorRU5EUFJPQyhfX3Jhd19yZWFkc3cpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvaW8td3JpdGVzYi5TIGIvYXJjaC9hcm0vbGliL2lvLXdyaXRlc2IuUwppbmRleCA3ZWJhMmI2Li42OGI5MmY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvaW8td3JpdGVzYi5TCisrKyBiL2FyY2gvYXJtL2xpYi9pby13cml0ZXNiLlMKQEAgLTkxLDMgKzkxLDQgQEAKIAkJc3RyZ3RiCXIzLCBbcjBdCiAKIAkJbGRtZmQJc3AhLCB7cjQsIHI1LCBwY30KK0VORFBST0MoX19yYXdfd3JpdGVzYikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9pby13cml0ZXNsLlMgYi9hcmNoL2FybS9saWIvaW8td3JpdGVzbC5TCmluZGV4IGY4ZjE0ZGQuLjhkM2I3ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9pby13cml0ZXNsLlMKKysrIGIvYXJjaC9hcm0vbGliL2lvLXdyaXRlc2wuUwpAQCAtNjQsMyArNjQsNCBAQAogCQlzdHIJaXAsIFtyMF0KIAkJYm5lCTZiCiAJCW1vdglwYywgbHIKK0VORFBST0MoX19yYXdfd3JpdGVzbCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXY0LlMgYi9hcmNoL2FybS9saWIvaW8td3JpdGVzdy1hcm12NC5TCmluZGV4IGM4ZTg1YmQuLmQ2NTg1NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9pby13cml0ZXN3LWFybXY0LlMKKysrIGIvYXJjaC9hcm0vbGliL2lvLXdyaXRlc3ctYXJtdjQuUwpAQCAtOTQsMyArOTQsNCBAQAogMzoJCW1vdm5lCWlwLCByMywgbHNyICM4CiAJCXN0cm5laAlpcCwgW3IwXQogCQltb3YJcGMsIGxyCitFTkRQUk9DKF9fcmF3X3dyaXRlc3cpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvbGliMWZ1bmNzLlMgYi9hcmNoL2FybS9saWIvbGliMWZ1bmNzLlMKaW5kZXggNGU0OTJmNC4uNjc5NjRiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2xpYjFmdW5jcy5TCisrKyBiL2FyY2gvYXJtL2xpYi9saWIxZnVuY3MuUwpAQCAtMjMwLDYgKzIzMCw4IEBACiAJbW92CXIwLCByMCwgbHNyIHIyCiAJbW92CXBjLCBscgogCitFTkRQUk9DKF9fdWRpdnNpMykKK0VORFBST0MoX19hZWFiaV91aWRpdikKIAogRU5UUlkoX191bW9kc2kzKQogCkBAIC0yNDUsNiArMjQ3LDcgQEAKIAogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX3Vtb2RzaTMpCiAKIEVOVFJZKF9fZGl2c2kzKQogRU5UUlkoX19hZWFiaV9pZGl2KQpAQCAtMjg0LDYgKzI4Nyw4IEBACiAJcnNibWkJcjAsIHIwLCAjMAogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX2RpdnNpMykKK0VORFBST0MoX19hZWFiaV9pZGl2KQogCiBFTlRSWShfX21vZHNpMykKIApAQCAtMzA1LDYgKzMxMCw4IEBACiAJcnNibWkJcjAsIHIwLCAjMAogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX21vZHNpMykKKwogI2lmZGVmIENPTkZJR19BRUFCSQogCiBFTlRSWShfX2FlYWJpX3VpZGl2bW9kKQpAQCAtMzE2LDYgKzMyMyw4IEBACiAJc3ViCXIxLCByMSwgcjMKIAltb3YJcGMsIGxyCiAKK0VORFBST0MoX19hZWFiaV91aWRpdm1vZCkKKwogRU5UUlkoX19hZWFiaV9pZGl2bW9kKQogCiAJc3RtZmQJc3AhLCB7cjAsIHIxLCBpcCwgbHJ9CkBAIC0zMjUsNiArMzM0LDggQEAKIAlzdWIJcjEsIHIxLCByMwogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX2FlYWJpX2lkaXZtb2QpCisKICNlbmRpZgogCiBMZGl2MDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9sc2hyZGkzLlMgYi9hcmNoL2FybS9saWIvbHNocmRpMy5TCmluZGV4IGE4NmRiZGQuLjk5ZWEzMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9sc2hyZGkzLlMKKysrIGIvYXJjaC9hcm0vbGliL2xzaHJkaTMuUwpAQCAtNDcsMyArNDcsNSBAQAogCW1vdglhaCwgYWgsIGxzciByMgogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX2xzaHJkaTMpCitFTkRQUk9DKF9fYWVhYmlfbGxzcikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9tZW1jaHIuUyBiL2FyY2gvYXJtL2xpYi9tZW1jaHIuUwppbmRleCBlN2FiMWVhLi4xZGE4Njk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvbWVtY2hyLlMKKysrIGIvYXJjaC9hcm0vbGliL21lbWNoci5TCkBAIC0yMywzICsyMyw0IEBACiAJc3ViCXIwLCByMCwgIzEKIDI6CW1vdm5lCXIwLCAjMAogCW1vdglwYywgbHIKK0VORFBST0MobWVtY2hyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL21lbWNweS5TIGIvYXJjaC9hcm0vbGliL21lbWNweS5TCmluZGV4IDdlNzFkNjcuLmUwZDAwMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9tZW1jcHkuUworKysgYi9hcmNoL2FybS9saWIvbWVtY3B5LlMKQEAgLTU3LDMgKzU3LDQgQEAKIAogI2luY2x1ZGUgImNvcHlfdGVtcGxhdGUuUyIKIAorRU5EUFJPQyhtZW1jcHkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvbWVtbW92ZS5TIGIvYXJjaC9hcm0vbGliL21lbW1vdmUuUwppbmRleCAyZTMwMWI3Li4xMjU0OTE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvbWVtbW92ZS5TCisrKyBiL2FyY2gvYXJtL2xpYi9tZW1tb3ZlLlMKQEAgLTE5NiwzICsxOTYsNCBAQAogCiAxODoJCWJhY2t3YXJkX2NvcHlfc2hpZnQJcHVzaD0yNAlwdWxsPTgKIAorRU5EUFJPQyhtZW1tb3ZlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL21lbXNldC5TIGIvYXJjaC9hcm0vbGliL21lbXNldC5TCmluZGV4IGI0NzdkNGEuLjc2MWVlZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL2FybS9saWIvbWVtc2V0LlMKQEAgLTEyNCwzICsxMjQsNCBAQAogCXRzdAlyMiwgIzEKIAlzdHJuZWIJcjEsIFtyMF0sICMxCiAJbW92CXBjLCBscgorRU5EUFJPQyhtZW1zZXQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvbWVtemVyby5TIGIvYXJjaC9hcm0vbGliL21lbXplcm8uUwppbmRleCBiOGY3OWQ4Li4zZmJkZWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvbWVtemVyby5TCisrKyBiL2FyY2gvYXJtL2xpYi9tZW16ZXJvLlMKQEAgLTEyMiwzICsxMjIsNCBAQAogCXRzdAlyMSwgIzEJCQlAIDEgYSBieXRlIGxlZnQgb3ZlcgogCXN0cm5lYglyMiwgW3IwXSwgIzEJCUAgMQogCW1vdglwYywgbHIJCQlAIDEKK0VORFBST0MoX19tZW16ZXJvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL211bGRpMy5TIGIvYXJjaC9hcm0vbGliL211bGRpMy5TCmluZGV4IGQ4OWM2MDYuLjM2YzkxYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9tdWxkaTMuUworKysgYi9hcmNoL2FybS9saWIvbXVsZGkzLlMKQEAgLTQzLDMgKzQzLDUgQEAKIAlhZGMJeGgsIHhoLCBpcCwgbHNyICMxNgogCW1vdglwYywgbHIKIAorRU5EUFJPQyhfX211bGRpMykKK0VORFBST0MoX19hZWFiaV9sbXVsKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3B1dHVzZXIuUyBiL2FyY2gvYXJtL2xpYi9wdXR1c2VyLlMKaW5kZXggMDhlYzdkZi4uODY0ZjNjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3B1dHVzZXIuUworKysgYi9hcmNoL2FybS9saWIvcHV0dXNlci5TCkBAIC0yNiwxNiArMjYsMTYgQEAKICAqIE5vdGUgdGhhdCBBRERSX0xJTUlUIGlzIGVpdGhlciAwIG9yIDB4YzAwMDAwMDAKICAqIE5vdGUgYWxzbyB0aGF0IGl0IGlzIGludGVuZGVkIHRoYXQgX19wdXRfdXNlcl9iYWQgaXMgbm90IGdsb2JhbC4KICAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAotCS5nbG9iYWwJX19wdXRfdXNlcl8xCi1fX3B1dF91c2VyXzE6CitFTlRSWShfX3B1dF91c2VyXzEpCiAxOglzdHJidAlyMiwgW3IwXQogCW1vdglyMCwgIzAKIAltb3YJcGMsIGxyCitFTkRQUk9DKF9fcHV0X3VzZXJfMSkKIAotCS5nbG9iYWwJX19wdXRfdXNlcl8yCi1fX3B1dF91c2VyXzI6CitFTlRSWShfX3B1dF91c2VyXzIpCiAJbW92CWlwLCByMiwgbHNyICM4CiAjaWZuZGVmIF9fQVJNRUJfXwogMjoJc3RyYnQJcjIsIFtyMF0sICMxCkBAIC00NiwyMyArNDYsMjUgQEAKICNlbmRpZgogCW1vdglyMCwgIzAKIAltb3YJcGMsIGxyCitFTkRQUk9DKF9fcHV0X3VzZXJfMikKIAotCS5nbG9iYWwJX19wdXRfdXNlcl80Ci1fX3B1dF91c2VyXzQ6CitFTlRSWShfX3B1dF91c2VyXzQpCiA0OglzdHJ0CXIyLCBbcjBdCiAJbW92CXIwLCAjMAogCW1vdglwYywgbHIKK0VORFBST0MoX19wdXRfdXNlcl80KQogCi0JLmdsb2JhbAlfX3B1dF91c2VyXzgKLV9fcHV0X3VzZXJfODoKK0VOVFJZKF9fcHV0X3VzZXJfOCkKIDU6CXN0cnQJcjIsIFtyMF0sICM0CiA2OglzdHJ0CXIzLCBbcjBdCiAJbW92CXIwLCAjMAogCW1vdglwYywgbHIKK0VORFBST0MoX19wdXRfdXNlcl84KQogCiBfX3B1dF91c2VyX2JhZDoKIAltb3YJcjAsICMtRUZBVUxUCiAJbW92CXBjLCBscgorRU5EUFJPQyhfX3B1dF91c2VyX2JhZCkKIAogLnNlY3Rpb24gX19leF90YWJsZSwgImEiCiAJLmxvbmcJMWIsIF9fcHV0X3VzZXJfYmFkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvc2V0Yml0LlMgYi9hcmNoL2FybS9saWIvc2V0Yml0LlMKaW5kZXggODNiYzIzZC4uMWRkNzE3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3NldGJpdC5TCisrKyBiL2FyY2gvYXJtL2xpYi9zZXRiaXQuUwpAQCAtMjAsMyArMjAsNSBAQAogCQllb3IJcjAsIHIwLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKIEVOVFJZKF9zZXRfYml0X2xlKQogCWJpdG9wCW9ycgorRU5EUFJPQyhfc2V0X2JpdF9iZSkKK0VORFBST0MoX3NldF9iaXRfbGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvc2hhMS5TIGIvYXJjaC9hcm0vbGliL3NoYTEuUwppbmRleCA2N2MyYmY0Li5hMTZmYjIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvc2hhMS5TCisrKyBiL2FyY2gvYXJtL2xpYi9zaGExLlMKQEAgLTE4NSw2ICsxODUsOCBAQAogCiAJbGRtZmQJc3AhLCB7cjQgLSByOCwgcGN9CiAKK0VORFBST0Moc2hhX3RyYW5zZm9ybSkKKwogLkxfc2hhX0s6CiAJLndvcmQJMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNgogCkBAIC0yMDQsMyArMjA2LDQgQEAKIAlzdG1pYQlyMCwge3IxLCByMiwgcjMsIGlwLCBscn0KIAlsZHIJcGMsIFtzcF0sICM0CiAKK0VORFBST0Moc2hhX2luaXQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvc3RyY2hyLlMgYi9hcmNoL2FybS9saWIvc3RyY2hyLlMKaW5kZXggOWYxOGQ2Zi4uZDhmMmExYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3N0cmNoci5TCisrKyBiL2FyY2gvYXJtL2xpYi9zdHJjaHIuUwpAQCAtMjQsMyArMjQsNCBAQAogCQltb3ZuZQlyMCwgIzAKIAkJc3ViZXEJcjAsIHIwLCAjMQogCQltb3YJcGMsIGxyCitFTkRQUk9DKHN0cmNocikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9zdHJuY3B5X2Zyb21fdXNlci5TIGIvYXJjaC9hcm0vbGliL3N0cm5jcHlfZnJvbV91c2VyLlMKaW5kZXggMzZlMzc0MS4uMzMwMzczYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3N0cm5jcHlfZnJvbV91c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL3N0cm5jcHlfZnJvbV91c2VyLlMKQEAgLTMxLDYgKzMxLDcgQEAKIAlzdWIJcjEsIHIxLCAjMQlAIHRha2UgTlVMIGNoYXJhY3RlciBvdXQgb2YgY291bnQKIDI6CXN1YglyMCwgcjEsIGlwCiAJbW92CXBjLCBscgorRU5EUFJPQyhfX3N0cm5jcHlfZnJvbV91c2VyKQogCiAJLnNlY3Rpb24gLmZpeHVwLCJheCIKIAkuYWxpZ24JMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3N0cm5sZW5fdXNlci5TIGIvYXJjaC9hcm0vbGliL3N0cm5sZW5fdXNlci5TCmluZGV4IDE4ZDhmYTQuLjkwYmI5ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9zdHJubGVuX3VzZXIuUworKysgYi9hcmNoL2FybS9saWIvc3Rybmxlbl91c2VyLlMKQEAgLTMxLDYgKzMxLDcgQEAKIAlhZGQJcjAsIHIwLCAjMQogMjoJc3ViCXIwLCByMCwgcjIKIAltb3YJcGMsIGxyCitFTkRQUk9DKF9fc3Rybmxlbl91c2VyKQogCiAJLnNlY3Rpb24gLmZpeHVwLCJheCIKIAkuYWxpZ24JMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3N0cnJjaHIuUyBiL2FyY2gvYXJtL2xpYi9zdHJyY2hyLlMKaW5kZXggNTM4ZGYyMi4uMzAyZjIwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL3N0cnJjaHIuUworKysgYi9hcmNoL2FybS9saWIvc3RycmNoci5TCkBAIC0yMywzICsyMyw0IEBACiAJCWJuZQkxYgogCQltb3YJcjAsIHIzCiAJCW1vdglwYywgbHIKK0VORFBST0Moc3RycmNocikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi90ZXN0Y2hhbmdlYml0LlMgYi9hcmNoL2FybS9saWIvdGVzdGNoYW5nZWJpdC5TCmluZGV4IGIyNWRjZDIuLjVjOThkYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi90ZXN0Y2hhbmdlYml0LlMKKysrIGIvYXJjaC9hcm0vbGliL3Rlc3RjaGFuZ2ViaXQuUwpAQCAtMTYsMyArMTYsNSBAQAogCQllb3IJcjAsIHIwLCAjMHgxOAkJQCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXJpbmcKIEVOVFJZKF90ZXN0X2FuZF9jaGFuZ2VfYml0X2xlKQogCXRlc3RvcAllb3IsIHN0cmIKK0VORFBST0MoX3Rlc3RfYW5kX2NoYW5nZV9iaXRfYmUpCitFTkRQUk9DKF90ZXN0X2FuZF9jaGFuZ2VfYml0X2xlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3Rlc3RjbGVhcmJpdC5TIGIvYXJjaC9hcm0vbGliL3Rlc3RjbGVhcmJpdC5TCmluZGV4IDJkY2M0YjEuLjU0M2Q3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi90ZXN0Y2xlYXJiaXQuUworKysgYi9hcmNoL2FybS9saWIvdGVzdGNsZWFyYml0LlMKQEAgLTE2LDMgKzE2LDUgQEAKIAkJZW9yCXIwLCByMCwgIzB4MTgJCUAgYmlnIGVuZGlhbiBieXRlIG9yZGVyaW5nCiBFTlRSWShfdGVzdF9hbmRfY2xlYXJfYml0X2xlKQogCXRlc3RvcAliaWNuZSwgc3RybmViCitFTkRQUk9DKF90ZXN0X2FuZF9jbGVhcl9iaXRfYmUpCitFTkRQUk9DKF90ZXN0X2FuZF9jbGVhcl9iaXRfbGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvdGVzdHNldGJpdC5TIGIvYXJjaC9hcm0vbGliL3Rlc3RzZXRiaXQuUwppbmRleCA5MDExYzk2Li4wYjNmMzkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvdGVzdHNldGJpdC5TCisrKyBiL2FyY2gvYXJtL2xpYi90ZXN0c2V0Yml0LlMKQEAgLTE2LDMgKzE2LDUgQEAKIAkJZW9yCXIwLCByMCwgIzB4MTgJCUAgYmlnIGVuZGlhbiBieXRlIG9yZGVyaW5nCiBFTlRSWShfdGVzdF9hbmRfc2V0X2JpdF9sZSkKIAl0ZXN0b3AJb3JyZXEsIHN0cmVxYgorRU5EUFJPQyhfdGVzdF9hbmRfc2V0X2JpdF9iZSkKK0VORFBST0MoX3Rlc3RfYW5kX3NldF9iaXRfbGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvdWFjY2Vzcy5TIGIvYXJjaC9hcm0vbGliL3VhY2Nlc3MuUwppbmRleCBiNDhiZDZkLi5mZmRkMjc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvdWFjY2Vzcy5TCisrKyBiL2FyY2gvYXJtL2xpYi91YWNjZXNzLlMKQEAgLTI3Nyw2ICsyNzcsNyBAQAogCQlsZHJndGIJcjMsIFtyMV0sICMwCiBVU0VSKAkJc3RyZ3RidAlyMywgW3IwXSwgIzEpCQkJQCBNYXkgZmF1bHQKIAkJYgkuTGMydV9maW5pc2hlZAorRU5EUFJPQyhfX2NvcHlfdG9fdXNlcikKIAogCQkuc2VjdGlvbiAuZml4dXAsImF4IgogCQkuYWxpZ24JMApAQCAtNTQyLDYgKzU0Myw3IEBACiBVU0VSKAkJbGRyZ3RidAlyMywgW3IxXSwgIzEpCQkJQCBNYXkgZmF1bHQKIAkJc3RyZ3RiCXIzLCBbcjBdLCAjMQogCQliCS5MY2Z1X2ZpbmlzaGVkCitFTkRQUk9DKF9fY29weV9mcm9tX3VzZXIpCiAKIAkJLnNlY3Rpb24gLmZpeHVwLCJheCIKIAkJLmFsaWduCTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi91Y21wZGkyLlMgYi9hcmNoL2FybS9saWIvdWNtcGRpMi5TCmluZGV4IGY3NmRlMDcuLmYwZGY2YTkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9saWIvdWNtcGRpMi5TCisrKyBiL2FyY2gvYXJtL2xpYi91Y21wZGkyLlMKQEAgLTMzLDYgKzMzLDggQEAKIAltb3ZoaQlyMCwgIzIKIAltb3YJcGMsIGxyCiAKK0VORFBST0MoX191Y21wZGkyKQorCiAjaWZkZWYgQ09ORklHX0FFQUJJCiAKIEVOVFJZKF9fYWVhYmlfdWxjbXApCkBAIC00NCw1ICs0Niw3IEBACiAJbW92aGkJcjAsICMxCiAJbW92CXBjLCBscgogCitFTkRQUk9DKF9fYWVhYmlfdWxjbXApCisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCmluZGV4IGEwNDhiOTIuLjVhYWZiMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCkBAIC0xNzUsNiArMTc1LDE1IEBACiAJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIE9saW1leCdzIFNBTTktTDkyNjAgYm9hcmQgYmFzZWQgb24gdGhlIEF0bWVsIEFUOTFTQU05MjYwLgogCSAgPGh0dHA6Ly93d3cub2xpbWV4LmNvbS9kZXYvc2FtOS1MOTI2MC5odG1sPgogCitjb25maWcgTUFDSF9BRkVCOTI2MAorCWJvb2wgIkN1c3RvbSBhZmViOTI2MCBib2FyZCB2MSIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVNBTTkyNjAKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIGN1c3RvbSBhZmViOTI2MCBib2FyZCBiYXNlZCBvbgorCSAgb3BlbiBoYXJkd2FyZSBkZXNpZ24uIFNlbGVjdCB0aGlzIGZvciByZXZpc2lvbiAxIG9mIHRoZSBib2FyZC4KKwkgIDxzdm46Ly8xOTQuODUuMjM4LjIyL2hvbWUvdXNlcnMvZ2VvcmdlL3N2bi9hcm05ZWI+CisJICA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FybTlmcGdhLWV2b2x1dGlvbi1ib2FyZD4KKwogY29uZmlnIE1BQ0hfVVNCX0E5MjYwCiAJYm9vbCAiQ0FMQU8gVVNCLUE5MjYwIgogCWRlcGVuZHMgb24gQVJDSF9BVDkxU0FNOTI2MApAQCAtMzE0LDYgKzMyMywxOSBAQAogCSAgU2VsZWN0IHRoaXMgaWYgeW91IG5lZWQgdG8gcHJvZ3JhbSBvbmUgb3IgbW9yZSBvZiB0aGUgUENLMC4uUENLMwogCSAgcHJvZ3JhbW1hYmxlIGNsb2NrIG91dHB1dHMuCiAKK2NvbmZpZyBBVDkxX1NMT1dfQ0xPQ0sKKwlib29sICJTdXNwZW5kLXRvLVJBTSBkaXNhYmxlcyBtYWluIG9zY2lsbGF0b3IiCisJZGVwZW5kcyBvbiBTVVNQRU5ECisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgU3VzcGVuZC10by1SQU0gdG8gc2F2ZSB0aGUgbW9zdCBwb3dlcgorCSAgcG9zc2libGUgKHdpdGhvdXQgcG93ZXJpbmcgb2ZmIHRoZSBDUFUpIGJ5IGRpc2FibGluZyB0aGUgUExMcworCSAgYW5kIG1haW4gb3NjaWxsYXRvciBzbyB0aGF0IG9ubHkgdGhlIDMyIEtpSHogY2xvY2sgaXMgYXZhaWxhYmxlLgorCisJICBXaGVuIG9ubHkgdGhhdCBzbG93LWNsb2NrIGlzIGF2YWlsYWJsZSwgc29tZSBwZXJpcGhlcmFscyBsb3NlCisJICBmdW5jdGlvbmFsaXR5LiAgTWFueSBjYW4ndCBpc3N1ZSB3YWtldXAgZXZlbnRzIHVubGVzcyBmYXN0ZXIKKwkgIGNsb2NrcyBhcmUgYXZhaWxhYmxlLiAgU29tZSBsb3NlIHRoZWlyIG9wZXJhdGluZyBzdGF0ZSBhbmQKKwkgIG5lZWQgdG8gYmUgY29tcGxldGVseSByZS1pbml0aWFsaXplZC4KKwogY29uZmlnIEFUOTFfVElNRVJfSFoKICAgICAgICBpbnQgIktlcm5lbCBIWiAoamlmZmllcyBwZXIgc2Vjb25kKSIKICAgICAgICByYW5nZSAzMiAxMDI0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKaW5kZXggN2Q2NDFmOS4uY2NhNjEyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQpAQCAtMzksNiArMzksNyBAQAogb2JqLSQoQ09ORklHX01BQ0hfU0FNOV9MOTI2MCkJKz0gYm9hcmQtc2FtOS1sOTI2MC5vCiBvYmotJChDT05GSUdfTUFDSF9VU0JfQTkyNjApCSs9IGJvYXJkLXVzYi1hOTI2MC5vCiBvYmotJChDT05GSUdfTUFDSF9RSUxfQTkyNjApCSs9IGJvYXJkLXFpbC1hOTI2MC5vCitvYmotJChDT05GSUdfTUFDSF9BRkVCOTI2MCkJKz0gYm9hcmQtYWZlYi05MjYwdjEubwogCiAjIEFUOTFTQU05MjYxIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX0FUOTFTQU05MjYxRUspICs9IGJvYXJkLXNhbTkyNjFlay5vCkBAIC02NCw2ICs2NSw3IEBACiAKICMgUG93ZXIgTWFuYWdlbWVudAogb2JqLSQoQ09ORklHX1BNKQkJKz0gcG0ubworb2JqLSQoQ09ORklHX0FUOTFfU0xPV19DTE9DSykJKz0gcG1fc2xvd2Nsb2NrLm8KIAogaWZlcSAoJChDT05GSUdfUE1fREVCVUcpLHkpCiBDRkxBR1NfcG0ubyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCmluZGV4IDYzODk0OGMuLjBmYzBhZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCkBAIC0xNDEsOCArMTQxLDggQEAKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFDQVA5X0lEX1RDQiwKIAkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAogfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIHB3bWNfY2xrID0gewotCS5uYW1lCQk9ICJwd21jX2NsayIsCitzdGF0aWMgc3RydWN0IGNsayBwd21fY2xrID0geworCS5uYW1lCQk9ICJwd21fY2xrIiwKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFDQVA5X0lEX1BXTUMsCiAJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKIH07CkBAIC0yMDcsNyArMjA3LDcgQEAKIAkmc3NjMV9jbGssCiAJJmFjOTdfY2xrLAogCSZ0Y2JfY2xrLAotCSZwd21jX2NsaywKKwkmcHdtX2NsaywKIAkmbWFjYl9jbGssCiAJJmFlc3RkZXNfY2xrLAogCSZhZGNfY2xrLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKaW5kZXggYWJiNGFhYy4uNWViZDQyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCkBAIC03MTksNiArNzE5LDYwIEBACiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBQV00KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FUTUVMX1BXTSkKK3N0YXRpYyB1MzIgcHdtX21hc2s7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcHdtX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MUNBUDlfQkFTRV9QV01DLAorCQkuZW5kCT0gQVQ5MUNBUDlfQkFTRV9QV01DICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFDQVA5X0lEX1BXTUMsCisJCS5lbmQJPSBBVDkxQ0FQOV9JRF9QV01DLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MWNhcDlfcHdtMF9kZXZpY2UgPSB7CisJLm5hbWUJPSAiYXRtZWxfcHdtIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQkJPSAmcHdtX21hc2ssCisJfSwKKwkucmVzb3VyY2UJPSBwd21fcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwd21fcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9wd20odTMyIG1hc2spCit7CisJaWYgKG1hc2sgJiAoMSA8PCBBVDkxX1BXTTApKQorCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjE5LCAxKTsJLyogZW5hYmxlIFBXTTAgKi8KKworCWlmIChtYXNrICYgKDEgPDwgQVQ5MV9QV00xKSkKKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEI4LCAxKTsJLyogZW5hYmxlIFBXTTEgKi8KKworCWlmIChtYXNrICYgKDEgPDwgQVQ5MV9QV00yKSkKKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEMyOSwgMSk7CS8qIGVuYWJsZSBQV00yICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMykpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMTEsIDEpOwkvKiBlbmFibGUgUFdNMyAqLworCisJcHdtX21hc2sgPSBtYXNrOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxY2FwOV9wd20wX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3B3bSh1MzIgbWFzaykge30KKyNlbmRpZgorCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBBQzk3CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCmluZGV4IDgwYmZhYjUuLmFkYTRiNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCkBAIC0xMjksOCArMTI5LDggQEAKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYzX0lEX1RDQiwKIAkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAogfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrIHB3bWNfY2xrID0gewotCS5uYW1lCQk9ICJwd21jX2NsayIsCitzdGF0aWMgc3RydWN0IGNsayBwd21fY2xrID0geworCS5uYW1lCQk9ICJwd21fY2xrIiwKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYzX0lEX1BXTUMsCiAJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKIH07CkBAIC0xODcsNyArMTg3LDcgQEAKIAkmc3NjMV9jbGssCiAJJmFjOTdfY2xrLAogCSZ0Y2JfY2xrLAotCSZwd21jX2NsaywKKwkmcHdtX2NsaywKIAkmbWFjYl9jbGssCiAJJnR3b2RnZV9jbGssCiAJJnVkY19jbGssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYwppbmRleCBjOTM5OTJmLi44Yjg4NDA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKQEAgLTg4Niw2ICs4ODYsNTkgQEAKIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFBXTQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChDT05GSUdfQVRNRUxfUFdNKQorc3RhdGljIHUzMiBwd21fbWFzazsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwd21fcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2M19CQVNFX1BXTUMsCisJCS5lbmQJPSBBVDkxU0FNOTI2M19CQVNFX1BXTUMgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjNfSURfUFdNQywKKwkJLmVuZAk9IEFUOTFTQU05MjYzX0lEX1BXTUMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2M19wd20wX2RldmljZSA9IHsKKwkubmFtZQk9ICJhdG1lbF9wd20iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZwd21fbWFzaywKKwl9LAorCS5yZXNvdXJjZQk9IHB3bV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHB3bV9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3B3bSh1MzIgbWFzaykKK3sKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMCkpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCNywgMSk7CS8qIGVuYWJsZSBQV00wICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMSkpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCOCwgMSk7CS8qIGVuYWJsZSBQV00xICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMikpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BDMjksIDEpOwkvKiBlbmFibGUgUFdNMiAqLworCisJaWYgKG1hc2sgJiAoMSA8PCBBVDkxX1BXTTMpKQorCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjI5LCAxKTsJLyogZW5hYmxlIFBXTTMgKi8KKworCXB3bV9tYXNrID0gbWFzazsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjNfcHdtMF9kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9wd20odTMyIG1hc2spIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFNTQyAtLSBTeW5jaHJvbm91cyBTZXJpYWwgQ29udHJvbGxlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKaW5kZXggNTU2YmRkZi4uMjUyZTk1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCkBAIC0xMzEsOCArMTMxLDggQEAKIAkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05UkxfSURfVEMyLAogCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCiB9Owotc3RhdGljIHN0cnVjdCBjbGsgcHdtY19jbGsgPSB7Ci0JLm5hbWUJCT0gInB3bWNfY2xrIiwKK3N0YXRpYyBzdHJ1Y3QgY2xrIHB3bV9jbGsgPSB7CisJLm5hbWUJCT0gInB3bV9jbGsiLAogCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTlSTF9JRF9QV01DLAogCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCiB9OwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJJnRjMF9jbGssCiAJJnRjMV9jbGssCiAJJnRjMl9jbGssCi0JJnB3bWNfY2xrLAorCSZwd21fY2xrLAogCSZ0c2NfY2xrLAogCSZkbWFfY2xrLAogCSZ1ZHBoc19jbGssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKaW5kZXggNjIwODg2My4uODdkZWIxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwpAQCAtNTI3LDYgKzUyNyw1MSBAQAogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVG91Y2hzY3JlZW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BVE1FTF9UU0FEQ0MpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FUTUVMX1RTQURDQ19NT0RVTEUpCitzdGF0aWMgdTY0IHRzYWRjY19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0c2FkY2NfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOVJMX0JBU0VfVFNDLAorCQkuZW5kCT0gQVQ5MVNBTTlSTF9CQVNFX1RTQyArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOVJMX0lEX1RTQywKKwkJLmVuZAk9IEFUOTFTQU05UkxfSURfVFNDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOXJsX3RzYWRjY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3RzYWRjYyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5kbWFfbWFzawkJPSAmdHNhZGNjX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5yZXNvdXJjZQk9IHRzYWRjY19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRzYWRjY19yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3RzYWRjYyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTcsIDApOwkvKiBBRDBfWFIgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE4LCAwKTsJLyogQUQxX1hMICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExOSwgMCk7CS8qIEFEMl9ZVCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMjAsIDApOwkvKiBBRDNfVEIgKi8KKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTlybF90c2FkY2NfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKHZvaWQpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFJUQwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNTkyLDYgKzYzNyw1OSBAQAogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgUFdNCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BVE1FTF9QV00pCitzdGF0aWMgdTMyIHB3bV9tYXNrOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHB3bV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05UkxfQkFTRV9QV01DLAorCQkuZW5kCT0gQVQ5MVNBTTlSTF9CQVNFX1BXTUMgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTlSTF9JRF9QV01DLAorCQkuZW5kCT0gQVQ5MVNBTTlSTF9JRF9QV01DLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTlybF9wd20wX2RldmljZSA9IHsKKwkubmFtZQk9ICJhdG1lbF9wd20iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZwd21fbWFzaywKKwl9LAorCS5yZXNvdXJjZQk9IHB3bV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHB3bV9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3B3bSh1MzIgbWFzaykKK3sKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMCkpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCOCwgMSk7CS8qIGVuYWJsZSBQV00wICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMSkpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCOSwgMSk7CS8qIGVuYWJsZSBQV00xICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMikpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BENSwgMSk7CS8qIGVuYWJsZSBQV00yICovCisKKwlpZiAobWFzayAmICgxIDw8IEFUOTFfUFdNMykpCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BEOCwgMSk7CS8qIGVuYWJsZSBQV00zICovCisKKwlwd21fbWFzayA9IG1hc2s7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05cmxfcHdtMF9kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9wd20odTMyIG1hc2spIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFNTQyAtLSBTeW5jaHJvbm91cyBTZXJpYWwgQ29udHJvbGxlcgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTF4NDBfdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTF4NDBfdGltZS5jCmluZGV4IDg2OWI1ZTIuLmRmZmYyODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxeDQwX3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXg0MF90aW1lLmMKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV90Yy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtYWZlYi05MjYwdjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMDQwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtYWZlYi05MjYwdjEuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEF0bWVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFNlcmdleSBMYXBpbgorICoKKyAqIEEgY3VzdG9tIGJvYXJkIGRlc2lnbmVkIGFzIG9wZW4gaGFyZHdhcmU7IFBDQnMgYW5kIHZhcmlvdXMgaW5mb3JtYXRpb24KKyAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYXJtOWZwZ2EtZXZvbHV0aW9uLWJvYXJkLworICogU3VidmVyc2lvbiByZXBvc2l0b3J5OiBzdm46Ly8xOTQuODUuMjM4LjIyL2hvbWUvdXNlcnMvZ2VvcmdlL3N2bi9hcm05ZWIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworc3RhdGljIHZvaWQgX19pbml0IGFmZWI5MjYwX21hcF9pbyh2b2lkKQoreworCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KKwlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKworCS8qIERHQlUgb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOworCisJLyogVVNBUlQwIG9uIHR0eVMxLiAoUngsIFR4LCBDVFMsIFJUUywgRFRSLCBEU1IsIERDRCwgUkkpICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTMCwgMSwKKwkJCSAgICAgQVRNRUxfVUFSVF9DVFMgfCBBVE1FTF9VQVJUX1JUUworCQkJICAgfCBBVE1FTF9VQVJUX0RUUiB8IEFUTUVMX1VBUlRfRFNSCisJCQkgICB8IEFUTUVMX1VBUlRfRENEIHwgQVRNRUxfVUFSVF9SSSk7CisKKwkvKiBVU0FSVDEgb24gdHR5UzIuIChSeCwgVHgsIFJUUywgQ1RTKSAqLworCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzEsIDIsCisJCQlBVE1FTF9VQVJUX0NUUyB8IEFUTUVMX1VBUlRfUlRTKTsKKworCS8qIHNldCBzZXJpYWwgY29uc29sZSB0byB0dHlTMCAoaWUsIERCR1UpICovCisJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhZmViOTI2MF9pbml0X2lycSh2b2lkKQoreworCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKK30KKworCisvKgorICogVVNCIEhvc3QgcG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgYWZlYjkyNjBfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAxLAorfTsKKworLyoKKyAqIFVTQiBEZXZpY2UgcG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBhZmViOTI2MF91ZGNfZGF0YSA9IHsKKwkudmJ1c19waW4JPSBBVDkxX1BJTl9QQzUsCisJLnB1bGx1cF9waW4JPSAwLAkJLyogcHVsbC11cCBkcml2ZW4gYnkgVURDICovCit9OworCisKKworLyoKKyAqIFNQSSBkZXZpY2VzLgorICovCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGFmZWI5MjYwX3NwaV9kZXZpY2VzW10gPSB7CisJewkvKiBEYXRhRmxhc2ggY2hpcCAqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDEsCisJCS5tYXhfc3BlZWRfaHoJPSAxNSAqIDEwMDAgKiAxMDAwLAorCQkuYnVzX251bQk9IDAsCisJfSwKK307CisKKworLyoKKyAqIE1BQ0IgRXRoZXJuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGFmZWI5MjYwX21hY2JfZGF0YSA9IHsKKwkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQTksCisJLmlzX3JtaWkJPSAwLAorfTsKKworCisvKgorICogTkFORCBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBhZmViOTI2MF9uYW5kX3BhcnRpdGlvbltdID0geworCXsKKwkJLm5hbWUJPSAiYm9vdGxvYWRlciIsCisJCS5vZmZzZXQJPSAwLAorCQkuc2l6ZQk9ICg2NDAgKiBTWl8xSyksCisJfSwKKwl7CisJCS5uYW1lCT0gImtlcm5lbCIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gU1pfMk0sCisJfSwKKwl7CisJCS5uYW1lCT0gInJvb3RmcyIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKK3sKKwkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGFmZWI5MjYwX25hbmRfcGFydGl0aW9uKTsKKwlyZXR1cm4gYWZlYjkyNjBfbmFuZF9wYXJ0aXRpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgYWZlYjkyNjBfbmFuZF9kYXRhID0geworCS5hbGUJCT0gMjEsCisJLmNsZQkJPSAyMiwKKwkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCisJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAorCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkuYnVzX3dpZHRoXzE2CT0gMCwKK307CisKKworLyoKKyAqIE1DSSAoU0QvTU1DKQorICovCitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBhZmViOTI2MF9tbWNfZGF0YSA9IHsKKwkuc2xvdF9iCQk9IDEsCisJLndpcmU0CQk9IDEsCit9OworCisKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGFmZWI5MjYwX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiZm0zMTMwIiwgMHg2OCksCisJCUkyQ19CT0FSRF9JTkZPKCIyNGM2NCIsIDB4NTApLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYWZlYjkyNjBfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIFNlcmlhbCAqLworCWF0OTFfYWRkX2RldmljZV9zZXJpYWwoKTsKKwkvKiBVU0IgSG9zdCAqLworCWF0OTFfYWRkX2RldmljZV91c2JoKCZhZmViOTI2MF91c2JoX2RhdGEpOworCS8qIFVTQiBEZXZpY2UgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdWRjKCZhZmViOTI2MF91ZGNfZGF0YSk7CisJLyogU1BJICovCisJYXQ5MV9hZGRfZGV2aWNlX3NwaShhZmViOTI2MF9zcGlfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoYWZlYjkyNjBfc3BpX2RldmljZXMpKTsKKwkvKiBOQU5EICovCisJYXQ5MV9hZGRfZGV2aWNlX25hbmQoJmFmZWI5MjYwX25hbmRfZGF0YSk7CisJLyogRXRoZXJuZXQgKi8KKwlhdDkxX2FkZF9kZXZpY2VfZXRoKCZhZmViOTI2MF9tYWNiX2RhdGEpOworCisJLyogU3RhbmRhcmQgZnVuY3Rpb24ncyBwaW4gYXNzaWdubWVudHMgYXJlIG5vdAorCSAqIGFwcHJvcHJpYXRlIGZvciB1cyBhbmQgZ2VuZXJpYyBjb2RlIHByb3ZpZGUKKwkgKiBubyBBUEkgdG8gY29uZmlndXJlIHRoZXNlIHBpbnMgYW55IG90aGVyIHdheSAqLworCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMTAsIDApOwkvKiBFVFgyICovCisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEExMSwgMCk7CS8qIEVUWDMgKi8KKwkvKiBNTUMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbW1jKDAsICZhZmViOTI2MF9tbWNfZGF0YSk7CisJLyogSTJDICovCisJYXQ5MV9hZGRfZGV2aWNlX2kyYyhhZmViOTI2MF9pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoYWZlYjkyNjBfaTJjX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChBRkVCOTI2MCwgIkN1c3RvbSBhZmViOTI2MCBib2FyZCIpCisJLyogTWFpbnRhaW5lcjogU2VyZ2V5IExhcGluIDxzbGFwaW5Ab3NzZmFucy5vcmc+ICovCisJLnBoeXNfaW8JPSBBVDkxX0JBU0VfU1lTLAorCS5pb19wZ19vZmZzdAk9IChBVDkxX1ZBX0JBU0VfU1lTID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBBVDkxX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gYWZlYjkyNjBfbWFwX2lvLAorCS5pbml0X2lycQk9IGFmZWI5MjYwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBhZmViOTI2MF9ib2FyZF9pbml0LAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKaW5kZXggMTk2MTk5NS4uMjAxYjg5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIH07CiAKICNkZWZpbmUgTk9SX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKLSNkZWZpbmUgTk9SX1NJWkUJMHg4MDAwMDAKKyNkZWZpbmUgTk9SX1NJWkUJU1pfOE0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBub3JfZmxhc2hfcmVzb3VyY2VzW10gPSB7CiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKaW5kZXggYWZhMWZmMC4uZGIxZjk1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zNCw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCkBAIC0xMTQsNiArMTE0LDMwIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgY2FybWV2YV9sZWRzW10gPSB7CisJeyAvKiAidXNlciBsZWQgMSIsIExFRDkgKi8KKwkJLm5hbWUJCQk9ICJsZWQ5IiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BBMjEsCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKKwl9LAorCXsgLyogInVzZXIgbGVkIDIiLCBMRUQxMCAqLworCQkubmFtZQkJCT0gImxlZDEwIiwKKwkJLmdwaW8JCQk9IEFUOTFfUElOX1BBMjUsCisJCS5hY3RpdmVfbG93CQk9IDEsCisJfSwKKwl7IC8qICJ1c2VyIGxlZCAzIiwgTEVEMTEgKi8KKwkJLm5hbWUJCQk9ICJsZWQxMSIsCisJCS5ncGlvCQkJPSBBVDkxX1BJTl9QQTI2LAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCX0sCisJeyAvKiAidXNlciBsZWQgNCIsIExFRDEyICovCisJCS5uYW1lCQkJPSAibGVkMTIiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEExOCwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwl9Cit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgY2FybWV2YV9ib2FyZF9pbml0KHZvaWQpCiB7CiAJLyogU2VyaWFsICovCkBAIC0xMzIsNiArMTU2LDggQEAKIC8vCWF0OTFfYWRkX2RldmljZV9jZigmY2FybWV2YV9jZl9kYXRhKTsKIAkvKiBNTUMgKi8KIAlhdDkxX2FkZF9kZXZpY2VfbW1jKDAsICZjYXJtZXZhX21tY19kYXRhKTsKKwkvKiBMRURzICovCisJYXQ5MV9ncGlvX2xlZHMoY2FybWV2YV9sZWRzLCBBUlJBWV9TSVpFKGNhcm1ldmFfbGVkcykpOwogfQogCiBNQUNISU5FX1NUQVJUKENBUk1FVkEsICJDYXJtZXZhIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwppbmRleCBjYjdjOWE4Li5mZWEyNTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM3LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogfTsKIAogI2RlZmluZSBDU0JfRkxBU0hfQkFTRQlBVDkxX0NISVBTRUxFQ1RfMAotI2RlZmluZSBDU0JfRkxBU0hfU0laRQkweDgwMDAwMAorI2RlZmluZSBDU0JfRkxBU0hfU0laRQlTWl84TQogCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY3NiX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKIAl7CkBAIC0xOTMsMTEgKzE5MywxMSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgY3NiMzAwX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQogewotCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyOSwgMCk7CS8qIHN3MCAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyOSwgMSk7CS8qIHN3MCAqLwogCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BCMjksIDEpOwotCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyOCwgMCk7CS8qIHN3MSAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyOCwgMSk7CS8qIHN3MSAqLwogCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BCMjgsIDEpOwotCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEyMSwgMCk7CS8qIHN3MiAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEyMSwgMSk7CS8qIHN3MiAqLwogCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BBMjEsIDEpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjc2IzMDBfYnV0dG9uX2RldmljZSk7CkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJLmdwaW8JCQk9IEFUOTFfUElOX1BCMCwKIAkJLmFjdGl2ZV9sb3cJCT0gMSwKIAkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJpZGUtZGlzayIsCi0JfSwKKwl9CiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYwppbmRleCA4ZGI4YmQ4Li5jZmEzZjA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM0LDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKQEAgLTcyLDcgKzcyLDcgQEAKIH07CiAKICNkZWZpbmUgQ1NCX0ZMQVNIX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKLSNkZWZpbmUgQ1NCX0ZMQVNIX1NJWkUJMHgxMDAwMDAwCisjZGVmaW5lIENTQl9GTEFTSF9TSVpFCVNaXzE2TQogCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY3NiX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1kay5jCmluZGV4IDQzZTFhYTcuLjBmZDBmNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1kay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1kay5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgpAQCAtMTU3LDcgKzE1Nyw3IEBACiB9OwogCiAjZGVmaW5lIERLX0ZMQVNIX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKLSNkZWZpbmUgREtfRkxBU0hfU0laRQkweDIwMDAwMAorI2RlZmluZSBES19GTEFTSF9TSVpFCVNaXzJNCiAKIHN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGRrX2ZsYXNoX2RhdGEgPSB7CiAJLndpZHRoCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwppbmRleCBiZmVlZThhMi4uMWQ2OTkwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCkBAIC04Niw3ICs4Niw3IEBACiAJewkvKiAweDg0MDAgKi8KIAkJLm5hbWUJPSAiRGFycmVsbC1sb2FkZXIiLAogCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSAxMiogMTA1NiwKKwkJLnNpemUJPSAxMiAqIDEwNTYsCiAJfSwKIAl7CiAJCS5uYW1lCT0gIlUtYm9vdCIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lay5jCmluZGV4IDYwNjI2ZTcuLjRjZGZhYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lay5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgpAQCAtMTE2LDcgKzExNiw3IEBACiB9OwogCiAjZGVmaW5lIEVLX0ZMQVNIX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKLSNkZWZpbmUgRUtfRkxBU0hfU0laRQkweDIwMDAwMAorI2RlZmluZSBFS19GTEFTSF9TSVpFCVNaXzJNCiAKIHN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGVrX2ZsYXNoX2RhdGEgPSB7CiAJLndpZHRoCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYwppbmRleCBkYmM5MTJkLi44NTk3MjdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogLy8gfTsKIAogI2RlZmluZSBQSUNPVFVYMjAwX0ZMQVNIX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzAKLSNkZWZpbmUgUElDT1RVWDIwMF9GTEFTSF9TSVpFCTB4NDAwMDAwCisjZGVmaW5lIFBJQ09UVVgyMDBfRkxBU0hfU0laRQlTWl80TQogCiBzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwaWNvdHV4MjAwX2ZsYXNoX2RhdGEgPSB7CiAJLndpZHRoCT0gMiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwppbmRleCA0YzI4NDEzLi5jZmI0NTcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM5LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CkBAIC0xMTksMTggKzExOSwxOCBAQAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIF9faW5pdGRhdGEgZWtfbmFuZF9wYXJ0aXRpb25bXSA9IHsKIAl7CiAJCS5uYW1lCT0gIlVib290ICYgS2VybmVsIiwKLQkJLm9mZnNldAk9IDB4MDAwMDAwMDAsCi0JCS5zaXplCT0gMTYgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IDAsCisJCS5zaXplCT0gU1pfMTZNLAogCX0sCiAJewogCQkubmFtZQk9ICJSb290IEZTIiwKLQkJLm9mZnNldAk9IDB4MDEwMDAwMDAsCi0JCS5zaXplCT0gMTIwICogMTAyNCAqIDEwMjQsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gMTIwICogU1pfMU0sCiAJfSwKIAl7CiAJCS5uYW1lCT0gIkZTIiwKLQkJLm9mZnNldAk9IDB4MDg4MDAwMDAsCi0JCS5zaXplCT0gMTIwICogMTAyNCAqIDEwMjQsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gMTIwICogU1pfMU0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCmluZGV4IGU0OTEwY2IuLjk5YmI0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYwpAQCAtMTI2LDExICsxMjYsMTEgQEAKIAl7CiAJCS5uYW1lCT0gIkJvb3Rsb2FkZXIgQXJlYSIsCiAJCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IDEwICogMTAyNCAqIDEwMjQsCisJCS5zaXplCT0gMTAgKiBTWl8xTSwKIAl9LAogCXsKIAkJLm5hbWUJPSAiVXNlciBBcmVhIiwKLQkJLm9mZnNldAk9IDEwICogMTAyNCAqIDEwMjQsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCiAJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwppbmRleCBjYjIwZTcwLi5iNDllYjZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCkBAIC0yNyw4ICsyNywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYXQ3M2MyMTMuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zNyw2ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCkBAIC0xNjMsMTEgKzE2NiwxMSBAQAogCXsKIAkJLm5hbWUJPSAiUGFydGl0aW9uIDEiLAogCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSAyNTYgKiAxMDI0LAorCQkuc2l6ZQk9IFNaXzI1NkssCiAJfSwKIAl7CiAJCS5uYW1lCT0gIlBhcnRpdGlvbiAyIiwKLQkJLm9mZnNldAk9IDI1NiAqIDEwMjQsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCiAJCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKIAl9LAogfTsKQEAgLTIyMiw2ICsyMjUsNzMgQEAKIAl9CiB9OwogCisvKgorICogSTJDIGRldmljZXMKKyAqLworc3RhdGljIHN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgYXQyNGM1MTIgPSB7CisJLmJ5dGVfbGVuCT0gU1pfNTEySyAvIDgsCisJLnBhZ2Vfc2l6ZQk9IDEyOCwKKwkuZmxhZ3MJCT0gQVQyNF9GTEFHX0FERFIxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBla19pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oIjI0YzUxMiIsIDB4NTApLAorCQkucGxhdGZvcm1fZGF0YSA9ICZhdDI0YzUxMiwKKwl9LAorCS8qIG1vcmUgZGV2aWNlcyBjYW4gYmUgYWRkZWQgdXNpbmcgZXhwYW5zaW9uIGNvbm5lY3RvcnMgKi8KK307CisKKworLyoKKyAqIEdQSU8gQnV0dG9ucworICovCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZWtfYnV0dG9uc1tdID0geworCXsKKwkJLmdwaW8JCT0gQVQ5MV9QSU5fUEEzMCwKKwkJLmNvZGUJCT0gQlROXzMsCisJCS5kZXNjCQk9ICJCdXR0b24gMyIsCisJCS5hY3RpdmVfbG93CT0gMSwKKwkJLndha2V1cAkJPSAxLAorCX0sCisJeworCQkuZ3BpbwkJPSBBVDkxX1BJTl9QQTMxLAorCQkuY29kZQkJPSBCVE5fNCwKKwkJLmRlc2MJCT0gIkJ1dHRvbiA0IiwKKwkJLmFjdGl2ZV9sb3cJPSAxLAorCQkud2FrZXVwCQk9IDEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBla19idXR0b25fZGF0YSA9IHsKKwkuYnV0dG9ucwk9IGVrX2J1dHRvbnMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRShla19idXR0b25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVrX2J1dHRvbl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImdwaW8ta2V5cyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZWtfYnV0dG9uX2RhdGEsCisJfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQoreworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEzMCwgMSk7CS8qIGJ0bjMgKi8KKwlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQTMwLCAxKTsKKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BBMzEsIDEpOwkvKiBidG40ICovCisJYXQ5MV9zZXRfZGVnbGl0Y2goQVQ5MV9QSU5fUEEzMSwgMSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX2J1dHRvbl9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX2J1dHRvbnModm9pZCkge30KKyNlbmRpZgorCisKIHN0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCiB7CiAJLyogU2VyaWFsICovCkBAIC0yMzksMTIgKzMwOSwxNCBAQAogCS8qIE1NQyAqLwogCWF0OTFfYWRkX2RldmljZV9tbWMoMCwgJmVrX21tY19kYXRhKTsKIAkvKiBJMkMgKi8KLQlhdDkxX2FkZF9kZXZpY2VfaTJjKE5VTEwsIDApOworCWF0OTFfYWRkX2RldmljZV9pMmMoZWtfaTJjX2RldmljZXMsIEFSUkFZX1NJWkUoZWtfaTJjX2RldmljZXMpKTsKIAkvKiBTU0MgKHRvIEFUNzNDMjEzKSAqLwogCWF0NzNjMjEzX3NldF9jbGsoJmF0NzNjMjEzX2RhdGEpOwogCWF0OTFfYWRkX2RldmljZV9zc2MoQVQ5MVNBTTkyNjBfSURfU1NDLCBBVE1FTF9TU0NfVFgpOwogCS8qIExFRHMgKi8KIAlhdDkxX2dwaW9fbGVkcyhla19sZWRzLCBBUlJBWV9TSVpFKGVrX2xlZHMpKTsKKwkvKiBQdXNoIEJ1dHRvbnMgKi8KKwlla19hZGRfZGV2aWNlX2J1dHRvbnMoKTsKIH0KIAogTUFDSElORV9TVEFSVChBVDkxU0FNOTI2MEVLLCAiQXRtZWwgQVQ5MVNBTTkyNjAtRUsiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCmluZGV4IDFhOTk2M2I4Li40OTc3NDA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCkBAIC0zNSw3ICszNSw2IEBACiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00NCw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CkBAIC0xNjgsMTEgKzE2OCwxMSBAQAogCXsKIAkJLm5hbWUJPSAiUGFydGl0aW9uIDEiLAogCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSAyNTYgKiAxMDI0LAorCQkuc2l6ZQk9IFNaXzI1NkssCiAJfSwKIAl7CiAJCS5uYW1lCT0gIlBhcnRpdGlvbiAyIiwKLQkJLm9mZnNldAk9IDI1NiAqIDEwMjQgLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAogCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCiAJfSwKIH07CkBAIC00MzUsMjQgKzQzNSwyOCBAQAogCQkuY29kZQkJPSBCVE5fMCwKIAkJLmRlc2MJCT0gIkJ1dHRvbiAwIiwKIAkJLmFjdGl2ZV9sb3cJPSAxLAorCQkud2FrZXVwCQk9IDEsCiAJfSwKIAl7CiAJCS5ncGlvCQk9IEFUOTFfUElOX1BBMjYsCiAJCS5jb2RlCQk9IEJUTl8xLAogCQkuZGVzYwkJPSAiQnV0dG9uIDEiLAogCQkuYWN0aXZlX2xvdwk9IDEsCisJCS53YWtldXAJCT0gMSwKIAl9LAogCXsKIAkJLmdwaW8JCT0gQVQ5MV9QSU5fUEEyNSwKIAkJLmNvZGUJCT0gQlROXzIsCiAJCS5kZXNjCQk9ICJCdXR0b24gMiIsCiAJCS5hY3RpdmVfbG93CT0gMSwKKwkJLndha2V1cAkJPSAxLAogCX0sCiAJewogCQkuZ3BpbwkJPSBBVDkxX1BJTl9QQTI0LAogCQkuY29kZQkJPSBCVE5fMywKIAkJLmRlc2MJCT0gIkJ1dHRvbiAzIiwKIAkJLmFjdGl2ZV9sb3cJPSAxLAorCQkud2FrZXVwCQk9IDEsCiAJfQogfTsKIApAQCAtNDcyLDEzICs0NzYsMTMgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQogewotCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEyNywgMCk7CS8qIGJ0bjAgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BBMjcsIDEpOwkvKiBidG4wICovCiAJYXQ5MV9zZXRfZGVnbGl0Y2goQVQ5MV9QSU5fUEEyNywgMSk7Ci0JYXQ5MV9zZXRfZ3Bpb19pbnB1dChBVDkxX1BJTl9QQTI2LCAwKTsJLyogYnRuMSAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEyNiwgMSk7CS8qIGJ0bjEgKi8KIAlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQTI2LCAxKTsKLQlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BBMjUsIDApOwkvKiBidG4yICovCisJYXQ5MV9zZXRfZ3Bpb19pbnB1dChBVDkxX1BJTl9QQTI1LCAxKTsJLyogYnRuMiAqLwogCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BBMjUsIDEpOwotCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEEyNCwgMCk7CS8qIGJ0bjMgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BBMjQsIDEpOwkvKiBidG4zICovCiAJYXQ5MV9zZXRfZGVnbGl0Y2goQVQ5MV9QSU5fUEEyNCwgMSk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX2J1dHRvbl9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCmluZGV4IGIxZDExOTYuLjgzNTQwMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKQEAgLTI2LDEzICsyNiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTQxLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KQEAgLTE3MiwxMSArMTc0LDExIEBACiAJewogCQkubmFtZQk9ICJQYXJ0aXRpb24gMSIsCiAJCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IDY0ICogMTAyNCAqIDEwMjQsCisJCS5zaXplCT0gU1pfNjRNLAogCX0sCiAJewogCQkubmFtZQk9ICJQYXJ0aXRpb24gMiIsCi0JCS5vZmZzZXQJPSA2NCAqIDEwMjQgKiAxMDI0LAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAogCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCiAJfSwKIH07CkBAIC0yMDMsMTIgKzIwNSwzMCBAQAogCiAKIC8qCisgKiBJMkMgZGV2aWNlcworICovCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBhdDI0YzUxMiA9IHsKKwkuYnl0ZV9sZW4JPSBTWl81MTJLIC8gOCwKKwkucGFnZV9zaXplCT0gMTI4LAorCS5mbGFncwkJPSBBVDI0X0ZMQUdfQUREUjE2LAorfTsKKworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgZWtfaTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCIyNGM1MTIiLCAweDUwKSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYXQyNGM1MTIsCisJfSwKKwkvKiBtb3JlIGRldmljZXMgY2FuIGJlIGFkZGVkIHVzaW5nIGV4cGFuc2lvbiBjb25uZWN0b3JzICovCit9OworCisvKgogICogTENEIENvbnRyb2xsZXIKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FUTUVMKSB8fCBkZWZpbmVkKENPTkZJR19GQl9BVE1FTF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBhdDkxX3RmdF92Z2FfbW9kZXNbXSA9IHsKIAl7Ci0JICAgICAgICAubmFtZSAgICAgICAgICAgPSAiVFgwOUQ1MFZNMUNDQSBAIDYwIiwKKwkJLm5hbWUJCT0gIlRYMDlENTBWTTFDQ0EgQCA2MCIsCiAJCS5yZWZyZXNoCT0gNjAsCiAJCS54cmVzCQk9IDI0MCwJCS55cmVzCQk9IDMyMCwKIAkJLnBpeGNsb2NrCT0gS0haMlBJQ09TKDQ5NjUpLApAQCAtMjI0LDcgKzI0NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmJfbW9uc3BlY3MgYXQ5MWZiX2RlZmF1bHRfbW9uc3BlY3MgPSB7CiAJLm1hbnVmYWN0dXJlcgk9ICJISVQiLAotCS5tb25pdG9yICAgICAgICA9ICJUWDA5RDcwVk0xQ0NBIiwKKwkubW9uaXRvcgk9ICJUWDA5RDcwVk0xQ0NBIiwKIAogCS5tb2RlZGIJCT0gYXQ5MV90ZnRfdmdhX21vZGVzLAogCS5tb2RlZGJfbGVuCT0gQVJSQVlfU0laRShhdDkxX3RmdF92Z2FfbW9kZXMpLApAQCAtMjM1LDcgKzI1NSw3IEBACiB9OwogCiAjZGVmaW5lIEFUOTFTQU05MjYzX0RFRkFVTFRfTENEQ09OMiAJKEFUTUVMX0xDRENfTUVNT1JfTElUVExFIFwKLQkJCQkJfCBBVE1FTF9MQ0RDX0RJU1RZUEVfVEZUICAgIFwKKwkJCQkJfCBBVE1FTF9MQ0RDX0RJU1RZUEVfVEZUIFwKIAkJCQkJfCBBVE1FTF9MQ0RDX0NMS01PRF9BTFdBWVNBQ1RJVkUpCiAKIHN0YXRpYyB2b2lkIGF0OTFfbGNkY19wb3dlcl9jb250cm9sKGludCBvbikKQEAgLTI3Nyw3ICsyOTcsNyBAQAogCQkuYWN0aXZlX2xvdwk9IDEsCiAJCS5kZXNjCQk9ICJyaWdodF9jbGljayIsCiAJCS53YWtldXAJCT0gMSwKLQl9LAorCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgZWtfYnV0dG9uX2RhdGEgPSB7CkBAIC0yOTYsOSArMzE2LDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfYnV0dG9ucyh2b2lkKQogewotCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BDNSwgMCk7CS8qIGxlZnQgYnV0dG9uICovCisJYXQ5MV9zZXRfR1BJT19wZXJpcGgoQVQ5MV9QSU5fUEM1LCAxKTsJLyogbGVmdCBidXR0b24gKi8KIAlhdDkxX3NldF9kZWdsaXRjaChBVDkxX1BJTl9QQzUsIDEpOwotCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BDNCwgMCk7CS8qIHJpZ2h0IGJ1dHRvbiAqLworCWF0OTFfc2V0X0dQSU9fcGVyaXBoKEFUOTFfUElOX1BDNCwgMSk7CS8qIHJpZ2h0IGJ1dHRvbiAqLwogCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BDNCwgMSk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX2J1dHRvbl9kZXZpY2UpOwpAQCAtMzIwLDI1ICszNDAsMzIgQEAKICAqIExFRHMgLi4uIHRoZXNlIGNvdWxkIGFsbCBiZSBQV00tZHJpdmVuLCBmb3IgdmFyaWFibGUgYnJpZ2h0bmVzcwogICovCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGVrX2xlZHNbXSA9IHsKLQl7CS8qICJsZWZ0IiBsZWQsIGdyZWVuLCB1c2VybGVkMSwgcHdtMSAqLwotCQkubmFtZQkJCT0gImRzMSIsCi0JCS5ncGlvCQkJPSBBVDkxX1BJTl9QQjgsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWZhdWx0X3RyaWdnZXIJPSAibW1jMCIsCi0JfSwKLQl7CS8qICJyaWdodCIgbGVkLCBncmVlbiwgdXNlcmxlZDIsIHB3bTIgKi8KKwl7CS8qICJyaWdodCIgbGVkLCBncmVlbiwgdXNlcmxlZDIgKGNvdWxkIGJlIGRyaXZlbiBieSBwd20yKSAqLwogCQkubmFtZQkJCT0gImRzMiIsCiAJCS5ncGlvCQkJPSBBVDkxX1BJTl9QQzI5LAogCQkuYWN0aXZlX2xvdwkJPSAxLAogCQkuZGVmYXVsdF90cmlnZ2VyCT0gIm5hbmQtZGlzayIsCiAJfSwKLQl7CS8qICJwb3dlciIgbGVkLCB5ZWxsb3csIHB3bTAgKi8KKwl7CS8qICJwb3dlciIgbGVkLCB5ZWxsb3cgKGNvdWxkIGJlIGRyaXZlbiBieSBwd20wKSAqLwogCQkubmFtZQkJCT0gImRzMyIsCiAJCS5ncGlvCQkJPSBBVDkxX1BJTl9QQjcsCiAJCS5kZWZhdWx0X3RyaWdnZXIJPSAiaGVhcnRiZWF0IiwKIAl9CiB9OwogCisvKgorICogUFdNIExlZHMKKyAqLworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBla19wd21fbGVkW10gPSB7CisJLyogRm9yIG5vdyBvbmx5IERTMSBpcyBQV00tZHJpdmVuIChieSBwd20xKSAqLworCXsKKwkJLm5hbWUJCQk9ICJkczEiLAorCQkuZ3BpbwkJCT0gMSwJLyogaXMgUFdNIGNoYW5uZWwgbnVtYmVyICovCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAibm9uZSIsCisJfQorfTsKKwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfYm9hcmRfaW5pdCh2b2lkKQogewpAQCAtMzYwLDcgKzM4Nyw3IEBACiAJLyogTkFORCAqLwogCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOwogCS8qIEkyQyAqLwotCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7CisJYXQ5MV9hZGRfZGV2aWNlX2kyYyhla19pMmNfZGV2aWNlcywgQVJSQVlfU0laRShla19pMmNfZGV2aWNlcykpOwogCS8qIExDRCBDb250cm9sbGVyICovCiAJYXQ5MV9hZGRfZGV2aWNlX2xjZGMoJmVrX2xjZGNfZGF0YSk7CiAJLyogUHVzaCBCdXR0b25zICovCkBAIC0zNjksNiArMzk2LDcgQEAKIAlhdDkxX2FkZF9kZXZpY2VfYWM5NygmZWtfYWM5N19kYXRhKTsKIAkvKiBMRURzICovCiAJYXQ5MV9ncGlvX2xlZHMoZWtfbGVkcywgQVJSQVlfU0laRShla19sZWRzKSk7CisJYXQ5MV9wd21fbGVkcyhla19wd21fbGVkLCBBUlJBWV9TSVpFKGVrX3B3bV9sZWQpKTsKIH0KIAogTUFDSElORV9TVEFSVChBVDkxU0FNOTI2M0VLLCAiQXRtZWwgQVQ5MVNBTTkyNjMtRUsiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCmluZGV4IGQ0ZWJhNWMuLmI1ODhlYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKQEAgLTEyMiwxNiArMTIyLDE2IEBACiAJewogCQkubmFtZSAgID0gIkJvb3RzdHJhcCIsCiAJCS5vZmZzZXQgPSAwLAotCQkuc2l6ZSAgID0gNCAqIDEwMjQgKiAxMDI0LAorCQkuc2l6ZSAgID0gNCAqIFNaXzFNLAogCX0sCiAJewogCQkubmFtZQk9ICJQYXJ0aXRpb24gMSIsCi0JCS5vZmZzZXQJPSA0ICogMTAyNCAqIDEwMjQsCi0JCS5zaXplCT0gNjAgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSA2MCAqIFNaXzFNLAogCX0sCiAJewogCQkubmFtZQk9ICJQYXJ0aXRpb24gMiIsCi0JCS5vZmZzZXQJPSA2NCAqIDEwMjQgKiAxMDI0LAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAogCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCmluZGV4IGM2ZGNlNDkuLjI3MDg1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCkBAIC0xOCw3ICsxOCw2IEBACiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0yNyw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CkBAIC04MSwxMSArODEsMTEgQEAKIAl7CiAJCS5uYW1lCT0gIlBhcnRpdGlvbiAxIiwKIAkJLm9mZnNldAk9IDAsCi0JCS5zaXplCT0gMjU2ICogMTAyNCwKKwkJLnNpemUJPSBTWl8yNTZLLAogCX0sCiAJewogCQkubmFtZQk9ICJQYXJ0aXRpb24gMiIsCi0JCS5vZmZzZXQJPSAyNTYgKiAxMDI0ICwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKIAkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAogCX0sCiB9OwpAQCAtMTk1LDYgKzE5NSw4IEBACiAJYXQ5MV9hZGRfZGV2aWNlX21tYygwLCAmZWtfbW1jX2RhdGEpOwogCS8qIExDRCBDb250cm9sbGVyICovCiAJYXQ5MV9hZGRfZGV2aWNlX2xjZGMoJmVrX2xjZGNfZGF0YSk7CisJLyogVG91Y2ggU2NyZWVuIENvbnRyb2xsZXIgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdHNhZGNjKCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTlSTEVLLCAiQXRtZWwgQVQ5MVNBTTlSTC1FSyIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKaW5kZXggZjlkMGI2NS4uN2MzNTAzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zOSw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgpAQCAtOTMsMTggKzkzLDE4IEBACiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBla19uYW5kX3BhcnRpdGlvbltdID0gewogCXsKIAkJLm5hbWUJPSAiVWJvb3QgJiBLZXJuZWwiLAotCQkub2Zmc2V0CT0gMHgwMDAwMDAwMCwKLQkJLnNpemUJPSAxNiAqIDEwMjQgKiAxMDI0LAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSBTWl8xNk0sCiAJfSwKIAl7CiAJCS5uYW1lCT0gIlJvb3QgRlMiLAotCQkub2Zmc2V0CT0gMHgwMTAwMDAwMCwKLQkJLnNpemUJPSAxMjAgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAxMjAgKiBTWl8xTSwKIAl9LAogCXsKIAkJLm5hbWUJPSAiRlMiLAotCQkub2Zmc2V0CT0gMHgwODgwMDAwMCwKLQkJLnNpemUJPSAxMjAgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAxMjAgKiBTWl8xTSwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKaW5kZXggNjczZTVjMi4uMzkxYjU2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgpAQCAtMTA2LDE4ICsxMDYsMTggQEAKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBfX2luaXRkYXRhIGVrX25hbmRfcGFydGl0aW9uW10gPSB7CiAJewogCQkubmFtZQk9ICJMaW51eCBLZXJuZWwiLAotCQkub2Zmc2V0CT0gMHgwMDAwMDAwMCwKLQkJLnNpemUJPSAxNiAqIDEwMjQgKiAxMDI0LAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSBTWl8xNk0sCiAJfSwKIAl7CiAJCS5uYW1lCT0gIlJvb3QgRlMiLAotCQkub2Zmc2V0CT0gMHgwMTAwMDAwMCwKLQkJLnNpemUJPSAxMjAgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAxMjAgKiBTWl8xTSwKIAl9LAogCXsKIAkJLm5hbWUJPSAiRlMiLAotCQkub2Zmc2V0CT0gMHgwODgwMDAwMCwKLQkJLnNpemUJPSAxMjAgKiAxMDI0ICogMTAyNCwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAxMjAgKiBTWl8xTSwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYwppbmRleCAzNmIzODBhLi5lMjJiZjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDIsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KQEAgLTE1MCwyNyArMTUwLDI3IEBACiAJewogCQkubmFtZQk9ICJBVDkxIE5BTkQgcGFydGl0aW9uIDEsIGJvb3QiLAogCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSAxICogU1pfMjU2SworCQkuc2l6ZQk9IFNaXzI1NksKIAl9LAogCXsKIAkJLm5hbWUJPSAiQVQ5MSBOQU5EIHBhcnRpdGlvbiAyLCBrZXJuZWwiLAotCQkub2Zmc2V0CT0gMSAqIFNaXzI1NkssCi0JCS5zaXplCT0gMiAqIFNaXzFNIC0gMSAqIFNaXzI1NksKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAoMiAqIFNaXzFNKSAtIFNaXzI1NksKIAl9LAogCXsKIAkJLm5hbWUJPSAiQVQ5MSBOQU5EIHBhcnRpdGlvbiAzLCBmaWxlc3lzdGVtIiwKLQkJLm9mZnNldAk9IDIgKiBTWl8xTSwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKIAkJLnNpemUJPSAxNCAqIFNaXzFNCiAJfSwKIAl7CiAJCS5uYW1lCT0gIkFUOTEgTkFORCBwYXJ0aXRpb24gNCwgc3RvcmFnZSIsCi0JCS5vZmZzZXQJPSAxNiAqIFNaXzFNLAotCQkuc2l6ZQk9IDE2ICogU1pfMU0KKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSBTWl8xNk0KIAl9LAogCXsKIAkJLm5hbWUJPSAiQVQ5MSBOQU5EIHBhcnRpdGlvbiA1LCBleHQtZnMiLAotCQkub2Zmc2V0CT0gMzIgKiBTWl8xTSwKLQkJLnNpemUJPSAzMiAqIFNaXzFNCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gU1pfMzJNCiAJfQogfTsKIApAQCAtMTkzLDI0ICsxOTMsMjQgQEAKICAqIE5PUiBGbGFzaAogICovCiAjZGVmaW5lIFlMOTIwMF9GTEFTSF9CQVNFCUFUOTFfQ0hJUFNFTEVDVF8wCi0jZGVmaW5lIFlMOTIwMF9GTEFTSF9TSVpFCTB4MTAwMDAwMAorI2RlZmluZSBZTDkyMDBfRkxBU0hfU0laRQlTWl8xNk0KIAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHlsOTIwMF9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CiAJewogCQkubmFtZQkJPSAiQm9vdGxvYWRlciIsCi0JCS5zaXplCQk9IDB4MDAwNDAwMDAsCiAJCS5vZmZzZXQJCT0gMCwKKwkJLnNpemUJCT0gU1pfMjU2SywKIAkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAkvKiBmb3JjZSByZWFkLW9ubHkgKi8KIAl9LAogCXsKIAkJLm5hbWUJCT0gIktlcm5lbCIsCi0JCS5zaXplCQk9IDB4MDAxQzAwMDAsCi0JCS5vZmZzZXQJCT0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCQk9ICgyICogU1pfMU0pIC0gU1pfMjU2SwogCX0sCiAJewogCQkubmFtZQkJPSAiRmlsZXN5c3RlbSIsCi0JCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JCS5vZmZzZXQJCT0gMHgwMDIwMDAwMAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTAogCX0KIH07CiAKQEAgLTM5MCwxMCArMzkwLDYgQEAKICNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxMzVYWCkgfHwgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFhfTU9EVUxFKQogI2luY2x1ZGUgPHZpZGVvL3MxZDEzeHh4ZmIuaD4KIAotI2RlZmluZSBBVDkxX0ZCX1JFR19CQVNFCTB4ODAwMDAwMDBMCi0jZGVmaW5lIEFUOTFfRkJfUkVHX1NJWkUJMHgyMDAKLSNkZWZpbmUgQVQ5MV9GQl9WTUVNX0JBU0UJMHg4MDIwMDAwMEwKLSNkZWZpbmUgQVQ5MV9GQl9WTUVNX1NJWkUJMHgyMDAwMDBMCiAKIHN0YXRpYyB2b2lkIF9faW5pdCB5bDkyMDBfaW5pdF92aWRlbyh2b2lkKQogewpAQCAtNTE2LDI5ICs1MTIsMzMgQEAKIAl7UzFEUkVHX0NPTV9ESVNQX01PREUsCQkweDAxfSwJLyogRGlzcGxheSBNb2RlIFJlZ2lzdGVyLCBMQ0Qgb25seSovCiB9OwogCi1zdGF0aWMgdTY0IHMxZGZiX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCiBzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgeWw5MjAwX3MxZGZiX3BkYXRhID0gewogCS5pbml0cmVncwkJPSB5bDkyMDBfczFkZmJfaW5pdHJlZ3MsCiAJLmluaXRyZWdzc2l6ZQkJPSBBUlJBWV9TSVpFKHlsOTIwMF9zMWRmYl9pbml0cmVncyksCiAJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSB5bDkyMDBfaW5pdF92aWRlbywKIH07CiAKKyNkZWZpbmUgWUw5MjAwX0ZCX1JFR19CQVNFCUFUOTFfQ0hJUFNFTEVDVF83CisjZGVmaW5lIFlMOTIwMF9GQl9WTUVNX0JBU0UJWUw5MjAwX0ZCX1JFR19CQVNFICsgU1pfMk0KKyNkZWZpbmUgWUw5MjAwX0ZCX1ZNRU1fU0laRQlTWl8yTQorCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHlsOTIwMF9zMWRmYl9yZXNvdXJjZVtdID0gewogCVswXSA9IHsJLyogdmlkZW8gbWVtICovCiAJCS5uYW1lCT0gInMxZDEzeHh4ZmIgbWVtb3J5IiwKLQkJLnN0YXJ0CT0gQVQ5MV9GQl9WTUVNX0JBU0UsCi0JCS5lbmQJPSBBVDkxX0ZCX1ZNRU1fQkFTRSArIEFUOTFfRkJfVk1FTV9TSVpFIC0xLAorCQkuc3RhcnQJPSBZTDkyMDBfRkJfVk1FTV9CQVNFLAorCQkuZW5kCT0gWUw5MjAwX0ZCX1ZNRU1fQkFTRSArIFlMOTIwMF9GQl9WTUVNX1NJWkUgLTEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewkvKiB2aWRlbyByZWdpc3RlcnMgKi8KIAkJLm5hbWUJPSAiczFkMTN4eHhmYiByZWdpc3RlcnMiLAotCQkuc3RhcnQJPSBBVDkxX0ZCX1JFR19CQVNFLAotCQkuZW5kCT0gQVQ5MV9GQl9SRUdfQkFTRSArIEFUOTFfRkJfUkVHX1NJWkUgLTEsCisJCS5zdGFydAk9IFlMOTIwMF9GQl9SRUdfQkFTRSwKKwkJLmVuZAk9IFlMOTIwMF9GQl9SRUdfQkFTRSArIFNaXzUxMiAtMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIH07CiAKK3N0YXRpYyB1NjQgczFkZmJfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHlsOTIwMF9zMWRmYl9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gInMxZDEzODA2ZmIiLAogCS5pZAkJPSAtMSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2Nsb2NrLmMKaW5kZXggZjVjMjg0Ny4uZTQzNDUxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2Nsb2NrLmMKQEAgLTIyLDggKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvZ3Bpby5jCmluZGV4IDgzOTJkNWIuLjdlNWViYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2dwaW8uYwpAQCAtMTgsOCArMTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9waW8uaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KQEAgLTQwNCw3ICs0MDQsNiBAQAogCQl9CiAKIAkJcGluID0gYmFuay0+Y2hpcGJhc2U7Ci0JCWdwaW8gPSAmaXJxX2Rlc2NbcGluXTsKIAogCQl3aGlsZSAoaXNyKSB7CiAJCQlpZiAoaXNyICYgMSkgewpAQCAtNDE3LDcgKzQxNiw3IEBACiAJCQkJCWdwaW9faXJxX21hc2socGluKTsKIAkJCQl9CiAJCQkJZWxzZQotCQkJCQlkZXNjX2hhbmRsZV9pcnEocGluLCBncGlvKTsKKwkJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBpbik7CiAJCQl9CiAJCQlwaW4rKzsKIAkJCWdwaW8rKzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9waXQuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9waXQuaAppbmRleCAwNDQ4YWMzLi45NzRkMGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcGl0LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3BpdC5oCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9waXQuaAogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbmRyZXcgVmljdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKgogICogUGVyaW9kaWMgSW50ZXJ2YWwgVGltZXIgKFBJVCkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcnN0Yy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3JzdGMuaAppbmRleCA3Y2QxYjM5Li5jYmQyYmYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcnN0Yy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9yc3RjLmgKQEAgLTEsNiArMSw5IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3JzdGMuaAogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbmRyZXcgVmljdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKgogICogUmVzZXQgQ29udHJvbGxlciAoUlNUQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcnR0LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcnR0LmgKaW5kZXggNzE3ODJlNS4uN2VjNzVkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3J0dC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9ydHQuaApAQCAtMSw2ICsxLDkgQEAKIC8qCiAgKiBhcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfcnR0LmgKICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFZpY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgorICoKICAqIFJlYWwtdGltZSBUaW1lciAoUlRUKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdzdGVycy4KICAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBELgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9zaGR3Yy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3NoZHdjLmgKaW5kZXggNjBiZTVhZS4uYzRjZTA3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3NoZHdjLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3NoZHdjLmgKQEAgLTEsNiArMSw5IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3NoZHdjLmgKICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFZpY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgorICoKICAqIFNodXRkb3duIENvbnRyb2xsZXIgKFNIRFdDKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdzdGVycy4KICAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBELgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaAppbmRleCA5NzNiNDUyLi5mZWNjMmU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfd2R0LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3dkdC5oCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaAogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbmRyZXcgVmljdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKgogICogV2F0Y2hkb2cgVGltZXIgKFdEVCkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5X2RkcnNkci5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOV9kZHJzZHIuaAppbmRleCBiY2E4NzhmLi4xNDk5YjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5X2RkcnNkci5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDlfZGRyc2RyLmgKQEAgLTEsNiArMSw4IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOV9kZHJzZHIuaAogICoKKyAqICAoQykgMjAwOCBBbmRyZXcgVmljdG9yCisgKgogICogRERSL1NEUiBDb250cm9sbGVyIChERFJTRFJDKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdpc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxQ0FQOSBkYXRhc2hlZXQgcmV2aXNpb24gQi4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwX21hdHJpeC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MF9tYXRyaXguaAppbmRleCBmMDI3ZGU1Li4wMjBmMDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwX21hdHJpeC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjBfbWF0cml4LmgKQEAgLTEsNiArMSw4IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MF9tYXRyaXguaAogICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKgogICogTWVtb3J5IENvbnRyb2xsZXJzIChNQVRSSVgsIEVCSSkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgogICogQmFzZWQgb24gQVQ5MVNBTTkyNjAgZGF0YXNoZWV0IHJldmlzaW9uIEIuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MV9tYXRyaXguaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjFfbWF0cml4LmgKaW5kZXggZGI2MmIxZjEuLjY5YzY1MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjFfbWF0cml4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MV9tYXRyaXguaApAQCAtMSw2ICsxLDggQEAKIC8qCiAgKiBhcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxX21hdHJpeC5oCiAgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbi4KKyAqCiAgKiBNZW1vcnkgQ29udHJvbGxlcnMgKE1BVFJJWCwgRUJJKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdpc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05X3NkcmFtYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9zZHJhbWMuaAppbmRleCAxOTIxMTgxLi5iNzI2MDM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05X3NkcmFtYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlfc2RyYW1jLmgKQEAgLTEsNiArMSw5IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9zZHJhbWMuaAogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbmRyZXcgVmljdG9yCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKgogICogU0RSQU0gQ29udHJvbGxlcnMgKFNEUkFNQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgogICogQmFzZWQgb24gQVQ5MVNBTTkyNjEgZGF0YXNoZWV0IHJldmlzaW9uIEQuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9zbWMuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlfc21jLmgKaW5kZXggZWM2YWQxMy4uNTdkZTYyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOV9zbWMuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05X3NtYy5oCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlfc21jLmgKICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFZpY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgorICoKICAqIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlcnMgKFNNQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgogICogQmFzZWQgb24gQVQ5MVNBTTkyNjEgZGF0YXNoZWV0IHJldmlzaW9uIEQuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCmluZGV4IGFjZDYwZjIuLmZiNTFmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKQEAgLTEzMyw2ICsxMzMsMTYgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKHZvaWQpOwogCiAvKgorICogUFdNCisgKi8KKyNkZWZpbmUgQVQ5MV9QV00wCTAKKyNkZWZpbmUgQVQ5MV9QV00xCTEKKyNkZWZpbmUgQVQ5MV9QV00yCTIKKyNkZWZpbmUgQVQ5MV9QV00zCTMKKworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9wd20odTMyIG1hc2spOworCisvKgogICogU1NDIC0tIGFjY2Vzc2VkIHRocm91Z2ggc3NjX3JlcXVlc3QoaWQpLiAgRHJpdmVycyBkb24ndCBiaW5kIHRvIFNTQwogICogcGxhdGZvcm0gZGV2aWNlcy4gIFRoZWlyIFNTQyBJRCBpcyBwYXJ0IG9mIHRoZWlyIGNvbmZpZ3VyYXRpb24gZGF0YSwKICAqIGFsb25nIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggU1NDIHNpZ25hbHMgdGhleSBzaG91bGQgdXNlLgpAQCAtMTYyLDkgKzE3MiwxMyBAQAogIC8qIElTSSAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9pc2kodm9pZCk7CiAKKyAvKiBUb3VjaHNjcmVlbiBDb250cm9sbGVyICovCitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3RzYWRjYyh2b2lkKTsKKwogIC8qIExFRHMgKi8KIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfZ3Bpb19sZWRzKHN0cnVjdCBncGlvX2xlZCAqbGVkcywgaW50IG5yKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX3B3bV9sZWRzKHN0cnVjdCBncGlvX2xlZCAqbGVkcywgaW50IG5yKTsKIAogLyogRklYTUU6IHRoaXMgbmVlZHMgYSBiZXR0ZXIgbG9jYXRpb24sIGJ1dCBnZXRzIHN0dWZmIGJ1aWxkaW5nIGFnYWluICovCiBleHRlcm4gaW50IGF0OTFfc3VzcGVuZF9lbnRlcmluZ19zbG93X2Nsb2NrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBiZGEyOWNjYi4uMzZiZDU1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKICNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0gKIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX2FpYy5oPgogCiAjZGVmaW5lIE5SX0FJQ19JUlFTIDMyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDA0MTBkNTQuLjE4YmRjZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsX3NlcmlhbC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQVQ5MV9FQVJMWV9EQkdVKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9sZWRzLmMKaW5kZXggZmVjMDNjNS4uMDQxNWE4MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2xlZHMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KQEAgLTIxLDE1ICsyMiwxMyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTkVXX0xFRFMpCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQogLyoKICAqIE5ldyBjcm9zcy1wbGF0Zm9ybSBMRUQgc3VwcG9ydC4KICAqLwogCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgbGVkX2RhdGE7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFfbGVkcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFfZ3Bpb19sZWRzX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImxlZHMtZ3BpbyIsCiAJLmlkCQkJPSAtMSwKIAkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmbGVkX2RhdGEsCkBAIC00Nyw3ICs0Niw3IEBACiAKIAlsZWRfZGF0YS5sZWRzID0gbGVkczsKIAlsZWRfZGF0YS5udW1fbGVkcyA9IG5yOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MV9sZWRzKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfZ3Bpb19sZWRzX2RldmljZSk7CiB9CiAKICNlbHNlCkBAIC01Nyw2ICs1Niw0NCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKyNpZiBkZWZpbmVkIChDT05GSUdfTEVEU19BVE1FTF9QV00pCisKKy8qCisgKiBQV00gTGVkcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBwd21fbGVkX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFfcHdtX2xlZHNfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGVkcy1hdG1lbC1wd20iLAorCS5pZAkJCT0gLTEsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJnB3bV9sZWRfZGF0YSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfcHdtX2xlZHMoc3RydWN0IGdwaW9fbGVkICpsZWRzLCBpbnQgbnIpCit7CisJaW50IGk7CisJdTMyIHB3bV9tYXNrID0gMDsKKworCWlmICghbnIpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCQlwd21fbWFzayB8PSAoMSA8PCBsZWRzW2ldLmdwaW8pOworCisJcHdtX2xlZF9kYXRhLmxlZHMgPSBsZWRzOworCXB3bV9sZWRfZGF0YS5udW1fbGVkcyA9IG5yOworCisJYXQ5MV9hZGRfZGV2aWNlX3B3bShwd21fbWFzayk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxX3B3bV9sZWRzX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9wd21fbGVkcyhzdHJ1Y3QgZ3Bpb19sZWQgKmxlZHMsIGludCBucil7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfTEVEUykKIAogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCmluZGV4IGVjMmZlNGMuLjliYjRmMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCkBAIC0xNyw4ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvcG1fc2xvd2Nsb2NrLlMgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG1fc2xvd2Nsb2NrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9wbV9zbG93Y2xvY2suUwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtYXQ5MS9wbV9zbG93X2Nsb2NrLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNhdmluIFpsb2JlYworICoKKyAqIEFUOTFTQU05IHN1cHBvcnQ6CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEFudGkgU3VsbGluIDxhbnRpLnN1bGxpbkBhcnRlY2Rlc2lnbi5lZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KKworI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKKyNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MUNBUDkpCisjaW5jbHVkZSA8bWFjaC9hdDkxY2FwOV9kZHJzZHIuaD4KKyNlbHNlCisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zZHJhbWMuaD4KKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MworLyoKKyAqIEZJWE1FIGVpdGhlciBvciBib3RoIHRoZSBTRFJBTSBjb250cm9sbGVycyAoRUIwLCBFQjEpIG1pZ2h0IGJlIGluIHVzZTsKKyAqIGhhbmRsZSB0aG9zZSBjYXNlcyBib3RoIGhlcmUgYW5kIGluIHRoZSBTdXNwZW5kLVRvLVJBTSBzdXBwb3J0LgorICovCisjZGVmaW5lIEFUOTFfU0RSQU1DCUFUOTFfU0RSQU1DMAorI3dhcm5pbmcgQXNzdW1pbmcgRUIxIFNEUkFNIGNvbnRyb2xsZXIgaXMgKk5PVCogdXNlZAorI2VuZGlmCisKKy8qCisgKiBXaGVuIFNMT1dET1dOX01BU1RFUl9DTE9DSyBpcyBkZWZpbmVkIHdlIHdpbGwgYWxzbyBzbG93IGRvd24gdGhlIE1hc3RlcgorICogY2xvY2sgZHVyaW5nIHN1c3BlbmQgYnkgYWRqdXN0aW5nIGl0cyBwcmVzY2FsYXIgYW5kIGRpdmlzb3IuCisgKiBOT1RFOiBUaGlzIGhhc24ndCBiZWVuIHNob3duIHRvIGJlIHN0YWJsZSBvbiBTQU05czsgYW5kIG9uIHRoZSBSTTkyMDAgdGhlcmUKKyAqICAgICAgIGFyZSBlcnJhdGEgcmVnYXJkaW5nIGFkanVzdGluZyB0aGUgcHJlc2NhbGFyIGFuZCBkaXZpc29yLgorICovCisjdW5kZWYgU0xPV0RPV05fTUFTVEVSX0NMT0NLCisKKyNkZWZpbmUgTUNLUkRZX1RJTUVPVVQJCTEwMDAKKyNkZWZpbmUgTU9TQ1JEWV9USU1FT1VUIAkxMDAwCisjZGVmaW5lIFBMTEFMT0NLX1RJTUVPVVQJMTAwMAorI2RlZmluZSBQTExCTE9DS19USU1FT1VUCTEwMDAKKworCisvKgorICogV2FpdCB1bnRpbCBtYXN0ZXIgY2xvY2sgaXMgcmVhZHkgKGFmdGVyIHN3aXRjaGluZyBtYXN0ZXIgY2xvY2sgc291cmNlKQorICovCisJLm1hY3JvIHdhaXRfbWNrcmR5CisJbW92CXI0LCAjTUNLUkRZX1RJTUVPVVQKKzE6CXN1YglyNCwgcjQsICMxCisJY21wCXI0LCAjMAorCWJlcQkyZgorCWxkcglyMywgW3IxLCAjKEFUOTFfUE1DX1NSIC0gQVQ5MV9QTUMpXQorCXRzdAlyMywgI0FUOTFfUE1DX01DS1JEWQorCWJlcQkxYgorMjoKKwkuZW5kbQorCisvKgorICogV2FpdCB1bnRpbCBtYXN0ZXIgb3NjaWxsYXRvciBoYXMgc3RhYmlsaXplZC4KKyAqLworCS5tYWNybyB3YWl0X21vc2NyZHkKKwltb3YJcjQsICNNT1NDUkRZX1RJTUVPVVQKKzE6CXN1YglyNCwgcjQsICMxCisJY21wCXI0LCAjMAorCWJlcQkyZgorCWxkcglyMywgW3IxLCAjKEFUOTFfUE1DX1NSIC0gQVQ5MV9QTUMpXQorCXRzdAlyMywgI0FUOTFfUE1DX01PU0NTCisJYmVxCTFiCisyOgorCS5lbmRtCisKKy8qCisgKiBXYWl0IHVudGlsIFBMTEEgaGFzIGxvY2tlZC4KKyAqLworCS5tYWNybyB3YWl0X3BsbGFsb2NrCisJbW92CXI0LCAjUExMQUxPQ0tfVElNRU9VVAorMToJc3ViCXI0LCByNCwgIzEKKwljbXAJcjQsICMwCisJYmVxCTJmCisJbGRyCXIzLCBbcjEsICMoQVQ5MV9QTUNfU1IgLSBBVDkxX1BNQyldCisJdHN0CXIzLCAjQVQ5MV9QTUNfTE9DS0EKKwliZXEJMWIKKzI6CisJLmVuZG0KKworLyoKKyAqIFdhaXQgdW50aWwgUExMQiBoYXMgbG9ja2VkLgorICovCisJLm1hY3JvIHdhaXRfcGxsYmxvY2sKKwltb3YJcjQsICNQTExCTE9DS19USU1FT1VUCisxOglzdWIJcjQsIHI0LCAjMQorCWNtcAlyNCwgIzAKKwliZXEJMmYKKwlsZHIJcjMsIFtyMSwgIyhBVDkxX1BNQ19TUiAtIEFUOTFfUE1DKV0KKwl0c3QJcjMsICNBVDkxX1BNQ19MT0NLQgorCWJlcQkxYgorMjoKKwkuZW5kbQorCisJLnRleHQKKworRU5UUlkoYXQ5MV9zbG93X2Nsb2NrKQorCS8qIFNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrICovCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQorCisJLyoKKwkgKiBSZWdpc3RlciB1c2FnZToKKwkgKiAgUjEgPSBCYXNlIGFkZHJlc3Mgb2YgQVQ5MV9QTUMKKwkgKiAgUjIgPSBCYXNlIGFkZHJlc3Mgb2YgQVQ5MV9TRFJBTUMgKG9yIEFUOTFfU1lTIG9uIEFUOTFSTTkyMDApCisJICogIFIzID0gdGVtcG9yYXJ5IHJlZ2lzdGVyCisJICogIFI0ID0gdGVtcG9yYXJ5IHJlZ2lzdGVyCisJICovCisJbGRyCXIxLCAuYXQ5MV92YV9iYXNlX3BtYworCWxkcglyMiwgLmF0OTFfdmFfYmFzZV9zZHJhbWMKKworCS8qIERyYWluIHdyaXRlIGJ1ZmZlciAqLworCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CisKKyNpZmRlZiBDT05GSUdfQVJDSF9BVDkxUk05MjAwCisJLyogUHV0IFNEUkFNIGluIHNlbGYtcmVmcmVzaCBtb2RlICovCisJbW92CXIzLCAjMQorCXN0cglyMywgW3IyLCAjQVQ5MV9TRFJBTUNfU1JSXQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxQ0FQOSkKKwkvKiBFbmFibGUgU0RSQU0gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKwlsZHIJcjMsIFtyMiwgI0FUOTFfRERSU0RSQ19MUFIgLSBBVDkxX0REUlNEUkNdCisJc3RyCXIzLCAuc2F2ZWRfc2FtOV9scHIKKworCW1vdglyMywgI0FUOTFfRERSU0RSQ19MUENCX1NFTEZfUkVGUkVTSAorCXN0cglyMywgW3IyLCAjQVQ5MV9ERFJTRFJDX0xQUiAtIEFUOTFfRERSU0RSQ10KKyNlbHNlCisJLyogRW5hYmxlIFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCisJbGRyCXIzLCBbcjIsICNBVDkxX1NEUkFNQ19MUFIgLSBBVDkxX1NEUkFNQ10KKwlzdHIJcjMsIC5zYXZlZF9zYW05X2xwcgorCisJbW92CXIzLCAjQVQ5MV9TRFJBTUNfTFBDQl9TRUxGX1JFRlJFU0gKKwlzdHIJcjMsIFtyMiwgI0FUOTFfU0RSQU1DX0xQUiAtIEFUOTFfU0RSQU1DXQorI2VuZGlmCisKKwkvKiBTYXZlIE1hc3RlciBjbG9jayBzZXR0aW5nICovCisJbGRyCXIzLCBbcjEsICMoQVQ5MV9QTUNfTUNLUiAtIEFUOTFfUE1DKV0KKwlzdHIJcjMsIC5zYXZlZF9tY2tyCisKKwkvKgorCSAqIFNldCB0aGUgTWFzdGVyIGNsb2NrIHNvdXJjZSB0byBzbG93IGNsb2NrCisJICovCisJYmljCXIzLCByMywgI0FUOTFfUE1DX0NTUworCXN0cglyMywgW3IxLCAjKEFUOTFfUE1DX01DS1IgLSBBVDkxX1BNQyldCisKKwl3YWl0X21ja3JkeQorCisjaWZkZWYgU0xPV0RPV05fTUFTVEVSX0NMT0NLCisJLyoKKwkgKiBTZXQgdGhlIE1hc3RlciBDbG9jayBQUkVTIGFuZCBNRElWIGZpZWxkcy4KKwkgKgorCSAqIFNlZSBBVDkxUk05MjAwIGVycmF0YSAjMjcgYW5kICMyOCBmb3IgZGV0YWlscy4KKwkgKi8KKwltb3YJcjMsICMwCisJc3RyCXIzLCBbcjEsICMoQVQ5MV9QTUNfTUNLUiAtIEFUOTFfUE1DKV0KKworCXdhaXRfbWNrcmR5CisjZW5kaWYKKworCS8qIFNhdmUgUExMQSBzZXR0aW5nIGFuZCBkaXNhYmxlIGl0ICovCisJbGRyCXIzLCBbcjEsICMoQVQ5MV9DS0dSX1BMTEFSIC0gQVQ5MV9QTUMpXQorCXN0cglyMywgLnNhdmVkX3BsbGFyCisKKwltb3YJcjMsICNBVDkxX1BNQ19QTExDT1VOVAorCW9ycglyMywgcjMsICMoMSA8PCAyOSkJCS8qIGJpdCAyOSBhbHdheXMgc2V0ICovCisJc3RyCXIzLCBbcjEsICMoQVQ5MV9DS0dSX1BMTEFSIC0gQVQ5MV9QTUMpXQorCisJd2FpdF9wbGxhbG9jaworCisJLyogU2F2ZSBQTExCIHNldHRpbmcgYW5kIGRpc2FibGUgaXQgKi8KKwlsZHIJcjMsIFtyMSwgIyhBVDkxX0NLR1JfUExMQlIgLSBBVDkxX1BNQyldCisJc3RyCXIzLCAuc2F2ZWRfcGxsYnIKKworCW1vdglyMywgI0FUOTFfUE1DX1BMTENPVU5UCisJc3RyCXIzLCBbcjEsICMoQVQ5MV9DS0dSX1BMTEJSIC0gQVQ5MV9QTUMpXQorCisJd2FpdF9wbGxibG9jaworCisJLyogVHVybiBvZmYgdGhlIG1haW4gb3NjaWxsYXRvciAqLworCWxkcglyMywgW3IxLCAjKEFUOTFfQ0tHUl9NT1IgLSBBVDkxX1BNQyldCisJYmljCXIzLCByMywgI0FUOTFfUE1DX01PU0NFTgorCXN0cglyMywgW3IxLCAjKEFUOTFfQ0tHUl9NT1IgLSBBVDkxX1BNQyldCisKKwkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgKi8KKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CisKKwkvKiBUdXJuIG9uIHRoZSBtYWluIG9zY2lsbGF0b3IgKi8KKwlsZHIJcjMsIFtyMSwgIyhBVDkxX0NLR1JfTU9SIC0gQVQ5MV9QTUMpXQorCW9ycglyMywgcjMsICNBVDkxX1BNQ19NT1NDRU4KKwlzdHIJcjMsIFtyMSwgIyhBVDkxX0NLR1JfTU9SIC0gQVQ5MV9QTUMpXQorCisJd2FpdF9tb3NjcmR5CisKKwkvKiBSZXN0b3JlIFBMTEIgc2V0dGluZyAqLworCWxkcglyMywgLnNhdmVkX3BsbGJyCisJc3RyCXIzLCBbcjEsICMoQVQ5MV9DS0dSX1BMTEJSIC0gQVQ5MV9QTUMpXQorCisJd2FpdF9wbGxibG9jaworCisJLyogUmVzdG9yZSBQTExBIHNldHRpbmcgKi8KKwlsZHIJcjMsIC5zYXZlZF9wbGxhcgorCXN0cglyMywgW3IxLCAjKEFUOTFfQ0tHUl9QTExBUiAtIEFUOTFfUE1DKV0KKworCXdhaXRfcGxsYWxvY2sKKworI2lmZGVmIFNMT1dET1dOX01BU1RFUl9DTE9DSworCS8qCisJICogRmlyc3Qgc2V0IFBSRVMgaWYgaXQgd2FzIG5vdCAwLAorCSAqIHRoYW4gc2V0IENTUyBhbmQgTURJViBmaWVsZHMuCisJICoKKwkgKiBTZWUgQVQ5MVJNOTIwMCBlcnJhdGEgIzI3IGFuZCAjMjggZm9yIGRldGFpbHMuCisJICovCisJbGRyCXIzLCAuc2F2ZWRfbWNrcgorCXRzdAlyMywgI0FUOTFfUE1DX1BSRVMKKwliZXEJMmYKKwlhbmQJcjMsIHIzLCAjQVQ5MV9QTUNfUFJFUworCXN0cglyMywgW3IxLCAjKEFUOTFfUE1DX01DS1IgLSBBVDkxX1BNQyldCisKKwl3YWl0X21ja3JkeQorI2VuZGlmCisKKwkvKgorCSAqIFJlc3RvcmUgbWFzdGVyIGNsb2NrIHNldHRpbmcKKwkgKi8KKzI6CWxkcglyMywgLnNhdmVkX21ja3IKKwlzdHIJcjMsIFtyMSwgIyhBVDkxX1BNQ19NQ0tSIC0gQVQ5MV9QTUMpXQorCisJd2FpdF9tY2tyZHkKKworI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKKwkvKiBEbyBub3RoaW5nIC0gc2VsZi1yZWZyZXNoIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KQorCS8qIFJlc3RvcmUgTFBSIG9uIEFUOTFDQVA5ICovCisJbGRyCXIzLCAuc2F2ZWRfc2FtOV9scHIKKwlzdHIJcjMsIFtyMiwgI0FUOTFfRERSU0RSQ19MUFIgLSBBVDkxX0REUlNEUkNdCisjZWxzZQorCS8qIFJlc3RvcmUgTFBSIG9uIEFUOTFTQU05ICovCisJbGRyCXIzLCAuc2F2ZWRfc2FtOV9scHIKKwlzdHIJcjMsIFtyMiwgI0FUOTFfU0RSQU1DX0xQUiAtIEFUOTFfU0RSQU1DXQorI2VuZGlmCisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycywgYW5kIHJldHVybiAqLworCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30KKworCisuc2F2ZWRfbWNrcjoKKwkud29yZCAwCisKKy5zYXZlZF9wbGxhcjoKKwkud29yZCAwCisKKy5zYXZlZF9wbGxicjoKKwkud29yZCAwCisKKy5zYXZlZF9zYW05X2xwcjoKKwkud29yZCAwCisKKy5hdDkxX3ZhX2Jhc2VfcG1jOgorCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX1BNQworCisjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMAorLmF0OTFfdmFfYmFzZV9zZHJhbWM6CisJLndvcmQgQVQ5MV9WQV9CQVNFX1NZUworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxQ0FQOSkKKy5hdDkxX3ZhX2Jhc2Vfc2RyYW1jOgorCS53b3JkIEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0REUlNEUkMKKyNlbHNlCisuYXQ5MV92YV9iYXNlX3NkcmFtYzoKKwkud29yZCBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9TRFJBTUMKKyNlbmRpZgorCitFTlRSWShhdDkxX3Nsb3dfY2xvY2tfc3opCisJLndvcmQgLi1hdDkxX3Nsb3dfY2xvY2sKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYwppbmRleCA0NzQ2MTZkLi41ZjE4ZWNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCkBAIC0yMiwxMCArMjIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYwppbmRleCBhYTAyYWE1Li43MWE4MGI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCkBAIC0yMiw5ICsyMiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCBhOGVhZGU0Li4yNGU5NjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjAsOSArMjAsOSBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pcnEuYwppbmRleCAzODYyM2NmLi45YTEyZDg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaXJxLmMKQEAgLTE5LDEwICsxOSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC1sZWRzLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LWxlZHMuYwppbmRleCAyNjJjM2MzLi4xNTEyMTQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LWxlZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LWxlZHMuYwpAQCAtMjEsOSArMjEsOSBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwppbmRleCBmNTFmOTdkLi4wZDk0YTMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCkBAIC0yMiw5ICsyMiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYwppbmRleCBlZjFmY2QxLi5kNTgxZWYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYwpAQCAtMjEsMTEgKzIxLDExIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbHBzNzExMS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwppbmRleCBjYzFiODIxLi5jM2EzM2I4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0yMyw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCBlOGRhM2M1Li5kMDJmY2YyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMTAsOCArMTAsOCBAQAogICogICAxMS0wOC0xOTk5CVBKQglDcmVhdGVkIEFSTTc1MDAgdmVyc2lvbiwgZGVyaXZlZCBmcm9tIFJpc2NQQyBjb2RlCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIGlubGluZSBpbnQgZml4dXBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDMzMjZhYTkuLjg3YjMyZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0zMiw0ICszMiwxMiBAQAogI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMJCTB4MDAwMDAwMDAKICNkZWZpbmUgRkxVU0hfQkFTRQkJMHhkZjAwMDAwMAogCisvKgorICogU3BhcnNlbWVtIHN1cHBvcnQuICBFYWNoIHNlY3Rpb24gaXMgYSBtYXhpbXVtIG9mIDY0TUIuICBUaGUgc2VjdGlvbnMKKyAqIGFyZSBvZmZzZXQgYnkgMTI4TUIgYW5kIGNhbiBjb3ZlciAxMjhNQiwgc28gdGhhdCBnaXZlcyB1cyBhIG1heGltdW0KKyAqIG9mIDI5IHBoeXNtZW0gYml0cy4KKyAqLworI2RlZmluZSBNQVhfUEhZU01FTV9CSVRTCTI5CisjZGVmaW5lIFNFQ1RJT05fU0laRV9CSVRTCTI2CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzUwMC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCA2MjRmYzI4Li42ZDMyNWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtNiw4ICs2LDggQEAKICNpZm5kZWYgX19BU01fQVJDSF9TWVNURU1fSAogI2RlZmluZSBfX0FTTV9BUkNIX1NZU1RFTV9ICiAKKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZQppbmRleCA5OWFjMmU1Li40ZGM0NTg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogCiAjIENvbW1vbiBvYmplY3RzCiBvYmoteSAJCQk6PSB0aW1lLm8gaXJxLm8gY2xvY2subyBzZXJpYWwubyBpby5vIGlkLm8gcHNjLm8gXAotCQkJICAgZ3Bpby5vIG11eC5vCisJCQkgICBncGlvLm8gbXV4Lm8gZGV2aWNlcy5vIHVzYi5vCiAKICMgQm9hcmQgc3BlY2lmaWMKIG9iai0kKENPTkZJR19NQUNIX0RBVklOQ0lfRVZNKSAgKz0gYm9hcmQtZXZtLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1ldm0uYwppbmRleCAxMzQzNTU3Li5hOTU3ZDIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWV2bS5jCkBAIC0xMywyMCArMTMsMjggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjZjg1N3guaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXQyNC5oPgorCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CiAKIC8qIG90aGVyIG1pc2MuIGluaXQgZnVuY3Rpb25zICovCiB2b2lkIF9faW5pdCBkYXZpbmNpX3BzY19pbml0KHZvaWQpOwpAQCAtMzQsMTAgKzQyLDEwIEBACiB2b2lkIF9faW5pdCBkYXZpbmNpX21hcF9jb21tb25faW8odm9pZCk7CiB2b2lkIF9faW5pdCBkYXZpbmNpX2luaXRfY29tbW9uX2h3KHZvaWQpOwogCi0vKiBOT1IgRmxhc2ggYmFzZSBhZGRyZXNzIHNldCB0byBDUzAgYnkgZGVmYXVsdCAqLwotI2RlZmluZSBOT1JfRkxBU0hfUEhZUyAweDAyMDAwMDAwCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYXZpbmNpX2V2bV9wYXJ0aXRpb25zW10gPSB7CitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGF2aW5jaV9ldm1fbm9yZmxhc2hfcGFydGl0aW9uc1tdID0gewogCS8qIGJvb3Rsb2FkZXIgKFUtQm9vdCwgZXRjKSBpbiBmaXJzdCA0IHNlY3RvcnMgKi8KIAl7CiAJCS5uYW1lCQk9ICJib290bG9hZGVyIiwKQEAgLTY4LDMyICs3NiwzMjMgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBkYXZpbmNpX2V2bV9mbGFzaF9kYXRhID0geworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZGF2aW5jaV9ldm1fbm9yZmxhc2hfZGF0YSA9IHsKIAkud2lkdGgJCT0gMiwKLQkucGFydHMJCT0gZGF2aW5jaV9ldm1fcGFydGl0aW9ucywKLQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGRhdmluY2lfZXZtX3BhcnRpdGlvbnMpLAorCS5wYXJ0cwkJPSBkYXZpbmNpX2V2bV9ub3JmbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZGF2aW5jaV9ldm1fbm9yZmxhc2hfcGFydGl0aW9ucyksCiB9OwogCiAvKiBOT1RFOiBDRkkgcHJvYmUgd2lsbCBjb3JyZWN0bHkgZGV0ZWN0IGZsYXNoIHBhcnQgYXMgMzJNLCBidXQgRU1JRgogICogbGltaXRzIGFkZHJlc3NlcyB0byAxNk0sIHNvIHVzaW5nIGFkZHJlc3NlcyBwYXN0IDE2TSB3aWxsIHdyYXAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGF2aW5jaV9ldm1fZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IE5PUl9GTEFTSF9QSFlTLAotCS5lbmQJCT0gTk9SX0ZMQVNIX1BIWVMgKyBTWl8xNk0gLSAxLAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXZpbmNpX2V2bV9ub3JmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UwX0JBU0UsCisJLmVuZAkJPSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTBfQkFTRSArIFNaXzE2TSAtIDEsCiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9ldm1fZmxhc2hfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9ldm1fbm9yZmxhc2hfZGV2aWNlID0gewogCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKIAkuaWQJCT0gMCwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZGF2aW5jaV9ldm1fZmxhc2hfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZGF2aW5jaV9ldm1fbm9yZmxhc2hfZGF0YSwKIAl9LAogCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmZGF2aW5jaV9ldm1fZmxhc2hfcmVzb3VyY2UsCisJLnJlc291cmNlCT0gJmRhdmluY2lfZXZtX25vcmZsYXNoX3Jlc291cmNlLAogfTsKIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX1BBTE1DSElQX0JLMzcxMCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JMS19ERVZfUEFMTUNISVBfQkszNzEwX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpZGVfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgICAgICAgICAgPSBEQVZJTkNJX0NGQ19BVEFfQkFTRSwKKwkJLmVuZCAgICAgICAgICAgID0gREFWSU5DSV9DRkNfQVRBX0JBU0UgKyAweDdmZiwKKwkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgICAgICAgICA9IElSUV9JREUsCisJCS5lbmQgICAgICAgICAgICA9IElSUV9JREUsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGlkZV9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpZGVfZGV2ID0geworCS5uYW1lICAgICAgICAgICA9ICJwYWxtX2JrMzcxMCIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLnJlc291cmNlICAgICAgID0gaWRlX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGlkZV9yZXNvdXJjZXMpLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmaWRlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgICAgICA9IERNQV8zMkJJVF9NQVNLLAorCX0sCit9OworCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEkyQyBHUElPIGV4cGFuZGVycworICovCisKKyNkZWZpbmUgUENGX1V4eF9CQVNFKHgpCShEQVZJTkNJX05fR1BJTyArICgoeCkgKiA4KSkKKworCisvKiBVMiAtLSBMRURzICovCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZXZtX2xlZHNbXSA9IHsKKwl7IC5uYW1lID0gIkRTOCIsIC5hY3RpdmVfbG93ID0gMSwKKwkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLCB9LAorCXsgLm5hbWUgPSAiRFM3IiwgLmFjdGl2ZV9sb3cgPSAxLCB9LAorCXsgLm5hbWUgPSAiRFM2IiwgLmFjdGl2ZV9sb3cgPSAxLCB9LAorCXsgLm5hbWUgPSAiRFM1IiwgLmFjdGl2ZV9sb3cgPSAxLCB9LAorCXsgLm5hbWUgPSAiRFM0IiwgLmFjdGl2ZV9sb3cgPSAxLCB9LAorCXsgLm5hbWUgPSAiRFMzIiwgLmFjdGl2ZV9sb3cgPSAxLCB9LAorCXsgLm5hbWUgPSAiRFMyIiwgLmFjdGl2ZV9sb3cgPSAxLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gIm1tYzAiLCB9LAorCXsgLm5hbWUgPSAiRFMxIiwgLmFjdGl2ZV9sb3cgPSAxLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImlkZS1kaXNrIiwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBldm1fbGVkX2RhdGEgPSB7CisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShldm1fbGVkcyksCisJLmxlZHMJCT0gZXZtX2xlZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXZtX2xlZF9kZXY7CisKK3N0YXRpYyBpbnQKK2V2bV9sZWRfc2V0dXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGdwaW8sIHVuc2lnbmVkIG5ncGlvLCB2b2lkICpjKQoreworCXN0cnVjdCBncGlvX2xlZCAqbGVkcyA9IGV2bV9sZWRzOworCWludCBzdGF0dXM7CisKKwl3aGlsZSAobmdwaW8tLSkgeworCQlsZWRzLT5ncGlvID0gZ3BpbysrOworCQlsZWRzKys7CisJfQorCisJLyogd2hhdCBhbiBleHRyZW1lbHkgYW5ub3lpbmcgd2F5IHRvIGJlIGZvcmNlZCB0byBoYW5kbGUKKwkgKiBkZXZpY2UgdW5yZWdpc3RyYXRpb24gLi4uCisJICovCisJZXZtX2xlZF9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImxlZHMtZ3BpbyIsIDApOworCXBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShldm1fbGVkX2RldiwKKwkJCSZldm1fbGVkX2RhdGEsIHNpemVvZiBldm1fbGVkX2RhdGEpOworCisJZXZtX2xlZF9kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChldm1fbGVkX2Rldik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChldm1fbGVkX2Rldik7CisJCWV2bV9sZWRfZGV2ID0gTlVMTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorZXZtX2xlZF90ZWFyZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZ3BpbywgdW5zaWduZWQgbmdwaW8sIHZvaWQgKmMpCit7CisJaWYgKGV2bV9sZWRfZGV2KSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV2bV9sZWRfZGV2KTsKKwkJZXZtX2xlZF9kZXYgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2Y4NTd4X3BsYXRmb3JtX2RhdGEgcGNmX2RhdGFfdTIgPSB7CisJLmdwaW9fYmFzZQk9IFBDRl9VeHhfQkFTRSgwKSwKKwkuc2V0dXAJCT0gZXZtX2xlZF9zZXR1cCwKKwkudGVhcmRvd24JPSBldm1fbGVkX3RlYXJkb3duLAorfTsKKworCisvKiBVMTggLSBBL1YgY2xvY2sgZ2VuZXJhdG9yIGFuZCB1c2VyIHN3aXRjaCAqLworCitzdGF0aWMgaW50IHN3X2dwaW87CisKK3N0YXRpYyBzc2l6ZV90Citzd19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHN3X2dwaW8pID8gIm9uXG4iIDogIm9mZlxuIjsKKworCXN0cmNweShidWYsIHMpOworCXJldHVybiBzdHJsZW4ocyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih1c2VyX3N3LCBTX0lSVUdPLCBzd19zaG93LCBOVUxMKTsKKworc3RhdGljIGludAorZXZtX3UxOF9zZXR1cChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZ3BpbywgdW5zaWduZWQgbmdwaW8sIHZvaWQgKmMpCit7CisJaW50CXN0YXR1czsKKworCS8qIGV4cG9ydCBkaXAgc3dpdGNoIG9wdGlvbiAqLworCXN3X2dwaW8gPSBncGlvICsgNzsKKwlzdGF0dXMgPSBncGlvX3JlcXVlc3Qoc3dfZ3BpbywgInVzZXJfc3ciKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHN3X2dwaW8pOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3VzZXJfc3cpOworCWVsc2UKKwkJZ3Bpb19mcmVlKHN3X2dwaW8pOworCWlmIChzdGF0dXMgIT0gMCkKKwkJc3dfZ3BpbyA9IC1FSU5WQUw7CisKKwkvKiBhdWRpbyBQTEw6ICA0OCBrSHogKHZzIDQ0LjEgb3IgMzIpLCBzaW5nbGUgcmF0ZSAodnMgZG91YmxlKSAqLworCWdwaW9fcmVxdWVzdChncGlvICsgMywgInBsbF9mczIiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDMsIDApOworCisJZ3Bpb19yZXF1ZXN0KGdwaW8gKyAyLCAicGxsX2ZzMSIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgMiwgMCk7CisKKwlncGlvX3JlcXVlc3QoZ3BpbyArIDEsICJwbGxfc3IiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDEsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2V2bV91MThfdGVhcmRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGdwaW8sIHVuc2lnbmVkIG5ncGlvLCB2b2lkICpjKQoreworCWdwaW9fZnJlZShncGlvICsgMSk7CisJZ3Bpb19mcmVlKGdwaW8gKyAyKTsKKwlncGlvX2ZyZWUoZ3BpbyArIDMpOworCisJaWYgKHN3X2dwaW8gPiAwKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl91c2VyX3N3KTsKKwkJZ3Bpb19mcmVlKHN3X2dwaW8pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2Y4NTd4X3BsYXRmb3JtX2RhdGEgcGNmX2RhdGFfdTE4ID0geworCS5ncGlvX2Jhc2UJPSBQQ0ZfVXh4X0JBU0UoMSksCisJLm5fbGF0Y2gJPSAoMSA8PCAzKSB8ICgxIDw8IDIpIHwgKDEgPDwgMSksCisJLnNldHVwCQk9IGV2bV91MThfc2V0dXAsCisJLnRlYXJkb3duCT0gZXZtX3UxOF90ZWFyZG93biwKK307CisKKworLyogVTM1IC0gdmFyaW91cyBJL08gc2lnbmFscyB1c2VkIHRvIG1hbmFnZSBVU0IsIENGLCBBVEEsIGV0YyAqLworCitzdGF0aWMgaW50Citldm1fdTM1X3NldHVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBncGlvLCB1bnNpZ25lZCBuZ3Bpbywgdm9pZCAqYykKK3sKKwkvKiBwMCA9IG5EUlZfVkJVUyAoaW5pdGlhbDogIGRvbid0IHN1cHBseSBpdCkgKi8KKwlncGlvX3JlcXVlc3QoZ3BpbyArIDAsICJuRFJWX1ZCVVMiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDAsIDEpOworCisJLyogcDEgPSBWRERJTVhfRU4gKi8KKwlncGlvX3JlcXVlc3QoZ3BpbyArIDEsICJWRERJTVhfRU4iKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDEsIDEpOworCisJLyogcDIgPSBWTFlOUV9FTiAqLworCWdwaW9fcmVxdWVzdChncGlvICsgMiwgIlZMWU5RX0VOIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8gKyAyLCAxKTsKKworCS8qIHAzID0gbjNWM19DRl9SRVNFVCAoaW5pdGlhbDogc3RheSBpbiByZXNldCkgKi8KKwlncGlvX3JlcXVlc3QoZ3BpbyArIDMsICJuQ0ZfUkVTRVQiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDMsIDApOworCisJLyogKHA0IHVudXNlZCkgKi8KKworCS8qIHA1ID0gMVY4X1dMQU5fUkVTRVQgKGluaXRpYWw6IHN0YXkgaW4gcmVzZXQpICovCisJZ3Bpb19yZXF1ZXN0KGdwaW8gKyA1LCAiV0xBTl9SRVNFVCIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgNSwgMSk7CisKKwkvKiBwNiA9IG5BVEFfU0VMIChpbml0aWFsOiBzZWxlY3QpICovCisJZ3Bpb19yZXF1ZXN0KGdwaW8gKyA2LCAibkFUQV9TRUwiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIDYsIDApOworCisJLyogcDcgPSBuQ0ZfU0VMIChpbml0aWFsOiBkZXNlbGVjdCkgKi8KKwlncGlvX3JlcXVlc3QoZ3BpbyArIDcsICJuQ0ZfU0VMIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8gKyA3LCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citldm1fdTM1X3RlYXJkb3duKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBncGlvLCB1bnNpZ25lZCBuZ3Bpbywgdm9pZCAqYykKK3sKKwlncGlvX2ZyZWUoZ3BpbyArIDcpOworCWdwaW9fZnJlZShncGlvICsgNik7CisJZ3Bpb19mcmVlKGdwaW8gKyA1KTsKKwlncGlvX2ZyZWUoZ3BpbyArIDMpOworCWdwaW9fZnJlZShncGlvICsgMik7CisJZ3Bpb19mcmVlKGdwaW8gKyAxKTsKKwlncGlvX2ZyZWUoZ3BpbyArIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjZjg1N3hfcGxhdGZvcm1fZGF0YSBwY2ZfZGF0YV91MzUgPSB7CisJLmdwaW9fYmFzZQk9IFBDRl9VeHhfQkFTRSgyKSwKKwkuc2V0dXAJCT0gZXZtX3UzNV9zZXR1cCwKKwkudGVhcmRvd24JPSBldm1fdTM1X3RlYXJkb3duLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTW9zdCBvZiB0aGlzIEVFUFJPTSBpcyB1bnVzZWQsIGJ1dCBVLUJvb3QgdXNlcyBzb21lIGRhdGE6CisgKiAgLSAweDdmMDAsIDYgYnl0ZXMgRXRoZXJuZXQgQWRkcmVzcworICogIC0gMHgwMDM5LCAxIGJ5dGUgTlRTQyB2cyBQQUwgKGJpdCAweDgwID09IFBBTCkKKyAqICAtIC4uLiBuZXdlciBib2FyZHMgbWF5IGhhdmUgbW9yZQorICovCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBlZXByb21faW5mbyA9IHsKKwkuYnl0ZV9sZW4JPSAoMjU2KjEwMjQpIC8gOCwKKwkucGFnZV9zaXplCT0gNjQsCisJLmZsYWdzCQk9IEFUMjRfRkxBR19BRERSMTYsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaTJjX2luZm9bXSA9ICB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU3NCIsIDB4MzgpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZwY2ZfZGF0YV91MiwKKwl9LAorCXsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NzQiLCAweDM5KSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGNmX2RhdGFfdTE4LAorCX0sCisJeworCQlJMkNfQk9BUkRfSU5GTygicGNmODU3NCIsIDB4M2EpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZwY2ZfZGF0YV91MzUsCisJfSwKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCIyNGMyNTYiLCAweDUwKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZWVwcm9tX2luZm8sCisJfSwKKwkvKiBBTFNPOgorCSAqIC0gdHZsMzIwYWljMzMgYXVkaW8gY29kZWMgKDB4MWIpCisJICogLSBtc3A0MzAgbWljcm9jb250cm9sbGVyICgweDIzKQorCSAqIC0gdHZwNTE0NiB2aWRlbyBkZWNvZGVyICgweDVkKQorCSAqLworfTsKKworLyogVGhlIG1zcDQzMCB1c2VzIGEgc2xvdyBiaXRiYW5nZWQgSTJDIGltcGxlbWVudGF0aW9uIChlcmdvIDIwIEtIeiksCisgKiB3aGljaCByZXF1aXJlcyAxMDAgdXNlYyBvZiBpZGxlIGJ1cyBhZnRlciBpMmMgd3JpdGVzIHNlbnQgdG8gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9pMmNfcGxhdGZvcm1fZGF0YSBpMmNfcGRhdGEgPSB7CisJLmJ1c19mcmVxCT0gMjAgLyoga0h6ICovLAorCS5idXNfZGVsYXkJPSAxMDAgLyogdXNlYyAqLywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBldm1faW5pdF9pMmModm9pZCkKK3sKKwlkYXZpbmNpX2luaXRfaTJjKCZpMmNfcGRhdGEpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyY19pbmZvLCBBUlJBWV9TSVpFKGkyY19pbmZvKSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkYXZpbmNpX2V2bV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmZGF2aW5jaV9ldm1fZmxhc2hfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQorCSZkYXZpbmNpX2V2bV9ub3JmbGFzaF9kZXZpY2UsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX1BBTE1DSElQX0JLMzcxMCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JMS19ERVZfUEFMTUNISVBfQkszNzEwX01PRFVMRSkKKwkmaWRlX2RldiwKKyNlbmRpZgogfTsKIAogc3RhdGljIHZvaWQgX19pbml0CkBAIC0xMDYsMTMgKzQwNSwyMSBAQAogewogCWRhdmluY2lfcHNjX2luaXQoKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfREFWSU5DSSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9EQVZJTkNJX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX1BBTE1DSElQX0JLMzcxMCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JMS19ERVZfUEFMTUNISVBfQkszNzEwX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBib3RoIElERSBhbmQgTk9SIGZsYXNoIGFyZSBlbmFibGVkLCAiCiAJICAgICAgICJidXQgc2hhcmUgcGlucy5cblx0IERpc2FibGUgSURFIGZvciBOT1Igc3VwcG9ydC5cbiIpOwogI2VuZGlmCisjZW5kaWYKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRhdmluY2lfZXZtX2RldmljZXMsCiAJCQkgICAgIEFSUkFZX1NJWkUoZGF2aW5jaV9ldm1fZGV2aWNlcykpOworCWV2bV9pbml0X2kyYygpOworCisJLyogaXJsbWw2NDAxIHN1c3RhaW5zIG92ZXIgM0EsIHN3aXRjaGVzIDVWIGluIHVuZGVyIDggbXNlYyAqLworCXNldHVwX3VzYig1MDAsIDgpOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgZGF2aW5jaV9ldm1faXJxX2luaXQodm9pZCkKQEAgLTEyNCw3ICs0MzEsNyBAQAogTUFDSElORV9TVEFSVChEQVZJTkNJX0VWTSwgIkRhVmluY2kgRVZNIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIDxzb3VyY2VAbXZpc3RhLmNvbT4gKi8KIAkucGh5c19pbyAgICAgID0gSU9fUEhZUywKLQkuaW9fcGdfb2Zmc3QgID0gKGlvX3AydihJT19QSFlTKSA+PiAxOCkgJiAweGZmZmMsCisJLmlvX3BnX29mZnN0ICA9IChfX0lPX0FERFJFU1MoSU9fUEhZUykgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcyAgPSAoREFWSU5DSV9ERFJfQkFTRSArIDB4MTAwKSwKIAkubWFwX2lvCSAgICAgID0gZGF2aW5jaV9ldm1fbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2V2bV9pcnFfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmMKaW5kZXggZDQ2YzY5Yi4uMjhmNmRiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2Nsb2NrLmMKQEAgLTE2LDkgKzE2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL3BzYy5oPgogI2luY2x1ZGUgImNsb2NrLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRiMWRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogbWFjaC1kYXZpbmNpL2RldmljZXMuYworICoKKyAqIERhVmluY2kgcGxhdGZvcm0gZGV2aWNlIHNldHVwL2luaXRpYWxpemF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IERBVklOQ0lfSTJDX0JBU0UsCisJCS5lbmQJCT0gREFWSU5DSV9JMkNfQkFTRSArIDB4NDAsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElSUV9JMkMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGF2aW5jaV9pMmNfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpMmNfZGF2aW5jaSIsCisJLmlkICAgICAgICAgICAgID0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaTJjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaTJjX3Jlc291cmNlcywKK307CisKK3ZvaWQgX19pbml0IGRhdmluY2lfaW5pdF9pMmMoc3RydWN0IGRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWRhdmluY2lfaTJjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRhdmluY2lfaTJjX2RldmljZSk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCmluZGV4IGM5Y2I0ZjAuLmI0OWU5ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUSSBEYVZpbmNpIEdQSU8gU3VwcG9ydAogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgRGF2aWQgQnJvd25lbGwKICAqIENvcHlyaWdodCAoYykgMjAwNywgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTI2LDYzICsyNiwyMyBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKwogc3RhdGljIERFRklORV9TUElOTE9DSyhncGlvX2xvY2spOwotc3RhdGljIERFQ0xBUkVfQklUTUFQKGdwaW9faW5fdXNlLCBEQVZJTkNJX05fR1BJTyk7CiAKLWludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqdGFnKQotewotCWlmIChncGlvID49IERBVklOQ0lfTl9HUElPKQotCQlyZXR1cm4gLUVJTlZBTDsKK3N0cnVjdCBkYXZpbmNpX2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19jb250cm9sbGVyCSpfX2lvbWVtIHJlZ3M7Cit9OwogCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoZ3BpbywgZ3Bpb19pbl91c2UpKQotCQlyZXR1cm4gLUVCVVNZOworc3RhdGljIHN0cnVjdCBkYXZpbmNpX2dwaW8gY2hpcHNbRElWX1JPVU5EX1VQKERBVklOQ0lfTl9HUElPLCAzMildOwogCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7Ci0KLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JaWYgKGdwaW8gPj0gREFWSU5DSV9OX0dQSU8pCi0JCXJldHVybjsKLQotCWNsZWFyX2JpdChncGlvLCBncGlvX2luX3VzZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZnJlZSk7CiAKIC8qIGNyZWF0ZSBhIG5vbi1pbmxpbmVkIHZlcnNpb24gKi8KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jb250cm9sbGVyICpfX2lvbWVtIGdwaW8yY29udHJvbGxlcih1bnNpZ25lZCBncGlvKQorc3RhdGljIHN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gX19pbml0IGdwaW8yY29udHJvbGxlcih1bnNpZ25lZCBncGlvKQogewogCXJldHVybiBfX2dwaW9fdG9fY29udHJvbGxlcihncGlvKTsKIH0KIAotLyoKLSAqIEFzc3VtaW5nIHRoZSBwaW4gaXMgbXV4ZWQgYXMgYSBncGlvIG91dHB1dCwgc2V0IGl0cyBvdXRwdXQgdmFsdWUuCi0gKi8KLXZvaWQgX19ncGlvX3NldCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGdwaW9fY29udHJvbGxlciAqX19pb21lbSBnID0gZ3BpbzJjb250cm9sbGVyKGdwaW8pOwotCi0JX19yYXdfd3JpdGVsKF9fZ3Bpb19tYXNrKGdwaW8pLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fZ3Bpb19zZXQpOwotCi0KLS8qCi0gKiBSZWFkIHRoZSBwaW4ncyB2YWx1ZSAod29ya3MgZXZlbiBpZiBpdCdzIHNldCB1cCBhcyBvdXRwdXQpOwotICogcmV0dXJucyB6ZXJvL25vbnplcm8uCi0gKgotICogTm90ZSB0aGF0IGNoYW5nZXMgYXJlIHN5bmNoZWQgdG8gdGhlIEdQSU8gY2xvY2ssIHNvIHJlYWRpbmcgdmFsdWVzIGJhY2sKLSAqIHJpZ2h0IGFmdGVyIHlvdSd2ZSBzZXQgdGhlbSBtYXkgZ2l2ZSBvbGQgdmFsdWVzLgotICovCi1pbnQgX19ncGlvX2dldCh1bnNpZ25lZCBncGlvKQotewotCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZyA9IGdwaW8yY29udHJvbGxlcihncGlvKTsKLQotCXJldHVybiAhIShfX2dwaW9fbWFzayhncGlvKSAmIF9fcmF3X3JlYWRsKCZnLT5pbl9kYXRhKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fZ3Bpb19nZXQpOwotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC05MSwzNiArNTEsNDUgQEAKICAqIG5lZWRlZCwgYW5kIGVuYWJsZSB0aGUgR1BJTyBjbG9jay4KICAqLwogCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKK3N0YXRpYyBpbnQgZGF2aW5jaV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZyA9IGdwaW8yY29udHJvbGxlcihncGlvKTsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvICpkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBkYXZpbmNpX2dwaW8sIGNoaXApOworCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZyA9IGQtPnJlZ3M7CiAJdTMyIHRlbXA7Ci0JdTMyIG1hc2s7Ci0KLQlpZiAoIWcpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrKCZncGlvX2xvY2spOwotCW1hc2sgPSBfX2dwaW9fbWFzayhncGlvKTsKIAl0ZW1wID0gX19yYXdfcmVhZGwoJmctPmRpcik7Ci0JdGVtcCB8PSBtYXNrOworCXRlbXAgfD0gKDEgPDwgb2Zmc2V0KTsKIAlfX3Jhd193cml0ZWwodGVtcCwgJmctPmRpcik7CiAJc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25faW5wdXQpOwogCi1pbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKKy8qCisgKiBSZWFkIHRoZSBwaW4ncyB2YWx1ZSAod29ya3MgZXZlbiBpZiBpdCdzIHNldCB1cCBhcyBvdXRwdXQpOworICogcmV0dXJucyB6ZXJvL25vbnplcm8uCisgKgorICogTm90ZSB0aGF0IGNoYW5nZXMgYXJlIHN5bmNoZWQgdG8gdGhlIEdQSU8gY2xvY2ssIHNvIHJlYWRpbmcgdmFsdWVzIGJhY2sKKyAqIHJpZ2h0IGFmdGVyIHlvdSd2ZSBzZXQgdGhlbSBtYXkgZ2l2ZSBvbGQgdmFsdWVzLgorICovCitzdGF0aWMgaW50IGRhdmluY2lfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZyA9IGdwaW8yY29udHJvbGxlcihncGlvKTsKLQl1MzIgdGVtcDsKLQl1MzIgbWFzazsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvICpkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBkYXZpbmNpX2dwaW8sIGNoaXApOworCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZyA9IGQtPnJlZ3M7CiAKLQlpZiAoIWcpCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiAoMSA8PCBvZmZzZXQpICYgX19yYXdfcmVhZGwoJmctPmluX2RhdGEpOworfQorCitzdGF0aWMgaW50CitkYXZpbmNpX2RpcmVjdGlvbl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGRhdmluY2lfZ3BpbyAqZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZGF2aW5jaV9ncGlvLCBjaGlwKTsKKwlzdHJ1Y3QgZ3Bpb19jb250cm9sbGVyICpfX2lvbWVtIGcgPSBkLT5yZWdzOworCXUzMiB0ZW1wOworCXUzMiBtYXNrID0gMSA8PCBvZmZzZXQ7CiAKIAlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0JbWFzayA9IF9fZ3Bpb19tYXNrKGdwaW8pOwogCXRlbXAgPSBfX3Jhd19yZWFkbCgmZy0+ZGlyKTsKIAl0ZW1wICY9IH5tYXNrOwogCV9fcmF3X3dyaXRlbChtYXNrLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7CkBAIC0xMjgsOSArOTcsNDkgQEAKIAlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKIAogLyoKKyAqIEFzc3VtaW5nIHRoZSBwaW4gaXMgbXV4ZWQgYXMgYSBncGlvIG91dHB1dCwgc2V0IGl0cyBvdXRwdXQgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkCitkYXZpbmNpX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW8gKmQgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGRhdmluY2lfZ3BpbywgY2hpcCk7CisJc3RydWN0IGdwaW9fY29udHJvbGxlciAqX19pb21lbSBnID0gZC0+cmVnczsKKworCV9fcmF3X3dyaXRlbCgoMSA8PCBvZmZzZXQpLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfZ3Bpb19zZXR1cCh2b2lkKQoreworCWludCBpLCBiYXNlOworCisJZm9yIChpID0gMCwgYmFzZSA9IDA7CisJCQlpIDwgQVJSQVlfU0laRShjaGlwcyk7CisJCQlpKyssIGJhc2UgKz0gMzIpIHsKKwkJY2hpcHNbaV0uY2hpcC5sYWJlbCA9ICJEYVZpbmNpIjsKKworCQljaGlwc1tpXS5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX2luOworCQljaGlwc1tpXS5jaGlwLmdldCA9IGRhdmluY2lfZ3Bpb19nZXQ7CisJCWNoaXBzW2ldLmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGRhdmluY2lfZGlyZWN0aW9uX291dDsKKwkJY2hpcHNbaV0uY2hpcC5zZXQgPSBkYXZpbmNpX2dwaW9fc2V0OworCisJCWNoaXBzW2ldLmNoaXAuYmFzZSA9IGJhc2U7CisJCWNoaXBzW2ldLmNoaXAubmdwaW8gPSBEQVZJTkNJX05fR1BJTyAtIGJhc2U7CisJCWlmIChjaGlwc1tpXS5jaGlwLm5ncGlvID4gMzIpCisJCQljaGlwc1tpXS5jaGlwLm5ncGlvID0gMzI7CisKKwkJY2hpcHNbaV0ucmVncyA9IGdwaW8yY29udHJvbGxlcihiYXNlKTsKKworCQlncGlvY2hpcF9hZGQoJmNoaXBzW2ldLmNoaXApOworCX0KKworCXJldHVybiAwOworfQorcHVyZV9pbml0Y2FsbChkYXZpbmNpX2dwaW9fc2V0dXApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCiAgKiBXZSBleHBlY3QgaXJxcyB3aWxsIG5vcm1hbGx5IGJlIHNldCB1cCBhcyBpbnB1dCBwaW5zLCBidXQgdGhleSBjYW4gYWxzbyBiZQogICogdXNlZCBhcyBvdXRwdXQgcGlucyAuLi4gd2hpY2ggaXMgY29udmVuaWVudCBmb3IgdGVzdGluZy4KICAqCkBAIC0yMDEsNyArMjEwLDYgQEAKIAlkZXNjLT5jaGlwLT5hY2soaXJxKTsKIAl3aGlsZSAoMSkgewogCQl1MzIJCXN0YXR1czsKLQkJc3RydWN0IGlycV9kZXNjCSpncGlvOwogCQlpbnQJCW47CiAJCWludAkJcmVzOwogCkBAIC0yMTUsMTIgKzIyMywxMCBAQAogCiAJCS8qIG5vdyBkZW11eCB0aGVtIHRvIHRoZSByaWdodCBsb3dsZXZlbCBoYW5kbGVyICovCiAJCW4gPSAoaW50KWdldF9pcnFfZGF0YShpcnEpOwotCQlncGlvID0gJmlycV9kZXNjW25dOwogCQl3aGlsZSAoc3RhdHVzKSB7CiAJCQlyZXMgPSBmZnMoc3RhdHVzKTsKIAkJCW4gKz0gcmVzOwotCQkJZ3BpbyArPSByZXM7Ci0JCQlkZXNjX2hhbmRsZV9pcnEobiAtIDEsIGdwaW8gLSAxKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShuIC0gMSk7CiAJCQlzdGF0dXMgPj49IHJlczsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lkLmMKaW5kZXggNzA2MDhmNy4uYmYwNjdkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lkLmMKQEAgLTEzLDggKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjZGVmaW5lIEpUQUdfSURfQkFTRQkJMHgwMWM0MDAyOAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9jb21tb24uaAppbmRleCBhOTdkZmJiLi40YjUyMmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvY29tbW9uLmgKQEAgLTE2LDQgKzE2LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgZGF2aW5jaV90aW1lcjsKIAorLyogcGFyYW1ldGVycyBkZXNjcmliZSBWQlVTIHNvdXJjaW5nIGZvciBob3N0IG1vZGUgKi8KK2V4dGVybiB2b2lkIHNldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zZWMpOworCiAjZW5kaWYgLyogX19BUkNIX0FSTV9NQUNIX0RBVklOQ0lfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZWMxNTFjYy4uYjNhMjk2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNkZWZpbmUJX19EQVZJTkNJX0dQSU9fSAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAvKgpAQCAtMjcsMTMgKzI4LDE2IEBACiAgKiBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gUElOTVVYMCBhbmQgUElOTVVYMSB0byBiZSBzdXJlIHRob3NlIHBpbnMgYXJlCiAgKiB1c2VkIGFzIGdwaW9zLCBub3Qgd2l0aCBvdGhlciBwZXJpcGhlcmFscy4KICAqCi0gKiBHUElPcyBhcmUgbnVtYmVyZWQgMC4uKERBVklOQ0lfTl9HUElPLTEpLiAgRm9yIGRvY3VtZW50YXRpb24sIGFuZCBtYXliZQotICogZm9yIGxhdGVyIHVwZGF0ZXMsIGNvZGUgc2hvdWxkIHdyaXRlIEdQSU8oTikgb3I6CisgKiBPbi1jaGlwIEdQSU9zIGFyZSBudW1iZXJlZCAwLi4oREFWSU5DSV9OX0dQSU8tMSkuICBGb3IgZG9jdW1lbnRhdGlvbiwKKyAqIGFuZCBtYXliZSBmb3IgbGF0ZXIgdXBkYXRlcywgY29kZSBzaG91bGQgd3JpdGUgR1BJTyhOKSBvcjoKICAqICAtIEdQSU9WMTgoTikgZm9yIDEuOFYgcGlucywgTiBpbiAwLi41Mzsgc2FtZSBhcyBHUElPKDApLi5HUElPKDUzKQogICogIC0gR1BJT1YzMyhOKSBmb3IgMy4zViBwaW5zLCBOIGluIDAuLjE3OyBzYW1lIGFzIEdQSU8oNTQpLi5HUElPKDcwKQogICoKICAqIEZvciBHUElPIElSUXMgdXNlIGdwaW9fdG9faXJxKEdQSU8oTikpIG9yIGdwaW9fdG9faXJxKEdQSU9WMzMoTikpIGV0YwogICogZm9yIG5vdywgdGhhdCdzICE9IEdQSU8oTikKKyAqCisgKiBHUElPcyBjYW4gYWxzbyBiZSBvbiBleHRlcm5hbCBjaGlwcywgbnVtYmVyZWQgYWZ0ZXIgdGhlIG9uZXMgYnVpbHQtaW4KKyAqIHRvIHRoZSBEYVZpbmNpIGNoaXAuICBGb3Igbm93LCB0aGV5IHdvbid0IGJlIHVzYWJsZSBhcyBJUlEgc291cmNlcy4KICAqLwogI2RlZmluZQlHUElPKFgpCQkoWCkJCS8qIDAgPD0gWCA8PSA3MCAqLwogI2RlZmluZQlHUElPVjE4KFgpCShYKQkJLyogMS44ViBpL287IDAgPD0gWCA8PSA1MyAqLwpAQCAtNjcsMTEgKzcxLDExIEBACiAJdm9pZCAqX19pb21lbSBwdHI7CiAKIAlpZiAoZ3BpbyA8IDMyKQotCQlwdHIgPSAodm9pZCAqX19pb21lbSlJT19BRERSRVNTKERBVklOQ0lfR1BJT19CQVNFICsgMHgxMCk7CisJCXB0ciA9IElPX0FERFJFU1MoREFWSU5DSV9HUElPX0JBU0UgKyAweDEwKTsKIAllbHNlIGlmIChncGlvIDwgNjQpCi0JCXB0ciA9ICh2b2lkICpfX2lvbWVtKUlPX0FERFJFU1MoREFWSU5DSV9HUElPX0JBU0UgKyAweDM4KTsKKwkJcHRyID0gSU9fQUREUkVTUyhEQVZJTkNJX0dQSU9fQkFTRSArIDB4MzgpOwogCWVsc2UgaWYgKGdwaW8gPCBEQVZJTkNJX05fR1BJTykKLQkJcHRyID0gKHZvaWQgKl9faW9tZW0pSU9fQUREUkVTUyhEQVZJTkNJX0dQSU9fQkFTRSArIDB4NjApOworCQlwdHIgPSBJT19BRERSRVNTKERBVklOQ0lfR1BJT19CQVNFICsgMHg2MCk7CiAJZWxzZQogCQlwdHIgPSBOVUxMOwogCXJldHVybiBwdHI7CkBAIC04MywyNSArODcsMTcgQEAKIH0KIAogLyogVGhlIGdldC9zZXQvY2xlYXIgZnVuY3Rpb25zIHdpbGwgaW5saW5lIHdoZW4gY2FsbGVkIHdpdGggY29uc3RhbnQKLSAqIHBhcmFtZXRlcnMsIGZvciBsb3ctb3ZlcmhlYWQgYml0YmFuZ2luZy4gIElsbGVnYWwgY29uc3RhbnQgcGFyYW1ldGVycwotICogY2F1c2UgbGluay10aW1lIGVycm9ycy4KKyAqIHBhcmFtZXRlcnMgcmVmZXJlbmNpbmcgYnVpbHQtaW4gR1BJT3MsIGZvciBsb3ctb3ZlcmhlYWQgYml0YmFuZ2luZy4KICAqCi0gKiBPdGhlcndpc2UsIGNhbGxzIHdpdGggdmFyaWFibGUgcGFyYW1ldGVycyB1c2Ugb3V0bGluZWQgZnVuY3Rpb25zLgorICogT3RoZXJ3aXNlLCBjYWxscyB3aXRoIHZhcmlhYmxlIHBhcmFtZXRlcnMgb3IgcmVmZXJlbmNpbmcgZXh0ZXJuYWwKKyAqIEdQSU9zIChlLmcuIG9uIEdQSU8gZXhwYW5kZXIgY2hpcHMpIHVzZSBvdXRsaW5lZCBmdW5jdGlvbnMuCiAgKi8KLWV4dGVybiBpbnQgX19lcnJvcl9pbnZhbF9ncGlvKHZvaWQpOwotCi1leHRlcm4gdm9pZCBfX2dwaW9fc2V0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IF9fZ3Bpb19nZXQodW5zaWduZWQgZ3Bpbyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiB7Ci0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHZhbHVlKSkgeworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCh2YWx1ZSkgJiYgZ3BpbyA8IERBVklOQ0lfTl9HUElPKSB7CiAJCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIJKl9faW9tZW0gZzsKIAkJdTMyCQkJbWFzazsKIAotCQlpZiAoZ3BpbyA+PSBEQVZJTkNJX05fR1BJTykKLQkJCV9fZXJyb3JfaW52YWxfZ3BpbygpOwotCiAJCWcgPSBfX2dwaW9fdG9fY29udHJvbGxlcihncGlvKTsKIAkJbWFzayA9IF9fZ3Bpb19tYXNrKGdwaW8pOwogCQlpZiAodmFsdWUpCkBAIC0xMTEsNDggKzEwNyw0NyBAQAogCQlyZXR1cm47CiAJfQogCi0JX19ncGlvX3NldChncGlvLCB2YWx1ZSk7CisJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CiB9CiAKIC8qIFJldHVybnMgemVybyBvciBub256ZXJvOyB3b3JrcyBmb3IgZ3Bpb3MgY29uZmlndXJlZCBhcyBpbnB1dHMgT1IKLSAqIGFzIG91dHB1dHMuCisgKiBhcyBvdXRwdXRzLCBhdCBsZWFzdCBmb3IgYnVpbHQtaW4gR1BJT3MuCiAgKgotICogTk9URTogY2hhbmdlcyBpbiByZXBvcnRlZCB2YWx1ZXMgYXJlIHN5bmNocm9uaXplZCB0byB0aGUgR1BJTyBjbG9jay4KLSAqIFRoaXMgaXMgbW9zdCBlYXNpbHkgc2VlbiBhZnRlciBjYWxsaW5nIGdwaW9fc2V0X3ZhbHVlKCkgYW5kIHRoZW4gaW1tZWRpYXRseQotICogZ3Bpb19nZXRfdmFsdWUoKSwgd2hlcmUgdGhlIGdwaW9fZ2V0X3ZhbHVlKCkgd291bGQgcmV0dXJuIHRoZSBvbGQgdmFsdWUKLSAqIHVudGlsIHRoZSBHUElPIGNsb2NrIHRpY2tzIGFuZCB0aGUgbmV3IHZhbHVlIGdldHMgbGF0Y2hlZC4KKyAqIE5PVEU6IGZvciBidWlsdC1pbiBHUElPcywgY2hhbmdlcyBpbiByZXBvcnRlZCB2YWx1ZXMgYXJlIHN5bmNocm9uaXplZAorICogdG8gdGhlIEdQSU8gY2xvY2suICBUaGlzIGlzIGVhc2lseSBzZWVuIGFmdGVyIGNhbGxpbmcgZ3Bpb19zZXRfdmFsdWUoKQorICogYW5kIHRoZW4gaW1tZWRpYXRlbHkgZ3Bpb19nZXRfdmFsdWUoKSwgd2hlcmUgdGhlIGdwaW9fZ2V0X3ZhbHVlKCkgd2lsbAorICogcmV0dXJuIHRoZSBvbGQgdmFsdWUgdW50aWwgdGhlIEdQSU8gY2xvY2sgdGlja3MgYW5kIHRoZSBuZXcgdmFsdWUgZ2V0cworICogbGF0Y2hlZC4KICAqLwotCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewotCXN0cnVjdCBncGlvX2NvbnRyb2xsZXIgKl9faW9tZW0gZzsKKwlzdHJ1Y3QgZ3Bpb19jb250cm9sbGVyCSpfX2lvbWVtIGc7CiAKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKGdwaW8pKQotCQlyZXR1cm4gX19ncGlvX2dldChncGlvKTsKLQotCWlmIChncGlvID49IERBVklOQ0lfTl9HUElPKQotCQlyZXR1cm4gX19lcnJvcl9pbnZhbF9ncGlvKCk7CisJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChncGlvKSB8fCBncGlvID49IERBVklOQ0lfTl9HUElPKQorCQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKIAogCWcgPSBfX2dwaW9fdG9fY29udHJvbGxlcihncGlvKTsKLQlyZXR1cm4gISEoX19ncGlvX21hc2soZ3BpbykgJiBfX3Jhd19yZWFkbCgmZy0+aW5fZGF0YSkpOworCXJldHVybiBfX2dwaW9fbWFzayhncGlvKSAmIF9fcmF3X3JlYWRsKCZnLT5pbl9kYXRhKTsKIH0KIAotLyogcG93ZXJ1cCBkZWZhdWx0IGRpcmVjdGlvbiBpcyBJTiAqLwotZXh0ZXJuIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKTsKLWV4dGVybiBpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CS8qIGNhbnNsZWVwIHdyYXBwZXJzICovCi0KLWV4dGVybiBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKnRhZyk7Ci1leHRlcm4gdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3Bpbyk7CitzdGF0aWMgaW5saW5lIGludCBncGlvX2NhbnNsZWVwKHVuc2lnbmVkIGdwaW8pCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGdwaW8pICYmIGdwaW8gPCBEQVZJTkNJX05fR1BJTykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOworfQogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQogeworCWlmIChncGlvID49IERBVklOQ0lfTl9HUElPKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gREFWSU5DSV9OX0FJTlRDX0lSUSArIGdwaW87CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGlycSkKIHsKKwkvKiBjYWxsZXIgZ3VhcmFudGVlcyBncGlvX3RvX2lycSgpIHN1Y2NlZWRlZCAqLwogCXJldHVybiBpcnEgLSBEQVZJTkNJX05fQUlOVENfSVJROwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2kyYy5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pMmMuaAppbmRleCBlMmY1NDE2Li5jMjQ4ZTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2kyYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvaTJjLmgKQEAgLTE0LDggKzE0LDExIEBACiAKIC8qIEFsbCBmcmVxdWVuY2llcyBhcmUgZXhwcmVzc2VkIGluIGtIeiAqLwogc3RydWN0IGRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGEgewotCXVuc2lnbmVkIGludAlidXNfZnJlcTsJLyogc3RhbmRhcmQgYnVzIGZyZXF1ZW5jeSAqLwotCXVuc2lnbmVkIGludAlidXNfZGVsYXk7CS8qIHRyYW5zYWN0aW9uIGRlbGF5ICovCisJdW5zaWduZWQgaW50CWJ1c19mcmVxOwkvKiBzdGFuZGFyZCBidXMgZnJlcXVlbmN5IChrSHopICovCisJdW5zaWduZWQgaW50CWJ1c19kZWxheTsJLyogcG9zdC10cmFuc2FjdGlvbiBkZWxheSAodXNlYykgKi8KIH07CiAKKy8qIGZvciBib2FyZCBzZXR1cCBjb2RlICovCit2b2lkIGRhdmluY2lfaW5pdF9pMmMoc3RydWN0IGRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGEgKik7CisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0kyQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggZTdhY2NiOS4uYjc4ZWU5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvaW8uaApAQCAtMjIsOSArMjIsOCBAQAogI2RlZmluZSBJT19PRkZTRVQJMHhmZDAwMDAwMCAvKiBWaXJ0dWFsIElPID0gMHhmZWMwMDAwMCAqLwogI2RlZmluZSBJT19TSVpFCQkweDAwNDAwMDAwCiAjZGVmaW5lIElPX1ZJUlQJCShJT19QSFlTICsgSU9fT0ZGU0VUKQotI2RlZmluZSBpb19wMnYocGEpCSgocGEpICsgSU9fT0ZGU0VUKQogI2RlZmluZSBpb192MnAodmEpCSgodmEpIC0gSU9fT0ZGU0VUKQotI2RlZmluZSBJT19BRERSRVNTKHgpCWlvX3Aydih4KQorI2RlZmluZSBfX0lPX0FERFJFU1MoeCkJKCh4KSArIElPX09GRlNFVCkKIAogLyoKICAqIFdlIGRvbid0IGFjdHVhbGx5IGhhdmUgcmVhbCBJU0Egbm9yIFBDSSBidXNlcywgYnV0IHRoZXJlIGlzIHNvIG1hbnkKQEAgLTM1LDcgKzM0LDEyIEBACiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCiAjZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBJT19BRERSRVNTKHBhKSAgICAgICAgICBJT01FTShfX0lPX0FERFJFU1MocGEpKQorCisjaWZkZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBJT01FTSh4KSAgICAgICAgICAgICAgICB4CisjZWxzZQorI2RlZmluZSBJT01FTSh4KSAgICAgICAgICAgICAgICAoKHZvaWQgX19mb3JjZSBfX2lvbWVtICopKHgpKQogCiAvKgogICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgRGFWaW5jaSBJTyByZWdpb24KQEAgLTQ2LDM0ICs1MCwxMyBAQAogICoJIC0gRE8gTk9UIHVzZSBoYXJkY29kZWQgdmlydHVhbCBhZGRyZXNzZXMgdG8gYWxsb3cgY2hhbmdpbmcgdGhlCiAgKgkgICBJTyBhZGRyZXNzIHNwYWNlIGFnYWluIGlmIG5lZWRlZAogICovCi0jZGVmaW5lIGRhdmluY2lfcmVhZGIoYSkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKilJT19BRERSRVNTKGEpKQotI2RlZmluZSBkYXZpbmNpX3JlYWR3KGEpCSgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopSU9fQUREUkVTUyhhKSkKLSNkZWZpbmUgZGF2aW5jaV9yZWFkbChhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgICAqKUlPX0FERFJFU1MoYSkpCisjZGVmaW5lIGRhdmluY2lfcmVhZGIoYSkJX19yYXdfcmVhZGIoSU9fQUREUkVTUyhhKSkKKyNkZWZpbmUgZGF2aW5jaV9yZWFkdyhhKQlfX3Jhd19yZWFkdyhJT19BRERSRVNTKGEpKQorI2RlZmluZSBkYXZpbmNpX3JlYWRsKGEpCV9fcmF3X3JlYWRsKElPX0FERFJFU1MoYSkpCiAKLSNkZWZpbmUgZGF2aW5jaV93cml0ZWIodixhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqKUlPX0FERFJFU1MoYSkgPSAodikpCi0jZGVmaW5lIGRhdmluY2lfd3JpdGV3KHYsYSkJKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilJT19BRERSRVNTKGEpID0gKHYpKQotI2RlZmluZSBkYXZpbmNpX3dyaXRlbCh2LGEpCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAgICopSU9fQUREUkVTUyhhKSA9ICh2KSkKLQotLyogMTYgYml0IHVzZXMgTERSSC9TVFJILCBiYXNlICsvLSBvZmZzZXRfOCAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSB1MTYgb2Zmc2V0WzI1Nl07IH0gX19yZWdiYXNlMTY7Ci0jZGVmaW5lIF9fUkVHVjE2KHZhZGRyKQkJKChfX3JlZ2Jhc2UxNiAqKSgodmFkZHIpJn4weGZmKSkgXAotCQkJCQktPm9mZnNldFsoKHZhZGRyKSYweGZmKT4+MV0KLSNkZWZpbmUgX19SRUcxNihwYWRkcikgICAgICAgICAgX19SRUdWMTYoaW9fcDJ2KHBhZGRyKSkKLQotLyogOC8zMiBiaXQgdXNlcyBMRFIvU1RSLCBiYXNlICsvLSBvZmZzZXRfMTIgKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgdTggb2Zmc2V0WzQwOTZdOyB9IF9fcmVnYmFzZTg7Ci0jZGVmaW5lIF9fUkVHVjgodmFkZHIpCQkoKF9fcmVnYmFzZTggICopKCh2YWRkcikmfjQwOTUpKSBcCi0JCQkJCS0+b2Zmc2V0WygodmFkZHIpJjQwOTUpPj4wXQotI2RlZmluZSBfX1JFRzgocGFkZHIpCQlfX1JFR1Y4KGlvX3AydihwYWRkcikpCi0KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgdTMyIG9mZnNldFs0MDk2XTsgfSBfX3JlZ2Jhc2UzMjsKLSNkZWZpbmUgX19SRUdWMzIodmFkZHIpCQkoKF9fcmVnYmFzZTMyICopKCh2YWRkcikmfjQwOTUpKSBcCi0JCQkJCS0+b2Zmc2V0WygodmFkZHIpJjQwOTUpPj4yXQotCi0jZGVmaW5lIF9fUkVHKHBhZGRyKQkJX19SRUdWMzIoaW9fcDJ2KHBhZGRyKSkKLSNlbHNlCi0KLSNkZWZpbmUgX19SRUcoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilpb19wMnYoeCkpKQorI2RlZmluZSBkYXZpbmNpX3dyaXRlYih2LCBhKQlfX3Jhd193cml0ZWIodiwgSU9fQUREUkVTUyhhKSkKKyNkZWZpbmUgZGF2aW5jaV93cml0ZXcodiwgYSkJX19yYXdfd3JpdGV3KHYsIElPX0FERFJFU1MoYSkpCisjZGVmaW5lIGRhdmluY2lfd3JpdGVsKHYsIGEpCV9fcmF3X3dyaXRlbCh2LCBJT19BRERSRVNTKGEpKQogCiAjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKaW5kZXggODRmZjc3YS4uMTdjYTQxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKICNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKIGV4dGVybiB2b2lkIGRhdmluY2lfd2F0Y2hkb2dfcmVzZXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW8uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pby5jCmluZGV4IDViYjY2YjYuLjI5OTUxNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pby5jCkBAIC0xMSw5ICsxMSw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaXJxLmMKaW5kZXggMTJjYTlmMi4uMzgwMjFhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pcnEuYwpAQCAtMjIsOSArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjZGVmaW5lIElSUV9CSVQoaXJxKQkJKChpcnEpICYgMHgxZikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9wc2MuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9wc2MuYwppbmRleCA3MjBjNDhiLi41ODc1NGYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvcHNjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BzYy5jCkBAIC0yMSw4ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9wc2MuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgpAQCAtNzAsOSArNzAsNiBAQAogewogCXUzMiBlcGNwciwgcHRjbWQsIHB0c3RhdCwgcGRzdGF0LCBwZGN0bDEsIG1kc3RhdCwgbWRjdGwsIG1kc3RhdF9tYXNrOwogCi0JaWYgKGlkIDwgMCkKLQkJcmV0dXJuOwotCiAJbWRjdGwgPSBkYXZpbmNpX3JlYWRsKERBVklOQ0lfUFdSX1NMRUVQX0NOVFJMX0JBU0UgKyBNRENUTCArIDQgKiBpZCk7CiAJaWYgKGVuYWJsZSkKIAkJbWRjdGwgfD0gMHgwMDAwMDAwMzsJLyogRW5hYmxlIE1vZHVsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3NlcmlhbC5jCmluZGV4IGNhZjEwMWUuLjMwMTBmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2VyaWFsLmMKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3RpbWUuYwppbmRleCAyMDZlODBkLi4zYjlhMjk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS90aW1lLmMKQEAgLTE1LDggKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS91c2IuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE4MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3VzYi5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogVVNCCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorCisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX2Vwc19iaXRzIG11c2JfZXBzW10gPSB7CisJeyAiZXAxX3R4IiwgOCwgfSwKKwl7ICJlcDFfcngiLCA4LCB9LAorCXsgImVwMl90eCIsIDgsIH0sCisJeyAiZXAyX3J4IiwgOCwgfSwKKwl7ICJlcDNfdHgiLCA1LCB9LAorCXsgImVwM19yeCIsIDUsIH0sCisJeyAiZXA0X3R4IiwgNSwgfSwKKwl7ICJlcDRfcngiLCA1LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfY29uZmlnIG11c2JfY29uZmlnID0geworCS5tdWx0aXBvaW50CT0gdHJ1ZSwKKwkuZHluX2ZpZm8JPSB0cnVlLAorCS5zb2Z0X2Nvbgk9IHRydWUsCisJLmRtYQkJPSB0cnVlLAorCisJLm51bV9lcHMJPSA1LAorCS5kbWFfY2hhbm5lbHMJPSA4LAorCS5yYW1fYml0cwk9IDEwLAorCS5lcHNfYml0cwk9IG11c2JfZXBzLAorfTsKKworc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSB1c2JfZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9PVEcpCisJLyogT1RHIHJlcXVpcmVzIGEgTWluaS1BQiBjb25uZWN0b3IgKi8KKwkubW9kZSAgICAgICAgICAgPSBNVVNCX09URywKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX1BFUklQSEVSQUwpCisJLm1vZGUgICAgICAgICAgID0gTVVTQl9QRVJJUEhFUkFMLAorI2VsaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSE9TVCkKKwkubW9kZSAgICAgICAgICAgPSBNVVNCX0hPU1QsCisjZW5kaWYKKwkuY29uZmlnCQk9ICZtdXNiX2NvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiX3Jlc291cmNlc1tdID0geworCXsKKwkJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCQkuc3RhcnQgICAgICAgICAgPSBEQVZJTkNJX1VTQl9PVEdfQkFTRSwKKwkJLmVuZCAgICAgICAgICAgID0gREFWSU5DSV9VU0JfT1RHX0JBU0UgKyAweDVmZiwKKwkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgICAgICAgICA9IElSUV9VU0JJTlQsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IHVzYl9kbWFtYXNrID0gRE1BXzMyQklUX01BU0s7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVzYl9kZXYgPSB7CisJLm5hbWUgICAgICAgICAgID0gIm11c2JfaGRyYyIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnVzYl9kYXRhLAorCQkuZG1hX21hc2sJCT0gJnVzYl9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgICAgICA9IERNQV8zMkJJVF9NQVNLLAorCX0sCisJLnJlc291cmNlICAgICAgID0gdXNiX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHVzYl9yZXNvdXJjZXMpLAorfTsKKworI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKKworc3RhdGljIHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKnhjZWl2OworCitzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGdfZ2V0X3RyYW5zY2VpdmVyKHZvaWQpCit7CisJaWYgKHhjZWl2KQorCQlnZXRfZGV2aWNlKHhjZWl2LT5kZXYpOworCXJldHVybiB4Y2VpdjsKK30KK0VYUE9SVF9TWU1CT0wob3RnX2dldF90cmFuc2NlaXZlcik7CisKK2ludCBvdGdfc2V0X3RyYW5zY2VpdmVyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngpCit7CisJaWYgKHhjZWl2ICYmIHgpCisJCXJldHVybiAtRUJVU1k7CisJeGNlaXYgPSB4OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvdGdfc2V0X3RyYW5zY2VpdmVyKTsKKworI2VuZGlmCisKK3ZvaWQgX19pbml0IHNldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zZWMpCit7CisJdXNiX2RhdGEucG93ZXIgPSBtQSAvIDI7CisJdXNiX2RhdGEucG90cGd0ID0gcG90cGd0X21zZWMgLyAyOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdXNiX2Rldik7Cit9CisKKyNlbHNlCisKK3ZvaWQgX19pbml0IHNldHVwX3VzYih1bnNpZ25lZCBtQSwgdW5zaWduZWQgcG90cGd0X21zZWMpCit7Cit9CisKKyNlbmRpZiAgLyogQ09ORklHX1VTQl9NVVNCX0hEUkMgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKaW5kZXggNjVjYzdjMi4uYzdiYzdmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCkBAIC0xNCwxMCArMTQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW8uYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jCmluZGV4IDUzNzQ4ZjUuLmM1MmUzMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jCkBAIC0yMyw5ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKl9faXNhbWVtX2NvbnZlcnRfYWRkcihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZwppbmRleCBlYTg1NDliLi41YTFiOGMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKQEAgLTg4LDYgKzg4LDIwIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIFRlY2hub2xvZ2ljIFN5c3RlbXMgVFMtNzJ4eCBib2FyZC4KIAorY2hvaWNlCisJcHJvbXB0ICJTZWxlY3QgYSBVQVJUIGZvciBlYXJseSBrZXJuZWwgbWVzc2FnZXMiCisKK2NvbmZpZyBFUDkzWFhfRUFSTFlfVUFSVDEKKwlib29sICJVQVJUMSIKKworY29uZmlnIEVQOTNYWF9FQVJMWV9VQVJUMgorCWJvb2wgIlVBUlQyIgorCitjb25maWcgRVA5M1hYX0VBUkxZX1VBUlQzCisJYm9vbCAiVUFSVDMiCisKK2VuZGNob2ljZQorCiBlbmRtZW51CiAKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCmluZGV4IGFhMWZiMzUuLjU2MWRiNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTQ3LDM2ICs0NywxMiBAQAogCS5waHlfaWQJCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWRzc3BoZXJlX2V0aF9yZXNvdXJjZVtdID0gewotCXsKLQkJLnN0YXJ0CT0gRVA5M1hYX0VUSEVSTkVUX1BIWVNfQkFTRSwKLQkJLmVuZAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UgKyAweGZmZmYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sIHsKLQkJLnN0YXJ0CT0gSVJRX0VQOTNYWF9FVEhFUk5FVCwKLQkJLmVuZAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFkc3NwaGVyZV9ldGhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJlcDkzeHgtZXRoIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmFkc3NwaGVyZV9ldGhfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMiwKLQkucmVzb3VyY2UJPSBhZHNzcGhlcmVfZXRoX3Jlc291cmNlLAotfTsKLQogc3RhdGljIHZvaWQgX19pbml0IGFkc3NwaGVyZV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhZHNzcGhlcmVfZmxhc2gpOwogCi0JbWVtY3B5KGFkc3NwaGVyZV9ldGhfZGF0YS5kZXZfYWRkciwKLQkJKHZvaWQgKikoRVA5M1hYX0VUSEVSTkVUX0JBU0UgKyAweDUwKSwgNik7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhZHNzcGhlcmVfZXRoX2RldmljZSk7CisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmYWRzc3BoZXJlX2V0aF9kYXRhLCAxKTsKIH0KIAogTUFDSElORV9TVEFSVChBRFNTUEhFUkUsICJBRFMgU3BoZXJlIGJvYXJkIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jCmluZGV4IDYwNjJlNDcuLjhjOWYyNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYwpAQCAtMTUsOSArMTUsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdHJ1Y3QgY2xrIHsKIAljaGFyCQkqbmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCBmOTlmNDM2Li5kZTUzZjBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00MSw3ICs0Miw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CkBAIC0xNTcsNyArMTU3LDcgQEAKIHN0YXRpYyBjb25zdCB1OCBpbnRfdHlwZTFfcmVnaXN0ZXJfb2Zmc2V0WzNdCT0geyAweDkwLCAweGFjLCAweDRjIH07CiBzdGF0aWMgY29uc3QgdTggaW50X3R5cGUyX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5NCwgMHhiMCwgMHg1MCB9Owogc3RhdGljIGNvbnN0IHU4IGVvaV9yZWdpc3Rlcl9vZmZzZXRbM10JCT0geyAweDk4LCAweGI0LCAweDU0IH07Ci1zdGF0aWMgY29uc3QgdTggaW50X2VuX3JlZ2lzdGVyX29mZnNldFszXQk9IHsgMHg5YywgMHhiOCwgMHg1YyB9Oworc3RhdGljIGNvbnN0IHU4IGludF9lbl9yZWdpc3Rlcl9vZmZzZXRbM10JPSB7IDB4OWMsIDB4YjgsIDB4NTggfTsKIAogdm9pZCBlcDkzeHhfZ3Bpb191cGRhdGVfaW50X3BhcmFtcyh1bnNpZ25lZCBwb3J0KQogewpAQCAtMTkyLDggKzE5Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlpZiAoc3RhdHVzICYgKDEgPDwgaSkpIHsKIAkJCWludCBncGlvX2lycSA9IGdwaW9fdG9faXJxKEVQOTNYWF9HUElPX0xJTkVfQSgwKSkgKyBpOwotCQkJZGVzYyA9IGlycV9kZXNjICsgZ3Bpb19pcnE7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoZ3Bpb19pcnEsIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9faXJxKTsKIAkJfQogCX0KIApAQCAtMjAyLDcgKzIwMSw3IEBACiAJCWlmIChzdGF0dXMgJiAoMSA8PCBpKSkgewogCQkJaW50IGdwaW9faXJxID0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9CKDApKSArIGk7CiAJCQlkZXNjID0gaXJxX2Rlc2MgKyBncGlvX2lycTsKLQkJCWRlc2NfaGFuZGxlX2lycShncGlvX2lycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ3Bpb19pcnEpOwogCQl9CiAJfQogfQpAQCAtMjE3LDcgKzIxNiw3IEBACiAJaW50IHBvcnRfZl9pZHggPSAoKGlycSArIDEpICYgNykgXiA0OyAvKiB7MTkuLjIyLDQ3Li41MH0gLT4gezAuLjd9ICovCiAJaW50IGdwaW9faXJxID0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9GKDApKSArIHBvcnRfZl9pZHg7CiAKLQlkZXNjX2hhbmRsZV9pcnEoZ3Bpb19pcnEsIGlycV9kZXNjICsgZ3Bpb19pcnEpOworCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKQEAgLTQ2MSw2ICs0NjAsNDEgQEAKIAkucmVzb3VyY2UJPSBlcDkzeHhfb2hjaV9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBlcDkzeHhfZXRoX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXA5M3h4X2V0aF9yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0CT0gRVA5M1hYX0VUSEVSTkVUX1BIWVNfQkFTRSwKKwkJLmVuZAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UgKyAweGZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CT0gSVJRX0VQOTNYWF9FVEhFUk5FVCwKKwkJLmVuZAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVwOTN4eF9ldGhfZGV2aWNlID0geworCS5uYW1lCQk9ICJlcDkzeHgtZXRoIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF9ldGhfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShlcDkzeHhfZXRoX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBlcDkzeHhfZXRoX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgZXA5M3h4X3JlZ2lzdGVyX2V0aChzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhICpkYXRhLCBpbnQgY29weV9hZGRyKQoreworCWlmIChjb3B5X2FkZHIpIHsKKwkJbWVtY3B5KGRhdGEtPmRldl9hZGRyLAorCQkJKHZvaWQgKikoRVA5M1hYX0VUSEVSTkVUX0JBU0UgKyAweDUwKSwgNik7CisJfQorCisJZXA5M3h4X2V0aF9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfZXRoX2RldmljZSk7Cit9CisKIGV4dGVybiB2b2lkIGVwOTN4eF9ncGlvX2luaXQodm9pZCk7CiAKIHZvaWQgX19pbml0IGVwOTN4eF9pbml0X2RldmljZXModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDIuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDIuYwppbmRleCA5NzU1MGMwLi5lNGFkZDViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMi5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTQzLDEwICs0MywxNiBAQAogCS5yZXNvdXJjZQk9ICZlZGI5MzAyX2ZsYXNoX3Jlc291cmNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZWRiOTMwMl9ldGhfZGF0YSA9IHsKKwkucGh5X2lkCQk9IDEsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZWRiOTMwMl9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5MzAyX2ZsYXNoKTsKKworCWVwOTN4eF9yZWdpc3Rlcl9ldGgoJmVkYjkzMDJfZXRoX2RhdGEsIDEpOwogfQogCiBNQUNISU5FX1NUQVJUKEVEQjkzMDIsICJDaXJydXMgTG9naWMgRURCOTMwMiBFdmFsdWF0aW9uIEJvYXJkIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzAyYS5jCmluZGV4IDk5YjAxZDQuLjAyYzQ0MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMmEuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00NywzNiArNDcsMTIgQEAKIAkucGh5X2lkCQkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5MzAyYV9ldGhfcmVzb3VyY2VbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UsCi0JCS5lbmQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFICsgMHhmZmZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0JCS5lbmQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZGI5MzAyYV9ldGhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJlcDkzeHgtZXRoIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmVkYjkzMDJhX2V0aF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAyLAotCS5yZXNvdXJjZQk9IGVkYjkzMDJhX2V0aF9yZXNvdXJjZSwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzAyYV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5MzAyYV9mbGFzaCk7CiAKLQltZW1jcHkoZWRiOTMwMmFfZXRoX2RhdGEuZGV2X2FkZHIsCi0JCSh2b2lkICopKEVQOTNYWF9FVEhFUk5FVF9CQVNFICsgMHg1MCksIDYpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTMwMmFfZXRoX2RldmljZSk7CisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmZWRiOTMwMmFfZXRoX2RhdGEsIDEpOwogfQogCiBNQUNISU5FX1NUQVJUKEVEQjkzMDJBLCAiQ2lycnVzIExvZ2ljIEVEQjkzMDJBIEV2YWx1YXRpb24gQm9hcmQiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwNy5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwNy5jCmluZGV4IDlmYjcyZDAuLjA0MGVkYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDcuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzA3LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNDcsMzYgKzQ3LDEyIEBACiAJLnBoeV9pZAkJCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWRiOTMwN19ldGhfcmVzb3VyY2VbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UsCi0JCS5lbmQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFICsgMHhmZmZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0JCS5lbmQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZGI5MzA3X2V0aF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImVwOTN4eC1ldGgiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZWRiOTMwN19ldGhfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMiwKLQkucmVzb3VyY2UJPSBlZGI5MzA3X2V0aF9yZXNvdXJjZSwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzA3X2luaXRfbWFjaGluZSh2b2lkKQogewogCWVwOTN4eF9pbml0X2RldmljZXMoKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVkYjkzMDdfZmxhc2gpOwogCi0JbWVtY3B5KGVkYjkzMDdfZXRoX2RhdGEuZGV2X2FkZHIsCi0JCSh2b2lkICopKEVQOTNYWF9FVEhFUk5FVF9CQVNFICsgMHg1MCksIDYpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTMwN19ldGhfZGV2aWNlKTsKKwllcDkzeHhfcmVnaXN0ZXJfZXRoKCZlZGI5MzA3X2V0aF9kYXRhLCAxKTsKIH0KIAogTUFDSElORV9TVEFSVChFREI5MzA3LCAiQ2lycnVzIExvZ2ljIEVEQjkzMDcgRXZhbHVhdGlvbiBCb2FyZCIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzEyLmMKaW5kZXggODcyNjdhNS4uNjg1M2UzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTIuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00NCwxMCArNDQsMTYgQEAKIAkucmVzb3VyY2UJPSAmZWRiOTMxMl9mbGFzaF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIGVkYjkzMTJfZXRoX2RhdGEgPSB7CisJLnBoeV9pZAkJCT0gMSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzEyX2luaXRfbWFjaGluZSh2b2lkKQogewogCWVwOTN4eF9pbml0X2RldmljZXMoKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVkYjkzMTJfZmxhc2gpOworCisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmZWRiOTMxMl9ldGhfZGF0YSwgMSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoRURCOTMxMiwgIkNpcnJ1cyBMb2dpYyBFREI5MzEyIEV2YWx1YXRpb24gQm9hcmQiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNS5jCmluZGV4IDdlMzczOTUuLjk0NjliMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzE1LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNDMsMTAgKzQzLDE2IEBACiAJLnJlc291cmNlCT0gJmVkYjkzMTVfZmxhc2hfcmVzb3VyY2UsCiB9OwogCitzdGF0aWMgc3RydWN0IGVwOTN4eF9ldGhfZGF0YSBlZGI5MzE1X2V0aF9kYXRhID0geworCS5waHlfaWQJCQk9IDEsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZWRiOTMxNV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5MzE1X2ZsYXNoKTsKKworCWVwOTN4eF9yZWdpc3Rlcl9ldGgoJmVkYjkzMTVfZXRoX2RhdGEsIDEpOwogfQogCiBNQUNISU5FX1NUQVJUKEVEQjkzMTUsICJDaXJydXMgTG9naWMgRURCOTMxNSBFdmFsdWF0aW9uIEJvYXJkIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTVhLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5MzE1YS5jCmluZGV4IDA4YTdjOWIuLjU4NDQ1N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMTVhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMxNWEuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00NywzNiArNDcsMTIgQEAKIAkucGh5X2lkCQkJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI5MzE1YV9ldGhfcmVzb3VyY2VbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UsCi0JCS5lbmQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFICsgMHhmZmZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0JCS5lbmQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZGI5MzE1YV9ldGhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJlcDkzeHgtZXRoIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmVkYjkzMTVhX2V0aF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAyLAotCS5yZXNvdXJjZQk9IGVkYjkzMTVhX2V0aF9yZXNvdXJjZSwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBlZGI5MzE1YV9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5MzE1YV9mbGFzaCk7CiAKLQltZW1jcHkoZWRiOTMxNWFfZXRoX2RhdGEuZGV2X2FkZHIsCi0JCSh2b2lkICopKEVQOTNYWF9FVEhFUk5FVF9CQVNFICsgMHg1MCksIDYpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTMxNWFfZXRoX2RldmljZSk7CisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmZWRiOTMxNWFfZXRoX2RhdGEsIDEpOwogfQogCiBNQUNISU5FX1NUQVJUKEVEQjkzMTVBLCAiQ2lycnVzIExvZ2ljIEVEQjkzMTVBIEV2YWx1YXRpb24gQm9hcmQiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwppbmRleCA5YjQxZWMxLi4wMzViMjRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00NCwzNiArNDQsMTUgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIGdlc2JjOTMxMl9ldGhfZGF0YSA9IHsKLQkucGh5X2lkCQkJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnZXNiYzkzMTJfZXRoX3Jlc291cmNlW10gPSB7Ci0JewotCQkuc3RhcnQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFLAotCQkuZW5kCT0gRVA5M1hYX0VUSEVSTkVUX1BIWVNfQkFTRSArIDB4ZmZmZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAotCQkuZW5kCT0gSVJRX0VQOTNYWF9FVEhFUk5FVCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ2VzYmM5MzEyX2V0aF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImVwOTN4eC1ldGgiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZ2VzYmM5MzEyX2V0aF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAyLAotCS5yZXNvdXJjZQk9IGdlc2JjOTMxMl9ldGhfcmVzb3VyY2UsCisJLnBoeV9pZAkJPSAxLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGdlc2JjOTMxMl9pbml0X21hY2hpbmUodm9pZCkKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZnZXNiYzkzMTJfZmxhc2gpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZ2VzYmM5MzEyX2V0aF9kZXZpY2UpOworCisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmZ2VzYmM5MzEyX2V0aF9kYXRhLCAwKTsKIH0KIAogTUFDSElORV9TVEFSVChHRVNCQzkzMTIsICJHbG9tYXRpb24gR0VTQkMtOTMxMi1zeCIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9ncGlvLmMKaW5kZXggMGYzZmI4Ny4uNDgyY2YzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dwaW8uYwpAQCAtMTYsOSArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2VwOTN4eC1yZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogc3RydWN0IGVwOTN4eF9ncGlvX2NoaXAgewpAQCAtMTQxLDEwICsxNDEsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X2dwaW9fY2hpcCBlcDkzeHhfZ3Bpb19iYW5rc1tdID0gewogCUVQOTNYWF9HUElPX0JBTksoIkEiLCAweDAwLCAweDEwLCAwKSwKIAlFUDkzWFhfR1BJT19CQU5LKCJCIiwgMHgwNCwgMHgxNCwgOCksCi0JRVA5M1hYX0dQSU9fQkFOSygiQyIsIDB4MzAsIDB4MzQsIDQwKSwKKwlFUDkzWFhfR1BJT19CQU5LKCJDIiwgMHgwOCwgMHgxOCwgNDApLAogCUVQOTNYWF9HUElPX0JBTksoIkQiLCAweDBjLCAweDFjLCAyNCksCiAJRVA5M1hYX0dQSU9fQkFOSygiRSIsIDB4MjAsIDB4MjQsIDMyKSwKLQlFUDkzWFhfR1BJT19CQU5LKCJGIiwgMHgwOCwgMHgxOCwgMTYpLAorCUVQOTNYWF9HUElPX0JBTksoIkYiLCAweDMwLCAweDM0LCAxNiksCiAJRVA5M1hYX0dQSU9fQkFOSygiRyIsIDB4MzgsIDB4M2MsIDQ4KSwKIAlFUDkzWFhfR1BJT19CQU5LKCJIIiwgMHg0MCwgMHg0NCwgNTYpLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9lcDkzeHgtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKaW5kZXggOWY0NDU4Yy4uMjJkNmM5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2VwOTN4eC1yZWdzLmgKQEAgLTYsNiArNiw0MCBAQAogI2RlZmluZSBfX0FTTV9BUkNIX0VQOTNYWF9SRUdTX0gKIAogLyoKKyAqIEVQOTN4eCBQaHlzaWNhbCBNZW1vcnkgTWFwOgorICoKKyAqIFRoZSBBU0RPIHBpbiBpcyBzYW1wbGVkIGF0IHN5c3RlbSByZXNldCB0byBzZWxlY3QgYSBzeW5jaHJvbm91cyBvcgorICogYXN5bmNocm9ub3VzIGJvb3QgY29uZmlndXJhdGlvbi4gIFdoZW4gQVNETyBpcyAiMSIgKGkuZS4gcHVsbGVkLXVwKQorICogdGhlIHN5bmNocm9ub3VzIGJvb3QgbW9kZSBpcyBzZWxlY3RlZC4gIFdoZW4gQVNETyBpcyAiMCIgKGkuZQorICogcHVsbGVkLWRvd24pIHRoZSBhc3luY2hyb25vdXMgYm9vdCBtb2RlIGlzIHNlbGVjdGVkLgorICoKKyAqIEluIHN5bmNocm9ub3VzIGJvb3QgbW9kZSBuU0RDRTMgaXMgZGVjb2RlZCBzdGFydGluZyBhdCBwaHlzaWNhbCBhZGRyZXNzCisgKiAweDAwMDAwMDAwIGFuZCBuQ1MwIGlzIGRlY29kZWQgc3RhcnRpbmcgYXQgMHhmMDAwMDAwMC4gIEZvciBhc3luY2hyb25vdXMKKyAqIGJvb3QgbW9kZSB0aGV5IGFyZSBzd2FwcGVkIHdpdGggbkNTMCBkZWNvZGVkIGF0IDB4MDAwMDAwMDAgYW5uIG5TRENFMworICogZGVjb2RlZCBhdCAweGYwMDAwMDAwLgorICoKKyAqIFRoZXJlIGlzIGtub3duIGVycmF0YSBmb3IgdGhlIEVQOTN4eCBkZWFsaW5nIHdpdGggRXh0ZXJuYWwgTWVtb3J5CisgKiBDb25maWd1cmF0aW9ucy4gIFBsZWFzZSByZWZlciB0byAiQU4yNzM6IEVQOTN4eCBTaWxpY29uIFJldiBFIERlc2lnbgorICogR3VpZGVsaW5lcyIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGlzIGRvY3VtZW50IGNhbiBiZSBmb3VuZCBhdDoKKyAqCisgKglodHRwOi8vd3d3LmNpcnJ1cy5jb20vZW4vcHVicy9hcHBOb3RlL0FOMjczUkVWNC5wZGYKKyAqLworCisjZGVmaW5lIEVQOTNYWF9DUzBfUEhZU19CQVNFX0FTWU5DCTB4MDAwMDAwMDAJLyogQVNETyBQaW4gPSAwICovCisjZGVmaW5lIEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQwkweDAwMDAwMDAwCS8qIEFTRE8gUGluID0gMSAqLworI2RlZmluZSBFUDkzWFhfQ1MxX1BIWVNfQkFTRQkJMHgxMDAwMDAwMAorI2RlZmluZSBFUDkzWFhfQ1MyX1BIWVNfQkFTRQkJMHgyMDAwMDAwMAorI2RlZmluZSBFUDkzWFhfQ1MzX1BIWVNfQkFTRQkJMHgzMDAwMDAwMAorI2RlZmluZSBFUDkzWFhfUENNQ0lBX1BIWVNfQkFTRQkJMHg0MDAwMDAwMAorI2RlZmluZSBFUDkzWFhfQ1M2X1BIWVNfQkFTRQkJMHg2MDAwMDAwMAorI2RlZmluZSBFUDkzWFhfQ1M3X1BIWVNfQkFTRQkJMHg3MDAwMDAwMAorI2RlZmluZSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFCQkweGMwMDAwMDAwCisjZGVmaW5lIEVQOTNYWF9TRENFMV9QSFlTX0JBU0UJCTB4ZDAwMDAwMDAKKyNkZWZpbmUgRVA5M1hYX1NEQ0UyX1BIWVNfQkFTRQkJMHhlMDAwMDAwMAorI2RlZmluZSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX0FTWU5DCTB4ZjAwMDAwMDAJLyogQVNETyBQaW4gPSAwICovCisjZGVmaW5lIEVQOTNYWF9DUzBfUEhZU19CQVNFX1NZTkMJMHhmMDAwMDAwMAkvKiBBU0RPIFBpbiA9IDEgKi8KKworLyoKICAqIEVQOTN4eCBsaW51eCBtZW1vcnkgbWFwOgogICoKICAqIHZpcnQJCXBoeXMJCXNpemUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9wbGF0Zm9ybS5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKaW5kZXggYjVjMTgyNC4uZGIyNDg5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3BsYXRmb3JtLmgKQEAgLTQsMTcgKzQsMTcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotdm9pZCBlcDkzeHhfbWFwX2lvKHZvaWQpOwotdm9pZCBlcDkzeHhfaW5pdF9pcnEodm9pZCk7Ci12b2lkIGVwOTN4eF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyk7Ci12b2lkIGVwOTN4eF9pbml0X2RldmljZXModm9pZCk7Ci1leHRlcm4gc3RydWN0IHN5c190aW1lciBlcDkzeHhfdGltZXI7Ci0KIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEKIHsKIAl1bnNpZ25lZCBjaGFyCWRldl9hZGRyWzZdOwogCXVuc2lnbmVkIGNoYXIJcGh5X2lkOwogfTsKIAordm9pZCBlcDkzeHhfbWFwX2lvKHZvaWQpOwordm9pZCBlcDkzeHhfaW5pdF9pcnEodm9pZCk7Cit2b2lkIGVwOTN4eF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyk7Cit2b2lkIGVwOTN4eF9yZWdpc3Rlcl9ldGgoc3RydWN0IGVwOTN4eF9ldGhfZGF0YSAqZGF0YSwgaW50IGNvcHlfYWRkcik7Cit2b2lkIGVwOTN4eF9pbml0X2RldmljZXModm9pZCk7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBlcDkzeHhfdGltZXI7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3RzNzJ4eC5oIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3RzNzJ4eC5oCmluZGV4IDMwYjMxOGEuLjM0ZGRlYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC90czcyeHguaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvdHM3Mnh4LmgKQEAgLTcwLDcgKzcwLDcgQEAKIAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJvYXJkX2lzX3RzNzIwMCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggMWZkMmYxNy4uMTYwMjZjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0zMSwxMCArMzEsMTkgQEAKIAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilwdHIpID0gdmFsdWU7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19FUDkzWFhfRUFSTFlfVUFSVDEpCisjZGVmaW5lIFVBUlRfQkFTRQkJRVA5M1hYX1VBUlQxX1BIWVNfQkFTRQorI2VsaWYgZGVmaW5lZChDT05GSUdfRVA5M1hYX0VBUkxZX1VBUlQyKQorI2RlZmluZSBVQVJUX0JBU0UJCUVQOTNYWF9VQVJUMl9QSFlTX0JBU0UKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VQOTNYWF9FQVJMWV9VQVJUMykKKyNkZWZpbmUgVUFSVF9CQVNFCQlFUDkzWFhfVUFSVDNfUEhZU19CQVNFCisjZWxzZQorI2RlZmluZSBVQVJUX0JBU0UJCUVQOTNYWF9VQVJUMV9QSFlTX0JBU0UKKyNlbmRpZgogCi0jZGVmaW5lIFBIWVNfVUFSVDFfREFUQQkJMHg4MDhjMDAwMAotI2RlZmluZSBQSFlTX1VBUlQxX0ZMQUcJCTB4ODA4YzAwMTgKLSNkZWZpbmUgVUFSVDFfRkxBR19UWEZGCQkweDIwCisjZGVmaW5lIFBIWVNfVUFSVF9EQVRBCQkoVUFSVF9CQVNFICsgMHgwMCkKKyNkZWZpbmUgUEhZU19VQVJUX0ZMQUcJCShVQVJUX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUX0ZMQUdfVFhGRgkJMHgyMAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0YyhpbnQgYykKIHsKQEAgLTQyLDExICs1MSwxMSBAQAogCiAJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgewogCQkvKiBUcmFuc21pdCBmaWZvIG5vdCBmdWxsPyAgKi8KLQkJaWYgKCEoX19yYXdfcmVhZGIoUEhZU19VQVJUMV9GTEFHKSAmIFVBUlQxX0ZMQUdfVFhGRikpCisJCWlmICghKF9fcmF3X3JlYWRiKFBIWVNfVUFSVF9GTEFHKSAmIFVBUlRfRkxBR19UWEZGKSkKIAkJCWJyZWFrOwogCX0KIAotCV9fcmF3X3dyaXRlYihjLCBQSFlTX1VBUlQxX0RBVEEpOworCV9fcmF3X3dyaXRlYihjLCBQSFlTX1VBUlRfREFUQSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYwppbmRleCBkZTA0N2E1Li5jMjE5NzIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9taWNybzkuYwpAQCAtMTYsMTAgKzE2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yOSwzOCArMjgsOSBAQAogICAgICAgIC5waHlfaWQgICAgICAgICAgICAgICAgID0gMHgxZiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbWljcm85X2V0aF9yZXNvdXJjZVtdID0gewotICAgICAgIHsKLSAgICAgICAgICAgICAgIC5zdGFydCAgPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFLAotICAgICAgICAgICAgICAgLmVuZCAgICA9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UgKyAweGZmZmYsCi0gICAgICAgICAgICAgICAuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0gICAgICAgfSwgewotICAgICAgICAgICAgICAgLnN0YXJ0ICA9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0gICAgICAgICAgICAgICAuZW5kICAgID0gSVJRX0VQOTNYWF9FVEhFUk5FVCwKLSAgICAgICAgICAgICAgIC5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKLSAgICAgICB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtaWNybzlfZXRoX2RldmljZSA9IHsKLSAgICAgICAubmFtZSAgICAgICAgICAgPSAiZXA5M3h4LWV0aCIsCi0gICAgICAgLmlkICAgICAgICAgICAgID0gLTEsCi0gICAgICAgLmRldiAgICAgICAgICAgID0gewotICAgICAgICAgICAgICAgLnBsYXRmb3JtX2RhdGEgID0gJm1pY3JvOV9ldGhfZGF0YSwKLSAgICAgICB9LAotICAgICAgIC5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShtaWNybzlfZXRoX3Jlc291cmNlKSwKLSAgICAgICAucmVzb3VyY2UgICAgICAgPSBtaWNybzlfZXRoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOV9ldGhfaW5pdCh2b2lkKQotewotICAgICAgIG1lbWNweShtaWNybzlfZXRoX2RhdGEuZGV2X2FkZHIsCi0gICAgICAgICAgICAgICAodm9pZCAqKShFUDkzWFhfRVRIRVJORVRfQkFTRSArIDB4NTApLCA2KTsKLSAgICAgICBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1pY3JvOV9ldGhfZGV2aWNlKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IG1pY3JvOV9pbml0KHZvaWQpCiB7Ci0gICAgICAgbWljcm85X2V0aF9pbml0KCk7CisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmbWljcm85X2V0aF9kYXRhLCAxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3RzNzJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKaW5kZXggYzNjYmZmMS4uYjRhYTRjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L200OHQ4Ni5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTYxLDI4ICsxNjEsNiBAQAogCS5waHlfaWQJCQk9IDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHRzNzJ4eF9ldGhfcmVzb3VyY2VbXSA9IHsKLQl7Ci0JCS5zdGFydAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UsCi0JCS5lbmQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFICsgMHhmZmZmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCi0JCS5lbmQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0czcyeHhfZXRoX2RldmljZSA9IHsKLQkubmFtZQkJPSAiZXA5M3h4LWV0aCIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZ0czcyeHhfZXRoX2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDIsCi0JLnJlc291cmNlCT0gdHM3Mnh4X2V0aF9yZXNvdXJjZSwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB0czcyeHhfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJZXA5M3h4X2luaXRfZGV2aWNlcygpOwpAQCAtMTkwLDkgKzE2OCw3IEBACiAJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdHM3Mnh4X2ZsYXNoKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRzNzJ4eF9ydGNfZGV2aWNlKTsKIAotCW1lbWNweSh0czcyeHhfZXRoX2RhdGEuZGV2X2FkZHIsCi0JCSh2b2lkICopKEVQOTNYWF9FVEhFUk5FVF9CQVNFICsgMHg1MCksIDYpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdHM3Mnh4X2V0aF9kZXZpY2UpOworCWVwOTN4eF9yZWdpc3Rlcl9ldGgoJnRzNzJ4eF9ldGhfZGF0YSwgMSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoVFM3MlhYLCAiVGVjaG5vbG9naWMgU3lzdGVtcyBUUy03Mnh4IFNCQyIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYwppbmRleCBjMjYxNDcyLi42YTViNDM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKQEAgLTksOSArOSw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwppbmRleCBiMDhhYjUwLi44MTgwMTRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCkBAIC0xMywxMSArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAgCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKaW5kZXggZDBkYzUxZS4uZDRjMWU1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCkBAIC0xNiw4ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RtYS5jCmluZGV4IDFmOWIwOWIuLmI2NTNlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZG1hLmMKQEAgLTExLDkgKzExLDkgQEAKICAqCQkJSVNBIERNQSBjb250cm9sbGVycy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBlOWNhZTk5Li42YWUyZjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTQyLDEwICs0Miw2IEBACiAKICNlbmRpZgogCi0vKiBUYXNrIHNpemUgYW5kIHBhZ2Ugb2Zmc2V0IGF0IDNHQiAqLwotI2RlZmluZSBUQVNLX1NJWkUJCVVMKDB4YmYwMDAwMDApCi0jZGVmaW5lIFBBR0VfT0ZGU0VUCQlVTCgweGMwMDAwMDAwKQotCiAvKgogICogQ2FjaGUgZmx1c2hpbmcgYXJlYS4KICAqLwpAQCAtNTYsMTIgKzUyLDYgQEAKICAqLwogI2RlZmluZSBQSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKIAotLyoKLSAqIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KLSAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCi0gKi8KLSNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFICgoVEFTS19TSVpFICsgMHgwMTAwMDAwMCkgLyAzKQotCiAjZGVmaW5lIEZMVVNIX0JBU0VfUEhZUwkJMHg1MDAwMDAwMAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDAxYzlmNDAuLjJkYjdmMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtNyw4ICs3LDggQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCmluZGV4IDcxMzJlNTIuLjU0ZmVjOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwpAQCAtMTgsMTMgKzE4LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIHN0YXRpYyB2b2lkIGlzYV9tYXNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTk0LDggKzk0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRlc2MgPSBpcnFfZGVzYyArIGlzYV9pcnE7Ci0JZGVzY19oYW5kbGVfaXJxKGlzYV9pcnEsIGRlc2MpOworCWdlbmVyaWNfaGFuZGxlX2lycShpc2FfaXJxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX2Nhc2NhZGUgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLXRpbWVyLmMKaW5kZXggYTc2NGUwMS4uMGM4MzkwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwpAQCAtNyw4ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYwppbmRleCBhMWYzODFjLi4wMGIwZGRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCkBAIC0xMCw5ICsxMCw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWMyMTI4NS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvdGltZS5jCmluZGV4IDAwNDgxOWUuLmNkMWI1NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3RpbWUuYwpAQCAtMjIsOSArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY29tbW9uLmMKaW5kZXggYjVmOTc0MS4uN2EyNjE0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5jCkBAIC0xOCwxMSArMTgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CkBAIC0xMDQsMTQgKzEwNCwxMiBAQAogICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJSVJRREJHKCIlcyBpcnE6ICVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKLQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJd2hpbGUgKG1hc2spIHsKIAkJaWYgKG1hc2sgJiAxKSB7CiAJCQlJUlFEQkcoImhhbmRsaW5nIGlycSAlZFxuIiwgaXJxKTsKLQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCX0KIAkJaXJxKys7Ci0JCWRlc2MrKzsKIAkJbWFzayA+Pj0gMTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwppbmRleCA1M2UxZjYyLi5mZDMzYTE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKQEAgLTEyMCwxMiArMTIwLDEwIEBACiAKIAltYXNrID4+PSAxOwogCWlycSA9IElSUV9USU1FUjE7Ci0JZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCXdoaWxlIChtYXNrKSB7CiAJCWlmIChtYXNrICYgMSkKLQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCWlycSsrOwotCQlkZXNjKys7CiAJCW1hc2sgPj49IDE7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLmMKaW5kZXggNGI0MjMwZC4uN2VjNjBmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay5jCkBAIC0yMSw4ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lteC1yZWdzLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBlYjhkNWJkLi42NzgxMmM1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMTEsNiArMTExLDExIEBACiAvKiBkZWNvZGUgaXJxIG51bWJlciB0byB1c2Ugd2l0aCBJTVIoeCksIElTUih4KSBhbmQgZnJpZW5kcyAqLwogI2RlZmluZSBJUlFfVE9fUkVHKGlycSkgKChpcnEgLSBJTVhfSVJRUykgPj4gNSkKIAorLyogYWxsIG5vcm1hbCBJUlFzIGNhbiBiZSBGSVFzICovCisjZGVmaW5lIEZJUV9TVEFSVAkwCisvKiBzd2l0Y2ggYmV0d2VhbiBJUlEgYW5kIEZJUSAqLworZXh0ZXJuIGludCBpbXhfc2V0X2lycV9maXEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpOworCiAjZGVmaW5lIE5SX0lSUVMgKElSUV9HUElPRCgzMikgKyAxKQogI2RlZmluZSBJUlFfR1BJTyh4KQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2lycS5jCmluZGV4IDc5OGYyMjEuLjUzMWI5NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2lycS5jCkBAIC0yNiwyMCArMjYsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogLyoKICAqCiAgKiBXZSBzaW1wbHkgdXNlIHRoZSBFTkFCTEUgRElTQUJMRSByZWdpc3RlcnMgaW5zaWRlIG9mIHRoZSBJTVgKLSAqIHRvIHR1cm4gb24vb2ZmIHNwZWNpZmljIGludGVycnVwdHMuICBGSVhNRS0gV2Ugc2hvdWxkCi0gKiBhbHNvIGFkZCBzdXBwb3J0IGZvciB0aGUgYWNjZWxlcmF0ZWQgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqIGJ5IHB1dHRpbmcgb2ZmZXRzIHRvIGlycSBqdW1wIGNvZGUgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiBwbGFjZXMuCisgKiB0byB0dXJuIG9uL29mZiBzcGVjaWZpYyBpbnRlcnJ1cHRzLgogICoKICAqLwogCkBAIC0xMDIsNiArOTksMjggQEAKIAlfX3Jhd193cml0ZWwoaXJxLCBJTVhfQUlUQ19JTlRFTk5VTSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRklRCitpbnQgaW14X3NldF9pcnFfZmlxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXVuc2lnbmVkIGludCBpcnF0OworCisJaWYgKGlycSA+PSBJTVhfSVJRUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaXJxIDwgSU1YX0lSUVMgLyAyKSB7CisJCWlycXQgPSBfX3Jhd19yZWFkbChJTVhfQUlUQ19JTlRUWVBFTCkgJiB+KDEgPDwgaXJxKTsKKwkJX19yYXdfd3JpdGVsKGlycXQgfCAoISF0eXBlIDw8IGlycSksIElNWF9BSVRDX0lOVFRZUEVMKTsKKwl9IGVsc2UgeworCQlpcnEgLT0gSU1YX0lSUVMgLyAyOworCQlpcnF0ID0gX19yYXdfcmVhZGwoSU1YX0FJVENfSU5UVFlQRUgpICYgfigxIDw8IGlycSk7CisJCV9fcmF3X3dyaXRlbChpcnF0IHwgKCEhdHlwZSA8PCBpcnEpLCBJTVhfQUlUQ19JTlRUWVBFSCk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9zZXRfaXJxX2ZpcSk7CisjZW5kaWYgLyogQ09ORklHX0ZJUSAqLworCiBzdGF0aWMgaW50CiBpbXhfZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgX2lycSwgdW5zaWduZWQgaW50IHR5cGUpCiB7CkBAIC0xODIsMTQgKzIwMSwxMiBAQAogaW14X2dwaW9faGFuZGxlcih1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGlycSwKICAgICAgICAgICAgICAgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAl3aGlsZSAobWFzaykgewogCQlpZiAobWFzayAmIDEpIHsKIAkJCURFQlVHX0lSUSgiaGFuZGxpbmcgaXJxICVkXG4iLCBpcnEpOwotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCQlpcnErKzsKLQkJZGVzYysrOwogCQltYXNrID4+PSAxOwogCX0KIH0KQEAgLTI4Niw0ICszMDMsOSBAQAogCiAJLyogUmVsZWFzZSBtYXNraW5nIG9mIGludGVycnVwdHMgYWNjb3JkaW5nIHRvIHByaW9yaXR5ICovCiAJX19yYXdfd3JpdGVsKC0xLCBJTVhfQUlUQ19OSU1BU0spOworCisjaWZkZWYgQ09ORklHX0ZJUQorCS8qIEluaXRpYWxpemUgRklRICovCisJaW5pdF9GSVEoKTsKKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy1teDFhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L2xlZHMtbXgxYWRzLmMKaW5kZXggYWY4MTYyMS4uMWQ0OGYyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbGVkcy1teDFhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9sZWRzLW14MWFkcy5jCkBAIC0xMyw5ICsxMyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSAibGVkcy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKaW5kZXggMDhiZTM4Ny4uYTExNzY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKaW5kZXggOGJhY2Y2ZDQuLjU5NWI3MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwpAQCAtMTksMTAgKzE5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CiAjaW5jbHVkZSA8bWFjaC9jbS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jcHUuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jcHUuYwppbmRleCA3YzQ5ZDU1Li40NGQ0YzJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NwdS5jCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CiAKQEAgLTE4NCw3ICsxODQsNiBAQAogewogCiAJLyogc2V0IGRlZmF1bHQgcG9saWN5IGFuZCBjcHVpbmZvICovCi0JcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIAlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgPSAxNjAwMDA7CiAJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gMTIwMDA7CiAJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwMDA7IC8qIDEgbXMsIGFzc3VtZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbXBkMS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ltcGQxLmMKaW5kZXggM2M4MzgzZC4uMTcyMjk5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ltcGQxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ltcGQxLmMKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pY3N0NTI1Lmg+CiAjaW5jbHVkZSA8bWFjaC9sbS5oPgogI2luY2x1ZGUgPG1hY2gvaW1wZDEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCmluZGV4IDZlNDcyYjUuLjgxMzhhN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYwpAQCAtMjcsOSArMjcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9rbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4JCS8qIEhaICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwppbmRleCA2Yjk5ZTljLi44ODAyNmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKQEAgLTE5LDkgKzE5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEva21pLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTIxNyw4ICsyMTcsNyBAQAogCiAJCWlycSArPSBJUlFfU0lDX1NUQVJUOwogCi0JCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCX0gd2hpbGUgKHN0YXR1cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvbGVkcy5jCmluZGV4IDdiYzY4ODEuLjhkY2M4MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2xlZHMuYwpAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2lfdjMuYwppbmRleCA5ZjJiMWVhLi5mMWQ3MmIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpX3YzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaV92My5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggZThiNTlkOC4uYjgyNjAyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC03LDkgKzcsNiBAQAogICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCiAgKi8KICNkZWZpbmUgUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLSNkZWZpbmUgVEFTS19TSVpFICAJVUwoMHgzZjAwMDAwMCkKLSNkZWZpbmUgUEFHRV9PRkZTRVQJVUwoMHg0MDAwMDAwMCkKLSNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFICgoVEFTS19TSVpFICsgMHgwMTAwMDAwMCkgLyAzKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC0yOSwzMiArMjYsNTIgQEAKIAogLyogUkFNIGhhcyAxOjEgbWFwcGluZyBvbiB0aGUgUENJZS94IEJ1c3NlcyAqLwogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCShfX3ZpcnRfdG9fcGh5cyh4KSkKLSNkZWZpbmUgX19idXNfdG9fdmlydCh4KSAgICAoX19waHlzX3RvX3ZpcnQoeCkpCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKF9fcGh5c190b192aXJ0KHgpKQogCi0jZGVmaW5lIHZpcnRfdG9fbGJ1cyh4KSAJCQkJCSAgIFwKLSgoICgodm9pZCopKHgpID49ICh2b2lkKilJT1AxM1hYX1BNTVJfVl9TVEFSVCkgJiYJCSAgIFwKLSgodm9pZCopKHgpIDwgKHZvaWQqKUlPUDEzWFhfUE1NUl9WX0VORCkgKSA/IAkJCSAgIFwKLSgoeCkgLSBJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArIElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFKSA6IFwKLSgoeCkgLSBQQUdFX09GRlNFVCArIFBIWVNfT0ZGU0VUKSkKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBfX3ZpcnRfdG9fbGJ1cyh1bnNpZ25lZCBsb25nIHgpCit7CisJcmV0dXJuIHggKyBJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSAtIElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFOworfQogCi0jZGVmaW5lIGxidXNfdG9fdmlydCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKCggKCh4KSA+PSBJT1AxM1hYX1BNTVJfUF9TVEFSVCkgJiYgKCh4KSA8IElPUDEzWFhfUE1NUl9QX0VORCkgKSA/IFwKLSgoeCkgLSBJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSArIElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFICkgOiBcCi0oKHgpIC0gUEhZU19PRkZTRVQgKyBQQUdFX09GRlNFVCkpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19sYnVzX3RvX3ZpcnQoZG1hX2FkZHJfdCB4KQoreworCXJldHVybiB4ICsgSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UgLSBJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRTsKK30KKworI2RlZmluZSBfX2lzX2xidXNfZG1hKGEpCQkJCVwKKwkoKGEpID49IElPUDEzWFhfUE1NUl9QX1NUQVJUICYmIChhKSA8IElPUDEzWFhfUE1NUl9QX0VORCkKKworI2RlZmluZSBfX2lzX2xidXNfdmlydChhKQkJCQlcCisJKChhKSA+PSBJT1AxM1hYX1BNTVJfVl9TVEFSVCAmJiAoYSkgPCBJT1AxM1hYX1BNTVJfVl9FTkQpCiAKIC8qIERldmljZSBpcyBhbiBsYnVzIGRldmljZSBpZiBpdCBpcyBvbiB0aGUgcGxhdGZvcm0gYnVzIG9mIHRoZSBJT1AxM1hYICovCi0jZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikgKGRldiAmJlwKLQkJCSAgICAgKHN0cm5jbXAoZGV2LT5idXMtPm5hbWUsICJwbGF0Zm9ybSIsIDgpID09IDApKQorI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpIAkJCQlcCisJKGRldiAmJiBzdHJuY21wKGRldi0+YnVzLT5uYW1lLCAicGxhdGZvcm0iLCA4KSA9PSAwKQorCisjZGVmaW5lIF9fYXJjaF9kbWFfdG9fdmlydChkZXYsIGFkZHIpCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3ZpcnQ7CQkJCQlcCisJCWRtYV9hZGRyX3QgX19kbWEgPSBhZGRyOwkJCQlcCisJCWlmIChpc19sYnVzX2RldmljZShkZXYpICYmIF9faXNfbGJ1c19kbWEoX19kbWEpKQlcCisJCQlfX3ZpcnQgPSBfX2xidXNfdG9fdmlydChfX2RtYSk7CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCV9fdmlydCA9IF9fYnVzX3RvX3ZpcnQoX19kbWEpOwkJCVwKKwkJKHZvaWQgKilfX3ZpcnQ7CQkJCQkJXAorCX0pCisKKyNkZWZpbmUgX19hcmNoX3ZpcnRfdG9fZG1hKGRldiwgYWRkcikJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIF9fdmlydCA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CQlcCisJCWRtYV9hZGRyX3QgX19kbWE7CQkJCQlcCisJCWlmIChpc19sYnVzX2RldmljZShkZXYpICYmIF9faXNfbGJ1c192aXJ0KF9fdmlydCkpCVwKKwkJCV9fZG1hID0gX192aXJ0X3RvX2xidXMoX192aXJ0KTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJX19kbWEgPSBfX3ZpcnRfdG9fYnVzKF9fdmlydCk7CQkJXAorCQlfX2RtYTsJCQkJCQkJXAorCX0pCiAKICNkZWZpbmUgX19hcmNoX3BhZ2VfdG9fZG1hKGRldiwgcGFnZSkJCQkJCVwKLSh7aXNfbGJ1c19kZXZpY2UoZGV2KSA/IChkbWFfYWRkcl90KXZpcnRfdG9fbGJ1cyhwYWdlX2FkZHJlc3MocGFnZSkpIDogXAotKGRtYV9hZGRyX3QpX192aXJ0X3RvX2J1cyhwYWdlX2FkZHJlc3MocGFnZSkpO30pCi0KLSNkZWZpbmUgX19hcmNoX2RtYV90b192aXJ0KGRldiwgYWRkcikgXAotKHtpc19sYnVzX2RldmljZShkZXYpID8gbGJ1c190b192aXJ0KGFkZHIpIDogX19idXNfdG9fdmlydChhZGRyKTt9KQotCi0jZGVmaW5lIF9fYXJjaF92aXJ0X3RvX2RtYShkZXYsIGFkZHIpIFwKLSh7aXNfbGJ1c19kZXZpY2UoZGV2KSA/IHZpcnRfdG9fbGJ1cyhhZGRyKSA6IF9fdmlydF90b19idXMoYWRkcik7fSkKKwlfX2FyY2hfdmlydF90b19kbWEoZGV2LCBwYWdlX2FkZHJlc3MocGFnZSkpCiAKICNlbmRpZiAvKiBDT05GSUdfQVJDSF9JT1AxM1hYICovCiAjZW5kaWYgLyogIUFTU0VNQkxZICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL3BjaS5oIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9wY2kuaAppbmRleCAxN2I1NTE1Li41OWY0MmI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL3BjaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvcGNpLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9JT1AxM1hYX1BDSV9IXwogI2RlZmluZSBfSU9QMTNYWF9QQ0lfSF8KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdHJ1Y3QgcGNpX3N5c19kYXRhOwogc3RydWN0IGh3X3BjaTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pby5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lvLmMKaW5kZXggMjZjZmEzMS4uNTI5NTgwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lvLmMKQEAgLTE4LDggKzE4LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiB2b2lkICogX19pb21lbSBfX2lvcDEzeHhfaW8odW5zaWduZWQgbG9uZyBpb19hZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L21zaS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L21zaS5jCmluZGV4IDYzZWYxMTI0Yy4uZjM0YjBlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L21zaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9tc2kuYwpAQCAtMTEwLDggKzExMCw3IEBACiAJCWRvIHsKIAkJCWogPSBmaW5kX2ZpcnN0X2JpdCgmc3RhdHVzLCAzMik7CiAJCQkod3JpdGVfaW1pcHJbaV0pKDEgPDwgaik7IC8qIHdyaXRlIGJhY2sgdG8gY2xlYXIgYml0ICovCi0JCQlkZXNjID0gaXJxX2Rlc2MgKyBJUlFfSU9QMTNYWF9NU0lfMCArIGogKyAoMzIqaSk7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoSVJRX0lPUDEzWFhfTVNJXzAgKyBqICsgKDMyKmkpLAlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfSU9QMTNYWF9NU0lfMCArIGogKyAoMzIqaSkpOwogCQkJc3RhdHVzID0gKHJlYWRfaW1pcHJbaV0pKCk7CiAJCX0gd2hpbGUgKHN0YXR1cyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYwppbmRleCBiMTdjY2M4Li5jZmQ0ZDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYwpAQCAtMTgsMTMgKzE4LDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpZmRlZiBDT05GSUdfTVREX1BIWVNNQVAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9wX2FkbWEuaD4KIAogI2RlZmluZSBJT1AxM1hYX1VBUlRfWFRBTCAzMzMzNDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3RwbWkuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC90cG1pLmMKaW5kZXggMjQ3NjM0Ny4uYzZhZjFlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3RwbWkuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvdHBtaS5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCmluZGV4IDQ1ZDYxMjcuLmE5YzJkZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYwpAQCAtMjUsOCArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYwppbmRleCAwODI4MThhYS4uZGQxY2Q5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYwpAQCAtMjYsOCArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC00OSw4ICs1MCw3IEBACiAKIHN0YXRpYyBpbnQgaXNfODAyMTkodm9pZCkKIHsKLQlleHRlcm4gaW50IHByb2Nlc3Nvcl9pZDsKLQlyZXR1cm4gISEoKHByb2Nlc3Nvcl9pZCAmIDB4ZmZmZmZmZTApID09IDB4NjkwNTJlMjApOworCXJldHVybiAhISgocmVhZF9jcHVpZF9pZCgpICYgMHhmZmZmZmZlMCkgPT0gMHg2OTA1MmUyMCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNfZXA4MDIxOSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCmluZGV4IGQ3MzU1MzkuLmZiZTI3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDMxNzNmOWMuLmQyZTQyNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtMzAsOCArMzAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKaW5kZXggYzdkOTlmOS4uZDUxZTEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYwpAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCmluZGV4IGFmNjE2YzUuLjkyZmI0NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L3VhcnQuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L3VhcnQuYwppbmRleCA4YzIxODcwLi5jZGFlMjRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC91YXJ0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvdWFydC5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCmluZGV4IGE2YTRmOTMuLmJhYmIyMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwpAQCAtODQsNjQgKzg0LDU3IEBACiAJCS52aXJ0dWFsCT0gSVhQMjAwMF9DQVBfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oSVhQMjAwMF9DQVBfUEhZU19CQVNFKSwKIAkJLmxlbmd0aAkJPSBJWFAyMDAwX0NBUF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0VfSVhQMjAwMCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKIAkJLnZpcnR1YWwJPSBJWFAyMDAwX0lOVENUTF9WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJWFAyMDAwX0lOVENUTF9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfSU5UQ1RMX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRV9JWFAyMDAwLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewogCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0NSRUdfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oSVhQMjAwMF9QQ0lfQ1JFR19QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NSRUdfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFX0lYUDIwMDAsCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gSVhQMjAwMF9QQ0lfQ1NSX1ZJUlRfQkFTRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElYUDIwMDBfUENJX0NTUl9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NTUl9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0VfSVhQMjAwMCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKIAkJLnZpcnR1YWwJPSBJWFAyMDAwX01TRl9WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJWFAyMDAwX01TRl9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfTVNGX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRV9JWFAyMDAwLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewogCQkudmlydHVhbAk9IElYUDIwMDBfU0NSQVRDSF9SSU5HX1ZJUlRfQkFTRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKElYUDIwMDBfU0NSQVRDSF9SSU5HX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gSVhQMjAwMF9TQ1JBVENIX1JJTkdfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFX0lYUDIwMDAsCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gSVhQMjAwMF9TUkFNMF9WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJWFAyMDAwX1NSQU0wX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gSVhQMjAwMF9TUkFNMF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0VfSVhQMjAwMCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKIAkJLnZpcnR1YWwJPSBJWFAyMDAwX1BDSV9JT19WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJWFAyMDAwX1BDSV9JT19QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0lPX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRV9JWFAyMDAwLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewogCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0NGRzBfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oSVhQMjAwMF9QQ0lfQ0ZHMF9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NGRzBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFX0lYUDIwMDAsCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gSVhQMjAwMF9QQ0lfQ0ZHMV9WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihJWFAyMDAwX1BDSV9DRkcxX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gSVhQMjAwMF9QQ0lfQ0ZHMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0VfSVhQMjAwMCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0KIH07CiAKIHZvaWQgX19pbml0IGl4cDIwMDBfbWFwX2lvKHZvaWQpCiB7Ci0JLyoKLQkgKiBPbiBJWFAyNDAwIENQVXMgd2UgbmVlZCB0byB1c2UgTVRfREVWSUNFX0lYUDIwMDAgc28gdGhhdAotCSAqIFhDQj0xMDEgKHRvIGF2b2lkIHRyaWdnZXJpbmcgZXJyYXR1bSAjNjYpLCBhbmQgZ2l2ZW4gdGhhdAotCSAqIHRoaXMgbW9kZSBzcGVlZHMgdXAgSS9PIGFjY2Vzc2VzIGFuZCB3ZSBoYXZlIHdyaXRlIGJ1ZmZlcgotCSAqIGZsdXNoZXMgaW4gdGhlIHJpZ2h0IHBsYWNlcyBhbnl3YXksIGl0IGRvZXNuJ3QgaHVydCB0byB1c2UKLQkgKiBYQ0I9MTAxIGZvciBhbGwgSVhQMjAwMHMuCi0JICovCiAJaW90YWJsZV9pbml0KGl4cDIwMDBfaW9fZGVzYywgQVJSQVlfU0laRShpeHAyMDAwX2lvX2Rlc2MpKTsKIAogCS8qIFNldCBzbG93cG9ydCB0byA4LWJpdCBtb2RlLiAgKi8KQEAgLTMxMSw4ICszMDQsNyBAQAogCQkgICAKIAlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykgewogCQlpZiAoc3RhdHVzICYgKDE8PGkpKSB7Ci0JCQlkZXNjID0gaXJxX2Rlc2MgKyBpICsgSVJRX0lYUDIwMDBfR1BJTzA7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoaSArIElSUV9JWFAyMDAwX0dQSU8wLCBkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpICsgSVJRX0lYUDIwMDBfR1BJTzApOwogCQl9CiAJfQogfQpAQCAtNDA0LDggKzM5Niw3IEBACiAKIAlmb3IoaSA9IDMxOyBpID49IDA7IGktLSkgewogCQlpZihzdGF0dXMgJiAoMSA8PCBpKSkgewotCQkJZGVzYyA9IGlycV9kZXNjICsgSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUiArIGk7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUiArIGksIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9JWFAyMDAwX0RSQU0wX01JTl9FUlIgKyBpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCmluZGV4IGM2MmVkNjUuLmM4NGRmYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMzIsOCArMzIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC03MCwxNyArNzAsMTcgQEAKIAkJLnZpcnR1YWwJPSBFTlAyNjExX0NBTEVCX1ZJUlRfQkFTRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVOUDI2MTFfQ0FMRUJfUEhZU19CQVNFKSwKIAkJLmxlbmd0aAkJPSBFTlAyNjExX0NBTEVCX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRV9JWFAyMDAwLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewogCQkudmlydHVhbAk9IEVOUDI2MTFfUE0zMzg2XzBfVklSVF9CQVNFLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oRU5QMjYxMV9QTTMzODZfMF9QSFlTX0JBU0UpLAogCQkubGVuZ3RoCQk9IEVOUDI2MTFfUE0zMzg2XzBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFX0lYUDIwMDAsCisJCS50eXBlCQk9IE1UX0RFVklDRSwKIAl9LCB7CiAJCS52aXJ0dWFsCT0gRU5QMjYxMV9QTTMzODZfMV9WSVJUX0JBU0UsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFTlAyNjExX1BNMzM4Nl8xX1BIWVNfQkFTRSksCiAJCS5sZW5ndGgJCT0gRU5QMjYxMV9QTTMzODZfMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0VfSVhQMjAwMCwKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvaXhwMjAwMC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2l4cDIwMDAtcmVncy5oCmluZGV4IDE5ZDgwMzcuLjgyMmY2M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvaXhwMjAwMC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9peHAyMDAwLXJlZ3MuaApAQCAtNDEsMTMgKzQxLDcgQEAKICAqIE1vc3Qgb2YgdGhlIHJlZ2lzdGVycyBhcmUgY2x1bXBlZCBpbiA0SyByZWdpb25zIHNwcmVhZCB0aHJvdWdob3V0CiAgKiB0aGUgMHhjMDAwMDAwMCAtPiAweGMwMTAwMDAwIGFkZHJlc3MgcmFuZ2UsIGJ1dCB3ZSBqdXN0IG1hcCBpbgogICogdGhlIHdob2xlIHJhbmdlIHVzaW5nIGEgc2luZ2xlIDEgTUIgc2VjdGlvbiBpbnN0ZWFkIG9mIHNtYWxsCi0gKiA0SyBwYWdlcy4gIFRoaXMgaGFzIHR3byBhZHZhbnRhZ2VzIGZvciB1czoKLSAqCi0gKiAxKSBXZSB1c2Ugb25seSBvbmUgVExCIGVudHJ5IGZvciBsYXJnZSBudW1iZXIgb2Ygb24tY2hpcCBJL08gZGV2aWNlcy4KLSAqCi0gKiAyKSBXZSBjYW4gZWFzaWx5IHNldCB0aGUgU2VjdGlvbiBhdHRyaWJ1dGVzIHRvIFhDQj0xMDEgb24gdGhlIElYUDI0MDAKLSAqICAgIGFzIHJlcXVpcmVkIHBlciBlcnJhdHVtICM2Ni4gIFdlIGFjY29tcGxpc2ggdGhpcyBieSB1c2luZyBhCi0gKiAgICBuZXcgTVRfSVhQMjAwMF9ERVZJQ0UgbWVtb3J5IHR5cGUgd2l0aCB0aGUgYml0cyBzZXQgYXMgcmVxdWlyZWQuCisgKiA0SyBwYWdlcy4KICAqCiAgKiBDQVAgc3RhbmRzIGZvciBDU1IgQWNjZXNzIFByb3h5LgogICoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggYzY3M2I5ZS4uNDQ2N2M0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKaW5kZXggNjcxNWI1MC4uOTRmNjhiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKaW5kZXggNWE3ODFmZC4uYjA2NTNhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTEyOSwxMCArMTI5LDggQEAKIAogCWZvcihpID0gMDsgaSA8IGJvYXJkX2lycV9jb3VudDsgaSsrKSB7CiAJCWlmKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSAgewotCQkJc3RydWN0IGlycV9kZXNjICpjcGxkX2Rlc2M7CiAJCQlpbnQgY3BsZF9pcnEgPSBJWFAyMDAwX0JPQVJEX0lSUSgwKSArIGk7Ci0JCQljcGxkX2Rlc2MgPSBpcnFfZGVzYyArIGNwbGRfaXJxOwotCQkJZGVzY19oYW5kbGVfaXJxKGNwbGRfaXJxLCBjcGxkX2Rlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGNwbGRfaXJxKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwppbmRleCA3OGEyMzQxLi40YTEyMzI3YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNzksMTAgKzc5LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBJWFAyMDAwX0JPQVJEX0lSUVM7IGkrKykgewogCQlpZiAoZXhfaW50ZXJydXB0ICYgKDEgPDwgaSkpIHsKLQkJCXN0cnVjdCBpcnFfZGVzYyAqY3BsZF9kZXNjOwogCQkJaW50IGNwbGRfaXJxID0gSVhQMjAwMF9CT0FSRF9JUlEoMCkgKyBpOwotCQkJY3BsZF9kZXNjID0gaXJxX2Rlc2MgKyBjcGxkX2lycTsKLQkJCWRlc2NfaGFuZGxlX2lycShjcGxkX2lycSwgY3BsZF9kZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShjcGxkX2lycSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYwppbmRleCAwM2Q5MTZmLi42MGU5ZmQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9jb3JlLmMKaW5kZXggNjhiNGFjNS4uYWE0YzQ0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvY29yZS5jCkBAIC0yNTMsNyArMjUzLDYgQEAKIHsKIAl1MzIgcGNpX2ludGVycnVwdDsKIAl1bnNpZ25lZCBpbnQgaXJxbm87Ci0Jc3RydWN0IGlycV9kZXNjICppbnRfZGVzYzsKIAogCXBjaV9pbnRlcnJ1cHQgPSAqSVhQMjNYWF9QQ0lfWFNDQUxFX0lOVF9TVEFUVVM7CiAKQEAgLTI2OCw4ICsyNjcsNyBAQAogCQlCVUcoKTsKIAl9CiAKLQlpbnRfZGVzYyA9IGlycV9kZXNjICsgaXJxbm87Ci0JZGVzY19oYW5kbGVfaXJxKGlycW5vLCBpbnRfZGVzYyk7CisJZ2VuZXJpY19oYW5kbGVfaXJxKGlycW5vKTsKIAogCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2l4ZHAyMzUxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwppbmRleCBiNmUwYmZhLi5mMWIxMjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwpAQCAtNjgsMTEgKzY4LDkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBJWERQMjM1MV9JTlRBX0lSUV9OVU07IGkrKykgewogCQlpZiAoZXhfaW50ZXJydXB0ICYgKDEgPDwgaSkpIHsKLQkJCXN0cnVjdCBpcnFfZGVzYyAqY3BsZF9kZXNjOwogCQkJaW50IGNwbGRfaXJxID0KIAkJCQlJWFAyM1hYX01BQ0hfSVJRKElYRFAyMzUxX0lOVEFfSVJRX0JBU0UgKyBpKTsKLQkJCWNwbGRfZGVzYyA9IGlycV9kZXNjICsgY3BsZF9pcnE7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoY3BsZF9pcnEsIGNwbGRfZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoY3BsZF9pcnEpOwogCQl9CiAJfQogCkBAIC0xMDUsMTEgKzEwMyw5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgSVhEUDIzNTFfSU5UQl9JUlFfTlVNOyBpKyspIHsKIAkJaWYgKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSB7Ci0JCQlzdHJ1Y3QgaXJxX2Rlc2MgKmNwbGRfZGVzYzsKIAkJCWludCBjcGxkX2lycSA9CiAJCQkJSVhQMjNYWF9NQUNIX0lSUShJWERQMjM1MV9JTlRCX0lSUV9CQVNFICsgaSk7Ci0JCQljcGxkX2Rlc2MgPSBpcnFfZGVzYyArIGNwbGRfaXJxOwotCQkJZGVzY19oYW5kbGVfaXJxKGNwbGRfaXJxLCBjcGxkX2Rlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGNwbGRfaXJxKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3BjaS5jCmluZGV4IDcwMWQ2MGEuLjU5MDIyYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcGNpLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwppbmRleCAxOTI1MzhhLi5kODE2YzUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCkBAIC0yNSw5ICsyNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zNjYsMTUgKzM2NywxMyBAQAogCiB2b2lkIF9faW5pdCBpeHA0eHhfcGNpX3ByZWluaXQodm9pZCkKIHsgIAotCXVuc2lnbmVkIGxvbmcgcHJvY2Vzc29yX2lkOwotCi0JYXNtKCJtcmMgcDE1LCAwLCAlMCwgY3IwLCBjcjAsIDA7IiA6ICI9ciIocHJvY2Vzc29yX2lkKSA6KTsKKwl1bnNpZ25lZCBsb25nIGNwdWlkID0gcmVhZF9jcHVpZF9pZCgpOwogCiAJLyoKIAkgKiBEZXRlcm1pbmUgd2hpY2ggUENJIHJlYWQgbWV0aG9kIHRvIHVzZS4KIAkgKiBSZXYgMCBJWFA0MjUgcmVxdWlyZXMgd29ya2Fyb3VuZC4KIAkgKi8KLQlpZiAoIShwcm9jZXNzb3JfaWQgJiAweGYpICYmIGNwdV9pc19peHA0MngoKSkgeworCWlmICghKGNwdWlkICYgMHhmKSAmJiBjcHVfaXNfaXhwNDJ4KCkpIHsKIAkJcHJpbnRrKCJQQ0k6IElYUDQyeCBBMCBzaWxpY29uIGRldGVjdGVkIC0gIgogCQkJIlBDSSBOb24tUHJlZmV0Y2ggV29ya2Fyb3VuZCBFbmFibGVkXG4iKTsKIAkJaXhwNHh4X3BjaV9yZWFkID0gaXhwNHh4X3BjaV9yZWFkX2VycmF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggNThiZDI4NC4uNzc2NmY0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTI4LDExICsyOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKaW5kZXggNTAxZGZkYy4uZTdjNjM4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKQEAgLTIzLDExICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGZzZ19mbGFzaF9kYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2NwdS5oCmluZGV4IGZmOGFhMjMuLjUxYmQ2OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9jcHUuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTE0LDE4ICsxNCwxOSBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0NQVV9IX18KICNkZWZpbmUgX19BU01fQVJDSF9DUFVfSF9fCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOworI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CisKIC8qIFByb2Nlc3NvciBpZCB2YWx1ZSBpbiBDUDE1IFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgSVhQNDI1X1BST0NFU1NPUl9JRF9WQUxVRQkweDY5MDU0MWMwCiAjZGVmaW5lIElYUDQzNV9QUk9DRVNTT1JfSURfVkFMVUUJMHg2OTA1NDA0MAogI2RlZmluZSBJWFA0NjVfUFJPQ0VTU09SX0lEX1ZBTFVFCTB4NjkwNTQyMDAKICNkZWZpbmUgSVhQNFhYX1BST0NFU1NPUl9JRF9NQVNLCTB4ZmZmZmZmZjAKIAotI2RlZmluZSBjcHVfaXNfaXhwNDJ4KCkJKChwcm9jZXNzb3JfaWQgJiBJWFA0WFhfUFJPQ0VTU09SX0lEX01BU0spID09IFwKKyNkZWZpbmUgY3B1X2lzX2l4cDQyeCgpCSgocmVhZF9jcHVpZF9pZCgpICYgSVhQNFhYX1BST0NFU1NPUl9JRF9NQVNLKSA9PSBcCiAJCQkgIElYUDQyNV9QUk9DRVNTT1JfSURfVkFMVUUpCi0jZGVmaW5lIGNwdV9pc19peHA0M3goKQkoKHByb2Nlc3Nvcl9pZCAmIElYUDRYWF9QUk9DRVNTT1JfSURfTUFTSykgPT0gXAorI2RlZmluZSBjcHVfaXNfaXhwNDN4KCkJKChyZWFkX2NwdWlkX2lkKCkgJiBJWFA0WFhfUFJPQ0VTU09SX0lEX01BU0spID09IFwKIAkJCSAgSVhQNDM1X1BST0NFU1NPUl9JRF9WQUxVRSkKLSNkZWZpbmUgY3B1X2lzX2l4cDQ2eCgpCSgocHJvY2Vzc29yX2lkICYgSVhQNFhYX1BST0NFU1NPUl9JRF9NQVNLKSA9PSBcCisjZGVmaW5lIGNwdV9pc19peHA0NngoKQkoKHJlYWRfY3B1aWRfaWQoKSAmIElYUDRYWF9QUk9DRVNTT1JfSURfTUFTSykgPT0gXAogCQkJICBJWFA0NjVfUFJPQ0VTU09SX0lEX1ZBTFVFKQogCiBzdGF0aWMgaW5saW5lIHUzMiBpeHA0eHhfcmVhZF9mZWF0dXJlX2JpdHModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYwppbmRleCA5YjJkMmVjLi5mNGEwYzFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0yOSw3ICszMCw2IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgaXhkcDQyNV9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCmluZGV4IDg0YjVlNjIuLjBhY2Q5NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKQEAgLTI4LDExICsyOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIG5hczEwMGRfZmxhc2hfZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCmluZGV4IGE0OGE2NjUuLmJjOWQ5MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwpAQCAtMjUsMTIgKzI1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIG5zbHUyX2ZsYXNoX2RhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2FkZHItbWFwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2FkZHItbWFwLmMKaW5kZXggYzc5ZjQ5Mi4uNWRiNGYwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9hZGRyLW1hcC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvYWRkci1tYXAuYwpAQCAtNDgsNiArNDgsNyBAQAogCiAKIHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8ga2lya3dvb2RfbWJ1c19kcmFtX2luZm87CitzdGF0aWMgaW50IF9faW5pdGRhdGEgd2luX2FsbG9jX2NvdW50OwogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVfd2luX2Nhbl9yZW1hcChpbnQgd2luKQogewpAQCAtMTExLDYgKzExMiw4IEBACiAJc2V0dXBfY3B1X3dpbigyLCBLSVJLV09PRF9OQU5EX01FTV9QSFlTX0JBU0UsIEtJUktXT09EX05BTkRfTUVNX1NJWkUsCiAJCSAgICAgIFRBUkdFVF9ERVZfQlVTLCBBVFRSX0RFVl9OQU5ELCAtMSk7CiAKKwl3aW5fYWxsb2NfY291bnQgPSAzOworCiAJLyoKIAkgKiBTZXR1cCBNQlVTIGRyYW0gdGFyZ2V0IGluZm8uCiAJICovCkBAIC0xMzcsMyArMTQwLDggQEAKIAl9CiAJa2lya3dvb2RfbWJ1c19kcmFtX2luZm8ubnVtX2NzID0gY3M7CiB9CisKK3ZvaWQgX19pbml0IGtpcmt3b29kX3NldHVwX3NyYW1fd2luKHUzMiBiYXNlLCB1MzIgc2l6ZSkKK3sKKwlzZXR1cF9jcHVfd2luKHdpbl9hbGxvY19jb3VudCsrLCBiYXNlLCBzaXplLCAweDAzLCAweDAwLCAtMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYwppbmRleCAxODlmMTZmLi44NWNhZDA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKQEAgLTk4LDcgKzk4LDYgQEAKICAqIEdFMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IG12NjQzeHhfZXRoX3NoYXJlZF9wbGF0Zm9ybV9kYXRhIGtpcmt3b29kX2dlMDBfc2hhcmVkX2RhdGEgPSB7Ci0JLnRfY2xrCQk9IEtJUktXT09EX1RDTEssCiAJLmRyYW0JCT0gJmtpcmt3b29kX21idXNfZHJhbV9pbmZvLAogfTsKIApAQCAtMTA4LDYgKzEwNywxMSBAQAogCQkuc3RhcnQJPSBHRTAwX1BIWVNfQkFTRSArIDB4MjAwMCwKIAkJLmVuZAk9IEdFMDBfUEhZU19CQVNFICsgMHgzZmZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5uYW1lCT0gImdlMDAgZXJyIGlycSIsCisJCS5zdGFydAk9IElSUV9LSVJLV09PRF9HRTAwX0VSUiwKKwkJLmVuZAk9IElSUV9LSVJLV09PRF9HRTAwX0VSUiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKQEAgLTExNyw3ICsxMjEsNyBAQAogCS5kZXYJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9ICZraXJrd29vZF9nZTAwX3NoYXJlZF9kYXRhLAogCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShraXJrd29vZF9nZTAwX3NoYXJlZF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IGtpcmt3b29kX2dlMDBfc2hhcmVkX3Jlc291cmNlcywKIH07CiAKQEAgLTIwMSw3ICsyMDUsNiBAQAogICogU1BJCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3Qgb3Jpb25fc3BpX2luZm8ga2lya3dvb2Rfc3BpX3BsYXRfZGF0YSA9IHsKLQkudGNsawkJPSBLSVJLV09PRF9UQ0xLLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBraXJrd29vZF9zcGlfcmVzb3VyY2VzW10gPSB7CkBAIC0yMzksNyArMjQyLDcgQEAKIAkJLmZsYWdzCQk9IFVQRl9TS0lQX1RFU1QgfCBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKIAkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSBLSVJLV09PRF9UQ0xLLAorCQkudWFydGNsawk9IDAsCiAJfSwgewogCX0sCiB9OwpAQCAtMjgzLDcgKzI4Niw3IEBACiAJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNUIHwgVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gS0lSS1dPT0RfVENMSywKKwkJLnVhcnRjbGsJPSAwLAogCX0sIHsKIAl9LAogfTsKQEAgLTUyNSw5ICs1MjgsMjMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGltZSBoYW5kbGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQga2lya3dvb2RfdGNsazsKKworaW50IF9faW5pdCBraXJrd29vZF9maW5kX3RjbGsodm9pZCkKK3sKKwl1MzIgZGV2LCByZXY7CisKKwlraXJrd29vZF9wY2llX2lkKCZkZXYsICZyZXYpOworCWlmIChkZXYgPT0gTVY4OEY2MjgxX0RFVl9JRCAmJiByZXYgPT0gTVY4OEY2MjgxX1JFVl9BMCkKKwkJcmV0dXJuIDIwMDAwMDAwMDsKKworCXJldHVybiAxNjY2NjY2Njc7Cit9CisKIHN0YXRpYyB2b2lkIGtpcmt3b29kX3RpbWVyX2luaXQodm9pZCkKIHsKLQlvcmlvbl90aW1lX2luaXQoSVJRX0tJUktXT09EX0JSSURHRSwgS0lSS1dPT0RfVENMSyk7CisJa2lya3dvb2RfdGNsayA9IGtpcmt3b29kX2ZpbmRfdGNsaygpOworCW9yaW9uX3RpbWVfaW5pdChJUlFfS0lSS1dPT0RfQlJJREdFLCBraXJrd29vZF90Y2xrKTsKIH0KIAogc3RydWN0IHN5c190aW1lciBraXJrd29vZF90aW1lciA9IHsKQEAgLTUzOCwzMyArNTU1LDYyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEdlbmVyYWwKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIElkZW50aWZ5IGRldmljZSBJRCBhbmQgcmV2aXNpb24uCisgKi8KIHN0YXRpYyBjaGFyICogX19pbml0IGtpcmt3b29kX2lkKHZvaWQpCiB7Ci0Jc3dpdGNoIChyZWFkbChERVZJQ0VfSUQpICYgMHgzKSB7Ci0JY2FzZSAwOgotCQlyZXR1cm4gIjg4RjYxODAiOwotCWNhc2UgMToKLQkJcmV0dXJuICI4OEY2MTkyIjsKLQljYXNlIDI6Ci0JCXJldHVybiAiODhGNjI4MSI7Ci0JfQorCXUzMiBkZXYsIHJldjsKIAotCXJldHVybiAidW5rbm93biA4OEY2MDAwIHZhcmlhbnQiOworCWtpcmt3b29kX3BjaWVfaWQoJmRldiwgJnJldik7CisKKwlpZiAoZGV2ID09IE1WODhGNjI4MV9ERVZfSUQpIHsKKwkJaWYgKHJldiA9PSBNVjg4RjYyODFfUkVWX1owKQorCQkJcmV0dXJuICJNVjg4RjYyODEtWjAiOworCQllbHNlIGlmIChyZXYgPT0gTVY4OEY2MjgxX1JFVl9BMCkKKwkJCXJldHVybiAiTVY4OEY2MjgxLUEwIjsKKwkJZWxzZQorCQkJcmV0dXJuICJNVjg4RjYyODEtUmV2LVVuc3VwcG9ydGVkIjsKKwl9IGVsc2UgaWYgKGRldiA9PSBNVjg4RjYxOTJfREVWX0lEKSB7CisJCWlmIChyZXYgPT0gTVY4OEY2MTkyX1JFVl9aMCkKKwkJCXJldHVybiAiTVY4OEY2MTkyLVowIjsKKwkJZWxzZSBpZiAocmV2ID09IE1WODhGNjE5Ml9SRVZfQTApCisJCQlyZXR1cm4gIk1WODhGNjE5Mi1BMCI7CisJCWVsc2UKKwkJCXJldHVybiAiTVY4OEY2MTkyLVJldi1VbnN1cHBvcnRlZCI7CisJfSBlbHNlIGlmIChkZXYgPT0gTVY4OEY2MTgwX0RFVl9JRCkgeworCQlpZiAocmV2ID09IE1WODhGNjE4MF9SRVZfQTApCisJCQlyZXR1cm4gIk1WODhGNjE4MC1SZXYtQTAiOworCQllbHNlCisJCQlyZXR1cm4gIk1WODhGNjE4MC1SZXYtVW5zdXBwb3J0ZWQiOworCX0gZWxzZSB7CisJCXJldHVybiAiRGV2aWNlLVVua25vd24iOworCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgaXNfbDJfd3JpdGV0aHJvdWdoKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQga2lya3dvb2RfbDJfaW5pdCh2b2lkKQogewotCXJldHVybiAhIShyZWFkbChMMl9DT05GSUdfUkVHKSAmIEwyX1dSSVRFVEhST1VHSCk7CisjaWZkZWYgQ09ORklHX0NBQ0hFX0ZFUk9DRU9OX0wyX1dSSVRFVEhST1VHSAorCXdyaXRlbChyZWFkbChMMl9DT05GSUdfUkVHKSB8IEwyX1dSSVRFVEhST1VHSCwgTDJfQ09ORklHX1JFRyk7CisJZmVyb2Nlb25fbDJfaW5pdCgxKTsKKyNlbHNlCisJd3JpdGVsKHJlYWRsKEwyX0NPTkZJR19SRUcpICYgfkwyX1dSSVRFVEhST1VHSCwgTDJfQ09ORklHX1JFRyk7CisJZmVyb2Nlb25fbDJfaW5pdCgwKTsKKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdCBraXJrd29vZF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiS2lya3dvb2Q6ICVzLCBUQ0xLPSVkLlxuIiwKLQkJa2lya3dvb2RfaWQoKSwgS0lSS1dPT0RfVENMSyk7CisJCWtpcmt3b29kX2lkKCksIGtpcmt3b29kX3RjbGspOworCWtpcmt3b29kX2dlMDBfc2hhcmVkX2RhdGEudF9jbGsgPSBraXJrd29vZF90Y2xrOworCWtpcmt3b29kX3NwaV9wbGF0X2RhdGEudGNsayA9IGtpcmt3b29kX3RjbGs7CisJa2lya3dvb2RfdWFydDBfZGF0YVswXS51YXJ0Y2xrID0ga2lya3dvb2RfdGNsazsKKwlraXJrd29vZF91YXJ0MV9kYXRhWzBdLnVhcnRjbGsgPSBraXJrd29vZF90Y2xrOwogCiAJa2lya3dvb2Rfc2V0dXBfY3B1X21idXMoKTsKIAogI2lmZGVmIENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMgotCWZlcm9jZW9uX2wyX2luaXQoaXNfbDJfd3JpdGV0aHJvdWdoKCkpOworCWtpcmt3b29kX2wyX2luaXQoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmgKaW5kZXggNjljZDExMy4uOGZhMGY2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5oCkBAIC0yMywxMCArMjMsOSBAQAogCiBleHRlcm4gc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyBraXJrd29vZF9tYnVzX2RyYW1faW5mbzsKIHZvaWQga2lya3dvb2Rfc2V0dXBfY3B1X21idXModm9pZCk7Ci12b2lkIGtpcmt3b29kX3NldHVwX3BjaWVfaW9fd2luKGludCB3aW5kb3csIHUzMiBiYXNlLCB1MzIgc2l6ZSwKLQkJCQlpbnQgbWFqLCBpbnQgbWluKTsKLXZvaWQga2lya3dvb2Rfc2V0dXBfcGNpZV9tZW1fd2luKGludCB3aW5kb3csIHUzMiBiYXNlLCB1MzIgc2l6ZSwKLQkJCQkgaW50IG1haiwgaW50IG1pbik7Cit2b2lkIGtpcmt3b29kX3NldHVwX3NyYW1fd2luKHUzMiBiYXNlLCB1MzIgc2l6ZSk7CisKK3ZvaWQga2lya3dvb2RfcGNpZV9pZCh1MzIgKmRldiwgdTMyICpyZXYpOwogCiB2b2lkIGtpcmt3b29kX2VoY2lfaW5pdCh2b2lkKTsKIHZvaWQga2lya3dvb2RfZ2UwMF9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kYjg4ZjYyODEtYnAtc2V0dXAuYwppbmRleCA2MTBmYjI0Li5hMTRjMjk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZGI4OGY2MjgxLWJwLXNldHVwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJjb21tb24uaCIKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGRiODhmNjI4MV9nZTAwX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gOCwKKwkucGh5X2FkZHIJPSBNVjY0M1hYX0VUSF9QSFlfQUREUig4KSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXZfc2F0YV9wbGF0Zm9ybV9kYXRhIGRiODhmNjI4MV9zYXRhX2RhdGEgPSB7CkBAIC00NCw3ICs0NCw2IEBACiAJa2lya3dvb2RfcnRjX2luaXQoKTsKIAlraXJrd29vZF9zYXRhX2luaXQoJmRiODhmNjI4MV9zYXRhX2RhdGEpOwogCWtpcmt3b29kX3VhcnQwX2luaXQoKTsKLQlraXJrd29vZF91YXJ0MV9pbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGRiODhmNjI4MV9wY2lfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDZmZDA1ODMuLmZmYWI4OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTUwLDYgKzUwLDcgQEAKICNkZWZpbmUgSVJRX0tJUktXT09EX0dQSU9fSElHSF8wXzcJMzkKICNkZWZpbmUgSVJRX0tJUktXT09EX0dQSU9fSElHSF84XzE1CTQwCiAjZGVmaW5lIElSUV9LSVJLV09PRF9HUElPX0hJR0hfMTZfMjMJNDEKKyNkZWZpbmUgSVJRX0tJUktXT09EX0dFMDBfRVJSCTQ2CiAKIC8qCiAgKiBLSVJLV09PRCBHZW5lcmFsIFB1cnBvc2UgUGlucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gva2lya3dvb2QuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2tpcmt3b29kLmgKaW5kZXggNWM2OTk5Mi4uZWFlNDI0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gva2lya3dvb2QuaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9raXJrd29vZC5oCkBAIC02OCw2ICs2OCwyMCBAQAogI2RlZmluZSAgIEwyX1dSSVRFVEhST1VHSAkweDAwMDAwMDEwCiAKIC8qCisgKiBTdXBwb3J0ZWQgZGV2aWNlcyBhbmQgcmV2aXNpb25zLgorICovCisjZGVmaW5lIE1WODhGNjI4MV9ERVZfSUQJMHg2MjgxCisjZGVmaW5lIE1WODhGNjI4MV9SRVZfWjAJMAorI2RlZmluZSBNVjg4RjYyODFfUkVWX0EwCTIKKworI2RlZmluZSBNVjg4RjYxOTJfREVWX0lECTB4NjE5MgorI2RlZmluZSBNVjg4RjYxOTJfUkVWX1owCTAKKyNkZWZpbmUgTVY4OEY2MTkyX1JFVl9BMAkyCisKKyNkZWZpbmUgTVY4OEY2MTgwX0RFVl9JRAkweDYxODAKKyNkZWZpbmUgTVY4OEY2MTgwX1JFVl9BMAkyCisKKy8qCiAgKiBSZWdpc3RlciBNYXAKICAqLwogI2RlZmluZSBERFJfVklSVF9CQVNFCQkoS0lSS1dPT0RfUkVHU19WSVJUX0JBU0UgfCAweDAwMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvdGltZXguaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL3RpbWV4LmgKaW5kZXggZjc3ZWY0YS4uYzkyM2NkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC04LDQgKzgsMyBAQAogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJKDEwMCAqIEhaKQogCi0jZGVmaW5lIEtJUktXT09EX1RDTEsJCTE2NjY2NjY2NwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYwppbmRleCAyMTk1ZmEzLi5mNmIwOGYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYwpAQCAtMTgsNiArMTgsMTIgQEAKIAogI2RlZmluZSBQQ0lFX0JBU0UJKCh2b2lkIF9faW9tZW0gKilQQ0lFX1ZJUlRfQkFTRSkKIAordm9pZCBfX2luaXQga2lya3dvb2RfcGNpZV9pZCh1MzIgKmRldiwgdTMyICpyZXYpCit7CisJKmRldiA9IG9yaW9uX3BjaWVfZGV2X2lkKFBDSUVfQkFTRSk7CisJKnJldiA9IG9yaW9uX3BjaWVfcmV2KFBDSUVfQkFTRSk7Cit9CisKIHN0YXRpYyBpbnQgcGNpZV92YWxpZF9jb25maWcoaW50IGJ1cywgaW50IGRldikKIHsKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjE5Mi1uYXMtc2V0dXAuYwppbmRleCBhMzAxMmQ0Li5iMWQxYTg3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNkZWZpbmUgUkQ4OEY2MTkyX0dQSU9fVVNCX1ZCVVMJCTEwCiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSByZDg4ZjYxOTJfZ2UwMF9kYXRhID0gewotCS5waHlfYWRkcgk9IDgsCisJLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX0FERFIoOCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG12X3NhdGFfcGxhdGZvcm1fZGF0YSByZDg4ZjYxOTJfc2F0YV9kYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MjgxLXNldHVwLmMKaW5kZXggZDk2NDg3YTAuLmY3ODUwOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MjgxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYwpAQCAtNjksNyArNjksNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIHJkODhmNjI4MV9nZTAwX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gLTEsCisJLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX05PTkUsCiAJLnNwZWVkCQk9IFNQRUVEXzEwMDAsCiAJLmR1cGxleAkJPSBEVVBMRVhfRlVMTCwKIH07CkBAIC05MCw3ICs5MCw2IEBACiAJa2lya3dvb2RfcnRjX2luaXQoKTsKIAlraXJrd29vZF9zYXRhX2luaXQoJnJkODhmNjI4MV9zYXRhX2RhdGEpOwogCWtpcmt3b29kX3VhcnQwX2luaXQoKTsKLQlraXJrd29vZF91YXJ0MV9pbml0KCk7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJkODhmNjI4MV9uYW5kX2ZsYXNoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvY3B1LmMKaW5kZXggYzZjMDhlOC4uN2YzZjI0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvY3B1LmMKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYwppbmRleCAzNjI0ZTY1Li45YWVjZjBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtNzIsNyArNzIsNyBAQAogCiAJLyogc2V0IHBpbiBhcyBpbnB1dCAqLwogCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQl4ICY9IH5JT1BNXyhwaW4pOworCXggJj0gfklPUE0ocGluKTsKIAlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0xMDgsNyArMTA4LDcgQEAKIAogCS8qIHNldCBwaW4gYXMgaW5wdXQgKi8KIAl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0JeCAmPSB+SU9QTV8ocGluKTsKKwl4ICY9IH5JT1BNKHBpbik7CiAJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMTM2LDE0ICsxMzYsMTQgQEAKIAkvKiBzZXQgbGluZSBzdGF0ZSAqLwogCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKIAlpZiAoc3RhdGUpCi0JCXggfD0gKDEgPDwgcGluKTsKKwkJeCB8PSBJT1BEKHBpbik7CiAJZWxzZQotCQl4ICY9IH4oMSA8PCBwaW4pOworCQl4ICY9IH5JT1BEKHBpbik7CiAJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwogCiAJLyogc2V0IHBpbiBhcyBvdXRwdXQgKi8KIAl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0JeCB8PSBJT1BNXyhwaW4pOworCXggfD0gSU9QTShwaW4pOwogCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTE2OCw5ICsxNjgsOSBAQAogCS8qIHNldCBvdXRwdXQgbGluZSBzdGF0ZSAqLwogCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKIAlpZiAoc3RhdGUpCi0JCXggfD0gKDEgPDwgcGluKTsKKwkJeCB8PSBJT1BEKHBpbik7CiAJZWxzZQotCQl4ICY9IH4oMSA8PCBwaW4pOworCQl4ICY9IH5JT1BEKHBpbik7CiAJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwotCXJldHVybiAoeCAmICgxIDw8IHBpbikpICE9IDA7CisJcmV0dXJuICh4ICYgSU9QRChwaW4pKSAhPSAwOwogfQogRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogCWZvciAoaSA9IEtTODY5NV9HUElPXzA7IGkgPD0gS1M4Njk1X0dQSU9fMTUgOyBpKyspIHsKIAkJc2VxX3ByaW50ZihzLCAiJWk6XHQiLCBpKTsKIAotCQlzZXFfcHJpbnRmKHMsICIlc1x0IiwgKG1vZGUgJiBJT1BNXyhpKSkgPyAiT3V0cHV0IiA6ICJJbnB1dCIpOworCQlzZXFfcHJpbnRmKHMsICIlc1x0IiwgKG1vZGUgJiBJT1BNKGkpKSA/ICJPdXRwdXQiIDogIklucHV0Iik7CiAKIAkJaWYgKGkgPD0gS1M4Njk1X0dQSU9fMykgewogCQkJaWYgKGN0cmwgJiBlbmFibGVbaV0pIHsKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiAJCXNlcV9wcmludGYocywgIlx0Iik7CiAKLQkJc2VxX3ByaW50ZihzLCAiJWlcbiIsIChkYXRhICYgSU9QRF8oaSkpID8gMSA6IDApOworCQlzZXFfcHJpbnRmKHMsICIlaVxuIiwgKGRhdGEgJiBJT1BEKGkpKSA/IDEgOiAwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggZGFkYmU2Ni4uOGZiYzRjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMzEsOCArMzEsOCBAQAogLyogUGxhdGZvcm0tYnVzIG1hcHBpbmcgKi8KIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGxhdGZvcm1fYnVzX3R5cGU7CiAjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJCShkZXYgJiYgZGV2LT5idXMgPT0gJnBsYXRmb3JtX2J1c190eXBlKQotI2RlZmluZSBfX2FyY2hfZG1hX3RvX3ZpcnQoZGV2LCB4KQkoeyBpc19sYnVzX2RldmljZShkZXYpID8gXAotCQkJCQlfX3BoeXNfdG9fdmlydCh4KSA6IF9fYnVzX3RvX3ZpcnQoeCk7IH0pCisjZGVmaW5lIF9fYXJjaF9kbWFfdG9fdmlydChkZXYsIHgpCSh7ICh2b2lkICopIChpc19sYnVzX2RldmljZShkZXYpID8gXAorCQkJCQlfX3BoeXNfdG9fdmlydCh4KSA6IF9fYnVzX3RvX3ZpcnQoeCkpOyB9KQogI2RlZmluZSBfX2FyY2hfdmlydF90b19kbWEoZGV2LCB4KQkoeyBpc19sYnVzX2RldmljZShkZXYpID8gXAogCQkJCQkoZG1hX2FkZHJfdClfX3ZpcnRfdG9fcGh5cyh4KSA6IChkbWFfYWRkcl90KV9fdmlydF90b19idXMoeCk7IH0pCiAjZGVmaW5lIF9fYXJjaF9wYWdlX3RvX2RtYShkZXYsIHgpCV9fYXJjaF92aXJ0X3RvX2RtYShkZXYsIHBhZ2VfYWRkcmVzcyh4KSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaCBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaAppbmRleCAwZGY2ZmU2Li45MDYxNGE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCkBAIC0yNCw3ICsyNCw3IEBACiAKIAogLyogUG9ydCBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIElPUE1fKHgpCQkoMSA8PCAoeCkpCS8qIE1vZGUgZm9yIEdQSU8gUGluIHggKi8KKyNkZWZpbmUgSU9QTSh4KQkJCSgxIDw8ICh4KSkJLyogTW9kZSBmb3IgR1BJTyBQaW4geCAqLwogCiAvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSU9QQ19JT1RJTTFFTgkJKDEgPDwgMTcpCS8qIEdQSU8gUGluIGZvciBUaW1lcjEgRW5hYmxlICovCkBAIC01MCw2ICs1MCw2IEBACiAjZGVmaW5lIElPUENfVE1fRURHRQkJKDYpCQkvKiBCb3RoIEVkZ2UgRGV0ZWN0aW9uICovCiAKIC8qIFBvcnQgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZSBJT1BEXyh4KQkJKDEgPDwgKHgpKQkvKiBTaWduYWwgTGV2ZWwgb2YgR1BJTyBQaW4geCAqLworI2RlZmluZSBJT1BEKHgpCQkJKDEgPDwgKHgpKQkvKiBTaWduYWwgTGV2ZWwgb2YgR1BJTyBQaW4geCAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9yZWdzLWxhbi5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3MtbGFuLmgKaW5kZXggOWVmNDA5OS4uODJjNWYzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3MtbGFuLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3MtbGFuLmgKQEAgLTI5LDggKzI5LDggQEAKICNkZWZpbmUgS1M4Njk1X0xSRExCCQkoMHgxNCkJCS8qIFJlY2VpdmUgRGVzY3JpcHRvciBMaXN0IEJhc2UgQWRkcmVzcyAqLwogI2RlZmluZSBLUzg2OTVfTE1BTAkJKDB4MTgpCQkvKiBNQUMgU3RhdGlvbiBBZGRyZXNzIExvdyAqLwogI2RlZmluZSBLUzg2OTVfTE1BSAkJKDB4MWMpCQkvKiBNQUMgU3RhdGlvbiBBZGRyZXNzIEhpZ2ggKi8KLSNkZWZpbmUgS1M4Njk1X0xNQUFMXyhuKQkoMHg4MCArICgobikqOCkpCS8qIE1BQyBBZGRpdGlvbmFsIFN0YXRpb24gQWRkcmVzcyAoMC4uMTUpIExvdyAqLwotI2RlZmluZSBLUzg2OTVfTE1BQUhfKG4pCSgweDg0ICsgKChuKSo4KSkJLyogTUFDIEFkZGl0aW9uYWwgU3RhdGlvbiBBZGRyZXNzICgwLi4xNSkgSGlnaCAqLworI2RlZmluZSBLUzg2OTVfTE1BQUwobikJCSgweDgwICsgKChuKSo4KSkJLyogTUFDIEFkZGl0aW9uYWwgU3RhdGlvbiBBZGRyZXNzICgwLi4xNSkgTG93ICovCisjZGVmaW5lIEtTODY5NV9MTUFBSChuKQkJKDB4ODQgKyAoKG4pKjgpKQkvKiBNQUMgQWRkaXRpb25hbCBTdGF0aW9uIEFkZHJlc3MgKDAuLjE1KSBIaWdoICovCiAKIAogLyogRE1BIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9yZWdzLXdhbi5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3Mtd2FuLmgKaW5kZXggZWI0OTRlYy4uYzQ3NWJlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3Mtd2FuLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3JlZ3Mtd2FuLmgKQEAgLTI5LDggKzI5LDggQEAKICNkZWZpbmUgS1M4Njk1X1dSRExCCQkoMHgxNCkJCS8qIFJlY2VpdmUgRGVzY3JpcHRvciBMaXN0IEJhc2UgQWRkcmVzcyAqLwogI2RlZmluZSBLUzg2OTVfV01BTAkJKDB4MTgpCQkvKiBNQUMgU3RhdGlvbiBBZGRyZXNzIExvdyAqLwogI2RlZmluZSBLUzg2OTVfV01BSAkJKDB4MWMpCQkvKiBNQUMgU3RhdGlvbiBBZGRyZXNzIEhpZ2ggKi8KLSNkZWZpbmUgS1M4Njk1X1dNQUFMXyhuKQkoMHg4MCArICgobikqOCkpCS8qIE1BQyBBZGRpdGlvbmFsIFN0YXRpb24gQWRkcmVzcyAoMC4uMTUpIExvdyAqLwotI2RlZmluZSBLUzg2OTVfV01BQUhfKG4pCSgweDg0ICsgKChuKSo4KSkJLyogTUFDIEFkZGl0aW9uYWwgU3RhdGlvbiBBZGRyZXNzICgwLi4xNSkgSGlnaCAqLworI2RlZmluZSBLUzg2OTVfV01BQUwobikJCSgweDgwICsgKChuKSo4KSkJLyogTUFDIEFkZGl0aW9uYWwgU3RhdGlvbiBBZGRyZXNzICgwLi4xNSkgTG93ICovCisjZGVmaW5lIEtTODY5NV9XTUFBSChuKQkJKDB4ODQgKyAoKG4pKjgpKQkvKiBNQUMgQWRkaXRpb25hbCBTdGF0aW9uIEFkZHJlc3MgKDAuLjE1KSBIaWdoICovCiAKIAogLyogRE1BIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCAyYTZmOTE4Li41YTliMDMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0xNCw3ICsxNCw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKICNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtdGltZXIuaD4KIAogc3RhdGljIHZvaWQgYXJjaF9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAppbmRleCAwZWVlMzdhLi45NDk1Y2I0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpZm5kZWYgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKICNkZWZpbmUgX19BU01fQVJDSF9VTkNPTVBSRVNTX0gKIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXVhcnQuaD4KIAogc3RhdGljIHZvaWQgcHV0YyhjaGFyIGMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pcnEuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2lycS5jCmluZGV4IGU1ZTcxZjQuLmUzNzVjMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2lycS5jCkBAIC0yNCwxMCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9wY2kuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCmluZGV4IDE3NDZjNjcuLmY1ZWJjYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L3BjaS5jCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkud3JpdGUJPSBrczg2OTVfcGNpX3dyaXRlY29uZmlnLAogfTsKIAotc3RhdGljIHN0cnVjdCBwY2lfYnVzICprczg2OTVfcGNpX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQorc3RhdGljIHN0cnVjdCBwY2lfYnVzKiBfX2luaXQga3M4Njk1X3BjaV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKIHsKIAlyZXR1cm4gcGNpX3NjYW5fYnVzKHN5cy0+YnVzbnIsICZrczg2OTVfcGNpX29wcywgc3lzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L3RpbWUuYwppbmRleCA5NDA4ODhkLi42OWMwNzJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvdGltZS5jCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLXRpbWVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCmluZGV4IDZmNGM2YTEuLjliZTc0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCkBAIC00MCwyMyArNDAsMjIgQEAKIAlib29sCiAKIGNvbmZpZyBMSDdBNDBYX0NPTlRJR01FTQotCWJvb2wgIkRpc2FibGUgTlVNQSBTdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9MSDdBNDBYCisJYm9vbCAiRGlzYWJsZSBOVU1BL1NwYXJzZU1FTSBTdXBwb3J0IgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91ciBib290bG9hZGVyIHNldHMgdGhlIFNST01MTCBiaXQocykgaW4KIAkgIHRoZSBTRFJBTSBjb250cm9sbGVyLCBvcmdhbml6aW5nIG1lbW9yeSBhcyBhIGNvbnRpZ3VvdXMKLQkgIGFycmF5LiAgVGhpcyBvcHRpb24gd2lsbCBkaXNhYmxlIENPTkZJR19ESVNDT05USUdNRU0gYW5kCi0gICAgICAgICAgZm9yY2UgdGhlIGtlcm5lbCB0byBtYW5hZ2UgYWxsIG1lbW9yeSBpbiBvbmUgbm9kZS4KKwkgIGFycmF5LiAgVGhpcyBvcHRpb24gd2lsbCBkaXNhYmxlIHNwYXJzZSBtZW1vcnkgc3VwcG9ydAorICAgICAgICAgIGFuZCBmb3JjZSB0aGUga2VybmVsIHRvIG1hbmFnZSBhbGwgbWVtb3J5IGluIG9uZSBub2RlLgogCi0JICBTZXR0aW5nIHRoaXMgb3B0aW9uIGluY29ycmVjdGx5IG1heSBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbQotCSAgYm9vdGluZy4gIEl0IGlzIE9LIHRvIGxlYXZlIGl0IE4uCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIGluY29ycmVjdGx5IG1heSBwcmV2ZW50IHRoZSBrZXJuZWwKKwkgIGZyb20gYm9vdGluZy4gIEl0IGlzIE9LIHRvIGxlYXZlIGl0IE4uCiAKIAkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjb25zdWx0CiAJICAgIDxmaWxlOkRvY3VtZW50YXRpb24vYXJtL1NoYXJwLUxIL1NEUkFNPi4KIAogY29uZmlnIExIN0E0MFhfT05FX0JBTktfUEVSX05PREUKIAlib29sICJPcHRpbWl6ZSBOVU1BIE5vZGUgVGFibGVzIGZvciBTaXplIgotCWRlcGVuZHMgb24gQVJDSF9MSDdBNDBYICYmICFMSDdBNDBYX0NPTlRJR01FTQorCWRlcGVuZHMgb24gIUxIN0E0MFhfQ09OVElHTUVNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBwcm9kdWNlIGNvbXBhY3QgbWVtb3J5IG5vZGUgdGFibGVzLiAgQnkKIAkgIGRlZmF1bHQgcGFpcnMgb2YgYWRqYWNlbnQgcGh5c2ljYWwgUkFNIGJhbmtzIGFyZSBtYW5hZ2VkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYwppbmRleCA1NTFiOTcyLi4zZDdiZDUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAlpcnEgPSBJUlFfS0VWN0E0MDBfQ1BMRDsKIAlmb3IgKDsgbWFzazsgbWFzayA+Pj0gMSwgKytpcnEpCiAJCWlmIChtYXNrICYgMSkKLQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiB9CiAKIHZvaWQgX19pbml0IGxoN2E0MHhfaW5pdF9ib2FyZF9pcnEgKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gtbHBkN2E0MHguYwppbmRleCBlMzczZmI4Li5jYjE1ZTVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMKQEAgLTIxNCwxMSArMjE0LDExIEBACiAJZGVzYy0+Y2hpcC0+YWNrIChpcnEpOwogCiAJaWYgKChtYXNrICYgKDE8PDApKSA9PSAwKQkvKiBXTEFOICovCi0JCUlSUV9ESVNQQVRDSCAoSVJRX0xQRDdBNDBYX0VUSF9JTlQpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0xQRDdBNDBYX0VUSF9JTlQpOwogCiAjaWYgZGVmaW5lZCAoSVJRX1RPVUNIKQogCWlmICgobWFzayAmICgxPDwxKSkgPT0gMCkJLyogVG91Y2ggKi8KLQkJSVJRX0RJU1BBVENIIChJUlFfVE9VQ0gpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX1RPVUNIKTsKICNlbmRpZgogCiAJZGVzYy0+Y2hpcC0+dW5tYXNrIChpcnEpOyAvKiBMZXZlbC10cmlnZ2VyZWQgbmVlZCB0aGlzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY29tbW9uLmgKaW5kZXggMGNhMjBjNi4uNmVkM2Y2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaApAQCAtMTUsNCArMTUsMyBAQAogZXh0ZXJuIHZvaWQgbGg3YTQweF9jbGNkX2luaXQgKHZvaWQpOwogZXh0ZXJuIHZvaWQgbGg3YTQweF9pbml0X2JvYXJkX2lycSAodm9pZCk7CiAKLSNkZWZpbmUgSVJRX0RJU1BBVENIKGlycSkgZGVzY19oYW5kbGVfaXJxKChpcnEpLChpcnFfZGVzYyArIGlycSkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBmNzEwN2I0Li4xZGExNGZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTczLDQgKzczLDEwIEBACiAKICNlbmRpZgogCisvKgorICogU3BhcnNlbWVtIHZlcnNpb24gb2YgdGhlIGFib3ZlCisgKi8KKyNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwkzMgorI2RlZmluZSBTRUNUSU9OX1NJWkVfQklUUwkyNAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYwppbmRleCAwZDUwNjNlYi4uZmQwMzNiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1scGQ3YTQweC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYwpAQCAtNjMsMTAgKzYzLDEwIEBACiAJZGVzYy0+Y2hpcC0+YWNrIChpcnEpOwogCiAJaWYgKChtYXNrICYgMHgxKSA9PSAwKQkvKiBXTEFOICovCi0JCUlSUV9ESVNQQVRDSCAoSVJRX0xQRDdBNDBYX0VUSF9JTlQpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0xQRDdBNDBYX0VUSF9JTlQpOwogCiAJaWYgKChtYXNrICYgMHgyKSA9PSAwKQkvKiBUb3VjaCAqLwotCQlJUlFfRElTUEFUQ0ggKElSUV9MUEQ3QTQwMF9UUyk7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfTFBEN0E0MDBfVFMpOwogCiAJZGVzYy0+Y2hpcC0+dW5tYXNrIChpcnEpOyAvKiBMZXZlbC10cmlnZ2VyZWQgbmVlZCB0aGlzICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvc3NwLWNwbGQuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9zc3AtY3BsZC5jCmluZGV4IDUxZmJlZjkuLjI5MDFkNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9zc3AtY3BsZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9zc3AtY3BsZC5jCkBAIC00Myw4ICs0Myw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC90aW1lLmMKaW5kZXggN2ZlOWUwNi4uNDYwMWU0MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYwpAQCAtMTMsOSArMTMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxva2kvYWRkci1tYXAuYyBiL2FyY2gvYXJtL21hY2gtbG9raS9hZGRyLW1hcC5jCmluZGV4IDcwY2E1NmIuLjAzMzJkOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbG9raS9hZGRyLW1hcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbG9raS9hZGRyLW1hcC5jCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJjb21tb24uaCIKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbG9raS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtbG9raS9pcnEuYwppbmRleCA1YTQ4NzkzLi5lMWY5NzMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxva2kvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1sb2tpL2lycS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KICNpbmNsdWRlICJjb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1sb2tpL2xiODhyYzg0ODAtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtbG9raS9sYjg4cmM4NDgwLXNldHVwLmMKaW5kZXggMmNjOWFjOS4uODVmOWMxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1sb2tpL2xiODhyYzg0ODAtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWxva2kvbGI4OHJjODQ4MC1zZXR1cC5jCkBAIC02Nyw3ICs2Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgbGI4OHJjODQ4MF9nZTBfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSAxLAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDEpLAogCS5tYWNfYWRkcgk9IHsgMHgwMCwgMHg1MCwgMHg0MywgMHgxMSwgMHgyMiwgMHgzMyB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtaGFsaWJ1dC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtaGFsaWJ1dC5jCmluZGV4IDk5NWFmYzRhLi5hMjQyNTkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1oYWxpYnV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtaGFsaWJ1dC5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0yOCw5ICszMCw2IEBACiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9jb21tb24uYwppbmRleCAzYTUxMTM2Li42MDRmOGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9jb21tb24uYwpAQCAtMTksOSArMTksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9kbWEuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2RtYS5jCmluZGV4IDlkZTA4MjYuLjBjOGYyNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2RtYS5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCmluZGV4IDU5NzYyMDAuLjc5OTllNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwpAQCAtMTgsOSArMTgsOSBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaXJxLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9pcnEuYwppbmRleCA2NjkwMWJhLi4wNGI4ZDE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pcnEuYwpAQCAtMTksMTEgKzE5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKaW5kZXggOWYwMmQ3ZC4uMmJmZmU5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCkBAIC0yMCwxMiArMjAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLQogI2RlZmluZSBNU01fREdUX0JBU0UgKE1TTV9HUFRfQkFTRSArIDB4MTApCiAjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDUpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9hZGRyLW1hcC5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2FkZHItbWFwLmMKaW5kZXggNDAwNGI2Ny4uMzExZDViMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2FkZHItbWFwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2FkZHItbWFwLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvY29tbW9uLmMKaW5kZXggOTUzYTI2Yy4uMjM4YTJmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9jb21tb24uYwpAQCAtMjg1LDYgKzI4NSwxMSBAQAogCQkuc3RhcnQJPSBHRTAwX1BIWVNfQkFTRSArIDB4MjAwMCwKIAkJLmVuZAk9IEdFMDBfUEhZU19CQVNFICsgMHgzZmZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5uYW1lCT0gImdlIGVyciBpcnEiLAorCQkuc3RhcnQJPSBJUlFfTVY3OFhYMF9HRV9FUlIsCisJCS5lbmQJPSBJUlFfTVY3OFhYMF9HRV9FUlIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwogCkBAIC0yOTQsNyArMjk5LDcgQEAKIAkuZGV2CQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSAmbXY3OHh4MF9nZTAwX3NoYXJlZF9kYXRhLAogCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjc4eHgwX2dlMDBfc2hhcmVkX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gbXY3OHh4MF9nZTAwX3NoYXJlZF9yZXNvdXJjZXMsCiB9OwogCkBAIC0zMzAsNiArMzM1LDcgQEAKIHN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcGxhdGZvcm1fZGF0YSBtdjc4eHgwX2dlMDFfc2hhcmVkX2RhdGEgPSB7CiAJLnRfY2xrCQk9IDAsCiAJLmRyYW0JCT0gJm12Nzh4eDBfbWJ1c19kcmFtX2luZm8sCisJLnNoYXJlZF9zbWkJPSAmbXY3OHh4MF9nZTAwX3NoYXJlZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXY3OHh4MF9nZTAxX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKQEAgLTM3MCw3ICszNzYsNiBAQAogdm9pZCBfX2luaXQgbXY3OHh4MF9nZTAxX2luaXQoc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKmV0aF9kYXRhKQogewogCWV0aF9kYXRhLT5zaGFyZWQgPSAmbXY3OHh4MF9nZTAxX3NoYXJlZDsKLQlldGhfZGF0YS0+c2hhcmVkX3NtaSA9ICZtdjc4eHgwX2dlMDBfc2hhcmVkOwogCW12Nzh4eDBfZ2UwMS5kZXYucGxhdGZvcm1fZGF0YSA9IGV0aF9kYXRhOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtdjc4eHgwX2dlMDFfc2hhcmVkKTsKQEAgLTM4NCw2ICszODksNyBAQAogc3RydWN0IG12NjQzeHhfZXRoX3NoYXJlZF9wbGF0Zm9ybV9kYXRhIG12Nzh4eDBfZ2UxMF9zaGFyZWRfZGF0YSA9IHsKIAkudF9jbGsJCT0gMCwKIAkuZHJhbQkJPSAmbXY3OHh4MF9tYnVzX2RyYW1faW5mbywKKwkuc2hhcmVkX3NtaQk9ICZtdjc4eHgwX2dlMDBfc2hhcmVkLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjc4eHgwX2dlMTBfc2hhcmVkX3Jlc291cmNlc1tdID0gewpAQCAtNDI0LDcgKzQzMCw2IEBACiB2b2lkIF9faW5pdCBtdjc4eHgwX2dlMTBfaW5pdChzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSAqZXRoX2RhdGEpCiB7CiAJZXRoX2RhdGEtPnNoYXJlZCA9ICZtdjc4eHgwX2dlMTBfc2hhcmVkOwotCWV0aF9kYXRhLT5zaGFyZWRfc21pID0gJm12Nzh4eDBfZ2UwMF9zaGFyZWQ7CiAJbXY3OHh4MF9nZTEwLmRldi5wbGF0Zm9ybV9kYXRhID0gZXRoX2RhdGE7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm12Nzh4eDBfZ2UxMF9zaGFyZWQpOwpAQCAtNDM4LDYgKzQ0Myw3IEBACiBzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3BsYXRmb3JtX2RhdGEgbXY3OHh4MF9nZTExX3NoYXJlZF9kYXRhID0gewogCS50X2NsawkJPSAwLAogCS5kcmFtCQk9ICZtdjc4eHgwX21idXNfZHJhbV9pbmZvLAorCS5zaGFyZWRfc21pCT0gJm12Nzh4eDBfZ2UwMF9zaGFyZWQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG12Nzh4eDBfZ2UxMV9zaGFyZWRfcmVzb3VyY2VzW10gPSB7CkBAIC00NzgsNyArNDg0LDYgQEAKIHZvaWQgX19pbml0IG12Nzh4eDBfZ2UxMV9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSkKIHsKIAlldGhfZGF0YS0+c2hhcmVkID0gJm12Nzh4eDBfZ2UxMV9zaGFyZWQ7Ci0JZXRoX2RhdGEtPnNoYXJlZF9zbWkgPSAmbXY3OHh4MF9nZTAwX3NoYXJlZDsKIAltdjc4eHgwX2dlMTEuZGV2LnBsYXRmb3JtX2RhdGEgPSBldGhfZGF0YTsKIAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXY3OHh4MF9nZTExX3NoYXJlZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvZGI3OHgwMC1icC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2RiNzh4MDAtYnAtc2V0dXAuYwppbmRleCBhMmQwYzk3Li40OWY0MzRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvZGI3OHgwMC1icC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9kYjc4eDAwLWJwLXNldHVwLmMKQEAgLTE5LDE5ICsxOSwxOSBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZGI3OHgwMF9nZTAwX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gOCwKKwkucGh5X2FkZHIJPSBNVjY0M1hYX0VUSF9QSFlfQUREUig4KSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBkYjc4eDAwX2dlMDFfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA5LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDkpLAogfTsKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGRiNzh4MDBfZ2UxMF9kYXRhID0gewotCS5waHlfYWRkcgk9IC0xLAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9OT05FLAogfTsKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGRiNzh4MDBfZ2UxMV9kYXRhID0gewotCS5waHlfYWRkcgk9IC0xLAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9OT05FLAogfTsKIAogc3RhdGljIHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgZGI3OHgwMF9zYXRhX2RhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggZWQ0YTQ2Yi4uZmJmYjI2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMjYsMTQgKzI2LDIyIEBACiAJbGRyCVx0bXAsIFtcYmFzZSwgI0lSUV9NQVNLX0xPV19PRkZdCiAJbW92CVxpcnFuciwgIzMxCiAJYW5kcwlcaXJxc3RhdCwgXGlycXN0YXQsIFx0bXAKKwlibmUJMTAwMWYKIAogCUAgaWYgbm8gbG93IGludGVycnVwdHMgc2V0LCBjaGVjayBoaWdoIGludGVycnVwdHMKLQlsZHJlcQlcaXJxc3RhdCwgW1xiYXNlLCAjSVJRX0NBVVNFX0hJR0hfT0ZGXQotCWxkcmVxCVx0bXAsIFtcYmFzZSwgI0lSUV9NQVNLX0hJR0hfT0ZGXQotCW1vdmVxCVxpcnFuciwgIzYzCi0JYW5kZXFzCVxpcnFzdGF0LCBcaXJxc3RhdCwgXHRtcAorCWxkcglcaXJxc3RhdCwgW1xiYXNlLCAjSVJRX0NBVVNFX0hJR0hfT0ZGXQorCWxkcglcdG1wLCBbXGJhc2UsICNJUlFfTUFTS19ISUdIX09GRl0KKwltb3YJXGlycW5yLCAjNjMKKwlhbmRzCVxpcnFzdGF0LCBcaXJxc3RhdCwgXHRtcAorCWJuZQkxMDAxZgorCisJQCBpZiBubyBoaWdoIGludGVycnVwdHMgc2V0LCBjaGVjayBlcnJvciBpbnRlcnJ1cHRzCisJbGRyCVxpcnFzdGF0LCBbXGJhc2UsICNJUlFfQ0FVU0VfRVJSX09GRl0KKwlsZHIJXHRtcCwgW1xiYXNlLCAjSVJRX01BU0tfRVJSX09GRl0KKwltb3YJXGlycW5yLCAjOTUKKwlhbmRzCVxpcnFzdGF0LCBcaXJxc3RhdCwgXHRtcAogCiAJQCBmaW5kIGZpcnN0IGFjdGl2ZSBpbnRlcnJ1cHQgc291cmNlCi0JY2x6bmUJXGlycXN0YXQsIFxpcnFzdGF0CisxMDAxOgljbHpuZQlcaXJxc3RhdCwgXGlycXN0YXQKIAlzdWJuZQlcaXJxbnIsIFxpcnFuciwgXGlycXN0YXQKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA5OTVkN2ZiLi5iZWJjMzMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtODAsOSArODAsMTQgQEAKICNkZWZpbmUgSVJRX01WNzhYWDBfREJfT1VUCTYxCiAKIC8qCisgKiBNVjc4eHgwIEVycm9yIEludGVycnVwdCBDb250cm9sbGVyCisgKi8KKyNkZWZpbmUgSVJRX01WNzhYWDBfR0VfRVJSCTcwCisKKy8qCiAgKiBNVjc4WFgwIEdlbmVyYWwgUHVycG9zZSBQaW5zCiAgKi8KLSNkZWZpbmUgSVJRX01WNzhYWDBfR1BJT19TVEFSVAk2NAorI2RlZmluZSBJUlFfTVY3OFhYMF9HUElPX1NUQVJUCTk2CiAjZGVmaW5lIE5SX0dQSU9fSVJRUwkJR1BJT19NQVgKIAogI2RlZmluZSBOUl9JUlFTCQkJKElSUV9NVjc4WFgwX0dQSU9fU1RBUlQgKyBOUl9HUElPX0lSUVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL212Nzh4eDAuaCBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCmluZGV4IGFkNjY0MTcuLmVlOWM1NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbXY3OHh4MC5oCkBAIC03MSw4ICs3MSwxMCBAQAogI2RlZmluZSAgIEJSSURHRV9JTlRfVElNRVIxCTB4MDAwNAogI2RlZmluZSAgIEJSSURHRV9JTlRfVElNRVIxX0NMUgkofjB4MDAwNCkKICNkZWZpbmUgIElSUV9WSVJUX0JBU0UJCShCUklER0VfVklSVF9CQVNFIHwgMHgwMjAwKQorI2RlZmluZSAgIElSUV9DQVVTRV9FUlJfT0ZGCTB4MDAwMAogI2RlZmluZSAgIElSUV9DQVVTRV9MT1dfT0ZGCTB4MDAwNAogI2RlZmluZSAgIElSUV9DQVVTRV9ISUdIX09GRgkweDAwMDgKKyNkZWZpbmUgICBJUlFfTUFTS19FUlJfT0ZGCTB4MDAwYwogI2RlZmluZSAgIElSUV9NQVNLX0xPV19PRkYJMHgwMDEwCiAjZGVmaW5lICAgSVJRX01BU0tfSElHSF9PRkYJMHgwMDE0CiAjZGVmaW5lICBUSU1FUl9WSVJUX0JBU0UJKEJSSURHRV9WSVJUX0JBU0UgfCAweDAzMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMKaW5kZXggMjgyNDhkMy4uNTAzZTVkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pcnEuYwpAQCAtMTksNCArMTksNSBAQAogewogCW9yaW9uX2lycV9pbml0KDAsICh2b2lkIF9faW9tZW0gKikoSVJRX1ZJUlRfQkFTRSArIElSUV9NQVNLX0xPV19PRkYpKTsKIAlvcmlvbl9pcnFfaW5pdCgzMiwgKHZvaWQgX19pb21lbSAqKShJUlFfVklSVF9CQVNFICsgSVJRX01BU0tfSElHSF9PRkYpKTsKKwlvcmlvbl9pcnFfaW5pdCg2NCwgKHZvaWQgX19pb21lbSAqKShJUlFfVklSVF9CQVNFICsgSVJRX01BU0tfRVJSX09GRikpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2E0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmgKQEAgLTAsMCArMSwxNSBAQAorCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0MTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2dwdDM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfZ3B0NDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19ncHQ1OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3dkdDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19pcmRhX2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvbXgyN2Fkcy5jIGIvYXJjaC9hcm0vbWFjaC1teDIvbXgyN2Fkcy5jCmluZGV4IDRjZTU2ZWYuLjU2ZTIyZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgyL214MjdhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9teDI3YWRzLmMKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14MS1teDIuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLW14MjdhZHMuaD4KIAorI2luY2x1ZGUgImRldmljZXMuaCIKKwogLyogQURTJ3MgTk9SIGZsYXNoICovCiBzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBteDI3YWRzX2ZsYXNoX2RhdGEgPSB7CiAJLndpZHRoID0gMiwKQEAgLTI1MSwxMiArMjUzLDE0IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDI3YWRzX2JvYXJkX2luaXQodm9pZCkKIHsKLQlpbnQgaTsKLQogCWdwaW9fZmVjX2FjdGl2ZSgpOwogCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJaW14X2luaXRfdWFydChpLCAmdWFydF9wZGF0YVtpXSk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGFbMF0pOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhWzFdKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YVsyXSk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMywgJnVhcnRfcGRhdGFbM10pOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTQsICZ1YXJ0X3BkYXRhWzRdKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2U1LCAmdWFydF9wZGF0YVs1XSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL3BjbTAzOC5jIGIvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKaW5kZXggMTAyOGY0NS4uN2Y1NTc0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDIvcGNtMDM4LmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1wY20wMzguaD4KIAorI2luY2x1ZGUgImRldmljZXMuaCIKKwogLyoKICAqIFBoeXRlYydzIHBoeUNPUkUtaS5NWDI3IGNvbWVzIHdpdGggMzJNaUIgZmxhc2gsCiAgKiAxNiBiaXQgd2lkdGgKQEAgLTE3MCwxMSArMTcyLDExIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdCh2b2lkKQogewotCWludCBpOwogCWdwaW9fZmVjX2FjdGl2ZSgpOwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJaW14X2luaXRfdWFydChpLCAmdWFydF9wZGF0YVtpXSk7CisJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VhcnRfZGV2aWNlMCwgJnVhcnRfcGRhdGFbMF0pOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTEsICZ1YXJ0X3BkYXRhWzFdKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UyLCAmdWFydF9wZGF0YVsyXSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDIvc2VyaWFsLmMgYi9hcmNoL2FybS9tYWNoLW14Mi9zZXJpYWwuYwppbmRleCBlMzFmZDQ0Li4xNmRlYmMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW14Mi9zZXJpYWwuYwpAQCAtMzUsNyArMzUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UwID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UwID0gewogCS5uYW1lID0gImlteC11YXJ0IiwKIAkuaWQgPSAwLAogCS5yZXNvdXJjZSA9IHVhcnQwLApAQCAtNTQsNyArNTQsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UxID0gewogCS5uYW1lID0gImlteC11YXJ0IiwKIAkuaWQgPSAxLAogCS5yZXNvdXJjZSA9IHVhcnQxLApAQCAtNzMsNyArNzMsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UyID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UyID0gewogCS5uYW1lID0gImlteC11YXJ0IiwKIAkuaWQgPSAyLAogCS5yZXNvdXJjZSA9IHVhcnQyLApAQCAtOTIsNyArOTIsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzID0gewogCS5uYW1lID0gImlteC11YXJ0IiwKIAkuaWQgPSAzLAogCS5yZXNvdXJjZSA9IHVhcnQzLApAQCAtMTExLDcgKzExMSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTQgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTQgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDQsCiAJLnJlc291cmNlID0gdWFydDQsCkBAIC0xMzAsNDggKzEzMCw5IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTUgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTUgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDUsCiAJLnJlc291cmNlID0gdWFydDUsCiAJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVhcnQ1KSwKIH07Ci0KLS8qCi0gKiBSZWdpc3RlciBvbmx5IHRob3NlIFVBUlRzIHRoYXQgcGh5c2ljYWxseSBleGlzdHMKLSAqLwotaW50IF9faW5pdCBpbXhfaW5pdF91YXJ0KGludCB1YXJ0X25vLCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsKLQlzd2l0Y2ggKHVhcnRfbm8pIHsKLQljYXNlIDA6Ci0JCW14Y191YXJ0X2RldmljZTAuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteGNfdWFydF9kZXZpY2UwKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlteGNfdWFydF9kZXZpY2UxLmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXhjX3VhcnRfZGV2aWNlMSk7Ci0JCWJyZWFrOwotI2lmbmRlZiBDT05GSUdfTVhDX0lSREEKLQljYXNlIDI6Ci0JCW14Y191YXJ0X2RldmljZTIuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteGNfdWFydF9kZXZpY2UyKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIDM6Ci0JCW14Y191YXJ0X2RldmljZTMuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteGNfdWFydF9kZXZpY2UzKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlteGNfdWFydF9kZXZpY2U0LmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXhjX3VhcnRfZGV2aWNlNCk7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJbXhjX3VhcnRfZGV2aWNlNS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm14Y191YXJ0X2RldmljZTUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYwppbmRleCBlMDhjNmE4Li5hNmJkY2MwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCkBAIC0zNiw3ICszNiw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTAgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTAgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDAsCiAJLnJlc291cmNlID0gdWFydDAsCkBAIC01NSw3ICs1NSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTEgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTEgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDEsCiAJLnJlc291cmNlID0gdWFydDEsCkBAIC03NCw3ICs3NCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTIgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTIgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDIsCiAJLnJlc291cmNlID0gdWFydDIsCkBAIC05Myw3ICs5Myw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTMgPSB7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTMgPSB7CiAJLm5hbWUgPSAiaW14LXVhcnQiLAogCS5pZCA9IDMsCiAJLnJlc291cmNlID0gdWFydDMsCkBAIC0xMTIsNDYgKzExMiwxMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0ID0geworc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2U0ID0gewogCS5uYW1lID0gImlteC11YXJ0IiwKIAkuaWQgPSA0LAogCS5yZXNvdXJjZSA9IHVhcnQ0LAogCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh1YXJ0NCksCiB9OwogCi0vKgotICogUmVnaXN0ZXIgb25seSB0aG9zZSBVQVJUcyB0aGF0IHBoeXNpY2FsbHkgZXhpc3QKLSAqLwotaW50IF9faW5pdCBpbXhfaW5pdF91YXJ0KGludCB1YXJ0X25vLCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsKLQlzd2l0Y2ggKHVhcnRfbm8pIHsKLQljYXNlIDA6Ci0JCW14Y191YXJ0X2RldmljZTAuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteGNfdWFydF9kZXZpY2UwKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlteGNfdWFydF9kZXZpY2UxLmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXhjX3VhcnRfZGV2aWNlMSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbXhjX3VhcnRfZGV2aWNlMi5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm14Y191YXJ0X2RldmljZTIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW14Y191YXJ0X2RldmljZTMuZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZteGNfdWFydF9kZXZpY2UzKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlteGNfdWFydF9kZXZpY2U0LmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbXhjX3VhcnRfZGV2aWNlNCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKiBHUElPIHBvcnQgZGVzY3JpcHRpb24gKi8KIHN0YXRpYyBzdHJ1Y3QgbXhjX2dwaW9fcG9ydCBpbXhfZ3Bpb19wb3J0c1tdID0gewogCVswXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGMwM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5oCkBAIC0wLDAgKzEsNiBAQAorCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191YXJ0X2RldmljZTI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdWFydF9kZXZpY2UzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VhcnRfZGV2aWNlNDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2lvbXV4LmMgYi9hcmNoL2FybS9tYWNoLW14My9pb211eC5jCmluZGV4IDNkZGExZmUuLjZlNjY0YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2lvbXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvaW9tdXguYwpAQCAtNDMsNyArNDMsOCBAQAogICovCiBpbnQgbXhjX2lvbXV4X21vZGUodW5zaWduZWQgaW50IHBpbl9tb2RlKQogewotCXUzMiByZWcsIGZpZWxkLCBsLCBtb2RlLCByZXQgPSAwOworCXUzMiBmaWVsZCwgbCwgbW9kZSwgcmV0ID0gMDsKKwl2b2lkIF9faW9tZW0gKnJlZzsKIAogCXJlZyA9IElPTVVYU1dfTVVYX0NUTCArIChwaW5fbW9kZSAmIElPTVVYX1JFR19NQVNLKTsKIAlmaWVsZCA9IHBpbl9tb2RlICYgMHgzOwpAQCAtNzAsNyArNzEsOCBAQAogICovCiB2b2lkIG14Y19pb211eF9zZXRfcGFkKGVudW0gaW9tdXhfcGlucyBwaW4sIHUzMiBjb25maWcpCiB7Ci0JdTMyIHJlZywgZmllbGQsIGw7CisJdTMyIGZpZWxkLCBsOworCXZvaWQgX19pb21lbSAqcmVnOwogCiAJcmVnID0gSU9NVVhTV19QQURfQ1RMICsgKHBpbiArIDIpIC8gMzsKIAlmaWVsZCA9IChwaW4gKyAyKSAlIDM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tbS5jIGIvYXJjaC9hcm0vbWFjaC1teDMvbW0uYwppbmRleCAzMGQ4NDJiLi4wNTg5YjVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21tLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkJLnZpcnR1YWwJPSBBVklDX0JBU0VfQUREUl9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVZJQ19CQVNFX0FERFIpLAogCQkubGVuZ3RoCQk9IEFWSUNfU0laRSwKLQkJLnR5cGUJCT0gTVRfTk9OU0hBUkVEX0RFVklDRQorCQkudHlwZQkJPSBNVF9ERVZJQ0VfTk9OU0hBUkVECiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFhZHMuYyBiL2FyY2gvYXJtL21hY2gtbXgzL214MzFhZHMuYwppbmRleCA2MGZiNGUwLi4xYmU0YTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9teDMxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWFkcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTMxLDYgKzMyLDggQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQtbXgzMWFkcy5oPgorI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogCiAvKiEKICAqIEBmaWxlIG14MzFhZHMuYwpAQCAtODQsNiArODcsMTA4IEBACiB9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVgpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9JTVhfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydF9wZGF0YSA9IHsKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCit7CisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fQ1RTMV9fQ1RTMSk7CisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fUlRTMV9fUlRTMSk7CisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fVFhEMV9fVFhEMSk7CisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fUlhEMV9fUlhEMSk7CisKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YSk7Cit9CisjZWxzZSAvKiAhU0VSSUFMX0lNWCAqLworc3RhdGljIGlubGluZSB2b2lkIG14Y19pbml0X2lteF91YXJ0KHZvaWQpCit7Cit9CisjZW5kaWYgLyogIVNFUklBTF9JTVggKi8KKworc3RhdGljIHZvaWQgbXgzMWFkc19leHBpb19pcnFfaGFuZGxlcih1MzIgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdTMyIGltcl92YWw7CisJdTMyIGludF92YWxpZDsKKwl1MzIgZXhwaW9faXJxOworCisJaW1yX3ZhbCA9IF9fcmF3X3JlYWR3KFBCQ19JTlRNQVNLX1NFVF9SRUcpOworCWludF92YWxpZCA9IF9fcmF3X3JlYWR3KFBCQ19JTlRTVEFUVVNfUkVHKSAmIGltcl92YWw7CisKKwlleHBpb19pcnEgPSBNWENfRVhQX0lPX0JBU0U7CisJZm9yICg7IGludF92YWxpZCAhPSAwOyBpbnRfdmFsaWQgPj49IDEsIGV4cGlvX2lycSsrKSB7CisJCWlmICgoaW50X3ZhbGlkICYgMSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWdlbmVyaWNfaGFuZGxlX2lycShleHBpb19pcnEpOworCX0KK30KKworLyoKKyAqIERpc2FibGUgYW4gZXhwaW8gcGluJ3MgaW50ZXJydXB0IGJ5IHNldHRpbmcgdGhlIGJpdCBpbiB0aGUgaW1yLgorICogQHBhcmFtIGlycSAgICAgICAgICAgYW4gZXhwaW8gdmlydHVhbCBpcnEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIGV4cGlvX21hc2tfaXJxKHUzMiBpcnEpCit7CisJdTMyIGV4cGlvID0gTVhDX0lSUV9UT19FWFBJTyhpcnEpOworCS8qIG1hc2sgdGhlIGludGVycnVwdCAqLworCV9fcmF3X3dyaXRldygxIDw8IGV4cGlvLCBQQkNfSU5UTUFTS19DTEVBUl9SRUcpOworCV9fcmF3X3JlYWR3KFBCQ19JTlRNQVNLX0NMRUFSX1JFRyk7Cit9CisKKy8qCisgKiBBY2tub3dsZWRnZSBhbiBleHBhbmRlZCBpbyBwaW4ncyBpbnRlcnJ1cHQgYnkgY2xlYXJpbmcgdGhlIGJpdCBpbiB0aGUgaXNyLgorICogQHBhcmFtIGlycSAgICAgICAgICAgYW4gZXhwYW5kZWQgaW8gdmlydHVhbCBpcnEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIGV4cGlvX2Fja19pcnEodTMyIGlycSkKK3sKKwl1MzIgZXhwaW8gPSBNWENfSVJRX1RPX0VYUElPKGlycSk7CisJLyogY2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgKi8KKwlfX3Jhd193cml0ZXcoMSA8PCBleHBpbywgUEJDX0lOVFNUQVRVU19SRUcpOworfQorCisvKgorICogRW5hYmxlIGEgZXhwaW8gcGluJ3MgaW50ZXJydXB0IGJ5IGNsZWFyaW5nIHRoZSBiaXQgaW4gdGhlIGltci4KKyAqIEBwYXJhbSBpcnEgICAgICAgICAgIGEgZXhwaW8gdmlydHVhbCBpcnEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIGV4cGlvX3VubWFza19pcnEodTMyIGlycSkKK3sKKwl1MzIgZXhwaW8gPSBNWENfSVJRX1RPX0VYUElPKGlycSk7CisJLyogdW5tYXNrIHRoZSBpbnRlcnJ1cHQgKi8KKwlfX3Jhd193cml0ZXcoMSA8PCBleHBpbywgUEJDX0lOVE1BU0tfU0VUX1JFRyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZXhwaW9faXJxX2NoaXAgPSB7CisJLmFjayA9IGV4cGlvX2Fja19pcnEsCisJLm1hc2sgPSBleHBpb19tYXNrX2lycSwKKwkudW5tYXNrID0gZXhwaW9fdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBteDMxYWRzX2luaXRfZXhwaW8odm9pZCkKK3sKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gIk1YMzFBRFMgRVhQSU8oQ1BMRCkgaGFyZHdhcmVcbiIpOworCisJLyoKKwkgKiBDb25maWd1cmUgSU5UIGxpbmUgYXMgR1BJTyBpbnB1dAorCSAqLworCW14Y19pb211eF9tb2RlKElPTVVYX01PREUoTVgzMV9QSU5fR1BJTzFfNCwgSU9NVVhfQ09ORklHX0dQSU8pKTsKKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyAqLworCV9fcmF3X3dyaXRldygweEZGRkYsIFBCQ19JTlRNQVNLX0NMRUFSX1JFRyk7CisJX19yYXdfd3JpdGV3KDB4RkZGRiwgUEJDX0lOVFNUQVRVU19SRUcpOworCWZvciAoaSA9IE1YQ19FWFBfSU9fQkFTRTsgaSA8IChNWENfRVhQX0lPX0JBU0UgKyBNWENfTUFYX0VYUF9JT19MSU5FUyk7CisJICAgICBpKyspIHsKKwkJc2V0X2lycV9jaGlwKGksICZleHBpb19pcnFfY2hpcCk7CisJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKKwl9CisJc2V0X2lycV90eXBlKEVYUElPX1BBUkVOVF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKEVYUElPX1BBUkVOVF9JTlQsIG14MzFhZHNfZXhwaW9faXJxX2hhbmRsZXIpOworfQorCiAvKiEKICAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RhdGljIG1hcHBpbmdzIGZvciB0aGUgaS5NWDMxQURTIGJvYXJkLgogICovCkBAIC05MiwxNyArMTk3LDE3IEBACiAJCS52aXJ0dWFsCT0gQUlQUzFfQkFTRV9BRERSX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBSVBTMV9CQVNFX0FERFIpLAogCQkubGVuZ3RoCQk9IEFJUFMxX1NJWkUsCi0JCS50eXBlCQk9IE1UX05PTlNIQVJFRF9ERVZJQ0UKKwkJLnR5cGUJCT0gTVRfREVWSUNFX05PTlNIQVJFRAogCX0sIHsKIAkJLnZpcnR1YWwJPSBTUEJBMF9CQVNFX0FERFJfVklSVCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFNQQkEwX0JBU0VfQUREUiksCiAJCS5sZW5ndGgJCT0gU1BCQTBfU0laRSwKLQkJLnR5cGUJCT0gTVRfTk9OU0hBUkVEX0RFVklDRQorCQkudHlwZQkJPSBNVF9ERVZJQ0VfTk9OU0hBUkVECiAJfSwgewogCQkudmlydHVhbAk9IEFJUFMyX0JBU0VfQUREUl9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQUlQUzJfQkFTRV9BRERSKSwKIAkJLmxlbmd0aAkJPSBBSVBTMl9TSVpFLAotCQkudHlwZQkJPSBNVF9OT05TSEFSRURfREVWSUNFCisJCS50eXBlCQk9IE1UX0RFVklDRV9OT05TSEFSRUQKIAl9LCB7CiAJCS52aXJ0dWFsCT0gQ1M0X0JBU0VfQUREUl9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQ1M0X0JBU0VfQUREUiksCkBAIC0xMjAsMTIgKzIyNSwxOSBAQAogCWlvdGFibGVfaW5pdChteDMxYWRzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgzMWFkc19pb19kZXNjKSk7CiB9CiAKK3ZvaWQgX19pbml0IG14MzFhZHNfaW5pdF9pcnEodm9pZCkKK3sKKwlteGNfaW5pdF9pcnEoKTsKKwlteDMxYWRzX2luaXRfZXhwaW8oKTsKK30KKwogLyohCiAgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IG14Y19ib2FyZF9pbml0KHZvaWQpCiB7CiAJbXhjX2luaXRfZXh0dWFydCgpOworCW14Y19pbml0X2lteF91YXJ0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDMxYWRzX3RpbWVyX2luaXQodm9pZCkKQEAgLTE0OCw3ICsyNjAsNyBAQAogCS5pb19wZ19vZmZzdAk9ICgoQUlQUzFfQkFTRV9BRERSX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKIAkuYm9vdF9wYXJhbXMgICAgPSBQSFlTX09GRlNFVCArIDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IG14MzFhZHNfbWFwX2lvLAotCS5pbml0X2lycSAgICAgICA9IG14Y19pbml0X2lycSwKKwkuaW5pdF9pcnEgICAgICAgPSBteDMxYWRzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUgICA9IG14Y19ib2FyZF9pbml0LAogCS50aW1lciAgICAgICAgICA9ICZteDMxYWRzX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFsaXRlLmMgYi9hcmNoL2FybS9tYWNoLW14My9teDMxbGl0ZS5jCmluZGV4IGQzNjNhNmUuLmM0MzQ0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL214MzFsaXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbXgzMWxpdGUuYwpAQCAtNDUsMTcgKzQ1LDE3IEBACiAJCS52aXJ0dWFsID0gQUlQUzFfQkFTRV9BRERSX1ZJUlQsCiAJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKEFJUFMxX0JBU0VfQUREUiksCiAJCS5sZW5ndGggPSBBSVBTMV9TSVpFLAotCQkudHlwZSA9IE1UX05PTlNIQVJFRF9ERVZJQ0UKKwkJLnR5cGUgPSBNVF9ERVZJQ0VfTk9OU0hBUkVECiAJfSwgewogCQkudmlydHVhbCA9IFNQQkEwX0JBU0VfQUREUl9WSVJULAogCQkucGZuID0gX19waHlzX3RvX3BmbihTUEJBMF9CQVNFX0FERFIpLAogCQkubGVuZ3RoID0gU1BCQTBfU0laRSwKLQkJLnR5cGUgPSBNVF9OT05TSEFSRURfREVWSUNFCisJCS50eXBlID0gTVRfREVWSUNFX05PTlNIQVJFRAogCX0sIHsKIAkJLnZpcnR1YWwgPSBBSVBTMl9CQVNFX0FERFJfVklSVCwKIAkJLnBmbiA9IF9fcGh5c190b19wZm4oQUlQUzJfQkFTRV9BRERSKSwKIAkJLmxlbmd0aCA9IEFJUFMyX1NJWkUsCi0JCS50eXBlID0gTVRfTk9OU0hBUkVEX0RFVklDRQorCQkudHlwZSA9IE1UX0RFVklDRV9OT05TSEFSRUQKIAl9LCB7CiAJCS52aXJ0dWFsID0gQ1M0X0JBU0VfQUREUl9WSVJULAogCQkucGZuID0gX19waHlzX3RvX3BmbihDUzRfQkFTRV9BRERSKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL3BjbTAzNy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvcGNtMDM3LmMKaW5kZXggMGExNTJlZC4uMTFmZGE5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvcGNtMDM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvcGNtMDM3LmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQtcGNtMDM3Lmg+CiAKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKIHN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBjbTAzN19mbGFzaF9kYXRhID0gewogCS53aWR0aCAgPSAyLAogfTsKQEAgLTU0LDcgKzU2LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgPSB7Ci0JLmZsYWdzID0gMCwKKwkuZmxhZ3MgPSBJTVhVQVJUX0hBVkVfUlRTQ1RTLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewpAQCAtNzMsMTIgKzc1LDEyIEBACiAJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fVFhEMV9fVFhEMSk7CiAJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fUlhEMV9fUlhEMSk7CiAKLQlpbXhfaW5pdF91YXJ0KDAsICZ1YXJ0X3BkYXRhKTsKKwlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdWFydF9kZXZpY2UwLCAmdWFydF9wZGF0YSk7CiAKIAlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9DU1BJM19NT1NJX19SWEQzKTsKIAlteGNfaW9tdXhfbW9kZShNWDMxX1BJTl9DU1BJM19NSVNPX19UWEQzKTsKIAotCWlteF9pbml0X3VhcnQoMiwgJnVhcnRfcGRhdGEpOworCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191YXJ0X2RldmljZTIsICZ1YXJ0X3BkYXRhKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvZ2VuZXJpYy5jCmluZGV4IDFiNDA0ODMuLjc5ZGY2MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2dlbmVyaWMuYwpAQCAtMjIsMTAgKzIyLDEwIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3ZpYy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvbmV0eC1yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKQEAgLTc3LDE1ICs3NywxMiBAQAogCXN0YXQgPSAoKHJlYWRsKE5FVFhfRFBNQVNfSU5UX0VOKSAmCiAJCXJlYWRsKE5FVFhfRFBNQVNfSU5UX1NUQVQpKSA+PiAyNCkgJiAweDFmOwogCi0JZGVzYyA9IGlycV9kZXNjICsgTkVUWF9JUlFfSElGX0NIQUlORUQoMCk7Ci0KIAl3aGlsZSAoc3RhdCkgewogCQlpZiAoc3RhdCAmIDEpIHsKIAkJCURFQlVHX0lSUSgiaGFuZGxpbmcgaXJxICVkXG4iLCBpcnEpOwotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCQlpcnErKzsKLQkJZGVzYysrOwogCQlzdGF0ID4+PSAxOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDI3ZDhlZjguLjZjMTAyM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMTksNyArMTksNyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgIm5ldHgtcmVncy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvcGZpZm8uYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9wZmlmby5jCmluZGV4IDE5YWUwYTcuLjAzOTg0OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9wZmlmby5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC9wZmlmby5jCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL25ldHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcGZpZm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCmluZGV4IGFjOGU1YmYuLjdjNTQwYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwpAQCAtMjEsOSArMjEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bWFjaC9uZXR4LXJlZ3MuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwppbmRleCAwNGMzNGU4Li4zMmVhYmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgveGMuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwpAQCAtMjEsOCArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbmV0eC1yZWdzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2JvYXJkLWE5bTk3NTBkZXYuYyBiL2FyY2gvYXJtL21hY2gtbnM5eHh4L2JvYXJkLWE5bTk3NTBkZXYuYwppbmRleCBhMjJhNjA4Li5iNDViYjNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5zOXh4eC9ib2FyZC1hOW05NzUwZGV2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvYm9hcmQtYTltOTc1MGRldi5jCkBAIC04NiwxMyArODYsMTAgQEAKIAogCXdoaWxlIChzdGF0ICE9IDApIHsKIAkJaW50IGlycW5vID0gZmxzKHN0YXQpIC0gMTsKLQkJc3RydWN0IGlycV9kZXNjICpmcGdhZGVzYzsKIAogCQlzdGF0ICY9IH4oMSA8PCBpcnFubyk7CiAKLQkJZnBnYWRlc2MgPSBpcnFfZGVzYyArIEZQR0FfSVJRKGlycW5vKTsKLQotCQlkZXNjX2hhbmRsZV9pcnEoRlBHQV9JUlEoaXJxbm8pLCBmcGdhZGVzYyk7CisJCWdlbmVyaWNfaGFuZGxlX2lycShGUEdBX0lSUShpcnFubykpOwogCX0KIAogCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvZ3Bpby5jCmluZGV4IDgwNGMzMDAuLjUyNDFlNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW5zOXh4eC9ncGlvLmMKQEAgLTEyLDEzICsxMiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxtYWNoL3Byb2Nlc3Nvci1uczkzNjAuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogCiAjaW5jbHVkZSAiZ3Bpby1uczkzNjAuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtbnM5eHh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggNWRiYzNjNS4uMWIxMmQzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9tYWNoLW5zOXh4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjZGVmaW5lIF9fUkVHKHgpCSgodm9pZCBfX2lvbWVtIF9fZm9yY2UgKikoeCkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnM5eHh4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvaXJxLmMKaW5kZXggMzgyNjBkNS4uMjJlMGViNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uczl4eHgvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uczl4eHgvaXJxLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3lzLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IDJjZWQ2ZDkuLmFkZmNkN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKQEAgLTQ3Niw2ICs0NzYsMTAgQEAKIAkJSTJDX0JPQVJEX0lORk8oInRwczY1MDEzIiwgMHg0OCksCiAgICAgICAgICAgICAgICAvKiAuaXJxICAgICAgICAgPSBPTUFQX0dQSU9fSVJRKD8/KSwgKi8KICAgICAgICB9LAorCXsKKwkJSTJDX0JPQVJEX0lORk8oImlzcDEzMDFfb21hcCIsIDB4MmQpLAorCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTQpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfZ3Bpb19zd2l0Y2ggaDNfZ3Bpb19zd2l0Y2hlc1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCAyMTNiNDg3Li40NWEwMTMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5jCmluZGV4IDU5NjVjZjAuLjVmYmEyMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmMKQEAgLTE3LDggKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KQEAgLTIwMSw3ICsyMDEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBhcmVudCA9IGNsay0+cGFyZW50OwotCWlmICh1bmxpa2VseShwYXJlbnQgPT0gMCkpCisJaWYgKHVubGlrZWx5KHBhcmVudCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZWFscmF0ZSA9IHBhcmVudC0+cmF0ZTsKQEAgLTQ5OSw3ICs0OTksNyBAQAogCWlmIChjbGstPmZsYWdzICYgQUxXQVlTX0VOQUJMRUQpCiAJCXJldHVybiAwOwogCi0JaWYgKHVubGlrZWx5KGNsay0+ZW5hYmxlX3JlZyA9PSAwKSkgeworCWlmICh1bmxpa2VseShjbGstPmVuYWJsZV9yZWcgPT0gTlVMTCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjbG9jay5jOiBFbmFibGUgZm9yICVzIHdpdGhvdXQgZW5hYmxlIGNvZGVcbiIsCiAJCSAgICAgICBjbGstPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCV9fdTE2IHJlZ3ZhbDE2OwogCV9fdTMyIHJlZ3ZhbDMyOwogCi0JaWYgKGNsay0+ZW5hYmxlX3JlZyA9PSAwKQorCWlmIChjbGstPmVuYWJsZV9yZWcgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaWYgKGNsay0+ZmxhZ3MgJiBFTkFCTEVfUkVHXzMyQklUKSB7CkBAIC01NzcsNyArNTc3LDcgQEAKIAkJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gKDEgPDwgZHNvcl9leHApOwogCX0KIAotCWlmKGNsay0+cm91bmRfcmF0ZSAhPSAwKQorCWlmIChjbGstPnJvdW5kX3JhdGUgIT0gTlVMTCkKIAkJcmV0dXJuIGNsay0+cm91bmRfcmF0ZShjbGssIHJhdGUpOwogCiAJcmV0dXJuIGNsay0+cmF0ZTsKQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAJLyogQ2xvY2tzIGluIHRoZSBEU1AgZG9tYWluIG5lZWQgYXBpX2NrLiBKdXN0IGFzc3VtZSBib290bG9hZGVyCiAJICogaGFzIG5vdCBlbmFibGVkIGFueSBEU1AgY2xvY2tzICovCi0JaWYgKCh1MzIpY2xrLT5lbmFibGVfcmVnID09IERTUF9JRExFQ1QyKSB7CisJaWYgKGNsay0+ZW5hYmxlX3JlZyA9PSBEU1BfSURMRUNUMikgewogCQlwcmludGsoS0VSTl9JTkZPICJTa2lwcGluZyByZXNldCBjaGVjayBmb3IgRFNQIGRvbWFpbiAiCiAJCSAgICAgICAiY2xvY2sgXCIlc1wiXG4iLCBjbGstPm5hbWUpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmgKaW5kZXggNmVhZGY3Mi4uNTYzNWI1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaApAQCAtMzI0LDcgKzMyNCw3IEBACiAJLnBhcmVudAkJPSAmY2tfZHBsbDEsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzMTAgfCBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgUkFURV9DS0NUTCB8IFZJUlRVQUxfSU9fQUREUkVTUywKLQkuZW5hYmxlX3JlZwk9ICh2b2lkIF9faW9tZW0gKilEU1BfSURMRUNUMiwKKwkuZW5hYmxlX3JlZwk9IERTUF9JRExFQ1QyLAogCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCiAJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKIAkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGNfZHNwX2RvbWFpbiwKQEAgLTMzOCw3ICszMzgsNyBAQAogCS5wYXJlbnQJCT0gJmNrX3JlZiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDMxMCB8IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAogCQkJICBWSVJUVUFMX0lPX0FERFJFU1MsCi0JLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopRFNQX0lETEVDVDIsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKIAkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogCS5lbmFibGUJCT0gJm9tYXAxX2Nsa19lbmFibGVfZHNwX2RvbWFpbiwKQEAgLTM1MCw3ICszNTAsNyBAQAogCS5wYXJlbnQJCT0gJmNrX3JlZiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDMxMCB8IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAogCQkJICBWSVJUVUFMX0lPX0FERFJFU1MsCi0JLmVuYWJsZV9yZWcJPSAodm9pZCBfX2lvbWVtICopRFNQX0lETEVDVDIsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKIAkuZW5hYmxlX2JpdAk9IEVOX0RTUFRJTUNLLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiAJLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9kc3BfZG9tYWluLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwppbmRleCBhYjcwOGQ0Li5lMzgyYjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwpAQCAtMTMsOSArMTMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC90Yy5oPgpAQCAtMTAxLDcgKzEwMSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1NUSSkKIAotI2RlZmluZSBPTUFQMV9TVElfQkFTRQkJSU9fQUREUkVTUygweGZmZmVhMDAwKQorI2RlZmluZSBPTUFQMV9TVElfQkFTRQkJMHhmZmZlYTAwMAogI2RlZmluZSBPTUFQMV9TVElfQ0hBTk5FTF9CQVNFCShPTUFQMV9TVElfQkFTRSArIDB4NDAwKQogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHN0aV9yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKaW5kZXggNDQ0OWQ4Ni4uMDQ5OTUzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMKQEAgLTIxLDkgKzIxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCkBAIC04Niw3ICs4Niw2IEBACiAKIHZvaWQgaW5ub3ZhdG9yX2ZwZ2FfSVJRX2RlbXV4KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CiAJdTMyIHN0YXQ7CiAJaW50IGZwZ2FfaXJxOwogCkBAIC05OSw4ICs5OCw3IEBACiAJICAgICAoZnBnYV9pcnEgPCBPTUFQX0ZQR0FfSVJRX0VORCkgJiYgc3RhdDsKIAkgICAgIGZwZ2FfaXJxKyssIHN0YXQgPj49IDEpIHsKIAkJaWYgKHN0YXQgJiAxKSB7Ci0JCQlkID0gaXJxX2Rlc2MgKyBmcGdhX2lycTsKLQkJCWRlc2NfaGFuZGxlX2lycShmcGdhX2lycSwgZCk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZnBnYV9pcnEpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCmluZGV4IGRhMTNjM2UuLjEzMDgzZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKQEAgLTE0LDggKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjZGVmaW5lIE9NQVBfRElFX0lEXzAJCTB4ZmZmZTE4MDAKICNkZWZpbmUgT01BUF9ESUVfSURfMQkJMHhmZmZlMTgwNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCmluZGV4IDJiOTc1MGIuLmIzYmQ4Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKQEAgLTExLDEwICsxMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC90Yy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwppbmRleCAwZWM2YzFlYy4uOWFkNTE5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTQ3LDggKzQ4LDYgQEAKICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KICNkZWZpbmUgSVJRX0JBTksoaXJxKSAoKGlycSkgPj4gNSkKICNkZWZpbmUgSVJRX0JJVChpcnEpICAoKGlycSkgJiAweDFmKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwppbmRleCA2MTBmNTFmLi43MWZlMmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKQEAgLTEyLDggKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL21haWxib3guYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCmluZGV4IGFmNDRlYWIuLjU5YWJiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jCkBAIC0xMyw5ICsxMyw5IEBACiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvbWFpbGJveC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIE1BSUxCT1hfQVJNMkRTUDEJCTB4MDAKICNkZWZpbmUgTUFJTEJPWF9BUk0yRFNQMWIJCTB4MDQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYwppbmRleCA4MjYwMTBkLi43ZGU3YzY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCkBAIC0xMDMsMzAgKzEwMyw2IEBACiB7IH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG9tYXAxX21jYnNwX2NoZWNrKHVuc2lnbmVkIGludCBpZCkKLXsKLQkvKiBSRVZJU0lUOiBDaGVjayBjb3JyZWN0bHkgZm9yIG51bWJlciBvZiByZWdpc3RlcmVkIE1jQlNQcyAqLwotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UIC0gMikgewotCQkgICAgICAgcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGRvZXNuJ3QgZXhpc3RcbiIsCi0JCQkJaWQgKyAxKTsKLQkJICAgICAgIHJldHVybiAtRU5PREVWOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjcHVfaXNfb21hcDE1eHgoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgewotCQlpZiAoaWQgPiBPTUFQX01BWF9NQ0JTUF9DT1VOVCAtIDEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCBkb2Vzbid0IGV4aXN0XG4iLAotCQkJCWlkICsgMSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQogc3RhdGljIHZvaWQgb21hcDFfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpCiB7CiAJLyoKQEAgLTE1MSw3ICsxMjcsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9tYXBfbWNic3Bfb3BzIG9tYXAxX21jYnNwX29wcyA9IHsKLQkuY2hlY2sJCT0gb21hcDFfbWNic3BfY2hlY2ssCiAJLnJlcXVlc3QJPSBvbWFwMV9tY2JzcF9yZXF1ZXN0LAogCS5mcmVlCQk9IG9tYXAxX21jYnNwX2ZyZWUsCiB9OwpAQCAtMTU5LDcgKzEzNCw3IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogc3RhdGljIHN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgb21hcDczMF9tY2JzcF9wZGF0YVtdID0gewogCXsKLQkJLnZpcnRfYmFzZQk9IGlvX3AydihPTUFQNzMwX01DQlNQMV9CQVNFKSwKKwkJLnBoeXNfYmFzZQk9IE9NQVA3MzBfTUNCU1AxX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVBfRE1BX01DQlNQMV9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUF9ETUFfTUNCU1AxX1RYLAogCQkucnhfaXJxCQk9IElOVF83MzBfTWNCU1AxUlgsCkBAIC0xNjcsNyArMTQyLDcgQEAKIAkJLm9wcwkJPSAmb21hcDFfbWNic3Bfb3BzLAogCX0sCiAJewotCQkudmlydF9iYXNlCT0gaW9fcDJ2KE9NQVA3MzBfTUNCU1AyX0JBU0UpLAorCQkucGh5c19iYXNlCT0gT01BUDczMF9NQ0JTUDJfQkFTRSwKIAkJLmRtYV9yeF9zeW5jCT0gT01BUF9ETUFfTUNCU1AzX1JYLAogCQkuZG1hX3R4X3N5bmMJPSBPTUFQX0RNQV9NQ0JTUDNfVFgsCiAJCS5yeF9pcnEJCT0gSU5UXzczMF9NY0JTUDJSWCwKQEAgLTE4NCw3ICsxNTksNyBAQAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCiBzdGF0aWMgc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSBvbWFwMTV4eF9tY2JzcF9wZGF0YVtdID0gewogCXsKLQkJLnZpcnRfYmFzZQk9IE9NQVAxNTEwX01DQlNQMV9CQVNFLAorCQkucGh5c19iYXNlCT0gT01BUDE1MTBfTUNCU1AxX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVBfRE1BX01DQlNQMV9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUF9ETUFfTUNCU1AxX1RYLAogCQkucnhfaXJxCQk9IElOVF9NY0JTUDFSWCwKQEAgLTE5Myw3ICsxNjgsNyBAQAogCQkuY2xrX25hbWUJPSAibWNic3BfY2xrIiwKIAkJfSwKIAl7Ci0JCS52aXJ0X2Jhc2UJPSBpb19wMnYoT01BUDE1MTBfTUNCU1AyX0JBU0UpLAorCQkucGh5c19iYXNlCT0gT01BUDE1MTBfTUNCU1AyX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVBfRE1BX01DQlNQMl9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUF9ETUFfTUNCU1AyX1RYLAogCQkucnhfaXJxCQk9IElOVF8xNTEwX1NQSV9SWCwKQEAgLTIwMSw3ICsxNzYsNyBAQAogCQkub3BzCQk9ICZvbWFwMV9tY2JzcF9vcHMsCiAJfSwKIAl7Ci0JCS52aXJ0X2Jhc2UJPSBPTUFQMTUxMF9NQ0JTUDNfQkFTRSwKKwkJLnBoeXNfYmFzZQk9IE9NQVAxNTEwX01DQlNQM19CQVNFLAogCQkuZG1hX3J4X3N5bmMJPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCiAJCS5kbWFfdHhfc3luYwk9IE9NQVBfRE1BX01DQlNQM19UWCwKIAkJLnJ4X2lycQkJPSBJTlRfTWNCU1AzUlgsCkBAIC0yMTksNyArMTk0LDcgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogc3RhdGljIHN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgb21hcDE2eHhfbWNic3BfcGRhdGFbXSA9IHsKIAl7Ci0JCS52aXJ0X2Jhc2UJPSBPTUFQMTYxMF9NQ0JTUDFfQkFTRSwKKwkJLnBoeXNfYmFzZQk9IE9NQVAxNjEwX01DQlNQMV9CQVNFLAogCQkuZG1hX3J4X3N5bmMJPSBPTUFQX0RNQV9NQ0JTUDFfUlgsCiAJCS5kbWFfdHhfc3luYwk9IE9NQVBfRE1BX01DQlNQMV9UWCwKIAkJLnJ4X2lycQkJPSBJTlRfTWNCU1AxUlgsCkBAIC0yMjgsNyArMjAzLDcgQEAKIAkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCiAJfSwKIAl7Ci0JCS52aXJ0X2Jhc2UJPSBpb19wMnYoT01BUDE2MTBfTUNCU1AyX0JBU0UpLAorCQkucGh5c19iYXNlCT0gT01BUDE2MTBfTUNCU1AyX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVBfRE1BX01DQlNQMl9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUF9ETUFfTUNCU1AyX1RYLAogCQkucnhfaXJxCQk9IElOVF8xNjEwX01jQlNQMl9SWCwKQEAgLTIzNiw3ICsyMTEsNyBAQAogCQkub3BzCQk9ICZvbWFwMV9tY2JzcF9vcHMsCiAJfSwKIAl7Ci0JCS52aXJ0X2Jhc2UJPSBPTUFQMTYxMF9NQ0JTUDNfQkFTRSwKKwkJLnBoeXNfYmFzZQk9IE9NQVAxNjEwX01DQlNQM19CQVNFLAogCQkuZG1hX3J4X3N5bmMJPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCiAJCS5kbWFfdHhfc3luYwk9IE9NQVBfRE1BX01DQlNQM19UWCwKIAkJLnJ4X2lycQkJPSBJTlRfTWNCU1AzUlgsCkBAIC0yNjMsNiArMjM4LDE4IEBACiAJfQogCiAJaWYgKGNwdV9pc19vbWFwNzMwKCkpCisJCW9tYXBfbWNic3BfY291bnQgPSBPTUFQNzMwX01DQlNQX1BEQVRBX1NaOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKKwkJb21hcF9tY2JzcF9jb3VudCA9IE9NQVAxNVhYX01DQlNQX1BEQVRBX1NaOworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJb21hcF9tY2JzcF9jb3VudCA9IE9NQVAxNlhYX01DQlNQX1BEQVRBX1NaOworCisJbWNic3BfcHRyID0ga3phbGxvYyhvbWFwX21jYnNwX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBvbWFwX21jYnNwICopLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1jYnNwX3B0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkKIAkJb21hcF9tY2JzcF9yZWdpc3Rlcl9ib2FyZF9jZmcob21hcDczMF9tY2JzcF9wZGF0YSwKIAkJCQkJCU9NQVA3MzBfTUNCU1BfUERBVEFfU1opOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL211eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tdXguYwppbmRleCA4OTg1MTZlLi4wNjJjOTA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL211eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbXV4LmMKQEAgLTI0LDEwICsyNCwxMSBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKICNpbmNsdWRlIDxtYWNoL211eC5oPgogCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKaW5kZXggNjNjNGVhMS4uNzcwZDI1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYwpAQCAtNDEsOCArNDEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKaW5kZXggMGUyNWE5OS4uNTI4NjkxZDVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KQEAgLTY3LDggKzY3LDggQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKLQkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpLAotCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDFfQkFTRSwKKwkJLm1lbWJhc2UJPSBJT19BRERSRVNTKE9NQVBfVUFSVDFfQkFTRSksCisJCS5tYXBiYXNlCT0gT01BUF9VQVJUMV9CQVNFLAogCQkuaXJxCQk9IElOVF9VQVJUMSwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLApAQCAtNzYsOCArNzYsOCBAQAogCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAogCX0sCiAJewotCQkubWVtYmFzZQk9IChjaGFyKilJT19BRERSRVNTKE9NQVBfVUFSVDJfQkFTRSksCi0JCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpT01BUF9VQVJUMl9CQVNFLAorCQkubWVtYmFzZQk9IElPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSwKKwkJLm1hcGJhc2UJPSBPTUFQX1VBUlQyX0JBU0UsCiAJCS5pcnEJCT0gSU5UX1VBUlQyLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCkBAIC04NSw4ICs4NSw4IEBACiAJCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCiAJfSwKIAl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQzX0JBU0UsCisJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhPTUFQX1VBUlQzX0JBU0UpLAorCQkubWFwYmFzZQk9IE9NQVBfVUFSVDNfQkFTRSwKIAkJLmlycQkJPSBJTlRfVUFSVDMsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKaW5kZXggZTU0NzA4NS4uMmNmN2UzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lLmMKQEAgLTQzLDEwICs0MywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lcjMyay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS90aW1lcjMyay5jCmluZGV4IGU2Nzc2MDEuLjcwNTM2N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZXIzMmsuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWVyMzJrLmMKQEAgLTQ0LDEwICs0NCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDcwNjljOWQuLjQ4MzJmY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTE1LDggKzE1LDE3IEBACiAJYm9vbCAiT01BUDI0MzAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDI0WFgKIAorY29uZmlnIEFSQ0hfT01BUDM0WFgKKwlib29sICJPTUFQMzR4eCBCYXNlZCBTeXN0ZW0iCisJZGVwZW5kcyBvbiBBUkNIX09NQVAzCisKK2NvbmZpZyBBUkNIX09NQVAzNDMwCisJYm9vbCAiT01BUDM0MzAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBBUkNIX09NQVBfT1RHCisKIGNvbW1lbnQgIk9NQVAgQm9hcmQgVHlwZSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMwogCiBjb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKIAlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCkBAIC0zNSwzICs0NCwxNCBAQAogCWJvb2wgIk9NQVAgMjQzMCBTRFAgYm9hcmQiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyICYmIEFSQ0hfT01BUDI0WFgKIAorY29uZmlnIE1BQ0hfT01BUDNfQkVBR0xFCisJYm9vbCAiT01BUDMgQkVBR0xFIGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisKK2NvbmZpZyBNQUNIX09NQVBfTERQCisJYm9vbCAiT01BUDMgTERQIGJvYXJkIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisKK2NvbmZpZyBNQUNIX09WRVJPCisJYm9vbCAiR3Vtc3RpeCBPdmVybyBib2FyZCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggOTNlZTk5MC4uYzY5MzkyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC00LDE2ICs0LDIxIEBACiAKICMgQ29tbW9uIHN1cHBvcnQKIG9iai15IDo9IGlycS5vIGlkLm8gaW8ubyBtZW1vcnkubyBjb250cm9sLm8gcHJjbS5vIGNsb2NrLm8gbXV4Lm8gXAotCQlkZXZpY2VzLm8gc2VyaWFsLm8gZ3BtYy5vIHRpbWVyLWdwLm8KKwkJZGV2aWNlcy5vIHNlcmlhbC5vIGdwbWMubyB0aW1lci1ncC5vIHBvd2VyZG9tYWluLm8gXAorCQljbG9ja2RvbWFpbi5vCiAKIG9iai0kKENPTkZJR19PTUFQX01DQlNQKSArPSBtY2JzcC5vCiAKICMgRnVuY3Rpb25zIGxvYWRlZCB0byBTUkFNCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMjQyMCkJCSs9IHNyYW0yNDJ4Lm8KIG9iai0kKENPTkZJR19BUkNIX09NQVAyNDMwKQkJKz0gc3JhbTI0M3gubworb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBzcmFtMzR4eC5vCiAKICMgUG93ZXIgTWFuYWdlbWVudAotb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vIHNsZWVwLm8KK2lmZXEgKCQoQ09ORklHX1BNKSx5KQorb2JqLXkJCQkJCSs9IHBtLm8KK29iai0kKENPTkZJR19BUkNIX09NQVAyNFhYKQkJKz0gc2xlZXAyNHh4Lm8KK2VuZGlmCiAKICMgQ2xvY2sgZnJhbWV3b3JrCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMikJCSs9IGNsb2NrMjR4eC5vCkBAIC0yNCw0ICsyOSw3IEBACiBvYmotJChDT05GSUdfTUFDSF9PTUFQX0g0KQkJKz0gYm9hcmQtaDQubwogb2JqLSQoQ09ORklHX01BQ0hfT01BUF8yNDMwU0RQKQkJKz0gYm9hcmQtMjQzMHNkcC5vCiBvYmotJChDT05GSUdfTUFDSF9PTUFQX0FQT0xMT04pCQkrPSBib2FyZC1hcG9sbG9uLm8KK29iai0kKENPTkZJR19NQUNIX09NQVAzX0JFQUdMRSkJCSs9IGJvYXJkLW9tYXAzYmVhZ2xlLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfTERQKQkJKz0gYm9hcmQtbGRwLm8KK29iai0kKENPTkZJR19NQUNIX09WRVJPKQkJKz0gYm9hcmQtb3Zlcm8ubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCmluZGV4IGI3MmNhMTMuLjI0Njg4ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zNCw4ICszNSw2IEBACiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2dwbWMuaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotCiAKICNkZWZpbmUJU0RQMjQzMF9GTEFTSF9DUwkwCiAjZGVmaW5lCVNEUDI0MzBfU01DOTFYX0NTCTUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwppbmRleCA5ZTI2MjRjLi4yZmVmMmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCkBAIC0xOCw5ICsxOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTQxLDggKzQzLDYgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvZ3BtYy5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KICNkZWZpbmUgSDRfRkxBU0hfQ1MJMAogI2RlZmluZSBINF9TTUM5MVhfQ1MJMQogCkBAIC0zOTIsNiArMzkyLDEzIEBACiAJeyBPTUFQX1RBR19MQ0QsCQkmaDRfbGNkX2NvbmZpZyB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGg0X2kyY19ib2FyZF9pbmZvW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiaXNwMTMwMV9vbWFwIiwgMHgyZCksCisJCS5pcnEJCT0gT01BUF9HUElPX0lSUSgxMjUpLAorCX0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9oNF9pbml0KHZvaWQpCiB7CiAJLyoKQEAgLTQxMiw2ICs0MTksOSBAQAogCX0KICNlbmRpZgogCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaDRfaTJjX2JvYXJkX2luZm8sCisJCQlBUlJBWV9TSVpFKGg0X2kyY19ib2FyZF9pbmZvKSk7CisKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhoNF9kZXZpY2VzLCBBUlJBWV9TSVpFKGg0X2RldmljZXMpKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IGg0X2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShoNF9jb25maWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhNTk5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqIE5pc2hhbnQgS2FtYXQgPG5za2FtYXRAdGkuY29tPgorICoKKyAqIE1vZGlmaWVkIGZyb20gbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9ib2FyZC1sZHAuaD4KKyNpbmNsdWRlIDxtYWNoL21jc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9ncG1jLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbGRwX2luaXRfaXJxKHZvaWQpCit7CisJb21hcDJfaW5pdF9jb21tb25faHcoKTsKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIGxkcF91YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0geworCS5lbmFibGVkX3VhcnRzCT0gKCgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSksCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBsZHBfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwl7IE9NQVBfVEFHX1VBUlQsCSZsZHBfdWFydF9jb25maWcgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfaTJjX2luaXQodm9pZCkKK3sKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMjYwMCwgTlVMTCwgMCk7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDIsIDQwMCwgTlVMTCwgMCk7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDMsIDQwMCwgTlVMTCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2xkcF9pbml0KHZvaWQpCit7CisJb21hcF9pMmNfaW5pdCgpOworCW9tYXBfYm9hcmRfY29uZmlnID0gbGRwX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShsZHBfY29uZmlnKTsKKwlvbWFwX3NlcmlhbF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2xkcF9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMl9zZXRfZ2xvYmFsc18zNDN4KCk7CisJb21hcDJfbWFwX2NvbW1vbl9pbygpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfTERQLCAiT01BUCBMRFAgYm9hcmQiKQorCS5waHlzX2lvCT0gMHg0ODAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5tYXBfaW8JCT0gb21hcF9sZHBfbWFwX2lvLAorCS5pbml0X2lycQk9IG9tYXBfbGRwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvbWFwX2xkcF9pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNzk2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIE1vZGlmaWVkIGZyb20gbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKyAqCisgKiBJbml0aWFsIGNvZGU6IFN5ZWQgTW9oYW1tZWQgS2hhc2ltCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2dwbWMuaD4KKyNpbmNsdWRlIDxtYWNoL25hbmQuaD4KKworCisjZGVmaW5lIEdQTUNfQ1MwX0JBU0UgIDB4NjAKKyNkZWZpbmUgR1BNQ19DU19TSVpFICAgMHgzMAorCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gb21hcDNiZWFnbGVfbmFuZF9wYXJ0aXRpb25zW10gPSB7CisJLyogQWxsIHRoZSBwYXJ0aXRpb24gc2l6ZXMgYXJlIGxpc3RlZCBpbiB0ZXJtcyBvZiBOQU5EIGJsb2NrIHNpemUgKi8KKwl7CisJCS5uYW1lCQk9ICJYLUxvYWRlciIsCisJCS5vZmZzZXQJCT0gMCwKKwkJLnNpemUJCT0gNCAqIE5BTkRfQkxPQ0tfU0laRSwKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAkvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCXsKKwkJLm5hbWUJCT0gIlUtQm9vdCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAkvKiBPZmZzZXQgPSAweDgwMDAwICovCisJCS5zaXplCQk9IDE1ICogTkFORF9CTE9DS19TSVpFLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCS8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJeworCQkubmFtZQkJPSAiVS1Cb290IEVudiIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAkvKiBPZmZzZXQgPSAweDI2MDAwMCAqLworCQkuc2l6ZQkJPSAxICogTkFORF9CTE9DS19TSVpFLAorCX0sCisJeworCQkubmFtZQkJPSAiS2VybmVsIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCS8qIE9mZnNldCA9IDB4MjgwMDAwICovCisJCS5zaXplCQk9IDMyICogTkFORF9CTE9DS19TSVpFLAorCX0sCisJeworCQkubmFtZQkJPSAiRmlsZSBTeXN0ZW0iLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHg2ODAwMDAgKi8KKwkJLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSBvbWFwM2JlYWdsZV9uYW5kX2RhdGEgPSB7CisJLm9wdGlvbnMJPSBOQU5EX0JVU1dJRFRIXzE2LAorCS5wYXJ0cwkJPSBvbWFwM2JlYWdsZV9uYW5kX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShvbWFwM2JlYWdsZV9uYW5kX3BhcnRpdGlvbnMpLAorCS5kbWFfY2hhbm5lbAk9IC0xLAkJLyogZGlzYWJsZSBETUEgaW4gT01BUCBOQU5EIGRyaXZlciAqLworCS5uYW5kX3NldHVwCT0gTlVMTCwKKwkuZGV2X3JlYWR5CT0gTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb21hcDNiZWFnbGVfbmFuZF9yZXNvdXJjZSA9IHsKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwM2JlYWdsZV9uYW5kX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcDItbmFuZCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZvbWFwM2JlYWdsZV9uYW5kX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJm9tYXAzYmVhZ2xlX25hbmRfcmVzb3VyY2UsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfdWFydF9jb25maWcgb21hcDNfYmVhZ2xlX3VhcnRfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLmVuYWJsZWRfdWFydHMJPSAoKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19iZWFnbGVfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwMl9pbml0X2NvbW1vbl9odygpOworCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwX2dwaW9faW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwM19iZWFnbGVfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcDNiZWFnbGVfbGNkIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBvbWFwM19iZWFnbGVfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiYmVhZ2xlYm9hcmQ6OnVzcjAiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCisJCS5ncGlvCQkJPSAxNTAsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiYmVhZ2xlYm9hcmQ6OnVzcjEiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gIm1tYzAiLAorCQkuZ3BpbwkJCT0gMTQ5LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZ3Bpb19sZWRfaW5mbyA9IHsKKwkubGVkcwkJPSBncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShncGlvX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGVkc19ncGlvID0geworCS5uYW1lCT0gImxlZHMtZ3BpbyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZ3Bpb19sZWRfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGdwaW9fYnV0dG9uc1tdID0geworCXsKKwkJLmNvZGUJCQk9IEJUTl9FWFRSQSwKKwkJLmdwaW8JCQk9IDcsCisJCS5kZXNjCQkJPSAidXNlciIsCisJCS53YWtldXAJCQk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgZ3Bpb19rZXlfaW5mbyA9IHsKKwkuYnV0dG9ucwk9IGdwaW9fYnV0dG9ucywKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGdwaW9fYnV0dG9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBrZXlzX2dwaW8gPSB7CisJLm5hbWUJPSAiZ3Bpby1rZXlzIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZncGlvX2tleV9pbmZvLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBvbWFwM19iZWFnbGVfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwl7IE9NQVBfVEFHX1VBUlQsCSZvbWFwM19iZWFnbGVfdWFydF9jb25maWcgfSwKKwl7IE9NQVBfVEFHX0xDRCwJCSZvbWFwM19iZWFnbGVfbGNkX2NvbmZpZyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXAzX2JlYWdsZV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmb21hcDNfYmVhZ2xlX2xjZF9kZXZpY2UsCisJJmxlZHNfZ3BpbywKKwkma2V5c19ncGlvLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzYmVhZ2xlX2ZsYXNoX2luaXQodm9pZCkKK3sKKwl1OCBjcyA9IDA7CisJdTggbmFuZGNzID0gR1BNQ19DU19OVU0gKyAxOworCisJdTMyIGdwbWNfYmFzZV9hZGQgPSBPTUFQMzRYWF9HUE1DX1ZJUlQ7CisKKwkvKiBmaW5kIG91dCB0aGUgY2hpcC1zZWxlY3Qgb24gd2hpY2ggTkFORCBleGlzdHMgKi8KKwl3aGlsZSAoY3MgPCBHUE1DX0NTX05VTSkgeworCQl1MzIgcmV0ID0gMDsKKwkJcmV0ID0gZ3BtY19jc19yZWFkX3JlZyhjcywgR1BNQ19DU19DT05GSUcxKTsKKworCQlpZiAoKHJldCAmIDB4QzAwKSA9PSAweDgwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTkFORCBvbiBDUyVkXG4iLCBjcyk7CisJCQlpZiAobmFuZGNzID4gR1BNQ19DU19OVU0pCisJCQkJbmFuZGNzID0gY3M7CisJCX0KKwkJY3MrKzsKKwl9CisKKwlpZiAobmFuZGNzID4gR1BNQ19DU19OVU0pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTkFORDogVW5hYmxlIHRvIGZpbmQgY29uZmlndXJhdGlvbiAiCisJCQkJICJpbiBHUE1DXG4gIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmFuZGNzIDwgR1BNQ19DU19OVU0pIHsKKwkJb21hcDNiZWFnbGVfbmFuZF9kYXRhLmNzID0gbmFuZGNzOworCQlvbWFwM2JlYWdsZV9uYW5kX2RhdGEuZ3BtY19jc19iYXNlYWRkciA9ICh2b2lkICopCisJCQkoZ3BtY19iYXNlX2FkZCArIEdQTUNfQ1MwX0JBU0UgKyBuYW5kY3MgKiBHUE1DX0NTX1NJWkUpOworCQlvbWFwM2JlYWdsZV9uYW5kX2RhdGEuZ3BtY19iYXNlYWRkciA9ICh2b2lkICopIChncG1jX2Jhc2VfYWRkKTsKKworCQlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBOQU5EIG9uIENTJWRcbiIsIG5hbmRjcyk7CisJCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAzYmVhZ2xlX25hbmRfZGV2aWNlKSA8IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBOQU5EIGRldmljZVxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfYmVhZ2xlX2luaXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvbWFwM19iZWFnbGVfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX2RldmljZXMpKTsKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IG9tYXAzX2JlYWdsZV9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX2NvbmZpZyk7CisJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXAzYmVhZ2xlX2ZsYXNoX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2JlYWdsZV9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMl9zZXRfZ2xvYmFsc18zNDN4KCk7CisJb21hcDJfbWFwX2NvbW1vbl9pbygpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVAzX0JFQUdMRSwgIk9NQVAzIEJlYWdsZSBCb2FyZCIpCisJLyogTWFpbnRhaW5lcjogU3llZCBNb2hhbW1lZCBLaGFzaW0gLSBodHRwOi8vYmVhZ2xlYm9hcmQub3JnICovCisJLnBoeXNfaW8JPSAweDQ4MDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhkODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLm1hcF9pbwkJPSBvbWFwM19iZWFnbGVfbWFwX2lvLAorCS5pbml0X2lycQk9IG9tYXAzX2JlYWdsZV9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gb21hcDNfYmVhZ2xlX2luaXQsCisJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDlhYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogYm9hcmQtb3Zlcm8uYyAoR3Vtc3RpeCBPdmVybykKKyAqCisgKiBJbml0aWFsIGNvZGU6IFN0ZXZlIFNha29tYW4gPHN0ZXZlQHNha29tYW4uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvYm9hcmQtb3Zlcm8uaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwbWMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9uYW5kLmg+CisKKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFIFNaXzEyOEsKKyNkZWZpbmUgR1BNQ19DUzBfQkFTRSAgMHg2MAorI2RlZmluZSBHUE1DX0NTX1NJWkUgICAweDMwCisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBvdmVyb19uYW5kX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJ4bG9hZGVyIiwKKwkJLm9mZnNldCAgICAgICAgID0gMCwJCQkvKiBPZmZzZXQgPSAweDAwMDAwICovCisJCS5zaXplICAgICAgICAgICA9IDQgKiBOQU5EX0JMT0NLX1NJWkUsCisJCS5tYXNrX2ZsYWdzICAgICA9IE1URF9XUklURUFCTEUKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgICAgID0gInVib290IiwKKwkJLm9mZnNldCAgICAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAkvKiBPZmZzZXQgPSAweDgwMDAwICovCisJCS5zaXplICAgICAgICAgICA9IDE0ICogTkFORF9CTE9DS19TSVpFLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAidWJvb3QgZW52aXJvbm1lbnQiLAorCQkub2Zmc2V0ICAgICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCS8qIE9mZnNldCA9IDB4MjQwMDAwICovCisJCS5zaXplICAgICAgICAgICA9IDIgKiBOQU5EX0JMT0NLX1NJWkUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJsaW51eCIsCisJCS5vZmZzZXQgICAgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHgyODAwMDAgKi8KKwkJLnNpemUgICAgICAgICAgID0gMzIgKiBOQU5EX0JMT0NLX1NJWkUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJyb290ZnMiLAorCQkub2Zmc2V0ICAgICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCS8qIE9mZnNldCA9IDB4NjgwMDAwICovCisJCS5zaXplICAgICAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgb3Zlcm9fbmFuZF9kYXRhID0geworCS5wYXJ0cyA9IG92ZXJvX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMgPSBBUlJBWV9TSVpFKG92ZXJvX25hbmRfcGFydGl0aW9ucyksCisJLmRtYV9jaGFubmVsID0gLTEsCS8qIGRpc2FibGUgRE1BIGluIE9NQVAgTkFORCBkcml2ZXIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3Zlcm9fbmFuZF9yZXNvdXJjZSA9IHsKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvdmVyb19uYW5kX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcDItbmFuZCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZvdmVyb19uYW5kX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJm92ZXJvX25hbmRfcmVzb3VyY2UsCit9OworCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvdmVyb19mbGFzaF9pbml0KHZvaWQpCit7CisJdTggY3MgPSAwOworCXU4IG5hbmRjcyA9IEdQTUNfQ1NfTlVNICsgMTsKKworCXUzMiBncG1jX2Jhc2VfYWRkID0gT01BUDM0WFhfR1BNQ19WSVJUOworCisJLyogZmluZCBvdXQgdGhlIGNoaXAtc2VsZWN0IG9uIHdoaWNoIE5BTkQgZXhpc3RzICovCisJd2hpbGUgKGNzIDwgR1BNQ19DU19OVU0pIHsKKwkJdTMyIHJldCA9IDA7CisJCXJldCA9IGdwbWNfY3NfcmVhZF9yZWcoY3MsIEdQTUNfQ1NfQ09ORklHMSk7CisKKwkJaWYgKChyZXQgJiAweEMwMCkgPT0gMHg4MDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE5BTkQgb24gQ1MlZFxuIiwgY3MpOworCQkJaWYgKG5hbmRjcyA+IEdQTUNfQ1NfTlVNKQorCQkJCW5hbmRjcyA9IGNzOworCQl9CisJCWNzKys7CisJfQorCisJaWYgKG5hbmRjcyA+IEdQTUNfQ1NfTlVNKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5BTkQ6IFVuYWJsZSB0byBmaW5kIGNvbmZpZ3VyYXRpb24gIgorCQkJCSAiaW4gR1BNQ1xuICIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5hbmRjcyA8IEdQTUNfQ1NfTlVNKSB7CisJCW92ZXJvX25hbmRfZGF0YS5jcyA9IG5hbmRjczsKKwkJb3Zlcm9fbmFuZF9kYXRhLmdwbWNfY3NfYmFzZWFkZHIgPSAodm9pZCAqKQorCQkJKGdwbWNfYmFzZV9hZGQgKyBHUE1DX0NTMF9CQVNFICsgbmFuZGNzICogR1BNQ19DU19TSVpFKTsKKwkJb3Zlcm9fbmFuZF9kYXRhLmdwbWNfYmFzZWFkZHIgPSAodm9pZCAqKSAoZ3BtY19iYXNlX2FkZCk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVnaXN0ZXJpbmcgTkFORCBvbiBDUyVkXG4iLCBuYW5kY3MpOworCQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvdmVyb19uYW5kX2RldmljZSkgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgTkFORCBkZXZpY2VcbiIpOworCX0KK30KK3N0YXRpYyBzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyBvdmVyb191YXJ0X2NvbmZpZyBfX2luaXRkYXRhID0geworCS5lbmFibGVkX3VhcnRzCT0gKCgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvdmVyb19pMmNfaW5pdCh2b2lkKQoreworCS8qIGkyYzIgcGlucyBhcmUgdXNlZCBmb3IgZ3BpbyAqLworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIE5VTEwsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3Zlcm9faW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwMl9pbml0X2NvbW1vbl9odygpOworCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwX2dwaW9faW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvdmVyb19sY2RfZGV2aWNlID0geworCS5uYW1lCQk9ICJvdmVyb19sY2QiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIG92ZXJvX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuY3RybF9uYW1lCT0gImludGVybmFsIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG92ZXJvX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJeyBPTUFQX1RBR19VQVJULAkmb3Zlcm9fdWFydF9jb25maWcgfSwKKwl7IE9NQVBfVEFHX0xDRCwJCSZvdmVyb19sY2RfY29uZmlnIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3Zlcm9fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm92ZXJvX2xjZF9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb3Zlcm9faW5pdCh2b2lkKQoreworCW92ZXJvX2kyY19pbml0KCk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMob3Zlcm9fZGV2aWNlcywgQVJSQVlfU0laRShvdmVyb19kZXZpY2VzKSk7CisJb21hcF9ib2FyZF9jb25maWcgPSBvdmVyb19jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob3Zlcm9fY29uZmlnKTsKKwlvbWFwX3NlcmlhbF9pbml0KCk7CisJb3Zlcm9fZmxhc2hfaW5pdCgpOworCisJaWYgKChncGlvX3JlcXVlc3QoT1ZFUk9fR1BJT19XMldfTlJFU0VULAorCQkJICAiT1ZFUk9fR1BJT19XMldfTlJFU0VUIikgPT0gMCkgJiYKKwkgICAgKGdwaW9fZGlyZWN0aW9uX291dHB1dChPVkVST19HUElPX1cyV19OUkVTRVQsIDEpID09IDApKSB7CisJCWdwaW9fZXhwb3J0KE9WRVJPX0dQSU9fVzJXX05SRVNFVCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKE9WRVJPX0dQSU9fVzJXX05SRVNFVCwgMCk7CisJCXVkZWxheSgxMCk7CisJCWdwaW9fc2V0X3ZhbHVlKE9WRVJPX0dQSU9fVzJXX05SRVNFVCwgMSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3Qgb2J0YWluIGdwaW8gZm9yICIKKwkJCQkJIk9WRVJPX0dQSU9fVzJXX05SRVNFVFxuIik7CisJfQorCisJaWYgKChncGlvX3JlcXVlc3QoT1ZFUk9fR1BJT19CVF9YR0FURSwgIk9WRVJPX0dQSU9fQlRfWEdBVEUiKSA9PSAwKSAmJgorCSAgICAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9WRVJPX0dQSU9fQlRfWEdBVEUsIDApID09IDApKQorCQlncGlvX2V4cG9ydChPVkVST19HUElPX0JUX1hHQVRFLCAwKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IG9idGFpbiBncGlvIGZvciBPVkVST19HUElPX0JUX1hHQVRFXG4iKTsKKworCWlmICgoZ3Bpb19yZXF1ZXN0KE9WRVJPX0dQSU9fQlRfTlJFU0VULCAiT1ZFUk9fR1BJT19CVF9OUkVTRVQiKSA9PSAwKSAmJgorCSAgICAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9WRVJPX0dQSU9fQlRfTlJFU0VULCAxKSA9PSAwKSkgeworCQlncGlvX2V4cG9ydChPVkVST19HUElPX0JUX05SRVNFVCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKE9WRVJPX0dQSU9fQlRfTlJFU0VULCAwKTsKKwkJbWRlbGF5KDYpOworCQlncGlvX3NldF92YWx1ZShPVkVST19HUElPX0JUX05SRVNFVCwgMSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3Qgb2J0YWluIGdwaW8gZm9yICIKKwkJCQkJIk9WRVJPX0dQSU9fQlRfTlJFU0VUXG4iKTsKKwl9CisKKwlpZiAoKGdwaW9fcmVxdWVzdChPVkVST19HUElPX1VTQkhfQ1BFTiwgIk9WRVJPX0dQSU9fVVNCSF9DUEVOIikgPT0gMCkgJiYKKwkgICAgKGdwaW9fZGlyZWN0aW9uX291dHB1dChPVkVST19HUElPX1VTQkhfQ1BFTiwgMSkgPT0gMCkpCisJCWdwaW9fZXhwb3J0KE9WRVJPX0dQSU9fVVNCSF9DUEVOLCAwKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IG9idGFpbiBncGlvIGZvciAiCisJCQkJCSJPVkVST19HUElPX1VTQkhfQ1BFTlxuIik7CisKKwlpZiAoKGdwaW9fcmVxdWVzdChPVkVST19HUElPX1VTQkhfTlJFU0VULAorCQkJICAiT1ZFUk9fR1BJT19VU0JIX05SRVNFVCIpID09IDApICYmCisJICAgIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoT1ZFUk9fR1BJT19VU0JIX05SRVNFVCwgMSkgPT0gMCkpCisJCWdwaW9fZXhwb3J0KE9WRVJPX0dQSU9fVVNCSF9OUkVTRVQsIDApOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3Qgb2J0YWluIGdwaW8gZm9yICIKKwkJCQkJIk9WRVJPX0dQSU9fVVNCSF9OUkVTRVRcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3Zlcm9fbWFwX2lvKHZvaWQpCit7CisJb21hcDJfc2V0X2dsb2JhbHNfMzQzeCgpOworCW9tYXAyX21hcF9jb21tb25faW8oKTsKK30KKworTUFDSElORV9TVEFSVChPVkVSTywgIkd1bXN0aXggT3Zlcm8iKQorCS5waHlzX2lvCT0gMHg0ODAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZDgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5tYXBfaW8JCT0gb3Zlcm9fbWFwX2lvLAorCS5pbml0X2lycQk9IG92ZXJvX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBvdmVyb19pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmMKaW5kZXggMWQ4OTFlNC4uYWQ3MjFlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suYwpAQCAtMjEsMTEgKzIxLDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9jbG9ja2RvbWFpbi5oPgogI2luY2x1ZGUgPG1hY2gvc3JhbS5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC02MiwxMCArNjIsMzYgQEAKIHU4IGNwdV9tYXNrOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9tYXAyIHNwZWNpZmljIGNsb2NrIGZ1bmN0aW9ucworICogT01BUDIvMyBzcGVjaWZpYyBjbG9jayBmdW5jdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKgorICogb21hcDJfaW5pdF9jbGtfY2xrZG0gLSBsb29rIHVwIGEgY2xvY2tkb21haW4gbmFtZSwgc3RvcmUgcG9pbnRlciBpbiBjbGsKKyAqIEBjbGs6IE9NQVAgY2xvY2sgc3RydWN0IHB0ciB0byB1c2UKKyAqCisgKiBDb252ZXJ0IGEgY2xvY2tkb21haW4gbmFtZSBzdG9yZWQgaW4gYSBzdHJ1Y3QgY2xrICdjbGsnIGludG8gYQorICogY2xvY2tkb21haW4gcG9pbnRlciwgYW5kIHNhdmUgaXQgaW50byB0aGUgc3RydWN0IGNsay4gIEludGVuZGVkIHRvIGJlCisgKiBjYWxsZWQgZHVyaW5nIGNsa19yZWdpc3RlcigpLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIG9tYXAyX2luaXRfY2xrX2Nsa2RtKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtOworCisJaWYgKCFjbGstPmNsa2RtX25hbWUpCisJCXJldHVybjsKKworCWNsa2RtID0gY2xrZG1fbG9va3VwKGNsay0+Y2xrZG1fbmFtZSk7CisJaWYgKGNsa2RtKSB7CisJCXByX2RlYnVnKCJjbG9jazogYXNzb2NpYXRlZCBjbGsgJXMgdG8gY2xrZG0gJXNcbiIsCisJCQkgY2xrLT5uYW1lLCBjbGstPmNsa2RtX25hbWUpOworCQljbGstPmNsa2RtID0gY2xrZG07CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoImNsb2NrOiBjb3VsZCBub3QgYXNzb2NpYXRlIGNsayAlcyB0byAiCisJCQkgImNsa2RtICVzXG4iLCBjbGstPm5hbWUsIGNsay0+Y2xrZG1fbmFtZSk7CisJfQorfQorCisvKioKICAqIG9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCAtIHNldCBhIGNsa3NlbCBjbGsncyBwYXJlbnQgZmllbGQgZnJvbSB0aGUgaGFyZHdhcmUKICAqIEBjbGs6IE9NQVAgY2xvY2sgc3RydWN0IHB0ciB0byB1c2UKICAqCkBAIC0yNTEsNyArMjc3LDcgQEAKIAlpZiAoY2xrLT5lbmFibGUpCiAJCXJldHVybiBjbGstPmVuYWJsZShjbGspOwogCi0JaWYgKHVubGlrZWx5KGNsay0+ZW5hYmxlX3JlZyA9PSAwKSkgeworCWlmICh1bmxpa2VseShjbGstPmVuYWJsZV9yZWcgPT0gTlVMTCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjbG9jay5jOiBFbmFibGUgZm9yICVzIHdpdGhvdXQgZW5hYmxlIGNvZGVcbiIsCiAJCSAgICAgICBjbGstPm5hbWUpOwogCQlyZXR1cm4gMDsgLyogUkVWSVNJVDogLUVJTlZBTCAqLwpAQCAtMjgzLDcgKzMwOSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoY2xrLT5lbmFibGVfcmVnID09IDApIHsKKwlpZiAoY2xrLT5lbmFibGVfcmVnID09IE5VTEwpIHsKIAkJLyoKIAkJICogJ0luZGVwZW5kZW50JyBoZXJlIHJlZmVycyB0byBhIGNsb2NrIHdoaWNoIGlzIG5vdAogCQkgKiBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuCkBAIC0zMDgsNiArMzM0LDkgQEAKIAkJX29tYXAyX2Nsa19kaXNhYmxlKGNsayk7CiAJCWlmIChsaWtlbHkoKHUzMiljbGstPnBhcmVudCkpCiAJCQlvbWFwMl9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisJCWlmIChjbGstPmNsa2RtKQorCQkJb21hcDJfY2xrZG1fY2xrX2Rpc2FibGUoY2xrLT5jbGtkbSwgY2xrKTsKKwogCX0KIH0KIApAQCAtMzI0LDExICszNTMsMTkgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAorCQlpZiAoY2xrLT5jbGtkbSkKKwkJCW9tYXAyX2Nsa2RtX2Nsa19lbmFibGUoY2xrLT5jbGtkbSwgY2xrKTsKKwogCQlyZXQgPSBfb21hcDJfY2xrX2VuYWJsZShjbGspOwogCi0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkgJiYgY2xrLT5wYXJlbnQpIHsKLQkJCW9tYXAyX2Nsa19kaXNhYmxlKGNsay0+cGFyZW50KTsKLQkJCWNsay0+dXNlY291bnQtLTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJaWYgKGNsay0+Y2xrZG0pCisJCQkJb21hcDJfY2xrZG1fY2xrX2Rpc2FibGUoY2xrLT5jbGtkbSwgY2xrKTsKKworCQkJaWYgKGNsay0+cGFyZW50KSB7CisJCQkJb21hcDJfY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOworCQkJCWNsay0+dXNlY291bnQtLTsKKwkJCX0KIAkJfQogCX0KIApAQCAtNDc3LDcgKzUxNCw3IEBACiAvKiBHaXZlbiBhIGNsb2NrIGFuZCBhIHJhdGUgYXBwbHkgYSBjbG9jayBzcGVjaWZpYyByb3VuZGluZyBmdW5jdGlvbiAqLwogbG9uZyBvbWFwMl9jbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKLQlpZiAoY2xrLT5yb3VuZF9yYXRlICE9IDApCisJaWYgKGNsay0+cm91bmRfcmF0ZSAhPSBOVUxMKQogCQlyZXR1cm4gY2xrLT5yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CiAKIAlpZiAoY2xrLT5mbGFncyAmIFJBVEVfRklYRUQpCkBAIC01NjYsNyArNjAzLDcgQEAKICAqLwogdm9pZCBfX2lvbWVtICpvbWFwMl9nZXRfY2xrc2VsKHN0cnVjdCBjbGsgKmNsaywgdTMyICpmaWVsZF9tYXNrKQogewotCWlmICh1bmxpa2VseSgoY2xrLT5jbGtzZWxfcmVnID09IDApIHx8IChjbGstPmNsa3NlbF9tYXNrID09IDApKSkKKwlpZiAodW5saWtlbHkoKGNsay0+Y2xrc2VsX3JlZyA9PSBOVUxMKSB8fCAoY2xrLT5jbGtzZWxfbWFzayA9PSBOVUxMKSkpCiAJCXJldHVybiBOVUxMOwogCiAJKmZpZWxkX21hc2sgPSBjbGstPmNsa3NlbF9tYXNrOwpAQCAtNTg2LDcgKzYyMyw3IEBACiAJdm9pZCBfX2lvbWVtICpkaXZfYWRkcjsKIAogCWRpdl9hZGRyID0gb21hcDJfZ2V0X2Nsa3NlbChjbGssICZmaWVsZF9tYXNrKTsKLQlpZiAoZGl2X2FkZHIgPT0gMCkKKwlpZiAoZGl2X2FkZHIgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlmaWVsZF92YWwgPSBfX3Jhd19yZWFkbChkaXZfYWRkcikgJiBmaWVsZF9tYXNrOwpAQCAtNjA1LDcgKzY0Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGl2X2FkZHIgPSBvbWFwMl9nZXRfY2xrc2VsKGNsaywgJmZpZWxkX21hc2spOwotCWlmIChkaXZfYWRkciA9PSAwKQorCWlmIChkaXZfYWRkciA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZpZWxkX3ZhbCA9IG9tYXAyX2Rpdmlzb3JfdG9fY2xrc2VsKGNsaywgbmV3X2Rpdik7CkBAIC02NDMsNyArNjgwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBkcGxsX2NrLCBjb3JlX2NrLCB2aXJ0X3ByY21fc2V0OyBwbHVzIGFsbCBjbGtzZWwgY2xvY2tzICovCi0JaWYgKGNsay0+c2V0X3JhdGUgIT0gMCkKKwlpZiAoY2xrLT5zZXRfcmF0ZSAhPSBOVUxMKQogCQlyZXQgPSBjbGstPnNldF9yYXRlKGNsaywgcmF0ZSk7CiAKIAlpZiAodW5saWtlbHkocmV0ID09IDAgJiYgKGNsay0+ZmxhZ3MgJiBSQVRFX1BST1BBR0FURVMpKSkKQEAgLTY2NCw3ICs3MDEsNyBAQAogCWNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSAqY2xrcjsKIAogCSpwYXJlbnRfZGl2ID0gMDsKLQkqc3JjX2FkZHIgPSAwOworCSpzcmNfYWRkciA9IE5VTEw7CiAKIAljbGtzID0gb21hcDJfZ2V0X2Nsa3NlbF9ieV9wYXJlbnQoY2xrLCBzcmNfY2xrKTsKIAlpZiAoY2xrcyA9PSBOVUxMKQpAQCAtNzA1LDcgKzc0Miw3IEBACiAKIAlmaWVsZF92YWwgPSBvbWFwMl9jbGtzZWxfZ2V0X3NyY19maWVsZCgmc3JjX2FkZHIsIG5ld19wYXJlbnQsCiAJCQkJCSAgICAgICAmZmllbGRfbWFzaywgY2xrLCAmcGFyZW50X2Rpdik7Ci0JaWYgKHNyY19hZGRyID09IDApCisJaWYgKHNyY19hZGRyID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNsay0+dXNlY291bnQgPiAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oCmluZGV4IDYyNmU1ZmEuLjFmYjMzMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKQEAgLTIxLDYgKzIxLDcgQEAKIC8qIFRoZSBtYXhpbXVtIGVycm9yIGJldHdlZW4gYSB0YXJnZXQgRFBMTCByYXRlIGFuZCB0aGUgcm91bmRlZCByYXRlIGluIEh6ICovCiAjZGVmaW5lIERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQk1MDAwMAogCitpbnQgb21hcDJfY2xrX2luaXQodm9pZCk7CiBpbnQgb21hcDJfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspOwogdm9pZCBvbWFwMl9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOwogbG9uZyBvbWFwMl9jbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CkBAIC0zNiw2ICszNyw3IEBACiAjZW5kaWYKIAogdm9pZCBvbWFwMl9jbGtzZWxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7Cit2b2lkIG9tYXAyX2luaXRfY2xrX2Nsa2RtKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIG9tYXAyX2luaXRfY2xrc2VsX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspOwogdTMyIG9tYXAyX2Nsa3NlbF9nZXRfZGl2aXNvcihzdHJ1Y3QgY2xrICpjbGspOwogdTMyIG9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlX2RpdihzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3JhdGUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYwppbmRleCAyOTVlNjcxLi5kMzgyZWIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmMKQEAgLTI0LDE0ICsyNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvc3JhbS5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KIAogI2luY2x1ZGUgIm1lbW9yeS5oIgogI2luY2x1ZGUgImNsb2NrLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaAppbmRleCBiZTRlMjU1Li4yNDJhMTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmgKQEAgLTYyNiw2ICs2MjYsNyBAQAogCS5yYXRlCQk9IDMyMDAwLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlSQVRFX0ZJWEVEIHwgQUxXQVlTX0VOQUJMRUQgfCBSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmcHJvcGFnYXRlX3JhdGUsCiB9OwogCkBAIC02MzQsMTcgKzYzNSwxOSBAQAogCS5uYW1lCQk9ICJvc2NfY2siLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLmVuYWJsZQkJPSAmb21hcDJfZW5hYmxlX29zY19jaywKIAkuZGlzYWJsZQk9ICZvbWFwMl9kaXNhYmxlX29zY19jaywKIAkucmVjYWxjCQk9ICZvbWFwMl9vc2NfY2xrX3JlY2FsYywKIH07CiAKLS8qIFdpdGggb3V0IG1vZGVtIGxpa2VseSAxMk1Ieiwgd2l0aCBtb2RlbSBsaWtlbHkgMTNNSHogKi8KKy8qIFdpdGhvdXQgbW9kZW0gbGlrZWx5IDEyTUh6LCB3aXRoIG1vZGVtIGxpa2VseSAxM01IeiAqLwogc3RhdGljIHN0cnVjdCBjbGsgc3lzX2NrID0gewkJLyogKCoxMiwgKjEzLCAxOS4yLCAyNiwgMzguNClNSHogKi8KIAkubmFtZQkJPSAic3lzX2NrIiwJCS8qIH4gcmVmX2NsayBhbHNvICovCiAJLnBhcmVudAkJPSAmb3NjX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlBTFdBWVNfRU5BQkxFRCB8IFJBVEVfUFJPUEFHQVRFUywKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9zeXNfY2xrX3JlY2FsYywKIH07CiAKQEAgLTY1Myw2ICs2NTYsNyBAQAogCS5yYXRlCQk9IDU0MDAwMDAwLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlSQVRFX0ZJWEVEIHwgQUxXQVlTX0VOQUJMRUQgfCBSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmcHJvcGFnYXRlX3JhdGUsCiB9OwogCkBAIC02ODQsNiArNjg4LDcgQEAKIAkuZHBsbF9kYXRhCT0gJmRwbGxfZGQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfAogCQkJCVJBVEVfUFJPUEFHQVRFUyB8IEFMV0FZU19FTkFCTEVELAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2RwbGxjb3JlX3JlY2FsYywKIAkuc2V0X3JhdGUJPSAmb21hcDJfcmVwcm9ncmFtX2RwbGxjb3JlLAogfTsKQEAgLTY5NCw2ICs2OTksNyBAQAogCS5yYXRlCQk9IDk2MDAwMDAwLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlSQVRFX0ZJWEVEIHwgUkFURV9QUk9QQUdBVEVTIHwgRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fOTZNX1BMTF9TSElGVCwKIAkuZW5hYmxlCQk9ICZvbWFwMl9jbGtfZml4ZWRfZW5hYmxlLApAQCAtNzA3LDYgKzcxMyw3IEBACiAJLnJhdGUJCT0gNTQwMDAwMDAsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfAogCQkJCVJBVEVfRklYRUQgfCBSQVRFX1BST1BBR0FURVMgfCBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl81NE1fUExMX1NISUZULAogCS5lbmFibGUJCT0gJm9tYXAyX2Nsa19maXhlZF9lbmFibGUsCkBAIC03NDEsNiArNzQ4LDcgQEAKIAkucGFyZW50CQk9ICZhcGxsNTRfY2ssCS8qIGNhbiBhbHNvIGJlIGFsdF9jbGsgKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJUkFURV9QUk9QQUdBVEVTIHwgUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCiAJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfNTRNX1NPVVJDRSwKQEAgLTc1Myw2ICs3NjEsNyBAQAogCS5wYXJlbnQJCT0gJmRwbGxfY2ssCQkvKiBjYW4gYWxzbyBiZSAzMmsgKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJQUxXQVlTX0VOQUJMRUQgfCBSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTc3OSw2ICs3ODgsNyBAQAogCS5wYXJlbnQJCT0gJmFwbGw5Nl9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJUkFURV9QUk9QQUdBVEVTIHwgUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCiAJLmNsa3NlbF9tYXNrCT0gT01BUDI0MzBfOTZNX1NPVVJDRSwKQEAgLTgxMSw2ICs4MjEsNyBAQAogCS5wYXJlbnQJCT0gJmFwbGw5Nl9jaywJIC8qIDk2TSBvciBBbHQgKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJUkFURV9QUk9QQUdBVEVTIHwgUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCiAJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfNDhNX1NPVVJDRSwKQEAgLTgyNiw2ICs4MzcsNyBAQAogCS5maXhlZF9kaXYJPSA0LAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlSQVRFX1BST1BBR0FURVMgfCBQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCiB9OwogCkBAIC04NzgsNiArODkwLDcgQEAKIAkucGFyZW50CQk9ICZmdW5jXzU0bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJUkFURV9QUk9QQUdBVEVTLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0NMS09VVF9FTl9TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtOTA4LDYgKzkyMSw3IEBACiAJLnBhcmVudAkJPSAmc3lzX2Nsa291dF9zcmMsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfAogCQkJCVBBUkVOVF9DT05UUk9MU19DTE9DSywKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkuY2xrc2VsX3JlZwk9IE9NQVAyNFhYX1BSQ01fQ0xLT1VUX0NUUkwsCiAJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLT1VUX0RJVl9NQVNLLAogCS5jbGtzZWwJCT0gc3lzX2Nsa291dF9jbGtzZWwsCkBAIC05MjEsNiArOTM1LDcgQEAKIAkubmFtZQkJPSAic3lzX2Nsa291dDJfc3JjIiwKIAkucGFyZW50CQk9ICZmdW5jXzU0bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAogCS5lbmFibGVfYml0CT0gT01BUDI0MjBfQ0xLT1VUMl9FTl9TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtOTQyLDYgKzk1Nyw3IEBACiAJLm5hbWUJCT0gInN5c19jbGtvdXQyIiwKIAkucGFyZW50CQk9ICZzeXNfY2xrb3V0Ml9zcmMsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5jbGtzZWxfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKIAkuY2xrc2VsX21hc2sJPSBPTUFQMjQyMF9DTEtPVVQyX0RJVl9NQVNLLAogCS5jbGtzZWwJCT0gc3lzX2Nsa291dDJfY2xrc2VsLApAQCAtOTU0LDYgKzk3MCw3IEBACiAJLm5hbWUJCT0gImVtdWxfY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfNTRtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVAyNFhYX1BSQ01fQ0xLRU1VTF9DVFJMLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU1VTEFUSU9OX0VOX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC05OTAsMTIgKzEwMDcsMTMgQEAKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJQUxXQVlTX0VOQUJMRUQgfCBERUxBWUVEX0FQUCB8CiAJCQkJQ09ORklHX1BBUlRJQ0lQQU5UIHwgUkFURV9QUk9QQUdBVEVTLAorCS5jbGtkbV9uYW1lCT0gIm1wdV9jbGtkbSIsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKIAkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihNUFVfTU9ELCBDTV9DTEtTRUwpLAogCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9NUFVfTUFTSywKIAkuY2xrc2VsCQk9IG1wdV9jbGtzZWwsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQkucm91bmRfcmF0ZSAgICAgPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCiAJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQogfTsKIApAQCAtMTAzMSw2ICsxMDQ5LDcgQEAKIAkucGFyZW50CQk9ICZjb3JlX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwgREVMQVlFRF9BUFAgfAogCQkJCUNPTkZJR19QQVJUSUNJUEFOVCB8IFJBVEVfUFJPUEFHQVRFUywKKwkuY2xrZG1fbmFtZQk9ICJkc3BfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9DTV9GQ0xLRU5fRFNQX0VOX0RTUF9TSElGVCwKIAkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpLApAQCAtMTA1NCwxMCArMTA3Myw3IEBACiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwogCi0vKgotICogVGhpcyBjbG9jayBkb2VzIG5vdCBleGlzdCBhcyBzdWNoIGluIHRoZSBUUk0sIGJ1dCBpcyBhZGRlZCB0bwotICogc2VwYXJhdGUgc291cmNlIHNlbGVjdGlvbiBmcm9tICBYWFgKLSAqLworLyogVGhpcyBjbG9jayBkb2VzIG5vdCBleGlzdCBhcyBzdWNoIGluIHRoZSBUUk0uICovCiBzdGF0aWMgc3RydWN0IGNsayBkc3BfaXJhdGVfaWNrID0gewogCS5uYW1lCQk9ICJkc3BfaXJhdGVfaWNrIiwKIAkucGFyZW50CQk9ICZkc3BfZmNrLApAQCAtMTA4OSwxMSArMTEwNSwxNyBAQAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfQ01fRkNMS0VOX0RTUF9FTl9EU1BfU0hJRlQsCiB9OwogCisvKgorICogVGhlIElWQTEgaXMgYW4gQVJNNyBjb3JlIG9uIHRoZSAyNDIwIHRoYXQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aAorICogdGhlIEM1NHgsIGJ1dCB3aGljaCBpcyBjb250YWluZWQgaW4gdGhlIERTUCBwb3dlcmRvbWFpbi4gIERvZXMgbm90CisgKiBleGlzdCBvbiBsYXRlciBPTUFQcy4KKyAqLwogc3RhdGljIHN0cnVjdCBjbGsgaXZhMV9pZmNrID0gewogCS5uYW1lCQk9ICJpdmExX2lmY2siLAogCS5wYXJlbnQJCT0gJmNvcmVfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ09ORklHX1BBUlRJQ0lQQU5UIHwKIAkJCQlSQVRFX1BST1BBR0FURVMgfCBERUxBWUVEX0FQUCwKKwkuY2xrZG1fbmFtZQk9ICJpdmExX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fSVZBX0NPUF9TSElGVCwKIAkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpLApAQCAtMTEwOSw2ICsxMTMxLDcgQEAKIAkubmFtZQkJPSAiaXZhMV9tcHVfaW50X2lmY2siLAogCS5wYXJlbnQJCT0gJml2YTFfaWZjaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlgsCisJLmNsa2RtX25hbWUJPSAiaXZhMV9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0WFhfRFNQX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0lWQV9NUFVfU0hJRlQsCiAJLmZpeGVkX2Rpdgk9IDIsCkBAIC0xMTU2LDYgKzExNzksNyBAQAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlBTFdBWVNfRU5BQkxFRCB8IERFTEFZRURfQVBQIHwKIAkJCQlDT05GSUdfUEFSVElDSVBBTlQgfCBSQVRFX1BST1BBR0FURVMsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAogCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9MM19NQVNLLAogCS5jbGtzZWwJCT0gY29yZV9sM19jbGtzZWwsCkBAIC0xMTc3LDExICsxMjAxLDEzIEBACiAJeyAucGFyZW50ID0gTlVMTCB9LAogfTsKIAorLyogSXQgaXMgdW5jbGVhciBmcm9tIFRSTSB3aGV0aGVyIHVzYl9sNF9pY2sgaXMgcmVhbGx5IGluIEwzIG9yIEw0IGNsa2RtICovCiBzdGF0aWMgc3RydWN0IGNsayB1c2JfbDRfaWNrID0gewkvKiBGUy1VU0IgaW50ZXJmYWNlIGNsb2NrICovCiAJLm5hbWUJCT0gInVzYl9sNF9pY2siLAogCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfAogCQkJCURFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1VTQl9TSElGVCwKIAkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMSksCkBAIC0xMTkzLDEwICsxMjE5LDQyIEBACiB9OwogCiAvKgorICogTDQgY2xvY2sgbWFuYWdlbWVudCBkb21haW4KKyAqCisgKiBUaGlzIGRvbWFpbiBjb250YWlucyBsb3RzIG9mIGludGVyZmFjZSBjbG9ja3MgZnJvbSB0aGUgTDQgaW50ZXJmYWNlLCBzb21lCisgKiBmdW5jdGlvbmFsIGNsb2Nrcy4JRml4ZWQgQVBMTCBmdW5jdGlvbmFsIHNvdXJjZSBjbG9ja3MgYXJlIG1hbmFnZWQgaW4KKyAqIHRoaXMgZG9tYWluLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGw0X2NvcmVfbDNfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbDRfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmNvcmVfbDNfY2ssIC5yYXRlcyA9IGw0X2NvcmVfbDNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGw0X2NrID0gewkJLyogdXNlZCBib3RoIGFzIGFuIGljayBhbmQgZmNrICovCisJLm5hbWUJCT0gImw0X2NrIiwKKwkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKKwkJCQlBTFdBWVNfRU5BQkxFRCB8IERFTEFZRURfQVBQIHwgUkFURV9QUk9QQUdBVEVTLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfTDRfTUFTSywKKwkuY2xrc2VsCQk9IGw0X2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKK307CisKKy8qCiAgKiBTU0kgaXMgaW4gTDMgbWFuYWdlbWVudCBkb21haW4sIGl0cyBkaXJlY3QgcGFyZW50IGlzIGNvcmUgbm90IGwzLAogICogbWFueSBjb3JlIHBvd2VyIGRvbWFpbiBlbnRpdGllcyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBMMyBjbG9jawogICogZG9tYWluLgotICogU1NJX1NTUl9GQ0xLLCBTU0lfU1NUX0ZDTEssIFNTSV9MNF9DTElLCisgKiBTU0lfU1NSX0ZDTEssIFNTSV9TU1RfRkNMSywgU1NJX0w0X0lDTEsKICAqCiAgKiBzc3IgPSBjb3JlLzEvMi8zLzQvNSwgc3N0ID0gMS8yIHNzci4KICAqLwpAQCAtMTIyMSw2ICsxMjc5LDcgQEAKIAkucGFyZW50CQk9ICZjb3JlX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKIAkJCQlERUxBWUVEX0FQUCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9TU0lfU0hJRlQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLApAQCAtMTIzMSw2ICsxMjkwLDcgQEAKIAkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCiB9OwogCisKIC8qCiAgKiBHRlggY2xvY2sgZG9tYWluCiAgKglDbG9ja3M6CkBAIC0xMjU0LDYgKzEzMTQsNyBAQAogCS5uYW1lCQk9ICJnZnhfM2RfZmNrIiwKIAkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImdmeF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzNEX1NISUZULAogCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCkBAIC0xMjY4LDYgKzEzMjksNyBAQAogCS5uYW1lCQk9ICJnZnhfMmRfZmNrIiwKIAkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImdmeF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzJEX1NISUZULAogCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCkBAIC0xMjgyLDYgKzEzNDQsNyBAQAogCS5uYW1lCQk9ICJnZnhfaWNrIiwJCS8qIEZyb20gbDMgKi8KIAkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImdmeF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVBfRU5fR0ZYX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xMzExLDYgKzEzNzQsNyBAQAogCS5uYW1lCQk9ICJtZG1faWNrIiwKIAkucGFyZW50CQk9ICZjb3JlX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCB8IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAorCS5jbGtkbV9uYW1lCT0gIm1kbV9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0MzBfTURNX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0NNX0lDTEtFTl9NRE1fRU5fTURNX1NISUZULAogCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNDMwX01ETV9NT0QsIENNX0NMS1NFTCksCkBAIC0xMzI1LDUyICsxMzg5LDEzIEBACiAJLm5hbWUJCT0gIm1kbV9vc2NfY2siLAogCS5wYXJlbnQJCT0gJm9zY19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAibWRtX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjQzMF9NRE1fTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fT1NDX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiAvKgotICogTDQgY2xvY2sgbWFuYWdlbWVudCBkb21haW4KLSAqCi0gKiBUaGlzIGRvbWFpbiBjb250YWlucyBsb3RzIG9mIGludGVyZmFjZSBjbG9ja3MgZnJvbSB0aGUgTDQgaW50ZXJmYWNlLCBzb21lCi0gKiBmdW5jdGlvbmFsIGNsb2Nrcy4JRml4ZWQgQVBMTCBmdW5jdGlvbmFsIHNvdXJjZSBjbG9ja3MgYXJlIG1hbmFnZWQgaW4KLSAqIHRoaXMgZG9tYWluLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGw0X2NvcmVfbDNfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbDRfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfbDNfY2ssIC5yYXRlcyA9IGw0X2NvcmVfbDNfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGw0X2NrID0gewkJLyogdXNlZCBib3RoIGFzIGFuIGljayBhbmQgZmNrICovCi0JLm5hbWUJCT0gImw0X2NrIiwKLQkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKLQkJCQlBTFdBWVNfRU5BQkxFRCB8IERFTEFZRURfQVBQIHwgUkFURV9QUk9QQUdBVEVTLAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfTDRfTUFTSywKLQkuY2xrc2VsCQk9IGw0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9sNF9pY2sgPSB7Ci0JLm5hbWUJCT0gInNzaV9sNF9pY2siLAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1NTSV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyoKICAqIERTUyBjbG9jayBkb21haW4KICAqIENMT0NLczoKICAqIERTU19MNF9JQ0xLLCBEU1NfTDNfSUNMSywKQEAgLTE0MDksNiArMTQzNCw3IEBACiAJLm5hbWUJCT0gImRzc19pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAkvKiByZWFsbHkgYm90aCBsMyBhbmQgbDQgKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0RTUzFfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE0MTksNiArMTQ0NSw3IEBACiAJLnBhcmVudAkJPSAmY29yZV9jaywJCS8qIENvcmUgb3Igc3lzICovCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfAogCQkJCURFTEFZRURfQVBQLAorCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRFNTMV9TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtMTQ1MSw2ICsxNDc4LDcgQEAKIAkucGFyZW50CQk9ICZzeXNfY2ssCQkvKiBmaXhlZCBhdCBzeXNfY2sgb3IgNDhNSHogKi8KIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CiAJCQkJREVMQVlFRF9BUFAsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9EU1MyX1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNDY0LDYgKzE0OTIsNyBAQAogCS5uYW1lCQk9ICJkc3NfNTRtX2ZjayIsCS8qIDU0bSB0diBjbGsgKi8KIAkucGFyZW50CQk9ICZmdW5jXzU0bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1RWX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNDkxLDYgKzE1MjAsNyBAQAogCS5uYW1lCQk9ICJncHQxX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNTAwLDYgKzE1MzAsNyBAQAogCS5uYW1lCQk9ICJncHQxX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxX1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNTE1LDYgKzE1NDYsNyBAQAogCS5uYW1lCQk9ICJncHQyX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMl9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTUyNCw2ICsxNTU2LDcgQEAKIAkubmFtZQkJPSAiZ3B0Ml9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDJfU0hJRlQsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKQEAgLTE1MzcsNiArMTU3MCw3IEBACiAJLm5hbWUJCT0gImdwdDNfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQzX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNTQ2LDYgKzE1ODAsNyBAQAogCS5uYW1lCQk9ICJncHQzX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUM19TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtMTU1OSw2ICsxNTk0LDcgQEAKIAkubmFtZQkJPSAiZ3B0NF9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDRfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE1NjgsNiArMTYwNCw3IEBACiAJLm5hbWUJCT0gImdwdDRfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ0X1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNTgxLDYgKzE2MTgsNyBAQAogCS5uYW1lCQk9ICJncHQ1X2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTU5MCw2ICsxNjI4LDcgQEAKIAkubmFtZQkJPSAiZ3B0NV9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDVfU0hJRlQsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKQEAgLTE2MDMsNiArMTY0Miw3IEBACiAJLm5hbWUJCT0gImdwdDZfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ2X1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNjEyLDYgKzE2NTIsNyBAQAogCS5uYW1lCQk9ICJncHQ2X2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNl9TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtMTYzNCw2ICsxNjc1LDcgQEAKIAkubmFtZQkJPSAiZ3B0N19mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDdfU0hJRlQsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKQEAgLTE2NDcsNiArMTY4OSw3IEBACiAJLm5hbWUJCT0gImdwdDhfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ4X1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNjU2LDYgKzE2OTksNyBAQAogCS5uYW1lCQk9ICJncHQ4X2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUOF9TSElGVCwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtMTY2OSw2ICsxNzEzLDcgQEAKIAkubmFtZQkJPSAiZ3B0OV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDlfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE2NzgsNiArMTcyMyw3IEBACiAJLm5hbWUJCT0gImdwdDlfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ5X1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNjkxLDYgKzE3MzcsNyBAQAogCS5uYW1lCQk9ICJncHQxMF9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEwX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNzAwLDYgKzE3NDcsNyBAQAogCS5uYW1lCQk9ICJncHQxMF9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEwX1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNzEzLDYgKzE3NjEsNyBAQAogCS5uYW1lCQk9ICJncHQxMV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDExX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNzIyLDYgKzE3NzEsNyBAQAogCS5uYW1lCQk9ICJncHQxMV9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDExX1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNzM1LDYgKzE3ODUsNyBAQAogCS5uYW1lCQk9ICJncHQxMl9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEyX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNzQ0LDYgKzE3OTUsNyBAQAogCS5uYW1lCQk9ICJncHQxMl9mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEyX1NISUZULAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCkBAIC0xNzU4LDYgKzE4MTAsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTc2OCw2ICsxODIxLDcgQEAKIAkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ0JTUDFfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE3NzgsNiArMTgzMiw3IEBACiAJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTUNCU1AyX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xNzg4LDYgKzE4NDMsNyBAQAogCS5pZAkJPSAyLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMl9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTc5OCw2ICsxODU0LDcgQEAKIAkuaWQJCT0gMywKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTUNCU1AzX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xODA4LDYgKzE4NjUsNyBAQAogCS5pZAkJPSAzLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE4MTgsNiArMTg3Niw3IEBACiAJLmlkCQk9IDQsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNF9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTgyOCw2ICsxODg3LDcgQEAKIAkuaWQJCT0gNCwKIAkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTUNCU1A0X1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xODM4LDYgKzE4OTgsNyBAQAogCS5pZAkJPSA1LAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDVfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE4NDgsNiArMTkwOSw3IEBACiAJLmlkCQk9IDUsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTg1Nyw2ICsxOTE5LDcgQEAKIAkubmFtZQkJPSAibWNzcGlfaWNrIiwKIAkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTFfU0hJRlQsCkBAIC0xODY4LDYgKzE5MzEsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DU1BJMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTg3OCw2ICsxOTQyLDcgQEAKIAkuaWQJCT0gMiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTJfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE4ODgsNiArMTk1Myw3IEBACiAJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTUNTUEkyX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xODk4LDYgKzE5NjQsNyBAQAogCS5pZAkJPSAzLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ1NQSTNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE5MDgsNiArMTk3NSw3IEBACiAJLmlkCQk9IDMsCiAJLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DU1BJM19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTkxNyw2ICsxOTg1LDcgQEAKIAkubmFtZQkJPSAidWFydDFfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTkyNiw2ICsxOTk1LDcgQEAKIAkubmFtZQkJPSAidWFydDFfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTkzNSw2ICsyMDA1LDcgQEAKIAkubmFtZQkJPSAidWFydDJfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMl9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTk0NCw2ICsyMDE1LDcgQEAKIAkubmFtZQkJPSAidWFydDJfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMl9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTk1Myw2ICsyMDI1LDcgQEAKIAkubmFtZQkJPSAidWFydDNfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUM19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTk2Miw2ICsyMDM1LDcgQEAKIAkubmFtZQkJPSAidWFydDNfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUM19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMTk3MSw2ICsyMDQ1LDcgQEAKIAkubmFtZQkJPSAiZ3Bpb3NfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQSU9TX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0xOTgwLDYgKzIwNTUsNyBAQAogCS5uYW1lCQk9ICJncGlvc19mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BJT1NfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE5ODksNiArMjA2NSw3IEBACiAJLm5hbWUJCT0gIm1wdV93ZHRfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01QVV9XRFRfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTE5OTgsNiArMjA3NSw3IEBACiAJLm5hbWUJCT0gIm1wdV93ZHRfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01QVV9XRFRfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIwMDYsMzEgKzIwODQsNDAgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHN5bmNfMzJrX2ljayA9IHsKIAkubmFtZQkJPSAic3luY18zMmtfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8IEVOQUJMRV9PTl9JTklULAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYIHwKKwkJCQlFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzMyS1NZTkNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CisKIHN0YXRpYyBzdHJ1Y3QgY2xrIHdkdDFfaWNrID0gewogCS5uYW1lCQk9ICJ3ZHQxX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9XRFQxX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OworCiBzdGF0aWMgc3RydWN0IGNsayBvbWFwY3RybF9pY2sgPSB7CiAJLm5hbWUJCT0gIm9tYXBjdHJsX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfCBFTkFCTEVfT05fSU5JVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CisJCQkJRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9PTUFQQ1RSTF9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgaWNyX2ljayA9IHsKIAkubmFtZQkJPSAiaWNyX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fSUNSX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMDQwLDE1ICsyMTI3LDIyIEBACiAJLm5hbWUJCT0gImNhbV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0NBTV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAorLyoKKyAqIGNhbV9mY2sgY29udHJvbHMgYm90aCBDQU1fTUNMSyBhbmQgQ0FNX0ZDTEsuICBJdCBzaG91bGQgcHJvYmFibHkgYmUKKyAqIHNwbGl0IGludG8gdHdvIHNlcGFyYXRlIGNsb2Nrcywgc2luY2UgdGhlIHBhcmVudCBjbG9ja3MgYXJlIGRpZmZlcmVudAorICogYW5kIHRoZSBjbG9ja2RvbWFpbnMgYXJlIGFsc28gZGlmZmVyZW50LgorICovCiBzdGF0aWMgc3RydWN0IGNsayBjYW1fZmNrID0gewogCS5uYW1lCQk9ICJjYW1fZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9DQU1fU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIwNTgsNiArMjE1Miw3IEBACiAJLm5hbWUJCT0gIm1haWxib3hlc19pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01BSUxCT1hFU19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjA2Nyw2ICsyMTYyLDcgQEAKIAkubmFtZQkJPSAid2R0NF9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1dEVDRfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIwNzYsNiArMjE3Miw3IEBACiAJLm5hbWUJCT0gIndkdDRfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9XRFQ0X1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMDg1LDYgKzIxODIsNyBAQAogCS5uYW1lCQk9ICJ3ZHQzX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX1dEVDNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIwOTQsNiArMjE5Miw3IEBACiAJLm5hbWUJCT0gIndkdDNfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlgsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fV0RUM19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjEwMyw2ICsyMjAyLDcgQEAKIAkubmFtZQkJPSAibXNwcm9faWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NU1BST19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjExMiw2ICsyMjEyLDcgQEAKIAkubmFtZQkJPSAibXNwcm9fZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NU1BST19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjEyMSw2ICsyMjIyLDcgQEAKIAkubmFtZQkJPSAibW1jX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX01NQ19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjEzMCw2ICsyMjMyLDcgQEAKIAkubmFtZQkJPSAibW1jX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX01NQ19TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjEzOSw2ICsyMjQyLDcgQEAKIAkubmFtZQkJPSAiZmFjX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRkFDX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMTQ4LDYgKzIyNTIsNyBAQAogCS5uYW1lCQk9ICJmYWNfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzEybV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9GQUNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIxNTcsNiArMjI2Miw3IEBACiAJLm5hbWUJCT0gImVhY19pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9FQUNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIxNjYsNiArMjI3Miw3IEBACiAJLm5hbWUJCT0gImVhY19mY2siLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9FQUNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIxNzUsNiArMjI4Miw3IEBACiAJLm5hbWUJCT0gImhkcV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0hEUV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjE4NCw2ICsyMjkyLDcgQEAKIAkubmFtZQkJPSAiaGRxX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY18xMm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fSERRX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMTk0LDYgKzIzMDMsNyBAQAogCS5pZAkJPSAyLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzJfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIyMDQsNiArMjMxNCw3IEBACiAJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmZnVuY18xMm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzJfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIyMTQsNiArMjMyNSw3IEBACiAJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX0kyQ0hTMl9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjIyNCw2ICsyMzM2LDcgQEAKIAkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JMkMxX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMjM0LDYgKzIzNDcsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfMTJtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JMkMxX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMjQ0LDYgKzIzNTgsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9JMkNIUzFfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIyNTIsNyArMjM2Nyw5IEBACiBzdGF0aWMgc3RydWN0IGNsayBncG1jX2ZjayA9IHsKIAkubmFtZQkJPSAiZ3BtY19mY2siLAogCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1ggfCBFTkFCTEVfT05fSU5JVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlggfCBDTE9DS19JTl9PTUFQMjQzWCB8CisJCQkJRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIyNjAsNiArMjM3Nyw3IEBACiAJLm5hbWUJCT0gInNkbWFfZmNrIiwKIAkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQyWCB8IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yMjY3LDYgKzIzODUsNyBAQAogCS5uYW1lCQk9ICJzZG1hX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIyNzQsNiArMjM5Myw3IEBACiAJLm5hbWUJCT0gInZseW5xX2ljayIsCiAJLnBhcmVudAkJPSAmY29yZV9sM19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0MlgsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fVkxZTlFfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIzMDgsNiArMjQyOCw3IEBACiAJLm5hbWUJCT0gInZseW5xX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDJYIHwgREVMQVlFRF9BUFAsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fVkxZTlFfU0hJRlQsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKQEAgLTIzMjMsNiArMjQ0NCw3IEBACiAJLm5hbWUJCT0gInNkcmNfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1ggfCBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMyksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9TRFJDX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMzMyLDYgKzI0NTQsNyBAQAogCS5uYW1lCQk9ICJkZXNfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1ggfCBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fSUNMS0VONCksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9ERVNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIzNDEsNiArMjQ2NCw3IEBACiAJLm5hbWUJCT0gInNoYV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCB8IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1NIQV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjM1MCw2ICsyNDc0LDcgQEAKIAkubmFtZQkJPSAicm5nX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYIHwgQ0xPQ0tfSU5fT01BUDI0MlgsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0lDTEtFTjQpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fUk5HX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMzU5LDYgKzI0ODQsNyBAQAogCS5uYW1lCQk9ICJhZXNfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1ggfCBDTE9DS19JTl9PTUFQMjQyWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fSUNMS0VONCksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9BRVNfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTIzNjgsNiArMjQ5NCw3IEBACiAJLm5hbWUJCT0gInBrYV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCB8IENMT0NLX0lOX09NQVAyNDJYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1BLQV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjM3Nyw2ICsyNTA0LDcgQEAKIAkubmFtZQkJPSAidXNiX2ZjayIsCiAJLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYIHwgQ0xPQ0tfSU5fT01BUDI0MlgsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVVNCX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMzg2LDYgKzI1MTQsNyBAQAogCS5uYW1lCQk9ICJ1c2Joc19pY2siLAogCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX1VTQkhTX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yMzk2LDYgKzI1MjUsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIUzFfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTI0MDYsNiArMjUzNiw3IEBACiAJLmlkCQk9IDEsCiAJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01NQ0hTMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjQxNiw2ICsyNTQ3LDcgQEAKIAkuaWQJCT0gMiwKIAkucGFyZW50CQk9ICZsNF9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFMyX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yNDM1LDYgKzI1NjcsNyBAQAogCS5uYW1lCQk9ICJncGlvNV9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9HUElPNV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjQ0NCw2ICsyNTc3LDcgQEAKIAkubmFtZQkJPSAiZ3BpbzVfZmNrIiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fR1BJTzVfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTI0NTMsNiArMjU4Nyw3IEBACiAJLm5hbWUJCT0gIm1kbV9pbnRjX2ljayIsCiAJLnBhcmVudAkJPSAmbDRfY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAyNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01ETV9JTlRDX1NISUZULAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCkBAIC0yNDYzLDYgKzI1OTgsNyBAQAogCS5pZAkJPSAxLAogCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIU0RCMV9TSElGVCwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLApAQCAtMjQ3Myw2ICsyNjA5LDcgQEAKIAkuaWQJCT0gMiwKIAkucGFyZW50CQk9ICZmdW5jXzMya19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAogCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFNEQjJfU0hJRlQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKQEAgLTI1NTEsNyArMjY4OCw2IEBACiAJJnVzYl9sNF9pY2ssCiAJLyogTDQgZG9tYWluIGNsb2NrcyAqLwogCSZsNF9jaywJCQkvKiB1c2VkIGFzIGJvdGggY29yZV9sNCBhbmQgd3VfbDQgKi8KLQkmc3NpX2w0X2ljaywKIAkvKiB2aXJ0dWFsIG1ldGEtZ3JvdXAgY2xvY2sgKi8KIAkmdmlydF9wcmNtX3NldCwKIAkvKiBnZW5lcmFsIGw0IGludGVyZmFjZSBjaywgbXVsdGktcGFyZW50IGZ1bmN0aW9uYWwgY2xrICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYwppbmRleCAzZmY3NDk1Li4wODRlMTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMKQEAgLTI1LDExICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9zcmFtLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogCiAjaW5jbHVkZSAibWVtb3J5LmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKQEAgLTYyLDExICs2MiwxNCBAQAogc3RhdGljIHZvaWQgX29tYXAzX2RwbGxfd3JpdGVfY2xrZW4oc3RydWN0IGNsayAqY2xrLCB1OCBjbGtlbl9iaXRzKQogewogCWNvbnN0IHN0cnVjdCBkcGxsX2RhdGEgKmRkOworCXUzMiB2OwogCiAJZGQgPSBjbGstPmRwbGxfZGF0YTsKIAotCWNtX3Jtd19yZWdfYml0cyhkZC0+ZW5hYmxlX21hc2ssIGNsa2VuX2JpdHMgPDwgX19mZnMoZGQtPmVuYWJsZV9tYXNrKSwKLQkJCWRkLT5jb250cm9sX3JlZyk7CisJdiA9IF9fcmF3X3JlYWRsKGRkLT5jb250cm9sX3JlZyk7CisJdiAmPSB+ZGQtPmVuYWJsZV9tYXNrOworCXYgfD0gY2xrZW5fYml0cyA8PCBfX2ZmcyhkZC0+ZW5hYmxlX21hc2spOworCV9fcmF3X3dyaXRlbCh2LCBkZC0+Y29udHJvbF9yZWcpOwogfQogCiAvKiBfb21hcDNfd2FpdF9kcGxsX3N0YXR1czogd2FpdCBmb3IgYSBEUExMIHRvIGVudGVyIGEgc3BlY2lmaWMgc3RhdGUgKi8KQEAgLTgyLDcgKzg1LDcgQEAKIAlzdGF0ZSA8PD0gZGQtPmlkbGVzdF9iaXQ7CiAJaWRsZXN0X21hc2sgPSAxIDw8IGRkLT5pZGxlc3RfYml0OwogCi0Jd2hpbGUgKCgoY21fcmVhZF9yZWcoZGQtPmlkbGVzdF9yZWcpICYgaWRsZXN0X21hc2spICE9IHN0YXRlKSAmJgorCXdoaWxlICgoKF9fcmF3X3JlYWRsKGRkLT5pZGxlc3RfcmVnKSAmIGlkbGVzdF9tYXNrKSAhPSBzdGF0ZSkgJiYKIAkgICAgICAgaSA8IE1BWF9EUExMX1dBSVRfVFJJRVMpIHsKIAkJaSsrOwogCQl1ZGVsYXkoMSk7CkBAIC0yODUsNyArMjg4LDcgQEAKIAogCWRkID0gY2xrLT5kcGxsX2RhdGE7CiAKLQl2ID0gY21fcmVhZF9yZWcoZGQtPmF1dG9pZGxlX3JlZyk7CisJdiA9IF9fcmF3X3JlYWRsKGRkLT5hdXRvaWRsZV9yZWcpOwogCXYgJj0gZGQtPmF1dG9pZGxlX21hc2s7CiAJdiA+Pj0gX19mZnMoZGQtPmF1dG9pZGxlX21hc2spOwogCkBAIC0zMDQsNiArMzA3LDcgQEAKIHN0YXRpYyB2b2lkIG9tYXAzX2RwbGxfYWxsb3dfaWRsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJdTMyIHY7CiAKIAlpZiAoIWNsayB8fCAhY2xrLT5kcGxsX2RhdGEpCiAJCXJldHVybjsKQEAgLTMxNSw5ICszMTksMTAgQEAKIAkgKiBieSB3cml0aW5nIDB4NSBpbnN0ZWFkIG9mIDB4MS4gIEFkZCBzb21lIG1lY2hhbmlzbSB0bwogCSAqIG9wdGlvbmFsbHkgZW50ZXIgdGhpcyBtb2RlLgogCSAqLwotCWNtX3Jtd19yZWdfYml0cyhkZC0+YXV0b2lkbGVfbWFzaywKLQkJCURQTExfQVVUT0lETEVfTE9XX1BPV0VSX1NUT1AgPDwgX19mZnMoZGQtPmF1dG9pZGxlX21hc2spLAotCQkJZGQtPmF1dG9pZGxlX3JlZyk7CisJdiA9IF9fcmF3X3JlYWRsKGRkLT5hdXRvaWRsZV9yZWcpOworCXYgJj0gfmRkLT5hdXRvaWRsZV9tYXNrOworCXYgfD0gRFBMTF9BVVRPSURMRV9MT1dfUE9XRVJfU1RPUCA8PCBfX2ZmcyhkZC0+YXV0b2lkbGVfbWFzayk7CisJX19yYXdfd3JpdGVsKHYsIGRkLT5hdXRvaWRsZV9yZWcpOwogfQogCiAvKioKQEAgLTMyOSwxNSArMzM0LDE3IEBACiBzdGF0aWMgdm9pZCBvbWFwM19kcGxsX2RlbnlfaWRsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJdTMyIHY7CiAKIAlpZiAoIWNsayB8fCAhY2xrLT5kcGxsX2RhdGEpCiAJCXJldHVybjsKIAogCWRkID0gY2xrLT5kcGxsX2RhdGE7CiAKLQljbV9ybXdfcmVnX2JpdHMoZGQtPmF1dG9pZGxlX21hc2ssCi0JCQlEUExMX0FVVE9JRExFX0RJU0FCTEUgPDwgX19mZnMoZGQtPmF1dG9pZGxlX21hc2spLAotCQkJZGQtPmF1dG9pZGxlX3JlZyk7CisJdiA9IF9fcmF3X3JlYWRsKGRkLT5hdXRvaWRsZV9yZWcpOworCXYgJj0gfmRkLT5hdXRvaWRsZV9tYXNrOworCXYgfD0gRFBMTF9BVVRPSURMRV9ESVNBQkxFIDw8IF9fZmZzKGRkLT5hdXRvaWRsZV9tYXNrKTsKKwlfX3Jhd193cml0ZWwodiwgZGQtPmF1dG9pZGxlX3JlZyk7CiB9CiAKIC8qIENsb2NrIGNvbnRyb2wgZm9yIERQTEwgb3V0cHV0cyAqLwpAQCAtNDgyLDggKzQ4OSwxMCBAQAogCWZvciAoY2xrcCA9IG9uY2hpcF8zNHh4X2Nsa3M7CiAJICAgICBjbGtwIDwgb25jaGlwXzM0eHhfY2xrcyArIEFSUkFZX1NJWkUob25jaGlwXzM0eHhfY2xrcyk7CiAJICAgICBjbGtwKyspIHsKLQkJaWYgKCgqY2xrcCktPmZsYWdzICYgY3B1X2Nsa2ZsZykKKwkJaWYgKCgqY2xrcCktPmZsYWdzICYgY3B1X2Nsa2ZsZykgewogCQkJY2xrX3JlZ2lzdGVyKCpjbGtwKTsKKwkJCW9tYXAyX2luaXRfY2xrX2Nsa2RtKCpjbGtwKTsKKwkJfQogCX0KIAogCS8qIFJFVklTSVQ6IE5vdCB5ZXQgcmVhZHkgZm9yIE9NQVAzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguaAppbmRleCBlYzY2NDQ1Li5jMzhhOGEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmgKQEAgLTQ3OCw3ICs0NzgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgY29yZV9ja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLCAgICAgIC5yYXRlcyA9IGRwbGxfYnlwYXNzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnN5c19jaywJICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAogCXsgLnBhcmVudCA9ICZkcGxsM19tMl9jaywgLnJhdGVzID0gZHBsbF9sb2NrZWRfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSBOVUxMIH0KIH07CkBAIC00OTUsNyArNDk1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRwbGwzX20yeDJfY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJnN5c19jaywgICAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeXNfY2ssCSAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDNfeDJfY2ssIC5yYXRlcyA9IGRwbGxfbG9ja2VkX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwpAQCAtNTQxLDcgKzU0MSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBlbXVfY29yZV9hbHdvbl9ja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLCAgICAgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDNfbTN4Ml9jaywgLnJhdGVzID0gZHBsbF9sb2NrZWRfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSBOVUxMIH0KIH07CkBAIC02MzMsNyArNjMzLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIG9tYXBfOTZtX2Fsd29uX2Zja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLCAgICAgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDRfbTJ4Ml9jaywgLnJhdGVzID0gZHBsbF9sb2NrZWRfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSBOVUxMIH0KIH07CkBAIC02NTksNyArNjU5LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGNtXzk2bV9mY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJnN5c19jaywgICAgICAgIC5yYXRlcyA9IGRwbGxfYnlwYXNzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnN5c19jaywJICAgIC5yYXRlcyA9IGRwbGxfYnlwYXNzX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gJmRwbGw0X20yeDJfY2ssIC5yYXRlcyA9IGRwbGxfbG9ja2VkX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwpAQCAtNzAxLDcgKzcwMSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB2aXJ0X29tYXBfNTRtX2Zja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLCAgICAgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgICAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDRfbTN4Ml9jaywgLnJhdGVzID0gZHBsbF9sb2NrZWRfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSBOVUxMIH0KIH07CkBAIC05MTEsNyArOTExLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIG9tYXBfMTIwbV9mY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJnN5c19jaywgICAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeXNfY2ssCSAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDVfbTJfY2ssIC5yYXRlcyA9IGRwbGxfbG9ja2VkX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwpAQCAtOTE5LDEzICs5MTksMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBfMTIwbV9mY2sgPSB7CiAJLm5hbWUJCT0gIm9tYXBfMTIwbV9mY2siLAogCS5wYXJlbnQJCT0gJmRwbGw1X20yX2NrLAotCS5pbml0ICAgICAgICAgICA9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcgICAgID0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0lETEVTVDIpLAotCS5jbGtzZWxfbWFzayAgICA9IE9NQVAzNDMwRVMyX1NUX1BFUklQSDJfQ0xLX01BU0ssCi0JLmNsa3NlbCAgICAgICAgID0gb21hcF8xMjBtX2Zja19jbGtzZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9JRExFU1QyKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMEVTMl9TVF9QRVJJUEgyX0NMS19NQVNLLAorCS5jbGtzZWwJCT0gb21hcF8xMjBtX2Zja19jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMyIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCi0JLnJlY2FsYyAgICAgICAgID0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKIC8qIENNIEVYVEVSTkFMIENMT0NLIE9VVFBVVFMgKi8KQEAgLTEwMzQsNyArMTAzNCw3IEBACiAgKiBjYWxsZWQgJ2RwbGwxX2ZjaycKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbXB1X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZkcGxsMV9mY2ssICAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZkcGxsMV9mY2ssCSAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAogCXsgLnBhcmVudCA9ICZkcGxsMV94Mm0yX2NrLCAucmF0ZXMgPSBkcGxsX2xvY2tlZF9yYXRlcyB9LAogCXsgLnBhcmVudCA9IE5VTEwgfQogfTsKQEAgLTEwNDgsNiArMTA0OCw3IEBACiAJLmNsa3NlbAkJPSBtcHVfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCB8IFJBVEVfUFJPUEFHQVRFUyB8CiAJCQkJUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gIm1wdV9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKQEAgLTEwNzUsNiArMTA3Niw4IEBACiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKKy8qIFhYWCBXaGF0IGFib3V0IG5lb25fY2xrZG0gPyAqLworCiAvKgogICogUkVWSVNJVDogVGhpcyBjbG9jayBpcyBuZXZlciBzcGVjaWZpY2FsbHkgZGVmaW5lZCBpbiB0aGUgMzQzMCBUUk0sCiAgKiBhbHRob3VnaCBpdCBpcyByZWZlcmVuY2VkIC0gc28gdGhpcyBpcyBhIGd1ZXNzCkBAIC0xMTA3LDcgKzExMTAsNyBAQAogICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGl2YTJfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmRwbGwyX2ZjaywgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZkcGxsMl9mY2ssCSAgLnJhdGVzID0gZHBsbF9ieXBhc3NfcmF0ZXMgfSwKIAl7IC5wYXJlbnQgPSAmZHBsbDJfbTJfY2ssIC5yYXRlcyA9IGRwbGxfbG9ja2VkX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwpAQCAtMTEyMyw2ICsxMTI2LDcgQEAKIAkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TVF9JVkEyX0NMS19NQVNLLAogCS5jbGtzZWwJCT0gaXZhMl9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTLAorCS5jbGtkbV9uYW1lCT0gIml2YTJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0xMTM3LDYgKzExNDEsNyBAQAogCS5jbGtzZWwJCT0gZGl2Ml9jb3JlX2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfAogCQkJCVBBUkVOVF9DT05UUk9MU19DTE9DSywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIApAQCAtMTE1NCw2ICsxMTU5LDcgQEAKIAkuY2xrc2VsCQk9IGRpdjJfbDNfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCB8IFJBVEVfUFJPUEFHQVRFUyB8CiAJCQkJUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiAKIH07CkBAIC0xMTgzLDQzICsxMTg5LDU3IEBACiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBnZnhfbDNfZmNrID0gewotCS5uYW1lCQk9ICJnZnhfbDNfZmNrIiwKKy8qIFZpcnR1YWwgcGFyZW50IGNsb2NrIGZvciBnZnhfbDNfaWNrIGFuZCBnZnhfbDNfZmNrICovCitzdGF0aWMgc3RydWN0IGNsayBnZnhfbDNfY2sgPSB7CisJLm5hbWUJCT0gImdmeF9sM19jayIsCiAJLnBhcmVudAkJPSAmbDNfaWNrLAogCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVBfRU5fR0ZYX1NISUZULAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMSwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2wzX2ZjayA9IHsKKwkubmFtZQkJPSAiZ2Z4X2wzX2ZjayIsCisJLnBhcmVudAkJPSAmZ2Z4X2wzX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCiAJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fQ0xLU0VMKSwKIAkuY2xrc2VsX21hc2sJPSBPTUFQX0NMS1NFTF9HRlhfTUFTSywKIAkuY2xrc2VsCQk9IGdmeF9sM19jbGtzZWwsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMxIHwgUkFURV9QUk9QQUdBVEVTLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMSB8IFJBVEVfUFJPUEFHQVRFUyB8CisJCQkJUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2wzX2ljayA9IHsKIAkubmFtZQkJPSAiZ2Z4X2wzX2ljayIsCi0JLnBhcmVudAkJPSAmbDNfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQX0VOX0dGWF9TSElGVCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0MzBFUzEsCisJLnBhcmVudAkJPSAmZ2Z4X2wzX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMSB8IFBBUkVOVF9DT05UUk9MU19DTE9DSywKKwkuY2xrZG1fbmFtZQk9ICJnZnhfMzQzMGVzMV9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9jZzFfY2sgPSB7CiAJLm5hbWUJCT0gImdmeF9jZzFfY2siLAogCS5wYXJlbnQJCT0gJmdmeF9sM19mY2ssIC8qIFJFVklTSVQ6IGNvcnJlY3Q/ICovCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMV9FTl8yRF9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0MzBFUzEsCisJLmNsa2RtX25hbWUJPSAiZ2Z4XzM0MzBlczFfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBnZnhfY2cyX2NrID0gewogCS5uYW1lCQk9ICJnZnhfY2cyX2NrIiwKIAkucGFyZW50CQk9ICZnZnhfbDNfZmNrLCAvKiBSRVZJU0lUOiBjb3JyZWN0PyAqLworCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa19jbGtkbSwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fM0RfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMxLAorCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTI1MiwxNSArMTI3MiwxOCBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwRVMyX0NMS1NFTF9TR1hfTUFTSywKIAkuY2xrc2VsCQk9IHNneF9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMyLAorCS5jbGtkbV9uYW1lCT0gInNneF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHNneF9pY2sgPSB7CiAJLm5hbWUJCT0gInNneF9pY2siLAogCS5wYXJlbnQJCT0gJmwzX2ljaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfU0dYX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1NHWF9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0MzBFUzIsCisJLmNsa2RtX25hbWUJPSAic2d4X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTI2OSw5ICsxMjkyLDExIEBACiBzdGF0aWMgc3RydWN0IGNsayBkMmRfMjZtX2ZjayA9IHsKIAkubmFtZQkJPSAiZDJkXzI2bV9mY2siLAogCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fRDJEX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMSwKKwkuY2xrZG1fbmFtZQk9ICJkMmRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xMjkxLDYgKzEzMTYsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxMF9NQVNLLAogCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKQEAgLTEzMDQsNiArMTMzMCw3IEBACiAJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDExX01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIApAQCAtMTM0MSw2ICsxMzY4LDcgQEAKIAkucGFyZW50CQk9ICZvbWFwXzk2bV9mY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTEzNTEsNiArMTM3OSw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fTU1DM19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0MzBFUzIsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTEzNjEsNiArMTM5MCw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMl9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTEzNzAsNiArMTQwMCw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTVNQUk9fU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xMzgwLDYgKzE0MTEsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01NQzFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xMzkwLDE2ICsxNDIyLDE4IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDM19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGkyYzJfZmNrID0gewogCS5uYW1lCQk9ICJpMmNfZmNrIiwKLQkuaWQgCQk9IDIsCisJLmlkCQk9IDIsCiAJLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNDEwLDYgKzE0NDQsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNDQzLDYgKzE0NzgsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQNV9DTEtTX01BU0ssCiAJLmNsa3NlbAkJPSBtY2JzcF8xNV9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0xNDU2LDYgKzE0OTIsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQMV9DTEtTX01BU0ssCiAJLmNsa3NlbAkJPSBtY2JzcF8xNV9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0xNDY2LDYgKzE1MDMsNyBAQAogCS5wYXJlbnQJCT0gJm9tYXBfNDhtX2ZjaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfAogCQkJCVBBUkVOVF9DT05UUk9MU19DTE9DSywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTU0Myw2ICsxNTgxLDcgQEAKIAkucGFyZW50CQk9ICZvbWFwXzEybV9mY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE1ODEsNiArMTYyMCw3IEBACiAJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX1NTSV9NQVNLLAogCS5jbGtzZWwJCT0gc3NpX3Nzcl9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0xNTk2LDExICsxNjM2LDE3IEBACiAKIC8qIENPUkVfTDNfSUNLIGJhc2VkIGNsb2NrcyAqLwogCisvKgorICogWFhYIG11c3QgYWRkIGNsa19lbmFibGUvY2xrX2Rpc2FibGUgZm9yIHRoZXNlIGlmIHN0YW5kYXJkIGNvZGUgd29uJ3QKKyAqIGhhbmRsZSBpdAorICovCiBzdGF0aWMgc3RydWN0IGNsayBjb3JlX2wzX2ljayA9IHsKIAkubmFtZQkJPSAiY29yZV9sM19pY2siLAogCS5wYXJlbnQJCT0gJmwzX2ljaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE2MTAsNiArMTY1Niw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSFNPVEdVU0JfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNjE5LDYgKzE2NjYsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NEUkNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE2MjcsNiArMTY3NSw3IEBACiAJLnBhcmVudAkJPSAmY29yZV9sM19pY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUEFSRU5UX0NPTlRST0xTX0NMT0NLIHwKIAkJCQlFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTY1NCw4ICsxNzAzLDEwIEBACiBzdGF0aWMgc3RydWN0IGNsayBjb3JlX2w0X2ljayA9IHsKIAkubmFtZQkJPSAiY29yZV9sNF9pY2siLAogCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE2NjUsNiArMTcxNiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjMpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fVVNCVExMX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMiwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTY3NSw2ICsxNzI3LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9NTUMzX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMiwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTY4NSw2ICsxNzM4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9JQ1JfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNjk0LDYgKzE3NDgsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0FFUzJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNzAzLDYgKzE3NTgsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NIQTEyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTcxMiw2ICsxNzY4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9ERVMyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTcyMiw2ICsxNzc5LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NTUMyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTczMiw2ICsxNzkwLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NTUMxX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTc0MSw2ICsxODAwLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NU1BST19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE3NTAsNiArMTgxMCw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSERRX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTc2MCw2ICsxODIxLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ1NQSTRfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xNzcwLDYgKzE4MzIsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJM19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE3ODAsNiArMTg0Myw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNTUEkyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTc5MCw2ICsxODU0LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ1NQSTFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODAwLDYgKzE4NjUsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODEwLDYgKzE4NzYsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODIwLDYgKzE4ODcsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODI5LDYgKzE4OTcsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTgzOCw2ICsxOTA3LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9VQVJUMV9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE4NDcsNiArMTkxNyw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMTFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODU2LDYgKzE5MjcsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEwX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTg2Niw2ICsxOTM4LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDVfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xODc2LDYgKzE5NDksNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQMV9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTE4ODUsNiArMTk1OSw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fRkFDX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMSwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTg5NCw2ICsxOTY5LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQUlMQk9YRVNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xOTEzLDYgKzE5ODksNyBAQAogCS5wYXJlbnQJCT0gJmw0X2ljaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfAogCQkJCVBBUkVOVF9DT05UUk9MU19DTE9DSywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMTkyMiw2ICsxOTk5LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TU0lfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0xOTk2LDcgKzIwNzQsNyBAQAogCiAvKiBEU1MgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRzczFfYWx3b25fZmNrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZzeXNfY2ssICAgICAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeXNfY2ssCSAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAogCXsgLnBhcmVudCA9ICZkcGxsNF9tNHgyX2NrLCAucmF0ZXMgPSBkcGxsX2xvY2tlZF9yYXRlcyB9LAogCXsgLnBhcmVudCA9IE5VTEwgfQogfTsKQEAgLTIwMTEsMzMgKzIwODksNDAgQEAKIAkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TVF9QRVJJUEhfQ0xLX01BU0ssCiAJLmNsa3NlbAkJPSBkc3MxX2Fsd29uX2Zja19jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGRzc190dl9mY2sgPSB7CiAJLm5hbWUJCT0gImRzc190dl9mY2siLAogCS5wYXJlbnQJCT0gJm9tYXBfNTRtX2ZjaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1RWX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkc3NfOTZtX2ZjayA9IHsKIAkubmFtZQkJPSAiZHNzXzk2bV9mY2siLAogCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2ZjaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1RWX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBkc3MyX2Fsd29uX2ZjayA9IHsKIAkubmFtZQkJPSAiZHNzMl9hbHdvbl9mY2siLAogCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIwNDUsMTYgKzIxMzAsMTggQEAKIAkvKiBIYW5kbGVzIGJvdGggTDMgYW5kIEw0IGNsb2NrcyAqLwogCS5uYW1lCQk9ICJkc3NfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9pY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0RTU19NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9DTV9JQ0xLRU5fRFNTX0VOX0RTU19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogLyogQ0FNICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGNhbV9tY2xrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZzeXNfY2ssICAgICAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeXNfY2ssCSAgICAucmF0ZXMgPSBkcGxsX2J5cGFzc19yYXRlcyB9LAogCXsgLnBhcmVudCA9ICZkcGxsNF9tNXgyX2NrLCAucmF0ZXMgPSBkcGxsX2xvY2tlZF9yYXRlcyB9LAogCXsgLnBhcmVudCA9IE5VTEwgfQogfTsKQEAgLTIwNjksMjQgKzIxNTYsMTkgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9DQU1fTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQ0FNX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJjYW1fY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBjYW1fbDNfaWNrID0gewotCS5uYW1lCQk9ICJjYW1fbDNfaWNrIiwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfQ0FNX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0NBTV9TSElGVCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9sNF9pY2sgPSB7Ci0JLm5hbWUJCT0gImNhbV9sNF9pY2siLAorc3RhdGljIHN0cnVjdCBjbGsgY2FtX2ljayA9IHsKKwkvKiBIYW5kbGVzIGJvdGggTDMgYW5kIEw0IGNsb2NrcyAqLworCS5uYW1lCQk9ICJjYW1faWNrIiwKIAkucGFyZW50CQk9ICZsNF9pY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0NBTV9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9DQU1fU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNhbV9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIwOTUsNDUgKzIxNzcsNDUgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfMTIwbV9mY2sgPSB7CiAJLm5hbWUJCT0gInVzYmhvc3RfMTIwbV9mY2siLAogCS5wYXJlbnQJCT0gJm9tYXBfMTIwbV9mY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fVVNCSE9TVDJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMyLAorCS5jbGtkbV9uYW1lCT0gInVzYmhvc3RfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB1c2Job3N0XzQ4bV9mY2sgPSB7CiAJLm5hbWUJCT0gInVzYmhvc3RfNDhtX2ZjayIsCiAJLnBhcmVudAkJPSAmb21hcF80OG1fZmNrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa19jbGtkbSwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTQkhPU1QxX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMiwKKwkuY2xrZG1fbmFtZQk9ICJ1c2Job3N0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgdXNiaG9zdF9sM19pY2sgPSB7Ci0JLm5hbWUJCT0gInVzYmhvc3RfbDNfaWNrIiwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0JIT1NUX1NISUZULAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiaG9zdF9sNF9pY2sgPSB7Ci0JLm5hbWUJCT0gInVzYmhvc3RfbDRfaWNrIiwKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfaWNrID0geworCS8qIEhhbmRsZXMgYm90aCBMMyBhbmQgTDQgY2xvY2tzICovCisJLm5hbWUJCT0gInVzYmhvc3RfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9pY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fVVNCSE9TVF9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0MzBFUzIsCisJLmNsa2RtX25hbWUJPSAidXNiaG9zdF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3Rfc2FyX2ZjayA9IHsKIAkubmFtZQkJPSAidXNiaG9zdF9zYXJfZmNrIiwKIAkucGFyZW50CQk9ICZvc2Nfc3lzX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa19jbGtkbSwKIAkuZW5hYmxlX3JlZwk9IE9NQVBfUFJNX1JFR0FERFIoT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIFBNX1BXU1RDVFJMKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX1NBVkVBTkRSRVNUT1JFX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzMEVTMiwKKwkuY2xrZG1fbmFtZQk9ICJ1c2Job3N0X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjE3NSw2ICsyMjU3LDcgQEAKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIAorLyogWFhYIHNob3VsZCBncHQxJ3MgY2xrc2VsIGhhdmUgd2t1cF8zMmtfZmNrIGFzIHRoZSAzMmsgb3B0PyAqLwogc3RhdGljIHN0cnVjdCBjbGsgZ3B0MV9mY2sgPSB7CiAJLm5hbWUJCT0gImdwdDFfZmNrIiwKIAkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LApAQCAtMjE4NCwxMyArMjI2NywxNiBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxX01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgd2t1cF8zMmtfZmNrID0gewogCS5uYW1lCQk9ICJ3a3VwXzMya19mY2siLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa19jbGtkbSwKIAkucGFyZW50CQk9ICZvbWFwXzMya19mY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIyMDAsNiArMjI4Niw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMV9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIyMDksNiArMjI5Niw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9XRFQyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjIxNiw2ICsyMzA0LDcgQEAKIAkubmFtZQkJPSAid2t1cF9sNF9pY2siLAogCS5wYXJlbnQJCT0gJnN5c19jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjIyNyw2ICsyMzE2LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTSU1PQ1BfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDMwRVMyLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yMjM2LDYgKzIzMjYsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fV0RUMl9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIyNDUsNiArMjMzNiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9XRFQxX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjI1NCw2ICsyMzQ2LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU8xX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjI2MywxNSArMjM1NiwxOCBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fMzJLU1lOQ19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKKy8qIFhYWCBUaGlzIGNsb2NrIG5vIGxvbmdlciBleGlzdHMgaW4gMzQzMCBUUk0gcmV2IEYgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDEyX2ljayA9IHsKIAkubmFtZQkJPSAiZ3B0MTJfaWNrIiwKIAkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEyX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjI4MSw2ICsyMzc3LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDFfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yMjkxLDE2ICsyMzg4LDIwIEBACiBzdGF0aWMgc3RydWN0IGNsayBwZXJfOTZtX2ZjayA9IHsKIAkubmFtZQkJPSAicGVyXzk2bV9mY2siLAogCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2Fsd29uX2ZjaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtfY2xrZG0sCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwKIAkJCQlQQVJFTlRfQ09OVFJPTFNfQ0xPQ0ssCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgcGVyXzQ4bV9mY2sgPSB7CiAJLm5hbWUJCT0gInBlcl80OG1fZmNrIiwKIAkucGFyZW50CQk9ICZvbWFwXzQ4bV9mY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrX2Nsa2RtLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCB8IFJBVEVfUFJPUEFHQVRFUyB8CiAJCQkJUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTIzMTAsNiArMjQxMSw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQzX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yMzIyLDYgKzI0MjQsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQyX01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzM0LDYgKzI0MzcsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQzX01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzQ2LDYgKzI0NTAsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ0X01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzU4LDYgKzI0NjMsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ1X01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzcwLDYgKzI0NzYsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ2X01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzgyLDYgKzI0ODksNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ3X01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yMzk0LDYgKzI1MDIsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ4X01BU0ssCiAJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNDA2LDEyICsyNTE1LDE0IEBACiAJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDlfTUFTSywKIAkuY2xrc2VsCQk9IG9tYXAzNDN4X2dwdF9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHBlcl8zMmtfYWx3b25fZmNrID0gewogCS5uYW1lCQk9ICJwZXJfMzJrX2Fsd29uX2ZjayIsCiAJLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CkBAIC0yNDIyLDYgKzI1MzMsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNl9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjQzMSw2ICsyNTQzLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzVfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI0NDAsNiArMjU1Myw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU80X1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yNDQ5LDYgKzI1NjMsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPM19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjQ1OCw2ICsyNTczLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI0NjcsNiArMjU4Myw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI0NzUsNiArMjU5Miw3IEBACiAJLnBhcmVudAkJPSAmbDRfaWNrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCB8IFJBVEVfUFJPUEFHQVRFUyB8CiAJCQkJUEFSRU5UX0NPTlRST0xTX0NMT0NLLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI0ODQsNiArMjYwMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU82X1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yNDkzLDYgKzI2MTIsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNV9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjUwMiw2ICsyNjIyLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzRfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1MTEsNiArMjYzMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU8zX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yNTIwLDYgKzI2NDIsNyBAQAogCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCiAJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMl9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjUyOSw2ICsyNjUyLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fV0RUM19TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjUzOCw2ICsyNjYyLDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1NDcsNiArMjY3Miw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDlfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1NTYsNiArMjY4Miw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDhfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1NjUsNiArMjY5Miw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDdfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1NzQsNiArMjcwMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDZfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1ODMsNiArMjcxMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDVfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI1OTIsNiArMjcyMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDRfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI2MDEsNiArMjczMiw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDNfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI2MTAsNiArMjc0Miw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDJfU0hJRlQsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKQEAgLTI2MjAsNiArMjc1Myw3IEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQMl9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIApAQCAtMjYzMCw2ICsyNzY0LDcgQEAKIAkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAogCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AzX1NISUZULAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCkBAIC0yNjQwLDEyICsyNzc1LDEzIEBACiAJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKIAkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQNF9TSElGVCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1gsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbWNic3BfMjM0X2Nsa3NlbFtdID0gewogCXsgLnBhcmVudCA9ICZwZXJfOTZtX2ZjaywgLnJhdGVzID0gY29tbW9uX21jYnNwXzk2bV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZtY2JzcF9jbGtzLCAgIC5yYXRlcyA9IGNvbW1vbl9tY2JzcF9tY2JzcF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZtY2JzcF9jbGtzLCAgLnJhdGVzID0gY29tbW9uX21jYnNwX21jYnNwX3JhdGVzIH0sCiAJeyAucGFyZW50ID0gTlVMTCB9CiB9OwogCkBAIC0yNjU5LDYgKzI3OTUsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQMl9DTEtTX01BU0ssCiAJLmNsa3NlbAkJPSBtY2JzcF8yMzRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNjcyLDYgKzI4MDksNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQM19DTEtTX01BU0ssCiAJLmNsa3NlbAkJPSBtY2JzcF8yMzRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNjg1LDYgKzI4MjMsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQNF9DTEtTX01BU0ssCiAJLmNsa3NlbAkJPSBtY2JzcF8yMzRfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNzMyLDYgKzI4NzEsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX01VWF9DVFJMX01BU0ssCiAJLmNsa3NlbAkJPSBlbXVfc3JjX2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNzU1LDYgKzI4OTUsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9QQ0xLX01BU0ssCiAJLmNsa3NlbAkJPSBwY2xrX2VtdV9jbGtzZWwsCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYIHwgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCisJLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKIAkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAogfTsKIApAQCAtMjc3Nyw2ICsyOTE4LDcgQEAKIAkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfUENMS1gyX01BU0ssCiAJLmNsa3NlbAkJPSBwY2xreDJfZW11X2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yNzkyLDYgKzI5MzQsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9BVENMS19NQVNLLAogCS5jbGtzZWwJCT0gYXRjbGtfZW11X2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yODAyLDYgKzI5NDUsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX1RSQUNFX01VWF9DVFJMX01BU0ssCiAJLmNsa3NlbAkJPSBlbXVfc3JjX2Nsa3NlbCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDM0M1ggfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCkBAIC0yODI0LDYgKzI5NjgsNyBAQAogCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9UUkFDRUNMS19NQVNLLAogCS5jbGtzZWwJCT0gdHJhY2VjbGtfY2xrc2VsLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMzQzWCB8IEFMV0FZU19FTkFCTEVELAorCS5jbGtkbV9uYW1lCT0gImVtdV9jbGtkbSIsCiAJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKQEAgLTI4NTMsMTEgKzI5OTgsMTMgQEAKIAkubmFtZQkJPSAic3JfbDRfaWNrIiwKIAkucGFyZW50CQk9ICZsNF9pY2ssCiAJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAzNDNYLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAogCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCiB9OwogCiAvKiBTRUNVUkVfMzJLX0ZDSyBjbG9ja3MgKi8KIAorLyogWFhYIFRoaXMgY2xvY2sgbm8gbG9uZ2VyIGV4aXN0cyBpbiAzNDMwIFRSTSByZXYgRiAqLwogc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTJfZmNrID0gewogCS5uYW1lCQk9ICJncHQxMl9mY2siLAogCS5wYXJlbnQJCT0gJnNlY3VyZV8zMmtfZmNrLApAQCAtMjkzMyw2ICszMDgwLDcgQEAKIAkmbDNfaWNrLAogCSZsNF9pY2ssCiAJJnJtX2ljaywKKwkmZ2Z4X2wzX2NrLAogCSZnZnhfbDNfZmNrLAogCSZnZnhfbDNfaWNrLAogCSZnZnhfY2cxX2NrLApAQCAtMzAxNCwxMiArMzE2MiwxMCBAQAogCSZkc3MyX2Fsd29uX2ZjaywKIAkmZHNzX2ljaywKIAkmY2FtX21jbGssCi0JJmNhbV9sM19pY2ssCi0JJmNhbV9sNF9pY2ssCisJJmNhbV9pY2ssCiAJJnVzYmhvc3RfMTIwbV9mY2ssCiAJJnVzYmhvc3RfNDhtX2ZjaywKLQkmdXNiaG9zdF9sM19pY2ssCi0JJnVzYmhvc3RfbDRfaWNrLAorCSZ1c2Job3N0X2ljaywKIAkmdXNiaG9zdF9zYXJfZmNrLAogCSZ1c2ltX2ZjaywKIAkmZ3B0MV9mY2ssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzY2U5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIE9NQVAyLzMgY2xvY2tkb21haW4gZnJhbWV3b3JrIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5IGFuZCBKb3VuaSBIw7ZnYW5kZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZkZWYgQ09ORklHX09NQVBfREVCVUdfQ0xPQ0tET01BSU4KKyMgIGRlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgorCisjaW5jbHVkZSAicHJtLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgorI2luY2x1ZGUgImNtLmgiCisKKyNpbmNsdWRlIDxtYWNoL3Bvd2VyZG9tYWluLmg+CisjaW5jbHVkZSA8bWFjaC9jbG9ja2RvbWFpbi5oPgorCisvKiBjbGtkbV9saXN0IGNvbnRhaW5zIGFsbCByZWdpc3RlcmVkIHN0cnVjdCBjbG9ja2RvbWFpbnMgKi8KK3N0YXRpYyBMSVNUX0hFQUQoY2xrZG1fbGlzdCk7CisKKy8qIGNsa2RtX211dGV4IHByb3RlY3RzIGNsa2RtX2xpc3QgYWRkIGFuZCBkZWwgb3BzICovCitzdGF0aWMgREVGSU5FX01VVEVYKGNsa2RtX211dGV4KTsKKworLyogYXJyYXkgb2YgcG93ZXJkb21haW4gZGVwcyB0byBiZSBhZGRlZC9yZW1vdmVkIHdoZW4gY2xrZG0gaW4gaHdzdXAgbW9kZSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICphdXRvZGVwczsKKworCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLworCisvKgorICogX2F1dG9kZXBfbG9va3VwIC0gcmVzb2x2ZSBhdXRvZGVwIHB3cmRtIG5hbWVzIHRvIHB3cmRtIHBvaW50ZXJzOyBzdG9yZQorICogQGF1dG9kZXA6IHN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICogdG8gcmVzb2x2ZQorICoKKyAqIFJlc29sdmUgYXV0b2RlcCBwb3dlcmRvbWFpbiBuYW1lcyB0byBwb3dlcmRvbWFpbiBwb2ludGVycyB2aWEKKyAqIHB3cmRtX2xvb2t1cCgpIGFuZCBzdG9yZSB0aGUgcG9pbnRlcnMgaW4gdGhlIGF1dG9kZXAgc3RydWN0dXJlLiAgQW4KKyAqICJhdXRvZGVwIiBpcyBhIHBvd2VyZG9tYWluIHNsZWVwL3dha2V1cCBkZXBlbmRlbmN5IHRoYXQgaXMKKyAqIGF1dG9tYXRpY2FsbHkgYWRkZWQgYW5kIHJlbW92ZWQgd2hlbmV2ZXIgY2xvY2tzIGluIHRoZSBhc3NvY2lhdGVkCisgKiBjbG9ja2RvbWFpbiBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCAocmVzcGVjdGl2ZWx5KSB3aGVuIHRoZQorICogY2xvY2tkb21haW4gaXMgaW4gaGFyZHdhcmUtc3VwZXJ2aXNlZCBtb2RlLglNZWFudCB0byBiZSBjYWxsZWQKKyAqIG9uY2UgYXQgY2xvY2tkb21haW4gbGF5ZXIgaW5pdGlhbGl6YXRpb24sIHNpbmNlIHRoZXNlIHNob3VsZCByZW1haW4KKyAqIGZpeGVkIGZvciBhIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCitzdGF0aWMgdm9pZCBfYXV0b2RlcF9sb29rdXAoc3RydWN0IGNsa2RtX3B3cmRtX2F1dG9kZXAgKmF1dG9kZXApCit7CisJc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTsKKworCWlmICghYXV0b2RlcCkKKwkJcmV0dXJuOworCisJaWYgKCFvbWFwX2NoaXBfaXMoYXV0b2RlcC0+b21hcF9jaGlwKSkKKwkJcmV0dXJuOworCisJcHdyZG0gPSBwd3JkbV9sb29rdXAoYXV0b2RlcC0+cHdyZG1fbmFtZSk7CisJaWYgKCFwd3JkbSkgeworCQlwcl9kZWJ1ZygiY2xvY2tkb21haW46IF9hdXRvZGVwX2xvb2t1cDogcG93ZXJkb21haW4gJXMgIgorCQkJICJkb2VzIG5vdCBleGlzdFxuIiwgYXV0b2RlcC0+cHdyZG1fbmFtZSk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJYXV0b2RlcC0+cHdyZG0gPSBwd3JkbTsKKworCXJldHVybjsKK30KKworLyoKKyAqIF9jbGtkbV9hZGRfYXV0b2RlcHMgLSBhZGQgYXV0byBzbGVlcGRlcHMvd2tkZXBzIHRvIGNsa2RtIHVwb24gY2xvY2sgZW5hYmxlCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKgorICogQWRkIHRoZSAiYXV0b2RlcCIgc2xlZXAgJiB3YWtldXAgZGVwZW5kZW5jaWVzIHRvIGNsb2NrZG9tYWluICdjbGtkbScKKyAqIGluIGhhcmR3YXJlLXN1cGVydmlzZWQgbW9kZS4gIE1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIGNsb2NrIGZyYW1ld29yaworICogd2hlbiBhIGNsb2NrIGluc2lkZSBjbG9ja2RvbWFpbiAnY2xrZG0nIGlzIGVuYWJsZWQuCU5vIHJldHVybiB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQgX2Nsa2RtX2FkZF9hdXRvZGVwcyhzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKQoreworCXN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICphdXRvZGVwOworCisJZm9yIChhdXRvZGVwID0gYXV0b2RlcHM7IGF1dG9kZXAtPnB3cmRtX25hbWU7IGF1dG9kZXArKykgeworCQlpZiAoIWF1dG9kZXAtPnB3cmRtKQorCQkJY29udGludWU7CisKKwkJcHJfZGVidWcoImNsb2NrZG9tYWluOiBhZGRpbmcgJXMgc2xlZXBkZXAvd2tkZXAgZm9yICIKKwkJCSAicHdyZG0gJXNcbiIsIGF1dG9kZXAtPnB3cmRtX25hbWUsCisJCQkgY2xrZG0tPnB3cmRtLT5uYW1lKTsKKworCQlwd3JkbV9hZGRfc2xlZXBkZXAoY2xrZG0tPnB3cmRtLCBhdXRvZGVwLT5wd3JkbSk7CisJCXB3cmRtX2FkZF93a2RlcChjbGtkbS0+cHdyZG0sIGF1dG9kZXAtPnB3cmRtKTsKKwl9Cit9CisKKy8qCisgKiBfY2xrZG1fYWRkX2F1dG9kZXBzIC0gcmVtb3ZlIGF1dG8gc2xlZXBkZXBzL3drZGVwcyBmcm9tIGNsa2RtCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKgorICogUmVtb3ZlIHRoZSAiYXV0b2RlcCIgc2xlZXAgJiB3YWtldXAgZGVwZW5kZW5jaWVzIGZyb20gY2xvY2tkb21haW4gJ2Nsa2RtJworICogaW4gaGFyZHdhcmUtc3VwZXJ2aXNlZCBtb2RlLiAgTWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gY2xvY2sgZnJhbWV3b3JrCisgKiB3aGVuIGEgY2xvY2sgaW5zaWRlIGNsb2NrZG9tYWluICdjbGtkbScgaXMgZGlzYWJsZWQuICBObyByZXR1cm4gdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkIF9jbGtkbV9kZWxfYXV0b2RlcHMoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSkKK3sKKwlzdHJ1Y3QgY2xrZG1fcHdyZG1fYXV0b2RlcCAqYXV0b2RlcDsKKworCWZvciAoYXV0b2RlcCA9IGF1dG9kZXBzOyBhdXRvZGVwLT5wd3JkbV9uYW1lOyBhdXRvZGVwKyspIHsKKwkJaWYgKCFhdXRvZGVwLT5wd3JkbSkKKwkJCWNvbnRpbnVlOworCisJCXByX2RlYnVnKCJjbG9ja2RvbWFpbjogcmVtb3ZpbmcgJXMgc2xlZXBkZXAvd2tkZXAgZm9yICIKKwkJCSAicHdyZG0gJXNcbiIsIGF1dG9kZXAtPnB3cmRtX25hbWUsCisJCQkgY2xrZG0tPnB3cmRtLT5uYW1lKTsKKworCQlwd3JkbV9kZWxfc2xlZXBkZXAoY2xrZG0tPnB3cmRtLCBhdXRvZGVwLT5wd3JkbSk7CisJCXB3cmRtX2RlbF93a2RlcChjbGtkbS0+cHdyZG0sIGF1dG9kZXAtPnB3cmRtKTsKKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqX2Nsa2RtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0sICp0ZW1wX2Nsa2RtOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWNsa2RtID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF9jbGtkbSwgJmNsa2RtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKCFzdHJjbXAobmFtZSwgdGVtcF9jbGtkbS0+bmFtZSkpIHsKKwkJCWNsa2RtID0gdGVtcF9jbGtkbTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNsa2RtOworfQorCisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KKworLyoqCisgKiBjbGtkbV9pbml0IC0gc2V0IHVwIHRoZSBjbG9ja2RvbWFpbiBsYXllcgorICogQGNsa2Rtczogb3B0aW9uYWwgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjbG9ja2RvbWFpbnMgdG8gcmVnaXN0ZXIKKyAqIEBpbml0X2F1dG9kZXBzOiBvcHRpb25hbCBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGF1dG9kZXBzIHRvIHJlZ2lzdGVyCisgKgorICogU2V0IHVwIGludGVybmFsIHN0YXRlLiAgSWYgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsb2NrZG9tYWlucworICogd2FzIHN1cHBsaWVkLCBsb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgY2xvY2tkb21haW5zLCByZWdpc3RlciBhbGwKKyAqIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybS4JU2ltaWxhcmx5LCBpZiBhCisgKiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsb2NrZG9tYWluLXBvd2VyZG9tYWluIGF1dG9kZXBlbmRlbmNpZXMgd2FzCisgKiBwcm92aWRlZCwgcmVnaXN0ZXIgdGhvc2UuICBObyByZXR1cm4gdmFsdWUuCisgKi8KK3ZvaWQgY2xrZG1faW5pdChzdHJ1Y3QgY2xvY2tkb21haW4gKipjbGtkbXMsCisJCXN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICppbml0X2F1dG9kZXBzKQoreworCXN0cnVjdCBjbG9ja2RvbWFpbiAqKmMgPSBOVUxMOworCXN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICphdXRvZGVwID0gTlVMTDsKKworCWlmIChjbGtkbXMpCisJCWZvciAoYyA9IGNsa2RtczsgKmM7IGMrKykKKwkJCWNsa2RtX3JlZ2lzdGVyKCpjKTsKKworCWF1dG9kZXBzID0gaW5pdF9hdXRvZGVwczsKKwlpZiAoYXV0b2RlcHMpCisJCWZvciAoYXV0b2RlcCA9IGF1dG9kZXBzOyBhdXRvZGVwLT5wd3JkbV9uYW1lOyBhdXRvZGVwKyspCisJCQlfYXV0b2RlcF9sb29rdXAoYXV0b2RlcCk7Cit9CisKKy8qKgorICogY2xrZG1fcmVnaXN0ZXIgLSByZWdpc3RlciBhIGNsb2NrZG9tYWluCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqIHRvIHJlZ2lzdGVyCisgKgorICogQWRkcyBhIGNsb2NrZG9tYWluIHRvIHRoZSBpbnRlcm5hbCBjbG9ja2RvbWFpbiBsaXN0LgorICogUmV0dXJucyAtRUlOVkFMIGlmIGdpdmVuIGEgbnVsbCBwb2ludGVyLCAtRUVYSVNUIGlmIGEgY2xvY2tkb21haW4gaXMKKyAqIGFscmVhZHkgcmVnaXN0ZXJlZCBieSB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBjbGtkbV9yZWdpc3RlcihzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG07CisKKwlpZiAoIWNsa2RtIHx8ICFjbGtkbS0+bmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW9tYXBfY2hpcF9pcyhjbGtkbS0+b21hcF9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwd3JkbSA9IHB3cmRtX2xvb2t1cChjbGtkbS0+cHdyZG1fbmFtZSk7CisJaWYgKCFwd3JkbSkgeworCQlwcl9kZWJ1ZygiY2xvY2tkb21haW46IGNsa2RtX3JlZ2lzdGVyICVzOiBwb3dlcmRvbWFpbiAlcyAiCisJCQkgImRvZXMgbm90IGV4aXN0XG4iLCBjbGtkbS0+bmFtZSwgY2xrZG0tPnB3cmRtX25hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2xrZG0tPnB3cmRtID0gcHdyZG07CisKKwltdXRleF9sb2NrKCZjbGtkbV9tdXRleCk7CisJLyogVmVyaWZ5IHRoYXQgdGhlIGNsb2NrZG9tYWluIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKwlpZiAoX2Nsa2RtX2xvb2t1cChjbGtkbS0+bmFtZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBjcl91bmxvY2s7CisJfTsKKworCWxpc3RfYWRkKCZjbGtkbS0+bm9kZSwgJmNsa2RtX2xpc3QpOworCisJcHdyZG1fYWRkX2Nsa2RtKHB3cmRtLCBjbGtkbSk7CisKKwlwcl9kZWJ1ZygiY2xvY2tkb21haW46IHJlZ2lzdGVyZWQgJXNcbiIsIGNsa2RtLT5uYW1lKTsKKwlyZXQgPSAwOworCitjcl91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjbGtkbV9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGNsa2RtX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGEgY2xvY2tkb21haW4KKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICogdG8gdW5yZWdpc3RlcgorICoKKyAqIFJlbW92ZXMgYSBjbG9ja2RvbWFpbiBmcm9tIHRoZSBpbnRlcm5hbCBjbG9ja2RvbWFpbiBsaXN0LiAgUmV0dXJucworICogLUVJTlZBTCBpZiBjbGtkbSBhcmd1bWVudCBpcyBOVUxMLgorICovCitpbnQgY2xrZG1fdW5yZWdpc3RlcihzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKQoreworCWlmICghY2xrZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJcHdyZG1fZGVsX2Nsa2RtKGNsa2RtLT5wd3JkbSwgY2xrZG0pOworCisJbXV0ZXhfbG9jaygmY2xrZG1fbXV0ZXgpOworCWxpc3RfZGVsKCZjbGtkbS0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZjbGtkbV9tdXRleCk7CisKKwlwcl9kZWJ1ZygiY2xvY2tkb21haW46IHVucmVnaXN0ZXJlZCAlc1xuIiwgY2xrZG0tPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2xrZG1fbG9va3VwIC0gbG9vayB1cCBhIGNsb2NrZG9tYWluIGJ5IG5hbWUsIHJldHVybiBhIHBvaW50ZXIKKyAqIEBuYW1lOiBuYW1lIG9mIGNsb2NrZG9tYWluCisgKgorICogRmluZCBhIHJlZ2lzdGVyZWQgY2xvY2tkb21haW4gYnkgaXRzIG5hbWUuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKKyAqIHN0cnVjdCBjbG9ja2RvbWFpbiBpZiBmb3VuZCwgb3IgTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgKnRlbXBfY2xrZG07CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCisJY2xrZG0gPSBOVUxMOworCisJbXV0ZXhfbG9jaygmY2xrZG1fbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF9jbGtkbSwgJmNsa2RtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKCFzdHJjbXAobmFtZSwgdGVtcF9jbGtkbS0+bmFtZSkpIHsKKwkJCWNsa2RtID0gdGVtcF9jbGtkbTsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmY2xrZG1fbXV0ZXgpOworCisJcmV0dXJuIGNsa2RtOworfQorCisvKioKKyAqIGNsa2RtX2Zvcl9lYWNoIC0gY2FsbCBmdW5jdGlvbiBvbiBlYWNoIHJlZ2lzdGVyZWQgY2xvY2tkb21haW4KKyAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb24gKgorICoKKyAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGZvciBlYWNoIHJlZ2lzdGVyZWQgY2xvY2tkb21haW4uCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIHJldHVybiBhbnl0aGluZyBidXQgMCB0byBiYWlsCisgKiBvdXQgZWFybHkgZnJvbSB0aGUgaXRlcmF0b3IuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGgKKyAqIHRoZSBjbGtkbV9tdXRleCBoZWxkLCBzbyBubyBjbG9ja2RvbWFpbiBzdHJ1Y3R1cmUgbWFuaXB1bGF0aW9uCisgKiBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjaywgYWx0aG91Z2ggaGFyZHdhcmUKKyAqIGNsb2NrZG9tYWluIGNvbnRyb2wgZnVuY3Rpb25zIGFyZSBmaW5lLiAgUmV0dXJucyB0aGUgbGFzdCByZXR1cm4KKyAqIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgd2hpY2ggc2hvdWxkIGJlIDAgZm9yIHN1Y2Nlc3Mgb3IKKyAqIGFueXRoaW5nIGVsc2UgdG8gaW5kaWNhdGUgZmFpbHVyZTsgb3IgLUVJTlZBTCBpZiB0aGUgZnVuY3Rpb24gcG9pbnRlcgorICogaXMgbnVsbC4KKyAqLworaW50IGNsa2RtX2Zvcl9lYWNoKGludCAoKmZuKShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKSkKK3sKKwlzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtOworCWludCByZXQgPSAwOworCisJaWYgKCFmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZjbGtkbV9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtkbSwgJmNsa2RtX2xpc3QsIG5vZGUpIHsKKwkJcmV0ID0gKCpmbikoY2xrZG0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmY2xrZG1fbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGNsa2RtX2dldF9wd3JkbSAtIHJldHVybiBhIHB0ciB0byB0aGUgcHdyZG0gdGhhdCB0aGlzIGNsa2RtIHJlc2lkZXMgaW4KKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICoKKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgcG93ZXJkb21haW4gdGhhdCB0aGUgc3BlY2lmaWVkIGNsb2NrZG9tYWluCisgKiAnY2xrZG0nIGV4aXN0cyBpbiwgb3IgcmV0dXJucyBOVUxMIGlmIGNsa2RtIGFyZ3VtZW50IGlzIE5VTEwuCisgKi8KK3N0cnVjdCBwb3dlcmRvbWFpbiAqY2xrZG1fZ2V0X3B3cmRtKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCit7CisJaWYgKCFjbGtkbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gY2xrZG0tPnB3cmRtOworfQorCisKKy8qIEhhcmR3YXJlIGNsb2NrZG9tYWluIGNvbnRyb2wgKi8KKworLyoqCisgKiBvbWFwMl9jbGtkbV9jbGt0cmN0cmxfcmVhZCAtIHJlYWQgdGhlIGNsa2RtJ3MgY3VycmVudCBzdGF0ZSB0cmFuc2l0aW9uIG1vZGUKKyAqIEBjbGs6IHN0cnVjdCBjbGsgKiBvZiBhIGNsb2NrZG9tYWluCisgKgorICogUmV0dXJuIHRoZSBjbG9ja2RvbWFpbidzIGN1cnJlbnQgc3RhdGUgdHJhbnNpdGlvbiBtb2RlIGZyb20gdGhlCisgKiBjb3JyZXNwb25kaW5nIGRvbWFpbiBDTV9DTEtTVENUUkwgcmVnaXN0ZXIuCVJldHVybnMgLUVJTlZBTCBpZiBjbGsKKyAqIGlzIE5VTEwgb3IgdGhlIGN1cnJlbnQgbW9kZSB1cG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgb21hcDJfY2xrZG1fY2xrdHJjdHJsX3JlYWQoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSkKK3sKKwl1MzIgdjsKKworCWlmICghY2xrZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJdiA9IGNtX3JlYWRfbW9kX3JlZyhjbGtkbS0+cHdyZG0tPnByY21fb2ZmcywgQ01fQ0xLU1RDVFJMKTsKKwl2ICY9IGNsa2RtLT5jbGt0cmN0cmxfbWFzazsKKwl2ID4+PSBfX2ZmcyhjbGtkbS0+Y2xrdHJjdHJsX21hc2spOworCisJcmV0dXJuIHY7Cit9CisKKy8qKgorICogb21hcDJfY2xrZG1fc2xlZXAgLSBmb3JjZSBjbG9ja2RvbWFpbiBzbGVlcCB0cmFuc2l0aW9uCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKgorICogSW5zdHJ1Y3QgdGhlIENNIHRvIGZvcmNlIGEgc2xlZXAgdHJhbnNpdGlvbiBvbiB0aGUgc3BlY2lmaWVkCisgKiBjbG9ja2RvbWFpbiAnY2xrZG0nLiAgUmV0dXJucyAtRUlOVkFMIGlmIGNsayBpcyBOVUxMIG9yIGlmCisgKiBjbG9ja2RvbWFpbiBkb2VzIG5vdCBzdXBwb3J0IHNvZnR3YXJlLWluaXRpYXRlZCBzbGVlcDsgMCB1cG9uCisgKiBzdWNjZXNzLgorICovCitpbnQgb21hcDJfY2xrZG1fc2xlZXAoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSkKK3sKKwlpZiAoIWNsa2RtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGNsa2RtLT5mbGFncyAmIENMS0RNX0NBTl9GT1JDRV9TTEVFUCkpIHsKKwkJcHJfZGVidWcoImNsb2NrZG9tYWluOiAlcyBkb2VzIG5vdCBzdXBwb3J0IGZvcmNpbmcgIgorCQkJICJzbGVlcCB2aWEgc29mdHdhcmVcbiIsIGNsa2RtLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoImNsb2NrZG9tYWluOiBmb3JjaW5nIHNsZWVwIG9uICVzXG4iLCBjbGtkbS0+bmFtZSk7CisKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKworCQljbV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAyNFhYX0ZPUkNFU1RBVEUsCisJCQkJICAgIGNsa2RtLT5wd3JkbS0+cHJjbV9vZmZzLCBQTV9QV1NUQ1RSTCk7CisKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisKKwkJdTMyIHYgPSAoT01BUDM0WFhfQ0xLU1RDVFJMX0ZPUkNFX1NMRUVQIDw8CisJCQkgX19mZnMoY2xrZG0tPmNsa3RyY3RybF9tYXNrKSk7CisKKwkJY21fcm13X21vZF9yZWdfYml0cyhjbGtkbS0+Y2xrdHJjdHJsX21hc2ssIHYsCisJCQkJICAgIGNsa2RtLT5wd3JkbS0+cHJjbV9vZmZzLCBDTV9DTEtTVENUUkwpOworCisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG9tYXAyX2Nsa2RtX3dha2V1cCAtIGZvcmNlIGNsb2NrZG9tYWluIHdha2V1cCB0cmFuc2l0aW9uCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKgorICogSW5zdHJ1Y3QgdGhlIENNIHRvIGZvcmNlIGEgd2FrZXVwIHRyYW5zaXRpb24gb24gdGhlIHNwZWNpZmllZAorICogY2xvY2tkb21haW4gJ2Nsa2RtJy4gIFJldHVybnMgLUVJTlZBTCBpZiBjbGtkbSBpcyBOVUxMIG9yIGlmIHRoZQorICogY2xvY2tkb21haW4gZG9lcyBub3Qgc3VwcG9ydCBzb2Z0d2FyZS1jb250cm9sbGVkIHdha2V1cDsgMCB1cG9uCisgKiBzdWNjZXNzLgorICovCitpbnQgb21hcDJfY2xrZG1fd2FrZXVwKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCit7CisJaWYgKCFjbGtkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShjbGtkbS0+ZmxhZ3MgJiBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQKSkgeworCQlwcl9kZWJ1ZygiY2xvY2tkb21haW46ICVzIGRvZXMgbm90IHN1cHBvcnQgZm9yY2luZyAiCisJCQkgIndha2V1cCB2aWEgc29mdHdhcmVcbiIsIGNsa2RtLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoImNsb2NrZG9tYWluOiBmb3JjaW5nIHdha2V1cCBvbiAlc1xuIiwgY2xrZG0tPm5hbWUpOworCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CisKKwkJY21fY2xlYXJfbW9kX3JlZ19iaXRzKE9NQVAyNFhYX0ZPUkNFU1RBVEUsCisJCQkJICAgICAgY2xrZG0tPnB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RDVFJMKTsKKworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKKworCQl1MzIgdiA9IChPTUFQMzRYWF9DTEtTVENUUkxfRk9SQ0VfV0FLRVVQIDw8CisJCQkgX19mZnMoY2xrZG0tPmNsa3RyY3RybF9tYXNrKSk7CisKKwkJY21fcm13X21vZF9yZWdfYml0cyhjbGtkbS0+Y2xrdHJjdHJsX21hc2ssIHYsCisJCQkJICAgIGNsa2RtLT5wd3JkbS0+cHJjbV9vZmZzLCBDTV9DTEtTVENUUkwpOworCisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG9tYXAyX2Nsa2RtX2FsbG93X2lkbGUgLSBlbmFibGUgaHdzdXAgaWRsZSB0cmFuc2l0aW9ucyBmb3IgY2xrZG0KKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICoKKyAqCisgKiBBbGxvdyB0aGUgaGFyZHdhcmUgdG8gYXV0b21hdGljYWxseSBzd2l0Y2ggdGhlIGNsb2NrZG9tYWluIGludG8KKyAqIGFjdGl2ZSBvciBpZGxlIHN0YXRlcywgYXMgbmVlZGVkIGJ5IGRvd25zdHJlYW0gY2xvY2tzLiAgSWYgdGhlCisgKiBjbG9ja2RvbWFpbiBoYXMgYW55IGRvd25zdHJlYW0gY2xvY2tzIGVuYWJsZWQgaW4gdGhlIGNsb2NrCisgKiBmcmFtZXdvcmssIHdrZGVwL3NsZWVwZGVwIGF1dG9kZXBlbmRlbmNpZXMgYXJlIGFkZGVkOyB0aGlzIGlzIHNvCisgKiBkZXZpY2UgZHJpdmVycyBjYW4gcmVhZCBhbmQgd3JpdGUgdG8gdGhlIGRldmljZS4gIE5vIHJldHVybiB2YWx1ZS4KKyAqLwordm9pZCBvbWFwMl9jbGtkbV9hbGxvd19pZGxlKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCit7CisJdTMyIHY7CisKKwlpZiAoIWNsa2RtKQorCQlyZXR1cm47CisKKwlpZiAoIShjbGtkbS0+ZmxhZ3MgJiBDTEtETV9DQU5fRU5BQkxFX0FVVE8pKSB7CisJCXByX2RlYnVnKCJjbG9jazogYXV0b21hdGljIGlkbGUgdHJhbnNpdGlvbnMgY2Fubm90IGJlIGVuYWJsZWQgIgorCQkJICJvbiBjbG9ja2RvbWFpbiAlc1xuIiwgY2xrZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcHJfZGVidWcoImNsb2NrZG9tYWluOiBlbmFibGluZyBhdXRvbWF0aWMgaWRsZSB0cmFuc2l0aW9ucyBmb3IgJXNcbiIsCisJCSBjbGtkbS0+bmFtZSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNsa2RtLT51c2Vjb3VudCkgPiAwKQorCQlfY2xrZG1fYWRkX2F1dG9kZXBzKGNsa2RtKTsKKworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJdiA9IE9NQVAyNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTzsKKwllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJdiA9IE9NQVAzNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTzsKKwllbHNlCisJCUJVRygpOworCisKKwljbV9ybXdfbW9kX3JlZ19iaXRzKGNsa2RtLT5jbGt0cmN0cmxfbWFzaywKKwkJCSAgICB2IDw8IF9fZmZzKGNsa2RtLT5jbGt0cmN0cmxfbWFzayksCisJCQkgICAgY2xrZG0tPnB3cmRtLT5wcmNtX29mZnMsCisJCQkgICAgQ01fQ0xLU1RDVFJMKTsKK30KKworLyoqCisgKiBvbWFwMl9jbGtkbV9kZW55X2lkbGUgLSBkaXNhYmxlIGh3c3VwIGlkbGUgdHJhbnNpdGlvbnMgZm9yIGNsa2RtCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKgorICogUHJldmVudCB0aGUgaGFyZHdhcmUgZnJvbSBhdXRvbWF0aWNhbGx5IHN3aXRjaGluZyB0aGUgY2xvY2tkb21haW4KKyAqIGludG8gaW5hY3RpdmUgb3IgaWRsZSBzdGF0ZXMuICBJZiB0aGUgY2xvY2tkb21haW4gaGFzIGRvd25zdHJlYW0KKyAqIGNsb2NrcyBlbmFibGVkIGluIHRoZSBjbG9jayBmcmFtZXdvcmssIHdrZGVwL3NsZWVwZGVwCisgKiBhdXRvZGVwZW5kZW5jaWVzIGFyZSByZW1vdmVkLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIG9tYXAyX2Nsa2RtX2RlbnlfaWRsZShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKQoreworCXUzMiB2OworCisJaWYgKCFjbGtkbSkKKwkJcmV0dXJuOworCisJaWYgKCEoY2xrZG0tPmZsYWdzICYgQ0xLRE1fQ0FOX0RJU0FCTEVfQVVUTykpIHsKKwkJcHJfZGVidWcoImNsb2NrZG9tYWluOiBhdXRvbWF0aWMgaWRsZSB0cmFuc2l0aW9ucyBjYW5ub3QgYmUgIgorCQkJICJkaXNhYmxlZCBvbiAlc1xuIiwgY2xrZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcHJfZGVidWcoImNsb2NrZG9tYWluOiBkaXNhYmxpbmcgYXV0b21hdGljIGlkbGUgdHJhbnNpdGlvbnMgZm9yICVzXG4iLAorCQkgY2xrZG0tPm5hbWUpOworCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQl2ID0gT01BUDI0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTzsKKwllbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJdiA9IE9NQVAzNFhYX0NMS1NUQ1RSTF9ESVNBQkxFX0FVVE87CisJZWxzZQorCQlCVUcoKTsKKworCWNtX3Jtd19tb2RfcmVnX2JpdHMoY2xrZG0tPmNsa3RyY3RybF9tYXNrLAorCQkJICAgIHYgPDwgX19mZnMoY2xrZG0tPmNsa3RyY3RybF9tYXNrKSwKKwkJCSAgICBjbGtkbS0+cHdyZG0tPnByY21fb2ZmcywgQ01fQ0xLU1RDVFJMKTsKKworCWlmIChhdG9taWNfcmVhZCgmY2xrZG0tPnVzZWNvdW50KSA+IDApCisJCV9jbGtkbV9kZWxfYXV0b2RlcHMoY2xrZG0pOworfQorCisKKy8qIENsb2NrZG9tYWluLXRvLWNsb2NrIGZyYW1ld29yayBpbnRlcmZhY2UgY29kZSAqLworCisvKioKKyAqIG9tYXAyX2Nsa2RtX2Nsa19lbmFibGUgLSBhZGQgYW4gZW5hYmxlZCBkb3duc3RyZWFtIGNsb2NrIHRvIHRoaXMgY2xrZG0KKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICoKKyAqIEBjbGs6IHN0cnVjdCBjbGsgKiBvZiB0aGUgZW5hYmxlZCBkb3duc3RyZWFtIGNsb2NrCisgKgorICogSW5jcmVtZW50IHRoZSB1c2Vjb3VudCBvZiB0aGlzIGNsb2NrZG9tYWluICdjbGtkbScgYW5kIGVuc3VyZSB0aGF0CisgKiBpdCBpcyBhd2FrZS4gIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjbGtfZW5hYmxlKCkgY29kZS4gIElmIHRoZQorICogY2xvY2tkb21haW4gaXMgaW4gc29mdHdhcmUtc3VwZXJ2aXNlZCBpZGxlIG1vZGUsIGZvcmNlIHRoZQorICogY2xvY2tkb21haW4gdG8gd2FrZS4gIElmIHRoZSBjbG9ja2RvbWFpbiBpcyBpbiBoYXJkd2FyZS1zdXBlcnZpc2VkCisgKiBpZGxlIG1vZGUsIGFkZCBjbGtkbS1wd3JkbSBhdXRvZGVwZW5kZW5jaWVzLCB0byBlbnN1cmUgdGhhdCBkZXZpY2VzCisgKiBpbiB0aGUgY2xvY2tkb21haW4gY2FuIGJlIHJlYWQgZnJvbS93cml0dGVuIHRvIGJ5IG9uLWNoaXAgcHJvY2Vzc29ycy4KKyAqIFJldHVybnMgLUVJTlZBTCBpZiBwYXNzZWQgbnVsbCBwb2ludGVyczsgcmV0dXJucyAwIHVwb24gc3VjY2VzcyBvcgorICogaWYgdGhlIGNsb2NrZG9tYWluIGlzIGluIGh3c3VwIGlkbGUgbW9kZS4KKyAqLworaW50IG9tYXAyX2Nsa2RtX2Nsa19lbmFibGUoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgc3RydWN0IGNsayAqY2xrKQoreworCWludCB2OworCisJLyoKKwkgKiBYWFggUmV3cml0ZSB0aGlzIGNvZGUgdG8gbWFpbnRhaW4gYSBsaXN0IG9mIGVuYWJsZWQKKwkgKiBkb3duc3RyZWFtIGNsb2NrcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzPworCSAqLworCisJaWYgKCFjbGtkbSB8fCAhY2xrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhdG9taWNfaW5jX3JldHVybigmY2xrZG0tPnVzZWNvdW50KSA+IDEpCisJCXJldHVybiAwOworCisJLyogQ2xvY2tkb21haW4gbm93IGhhcyBvbmUgZW5hYmxlZCBkb3duc3RyZWFtIGNsb2NrICovCisKKwlwcl9kZWJ1ZygiY2xvY2tkb21haW46IGNsa2RtICVzOiBjbGsgJXMgbm93IGVuYWJsZWRcbiIsIGNsa2RtLT5uYW1lLAorCQkgY2xrLT5uYW1lKTsKKworCXYgPSBvbWFwMl9jbGtkbV9jbGt0cmN0cmxfcmVhZChjbGtkbSk7CisKKwlpZiAoKGNwdV9pc19vbWFwMzR4eCgpICYmIHYgPT0gT01BUDM0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPKSB8fAorCSAgICAoY3B1X2lzX29tYXAyNHh4KCkgJiYgdiA9PSBPTUFQMjRYWF9DTEtTVENUUkxfRU5BQkxFX0FVVE8pKQorCQlfY2xrZG1fYWRkX2F1dG9kZXBzKGNsa2RtKTsKKwllbHNlCisJCW9tYXAyX2Nsa2RtX3dha2V1cChjbGtkbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvbWFwMl9jbGtkbV9jbGtfZGlzYWJsZSAtIHJlbW92ZSBhbiBlbmFibGVkIGRvd25zdHJlYW0gY2xvY2sgZnJvbSB0aGlzIGNsa2RtCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqCisgKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgdGhlIGRpc2FibGVkIGRvd25zdHJlYW0gY2xvY2sKKyAqCisgKiBEZWNyZW1lbnQgdGhlIHVzZWNvdW50IG9mIHRoaXMgY2xvY2tkb21haW4gJ2Nsa2RtJy4gSW50ZW5kZWQgdG8gYmUKKyAqIGNhbGxlZCBieSBjbGtfZGlzYWJsZSgpIGNvZGUuICBJZiB0aGUgdXNlY291bnQgZ29lcyB0byAwLCBwdXQgdGhlCisgKiBjbG9ja2RvbWFpbiB0byBzbGVlcCAoc29mdHdhcmUtc3VwZXJ2aXNlZCBtb2RlKSBvciByZW1vdmUgdGhlCisgKiBjbGtkbS1wd3JkbSBhdXRvZGVwZW5kZW5jaWVzIChoYXJkd2FyZS1zdXBlcnZpc2VkIG1vZGUpLiAgUmV0dXJucworICogLUVJTlZBTCBpZiBwYXNzZWQgbnVsbCBwb2ludGVyczsgLUVSQU5HRSBpZiB0aGUgY2xrZG0gdXNlY291bnQKKyAqIHVuZGVyZmxvd3MgYW5kIGRlYnVnZ2luZyBpcyBlbmFibGVkOyBvciByZXR1cm5zIDAgdXBvbiBzdWNjZXNzIG9yCisgKiBpZiB0aGUgY2xvY2tkb21haW4gaXMgaW4gaHdzdXAgaWRsZSBtb2RlLgorICovCitpbnQgb21hcDJfY2xrZG1fY2xrX2Rpc2FibGUoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgc3RydWN0IGNsayAqY2xrKQoreworCWludCB2OworCisJLyoKKwkgKiBYWFggUmV3cml0ZSB0aGlzIGNvZGUgdG8gbWFpbnRhaW4gYSBsaXN0IG9mIGVuYWJsZWQKKwkgKiBkb3duc3RyZWFtIGNsb2NrcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzPworCSAqLworCisJaWYgKCFjbGtkbSB8fCAhY2xrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIERFQlVHCisJaWYgKGF0b21pY19yZWFkKCZjbGtkbS0+dXNlY291bnQpID09IDApIHsKKwkJV0FSTl9PTigxKTsgLyogdW5kZXJmbG93ICovCisJCXJldHVybiAtRVJBTkdFOworCX0KKyNlbmRpZgorCisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZjbGtkbS0+dXNlY291bnQpID4gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGwgZG93bnN0cmVhbSBjbG9ja3Mgb2YgdGhpcyBjbG9ja2RvbWFpbiBhcmUgbm93IGRpc2FibGVkICovCisKKwlwcl9kZWJ1ZygiY2xvY2tkb21haW46IGNsa2RtICVzOiBjbGsgJXMgbm93IGRpc2FibGVkXG4iLCBjbGtkbS0+bmFtZSwKKwkJIGNsay0+bmFtZSk7CisKKwl2ID0gb21hcDJfY2xrZG1fY2xrdHJjdHJsX3JlYWQoY2xrZG0pOworCisJaWYgKChjcHVfaXNfb21hcDM0eHgoKSAmJiB2ID09IE9NQVAzNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTykgfHwKKwkgICAgKGNwdV9pc19vbWFwMjR4eCgpICYmIHYgPT0gT01BUDI0WFhfQ0xLU1RDVFJMX0VOQUJMRV9BVVRPKSkKKwkJX2Nsa2RtX2RlbF9hdXRvZGVwcyhjbGtkbSk7CisJZWxzZQorCQlvbWFwMl9jbGtkbV9zbGVlcChjbGtkbSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4NmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zLmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBPTUFQMi8zIGNsb2NrZG9tYWlucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CisgKi8KKworI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfQ0xPQ0tET01BSU5TX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLRE9NQUlOU19ICisKKyNpbmNsdWRlIDxtYWNoL2Nsb2NrZG9tYWluLmg+CisKKy8qCisgKiBPTUFQMi8zLWNvbW1vbiBjbG9ja2RvbWFpbnMKKyAqLworCisvKiBUaGlzIGlzIGFuIGltcGxpY2l0IGNsb2NrZG9tYWluIC0gaXQgaXMgbmV2ZXIgZGVmaW5lZCBhcyBzdWNoIGluIFRSTSAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiB3a3VwX2Nsa2RtID0geworCS5uYW1lCQk9ICJ3a3VwX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJ3a3VwX3B3cmRtIiwKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8IENISVBfSVNfT01BUDM0MzApLAorfTsKKworLyoKKyAqIDI0MjAtb25seSBjbG9ja2RvbWFpbnMKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAibXB1X2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJtcHVfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX01QVV9NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gaXZhMV8yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJpdmExX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJkc3BfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0MjBfQVVUT1NUQVRFX0lWQV9NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKK307CisKKyNlbmRpZiAgLyogQ09ORklHX0FSQ0hfT01BUDI0MjAgKi8KKworCisvKgorICogMjQzMC1vbmx5IGNsb2NrZG9tYWlucworICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKQorCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV8yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJtcHVfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gIm1wdV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTVBVX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtZG1fY2xrZG0gPSB7CisJLm5hbWUJCT0gIm1kbV9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAibWRtX3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNDMwX0FVVE9TVEFURV9NRE1fTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCit9OworCisjZW5kaWYgICAgLyogQ09ORklHX0FSQ0hfT01BUDI0MzAgKi8KKworCisvKgorICogMjRYWC1vbmx5IGNsb2NrZG9tYWlucworICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzcF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHNwX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJkc3BfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTUF9NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZ2Z4XzI0eHhfY2xrZG0gPSB7CisJLm5hbWUJCT0gImdmeF9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiZ2Z4X3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9HRlhfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDNfMjR4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sM19jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiY29yZV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDNfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDRfMjR4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sNF9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiY29yZV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDRfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18yNHh4X2Nsa2RtID0geworCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gImNvcmVfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTU19NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKSwKK307CisKKyNlbmRpZiAgIC8qIENPTkZJR19BUkNIX09NQVAyNFhYICovCisKKworLyoKKyAqIDM0eHggY2xvY2tkb21haW5zCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzM0eHhfY2xrZG0gPSB7CisJLm5hbWUJCT0gIm1wdV9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAibXB1X3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQIHwgQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTVBVX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBuZW9uX2Nsa2RtID0geworCS5uYW1lCQk9ICJuZW9uX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJuZW9uX3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9ORU9OX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBpdmEyX2Nsa2RtID0geworCS5uYW1lCQk9ICJpdmEyX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJpdmEyX3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9JVkEyX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBnZnhfMzQzMGVzMV9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZ2Z4X2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJnZnhfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzFfQ0xLVFJDVFJMX0dGWF9NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gc2d4X2Nsa2RtID0geworCS5uYW1lCQk9ICJzZ3hfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gInNneF9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfU0dYX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzIpLAorfTsKKworLyoKKyAqIFRoZSBkaWUtdG8tZGllIGNsb2NrZG9tYWluIHdhcyBkb2N1bWVudGVkIGluIHRoZSAzNHh4IEVTMSBUUk0sIGJ1dAorICogdGhlbiB0aGF0IGluZm9ybWF0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIDM0eHggRVMyKyBUUk0uICBJdCBpcworICogdW5jbGVhciB3aGV0aGVyIHRoZSBjb3JlIGlzIHN0aWxsIHRoZXJlLCBidXQgdGhlIGNsb2NrZG9tYWluIGxvZ2ljCisgKiBpcyB0aGVyZSwgYW5kIG11c3QgYmUgcHJvZ3JhbW1lZCB0byBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBpZiB0aGUKKyAqIENPUkUgY2xvY2tkb21haW4gaXMgdG8gYmVjb21lIGluYWN0aXZlLgorICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGQyZF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZDJkX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJjb3JlX3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMxX0NMS1RSQ1RSTF9EMkRfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDNfMzR4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sM19jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiY29yZV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTDNfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDRfMzR4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sNF9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiY29yZV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTDRfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18zNHh4X2Nsa2RtID0geworCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gImRzc19wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfRFNTX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjYW1fY2xrZG0gPSB7CisJLm5hbWUJCT0gImNhbV9jbGtkbSIsCisJLnB3cmRtX25hbWUJPSAiY2FtX3B3cmRtIiwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9DQU1fTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHVzYmhvc3RfY2xrZG0gPSB7CisJLm5hbWUJCT0gInVzYmhvc3RfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gInVzYmhvc3RfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzJfQ0xLVFJDVFJMX1VTQkhPU1RfTUFTSywKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMiksCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHBlcl9jbGtkbSA9IHsKKwkubmFtZQkJPSAicGVyX2Nsa2RtIiwKKwkucHdyZG1fbmFtZQk9ICJwZXJfcHdyZG0iLAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX1BFUl9NQVNLLAorCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZW11X2Nsa2RtID0geworCS5uYW1lCQk9ICJlbXVfY2xrZG0iLAorCS5wd3JkbV9uYW1lCT0gImVtdV9wd3JkbSIsCisJLmZsYWdzCQk9IENMS0RNX0NBTl9FTkFCTEVfQVVUTyB8IENMS0RNX0NBTl9TV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfRU1VX01BU0ssCisJLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorfTsKKworI2VuZGlmICAgLyogQ09ORklHX0FSQ0hfT01BUDM0WFggKi8KKworLyoKKyAqIENsb2NrZG9tYWluLXBvd2VyZG9tYWluIGh3c3VwIGRlcGVuZGVuY2llcyAoMzRYWCBvbmx5KQorICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fcHdyZG1fYXV0b2RlcCBjbGtkbV9wd3JkbV9hdXRvZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAibXB1X3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIml2YTJfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsgTlVMTCB9Cit9OworCisvKgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcFtdID0geworCisJJndrdXBfY2xrZG0sCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQyMAorCSZtcHVfMjQyMF9jbGtkbSwKKwkmaXZhMV8yNDIwX2Nsa2RtLAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAorCSZtcHVfMjQzMF9jbGtkbSwKKwkmbWRtX2Nsa2RtLAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCSZkc3BfY2xrZG0sCisJJmdmeF8yNHh4X2Nsa2RtLAorCSZjb3JlX2wzXzI0eHhfY2xrZG0sCisJJmNvcmVfbDRfMjR4eF9jbGtkbSwKKwkmZHNzXzI0eHhfY2xrZG0sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCisJJm1wdV8zNHh4X2Nsa2RtLAorCSZuZW9uX2Nsa2RtLAorCSZpdmEyX2Nsa2RtLAorCSZnZnhfMzQzMGVzMV9jbGtkbSwKKwkmc2d4X2Nsa2RtLAorCSZkMmRfY2xrZG0sCisJJmNvcmVfbDNfMzR4eF9jbGtkbSwKKwkmY29yZV9sNF8zNHh4X2Nsa2RtLAorCSZkc3NfMzR4eF9jbGtkbSwKKwkmY2FtX2Nsa2RtLAorCSZ1c2Job3N0X2Nsa2RtLAorCSZwZXJfY2xrZG0sCisJJmVtdV9jbGtkbSwKKyNlbmRpZgorCisJTlVMTCwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTI0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20tcmVnYml0cy0yNHh4LmgKaW5kZXggMjBhYzM4MS4uMTA5OGVjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTI0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLXJlZ2JpdHMtMjR4eC5oCkBAIC02Myw3ICs2Myw4IEBACiAjZGVmaW5lIE9NQVAyNFhYX0NMS1NFTF9NUFVfTUFTSwkJCSgweDFmIDw8IDApCiAKIC8qIENNX0NMS1NUQ1RSTF9NUFUgKi8KLSNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX01QVQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMjRYWF9BVVRPU1RBVEVfTVBVX1NISUZUCQkJMAorI2RlZmluZSBPTUFQMjRYWF9BVVRPU1RBVEVfTVBVX01BU0sJCQkoMSA8PCAwKQogCiAvKiBDTV9GQ0xLRU4xX0NPUkUgc3BlY2lmaWMgYml0cyovCiAjZGVmaW5lIE9NQVAyNFhYX0VOX1RWX1NISUZUCQkJCTIKQEAgLTIzOCw5ICsyMzksMTIgQEAKICNkZWZpbmUgT01BUDI0WFhfQ0xLU0VMX0dQVDJfTUFTSwkJCSgweDMgPDwgMikKIAogLyogQ01fQ0xLU1RDVFJMX0NPUkUgKi8KLSNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX0RTUwkJCQkoMSA8PCAyKQotI2RlZmluZSBPTUFQMjRYWF9BVVRPU1RBVEVfTDQJCQkJKDEgPDwgMSkKLSNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX0wzCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9EU1NfU0hJRlQJCQkyCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9EU1NfTUFTSwkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9MNF9TSElGVAkJCTEKKyNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX0w0X01BU0sJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQMjRYWF9BVVRPU1RBVEVfTDNfU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9MM19NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fRkNMS0VOX0dGWCAqLwogI2RlZmluZSBPTUFQMjRYWF9FTl8zRF9TSElGVAkJCQkyCkBAIC0yNTUsNyArMjU5LDggQEAKIC8qIENNX0NMS1NFTF9HRlggc3BlY2lmaWMgYml0cyAqLwogCiAvKiBDTV9DTEtTVENUUkxfR0ZYICovCi0jZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9HRlgJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX0dGWF9TSElGVAkJCTAKKyNkZWZpbmUgT01BUDI0WFhfQVVUT1NUQVRFX0dGWF9NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fRkNMS0VOX1dLVVAgc3BlY2lmaWMgYml0cyAqLwogCkBAIC0zNjcsOCArMzcyLDEwIEBACiAjZGVmaW5lIE9NQVAyNFhYX0NMS1NFTF9EU1BfTUFTSwkJCSgweDFmIDw8IDApCiAKIC8qIENNX0NMS1NUQ1RSTF9EU1AgKi8KLSNkZWZpbmUgT01BUDI0MjBfQVVUT1NUQVRFX0lWQQkJCQkoMSA8PCA4KQotI2RlZmluZSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNQCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyNDIwX0FVVE9TVEFURV9JVkFfU0hJRlQJCQk4CisjZGVmaW5lIE9NQVAyNDIwX0FVVE9TVEFURV9JVkFfTUFTSwkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9EU1BfU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAyNFhYX0FVVE9TVEFURV9EU1BfTUFTSwkJCSgxIDw8IDApCiAKIC8qIENNX0ZDTEtFTl9NRE0gKi8KIC8qIDI0MzAgb25seSAqLwpAQCAtMzk2LDYgKzQwMyw3IEBACiAKIC8qIENNX0NMS1NUQ1RSTF9NRE0gKi8KIC8qIDI0MzAgb25seSAqLwotI2RlZmluZSBPTUFQMjQzMF9BVVRPU1RBVEVfTURNCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyNDMwX0FVVE9TVEFURV9NRE1fU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAyNDMwX0FVVE9TVEFURV9NRE1fTUFTSwkJCSgxIDw8IDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTM0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20tcmVnYml0cy0zNHh4LmgKaW5kZXggZWU0YzBjYS4uMjE5ZjVjOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTM0eHguaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLXJlZ2JpdHMtMzR4eC5oCkBAIC05Niw3ICs5Niw4IEBACiAjZGVmaW5lIE9NQVAzNDMwX0NMS1RSQ1RSTF9JVkEyX01BU0sJCQkoMHgzIDw8IDApCiAKIC8qIENNX0NMS1NUU1RfSVZBMiAqLwotI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9JVkEyCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfSVZBMl9TSElGVAkJCTAKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfSVZBMl9NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fUkVWSVNJT04gc3BlY2lmaWMgYml0cyAqLwogCkBAIC0xNDAsNyArMTQxLDggQEAKICNkZWZpbmUgT01BUDM0MzBfQ0xLVFJDVFJMX01QVV9NQVNLCQkJKDB4MyA8PCAwKQogCiAvKiBDTV9DTEtTVFNUX01QVSAqLwotI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9NUFUJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9NUFVfU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX01QVV9NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fRkNMS0VOMV9DT1JFIHNwZWNpZmljIGJpdHMgKi8KIApAQCAtMzAwLDkgKzMwMiwxMiBAQAogI2RlZmluZSBPTUFQMzQzMF9DTEtUUkNUUkxfTDNfTUFTSwkJCSgweDMgPDwgMCkKIAogLyogQ01fQ0xLU1RTVF9DT1JFICovCi0jZGVmaW5lIE9NQVAzNDMwRVMxX0NMS0FDVElWSVRZX0QyRAkJCSgxIDw8IDIpCi0jZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0w0CQkJCSgxIDw8IDEpCi0jZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0wzCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzNDMwRVMxX0NMS0FDVElWSVRZX0QyRF9TSElGVAkJMgorI2RlZmluZSBPTUFQMzQzMEVTMV9DTEtBQ1RJVklUWV9EMkRfTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfTDRfU0hJRlQJCQkxCisjZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0w0X01BU0sJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9MM19TSElGVAkJCTAKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfTDNfTUFTSwkJCSgxIDw8IDApCiAKIC8qIENNX0ZDTEtFTl9HRlggKi8KICNkZWZpbmUgT01BUDM0MzBFUzFfRU5fM0QJCQkJKDEgPDwgMikKQEAgLTMyMyw3ICszMjgsOCBAQAogI2RlZmluZSBPTUFQMzQzMEVTMV9DTEtUUkNUUkxfR0ZYX01BU0sJCQkoMHgzIDw8IDApCiAKIC8qIENNX0NMS1NUU1RfR0ZYICovCi0jZGVmaW5lIE9NQVAzNDMwRVMxX0NMS0FDVElWSVRZX0dGWAkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzNDMwRVMxX0NMS0FDVElWSVRZX0dGWF9TSElGVAkJMAorI2RlZmluZSBPTUFQMzQzMEVTMV9DTEtBQ1RJVklUWV9HRlhfTUFTSwkJKDEgPDwgMCkKIAogLyogQ01fRkNMS0VOX1NHWCAqLwogI2RlZmluZSBPTUFQMzQzMEVTMl9FTl9TR1hfU0hJRlQJCQkxCkBAIC0zMzMsNiArMzM5LDE0IEBACiAjZGVmaW5lIE9NQVAzNDMwRVMyX0NMS1NFTF9TR1hfU0hJRlQJCQkwCiAjZGVmaW5lIE9NQVAzNDMwRVMyX0NMS1NFTF9TR1hfTUFTSwkJCSgweDcgPDwgMCkKIAorLyogQ01fQ0xLU1RDVFJMX1NHWCAqLworI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfU0dYX1NISUZUCQkJMAorI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfU0dYX01BU0sJCQkoMHgzIDw8IDApCisKKy8qIENNX0NMS1NUU1RfU0dYICovCisjZGVmaW5lIE9NQVAzNDMwRVMyX0NMS0FDVElWSVRZX1NHWF9TSElGVAkJMAorI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtBQ1RJVklUWV9TR1hfTUFTSwkJKDEgPDwgMCkKKwogLyogQ01fRkNMS0VOX1dLVVAgc3BlY2lmaWMgYml0cyAqLwogI2RlZmluZSBPTUFQMzQzMEVTMl9FTl9VU0lNT0NQX1NISUZUCQkJOQogCkBAIC00OTgsNyArNTEyLDggQEAKICNkZWZpbmUgT01BUDM0MzBfQ0xLVFJDVFJMX0RTU19NQVNLCQkJKDB4MyA8PCAwKQogCiAvKiBDTV9DTEtTVFNUX0RTUyAqLwotI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9EU1MJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9EU1NfU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0RTU19NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fRkNMS0VOX0NBTSBzcGVjaWZpYyBiaXRzICovCiAKQEAgLTUyMiw3ICs1MzcsOCBAQAogI2RlZmluZSBPTUFQMzQzMF9DTEtUUkNUUkxfQ0FNX01BU0sJCQkoMHgzIDw8IDApCiAKIC8qIENNX0NMS1NUU1RfQ0FNICovCi0jZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0NBTQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0NBTV9TSElGVAkJCTAKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfQ0FNX01BU0sJCQkoMSA8PCAwKQogCiAvKiBDTV9GQ0xLRU5fUEVSIHNwZWNpZmljIGJpdHMgKi8KIApAQCAtNTk4LDcgKzYxNCw4IEBACiAjZGVmaW5lIE9NQVAzNDMwX0NMS1RSQ1RSTF9QRVJfTUFTSwkJCSgweDMgPDwgMCkKIAogLyogQ01fQ0xLU1RTVF9QRVIgKi8KLSNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfUEVSCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDM0MzBfQ0xLQUNUSVZJVFlfUEVSX1NISUZUCQkJMAorI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9QRVJfTUFTSwkJCSgxIDw8IDApCiAKIC8qIENNX0NMS1NFTDFfRU1VICovCiAjZGVmaW5lIE9NQVAzNDMwX0RJVl9EUExMNF9TSElGVAkJCTI0CkBAIC02MjMsNyArNjQwLDggQEAKICNkZWZpbmUgT01BUDM0MzBfQ0xLVFJDVFJMX0VNVV9NQVNLCQkJKDB4MyA8PCAwKQogCiAvKiBDTV9DTEtTVFNUX0VNVSAqLwotI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9FTVUJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMzQzMF9DTEtBQ1RJVklUWV9FTVVfU0hJRlQJCQkwCisjZGVmaW5lIE9NQVAzNDMwX0NMS0FDVElWSVRZX0VNVV9NQVNLCQkJKDEgPDwgMCkKIAogLyogQ01fQ0xLU0VMMl9FTVUgc3BlY2lmaWMgYml0cyAqLwogI2RlZmluZSBPTUFQMzQzMF9DT1JFX0RQTExfRU1VX01VTFRfU0hJRlQJCTgKQEAgLTY3Myw2ICs2OTEsOCBAQAogI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfVVNCSE9TVF9TSElGVAkJMAogI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfVVNCSE9TVF9NQVNLCQkoMyA8PCAwKQogCi0KKy8qIENNX0NMS1NUU1RfVVNCSE9TVCAqLworI2RlZmluZSBPTUFQMzQzMEVTMl9DTEtBQ1RJVklUWV9VU0JIT1NUX1NISUZUCQkwCisjZGVmaW5lIE9NQVAzNDMwRVMyX0NMS0FDVElWSVRZX1VTQkhPU1RfTUFTSwkJKDEgPDwgMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmgKaW5kZXggODdhNDRjNy4uNjVmZGY3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20uaApAQCAtMTgsNyArMTgsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KICNkZWZpbmUgT01BUF9DTV9SRUdBRERSKG1vZHVsZSwgcmVnKQkJCQkJXAotCSh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKE9NQVAyX0NNX0JBU0UgKyAobW9kdWxlKSArIChyZWcpKQorCQkJSU9fQUREUkVTUyhPTUFQMl9DTV9CQVNFICsgKG1vZHVsZSkgKyAocmVnKSkKICNlbHNlCiAjZGVmaW5lIE9NQVAyNDIwX0NNX1JFR0FERFIobW9kdWxlLCByZWcpCQkJCVwKIAkJCUlPX0FERFJFU1MoT01BUDI0MjBfQ01fQkFTRSArIChtb2R1bGUpICsgKHJlZykpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IDdhN2YwMjUuLjkwYWYyYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC0xMyw5ICsxMyw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIApAQCAtMjMsNTAgKzIzLDcgQEAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLQotI2lmCWRlZmluZWQoQ09ORklHX0kyQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfT01BUF9NT0RVTEUpCi0KLSNkZWZpbmUgT01BUDJfSTJDX0JBU0UyCQkweDQ4MDcyMDAwCi0jZGVmaW5lIE9NQVAyX0kyQ19JTlQyCQk1NwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGkyY19yZXNvdXJjZXMyW10gPSB7Ci0JewotCQkuc3RhcnQJCT0gT01BUDJfSTJDX0JBU0UyLAotCQkuZW5kCQk9IE9NQVAyX0kyQ19CQVNFMiArIDB4M2YsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0CQk9IE9NQVAyX0kyQ19JTlQyLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXBfaTJjX2RldmljZTIgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImkyY19vbWFwIiwKLQkuaWQgICAgICAgICAgICAgPSAyLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpMmNfcmVzb3VyY2VzMiksCi0JLnJlc291cmNlCT0gaTJjX3Jlc291cmNlczIsCi19OwotCi0vKiBTZWUgYWxzbyBhcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jIGZvciBmaXJzdCBJMkMgb24gMjR4eCAqLwotc3RhdGljIHZvaWQgb21hcF9pbml0X2kyYyh2b2lkKQotewotCS8qIFJFVklTSVQ6IFNlY29uZCBJMkMgbm90IGluIHVzZSBvbiBIND8gKi8KLQlpZiAobWFjaGluZV9pc19vbWFwX2g0KCkpCi0JCXJldHVybjsKLQotCWlmICghY3B1X2lzX29tYXAyNDMwKCkpIHsKLQkJb21hcF9jZmdfcmVnKEoxNV8yNFhYX0kyQzJfU0NMKTsKLQkJb21hcF9jZmdfcmVnKEgxOV8yNFhYX0kyQzJfU0RBKTsKLQl9Ci0JKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF9pMmNfZGV2aWNlMik7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyB2b2lkIG9tYXBfaW5pdF9pMmModm9pZCkge30KLQotI2VuZGlmCisjaW5jbHVkZSA8bWFjaC9lYWMuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfRFNQKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX0RTUF9NT0RVTEUpCiAjZGVmaW5lIE9NQVAyX01CT1hfQkFTRQkJSU9fQUREUkVTUyhPTUFQMjRYWF9NQUlMQk9YX0JBU0UpCkBAIC0xMDQsNyArNjEsOSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9TVEkpCiAKLSNkZWZpbmUgT01BUDJfU1RJX0JBU0UJCUlPX0FERFJFU1MoMHg0ODA2ODAwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKQorCisjZGVmaW5lIE9NQVAyX1NUSV9CQVNFCQkweDQ4MDY4MDAwCiAjZGVmaW5lIE9NQVAyX1NUSV9DSEFOTkVMX0JBU0UJMHg1NDAwMDAwMAogI2RlZmluZSBPTUFQMl9TVElfSVJRCQk0CiAKQEAgLTEyNCw2ICs4MywyNSBAQAogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCiAJfQogfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCisKKyNkZWZpbmUgT01BUDNfU0RUSV9CQVNFCQkweDU0NTAwMDAwCisjZGVmaW5lIE9NQVAzX1NEVElfQ0hBTk5FTF9CQVNFCTB4NTQ2MDAwMDAKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdGlfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJCT0gT01BUDNfU0RUSV9CQVNFLAorCQkuZW5kCQk9IE9NQVAzX1NEVElfQkFTRSArIDB4RkZGLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSBPTUFQM19TRFRJX0NIQU5ORUxfQkFTRSwKKwkJLmVuZAkJPSBPTUFQM19TRFRJX0NIQU5ORUxfQkFTRSArIFNaXzFNIC0gMSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzdGlfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzdGkiLApAQCAtMTQwLDEyICsxMTgsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfc3RpKHZvaWQpIHt9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9PTUFQMjRYWCkKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfT01BUDI0WFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9PTUFQMjRYWF9NT0RVTEUpCiAKICNpbmNsdWRlIDxtYWNoL21jc3BpLmg+CiAKICNkZWZpbmUgT01BUDJfTUNTUEkxX0JBU0UJCTB4NDgwOTgwMDAKICNkZWZpbmUgT01BUDJfTUNTUEkyX0JBU0UJCTB4NDgwOWEwMDAKKyNkZWZpbmUgT01BUDJfTUNTUEkzX0JBU0UJCTB4NDgwYjgwMDAKKyNkZWZpbmUgT01BUDJfTUNTUEk0X0JBU0UJCTB4NDgwYmEwMDAKIAogc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9wbGF0Zm9ybV9jb25maWcgb21hcDJfbWNzcGkxX2NvbmZpZyA9IHsKIAkubnVtX2NzCQk9IDQsCkBAIC0xNTksNyArMTM5LDcgQEAKIAl9LAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMl9tY3NwaTEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMl9tY3NwaTEgPSB7CiAJLm5hbWUJCT0gIm9tYXAyX21jc3BpIiwKIAkuaWQJCT0gMSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob21hcDJfbWNzcGkxX3Jlc291cmNlcyksCkBAIC0xODEsNyArMTYxLDcgQEAKIAl9LAogfTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMl9tY3NwaTIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMl9tY3NwaTIgPSB7CiAJLm5hbWUJCT0gIm9tYXAyX21jc3BpIiwKIAkuaWQJCT0gMiwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob21hcDJfbWNzcGkyX3Jlc291cmNlcyksCkBAIC0xOTEsMTYgKzE3MSwxNjIgQEAKIAl9LAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCitzdGF0aWMgc3RydWN0IG9tYXAyX21jc3BpX3BsYXRmb3JtX2NvbmZpZyBvbWFwMl9tY3NwaTNfY29uZmlnID0geworCS5udW1fY3MJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb21hcDJfbWNzcGkzX3Jlc291cmNlc1tdID0geworCXsKKwkuc3RhcnQJCT0gT01BUDJfTUNTUEkzX0JBU0UsCisJLmVuZAkJPSBPTUFQMl9NQ1NQSTNfQkFTRSArIDB4ZmYsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwMl9tY3NwaTMgPSB7CisJLm5hbWUJCT0gIm9tYXAyX21jc3BpIiwKKwkuaWQJCT0gMywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob21hcDJfbWNzcGkzX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gb21hcDJfbWNzcGkzX3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmb21hcDJfbWNzcGkzX2NvbmZpZywKKwl9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKK3N0YXRpYyBzdHJ1Y3Qgb21hcDJfbWNzcGlfcGxhdGZvcm1fY29uZmlnIG9tYXAyX21jc3BpNF9jb25maWcgPSB7CisJLm51bV9jcwkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWFwMl9tY3NwaTRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJCT0gT01BUDJfTUNTUEk0X0JBU0UsCisJCS5lbmQJCT0gT01BUDJfTUNTUEk0X0JBU0UgKyAweGZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAyX21jc3BpNCA9IHsKKwkubmFtZQkJPSAib21hcDJfbWNzcGkiLAorCS5pZAkJPSA0LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvbWFwMl9tY3NwaTRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBvbWFwMl9tY3NwaTRfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZvbWFwMl9tY3NwaTRfY29uZmlnLAorCX0sCit9OworI2VuZGlmCisKIHN0YXRpYyB2b2lkIG9tYXBfaW5pdF9tY3NwaSh2b2lkKQogewogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGkxKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAyX21jc3BpMik7CisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAyX21jc3BpMyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfbWNzcGk0KTsKKyNlbmRpZgogfQogCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tY3NwaSh2b2lkKSB7fQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU05EX09NQVAyNFhYX0VBQworCisjZGVmaW5lIE9NQVAyX0VBQ19CQVNFCQkJMHg0ODA5MDAwMAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9tYXAyX2VhY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAkJPSBPTUFQMl9FQUNfQkFTRSwKKwkJLmVuZAkJPSBPTUFQMl9FQUNfQkFTRSArIDB4MTA5LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAyX2VhY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXAyNHh4LWVhYyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvbWFwMl9lYWNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBvbWFwMl9lYWNfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKKwl9LAorfTsKKwordm9pZCBvbWFwX2luaXRfZWFjKHN0cnVjdCBlYWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJb21hcDJfZWFjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcDJfZWFjX2RldmljZSk7Cit9CisKKyNlbHNlCit2b2lkIG9tYXBfaW5pdF9lYWMoc3RydWN0IGVhY19wbGF0Zm9ybV9kYXRhICpwZGF0YSkge30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09NQVBfU0hBMV9NRDUKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2hhMV9tZDVfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBPTUFQMjRYWF9TRUNfU0hBMU1ENV9CQVNFLAorCQkuZW5kCT0gT01BUDI0WFhfU0VDX1NIQTFNRDVfQkFTRSArIDB4NjQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBJTlRfMjRYWF9TSEExTUQ1LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaGExX21kNV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIk9NQVAgU0hBMS9NRDUiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2hhMV9tZDVfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzaGExX21kNV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgdm9pZCBvbWFwX2luaXRfc2hhMV9tZDUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNoYTFfbWQ1X2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9zaGExX21kNSh2b2lkKSB7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSERRX01BU1RFUl9PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19IRFFfTUFTVEVSX09NQVBfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApCisjZGVmaW5lIE9NQVBfSERRX0JBU0UJMHg0ODBCMjAwMAorI2VuZGlmCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9tYXBfaGRxX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IE9NQVBfSERRX0JBU0UsCisJCS5lbmQJCT0gT01BUF9IRFFfQkFTRSArIDB4MUMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IElOVF8yNFhYX0hEUV9JUlEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXBfaGRxX2RldiA9IHsKKwkubmFtZSA9ICJvbWFwX2hkcSIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob21hcF9oZHFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBvbWFwX2hkcV9yZXNvdXJjZXMsCit9Oworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaGRxX2luaXQodm9pZCkKK3sKKwkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX2hkcV9kZXYpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2hkcV9pbml0KHZvaWQpIHt9CisjZW5kaWYKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBfX2luaXQgb21hcDJfaW5pdF9kZXZpY2VzKHZvaWQpCkBAIC0yMDgsMTAgKzMzNCwxMSBAQAogCS8qIHBsZWFzZSBrZWVwIHRoZXNlIGNhbGxzLCBhbmQgdGhlaXIgaW1wbGVtZW50YXRpb25zIGFib3ZlLAogCSAqIGluIGFscGhhYmV0aWNhbCBvcmRlciBzbyB0aGV5J3JlIGVhc2llciB0byBzb3J0IHRocm91Z2guCiAJICovCi0Jb21hcF9pbml0X2kyYygpOwogCW9tYXBfaW5pdF9tYm94KCk7CiAJb21hcF9pbml0X21jc3BpKCk7CisJb21hcF9oZHFfaW5pdCgpOwogCW9tYXBfaW5pdF9zdGkoKTsKKwlvbWFwX2luaXRfc2hhMV9tZDUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYwppbmRleCBmNTFkNjliLi43NjNiZGJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYwpAQCAtOSwyNyArOSwyMyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjdW5kZWYgREVCVUcKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvZ3BtYy5oPgogCi0jdW5kZWYgREVCVUcKKyNpbmNsdWRlIDxtYWNoL3NkcmMuaD4KIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNDIwCi0jZGVmaW5lIEdQTUNfQkFTRQkJMHg2ODAwYTAwMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAotI2RlZmluZSBHUE1DX0JBU0UJCTB4NkUwMDAwMDAKLSNlbmRpZgotCisvKiBHUE1DIHJlZ2lzdGVyIG9mZnNldHMgKi8KICNkZWZpbmUgR1BNQ19SRVZJU0lPTgkJMHgwMAogI2RlZmluZSBHUE1DX1NZU0NPTkZJRwkJMHgxMAogI2RlZmluZSBHUE1DX1NZU1NUQVRVUwkJMHgxNApAQCAtNTEsNyArNDcsNiBAQAogI2RlZmluZSBHUE1DX0NTMAkJMHg2MAogI2RlZmluZSBHUE1DX0NTX1NJWkUJCTB4MzAKIAotI2RlZmluZSBHUE1DX0NTX05VTQkJOAogI2RlZmluZSBHUE1DX01FTV9TVEFSVAkJMHgwMDAwMDAwMAogI2RlZmluZSBHUE1DX01FTV9FTkQJCTB4M0ZGRkZGRkYKICNkZWZpbmUgQk9PVF9ST01fU1BBQ0UJCTB4MTAwMDAwCS8qIDFNQiAqLwpAQCAtNjQsMTIgKzU5LDkgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3BtY19tZW1fbG9jayk7CiBzdGF0aWMgdW5zaWduZWQJCWdwbWNfY3NfbWFwOwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpncG1jX2Jhc2UgPQotCSh2b2lkIF9faW9tZW0gKikgSU9fQUREUkVTUyhHUE1DX0JBU0UpOwotc3RhdGljIHZvaWQgX19pb21lbSAqZ3BtY19jc19iYXNlID0KLQkodm9pZCBfX2lvbWVtICopIElPX0FERFJFU1MoR1BNQ19CQVNFKSArIEdQTUNfQ1MwOworc3RhdGljIHZvaWQgX19pb21lbSAqZ3BtY19iYXNlOwogCi1zdGF0aWMgc3RydWN0IGNsayAqZ3BtY19mY2s7CitzdGF0aWMgc3RydWN0IGNsayAqZ3BtY19sM19jbGs7CiAKIHN0YXRpYyB2b2lkIGdwbWNfd3JpdGVfcmVnKGludCBpZHgsIHUzMiB2YWwpCiB7CkBAIC04NSwxOSArNzcsMzIgQEAKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ19hZGRyOwogCi0JcmVnX2FkZHIgPSBncG1jX2NzX2Jhc2UgKyAoY3MgKiBHUE1DX0NTX1NJWkUpICsgaWR4OworCXJlZ19hZGRyID0gZ3BtY19iYXNlICsgR1BNQ19DUzAgKyAoY3MgKiBHUE1DX0NTX1NJWkUpICsgaWR4OwogCV9fcmF3X3dyaXRlbCh2YWwsIHJlZ19hZGRyKTsKIH0KIAogdTMyIGdwbWNfY3NfcmVhZF9yZWcoaW50IGNzLCBpbnQgaWR4KQogewotCXJldHVybiBfX3Jhd19yZWFkbChncG1jX2NzX2Jhc2UgKyAoY3MgKiBHUE1DX0NTX1NJWkUpICsgaWR4KTsKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyOworCisJcmVnX2FkZHIgPSBncG1jX2Jhc2UgKyBHUE1DX0NTMCArIChjcyAqIEdQTUNfQ1NfU0laRSkgKyBpZHg7CisJcmV0dXJuIF9fcmF3X3JlYWRsKHJlZ19hZGRyKTsKIH0KIAorLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIGdwbWNfZmNrIHRvIGNsb2NrIGZyYW1ld29yayBhbmQgdXNlIGl0ICovCiB1bnNpZ25lZCBsb25nIGdwbWNfZ2V0X2ZjbGtfcGVyaW9kKHZvaWQpCiB7Ci0JLyogSW4gcGljb3NlY29uZHMgKi8KLQlyZXR1cm4gMTAwMDAwMDAwMCAvICgoY2xrX2dldF9yYXRlKGdwbWNfZmNrKSkgLyAxMDAwKTsKKwl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtfZ2V0X3JhdGUoZ3BtY19sM19jbGspOworCisJaWYgKHJhdGUgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJncG1jX2wzX2NsayBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJhdGUgLz0gMTAwMDsKKwlyYXRlID0gMTAwMDAwMDAwMCAvIHJhdGU7CS8qIEluIHBpY29zZWNvbmRzICovCisKKwlyZXR1cm4gcmF0ZTsKIH0KIAogdW5zaWduZWQgaW50IGdwbWNfbnNfdG9fdGlja3ModW5zaWduZWQgaW50IHRpbWVfbnMpCkBAIC0xMTAsNiArMTE1LDExIEBACiAJcmV0dXJuICh0aW1lX25zICogMTAwMCArIHRpY2tfcHMgLSAxKSAvIHRpY2tfcHM7CiB9CiAKK3Vuc2lnbmVkIGludCBncG1jX3RpY2tzX3RvX25zKHVuc2lnbmVkIGludCB0aWNrcykKK3sKKwlyZXR1cm4gdGlja3MgKiBncG1jX2dldF9mY2xrX3BlcmlvZCgpIC8gMTAwMDsKK30KKwogdW5zaWduZWQgaW50IGdwbWNfcm91bmRfbnNfdG9fdGlja3ModW5zaWduZWQgaW50IHRpbWVfbnMpCiB7CiAJdW5zaWduZWQgbG9uZyB0aWNrcyA9IGdwbWNfbnNfdG9fdGlja3ModGltZV9ucyk7CkBAIC0yMTAsNiArMjIwLDExIEBACiAKIAlHUE1DX1NFVF9PTkUoR1BNQ19DU19DT05GSUc1LCAyNCwgMjcsIHBhZ2VfYnVyc3RfYWNjZXNzKTsKIAorCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQlHUE1DX1NFVF9PTkUoR1BNQ19DU19DT05GSUc2LCAxNiwgMTksIHdyX2RhdGFfbXV4X2J1cyk7CisJCUdQTUNfU0VUX09ORShHUE1DX0NTX0NPTkZJRzYsIDI0LCAyOCwgd3JfYWNjZXNzKTsKKwl9CisKIAkvKiBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBpbml0aWFsaXplZCBDT05GSUcxIHRvIGNvdmVyCiAJICogYXQgbGVhc3Qgc3luYyB2cyBhc3luYwogCSAqLwpAQCAtMzUwLDYgKzM2NSw3IEBACiAJc3Bpbl91bmxvY2soJmdwbWNfbWVtX2xvY2spOwogCXJldHVybiByOwogfQorRVhQT1JUX1NZTUJPTChncG1jX2NzX3JlcXVlc3QpOwogCiB2b2lkIGdwbWNfY3NfZnJlZShpbnQgY3MpCiB7CkBAIC0zNjUsOCArMzgxLDkgQEAKIAlncG1jX2NzX3NldF9yZXNlcnZlZChjcywgMCk7CiAJc3Bpbl91bmxvY2soJmdwbWNfbWVtX2xvY2spOwogfQorRVhQT1JUX1NZTUJPTChncG1jX2NzX2ZyZWUpOwogCi12b2lkIF9faW5pdCBncG1jX21lbV9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZ3BtY19tZW1faW5pdCh2b2lkKQogewogCWludCBjczsKIAl1bnNpZ25lZCBsb25nIGJvb3Rfcm9tX3NwYWNlID0gMDsKQEAgLTM5NiwxMiArNDEzLDMzIEBACiB2b2lkIF9faW5pdCBncG1jX2luaXQodm9pZCkKIHsKIAl1MzIgbDsKKwljaGFyICpjazsKIAotCWdwbWNfZmNrID0gY2xrX2dldChOVUxMLCAiZ3BtY19mY2siKTsgLyogQWx3YXlzIG9uIEVOQUJMRV9PTl9JTklUICovCi0JaWYgKElTX0VSUihncG1jX2ZjaykpCi0JCVdBUk5fT04oMSk7Ci0JZWxzZQotCQljbGtfZW5hYmxlKGdwbWNfZmNrKTsKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJY2sgPSAiY29yZV9sM19jayI7CisJCWlmIChjcHVfaXNfb21hcDI0MjAoKSkKKwkJCWwgPSBPTUFQMjQyMF9HUE1DX0JBU0U7CisJCWVsc2UKKwkJCWwgPSBPTUFQMzRYWF9HUE1DX0JBU0U7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQljayA9ICJncG1jX2ZjayI7CisJCWwgPSBPTUFQMzRYWF9HUE1DX0JBU0U7CisJfQorCisJZ3BtY19sM19jbGsgPSBjbGtfZ2V0KE5VTEwsIGNrKTsKKwlpZiAoSVNfRVJSKGdwbWNfbDNfY2xrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBnZXQgR1BNQyBjbG9jayAlc1xuIiwgY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlncG1jX2Jhc2UgPSBpb3JlbWFwKGwsIFNaXzRLKTsKKwlpZiAoIWdwbWNfYmFzZSkgeworCQljbGtfcHV0KGdwbWNfbDNfY2xrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZ2V0IEdQTUMgcmVnaXN0ZXIgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJQlVHX09OKElTX0VSUihncG1jX2wzX2NsaykpOwogCiAJbCA9IGdwbWNfcmVhZF9yZWcoR1BNQ19SRVZJU0lPTik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiR1BNQyByZXZpc2lvbiAlZC4lZFxuIiwgKGwgPj4gNCkgJiAweDBmLCBsICYgMHgwZik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKaW5kZXggYTVkNDUyNi4uYmY0NWZmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYwpAQCAtMTQsMjcgKzE0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogCisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKLSNkZWZpbmUgVEFQX0JBU0UJaW9fcDJ2KDB4NDgwMTQwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKQotI2RlZmluZSBUQVBfQkFTRQlpb19wMnYoMHg0OTAwQTAwMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCi0jZGVmaW5lIFRBUF9CQVNFCWlvX3AydigweDQ4MzBBMDAwKQotI2VuZGlmCitzdGF0aWMgdTMyIGNsYXNzOworc3RhdGljIHZvaWQgX19pb21lbSAqdGFwX2Jhc2U7CitzdGF0aWMgdTE2IHRhcF9wcm9kX2lkOwogCiAjZGVmaW5lIE9NQVBfVEFQX0lEQ09ERQkJMHgwMjA0Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKLSNkZWZpbmUgT01BUF9UQVBfUFJPRF9JRAkweDAyMTAKLSNlbHNlCi0jZGVmaW5lIE9NQVBfVEFQX1BST0RfSUQJMHgwMjA4Ci0jZW5kaWYKLQogI2RlZmluZSBPTUFQX1RBUF9ESUVfSURfMAkweDAyMTgKICNkZWZpbmUgT01BUF9UQVBfRElFX0lEXzEJMHgwMjFDCiAjZGVmaW5lIE9NQVBfVEFQX0RJRV9JRF8yCTB4MDIyMApAQCAtOTMsMTggKzg1LDI0IEBACiAJICogaXQgbWVhbnMgaXRzIENvcnRleCByMHAwIHdoaWNoIGlzIDM0MzAgRVMxCiAJICovCiAJaWYgKCgoKGNwdWlkID4+IDQpICYgMHhGRkYpID09IDB4QzA4KSAmJiAoKGNwdWlkICYgMHhGKSA9PSAweDApKSB7CisKKwkJaWYgKHJlZyA9PSB0YXBfcHJvZF9pZCkgeworCQkJcmVndmFsID0gMHgwMDBGMDBGMDsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBPTUFQX1RBUF9JRENPREUgIDogcmVndmFsID0gMHgwQjdBRTAyRjsgYnJlYWs7CiAJCS8qIE1ha2luZyBEZXZUeXBlIGFzIDB4RiBpbiBFUzEgdG8gZGlmZmVyIGZyb20gRVMyICovCi0JCWNhc2UgT01BUF9UQVBfUFJPRF9JRCA6IHJlZ3ZhbCA9IDB4MDAwRjAwRjA7IGJyZWFrOwogCQljYXNlIE9NQVBfVEFQX0RJRV9JRF8wOiByZWd2YWwgPSAweDAxMDAwMDAwOyBicmVhazsKIAkJY2FzZSBPTUFQX1RBUF9ESUVfSURfMTogcmVndmFsID0gMHgxMDEyZDY4NzsgYnJlYWs7CiAJCWNhc2UgT01BUF9UQVBfRElFX0lEXzI6CXJlZ3ZhbCA9IDB4MDAwMDAwMDA7IGJyZWFrOwogCQljYXNlIE9NQVBfVEFQX0RJRV9JRF8zOglyZWd2YWwgPSAweDJkMmMwMDAwOyBicmVhazsKIAkJfQogCX0gZWxzZQotCQlyZWd2YWwgPSBfX3Jhd19yZWFkbChUQVBfQkFTRSArIHJlZyk7CisJCXJlZ3ZhbCA9IF9fcmF3X3JlYWRsKHRhcF9iYXNlICsgcmVnKTsKIAorb3V0OgogCXJldHVybiByZWd2YWw7CiAKIH0KQEAgLTIwMyw3ICsyMDEsNyBAQAogCXU4ICByZXY7CiAKIAlpZGNvZGUgPSByZWFkX3RhcF9yZWcoT01BUF9UQVBfSURDT0RFKTsKLQlwcm9kX2lkID0gcmVhZF90YXBfcmVnKE9NQVBfVEFQX1BST0RfSUQpOworCXByb2RfaWQgPSByZWFkX3RhcF9yZWcodGFwX3Byb2RfaWQpOwogCWhhd2tleWUgPSAoaWRjb2RlID4+IDEyKSAmIDB4ZmZmZjsKIAlyZXYgPSAoaWRjb2RlID4+IDI4KSAmIDB4MGY7CiAJZGV2X3R5cGUgPSAocHJvZF9pZCA+PiAxNikgJiAweDBmOwpAQCAtMjY4LDMgKzI2NiwxMyBAQAogCiB9CiAKK3ZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzX3RhcChzdHJ1Y3Qgb21hcF9nbG9iYWxzICpvbWFwMl9nbG9iYWxzKQoreworCWNsYXNzID0gb21hcDJfZ2xvYmFscy0+Y2xhc3M7CisJdGFwX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT50YXA7CisKKwlpZiAoY2xhc3MgPT0gMHgzNDMwKQorCQl0YXBfcHJvZF9pZCA9IDB4MDIxMDsKKwllbHNlCisJCXRhcF9wcm9kX2lkID0gMHgwMjA4OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCmluZGV4IDk4NzM1MWYuLjVlYTY0ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKQEAgLTQsOCArNCwxMSBAQAogICogT01BUDIgSS9PIG1hcHBpbmcgY29kZQogICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgotICogVXBkYXRlZCBtYXAgZGVzYyB0byBhZGQgMjQzMCBzdXBwb3J0IDogPHgwa2hhc2ltQHRpLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEF1dGhvcjoKKyAqCUp1aGEgWXJqb2xhIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKglTeWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTUsMjcgKzE4LDM0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9vbWFwZmIuaD4KKyNpbmNsdWRlIDxtYWNoL3NyYW0uaD4KIAotZXh0ZXJuIHZvaWQgb21hcF9zcmFtX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IG9tYXAyX2Nsa19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgb21hcDJfY2hlY2tfcmV2aXNpb24odm9pZCk7Ci1leHRlcm4gdm9pZCBvbWFwMl9pbml0X21lbW9yeSh2b2lkKTsKLWV4dGVybiB2b2lkIGdwbWNfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBmYl9yZXNlcnZlX3NkcmFtKHZvaWQpOworI2luY2x1ZGUgIm1lbW9yeS5oIgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworI2luY2x1ZGUgPG1hY2gvcG93ZXJkb21haW4uaD4KKworI2luY2x1ZGUgInBvd2VyZG9tYWlucy5oIgorCisjaW5jbHVkZSA8bWFjaC9jbG9ja2RvbWFpbi5oPgorI2luY2x1ZGUgImNsb2NrZG9tYWlucy5oIgogCiAvKgogICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQogICogZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVkIGhlcmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMjR4eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CiAJCS52aXJ0dWFsCT0gTDNfMjRYWF9WSVJULAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDNfMjRYWF9QSFlTKSwKQEAgLTQzLDI1ICs1MywxNSBAQAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKIAl9LAogCXsKLQkJLnZpcnR1YWwgICAgICAgID0gTDRfMjRYWF9WSVJULAotCQkucGZuICAgICAgICAgICAgPSBfX3BoeXNfdG9fcGZuKEw0XzI0WFhfUEhZUyksCi0JCS5sZW5ndGggICAgICAgICA9IEw0XzI0WFhfU0laRSwKLQkJLnR5cGUgICAgICAgICAgID0gTVRfREVWSUNFCi0JfSwKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAotCXsKLQkJLnZpcnR1YWwJPSBMNF9XS18yNDNYX1ZJUlQsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihMNF9XS18yNDNYX1BIWVMpLAotCQkubGVuZ3RoCQk9IEw0X1dLXzI0M1hfU0laRSwKKwkJLnZpcnR1YWwJPSBMNF8yNFhYX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihMNF8yNFhYX1BIWVMpLAorCQkubGVuZ3RoCQk9IEw0XzI0WFhfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCiAJfSwKLQl7Ci0JCS52aXJ0dWFsCT0gT01BUDI0M1hfR1BNQ19WSVJULAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oT01BUDI0M1hfR1BNQ19QSFlTKSwKLQkJLmxlbmd0aAkJPSBPTUFQMjQzWF9HUE1DX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0sCi0jZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQyMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMjQyeF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CiAJCS52aXJ0dWFsCT0gRFNQX01FTV8yNFhYX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihEU1BfTUVNXzI0WFhfUEhZUyksCkBAIC03OSwxMiArNzksMTA5IEBACiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihEU1BfTU1VXzI0WFhfUEhZUyksCiAJCS5sZW5ndGgJCT0gRFNQX01NVV8yNFhYX1NJWkUsCiAJCS50eXBlCQk9IE1UX0RFVklDRQotCX0KKwl9LAogfTsKIAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAorc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMjQzeF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gTDRfV0tfMjQzWF9WSVJULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDRfV0tfMjQzWF9QSFlTKSwKKwkJLmxlbmd0aAkJPSBMNF9XS18yNDNYX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCisJeworCQkudmlydHVhbAk9IE9NQVAyNDNYX0dQTUNfVklSVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKE9NQVAyNDNYX0dQTUNfUEhZUyksCisJCS5sZW5ndGgJCT0gT01BUDI0M1hfR1BNQ19TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBPTUFQMjQzWF9TRFJDX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihPTUFQMjQzWF9TRFJDX1BIWVMpLAorCQkubGVuZ3RoCQk9IE9NQVAyNDNYX1NEUkNfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gT01BUDI0M1hfU01TX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihPTUFQMjQzWF9TTVNfUEhZUyksCisJCS5sZW5ndGgJCT0gT01BUDI0M1hfU01TX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCit9OworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAzNFhYCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAzNHh4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBMM18zNFhYX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihMM18zNFhYX1BIWVMpLAorCQkubGVuZ3RoCQk9IEwzXzM0WFhfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gTDRfMzRYWF9WSVJULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDRfMzRYWF9QSFlTKSwKKwkJLmxlbmd0aAkJPSBMNF8zNFhYX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCisJeworCQkudmlydHVhbAk9IEw0X1dLXzM0WFhfVklSVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEw0X1dLXzM0WFhfUEhZUyksCisJCS5sZW5ndGgJCT0gTDRfV0tfMzRYWF9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBPTUFQMzRYWF9HUE1DX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihPTUFQMzRYWF9HUE1DX1BIWVMpLAorCQkubGVuZ3RoCQk9IE9NQVAzNFhYX0dQTUNfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gT01BUDM0M1hfU01TX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihPTUFQMzQzWF9TTVNfUEhZUyksCisJCS5sZW5ndGgJCT0gT01BUDM0M1hfU01TX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCisJeworCQkudmlydHVhbAk9IE9NQVAzNDNYX1NEUkNfVklSVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKE9NQVAzNDNYX1NEUkNfUEhZUyksCisJCS5sZW5ndGgJCT0gT01BUDM0M1hfU0RSQ19TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBMNF9QRVJfMzRYWF9WSVJULAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDRfUEVSXzM0WFhfUEhZUyksCisJCS5sZW5ndGgJCT0gTDRfUEVSXzM0WFhfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gTDRfRU1VXzM0WFhfVklSVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEw0X0VNVV8zNFhYX1BIWVMpLAorCQkubGVuZ3RoCQk9IEw0X0VNVV8zNFhYX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCit9OworI2VuZGlmCisKIHZvaWQgX19pbml0IG9tYXAyX21hcF9jb21tb25faW8odm9pZCkKIHsKLQlpb3RhYmxlX2luaXQob21hcDJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMl9pb19kZXNjKSk7CisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKKwlpb3RhYmxlX2luaXQob21hcDI0eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMjR4eF9pb19kZXNjKSk7CisJaW90YWJsZV9pbml0KG9tYXAyNDJ4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDI0MnhfaW9fZGVzYykpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKQorCWlvdGFibGVfaW5pdChvbWFwMjR4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAyNHh4X2lvX2Rlc2MpKTsKKwlpb3RhYmxlX2luaXQob21hcDI0M3hfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMjQzeF9pb19kZXNjKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCisJaW90YWJsZV9pbml0KG9tYXAzNHh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDM0eHhfaW9fZGVzYykpOworI2VuZGlmCiAKIAkvKiBOb3JtYWxseSBkZXZpY2VtYXBzX2luaXQoKSB3b3VsZCBmbHVzaCBjYWNoZXMgYW5kIHRsYiBhZnRlcgogCSAqIG1kZXNjLT5tYXBfaW8oKSwgYnV0IHdlIG11c3QgYWxzbyBkbyBpdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIENQVQpAQCAtMTAxLDEyICsxOTgsOSBAQAogdm9pZCBfX2luaXQgb21hcDJfaW5pdF9jb21tb25faHcodm9pZCkKIHsKIAlvbWFwMl9tdXhfaW5pdCgpOworCXB3cmRtX2luaXQocG93ZXJkb21haW5zX29tYXApOworCWNsa2RtX2luaXQoY2xvY2tkb21haW5zX29tYXAsIGNsa2RtX3B3cmRtX2F1dG9kZXBzKTsKIAlvbWFwMl9jbGtfaW5pdCgpOwotLyoKLSAqIE5lZWQgdG8gRml4IHRoaXMgZm9yIDI0MzAKLSAqLwotI2lmbmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAogCW9tYXAyX2luaXRfbWVtb3J5KCk7Ci0jZW5kaWYKIAlncG1jX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCmluZGV4IDllZjE1YjMuLmQzNTRlMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYwpAQCAtMTMsMTcgKzEzLDIzIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBJTlRDX1JFVklTSU9OCTB4MDAwMAotI2RlZmluZSBJTlRDX1NZU0NPTkZJRwkweDAwMTAKLSNkZWZpbmUgSU5UQ19TWVNTVEFUVVMJMHgwMDE0Ci0jZGVmaW5lIElOVENfQ09OVFJPTAkweDAwNDgKLSNkZWZpbmUgSU5UQ19NSVJfQ0xFQVIwCTB4MDA4OAotI2RlZmluZSBJTlRDX01JUl9TRVQwCTB4MDA4YworCisvKiBzZWxlY3RlZCBJTlRDIHJlZ2lzdGVyIG9mZnNldHMgKi8KKworI2RlZmluZSBJTlRDX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgSU5UQ19TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBJTlRDX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIElOVENfQ09OVFJPTAkJMHgwMDQ4CisjZGVmaW5lIElOVENfTUlSX0NMRUFSMAkJMHgwMDg4CisjZGVmaW5lIElOVENfTUlSX1NFVDAJCTB4MDA4YworI2RlZmluZSBJTlRDX1BFTkRJTkdfSVJRMAkweDAwOTgKKworLyogTnVtYmVyIG9mIElSUSBzdGF0ZSBiaXRzIGluIGVhY2ggTUlSIHJlZ2lzdGVyICovCisjZGVmaW5lIElSUV9CSVRTX1BFUl9SRUcJMzIKIAogLyoKICAqIE9NQVAyIGhhcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXJzLCBlYWNoIGludGVycnVwdApAQCAtMzIsNDggKzM4LDUwIEBACiAgKiBmb3IgZWFjaCBiYW5rLi4gd2hlbiBpbiBkb3VidCwgY29uc3VsdCB0aGUgVFJNLgogICovCiBzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2JhbmsgewotCXVuc2lnbmVkIGxvbmcgYmFzZV9yZWc7CisJdm9pZCBfX2lvbWVtICpiYXNlX3JlZzsKIAl1bnNpZ25lZCBpbnQgbnJfaXJxczsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKSBpcnFfYmFua3NbXSA9IHsKIAl7CiAJCS8qIE1QVSBJTlRDICovCi0JCS5iYXNlX3JlZwk9IElPX0FERFJFU1MoT01BUDI0WFhfSUNfQkFTRSksCisJCS5iYXNlX3JlZwk9IDAsCiAJCS5ucl9pcnFzCT0gOTYsCi0JfSwgewotCQkvKiBYWFg6IERTUCBJTlRDICovCi0JfQorCX0sCiB9OwogCisvKiBJTlRDIGJhbmsgcmVnaXN0ZXIgZ2V0L3NldCAqLworCitzdGF0aWMgdm9pZCBpbnRjX2Jhbmtfd3JpdGVfcmVnKHUzMiB2YWwsIHN0cnVjdCBvbWFwX2lycV9iYW5rICpiYW5rLCB1MTYgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGJhbmstPmJhc2VfcmVnICsgcmVnKTsKK30KKworc3RhdGljIHUzMiBpbnRjX2JhbmtfcmVhZF9yZWcoc3RydWN0IG9tYXBfaXJxX2JhbmsgKmJhbmssIHUxNiByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGJhbmstPmJhc2VfcmVnICsgcmVnKTsKK30KKwogLyogWFhYOiBGSVEgYW5kIGFkZGl0aW9uYWwgSU5UQyBzdXBwb3J0IChvbmx5IE1QVSBhdCB0aGUgbW9tZW50KSAqLwogc3RhdGljIHZvaWQgb21hcF9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JX19yYXdfd3JpdGVsKDB4MSwgaXJxX2JhbmtzWzBdLmJhc2VfcmVnICsgSU5UQ19DT05UUk9MKTsKKwlpbnRjX2Jhbmtfd3JpdGVfcmVnKDB4MSwgJmlycV9iYW5rc1swXSwgSU5UQ19DT05UUk9MKTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWludCBvZmZzZXQgPSAoaXJxID4+IDUpIDw8IDU7CisJaW50IG9mZnNldCA9IGlycSAmICh+KElSUV9CSVRTX1BFUl9SRUcgLSAxKSk7CiAKLQlpZiAoaXJxID49IDY0KSB7Ci0JCWlycSAlPSA2NDsKLQl9IGVsc2UgaWYgKGlycSA+PSAzMikgewotCQlpcnEgJT0gMzI7Ci0JfQorCWlycSAmPSAoSVJRX0JJVFNfUEVSX1JFRyAtIDEpOwogCi0JX19yYXdfd3JpdGVsKDEgPDwgaXJxLCBpcnFfYmFua3NbMF0uYmFzZV9yZWcgKyBJTlRDX01JUl9TRVQwICsgb2Zmc2V0KTsKKwlpbnRjX2Jhbmtfd3JpdGVfcmVnKDEgPDwgaXJxLCAmaXJxX2JhbmtzWzBdLCBJTlRDX01JUl9TRVQwICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaW50IG9mZnNldCA9IChpcnEgPj4gNSkgPDwgNTsKKwlpbnQgb2Zmc2V0ID0gaXJxICYgKH4oSVJRX0JJVFNfUEVSX1JFRyAtIDEpKTsKIAotCWlmIChpcnEgPj0gNjQpIHsKLQkJaXJxICU9IDY0OwotCX0gZWxzZSBpZiAoaXJxID49IDMyKSB7Ci0JCWlycSAlPSAzMjsKLQl9CisJaXJxICY9IChJUlFfQklUU19QRVJfUkVHIC0gMSk7CiAKLQlfX3Jhd193cml0ZWwoMSA8PCBpcnEsIGlycV9iYW5rc1swXS5iYXNlX3JlZyArIElOVENfTUlSX0NMRUFSMCArIG9mZnNldCk7CisJaW50Y19iYW5rX3dyaXRlX3JlZygxIDw8IGlycSwgJmlycV9iYW5rc1swXSwgSU5UQ19NSVJfQ0xFQVIwICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTkzLDIwICsxMDEsMjAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAotCXRtcCA9IF9fcmF3X3JlYWRsKGJhbmstPmJhc2VfcmVnICsgSU5UQ19SRVZJU0lPTikgJiAweGZmOwotCXByaW50ayhLRVJOX0lORk8gIklSUTogRm91bmQgYW4gSU5UQyBhdCAweCUwOGx4ICIKKwl0bXAgPSBpbnRjX2JhbmtfcmVhZF9yZWcoYmFuaywgSU5UQ19SRVZJU0lPTikgJiAweGZmOworCXByaW50ayhLRVJOX0lORk8gIklSUTogRm91bmQgYW4gSU5UQyBhdCAweCVwICIKIAkJCSAiKHJldmlzaW9uICVsZC4lbGQpIHdpdGggJWQgaW50ZXJydXB0c1xuIiwKIAkJCSBiYW5rLT5iYXNlX3JlZywgdG1wID4+IDQsIHRtcCAmIDB4ZiwgYmFuay0+bnJfaXJxcyk7CiAKLQl0bXAgPSBfX3Jhd19yZWFkbChiYW5rLT5iYXNlX3JlZyArIElOVENfU1lTQ09ORklHKTsKKwl0bXAgPSBpbnRjX2JhbmtfcmVhZF9yZWcoYmFuaywgSU5UQ19TWVNDT05GSUcpOwogCXRtcCB8PSAxIDw8IDE7CS8qIHNvZnQgcmVzZXQgKi8KLQlfX3Jhd193cml0ZWwodG1wLCBiYW5rLT5iYXNlX3JlZyArIElOVENfU1lTQ09ORklHKTsKKwlpbnRjX2Jhbmtfd3JpdGVfcmVnKHRtcCwgYmFuaywgSU5UQ19TWVNDT05GSUcpOwogCi0Jd2hpbGUgKCEoX19yYXdfcmVhZGwoYmFuay0+YmFzZV9yZWcgKyBJTlRDX1NZU1NUQVRVUykgJiAweDEpKQorCXdoaWxlICghKGludGNfYmFua19yZWFkX3JlZyhiYW5rLCBJTlRDX1NZU1NUQVRVUykgJiAweDEpKQogCQkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZSAqLzsKIAogCS8qIEVuYWJsZSBhdXRvaWRsZSAqLwotCV9fcmF3X3dyaXRlbCgxIDw8IDAsIGJhbmstPmJhc2VfcmVnICsgSU5UQ19TWVNDT05GSUcpOworCWludGNfYmFua193cml0ZV9yZWcoMSA8PCAwLCBiYW5rLCBJTlRDX1NZU0NPTkZJRyk7CiB9CiAKIHZvaWQgX19pbml0IG9tYXBfaW5pdF9pcnEodm9pZCkKQEAgLTExOCw5ICsxMjYsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfYmFua3MpOyBpKyspIHsKIAkJc3RydWN0IG9tYXBfaXJxX2JhbmsgKmJhbmsgPSBpcnFfYmFua3MgKyBpOwogCi0JCS8qIFhYWCAqLwotCQlpZiAoIWJhbmstPmJhc2VfcmVnKQotCQkJY29udGludWU7CisJCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJCWJhbmstPmJhc2VfcmVnID0gT01BUDJfSU9fQUREUkVTUyhPTUFQMjRYWF9JQ19CQVNFKTsKKwkJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCisJCQliYW5rLT5iYXNlX3JlZyA9IE9NQVAyX0lPX0FERFJFU1MoT01BUDM0WFhfSUNfQkFTRSk7CiAKIAkJb21hcF9pcnFfYmFua19pbml0X29uZShiYW5rKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tYWlsYm94LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwppbmRleCBhNDgwYjk2Li4zMmI3YWYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYwpAQCAtMTQsOSArMTQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9tYWlsYm94Lmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgTUFJTEJPWF9SRVZJU0lPTgkJMHgwMAogI2RlZmluZSBNQUlMQk9YX1NZU0NPTkZJRwkJMHgxMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCmluZGV4IDI3ZWI2ZTMuLmNhZTNlYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKQEAgLTg5LDYgKzg5LDMwIEBACiAJCQkuZGlzYWJsZQk9IG9tYXBfbWNic3BfY2xrX2Rpc2FibGUsCiAJCX0sCiAJfSwKKwl7CisJCS5jbGsgPSB7CisJCQkubmFtZQkJPSAibWNic3BfY2xrIiwKKwkJCS5pZAkJPSAzLAorCQkJLmVuYWJsZQkJPSBvbWFwX21jYnNwX2Nsa19lbmFibGUsCisJCQkuZGlzYWJsZQk9IG9tYXBfbWNic3BfY2xrX2Rpc2FibGUsCisJCX0sCisJfSwKKwl7CisJCS5jbGsgPSB7CisJCQkubmFtZQkJPSAibWNic3BfY2xrIiwKKwkJCS5pZAkJPSA0LAorCQkJLmVuYWJsZQkJPSBvbWFwX21jYnNwX2Nsa19lbmFibGUsCisJCQkuZGlzYWJsZQk9IG9tYXBfbWNic3BfY2xrX2Rpc2FibGUsCisJCX0sCisJfSwKKwl7CisJCS5jbGsgPSB7CisJCQkubmFtZQkJPSAibWNic3BfY2xrIiwKKwkJCS5pZAkJPSA1LAorCQkJLmVuYWJsZQkJPSBvbWFwX21jYnNwX2Nsa19lbmFibGUsCisJCQkuZGlzYWJsZQk9IG9tYXBfbWNic3BfY2xrX2Rpc2FibGUsCisJCX0sCisJfSwKIH07CiAKICNkZWZpbmUgb21hcF9tY2JzcF9jbGtzX3NpemUJQVJSQVlfU0laRShvbWFwX21jYnNwX2Nsa3MpCkBAIC0xMTcsMjQgKzE0MSwxNCBAQAogCQlvbWFwMl9tY2JzcDJfbXV4X3NldHVwKCk7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDJfbWNic3BfY2hlY2sodW5zaWduZWQgaW50IGlkKQotewotCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UIC0gMSkgewotCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IE1jQlNQJWQgZG9lc24ndCBleGlzdFxuIiwgaWQgKyAxKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfbWNic3Bfb3BzIG9tYXAyX21jYnNwX29wcyA9IHsKIAkucmVxdWVzdAk9IG9tYXAyX21jYnNwX3JlcXVlc3QsCi0JLmNoZWNrCQk9IG9tYXAyX21jYnNwX2NoZWNrLAogfTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCi1zdGF0aWMgc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSBvbWFwMjR4eF9tY2JzcF9wZGF0YVtdID0geworI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNDIwCitzdGF0aWMgc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSBvbWFwMjQyMF9tY2JzcF9wZGF0YVtdID0gewogCXsKLQkJLnZpcnRfYmFzZQk9IElPX0FERFJFU1MoT01BUDI0WFhfTUNCU1AxX0JBU0UpLAorCQkucGh5c19iYXNlCT0gT01BUDI0WFhfTUNCU1AxX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDFfUlgsCiAJCS5kbWFfdHhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDFfVFgsCiAJCS5yeF9pcnEJCT0gSU5UXzI0WFhfTUNCU1AxX0lSUV9SWCwKQEAgLTE0Myw3ICsxNTcsNyBAQAogCQkuY2xrX25hbWUJPSAibWNic3BfY2xrIiwKIAl9LAogCXsKLQkJLnZpcnRfYmFzZQk9IElPX0FERFJFU1MoT01BUDI0WFhfTUNCU1AyX0JBU0UpLAorCQkucGh5c19iYXNlCT0gT01BUDI0WFhfTUNCU1AyX0JBU0UsCiAJCS5kbWFfcnhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDJfUlgsCiAJCS5kbWFfdHhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDJfVFgsCiAJCS5yeF9pcnEJCT0gSU5UXzI0WFhfTUNCU1AyX0lSUV9SWCwKQEAgLTE1MiwxNiArMTY2LDcwIEBACiAJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAogCX0sCiB9OwotI2RlZmluZSBPTUFQMjRYWF9NQ0JTUF9QREFUQV9TWgkJQVJSQVlfU0laRShvbWFwMjR4eF9tY2JzcF9wZGF0YSkKKyNkZWZpbmUgT01BUDI0MjBfTUNCU1BfUERBVEFfU1oJCUFSUkFZX1NJWkUob21hcDI0MjBfbWNic3BfcGRhdGEpCiAjZWxzZQotI2RlZmluZSBvbWFwMjR4eF9tY2JzcF9wZGF0YQkJTlVMTAotI2RlZmluZSBPTUFQMjRYWF9NQ0JTUF9QREFUQV9TWgkJMAorI2RlZmluZSBvbWFwMjQyMF9tY2JzcF9wZGF0YQkJTlVMTAorI2RlZmluZSBPTUFQMjQyMF9NQ0JTUF9QREFUQV9TWgkJMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAorc3RhdGljIHN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgb21hcDI0MzBfbWNic3BfcGRhdGFbXSA9IHsKKwl7CisJCS5waHlzX2Jhc2UJPSBPTUFQMjRYWF9NQ0JTUDFfQkFTRSwKKwkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMV9SWCwKKwkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMV9UWCwKKwkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDFfSVJRX1JYLAorCQkudHhfaXJxCQk9IElOVF8yNFhYX01DQlNQMV9JUlFfVFgsCisJCS5vcHMJCT0gJm9tYXAyX21jYnNwX29wcywKKwkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCisJfSwKKwl7CisJCS5waHlzX2Jhc2UJPSBPTUFQMjRYWF9NQ0JTUDJfQkFTRSwKKwkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMl9SWCwKKwkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMl9UWCwKKwkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDJfSVJRX1JYLAorCQkudHhfaXJxCQk9IElOVF8yNFhYX01DQlNQMl9JUlFfVFgsCisJCS5vcHMJCT0gJm9tYXAyX21jYnNwX29wcywKKwkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCisJfSwKKwl7CisJCS5waHlzX2Jhc2UJPSBPTUFQMjQzMF9NQ0JTUDNfQkFTRSwKKwkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQM19SWCwKKwkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQM19UWCwKKwkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDNfSVJRX1JYLAorCQkudHhfaXJxCQk9IElOVF8yNFhYX01DQlNQM19JUlFfVFgsCisJCS5vcHMJCT0gJm9tYXAyX21jYnNwX29wcywKKwkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCisJfSwKKwl7CisJCS5waHlzX2Jhc2UJPSBPTUFQMjQzMF9NQ0JTUDRfQkFTRSwKKwkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQNF9SWCwKKwkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQNF9UWCwKKwkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDRfSVJRX1JYLAorCQkudHhfaXJxCQk9IElOVF8yNFhYX01DQlNQNF9JUlFfVFgsCisJCS5vcHMJCT0gJm9tYXAyX21jYnNwX29wcywKKwkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCisJfSwKKwl7CisJCS5waHlzX2Jhc2UJPSBPTUFQMjQzMF9NQ0JTUDVfQkFTRSwKKwkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQNV9SWCwKKwkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQNV9UWCwKKwkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDVfSVJRX1JYLAorCQkudHhfaXJxCQk9IElOVF8yNFhYX01DQlNQNV9JUlFfVFgsCisJCS5vcHMJCT0gJm9tYXAyX21jYnNwX29wcywKKwkJLmNsa19uYW1lCT0gIm1jYnNwX2NsayIsCisJfSwKK307CisjZGVmaW5lIE9NQVAyNDMwX01DQlNQX1BEQVRBX1NaCQlBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwX3BkYXRhKQorI2Vsc2UKKyNkZWZpbmUgb21hcDI0MzBfbWNic3BfcGRhdGEJCU5VTEwKKyNkZWZpbmUgT01BUDI0MzBfTUNCU1BfUERBVEFfU1oJCTAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDM0WFgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhIG9tYXAzNHh4X21jYnNwX3BkYXRhW10gPSB7CiAJewotCQkudmlydF9iYXNlCT0gSU9fQUREUkVTUyhPTUFQMzRYWF9NQ0JTUDFfQkFTRSksCisJCS5waHlzX2Jhc2UJPSBPTUFQMzRYWF9NQ0JTUDFfQkFTRSwKIAkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMV9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMV9UWCwKIAkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDFfSVJRX1JYLApAQCAtMTcwLDcgKzIzOCw3IEBACiAJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAogCX0sCiAJewotCQkudmlydF9iYXNlCT0gSU9fQUREUkVTUyhPTUFQMzRYWF9NQ0JTUDJfQkFTRSksCisJCS5waHlzX2Jhc2UJPSBPTUFQMzRYWF9NQ0JTUDJfQkFTRSwKIAkJLmRtYV9yeF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMl9SWCwKIAkJLmRtYV90eF9zeW5jCT0gT01BUDI0WFhfRE1BX01DQlNQMl9UWCwKIAkJLnJ4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDJfSVJRX1JYLApAQCAtMTc4LDYgKzI0NiwzMyBAQAogCQkub3BzCQk9ICZvbWFwMl9tY2JzcF9vcHMsCiAJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAogCX0sCisJeworCQkucGh5c19iYXNlCT0gT01BUDM0WFhfTUNCU1AzX0JBU0UsCisJCS5kbWFfcnhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDNfUlgsCisJCS5kbWFfdHhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDNfVFgsCisJCS5yeF9pcnEJCT0gSU5UXzI0WFhfTUNCU1AzX0lSUV9SWCwKKwkJLnR4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDNfSVJRX1RYLAorCQkub3BzCQk9ICZvbWFwMl9tY2JzcF9vcHMsCisJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAorCX0sCisJeworCQkucGh5c19iYXNlCT0gT01BUDM0WFhfTUNCU1A0X0JBU0UsCisJCS5kbWFfcnhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDRfUlgsCisJCS5kbWFfdHhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDRfVFgsCisJCS5yeF9pcnEJCT0gSU5UXzI0WFhfTUNCU1A0X0lSUV9SWCwKKwkJLnR4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDRfSVJRX1RYLAorCQkub3BzCQk9ICZvbWFwMl9tY2JzcF9vcHMsCisJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAorCX0sCisJeworCQkucGh5c19iYXNlCT0gT01BUDM0WFhfTUNCU1A1X0JBU0UsCisJCS5kbWFfcnhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDVfUlgsCisJCS5kbWFfdHhfc3luYwk9IE9NQVAyNFhYX0RNQV9NQ0JTUDVfVFgsCisJCS5yeF9pcnEJCT0gSU5UXzI0WFhfTUNCU1A1X0lSUV9SWCwKKwkJLnR4X2lycQkJPSBJTlRfMjRYWF9NQ0JTUDVfSVJRX1RYLAorCQkub3BzCQk9ICZvbWFwMl9tY2JzcF9vcHMsCisJCS5jbGtfbmFtZQk9ICJtY2JzcF9jbGsiLAorCX0sCiB9OwogI2RlZmluZSBPTUFQMzRYWF9NQ0JTUF9QREFUQV9TWgkJQVJSQVlfU0laRShvbWFwMzR4eF9tY2JzcF9wZGF0YSkKICNlbHNlCkBAIC0xODUsNyArMjgwLDcgQEAKICNkZWZpbmUgT01BUDM0WFhfTUNCU1BfUERBVEFfU1oJCTAKICNlbmRpZgogCi1pbnQgX19pbml0IG9tYXAyX21jYnNwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX21jYnNwX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKIApAQCAtMTk1LDEwICsyOTAsMjQgQEAKIAkJY2xrX3JlZ2lzdGVyKCZvbWFwX21jYnNwX2Nsa3NbaV0uY2xrKTsKIAl9CiAKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCW9tYXBfbWNic3BfcmVnaXN0ZXJfYm9hcmRfY2ZnKG9tYXAyNHh4X21jYnNwX3BkYXRhLAotCQkJCQkJT01BUDI0WFhfTUNCU1BfUERBVEFfU1opOworCWlmIChjcHVfaXNfb21hcDI0MjAoKSkKKwkJb21hcF9tY2JzcF9jb3VudCA9IE9NQVAyNDIwX01DQlNQX1BEQVRBX1NaOworCWlmIChjcHVfaXNfb21hcDI0MzAoKSkKKwkJb21hcF9tY2JzcF9jb3VudCA9IE9NQVAyNDMwX01DQlNQX1BEQVRBX1NaOworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwkJb21hcF9tY2JzcF9jb3VudCA9IE9NQVAzNFhYX01DQlNQX1BEQVRBX1NaOwogCisJbWNic3BfcHRyID0ga3phbGxvYyhvbWFwX21jYnNwX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBvbWFwX21jYnNwICopLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1jYnNwX3B0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY3B1X2lzX29tYXAyNDIwKCkpCisJCW9tYXBfbWNic3BfcmVnaXN0ZXJfYm9hcmRfY2ZnKG9tYXAyNDIwX21jYnNwX3BkYXRhLAorCQkJCQkJT01BUDI0MjBfTUNCU1BfUERBVEFfU1opOworCWlmIChjcHVfaXNfb21hcDI0MzAoKSkKKwkJb21hcF9tY2JzcF9yZWdpc3Rlcl9ib2FyZF9jZmcob21hcDI0MzBfbWNic3BfcGRhdGEsCisJCQkJCQlPTUFQMjQzMF9NQ0JTUF9QREFUQV9TWik7CiAJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQogCQlvbWFwX21jYnNwX3JlZ2lzdGVyX2JvYXJkX2NmZyhvbWFwMzR4eF9tY2JzcF9wZGF0YSwKIAkJCQkJCU9NQVAzNFhYX01DQlNQX1BEQVRBX1NaKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWVtb3J5LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21lbW9yeS5jCmluZGV4IDZiNDljYzkuLjg4MmM3MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWVtb3J5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tZW1vcnkuYwpAQCAtMjEsOCArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KQEAgLTEwMiw2ICsxMDEsMTcgQEAKIAlyZXR1cm4gcHJldjsKIH0KIAorI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKQordm9pZCBvbWFwMl9zcmFtX2Rkcl9pbml0KHUzMiAqc2xvd19kbGxfY3RybCwgdTMyIGZhc3RfZGxsX2N0cmwsCisJCQkJdTMyIGJhc2VfY3MsIHUzMiBmb3JjZV91bmxvY2spCit7Cit9Cit2b2lkIG9tYXAyX3NyYW1fcmVwcm9ncmFtX3NkcmModTMyIHBlcmZfbGV2ZWwsIHUzMiBkbGxfdmFsLAorCQkJCSAgICAgIHUzMiBtZW1fdHlwZSkKK3sKK30KKyNlbmRpZgorCiB2b2lkIG9tYXAyX2luaXRfbWVtb3J5X3BhcmFtcyh1MzIgZm9yY2VfbG9ja190b191bmxvY2tfbW9kZSkKIHsKIAl1bnNpZ25lZCBsb25nIGRsbF9jbnQ7CkBAIC0xNjYsNiArMTc2LDkgQEAKIHsKIAl1MzIgbDsKIAorCWlmICghY3B1X2lzX29tYXAyNDIwKCkpCisJCXJldHVybjsKKwogCWwgPSBzbXNfcmVhZF9yZWcoU01TX1NZU0NPTkZJRyk7CiAJbCAmPSB+KDB4MyA8PCAzKTsKIAlsIHw9ICgweDIgPDwgMyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tZW1vcnkuaAppbmRleCA5YTI4MGI1Li5iYjNkYjgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWVtb3J5LmgKQEAgLTE0LDYgKzE0LDkgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpZm5kZWYgQVJDSF9BUk1fTUFDSF9PTUFQMl9NRU1PUllfSAorI2RlZmluZSBBUkNIX0FSTV9NQUNIX09NQVAyX01FTU9SWV9ICisKIC8qIE1lbW9yeSB0aW1pbmdzICovCiAjZGVmaW5lIE1fRERSCQkxCiAjZGVmaW5lIE1fTE9DS19DVFJMCSgxIDw8IDIpCkBAIC0zNCwzICszNyw3IEBACiBleHRlcm4gdTMyIG9tYXAyX21lbW9yeV9nZXRfdHlwZSh2b2lkKTsKIHUzMiBvbWFwMl9kbGxfZm9yY2VfbmVlZGVkKHZvaWQpOwogdTMyIG9tYXAyX3JlcHJvZ3JhbV9zZHJjKHUzMiBsZXZlbCwgdTMyIGZvcmNlKTsKK3ZvaWQgX19pbml0IG9tYXAyX2luaXRfbWVtb3J5KHZvaWQpOwordm9pZCBfX2luaXQgZ3BtY19pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCmluZGV4IDQ0M2QwN2YuLmIxMzkzNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCiAgKgotICogT01BUDIgcGluIG11bHRpcGxleGluZyBjb25maWd1cmF0aW9ucworICogT01BUDIgYW5kIE9NQVAzIHBpbiBtdWx0aXBsZXhpbmcgY29uZmlndXJhdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA4IFRleGFzIEluc3RydW1lbnRzIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDggTm9raWEgQ29ycG9yYXRpb24KQEAgLTI1LDEwICsyNSwxMSBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKICNpbmNsdWRlIDxtYWNoL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogCkBAIC0yMTksMTYgKzIyMCwyMjIgQEAKICNkZWZpbmUgT01BUDI0WFhfUElOU19TWgkwCiAjZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDI0WFggKi8KIAotI2RlZmluZSBPTUFQMjRYWF9QVUxMX0VOQQkoMSA8PCAzKQotI2RlZmluZSBPTUFQMjRYWF9QVUxMX1VQCSgxIDw8IDQpCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDM0WFgKK3N0YXRpYyBzdHJ1Y3QgcGluX2NvbmZpZyBfX2luaXRkYXRhX29yX21vZHVsZSBvbWFwMzR4eF9waW5zW10gPSB7CisvKgorICoJCU5hbWUsIHJlZy1vZmZzZXQsCisgKgkJbXV4LW1vZGUgfCBbYWN0aXZlLW1vZGUgfCBvZmYtbW9kZV0KKyAqLworCisvKiAzNHh4IEkyQyAqLworTVVYX0NGR18zNFhYKCJLMjFfMzRYWF9JMkMxX1NDTCIsIDB4MWJhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQorTVVYX0NGR18zNFhYKCJKMjFfMzRYWF9JMkMxX1NEQSIsIDB4MWJjLAorCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQorTVVYX0NGR18zNFhYKCJBRjE1XzM0WFhfSTJDMl9TQ0wiLCAweDFiZSwKKwkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKK01VWF9DRkdfMzRYWCgiQUUxNV8zNFhYX0kyQzJfU0RBIiwgMHgxYzAsCisJCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCitNVVhfQ0ZHXzM0WFgoIkFGMTRfMzRYWF9JMkMzX1NDTCIsIDB4MWMyLAorCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQorTVVYX0NGR18zNFhYKCJBRzE0XzM0WFhfSTJDM19TREEiLCAweDFjNCwKKwkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKK01VWF9DRkdfMzRYWCgiQUQyNl8zNFhYX0kyQzRfU0NMIiwgMHhhMDAsCisJCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCitNVVhfQ0ZHXzM0WFgoIkFFMjZfMzRYWF9JMkM0X1NEQSIsIDB4YTAyLAorCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQorCisvKiBQSFkgLSBIU1VTQjogMTItcGluIFVMUEkgUEhZOiBQb3J0IDEqLworTVVYX0NGR18zNFhYKCJZOF8zNDMwX1VTQjFIU19QSFlfQ0xLIiwgMHg1ZGEsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCitNVVhfQ0ZHXzM0WFgoIlk5XzM0MzBfVVNCMUhTX1BIWV9TVFAiLCAweDVkOCwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX09VVFBVVCkKK01VWF9DRkdfMzRYWCgiQUExNF8zNDMwX1VTQjFIU19QSFlfRElSIiwgMHg1ZWMsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUExMV8zNDMwX1VTQjFIU19QSFlfTlhUIiwgMHg1ZWUsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVzEzXzM0MzBfVVNCMUhTX1BIWV9EMCIsIDB4NWRjLAorCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlcxMl8zNDMwX1VTQjFIU19QSFlfRDEiLCAweDVkZSwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXMTFfMzQzMF9VU0IxSFNfUEhZX0QyIiwgMHg1ZTAsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiWTExXzM0MzBfVVNCMUhTX1BIWV9EMyIsIDB4NWVhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlc5XzM0MzBfVVNCMUhTX1BIWV9ENCIsIDB4NWU0LAorCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlkxMl8zNDMwX1VTQjFIU19QSFlfRDUiLCAweDVlNiwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXOF8zNDMwX1VTQjFIU19QSFlfRDYiLCAweDVlOCwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJZMTNfMzQzMF9VU0IxSFNfUEhZX0Q3IiwgMHg1ZTIsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKKworLyogUEhZIC0gSFNVU0I6IDEyLXBpbiBVTFBJIFBIWTogUG9ydCAyKi8KK01VWF9DRkdfMzRYWCgiQUE4XzM0MzBfVVNCMkhTX1BIWV9DTEsiLCAweDVmMCwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX09VVFBVVCkKK01VWF9DRkdfMzRYWCgiQUExMF8zNDMwX1VTQjJIU19QSFlfU1RQIiwgMHg1ZjIsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCitNVVhfQ0ZHXzM0WFgoIkFBOV8zNDMwX1VTQjJIU19QSFlfRElSIiwgMHg1ZjQsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUIxMV8zNDMwX1VTQjJIU19QSFlfTlhUIiwgMHg1ZjYsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUIxMF8zNDMwX1VTQjJIU19QSFlfRDAiLCAweDVmOCwKKwkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQjlfMzQzMF9VU0IySFNfUEhZX0QxIiwgMHg1ZmEsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVzNfMzQzMF9VU0IySFNfUEhZX0QyIiwgMHgxZDQsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVDRfMzQzMF9VU0IySFNfUEhZX0QzIiwgMHgxZGUsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVDNfMzQzMF9VU0IySFNfUEhZX0Q0IiwgMHgxZDgsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiUjNfMzQzMF9VU0IySFNfUEhZX0Q1IiwgMHgxZGEsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiUjRfMzQzMF9VU0IySFNfUEhZX0Q2IiwgMHgxZGMsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVDJfMzQzMF9VU0IySFNfUEhZX0Q3IiwgMHgxZDYsCisJCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKKworLyogVExMIC0gSFNVU0I6IDEyLXBpbiBUTEwgUG9ydCAxKi8KK01VWF9DRkdfMzRYWCgiWThfMzQzMF9VU0IxSFNfVExMX0NMSyIsIDB4NWRhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlk5XzM0MzBfVVNCMUhTX1RMTF9TVFAiLCAweDVkOCwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKK01VWF9DRkdfMzRYWCgiQUExNF8zNDMwX1VTQjFIU19UTExfRElSIiwgMHg1ZWMsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUExMV8zNDMwX1VTQjFIU19UTExfTlhUIiwgMHg1ZWUsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVzEzXzM0MzBfVVNCMUhTX1RMTF9EMCIsIDB4NWRjLAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlcxMl8zNDMwX1VTQjFIU19UTExfRDEiLCAweDVkZSwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXMTFfMzQzMF9VU0IxSFNfVExMX0QyIiwgMHg1ZTAsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiWTExXzM0MzBfVVNCMUhTX1RMTF9EMyIsIDB4NWVhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlc5XzM0MzBfVVNCMUhTX1RMTF9ENCIsIDB4NWU0LAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlkxMl8zNDMwX1VTQjFIU19UTExfRDUiLCAweDVlNiwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXOF8zNDMwX1VTQjFIU19UTExfRDYiLCAweDVlOCwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJZMTNfMzQzMF9VU0IxSFNfVExMX0Q3IiwgMHg1ZTIsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKKworLyogVExMIC0gSFNVU0I6IDEyLXBpbiBUTEwgUG9ydCAyKi8KK01VWF9DRkdfMzRYWCgiQUE4XzM0MzBfVVNCMkhTX1RMTF9DTEsiLCAweDVmMCwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQTEwXzM0MzBfVVNCMkhTX1RMTF9TVFAiLCAweDVmMiwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKK01VWF9DRkdfMzRYWCgiQUE5XzM0MzBfVVNCMkhTX1RMTF9ESVIiLCAweDVmNCwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQjExXzM0MzBfVVNCMkhTX1RMTF9OWFQiLCAweDVmNiwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQjEwXzM0MzBfVVNCMkhTX1RMTF9EMCIsIDB4NWY4LAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFCOV8zNDMwX1VTQjJIU19UTExfRDEiLCAweDVmYSwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXM18zNDMwX1VTQjJIU19UTExfRDIiLCAweDFkNCwKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJUNF8zNDMwX1VTQjJIU19UTExfRDMiLCAweDFkZSwKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJUM18zNDMwX1VTQjJIU19UTExfRDQiLCAweDFkOCwKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJSM18zNDMwX1VTQjJIU19UTExfRDUiLCAweDFkYSwKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJSNF8zNDMwX1VTQjJIU19UTExfRDYiLCAweDFkYywKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJUMl8zNDMwX1VTQjJIU19UTExfRDciLCAweDFkNiwKKwkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorCisvKiBUTEwgLSBIU1VTQjogMTItcGluIFRMTCBQb3J0IDMqLworTVVYX0NGR18zNFhYKCJBQTZfMzQzMF9VU0IzSFNfVExMX0NMSyIsIDB4MTgwLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFCM18zNDMwX1VTQjNIU19UTExfU1RQIiwgMHgxNjYsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCitNVVhfQ0ZHXzM0WFgoIkFBM18zNDMwX1VTQjNIU19UTExfRElSIiwgMHgxNjgsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiWTNfMzQzMF9VU0IzSFNfVExMX05YVCIsIDB4MTZhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFBNV8zNDMwX1VTQjNIU19UTExfRDAiLCAweDE4NiwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJZNF8zNDMwX1VTQjNIU19UTExfRDEiLCAweDE4NCwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJZNV8zNDMwX1VTQjNIU19UTExfRDIiLCAweDE4OCwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXNV8zNDMwX1VTQjNIU19UTExfRDMiLCAweDE4YSwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQjEyXzM0MzBfVVNCM0hTX1RMTF9ENCIsIDB4MTZjLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFCMTNfMzQzMF9VU0IzSFNfVExMX0Q1IiwgMHgxNmUsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUExM18zNDMwX1VTQjNIU19UTExfRDYiLCAweDE3MCwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBQTEyXzM0MzBfVVNCM0hTX1RMTF9ENyIsIDB4MTcyLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCisKKy8qIFBIWSBGU1VTQjogRlMgU2VyaWFsIGZvciBQb3J0IDEgKG11bHRpcGxlIFBIWSBtb2RlcyBzdXBwb3J0ZWQpICovCitNVVhfQ0ZHXzM0WFgoIkFGMTBfMzQzMF9VU0IxRlNfUEhZX01NMV9SWERQIiwgMHg1ZDgsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUc5XzM0MzBfVVNCMUZTX1BIWV9NTTFfUlhETSIsIDB4NWVlLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlcxM18zNDMwX1VTQjFGU19QSFlfTU0xX1JYUkNWIiwgMHg1ZGMsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVzEyXzM0MzBfVVNCMUZTX1BIWV9NTTFfVFhTRTAiLCAweDVkZSwKKwkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJXMTFfMzQzMF9VU0IxRlNfUEhZX01NMV9UWERBVCIsIDB4NWUwLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlkxMV8zNDMwX1VTQjFGU19QSFlfTU0xX1RYRU5fTiIsIDB4NWVhLAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQorCisvKiBQSFkgRlNVU0I6IEZTIFNlcmlhbCBmb3IgUG9ydCAyIChtdWx0aXBsZSBQSFkgbW9kZXMgc3VwcG9ydGVkKSAqLworTVVYX0NGR18zNFhYKCJBRjdfMzQzMF9VU0IyRlNfUEhZX01NMl9SWERQIiwgMHg1ZjIsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUg3XzM0MzBfVVNCMkZTX1BIWV9NTTJfUlhETSIsIDB4NWY2LAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFCMTBfMzQzMF9VU0IyRlNfUEhZX01NMl9SWFJDViIsIDB4NWY4LAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFCOV8zNDMwX1VTQjJGU19QSFlfTU0yX1RYU0UwIiwgMHg1ZmEsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiVzNfMzQzMF9VU0IyRlNfUEhZX01NMl9UWERBVCIsIDB4MWQ0LAorCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIlQ0XzM0MzBfVVNCMkZTX1BIWV9NTTJfVFhFTl9OIiwgMHgxZGUsCisJCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCisKKy8qIFBIWSBGU1VTQjogRlMgU2VyaWFsIGZvciBQb3J0IDMgKG11bHRpcGxlIFBIWSBtb2RlcyBzdXBwb3J0ZWQpICovCitNVVhfQ0ZHXzM0WFgoIkFIM18zNDMwX1VTQjNGU19QSFlfTU0zX1JYRFAiLCAweDE2NiwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBRTNfMzQzMF9VU0IzRlNfUEhZX01NM19SWERNIiwgMHgxNmEsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUQxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfUlhSQ1YiLCAweDE4NiwKKwkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQorTVVYX0NGR18zNFhYKCJBRTFfMzQzMF9VU0IzRlNfUEhZX01NM19UWFNFMCIsIDB4MTg0LAorCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCitNVVhfQ0ZHXzM0WFgoIkFEMl8zNDMwX1VTQjNGU19QSFlfTU0zX1RYREFUIiwgMHgxODgsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKK01VWF9DRkdfMzRYWCgiQUMxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhFTl9OIiwgMHgxOGEsCisJCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCisKK307CisKKyNkZWZpbmUgT01BUDM0WFhfUElOU19TWglBUlJBWV9TSVpFKG9tYXAzNHh4X3BpbnMpCisKKyNlbHNlCisjZGVmaW5lIG9tYXAzNHh4X3BpbnMJCU5VTEwKKyNkZWZpbmUgT01BUDM0WFhfUElOU19TWgkwCisjZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDM0WFggKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYX0RFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX01VWF9XQVJOSU5HUykKLXZvaWQgX19pbml0X29yX21vZHVsZSBvbWFwMl9jZmdfZGVidWcoY29uc3Qgc3RydWN0IHBpbl9jb25maWcgKmNmZywgdTggcmVnKQorc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZSBvbWFwMl9jZmdfZGVidWcoY29uc3Qgc3RydWN0IHBpbl9jb25maWcgKmNmZywgdTE2IHJlZykKIHsKIAl1MTYgb3JpZzsKIAl1OCB3YXJuID0gMCwgZGVidWcgPSAwOwogCi0Jb3JpZyA9IG9tYXBfY3RybF9yZWFkYihjZmctPm11eF9yZWcpOworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJb3JpZyA9IG9tYXBfY3RybF9yZWFkYihjZmctPm11eF9yZWcpOworCWVsc2UKKwkJb3JpZyA9IG9tYXBfY3RybF9yZWFkdyhjZmctPm11eF9yZWcpOwogCiAjaWZkZWYJQ09ORklHX09NQVBfTVVYX0RFQlVHCiAJZGVidWcgPSBjZmctPmRlYnVnOwpAQCAtMjU0LDkgKzQ2MSw5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAlyZWcgfD0gY2ZnLT5tYXNrICYgMHg3OwogCWlmIChjZmctPnB1bGxfdmFsKQotCQlyZWcgfD0gT01BUDI0WFhfUFVMTF9FTkE7CisJCXJlZyB8PSBPTUFQMl9QVUxMX0VOQTsKIAlpZiAoY2ZnLT5wdV9wZF92YWwpCi0JCXJlZyB8PSBPTUFQMjRYWF9QVUxMX1VQOworCQlyZWcgfD0gT01BUDJfUFVMTF9VUDsKIAlvbWFwMl9jZmdfZGVidWcoY2ZnLCByZWcpOwogCW9tYXBfY3RybF93cml0ZWIocmVnLCBjZmctPm11eF9yZWcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKQEAgLTI2NCw3ICs0NzEsMjYgQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi0jZGVmaW5lIG9tYXAyNHh4X2NmZ19yZWcJMAorI2RlZmluZSBvbWFwMjR4eF9jZmdfcmVnCU5VTEwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDM0WFgKK3N0YXRpYyBpbnQgX19pbml0X29yX21vZHVsZSBvbWFwMzR4eF9jZmdfcmVnKGNvbnN0IHN0cnVjdCBwaW5fY29uZmlnICpjZmcpCit7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhtdXhfc3Bpbl9sb2NrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiByZWcgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKKwlyZWcgfD0gY2ZnLT5tdXhfdmFsOworCW9tYXAyX2NmZ19kZWJ1ZyhjZmcsIHJlZyk7CisJb21hcF9jdHJsX3dyaXRldyhyZWcsIGNmZy0+bXV4X3JlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwMzR4eF9jZmdfcmVnCU5VTEwKICNlbmRpZgogCiBpbnQgX19pbml0IG9tYXAyX211eF9pbml0KHZvaWQpCkBAIC0yNzMsNiArNDk5LDEwIEBACiAJCWFyY2hfbXV4X2NmZy5waW5zCT0gb21hcDI0eHhfcGluczsKIAkJYXJjaF9tdXhfY2ZnLnNpemUJPSBPTUFQMjRYWF9QSU5TX1NaOwogCQlhcmNoX211eF9jZmcuY2ZnX3JlZwk9IG9tYXAyNHh4X2NmZ19yZWc7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQlhcmNoX211eF9jZmcucGlucwk9IG9tYXAzNHh4X3BpbnM7CisJCWFyY2hfbXV4X2NmZy5zaXplCT0gT01BUDM0WFhfUElOU19TWjsKKwkJYXJjaF9tdXhfY2ZnLmNmZ19yZWcJPSBvbWFwMzR4eF9jZmdfcmVnOwogCX0KIAogCXJldHVybiBvbWFwX211eF9yZWdpc3RlcigmYXJjaF9tdXhfY2ZnKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYwppbmRleCA4NjcxZTEwLi41NTM2MWMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS5jCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlMjk3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYwpAQCAtMCwwICsxLDExMTMgQEAKKy8qCisgKiBPTUFQIHBvd2VyZG9tYWluIGNvbnRyb2wKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZkZWYgQ09ORklHX09NQVBfREVCVUdfUE9XRVJET01BSU4KKyMgZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlICJjbS5oIgorI2luY2x1ZGUgImNtLXJlZ2JpdHMtMzR4eC5oIgorI2luY2x1ZGUgInBybS5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTM0eHguaCIKKworI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisjaW5jbHVkZSA8bWFjaC9wb3dlcmRvbWFpbi5oPgorI2luY2x1ZGUgPG1hY2gvY2xvY2tkb21haW4uaD4KKworLyogcHdyZG1fbGlzdCBjb250YWlucyBhbGwgcmVnaXN0ZXJlZCBzdHJ1Y3QgcG93ZXJkb21haW5zICovCitzdGF0aWMgTElTVF9IRUFEKHB3cmRtX2xpc3QpOworCisvKgorICogcHdyZG1fcndsb2NrIHByb3RlY3RzIHB3cmRtX2xpc3QgYWRkIGFuZCBkZWwgb3BzIC0gYWxzbyByZXVzZWQgdG8KKyAqIHByb3RlY3QgcHdyZG1fY2xrZG1zW10gZHVyaW5nIGNsa2RtIGFkZC9kZWwgb3BzCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKHB3cmRtX3J3bG9jayk7CisKKworLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHUzMiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChzMTYgZG9tYWluLCBzMTYgaWR4LCB1MzIgbWFzaykKK3sKKwl1MzIgdjsKKworCXYgPSBwcm1fcmVhZF9tb2RfcmVnKGRvbWFpbiwgaWR4KTsKKwl2ICY9IG1hc2s7CisJdiA+Pj0gX19mZnMobWFzayk7CisKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqX3B3cmRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sICp0ZW1wX3B3cmRtOworCisJcHdyZG0gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wX3B3cmRtLCAmcHdyZG1fbGlzdCwgbm9kZSkgeworCQlpZiAoIXN0cmNtcChuYW1lLCB0ZW1wX3B3cmRtLT5uYW1lKSkgeworCQkJcHdyZG0gPSB0ZW1wX3B3cmRtOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcHdyZG07Cit9CisKKy8qIF9wd3JkbV9kZXBzX2xvb2t1cCAtIGxvb2sgdXAgdGhlIHNwZWNpZmllZCBwb3dlcmRvbWFpbiBpbiBhIHB3cmRtIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKl9wd3JkbV9kZXBzX2xvb2t1cChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLAorCQkJCQkgICAgICBzdHJ1Y3QgcHdyZG1fZGVwICpkZXBzKQoreworCXN0cnVjdCBwd3JkbV9kZXAgKnBkOworCisJaWYgKCFwd3JkbSB8fCAhZGVwcyB8fCAhb21hcF9jaGlwX2lzKHB3cmRtLT5vbWFwX2NoaXApKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWZvciAocGQgPSBkZXBzOyBwZDsgcGQrKykgeworCisJCWlmICghb21hcF9jaGlwX2lzKHBkLT5vbWFwX2NoaXApKQorCQkJY29udGludWU7CisKKwkJaWYgKCFwZC0+cHdyZG0gJiYgcGQtPnB3cmRtX25hbWUpCisJCQlwZC0+cHdyZG0gPSBwd3JkbV9sb29rdXAocGQtPnB3cmRtX25hbWUpOworCisJCWlmIChwZC0+cHdyZG0gPT0gcHdyZG0pCisJCQlicmVhazsKKworCX0KKworCWlmICghcGQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJcmV0dXJuIHBkLT5wd3JkbTsKK30KKworCisvKiBQdWJsaWMgZnVuY3Rpb25zICovCisKKy8qKgorICogcHdyZG1faW5pdCAtIHNldCB1cCB0aGUgcG93ZXJkb21haW4gbGF5ZXIKKyAqCisgKiBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2YgcG93ZXJkb21haW5zLCByZWdpc3RlcmluZyBhbGwgdGhhdCBhcmUKKyAqIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBDUFUuIElmIHB3cmRtX2xpc3QgaXMgc3VwcGxpZWQgYW5kIG5vdAorICogbnVsbCwgYWxsIG9mIHRoZSByZWZlcmVuY2VkIHBvd2VyZG9tYWlucyB3aWxsIGJlIHJlZ2lzdGVyZWQuICBObworICogcmV0dXJuIHZhbHVlLgorICovCit2b2lkIHB3cmRtX2luaXQoc3RydWN0IHBvd2VyZG9tYWluICoqcHdyZG1fbGlzdCkKK3sKKwlzdHJ1Y3QgcG93ZXJkb21haW4gKipwID0gTlVMTDsKKworCWlmIChwd3JkbV9saXN0KQorCQlmb3IgKHAgPSBwd3JkbV9saXN0OyAqcDsgcCsrKQorCQkJcHdyZG1fcmVnaXN0ZXIoKnApOworfQorCisvKioKKyAqIHB3cmRtX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBwb3dlcmRvbWFpbgorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byByZWdpc3RlcgorICoKKyAqIEFkZHMgYSBwb3dlcmRvbWFpbiB0byB0aGUgaW50ZXJuYWwgcG93ZXJkb21haW4gbGlzdC4gIFJldHVybnMKKyAqIC1FSU5WQUwgaWYgZ2l2ZW4gYSBudWxsIHBvaW50ZXIsIC1FRVhJU1QgaWYgYSBwb3dlcmRvbWFpbiBpcworICogYWxyZWFkeSByZWdpc3RlcmVkIGJ5IHRoZSBwcm92aWRlZCBuYW1lLCBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX3JlZ2lzdGVyKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFvbWFwX2NoaXBfaXMocHdyZG0tPm9tYXBfY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZwd3JkbV9yd2xvY2ssIGZsYWdzKTsKKwlpZiAoX3B3cmRtX2xvb2t1cChwd3JkbS0+bmFtZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBwcl91bmxvY2s7CisJfQorCisJbGlzdF9hZGQoJnB3cmRtLT5ub2RlLCAmcHdyZG1fbGlzdCk7CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IHJlZ2lzdGVyZWQgJXNcbiIsIHB3cmRtLT5uYW1lKTsKKwlyZXQgPSAwOworCitwcl91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBwd3JkbV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhIHBvd2VyZG9tYWluCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIHVucmVnaXN0ZXIKKyAqCisgKiBSZW1vdmVzIGEgcG93ZXJkb21haW4gZnJvbSB0aGUgaW50ZXJuYWwgcG93ZXJkb21haW4gbGlzdC4gIFJldHVybnMKKyAqIC1FSU5WQUwgaWYgcHdyZG0gYXJndW1lbnQgaXMgTlVMTC4KKyAqLworaW50IHB3cmRtX3VucmVnaXN0ZXIoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZwd3JkbS0+bm9kZSk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoInBvd2VyZG9tYWluOiB1bnJlZ2lzdGVyZWQgJXNcbiIsIHB3cmRtLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX2xvb2t1cCAtIGxvb2sgdXAgYSBwb3dlcmRvbWFpbiBieSBuYW1lLCByZXR1cm4gYSBwb2ludGVyCisgKiBAbmFtZTogbmFtZSBvZiBwb3dlcmRvbWFpbgorICoKKyAqIEZpbmQgYSByZWdpc3RlcmVkIHBvd2VyZG9tYWluIGJ5IGl0cyBuYW1lLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisgKiBzdHJ1Y3QgcG93ZXJkb21haW4gaWYgZm91bmQsIG9yIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmcHdyZG1fcndsb2NrLCBmbGFncyk7CisJcHdyZG0gPSBfcHdyZG1fbG9va3VwKG5hbWUpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHB3cmRtOworfQorCisvKioKKyAqIHB3cmRtX2Zvcl9lYWNoIC0gY2FsbCBmdW5jdGlvbiBvbiBlYWNoIHJlZ2lzdGVyZWQgY2xvY2tkb21haW4KKyAqIEBmbjogY2FsbGJhY2sgZnVuY3Rpb24gKgorICoKKyAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGZvciBlYWNoIHJlZ2lzdGVyZWQgcG93ZXJkb21haW4uICBUaGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiByZXR1cm4gYW55dGhpbmcgYnV0IDAgdG8gYmFpbCBvdXQgZWFybHkgZnJvbQorICogdGhlIGl0ZXJhdG9yLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBwd3JkbV9yd2xvY2sKKyAqIGhlbGQgZm9yIHJlYWRpbmcsIHNvIG5vIHBvd2VyZG9tYWluIHN0cnVjdHVyZSBtYW5pcHVsYXRpb24KKyAqIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrLCBhbHRob3VnaCBoYXJkd2FyZQorICogcG93ZXJkb21haW4gY29udHJvbCBmdW5jdGlvbnMgYXJlIGZpbmUuICBSZXR1cm5zIHRoZSBsYXN0IHJldHVybgorICogdmFsdWUgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgMCBmb3Igc3VjY2VzcyBvcgorICogYW55dGhpbmcgZWxzZSB0byBpbmRpY2F0ZSBmYWlsdXJlOyBvciAtRUlOVkFMIGlmIHRoZSBmdW5jdGlvbgorICogcG9pbnRlciBpcyBudWxsLgorICovCitpbnQgcHdyZG1fZm9yX2VhY2goaW50ICgqZm4pKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqdGVtcF9wd3JkbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKCFmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmcHdyZG1fcndsb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wX3B3cmRtLCAmcHdyZG1fbGlzdCwgbm9kZSkgeworCQlyZXQgPSAoKmZuKSh0ZW1wX3B3cmRtKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZwd3JkbV9yd2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcHdyZG1fYWRkX2Nsa2RtIC0gYWRkIGEgY2xvY2tkb21haW4gdG8gYSBwb3dlcmRvbWFpbgorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byBhZGQgdGhlIGNsb2NrZG9tYWluIHRvCisgKiBAY2xrZG06IHN0cnVjdCBjbG9ja2RvbWFpbiAqIHRvIGFzc29jaWF0ZSB3aXRoIGEgcG93ZXJkb21haW4KKyAqCisgKiBBc3NvY2lhdGUgdGhlIGNsb2NrZG9tYWluICdjbGtkbScgd2l0aCBhIHBvd2VyZG9tYWluICdwd3JkbScuICBUaGlzCisgKiBlbmFibGVzIHRoZSB1c2Ugb2YgcHdyZG1fZm9yX2VhY2hfY2xrZG0oKS4gIFJldHVybnMgLUVJTlZBTCBpZgorICogcHJlc2VudGVkIHdpdGggaW52YWxpZCBwb2ludGVyczsgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZDsKKyAqIG9yIDAgdXBvbiBzdWNjZXNzLgorICovCitpbnQgcHdyZG1fYWRkX2Nsa2RtKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghcHdyZG0gfHwgIWNsa2RtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogYXNzb2NpYXRpbmcgY2xvY2tkb21haW4gJXMgd2l0aCBwb3dlcmRvbWFpbiAiCisJCSAiJXNcbiIsIGNsa2RtLT5uYW1lLCBwd3JkbS0+bmFtZSk7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFBXUkRNX01BWF9DTEtETVM7IGkrKykgeworCQlpZiAoIXB3cmRtLT5wd3JkbV9jbGtkbXNbaV0pCisJCQlicmVhazsKKyNpZmRlZiBERUJVRworCQlpZiAocHdyZG0tPnB3cmRtX2Nsa2Rtc1tpXSA9PSBjbGtkbSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gcGFjX2V4aXQ7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChpID09IFBXUkRNX01BWF9DTEtETVMpIHsKKwkJcHJfZGVidWcoInBvd2VyZG9tYWluOiBpbmNyZWFzZSBQV1JETV9NQVhfQ0xLRE1TIGZvciAiCisJCQkgInB3cmRtICVzIGNsa2RtICVzXG4iLCBwd3JkbS0+bmFtZSwgY2xrZG0tPm5hbWUpOworCQlXQVJOX09OKDEpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHBhY19leGl0OworCX0KKworCXB3cmRtLT5wd3JkbV9jbGtkbXNbaV0gPSBjbGtkbTsKKworCXJldCA9IDA7CisKK3BhY19leGl0OgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZwd3JkbV9yd2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcHdyZG1fZGVsX2Nsa2RtIC0gcmVtb3ZlIGEgY2xvY2tkb21haW4gZnJvbSBhIHBvd2VyZG9tYWluCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGFkZCB0aGUgY2xvY2tkb21haW4gdG8KKyAqIEBjbGtkbTogc3RydWN0IGNsb2NrZG9tYWluICogdG8gYXNzb2NpYXRlIHdpdGggYSBwb3dlcmRvbWFpbgorICoKKyAqIERpc3NvY2lhdGUgdGhlIGNsb2NrZG9tYWluICdjbGtkbScgZnJvbSB0aGUgcG93ZXJkb21haW4KKyAqICdwd3JkbScuIFJldHVybnMgLUVJTlZBTCBpZiBwcmVzZW50ZWQgd2l0aCBpbnZhbGlkIHBvaW50ZXJzOworICogLUVOT0VOVCBpZiB0aGUgY2xrZG0gd2FzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBvd2VyZG9tYWluLCBvciAwCisgKiB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9kZWxfY2xrZG0oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBpOworCisJaWYgKCFwd3JkbSB8fCAhY2xrZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInBvd2VyZG9tYWluOiBkaXNzb2NpYXRpbmcgY2xvY2tkb21haW4gJXMgZnJvbSBwb3dlcmRvbWFpbiAiCisJCSAiJXNcbiIsIGNsa2RtLT5uYW1lLCBwd3JkbS0+bmFtZSk7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFBXUkRNX01BWF9DTEtETVM7IGkrKykKKwkJaWYgKHB3cmRtLT5wd3JkbV9jbGtkbXNbaV0gPT0gY2xrZG0pCisJCQlicmVhazsKKworCWlmIChpID09IFBXUkRNX01BWF9DTEtETVMpIHsKKwkJcHJfZGVidWcoInBvd2VyZG9tYWluOiBjbGtkbSAlcyBub3QgYXNzb2NpYXRlZCB3aXRoIHB3cmRtICIKKwkJCSAiJXMgPyFcbiIsIGNsa2RtLT5uYW1lLCBwd3JkbS0+bmFtZSk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gcGRjX2V4aXQ7CisJfQorCisJcHdyZG0tPnB3cmRtX2Nsa2Rtc1tpXSA9IE5VTEw7CisKKwlyZXQgPSAwOworCitwZGNfZXhpdDoKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmcHdyZG1fcndsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHB3cmRtX2Zvcl9lYWNoX2Nsa2RtIC0gY2FsbCBmdW5jdGlvbiBvbiBlYWNoIGNsa2RtIGluIGEgcHdyZG0KKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICogdG8gaXRlcmF0ZSBvdmVyCisgKiBAZm46IGNhbGxiYWNrIGZ1bmN0aW9uICoKKyAqCisgKiBDYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBmb3IgZWFjaCBjbG9ja2RvbWFpbiBpbiB0aGUgcG93ZXJkb21haW4KKyAqICdwd3JkbScuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIHJldHVybiBhbnl0aGluZyBidXQgMCB0byBiYWlsCisgKiBvdXQgZWFybHkgZnJvbSB0aGUgaXRlcmF0b3IuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGgKKyAqIHRoZSBwd3JkbV9yd2xvY2sgaGVsZCBmb3IgcmVhZGluZywgc28gbm8gcG93ZXJkb21haW4gc3RydWN0dXJlCisgKiBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2ssIGFsdGhvdWdoCisgKiBoYXJkd2FyZSBwb3dlcmRvbWFpbiBjb250cm9sIGZ1bmN0aW9ucyBhcmUgZmluZS4gIFJldHVybnMgLUVJTlZBTAorICogaWYgcHJlc2VudGVkIHdpdGggaW52YWxpZCBwb2ludGVyczsgb3IgcGFzc2VzIGFsb25nIHRoZSBsYXN0IHJldHVybgorICogdmFsdWUgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgMCBmb3Igc3VjY2VzcyBvcgorICogYW55dGhpbmcgZWxzZSB0byBpbmRpY2F0ZSBmYWlsdXJlLgorICovCitpbnQgcHdyZG1fZm9yX2VhY2hfY2xrZG0oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwKKwkJCSBpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwKKwkJCQkgICBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKCFmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmcHdyZG1fcndsb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUFdSRE1fTUFYX0NMS0RNUyAmJiAhcmV0OyBpKyspCisJCXJldCA9ICgqZm4pKHB3cmRtLCBwd3JkbS0+cHdyZG1fY2xrZG1zW2ldKTsKKworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnB3cmRtX3J3bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHB3cmRtX2FkZF93a2RlcCAtIGFkZCBhIHdha2V1cCBkZXBlbmRlbmN5IGZyb20gcHdyZG0yIHRvIHB3cmRtMQorICogQHB3cmRtMTogd2FrZSB0aGlzIHN0cnVjdCBwb3dlcmRvbWFpbiAqIHVwIChkZXBlbmRlbnQpCisgKiBAcHdyZG0yOiB3aGVuIHRoaXMgc3RydWN0IHBvd2VyZG9tYWluICogd2FrZXMgdXAgKHNvdXJjZSkKKyAqCisgKiBXaGVuIHRoZSBwb3dlcmRvbWFpbiByZXByZXNlbnRlZCBieSBwd3JkbTIgd2FrZXMgdXAgKGR1ZSB0byBhbgorICogaW50ZXJydXB0KSwgd2FrZSB1cCBwd3JkbTEuCUltcGxlbWVudGVkIGluIGhhcmR3YXJlIG9uIHRoZSBPTUFQLAorICogdGhpcyBmZWF0dXJlIGlzIGRlc2lnbmVkIHRvIHJlZHVjZSB3YWtldXAgbGF0ZW5jeSBvZiB0aGUgZGVwZW5kZW50CisgKiBwb3dlcmRvbWFpbi4gIFJldHVybnMgLUVJTlZBTCBpZiBwcmVzZW50ZWQgd2l0aCBpbnZhbGlkIHBvd2VyZG9tYWluCisgKiBwb2ludGVycywgLUVOT0VOVCBpZiBwd3JkbTIgY2Fubm90IHdha2UgdXAgcHdyZG0xIGluIGhhcmR3YXJlLCBvcgorICogMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9hZGRfd2tkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcDsKKworCWlmICghcHdyZG0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXAgPSBfcHdyZG1fZGVwc19sb29rdXAocHdyZG0yLCBwd3JkbTEtPndrZGVwX3NyY3MpOworCWlmIChJU19FUlIocCkpIHsKKwkJcHJfZGVidWcoInBvd2VyZG9tYWluOiBoYXJkd2FyZSBjYW5ub3Qgc2V0L2NsZWFyIHdha2UgdXAgb2YgIgorCQkJICIlcyB3aGVuICVzIHdha2VzIHVwXG4iLCBwd3JkbTEtPm5hbWUsIHB3cmRtMi0+bmFtZSk7CisJCXJldHVybiBJU19FUlIocCk7CisJfQorCisJcHJfZGVidWcoInBvd2VyZG9tYWluOiBoYXJkd2FyZSB3aWxsIHdha2UgdXAgJXMgd2hlbiAlcyB3YWtlcyB1cFxuIiwKKwkJIHB3cmRtMS0+bmFtZSwgcHdyZG0yLT5uYW1lKTsKKworCXBybV9zZXRfbW9kX3JlZ19iaXRzKCgxIDw8IHB3cmRtMi0+ZGVwX2JpdCksCisJCQkgICAgIHB3cmRtMS0+cHJjbV9vZmZzLCBQTV9XS0RFUCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwd3JkbV9kZWxfd2tkZXAgLSByZW1vdmUgYSB3YWtldXAgZGVwZW5kZW5jeSBmcm9tIHB3cmRtMiB0byBwd3JkbTEKKyAqIEBwd3JkbTE6IHdha2UgdGhpcyBzdHJ1Y3QgcG93ZXJkb21haW4gKiB1cCAoZGVwZW5kZW50KQorICogQHB3cmRtMjogd2hlbiB0aGlzIHN0cnVjdCBwb3dlcmRvbWFpbiAqIHdha2VzIHVwIChzb3VyY2UpCisgKgorICogUmVtb3ZlIGEgd2FrZXVwIGRlcGVuZGVuY3kgdGhhdCBjYXVzZXMgcHdyZG0xIHRvIHdha2UgdXAgd2hlbiBwd3JkbTIKKyAqIHdha2VzIHVwLiAgUmV0dXJucyAtRUlOVkFMIGlmIHByZXNlbnRlZCB3aXRoIGludmFsaWQgcG93ZXJkb21haW4KKyAqIHBvaW50ZXJzLCAtRU5PRU5UIGlmIHB3cmRtMiBjYW5ub3Qgd2FrZSB1cCBwd3JkbTEgaW4gaGFyZHdhcmUsIG9yCisgKiAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX2RlbF93a2RlcChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMSwgc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTIpCit7CisJc3RydWN0IHBvd2VyZG9tYWluICpwOworCisJaWYgKCFwd3JkbTEpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IF9wd3JkbV9kZXBzX2xvb2t1cChwd3JkbTIsIHB3cmRtMS0+d2tkZXBfc3Jjcyk7CisJaWYgKElTX0VSUihwKSkgeworCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgd2FrZSB1cCBvZiAiCisJCQkgIiVzIHdoZW4gJXMgd2FrZXMgdXBcbiIsIHB3cmRtMS0+bmFtZSwgcHdyZG0yLT5uYW1lKTsKKwkJcmV0dXJuIElTX0VSUihwKTsKKwl9CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIHdpbGwgbm8gbG9uZ2VyIHdha2UgdXAgJXMgYWZ0ZXIgJXMgIgorCQkgIndha2VzIHVwXG4iLCBwd3JkbTEtPm5hbWUsIHB3cmRtMi0+bmFtZSk7CisKKwlwcm1fY2xlYXJfbW9kX3JlZ19iaXRzKCgxIDw8IHB3cmRtMi0+ZGVwX2JpdCksCisJCQkgICAgICAgcHdyZG0xLT5wcmNtX29mZnMsIFBNX1dLREVQKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX3JlYWRfd2tkZXAgLSByZWFkIHdha2V1cCBkZXBlbmRlbmN5IHN0YXRlIGZyb20gcHdyZG0yIHRvIHB3cmRtMQorICogQHB3cmRtMTogd2FrZSB0aGlzIHN0cnVjdCBwb3dlcmRvbWFpbiAqIHVwIChkZXBlbmRlbnQpCisgKiBAcHdyZG0yOiB3aGVuIHRoaXMgc3RydWN0IHBvd2VyZG9tYWluICogd2FrZXMgdXAgKHNvdXJjZSkKKyAqCisgKiBSZXR1cm4gMSBpZiBhIGhhcmR3YXJlIHdha2V1cCBkZXBlbmRlbmN5IGV4aXN0cyB3aGVyZWluIHB3cmRtMSB3aWxsIGJlCisgKiBhd29rZW4gd2hlbiBwd3JkbTIgd2FrZXMgdXA7IDAgaWYgZGVwZW5kZW5jeSBpcyBub3Qgc2V0OyAtRUlOVkFMCisgKiBpZiBlaXRoZXIgcG93ZXJkb21haW4gcG9pbnRlciBpcyBpbnZhbGlkOyBvciAtRU5PRU5UIGlmIHRoZSBoYXJkd2FyZQorICogaXMgaW5jYXBhYmxlLgorICoKKyAqIFJFVklTSVQ6IEN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uIG9ubHkgcmVwcmVzZW50cyBzb2Z0d2FyZS1jb250cm9sbGFibGUKKyAqIHdha2V1cCBkZXBlbmRlbmNpZXMuICBXYWtldXAgZGVwZW5kZW5jaWVzIGZpeGVkIGluIGhhcmR3YXJlIGFyZSBub3QKKyAqIHlldCBoYW5kbGVkIGhlcmUuCisgKi8KK2ludCBwd3JkbV9yZWFkX3drZGVwKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0xLCBzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMikKK3sKKwlzdHJ1Y3QgcG93ZXJkb21haW4gKnA7CisKKwlpZiAoIXB3cmRtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gX3B3cmRtX2RlcHNfbG9va3VwKHB3cmRtMiwgcHdyZG0xLT53a2RlcF9zcmNzKTsKKwlpZiAoSVNfRVJSKHApKSB7CisJCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogaGFyZHdhcmUgY2Fubm90IHNldC9jbGVhciB3YWtlIHVwIG9mICIKKwkJCSAiJXMgd2hlbiAlcyB3YWtlcyB1cFxuIiwgcHdyZG0xLT5uYW1lLCBwd3JkbTItPm5hbWUpOworCQlyZXR1cm4gSVNfRVJSKHApOworCX0KKworCXJldHVybiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChwd3JkbTEtPnByY21fb2ZmcywgUE1fV0tERVAsCisJCQkJCSgxIDw8IHB3cmRtMi0+ZGVwX2JpdCkpOworfQorCisvKioKKyAqIHB3cmRtX2FkZF9zbGVlcGRlcCAtIGFkZCBhIHNsZWVwIGRlcGVuZGVuY3kgZnJvbSBwd3JkbTIgdG8gcHdyZG0xCisgKiBAcHdyZG0xOiBwcmV2ZW50IHRoaXMgc3RydWN0IHBvd2VyZG9tYWluICogZnJvbSBzbGVlcGluZyAoZGVwZW5kZW50KQorICogQHB3cmRtMjogd2hlbiB0aGlzIHN0cnVjdCBwb3dlcmRvbWFpbiAqIGlzIGFjdGl2ZSAoc291cmNlKQorICoKKyAqIFByZXZlbnQgcHdyZG0xIGZyb20gYXV0b21hdGljYWxseSBnb2luZyBpbmFjdGl2ZSAoYW5kIHRoZW4gdG8KKyAqIHJldGVudGlvbiBvciBvZmYpIGlmIHB3cmRtMiBpcyBzdGlsbCBhY3RpdmUuCSBSZXR1cm5zIC1FSU5WQUwgaWYKKyAqIHByZXNlbnRlZCB3aXRoIGludmFsaWQgcG93ZXJkb21haW4gcG9pbnRlcnMgb3IgY2FsbGVkIG9uIGEgbWFjaGluZQorICogdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHNvZnR3YXJlLWNvbmZpZ3VyYWJsZSBoYXJkd2FyZSBzbGVlcCBkZXBlbmRlbmNpZXMsCisgKiAtRU5PRU5UIGlmIHRoZSBzcGVjaWZpZWQgZGVwZW5kZW5jeSBjYW5ub3QgYmUgc2V0IGluIGhhcmR3YXJlLCBvcgorICogMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9hZGRfc2xlZXBkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcDsKKworCWlmICghcHdyZG0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IF9wd3JkbV9kZXBzX2xvb2t1cChwd3JkbTIsIHB3cmRtMS0+c2xlZXBkZXBfc3Jjcyk7CisJaWYgKElTX0VSUihwKSkgeworCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgc2xlZXAgIgorCQkJICJkZXBlbmRlbmN5IGFmZmVjdGluZyAlcyBmcm9tICVzXG4iLCBwd3JkbTEtPm5hbWUsCisJCQkgcHdyZG0yLT5uYW1lKTsKKwkJcmV0dXJuIElTX0VSUihwKTsKKwl9CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IHdpbGwgcHJldmVudCAlcyBmcm9tIHNsZWVwaW5nIGlmICVzIGlzIGFjdGl2ZVxuIiwKKwkJIHB3cmRtMS0+bmFtZSwgcHdyZG0yLT5uYW1lKTsKKworCWNtX3NldF9tb2RfcmVnX2JpdHMoKDEgPDwgcHdyZG0yLT5kZXBfYml0KSwKKwkJCSAgICBwd3JkbTEtPnByY21fb2ZmcywgT01BUDM0MzBfQ01fU0xFRVBERVApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHdyZG1fZGVsX3NsZWVwZGVwIC0gcmVtb3ZlIGEgc2xlZXAgZGVwZW5kZW5jeSBmcm9tIHB3cmRtMiB0byBwd3JkbTEKKyAqIEBwd3JkbTE6IHByZXZlbnQgdGhpcyBzdHJ1Y3QgcG93ZXJkb21haW4gKiBmcm9tIHNsZWVwaW5nIChkZXBlbmRlbnQpCisgKiBAcHdyZG0yOiB3aGVuIHRoaXMgc3RydWN0IHBvd2VyZG9tYWluICogaXMgYWN0aXZlIChzb3VyY2UpCisgKgorICogQWxsb3cgcHdyZG0xIHRvIGF1dG9tYXRpY2FsbHkgZ28gaW5hY3RpdmUgKGFuZCB0aGVuIHRvIHJldGVudGlvbiBvcgorICogb2ZmKSwgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdGl2aXR5IHN0YXRlIG9mIHB3cmRtMi4gIFJldHVybnMgLUVJTlZBTAorICogaWYgcHJlc2VudGVkIHdpdGggaW52YWxpZCBwb3dlcmRvbWFpbiBwb2ludGVycyBvciBjYWxsZWQgb24gYSBtYWNoaW5lCisgKiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgc29mdHdhcmUtY29uZmlndXJhYmxlIGhhcmR3YXJlIHNsZWVwIGRlcGVuZGVuY2llcywKKyAqIC1FTk9FTlQgaWYgdGhlIHNwZWNpZmllZCBkZXBlbmRlbmN5IGNhbm5vdCBiZSBjbGVhcmVkIGluIGhhcmR3YXJlLCBvcgorICogMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9kZWxfc2xlZXBkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcDsKKworCWlmICghcHdyZG0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IF9wd3JkbV9kZXBzX2xvb2t1cChwd3JkbTIsIHB3cmRtMS0+c2xlZXBkZXBfc3Jjcyk7CisJaWYgKElTX0VSUihwKSkgeworCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgc2xlZXAgIgorCQkJICJkZXBlbmRlbmN5IGFmZmVjdGluZyAlcyBmcm9tICVzXG4iLCBwd3JkbTEtPm5hbWUsCisJCQkgcHdyZG0yLT5uYW1lKTsKKwkJcmV0dXJuIElTX0VSUihwKTsKKwl9CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IHdpbGwgbm8gbG9uZ2VyIHByZXZlbnQgJXMgZnJvbSBzbGVlcGluZyBpZiAiCisJCSAiJXMgaXMgYWN0aXZlXG4iLCBwd3JkbTEtPm5hbWUsIHB3cmRtMi0+bmFtZSk7CisKKwljbV9jbGVhcl9tb2RfcmVnX2JpdHMoKDEgPDwgcHdyZG0yLT5kZXBfYml0KSwKKwkJCSAgICAgIHB3cmRtMS0+cHJjbV9vZmZzLCBPTUFQMzQzMF9DTV9TTEVFUERFUCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwd3JkbV9yZWFkX3NsZWVwZGVwIC0gcmVhZCBzbGVlcCBkZXBlbmRlbmN5IHN0YXRlIGZyb20gcHdyZG0yIHRvIHB3cmRtMQorICogQHB3cmRtMTogcHJldmVudCB0aGlzIHN0cnVjdCBwb3dlcmRvbWFpbiAqIGZyb20gc2xlZXBpbmcgKGRlcGVuZGVudCkKKyAqIEBwd3JkbTI6IHdoZW4gdGhpcyBzdHJ1Y3QgcG93ZXJkb21haW4gKiBpcyBhY3RpdmUgKHNvdXJjZSkKKyAqCisgKiBSZXR1cm4gMSBpZiBhIGhhcmR3YXJlIHNsZWVwIGRlcGVuZGVuY3kgZXhpc3RzIHdoZXJlaW4gcHdyZG0xIHdpbGwKKyAqIG5vdCBiZSBhbGxvd2VkIHRvIGF1dG9tYXRpY2FsbHkgZ28gaW5hY3RpdmUgaWYgcHdyZG0yIGlzIGFjdGl2ZTsKKyAqIDAgaWYgcHdyZG0xJ3MgYXV0b21hdGljIHBvd2VyIHN0YXRlIGluYWN0aXZpdHkgdHJhbnNpdGlvbiBpcyBpbmRlcGVuZGVudAorICogb2YgcHdyZG0yJ3M7IC1FSU5WQUwgaWYgZWl0aGVyIHBvd2VyZG9tYWluIHBvaW50ZXIgaXMgaW52YWxpZCBvciBjYWxsZWQKKyAqIG9uIGEgbWFjaGluZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgc29mdHdhcmUtY29uZmlndXJhYmxlIGhhcmR3YXJlIHNsZWVwCisgKiBkZXBlbmRlbmNpZXM7IG9yIC1FTk9FTlQgaWYgdGhlIGhhcmR3YXJlIGlzIGluY2FwYWJsZS4KKyAqCisgKiBSRVZJU0lUOiBDdXJyZW50bHkgdGhpcyBmdW5jdGlvbiBvbmx5IHJlcHJlc2VudHMgc29mdHdhcmUtY29udHJvbGxhYmxlCisgKiBzbGVlcCBkZXBlbmRlbmNpZXMuCVNsZWVwIGRlcGVuZGVuY2llcyBmaXhlZCBpbiBoYXJkd2FyZSBhcmUgbm90CisgKiB5ZXQgaGFuZGxlZCBoZXJlLgorICovCitpbnQgcHdyZG1fcmVhZF9zbGVlcGRlcChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMSwgc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTIpCit7CisJc3RydWN0IHBvd2VyZG9tYWluICpwOworCisJaWYgKCFwd3JkbTEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwID0gX3B3cmRtX2RlcHNfbG9va3VwKHB3cmRtMiwgcHdyZG0xLT5zbGVlcGRlcF9zcmNzKTsKKwlpZiAoSVNfRVJSKHApKSB7CisJCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogaGFyZHdhcmUgY2Fubm90IHNldC9jbGVhciBzbGVlcCAiCisJCQkgImRlcGVuZGVuY3kgYWZmZWN0aW5nICVzIGZyb20gJXNcbiIsIHB3cmRtMS0+bmFtZSwKKwkJCSBwd3JkbTItPm5hbWUpOworCQlyZXR1cm4gSVNfRVJSKHApOworCX0KKworCXJldHVybiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChwd3JkbTEtPnByY21fb2ZmcywgT01BUDM0MzBfQ01fU0xFRVBERVAsCisJCQkJCSgxIDw8IHB3cmRtMi0+ZGVwX2JpdCkpOworfQorCisvKioKKyAqIHB3cmRtX2dldF9tZW1fYmFua19jb3VudCAtIGdldCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzIGluIHRoaXMgcG93ZXJkb21haW4KKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICoKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb250cm9sbGFibGUgbWVtb3J5IGJhbmtzIGluIHBvd2VyZG9tYWluIHB3cmRtLAorICogc3RhcnRpbmcgd2l0aCAxLiAgUmV0dXJucyAtRUlOVkFMIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwuCisgKi8KK2ludCBwd3JkbV9nZXRfbWVtX2JhbmtfY291bnQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwlpZiAoIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBwd3JkbS0+YmFua3M7Cit9CisKKy8qKgorICogcHdyZG1fc2V0X25leHRfcHdyc3QgLSBzZXQgbmV4dCBwb3dlcmRvbWFpbiBwb3dlciBzdGF0ZQorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byBzZXQKKyAqIEBwd3JzdDogb25lIG9mIHRoZSBQV1JETV9QT1dFUl8qIG1hY3JvcworICoKKyAqIFNldCB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBuZXh0IHBvd2VyIHN0YXRlIHRvIHB3cnN0LiAgVGhlIHBvd2VyZG9tYWluCisgKiBtYXkgbm90IGVudGVyIHRoaXMgc3RhdGUgaW1tZWRpYXRlbHkgaWYgdGhlIHByZWNvbmRpdGlvbnMgZm9yIHRoaXMgc3RhdGUKKyAqIGhhdmUgbm90IGJlZW4gc2F0aXNmaWVkLiAgUmV0dXJucyAtRUlOVkFMIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzCisgKiBudWxsIG9yIGlmIHRoZSBwb3dlciBzdGF0ZSBpcyBpbnZhbGlkIGZvciB0aGUgcG93ZXJkb21pbiwgb3IgcmV0dXJucyAwCisgKiB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9zZXRfbmV4dF9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB1OCBwd3JzdCkKK3sKKwlpZiAoIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHB3cmRtLT5wd3JzdHMgJiAoMSA8PCBwd3JzdCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogc2V0dGluZyBuZXh0IHBvd2Vyc3RhdGUgZm9yICVzIHRvICUweFxuIiwKKwkJIHB3cmRtLT5uYW1lLCBwd3JzdCk7CisKKwlwcm1fcm13X21vZF9yZWdfYml0cyhPTUFQX1BPV0VSU1RBVEVfTUFTSywKKwkJCSAgICAgKHB3cnN0IDw8IE9NQVBfUE9XRVJTVEFURV9TSElGVCksCisJCQkgICAgIHB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RDVFJMKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX3JlYWRfbmV4dF9wd3JzdCAtIGdldCBuZXh0IHBvd2VyZG9tYWluIHBvd2VyIHN0YXRlCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGdldCBwb3dlciBzdGF0ZQorICoKKyAqIFJldHVybiB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBuZXh0IHBvd2VyIHN0YXRlLiAgUmV0dXJucyAtRUlOVkFMCisgKiBpZiB0aGUgcG93ZXJkb21haW4gcG9pbnRlciBpcyBudWxsIG9yIHJldHVybnMgdGhlIG5leHQgcG93ZXIgc3RhdGUKKyAqIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX3JlYWRfbmV4dF9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBybV9yZWFkX21vZF9iaXRzX3NoaWZ0KHB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RDVFJMLAorCQkJCQlPTUFQX1BPV0VSU1RBVEVfTUFTSyk7Cit9CisKKy8qKgorICogcHdyZG1fcmVhZF9wd3JzdCAtIGdldCBjdXJyZW50IHBvd2VyZG9tYWluIHBvd2VyIHN0YXRlCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGdldCBwb3dlciBzdGF0ZQorICoKKyAqIFJldHVybiB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBjdXJyZW50IHBvd2VyIHN0YXRlLglSZXR1cm5zIC1FSU5WQUwKKyAqIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwgb3IgcmV0dXJucyB0aGUgY3VycmVudCBwb3dlciBzdGF0ZQorICogdXBvbiBzdWNjZXNzLgorICovCitpbnQgcHdyZG1fcmVhZF9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBybV9yZWFkX21vZF9iaXRzX3NoaWZ0KHB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RTVCwKKwkJCQkJT01BUF9QT1dFUlNUQVRFU1RfTUFTSyk7Cit9CisKKy8qKgorICogcHdyZG1fcmVhZF9wcmV2X3B3cnN0IC0gZ2V0IHByZXZpb3VzIHBvd2VyZG9tYWluIHBvd2VyIHN0YXRlCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGdldCBwcmV2aW91cyBwb3dlciBzdGF0ZQorICoKKyAqIFJldHVybiB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBwcmV2aW91cyBwb3dlciBzdGF0ZS4gIFJldHVybnMgLUVJTlZBTAorICogaWYgdGhlIHBvd2VyZG9tYWluIHBvaW50ZXIgaXMgbnVsbCBvciByZXR1cm5zIHRoZSBwcmV2aW91cyBwb3dlciBzdGF0ZQorICogdXBvbiBzdWNjZXNzLgorICovCitpbnQgcHdyZG1fcmVhZF9wcmV2X3B3cnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCit7CisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcHJtX3JlYWRfbW9kX2JpdHNfc2hpZnQocHdyZG0tPnByY21fb2ZmcywgT01BUDM0MzBfUE1fUFJFUFdTVFNULAorCQkJCQlPTUFQMzQzMF9MQVNUUE9XRVJTVEFURUVOVEVSRURfTUFTSyk7Cit9CisKKy8qKgorICogcHdyZG1fc2V0X2xvZ2ljX3JldHN0IC0gc2V0IHBvd2VyZG9tYWluIGxvZ2ljIHBvd2VyIHN0YXRlIHVwb24gcmV0ZW50aW9uCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIHNldAorICogQHB3cnN0OiBvbmUgb2YgdGhlIFBXUkRNX1BPV0VSXyogbWFjcm9zCisgKgorICogU2V0IHRoZSBuZXh0IHBvd2VyIHN0YXRlIHRoYXQgdGhlIGxvZ2ljIHBvcnRpb24gb2YgdGhlIHBvd2VyZG9tYWluCisgKiBwd3JkbSB3aWxsIGVudGVyIHdoZW4gdGhlIHBvd2VyZG9tYWluIGVudGVycyByZXRlbnRpb24uICBUaGlzIHdpbGwKKyAqIGJlIGVpdGhlciBSRVRFTlRJT04gb3IgT0ZGLCBpZiBzdXBwb3J0ZWQuICBSZXR1cm5zIC1FSU5WQUwgaWYgdGhlCisgKiBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwgb3IgdGhlIHRhcmdldCBwb3dlciBzdGF0ZSBpcyBub3Qgbm90CisgKiBzdXBwb3J0ZWQsIG9yIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9zZXRfbG9naWNfcmV0c3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdTggcHdyc3QpCit7CisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShwd3JkbS0+cHdyc3RzX2xvZ2ljX3JldCAmICgxIDw8IHB3cnN0KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInBvd2VyZG9tYWluOiBzZXR0aW5nIG5leHQgbG9naWMgcG93ZXJzdGF0ZSBmb3IgJXMgdG8gJTB4XG4iLAorCQkgcHdyZG0tPm5hbWUsIHB3cnN0KTsKKworCS8qCisJICogVGhlIHJlZ2lzdGVyIGJpdCBuYW1lcyBiZWxvdyBtYXkgbm90IGNvcnJlc3BvbmQgdG8gdGhlCisJICogYWN0dWFsIG5hbWVzIG9mIHRoZSBiaXRzIGluIGVhY2ggcG93ZXJkb21haW4ncyByZWdpc3RlciwKKwkgKiBidXQgdGhlIHR5cGUgb2YgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIHNhbWUgZm9yIGVhY2gKKwkgKiBwb3dlcmRvbWFpbi4KKwkgKi8KKwlwcm1fcm13X21vZF9yZWdfYml0cyhPTUFQMzQzMF9MT0dJQ0wxQ0FDSEVSRVRTVEFURSwKKwkJCSAgICAgKHB3cnN0IDw8IF9fZmZzKE9NQVAzNDMwX0xPR0lDTDFDQUNIRVJFVFNUQVRFKSksCisJCQkgICAgIHB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RDVFJMKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX3NldF9tZW1fb25zdCAtIHNldCBtZW1vcnkgcG93ZXIgc3RhdGUgd2hpbGUgcG93ZXJkb21haW4gT04KKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICogdG8gc2V0CisgKiBAYmFuazogbWVtb3J5IGJhbmsgbnVtYmVyIHRvIHNldCAoMC0zKQorICogQHB3cnN0OiBvbmUgb2YgdGhlIFBXUkRNX1BPV0VSXyogbWFjcm9zCisgKgorICogU2V0IHRoZSBuZXh0IHBvd2VyIHN0YXRlIHRoYXQgbWVtb3J5IGJhbmsgeCBvZiB0aGUgcG93ZXJkb21haW4KKyAqIHB3cmRtIHdpbGwgZW50ZXIgd2hlbiB0aGUgcG93ZXJkb21haW4gZW50ZXJzIHRoZSBPTiBzdGF0ZS4gIEJhbmsKKyAqIHdpbGwgYmUgYSBudW1iZXIgZnJvbSAwIHRvIDMsIGFuZCByZXByZXNlbnRzIGRpZmZlcmVudCB0eXBlcyBvZgorICogbWVtb3J5LCBkZXBlbmRpbmcgb24gdGhlIHBvd2VyZG9tYWluLiAgUmV0dXJucyAtRUlOVkFMIGlmIHRoZQorICogcG93ZXJkb21haW4gcG9pbnRlciBpcyBudWxsIG9yIHRoZSB0YXJnZXQgcG93ZXIgc3RhdGUgaXMgbm90IG5vdAorICogc3VwcG9ydGVkIGZvciB0aGlzIG1lbW9yeSBiYW5rLCAtRUVYSVNUIGlmIHRoZSB0YXJnZXQgbWVtb3J5IGJhbmsKKyAqIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBjb250cm9sbGFibGUsIG9yIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9zZXRfbWVtX29uc3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdTggYmFuaywgdTggcHdyc3QpCit7CisJdTMyIG07CisKKwlpZiAoIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwd3JkbS0+YmFua3MgPCAoYmFuayArIDEpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmICghKHB3cmRtLT5wd3JzdHNfbWVtX29uW2JhbmtdICYgKDEgPDwgcHdyc3QpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IHNldHRpbmcgbmV4dCBtZW1vcnkgcG93ZXJzdGF0ZSBmb3IgZG9tYWluICVzICIKKwkJICJiYW5rICUweCB3aGlsZSBwd3JkbS1PTiB0byAlMHhcbiIsIHB3cmRtLT5uYW1lLCBiYW5rLCBwd3JzdCk7CisKKwkvKgorCSAqIFRoZSByZWdpc3RlciBiaXQgbmFtZXMgYmVsb3cgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZQorCSAqIGFjdHVhbCBuYW1lcyBvZiB0aGUgYml0cyBpbiBlYWNoIHBvd2VyZG9tYWluJ3MgcmVnaXN0ZXIsCisJICogYnV0IHRoZSB0eXBlIG9mIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzYW1lIGZvciBlYWNoCisJICogcG93ZXJkb21haW4uCisJICovCisJc3dpdGNoIChiYW5rKSB7CisJY2FzZSAwOgorCQltID0gT01BUDM0MzBfU0hBUkVETDFDQUNIRUZMQVRPTlNUQVRFX01BU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbSA9IE9NQVAzNDMwX0wxRkxBVE1FTU9OU1RBVEVfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltID0gT01BUDM0MzBfU0hBUkVETDJDQUNIRUZMQVRPTlNUQVRFX01BU0s7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbSA9IE9NQVAzNDMwX0wyRkxBVE1FTU9OU1RBVEVfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlwcm1fcm13X21vZF9yZWdfYml0cyhtLCAocHdyc3QgPDwgX19mZnMobSkpLAorCQkJICAgICBwd3JkbS0+cHJjbV9vZmZzLCBQTV9QV1NUQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwd3JkbV9zZXRfbWVtX3JldHN0IC0gc2V0IG1lbW9yeSBwb3dlciBzdGF0ZSB3aGlsZSBwb3dlcmRvbWFpbiBpbiBSRVQKKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICogdG8gc2V0CisgKiBAYmFuazogbWVtb3J5IGJhbmsgbnVtYmVyIHRvIHNldCAoMC0zKQorICogQHB3cnN0OiBvbmUgb2YgdGhlIFBXUkRNX1BPV0VSXyogbWFjcm9zCisgKgorICogU2V0IHRoZSBuZXh0IHBvd2VyIHN0YXRlIHRoYXQgbWVtb3J5IGJhbmsgeCBvZiB0aGUgcG93ZXJkb21haW4KKyAqIHB3cmRtIHdpbGwgZW50ZXIgd2hlbiB0aGUgcG93ZXJkb21haW4gZW50ZXJzIHRoZSBSRVRFTlRJT04gc3RhdGUuCisgKiBCYW5rIHdpbGwgYmUgYSBudW1iZXIgZnJvbSAwIHRvIDMsIGFuZCByZXByZXNlbnRzIGRpZmZlcmVudCB0eXBlcworICogb2YgbWVtb3J5LCBkZXBlbmRpbmcgb24gdGhlIHBvd2VyZG9tYWluLiAgcHdyc3Qgd2lsbCBiZSBlaXRoZXIKKyAqIFJFVEVOVElPTiBvciBPRkYsIGlmIHN1cHBvcnRlZC4gUmV0dXJucyAtRUlOVkFMIGlmIHRoZSBwb3dlcmRvbWFpbgorICogcG9pbnRlciBpcyBudWxsIG9yIHRoZSB0YXJnZXQgcG93ZXIgc3RhdGUgaXMgbm90IG5vdCBzdXBwb3J0ZWQgZm9yCisgKiB0aGlzIG1lbW9yeSBiYW5rLCAtRUVYSVNUIGlmIHRoZSB0YXJnZXQgbWVtb3J5IGJhbmsgZG9lcyBub3QgZXhpc3QKKyAqIG9yIGlzIG5vdCBjb250cm9sbGFibGUsIG9yIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9zZXRfbWVtX3JldHN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHU4IGJhbmssIHU4IHB3cnN0KQoreworCXUzMiBtOworCisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocHdyZG0tPmJhbmtzIDwgKGJhbmsgKyAxKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoIShwd3JkbS0+cHdyc3RzX21lbV9yZXRbYmFua10gJiAoMSA8PCBwd3JzdCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogc2V0dGluZyBuZXh0IG1lbW9yeSBwb3dlcnN0YXRlIGZvciBkb21haW4gJXMgIgorCQkgImJhbmsgJTB4IHdoaWxlIHB3cmRtLVJFVCB0byAlMHhcbiIsIHB3cmRtLT5uYW1lLCBiYW5rLCBwd3JzdCk7CisKKwkvKgorCSAqIFRoZSByZWdpc3RlciBiaXQgbmFtZXMgYmVsb3cgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZQorCSAqIGFjdHVhbCBuYW1lcyBvZiB0aGUgYml0cyBpbiBlYWNoIHBvd2VyZG9tYWluJ3MgcmVnaXN0ZXIsCisJICogYnV0IHRoZSB0eXBlIG9mIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzYW1lIGZvciBlYWNoCisJICogcG93ZXJkb21haW4uCisJICovCisJc3dpdGNoIChiYW5rKSB7CisJY2FzZSAwOgorCQltID0gT01BUDM0MzBfU0hBUkVETDFDQUNIRUZMQVRSRVRTVEFURTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltID0gT01BUDM0MzBfTDFGTEFUTUVNUkVUU1RBVEU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbSA9IE9NQVAzNDMwX1NIQVJFREwyQ0FDSEVGTEFUUkVUU1RBVEU7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbSA9IE9NQVAzNDMwX0wyRkxBVE1FTVJFVFNUQVRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXJldHVybiAtRUVYSVNUOworCX0KKworCXBybV9ybXdfbW9kX3JlZ19iaXRzKG0sIChwd3JzdCA8PCBfX2ZmcyhtKSksIHB3cmRtLT5wcmNtX29mZnMsCisJCQkgICAgIFBNX1BXU1RDVFJMKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX3JlYWRfbG9naWNfcHdyc3QgLSBnZXQgY3VycmVudCBwb3dlcmRvbWFpbiBsb2dpYyByZXRlbnRpb24gcG93ZXIgc3RhdGUKKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICogdG8gZ2V0IGN1cnJlbnQgbG9naWMgcmV0ZW50aW9uIHBvd2VyIHN0YXRlCisgKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHBvd2VyIHN0YXRlIHRoYXQgdGhlIGxvZ2ljIHBvcnRpb24gb2YKKyAqIHBvd2VyZG9tYWluIHB3cmRtIHdpbGwgZW50ZXIKKyAqIFJldHVybnMgLUVJTlZBTCBpZiB0aGUgcG93ZXJkb21haW4gcG9pbnRlciBpcyBudWxsIG9yIHJldHVybnMgdGhlCisgKiBjdXJyZW50IGxvZ2ljIHJldGVudGlvbiBwb3dlciBzdGF0ZSB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9yZWFkX2xvZ2ljX3B3cnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCit7CisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcHJtX3JlYWRfbW9kX2JpdHNfc2hpZnQocHdyZG0tPnByY21fb2ZmcywgUE1fUFdTVFNULAorCQkJCQlPTUFQMzQzMF9MT0dJQ1NUQVRFU1QpOworfQorCisvKioKKyAqIHB3cmRtX3JlYWRfcHJldl9sb2dpY19wd3JzdCAtIGdldCBwcmV2aW91cyBwb3dlcmRvbWFpbiBsb2dpYyBwb3dlciBzdGF0ZQorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byBnZXQgcHJldmlvdXMgbG9naWMgcG93ZXIgc3RhdGUKKyAqCisgKiBSZXR1cm4gdGhlIHBvd2VyZG9tYWluIHB3cmRtJ3MgbG9naWMgcG93ZXIgc3RhdGUuICBSZXR1cm5zIC1FSU5WQUwKKyAqIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwgb3IgcmV0dXJucyB0aGUgcHJldmlvdXMgbG9naWMKKyAqIHBvd2VyIHN0YXRlIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX3JlYWRfcHJldl9sb2dpY19wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWVzIGJlbG93IG1heSBub3QgY29ycmVzcG9uZCB0byB0aGUKKwkgKiBhY3R1YWwgbmFtZXMgb2YgdGhlIGJpdHMgaW4gZWFjaCBwb3dlcmRvbWFpbidzIHJlZ2lzdGVyLAorCSAqIGJ1dCB0aGUgdHlwZSBvZiB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc2FtZSBmb3IgZWFjaAorCSAqIHBvd2VyZG9tYWluLgorCSAqLworCXJldHVybiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChwd3JkbS0+cHJjbV9vZmZzLCBPTUFQMzQzMF9QTV9QUkVQV1NUU1QsCisJCQkJCU9NQVAzNDMwX0xBU1RMT0dJQ1NUQVRFRU5URVJFRCk7Cit9CisKKy8qKgorICogcHdyZG1fcmVhZF9tZW1fcHdyc3QgLSBnZXQgY3VycmVudCBtZW1vcnkgYmFuayBwb3dlciBzdGF0ZQorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byBnZXQgY3VycmVudCBtZW1vcnkgYmFuayBwb3dlciBzdGF0ZQorICogQGJhbms6IG1lbW9yeSBiYW5rIG51bWJlciAoMC0zKQorICoKKyAqIFJldHVybiB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBjdXJyZW50IG1lbW9yeSBwb3dlciBzdGF0ZSBmb3IgYmFuaworICogeC4gIFJldHVybnMgLUVJTlZBTCBpZiB0aGUgcG93ZXJkb21haW4gcG9pbnRlciBpcyBudWxsLCAtRUVYSVNUIGlmCisgKiB0aGUgdGFyZ2V0IG1lbW9yeSBiYW5rIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBjb250cm9sbGFibGUsIG9yCisgKiByZXR1cm5zIHRoZSBjdXJyZW50IG1lbW9yeSBwb3dlciBzdGF0ZSB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV9yZWFkX21lbV9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB1OCBiYW5rKQoreworCXUzMiBtOworCisJaWYgKCFwd3JkbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocHdyZG0tPmJhbmtzIDwgKGJhbmsgKyAxKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKgorCSAqIFRoZSByZWdpc3RlciBiaXQgbmFtZXMgYmVsb3cgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZQorCSAqIGFjdHVhbCBuYW1lcyBvZiB0aGUgYml0cyBpbiBlYWNoIHBvd2VyZG9tYWluJ3MgcmVnaXN0ZXIsCisJICogYnV0IHRoZSB0eXBlIG9mIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzYW1lIGZvciBlYWNoCisJICogcG93ZXJkb21haW4uCisJICovCisJc3dpdGNoIChiYW5rKSB7CisJY2FzZSAwOgorCQltID0gT01BUDM0MzBfU0hBUkVETDFDQUNIRUZMQVRTVEFURVNUX01BU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbSA9IE9NQVAzNDMwX0wxRkxBVE1FTVNUQVRFU1RfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltID0gT01BUDM0MzBfU0hBUkVETDJDQUNIRUZMQVRTVEFURVNUX01BU0s7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbSA9IE9NQVAzNDMwX0wyRkxBVE1FTVNUQVRFU1RfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlyZXR1cm4gcHJtX3JlYWRfbW9kX2JpdHNfc2hpZnQocHdyZG0tPnByY21fb2ZmcywgUE1fUFdTVFNULCBtKTsKK30KKworLyoqCisgKiBwd3JkbV9yZWFkX3ByZXZfbWVtX3B3cnN0IC0gZ2V0IHByZXZpb3VzIG1lbW9yeSBiYW5rIHBvd2VyIHN0YXRlCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGdldCBwcmV2aW91cyBtZW1vcnkgYmFuayBwb3dlciBzdGF0ZQorICogQGJhbms6IG1lbW9yeSBiYW5rIG51bWJlciAoMC0zKQorICoKKyAqIFJldHVybiB0aGUgcG93ZXJkb21haW4gcHdyZG0ncyBwcmV2aW91cyBtZW1vcnkgcG93ZXIgc3RhdGUgZm9yIGJhbmsKKyAqIHguICBSZXR1cm5zIC1FSU5WQUwgaWYgdGhlIHBvd2VyZG9tYWluIHBvaW50ZXIgaXMgbnVsbCwgLUVFWElTVCBpZgorICogdGhlIHRhcmdldCBtZW1vcnkgYmFuayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgY29udHJvbGxhYmxlLCBvcgorICogcmV0dXJucyB0aGUgcHJldmlvdXMgbWVtb3J5IHBvd2VyIHN0YXRlIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX3JlYWRfcHJldl9tZW1fcHdyc3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdTggYmFuaykKK3sKKwl1MzIgbTsKKworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHB3cmRtLT5iYW5rcyA8IChiYW5rICsgMSkpCisJCXJldHVybiAtRUVYSVNUOworCisJLyoKKwkgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWVzIGJlbG93IG1heSBub3QgY29ycmVzcG9uZCB0byB0aGUKKwkgKiBhY3R1YWwgbmFtZXMgb2YgdGhlIGJpdHMgaW4gZWFjaCBwb3dlcmRvbWFpbidzIHJlZ2lzdGVyLAorCSAqIGJ1dCB0aGUgdHlwZSBvZiB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgc2FtZSBmb3IgZWFjaAorCSAqIHBvd2VyZG9tYWluLgorCSAqLworCXN3aXRjaCAoYmFuaykgeworCWNhc2UgMDoKKwkJbSA9IE9NQVAzNDMwX0xBU1RNRU0xU1RBVEVFTlRFUkVEX01BU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbSA9IE9NQVAzNDMwX0xBU1RNRU0yU1RBVEVFTlRFUkVEX01BU0s7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbSA9IE9NQVAzNDMwX0xBU1RTSEFSRURMMkNBQ0hFRkxBVFNUQVRFRU5URVJFRF9NQVNLOworCQlicmVhazsKKwljYXNlIDM6CisJCW0gPSBPTUFQMzQzMF9MQVNUTDJGTEFUTUVNU1RBVEVFTlRFUkVEX01BU0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJcmV0dXJuIHBybV9yZWFkX21vZF9iaXRzX3NoaWZ0KHB3cmRtLT5wcmNtX29mZnMsCisJCQkJCU9NQVAzNDMwX1BNX1BSRVBXU1RTVCwgbSk7Cit9CisKKy8qKgorICogcHdyZG1fY2xlYXJfYWxsX3ByZXZfcHdyc3QgLSBjbGVhciBwcmV2aW91cyBwb3dlcnN0YXRlIHJlZ2lzdGVyIGZvciBhIHB3cmRtCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGNsZWFyCisgKgorICogQ2xlYXIgdGhlIHBvd2VyZG9tYWluJ3MgcHJldmlvdXMgcG93ZXIgc3RhdGUgcmVnaXN0ZXIuICBDbGVhcnMgdGhlCisgKiBlbnRpcmUgcmVnaXN0ZXIsIGluY2x1ZGluZyBsb2dpYyBhbmQgbWVtb3J5IGJhbmsgcHJldmlvdXMgcG93ZXIgc3RhdGVzLgorICogUmV0dXJucyAtRUlOVkFMIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwsIG9yIHJldHVybnMgMCB1cG9uCisgKiBzdWNjZXNzLgorICovCitpbnQgcHdyZG1fY2xlYXJfYWxsX3ByZXZfcHdyc3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwlpZiAoIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogWFhYIHNob3VsZCBnZXQgdGhlIHBvd2VyZG9tYWluJ3MgY3VycmVudCBzdGF0ZSBoZXJlOworCSAqIHdhcm4gJiBmYWlsIGlmIGl0IGlzIG5vdCBPTi4KKwkgKi8KKworCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogY2xlYXJpbmcgcHJldmlvdXMgcG93ZXIgc3RhdGUgcmVnIGZvciAlc1xuIiwKKwkJIHB3cmRtLT5uYW1lKTsKKworCXBybV93cml0ZV9tb2RfcmVnKDAsIHB3cmRtLT5wcmNtX29mZnMsIE9NQVAzNDMwX1BNX1BSRVBXU1RTVCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwd3JkbV9lbmFibGVfaGR3cl9zYXIgLSBlbmFibGUgYXV0b21hdGljIGhhcmR3YXJlIFNBUiBmb3IgYSBwd3JkbQorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKgorICoKKyAqIEVuYWJsZSBhdXRvbWF0aWMgY29udGV4dCBzYXZlLWFuZC1yZXN0b3JlIHVwb24gcG93ZXIgc3RhdGUgY2hhbmdlCisgKiBmb3Igc29tZSBkZXZpY2VzIGluIGEgcG93ZXJkb21haW4uICBXYXJuaW5nOiB0aGlzIG9ubHkgYWZmZWN0cyBhCisgKiBzdWJzZXQgb2YgZGV2aWNlcyBpbiBhIHBvd2VyZG9tYWluOyBjaGVjayB0aGUgVFJNIGNsb3NlbHkuICBSZXR1cm5zCisgKiAtRUlOVkFMIGlmIHRoZSBwb3dlcmRvbWFpbiBwb2ludGVyIGlzIG51bGwgb3IgaWYgdGhlIHBvd2VyZG9tYWluCisgKiBkb2VzIG5vdCBzdXBwb3J0IGF1dG9tYXRpYyBzYXZlLWFuZC1yZXN0b3JlLCBvciByZXR1cm5zIDAgdXBvbgorICogc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX2VuYWJsZV9oZHdyX3NhcihzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEocHdyZG0tPmZsYWdzICYgUFdSRE1fSEFTX0hEV1JfU0FSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46ICVzOiBzZXR0aW5nIFNBVkVBTkRSRVNUT1JFIGJpdFxuIiwKKwkJIHB3cmRtLT5uYW1lKTsKKworCXBybV9ybXdfbW9kX3JlZ19iaXRzKDAsIDEgPDwgT01BUDM0MzBFUzJfU0FWRUFORFJFU1RPUkVfU0hJRlQsCisJCQkgICAgIHB3cmRtLT5wcmNtX29mZnMsIFBNX1BXU1RDVFJMKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB3cmRtX2Rpc2FibGVfaGR3cl9zYXIgLSBkaXNhYmxlIGF1dG9tYXRpYyBoYXJkd2FyZSBTQVIgZm9yIGEgcHdyZG0KKyAqIEBwd3JkbTogc3RydWN0IHBvd2VyZG9tYWluICoKKyAqCisgKiBEaXNhYmxlIGF1dG9tYXRpYyBjb250ZXh0IHNhdmUtYW5kLXJlc3RvcmUgdXBvbiBwb3dlciBzdGF0ZSBjaGFuZ2UKKyAqIGZvciBzb21lIGRldmljZXMgaW4gYSBwb3dlcmRvbWFpbi4gIFdhcm5pbmc6IHRoaXMgb25seSBhZmZlY3RzIGEKKyAqIHN1YnNldCBvZiBkZXZpY2VzIGluIGEgcG93ZXJkb21haW47IGNoZWNrIHRoZSBUUk0gY2xvc2VseS4gIFJldHVybnMKKyAqIC1FSU5WQUwgaWYgdGhlIHBvd2VyZG9tYWluIHBvaW50ZXIgaXMgbnVsbCBvciBpZiB0aGUgcG93ZXJkb21haW4KKyAqIGRvZXMgbm90IHN1cHBvcnQgYXV0b21hdGljIHNhdmUtYW5kLXJlc3RvcmUsIG9yIHJldHVybnMgMCB1cG9uCisgKiBzdWNjZXNzLgorICovCitpbnQgcHdyZG1fZGlzYWJsZV9oZHdyX3NhcihzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCWlmICghcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEocHdyZG0tPmZsYWdzICYgUFdSRE1fSEFTX0hEV1JfU0FSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46ICVzOiBjbGVhcmluZyBTQVZFQU5EUkVTVE9SRSBiaXRcbiIsCisJCSBwd3JkbS0+bmFtZSk7CisKKwlwcm1fcm13X21vZF9yZWdfYml0cygxIDw8IE9NQVAzNDMwRVMyX1NBVkVBTkRSRVNUT1JFX1NISUZULCAwLAorCQkJICAgICBwd3JkbS0+cHJjbV9vZmZzLCBQTV9QV1NUQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwd3JkbV9oYXNfaGR3cl9zYXIgLSB0ZXN0IHdoZXRoZXIgcG93ZXJkb21haW4gc3VwcG9ydHMgaGFyZHdhcmUgU0FSCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqCisgKgorICogUmV0dXJucyAxIGlmIHBvd2VyZG9tYWluICdwd3JkbScgc3VwcG9ydHMgaGFyZHdhcmUgc2F2ZS1hbmQtcmVzdG9yZQorICogZm9yIHNvbWUgZGV2aWNlcywgb3IgMCBpZiBpdCBkb2VzIG5vdC4KKyAqLworYm9vbCBwd3JkbV9oYXNfaGR3cl9zYXIoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwlyZXR1cm4gKHB3cmRtICYmIHB3cmRtLT5mbGFncyAmIFBXUkRNX0hBU19IRFdSX1NBUikgPyAxIDogMDsKK30KKworLyoqCisgKiBwd3JkbV93YWl0X3RyYW5zaXRpb24gLSB3YWl0IGZvciBwb3dlcmRvbWFpbiBwb3dlciB0cmFuc2l0aW9uIHRvIGZpbmlzaAorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKiB0byB3YWl0IGZvcgorICoKKyAqIElmIHRoZSBwb3dlcmRvbWFpbiBwd3JkbSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBhIHN0YXRlIHRyYW5zaXRpb24sCisgKiBzcGluIHVudGlsIGl0IGNvbXBsZXRlcyB0aGUgcG93ZXIgdHJhbnNpdGlvbiwgb3IgdW50aWwgYW4gaXRlcmF0aW9uCisgKiBiYWlsb3V0IHZhbHVlIGlzIHJlYWNoZWQuIFJldHVybnMgLUVJTlZBTCBpZiB0aGUgcG93ZXJkb21haW4KKyAqIHBvaW50ZXIgaXMgbnVsbCwgLUVBR0FJTiBpZiB0aGUgYmFpbG91dCB2YWx1ZSB3YXMgcmVhY2hlZCwgb3IKKyAqIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBwd3JkbV93YWl0X3RyYW5zaXRpb24oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwl1MzIgYyA9IDA7CisKKwlpZiAoIXB3cmRtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogUkVWSVNJVDogcHdyZG1fd2FpdF90cmFuc2l0aW9uKCkgbWF5IGJlIGJldHRlciBpbXBsZW1lbnRlZAorCSAqIHZpYSBhIGNhbGxiYWNrIGFuZCBhIHBlcmlvZGljIHRpbWVyIGNoZWNrIC0tIGhvdyBsb25nIGRvIHdlIGV4cGVjdAorCSAqIHBvd2VyZG9tYWluIHRyYW5zaXRpb25zIHRvIHRha2U/CisJICovCisKKwkvKiBYWFggSXMgdGhpcyB1ZGVsYXkoKSB2YWx1ZSBtZWFuaW5nZnVsPyAqLworCXdoaWxlICgocHJtX3JlYWRfbW9kX3JlZyhwd3JkbS0+cHJjbV9vZmZzLCBQTV9QV1NUU1QpICYKKwkJT01BUF9JTlRSQU5TSVRJT04pICYmCisJICAgICAgIChjKysgPCBQV1JETV9UUkFOU0lUSU9OX0JBSUxPVVQpKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoYyA+PSBQV1JETV9UUkFOU0lUSU9OX0JBSUxPVVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcmRvbWFpbjogd2FpdGVkIHRvbyBsb25nIGZvciAiCisJCSAgICAgICAicG93ZXJkb21haW4gJXMgdG8gY29tcGxldGUgdHJhbnNpdGlvblxuIiwgcHdyZG0tPm5hbWUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlwcl9kZWJ1ZygicG93ZXJkb21haW46IGNvbXBsZXRlZCB0cmFuc2l0aW9uIGluICVkIGxvb3BzXG4iLCBjKTsKKworCXJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTUxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWlucy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogT01BUDIvMyBjb21tb24gcG93ZXJkb21haW4gZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKKyAqIERlYnVnZ2luZyBhbmQgaW50ZWdyYXRpb24gZml4ZXMgYnkgSm91bmkgSMO2Z2FuZGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEFSQ0hfQVJNX01BQ0hfT01BUDJfUE9XRVJET01BSU5TCisjZGVmaW5lIEFSQ0hfQVJNX01BQ0hfT01BUDJfUE9XRVJET01BSU5TCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSBwb3dlcmRvbWFpbnMgdGhhdCBoYXZlIHNvbWUgZWxlbWVudAorICogb2Ygc29mdHdhcmUgY29udHJvbCBmb3IgdGhlIE9NQVAyNHh4IGFuZCBPTUFQMzRYWCBjaGlwcy4KKyAqCisgKiBBIGZldyBub3RlczoKKyAqCisgKiBUaGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3Rpbmcgb2YgcG93ZXJkb21haW5zIG9uIHRoZSBjaGlwczsgb25seQorICogcG93ZXJkb21haW5zIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQgaW4gc29mdHdhcmUuCisgKgorICogQSB1c2VmdWwgdmFsaWRhdGlvbiBydWxlIGZvciBzdHJ1Y3QgcG93ZXJkb21haW46CisgKiBBbnkgcG93ZXJkb21haW4gcmVmZXJlbmNlZCBieSBhIHdrZGVwX3NyY3Mgb3Igc2xlZXBkZXBfc3JjcyBhcnJheQorICogbXVzdCBoYXZlIGEgZGVwX2JpdCBhc3NpZ25lZC4gIFNvIHdrZGVwX3NyY3Mvc2xlZXBkZXBfc3JjcyBhcmUgcmVhbGx5CisgKiBqdXN0IHNvZnR3YXJlLWNvbnRyb2xsYWJsZSBkZXBlbmRlbmNpZXMuICBOb24tc29mdHdhcmUtY29udHJvbGxhYmxlCisgKiBkZXBlbmRlbmNpZXMgZG8gZXhpc3QsIGJ1dCB0aGV5IGFyZSBub3QgZW5jb2RlZCBiZWxvdyAoeWV0KS4KKyAqCisgKiAyNHh4IGRvZXMgbm90IHN1cHBvcnQgcHJvZ3JhbW1hYmxlIHNsZWVwIGRlcGVuZGVuY2llcyAoU0xFRVBERVApCisgKgorICovCisKKy8qCisgKiBUaGUgbmFtZXMgZm9yIHRoZSBEU1AvSVZBMiBwb3dlcmRvbWFpbnMgYXJlIGNvbmZ1c2luZy4KKyAqCisgKiBNb3N0IE9NQVAgY2hpcHMgaGF2ZSBhbiBvbi1ib2FyZCBEU1AuCisgKgorICogT24gdGhlIDI0MjAsIHRoaXMgaXMgYSAnQzU1IERTUCBjYWxsZWQsIHNpbXBseSwgdGhlIERTUC4gIEl0cworICogcG93ZXJkb21haW4gaXMgY2FsbGVkIHRoZSAiRFNQIHBvd2VyIGRvbWFpbi4iICBPbiB0aGUgMjQzMCwgdGhlCisgKiBvbi1ib2FyZCBEU1AgaXMgYSAnQzY0IERTUCwgbm93IGNhbGxlZCB0aGUgSVZBMiBvciBJVkEyLjEuICBJdHMKKyAqIHBvd2VyZG9tYWluIGlzIHN0aWxsIGNhbGxlZCB0aGUgIkRTUCBwb3dlciBkb21haW4uIglPbiB0aGUgMzQzMCwKKyAqIHRoZSBEU1AgaXMgYSAnQzY0IERTUCBsaWtlIHRoZSAyNDMwLCBhbHNvIGtub3duIGFzIHRoZSBJVkEyOyBidXQKKyAqIGl0cyBwb3dlcmRvbWFpbiBpcyBub3cgY2FsbGVkIHRoZSAiSVZBMiBwb3dlciBkb21haW4uIgorICoKKyAqIFRoZSAyNDIwIGFsc28gaGFzIHNvbWV0aGluZyBjYWxsZWQgdGhlIElWQSwgd2hpY2ggaXMgYSBzZXBhcmF0ZSBBUk0KKyAqIGNvcmUsIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBEU1AvSVZBMi4KKyAqCisgKiBJZGVhbGx5IHRoZSBEU1AvSVZBMiBjb3VsZCBqdXN0IGJlIHRoZSBzYW1lIHBvd2VyZG9tYWluLCBidXQgdGhlIFBSQ00KKyAqIGFkZHJlc3Mgb2Zmc2V0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBDNTUgYW5kIEM2NCBEU1BzLgorICoKKyAqIFRoZSBvdmVybHktc3BlY2lmaWMgZGVwX2JpdCBuYW1lcyBhcmUgZHVlIHRvIGEgYml0IG5hbWUgY29sbGlzaW9uCisgKiB3aXRoIENNX0ZDTEtFTl97RFNQLElWQTJ9LiAgVGhlIERTUC9JVkEyIFBNX1dLREVQIGFuZCBDTV9TTEVFUERFUCBzaGlmdAorICogdmFsdWUgYXJlIHRoZSBzYW1lIGZvciBhbGwgcG93ZXJkb21haW5zOiAyCisgKi8KKworLyoKKyAqIFhYWCBzaG91bGQgZGVwX2JpdCBiZSBhIG1hc2ssIHNvIHdlIGNhbiB0ZXN0IHRvIHNlZSBpZiBpdCBpcyAwIGFzIGEKKyAqIHNhbml0eSBjaGVjaz8KKyAqIFhYWCBlbmNvZGUgaGFyZHdhcmUgZml4ZWQgd2FrZXVwIGRlcGVuZGVuY2llcyAtLSBlc3AuIGZvciAzNDMwIENPUkUKKyAqLworCisjaW5jbHVkZSA8bWFjaC9wb3dlcmRvbWFpbi5oPgorCisjaW5jbHVkZSAicHJjbS1jb21tb24uaCIKKyNpbmNsdWRlICJwcm0uaCIKKyNpbmNsdWRlICJjbS5oIgorCisvKiBPTUFQMi8zLWNvbW1vbiBwb3dlcmRvbWFpbnMgYW5kIHdha2V1cCBkZXBlbmRlbmNpZXMgKi8KKworLyoKKyAqIDI0MjAvMjQzMCBQTV9XS0RFUF9HRlg6IENPUkUsIE1QVSwgV0tVUAorICogMzQzMEVTMSBQTV9XS0RFUF9HRlg6IGFkZHMgSVZBMiwgcmVtb3ZlcyBDT1JFCisgKiAzNDMwRVMyIFBNX1dLREVQX1NHWDogYWRkcyBJVkEyLCByZW1vdmVzIENPUkUKKyAqLworc3RhdGljIHN0cnVjdCBwd3JkbV9kZXAgZ2Z4X3NneF93a2RlcHNbXSA9IHsKKwl7CisJCS5wd3JkbV9uYW1lID0gImNvcmVfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAiaXZhMl9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJtcHVfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8CisJCQkJCSAgICBDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJ3a3VwX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFggfAorCQkJCQkgICAgQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsgTlVMTCB9LAorfTsKKworLyoKKyAqIDM0MzA6IENNX1NMRUVQREVQX0NBTTogTVBVCisgKiAzNDMwRVMxOiBDTV9TTEVFUERFUF9HRlg6IE1QVQorICogMzQzMEVTMjogQ01fU0xFRVBERVBfU0dYOiBNUFUKKyAqLworc3RhdGljIHN0cnVjdCBwd3JkbV9kZXAgY2FtX2dmeF9zbGVlcGRlcHNbXSA9IHsKKwl7CisJCS5wd3JkbV9uYW1lID0gIm1wdV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeyBOVUxMIH0sCit9OworCisKKyNpbmNsdWRlICJwb3dlcmRvbWFpbnMyNHh4LmgiCisjaW5jbHVkZSAicG93ZXJkb21haW5zMzR4eC5oIgorCisKKy8qCisgKiBPTUFQMi8zIGNvbW1vbiBwb3dlcmRvbWFpbnMKKyAqLworCisvKgorICogVGhlIEdGWCBwb3dlcmRvbWFpbiBpcyBub3QgcHJlc2VudCBvbiAzNDMwRVMyLCBidXQgY3VycmVudGx5IHdlIGRvIG5vdAorICogaGF2ZSBhIG1hY3JvIHRvIGZpbHRlciBpdCBvdXQgYXQgY29tcGlsZS10aW1lLgorICovCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGdmeF9wd3JkbSA9IHsKKwkubmFtZQkJICA9ICJnZnhfcHdyZG0iLAorCS5wcmNtX29mZnMJICA9IEdGWF9NT0QsCisJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8CisJCQkJCSAgIENISVBfSVNfT01BUDM0MzBFUzEpLAorCS53a2RlcF9zcmNzCSAgPSBnZnhfc2d4X3drZGVwcywKKwkuc2xlZXBkZXBfc3JjcwkgID0gY2FtX2dmeF9zbGVlcGRlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSRE1fUE9XRVJfUkVULAorCS5iYW5rcwkJICA9IDEsCisJLnB3cnN0c19tZW1fcmV0CSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX1JFVCwgLyogTUVNUkVUU1RBVEUgKi8KKwl9LAorCS5wd3JzdHNfbWVtX29uCSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX09OLCAgLyogTUVNT05TVEFURSAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHdrdXBfcHdyZG0gPSB7CisJLm5hbWUJCT0gIndrdXBfcHdyZG0iLAorCS5wcmNtX29mZnMJPSBXS1VQX01PRCwKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8IENISVBfSVNfT01BUDM0MzApLAorCS5kZXBfYml0CT0gT01BUF9FTl9XS1VQX1NISUZULAorfTsKKworCisKKy8qIEFzIHBvd2VyZG9tYWlucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBhYm92ZSwgdGhpcyBsaXN0IG11c3QgYWxzbyBiZSBjaGFuZ2VkICovCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluICpwb3dlcmRvbWFpbnNfb21hcFtdIF9faW5pdGRhdGEgPSB7CisKKwkmZ2Z4X3B3cmRtLAorCSZ3a3VwX3B3cmRtLAorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwkmZHNwX3B3cmRtLAorCSZtcHVfMjR4eF9wd3JkbSwKKwkmY29yZV8yNHh4X3B3cmRtLAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQzMAorCSZtZG1fcHdyZG0sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCisJJml2YTJfcHdyZG0sCisJJm1wdV8zNHh4X3B3cmRtLAorCSZuZW9uX3B3cmRtLAorCSZjb3JlXzM0eHhfcHdyZG0sCisJJmNhbV9wd3JkbSwKKwkmZHNzX3B3cmRtLAorCSZwZXJfcHdyZG0sCisJJmVtdV9wd3JkbSwKKwkmc2d4X3B3cmRtLAorCSZ1c2Job3N0X3B3cmRtLAorI2VuZGlmCisKKwlOVUxMCit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyNHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczI0eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA4ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyNHh4LmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBPTUFQMjRYWCBwb3dlcmRvbWFpbiBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgUGF1bCBXYWxtc2xleQorICogRGVidWdnaW5nIGFuZCBpbnRlZ3JhdGlvbiBmaXhlcyBieSBKb3VuaSBIw7ZnYW5kZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQVJDSF9BUk1fTUFDSF9PTUFQMl9QT1dFUkRPTUFJTlMyNFhYCisjZGVmaW5lIEFSQ0hfQVJNX01BQ0hfT01BUDJfUE9XRVJET01BSU5TMjRYWAorCisvKgorICogTi5CLiBJZiBwb3dlcmRvbWFpbnMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGZpbGUsIHVwZGF0ZQorICogdGhlIGFycmF5IGluIG1hY2gtb21hcDIvcG93ZXJkb21haW5zLmguCisgKi8KKworI2luY2x1ZGUgPG1hY2gvcG93ZXJkb21haW4uaD4KKworI2luY2x1ZGUgInByY20tY29tbW9uLmgiCisjaW5jbHVkZSAicHJtLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgorI2luY2x1ZGUgImNtLmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0yNHh4LmgiCisKKy8qIDI0WFggcG93ZXJkb21haW5zIGFuZCBkZXBlbmRlbmNpZXMgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisKKworLyogV2FrZXVwIGRlcGVuZGVuY3kgc291cmNlIGFycmF5cyAqLworCisvKgorICogMjQyMC8yNDMwIFBNX1dLREVQX0RTUDogQ09SRSwgTVBVLCBXS1VQCisgKiAyNDMwIFBNX1dLREVQX01ETTogc2FtZSBhcyBhYm92ZQorICovCitzdGF0aWMgc3RydWN0IHB3cmRtX2RlcCBkc3BfbWRtXzI0eHhfd2tkZXBzW10gPSB7CisJeworCQkucHdyZG1fbmFtZSA9ICJjb3JlX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIm1wdV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJ3a3VwX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCisJfSwKKwl7IE5VTEwgfSwKK307CisKKy8qCisgKiAyNDIwIFBNX1dLREVQX01QVTogQ09SRSwgRFNQLCBXS1VQCisgKiAyNDMwIGFkZHMgTURNCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHdyZG1fZGVwIG1wdV8yNHh4X3drZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAiY29yZV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJkc3BfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAid2t1cF9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJtZG1fcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKKwl9LAorCXsgTlVMTCB9LAorfTsKKworLyoKKyAqIDI0MjAgUE1fV0tERVBfQ09SRTogRFNQLCBHRlgsIE1QVSwgV0tVUAorICogMjQzMCBhZGRzIE1ETQorICovCitzdGF0aWMgc3RydWN0IHB3cmRtX2RlcCBjb3JlXzI0eHhfd2tkZXBzW10gPSB7CisJeworCQkucHdyZG1fbmFtZSA9ICJkc3BfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAiZ2Z4X3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIm1wdV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJ3a3VwX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIm1kbV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQorCX0sCisJeyBOVUxMIH0sCit9OworCisKKy8qIFBvd2VyZG9tYWlucyAqLworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGRzcF9wd3JkbSA9IHsKKwkubmFtZQkJICA9ICJkc3BfcHdyZG0iLAorCS5wcmNtX29mZnMJICA9IE9NQVAyNFhYX0RTUF9NT0QsCisJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCisJLmRlcF9iaXQJICA9IE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1BfU0hJRlQsCisJLndrZGVwX3NyY3MJICA9IGRzcF9tZG1fMjR4eF93a2RlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSRE1fUE9XRVJfUkVULAorCS5iYW5rcwkJICA9IDEsCisJLnB3cnN0c19tZW1fcmV0CSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX1JFVCwKKwl9LAorCS5wd3JzdHNfbWVtX29uCSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX09OLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIG1wdV8yNHh4X3B3cmRtID0geworCS5uYW1lCQkgID0gIm1wdV9wd3JkbSIsCisJLnByY21fb2ZmcwkgID0gTVBVX01PRCwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKSwKKwkuZGVwX2JpdAkgID0gT01BUDI0WFhfRU5fTVBVX1NISUZULAorCS53a2RlcF9zcmNzCSAgPSBtcHVfMjR4eF93a2RlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCisJLmJhbmtzCQkgID0gMSwKKwkucHdyc3RzX21lbV9yZXQJICA9IHsKKwkJWzBdID0gUFdSRE1fUE9XRVJfUkVULAorCX0sCisJLnB3cnN0c19tZW1fb24JICA9IHsKKwkJWzBdID0gUFdSRE1fUE9XRVJfT04sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY29yZV8yNHh4X3B3cmRtID0geworCS5uYW1lCQkgID0gImNvcmVfcHdyZG0iLAorCS5wcmNtX29mZnMJICA9IENPUkVfTU9ELAorCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpLAorCS53a2RlcF9zcmNzCSAgPSBjb3JlXzI0eHhfd2tkZXBzLAorCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkuZGVwX2JpdAkgID0gT01BUDI0WFhfRU5fQ09SRV9TSElGVCwKKwkuYmFua3MJCSAgPSAzLAorCS5wd3JzdHNfbWVtX3JldAkgID0geworCQlbMF0gPSBQV1JTVFNfT0ZGX1JFVCwJIC8qIE1FTTFSRVRTVEFURSAqLworCQlbMV0gPSBQV1JTVFNfT0ZGX1JFVCwJIC8qIE1FTTJSRVRTVEFURSAqLworCQlbMl0gPSBQV1JTVFNfT0ZGX1JFVCwJIC8qIE1FTTNSRVRTVEFURSAqLworCX0sCisJLnB3cnN0c19tZW1fb24JICA9IHsKKwkJWzBdID0gUFdSU1RTX09GRl9SRVRfT04sIC8qIE1FTTFPTlNUQVRFICovCisJCVsxXSA9IFBXUlNUU19PRkZfUkVUX09OLCAvKiBNRU0yT05TVEFURSAqLworCQlbMl0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNM09OU1RBVEUgKi8KKwl9LAorfTsKKworI2VuZGlmCSAgIC8qIENPTkZJR19BUkNIX09NQVAyNFhYICovCisKKworCisvKgorICogMjQzMC1zcGVjaWZpYyBwb3dlcmRvbWFpbnMKKyAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0MzAKKworLyogWFhYIDI0MzAgS0lMTERPTUFJTldLVVAgYml0PyAgTm8gY3VycmVudCB1c2VycyBhcHBhcmVudGx5ICovCisKKy8qIEFub3RoZXIgY2FzZSBvZiBiaXQgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnM6IEVOX01ETSAqLworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBtZG1fcHdyZG0gPSB7CisJLm5hbWUJCSAgPSAibWRtX3B3cmRtIiwKKwkucHJjbV9vZmZzCSAgPSBPTUFQMjQzMF9NRE1fTU9ELAorCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAorCS5kZXBfYml0CSAgPSBPTUFQMjQzMF9QTV9XS0RFUF9NUFVfRU5fTURNX1NISUZULAorCS53a2RlcF9zcmNzCSAgPSBkc3BfbWRtXzI0eHhfd2tkZXBzLAorCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUkRNX1BPV0VSX1JFVCwKKwkuYmFua3MJCSAgPSAxLAorCS5wd3JzdHNfbWVtX3JldAkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9SRVQsIC8qIE1FTVJFVFNUQVRFICovCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9PTiwgIC8qIE1FTU9OU1RBVEUgKi8KKwl9LAorfTsKKworI2VuZGlmICAgICAvKiBDT05GSUdfQVJDSF9PTUFQMjQzMCAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzNHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczM0eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTczZjcxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzNHh4LmgKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBPTUFQMzRYWCBwb3dlcmRvbWFpbiBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgUGF1bCBXYWxtc2xleQorICogRGVidWdnaW5nIGFuZCBpbnRlZ3JhdGlvbiBmaXhlcyBieSBKb3VuaSBIw7ZnYW5kZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQVJDSF9BUk1fTUFDSF9PTUFQMl9QT1dFUkRPTUFJTlMzNFhYCisjZGVmaW5lIEFSQ0hfQVJNX01BQ0hfT01BUDJfUE9XRVJET01BSU5TMzRYWAorCisvKgorICogTi5CLiBJZiBwb3dlcmRvbWFpbnMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGZpbGUsIHVwZGF0ZQorICogdGhlIGFycmF5IGluIG1hY2gtb21hcDIvcG93ZXJkb21haW5zLmguCisgKi8KKworI2luY2x1ZGUgPG1hY2gvcG93ZXJkb21haW4uaD4KKworI2luY2x1ZGUgInByY20tY29tbW9uLmgiCisjaW5jbHVkZSAicHJtLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMzR4eC5oIgorI2luY2x1ZGUgImNtLmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0zNHh4LmgiCisKKy8qCisgKiAzNFhYLXNwZWNpZmljIHBvd2VyZG9tYWlucywgZGVwZW5kZW5jaWVzCisgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCisKKy8qCisgKiAzNDMwOiBQTV9XS0RFUF97UEVSLFVTQkhPU1R9OiBDT1JFLCBJVkEyLCBNUFUsIFdLVVAKKyAqIChVU0JIT1NUIGlzIEVTMiBvbmx5KQorICovCitzdGF0aWMgc3RydWN0IHB3cmRtX2RlcCBwZXJfdXNiaG9zdF93a2RlcHNbXSA9IHsKKwl7CisJCS5wd3JkbV9uYW1lID0gImNvcmVfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAiaXZhMl9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJtcHVfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAid2t1cF9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeyBOVUxMIH0sCit9OworCisvKgorICogMzQzMCBQTV9XS0RFUF9NUFU6IENPUkUsIElWQTIsIERTUywgUEVSCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHdyZG1fZGVwIG1wdV8zNHh4X3drZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAiY29yZV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJpdmEyX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gImRzc19wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJwZXJfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsgTlVMTCB9LAorfTsKKworLyoKKyAqIDM0MzAgUE1fV0tERVBfSVZBMjogQ09SRSwgTVBVLCBXS1VQLCBEU1MsIFBFUgorICovCitzdGF0aWMgc3RydWN0IHB3cmRtX2RlcCBpdmEyX3drZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAiY29yZV9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJtcHVfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAid2t1cF9wd3JkbSIsCisJCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQorCX0sCisJeworCQkucHdyZG1fbmFtZSA9ICJkc3NfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAicGVyX3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7IE5VTEwgfSwKK307CisKKworLyogMzQzMCBQTV9XS0RFUF97Q0FNLERTU306IElWQTIsIE1QVSwgV0tVUCAqLworc3RhdGljIHN0cnVjdCBwd3JkbV9kZXAgY2FtX2Rzc193a2RlcHNbXSA9IHsKKwl7CisJCS5wd3JkbV9uYW1lID0gIml2YTJfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsKKwkJLnB3cmRtX25hbWUgPSAibXB1X3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIndrdXBfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMDogUE1fV0tERVBfTkVPTjogTVBVICovCitzdGF0aWMgc3RydWN0IHB3cmRtX2RlcCBuZW9uX3drZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAibXB1X3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7IE5VTEwgfSwKK307CisKKworLyogU2xlZXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzIGZvciAzNHh4LXNwZWNpZmljIHB3cmRtcyAtIDM0WFggb25seSAqLworCisvKgorICogMzQzMDogQ01fU0xFRVBERVBfe0RTUyxQRVJ9OiBNUFUsIElWQQorICogMzQzMEVTMjogQ01fU0xFRVBERVBfVVNCSE9TVDogTVBVLCBJVkEKKyAqLworc3RhdGljIHN0cnVjdCBwd3JkbV9kZXAgZHNzX3Blcl91c2Job3N0X3NsZWVwZGVwc1tdID0geworCXsKKwkJLnB3cmRtX25hbWUgPSAibXB1X3B3cmRtIiwKKwkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCisJfSwKKwl7CisJCS5wd3JkbV9uYW1lID0gIml2YTJfcHdyZG0iLAorCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKKwl9LAorCXsgTlVMTCB9LAorfTsKKworCisvKgorICogUG93ZXJkb21haW5zCisgKi8KKworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBpdmEyX3B3cmRtID0geworCS5uYW1lCQkgID0gIml2YTJfcHdyZG0iLAorCS5wcmNtX29mZnMJICA9IE9NQVAzNDMwX0lWQTJfTU9ELAorCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorCS5kZXBfYml0CSAgPSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fSVZBMl9TSElGVCwKKwkud2tkZXBfc3JjcwkgID0gaXZhMl93a2RlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCisJLmJhbmtzCQkgID0gNCwKKwkucHdyc3RzX21lbV9yZXQJICA9IHsKKwkJWzBdID0gUFdSU1RTX09GRl9SRVQsCisJCVsxXSA9IFBXUlNUU19PRkZfUkVULAorCQlbMl0gPSBQV1JTVFNfT0ZGX1JFVCwKKwkJWzNdID0gUFdSU1RTX09GRl9SRVQsCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9PTiwKKwkJWzFdID0gUFdSRE1fUE9XRVJfT04sCisJCVsyXSA9IFBXUlNUU19PRkZfT04sCisJCVszXSA9IFBXUkRNX1BPV0VSX09OLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIG1wdV8zNHh4X3B3cmRtID0geworCS5uYW1lCQkgID0gIm1wdV9wd3JkbSIsCisJLnByY21fb2ZmcwkgID0gTVBVX01PRCwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkuZGVwX2JpdAkgID0gT01BUDM0MzBfRU5fTVBVX1NISUZULAorCS53a2RlcF9zcmNzCSAgPSBtcHVfMzR4eF93a2RlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCisJLmJhbmtzCQkgID0gMSwKKwkucHdyc3RzX21lbV9yZXQJICA9IHsKKwkJWzBdID0gUFdSU1RTX09GRl9SRVQsCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JTVFNfT0ZGX09OLAorCX0sCit9OworCisvKiBObyB3a2RlcHMgb3Igc2xlZXBkZXBzIGZvciAzNHh4IGNvcmUgYXBwYXJlbnRseSAqLworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjb3JlXzM0eHhfcHdyZG0gPSB7CisJLm5hbWUJCSAgPSAiY29yZV9wd3JkbSIsCisJLnByY21fb2ZmcwkgID0gQ09SRV9NT0QsCisJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5kZXBfYml0CSAgPSBPTUFQMzQzMF9FTl9DT1JFX1NISUZULAorCS5iYW5rcwkJICA9IDIsCisJLnB3cnN0c19tZW1fcmV0CSAgPSB7CisJCVswXSA9IFBXUlNUU19PRkZfUkVULAkgLyogTUVNMVJFVFNUQVRFICovCisJCVsxXSA9IFBXUlNUU19PRkZfUkVULAkgLyogTUVNMlJFVFNUQVRFICovCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNMU9OU1RBVEUgKi8KKwkJWzFdID0gUFdSU1RTX09GRl9SRVRfT04sIC8qIE1FTTJPTlNUQVRFICovCisJfSwKK307CisKKy8qIEFub3RoZXIgY2FzZSBvZiBiaXQgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnM6IEVOX0RTUyAqLworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkc3NfcHdyZG0gPSB7CisJLm5hbWUJCSAgPSAiZHNzX3B3cmRtIiwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9EU1NfTU9ELAorCS5kZXBfYml0CSAgPSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fRFNTX1NISUZULAorCS53a2RlcF9zcmNzCSAgPSBjYW1fZHNzX3drZGVwcywKKwkuc2xlZXBkZXBfc3JjcwkgID0gZHNzX3Blcl91c2Job3N0X3NsZWVwZGVwcywKKwkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCisJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JETV9QT1dFUl9SRVQsCisJLmJhbmtzCQkgID0gMSwKKwkucHdyc3RzX21lbV9yZXQJICA9IHsKKwkJWzBdID0gUFdSRE1fUE9XRVJfUkVULCAvKiBNRU1SRVRTVEFURSAqLworCX0sCisJLnB3cnN0c19tZW1fb24JICA9IHsKKwkJWzBdID0gUFdSRE1fUE9XRVJfT04sICAvKiBNRU1PTlNUQVRFICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gc2d4X3B3cmRtID0geworCS5uYW1lCQkgID0gInNneF9wd3JkbSIsCisJLnByY21fb2ZmcwkgID0gT01BUDM0MzBFUzJfU0dYX01PRCwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMyKSwKKwkud2tkZXBfc3JjcwkgID0gZ2Z4X3NneF93a2RlcHMsCisJLnNsZWVwZGVwX3NyY3MJICA9IGNhbV9nZnhfc2xlZXBkZXBzLAorCS8qIFhYWCBUaGlzIGlzIGFjY3VyYXRlIGZvciAzNDMwIFNHWCwgYnV0IHdoYXQgYWJvdXQgR0ZYPyAqLworCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUkRNX1BPV0VSX1JFVCwKKwkuYmFua3MJCSAgPSAxLAorCS5wd3JzdHNfbWVtX3JldAkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9SRVQsIC8qIE1FTVJFVFNUQVRFICovCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9PTiwgIC8qIE1FTU9OU1RBVEUgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjYW1fcHdyZG0gPSB7CisJLm5hbWUJCSAgPSAiY2FtX3B3cmRtIiwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9DQU1fTU9ELAorCS53a2RlcF9zcmNzCSAgPSBjYW1fZHNzX3drZGVwcywKKwkuc2xlZXBkZXBfc3JjcwkgID0gY2FtX2dmeF9zbGVlcGRlcHMsCisJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAorCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSRE1fUE9XRVJfUkVULAorCS5iYW5rcwkJICA9IDEsCisJLnB3cnN0c19tZW1fcmV0CSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX1JFVCwgLyogTUVNUkVUU1RBVEUgKi8KKwl9LAorCS5wd3JzdHNfbWVtX29uCSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX09OLCAgLyogTUVNT05TVEFURSAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHBlcl9wd3JkbSA9IHsKKwkubmFtZQkJICA9ICJwZXJfcHdyZG0iLAorCS5wcmNtX29mZnMJICA9IE9NQVAzNDMwX1BFUl9NT0QsCisJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCisJLmRlcF9iaXQJICA9IE9NQVAzNDMwX0VOX1BFUl9TSElGVCwKKwkud2tkZXBfc3JjcwkgID0gcGVyX3VzYmhvc3Rfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCSAgPSBkc3NfcGVyX3VzYmhvc3Rfc2xlZXBkZXBzLAorCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAorCS5iYW5rcwkJICA9IDEsCisJLnB3cnN0c19tZW1fcmV0CSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX1JFVCwgLyogTUVNUkVUU1RBVEUgKi8KKwl9LAorCS5wd3JzdHNfbWVtX29uCSAgPSB7CisJCVswXSA9IFBXUkRNX1BPV0VSX09OLCAgLyogTUVNT05TVEFURSAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGVtdV9wd3JkbSA9IHsKKwkubmFtZQkJPSAiZW11X3B3cmRtIiwKKwkucHJjbV9vZmZzCT0gT01BUDM0MzBfRU1VX01PRCwKKwkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCit9OworCitzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIG5lb25fcHdyZG0gPSB7CisJLm5hbWUJCSAgPSAibmVvbl9wd3JkbSIsCisJLnByY21fb2ZmcwkgID0gT01BUDM0MzBfTkVPTl9NT0QsCisJLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCisJLndrZGVwX3NyY3MJICA9IG5lb25fd2tkZXBzLAorCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUkRNX1BPV0VSX1JFVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gdXNiaG9zdF9wd3JkbSA9IHsKKwkubmFtZQkJICA9ICJ1c2Job3N0X3B3cmRtIiwKKwkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwKKwkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMyKSwKKwkud2tkZXBfc3JjcwkgID0gcGVyX3VzYmhvc3Rfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCSAgPSBkc3NfcGVyX3VzYmhvc3Rfc2xlZXBkZXBzLAorCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKKwkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUkRNX1BPV0VSX1JFVCwKKwkuYmFua3MJCSAgPSAxLAorCS5wd3JzdHNfbWVtX3JldAkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9SRVQsIC8qIE1FTVJFVFNUQVRFICovCisJfSwKKwkucHdyc3RzX21lbV9vbgkgID0geworCQlbMF0gPSBQV1JETV9QT1dFUl9PTiwgIC8qIE1FTU9OU1RBVEUgKi8KKwl9LAorfTsKKworI2VuZGlmICAgIC8qIENPTkZJR19BUkNIX09NQVAzNFhYICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY20tY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY20tY29tbW9uLmgKaW5kZXggNTRjMzJmNC4uNGEzMjgyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLWNvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS1jb21tb24uaApAQCAtMzEyLDcgKzMxMiw4IEBACiAjZGVmaW5lIE9NQVAzNDMwX1NUX0dQVDIJCQkJKDEgPDwgMykKIAogLyogQ01fU0xFRVBERVBfUEVSLCBQTV9XS0RFUF9JVkEyLCBQTV9XS0RFUF9NUFUsIFBNX1dLREVQX1BFUiBzaGFyZWQgYml0cyAqLwotI2RlZmluZSBPTUFQMzQzMF9FTl9DT1JFCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAzNDMwX0VOX0NPUkVfU0hJRlQJCQkJMAorI2RlZmluZSBPTUFQMzQzMF9FTl9DT1JFX01BU0sJCQkJKDEgPDwgMCkKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMjR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0tcmVnYml0cy0yNHh4LmgKaW5kZXggYzZkMTdhMy4uNDAwMjA1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0tcmVnYml0cy0yNHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0tcmVnYml0cy0yNHh4LmgKQEAgLTI5LDggKzI5LDEwIEBACiAjZGVmaW5lIE9NQVAyNFhYX1dLVVAxX0VOCQkJCSgxIDw8IDApCiAKIC8qIFBNX1dLREVQX0dGWCwgUE1fV0tERVBfTVBVLCBQTV9XS0RFUF9EU1AsIFBNX1dLREVQX01ETSBzaGFyZWQgYml0cyAqLwotI2RlZmluZSBPTUFQMjRYWF9FTl9NUFUJCQkJCSgxIDw8IDEpCi0jZGVmaW5lIE9NQVAyNFhYX0VOX0NPUkUJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDI0WFhfRU5fTVBVX1NISUZUCQkJCTEKKyNkZWZpbmUgT01BUDI0WFhfRU5fTVBVX01BU0sJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDI0WFhfRU5fQ09SRV9TSElGVCAJCQkJMAorI2RlZmluZSBPTUFQMjRYWF9FTl9DT1JFX01BU0sJCQkJKDEgPDwgMCkKIAogLyoKICAqIFBNX1BXU1RDVFJMX01QVSwgUE1fUFdTVENUUkxfR0ZYLCBQTV9QV1NUQ1RSTF9EU1AsIFBNX1BXU1RDVFJMX01ETQpAQCAtMTQwLDggKzE0MiwxMCBAQAogLyogMjQzMCBjYWxscyBHTE9CQUxXTVBVX1JTVCAiR0xPQkFMV0FSTV9SU1QiIGluc3RlYWQgKi8KIAogLyogUE1fV0tERVBfTVBVIHNwZWNpZmljIGJpdHMgKi8KLSNkZWZpbmUgT01BUDI0MzBfUE1fV0tERVBfTVBVX0VOX01ETQkJCSgxIDw8IDUpCi0jZGVmaW5lIE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1AJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQMjQzMF9QTV9XS0RFUF9NUFVfRU5fTURNX1NISUZUCQk1CisjZGVmaW5lIE9NQVAyNDMwX1BNX1dLREVQX01QVV9FTl9NRE1fTUFTSwkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDI0WFhfUE1fV0tERVBfTVBVX0VOX0RTUF9TSElGVAkJMgorI2RlZmluZSBPTUFQMjRYWF9QTV9XS0RFUF9NUFVfRU5fRFNQX01BU0sJCSgxIDw8IDIpCiAKIC8qIFBNX0VWR0VOQ1RSTF9NUFUgc3BlY2lmaWMgYml0cyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS1yZWdiaXRzLTM0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMzR4eC5oCmluZGV4IGI0Njg2YmMuLjViNWVjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMzR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLXJlZ2JpdHMtMzR4eC5oCkBAIC02OCw3ICs2OCw4IEBACiAjZGVmaW5lIE9NQVAzNDMwX1ZQSU5JRExFCQkJCSgxIDw8IDApCiAKIC8qIFBNX1dLREVQX0lWQTIsIFBNX1dLREVQX01QVSBzaGFyZWQgYml0cyAqLwotI2RlZmluZSBPTUFQMzQzMF9FTl9QRVIJCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVAzNDMwX0VOX1BFUl9TSElGVAkJCQk3CisjZGVmaW5lIE9NQVAzNDMwX0VOX1BFUl9NQVNLCQkJCSgxIDw8IDcpCiAKIC8qIFBNX1BXU1RDVFJMX0lWQTIsIFBNX1BXU1RDVFJMX01QVSwgUE1fUFdTVENUUkxfQ09SRSBzaGFyZWQgYml0cyAqLwogI2RlZmluZSBPTUFQMzQzMF9NRU1PUllDSEFOR0UJCQkJKDEgPDwgMykKQEAgLTc3LDcgKzc4LDcgQEAKICNkZWZpbmUgT01BUDM0MzBfTE9HSUNTVEFURVNUCQkJCSgxIDw8IDIpCiAKIC8qIFBNX1BSRVBXU1RTVF9JVkEyLCBQTV9QUkVQV1NUU1RfQ09SRSBzaGFyZWQgYml0cyAqLwotI2RlZmluZSBPTUFQMzQzMF9MQVNUTE9HSUNTVEFURUVOVEVSRUQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDM0MzBfTEFTVExPR0lDU1RBVEVFTlRFUkVECQkJKDEgPDwgMikKIAogLyoKICAqIFBNX1BSRVBXU1RTVF9JVkEyLCBQTV9QUkVQV1NUU1RfTVBVLCBQTV9QUkVQV1NUU1RfQ09SRSwKQEAgLTI3OCw4ICsyNzksMTAgQEAKICNkZWZpbmUgT01BUDM0MzBfRU1VTEFUSU9OX01QVV9SU1QJCQkoMSA8PCAxMSkKIAogLyogUE1fV0tERVBfTVBVIHNwZWNpZmljIGJpdHMgKi8KLSNkZWZpbmUgT01BUDM0MzBfUE1fV0tERVBfTVBVX0VOX0RTUwkJCSgxIDw8IDUpCi0jZGVmaW5lIE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9JVkEyCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDM0MzBfUE1fV0tERVBfTVBVX0VOX0RTU19TSElGVAkJNQorI2RlZmluZSBPTUFQMzQzMF9QTV9XS0RFUF9NUFVfRU5fRFNTX01BU0sJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9JVkEyX1NISUZUCQkyCisjZGVmaW5lIE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9JVkEyX01BU0sJCSgxIDw8IDIpCiAKIC8qIFBNX0VWR0VOQ1RSTF9NUFUgKi8KICNkZWZpbmUgT01BUDM0MzBfT0ZGTE9BRE1PREVfU0hJRlQJCQkzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0uaAppbmRleCBiYmY0MWZjLi5lNGRjNGIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxFUl9fCiAjZGVmaW5lIE9NQVBfUFJNX1JFR0FERFIobW9kdWxlLCByZWcpCQkJCQlcCi0JKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDJfUFJNX0JBU0UgKyAobW9kdWxlKSArIChyZWcpKQorCQkJSU9fQUREUkVTUyhPTUFQMl9QUk1fQkFTRSArIChtb2R1bGUpICsgKHJlZykpCiAjZWxzZQogI2RlZmluZSBPTUFQMjQyMF9QUk1fUkVHQUREUihtb2R1bGUsIHJlZykJCQkJXAogCQkJSU9fQUREUkVTUyhPTUFQMjQyMF9QUk1fQkFTRSArIChtb2R1bGUpICsgKHJlZykpCkBAIC0zMDUsNyArMzA1LDggQEAKICAqIDM0MzA6IFBNX1dLREVQX0lWQTIsIFBNX1dLREVQX0dGWCwgUE1fV0tERVBfRFNTLCBQTV9XS0RFUF9DQU0sCiAgKgkgUE1fV0tERVBfUEVSCiAgKi8KLSNkZWZpbmUgT01BUF9FTl9XS1VQCQkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQX0VOX1dLVVBfU0hJRlQJCQkJNAorI2RlZmluZSBPTUFQX0VOX1dLVVBfTUFTSwkJCQkoMSA8PCA0KQogCiAvKgogICogMjRYWDogUE1fUFdTVENUUkxfTVBVLCBQTV9QV1NUQ1RSTF9DT1JFLCBQTV9QV1NUQ1RSTF9HRlgsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwppbmRleCBhZGM4YTI2YS4uNGRjZjM5YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBPTUFQMiBzZXJpYWwgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IE5va2lhIENvcnBvcmF0aW9uCiAgKiBBdXRob3I6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPgogICoKICAqIEJhc2VkIG9mZiBvZiBhcmNoL2FybS9tYWNoLW9tYXAvb21hcDEvc2VyaWFsLmMKQEAgLTE3LDQ0ICsxNywzOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogCi1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQxX2ljayA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQxX2ZjayA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQyX2ljayA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQyX2ZjayA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQzX2ljayA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IGNsayAqIHVhcnQzX2ZjayA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGNsayAqdWFydF9pY2tbT01BUF9NQVhfTlJfUE9SVFNdOworc3RhdGljIHN0cnVjdCBjbGsgKnVhcnRfZmNrW09NQVBfTUFYX05SX1BPUlRTXTsKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKLQkJLm1lbWJhc2UJPSAoY2hhciAqKUlPX0FERFJFU1MoT01BUF9VQVJUMV9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQxX0JBU0UsCisJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpLAorCQkubWFwYmFzZQk9IE9NQVBfVUFSVDFfQkFTRSwKIAkJLmlycQkJPSA3MiwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCQkudWFydGNsawk9IE9NQVAyNFhYX0JBU0VfQkFVRCAqIDE2LAogCX0sIHsKLQkJLm1lbWJhc2UJPSAoY2hhciAqKUlPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQyX0JBU0UsCisJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhPTUFQX1VBUlQyX0JBU0UpLAorCQkubWFwYmFzZQk9IE9NQVBfVUFSVDJfQkFTRSwKIAkJLmlycQkJPSA3MywKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCQkudWFydGNsawk9IE9NQVAyNFhYX0JBU0VfQkFVRCAqIDE2LAogCX0sIHsKLQkJLm1lbWJhc2UJPSAoY2hhciAqKUlPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQzX0JBU0UsCisJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhPTUFQX1VBUlQzX0JBU0UpLAorCQkubWFwYmFzZQk9IE9NQVBfVUFSVDNfQkFTRSwKIAkJLmlycQkJPSA3NCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkuaW90eXBlCQk9IFVQSU9fTUVNLAogCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9IE9NQVAxNlhYX0JBU0VfQkFVRCAqIDE2LAorCQkudWFydGNsawk9IE9NQVAyNFhYX0JBU0VfQkFVRCAqIDE2LAogCX0sIHsKIAkJLmZsYWdzCQk9IDAKIAl9CkBAIC03MSw3ICs2Niw3IEBACiAJCQkJICAgIGludCB2YWx1ZSkKIHsKIAlvZmZzZXQgPDw9IHAtPnJlZ3NoaWZ0OwotCV9fcmF3X3dyaXRlYih2YWx1ZSwgKHVuc2lnbmVkIGxvbmcpKHAtPm1lbWJhc2UgKyBvZmZzZXQpKTsKKwlfX3Jhd193cml0ZWIodmFsdWUsIHAtPm1lbWJhc2UgKyBvZmZzZXQpOwogfQogCiAvKgpAQCAtODcsMTAgKzgyLDI3IEBACiAJc2VyaWFsX3dyaXRlX3JlZyhwLCBVQVJUX09NQVBfU1lTQywgKDB4MDIgPDwgMykgfCAoMSA8PCAyKSB8ICgxIDw8IDApKTsKIH0KIAotdm9pZCBfX2luaXQgb21hcF9zZXJpYWxfaW5pdCgpCit2b2lkIG9tYXBfc2VyaWFsX2VuYWJsZV9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9NQVhfTlJfUE9SVFM7IGkrKykgeworCQlpZiAodWFydF9pY2tbaV0gJiYgdWFydF9mY2tbaV0pIHsKKwkJCWlmIChlbmFibGUpIHsKKwkJCQljbGtfZW5hYmxlKHVhcnRfaWNrW2ldKTsKKwkJCQljbGtfZW5hYmxlKHVhcnRfZmNrW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xrX2Rpc2FibGUodWFydF9pY2tbaV0pOworCQkJCWNsa19kaXNhYmxlKHVhcnRfZmNrW2ldKTsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBfX2luaXQgb21hcF9zZXJpYWxfaW5pdCh2b2lkKQogewogCWludCBpOwogCWNvbnN0IHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnICppbmZvOworCWNoYXIgbmFtZVsxNl07CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgc2VyaWFsIHBvcnRzIGFyZSBtdXhlZCBvbiBhdCB0aGlzIHBvaW50LgpAQCAtOTgsOCArMTEwLDcgQEAKIAkgKiBpZiBub3QgbmVlZGVkLgogCSAqLwogCi0JaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19VQVJULAotCQkJICAgICAgIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnKTsKKwlpbmZvID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1VBUlQsIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnKTsKIAogCWlmIChpbmZvID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTEwOCw1OCArMTE5LDI2IEBACiAJCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCA9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhICsgaTsKIAogCQlpZiAoIShpbmZvLT5lbmFibGVkX3VhcnRzICYgKDEgPDwgaSkpKSB7Ci0JCQlwLT5tZW1iYXNlID0gMDsKKwkJCXAtPm1lbWJhc2UgPSBOVUxMOwogCQkJcC0+bWFwYmFzZSA9IDA7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXN3aXRjaCAoaSkgewotCQljYXNlIDA6Ci0JCQl1YXJ0MV9pY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0MV9pY2siKTsKLQkJCWlmIChJU19FUlIodWFydDFfaWNrKSkKLQkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDFfaWNrXG4iKTsKLQkJCWVsc2UgewotCQkJCWNsa19lbmFibGUodWFydDFfaWNrKTsKLQkJCX0KKwkJc3ByaW50ZihuYW1lLCAidWFydCVkX2ljayIsIGkrMSk7CisJCXVhcnRfaWNrW2ldID0gY2xrX2dldChOVUxMLCBuYW1lKTsKKwkJaWYgKElTX0VSUih1YXJ0X2lja1tpXSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGdldCB1YXJ0JWRfaWNrXG4iLCBpKzEpOworCQkJdWFydF9pY2tbaV0gPSBOVUxMOworCQl9IGVsc2UKKwkJCWNsa19lbmFibGUodWFydF9pY2tbaV0pOwogCi0JCQl1YXJ0MV9mY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0MV9mY2siKTsKLQkJCWlmIChJU19FUlIodWFydDFfZmNrKSkKLQkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDFfZmNrXG4iKTsKLQkJCWVsc2UgewotCQkJCWNsa19lbmFibGUodWFydDFfZmNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl1YXJ0Ml9pY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0Ml9pY2siKTsKLQkJCWlmIChJU19FUlIodWFydDJfaWNrKSkKLQkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDJfaWNrXG4iKTsKLQkJCWVsc2UgewotCQkJCWNsa19lbmFibGUodWFydDJfaWNrKTsKLQkJCX0KLQotCQkJdWFydDJfZmNrID0gY2xrX2dldChOVUxMLCAidWFydDJfZmNrIik7Ci0JCQlpZiAoSVNfRVJSKHVhcnQyX2ZjaykpCi0JCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQyX2Zja1xuIik7Ci0JCQllbHNlIHsKLQkJCQljbGtfZW5hYmxlKHVhcnQyX2Zjayk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdWFydDNfaWNrID0gY2xrX2dldChOVUxMLCAidWFydDNfaWNrIik7Ci0JCQlpZiAoSVNfRVJSKHVhcnQzX2ljaykpCi0JCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQzX2lja1xuIik7Ci0JCQllbHNlIHsKLQkJCQljbGtfZW5hYmxlKHVhcnQzX2ljayk7Ci0JCQl9Ci0KLQkJCXVhcnQzX2ZjayA9IGNsa19nZXQoTlVMTCwgInVhcnQzX2ZjayIpOwotCQkJaWYgKElTX0VSUih1YXJ0M19mY2spKQotCQkJCXByaW50aygiQ291bGQgbm90IGdldCB1YXJ0M19mY2tcbiIpOwotCQkJZWxzZSB7Ci0JCQkJY2xrX2VuYWJsZSh1YXJ0M19mY2spOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KKwkJc3ByaW50ZihuYW1lLCAidWFydCVkX2ZjayIsIGkrMSk7CisJCXVhcnRfZmNrW2ldID0gY2xrX2dldChOVUxMLCBuYW1lKTsKKwkJaWYgKElTX0VSUih1YXJ0X2Zja1tpXSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGdldCB1YXJ0JWRfZmNrXG4iLCBpKzEpOworCQkJdWFydF9mY2tbaV0gPSBOVUxMOworCQl9IGVsc2UKKwkJCWNsa19lbmFibGUodWFydF9mY2tbaV0pOwogCiAJCW9tYXBfc2VyaWFsX3Jlc2V0KHApOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhNzA2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAuUwotICoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNAotICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgotICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxtYWNoL2lvLmg+Ci0jaW5jbHVkZSA8bWFjaC9wbS5oPgotCi0jaW5jbHVkZSAic2RyYy5oIgotCi0vKiBGaXJzdCBhZGRyZXNzIG9mIHJlc2VydmVkIGFkZHJlc3Mgc3BhY2U/ICBhcHBhcmVudGx5IHZhbGlkIGZvciBPTUFQMiAmIDMgKi8KLSNkZWZpbmUgQV9TRFJDMF9WCQkoMHhDMDAwMDAwMCkKLQotCS50ZXh0Ci0KLS8qCi0gKiBGb3JjZXMgT01BUCBpbnRvIGlkbGUgc3RhdGUKLSAqCi0gKiBvbWFwMjR4eF9pZGxlX2xvb3Bfc3VzcGVuZCgpIC0gVGhpcyBiaXQgb2YgY29kZSBqdXN0IGV4ZWN1dGVzIHRoZSBXRkkKLSAqIGZvciBub3JtYWwgaWRsZXMuCi0gKgotICogTm90ZTogVGhpcyBjb2RlIGdldCdzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QuIFdoZW4gdGhlIE9NQVAKLSAqCSB3YWtlcyB1cCBpdCBjb250aW51ZXMgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCBpdCB3ZW50IHRvIHNsZWVwLgotICovCi1FTlRSWShvbWFwMjR4eF9pZGxlX2xvb3Bfc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyMCwgbHJ9CQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JbW92CXIwLCAjMAkJCUAgY2xlYXIgZm9yIG1jciBzZXR1cAotCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJQCB3YWl0IGZvciBpbnRlcnJ1cHQKLQlsZG1mZAlzcCEsIHtyMCwgcGN9CQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0KLUVOVFJZKG9tYXAyNHh4X2lkbGVfbG9vcF9zdXNwZW5kX3N6KQotCS53b3JkCS4gLSBvbWFwMjR4eF9pZGxlX2xvb3Bfc3VzcGVuZAotCi0vKgotICogb21hcDI0MnhfY3B1X3N1c3BlbmQoKSAtIEZvcmNlcyBPTUFQIGludG8gZGVlcCBzbGVlcCBzdGF0ZSBieSBjb21wbGV0aW5nCi0gKiBTRFJDIHNodXRkb3duIHRoZW4gQVJNIHNodXRkb3duLiAgVXBvbiB3YWtlIE1QVSBpcyBiYWNrIG9uIHNvIGp1c3QgcmVzdG9yZQotICogU0RSQy4KLSAqCi0gKiBJbnB1dDoKLSAqIFIwIDoJRExMIGN0cmwgdmFsdWUgcHJlLVNsZWVwCi0gKiBSMSA6IFByb2Nlc3NvcitSZXZpc2lvbgotICoJMjQyMDogMHgyMSA9IDI0MnhFUzEsIDB4MjYgPSAyNDJ4RVMyLjIKLSAqCTI0MzA6IDB4MzEgPSAyNDMwRVMxLCAweDMyID0gMjQzMEVTMgotICoKLSAqIFRoZSBpZiB0aGUgRFBMTCBpcyBnb2luZyB0byBBdXRvSWRsZS4gSXQgc2VlbXMgbGlrZSB0aGUgRFBMTCBtYXkgYmUgYmFjayBvbgotICogd2hlbiB3ZSBnZXQgY2FsbGVkLCBidXQgdGhlIERMTCBwcm9iYWJseSBpc24ndC4gIFdlIHdpbGwgd2FpdCBhIGJpdCBtb3JlIGluCi0gKiBjYXNlIHRoZSBEUExMIGlzbid0IHF1aXRlIHRoZXJlIHlldC4gVGhlIGNvZGUgd2lsbCB3YWl0IG9uIERMTCBmb3IgRERSIGV2ZW4KLSAqIGlmIGluIHVubG9ja2VkIG1vZGUuCi0gKgotICogRm9yIGxlc3MgdGhhbiAyNDJ4LUVTMi4yIHVwb24gd2FrZSBmcm9tIGEgc2xlZXAgbW9kZSB3aGVyZSB0aGUgZXh0ZXJuYWwKLSAqIG9zY2lsbGF0b3Igd2FzIHN0b3BwZWQsIGEgdGltaW5nIGJ1ZyBleGlzdHMgd2hlcmUgYSBub24tc3RhYmlsaXplZCAxMk1IegotICogY2xvY2sgY2FuIHBhc3MgaW50byB0aGUgUFJDTSBjYW4gY2F1c2UgcHJvYmxlbXMgYXQgRFNQIGFuZCBJVkEuCi0gKiBUbyB3b3JrIGFyb3VuZCB0aGlzIHRoZSBjb2RlIHdpbGwgc3dpdGNoIHRvIHRoZSAzMmtIeiBzb3VyY2UgcHJpb3IgdG8gc2xlZXAuCi0gKiBQb3N0IHNsZWVwIHdlIHdpbGwgc2hpZnQgYmFjayB0byB1c2luZyB0aGUgRFBMTC4gIEFwcGFyZW50bHksCi0gKiBDTV9JRExFU1RfQ0xLR0VOIGRvZXMgbm90IHJlZmxlY3QgdGhlIGZ1bGwgY2xvY2sgY2hhbmdlIHNvIHlvdSBuZWVkIHRvIHdhaXQKLSAqIDN4MTJNSHogKyAzeDMya0h6IGNsb2NrcyBmb3IgYSBmdWxsIHN3aXRjaC4KLSAqCi0gKiBUaGUgRExMIGxvYWQgdmFsdWUgaXMgbm90IGtlcHQgaW4gUkVURU5USU9OIG9yIE9GRi4JSXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQKLSAqIGF0IHdha2UKLSAqLwotRU5UUlkob21hcDI0eHhfY3B1X3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JbW92CXIzLCAjMHgwCQlAIGNsZWFyIGZvciBtcmMgY2FsbAotCW1jcglwMTUsIDAsIHIzLCBjNywgYzEwLCA0CUAgbWVtb3J5IGJhcnJpZXIsIGhvcGUgU0RSL0REUiBmaW5pc2hlZAotCW5vcAotCW5vcAotCWxkcglyMywgQV9TRFJDX1BPV0VSCUAgYWRkciBvZiBzZHJjIHBvd2VyCi0JbGRyCXI0LCBbcjNdCQlAIHZhbHVlIG9mIHNkcmMgcG93ZXIKLQlvcnIJcjQsIHI0LCAjMHg0MAkJQCBlbmFibGUgc2VsZiByZWZyZXNoIG9uIGlkbGUgcmVxCi0JbW92CXI1LCAjMHgyMDAwCQlAIHNldCBkZWxheSAoRFBMTCByZWxvY2sgKyBETEwgcmVsb2NrKQotCXN0cglyNCwgW3IzXQkJQCBtYWtlIGl0IHNvCi0JbW92CXIyLCAjMAotCW5vcAotCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJQCB3YWl0IGZvciBpbnRlcnJ1cHQKLQlub3AKLWxvb3A6Ci0Jc3VicwlyNSwgcjUsICMweDEJCUAgYXdha2UsIHdhaXQganVzdCBhIGJpdAotCWJuZQlsb29wCi0KLQkvKiBUaGUgRFBMTCBoYXMgb24gYmVmb3JlIHdlIHRha2UgdGhlIEREUiBvdXQgb2Ygc2VsZiByZWZyZXNoICovCi0JYmljCXI0LCByNCwgIzB4NDAJCUAgbm93IGNsZWFyIHNlbGYgcmVmcmVzaCBiaXQuCi0Jc3RyCXI0LCBbcjNdCQlAIHB1dCB2bGF1ZSBiYWNrLgotCWxkcglyNCwgQV9TRFJDMAkJQCBtYWtlIGEgY2xvY2sgaGFwcGVuCi0JbGRyCXI0LCBbcjRdCi0Jbm9wCQkJCUAgc3RhcnQgYXV0byByZWZyZXNoIG9ubHkgYWZ0ZXIgY2xrIG9rCi0JbW92cwlyMCwgcjAJCQlAIHNlZSBpZiBERFIgb3IgU0RSCi0JbGRybmUJcjEsIEFfU0RSQ19ETExBX0NUUkxfUwlAIGdldCBhZGRyIG9mIERMTCBjdHJsCi0Jc3RybmUJcjAsIFtyMV0JCUAgcmV3cml0ZSBETExBIHRvIGZvcmNlIERMTCByZWxvYWQKLQlhZGRuZQlyMSwgcjEsICMweDgJCUAgbW92ZSB0byBETExCCi0Jc3RybmUJcjAsIFtyMV0JCUAgcmV3cml0ZSBETExCIHRvIGZvcmNlIERMTCByZWxvYWQKLQotCW1vdglyNSwgIzB4MTAwMAotbG9vcDI6Ci0Jc3VicwlyNSwgcjUsICMweDEKLQlibmUJbG9vcDIKLQkvKiByZXN1bWUqLwotCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgotCi1BX1NEUkNfUE9XRVI6Ci0JLndvcmQgT01BUDI0MlhfU0RSQ19SRUdBRERSKFNEUkNfUE9XRVIpCi1BX1NEUkMwOgotCS53b3JkIEFfU0RSQzBfVgotQV9TRFJDX0RMTEFfQ1RSTF9TOgotCS53b3JkIE9NQVAyNDJYX1NEUkNfUkVHQUREUihTRFJDX0RMTEFfQ1RSTCkKLQotRU5UUlkob21hcDI0eHhfY3B1X3N1c3BlbmRfc3opCi0JLndvcmQJLiAtIG9tYXAyNHh4X2NwdV9zdXNwZW5kCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2xlZXAyNHh4LlMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwMjR4eC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzM2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NsZWVwMjR4eC5TCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbGVlcC5TCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDA2IE5va2lhIENvcnBvcmF0aW9uCisgKiBGaXhlZCBpZGxlIGxvb3Agc2xlZXAKKyAqIElnb3IgU3RvcHBhIDxpZ29yLnN0b3BwYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPG1hY2gvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3BtLmg+CisKKyNpbmNsdWRlIDxtYWNoL29tYXAyNHh4Lmg+CisKKyNpbmNsdWRlICJzZHJjLmgiCisKKy8qIEZpcnN0IGFkZHJlc3Mgb2YgcmVzZXJ2ZWQgYWRkcmVzcyBzcGFjZT8gIGFwcGFyZW50bHkgdmFsaWQgZm9yIE9NQVAyICYgMyAqLworI2RlZmluZSBBX1NEUkMwX1YJCSgweEMwMDAwMDAwKQorCisJLnRleHQKKworLyoKKyAqIEZvcmNlcyBPTUFQIGludG8gaWRsZSBzdGF0ZQorICoKKyAqIG9tYXAyNHh4X2lkbGVfbG9vcF9zdXNwZW5kKCkgLSBUaGlzIGJpdCBvZiBjb2RlIGp1c3QgZXhlY3V0ZXMgdGhlIFdGSQorICogZm9yIG5vcm1hbCBpZGxlcy4KKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgZ2V0J3MgY29waWVkIHRvIGludGVybmFsIFNSQU0gYXQgYm9vdC4gV2hlbiB0aGUgT01BUAorICoJIHdha2VzIHVwIGl0IGNvbnRpbnVlcyBleGVjdXRpb24gYXQgdGhlIHBvaW50IGl0IHdlbnQgdG8gc2xlZXAuCisgKi8KK0VOVFJZKG9tYXAyNHh4X2lkbGVfbG9vcF9zdXNwZW5kKQorCXN0bWZkCXNwISwge3IwLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKwltb3YJcjAsICMwCQkJQCBjbGVhciBmb3IgbWNyIHNldHVwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNAlAIHdhaXQgZm9yIGludGVycnVwdAorCWxkbWZkCXNwISwge3IwLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KKworRU5UUlkob21hcDI0eHhfaWRsZV9sb29wX3N1c3BlbmRfc3opCisJLndvcmQJLiAtIG9tYXAyNHh4X2lkbGVfbG9vcF9zdXNwZW5kCisKKy8qCisgKiBvbWFwMjR4eF9jcHVfc3VzcGVuZCgpIC0gRm9yY2VzIE9NQVAgaW50byBkZWVwIHNsZWVwIHN0YXRlIGJ5IGNvbXBsZXRpbmcKKyAqIFNEUkMgc2h1dGRvd24gdGhlbiBBUk0gc2h1dGRvd24uICBVcG9uIHdha2UgTVBVIGlzIGJhY2sgb24gc28ganVzdCByZXN0b3JlCisgKiBTRFJDLgorICoKKyAqIElucHV0OgorICogUjAgOglETEwgY3RybCB2YWx1ZSBwcmUtU2xlZXAKKyAqIFIxIDogU0RSQ19ETExBX0NUUkwKKyAqIFIyIDogU0RSQ19QT1dFUgorICoKKyAqIFRoZSBpZiB0aGUgRFBMTCBpcyBnb2luZyB0byBBdXRvSWRsZS4gSXQgc2VlbXMgbGlrZSB0aGUgRFBMTCBtYXkgYmUgYmFjayBvbgorICogd2hlbiB3ZSBnZXQgY2FsbGVkLCBidXQgdGhlIERMTCBwcm9iYWJseSBpc24ndC4gIFdlIHdpbGwgd2FpdCBhIGJpdCBtb3JlIGluCisgKiBjYXNlIHRoZSBEUExMIGlzbid0IHF1aXRlIHRoZXJlIHlldC4gVGhlIGNvZGUgd2lsbCB3YWl0IG9uIERMTCBmb3IgRERSIGV2ZW4KKyAqIGlmIGluIHVubG9ja2VkIG1vZGUuCisgKgorICogRm9yIGxlc3MgdGhhbiAyNDJ4LUVTMi4yIHVwb24gd2FrZSBmcm9tIGEgc2xlZXAgbW9kZSB3aGVyZSB0aGUgZXh0ZXJuYWwKKyAqIG9zY2lsbGF0b3Igd2FzIHN0b3BwZWQsIGEgdGltaW5nIGJ1ZyBleGlzdHMgd2hlcmUgYSBub24tc3RhYmlsaXplZCAxMk1IegorICogY2xvY2sgY2FuIHBhc3MgaW50byB0aGUgUFJDTSBjYW4gY2F1c2UgcHJvYmxlbXMgYXQgRFNQIGFuZCBJVkEuCisgKiBUbyB3b3JrIGFyb3VuZCB0aGlzIHRoZSBjb2RlIHdpbGwgc3dpdGNoIHRvIHRoZSAzMmtIeiBzb3VyY2UgcHJpb3IgdG8gc2xlZXAuCisgKiBQb3N0IHNsZWVwIHdlIHdpbGwgc2hpZnQgYmFjayB0byB1c2luZyB0aGUgRFBMTC4gIEFwcGFyZW50bHksCisgKiBDTV9JRExFU1RfQ0xLR0VOIGRvZXMgbm90IHJlZmxlY3QgdGhlIGZ1bGwgY2xvY2sgY2hhbmdlIHNvIHlvdSBuZWVkIHRvIHdhaXQKKyAqIDN4MTJNSHogKyAzeDMya0h6IGNsb2NrcyBmb3IgYSBmdWxsIHN3aXRjaC4KKyAqCisgKiBUaGUgRExMIGxvYWQgdmFsdWUgaXMgbm90IGtlcHQgaW4gUkVURU5USU9OIG9yIE9GRi4JSXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQKKyAqIGF0IHdha2UKKyAqLworRU5UUlkob21hcDI0eHhfY3B1X3N1c3BlbmQpCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisJbW92CXIzLCAjMHgwCQlAIGNsZWFyIGZvciBtY3IgY2FsbAorCW1jcglwMTUsIDAsIHIzLCBjNywgYzEwLCA0CUAgbWVtb3J5IGJhcnJpZXIsIGhvcGUgU0RSL0REUiBmaW5pc2hlZAorCW5vcAorCW5vcAorCWxkcglyNCwgW3IyXQkJQCByZWFkIFNEUkNfUE9XRVIKKwlvcnIJcjQsIHI0LCAjMHg0MAkJQCBlbmFibGUgc2VsZiByZWZyZXNoIG9uIGlkbGUgcmVxCisJbW92CXI1LCAjMHgyMDAwCQlAIHNldCBkZWxheSAoRFBMTCByZWxvY2sgKyBETEwgcmVsb2NrKQorCXN0cglyNCwgW3IyXQkJQCBtYWtlIGl0IHNvCisJbW92CXIyLCAjMAorCW5vcAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJQCB3YWl0IGZvciBpbnRlcnJ1cHQKKwlub3AKK2xvb3A6CisJc3VicwlyNSwgcjUsICMweDEJCUAgYXdha2UsIHdhaXQganVzdCBhIGJpdAorCWJuZQlsb29wCisKKwkvKiBUaGUgRFBMTCBoYXMgdG8gYmUgb24gYmVmb3JlIHdlIHRha2UgdGhlIEREUiBvdXQgb2Ygc2VsZiByZWZyZXNoICovCisJYmljCXI0LCByNCwgIzB4NDAJCUAgbm93IGNsZWFyIHNlbGYgcmVmcmVzaCBiaXQuCisJc3RyCXI0LCBbcjJdCQlAIHdyaXRlIHRvIFNEUkNfUE9XRVIKKwlsZHIJcjQsIEFfU0RSQzAJCUAgbWFrZSBhIGNsb2NrIGhhcHBlbgorCWxkcglyNCwgW3I0XQkJQCByZWFkIEFfU0RSQzAKKwlub3AJCQkJQCBzdGFydCBhdXRvIHJlZnJlc2ggb25seSBhZnRlciBjbGsgb2sKKwltb3ZzCXIwLCByMAkJCUAgc2VlIGlmIEREUiBvciBTRFIKKwlzdHJuZQlyMCwgW3IxXQkJQCByZXdyaXRlIERMTEEgdG8gZm9yY2UgRExMIHJlbG9hZAorCWFkZG5lCXIxLCByMSwgIzB4OAkJQCBtb3ZlIHRvIERMTEIKKwlzdHJuZQlyMCwgW3IxXQkJQCByZXdyaXRlIERMTEIgdG8gZm9yY2UgRExMIHJlbG9hZAorCisJbW92CXI1LCAjMHgxMDAwCitsb29wMjoKKwlzdWJzCXI1LCByNSwgIzB4MQorCWJuZQlsb29wMgorCS8qIHJlc3VtZSovCisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisKK0FfU0RSQzA6CisJLndvcmQgQV9TRFJDMF9WCisKK0VOVFJZKG9tYXAyNHh4X2NwdV9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMjR4eF9jcHVfc3VzcGVuZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcmFtMzR4eC5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcmFtMzR4eC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzE0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NyYW0zNHh4LlMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAzL3NyYW0uUworICoKKyAqIE9tYXAzIHNwZWNpZmljIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcnVuIGluIGludGVybmFsIFNSQU0KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqIFJhamVuZHJhIE5heWFrIDxybmF5YWtAdGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisKKyNpbmNsdWRlICJzZHJjLmgiCisjaW5jbHVkZSAiY20uaCIKKworCS50ZXh0CisKKy8qCisgKiBDaGFuZ2UgZnJlcXVlbmN5IG9mIGNvcmUgZHBsbAorICogcjAgPSBzZHJjX3Jmcl9jdHJsIHIxID0gc2RyY19hY3RpbV9jdHJsYSByMiA9IHNkcmNfYWN0aW1fY3RybGIgcjMgPSBNMgorICovCitFTlRSWShvbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwpCisJc3RtZmQJc3AhLCB7cjEtcjEyLCBscn0JQCBzdG9yZSByZWdzIHRvIHN0YWNrCisJY21wCXIzLCAjMHgyCisJYmxuZQljb25maWd1cmVfc2RyYworCWNtcAlyMywgIzB4MgorCWJsbmUJbG9ja19kbGwKKwljbXAJcjMsICMweDEKKwlibG5lCXVubG9ja19kbGwKKwlibAlzZHJhbV9pbl9zZWxmcmVmcmVzaAlAIHB1dCB0aGUgU0RSQU0gaW4gc2VsZiByZWZyZXNoCisJYmwgCWNvbmZpZ3VyZV9jb3JlX2RwbGwKKwlibAllbmFibGVfc2RyYworCWNtcAlyMywgIzB4MQorCWJsbmUJd2FpdF9kbGxfdW5sb2NrCisJY21wCXIzLCAjMHgyCisJYmxuZQl3YWl0X2RsbF9sb2NrCisJY21wCXIzLCAjMHgxCisJYmxuZQljb25maWd1cmVfc2RyYworCW1vdiAJcjAsICMwIAkJCUAgcmV0dXJuIHZhbHVlCisJbGRtZmQJc3AhLCB7cjEtcjEyLCBwY30JQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgordW5sb2NrX2RsbDoKKwlsZHIJcjQsIG9tYXAzX3NkcmNfZGxsYV9jdHJsCisJbGRyCXI1LCBbcjRdCisJb3JyCXI1LCByNSwgIzB4NAorCXN0cglyNSwgW3I0XQorCWJ4CWxyCitsb2NrX2RsbDoKKwlsZHIJcjQsIG9tYXAzX3NkcmNfZGxsYV9jdHJsCisJbGRyCXI1LCBbcjRdCisJYmljCXI1LCByNSwgIzB4NAorCXN0cglyNSwgW3I0XQorCWJ4CWxyCitzZHJhbV9pbl9zZWxmcmVmcmVzaDoKKwltb3YJcjUsICMweDAJCUAgTW92ZSAwIHRvIFI1CisJbWNyCXAxNSwgMCwgcjUsIGM3LCBjMTAsIDUJQCBtZW1vcnkgYmFycmllcgorCWxkcglyNCwgb21hcDNfc2RyY19wb3dlcglAIHJlYWQgdGhlIFNEUkNfUE9XRVIgcmVnaXN0ZXIKKwlsZHIJcjUsIFtyNF0JCUAgcmVhZCB0aGUgY29udGVudHMgb2YgU0RSQ19QT1dFUgorCW9yciAJcjUsIHI1LCAjMHg0MAkJQCBlbmFibGUgc2VsZiByZWZyZXNoIG9uIGlkbGUgcmVxCisJc3RyIAlyNSwgW3I0XQkJQCB3cml0ZSBiYWNrIHRvIFNEUkNfUE9XRVIgcmVnaXN0ZXIKKwlsZHIJcjQsIG9tYXAzX2NtX2ljbGtlbjFfY29yZQlAIHJlYWQgdGhlIENNX0lDTEtFTjFfQ09SRSByZWcKKwlsZHIJcjUsIFtyNF0KKwliaWMJcjUsIHI1LCAjMHgyCQlAIGRpc2FibGUgaWNsayBiaXQgZm9yIFNSREMKKwlzdHIgCXI1LCBbcjRdCit3YWl0X3NkcmNfaWRsZToKKwlsZHIgCXI0LCBvbWFwM19jbV9pZGxlc3QxX2NvcmUKKwlsZHIgCXI1LCBbcjRdCisJYW5kIAlyNSwgcjUsICMweDIJCUAgY2hlY2sgZm9yIFNEUkMgaWRsZQorCWNtcCAJcjUsICMyCisJYm5lIAl3YWl0X3NkcmNfaWRsZQorCWJ4IAlscgorY29uZmlndXJlX2NvcmVfZHBsbDoKKwlsZHIgCXI0LCBvbWFwM19jbV9jbGtzZWwxX3BsbAorCWxkcglyNSwgW3I0XQorCWxkcglyNiwgY29yZV9tMl9tYXNrX3ZhbAlAIG1vZGlmeSBtMiBmb3IgY29yZSBkcGxsCisJYW5kCXI1LCByNSwgcjYKKwlvcnIJcjUsIHI1LCByMywgbHNsICMweDFCCUAgcjMgY29udGFpbnMgdGhlIE0yIHZhbAorCXN0cglyNSwgW3I0XQorCW1vdiAJcjUsICMweDgwMAkJQCB3YWl0IGZvciB0aGUgY2xvY2sgdG8gc3RhYmlsaXNlCisJY21wCXIzLCAjMgorCWJuZQl3YWl0X2Nsa19zdGFibGUKKwlieAlscgord2FpdF9jbGtfc3RhYmxlOgorCXN1YnMgCXI1LCByNSwgIzEKKwlibmUJd2FpdF9jbGtfc3RhYmxlCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJYngJbHIKK2VuYWJsZV9zZHJjOgorCWxkciAJcjQsIG9tYXAzX2NtX2ljbGtlbjFfY29yZQorCWxkcglyNSwgW3I0XQorCW9yciAJcjUsIHI1LCAjMHgyCQlAIGVuYWJsZSBpY2xrIGJpdCBmb3IgU0RSQworCXN0ciAJcjUsIFtyNF0KK3dhaXRfc2RyY19pZGxlMToKKwlsZHIgCXI0LCBvbWFwM19jbV9pZGxlc3QxX2NvcmUKKwlsZHIJcjUsIFtyNF0KKwlhbmQgCXI1LCByNSwgIzB4MgorCWNtcAlyNSwgIzAKKwlibmUJd2FpdF9zZHJjX2lkbGUxCisJbGRyCXI0LCBvbWFwM19zZHJjX3Bvd2VyCisJbGRyCXI1LCBbcjRdCisJYmljIAlyNSwgcjUsICMweDQwCisJc3RyIAlyNSwgW3I0XQorCWJ4CWxyCit3YWl0X2RsbF9sb2NrOgorCWxkcglyNCwgb21hcDNfc2RyY19kbGxhX3N0YXR1cworCWxkcglyNSwgW3I0XQorCWFuZCAJcjUsIHI1LCAjMHg0CisJY21wCXI1LCAjMHg0CisJYm5lCXdhaXRfZGxsX2xvY2sKKwlieAlscgord2FpdF9kbGxfdW5sb2NrOgorCWxkcglyNCwgb21hcDNfc2RyY19kbGxhX3N0YXR1cworCWxkcglyNSwgW3I0XQorCWFuZAlyNSwgcjUsICMweDQKKwljbXAJcjUsICMweDAKKwlibmUJd2FpdF9kbGxfdW5sb2NrCisJYngJbHIKK2NvbmZpZ3VyZV9zZHJjOgorCWxkcglyNCwgb21hcDNfc2RyY19yZnJfY3RybAorCXN0cglyMCwgW3I0XQorCWxkcglyNCwgb21hcDNfc2RyY19hY3RpbV9jdHJsYQorCXN0cglyMSwgW3I0XQorCWxkcglyNCwgb21hcDNfc2RyY19hY3RpbV9jdHJsYgorCXN0cglyMiwgW3I0XQorCWJ4CWxyCisKK29tYXAzX3NkcmNfcG93ZXI6CisJLndvcmQgT01BUDM0WFhfU0RSQ19SRUdBRERSKFNEUkNfUE9XRVIpCitvbWFwM19jbV9jbGtzZWwxX3BsbDoKKwkud29yZCBPTUFQMzRYWF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS1NFTDEpCitvbWFwM19jbV9pZGxlc3QxX2NvcmU6CisJLndvcmQgT01BUDM0WFhfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSURMRVNUKQorb21hcDNfY21faWNsa2VuMV9jb3JlOgorCS53b3JkIE9NQVAzNFhYX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpCitvbWFwM19zZHJjX3Jmcl9jdHJsOgorCS53b3JkIE9NQVAzNFhYX1NEUkNfUkVHQUREUihTRFJDX1JGUl9DVFJMXzApCitvbWFwM19zZHJjX2FjdGltX2N0cmxhOgorCS53b3JkIE9NQVAzNFhYX1NEUkNfUkVHQUREUihTRFJDX0FDVElNX0NUUkxfQV8wKQorb21hcDNfc2RyY19hY3RpbV9jdHJsYjoKKwkud29yZCBPTUFQMzRYWF9TRFJDX1JFR0FERFIoU0RSQ19BQ1RJTV9DVFJMX0JfMCkKK29tYXAzX3NkcmNfZGxsYV9zdGF0dXM6CisJLndvcmQgT01BUDM0WFhfU0RSQ19SRUdBRERSKFNEUkNfRExMQV9TVEFUVVMpCitvbWFwM19zZHJjX2RsbGFfY3RybDoKKwkud29yZCBPTUFQMzRYWF9TRFJDX1JFR0FERFIoU0RSQ19ETExBX0NUUkwpCitjb3JlX20yX21hc2tfdmFsOgorCS53b3JkIDB4MDdGRkZGRkYKKworRU5UUlkob21hcDNfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsX3N6KQorCS53b3JkCS4gLSBvbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L0tjb25maWcKaW5kZXggZGRjZDQxYi4uZjU5YThkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L0tjb25maWcKQEAgLTM2LDYgKzM2LDEyIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIFFOQVAgVFMtMTA5L1RTLTIwOSBwbGF0Zm9ybS4KIAorY29uZmlnIE1BQ0hfVEVSQVNUQVRJT05fUFJPMgorCWJvb2wgIkJ1ZmZhbG8gVGVyYXN0YXRpb24gUHJvIElJL0xpdmUiCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBCdWZmYWxvIFRlcmFzdGF0aW9uIFBybyBJSS9MaXZlIHBsYXRmb3JtLgorCiBjb25maWcgTUFDSF9MSU5LU1RBVElPTl9QUk8KIAlib29sICJCdWZmYWxvIExpbmtzdGF0aW9uIFByby9MaXZlIgogCXNlbGVjdCBJMkNfQk9BUkRJTkZPCkBAIC00NCw2ICs1MCwxMyBAQAogCSAgQnVmZmFsbyBMaW5rc3RhdGlvbiBQcm8vTGl2ZSBwbGF0Zm9ybS4gQm90aCB2MSBhbmQKIAkgIHYyIGRldmljZXMgYXJlIHN1cHBvcnRlZC4KIAorY29uZmlnIE1BQ0hfTElOS1NUQVRJT05fTUlOSQorCWJvb2wgIkJ1ZmZhbG8gTGlua3N0YXRpb24gTWluaSIKKwlzZWxlY3QgSTJDX0JPQVJESU5GTworCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZQorCSAgQnVmZmFsbyBMaW5rc3RhdGlvbiBNaW5pIHBsYXRmb3JtLgorCiBjb25maWcgTUFDSF9UUzQwOQogCWJvb2wgIlFOQVAgVFMtNDA5IgogCWhlbHAKQEAgLTY4LDYgKzgxLDEzIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIEhQIE1lZGlhIFZhdWx0IG12MjEyMCBvciBtdjUxMDAuCiAKK2NvbmZpZyBNQUNIX0VETUlOSV9WMgorCWJvb2wgIkxhQ2llIEV0aGVybmV0IERpc2sgbWluaSBWMiIKKwlzZWxlY3QgSTJDX0JPQVJESU5GTworCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZQorCSAgTGFDaWUgRXRoZXJuZXQgRGlzayBtaW5pIFYyLgorCiBjb25maWcgTUFDSF9NU1MyCiAJYm9vbCAiTWF4dG9yIFNoYXJlZCBTdG9yYWdlIElJIgogCWhlbHAKQEAgLTkyLDYgKzExMiwxMiBAQAogCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCiAJICBNYXJ2ZWxsIE9yaW9uLVZvSVAgRlhPICg4OEY1MTgxTCkgUkQuCiAKK2NvbmZpZyBNQUNIX1JEODhGNjE4M0FQX0dFCisJYm9vbCAiTWFydmVsbCBPcmlvbi0xLTkwIEFQIEdFIFJlZmVyZW5jZSBEZXNpZ24iCisJaGVscAorCSAgU2F5ICdZJyBoZXJlIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgdGhlCisJICBNYXJ2ZWxsIE9yaW9uLTEtOTAgKDg4RjYxODMpIEFQIEdFIFJELgorCiBlbmRtZW51CiAKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvTWFrZWZpbGUKaW5kZXggZmNjNDhhOC4uM2Q0YTFiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9NYWtlZmlsZQpAQCAtMiwxNCArMiwxOCBAQAogb2JqLSQoQ09ORklHX01BQ0hfREI4OEY1MjgxKQkrPSBkYjg4ZjUyODEtc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfUkQ4OEY1MTgyKQkrPSByZDg4ZjUxODItc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfS1VST0JPWF9QUk8pCSs9IGt1cm9ib3hfcHJvLXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX1RFUkFTVEFUSU9OX1BSTzIpCSs9IHRlcmFzdGF0aW9uX3BybzItc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfTElOS1NUQVRJT05fUFJPKSArPSBrdXJvYm94X3Byby1zZXR1cC5vCitvYmotJChDT05GSUdfTUFDSF9MSU5LU1RBVElPTl9NSU5JKSArPSBsc21pbmktc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfRE5TMzIzKQkrPSBkbnMzMjMtc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfVFMyMDkpCSs9IHRzMjA5LXNldHVwLm8gdHN4MDktY29tbW9uLm8KIG9iai0kKENPTkZJR19NQUNIX1RTNDA5KQkrPSB0czQwOS1zZXR1cC5vIHRzeDA5LWNvbW1vbi5vCiBvYmotJChDT05GSUdfTUFDSF9XUlQzNTBOX1YyKQkrPSB3cnQzNTBuLXYyLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX1RTNzhYWCkJKz0gdHM3OHh4LXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX01WMjEyMCkJKz0gbXYyMTIwLXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX0VETUlOSV9WMikJKz0gZWRtaW5pX3YyLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX01TUzIpCQkrPSBtc3MyLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX1dOUjg1NFQpCSs9IHducjg1NHQtc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfUkQ4OEY1MTgxTF9HRSkJKz0gcmQ4OGY1MTgxbC1nZS1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9SRDg4RjUxODFMX0ZYTykJKz0gcmQ4OGY1MTgxbC1meG8tc2V0dXAubworb2JqLSQoQ09ORklHX01BQ0hfUkQ4OEY2MTgzQVBfR0UpCSs9IHJkODhmNjE4M2FwLWdlLXNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9hZGRyLW1hcC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2FkZHItbWFwLmMKaW5kZXggYmVhMzc5Ny4uNzE5OTU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2FkZHItbWFwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2FkZHItbWFwLmMKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5jCmluZGV4IDdiMTFlNTUuLjk2MjVlZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4X2V0aC5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHhfaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL29yaW9uX3NwaS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CkBAIC0xNDYsNyArMTQ3LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IG12NjQzeHhfZXRoX3NoYXJlZF9wbGF0Zm9ybV9kYXRhIG9yaW9uNXhfZXRoX3NoYXJlZF9kYXRhID0gewogCS5kcmFtCQk9ICZvcmlvbjV4X21idXNfZHJhbV9pbmZvLAotCS50X2NsawkJPSBPUklPTjVYX1RDTEssCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG9yaW9uNXhfZXRoX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKQEAgLTE1NCw2ICsxNTQsMTAgQEAKIAkJLnN0YXJ0CT0gT1JJT041WF9FVEhfUEhZU19CQVNFICsgMHgyMDAwLAogCQkuZW5kCT0gT1JJT041WF9FVEhfUEhZU19CQVNFICsgMHgzZmZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IElSUV9PUklPTjVYX0VUSF9FUlIsCisJCS5lbmQJPSBJUlFfT1JJT041WF9FVEhfRVJSLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIApAQCAtMTYzLDcgKzE2Nyw3IEBACiAJLmRldgkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gJm9yaW9uNXhfZXRoX3NoYXJlZF9kYXRhLAogCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvcmlvbjV4X2V0aF9zaGFyZWRfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBvcmlvbjV4X2V0aF9zaGFyZWRfcmVzb3VyY2VzLAogfTsKIApAQCAtMjY4LDYgKzI3MiwzOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1BJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgb3Jpb25fc3BpX2luZm8gb3Jpb241eF9zcGlfcGxhdF9kYXRhID0geworCS50Y2xrCQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9yaW9uNXhfc3BpX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAic3BpIGJhc2UiLAorCQkuc3RhcnQJPSBTUElfUEhZU19CQVNFLAorCQkuZW5kCT0gU1BJX1BIWVNfQkFTRSArIDB4MWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvcmlvbjV4X3NwaSA9IHsKKwkubmFtZQkJPSAib3Jpb25fc3BpIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmb3Jpb241eF9zcGlfcGxhdF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG9yaW9uNXhfc3BpX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gb3Jpb241eF9zcGlfcmVzb3VyY2VzLAorfTsKKwordm9pZCBfX2luaXQgb3Jpb241eF9zcGlfaW5pdCgpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvcmlvbjV4X3NwaSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBVQVJUMAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IG9yaW9uNXhfdWFydDBfZGF0YVtdID0gewpAQCAtMjc4LDcgKzMxNCw3IEBACiAJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNUIHwgVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT1JJT041WF9UQ0xLLAorCQkudWFydGNsawk9IDAsCiAJfSwgewogCX0sCiB9OwpAQCAtMzIyLDcgKzM1OCw3IEBACiAJCS5mbGFncwkJPSBVUEZfU0tJUF9URVNUIHwgVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT1JJT041WF9UQ0xLLAorCQkudWFydGNsawk9IDAsCiAJfSwgewogCX0sCiB9OwpAQCAtNDU1LDkgKzQ5MSwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaW1lIGhhbmRsaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBvcmlvbjV4X3RjbGs7CisKK2ludCBfX2luaXQgb3Jpb241eF9maW5kX3RjbGsodm9pZCkKK3sKKwl1MzIgZGV2LCByZXY7CisKKwlvcmlvbjV4X3BjaWVfaWQoJmRldiwgJnJldik7CisJaWYgKGRldiA9PSBNVjg4RjYxODNfREVWX0lEICYmCisJICAgIChyZWFkbChNUFBfUkVTRVRfU0FNUExFKSAmIDB4MDAwMDAyMDApID09IDApCisJCXJldHVybiAxMzMzMzMzMzM7CisKKwlyZXR1cm4gMTY2NjY2NjY3OworfQorCiBzdGF0aWMgdm9pZCBvcmlvbjV4X3RpbWVyX2luaXQodm9pZCkKIHsKLQlvcmlvbl90aW1lX2luaXQoSVJRX09SSU9ONVhfQlJJREdFLCBPUklPTjVYX1RDTEspOworCW9yaW9uNXhfdGNsayA9IG9yaW9uNXhfZmluZF90Y2xrKCk7CisJb3Jpb25fdGltZV9pbml0KElSUV9PUklPTjVYX0JSSURHRSwgb3Jpb241eF90Y2xrKTsKIH0KIAogc3RydWN0IHN5c190aW1lciBvcmlvbjV4X3RpbWVyID0gewpAQCAtNDk5LDYgKzU1MCwxMiBAQAogCQl9IGVsc2UgewogCQkJKmRldl9uYW1lID0gIk1WODhGNTE4MShMKS1SZXYtVW5zdXBwb3J0ZWQiOwogCQl9CisJfSBlbHNlIGlmICgqZGV2ID09IE1WODhGNjE4M19ERVZfSUQpIHsKKwkJaWYgKCpyZXYgPT0gTVY4OEY2MTgzX1JFVl9CMCkgeworCQkJKmRldl9uYW1lID0gIk1WODhGNjE4My1SZXYtQjAiOworCQl9IGVsc2UgeworCQkJKmRldl9uYW1lID0gIk1WODhGNjE4My1SZXYtVW5zdXBwb3J0ZWQiOworCQl9CiAJfSBlbHNlIHsKIAkJKmRldl9uYW1lID0gIkRldmljZS1Vbmtub3duIjsKIAl9CkBAIC01MTAsNyArNTY3LDEyIEBACiAJdTMyIGRldiwgcmV2OwogCiAJb3Jpb241eF9pZCgmZGV2LCAmcmV2LCAmZGV2X25hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIk9yaW9uIElEOiAlcy4gVENMSz0lZC5cbiIsIGRldl9uYW1lLCBPUklPTjVYX1RDTEspOworCXByaW50ayhLRVJOX0lORk8gIk9yaW9uIElEOiAlcy4gVENMSz0lZC5cbiIsIGRldl9uYW1lLCBvcmlvbjV4X3RjbGspOworCisJb3Jpb241eF9ldGhfc2hhcmVkX2RhdGEudF9jbGsgPSBvcmlvbjV4X3RjbGs7CisJb3Jpb241eF9zcGlfcGxhdF9kYXRhLnRjbGsgPSBvcmlvbjV4X3RjbGs7CisJb3Jpb241eF91YXJ0MF9kYXRhWzBdLnVhcnRjbGsgPSBvcmlvbjV4X3RjbGs7CisJb3Jpb241eF91YXJ0MV9kYXRhWzBdLnVhcnRjbGsgPSBvcmlvbjV4X3RjbGs7CiAKIAkvKgogCSAqIFNldHVwIE9yaW9uIGFkZHJlc3MgbWFwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmgKaW5kZXggMGJkMTk1NS4uMWY4YjJkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaApAQCAtMTAsNiArMTAsNyBAQAogdm9pZCBvcmlvbjV4X21hcF9pbyh2b2lkKTsKIHZvaWQgb3Jpb241eF9pbml0X2lycSh2b2lkKTsKIHZvaWQgb3Jpb241eF9pbml0KHZvaWQpOworZXh0ZXJuIGludCBvcmlvbjV4X3RjbGs7CiBleHRlcm4gc3RydWN0IHN5c190aW1lciBvcmlvbjV4X3RpbWVyOwogCiAvKgpAQCAtMzAsNiArMzEsNyBAQAogdm9pZCBvcmlvbjV4X2V0aF9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpldGhfZGF0YSk7CiB2b2lkIG9yaW9uNXhfaTJjX2luaXQodm9pZCk7CiB2b2lkIG9yaW9uNXhfc2F0YV9pbml0KHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgKnNhdGFfZGF0YSk7Cit2b2lkIG9yaW9uNXhfc3BpX2luaXQodm9pZCk7CiB2b2lkIG9yaW9uNXhfdWFydDBfaW5pdCh2b2lkKTsKIHZvaWQgb3Jpb241eF91YXJ0MV9pbml0KHZvaWQpOwogdm9pZCBvcmlvbjV4X3hvcl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCmluZGV4IGZmMTNlOTAuLmQzMThiZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKQEAgLTI4NSw3ICsyODUsNyBAQAogICogRXRoZXJuZXQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGRiODhmNTI4MV9ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA4LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKaW5kZXggYjM4YzY1Yy4uM2U2NjA5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwpAQCAtNzksNyArNzksNyBAQAogICovCiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBkbnMzMjNfZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyID0gOCwKKwkucGh5X2FkZHIgPSBNVjY0M1hYX0VUSF9QSFlfQUREUig4KSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZWRtaW5pX3YyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZWRtaW5pX3YyLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0ZWUwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9lZG1pbmlfdjItc2V0dXAuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtb3Jpb241eC9lZG1pbmlfdjItc2V0dXAuYworICoKKyAqIExhQ2llIEV0aGVybmV0IERpc2sgbWluaSBWMiBTZXR1cAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RvcGhlciBNb29yZSA8bW9vcmVAZnJlZS5mcj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbGJlcnQgQXJpYmF1ZCA8YWxiZXJ0LmFyaWJhdWRAZnJlZS5mcj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKy8qCisgKiBUT0RPOiBhZGQgT3Jpb24gVVNCIGRldmljZSBwb3J0IGluaXQgd2hlbiBrZXJuZWwub3JnIHN1cHBvcnQgaXMgYWRkZWQuCisgKiBUT0RPOiBhZGQgZmxhc2ggd3JpdGUgc3VwcG9ydDogc2VlIGJlbG93LgorICogVE9ETzogYWRkIHBvd2VyLW9mZiBzdXBwb3J0LgorICogVE9ETzogYWRkIEkyQyBFRVBST00gc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXY2NDN4eF9ldGguaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAibXBwLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRURNSU5JX1YyIEluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogNTEyS0IgTk9SIGZsYXNoIERldmljZSBidXMgYm9vdCBjaGlwIHNlbGVjdAorICovCisKKyNkZWZpbmUgRURNSU5JX1YyX05PUl9CT09UX0JBU0UJCTB4ZmZmODAwMDAKKyNkZWZpbmUgRURNSU5JX1YyX05PUl9CT09UX1NJWkUJCVNaXzUxMksKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiA1MTJLQiBOT1IgRmxhc2ggb24gQk9PVCBEZXZpY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ3VycmVudGx5IHRoZSBNVEQgY29kZSBkb2VzIG5vdCByZWNvZ25pemUgdGhlIE1YMjlMVjQwMENCQ1QgYXMgYSBib3R0b20KKyAqIC10eXBlIGRldmljZS4gVGhpcyBjb3VsZCBjYXVzZSByaXNrcyBvZiBhY2NpZGVudGFsbHkgZXJhc2luZyBjcml0aWNhbAorICogZmxhc2ggc2VjdG9ycy4gV2UgdGh1cyBkZWZpbmUgYSBzaW5nbGUsIHdyaXRlLXByb3RlY3RlZCBwYXJ0aXRpb24gY292ZXJpbmcKKyAqIHRoZSB3aG9sZSBmbGFzaC4KKyAqIFRPRE86IG9uY2UgdGhlIGZsYXNoIHBhcnQgVE9QL0JPVFRPTSBkZXRlY3Rpb24gaXNzdWUgaXMgc29ydGVkIG91dCBpbiB0aGUgTVRECisgKiBjb2RlLCBicmVhayB0aGlzIGludG8gYXQgbGVhc3QgdGhyZWUgcGFydGl0aW9uczogJ3UtYm9vdCBjb2RlJywgJ3UtYm9vdAorICogZW52aXJvbm1lbnQnIGFuZCAnd2hhdGV2ZXIgaXMgbGVmdCcuCisgKi8KKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGVkbWluaV92Ml9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiRnVsbDUxMmtiIiwKKwkJLnNpemUJCT0gMHgwMDA4MDAwMCwKKwkJLm9mZnNldAkJPSAweDAwMDAwMDAwLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGVkbWluaV92Ml9ub3JfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gMSwKKwkucGFydHMJCT0gZWRtaW5pX3YyX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShlZG1pbmlfdjJfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGVkbWluaV92Ml9ub3JfZmxhc2hfcmVzb3VyY2UgPSB7CisJLmZsYWdzCQkJPSBJT1JFU09VUkNFX01FTSwKKwkuc3RhcnQJCQk9IEVETUlOSV9WMl9OT1JfQk9PVF9CQVNFLAorCS5lbmQJCQk9IEVETUlOSV9WMl9OT1JfQk9PVF9CQVNFCisJCSsgRURNSU5JX1YyX05PUl9CT09UX1NJWkUgLSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWRtaW5pX3YyX25vcl9mbGFzaCA9IHsKKwkubmFtZQkJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZWRtaW5pX3YyX25vcl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJCT0gMSwKKwkucmVzb3VyY2UJCT0gJmVkbWluaV92Ml9ub3JfZmxhc2hfcmVzb3VyY2UsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV0aGVybmV0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGVkbWluaV92Ml9ldGhfZGF0YSA9IHsKKwkucGh5X2FkZHIJPSA4LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSVEMgNUMzNzJhIG9uIEkyQyBidXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVETUlOSVYyX1JUQ19HUElPCTMKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGVkbWluaV92Ml9pMmNfcnRjID0geworCUkyQ19CT0FSRF9JTkZPKCJyczVjMzcyYSIsIDB4MzIpLAorCS5pcnEgPSAwLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTYXRhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgZWRtaW5pX3YyX3NhdGFfZGF0YSA9IHsKKwkubl9wb3J0cwk9IDIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8gTEVEIChzaW1wbGUgLSBkb2Vzbid0IHVzZSBoYXJkd2FyZSBibGlua2luZyBzdXBwb3J0KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRURNSU5JX1YyX0dQSU9fTEVEX1BPV0VSCTE2CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZWRtaW5pX3YyX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lID0gInBvd2VyOmJsdWUiLAorCQkuZ3BpbyA9IEVETUlOSV9WMl9HUElPX0xFRF9QT1dFUiwKKwkJLmFjdGl2ZV9sb3cgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZWRtaW5pX3YyX2xlZF9kYXRhID0geworCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUoZWRtaW5pX3YyX2xlZHMpLAorCS5sZWRzID0gZWRtaW5pX3YyX2xlZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZG1pbmlfdjJfZ3Bpb19sZWRzID0geworCS5uYW1lICAgICAgICAgICA9ICJsZWRzLWdwaW8iLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5kZXYgICAgICAgICAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmVkbWluaV92Ml9sZWRfZGF0YSwKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdQSU8ga2V5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFRE1JTklfVjJfR1BJT19LRVlfUE9XRVIJMTgKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGVkbWluaV92Ml9idXR0b25zW10gPSB7CisJeworCQkuY29kZQkJPSBLRVlfUE9XRVIsCisJCS5ncGlvCQk9IEVETUlOSV9WMl9HUElPX0tFWV9QT1dFUiwKKwkJLmRlc2MJCT0gIlBvd2VyIEJ1dHRvbiIsCisJCS5hY3RpdmVfbG93CT0gMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBlZG1pbmlfdjJfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBlZG1pbmlfdjJfYnV0dG9ucywKKwkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGVkbWluaV92Ml9idXR0b25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVkbWluaV92Ml9ncGlvX2J1dHRvbnMgPSB7CisJLm5hbWUJCT0gImdwaW8ta2V5cyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlZG1pbmlfdjJfYnV0dG9uX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBTZXR1cAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG9yaW9uNXhfbXBwX21vZGUgZWRtaW5pdjJfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKKwl7ICAwLCBNUFBfVU5VU0VEIH0sCisJeyAgMSwgTVBQX1VOVVNFRCB9LAorCXsgIDIsIE1QUF9VTlVTRUQgfSwKKwl7ICAzLCBNUFBfR1BJTyB9LAkvKiBSVEMgaW50ZXJydXB0ICovCisJeyAgNCwgTVBQX1VOVVNFRCB9LAorCXsgIDUsIE1QUF9VTlVTRUQgfSwKKwl7ICA2LCBNUFBfVU5VU0VEIH0sCisJeyAgNywgTVBQX1VOVVNFRCB9LAorCXsgIDgsIE1QUF9VTlVTRUQgfSwKKwl7ICA5LCBNUFBfVU5VU0VEIH0sCisJeyAxMCwgTVBQX1VOVVNFRCB9LAorCXsgMTEsIE1QUF9VTlVTRUQgfSwKKwl7IDEyLCBNUFBfU0FUQV9MRUQgfSwJLyogU0FUQSAwIHByZXNlbmNlICovCisJeyAxMywgTVBQX1NBVEFfTEVEIH0sCS8qIFNBVEEgMSBwcmVzZW5jZSAqLworCXsgMTQsIE1QUF9TQVRBX0xFRCB9LAkvKiBTQVRBIDAgYWN0aXZlICovCisJeyAxNSwgTVBQX1NBVEFfTEVEIH0sCS8qIFNBVEEgMSBhY3RpdmUgKi8KKwkvKiAxNjogUG93ZXIgTEVEIGNvbnRyb2wgKDAgPSBPbiwgMSA9IE9mZikgKi8KKwl7IDE2LCBNUFBfR1BJTyB9LAorCS8qIDE3OiBQb3dlciBMRUQgY29udHJvbCBzZWxlY3QgKDAgPSBDUExELCAxID0gR1BJTzE2KSAqLworCXsgMTcsIE1QUF9HUElPIH0sCisJLyogMTg6IFBvd2VyIGJ1dHRvbiBzdGF0dXMgKDAgPSBSZWxlYXNlZCwgMSA9IFByZXNzZWQpICovCisJeyAxOCwgTVBQX0dQSU8gfSwKKwl7IDE5LCBNUFBfVU5VU0VEIH0sCisJeyAtMSB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWRtaW5pX3YyX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFNldHVwIGJhc2ljIE9yaW9uIGZ1bmN0aW9ucy4gTmVlZCB0byBiZSBjYWxsZWQgZWFybHkuCisJICovCisJb3Jpb241eF9pbml0KCk7CisKKwlvcmlvbjV4X21wcF9jb25mKGVkbWluaXYyX21wcF9tb2Rlcyk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBwZXJpcGhlcmFscy4KKwkgKi8KKwlvcmlvbjV4X2VoY2kwX2luaXQoKTsKKwlvcmlvbjV4X2V0aF9pbml0KCZlZG1pbmlfdjJfZXRoX2RhdGEpOworCW9yaW9uNXhfaTJjX2luaXQoKTsKKwlvcmlvbjV4X3NhdGFfaW5pdCgmZWRtaW5pX3YyX3NhdGFfZGF0YSk7CisJb3Jpb241eF91YXJ0MF9pbml0KCk7CisKKwlvcmlvbjV4X3NldHVwX2Rldl9ib290X3dpbihFRE1JTklfVjJfTk9SX0JPT1RfQkFTRSwKKwkJCQlFRE1JTklfVjJfTk9SX0JPT1RfU0laRSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZG1pbmlfdjJfbm9yX2ZsYXNoKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVkbWluaV92Ml9ncGlvX2xlZHMpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRtaW5pX3YyX2dwaW9fYnV0dG9ucyk7CisKKwlwcl9ub3RpY2UoImVkbWluaV92MjogVVNCIGRldmljZSBwb3J0LCBmbGFzaCB3cml0ZSBhbmQgcG93ZXItb2ZmICIKKwkJICAiYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIik7CisKKwkvKiBHZXQgUlRDIElSUSBhbmQgcmVnaXN0ZXIgdGhlIGNoaXAgKi8KKwlpZiAoZ3Bpb19yZXF1ZXN0KEVETUlOSVYyX1JUQ19HUElPLCAicnRjIikgPT0gMCkgeworCQlpZiAoZ3Bpb19kaXJlY3Rpb25faW5wdXQoRURNSU5JVjJfUlRDX0dQSU8pID09IDApCisJCQllZG1pbmlfdjJfaTJjX3J0Yy5pcnEgPSBncGlvX3RvX2lycShFRE1JTklWMl9SVENfR1BJTyk7CisJCWVsc2UKKwkJCWdwaW9fZnJlZShFRE1JTklWMl9SVENfR1BJTyk7CisJfQorCisJaWYgKGVkbWluaV92Ml9pMmNfcnRjLmlycSA9PSAwKQorCQlwcl93YXJuaW5nKCJlZG1pbmlfdjI6IGZhaWxlZCB0byBnZXQgUlRDIElSUVxuIik7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCAmZWRtaW5pX3YyX2kyY19ydGMsIDEpOworfQorCisvKiBXYXJuaW5nOiBMYUNpZSB1c2UgYSB3cm9uZyBtYWNoLXR5cGUgKDB4MjBlPTUyNikgaW4gdGhlaXIgYm9vdGxvYWRlci4gKi8KK01BQ0hJTkVfU1RBUlQoRURNSU5JX1YyLCAiTGFDaWUgRXRoZXJuZXQgRGlzayBtaW5pIFYyIikKKwkvKiBNYWludGFpbmVyOiBDaHJpc3RvcGhlciBNb29yZSA8bW9vcmVAZnJlZS5mcj4gKi8KKwkucGh5c19pbwk9IE9SSU9ONVhfUkVHU19QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChPUklPTjVYX1JFR1NfVklSVF9CQVNFKSA+PiAxOCkgJiAweEZGRkMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gZWRtaW5pX3YyX2luaXQsCisJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBvcmlvbjV4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmb3Jpb241eF90aW1lciwKKwkuZml4dXAJCT0gdGFnX2ZpeHVwX21lbTMyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZ3Bpby5jCmluZGV4IGNkOGExNmYuLmZjNDE5ODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2dwaW8uYwpAQCAtMTUsOCArMTUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL29yaW9uNXguaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCmluZGV4IDYxZWI3NGEuLjlmNWNlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvb3Jpb241eC5oCkBAIC0yLDcgKzIsNyBAQAogICogYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9vcmlvbjV4LmgKICAqCiAgKiBHZW5lcmljIGRlZmluaXRpb25zIG9mIE9yaW9uIFNvQyBmbGF2b3JzOgotICogIE9yaW9uLTEsIE9yaW9uLVZvSVAsIE9yaW9uLU5BUywgYW5kIE9yaW9uLTIuCisgKiAgT3Jpb24tMSwgT3Jpb24tVm9JUCwgT3Jpb24tTkFTLCBPcmlvbi0yLCBhbmQgT3Jpb24tMS05MC4KICAqCiAgKiBNYWludGFpbmVyOiBUemFjaGkgUGVyZWxzdGVpbiA8dHphY2hpQG1hcnZlbGwuY29tPgogICoKQEAgLTc2LDYgKzc2LDkgQEAKICNkZWZpbmUgTVY4OEY1MjgxX1JFVl9EMAk0CiAjZGVmaW5lIE1WODhGNTI4MV9SRVZfRDEJNQogI2RlZmluZSBNVjg4RjUyODFfUkVWX0QyCTYKKy8qIE9yaW9uLTEtOTAgKDg4RjYxODMpICovCisjZGVmaW5lIE1WODhGNjE4M19ERVZfSUQJMHg2MTgzCisjZGVmaW5lIE1WODhGNjE4M19SRVZfQjAJMwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogT3Jpb24gUmVnaXN0ZXJzIE1hcApAQCAtODYsNiArODksNyBAQAogI2RlZmluZSBPUklPTjVYX0RFVl9CVVNfUEhZU19CQVNFCShPUklPTjVYX1JFR1NfUEhZU19CQVNFIHwgMHgxMDAwMCkKICNkZWZpbmUgT1JJT041WF9ERVZfQlVTX1ZJUlRfQkFTRQkoT1JJT041WF9SRUdTX1ZJUlRfQkFTRSB8IDB4MTAwMDApCiAjZGVmaW5lIE9SSU9ONVhfREVWX0JVU19SRUcoeCkJCShPUklPTjVYX0RFVl9CVVNfVklSVF9CQVNFIHwgKHgpKQorI2RlZmluZSAgU1BJX1BIWVNfQkFTRQkJCShPUklPTjVYX0RFVl9CVVNfUEhZU19CQVNFIHwgMHgwNjAwKQogI2RlZmluZSAgSTJDX1BIWVNfQkFTRQkJCShPUklPTjVYX0RFVl9CVVNfUEhZU19CQVNFIHwgMHgxMDAwKQogI2RlZmluZSAgVUFSVDBfUEhZU19CQVNFCQkoT1JJT041WF9ERVZfQlVTX1BIWVNfQkFTRSB8IDB4MjAwMCkKICNkZWZpbmUgIFVBUlQwX1ZJUlRfQkFTRQkJKE9SSU9ONVhfREVWX0JVU19WSVJUX0JBU0UgfCAweDIwMDApCkBAIC0xNTMsOSArMTU3LDExIEBACiAjZGVmaW5lIENQVV9DT05GCQlPUklPTjVYX0JSSURHRV9SRUcoMHgxMDApCiAjZGVmaW5lIENQVV9DVFJMCQlPUklPTjVYX0JSSURHRV9SRUcoMHgxMDQpCiAjZGVmaW5lIENQVV9SRVNFVF9NQVNLCQlPUklPTjVYX0JSSURHRV9SRUcoMHgxMDgpCisjZGVmaW5lICBXRFRfUkVTRVQJCTB4MDAwMgogI2RlZmluZSBDUFVfU09GVF9SRVNFVAkJT1JJT041WF9CUklER0VfUkVHKDB4MTBjKQogI2RlZmluZSBQT1dFUl9NTkdfQ1RSTF9SRUcJT1JJT041WF9CUklER0VfUkVHKDB4MTFDKQogI2RlZmluZSBCUklER0VfQ0FVU0UJCU9SSU9ONVhfQlJJREdFX1JFRygweDExMCkKKyNkZWZpbmUgIFdEVF9JTlRfUkVRCQkweDAwMDgKICNkZWZpbmUgQlJJREdFX01BU0sJCU9SSU9ONVhfQlJJREdFX1JFRygweDExNCkKICNkZWZpbmUgIEJSSURHRV9JTlRfVElNRVIwCTB4MDAwMgogI2RlZmluZSAgQlJJREdFX0lOVF9USU1FUjEJMHgwMDA0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL3RpbWV4LmgKaW5kZXggZTgyZTQ0ZC4uNGM2OTgyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC90aW1leC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtOSw1ICs5LDMgQEAKICAqLwogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJKDEwMCAqIEhaKQotCi0jZGVmaW5lIE9SSU9ONVhfVENMSwkJMTY2NjY2NjY3CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMKaW5kZXggMjU0NWZmOS4uNjMyYTM2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pcnEuYwpAQCAtMTMsOCArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KICNpbmNsdWRlICJjb21tb24uaCIKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQkJCXBvbGFyaXR5IF49IDEgPDwgcGluOwogCQkJCXdyaXRlbChwb2xhcml0eSwgR1BJT19JTl9QT0wpOwogCQkJfQotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKaW5kZXggZTMyMWVjMy4uZGZiYjY4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBrdXJvYm94X3Byb19ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA4LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yOTMsNyArMjkzLDcgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyIHNodXRkb3dud2FpdFtdCT0gezB4MDAsIDB4MGN9OwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgcG93ZXJvZmZbXQkJPSB7MHgwMCwgMHgwNn07CiAJLyogMzg0MDAgYmF1ZCBkaXZpc29yICovCi0JY29uc3QgdW5zaWduZWQgZGl2aXNvciA9ICgoT1JJT041WF9UQ0xLICsgKDggKiAzODQwMCkpIC8gKDE2ICogMzg0MDApKTsKKwljb25zdCB1bnNpZ25lZCBkaXZpc29yID0gKChvcmlvbjV4X3RjbGsgKyAoOCAqIDM4NDAwKSkgLyAoMTYgKiAzODQwMCkpOwogCiAJcHJfaW5mbygiJXM6IHRyaWdnZXJpbmcgcG93ZXItb2ZmLi4uXG4iLCBfX2Z1bmNfXyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc21pbmktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc21pbmktc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGM0M2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzbWluaS1zZXR1cC5jCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzbWluaS1zZXR1cC5jCisgKgorICogTWFpbnRhaW5lcjogQWxleGV5IEtvcHl0a28gPGFsZXhleUBrb3B5dGtvLnJ1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4X2V0aC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJtcHAuaCIKKyNpbmNsdWRlICJpbmNsdWRlL21hY2gvc3lzdGVtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGlua3N0YXRpb24gTWluaSBJbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIDI1NksgTk9SIGZsYXNoIERldmljZSBidXMgYm9vdCBjaGlwIHNlbGVjdAorICovCisKKyNkZWZpbmUgTFNNSU5JX05PUl9CT09UX0JBU0UJMHhmNDAwMDAwMAorI2RlZmluZSBMU01JTklfTk9SX0JPT1RfU0laRQlTWl8yNTZLCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogMjU2S0IgTk9SIEZsYXNoIG9uIEJPT1QgRGV2aWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgbHNtaW5pX25vcl9mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsc21pbmlfbm9yX2ZsYXNoX3Jlc291cmNlID0geworCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCS5zdGFydAk9IExTTUlOSV9OT1JfQk9PVF9CQVNFLAorCS5lbmQJPSBMU01JTklfTk9SX0JPT1RfQkFTRSArIExTTUlOSV9OT1JfQk9PVF9TSVpFIC0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxzbWluaV9ub3JfZmxhc2ggPSB7CisJLm5hbWUJCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmxzbWluaV9ub3JfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCQk9IDEsCisJLnJlc291cmNlCQk9ICZsc21pbmlfbm9yX2ZsYXNoX3Jlc291cmNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFdGhlcm5ldAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBsc21pbmlfZXRoX2RhdGEgPSB7CisJLnBoeV9hZGRyCT0gOCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUlRDIDVDMzcyYSBvbiBJMkMgYnVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGxzbWluaV9pMmNfcnRjID0geworCUkyQ19CT0FSRF9JTkZPKCJyczVjMzcyYSIsIDB4MzIpLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMRURzIGF0dGFjaGVkIHRvIEdQSU8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExTTUlOSV9HUElPX0xFRF9BTEFSTQkyCisjZGVmaW5lIExTTUlOSV9HUElPX0xFRF9JTkZPCTMKKyNkZWZpbmUgTFNNSU5JX0dQSU9fTEVEX0ZVTkMJOQorI2RlZmluZSBMU01JTklfR1BJT19MRURfUFdSCTE0CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbHNtaW5pX2xlZF9waW5zW10gPSB7CisJeworCQkubmFtZQkgICA9ICJhbGFybTpyZWQiLAorCQkuZ3BpbwkgICA9IExTTUlOSV9HUElPX0xFRF9BTEFSTSwKKwkJLmFjdGl2ZV9sb3cgICAgID0gMSwKKwl9LCB7CisJCS5uYW1lCSAgID0gImluZm86YW1iZXIiLAorCQkuZ3BpbwkgICA9IExTTUlOSV9HUElPX0xFRF9JTkZPLAorCQkuYWN0aXZlX2xvdyAgICAgPSAxLAorCX0sIHsKKwkJLm5hbWUJICAgPSAiZnVuYzpibHVlOnRvcCIsCisJCS5ncGlvCSAgID0gTFNNSU5JX0dQSU9fTEVEX0ZVTkMsCisJCS5hY3RpdmVfbG93ICAgICA9IDEsCisJfSwgeworCQkubmFtZQkgICA9ICJwb3dlcjpibHVlOmJvdHRvbSIsCisJCS5ncGlvCSAgID0gTFNNSU5JX0dQSU9fTEVEX1BXUiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGxzbWluaV9sZWRfZGF0YSA9IHsKKwkubGVkcwkgICA9IGxzbWluaV9sZWRfcGlucywKKwkubnVtX2xlZHMgICAgICAgPSBBUlJBWV9TSVpFKGxzbWluaV9sZWRfcGlucyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsc21pbmlfbGVkcyA9IHsKKwkubmFtZSAgID0gImxlZHMtZ3BpbyIsCisJLmlkICAgICA9IC0xLAorCS5kZXYgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZsc21pbmlfbGVkX2RhdGEsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHUElPIEF0dGFjaGVkIEtleXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExTTUlOSV9HUElPX0tFWV9GVU5DICAgICAgIDE1CisjZGVmaW5lIExTTUlOSV9HUElPX0tFWV9QT1dFUgkgICAxOAorI2RlZmluZSBMU01JTklfR1BJT19LRVlfQVVUT1BPV0VSIDE3CisKKyNkZWZpbmUgTFNNSU5JX1NXX1BPV0VSCQkweDAwCisjZGVmaW5lIExTTUlOSV9TV19BVVRPUE9XRVIJMHgwMQorCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbHNtaW5pX2J1dHRvbnNbXSA9IHsKKwl7CisJCS5jb2RlCSAgID0gS0VZX09QVElPTiwKKwkJLmdwaW8JICAgPSBMU01JTklfR1BJT19LRVlfRlVOQywKKwkJLmRlc2MJICAgPSAiRnVuY3Rpb24gQnV0dG9uIiwKKwkJLmFjdGl2ZV9sb3cgICAgID0gMSwKKwl9LCB7CisJCS50eXBlCQk9IEVWX1NXLAorCQkuY29kZQkgICA9IExTTUlOSV9TV19QT1dFUiwKKwkJLmdwaW8JICAgPSBMU01JTklfR1BJT19LRVlfUE9XRVIsCisJCS5kZXNjCSAgID0gIlBvd2VyLW9uIFN3aXRjaCIsCisJCS5hY3RpdmVfbG93ICAgICA9IDEsCisJfSwgeworCQkudHlwZQkJPSBFVl9TVywKKwkJLmNvZGUJICAgPSBMU01JTklfU1dfQVVUT1BPV0VSLAorCQkuZ3BpbwkgICA9IExTTUlOSV9HUElPX0tFWV9BVVRPUE9XRVIsCisJCS5kZXNjCSAgID0gIlBvd2VyLWF1dG8gU3dpdGNoIiwKKwkJLmFjdGl2ZV9sb3cgICAgID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBsc21pbmlfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBsc21pbmlfYnV0dG9ucywKKwkubmJ1dHRvbnMgICAgICAgPSBBUlJBWV9TSVpFKGxzbWluaV9idXR0b25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxzbWluaV9idXR0b25fZGV2aWNlID0geworCS5uYW1lCSAgID0gImdwaW8ta2V5cyIsCisJLmlkCSAgICAgPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSAwLAorCS5kZXYJICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmbHNtaW5pX2J1dHRvbl9kYXRhLAorCX0sCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0FUQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG12X3NhdGFfcGxhdGZvcm1fZGF0YSBsc21pbmlfc2F0YV9kYXRhID0geworCS5uX3BvcnRzCT0gMiwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW5rc3RhdGlvbiBNaW5pIHNwZWNpZmljIHBvd2VyIG9mZiBtZXRob2Q6IHJlYm9vdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogT24gdGhlIExpbmtzdGF0aW9uIE1pbmksIHRoZSBzaHV0ZG93biBwcm9jZXNzIGlzIGZvbGxvd2luZzoKKyAqIC0gVXNlcmxhbmQgbW9uaXRvcnMga2V5IGV2ZW50cyB1bnRpbCB0aGUgcG93ZXIgc3dpdGNoIGdvZXMgdG8gb2ZmIHBvc2l0aW9uCisgKiAtIFRoZSBib2FyZCByZWJvb3RzCisgKiAtIFUtYm9vdCBzdGFydHMgYW5kIGdvZXMgaW50byBhbiBpZGxlIG1vZGUgd2FpdGluZyBmb3IgdGhlIHVzZXIKKyAqICAgdG8gbW92ZSB0aGUgc3dpdGNoIHRvIE9OIHBvc2l0aW9uCisgKi8KKworc3RhdGljIHZvaWQgbHNtaW5pX3Bvd2VyX29mZih2b2lkKQoreworCWFyY2hfcmVzZXQoMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmFsIFNldHVwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMU01JTklfR1BJT19VU0JfUE9XRVIJMTYKKyNkZWZpbmUgTFNNSU5JX0dQSU9fQVVUT19QT1dFUgkxNworI2RlZmluZSBMU01JTklfR1BJT19QT1dFUgkxOAorCisjZGVmaW5lIExTTUlOSV9HUElPX0hERF9QT1dFUjAJMQorI2RlZmluZSBMU01JTklfR1BJT19IRERfUE9XRVIxCTE5CisKK3N0YXRpYyBzdHJ1Y3Qgb3Jpb241eF9tcHBfbW9kZSBsc21pbmlfbXBwX21vZGVzW10gX19pbml0ZGF0YSA9IHsKKwl7ICAwLCBNUFBfVU5VU0VEIH0sIC8qIExFRF9SRVNFUlZFMSAodW51c2VkKSAqLworCXsgIDEsIE1QUF9HUElPIH0sIC8qIEhERF9QV1IgKi8KKwl7ICAyLCBNUFBfR1BJTyB9LCAvKiBMRURfQUxBUk0gKi8KKwl7ICAzLCBNUFBfR1BJTyB9LCAvKiBMRURfSU5GTyAqLworCXsgIDQsIE1QUF9VTlVTRUQgfSwKKwl7ICA1LCBNUFBfVU5VU0VEIH0sCisJeyAgNiwgTVBQX1VOVVNFRCB9LAorCXsgIDcsIE1QUF9VTlVTRUQgfSwKKwl7ICA4LCBNUFBfVU5VU0VEIH0sCisJeyAgOSwgTVBQX0dQSU8gfSwgLyogTEVEX0ZVTkMgKi8KKwl7IDEwLCBNUFBfVU5VU0VEIH0sCisJeyAxMSwgTVBQX1VOVVNFRCB9LCAvKiBMRURfRVRIIChkdW1teSkgKi8KKwl7IDEyLCBNUFBfVU5VU0VEIH0sCisJeyAxMywgTVBQX1VOVVNFRCB9LAorCXsgMTQsIE1QUF9HUElPIH0sIC8qIExFRF9QV1IgKi8KKwl7IDE1LCBNUFBfR1BJTyB9LCAvKiBGVU5DICovCisJeyAxNiwgTVBQX0dQSU8gfSwgLyogVVNCX1BXUiAqLworCXsgMTcsIE1QUF9HUElPIH0sIC8qIEFVVE9fUE9XRVIgKi8KKwl7IDE4LCBNUFBfR1BJTyB9LCAvKiBQT1dFUiAqLworCXsgMTksIE1QUF9HUElPIH0sIC8qIEhERF9QV1IxICovCisJeyAtMSB9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGxzbWluaV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBTZXR1cCBiYXNpYyBPcmlvbiBmdW5jdGlvbnMuIE5lZWQgdG8gYmUgY2FsbGVkIGVhcmx5LgorCSAqLworCW9yaW9uNXhfaW5pdCgpOworCisJb3Jpb241eF9tcHBfY29uZihsc21pbmlfbXBwX21vZGVzKTsKKworCS8qCisJICogQ29uZmlndXJlIHBlcmlwaGVyYWxzLgorCSAqLworCW9yaW9uNXhfZWhjaTBfaW5pdCgpOworCW9yaW9uNXhfZWhjaTFfaW5pdCgpOworCW9yaW9uNXhfZXRoX2luaXQoJmxzbWluaV9ldGhfZGF0YSk7CisJb3Jpb241eF9pMmNfaW5pdCgpOworCW9yaW9uNXhfc2F0YV9pbml0KCZsc21pbmlfc2F0YV9kYXRhKTsKKwlvcmlvbjV4X3VhcnQwX2luaXQoKTsKKwlvcmlvbjV4X3hvcl9pbml0KCk7CisKKwlvcmlvbjV4X3NldHVwX2Rldl9ib290X3dpbihMU01JTklfTk9SX0JPT1RfQkFTRSwKKwkJCQkgICBMU01JTklfTk9SX0JPT1RfU0laRSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsc21pbmlfbm9yX2ZsYXNoKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbHNtaW5pX2J1dHRvbl9kZXZpY2UpOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsc21pbmlfbGVkcyk7CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCAmbHNtaW5pX2kyY19ydGMsIDEpOworCisJLyogZW5hYmxlIFVTQiBwb3dlciAqLworCWdwaW9fc2V0X3ZhbHVlKExTTUlOSV9HUElPX1VTQl9QT1dFUiwgMSk7CisKKwkvKiByZWdpc3RlciBwb3dlci1vZmYgbWV0aG9kICovCisJcG1fcG93ZXJfb2ZmID0gbHNtaW5pX3Bvd2VyX29mZjsKKworCXByX2luZm8oIiVzOiBmaW5pc2hlZFxuIiwgX19mdW5jX18pOworfQorCisjaWZkZWYgQ09ORklHX01BQ0hfTElOS1NUQVRJT05fTUlOSQorTUFDSElORV9TVEFSVChMSU5LU1RBVElPTl9NSU5JLCAiQnVmZmFsbyBMaW5rc3RhdGlvbiBNaW5pIikKKwkvKiBNYWludGFpbmVyOiBBbGV4ZXkgS29weXRrbyA8YWxleGV5QGtvcHl0a28ucnU+ICovCisJLnBoeXNfaW8JPSBPUklPTjVYX1JFR1NfUEhZU19CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoT1JJT041WF9SRUdTX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhGRkZDLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGxzbWluaV9pbml0LAorCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCisJLmluaXRfaXJxCT0gb3Jpb241eF9pbml0X2lycSwKKwkudGltZXIJCT0gJm9yaW9uNXhfdGltZXIsCisJLmZpeHVwCQk9IHRhZ19maXh1cF9tZW0zMiwKK01BQ0hJTkVfRU5ECisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tcHAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tcHAuYwppbmRleCBjMDRhYjBlLi42NDBlYTJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXBwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21wcC5jCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJtcHAuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKaW5kZXggNTNmZjE4OS4uNjhhY2NhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jCkBAIC0xMDksNyArMTA5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgbXNzMl9ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA4LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXYyMTIwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXYyMTIwLXNldHVwLmMKaW5kZXggOTc4ZDRkNS4uOTdjOWNjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L212MjEyMC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tdjIxMjAtc2V0dXAuYwpAQCAtMzksNyArMzksNyBAQAogICogRXRoZXJuZXQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIG12MjEyMF9ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA4LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAogfTsKIAogc3RhdGljIHN0cnVjdCBtdl9zYXRhX3BsYXRmb3JtX2RhdGEgbXYyMTIwX3NhdGFfZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKaW5kZXggZTcyZmUxZS4uNTAwY2RhZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCkBAIC04OCw3ICs4OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgcmQ4OGY1MTgxbF9meG9fZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gLTEsCisJLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX05PTkUsCiAJLnNwZWVkCQk9IFNQRUVEXzEwMDAsCiAJLmR1cGxleAkJPSBEVVBMRVhfRlVMTCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYwppbmRleCBhMWZlMzI1Li5lYmRlODE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWdlLXNldHVwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSByZDg4ZjUxODFsX2dlX2V0aF9kYXRhID0gewotCS5waHlfYWRkcgk9IC0xLAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9OT05FLAogCS5zcGVlZAkJPSBTUEVFRF8xMDAwLAogCS5kdXBsZXgJCT0gRFVQTEVYX0ZVTEwsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCmluZGV4IDRjM2JjZDcuLmEwNGY5ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSByZDg4ZjUxODJfZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gOCwKKwkucGh5X2FkZHIJPSBNVjY0M1hYX0VUSF9QSFlfQUREUig4KSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY2MTgzYXAtZ2Utc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUwNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY2MTgzLWFwLWdlLXNldHVwLmMKKyAqCisgKiBNYXJ2ZWxsIE9yaW9uLTEtOTAgQVAgR0UgUmVmZXJlbmNlIERlc2lnbiBTZXR1cAorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4X2V0aC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvb3Jpb25fc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJtcHAuaCIKKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIHJkODhmNjE4M2FwX2dlX2V0aF9kYXRhID0geworCS5waHlfYWRkcgk9IC0xLAorCS5zcGVlZAkJPSBTUEVFRF8xMDAwLAorCS5kdXBsZXgJCT0gRFVQTEVYX0ZVTEwsCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcmQ4OGY2MTgzYXBfZ2VfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJPSAia2VybmVsIiwKKwkJLm9mZnNldAk9IDB4MDAwMDAwMDAsCisJCS5zaXplCT0gMHgwMDIwMDAwMCwKKwl9LCB7CisJCS5uYW1lCT0gInJvb3RmcyIsCisJCS5vZmZzZXQJPSAweDAwMjAwMDAwLAorCQkuc2l6ZQk9IDB4MDA1MDAwMDAsCisJfSwgeworCQkubmFtZQk9ICJudnJhbSIsCisJCS5vZmZzZXQJPSAweDAwNzAwMDAwLAorCQkuc2l6ZQk9IDB4MDAwODAwMDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSByZDg4ZjYxODNhcF9nZV9zcGlfc2xhdmVfZGF0YSA9IHsKKwkudHlwZQkJPSAibTI1cDY0IiwKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHJkODhmNjE4M2FwX2dlX3BhcnRpdGlvbnMpLAorCS5wYXJ0cwkJPSByZDg4ZjYxODNhcF9nZV9wYXJ0aXRpb25zLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHJkODhmNjE4M2FwX2dlX3NwaV9zbGF2ZV9pbmZvW10gPSB7CisJeworCQkubW9kYWxpYXMJPSAibTI1cDgwIiwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcmQ4OGY2MTgzYXBfZ2Vfc3BpX3NsYXZlX2RhdGEsCisJCS5pcnEJCT0gTk9fSVJRLAorCQkubWF4X3NwZWVkX2h6CT0gMjAwMDAwMDAsCisJCS5idXNfbnVtCT0gMCwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHJkODhmNjE4M2FwX2dlX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFNldHVwIGJhc2ljIE9yaW9uIGZ1bmN0aW9ucy4gTmVlZCB0byBiZSBjYWxsZWQgZWFybHkuCisJICovCisJb3Jpb241eF9pbml0KCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBwZXJpcGhlcmFscy4KKwkgKi8KKwlvcmlvbjV4X2VoY2kwX2luaXQoKTsKKwlvcmlvbjV4X2V0aF9pbml0KCZyZDg4ZjYxODNhcF9nZV9ldGhfZGF0YSk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8ocmQ4OGY2MTgzYXBfZ2Vfc3BpX3NsYXZlX2luZm8sCisJCQkJQVJSQVlfU0laRShyZDg4ZjYxODNhcF9nZV9zcGlfc2xhdmVfaW5mbykpOworCW9yaW9uNXhfc3BpX2luaXQoKTsKKwlvcmlvbjV4X3VhcnQwX2luaXQoKTsKK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgcmQ4OGY2MTgzYXBfZ2VfcGNpIF9faW5pdGRhdGEgPSB7CisJLm5yX2NvbnRyb2xsZXJzCT0gMiwKKwkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKKwkuc2V0dXAJCT0gb3Jpb241eF9wY2lfc3lzX3NldHVwLAorCS5zY2FuCQk9IG9yaW9uNXhfcGNpX3N5c19zY2FuX2J1cywKKwkubWFwX2lycQk9IG9yaW9uNXhfcGNpX21hcF9pcnEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByZDg4ZjYxODNhcF9nZV9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3JkODhmNjE4M2FwX2dlKCkpIHsKKwkJb3Jpb241eF9wY2lfZGlzYWJsZSgpOworCQlwY2lfY29tbW9uX2luaXQoJnJkODhmNjE4M2FwX2dlX3BjaSk7CisJfQorCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwocmQ4OGY2MTgzYXBfZ2VfcGNpX2luaXQpOworCitNQUNISU5FX1NUQVJUKFJEODhGNjE4M0FQX0dFLCAiTWFydmVsbCBPcmlvbi0xLTkwIEFQIEdFIFJlZmVyZW5jZSBEZXNpZ24iKQorCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQG1hcnZlbGwuY29tPiAqLworCS5waHlzX2lvCT0gT1JJT041WF9SRUdTX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKE9SSU9ONVhfUkVHU19WSVJUX0JBU0UpID4+IDE4KSAmIDB4RkZGQywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5pbml0X21hY2hpbmUJPSByZDg4ZjYxODNhcF9nZV9pbml0LAorCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCisJLmluaXRfaXJxCT0gb3Jpb241eF9pbml0X2lycSwKKwkudGltZXIJCT0gJm9yaW9uNXhfdGltZXIsCisJLmZpeHVwCQk9IHRhZ19maXh1cF9tZW0zMiwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjEwMWQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBCdWZmYWxvIFRlcmFzdGF0aW9uIFBybyBJSS9MaXZlIEJvYXJkIFNldHVwCisgKgorICogTWFpbnRhaW5lcjogU3lsdmVyIEJydW5lYXUgPHN5bHZlci5icnVuZWF1QGdvb2dsZW1haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXY2NDN4eF9ldGguaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJtcHAuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXJhc3RhdGlvbiBQcm8gMi9MaXZlIEluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGVyYXN0YXRpb24gUHJvIDIgaGFyZHdhcmUgOgorICogLSBNYXJ2ZWxsIDg4RjUyODEtRDAKKyAqIC0gTWFydmVsbCA4OFNYNjA0MiBTQVRBIGNvbnRyb2xsZXIgKFBDSSkKKyAqIC0gTWFydmVsbCA4OEUxMTE4IEdpZ2FiaXQgRXRoZXJuZXQgUEhZCisgKiAtIDI1NktCIE5PUiBmbGFzaAorICogLSAxMjhNQiBvZiBERFIgUkFNCisgKiAtIFBDSWUgcG9ydCAobm90IGVxdWlwcGVkKQorICovCisKKy8qCisgKiAyNTZLIE5PUiBmbGFzaCBEZXZpY2UgYnVzIGJvb3QgY2hpcCBzZWxlY3QKKyAqLworCisjZGVmaW5lIFRTUDJfTk9SX0JPT1RfQkFTRQkweGY0MDAwMDAwCisjZGVmaW5lIFRTUDJfTk9SX0JPT1RfU0laRQlTWl8yNTZLCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogMjU2S0IgTk9SIEZsYXNoIG9uIEJPT1QgRGV2aWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgdHNwMl9ub3JfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggICAgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0c3AyX25vcl9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkuc3RhcnQgPSBUU1AyX05PUl9CT09UX0JBU0UsCisJLmVuZCAgID0gVFNQMl9OT1JfQk9PVF9CQVNFICsgVFNQMl9OT1JfQk9PVF9TSVpFIC0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRzcDJfbm9yX2ZsYXNoID0geworCS5uYW1lICAgICAgICAgID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCAgICAgICAgICAgID0gMCwKKwkuZGV2ICAgICAgICAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdHNwMl9ub3JfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZ0c3AyX25vcl9mbGFzaF9yZXNvdXJjZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUENJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFNQMl9QQ0lfU0xPVDBfT0ZGUwkJNworI2RlZmluZSBUU1AyX1BDSV9TTE9UMF9JUlFfUElOCQkxMQorCit2b2lkIF9faW5pdCB0c3AyX3BjaV9wcmVpbml0KHZvaWQpCit7CisJaW50IHBpbjsKKworCS8qCisJICogQ29uZmlndXJlIFBDSSBHUElPIElSUSBwaW5zCisJICovCisJcGluID0gVFNQMl9QQ0lfU0xPVDBfSVJRX1BJTjsKKwlpZiAoZ3Bpb19yZXF1ZXN0KHBpbiwgIlBDSSBJbnQxIikgPT0gMCkgeworCQlpZiAoZ3Bpb19kaXJlY3Rpb25faW5wdXQocGluKSA9PSAwKSB7CisJCQlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEocGluKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidHNwMl9wY2lfcHJlaW5pdCBmYWlsZWQgIgorCQkJCQkidG8gc2V0X2lycV90eXBlIHBpbiAlZFxuIiwgcGluKTsKKwkJCWdwaW9fZnJlZShwaW4pOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0c3AyX3BjaV9wcmVpbml0IGZhaWxlZCB0byAiCisJCQkJImdwaW9fcmVxdWVzdCAlZFxuIiwgcGluKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRzcDJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCWludCBpcnE7CisKKwkvKgorCSAqIENoZWNrIGZvciBkZXZpY2VzIHdpdGggaGFyZC13aXJlZCBJUlFzLgorCSAqLworCWlycSA9IG9yaW9uNXhfcGNpX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCWlmIChpcnEgIT0gLTEpCisJCXJldHVybiBpcnE7CisKKwkvKgorCSAqIFBDSSBJUlFzIGFyZSBjb25uZWN0ZWQgdmlhIEdQSU9zLgorCSAqLworCWlmIChzbG90ID09IFRTUDJfUENJX1NMT1QwX09GRlMpCisJCXJldHVybiBncGlvX3RvX2lycShUU1AyX1BDSV9TTE9UMF9JUlFfUElOKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgdHNwMl9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAyLAorCS5wcmVpbml0ICAgICAgICA9IHRzcDJfcGNpX3ByZWluaXQsCisJLnN3aXp6bGUgICAgICAgID0gcGNpX3N0ZF9zd2l6emxlLAorCS5zZXR1cCAgICAgICAgICA9IG9yaW9uNXhfcGNpX3N5c19zZXR1cCwKKwkuc2NhbiAgICAgICAgICAgPSBvcmlvbjV4X3BjaV9zeXNfc2Nhbl9idXMsCisJLm1hcF9pcnEgICAgICAgID0gdHNwMl9wY2lfbWFwX2lycSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRzcDJfcGNpX2luaXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc190ZXJhc3RhdGlvbl9wcm8yKCkpCisJCXBjaV9jb21tb25faW5pdCgmdHNwMl9wY2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0c3AyX3BjaV9pbml0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFdGhlcm5ldAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSB0c3AyX2V0aF9kYXRhID0geworCS5waHlfYWRkcgk9IDAsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJUQyA1QzM3MmEgb24gSTJDIGJ1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFNQMl9SVENfR1BJTwk5CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB0c3AyX2kyY19ydGMgPSB7CisJSTJDX0JPQVJEX0lORk8oInJzNWMzNzJhIiwgMHgzMiksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlcmFzdGF0aW9uIFBybyBJSSBzcGVjaWZpYyBwb3dlciBvZmYgbWV0aG9kIHZpYSBVQVJUMS1hdHRhY2hlZAorICogbWljcm9jb250cm9sbGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBVQVJUMV9SRUcoeCkJKFVBUlQxX1ZJUlRfQkFTRSArICgoVUFSVF8jI3gpIDw8IDIpKQorCitzdGF0aWMgaW50IHRzcDJfbWljb25yZWFkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpOworCWludCB0aW1lb3V0OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdGltZW91dCA9IDEwOworCisJCXdoaWxlICghKHJlYWRsKFVBUlQxX1JFRyhMU1IpKSAmIFVBUlRfTFNSX0RSKSkgeworCQkJaWYgKC0tdGltZW91dCA9PSAwKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwMDApOworCQl9CisKKwkJaWYgKHRpbWVvdXQgPT0gMCkKKwkJCWJyZWFrOworCQlidWZbaV0gPSByZWFkbChVQVJUMV9SRUcoUlgpKTsKKwl9CisKKwkvKiByZXR1cm4gcmVhZCBieXRlcyAqLworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHRzcDJfbWljb253cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQl3aGlsZSAoIShyZWFkbChVQVJUMV9SRUcoTFNSKSkgJiBVQVJUX0xTUl9USFJFKSkKKwkJCWJhcnJpZXIoKTsKKwkJd3JpdGVsKGJ1ZltpKytdLCBVQVJUMV9SRUcoVFgpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c3AyX21pY29uc2VuZChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDA7CisJdW5zaWduZWQgY2hhciByZWN2X2J1Zls0MF07CisJdW5zaWduZWQgY2hhciBzZW5kX2J1Zls0MF07CisJdW5zaWduZWQgY2hhciBjb3JyZWN0X2Fja1szXTsKKwlpbnQgcmV0cnkgPSAyOworCisJLyogR2VuZXJhdGUgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJY2hlY2tzdW0gLT0gIGRhdGFbaV07CisKKwlkbyB7CisJCS8qIFNlbmQgZGF0YSAqLworCQl0c3AyX21pY29ud3JpdGUoZGF0YSwgY291bnQpOworCisJCS8qIHNlbmQgY2hlY2tzdW0gKi8KKwkJdHNwMl9taWNvbndyaXRlKCZjaGVja3N1bSwgMSk7CisKKwkJaWYgKHRzcDJfbWljb25yZWFkKHJlY3ZfYnVmLCBzaXplb2YocmVjdl9idWYpKSA8PSAzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIj4lczogcmVjZWl2ZSBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisKKwkJCS8qIHNlbmQgcHJlYW1ibGUgdG8gY2xlYXIgdGhlIHJlY2VpdmUgYnVmZmVyICovCisJCQltZW1zZXQoJnNlbmRfYnVmLCAweGZmLCBzaXplb2Yoc2VuZF9idWYpKTsKKwkJCXRzcDJfbWljb253cml0ZShzZW5kX2J1Ziwgc2l6ZW9mKHNlbmRfYnVmKSk7CisKKwkJCS8qIG1ha2UgZHVtbXkgcmVhZHMgKi8KKwkJCW1kZWxheSgxMDApOworCQkJdHNwMl9taWNvbnJlYWQocmVjdl9idWYsIHNpemVvZihyZWN2X2J1ZikpOworCQl9IGVsc2UgeworCQkJLyogR2VuZXJhdGUgZXhwZWN0ZWQgYWNrICovCisJCQljb3JyZWN0X2Fja1swXSA9IDB4MDE7CisJCQljb3JyZWN0X2Fja1sxXSA9IGRhdGFbMV07CisJCQljb3JyZWN0X2Fja1syXSA9IDB4MDA7CisKKwkJCS8qIGNoZWNrc3VtIENoZWNrICovCisJCQlpZiAoKHJlY3ZfYnVmWzBdICsgcmVjdl9idWZbMV0gKyByZWN2X2J1ZlsyXSArCisJCQkgICAgIHJlY3ZfYnVmWzNdKSAmIDB4RkYpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIj4lczogQ2hlY2tzdW0gRXJyb3IgOiAiCisJCQkJCSJSZWNlaXZlZCBkYXRhWyUwMngsICUwMngsICUwMngsICUwMnhdIgorCQkJCQkiXG4iLCBfX2Z1bmNfXywgcmVjdl9idWZbMF0sCisJCQkJCXJlY3ZfYnVmWzFdLCByZWN2X2J1ZlsyXSwgcmVjdl9idWZbM10pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBDaGVjayBSZWNlaXZlZCBEYXRhICovCisJCQkJaWYgKGNvcnJlY3RfYWNrWzBdID09IHJlY3ZfYnVmWzBdICYmCisJCQkJICAgIGNvcnJlY3RfYWNrWzFdID09IHJlY3ZfYnVmWzFdICYmCisJCQkJICAgIGNvcnJlY3RfYWNrWzJdID09IHJlY3ZfYnVmWzJdKSB7CisJCQkJCS8qIEludGVydmFsIGZvciBuZXh0IGNvbW1hbmQgKi8KKwkJCQkJbWRlbGF5KDEwKTsKKworCQkJCQkvKiBSZWNlaXZlIEFDSyAqLworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQkvKiBSZWNlaXZlZCBOQUsgb3IgaWxsZWdhbCBEYXRhICovCisJCQlwcmludGsoS0VSTl9FUlIgIj4lczogRXJyb3IgOiBOQUsgb3IgSWxsZWdhbCBEYXRhICIKKwkJCQkJIlJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwl9IHdoaWxlIChyZXRyeS0tKTsKKworCS8qIEludGVydmFsIGZvciBuZXh0IGNvbW1hbmQgKi8KKwltZGVsYXkoMTApOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB0c3AyX3Bvd2VyX29mZih2b2lkKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgd2F0Y2hkb2draWxsW10JPSB7MHgwMSwgMHgzNSwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBzaHV0ZG93bndhaXRbXQk9IHsweDAwLCAweDBjfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHBvd2Vyb2ZmW10JCT0gezB4MDAsIDB4MDZ9OworCS8qIDM4NDAwIGJhdWQgZGl2aXNvciAqLworCWNvbnN0IHVuc2lnbmVkIGRpdmlzb3IgPSAoKG9yaW9uNXhfdGNsayArICg4ICogMzg0MDApKSAvICgxNiAqIDM4NDAwKSk7CisKKwlwcl9pbmZvKCIlczogdHJpZ2dlcmluZyBwb3dlci1vZmYuLi5cbiIsIF9fZnVuY19fKTsKKworCS8qIGhpamFjayB1YXJ0MSBhbmQgcmVzZXQgaW50byBzYW5lIHN0YXRlICgzODQwMCw4bjEsZXZlbiBwYXJpdHkpICovCisJd3JpdGVsKDB4ODMsIFVBUlQxX1JFRyhMQ1IpKTsKKwl3cml0ZWwoZGl2aXNvciAmIDB4ZmYsIFVBUlQxX1JFRyhETEwpKTsKKwl3cml0ZWwoKGRpdmlzb3IgPj4gOCkgJiAweGZmLCBVQVJUMV9SRUcoRExNKSk7CisJd3JpdGVsKDB4MWIsIFVBUlQxX1JFRyhMQ1IpKTsKKwl3cml0ZWwoMHgwMCwgVUFSVDFfUkVHKElFUikpOworCXdyaXRlbCgweDA3LCBVQVJUMV9SRUcoRkNSKSk7CisJd3JpdGVsKDB4MDAsIFVBUlQxX1JFRyhNQ1IpKTsKKworCS8qIFNlbmQgdGhlIGNvbW1hbmRzIHRvIHNodXRkb3duIHRoZSBUZXJhc3RhdGlvbiBQcm8gSUkgKi8KKwl0c3AyX21pY29uc2VuZCh3YXRjaGRvZ2tpbGwsIHNpemVvZih3YXRjaGRvZ2tpbGwpKSA7CisJdHNwMl9taWNvbnNlbmQoc2h1dGRvd253YWl0LCBzaXplb2Yoc2h1dGRvd253YWl0KSkgOworCXRzcDJfbWljb25zZW5kKHBvd2Vyb2ZmLCBzaXplb2YocG93ZXJvZmYpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmFsIFNldHVwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgb3Jpb241eF9tcHBfbW9kZSB0c3AyX21wcF9tb2Rlc1tdIF9faW5pdGRhdGEgPSB7CisJeyAgMCwgTVBQX1BDSUVfUlNUX09VVG4gfSwKKwl7ICAxLCBNUFBfVU5VU0VEIH0sCisJeyAgMiwgTVBQX1VOVVNFRCB9LAorCXsgIDMsIE1QUF9VTlVTRUQgfSwKKwl7ICA0LCBNUFBfTkFORCB9LAkJLyogQk9PVCBOQU5EIEZsYXNoIFJFbiAqLworCXsgIDUsIE1QUF9OQU5EIH0sCQkvKiBCT09UIE5BTkQgRmxhc2ggV0VuICovCisJeyAgNiwgTVBQX05BTkQgfSwJCS8qIEJPT1QgTkFORCBGbGFzaCBIUkVuWzBdICovCisJeyAgNywgTVBQX05BTkQgfSwJCS8qIEJPT1QgTkFORCBGbGFzaCBXRW5bMF0gKi8KKwl7ICA4LCBNUFBfR1BJTyB9LAkJLyogTUlDT04gaW50ICovCisJeyAgOSwgTVBQX0dQSU8gfSwJCS8qIFJUQyBpbnQgKi8KKwl7IDEwLCBNUFBfVU5VU0VEIH0sCisJeyAxMSwgTVBQX0dQSU8gfSwJCS8qIFBDSSBJbnQgQSAqLworCXsgMTIsIE1QUF9VTlVTRUQgfSwKKwl7IDEzLCBNUFBfR1BJTyB9LAkJLyogVVBTIG9uIFVBUlQwIGVuYWJsZSAqLworCXsgMTQsIE1QUF9HUElPIH0sCQkvKiBVUFMgbG93IGJhdHRlcnkgZGV0ZWN0aW9uICovCisJeyAxNSwgTVBQX1VOVVNFRCB9LAorCXsgMTYsIE1QUF9VQVJUIH0sCQkvKiBVQVJUMSBSWEQgKi8KKwl7IDE3LCBNUFBfVUFSVCB9LAkJLyogVUFSVDEgVFhEICovCisJeyAxOCwgTVBQX1VBUlQgfSwJCS8qIFVBUlQxIENUU24gKi8KKwl7IDE5LCBNUFBfVUFSVCB9LAkJLyogVUFSVDEgUlRTbiAqLworCXsgLTEgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0c3AyX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFNldHVwIGJhc2ljIE9yaW9uIGZ1bmN0aW9ucy4gTmVlZCB0byBiZSBjYWxsZWQgZWFybHkuCisJICovCisJb3Jpb241eF9pbml0KCk7CisKKwlvcmlvbjV4X21wcF9jb25mKHRzcDJfbXBwX21vZGVzKTsKKworCS8qCisJICogQ29uZmlndXJlIHBlcmlwaGVyYWxzLgorCSAqLworCW9yaW9uNXhfc2V0dXBfZGV2X2Jvb3Rfd2luKFRTUDJfTk9SX0JPT1RfQkFTRSwKKwkJCQkgICBUU1AyX05PUl9CT09UX1NJWkUpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdHNwMl9ub3JfZmxhc2gpOworCisJb3Jpb241eF9laGNpMF9pbml0KCk7CisJb3Jpb241eF9ldGhfaW5pdCgmdHNwMl9ldGhfZGF0YSk7CisJb3Jpb241eF9pMmNfaW5pdCgpOworCW9yaW9uNXhfdWFydDBfaW5pdCgpOworCW9yaW9uNXhfdWFydDFfaW5pdCgpOworCisJLyogR2V0IFJUQyBJUlEgYW5kIHJlZ2lzdGVyIHRoZSBjaGlwICovCisJaWYgKGdwaW9fcmVxdWVzdChUU1AyX1JUQ19HUElPLCAicnRjIikgPT0gMCkgeworCQlpZiAoZ3Bpb19kaXJlY3Rpb25faW5wdXQoVFNQMl9SVENfR1BJTykgPT0gMCkKKwkJCXRzcDJfaTJjX3J0Yy5pcnEgPSBncGlvX3RvX2lycShUU1AyX1JUQ19HUElPKTsKKwkJZWxzZQorCQkJZ3Bpb19mcmVlKFRTUDJfUlRDX0dQSU8pOworCX0KKwlpZiAodHNwMl9pMmNfcnRjLmlycSA9PSAwKQorCQlwcl93YXJuaW5nKCJ0c3AyX2luaXQ6IGZhaWxlZCB0byBnZXQgUlRDIElSUVxuIik7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgJnRzcDJfaTJjX3J0YywgMSk7CisKKwkvKiByZWdpc3RlciBUZXJhc3RhdGlvbiBQcm8gSUkgc3BlY2lmaWMgcG93ZXItb2ZmIG1ldGhvZCAqLworCXBtX3Bvd2VyX29mZiA9IHRzcDJfcG93ZXJfb2ZmOworfQorCitNQUNISU5FX1NUQVJUKFRFUkFTVEFUSU9OX1BSTzIsICJCdWZmYWxvIFRlcmFzdGF0aW9uIFBybyBJSS9MaXZlIikKKwkvKiBNYWludGFpbmVyOiAgU3lsdmVyIEJydW5lYXUgPHN5bHZlci5icnVuZWF1QGdvb2dsZW1haWwuY29tPiAqLworCS5waHlzX2lvCT0gT1JJT041WF9SRUdTX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKE9SSU9ONVhfUkVHU19WSVJUX0JBU0UpID4+IDE4KSAmIDB4RkZGQywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5pbml0X21hY2hpbmUJPSB0c3AyX2luaXQsCisJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBvcmlvbjV4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmb3Jpb241eF90aW1lciwKKwkuZml4dXAJCT0gdGFnX2ZpeHVwX21lbTMyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czc4eHgtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czc4eHgtc2V0dXAuYwppbmRleCBhZTBhNWRjLi4xMzY4ZTlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM3OHh4LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNzh4eC1zZXR1cC5jCkBAIC0xMDMsOCArMTAzLDcgQEAKICAqIEV0aGVybmV0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSB0czc4eHhfZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gMCwKLQkuZm9yY2VfcGh5X2FkZHIgPSAxLAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDApLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHN4MDktY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHN4MDktY29tbW9uLmMKaW5kZXggODNmZWFjMy4uYzlhYmI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzeDA5LWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90c3gwOS1jb21tb24uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgInRzeDA5LWNvbW1vbi5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFFOQVAgVFMteDA5IHNwZWNpZmljIHBvd2VyIG9mZiBtZXRob2QgdmlhIFVBUlQxLWF0dGFjaGVkIFBJQwpAQCAtMjYsNyArMjcsNyBAQAogdm9pZCBxbmFwX3RzeDA5X3Bvd2VyX29mZih2b2lkKQogewogCS8qIDE5MjAwIGJhdWQgZGl2aXNvciAqLwotCWNvbnN0IHVuc2lnbmVkIGRpdmlzb3IgPSAoKE9SSU9ONVhfVENMSyArICg4ICogMTkyMDApKSAvICgxNiAqIDE5MjAwKSk7CisJY29uc3QgdW5zaWduZWQgZGl2aXNvciA9ICgob3Jpb241eF90Y2xrICsgKDggKiAxOTIwMCkpIC8gKDE2ICogMTkyMDApKTsKIAogCXByX2luZm8oIiVzOiB0cmlnZ2VyaW5nIHBvd2VyLW9mZi4uLlxuIiwgX19mdW5jX18pOwogCkBAIC00OCw3ICs0OSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgcW5hcF90c3gwOV9ldGhfZGF0YSA9IHsKLQkucGh5X2FkZHIJPSA4LAorCS5waHlfYWRkcgk9IE1WNjQzWFhfRVRIX1BIWV9BRERSKDgpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcW5hcF90c3gwOV9wYXJzZV9oZXhfbmliYmxlKGNoYXIgbikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCmluZGV4IGI2YmM0M2UuLjdkZGMyMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwpAQCAtOTIsNyArOTIsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIHducjg1NHRfZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gLTEsCisJLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX05PTkUsCiAJLnNwZWVkCQk9IFNQRUVEXzEwMDAsCiAJLmR1cGxleAkJPSBEVVBMRVhfRlVMTCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYwppbmRleCBiMTBkYTE3Li45YTRmZDUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIHdydDM1MG5fdjJfZXRoX2RhdGEgPSB7Ci0JLnBoeV9hZGRyCT0gLTEsCisJLnBoeV9hZGRyCT0gTVY2NDNYWF9FVEhfUEhZX05PTkUsCiAJLnNwZWVkCQk9IFNQRUVEXzEwMDAsCiAJLmR1cGxleAkJPSBEVVBMRVhfRlVMTCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jbG9jay5jCmluZGV4IDI0ZDAzNmEuLjg5OGMwZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jbG9jay5jCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgImNsb2NrLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYwppbmRleCAzYmE0NmVkLi40NTczNGJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMKQEAgLTI1LDkgKzI1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9kbWEuYwppbmRleCA4MzNjNTZiZS4uYWMyZjcwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9kbWEuYwpAQCAtMjEsMTIgKzIxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYwppbmRleCBmYjUxZjcyLi4wMTVjYzIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCA4OTg1YTQ2MjIuLmUxMmU3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjEsOCArMjEsOCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KIAogc3RhdGljIHZvaWQgYXJjaF9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL3RpbWV4LmgKaW5kZXggOTU2ZmJkOGUuLjVmZjAxOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL3RpbWV4LmgKQEAgLTE0LDggKzE0LDggQEAKICNpZm5kZWYgX19QTlg0MDA4X1RJTUVYX0gKICNkZWZpbmUgX19QTlg0MDA4X1RJTUVYX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTAwMDAwMAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaXJxLmMKaW5kZXggNWM0ZjU1YS4uYTljZTAyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pcnEuYwpAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3BtLmMKaW5kZXggZjk3MDkwNmQuLmIzZDhkNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9wbS5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8bWFjaC9wbS5oPgogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYwppbmRleCA5YmU4NGJiLi5mNDA5NjFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3NlcmlhbC5jCkBAIC0xMiw4ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3RpbWUuYwppbmRleCAxODA5NzUyLi5mYzBiYTE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC90aW1lLmMKQEAgLTIyLDEwICsyMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKaW5kZXggZThlZTdlYy4uZjI3ZjZiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCkBAIC0zOCwxNiArMzgsMjMgQEAKIAlib29sICJJbnRlbCBEQlBYQTI1MCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIKIAlzZWxlY3QgUFhBMjV4CiAJc2VsZWN0IFNBMTExMQorCXNlbGVjdCBQWEFfSEFWRV9CT0FSRF9JUlFTCiAKIGNvbmZpZyBNQUNIX0xPR0lDUERfUFhBMjcwCiAJYm9vbCAiTG9naWNQRCBQWEEyNzAgQ2FyZCBFbmdpbmUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBIQVZFX1BXTQorCXNlbGVjdCBQWEFfSEFWRV9CT0FSRF9JUlFTCiAKIGNvbmZpZyBNQUNIX01BSU5TVE9ORQogCWJvb2wgIkludGVsIEhDRERCQlZBMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIKIAlzZWxlY3QgUFhBMjd4CiAJc2VsZWN0IEhBVkVfUFdNCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKKworY29uZmlnIE1BQ0hfTVA5MDBDCisJYm9vbCAiTmVjIE1vYmlsZXBybyA5MDAvYyIKKwlzZWxlY3QgUFhBMjV4CiAKIGNvbmZpZyBBUkNIX1BYQV9JRFAKIAlib29sICJBY2NlbGVudCBYc2NhbGUgSURQIgpAQCAtMTE0LDEwICsxMjEsMjEgQEAKIAlib29sICJFbmFibGUgU2hhcnAgU0wtNjAwMHggKFRvc2EpIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQWEFfU0hBUlBTTAogCXNlbGVjdCBQWEEyNXgKKwlzZWxlY3QgUFhBX0hBVkVfQk9BUkRfSVJRUworCitjb25maWcgQVJDSF9WSVBFUgorCWJvb2wgIkFyY29tL0V1cm90ZWNoIFZJUEVSIFNCQyIKKwlzZWxlY3QgUFhBMjV4CisJc2VsZWN0IElTQQorCXNlbGVjdCBJMkNfR1BJTworCXNlbGVjdCBIQVZFX1BXTQorCXNlbGVjdCBQWEFfSEFWRV9CT0FSRF9JUlFTCisJc2VsZWN0IFBYQV9IQVZFX0lTQV9JUlFTCiAKIGNvbmZpZyBBUkNIX1BYQV9FU0VSSUVTCiAJYm9vbCAiUFhBIGJhc2VkIFRvc2hpYmEgZS1zZXJpZXMgUERBcyIKIAlzZWxlY3QgUFhBMjV4CisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKIAogY29uZmlnIE1BQ0hfRTMzMAogCWJvb2wgIlRvc2hpYmEgZTMzMCIKQEAgLTE3MCwxMyArMTg4LDQxIEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEgVG9zaGliYQogCSAgZTgwMCBmYW1pbHkgUERBLgogCitjb25maWcgVFJJWkVQU19QWEEKKwlib29sICJQWEEgYmFzZWQgS2VpdGggdW5kIEtvZXAgVHJpemVwcyBESU1NLU1vZHVsZXMiCisKIGNvbmZpZyBNQUNIX1RSSVpFUFM0CiAJYm9vbCAiS2VpdGggdW5kIEtvZXAgVHJpemVwczQgRElNTS1Nb2R1bGUiCisJZGVwZW5kcyBvbiBUUklaRVBTX1BYQQorCXNlbGVjdCBUUklaRVBTX1BDTUNJQQogCXNlbGVjdCBQWEEyN3gKIAotY29uZmlnIE1BQ0hfVFJJWkVQUzRfQ09OWFMKK2NvbmZpZyBNQUNIX1RSSVpFUFM0V0wKKwlib29sICJLZWl0aCB1bmQgS29lcCBUcml6ZXBzNC1XTCBESU1NLU1vZHVsZSIKKwlkZXBlbmRzIG9uIFRSSVpFUFNfUFhBCisJc2VsZWN0IFRSSVpFUFNfUENNQ0lBCisJc2VsZWN0IFBYQTI3eAorCXNlbGVjdCBQWEFfU1NQCisKK2Nob2ljZQorCXByb21wdCAiU2VsZWN0IGJhc2UgYm9hcmQgZm9yIFRyaXplcHMgbW9kdWxlIgorCWRlcGVuZHMgb24gVFJJWkVQU19QWEEKKworY29uZmlnIE1BQ0hfVFJJWkVQU19DT05YUwogCWJvb2wgIkNvblhTIEV2YWwgQm9hcmQiCi0JZGVwZW5kcyBvbiBNQUNIX1RSSVpFUFM0CisKK2NvbmZpZyBNQUNIX1RSSVpFUFNfVUNPTlhTCisJYm9vbCAidUNvblhTIEV2YWwgQm9hcmQiCisKK2NvbmZpZyBNQUNIX1RSSVpFUFNfQU5ZCisJYm9vbCAiYW5vdGhlciBCb2FyZCIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBUUklaRVBTX1BDTUNJQQorCWJvb2wKKwloZWxwCisJICBFbmFibGUgUENNQ0lBIHN1cHBvcnQgZm9yIFRyaXplcHMgbW9kdWxlcwogCiBjb25maWcgTUFDSF9FTV9YMjcwCiAJYm9vbCAiQ29tcHVMYWIgRU0teDI3MCBwbGF0Zm9ybSIKQEAgLTE4OSw2ICsyMzUsNyBAQAogY29uZmlnIE1BQ0hfWllMT05JVEUKIAlib29sICJQWEEzeHggRGV2ZWxvcG1lbnQgUGxhdGZvcm0gKGFrYSBaeWxvbml0ZSkiCiAJc2VsZWN0IFBYQTN4eAorCXNlbGVjdCBQWEFfU1NQCiAJc2VsZWN0IEhBVkVfUFdNCiAKIGNvbmZpZyBNQUNIX0xJVFRMRVRPTgpAQCAtMjA3LDIwICsyNTQsNDIgQEAKIAlzZWxlY3QgUFhBOTMwCiAKIGNvbmZpZyBNQUNIX0FSTUNPUkUKLQlib29sICJDb21wdUxhYiBDTS1YMjcwIG1vZHVsZXMiCisJYm9vbCAiQ29tcHVMYWIgQ00tWDI1NS9DTS1YMjcwIG1vZHVsZXMiCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBJV01NWFQKKwlzZWxlY3QgWk9ORV9ETUEgaWYgUENJCisJc2VsZWN0IFBYQTI1eAorCXNlbGVjdCBQWEFfU1NQCisKK2NvbmZpZyBNQUNIX0NNX1gzMDAKKwlib29sICJDb21wdUxhYiBDTS1YMzAwIG1vZHVsZXMiCisJc2VsZWN0IFBYQTN4eAorCXNlbGVjdCBDUFVfUFhBMzAwCiAKIGNvbmZpZyBNQUNIX01BR0lDSUFOCiAJYm9vbCAiRW5hYmxlIEhUQyBNYWdpY2lhbiBTdXBwb3J0IgogCXNlbGVjdCBQWEEyN3gKIAlzZWxlY3QgSVdNTVhUCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKKworY29uZmlnIE1BQ0hfTUlPQTcwMQorCWJvb2wgIk1pdGFjIE1pbyBBNzAxIFN1cHBvcnQiCisJc2VsZWN0IFBYQTI3eAorCXNlbGVjdCBJV01NWFQKKwlzZWxlY3QgTEVEU19HUElPCisJc2VsZWN0IEhBVkVfUFdNCisJc2VsZWN0IEdQSU9fU1lTRlMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEKKwkgIE1JTyBBNzAxLiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBiYXNpYyBzdXBwb3J0CisJICBmb3IgdGhpcyBQREEuCiAKIGNvbmZpZyBNQUNIX1BDTTAyNwogCWJvb2wgIlBoeXRlYyBwaHlDT1JFLVBYQTI3MCBDUFUgbW9kdWxlIChQQ00tMDI3KSIKIAlzZWxlY3QgUFhBMjd4CiAJc2VsZWN0IElXTU1YVAogCXNlbGVjdCBQWEFfU1NQCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKIAogY29uZmlnIEFSQ0hfUFhBX1BBTE0KIAlib29sICJQWEEgYmFzZWQgUGFsbSBQREFzIgpAQCAtMjM2LDYgKzMwNSwxNiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIFBhbG0gVHxYCiAJICBoYW5kaGVsZCBjb21wdXRlci4KIAorY29uZmlnIE1BQ0hfUEFMTVo3MgorCWJvb2wgIlBhbG0gWmlyZSA3MiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBX1BBTE0KKwlzZWxlY3QgUFhBMjd4CisJc2VsZWN0IElXTU1YVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gUGFsbSBaaXJlIDcyCisJICBoYW5kaGVsZCBjb21wdXRlci4KKwogY29uZmlnIE1BQ0hfUENNOTkwX0JBU0VCT0FSRAogCWJvb2wgIlBIWVRFQyBQQ00tOTkwIGRldmVsb3BtZW50IGJvYXJkIgogCXNlbGVjdCBIQVZFX1BXTQpAQCAtMjU2LDYgKzMzNSw5IEBACiAKIGVuZGNob2ljZQogCitjb25maWcgTUFDSF9BTTIwMEVQRAorCWRlcGVuZHMgb24gTUFDSF9HVU1TVElYX0YKKwlib29sICJFbmFibGUgQU0yMDBFUEQgYm9hcmQgc3VwcG9ydCIKIAogY29uZmlnIFBYQV9FWlgKIAlib29sICJNb3Rvcm9sYSBFWlggUGxhdGZvcm0iCkBAIC0zNDMsNCArNDI1LDEwIEBACiAJICBUaGlzIGlzIGEgc2ltcGxlIGRyaXZlciB0aGF0IGlzIGFibGUgdG8gY29udHJvbAogCSAgdGhlIHN0YXRlIG9mIGJ1aWx0IGluIGJsdWV0b290aCBjaGlwIG9uIHRvc2EuCiAKK2NvbmZpZyBQWEFfSEFWRV9CT0FSRF9JUlFTCisJYm9vbAorCitjb25maWcgUFhBX0hBVkVfSVNBX0lSUVMKKwlib29sCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCmluZGV4IDk5ZWNiZTcuLmQzMWM5OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlCkBAIC02LDcgKzYsMTIgQEAKIG9iai15CQkJCSs9IGNsb2NrLm8gZGV2aWNlcy5vIGdlbmVyaWMubyBpcnEubyBkbWEubyBcCiAJCQkJICAgdGltZS5vIGdwaW8ubyByZXNldC5vCiBvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vIHNsZWVwLm8gc3RhbmRieS5vCi1vYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkrPSBjcHUtcHhhLm8KKworaWZlcSAoJChDT05GSUdfQ1BVX0ZSRVEpLHkpCitvYmotJChDT05GSUdfUFhBMjV4KQkJKz0gY3B1ZnJlcS1weGEyeHgubworb2JqLSQoQ09ORklHX1BYQTI3eCkJCSs9IGNwdWZyZXEtcHhhMnh4Lm8KK29iai0kKENPTkZJR19QWEEzeHgpCQkrPSBjcHVmcmVxLXB4YTN4eC5vCitlbmRpZgogCiAjIEdlbmVyaWMgZHJpdmVycyB0aGF0IG90aGVyIGRyaXZlcnMgbWF5IGRlcGVuZCB1cG9uCiBvYmotJChDT05GSUdfUFhBX1NTUCkJCSs9IHNzcC5vCkBAIC0yMiwyNyArMjcsMzMgQEAKIAogIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0CiBvYmotJChDT05GSUdfQVJDSF9HVU1TVElYKQkrPSBndW1zdGl4Lm8KK29iai0kKENPTkZJR19NQUNIX0FNMjAwRVBEKQkrPSBhbTIwMGVwZC5vCiBvYmotJChDT05GSUdfQVJDSF9MVUJCT0NLKQkrPSBsdWJib2NrLm8KIG9iai0kKENPTkZJR19NQUNIX0xPR0lDUERfUFhBMjcwKSArPSBscGQyNzAubwogb2JqLSQoQ09ORklHX01BQ0hfTUFJTlNUT05FKQkrPSBtYWluc3RvbmUubworb2JqLSQoQ09ORklHX01BQ0hfTVA5MDBDKQkrPSBtcDkwMC5vCiBvYmotJChDT05GSUdfQVJDSF9QWEFfSURQKQkrPSBpZHAubwogb2JqLSQoQ09ORklHX01BQ0hfVFJJWkVQUzQpCSs9IHRyaXplcHM0Lm8KIG9iai0kKENPTkZJR19NQUNIX0NPTElCUkkpCSs9IGNvbGlicmkubwotb2JqLSQoQ09ORklHX1BYQV9TSEFSUF9DN3h4KQkrPSBjb3JnaS5vIGNvcmdpX3NzcC5vIGNvcmdpX2xjZC5vIHNoYXJwc2xfcG0ubyBjb3JnaV9wbS5vCi1vYmotJChDT05GSUdfUFhBX1NIQVJQX0N4eDAwKQkrPSBzcGl0ei5vIGNvcmdpX3NzcC5vIGNvcmdpX2xjZC5vIHNoYXJwc2xfcG0ubyBzcGl0el9wbS5vCi1vYmotJChDT05GSUdfTUFDSF9BS0lUQSkJKz0gYWtpdGEtaW9leHAubwotb2JqLSQoQ09ORklHX01BQ0hfUE9PRExFKQkrPSBwb29kbGUubyBjb3JnaV9zc3Aubworb2JqLSQoQ09ORklHX1BYQV9TSEFSUF9DN3h4KQkrPSBjb3JnaS5vIHNoYXJwc2xfcG0ubyBjb3JnaV9wbS5vCitvYmotJChDT05GSUdfUFhBX1NIQVJQX0N4eDAwKQkrPSBzcGl0ei5vIHNoYXJwc2xfcG0ubyBzcGl0el9wbS5vCitvYmotJChDT05GSUdfTUFDSF9QT09ETEUpCSs9IHBvb2RsZS5vCiBvYmotJChDT05GSUdfTUFDSF9QQ00wMjcpCSs9IHBjbTAyNy5vCiBvYmotJChDT05GSUdfTUFDSF9QQ005OTBfQkFTRUJPQVJEKQkrPSBwY205OTAtYmFzZWJvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX1RPU0EpCQkrPSB0b3NhLm8KIG9iai0kKENPTkZJR19NQUNIX0VNX1gyNzApCSs9IGVtLXgyNzAubwogb2JqLSQoQ09ORklHX01BQ0hfTUFHSUNJQU4pCSs9IG1hZ2ljaWFuLm8KLW9iai0kKENPTkZJR19BUkNIX1BYQV9FU0VSSUVTKQkrPSBlc2VyaWVzLm8gZXNlcmllc191ZGMubwotb2JqLSQoQ09ORklHX01BQ0hfRTc0MCkJCSs9IGU3NDBfbGNkLm8KLW9iai0kKENPTkZJR19NQUNIX0U3NTApCQkrPSBlNzUwX2xjZC5vCi1vYmotJChDT05GSUdfTUFDSF9FNDAwKQkJKz0gZTQwMF9sY2Qubwotb2JqLSQoQ09ORklHX01BQ0hfRTgwMCkJCSs9IGU4MDBfbGNkLm8KK29iai0kKENPTkZJR19NQUNIX01JT0E3MDEpCSs9IG1pb2E3MDEubyBtaW9hNzAxX2Jvb3RyZXN1bWUubworb2JqLSQoQ09ORklHX0FSQ0hfUFhBX0VTRVJJRVMpCSs9IGVzZXJpZXMubworb2JqLSQoQ09ORklHX01BQ0hfRTMzMCkJCSs9IGUzMzAubworb2JqLSQoQ09ORklHX01BQ0hfRTM1MCkJCSs9IGUzNTAubworb2JqLSQoQ09ORklHX01BQ0hfRTc0MCkJCSs9IGU3NDAubworb2JqLSQoQ09ORklHX01BQ0hfRTc1MCkJCSs9IGU3NTAubworb2JqLSQoQ09ORklHX01BQ0hfRTQwMCkJCSs9IGU0MDAubworb2JqLSQoQ09ORklHX01BQ0hfRTgwMCkJCSs9IGU4MDAubwogb2JqLSQoQ09ORklHX01BQ0hfUEFMTVRYKQkrPSBwYWxtdHgubworb2JqLSQoQ09ORklHX01BQ0hfUEFMTVo3MikJKz0gcGFsbXo3Mi5vCitvYmotJChDT05GSUdfQVJDSF9WSVBFUikJKz0gdmlwZXIubwogCiBpZmVxICgkKENPTkZJR19NQUNIX1pZTE9OSVRFKSx5KQogICBvYmoteQkJCQkrPSB6eWxvbml0ZS5vCkBAIC01Myw3ICs2NCw4IEBACiBvYmotJChDT05GSUdfTUFDSF9UQVZPUkVWQikJKz0gdGF2b3JldmIubwogb2JqLSQoQ09ORklHX01BQ0hfU0FBUikJCSs9IHNhYXIubwogCi1vYmotJChDT05GSUdfTUFDSF9BUk1DT1JFKSAgICAgICs9IGNtLXgyNzAubworb2JqLSQoQ09ORklHX01BQ0hfQVJNQ09SRSkgICAgICArPSBjbS14Mnh4Lm8gY20teDI1NS5vIGNtLXgyNzAubworb2JqLSQoQ09ORklHX01BQ0hfQ01fWDMwMCkgICAgICArPSBjbS14MzAwLm8KIG9iai0kKENPTkZJR19QWEFfRVpYKSAgICAgICAgICAgKz0gZXp4Lm8KIAogIyBTdXBwb3J0IGZvciBibGlua3kgbGlnaHRzCkBAIC02MSwxMiArNzMsMTEgQEAKIGxlZC0kKENPTkZJR19BUkNIX0xVQkJPQ0spCSs9IGxlZHMtbHViYm9jay5vCiBsZWQtJChDT05GSUdfTUFDSF9NQUlOU1RPTkUpCSs9IGxlZHMtbWFpbnN0b25lLm8KIGxlZC0kKENPTkZJR19BUkNIX1BYQV9JRFApCSs9IGxlZHMtaWRwLm8KLWxlZC0kKENPTkZJR19NQUNIX1RSSVpFUFM0KQkrPSBsZWRzLXRyaXplcHM0Lm8KIAogb2JqLSQoQ09ORklHX0xFRFMpCQkrPSAkKGxlZC15KQogCiBpZmVxICgkKENPTkZJR19QQ0kpLHkpCi1vYmotJChDT05GSUdfTUFDSF9BUk1DT1JFKSArPSBjbS14MjcwLXBjaS5vCitvYmotJChDT05GSUdfTUFDSF9BUk1DT1JFKSArPSBjbS14Mnh4LXBjaS5vCiBlbmRpZgogCiBvYmotJChDT05GSUdfVE9TQV9CVCkJCSs9IHRvc2EtYnQubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvYWtpdGEtaW9leHAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2FraXRhLWlvZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjdiMTguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvYWtpdGEtaW9leHAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogU3VwcG9ydCBmb3IgdGhlIEV4dHJhIEdQSU9zIG9uIHRoZSBTaGFycCBTTC1DMTAwMCAoQWtpdGEpCi0gKiAodXNlcyBhIE1heGltIE1BWDczMTAgOCBQb3J0IElPIEV4cGFuZGVyKQotICoKLSAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgotICoKLSAqIEF1dGhvcjogUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ha2l0YS5oPgotCi0vKiBNQVg3MzEwIFJlZ2lzZXIgTWFwICovCi0jZGVmaW5lIE1BWDczMTBfSU5QVVQgICAgMHgwMAotI2RlZmluZSBNQVg3MzEwX09VVFBVVCAgIDB4MDEKLSNkZWZpbmUgTUFYNzMxMF9QT0xJTlYgICAweDAyCi0jZGVmaW5lIE1BWDczMTBfSU9ESVIgICAgMHgwMyAvKiAxID0gSW5wdXQsIDAgPSBPdXRwdXQgKi8KLSNkZWZpbmUgTUFYNzMxMF9USU1FT1VUICAweDA0Ci0KLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDE4LCBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBJMkMgTWFnaWMgKi8KLUkyQ19DTElFTlRfSU5TTU9EOwotCi1zdGF0aWMgaW50IG1heDczMTBfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHJlc3MsIGludCBkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBtYXg3MzEwX3RlbXBsYXRlOwotc3RhdGljIHZvaWQgYWtpdGFfaW9leHBfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnByaXZhdGVfKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmFraXRhX2lvZXhwX2RldmljZTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlvZXhwX291dHB1dF92YWx1ZSA9IEFLSVRBX0lPRVhQX0lPX09VVDsKLURFQ0xBUkVfV09SSyhha2l0YV9pb2V4cCwgYWtpdGFfaW9leHBfd29yayk7Ci0KLQotLyoKLSAqIE1BWDczMTAgQWNjZXNzCi0gKi8KLXN0YXRpYyBpbnQgbWF4NzMxMF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW9tb2RlLCBpbnQgcG9sYXJpdHkpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JcmV0ID0gbWF4NzMxMF93cml0ZShjbGllbnQsIE1BWDczMTBfUE9MSU5WLCBwb2xhcml0eSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gbWF4NzMxMF93cml0ZShjbGllbnQsIE1BWDczMTBfSU9ESVIsIGlvbW9kZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYXg3MzEwX3NldF9vdXB1dHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgb3V0cHV0cykKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JcmV0dXJuIG1heDczMTBfd3JpdGUoY2xpZW50LCBNQVg3MzEwX09VVFBVVCwgb3V0cHV0cyk7Ci19Ci0KLS8qCi0gKiBJMkMgRnVuY3Rpb25zCi0gKi8KLXN0YXRpYyBpbnQgbWF4NzMxMF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkcmVzcywgaW50IHZhbHVlKQotewotCXU4IGRhdGFbMl07Ci0KLQlkYXRhWzBdID0gYWRkcmVzcyAmIDB4ZmY7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKLQotCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCAyKSA9PSAyKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NzMxMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7Ci0JaW50IGVycjsKLQotCWlmICghKG5ld19jbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXg3MzEwX3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwdGVyOwotCW1heDczMTBfdGVtcGxhdGUuYWRkciA9IGFkZHJlc3M7Ci0KLQltZW1jcHkobmV3X2NsaWVudCwgJm1heDczMTBfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpIHsKLQkJa2ZyZWUobmV3X2NsaWVudCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JbWF4NzMxMF9jb25maWcoJm5ld19jbGllbnQtPmRldiwgQUtJVEFfSU9FWFBfSU9fRElSLCAwKTsKLQlha2l0YV9pb2V4cF9kZXZpY2UgPSAmbmV3X2NsaWVudC0+ZGV2OwotCXNjaGVkdWxlX3dvcmsoJmFraXRhX2lvZXhwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDczMTBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotewotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbWF4NzMxMF9kZXRlY3QpOwotfQotCi1zdGF0aWMgaW50IG1heDczMTBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludCBlcnI7Ci0KLQlha2l0YV9pb2V4cF9kZXZpY2UgPSBOVUxMOwotCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKLQkJcmV0dXJuIGVycjsKLQotCWtmcmVlKGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg3MzEwX2kyY19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiYWtpdGEtbWF4NzMxMCIsCi0JfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0FLSVRBSU9FWFAsCi0JLmF0dGFjaF9hZGFwdGVyCT0gbWF4NzMxMF9hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudAk9IG1heDczMTBfZGV0YWNoX2NsaWVudCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBtYXg3MzEwX3RlbXBsYXRlID0gewotCW5hbWU6ICAgImFraXRhLW1heDczMTAiLAotCWRyaXZlcjogJm1heDczMTBfaTJjX2RyaXZlciwKLX07Ci0KLXZvaWQgYWtpdGFfc2V0X2lvZXhwKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBiaXQpCi17Ci0JaW9leHBfb3V0cHV0X3ZhbHVlIHw9IGJpdDsKLQotCWlmIChha2l0YV9pb2V4cF9kZXZpY2UpCi0JCXNjaGVkdWxlX3dvcmsoJmFraXRhX2lvZXhwKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgYWtpdGFfcmVzZXRfaW9leHAoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGJpdCkKLXsKLQlpb2V4cF9vdXRwdXRfdmFsdWUgJj0gfmJpdDsKLQotCWlmIChha2l0YV9pb2V4cF9kZXZpY2UpCi0JCXNjaGVkdWxlX3dvcmsoJmFraXRhX2lvZXhwKTsKLQlyZXR1cm47Ci19Ci0KLUVYUE9SVF9TWU1CT0woYWtpdGFfc2V0X2lvZXhwKTsKLUVYUE9SVF9TWU1CT0woYWtpdGFfcmVzZXRfaW9leHApOwotCi1zdGF0aWMgdm9pZCBha2l0YV9pb2V4cF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHJpdmF0ZV8pCi17Ci0JaWYgKGFraXRhX2lvZXhwX2RldmljZSkKLQkJbWF4NzMxMF9zZXRfb3VwdXRzKGFraXRhX2lvZXhwX2RldmljZSwgaW9leHBfb3V0cHV0X3ZhbHVlKTsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFraXRhX2lvZXhwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWtpdGFfaW9leHBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc2NoZWR1bGVfd29yaygmYWtpdGFfaW9leHApOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYWtpdGFfaW9leHBfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGFraXRhX2lvZXhwX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYWtpdGFfaW9leHBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDczMTBfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgYWtpdGFfaW9leHBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJm1heDczMTBfaTJjX2RyaXZlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFraXRhX2lvZXhwX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYWtpdGFfaW9leHBfcHJvYmUsCi0JLnJlbW92ZQkJPSBha2l0YV9pb2V4cF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBha2l0YV9pb2V4cF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYWtpdGFfaW9leHBfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJha2l0YS1pb2V4cCIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFraXRhX2lvZXhwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZha2l0YV9pb2V4cF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWtpdGFfaW9leHBfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZha2l0YV9pb2V4cF9kcml2ZXIpOwotfQotCi1NT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBvcGVuZWRoYW5kLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQWtpdGEgSU8tRXhwYW5kZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLWZzX2luaXRjYWxsKGFraXRhX2lvZXhwX2luaXQpOwotbW9kdWxlX2V4aXQoYWtpdGFfaW9leHBfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2FtMjAwZXBkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9hbTIwMGVwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjUwODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9hbTIwMGVwZC5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogYW0yMDBlcGQuYyAtLSBQbGF0Zm9ybSBkZXZpY2UgZm9yIEFNMjAwIEVQRCBraXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEpheWEgS3VtYXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBMYXlvdXQgaXMgYmFzZWQgb24gc2tlbGV0b25mYi5jIGJ5IEphbWVzIFNpbW1vbnMgYW5kIEdlZXJ0IFV5dHRlcmhvZXZlbi4KKyAqCisgKiBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgYnkgaGVscCBhbmQgZXF1aXBtZW50IHN1cHBvcnQgZnJvbSBFLUluaworICogQ29ycG9yYXRpb24uIGh0dHA6Ly9zdXBwb3J0LmVpbmsuY29tL2NvbW11bml0eQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gdG8gYmUgdXNlZCB3aXRoIHRoZSBNZXRyb25vbWUgZGlzcGxheSBjb250cm9sbGVyLgorICogb24gdGhlIEFNMjAwIEVQRCBwcm90b3R5cGUga2l0L2RldmVsb3BtZW50IGtpdCB3aXRoIGFuIEUtSW5rIDgwMHg2MDAKKyAqIFZpenBsZXggRVBEIG9uIGEgR3Vtc3RpeCBib2FyZCB1c2luZyB0aGUgTHlyZSBpbnRlcmZhY2UgYm9hcmQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorCisjaW5jbHVkZSA8dmlkZW8vbWV0cm9ub21lZmIuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBwYW5lbF90eXBlID0gNjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphbTIwMF9kZXZpY2U7CitzdGF0aWMgc3RydWN0IG1ldHJvbm9tZV9ib2FyZCBhbTIwMF9ib2FyZDsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gYW0yMDBfZmJfbW9kZV85aW5jaDcgPSB7CisJLnBpeGNsb2NrCT0gNDAwMDAsCisJLnhyZXMJCT0gMTIwMCwKKwkueXJlcwkJPSA4NDIsCisJLmJwcAkJPSAxNiwKKwkuaHN5bmNfbGVuCT0gMiwKKwkubGVmdF9tYXJnaW4JPSAyLAorCS5yaWdodF9tYXJnaW4JPSAyLAorCS52c3luY19sZW4JPSAxLAorCS51cHBlcl9tYXJnaW4JPSAyLAorCS5sb3dlcl9tYXJnaW4JPSAyNSwKKwkuc3luYwkJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGFtMjAwX2ZiX21vZGVfOGluY2ggPSB7CisJLnBpeGNsb2NrCT0gNDAwMDAsCisJLnhyZXMJCT0gMTA4OCwKKwkueXJlcwkJPSA3OTEsCisJLmJwcAkJPSAxNiwKKwkuaHN5bmNfbGVuCT0gMjgsCisJLmxlZnRfbWFyZ2luCT0gOCwKKwkucmlnaHRfbWFyZ2luCT0gMzAsCisJLnZzeW5jX2xlbgk9IDgsCisJLnVwcGVyX21hcmdpbgk9IDEwLAorCS5sb3dlcl9tYXJnaW4JPSA4LAorCS5zeW5jCQk9IEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gYW0yMDBfZmJfbW9kZV82aW5jaCA9IHsKKwkucGl4Y2xvY2sJPSA0MDE4OSwKKwkueHJlcwkJPSA4MzIsCisJLnlyZXMJCT0gNjIyLAorCS5icHAJCT0gMTYsCisJLmhzeW5jX2xlbgk9IDI4LAorCS5sZWZ0X21hcmdpbgk9IDM0LAorCS5yaWdodF9tYXJnaW4JPSAzNCwKKwkudnN5bmNfbGVuCT0gMjUsCisJLnVwcGVyX21hcmdpbgk9IDAsCisJLmxvd2VyX21hcmdpbgk9IDIsCisJLnN5bmMJCT0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBhbTIwMF9mYl9pbmZvID0geworCS5tb2RlcwkJPSAmYW0yMDBfZmJfbW9kZV82aW5jaCwKKwkubnVtX21vZGVzCT0gMSwKKwkubGNkX2Nvbm4JPSBMQ0RfVFlQRV9DT0xPUl9URlQgfCBMQ0RfUENMS19FREdFX0ZBTEwgfAorCQkJICBMQ0RfQUNfQklBU19GUkVRKDI0KSwKK307CisKKy8qIHJlZ2lzdGVyIG9mZnNldHMgZm9yIGdwaW8gY29udHJvbCAqLworI2RlZmluZSBMRURfR1BJT19QSU4gNTEKKyNkZWZpbmUgU1REQllfR1BJT19QSU4gNDgKKyNkZWZpbmUgUlNUX0dQSU9fUElOIDQ5CisjZGVmaW5lIFJEWV9HUElPX1BJTiAzMgorI2RlZmluZSBFUlJfR1BJT19QSU4gMTcKKyNkZWZpbmUgUENCUFdSX0dQSU9fUElOIDE2CitzdGF0aWMgaW50IGdwaW9zW10gPSB7IExFRF9HUElPX1BJTiAsIFNUREJZX0dQSU9fUElOICwgUlNUX0dQSU9fUElOLAorCQkJUkRZX0dQSU9fUElOLCBFUlJfR1BJT19QSU4sIFBDQlBXUl9HUElPX1BJTiB9Oworc3RhdGljIGNoYXIgKmdwaW9fbmFtZXNbXSA9IHsgIkxFRCIgLCAiU1REQlkiICwgIlJTVCIsICJSRFkiLCAiRVJSIiwgIlBDQlBXUiIgfTsKKworc3RhdGljIGludCBhbTIwMF9pbml0X2dwaW9fcmVncyhzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIpCit7CisJaW50IGk7CisJaW50IGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9zKTsgaSsrKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdChncGlvc1tpXSwgZ3Bpb19uYW1lc1tpXSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJmFtMjAwX2RldmljZS0+ZGV2LCAiZmFpbGVkIHJlcXVlc3RpbmcgIgorCQkJCSJncGlvICVzLCBlcnI9JWRcbiIsIGdwaW9fbmFtZXNbaV0sIGVycik7CisJCQlnb3RvIGVycl9yZXFfZ3BpbzsKKwkJfQorCX0KKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChMRURfR1BJT19QSU4sIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChTVERCWV9HUElPX1BJTiwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFJTVF9HUElPX1BJTiwgMCk7CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChSRFlfR1BJT19QSU4pOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KEVSUl9HUElPX1BJTik7CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUENCUFdSX0dQSU9fUElOLCAwKTsKKworCXJldHVybiAwOworCitlcnJfcmVxX2dwaW86CisJd2hpbGUgKGkgPiAwKQorCQlncGlvX2ZyZWUoZ3Bpb3NbaS0tXSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhbTIwMF9jbGVhbnVwKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcikKK3sKKwlpbnQgaTsKKworCWZyZWVfaXJxKElSUV9HUElPKFJEWV9HUElPX1BJTiksIHBhcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGlvcyk7IGkrKykKKwkJZ3Bpb19mcmVlKGdwaW9zW2ldKTsKK30KKworc3RhdGljIGludCBhbTIwMF9zaGFyZV92aWRlb19tZW0oc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJLyogcm91Z2ggY2hlY2sgaWYgdGhpcyBpcyBvdXIgZGVzaXJlZCBmYiBhbmQgbm90IHNvbWV0aGluZyBlbHNlICovCisJaWYgKChpbmZvLT52YXIueHJlcyAhPSBhbTIwMF9mYl9pbmZvLm1vZGVzLT54cmVzKQorCQl8fCAoaW5mby0+dmFyLnlyZXMgIT0gYW0yMDBfZmJfaW5mby5tb2Rlcy0+eXJlcykpCisJCXJldHVybiAwOworCisJLyogd2UndmUgbm93IGJlZW4gbm90aWZpZWQgdGhhdCB3ZSBoYXZlIG91ciBuZXcgZmIgKi8KKwlhbTIwMF9ib2FyZC5tZXRyb21lbSA9IGluZm8tPnNjcmVlbl9iYXNlOworCWFtMjAwX2JvYXJkLmhvc3RfZmJpbmZvID0gaW5mbzsKKworCS8qIHRyeSB0byByZWZjb3VudCBob3N0IGRydiBzaW5jZSB3ZSBhcmUgdGhlIGNvbnN1bWVyIGFmdGVyIHRoaXMgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGluZm8tPmZib3BzLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW0yMDBfdW5zaGFyZV92aWRlb19tZW0oc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJZGV2X2RiZygmYW0yMDBfZGV2aWNlLT5kZXYsICJFTlRFUiAlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGluZm8gIT0gYW0yMDBfYm9hcmQuaG9zdF9mYmluZm8pCisJCXJldHVybiAwOworCisJbW9kdWxlX3B1dChhbTIwMF9ib2FyZC5ob3N0X2ZiaW5mby0+ZmJvcHMtPm93bmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbTIwMF9mYl9ub3RpZmllcl9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZiX2V2ZW50ICpldmRhdGEgPSBkYXRhOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZXZkYXRhLT5pbmZvOworCisJZGV2X2RiZygmYW0yMDBfZGV2aWNlLT5kZXYsICJFTlRFUiAlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGV2ZW50ID09IEZCX0VWRU5UX0ZCX1JFR0lTVEVSRUQpCisJCXJldHVybiBhbTIwMF9zaGFyZV92aWRlb19tZW0oaW5mbyk7CisJZWxzZSBpZiAoZXZlbnQgPT0gRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVEKQorCQlyZXR1cm4gYW0yMDBfdW5zaGFyZV92aWRlb19tZW0oaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBhbTIwMF9mYl9ub3RpZiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGFtMjAwX2ZiX25vdGlmaWVyX2NhbGxiYWNrLAorfTsKKworLyogdGhpcyBnZXRzIGNhbGxlZCBhcyBwYXJ0IG9mIG91ciBpbml0LiB0aGVzZSBzdGVwcyBtdXN0IGJlIGRvbmUgbm93IHNvCisgKiB0aGF0IHdlIGNhbiB1c2Ugc2V0X3B4YV9mYl9pbmZvICovCitzdGF0aWMgdm9pZCBfX2luaXQgYW0yMDBfcHJlc2V0dXBfZmIodm9pZCkKK3sKKwlpbnQgZnc7CisJaW50IGZoOworCWludCBwYWRkaW5nX3NpemU7CisJaW50IHRvdGFsc2l6ZTsKKworCXN3aXRjaCAocGFuZWxfdHlwZSkgeworCWNhc2UgNjoKKwkJYW0yMDBfZmJfaW5mby5tb2RlcyA9ICZhbTIwMF9mYl9tb2RlXzZpbmNoOworCQlicmVhazsKKwljYXNlIDg6CisJCWFtMjAwX2ZiX2luZm8ubW9kZXMgPSAmYW0yMDBfZmJfbW9kZV84aW5jaDsKKwkJYnJlYWs7CisJY2FzZSA5NzoKKwkJYW0yMDBfZmJfaW5mby5tb2RlcyA9ICZhbTIwMF9mYl9tb2RlXzlpbmNoNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmYW0yMDBfZGV2aWNlLT5kZXYsICJpbnZhbGlkIHBhbmVsX3R5cGUgc2VsZWN0aW9uLCIKKwkJCQkJCSIgc2V0dGluZyB0byA2XG4iKTsKKwkJYW0yMDBfZmJfaW5mby5tb2RlcyA9ICZhbTIwMF9mYl9tb2RlXzZpbmNoOworCQlicmVhazsKKwl9CisKKwkvKiB0aGUgZnJhbWUgYnVmZmVyIGlzIGRpdmlkZWQgYXMgZm9sbG93czoKKwljb21tYW5kIHwgQ1JDIHwgcGFkZGluZworCTE2a2Igd2F2ZWZvcm0gZGF0YSB8IENSQyB8IHBhZGRpbmcKKwlpbWFnZSBkYXRhIHwgQ1JDCisJKi8KKworCWZ3ID0gYW0yMDBfZmJfaW5mby5tb2Rlcy0+eHJlczsKKwlmaCA9IGFtMjAwX2ZiX2luZm8ubW9kZXMtPnlyZXM7CisKKwkvKiB3YXZlZm9ybSBtdXN0IGJlIDE2ayArIDIgZm9yIGNoZWNrc3VtICovCisJYW0yMDBfYm9hcmQud2ZtX3NpemUgPSByb3VuZHVwKDE2KjEwMjQgKyAyLCBmdyk7CisKKwlwYWRkaW5nX3NpemUgPSBQQUdFX1NJWkUgKyAoNCAqIGZ3KTsKKworCS8qIHRvdGFsIGlzIDEgY21kICwgMSB3Zm0sIHBhZGRpbmcgYW5kIGltYWdlICovCisJdG90YWxzaXplID0gZncgKyBhbTIwMF9ib2FyZC53Zm1fc2l6ZSArIHBhZGRpbmdfc2l6ZSArIChmdypmaCk7CisKKwkvKiBzYXZlIHRoaXMgb2ZmIGJlY2F1c2Ugd2UncmUgbWFuaXB1bGF0aW5nIGZ3IGFmdGVyIHRoaXMgYW5kCisJICogd2UnbGwgbmVlZCBpdCB3aGVuIHdlJ3JlIHJlYWR5IHRvIHNldHVwIHRoZSBmcmFtZWJ1ZmZlciAqLworCWFtMjAwX2JvYXJkLmZ3ID0gZnc7CisJYW0yMDBfYm9hcmQuZmggPSBmaDsKKworCS8qIHRoZSByZWFzb24gd2UgZG8gdGhpcyBhZGp1c3RtZW50IGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBhY3F1aXJlCisJICogbW9yZSBmcmFtZWJ1ZmZlciBtZW1vcnkgd2l0aG91dCBpbXBvc2luZyBjdXN0b20gYXdhcmVuZXNzIG9uIHRoZQorCSAqIHVuZGVybHlpbmcgcHhhZmIgZHJpdmVyICovCisJYW0yMDBfZmJfaW5mby5tb2Rlcy0+eXJlcyA9IERJVl9ST1VORF9VUCh0b3RhbHNpemUsIGZ3KTsKKworCS8qIHdlIGRpdmlkZSBzaW5jZSB3ZSB0b2xkIHRoZSBMQ0QgY29udHJvbGxlciB3ZSdyZSAxNmJwcCAqLworCWFtMjAwX2ZiX2luZm8ubW9kZXMtPnhyZXMgLz0gMjsKKworCXNldF9weGFfZmJfaW5mbygmYW0yMDBfZmJfaW5mbyk7CisKK30KKworLyogdGhpcyBnZXRzIGNhbGxlZCBieSBtZXRyb25vbWVmYiBhcyBwYXJ0IG9mIGl0cyBpbml0LCBpbiBvdXIgY2FzZSwgd2UKKyAqIGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgaW5pdGlhbCBmcmFtZWJ1ZmZlciBpbml0IGluIHByZXNldHVwX2ZiIHNvIHdlCisgKiBjYW4ganVzdCBzZXR1cCB0aGUgZmIgYWNjZXNzIHBvaW50ZXJzICovCitzdGF0aWMgaW50IGFtMjAwX3NldHVwX2ZiKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcikKK3sKKwlpbnQgZnc7CisJaW50IGZoOworCisJZncgPSBhbTIwMF9ib2FyZC5mdzsKKwlmaCA9IGFtMjAwX2JvYXJkLmZoOworCisJLyogbWV0cm9tZW0gd2FzIHNldCB1cCBieSB0aGUgbm90aWZpZXIgaW4gc2hhcmVfdmlkZW9fbWVtIHNvIG5vdworCSAqIHdlIGNhbiB1c2UgaXRzIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgb3RoZXIgZW50cmllcyAqLworCXBhci0+bWV0cm9tZW1fY21kID0gKHN0cnVjdCBtZXRyb21lbV9jbWQgKikgYW0yMDBfYm9hcmQubWV0cm9tZW07CisJcGFyLT5tZXRyb21lbV93Zm0gPSBhbTIwMF9ib2FyZC5tZXRyb21lbSArIGZ3OworCXBhci0+bWV0cm9tZW1faW1nID0gcGFyLT5tZXRyb21lbV93Zm0gKyBhbTIwMF9ib2FyZC53Zm1fc2l6ZTsKKwlwYXItPm1ldHJvbWVtX2ltZ19jc3VtID0gKHUxNiAqKSAocGFyLT5tZXRyb21lbV9pbWcgKyAoZncgKiBmaCkpOworCXBhci0+bWV0cm9tZW1fZG1hID0gYW0yMDBfYm9hcmQuaG9zdF9mYmluZm8tPmZpeC5zbWVtX3N0YXJ0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW0yMDBfZ2V0X3BhbmVsX3R5cGUodm9pZCkKK3sKKwlyZXR1cm4gcGFuZWxfdHlwZTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFtMjAwX2hhbmRsZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciA9IGRldl9pZDsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGFyLT53YWl0cSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFtMjAwX3NldHVwX2lycShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0dQSU8oUkRZX0dQSU9fUElOKSwgYW0yMDBfaGFuZGxlX2lycSwKKwkJCQlJUlFGX0RJU0FCTEVEfElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJBTTIwMCIsIGluZm8tPnBhcik7CisJaWYgKHJldCkKKwkJZGV2X2VycigmYW0yMDBfZGV2aWNlLT5kZXYsICJyZXF1ZXN0X2lycSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYW0yMDBfc2V0X3JzdChzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIsIGludCBzdGF0ZSkKK3sKKwlncGlvX3NldF92YWx1ZShSU1RfR1BJT19QSU4sIHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgYW0yMDBfc2V0X3N0ZGJ5KHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciwgaW50IHN0YXRlKQoreworCWdwaW9fc2V0X3ZhbHVlKFNUREJZX0dQSU9fUElOLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYW0yMDBfd2FpdF9ldmVudChzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIpCit7CisJcmV0dXJuIHdhaXRfZXZlbnRfdGltZW91dChwYXItPndhaXRxLCBncGlvX2dldF92YWx1ZShSRFlfR1BJT19QSU4pLCBIWik7Cit9CisKK3N0YXRpYyBpbnQgYW0yMDBfd2FpdF9ldmVudF9pbnRyKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcikKK3sKKwlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocGFyLT53YWl0cSwKKwkJCQkJZ3Bpb19nZXRfdmFsdWUoUkRZX0dQSU9fUElOKSwgSFopOworfQorCitzdGF0aWMgc3RydWN0IG1ldHJvbm9tZV9ib2FyZCBhbTIwMF9ib2FyZCA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5zZXR1cF9pcnEJCT0gYW0yMDBfc2V0dXBfaXJxLAorCS5zZXR1cF9pbwkJPSBhbTIwMF9pbml0X2dwaW9fcmVncywKKwkuc2V0dXBfZmIJCT0gYW0yMDBfc2V0dXBfZmIsCisJLnNldF9yc3QJCT0gYW0yMDBfc2V0X3JzdCwKKwkuc2V0X3N0ZGJ5CQk9IGFtMjAwX3NldF9zdGRieSwKKwkubWV0X3dhaXRfZXZlbnQJCT0gYW0yMDBfd2FpdF9ldmVudCwKKwkubWV0X3dhaXRfZXZlbnRfaW50cgk9IGFtMjAwX3dhaXRfZXZlbnRfaW50ciwKKwkuZ2V0X3BhbmVsX3R5cGUJCT0gYW0yMDBfZ2V0X3BhbmVsX3R5cGUsCisJLmNsZWFudXAJCT0gYW0yMDBfY2xlYW51cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFtMjAwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogYmVmb3JlIGFueXRoaW5nIGVsc2UsIHdlIHJlcXVlc3Qgbm90aWZpY2F0aW9uIGZvciBhbnkgZmIKKwkgKiBjcmVhdGlvbiBldmVudHMgKi8KKwlmYl9yZWdpc3Rlcl9jbGllbnQoJmFtMjAwX2ZiX25vdGlmKTsKKworCS8qIHJlcXVlc3Qgb3VyIHBsYXRmb3JtIGluZGVwZW5kZW50IGRyaXZlciAqLworCXJlcXVlc3RfbW9kdWxlKCJtZXRyb25vbWVmYiIpOworCisJYW0yMDBfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJtZXRyb25vbWVmYiIsIC0xKTsKKwlpZiAoIWFtMjAwX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGUgYW0yMDBfYm9hcmQgdGhhdCB3aWxsIGJlIHNlZW4gYnkgbWV0cm9ub21lZmIgaXMgYSBjb3B5ICovCisJcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGFtMjAwX2RldmljZSwgJmFtMjAwX2JvYXJkLAorCQkJCQlzaXplb2YoYW0yMDBfYm9hcmQpKTsKKworCS8qIHRoaXMgX2FkZCBiaW5kcyBtZXRyb25vbWVmYiB0byBhbTIwMC4gbWV0cm9ub21lZmIgcmVmY291bnRzIGFtMjAwICovCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhbTIwMF9kZXZpY2UpOworCisJaWYgKHJldCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGFtMjAwX2RldmljZSk7CisJCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZhbTIwMF9mYl9ub3RpZik7CisJCXJldHVybiByZXQ7CisJfQorCisJYW0yMDBfcHJlc2V0dXBfZmIoKTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfcGFyYW0ocGFuZWxfdHlwZSwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhbmVsX3R5cGUsICJTZWxlY3QgdGhlIHBhbmVsIHR5cGU6IDYsIDgsIDk3Iik7CisKK21vZHVsZV9pbml0KGFtMjAwX2luaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImJvYXJkIGRyaXZlciBmb3IgYW0yMDAgbWV0cm9ub21lIGVwZCBraXQiKTsKK01PRFVMRV9BVVRIT1IoIkpheWEgS3VtYXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNTUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2E0Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDI1NS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY20teDI1NS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IENvbXB1TGFiLCBMdGQuCisgKiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQtZ3Bpby5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9iaXRmaWVsZC5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisjZGVmaW5lIEdQSU9fTkFORF9DUwkoNSkKKyNkZWZpbmUgR1BJT19OQU5EX0FMRQkoNCkKKyNkZWZpbmUgR1BJT19OQU5EX0NMRQkoMykKKyNkZWZpbmUgR1BJT19OQU5EX1JCCSgxMCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY214MjU1X3Bpbl9jb25maWdbXSA9IHsKKwkvKiBBQyc5NyAqLworCUdQSU8yOF9BQzk3X0JJVENMSywKKwlHUElPMjlfQUM5N19TREFUQV9JTl8wLAorCUdQSU8zMF9BQzk3X1NEQVRBX09VVCwKKwlHUElPMzFfQUM5N19TWU5DLAorCisJLyogQlRVQVJUICovCisJR1BJTzQyX0JUVUFSVF9SWEQsCisJR1BJTzQzX0JUVUFSVF9UWEQsCisJR1BJTzQ0X0JUVUFSVF9DVFMsCisJR1BJTzQ1X0JUVUFSVF9SVFMsCisKKwkvKiBTVFVBUlQgKi8KKwlHUElPNDZfU1RVQVJUX1JYRCwKKwlHUElPNDdfU1RVQVJUX1RYRCwKKworCS8qIExDRCAqLworCUdQSU81OF9MQ0RfTEREXzAsCisJR1BJTzU5X0xDRF9MRERfMSwKKwlHUElPNjBfTENEX0xERF8yLAorCUdQSU82MV9MQ0RfTEREXzMsCisJR1BJTzYyX0xDRF9MRERfNCwKKwlHUElPNjNfTENEX0xERF81LAorCUdQSU82NF9MQ0RfTEREXzYsCisJR1BJTzY1X0xDRF9MRERfNywKKwlHUElPNjZfTENEX0xERF84LAorCUdQSU82N19MQ0RfTEREXzksCisJR1BJTzY4X0xDRF9MRERfMTAsCisJR1BJTzY5X0xDRF9MRERfMTEsCisJR1BJTzcwX0xDRF9MRERfMTIsCisJR1BJTzcxX0xDRF9MRERfMTMsCisJR1BJTzcyX0xDRF9MRERfMTQsCisJR1BJTzczX0xDRF9MRERfMTUsCisJR1BJTzc0X0xDRF9GQ0xLLAorCUdQSU83NV9MQ0RfTENMSywKKwlHUElPNzZfTENEX1BDTEssCisJR1BJTzc3X0xDRF9CSUFTLAorCisJLyogU1NQMSAqLworCUdQSU8yM19TU1AxX1NDTEssCisJR1BJTzI0X1NTUDFfU0ZSTSwKKwlHUElPMjVfU1NQMV9UWEQsCisJR1BJTzI2X1NTUDFfUlhELAorCisJLyogU1NQMiAqLworCUdQSU84MV9TU1AyX0NMS19PVVQsCisJR1BJTzgyX1NTUDJfRlJNX09VVCwKKwlHUElPODNfU1NQMl9UWEQsCisJR1BJTzg0X1NTUDJfUlhELAorCisJLyogUEMgQ2FyZCAqLworCUdQSU80OF9uUE9FLAorCUdQSU80OV9uUFdFLAorCUdQSU81MF9uUElPUiwKKwlHUElPNTFfblBJT1csCisJR1BJTzUyX25QQ0VfMSwKKwlHUElPNTNfblBDRV8yLAorCUdQSU81NF9uUFNLVFNFTCwKKwlHUElPNTVfblBSRUcsCisJR1BJTzU2X25QV0FJVCwKKwlHUElPNTdfbklPSVMxNiwKKworCS8qIFNEUkFNIGFuZCBsb2NhbCBidXMgKi8KKwlHUElPMTVfbkNTXzEsCisJR1BJTzc4X25DU18yLAorCUdQSU83OV9uQ1NfMywKKwlHUElPODBfbkNTXzQsCisJR1BJTzMzX25DU181LAorCUdQSU8xOF9SRFksCisKKwkvKiBHUElPICovCisJR1BJTzBfR1BJTwl8IFdBS0VVUF9PTl9FREdFX0JPVEgsCisJR1BJTzlfR1BJTywJCQkJLyogUEMgY2FyZCByZXNldCAqLworCisJLyogTkFORCBjb250cm9scyAqLworCUdQSU81X0dQSU8JfCBNRlBfTFBNX0RSSVZFX0hJR0gsCS8qIE5BTkQgQ0UjICovCisJR1BJTzRfR1BJTwl8IE1GUF9MUE1fRFJJVkVfTE9XLAkvKiBOQU5EIEFMRSAqLworCUdQSU8zX0dQSU8JfCBNRlBfTFBNX0RSSVZFX0xPVywJLyogTkFORCBDTEUgKi8KKwlHUElPMTBfR1BJTywJCQkJLyogTkFORCBSZWFkeS9CdXN5ICovCisKKwkvKiBpbnRlcnJ1cHRzICovCisJR1BJTzIyX0dQSU8sCS8qIERNOTAwMCBpbnRlcnJ1cHQgKi8KK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfUFhBMlhYKQorc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBweGFfc3NwX21hc3Rlcl9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7CisJCS5tb2RhbGlhcwk9ICJydGMtbWF4NjkwMiIsCisJCS5tYXhfc3BlZWRfaHoJPSAxMDAwMDAwLAorCQkuYnVzX251bQk9IDEsCisJCS5jaGlwX3NlbGVjdAk9IDAsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbXgyNTVfaW5pdF9ydGModm9pZCkKK3sKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDEsICZweGFfc3NwX21hc3Rlcl9pbmZvKTsKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhBUlJBWV9BTkRfU0laRShzcGlfYm9hcmRfaW5mbykpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNTVfaW5pdF9ydGModm9pZCkge30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbXgyNTVfbm9yX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJBUk1tb24iLAorCQkuc2l6ZQkJPSAweDAwMDMwMDAwLAorCQkub2Zmc2V0CQk9IDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSAgLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSAsIHsKKwkJLm5hbWUJCT0gIkFSTW1vbiBzZXR1cCBibG9jayIsCisJCS5zaXplCQk9IDB4MDAwMTAwMDAsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0gLCB7CisJCS5uYW1lCQk9ICJrZXJuZWwiLAorCQkuc2l6ZQkJPSAweDAwMTYwMDAwLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9ICwgeworCQkubmFtZQkJPSAicmFtZGlzayIsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ECisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgY214MjU1X25vcl9mbGFzaF9kYXRhW10gPSB7CisJeworCQkud2lkdGgJCT0gMiwJLyogYmFua3dpZHRoIGluIGJ5dGVzICovCisJCS5wYXJ0cwkJPSBjbXgyNTVfbm9yX3BhcnRpdGlvbnMsCisJCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY214MjU1X25vcl9wYXJ0aXRpb25zKQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY214MjU1X25vcl9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSBQWEFfQ1MwX1BIWVMsCisJLmVuZAk9IFBYQV9DUzBfUEhZUyArIFNaXzhNIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNteDI1NV9ub3IgPSB7CisJLm5hbWUJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBjbXgyNTVfbm9yX2ZsYXNoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UgPSAmY214MjU1X25vcl9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY214MjU1X2luaXRfbm9yKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjbXgyNTVfbm9yKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY214MjU1X2luaXRfbm9yKHZvaWQpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX0dQSU9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXgyNTVfbmFuZF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUFhBX0NTMV9QSFlTLAorCQkuZW5kICAgPSBQWEFfQ1MxX1BIWVMgKyAxMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IFBYQV9DUzVfUEhZUywKKwkJLmVuZCAgID0gUFhBX0NTNV9QSFlTICsgMywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjbXgyNTVfbmFuZF9wYXJ0c1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiY214MjU1LW5hbmQiLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJPSAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbmFuZF9wbGF0ZGF0YSBjbXgyNTVfbmFuZF9wbGF0ZGF0YSA9IHsKKwkuZ3Bpb19uY2UgPSBHUElPX05BTkRfQ1MsCisJLmdwaW9fY2xlID0gR1BJT19OQU5EX0NMRSwKKwkuZ3Bpb19hbGUgPSBHUElPX05BTkRfQUxFLAorCS5ncGlvX3JkeSA9IEdQSU9fTkFORF9SQiwKKwkuZ3Bpb19ud3AgPSAtMSwKKwkucGFydHMgPSBjbXgyNTVfbmFuZF9wYXJ0cywKKwkubnVtX3BhcnRzID0gQVJSQVlfU0laRShjbXgyNTVfbmFuZF9wYXJ0cyksCisJLmNoaXBfZGVsYXkgPSAyNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNteDI1NV9uYW5kID0geworCS5uYW1lCQk9ICJncGlvLW5hbmQiLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjbXgyNTVfbmFuZF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gY214MjU1X25hbmRfcmVzb3VyY2UsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZjbXgyNTVfbmFuZF9wbGF0ZGF0YSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY214MjU1X2luaXRfbmFuZCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214MjU1X25hbmQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNTVfaW5pdF9uYW5kKHZvaWQpIHt9CisjZW5kaWYKKwordm9pZCBfX2luaXQgY214MjU1X2luaXQodm9pZCkKK3sKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShjbXgyNTVfcGluX2NvbmZpZykpOworCisJY214MjU1X2luaXRfcnRjKCk7CisJY214MjU1X2luaXRfbm9yKCk7CisJY214MjU1X2luaXRfbmFuZCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNzAtcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWJjZWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC1wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC1wY2kuYwotICoKLSAqIFBDSSBiaW9zLXR5cGUgaW5pdGlhbGlzYXRpb24gZm9yIFBDSSBtYWNoaW5lcwotICoKLSAqIEJpdHMgdGFrZW4gZnJvbSB2YXJpb3VzIHBsYWNlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQ29tcHVsYWIsIEx0ZC4KLSAqIE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2l0ODE1Mi5oPgotCi11bnNpZ25lZCBsb25nIGl0ODE1Ml9iYXNlX2FkZHJlc3M7Ci1zdGF0aWMgaW50IGNteDI3MF9pdDgxNTJfaXJxX2dwaW87Ci0KLS8qCi0gKiBPbmx5IGZpcnN0IDY0TUIgb2YgbWVtb3J5IGNhbiBiZSBhY2Nlc3NlZCB2aWEgUENJLgotICogV2UgdXNlIEdGUF9ETUEgdG8gYWxsb2NhdGUgc2FmZSBidWZmZXJzIHRvIGRvIG1hcC91bm1hcC4KLSAqIFRoaXMgaXMgcmVhbGx5IHVnbHkgYW5kIHdlIG5lZWQgYSBiZXR0ZXIgd2F5IG9mIHNwZWNpZnlpbmcKLSAqIERNQS1jYXBhYmxlIHJlZ2lvbnMgb2YgbWVtb3J5LgotICovCi12b2lkIF9faW5pdCBjbXgyNzBfcGNpX2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqem9uZV9zaXplLAotCXVuc2lnbmVkIGxvbmcgKnpob2xlX3NpemUpCi17Ci0JdW5zaWduZWQgaW50IHN6ID0gU1pfNjRNID4+IFBBR0VfU0hJRlQ7Ci0KLQlpZiAobWFjaGluZV9pc19hcm1jb3JlKCkpIHsKLQkJcHJfaW5mbygiQWRqdXN0aW5nIHpvbmVzIGZvciBDTS1YMjcwXG4iKTsKLQotCQkvKgotCQkgKiBPbmx5IGFkanVzdCBpZiA+IDY0TSBvbiBjdXJyZW50IHN5c3RlbQotCQkgKi8KLQkJaWYgKG5vZGUgfHwgKHpvbmVfc2l6ZVswXSA8PSBzeikpCi0JCQlyZXR1cm47Ci0KLQkJem9uZV9zaXplWzFdID0gem9uZV9zaXplWzBdIC0gc3o7Ci0JCXpvbmVfc2l6ZVswXSA9IHN6OwotCQl6aG9sZV9zaXplWzFdID0gemhvbGVfc2l6ZVswXTsKLQkJemhvbGVfc2l6ZVswXSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjbXgyNzBfaXQ4MTUyX2lycV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0JLyogY2xlYXIgb3VyIHBhcmVudCBpcnEgKi8KLQlHRURSKGNteDI3MF9pdDgxNTJfaXJxX2dwaW8pID0gR1BJT19iaXQoY214MjcwX2l0ODE1Ml9pcnFfZ3Bpbyk7Ci0KLQlpdDgxNTJfaXJxX2RlbXV4KGlycSwgZGVzYyk7Ci19Ci0KLXZvaWQgX19jbXgyNzBfcGNpX2luaXRfaXJxKGludCBpcnFfZ3BpbykKLXsKLQlpdDgxNTJfaW5pdF9pcnEoKTsKLQotCWNteDI3MF9pdDgxNTJfaXJxX2dwaW8gPSBpcnFfZ3BpbzsKLQotCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShpcnFfZ3BpbyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQotCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGdwaW9fdG9faXJxKGlycV9ncGlvKSwgY214MjcwX2l0ODE1Ml9pcnFfZGVtdXgpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zYXZlX2l0ZVsxMF07Ci0KLXZvaWQgX19jbXgyNzBfcGNpX3N1c3BlbmQodm9pZCkKLXsKLQkvKiBzYXZlIElURSBzdGF0ZSAqLwotCXNsZWVwX3NhdmVfaXRlWzBdID0gX19yYXdfcmVhZGwoSVQ4MTUyX0lOVENfUERDTklNUik7Ci0Jc2xlZXBfc2F2ZV9pdGVbMV0gPSBfX3Jhd19yZWFkbChJVDgxNTJfSU5UQ19MUENOSU1SKTsKLQlzbGVlcF9zYXZlX2l0ZVsyXSA9IF9fcmF3X3JlYWRsKElUODE1Ml9JTlRDX0xQTklBUik7Ci0KLQkvKiBDbGVhciBJVEUgSVJRJ3MgKi8KLQlfX3Jhd193cml0ZWwoKDApLCBJVDgxNTJfSU5UQ19QRENOSVJSKTsKLQlfX3Jhd193cml0ZWwoKDApLCBJVDgxNTJfSU5UQ19MUENOSVJSKTsKLX0KLQotdm9pZCBfX2NteDI3MF9wY2lfcmVzdW1lKHZvaWQpCi17Ci0JLyogcmVzdG9yZSBJVDgxNTIgc3RhdGUgKi8KLQlfX3Jhd193cml0ZWwoKHNsZWVwX3NhdmVfaXRlWzBdKSwgSVQ4MTUyX0lOVENfUERDTklNUik7Ci0JX19yYXdfd3JpdGVsKChzbGVlcF9zYXZlX2l0ZVsxXSksIElUODE1Ml9JTlRDX0xQQ05JTVIpOwotCV9fcmF3X3dyaXRlbCgoc2xlZXBfc2F2ZV9pdGVbMl0pLCBJVDgxNTJfSU5UQ19MUE5JQVIpOwotfQotI2Vsc2UKLXZvaWQgY214MjcwX3BjaV9zdXNwZW5kKHZvaWQpIHt9Ci12b2lkIGNteDI3MF9wY2lfcmVzdW1lKHZvaWQpIHt9Ci0jZW5kaWYKLQotLyogUENJIElSUSBtYXBwaW5nKi8KLXN0YXRpYyBpbnQgX19pbml0IGNteDI3MF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JaW50IGlycTsKLQotCWRldl9kYmcoJmRldi0+ZGV2LCAiJXM6IHNsb3Q9JXgsIHBpbj0leFxuIiwgX19mdW5jX18sIHNsb3QsIHBpbik7Ci0KLQlpcnEgPSBpdDgxNTJfcGNpX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOwotCWlmIChpcnEpCi0JCXJldHVybiBpcnE7Ci0KLQkvKgotCSAgSGVyZSBjb21lcyB0aGUgdWdseSBwYXJ0LiBUaGUgcm91dGluZyBpcyBiYXNlYm9hcmQgc3BlY2lmaWMsCi0JICBidXQgZGVmaW5pbmcgYSBwbGF0Zm9ybSBmb3IgZWFjaCBwb3NzaWJsZSBiYXNlIG9mIENNLVgyNzAgaXMKLQkgIHVucmVhbGlzdGljLiBIZXJlIHdlIGtlZXAgbWFwcGluZyBmb3IgQVRYQmFzZSBhbmQgU0ItWDI3MC4KLQkqLwotCS8qIEFUWEJBU0UgUENJIHNsb3QgKi8KLQlpZiAoc2xvdCA9PSA3KQotCQlyZXR1cm4gSVQ4MTUyX1BDSV9JTlRBOwotCi0JLyogQVRYQmFzZS9TQi14MjcwIENhcmRCdXMgKi8KLQlpZiAoc2xvdCA9PSA4IHx8IHNsb3QgPT0gMCkKLQkJcmV0dXJuIElUODE1Ml9QQ0lfSU5UQjsKLQotCS8qIEFUWEJhc2UgRXRoZXJuZXQgKi8KLQlpZiAoc2xvdCA9PSA5KQotCQlyZXR1cm4gSVQ4MTUyX1BDSV9JTlRBOwotCi0JLyogU0IteDI3MCBFdGhlcm5ldCAqLwotCWlmIChzbG90ID09IDE2KQotCQlyZXR1cm4gSVQ4MTUyX1BDSV9JTlRBOwotCi0JLyogUEMxMDQrIGludGVycnVwdCByb3V0aW5nICovCi0JaWYgKChzbG90ID09IDE3KSB8fCAoc2xvdCA9PSAxOSkpCi0JCXJldHVybiBJVDgxNTJfUENJX0lOVEE7Ci0JaWYgKChzbG90ID09IDE4KSB8fCAoc2xvdCA9PSAyMCkpCi0JCXJldHVybiBJVDgxNTJfUENJX0lOVEI7Ci0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNteDI3MF9wY2lfcHJlaW5pdCh2b2lkKQotewotCXByX2luZm8oIkluaXRpYWxpemluZyBDTS1YMjcwIFBDSSBzdWJzeXN0ZW1cbiIpOwotCi0JX19yYXdfd3JpdGVsKDB4ODAwLCBJVDgxNTJfUENJX0NGR19BRERSKTsKLQlpZiAoX19yYXdfcmVhZGwoSVQ4MTUyX1BDSV9DRkdfREFUQSkgPT0gMHg4MTUyMTI4MykgewotCQlwcl9pbmZvKCJQQ0kgQnJpZGdlIGZvdW5kLlxuIik7Ci0KLQkJLyogc2V0IFBDSSBJL08gYmFzZSBhdCAwICovCi0JCXdyaXRlbCgweDg0OCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7Ci0JCXdyaXRlbCgwLCBJVDgxNTJfUENJX0NGR19EQVRBKTsKLQotCQkvKiBzZXQgUENJIG1lbW9yeSBiYXNlIGF0IDAgKi8KLQkJd3JpdGVsKDB4ODQwLCBJVDgxNTJfUENJX0NGR19BRERSKTsKLQkJd3JpdGVsKDAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOwotCi0JCXdyaXRlbCgweDIwLCBJVDgxNTJfR1BJT19HUERSKTsKLQotCQkvKiBDYXJkQnVzIENvbnRyb2xsZXIgb24gQVRYYmFzZSBiYXNlYm9hcmQgKi8KLQkJd3JpdGVsKDB4NDAwMCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7Ci0JCWlmIChyZWFkbChJVDgxNTJfUENJX0NGR19EQVRBKSA9PSAweEFDNTExMDRDKSB7Ci0JCQlwcl9pbmZvKCJDYXJkQnVzIEJyaWRnZSBmb3VuZC5cbiIpOwotCi0JCQkvKiBDb25maWd1cmUgc29ja2V0IDAgKi8KLQkJCXdyaXRlbCgweDQwOEMsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4MTAyMiwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7Ci0KLQkJCXdyaXRlbCgweDQwODAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4Mzg0NGQwNjAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOwotCi0JCQl3cml0ZWwoMHg0MDkwLCBJVDgxNTJfUENJX0NGR19BRERSKTsKLQkJCXdyaXRlbCgoKHJlYWRsKElUODE1Ml9QQ0lfQ0ZHX0RBVEEpICYgMHhmZmZmKSB8Ci0JCQkJMHg2MDQ0MDAwMCksCi0JCQkgICAgICAgSVQ4MTUyX1BDSV9DRkdfREFUQSk7Ci0KLQkJCXdyaXRlbCgweDQwMTgsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4YjAwMDAwMDAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOwotCi0JCQkvKiBDb25maWd1cmUgc29ja2V0IDEgKi8KLQkJCXdyaXRlbCgweDQxOEMsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4MTAyMiwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7Ci0KLQkJCXdyaXRlbCgweDQxODAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4Mzg0NGQwNjAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOwotCi0JCQl3cml0ZWwoMHg0MTkwLCBJVDgxNTJfUENJX0NGR19BRERSKTsKLQkJCXdyaXRlbCgoKHJlYWRsKElUODE1Ml9QQ0lfQ0ZHX0RBVEEpICYgMHhmZmZmKSB8Ci0JCQkJMHg2MDQ0MDAwMCksCi0JCQkgICAgICAgSVQ4MTUyX1BDSV9DRkdfREFUQSk7Ci0KLQkJCXdyaXRlbCgweDQxMTgsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOwotCQkJd3JpdGVsKDB4YjAwMDAwMDAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGh3X3BjaSBjbXgyNzBfcGNpIF9faW5pdGRhdGEgPSB7Ci0JLnN3aXp6bGUJPSBwY2lfc3RkX3N3aXp6bGUsCi0JLm1hcF9pcnEJPSBjbXgyNzBfcGNpX21hcF9pcnEsCi0JLm5yX2NvbnRyb2xsZXJzCT0gMSwKLQkuc2V0dXAJCT0gaXQ4MTUyX3BjaV9zZXR1cCwKLQkuc2NhbgkJPSBpdDgxNTJfcGNpX3NjYW5fYnVzLAotCS5wcmVpbml0CT0gY214MjcwX3BjaV9wcmVpbml0LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgY214MjcwX2luaXRfcGNpKHZvaWQpCi17Ci0JaWYgKG1hY2hpbmVfaXNfYXJtY29yZSgpKQotCQlwY2lfY29tbW9uX2luaXQoJmNteDI3MF9wY2kpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChjbXgyNzBfaW5pdF9wY2kpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC1wY2kuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNzAtcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjUzMmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC1wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWV4dGVybiB2b2lkIF9fY214MjcwX3BjaV9pbml0X2lycShpbnQgaXJxX2dwaW8pOwotZXh0ZXJuIHZvaWQgX19jbXgyNzBfcGNpX3N1c3BlbmQodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2NteDI3MF9wY2lfcmVzdW1lKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBjbXgyNzBfcGNpX2luaXRfaXJxKHgpIF9fY214MjcwX3BjaV9pbml0X2lycSh4KQotI2RlZmluZSBjbXgyNzBfcGNpX3N1c3BlbmQoeCkgX19jbXgyNzBfcGNpX3N1c3BlbmQoeCkKLSNkZWZpbmUgY214MjcwX3BjaV9yZXN1bWUoeCkgX19jbXgyNzBfcGNpX3Jlc3VtZSh4KQotI2Vsc2UKLSNkZWZpbmUgY214MjcwX3BjaV9pbml0X2lycSh4KSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgY214MjcwX3BjaV9zdXNwZW5kKHgpIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBjbXgyNzBfcGNpX3Jlc3VtZSh4KSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDI3MC5jCmluZGV4IGFmMDAzYTIuLmRmODNiOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjcwLmMKQEAgLTE0LDQ2ICsxNCwyMiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAotI2luY2x1ZGUgPGxpbnV4L2RtOTAwMC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy12MzAyMC5oPgogI2luY2x1ZGUgPHZpZGVvL21ieGZiLmg+Ci0jaW5jbHVkZSA8bGludXgvbGVkcy5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjd4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2JpdGZpZWxkLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaXQ4MTUyLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCi0jaW5jbHVkZSAiY20teDI3MC1wY2kuaCIKIAotLyogdmlydHVhbCBhZGRyZXNzZXMgZm9yIHN0YXRpY2FsbHkgbWFwcGVkIHJlZ2lvbnMgKi8KLSNkZWZpbmUgQ01YMjcwX1ZJUlRfQkFTRQkoMHhlODAwMDAwMCkKLSNkZWZpbmUgQ01YMjcwX0lUODE1Ml9WSVJUCShDTVgyNzBfVklSVF9CQVNFKQotCisvKiBwaHlzaWNhbCBhZGRyZXNzIGlmIGxvY2FsLWJ1cyBhdHRhY2hlZCBkZXZpY2VzICovCiAjZGVmaW5lIFJUQ19QSFlTX0JBU0UJCShQWEFfQ1MxX1BIWVMgKyAoNSA8PCAyMikpCi0jZGVmaW5lIERNOTAwMF9QSFlTX0JBU0UJKFBYQV9DUzFfUEhZUyArICg2IDw8IDIyKSkKIAogLyogR1BJTyBJUlEgdXNhZ2UgKi8KLSNkZWZpbmUgR1BJTzEwX0VUSElSUQkJKDEwKQotI2RlZmluZSBHUElPMjJfSVQ4MTUyX0lSUQkoMjIpCiAjZGVmaW5lIEdQSU84M19NTUNfSVJRCQkoODMpCi0jZGVmaW5lIEdQSU85NV9HRlhJUlEJCSg5NSkKIAotI2RlZmluZSBDTVgyNzBfRVRISVJRCQlJUlFfR1BJTyhHUElPMTBfRVRISVJRKQotI2RlZmluZSBDTVgyNzBfSVQ4MTUyX0lSUQlJUlFfR1BJTyhHUElPMjJfSVQ4MTUyX0lSUSkKICNkZWZpbmUgQ01YMjcwX01NQ19JUlEJCUlSUV9HUElPKEdQSU84M19NTUNfSVJRKQotI2RlZmluZSBDTVgyNzBfR0ZYSVJRCQlJUlFfR1BJTyhHUElPOTVfR0ZYSVJRKQogCiAvKiBNTUMgcG93ZXIgZW5hYmxlICovCiAjZGVmaW5lIEdQSU8xMDVfTU1DX1BPV0VSCSgxMDUpCkBAIC0xNTcsNjIgKzEzMyw2IEBACiAJR1BJTzgzX0dQSU8sCS8qIE1NQyBjYXJkIGRldGVjdCAqLwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RNOTAwMCkgfHwgZGVmaW5lZChDT05GSUdfRE05MDAwX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY214MjcwX2RtOTAwMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gRE05MDAwX1BIWVNfQkFTRSwKLQkJLmVuZCAgID0gRE05MDAwX1BIWVNfQkFTRSArIDQsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBETTkwMDBfUEhZU19CQVNFICsgOCwKLQkJLmVuZCAgID0gRE05MDAwX1BIWVNfQkFTRSArIDggKyA1MDAsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQgPSBDTVgyNzBfRVRISVJRLAotCQkuZW5kICAgPSBDTVgyNzBfRVRISVJRLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZG05MDAwX3BsYXRfZGF0YSBjbXgyNzBfZG05MDAwX3BsYXRkYXRhID0gewotCS5mbGFncwkJPSBETTkwMDBfUExBVEZfMzJCSVRPTkxZLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY214MjcwX2RtOTAwMF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImRtOTAwMCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNteDI3MF9kbTkwMDBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IGNteDI3MF9kbTkwMDBfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJmNteDI3MF9kbTkwMDBfcGxhdGRhdGEsCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNteDI3MF9pbml0X2RtOTAwMCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214MjcwX2RtOTAwMF9kZXZpY2UpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNzBfaW5pdF9kbTkwMDAodm9pZCkge30KLSNlbmRpZgotCi0vKiBVQ0IxNDAwIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNteDI3MF90c19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInVjYjE0MDBfdHMiLAotCS5pZAkJPSAtMSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbXgyNzBfaW5pdF90b3VjaHNjcmVlbih2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214MjcwX3RzX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNteDI3MF9pbml0X3RvdWNoc2NyZWVuKHZvaWQpIHt9Ci0jZW5kaWYKLQogLyogVjMwMjAgUlRDICovCiAjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9WMzAyMCkgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9WMzAyMF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNteDI3MF92MzAyMF9yZXNvdXJjZVtdID0gewpAQCAtMjQ1LDQ0ICsxNjUsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGNteDI3MF9pbml0X3J0Yyh2b2lkKSB7fQogI2VuZGlmCiAKLS8qIENNLVgyNzAgTEVEcyAqLwotI2lmIGRlZmluZWQoQ09ORklHX0xFRFNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfTEVEU19HUElPX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgY214MjcwX2xlZHNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5uYW1lID0gImNtLXgyNzA6cmVkIiwKLQkJLmRlZmF1bHRfdHJpZ2dlciA9ICJuYW5kLWRpc2siLAotCQkuZ3BpbyA9IDkzLAotCQkuYWN0aXZlX2xvdyA9IDEsCi0JfSwKLQlbMV0gPSB7Ci0JCS5uYW1lID0gImNtLXgyNzA6Z3JlZW4iLAotCQkuZGVmYXVsdF90cmlnZ2VyID0gImhlYXJ0YmVhdCIsCi0JCS5ncGlvID0gOTQsCi0JCS5hY3RpdmVfbG93ID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGNteDI3MF9ncGlvX2xlZF9wZGF0YSA9IHsKLQkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGNteDI3MF9sZWRzKSwKLQkubGVkcyA9IGNteDI3MF9sZWRzLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY214MjcwX2xlZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImxlZHMtZ3BpbyIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZjbXgyNzBfZ3Bpb19sZWRfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbXgyNzBfaW5pdF9sZWRzKHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjbXgyNzBfbGVkX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNteDI3MF9pbml0X2xlZHModm9pZCkge30KLSNlbmRpZgotCiAvKiAyNzAwRyBncmFwaGljcyAqLwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX01CWCkgfHwgZGVmaW5lZChDT05GSUdfRkJfTUJYX01PRFVMRSkKIHN0YXRpYyB1NjQgZmJfZG1hX21hc2sgPSB+KHU2NCkwOwpAQCAtMzczLDIzOCArMjU1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY214MjcwX2luaXRfMjcwMEcodm9pZCkge30KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfUFhBKSB8fCBkZWZpbmVkKENPTkZJR19GQl9QWEFfTU9EVUxFKQotLyoKLSAgRGlzcGxheSBkZWZpbml0aW9ucwotICBrZWVwIHRoZXNlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYWx0aG91Z2ggc3ltYm9saWMgbmFtZXMgKGFzCi0gIGUuZy4gaW4gbHBkMjcwLmMpIGxvb2tzIGJldHRlcgotKi8KLSNkZWZpbmUgTVRZUEVfU1ROMzIweDI0MAkwCi0jZGVmaW5lIE1UWVBFX1RGVDY0MHg0ODAJMQotI2RlZmluZSBNVFlQRV9DUlQ2NDB4NDgwCTIKLSNkZWZpbmUgTVRZUEVfQ1JUODAweDYwMAkzCi0jZGVmaW5lIE1UWVBFX1RGVDMyMHgyNDAJNgotI2RlZmluZSBNVFlQRV9TVE42NDB4NDgwCTcKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gZ2VuZXJpY19zdG5fMzIweDI0MF9tb2RlID0gewotCS5waXhjbG9jawk9IDc2OTIzLAotCS5icHAJCT0gOCwKLQkueHJlcwkJPSAzMjAsCi0JLnlyZXMJCT0gMjQwLAotCS5oc3luY19sZW4JPSAzLAotCS52c3luY19sZW4JPSAyLAotCS5sZWZ0X21hcmdpbgk9IDMsCi0JLnVwcGVyX21hcmdpbgk9IDAsCi0JLnJpZ2h0X21hcmdpbgk9IDMsCi0JLmxvd2VyX21hcmdpbgk9IDAsCi0JLnN5bmMJCT0gKEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwKLQkJCSAgIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCksCi0JLmNtYXBfZ3JleXNjYWxlID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfc3RuXzMyMHgyNDAgPSB7Ci0JLm1vZGVzCQk9ICZnZW5lcmljX3N0bl8zMjB4MjQwX21vZGUsCi0JLm51bV9tb2Rlcwk9IDEsCi0JLmxjY3IwCQk9IDAsCi0JLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwMykgfAotCQkJICAgTENDUjNfQWNiKDB4ZmYpIHwKLQkJCSAgIExDQ1IzX1BDUCksCi0JLmNtYXBfaW52ZXJzZQk9IDAsCi0JLmNtYXBfc3RhdGljCT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGdlbmVyaWNfdGZ0XzY0MHg0ODBfbW9kZSA9IHsKLQkucGl4Y2xvY2sJPSAzODQ2MSwKLQkuYnBwCQk9IDgsCi0JLnhyZXMJCT0gNjQwLAotCS55cmVzCQk9IDQ4MCwKLQkuaHN5bmNfbGVuCT0gNjAsCi0JLnZzeW5jX2xlbgk9IDIsCi0JLmxlZnRfbWFyZ2luCT0gNzAsCi0JLnVwcGVyX21hcmdpbgk9IDEwLAotCS5yaWdodF9tYXJnaW4JPSA3MCwKLQkubG93ZXJfbWFyZ2luCT0gNSwKLQkuc3luYwkJPSAwLAotCS5jbWFwX2dyZXlzY2FsZSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX3RmdF82NDB4NDgwID0gewotCS5tb2RlcwkJPSAmZ2VuZXJpY190ZnRfNjQweDQ4MF9tb2RlLAotCS5udW1fbW9kZXMJPSAxLAotCS5sY2NyMAkJPSAoTENDUjBfUEFTKSwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDAxKSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikgfAotCQkJICAgTENDUjNfUENQKSwKLQkuY21hcF9pbnZlcnNlCT0gMCwKLQkuY21hcF9zdGF0aWMJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gZ2VuZXJpY19jcnRfNjQweDQ4MF9tb2RlID0gewotCS5waXhjbG9jawk9IDM4NDYxLAotCS5icHAJCT0gOCwKLQkueHJlcwkJPSA2NDAsCi0JLnlyZXMJCT0gNDgwLAotCS5oc3luY19sZW4JPSA2MywKLQkudnN5bmNfbGVuCT0gMiwKLQkubGVmdF9tYXJnaW4JPSA4MSwKLQkudXBwZXJfbWFyZ2luCT0gMzMsCi0JLnJpZ2h0X21hcmdpbgk9IDE2LAotCS5sb3dlcl9tYXJnaW4JPSAxMCwKLQkuc3luYwkJPSAoRkJfU1lOQ19IT1JfSElHSF9BQ1QgfAotCQkJICAgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSwKLQkuY21hcF9ncmV5c2NhbGUgPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY19jcnRfNjQweDQ4MCA9IHsKLQkubW9kZXMJCT0gJmdlbmVyaWNfY3J0XzY0MHg0ODBfbW9kZSwKLQkubnVtX21vZGVzCT0gMSwKLQkubGNjcjAJCT0gKExDQ1IwX1BBUyksCi0JLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwMSkgfAotCQkJICAgTENDUjNfQWNiKDB4ZmYpKSwKLQkuY21hcF9pbnZlcnNlCT0gMCwKLQkuY21hcF9zdGF0aWMJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gZ2VuZXJpY19jcnRfODAweDYwMF9tb2RlID0gewotCS5waXhjbG9jawk9IDI4ODQ2LAotCS5icHAJCT0gOCwKLQkueHJlcwkJPSA4MDAsCi0JLnlyZXMJICAJPSA2MDAsCi0JLmhzeW5jX2xlbgk9IDYzLAotCS52c3luY19sZW4JPSAyLAotCS5sZWZ0X21hcmdpbgk9IDI2LAotCS51cHBlcl9tYXJnaW4JPSAyMSwKLQkucmlnaHRfbWFyZ2luCT0gMjYsCi0JLmxvd2VyX21hcmdpbgk9IDExLAotCS5zeW5jCQk9IChGQl9TWU5DX0hPUl9ISUdIX0FDVCB8Ci0JCQkgICBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpLAotCS5jbWFwX2dyZXlzY2FsZSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX2NydF84MDB4NjAwID0gewotCS5tb2RlcwkJPSAmZ2VuZXJpY19jcnRfODAweDYwMF9tb2RlLAotCS5udW1fbW9kZXMJPSAxLAotCS5sY2NyMAkJPSAoTENDUjBfUEFTKSwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDAyKSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikpLAotCS5jbWFwX2ludmVyc2UJPSAwLAotCS5jbWFwX3N0YXRpYwk9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBnZW5lcmljX3RmdF8zMjB4MjQwX21vZGUgPSB7Ci0JLnBpeGNsb2NrCT0gMTM0NjE1LAotCS5icHAJCT0gMTYsCi0JLnhyZXMJCT0gMzIwLAotCS55cmVzCQk9IDI0MCwKLQkuaHN5bmNfbGVuCT0gNjMsCi0JLnZzeW5jX2xlbgk9IDcsCi0JLmxlZnRfbWFyZ2luCT0gNzUsCi0JLnVwcGVyX21hcmdpbgk9IDAsCi0JLnJpZ2h0X21hcmdpbgk9IDE1LAotCS5sb3dlcl9tYXJnaW4JPSAxNSwKLQkuc3luYwkJPSAwLAotCS5jbWFwX2dyZXlzY2FsZSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX3RmdF8zMjB4MjQwID0gewotCS5tb2RlcwkJPSAmZ2VuZXJpY190ZnRfMzIweDI0MF9tb2RlLAotCS5udW1fbW9kZXMJPSAxLAotCS5sY2NyMAkJPSAoTENDUjBfUEFTKSwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDA2KSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikgfAotCQkJICAgTENDUjNfUENQKSwKLQkuY21hcF9pbnZlcnNlCT0gMCwKLQkuY21hcF9zdGF0aWMJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gZ2VuZXJpY19zdG5fNjQweDQ4MF9tb2RlID0gewotCS5waXhjbG9jawk9IDU3NjkyLAotCS5icHAJCT0gOCwKLQkueHJlcwkJPSA2NDAsCi0JLnlyZXMJCT0gNDgwLAotCS5oc3luY19sZW4JPSA0LAotCS52c3luY19sZW4JPSAyLAotCS5sZWZ0X21hcmdpbgk9IDEwLAotCS51cHBlcl9tYXJnaW4JPSA1LAotCS5yaWdodF9tYXJnaW4JPSAxMCwKLQkubG93ZXJfbWFyZ2luCT0gNSwKLQkuc3luYwkJPSAoRkJfU1lOQ19IT1JfSElHSF9BQ1QgfAotCQkJICAgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSwKLQkuY21hcF9ncmV5c2NhbGUgPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY19zdG5fNjQweDQ4MCA9IHsKLQkubW9kZXMJCT0gJmdlbmVyaWNfc3RuXzY0MHg0ODBfbW9kZSwKLQkubnVtX21vZGVzCT0gMSwKLQkubGNjcjAJCT0gMCwKLQkubGNjcjMJCT0gKExDQ1IzX1BpeENsa0RpdigweDAyKSB8Ci0JCQkgICBMQ0NSM19BY2IoMHhmZikpLAotCS5jbWFwX2ludmVyc2UJPSAwLAotCS5jbWFwX3N0YXRpYwk9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyAqY214MjcwX2Rpc3BsYXkgPSAmZ2VuZXJpY19jcnRfNjQweDQ4MDsKLQotc3RhdGljIGludCBfX2luaXQgY214MjcwX3NldF9kaXNwbGF5KGNoYXIgKnN0cikKLXsKLQlpbnQgZGlzcF90eXBlID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOwotCXN3aXRjaCAoZGlzcF90eXBlKSB7Ci0JY2FzZSBNVFlQRV9TVE4zMjB4MjQwOgotCQljbXgyNzBfZGlzcGxheSA9ICZnZW5lcmljX3N0bl8zMjB4MjQwOwotCQlicmVhazsKLQljYXNlIE1UWVBFX1RGVDY0MHg0ODA6Ci0JCWNteDI3MF9kaXNwbGF5ID0gJmdlbmVyaWNfdGZ0XzY0MHg0ODA7Ci0JCWJyZWFrOwotCWNhc2UgTVRZUEVfQ1JUNjQweDQ4MDoKLQkJY214MjcwX2Rpc3BsYXkgPSAmZ2VuZXJpY19jcnRfNjQweDQ4MDsKLQkJYnJlYWs7Ci0JY2FzZSBNVFlQRV9DUlQ4MDB4NjAwOgotCQljbXgyNzBfZGlzcGxheSA9ICZnZW5lcmljX2NydF84MDB4NjAwOwotCQlicmVhazsKLQljYXNlIE1UWVBFX1RGVDMyMHgyNDA6Ci0JCWNteDI3MF9kaXNwbGF5ID0gJmdlbmVyaWNfdGZ0XzMyMHgyNDA7Ci0JCWJyZWFrOwotCWNhc2UgTVRZUEVfU1RONjQweDQ4MDoKLQkJY214MjcwX2Rpc3BsYXkgPSAmZ2VuZXJpY19zdG5fNjQweDQ4MDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogZmFsbGJhY2sgdG8gQ1JUIDY0MHg0ODAgKi8KLQkJY214MjcwX2Rpc3BsYXkgPSAmZ2VuZXJpY19jcnRfNjQweDQ4MDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOwotfQotCi0vKgotICAgVGhpcyBzaG91bGQgYmUgZG9uZSByZWFsbHkgZWFybHkgdG8gZ2V0IHByb3BlciBjb25maWd1cmF0aW9uIGZvcgotICAgZnJhbWUgYnVmZmVyLgotICAgSW5kZWVkLCBweGFmYiBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIGlzdGVhZCwgYnV0IENNLVgyNzAgYm9vdGxvYWRlcgotICAgaGFzIGxpbWl0aWVkIGxpbmUgbGVuZ3RoIGZvciBrZXJuZWwgY29tbWFuZCBsaW5lLCBhbmQgYWxzbyBpdCB3aWxsCi0gICBicmVhayBjb21wYXRpYml0bHR5IHdpdGggcHJvcHJpZXRhcnkgcmVsZWFzZXMgYWxyZWFkeSBpbiBmaWVsZC4KLSovCi1fX3NldHVwKCJtb25pdG9yPSIsIGNteDI3MF9zZXRfZGlzcGxheSk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbXgyNzBfaW5pdF9kaXNwbGF5KHZvaWQpCi17Ci0Jc2V0X3B4YV9mYl9pbmZvKGNteDI3MF9kaXNwbGF5KTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY214MjcwX2luaXRfZGlzcGxheSh2b2lkKSB7fQotI2VuZGlmCi0KIC8qIFBYQTI3eCBPSENJIGNvbnRyb2xsZXIgc2V0dXAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCi1zdGF0aWMgaW50IGNteDI3MF9vaGNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIFNldCB0aGUgUG93ZXIgQ29udHJvbCBQb2xhcml0eSBMb3cgKi8KLQlVSENIUiA9IChVSENIUiB8IFVIQ0hSX1BDUEwpICYKLQkJfihVSENIUl9TU0VQMSB8IFVIQ0hSX1NTRVAyIHwgVUhDSFJfU1NFKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBjbXgyNzBfb2hjaV9wbGF0Zm9ybV9kYXRhID0gewogCS5wb3J0X21vZGUJPSBQTU1fUEVSUE9SVF9NT0RFLAotCS5pbml0CQk9IGNteDI3MF9vaGNpX2luaXQsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUMSB8IEVOQUJMRV9QT1JUMiB8IFBPV0VSX0NPTlRST0xfTE9XLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNteDI3MF9pbml0X29oY2kodm9pZCkKQEAgLTY3NiwxMzEgKzMzMSwxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIGNteDI3MF9pbml0X21tYyh2b2lkKSB7fQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNsZWVwX3NhdmVfbXNjWzEwXTsKLQotc3RhdGljIGludCBjbXgyNzBfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit2b2lkIF9faW5pdCBjbXgyNzBfaW5pdCh2b2lkKQogewotCWNteDI3MF9wY2lfc3VzcGVuZCgpOwotCi0JLyogc2F2ZSBNU0MgcmVnaXN0ZXJzICovCi0Jc2xlZXBfc2F2ZV9tc2NbMF0gPSBNU0MwOwotCXNsZWVwX3NhdmVfbXNjWzFdID0gTVNDMTsKLQlzbGVlcF9zYXZlX21zY1syXSA9IE1TQzI7Ci0KLQkvKiBzZXR1cCBwb3dlciBzYXZpbmcgbW9kZSByZWdpc3RlcnMgKi8KLQlQQ0ZSID0gMHgwOwotCVBTTFIgPSAweGZmNDAwMDAwOwotCVBNQ1IgID0gMHgwMDAwMDAwNTsKLQlQV0VSICA9IDB4ODAwMDAwMDA7Ci0JUEZFUiAgPSAweDAwMDAwMDAwOwotCVBSRVIgID0gMHgwMDAwMDAwMDsKLQlQR1NSMCA9IDB4QzAwMTg4MDA7Ci0JUEdTUjEgPSAweDAwNEYwMDAyOwotCVBHU1IyID0gMHg2MDIxQzAwMDsKLQlQR1NSMyA9IDB4MDAwMjAwMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjbXgyNzBfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCi17Ci0JY214MjcwX3BjaV9yZXN1bWUoKTsKLQotCS8qIHJlc3RvcmUgTVNDIHJlZ2lzdGVycyAqLwotCU1TQzAgPSBzbGVlcF9zYXZlX21zY1swXTsKLQlNU0MxID0gc2xlZXBfc2F2ZV9tc2NbMV07Ci0JTVNDMiA9IHNsZWVwX3NhdmVfbXNjWzJdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGNteDI3MF9wbV9zeXNjbGFzcyA9IHsKLQkubmFtZSA9ICJwbSIsCi0JLnJlc3VtZSA9IGNteDI3MF9yZXN1bWUsCi0JLnN1c3BlbmQgPSBjbXgyNzBfc3VzcGVuZCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbXgyNzBfcG1fZGV2aWNlID0gewotCS5jbHMgPSAmY214MjcwX3BtX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgY214MjcwX3BtX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0JZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNteDI3MF9wbV9zeXNjbGFzcyk7Ci0JaWYgKGVycm9yID09IDApCi0JCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbXgyNzBfcG1fZGV2aWNlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0jZWxzZQotc3RhdGljIGludCBfX2luaXQgY214MjcwX3BtX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfUFhBMlhYX0FDOTcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QWEEyWFhfQUM5N19NT0RVTEUpCi1zdGF0aWMgdm9pZCBfX2luaXQgY214MjcwX2luaXRfYWM5Nyh2b2lkKQotewotCXB4YV9zZXRfYWM5N19pbmZvKE5VTEwpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbXgyNzBfaW5pdF9hYzk3KHZvaWQpIHt9Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgX19pbml0IGNteDI3MF9pbml0KHZvaWQpCi17Ci0JY214MjcwX3BtX2luaXQoKTsKLQogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGNteDI3MF9waW5fY29uZmlnKSk7CiAKLQljbXgyNzBfaW5pdF9kbTkwMDAoKTsKIAljbXgyNzBfaW5pdF9ydGMoKTsKLQljbXgyNzBfaW5pdF9kaXNwbGF5KCk7CiAJY214MjcwX2luaXRfbW1jKCk7CiAJY214MjcwX2luaXRfb2hjaSgpOwotCWNteDI3MF9pbml0X2FjOTcoKTsKLQljbXgyNzBfaW5pdF90b3VjaHNjcmVlbigpOwotCWNteDI3MF9pbml0X2xlZHMoKTsKIAljbXgyNzBfaW5pdF8yNzAwRygpOwogfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgY214MjcwX2luaXRfaXJxKHZvaWQpCi17Ci0JcHhhMjd4X2luaXRfaXJxKCk7Ci0KLQljbXgyNzBfcGNpX2luaXRfaXJxKEdQSU8yMl9JVDgxNTJfSVJRKTsKLX0KLQotI2lmZGVmIENPTkZJR19QQ0kKLS8qIE1hcCBQQ0kgY29tcGFuaW9uIHN0YXRpY2FsbHkgKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY214MjcwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCVswXSA9IHsgLyogUENJIGJyaWRnZSAqLwotCQkudmlydHVhbAk9IENNWDI3MF9JVDgxNTJfVklSVCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBYQV9DUzRfUEhZUyksCi0JCS5sZW5ndGgJCT0gU1pfNjRNLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNteDI3MF9tYXBfaW8odm9pZCkKLXsKLQlweGFfbWFwX2lvKCk7Ci0JaW90YWJsZV9pbml0KGNteDI3MF9pb19kZXNjLCBBUlJBWV9TSVpFKGNteDI3MF9pb19kZXNjKSk7Ci0KLQlpdDgxNTJfYmFzZV9hZGRyZXNzID0gQ01YMjcwX0lUODE1Ml9WSVJUOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIF9faW5pdCBjbXgyNzBfbWFwX2lvKHZvaWQpCi17Ci0JcHhhX21hcF9pbygpOwotfQotI2VuZGlmCi0KLU1BQ0hJTkVfU1RBUlQoQVJNQ09SRSwgIkNvbXB1bGFiIENNLXgyNzAiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCi0JLnBoeXNfaW8JPSAweDQwMDAwMDAwLAotCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5tYXBfaW8JCT0gY214MjcwX21hcF9pbywKLQkuaW5pdF9pcnEJPSBjbXgyNzBfaW5pdF9pcnEsCi0JLnRpbWVyCQk9ICZweGFfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IGNteDI3MF9pbml0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTZiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYworICoKKyAqIFBDSSBiaW9zLXR5cGUgaW5pdGlhbGlzYXRpb24gZm9yIFBDSSBtYWNoaW5lcworICoKKyAqIEJpdHMgdGFrZW4gZnJvbSB2YXJpb3VzIHBsYWNlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQ29tcHVsYWIsIEx0ZC4KKyAqIE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2l0ODE1Mi5oPgorCit1bnNpZ25lZCBsb25nIGl0ODE1Ml9iYXNlX2FkZHJlc3M7CitzdGF0aWMgaW50IGNteDJ4eF9pdDgxNTJfaXJxX2dwaW87CisKKy8qCisgKiBPbmx5IGZpcnN0IDY0TUIgb2YgbWVtb3J5IGNhbiBiZSBhY2Nlc3NlZCB2aWEgUENJLgorICogV2UgdXNlIEdGUF9ETUEgdG8gYWxsb2NhdGUgc2FmZSBidWZmZXJzIHRvIGRvIG1hcC91bm1hcC4KKyAqIFRoaXMgaXMgcmVhbGx5IHVnbHkgYW5kIHdlIG5lZWQgYSBiZXR0ZXIgd2F5IG9mIHNwZWNpZnlpbmcKKyAqIERNQS1jYXBhYmxlIHJlZ2lvbnMgb2YgbWVtb3J5LgorICovCit2b2lkIF9faW5pdCBjbXgyeHhfcGNpX2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqem9uZV9zaXplLAorCXVuc2lnbmVkIGxvbmcgKnpob2xlX3NpemUpCit7CisJdW5zaWduZWQgaW50IHN6ID0gU1pfNjRNID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAobWFjaGluZV9pc19hcm1jb3JlKCkpIHsKKwkJcHJfaW5mbygiQWRqdXN0aW5nIHpvbmVzIGZvciBDTS1YMlhYXG4iKTsKKworCQkvKgorCQkgKiBPbmx5IGFkanVzdCBpZiA+IDY0TSBvbiBjdXJyZW50IHN5c3RlbQorCQkgKi8KKwkJaWYgKG5vZGUgfHwgKHpvbmVfc2l6ZVswXSA8PSBzeikpCisJCQlyZXR1cm47CisKKwkJem9uZV9zaXplWzFdID0gem9uZV9zaXplWzBdIC0gc3o7CisJCXpvbmVfc2l6ZVswXSA9IHN6OworCQl6aG9sZV9zaXplWzFdID0gemhvbGVfc2l6ZVswXTsKKwkJemhvbGVfc2l6ZVswXSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbXgyeHhfaXQ4MTUyX2lycV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJLyogY2xlYXIgb3VyIHBhcmVudCBpcnEgKi8KKwlHRURSKGNteDJ4eF9pdDgxNTJfaXJxX2dwaW8pID0gR1BJT19iaXQoY214Mnh4X2l0ODE1Ml9pcnFfZ3Bpbyk7CisKKwlpdDgxNTJfaXJxX2RlbXV4KGlycSwgZGVzYyk7Cit9CisKK3ZvaWQgX19jbXgyeHhfcGNpX2luaXRfaXJxKGludCBpcnFfZ3BpbykKK3sKKwlpdDgxNTJfaW5pdF9pcnEoKTsKKworCWNteDJ4eF9pdDgxNTJfaXJxX2dwaW8gPSBpcnFfZ3BpbzsKKworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShpcnFfZ3BpbyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGdwaW9fdG9faXJxKGlycV9ncGlvKSwgY214Mnh4X2l0ODE1Ml9pcnFfZGVtdXgpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zYXZlX2l0ZVsxMF07CisKK3ZvaWQgX19jbXgyeHhfcGNpX3N1c3BlbmQodm9pZCkKK3sKKwkvKiBzYXZlIElURSBzdGF0ZSAqLworCXNsZWVwX3NhdmVfaXRlWzBdID0gX19yYXdfcmVhZGwoSVQ4MTUyX0lOVENfUERDTklNUik7CisJc2xlZXBfc2F2ZV9pdGVbMV0gPSBfX3Jhd19yZWFkbChJVDgxNTJfSU5UQ19MUENOSU1SKTsKKwlzbGVlcF9zYXZlX2l0ZVsyXSA9IF9fcmF3X3JlYWRsKElUODE1Ml9JTlRDX0xQTklBUik7CisKKwkvKiBDbGVhciBJVEUgSVJRJ3MgKi8KKwlfX3Jhd193cml0ZWwoKDApLCBJVDgxNTJfSU5UQ19QRENOSVJSKTsKKwlfX3Jhd193cml0ZWwoKDApLCBJVDgxNTJfSU5UQ19MUENOSVJSKTsKK30KKwordm9pZCBfX2NteDJ4eF9wY2lfcmVzdW1lKHZvaWQpCit7CisJLyogcmVzdG9yZSBJVDgxNTIgc3RhdGUgKi8KKwlfX3Jhd193cml0ZWwoKHNsZWVwX3NhdmVfaXRlWzBdKSwgSVQ4MTUyX0lOVENfUERDTklNUik7CisJX19yYXdfd3JpdGVsKChzbGVlcF9zYXZlX2l0ZVsxXSksIElUODE1Ml9JTlRDX0xQQ05JTVIpOworCV9fcmF3X3dyaXRlbCgoc2xlZXBfc2F2ZV9pdGVbMl0pLCBJVDgxNTJfSU5UQ19MUE5JQVIpOworfQorI2Vsc2UKK3ZvaWQgY214Mnh4X3BjaV9zdXNwZW5kKHZvaWQpIHt9Cit2b2lkIGNteDJ4eF9wY2lfcmVzdW1lKHZvaWQpIHt9CisjZW5kaWYKKworLyogUENJIElSUSBtYXBwaW5nKi8KK3N0YXRpYyBpbnQgX19pbml0IGNteDJ4eF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaW50IGlycTsKKworCWRldl9kYmcoJmRldi0+ZGV2LCAiJXM6IHNsb3Q9JXgsIHBpbj0leFxuIiwgX19mdW5jX18sIHNsb3QsIHBpbik7CisKKwlpcnEgPSBpdDgxNTJfcGNpX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCWlmIChpcnEpCisJCXJldHVybiBpcnE7CisKKwkvKgorCSAgSGVyZSBjb21lcyB0aGUgdWdseSBwYXJ0LiBUaGUgcm91dGluZyBpcyBiYXNlYm9hcmQgc3BlY2lmaWMsCisJICBidXQgZGVmaW5pbmcgYSBwbGF0Zm9ybSBmb3IgZWFjaCBwb3NzaWJsZSBiYXNlIG9mIENNLVgyWFggaXMKKwkgIHVucmVhbGlzdGljLiBIZXJlIHdlIGtlZXAgbWFwcGluZyBmb3IgQVRYQmFzZSBhbmQgU0ItWDJYWC4KKwkqLworCS8qIEFUWEJBU0UgUENJIHNsb3QgKi8KKwlpZiAoc2xvdCA9PSA3KQorCQlyZXR1cm4gSVQ4MTUyX1BDSV9JTlRBOworCisJLyogQVRYQmFzZS9TQi1YMlhYIENhcmRCdXMgKi8KKwlpZiAoc2xvdCA9PSA4IHx8IHNsb3QgPT0gMCkKKwkJcmV0dXJuIElUODE1Ml9QQ0lfSU5UQjsKKworCS8qIEFUWEJhc2UgRXRoZXJuZXQgKi8KKwlpZiAoc2xvdCA9PSA5KQorCQlyZXR1cm4gSVQ4MTUyX1BDSV9JTlRBOworCisJLyogQ00teDI1NSBPbmJvYXJkIEV0aGVybmV0ICovCisJaWYgKHNsb3QgPT0gMTUpCisJCXJldHVybiBJVDgxNTJfUENJX0lOVEM7CisKKwkvKiBTQi14Mnh4IEV0aGVybmV0ICovCisJaWYgKHNsb3QgPT0gMTYpCisJCXJldHVybiBJVDgxNTJfUENJX0lOVEE7CisKKwkvKiBQQzEwNCsgaW50ZXJydXB0IHJvdXRpbmcgKi8KKwlpZiAoKHNsb3QgPT0gMTcpIHx8IChzbG90ID09IDE5KSkKKwkJcmV0dXJuIElUODE1Ml9QQ0lfSU5UQTsKKwlpZiAoKHNsb3QgPT0gMTgpIHx8IChzbG90ID09IDIwKSkKKwkJcmV0dXJuIElUODE1Ml9QQ0lfSU5UQjsKKworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgY214Mnh4X3BjaV9wcmVpbml0KHZvaWQpCit7CisJcHJfaW5mbygiSW5pdGlhbGl6aW5nIENNLVgyWFggUENJIHN1YnN5c3RlbVxuIik7CisKKwlfX3Jhd193cml0ZWwoMHg4MDAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOworCWlmIChfX3Jhd19yZWFkbChJVDgxNTJfUENJX0NGR19EQVRBKSA9PSAweDgxNTIxMjgzKSB7CisJCXByX2luZm8oIlBDSSBCcmlkZ2UgZm91bmQuXG4iKTsKKworCQkvKiBzZXQgUENJIEkvTyBiYXNlIGF0IDAgKi8KKwkJd3JpdGVsKDB4ODQ4LCBJVDgxNTJfUENJX0NGR19BRERSKTsKKwkJd3JpdGVsKDAsIElUODE1Ml9QQ0lfQ0ZHX0RBVEEpOworCisJCS8qIHNldCBQQ0kgbWVtb3J5IGJhc2UgYXQgMCAqLworCQl3cml0ZWwoMHg4NDAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOworCQl3cml0ZWwoMCwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7CisKKwkJd3JpdGVsKDB4MjAsIElUODE1Ml9HUElPX0dQRFIpOworCisJCS8qIENhcmRCdXMgQ29udHJvbGxlciBvbiBBVFhiYXNlIGJhc2Vib2FyZCAqLworCQl3cml0ZWwoMHg0MDAwLCBJVDgxNTJfUENJX0NGR19BRERSKTsKKwkJaWYgKHJlYWRsKElUODE1Ml9QQ0lfQ0ZHX0RBVEEpID09IDB4QUM1MTEwNEMpIHsKKwkJCXByX2luZm8oIkNhcmRCdXMgQnJpZGdlIGZvdW5kLlxuIik7CisKKwkJCS8qIENvbmZpZ3VyZSBzb2NrZXQgMCAqLworCQkJd3JpdGVsKDB4NDA4QywgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHgxMDIyLCBJVDgxNTJfUENJX0NGR19EQVRBKTsKKworCQkJd3JpdGVsKDB4NDA4MCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHgzODQ0ZDA2MCwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7CisKKwkJCXdyaXRlbCgweDQwOTAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOworCQkJd3JpdGVsKCgocmVhZGwoSVQ4MTUyX1BDSV9DRkdfREFUQSkgJiAweGZmZmYpIHwKKwkJCQkweDYwNDQwMDAwKSwKKwkJCSAgICAgICBJVDgxNTJfUENJX0NGR19EQVRBKTsKKworCQkJd3JpdGVsKDB4NDAxOCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHhiMDAwMDAwMCwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7CisKKwkJCS8qIENvbmZpZ3VyZSBzb2NrZXQgMSAqLworCQkJd3JpdGVsKDB4NDE4QywgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHgxMDIyLCBJVDgxNTJfUENJX0NGR19EQVRBKTsKKworCQkJd3JpdGVsKDB4NDE4MCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHgzODQ0ZDA2MCwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7CisKKwkJCXdyaXRlbCgweDQxOTAsIElUODE1Ml9QQ0lfQ0ZHX0FERFIpOworCQkJd3JpdGVsKCgocmVhZGwoSVQ4MTUyX1BDSV9DRkdfREFUQSkgJiAweGZmZmYpIHwKKwkJCQkweDYwNDQwMDAwKSwKKwkJCSAgICAgICBJVDgxNTJfUENJX0NGR19EQVRBKTsKKworCQkJd3JpdGVsKDB4NDExOCwgSVQ4MTUyX1BDSV9DRkdfQUREUik7CisJCQl3cml0ZWwoMHhiMDAwMDAwMCwgSVQ4MTUyX1BDSV9DRkdfREFUQSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfcGNpIGNteDJ4eF9wY2kgX19pbml0ZGF0YSA9IHsKKwkuc3dpenpsZQk9IHBjaV9zdGRfc3dpenpsZSwKKwkubWFwX2lycQk9IGNteDJ4eF9wY2lfbWFwX2lycSwKKwkubnJfY29udHJvbGxlcnMJPSAxLAorCS5zZXR1cAkJPSBpdDgxNTJfcGNpX3NldHVwLAorCS5zY2FuCQk9IGl0ODE1Ml9wY2lfc2Nhbl9idXMsCisJLnByZWluaXQJPSBjbXgyeHhfcGNpX3ByZWluaXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjbXgyeHhfaW5pdF9wY2kodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19hcm1jb3JlKCkpCisJCXBjaV9jb21tb25faW5pdCgmY214Mnh4X3BjaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGNteDJ4eF9pbml0X3BjaSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRhYWQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuaApAQCAtMCwwICsxLDEzIEBACitleHRlcm4gdm9pZCBfX2NteDJ4eF9wY2lfaW5pdF9pcnEoaW50IGlycV9ncGlvKTsKK2V4dGVybiB2b2lkIF9fY214Mnh4X3BjaV9zdXNwZW5kKHZvaWQpOworZXh0ZXJuIHZvaWQgX19jbXgyeHhfcGNpX3Jlc3VtZSh2b2lkKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgY214Mnh4X3BjaV9pbml0X2lycSh4KSBfX2NteDJ4eF9wY2lfaW5pdF9pcnEoeCkKKyNkZWZpbmUgY214Mnh4X3BjaV9zdXNwZW5kKHgpIF9fY214Mnh4X3BjaV9zdXNwZW5kKHgpCisjZGVmaW5lIGNteDJ4eF9wY2lfcmVzdW1lKHgpIF9fY214Mnh4X3BjaV9yZXN1bWUoeCkKKyNlbHNlCisjZGVmaW5lIGNteDJ4eF9wY2lfaW5pdF9pcnEoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNteDJ4eF9wY2lfc3VzcGVuZCh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY214Mnh4X3BjaV9yZXN1bWUoeCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNjZTNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbXB1TGFiLCBMdGQuCisgKiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2RtOTAwMC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2l0ODE1Mi5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgImNtLXgyeHgtcGNpLmgiCisKK2V4dGVybiB2b2lkIGNteDI1NV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY214MjcwX2luaXQodm9pZCk7CisKKy8qIHZpcnR1YWwgYWRkcmVzc2VzIGZvciBzdGF0aWNhbGx5IG1hcHBlZCByZWdpb25zICovCisjZGVmaW5lIENNWDJYWF9WSVJUX0JBU0UJKDB4ZTgwMDAwMDApCisjZGVmaW5lIENNWDJYWF9JVDgxNTJfVklSVAkoQ01YMlhYX1ZJUlRfQkFTRSkKKworLyogcGh5c2ljYWwgYWRkcmVzcyBpZiBsb2NhbC1idXMgYXR0YWNoZWQgZGV2aWNlcyAqLworI2RlZmluZSBDTVgyNTVfRE05MDAwX1BIWVNfQkFTRSAoUFhBX0NTMV9QSFlTICsgKDggPDwgMjIpKQorI2RlZmluZSBDTVgyNzBfRE05MDAwX1BIWVNfQkFTRQkoUFhBX0NTMV9QSFlTICsgKDYgPDwgMjIpKQorCisvKiBsZWRzICovCisjZGVmaW5lIENNWDI1NV9HUElPX1JFRAkJKDI3KQorI2RlZmluZSBDTVgyNTVfR1BJT19HUkVFTgkoMzIpCisjZGVmaW5lIENNWDI3MF9HUElPX1JFRAkJKDkzKQorI2RlZmluZSBDTVgyNzBfR1BJT19HUkVFTgkoOTQpCisKKy8qIEdQSU8gSVJRIHVzYWdlICovCisjZGVmaW5lIEdQSU8yMl9FVEhJUlEJCSgyMikKKyNkZWZpbmUgR1BJTzEwX0VUSElSUQkJKDEwKQorI2RlZmluZSBDTVgyNTVfR1BJT19JVDgxNTJfSVJRCSgwKQorI2RlZmluZSBDTVgyNzBfR1BJT19JVDgxNTJfSVJRCSgyMikKKworI2RlZmluZSBDTVgyNTVfRVRISVJRCQlJUlFfR1BJTyhHUElPMjJfRVRISVJRKQorI2RlZmluZSBDTVgyNzBfRVRISVJRCQlJUlFfR1BJTyhHUElPMTBfRVRISVJRKQorCisjaWYgZGVmaW5lZChDT05GSUdfRE05MDAwKSB8fCBkZWZpbmVkKENPTkZJR19ETTkwMDBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXgyNTVfZG05MDAwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBDTVgyNTVfRE05MDAwX1BIWVNfQkFTRSwKKwkJLmVuZCAgID0gQ01YMjU1X0RNOTAwMF9QSFlTX0JBU0UgKyAzLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ01YMjU1X0RNOTAwMF9QSFlTX0JBU0UgKyA0LAorCQkuZW5kICAgPSBDTVgyNTVfRE05MDAwX1BIWVNfQkFTRSArIDQgKyA1MDAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgPSBDTVgyNTVfRVRISVJRLAorCQkuZW5kICAgPSBDTVgyNTVfRVRISVJRLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY214MjcwX2RtOTAwMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gQ01YMjcwX0RNOTAwMF9QSFlTX0JBU0UsCisJCS5lbmQgICA9IENNWDI3MF9ETTkwMDBfUEhZU19CQVNFICsgMywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IENNWDI3MF9ETTkwMDBfUEhZU19CQVNFICsgOCwKKwkJLmVuZCAgID0gQ01YMjcwX0RNOTAwMF9QSFlTX0JBU0UgKyA4ICsgNTAwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ID0gQ01YMjcwX0VUSElSUSwKKwkJLmVuZCAgID0gQ01YMjcwX0VUSElSUSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGRtOTAwMF9wbGF0X2RhdGEgY214MjcwX2RtOTAwMF9wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzMyQklUT05MWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNteDJ4eF9kbTkwMDBfZGV2aWNlID0geworCS5uYW1lCQk9ICJkbTkwMDAiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjbXgyNzBfZG05MDAwX3Jlc291cmNlKSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmY214MjcwX2RtOTAwMF9wbGF0ZGF0YSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY214Mnh4X2luaXRfZG05MDAwKHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEyNXgoKSkKKwkJY214Mnh4X2RtOTAwMF9kZXZpY2UucmVzb3VyY2UgPSBjbXgyNTVfZG05MDAwX3Jlc291cmNlOworCWVsc2UKKwkJY214Mnh4X2RtOTAwMF9kZXZpY2UucmVzb3VyY2UgPSBjbXgyNzBfZG05MDAwX3Jlc291cmNlOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214Mnh4X2RtOTAwMF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyeHhfaW5pdF9kbTkwMDAodm9pZCkge30KKyNlbmRpZgorCisvKiBVQ0IxNDAwIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9VQ0IxNDAwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNteDJ4eF90c19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInVjYjE0MDBfdHMiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbXgyeHhfaW5pdF90b3VjaHNjcmVlbih2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214Mnh4X3RzX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNteDJ4eF9pbml0X3RvdWNoc2NyZWVuKHZvaWQpIHt9CisjZW5kaWYKKworLyogQ00tWDI3MCBMRURzICovCisjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBncGlvX2xlZCBjbXgyeHhfbGVkc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUgPSAiY20teDJ4eDpyZWQiLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gIm5hbmQtZGlzayIsCisJCS5hY3RpdmVfbG93ID0gMSwKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUgPSAiY20teDJ4eDpncmVlbiIsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiaGVhcnRiZWF0IiwKKwkJLmFjdGl2ZV9sb3cgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgY214Mnh4X2dwaW9fbGVkX3BkYXRhID0geworCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUoY214Mnh4X2xlZHMpLAorCS5sZWRzID0gY214Mnh4X2xlZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXgyeHhfbGVkX2RldmljZSA9IHsKKwkubmFtZQkJPSAibGVkcy1ncGlvIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmNteDJ4eF9ncGlvX2xlZF9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNteDJ4eF9pbml0X2xlZHModm9pZCkKK3sKKwlpZiAoY3B1X2lzX3B4YTI1eCgpKSB7CisJCWNteDJ4eF9sZWRzWzBdLmdwaW8gPSBDTVgyNTVfR1BJT19SRUQ7CisJCWNteDJ4eF9sZWRzWzFdLmdwaW8gPSBDTVgyNTVfR1BJT19HUkVFTjsKKwl9IGVsc2UgeworCQljbXgyeHhfbGVkc1swXS5ncGlvID0gQ01YMjcwX0dQSU9fUkVEOworCQljbXgyeHhfbGVkc1sxXS5ncGlvID0gQ01YMjcwX0dQSU9fR1JFRU47CisJfQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY214Mnh4X2xlZF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyeHhfaW5pdF9sZWRzKHZvaWQpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BYQSkgfHwgZGVmaW5lZChDT05GSUdfRkJfUFhBX01PRFVMRSkKKy8qCisgIERpc3BsYXkgZGVmaW5pdGlvbnMKKyAga2VlcCB0aGVzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFsdGhvdWdoIHN5bWJvbGljIG5hbWVzIChhcworICBlLmcuIGluIGxwZDI3MC5jKSBsb29rcyBiZXR0ZXIKKyovCisjZGVmaW5lIE1UWVBFX1NUTjMyMHgyNDAJMAorI2RlZmluZSBNVFlQRV9URlQ2NDB4NDgwCTEKKyNkZWZpbmUgTVRZUEVfQ1JUNjQweDQ4MAkyCisjZGVmaW5lIE1UWVBFX0NSVDgwMHg2MDAJMworI2RlZmluZSBNVFlQRV9URlQzMjB4MjQwCTYKKyNkZWZpbmUgTVRZUEVfU1RONjQweDQ4MAk3CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGdlbmVyaWNfc3RuXzMyMHgyNDBfbW9kZSA9IHsKKwkucGl4Y2xvY2sJPSA3NjkyMywKKwkuYnBwCQk9IDgsCisJLnhyZXMJCT0gMzIwLAorCS55cmVzCQk9IDI0MCwKKwkuaHN5bmNfbGVuCT0gMywKKwkudnN5bmNfbGVuCT0gMiwKKwkubGVmdF9tYXJnaW4JPSAzLAorCS51cHBlcl9tYXJnaW4JPSAwLAorCS5yaWdodF9tYXJnaW4JPSAzLAorCS5sb3dlcl9tYXJnaW4JPSAwLAorCS5zeW5jCQk9IChGQl9TWU5DX0hPUl9ISUdIX0FDVCB8CisJCQkgICBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpLAorCS5jbWFwX2dyZXlzY2FsZSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBnZW5lcmljX3N0bl8zMjB4MjQwID0geworCS5tb2RlcwkJPSAmZ2VuZXJpY19zdG5fMzIweDI0MF9tb2RlLAorCS5udW1fbW9kZXMJPSAxLAorCS5sY2NyMAkJPSAwLAorCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDMpIHwKKwkJCSAgIExDQ1IzX0FjYigweGZmKSB8CisJCQkgICBMQ0NSM19QQ1ApLAorCS5jbWFwX2ludmVyc2UJPSAwLAorCS5jbWFwX3N0YXRpYwk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBnZW5lcmljX3RmdF82NDB4NDgwX21vZGUgPSB7CisJLnBpeGNsb2NrCT0gMzg0NjEsCisJLmJwcAkJPSA4LAorCS54cmVzCQk9IDY0MCwKKwkueXJlcwkJPSA0ODAsCisJLmhzeW5jX2xlbgk9IDYwLAorCS52c3luY19sZW4JPSAyLAorCS5sZWZ0X21hcmdpbgk9IDcwLAorCS51cHBlcl9tYXJnaW4JPSAxMCwKKwkucmlnaHRfbWFyZ2luCT0gNzAsCisJLmxvd2VyX21hcmdpbgk9IDUsCisJLnN5bmMJCT0gMCwKKwkuY21hcF9ncmV5c2NhbGUgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY190ZnRfNjQweDQ4MCA9IHsKKwkubW9kZXMJCT0gJmdlbmVyaWNfdGZ0XzY0MHg0ODBfbW9kZSwKKwkubnVtX21vZGVzCT0gMSwKKwkubGNjcjAJCT0gKExDQ1IwX1BBUyksCisJLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwMSkgfAorCQkJICAgTENDUjNfQWNiKDB4ZmYpIHwKKwkJCSAgIExDQ1IzX1BDUCksCisJLmNtYXBfaW52ZXJzZQk9IDAsCisJLmNtYXBfc3RhdGljCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGdlbmVyaWNfY3J0XzY0MHg0ODBfbW9kZSA9IHsKKwkucGl4Y2xvY2sJPSAzODQ2MSwKKwkuYnBwCQk9IDgsCisJLnhyZXMJCT0gNjQwLAorCS55cmVzCQk9IDQ4MCwKKwkuaHN5bmNfbGVuCT0gNjMsCisJLnZzeW5jX2xlbgk9IDIsCisJLmxlZnRfbWFyZ2luCT0gODEsCisJLnVwcGVyX21hcmdpbgk9IDMzLAorCS5yaWdodF9tYXJnaW4JPSAxNiwKKwkubG93ZXJfbWFyZ2luCT0gMTAsCisJLnN5bmMJCT0gKEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwKKwkJCSAgIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCksCisJLmNtYXBfZ3JleXNjYWxlID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfY3J0XzY0MHg0ODAgPSB7CisJLm1vZGVzCQk9ICZnZW5lcmljX2NydF82NDB4NDgwX21vZGUsCisJLm51bV9tb2Rlcwk9IDEsCisJLmxjY3IwCQk9IChMQ0NSMF9QQVMpLAorCS5sY2NyMwkJPSAoTENDUjNfUGl4Q2xrRGl2KDB4MDEpIHwKKwkJCSAgIExDQ1IzX0FjYigweGZmKSksCisJLmNtYXBfaW52ZXJzZQk9IDAsCisJLmNtYXBfc3RhdGljCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGdlbmVyaWNfY3J0XzgwMHg2MDBfbW9kZSA9IHsKKwkucGl4Y2xvY2sJPSAyODg0NiwKKwkuYnBwCQk9IDgsCisJLnhyZXMJCT0gODAwLAorCS55cmVzCSAgCT0gNjAwLAorCS5oc3luY19sZW4JPSA2MywKKwkudnN5bmNfbGVuCT0gMiwKKwkubGVmdF9tYXJnaW4JPSAyNiwKKwkudXBwZXJfbWFyZ2luCT0gMjEsCisJLnJpZ2h0X21hcmdpbgk9IDI2LAorCS5sb3dlcl9tYXJnaW4JPSAxMSwKKwkuc3luYwkJPSAoRkJfU1lOQ19IT1JfSElHSF9BQ1QgfAorCQkJICAgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSwKKwkuY21hcF9ncmV5c2NhbGUgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY19jcnRfODAweDYwMCA9IHsKKwkubW9kZXMJCT0gJmdlbmVyaWNfY3J0XzgwMHg2MDBfbW9kZSwKKwkubnVtX21vZGVzCT0gMSwKKwkubGNjcjAJCT0gKExDQ1IwX1BBUyksCisJLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwMikgfAorCQkJICAgTENDUjNfQWNiKDB4ZmYpKSwKKwkuY21hcF9pbnZlcnNlCT0gMCwKKwkuY21hcF9zdGF0aWMJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gZ2VuZXJpY190ZnRfMzIweDI0MF9tb2RlID0geworCS5waXhjbG9jawk9IDEzNDYxNSwKKwkuYnBwCQk9IDE2LAorCS54cmVzCQk9IDMyMCwKKwkueXJlcwkJPSAyNDAsCisJLmhzeW5jX2xlbgk9IDYzLAorCS52c3luY19sZW4JPSA3LAorCS5sZWZ0X21hcmdpbgk9IDc1LAorCS51cHBlcl9tYXJnaW4JPSAwLAorCS5yaWdodF9tYXJnaW4JPSAxNSwKKwkubG93ZXJfbWFyZ2luCT0gMTUsCisJLnN5bmMJCT0gMCwKKwkuY21hcF9ncmV5c2NhbGUgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZ2VuZXJpY190ZnRfMzIweDI0MCA9IHsKKwkubW9kZXMJCT0gJmdlbmVyaWNfdGZ0XzMyMHgyNDBfbW9kZSwKKwkubnVtX21vZGVzCT0gMSwKKwkubGNjcjAJCT0gKExDQ1IwX1BBUyksCisJLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwNikgfAorCQkJICAgTENDUjNfQWNiKDB4ZmYpIHwKKwkJCSAgIExDQ1IzX1BDUCksCisJLmNtYXBfaW52ZXJzZQk9IDAsCisJLmNtYXBfc3RhdGljCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGdlbmVyaWNfc3RuXzY0MHg0ODBfbW9kZSA9IHsKKwkucGl4Y2xvY2sJPSA1NzY5MiwKKwkuYnBwCQk9IDgsCisJLnhyZXMJCT0gNjQwLAorCS55cmVzCQk9IDQ4MCwKKwkuaHN5bmNfbGVuCT0gNCwKKwkudnN5bmNfbGVuCT0gMiwKKwkubGVmdF9tYXJnaW4JPSAxMCwKKwkudXBwZXJfbWFyZ2luCT0gNSwKKwkucmlnaHRfbWFyZ2luCT0gMTAsCisJLmxvd2VyX21hcmdpbgk9IDUsCisJLnN5bmMJCT0gKEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwKKwkJCSAgIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCksCisJLmNtYXBfZ3JleXNjYWxlID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGdlbmVyaWNfc3RuXzY0MHg0ODAgPSB7CisJLm1vZGVzCQk9ICZnZW5lcmljX3N0bl82NDB4NDgwX21vZGUsCisJLm51bV9tb2Rlcwk9IDEsCisJLmxjY3IwCQk9IDAsCisJLmxjY3IzCQk9IChMQ0NSM19QaXhDbGtEaXYoMHgwMikgfAorCQkJICAgTENDUjNfQWNiKDB4ZmYpKSwKKwkuY21hcF9pbnZlcnNlCT0gMCwKKwkuY21hcF9zdGF0aWMJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gKmNteDJ4eF9kaXNwbGF5ID0gJmdlbmVyaWNfY3J0XzY0MHg0ODA7CisKK3N0YXRpYyBpbnQgX19pbml0IGNteDJ4eF9zZXRfZGlzcGxheShjaGFyICpzdHIpCit7CisJaW50IGRpc3BfdHlwZSA9IHNpbXBsZV9zdHJ0b2woc3RyLCBOVUxMLCAwKTsKKwlzd2l0Y2ggKGRpc3BfdHlwZSkgeworCWNhc2UgTVRZUEVfU1ROMzIweDI0MDoKKwkJY214Mnh4X2Rpc3BsYXkgPSAmZ2VuZXJpY19zdG5fMzIweDI0MDsKKwkJYnJlYWs7CisJY2FzZSBNVFlQRV9URlQ2NDB4NDgwOgorCQljbXgyeHhfZGlzcGxheSA9ICZnZW5lcmljX3RmdF82NDB4NDgwOworCQlicmVhazsKKwljYXNlIE1UWVBFX0NSVDY0MHg0ODA6CisJCWNteDJ4eF9kaXNwbGF5ID0gJmdlbmVyaWNfY3J0XzY0MHg0ODA7CisJCWJyZWFrOworCWNhc2UgTVRZUEVfQ1JUODAweDYwMDoKKwkJY214Mnh4X2Rpc3BsYXkgPSAmZ2VuZXJpY19jcnRfODAweDYwMDsKKwkJYnJlYWs7CisJY2FzZSBNVFlQRV9URlQzMjB4MjQwOgorCQljbXgyeHhfZGlzcGxheSA9ICZnZW5lcmljX3RmdF8zMjB4MjQwOworCQlicmVhazsKKwljYXNlIE1UWVBFX1NUTjY0MHg0ODA6CisJCWNteDJ4eF9kaXNwbGF5ID0gJmdlbmVyaWNfc3RuXzY0MHg0ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIGZhbGxiYWNrIHRvIENSVCA2NDB4NDgwICovCisJCWNteDJ4eF9kaXNwbGF5ID0gJmdlbmVyaWNfY3J0XzY0MHg0ODA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAgIFRoaXMgc2hvdWxkIGJlIGRvbmUgcmVhbGx5IGVhcmx5IHRvIGdldCBwcm9wZXIgY29uZmlndXJhdGlvbiBmb3IKKyAgIGZyYW1lIGJ1ZmZlci4KKyAgIEluZGVlZCwgcHhhZmIgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBpc3RlYWQsIGJ1dCBDTS1YMlhYIGJvb3Rsb2FkZXIKKyAgIGhhcyBsaW1pdGllZCBsaW5lIGxlbmd0aCBmb3Iga2VybmVsIGNvbW1hbmQgbGluZSwgYW5kIGFsc28gaXQgd2lsbAorICAgYnJlYWsgY29tcGF0aWJpdGx0eSB3aXRoIHByb3ByaWV0YXJ5IHJlbGVhc2VzIGFscmVhZHkgaW4gZmllbGQuCisqLworX19zZXR1cCgibW9uaXRvcj0iLCBjbXgyeHhfc2V0X2Rpc3BsYXkpOworCitzdGF0aWMgdm9pZCBfX2luaXQgY214Mnh4X2luaXRfZGlzcGxheSh2b2lkKQoreworCXNldF9weGFfZmJfaW5mbyhjbXgyeHhfZGlzcGxheSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNteDJ4eF9pbml0X2Rpc3BsYXkodm9pZCkge30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbGVlcF9zYXZlX21zY1sxMF07CisKK3N0YXRpYyBpbnQgY214Mnh4X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWNteDJ4eF9wY2lfc3VzcGVuZCgpOworCisJLyogc2F2ZSBNU0MgcmVnaXN0ZXJzICovCisJc2xlZXBfc2F2ZV9tc2NbMF0gPSBNU0MwOworCXNsZWVwX3NhdmVfbXNjWzFdID0gTVNDMTsKKwlzbGVlcF9zYXZlX21zY1syXSA9IE1TQzI7CisKKwkvKiBzZXR1cCBwb3dlciBzYXZpbmcgbW9kZSByZWdpc3RlcnMgKi8KKwlQQ0ZSID0gMHgwOworCVBTTFIgPSAweGZmNDAwMDAwOworCVBNQ1IgID0gMHgwMDAwMDAwNTsKKwlQV0VSICA9IDB4ODAwMDAwMDA7CisJUEZFUiAgPSAweDAwMDAwMDAwOworCVBSRVIgID0gMHgwMDAwMDAwMDsKKwlQR1NSMCA9IDB4QzAwMTg4MDA7CisJUEdTUjEgPSAweDAwNEYwMDAyOworCVBHU1IyID0gMHg2MDIxQzAwMDsKKwlQR1NSMyA9IDB4MDAwMjAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbXgyeHhfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJY214Mnh4X3BjaV9yZXN1bWUoKTsKKworCS8qIHJlc3RvcmUgTVNDIHJlZ2lzdGVycyAqLworCU1TQzAgPSBzbGVlcF9zYXZlX21zY1swXTsKKwlNU0MxID0gc2xlZXBfc2F2ZV9tc2NbMV07CisJTVNDMiA9IHNsZWVwX3NhdmVfbXNjWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGNteDJ4eF9wbV9zeXNjbGFzcyA9IHsKKwkubmFtZSA9ICJwbSIsCisJLnJlc3VtZSA9IGNteDJ4eF9yZXN1bWUsCisJLnN1c3BlbmQgPSBjbXgyeHhfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbXgyeHhfcG1fZGV2aWNlID0geworCS5jbHMgPSAmY214Mnh4X3BtX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BtX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNteDJ4eF9wbV9zeXNjbGFzcyk7CisJaWYgKGVycm9yID09IDApCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbXgyeHhfcG1fZGV2aWNlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZWxzZQorc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BtX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfUFhBMlhYX0FDOTcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9QWEEyWFhfQUM5N19NT0RVTEUpCitzdGF0aWMgdm9pZCBfX2luaXQgY214Mnh4X2luaXRfYWM5Nyh2b2lkKQoreworCXB4YV9zZXRfYWM5N19pbmZvKE5VTEwpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXgyeHhfaW5pdF9hYzk3KHZvaWQpIHt9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGNteDJ4eF9pbml0KHZvaWQpCit7CisJY214Mnh4X3BtX2luaXQoKTsKKworCWlmIChjcHVfaXNfcHhhMjV4KCkpCisJCWNteDI1NV9pbml0KCk7CisJZWxzZQorCQljbXgyNzBfaW5pdCgpOworCisJY214Mnh4X2luaXRfZG05MDAwKCk7CisJY214Mnh4X2luaXRfZGlzcGxheSgpOworCWNteDJ4eF9pbml0X2FjOTcoKTsKKwljbXgyeHhfaW5pdF90b3VjaHNjcmVlbigpOworCWNteDJ4eF9pbml0X2xlZHMoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNteDJ4eF9pbml0X2lycSh2b2lkKQoreworCXB4YTI3eF9pbml0X2lycSgpOworCisJaWYgKGNwdV9pc19weGEyNXgoKSkgeworCQlweGEyNXhfaW5pdF9pcnEoKTsKKwkJY214Mnh4X3BjaV9pbml0X2lycShDTVgyNTVfR1BJT19JVDgxNTJfSVJRKTsKKwl9IGVsc2UgeworCQlweGEyN3hfaW5pdF9pcnEoKTsKKwkJY214Mnh4X3BjaV9pbml0X2lycShDTVgyNzBfR1BJT19JVDgxNTJfSVJRKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisvKiBNYXAgUENJIGNvbXBhbmlvbiBzdGF0aWNhbGx5ICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNteDJ4eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7IC8qIFBDSSBicmlkZ2UgKi8KKwkJLnZpcnR1YWwJPSBDTVgyWFhfSVQ4MTUyX1ZJUlQsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQWEFfQ1M0X1BIWVMpLAorCQkubGVuZ3RoCQk9IFNaXzY0TSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjbXgyeHhfbWFwX2lvKHZvaWQpCit7CisJcHhhX21hcF9pbygpOworCWlvdGFibGVfaW5pdChjbXgyeHhfaW9fZGVzYywgQVJSQVlfU0laRShjbXgyeHhfaW9fZGVzYykpOworCisJaXQ4MTUyX2Jhc2VfYWRkcmVzcyA9IENNWDJYWF9JVDgxNTJfVklSVDsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgY214Mnh4X21hcF9pbyh2b2lkKQoreworCXB4YV9tYXBfaW8oKTsKK30KKyNlbmRpZgorCitNQUNISU5FX1NUQVJUKEFSTUNPUkUsICJDb21wdWxhYiBDTS1YMlhYIikKKwkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGNteDJ4eF9tYXBfaW8sCisJLmluaXRfaXJxCT0gY214Mnh4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBjbXgyeHhfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViNDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYworICoKKyAqIFN1cHBvcnQgZm9yIHRoZSBDb21wdUxhYiBDTS1YMzAwIG1vZHVsZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29tcHVMYWIgTHRkLgorICoKKyAqIE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtOTAwMC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2E5NTN4Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTMwMC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgorI2luY2x1ZGUgPG1hY2gvb2hjaS5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9weGEzeHhfbmFuZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgQ01fWDMwMF9FVEhfUEhZUwkweDA4MDAwMDEwCisKKyNkZWZpbmUgR1BJTzgyX01NQzJfSVJRCQkoODIpCisjZGVmaW5lIEdQSU84NV9NTUMyX1dQCQkoODUpCisKKyNkZWZpbmUJQ01fWDMwMF9NTUMyX0lSUQlJUlFfR1BJTyhHUElPODJfTU1DMl9JUlEpCisKK3N0YXRpYyBtZnBfY2ZnX3QgY21feDMwMF9tZnBfY2ZnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBMQ0QgKi8KKwlHUElPNTRfTENEX0xERF8wLAorCUdQSU81NV9MQ0RfTEREXzEsCisJR1BJTzU2X0xDRF9MRERfMiwKKwlHUElPNTdfTENEX0xERF8zLAorCUdQSU81OF9MQ0RfTEREXzQsCisJR1BJTzU5X0xDRF9MRERfNSwKKwlHUElPNjBfTENEX0xERF82LAorCUdQSU82MV9MQ0RfTEREXzcsCisJR1BJTzYyX0xDRF9MRERfOCwKKwlHUElPNjNfTENEX0xERF85LAorCUdQSU82NF9MQ0RfTEREXzEwLAorCUdQSU82NV9MQ0RfTEREXzExLAorCUdQSU82Nl9MQ0RfTEREXzEyLAorCUdQSU82N19MQ0RfTEREXzEzLAorCUdQSU82OF9MQ0RfTEREXzE0LAorCUdQSU82OV9MQ0RfTEREXzE1LAorCUdQSU83Ml9MQ0RfRkNMSywKKwlHUElPNzNfTENEX0xDTEssCisJR1BJTzc0X0xDRF9QQ0xLLAorCUdQSU83NV9MQ0RfQklBUywKKworCS8qIEJUVUFSVCAqLworCUdQSU8xMTFfVUFSVDJfUlRTLAorCUdQSU8xMTJfVUFSVDJfUlhEIHwgTUZQX0xQTV9FREdFX0ZBTEwsCisJR1BJTzExM19VQVJUMl9UWEQsCisJR1BJTzExNF9VQVJUMl9DVFMgfCBNRlBfTFBNX0VER0VfQk9USCwKKworCS8qIFNUVUFSVCAqLworCUdQSU8xMDlfVUFSVDNfVFhELAorCUdQSU8xMTBfVUFSVDNfUlhEIHwgTUZQX0xQTV9FREdFX0ZBTEwsCisKKwkvKiBBQzk3ICovCisJR1BJTzIzX0FDOTdfbkFDUkVTRVQsCisJR1BJTzI0X0FDOTdfU1lTQ0xLLAorCUdQSU8yOV9BQzk3X0JJVENMSywKKwlHUElPMjVfQUM5N19TREFUQV9JTl8wLAorCUdQSU8yN19BQzk3X1NEQVRBX09VVCwKKwlHUElPMjhfQUM5N19TWU5DLAorCisJLyogS2V5cGFkICovCisJR1BJTzExNV9LUF9NS0lOXzAgfCBNRlBfTFBNX0VER0VfQk9USCwKKwlHUElPMTE2X0tQX01LSU5fMSB8IE1GUF9MUE1fRURHRV9CT1RILAorCUdQSU8xMTdfS1BfTUtJTl8yIHwgTUZQX0xQTV9FREdFX0JPVEgsCisJR1BJTzExOF9LUF9NS0lOXzMgfCBNRlBfTFBNX0VER0VfQk9USCwKKwlHUElPMTE5X0tQX01LSU5fNCB8IE1GUF9MUE1fRURHRV9CT1RILAorCUdQSU8xMjBfS1BfTUtJTl81IHwgTUZQX0xQTV9FREdFX0JPVEgsCisJR1BJTzJfMl9LUF9NS0lOXzYgfCBNRlBfTFBNX0VER0VfQk9USCwKKwlHUElPM18yX0tQX01LSU5fNyB8IE1GUF9MUE1fRURHRV9CT1RILAorCUdQSU8xMjFfS1BfTUtPVVRfMCwKKwlHUElPMTIyX0tQX01LT1VUXzEsCisJR1BJTzEyM19LUF9NS09VVF8yLAorCUdQSU8xMjRfS1BfTUtPVVRfMywKKwlHUElPMTI1X0tQX01LT1VUXzQsCisJR1BJTzRfMl9LUF9NS09VVF81LAorCisJLyogTU1DMSAqLworCUdQSU8zX01NQzFfREFUMCwKKwlHUElPNF9NTUMxX0RBVDEgfCBNRlBfTFBNX0VER0VfQk9USCwKKwlHUElPNV9NTUMxX0RBVDIsCisJR1BJTzZfTU1DMV9EQVQzLAorCUdQSU83X01NQzFfQ0xLLAorCUdQSU84X01NQzFfQ01ELAkvKiBDTUQwIGZvciBzbG90IDAgKi8KKworCS8qIE1NQzIgKi8KKwlHUElPOV9NTUMyX0RBVDAsCisJR1BJTzEwX01NQzJfREFUMSB8IE1GUF9MUE1fRURHRV9CT1RILAorCUdQSU8xMV9NTUMyX0RBVDIsCisJR1BJTzEyX01NQzJfREFUMywKKwlHUElPMTNfTU1DMl9DTEssCisJR1BJTzE0X01NQzJfQ01ELAorCisJLyogRkZVQVJUICovCisJR1BJTzMwX1VBUlQxX1JYRCB8IE1GUF9MUE1fRURHRV9GQUxMLAorCUdQSU8zMV9VQVJUMV9UWEQsCisJR1BJTzMyX1VBUlQxX0NUUywKKwlHUElPMzdfVUFSVDFfUlRTLAorCUdQSU8zM19VQVJUMV9EQ0QsCisJR1BJTzM0X1VBUlQxX0RTUiB8IE1GUF9MUE1fRURHRV9GQUxMLAorCUdQSU8zNV9VQVJUMV9SSSwKKwlHUElPMzZfVUFSVDFfRFRSLAorCisJLyogR1BJT3MgKi8KKwlHUElPNzlfR1BJTywJCQkvKiBMRUQgKi8KKwlHUElPODJfR1BJTyB8IE1GUF9QVUxMX0hJR0gsCS8qIE1NQyBDRCAqLworCUdQSU84NV9HUElPLAkJCS8qIE1NQyBXUCAqLworCUdQSU85OV9HUElPLAkJCS8qIEV0aGVybmV0IElSUSAqLworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RNOTAwMCkgfHwgZGVmaW5lZChDT05GSUdfRE05MDAwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG05MDAwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQ01fWDMwMF9FVEhfUEhZUywKKwkJLmVuZAk9IENNX1gzMDBfRVRIX1BIWVMgKyAweDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBDTV9YMzAwX0VUSF9QSFlTICsgMHg0LAorCQkuZW5kCT0gQ01fWDMwMF9FVEhfUEhZUyArIDB4NCArIDUwMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IElSUV9HUElPKG1mcF90b19ncGlvKE1GUF9QSU5fR1BJTzk5KSksCisJCS5lbmQJPSBJUlFfR1BJTyhtZnBfdG9fZ3BpbyhNRlBfUElOX0dQSU85OSkpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZG05MDAwX3BsYXRfZGF0YSBjbV94MzAwX2RtOTAwMF9wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtOTAwMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRtOTAwMCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRtOTAwMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGRtOTAwMF9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmNtX3gzMDBfZG05MDAwX3BsYXRkYXRhLAorCX0KKworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF9kbTkwMDAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRtOTAwMF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV94MzAwX2luaXRfZG05MDAwKHZvaWQpIHt9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BYQSkgfHwgZGVmaW5lZChDT05GSUdfRkJfUFhBX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGNtX3gzMDBfbGNkX21vZGVzW10gPSB7CisJWzBdID0geworCQkucGl4Y2xvY2sJPSAzODAwMCwKKwkJLmJwcAkJPSAxNiwKKwkJLnhyZXMJCT0gNDgwLAorCQkueXJlcwkJPSA2NDAsCisJCS5oc3luY19sZW4JPSA4LAorCQkudnN5bmNfbGVuCT0gMiwKKwkJLmxlZnRfbWFyZ2luCT0gOCwKKwkJLnVwcGVyX21hcmdpbgk9IDAsCisJCS5yaWdodF9tYXJnaW4JPSAyNCwKKwkJLmxvd2VyX21hcmdpbgk9IDQsCisJCS5jbWFwX2dyZXlzY2FsZQk9IDAsCisJfSwKKwlbMV0gPSB7CisJCS5waXhjbG9jawk9IDE1MzgwMCwKKwkJLmJwcAkJPSAxNiwKKwkJLnhyZXMJCT0gMjQwLAorCQkueXJlcwkJPSAzMjAsCisJCS5oc3luY19sZW4JPSA4LAorCQkudnN5bmNfbGVuCT0gMiwKKwkJLmxlZnRfbWFyZ2luCT0gOCwKKwkJLnVwcGVyX21hcmdpbgk9IDIsCisJCS5yaWdodF9tYXJnaW4JPSA4OCwKKwkJLmxvd2VyX21hcmdpbgk9IDIsCisJCS5jbWFwX2dyZXlzY2FsZQk9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGNtX3gzMDBfbGNkID0geworCS5tb2RlcwkJCT0gY21feDMwMF9sY2RfbW9kZXMsCisJLm51bV9tb2RlcwkJPSAyLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF9sY2Qodm9pZCkKK3sKKwlzZXRfcHhhX2ZiX2luZm8oJmNtX3gzMDBfbGNkKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY21feDMwMF9pbml0X2xjZCh2b2lkKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9QWEEzeHgpIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX1BYQTN4eF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY21feDMwMF9uYW5kX3BhcnRpdGlvbnNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgICAgICA9ICJPQk0iLAorCQkub2Zmc2V0ICAgICAgPSAwLAorCQkuc2l6ZSAgICAgICAgPSBTWl8yNTZLLAorCQkubWFza19mbGFncyAgPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUgICAgICAgID0gIlUtQm9vdCIsCisJCS5vZmZzZXQgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUgICAgICAgID0gU1pfMjU2SywKKwkJLm1hc2tfZmxhZ3MgID0gTVREX1dSSVRFQUJMRSwgLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSwKKwlbMl0gPSB7CisJCS5uYW1lICAgICAgICA9ICJFbnZpcm9ubWVudCIsCisJCS5vZmZzZXQgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUgICAgICAgID0gU1pfMjU2SywKKwl9LAorCVszXSA9IHsKKwkJLm5hbWUgICAgICAgID0gInJlc2VydmVkIiwKKwkJLm9mZnNldCAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSAgICAgICAgPSBTWl8yNTZLICsgU1pfMU0sCisJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJWzRdID0geworCQkubmFtZSAgICAgICAgPSAia2VybmVsIiwKKwkJLm9mZnNldCAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSAgICAgICAgPSBTWl80TSwKKwl9LAorCVs1XSA9IHsKKwkJLm5hbWUgICAgICAgID0gImZzIiwKKwkJLm9mZnNldCAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSAgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgY21feDMwMF9uYW5kX2luZm8gPSB7CisJLmVuYWJsZV9hcmJpdGVyCT0gMSwKKwkucGFydHMJCT0gY21feDMwMF9uYW5kX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShjbV94MzAwX25hbmRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY21feDMwMF9pbml0X25hbmQodm9pZCkKK3sKKwlweGEzeHhfc2V0X25hbmRfaW5mbygmY21feDMwMF9uYW5kX2luZm8pOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV94MzAwX2luaXRfbmFuZCh2b2lkKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpIHx8IGRlZmluZWQoQ09ORklHX01NQ19NT0RVTEUpCisvKiBUaGUgZmlyc3QgTU1DIHNsb3Qgb2YgQ00tWDMwMCBpcyBoYXJkd2lyZWQgdG8gTGliZXJ0YXMgY2FyZCBhbmQgaGFzCisgICBubyBkZXRlY3Rpb24vcm8gcGlucyAqLworc3RhdGljIGludCBjbV94MzAwX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBpcnFfaGFuZGxlcl90IGNtX3gzMDBfZGV0ZWN0X2ludCwKKwkJCSAgICB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbV94MzAwX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKK30KKworc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBjbV94MzAwX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5kZXRlY3RfZGVsYXkJPSAyMCwKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmluaXQgCQk9IGNtX3gzMDBfbWNpX2luaXQsCisJLmV4aXQJCT0gY21feDMwMF9tY2lfZXhpdCwKK307CisKK3N0YXRpYyBpbnQgY21feDMwMF9tY2kyX3JvKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJTzg1X01NQzJfV1ApOworfQorCitzdGF0aWMgaW50IGNtX3gzMDBfbWNpMl9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgaXJxX2hhbmRsZXJfdCBjbV94MzAwX2RldGVjdF9pbnQsCisJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKworCS8qCisJICogc2V0dXAgR1BJTyBmb3IgQ00tWDMwMCBNTUMgY29udHJvbGxlcgorCSAqLworCWVyciA9IGdwaW9fcmVxdWVzdChHUElPODJfTU1DMl9JUlEsICJtbWMgY2FyZCBkZXRlY3QiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXF1ZXN0X2NkOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU84Ml9NTUMyX0lSUSk7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJTzg1X01NQzJfV1AsICJtbWMgd3JpdGUgcHJvdGVjdCIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Rfd3A7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJTzg1X01NQzJfV1ApOworCisJZXJyID0gcmVxdWVzdF9pcnEoQ01fWDMwMF9NTUMyX0lSUSwgY21feDMwMF9kZXRlY3RfaW50LAorCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE1NQy9TRC9TRElPOiAiCisJCQkJImNhbid0IHJlcXVlc3QgY2FyZCBkZXRlY3QgSVJRXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOworCX0KKworCXJldHVybiAwOworCitlcnJfcmVxdWVzdF9pcnE6CisJZ3Bpb19mcmVlKEdQSU84NV9NTUMyX1dQKTsKK2Vycl9yZXF1ZXN0X3dwOgorCWdwaW9fZnJlZShHUElPODJfTU1DMl9JUlEpOworZXJyX3JlcXVlc3RfY2Q6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgY21feDMwMF9tY2kyX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKENNX1gzMDBfTU1DMl9JUlEsIGRhdGEpOworCWdwaW9fZnJlZShHUElPODJfTU1DMl9JUlEpOworCWdwaW9fZnJlZShHUElPODVfTU1DMl9XUCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY21feDMwMF9tY2kyX3BsYXRmb3JtX2RhdGEgPSB7CisJLmRldGVjdF9kZWxheQk9IDIwLAorCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuaW5pdCAJCT0gY21feDMwMF9tY2kyX2luaXQsCisJLmV4aXQJCT0gY21feDMwMF9tY2kyX2V4aXQsCisJLmdldF9ybwkJPSBjbV94MzAwX21jaTJfcm8sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY21feDMwMF9pbml0X21tYyh2b2lkKQoreworCXB4YV9zZXRfbWNpX2luZm8oJmNtX3gzMDBfbWNpX3BsYXRmb3JtX2RhdGEpOworCXB4YTN4eF9zZXRfbWNpMl9pbmZvKCZjbV94MzAwX21jaTJfcGxhdGZvcm1fZGF0YSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNtX3gzMDBfaW5pdF9tbWModm9pZCkge30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgY21feDMwMF9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CisJLnBvcnRfbW9kZQk9IFBNTV9QRVJQT1JUX01PREUsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUMSB8IEVOQUJMRV9QT1JUMiB8IFBPV0VSX0NPTlRST0xfTE9XLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF9vaGNpKHZvaWQpCit7CisJcHhhX3NldF9vaGNpX2luZm8oJmNtX3gzMDBfb2hjaV9wbGF0Zm9ybV9kYXRhKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY21feDMwMF9pbml0X29oY2kodm9pZCkge30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTEVEU19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0dQSU9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBncGlvX2xlZCBjbV94MzAwX2xlZHNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lID0gImNtLXgzMDA6Z3JlZW4iLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImhlYXJ0YmVhdCIsCisJCS5ncGlvID0gNzksCisJCS5hY3RpdmVfbG93ID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGNtX3gzMDBfZ3Bpb19sZWRfcGRhdGEgPSB7CisJLm51bV9sZWRzID0gQVJSQVlfU0laRShjbV94MzAwX2xlZHMpLAorCS5sZWRzID0gY21feDMwMF9sZWRzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY21feDMwMF9sZWRfZGV2aWNlID0geworCS5uYW1lCQk9ICJsZWRzLWdwaW8iLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmY21feDMwMF9ncGlvX2xlZF9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF9sZWRzKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjbV94MzAwX2xlZF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV94MzAwX2luaXRfbGVkcyh2b2lkKSB7fQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisvKiBQQ0E5NTU1ICovCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBjbV94MzAwX2dwaW9fZXh0X3BkYXRhXzAgPSB7CisJLmdwaW9fYmFzZSA9IDEyOCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIGNtX3gzMDBfZ3Bpb19leHRfcGRhdGFfMSA9IHsKKwkuZ3Bpb19iYXNlID0gMTQ0LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjbV94MzAwX2dwaW9fZXh0X2luZm9bXSA9IHsKKwlbMF0gPSB7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTU1IiwgMHgyNCksCisJCS5wbGF0Zm9ybV9kYXRhID0gJmNtX3gzMDBfZ3Bpb19leHRfcGRhdGFfMCwKKwl9LAorCVsxXSA9IHsKKwkJSTJDX0JPQVJEX0lORk8oInBjYTk1NTUiLCAweDI1KSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmY21feDMwMF9ncGlvX2V4dF9wZGF0YV8xLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY21feDMwMF9pbml0X2kyYyh2b2lkKQoreworCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgY21feDMwMF9ncGlvX2V4dF9pbmZvLAorCQkJCUFSUkFZX1NJWkUoY21feDMwMF9ncGlvX2V4dF9pbmZvKSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNtX3gzMDBfaW5pdF9pMmModm9pZCkge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgY21feDMwMF9pbml0KHZvaWQpCit7CisJLyogYm9hcmQtcHJvY2Vzc29yIHNwZWNpZmljIEdQSU8gaW5pdGlhbGl6YXRpb24gKi8KKwlweGEzeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShjbV94MzAwX21mcF9jZmcpKTsKKworCWNtX3gzMDBfaW5pdF9kbTkwMDAoKTsKKwljbV94MzAwX2luaXRfbGNkKCk7CisJY21feDMwMF9pbml0X29oY2koKTsKKwljbV94MzAwX2luaXRfbW1jKCk7CisJY21feDMwMF9pbml0X25hbmQoKTsKKwljbV94MzAwX2luaXRfbGVkcygpOworCWNtX3gzMDBfaW5pdF9pMmMoKTsKK30KKworTUFDSElORV9TVEFSVChDTV9YMzAwLCAiQ00tWDMwMCBtb2R1bGUiKQorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGNtX3gzMDBfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLmMKaW5kZXggYWJjZTEzYy4uZTg0NzM2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmkuYwpAQCAtMjksMTIgKzI5LDE3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvY29saWJyaS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY29saWJyaV9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwlHUElPNzhfbkNTXzIsCS8qIEV0aGVybmV0IENTICovCisJR1BJTzExNF9HUElPLAkvKiBFdGhlcm5ldCBJUlEgKi8KK307CisKIC8qCiAgKiBGbGFzaAogICovCkBAIC0xMTYsOSArMTIxLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGNvbGlicmlfaW5pdCh2b2lkKQogewotCS8qIERNOTAwMCBMQU4gKi8KLQlweGFfZ3Bpb19tb2RlKEdQSU83OF9uQ1NfMl9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPX0RNOTAwMCB8IEdQSU9fSU4pOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGNvbGlicmlfcGluX2NvbmZpZykpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoY29saWJyaV9kZXZpY2VzLCBBUlJBWV9TSVpFKGNvbGlicmlfZGV2aWNlcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKaW5kZXggZTcwM2E4ZC4uNjU1NThkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCkBAIC0yMCw3ICsyMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvY29yZ2lfbGNkLmg+CiAjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTI4LDcgKzMzLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzcsMTEgKzQxLDEyIEBACiAKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eF9zcGkuaD4KICNpbmNsdWRlIDxtYWNoL2NvcmdpLmg+CiAjaW5jbHVkZSA8bWFjaC9zaGFycHNsLmg+CiAKQEAgLTUyLDYgKzU3LDYxIEBACiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgInNoYXJwc2wuaCIKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY29yZ2lfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogU3RhdGljIE1lbW9yeSBJL08gKi8KKwlHUElPNzhfbkNTXzIsCS8qIHcxMDBmYiAqLworCUdQSU84MF9uQ1NfNCwJLyogc2Nvb3AgKi8KKworCS8qIFNTUDEgKi8KKwlHUElPMjNfU1NQMV9TQ0xLLAorCUdQSU8yNV9TU1AxX1RYRCwKKwlHUElPMjZfU1NQMV9SWEQsCisJR1BJTzI0X0dQSU8sCS8qIENPUkdJX0dQSU9fQURTNzg0Nl9DUyAtIFNGUk0gYXMgY2hpcCBzZWxlY3QgKi8KKworCS8qIEkyUyAqLworCUdQSU8yOF9JMlNfQklUQ0xLX09VVCwKKwlHUElPMjlfSTJTX1NEQVRBX0lOLAorCUdQSU8zMF9JMlNfU0RBVEFfT1VULAorCUdQSU8zMV9JMlNfU1lOQywKKwlHUElPMzJfSTJTX1NZU0NMSywKKworCS8qIEluZnJhLVJlZCAqLworCUdQSU80N19GSUNQX1RYRCwKKwlHUElPNDZfRklDUF9SWEQsCisKKwkvKiBGRlVBUlQgKi8KKwlHUElPNDBfRkZVQVJUX0RUUiwKKwlHUElPNDFfRkZVQVJUX1JUUywKKwlHUElPMzlfRkZVQVJUX1RYRCwKKwlHUElPMzdfRkZVQVJUX0RTUiwKKwlHUElPMzRfRkZVQVJUX1JYRCwKKwlHUElPMzVfRkZVQVJUX0NUUywKKworCS8qIFBDIENhcmQgKi8KKwlHUElPNDhfblBPRSwKKwlHUElPNDlfblBXRSwKKwlHUElPNTBfblBJT1IsCisJR1BJTzUxX25QSU9XLAorCUdQSU81Ml9uUENFXzEsCisJR1BJTzUzX25QQ0VfMiwKKwlHUElPNTRfblBTS1RTRUwsCisJR1BJTzU1X25QUkVHLAorCUdQSU81Nl9uUFdBSVQsCisJR1BJTzU3X25JT0lTMTYsCisKKwkvKiBNTUMgKi8KKwlHUElPNl9NTUNfQ0xLLAorCUdQSU84X01NQ19DUzAsCisKKwkvKiBHUElPICovCisJR1BJTzlfR1BJTywJLyogQ09SR0lfR1BJT19uU0RfREVURUNUICovCisJR1BJTzdfR1BJTywJLyogQ09SR0lfR1BJT19uU0RfV1AgKi8KKwlHUElPMzNfR1BJTywJLyogQ09SR0lfR1BJT19TRF9QV1IgKi8KKwlHUElPMjJfR1BJTywJLyogQ09SR0lfR1BJT19JUl9PTiAqLworCUdQSU80NF9HUElPLAkvKiBDT1JHSV9HUElPX0hTWU5DICovCisKKwlHUElPMV9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwKK307CiAKIC8qCiAgKiBDb3JnaSBTQ09PUCBEZXZpY2UKQEAgLTY3LDYgKzEyNyw3IEBACiBzdGF0aWMgc3RydWN0IHNjb29wX2NvbmZpZyBjb3JnaV9zY29vcF9zZXR1cCA9IHsKIAkuaW9fZGlyIAk9IENPUkdJX1NDT09QX0lPX0RJUiwKIAkuaW9fb3V0CQk9IENPUkdJX1NDT09QX0lPX09VVCwKKwkuZ3Bpb19iYXNlCT0gQ09SR0lfU0NPT1BfR1BJT19CQVNFLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNjb29wX2RldmljZSA9IHsKQEAgLTc5LDI3ICsxNDAsNiBAQAogCS5yZXNvdXJjZQk9IGNvcmdpX3Njb29wX3Jlc291cmNlcywKIH07CiAKLXN0YXRpYyB2b2lkIGNvcmdpX3BjbWNpYV9pbml0KHZvaWQpCi17Ci0JLyogU2V0dXAgZGVmYXVsdCBzdGF0ZSBvZiBHUElPIG91dHB1dHMKLQkgICBiZWZvcmUgd2UgZW5hYmxlIHRoZW0gYXMgb3V0cHV0cy4gKi8KLQlHUFNSKEdQSU80OF9uUE9FKSA9IEdQSU9fYml0KEdQSU80OF9uUE9FKSB8Ci0JCUdQSU9fYml0KEdQSU80OV9uUFdFKSB8IEdQSU9fYml0KEdQSU81MF9uUElPUikgfAotCQlHUElPX2JpdChHUElPNTFfblBJT1cpIHwgR1BJT19iaXQoR1BJTzUyX25QQ0VfMSkgfAotCQlHUElPX2JpdChHUElPNTNfblBDRV8yKTsKLQotCXB4YV9ncGlvX21vZGUoR1BJTzQ4X25QT0VfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzQ5X25QV0VfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzUwX25QSU9SX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81MV9uUElPV19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTVfblBSRUdfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU2X25QV0FJVF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTdfbklPSVMxNl9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTJfblBDRV8xX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81M19uUENFXzJfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU0X3BTS1RTRUxfTUQpOwotfQotCiBzdGF0aWMgc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgY29yZ2lfcGNtY2lhX3Njb29wW10gPSB7CiB7CiAJLmRldiAgICAgICAgPSAmY29yZ2lzY29vcF9kZXZpY2UuZGV2LApAQCAtMTEyLDU4ICsxNTIsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2NvbmZpZyBjb3JnaV9wY21jaWFfY29uZmlnID0gewogCS5kZXZzICAgICAgICAgPSAmY29yZ2lfcGNtY2lhX3Njb29wWzBdLAogCS5udW1fZGV2cyAgICAgPSAxLAotCS5wY21jaWFfaW5pdCAgPSBjb3JnaV9wY21jaWFfaW5pdCwKIH07CiAKIEVYUE9SVF9TWU1CT0woY29yZ2lzY29vcF9kZXZpY2UpOwogCi0KLS8qCi0gKiBDb3JnaSBTU1AgRGV2aWNlCi0gKgotICogU2V0IHRoZSBwYXJlbnQgYXMgdGhlIHNjb29wIGRldmljZSBiZWNhdXNlIGEgbG90IG9mIFNTUCBkZXZpY2VzCi0gKiBhbHNvIHVzZSBzY29vcCBmdW5jdGlvbnMgYW5kIHRoaXMgbWFrZXMgdGhlIHBvd2VyIHVwL2Rvd24gb3JkZXIKLSAqIHdvcmsgY29ycmVjdGx5LgotICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpc3NwX2RldmljZSA9IHsKLQkubmFtZQkJPSAiY29yZ2ktc3NwIiwKLQkuZGV2CQk9IHsKLSAJCS5wYXJlbnQgPSAmY29yZ2lzY29vcF9kZXZpY2UuZGV2LAotCX0sCi0JLmlkCQk9IC0xLAotfTsKLQotc3RydWN0IGNvcmdpc3NwX21hY2hpbmZvIGNvcmdpX3NzcF9tYWNoaW5mbyA9IHsKLQkucG9ydAkJPSAxLAotCS5jc19sY2Rjb24JPSBDT1JHSV9HUElPX0xDRENPTl9DUywKLQkuY3NfYWRzNzg0Ngk9IENPUkdJX0dQSU9fQURTNzg0Nl9DUywKLQkuY3NfbWF4MTExMQk9IENPUkdJX0dQSU9fTUFYMTExMV9DUywKLQkuY2xrX2xjZGNvbgk9IDc2LAotCS5jbGtfYWRzNzg0Ngk9IDIsCi0JLmNsa19tYXgxMTExCT0gOCwKLX07Ci0KLQotLyoKLSAqIExDRC9GcmFtZWJ1ZmZlcgotICovCi1zdGF0aWMgdm9pZCB3MTAwX2xjZHRnX3N1c3BlbmQoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKLXsKLQljb3JnaV9sY2R0Z19zdXNwZW5kKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHcxMDBfbGNkdGdfaW5pdChzdHJ1Y3QgdzEwMGZiX3BhciAqcGFyKQotewotCWNvcmdpX2xjZHRnX2h3X2luaXQocGFyLT54cmVzKTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHcxMDBfdGdfaW5mbyBjb3JnaV9sY2R0Z19pbmZvID0gewotCS5jaGFuZ2UgID0gdzEwMF9sY2R0Z19pbml0LAotCS5zdXNwZW5kID0gdzEwMF9sY2R0Z19zdXNwZW5kLAotCS5yZXN1bWUgID0gdzEwMF9sY2R0Z19pbml0LAotfTsKLQogc3RhdGljIHN0cnVjdCB3MTAwX21lbV9pbmZvIGNvcmdpX2ZiX21lbSA9IHsKIAkuZXh0X2NudGwgICAgICAgICAgPSAweDAwMDQwMDAzLAogCS5zZHJhbV9tb2RlX3JlZyAgICA9IDB4MDA2NTAwMjEsCkBAIC0yNDIsNyArMjM0LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdzEwMGZiX21hY2hfaW5mbyBjb3JnaV9mYl9pbmZvID0gewotCS50ZyAgICAgICAgID0gJmNvcmdpX2xjZHRnX2luZm8sCiAJLmluaXRfbW9kZSAgPSBJTklUX01PREVfUk9UQVRFRCwKIAkubWVtICAgICAgICA9ICZjb3JnaV9mYl9tZW0sCiAJLnJlZ3MgICAgICAgPSAmY29yZ2lfZmJfcmVncywKQEAgLTI2OCw2MCArMjU5LDEwIEBACiAJLnJlc291cmNlCT0gY29yZ2lfZmJfcmVzb3VyY2VzLAogCS5kZXYgICAgICAgICAgICA9IHsKIAkJLnBsYXRmb3JtX2RhdGEgPSAmY29yZ2lfZmJfaW5mbywKLQkJLnBhcmVudCA9ICZjb3JnaXNzcF9kZXZpY2UuZGV2LAogCX0sCiAKIH07CiAKLQotLyoKLSAqIENvcmdpIEJhY2tsaWdodCBEZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgY29yZ2lfYmxfa2lja19iYXR0ZXJ5KHZvaWQpCi17Ci0Jdm9pZCAoKmtpY2tfYmF0dCkodm9pZCk7Ci0KLQlraWNrX2JhdHQgPSBzeW1ib2xfZ2V0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKLQlpZiAoa2lja19iYXR0KSB7Ci0JCWtpY2tfYmF0dCgpOwotCQlzeW1ib2xfcHV0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcmdpX2JsX3NldF9pbnRlbnNpdHkoaW50IGludGVuc2l0eSkKLXsKLQlpZiAoaW50ZW5zaXR5ID4gMHgxMCkKLQkJaW50ZW5zaXR5ICs9IDB4MTA7Ci0KLQkvKiBCaXRzIDAtNCBhcmUgYWNjZXNzZWQgdmlhIHRoZSBTU1AgaW50ZXJmYWNlICovCi0JY29yZ2lfc3NwX2JsZHV0eV9zZXQoaW50ZW5zaXR5ICYgMHgxZik7Ci0KLQkvKiBCaXQgNSBpcyB2aWEgU0NPT1AgKi8KLQlpZiAoaW50ZW5zaXR5ICYgMHgwMDIwKQotCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfQkFDS0xJR0hUX0NPTlQpOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfQkFDS0xJR0hUX0NPTlQpOwotfQotCi1zdGF0aWMgc3RydWN0IGdlbmVyaWNfYmxfaW5mbyBjb3JnaV9ibF9tYWNoaW5mbyA9IHsKLQkubmFtZSA9ICJjb3JnaS1ibCIsCi0JLm1heF9pbnRlbnNpdHkgPSAweDJmLAotCS5kZWZhdWx0X2ludGVuc2l0eSA9IDB4MWYsCi0JLmxpbWl0X21hc2sgPSAweDBiLAotCS5zZXRfYmxfaW50ZW5zaXR5ID0gY29yZ2lfYmxfc2V0X2ludGVuc2l0eSwKLQkua2lja19iYXR0ZXJ5ID0gY29yZ2lfYmxfa2lja19iYXR0ZXJ5LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2libF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImdlbmVyaWMtYmwiLAotCS5kZXYJCT0gewotIAkJLnBhcmVudCA9ICZjb3JnaWZiX2RldmljZS5kZXYsCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJmNvcmdpX2JsX21hY2hpbmZvLAotCX0sCi0JLmlkCQk9IC0xLAotfTsKLQotCiAvKgogICogQ29yZ2kgS2V5Ym9hcmQgRGV2aWNlCiAgKi8KQEAgLTMzMCw3NSArMjcxLDM1IEBACiAJLmlkCQk9IC0xLAogfTsKIAotCiAvKgogICogQ29yZ2kgTEVEcwogICovCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGNvcmdpX2dwaW9fbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJjb3JnaTphbWJlcjpjaGFyZ2UiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gInNoYXJwc2wtY2hhcmdlIiwKKwkJLmdwaW8JCQk9IENPUkdJX0dQSU9fTEVEX09SQU5HRSwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJjb3JnaTpncmVlbjptYWlsIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJuYW5kLWRpc2siLAorCQkuZ3BpbwkJCT0gQ09SR0lfR1BJT19MRURfR1JFRU4sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBjb3JnaV9ncGlvX2xlZHNfaW5mbyA9IHsKKwkubGVkcwkJPSBjb3JnaV9ncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShjb3JnaV9ncGlvX2xlZHMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2lsZWRfZGV2aWNlID0gewotCS5uYW1lCQk9ICJjb3JnaS1sZWQiLAorCS5uYW1lCQk9ICJsZWRzLWdwaW8iLAogCS5pZAkJPSAtMSwKLX07Ci0KLQotLyoKLSAqIENvcmdpIFRvdWNoIFNjcmVlbiBEZXZpY2UKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgKCpnZXRfaHN5bmNfaW52cGVyaW9kKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCi1zdGF0aWMgdm9pZCBpbmxpbmUgc2hhcnBzbF93YWl0X3N5bmMoaW50IGdwaW8pCi17Ci0Jd2hpbGUoKEdQTFIoZ3BpbykgJiBHUElPX2JpdChncGlvKSkgPT0gMCk7Ci0Jd2hpbGUoKEdQTFIoZ3BpbykgJiBHUElPX2JpdChncGlvKSkgIT0gMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvcmdpX2dldF9oc3luY19pbnZwZXJpb2Qodm9pZCkKLXsKLQlpZiAoIWdldF9oc3luY19pbnZwZXJpb2QpCi0JCWdldF9oc3luY19pbnZwZXJpb2QgPSBzeW1ib2xfZ2V0KHcxMDBmYl9nZXRfaHN5bmNsZW4pOwotCWlmICghZ2V0X2hzeW5jX2ludnBlcmlvZCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZ2V0X2hzeW5jX2ludnBlcmlvZCgmY29yZ2lmYl9kZXZpY2UuZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgY29yZ2lfcHV0X2hzeW5jKHZvaWQpCi17Ci0JaWYgKGdldF9oc3luY19pbnZwZXJpb2QpCi0JCXN5bWJvbF9wdXQodzEwMGZiX2dldF9oc3luY2xlbik7Ci0JZ2V0X2hzeW5jX2ludnBlcmlvZCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcmdpX3dhaXRfaHN5bmModm9pZCkKLXsKLQlzaGFycHNsX3dhaXRfc3luYyhDT1JHSV9HUElPX0hTWU5DKTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb3JnaXRzX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IENPUkdJX0lSUV9HUElPX1RQX0lOVCwKLQkJLmVuZAkJPSBDT1JHSV9JUlFfR1BJT19UUF9JTlQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjb3JnaXRzX21hY2hpbmZvICBjb3JnaV90c19tYWNoaW5mbyA9IHsKLQkuZ2V0X2hzeW5jX2ludnBlcmlvZCA9IGNvcmdpX2dldF9oc3luY19pbnZwZXJpb2QsCi0JLnB1dF9oc3luYyAgICAgICAgICAgPSBjb3JnaV9wdXRfaHN5bmMsCi0JLndhaXRfaHN5bmMgICAgICAgICAgPSBjb3JnaV93YWl0X2hzeW5jLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29yZ2l0c19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImNvcmdpLXRzIiwKIAkuZGV2CQk9IHsKLSAJCS5wYXJlbnQgPSAmY29yZ2lzc3BfZGV2aWNlLmRldiwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmY29yZ2lfdHNfbWFjaGluZm8sCisJCS5wbGF0Zm9ybV9kYXRhID0gJmNvcmdpX2dwaW9fbGVkc19pbmZvLAogCX0sCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjb3JnaXRzX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gY29yZ2l0c19yZXNvdXJjZXMsCiB9OwogCi0KIC8qCiAgKiBNTUMvU0QgRGV2aWNlCiAgKgpAQCAtNDExLDIwICszMTIsNDIgQEAKIHsKIAlpbnQgZXJyOwogCi0JLyogc2V0dXAgR1BJTyBmb3IgUFhBMjV4IE1NQyBjb250cm9sbGVyCSovCi0JcHhhX2dwaW9fbW9kZShHUElPNl9NTUNDTEtfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzhfTU1DQ1MwX01EKTsKLQlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fblNEX0RFVEVDVCB8IEdQSU9fSU4pOwotCXB4YV9ncGlvX21vZGUoQ09SR0lfR1BJT19TRF9QV1IgfCBHUElPX09VVCk7CisJZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fblNEX0RFVEVDVCwgIm5TRF9ERVRFQ1QiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoQ09SR0lfR1BJT19uU0RfV1AsICJuU0RfV1AiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzE7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoQ09SR0lfR1BJT19TRF9QV1IsICJTRF9QV1IiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzI7CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChDT1JHSV9HUElPX25TRF9ERVRFQ1QpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KENPUkdJX0dQSU9fblNEX1dQKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoQ09SR0lfR1BJT19TRF9QV1IsIDApOwogCiAJY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEuZGV0ZWN0X2RlbGF5ID0gbXNlY3NfdG9famlmZmllcygyNTApOwogCiAJZXJyID0gcmVxdWVzdF9pcnEoQ09SR0lfSVJRX0dQSU9fblNEX0RFVEVDVCwgY29yZ2lfZGV0ZWN0X2ludCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCSAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiAiY29yZ2lfbWNpX2luaXQ6IE1NQy9TRDogY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iKTsKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIlczogTU1DL1NEOiBjYW4ndCByZXF1ZXN0IE1NQyBjYXJkIGRldGVjdCBJUlFcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9mcmVlXzM7CisJfQorCXJldHVybiAwOwogCitlcnJfZnJlZV8zOgorCWdwaW9fZnJlZShDT1JHSV9HUElPX1NEX1BXUik7CitlcnJfZnJlZV8yOgorCWdwaW9fZnJlZShDT1JHSV9HUElPX25TRF9XUCk7CitlcnJfZnJlZV8xOgorCWdwaW9fZnJlZShDT1JHSV9HUElPX25TRF9ERVRFQ1QpOworZXJyX291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00MzIsMjAgKzM1NSwyMCBAQAogewogCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSogcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKCggMSA8PCB2ZGQpICYgcF9kLT5vY3JfbWFzaykKLQkJR1BTUjEgPSBHUElPX2JpdChDT1JHSV9HUElPX1NEX1BXUik7Ci0JZWxzZQotCQlHUENSMSA9IEdQSU9fYml0KENPUkdJX0dQSU9fU0RfUFdSKTsKKwlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX1NEX1BXUiwgKCgxIDw8IHZkZCkgJiBwX2QtPm9jcl9tYXNrKSk7CiB9CiAKIHN0YXRpYyBpbnQgY29yZ2lfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIEdQTFIoQ09SR0lfR1BJT19uU0RfV1ApICYgR1BJT19iaXQoQ09SR0lfR1BJT19uU0RfV1ApOworCXJldHVybiBncGlvX2dldF92YWx1ZShDT1JHSV9HUElPX25TRF9XUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvcmdpX21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlmcmVlX2lycShDT1JHSV9JUlFfR1BJT19uU0RfREVURUNULCBkYXRhKTsKKwlncGlvX2ZyZWUoQ09SR0lfR1BJT19TRF9QV1IpOworCWdwaW9fZnJlZShDT1JHSV9HUElPX25TRF9XUCk7CisJZ3Bpb19mcmVlKENPUkdJX0dQSU9fblNEX0RFVEVDVCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEgPSB7CkBAIC00NjIsMTYgKzM4NSwzMiBAQAogICovCiBzdGF0aWMgdm9pZCBjb3JnaV9pcmRhX3RyYW5zY2VpdmVyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSkKIHsKLQlpZiAobW9kZSAmIElSX09GRikKLQkJR1BTUihDT1JHSV9HUElPX0lSX09OKSA9IEdQSU9fYml0KENPUkdJX0dQSU9fSVJfT04pOwotCWVsc2UKLQkJR1BDUihDT1JHSV9HUElPX0lSX09OKSA9IEdQSU9fYml0KENPUkdJX0dQSU9fSVJfT04pOworCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fSVJfT04sIG1vZGUgJiBJUl9PRkYpOwogCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7CiB9CiAKK3N0YXRpYyBpbnQgY29yZ2lfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fSVJfT04sICJJUl9PTiIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoQ09SR0lfR1BJT19JUl9PTiwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcmdpX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWdwaW9fZnJlZShDT1JHSV9HUElPX0lSX09OKTsKK30KKwogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgY29yZ2lfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZSA9IGNvcmdpX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IGNvcmdpX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuc3RhcnR1cAkJPSBjb3JnaV9pcmRhX3N0YXJ0dXAsCisJLnNodXRkb3duCQk9IGNvcmdpX2lyZGFfc2h1dGRvd24sCiB9OwogCiAKQEAgLTQ4MywxNCArNDIyLDEyOSBAQAogCS5ncGlvX3B1bGx1cAkJPSBDT1JHSV9HUElPX1VTQl9QVUxMVVAsCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1BYQTJYWCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX1BYQTJYWF9NQVNURVIpCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfbWFzdGVyIGNvcmdpX3NwaV9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdAk9IDMsCit9OworCitzdGF0aWMgc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSBjb3JnaV9hZHM3ODQ2X2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODQ2LAorCS52cmVmX2RlbGF5X3VzZWNzCT0gMTAwLAorCS54X3BsYXRlX29obXMJCT0gNDE5LAorCS55X3BsYXRlX29obXMJCT0gNDg2LAorCS5ncGlvX3BlbmRvd24JCT0gQ09SR0lfR1BJT19UUF9JTlQsCit9OworCitzdGF0aWMgdm9pZCBjb3JnaV9hZHM3ODQ2X2NzKHUzMiBjb21tYW5kKQoreworCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fQURTNzg0Nl9DUywgIShjb21tYW5kID09IFBYQTJYWF9DU19BU1NFUlQpKTsKK30KKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgY29yZ2lfYWRzNzg0Nl9jaGlwID0geworCS5jc19jb250cm9sCT0gY29yZ2lfYWRzNzg0Nl9jcywKK307CisKK3N0YXRpYyB2b2lkIGNvcmdpX2JsX2tpY2tfYmF0dGVyeSh2b2lkKQoreworCXZvaWQgKCpraWNrX2JhdHQpKHZvaWQpOworCisJa2lja19iYXR0ID0gc3ltYm9sX2dldChzaGFycHNsX2JhdHRlcnlfa2ljayk7CisJaWYgKGtpY2tfYmF0dCkgeworCQlraWNrX2JhdHQoKTsKKwkJc3ltYm9sX3B1dChzaGFycHNsX2JhdHRlcnlfa2ljayk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNvcmdpX2xjZF9wbGF0Zm9ybV9kYXRhIGNvcmdpX2xjZGNvbl9pbmZvID0geworCS5pbml0X21vZGUJCT0gQ09SR0lfTENEX01PREVfVkdBLAorCS5tYXhfaW50ZW5zaXR5CQk9IDB4MmYsCisJLmRlZmF1bHRfaW50ZW5zaXR5CT0gMHgxZiwKKwkubGltaXRfbWFzawkJPSAweDBiLAorCS5ncGlvX2JhY2tsaWdodF9jb250CT0gQ09SR0lfR1BJT19CQUNLTElHSFRfQ09OVCwKKwkuZ3Bpb19iYWNrbGlnaHRfb24JPSAtMSwKKwkua2lja19iYXR0ZXJ5CQk9IGNvcmdpX2JsX2tpY2tfYmF0dGVyeSwKK307CisKK3N0YXRpYyB2b2lkIGNvcmdpX2xjZGNvbl9jcyh1MzIgY29tbWFuZCkKK3sKKwlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX0xDRENPTl9DUywgIShjb21tYW5kID09IFBYQTJYWF9DU19BU1NFUlQpKTsKK30KKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgY29yZ2lfbGNkY29uX2NoaXAgPSB7CisJLmNzX2NvbnRyb2wJPSBjb3JnaV9sY2Rjb25fY3MsCit9OworCitzdGF0aWMgdm9pZCBjb3JnaV9tYXgxMTExX2NzKHUzMiBjb21tYW5kKQoreworCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTUFYMTExMV9DUywgIShjb21tYW5kID09IFBYQTJYWF9DU19BU1NFUlQpKTsKK30KKworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgY29yZ2lfbWF4MTExMV9jaGlwID0geworCS5jc19jb250cm9sCT0gY29yZ2lfbWF4MTExMV9jcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gY29yZ2lfc3BpX2RldmljZXNbXSA9IHsKKwl7CisJCS5tb2RhbGlhcwk9ICJhZHM3ODQ2IiwKKwkJLm1heF9zcGVlZF9oegk9IDEyMDAwMDAsCisJCS5idXNfbnVtCT0gMSwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY29yZ2lfYWRzNzg0Nl9pbmZvLAorCQkuY29udHJvbGxlcl9kYXRhPSAmY29yZ2lfYWRzNzg0Nl9jaGlwLAorCQkuaXJxCQk9IGdwaW9fdG9faXJxKENPUkdJX0dQSU9fVFBfSU5UKSwKKwl9LCB7CisJCS5tb2RhbGlhcwk9ICJjb3JnaS1sY2QiLAorCQkubWF4X3NwZWVkX2h6CT0gNTAwMDAsCisJCS5idXNfbnVtCT0gMSwKKwkJLmNoaXBfc2VsZWN0CT0gMSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY29yZ2lfbGNkY29uX2luZm8sCisJCS5jb250cm9sbGVyX2RhdGE9ICZjb3JnaV9sY2Rjb25fY2hpcCwKKwl9LCB7CisJCS5tb2RhbGlhcwk9ICJtYXgxMTExIiwKKwkJLm1heF9zcGVlZF9oegk9IDQ1MDAwMCwKKwkJLmJ1c19udW0JPSAxLAorCQkuY2hpcF9zZWxlY3QJPSAyLAorCQkuY29udHJvbGxlcl9kYXRhPSAmY29yZ2lfbWF4MTExMV9jaGlwLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY29yZ2lfaW5pdF9zcGkodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KENPUkdJX0dQSU9fQURTNzg0Nl9DUywgIkFEUzc4NDZfQ1MiKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwllcnIgPSBncGlvX3JlcXVlc3QoQ09SR0lfR1BJT19MQ0RDT05fQ1MsICJMQ0RDT05fQ1MiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzE7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoQ09SR0lfR1BJT19NQVgxMTExX0NTLCAiTUFYMTExMV9DUyIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfMjsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChDT1JHSV9HUElPX0FEUzc4NDZfQ1MsIDEpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChDT1JHSV9HUElPX0xDRENPTl9DUywgMSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KENPUkdJX0dQSU9fTUFYMTExMV9DUywgMSk7CisKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDEsICZjb3JnaV9zcGlfaW5mbyk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oQVJSQVlfQU5EX1NJWkUoY29yZ2lfc3BpX2RldmljZXMpKTsKKwlyZXR1cm47CisKK2Vycl9mcmVlXzI6CisJZ3Bpb19mcmVlKENPUkdJX0dQSU9fTENEQ09OX0NTKTsKK2Vycl9mcmVlXzE6CisJZ3Bpb19mcmVlKENPUkdJX0dQSU9fQURTNzg0Nl9DUyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNvcmdpX2luaXRfc3BpKHZvaWQpIHt9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZjb3JnaXNjb29wX2RldmljZSwKLQkmY29yZ2lzc3BfZGV2aWNlLAogCSZjb3JnaWZiX2RldmljZSwKIAkmY29yZ2lrYmRfZGV2aWNlLAotCSZjb3JnaWJsX2RldmljZSwKLQkmY29yZ2l0c19kZXZpY2UsCiAJJmNvcmdpbGVkX2RldmljZSwKIH07CiAKQEAgLTQ5OCw3ICs1NTIsOCBAQAogewogCWlmICghbWFjaGluZV9pc19jb3JnaSgpKQogCQkvKiBHcmVlbiBMRUQgb2ZmIHRlbGxzIHRoZSBib290bG9hZGVyIHRvIGhhbHQgKi8KLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTEVEX0dSRUVOKTsKKwkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19MRURfR1JFRU4sIDApOworCiAJYXJtX21hY2hpbmVfcmVzdGFydCgnaCcpOwogfQogCkBAIC01MDYsNyArNTYxLDggQEAKIHsKIAlpZiAoIW1hY2hpbmVfaXNfY29yZ2koKSkKIAkJLyogR3JlZW4gTEVEIG9uIHRlbGxzIHRoZSBib290bG9hZGVyIHRvIHJlYm9vdCAqLwotCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTEVEX0dSRUVOKTsKKwkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19MRURfR1JFRU4sIDEpOworCiAJYXJtX21hY2hpbmVfcmVzdGFydCgnaCcpOwogfQogCkBAIC01MTUsMjAgKzU3MSwxMiBAQAogCXBtX3Bvd2VyX29mZiA9IGNvcmdpX3Bvd2Vyb2ZmOwogCWFybV9wbV9yZXN0YXJ0ID0gY29yZ2lfcmVzdGFydDsKIAotCS8qIHNldHVwIHNsZWVwIG1vZGUgdmFsdWVzICovCi0JUFdFUiAgPSAweDAwMDAwMDAyOwotCVBGRVIgID0gMHgwMDAwMDAwMDsKLQlQUkVSICA9IDB4MDAwMDAwMDI7Ci0JUEdTUjAgPSAweDAxNThDMDAwOwotCVBHU1IxID0gMHgwMEZGMDA4MDsKLQlQR1NSMiA9IDB4MDAwMUMwMDQ7CiAJLyogU3RvcCAzLjZNSHogYW5kIGRyaXZlIEhJR0ggdG8gUENNQ0lBIGFuZCBDUyAqLwogCVBDRlIgfD0gUENGUl9PUERFOwogCi0JY29yZ2lfc3NwX3NldF9tYWNoaW5mbygmY29yZ2lfc3NwX21hY2hpbmZvKTsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShjb3JnaV9waW5fY29uZmlnKSk7CiAKLQlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fSVJfT04gfCBHUElPX09VVCk7Ci0JcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX0hTWU5DIHwgR1BJT19JTik7CisJY29yZ2lfaW5pdF9zcGkoKTsKIAogIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CiAJcHhhX3NldF9tY2lfaW5mbygmY29yZ2lfbWNpX3BsYXRmb3JtX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfbGNkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExYmFmMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9sY2QuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfbGNkLmMKLSAqCi0gKiBDb3JnaS9TcGl0eiBMQ0QgU3BlY2lmaWMgQ29kZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBSaWNoYXJkIFB1cmRpZQotICoKLSAqIENvbm5lY3Rpdml0eToKLSAqICAgQ29yZ2kgLSBMQ0QgdG8gQVRJIEltYWdlb24gdzEwMCAoV2FsbGFieSkKLSAqICAgU3BpdHogLSBMQ0QgdG8gUFhBIEZyYW1lYnVmZmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWFjaC9ha2l0YS5oPgotI2luY2x1ZGUgPG1hY2gvY29yZ2kuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvc2hhcnBzbC5oPgotI2luY2x1ZGUgPG1hY2gvc3BpdHouaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9zaGFycHNsX3BhcmFtLmg+Ci0jaW5jbHVkZSAiZ2VuZXJpYy5oIgotCi0vKiBSZWdpc3RlciBBZGRyZXNzZXMgKi8KLSNkZWZpbmUgUkVTQ1RMX0FEUlMgICAgIDB4MDAKLSNkZWZpbmUgUEhBQ1RSTF9BRFJTICAgIDB4MDEKLSNkZWZpbmUgRFVUWUNUUkxfQURSUyAgIDB4MDIKLSNkZWZpbmUgUE9XRVJSRUcwX0FEUlMgIDB4MDMKLSNkZWZpbmUgUE9XRVJSRUcxX0FEUlMgIDB4MDQKLSNkZWZpbmUgR1BPUjNfQURSUyAgICAgIDB4MDUKLSNkZWZpbmUgUElDVFJMX0FEUlMgICAgIDB4MDYKLSNkZWZpbmUgUE9MQ1RSTF9BRFJTICAgIDB4MDcKLQotLyogUmVnaXN0ZXIgQml0IERlZmluaXRpb25zICovCi0jZGVmaW5lIFJFU0NUTF9RVkdBICAgICAweDAxCi0jZGVmaW5lIFJFU0NUTF9WR0EgICAgICAweDAwCi0KLSNkZWZpbmUgUE9XRVIxX1ZXX09OICAgIDB4MDEgIC8qIFZXIFN1cHBseSBGRVQgT04gKi8KLSNkZWZpbmUgUE9XRVIxX0dWU1NfT04gIDB4MDIgIC8qIEdWU1MoLThWKSBQb3dlciBTdXBwbHkgT04gKi8KLSNkZWZpbmUgUE9XRVIxX1ZERF9PTiAgIDB4MDQgIC8qIFZERCg4ViksU1ZTUygtNFYpIFBvd2VyIFN1cHBseSBPTiAqLwotCi0jZGVmaW5lIFBPV0VSMV9WV19PRkYgICAweDAwICAvKiBWVyBTdXBwbHkgRkVUIE9GRiAqLwotI2RlZmluZSBQT1dFUjFfR1ZTU19PRkYgMHgwMCAgLyogR1ZTUygtOFYpIFBvd2VyIFN1cHBseSBPRkYgKi8KLSNkZWZpbmUgUE9XRVIxX1ZERF9PRkYgIDB4MDAgIC8qIFZERCg4ViksU1ZTUygtNFYpIFBvd2VyIFN1cHBseSBPRkYgKi8KLQotI2RlZmluZSBQT1dFUjBfQ09NX0RDTEsgMHgwMSAgLyogQ09NIFZvbHRhZ2UgREMgQmlhcyBEQUMgU2VyaWFsIERhdGEgQ2xvY2sgKi8KLSNkZWZpbmUgUE9XRVIwX0NPTV9ET1VUIDB4MDIgIC8qIENPTSBWb2x0YWdlIERDIEJpYXMgREFDIFNlcmlhbCBEYXRhIE91dCAqLwotI2RlZmluZSBQT1dFUjBfREFDX09OICAgMHgwNCAgLyogREFDIFBvd2VyIFN1cHBseSBPTiAqLwotI2RlZmluZSBQT1dFUjBfQ09NX09OICAgMHgwOCAgLyogQ09NIFBvd2VyIFN1cHBseSBPTiAqLwotI2RlZmluZSBQT1dFUjBfVkNDNV9PTiAgMHgxMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT04gKi8KLQotI2RlZmluZSBQT1dFUjBfREFDX09GRiAgMHgwMCAgLyogREFDIFBvd2VyIFN1cHBseSBPRkYgKi8KLSNkZWZpbmUgUE9XRVIwX0NPTV9PRkYgIDB4MDAgIC8qIENPTSBQb3dlciBTdXBwbHkgT0ZGICovCi0jZGVmaW5lIFBPV0VSMF9WQ0M1X09GRiAweDAwICAvKiBWQ0M1IFBvd2VyIFN1cHBseSBPRkYgKi8KLQotI2RlZmluZSBQSUNUUkxfSU5JVF9TVEFURSAgICAgIDB4MDEKLSNkZWZpbmUgUElDVFJMX0lOSU9GRiAgICAgICAgICAweDAyCi0jZGVmaW5lIFBJQ1RSTF9QT1dFUl9ET1dOICAgICAgMHgwNAotI2RlZmluZSBQSUNUUkxfQ09NX1NJR05BTF9PRkYgIDB4MDgKLSNkZWZpbmUgUElDVFJMX0RBQ19TSUdOQUxfT0ZGICAweDEwCi0KLSNkZWZpbmUgUE9MQ1RSTF9TWU5DX1BPTF9GQUxMICAweDAxCi0jZGVmaW5lIFBPTENUUkxfRU5fUE9MX0ZBTEwgICAgMHgwMgotI2RlZmluZSBQT0xDVFJMX0RBVEFfUE9MX0ZBTEwgIDB4MDQKLSNkZWZpbmUgUE9MQ1RSTF9TWU5DX0FDVF9IICAgICAweDA4Ci0jZGVmaW5lIFBPTENUUkxfRU5fQUNUX0wgICAgICAgMHgxMAotCi0jZGVmaW5lIFBPTENUUkxfU1lOQ19QT0xfUklTRSAgMHgwMAotI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9SSVNFICAgIDB4MDAKLSNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9SSVNFICAweDAwCi0jZGVmaW5lIFBPTENUUkxfU1lOQ19BQ1RfTCAgICAgMHgwMAotI2RlZmluZSBQT0xDVFJMX0VOX0FDVF9IICAgICAgIDB4MDAKLQotI2RlZmluZSBQSEFDVFJMX1BIQVNFX01BTlVBTCAgIDB4MDEKLSNkZWZpbmUgREVGQVVMVF9QSEFEX1FWR0EgICAgICg5KQotI2RlZmluZSBERUZBVUxUX0NPTUFESiAgICAgICAgKDEyNSkKLQotLyoKLSAqIFRoaXMgaXMgb25seSBhIHBzdWVkbyBJMkMgaW50ZXJmYWNlLiBXZSBjYW4ndCB1c2UgdGhlIHN0YW5kYXJkIGtlcm5lbAotICogcm91dGluZXMgYXMgdGhlIGludGVyZmFjZSBpcyB3cml0ZSBvbmx5LiBXZSBqdXN0IGFzc3VtZSB0aGUgZGF0YSBpcyBhY2tlZC4uLgotICovCi1zdGF0aWMgdm9pZCBsY2R0Z19zc3BfaTJjX3NlbmQodTggZGF0YSkKLXsKLQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgZGF0YSk7Ci0JdWRlbGF5KDEwKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaTJjX3NlbmRfYml0KHU4IGRhdGEpCi17Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGRhdGEpOwotCWxjZHRnX3NzcF9pMmNfc2VuZChkYXRhIHwgUE9XRVIwX0NPTV9EQ0xLKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX3N0YXJ0KHU4IGJhc2UpCi17Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UgfCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQpOwotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLKTsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX3N0b3AodTggYmFzZSkKLXsKLQlsY2R0Z19zc3BfaTJjX3NlbmQoYmFzZSk7Ci0JbGNkdGdfc3NwX2kyY19zZW5kKGJhc2UgfCBQT1dFUjBfQ09NX0RDTEspOwotCWxjZHRnX3NzcF9pMmNfc2VuZChiYXNlIHwgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUKTsKLX0KLQotc3RhdGljIHZvaWQgbGNkdGdfaTJjX3NlbmRfYnl0ZSh1OCBiYXNlLCB1OCBkYXRhKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKGRhdGEgJiAweDgwKQotCQkJbGNkdGdfaTJjX3NlbmRfYml0KGJhc2UgfCBQT1dFUjBfQ09NX0RPVVQpOwotCQllbHNlCi0JCQlsY2R0Z19pMmNfc2VuZF9iaXQoYmFzZSk7Ci0JCWRhdGEgPDw9IDE7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBsY2R0Z19pMmNfd2FpdF9hY2sodTggYmFzZSkKLXsKLQlsY2R0Z19pMmNfc2VuZF9iaXQoYmFzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxjZHRnX3NldF9jb21tb25fdm9sdGFnZSh1OCBiYXNlX2RhdGEsIHU4IGRhdGEpCi17Ci0JLyogU2V0IENvbW1vbiBWb2x0YWdlIHRvIE02MjMzMkZQIHZpYSBJMkMgKi8KLQlsY2R0Z19pMmNfc2VuZF9zdGFydChiYXNlX2RhdGEpOwotCWxjZHRnX2kyY19zZW5kX2J5dGUoYmFzZV9kYXRhLCAweDljKTsKLQlsY2R0Z19pMmNfd2FpdF9hY2soYmFzZV9kYXRhKTsKLQlsY2R0Z19pMmNfc2VuZF9ieXRlKGJhc2VfZGF0YSwgMHgwMCk7Ci0JbGNkdGdfaTJjX3dhaXRfYWNrKGJhc2VfZGF0YSk7Ci0JbGNkdGdfaTJjX3NlbmRfYnl0ZShiYXNlX2RhdGEsIGRhdGEpOwotCWxjZHRnX2kyY193YWl0X2FjayhiYXNlX2RhdGEpOwotCWxjZHRnX2kyY19zZW5kX3N0b3AoYmFzZV9kYXRhKTsKLX0KLQotLyogU2V0IFBoYXNlIEFkanVzdCAqLwotc3RhdGljIHZvaWQgbGNkdGdfc2V0X3BoYWRhZGooaW50IG1vZGUpCi17Ci0JaW50IGFkajsKLQlzd2l0Y2gobW9kZSkgewotCQljYXNlIDQ4MDoKLQkJY2FzZSA2NDA6Ci0JCQkvKiBTZXR0aW5nIGZvciBWR0EgKi8KLQkJCWFkaiA9IHNoYXJwc2xfcGFyYW0ucGhhZGFkajsKLQkJCWlmIChhZGogPCAwKSB7Ci0JCQkJYWRqID0gUEhBQ1RSTF9QSEFTRV9NQU5VQUw7Ci0JCQl9IGVsc2UgewotCQkJCWFkaiA9ICgoYWRqICYgMHgwZikgPDwgMSkgfCBQSEFDVFJMX1BIQVNFX01BTlVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDI0MDoKLQkJY2FzZSAzMjA6Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBTZXR0aW5nIGZvciBRVkdBICovCi0JCQlhZGogPSAoREVGQVVMVF9QSEFEX1FWR0EgPDwgMSkgfCBQSEFDVFJMX1BIQVNFX01BTlVBTDsKLQkJCWJyZWFrOwotCX0KLQotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBIQUNUUkxfQURSUywgYWRqKTsKLX0KLQotc3RhdGljIGludCBsY2RfaW5pdGVkOwotCi12b2lkIGNvcmdpX2xjZHRnX2h3X2luaXQoaW50IG1vZGUpCi17Ci0JaWYgKCFsY2RfaW5pdGVkKSB7Ci0JCWludCBjb21hZGo7Ci0KLQkJLyogSW5pdGlhbGl6ZSBJbnRlcm5hbCBMb2dpYyAmIFBvcnQgKi8KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9QT1dFUl9ET1dOIHwgUElDVFJMX0lOSU9GRiB8IFBJQ1RSTF9JTklUX1NUQVRFCi0JICAJCQl8IFBJQ1RSTF9DT01fU0lHTkFMX09GRiB8IFBJQ1RSTF9EQUNfU0lHTkFMX09GRik7Ci0KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT0ZGCi0JCQkJfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRik7Ci0KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PRkYgfCBQT1dFUjFfVkREX09GRik7Ci0KLQkJLyogVkREKCs4ViksIFNWU1MoLTRWKSBPTiAqLwotCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT04pOwotCQltZGVsYXkoMyk7Ci0KLQkJLyogREFDIE9OICovCi0JCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09OCi0JCQkJfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRik7Ci0KLQkJLyogSU5JQiA9IEgsIElOSSA9IEwgICovCi0JCS8qIFBJQ1RMWzBdID0gSCAsIFBJQ1RMWzFdID0gUElDVExbMl0gPSBQSUNUTFs0XSA9IEwgKi8KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklUX1NUQVRFIHwgUElDVFJMX0NPTV9TSUdOQUxfT0ZGKTsKLQotCQkvKiBTZXQgQ29tbW9uIFZvbHRhZ2UgKi8KLQkJY29tYWRqID0gc2hhcnBzbF9wYXJhbS5jb21hZGo7Ci0JCWlmIChjb21hZGogPCAwKQotCQkJY29tYWRqID0gREVGQVVMVF9DT01BREo7Ci0JCWxjZHRnX3NldF9jb21tb25fdm9sdGFnZSgoUE9XRVIwX0RBQ19PTiB8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKSwgY29tYWRqKTsKLQotCQkvKiBWQ0M1IE9OLCBEQUMgT04gKi8KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcwX0FEUlMsIFBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04gfAotCQkJCVBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT04pOwotCi0JCS8qIEdWU1MoLThWKSBPTiwgVkREIE9OICovCi0JCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT04gfCBQT1dFUjFfVkREX09OKTsKLQkJbWRlbGF5KDIpOwotCi0JCS8qIENPTSBTSUdOQUwgT04gKFBJQ1RMWzNdID0gTCkgKi8KLQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklUX1NUQVRFKTsKLQotCQkvKiBDT00gT04sIERBQyBPTiwgVkNDNV9PTiAqLwotCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzBfQURSUywgUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTgotCQkJCXwgUE9XRVIwX0NPTV9PTiB8IFBPV0VSMF9WQ0M1X09OKTsKLQotCQkvKiBWVyBPTiwgR1ZTUyBPTiwgVkREIE9OICovCi0JCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT04gfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOwotCi0JCS8qIFNpZ25hbHMgb3V0cHV0IGVuYWJsZSAqLwotCQljb3JnaV9zc3BfbGNkdGdfc2VuZChQSUNUUkxfQURSUywgMCk7Ci0KLQkJLyogU2V0IFBoYXNlIEFkanVzdCAqLwotCQlsY2R0Z19zZXRfcGhhZGFkaihtb2RlKTsKLQotCQkvKiBJbml0aWFsaXplIGZvciBJbnB1dCBTaWduYWxzIGZyb20gQVRJICovCi0JCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPTENUUkxfQURSUywgUE9MQ1RSTF9TWU5DX1BPTF9SSVNFIHwgUE9MQ1RSTF9FTl9QT0xfUklTRQotCQkJCXwgUE9MQ1RSTF9EQVRBX1BPTF9SSVNFIHwgUE9MQ1RSTF9TWU5DX0FDVF9MIHwgUE9MQ1RSTF9FTl9BQ1RfSCk7Ci0JCXVkZWxheSgxMDAwKTsKLQotCQlsY2RfaW5pdGVkPTE7Ci0JfSBlbHNlIHsKLQkJbGNkdGdfc2V0X3BoYWRhZGoobW9kZSk7Ci0JfQotCi0Jc3dpdGNoKG1vZGUpIHsKLQkJY2FzZSA0ODA6Ci0JCWNhc2UgNjQwOgotCQkJLyogU2V0IExjZCBSZXNvbHV0aW9uIChWR0EpICovCi0JCQljb3JnaV9zc3BfbGNkdGdfc2VuZChSRVNDVExfQURSUywgUkVTQ1RMX1ZHQSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyNDA6Ci0JCWNhc2UgMzIwOgotCQlkZWZhdWx0OgotCQkJLyogU2V0IExjZCBSZXNvbHV0aW9uIChRVkdBKSAqLwotCQkJY29yZ2lfc3NwX2xjZHRnX3NlbmQoUkVTQ1RMX0FEUlMsIFJFU0NUTF9RVkdBKTsKLQkJCWJyZWFrOwotCX0KLX0KLQotdm9pZCBjb3JnaV9sY2R0Z19zdXNwZW5kKHZvaWQpCi17Ci0JLyogNjBIeiB4IDIgZnJhbWUgPSAxNi43bXNlYyB4IDIgPSAzMy40IG1zZWMgKi8KLQltZGVsYXkoMzQpOwotCi0JLyogKDEpVlcgT0ZGICovCi0JY29yZ2lfc3NwX2xjZHRnX3NlbmQoUE9XRVJSRUcxX0FEUlMsIFBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOwotCi0JLyogKDIpQ09NIE9GRiAqLwotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBJQ1RSTF9BRFJTLCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOwotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7Ci0KLQkvKiAoMylTZXQgQ29tbW9uIFZvbHRhZ2UgQmlhcyAwViAqLwotCWxjZHRnX3NldF9jb21tb25fdm9sdGFnZShQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTiwgMCk7Ci0KLQkvKiAoNClHVlNTIE9GRiAqLwotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMV9BRFJTLCBQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PTik7Ci0KLQkvKiAoNSlWQ0M1IE9GRiAqLwotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09OIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOwotCi0JLyogKDYpU2V0IFBEV04sIElOSU9GRiwgREFDT0ZGICovCi0JY29yZ2lfc3NwX2xjZHRnX3NlbmQoUElDVFJMX0FEUlMsIFBJQ1RSTF9JTklPRkYgfCBQSUNUUkxfREFDX1NJR05BTF9PRkYgfAotCQkJUElDVFJMX1BPV0VSX0RPV04gfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOwotCi0JLyogKDcpREFDIE9GRiAqLwotCWNvcmdpX3NzcF9sY2R0Z19zZW5kKFBPV0VSUkVHMF9BRFJTLCBQT1dFUjBfREFDX09GRiB8IFBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKLQotCS8qICg4KVZERCBPRkYgKi8KLQljb3JnaV9zc3BfbGNkdGdfc2VuZChQT1dFUlJFRzFfQURSUywgUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKLQotCWxjZF9pbml0ZWQgPSAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9wbS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2lfcG0uYwppbmRleCAzNWJiZmNjLi5lYjdkNmM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3BtLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CiAKICNpbmNsdWRlIDxtYWNoL3NoYXJwc2wuaD4KICNpbmNsdWRlIDxtYWNoL2NvcmdpLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9zc3AuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3NzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJmMjIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpX3NzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiAgU1NQIGNvbnRyb2wgY29kZSBmb3IgU2hhcnAgQ29yZ2kgZGV2aWNlcwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBSaWNoYXJkIFB1cmRpZQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPG1hY2gvc3NwLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3NwLmg+Ci0jaW5jbHVkZSAic2hhcnBzbC5oIgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvcmdpX3NzcF9sb2NrKTsKLXN0YXRpYyBzdHJ1Y3Qgc3NwX2RldiBjb3JnaV9zc3BfZGV2Owotc3RhdGljIHN0cnVjdCBzc3Bfc3RhdGUgY29yZ2lfc3NwX3N0YXRlOwotc3RhdGljIHN0cnVjdCBjb3JnaXNzcF9tYWNoaW5mbyAqc3NwX21hY2hpbmZvOwotCi0vKgotICogVGhlcmUgYXJlIHRocmVlIGRldmljZXMgY29ubmVjdGVkIHRvIHRoZSBTU1AgaW50ZXJmYWNlOgotICogICAxLiBBIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIgKFRJIEFEUzc4NDYgY29tcGF0aWJsZSkKLSAqICAgMi4gQW4gTENEIGNvbnRyb2xsZXIgKHdpdGggc29tZSBCYWNrbGlnaHQgZnVuY3Rpb25hbGl0eSkKLSAqICAgMy4gQSBiYXR0ZXJ5IG1vbml0b3JpbmcgSUMgKE1heGltIE1BWDExMTEpCi0gKgotICogRWFjaCBkZXZpY2UgdXNlcyBhIGRpZmZlcmVudCBzcGVlZC9tb2RlIG9mIGNvbW11bmljYXRpb24uCi0gKgotICogVGhlIHRvdWNoc2NyZWVuIGlzIHZlcnkgc2Vuc2l0aXZlIGFuZCB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQKLSAqIHNvIHRoZSBwb3J0IGlzIGxlZnQgY29uZmlndXJlZCBmb3IgdGhpcy4KLSAqCi0gKiBEZXZpY2VzIGFyZSBzZWxlY3RlZCB1c2luZyBDaGlwIFNlbGVjdHMgb24gR1BJT3MuCi0gKi8KLQotLyoKLSAqICBBRFM3ODQ2IFJvdXRpbmVzCi0gKi8KLXVuc2lnbmVkIGxvbmcgY29yZ2lfc3NwX2Fkczc4NDZfcHV0Z2V0KHVsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwotCXUzMiByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvcmdpX3NzcF9sb2NrLCBmbGFnKTsKLQlpZiAoc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2ID49IDApCi0JCUdQQ1Ioc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2KSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0Nik7Ci0KLQlzc3Bfd3JpdGVfd29yZCgmY29yZ2lfc3NwX2RldixkYXRhKTsKLSAJc3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2RldiwgJnJldCk7Ci0KLQlpZiAoc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2ID49IDApCi0JCUdQU1Ioc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2KSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0Nik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29yZ2lfc3NwX2xvY2ssIGZsYWcpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIE5PVEU6IFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dAotICogYW5kIHVzZSB0aGUgX2xvY2sgYW5kIF91bmxvY2sgZnVuY3Rpb25zLiBUaGV5IGFyZSB2ZXJ5IHRpbWUgc2Vuc2l0aXZlLgotICovCi12b2lkIGNvcmdpX3NzcF9hZHM3ODQ2X2xvY2sodm9pZCkKLXsKLQlzcGluX2xvY2soJmNvcmdpX3NzcF9sb2NrKTsKLQlpZiAoc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2ID49IDApCi0JCUdQQ1Ioc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2KSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0Nik7Ci19Ci0KLXZvaWQgY29yZ2lfc3NwX2Fkczc4NDZfdW5sb2NrKHZvaWQpCi17Ci0JaWYgKHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0NiA+PSAwKQotCQlHUFNSKHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0NikgPSBHUElPX2JpdChzc3BfbWFjaGluZm8tPmNzX2Fkczc4NDYpOwotCXNwaW5fdW5sb2NrKCZjb3JnaV9zc3BfbG9jayk7Ci19Ci0KLXZvaWQgY29yZ2lfc3NwX2Fkczc4NDZfcHV0KHVsb25nIGRhdGEpCi17Ci0Jc3NwX3dyaXRlX3dvcmQoJmNvcmdpX3NzcF9kZXYsZGF0YSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgY29yZ2lfc3NwX2Fkczc4NDZfZ2V0KHZvaWQpCi17Ci0JdTMyIHJldCA9IDA7Ci0Jc3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2RldiwgJnJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotRVhQT1JUX1NZTUJPTChjb3JnaV9zc3BfYWRzNzg0Nl9wdXRnZXQpOwotRVhQT1JUX1NZTUJPTChjb3JnaV9zc3BfYWRzNzg0Nl9sb2NrKTsKLUVYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfdW5sb2NrKTsKLUVYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfcHV0KTsKLUVYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2Fkczc4NDZfZ2V0KTsKLQotCi0vKgotICogIExDRC9CYWNrbGlnaHQgUm91dGluZXMKLSAqLwotdW5zaWduZWQgbG9uZyBjb3JnaV9zc3BfZGFjX3B1dCh1bG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZywgc3NjcjEgPSBTU0NSMV9TUEg7Ci0JdTMyIHRtcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JnaV9zc3BfbG9jaywgZmxhZyk7Ci0KLQlpZiAobWFjaGluZV9pc19zcGl0eigpIHx8IG1hY2hpbmVfaXNfYWtpdGEoKSB8fCBtYWNoaW5lX2lzX2JvcnpvaSgpKQotCQlzc2NyMSA9IDA7Ci0KLQlzc3BfZGlzYWJsZSgmY29yZ2lfc3NwX2Rldik7Ci0Jc3NwX2NvbmZpZygmY29yZ2lfc3NwX2RldiwgKFNTQ1IwX01vdG9yb2xhIHwgKFNTQ1IwX0RTUyAmIDB4MDcgKSksIHNzY3IxLCAwLCBTU0NSMF9TZXJDbGtEaXYoc3NwX21hY2hpbmZvLT5jbGtfbGNkY29uKSk7Ci0Jc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7Ci0KLQlpZiAoc3NwX21hY2hpbmZvLT5jc19sY2Rjb24gPj0gMCkKLQkJR1BDUihzc3BfbWFjaGluZm8tPmNzX2xjZGNvbikgPSBHUElPX2JpdChzc3BfbWFjaGluZm8tPmNzX2xjZGNvbik7Ci0Jc3NwX3dyaXRlX3dvcmQoJmNvcmdpX3NzcF9kZXYsZGF0YSk7Ci0JLyogUmVhZCBudWxsIGRhdGEgYmFjayBmcm9tIGRldmljZSB0byBwcmV2ZW50IFNTUCBvdmVyZmxvdyAqLwotCXNzcF9yZWFkX3dvcmQoJmNvcmdpX3NzcF9kZXYsICZ0bXApOwotCWlmIChzc3BfbWFjaGluZm8tPmNzX2xjZGNvbiA+PSAwKQotCQlHUFNSKHNzcF9tYWNoaW5mby0+Y3NfbGNkY29uKSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfbGNkY29uKTsKLQotCXNzcF9kaXNhYmxlKCZjb3JnaV9zc3BfZGV2KTsKLQlzc3BfY29uZmlnKCZjb3JnaV9zc3BfZGV2LCAoU1NDUjBfTmF0aW9uYWwgfCAoU1NDUjBfRFNTICYgMHgwYiApKSwgMCwgMCwgU1NDUjBfU2VyQ2xrRGl2KHNzcF9tYWNoaW5mby0+Y2xrX2Fkczc4NDYpKTsKLQlzc3BfZW5hYmxlKCZjb3JnaV9zc3BfZGV2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvcmdpX3NzcF9sb2NrLCBmbGFnKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGNvcmdpX3NzcF9sY2R0Z19zZW5kKHU4IGFkcnMsIHU4IGRhdGEpCi17Ci0JY29yZ2lfc3NwX2RhY19wdXQoKChhZHJzICYgMHgwNykgPDwgNSkgfCAoZGF0YSAmIDB4MWYpKTsKLX0KLQotdm9pZCBjb3JnaV9zc3BfYmxkdXR5X3NldChpbnQgZHV0eSkKLXsKLQljb3JnaV9zc3BfbGNkdGdfc2VuZCgweDAyLGR1dHkpOwotfQotCi1FWFBPUlRfU1lNQk9MKGNvcmdpX3NzcF9sY2R0Z19zZW5kKTsKLUVYUE9SVF9TWU1CT0woY29yZ2lfc3NwX2JsZHV0eV9zZXQpOwotCi0vKgotICogIE1heDExMTEgUm91dGluZXMKLSAqLwotaW50IGNvcmdpX3NzcF9tYXgxMTExX2dldCh1bG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZzsKLQlsb25nIHZvbHRhZ2UgPSAwLCB2b2x0YWdlMSA9IDAsIHZvbHRhZ2UyID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjb3JnaV9zc3BfbG9jaywgZmxhZyk7Ci0JaWYgKHNzcF9tYWNoaW5mby0+Y3NfbWF4MTExMSA+PSAwKQotCQlHUENSKHNzcF9tYWNoaW5mby0+Y3NfbWF4MTExMSkgPSBHUElPX2JpdChzc3BfbWFjaGluZm8tPmNzX21heDExMTEpOwotCXNzcF9kaXNhYmxlKCZjb3JnaV9zc3BfZGV2KTsKLQlzc3BfY29uZmlnKCZjb3JnaV9zc3BfZGV2LCAoU1NDUjBfTW90b3JvbGEgfCAoU1NDUjBfRFNTICYgMHgwNyApKSwgMCwgMCwgU1NDUjBfU2VyQ2xrRGl2KHNzcF9tYWNoaW5mby0+Y2xrX21heDExMTEpKTsKLQlzc3BfZW5hYmxlKCZjb3JnaV9zc3BfZGV2KTsKLQotCXVkZWxheSgxKTsKLQotCS8qIFRCMS9SQjEgKi8KLQlzc3Bfd3JpdGVfd29yZCgmY29yZ2lfc3NwX2RldixkYXRhKTsKLQlzc3BfcmVhZF93b3JkKCZjb3JnaV9zc3BfZGV2LCAodTMyKikmdm9sdGFnZTEpOyAvKiBudWxsIHJlYWQgKi8KLQotCS8qIFRCMTIvUkIyICovCi0Jc3NwX3dyaXRlX3dvcmQoJmNvcmdpX3NzcF9kZXYsMCk7Ci0Jc3NwX3JlYWRfd29yZCgmY29yZ2lfc3NwX2RldiwgKHUzMiopJnZvbHRhZ2UxKTsKLQotCS8qIFRCMTMvUkIzKi8KLQlzc3Bfd3JpdGVfd29yZCgmY29yZ2lfc3NwX2RldiwwKTsKLQlzc3BfcmVhZF93b3JkKCZjb3JnaV9zc3BfZGV2LCAodTMyKikmdm9sdGFnZTIpOwotCi0Jc3NwX2Rpc2FibGUoJmNvcmdpX3NzcF9kZXYpOwotCXNzcF9jb25maWcoJmNvcmdpX3NzcF9kZXYsIChTU0NSMF9OYXRpb25hbCB8IChTU0NSMF9EU1MgJiAweDBiICkpLCAwLCAwLCBTU0NSMF9TZXJDbGtEaXYoc3NwX21hY2hpbmZvLT5jbGtfYWRzNzg0NikpOwotCXNzcF9lbmFibGUoJmNvcmdpX3NzcF9kZXYpOwotCWlmIChzc3BfbWFjaGluZm8tPmNzX21heDExMTEgPj0gMCkKLQkJR1BTUihzc3BfbWFjaGluZm8tPmNzX21heDExMTEpID0gR1BJT19iaXQoc3NwX21hY2hpbmZvLT5jc19tYXgxMTExKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3JnaV9zc3BfbG9jaywgZmxhZyk7Ci0KLQlpZiAodm9sdGFnZTEgJiAweGMwIHx8IHZvbHRhZ2UyICYgMHgzZikKLQkJdm9sdGFnZSA9IC0xOwotCWVsc2UKLQkJdm9sdGFnZSA9ICgodm9sdGFnZTEgPDwgMikgJiAweGZjKSB8ICgodm9sdGFnZTIgPj4gNikgJiAweDAzKTsKLQotCXJldHVybiB2b2x0YWdlOwotfQotCi1FWFBPUlRfU1lNQk9MKGNvcmdpX3NzcF9tYXgxMTExX2dldCk7Ci0KLS8qCi0gKiAgU3VwcG9ydCBSb3V0aW5lcwotICovCi0KLXZvaWQgX19pbml0IGNvcmdpX3NzcF9zZXRfbWFjaGluZm8oc3RydWN0IGNvcmdpc3NwX21hY2hpbmZvICptYWNoaW5mbykKLXsKLQlzc3BfbWFjaGluZm8gPSBtYWNoaW5mbzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY29yZ2lfc3NwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0OwotCi0JLyogQ2hpcCBTZWxlY3QgLSBEaXNhYmxlIEFsbCAqLwotCWlmIChzc3BfbWFjaGluZm8tPmNzX2xjZGNvbiA+PSAwKQotCQlweGFfZ3Bpb19tb2RlKHNzcF9tYWNoaW5mby0+Y3NfbGNkY29uICB8IEdQSU9fT1VUIHwgR1BJT19ERkxUX0hJR0gpOwotCWlmIChzc3BfbWFjaGluZm8tPmNzX21heDExMTEgPj0gMCkKLQkgICAgICAgIHB4YV9ncGlvX21vZGUoc3NwX21hY2hpbmZvLT5jc19tYXgxMTExIHwgR1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCk7Ci0JaWYgKHNzcF9tYWNoaW5mby0+Y3NfYWRzNzg0NiA+PSAwKQotICAgICAgICAJcHhhX2dwaW9fbW9kZShzc3BfbWFjaGluZm8tPmNzX2Fkczc4NDYgfCBHUElPX09VVCB8IEdQSU9fREZMVF9ISUdIKTsKLQotCXJldCA9IHNzcF9pbml0KCZjb3JnaV9zc3BfZGV2LCBzc3BfbWFjaGluZm8tPnBvcnQsIDApOwotCi0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgU1NQIGhhbmRsZXIhXG4iKTsKLQllbHNlIHsKLQkJc3NwX2Rpc2FibGUoJmNvcmdpX3NzcF9kZXYpOwotCQlzc3BfY29uZmlnKCZjb3JnaV9zc3BfZGV2LCAoU1NDUjBfTmF0aW9uYWwgfCAoU1NDUjBfRFNTICYgMHgwYiApKSwgMCwgMCwgU1NDUjBfU2VyQ2xrRGl2KHNzcF9tYWNoaW5mby0+Y2xrX2Fkczc4NDYpKTsKLQkJc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjb3JnaV9zc3BfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzc3BfZXhpdCgmY29yZ2lfc3NwX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2lfc3NwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3NwX2ZsdXNoKCZjb3JnaV9zc3BfZGV2KTsKLQlzc3Bfc2F2ZV9zdGF0ZSgmY29yZ2lfc3NwX2RldiwmY29yZ2lfc3NwX3N0YXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvcmdpX3NzcF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWlmIChzc3BfbWFjaGluZm8tPmNzX2xjZGNvbiA+PSAwKQotCQlHUFNSKHNzcF9tYWNoaW5mby0+Y3NfbGNkY29uKSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfbGNkY29uKTsgIC8qIEhpZ2ggLSBEaXNhYmxlIExDRCBDb250cm9sL1RpbWluZyBHZW4gKi8KLQlpZiAoc3NwX21hY2hpbmZvLT5jc19tYXgxMTExID49IDApCi0JCUdQU1Ioc3NwX21hY2hpbmZvLT5jc19tYXgxMTExKSA9IEdQSU9fYml0KHNzcF9tYWNoaW5mby0+Y3NfbWF4MTExMSk7IC8qIEhpZ2ggLSBEaXNhYmxlIE1BWDExMTEqLwotCWlmIChzc3BfbWFjaGluZm8tPmNzX2Fkczc4NDYgPj0gMCkKLQkJR1BTUihzc3BfbWFjaGluZm8tPmNzX2Fkczc4NDYpID0gR1BJT19iaXQoc3NwX21hY2hpbmZvLT5jc19hZHM3ODQ2KTsgLyogSGlnaCAtIERpc2FibGUgQURTNzg0NiovCi0Jc3NwX3Jlc3RvcmVfc3RhdGUoJmNvcmdpX3NzcF9kZXYsJmNvcmdpX3NzcF9zdGF0ZSk7Ci0Jc3NwX2VuYWJsZSgmY29yZ2lfc3NwX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY29yZ2lzc3BfZHJpdmVyID0gewotCS5wcm9iZQkJPSBjb3JnaV9zc3BfcHJvYmUsCi0JLnJlbW92ZQkJPSBjb3JnaV9zc3BfcmVtb3ZlLAotCS5zdXNwZW5kCT0gY29yZ2lfc3NwX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBjb3JnaV9zc3BfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJjb3JnaS1zc3AiLAotCX0sCi19OwotCi1pbnQgX19pbml0IGNvcmdpX3NzcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY29yZ2lzc3BfZHJpdmVyKTsKLX0KLQotYXJjaF9pbml0Y2FsbChjb3JnaV9zc3BfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jcHUtcHhhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jcHUtcHhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTU2OWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY3B1LXB4YS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY3B1LXB4YS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiwyMDAzIEludHJpbnN5YyBTb2Z0d2FyZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKiBIaXN0b3J5OgotICogICAzMS1KdWwtMjAwMiA6IEluaXRpYWwgdmVyc2lvbiBbRkJdCi0gKiAgIDI5LUphbi0yMDAzIDogYWRkZWQgUFhBMjU1IHN1cHBvcnQgW0ZCXQotICogICAyMC1BcHItMjAwMyA6IHBvcnRlZCB0byB2Mi41IChEdXN0aW4gTWNJbnRpcmUsIFNlbnNvcmlhIENvcnAuKQotICoKLSAqIE5vdGU6Ci0gKiAgIFRoaXMgZHJpdmVyIG1heSBjaGFuZ2UgdGhlIG1lbW9yeSBidXMgY2xvY2sgcmF0ZSwgYnV0IHdpbGwgbm90IGRvIGFueQotICogICBwbGF0Zm9ybSBzcGVjaWZpYyBhY2Nlc3MgdGltaW5nIGNoYW5nZXMuLi4gZm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgZmxhc2gKLSAqICAgbWVtb3J5IGNvbm5lY3RlZCB0byBDUzAsIHlvdSB3aWxsIG5lZWQgdG8gcmVnaXN0ZXIgYSBwbGF0Zm9ybSBzcGVjaWZpYwotICogICBub3RpZmllciB3aGljaCB3aWxsIGFkanVzdCB0aGUgbWVtb3J5IGFjY2VzcyBzdHJvYmVzIHRvIG1haW50YWluIGEKLSAqICAgbWluaW11bSBzdHJvYmUgd2lkdGguCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdW5zaWduZWQgaW50IGZyZXFfZGVidWc7Ci1tb2R1bGVfcGFyYW0oZnJlcV9kZWJ1ZywgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZyZXFfZGVidWcsICJTZXQgdGhlIGRlYnVnIG1lc3NhZ2VzIHRvIG9uPTEvb2ZmPTAiKTsKLSNlbHNlCi0jZGVmaW5lIGZyZXFfZGVidWcgIDAKLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50IHB4YTI3eF9tYXhmcmVxOwotbW9kdWxlX3BhcmFtKHB4YTI3eF9tYXhmcmVxLCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocHhhMjd4X21heGZyZXEsICJTZXQgdGhlIHB4YTI3eCBtYXhmcmVxIGluIE1IeiIKLQkJICIodHlwaWNhbGx5IDYyND0+cHhhMjcwLCA0MTY9PnB4YTI3MSwgNTIwPT5weGEyNzIpIik7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQga2h6OwotCXVuc2lnbmVkIGludCBtZW1idXM7Ci0JdW5zaWduZWQgaW50IGNjY3I7Ci0JdW5zaWduZWQgaW50IGRpdjI7Ci0JdW5zaWduZWQgaW50IGNjbGtjZmc7Ci19IHB4YV9mcmVxc190OwotCi0vKiBEZWZpbmUgdGhlIHJlZnJlc2ggcGVyaW9kIGluIG1TZWMgZm9yIHRoZSBTRFJBTSBhbmQgdGhlIG51bWJlciBvZiByb3dzICovCi0jZGVmaW5lIFNEUkFNX1RSRUYJNjQJLyogc3RhbmRhcmQgNjRtcyBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9ST1dTCTQwOTYJLyogNjRNQj04MTkyIDMyTUI9NDA5NiAqLwotCi0jZGVmaW5lIENDTEtDRkdfVFVSQk8JCTB4MQotI2RlZmluZSBDQ0xLQ0ZHX0ZDUwkJMHgyCi0jZGVmaW5lIENDTEtDRkdfSEFMRlRVUkJPCTB4NAotI2RlZmluZSBDQ0xLQ0ZHX0ZBU1RCVVMJCTB4OAotI2RlZmluZSBNRFJFRlJfREIyX01BU0sJCShNRFJFRlJfSzJEQjIgfCBNRFJFRlJfSzFEQjIpCi0jZGVmaW5lIE1EUkVGUl9EUklfTUFTSwkJMHhGRkYKLQotLyoKLSAqIFBYQTI1NSBkZWZpbml0aW9ucwotICovCi0vKiBVc2UgdGhlIHJ1biBtb2RlIGZyZXF1ZW5jaWVzIGZvciB0aGUgQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0UgcG9saWN5ICovCi0jZGVmaW5lIENDTEtDRkcJCQlDQ0xLQ0ZHX1RVUkJPIHwgQ0NMS0NGR19GQ1MKLQotc3RhdGljIHB4YV9mcmVxc190IHB4YTI1NV9ydW5fZnJlcXNbXSA9Ci17Ci0JLyogQ1BVICAgTUVNQlVTICBDQ0NSICBESVYyIENDTEtDRkcJICAgcnVuICB0dXJibyBQWGJ1cyBTRFJBTSAqLwotCXsgOTk1MDAsICA5OTUwMCwgMHgxMjEsIDEsICBDQ0xLQ0ZHfSwJLyogIDk5LCAgIDk5LCAgIDUwLCAgIDUwICAqLwotCXsxMzI3MDAsIDEzMjcwMCwgMHgxMjMsIDEsICBDQ0xLQ0ZHfSwJLyogMTMzLCAgMTMzLCAgIDY2LCAgIDY2ICAqLwotCXsxOTkxMDAsICA5OTUwMCwgMHgxNDEsIDAsICBDQ0xLQ0ZHfSwJLyogMTk5LCAgMTk5LCAgIDk5LCAgIDk5ICAqLwotCXsyNjU0MDAsIDEzMjcwMCwgMHgxNDMsIDEsICBDQ0xLQ0ZHfSwJLyogMjY1LCAgMjY1LCAgMTMzLCAgIDY2ICAqLwotCXszMzE4MDAsIDE2NTkwMCwgMHgxNDUsIDEsICBDQ0xLQ0ZHfSwJLyogMzMxLCAgMzMxLCAgMTY2LCAgIDgzICAqLwotCXszOTgxMDAsICA5OTUwMCwgMHgxNjEsIDAsICBDQ0xLQ0ZHfSwJLyogMzk4LCAgMzk4LCAgMTk2LCAgIDk5ICAqLwotfTsKLQotLyogVXNlIHRoZSB0dXJibyBtb2RlIGZyZXF1ZW5jaWVzIGZvciB0aGUgQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFIHBvbGljeSAqLwotc3RhdGljIHB4YV9mcmVxc190IHB4YTI1NV90dXJib19mcmVxc1tdID0KLXsKLQkvKiBDUFUgICBNRU1CVVMgIENDQ1IgIERJVjIgQ0NMS0NGRwkgICBydW4gIHR1cmJvIFBYYnVzIFNEUkFNICovCi0JeyA5OTUwMCwgOTk1MDAsICAweDEyMSwgMSwgIENDTEtDRkd9LAkvKiAgOTksICAgOTksICAgNTAsICAgNTAgICovCi0JezE5OTEwMCwgOTk1MDAsICAweDIyMSwgMCwgIENDTEtDRkd9LAkvKiAgOTksICAxOTksICAgNTAsICAgOTkgICovCi0JezI5ODUwMCwgOTk1MDAsICAweDMyMSwgMCwgIENDTEtDRkd9LAkvKiAgOTksICAyODcsICAgNTAsICAgOTkgICovCi0JezI5ODYwMCwgOTk1MDAsICAweDFjMSwgMCwgIENDTEtDRkd9LAkvKiAxOTksICAyODcsICAgOTksICAgOTkgICovCi0JezM5ODEwMCwgOTk1MDAsICAweDI0MSwgMCwgIENDTEtDRkd9LAkvKiAxOTksICAzOTgsICAgOTksICAgOTkgICovCi19OwotCi0jZGVmaW5lIE5VTV9QWEEyNXhfUlVOX0ZSRVFTIEFSUkFZX1NJWkUocHhhMjU1X3J1bl9mcmVxcykKLSNkZWZpbmUgTlVNX1BYQTI1eF9UVVJCT19GUkVRUyBBUlJBWV9TSVpFKHB4YTI1NV90dXJib19mcmVxcykKLQotc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQotCXB4YTI1NV9ydW5fZnJlcV90YWJsZVtOVU1fUFhBMjV4X1JVTl9GUkVRUysxXTsKLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUKLQlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtOVU1fUFhBMjV4X1RVUkJPX0ZSRVFTKzFdOwotCi0vKgotICogUFhBMjcwIGRlZmluaXRpb25zCi0gKgotICogRm9yIHRoZSBQWEEyN3g6Ci0gKiBDb250cm9sIHZhcmlhYmxlcyBhcmUgQSwgTCwgMk4gZm9yIENDQ1I7IEIsIEhULCBUIGZvciBDTEtDRkcuCi0gKgotICogQSA9IDAgPT4gbWVtb3J5IGNvbnRyb2xsZXIgY2xvY2sgZnJvbSB0YWJsZSAzLTcsCi0gKiBBID0gMSA9PiBtZW1vcnkgY29udHJvbGxlciBjbG9jayA9IHN5c3RlbSBidXMgY2xvY2sKLSAqIFJ1biBtb2RlIGZyZXF1ZW5jeQk9IDEzIE1IeiAqIEwKLSAqIFR1cmJvIG1vZGUgZnJlcXVlbmN5ID0gMTMgTUh6ICogTCAqIE4KLSAqIFN5c3RlbSBidXMgZnJlcXVlbmN5ID0gMTMgTUh6ICogTCAvIChCICsgMSkKLSAqCi0gKiBJbiBDQ0NSOgotICogQSA9IDEKLSAqIEwgPSAxNgkgIG9zY2lsbGF0b3IgdG8gcnVuIG1vZGUgcmF0aW8KLSAqIDJOID0gNgkgIDIgKiAodHVyYm8gbW9kZSB0byBydW4gbW9kZSByYXRpbykKLSAqCi0gKiBJbiBDQ0xLQ0ZHOgotICogQiA9IDEJICBGYXN0IGJ1cyBtb2RlCi0gKiBIVCA9IDAJICBIYWxmLVR1cmJvIG1vZGUKLSAqIFQgPSAxCSAgVHVyYm8gbW9kZQotICoKLSAqIEZvciBub3csIGp1c3Qgc3VwcG9ydCBzb21lIG9mIHRoZSBjb21iaW5hdGlvbnMgaW4gdGFibGUgMy03IG9mCi0gKiBQWEEyN3ggUHJvY2Vzc29yIEZhbWlseSBEZXZlbG9wZXIncyBNYW51YWwgdG8gc2ltcGxpZnkgZnJlcXVlbmN5Ci0gKiBjaGFuZ2Ugc2VxdWVuY2VzLgotICovCi0jZGVmaW5lIFBYQTI3eF9DQ0NSKEEsIEwsIE4yKSAoQSA8PCAyNSB8IE4yIDw8IDcgfCBMKQotI2RlZmluZSBDQ0xLQ0ZHMihCLCBIVCwgVCkgXAotICAoQ0NMS0NGR19GQ1MgfCBcCi0gICAoKEIpICA/IENDTEtDRkdfRkFTVEJVUyA6IDApIHwgXAotICAgKChIVCkgPyBDQ0xLQ0ZHX0hBTEZUVVJCTyA6IDApIHwgXAotICAgKChUKSAgPyBDQ0xLQ0ZHX1RVUkJPIDogMCkpCi0KLXN0YXRpYyBweGFfZnJlcXNfdCBweGEyN3hfZnJlcXNbXSA9IHsKLQl7MTA0MDAwLCAxMDQwMDAsIFBYQTI3eF9DQ0NSKDEsCSA4LCAyKSwgMCwgQ0NMS0NGRzIoMSwgMCwgMSl9LAotCXsxNTYwMDAsIDEwNDAwMCwgUFhBMjd4X0NDQ1IoMSwJIDgsIDYpLCAwLCBDQ0xLQ0ZHMigxLCAxLCAxKX0sCi0JezIwODAwMCwgMjA4MDAwLCBQWEEyN3hfQ0NDUigwLCAxNiwgMiksIDEsIENDTEtDRkcyKDAsIDAsIDEpfSwKLQl7MzEyMDAwLCAyMDgwMDAsIFBYQTI3eF9DQ0NSKDEsIDE2LCAzKSwgMSwgQ0NMS0NGRzIoMSwgMCwgMSl9LAotCXs0MTYwMDAsIDIwODAwMCwgUFhBMjd4X0NDQ1IoMSwgMTYsIDQpLCAxLCBDQ0xLQ0ZHMigxLCAwLCAxKX0sCi0JezUyMDAwMCwgMjA4MDAwLCBQWEEyN3hfQ0NDUigxLCAxNiwgNSksIDEsIENDTEtDRkcyKDEsIDAsIDEpfSwKLQl7NjI0MDAwLCAyMDgwMDAsIFBYQTI3eF9DQ0NSKDEsIDE2LCA2KSwgMSwgQ0NMS0NGRzIoMSwgMCwgMSl9Ci19OwotCi0jZGVmaW5lIE5VTV9QWEEyN3hfRlJFUVMgQVJSQVlfU0laRShweGEyN3hfZnJlcXMpCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlCi0JcHhhMjd4X2ZyZXFfdGFibGVbTlVNX1BYQTI3eF9GUkVRUysxXTsKLQotZXh0ZXJuIHVuc2lnbmVkIGdldF9jbGtfZnJlcXVlbmN5X2toeihpbnQgaW5mbyk7Ci0KLXN0YXRpYyB2b2lkIGZpbmRfZnJlcV90YWJsZXMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCQkgICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKmZyZXFfdGFibGUsCi0JCQkgICAgIHB4YV9mcmVxc190ICoqcHhhX2ZyZXFzKQotewotCWlmIChjcHVfaXNfcHhhMjV4KCkpIHsKLQkJaWYgKHBvbGljeS0+cG9saWN5ID09IENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFKSB7Ci0JCQkqcHhhX2ZyZXFzID0gcHhhMjU1X3J1bl9mcmVxczsKLQkJCSpmcmVxX3RhYmxlID0gcHhhMjU1X3J1bl9mcmVxX3RhYmxlOwotCQl9IGVsc2UgaWYgKHBvbGljeS0+cG9saWN5ID09IENQVUZSRVFfUE9MSUNZX1BPV0VSU0FWRSkgewotCQkJKnB4YV9mcmVxcyA9IHB4YTI1NV90dXJib19mcmVxczsKLQkJCSpmcmVxX3RhYmxlID0gcHhhMjU1X3R1cmJvX2ZyZXFfdGFibGU7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoIkNQVSBQWEE6IFVua25vd24gcG9saWN5IGZvdW5kLiAiCi0JCQkgICAgICAgIlVzaW5nIENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFXG4iKTsKLQkJCSpweGFfZnJlcXMgPSBweGEyNTVfcnVuX2ZyZXFzOwotCQkJKmZyZXFfdGFibGUgPSBweGEyNTVfcnVuX2ZyZXFfdGFibGU7Ci0JCX0KLQl9Ci0JaWYgKGNwdV9pc19weGEyN3goKSkgewotCQkqcHhhX2ZyZXFzID0gcHhhMjd4X2ZyZXFzOwotCQkqZnJlcV90YWJsZSA9IHB4YTI3eF9mcmVxX3RhYmxlOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcHhhMjd4X2d1ZXNzX21heF9mcmVxKHZvaWQpCi17Ci0JaWYgKCFweGEyN3hfbWF4ZnJlcSkgewotCQlweGEyN3hfbWF4ZnJlcSA9IDQxNjAwMDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUFhBIENQVSAyN3ggbWF4IGZyZXF1ZW5jeSBub3QgZGVmaW5lZCAiCi0JCSAgICAgICAiKHB4YTI3eF9tYXhmcmVxKSwgYXNzdW1pbmcgcHhhMjcxIHdpdGggJWRrSHogbWF4ZnJlcVxuIiwKLQkJICAgICAgIHB4YTI3eF9tYXhmcmVxKTsKLQl9IGVsc2UgewotCQlweGEyN3hfbWF4ZnJlcSAqPSAxMDAwOwotCX0KLX0KLQotc3RhdGljIHUzMiBtZHJlZnJfZHJpKHVuc2lnbmVkIGludCBmcmVxKQotewotCXUzMiBkcmkgPSAwOwotCi0JaWYgKGNwdV9pc19weGEyNXgoKSkKLQkJZHJpID0gKChmcmVxICogU0RSQU1fVFJFRikgLyAoU0RSQU1fUk9XUyAqIDMyKSk7Ci0JaWYgKGNwdV9pc19weGEyN3goKSkKLQkJZHJpID0gKChmcmVxICogU0RSQU1fVFJFRikgLyAoU0RSQU1fUk9XUyAtIDMxKSkgLyAzMjsKLQlyZXR1cm4gZHJpOwotfQotCi0vKiBmaW5kIGEgdmFsaWQgZnJlcXVlbmN5IHBvaW50ICovCi1zdGF0aWMgaW50IHB4YV92ZXJpZnlfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcHhhX2ZyZXFzX3RhYmxlOwotCXB4YV9mcmVxc190ICpweGFfZnJlcXM7Ci0JaW50IHJldDsKLQotCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFzKTsKLQlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBweGFfZnJlcXNfdGFibGUpOwotCi0JaWYgKGZyZXFfZGVidWcpCi0JCXByX2RlYnVnKCJWZXJpZmllZCBDUFUgcG9saWN5OiAlZEtoeiBtaW4gdG8gJWRLaHogbWF4XG4iLAotCQkJIHBvbGljeS0+bWluLCBwb2xpY3ktPm1heCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHB4YV9jcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQotewotCXJldHVybiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCk7Ci19Ci0KLXN0YXRpYyBpbnQgcHhhX3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKLQkJCSAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQotewotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcHhhX2ZyZXFzX3RhYmxlOwotCXB4YV9mcmVxc190ICpweGFfZnJlcV9zZXR0aW5nczsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IG5ld19mcmVxX2NwdSwgbmV3X2ZyZXFfbWVtOwotCXVuc2lnbmVkIGludCB1bnVzZWQsIHByZXNldF9tZHJlZnIsIHBvc3RzZXRfbWRyZWZyLCBjY2xrY2ZnOwotCi0JLyogR2V0IHRoZSBjdXJyZW50IHBvbGljeSAqLwotCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFfc2V0dGluZ3MpOwotCi0JLyogTG9va3VwIHRoZSBuZXh0IGZyZXF1ZW5jeSAqLwotCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBweGFfZnJlcXNfdGFibGUsCi0JCQkJCSAgIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmlkeCkpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbmV3X2ZyZXFfY3B1ID0gcHhhX2ZyZXFfc2V0dGluZ3NbaWR4XS5raHo7Ci0JbmV3X2ZyZXFfbWVtID0gcHhhX2ZyZXFfc2V0dGluZ3NbaWR4XS5tZW1idXM7Ci0JZnJlcXMub2xkID0gcG9saWN5LT5jdXI7Ci0JZnJlcXMubmV3ID0gbmV3X2ZyZXFfY3B1OwotCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwotCi0JaWYgKGZyZXFfZGVidWcpCi0JCXByX2RlYnVnKEtFUk5fSU5GTyAiQ2hhbmdpbmcgQ1BVIGZyZXF1ZW5jeSB0byAlZCBNaHosICIKLQkJCSAiKFNEUkFNICVkIE1oeilcbiIsCi0JCQkgZnJlcXMubmV3IC8gMTAwMCwgKHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uZGl2MikgPwotCQkJIChuZXdfZnJlcV9tZW0gLyAyMDAwKSA6IChuZXdfZnJlcV9tZW0gLyAxMDAwKSk7Ci0KLQkvKgotCSAqIFRlbGwgZXZlcnlvbmUgd2hhdCB3ZSdyZSBhYm91dCB0byBkby4uLgotCSAqIHlvdSBzaG91bGQgYWRkIGEgbm90aWZ5IGNsaWVudCB3aXRoIGFueSBwbGF0Zm9ybSBzcGVjaWZpYwotCSAqIFZjYyBjaGFuZ2luZyBjYXBhYmlsaXR5Ci0JICovCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKLQotCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBNRFJFRlIuICBJZiB3ZSdyZSBzbG93aW5nIGRvd24gdGhlIFNEUkFNIGNsb2NrCi0JICogd2UgbmVlZCB0byBwcmVzZXQgdGhlIHNtYWxsZXIgRFJJIGJlZm9yZSB0aGUgY2hhbmdlLgkgSWYgd2UncmUKLQkgKiBzcGVlZGluZyB1cCB3ZSBuZWVkIHRvIHNldCB0aGUgbGFyZ2VyIERSSSB2YWx1ZSBhZnRlciB0aGUgY2hhbmdlLgotCSAqLwotCXByZXNldF9tZHJlZnIgPSBwb3N0c2V0X21kcmVmciA9IE1EUkVGUjsKLQlpZiAoKE1EUkVGUiAmIE1EUkVGUl9EUklfTUFTSykgPiBtZHJlZnJfZHJpKG5ld19mcmVxX21lbSkpIHsKLQkJcHJlc2V0X21kcmVmciA9IChwcmVzZXRfbWRyZWZyICYgfk1EUkVGUl9EUklfTUFTSyk7Ci0JCXByZXNldF9tZHJlZnIgfD0gbWRyZWZyX2RyaShuZXdfZnJlcV9tZW0pOwotCX0KLQlwb3N0c2V0X21kcmVmciA9Ci0JCShwb3N0c2V0X21kcmVmciAmIH5NRFJFRlJfRFJJX01BU0spIHwgbWRyZWZyX2RyaShuZXdfZnJlcV9tZW0pOwotCi0JLyogSWYgd2UncmUgZGl2aWRpbmcgdGhlIG1lbW9yeSBjbG9jayBieSB0d28gZm9yIHRoZSBTRFJBTSBjbG9jaywgdGhpcwotCSAqIG11c3QgYmUgc2V0IHByaW9yIHRvIHRoZSBjaGFuZ2UuICBDbGVhcmluZyB0aGUgZGl2aWRlIG11c3QgYmUgZG9uZQotCSAqIGFmdGVyIHRoZSBjaGFuZ2UuCi0JICovCi0JaWYgKHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uZGl2MikgewotCQlwcmVzZXRfbWRyZWZyICB8PSBNRFJFRlJfREIyX01BU0s7Ci0JCXBvc3RzZXRfbWRyZWZyIHw9IE1EUkVGUl9EQjJfTUFTSzsKLQl9IGVsc2UgewotCQlwb3N0c2V0X21kcmVmciAmPSB+TURSRUZSX0RCMl9NQVNLOwotCX0KLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qIFNldCBuZXcgdGhlIENDQ1IgYW5kIHByZXBhcmUgQ0NMS0NGRyAqLwotCUNDQ1IgPSBweGFfZnJlcV9zZXR0aW5nc1tpZHhdLmNjY3I7Ci0JY2Nsa2NmZyA9IHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uY2Nsa2NmZzsKLQotCWFzbSB2b2xhdGlsZSgiCQkJCQkJCVxuXAotCQlsZHIJcjQsIFslMV0JCS8qIGxvYWQgTURSRUZSICovCVxuXAotCQliCTJmCQkJCQkJXG5cCi0JCS5hbGlnbgk1CQkJCQkJXG5cCi0xOgkJCQkJCQkJCVxuXAotCQlzdHIJJTMsIFslMV0JCS8qIHByZXNldCB0aGUgTURSRUZSICovCVxuXAotCQltY3IJcDE0LCAwLCAlMiwgYzYsIGMwLCAwCS8qIHNldCBDQ0xLQ0ZHW0ZDU10gKi8JXG5cCi0JCXN0cgklNCwgWyUxXQkJLyogcG9zdHNldCB0aGUgTURSRUZSICovIFxuXAotCQkJCQkJCQkJXG5cCi0JCWIJM2YJCQkJCQlcblwKLTI6CQliCTFiCQkJCQkJXG5cCi0zOgkJbm9wCQkJCQkJCVxuXAotCSAgIgotCQkgICAgIDogIj0mciIgKHVudXNlZCkKLQkJICAgICA6ICJyIiAoJk1EUkVGUiksICJyIiAoY2Nsa2NmZyksCi0JCSAgICAgICAiciIgKHByZXNldF9tZHJlZnIpLCAiciIgKHBvc3RzZXRfbWRyZWZyKQotCQkgICAgIDogInI0IiwgInI1Iik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JLyoKLQkgKiBUZWxsIGV2ZXJ5b25lIHdoYXQgd2UndmUganVzdCBkb25lLi4uCi0JICogeW91IHNob3VsZCBhZGQgYSBub3RpZnkgY2xpZW50IHdpdGggYW55IHBsYXRmb3JtIHNwZWNpZmljCi0JICogU0RSQU0gcmVmcmVzaCB0aW1lciBhZGp1c3RtZW50cwotCSAqLwotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IHB4YV9jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0KLQkvKiB0cnkgdG8gZ3Vlc3MgcHhhMjd4IGNwdSAqLwotCWlmIChjcHVfaXNfcHhhMjd4KCkpCi0JCXB4YTI3eF9ndWVzc19tYXhfZnJlcSgpOwotCi0JLyogc2V0IGRlZmF1bHQgcG9saWN5IGFuZCBjcHVpbmZvICovCi0JcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKLQlpZiAoY3B1X2lzX3B4YTI1eCgpKQotCQlwb2xpY3ktPnBvbGljeSA9IENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFOwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwOyAvKiBGSVhNRTogMSBtcywgYXNzdW1lZCAqLwotCXBvbGljeS0+Y3VyID0gZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KDApOwkgICAvKiBjdXJyZW50IGZyZXEgKi8KLQlwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gcG9saWN5LT5jdXI7Ci0KLQkvKiBHZW5lcmF0ZSBweGEyNXggdGhlIHJ1biBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzdHJ1Y3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BYQTI1eF9SVU5fRlJFUVM7IGkrKykgewotCQlweGEyNTVfcnVuX2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gcHhhMjU1X3J1bl9mcmVxc1tpXS5raHo7Ci0JCXB4YTI1NV9ydW5fZnJlcV90YWJsZVtpXS5pbmRleCA9IGk7Ci0JfQotCXB4YTI1NV9ydW5fZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKLQotCS8qIEdlbmVyYXRlIHB4YTI1eCB0aGUgdHVyYm8gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc3RydWN0ICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9QWEEyNXhfVFVSQk9fRlJFUVM7IGkrKykgewotCQlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPQotCQkJcHhhMjU1X3R1cmJvX2ZyZXFzW2ldLmtoejsKLQkJcHhhMjU1X3R1cmJvX2ZyZXFfdGFibGVbaV0uaW5kZXggPSBpOwotCX0KLQlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKLQotCS8qIEdlbmVyYXRlIHRoZSBweGEyN3ggY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc3RydWN0ICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9QWEEyN3hfRlJFUVM7IGkrKykgewotCQlmcmVxID0gcHhhMjd4X2ZyZXFzW2ldLmtoejsKLQkJaWYgKGZyZXEgPiBweGEyN3hfbWF4ZnJlcSkKLQkJCWJyZWFrOwotCQlweGEyN3hfZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBmcmVxOwotCQlweGEyN3hfZnJlcV90YWJsZVtpXS5pbmRleCA9IGk7Ci0JfQotCXB4YTI3eF9mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOwotCi0JLyoKLQkgKiBTZXQgdGhlIHBvbGljeSdzIG1pbmltdW0gYW5kIG1heGltdW0gZnJlcXVlbmNpZXMgZnJvbSB0aGUgdGFibGVzCi0JICoganVzdCBjb25zdHJ1Y3RlZC4gIFRoaXMgc2V0cyBjcHVpbmZvLm14eF9mcmVxLCBtaW4gYW5kIG1heC4KLQkgKi8KLQlpZiAoY3B1X2lzX3B4YTI1eCgpKQotCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgcHhhMjU1X3J1bl9mcmVxX3RhYmxlKTsKLQllbHNlIGlmIChjcHVfaXNfcHhhMjd4KCkpCi0JCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBweGEyN3hfZnJlcV90YWJsZSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJQWEEgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2Ugc3VwcG9ydCBpbml0aWFsaXplZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBweGFfY3B1ZnJlcV9kcml2ZXIgPSB7Ci0JLnZlcmlmeQk9IHB4YV92ZXJpZnlfcG9saWN5LAotCS50YXJnZXQJPSBweGFfc2V0X3RhcmdldCwKLQkuaW5pdAk9IHB4YV9jcHVmcmVxX2luaXQsCi0JLmdldAk9IHB4YV9jcHVmcmVxX2dldCwKLQkubmFtZQk9ICJQWEEyeHgiLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcHhhX2NwdV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0JaWYgKGNwdV9pc19weGEyNXgoKSB8fCBjcHVfaXNfcHhhMjd4KCkpCi0JCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZweGFfY3B1ZnJlcV9kcml2ZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBweGFfY3B1X2V4aXQodm9pZCkKLXsKLQljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZweGFfY3B1ZnJlcV9kcml2ZXIpOwotfQotCi0KLU1PRFVMRV9BVVRIT1IoIkludHJpbnN5YyBTb2Z0d2FyZSBJbmMuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNQVSBmcmVxdWVuY3kgY2hhbmdpbmcgZHJpdmVyIGZvciB0aGUgUFhBIGFyY2hpdGVjdHVyZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotbW9kdWxlX2luaXQocHhhX2NwdV9pbml0KTsKLW1vZHVsZV9leGl0KHB4YV9jcHVfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEyeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI3MmVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEyeHguYwpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTJ4eC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiwyMDAzIEludHJpbnN5YyBTb2Z0d2FyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBIaXN0b3J5OgorICogICAzMS1KdWwtMjAwMiA6IEluaXRpYWwgdmVyc2lvbiBbRkJdCisgKiAgIDI5LUphbi0yMDAzIDogYWRkZWQgUFhBMjU1IHN1cHBvcnQgW0ZCXQorICogICAyMC1BcHItMjAwMyA6IHBvcnRlZCB0byB2Mi41IChEdXN0aW4gTWNJbnRpcmUsIFNlbnNvcmlhIENvcnAuKQorICoKKyAqIE5vdGU6CisgKiAgIFRoaXMgZHJpdmVyIG1heSBjaGFuZ2UgdGhlIG1lbW9yeSBidXMgY2xvY2sgcmF0ZSwgYnV0IHdpbGwgbm90IGRvIGFueQorICogICBwbGF0Zm9ybSBzcGVjaWZpYyBhY2Nlc3MgdGltaW5nIGNoYW5nZXMuLi4gZm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgZmxhc2gKKyAqICAgbWVtb3J5IGNvbm5lY3RlZCB0byBDUzAsIHlvdSB3aWxsIG5lZWQgdG8gcmVnaXN0ZXIgYSBwbGF0Zm9ybSBzcGVjaWZpYworICogICBub3RpZmllciB3aGljaCB3aWxsIGFkanVzdCB0aGUgbWVtb3J5IGFjY2VzcyBzdHJvYmVzIHRvIG1haW50YWluIGEKKyAqICAgbWluaW11bSBzdHJvYmUgd2lkdGguCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdW5zaWduZWQgaW50IGZyZXFfZGVidWc7Cittb2R1bGVfcGFyYW0oZnJlcV9kZWJ1ZywgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZyZXFfZGVidWcsICJTZXQgdGhlIGRlYnVnIG1lc3NhZ2VzIHRvIG9uPTEvb2ZmPTAiKTsKKyNlbHNlCisjZGVmaW5lIGZyZXFfZGVidWcgIDAKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgaW50IHB4YTI3eF9tYXhmcmVxOworbW9kdWxlX3BhcmFtKHB4YTI3eF9tYXhmcmVxLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHhhMjd4X21heGZyZXEsICJTZXQgdGhlIHB4YTI3eCBtYXhmcmVxIGluIE1IeiIKKwkJICIodHlwaWNhbGx5IDYyND0+cHhhMjcwLCA0MTY9PnB4YTI3MSwgNTIwPT5weGEyNzIpIik7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQga2h6OworCXVuc2lnbmVkIGludCBtZW1idXM7CisJdW5zaWduZWQgaW50IGNjY3I7CisJdW5zaWduZWQgaW50IGRpdjI7CisJdW5zaWduZWQgaW50IGNjbGtjZmc7Cit9IHB4YV9mcmVxc190OworCisvKiBEZWZpbmUgdGhlIHJlZnJlc2ggcGVyaW9kIGluIG1TZWMgZm9yIHRoZSBTRFJBTSBhbmQgdGhlIG51bWJlciBvZiByb3dzICovCisjZGVmaW5lIFNEUkFNX1RSRUYJNjQJLyogc3RhbmRhcmQgNjRtcyBTRFJBTSAqLworI2RlZmluZSBTRFJBTV9ST1dTCTQwOTYJLyogNjRNQj04MTkyIDMyTUI9NDA5NiAqLworCisjZGVmaW5lIENDTEtDRkdfVFVSQk8JCTB4MQorI2RlZmluZSBDQ0xLQ0ZHX0ZDUwkJMHgyCisjZGVmaW5lIENDTEtDRkdfSEFMRlRVUkJPCTB4NAorI2RlZmluZSBDQ0xLQ0ZHX0ZBU1RCVVMJCTB4OAorI2RlZmluZSBNRFJFRlJfREIyX01BU0sJCShNRFJFRlJfSzJEQjIgfCBNRFJFRlJfSzFEQjIpCisjZGVmaW5lIE1EUkVGUl9EUklfTUFTSwkJMHhGRkYKKworLyoKKyAqIFBYQTI1NSBkZWZpbml0aW9ucworICovCisvKiBVc2UgdGhlIHJ1biBtb2RlIGZyZXF1ZW5jaWVzIGZvciB0aGUgQ1BVRlJFUV9QT0xJQ1lfUEVSRk9STUFOQ0UgcG9saWN5ICovCisjZGVmaW5lIENDTEtDRkcJCQlDQ0xLQ0ZHX1RVUkJPIHwgQ0NMS0NGR19GQ1MKKworc3RhdGljIHB4YV9mcmVxc190IHB4YTI1NV9ydW5fZnJlcXNbXSA9Cit7CisJLyogQ1BVICAgTUVNQlVTICBDQ0NSICBESVYyIENDTEtDRkcJICAgcnVuICB0dXJibyBQWGJ1cyBTRFJBTSAqLworCXsgOTk1MDAsICA5OTUwMCwgMHgxMjEsIDEsICBDQ0xLQ0ZHfSwJLyogIDk5LCAgIDk5LCAgIDUwLCAgIDUwICAqLworCXsxMzI3MDAsIDEzMjcwMCwgMHgxMjMsIDEsICBDQ0xLQ0ZHfSwJLyogMTMzLCAgMTMzLCAgIDY2LCAgIDY2ICAqLworCXsxOTkxMDAsICA5OTUwMCwgMHgxNDEsIDAsICBDQ0xLQ0ZHfSwJLyogMTk5LCAgMTk5LCAgIDk5LCAgIDk5ICAqLworCXsyNjU0MDAsIDEzMjcwMCwgMHgxNDMsIDEsICBDQ0xLQ0ZHfSwJLyogMjY1LCAgMjY1LCAgMTMzLCAgIDY2ICAqLworCXszMzE4MDAsIDE2NTkwMCwgMHgxNDUsIDEsICBDQ0xLQ0ZHfSwJLyogMzMxLCAgMzMxLCAgMTY2LCAgIDgzICAqLworCXszOTgxMDAsICA5OTUwMCwgMHgxNjEsIDAsICBDQ0xLQ0ZHfSwJLyogMzk4LCAgMzk4LCAgMTk2LCAgIDk5ICAqLworfTsKKworLyogVXNlIHRoZSB0dXJibyBtb2RlIGZyZXF1ZW5jaWVzIGZvciB0aGUgQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFIHBvbGljeSAqLworc3RhdGljIHB4YV9mcmVxc190IHB4YTI1NV90dXJib19mcmVxc1tdID0KK3sKKwkvKiBDUFUgICBNRU1CVVMgIENDQ1IgIERJVjIgQ0NMS0NGRwkgICBydW4gIHR1cmJvIFBYYnVzIFNEUkFNICovCisJeyA5OTUwMCwgOTk1MDAsICAweDEyMSwgMSwgIENDTEtDRkd9LAkvKiAgOTksICAgOTksICAgNTAsICAgNTAgICovCisJezE5OTEwMCwgOTk1MDAsICAweDIyMSwgMCwgIENDTEtDRkd9LAkvKiAgOTksICAxOTksICAgNTAsICAgOTkgICovCisJezI5ODUwMCwgOTk1MDAsICAweDMyMSwgMCwgIENDTEtDRkd9LAkvKiAgOTksICAyODcsICAgNTAsICAgOTkgICovCisJezI5ODYwMCwgOTk1MDAsICAweDFjMSwgMCwgIENDTEtDRkd9LAkvKiAxOTksICAyODcsICAgOTksICAgOTkgICovCisJezM5ODEwMCwgOTk1MDAsICAweDI0MSwgMCwgIENDTEtDRkd9LAkvKiAxOTksICAzOTgsICAgOTksICAgOTkgICovCit9OworCisjZGVmaW5lIE5VTV9QWEEyNXhfUlVOX0ZSRVFTIEFSUkFZX1NJWkUocHhhMjU1X3J1bl9mcmVxcykKKyNkZWZpbmUgTlVNX1BYQTI1eF9UVVJCT19GUkVRUyBBUlJBWV9TSVpFKHB4YTI1NV90dXJib19mcmVxcykKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQorCXB4YTI1NV9ydW5fZnJlcV90YWJsZVtOVU1fUFhBMjV4X1JVTl9GUkVRUysxXTsKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUKKwlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtOVU1fUFhBMjV4X1RVUkJPX0ZSRVFTKzFdOworCisvKgorICogUFhBMjcwIGRlZmluaXRpb25zCisgKgorICogRm9yIHRoZSBQWEEyN3g6CisgKiBDb250cm9sIHZhcmlhYmxlcyBhcmUgQSwgTCwgMk4gZm9yIENDQ1I7IEIsIEhULCBUIGZvciBDTEtDRkcuCisgKgorICogQSA9IDAgPT4gbWVtb3J5IGNvbnRyb2xsZXIgY2xvY2sgZnJvbSB0YWJsZSAzLTcsCisgKiBBID0gMSA9PiBtZW1vcnkgY29udHJvbGxlciBjbG9jayA9IHN5c3RlbSBidXMgY2xvY2sKKyAqIFJ1biBtb2RlIGZyZXF1ZW5jeQk9IDEzIE1IeiAqIEwKKyAqIFR1cmJvIG1vZGUgZnJlcXVlbmN5ID0gMTMgTUh6ICogTCAqIE4KKyAqIFN5c3RlbSBidXMgZnJlcXVlbmN5ID0gMTMgTUh6ICogTCAvIChCICsgMSkKKyAqCisgKiBJbiBDQ0NSOgorICogQSA9IDEKKyAqIEwgPSAxNgkgIG9zY2lsbGF0b3IgdG8gcnVuIG1vZGUgcmF0aW8KKyAqIDJOID0gNgkgIDIgKiAodHVyYm8gbW9kZSB0byBydW4gbW9kZSByYXRpbykKKyAqCisgKiBJbiBDQ0xLQ0ZHOgorICogQiA9IDEJICBGYXN0IGJ1cyBtb2RlCisgKiBIVCA9IDAJICBIYWxmLVR1cmJvIG1vZGUKKyAqIFQgPSAxCSAgVHVyYm8gbW9kZQorICoKKyAqIEZvciBub3csIGp1c3Qgc3VwcG9ydCBzb21lIG9mIHRoZSBjb21iaW5hdGlvbnMgaW4gdGFibGUgMy03IG9mCisgKiBQWEEyN3ggUHJvY2Vzc29yIEZhbWlseSBEZXZlbG9wZXIncyBNYW51YWwgdG8gc2ltcGxpZnkgZnJlcXVlbmN5CisgKiBjaGFuZ2Ugc2VxdWVuY2VzLgorICovCisjZGVmaW5lIFBYQTI3eF9DQ0NSKEEsIEwsIE4yKSAoQSA8PCAyNSB8IE4yIDw8IDcgfCBMKQorI2RlZmluZSBDQ0xLQ0ZHMihCLCBIVCwgVCkgXAorICAoQ0NMS0NGR19GQ1MgfCBcCisgICAoKEIpICA/IENDTEtDRkdfRkFTVEJVUyA6IDApIHwgXAorICAgKChIVCkgPyBDQ0xLQ0ZHX0hBTEZUVVJCTyA6IDApIHwgXAorICAgKChUKSAgPyBDQ0xLQ0ZHX1RVUkJPIDogMCkpCisKK3N0YXRpYyBweGFfZnJlcXNfdCBweGEyN3hfZnJlcXNbXSA9IHsKKwl7MTA0MDAwLCAxMDQwMDAsIFBYQTI3eF9DQ0NSKDEsCSA4LCAyKSwgMCwgQ0NMS0NGRzIoMSwgMCwgMSl9LAorCXsxNTYwMDAsIDEwNDAwMCwgUFhBMjd4X0NDQ1IoMSwJIDgsIDYpLCAwLCBDQ0xLQ0ZHMigxLCAxLCAxKX0sCisJezIwODAwMCwgMjA4MDAwLCBQWEEyN3hfQ0NDUigwLCAxNiwgMiksIDEsIENDTEtDRkcyKDAsIDAsIDEpfSwKKwl7MzEyMDAwLCAyMDgwMDAsIFBYQTI3eF9DQ0NSKDEsIDE2LCAzKSwgMSwgQ0NMS0NGRzIoMSwgMCwgMSl9LAorCXs0MTYwMDAsIDIwODAwMCwgUFhBMjd4X0NDQ1IoMSwgMTYsIDQpLCAxLCBDQ0xLQ0ZHMigxLCAwLCAxKX0sCisJezUyMDAwMCwgMjA4MDAwLCBQWEEyN3hfQ0NDUigxLCAxNiwgNSksIDEsIENDTEtDRkcyKDEsIDAsIDEpfSwKKwl7NjI0MDAwLCAyMDgwMDAsIFBYQTI3eF9DQ0NSKDEsIDE2LCA2KSwgMSwgQ0NMS0NGRzIoMSwgMCwgMSl9Cit9OworCisjZGVmaW5lIE5VTV9QWEEyN3hfRlJFUVMgQVJSQVlfU0laRShweGEyN3hfZnJlcXMpCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlCisJcHhhMjd4X2ZyZXFfdGFibGVbTlVNX1BYQTI3eF9GUkVRUysxXTsKKworZXh0ZXJuIHVuc2lnbmVkIGdldF9jbGtfZnJlcXVlbmN5X2toeihpbnQgaW5mbyk7CisKK3N0YXRpYyB2b2lkIGZpbmRfZnJlcV90YWJsZXMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKmZyZXFfdGFibGUsCisJCQkgICAgIHB4YV9mcmVxc190ICoqcHhhX2ZyZXFzKQoreworCWlmIChjcHVfaXNfcHhhMjV4KCkpIHsKKwkJaWYgKHBvbGljeS0+cG9saWN5ID09IENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFKSB7CisJCQkqcHhhX2ZyZXFzID0gcHhhMjU1X3J1bl9mcmVxczsKKwkJCSpmcmVxX3RhYmxlID0gcHhhMjU1X3J1bl9mcmVxX3RhYmxlOworCQl9IGVsc2UgaWYgKHBvbGljeS0+cG9saWN5ID09IENQVUZSRVFfUE9MSUNZX1BPV0VSU0FWRSkgeworCQkJKnB4YV9mcmVxcyA9IHB4YTI1NV90dXJib19mcmVxczsKKwkJCSpmcmVxX3RhYmxlID0gcHhhMjU1X3R1cmJvX2ZyZXFfdGFibGU7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkNQVSBQWEE6IFVua25vd24gcG9saWN5IGZvdW5kLiAiCisJCQkgICAgICAgIlVzaW5nIENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFXG4iKTsKKwkJCSpweGFfZnJlcXMgPSBweGEyNTVfcnVuX2ZyZXFzOworCQkJKmZyZXFfdGFibGUgPSBweGEyNTVfcnVuX2ZyZXFfdGFibGU7CisJCX0KKwl9CisJaWYgKGNwdV9pc19weGEyN3goKSkgeworCQkqcHhhX2ZyZXFzID0gcHhhMjd4X2ZyZXFzOworCQkqZnJlcV90YWJsZSA9IHB4YTI3eF9mcmVxX3RhYmxlOworCX0KK30KKworc3RhdGljIHZvaWQgcHhhMjd4X2d1ZXNzX21heF9mcmVxKHZvaWQpCit7CisJaWYgKCFweGEyN3hfbWF4ZnJlcSkgeworCQlweGEyN3hfbWF4ZnJlcSA9IDQxNjAwMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFhBIENQVSAyN3ggbWF4IGZyZXF1ZW5jeSBub3QgZGVmaW5lZCAiCisJCSAgICAgICAiKHB4YTI3eF9tYXhmcmVxKSwgYXNzdW1pbmcgcHhhMjcxIHdpdGggJWRrSHogbWF4ZnJlcVxuIiwKKwkJICAgICAgIHB4YTI3eF9tYXhmcmVxKTsKKwl9IGVsc2UgeworCQlweGEyN3hfbWF4ZnJlcSAqPSAxMDAwOworCX0KK30KKworc3RhdGljIHUzMiBtZHJlZnJfZHJpKHVuc2lnbmVkIGludCBmcmVxKQoreworCXUzMiBkcmkgPSAwOworCisJaWYgKGNwdV9pc19weGEyNXgoKSkKKwkJZHJpID0gKChmcmVxICogU0RSQU1fVFJFRikgLyAoU0RSQU1fUk9XUyAqIDMyKSk7CisJaWYgKGNwdV9pc19weGEyN3goKSkKKwkJZHJpID0gKChmcmVxICogU0RSQU1fVFJFRikgLyAoU0RSQU1fUk9XUyAtIDMxKSkgLyAzMjsKKwlyZXR1cm4gZHJpOworfQorCisvKiBmaW5kIGEgdmFsaWQgZnJlcXVlbmN5IHBvaW50ICovCitzdGF0aWMgaW50IHB4YV92ZXJpZnlfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcHhhX2ZyZXFzX3RhYmxlOworCXB4YV9mcmVxc190ICpweGFfZnJlcXM7CisJaW50IHJldDsKKworCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFzKTsKKwlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBweGFfZnJlcXNfdGFibGUpOworCisJaWYgKGZyZXFfZGVidWcpCisJCXByX2RlYnVnKCJWZXJpZmllZCBDUFUgcG9saWN5OiAlZEtoeiBtaW4gdG8gJWRLaHogbWF4XG4iLAorCQkJIHBvbGljeS0+bWluLCBwb2xpY3ktPm1heCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHB4YV9jcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCk7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcHhhX2ZyZXFzX3RhYmxlOworCXB4YV9mcmVxc190ICpweGFfZnJlcV9zZXR0aW5nczsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG5ld19mcmVxX2NwdSwgbmV3X2ZyZXFfbWVtOworCXVuc2lnbmVkIGludCB1bnVzZWQsIHByZXNldF9tZHJlZnIsIHBvc3RzZXRfbWRyZWZyLCBjY2xrY2ZnOworCisJLyogR2V0IHRoZSBjdXJyZW50IHBvbGljeSAqLworCWZpbmRfZnJlcV90YWJsZXMocG9saWN5LCAmcHhhX2ZyZXFzX3RhYmxlLCAmcHhhX2ZyZXFfc2V0dGluZ3MpOworCisJLyogTG9va3VwIHRoZSBuZXh0IGZyZXF1ZW5jeSAqLworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBweGFfZnJlcXNfdGFibGUsCisJCQkJCSAgIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmlkeCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X2ZyZXFfY3B1ID0gcHhhX2ZyZXFfc2V0dGluZ3NbaWR4XS5raHo7CisJbmV3X2ZyZXFfbWVtID0gcHhhX2ZyZXFfc2V0dGluZ3NbaWR4XS5tZW1idXM7CisJZnJlcXMub2xkID0gcG9saWN5LT5jdXI7CisJZnJlcXMubmV3ID0gbmV3X2ZyZXFfY3B1OworCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OworCisJaWYgKGZyZXFfZGVidWcpCisJCXByX2RlYnVnKEtFUk5fSU5GTyAiQ2hhbmdpbmcgQ1BVIGZyZXF1ZW5jeSB0byAlZCBNaHosICIKKwkJCSAiKFNEUkFNICVkIE1oeilcbiIsCisJCQkgZnJlcXMubmV3IC8gMTAwMCwgKHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uZGl2MikgPworCQkJIChuZXdfZnJlcV9tZW0gLyAyMDAwKSA6IChuZXdfZnJlcV9tZW0gLyAxMDAwKSk7CisKKwkvKgorCSAqIFRlbGwgZXZlcnlvbmUgd2hhdCB3ZSdyZSBhYm91dCB0byBkby4uLgorCSAqIHlvdSBzaG91bGQgYWRkIGEgbm90aWZ5IGNsaWVudCB3aXRoIGFueSBwbGF0Zm9ybSBzcGVjaWZpYworCSAqIFZjYyBjaGFuZ2luZyBjYXBhYmlsaXR5CisJICovCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBNRFJFRlIuICBJZiB3ZSdyZSBzbG93aW5nIGRvd24gdGhlIFNEUkFNIGNsb2NrCisJICogd2UgbmVlZCB0byBwcmVzZXQgdGhlIHNtYWxsZXIgRFJJIGJlZm9yZSB0aGUgY2hhbmdlLgkgSWYgd2UncmUKKwkgKiBzcGVlZGluZyB1cCB3ZSBuZWVkIHRvIHNldCB0aGUgbGFyZ2VyIERSSSB2YWx1ZSBhZnRlciB0aGUgY2hhbmdlLgorCSAqLworCXByZXNldF9tZHJlZnIgPSBwb3N0c2V0X21kcmVmciA9IE1EUkVGUjsKKwlpZiAoKE1EUkVGUiAmIE1EUkVGUl9EUklfTUFTSykgPiBtZHJlZnJfZHJpKG5ld19mcmVxX21lbSkpIHsKKwkJcHJlc2V0X21kcmVmciA9IChwcmVzZXRfbWRyZWZyICYgfk1EUkVGUl9EUklfTUFTSyk7CisJCXByZXNldF9tZHJlZnIgfD0gbWRyZWZyX2RyaShuZXdfZnJlcV9tZW0pOworCX0KKwlwb3N0c2V0X21kcmVmciA9CisJCShwb3N0c2V0X21kcmVmciAmIH5NRFJFRlJfRFJJX01BU0spIHwgbWRyZWZyX2RyaShuZXdfZnJlcV9tZW0pOworCisJLyogSWYgd2UncmUgZGl2aWRpbmcgdGhlIG1lbW9yeSBjbG9jayBieSB0d28gZm9yIHRoZSBTRFJBTSBjbG9jaywgdGhpcworCSAqIG11c3QgYmUgc2V0IHByaW9yIHRvIHRoZSBjaGFuZ2UuICBDbGVhcmluZyB0aGUgZGl2aWRlIG11c3QgYmUgZG9uZQorCSAqIGFmdGVyIHRoZSBjaGFuZ2UuCisJICovCisJaWYgKHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uZGl2MikgeworCQlwcmVzZXRfbWRyZWZyICB8PSBNRFJFRlJfREIyX01BU0s7CisJCXBvc3RzZXRfbWRyZWZyIHw9IE1EUkVGUl9EQjJfTUFTSzsKKwl9IGVsc2UgeworCQlwb3N0c2V0X21kcmVmciAmPSB+TURSRUZSX0RCMl9NQVNLOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFNldCBuZXcgdGhlIENDQ1IgYW5kIHByZXBhcmUgQ0NMS0NGRyAqLworCUNDQ1IgPSBweGFfZnJlcV9zZXR0aW5nc1tpZHhdLmNjY3I7CisJY2Nsa2NmZyA9IHB4YV9mcmVxX3NldHRpbmdzW2lkeF0uY2Nsa2NmZzsKKworCWFzbSB2b2xhdGlsZSgiCQkJCQkJCVxuXAorCQlsZHIJcjQsIFslMV0JCS8qIGxvYWQgTURSRUZSICovCVxuXAorCQliCTJmCQkJCQkJXG5cCisJCS5hbGlnbgk1CQkJCQkJXG5cCisxOgkJCQkJCQkJCVxuXAorCQlzdHIJJTMsIFslMV0JCS8qIHByZXNldCB0aGUgTURSRUZSICovCVxuXAorCQltY3IJcDE0LCAwLCAlMiwgYzYsIGMwLCAwCS8qIHNldCBDQ0xLQ0ZHW0ZDU10gKi8JXG5cCisJCXN0cgklNCwgWyUxXQkJLyogcG9zdHNldCB0aGUgTURSRUZSICovIFxuXAorCQkJCQkJCQkJXG5cCisJCWIJM2YJCQkJCQlcblwKKzI6CQliCTFiCQkJCQkJXG5cCiszOgkJbm9wCQkJCQkJCVxuXAorCSAgIgorCQkgICAgIDogIj0mciIgKHVudXNlZCkKKwkJICAgICA6ICJyIiAoJk1EUkVGUiksICJyIiAoY2Nsa2NmZyksCisJCSAgICAgICAiciIgKHByZXNldF9tZHJlZnIpLCAiciIgKHBvc3RzZXRfbWRyZWZyKQorCQkgICAgIDogInI0IiwgInI1Iik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyoKKwkgKiBUZWxsIGV2ZXJ5b25lIHdoYXQgd2UndmUganVzdCBkb25lLi4uCisJICogeW91IHNob3VsZCBhZGQgYSBub3RpZnkgY2xpZW50IHdpdGggYW55IHBsYXRmb3JtIHNwZWNpZmljCisJICogU0RSQU0gcmVmcmVzaCB0aW1lciBhZGp1c3RtZW50cworCSAqLworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHB4YV9jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGZyZXE7CisKKwkvKiB0cnkgdG8gZ3Vlc3MgcHhhMjd4IGNwdSAqLworCWlmIChjcHVfaXNfcHhhMjd4KCkpCisJCXB4YTI3eF9ndWVzc19tYXhfZnJlcSgpOworCisJLyogc2V0IGRlZmF1bHQgcG9saWN5IGFuZCBjcHVpbmZvICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDA7IC8qIEZJWE1FOiAxIG1zLCBhc3N1bWVkICovCisJcG9saWN5LT5jdXIgPSBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooMCk7CSAgIC8qIGN1cnJlbnQgZnJlcSAqLworCXBvbGljeS0+bWluID0gcG9saWN5LT5tYXggPSBwb2xpY3ktPmN1cjsKKworCS8qIEdlbmVyYXRlIHB4YTI1eCB0aGUgcnVuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHN0cnVjdCAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUFhBMjV4X1JVTl9GUkVRUzsgaSsrKSB7CisJCXB4YTI1NV9ydW5fZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBweGEyNTVfcnVuX2ZyZXFzW2ldLmtoejsKKwkJcHhhMjU1X3J1bl9mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwl9CisJcHhhMjU1X3J1bl9mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJLyogR2VuZXJhdGUgcHhhMjV4IHRoZSB0dXJibyBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzdHJ1Y3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1BYQTI1eF9UVVJCT19GUkVRUzsgaSsrKSB7CisJCXB4YTI1NV90dXJib19mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9CisJCQlweGEyNTVfdHVyYm9fZnJlcXNbaV0ua2h6OworCQlweGEyNTVfdHVyYm9fZnJlcV90YWJsZVtpXS5pbmRleCA9IGk7CisJfQorCXB4YTI1NV90dXJib19mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJLyogR2VuZXJhdGUgdGhlIHB4YTI3eCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzdHJ1Y3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1BYQTI3eF9GUkVRUzsgaSsrKSB7CisJCWZyZXEgPSBweGEyN3hfZnJlcXNbaV0ua2h6OworCQlpZiAoZnJlcSA+IHB4YTI3eF9tYXhmcmVxKQorCQkJYnJlYWs7CisJCXB4YTI3eF9mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZyZXE7CisJCXB4YTI3eF9mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwl9CisJcHhhMjd4X2ZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisKKwkvKgorCSAqIFNldCB0aGUgcG9saWN5J3MgbWluaW11bSBhbmQgbWF4aW11bSBmcmVxdWVuY2llcyBmcm9tIHRoZSB0YWJsZXMKKwkgKiBqdXN0IGNvbnN0cnVjdGVkLiAgVGhpcyBzZXRzIGNwdWluZm8ubXh4X2ZyZXEsIG1pbiBhbmQgbWF4LgorCSAqLworCWlmIChjcHVfaXNfcHhhMjV4KCkpCisJCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBweGEyNTVfcnVuX2ZyZXFfdGFibGUpOworCWVsc2UgaWYgKGNwdV9pc19weGEyN3goKSkKKwkJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIHB4YTI3eF9mcmVxX3RhYmxlKTsKKworCXByaW50ayhLRVJOX0lORk8gIlBYQSBDUFUgZnJlcXVlbmN5IGNoYW5nZSBzdXBwb3J0IGluaXRpYWxpemVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIHB4YV9jcHVmcmVxX2RyaXZlciA9IHsKKwkudmVyaWZ5CT0gcHhhX3ZlcmlmeV9wb2xpY3ksCisJLnRhcmdldAk9IHB4YV9zZXRfdGFyZ2V0LAorCS5pbml0CT0gcHhhX2NwdWZyZXFfaW5pdCwKKwkuZ2V0CT0gcHhhX2NwdWZyZXFfZ2V0LAorCS5uYW1lCT0gIlBYQTJ4eCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGFfY3B1X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwlpZiAoY3B1X2lzX3B4YTI1eCgpIHx8IGNwdV9pc19weGEyN3goKSkKKwkJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnB4YV9jcHVmcmVxX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHB4YV9jcHVfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnB4YV9jcHVmcmVxX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiSW50cmluc3ljIFNvZnR3YXJlIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ1BVIGZyZXF1ZW5jeSBjaGFuZ2luZyBkcml2ZXIgZm9yIHRoZSBQWEEgYXJjaGl0ZWN0dXJlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChweGFfY3B1X2luaXQpOworbW9kdWxlX2V4aXQocHhhX2NwdV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NwdWZyZXEtcHhhM3h4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTN4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGM4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jcHVmcmVxLXB4YTN4eC5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvY3B1ZnJlcS1weGEzeHguYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9weGEzeHgtcmVncy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisjZGVmaW5lIEhTU18xMDRNCSgwKQorI2RlZmluZSBIU1NfMTU2TQkoMSkKKyNkZWZpbmUgSFNTXzIwOE0JKDIpCisjZGVmaW5lIEhTU18zMTJNCSgzKQorCisjZGVmaW5lIFNNQ0ZTXzc4TQkoMCkKKyNkZWZpbmUgU01DRlNfMTA0TQkoMikKKyNkZWZpbmUgU01DRlNfMjA4TQkoNSkKKworI2RlZmluZSBTRkxGU18xMDRNCSgwKQorI2RlZmluZSBTRkxGU18xNTZNCSgxKQorI2RlZmluZSBTRkxGU18yMDhNCSgyKQorI2RlZmluZSBTRkxGU18zMTJNCSgzKQorCisjZGVmaW5lIFhTUENMS18xNTZNCSgwKQorI2RlZmluZSBYU1BDTEtfTk9ORQkoMykKKworI2RlZmluZSBETUNGU18yNk0JKDApCisjZGVmaW5lIERNQ0ZTXzI2ME0JKDMpCisKK3N0cnVjdCBweGEzeHhfZnJlcV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgY3B1ZnJlcV9taHo7CisJdW5zaWduZWQgaW50IGNvcmVfeGwgOiA1OworCXVuc2lnbmVkIGludCBjb3JlX3huIDogMzsKKwl1bnNpZ25lZCBpbnQgaHNzIDogMjsKKwl1bnNpZ25lZCBpbnQgZG1jZnMgOiAyOworCXVuc2lnbmVkIGludCBzbWNmcyA6IDM7CisJdW5zaWduZWQgaW50IHNmbGZzIDogMjsKKwl1bnNpZ25lZCBpbnQgZGZfY2xrZGl2IDogMzsKKworCWludAl2Y2NfY29yZTsJLyogaW4gbVYgKi8KKwlpbnQJdmNjX3NyYW07CS8qIGluIG1WICovCit9OworCisjZGVmaW5lIE9QKGNwdWZyZXEsIF94bCwgX3huLCBfaHNzLCBfZG1jLCBfc21jLCBfc2ZsLCBfZGZpLCB2Y29yZSwgdnNyYW0pIFwKK3sJCQkJCQkJCQlcCisJLmNwdWZyZXFfbWh6CT0gY3B1ZnJlcSwJCQkJCVwKKwkuY29yZV94bAk9IF94bCwJCQkJCQlcCisJLmNvcmVfeG4JPSBfeG4sCQkJCQkJXAorCS5oc3MJCT0gSFNTXyMjX2hzcyMjTSwJCQkJXAorCS5kbWNmcwkJPSBETUNGU18jI19kbWMjI00sCQkJCVwKKwkuc21jZnMJCT0gU01DRlNfIyNfc21jIyNNLAkJCQlcCisJLnNmbGZzCQk9IFNGTEZTXyMjX3NmbCMjTSwJCQkJXAorCS5kZl9jbGtkaXYJPSBfZGZpLAkJCQkJCVwKKwkudmNjX2NvcmUJPSB2Y29yZSwJCQkJCVwKKwkudmNjX3NyYW0JPSB2c3JhbSwJCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBweGEzeHhfZnJlcV9pbmZvIHB4YTMwMF9mcmVxc1tdID0geworCS8qICBDUFUgWEwgWE4gIEhTUyBETUVNIFNNRU0gU1JBTSBERkkgVkNDX0NPUkUgVkNDX1NSQU0gKi8KKwlPUCgxMDQsICA4LCAxLCAxMDQsIDI2MCwgIDc4LCAxMDQsIDMsIDEwMDAsIDExMDApLCAvKiAxMDRNSHogKi8KKwlPUCgyMDgsIDE2LCAxLCAxMDQsIDI2MCwgMTA0LCAxNTYsIDIsIDEwMDAsIDExMDApLCAvKiAyMDhNSHogKi8KKwlPUCg0MTYsIDE2LCAyLCAxNTYsIDI2MCwgMTA0LCAyMDgsIDIsIDExMDAsIDEyMDApLCAvKiA0MTZNSHogKi8KKwlPUCg2MjQsIDI0LCAyLCAyMDgsIDI2MCwgMjA4LCAzMTIsIDMsIDEzNzUsIDE0MDApLCAvKiA2MjRNSHogKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhM3h4X2ZyZXFfaW5mbyBweGEzMjBfZnJlcXNbXSA9IHsKKwkvKiAgQ1BVIFhMIFhOICBIU1MgRE1FTSBTTUVNIFNSQU0gREZJIFZDQ19DT1JFIFZDQ19TUkFNICovCisJT1AoMTA0LCAgOCwgMSwgMTA0LCAyNjAsICA3OCwgMTA0LCAzLCAxMDAwLCAxMTAwKSwgLyogMTA0TUh6ICovCisJT1AoMjA4LCAxNiwgMSwgMTA0LCAyNjAsIDEwNCwgMTU2LCAyLCAxMDAwLCAxMTAwKSwgLyogMjA4TUh6ICovCisJT1AoNDE2LCAxNiwgMiwgMTU2LCAyNjAsIDEwNCwgMjA4LCAyLCAxMTAwLCAxMjAwKSwgLyogNDE2TUh6ICovCisJT1AoNjI0LCAyNCwgMiwgMjA4LCAyNjAsIDIwOCwgMzEyLCAzLCAxMzc1LCAxNDAwKSwgLyogNjI0TUh6ICovCisJT1AoODA2LCAzMSwgMiwgMjA4LCAyNjAsIDIwOCwgMzEyLCAzLCAxNDAwLCAxNDAwKSwgLyogODA2TUh6ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHB4YTN4eF9mcmVxc19udW07CitzdGF0aWMgc3RydWN0IHB4YTN4eF9mcmVxX2luZm8gKnB4YTN4eF9mcmVxczsKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnB4YTN4eF9mcmVxc190YWJsZTsKKworc3RhdGljIGludCBzZXR1cF9mcmVxc190YWJsZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgc3RydWN0IHB4YTN4eF9mcmVxX2luZm8gKmZyZXFzLCBpbnQgbnVtKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGU7CisJaW50IGk7CisKKwl0YWJsZSA9IGt6YWxsb2MoKG51bSArIDEpICogc2l6ZW9mKCp0YWJsZSksIEdGUF9LRVJORUwpOworCWlmICh0YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQl0YWJsZVtpXS5pbmRleCA9IGk7CisJCXRhYmxlW2ldLmZyZXF1ZW5jeSA9IGZyZXFzW2ldLmNwdWZyZXFfbWh6ICogMTAwMDsKKwl9CisJdGFibGVbbnVtXS5mcmVxdWVuY3kgPSBpOworCXRhYmxlW251bV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisKKwlweGEzeHhfZnJlcXMgPSBmcmVxczsKKwlweGEzeHhfZnJlcXNfbnVtID0gbnVtOworCXB4YTN4eF9mcmVxc190YWJsZSA9IHRhYmxlOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCB0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fdXBkYXRlX2NvcmVfZnJlcShzdHJ1Y3QgcHhhM3h4X2ZyZXFfaW5mbyAqaW5mbykKK3sKKwl1aW50MzJfdCBtYXNrID0gQUNDUl9YTl9NQVNLIHwgQUNDUl9YTF9NQVNLOworCXVpbnQzMl90IGFjY3IgPSBBQ0NSOworCXVpbnQzMl90IHhjbGtjZmc7CisKKwlhY2NyICY9IH4oQUNDUl9YTl9NQVNLIHwgQUNDUl9YTF9NQVNLIHwgQUNDUl9YU1BDTEtfTUFTSyk7CisJYWNjciB8PSBBQ0NSX1hOKGluZm8tPmNvcmVfeG4pIHwgQUNDUl9YTChpbmZvLT5jb3JlX3hsKTsKKworCS8qIE5vIGNsb2NrIHVudGlsIGNvcmUgUExMIGlzIHJlLWxvY2tlZCAqLworCWFjY3IgfD0gQUNDUl9YU1BDTEsoWFNQQ0xLX05PTkUpOworCisJeGNsa2NmZyA9IChpbmZvLT5jb3JlX3huID09IDIpID8gMHgzIDogMHgyOwkvKiB0dXJibyBiaXQgKi8KKworCUFDQ1IgPSBhY2NyOworCV9fYXNtX18oIm1jciBwMTQsIDAsICUwLCBjNiwgYzAsIDBcbiIgOiA6ICJyIih4Y2xrY2ZnKSk7CisKKwl3aGlsZSAoKEFDU1IgJiBtYXNrKSAhPSAoYWNjciAmIG1hc2spKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIHZvaWQgX191cGRhdGVfYnVzX2ZyZXEoc3RydWN0IHB4YTN4eF9mcmVxX2luZm8gKmluZm8pCit7CisJdWludDMyX3QgbWFzazsKKwl1aW50MzJfdCBhY2NyID0gQUNDUjsKKworCW1hc2sgPSBBQ0NSX1NNQ0ZTX01BU0sgfCBBQ0NSX1NGTEZTX01BU0sgfCBBQ0NSX0hTU19NQVNLIHwKKwkJQUNDUl9ETUNGU19NQVNLOworCisJYWNjciAmPSB+bWFzazsKKwlhY2NyIHw9IEFDQ1JfU01DRlMoaW5mby0+c21jZnMpIHwgQUNDUl9TRkxGUyhpbmZvLT5zZmxmcykgfAorCQlBQ0NSX0hTUyhpbmZvLT5oc3MpIHwgQUNDUl9ETUNGUyhpbmZvLT5kbWNmcyk7CisKKwlBQ0NSID0gYWNjcjsKKworCXdoaWxlICgoQUNTUiAmIG1hc2spICE9IChhY2NyICYgbWFzaykpCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9jcHVmcmVxX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgcHhhM3h4X2ZyZXFzX3RhYmxlKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBweGEzeHhfY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KDApOworfQorCitzdGF0aWMgaW50IHB4YTN4eF9jcHVmcmVxX3NldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwlzdHJ1Y3QgcHhhM3h4X2ZyZXFfaW5mbyAqbmV4dDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZHg7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBMb29rdXAgdGhlIG5leHQgZnJlcXVlbmN5ICovCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIHB4YTN4eF9mcmVxc190YWJsZSwKKwkJCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZpZHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5leHQgPSAmcHhhM3h4X2ZyZXFzW2lkeF07CisKKwlmcmVxcy5vbGQgPSBwb2xpY3ktPmN1cjsKKwlmcmVxcy5uZXcgPSBuZXh0LT5jcHVmcmVxX21oeiAqIDEwMDA7CisJZnJlcXMuY3B1ID0gcG9saWN5LT5jcHU7CisKKwlwcl9kZWJ1ZygiQ1BVIGZyZXF1ZW5jeSBmcm9tICVkIE1IeiB0byAlZCBNSHolc1xuIiwKKwkJCWZyZXFzLm9sZCAvIDEwMDAsIGZyZXFzLm5ldyAvIDEwMDAsCisJCQkoZnJlcXMub2xkID09IGZyZXFzLm5ldykgPyAiIChza2lwcGVkKSIgOiAiIik7CisKKwlpZiAoZnJlcXMub2xkID09IHRhcmdldF9mcmVxKQorCQlyZXR1cm4gMDsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX191cGRhdGVfY29yZV9mcmVxKG5leHQpOworCV9fdXBkYXRlX2J1c19mcmVxKG5leHQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHB4YTN4eF9jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiBzZXQgZGVmYXVsdCBwb2xpY3kgYW5kIGNwdWluZm8gKi8KKwlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSAxMDQwMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gKGNwdV9pc19weGEzMjAoKSkgPyA4MDYwMDAgOiA2MjQwMDA7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDA7IC8qIEZJWE1FOiAxIG1zLCBhc3N1bWVkICovCisJcG9saWN5LT5jdXIgPSBwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gZ2V0X2Nsa19mcmVxdWVuY3lfa2h6KDApOworCisJaWYgKGNwdV9pc19weGEzMDAoKSB8fCBjcHVfaXNfcHhhMzEwKCkpCisJCXJldCA9IHNldHVwX2ZyZXFzX3RhYmxlKHBvbGljeSwgQVJSQVlfQU5EX1NJWkUocHhhMzAwX2ZyZXFzKSk7CisKKwlpZiAoY3B1X2lzX3B4YTMyMCgpKQorCQlyZXQgPSBzZXR1cF9mcmVxc190YWJsZShwb2xpY3ksIEFSUkFZX0FORF9TSVpFKHB4YTMyMF9mcmVxcykpOworCisJaWYgKHJldCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBzZXR1cCBmcmVxdWVuY3kgdGFibGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByX2luZm8oIkNQVUZSRVEgc3VwcG9ydCBmb3IgUFhBM3h4IGluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBweGEzeHhfY3B1ZnJlcV9kcml2ZXIgPSB7CisJLnZlcmlmeQkJPSBweGEzeHhfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldAkJPSBweGEzeHhfY3B1ZnJlcV9zZXQsCisJLmluaXQJCT0gcHhhM3h4X2NwdWZyZXFfaW5pdCwKKwkuZ2V0CQk9IHB4YTN4eF9jcHVmcmVxX2dldCwKKwkubmFtZQkJPSAicHhhM3h4LWNwdWZyZXEiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEzeHgoKSkKKwkJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZweGEzeHhfY3B1ZnJlcV9kcml2ZXIpOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChjcHVmcmVxX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY3B1ZnJlcV9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcHhhM3h4X2NwdWZyZXFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNwdWZyZXFfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlciBmb3IgUFhBM3h4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9kZXZpY2VzLmgKaW5kZXggODg3YzczOC4uYmIwNGFmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZGV2aWNlcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2RldmljZXMuaApAQCAtMzIsNSArMzIsNiBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhMjd4X2RldmljZV9wd20xOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX25hbmQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX2kyY19wb3dlcjsKIAogdm9pZCBfX2luaXQgcHhhX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTMzMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTMzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODhlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lMzMwLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciB0aGUgVG9zaGliYSBlc2VyaWVzIFBEQXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiZXNlcmllcy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgZTMzMF9pbml0KHZvaWQpCit7CisJcHhhX3NldF91ZGNfaW5mbygmZTd4eF91ZGNfbWFjaF9pbmZvKTsKK30KKworTUFDSElORV9TVEFSVChFMzMwLCAiVG9zaGliYSBlMzMwIikKKwkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLworCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCisJLmZpeHVwCQk9IGVzZXJpZXNfZml4dXAsCisJLmluaXRfbWFjaGluZQk9IGUzMzBfaW5pdCwKKwkudGltZXIJCT0gJnB4YV90aW1lciwKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNiYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgdGhlIFRvc2hpYmEgZXNlcmllcyBQREFzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3VkYy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgImVzZXJpZXMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGUzNTBfaW5pdCh2b2lkKQoreworCXB4YV9zZXRfdWRjX2luZm8oJmU3eHhfdWRjX21hY2hfaW5mbyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoRTM1MCwgIlRvc2hpYmEgZTM1MCIpCisJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAorCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAorCS5pbml0X21hY2hpbmUJPSBlMzUwX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YmJhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2U0MDAuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogSGFyZHdhcmUgZGVmaW5pdGlvbnMgZm9yIHRoZSBUb3NoaWJhIGVzZXJpZXMgUERBcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorI2luY2x1ZGUgPG1hY2gvdWRjLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiZXNlcmllcy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTQwMCBMQ0QgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIGU0MDBfcHhhZmJfbW9kZV9pbmZvID0geworCS5waXhjbG9jayAgICAgICA9IDE0MDcwMywKKwkueHJlcyAgICAgICAgICAgPSAyNDAsCisJLnlyZXMgICAgICAgICAgID0gMzIwLAorCS5icHAgICAgICAgICAgICA9IDE2LAorCS5oc3luY19sZW4gICAgICA9IDQsCisJLmxlZnRfbWFyZ2luICAgID0gMjgsCisJLnJpZ2h0X21hcmdpbiAgID0gOCwKKwkudnN5bmNfbGVuICAgICAgPSAzLAorCS51cHBlcl9tYXJnaW4gICA9IDUsCisJLmxvd2VyX21hcmdpbiAgID0gNiwKKwkuc3luYyAgICAgICAgICAgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gZTQwMF9weGFmYl9tYWNoX2luZm8gPSB7CisJLm1vZGVzICAgICAgICAgID0gJmU0MDBfcHhhZmJfbW9kZV9pbmZvLAorCS5udW1fbW9kZXMgICAgICA9IDEsCisJLmxjY3IwICAgICAgICAgID0gTENDUjBfQ29sb3IgfCBMQ0NSMF9TbmdsIHwgTENDUjBfQWN0LAorCS5sY2NyMyAgICAgICAgICA9IDAsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlciAgPSBOVUxMLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEU0MDAgTUZQIGNvbmZpZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlNDAwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIENoaXAgc2VsZWN0cyAqLworCUdQSU8xNV9uQ1NfMSwgICAvKiBDUzEgLSBGbGFzaCAqLworCUdQSU84MF9uQ1NfNCwgICAvKiBDUzQgLSBUTUlPICovCisKKwkvKiBDbG9ja3MgKi8KKwlHUElPMTJfMzJLSHosCisKKwkvKiBCVFVBUlQgKi8KKwlHUElPNDJfQlRVQVJUX1JYRCwKKwlHUElPNDNfQlRVQVJUX1RYRCwKKwlHUElPNDRfQlRVQVJUX0NUUywKKwlHUElPNDVfR1BJTywgLyogVXNlZCBieSBUTUlPIGZvciAjU1VTUEVORCAqLworCisJLyogd2FrZXVwICovCisJR1BJTzBfR1BJTyB8IFdBS0VVUF9PTl9FREdFX1JJU0UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBlNDAwX2luaXQodm9pZCkKK3sKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlNDAwX3Bpbl9jb25maWcpKTsKKwlzZXRfcHhhX2ZiX2luZm8oJmU0MDBfcHhhZmJfbWFjaF9pbmZvKTsKKwlweGFfc2V0X3VkY19pbmZvKCZlN3h4X3VkY19tYWNoX2luZm8pOworfQorCitNQUNISU5FX1NUQVJUKEU0MDAsICJUb3NoaWJhIGU0MDAiKQorCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLm1hcF9pbwkJPSBweGFfbWFwX2lvLAorCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKKwkuZml4dXAJCT0gZXNlcmllc19maXh1cCwKKwkuaW5pdF9tYWNoaW5lCT0gZTQwMF9pbml0LAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMF9sY2QuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U0MDBfbGNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Mzg4NDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMF9sY2QuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBlNDAwX2xjZC5jCi0gKgotICogKGMpIDIwMDUgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGFmYi5oPgotCi1zdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBlNDAwX3B4YWZiX21vZGVfaW5mbyA9IHsKLQkucGl4Y2xvY2sgICAgICAgPSAxNDA3MDMsCi0JLnhyZXMgICAgICAgICAgID0gMjQwLAotCS55cmVzICAgICAgICAgICA9IDMyMCwKLQkuYnBwICAgICAgICAgICAgPSAxNiwKLQkuaHN5bmNfbGVuICAgICAgPSA0LAotCS5sZWZ0X21hcmdpbiAgICA9IDI4LAotCS5yaWdodF9tYXJnaW4gICA9IDgsCi0JLnZzeW5jX2xlbiAgICAgID0gMywKLQkudXBwZXJfbWFyZ2luICAgPSA1LAotCS5sb3dlcl9tYXJnaW4gICA9IDYsCi0JLnN5bmMgICAgICAgICAgID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGU0MDBfcHhhZmJfbWFjaF9pbmZvID0gewotCS5tb2RlcyAgICAgICAgICA9ICZlNDAwX3B4YWZiX21vZGVfaW5mbywKLQkubnVtX21vZGVzICAgICAgPSAxLAotCS5sY2NyMCAgICAgICAgICA9IExDQ1IwX0NvbG9yIHwgTENDUjBfU25nbCB8IExDQ1IwX0FjdCwKLQkubGNjcjMgICAgICAgICAgPSAwLAotCS5weGFmYl9iYWNrbGlnaHRfcG93ZXIgID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGU0MDBfbGNkX2luaXQodm9pZCkKLXsKLQlpZiAoIW1hY2hpbmVfaXNfZTQwMCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXNldF9weGFfZmJfaW5mbygmZTQwMF9weGFmYl9tYWNoX2luZm8pOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChlNDAwX2xjZF9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiZTQwMCBsY2QgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1N2ExNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgdGhlIFRvc2hpYmEgZXNlcmllcyBQREFzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKyNpbmNsdWRlICJlc2VyaWVzLmgiCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGU3NDAgdmlkZW8gc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB3MTAwX2dlbl9yZWdzIGU3NDBfbGNkX3JlZ3MgPSB7CisJLmxjZF9mb3JtYXQgPSAgICAgICAgICAgIDB4MDAwMDgwMjMsCisJLmxjZGRfY250bDEgPSAgICAgICAgICAgIDB4MGYwMDAwMDAsCisJLmxjZGRfY250bDIgPSAgICAgICAgICAgIDB4MDAwM2ZmZmYsCisJLmdlbmxjZF9jbnRsMSA9ICAgICAgICAgIDB4MDBmZmZmMDMsCisJLmdlbmxjZF9jbnRsMiA9ICAgICAgICAgIDB4MDAzYzBmMDMsCisJLmdlbmxjZF9jbnRsMyA9ICAgICAgICAgIDB4MDAwMTQzYWEsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBfbW9kZSBlNzQwX2xjZF9tb2RlID0geworCS54cmVzICAgICAgICAgICAgPSAyNDAsCisJLnlyZXMgICAgICAgICAgICA9IDMyMCwKKwkubGVmdF9tYXJnaW4gICAgID0gMjAsCisJLnJpZ2h0X21hcmdpbiAgICA9IDI4LAorCS51cHBlcl9tYXJnaW4gICAgPSA5LAorCS5sb3dlcl9tYXJnaW4gICAgPSA4LAorCS5jcnRjX3NzICAgICAgICAgPSAweDgwMTQwMDEzLAorCS5jcnRjX2xzICAgICAgICAgPSAweDgxMTUwMTEwLAorCS5jcnRjX2dzICAgICAgICAgPSAweDgwMDUwMDA1LAorCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAwMGEwMDA5LAorCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMTBhLAorCS5jcnRjX2RjbGsgICAgICAgPSAweGE5MDYwMDBhLAorCS5jcnRjX2djbGsgICAgICAgPSAweDgwMDUwMTA4LAorCS5jcnRjX2dvZSAgICAgICAgPSAweDgwMDUwMTA4LAorCS5wbGxfZnJlcSAgICAgICAgPSA1NywKKwkucGl4Y2xrX2RpdmlkZXIgICAgICAgICA9IDQsCisJLnBpeGNsa19kaXZpZGVyX3JvdGF0ZWQgPSA0LAorCS5waXhjbGtfc3JjICAgICA9IENMS19TUkNfWFRBTCwKKwkuc3lzY2xrX2RpdmlkZXIgID0gMSwKKwkuc3lzY2xrX3NyYyAgICAgPSBDTEtfU1JDX1BMTCwKKwkuY3J0Y19wczFfYWN0aXZlID0gICAgICAgMHg0MTA2MDAxMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9ncGlvX3JlZ3MgZTc0MF93MTAwX2dwaW9faW5mbyA9IHsKKwkuaW5pdF9kYXRhMSA9IDB4MjEwMDIxMDMsCisJLmdwaW9fZGlyMSAgPSAweGZmZmZkZWZmLAorCS5ncGlvX29lMSAgID0gMHgwM2MwMDY0MywKKwkuaW5pdF9kYXRhMiA9IDB4MDAzZjAwM2YsCisJLmdwaW9fZGlyMiAgPSAweGZmZmZmZmZmLAorCS5ncGlvX29lMiAgID0gMHgwMDAwMDBmZiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMGZiX21hY2hfaW5mbyBlNzQwX2ZiX2luZm8gPSB7CisJLm1vZGVsaXN0ICAgPSAmZTc0MF9sY2RfbW9kZSwKKwkubnVtX21vZGVzICA9IDEsCisJLnJlZ3MgICAgICAgPSAmZTc0MF9sY2RfcmVncywKKwkuZ3BpbyAgICAgICA9ICZlNzQwX3cxMDBfZ3Bpb19pbmZvLAorCS54dGFsX2ZyZXEgPSAxNDMxODAwMCwKKwkueHRhbF9kYmwgICA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGU3NDBfZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgICAgICAgICAgPSAweDBjMDAwMDAwLAorCQkuZW5kICAgICAgICAgICAgPSAweDBjZmZmZmZmLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZTc0MF9mYl9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gIncxMDBmYiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmZTc0MF9mYl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShlNzQwX2ZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gZTc0MF9mYl9yZXNvdXJjZXMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUZQIFBpbiBjb25maWcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZTc0MF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBDaGlwIHNlbGVjdHMgKi8KKwlHUElPMTVfbkNTXzEsICAgLyogQ1MxIC0gRmxhc2ggKi8KKwlHUElPNzlfbkNTXzMsICAgLyogQ1MzIC0gSU1BR0VPTiAqLworCUdQSU84MF9uQ1NfNCwgICAvKiBDUzQgLSBUTUlPICovCisKKwkvKiBDbG9ja3MgKi8KKwlHUElPMTJfMzJLSHosCisKKwkvKiBCVFVBUlQgKi8KKwlHUElPNDJfQlRVQVJUX1JYRCwKKwlHUElPNDNfQlRVQVJUX1RYRCwKKwlHUElPNDRfQlRVQVJUX0NUUywKKwlHUElPNDVfR1BJTywgLyogVXNlZCBieSBUTUlPIGZvciAjU1VTUEVORCAqLworCisJLyogUEMgQ2FyZCAqLworCUdQSU84X0dQSU8sICAgLyogQ0QwICovCisJR1BJTzQ0X0dQSU8sICAvKiBDRDEgKi8KKwlHUElPMTFfR1BJTywgIC8qIElSUTAgKi8KKwlHUElPNl9HUElPLCAgIC8qIElSUTEgKi8KKwlHUElPMjdfR1BJTywgIC8qIFJTVDAgKi8KKwlHUElPMjRfR1BJTywgIC8qIFJTVDEgKi8KKwlHUElPMjBfR1BJTywgIC8qIFBXUjAgKi8KKwlHUElPMjNfR1BJTywgIC8qIFBXUjEgKi8KKwlHUElPNDhfblBPRSwKKwlHUElPNDlfblBXRSwKKwlHUElPNTBfblBJT1IsCisJR1BJTzUxX25QSU9XLAorCUdQSU81Ml9uUENFXzEsCisJR1BJTzUzX25QQ0VfMiwKKwlHUElPNTRfblBTS1RTRUwsCisJR1BJTzU1X25QUkVHLAorCUdQSU81Nl9uUFdBSVQsCisJR1BJTzU3X25JT0lTMTYsCisKKwkvKiB3YWtldXAgKi8KKwlHUElPMF9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmZTc0MF9mYl9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZTc0MF9pbml0KHZvaWQpCit7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoZTc0MF9waW5fY29uZmlnKSk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisJcHhhX3NldF91ZGNfaW5mbygmZTd4eF91ZGNfbWFjaF9pbmZvKTsKK30KKworTUFDSElORV9TVEFSVChFNzQwLCAiVG9zaGliYSBlNzQwIikKKwkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLworCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCisJLmZpeHVwCQk9IGVzZXJpZXNfZml4dXAsCisJLmluaXRfbWFjaGluZQk9IGU3NDBfaW5pdCwKKwkudGltZXIJCT0gJnB4YV90aW1lciwKK01BQ0hJTkVfRU5ECisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDBfbGNkLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzQwX2xjZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJkNTk5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDBfbGNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyogZTc0MF9sY2QuYwotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBMQ0QgdGltaW5ncyBhbmQgZnVuY3Rpb25zCi0gKiB0byBjb250cm9sIHRoZSBMQ0QgcG93ZXIgLyBmcm9udGxpZ2h0aW5nIHZpYSB0aGUgdzEwMGZiIGRyaXZlci4KLSAqCi0gKiAoYykgMjAwNSBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgotCi0vKgotKipwb3RlbnRpYWwqKiBzaHV0ZG93biByb3V0aW5lIC0gdG8gYmUgaW52ZXN0aWdhdGVkCi1kZXZtZW0yIDB4MGMwMTA1MjggdyAweGZmM2ZmZjAwCi1kZXZtZW0yIDB4MGMwMTAxOTAgdyAweDdGRkY4MDAwCi1kZXZtZW0yIDB4MGMwMTAxYjAgdyAweDAwRkYwMDAwCi1kZXZtZW0yIDB4MGMwMTAwOGMgdyAweDAwMDAwMDAwCi1kZXZtZW0yIDB4MGMwMTAwODAgdyAweDAwMDAwMGJmCi1kZXZtZW0yIDB4MGMwMTAwOTggdyAweDAwMDAwMDE1Ci1kZXZtZW0yIDB4MGMwMTAwODggdyAweDRiMDAwMjA0Ci1kZXZtZW0yIDB4MGMwMTAwOTggdyAweDAwMDAwMDFkCi0qLwotCi1zdGF0aWMgc3RydWN0IHcxMDBfZ2VuX3JlZ3MgZTc0MF9sY2RfcmVncyA9IHsKLQkubGNkX2Zvcm1hdCA9ICAgICAgICAgICAgMHgwMDAwODAyMywKLQkubGNkZF9jbnRsMSA9ICAgICAgICAgICAgMHgwZjAwMDAwMCwKLQkubGNkZF9jbnRsMiA9ICAgICAgICAgICAgMHgwMDAzZmZmZiwKLQkuZ2VubGNkX2NudGwxID0gICAgICAgICAgMHgwMGZmZmYwMywKLQkuZ2VubGNkX2NudGwyID0gICAgICAgICAgMHgwMDNjMGYwMywKLQkuZ2VubGNkX2NudGwzID0gICAgICAgICAgMHgwMDAxNDNhYSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdzEwMF9tb2RlIGU3NDBfbGNkX21vZGUgPSB7Ci0JLnhyZXMgICAgICAgICAgICA9IDI0MCwKLQkueXJlcyAgICAgICAgICAgID0gMzIwLAotCS5sZWZ0X21hcmdpbiAgICAgPSAyMCwKLQkucmlnaHRfbWFyZ2luICAgID0gMjgsCi0JLnVwcGVyX21hcmdpbiAgICA9IDksCi0JLmxvd2VyX21hcmdpbiAgICA9IDgsCi0JLmNydGNfc3MgICAgICAgICA9IDB4ODAxNDAwMTMsCi0JLmNydGNfbHMgICAgICAgICA9IDB4ODExNTAxMTAsCi0JLmNydGNfZ3MgICAgICAgICA9IDB4ODAwNTAwMDUsCi0JLmNydGNfdnBvc19ncyAgICA9IDB4MDAwYTAwMDksCi0JLmNydGNfcmV2ICAgICAgICA9IDB4MDA0MDAxMGEsCi0JLmNydGNfZGNsayAgICAgICA9IDB4YTkwNjAwMGEsCi0JLmNydGNfZ2NsayAgICAgICA9IDB4ODAwNTAxMDgsCi0JLmNydGNfZ29lICAgICAgICA9IDB4ODAwNTAxMDgsCi0JLnBsbF9mcmVxICAgICAgICA9IDU3LAotCS5waXhjbGtfZGl2aWRlciAgICAgICAgID0gNCwKLQkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDQsCi0JLnBpeGNsa19zcmMgICAgID0gQ0xLX1NSQ19YVEFMLAotCS5zeXNjbGtfZGl2aWRlciAgPSAxLAotCS5zeXNjbGtfc3JjICAgICA9IENMS19TUkNfUExMLAotCS5jcnRjX3BzMV9hY3RpdmUgPSAgICAgICAweDQxMDYwMDEwLAotfTsKLQotCi1zdGF0aWMgc3RydWN0IHcxMDBfZ3Bpb19yZWdzIGU3NDBfdzEwMF9ncGlvX2luZm8gPSB7Ci0JLmluaXRfZGF0YTEgPSAweDIxMDAyMTAzLAotCS5ncGlvX2RpcjEgID0gMHhmZmZmZGVmZiwKLQkuZ3Bpb19vZTEgICA9IDB4MDNjMDA2NDMsCi0JLmluaXRfZGF0YTIgPSAweDAwM2YwMDNmLAotCS5ncGlvX2RpcjIgID0gMHhmZmZmZmZmZiwKLQkuZ3Bpb19vZTIgICA9IDB4MDAwMDAwZmYsCi19OwotCi1zdGF0aWMgc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gZTc0MF9mYl9pbmZvID0gewotCS5tb2RlbGlzdCAgID0gJmU3NDBfbGNkX21vZGUsCi0JLm51bV9tb2RlcyAgPSAxLAotCS5yZWdzICAgICAgID0gJmU3NDBfbGNkX3JlZ3MsCi0JLmdwaW8gICAgICAgPSAmZTc0MF93MTAwX2dwaW9faW5mbywKLQkueHRhbF9mcmVxID0gMTQzMTgwMDAsCi0JLnh0YWxfZGJsICAgPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlNzQwX2ZiX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gMHgwYzAwMDAwMCwKLQkJLmVuZCAgICAgICAgICAgID0gMHgwY2ZmZmZmZiwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlNzQwX2ZiX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAidzEwMGZiIiwKLQkuaWQgICAgICAgICAgICAgPSAtMSwKLQkuZGV2ICAgICAgICAgICAgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhICA9ICZlNzQwX2ZiX2luZm8sCi0JfSwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGU3NDBfZmJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBlNzQwX2ZiX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBpbnQgZTc0MF9sY2RfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAoIW1hY2hpbmVfaXNfZTc0MCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmU3NDBfZmJfZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoZTc0MF9sY2RfaW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIklhbiBNb2x0b24gPHNweXJvQGYycy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImU3NDAgbGNkIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwZTczOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciB0aGUgVG9zaGliYSBlc2VyaWVzIFBEQXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3VkYy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgImVzZXJpZXMuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFNzUwIExDRCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHcxMDBfZ2VuX3JlZ3MgZTc1MF9sY2RfcmVncyA9IHsKKwkubGNkX2Zvcm1hdCA9ICAgICAgICAgICAgMHgwMDAwODAwMywKKwkubGNkZF9jbnRsMSA9ICAgICAgICAgICAgMHgwMDAwMDAwMCwKKwkubGNkZF9jbnRsMiA9ICAgICAgICAgICAgMHgwMDAzZmZmZiwKKwkuZ2VubGNkX2NudGwxID0gICAgICAgICAgMHgwMGZmZjAwMywKKwkuZ2VubGNkX2NudGwyID0gICAgICAgICAgMHgwMDNjMGYwMywKKwkuZ2VubGNkX2NudGwzID0gICAgICAgICAgMHgwMDAxNDNhYSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF9tb2RlIGU3NTBfbGNkX21vZGUgPSB7CisJLnhyZXMgICAgICAgICAgICA9IDI0MCwKKwkueXJlcyAgICAgICAgICAgID0gMzIwLAorCS5sZWZ0X21hcmdpbiAgICAgPSAyMSwKKwkucmlnaHRfbWFyZ2luICAgID0gMjIsCisJLnVwcGVyX21hcmdpbiAgICA9IDUsCisJLmxvd2VyX21hcmdpbiAgICA9IDQsCisJLmNydGNfc3MgICAgICAgICA9IDB4ODAxNTAwMTQsCisJLmNydGNfbHMgICAgICAgICA9IDB4ODAxNDAwMGQsCisJLmNydGNfZ3MgICAgICAgICA9IDB4YzEwMDAwMDUsCisJLmNydGNfdnBvc19ncyAgICA9IDB4MDAwMjAxNDcsCisJLmNydGNfcmV2ICAgICAgICA9IDB4MDA0MDAxMGEsCisJLmNydGNfZGNsayAgICAgICA9IDB4YTE3MDAwMzAsCisJLmNydGNfZ2NsayAgICAgICA9IDB4ODBjYzAwMTUsCisJLmNydGNfZ29lICAgICAgICA9IDB4ODBjYzAwMTUsCisJLmNydGNfcHMxX2FjdGl2ZSA9IDB4NjEwNjAwMTcsCisJLnBsbF9mcmVxICAgICAgICA9IDU3LAorCS5waXhjbGtfZGl2aWRlciAgICAgICAgID0gNCwKKwkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDQsCisJLnBpeGNsa19zcmMgICAgID0gQ0xLX1NSQ19YVEFMLAorCS5zeXNjbGtfZGl2aWRlciAgPSAxLAorCS5zeXNjbGtfc3JjICAgICA9IENMS19TUkNfUExMLAorfTsKKworc3RhdGljIHN0cnVjdCB3MTAwX2dwaW9fcmVncyBlNzUwX3cxMDBfZ3Bpb19pbmZvID0geworCS5pbml0X2RhdGExID0gMHgwMTE5MmYxYiwKKwkuZ3Bpb19kaXIxICA9IDB4ZDVmZmRlZmYsCisJLmdwaW9fb2UxICAgPSAweDAwMDAyMGJmLAorCS5pbml0X2RhdGEyID0gMHgwMTBmMDEwZiwKKwkuZ3Bpb19kaXIyICA9IDB4ZmZmZmZmZmYsCisJLmdwaW9fb2UyICAgPSAweDAwMDAwMWNmLAorfTsKKworc3RhdGljIHN0cnVjdCB3MTAwZmJfbWFjaF9pbmZvIGU3NTBfZmJfaW5mbyA9IHsKKwkubW9kZWxpc3QgICA9ICZlNzUwX2xjZF9tb2RlLAorCS5udW1fbW9kZXMgID0gMSwKKwkucmVncyAgICAgICA9ICZlNzUwX2xjZF9yZWdzLAorCS5ncGlvICAgICAgID0gJmU3NTBfdzEwMF9ncGlvX2luZm8sCisJLnh0YWxfZnJlcSAgPSAxNDMxODAwMCwKKwkueHRhbF9kYmwgICA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGU3NTBfZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgICAgICAgICAgPSAweDBjMDAwMDAwLAorCQkuZW5kICAgICAgICAgICAgPSAweDBjZmZmZmZmLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZTc1MF9mYl9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gIncxMDBmYiIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmZTc1MF9mYl9pbmZvLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShlNzUwX2ZiX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gZTc1MF9mYl9yZXNvdXJjZXMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmU3NTBfZmJfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGU3NTBfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCXB4YV9zZXRfdWRjX2luZm8oJmU3eHhfdWRjX21hY2hfaW5mbyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoRTc1MCwgIlRvc2hpYmEgZTc1MCIpCisJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAorCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAorCS5pbml0X21hY2hpbmUJPSBlNzUwX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwX2xjZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MF9sY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlZGMzYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwX2xjZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIGU3NTBfbGNkLmMKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgTENEIHRpbWluZ3MgYW5kIGZ1bmN0aW9ucwotICogdG8gY29udHJvbCB0aGUgTENEIHBvd2VyIC8gZnJvbnRsaWdodGluZyB2aWEgdGhlIHcxMDBmYiBkcml2ZXIuCi0gKgotICogKGMpIDIwMDUgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KLQotc3RhdGljIHN0cnVjdCB3MTAwX2dlbl9yZWdzIGU3NTBfbGNkX3JlZ3MgPSB7Ci0JLmxjZF9mb3JtYXQgPSAgICAgICAgICAgIDB4MDAwMDgwMDMsCi0JLmxjZGRfY250bDEgPSAgICAgICAgICAgIDB4MDAwMDAwMDAsCi0JLmxjZGRfY250bDIgPSAgICAgICAgICAgIDB4MDAwM2ZmZmYsCi0JLmdlbmxjZF9jbnRsMSA9ICAgICAgICAgIDB4MDBmZmYwMDMsCi0JLmdlbmxjZF9jbnRsMiA9ICAgICAgICAgIDB4MDAzYzBmMDMsCi0JLmdlbmxjZF9jbnRsMyA9ICAgICAgICAgIDB4MDAwMTQzYWEsCi19OwotCi1zdGF0aWMgc3RydWN0IHcxMDBfbW9kZSBlNzUwX2xjZF9tb2RlID0gewotCS54cmVzICAgICAgICAgICAgPSAyNDAsCi0JLnlyZXMgICAgICAgICAgICA9IDMyMCwKLQkubGVmdF9tYXJnaW4gICAgID0gMjEsCi0JLnJpZ2h0X21hcmdpbiAgICA9IDIyLAotCS51cHBlcl9tYXJnaW4gICAgPSA1LAotCS5sb3dlcl9tYXJnaW4gICAgPSA0LAotCS5jcnRjX3NzICAgICAgICAgPSAweDgwMTUwMDE0LAotCS5jcnRjX2xzICAgICAgICAgPSAweDgwMTQwMDBkLAotCS5jcnRjX2dzICAgICAgICAgPSAweGMxMDAwMDA1LAotCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAwMDIwMTQ3LAotCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMTBhLAotCS5jcnRjX2RjbGsgICAgICAgPSAweGExNzAwMDMwLAotCS5jcnRjX2djbGsgICAgICAgPSAweDgwY2MwMDE1LAotCS5jcnRjX2dvZSAgICAgICAgPSAweDgwY2MwMDE1LAotCS5jcnRjX3BzMV9hY3RpdmUgPSAweDYxMDYwMDE3LAotCS5wbGxfZnJlcSAgICAgICAgPSA1NywKLQkucGl4Y2xrX2RpdmlkZXIgICAgICAgICA9IDQsCi0JLnBpeGNsa19kaXZpZGVyX3JvdGF0ZWQgPSA0LAotCS5waXhjbGtfc3JjICAgICA9IENMS19TUkNfWFRBTCwKLQkuc3lzY2xrX2RpdmlkZXIgID0gMSwKLQkuc3lzY2xrX3NyYyAgICAgPSBDTEtfU1JDX1BMTCwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCB3MTAwX2dwaW9fcmVncyBlNzUwX3cxMDBfZ3Bpb19pbmZvID0gewotCS5pbml0X2RhdGExID0gMHgwMTE5MmYxYiwKLQkuZ3Bpb19kaXIxICA9IDB4ZDVmZmRlZmYsCi0JLmdwaW9fb2UxICAgPSAweDAwMDAyMGJmLAotCS5pbml0X2RhdGEyID0gMHgwMTBmMDEwZiwKLQkuZ3Bpb19kaXIyICA9IDB4ZmZmZmZmZmYsCi0JLmdwaW9fb2UyICAgPSAweDAwMDAwMWNmLAotfTsKLQotc3RhdGljIHN0cnVjdCB3MTAwZmJfbWFjaF9pbmZvIGU3NTBfZmJfaW5mbyA9IHsKLQkubW9kZWxpc3QgICA9ICZlNzUwX2xjZF9tb2RlLAotCS5udW1fbW9kZXMgID0gMSwKLQkucmVncyAgICAgICA9ICZlNzUwX2xjZF9yZWdzLAotCS5ncGlvICAgICAgID0gJmU3NTBfdzEwMF9ncGlvX2luZm8sCi0JLnh0YWxfZnJlcSAgPSAxNDMxODAwMCwKLQkueHRhbF9kYmwgICA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGU3NTBfZmJfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSAweDBjMDAwMDAwLAotCQkuZW5kICAgICAgICAgICAgPSAweDBjZmZmZmZmLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGU3NTBfZmJfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJ3MTAwZmIiLAotCS5pZCAgICAgICAgICAgICA9IC0xLAotCS5kZXYgICAgICAgICAgICA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgID0gJmU3NTBfZmJfaW5mbywKLQl9LAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoZTc1MF9mYl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGU3NTBfZmJfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIGludCBlNzUwX2xjZF9pbml0KHZvaWQpCi17Ci0JaWYgKCFtYWNoaW5lX2lzX2U3NTAoKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlNzUwX2ZiX2RldmljZSk7Ci19Ci0KLW1vZHVsZV9pbml0KGU3NTBfbGNkX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJlNzUwIGxjZCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEx2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgdGhlIFRvc2hpYmEgZXNlcmllcyBQREFzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3VkYy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorI2luY2x1ZGUgImVzZXJpZXMuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGU4MDAgTENEIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB3MTAwX2dlbl9yZWdzIGU4MDBfbGNkX3JlZ3MgPSB7CisJLmxjZF9mb3JtYXQgPSAgICAgICAgICAgIDB4MDAwMDgwMDMsCisJLmxjZGRfY250bDEgPSAgICAgICAgICAgIDB4MDJhMDAwMDAsCisJLmxjZGRfY250bDIgPSAgICAgICAgICAgIDB4MDAwM2ZmZmYsCisJLmdlbmxjZF9jbnRsMSA9ICAgICAgICAgIDB4MDAwZmYyYTMsCisJLmdlbmxjZF9jbnRsMiA9ICAgICAgICAgIDB4MDAwMDAyYTMsCisJLmdlbmxjZF9jbnRsMyA9ICAgICAgICAgIDB4MDAwMTAyYWEsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBfbW9kZSBlODAwX2xjZF9tb2RlWzJdID0geworCVswXSA9IHsKKwkJLnhyZXMgICAgICAgICAgICA9IDQ4MCwKKwkJLnlyZXMgICAgICAgICAgICA9IDY0MCwKKwkJLmxlZnRfbWFyZ2luICAgICA9IDUyLAorCQkucmlnaHRfbWFyZ2luICAgID0gMTQ4LAorCQkudXBwZXJfbWFyZ2luICAgID0gMiwKKwkJLmxvd2VyX21hcmdpbiAgICA9IDYsCisJCS5jcnRjX3NzICAgICAgICAgPSAweDgwMzUwMDM0LAorCQkuY3J0Y19scyAgICAgICAgID0gMHg4MDJiMDAyNiwKKwkJLmNydGNfZ3MgICAgICAgICA9IDB4ODAxNjAwMTYsCisJCS5jcnRjX3Zwb3NfZ3MgICAgPSAweDAwMDIwMDAzLAorCQkuY3J0Y19yZXYgICAgICAgID0gMHgwMDQwMDAxZCwKKwkJLmNydGNfZGNsayAgICAgICA9IDB4ZTAwMDAwMDAsCisJCS5jcnRjX2djbGsgICAgICAgPSAweDgyYTUwMDQ5LAorCQkuY3J0Y19nb2UgICAgICAgID0gMHg4MGVlMDAxYywKKwkJLmNydGNfcHMxX2FjdGl2ZSA9IDB4MDAwMDAwMDAsCisJCS5wbGxfZnJlcSAgICAgICAgPSAxMjgsCisJCS5waXhjbGtfZGl2aWRlciAgICAgICAgID0gNCwKKwkJLnBpeGNsa19kaXZpZGVyX3JvdGF0ZWQgPSA2LAorCQkucGl4Y2xrX3NyYyAgICAgPSBDTEtfU1JDX1BMTCwKKwkJLnN5c2Nsa19kaXZpZGVyICA9IDAsCisJCS5zeXNjbGtfc3JjICAgICA9IENMS19TUkNfUExMLAorCX0sCisJWzFdID0geworCQkueHJlcyAgICAgICAgICAgID0gMjQwLAorCQkueXJlcyAgICAgICAgICAgID0gMzIwLAorCQkubGVmdF9tYXJnaW4gICAgID0gMTUsCisJCS5yaWdodF9tYXJnaW4gICAgPSA4OCwKKwkJLnVwcGVyX21hcmdpbiAgICA9IDAsCisJCS5sb3dlcl9tYXJnaW4gICAgPSA3LAorCQkuY3J0Y19zcyAgICAgICAgID0gMHhkMDEwMDAwZiwKKwkJLmNydGNfbHMgICAgICAgICA9IDB4ODAwNzAwMDMsCisJCS5jcnRjX2dzICAgICAgICAgPSAweDgwMDAwMDAwLAorCQkuY3J0Y192cG9zX2dzICAgID0gMHgwMTQ2MDE0NywKKwkJLmNydGNfcmV2ICAgICAgICA9IDB4MDA0MDAwMDMsCisJCS5jcnRjX2RjbGsgICAgICAgPSAweGExNzAwMDMwLAorCQkuY3J0Y19nY2xrICAgICAgID0gMHg4MTRiMDAwOCwKKwkJLmNydGNfZ29lICAgICAgICA9IDB4ODBjYzAwMTUsCisJCS5jcnRjX3BzMV9hY3RpdmUgPSAweDAwMDAwMDAwLAorCQkucGxsX2ZyZXEgICAgICAgID0gMTAwLAorCQkucGl4Y2xrX2RpdmlkZXIgICAgICAgICA9IDYsIC8qIFdpbmNlIHVzZXMgMTQgd2hpY2ggZ2l2ZXMgYSAqLworCQkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDYsIC8qIDdNSHogUGNsay4gV2UgdXNlIGEgMTRNSHogb25lICovCisJCS5waXhjbGtfc3JjICAgICA9IENMS19TUkNfUExMLAorCQkuc3lzY2xrX2RpdmlkZXIgID0gMCwKKwkJLnN5c2Nsa19zcmMgICAgID0gQ0xLX1NSQ19QTEwsCisJfQorfTsKKworCitzdGF0aWMgc3RydWN0IHcxMDBfZ3Bpb19yZWdzIGU4MDBfdzEwMF9ncGlvX2luZm8gPSB7CisJLmluaXRfZGF0YTEgPSAweGMxM2ZjMDE5LAorCS5ncGlvX2RpcjEgID0gMHgzZTQwZGY3ZiwKKwkuZ3Bpb19vZTEgICA9IDB4MDAzYzMwMDAsCisJLmluaXRfZGF0YTIgPSAweDAwMDAwMDAwLAorCS5ncGlvX2RpcjIgID0gMHgwMDAwMDAwMCwKKwkuZ3Bpb19vZTIgICA9IDB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBfbWVtX2luZm8gZTgwMF93MTAwX21lbV9pbmZvID0geworCS5leHRfY250bCAgICAgICAgPSAweDA5NjQwMDExLAorCS5zZHJhbV9tb2RlX3JlZyAgPSAweDAwNjAwMDIxLAorCS5leHRfdGltaW5nX2NudGwgPSAweDEwMDAxNTQ1LAorCS5pb19jbnRsICAgICAgICAgPSAweDdkZGQ3MzMzLAorCS5zaXplICAgICAgICAgICAgPSAweDFmZmZmZiwKK307CisKK3N0YXRpYyB2b2lkIGU4MDBfdGdfY2hhbmdlKHN0cnVjdCB3MTAwZmJfcGFyICpwYXIpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwl0bXAgPSB3MTAwZmJfZ3Bpb19yZWFkKFcxMDBfR1BJT19QT1JUX0EpOworCWlmIChwYXItPm1vZGUtPnhyZXMgPT0gNDgwKQorCQl0bXAgfD0gMHgxMDA7CisJZWxzZQorCQl0bXAgJj0gfjB4MTAwOworCXcxMDBmYl9ncGlvX3dyaXRlKFcxMDBfR1BJT19QT1JUX0EsIHRtcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzEwMF90Z19pbmZvIGU4MDBfdGdfaW5mbyA9IHsKKwkuY2hhbmdlID0gZTgwMF90Z19jaGFuZ2UsCit9OworCitzdGF0aWMgc3RydWN0IHcxMDBmYl9tYWNoX2luZm8gZTgwMF9mYl9pbmZvID0geworCS5tb2RlbGlzdCAgID0gZTgwMF9sY2RfbW9kZSwKKwkubnVtX21vZGVzICA9IDIsCisJLnJlZ3MgICAgICAgPSAmZTgwMF9sY2RfcmVncywKKwkuZ3BpbyAgICAgICA9ICZlODAwX3cxMDBfZ3Bpb19pbmZvLAorCS5tZW0gICAgICAgID0gJmU4MDBfdzEwMF9tZW1faW5mbywKKwkudGcgICAgICAgICA9ICZlODAwX3RnX2luZm8sCisJLnh0YWxfZnJlcSAgPSAxNjAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZTgwMF9mYl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgICAgICAgICA9IDB4MGMwMDAwMDAsCisJCS5lbmQgICAgICAgICAgICA9IDB4MGNmZmZmZmYsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlODAwX2ZiX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAidzEwMGZiIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZlODAwX2ZiX2luZm8sCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGU4MDBfZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBlODAwX2ZiX3Jlc291cmNlcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVREMgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gZTgwMF91ZGNfbWFjaF9pbmZvID0geworCS5ncGlvX3ZidXMgICA9IEdQSU9fRTgwMF9VU0JfRElTQywKKwkuZ3Bpb19wdWxsdXAgPSBHUElPX0U4MDBfVVNCX1BVTExVUCwKKwkuZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQgPSAxCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmU4MDBfZmJfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGU4MDBfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCXB4YV9zZXRfdWRjX2luZm8oJmU4MDBfdWRjX21hY2hfaW5mbyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoRTgwMCwgIlRvc2hpYmEgZTgwMCIpCisJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAorCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAorCS5pbml0X21hY2hpbmUJPSBlODAwX2luaXQsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lODAwX2xjZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTgwMF9sY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZWFiMGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZTgwMF9sY2QuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKiBlODAwX2xjZC5jCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIExDRCB0aW1pbmdzIGFuZCBmdW5jdGlvbnMKLSAqIHRvIGNvbnRyb2wgdGhlIExDRCBwb3dlciAvIGZyb250bGlnaHRpbmcgdmlhIHRoZSB3MTAwZmIgZHJpdmVyLgotICoKLSAqIChjKSAyMDA1IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8dmlkZW8vdzEwMGZiLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgdzEwMF9nZW5fcmVncyBlODAwX2xjZF9yZWdzID0gewotCS5sY2RfZm9ybWF0ID0gICAgICAgICAgICAweDAwMDA4MDAzLAotCS5sY2RkX2NudGwxID0gICAgICAgICAgICAweDAyYTAwMDAwLAotCS5sY2RkX2NudGwyID0gICAgICAgICAgICAweDAwMDNmZmZmLAotCS5nZW5sY2RfY250bDEgPSAgICAgICAgICAweDAwMGZmMmEzLAotCS5nZW5sY2RfY250bDIgPSAgICAgICAgICAweDAwMDAwMmEzLAotCS5nZW5sY2RfY250bDMgPSAgICAgICAgICAweDAwMDEwMmFhLAotfTsKLQotc3RhdGljIHN0cnVjdCB3MTAwX21vZGUgZTgwMF9sY2RfbW9kZVsyXSA9IHsKLQlbMF0gPSB7Ci0JCS54cmVzICAgICAgICAgICAgPSA0ODAsCi0JCS55cmVzICAgICAgICAgICAgPSA2NDAsCi0JCS5sZWZ0X21hcmdpbiAgICAgPSA1MiwKLQkJLnJpZ2h0X21hcmdpbiAgICA9IDE0OCwKLQkJLnVwcGVyX21hcmdpbiAgICA9IDIsCi0JCS5sb3dlcl9tYXJnaW4gICAgPSA2LAotCQkuY3J0Y19zcyAgICAgICAgID0gMHg4MDM1MDAzNCwKLQkJLmNydGNfbHMgICAgICAgICA9IDB4ODAyYjAwMjYsCi0JCS5jcnRjX2dzICAgICAgICAgPSAweDgwMTYwMDE2LAotCQkuY3J0Y192cG9zX2dzICAgID0gMHgwMDAyMDAwMywKLQkJLmNydGNfcmV2ICAgICAgICA9IDB4MDA0MDAwMWQsCi0JCS5jcnRjX2RjbGsgICAgICAgPSAweGUwMDAwMDAwLAotCQkuY3J0Y19nY2xrICAgICAgID0gMHg4MmE1MDA0OSwKLQkJLmNydGNfZ29lICAgICAgICA9IDB4ODBlZTAwMWMsCi0JCS5jcnRjX3BzMV9hY3RpdmUgPSAweDAwMDAwMDAwLAotCQkucGxsX2ZyZXEgICAgICAgID0gMTI4LAotCQkucGl4Y2xrX2RpdmlkZXIgICAgICAgICA9IDQsCi0JCS5waXhjbGtfZGl2aWRlcl9yb3RhdGVkID0gNiwKLQkJLnBpeGNsa19zcmMgICAgID0gQ0xLX1NSQ19QTEwsCi0JCS5zeXNjbGtfZGl2aWRlciAgPSAwLAotCQkuc3lzY2xrX3NyYyAgICAgPSBDTEtfU1JDX1BMTCwKLQl9LAotCVsxXSA9IHsKLQkJLnhyZXMgICAgICAgICAgICA9IDI0MCwKLQkJLnlyZXMgICAgICAgICAgICA9IDMyMCwKLQkJLmxlZnRfbWFyZ2luICAgICA9IDE1LAotCQkucmlnaHRfbWFyZ2luICAgID0gODgsCi0JCS51cHBlcl9tYXJnaW4gICAgPSAwLAotCQkubG93ZXJfbWFyZ2luICAgID0gNywKLQkJLmNydGNfc3MgICAgICAgICA9IDB4ZDAxMDAwMGYsCi0JCS5jcnRjX2xzICAgICAgICAgPSAweDgwMDcwMDAzLAotCQkuY3J0Y19ncyAgICAgICAgID0gMHg4MDAwMDAwMCwKLQkJLmNydGNfdnBvc19ncyAgICA9IDB4MDE0NjAxNDcsCi0JCS5jcnRjX3JldiAgICAgICAgPSAweDAwNDAwMDAzLAotCQkuY3J0Y19kY2xrICAgICAgID0gMHhhMTcwMDAzMCwKLQkJLmNydGNfZ2NsayAgICAgICA9IDB4ODE0YjAwMDgsCi0JCS5jcnRjX2dvZSAgICAgICAgPSAweDgwY2MwMDE1LAotCQkuY3J0Y19wczFfYWN0aXZlID0gMHgwMDAwMDAwMCwKLQkJLnBsbF9mcmVxICAgICAgICA9IDEwMCwKLQkJLnBpeGNsa19kaXZpZGVyICAgICAgICAgPSA2LCAvKiBXaW5jZSB1c2VzIDE0IHdoaWNoIGdpdmVzIGEgN01IeiBwY2xrLiAqLwotCQkucGl4Y2xrX2RpdmlkZXJfcm90YXRlZCA9IDYsIC8qIHdlIHdhbnQgYSAxNE1IeiBvbmUgKG11Y2ggbmljZXIgdG8gbG9vayBhdCkgKi8KLQkJLnBpeGNsa19zcmMgICAgID0gQ0xLX1NSQ19QTEwsCi0JCS5zeXNjbGtfZGl2aWRlciAgPSAwLAotCQkuc3lzY2xrX3NyYyAgICAgPSBDTEtfU1JDX1BMTCwKLQl9Ci19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdzEwMF9ncGlvX3JlZ3MgZTgwMF93MTAwX2dwaW9faW5mbyA9IHsKLQkuaW5pdF9kYXRhMSA9IDB4YzEzZmMwMTksCi0JLmdwaW9fZGlyMSAgPSAweDNlNDBkZjdmLAotCS5ncGlvX29lMSAgID0gMHgwMDNjMzAwMCwKLQkuaW5pdF9kYXRhMiA9IDB4MDAwMDAwMDAsCi0JLmdwaW9fZGlyMiAgPSAweDAwMDAwMDAwLAotCS5ncGlvX29lMiAgID0gMHgwMDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdzEwMF9tZW1faW5mbyBlODAwX3cxMDBfbWVtX2luZm8gPSB7Ci0JLmV4dF9jbnRsICAgICAgICA9IDB4MDk2NDAwMTEsCi0JLnNkcmFtX21vZGVfcmVnICA9IDB4MDA2MDAwMjEsCi0JLmV4dF90aW1pbmdfY250bCA9IDB4MTAwMDE1NDUsCi0JLmlvX2NudGwgICAgICAgICA9IDB4N2RkZDczMzMsCi0JLnNpemUgICAgICAgICAgICA9IDB4MWZmZmZmLAotfTsKLQotc3RhdGljIHZvaWQgZTgwMF90Z19jaGFuZ2Uoc3RydWN0IHcxMDBmYl9wYXIgKnBhcikKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCXRtcCA9IHcxMDBmYl9ncGlvX3JlYWQoVzEwMF9HUElPX1BPUlRfQSk7Ci0JaWYgKHBhci0+bW9kZS0+eHJlcyA9PSA0ODApCi0JCXRtcCB8PSAweDEwMDsKLQllbHNlCi0JCXRtcCAmPSB+MHgxMDA7Ci0JdzEwMGZiX2dwaW9fd3JpdGUoVzEwMF9HUElPX1BPUlRfQSwgdG1wKTsKLX0KLQotc3RhdGljIHN0cnVjdCB3MTAwX3RnX2luZm8gZTgwMF90Z19pbmZvID0gewotCS5jaGFuZ2UgPSBlODAwX3RnX2NoYW5nZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdzEwMGZiX21hY2hfaW5mbyBlODAwX2ZiX2luZm8gPSB7Ci0JLm1vZGVsaXN0ICAgPSBlODAwX2xjZF9tb2RlLAotCS5udW1fbW9kZXMgID0gMiwKLQkucmVncyAgICAgICA9ICZlODAwX2xjZF9yZWdzLAotCS5ncGlvICAgICAgID0gJmU4MDBfdzEwMF9ncGlvX2luZm8sCi0JLm1lbSAgICAgICAgPSAmZTgwMF93MTAwX21lbV9pbmZvLAotCS50ZyAgICAgICAgID0gJmU4MDBfdGdfaW5mbywKLQkueHRhbF9mcmVxICA9IDE2MDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlODAwX2ZiX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gMHgwYzAwMDAwMCwKLQkJLmVuZCAgICAgICAgICAgID0gMHgwY2ZmZmZmZiwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlODAwX2ZiX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAidzEwMGZiIiwKLQkuaWQgICAgICAgICAgICAgPSAtMSwKLQkuZGV2ICAgICAgICAgICAgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhICA9ICZlODAwX2ZiX2luZm8sCi0JfSwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGU4MDBfZmJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBlODAwX2ZiX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBpbnQgZTgwMF9sY2RfaW5pdCh2b2lkKQotewotCWlmICghbWFjaGluZV9pc19lODAwKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZTgwMF9mYl9kZXZpY2UpOwotfQotCi1tb2R1bGVfaW5pdChlODAwX2xjZF9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiZTgwMCBsY2QgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYwppbmRleCA3YTBhNjgxLi5mNWVkODAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jCkBAIC0zNzMsMTAgKzM3Myw2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQogc3RhdGljIGludCBlbV94MjcwX29oY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JLyogU2V0IHRoZSBQb3dlciBDb250cm9sIFBvbGFyaXR5IExvdyAqLwotCVVIQ0hSID0gKFVIQ0hSIHwgVUhDSFJfUENQTCkgJgotCQl+KFVIQ0hSX1NTRVAxIHwgVUhDSFJfU1NFUDIgfCBVSENIUl9TU0UpOwotCiAJLyogZW5hYmxlIHBvcnQgMiB0cmFuc2lldmVyICovCiAJVVAyT0NSID0gVVAyT0NSX0hYUyB8IFVQMk9DUl9IWE9FOwogCkBAIC0zODUsNiArMzgxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgZW1feDI3MF9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLnBvcnRfbW9kZQk9IFBNTV9QRVJQT1JUX01PREUsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUMSB8IEVOQUJMRV9QT1JUMiB8IFBPV0VSX0NPTlRST0xfTE9XLAogCS5pbml0CQk9IGVtX3gyNzBfb2hjaV9pbml0LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCmluZGV4IDAwMWEyNTIuLmQyODg0OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKQEAgLTE5LDY4ICsxOSwxMyBAQAogCiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC91ZGMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZTc0MF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKLQkvKiBDaGlwIHNlbGVjdHMgKi8KLQlHUElPMTVfbkNTXzEsICAgLyogQ1MxIC0gRmxhc2ggKi8KLQlHUElPNzlfbkNTXzMsICAgLyogQ1MzIC0gSU1BR0VPTiAqLwotCUdQSU84MF9uQ1NfNCwgICAvKiBDUzQgLSBUTUlPICovCi0KLQkvKiBDbG9ja3MgKi8KLQlHUElPMTJfMzJLSHosCi0KLQkvKiBCVFVBUlQgKi8KLQlHUElPNDJfQlRVQVJUX1JYRCwKLQlHUElPNDNfQlRVQVJUX1RYRCwKLQlHUElPNDRfQlRVQVJUX0NUUywKLQlHUElPNDVfR1BJTywgLyogVXNlZCBieSBUTUlPIGZvciAjU1VTUEVORCAqLwotCi0JLyogUEMgQ2FyZCAqLwotCUdQSU84X0dQSU8sICAgLyogQ0QwICovCi0JR1BJTzQ0X0dQSU8sICAvKiBDRDEgKi8KLQlHUElPMTFfR1BJTywgIC8qIElSUTAgKi8KLQlHUElPNl9HUElPLCAgIC8qIElSUTEgKi8KLQlHUElPMjdfR1BJTywgIC8qIFJTVDAgKi8KLQlHUElPMjRfR1BJTywgIC8qIFJTVDEgKi8KLQlHUElPMjBfR1BJTywgIC8qIFBXUjAgKi8KLQlHUElPMjNfR1BJTywgIC8qIFBXUjEgKi8KLQlHUElPNDhfblBPRSwKLQlHUElPNDlfblBXRSwKLQlHUElPNTBfblBJT1IsCi0JR1BJTzUxX25QSU9XLAotCUdQSU81Ml9uUENFXzEsCi0JR1BJTzUzX25QQ0VfMiwKLQlHUElPNTRfblBTS1RTRUwsCi0JR1BJTzU1X25QUkVHLAotCUdQSU81Nl9uUFdBSVQsCi0JR1BJTzU3X25JT0lTMTYsCi0KLQkvKiB3YWtldXAgKi8KLQlHUElPMF9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGU0MDBfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JLyogQ2hpcCBzZWxlY3RzICovCi0JR1BJTzE1X25DU18xLCAgIC8qIENTMSAtIEZsYXNoICovCi0JR1BJTzgwX25DU180LCAgIC8qIENTNCAtIFRNSU8gKi8KLQotCS8qIENsb2NrcyAqLwotCUdQSU8xMl8zMktIeiwKLQotCS8qIEJUVUFSVCAqLwotCUdQSU80Ml9CVFVBUlRfUlhELAotCUdQSU80M19CVFVBUlRfVFhELAotCUdQSU80NF9CVFVBUlRfQ1RTLAotCUdQSU80NV9HUElPLCAvKiBVc2VkIGJ5IFRNSU8gZm9yICNTVVNQRU5EICovCi0KLQkvKiB3YWtldXAgKi8KLQlHUElPMF9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwKLX07Ci0KIC8qIE9ubHkgZTgwMCBoYXMgMTI4TUIgUkFNICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZXNlcmllc19maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLAordm9pZCBfX2luaXQgZXNlcmllc19maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLAogCXN0cnVjdCB0YWcgKnRhZ3MsIGNoYXIgKipjbWRsaW5lLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCiB7CiAJbWktPm5yX2JhbmtzPTE7CkBAIC05Miw5NSArMzcsOSBAQAogCQltaS0+YmFua1swXS5zaXplID0gKDY0KjEwMjQqMTAyNCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlNzQwX2luaXQodm9pZCkKLXsKLQlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlNzQwX3Bpbl9jb25maWcpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGU0MDBfaW5pdCh2b2lkKQotewotCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGU0MDBfcGluX2NvbmZpZykpOwotfQotCi0vKiBlLXNlcmllcyBtYWNoaW5lIGRlZmluaXRpb25zICovCi0KLSNpZmRlZiBDT05GSUdfTUFDSF9FMzMwCi1NQUNISU5FX1NUQVJUKEUzMzAsICJUb3NoaWJhIGUzMzAiKQotCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCi0JLnBoeXNfaW8JPSAweDQwMDAwMDAwLAotCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBweGFfbWFwX2lvLAotCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKLQkuZml4dXAJCT0gZXNlcmllc19maXh1cCwKLQkudGltZXIJCT0gJnB4YV90aW1lciwKLU1BQ0hJTkVfRU5ECi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NQUNIX0UzNTAKLU1BQ0hJTkVfU1RBUlQoRTM1MCwgIlRvc2hpYmEgZTM1MCIpCi0JLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkucGh5c19pbwk9IDB4NDAwMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKLQkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAotCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAotCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotTUFDSElORV9FTkQKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01BQ0hfRTc0MAotTUFDSElORV9TVEFSVChFNzQwLCAiVG9zaGliYSBlNzQwIikKLQkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAotCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKLQkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCi0JLmZpeHVwCQk9IGVzZXJpZXNfZml4dXAsCi0JLmluaXRfbWFjaGluZQk9IGU3NDBfaW5pdCwKLQkudGltZXIJCT0gJnB4YV90aW1lciwKLU1BQ0hJTkVfRU5ECi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NQUNIX0U3NTAKLU1BQ0hJTkVfU1RBUlQoRTc1MCwgIlRvc2hpYmEgZTc1MCIpCi0JLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkucGh5c19pbwk9IDB4NDAwMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKLQkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAotCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAotCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotTUFDSElORV9FTkQKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01BQ0hfRTQwMAotTUFDSElORV9TVEFSVChFNDAwLCAiVG9zaGliYSBlNDAwIikKLQkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKLQkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAotCS5tYXBfaW8JCT0gcHhhX21hcF9pbywKLQkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCi0JLmZpeHVwCQk9IGVzZXJpZXNfZml4dXAsCi0JLmluaXRfbWFjaGluZQk9IGU0MDBfaW5pdCwKLQkudGltZXIJCT0gJnB4YV90aW1lciwKLU1BQ0hJTkVfRU5ECi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NQUNIX0U4MDAKLU1BQ0hJTkVfU1RBUlQoRTgwMCwgIlRvc2hpYmEgZTgwMCIpCi0JLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkucGh5c19pbwk9IDB4NDAwMDAwMDAsCi0JLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKLQkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAotCS5maXh1cAkJPSBlc2VyaWVzX2ZpeHVwLAotCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotTUFDSElORV9FTkQKLSNlbmRpZgorc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIGU3eHhfdWRjX21hY2hfaW5mbyA9IHsKKwkuZ3Bpb192YnVzICAgPSBHUElPX0U3WFhfVVNCX0RJU0MsCisJLmdwaW9fcHVsbHVwID0gR1BJT19FN1hYX1VTQl9QVUxMVVAsCisJLmdwaW9fcHVsbHVwX2ludmVydGVkID0gMQorfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2Y4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmgKQEAgLTAsMCArMSw0IEBACit2b2lkIF9faW5pdCBlc2VyaWVzX2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsCisJc3RydWN0IHRhZyAqdGFncywgY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSk7CisKK2V4dGVybiBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gZTd4eF91ZGNfbWFjaF9pbmZvOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllc191ZGMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXNfdWRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjJjMDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllc191ZGMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBVREMgZnVuY3Rpb25zIGZvciB0aGUgVG9zaGliYSBlLXNlcmllcyBQREFzCi0gKgotICogQ29weXJpZ2h0IChjKSBJYW4gTW9sdG9uIDIwMDMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvdWRjLmg+Ci0jaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9kb21haW4uaD4KLQotLyogbG9jYWwgUFhBIGdlbmVyaWMgY29kZSAqLwotI2luY2x1ZGUgImdlbmVyaWMuaCIKLQotc3RhdGljIHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyBlN3h4X3VkY19tYWNoX2luZm8gPSB7Ci0JLmdwaW9fdmJ1cyAgID0gR1BJT19FN1hYX1VTQl9ESVNDLAotCS5ncGlvX3B1bGx1cCA9IEdQSU9fRTdYWF9VU0JfUFVMTFVQLAotCS5ncGlvX3B1bGx1cF9pbnZlcnRlZCA9IDEKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gZTgwMF91ZGNfbWFjaF9pbmZvID0gewotCS5ncGlvX3ZidXMgICA9IEdQSU9fRTgwMF9VU0JfRElTQywKLQkuZ3Bpb19wdWxsdXAgPSBHUElPX0U4MDBfVVNCX1BVTExVUCwKLQkuZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQgPSAxCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlc2VyaWVzX3VkY19pbml0KHZvaWQpCi17Ci0JaWYgKG1hY2hpbmVfaXNfZTMzMCgpIHx8IG1hY2hpbmVfaXNfZTM1MCgpIHx8Ci0JICAgIG1hY2hpbmVfaXNfZTc0MCgpIHx8IG1hY2hpbmVfaXNfZTc1MCgpIHx8Ci0JICAgIG1hY2hpbmVfaXNfZTQwMCgpKQotCQlweGFfc2V0X3VkY19pbmZvKCZlN3h4X3VkY19tYWNoX2luZm8pOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfZTgwMCgpKQotCQlweGFfc2V0X3VkY19pbmZvKCZlODAwX3VkY19tYWNoX2luZm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KGVzZXJpZXNfdWRjX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJlc2VyaWVzIFVEQyBzdXBwb3J0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYwppbmRleCBjZWFlZDAwLi44NWVkMGIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCkBAIC00Niw3ICs0Niw3IEBACiAgKi8KIHVuc2lnbmVkIGludCBnZXRfY2xrX2ZyZXF1ZW5jeV9raHooaW50IGluZm8pCiB7Ci0JaWYgKGNwdV9pc19weGEyMXgoKSB8fCBjcHVfaXNfcHhhMjV4KCkpCisJaWYgKGNwdV9pc19weGEyNXgoKSkKIAkJcmV0dXJuIHB4YTI1eF9nZXRfY2xrX2ZyZXF1ZW5jeV9raHooaW5mbyk7CiAJZWxzZSBpZiAoY3B1X2lzX3B4YTI3eCgpKQogCQlyZXR1cm4gcHhhMjd4X2dldF9jbGtfZnJlcXVlbmN5X2toeihpbmZvKTsKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogdW5zaWduZWQgaW50IGdldF9tZW1jbGtfZnJlcXVlbmN5XzEwa2h6KHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19weGEyMXgoKSB8fCBjcHVfaXNfcHhhMjV4KCkpCisJaWYgKGNwdV9pc19weGEyNXgoKSkKIAkJcmV0dXJuIHB4YTI1eF9nZXRfbWVtY2xrX2ZyZXF1ZW5jeV8xMGtoeigpOwogCWVsc2UgaWYgKGNwdV9pc19weGEyN3goKSkKIAkJcmV0dXJuIHB4YTI3eF9nZXRfbWVtY2xrX2ZyZXF1ZW5jeV8xMGtoeigpOwpAQCAtODgsMTEgKzg4LDYgQEAKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4NDgwMDAwMDApLAogCQkubGVuZ3RoCQk9IDB4MDAyMDAwMDAsCiAJCS50eXBlCQk9IE1UX0RFVklDRQotCX0sIHsJLyogVVNCIGhvc3QgKi8KLQkJLnZpcnR1YWwJPSAgMHhmODAwMDAwMCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4NGMwMDAwMDApLAotCQkubGVuZ3RoCQk9IDB4MDAxMDAwMDAsCi0JCS50eXBlCQk9IE1UX0RFVklDRQogCX0sIHsJLyogQ2FtZXJhICovCiAJCS52aXJ0dWFsCT0gIDB4ZmEwMDAwMDAsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbigweDUwMDAwMDAwKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuaAppbmRleCAwNDFjMDQ4Li5kYzg3NmE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5oCkBAIC02NSw0ICs2NSw1IEBACiAKIGV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YV9pcnFfc3lzY2xhc3M7CiBleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBweGFfZ3Bpb19zeXNjbGFzczsKK2V4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YTJ4eF9tZnBfc3lzY2xhc3M7CiBleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBweGEzeHhfbWZwX3N5c2NsYXNzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZ3Bpby5jCmluZGV4IDA3YWNjMWIuLjE0OTMwY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9ncGlvLmMKQEAgLTE2LDEwICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgogCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJCWxvb3AgPSAxOwogCiAJCQluID0gUFhBX0dQSU9fSVJRX0JBU0UgKyBiaXQ7Ci0JCQlkZXNjX2hhbmRsZV9pcnEobiwgaXJxX2Rlc2MgKyBuKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShuKTsKIAogCQkJYml0ID0gZmluZF9uZXh0X2JpdChnZWRyLCBHRURSX0JJVFMsIGJpdCArIDEpOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMKaW5kZXggYzAwOTI0Ny4uZDg5NjJhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYwpAQCAtMjAsOCArMjAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CkBAIC00MCw3ICs0NCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtODUsMjEgKzg5LDggQEAKIH07CiAKICNpZmRlZiBDT05GSUdfTU1DX1BYQQotc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBndW1zdGl4X21jaV9wbGF0Zm9ybV9kYXRhOwotCi1zdGF0aWMgaW50IGd1bXN0aXhfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IGRldGVjdF9pbnQsCi0JCQkJdm9pZCAqZGF0YSkKLXsKLQlweGFfZ3Bpb19tb2RlKEdQSU82X01NQ0NMS19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTNfTU1DQ0xLX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU84X01NQ0NTMF9NRCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSBndW1zdGl4X21jaV9wbGF0Zm9ybV9kYXRhID0gewogCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKLQkuaW5pdAkJPSBndW1zdGl4X21jaV9pbml0LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGd1bXN0aXhfbW1jX2luaXQodm9pZCkKQEAgLTEwOSwxMSArMTAwLDExIEBACiAjZWxzZQogc3RhdGljIHZvaWQgX19pbml0IGd1bXN0aXhfbW1jX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJHdW1zdGl4IG1tYyBkaXNhYmxlZFxuIik7CisJcHJfZGVidWcoIkd1bXN0aXggbW1jIGRpc2FibGVkXG4iKTsKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYCiBzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIGd1bXN0aXhfdWRjX2luZm8gX19pbml0ZGF0YSA9IHsKIAkuZ3Bpb192YnVzCQk9IEdQSU9fR1VNU1RJWF9VU0JfR1BJT24sCiAJLmdwaW9fcHVsbHVwCQk9IEdQSU9fR1VNU1RJWF9VU0JfR1BJT3gsCkBAIC0xMjYsMTIgKzExNyw4NyBAQAogI2Vsc2UKIHN0YXRpYyB2b2lkIGd1bXN0aXhfdWRjX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJHdW1zdGl4IHVkYyBpcyBkaXNhYmxlZFxuIik7CisJcHJfZGVidWcoIkd1bXN0aXggdWRjIGlzIGRpc2FibGVkXG4iKTsKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JUCisvKiBOb3JtYWxseSwgdGhlIGJvb3Rsb2FkZXIgd291bGQgaGF2ZSBlbmFibGVkIHRoaXMgMzJrSHogY2xvY2sgYnV0IG1hbnkKKyoqIGJvYXJkcyBzdGlsbCBoYXZlIHUtYm9vdCAxLjEuNCBzbyB3ZSBjaGVjayBpZiBpdCBoYXMgYmVlbiB0dXJuZWQgb24gYW5kCisqKiBpZiBub3QsIHdlIHR1cm4gaXQgb24gd2l0aCBhIHdhcm5pbmcgbWVzc2FnZS4gKi8KK3N0YXRpYyB2b2lkIGd1bXN0aXhfc2V0dXBfYnRfY2xvY2sodm9pZCkKK3sKKwlpbnQgdGltZW91dCA9IDUwMDsKKworCWlmICghKE9TQ0MgJiBPU0NDX09PSykpCisJCXByX3dhcm5pbmcoIjMya0h6IGNsb2NrIHdhcyBub3Qgb24uIEJvb3Rsb2FkZXIgbWF5IG5lZWQgdG8gIgorCQkJCSJiZSB1cGRhdGVkXG4iKTsKKwllbHNlCisJCXJldHVybjsKKworCU9TQ0MgfD0gT1NDQ19PT047CisJZG8geworCQlpZiAoT1NDQyAmIE9TQ0NfT09LKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCWlmICghdGltZW91dCkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3RhcnQgMzJrSHogY2xvY2tcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZ3Vtc3RpeF9ibHVldG9vdGhfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlndW1zdGl4X3NldHVwX2J0X2Nsb2NrKCk7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19HVU1TVElYX0JUUkVTRVQsICJCVFJTVCIpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJndW1zdGl4OiBmYWlsZWQgcmVxdWVzdCBncGlvIGZvciBibHVldG9vdGggcmVzZXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fR1VNU1RJWF9CVFJFU0VULCAxKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZ3Vtc3RpeDogY2FuJ3QgcmVzZXQgYmx1ZXRvb3RoXG4iKTsKKwkJcmV0dXJuOworCX0KKwlncGlvX3NldF92YWx1ZShHUElPX0dVTVNUSVhfQlRSRVNFVCwgMCk7CisJdWRlbGF5KDEwMCk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19HVU1TVElYX0JUUkVTRVQsIDEpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGd1bXN0aXhfYmx1ZXRvb3RoX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiR3Vtc3RpeCBCbHVldG9vdGggaXMgZGlzYWJsZWRcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGd1bXN0aXhfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJR1BJTzEyXzMyS0h6LAorCS8qIEJUVUFSVCAqLworCUdQSU80Ml9IV1VBUlRfUlhELAorCUdQSU80M19IV1VBUlRfVFhELAorCUdQSU80NF9IV1VBUlRfQ1RTLAorCUdQSU80NV9IV1VBUlRfUlRTLAorCS8qIE1NQyAqLworCUdQSU82X01NQ19DTEssCisJR1BJTzUzX01NQ19DTEssCisJR1BJTzhfTU1DX0NTMCwKKwkvKiB0aGVzZSBhcmUgdXNlZCBieSBBTTIwMEVQRCAqLworCUdQSU81MV9HUElPLAorCUdQSU80OV9HUElPLAorCUdQSU80OF9HUElPLAorCUdQSU8zMl9HUElPLAorCUdQSU8xN19HUElPLAorCUdQSU8xNl9HUElPLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGd1bXN0aXhfaW5pdCh2b2lkKQogeworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGd1bXN0aXhfcGluX2NvbmZpZykpOworCisJZ3Vtc3RpeF9ibHVldG9vdGhfaW5pdCgpOwogCWd1bXN0aXhfdWRjX2luaXQoKTsKIAlndW1zdGl4X21tY19pbml0KCk7CiAJKHZvaWQpIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYwppbmRleCA1YWEwMjcwLi4wMTNiMTViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL2lkcC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL2JpdGZpZWxkLmg+CkBAIC00Niw2ICs0Niw0NyBAQAogICogLSBFdGhlcm5ldCBpbnRlcnJ1cHQKICAqLwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpZHBfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogTENEICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKworCS8qIEJUVUFSVCAqLworCUdQSU80Ml9CVFVBUlRfUlhELAorCUdQSU80M19CVFVBUlRfVFhELAorCUdQSU80NF9CVFVBUlRfQ1RTLAorCUdQSU80NV9CVFVBUlRfUlRTLAorCisJLyogU1RVQVJUICovCisJR1BJTzQ2X1NUVUFSVF9SWEQsCisJR1BJTzQ3X1NUVUFSVF9UWEQsCisKKwkvKiBNTUMgKi8KKwlHUElPNl9NTUNfQ0xLLAorCUdQSU84X01NQ19DUzAsCisKKwkvKiBFdGhlcm5ldCAqLworCUdQSU8zM19uQ1NfNSwJLyogRXRoZXJuZXQgQ1MgKi8KKwlHUElPNF9HUElPLAkvKiBFdGhlcm5ldCBJUlEgKi8KK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gKElEUF9FVEhfUEhZUyArIDB4MzAwKSwKQEAgLTEyMSw0NCArMTYyLDI4IEBACiAJLm51bV9tb2RlcyAgICAgID0gMSwKIAkuY21hcF9pbnZlcnNlCT0gMCwKIAkuY21hcF9zdGF0aWMJPSAwLAotCS5sY2NyMAkJPSBMQ0NSMF9TRFMsCi0JLmxjY3IzCQk9IExDQ1IzX1BDUCB8IExDQ1IzX0FjYigyNTUpLAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9EU1ROXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMIHwKKwkJCSAgTENEX0FDX0JJQVNfRlJFUSgyNTUpLAogCS5weGFmYl9iYWNrbGlnaHRfcG93ZXIgPSAmaWRwX2JhY2tsaWdodF9wb3dlciwKIAkucHhhZmJfbGNkX3Bvd2VyID0gJmlkcF9sY2RfcG93ZXIKIH07CiAKLXN0YXRpYyBpbnQgaWRwX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBpZHBfZGV0ZWN0X2ludCwgdm9pZCAqZGF0YSkKLXsKLQkvKiBzZXR1cCBHUElPIGZvciBQWEEyNXggTU1DIGNvbnRyb2xsZXIJKi8KLQlweGFfZ3Bpb19tb2RlKEdQSU82X01NQ0NMS19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPOF9NTUNDUzBfTUQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgaWRwX21jaV9wbGF0Zm9ybV9kYXRhID0gewogCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKLQkuaW5pdCAJCT0gaWRwX21jaV9pbml0LAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGlkcF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKCJpZHBfaW5pdCgpXG4iKTsKIAorCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGlkcF9waW5fY29uZmlnKSk7CisKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOwogCS8vcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtc3RfYXVkaW9fZGV2aWNlKTsKIAlzZXRfcHhhX2ZiX2luZm8oJnNoYXJwX2xtOHYzMSk7CiAJcHhhX3NldF9tY2lfaW5mbygmaWRwX21jaV9wbGF0Zm9ybV9kYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGlkcF9pbml0X2lycSh2b2lkKQotewotCi0JcHhhMjV4X2luaXRfaXJxKCk7Ci0KLQlzZXRfaXJxX3R5cGUoVE9VQ0hfUEFORUxfSVJRLCBUT1VDSF9QQU5FTF9JUlFfRURHRSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaWRwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogICAJewogCQkudmlydHVhbAk9ICBJRFBfQ09SRVZPTFRfVklSVCwKQEAgLTE3NywxNSArMjAyLDYgQEAKIHsKIAlweGFfbWFwX2lvKCk7CiAJaW90YWJsZV9pbml0KGlkcF9pb19kZXNjLCBBUlJBWV9TSVpFKGlkcF9pb19kZXNjKSk7Ci0KLQkvLyBzZXJpYWwgcG9ydHMgMiAmIDMKLQlweGFfZ3Bpb19tb2RlKEdQSU80Ml9CVFJYRF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNDNfQlRUWERfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzQ0X0JUQ1RTX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU80NV9CVFJUU19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNDZfU1RSWERfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzQ3X1NUVFhEX01EKTsKLQogfQogCiAKQEAgLTE5NCw3ICsyMTAsNyBAQAogCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKIAkuaW9fcGdfb2Zmc3QJPSAoaW9fcDJ2KDB4NDAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKIAkubWFwX2lvCQk9IGlkcF9tYXBfaW8sCi0JLmluaXRfaXJxCT0gaWRwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaWRwX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2FraXRhLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWtpdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4Y2MxZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWtpdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBIYXJkd2FyZSBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgU0wtQzEwMDAgKEFraXRhKQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBSaWNoYXJkIFB1cmRpZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLS8qIEFraXRhIElPIEV4cGFuZGVyIEdQSU9zICovCi0KLSNkZWZpbmUgQUtJVEFfSU9FWFBfUkVTRVJWRURfNyAgICAgICgxIDw8IDcpCi0jZGVmaW5lIEFLSVRBX0lPRVhQX0lSX09OICAgICAgICAgICAoMSA8PCA2KQotI2RlZmluZSBBS0lUQV9JT0VYUF9BS0lOX1BVTExVUCAgICAgKDEgPDwgNSkKLSNkZWZpbmUgQUtJVEFfSU9FWFBfQkFDS0xJR0hUX0NPTlQgICgxIDw8IDQpCi0jZGVmaW5lIEFLSVRBX0lPRVhQX0JBQ0tMSUdIVF9PTiAgICAoMSA8PCAzKQotI2RlZmluZSBBS0lUQV9JT0VYUF9NSUNfQklBUyAgICAgICAgKDEgPDwgMikKLSNkZWZpbmUgQUtJVEFfSU9FWFBfUkVTRVJWRURfMSAgICAgICgxIDw8IDEpCi0jZGVmaW5lIEFLSVRBX0lPRVhQX1JFU0VSVkVEXzAgICAgICAoMSA8PCAwKQotCi0vKiBEaXJlY3Rpb24gQml0ZmllbGQgIDA9b3V0cHV0ICAxPWlucHV0ICovCi0jZGVmaW5lIEFLSVRBX0lPRVhQX0lPX0RJUgkwCi0vKiBEZWZhdWx0IFZhbHVlcyAqLwotI2RlZmluZSBBS0lUQV9JT0VYUF9JT19PVVQJKEFLSVRBX0lPRVhQX0lSX09OIHwgQUtJVEFfSU9FWFBfQUtJTl9QVUxMVVApCi0KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFraXRhaW9leHBfZGV2aWNlOwotCi12b2lkIGFraXRhX3NldF9pb2V4cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYml0bWFzayk7Ci12b2lkIGFraXRhX3Jlc2V0X2lvZXhwKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBiaXRtYXNrKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NhbWVyYS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NhbWVyYS5oCmluZGV4IDM5NTE2Y2UuLjMxYWJlNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9jYW1lcmEuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY2FtZXJhLmgKQEAgLTM2LDggKzM2LDYgQEAKIAogc3RydWN0IHB4YWNhbWVyYV9wbGF0Zm9ybV9kYXRhIHsKIAlpbnQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICopOwotCWludCAoKnBvd2VyKShzdHJ1Y3QgZGV2aWNlICosIGludCk7Ci0JaW50ICgqcmVzZXQpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBtY2xrXzEwa2h6OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2NvcmdpLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaAppbmRleCBiZjg1NjUwLi41ODU5NzBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvY29yZ2kuaApAQCAtOTgsMTIgKzk4LDIxIEBACiAJCQlDT1JHSV9TQ1BfTUlDX0JJQVMgKQogI2RlZmluZSBDT1JHSV9TQ09PUF9JT19PVVQJKCBDT1JHSV9TQ1BfTVVURV9MIHwgQ09SR0lfU0NQX01VVEVfUiApCiAKKyNkZWZpbmUgQ09SR0lfU0NPT1BfR1BJT19CQVNFCQkoTlJfQlVJTFRJTl9HUElPKQorI2RlZmluZSBDT1JHSV9HUElPX0xFRF9HUkVFTgkJKENPUkdJX1NDT09QX0dQSU9fQkFTRSArIDApCisjZGVmaW5lIENPUkdJX0dQSU9fU1dBCQkJKENPUkdJX1NDT09QX0dQSU9fQkFTRSArIDEpICAvKiBIaW5nZSBTd2l0Y2ggQSAqLworI2RlZmluZSBDT1JHSV9HUElPX1NXQgkJCShDT1JHSV9TQ09PUF9HUElPX0JBU0UgKyAyKSAgLyogSGluZ2UgU3dpdGNoIEIgKi8KKyNkZWZpbmUgQ09SR0lfR1BJT19NVVRFX0wJCShDT1JHSV9TQ09PUF9HUElPX0JBU0UgKyAzKQorI2RlZmluZSBDT1JHSV9HUElPX01VVEVfUgkJKENPUkdJX1NDT09QX0dQSU9fQkFTRSArIDQpCisjZGVmaW5lIENPUkdJX0dQSU9fQUtJTl9QVUxMVVAJCShDT1JHSV9TQ09PUF9HUElPX0JBU0UgKyA1KQorI2RlZmluZSBDT1JHSV9HUElPX0FQTV9PTgkJKENPUkdJX1NDT09QX0dQSU9fQkFTRSArIDYpCisjZGVmaW5lIENPUkdJX0dQSU9fQkFDS0xJR0hUX0NPTlQJKENPUkdJX1NDT09QX0dQSU9fQkFTRSArIDcpCisjZGVmaW5lIENPUkdJX0dQSU9fTUlDX0JJQVMJCShDT1JHSV9TQ09PUF9HUElPX0JBU0UgKyA4KQogCiAvKgogICogU2hhcmVkIGRhdGEgc3RydWN0dXJlcwogICovCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb3JnaXNjb29wX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvcmdpc3NwX2RldmljZTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfQ09SR0lfSCAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCBkZTE2YzEyLi5mNmI0YmYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtNDEsNyArNDEsNyBAQAogCQlhbmQJXGlycXN0YXQsIFxpcnFzdGF0LCBcaXJxbnIKIAkJY2x6CVxpcnFuciwgXGlycXN0YXQKIAkJcnNiCVxpcnFuciwgXGlycW5yLCAjMzEKLQkJYWRkCVxpcnFuciwgXGlycW5yLCAjMzIKKwkJYWRkCVxpcnFuciwgXGlycW5yLCAjKDMyICsgUFhBX0lSUSgwKSkKIAkJYgkxMDAxZgogMTAwMzoKIAkJbXJjCXA2LCAwLCBcaXJxc3RhdCwgYzAsIGMwLCAwCUAgSUNJUApAQCAtNTIsNiArNTIsNiBAQAogCQlyc2IJXGlycXN0YXQsIFxpcnFuciwgIzAKIAkJYW5kCVxpcnFzdGF0LCBcaXJxc3RhdCwgXGlycW5yCiAJCWNseglcaXJxbnIsIFxpcnFzdGF0Ci0JCXJzYglcaXJxbnIsIFxpcnFuciwgIzMxCisJCXJzYglcaXJxbnIsIFxpcnFuciwgIygzMSArIFBYQV9JUlEoMCkpCiAxMDAxOgogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBlODlkZjRkLi5hNTgyYTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtNjIsMjYgKzYyLDc0IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgorCisvKgorICogICBDUFUgICAgIFN0ZXBwaW5nICAgICBDUFVfSUQgICAgICAgICBKVEFHX0lECisgKgorICogIFBYQTIxMAlCMAkweDY5MDUyOTIyCTB4MjkyNkMwMTMKKyAqICBQWEEyMTAJQjEJMHg2OTA1MjkyMwkweDM5MjZDMDEzCisgKiAgUFhBMjEwCUIyCTB4NjkwNTI5MjQJMHg0OTI2QzAxMworICogIFBYQTIxMAlDMAkweDY5MDUyRDI1CTB4NTkyNkMwMTMKKyAqCisgKiAgUFhBMjUwCUEwCTB4NjkwNTIxMDAJMHgwOTI2NDAxMworICogIFBYQTI1MAlBMQkweDY5MDUyMTAxCTB4MTkyNjQwMTMKKyAqICBQWEEyNTAJQjAJMHg2OTA1MjkwMgkweDI5MjY0MDEzCisgKiAgUFhBMjUwCUIxCTB4NjkwNTI5MDMJMHgzOTI2NDAxMworICogIFBYQTI1MAlCMgkweDY5MDUyOTA0CTB4NDkyNjQwMTMKKyAqICBQWEEyNTAJQzAJMHg2OTA1MkQwNQkweDU5MjY0MDEzCisgKgorICogIFBYQTI1NQlBMAkweDY5MDUyRDA2CTB4NjkyNjQwMTMKKyAqCisgKiAgUFhBMjZ4CUEwCTB4NjkwNTI5MDMJMHgzOTI2NDAxMworICogIFBYQTI2eAlCMAkweDY5MDUyRDA1CTB4NTkyNjQwMTMKKyAqCisgKiAgUFhBMjd4CUEwCTB4NjkwNTQxMTAJMHgwOTI2NTAxMworICogIFBYQTI3eAlBMQkweDY5MDU0MTExCTB4MTkyNjUwMTMKKyAqICBQWEEyN3gJQjAJMHg2OTA1NDExMgkweDI5MjY1MDEzCisgKiAgUFhBMjd4CUIxCTB4NjkwNTQxMTMJMHgzOTI2NTAxMworICogIFBYQTI3eAlDMAkweDY5MDU0MTE0CTB4NDkyNjUwMTMKKyAqICBQWEEyN3gJQzUJMHg2OTA1NDExNwkweDc5MjY1MDEzCisgKgorICogIFBYQTMweAlBMAkweDY5MDU2ODgwCTB4MEU2NDgwMTMKKyAqICBQWEEzMHgJQTEJMHg2OTA1Njg4MQkweDFFNjQ4MDEzCisgKiAgUFhBMzF4CUEwCTB4NjkwNTY4OTAJMHgwRTY0OTAxMworICogIFBYQTMxeAlBMQkweDY5MDU2ODkxCTB4MUU2NDkwMTMKKyAqICBQWEEzMXgJQTIJMHg2OTA1Njg5MgkweDJFNjQ5MDEzCisgKiAgUFhBMzJ4CUIxCTB4NjkwNTY4MjUJMHg1RTY0MjAxMworICogIFBYQTMyeAlCMgkweDY5MDU2ODI2CTB4NkU2NDIwMTMKKyAqCisgKiAgUFhBOTMwCUIwCTB4NjkwNTY4MzUJMHg1RTY0MzAxMworICogIFBYQTkzMAlCMQkweDY5MDU2ODM3CTB4N0U2NDMwMTMKKyAqICBQWEE5MzAJQjIJMHg2OTA1NjgzOAkweDhFNjQzMDEzCisgKi8KICNpZmRlZiBDT05GSUdfUFhBMjV4Ci0jZGVmaW5lIF9fY3B1X2lzX3B4YTIxeChpZCkJCQkJXAorI2RlZmluZSBfX2NwdV9pc19weGEyMTAoaWQpCQkJCVwKIAkoewkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9pZCA9IChpZCkgPj4gNCAmIDB4ZjNmOwlcCi0JCV9pZCA9PSAweDIxMjsJCQkJXAorCQl1bnNpZ25lZCBpbnQgX2lkID0gKGlkKSAmIDB4ZjNmMDsJXAorCQlfaWQgPT0gMHgyMTIwOwkJCQlcCiAJfSkKIAotI2RlZmluZSBfX2NwdV9pc19weGEyNTUoaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl1bnNpZ25lZCBpbnQgX2lkID0gKGlkKSA+PiA0ICYgMHhmZmY7ICAgXAotCQlfaWQgPT0gMHgyZDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSB9KQorI2RlZmluZSBfX2NwdV9pc19weGEyNTAoaWQpCQkJCVwKKwkoewkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9pZCA9IChpZCkgJiAweGYzZmY7CVwKKwkJX2lkIDw9IDB4MjEwNTsJCQkJXAorCX0pCisKKyNkZWZpbmUgX19jcHVfaXNfcHhhMjU1KGlkKQkJCQlcCisJKHsJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfaWQgPSAoaWQpICYgMHhmZmZmOwlcCisJCV9pZCA9PSAweDJkMDY7CQkJCVwKKwl9KQogCiAjZGVmaW5lIF9fY3B1X2lzX3B4YTI1eChpZCkJCQkJXAogCSh7CQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX2lkID0gKGlkKSA+PiA0ICYgMHhmZmY7CVwKLQkJX2lkID09IDB4MmQwIHx8IF9pZCA9PSAweDI5MDsJCVwKKwkJdW5zaWduZWQgaW50IF9pZCA9IChpZCkgJiAweGYzMDA7CVwKKwkJX2lkID09IDB4MjEwMDsJCQkJXAogCX0pCiAjZWxzZQotI2RlZmluZSBfX2NwdV9pc19weGEyMXgoaWQpCSgwKQorI2RlZmluZSBfX2NwdV9pc19weGEyMTAoaWQpCSgwKQorI2RlZmluZSBfX2NwdV9pc19weGEyNTAoaWQpCSgwKQogI2RlZmluZSBfX2NwdV9pc19weGEyNTUoaWQpCSgwKQogI2RlZmluZSBfX2NwdV9pc19weGEyNXgoaWQpCSgwKQogI2VuZGlmCkBAIC0xMzYsOSArMTg0LDE0IEBACiAjZGVmaW5lIF9fY3B1X2lzX3B4YTkzMChpZCkJKDApCiAjZW5kaWYKIAotI2RlZmluZSBjcHVfaXNfcHhhMjF4KCkJCQkJCVwKKyNkZWZpbmUgY3B1X2lzX3B4YTIxMCgpCQkJCQlcCiAJKHsJCQkJCQlcCi0JCV9fY3B1X2lzX3B4YTIxeChyZWFkX2NwdWlkX2lkKCkpOwlcCisJCV9fY3B1X2lzX3B4YTIxMChyZWFkX2NwdWlkX2lkKCkpOwlcCisJfSkKKworI2RlZmluZSBjcHVfaXNfcHhhMjUwKCkJCQkJCVwKKwkoewkJCQkJCVwKKwkJX19jcHVfaXNfcHhhMjUwKHJlYWRfY3B1aWRfaWQoKSk7CVwKIAl9KQogCiAjZGVmaW5lIGNwdV9pc19weGEyNTUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE1MSw2ICsyMDQsOCBAQAogCQlfX2NwdV9pc19weGEyNXgocmVhZF9jcHVpZF9pZCgpKTsJXAogCX0pCiAKK2V4dGVybiBpbnQgY3B1X2lzX3B4YTI2eCh2b2lkKTsKKwogI2RlZmluZSBjcHVfaXNfcHhhMjd4KCkJCQkJCVwKIAkoewkJCQkJCVwKIAkJX19jcHVfaXNfcHhhMjd4KHJlYWRfY3B1aWRfaWQoKSk7CVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pMmMuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pMmMuaAppbmRleCA4MDU5NmIwLi4xYTlmNjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaTJjLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2kyYy5oCkBAIC02NSwxMyArNjUsMTggQEAKIAl1bnNpZ25lZCBpbnQJCXNsYXZlX2FkZHI7CiAJc3RydWN0IGkyY19zbGF2ZV9jbGllbnQJKnNsYXZlOwogCXVuc2lnbmVkIGludAkJY2xhc3M7Ci0JaW50CQkJdXNlX3BpbzsKKwl1bnNpZ25lZCBpbnQJCXVzZV9waW8gOjE7CisJdW5zaWduZWQgaW50CQlmYXN0X21vZGUgOjE7CiB9OwogCiBleHRlcm4gdm9pZCBweGFfc2V0X2kyY19pbmZvKHN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKmluZm8pOwogCiAjaWZkZWYgQ09ORklHX1BYQTI3eAotZXh0ZXJuIHZvaWQgcHhhX3NldF9pMmNfcG93ZXJfaW5mbyhzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhICppbmZvKTsKK2V4dGVybiB2b2lkIHB4YTI3eF9zZXRfaTJjX3Bvd2VyX2luZm8oc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSAqaW5mbyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QWEEzeHgKK2V4dGVybiB2b2lkIHB4YTN4eF9zZXRfaTJjX3Bvd2VyX2luZm8oc3RydWN0IGkyY19weGFfcGxhdGZvcm1fZGF0YSAqaW5mbyk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCAxMDhiNWRiLi45YzE2M2UxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTExLDcgKzExLDE0IEBACiAgKi8KIAogCi0jZGVmaW5lIFBYQV9JUlEoeCkJKHgpCisjaWZkZWYgQ09ORklHX1BYQV9IQVZFX0lTQV9JUlFTCisjZGVmaW5lIFBYQV9JU0FfSVJRKHgpCSh4KQorI2RlZmluZSBQWEFfSVNBX0lSUV9OVU0JKDE2KQorI2Vsc2UKKyNkZWZpbmUgUFhBX0lTQV9JUlFfTlVNCSgwKQorI2VuZGlmCisKKyNkZWZpbmUgUFhBX0lSUSh4KQkoUFhBX0lTQV9JUlFfTlVNICsgKHgpKQogCiAjaWYgZGVmaW5lZChDT05GSUdfUFhBMjd4KSB8fCBkZWZpbmVkKENPTkZJR19QWEEzeHgpCiAjZGVmaW5lIElSUV9TU1AzCVBYQV9JUlEoMCkJLyogU1NQMyBzZXJ2aWNlIHJlcXVlc3QgKi8KQEAgLTczLDcgKzgwLDcgQEAKICNkZWZpbmUgSVJRX01NQzMJUFhBX0lSUSg1NSkJLyogTU1DMyBDb250cm9sbGVyIChQWEEzMTApICovCiAjZW5kaWYKIAotI2RlZmluZSBQWEFfR1BJT19JUlFfQkFTRQkoNjQpCisjZGVmaW5lIFBYQV9HUElPX0lSUV9CQVNFCVBYQV9JUlEoNjQpCiAjZGVmaW5lIFBYQV9HUElPX0lSUV9OVU0JKDEyOCkKIAogI2RlZmluZSBHUElPXzJfeF9UT19JUlEoeCkJKFBYQV9HUElPX0lSUV9CQVNFICsgKHgpKQpAQCAtMTc4LDEzICsxODUsNyBAQAogI2RlZmluZSBOUl9JUlFTCQkJKElSUV9TMV9CVkQxX1NUU0NIRyArIDEpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSEFSUF9MT0NPTU8pCiAjZGVmaW5lIE5SX0lSUVMJCQkoSVJRX0xPQ09NT19TUElfVEVORCArIDEpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0xVQkJPQ0spIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX01BQ0hfTE9HSUNQRF9QWEEyNzApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX01BQ0hfVE9TQSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfTUFDSF9NQUlOU1RPTkUpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX01BQ0hfUENNMDI3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1BYQV9FU0VSSUVTKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19NQUNIX01BR0lDSUFOKQorI2VsaWYgZGVmaW5lZChDT05GSUdfUFhBX0hBVkVfQk9BUkRfSVJRUykKICNkZWZpbmUgTlJfSVJRUwkJCShJUlFfQk9BUkRfRU5EKQogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9aWUxPTklURSkKICNkZWZpbmUgTlJfSVJRUwkJCShJUlFfQk9BUkRfU1RBUlQgKyAzMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaAppbmRleCA3OWQyMDliLi41YzRlMzIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xpdHRsZXRvbi5oCkBAIC0zLDQgKzMsNiBAQAogCiAjZGVmaW5lIExJVFRMRVRPTl9FVEhfUEhZUwkweDMwMDAwMDAwCiAKKyNkZWZpbmUgTElUVExFVE9OX0dQSU9fTENEX0NTCSgxNykKKwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfWllMT05JVEVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IDU1MmViN2YuLjU5YWVmODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTQwLDExICs0MCwxMSBAQAogI2RlZmluZSBOT0RFX01FTV9TSVpFX0JJVFMJMjYKIAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykgJiYgZGVmaW5lZChDT05GSUdfTUFDSF9BUk1DT1JFKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCi12b2lkIGNteDI3MF9wY2lfYWRqdXN0X3pvbmVzKGludCBub2RlLCB1bnNpZ25lZCBsb25nICpzaXplLAordm9pZCBjbXgyeHhfcGNpX2FkanVzdF96b25lcyhpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqaG9sZXMpOwogCiAjZGVmaW5lIGFyY2hfYWRqdXN0X3pvbmVzKG5vZGUsIHNpemUsIGhvbGVzKSBcCi0JY214MjcwX3BjaV9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpCisJY214Mnh4X3BjaV9hZGp1c3Rfem9uZXMobm9kZSwgc2l6ZSwgaG9sZXMpCiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQJKFBIWVNfT0ZGU0VUICsgU1pfNjRNIC0gMSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEyNXguaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMjV4LmgKaW5kZXggNmM4ZTcyMi4uNjE3Y2FiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEyNXguaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTI1eC5oCkBAIC0xNyw3ICsxNyw3IEBACiAKIC8qIENyeXN0YWwgYW5kIENsb2NrIFNpZ25hbHMgKi8KICNkZWZpbmUgR1BJTzEwX1JUQ0NMSwkJTUZQX0NGR19PVVQoR1BJTzEwLCBBRjEsIERSSVZFX0xPVykKLSNkZWZpbmUgR1BJTzcwX1JUQ19DTEsJCU1GUF9DRkdfT1VUKEdQSU83MCwgQUYxLCBEUklWRV9MT1cpCisjZGVmaW5lIEdQSU83MF9SVENDTEsJCU1GUF9DRkdfT1VUKEdQSU83MCwgQUYxLCBEUklWRV9MT1cpCiAjZGVmaW5lIEdQSU83XzQ4TUh6CQlNRlBfQ0ZHX09VVChHUElPNywgIEFGMSwgRFJJVkVfTE9XKQogI2RlZmluZSBHUElPMTFfM182TUh6CQlNRlBfQ0ZHX09VVChHUElPMTEsIEFGMSwgRFJJVkVfTE9XKQogI2RlZmluZSBHUElPNzFfM182TUh6CQlNRlBfQ0ZHX09VVChHUElPNzEsIEFGMSwgRFJJVkVfTE9XKQpAQCAtMTU2LDYgKzE1Niw2IEBACiAjZGVmaW5lIEdQSU83NF9MQ0RfRkNMSwkJTUZQX0NGR19PVVQoR1BJTzc0LCBBRjIsIERSSVZFX0xPVykKICNkZWZpbmUgR1BJTzc1X0xDRF9MQ0xLCQlNRlBfQ0ZHX09VVChHUElPNzUsIEFGMiwgRFJJVkVfTE9XKQogI2RlZmluZSBHUElPNzZfTENEX1BDTEsJCU1GUF9DRkdfT1VUKEdQSU83NiwgQUYyLCBEUklWRV9MT1cpCi0jZGVmaW5lIEdQSU83N19MQ0RfQUNCSUFTCU1GUF9DRkdfT1VUKEdQSU83NywgQUYyLCBEUklWRV9MT1cpCisjZGVmaW5lIEdQSU83N19MQ0RfQklBUwkJTUZQX0NGR19PVVQoR1BJTzc3LCBBRjIsIERSSVZFX0xPVykKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUZQX1BYQTI1WF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTMyMC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC1weGEzMjAuaAppbmRleCA3NDk5MDUxLi42N2Y4Mzg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLXB4YTMyMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAtcHhhMzIwLmgKQEAgLTI1NywxMCArMjU3LDEwIEBACiAjZGVmaW5lIEdQSU8zOF9TU1AyX1JYRAkJTUZQX0NGRyhHUElPMzgsIEFGMikKICNkZWZpbmUgR1BJTzM4X1NTUDJfVFhECQlNRlBfQ0ZHKEdQSU8zOCwgQUY1KQogCi0jZGVmaW5lIEdQSU82OV9TU1AzX1NDTEsJTUZQX0NGRyhHUElPNjksIEFGMiwgRFMwOFgsIEZMT0FUKQotI2RlZmluZSBHUElPNzBfU1NQM19GUk0JCU1GUF9DRkcoR1BJTzcwLCBBRjIsIERTMDhYLCBEUklWRV9MT1cpCi0jZGVmaW5lIEdQSU84OV9TU1AzX1NDTEsJTUZQX0NGRyhHUElPODksIEFGMSwgRFMwOFgsIEZMT0FUKQotI2RlZmluZSBHUElPOTBfU1NQM19GUk0JCU1GUF9DRkcoR1BJTzkwLCBBRjEsIERTMDhYLCBEUklWRV9MT1cpCisjZGVmaW5lIEdQSU82OV9TU1AzX1NDTEsJTUZQX0NGR19YKEdQSU82OSwgQUYyLCBEUzA4WCwgRkxPQVQpCisjZGVmaW5lIEdQSU83MF9TU1AzX0ZSTQkJTUZQX0NGR19YKEdQSU83MCwgQUYyLCBEUzA4WCwgRFJJVkVfTE9XKQorI2RlZmluZSBHUElPODlfU1NQM19TQ0xLCU1GUF9DRkdfWChHUElPODksIEFGMSwgRFMwOFgsIEZMT0FUKQorI2RlZmluZSBHUElPOTBfU1NQM19GUk0JCU1GUF9DRkdfWChHUElPOTAsIEFGMSwgRFMwOFgsIERSSVZFX0xPVykKICNkZWZpbmUgR1BJTzcxX1NTUDNfUlhECQlNRlBfQ0ZHX1goR1BJTzcxLCBBRjUsIERTMDhYLCBGTE9BVCkKICNkZWZpbmUgR1BJTzcxX1NTUDNfVFhECQlNRlBfQ0ZHX1goR1BJTzcxLCBBRjIsIERTMDhYLCBEUklWRV9MT1cpCiAjZGVmaW5lIEdQSU83Ml9TU1AzX1JYRAkJTUZQX0NGR19YKEdQSU83MiwgQUYyLCBEUzA4WCwgRkxPQVQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWZwLmgKaW5kZXggODc2OTU2Ny4uNDgyMTg1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21mcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZnAuaApAQCAtMjc0LDEyICsyNzQsMTMgQEAKICNkZWZpbmUgTUZQX0RTX01BU0sJCSgweDcgPDwgMTMpCiAjZGVmaW5lIE1GUF9EUyh4KQkJKCgoeCkgPj4gMTMpICYgMHg3KQogCi0jZGVmaW5lIE1GUF9MUE1fSU5QVVQJCSgweDAgPDwgMTYpCisjZGVmaW5lIE1GUF9MUE1fREVGQVVMVAkJKDB4MCA8PCAxNikKICNkZWZpbmUgTUZQX0xQTV9EUklWRV9MT1cJKDB4MSA8PCAxNikKICNkZWZpbmUgTUZQX0xQTV9EUklWRV9ISUdICSgweDIgPDwgMTYpCiAjZGVmaW5lIE1GUF9MUE1fUFVMTF9MT1cJKDB4MyA8PCAxNikKICNkZWZpbmUgTUZQX0xQTV9QVUxMX0hJR0gJKDB4NCA8PCAxNikKICNkZWZpbmUgTUZQX0xQTV9GTE9BVAkJKDB4NSA8PCAxNikKKyNkZWZpbmUgTUZQX0xQTV9JTlBVVAkJKDB4NiA8PCAxNikKICNkZWZpbmUgTUZQX0xQTV9TVEFURV9NQVNLCSgweDcgPDwgMTYpCiAjZGVmaW5lIE1GUF9MUE1fU1RBVEUoeCkJKCgoeCkgPj4gMTYpICYgMHg3KQogCkBAIC0yOTcsNyArMjk4LDcgQEAKICNkZWZpbmUgTUZQX1BVTExfTUFTSwkJKDB4MyA8PCAyMSkKICNkZWZpbmUgTUZQX1BVTEwoeCkJCSgoKHgpID4+IDIxKSAmIDB4MykKIAotI2RlZmluZSBNRlBfQ0ZHX0RFRkFVTFQJCShNRlBfQUYwIHwgTUZQX0RTMDNYIHwgTUZQX0xQTV9JTlBVVCB8XAorI2RlZmluZSBNRlBfQ0ZHX0RFRkFVTFQJCShNRlBfQUYwIHwgTUZQX0RTMDNYIHwgTUZQX0xQTV9ERUZBVUxUIHxcCiAJCQkJIE1GUF9MUE1fRURHRV9OT05FIHwgTUZQX1BVTExfTk9ORSkKIAogI2RlZmluZSBNRlBfQ0ZHKHBpbiwgYWYpCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWlvYTcwMS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21pb2E3MDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDgzY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL21pb2E3MDEuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9NSU9BNzAxX0hfCisjZGVmaW5lIF9NSU9BNzAxX0hfCisKKyNkZWZpbmUgTUlPX0NGR19JTihwaW4sIGFmKQkJXAorCSgoTUZQX0NGR19ERUZBVUxUICYgfihNRlBfQUZfTUFTSyB8IE1GUF9ESVJfTUFTSykpIHxcCisJIChNRlBfUElOKHBpbikgfCBNRlBfIyNhZiB8IE1GUF9ESVJfSU4pKQorCisjZGVmaW5lIE1JT19DRkdfT1VUKHBpbiwgYWYsIHN0YXRlKQlcCisJKChNRlBfQ0ZHX0RFRkFVTFQgJiB+KE1GUF9BRl9NQVNLIHwgTUZQX0RJUl9NQVNLIHwgTUZQX0xQTV9TVEFURV9NQVNLKSkgfFwKKwkgKE1GUF9QSU4ocGluKSB8IE1GUF8jI2FmIHwgTUZQX0RJUl9PVVQgfCBNRlBfTFBNXyMjc3RhdGUpKQorCisvKiBHbG9iYWwgR1BJT3MgKi8KKyNkZWZpbmUgR1BJTzlfQ0hBUkdFX25FTgkJCTkKKyNkZWZpbmUgR1BJTzE4X1BPV0VST0ZGCQkJCTE4CisjZGVmaW5lIEdQSU84N19MQ0RfUE9XRVIJCQk4NworCisvKiBVU0IgKi8KKyNkZWZpbmUgR1BJTzEzX1VTQl9ERVRFQ1QJCQkxMworI2RlZmluZSBHUElPMjJfVVNCX0VOQUJMRQkJCTIyCisKKy8qIFNESU8gYml0cyAqLworI2RlZmluZSBHUElPNzhfU0RJT19STwkJCQk3OAorI2RlZmluZSBHUElPMTVfU0RJT19JTlNFUlQJCQkxNQorI2RlZmluZSBHUElPOTFfU0RJT19FTgkJCQk5MQorCisvKiBCbHVldG9vdGggKi8KKyNkZWZpbmUgR1BJTzgzX0JUX09OCQkJCTgzCisKKy8qIEdQUyAqLworI2RlZmluZSBHUElPMjNfR1BTX1VOS05PV04xCQkJMjMKKyNkZWZpbmUgR1BJTzI2X0dQU19PTgkJCQkyNgorI2RlZmluZSBHUElPMjdfR1BTX1JFU0VUCQkJMjcKKyNkZWZpbmUgR1BJTzEwNl9HUFNfVU5LTk9XTjIJCQkxMDYKKyNkZWZpbmUgR1BJTzEwN19HUFNfVU5LTk9XTjMJCQkxMDcKKworLyogR1NNICovCisjZGVmaW5lIEdQSU8yNF9HU01fTU9EX1JFU0VUX0NNRAkJMjQKKyNkZWZpbmUgR1BJTzg4X0dTTV9uTU9EX09OX0NNRAkJCTg4CisjZGVmaW5lIEdQSU85MF9HU01fbk1PRF9PRkZfQ01ECQkJOTAKKyNkZWZpbmUgR1BJTzExNF9HU01fbk1PRF9EVEVfVUFSVF9TVEFURSAJMTE0CisjZGVmaW5lIEdQSU8yNV9HU01fTU9EX09OX1NUQVRFCQkJMjUKKyNkZWZpbmUgR1BJTzExM19HU01fRVZFTlQJCQkxMTMKKworLyogU09VTkQgKi8KKyNkZWZpbmUgR1BJTzEyX0hQSkFDS19JTlNFUlQJCQkxMgorCisvKiBMRURTICovCisjZGVmaW5lIEdQSU8xMF9MRURfbkNoYXJnaW5nCQkJMTAKKyNkZWZpbmUgR1BJTzk3X0xFRF9uQmx1ZQkJCTk3CisjZGVmaW5lIEdQSU85OF9MRURfbk9yYW5nZQkJCTk4CisjZGVmaW5lIEdQSU84Ml9MRURfblZpYnJhCQkJODIKKyNkZWZpbmUgR1BJTzExNV9MRURfbktleWJvYXJkCQkJMTE1CisKKy8qIEtleWJvYXJkICovCisjZGVmaW5lIEdQSU8wX0tFWV9QT1dFUgkJCQkwCisjZGVmaW5lIEdQSU85M19LRVlfVk9MVU1FX1VQCQkJOTMKKyNkZWZpbmUgR1BJTzk0X0tFWV9WT0xVTUVfRE9XTgkJCTk0CisKK2V4dGVybiBzdHJ1Y3QgaW5wdXRfZGV2ICptaW9hNzAxX2V2ZGV2OworZXh0ZXJuIHZvaWQgbWlvYTcwMV9ncGlvX2xwbV9zZXQodW5zaWduZWQgbG9uZyBtZnBfcGluKTsKKworLyogQXNzZW1ibGVyIGV4dGVybmFscyBtaW9hNzAxX2Jvb3RyZXN1bWUuUyAqLworZXh0ZXJuIHUzMiBtaW9hNzAxX2Jvb3RzdHJhcDsKK2V4dGVybiB1MzIgbWlvYTcwMV9qdW1wYWRkcjsKK2V4dGVybiB1MzIgbWlvYTcwMV9ib290c3RyYXBfbGc7CisKKyNlbmRpZiAvKiBfTUlPQTcwMV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvb2hjaS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL29oY2kuaAppbmRleCBlODQ4YTQ3Li45NWI2ZTJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvb2hjaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9vaGNpLmgKQEAgLTcsNiArNywyMiBAQAogCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKik7CiAJdm9pZCAoKmV4aXQpKHN0cnVjdCBkZXZpY2UgKik7CiAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBFTkFCTEVfUE9SVDEJCSgxIDw8IDApCisjZGVmaW5lIEVOQUJMRV9QT1JUMgkJKDEgPDwgMSkKKyNkZWZpbmUgRU5BQkxFX1BPUlQzCQkoMSA8PCAyKQorI2RlZmluZSBFTkFCTEVfUE9SVF9BTEwJCShFTkFCTEVfUE9SVDEgfCBFTkFCTEVfUE9SVDIgfCBFTkFCTEVfUE9SVDMpCisKKyNkZWZpbmUgUE9XRVJfU0VOU0VfTE9XCQkoMSA8PCAzKQorI2RlZmluZSBQT1dFUl9DT05UUk9MX0xPVwkoMSA8PCA0KQorI2RlZmluZSBOT19PQ19QUk9URUNUSU9OCSgxIDw8IDUpCisjZGVmaW5lIE9DX01PREVfR0xPQkFMCQkoMCA8PCA2KQorI2RlZmluZSBPQ19NT0RFX1BFUlBPUlQJCSgxIDw8IDYpCisKKwlpbnQgcG93ZXJfb25fZGVsYXk7CS8qIFBvd2VyIE9uIHRvIFBvd2VyIEdvb2QgdGltZSAtIGluIG1zCisJCQkJICogSENEIG11c3Qgd2FpdCBmb3IgdGhpcyBkdXJhdGlvbiBiZWZvcmUKKwkJCQkgKiBhY2Nlc3NpbmcgYSBwb3dlcmVkIG9uIHBvcnQKKwkJCQkgKi8KIAlpbnQgcG9ydF9tb2RlOwogI2RlZmluZSBQTU1fTlBTX01PREUgICAgICAgICAgIDEKICNkZWZpbmUgUE1NX0dMT0JBTF9NT0RFICAgICAgICAyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXo3Mi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG16NzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMyMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG16NzIuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogR1BJT3MgYW5kIGludGVycnVwdHMgZm9yIFBhbG0gWmlyZTcyIEhhbmRoZWxkIENvbXB1dGVyCisgKgorICogQXV0aG9yczoJQWxleCBPc2Jvcm5lIDxib2JvZmRvb21AZ21haWwuY29tPgorICoJCUphbiBIZXJtYW4gPDJocEBzZXpuYW0uY3o+CisgKgkJU2VyZ2V5IExhcGluIDxzbGFwaW5Ab3NzZmFucy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfSU5DTFVERV9QQUxNWjcyX0hfCisjZGVmaW5lIF9JTkNMVURFX1BBTE1aNzJfSF8KKworLyogUG93ZXIgYW5kIGNvbnRyb2wgKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX0dQSU9fUkVTRVQJCTEKKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX1BPV0VSX0RFVEVDVAkJMAorCisvKiBTRC9NTUMgKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OCQkxNAorI2RlZmluZSBHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTgkJOTgKKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX1NEX1JPIDExNQorCisvKiBUb3VjaHNjcmVlbiAqLworI2RlZmluZSBHUElPX05SX1BBTE1aNzJfV005NzEyX0lSUQkJMjcKKworLyogSVJEQSAtICBkaXNhYmxlIEdQSU8gY29ubmVjdGVkIHRvIFNEIHBpbiBvZiB0cmFuY2VpdmVyIChURkJTNDcxMD8pID8gKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX0lSX0RJU0FCTEUJCTQ5CisKKy8qIFVTQiAqLworI2RlZmluZSBHUElPX05SX1BBTE1aNzJfVVNCX0RFVEVDVF9OCQkxNQorI2RlZmluZSBHUElPX05SX1BBTE1aNzJfVVNCX1BPV0VSCQk5NQorI2RlZmluZSBHUElPX05SX1BBTE1aNzJfVVNCX1BVTExVUAkJMTIKKworLyogTENEL0JhY2tsaWdodCAqLworI2RlZmluZSBHUElPX05SX1BBTE1aNzJfQkxfUE9XRVIJCTIwCisjZGVmaW5lIEdQSU9fTlJfUEFMTVo3Ml9MQ0RfUE9XRVIJCTk2CisKKy8qIExFRCAqLworI2RlZmluZSBHUElPX05SX1BBTE1aNzJfTEVEX0dSRUVOCQk4OAorCisvKiBCbHVldG9vdGggKi8KKyNkZWZpbmUgR1BJT19OUl9QQUxNWjcyX0JUX1BPV0VSCQkxNworI2RlZmluZSBHUElPX05SX1BBTE1aNzJfQlRfUkVTRVQJCTgzCisKKy8qKiBJbml0aWFsIHZhbHVlcyAqKi8KKworLyogQmF0dGVyeSAqLworI2RlZmluZSBQQUxNWjcyX0JBVF9NQVhfVk9MVEFHRQkJNDAwMAkvKiA0LjAwdiBjdXJyZW50IHZvbHRhZ2UgKi8KKyNkZWZpbmUgUEFMTVo3Ml9CQVRfTUlOX1ZPTFRBR0UJCTM1NTAJLyogMy41NXYgY3JpdGljYWwgdm9sdGFnZSAqLworI2RlZmluZSBQQUxNWjcyX0JBVF9NQVhfQ1VSUkVOVAkJMAkvKiB1bmtub2tuICovCisjZGVmaW5lIFBBTE1aNzJfQkFUX01JTl9DVVJSRU5UCQkwCS8qIHVua25vd24gKi8KKyNkZWZpbmUgUEFMTVo3Ml9CQVRfTUFYX0NIQVJHRQkJMQkvKiB1bmtub3duICovCisjZGVmaW5lIFBBTE1aNzJfQkFUX01JTl9DSEFSR0UJCTEJLyogdW5rbm93biAqLworI2RlZmluZSBQQUxNWjcyX01BWF9MSUZFX01JTlMJCTM2MAkvKiBvbi1saWZlIGluIG1pbnV0ZXMgKi8KKworLyogQmFja2xpZ2h0ICovCisjZGVmaW5lIFBBTE1aNzJfTUFYX0lOVEVOU0lUWQkJMHhGRQorI2RlZmluZSBQQUxNWjcyX0RFRkFVTFRfSU5URU5TSVRZCTB4N0UKKyNkZWZpbmUgUEFMTVo3Ml9MSU1JVF9NQVNLCQkweDdGCisjZGVmaW5lIFBBTE1aNzJfUFJFU0NBTEVSCQkweDNGCisjZGVmaW5lIFBBTE1aNzJfUEVSSU9EX05TCQkzNTAwCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0cnVjdCBwYWxtejcyX3Jlc3VtZV9pbmZvIHsKKwl1MzIgbWFnaWMwOwkJLyogMHgwICovCisJdTMyIG1hZ2ljMTsJCS8qIDB4NCAqLworCXUzMiByZXN1bWVfYWRkcjsJLyogMHg4ICovCisJdTMyIHBhZFsxMV07CQkvKiAweGMuLjB4MzcgKi8KKwl1MzIgYXJtX2NvbnRyb2w7CS8qIDB4MzggKi8KKwl1MzIgYXV4X2NvbnRyb2w7CS8qIDB4M2MgKi8KKwl1MzIgdHRiOwkJLyogMHg0MCAqLworCXUzMiBkb21haW5fYWNjZXNzOwkvKiAweDQ0ICovCisJdTMyIHByb2Nlc3NfaWQ7CQkvKiAweDQ4ICovCit9OworI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BtLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcG0uaAppbmRleCAyNjFlNWJjLi44MzM0MjQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcG0uaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcG0uaApAQCAtMTUsNiArMTUsOCBAQAogCXZvaWQJKCpyZXN0b3JlKSh1bnNpZ25lZCBsb25nICopOwogCWludAkoKnZhbGlkKShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpOwogCXZvaWQJKCplbnRlcikoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKKwlpbnQJKCpwcmVwYXJlKSh2b2lkKTsKKwl2b2lkCSgqZmluaXNoKSh2b2lkKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgcHhhX2NwdV9wbV9mbnMgKnB4YV9jcHVfcG1fZm5zOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3Bvb2RsZS5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3Bvb2RsZS5oCmluZGV4IDY3ZGViYzQuLjBiM2U2ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wb29kbGUuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcG9vZGxlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNkZWZpbmUgUE9PRExFX0dQSU9fQUNfSU4JCSgxKQogI2RlZmluZSBQT09ETEVfR1BJT19DTwkJCTE2CiAjZGVmaW5lIFBPT0RMRV9HUElPX1RQX0lOVAkJKDUpCisjZGVmaW5lIFBPT0RMRV9HUElPX1RQX0NTCQkoMjQpCiAjZGVmaW5lIFBPT0RMRV9HUElPX1dBS0VVUAkJKDExKQkvKiBjaGFuZ2UgYmF0dGVyeSAqLwogI2RlZmluZSBQT09ETEVfR1BJT19HQV9JTlQJCSgxMCkKICNkZWZpbmUgUE9PRExFX0dQSU9fSVJfT04JCSgyMikKQEAgLTcwLDYgKzcxLDE0IEBACiAjZGVmaW5lIFBPT0RMRV9TQ09PUF9JT19ESVIJKCBQT09ETEVfU0NPT1BfVlBFTiB8IFBPT0RMRV9TQ09PUF9IU19PVVQgKQogI2RlZmluZSBQT09ETEVfU0NPT1BfSU9fT1VUCSggMCApCiAKKyNkZWZpbmUgUE9PRExFX1NDT09QX0dQSU9fQkFTRQkoTlJfQlVJTFRJTl9HUElPKQorI2RlZmluZSBQT09ETEVfR1BJT19DSEFSR0VfT04JKFBPT0RMRV9TQ09PUF9HUElPX0JBU0UgKyAwKQorI2RlZmluZSBQT09ETEVfR1BJT19DUDQwMQkoUE9PRExFX1NDT09QX0dQSU9fQkFTRSArIDIpCisjZGVmaW5lIFBPT0RMRV9HUElPX1ZQRU4JKFBPT0RMRV9TQ09PUF9HUElPX0JBU0UgKyA3KQorI2RlZmluZSBQT09ETEVfR1BJT19MX1BDTEsJKFBPT0RMRV9TQ09PUF9HUElPX0JBU0UgKyA5KQorI2RlZmluZSBQT09ETEVfR1BJT19MX0xDTEsJKFBPT0RMRV9TQ09PUF9HUElPX0JBU0UgKyAxMCkKKyNkZWZpbmUgUE9PRExFX0dQSU9fSFNfT1VUCShQT09ETEVfU0NPT1BfR1BJT19CQVNFICsgMTEpCisKICNkZWZpbmUgUE9PRExFX0xPQ09NT19HUElPX0FNUF9PTiAgICAgIExPQ09NT19HUElPKDgpCiAjZGVmaW5lIFBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX0wgICAgICBMT0NPTU9fR1BJTygxMCkKICNkZWZpbmUgUE9PRExFX0xPQ09NT19HUElPX01VVEVfUiAgICAgIExPQ09NT19HUElPKDExKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YS1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaAppbmRleCAxMjI4OGNhLi4xNTI5NWQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhLXJlZ3MuaApAQCAtNjksMzAgKzY5LDE4IEBACiAvKgogICogRE1BIENvbnRyb2xsZXIKICAqLwotCi0jZGVmaW5lIERDU1IwCQlfX1JFRygweDQwMDAwMDAwKSAgLyogRE1BIENvbnRyb2wgLyBTdGF0dXMgUmVnaXN0ZXIgZm9yIENoYW5uZWwgMCAqLwotI2RlZmluZSBEQ1NSMQkJX19SRUcoMHg0MDAwMDAwNCkgIC8qIERNQSBDb250cm9sIC8gU3RhdHVzIFJlZ2lzdGVyIGZvciBDaGFubmVsIDEgKi8KLSNkZWZpbmUgRENTUjIJCV9fUkVHKDB4NDAwMDAwMDgpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAyICovCi0jZGVmaW5lIERDU1IzCQlfX1JFRygweDQwMDAwMDBjKSAgLyogRE1BIENvbnRyb2wgLyBTdGF0dXMgUmVnaXN0ZXIgZm9yIENoYW5uZWwgMyAqLwotI2RlZmluZSBEQ1NSNAkJX19SRUcoMHg0MDAwMDAxMCkgIC8qIERNQSBDb250cm9sIC8gU3RhdHVzIFJlZ2lzdGVyIGZvciBDaGFubmVsIDQgKi8KLSNkZWZpbmUgRENTUjUJCV9fUkVHKDB4NDAwMDAwMTQpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCA1ICovCi0jZGVmaW5lIERDU1I2CQlfX1JFRygweDQwMDAwMDE4KSAgLyogRE1BIENvbnRyb2wgLyBTdGF0dXMgUmVnaXN0ZXIgZm9yIENoYW5uZWwgNiAqLwotI2RlZmluZSBEQ1NSNwkJX19SRUcoMHg0MDAwMDAxYykgIC8qIERNQSBDb250cm9sIC8gU3RhdHVzIFJlZ2lzdGVyIGZvciBDaGFubmVsIDcgKi8KLSNkZWZpbmUgRENTUjgJCV9fUkVHKDB4NDAwMDAwMjApICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCA4ICovCi0jZGVmaW5lIERDU1I5CQlfX1JFRygweDQwMDAwMDI0KSAgLyogRE1BIENvbnRyb2wgLyBTdGF0dXMgUmVnaXN0ZXIgZm9yIENoYW5uZWwgOSAqLwotI2RlZmluZSBEQ1NSMTAJCV9fUkVHKDB4NDAwMDAwMjgpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxMCAqLwotI2RlZmluZSBEQ1NSMTEJCV9fUkVHKDB4NDAwMDAwMmMpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxMSAqLwotI2RlZmluZSBEQ1NSMTIJCV9fUkVHKDB4NDAwMDAwMzApICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxMiAqLwotI2RlZmluZSBEQ1NSMTMJCV9fUkVHKDB4NDAwMDAwMzQpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxMyAqLwotI2RlZmluZSBEQ1NSMTQJCV9fUkVHKDB4NDAwMDAwMzgpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxNCAqLwotI2RlZmluZSBEQ1NSMTUJCV9fUkVHKDB4NDAwMDAwM2MpICAvKiBETUEgQ29udHJvbCAvIFN0YXR1cyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAxNSAqLwotCiAjZGVmaW5lIERDU1IoeCkJCV9fUkVHMigweDQwMDAwMDAwLCAoeCkgPDwgMikKIAogI2RlZmluZSBEQ1NSX1JVTgkoMSA8PCAzMSkJLyogUnVuIEJpdCAocmVhZCAvIHdyaXRlKSAqLwogI2RlZmluZSBEQ1NSX05PREVTQwkoMSA8PCAzMCkJLyogTm8tRGVzY3JpcHRvciBGZXRjaCAocmVhZCAvIHdyaXRlKSAqLwogI2RlZmluZSBEQ1NSX1NUT1BJUlFFTgkoMSA8PCAyOSkJLyogU3RvcCBJbnRlcnJ1cHQgRW5hYmxlIChyZWFkIC8gd3JpdGUpICovCi0jaWZkZWYgQ09ORklHX1BYQTI3eAorI2RlZmluZSBEQ1NSX1JFUVBFTkQJKDEgPDwgOCkJLyogUmVxdWVzdCBQZW5kaW5nIChyZWFkLW9ubHkpICovCisjZGVmaW5lIERDU1JfU1RPUFNUQVRFCSgxIDw8IDMpCS8qIFN0b3AgU3RhdGUgKHJlYWQtb25seSkgKi8KKyNkZWZpbmUgRENTUl9FTkRJTlRSCSgxIDw8IDIpCS8qIEVuZCBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KKyNkZWZpbmUgRENTUl9TVEFSVElOVFIJKDEgPDwgMSkJLyogU3RhcnQgSW50ZXJydXB0IChyZWFkIC8gd3JpdGUpICovCisjZGVmaW5lIERDU1JfQlVTRVJSCSgxIDw8IDApCS8qIEJ1cyBFcnJvciBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3eCkgfHwgZGVmaW5lZChDT05GSUdfUFhBM3h4KQogI2RlZmluZSBEQ1NSX0VPUklSUUVOCSgxIDw8IDI4KSAgICAgICAvKiBFbmQgb2YgUmVjZWl2ZSBJbnRlcnJ1cHQgRW5hYmxlIChSL1cpICovCiAjZGVmaW5lIERDU1JfRU9SSk1QRU4JKDEgPDwgMjcpICAgICAgIC8qIEp1bXAgdG8gbmV4dCBkZXNjcmlwdG9yIG9uIEVPUiAqLwogI2RlZmluZSBEQ1NSX0VPUlNUT1BFTgkoMSA8PCAyNikgICAgICAgLyogU1RPUCBvbiBhbiBFT1IgKi8KQEAgLTEwMSwxMSArODksNiBAQAogI2RlZmluZSBEQ1NSX0NNUFNUCSgxIDw8IDEwKSAgICAgICAvKiBUaGUgRGVzY3JpcHRvciBDb21wYXJlIFN0YXR1cyAqLwogI2RlZmluZSBEQ1NSX0VPUklOVFIJKDEgPDwgOSkgICAgICAgIC8qIFRoZSBlbmQgb2YgUmVjZWl2ZSAqLwogI2VuZGlmCi0jZGVmaW5lIERDU1JfUkVRUEVORAkoMSA8PCA4KQkvKiBSZXF1ZXN0IFBlbmRpbmcgKHJlYWQtb25seSkgKi8KLSNkZWZpbmUgRENTUl9TVE9QU1RBVEUJKDEgPDwgMykJLyogU3RvcCBTdGF0ZSAocmVhZC1vbmx5KSAqLwotI2RlZmluZSBEQ1NSX0VORElOVFIJKDEgPDwgMikJLyogRW5kIEludGVycnVwdCAocmVhZCAvIHdyaXRlKSAqLwotI2RlZmluZSBEQ1NSX1NUQVJUSU5UUgkoMSA8PCAxKQkvKiBTdGFydCBJbnRlcnJ1cHQgKHJlYWQgLyB3cml0ZSkgKi8KLSNkZWZpbmUgRENTUl9CVVNFUlIJKDEgPDwgMCkJLyogQnVzIEVycm9yIEludGVycnVwdCAocmVhZCAvIHdyaXRlKSAqLwogCiAjZGVmaW5lIERBTEdOCQlfX1JFRygweDQwMDAwMGEwKSAgLyogRE1BIEFsaWdubWVudCBSZWdpc3RlciAqLwogI2RlZmluZSBESU5UCQlfX1JFRygweDQwMDAwMGYwKSAgLyogRE1BIEludGVycnVwdCBSZWdpc3RlciAqLwpAQCAtMTE0LDE0NSArOTcsOSBAQAogCQkJJl9fUkVHMigweDQwMDAwMTAwLCAoKG4pICYgMHgzZikgPDwgMikgOiBcCiAJCQkmX19SRUcyKDB4NDAwMDExMDAsICgobikgJiAweDNmKSA8PCAyKSkpCiAKLSNkZWZpbmUgRFJDTVIwCQlfX1JFRygweDQwMDAwMTAwKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgRFJFUSAwICovCi0jZGVmaW5lIERSQ01SMQkJX19SRUcoMHg0MDAwMDEwNCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIERSRVEgMSAqLwotI2RlZmluZSBEUkNNUjIJCV9fUkVHKDB4NDAwMDAxMDgpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBJMlMgcmVjZWl2ZSBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SMwkJX19SRUcoMHg0MDAwMDEwYykgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIEkyUyB0cmFuc21pdCBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SNAkJX19SRUcoMHg0MDAwMDExMCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIEJUVUFSVCByZWNlaXZlIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVI1CQlfX1JFRygweDQwMDAwMTE0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgQlRVQVJUIHRyYW5zbWl0IFJlcXVlc3QuICovCi0jZGVmaW5lIERSQ01SNgkJX19SRUcoMHg0MDAwMDExOCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIEZGVUFSVCByZWNlaXZlIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVI3CQlfX1JFRygweDQwMDAwMTFjKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgRkZVQVJUIHRyYW5zbWl0IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVI4CQlfX1JFRygweDQwMDAwMTIwKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgQUM5NyBtaWNyb3Bob25lIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVI5CQlfX1JFRygweDQwMDAwMTI0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgQUM5NyBtb2RlbSByZWNlaXZlIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIxMAkJX19SRUcoMHg0MDAwMDEyOCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIEFDOTcgbW9kZW0gdHJhbnNtaXQgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjExCQlfX1JFRygweDQwMDAwMTJjKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgQUM5NyBhdWRpbyByZWNlaXZlIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIxMgkJX19SRUcoMHg0MDAwMDEzMCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIEFDOTcgYXVkaW8gdHJhbnNtaXQgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjEzCQlfX1JFRygweDQwMDAwMTM0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgU1NQIHJlY2VpdmUgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjE0CQlfX1JFRygweDQwMDAwMTM4KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgU1NQIHRyYW5zbWl0IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIxNQkJX19SRUcoMHg0MDAwMDEzYykgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFNTUDIgcmVjZWl2ZSBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SMTYJCV9fUkVHKDB4NDAwMDAxNDApICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBTU1AyIHRyYW5zbWl0IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIxNwkJX19SRUcoMHg0MDAwMDE0NCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIElDUCByZWNlaXZlIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIxOAkJX19SRUcoMHg0MDAwMDE0OCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIElDUCB0cmFuc21pdCBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SMTkJCV9fUkVHKDB4NDAwMDAxNGMpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBTVFVBUlQgcmVjZWl2ZSBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SMjAJCV9fUkVHKDB4NDAwMDAxNTApICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBTVFVBUlQgdHJhbnNtaXQgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjIxCQlfX1JFRygweDQwMDAwMTU0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgTU1DIHJlY2VpdmUgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjIyCQlfX1JFRygweDQwMDAwMTU4KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgTU1DIHRyYW5zbWl0IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIyMwkJX19SRUcoMHg0MDAwMDE1YykgIC8qIFJlc2VydmVkICovCi0jZGVmaW5lIERSQ01SMjQJCV9fUkVHKDB4NDAwMDAxNjApICAvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBEUkNNUjI1CQlfX1JFRygweDQwMDAwMTY0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgVVNCIGVuZHBvaW50IDEgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjI2CQlfX1JFRygweDQwMDAwMTY4KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgVVNCIGVuZHBvaW50IDIgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjI3CQlfX1JFRygweDQwMDAwMTZDKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgVVNCIGVuZHBvaW50IDMgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjI4CQlfX1JFRygweDQwMDAwMTcwKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgVVNCIGVuZHBvaW50IDQgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjI5CQlfX1JFRygweDQwMDAwMTc0KSAgLyogUmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRFJDTVIzMAkJX19SRUcoMHg0MDAwMDE3OCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFVTQiBlbmRwb2ludCA2IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIzMQkJX19SRUcoMHg0MDAwMDE3QykgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFVTQiBlbmRwb2ludCA3IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIzMgkJX19SRUcoMHg0MDAwMDE4MCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFVTQiBlbmRwb2ludCA4IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIzMwkJX19SRUcoMHg0MDAwMDE4NCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFVTQiBlbmRwb2ludCA5IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIzNAkJX19SRUcoMHg0MDAwMDE4OCkgIC8qIFJlc2VydmVkICovCi0jZGVmaW5lIERSQ01SMzUJCV9fUkVHKDB4NDAwMDAxOEMpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBVU0IgZW5kcG9pbnQgMTEgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjM2CQlfX1JFRygweDQwMDAwMTkwKSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgVVNCIGVuZHBvaW50IDEyIFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVIzNwkJX19SRUcoMHg0MDAwMDE5NCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFVTQiBlbmRwb2ludCAxMyBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SMzgJCV9fUkVHKDB4NDAwMDAxOTgpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBVU0IgZW5kcG9pbnQgMTQgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjM5CQlfX1JFRygweDQwMDAwMTlDKSAgLyogUmVzZXJ2ZWQgKi8KLSNkZWZpbmUgRFJDTVI2NgkJX19SRUcoMHg0MDAwMTEwOCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIFNTUDMgcmVjZWl2ZSBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SNjcJCV9fUkVHKDB4NDAwMDExMEMpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBTU1AzIHRyYW5zbWl0IFJlcXVlc3QgKi8KLSNkZWZpbmUgRFJDTVI2OAkJX19SRUcoMHg0MDAwMTExMCkgIC8qIFJlcXVlc3QgdG8gQ2hhbm5lbCBNYXAgUmVnaXN0ZXIgZm9yIENhbWVyYSBGSUZPIDAgUmVxdWVzdCAqLwotI2RlZmluZSBEUkNNUjY5CQlfX1JFRygweDQwMDAxMTE0KSAgLyogUmVxdWVzdCB0byBDaGFubmVsIE1hcCBSZWdpc3RlciBmb3IgQ2FtZXJhIEZJRk8gMSBSZXF1ZXN0ICovCi0jZGVmaW5lIERSQ01SNzAJCV9fUkVHKDB4NDAwMDExMTgpICAvKiBSZXF1ZXN0IHRvIENoYW5uZWwgTWFwIFJlZ2lzdGVyIGZvciBDYW1lcmEgRklGTyAyIFJlcXVlc3QgKi8KLQotI2RlZmluZSBEUkNNUlJYU0FEUglEUkNNUjIKLSNkZWZpbmUgRFJDTVJUWFNBRFIJRFJDTVIzCi0jZGVmaW5lIERSQ01SUlhCVFJCUglEUkNNUjQKLSNkZWZpbmUgRFJDTVJUWEJUVEhSCURSQ01SNQotI2RlZmluZSBEUkNNUlJYRkZSQlIJRFJDTVI2Ci0jZGVmaW5lIERSQ01SVFhGRlRIUglEUkNNUjcKLSNkZWZpbmUgRFJDTVJSWE1DRFIJRFJDTVI4Ci0jZGVmaW5lIERSQ01SUlhNT0RSCURSQ01SOQotI2RlZmluZSBEUkNNUlRYTU9EUglEUkNNUjEwCi0jZGVmaW5lIERSQ01SUlhQQ0RSCURSQ01SMTEKLSNkZWZpbmUgRFJDTVJUWFBDRFIJRFJDTVIxMgotI2RlZmluZSBEUkNNUlJYU1NEUglEUkNNUjEzCi0jZGVmaW5lIERSQ01SVFhTU0RSCURSQ01SMTQKLSNkZWZpbmUgRFJDTVJSWFNTMkRSICAgRFJDTVIxNQotI2RlZmluZSBEUkNNUlRYU1MyRFIgICBEUkNNUjE2Ci0jZGVmaW5lIERSQ01SUlhJQ0RSCURSQ01SMTcKLSNkZWZpbmUgRFJDTVJUWElDRFIJRFJDTVIxOAotI2RlZmluZSBEUkNNUlJYU1RSQlIJRFJDTVIxOQotI2RlZmluZSBEUkNNUlRYU1RUSFIJRFJDTVIyMAotI2RlZmluZSBEUkNNUlJYTU1DCURSQ01SMjEKLSNkZWZpbmUgRFJDTVJUWE1NQwlEUkNNUjIyCi0jZGVmaW5lIERSQ01SUlhTUzNEUiAgIERSQ01SNjYKLSNkZWZpbmUgRFJDTVJUWFNTM0RSICAgRFJDTVI2NwotI2RlZmluZSBEUkNNUlVEQyh4KQlEUkNNUigoeCkgKyAyNCkKLQogI2RlZmluZSBEUkNNUl9NQVBWTEQJKDEgPDwgNykJLyogTWFwIFZhbGlkIChyZWFkIC8gd3JpdGUpICovCiAjZGVmaW5lIERSQ01SX0NITE5VTQkweDFmCQkvKiBtYXNrIGZvciBDaGFubmVsIE51bWJlciAocmVhZCAvIHdyaXRlKSAqLwogCi0jZGVmaW5lIEREQURSMAkJX19SRUcoMHg0MDAwMDIwMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAwICovCi0jZGVmaW5lIERTQURSMAkJX19SRUcoMHg0MDAwMDIwNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDAgKi8KLSNkZWZpbmUgRFRBRFIwCQlfX1JFRygweDQwMDAwMjA4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMCAqLwotI2RlZmluZSBEQ01EMAkJX19SRUcoMHg0MDAwMDIwYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAwICovCi0jZGVmaW5lIEREQURSMQkJX19SRUcoMHg0MDAwMDIxMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxICovCi0jZGVmaW5lIERTQURSMQkJX19SRUcoMHg0MDAwMDIxNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDEgKi8KLSNkZWZpbmUgRFRBRFIxCQlfX1JFRygweDQwMDAwMjE4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMSAqLwotI2RlZmluZSBEQ01EMQkJX19SRUcoMHg0MDAwMDIxYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxICovCi0jZGVmaW5lIEREQURSMgkJX19SRUcoMHg0MDAwMDIyMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAyICovCi0jZGVmaW5lIERTQURSMgkJX19SRUcoMHg0MDAwMDIyNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDIgKi8KLSNkZWZpbmUgRFRBRFIyCQlfX1JFRygweDQwMDAwMjI4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMiAqLwotI2RlZmluZSBEQ01EMgkJX19SRUcoMHg0MDAwMDIyYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAyICovCi0jZGVmaW5lIEREQURSMwkJX19SRUcoMHg0MDAwMDIzMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAzICovCi0jZGVmaW5lIERTQURSMwkJX19SRUcoMHg0MDAwMDIzNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDMgKi8KLSNkZWZpbmUgRFRBRFIzCQlfX1JFRygweDQwMDAwMjM4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMyAqLwotI2RlZmluZSBEQ01EMwkJX19SRUcoMHg0MDAwMDIzYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAzICovCi0jZGVmaW5lIEREQURSNAkJX19SRUcoMHg0MDAwMDI0MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA0ICovCi0jZGVmaW5lIERTQURSNAkJX19SRUcoMHg0MDAwMDI0NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDQgKi8KLSNkZWZpbmUgRFRBRFI0CQlfX1JFRygweDQwMDAwMjQ4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgNCAqLwotI2RlZmluZSBEQ01ENAkJX19SRUcoMHg0MDAwMDI0YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA0ICovCi0jZGVmaW5lIEREQURSNQkJX19SRUcoMHg0MDAwMDI1MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA1ICovCi0jZGVmaW5lIERTQURSNQkJX19SRUcoMHg0MDAwMDI1NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDUgKi8KLSNkZWZpbmUgRFRBRFI1CQlfX1JFRygweDQwMDAwMjU4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgNSAqLwotI2RlZmluZSBEQ01ENQkJX19SRUcoMHg0MDAwMDI1YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA1ICovCi0jZGVmaW5lIEREQURSNgkJX19SRUcoMHg0MDAwMDI2MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA2ICovCi0jZGVmaW5lIERTQURSNgkJX19SRUcoMHg0MDAwMDI2NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDYgKi8KLSNkZWZpbmUgRFRBRFI2CQlfX1JFRygweDQwMDAwMjY4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgNiAqLwotI2RlZmluZSBEQ01ENgkJX19SRUcoMHg0MDAwMDI2YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA2ICovCi0jZGVmaW5lIEREQURSNwkJX19SRUcoMHg0MDAwMDI3MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA3ICovCi0jZGVmaW5lIERTQURSNwkJX19SRUcoMHg0MDAwMDI3NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDcgKi8KLSNkZWZpbmUgRFRBRFI3CQlfX1JFRygweDQwMDAwMjc4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgNyAqLwotI2RlZmluZSBEQ01ENwkJX19SRUcoMHg0MDAwMDI3YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA3ICovCi0jZGVmaW5lIEREQURSOAkJX19SRUcoMHg0MDAwMDI4MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA4ICovCi0jZGVmaW5lIERTQURSOAkJX19SRUcoMHg0MDAwMDI4NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDggKi8KLSNkZWZpbmUgRFRBRFI4CQlfX1JFRygweDQwMDAwMjg4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgOCAqLwotI2RlZmluZSBEQ01EOAkJX19SRUcoMHg0MDAwMDI4YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA4ICovCi0jZGVmaW5lIEREQURSOQkJX19SRUcoMHg0MDAwMDI5MCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA5ICovCi0jZGVmaW5lIERTQURSOQkJX19SRUcoMHg0MDAwMDI5NCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDkgKi8KLSNkZWZpbmUgRFRBRFI5CQlfX1JFRygweDQwMDAwMjk4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgOSAqLwotI2RlZmluZSBEQ01EOQkJX19SRUcoMHg0MDAwMDI5YykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCA5ICovCi0jZGVmaW5lIEREQURSMTAJCV9fUkVHKDB4NDAwMDAyYTApICAvKiBETUEgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTAgKi8KLSNkZWZpbmUgRFNBRFIxMAkJX19SRUcoMHg0MDAwMDJhNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDEwICovCi0jZGVmaW5lIERUQURSMTAJCV9fUkVHKDB4NDAwMDAyYTgpICAvKiBETUEgVGFyZ2V0IEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxMCAqLwotI2RlZmluZSBEQ01EMTAJCV9fUkVHKDB4NDAwMDAyYWMpICAvKiBETUEgQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTAgKi8KLSNkZWZpbmUgRERBRFIxMQkJX19SRUcoMHg0MDAwMDJiMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxMSAqLwotI2RlZmluZSBEU0FEUjExCQlfX1JFRygweDQwMDAwMmI0KSAgLyogRE1BIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTEgKi8KLSNkZWZpbmUgRFRBRFIxMQkJX19SRUcoMHg0MDAwMDJiOCkgIC8qIERNQSBUYXJnZXQgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDExICovCi0jZGVmaW5lIERDTUQxMQkJX19SRUcoMHg0MDAwMDJiYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxMSAqLwotI2RlZmluZSBEREFEUjEyCQlfX1JFRygweDQwMDAwMmMwKSAgLyogRE1BIERlc2NyaXB0b3IgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDEyICovCi0jZGVmaW5lIERTQURSMTIJCV9fUkVHKDB4NDAwMDAyYzQpICAvKiBETUEgU291cmNlIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxMiAqLwotI2RlZmluZSBEVEFEUjEyCQlfX1JFRygweDQwMDAwMmM4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTIgKi8KLSNkZWZpbmUgRENNRDEyCQlfX1JFRygweDQwMDAwMmNjKSAgLyogRE1BIENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDEyICovCi0jZGVmaW5lIEREQURSMTMJCV9fUkVHKDB4NDAwMDAyZDApICAvKiBETUEgRGVzY3JpcHRvciBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTMgKi8KLSNkZWZpbmUgRFNBRFIxMwkJX19SRUcoMHg0MDAwMDJkNCkgIC8qIERNQSBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDEzICovCi0jZGVmaW5lIERUQURSMTMJCV9fUkVHKDB4NDAwMDAyZDgpICAvKiBETUEgVGFyZ2V0IEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxMyAqLwotI2RlZmluZSBEQ01EMTMJCV9fUkVHKDB4NDAwMDAyZGMpICAvKiBETUEgQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTMgKi8KLSNkZWZpbmUgRERBRFIxNAkJX19SRUcoMHg0MDAwMDJlMCkgIC8qIERNQSBEZXNjcmlwdG9yIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxNCAqLwotI2RlZmluZSBEU0FEUjE0CQlfX1JFRygweDQwMDAwMmU0KSAgLyogRE1BIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTQgKi8KLSNkZWZpbmUgRFRBRFIxNAkJX19SRUcoMHg0MDAwMDJlOCkgIC8qIERNQSBUYXJnZXQgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDE0ICovCi0jZGVmaW5lIERDTUQxNAkJX19SRUcoMHg0MDAwMDJlYykgIC8qIERNQSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxNCAqLwotI2RlZmluZSBEREFEUjE1CQlfX1JFRygweDQwMDAwMmYwKSAgLyogRE1BIERlc2NyaXB0b3IgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDE1ICovCi0jZGVmaW5lIERTQURSMTUJCV9fUkVHKDB4NDAwMDAyZjQpICAvKiBETUEgU291cmNlIEFkZHJlc3MgUmVnaXN0ZXIgQ2hhbm5lbCAxNSAqLwotI2RlZmluZSBEVEFEUjE1CQlfX1JFRygweDQwMDAwMmY4KSAgLyogRE1BIFRhcmdldCBBZGRyZXNzIFJlZ2lzdGVyIENoYW5uZWwgMTUgKi8KLSNkZWZpbmUgRENNRDE1CQlfX1JFRygweDQwMDAwMmZjKSAgLyogRE1BIENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciBDaGFubmVsIDE1ICovCi0KICNkZWZpbmUgRERBRFIoeCkJX19SRUcyKDB4NDAwMDAyMDAsICh4KSA8PCA0KQogI2RlZmluZSBEU0FEUih4KQlfX1JFRzIoMHg0MDAwMDIwNCwgKHgpIDw8IDQpCiAjZGVmaW5lIERUQURSKHgpCV9fUkVHMigweDQwMDAwMjA4LCAoeCkgPDwgNCkKQEAgLTQxOCw5MSArMjY1LDEzIEBACiAKIAogLyoKLSAqIEkyQyByZWdpc3RlcnMKKyAqIEkyQyByZWdpc3RlcnMgLSBtb3ZlZCBpbnRvIGRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKICAqLwogCi0jZGVmaW5lIElCTVIJCV9fUkVHKDB4NDAzMDE2ODApICAvKiBJMkMgQnVzIE1vbml0b3IgUmVnaXN0ZXIgLSBJQk1SICovCi0jZGVmaW5lIElEQlIJCV9fUkVHKDB4NDAzMDE2ODgpICAvKiBJMkMgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgLSBJREJSICovCi0jZGVmaW5lIElDUgkJX19SRUcoMHg0MDMwMTY5MCkgIC8qIEkyQyBDb250cm9sIFJlZ2lzdGVyIC0gSUNSICovCi0jZGVmaW5lIElTUgkJX19SRUcoMHg0MDMwMTY5OCkgIC8qIEkyQyBTdGF0dXMgUmVnaXN0ZXIgLSBJU1IgKi8KLSNkZWZpbmUgSVNBUgkJX19SRUcoMHg0MDMwMTZBMCkgIC8qIEkyQyBTbGF2ZSBBZGRyZXNzIFJlZ2lzdGVyIC0gSVNBUiAqLwotCi0jZGVmaW5lIFBXUklCTVIgICAgX19SRUcoMHg0MGYwMDE4MCkgIC8qIFBvd2VyIEkyQyBCdXMgTW9uaXRvciBSZWdpc3Rlci1JQk1SICovCi0jZGVmaW5lIFBXUklEQlIgICAgX19SRUcoMHg0MGYwMDE4OCkgIC8qIFBvd2VyIEkyQyBEYXRhIEJ1ZmZlciBSZWdpc3Rlci1JREJSICovCi0jZGVmaW5lIFBXUklDUiBfX1JFRygweDQwZjAwMTkwKSAgLyogUG93ZXIgSTJDIENvbnRyb2wgUmVnaXN0ZXIgLSBJQ1IgKi8KLSNkZWZpbmUgUFdSSVNSIF9fUkVHKDB4NDBmMDAxOTgpICAvKiBQb3dlciBJMkMgU3RhdHVzIFJlZ2lzdGVyIC0gSVNSICovCi0jZGVmaW5lIFBXUklTQVIgICAgX19SRUcoMHg0MGYwMDFBMCkgIC8qUG93ZXIgSTJDIFNsYXZlIEFkZHJlc3MgUmVnaXN0ZXItSVNBUiAqLwotCi0jZGVmaW5lIElDUl9TVEFSVAkoMSA8PCAwKQkgICAvKiBzdGFydCBiaXQgKi8KLSNkZWZpbmUgSUNSX1NUT1AJKDEgPDwgMSkJICAgLyogc3RvcCBiaXQgKi8KLSNkZWZpbmUgSUNSX0FDS05BSwkoMSA8PCAyKQkgICAvKiBzZW5kIEFDSygwKSBvciBOQUsoMSkgKi8KLSNkZWZpbmUgSUNSX1RCCQkoMSA8PCAzKQkgICAvKiB0cmFuc2ZlciBieXRlIGJpdCAqLwotI2RlZmluZSBJQ1JfTUEJCSgxIDw8IDQpCSAgIC8qIG1hc3RlciBhYm9ydCAqLwotI2RlZmluZSBJQ1JfU0NMRQkoMSA8PCA1KQkgICAvKiBtYXN0ZXIgY2xvY2sgZW5hYmxlICovCi0jZGVmaW5lIElDUl9JVUUJCSgxIDw8IDYpCSAgIC8qIHVuaXQgZW5hYmxlICovCi0jZGVmaW5lIElDUl9HQ0QJCSgxIDw8IDcpCSAgIC8qIGdlbmVyYWwgY2FsbCBkaXNhYmxlICovCi0jZGVmaW5lIElDUl9JVEVJRQkoMSA8PCA4KQkgICAvKiBlbmFibGUgdHggaW50ZXJydXB0cyAqLwotI2RlZmluZSBJQ1JfSVJGSUUJKDEgPDwgOSkJICAgLyogZW5hYmxlIHJ4IGludGVycnVwdHMgKi8KLSNkZWZpbmUgSUNSX0JFSUUJKDEgPDwgMTApCSAgIC8qIGVuYWJsZSBidXMgZXJyb3IgaW50cyAqLwotI2RlZmluZSBJQ1JfU1NESUUJKDEgPDwgMTEpCSAgIC8qIHNsYXZlIFNUT1AgZGV0ZWN0ZWQgaW50IGVuYWJsZSAqLwotI2RlZmluZSBJQ1JfQUxESUUJKDEgPDwgMTIpCSAgIC8qIGVuYWJsZSBhcmJpdHJhdGlvbiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSUNSX1NBRElFCSgxIDw8IDEzKQkgICAvKiBzbGF2ZSBhZGRyZXNzIGRldGVjdGVkIGludCBlbmFibGUgKi8KLSNkZWZpbmUgSUNSX1VSCQkoMSA8PCAxNCkJICAgLyogdW5pdCByZXNldCAqLwotCi0jZGVmaW5lIElTUl9SV00JCSgxIDw8IDApCSAgIC8qIHJlYWQvd3JpdGUgbW9kZSAqLwotI2RlZmluZSBJU1JfQUNLTkFLCSgxIDw8IDEpCSAgIC8qIGFjay9uYWsgc3RhdHVzICovCi0jZGVmaW5lIElTUl9VQgkJKDEgPDwgMikJICAgLyogdW5pdCBidXN5ICovCi0jZGVmaW5lIElTUl9JQkIJCSgxIDw8IDMpCSAgIC8qIGJ1cyBidXN5ICovCi0jZGVmaW5lIElTUl9TU0QJCSgxIDw8IDQpCSAgIC8qIHNsYXZlIHN0b3AgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgSVNSX0FMRAkJKDEgPDwgNSkJICAgLyogYXJiaXRyYXRpb24gbG9zcyBkZXRlY3RlZCAqLwotI2RlZmluZSBJU1JfSVRFCQkoMSA8PCA2KQkgICAvKiB0eCBidWZmZXIgZW1wdHkgKi8KLSNkZWZpbmUgSVNSX0lSRgkJKDEgPDwgNykJICAgLyogcnggYnVmZmVyIGZ1bGwgKi8KLSNkZWZpbmUgSVNSX0dDQUQJKDEgPDwgOCkJICAgLyogZ2VuZXJhbCBjYWxsIGFkZHJlc3MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgSVNSX1NBRAkJKDEgPDwgOSkJICAgLyogc2xhdmUgYWRkcmVzcyBkZXRlY3RlZCAqLwotI2RlZmluZSBJU1JfQkVECQkoMSA8PCAxMCkJICAgLyogYnVzIGVycm9yIG5vIEFDSy9OQUsgKi8KLQotCiAvKgotICogU2VyaWFsIEF1ZGlvIENvbnRyb2xsZXIKKyAqIFNlcmlhbCBBdWRpbyBDb250cm9sbGVyIC0gbW92ZWQgaW50byBzb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYwogICovCiAKLSNkZWZpbmUgU0FDUjAJCV9fUkVHKDB4NDA0MDAwMDApICAvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTQUNSMQkJX19SRUcoMHg0MDQwMDAwNCkgIC8qIFNlcmlhbCBBdWRpbyBJIDIgUy9NU0ItSnVzdGlmaWVkIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0FTUjAJCV9fUkVHKDB4NDA0MDAwMEMpICAvKiBTZXJpYWwgQXVkaW8gSSAyIFMvTVNCLUp1c3RpZmllZCBJbnRlcmZhY2UgYW5kIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNBSU1SCQlfX1JFRygweDQwNDAwMDE0KSAgLyogU2VyaWFsIEF1ZGlvIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNBSUNSCQlfX1JFRygweDQwNDAwMDE4KSAgLyogU2VyaWFsIEF1ZGlvIEludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLwotI2RlZmluZSBTQURJVgkJX19SRUcoMHg0MDQwMDA2MCkgIC8qIEF1ZGlvIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIuICovCi0jZGVmaW5lIFNBRFIJCV9fUkVHKDB4NDA0MDAwODApICAvKiBTZXJpYWwgQXVkaW8gRGF0YSBSZWdpc3RlciAoVFggYW5kIFJYIEZJRk8gYWNjZXNzIFJlZ2lzdGVyKS4gKi8KLQotI2RlZmluZSBTQUNSMF9SRlRIKHgpCSgoeCkgPDwgMTIpCS8qIFJ4IEZJRk8gSW50ZXJydXB0IG9yIERNQSBUcmlnZ2VyIFRocmVzaG9sZCAqLwotI2RlZmluZSBTQUNSMF9URlRIKHgpCSgoeCkgPDwgOCkJLyogVHggRklGTyBJbnRlcnJ1cHQgb3IgRE1BIFRyaWdnZXIgVGhyZXNob2xkICovCi0jZGVmaW5lIFNBQ1IwX1NUUkYJKDEgPDwgNSkJLyogRklGTyBTZWxlY3QgZm9yIEVGV1IgU3BlY2lhbCBGdW5jdGlvbiAqLwotI2RlZmluZSBTQUNSMF9FRldSCSgxIDw8IDQpCS8qIEVuYWJsZSBFRldSIEZ1bmN0aW9uICAqLwotI2RlZmluZSBTQUNSMF9SU1QJKDEgPDwgMykJLyogRklGTywgaTJzIFJlZ2lzdGVyIFJlc2V0ICovCi0jZGVmaW5lIFNBQ1IwX0JDS0QJKDEgPDwgMikgCS8qIEJpdCBDbG9jayBEaXJlY3Rpb24gKi8KLSNkZWZpbmUgU0FDUjBfRU5CCSgxIDw8IDApCS8qIEVuYWJsZSBJMlMgTGluayAqLwotI2RlZmluZSBTQUNSMV9FTkxCRgkoMSA8PCA1KQkvKiBFbmFibGUgTG9vcGJhY2sgKi8KLSNkZWZpbmUgU0FDUjFfRFJQTAkoMSA8PCA0KSAJLyogRGlzYWJsZSBSZXBsYXlpbmcgRnVuY3Rpb24gKi8KLSNkZWZpbmUgU0FDUjFfRFJFQwkoMSA8PCAzKQkvKiBEaXNhYmxlIFJlY29yZGluZyBGdW5jdGlvbiAqLwotI2RlZmluZSBTQUNSMV9BTVNMCSgxIDw8IDApCS8qIFNwZWNpZnkgQWx0ZXJuYXRlIE1vZGUgKi8KLQotI2RlZmluZSBTQVNSMF9JMlNPRkYJKDEgPDwgNykJLyogQ29udHJvbGxlciBTdGF0dXMgKi8KLSNkZWZpbmUgU0FTUjBfUk9SCSgxIDw8IDYpCS8qIFJ4IEZJRk8gT3ZlcnJ1biAqLwotI2RlZmluZSBTQVNSMF9UVVIJKDEgPDwgNSkJLyogVHggRklGTyBVbmRlcnJ1biAqLwotI2RlZmluZSBTQVNSMF9SRlMJKDEgPDwgNCkJLyogUnggRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KLSNkZWZpbmUgU0FTUjBfVEZTCSgxIDw8IDMpCS8qIFR4IEZJRk8gU2VydmljZSBSZXF1ZXN0ICovCi0jZGVmaW5lIFNBU1IwX0JTWQkoMSA8PCAyKQkvKiBJMlMgQnVzeSAqLwotI2RlZmluZSBTQVNSMF9STkUJKDEgPDwgMSkJLyogUnggRklGTyBOb3QgRW1wdHkgKi8KLSNkZWZpbmUgU0FTUjBfVE5GCSgxIDw8IDApIAkvKiBUeCBGSUZPIE5vdCBFbXB0eSAqLwotCi0jZGVmaW5lIFNBSUNSX1JPUgkoMSA8PCA2KQkvKiBDbGVhciBSeCBGSUZPIE92ZXJydW4gSW50ZXJydXB0ICovCi0jZGVmaW5lIFNBSUNSX1RVUgkoMSA8PCA1KQkvKiBDbGVhciBUeCBGSUZPIFVuZGVycnVuIEludGVycnVwdCAqLwotCi0jZGVmaW5lIFNBSU1SX1JPUgkoMSA8PCA2KQkvKiBFbmFibGUgUnggRklGTyBPdmVycnVuIENvbmRpdGlvbiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0FJTVJfVFVSCSgxIDw8IDUpCS8qIEVuYWJsZSBUeCBGSUZPIFVuZGVycnVuIENvbmRpdGlvbiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0FJTVJfUkZTCSgxIDw8IDQpCS8qIEVuYWJsZSBSeCBGSUZPIFNlcnZpY2UgSW50ZXJydXB0ICovCi0jZGVmaW5lIFNBSU1SX1RGUwkoMSA8PCAzKQkvKiBFbmFibGUgVHggRklGTyBTZXJ2aWNlIEludGVycnVwdCAqLwotCiAvKgogICogQUM5NyBDb250cm9sbGVyIHJlZ2lzdGVycwogICovCkBAIC05ODksNzcgKzc1OCw2IEBACiAKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUFhBMjd4KSB8fCBkZWZpbmVkKENPTkZJR19QWEEzeHgpCi0vKgotICogVUhDOiBVU0IgSG9zdCBDb250cm9sbGVyIChPSENJLWxpa2UpIHJlZ2lzdGVyIGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgVUhDX0JBU0VfUEhZUwkoMHg0QzAwMDAwMCkKLSNkZWZpbmUgVUhDUkVWCQlfX1JFRygweDRDMDAwMDAwKSAvKiBVSEMgSENJIFNwZWMgUmV2aXNpb24gKi8KLSNkZWZpbmUgVUhDSENPTgkJX19SRUcoMHg0QzAwMDAwNCkgLyogVUhDIEhvc3QgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBVSENDT01TCQlfX1JFRygweDRDMDAwMDA4KSAvKiBVSEMgQ29tbWFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUhDSU5UUwkJX19SRUcoMHg0QzAwMDAwQykgLyogVUhDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVUhDSU5URQkJX19SRUcoMHg0QzAwMDAxMCkgLyogVUhDIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgVUhDSU5URAkJX19SRUcoMHg0QzAwMDAxNCkgLyogVUhDIEludGVycnVwdCBEaXNhYmxlICovCi0jZGVmaW5lIFVIQ0hDQ0EJCV9fUkVHKDB4NEMwMDAwMTgpIC8qIFVIQyBIb3N0IENvbnRyb2xsZXIgQ29tbS4gQXJlYSAqLwotI2RlZmluZSBVSENQQ0VECQlfX1JFRygweDRDMDAwMDFDKSAvKiBVSEMgUGVyaW9kIEN1cnJlbnQgRW5kcHQgRGVzY3IgKi8KLSNkZWZpbmUgVUhDQ0hFRAkJX19SRUcoMHg0QzAwMDAyMCkgLyogVUhDIENvbnRyb2wgSGVhZCBFbmRwdCBEZXNjciAqLwotI2RlZmluZSBVSENDQ0VECQlfX1JFRygweDRDMDAwMDI0KSAvKiBVSEMgQ29udHJvbCBDdXJyZW50IEVuZHB0IERlc2NyICovCi0jZGVmaW5lIFVIQ0JIRUQJCV9fUkVHKDB4NEMwMDAwMjgpIC8qIFVIQyBCdWxrIEhlYWQgRW5kcHQgRGVzY3IgKi8KLSNkZWZpbmUgVUhDQkNFRAkJX19SRUcoMHg0QzAwMDAyQykgLyogVUhDIEJ1bGsgQ3VycmVudCBFbmRwdCBEZXNjciAqLwotI2RlZmluZSBVSENESEVBRAlfX1JFRygweDRDMDAwMDMwKSAvKiBVSEMgRG9uZSBIZWFkICovCi0jZGVmaW5lIFVIQ0ZNSQkJX19SRUcoMHg0QzAwMDAzNCkgLyogVUhDIEZyYW1lIEludGVydmFsICovCi0jZGVmaW5lIFVIQ0ZNUgkJX19SRUcoMHg0QzAwMDAzOCkgLyogVUhDIEZyYW1lIFJlbWFpbmluZyAqLwotI2RlZmluZSBVSENGTU4JCV9fUkVHKDB4NEMwMDAwM0MpIC8qIFVIQyBGcmFtZSBOdW1iZXIgKi8KLSNkZWZpbmUgVUhDUEVSUwkJX19SRUcoMHg0QzAwMDA0MCkgLyogVUhDIFBlcmlvZGljIFN0YXJ0ICovCi0jZGVmaW5lIFVIQ0xTCQlfX1JFRygweDRDMDAwMDQ0KSAvKiBVSEMgTG93IFNwZWVkIFRocmVzaG9sZCAqLwotCi0jZGVmaW5lIFVIQ1JIREEJCV9fUkVHKDB4NEMwMDAwNDgpIC8qIFVIQyBSb290IEh1YiBEZXNjcmlwdG9yIEEgKi8KLSNkZWZpbmUgVUhDUkhEQV9OT0NQCSgxIDw8IDEyKQkvKiBObyBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiAqLwotCi0jZGVmaW5lIFVIQ1JIREIJCV9fUkVHKDB4NEMwMDAwNEMpIC8qIFVIQyBSb290IEh1YiBEZXNjcmlwdG9yIEIgKi8KLSNkZWZpbmUgVUhDUkhTCQlfX1JFRygweDRDMDAwMDUwKSAvKiBVSEMgUm9vdCBIdWIgU3RhdHVzICovCi0jZGVmaW5lIFVIQ1JIUFMxCV9fUkVHKDB4NEMwMDAwNTQpIC8qIFVIQyBSb290IEh1YiBQb3J0IDEgU3RhdHVzICovCi0jZGVmaW5lIFVIQ1JIUFMyCV9fUkVHKDB4NEMwMDAwNTgpIC8qIFVIQyBSb290IEh1YiBQb3J0IDIgU3RhdHVzICovCi0jZGVmaW5lIFVIQ1JIUFMzCV9fUkVHKDB4NEMwMDAwNUMpIC8qIFVIQyBSb290IEh1YiBQb3J0IDMgU3RhdHVzICovCi0KLSNkZWZpbmUgVUhDU1RBVAkJX19SRUcoMHg0QzAwMDA2MCkgLyogVUhDIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBVSENTVEFUX1VQUzMJKDEgPDwgMTYpCS8qIFVTQiBQb3dlciBTZW5zZSBQb3J0MyAqLwotI2RlZmluZSBVSENTVEFUX1NCTUFJCSgxIDw8IDE1KQkvKiBTeXN0ZW0gQnVzIE1hc3RlciBBYm9ydCBJbnRlcnJ1cHQqLwotI2RlZmluZSBVSENTVEFUX1NCVEFJCSgxIDw8IDE0KQkvKiBTeXN0ZW0gQnVzIFRhcmdldCBBYm9ydCBJbnRlcnJ1cHQqLwotI2RlZmluZSBVSENTVEFUX1VQUkkJKDEgPDwgMTMpCS8qIFVTQiBQb3J0IFJlc3VtZSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVUhDU1RBVF9VUFMyCSgxIDw8IDEyKQkvKiBVU0IgUG93ZXIgU2Vuc2UgUG9ydCAyICovCi0jZGVmaW5lIFVIQ1NUQVRfVVBTMQkoMSA8PCAxMSkJLyogVVNCIFBvd2VyIFNlbnNlIFBvcnQgMSAqLwotI2RlZmluZSBVSENTVEFUX0hUQQkoMSA8PCAxMCkJLyogSENJIFRhcmdldCBBYm9ydCAqLwotI2RlZmluZSBVSENTVEFUX0hCQQkoMSA8PCA4KQkvKiBIQ0kgQnVmZmVyIEFjdGl2ZSAqLwotI2RlZmluZSBVSENTVEFUX1JXVUUJKDEgPDwgNykJLyogSENJIFJlbW90ZSBXYWtlIFVwIEV2ZW50ICovCi0KLSNkZWZpbmUgVUhDSFIgICAgICAgICAgIF9fUkVHKDB4NEMwMDAwNjQpIC8qIFVIQyBSZXNldCBSZWdpc3RlciAqLwotI2RlZmluZSBVSENIUl9TU0VQMwkoMSA8PCAxMSkJLyogU2xlZXAgU3RhbmRieSBFbmFibGUgZm9yIFBvcnQzICovCi0jZGVmaW5lIFVIQ0hSX1NTRVAyCSgxIDw8IDEwKQkvKiBTbGVlcCBTdGFuZGJ5IEVuYWJsZSBmb3IgUG9ydDIgKi8KLSNkZWZpbmUgVUhDSFJfU1NFUDEJKDEgPDwgOSkJLyogU2xlZXAgU3RhbmRieSBFbmFibGUgZm9yIFBvcnQxICovCi0jZGVmaW5lIFVIQ0hSX1BDUEwJKDEgPDwgNykJLyogUG93ZXIgY29udHJvbCBwb2xhcml0eSBsb3cgKi8KLSNkZWZpbmUgVUhDSFJfUFNQTAkoMSA8PCA2KQkvKiBQb3dlciBzZW5zZSBwb2xhcml0eSBsb3cgKi8KLSNkZWZpbmUgVUhDSFJfU1NFCSgxIDw8IDUpCS8qIFNsZWVwIFN0YW5kYnkgRW5hYmxlICovCi0jZGVmaW5lIFVIQ0hSX1VJVAkoMSA8PCA0KQkvKiBVU0IgSW50ZXJydXB0IFRlc3QgKi8KLSNkZWZpbmUgVUhDSFJfU1NEQwkoMSA8PCAzKQkvKiBTaW11bGF0aW9uIFNjYWxlIERvd24gQ2xvY2sgKi8KLSNkZWZpbmUgVUhDSFJfQ0dSCSgxIDw8IDIpCS8qIENsb2NrIEdlbmVyYXRpb24gUmVzZXQgKi8KLSNkZWZpbmUgVUhDSFJfRkhSCSgxIDw8IDEpCS8qIEZvcmNlIEhvc3QgQ29udHJvbGxlciBSZXNldCAqLwotI2RlZmluZSBVSENIUl9GU0JJUgkoMSA8PCAwKQkvKiBGb3JjZSBTeXN0ZW0gQnVzIElmYWNlIFJlc2V0ICovCi0KLSNkZWZpbmUgVUhDSElFICAgICAgICAgIF9fUkVHKDB4NEMwMDAwNjgpIC8qIFVIQyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyKi8KLSNkZWZpbmUgVUhDSElFX1VQUzNJRQkoMSA8PCAxNCkJLyogUG93ZXIgU2Vuc2UgUG9ydDMgSW50RW4gKi8KLSNkZWZpbmUgVUhDSElFX1VQUklFCSgxIDw8IDEzKQkvKiBQb3J0IFJlc3VtZSBJbnRFbiAqLwotI2RlZmluZSBVSENISUVfVVBTMklFCSgxIDw8IDEyKQkvKiBQb3dlciBTZW5zZSBQb3J0MiBJbnRFbiAqLwotI2RlZmluZSBVSENISUVfVVBTMUlFCSgxIDw8IDExKQkvKiBQb3dlciBTZW5zZSBQb3J0MSBJbnRFbiAqLwotI2RlZmluZSBVSENISUVfVEFJRQkoMSA8PCAxMCkJLyogSENJIEludGVyZmFjZSBUcmFuc2ZlciBBYm9ydAotCQkJCQkgICBJbnRlcnJ1cHQgRW5hYmxlKi8KLSNkZWZpbmUgVUhDSElFX0hCQUlFCSgxIDw8IDgpCS8qIEhDSSBCdWZmZXIgQWN0aXZlIEludEVuICovCi0jZGVmaW5lIFVIQ0hJRV9SV0lFCSgxIDw8IDcpCS8qIFJlbW90ZSBXYWtlLXVwIEludEVuICovCi0KLSNkZWZpbmUgVUhDSElUICAgICAgICAgIF9fUkVHKDB4NEMwMDAwNkMpIC8qIFVIQyBJbnRlcnJ1cHQgVGVzdCByZWdpc3RlciAqLwotCi0jZW5kaWYgLyogQ09ORklHX1BYQTI3eCB8fCBDT05GSUdfUFhBM3h4ICovCi0KIC8qIFBXUk1PREUgcmVnaXN0ZXIgTSBmaWVsZCB2YWx1ZXMgKi8KIAogI2RlZmluZSBQV1JNT0RFX0lETEUJCTB4MQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTN4eC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaAppbmRleCAzOWViNjgzLi5iMWZjZDEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaApAQCAtMTMxLDYgKzEzMSwyOCBAQAogI2RlZmluZSBDS0VOQgkJX19SRUcoMHg0MTM0MDAxMCkJLyogQiBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQUM5N19ESVYJX19SRUcoMHg0MTM0MDAxNCkJLyogQUM5NyBjbG9jayBkaXZpc29yIHZhbHVlIHJlZ2lzdGVyICovCiAKKyNkZWZpbmUgQUNDUl9YUERJUwkJKDEgPDwgMzEpCS8qIENvcmUgUExMIE91dHB1dCBEaXNhYmxlICovCisjZGVmaW5lIEFDQ1JfU1BESVMJCSgxIDw8IDMwKQkvKiBTeXN0ZW0gUExMIE91dHB1dCBEaXNhYmxlICovCisjZGVmaW5lIEFDQ1JfRDBDUwkJKDEgPDwgMjYpCS8qIEQwIE1vZGUgQ2xvY2sgU2VsZWN0ICovCisjZGVmaW5lIEFDQ1JfUENDRQkJKDEgPDwgMTEpCS8qIFBvd2VyIE1vZGUgQ2hhbmdlIENsb2NrIEVuYWJsZSAqLworI2RlZmluZSBBQ0NSX0REUl9EMENTCQkoMSA8PCA3KQkvKiBERFIgU0RSQU0gY2xvY2sgZnJlcXVlbmN5IGluIEQwQ1MgKFBYQTMxeCBvbmx5KSAqLworCisjZGVmaW5lIEFDQ1JfU01DRlNfTUFTSwkJKDB4NyA8PCAyMykJLyogU3RhdGljIE1lbW9yeSBDb250cm9sbGVyIEZyZXF1ZW5jeSBTZWxlY3QgKi8KKyNkZWZpbmUgQUNDUl9TRkxGU19NQVNLCQkoMHgzIDw8IDE4KQkvKiBGcmVxdWVuY3kgU2VsZWN0IGZvciBJbnRlcm5hbCBNZW1vcnkgQ29udHJvbGxlciAqLworI2RlZmluZSBBQ0NSX1hTUENMS19NQVNLCSgweDMgPDwgMTYpCS8qIENvcmUgRnJlcXVlbmN5IGR1cmluZyBGcmVxdWVuY3kgQ2hhbmdlICovCisjZGVmaW5lIEFDQ1JfSFNTX01BU0sJCSgweDMgPDwgMTQpCS8qIFN5c3RlbSBCdXMtQ2xvY2sgRnJlcXVlbmN5IFNlbGVjdCAqLworI2RlZmluZSBBQ0NSX0RNQ0ZTX01BU0sJCSgweDMgPDwgMTIpCS8qIER5bmFtaWMgTWVtb3J5IENvbnRyb2xsZXIgQ2xvY2sgRnJlcXVlbmN5IFNlbGVjdCAqLworI2RlZmluZSBBQ0NSX1hOX01BU0sJCSgweDcgPDwgOCkJLyogQ29yZSBQTEwgVHVyYm8tTW9kZS10by1SdW4tTW9kZSBSYXRpbyAqLworI2RlZmluZSBBQ0NSX1hMX01BU0sJCSgweDFmKQkJLyogQ29yZSBQTEwgUnVuLU1vZGUtdG8tT3NjaWxsYXRvciBSYXRpbyAqLworCisjZGVmaW5lIEFDQ1JfU01DRlMoeCkJCSgoKHgpICYgMHg3KSA8PCAyMykKKyNkZWZpbmUgQUNDUl9TRkxGUyh4KQkJKCgoeCkgJiAweDMpIDw8IDE4KQorI2RlZmluZSBBQ0NSX1hTUENMSyh4KQkJKCgoeCkgJiAweDMpIDw8IDE2KQorI2RlZmluZSBBQ0NSX0hTUyh4KQkJKCgoeCkgJiAweDMpIDw8IDE0KQorI2RlZmluZSBBQ0NSX0RNQ0ZTKHgpCQkoKCh4KSAmIDB4MykgPDwgMTIpCisjZGVmaW5lIEFDQ1JfWE4oeCkJCSgoKHgpICYgMHg3KSA8PCA4KQorI2RlZmluZSBBQ0NSX1hMKHgpCQkoKHgpICYgMHgxZikKKwogLyoKICAqIENsb2NrIEVuYWJsZSBCaXQKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3Jlc2V0LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVzZXQuaAppbmRleCA5NDg5YTQ4Li43Yjg4NDJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVzZXQuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcmVzZXQuaApAQCAtMTAsOSArMTAsMTIgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgcmVzZXRfc3RhdHVzOwogZXh0ZXJuIHZvaWQgY2xlYXJfcmVzZXRfc3RhdHVzKHVuc2lnbmVkIGludCBtYXNrKTsKIAotLyoKLSAqIHJlZ2lzdGVyIEdQSU8gYXMgcmVzZXQgZ2VuZXJhdG9yCisvKioKKyAqIGluaXRfZ3Bpb19yZXNldCgpIC0gcmVnaXN0ZXIgR1BJTyBhcyByZXNldCBnZW5lcmF0b3IKKyAqCisgKiBAZ3BpbyAtIGdwaW8gbnIKKyAqIEBvdXRwdXQgLSBzZXQgZ3BpbyBhcyBvdXQvbG93IGluc3RlYWQgb2YgaW5wdXQgZHVyaW5nIG5vcm1hbCB3b3JrCiAgKi8KLWV4dGVybiBpbnQgaW5pdF9ncGlvX3Jlc2V0KGludCBncGlvKTsKK2V4dGVybiBpbnQgaW5pdF9ncGlvX3Jlc2V0KGludCBncGlvLCBpbnQgb3V0cHV0KTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3NwaXR6LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc3BpdHouaAppbmRleCBiZDE0MzY1Li4zMWFjMjZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc3BpdHouaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc3BpdHouaApAQCAtMTYsNiArMTYsNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogLyogU3BpdHovQWtpdGEgR1BJT3MgKi8KIApAQCAtMTAwLDEzICsxMDEsMjQgQEAKICNkZWZpbmUgU1BJVFpfU0NQX0pLX0EgICAgICAgICAgU0NPT1BfR1BDUl9QQTE4ICAvKiBMb3cgKi8KICNkZWZpbmUgU1BJVFpfU0NQX0FEQ19URU1QX09OICAgU0NPT1BfR1BDUl9QQTE5ICAvKiBMb3cgKi8KIAotI2RlZmluZSBTUElUWl9TQ1BfSU9fRElSICAgICAgKFNQSVRaX1NDUF9MRURfR1JFRU4gfCBTUElUWl9TQ1BfSktfQiB8IFNQSVRaX1NDUF9DSFJHX09OIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSVRaX1NDUF9NVVRFX0wgfCBTUElUWl9TQ1BfTVVURV9SIHwgU1BJVFpfU0NQX0xFRF9PUkFOR0UgfCBcCisjZGVmaW5lIFNQSVRaX1NDUF9JT19ESVIgICAgICAoU1BJVFpfU0NQX0pLX0IgfCBTUElUWl9TQ1BfQ0hSR19PTiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElUWl9TQ1BfTVVURV9MIHwgU1BJVFpfU0NQX01VVEVfUiB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElUWl9TQ1BfQ0ZfUE9XRVIgfCBTUElUWl9TQ1BfSktfQSB8IFNQSVRaX1NDUF9BRENfVEVNUF9PTikKICNkZWZpbmUgU1BJVFpfU0NQX0lPX09VVCAgICAgIChTUElUWl9TQ1BfQ0hSR19PTiB8IFNQSVRaX1NDUF9NVVRFX0wgfCBTUElUWl9TQ1BfTVVURV9SKQogI2RlZmluZSBTUElUWl9TQ1BfU1VTX0NMUiAgICAgKFNQSVRaX1NDUF9NVVRFX0wgfCBTUElUWl9TQ1BfTVVURV9SIHwgU1BJVFpfU0NQX0pLX0EgfCBTUElUWl9TQ1BfQURDX1RFTVBfT04pCiAjZGVmaW5lIFNQSVRaX1NDUF9TVVNfU0VUICAgICAwCiAKKyNkZWZpbmUgU1BJVFpfU0NQX0dQSU9fQkFTRQkoTlJfQlVJTFRJTl9HUElPKQorI2RlZmluZSBTUElUWl9HUElPX0xFRF9HUkVFTgkoU1BJVFpfU0NQX0dQSU9fQkFTRSArIDApCisjZGVmaW5lIFNQSVRaX0dQSU9fSktfQgkJKFNQSVRaX1NDUF9HUElPX0JBU0UgKyAxKQorI2RlZmluZSBTUElUWl9HUElPX0NIUkdfT04JKFNQSVRaX1NDUF9HUElPX0JBU0UgKyAyKQorI2RlZmluZSBTUElUWl9HUElPX01VVEVfTAkoU1BJVFpfU0NQX0dQSU9fQkFTRSArIDMpCisjZGVmaW5lIFNQSVRaX0dQSU9fTVVURV9SCShTUElUWl9TQ1BfR1BJT19CQVNFICsgNCkKKyNkZWZpbmUgU1BJVFpfR1BJT19DRl9QT1dFUgkoU1BJVFpfU0NQX0dQSU9fQkFTRSArIDUpCisjZGVmaW5lIFNQSVRaX0dQSU9fTEVEX09SQU5HRQkoU1BJVFpfU0NQX0dQSU9fQkFTRSArIDYpCisjZGVmaW5lIFNQSVRaX0dQSU9fSktfQQkJKFNQSVRaX1NDUF9HUElPX0JBU0UgKyA3KQorI2RlZmluZSBTUElUWl9HUElPX0FEQ19URU1QX09OCShTUElUWl9TQ1BfR1BJT19CQVNFICsgOCkKKwogLyogU3BpdHogU2Nvb3AgRGV2aWNlIChOby4gMikgR1BJT3MgKi8KIC8qIFN1c3BlbmQgU3RhdGVzIGluIGNvbW1lbnRzICovCiAjZGVmaW5lIFNQSVRaX1NDUDJfSVJfT04gICAgICAgICAgIFNDT09QX0dQQ1JfUEExMSAgLyogSGlnaCAqLwpAQCAtMTE5LDE1ICsxMzEsMzYgQEAKICNkZWZpbmUgU1BJVFpfU0NQMl9CQUNLTElHSFRfT04gICAgU0NPT1BfR1BDUl9QQTE4ICAvKiBMb3cgKi8KICNkZWZpbmUgU1BJVFpfU0NQMl9NSUNfQklBUyAgICAgICAgU0NPT1BfR1BDUl9QQTE5ICAvKiBMb3cgKi8KIAotI2RlZmluZSBTUElUWl9TQ1AyX0lPX0RJUiAoU1BJVFpfU0NQMl9JUl9PTiB8IFNQSVRaX1NDUDJfQUtJTl9QVUxMVVAgfCBTUElUWl9TQ1AyX1JFU0VSVkVEXzEgfCBcCisjZGVmaW5lIFNQSVRaX1NDUDJfSU9fRElSIChTUElUWl9TQ1AyX0FLSU5fUFVMTFVQIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF8xIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJVFpfU0NQMl9SRVNFUlZFRF8yIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF8zIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF80IHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJVFpfU0NQMl9CQUNLTElHSFRfQ09OVCB8IFNQSVRaX1NDUDJfQkFDS0xJR0hUX09OIHwgU1BJVFpfU0NQMl9NSUNfQklBUykKIAotI2RlZmluZSBTUElUWl9TQ1AyX0lPX09VVCAgIChTUElUWl9TQ1AyX0lSX09OIHwgU1BJVFpfU0NQMl9BS0lOX1BVTExVUCB8IFNQSVRaX1NDUDJfUkVTRVJWRURfMSkKKyNkZWZpbmUgU1BJVFpfU0NQMl9JT19PVVQgICAoU1BJVFpfU0NQMl9BS0lOX1BVTExVUCB8IFNQSVRaX1NDUDJfUkVTRVJWRURfMSkKICNkZWZpbmUgU1BJVFpfU0NQMl9TVVNfQ0xSICAoU1BJVFpfU0NQMl9SRVNFUlZFRF8yIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF8zIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF80IHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElUWl9TQ1AyX0JBQ0tMSUdIVF9DT05UIHwgU1BJVFpfU0NQMl9CQUNLTElHSFRfT04gfCBTUElUWl9TQ1AyX01JQ19CSUFTKQogI2RlZmluZSBTUElUWl9TQ1AyX1NVU19TRVQgIChTUElUWl9TQ1AyX0lSX09OIHwgU1BJVFpfU0NQMl9SRVNFUlZFRF8xKQogCisjZGVmaW5lIFNQSVRaX1NDUDJfR1BJT19CQVNFCQkoTlJfQlVJTFRJTl9HUElPICsgMTIpCisjZGVmaW5lIFNQSVRaX0dQSU9fSVJfT04JCShTUElUWl9TQ1AyX0dQSU9fQkFTRSArIDApCisjZGVmaW5lIFNQSVRaX0dQSU9fQUtJTl9QVUxMVVAJCShTUElUWl9TQ1AyX0dQSU9fQkFTRSArIDEKKyNkZWZpbmUgU1BJVFpfR1BJT19SRVNFUlZFRF8xCQkoU1BJVFpfU0NQMl9HUElPX0JBU0UgKyAyKQorI2RlZmluZSBTUElUWl9HUElPX1JFU0VSVkVEXzIJCShTUElUWl9TQ1AyX0dQSU9fQkFTRSArIDMpCisjZGVmaW5lIFNQSVRaX0dQSU9fUkVTRVJWRURfMwkJKFNQSVRaX1NDUDJfR1BJT19CQVNFICsgNCkKKyNkZWZpbmUgU1BJVFpfR1BJT19SRVNFUlZFRF80CQkoU1BJVFpfU0NQMl9HUElPX0JBU0UgKyA1KQorI2RlZmluZSBTUElUWl9HUElPX0JBQ0tMSUdIVF9DT05UCShTUElUWl9TQ1AyX0dQSU9fQkFTRSArIDYpCisjZGVmaW5lIFNQSVRaX0dQSU9fQkFDS0xJR0hUX09OCQkoU1BJVFpfU0NQMl9HUElPX0JBU0UgKyA3KQorI2RlZmluZSBTUElUWl9HUElPX01JQ19CSUFTCQkoU1BJVFpfU0NQMl9HUElPX0JBU0UgKyA4KQorCisvKiBBa2l0YSBJTyBFeHBhbmRlciBHUElPcyAqLworI2RlZmluZSBBS0lUQV9JT0VYUF9HUElPX0JBU0UJCShOUl9CVUlMVElOX0dQSU8gKyAxMikKKyNkZWZpbmUgQUtJVEFfR1BJT19SRVNFUlZFRF8wCQkoQUtJVEFfSU9FWFBfR1BJT19CQVNFICsgMCkKKyNkZWZpbmUgQUtJVEFfR1BJT19SRVNFUlZFRF8xCQkoQUtJVEFfSU9FWFBfR1BJT19CQVNFICsgMSkKKyNkZWZpbmUgQUtJVEFfR1BJT19NSUNfQklBUwkJKEFLSVRBX0lPRVhQX0dQSU9fQkFTRSArIDIpCisjZGVmaW5lIEFLSVRBX0dQSU9fQkFDS0xJR0hUX09OCQkoQUtJVEFfSU9FWFBfR1BJT19CQVNFICsgMykKKyNkZWZpbmUgQUtJVEFfR1BJT19CQUNLTElHSFRfQ09OVAkoQUtJVEFfSU9FWFBfR1BJT19CQVNFICsgNCkKKyNkZWZpbmUgQUtJVEFfR1BJT19BS0lOX1BVTExVUAkJKEFLSVRBX0lPRVhQX0dQSU9fQkFTRSArIDUpCisjZGVmaW5lIEFLSVRBX0dQSU9fSVJfT04JCShBS0lUQV9JT0VYUF9HUElPX0JBU0UgKyA2KQorI2RlZmluZSBBS0lUQV9HUElPX1JFU0VSVkVEXzcJCShBS0lUQV9JT0VYUF9HUElPX0JBU0UgKyA3KQogCiAvKiBTcGl0eiBJUlEgRGVmaW5pdGlvbnMgKi8KIApAQCAtMTU0LDUgKzE4Nyw0IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6c2Nvb3BfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpdHpzY29vcDJfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpdHpzc3BfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBzaGFycHNsX2NoYXJnZXJfbWFjaGluZm8gc3BpdHpfcG1fbWFjaGluZm87CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc3NwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvc3NwLmgKaW5kZXggYTAxMjg4Mi4uY2I1Y2I3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3NzcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9zc3AuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX1NTUF9ICiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogZW51bSBweGFfc3NwX3R5cGUgewogCVNTUF9VTkRFRklORUQgPSAwLApAQCAtNzgsNiArNzksMjkgQEAKIGludCBzc3BfY29uZmlnKHN0cnVjdCBzc3BfZGV2ICpkZXYsIHUzMiBtb2RlLCB1MzIgZmxhZ3MsIHUzMiBwc3BfZmxhZ3MsIHUzMiBzcGVlZCk7CiB2b2lkIHNzcF9leGl0KHN0cnVjdCBzc3BfZGV2ICpkZXYpOwogCisvKioKKyAqIHNzcF93cml0ZV9yZWcgLSBXcml0ZSB0byBhIFNTUCByZWdpc3RlcgorICoKKyAqIEBkZXY6IFNTUCBkZXZpY2UgdG8gYWNjZXNzCisgKiBAcmVnOiBSZWdpc3RlciB0byB3cml0ZSB0bworICogQHZhbDogVmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNzcF93cml0ZV9yZWcoc3RydWN0IHNzcF9kZXZpY2UgKmRldiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkZXYtPm1taW9fYmFzZSArIHJlZyk7Cit9CisKKy8qKgorICogc3NwX3JlYWRfcmVnIC0gUmVhZCBmcm9tIGEgU1NQIHJlZ2lzdGVyCisgKgorICogQGRldjogU1NQIGRldmljZSB0byBhY2Nlc3MKKyAqIEByZWc6IFJlZ2lzdGVyIHRvIHJlYWQgZnJvbQorICovCitzdGF0aWMgaW5saW5lIHUzMiBzc3BfcmVhZF9yZWcoc3RydWN0IHNzcF9kZXZpY2UgKmRldiwgdTMyIHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoZGV2LT5tbWlvX2Jhc2UgKyByZWcpOworfQorCiBzdHJ1Y3Qgc3NwX2RldmljZSAqc3NwX3JlcXVlc3QoaW50IHBvcnQsIGNvbnN0IGNoYXIgKmxhYmVsKTsKIHZvaWQgc3NwX2ZyZWUoc3RydWN0IHNzcF9kZXZpY2UgKik7CiAjZW5kaWYgLyogX19BU01fQVJDSF9TU1BfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3RyaXplcHM0LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdHJpemVwczQuaAppbmRleCA2NDFkMGVjLi45MDNlMWEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdHJpemVwczQuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdHJpemVwczQuaApAQCAtMTcsMTEgKzE3LDE2IEBACiAjZGVmaW5lIFRSSVpFUFM0X1BJQ19QSFlTCShQWEFfQ1MzX1BIWVMpCS8qIExvZ2ljIGNoaXAgb24gQ29uWFMtQm9hcmQgKi8KICNkZWZpbmUgVFJJWkVQUzRfU0RSQU1fQkFTRQkweGEwMDAwMDAwICAgICAgLyogU0RSQU0gcmVnaW9uICovCiAKLSNkZWZpbmUgVFJJWkVQUzRfQ0ZTUl9QSFlTCShQWEFfQ1MzX1BIWVMpCQkJLyogTG9naWMgY2hpcCBvbiBDb25YUy1Cb2FyZCBDU0ZSIHJlZ2lzdGVyICovCi0jZGVmaW5lIFRSSVpFUFM0X0JPQ1JfUEhZUwkoUFhBX0NTM19QSFlTKzB4MDIwMDAwMDApCS8qIExvZ2ljIGNoaXAgb24gQ29uWFMtQm9hcmQgQk9DUiByZWdpc3RlciAqLwotI2RlZmluZSBUUklaRVBTNF9JUkNSX1BIWVMJKFBYQV9DUzNfUEhZUysweDAyNDAwMDAwKQkvKiBMb2dpYyBjaGlwIG9uIENvblhTLUJvYXJkIElSQ1IgcmVnaXN0ZXIqLwotI2RlZmluZSBUUklaRVBTNF9VUFNSX1BIWVMJKFBYQV9DUzNfUEhZUysweDAyODAwMDAwKQkvKiBMb2dpYyBjaGlwIG9uIENvblhTLUJvYXJkIFVQU1IgcmVnaXN0ZXIqLwotI2RlZmluZSBUUklaRVBTNF9ESUNSX1BIWVMJKFBYQV9DUzNfUEhZUysweDAzODAwMDAwKQkvKiBMb2dpYyBjaGlwIG9uIENvblhTLUJvYXJkIERJQ1IgcmVnaXN0ZXIqLworCQkJCS8qIExvZ2ljIG9uIENvblhTLWJvYXJkIENTRlIgcmVnaXN0ZXIqLworI2RlZmluZSBUUklaRVBTNF9DRlNSX1BIWVMJKFBYQV9DUzNfUEhZUykKKwkJCQkvKiBMb2dpYyBvbiBDb25YUy1ib2FyZCBCT0NSIHJlZ2lzdGVyKi8KKyNkZWZpbmUgVFJJWkVQUzRfQk9DUl9QSFlTCShQWEFfQ1MzX1BIWVMrMHgwMjAwMDAwMCkKKwkJCQkvKiBMb2dpYyBvbiBDb25YUy1ib2FyZCBJUkNSIHJlZ2lzdGVyKi8KKyNkZWZpbmUgVFJJWkVQUzRfSVJDUl9QSFlTCShQWEFfQ1MzX1BIWVMrMHgwMjQwMDAwMCkKKwkJCQkvKiBMb2dpYyBvbiBDb25YUy1ib2FyZCBVUFNSIHJlZ2lzdGVyKi8KKyNkZWZpbmUgVFJJWkVQUzRfVVBTUl9QSFlTCShQWEFfQ1MzX1BIWVMrMHgwMjgwMDAwMCkKKwkJCQkvKiBMb2dpYyBvbiBDb25YUy1ib2FyZCBESUNSIHJlZ2lzdGVyKi8KKyNkZWZpbmUgVFJJWkVQUzRfRElDUl9QSFlTCShQWEFfQ1MzX1BIWVMrMHgwMzgwMDAwMCkKIAogLyogdmlydHVhbCBtZW1vcnkgcmVnaW9ucyAqLwogI2RlZmluZSBUUklaRVBTNF9ESVNLX1ZJUlQJMHhGMDAwMDAwMAkvKiBEaXNrIE9uIENoaXAgcmVnaW9uICovCkBAIC01NCw2ICs1OSwxNSBAQAogI2RlZmluZSBHUElPX01NQ19ERVQJCTEyCiAjZGVmaW5lIFRSSVpFUFM0X01NQ19JUlEJSVJRX0dQSU8oR1BJT19NTUNfREVUKQogCisvKiBET0MgTkFORCBjaGlwICovCisjZGVmaW5lIEdQSU9fRE9DX0xPQ0sgICAgICAgICAgIDk0CisjZGVmaW5lIEdQSU9fRE9DX0lSUSAgICAgICAgICAgIDkzCisjZGVmaW5lIFRSSVpFUFM0X0RPQ19JUlEgICAgICAgIElSUV9HUElPKEdQSU9fRE9DX0lSUSkKKworLyogU1BJIGludGVyZmFjZSAqLworI2RlZmluZSBHUElPX1NQSSAgICAgICAgICAgICAgICA1MworI2RlZmluZSBUUklaRVBTNF9TUElfSVJRICAgICAgICBJUlFfR1BJTyhHUElPX1NQSSkKKwogLyogTEVEUyB1c2luZyB0eDIgLyByeDIgKi8KICNkZWZpbmUgR1BJT19TWVNfQlVTWV9MRUQJNDYKICNkZWZpbmUgR1BJT19IRUFSVEJFQVRfTEVECTQ3CkBAIC02MiwyNCArNzYsNjYgQEAKICNkZWZpbmUgR1BJT19QSUMJCTAKICNkZWZpbmUgVFJJWkVQUzRfUElDX0lSUQlJUlFfR1BJTyhHUElPX1BJQykKIAotI2RlZmluZSBDRlNSX1AyVih4KQkJKCh4KSAtIFRSSVpFUFM0X0NGU1JfUEhZUyArIFRSSVpFUFM0X0NGU1JfVklSVCkKLSNkZWZpbmUgQ0ZTUl9WMlAoeCkJCSgoeCkgLSBUUklaRVBTNF9DRlNSX1ZJUlQgKyBUUklaRVBTNF9DRlNSX1BIWVMpCisjaWZkZWYgQ09ORklHX01BQ0hfVFJJWkVQU19DT05YUworLyogZm9yIENPTlhTIGJhc2UgYm9hcmQgZGVmaW5lIHRoZXNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBDRlNSX1AyVih4KQkoKHgpIC0gVFJJWkVQUzRfQ0ZTUl9QSFlTICsgVFJJWkVQUzRfQ0ZTUl9WSVJUKQorI2RlZmluZSBDRlNSX1YyUCh4KQkoKHgpIC0gVFJJWkVQUzRfQ0ZTUl9WSVJUICsgVFJJWkVQUzRfQ0ZTUl9QSFlTKQogCi0jZGVmaW5lIEJDUl9QMlYoeCkJCSgoeCkgLSBUUklaRVBTNF9CT0NSX1BIWVMgKyBUUklaRVBTNF9CT0NSX1ZJUlQpCi0jZGVmaW5lIEJDUl9WMlAoeCkJCSgoeCkgLSBUUklaRVBTNF9CT0NSX1ZJUlQgKyBUUklaRVBTNF9CT0NSX1BIWVMpCisjZGVmaW5lIEJDUl9QMlYoeCkJKCh4KSAtIFRSSVpFUFM0X0JPQ1JfUEhZUyArIFRSSVpFUFM0X0JPQ1JfVklSVCkKKyNkZWZpbmUgQkNSX1YyUCh4KQkoKHgpIC0gVFJJWkVQUzRfQk9DUl9WSVJUICsgVFJJWkVQUzRfQk9DUl9QSFlTKQogCi0jZGVmaW5lIERDUl9QMlYoeCkJCSgoeCkgLSBUUklaRVBTNF9ESUNSX1BIWVMgKyBUUklaRVBTNF9ESUNSX1ZJUlQpCi0jZGVmaW5lIERDUl9WMlAoeCkJCSgoeCkgLSBUUklaRVBTNF9ESUNSX1ZJUlQgKyBUUklaRVBTNF9ESUNSX1BIWVMpCisjZGVmaW5lIERDUl9QMlYoeCkJKCh4KSAtIFRSSVpFUFM0X0RJQ1JfUEhZUyArIFRSSVpFUFM0X0RJQ1JfVklSVCkKKyNkZWZpbmUgRENSX1YyUCh4KQkoKHgpIC0gVFJJWkVQUzRfRElDUl9WSVJUICsgVFJJWkVQUzRfRElDUl9QSFlTKQorCisjZGVmaW5lIElSQ1JfUDJWKHgpCSgoeCkgLSBUUklaRVBTNF9JUkNSX1BIWVMgKyBUUklaRVBTNF9JUkNSX1ZJUlQpCisjZGVmaW5lIElSQ1JfVjJQKHgpCSgoeCkgLSBUUklaRVBTNF9JUkNSX1ZJUlQgKyBUUklaRVBTNF9JUkNSX1BIWVMpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIENvblhTX0NGU1IJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKUNGU1JfUDJWKDB4MEMwMDAwMDApKSkKLSNkZWZpbmUgQ29uWFNfQkNSCQkoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilCQ1JfUDJWKDB4MEUwMDAwMDApKSkKLSNkZWZpbmUgQ29uWFNfRENSCQkoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilEQ1JfUDJWKDB4MEY4MDAwMDApKSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgQ0ZTUl9yZWFkdyh2b2lkKQoreworCS8qIFtDb21wYWN0IEZsYXNoIFN0YXR1cyBSZWdpc3Rlcl0gaXMgcmVhZCBvbmx5ICovCisJcmV0dXJuICooKHVuc2lnbmVkIHNob3J0ICopQ0ZTUl9QMlYoMHgwQzAwMDAwMCkpOworfQorc3RhdGljIGlubGluZSB2b2lkIEJDUl93cml0ZXcodW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJLyogW0JvYXJkIENvbnRyb2wgUmVnc2l0ZXJdIGlzIHdyaXRlIG9ubHkgKi8KKwkqKCh1bnNpZ25lZCBzaG9ydCAqKUJDUl9QMlYoMHgwRTAwMDAwMCkpID0gdmFsdWU7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgRENSX3dyaXRldyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwkvKiBbRGlzcGxheSBDb250cm9sIFJlZ2lzdGVyXSBpcyB3cml0ZSBvbmx5ICovCisJKigodW5zaWduZWQgc2hvcnQgKilEQ1JfUDJWKDB4MEUwMDAwMDApKSA9IHZhbHVlOworfQorc3RhdGljIGlubGluZSB2b2lkIElSQ1Jfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCS8qIFtJbmZyYVJlZCBkYXRhIENvbnRyb2wgUmVnaXN0ZXJdIGlzIHdyaXRlIG9ubHkgKi8KKwkqKCh1bnNpZ25lZCBzaG9ydCAqKUlSQ1JfUDJWKDB4MEUwMDAwMDApKSA9IHZhbHVlOworfQogI2Vsc2UKICNkZWZpbmUgQ29uWFNfQ0ZTUgkJQ0ZTUl9QMlYoMHgwQzAwMDAwMCkKICNkZWZpbmUgQ29uWFNfQkNSCQlCQ1JfUDJWKDB4MEUwMDAwMDApCiAjZGVmaW5lIENvblhTX0RDUgkJRENSX1AyVigweDBGODAwMDAwKQorI2RlZmluZSBDb25YU19JUkNSCQlJUkNSX1AyVigweDBGODAwMDAwKQogI2VuZGlmCisjZWxzZQorLyogZm9yIHdoYXRldmVyIGJhc2Vib2FyZCBkZWZpbmUgZnVuY3Rpb24gcmVnaXN0ZXJzICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IENGU1JfcmVhZHcodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBCQ1Jfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBEQ1Jfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBJUkNSX3dyaXRldyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwk7Cit9CisjZW5kaWYJLyogQ09ORklHX01BQ0hfVFJJWkVQU19DT05YUyAqLwogCiAjZGVmaW5lIENvblhTX0NGU1JfQlZEX01BU0sJMHgwMDAzCiAjZGVmaW5lIENvblhTX0NGU1JfQlZEMQkJKDEgPDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC92aXBlci5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3ZpcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5ODhjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC92aXBlci5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdmlwZXIuaAorICoKKyAqIEF1dGhvcjoJSWFuIENhbXBiZWxsCisgKiBDcmVhdGVkOglGZWIgMDMsIDIwMDMKKyAqIENvcHlyaWdodDoJQXJjb20gQ29udHJvbCBTeXN0ZW1zLgorICoKKyAqIE1haW50YWluZWQgYnkgTWFyYyBaeW5naWVyIDxtYXpAbWlzdGVyam9uZXMub3JnPgorICoJCQkgICAgICA8bWFyYy56eW5naWVyQGFsdHJhbi5jb20+CisgKgorICogQ3JlYXRlZCBiYXNlZCBvbiBsdWJib2NrLmg6CisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJSnVuIDE1LCAyMDAxCisgKiAgQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQVJDSF9WSVBFUl9ICisjZGVmaW5lIEFSQ0hfVklQRVJfSAorCisjZGVmaW5lIFZJUEVSX0JPT1RfUEhZUwkJUFhBX0NTMF9QSFlTCisjZGVmaW5lIFZJUEVSX0ZMQVNIX1BIWVMJUFhBX0NTMV9QSFlTCisjZGVmaW5lIFZJUEVSX0VUSF9QSFlTCQlQWEFfQ1MyX1BIWVMKKyNkZWZpbmUgVklQRVJfVVNCX1BIWVMJCVBYQV9DUzNfUEhZUworI2RlZmluZSBWSVBFUl9FVEhfREFUQV9QSFlTCVBYQV9DUzRfUEhZUworI2RlZmluZSBWSVBFUl9DUExEX1BIWVMJCVBYQV9DUzVfUEhZUworCisjZGVmaW5lIFZJUEVSX0NQTERfQkFTRQkJKDB4ZjAwMDAwMDApCisjZGVmaW5lIFZJUEVSX1BDMTA0SU9fQkFTRQkoMHhmMTAwMDAwMCkKKyNkZWZpbmUgVklQRVJfVVNCX0JBU0UJCSgweGYxODAwMDAwKQorCisjZGVmaW5lIFZJUEVSX0VUSF9HUElPCQkoMCkKKyNkZWZpbmUgVklQRVJfQ1BMRF9HUElPCQkoMSkKKyNkZWZpbmUgVklQRVJfVVNCX0dQSU8JCSgyKQorI2RlZmluZSBWSVBFUl9VQVJUQV9HUElPCSg0KQorI2RlZmluZSBWSVBFUl9VQVJUQl9HUElPCSgzKQorI2RlZmluZSBWSVBFUl9DRl9DRF9HUElPCSgzMikKKyNkZWZpbmUgVklQRVJfQ0ZfUkRZX0dQSU8JKDgpCisjZGVmaW5lIFZJUEVSX0JDS0xJR0hUX0VOX0dQSU8JKDkpCisjZGVmaW5lIFZJUEVSX0xDRF9FTl9HUElPCSgxMCkKKyNkZWZpbmUgVklQRVJfUFNVX0RBVEFfR1BJTwkoNikKKyNkZWZpbmUgVklQRVJfUFNVX0NMS19HUElPCSgxMSkKKyNkZWZpbmUgVklQRVJfVUFSVF9TSEROX0dQSU8JKDEyKQorI2RlZmluZSBWSVBFUl9CUklHSFRORVNTX0dQSU8JKDE2KQorI2RlZmluZSBWSVBFUl9QU1VfbkNTX0xEX0dQSU8JKDE5KQorI2RlZmluZSBWSVBFUl9VUFNfR1BJTwkJKDIwKQorI2RlZmluZSBWSVBFUl9DRl9QT1dFUl9HUElPCSg4MikKKyNkZWZpbmUgVklQRVJfVFBNX0kyQ19TREFfR1BJTwkoMjYpCisjZGVmaW5lIFZJUEVSX1RQTV9JMkNfU0NMX0dQSU8JKDI3KQorI2RlZmluZSBWSVBFUl9SVENfSTJDX1NEQV9HUElPCSg4MykKKyNkZWZpbmUgVklQRVJfUlRDX0kyQ19TQ0xfR1BJTwkoODQpCisKKyNkZWZpbmUgVklQRVJfQ1BMRF9QMlYoeCkJKCh4KSAtIFZJUEVSX0NQTERfUEhZUyArIFZJUEVSX0NQTERfQkFTRSkKKyNkZWZpbmUgVklQRVJfQ1BMRF9WMlAoeCkJKCh4KSAtIFZJUEVSX0NQTERfQkFTRSArIFZJUEVSX0NQTERfUEhZUykKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyMgIGRlZmluZSBfX1ZJUEVSX0NQTERfUkVHKHgpCSgqKCh2b2xhdGlsZSB1MTYgKilWSVBFUl9DUExEX1AyVih4KSkpCisjZW5kaWYKKworLyogYm9hcmQgbGV2ZWwgcmVnaXN0ZXJzIGluIHRoZSBDUExEOiAob2Zmc2V0cyBmcm9tIENQTERfQkFTRSkgLi4uICovCisKKy8qIC4uLiBQaHlzaWNhbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgX1ZJUEVSX0xPX0lSUV9TVEFUVVMJKFZJUEVSX0NQTERfUEhZUyArIDB4MTAwMDAwKQorI2RlZmluZSBfVklQRVJfSUNSX1BIWVMJCShWSVBFUl9DUExEX1BIWVMgKyAweDEwMDAwMikKKyNkZWZpbmUgX1ZJUEVSX0hJX0lSUV9TVEFUVVMJKFZJUEVSX0NQTERfUEhZUyArIDB4MTAwMDA0KQorI2RlZmluZSBfVklQRVJfVkVSU0lPTl9QSFlTCShWSVBFUl9DUExEX1BIWVMgKyAweDEwMDAwNikKKyNkZWZpbmUgVklQRVJfVUFSVEFfUEhZUwkoVklQRVJfQ1BMRF9QSFlTICsgMHgzMDAwMTApCisjZGVmaW5lIFZJUEVSX1VBUlRCX1BIWVMJKFZJUEVSX0NQTERfUEhZUyArIDB4MzAwMDAwKQorI2RlZmluZSBfVklQRVJfU1JBTV9CQVNFCShWSVBFUl9DUExEX1BIWVMgKyAweDgwMDAwMCkKKworLyogLi4uIFZpcnR1YWwgYWRkcmVzc2VzICovCisjZGVmaW5lIFZJUEVSX0xPX0lSUV9TVEFUVVMJX19WSVBFUl9DUExEX1JFRyhfVklQRVJfTE9fSVJRX1NUQVRVUykKKyNkZWZpbmUgVklQRVJfSElfSVJRX1NUQVRVUwlfX1ZJUEVSX0NQTERfUkVHKF9WSVBFUl9ISV9JUlFfU1RBVFVTKQorI2RlZmluZSBWSVBFUl9WRVJTSU9OCQlfX1ZJUEVSX0NQTERfUkVHKF9WSVBFUl9WRVJTSU9OX1BIWVMpCisjZGVmaW5lIFZJUEVSX0lDUgkJX19WSVBFUl9DUExEX1JFRyhfVklQRVJfSUNSX1BIWVMpCisKKy8qIERlY29kZSBWSVBFUl9WRVJTSU9OIHJlZ2lzdGVyICovCisjZGVmaW5lIFZJUEVSX0NQTERfUkVWSVNJT04oeCkJKCgoeCkgPj4gNSkgJiAweDcpCisjZGVmaW5lIFZJUEVSX0JPQVJEX1ZFUlNJT04oeCkJKCgoeCkgPj4gMykgJiAweDMpCisjZGVmaW5lIFZJUEVSX0JPQVJEX0lTU1VFKHgpCSgoKHgpID4+IDApICYgMHg3KQorCisvKiBJbnRlcnJ1cHQgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKFZJUEVSX0lDUikgKi8KKy8qIFRoaXMgaXMgYSB3cml0ZSBvbmx5IHJlZ2lzdGVyLiBPbmx5IENGX1JTVCBpcyB1c2VkIHVuZGVyIExpbnV4ICovCisKK2V4dGVybiB2b2lkIHZpcGVyX2NmX3JzdChpbnQgc3RhdGUpOworCisjZGVmaW5lIFZJUEVSX0lDUl9SRVRSSUcJKDEgPDwgMCkKKyNkZWZpbmUgVklQRVJfSUNSX0FVVE9fQ0xSCSgxIDw8IDEpCisjZGVmaW5lIFZJUEVSX0lDUl9SX0RJUwkJKDEgPDwgMikKKyNkZWZpbmUgVklQRVJfSUNSX0NGX1JTVAkoMSA8PCAzKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYwppbmRleCA1ZTk1YzUzLi5mYTY5YzNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pcnEuYwpAQCAtNTcsNyArNTcsNyBAQAogCiAJcHhhX2ludGVybmFsX2lycV9uciA9IGlycV9ucjsKIAotCWZvciAoaXJxID0gMDsgaXJxIDwgaXJxX25yOyBpcnEgKz0gMzIpIHsKKwlmb3IgKGlycSA9IFBYQV9JUlEoMCk7IGlycSA8IFBYQV9JUlEoaXJxX25yKTsgaXJxICs9IDMyKSB7CiAJCV9JQ01SKGlycSkgPSAwOwkvKiBkaXNhYmxlIGFsbCBJUlFzICovCiAJCV9JQ0xSKGlycSkgPSAwOwkvKiBhbGwgSVJRcyBhcmUgSVJRLCBub3QgRklRICovCiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy10cml6ZXBzNC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy10cml6ZXBzNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmMyOTAwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMtdHJpemVwczQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy10cml6ZXBzNC5jCi0gKgotICogIEF1dGhvcjoJSsO8cmdlbiBTY2hpbmRlbGUKLSAqICBDcmVhdGVkOgkyMCAwMiwgMjAwNgotICogIENvcHlyaWdodDoJSsO8cmdlbiBTY2hpbmRlbGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9sZWRzLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvdHJpemVwczQuaD4KLQotI2luY2x1ZGUgImxlZHMuaCIKLQotI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkxCi0jZGVmaW5lIExFRF9TVEFURV9DTEFJTUVECTIKLQotI2RlZmluZSBTWVNfQlVTWQkJMHgwMQotI2RlZmluZSBIRUFSVEJFQVQJCTB4MDIKLSNkZWZpbmUgQkxJTksJCQkweDA0Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGVkX3N0YXRlOwotc3RhdGljIHVuc2lnbmVkIGludCBod19sZWRfc3RhdGU7Ci0KLXZvaWQgdHJpemVwczRfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCXN3aXRjaCAoZXZ0KSB7Ci0JY2FzZSBsZWRfc3RhcnQ6Ci0JCWh3X2xlZF9zdGF0ZSA9IDA7Ci0JCXB4YV9ncGlvX21vZGUoIEdQSU9fU1lTX0JVU1lfTEVEICB8IEdQSU9fT1VUKTsJCS8qIExFRDEgKi8KLQkJcHhhX2dwaW9fbW9kZSggR1BJT19IRUFSVEJFQVRfTEVEIHwgR1BJT19PVVQpOwkJLyogTEVEMiAqLwotCQlsZWRfc3RhdGUgPSBMRURfU1RBVEVfRU5BQkxFRDsKLQkJYnJlYWs7Ci0KLQljYXNlIGxlZF9zdG9wOgotCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9FTkFCTEVEOwotCQlicmVhazsKLQotCWNhc2UgbGVkX2NsYWltOgotCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7Ci0JCWh3X2xlZF9zdGF0ZSA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBsZWRfcmVsZWFzZToKLQkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKLQkJaHdfbGVkX3N0YXRlID0gMDsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfTEVEU19USU1FUgotCWNhc2UgbGVkX3RpbWVyOgotCQlod19sZWRfc3RhdGUgXj0gSEVBUlRCRUFUOwotCQlicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0xFRFNfQ1BVCi0JY2FzZSBsZWRfaWRsZV9zdGFydDoKLQkJaHdfbGVkX3N0YXRlICY9IH5TWVNfQlVTWTsKLQkJYnJlYWs7Ci0KLQljYXNlIGxlZF9pZGxlX2VuZDoKLQkJaHdfbGVkX3N0YXRlIHw9IFNZU19CVVNZOwotCQlicmVhazsKLSNlbmRpZgotCi0JY2FzZSBsZWRfaGFsdGVkOgotCQlicmVhazsKLQotCWNhc2UgbGVkX2dyZWVuX29uOgotCQlod19sZWRfc3RhdGUgfD0gQkxJTks7Ci0JCWJyZWFrOwotCi0JY2FzZSBsZWRfZ3JlZW5fb2ZmOgotCQlod19sZWRfc3RhdGUgJj0gfkJMSU5LOwotCQlicmVhazsKLQotCWNhc2UgbGVkX2FtYmVyX29uOgotCQlicmVhazsKLQotCWNhc2UgbGVkX2FtYmVyX29mZjoKLQkJYnJlYWs7Ci0KLQljYXNlIGxlZF9yZWRfb246Ci0JCWJyZWFrOwotCi0JY2FzZSBsZWRfcmVkX29mZjoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9FTkFCTEVEKSB7Ci0JCXN3aXRjaCAoaHdfbGVkX3N0YXRlKSB7Ci0JCQljYXNlIDA6Ci0JCQkJR1BTUihHUElPX1NZU19CVVNZX0xFRCkgIHw9IEdQSU9fYml0KEdQSU9fU1lTX0JVU1lfTEVEKTsKLQkJCQlHUFNSKEdQSU9fSEVBUlRCRUFUX0xFRCkgfD0gR1BJT19iaXQoR1BJT19IRUFSVEJFQVRfTEVEKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlHUENSKEdQSU9fU1lTX0JVU1lfTEVEKSAgfD0gR1BJT19iaXQoR1BJT19TWVNfQlVTWV9MRUQpOwotCQkJCUdQU1IoR1BJT19IRUFSVEJFQVRfTEVEKSB8PSBHUElPX2JpdChHUElPX0hFQVJUQkVBVF9MRUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCUdQU1IoR1BJT19TWVNfQlVTWV9MRUQpICB8PSBHUElPX2JpdChHUElPX1NZU19CVVNZX0xFRCk7Ci0JCQkJR1BDUihHUElPX0hFQVJUQkVBVF9MRUQpIHw9IEdQSU9fYml0KEdQSU9fSEVBUlRCRUFUX0xFRCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJR1BDUihHUElPX1NZU19CVVNZX0xFRCkgIHw9IEdQSU9fYml0KEdQSU9fU1lTX0JVU1lfTEVEKTsKLQkJCQlHUENSKEdQSU9fSEVBUlRCRUFUX0xFRCkgfD0gR1BJT19iaXQoR1BJT19IRUFSVEJFQVRfTEVEKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogdHVybiBhbGwgb2ZmICovCi0JCUdQU1IoR1BJT19TWVNfQlVTWV9MRUQpICB8PSBHUElPX2JpdChHUElPX1NZU19CVVNZX0xFRCk7Ci0JCUdQU1IoR1BJT19IRUFSVEJFQVRfTEVEKSB8PSBHUElPX2JpdChHUElPX0hFQVJUQkVBVF9MRUQpOwotCX0KLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xlZHMuYwppbmRleCBlMTNlYjg0Li5iYmU0ZDVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9sZWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbGVkcy5jCkBAIC0yNCw4ICsyNCw2IEBACiAJCWxlZHNfZXZlbnQgPSBtYWluc3RvbmVfbGVkc19ldmVudDsKIAlpZiAobWFjaGluZV9pc19weGFfaWRwKCkpCiAJCWxlZHNfZXZlbnQgPSBpZHBfbGVkc19ldmVudDsKLQlpZiAobWFjaGluZV9pc190cml6ZXBzNCgpKQotCQlsZWRzX2V2ZW50ID0gdHJpemVwczRfbGVkc19ldmVudDsKIAogCWxlZHNfZXZlbnQobGVkX3N0YXJ0KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbGl0dGxldG9uLmMKaW5kZXggNThmMzQwMi4uYjRkMDBhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbGl0dGxldG9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbGl0dGxldG9uLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL3NzcC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhMnh4X3NwaS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMjd4X2tleXBhZC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhM3h4X25hbmQuaD4KICNpbmNsdWRlIDxtYWNoL2xpdHRsZXRvbi5oPgpAQCAtNzIsOCArNzQsOCBAQAogCiAJLyogU1NQMiAqLwogCUdQSU8yNV9TU1AyX1NDTEssCi0JR1BJTzE3X1NTUDJfRlJNLAogCUdQSU8yN19TU1AyX1RYRCwKKwlHUElPMTdfR1BJTywJLyogU0ZSTSBhcyBjaGlwLXNlbGVjdCAqLwogCiAJLyogRGVidWcgRXRoZXJuZXQgKi8KIAlHUElPOTBfR1BJTywKQEAgLTEyMywxNjAgKzEyNSw2IEBACiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfUFhBKSB8fCBkZWZpbmVkKENPTkZJR19GQl9QWEFfTU9EVUxFKQotLyogdXNlIGJpdCAzMCwgMzEgYXMgdGhlIGluZGljYXRvciBvZiBjb21tYW5kIHBhcmFtZXRlciBudW1iZXIgKi8KLSNkZWZpbmUgQ01EMCh4KQkJKCgweDAwMDAwMDAwKSB8ICgoeCkgPDwgOSkpCi0jZGVmaW5lIENNRDEoeCwgeDEpCSgoMHg0MDAwMDAwMCkgfCAoKHgpIDw8IDkpIHwgMHgxMDAgfCAoeDEpKQotI2RlZmluZSBDTUQyKHgsIHgxLCB4MikJKCgweDgwMDAwMDAwKSB8ICgoeCkgPDwgMTgpIHwgMHgyMDAwMCB8XAotCQkJICgoeDEpIDw8IDkpIHwgMHgxMDAgfCAoeDIpKQotCi1zdGF0aWMgdWludDMyX3QgbGNkX3BhbmVsX3Jlc2V0W10gPSB7Ci0JQ01EMCgweDEpLCAvKiByZXNldCAqLwotCUNNRDAoMHgwKSwgLyogbm9wICovCi0JQ01EMCgweDApLCAvKiBub3AgKi8KLQlDTUQwKDB4MCksIC8qIG5vcCAqLwotfTsKLQotc3RhdGljIHVpbnQzMl90IGxjZF9wYW5lbF9vbltdID0gewotCUNNRDAoMHgyOSksCQkvKiBEaXNwbGF5IE9OICovCi0JQ01EMigweEI4LCAweEZGLCAweEY5KSwJLyogT3V0cHV0IENvbnRyb2wgKi8KLQlDTUQwKDB4MTEpLAkJLyogU2xlZXAgb3V0ICovCi0JQ01EMSgweEIwLCAweDE2KSwJLyogV2FrZSAqLwotfTsKLQotc3RhdGljIHVpbnQzMl90IGxjZF9wYW5lbF9vZmZbXSA9IHsKLQlDTUQwKDB4MjgpLAkJLyogRGlzcGxheSBPRkYgKi8KLQlDTUQyKDB4QjgsIDB4ODAsIDB4MDIpLAkvKiBPdXRwdXQgQ29udHJvbCAqLwotCUNNRDAoMHgxMCksCQkvKiBTbGVlcCBpbiAqLwotCUNNRDEoMHhCMCwgMHgwMCksCS8qIERlZXAgc3RhbmQgYnkgaW4gKi8KLX07Ci0KLXN0YXRpYyB1aW50MzJfdCBsY2RfdmdhX3Bhc3NfdGhyb3VnaFtdID0gewotCUNNRDEoMHhCMCwgMHgxNiksCi0JQ01EMSgweEJDLCAweDgwKSwKLQlDTUQxKDB4RTEsIDB4MDApLAotCUNNRDEoMHgzNiwgMHg1MCksCi0JQ01EMSgweDNCLCAweDAwKSwKLX07Ci0KLXN0YXRpYyB1aW50MzJfdCBsY2RfcXZnYV9wYXNzX3Rocm91Z2hbXSA9IHsKLQlDTUQxKDB4QjAsIDB4MTYpLAotCUNNRDEoMHhCQywgMHg4MSksCi0JQ01EMSgweEUxLCAweDAwKSwKLQlDTUQxKDB4MzYsIDB4NTApLAotCUNNRDEoMHgzQiwgMHgyMiksCi19OwotCi1zdGF0aWMgdWludDMyX3QgbGNkX3ZnYV90cmFuc2ZlcltdID0gewotCUNNRDEoMHhjZiwgMHgwMiksIAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMSkgKi8KLQlDTUQyKDB4ZDAsIDB4MDgsIDB4MDQpLAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMikgKi8KLQlDTUQxKDB4ZDEsIDB4MDEpLAkvKiBDS1YgdGltaW5nIGNvbnRyb2wgb24vb2ZmICovCi0JQ01EMigweGQyLCAweDE0LCAweDAwKSwJLyogQ0tWIDEsMiB0aW1pbmcgY29udHJvbCAqLwotCUNNRDIoMHhkMywgMHgxYSwgMHgwZiksCS8qIE9FViB0aW1pbmcgY29udHJvbCAqLwotCUNNRDIoMHhkNCwgMHgxZiwgMHhhZiksCS8qIEFTVyB0aW1pbmcgY29udHJvbCAoMSkgKi8KLQlDTUQxKDB4ZDUsIDB4MTQpLAkvKiBBU1cgdGltaW5nIGNvbnRyb2wgKDIpICovCi0JQ01EMCgweDIxKSwJCS8qIEludmVydCBmb3Igbm9ybWFsbHkgYmxhY2sgZGlzcGxheSAqLwotCUNNRDAoMHgyOSksCQkvKiBEaXNwbGF5IG9uICovCi19OwotCi1zdGF0aWMgdWludDMyX3QgbGNkX3F2Z2FfdHJhbnNmZXJbXSA9IHsKLQlDTUQxKDB4ZDYsIDB4MDIpLAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMSkgKi8KLQlDTUQyKDB4ZDcsIDB4MDgsIDB4MDQpLAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMikgKi8KLQlDTUQxKDB4ZDgsIDB4MDEpLAkvKiBDS1YgdGltaW5nIGNvbnRyb2wgb24vb2ZmICovCi0JQ01EMigweGQ5LCAweDAwLCAweDA4KSwJLyogQ0tWIDEsMiB0aW1pbmcgY29udHJvbCAqLwotCUNNRDIoMHhkZSwgMHgwNSwgMHgwYSksCS8qIE9FViB0aW1pbmcgY29udHJvbCAqLwotCUNNRDIoMHhkZiwgMHgwYSwgMHgxOSksCS8qIEFTVyB0aW1pbmcgY29udHJvbCAoMSkgKi8KLQlDTUQxKDB4ZTAsIDB4MGEpLAkvKiBBU1cgdGltaW5nIGNvbnRyb2wgKDIpICovCi0JQ01EMCgweDIxKSwJCS8qIEludmVydCBmb3Igbm9ybWFsbHkgYmxhY2sgZGlzcGxheSAqLwotCUNNRDAoMHgyOSksCQkvKiBEaXNwbGF5IG9uICovCi19OwotCi1zdGF0aWMgdWludDMyX3QgbGNkX3BhbmVsX2NvbmZpZ1tdID0gewotCUNNRDIoMHhiOCwgMHhmZiwgMHhmOSksCS8qIE91dHB1dCBjb250cm9sICovCi0JQ01EMCgweDExKSwJCS8qIHNsZWVwIG91dCAqLwotCUNNRDEoMHhiYSwgMHgwMSksCS8qIERpc3BsYXkgbW9kZSAoMSkgKi8KLQlDTUQxKDB4YmIsIDB4MDApLAkvKiBEaXNwbGF5IG1vZGUgKDIpICovCi0JQ01EMSgweDNhLCAweDYwKSwJLyogRGlzcGxheSBtb2RlIDE4LWJpdCBSR0IgKi8KLQlDTUQxKDB4YmYsIDB4MTApLAkvKiBEcml2ZSBzeXN0ZW0gY2hhbmdlIGNvbnRyb2wgKi8KLQlDTUQxKDB4YjEsIDB4NTYpLAkvKiBCb29zdGVyIG9wZXJhdGlvbiBzZXR1cCAqLwotCUNNRDEoMHhiMiwgMHgzMyksCS8qIEJvb3N0ZXIgbW9kZSBzZXR1cCAqLwotCUNNRDEoMHhiMywgMHgxMSksCS8qIEJvb3N0ZXIgZnJlcXVlbmN5IHNldHVwICovCi0JQ01EMSgweGI0LCAweDAyKSwJLyogT3AgYW1wL3N5c3RlbSBjbG9jayAqLwotCUNNRDEoMHhiNSwgMHgzNSksCS8qIFZDUyB2b2x0YWdlICovCi0JQ01EMSgweGI2LCAweDQwKSwJLyogVkNPTSB2b2x0YWdlICovCi0JQ01EMSgweGI3LCAweDAzKSwJLyogRXh0ZXJuYWwgZGlzcGxheSBzaWduYWwgKi8KLQlDTUQxKDB4YmQsIDB4MDApLAkvKiBBU1cgc2xldyByYXRlICovCi0JQ01EMSgweGJlLCAweDAwKSwJLyogRHVtbXkgZGF0YSBmb3IgUXVhZERhdGEgb3BlcmF0aW9uICovCi0JQ01EMSgweGMwLCAweDExKSwJLyogU2xlZXAgb3V0IEZSIGNvdW50IChBKSAqLwotCUNNRDEoMHhjMSwgMHgxMSksCS8qIFNsZWVwIG91dCBGUiBjb3VudCAoQikgKi8KLQlDTUQxKDB4YzIsIDB4MTEpLAkvKiBTbGVlcCBvdXQgRlIgY291bnQgKEMpICovCi0JQ01EMigweGMzLCAweDIwLCAweDQwKSwJLyogU2xlZXAgb3V0IEZSIGNvdW50IChEKSAqLwotCUNNRDIoMHhjNCwgMHg2MCwgMHhjMCksCS8qIFNsZWVwIG91dCBGUiBjb3VudCAoRSkgKi8KLQlDTUQyKDB4YzUsIDB4MTAsIDB4MjApLAkvKiBTbGVlcCBvdXQgRlIgY291bnQgKEYpICovCi0JQ01EMSgweGM2LCAweGMwKSwJLyogU2xlZXAgb3V0IEZSIGNvdW50IChHKSAqLwotCUNNRDIoMHhjNywgMHgzMywgMHg0MyksCS8qIEdhbW1hIDEgZmluZSB0dW5pbmcgKDEpICovCi0JQ01EMSgweGM4LCAweDQ0KSwJLyogR2FtbWEgMSBmaW5lIHR1bmluZyAoMikgKi8KLQlDTUQxKDB4YzksIDB4MzMpLAkvKiBHYW1tYSAxIGluY2xpbmF0aW9uIGFkanVzdG1lbnQgKi8KLQlDTUQxKDB4Y2EsIDB4MDApLAkvKiBHYW1tYSAxIGJsdWUgb2Zmc2V0IGFkanVzdG1lbnQgKi8KLQlDTUQyKDB4ZWMsIDB4MDEsIDB4ZjApLAkvKiBIb3Jpem9udGFsIGNsb2NrIGN5Y2xlcyAqLwotfTsKLQotc3RhdGljIHZvaWQgc3NwX3JlY29uZmlnKHN0cnVjdCBzc3BfZGV2ICpkZXYsIGludCBucGFyYW0pCi17Ci0Jc3RhdGljIGludCBsYXN0X25wYXJhbSA9IC0xOwotCi0JLyogY2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlLWNvbmZpZyBTU1AgKi8KLQlpZiAobnBhcmFtID09IGxhc3RfbnBhcmFtKQotCQlyZXR1cm47Ci0KLQlzc3BfZGlzYWJsZShkZXYpOwotCXNzcF9jb25maWcoZGV2LCAobnBhcmFtID09IDIpID8gMHgwMDEwMDU4YSA6IDB4MDAxMDA1ODEsIDB4MTgsIDAsIDApOwotCi0JbGFzdF9ucGFyYW0gPSBucGFyYW07Ci19Ci0KLXN0YXRpYyB2b2lkIHNzcF9zZW5kX2NtZCh1aW50MzJfdCAqY21kLCBpbnQgbnVtKQotewotCXN0YXRpYyBpbnQgc3NwX2luaXRpYWxpemVkOwotCXN0YXRpYyBzdHJ1Y3Qgc3NwX2RldiBzc3AyOwotCi0JaW50IGk7Ci0KLQlpZiAoIXNzcF9pbml0aWFsaXplZCkgewotCQlzc3BfaW5pdCgmc3NwMiwgMiwgU1NQX05PX0lSUSk7Ci0JCXNzcF9pbml0aWFsaXplZCA9IDE7Ci0JfQotCi0JY2xrX2VuYWJsZShzc3AyLnNzcC0+Y2xrKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyssIGNtZCsrKSB7Ci0JCXNzcF9yZWNvbmZpZygmc3NwMiwgKCpjbWQgPj4gMzApICYgMHgzKTsKLQkJc3NwX3dyaXRlX3dvcmQoJnNzcDIsICpjbWQgJiAweDNmZmZmZmZmKTsKLQotCQkvKiBGSVhNRTogc3NwX2ZsdXNoKCkgaXMgbWFuZGF0b3J5IGhlcmUgdG8gd29yayAqLwotCQlzc3BfZmx1c2goJnNzcDIpOwotCX0KLQljbGtfZGlzYWJsZShzc3AyLnNzcC0+Y2xrKTsKLX0KLQotc3RhdGljIHZvaWQgbGl0dGxldG9uX2xjZF9wb3dlcihpbnQgb24sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQotewotCWlmIChvbikgewotCQlzc3Bfc2VuZF9jbWQoQVJSQVlfQU5EX1NJWkUobGNkX3BhbmVsX29uKSk7Ci0JCXNzcF9zZW5kX2NtZChBUlJBWV9BTkRfU0laRShsY2RfcGFuZWxfcmVzZXQpKTsKLQkJaWYgKHZhci0+eHJlcyA+IDI0MCkgewotCQkJLyogVkdBICovCi0JCQlzc3Bfc2VuZF9jbWQoQVJSQVlfQU5EX1NJWkUobGNkX3ZnYV9wYXNzX3Rocm91Z2gpKTsKLQkJCXNzcF9zZW5kX2NtZChBUlJBWV9BTkRfU0laRShsY2RfcGFuZWxfY29uZmlnKSk7Ci0JCQlzc3Bfc2VuZF9jbWQoQVJSQVlfQU5EX1NJWkUobGNkX3ZnYV90cmFuc2ZlcikpOwotCQl9IGVsc2UgewotCQkJLyogUVZHQSAqLwotCQkJc3NwX3NlbmRfY21kKEFSUkFZX0FORF9TSVpFKGxjZF9xdmdhX3Bhc3NfdGhyb3VnaCkpOwotCQkJc3NwX3NlbmRfY21kKEFSUkFZX0FORF9TSVpFKGxjZF9wYW5lbF9jb25maWcpKTsKLQkJCXNzcF9zZW5kX2NtZChBUlJBWV9BTkRfU0laRShsY2RfcXZnYV90cmFuc2ZlcikpOwotCQl9Ci0JfSBlbHNlCi0JCXNzcF9zZW5kX2NtZChBUlJBWV9BTkRfU0laRShsY2RfcGFuZWxfb2ZmKSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIHRwb190ZG8yNG10ZWExX21vZGVzW10gPSB7CiAJWzBdID0gewogCQkvKiBWR0EgKi8KQEAgLTMxMiw3ICsxNjAsNiBAQAogCS5tb2RlcwkJCT0gdHBvX3RkbzI0bXRlYTFfbW9kZXMsCiAJLm51bV9tb2RlcwkJPSAyLAogCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQLAotCS5weGFmYl9sY2RfcG93ZXIJPSBsaXR0bGV0b25fbGNkX3Bvd2VyLAogfTsKIAogc3RhdGljIHZvaWQgbGl0dGxldG9uX2luaXRfbGNkKHZvaWQpCkBAIC0zMjMsNiArMTcwLDUxIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbGl0dGxldG9uX2luaXRfbGNkKHZvaWQpIHt9OwogI2VuZGlmIC8qIENPTkZJR19GQl9QWEEgfHwgQ09ORklHX0ZCX1BYQV9NT0RVTEUgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFhfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBsaXR0bGV0b25fc3BpX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0CQk9IDEsCit9OworCitzdGF0aWMgdm9pZCBsaXR0bGV0b25fdGRvMjRtX2NzKHUzMiBjbWQpCit7CisJZ3Bpb19zZXRfdmFsdWUoTElUVExFVE9OX0dQSU9fTENEX0NTLCAhKGNtZCA9PSBQWEEyWFhfQ1NfQVNTRVJUKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwIGxpdHRsZXRvbl90ZG8yNG1fY2hpcCA9IHsKKwkucnhfdGhyZXNob2xkCT0gMSwKKwkudHhfdGhyZXNob2xkCT0gMSwKKwkuY3NfY29udHJvbAk9IGxpdHRsZXRvbl90ZG8yNG1fY3MsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGxpdHRsZXRvbl9zcGlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJPSAidGRvMjRtIiwKKwkJLm1heF9zcGVlZF9oegk9IDEwMDAwMDAsCisJCS5idXNfbnVtCT0gMiwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwkJLmNvbnRyb2xsZXJfZGF0YT0gJmxpdHRsZXRvbl90ZG8yNG1fY2hpcCwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGxpdHRsZXRvbl9pbml0X3NwaSh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoTElUVExFVE9OX0dQSU9fTENEX0NTLCAiTENEX0NTIik7CisJaWYgKGVycikgeworCQlwcl93YXJuaW5nKCJmYWlsZWQgdG8gcmVxdWVzdCBHUElPIGZvciBMQ1MgQ1NcbiIpOworCQlyZXR1cm47CisJfQorCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExJVFRMRVRPTl9HUElPX0xDRF9DUywgMSk7CisKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDIsICZsaXR0bGV0b25fc3BpX2luZm8pOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKEFSUkFZX0FORF9TSVpFKGxpdHRsZXRvbl9zcGlfZGV2aWNlcykpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXR0bGV0b25faW5pdF9zcGkodm9pZCkge30KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfUFhBMjd4KSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9QWEEyN3hfTU9EVUxFKQogc3RhdGljIHVuc2lnbmVkIGludCBsaXR0bGV0b25fbWF0cml4X2tleV9tYXBbXSA9IHsKIAkvKiBLRVkocm93LCBjb2wsIGtleV9jb2RlKSAqLwpAQCAtNDMzLDYgKzMyNSw3IEBACiAJICovCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbWM5MXhfZGV2aWNlKTsKIAorCWxpdHRsZXRvbl9pbml0X3NwaSgpOwogCWxpdHRsZXRvbl9pbml0X2xjZCgpOwogCWxpdHRsZXRvbl9pbml0X2tleXBhZCgpOwogCWxpdHRsZXRvbl9pbml0X25hbmQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2xwZDI3MC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKaW5kZXggYjcwMzg5NC4uZGUzZjY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvbHBkMjcwLmg+CiAjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KQEAgLTUxLDYgKzUxLDQzIEBACiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbHBkMjcwX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIENoaXAgU2VsZWN0cyAqLworCUdQSU8xNV9uQ1NfMSwJLyogTWFpbmJvYXJkIEZsYXNoICovCisJR1BJTzc4X25DU18yLAkvKiBDUExEICsgRXRoZXJuZXQgKi8KKworCS8qIExDRCAtIDE2YnBwIEFjdGl2ZSBURlQgKi8KKwlHUElPNThfTENEX0xERF8wLAorCUdQSU81OV9MQ0RfTEREXzEsCisJR1BJTzYwX0xDRF9MRERfMiwKKwlHUElPNjFfTENEX0xERF8zLAorCUdQSU82Ml9MQ0RfTEREXzQsCisJR1BJTzYzX0xDRF9MRERfNSwKKwlHUElPNjRfTENEX0xERF82LAorCUdQSU82NV9MQ0RfTEREXzcsCisJR1BJTzY2X0xDRF9MRERfOCwKKwlHUElPNjdfTENEX0xERF85LAorCUdQSU82OF9MQ0RfTEREXzEwLAorCUdQSU82OV9MQ0RfTEREXzExLAorCUdQSU83MF9MQ0RfTEREXzEyLAorCUdQSU83MV9MQ0RfTEREXzEzLAorCUdQSU83Ml9MQ0RfTEREXzE0LAorCUdQSU83M19MQ0RfTEREXzE1LAorCUdQSU83NF9MQ0RfRkNMSywKKwlHUElPNzVfTENEX0xDTEssCisJR1BJTzc2X0xDRF9QQ0xLLAorCUdQSU83N19MQ0RfQklBUywKKwlHUElPMTZfUFdNMF9PVVQsCS8qIEJhY2tsaWdodCAqLworCisJLyogVVNCIEhvc3QgKi8KKwlHUElPODhfVVNCSDFfUFdSLAorCUdQSU84OV9VU0JIMV9QRU4sCisKKwkvKiBBQzk3ICovCisJR1BJTzQ1X0FDOTdfU1lTQ0xLLAorCisJR1BJTzFfR1BJTyB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCit9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGxwZDI3MF9pcnFfZW5hYmxlZDsKIApAQCAtODgsOCArMTI1LDcgQEAKIAkJR0VEUigwKSA9IEdQSU9fYml0KDApOyAgLyogY2xlYXIgdXNlbGVzcyBlZGdlIG5vdGlmaWNhdGlvbiAqLwogCQlpZiAobGlrZWx5KHBlbmRpbmcpKSB7CiAJCQlpcnEgPSBMUEQyNzBfSVJRKDApICsgX19mZnMocGVuZGluZyk7Ci0JCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCiAJCQlwZW5kaW5nID0gX19yYXdfcmVhZHcoTFBEMjcwX0lOVF9TVEFUVVMpICYKIAkJCQkJCWxwZDI3MF9pcnFfZW5hYmxlZDsKQEAgLTI2NSw4ICszMDEsOCBAQAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gc2hhcnBfbHEwNTdxM2RjMDIgPSB7CiAJLm1vZGVzCQkJPSAmc2hhcnBfbHEwNTdxM2RjMDJfbW9kZSwKIAkubnVtX21vZGVzCQk9IDEsCi0JLmxjY3IwCQkJPSAweDA3ODAwMDgwLAotCS5sY2NyMwkJCT0gMHgwMDQwMDAwMCwKKwkubGNkX2Nvbm4JCT0gTENEX0NPTE9SX1RGVF8xNkJQUCB8IExDRF9QQ0xLX0VER0VfRkFMTCB8CisJCQkJICBMQ0RfQUxURVJOQVRFX01BUFBJTkcsCiB9OwogCiAvKiAxMi4xIiBURlQgU1ZHQSAoTG9MbyBkaXNwbGF5IG51bWJlciAyKSAqLwpAQCAtMjg3LDggKzMyMyw4IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBzaGFycF9scTEyMXMxZGczMSA9IHsKIAkubW9kZXMJCQk9ICZzaGFycF9scTEyMXMxZGczMV9tb2RlLAogCS5udW1fbW9kZXMJCT0gMSwKLQkubGNjcjAJCQk9IDB4MDc4MDAwODAsCi0JLmxjY3IzCQkJPSAweDAwNDAwMDAwLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMIHwKKwkJCQkgIExDRF9BTFRFUk5BVEVfTUFQUElORywKIH07CiAKIC8qIDMuNiIgVEZUIFFWR0EgKExvTG8gZGlzcGxheSBudW1iZXIgMykgKi8KQEAgLTMwOSw4ICszNDUsOCBAQAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gc2hhcnBfbHEwMzZxMWRhMDEgPSB7CiAJLm1vZGVzCQkJPSAmc2hhcnBfbHEwMzZxMWRhMDFfbW9kZSwKIAkubnVtX21vZGVzCQk9IDEsCi0JLmxjY3IwCQkJPSAweDA3ODAwMDgwLAotCS5sY2NyMwkJCT0gMHgwMDQwMDAwMCwKKwkubGNkX2Nvbm4JCT0gTENEX0NPTE9SX1RGVF8xNkJQUCB8IExDRF9QQ0xLX0VER0VfRkFMTCB8CisJCQkJICBMQ0RfQUxURVJOQVRFX01BUFBJTkcsCiB9OwogCiAvKiA2LjQiIFRGVCBWR0EgKExvTG8gZGlzcGxheSBudW1iZXIgNSkgKi8KQEAgLTMzMSw4ICszNjcsOCBAQAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gc2hhcnBfbHE2NGQzNDMgPSB7CiAJLm1vZGVzCQkJPSAmc2hhcnBfbHE2NGQzNDNfbW9kZSwKIAkubnVtX21vZGVzCQk9IDEsCi0JLmxjY3IwCQkJPSAweDA3ODAwMDgwLAotCS5sY2NyMwkJCT0gMHgwMDQwMDAwMCwKKwkubGNkX2Nvbm4JCT0gTENEX0NPTE9SX1RGVF8xNkJQUCB8IExDRF9QQ0xLX0VER0VfRkFMTCB8CisJCQkJICBMQ0RfQUxURVJOQVRFX01BUFBJTkcsCiB9OwogCiAvKiAxMC40IiBURlQgVkdBIChMb0xvIGRpc3BsYXkgbnVtYmVyIDcpICovCkBAIC0zNTMsOCArMzg5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIHNoYXJwX2xxMTBkMzY4ID0gewogCS5tb2RlcwkJCT0gJnNoYXJwX2xxMTBkMzY4X21vZGUsCiAJLm51bV9tb2RlcwkJPSAxLAotCS5sY2NyMAkJCT0gMHgwNzgwMDA4MCwKLQkubGNjcjMJCQk9IDB4MDA0MDAwMDAsCisJLmxjZF9jb25uCQk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfUENMS19FREdFX0ZBTEwgfAorCQkJCSAgTENEX0FMVEVSTkFURV9NQVBQSU5HLAogfTsKIAogLyogMy41IiBURlQgUVZHQSAoTG9MbyBkaXNwbGF5IG51bWJlciA4KSAqLwpAQCAtMzc1LDggKzQxMSw4IEBACiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBzaGFycF9scTAzNXE3ZGIwMl8yMCA9IHsKIAkubW9kZXMJCQk9ICZzaGFycF9scTAzNXE3ZGIwMl8yMF9tb2RlLAogCS5udW1fbW9kZXMJCT0gMSwKLQkubGNjcjAJCQk9IDB4MDc4MDAwODAsCi0JLmxjY3IzCQkJPSAweDAwNDAwMDAwLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMIHwKKwkJCQkgIExDRF9BTFRFUk5BVEVfTUFQUElORywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvICpscGQyNzBfbGNkX3RvX3VzZTsKQEAgLTQxMSwyNyArNDQ3LDE1IEBACiAJJmxwZDI3MF9mbGFzaF9kZXZpY2VbMV0sCiB9OwogCi1zdGF0aWMgaW50IGxwZDI3MF9vaGNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIHNldHVwIFBvcnQxIEdQSU8gcGluLiAqLwotCXB4YV9ncGlvX21vZGUoODggfCBHUElPX0FMVF9GTl8xX0lOKTsJLyogVVNCSFBXUjEgKi8KLQlweGFfZ3Bpb19tb2RlKDg5IHwgR1BJT19BTFRfRk5fMl9PVVQpOwkvKiBVU0JIUEVOMSAqLwotCi0JLyogU2V0IHRoZSBQb3dlciBDb250cm9sIFBvbGFyaXR5IExvdyBhbmQgUG93ZXIgU2Vuc2UKLQkgICBQb2xhcml0eSBMb3cgdG8gYWN0aXZlIGxvdy4gKi8KLQlVSENIUiA9IChVSENIUiB8IFVIQ0hSX1BDUEwgfCBVSENIUl9QU1BMKSAmCi0JCX4oVUhDSFJfU1NFUDEgfCBVSENIUl9TU0VQMiB8IFVIQ0hSX1NTRVAzIHwgVUhDSFJfU1NFKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBscGQyNzBfb2hjaV9wbGF0Zm9ybV9kYXRhID0gewogCS5wb3J0X21vZGUJPSBQTU1fUEVSUE9SVF9NT0RFLAotCS5pbml0CQk9IGxwZDI3MF9vaGNpX2luaXQsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUX0FMTCB8IFBPV0VSX0NPTlRST0xfTE9XIHwgUE9XRVJfU0VOU0VfTE9XLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGxwZDI3MF9pbml0KHZvaWQpCiB7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUobHBkMjcwX3Bpbl9jb25maWcpKTsKKwogCWxwZDI3MF9mbGFzaF9kYXRhWzBdLndpZHRoID0gKEJPT1RfREVGICYgMSkgPyAyIDogNDsKIAlscGQyNzBfZmxhc2hfZGF0YVsxXS53aWR0aCA9IDQ7CiAKQEAgLTQ0MiwxMiArNDY2LDYgQEAKIAkgKi8KIAlBUkJfQ05UUkwgPSBBUkJfQ09SRV9QQVJLIHwgMHgyMzQ7CiAKLQkvKgotCSAqIE9uIExvZ2ljUEQgUFhBMjcwLCB3ZSByb3V0ZSBBQzk3X1NZU0NMSyB2aWEgR1BJTzQ1LgotCSAqLwotCXB4YV9ncGlvX21vZGUoR1BJTzQ1X1NZU0NMS19BQzk3X01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8xNl9QV00wX01EKTsKLQogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBsYXRmb3JtX2RldmljZXMsIEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcykpOwogCiAJcHhhX3NldF9hYzk3X2luZm8oTlVMTCk7CkBAIC00NzMsMTUgKzQ5MSw2IEBACiAJcHhhX21hcF9pbygpOwogCWlvdGFibGVfaW5pdChscGQyNzBfaW9fZGVzYywgQVJSQVlfU0laRShscGQyNzBfaW9fZGVzYykpOwogCi0JLyogaW5pdGlhbGl6ZSBzbGVlcCBtb2RlIHJlZ3MgKHdha2UtdXAgc291cmNlcywgZXRjKSAqLwotCVBHU1IwID0gMHgwMDAwODgwMDsKLQlQR1NSMSA9IDB4MDAwMDAwMDI7Ci0JUEdTUjIgPSAweDAwMDFGQzAwOwotCVBHU1IzID0gMHgwMDAwMUY4MTsKLQlQV0VSICA9IDB4QzAwMDAwMDI7Ci0JUFJFUiAgPSAweDAwMDAwMDAyOwotCVBGRVIgID0gMHgwMDAwMDAwMjsKLQogCS8qIGZvciB1c2UgSSBTUkFNIGFzIGZyYW1lYnVmZmVyLiAgKi8KIAlQU0xSIHw9IDB4MDAwMDBGMDQ7CiAJUENGUiAgPSAweDAwMDAwMDY2OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IDRmZmRmZjIuLmJmZjcwNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTU3LDEzICs1NywzNiBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsdWJib2NrX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0gewogCUdQSU8xNV9uQ1NfMSwJLyogQ1MxIC0gRmxhc2ggKi8KKwlHUElPNzhfbkNTXzIsCS8qIENTMiAtIEJhc2Vib2FyZCBGR1BBICovCiAJR1BJTzc5X25DU18zLAkvKiBDUzMgLSBTTUMgZXRoZXJuZXQgKi8KKwlHUElPODBfbkNTXzQsCS8qIENTNCAtIFNBMTExMSAqLwogCiAJLyogU1NQIGRhdGEgcGlucyAqLwogCUdQSU8yM19TU1AxX1NDTEssCiAJR1BJTzI1X1NTUDFfVFhELAogCUdQSU8yNl9TU1AxX1JYRCwKIAorCS8qIExDRCAtIDE2YnBwIERTVE4gKi8KKwlHUElPNThfTENEX0xERF8wLAorCUdQSU81OV9MQ0RfTEREXzEsCisJR1BJTzYwX0xDRF9MRERfMiwKKwlHUElPNjFfTENEX0xERF8zLAorCUdQSU82Ml9MQ0RfTEREXzQsCisJR1BJTzYzX0xDRF9MRERfNSwKKwlHUElPNjRfTENEX0xERF82LAorCUdQSU82NV9MQ0RfTEREXzcsCisJR1BJTzY2X0xDRF9MRERfOCwKKwlHUElPNjdfTENEX0xERF85LAorCUdQSU82OF9MQ0RfTEREXzEwLAorCUdQSU82OV9MQ0RfTEREXzExLAorCUdQSU83MF9MQ0RfTEREXzEyLAorCUdQSU83MV9MQ0RfTEREXzEzLAorCUdQSU83Ml9MQ0RfTEREXzE0LAorCUdQSU83M19MQ0RfTEREXzE1LAorCUdQSU83NF9MQ0RfRkNMSywKKwlHUElPNzVfTENEX0xDTEssCisJR1BJTzc2X0xDRF9QQ0xLLAorCiAJLyogQlRVQVJUICovCiAJR1BJTzQyX0JUVUFSVF9SWEQsCiAJR1BJTzQzX0JUVUFSVF9UWEQsCkBAIC0xMzIsOCArMTU1LDcgQEAKIAkJR0VEUigwKSA9IEdQSU9fYml0KDApOwkvKiBjbGVhciBvdXIgcGFyZW50IGlycSAqLwogCQlpZiAobGlrZWx5KHBlbmRpbmcpKSB7CiAJCQlpcnEgPSBMVUJCT0NLX0lSUSgwKSArIF9fZmZzKHBlbmRpbmcpOwotCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCQlwZW5kaW5nID0gTFVCX0lSUV9TRVRfQ0xSICYgbHViYm9ja19pcnFfZW5hYmxlZDsKIAl9IHdoaWxlIChwZW5kaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCmluZGV4IDE0M2YyOGEuLjUxOTEzOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAgKiBMRURzCiAgKi8KIAotc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdID0geworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKIAl7CiAJCS5uYW1lID0gIm1hZ2ljaWFuOjp2aWJyYSIsCiAJCS5kZWZhdWx0X3RyaWdnZXIgPSAibm9uZSIsCkBAIC02NjksMTggKzY2OSwxMCBAQAogICogVVNCIE9IQ0kKICAqLwogCi1zdGF0aWMgaW50IG1hZ2ljaWFuX29oY2lfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JVUhDSFIgPSAoVUhDSFIgfCBVSENIUl9TU0VQMiB8IFVIQ0hSX1BDUEwgfCBVSENIUl9DR1IpICYKLQkgICAgfihVSENIUl9TU0VQMSB8IFVIQ0hSX1NTRVAzIHwgVUhDSFJfU1NFKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBtYWdpY2lhbl9vaGNpX2luZm8gPSB7Ci0JLnBvcnRfbW9kZSAgICA9IFBNTV9QRVJQT1JUX01PREUsCi0JLmluaXQgICAgICAgICA9IG1hZ2ljaWFuX29oY2lfaW5pdCwKLQkucG93ZXJfYnVkZ2V0ID0gMCwKKwkucG9ydF9tb2RlCT0gUE1NX1BFUlBPUlRfTU9ERSwKKwkuZmxhZ3MJCT0gRU5BQkxFX1BPUlQxIHwgRU5BQkxFX1BPUlQzIHwgUE9XRVJfQ09OVFJPTF9MT1csCisJLnBvd2VyX2J1ZGdldAk9IDAsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKaW5kZXggZDQ0YWY3Ni4uZjJjN2FkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMKQEAgLTE2Miw4ICsxNjIsNyBAQAogCQlHRURSKDApID0gR1BJT19iaXQoMCk7ICAvKiBjbGVhciB1c2VsZXNzIGVkZ2Ugbm90aWZpY2F0aW9uICovCiAJCWlmIChsaWtlbHkocGVuZGluZykpIHsKIAkJCWlycSA9IE1BSU5TVE9ORV9JUlEoMCkgKyBfX2ZmcyhwZW5kaW5nKTsKLQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCX0KIAkJcGVuZGluZyA9IE1TVF9JTlRTRVRDTFIgJiBtYWluc3RvbmVfaXJxX2VuYWJsZWQ7CiAJfSB3aGlsZSAocGVuZGluZyk7CkBAIC01MDgsMTkgKzUwNyw5IEBACiAJJm1zdF9ncGlvX2tleXNfZGV2aWNlLAogfTsKIAotc3RhdGljIGludCBtYWluc3RvbmVfb2hjaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQkvKiBTZXQgdGhlIFBvd2VyIENvbnRyb2wgUG9sYXJpdHkgTG93IGFuZCBQb3dlciBTZW5zZQotCSAgIFBvbGFyaXR5IExvdyB0byBhY3RpdmUgbG93LiAqLwotCVVIQ0hSID0gKFVIQ0hSIHwgVUhDSFJfUENQTCB8IFVIQ0hSX1BTUEwpICYKLQkJfihVSENIUl9TU0VQMSB8IFVIQ0hSX1NTRVAyIHwgVUhDSFJfU1NFUDMgfCBVSENIUl9TU0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcHhhb2hjaV9wbGF0Zm9ybV9kYXRhIG1haW5zdG9uZV9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLnBvcnRfbW9kZQk9IFBNTV9QRVJQT1JUX01PREUsCi0JLmluaXQJCT0gbWFpbnN0b25lX29oY2lfaW5pdCwKKwkuZmxhZ3MJCT0gRU5BQkxFX1BPUlRfQUxMIHwgUE9XRVJfQ09OVFJPTF9MT1cgfCBQT1dFUl9TRU5TRV9MT1csCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfUFhBMjd4KSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9QWEEyN3hfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCmluZGV4IDkyNTU3NWYuLjIwNjFjMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKQEAgLTI1LDcgKzI1LDEyIEBACiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKLSNkZWZpbmUgUEdTUih4KQkJX19SRUcyKDB4NDBGMDAwMjAsICgoeCkgJiAweDYwKSA+PiAzKQorI2RlZmluZSBncGlvX3RvX2JhbmsoZ3BpbykJKChncGlvKSA+PiA1KQorCisjZGVmaW5lIFBHU1IoeCkJCV9fUkVHMigweDQwRjAwMDIwLCAoeCkgPDwgMikKKyNkZWZpbmUgX19HQUZSKHUsIHgpCV9fUkVHMigodSkgPyAweDQwRTAwMDU4IDogMHg0MEUwMDA1NCwgKHgpIDw8IDMpCisjZGVmaW5lIEdBRlJfTCh4KQlfX0dBRlIoMCwgeCkKKyNkZWZpbmUgR0FGUl9VKHgpCV9fR0FGUigxLCB4KQogCiAjZGVmaW5lIFBXRVJfV0UzNQkoMSA8PCAyNCkKIApAQCAtMzgsNDkgKzQzLDU5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW9fZGVzYyBncGlvX2Rlc2NbTUZQX1BJTl9HUElPMTI3ICsgMV07CitzdGF0aWMgaW50IGdwaW9fbnI7CiAKLXN0YXRpYyBpbnQgX19tZnBfY29uZmlnX2xwbSh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBsb25nIGxwbSkKLXsKLQl1bnNpZ25lZCBtYXNrID0gR1BJT19iaXQoZ3Bpbyk7Ci0KLQkvKiBsb3cgcG93ZXIgc3RhdGUgKi8KLQlzd2l0Y2ggKGxwbSkgewotCWNhc2UgTUZQX0xQTV9EUklWRV9ISUdIOgotCQlQR1NSKGdwaW8pIHw9IG1hc2s7Ci0JCWJyZWFrOwotCWNhc2UgTUZQX0xQTV9EUklWRV9MT1c6Ci0JCVBHU1IoZ3BpbykgJj0gfm1hc2s7Ci0JCWJyZWFrOwotCWNhc2UgTUZQX0xQTV9JTlBVVDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfd2FybmluZygiJXM6IGludmFsaWQgbG93IHBvd2VyIHN0YXRlIGZvciBHUElPJWRcbiIsCi0JCQkJX19mdW5jX18sIGdwaW8pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgdW5zaWduZWQgbG9uZyBncGRyX2xwbVs0XTsKIAogc3RhdGljIGludCBfX21mcF9jb25maWdfZ3Bpbyh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBsb25nIGMpCiB7CiAJdW5zaWduZWQgbG9uZyBnYWZyLCBtYXNrID0gR1BJT19iaXQoZ3Bpbyk7Ci0JaW50IGZuOworCWludCBiYW5rID0gZ3Bpb190b19iYW5rKGdwaW8pOworCWludCB1b3JsID0gISEoZ3BpbyAmIDB4MTApOyAvKiBHQUZSeF9VIG9yIEdBRlJ4X0wgPyAqLworCWludCBzaGZ0ID0gKGdwaW8gJiAweGYpIDw8IDE7CisJaW50IGZuID0gTUZQX0FGKGMpOworCWludCBkaXIgPSBjICYgTUZQX0RJUl9PVVQ7CiAKLQlmbiA9IE1GUF9BRihjKTsKIAlpZiAoZm4gPiAzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGFsdGVybmF0ZSBmdW5jdGlvbiBhbmQgZGlyZWN0aW9uICovCi0JZ2FmciA9IEdBRlIoZ3BpbykgJiB+KDB4MyA8PCAoKGdwaW8gJiAweGYpICogMikpOwotCUdBRlIoZ3BpbykgPSBnYWZyIHwgIChmbiAgPDwgKChncGlvICYgMHhmKSAqIDIpKTsKKwkvKiBhbHRlcm5hdGUgZnVuY3Rpb24gYW5kIGRpcmVjdGlvbiBhdCBydW4tdGltZSAqLworCWdhZnIgPSAodW9ybCA9PSAwKSA/IEdBRlJfTChiYW5rKSA6IEdBRlJfVShiYW5rKTsKKwlnYWZyID0gKGdhZnIgJiB+KDB4MyA8PCBzaGZ0KSkgfCAoZm4gPDwgc2hmdCk7CiAKLQlpZiAoYyAmIE1GUF9ESVJfT1VUKQorCWlmICh1b3JsID09IDApCisJCUdBRlJfTChiYW5rKSA9IGdhZnI7CisJZWxzZQorCQlHQUZSX1UoYmFuaykgPSBnYWZyOworCisJaWYgKGRpciA9PSBNRlBfRElSX09VVCkKIAkJR1BEUihncGlvKSB8PSBtYXNrOwogCWVsc2UKIAkJR1BEUihncGlvKSAmPSB+bWFzazsKIAotCWlmIChfX21mcF9jb25maWdfbHBtKGdwaW8sIGMgJiBNRlBfTFBNX1NUQVRFX01BU0spKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBhbHRlcm5hdGUgZnVuY3Rpb24gYW5kIGRpcmVjdGlvbiBhdCBsb3cgcG93ZXIgbW9kZSAqLworCXN3aXRjaCAoYyAmIE1GUF9MUE1fU1RBVEVfTUFTSykgeworCWNhc2UgTUZQX0xQTV9EUklWRV9ISUdIOgorCQlQR1NSKGJhbmspIHw9IG1hc2s7CisJCWRpciA9IE1GUF9ESVJfT1VUOworCQlicmVhazsKKwljYXNlIE1GUF9MUE1fRFJJVkVfTE9XOgorCQlQR1NSKGJhbmspICY9IH5tYXNrOworCQlkaXIgPSBNRlBfRElSX09VVDsKKwkJYnJlYWs7CisJY2FzZSBNRlBfTFBNX0RFRkFVTFQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHdhcm5pbmcgYW5kIGZhbGwgdGhyb3VnaCwgdHJlYXQgYXMgTUZQX0xQTV9ERUZBVUxUICovCisJCXByX3dhcm5pbmcoIiVzOiBHUElPJWQ6IHVuc3VwcG9ydGVkIGxvdyBwb3dlciBtb2RlXG4iLAorCQkJCV9fZnVuY19fLCBncGlvKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRpciA9PSBNRlBfRElSX09VVCkKKwkJZ3Bkcl9scG1bYmFua10gfD0gbWFzazsKKwllbHNlCisJCWdwZHJfbHBtW2JhbmtdICY9IH5tYXNrOwogCiAJLyogZ2l2ZSBlYXJseSB3YXJuaW5nIGlmIE1GUF9MUE1fQ0FOX1dBS0VVUCBpcyBzZXQgb24gdGhlCiAJICogY29uZmlndXJhdGlvbnMgb2YgdGhvc2UgcGlucyBub3QgYWJsZSB0byB3YWtldXAKQEAgLTkxLDcgKzEwNiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICgoYyAmIE1GUF9MUE1fQ0FOX1dBS0VVUCkgJiYgKGMgJiBNRlBfRElSX09VVCkpIHsKKwlpZiAoKGMgJiBNRlBfTFBNX0NBTl9XQUtFVVApICYmIChkaXIgPT0gTUZQX0RJUl9PVVQpKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBvdXRwdXQgR1BJTyVkIHVuYWJsZSB0byB3YWtldXBcbiIsCiAJCQkJX19mdW5jX18sIGdwaW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzNSw3ICsxNTAsNyBAQAogCiB2b2lkIHB4YTJ4eF9tZnBfc2V0X2xwbShpbnQgbWZwLCB1bnNpZ25lZCBsb25nIGxwbSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGM7CiAJaW50IGdwaW87CiAKIAlncGlvID0gX19tZnBfdmFsaWRhdGUobWZwKTsKQEAgLTE0Myw3ICsxNTgsMTEgQEAKIAkJcmV0dXJuOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9fbWZwX2NvbmZpZ19scG0oZ3BpbywgbHBtKTsKKworCWMgPSBncGlvX2Rlc2NbZ3Bpb10uY29uZmlnOworCWMgPSAoYyAmIH5NRlBfTFBNX1NUQVRFX01BU0spIHwgbHBtOworCV9fbWZwX2NvbmZpZ19ncGlvKGdwaW8sIGMpOworCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCkBAIC0xODcsMjMgKzIwNiwyMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BYQTI1eAotc3RhdGljIGludCBfX2luaXQgcHhhMjV4X21mcF9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcHhhMjV4X21mcF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKLQlpZiAoY3B1X2lzX3B4YTI1eCgpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPD0gODQ7IGkrKykKLQkJCWdwaW9fZGVzY1tpXS52YWxpZCA9IDE7CisJZm9yIChpID0gMDsgaSA8PSA4NDsgaSsrKQorCQlncGlvX2Rlc2NbaV0udmFsaWQgPSAxOwogCi0JCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgewotCQkJZ3Bpb19kZXNjW2ldLmNhbl93YWtldXAgPSAxOwotCQkJZ3Bpb19kZXNjW2ldLm1hc2sgPSBHUElPX2JpdChpKTsKLQkJfQorCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQlncGlvX2Rlc2NbaV0uY2FuX3dha2V1cCA9IDE7CisJCWdwaW9fZGVzY1tpXS5tYXNrID0gR1BJT19iaXQoaSk7CiAJfQogCi0JcmV0dXJuIDA7CisJZ3Bpb19uciA9IDg1OwogfQotcG9zdGNvcmVfaW5pdGNhbGwocHhhMjV4X21mcF9pbml0KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHhhMjV4X21mcF9pbml0KHZvaWQpIHt9CiAjZW5kaWYgLyogQ09ORklHX1BYQTI1eCAqLwogCiAjaWZkZWYgQ09ORklHX1BYQTI3eApAQCAtMjMzLDQ1ICsyNTEsMTA2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHB4YTI3eF9tZnBfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHB4YTI3eF9tZnBfaW5pdCh2b2lkKQogewogCWludCBpLCBncGlvOwogCi0JaWYgKGNwdV9pc19weGEyN3goKSkgewotCQlmb3IgKGkgPSAwOyBpIDw9IDEyMDsgaSsrKSB7Ci0JCQkvKiBza2lwIEdQSU8yLCA1LCA2LCA3LCA4LCB0aGV5IGFyZSBub3QKLQkJCSAqIHZhbGlkIHBpbnMgYWxsb3cgY29uZmlndXJhdGlvbgotCQkJICovCi0JCQlpZiAoaSA9PSAyIHx8IGkgPT0gNSB8fCBpID09IDYgfHwKLQkJCSAgICBpID09IDcgfHwgaSA9PSA4KQotCQkJCWNvbnRpbnVlOworCWZvciAoaSA9IDA7IGkgPD0gMTIwOyBpKyspIHsKKwkJLyogc2tpcCBHUElPMiwgNSwgNiwgNywgOCwgdGhleSBhcmUgbm90CisJCSAqIHZhbGlkIHBpbnMgYWxsb3cgY29uZmlndXJhdGlvbgorCQkgKi8KKwkJaWYgKGkgPT0gMiB8fCBpID09IDUgfHwgaSA9PSA2IHx8IGkgPT0gNyB8fCBpID09IDgpCisJCQljb250aW51ZTsKIAotCQkJZ3Bpb19kZXNjW2ldLnZhbGlkID0gMTsKLQkJfQotCi0JCS8qIEtleXBhZCBHUElPcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShweGEyN3hfcGt3cl9ncGlvKTsgaSsrKSB7Ci0JCQlncGlvID0gcHhhMjd4X3Brd3JfZ3Bpb1tpXTsKLQkJCWdwaW9fZGVzY1tncGlvXS5jYW5fd2FrZXVwID0gMTsKLQkJCWdwaW9fZGVzY1tncGlvXS5rZXlwYWRfZ3BpbyA9IDE7Ci0JCQlncGlvX2Rlc2NbZ3Bpb10ubWFzayA9IDEgPDwgaTsKLQkJfQotCi0JCS8qIE92ZXJ3cml0ZSBHUElPMTMgYXMgYSBQV0VSIHdha2V1cCBzb3VyY2UgKi8KLQkJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKSB7Ci0JCQkvKiBza2lwIEdQSU8yLCA1LCA2LCA3LCA4ICovCi0JCQlpZiAoR1BJT19iaXQoaSkgJiAweDFlNCkKLQkJCQljb250aW51ZTsKLQotCQkJZ3Bpb19kZXNjW2ldLmNhbl93YWtldXAgPSAxOwotCQkJZ3Bpb19kZXNjW2ldLm1hc2sgPSBHUElPX2JpdChpKTsKLQkJfQotCi0JCWdwaW9fZGVzY1szNV0uY2FuX3dha2V1cCA9IDE7Ci0JCWdwaW9fZGVzY1szNV0ubWFzayA9IFBXRVJfV0UzNTsKKwkJZ3Bpb19kZXNjW2ldLnZhbGlkID0gMTsKIAl9CiAKKwkvKiBLZXlwYWQgR1BJT3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShweGEyN3hfcGt3cl9ncGlvKTsgaSsrKSB7CisJCWdwaW8gPSBweGEyN3hfcGt3cl9ncGlvW2ldOworCQlncGlvX2Rlc2NbZ3Bpb10uY2FuX3dha2V1cCA9IDE7CisJCWdwaW9fZGVzY1tncGlvXS5rZXlwYWRfZ3BpbyA9IDE7CisJCWdwaW9fZGVzY1tncGlvXS5tYXNrID0gMSA8PCBpOworCX0KKworCS8qIE92ZXJ3cml0ZSBHUElPMTMgYXMgYSBQV0VSIHdha2V1cCBzb3VyY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDE1OyBpKyspIHsKKwkJLyogc2tpcCBHUElPMiwgNSwgNiwgNywgOCAqLworCQlpZiAoR1BJT19iaXQoaSkgJiAweDFlNCkKKwkJCWNvbnRpbnVlOworCisJCWdwaW9fZGVzY1tpXS5jYW5fd2FrZXVwID0gMTsKKwkJZ3Bpb19kZXNjW2ldLm1hc2sgPSBHUElPX2JpdChpKTsKKwl9CisKKwlncGlvX2Rlc2NbMzVdLmNhbl93YWtldXAgPSAxOworCWdwaW9fZGVzY1szNV0ubWFzayA9IFBXRVJfV0UzNTsKKworCWdwaW9fbnIgPSAxMjE7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHB4YTI3eF9tZnBfaW5pdCh2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19QWEEyN3ggKi8KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZWRfZ2FmclsyXVs0XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVkX2dwZHJbNF07CisKK3N0YXRpYyBpbnQgcHhhMnh4X21mcF9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IGdwaW9fdG9fYmFuayhncGlvX25yKTsgaSsrKSB7CisKKwkJc2F2ZWRfZ2FmclswXVtpXSA9IEdBRlJfTChpKTsKKwkJc2F2ZWRfZ2FmclsxXVtpXSA9IEdBRlJfVShpKTsKKwkJc2F2ZWRfZ3BkcltpXSA9IEdQRFIoaSAqIDMyKTsKKworCQlHUERSKGkgKiAzMikgPSBncGRyX2xwbVtpXTsKKwl9CiAJcmV0dXJuIDA7CiB9Ci1wb3N0Y29yZV9pbml0Y2FsbChweGEyN3hfbWZwX2luaXQpOwotI2VuZGlmIC8qIENPTkZJR19QWEEyN3ggKi8KKworc3RhdGljIGludCBweGEyeHhfbWZwX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gZ3Bpb190b19iYW5rKGdwaW9fbnIpOyBpKyspIHsKKwkJR0FGUl9MKGkpID0gc2F2ZWRfZ2FmclswXVtpXTsKKwkJR0FGUl9VKGkpID0gc2F2ZWRfZ2FmclsxXVtpXTsKKwkJR1BEUihpICogMzIpID0gc2F2ZWRfZ3BkcltpXTsKKwl9CisJUFNTUiA9IFBTU1JfUkRIIHwgUFNTUl9QSDsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHB4YTJ4eF9tZnBfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHB4YTJ4eF9tZnBfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHB4YTJ4eF9tZnBfc3lzY2xhc3MgPSB7CisJLm5hbWUJCT0gIm1mcCIsCisJLnN1c3BlbmQJPSBweGEyeHhfbWZwX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGEyeHhfbWZwX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YTJ4eF9tZnBfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaWYgKCFjcHVfaXNfcHhhMnh4KCkpCisJCXJldHVybiAwOworCisJaWYgKGNwdV9pc19weGEyNXgoKSkKKwkJcHhhMjV4X21mcF9pbml0KCk7CisKKwlpZiAoY3B1X2lzX3B4YTI3eCgpKQorCQlweGEyN3hfbWZwX2luaXQoKTsKKworCS8qIGluaXRpYWxpemUgZ2Fmcl9ydW5bXSwgcGdzcl9scG1bXSBmcm9tIGV4aXN0aW5nIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPD0gZ3Bpb190b19iYW5rKGdwaW9fbnIpOyBpKyspCisJCWdwZHJfbHBtW2ldID0gR1BEUihpICogMzIpOworCisJcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmcHhhMnh4X21mcF9zeXNjbGFzcyk7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChweGEyeHhfbWZwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDJjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKQEAgLTAsMCArMSw5MDUgQEAKKy8qCisgKiBIYW5kbGVzIHRoZSBNaXRhYyBNaW8gQTcwMSBCb2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSb2JlcnQgSmFyem1paworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhMjd4X2tleXBhZC5oPgorI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL3VkYy5oPgorI2luY2x1ZGUgPG1hY2gvcHhhMjd4LXVkYy5oPgorCisjaW5jbHVkZSA8bWFjaC9taW9hNzAxLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtaW9hNzAxX3Bpbl9jb25maWdbXSA9IHsKKwkvKiBNaW8gZ2xvYmFsICovCisJTUlPX0NGR19PVVQoR1BJTzlfQ0hBUkdFX25FTiwgQUYwLCBEUklWRV9MT1cpLAorCU1JT19DRkdfT1VUKEdQSU8xOF9QT1dFUk9GRiwgQUYwLCBEUklWRV9MT1cpLAorCU1GUF9DRkdfT1VUKEdQSU8zLCBBRjAsIERSSVZFX0hJR0gpLAorCU1GUF9DRkdfT1VUKEdQSU80LCBBRjAsIERSSVZFX0hJR0gpLAorCisJLyogQmFja2xpZ2h0IFBXTSAwICovCisJR1BJTzE2X1BXTTBfT1VULAorCisJLyogTU1DICovCisJR1BJTzMyX01NQ19DTEssCisJR1BJTzkyX01NQ19EQVRfMCwKKwlHUElPMTA5X01NQ19EQVRfMSwKKwlHUElPMTEwX01NQ19EQVRfMiwKKwlHUElPMTExX01NQ19EQVRfMywKKwlHUElPMTEyX01NQ19DTUQsCisJTUlPX0NGR19JTihHUElPNzhfU0RJT19STywgQUYwKSwKKwlNSU9fQ0ZHX0lOKEdQSU8xNV9TRElPX0lOU0VSVCwgQUYwKSwKKwlNSU9fQ0ZHX09VVChHUElPOTFfU0RJT19FTiwgQUYwLCBEUklWRV9MT1cpLAorCisJLyogVVNCICovCisJTUlPX0NGR19JTihHUElPMTNfVVNCX0RFVEVDVCwgQUYwKSwKKwlNSU9fQ0ZHX09VVChHUElPMjJfVVNCX0VOQUJMRSwgQUYwLCBEUklWRV9MT1cpLAorCisJLyogTENEICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKworCS8qIEJsdWV0b290aCAqLworCUdQSU80NF9CVFVBUlRfQ1RTLAorCUdQSU80Ml9CVFVBUlRfUlhELAorCUdQSU80NV9CVFVBUlRfUlRTLAorCUdQSU80M19CVFVBUlRfVFhELAorCU1JT19DRkdfT1VUKEdQSU84M19CVF9PTiwgQUYwLCBEUklWRV9MT1cpLAorCisJLyogR1BTICovCisJTUlPX0NGR19PVVQoR1BJTzIzX0dQU19VTktOT1dOMSwgQUYwLCBEUklWRV9MT1cpLAorCU1JT19DRkdfT1VUKEdQSU8yNl9HUFNfT04sIEFGMCwgRFJJVkVfTE9XKSwKKwlNSU9fQ0ZHX09VVChHUElPMjdfR1BTX1JFU0VULCBBRjAsIERSSVZFX0xPVyksCisJTUlPX0NGR19PVVQoR1BJTzEwNl9HUFNfVU5LTk9XTjIsIEFGMCwgRFJJVkVfTE9XKSwKKwlNSU9fQ0ZHX09VVChHUElPMTA3X0dQU19VTktOT1dOMywgQUYwLCBEUklWRV9MT1cpLAorCUdQSU80Nl9TVFVBUlRfUlhELAorCUdQSU80N19TVFVBUlRfVFhELAorCisJLyogR1NNICovCisJTUlPX0NGR19PVVQoR1BJTzI0X0dTTV9NT0RfUkVTRVRfQ01ELCBBRjAsIERSSVZFX0xPVyksCisJTUlPX0NGR19PVVQoR1BJTzg4X0dTTV9uTU9EX09OX0NNRCwgQUYwLCBEUklWRV9ISUdIKSwKKwlNSU9fQ0ZHX09VVChHUElPOTBfR1NNX25NT0RfT0ZGX0NNRCwgQUYwLCBEUklWRV9ISUdIKSwKKwlNSU9fQ0ZHX09VVChHUElPMTE0X0dTTV9uTU9EX0RURV9VQVJUX1NUQVRFLCBBRjAsIERSSVZFX0hJR0gpLAorCU1JT19DRkdfSU4oR1BJTzI1X0dTTV9NT0RfT05fU1RBVEUsIEFGMCksCisJTUlPX0NGR19JTihHUElPMTEzX0dTTV9FVkVOVCwgQUYwKSB8IFdBS0VVUF9PTl9FREdFX0JPVEgsCisJR1BJTzM0X0ZGVUFSVF9SWEQsCisJR1BJTzM1X0ZGVUFSVF9DVFMsCisJR1BJTzM2X0ZGVUFSVF9EQ0QsCisJR1BJTzM3X0ZGVUFSVF9EU1IsCisJR1BJTzM5X0ZGVUFSVF9UWEQsCisJR1BJTzQwX0ZGVUFSVF9EVFIsCisJR1BJTzQxX0ZGVUFSVF9SVFMsCisKKwkvKiBTb3VuZCAqLworCUdQSU84OV9BQzk3X1NZU0NMSywKKwlNSU9fQ0ZHX0lOKEdQSU8xMl9IUEpBQ0tfSU5TRVJULCBBRjApLAorCisJLyogTGVkcyAqLworCU1JT19DRkdfT1VUKEdQSU8xMF9MRURfbkNoYXJnaW5nLCBBRjAsIERSSVZFX0hJR0gpLAorCU1JT19DRkdfT1VUKEdQSU85N19MRURfbkJsdWUsIEFGMCwgRFJJVkVfSElHSCksCisJTUlPX0NGR19PVVQoR1BJTzk4X0xFRF9uT3JhbmdlLCBBRjAsIERSSVZFX0hJR0gpLAorCU1JT19DRkdfT1VUKEdQSU84Ml9MRURfblZpYnJhLCBBRjAsIERSSVZFX0hJR0gpLAorCU1JT19DRkdfT1VUKEdQSU8xMTVfTEVEX25LZXlib2FyZCwgQUYwLCBEUklWRV9ISUdIKSwKKworCS8qIEtleWJvYXJkICovCisJTUlPX0NGR19JTihHUElPMF9LRVlfUE9XRVIsIEFGMCkgfCBXQUtFVVBfT05fRURHRV9CT1RILAorCU1JT19DRkdfSU4oR1BJTzkzX0tFWV9WT0xVTUVfVVAsIEFGMCksCisJTUlPX0NGR19JTihHUElPOTRfS0VZX1ZPTFVNRV9ET1dOLCBBRjApLAorCUdQSU8xMDBfS1BfTUtJTl8wLAorCUdQSU8xMDFfS1BfTUtJTl8xLAorCUdQSU8xMDJfS1BfTUtJTl8yLAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCisJLyogVW5rbm93biAqLworCU1GUF9DRkdfSU4oR1BJTzE0LCBBRjApLAorCU1GUF9DRkdfSU4oR1BJTzIwLCBBRjApLAorCU1GUF9DRkdfSU4oR1BJTzIxLCBBRjApLAorCU1GUF9DRkdfSU4oR1BJTzMzLCBBRjApLAorCU1GUF9DRkdfT1VUKEdQSU80OSwgQUYwLCBEUklWRV9ISUdIKSwKKwlNRlBfQ0ZHX09VVChHUElPNTcsIEFGMCwgRFJJVkVfSElHSCksCisJTUZQX0NGR19PVVQoR1BJTzc3LCBBRjAsIERSSVZFX0hJR0gpLAorCU1GUF9DRkdfSU4oR1BJTzgwLCBBRjApLAorCU1GUF9DRkdfT1VUKEdQSU84NiwgQUYwLCBEUklWRV9ISUdIKSwKKwlNRlBfQ0ZHX0lOKEdQSU85NiwgQUYwKSwKKwlNRlBfQ0ZHX09VVChHUElPMTE2LCBBRjAsIERSSVZFX0hJR0gpLAorfTsKKworI2RlZmluZSBNSU9fR1BJT19JTihudW0sIF9kZXNjKSBcCisJeyAuZ3BpbyA9IChudW0pLCAuZGlyID0gMCwgLmRlc2MgPSAoX2Rlc2MpIH0KKyNkZWZpbmUgTUlPX0dQSU9fT1VUKG51bSwgX2luaXQsIF9kZXNjKSBcCisJeyAuZ3BpbyA9IChudW0pLCAuZGlyID0gMSwgLmluaXQgPSAoX2luaXQpLCAuZGVzYyA9IChfZGVzYykgfQorc3RydWN0IGdwaW9fcmVzcyB7CisJdW5zaWduZWQgZ3BpbyA6IDg7CisJdW5zaWduZWQgZGlyIDogMTsKKwl1bnNpZ25lZCBpbml0IDogMTsKKwljaGFyICpkZXNjOworfTsKKworc3RhdGljIGludCBtaW9fZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX3Jlc3MgKmdwaW9zLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSwgcmMgPSAwOworCWludCBncGlvOworCWludCBkaXI7CisKKwlmb3IgKGkgPSAwOyAoIXJjKSAmJiAoaSA8IHNpemUpOyBpKyspIHsKKwkJZ3BpbyA9IGdwaW9zW2ldLmdwaW87CisJCWRpciA9IGdwaW9zW2ldLmRpcjsKKwkJcmMgPSBncGlvX3JlcXVlc3QoZ3BpbywgZ3Bpb3NbaV0uZGVzYyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciByZXF1ZXN0aW5nIEdQSU8gJWQoJXMpIDogJWRcbiIsCisJCQkgICAgICAgZ3BpbywgZ3Bpb3NbaV0uZGVzYywgcmMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGRpcikKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCBncGlvc1tpXS5pbml0KTsKKwkJZWxzZQorCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisJfQorCXdoaWxlICgocmMpICYmICgtLWkgPj0gMCkpCisJCWdwaW9fZnJlZShncGlvc1tpXS5ncGlvKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIG1pb19ncGlvX2ZyZWUoc3RydWN0IGdwaW9fcmVzcyAqZ3Bpb3MsIGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJZ3Bpb19mcmVlKGdwaW9zW2ldLmdwaW8pOworfQorCisvKiBMQ0QgU2NyZWVuIGFuZCBCYWNrbGlnaHQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIG1pb2E3MDFfYmFja2xpZ2h0X2RhdGEgPSB7CisJLnB3bV9pZAkJPSAwLAorCS5tYXhfYnJpZ2h0bmVzcwk9IDEwMCwKKwkuZGZ0X2JyaWdodG5lc3MJPSA1MCwKKwkucHdtX3BlcmlvZF9ucwk9IDQwMDAgKiAxMDI0LAkvKiBGbCA9IDI1MGtIeiAqLworfTsKKworLyoKKyAqIExUTTAzMDVBNzc2QyBMQ0QgcGFuZWwgdGltaW5ncworICoKKyAqIHNlZToKKyAqICAtIHRoZSBMVE0wMzA1QTc3NkMgZGF0YXNoZWV0LAorICogIC0gYW5kIHRoZSBQWEEyN3ggUHJvZ3JhbW1lcnMnIG1hbnVhbAorICovCitzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBtaW9hNzAxX2x0bTAzMDVhNzc2YyA9IHsKKwkucGl4Y2xvY2sJCT0gMjIwMDAwLAkvKiBDTEs9NC41NDUgTUh6ICovCisJLnhyZXMJCQk9IDI0MCwKKwkueXJlcwkJCT0gMzIwLAorCS5icHAJCQk9IDE2LAorCS5oc3luY19sZW4JCT0gNCwKKwkudnN5bmNfbGVuCQk9IDIsCisJLmxlZnRfbWFyZ2luCQk9IDYsCisJLnJpZ2h0X21hcmdpbgkJPSA0LAorCS51cHBlcl9tYXJnaW4JCT0gNSwKKwkubG93ZXJfbWFyZ2luCQk9IDMsCit9OworCitzdGF0aWMgdm9pZCBtaW9hNzAxX2xjZF9wb3dlcihpbnQgb24sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqc2kpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJTzg3X0xDRF9QT1dFUiwgb24pOworfQorCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBtaW9hNzAxX3B4YWZiX2luZm8gPSB7CisJLm1vZGVzCQkJPSAmbWlvYTcwMV9sdG0wMzA1YTc3NmMsCisJLm51bV9tb2RlcwkJPSAxLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorCS5weGFmYl9sY2RfcG93ZXIJPSBtaW9hNzAxX2xjZF9wb3dlciwKK307CisKKy8qCisgKiBLZXlib2FyZCBjb25maWd1cmF0aW9uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlvYTcwMV9tYXRyaXhfa2V5c1tdID0geworCUtFWSgwLCAwLCBLRVlfVVApLAorCUtFWSgwLCAxLCBLRVlfUklHSFQpLAorCUtFWSgwLCAyLCBLRVlfTUVESUEpLAorCUtFWSgxLCAwLCBLRVlfRE9XTiksCisJS0VZKDEsIDEsIEtFWV9FTlRFUiksCisJS0VZKDEsIDIsIEtFWV9DT05ORUNUKSwJLyogR1BTIGtleSAqLworCUtFWSgyLCAwLCBLRVlfTEVGVCksCisJS0VZKDIsIDEsIEtFWV9QSE9ORSksCS8qIFBob25lIEdyZWVuIGtleSAqLworCUtFWSgyLCAyLCBLRVlfQ0FNRVJBKQkvKiBDYW1lcmEga2V5ICovCit9Oworc3RhdGljIHN0cnVjdCBweGEyN3hfa2V5cGFkX3BsYXRmb3JtX2RhdGEgbWlvYTcwMV9rZXlwYWRfaW5mbyA9IHsKKwkubWF0cml4X2tleV9yb3dzID0gMywKKwkubWF0cml4X2tleV9jb2xzID0gMywKKwkubWF0cml4X2tleV9tYXAgPSBtaW9hNzAxX21hdHJpeF9rZXlzLAorCS5tYXRyaXhfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShtaW9hNzAxX21hdHJpeF9rZXlzKSwKK307CisKKy8qCisgKiBHUElPIEtleSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgTUlPX0tFWShrZXksIF9ncGlvLCBfZGVzYywgX3dha2V1cCkgXAorCXsgLmNvZGUgPSAoa2V5KSwgLmdwaW8gPSAoX2dwaW8pLCAuYWN0aXZlX2xvdyA9IDAsIFwKKwkuZGVzYyA9IChfZGVzYyksIC50eXBlID0gRVZfS0VZLCAud2FrZXVwID0gKF93YWtldXApIH0KK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBtaW9hNzAxX2J1dHRvbl90YWJsZVtdID0geworCU1JT19LRVkoS0VZX0VYSVQsIEdQSU8wX0tFWV9QT1dFUiwgIlBvd2VyIGJ1dHRvbiIsIDEpLAorCU1JT19LRVkoS0VZX1ZPTFVNRVVQLCBHUElPOTNfS0VZX1ZPTFVNRV9VUCwgIlZvbHVtZSB1cCIsIDApLAorCU1JT19LRVkoS0VZX1ZPTFVNRURPV04sIEdQSU85NF9LRVlfVk9MVU1FX0RPV04sICJWb2x1bWUgZG93biIsIDApLAorCU1JT19LRVkoS0VZX0hQLCBHUElPMTJfSFBKQUNLX0lOU0VSVCwgIkhQIGphY2sgZGV0ZWN0IiwgMCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgbWlvYTcwMV9ncGlvX2tleXNfZGF0YSA9IHsKKwkuYnV0dG9ucyAgPSBtaW9hNzAxX2J1dHRvbl90YWJsZSwKKwkubmJ1dHRvbnMgPSBBUlJBWV9TSVpFKG1pb2E3MDFfYnV0dG9uX3RhYmxlKSwKK307CisKKy8qCisgKiBMZWRzIGFuZCB2aWJyYXRvcgorICovCisjZGVmaW5lIE9ORV9MRUQoX2dwaW8sIF9uYW1lKSBcCit7IC5ncGlvID0gKF9ncGlvKSwgLm5hbWUgPSAoX25hbWUpLCAuYWN0aXZlX2xvdyA9IHRydWUgfQorc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKKwlPTkVfTEVEKEdQSU8xMF9MRURfbkNoYXJnaW5nLCAibWlvYTcwMTpjaGFyZ2luZyIpLAorCU9ORV9MRUQoR1BJTzk3X0xFRF9uQmx1ZSwgIm1pb2E3MDE6Ymx1ZSIpLAorCU9ORV9MRUQoR1BJTzk4X0xFRF9uT3JhbmdlLCAibWlvYTcwMTpvcmFuZ2UiKSwKKwlPTkVfTEVEKEdQSU84Ml9MRURfblZpYnJhLCAibWlvYTcwMTp2aWJyYSIpLAorCU9ORV9MRUQoR1BJTzExNV9MRURfbktleWJvYXJkLCAibWlvYTcwMTprZXlib2FyZCIpCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZ3Bpb19sZWRfaW5mbyA9IHsKKwkubGVkcyA9IGdwaW9fbGVkcywKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGdwaW9fbGVkcyksCit9OworCisvKgorICogR1NNIFNhZ2VtIFhTMjAwIGNoaXAKKyAqCisgKiBHU00gaGFuZGxpbmcgd2FzIHB1cmdlZCBmcm9tIGtlcm5lbC4gRm9yIGhpc3RvcnksIHRoaXMgaXMgdGhlIHdheSB0byBnbyA6CisgKiAgIC0gaW5pdCA6IEdQSU8yNF9HU01fTU9EX1JFU0VUX0NNRCA9IDAsIEdQSU8xMTRfR1NNX25NT0RfRFRFX1VBUlRfU1RBVEUgPSAxCisgKiAgICAgICAgICAgIEdQSU84OF9HU01fbk1PRF9PTl9DTUQgPSAxLCBHUElPOTBfR1NNX25NT0RfT0ZGX0NNRCA9IDEKKyAqICAgLSByZXNldCA6IEdQSU8yNF9HU01fTU9EX1JFU0VUX0NNRCA9IDEsIG1zbGVlcCgxMDApLAorICogICAgICAgICAgICAgR1BJTzI0X0dTTV9NT0RfUkVTRVRfQ01EID0gMAorICogICAtIHR1cm4gb24gIDogR1BJTzg4X0dTTV9uTU9EX09OX0NNRCA9IDAsIG1zbGVlcCgxMDAwKSwKKyAqICAgICAgICAgICAgICAgIEdQSU84OF9HU01fbk1PRF9PTl9DTUQgPSAxCisgKiAgIC0gdHVybiBvZmYgOiBHUElPOTBfR1NNX25NT0RfT0ZGX0NNRCA9IDAsIG1zbGVlcCgxMDAwKSwKKyAqICAgICAgICAgICAgICAgIEdQSU85MF9HU01fbk1PRF9PRkZfQ01EID0gMQorICovCitzdGF0aWMgaW50IGlzX2dzbV9vbih2b2lkKQoreworCWludCBpc19vbjsKKworCWlzX29uID0gISFncGlvX2dldF92YWx1ZShHUElPMjVfR1NNX01PRF9PTl9TVEFURSk7CisJcmV0dXJuIGlzX29uOworfQorCitpcnFyZXR1cm5fdCBnc21fb25faXJxKGludCBpcnEsIHZvaWQgKnApCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIk1pb2E3MDE6IEdTTSBzdGF0dXMgY2hhbmdlZCB0byAlc1xuIiwKKwkgICAgICAgaXNfZ3NtX29uKCkgPyAib24iIDogIm9mZiIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RydWN0IGdwaW9fcmVzcyBnc21fZ3Bpb3NbXSA9IHsKKwlNSU9fR1BJT19JTihHUElPMjVfR1NNX01PRF9PTl9TVEFURSwgIkdTTSBzdGF0ZSIpLAorCU1JT19HUElPX0lOKEdQSU8xMTNfR1NNX0VWRU5ULCAiR1NNIGV2ZW50IiksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnc21faW5pdCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gbWlvX2dwaW9fcmVxdWVzdChBUlJBWV9BTkRfU0laRShnc21fZ3Bpb3MpKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2dwaW87CisJcmMgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShHUElPMjVfR1NNX01PRF9PTl9TVEFURSksIGdzbV9vbl9pcnEsCisJCQkgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJICJHU00gWFMyMDAgUG93ZXIgSXJxIiwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisKKwlncGlvX3NldF93YWtlKEdQSU8xMTNfR1NNX0VWRU5ULCAxKTsKKwlyZXR1cm4gMDsKKworZXJyX2lycToKKwlwcmludGsoS0VSTl9FUlIgIk1pb2E3MDE6IENhbid0IHJlcXVlc3QgR1NNX09OIGlycVxuIik7CisJbWlvX2dwaW9fZnJlZShBUlJBWV9BTkRfU0laRShnc21fZ3Bpb3MpKTsKK2Vycl9ncGlvOgorCXByaW50ayhLRVJOX0VSUiAiTWlvYTcwMTogZ3NtIG5vdCBhdmFpbGFibGVcbiIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZ3NtX2V4aXQodm9pZCkKK3sKKwlmcmVlX2lycShncGlvX3RvX2lycShHUElPMjVfR1NNX01PRF9PTl9TVEFURSksIE5VTEwpOworCW1pb19ncGlvX2ZyZWUoQVJSQVlfQU5EX1NJWkUoZ3NtX2dwaW9zKSk7Cit9CisKKy8qCisgKiBCbHVldG9vdGggQlJGNjE1MCBjaGlwCisgKgorICogQlQgaGFuZGxpbmcgd2FzIHB1cmdlZCBmcm9tIGtlcm5lbC4gRm9yIGhpc3RvcnksIHRoaXMgaXMgdGhlIHdheSB0byBnbyA6CisgKiAtIHR1cm4gb24gIDogR1BJTzgzX0JUX09OID0gMQorICogLSB0dXJuIG9mZiA6IEdQSU84M19CVF9PTiA9IDAKKyAqLworCisvKgorICogR1BTIFNpcmYgU3RhciBJSUkgY2hpcAorICoKKyAqIEdQUyBoYW5kbGluZyB3YXMgcHVyZ2VkIGZyb20ga2VybmVsLiBGb3IgaGlzdG9yeSwgdGhpcyBpcyB0aGUgd2F5IHRvIGdvIDoKKyAqIC0gaW5pdCA6IEdQSU8yM19HUFNfVU5LTk9XTjEgPSAxLCBHUElPMjZfR1BTX09OID0gMCwgR1BJTzI3X0dQU19SRVNFVCA9IDAKKyAqICAgICAgICAgIEdQSU8xMDZfR1BTX1VOS05PV04yID0gMCwgR1BJTzEwN19HUFNfVU5LTk9XTjMgPSAwCisgKiAtIHR1cm4gb24gIDogR1BJTzI3X0dQU19SRVNFVCA9IDEsIEdQSU8yNl9HUFNfT04gPSAxCisgKiAtIHR1cm4gb2ZmIDogR1BJTzI2X0dQU19PTiA9IDAsIEdQSU8yN19HUFNfUkVTRVQgPSAwCisgKi8KKworLyoKKyAqIFVTQiBVREMKKyAqLworc3RhdGljIHZvaWQgdWRjX3Bvd2VyX2NvbW1hbmQoaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVDoKKwkJZ3Bpb19zZXRfdmFsdWUoR1BJTzIyX1VTQl9FTkFCTEUsIDApOworCQlicmVhazsKKwljYXNlIFBYQTJYWF9VRENfQ01EX0NPTk5FQ1Q6CisJCWdwaW9fc2V0X3ZhbHVlKEdQSU8yMl9VU0JfRU5BQkxFLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWRjX2NvbnRyb2w6IHVua25vd24gY29tbWFuZCAoMHgleCkhXG4iLCBjbWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNfdXNiX2Nvbm5lY3RlZCh2b2lkKQoreworCXJldHVybiAhIWdwaW9fZ2V0X3ZhbHVlKEdQSU8xM19VU0JfREVURUNUKTsKK30KKworc3RhdGljIHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyBtaW9hNzAxX3VkY19pbmZvID0geworCS51ZGNfaXNfY29ubmVjdGVkID0gaXNfdXNiX2Nvbm5lY3RlZCwKKwkudWRjX2NvbW1hbmQJICA9IHVkY19wb3dlcl9jb21tYW5kLAorfTsKKworc3RydWN0IGdwaW9fcmVzcyB1ZGNfZ3Bpb3NbXSA9IHsKKwlNSU9fR1BJT19PVVQoR1BJTzIyX1VTQl9FTkFCTEUsIDAsICJVU0IgVmJ1cyBlbmFibGUiKQorfTsKKworc3RhdGljIGludCBfX2luaXQgdWRjX2luaXQodm9pZCkKK3sKKwlweGFfc2V0X3VkY19pbmZvKCZtaW9hNzAxX3VkY19pbmZvKTsKKwlyZXR1cm4gbWlvX2dwaW9fcmVxdWVzdChBUlJBWV9BTkRfU0laRSh1ZGNfZ3Bpb3MpKTsKK30KKworc3RhdGljIHZvaWQgdWRjX2V4aXQodm9pZCkKK3sKKwltaW9fZ3Bpb19mcmVlKEFSUkFZX0FORF9TSVpFKHVkY19ncGlvcykpOworfQorCisvKgorICogU0RJTy9NTUMgQ2FyZCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIG1jaV9zZXRwb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCit7CisJc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhICpwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoKDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spCisJCWdwaW9fc2V0X3ZhbHVlKEdQSU85MV9TRElPX0VOLCAxKTsJLyogZW5hYmxlIFNESU8gcG93ZXIgKi8KKwllbHNlCisJCWdwaW9fc2V0X3ZhbHVlKEdQSU85MV9TRElPX0VOLCAwKTsJLyogZGlzYWJsZSBTRElPIHBvd2VyICovCit9CisKK3N0YXRpYyBpbnQgbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU83OF9TRElPX1JPKTsKK30KKworc3RydWN0IGdwaW9fcmVzcyBtY2lfZ3Bpb3NbXSA9IHsKKwlNSU9fR1BJT19JTihHUElPNzhfU0RJT19STywgCSJTRElPIHJlYWRvbmx5IGRldGVjdCIpLAorCU1JT19HUElPX0lOKEdQSU8xNV9TRElPX0lOU0VSVCwJIlNESU8gaW5zZXJ0aW9uIGRldGVjdCIpLAorCU1JT19HUElPX09VVChHUElPOTFfU0RJT19FTiwgMCwJIlNESU8gcG93ZXIgZW5hYmxlIikKK307CisKK3N0YXRpYyB2b2lkIG1jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwltaW9fZ3Bpb19mcmVlKEFSUkFZX0FORF9TSVpFKG1jaV9ncGlvcykpOworCWZyZWVfaXJxKGdwaW9fdG9faXJxKEdQSU8xNV9TRElPX0lOU0VSVCksIGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIG1pb2E3MDFfbWNpX2luZm87CisKKy8qKgorICogVGhlIGNhcmQgZGV0ZWN0IGludGVycnVwdCBpc24ndCBkZWJvdW5jZWQgc28gd2UgZGVsYXkgaXQgYnkgMjUwbXMKKyAqIHRvIGdpdmUgdGhlIGNhcmQgYSBjaGFuY2UgdG8gZnVsbHkgaW5zZXJ0L2VqZWN0LgorICovCitzdGF0aWMgaW50IG1jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBkZXRlY3RfaW50LCB2b2lkICpkYXRhKQoreworCWludCByYzsKKwlpbnQgaXJxID0gZ3Bpb190b19pcnEoR1BJTzE1X1NESU9fSU5TRVJUKTsKKworCXJjID0gbWlvX2dwaW9fcmVxdWVzdChBUlJBWV9BTkRfU0laRShtY2lfZ3Bpb3MpKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2dwaW87CisJLyogZW5hYmxlIFJFL0ZFIGludGVycnVwdCBvbiBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbCAqLworCXJjID0gcmVxdWVzdF9pcnEoaXJxLCBkZXRlY3RfaW50LAorCQkJIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwKKwkJCSBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCSAiTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisKKwltaW9hNzAxX21jaV9pbmZvLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKKwlyZXR1cm4gMDsKKworZXJyX2lycToKKwlkZXZfZXJyKGRldiwgIm1pb2E3MDFfbWNpX2luaXQ6IE1NQy9TRDoiCisJCSIgY2FuJ3QgcmVxdWVzdCBNTUMgY2FyZCBkZXRlY3QgSVJRXG4iKTsKKwltaW9fZ3Bpb19mcmVlKEFSUkFZX0FORF9TSVpFKG1jaV9ncGlvcykpOworZXJyX2dwaW86CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIG1pb2E3MDFfbWNpX2luZm8gPSB7CisJLm9jcl9tYXNrID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCisJLmluaXQJICA9IG1jaV9pbml0LAorCS5nZXRfcm8JICA9IG1jaV9nZXRfcm8sCisJLnNldHBvd2VyID0gbWNpX3NldHBvd2VyLAorCS5leGl0CSAgPSBtY2lfZXhpdCwKK307CisKKy8qIEZsYXNoUkFNICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHN0cmF0YWZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IFBYQV9DUzBfUEhZUywKKwkuZW5kICAgPSBQWEFfQ1MwX1BIWVMgKyBTWl82NE0gLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgc3RyYXRhZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggPSAyLAorCS8qIC5zZXRfdnBwID0gbWlvYTcwMV9zZXRfdnBwLCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3RyYXRhZmxhc2ggPSB7CisJLm5hbWUJICAgICAgID0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkgICAgICAgPSAtMSwKKwkucmVzb3VyY2UgICAgICA9ICZzdHJhdGFmbGFzaF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc3RyYXRhZmxhc2hfZGF0YSwKKwl9LAorfTsKKworLyoKKyAqIFN1c3BlbmQvUmVzdW1lIGJvb3RzdHJhcCBtYW5hZ2VtZW50CisgKgorICogTUlPIEE3MDEgcmVib290IHNlcXVlbmNlIGlzIGhpZ2hseSBST00gZGVwZW5kYW50LiBGcm9tIHRoZSBvbmUgZGlzc2Fzc2VtYmxlZCwKKyAqIHRoaXMgc2VxdWVuY2UgaXMgYXMgZm9sbG93cyA6CisgKiAgIC0gZGlzYWJsZXMgaW50ZXJydXB0cworICogICAtIGluaXRpYWxpemUgU0RSQU0gKHNlbGYgcmVmcmVzaCBSQU0gaW50byBhY3RpdmUgUkFNKQorICogICAtIGluaXRpYWxpemUgR1BJT3MgKGRlcGVuZHMgb24gdmFsdWUgYXQgMHhhMDIwYjAyMCkKKyAqICAgLSBpbml0aWFsaXplIGNvcHJvc3Nlc3NvcnMKKyAqICAgLSBpZiBlZGdlIGRldGVjdCBvbiBQV1JfU0NMKEdQSU8zKSwgdGhlbiBwcm9jZWVkIHRvIGNvbGQgc3RhcnQKKyAqICAgLSBvciBpZiB2YWx1ZSBhdCAweGEwMjBiMDAwIG5vdCBlcXVhbCB0byAweDBmMGYwZjBmLCBwcm9jZWVkIHRvIGNvbGQgc3RhcnQKKyAqICAgLSBlbHNlIGRvIGEgcmVzdW1lLCBpZS4ganVtcCB0byBhZGRyIDB4YTAxMDAwMDAKKyAqLworI2RlZmluZSBSRVNVTUVfRU5BQkxFX0FERFIJMHhhMDIwYjAwMAorI2RlZmluZSBSRVNVTUVfRU5BQkxFX1ZBTAkweDBmMGYwZjBmCisjZGVmaW5lIFJFU1VNRV9CVF9BRERSCQkweGEwMjBiMDIwCisjZGVmaW5lIFJFU1VNRV9VTktOT1dOX0FERFIJMHhhMDIwYjAyNAorI2RlZmluZSBSRVNVTUVfVkVDVE9SX0FERFIJMHhhMDEwMDAwMAorI2RlZmluZSBCT09UU1RSQVBfV09SRFMJCW1pb2E3MDFfYm9vdHN0cmFwX2xnLzQKKworc3RhdGljIHUzMiAqc2F2ZV9idWZmZXI7CisKK3N0YXRpYyB2b2lkIGluc3RhbGxfYm9vdHN0cmFwKHZvaWQpCit7CisJaW50IGk7CisJdTMyICpyb21fYm9vdHN0cmFwICA9IHBoeXNfdG9fdmlydChSRVNVTUVfVkVDVE9SX0FERFIpOworCXUzMiAqc3JjID0gJm1pb2E3MDFfYm9vdHN0cmFwOworCisJZm9yIChpID0gMDsgaSA8IEJPT1RTVFJBUF9XT1JEUzsgaSsrKQorCQlyb21fYm9vdHN0cmFwW2ldID0gc3JjW2ldOworfQorCisKK3N0YXRpYyBpbnQgbWlvYTcwMV9zeXNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaW50IGkgPSAwLCBpc19idF9vbjsKKwl1MzIgKm1lbV9yZXN1bWVfdmVjdG9yCT0gcGh5c190b192aXJ0KFJFU1VNRV9WRUNUT1JfQUREUik7CisJdTMyICptZW1fcmVzdW1lX2VuYWJsZXIgPSBwaHlzX3RvX3ZpcnQoUkVTVU1FX0VOQUJMRV9BRERSKTsKKwl1MzIgKm1lbV9yZXN1bWVfYnQJPSBwaHlzX3RvX3ZpcnQoUkVTVU1FX0JUX0FERFIpOworCXUzMiAqbWVtX3Jlc3VtZV91bmtub3duCT0gcGh5c190b192aXJ0KFJFU1VNRV9VTktOT1dOX0FERFIpOworCisJLyogRGV2aWNlcyBwcmVwYXJlIHN1c3BlbmQgKi8KKwlpc19idF9vbiA9IGdwaW9fZ2V0X3ZhbHVlKEdQSU84M19CVF9PTik7CisJcHhhMnh4X21mcF9zZXRfbHBtKEdQSU84M19CVF9PTiwKKwkJCSAgIGlzX2J0X29uID8gTUZQX0xQTV9EUklWRV9ISUdIIDogTUZQX0xQTV9EUklWRV9MT1cpOworCisJZm9yIChpID0gMDsgaSA8IEJPT1RTVFJBUF9XT1JEUzsgaSsrKQorCQlzYXZlX2J1ZmZlcltpXSA9IG1lbV9yZXN1bWVfdmVjdG9yW2ldOworCXNhdmVfYnVmZmVyW2krK10gPSAqbWVtX3Jlc3VtZV9lbmFibGVyOworCXNhdmVfYnVmZmVyW2krK10gPSAqbWVtX3Jlc3VtZV9idDsKKwlzYXZlX2J1ZmZlcltpKytdID0gKm1lbV9yZXN1bWVfdW5rbm93bjsKKworCSptZW1fcmVzdW1lX2VuYWJsZXIgPSBSRVNVTUVfRU5BQkxFX1ZBTDsKKwkqbWVtX3Jlc3VtZV9idAkgICAgPSBpc19idF9vbjsKKworCWluc3RhbGxfYm9vdHN0cmFwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWlvYTcwMV9zeXNfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJaW50IGkgPSAwOworCXUzMiAqbWVtX3Jlc3VtZV92ZWN0b3IJPSBwaHlzX3RvX3ZpcnQoUkVTVU1FX1ZFQ1RPUl9BRERSKTsKKwl1MzIgKm1lbV9yZXN1bWVfZW5hYmxlciA9IHBoeXNfdG9fdmlydChSRVNVTUVfRU5BQkxFX0FERFIpOworCXUzMiAqbWVtX3Jlc3VtZV9idAk9IHBoeXNfdG9fdmlydChSRVNVTUVfQlRfQUREUik7CisJdTMyICptZW1fcmVzdW1lX3Vua25vd24JPSBwaHlzX3RvX3ZpcnQoUkVTVU1FX1VOS05PV05fQUREUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQk9PVFNUUkFQX1dPUkRTOyBpKyspCisJCW1lbV9yZXN1bWVfdmVjdG9yW2ldID0gc2F2ZV9idWZmZXJbaV07CisJKm1lbV9yZXN1bWVfZW5hYmxlciA9IHNhdmVfYnVmZmVyW2krK107CisJKm1lbV9yZXN1bWVfYnQJICAgID0gc2F2ZV9idWZmZXJbaSsrXTsKKwkqbWVtX3Jlc3VtZV91bmtub3duID0gc2F2ZV9idWZmZXJbaSsrXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBtaW9hNzAxX3N5c2NsYXNzID0geworCS5uYW1lID0gIm1pb2E3MDEiLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHN5c2Rldl9ib290c3RyYXAgPSB7CisJLmNscwkJPSAmbWlvYTcwMV9zeXNjbGFzcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBkcml2ZXJfYm9vdHN0cmFwID0geworCS5zdXNwZW5kCT0gJm1pb2E3MDFfc3lzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSAmbWlvYTcwMV9zeXNfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYm9vdHN0cmFwX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisJaW50IHNhdmVfc2l6ZSA9IG1pb2E3MDFfYm9vdHN0cmFwX2xnICsgKHNpemVvZih1MzIpICogMyk7CisKKwlyYyA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbWlvYTcwMV9zeXNjbGFzcyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHJlZ2lzdGVyaW5nIG1pb2E3MDEgc3lzIGNsYXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJjID0gc3lzZGV2X3JlZ2lzdGVyKCZzeXNkZXZfYm9vdHN0cmFwKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcmVnaXN0ZXJpbmcgbWlvYTcwMSBzeXMgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJjID0gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmbWlvYTcwMV9zeXNjbGFzcywgJmRyaXZlcl9ib290c3RyYXApOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCByZWdpc3RlcmluZyBQTVUgc3lzIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNhdmVfYnVmZmVyID0ga21hbGxvYyhzYXZlX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghc2F2ZV9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCXByaW50ayhLRVJOX0lORk8gIk1pb0E3MDE6IGFsbG9jYXRlZCAlZCBieXRlcyBmb3IgYm9vdHN0cmFwXG4iLAorCSAgICAgICBzYXZlX3NpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfZXhpdCh2b2lkKQoreworCWtmcmVlKHNhdmVfYnVmZmVyKTsKKwlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJm1pb2E3MDFfc3lzY2xhc3MsICZkcml2ZXJfYm9vdHN0cmFwKTsKKwlzeXNkZXZfdW5yZWdpc3Rlcigmc3lzZGV2X2Jvb3RzdHJhcCk7CisJc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJm1pb2E3MDFfc3lzY2xhc3MpOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiVW5yZWdpc3RlcmluZyBtaW9hNzAxIHN1c3BlbmQgd2lsbCBoYW5nIG5leHQiCisJICAgICAgICJyZXN1bWUgISEhXG4iKTsKK30KKworLyoKKyAqIFBvd2VyIFN1cHBseQorICovCitzdGF0aWMgY2hhciAqc3VwcGxpY2FudHNbXSA9IHsKKwkibWlvYTcwMV9iYXR0ZXJ5IgorfTsKKworc3RhdGljIHZvaWQgbWlvYTcwMV9zZXRfY2hhcmdlKGludCBmbGFncykKK3sKKwlncGlvX3NldF92YWx1ZShHUElPOV9DSEFSR0VfbkVOLCAhZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHBkYV9wb3dlcl9wZGF0YSBwb3dlcl9wZGF0YSA9IHsKKwkuaXNfYWNfb25saW5lCT0gaXNfdXNiX2Nvbm5lY3RlZCwKKwkuc2V0X2NoYXJnZSA9IG1pb2E3MDFfc2V0X2NoYXJnZSwKKwkuc3VwcGxpZWRfdG8gPSBzdXBwbGljYW50cywKKwkubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbGljYW50cyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBvd2VyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiYWMiLAorCQkuc3RhcnQJPSBncGlvX3RvX2lycShHUElPMTNfVVNCX0RFVEVDVCksCisJCS5lbmQJPSBncGlvX3RvX2lycShHUElPMTNfVVNCX0RFVEVDVCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfSElHSEVER0UgfAorCQlJT1JFU09VUkNFX0lSUV9MT1dFREdFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwb3dlcl9kZXYgPSB7CisJLm5hbWUJCT0gInBkYS1wb3dlciIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHBvd2VyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocG93ZXJfcmVzb3VyY2VzKSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZwb3dlcl9wZGF0YSwKKwl9LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1BEQV9QT1dFUikgJiYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYKQorc3RhdGljIHN0cnVjdCB3bTk3eHggKmJhdHRlcnlfd207CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBiYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAkvKiBOZWNlc3NhcnkgZm9yIGFwbSAqLworfTsKKworc3RhdGljIGludCBnZXRfYmF0dGVyeV92b2x0YWdlKHZvaWQpCit7CisJaW50IGFkYyA9IC0xOworCisJaWYgKGJhdHRlcnlfd20pCisJCWFkYyA9IHdtOTd4eF9yZWFkX2F1eF9hZGMoYmF0dGVyeV93bSwgV005N1hYX0FVWF9JRDEpOworCXJldHVybiBhZGM7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2JhdHRlcnlfc3RhdHVzKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIpCit7CisJaW50IHN0YXR1czsKKworCWlmIChpc191c2JfY29ubmVjdGVkKCkpCisJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJZWxzZQorCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBnZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYiwKKwkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0gZ2V0X2JhdHRlcnlfc3RhdHVzKGIpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSAweGZkMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJCXZhbC0+aW50dmFsID0gMHhjMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gZ2V0X2JhdHRlcnlfdm9sdGFnZSgpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSAxMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbC0+aW50dmFsID0gLTE7CisJCXJjID0gLTE7CisJfQorCisJcmV0dXJuIHJjOworfTsKKworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeV9wcyA9IHsKKwkubmFtZSA9ICJtaW9hNzAxX2JhdHRlcnkiLAorCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkuZ2V0X3Byb3BlcnR5ID0gZ2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0aWVzID0gYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJhdHRlcnlfcHJvcHMpLAorfTsKKworc3RhdGljIGludCBiYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtOTd4eCAqd20gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmM7CisKKwliYXR0ZXJ5X3dtID0gd207CisKKwlyYyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihOVUxMLCAmYmF0dGVyeV9wcyk7CisJaWYgKHJjKQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSJDb3VsZCBub3QgcmVnaXN0ZXIgbWlvYTcwMSBiYXR0ZXJ5IC0+ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJYmF0dGVyeV93bSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1pb2E3MDFfYmF0dGVyeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid205N3h4LWJhdHRlcnkiLAorCX0sCisJLnByb2JlID0gYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gYmF0dGVyeV9yZW1vdmUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1pb2E3MDFfYmF0dGVyeV9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1pb2E3MDFfYmF0dGVyeV9kcml2ZXIpOworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgbWlvYTcwMSBiYXR0ZXJ5IGRyaXZlclxuIik7CisJcmV0dXJuIHJjOworfQorCisjZWxzZQorc3RhdGljIGludCBfX2luaXQgbWlvYTcwMV9iYXR0ZXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogTWlvIGdsb2JhbAorICovCisKKy8qIERldmljZXMgKi8KKyNkZWZpbmUgTUlPX1BBUkVOVF9ERVYodmFyLCBzdHJuYW1lLCB0cGFyZW50LCBwZGF0YSkJXAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdmFyID0gewkJCVwKKwkubmFtZQkJPSBzdHJuYW1lLAkJCVwKKwkuaWQJCT0gLTEsCQkJCVwKKwkuZGV2CQk9IHsJCQkJXAorCQkucGxhdGZvcm1fZGF0YSA9IHBkYXRhLAkJCVwKKwkJLnBhcmVudAk9IHRwYXJlbnQsCQkJXAorCX0sCQkJCQkJXAorfTsKKyNkZWZpbmUgTUlPX1NJTVBMRV9ERVYodmFyLCBzdHJuYW1lLCBwZGF0YSkJXAorCU1JT19QQVJFTlRfREVWKHZhciwgc3RybmFtZSwgTlVMTCwgcGRhdGEpCisKK01JT19TSU1QTEVfREVWKG1pb2E3MDFfZ3Bpb19rZXlzLCAiZ3Bpby1rZXlzIiwJICAgICZtaW9hNzAxX2dwaW9fa2V5c19kYXRhKQorTUlPX1BBUkVOVF9ERVYobWlvYTcwMV9iYWNrbGlnaHQsICJwd20tYmFja2xpZ2h0IiwgICZweGEyN3hfZGV2aWNlX3B3bTAuZGV2LAorCQkmbWlvYTcwMV9iYWNrbGlnaHRfZGF0YSk7CitNSU9fU0lNUExFX0RFVihtaW9hNzAxX2xlZCwJICAibGVkcy1ncGlvIiwJICAgICZncGlvX2xlZF9pbmZvKQorTUlPX1NJTVBMRV9ERVYocHhhMnh4X3BjbSwJICAicHhhMnh4LXBjbSIsCSAgICBOVUxMKQorTUlPX1NJTVBMRV9ERVYocHhhMnh4X2FjOTcsCSAgInB4YTJ4eC1hYzk3IiwgICAgTlVMTCkKK01JT19QQVJFTlRfREVWKG1pb193bTk3MTNfY29kZWMsICAid205NzEzLWNvZGVjIiwgICAmcHhhMnh4X2FjOTcuZGV2LCBOVUxMKQorTUlPX1NJTVBMRV9ERVYobWlvYTcwMV9zb3VuZCwJICAibWlvYTcwMS13bTk3MTMiLCBOVUxMKQorTUlPX1NJTVBMRV9ERVYobWlvYTcwMV9ib2FyZCwJICAibWlvYTcwMS1ib2FyZCIsICBOVUxMKQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm1pb2E3MDFfZ3Bpb19rZXlzLAorCSZtaW9hNzAxX2JhY2tsaWdodCwKKwkmbWlvYTcwMV9sZWQsCisJJnB4YTJ4eF9wY20sCisJJnB4YTJ4eF9hYzk3LAorCSZtaW9fd205NzEzX2NvZGVjLAorCSZtaW9hNzAxX3NvdW5kLAorCSZwb3dlcl9kZXYsCisJJnN0cmF0YWZsYXNoLAorCSZtaW9hNzAxX2JvYXJkCit9OworCitzdGF0aWMgdm9pZCBtaW9hNzAxX21hY2hpbmVfZXhpdCh2b2lkKTsKKworc3RhdGljIHZvaWQgbWlvYTcwMV9wb3dlcm9mZih2b2lkKQoreworCW1pb2E3MDFfbWFjaGluZV9leGl0KCk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJTzE4X1BPV0VST0ZGLCAxKTsKK30KKworc3RhdGljIHZvaWQgbWlvYTcwMV9yZXN0YXJ0KGNoYXIgYykKK3sKKwltaW9hNzAxX21hY2hpbmVfZXhpdCgpOworCWFybV9tYWNoaW5lX3Jlc3RhcnQoYyk7Cit9CisKK3N0cnVjdCBncGlvX3Jlc3MgZ2xvYmFsX2dwaW9zW10gPSB7CisJTUlPX0dQSU9fT1VUKEdQSU85X0NIQVJHRV9uRU4sIDEsICJDaGFyZ2VyIGVuYWJsZSIpLAorCU1JT19HUElPX09VVChHUElPMThfUE9XRVJPRkYsIDAsICJQb3dlciBPZmYiKSwKKwlNSU9fR1BJT19PVVQoR1BJTzg3X0xDRF9QT1dFUiwgMCwgIkxDRCBQb3dlciIpCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbWlvYTcwMV9tYWNoaW5lX2luaXQodm9pZCkKK3sKKwlQU0xSICA9IDB4ZmYxMDAwMDA7IC8qIFNZU0RFTD0xMjVtcywgUFdSREVMPTEyNW1zLCBQU0xSX1NMX1JPRD0xICovCisJUENGUiA9IFBDRlJfRENfRU4gfCBQQ0ZSX0dQUl9FTiB8IFBDRlJfT1BERTsKKwlSVFRSID0gMzI3NjggLSAxOyAvKiBSZXNldCBjcmF6eSBXaW5DRSB2YWx1ZSAqLworCVVQMk9DUiA9IFVQMk9DUl9IWE9FOworCisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUobWlvYTcwMV9waW5fY29uZmlnKSk7CisJbWlvX2dwaW9fcmVxdWVzdChBUlJBWV9BTkRfU0laRShnbG9iYWxfZ3Bpb3MpKTsKKwlib290c3RyYXBfaW5pdCgpOworCXNldF9weGFfZmJfaW5mbygmbWlvYTcwMV9weGFmYl9pbmZvKTsKKwlweGFfc2V0X21jaV9pbmZvKCZtaW9hNzAxX21jaV9pbmZvKTsKKwlweGFfc2V0X2tleXBhZF9pbmZvKCZtaW9hNzAxX2tleXBhZF9pbmZvKTsKKwl1ZGNfaW5pdCgpOworCXBtX3Bvd2VyX29mZiA9IG1pb2E3MDFfcG93ZXJvZmY7CisJYXJtX3BtX3Jlc3RhcnQgPSBtaW9hNzAxX3Jlc3RhcnQ7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CisJZ3NtX2luaXQoKTsKKwltaW9hNzAxX2JhdHRlcnlfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBtaW9hNzAxX21hY2hpbmVfZXhpdCh2b2lkKQoreworCXVkY19leGl0KCk7CisJYm9vdHN0cmFwX2V4aXQoKTsKKwlnc21fZXhpdCgpOworfQorCitNQUNISU5FX1NUQVJUKE1JT0E3MDEsICJNSU8gQTcwMSIpCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLm1hcF9pbwkJPSAmcHhhX21hcF9pbywKKwkuaW5pdF9pcnEJPSAmcHhhMjd4X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBtaW9hNzAxX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJnB4YV90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxX2Jvb3RyZXN1bWUuUyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDFfYm9vdHJlc3VtZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDc2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxX2Jvb3RyZXN1bWUuUwpAQCAtMCwwICsxLDM2IEBACisvKiBCb290bG9hZGVyIHRvIHJlc3VtZSBNSU8gQTcwMQorICoKKyAqIDIwMDctMS0xMiBSb2JlcnQgSmFyem1paworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR1BMdjIuCisqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworLyoKKyAqIE5vdGU6IFllcywgcGFydCBvZiB0aGUgZm9sbG93aW5nIGNvZGUgaXMgbG9jYXRlZCBpbnRvIHRoZSAuZGF0YSBzZWN0aW9uLgorICogICAgICAgVGhpcyBpcyB0byBhbGxvdyBqdW1wYWRkciB0byBiZSBhY2Nlc3NlZCB3aXRoIGEgcmVsYXRpdmUgbG9hZAorICogICAgICAgd2hpbGUgd2UgY2FuJ3QgcmVseSBvbiBhbnkgTU1VIHRyYW5zbGF0aW9uLiAgV2UgY291bGQgaGF2ZSBwdXQKKyAqICAgICAgIHNsZWVwX3NhdmVfc3AgaW4gdGhlIC50ZXh0IHNlY3Rpb24gYXMgd2VsbCwgYnV0IHNvbWUgc2V0dXBzIG1pZ2h0CisgKiAgICAgICBpbnNpc3Qgb24gaXQgdG8gYmUgdHJ1bHkgcmVhZC1vbmx5LgorICovCisJLmRhdGEKK0VOVFJZKG1pb2E3MDFfYm9vdHN0cmFwKQorMDoKKwliCTFmCitFTlRSWShtaW9hNzAxX2p1bXBhZGRyKQorCS53b3JkCTB4NDBmMDAwMDgJCUAgUFNQUiBpbiBuby1NTVUgbW9kZQorMToKKwltb3YJcjAsICAgICAjMHhhMDAwMDAwMAlAIERvbid0IHN1cHBvc2UgbWVtb3J5IGFjY2VzcyB3b3JrcworCW9ycglyMCwgcjAsICMweDAwMjAwMDAwCUAgZXZlbiBpZiBpdCdzIHN1cHBvc2VkIHRvCisJbW92CXIxLCAjMAorCXN0cglyMSwgW3IwXQkJQCBFYXJseSBkaXNhYmxlIHJlc3VtZSBmb3IgbmV4dCBib290CisJbGRyCXIwLCBtaW9hNzAxX2p1bXBhZGRyCUAgKE11cnBoeSdzIExhdykKKwlsZHIJcjAsIFtyMF0KKwltb3YJcGMsIHIwCisyOgorCitFTlRSWShtaW9hNzAxX2Jvb3RzdHJhcF9sZykKKwkuZGF0YQorCS53b3JkCTJiLTBiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tcDkwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbXA5MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTczODE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbXA5MDAuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS9tcDkwMC5jCisgKgorICogIFN1cHBvcnQgZm9yIHRoZSBORUMgTW9iaWxlUHJvOTAwL0MgcGxhdGZvcm0KKyAqCisgKiAgQmFzZWQgb24gbWFjaC1weGEvZ3Vtc3RpeC5jCisgKgorICogIDIwMDcsIDIwMDggS3Jpc3RvZmZlciBFcmljc29uIDxrcmlzdG9mZmVyLmVyaWNzb25AZ21haWwuY29tPgorICogIDIwMDcsIDIwMDggTWljaGFlbCBQZXRjaGtvdnNreSA8bWtwZXRjaEBpbnRlcm5vZGUub24ubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxMTZ4Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RhdGljIHZvaWQgaXNwMTE2eF9wZm1fZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpCit7CisKKwkvKiA0MDBNaHogUFhBMiA9IDIuNW5zIC8gaW5zdHJ1Y3Rpb24gKi8KKworCWludCBjeWMgPSBkZWxheSAvIDEwOworCisJLyogNCBJbnN0cnVjdGlvbnMgPSA0IHggMi41bnMgPSAxMG5zICovCisJX19hc21fXyB2b2xhdGlsZSAoIjA6XG4iCisJCSJzdWJzICUwLCAlMSwgIzFcbiIKKwkJImJnZSAwYlxuIgorCQk6Ij1yIiAoY3ljKQorCQk6IjAiKGN5YykKKwkpOworfQorCitzdGF0aWMgc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSBpc3AxMTZ4X3BmbV9kYXRhID0geworCS5yZW1vdGVfd2FrZXVwX2VuYWJsZSA9IDEsCisJLmRlbGF5ID0gaXNwMTE2eF9wZm1fZGVsYXksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlzcDExNnhfcGZtX3Jlc291cmNlc1tdID0geworCVswXSA9CXsKKwkJLnN0YXJ0CT0gMHgwZDAwMDAwMCwKKwkJLmVuZAk9IDB4MGQwMDAwMDAgKyAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwkJfSwKKwlbMV0gPQl7CisJCS5zdGFydCAgPSAweDBkMDAwMDAwICsgNCwKKwkJLmVuZAk9IDB4MGQwMDAwMDAgKyA1LAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJWzJdID0JeworCQkuc3RhcnQJPSA2MSwKKwkJLmVuZAk9IDYxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1wOTAwY19kdW1teV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm1wOTAwY19kdW1teSIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXA5MDBjX3VzYiA9IHsKKwkubmFtZQkJPSAiaXNwMTE2eC1oY2QiLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpc3AxMTZ4X3BmbV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlzcDExNnhfcGZtX3Jlc291cmNlcywKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmaXNwMTE2eF9wZm1fZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbXA5MDBjX2R1bW15X2RldmljZSwKKwkmbXA5MDBjX3VzYiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcDkwMGNfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIk1vYmlsZVBybyA5MDAvQyBtYWNoaW5lIGluaXRcbiIpOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCisvKiBNYWludGFpbmVyIC0gTWljaGFlbCBQZXRjaGtvdnNreSA8bWtwZXRjaEBpbnRlcm5vZGUub24ubmV0PiAqLworTUFDSElORV9TVEFSVChORUNfTVA5MDAsICJNb2JpbGVQcm85MDAvQyIpCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5ib290X3BhcmFtcwk9IDB4YTAyMjAxMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCisJLm1hcF9pbwkJPSBweGFfbWFwX2lvLAorCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gbXA5MDBjX2luaXQsCitNQUNISU5FX0VORAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jCmluZGV4IGZlOTI0YTIuLjQ0NDc3MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10eC5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93bTk3eHhfYmF0dC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0zNDAsNiArMzQyLDIzIEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXTTk3eHggYmF0dGVyeQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgd205N3h4X2JhdHRfaW5mbyB3bTk3eHhfYmF0dF9wZGF0YSA9IHsKKwkuYmF0dF9hdXgJPSBXTTk3WFhfQVVYX0lEMywKKwkudGVtcF9hdXgJPSBXTTk3WFhfQVVYX0lEMiwKKwkuY2hhcmdlX2dwaW8JPSAtMSwKKwkubWF4X3ZvbHRhZ2UJPSBQQUxNVFhfQkFUX01BWF9WT0xUQUdFLAorCS5taW5fdm9sdGFnZQk9IFBBTE1UWF9CQVRfTUlOX1ZPTFRBR0UsCisJLmJhdHRfbXVsdAk9IDEwMDAsCisJLmJhdHRfZGl2CT0gNDE0LAorCS50ZW1wX211bHQJPSAxLAorCS50ZW1wX2Rpdgk9IDEsCisJLmJhdHRfdGVjaAk9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJUE8sCisJLmJhdHRfbmFtZQk9ICJtYWluLWJhdHQiLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRnJhbWVidWZmZXIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBwYWxtdHhfbGNkX21vZGVzW10gPSB7CkBAIC00MDEsNiArNDIwLDcgQEAKIAlweGFfc2V0X2FjOTdfaW5mbyhOVUxMKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmcGFsbXR4X2ZpY3BfcGxhdGZvcm1fZGF0YSk7CiAJcHhhX3NldF9rZXlwYWRfaW5mbygmcGFsbXR4X2tleXBhZF9wbGF0Zm9ybV9kYXRhKTsKKwl3bTk3eHhfYmF0X3NldF9wZGF0YSgmd205N3h4X2JhdHRfcGRhdGEpOwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3MzBkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYwpAQCAtMCwwICsxLDU1NCBAQAorLyoKKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciBQYWxtIFppcmU3MgorICoKKyAqIEF1dGhvcnM6CisgKglWbGFkaW1pciAiRmFyY2FsbGVyIiBQb3V6YW5vdiA8ZmFyY2FsbGVyQGdtYWlsLmNvbT4KKyAqCVNlcmdleSBMYXBpbiA8c2xhcGluQG9zc2ZhbnMub3JnPgorICoJQWxleCBPc2Jvcm5lIDxib2JvZmRvb21AZ21haWwuY29tPgorICoJSmFuIEhlcm1hbiA8MmhwQHNlem5hbS5jej4KKyAqCisgKiBSZXdyaXRlIGZvciBtYWlubGluZToKKyAqCU1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAoZmluZCBtb3JlIGluZm8gYXQgd3d3LmhhY2tuZGV2LmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFjaC9wYWxtejcyLmg+CisjaW5jbHVkZSA8bWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyN3guaD4KKyNpbmNsdWRlIDxtYWNoL2lyZGEuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTI3eF9rZXlwYWQuaD4KKyNpbmNsdWRlIDxtYWNoL3VkYy5oPgorI2luY2x1ZGUgPG1hY2gvcG0uaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBpbiBjb25maWd1cmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFsbXo3Ml9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBNTUMgKi8KKwlHUElPMzJfTU1DX0NMSywKKwlHUElPOTJfTU1DX0RBVF8wLAorCUdQSU8xMDlfTU1DX0RBVF8xLAorCUdQSU8xMTBfTU1DX0RBVF8yLAorCUdQSU8xMTFfTU1DX0RBVF8zLAorCUdQSU8xMTJfTU1DX0NNRCwKKwlHUElPMTRfR1BJTywJLyogU0QgZGV0ZWN0ICovCisJR1BJTzExNV9HUElPLAkvKiBTRCBSTyAqLworCUdQSU85OF9HUElPLAkvKiBTRCBwb3dlciAqLworCisJLyogQUM5NyAqLworCUdQSU8yOF9BQzk3X0JJVENMSywKKwlHUElPMjlfQUM5N19TREFUQV9JTl8wLAorCUdQSU8zMF9BQzk3X1NEQVRBX09VVCwKKwlHUElPMzFfQUM5N19TWU5DLAorCisJLyogSXJEQSAqLworCUdQSU80OV9HUElPLAkvKiBpciBkaXNhYmxlICovCisJR1BJTzQ2X0ZJQ1BfUlhELAorCUdQSU80N19GSUNQX1RYRCwKKworCS8qIFBXTSAqLworCUdQSU8xNl9QV00wX09VVCwKKworCS8qIFVTQiAqLworCUdQSU8xNV9HUElPLAkvKiB1c2IgZGV0ZWN0ICovCisJR1BJTzEyX0dQSU8sCS8qIHVzYiBwdWxsdXAgKi8KKwlHUElPOTVfR1BJTywJLyogdXNiIHBvd2VyICovCisKKwkvKiBNYXRyaXgga2V5cGFkICovCisJR1BJTzEwMF9LUF9NS0lOXzAJfCBXQUtFVVBfT05fTEVWRUxfSElHSCwKKwlHUElPMTAxX0tQX01LSU5fMQl8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDJfS1BfTUtJTl8yCXwgV0FLRVVQX09OX0xFVkVMX0hJR0gsCisJR1BJTzk3X0tQX01LSU5fMwl8IFdBS0VVUF9PTl9MRVZFTF9ISUdILAorCUdQSU8xMDNfS1BfTUtPVVRfMCwKKwlHUElPMTA0X0tQX01LT1VUXzEsCisJR1BJTzEwNV9LUF9NS09VVF8yLAorCisJLyogTENEICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKwlHUElPNzdfTENEX0JJQVMsCisJR1BJTzIwX0dQSU8sCS8qIGJsIHBvd2VyICovCisJR1BJTzIxX0dQSU8sCS8qIExDRCBib3JkZXIgc3dpdGNoICovCisJR1BJTzIyX0dQSU8sCS8qIExDRCBib3JkZXIgY29sb3IgKi8KKwlHUElPOTZfR1BJTywJLyogbGNkIHBvd2VyICovCisKKwkvKiBNaXNjLiAqLworCUdQSU8wX0dQSU8JfCBXQUtFVVBfT05fTEVWRUxfSElHSCwJLyogcG93ZXIgZGV0ZWN0ICovCisJR1BJTzg4X0dQSU8sCQkJCS8qIGdyZWVuIGxlZCAqLworCUdQSU8yN19HUElPLAkJCQkvKiBXTTk3MTIgSVJRICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRC9NTUMgY2FyZCBjb250cm9sbGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwYWxtejcyX21jaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlpcnFfaGFuZGxlcl90IHBhbG16NzJfZGV0ZWN0X2ludCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyID0gMDsKKworCS8qIFNldHVwIGFuIGludGVycnVwdCBmb3IgZGV0ZWN0aW5nIGNhcmQgaW5zZXJ0L3JlbW92ZSBldmVudHMgKi8KKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OLCAiU0QgSVJRIik7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisJZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisJZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OKSwKKwkJCXBhbG16NzJfZGV0ZWN0X2ludCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0FNUExFX1JBTkRPTSB8CisJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkiU0QvTU1DIGNhcmQgZGV0ZWN0IiwgZGF0YSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgcmVxdWVzdCBTRC9NTUMgY2FyZCBkZXRlY3QgSVJRXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJZ290byBlcnIyOworCX0KKworCS8qIFNEX1BPV0VSIGlzIG5vdCBhY3R1YWxseSBwb3dlciwgYnV0IGl0IGlzIG1vcmUgbGlrZSBjaGlwCisJICogc2VsZWN0LCBpLmUuIGl0IGlzIGludmVydGVkICovCisKKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNWjcyX1NEX1BPV0VSX04sICJTRF9QT1dFUiIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyMzsKKwllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNWjcyX1NEX1BPV0VSX04sIDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyNDsKKwllcnIgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNWjcyX1NEX1JPLCAiU0RfUk8iKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjQ7CisJZXJyID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19OUl9QQUxNWjcyX1NEX1JPKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjU7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlycSByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKKworZXJyNToKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNWjcyX1NEX1JPKTsKK2VycjQ6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9QT1dFUl9OKTsKK2VycjM6CisJZnJlZV9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OKSwgZGF0YSk7CitlcnIyOgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfU0RfREVURUNUX04pOworZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzJfbWNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfU0RfUE9XRVJfTik7CisJZnJlZV9pcnEoZ3Bpb190b19pcnEoR1BJT19OUl9QQUxNWjcyX1NEX0RFVEVDVF9OKSwgZGF0YSk7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9ERVRFQ1RfTik7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9STyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzJfbWNpX3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZkZCkKK3sKKwlzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgKnBfZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAocF9kLT5vY3JfbWFzayAmICgxIDw8IHZkZCkpCisJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9QT1dFUl9OLCAwKTsKKwllbHNlCisJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9QT1dFUl9OLCAxKTsKK30KKworc3RhdGljIGludCBwYWxtejcyX21jaV9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEdQSU9fTlJfUEFMTVo3Ml9TRF9STyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgcGFsbXo3Ml9tY2lfcGxhdGZvcm1fZGF0YSA9IHsKKwkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNCwKKwkuc2V0cG93ZXIJPSBwYWxtejcyX21jaV9wb3dlciwKKwkuZ2V0X3JvCQk9IHBhbG16NzJfbWNpX3JvLAorCS5pbml0IAkJPSBwYWxtejcyX21jaV9pbml0LAorCS5leGl0CQk9IHBhbG16NzJfbWNpX2V4aXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHUElPIGtleWJvYXJkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGludCBwYWxtejcyX21hdHJpeF9rZXlzW10gPSB7CisJS0VZKDAsIDAsIEtFWV9QT1dFUiksCisJS0VZKDAsIDEsIEtFWV9GMSksCisJS0VZKDAsIDIsIEtFWV9FTlRFUiksCisKKwlLRVkoMSwgMCwgS0VZX0YyKSwKKwlLRVkoMSwgMSwgS0VZX0YzKSwKKwlLRVkoMSwgMiwgS0VZX0Y0KSwKKworCUtFWSgyLCAwLCBLRVlfVVApLAorCUtFWSgyLCAyLCBLRVlfRE9XTiksCisKKwlLRVkoMywgMCwgS0VZX1JJR0hUKSwKKwlLRVkoMywgMiwgS0VZX0xFRlQpLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyN3hfa2V5cGFkX3BsYXRmb3JtX2RhdGEgcGFsbXo3Ml9rZXlwYWRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubWF0cml4X2tleV9yb3dzCT0gNCwKKwkubWF0cml4X2tleV9jb2xzCT0gMywKKwkubWF0cml4X2tleV9tYXAJCT0gcGFsbXo3Ml9tYXRyaXhfa2V5cywKKwkubWF0cml4X2tleV9tYXBfc2l6ZQk9IEFSUkFZX1NJWkUocGFsbXo3Ml9tYXRyaXhfa2V5cyksCisKKwkuZGVib3VuY2VfaW50ZXJ2YWwJPSAzMCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJhY2tsaWdodAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGFsbXo3Ml9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX05SX1BBTE1aNzJfQkxfUE9XRVIsICJCTCBQT1dFUiIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1aNzJfQkxfUE9XRVIsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNWjcyX0xDRF9QT1dFUiwgIkxDRCBQT1dFUiIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNWjcyX0xDRF9QT1dFUiwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCisJcmV0dXJuIDA7CitlcnIzOgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfTENEX1BPV0VSKTsKK2VycjI6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9CTF9QT1dFUik7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYWxtejcyX2JhY2tsaWdodF9ub3RpZnkoaW50IGJyaWdodG5lc3MpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNWjcyX0JMX1BPV0VSLCBicmlnaHRuZXNzKTsKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1aNzJfTENEX1BPV0VSLCBicmlnaHRuZXNzKTsKKwlyZXR1cm4gYnJpZ2h0bmVzczsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3Ml9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9CTF9QT1dFUik7CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9MQ0RfUE9XRVIpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBwYWxtejcyX2JhY2tsaWdodF9kYXRhID0geworCS5wd21faWQJCT0gMCwKKwkubWF4X2JyaWdodG5lc3MJPSBQQUxNWjcyX01BWF9JTlRFTlNJVFksCisJLmRmdF9icmlnaHRuZXNzCT0gUEFMTVo3Ml9NQVhfSU5URU5TSVRZLAorCS5wd21fcGVyaW9kX25zCT0gUEFMTVo3Ml9QRVJJT0RfTlMsCisJLmluaXQJCT0gcGFsbXo3Ml9iYWNrbGlnaHRfaW5pdCwKKwkubm90aWZ5CQk9IHBhbG16NzJfYmFja2xpZ2h0X25vdGlmeSwKKwkuZXhpdAkJPSBwYWxtejcyX2JhY2tsaWdodF9leGl0LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbXo3Ml9iYWNrbGlnaHQgPSB7CisJLm5hbWUJPSAicHdtLWJhY2tsaWdodCIsCisJLmRldgk9IHsKKwkJLnBhcmVudAkJPSAmcHhhMjd4X2RldmljZV9wd20wLmRldiwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGFsbXo3Ml9iYWNrbGlnaHRfZGF0YSwKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSXJEQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcGFsbXo3Ml9pcmRhX3N0YXJ0dXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnI7CisJZXJyID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9JUl9ESVNBQkxFLCAiSVIgRElTQUJMRSIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCWVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX05SX1BBTE1aNzJfSVJfRElTQUJMRSwgMSk7CisJaWYgKGVycikKKwkJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9JUl9ESVNBQkxFKTsKK2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcyX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfSVJfRElTQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG16NzJfaXJkYV90cmFuc2NlaXZlcl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNWjcyX0lSX0RJU0FCTEUsIG1vZGUgJiBJUl9PRkYpOworCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHBhbG16NzJfZmljcF9wbGF0Zm9ybV9kYXRhID0geworCS5zdGFydHVwCQk9IHBhbG16NzJfaXJkYV9zdGFydHVwLAorCS5zaHV0ZG93bgkJPSBwYWxtejcyX2lyZGFfc2h1dGRvd24sCisJLnRyYW5zY2VpdmVyX2NhcAk9IElSX1NJUk1PREUgfCBJUl9PRkYsCisJLnRyYW5zY2VpdmVyX21vZGUJPSBwYWxtejcyX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExFRHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJwYWxtejcyOmdyZWVuOmxlZCIsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAibm9uZSIsCisJCS5ncGlvCQkJPSBHUElPX05SX1BBTE1aNzJfTEVEX0dSRUVOLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZ3Bpb19sZWRfaW5mbyA9IHsKKwkubGVkcwkJPSBncGlvX2xlZHMsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRShncGlvX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFsbXo3Ml9sZWRzID0geworCS5uYW1lCT0gImxlZHMtZ3BpbyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmZ3Bpb19sZWRfaW5mbywKKwl9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb3dlciBzdXBwbHkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBvd2VyX3N1cHBseV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fTlJfUEFMTVo3Ml9QT1dFUl9ERVRFQ1QsICJDQUJMRV9TVEFURV9BQyIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMTsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1aNzJfUE9XRVJfREVURUNUKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNWjcyX1VTQl9ERVRFQ1RfTiwgIkNBQkxFX1NUQVRFX1VTQiIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1aNzJfVVNCX0RFVEVDVF9OKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlyZXR1cm4gMDsKK2VycjM6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTVo3Ml9VU0JfREVURUNUX04pOworZXJyMjoKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNWjcyX1BPV0VSX0RFVEVDVCk7CitlcnIxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3Ml9pc19hY19vbmxpbmUodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoR1BJT19OUl9QQUxNWjcyX1BPV0VSX0RFVEVDVCk7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXo3Ml9pc191c2Jfb25saW5lKHZvaWQpCit7CisJcmV0dXJuICFncGlvX2dldF92YWx1ZShHUElPX05SX1BBTE1aNzJfVVNCX0RFVEVDVF9OKTsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfc3VwcGx5X2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWdwaW9fZnJlZShHUElPX05SX1BBTE1aNzJfVVNCX0RFVEVDVF9OKTsKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNWjcyX1BPV0VSX0RFVEVDVCk7Cit9CisKK3N0YXRpYyBjaGFyICpwYWxtejcyX3N1cHBsaWNhbnRzW10gPSB7CisJIm1haW4tYmF0dGVyeSIsCit9OworCitzdGF0aWMgc3RydWN0IHBkYV9wb3dlcl9wZGF0YSBwb3dlcl9zdXBwbHlfaW5mbyA9IHsKKwkuaW5pdCAgICAgICAgICAgID0gcG93ZXJfc3VwcGx5X2luaXQsCisJLmlzX2FjX29ubGluZSAgICA9IHBhbG16NzJfaXNfYWNfb25saW5lLAorCS5pc191c2Jfb25saW5lICAgPSBwYWxtejcyX2lzX3VzYl9vbmxpbmUsCisJLmV4aXQgICAgICAgICAgICA9IHBvd2VyX3N1cHBseV9leGl0LAorCS5zdXBwbGllZF90byAgICAgPSBwYWxtejcyX3N1cHBsaWNhbnRzLAorCS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHBhbG16NzJfc3VwcGxpY2FudHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG93ZXJfc3VwcGx5ID0geworCS5uYW1lID0gInBkYS1wb3dlciIsCisJLmlkICAgPSAtMSwKKwkuZGV2ICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmcG93ZXJfc3VwcGx5X2luZm8sCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZyYW1lYnVmZmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gcGFsbXo3Ml9sY2RfbW9kZXNbXSA9IHsKK3sKKwkucGl4Y2xvY2sJPSAxMTUzODQsCisJLnhyZXMJCT0gMzIwLAorCS55cmVzCQk9IDMyMCwKKwkuYnBwCQk9IDE2LAorCisJLmxlZnRfbWFyZ2luCT0gMjcsCisJLnJpZ2h0X21hcmdpbgk9IDcsCisJLnVwcGVyX21hcmdpbgk9IDcsCisJLmxvd2VyX21hcmdpbgk9IDgsCisKKwkuaHN5bmNfbGVuCT0gNiwKKwkudnN5bmNfbGVuCT0gMSwKK30sCit9OworCitzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBwYWxtejcyX2xjZF9zY3JlZW4gPSB7CisJLm1vZGVzCQk9IHBhbG16NzJfbGNkX21vZGVzLAorCS5udW1fbW9kZXMJPSBBUlJBWV9TSVpFKHBhbG16NzJfbGNkX21vZGVzKSwKKwkubGNkX2Nvbm4JPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorfTsKKworI2lmZGVmIENPTkZJR19QTQorCisvKiBXZSBoYXZlIHNvbWUgYmxhY2sgbWFnaWMgaGVyZQorICogUGFsbU9TIFJPTSBvbiByZWNvdmVyIGV4cGVjdHMgc3BlY2lhbCBzdHJ1Y3QgcGh5c2ljYWwgYWRkcmVzcworICogdG8gYmUgdHJhbnNmZXJyZWQgdmlhIFBTUFIuIFVzaW5nIHRoaXMgc3RydWN0IFBhbG1PUyByZXN0b3JlcworICogaXRzIHN0YXRlIGFmdGVyIHNsZWVwLiBBcyBmb3IgTGludXgsIHdlIG5lZWQgdG8gc2V0dXAgaXQgdGhlCisgKiBzYW1lIHdheS4gTW9yZSB0aGFuIHRoYXQsIFBhbG1PUyBST00gY2hhbmdlcyBzb21lIHZhbHVlcyBpbiBtZW1vcnkuCisgKiBGb3Igbm93IG9ubHkgb25lIGxvY2F0aW9uIGlzIGZvdW5kLCB3aGljaCBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC4KKyAqIFRoYW5rcyB0byBBbGV4IE9zYm9ybmUsIEFuZHJ6ZWogWmFib3Jvd3NraSwgYW5kIGxvdHMgb2Ygb3RoZXIgcGVvcGxlCisgKiBmb3IgcmVhZGluZyBiYWNrdHJhY2VzIGZvciBtZSA6KQorICovCisKKyNkZWZpbmUgUEFMTVo3Ml9TQVZFX0RXT1JEICgodW5zaWduZWQgbG9uZyAqKTB4YzAwMDAwNTApCisKK3N0YXRpYyBzdHJ1Y3QgcGFsbXo3Ml9yZXN1bWVfaW5mbyBwYWxtejcyX3Jlc3VtZV9pbmZvID0geworCS5tYWdpYzAgPSAweGI0ZTYsCisJLm1hZ2ljMSA9IDEsCisKKwkvKiByZXNldCBzdGF0ZSwgTU1VIG9mZiBldGMgKi8KKwkuYXJtX2NvbnRyb2wgPSAwLAorCS5hdXhfY29udHJvbCA9IDAsCisJLnR0YiA9IDAsCisJLmRvbWFpbl9hY2Nlc3MgPSAwLAorCS5wcm9jZXNzX2lkID0gMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0b3JlX3B0cjsKKworLyogc3lzX2RldmljZSBmb3IgUGFsbSBaaXJlIDcyIFBNICovCisKK3N0YXRpYyBpbnQgcGFsbXo3Ml9wbV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCit7CisJLyogc2V0dXAgdGhlIHJlc3VtZV9pbmZvIHN0cnVjdCBmb3IgdGhlIG9yaWdpbmFsIGJvb3Rsb2FkZXIgKi8KKwlwYWxtejcyX3Jlc3VtZV9pbmZvLnJlc3VtZV9hZGRyID0gKHUzMikgcHhhX2NwdV9yZXN1bWU7CisKKwkvKiBTdG9yaW5nIG1lbW9yeSB0b3VjaGVkIGJ5IFJPTSAqLworCXN0b3JlX3B0ciA9ICpQQUxNWjcyX1NBVkVfRFdPUkQ7CisKKwkvKiBTZXR0aW5nIFBTUFIgdG8gYSBwcm9wZXIgdmFsdWUgKi8KKwlQU1BSID0gdmlydF90b19waHlzKCZwYWxtejcyX3Jlc3VtZV9pbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG16NzJfcG1fcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJKlBBTE1aNzJfU0FWRV9EV09SRCA9IHN0b3JlX3B0cjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgcGFsbXo3Ml9wbV9zeXNjbGFzcyA9IHsKKwkubmFtZSA9ICJwYWxtejcyX3BtIiwKKwkuc3VzcGVuZCA9IHBhbG16NzJfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gcGFsbXo3Ml9wbV9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgcGFsbXo3Ml9wbV9kZXZpY2UgPSB7CisJLmNscyA9ICZwYWxtejcyX3BtX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGFsbXo3Ml9wbV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC1FTk9ERVY7CisJaWYgKG1hY2hpbmVfaXNfcGFsbXo3MigpKSB7CisJCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmcGFsbXo3Ml9wbV9zeXNjbGFzcyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHN5c2Rldl9yZWdpc3RlcigmcGFsbXo3Ml9wbV9kZXZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwocGFsbXo3Ml9wbV9pbml0KTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYWNoaW5lIGluaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnBhbG16NzJfYmFja2xpZ2h0LAorCSZwYWxtejcyX2xlZHMsCisJJnBvd2VyX3N1cHBseSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwYWxtejcyX2luaXQodm9pZCkKK3sKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShwYWxtejcyX3Bpbl9jb25maWcpKTsKKwlzZXRfcHhhX2ZiX2luZm8oJnBhbG16NzJfbGNkX3NjcmVlbik7CisJcHhhX3NldF9tY2lfaW5mbygmcGFsbXo3Ml9tY2lfcGxhdGZvcm1fZGF0YSk7CisJcHhhX3NldF9hYzk3X2luZm8oTlVMTCk7CisJcHhhX3NldF9maWNwX2luZm8oJnBhbG16NzJfZmljcF9wbGF0Zm9ybV9kYXRhKTsKKwlweGFfc2V0X2tleXBhZF9pbmZvKCZwYWxtejcyX2tleXBhZF9wbGF0Zm9ybV9kYXRhKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChQQUxNWjcyLCAiUGFsbSBaaXJlNzIiKQorCS5waHlzX2lvCT0gMHg0MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSBpb19wMnYoMHg0MDAwMDAwMCksCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkubWFwX2lvCQk9IHB4YV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBwYWxtejcyX2luaXQKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wY20wMjcuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCmluZGV4IDczMGI5ZjYuLjM2MTM1YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTJ4eF9zcGkuaD4KICNpbmNsdWRlIDxtYWNoL3BjbTAyNy5oPgpAQCAtODYsNiArODYsMjggQEAKICAqICopIENQVSBpbnRlcm5hbCB1c2Ugb25seQogICovCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjbTAyN19waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBDaGlwIFNlbGVjdHMgKi8KKwlHUElPMjBfblNEQ1NfMiwKKwlHUElPMjFfblNEQ1NfMywKKwlHUElPMTVfbkNTXzEsCisJR1BJTzc4X25DU18yLAorCUdQSU84MF9uQ1NfNCwKKwlHUElPMzNfbkNTXzUsCS8qIEV0aGVybmV0ICovCisKKwkvKiBJMkMgKi8KKwlHUElPMTE3X0kyQ19TQ0wsCisJR1BJTzExOF9JMkNfU0RBLAorCisJLyogR1BJTyAqLworCUdQSU81Ml9HUElPLAkvKiBJUlEgZnJvbSBuZXR3b3JrIGNvbnRyb2xsZXIgKi8KKyNpZmRlZiBDT05GSUdfTEVEU19HUElPCisJR1BJTzkwX0dQSU8sCS8qIFBDTTAyN19MRURfQ1BVICovCisJR1BJTzkxX0dQSU8sCS8qIFBDTTAyN19MRURfSEVBUlRfQkVBVCAqLworI2VuZGlmCisJR1BJTzExNF9HUElPLAkvKiBJUlEgZnJvbSBDQU4gY29udHJvbGxlciAqLworfTsKKwogLyoKICAqIFNNQzkxeCBuZXR3b3JrIGNvbnRyb2xsZXIgc3BlY2lmaWMgc3R1ZmYKICAqLwpAQCAtMjA2LDEzICsyMjgsOSBAQAogCSAqLwogCUFSQl9DTlRSTCA9IEFSQl9DT1JFX1BBUksgfCAweDIzNDsKIAotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCXB4YTJ4eF9tZnBfY29uZmlnKHBjbTAyN19waW5fY29uZmlnLCBBUlJBWV9TSVpFKHBjbTAyN19waW5fY29uZmlnKSk7CiAKLQkvKiBMRURzIChvbiBkZW1hbmQgb25seSkgKi8KLSNpZmRlZiBDT05GSUdfTEVEU19HUElPCi0JcHhhX2dwaW9fbW9kZShQQ00wMjdfTEVEX0NQVSB8IEdQSU9fT1VUKTsKLQlweGFfZ3Bpb19tb2RlKFBDTTAyN19MRURfSEVBUkRfQkVBVCB8IEdQSU9fT1VUKTsKLSNlbmRpZiAvKiBDT05GSUdfTEVEU19HUElPICovCisJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAKIAkvKiBhdCBsYXN0IGNhbGwgdGhlIGJhc2Vib2FyZCB0byBpbml0aWFsaXplIGl0c2VsZiAqLwogI2lmZGVmIENPTkZJR19NQUNIX1BDTTk5MF9CQVNFQk9BUkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYwppbmRleCA0MjBjOWIzLi5mNjAxNDI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCkBAIC0yNjIsOCArMjYyLDcgQEAKIAkJCQkJR1BJT19iaXQoUENNOTkwX0NUUkxfSU5UX0lSUV9HUElPKTsKIAkJaWYgKGxpa2VseShwZW5kaW5nKSkgewogCQkJaXJxID0gUENNMDI3X0lSUSgwKSArIF9fZmZzKHBlbmRpbmcpOwotCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCQlwZW5kaW5nID0gKH5QQ005OTBfSU5UU0VUQ0xSKSAmIHBjbTk5MF9pcnFfZW5hYmxlZDsKIAl9IHdoaWxlIChwZW5kaW5nKTsKQEAgLTMyOCwzNiArMzI3LDEwIEBACiAJLmV4aXQJCT0gcGNtOTkwX21jaV9leGl0LAogfTsKIAotLyoKLSAqIGluaXQgT0hDSSBoYXJkd2FyZSB0byB3b3JrIHdpdGgKLSAqCi0gKiBOb3RlOiBPbmx5IFVTQiBwb3J0IDEgKGhvc3Qgb25seSkgaXMgY29ubmVjdGVkCi0gKgotICogR1BJTzg4IChVU0JIUFdSIzEpOiBvdmVyY3VycmVudCBpbiwgb3ZlcmN1cnJlbnQgd2hlbiBsb3cKLSAqIEdQSU84OSAoVVNCSFBFTiMxKTogcG93ZXItb24gb3V0LCBvbiB3aGVuIGxvdwotICovCi1zdGF0aWMgaW50IHBjbTk5MF9vaGNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qCi0JICogZGlzYWJsZSBVU0IgcG9ydCAyIGFuZCAzCi0JICogcG93ZXIgc2Vuc2UgaXMgYWN0aXZlIGxvdwotCSAqLwotCVVIQ0hSID0gKChVSENIUikgfCBVSENIUl9QQ1BMIHwgVUhDSFJfUFNQTCB8IFVIQ0hSX1NTRVAyIHwKLQkJCQlVSENIUl9TU0VQMykgJiB+KFVIQ0hSX1NTRVAxIHwgVUhDSFJfU1NFKTsKLQkvKgotCSAqIHdhaXQgMTBtcyBhZnRlciBQb3dlciBvbgotCSAqIG92ZXJjdXJyZW50IHBlciBwb3J0Ci0JICogcG93ZXIgc3dpdGNoIHBlciBwb3J0Ci0JICovCi0JVUhDUkhEQSA9ICg1PDwyNCkgfCAoMTw8MTEpIHwgKDE8PDgpOwkvKiBGSVhNRTogUmVxdWlyZWQ/ICovCi0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgcGNtOTkwX29oY2lfcGxhdGZvcm1fZGF0YSA9IHsKIAkucG9ydF9tb2RlCT0gUE1NX1BFUlBPUlRfTU9ERSwKLQkuaW5pdAkJPSBwY205OTBfb2hjaV9pbml0LAotCS5leGl0CQk9IE5VTEwsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUMSB8IFBPV0VSX0NPTlRST0xfTE9XIHwgUE9XRVJfU0VOU0VfTE9XLAorCS5wb3dlcl9vbl9kZWxheQk9IDEwLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wbS5jCmluZGV4IDFiNTM5ZTYuLjE2NGViMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtODYsOSArODYsMjcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGludCBweGFfcG1fcHJlcGFyZSh2b2lkKQoreworCWludCByZXQgPSAwOworCisJaWYgKHB4YV9jcHVfcG1fZm5zICYmIHB4YV9jcHVfcG1fZm5zLT5wcmVwYXJlKQorCQlyZXQgPSBweGFfY3B1X3BtX2Zucy0+cHJlcGFyZSgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHhhX3BtX2ZpbmlzaCh2b2lkKQoreworCWlmIChweGFfY3B1X3BtX2ZucyAmJiBweGFfY3B1X3BtX2Zucy0+ZmluaXNoKQorCQlweGFfY3B1X3BtX2Zucy0+ZmluaXNoKCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcHhhX3BtX29wcyA9IHsKIAkudmFsaWQJCT0gcHhhX3BtX3ZhbGlkLAogCS5lbnRlcgkJPSBweGFfcG1fZW50ZXIsCisJLnByZXBhcmUJPSBweGFfcG1fcHJlcGFyZSwKKwkuZmluaXNoCQk9IHB4YV9wbV9maW5pc2gsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBweGFfcG1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwppbmRleCAzZjVmNDg0Li4yZTNiZDhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwpAQCAtMjAsNiArMjAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzMsNyArMzYsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvaTJjLmg+CkBAIC00Miw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogI2luY2x1ZGUgPG1hY2gvc2hhcnBzbC5oPgogI2luY2x1ZGUgPG1hY2gvc3NwLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvbG9jb21vLmg+CkBAIC01MSw2ICs1NSw4OCBAQAogI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJzaGFycHNsLmgiCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvb2RsZV9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBJL08gKi8KKwlHUElPNzlfbkNTXzMsCisJR1BJTzgwX25DU180LAorCUdQSU8xOF9SRFksCisKKwkvKiBDbG9jayAqLworCUdQSU8xMl8zMktIeiwKKworCS8qIFNTUDEgKi8KKwlHUElPMjNfU1NQMV9TQ0xLLAorCUdQSU8yNV9TU1AxX1RYRCwKKwlHUElPMjZfU1NQMV9SWEQsCisJR1BJTzI0X0dQSU8sCS8qIFBPT0RMRV9HUElPX1RQX0NTIC0gU0ZSTSBhcyBjaGlwIHNlbGVjdCAqLworCisJLyogSTJTICovCisJR1BJTzI4X0kyU19CSVRDTEtfT1VULAorCUdQSU8yOV9JMlNfU0RBVEFfSU4sCisJR1BJTzMwX0kyU19TREFUQV9PVVQsCisJR1BJTzMxX0kyU19TWU5DLAorCUdQSU8zMl9JMlNfU1lTQ0xLLAorCisJLyogSW5mcmEtUmVkICovCisJR1BJTzQ3X0ZJQ1BfVFhELAorCUdQSU80Nl9GSUNQX1JYRCwKKworCS8qIEZGVUFSVCAqLworCUdQSU80MF9GRlVBUlRfRFRSLAorCUdQSU80MV9GRlVBUlRfUlRTLAorCUdQSU8zOV9GRlVBUlRfVFhELAorCUdQSU8zN19GRlVBUlRfRFNSLAorCUdQSU8zNF9GRlVBUlRfUlhELAorCUdQSU8zNV9GRlVBUlRfQ1RTLAorCisJLyogTENEICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKwlHUElPNzdfTENEX0JJQVMsCisKKwkvKiBQQyBDYXJkICovCisJR1BJTzQ4X25QT0UsCisJR1BJTzQ5X25QV0UsCisJR1BJTzUwX25QSU9SLAorCUdQSU81MV9uUElPVywKKwlHUElPNTJfblBDRV8xLAorCUdQSU81M19uUENFXzIsCisJR1BJTzU0X25QU0tUU0VMLAorCUdQSU81NV9uUFJFRywKKwlHUElPNTZfblBXQUlULAorCUdQSU81N19uSU9JUzE2LAorCisJLyogTU1DICovCisJR1BJTzZfTU1DX0NMSywKKwlHUElPOF9NTUNfQ1MwLAorCisJLyogR1BJTyAqLworCUdQSU85X0dQSU8sCS8qIFBPT0RMRV9HUElPX25TRF9ERVRFQ1QgKi8KKwlHUElPN19HUElPLAkvKiBQT09ETEVfR1BJT19uU0RfV1AgKi8KKwlHUElPM19HUElPLAkvKiBQT09ETEVfR1BJT19TRF9QV1IgKi8KKwlHUElPMzNfR1BJTywJLyogUE9PRExFX0dQSU9fU0RfUFdSMSAqLworCisJR1BJTzIwX0dQSU8sCS8qIFBPT0RMRV9HUElPX1VTQl9QVUxMVVAgKi8KKwlHUElPMjJfR1BJTywJLyogUE9PRExFX0dQSU9fSVJfT04gKi8KK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcG9vZGxlX3Njb29wX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CQk9IDB4MTA4MDAwMDAsCkBAIC02Miw2ICsxNDgsNyBAQAogc3RhdGljIHN0cnVjdCBzY29vcF9jb25maWcgcG9vZGxlX3Njb29wX3NldHVwID0gewogCS5pb19kaXIJCT0gUE9PRExFX1NDT09QX0lPX0RJUiwKIAkuaW9fb3V0CQk9IFBPT0RMRV9TQ09PUF9JT19PVVQsCisJLmdwaW9fYmFzZQk9IFBPT0RMRV9TQ09PUF9HUElPX0JBU0UsCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvb2RsZV9zY29vcF9kZXZpY2UgPSB7CkBAIC03NCwyNyArMTYxLDYgQEAKIAkucmVzb3VyY2UJPSBwb29kbGVfc2Nvb3BfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIHZvaWQgcG9vZGxlX3BjbWNpYV9pbml0KHZvaWQpCi17Ci0JLyogU2V0dXAgZGVmYXVsdCBzdGF0ZSBvZiBHUElPIG91dHB1dHMKLQkgICBiZWZvcmUgd2UgZW5hYmxlIHRoZW0gYXMgb3V0cHV0cy4gKi8KLQlHUFNSKEdQSU80OF9uUE9FKSA9IEdQSU9fYml0KEdQSU80OF9uUE9FKSB8Ci0JCUdQSU9fYml0KEdQSU80OV9uUFdFKSB8IEdQSU9fYml0KEdQSU81MF9uUElPUikgfAotCQlHUElPX2JpdChHUElPNTFfblBJT1cpIHwgR1BJT19iaXQoR1BJTzUyX25QQ0VfMSkgfAotCQlHUElPX2JpdChHUElPNTNfblBDRV8yKTsKLQotCXB4YV9ncGlvX21vZGUoR1BJTzQ4X25QT0VfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzQ5X25QV0VfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzUwX25QSU9SX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81MV9uUElPV19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTVfblBSRUdfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU2X25QV0FJVF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTdfbklPSVMxNl9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTJfblBDRV8xX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81M19uUENFXzJfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU0X3BTS1RTRUxfTUQpOwotfQotCiBzdGF0aWMgc3RydWN0IHNjb29wX3BjbWNpYV9kZXYgcG9vZGxlX3BjbWNpYV9zY29vcFtdID0gewogewogCS5kZXYgICAgICAgID0gJnBvb2RsZV9zY29vcF9kZXZpY2UuZGV2LApAQCAtMTA3LDcgKzE3Myw2IEBACiBzdGF0aWMgc3RydWN0IHNjb29wX3BjbWNpYV9jb25maWcgcG9vZGxlX3BjbWNpYV9jb25maWcgPSB7CiAJLmRldnMgICAgICAgICA9ICZwb29kbGVfcGNtY2lhX3Njb29wWzBdLAogCS5udW1fZGV2cyAgICAgPSAxLAotCS5wY21jaWFfaW5pdCAgPSBwb29kbGVfcGNtY2lhX2luaXQsCiB9OwogCiBFWFBPUlRfU1lNQk9MKHBvb2RsZV9zY29vcF9kZXZpY2UpOwpAQCAtMTM2LDYyICsyMDEsNTUgQEAKIAogRVhQT1JUX1NZTUJPTChwb29kbGVfbG9jb21vX2RldmljZSk7CiAKLS8qCi0gKiBQb29kbGUgU1NQIERldmljZQotICovCi0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG9vZGxlX3NzcF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImNvcmdpLXNzcCIsCi0JLmlkCQk9IC0xLAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFhfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBwb29kbGVfc3BpX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0CT0gMSwKIH07CiAKLXN0cnVjdCBjb3JnaXNzcF9tYWNoaW5mbyBwb29kbGVfc3NwX21hY2hpbmZvID0gewotCS5wb3J0CQk9IDEsCi0JLmNzX2xjZGNvbgk9IC0xLAotCS5jc19hZHM3ODQ2CT0gLTEsCi0JLmNzX21heDExMTEJPSAtMSwKLQkuY2xrX2xjZGNvbgk9IDIsCi0JLmNsa19hZHM3ODQ2CT0gMzYsCi0JLmNsa19tYXgxMTExCT0gMiwKK3N0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIHBvb2RsZV9hZHM3ODQ2X2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODQ2LAorCS52cmVmX2RlbGF5X3VzZWNzCT0gMTAwLAorCS54X3BsYXRlX29obXMJCT0gNDE5LAorCS55X3BsYXRlX29obXMJCT0gNDg2LAorCS5ncGlvX3BlbmRvd24JCT0gUE9PRExFX0dQSU9fVFBfSU5ULAogfTsKIAorc3RhdGljIHZvaWQgYWRzNzg0Nl9jcyh1MzIgY29tbWFuZCkKK3sKKwlncGlvX3NldF92YWx1ZShQT09ETEVfR1BJT19UUF9DUywgIShjb21tYW5kID09IFBYQTJYWF9DU19BU1NFUlQpKTsKK30KIAotLyoKLSAqIFBvb2RsZSBUb3VjaCBTY3JlZW4gRGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcG9vZGxldHNfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUE9PRExFX0lSUV9HUElPX1RQX0lOVCwKLQkJLmVuZAkJPSBQT09ETEVfSVJRX0dQSU9fVFBfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCBwb29kbGVfYWRzNzg0Nl9jaGlwID0geworCS5jc19jb250cm9sCQk9IGFkczc4NDZfY3MsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHBvb2RsZV9zcGlfZGV2aWNlc1tdID0geworCXsKKwkJLm1vZGFsaWFzCT0gImFkczc4NDYiLAorCQkubWF4X3NwZWVkX2h6CT0gMTAwMDAsCisJCS5idXNfbnVtCT0gMSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcG9vZGxlX2Fkczc4NDZfaW5mbywKKwkJLmNvbnRyb2xsZXJfZGF0YT0gJnBvb2RsZV9hZHM3ODQ2X2NoaXAsCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoUE9PRExFX0dQSU9fVFBfSU5UKSwKIAl9LAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9vZGxlX2dldF9oc3luY19pbnZwZXJpb2Qodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBwb29kbGVfaW5pdF9zcGkodm9pZCkKIHsKLQlyZXR1cm4gMDsKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX1RQX0NTLCAiQURTNzg0Nl9DUyIpOworCWlmIChlcnIpCisJCXJldHVybjsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChQT09ETEVfR1BJT19UUF9DUywgMSk7CisKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDEsICZwb29kbGVfc3BpX2luZm8pOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKEFSUkFZX0FORF9TSVpFKHBvb2RsZV9zcGlfZGV2aWNlcykpOwogfQotCi1zdGF0aWMgdm9pZCBwb29kbGVfbnVsbF9oc3luYyh2b2lkKQotewotfQotCi1zdGF0aWMgc3RydWN0IGNvcmdpdHNfbWFjaGluZm8gIHBvb2RsZV90c19tYWNoaW5mbyA9IHsKLQkuZ2V0X2hzeW5jX2ludnBlcmlvZAk9IHBvb2RsZV9nZXRfaHN5bmNfaW52cGVyaW9kLAotCS5wdXRfaHN5bmMgICAgICAgCT0gcG9vZGxlX251bGxfaHN5bmMsCi0JLndhaXRfaHN5bmMgICAgICAJPSBwb29kbGVfbnVsbF9oc3luYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvb2RsZV90c19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImNvcmdpLXRzIiwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmcG9vZGxlX3RzX21hY2hpbmZvLAotCX0sCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwb29kbGV0c19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHBvb2RsZXRzX3Jlc291cmNlcywKLX07Ci0KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcG9vZGxlX2luaXRfc3BpKHZvaWQpIHt9CisjZW5kaWYKIAogLyoKICAqIE1NQy9TRCBEZXZpY2UKQEAgLTIwNSwyMiArMjYzLDUwIEBACiB7CiAJaW50IGVycjsKIAotCS8qIHNldHVwIEdQSU8gZm9yIFBYQTI1eCBNTUMgY29udHJvbGxlcgkqLwotCXB4YV9ncGlvX21vZGUoR1BJTzZfTU1DQ0xLX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU84X01NQ0NTMF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShQT09ETEVfR1BJT19uU0RfREVURUNUIHwgR1BJT19JTik7Ci0JcHhhX2dwaW9fbW9kZShQT09ETEVfR1BJT19uU0RfV1AgfCBHUElPX0lOKTsKLQlweGFfZ3Bpb19tb2RlKFBPT0RMRV9HUElPX1NEX1BXUiB8IEdQSU9fT1VUKTsKLQlweGFfZ3Bpb19tb2RlKFBPT0RMRV9HUElPX1NEX1BXUjEgfCBHUElPX09VVCk7CisJZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX25TRF9ERVRFQ1QsICJuU0RfREVURUNUIik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0OworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX25TRF9XUCwgIm5TRF9XUCIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfMTsKKworCWVyciA9IGdwaW9fcmVxdWVzdChQT09ETEVfR1BJT19TRF9QV1IsICJTRF9QV1IiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzI7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoUE9PRExFX0dQSU9fU0RfUFdSMSwgIlNEX1BXUjEiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzM7CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChQT09ETEVfR1BJT19uU0RfREVURUNUKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChQT09ETEVfR1BJT19uU0RfV1ApOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFBPT0RMRV9HUElPX1NEX1BXUiwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFBPT0RMRV9HUElPX1NEX1BXUjEsIDApOwogCiAJcG9vZGxlX21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKFBPT0RMRV9JUlFfR1BJT19uU0RfREVURUNULCBwb29kbGVfZGV0ZWN0X2ludCwKIAkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKIAkJCSAgIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOwotCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiAicG9vZGxlX21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2ZyZWVfNDsKKwl9CiAKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfNDoKKwlncGlvX2ZyZWUoUE9PRExFX0dQSU9fU0RfUFdSMSk7CitlcnJfZnJlZV8zOgorCWdwaW9fZnJlZShQT09ETEVfR1BJT19TRF9QV1IpOworZXJyX2ZyZWVfMjoKKwlncGlvX2ZyZWUoUE9PRExFX0dQSU9fblNEX1dQKTsKK2Vycl9mcmVlXzE6CisJZ3Bpb19mcmVlKFBPT0RMRV9HUElPX25TRF9ERVRFQ1QpOworZXJyX291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMjgsMTggKzMxNCwxOSBAQAogewogCXN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSogcF9kID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKCggMSA8PCB2ZGQpICYgcF9kLT5vY3JfbWFzaykgewotCQlHUFNSKFBPT0RMRV9HUElPX1NEX1BXUikgPSBHUElPX2JpdChQT09ETEVfR1BJT19TRF9QV1IpOworCWlmICgoMSA8PCB2ZGQpICYgcF9kLT5vY3JfbWFzaykgeworCQlncGlvX3NldF92YWx1ZShQT09ETEVfR1BJT19TRF9QV1IsIDEpOwogCQltZGVsYXkoMik7Ci0JCUdQU1IoUE9PRExFX0dQSU9fU0RfUFdSMSkgPSBHUElPX2JpdChQT09ETEVfR1BJT19TRF9QV1IxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUE9PRExFX0dQSU9fU0RfUFdSMSwgMSk7CiAJfSBlbHNlIHsKLQkJR1BDUihQT09ETEVfR1BJT19TRF9QV1IxKSA9IEdQSU9fYml0KFBPT0RMRV9HUElPX1NEX1BXUjEpOwotCQlHUENSKFBPT0RMRV9HUElPX1NEX1BXUikgPSBHUElPX2JpdChQT09ETEVfR1BJT19TRF9QV1IpOworCQlncGlvX3NldF92YWx1ZShQT09ETEVfR1BJT19TRF9QV1IxLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUE9PRExFX0dQSU9fU0RfUFdSLCAwKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgcG9vZGxlX21jaV9nZXRfcm8oc3RydWN0IGRldmljZSAqZGV2KQogeworCXJldHVybiAhIWdwaW9fZ2V0X3ZhbHVlKFBPT0RMRV9HUElPX25TRF9XUCk7CiAJcmV0dXJuIEdQTFIoUE9PRExFX0dQSU9fblNEX1dQKSAmIEdQSU9fYml0KFBPT0RMRV9HUElPX25TRF9XUCk7CiB9CiAKQEAgLTI0Nyw2ICszMzQsMTAgQEAKIHN0YXRpYyB2b2lkIHBvb2RsZV9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJZnJlZV9pcnEoUE9PRExFX0lSUV9HUElPX25TRF9ERVRFQ1QsIGRhdGEpOworCWdwaW9fZnJlZShQT09ETEVfR1BJT19TRF9QV1IxKTsKKwlncGlvX2ZyZWUoUE9PRExFX0dQSU9fU0RfUFdSKTsKKwlncGlvX2ZyZWUoUE9PRExFX0dQSU9fblNEX1dQKTsKKwlncGlvX2ZyZWUoUE9PRExFX0dQSU9fblNEX0RFVEVDVCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhbWNpX3BsYXRmb3JtX2RhdGEgcG9vZGxlX21jaV9wbGF0Zm9ybV9kYXRhID0gewpAQCAtMjYzLDM4ICszNTQsNDEgQEAKICAqLwogc3RhdGljIHZvaWQgcG9vZGxlX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQogewotCWlmIChtb2RlICYgSVJfT0ZGKSB7Ci0JCUdQU1IoUE9PRExFX0dQSU9fSVJfT04pID0gR1BJT19iaXQoUE9PRExFX0dQSU9fSVJfT04pOwotCX0gZWxzZSB7Ci0JCUdQQ1IoUE9PRExFX0dQSU9fSVJfT04pID0gR1BJT19iaXQoUE9PRExFX0dQSU9fSVJfT04pOwotCX0KKwlncGlvX3NldF92YWx1ZShQT09ETEVfR1BJT19JUl9PTiwgbW9kZSAmIElSX09GRik7CiAJcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKIH0KIAorc3RhdGljIGludCBwb29kbGVfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0KFBPT0RMRV9HUElPX0lSX09OLCAiSVJfT04iKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFBPT0RMRV9HUElPX0lSX09OLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG9vZGxlX2lyZGFfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWdwaW9fZnJlZShQT09ETEVfR1BJT19JUl9PTik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcHhhZmljcF9wbGF0Zm9ybV9kYXRhIHBvb2RsZV9maWNwX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnRyYW5zY2VpdmVyX2NhcCAgPSBJUl9TSVJNT0RFIHwgSVJfT0ZGLAotCS50cmFuc2NlaXZlcl9tb2RlID0gcG9vZGxlX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IHBvb2RsZV9pcmRhX3RyYW5zY2VpdmVyX21vZGUsCisJLnN0YXJ0dXAJCT0gcG9vZGxlX2lyZGFfc3RhcnR1cCwKKwkuc2h1dGRvd24JCT0gcG9vZGxlX2lyZGFfc2h1dGRvd24sCiB9OwogCiAKIC8qCiAgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKICAqLwotc3RhdGljIHZvaWQgcG9vZGxlX3VkY19jb21tYW5kKGludCBjbWQpCi17Ci0Jc3dpdGNoKGNtZCkJewotCWNhc2UgUFhBMlhYX1VEQ19DTURfQ09OTkVDVDoKLQkJR1BTUihQT09ETEVfR1BJT19VU0JfUFVMTFVQKSA9IEdQSU9fYml0KFBPT0RMRV9HUElPX1VTQl9QVUxMVVApOwotCQlicmVhazsKLQljYXNlIFBYQTJYWF9VRENfQ01EX0RJU0NPTk5FQ1Q6Ci0JCUdQQ1IoUE9PRExFX0dQSU9fVVNCX1BVTExVUCkgPSBHUElPX2JpdChQT09ETEVfR1BJT19VU0JfUFVMTFVQKTsKLQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIHVkY19pbmZvIF9faW5pdGRhdGEgPSB7CiAJLyogbm8gY29ubmVjdCBHUElPOyBwb29kbGUgY2FuJ3QgdGVsbCBjb25uZWN0aW9uIHN0YXR1cyAqLwotCS51ZGNfY29tbWFuZAkJPSBwb29kbGVfdWRjX2NvbW1hbmQsCisJLmdwaW9fcHVsbHVwCT0gUE9PRExFX0dQSU9fVVNCX1BVTExVUCwKIH07CiAKIApAQCAtMzE2LDE1ICs0MTAsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIHBvb2RsZV9mYl9pbmZvID0gewogCS5tb2RlcwkJPSAmcG9vZGxlX2ZiX21vZGUsCiAJLm51bV9tb2Rlcwk9IDEsCi0JLmxjY3IwCQk9IExDQ1IwX0FjdCB8IExDQ1IwX1NuZ2wgfCBMQ0NSMF9Db2xvciwKLQkubGNjcjMJCT0gMCwKKwkubGNkX2Nvbm4JPSBMQ0RfQ09MT1JfVEZUXzE2QlBQLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZwb29kbGVfbG9jb21vX2RldmljZSwKIAkmcG9vZGxlX3Njb29wX2RldmljZSwKLQkmcG9vZGxlX3NzcF9kZXZpY2UsCi0JJnBvb2RsZV90c19kZXZpY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBwb29kbGVfcG93ZXJvZmYodm9pZCkKQEAgLTM0NCw1OSArNDM1LDIzIEBACiAJcG1fcG93ZXJfb2ZmID0gcG9vZGxlX3Bvd2Vyb2ZmOwogCWFybV9wbV9yZXN0YXJ0ID0gcG9vZGxlX3Jlc3RhcnQ7CiAKLQkvKiBzZXR1cCBzbGVlcCBtb2RlIHZhbHVlcyAqLwotCVBXRVIgID0gMHgwMDAwMDAwMjsKLQlQRkVSICA9IDB4MDAwMDAwMDA7Ci0JUFJFUiAgPSAweDAwMDAwMDAyOwotCVBHU1IwID0gMHgwMDAwODAwMDsKLQlQR1NSMSA9IDB4MDAzRjAyMDI7Ci0JUEdTUjIgPSAweDAwMDFDMDAwOwogCVBDRlIgfD0gUENGUl9PUERFOwogCi0JLyogY3B1IGluaXRpYWxpemUgKi8KLQkvKiBQZ3NyIFJlZ2lzdGVyICovCi0gIAlQR1NSMCA9IDB4MDE0NmRkODA7Ci0gIAlQR1NSMSA9IDB4MDNiZjA4OTA7Ci0gIAlQR1NSMiA9IDB4MDAwMWMwMDA7Ci0KLQkvKiBBbHRlcm5hdGUgUmVnaXN0ZXIgKi8KLSAgCUdBRlIwX0wgPSAweDAxMDAxMDAwOwotICAJR0FGUjBfVSA9IDB4NTkxYTgwMTA7Ci0gIAlHQUZSMV9MID0gMHg5MDBhODQ1MTsKLSAgCUdBRlIxX1UgPSAweGFhYTVhYWFhOwotICAJR0FGUjJfTCA9IDB4OGFhYWFhYWE7Ci0gIAlHQUZSMl9VID0gMHgwMDAwMDAwMjsKLQotCS8qIERpcmVjdGlvbiBSZWdpc3RlciAqLwotICAJR1BEUjAgPSAweGQzZjA5MDRjOwotICAJR1BEUjEgPSAweGZjZmZiN2QzOwotICAJR1BEUjIgPSAweDAwMDFmZmZmOwotCi0JLyogT3V0cHV0IFJlZ2lzdGVyICovCi0gIAlHUENSMCA9IDB4MDAwMDAwMDA7Ci0gIAlHUENSMSA9IDB4MDAwMDAwMDA7Ci0gIAlHUENSMiA9IDB4MDAwMDAwMDA7Ci0KLSAgCUdQU1IwID0gMHgwMDQwMDAwMDsKLSAgCUdQU1IxID0gMHgwMDAwMDAwMDsKLSAgICAgICAgR1BTUjIgPSAweDAwMDAwMDAwOwotCi0Jc2V0X3B4YV9mYl9wYXJlbnQoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldik7Ci0Jc2V0X3B4YV9mYl9pbmZvKCZwb29kbGVfZmJfaW5mbyk7Ci0JcHhhX2dwaW9fbW9kZShQT09ETEVfR1BJT19VU0JfUFVMTFVQIHwgR1BJT19PVVQpOwotCXB4YV9ncGlvX21vZGUoUE9PRExFX0dQSU9fSVJfT04gfCBHUElPX09VVCk7Ci0JcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOwotCXB4YV9zZXRfbWNpX2luZm8oJnBvb2RsZV9tY2lfcGxhdGZvcm1fZGF0YSk7Ci0JcHhhX3NldF9maWNwX2luZm8oJnBvb2RsZV9maWNwX3BsYXRmb3JtX2RhdGEpOwotCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUocG9vZGxlX3Bpbl9jb25maWcpKTsKIAogCXBsYXRmb3JtX3Njb29wX2NvbmZpZyA9ICZwb29kbGVfcGNtY2lhX2NvbmZpZzsKIAogCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG9vZGxlOiBVbmFibGUgdG8gcmVnaXN0ZXIgTG9Db01vIGRldmljZVxuIik7Ci0JfQotCWNvcmdpX3NzcF9zZXRfbWFjaGluZm8oJnBvb2RsZV9zc3BfbWFjaGluZm8pOworCWlmIChyZXQpCisJCXByX3dhcm5pbmcoInBvb2RsZTogVW5hYmxlIHRvIHJlZ2lzdGVyIExvQ29NbyBkZXZpY2VcbiIpOworCisJc2V0X3B4YV9mYl9wYXJlbnQoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldik7CisJc2V0X3B4YV9mYl9pbmZvKCZwb29kbGVfZmJfaW5mbyk7CisJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOworCXB4YV9zZXRfbWNpX2luZm8oJnBvb2RsZV9tY2lfcGxhdGZvcm1fZGF0YSk7CisJcHhhX3NldF9maWNwX2luZm8oJnBvb2RsZV9maWNwX3BsYXRmb3JtX2RhdGEpOworCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisJcG9vZGxlX2luaXRfc3BpKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBmaXh1cF9wb29kbGUoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKaW5kZXggMzA1NDUyYi4uMjVkMTdhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKQEAgLTM2LDYgKzM2LDEyIEBACiAjaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKK2ludCBjcHVfaXNfcHhhMjZ4KHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc19weGEyNTAoKSAmJiAoKEJPT1RfREVGICYgMHg4KSA9PSAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9pc19weGEyNngpOworCiAvKgogICogVmFyaW91cyBjbG9jayBmYWN0b3JzIGRyaXZlbiBieSB0aGUgQ0NDUiByZWdpc3Rlci4KICAqLwpAQCAtMjAzLDQ4ICsyMDksMjEgQEAKICAqIE1vcmUgb25lcyBsaWtlIENQIGFuZCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQKICAqIHdpdGggdGhlIHN0YWNrIHBvaW50ZXIgaW4gc2xlZXAuUy4KICAqLwotZW51bSB7CVNMRUVQX1NBVkVfUEdTUjAsIFNMRUVQX1NBVkVfUEdTUjEsIFNMRUVQX1NBVkVfUEdTUjIsCi0KLQlTTEVFUF9TQVZFX0dBRlIwX0wsIFNMRUVQX1NBVkVfR0FGUjBfVSwKLQlTTEVFUF9TQVZFX0dBRlIxX0wsIFNMRUVQX1NBVkVfR0FGUjFfVSwKLQlTTEVFUF9TQVZFX0dBRlIyX0wsIFNMRUVQX1NBVkVfR0FGUjJfVSwKLQorZW51bSB7CiAJU0xFRVBfU0FWRV9QU1RSLAotCiAJU0xFRVBfU0FWRV9DS0VOLAotCiAJU0xFRVBfU0FWRV9DT1VOVAogfTsKIAogCiBzdGF0aWMgdm9pZCBweGEyNXhfY3B1X3BtX3NhdmUodW5zaWduZWQgbG9uZyAqc2xlZXBfc2F2ZSkKIHsKLQlTQVZFKFBHU1IwKTsgU0FWRShQR1NSMSk7IFNBVkUoUEdTUjIpOwotCi0JU0FWRShHQUZSMF9MKTsgU0FWRShHQUZSMF9VKTsKLQlTQVZFKEdBRlIxX0wpOyBTQVZFKEdBRlIxX1UpOwotCVNBVkUoR0FGUjJfTCk7IFNBVkUoR0FGUjJfVSk7Ci0KIAlTQVZFKENLRU4pOwogCVNBVkUoUFNUUik7Ci0KLQkvKiBDbGVhciBHUElPIHRyYW5zaXRpb24gZGV0ZWN0IGJpdHMgKi8KLQlHRURSMCA9IEdFRFIwOyBHRURSMSA9IEdFRFIxOyBHRURSMiA9IEdFRFIyOwogfQogCiBzdGF0aWMgdm9pZCBweGEyNXhfY3B1X3BtX3Jlc3RvcmUodW5zaWduZWQgbG9uZyAqc2xlZXBfc2F2ZSkKIHsKLQkvKiBlbnN1cmUgbm90IHRvIGNvbWUgYmFjayBoZXJlIGlmIGl0IHdhc24ndCBpbnRlbmRlZCAqLwotCVBTUFIgPSAwOwotCi0JLyogcmVzdG9yZSByZWdpc3RlcnMgKi8KLQlSRVNUT1JFKEdBRlIwX0wpOyBSRVNUT1JFKEdBRlIwX1UpOwotCVJFU1RPUkUoR0FGUjFfTCk7IFJFU1RPUkUoR0FGUjFfVSk7Ci0JUkVTVE9SRShHQUZSMl9MKTsgUkVTVE9SRShHQUZSMl9VKTsKLQlSRVNUT1JFKFBHU1IwKTsgUkVTVE9SRShQR1NSMSk7IFJFU1RPUkUoUEdTUjIpOwotCi0JUFNTUiA9IFBTU1JfUkRIIHwgUFNTUl9QSDsKLQogCVJFU1RPUkUoQ0tFTik7CiAJUkVTVE9SRShQU1RSKTsKIH0KQEAgLTI1NiwxOSArMjM1LDMyIEBACiAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBQTV9TVVNQRU5EX01FTToKLQkJLyogc2V0IHJlc3VtZSByZXR1cm4gYWRkcmVzcyAqLwotCQlQU1BSID0gdmlydF90b19waHlzKHB4YV9jcHVfcmVzdW1lKTsKIAkJcHhhMjV4X2NwdV9zdXNwZW5kKFBXUk1PREVfU0xFRVApOwogCQlicmVhazsKIAl9CiB9CiAKK3N0YXRpYyBpbnQgcHhhMjV4X2NwdV9wbV9wcmVwYXJlKHZvaWQpCit7CisJLyogc2V0IHJlc3VtZSByZXR1cm4gYWRkcmVzcyAqLworCVBTUFIgPSB2aXJ0X3RvX3BoeXMocHhhX2NwdV9yZXN1bWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGEyNXhfY3B1X3BtX2ZpbmlzaCh2b2lkKQoreworCS8qIGVuc3VyZSBub3QgdG8gY29tZSBiYWNrIGhlcmUgaWYgaXQgd2Fzbid0IGludGVuZGVkICovCisJUFNQUiA9IDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcHhhX2NwdV9wbV9mbnMgcHhhMjV4X2NwdV9wbV9mbnMgPSB7CiAJLnNhdmVfY291bnQJPSBTTEVFUF9TQVZFX0NPVU5ULAogCS52YWxpZAkJPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogCS5zYXZlCQk9IHB4YTI1eF9jcHVfcG1fc2F2ZSwKIAkucmVzdG9yZQk9IHB4YTI1eF9jcHVfcG1fcmVzdG9yZSwKIAkuZW50ZXIJCT0gcHhhMjV4X2NwdV9wbV9lbnRlciwKKwkucHJlcGFyZQk9IHB4YTI1eF9jcHVfcG1fcHJlcGFyZSwKKwkuZmluaXNoCQk9IHB4YTI1eF9jcHVfcG1fZmluaXNoLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IHB4YTI1eF9pbml0X3BtKHZvaWQpCkBAIC0zMzAsNiArMzIyLDggQEAKIAl7CiAJCS5jbHMJPSAmcHhhX2lycV9zeXNjbGFzcywKIAl9LCB7CisJCS5jbHMJPSAmcHhhMnh4X21mcF9zeXNjbGFzcywKKwl9LCB7CiAJCS5jbHMJPSAmcHhhX2dwaW9fc3lzY2xhc3MsCiAJfSwKIH07CkBAIC0zMzgsMTEgKzMzMiw3IEBACiB7CiAJaW50IGksIHJldCA9IDA7CiAKLQkvKiBPbmx5IGFkZCBIV1VBUlQgZm9yIFBYQTI1NS8yNng7IFBYQTIxMC8yNTAvMjd4IGRvIG5vdCBoYXZlIGl0LiAqLwotCWlmIChjcHVfaXNfcHhhMjU1KCkpCi0JCWNsa3NfcmVnaXN0ZXIoJnB4YTI1eF9od3VhcnRfY2xrLCAxKTsKLQotCWlmIChjcHVfaXNfcHhhMjF4KCkgfHwgY3B1X2lzX3B4YTI1eCgpKSB7CisJaWYgKGNwdV9pc19weGEyNXgoKSkgewogCiAJCXJlc2V0X3N0YXR1cyA9IFJDU1I7CiAKQEAgLTM2NSw5ICszNTUsMTEgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JLyogT25seSBhZGQgSFdVQVJUIGZvciBQWEEyNTUvMjZ4OyBQWEEyMTAvMjUwLzI3eCBkbyBub3QgaGF2ZSBpdC4gKi8KLQlpZiAoY3B1X2lzX3B4YTI1NSgpKQorCS8qIE9ubHkgYWRkIEhXVUFSVCBmb3IgUFhBMjU1LzI2eDsgUFhBMjEwLzI1MCBkbyBub3QgaGF2ZSBpdC4gKi8KKwlpZiAoY3B1X2lzX3B4YTI1NSgpIHx8IGNwdV9pc19weGEyNngoKSkgeworCQljbGtzX3JlZ2lzdGVyKCZweGEyNXhfaHd1YXJ0X2NsaywgMSk7CiAJCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcHhhX2RldmljZV9od3VhcnQpOworCX0KIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCmluZGV4IGY5ZjZhOWMuLjNlNGFiMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCkBAIC0zNCw2ICszNCwxMyBAQAogI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCit2b2lkIHB4YTI3eF9jbGVhcl9vdGdwaCh2b2lkKQoreworCWlmIChjcHVfaXNfcHhhMjd4KCkgJiYgKFBTU1IgJiBQU1NSX09UR1BIKSkKKwkJUFNTUiB8PSBQU1NSX09UR1BIOworfQorRVhQT1JUX1NZTUJPTChweGEyN3hfY2xlYXJfb3RncGgpOworCiAvKiBDcnlzdGFsIGNsb2NrOiAxM01IeiAqLwogI2RlZmluZSBCQVNFX0NMSwkxMzAwMDAwMAogCkBAIC0xODMsMzYgKzE5MCwxOCBAQAogICogTW9yZSBvbmVzIGxpa2UgQ1AgYW5kIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB2YWx1ZXMgYXJlIHByZXNlcnZlZAogICogd2l0aCB0aGUgc3RhY2sgcG9pbnRlciBpbiBzbGVlcC5TLgogICovCi1lbnVtIHsJU0xFRVBfU0FWRV9QR1NSMCwgU0xFRVBfU0FWRV9QR1NSMSwgU0xFRVBfU0FWRV9QR1NSMiwgU0xFRVBfU0FWRV9QR1NSMywKLQotCVNMRUVQX1NBVkVfR0FGUjBfTCwgU0xFRVBfU0FWRV9HQUZSMF9VLAotCVNMRUVQX1NBVkVfR0FGUjFfTCwgU0xFRVBfU0FWRV9HQUZSMV9VLAotCVNMRUVQX1NBVkVfR0FGUjJfTCwgU0xFRVBfU0FWRV9HQUZSMl9VLAotCVNMRUVQX1NBVkVfR0FGUjNfTCwgU0xFRVBfU0FWRV9HQUZSM19VLAotCitlbnVtIHsKIAlTTEVFUF9TQVZFX1BTVFIsCi0KIAlTTEVFUF9TQVZFX0NLRU4sCi0KIAlTTEVFUF9TQVZFX01EUkVGUiwKLQlTTEVFUF9TQVZFX1BXRVIsIFNMRUVQX1NBVkVfUENGUiwgU0xFRVBfU0FWRV9QUkVSLAotCVNMRUVQX1NBVkVfUEZFUiwgU0xFRVBfU0FWRV9QS1dSLAotCisJU0xFRVBfU0FWRV9QQ0ZSLAogCVNMRUVQX1NBVkVfQ09VTlQKIH07CiAKIHZvaWQgcHhhMjd4X2NwdV9wbV9zYXZlKHVuc2lnbmVkIGxvbmcgKnNsZWVwX3NhdmUpCiB7Ci0JU0FWRShQR1NSMCk7IFNBVkUoUEdTUjEpOyBTQVZFKFBHU1IyKTsgU0FWRShQR1NSMyk7Ci0KLQlTQVZFKEdBRlIwX0wpOyBTQVZFKEdBRlIwX1UpOwotCVNBVkUoR0FGUjFfTCk7IFNBVkUoR0FGUjFfVSk7Ci0JU0FWRShHQUZSMl9MKTsgU0FWRShHQUZSMl9VKTsKLQlTQVZFKEdBRlIzX0wpOyBTQVZFKEdBRlIzX1UpOwotCiAJU0FWRShNRFJFRlIpOwotCVNBVkUoUFdFUik7IFNBVkUoUENGUik7IFNBVkUoUFJFUik7Ci0JU0FWRShQRkVSKTsgU0FWRShQS1dSKTsKKwlTQVZFKFBDRlIpOwogCiAJU0FWRShDS0VOKTsKIAlTQVZFKFBTVFIpOwpAQCAtMjIwLDI0ICsyMDksMTIgQEAKIAogdm9pZCBweGEyN3hfY3B1X3BtX3Jlc3RvcmUodW5zaWduZWQgbG9uZyAqc2xlZXBfc2F2ZSkKIHsKLQkvKiBlbnN1cmUgbm90IHRvIGNvbWUgYmFjayBoZXJlIGlmIGl0IHdhc24ndCBpbnRlbmRlZCAqLwotCVBTUFIgPSAwOwotCi0JLyogcmVzdG9yZSByZWdpc3RlcnMgKi8KLQlSRVNUT1JFKEdBRlIwX0wpOyBSRVNUT1JFKEdBRlIwX1UpOwotCVJFU1RPUkUoR0FGUjFfTCk7IFJFU1RPUkUoR0FGUjFfVSk7Ci0JUkVTVE9SRShHQUZSMl9MKTsgUkVTVE9SRShHQUZSMl9VKTsKLQlSRVNUT1JFKEdBRlIzX0wpOyBSRVNUT1JFKEdBRlIzX1UpOwotCVJFU1RPUkUoUEdTUjApOyBSRVNUT1JFKFBHU1IxKTsgUkVTVE9SRShQR1NSMik7IFJFU1RPUkUoUEdTUjMpOwotCiAJUkVTVE9SRShNRFJFRlIpOwotCVJFU1RPUkUoUFdFUik7IFJFU1RPUkUoUENGUik7IFJFU1RPUkUoUFJFUik7Ci0JUkVTVE9SRShQRkVSKTsgUkVTVE9SRShQS1dSKTsKKwlSRVNUT1JFKFBDRlIpOwogCiAJUFNTUiA9IFBTU1JfUkRIIHwgUFNTUl9QSDsKIAogCVJFU1RPUkUoQ0tFTik7Ci0KIAlSRVNUT1JFKFBTVFIpOwogfQogCkBAIC0yNTksOCArMjM2LDYgQEAKIAkJcHhhX2NwdV9zdGFuZGJ5KCk7CiAJCWJyZWFrOwogCWNhc2UgUE1fU1VTUEVORF9NRU06Ci0JCS8qIHNldCByZXN1bWUgcmV0dXJuIGFkZHJlc3MgKi8KLQkJUFNQUiA9IHZpcnRfdG9fcGh5cyhweGFfY3B1X3Jlc3VtZSk7CiAJCXB4YTI3eF9jcHVfc3VzcGVuZChQV1JNT0RFX1NMRUVQKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjcxLDEyICsyNDYsMjcgQEAKIAlyZXR1cm4gc3RhdGUgPT0gUE1fU1VTUEVORF9NRU0gfHwgc3RhdGUgPT0gUE1fU1VTUEVORF9TVEFOREJZOwogfQogCitzdGF0aWMgaW50IHB4YTI3eF9jcHVfcG1fcHJlcGFyZSh2b2lkKQoreworCS8qIHNldCByZXN1bWUgcmV0dXJuIGFkZHJlc3MgKi8KKwlQU1BSID0gdmlydF90b19waHlzKHB4YV9jcHVfcmVzdW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhMjd4X2NwdV9wbV9maW5pc2godm9pZCkKK3sKKwkvKiBlbnN1cmUgbm90IHRvIGNvbWUgYmFjayBoZXJlIGlmIGl0IHdhc24ndCBpbnRlbmRlZCAqLworCVBTUFIgPSAwOworfQorCiBzdGF0aWMgc3RydWN0IHB4YV9jcHVfcG1fZm5zIHB4YTI3eF9jcHVfcG1fZm5zID0gewogCS5zYXZlX2NvdW50CT0gU0xFRVBfU0FWRV9DT1VOVCwKIAkuc2F2ZQkJPSBweGEyN3hfY3B1X3BtX3NhdmUsCiAJLnJlc3RvcmUJPSBweGEyN3hfY3B1X3BtX3Jlc3RvcmUsCiAJLnZhbGlkCQk9IHB4YTI3eF9jcHVfcG1fdmFsaWQsCiAJLmVudGVyCQk9IHB4YTI3eF9jcHVfcG1fZW50ZXIsCisJLnByZXBhcmUJPSBweGEyN3hfY3B1X3BtX3ByZXBhcmUsCisJLmZpbmlzaAkJPSBweGEyN3hfY3B1X3BtX2ZpbmlzaCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBweGEyN3hfaW5pdF9wbSh2b2lkKQpAQCAtMzQ5LDcgKzMzOSw3IEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGkyY19wb3dlcl9yZXNvdXJjZXMpLAogfTsKIAotdm9pZCBfX2luaXQgcHhhX3NldF9pMmNfcG93ZXJfaW5mbyhzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhICppbmZvKQordm9pZCBfX2luaXQgcHhhMjd4X3NldF9pMmNfcG93ZXJfaW5mbyhzdHJ1Y3QgaTJjX3B4YV9wbGF0Zm9ybV9kYXRhICppbmZvKQogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJUENGUiB8PSBQQ0ZSX1BJMkNFTjsKQEAgLTM3Niw2ICszNjYsOCBAQAogCXsKIAkJLmNscwk9ICZweGFfaXJxX3N5c2NsYXNzLAogCX0sIHsKKwkJLmNscwk9ICZweGEyeHhfbWZwX3N5c2NsYXNzLAorCX0sIHsKIAkJLmNscwk9ICZweGFfZ3Bpb19zeXNjbGFzcywKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhM3h4LmMKaW5kZXggMDNjYmMzODEuLmIzY2Q1ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCkBAIC0yMDMsNiArMjAzLDE5IEBACiAJLmRpc2FibGUJPSBjbGtfcG91dF9kaXNhYmxlLAogfTsKIAorc3RhdGljIHZvaWQgY2xrX2R1bW15X2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7Cit9CisKK3N0YXRpYyB2b2lkIGNsa19kdW1teV9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrX2R1bW15X29wcyA9IHsKKwkuZW5hYmxlCQk9IGNsa19kdW1teV9lbmFibGUsCisJLmRpc2FibGUJPSBjbGtfZHVtbXlfZGlzYWJsZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrIHB4YTN4eF9jbGtzW10gPSB7CiAJewogCQkubmFtZSAgICAgICAgICAgPSAiQ0xLX1BPVVQiLApAQCAtMjExLDYgKzIyNCwxMyBAQAogCQkuZGVsYXkgICAgICAgICAgPSA3MCwKIAl9LAogCisJLyogUG93ZXIgSTJDIGNsb2NrIGlzIGFsd2F5cyBvbiAqLworCXsKKwkJLm5hbWUJCT0gIkkyQ0NMSyIsCisJCS5vcHMJCT0gJmNsa19kdW1teV9vcHMsCisJCS5kZXYJCT0gJnB4YTN4eF9kZXZpY2VfaTJjX3Bvd2VyLmRldiwKKwl9LAorCiAJUFhBM3h4X0NLKCJMQ0RDTEsiLCAgTENELCAgICAmY2xrX3B4YTN4eF9oc2lvX29wcywgJnB4YV9kZXZpY2VfZmIuZGV2KSwKIAlQWEEzeHhfQ0soIkNBTUNMSyIsICBDQU1FUkEsICZjbGtfcHhhM3h4X2hzaW9fb3BzLCBOVUxMKSwKIAlQWEEzeHhfQ0soIkFDOTdDTEsiLCBBQzk3LCAgICZjbGtfcHhhM3h4X2FjOTdfb3BzLCBOVUxMKSwKQEAgLTUwOSw2ICs1MjksMzAgQEAKICAqIGRldmljZSByZWdpc3RyYXRpb24gc3BlY2lmaWMgdG8gUFhBM3h4LgogICovCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Bvd2VyX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ICA9IDB4NDBmNTAwYzAsCisJCS5lbmQgICAgPSAweDQwZjUwMGQzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IElSUV9QV1JJMkMsCisJCS5lbmQJPSBJUlFfUFdSSTJDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBweGEzeHhfZGV2aWNlX2kyY19wb3dlciA9IHsKKwkubmFtZQkJPSAicHhhMnh4LWkyYyIsCisJLmlkCQk9IDEsCisJLnJlc291cmNlCT0gaTJjX3Bvd2VyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaTJjX3Bvd2VyX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBweGEzeHhfc2V0X2kyY19wb3dlcl9pbmZvKHN0cnVjdCBpMmNfcHhhX3BsYXRmb3JtX2RhdGEgKmluZm8pCit7CisJcHhhM3h4X2RldmljZV9pMmNfcG93ZXIuZGV2LnBsYXRmb3JtX2RhdGEgPSBpbmZvOworfQorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAvKgkmcHhhX2RldmljZV91ZGMsCVRoZSBVREMgZHJpdmVyIGlzIFBYQTI1eCBvbmx5ICovCiAJJnB4YV9kZXZpY2VfZmZ1YXJ0LApAQCAtNTIyLDYgKzU2Niw3IEBACiAJJnB4YTN4eF9kZXZpY2Vfc3NwNCwKIAkmcHhhMjd4X2RldmljZV9wd20wLAogCSZweGEyN3hfZGV2aWNlX3B3bTEsCisJJnB4YTN4eF9kZXZpY2VfaTJjX3Bvd2VyLAogfTsKIAogc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHB4YTN4eF9zeXNkZXZbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Jlc2V0LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9yZXNldC5jCmluZGV4IDk5OTZjNjEuLjFiMmFmNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3Jlc2V0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcmVzZXQuYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgpAQCAtMjAsNyArMjAsNyBAQAogCiBzdGF0aWMgaW50IHJlc2V0X2dwaW8gPSAtMTsKIAotaW50IGluaXRfZ3Bpb19yZXNldChpbnQgZ3BpbykKK2ludCBpbml0X2dwaW9fcmVzZXQoaW50IGdwaW8sIGludCBvdXRwdXQpCiB7CiAJaW50IHJjOwogCkBAIC0zMCw5ICszMCwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCWlmIChvdXRwdXQpCisJCXJjID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDApOworCWVsc2UKKwkJcmMgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBjb25maWd1cmUgcmVzZXRfZ3BpbyBmb3IgaW5wdXRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGNvbmZpZ3VyZSByZXNldF9ncGlvXG4iKTsKIAkJZ3Bpb19mcmVlKGdwaW8pOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zaGFycHNsX3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zaGFycHNsX3BtLmMKaW5kZXggZTgwNGFlMC4uMTVjMmYxYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc2hhcnBzbF9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2xfcG0uYwpAQCAtMTE2LDI0ICsxMTYsMjAgQEAKIAl7ICAgMCwgICAwfSwKIH07CiAKLS8qIE1BWDExMTEgQ29tbWFuZHMgKi8KLSNkZWZpbmUgTUFYQ1RSTF9QRDAgICAgICAxdSA8PCAwCi0jZGVmaW5lIE1BWENUUkxfUEQxICAgICAgMXUgPDwgMQotI2RlZmluZSBNQVhDVFJMX1NHTCAgICAgIDF1IDw8IDIKLSNkZWZpbmUgTUFYQ1RSTF9VTkkgICAgICAxdSA8PCAzCi0jZGVmaW5lIE1BWENUUkxfU0VMX1NIICAgNAotI2RlZmluZSBNQVhDVFJMX1NUUiAgICAgIDF1IDw8IDcKLQogLyoKICAqIFJlYWQgTUFYMTExMSBBREMKICAqLworZXh0ZXJuIGludCBtYXgxMTExX3JlYWRfY2hhbm5lbChpbnQpOworCiBpbnQgc2hhcnBzbF9wbV9weGFfcmVhZF9tYXgxMTExKGludCBjaGFubmVsKQogewogCWlmIChtYWNoaW5lX2lzX3Rvc2EoKSkgLy8gVWdseSwgYmV0dGVyIG1vdmUgdGhpcyBmdW5jdGlvbiBpbnRvIGFub3RoZXIgbW9kdWxlCiAJICAgIHJldHVybiAwOwogCi0JcmV0dXJuIGNvcmdpX3NzcF9tYXgxMTExX2dldCgoY2hhbm5lbCA8PCBNQVhDVFJMX1NFTF9TSCkgfCBNQVhDVFJMX1BEMCB8IE1BWENUUkxfUEQxCi0JCQl8IE1BWENUUkxfU0dMIHwgTUFYQ1RSTF9VTkkgfCBNQVhDVFJMX1NUUik7CisJLyogbWF4MTExMSBhY2NlcHRzIGNoYW5uZWxzIGZyb20gMC0zLCBob3dldmVyLAorCSAqIGl0IGlzIGVuY29kZWQgZnJvbSAwLTcgaGVyZSBpbiB0aGUgY29kZS4KKwkgKi8KKwlyZXR1cm4gbWF4MTExMV9yZWFkX2NoYW5uZWwoY2hhbm5lbCA+PiAxKTsKIH0KIAogdm9pZCBzaGFycHNsX3BtX3B4YV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwppbmRleCBiNTY5ZjNiLi41MjRmNjU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKQEAgLTE5LDE2ICsxOSwyMyBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2E5NTN4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2NvcmdpX2xjZC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0zNyw3ICs0NCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL21mcC1weGEyN3guaD4KICNpbmNsdWRlIDxtYWNoL3B4YTI3eC11ZGMuaD4KICNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KQEAgLTQ2LDcgKzUzLDcgQEAKICNpbmNsdWRlIDxtYWNoL29oY2kuaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KLSNpbmNsdWRlIDxtYWNoL2FraXRhLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGl0ei5oPgogI2luY2x1ZGUgPG1hY2gvc2hhcnBzbC5oPgogCkBAIC01Nyw2ICs2NCw2NiBAQAogI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJzaGFycHNsLmgiCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNwaXR6X3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIENoaXAgU2VsZWN0cyAqLworCUdQSU83OF9uQ1NfMiwJLyogU0NPT1AgIzIgKi8KKwlHUElPODBfbkNTXzQsCS8qIFNDT09QICMxICovCisKKwkvKiBMQ0QgLSAxNmJwcCBBY3RpdmUgVEZUICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKworCS8qIFBDIENhcmQgKi8KKwlHUElPNDhfblBPRSwKKwlHUElPNDlfblBXRSwKKwlHUElPNTBfblBJT1IsCisJR1BJTzUxX25QSU9XLAorCUdQSU84NV9uUENFXzEsCisJR1BJTzU0X25QQ0VfMiwKKwlHUElPNzlfUFNLVFNFTCwKKwlHUElPNTVfblBSRUcsCisJR1BJTzU2X25QV0FJVCwKKwlHUElPNTdfbklPSVMxNiwKKworCS8qIE1NQyAqLworCUdQSU8zMl9NTUNfQ0xLLAorCUdQSU8xMTJfTU1DX0NNRCwKKwlHUElPOTJfTU1DX0RBVF8wLAorCUdQSU8xMDlfTU1DX0RBVF8xLAorCUdQSU8xMTBfTU1DX0RBVF8yLAorCUdQSU8xMTFfTU1DX0RBVF8zLAorCisJLyogR1BJT3MgKi8KKwlHUElPOV9HUElPLAkvKiBTUElUWl9HUElPX25TRF9ERVRFQ1QgKi8KKwlHUElPODFfR1BJTywJLyogU1BJVFpfR1BJT19uU0RfV1AgKi8KKwlHUElPNDFfR1BJTywJLyogU1BJVFpfR1BJT19VU0JfQ09OTkVDVCAqLworCUdQSU8zN19HUElPLAkvKiBTUElUWl9HUElPX1VTQl9IT1NUICovCisJR1BJTzM1X0dQSU8sCS8qIFNQSVRaX0dQSU9fVVNCX0RFVklDRSAqLworCUdQSU8yMl9HUElPLAkvKiBTUElUWl9HUElPX0hTWU5DICovCisJR1BJTzk0X0dQSU8sCS8qIFNQSVRaX0dQSU9fQ0ZfQ0QgKi8KKwlHUElPMTA1X0dQSU8sCS8qIFNQSVRaX0dQSU9fQ0ZfSVJRICovCisJR1BJTzEwNl9HUElPLAkvKiBTUElUWl9HUElPX0NGMl9JUlEgKi8KKworCUdQSU8xX0dQSU8gfCBXQUtFVVBfT05fRURHRV9SSVNFLAorfTsKKwogLyoKICAqIFNwaXR6IFNDT09QIERldmljZSAjMQogICovCkBAIC02OSwxMCArMTM2LDExIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNjb29wX2NvbmZpZyBzcGl0el9zY29vcF9zZXR1cCA9IHsKLQkuaW9fZGlyIAk9IFNQSVRaX1NDUF9JT19ESVIsCisJLmlvX2RpcgkJPSBTUElUWl9TQ1BfSU9fRElSLAogCS5pb19vdXQJCT0gU1BJVFpfU0NQX0lPX09VVCwKLQkuc3VzcGVuZF9jbHIgPSBTUElUWl9TQ1BfU1VTX0NMUiwKLQkuc3VzcGVuZF9zZXQgPSBTUElUWl9TQ1BfU1VTX1NFVCwKKwkuc3VzcGVuZF9jbHIJPSBTUElUWl9TQ1BfU1VTX0NMUiwKKwkuc3VzcGVuZF9zZXQJPSBTUElUWl9TQ1BfU1VTX1NFVCwKKwkuZ3Bpb19iYXNlCT0gU1BJVFpfU0NQX0dQSU9fQkFTRSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpdHpzY29vcF9kZXZpY2UgPSB7CkBAIC05NywxMCArMTY1LDExIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNjb29wX2NvbmZpZyBzcGl0el9zY29vcDJfc2V0dXAgPSB7Ci0JLmlvX2RpciAJPSBTUElUWl9TQ1AyX0lPX0RJUiwKKwkuaW9fZGlyCQk9IFNQSVRaX1NDUDJfSU9fRElSLAogCS5pb19vdXQJCT0gU1BJVFpfU0NQMl9JT19PVVQsCi0JLnN1c3BlbmRfY2xyID0gU1BJVFpfU0NQMl9TVVNfQ0xSLAotCS5zdXNwZW5kX3NldCA9IFNQSVRaX1NDUDJfU1VTX1NFVCwKKwkuc3VzcGVuZF9jbHIJPSBTUElUWl9TQ1AyX1NVU19DTFIsCisJLnN1c3BlbmRfc2V0CT0gU1BJVFpfU0NQMl9TVVNfU0VULAorCS5ncGlvX2Jhc2UJPSBTUElUWl9TQ1AyX0dQSU9fQkFTRSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpdHpzY29vcDJfZGV2aWNlID0gewpAQCAtMTIyLDcgKzE5MSw3IEBACiAJdW5zaWduZWQgc2hvcnQgY3ByID0gcmVhZF9zY29vcF9yZWcoJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1BSKTsKIAogCWlmIChuZXdfY3ByICYgMHgwMDA3KSB7Ci0JICAgICAgICBzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQ0ZfUE9XRVIpOworCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0NGX1BPV0VSLCAxKTsKIAkJaWYgKCEoY3ByICYgMHgwMDAyKSAmJiAhKGNwciAmIDB4MDAwNCkpCiAJCSAgICAgICAgbWRlbGF5KDUpOwogCQlpZiAoZGV2aWNlID09IFNQSVRaX1BXUl9DRikKQEAgLTEzOCwzNCArMjA3LDEzIEBACiAJCWlmICghKGNwciAmIDB4MDAwMikgJiYgIShjcHIgJiAweDAwMDQpKSB7CiAJCQl3cml0ZV9zY29vcF9yZWcoJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1BSLCAweDAwMDApOwogCQkgICAgICAgIG1kZWxheSgxKTsKLQkJICAgICAgICByZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9DRl9QT1dFUik7CisJCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0NGX1BPV0VSLCAwKTsKIAkJfSBlbHNlIHsKIAkJICAgICAgICB3cml0ZV9zY29vcF9yZWcoJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU0NPT1BfQ1BSLCBjcHIgfCBuZXdfY3ByKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgc3BpdHpfcGNtY2lhX2luaXQodm9pZCkKLXsKLQkvKiBTZXR1cCBkZWZhdWx0IHN0YXRlIG9mIEdQSU8gb3V0cHV0cwotCSAgIGJlZm9yZSB3ZSBlbmFibGUgdGhlbSBhcyBvdXRwdXRzLiAqLwotCUdQU1IoR1BJTzQ4X25QT0UpID0gR1BJT19iaXQoR1BJTzQ4X25QT0UpIHwKLQkJR1BJT19iaXQoR1BJTzQ5X25QV0UpIHwJR1BJT19iaXQoR1BJTzUwX25QSU9SKSB8Ci0JCUdQSU9fYml0KEdQSU81MV9uUElPVykgfCBHUElPX2JpdChHUElPNTRfblBDRV8yKTsKLQlHUFNSKEdQSU84NV9uUENFXzEpID0gR1BJT19iaXQoR1BJTzg1X25QQ0VfMSk7Ci0KLQlweGFfZ3Bpb19tb2RlKEdQSU80OF9uUE9FX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU80OV9uUFdFX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81MF9uUElPUl9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTFfblBJT1dfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU1X25QUkVHX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU81Nl9uUFdBSVRfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzU3X25JT0lTMTZfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzg1X25QQ0VfMV9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPNTRfblBDRV8yX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8xMDRfcFNLVFNFTF9NRCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNwaXR6X3BjbWNpYV9wd3Ioc3RydWN0IGRldmljZSAqc2Nvb3AsIHVuc2lnbmVkIHNob3J0IGNwciwgaW50IG5yKQogewogCS8qIE9ubHkgbmVlZCB0byBvdmVycmlkZSBiZWhhdmlvdXIgZm9yIHNsb3QgMCAqLwpAQCAtMTkxLDcxICsyMzksMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2Nvb3BfcGNtY2lhX2NvbmZpZyBzcGl0el9wY21jaWFfY29uZmlnID0gewogCS5kZXZzICAgICAgICAgPSAmc3BpdHpfcGNtY2lhX3Njb29wWzBdLAogCS5udW1fZGV2cyAgICAgPSAyLAotCS5wY21jaWFfaW5pdCAgPSBzcGl0el9wY21jaWFfaW5pdCwKIAkucG93ZXJfY3RybCAgID0gc3BpdHpfcGNtY2lhX3B3ciwKIH07CiAKIEVYUE9SVF9TWU1CT0woc3BpdHpzY29vcF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChzcGl0enNjb29wMl9kZXZpY2UpOwogCi0KLS8qCi0gKiBTcGl0eiBTU1AgRGV2aWNlCi0gKgotICogU2V0IHRoZSBwYXJlbnQgYXMgdGhlIHNjb29wIGRldmljZSBiZWNhdXNlIGEgbG90IG9mIFNTUCBkZXZpY2VzCi0gKiBhbHNvIHVzZSBzY29vcCBmdW5jdGlvbnMgYW5kIHRoaXMgbWFrZXMgdGhlIHBvd2VyIHVwL2Rvd24gb3JkZXIKLSAqIHdvcmsgY29ycmVjdGx5LgotICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6c3NwX2RldmljZSA9IHsKLQkubmFtZQkJPSAiY29yZ2ktc3NwIiwKLQkuZGV2CQk9IHsKLSAJCS5wYXJlbnQgPSAmc3BpdHpzY29vcF9kZXZpY2UuZGV2LAotCX0sCi0JLmlkCQk9IC0xLAotfTsKLQotc3RydWN0IGNvcmdpc3NwX21hY2hpbmZvIHNwaXR6X3NzcF9tYWNoaW5mbyA9IHsKLQkucG9ydAkJPSAyLAotCS5jc19sY2Rjb24JPSBTUElUWl9HUElPX0xDRENPTl9DUywKLQkuY3NfYWRzNzg0Ngk9IFNQSVRaX0dQSU9fQURTNzg0Nl9DUywKLQkuY3NfbWF4MTExMQk9IFNQSVRaX0dQSU9fTUFYMTExMV9DUywKLQkuY2xrX2xjZGNvbgk9IDUyMCwKLQkuY2xrX2Fkczc4NDYJPSAxNCwKLQkuY2xrX21heDExMTEJPSA1NiwKLX07Ci0KLQotLyoKLSAqIFNwaXR6IEJhY2tsaWdodCBEZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgc3BpdHpfYmxfa2lja19iYXR0ZXJ5KHZvaWQpCi17Ci0Jdm9pZCAoKmtpY2tfYmF0dCkodm9pZCk7Ci0KLQlraWNrX2JhdHQgPSBzeW1ib2xfZ2V0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKLQlpZiAoa2lja19iYXR0KSB7Ci0JCWtpY2tfYmF0dCgpOwotCQlzeW1ib2xfcHV0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19ibF9pbmZvIHNwaXR6X2JsX21hY2hpbmZvID0gewotCS5uYW1lID0gImNvcmdpLWJsIiwKLQkuZGVmYXVsdF9pbnRlbnNpdHkgPSAweDFmLAotCS5saW1pdF9tYXNrID0gMHgwYiwKLQkubWF4X2ludGVuc2l0eSA9IDB4MmYsCi0JLmtpY2tfYmF0dGVyeSA9IHNwaXR6X2JsX2tpY2tfYmF0dGVyeSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6YmxfZGV2aWNlID0gewotCS5uYW1lCQk9ICJnZW5lcmljLWJsIiwKLQkuZGV2CQk9IHsKLSAJCS5wbGF0Zm9ybV9kYXRhCT0gJnNwaXR6X2JsX21hY2hpbmZvLAotCX0sCi0JLmlkCQk9IC0xLAotfTsKLQotCiAvKgogICogU3BpdHogS2V5Ym9hcmQgRGV2aWNlCiAgKi8KQEAgLTI2OCw4OCArMjU3LDE1MSBAQAogLyoKICAqIFNwaXR6IExFRHMKICAqLworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBzcGl0el9ncGlvX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAic3BpdHo6YW1iZXI6Y2hhcmdlIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJzaGFycHNsLWNoYXJnZSIsCisJCS5ncGlvCQkJPSBTUElUWl9HUElPX0xFRF9PUkFOR0UsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAic3BpdHo6Z3JlZW46aGRkYWN0aXZpdHkiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gImlkZS1kaXNrIiwKKwkJLmdwaW8JCQk9IFNQSVRaX0dQSU9fTEVEX0dSRUVOLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgc3BpdHpfZ3Bpb19sZWRzX2luZm8gPSB7CisJLmxlZHMJCT0gc3BpdHpfZ3Bpb19sZWRzLAorCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoc3BpdHpfZ3Bpb19sZWRzKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6bGVkX2RldmljZSA9IHsKLQkubmFtZQkJPSAic3BpdHotbGVkIiwKKwkubmFtZQkJPSAibGVkcy1ncGlvIiwKIAkuaWQJCT0gLTEsCi19OwotCi0vKgotICogU3BpdHogVG91Y2ggU2NyZWVuIERldmljZQotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nICgqZ2V0X2hzeW5jX2ludnBlcmlvZCkoc3RydWN0IGRldmljZSAqZGV2KTsKLQotc3RhdGljIHZvaWQgaW5saW5lIHNoYXJwc2xfd2FpdF9zeW5jKGludCBncGlvKQotewotCXdoaWxlKChHUExSKGdwaW8pICYgR1BJT19iaXQoZ3BpbykpID09IDApOwotCXdoaWxlKChHUExSKGdwaW8pICYgR1BJT19iaXQoZ3BpbykpICE9IDApOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZSAqc3BpdHpfcHhhZmJfZGV2OwotCi1zdGF0aWMgaW50IGlzX3B4YWZiX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2LCB2b2lkICogZGF0YSkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKLQotCXJldHVybiAoc3RybmNtcChwZGV2LT5uYW1lLCAicHhhMnh4LWZiIiwgOSkgPT0gMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNwaXR6X2dldF9oc3luY19pbnZwZXJpb2Qodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfRkJfUFhBCi0JaWYgKCFzcGl0el9weGFmYl9kZXYpIHsKLQkJc3BpdHpfcHhhZmJfZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgTlVMTCwgaXNfcHhhZmJfZGV2aWNlKTsKLQkJaWYgKCFzcGl0el9weGFmYl9kZXYpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFnZXRfaHN5bmNfaW52cGVyaW9kKQotCQlnZXRfaHN5bmNfaW52cGVyaW9kID0gc3ltYm9sX2dldChweGFmYl9nZXRfaHN5bmNfdGltZSk7Ci0JaWYgKCFnZXRfaHN5bmNfaW52cGVyaW9kKQotI2VuZGlmCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGdldF9oc3luY19pbnZwZXJpb2Qoc3BpdHpfcHhhZmJfZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgc3BpdHpfcHV0X2hzeW5jKHZvaWQpCi17Ci0JcHV0X2RldmljZShzcGl0el9weGFmYl9kZXYpOwotCWlmIChnZXRfaHN5bmNfaW52cGVyaW9kKQotCQlzeW1ib2xfcHV0KHB4YWZiX2dldF9oc3luY190aW1lKTsKLQlzcGl0el9weGFmYl9kZXYgPSBOVUxMOwotCWdldF9oc3luY19pbnZwZXJpb2QgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBzcGl0el93YWl0X2hzeW5jKHZvaWQpCi17Ci0Jc2hhcnBzbF93YWl0X3N5bmMoU1BJVFpfR1BJT19IU1lOQyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3BpdHp0c19yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBTUElUWl9JUlFfR1BJT19UUF9JTlQsCi0JCS5lbmQJCT0gU1BJVFpfSVJRX0dQSU9fVFBfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY29yZ2l0c19tYWNoaW5mbyAgc3BpdHpfdHNfbWFjaGluZm8gPSB7Ci0JLmdldF9oc3luY19pbnZwZXJpb2QgPSBzcGl0el9nZXRfaHN5bmNfaW52cGVyaW9kLAotCS5wdXRfaHN5bmMgICAgICAgICAgID0gc3BpdHpfcHV0X2hzeW5jLAotCS53YWl0X2hzeW5jICAgICAgICAgID0gc3BpdHpfd2FpdF9oc3luYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaXR6dHNfZGV2aWNlID0gewotCS5uYW1lCQk9ICJjb3JnaS10cyIsCiAJLmRldgkJPSB7Ci0gCQkucGFyZW50ID0gJnNwaXR6c3NwX2RldmljZS5kZXYsCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNwaXR6X3RzX21hY2hpbmZvLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGl0el9ncGlvX2xlZHNfaW5mbywKIAl9LAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc3BpdHp0c19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHNwaXR6dHNfcmVzb3VyY2VzLAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9QWEEyWFhfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBzcGl0el9zcGlfaW5mbyA9IHsKKwkubnVtX2NoaXBzZWxlY3QJPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEgc3BpdHpfYWRzNzg0Nl9pbmZvID0geworCS5tb2RlbAkJCT0gNzg0NiwKKwkudnJlZl9kZWxheV91c2Vjcwk9IDEwMCwKKwkueF9wbGF0ZV9vaG1zCQk9IDQxOSwKKwkueV9wbGF0ZV9vaG1zCQk9IDQ4NiwKKwkuZ3Bpb19wZW5kb3duCQk9IFNQSVRaX0dQSU9fVFBfSU5ULAorfTsKKworc3RhdGljIHZvaWQgc3BpdHpfYWRzNzg0Nl9jcyh1MzIgY29tbWFuZCkKK3sKKwlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0FEUzc4NDZfQ1MsICEoY29tbWFuZCA9PSBQWEEyWFhfQ1NfQVNTRVJUKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwIHNwaXR6X2Fkczc4NDZfY2hpcCA9IHsKKwkuY3NfY29udHJvbAkJPSBzcGl0el9hZHM3ODQ2X2NzLAorfTsKKworc3RhdGljIHZvaWQgc3BpdHpfYmxfa2lja19iYXR0ZXJ5KHZvaWQpCit7CisJdm9pZCAoKmtpY2tfYmF0dCkodm9pZCk7CisKKwlraWNrX2JhdHQgPSBzeW1ib2xfZ2V0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKKwlpZiAoa2lja19iYXR0KSB7CisJCWtpY2tfYmF0dCgpOworCQlzeW1ib2xfcHV0KHNoYXJwc2xfYmF0dGVyeV9raWNrKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29yZ2lfbGNkX3BsYXRmb3JtX2RhdGEgc3BpdHpfbGNkY29uX2luZm8gPSB7CisJLmluaXRfbW9kZQkJPSBDT1JHSV9MQ0RfTU9ERV9WR0EsCisJLm1heF9pbnRlbnNpdHkJCT0gMHgyZiwKKwkuZGVmYXVsdF9pbnRlbnNpdHkJPSAweDFmLAorCS5saW1pdF9tYXNrCQk9IDB4MGIsCisJLmdwaW9fYmFja2xpZ2h0X2NvbnQJPSBTUElUWl9HUElPX0JBQ0tMSUdIVF9DT05ULAorCS5ncGlvX2JhY2tsaWdodF9vbgk9IFNQSVRaX0dQSU9fQkFDS0xJR0hUX09OLAorCS5raWNrX2JhdHRlcnkJCT0gc3BpdHpfYmxfa2lja19iYXR0ZXJ5LAorfTsKKworc3RhdGljIHZvaWQgc3BpdHpfbGNkY29uX2NzKHUzMiBjb21tYW5kKQoreworCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTENEQ09OX0NTLCAhKGNvbW1hbmQgPT0gUFhBMlhYX0NTX0FTU0VSVCkpOworfQorCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCBzcGl0el9sY2Rjb25fY2hpcCA9IHsKKwkuY3NfY29udHJvbAk9IHNwaXR6X2xjZGNvbl9jcywKK307CisKK3N0YXRpYyB2b2lkIHNwaXR6X21heDExMTFfY3ModTMyIGNvbW1hbmQpCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NQVgxMTExX0NTLCAhKGNvbW1hbmQgPT0gUFhBMlhYX0NTX0FTU0VSVCkpOworfQorCitzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCBzcGl0el9tYXgxMTExX2NoaXAgPSB7CisJLmNzX2NvbnRyb2wJPSBzcGl0el9tYXgxMTExX2NzLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGl0el9zcGlfZGV2aWNlc1tdID0geworCXsKKwkJLm1vZGFsaWFzCT0gImFkczc4NDYiLAorCQkubWF4X3NwZWVkX2h6CT0gMTIwMDAwMCwKKwkJLmJ1c19udW0JPSAyLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCQkucGxhdGZvcm1fZGF0YQk9ICZzcGl0el9hZHM3ODQ2X2luZm8sCisJCS5jb250cm9sbGVyX2RhdGE9ICZzcGl0el9hZHM3ODQ2X2NoaXAsCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoU1BJVFpfR1BJT19UUF9JTlQpLAorCX0sIHsKKwkJLm1vZGFsaWFzCT0gImNvcmdpLWxjZCIsCisJCS5tYXhfc3BlZWRfaHoJPSA1MDAwMCwKKwkJLmJ1c19udW0JPSAyLAorCQkuY2hpcF9zZWxlY3QJPSAxLAorCQkucGxhdGZvcm1fZGF0YQk9ICZzcGl0el9sY2Rjb25faW5mbywKKwkJLmNvbnRyb2xsZXJfZGF0YT0gJnNwaXR6X2xjZGNvbl9jaGlwLAorCX0sIHsKKwkJLm1vZGFsaWFzCT0gIm1heDExMTEiLAorCQkubWF4X3NwZWVkX2h6CT0gNDUwMDAwLAorCQkuYnVzX251bQk9IDIsCisJCS5jaGlwX3NlbGVjdAk9IDIsCisJCS5jb250cm9sbGVyX2RhdGE9ICZzcGl0el9tYXgxMTExX2NoaXAsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzcGl0el9pbml0X3NwaSh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoU1BJVFpfR1BJT19BRFM3ODQ2X0NTLCAiQURTNzg0Nl9DUyIpOworCWlmIChlcnIpCisJCXJldHVybjsKKworCWVyciA9IGdwaW9fcmVxdWVzdChTUElUWl9HUElPX0xDRENPTl9DUywgIkxDRENPTl9DUyIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfMTsKKworCWVyciA9IGdwaW9fcmVxdWVzdChTUElUWl9HUElPX01BWDExMTFfQ1MsICJNQVgxMTExX0NTIik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV8yOworCisJaWYgKG1hY2hpbmVfaXNfYWtpdGEoKSkgeworCQlzcGl0el9sY2Rjb25faW5mby5ncGlvX2JhY2tsaWdodF9jb250ID0gQUtJVEFfR1BJT19CQUNLTElHSFRfQ09OVDsKKwkJc3BpdHpfbGNkY29uX2luZm8uZ3Bpb19iYWNrbGlnaHRfb24gPSBBS0lUQV9HUElPX0JBQ0tMSUdIVF9PTjsKKwl9CisKKwlweGEyeHhfc2V0X3NwaV9pbmZvKDIsICZzcGl0el9zcGlfaW5mbyk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oQVJSQVlfQU5EX1NJWkUoc3BpdHpfc3BpX2RldmljZXMpKTsKKwlyZXR1cm47CisKK2Vycl9mcmVlXzI6CisJZ3Bpb19mcmVlKFNQSVRaX0dQSU9fTENEQ09OX0NTKTsKK2Vycl9mcmVlXzE6CisJZ3Bpb19mcmVlKFNQSVRaX0dQSU9fQURTNzg0Nl9DUyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNwaXR6X2luaXRfc3BpKHZvaWQpIHt9CisjZW5kaWYKIAogLyoKICAqIE1NQy9TRCBEZXZpY2UKQEAgLTM2NCwyNCArNDE2LDM1IEBACiB7CiAJaW50IGVycjsKIAotCS8qIHNldHVwIEdQSU8gZm9yIFBYQTI3eCBNTUMgY29udHJvbGxlcgkqLwotCXB4YV9ncGlvX21vZGUoR1BJTzMyX01NQ0NMS19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMTEyX01NQ0NNRF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPOTJfTU1DREFUMF9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMTA5X01NQ0RBVDFfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzExMF9NTUNEQVQyX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8xMTFfTU1DREFUM19NRCk7Ci0JcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX25TRF9ERVRFQ1QgfCBHUElPX0lOKTsKLQlweGFfZ3Bpb19tb2RlKFNQSVRaX0dQSU9fblNEX1dQIHwgR1BJT19JTik7CisJZXJyID0gZ3Bpb19yZXF1ZXN0KFNQSVRaX0dQSU9fblNEX0RFVEVDVCwgIm5TRF9ERVRFQ1QiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoU1BJVFpfR1BJT19uU0RfV1AsICJuU0RfV1AiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlXzE7CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChTUElUWl9HUElPX25TRF9ERVRFQ1QpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KFNQSVRaX0dQSU9fblNEX1dQKTsKIAogCXNwaXR6X21jaV9wbGF0Zm9ybV9kYXRhLmRldGVjdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKFNQSVRaX0lSUV9HUElPX25TRF9ERVRFQ1QsIHNwaXR6X2RldGVjdF9pbnQsCi0JCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwKKwkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgInNwaXR6X21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2ZyZWVfMjsKKwl9CisJcmV0dXJuIDA7CiAKK2Vycl9mcmVlXzI6CisJZ3Bpb19mcmVlKFNQSVRaX0dQSU9fblNEX1dQKTsKK2Vycl9mcmVlXzE6CisJZ3Bpb19mcmVlKFNQSVRaX0dQSU9fblNEX0RFVEVDVCk7CitlcnJfb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM5NywxMiArNDYwLDE0IEBACiAKIHN0YXRpYyBpbnQgc3BpdHpfbWNpX2dldF9ybyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIEdQTFIoU1BJVFpfR1BJT19uU0RfV1ApICYgR1BJT19iaXQoU1BJVFpfR1BJT19uU0RfV1ApOworCXJldHVybiBncGlvX2dldF92YWx1ZShTUElUWl9HUElPX25TRF9XUCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNwaXR6X21jaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlmcmVlX2lycShTUElUWl9JUlFfR1BJT19uU0RfREVURUNULCBkYXRhKTsKKwlncGlvX2ZyZWUoU1BJVFpfR1BJT19uU0RfV1ApOworCWdwaW9fZnJlZShTUElUWl9HUElPX25TRF9ERVRFQ1QpOwogfQogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHNwaXR6X21jaV9wbGF0Zm9ybV9kYXRhID0gewpAQCAtNDE5LDI3ICs0ODQsMjQgQEAKICAqLwogc3RhdGljIGludCBzcGl0el9vaGNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCS8qIE9ubHkgUG9ydCAyIGlzIGNvbm5lY3RlZCAqLwotCXB4YV9ncGlvX21vZGUoU1BJVFpfR1BJT19VU0JfQ09OTkVDVCB8IEdQSU9fSU4pOwotCXB4YV9ncGlvX21vZGUoU1BJVFpfR1BJT19VU0JfSE9TVCB8IEdQSU9fT1VUKTsKLQlweGFfZ3Bpb19tb2RlKFNQSVRaX0dQSU9fVVNCX0RFVklDRSB8IEdQSU9fSU4pOworCWludCBlcnI7CiAKLQkvKiBTZXR1cCBVU0IgUG9ydCAyIE91dHB1dCBDb250cm9sIFJlZ2lzdGVyICovCisJZXJyID0gZ3Bpb19yZXF1ZXN0KFNQSVRaX0dQSU9fVVNCX0hPU1QsICJVU0JfSE9TVCIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBPbmx5IFBvcnQgMiBpcyBjb25uZWN0ZWQKKwkgKiBTZXR1cCBVU0IgUG9ydCAyIE91dHB1dCBDb250cm9sIFJlZ2lzdGVyCisJICovCiAJVVAyT0NSID0gVVAyT0NSX0hYUyB8IFVQMk9DUl9IWE9FIHwgVVAyT0NSX0RQUERFIHwgVVAyT0NSX0RNUERFOwogCi0JR1BTUihTUElUWl9HUElPX1VTQl9IT1NUKSA9IEdQSU9fYml0KFNQSVRaX0dQSU9fVVNCX0hPU1QpOwotCi0JVUhDSFIgPSAoVUhDSFIpICYKLQkJfihVSENIUl9TU0VQMSB8IFVIQ0hSX1NTRVAyIHwgVUhDSFJfU1NFUDMgfCBVSENIUl9TU0UpOwotCi0JVUhDUkhEQSB8PSBVSENSSERBX05PQ1A7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFNQSVRaX0dQSU9fVVNCX0hPU1QsIDEpOwogfQogCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBzcGl0el9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLnBvcnRfbW9kZQk9IFBNTV9OUFNfTU9ERSwKIAkuaW5pdAkJPSBzcGl0el9vaGNpX2luaXQsCisJLmZsYWdzCQk9IEVOQUJMRV9QT1JUX0FMTCB8IE5PX09DX1BST1RFQ1RJT04sCiAJLnBvd2VyX2J1ZGdldAk9IDE1MCwKIH07CiAKQEAgLTQ0NywyOSArNTA5LDUwIEBACiAvKgogICogSXJkYQogICovCitzdGF0aWMgaW50IHNwaXR6X2lyZGFfc3RhcnR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJjOworCisJcmMgPSBncGlvX3JlcXVlc3QoU1BJVFpfR1BJT19JUl9PTiwgIklyREEgb24iKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcmMgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoU1BJVFpfR1BJT19JUl9PTiwgMSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9kaXI7CisKKwlyZXR1cm4gMDsKKworZXJyX2RpcjoKKwlncGlvX2ZyZWUoU1BJVFpfR1BJT19JUl9PTik7CitlcnI6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBzcGl0el9pcmRhX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlncGlvX2ZyZWUoU1BJVFpfR1BJT19JUl9PTik7Cit9CisKIHN0YXRpYyB2b2lkIHNwaXR6X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQogewotCWlmIChtb2RlICYgSVJfT0ZGKQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9JUl9PTik7Ci0JZWxzZQotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LCBTUElUWl9TQ1AyX0lSX09OKTsKKwlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0lSX09OLCBtb2RlICYgSVJfT0ZGKTsKIAlweGEyeHhfdHJhbnNjZWl2ZXJfbW9kZShkZXYsIG1vZGUpOwogfQogCiAjaWZkZWYgQ09ORklHX01BQ0hfQUtJVEEKIHN0YXRpYyB2b2lkIGFraXRhX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQogewotCWlmIChtb2RlICYgSVJfT0ZGKQotCQlha2l0YV9zZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwgQUtJVEFfSU9FWFBfSVJfT04pOwotCWVsc2UKLQkJYWtpdGFfcmVzZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwgQUtJVEFfSU9FWFBfSVJfT04pOworCWdwaW9fc2V0X3ZhbHVlKEFLSVRBX0dQSU9fSVJfT04sIG1vZGUgJiBJUl9PRkYpOwogCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7CiB9CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgc3BpdHpfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX09GRiwKLQkudHJhbnNjZWl2ZXJfbW9kZSA9IHNwaXR6X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkudHJhbnNjZWl2ZXJfY2FwCT0gSVJfU0lSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IHNwaXR6X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuc3RhcnR1cAkJPSBzcGl0el9pcmRhX3N0YXJ0dXAsCisJLnNodXRkb3duCQk9IHNwaXR6X2lyZGFfc2h1dGRvd24sCiB9OwogCiAKQEAgLTQ3NywxNCArNTYwLDYgQEAKICAqIFNwaXR6IFBYQSBGcmFtZWJ1ZmZlcgogICovCiAKLXN0YXRpYyB2b2lkIHNwaXR6X2xjZF9wb3dlcihpbnQgb24sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQotewotCWlmIChvbikKLQkJY29yZ2lfbGNkdGdfaHdfaW5pdCh2YXItPnhyZXMpOwotCWVsc2UKLQkJY29yZ2lfbGNkdGdfc3VzcGVuZCgpOwotfQotCiBzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBzcGl0el9weGFmYl9tb2Rlc1tdID0gewogewogCS5waXhjbG9jayAgICAgICA9IDE5MjMxLApAQCAtNTE3LDE4ICs1OTIsMTMgQEAKIAkubW9kZXMgICAgICAgICAgPSAmc3BpdHpfcHhhZmJfbW9kZXNbMF0sCiAJLm51bV9tb2RlcyAgICAgID0gMiwKIAkuZml4ZWRfbW9kZXMgICAgPSAxLAotCS5sY2NyMCAgICAgICAgICA9IExDQ1IwX0NvbG9yIHwgTENDUjBfU25nbCB8IExDQ1IwX0FjdCB8IExDQ1IwX0xEREFMVCB8IExDQ1IwX09VQyB8IExDQ1IwX0NNRElNIHwgTENDUjBfUkRTVE0sCi0JLmxjY3IzICAgICAgICAgID0gTENDUjNfUGl4UnNFZGcgfCBMQ0NSM19PdXRFbkgsCi0JLnB4YWZiX2xjZF9wb3dlciA9IHNwaXR6X2xjZF9wb3dlciwKKwkubGNkX2Nvbm4JPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX0FMVEVSTkFURV9NQVBQSU5HLAogfTsKIAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNwaXR6c2Nvb3BfZGV2aWNlLAotCSZzcGl0enNzcF9kZXZpY2UsCiAJJnNwaXR6a2JkX2RldmljZSwKLQkmc3BpdHp0c19kZXZpY2UsCi0JJnNwaXR6YmxfZGV2aWNlLAogCSZzcGl0emxlZF9kZXZpY2UsCiB9OwogCkBAIC01NDgsNjMgKzYxOCwzMiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgY29tbW9uX2luaXQodm9pZCkKIHsKLQlpbml0X2dwaW9fcmVzZXQoU1BJVFpfR1BJT19PTl9SRVNFVCk7CisJaW5pdF9ncGlvX3Jlc2V0KFNQSVRaX0dQSU9fT05fUkVTRVQsIDEpOwogCXBtX3Bvd2VyX29mZiA9IHNwaXR6X3Bvd2Vyb2ZmOwogCWFybV9wbV9yZXN0YXJ0ID0gc3BpdHpfcmVzdGFydDsKIAogCVBNQ1IgPSAweDAwOwogCi0JLyogc2V0dXAgc2xlZXAgbW9kZSB2YWx1ZXMgKi8KLQlQV0VSICA9IDB4MDAwMDAwMDI7Ci0JUEZFUiAgPSAweDAwMDAwMDAwOwotCVBSRVIgID0gMHgwMDAwMDAwMjsKLQlQR1NSMCA9IDB4MDE1OEMwMDA7Ci0JUEdTUjEgPSAweDAwRkYwMDgwOwotCVBHU1IyID0gMHgwMDAxQzAwNDsKLQogCS8qIFN0b3AgMy42TUh6IGFuZCBkcml2ZSBISUdIIHRvIFBDTUNJQSBhbmQgQ1MgKi8KIAlQQ0ZSIHw9IFBDRlJfT1BERTsKIAotCWNvcmdpX3NzcF9zZXRfbWFjaGluZm8oJnNwaXR6X3NzcF9tYWNoaW5mbyk7CisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoc3BpdHpfcGluX2NvbmZpZykpOwogCi0JcHhhX2dwaW9fbW9kZShTUElUWl9HUElPX0hTWU5DIHwgR1BJT19JTik7CisJc3BpdHpfaW5pdF9zcGkoKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCXB4YV9zZXRfbWNpX2luZm8oJnNwaXR6X21jaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X29oY2lfaW5mbygmc3BpdHpfb2hjaV9wbGF0Zm9ybV9kYXRhKTsKIAlweGFfc2V0X2ZpY3BfaW5mbygmc3BpdHpfZmljcF9wbGF0Zm9ybV9kYXRhKTsKLQlzZXRfcHhhX2ZiX3BhcmVudCgmc3BpdHpzc3BfZGV2aWNlLmRldik7CiAJc2V0X3B4YV9mYl9pbmZvKCZzcGl0el9weGFmYl9pbmZvKTsKIAlweGFfc2V0X2kyY19pbmZvKE5VTEwpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9TUElUWikgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9CT1JaT0kpCi1zdGF0aWMgdm9pZCBzcGl0el9ibF9zZXRfaW50ZW5zaXR5KGludCBpbnRlbnNpdHkpCi17Ci0JaWYgKGludGVuc2l0eSA+IDB4MTApCi0JCWludGVuc2l0eSArPSAweDEwOwotCi0JLyogQml0cyAwLTQgYXJlIGFjY2Vzc2VkIHZpYSB0aGUgU1NQIGludGVyZmFjZSAqLwotCWNvcmdpX3NzcF9ibGR1dHlfc2V0KGludGVuc2l0eSAmIDB4MWYpOwotCi0JLyogQml0IDUgaXMgdmlhIFNDT09QICovCi0JaWYgKGludGVuc2l0eSAmIDB4MDAyMCkKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9CQUNLTElHSFRfQ09OVCk7Ci0JZWxzZQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9CQUNLTElHSFRfQ09OVCk7Ci0KLQlpZiAoaW50ZW5zaXR5KQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9CQUNLTElHSFRfT04pOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwgU1BJVFpfU0NQMl9CQUNLTElHSFRfT04pOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgc3BpdHpfaW5pdCh2b2lkKQogewogCXBsYXRmb3JtX3Njb29wX2NvbmZpZyA9ICZzcGl0el9wY21jaWFfY29uZmlnOwogCi0Jc3BpdHpfYmxfbWFjaGluZm8uc2V0X2JsX2ludGVuc2l0eSA9IHNwaXR6X2JsX3NldF9pbnRlbnNpdHk7Ci0KIAljb21tb25faW5pdCgpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzcGl0enNjb29wMl9kZXZpY2UpOwpAQCAtNjE1LDMyICs2NTQsMTcgQEAKIC8qCiAgKiBBa2l0YSBJTyBFeHBhbmRlcgogICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFraXRhaW9leHBfZGV2aWNlID0gewotCS5uYW1lCQk9ICJha2l0YS1pb2V4cCIsCi0JLmlkCQk9IC0xLAorc3RhdGljIHN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgYWtpdGFfaW9leHAgPSB7CisJLmdwaW9fYmFzZQkJPSBBS0lUQV9JT0VYUF9HUElPX0JBU0UsCiB9OwogCi1FWFBPUlRfU1lNQk9MX0dQTChha2l0YWlvZXhwX2RldmljZSk7Ci0KLXN0YXRpYyB2b2lkIGFraXRhX2JsX3NldF9pbnRlbnNpdHkoaW50IGludGVuc2l0eSkKLXsKLQlpZiAoaW50ZW5zaXR5ID4gMHgxMCkKLQkJaW50ZW5zaXR5ICs9IDB4MTA7Ci0KLQkvKiBCaXRzIDAtNCBhcmUgYWNjZXNzZWQgdmlhIHRoZSBTU1AgaW50ZXJmYWNlICovCi0JY29yZ2lfc3NwX2JsZHV0eV9zZXQoaW50ZW5zaXR5ICYgMHgxZik7Ci0KLQkvKiBCaXQgNSBpcyB2aWEgSU8tRXhwYW5kZXIgKi8KLQlpZiAoaW50ZW5zaXR5ICYgMHgwMDIwKQotCQlha2l0YV9yZXNldF9pb2V4cCgmYWtpdGFpb2V4cF9kZXZpY2UuZGV2LCBBS0lUQV9JT0VYUF9CQUNLTElHSFRfQ09OVCk7Ci0JZWxzZQotCQlha2l0YV9zZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwgQUtJVEFfSU9FWFBfQkFDS0xJR0hUX0NPTlQpOwotCi0JaWYgKGludGVuc2l0eSkKLQkJYWtpdGFfc2V0X2lvZXhwKCZha2l0YWlvZXhwX2RldmljZS5kZXYsIEFLSVRBX0lPRVhQX0JBQ0tMSUdIVF9PTik7Ci0JZWxzZQotCQlha2l0YV9yZXNldF9pb2V4cCgmYWtpdGFpb2V4cF9kZXZpY2UuZGV2LCBBS0lUQV9JT0VYUF9CQUNLTElHSFRfT04pOwotfQorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBha2l0YV9pMmNfYm9hcmRfaW5mb1tdID0geworCXsKKwkJLnR5cGUJCT0gIm1heDczMTAiLAorCQkuYWRkcgkJPSAweDE4LAorCQkucGxhdGZvcm1fZGF0YQk9ICZha2l0YV9pb2V4cCwKKwl9LAorfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGFraXRhX2luaXQodm9pZCkKIHsKQEAgLTY0OSwxMSArNjczLDEwIEBACiAJLyogV2UganVzdCBwcmV0ZW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgYXJyYXkgZG9lc24ndCBleGlzdCAqLwogCXNwaXR6X3BjbWNpYV9jb25maWcubnVtX2RldnMgPSAxOwogCXBsYXRmb3JtX3Njb29wX2NvbmZpZyA9ICZzcGl0el9wY21jaWFfY29uZmlnOwotCXNwaXR6X2JsX21hY2hpbmZvLnNldF9ibF9pbnRlbnNpdHkgPSBha2l0YV9ibF9zZXRfaW50ZW5zaXR5OwogCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZha2l0YWlvZXhwX2RldmljZSk7CisJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBBUlJBWV9BTkRfU0laRShha2l0YV9pMmNfYm9hcmRfaW5mbykpOwogCi0Jc3BpdHpzY29vcF9kZXZpY2UuZGV2LnBhcmVudCA9ICZha2l0YWlvZXhwX2RldmljZS5kZXY7CiAJY29tbW9uX2luaXQoKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6X3BtLmMKaW5kZXggOGE0MDUwNS4uNTMwMThkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHpfcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0el9wbS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9zaGFycHNsLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGl0ei5oPgpAQCAtNDgsNDQgKzQ3LDM1IEBACiAKIHN0YXRpYyB2b2lkIHNwaXR6X21lYXN1cmVfdGVtcChpbnQgb24pCiB7Ci0JaWYgKG9uKQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQURDX1RFTVBfT04pOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQURDX1RFTVBfT04pOworCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fQURDX1RFTVBfT04sIG9uKTsKIH0KIAogc3RhdGljIHZvaWQgc3BpdHpfY2hhcmdlKGludCBvbikKIHsKIAlpZiAob24pIHsKIAkJaWYgKHNoYXJwc2xfcG0uZmxhZ3MgJiBTSEFSUFNMX1NVU1BFTkRFRCkgewotCQkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0pLX0IpOwotCQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQ0hSR19PTik7CisJCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0pLX0IsIDEpOworCQkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19DSFJHX09OLCAwKTsKIAkJfSBlbHNlIHsKLQkJCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0pLX0IpOwotCQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQ0hSR19PTik7CisJCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX0pLX0IsIDApOworCQkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19DSFJHX09OLCAwKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0pLX0IpOwotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfQ0hSR19PTik7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fSktfQiwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fQ0hSR19PTiwgMSk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzcGl0el9kaXNjaGFyZ2UoaW50IG9uKQogewotCWlmIChvbikKLQkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0pLX0EpOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfSktfQSk7CisJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19KS19BLCBvbik7CiB9CiAKIC8qIEhBQ0sgLSBGb3IgdW5rbm93biByZWFzb25zLCBhY2N1cmF0ZSB2b2x0YWdlIHJlYWRpbmdzIGFyZSBvbmx5IG1hZGUgd2l0aCBhIGxvYWQKICAgIG9uIHRoZSBwb3dlciBidXMgd2hpY2ggdGhlIGdyZWVuIGxlZCBvbiBzcGl0eiBwcm92aWRlcyAqLwogc3RhdGljIHZvaWQgc3BpdHpfZGlzY2hhcmdlMShpbnQgb24pCiB7Ci0JaWYgKG9uKQotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTEVEX0dSRUVOKTsKLQllbHNlCi0JCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0xFRF9HUkVFTik7CisJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19MRURfR1JFRU4sIG9uKTsKIH0KIAogc3RhdGljIHZvaWQgc3BpdHpfcHJlc3VzcGVuZCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc3NwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYwppbmRleCA5YmQ5M2M1Li4yYzMxZWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zc3AuYwpAQCAtMjgsOCArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc3NwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKaW5kZXggNjdlMTg1MC4uZjhhOWE2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwpAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NudDMyX3RvXzYzLmg+CiAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlIDxhc20vY250MzJfdG9fNjMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgpAQCAtMTU1LDcgKzE1NSw3IEBACiAJT0lFUiA9IDA7CiAJT1NTUiA9IE9TU1JfTTAgfCBPU1NSX00xIHwgT1NTUl9NMiB8IE9TU1JfTTM7CiAKLQlpZiAoY3B1X2lzX3B4YTIxeCgpIHx8IGNwdV9pc19weGEyNXgoKSkKKwlpZiAoY3B1X2lzX3B4YTI1eCgpKQogCQljbG9ja190aWNrX3JhdGUgPSAzNjg2NDAwOwogCWVsc2UgaWYgKG1hY2hpbmVfaXNfbWFpbnN0b25lKCkpCiAJCWNsb2NrX3RpY2tfcmF0ZSA9IDMyNDk2MDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKaW5kZXggNWRhYjMwZS4uMTMwZTM3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3NoYXJwc2xfcGFyYW0uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKKyNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG9zYV9waW5fY29uZmlnW10gPSB7CkBAIC01MjEsNiArNTIyLDE0IEBACiAJCS53YWtldXAJPSAxLAogCQkuYWN0aXZlX2xvdyA9IDEsCiAJfSwKKwl7CisJCS50eXBlCT0gRVZfU1csCisJCS5jb2RlCT0gU1dfSEVBRFBIT05FX0lOU0VSVCwKKwkJLmdwaW8JPSBUT1NBX0dQSU9fRUFSX0lOLAorCQkuZGVzYwk9ICJIZWFkUGhvbmUgaW5zZXJ0IiwKKwkJLmFjdGl2ZV9sb3cgPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwgPSAzMDAsCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgdG9zYV9ncGlvX2tleXNfcGxhdGZvcm1fZGF0YSA9IHsKQEAgLTc3Miw3ICs3ODEsNyBAQAogCWdwaW9fc2V0X3dha2UoTUZQX1BJTl9HUElPMSwgMSk7CiAJLyogV2UgY2FuJ3QgcGFzcyB0byBncGlvLWtleXMgc2luY2UgaXQgd2lsbCBkcm9wIHRoZSBSZXNldCBhbHRmdW5jICovCiAKLQlpbml0X2dwaW9fcmVzZXQoVE9TQV9HUElPX09OX1JFU0VUKTsKKwlpbml0X2dwaW9fcmVzZXQoVE9TQV9HUElPX09OX1JFU0VULCAwKTsKIAogCXBtX3Bvd2VyX29mZiA9IHRvc2FfcG93ZXJvZmY7CiAJYXJtX3BtX3Jlc3RhcnQgPSB0b3NhX3Jlc3RhcnQ7CkBAIC03OTIsNiArODAxLDggQEAKIAlweGFfc2V0X2kyY19pbmZvKE5VTEwpOwogCXBsYXRmb3JtX3Njb29wX2NvbmZpZyA9ICZ0b3NhX3BjbWNpYV9jb25maWc7CiAKKwljbGtfYWRkX2FsaWFzKCJDTEtfQ0szUDZNSSIsICZ0YzYzOTN4Yl9kZXZpY2UuZGV2LCAiR1BJTzExX0NMSyIsIE5VTEwpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCmluZGV4IDNlZDc1N2UuLmExM2RiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYwpAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZG05MDAwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIApAQCAtNDAsNDEgKzM5LDE0OCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjd4Lmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC90cml6ZXBzNC5oPgogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8bWFjaC9tbWMuaD4KICNpbmNsdWRlIDxtYWNoL2lyZGEuaD4KICNpbmNsdWRlIDxtYWNoL29oY2kuaD4KKyNpbmNsdWRlIDxtYWNoL2kyYy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgljb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQorICoJU3RhbmRhcmQgVUFSVCBmcm9tIFBYQSBmb3Igc2VyaWFsIC8gaXJkYSB0cmFuc21pc3Npb24KKyAqCWFuZCBhY2l2YXRlIGl0IGlmIHlvdSBoYXZlIHN0YXR1cyBsZWRzIGNvbm5lY3RlZCAqLworI2RlZmluZSBTVEFUVVNfTEVEU19PTl9TVFVBUlRfUElOUyAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTXVsdGlGdW5jdGlvblBpbnMgb2YgQ1BVCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cml6ZXBzNF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBDaGlwIFNlbGVjdHMgKi8KKwlHUElPMTVfbkNTXzEsCQkvKiBEaXNrT25DaGlwIENTICovCisJR1BJTzkzX0dQSU8sCQkvKiBUUklaRVBTNF9ET0NfSVJRICovCisJR1BJTzk0X0dQSU8sCQkvKiBET0MgbG9jayAqLworCisJR1BJTzc4X25DU18yLAkJLyogRE05MDAwIENTICovCisJR1BJTzEwMV9HUElPLAkJLyogVFJJWkVQUzRfRVRIX0lSUSAqLworCisJR1BJTzc5X25DU18zLAkJLyogTG9naWMgQ1MgKi8KKwlHUElPMF9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwJLyogTG9naWMgaXJxICovCisKKwkvKiBMQ0QgLSAxNmJwcCBBY3RpdmUgVEZUICovCisJR1BJTzU4X0xDRF9MRERfMCwKKwlHUElPNTlfTENEX0xERF8xLAorCUdQSU82MF9MQ0RfTEREXzIsCisJR1BJTzYxX0xDRF9MRERfMywKKwlHUElPNjJfTENEX0xERF80LAorCUdQSU82M19MQ0RfTEREXzUsCisJR1BJTzY0X0xDRF9MRERfNiwKKwlHUElPNjVfTENEX0xERF83LAorCUdQSU82Nl9MQ0RfTEREXzgsCisJR1BJTzY3X0xDRF9MRERfOSwKKwlHUElPNjhfTENEX0xERF8xMCwKKwlHUElPNjlfTENEX0xERF8xMSwKKwlHUElPNzBfTENEX0xERF8xMiwKKwlHUElPNzFfTENEX0xERF8xMywKKwlHUElPNzJfTENEX0xERF8xNCwKKwlHUElPNzNfTENEX0xERF8xNSwKKwlHUElPNzRfTENEX0ZDTEssCisJR1BJTzc1X0xDRF9MQ0xLLAorCUdQSU83Nl9MQ0RfUENMSywKKwlHUElPNzdfTENEX0JJQVMsCisKKwkvKiBVQVJUICovCisJR1BJTzlfRkZVQVJUX0NUUywKKwlHUElPMTBfRkZVQVJUX0RDRCwKKwlHUElPMTZfRkZVQVJUX1RYRCwKKwlHUElPMzNfRkZVQVJUX0RTUiwKKwlHUElPMzhfRkZVQVJUX1JJLAorCUdQSU84Ml9GRlVBUlRfRFRSLAorCUdQSU84M19GRlVBUlRfUlRTLAorCUdQSU85Nl9GRlVBUlRfUlhELAorCisJR1BJTzQyX0JUVUFSVF9SWEQsCisJR1BJTzQzX0JUVUFSVF9UWEQsCisJR1BJTzQ0X0JUVUFSVF9DVFMsCisJR1BJTzQ1X0JUVUFSVF9SVFMsCisjaWZkZWYgU1RBVFVTX0xFRFNfT05fU1RVQVJUX1BJTlMKKwlHUElPNDZfR1BJTywKKwlHUElPNDdfR1BJTywKKyNlbHNlCisJR1BJTzQ2X1NUVUFSVF9SWEQsCisJR1BJTzQ3X1NUVUFSVF9UWEQsCisjZW5kaWYKKwkvKiBQQ01DSUEgKi8KKwlHUElPMTFfR1BJTywJCQkvKiBUUklaRVBTNF9DRF9JUlEgKi8KKwlHUElPMTNfR1BJTywJCQkvKiBUUklaRVBTNF9SRUFEWV9OSU5UICovCisJR1BJTzQ4X25QT0UsCisJR1BJTzQ5X25QV0UsCisJR1BJTzUwX25QSU9SLAorCUdQSU81MV9uUElPVywKKwlHUElPNTRfblBDRV8yLAorCUdQSU81NV9uUFJFRywKKwlHUElPNTZfblBXQUlULAorCUdQSU81N19uSU9JUzE2LAorCUdQSU8xMDJfblBDRV8xLAorCUdQSU8xMDRfUFNLVFNFTCwKKworCS8qIE11bHRpTWVkaWFDYXJkICovCisJR1BJTzMyX01NQ19DTEssCisJR1BJTzkyX01NQ19EQVRfMCwKKwlHUElPMTA5X01NQ19EQVRfMSwKKwlHUElPMTEwX01NQ19EQVRfMiwKKwlHUElPMTExX01NQ19EQVRfMywKKwlHUElPMTEyX01NQ19DTUQsCisJR1BJTzEyX0dQSU8sCQkJLyogVFJJWkVQUzRfTU1DX0lSUSAqLworCisJLyogVVNCIE9IQ0kgKi8KKwlHUElPODhfVVNCSDFfUFdSLAkJLyogVVNCSFBXUjEgKi8KKwlHUElPODlfVVNCSDFfUEVOLAkJLyogVVNCSFBFTjEgKi8KKworCS8qIEkyQyAqLworCUdQSU8xMTdfSTJDX1NDTCwKKwlHUElPMTE4X0kyQ19TREEsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cml6ZXBzNHdsX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCS8qIFNTUCAyICovCisJR1BJTzE0X1NTUDJfU0ZSTSwKKwlHUElPMTlfU1NQMl9TQ0xLLAorCUdQSU81M19HUElPLAkJCS8qIFRSSVpFUFM0X1NQSV9JUlEgKi8KKwlHUElPODZfU1NQMl9SWEQsCisJR1BJTzg3X1NTUDJfVFhELAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE9OQk9BUkQgRkxBU0gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHRyaXplcHM0X3BhcnRpdGlvbnNbXSA9IHsKIAl7CiAJCS5uYW1lID0JCSJCb290bG9hZGVyIiwKIAkJLm9mZnNldCA9CTB4MDAwMDAwMDAsCiAJCS5zaXplID0JCTB4MDAwNDAwMDAsCiAJCS5tYXNrX2ZsYWdzID0JTVREX1dSSVRFQUJMRSAgLyogZm9yY2UgcmVhZC1vbmx5ICovCi0JfSx7CisJfSwgewogCQkubmFtZSA9CQkiQmFja3VwIiwKIAkJLm9mZnNldCA9CTB4MDAwNDAwMDAsCiAJCS5zaXplID0JCTB4MDAwNDAwMDAsCi0JfSx7CisJfSwgewogCQkubmFtZSA9CQkiSW1hZ2UiLAogCQkub2Zmc2V0ID0JMHgwMDA4MDAwMCwKIAkJLnNpemUgPQkJMHgwMTA4MDAwMCwKLQl9LHsKKwl9LCB7CiAJCS5uYW1lID0JCSJJUFNNIiwKIAkJLm9mZnNldCA9CTB4MDExMDAwMDAsCiAJCS5zaXplID0JCTB4MDBlMDAwMDAsCi0JfSx7CisJfSwgewogCQkubmFtZSA9CQkiUmVnaXN0cnkiLAogCQkub2Zmc2V0ID0JMHgwMWYwMDAwMCwKIAkJLnNpemUgPQkJTVREUEFSVF9TSVpfRlVMTCwKQEAgLTEwNSw5ICsyMTEsOSBAQAogCS5udW1fcmVzb3VyY2VzID0gMSwKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERBVklDT00gRE05MDAwIEV0aGVybmV0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG05MDAwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gVFJJWkVQUzRfRVRIX1BIWVMrMHgzMDAsCkBAIC0xMjIsNjcgKzIyOCw2OCBAQAogCVsyXSA9IHsKIAkJLnN0YXJ0CT0gVFJJWkVQUzRfRVRIX0lSUSwKIAkJLmVuZAk9IFRSSVpFUFM0X0VUSF9JUlEsCi0JCS5mbGFncwk9IChJT1JFU09VUkNFX0lSUSB8IElSUV9UWVBFX0VER0VfUklTSU5HKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBkbTkwMDBfcGxhdF9kYXRhIHRyaV9kbTkwMDBfcGxhdGRhdGEgPSB7CisJLmZsYWdzCQk9IERNOTAwMF9QTEFURl8zMkJJVE9OTFksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkbTkwMDBfZGV2aWNlID0gewogCS5uYW1lCQk9ICJkbTkwMDAiLAogCS5pZAkJPSAtMSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZG05MDAwX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gZG05MDAwX3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdHJpX2RtOTAwMF9wbGF0ZGF0YSwKKwl9CiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBYQTI3MCBzZXJpYWwgcG9ydHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdHJpX3NlcmlhbF9wb3J0c1tdID0gewotI2lmZGVmIENPTkZJR19TRVJJQUxfUFhBCi0JLyogdGhpcyB1c2VzIHRoZSBvd24gUFhBIGRyaXZlciAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExFRCdzIG9uIEdQSU8gcGlucyBvZiBQWEEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBncGlvX2xlZCB0cml6ZXBzNF9sZWRbXSA9IHsKKyNpZmRlZiBTVEFUVVNfTEVEU19PTl9TVFVBUlRfUElOUwogCXsKLQkJMCwKLQl9LAotI2Vsc2UKLQkvKiB0aGlzIHVzZXMgdGhlIGdlbmVyaWMgODUyMCBkcml2ZXIgKi8KLQlbMF0gPSB7Ci0JCS5tZW1iYXNlCT0gKHZvaWQgKikmRkZVQVJULAotCQkuaXJxCQk9IElSUV9GRlVBUlQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJLmlvdHlwZQkJPSBVUElPX01FTTMyLAotCQkucmVnc2hpZnQJPSAyLAotCQkudWFydGNsawk9ICg5MjE2MDAqMTYpLAotCX0sCi0JWzFdID0gewotCQkubWVtYmFzZQk9ICh2b2lkICopJkJUVUFSVCwKLQkJLmlycQkJPSBJUlFfQlRVQVJULAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0zMiwKLQkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSAoOTIxNjAwKjE2KSwKKwkJLm5hbWUgPSAibGVkMDpvcmFuZ2U6aGVhcnRiZWF0IiwJLyogKi8KKwkJLmRlZmF1bHRfdHJpZ2dlciA9ICJoZWFydGJlYXQiLAorCQkuZ3BpbyA9IEdQSU9fSEVBUlRCRUFUX0xFRCwKKwkJLmFjdGl2ZV9sb3cgPSAxLAogCX0sCiAJewotCQkwLAorCQkubmFtZSA9ICJsZWQxOnllbGxvdzpjcHVidXN5IiwJCS8qICovCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiY3B1LWJ1c3kiLAorCQkuZ3BpbyA9IEdQSU9fU1lTX0JVU1lfTEVELAorCQkuYWN0aXZlX2xvdyA9IDEsCiAJfSwKICNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWFydF9kZXZpY2VzID0gewotCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCT0gMCwKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSB0cml6ZXBzNF9sZWRfZGF0YSA9IHsKKwkubGVkcwkJPSB0cml6ZXBzNF9sZWQsCisJLm51bV9sZWRzCT0gQVJSQVlfU0laRSh0cml6ZXBzNF9sZWQpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGVkc19kZXZpY2VzID0geworCS5uYW1lCQk9ICJsZWRzLWdwaW8iLAorCS5pZAkJPSAtMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSB0cmlfc2VyaWFsX3BvcnRzLAorCQkucGxhdGZvcm1fZGF0YQk9ICZ0cml6ZXBzNF9sZWRfZGF0YSwKIAl9LAotCS5udW1fcmVzb3VyY2VzCT0gMCwKLQkucmVzb3VyY2UJPSBOVUxMLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiB0cml6ZXBzNF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cml6ZXBzNF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmZmxhc2hfZGV2aWNlLAotCSZ1YXJ0X2RldmljZXMsCiAJJmRtOTAwMF9kZXZpY2UsCisJJmxlZHNfZGV2aWNlcywKIH07CiAKLSNpZmRlZiBDT05GSUdfTUFDSF9UUklaRVBTNF9DT05YUworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRyaXplcHM0d2xfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmZsYXNoX2RldmljZSwKKwkmbGVkc19kZXZpY2VzLAorfTsKKwogc3RhdGljIHNob3J0IHRyaXplcHNfY29ueHNfYmNyOwogCiAvKiBQQ0NBUkQgcG93ZXIgc3dpdGNoaW5nIHN1cHBvcnRzIG9ubHkgMywzViAqLwpAQCAtMTkyLDEwOCArMjk5LDYzIEBACiAJCS8qIHN3aXRjaCBwb3dlciBvbiwgcHV0IGluIHJlc2V0IGFuZCBlbmFibGUgYnVmZmVycyAqLwogCQl0cml6ZXBzX2NvbnhzX2JjciB8PSBwb3dlcjsKIAkJdHJpemVwc19jb254c19iY3IgfD0gQ29uWFNfQkNSX0NGX1JFU0VUOwotCQl0cml6ZXBzX2NvbnhzX2JjciAmPSB+KENvblhTX0JDUl9DRl9CVUZfRU4pOwotCQlDb25YU19CQ1IgPSB0cml6ZXBzX2NvbnhzX2JjcjsKKwkJdHJpemVwc19jb254c19iY3IgJj0gfkNvblhTX0JDUl9DRl9CVUZfRU47CisJCUJDUl93cml0ZXcodHJpemVwc19jb254c19iY3IpOwogCQkvKiB3YWl0IGEgbGl0dGxlICovCiAJCXVkZWxheSgyMDAwKTsKIAkJLyogdGFrZSByZXNldCBhd2F5ICovCi0JCXRyaXplcHNfY29ueHNfYmNyICY9IH4oQ29uWFNfQkNSX0NGX1JFU0VUKTsKLQkJQ29uWFNfQkNSID0gdHJpemVwc19jb254c19iY3I7CisJCXRyaXplcHNfY29ueHNfYmNyICY9IH5Db25YU19CQ1JfQ0ZfUkVTRVQ7CisJCUJDUl93cml0ZXcodHJpemVwc19jb254c19iY3IpOwogCQl1ZGVsYXkoMjAwMCk7CiAJfSBlbHNlIHsKIAkJLyogcHV0IGluIHJlc2V0ICovCiAJCXRyaXplcHNfY29ueHNfYmNyIHw9IENvblhTX0JDUl9DRl9SRVNFVDsKLQkJQ29uWFNfQkNSID0gdHJpemVwc19jb254c19iY3I7CisJCUJDUl93cml0ZXcodHJpemVwc19jb254c19iY3IpOwogCQl1ZGVsYXkoMTAwMCk7CiAJCS8qIHN3aXRjaCBwb3dlciBvZmYgKi8KLQkJdHJpemVwc19jb254c19iY3IgJj0gfigweGYpOwotCQlDb25YU19CQ1IgPSB0cml6ZXBzX2NvbnhzX2JjcjsKLQorCQl0cml6ZXBzX2NvbnhzX2JjciAmPSB+MHhmOworCQlCQ1Jfd3JpdGV3KHRyaXplcHNfY29ueHNfYmNyKTsKIAl9Ci0JcHJfZGVidWcoIiVzOiBvJXMgMHgleFxuIiwgX19mdW5jX18sIHBvd2VyID8gIm4iOiAiZmYiLCB0cml6ZXBzX2NvbnhzX2Jjcik7CisJcHJfZGVidWcoIiVzOiBvJXMgMHgleFxuIiwgX19mdW5jX18sIHBvd2VyID8gIm4iIDogImZmIiwKKwkJCXRyaXplcHNfY29ueHNfYmNyKTsKIH0KK0VYUE9SVF9TWU1CT0woYm9hcmRfcGNtY2lhX3Bvd2VyKTsKIAogLyogYmFja2xpZ2h0IHBvd2VyIHN3aXRjaGluZyBmb3IgTENEIHBhbmVsICovCiBzdGF0aWMgdm9pZCBib2FyZF9iYWNrbGlnaHRfcG93ZXIoaW50IG9uKQogewotCWlmIChvbikgeworCWlmIChvbikKIAkJdHJpemVwc19jb254c19iY3IgfD0gQ29uWFNfQkNSX0xfRElTUDsKLQl9IGVsc2UgeworCWVsc2UKIAkJdHJpemVwc19jb254c19iY3IgJj0gfkNvblhTX0JDUl9MX0RJU1A7Ci0JfQotCXByX2RlYnVnKCIlczogbyVzIDB4JXhcbiIsIF9fZnVuY19fLCBvbiA/ICJuIiA6ICJmZiIsIHRyaXplcHNfY29ueHNfYmNyKTsKLQlDb25YU19CQ1IgPSB0cml6ZXBzX2NvbnhzX2JjcjsKKworCXByX2RlYnVnKCIlczogbyVzIDB4JXhcbiIsIF9fZnVuY19fLCBvbiA/ICJuIiA6ICJmZiIsCisJCQl0cml6ZXBzX2NvbnhzX2Jjcik7CisJQkNSX3dyaXRldyh0cml6ZXBzX2NvbnhzX2Jjcik7CiB9CiAKLS8qIFBvd2Vyc3VwcGx5IGZvciBNTUMvU0QgY2FyZHNsb3QgKi8KLXN0YXRpYyB2b2lkIGJvYXJkX21jaV9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2ZGQpCi17Ci0Jc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhKiBwX2QgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisvKiBhIEkyQyBiYXNlZCBSVEMgaXMga25vd24gb24gQ09OWFMgYm9hcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gdHJpemVwczRfaTJjX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCXsgSTJDX0JPQVJEX0lORk8oInJ0Yy1wY2Y4NTkzIiwgMHg1MSkgfQorfTsKIAotCWlmICgoIDEgPDwgdmRkKSAmIHBfZC0+b2NyX21hc2spIHsKLQkJcHJfZGVidWcoIiVzOiBvblxuIiwgX19mdW5jX18pOwotCQkvKiBGSVhNRSBmaWxsIGluIHZhbHVlcyBoZXJlICovCi0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBvZmZcbiIsIF9fZnVuY19fKTsKLQkJLyogRklYTUUgZmlsbCBpbiB2YWx1ZXMgaGVyZSAqLwotCX0KLX0KLQotc3RhdGljIHNob3J0IHRyaXplcHNfY29ueHNfaXJjcjsKLQotLyogU3dpdGNoIG1vZGVzIGFuZCBQb3dlciBmb3IgSVJEQSByZWNlaXZlciAqLwotc3RhdGljIHZvaWQgYm9hcmRfaXJkYV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAobW9kZSAmIElSX1NJUk1PREUpIHsKLQkJLyogU2xvdyBtb2RlICovCi0JCXRyaXplcHNfY29ueHNfaXJjciAmPSB+Q29uWFNfSVJDUl9NT0RFOwotCX0gZWxzZSBpZiAobW9kZSAmIElSX0ZJUk1PREUpIHsKLQkJLyogRmFzdCBtb2RlICovCi0JCXRyaXplcHNfY29ueHNfaXJjciB8PSBDb25YU19JUkNSX01PREU7Ci0JfQotCXB4YTJ4eF90cmFuc2NlaXZlcl9tb2RlKGRldiwgbW9kZSk7Ci0JaWYgKG1vZGUgJiBJUl9PRkYpIHsKLQkJdHJpemVwc19jb254c19pcmNyIHw9IENvblhTX0lSQ1JfU0Q7Ci0JfSBlbHNlIHsKLQkJdHJpemVwc19jb254c19pcmNyICY9IH5Db25YU19JUkNSX1NEOwotCX0KLQkvKiBGSVhNRSB3cml0ZSB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbHNlCi0vKiBmb3Igb3RoZXIgYmFzZWJvYXJkcyBkZWZpbmUgZHVtbWllcyAqLwotdm9pZCBib2FyZF9wY21jaWFfcG93ZXIoaW50IHBvd2VyKQl7O30KLSNkZWZpbmUgYm9hcmRfYmFja2xpZ2h0X3Bvd2VyCQlOVUxMCi0jZGVmaW5lIGJvYXJkX21jaV9wb3dlcgkJCU5VTEwKLSNkZWZpbmUgYm9hcmRfaXJkYV9tb2RlCQkJTlVMTAotCi0jZW5kaWYJCS8qIENPTkZJR19NQUNIX1RSSVpFUFM0X0NPTlhTICovCi1FWFBPUlRfU1lNQk9MKGJvYXJkX3BjbWNpYV9wb3dlcik7Ci0KLXN0YXRpYyBpbnQgdHJpemVwczRfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IG1jaV9kZXRlY3RfaW50LCB2b2lkICpkYXRhKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1NQyBjYXJkIHNsb3QgZXh0ZXJuYWwgdG8gbW9kdWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdHJpemVwczRfbWNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBpcnFfaGFuZGxlcl90IG1jaV9kZXRlY3RfaW50LAorCQl2b2lkICpkYXRhKQogewogCWludCBlcnI7Ci0JLyogc2V0dXAgR1BJTyBmb3IgUFhBMjd4IE1NQyBjb250cm9sbGVyICovCi0JcHhhX2dwaW9fbW9kZShHUElPMzJfTU1DQ0xLX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8xMTJfTU1DQ01EX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU85Ml9NTUNEQVQwX01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8xMDlfTU1DREFUMV9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMTEwX01NQ0RBVDJfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzExMV9NTUNEQVQzX01EKTsKLQotCXB4YV9ncGlvX21vZGUoR1BJT19NTUNfREVUIHwgR1BJT19JTik7CiAKIAllcnIgPSByZXF1ZXN0X2lycShUUklaRVBTNF9NTUNfSVJRLCBtY2lfZGV0ZWN0X2ludCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkgICJNTUMgY2FyZCBkZXRlY3QiLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgInRyaXplcHM0X21jaV9pbml0OiBNTUMvU0Q6IGNhbid0IHJlcXVlc3QgTU1DIGNhcmQgZGV0ZWN0IElSUVxuIik7Ci0KLQlyZXR1cm4gZXJyOworCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfU0FNUExFX1JBTkRPTSwKKwkJIk1NQyBjYXJkIGRldGVjdCIsIGRhdGEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cml6ZXBzNF9tY2lfaW5pdDogTU1DL1NEOiBjYW4ndCByZXF1ZXN0IgorCQkJCQkJIk1NQyBjYXJkIGRldGVjdCBJUlFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB0cml6ZXBzNF9tY2lfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCkBAIC0zMDMsMzkgKzM2NSw2OSBAQAogCiBzdGF0aWMgc3RydWN0IHB4YW1jaV9wbGF0Zm9ybV9kYXRhIHRyaXplcHM0X21jaV9wbGF0Zm9ybV9kYXRhID0gewogCS5vY3JfbWFzawk9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNCwKKwkuZGV0ZWN0X2RlbGF5CT0gMSwKIAkuaW5pdCAJCT0gdHJpemVwczRfbWNpX2luaXQsCiAJLmV4aXQJCT0gdHJpemVwczRfbWNpX2V4aXQsCi0JLnNldHBvd2VyIAk9IGJvYXJkX21jaV9wb3dlciwKKwkuZ2V0X3JvCQk9IE5VTEwsCS8qIHdyaXRlLXByb3RlY3Rpb24gbm90IHN1cHBvcnRlZCAqLworCS5zZXRwb3dlciAJPSBOVUxMLAkvKiBwb3dlci1zd2l0Y2hpbmcgbm90IHN1cHBvcnRlZCAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgdHJpemVwczRfZmljcF9wbGF0Zm9ybV9kYXRhID0gewotCS50cmFuc2NlaXZlcl9jYXAgID0gSVJfU0lSTU9ERSB8IElSX0ZJUk1PREUgfCBJUl9PRkYsCi0JLnRyYW5zY2VpdmVyX21vZGUgPSBib2FyZF9pcmRhX21vZGUsCi19OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElSREEgbW9kZSBzd2l0Y2hpbmcgb24gc3R1YXJ0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgU1RBVFVTX0xFRFNfT05fU1RVQVJUX1BJTlMKK3N0YXRpYyBzaG9ydCB0cml6ZXBzX2NvbnhzX2lyY3I7CiAKLXN0YXRpYyBpbnQgdHJpemVwczRfb2hjaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgdHJpemVwczRfaXJkYV9zdGFydHVwKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQkvKiBzZXR1cCBQb3J0MSBHUElPIHBpbi4gKi8KLQlweGFfZ3Bpb19tb2RlKCA4OCB8IEdQSU9fQUxUX0ZOXzFfSU4pOwkvKiBVU0JIUFdSMSAqLwotCXB4YV9ncGlvX21vZGUoIDg5IHwgR1BJT19BTFRfRk5fMl9PVVQpOwkvKiBVU0JIUEVOMSAqLwotCi0JLyogU2V0IHRoZSBQb3dlciBDb250cm9sIFBvbGFyaXR5IExvdyBhbmQgUG93ZXIgU2Vuc2UKLQkgICBQb2xhcml0eSBMb3cgdG8gYWN0aXZlIGxvdy4gKi8KLQlVSENIUiA9IChVSENIUiB8IFVIQ0hSX1BDUEwgfCBVSENIUl9QU1BMKSAmCi0JCX4oVUhDSFJfU1NFUDEgfCBVSENIUl9TU0VQMiB8IFVIQ0hSX1NTRVAzIHwgVUhDSFJfU1NFKTsKLQorCXRyaXplcHNfY29ueHNfaXJjciAmPSB+Q29uWFNfSVJDUl9TRDsKKwlJUkNSX3dyaXRldyh0cml6ZXBzX2NvbnhzX2lyY3IpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0cml6ZXBzNF9vaGNpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHJpemVwczRfaXJkYV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JOworCXRyaXplcHNfY29ueHNfaXJjciB8PSBDb25YU19JUkNSX1NEOworCUlSQ1Jfd3JpdGV3KHRyaXplcHNfY29ueHNfaXJjcik7CiB9CiAKK3N0YXRpYyB2b2lkIHRyaXplcHM0X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogU3dpdGNoIG1vZGUgKi8KKwlpZiAobW9kZSAmIElSX1NJUk1PREUpCisJCXRyaXplcHNfY29ueHNfaXJjciAmPSB+Q29uWFNfSVJDUl9NT0RFOwkvKiBTbG93IG1vZGUgKi8KKwllbHNlIGlmIChtb2RlICYgSVJfRklSTU9ERSkgeworCQl0cml6ZXBzX2NvbnhzX2lyY3IgfD0gQ29uWFNfSVJDUl9NT0RFOwkvKiBGYXN0IG1vZGUgKi8KKworCS8qIFN3aXRjaCBwb3dlciAqLworCWlmIChtb2RlICYgSVJfT0ZGKQorCQl0cml6ZXBzX2NvbnhzX2lyY3IgfD0gQ29uWFNfSVJDUl9TRDsKKwllbHNlCisJCXRyaXplcHNfY29ueHNfaXJjciAmPSB+Q29uWFNfSVJDUl9TRDsKKworCUlSQ1Jfd3JpdGV3KHRyaXplcHNfY29ueHNfaXJjcik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcHhhMnh4X3RyYW5zY2VpdmVyX21vZGUoZGV2LCBtb2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBweGFmaWNwX3BsYXRmb3JtX2RhdGEgdHJpemVwczRfZmljcF9wbGF0Zm9ybV9kYXRhID0geworCS50cmFuc2NlaXZlcl9jYXAJPSBJUl9TSVJNT0RFIHwgSVJfRklSTU9ERSB8IElSX09GRiwKKwkudHJhbnNjZWl2ZXJfbW9kZQk9IHRyaXplcHM0X2lyZGFfdHJhbnNjZWl2ZXJfbW9kZSwKKwkuc3RhcnR1cAkJPSB0cml6ZXBzNF9pcmRhX3N0YXJ0dXAsCisJLnNodXRkb3duCQk9IHRyaXplcHM0X2lyZGFfc2h1dGRvd24sCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPSENJIFVTQiBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBzdHJ1Y3QgcHhhb2hjaV9wbGF0Zm9ybV9kYXRhIHRyaXplcHM0X29oY2lfcGxhdGZvcm1fZGF0YSA9IHsKIAkucG9ydF9tb2RlCT0gUE1NX1BFUlBPUlRfTU9ERSwKLQkuaW5pdAkJPSB0cml6ZXBzNF9vaGNpX2luaXQsCi0JLmV4aXQJCT0gdHJpemVwczRfb2hjaV9leGl0LAorCS5mbGFncwkJPSBFTkFCTEVfUE9SVF9BTEwgfCBQT1dFUl9DT05UUk9MX0xPVyB8IFBPV0VSX1NFTlNFX0xPVywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdHJpemVwczRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CkBAIC0zNzIsMTA1ICs0NjQsODAgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIHNoYXJwX2xjZF9tb2RlID0gewotICAgIC5waXhjbG9jawkJPSA3ODAwMCwKLSAgICAueHJlcwkJPSA2NDAsCi0gICAgLnlyZXMJCT0gNDgwLAotICAgIC5icHAJCT0gOCwKLSAgICAuaHN5bmNfbGVuCQk9IDQsCi0gICAgLmxlZnRfbWFyZ2luCT0gNCwKLSAgICAucmlnaHRfbWFyZ2luCT0gNCwKLSAgICAudnN5bmNfbGVuCQk9IDIsCi0gICAgLnVwcGVyX21hcmdpbgk9IDAsCi0gICAgLmxvd2VyX21hcmdpbgk9IDAsCi0gICAgLnN5bmMJCT0gRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCi0gICAgLmNtYXBfZ3JleXNjYWxlCT0gMCwKKwkucGl4Y2xvY2sJPSA3ODAwMCwKKwkueHJlcwkJPSA2NDAsCisJLnlyZXMJCT0gNDgwLAorCS5icHAJCT0gOCwKKwkuaHN5bmNfbGVuCT0gNCwKKwkubGVmdF9tYXJnaW4JPSA0LAorCS5yaWdodF9tYXJnaW4JPSA0LAorCS52c3luY19sZW4JPSAyLAorCS51cHBlcl9tYXJnaW4JPSAwLAorCS5sb3dlcl9tYXJnaW4JPSAwLAorCS5zeW5jCQk9IEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCS5jbWFwX2dyZXlzY2FsZQk9IDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHB4YWZiX21hY2hfaW5mbyBzaGFycF9sY2QgPSB7Ci0gICAgLm1vZGVzCQk9ICZzaGFycF9sY2RfbW9kZSwKLSAgICAubnVtX21vZGVzCT0gMSwKLSAgICAuY21hcF9pbnZlcnNlCT0gMCwKLSAgICAuY21hcF9zdGF0aWMJPSAwLAotICAgIC5sY2NyMAkJPSBMQ0NSMF9Db2xvciB8IExDQ1IwX1BhcyB8IExDQ1IwX0R1YWwsCi0gICAgLmxjY3IzCQk9IDB4MDM0MGZmMDIsCi0gICAgLnB4YWZiX2JhY2tsaWdodF9wb3dlciA9IGJvYXJkX2JhY2tsaWdodF9wb3dlciwKKwkubW9kZXMJCT0gJnNoYXJwX2xjZF9tb2RlLAorCS5udW1fbW9kZXMJPSAxLAorCS5sY2RfY29ubgk9IExDRF9DT0xPUl9EU1ROXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorCS5jbWFwX2ludmVyc2UJPSAwLAorCS5jbWFwX3N0YXRpYwk9IDAsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlciA9IGJvYXJkX2JhY2tsaWdodF9wb3dlciwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvIHRvc2hpYmFfbGNkX21vZGUgPSB7Ci0gICAgLnBpeGNsb2NrCQk9IDM5NzIwLAotICAgIC54cmVzCQk9IDY0MCwKLSAgICAueXJlcwkJPSA0ODAsCi0gICAgLmJwcAkJPSA4LAotICAgIC5oc3luY19sZW4JCT0gNjMsCi0gICAgLmxlZnRfbWFyZ2luCT0gMTIsCi0gICAgLnJpZ2h0X21hcmdpbgk9IDEyLAotICAgIC52c3luY19sZW4JCT0gNCwKLSAgICAudXBwZXJfbWFyZ2luCT0gMzIsCi0gICAgLmxvd2VyX21hcmdpbgk9IDEwLAotICAgIC5zeW5jCQk9IDAsCi0gICAgLmNtYXBfZ3JleXNjYWxlCT0gMCwKKwkucGl4Y2xvY2sJPSAzOTcyMCwKKwkueHJlcwkJPSA2NDAsCisJLnlyZXMJCT0gNDgwLAorCS5icHAJCT0gOCwKKwkuaHN5bmNfbGVuCT0gNjMsCisJLmxlZnRfbWFyZ2luCT0gMTIsCisJLnJpZ2h0X21hcmdpbgk9IDEyLAorCS52c3luY19sZW4JPSA0LAorCS51cHBlcl9tYXJnaW4JPSAzMiwKKwkubG93ZXJfbWFyZ2luCT0gMTAsCisJLnN5bmMJCT0gMCwKKwkuY21hcF9ncmV5c2NhbGUJPSAwLAogfTsKIAogc3RhdGljIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gdG9zaGliYV9sY2QgPSB7Ci0gICAgLm1vZGVzCQk9ICZ0b3NoaWJhX2xjZF9tb2RlLAotICAgIC5udW1fbW9kZXMJPSAxLAotICAgIC5jbWFwX2ludmVyc2UJPSAwLAotICAgIC5jbWFwX3N0YXRpYwk9IDAsCi0gICAgLmxjY3IwCQk9IExDQ1IwX0NvbG9yIHwgTENDUjBfQWN0LAotICAgIC5sY2NyMwkJPSAweDAzNDAwMDAyLAotICAgIC5weGFmYl9iYWNrbGlnaHRfcG93ZXIgPSBib2FyZF9iYWNrbGlnaHRfcG93ZXIsCisJLm1vZGVzCQk9ICZ0b3NoaWJhX2xjZF9tb2RlLAorCS5udW1fbW9kZXMJPSAxLAorCS5sY2RfY29ubgk9IChMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMKSwKKwkuY21hcF9pbnZlcnNlCT0gMCwKKwkuY21hcF9zdGF0aWMJPSAwLAorCS5weGFmYl9iYWNrbGlnaHRfcG93ZXIgPSBib2FyZF9iYWNrbGlnaHRfcG93ZXIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdHJpemVwczRfaW5pdCh2b2lkKQogewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHRyaXplcHM0X2RldmljZXMsIEFSUkFZX1NJWkUodHJpemVwczRfZGV2aWNlcykpOworCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKHRyaXplcHM0X3Bpbl9jb25maWcpKTsKKwlpZiAobWFjaGluZV9pc190cml6ZXBzNHdsKCkpIHsKKwkJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUodHJpemVwczR3bF9waW5fY29uZmlnKSk7CisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHRyaXplcHM0d2xfZGV2aWNlcywKKwkJCQkJQVJSQVlfU0laRSh0cml6ZXBzNHdsX2RldmljZXMpKTsKKwl9IGVsc2UgeworCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh0cml6ZXBzNF9kZXZpY2VzLAorCQkJCQlBUlJBWV9TSVpFKHRyaXplcHM0X2RldmljZXMpKTsKKwl9CiAKLS8qCXNldF9weGFfZmJfaW5mbygmc2hhcnBfbGNkKTsgKi8KLQlzZXRfcHhhX2ZiX2luZm8oJnRvc2hpYmFfbGNkKTsKKwlpZiAoMCkJLyogZG9udCBrbm93IGhvdyB0byBkZXRlcm1pbmUgTENEICovCisJCXNldF9weGFfZmJfaW5mbygmc2hhcnBfbGNkKTsKKwllbHNlCisJCXNldF9weGFfZmJfaW5mbygmdG9zaGliYV9sY2QpOwogCiAJcHhhX3NldF9tY2lfaW5mbygmdHJpemVwczRfbWNpX3BsYXRmb3JtX2RhdGEpOworI2lmbmRlZiBTVEFUVVNfTEVEU19PTl9TVFVBUlRfUElOUwogCXB4YV9zZXRfZmljcF9pbmZvKCZ0cml6ZXBzNF9maWNwX3BsYXRmb3JtX2RhdGEpOworI2VuZGlmCiAJcHhhX3NldF9vaGNpX2luZm8oJnRyaXplcHM0X29oY2lfcGxhdGZvcm1fZGF0YSk7CiAJcHhhX3NldF9hYzk3X2luZm8oTlVMTCk7Ci19CisJcHhhX3NldF9pMmNfaW5mbyhOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCB0cml6ZXBzNF9pMmNfZGV2aWNlcywKKwkJCQkJQVJSQVlfU0laRSh0cml6ZXBzNF9pMmNfZGV2aWNlcykpOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgdHJpemVwczRfbWFwX2lvKHZvaWQpCi17Ci0JcHhhX21hcF9pbygpOwotCWlvdGFibGVfaW5pdCh0cml6ZXBzNF9pb19kZXNjLCBBUlJBWV9TSVpFKHRyaXplcHM0X2lvX2Rlc2MpKTsKLQotCS8qIGZvciBEaXNrT25DaGlwICovCi0JcHhhX2dwaW9fbW9kZShHUElPMTVfbkNTXzFfTUQpOwotCi0JLyogZm9yIG9mZi1tb2R1bGUgUElDIG9uIENvblhTIGJvYXJkICovCi0JcHhhX2dwaW9fbW9kZShHUElPX1BJQyB8IEdQSU9fSU4pOwotCi0JLyogVUNCMTQwMCBpcnEgKi8KLQlweGFfZ3Bpb19tb2RlKEdQSU9fVUNCMTQwMCB8IEdQSU9fSU4pOwotCi0JLyogZm9yIERNOTAwMCBMQU4gKi8KLQlweGFfZ3Bpb19tb2RlKEdQSU83OF9uQ1NfMl9NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPX0RNOTAwMCB8IEdQSU9fSU4pOwotCi0JLyogZm9yIFBDTUNJQSBkZXZpY2UgKi8KLQlweGFfZ3Bpb19tb2RlKEdQSU9fUENEIHwgR1BJT19JTik7Ci0JcHhhX2dwaW9fbW9kZShHUElPX1BSRFkgfCBHUElPX0lOKTsKLQotCS8qIGZvciBJMkMgYWRhcHRlciAqLwotCXB4YV9ncGlvX21vZGUoR1BJTzExN19JMkNTQ0xfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzExOF9JMkNTREFfTUQpOwotCi0JLyogTU1DX0RFVCBzLm8uICovCi0JcHhhX2dwaW9fbW9kZShHUElPX01NQ19ERVQgfCBHUElPX0lOKTsKLQotCS8qIHdoYXRzIHRoYXQgZm9yID8/PyAqLwotCXB4YV9ncGlvX21vZGUoR1BJTzc5X25DU18zX01EKTsKLQotI2lmZGVmIENPTkZJR19MRURTCi0JcHhhX2dwaW9fbW9kZSggR1BJT19TWVNfQlVTWV9MRUQgIHwgR1BJT19PVVQpOwkJLyogTEVEMSAqLwotCXB4YV9ncGlvX21vZGUoIEdQSU9fSEVBUlRCRUFUX0xFRCB8IEdQSU9fT1VUKTsJCS8qIExFRDIgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19NQUNIX1RSSVpFUFM0X0NPTlhTCiAjaWZkZWYgQ09ORklHX0lERV9QWEFfQ0YKIAkvKiBpZiBib290IGRpcmVjdCBmcm9tIGNvbXBhY3QgZmxhc2ggZG9udCBkaXNhYmxlIHBvd2VyICovCiAJdHJpemVwc19jb254c19iY3IgPSAweDAwMDk7CkBAIC00NzgsMTggKzU0NSwyNCBAQAogCS8qIHRoaXMgaXMgdGhlIHJlc2V0IHZhbHVlICovCiAJdHJpemVwc19jb254c19iY3IgPSAweDAwQTA7CiAjZW5kaWYKLQlDb25YU19CQ1IgPSB0cml6ZXBzX2NvbnhzX2JjcjsKLSNlbmRpZgorCUJDUl93cml0ZXcodHJpemVwc19jb254c19iY3IpOworCWJvYXJkX2JhY2tsaWdodF9wb3dlcigxKTsKK30KIAotI3dhcm5pbmcgRklYTUUgLSBhY2Nlc3NpbmcgUE0gcmVnaXN0ZXJzIGRpcmVjdGx5IGlzIGRlcHJlY2F0ZWQKLQlQV0VSICA9IDB4MDAwMDAwMDI7Ci0JUEZFUiAgPSAweDAwMDAwMDAwOwotCVBSRVIgID0gMHgwMDAwMDAwMjsKLQlQR1NSMCA9IDB4MDE1OEMwMDA7Ci0JUEdTUjEgPSAweDAwRkYwMDgwOwotCVBHU1IyID0gMHgwMDAxQzAwNDsKLQkvKiBTdG9wIDMuNk1IeiBhbmQgZHJpdmUgSElHSCB0byBQQ01DSUEgYW5kIENTICovCi0JUENGUiB8PSBQQ0ZSX09QREU7CitzdGF0aWMgdm9pZCBfX2luaXQgdHJpemVwczRfbWFwX2lvKHZvaWQpCit7CisJcHhhX21hcF9pbygpOworCWlvdGFibGVfaW5pdCh0cml6ZXBzNF9pb19kZXNjLCBBUlJBWV9TSVpFKHRyaXplcHM0X2lvX2Rlc2MpKTsKKworCWlmICgoTVNDMCAmIDB4OCkgJiYgKEJPT1RfREVGICYgMHgxKSkgeworCQkvKiBpZiBmbGFzaCBpcyAxNiBiaXQgd2lkZSBpdHMgYSBUcml6ZXBzNCBXTCAqLworCQlfX21hY2hpbmVfYXJjaF90eXBlID0gTUFDSF9UWVBFX1RSSVpFUFM0V0w7CisJCXRyaXplcHM0X2ZsYXNoX2RhdGFbMF0ud2lkdGggPSAyOworCX0gZWxzZSB7CisJCS8qIGlmIGZsYXNoIGlzIDMyIGJpdCB3aWRlIGl0cyBhIFRyaXplcHM0ICovCisJCV9fbWFjaGluZV9hcmNoX3R5cGUgPSBNQUNIX1RZUEVfVFJJWkVQUzQ7CisJCXRyaXplcHM0X2ZsYXNoX2RhdGFbMF0ud2lkdGggPSA0OworCX0KIH0KIAogTUFDSElORV9TVEFSVChUUklaRVBTNCwgIktlaXRoIHVuZCBLb2VwIFRyaXplcHMgSVYgbW9kdWxlIikKQEAgLTUwMywzICs1NzYsMTMgQEAKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIE1BQ0hJTkVfRU5ECiAKK01BQ0hJTkVfU1RBUlQoVFJJWkVQUzRXTCwgIktlaXRoIHVuZCBLb2VwIFRyaXplcHMgSVYtV0wgbW9kdWxlIikKKwkvKiBNQUlOVEFJTkVSKCJKw7xyZ2VuIFNjaGluZGVsZSIpICovCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFRSSVpFUFM0X1NEUkFNX0JBU0UgKyAweDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gdHJpemVwczRfaW5pdCwKKwkubWFwX2lvCQk9IHRyaXplcHM0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZweGFfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzMTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKQEAgLTAsMCArMSw5ODMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYworICoKKyAqICBTdXBwb3J0IGZvciB0aGUgQXJjb20gVklQRVIgU0JDLgorICoKKyAqICBBdXRob3I6CUlhbiBDYW1wYmVsbAorICogIENyZWF0ZWQ6ICAgIEZlYiAwMywgMjAwMworICogIENvcHlyaWdodDogIEFyY29tIENvbnRyb2wgU3lzdGVtcworICoKKyAqICBNYWludGFpbmVkIGJ5IE1hcmMgWnluZ2llciA8bWF6QG1pc3RlcmpvbmVzLm9yZz4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFyYy56eW5naWVyQGFsdHJhbi5jb20+CisgKgorICogQmFzZWQgb24gbHViYm9jay5jOgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CUp1biAxNSwgMjAwMQorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTE2eC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvYml0ZmllbGQuaD4KKyNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgorI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI1eC5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC92aXBlci5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGljcjsKKworc3RhdGljIHZvaWQgdmlwZXJfaWNyX3NldF9iaXQodW5zaWduZWQgaW50IGJpdCkKK3sKKwlpY3IgfD0gYml0OworCVZJUEVSX0lDUiA9IGljcjsKK30KKworc3RhdGljIHZvaWQgdmlwZXJfaWNyX2NsZWFyX2JpdCh1bnNpZ25lZCBpbnQgYml0KQoreworCWljciAmPSB+Yml0OworCVZJUEVSX0lDUiA9IGljcjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZyb20gdGhlIHBjbWNpYSBtb2R1bGUgdG8gcmVzZXQgdGhlIENGICovCit2b2lkIHZpcGVyX2NmX3JzdChpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlKQorCQl2aXBlcl9pY3Jfc2V0X2JpdChWSVBFUl9JQ1JfQ0ZfUlNUKTsKKwllbHNlCisJCXZpcGVyX2ljcl9jbGVhcl9iaXQoVklQRVJfSUNSX0NGX1JTVCk7Cit9CitFWFBPUlRfU1lNQk9MKHZpcGVyX2NmX3JzdCk7CisKKy8qCisgKiBUaGUgQ1BMRCB2ZXJzaW9uIHJlZ2lzdGVyIHdhcyBub3QgcHJlc2VudCBvbiBWSVBFUiBib2FyZHMgcHJpb3IgdG8KKyAqIHYyaTEuIE9uIHYxIGJvYXJkcyB3aGVyZSB0aGUgdmVyc2lvbiByZWdpc3RlciBpcyBub3QgcHJlc2VudCB3ZQorICogd2lsbCBqdXN0IHJlYWQgYmFjayB0aGUgcHJldmlvdXMgdmFsdWUgZnJvbSB0aGUgZGF0YWJ1cy4KKyAqCisgKiBUaGVyZWZvcmUgd2UgZG8gdHdvIHJlYWRzLiBUaGUgZmlyc3QgdGltZSB3ZSB3cml0ZSAwIHRvIHRoZQorICogKHJlYWQtb25seSkgcmVnaXN0ZXIgYmVmb3JlIHJlYWRpbmcgYW5kIHRoZSBzZWNvbmQgdGltZSB3ZSB3cml0ZQorICogMHhmZiBmaXJzdC4gSWYgdGhlIHR3byByZWFkcyBkbyBub3QgbWF0Y2ggb3IgdGhleSByZWFkIGJhY2sgYXMgMHhmZgorICogb3IgMHgwMCB0aGVuIHdlIGhhdmUgdmVyc2lvbiAxIGhhcmR3YXJlLgorICovCitzdGF0aWMgdTggdmlwZXJfaHdfdmVyc2lvbih2b2lkKQoreworCXU4IHYxLCB2MjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJVklQRVJfVkVSU0lPTiA9IDA7CisJdjEgPSBWSVBFUl9WRVJTSU9OOworCVZJUEVSX1ZFUlNJT04gPSAweGZmOworCXYyID0gVklQRVJfVkVSU0lPTjsKKworCXYxID0gKHYxICE9IHYyIHx8IHYxID09IDB4ZmYpID8gMCA6IHYxOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiB2MTsKK30KKworLyogQ1BVIHN5c2RldiAqLworc3RhdGljIGludCB2aXBlcl9jcHVfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJdmlwZXJfaWNyX3NldF9iaXQoVklQRVJfSUNSX1JfRElTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXBlcl9jcHVfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJdmlwZXJfaWNyX2NsZWFyX2JpdChWSVBFUl9JQ1JfUl9ESVMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgdmlwZXJfY3B1X3N5c2Rldl9kcml2ZXIgPSB7CisJLnN1c3BlbmQJPSB2aXBlcl9jcHVfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHZpcGVyX2NwdV9yZXN1bWUsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfdm9sdGFnZV9kaXZpc29yOworCisvKgorICogSWYgZm9yY2UgaXMgbm90IHRydWUgdGhlbiBzdGVwIGZyb20gZXhpc3RpbmcgdG8gbmV3IGRpdmlzb3IuIElmCisgKiBmb3JjZSBpcyB0cnVlIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgbmV3IGRpdmlzb3IuIFN0ZXBwaW5nIGlzCisgKiB1c2VkIGJlY2F1c2UgaWYgdGhlIGp1bXAgaW4gdm9sdGFnZSBpcyB0b28gbGFyZ2UsIHRoZSBWQ0MgY2FuIGRpcAorICogdG9vIGxvdyBhbmQgdGhlIHJlZ3VsYXRvciBjdXRzIG91dC4KKyAqCisgKiBmb3JjZSBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBkaXZpc29yIHRvIGEga25vdyBzdGF0ZSBieQorICogc2V0dGluZyB0aGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGNsb2NrIHNwZWVkLCBzaW5jZSB3ZSBhcmUgYWxyZWFkeQorICogcnVubmluZyBhdCB0aGF0IHNwZWVkIHdlIGtub3cgdGhlIHZvbHRhZ2Ugc2hvdWxkIGJlIHByZXR0eSBjbG9zZSBzbworICogdGhlIGp1bXAgd29uJ3QgYmUgdG9vIGxhcmdlCisgKi8KK3N0YXRpYyB2b2lkIHZpcGVyX3NldF9jb3JlX2NwdV92b2x0YWdlKHVuc2lnbmVkIGxvbmcga2h6LCBpbnQgZm9yY2UpCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGludCBkaXZpc29yID0gMDsKKwljb25zdCBjaGFyICp2OworCisJaWYgKGtoeiA8IDIwMDAwMCkgeworCQl2ID0gIjEuMCI7IGRpdmlzb3IgPSAweGZmZjsKKwl9IGVsc2UgaWYgKGtoeiA8IDMwMDAwMCkgeworCQl2ID0gIjEuMSI7IGRpdmlzb3IgPSAweGRlNTsKKwl9IGVsc2UgeworCQl2ID0gIjEuMyI7IGRpdmlzb3IgPSAweDMyNTsKKwl9CisKKwlwcl9kZWJ1ZygidmlwZXI6IHNldHRpbmcgQ1BVIGNvcmUgdm9sdGFnZSB0byAlc1YgYXQgJWQuJTAzZE1IelxuIiwKKwkJIHYsIChpbnQpa2h6IC8gMTAwMCwgKGludClraHogJSAxMDAwKTsKKworI2RlZmluZSBTVEVQIDB4MTAwCisJZG8geworCQlpbnQgc3RlcDsKKworCQlpZiAoZm9yY2UpCisJCQlzdGVwID0gZGl2aXNvcjsKKwkJZWxzZSBpZiAoY3VycmVudF92b2x0YWdlX2Rpdmlzb3IgPCBkaXZpc29yIC0gU1RFUCkKKwkJCXN0ZXAgPSBjdXJyZW50X3ZvbHRhZ2VfZGl2aXNvciArIFNURVA7CisJCWVsc2UgaWYgKGN1cnJlbnRfdm9sdGFnZV9kaXZpc29yID4gZGl2aXNvciArIFNURVApCisJCQlzdGVwID0gY3VycmVudF92b2x0YWdlX2Rpdmlzb3IgLSBTVEVQOworCQllbHNlCisJCQlzdGVwID0gZGl2aXNvcjsKKwkJZm9yY2UgPSAwOworCisJCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1BTVV9DTEtfR1BJTywgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1BTVV9uQ1NfTERfR1BJTywgMCk7CisKKwkJZm9yIChpID0gMSA8PCAxMSA7IGkgPiAwIDsgaSA+Pj0gMSkgeworCQkJdWRlbGF5KDEpOworCisJCQlncGlvX3NldF92YWx1ZShWSVBFUl9QU1VfREFUQV9HUElPLCBzdGVwICYgaSk7CisJCQl1ZGVsYXkoMSk7CisKKwkJCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1BTVV9DTEtfR1BJTywgMSk7CisJCQl1ZGVsYXkoMSk7CisKKwkJCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1BTVV9DTEtfR1BJTywgMCk7CisJCX0KKwkJdWRlbGF5KDEpOworCisJCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1BTVV9uQ1NfTERfR1BJTywgMSk7CisJCXVkZWxheSgxKTsKKworCQlncGlvX3NldF92YWx1ZShWSVBFUl9QU1VfbkNTX0xEX0dQSU8sIDApOworCisJCWN1cnJlbnRfdm9sdGFnZV9kaXZpc29yID0gc3RlcDsKKwl9IHdoaWxlIChjdXJyZW50X3ZvbHRhZ2VfZGl2aXNvciAhPSBkaXZpc29yKTsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aXBlcl9pcnFfZW5hYmxlZF9tYXNrOworc3RhdGljIGNvbnN0IGludCB2aXBlcl9pc2FfaXJxc1tdID0geyAzLCA0LCA1LCA2LCA3LCAxMCwgMTEsIDEyLCA5LCAxNCwgMTUgfTsKK3N0YXRpYyBjb25zdCBpbnQgdmlwZXJfaXNhX2lycV9tYXBbXSA9IHsKKwkwLAkJLyogSVNBIGlycSAjMCwgaW52YWxpZCAqLworCTAsCQkvKiBJU0EgaXJxICMxLCBpbnZhbGlkICovCisJMCwJCS8qIElTQSBpcnEgIzIsIGludmFsaWQgKi8KKwkxIDw8IDAsCQkvKiBJU0EgaXJxICMzICovCisJMSA8PCAxLAkJLyogSVNBIGlycSAjNCAqLworCTEgPDwgMiwJCS8qIElTQSBpcnEgIzUgKi8KKwkxIDw8IDMsCQkvKiBJU0EgaXJxICM2ICovCisJMSA8PCA0LAkJLyogSVNBIGlycSAjNyAqLworCTAsCQkvKiBJU0EgaXJxICM4LCBpbnZhbGlkICovCisJMSA8PCA4LAkJLyogSVNBIGlycSAjOSAqLworCTEgPDwgNSwJCS8qIElTQSBpcnEgIzEwICovCisJMSA8PCA2LAkJLyogSVNBIGlycSAjMTEgKi8KKwkxIDw8IDcsCQkvKiBJU0EgaXJxICMxMiAqLworCTAsCQkvKiBJU0EgaXJxICMxMywgaW52YWxpZCAqLworCTEgPDwgOSwJCS8qIElTQSBpcnEgIzE0ICovCisJMSA8PCAxMCwJLyogSVNBIGlycSAjMTUgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHZpcGVyX2lycV90b19iaXRtYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIHZpcGVyX2lzYV9pcnFfbWFwW2lycSAtIFBYQV9JU0FfSVJRKDApXTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmlwZXJfYml0X3RvX2lycShpbnQgYml0KQoreworCXJldHVybiB2aXBlcl9pc2FfaXJxc1tiaXRdICsgUFhBX0lTQV9JUlEoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpcGVyX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgdmlwZXJfaXJxID0gdmlwZXJfaXJxX3RvX2JpdG1hc2soaXJxKTsKKworCWlmICh2aXBlcl9pcnEgJiAweGZmKQorCQlWSVBFUl9MT19JUlFfU1RBVFVTID0gdmlwZXJfaXJxOworCWVsc2UKKwkJVklQRVJfSElfSVJRX1NUQVRVUyA9ICh2aXBlcl9pcnEgPj4gOCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpcGVyX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdmlwZXJfaXJxX2VuYWJsZWRfbWFzayAmPSB+KHZpcGVyX2lycV90b19iaXRtYXNrKGlycSkpOworfQorCitzdGF0aWMgdm9pZCB2aXBlcl91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdmlwZXJfaXJxX2VuYWJsZWRfbWFzayB8PSB2aXBlcl9pcnFfdG9fYml0bWFzayhpcnEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlwZXJfaXJxX3BlbmRpbmcodm9pZCkKK3sKKwlyZXR1cm4gKFZJUEVSX0hJX0lSUV9TVEFUVVMgPDwgOCB8IFZJUEVSX0xPX0lSUV9TVEFUVVMpICYKKwkJCXZpcGVyX2lycV9lbmFibGVkX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHZpcGVyX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmc7CisKKwlwZW5kaW5nID0gdmlwZXJfaXJxX3BlbmRpbmcoKTsKKwlkbyB7CisJCS8qIHdlJ3JlIGluIGEgY2hhaW5lZCBpcnEgaGFuZGxlciwKKwkJICogc28gYWNrIHRoZSBpbnRlcnJ1cHQgYnkgaGFuZCAqLworCQlHRURSKFZJUEVSX0NQTERfR1BJTykgPSBHUElPX2JpdChWSVBFUl9DUExEX0dQSU8pOworCisJCWlmIChsaWtlbHkocGVuZGluZykpIHsKKwkJCWlycSA9IHZpcGVyX2JpdF90b19pcnEoX19mZnMocGVuZGluZykpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CisJCX0KKwkJcGVuZGluZyA9IHZpcGVyX2lycV9wZW5kaW5nKCk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdmlwZXJfaXJxX2NoaXAgPSB7CisJLm5hbWUJPSAiSVNBIiwKKwkuYWNrCT0gdmlwZXJfYWNrX2lycSwKKwkubWFzawk9IHZpcGVyX21hc2tfaXJxLAorCS51bm1hc2sJPSB2aXBlcl91bm1hc2tfaXJxCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdmlwZXJfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgbGV2ZWw7CisJaW50IGlzYV9pcnE7CisKKwlweGEyNXhfaW5pdF9pcnEoKTsKKworCS8qIHNldHVwIElTQSBJUlFzICovCisJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgQVJSQVlfU0laRSh2aXBlcl9pc2FfaXJxcyk7IGxldmVsKyspIHsKKwkJaXNhX2lycSA9IHZpcGVyX2JpdF90b19pcnEobGV2ZWwpOworCQlzZXRfaXJxX2NoaXAoaXNhX2lycSwgJnZpcGVyX2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlzYV9pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaXNhX2lycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCX0KKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGdwaW9fdG9faXJxKFZJUEVSX0NQTERfR1BJTyksCisJCQkJdmlwZXJfaXJxX2hhbmRsZXIpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShWSVBFUl9DUExEX0dQSU8pLCBJUlFfVFlQRV9FREdFX0JPVEgpOworCisjaWZuZGVmIENPTkZJR19TRVJJQUxfUFhBCisJLyoKKwkgKiA4MjUwIGRvZXNuJ3Qgc3VwcG9ydCBJUlFfVFlQRSBiZWluZyBwYXNzZWQgYXMgcGFydAorCSAqIG9mIHRoZSBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzdHJ1Y3R1cmUuLi4KKwkgKi8KKwlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoVklQRVJfVUFSVEFfR1BJTyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKwlzZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoVklQRVJfVUFSVEJfR1BJTyksIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKyNlbmRpZgorfQorCisvKiBGbGF0IFBhbmVsICovCitzdGF0aWMgc3RydWN0IHB4YWZiX21vZGVfaW5mbyBmYl9tb2RlX2luZm9bXSA9IHsKKwl7CisJCS5waXhjbG9jawk9IDE1NzUwMCwKKworCQkueHJlcwkJPSAzMjAsCisJCS55cmVzCQk9IDI0MCwKKworCQkuYnBwCQk9IDE2LAorCisJCS5oc3luY19sZW4JPSA2MywKKwkJLmxlZnRfbWFyZ2luCT0gNywKKwkJLnJpZ2h0X21hcmdpbgk9IDEzLAorCisJCS52c3luY19sZW4JPSAyMCwKKwkJLnVwcGVyX21hcmdpbgk9IDAsCisJCS5sb3dlcl9tYXJnaW4JPSAwLAorCisJCS5zeW5jCQk9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIGZiX2luZm8gPSB7CisJLm1vZGVzCQkJPSBmYl9tb2RlX2luZm8sCisJLm51bV9tb2RlcwkJPSAxLAorCS5sY2RfY29ubgkJPSBMQ0RfQ09MT1JfVEZUXzE2QlBQIHwgTENEX1BDTEtfRURHRV9GQUxMLAorfTsKKworc3RhdGljIGludCB2aXBlcl9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCS8qIEdQSU85IGFuZCAxMCBjb250cm9sIEZCIGJhY2tsaWdodC4gSW5pdGlhbGlzZSB0byBvZmYgKi8KKwlyZXQgPSBncGlvX3JlcXVlc3QoVklQRVJfQkNLTElHSFRfRU5fR1BJTywgIkJhY2tsaWdodCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlcXVlc3RfYmNrbDsKKworCXJldCA9IGdwaW9fcmVxdWVzdChWSVBFUl9MQ0RfRU5fR1BJTywgIkxDRCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlcXVlc3RfbGNkOworCisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFZJUEVSX0JDS0xJR0hUX0VOX0dQSU8sIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2RpcjsKKworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChWSVBFUl9MQ0RfRU5fR1BJTywgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGlyOworCisJcmV0dXJuIDA7CisKK2Vycl9kaXI6CisJZ3Bpb19mcmVlKFZJUEVSX0xDRF9FTl9HUElPKTsKK2Vycl9yZXF1ZXN0X2xjZDoKKwlncGlvX2ZyZWUoVklQRVJfQkNLTElHSFRfRU5fR1BJTyk7CitlcnJfcmVxdWVzdF9iY2tsOgorCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldHVwIExDRCBHUElPc1xuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpcGVyX2JhY2tsaWdodF9ub3RpZnkoaW50IGJyaWdodG5lc3MpCit7CisJZ3Bpb19zZXRfdmFsdWUoVklQRVJfTENEX0VOX0dQSU8sICEhYnJpZ2h0bmVzcyk7CisJZ3Bpb19zZXRfdmFsdWUoVklQRVJfQkNLTElHSFRfRU5fR1BJTywgISFicmlnaHRuZXNzKTsKKworCXJldHVybiBicmlnaHRuZXNzOworfQorCitzdGF0aWMgdm9pZCB2aXBlcl9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZ3Bpb19mcmVlKFZJUEVSX0xDRF9FTl9HUElPKTsKKwlncGlvX2ZyZWUoVklQRVJfQkNLTElHSFRfRU5fR1BJTyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHZpcGVyX2JhY2tsaWdodF9kYXRhID0geworCS5wd21faWQJCT0gMCwKKwkubWF4X2JyaWdodG5lc3MJPSAxMDAsCisJLmRmdF9icmlnaHRuZXNzCT0gMTAwLAorCS5wd21fcGVyaW9kX25zCT0gMTAwMDAwMCwKKwkuaW5pdAkJPSB2aXBlcl9iYWNrbGlnaHRfaW5pdCwKKwkubm90aWZ5CQk9IHZpcGVyX2JhY2tsaWdodF9ub3RpZnksCisJLmV4aXQJCT0gdmlwZXJfYmFja2xpZ2h0X2V4aXQsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2aXBlcl9iYWNrbGlnaHRfZGV2aWNlID0geworCS5uYW1lCQk9ICJwd20tYmFja2xpZ2h0IiwKKwkuZGV2CQk9IHsKKwkJLnBhcmVudAkJPSAmcHhhMjV4X2RldmljZV9wd20wLmRldiwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdmlwZXJfYmFja2xpZ2h0X2RhdGEsCisJfSwKK307CisKKy8qIEV0aGVybmV0ICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gInNtYzkxeC1yZWdzIiwKKwkJLnN0YXJ0ICA9IFZJUEVSX0VUSF9QSFlTICsgMHgzMDAsCisJCS5lbmQgICAgPSBWSVBFUl9FVEhfUEhZUyArIDB4MzBmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBncGlvX3RvX2lycShWSVBFUl9FVEhfR1BJTyksCisJCS5lbmQgICAgPSBncGlvX3RvX2lycShWSVBFUl9FVEhfR1BJTyksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFLAorCX0sCisJWzJdID0geworCQkubmFtZQk9ICJzbWM5MXgtZGF0YTMyIiwKKwkJLnN0YXJ0ICA9IFZJUEVSX0VUSF9EQVRBX1BIWVMsCisJCS5lbmQgICAgPSBWSVBFUl9FVEhfREFUQV9QSFlTICsgMywKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSB2aXBlcl9zbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gc21jOTF4X3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdmlwZXJfc21jOTF4X2luZm8sCisJfSwKK307CisKKy8qIGkyYyAqLworc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGkyY19idXNfZGF0YSA9IHsKKwkuc2RhX3BpbiA9IFZJUEVSX1JUQ19JMkNfU0RBX0dQSU8sCisJLnNjbF9waW4gPSBWSVBFUl9SVENfSTJDX1NDTF9HUElPLAorCS51ZGVsYXkgID0gMTAsCisJLnRpbWVvdXQgPSAxMDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYnVzX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaTJjLWdwaW8iLAorCS5pZAkJPSAxLCAvKiBweGEyeHgtaTJjIGlzIGJ1cyAwLCBzbyBzdGFydCBhdCAxICovCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJjX2J1c19kYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB2aXBlcl9pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oImRzMTMzOCIsIDB4NjgpLAorCX0sCit9OworCisvKgorICogU2VyaWFsIGNvbmZpZ3VyYXRpb246CisgKiBZb3UgY2FuIGVpdGhlciBoYXZlIHRoZSBzdGFuZGFyZCBQWEEgcG9ydHMgZHJpdmVuIGJ5IHRoZSBQWEEgZHJpdmVyLAorICogb3IgYWxsIHRoZSBwb3J0cyAoUFhBICsgMTY4NTApIGRyaXZlbiBieSB0aGUgODI1MCBkcml2ZXIuCisgKiBDaG9vc2UgeW91ciBwb2lzb24uCisgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2aXBlcl9zZXJpYWxfcmVzb3VyY2VzW10gPSB7CisjaWZuZGVmIENPTkZJR19TRVJJQUxfUFhBCisJeworCQkuc3RhcnQJPSAweDQwMTAwMDAwLAorCQkuZW5kCT0gMHg0MDEwMDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IDB4NDAyMDAwMDAsCisJCS5lbmQJPSAweDQwMjAwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHg0MDcwMDAwMCwKKwkJLmVuZAk9IDB4NDA3MDAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBWSVBFUl9VQVJUQV9QSFlTLAorCQkuZW5kCT0gVklQRVJfVUFSVEFfUEhZUyArIDB4ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IFZJUEVSX1VBUlRCX1BIWVMsCisJCS5lbmQJPSBWSVBFUl9VQVJUQl9QSFlTICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2Vsc2UKKwl7CisJCTAsCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0geworI2lmbmRlZiBDT05GSUdfU0VSSUFMX1BYQQorCS8qIEludGVybmFsIFVBUlRzICovCisJeworCQkubWVtYmFzZQk9ICh2b2lkICopJkZGVUFSVCwKKwkJLm1hcGJhc2UJPSBfX1BSRUcoRkZVQVJUKSwKKwkJLmlycQkJPSBJUlFfRkZVQVJULAorCQkudWFydGNsawk9IDkyMTYwMCAqIDE2LAorCQkucmVnc2hpZnQJPSAyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCX0sCisJeworCQkubWVtYmFzZQk9ICh2b2lkICopJkJUVUFSVCwKKwkJLm1hcGJhc2UJPSBfX1BSRUcoQlRVQVJUKSwKKwkJLmlycQkJPSBJUlFfQlRVQVJULAorCQkudWFydGNsawk9IDkyMTYwMCAqIDE2LAorCQkucmVnc2hpZnQJPSAyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCX0sCisJeworCQkubWVtYmFzZQk9ICh2b2lkICopJlNUVUFSVCwKKwkJLm1hcGJhc2UJPSBfX1BSRUcoU1RVQVJUKSwKKwkJLmlycQkJPSBJUlFfU1RVQVJULAorCQkudWFydGNsawk9IDkyMTYwMCAqIDE2LAorCQkucmVnc2hpZnQJPSAyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCX0sCisJLyogRXh0ZXJuYWwgVUFSVHMgKi8KKwl7CisJCS5tYXBiYXNlCT0gVklQRVJfVUFSVEFfUEhZUywKKwkJLmlycQkJPSBncGlvX3RvX2lycShWSVBFUl9VQVJUQV9HUElPKSwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAorCQkucmVnc2hpZnQJPSAxLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCB8CisJCQkJICBVUEZfU0tJUF9URVNULAorCX0sCisJeworCQkubWFwYmFzZQk9IFZJUEVSX1VBUlRCX1BIWVMsCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoVklQRVJfVUFSVEJfR1BJTyksCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwKKwkJLnJlZ3NoaWZ0CT0gMSwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAgfAorCQkJCSAgVVBGX1NLSVBfVEVTVCwKKwl9LAorI2VuZGlmCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMCwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2VyaWFsX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKHZpcGVyX3NlcmlhbF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQkJPSB2aXBlcl9zZXJpYWxfcmVzb3VyY2VzLAorfTsKKworLyogVVNCICovCitzdGF0aWMgdm9pZCBpc3AxMTZ4X2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGRlbGF5KQoreworCW5kZWxheShkZWxheSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXNwMTE2eF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7IC8qIERBVEEgKi8KKwkJLnN0YXJ0ICA9IFZJUEVSX1VTQl9QSFlTICsgMCwKKwkJLmVuZCAgICA9IFZJUEVSX1VTQl9QSFlTICsgMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geyAvKiBBRERSICovCisJCS5zdGFydCAgPSBWSVBFUl9VU0JfUEhZUyArIDIsCisJCS5lbmQgICAgPSBWSVBFUl9VU0JfUEhZUyArIDMsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ICA9IGdwaW9fdG9faXJxKFZJUEVSX1VTQl9HUElPKSwKKwkJLmVuZCAgICA9IGdwaW9fdG9faXJxKFZJUEVSX1VTQl9HUElPKSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfSElHSEVER0UsCisJfSwKK307CisKKy8qIChEYXRhQnVzV2lkdGgxNnxBbmFsb2dPQ0VuYWJsZXxEUkVRT3V0cHV0UG9sYXJpdHl8RG93bnN0cmVhbVBvcnQxNUtSU2VsICkgKi8KK3N0YXRpYyBzdHJ1Y3QgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhIGlzcDExNnhfcGxhdGZvcm1fZGF0YSA9IHsKKwkvKiBFbmFibGUgaW50ZXJuYWwgcmVzaXN0b3JzIG9uIGRvd25zdHJlYW0gcG9ydHMgKi8KKwkuc2VsMTVLcmVzCQk9IDEsCisJLyogT24tY2hpcCBvdmVyY3VycmVudCBwcm90ZWN0aW9uICovCisJLm9jX2VuYWJsZQkJPSAxLAorCS8qIElOVCBvdXRwdXQgcG9sYXJpdHkgKi8KKwkuaW50X2FjdF9oaWdoCQk9IDEsCisJLyogSU5UIGVkZ2Ugb3IgbGV2ZWwgdHJpZ2dlcmVkICovCisJLmludF9lZGdlX3RyaWdnZXJlZAk9IDAsCisKKwkvKiBXQUtFVVAgcGluIGNvbm5lY3RlZCAtIE5PVCBTVVBQT1JURUQgICovCisJLyogLnJlbW90ZV93YWtldXBfY29ubmVjdGVkID0gMCwgKi8KKwkvKiBXYWtldXAgYnkgZGV2aWNlcyBvbiB1c2IgYnVzIGVuYWJsZWQgKi8KKwkucmVtb3RlX3dha2V1cF9lbmFibGUJPSAwLAorCS5kZWxheQkJCT0gaXNwMTE2eF9kZWxheSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlzcDExNnhfZGV2aWNlID0geworCS5uYW1lCQkJPSAiaXNwMTE2eC1oY2QiLAorCS5pZAkJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMgIAk9IEFSUkFZX1NJWkUoaXNwMTE2eF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICAJPSBpc3AxMTZ4X3Jlc291cmNlcywKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmlzcDExNnhfcGxhdGZvcm1fZGF0YSwKKwl9LAorCit9OworCisvKiBNVEQgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXRkX3Jlc291cmNlc1tdID0geworCVswXSA9IHsJLyogUmVkQm9vdCBjb25maWcgKyBmaWxlc3lzdGVtIGZsYXNoICovCisJCS5zdGFydAk9IFZJUEVSX0ZMQVNIX1BIWVMsCisJCS5lbmQJPSBWSVBFUl9GTEFTSF9QSFlTICsgU1pfMzJNIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CS8qIEJvb3QgZmxhc2ggKi8KKwkJLnN0YXJ0CT0gVklQRVJfQk9PVF9QSFlTLAorCQkuZW5kCT0gVklQRVJfQk9PVF9QSFlTICsgU1pfMU0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyXSA9IHsgLyoKKwkJICogU1JBTSBzaXplIGlzIGFjdHVhbGx5IDI1NktCLCA4Yml0cywgd2l0aCBhIHNwYXJzZSBtYXBwaW5nCisJCSAqIChlYWNoIGJ5dGUgaXMgb24gYSAxNmJpdCBib3VuZGFyeSkuCisJCSAqLworCQkuc3RhcnQJPSBfVklQRVJfU1JBTV9CQVNFLAorCQkuZW5kCT0gX1ZJUEVSX1NSQU1fQkFTRSArIFNaXzUxMksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHZpcGVyX2Jvb3RfZmxhc2hfcGFydGl0aW9uID0geworCS5uYW1lCQk9ICJSZWRCb290IiwKKwkuc2l6ZQkJPSBTWl8xTSwKKwkub2Zmc2V0CQk9IDAsCisJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAkvKiBmb3JjZSBSL08gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHZpcGVyX2ZsYXNoX2RhdGFbXSA9IHsKKwlbMF0gPSB7CisJCS53aWR0aAkJPSAyLAorCQkucGFydHMJCT0gTlVMTCwKKwkJLm5yX3BhcnRzCT0gMCwKKwl9LAorCVsxXSA9IHsKKwkJLndpZHRoCQk9IDIsCisJCS5wYXJ0cwkJPSAmdmlwZXJfYm9vdF9mbGFzaF9wYXJ0aXRpb24sCisJCS5ucl9wYXJ0cwk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZpcGVyX210ZF9kZXZpY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJCS5pZAkJPSAwLAorCQkuZGV2CQk9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhCT0gJnZpcGVyX2ZsYXNoX2RhdGFbMF0sCisJCX0sCisJCS5yZXNvdXJjZQk9ICZtdGRfcmVzb3VyY2VzWzBdLAorCQkubnVtX3Jlc291cmNlcwk9IDEsCisJfSwKKwlbMV0gPSB7CisJCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkJLmlkCQk9IDEsCisJCS5kZXYJCT0geworCQkJLnBsYXRmb3JtX2RhdGEJPSAmdmlwZXJfZmxhc2hfZGF0YVsxXSwKKwkJfSwKKwkJLnJlc291cmNlCT0gJm10ZF9yZXNvdXJjZXNbMV0sCisJCS5udW1fcmVzb3VyY2VzCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZpcGVyX2RldnNbXSBfX2luaXRkYXRhID0geworCSZzbWM5MXhfZGV2aWNlLAorCSZpMmNfYnVzX2RldmljZSwKKwkmc2VyaWFsX2RldmljZSwKKwkmaXNwMTE2eF9kZXZpY2UsCisJJnZpcGVyX210ZF9kZXZpY2VzWzBdLAorCSZ2aXBlcl9tdGRfZGV2aWNlc1sxXSwKKwkmdmlwZXJfYmFja2xpZ2h0X2RldmljZSwKK307CisKK3N0YXRpYyBtZnBfY2ZnX3QgdmlwZXJfcGluX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CisJLyogQ2hpcCBzZWxlY3RzICovCisJR1BJTzE1X25DU18xLAorCUdQSU83OF9uQ1NfMiwKKwlHUElPNzlfbkNTXzMsCisJR1BJTzgwX25DU180LAorCUdQSU8zM19uQ1NfNSwKKworCS8qIEZQIEJhY2tsaWdodCAqLworCUdQSU85X0dQSU8sIAkJCQkvKiBWSVBFUl9CQ0tMSUdIVF9FTl9HUElPICovCisJR1BJTzEwX0dQSU8sCQkJCS8qIFZJUEVSX0xDRF9FTl9HUElPICovCisJR1BJTzE2X1BXTTBfT1VULAorCisJLyogRXRoZXJuZXQgUEhZIFJlYWR5ICovCisJR1BJTzE4X1JEWSwKKworCS8qIFNlcmlhbCBzaHV0ZG93biAqLworCUdQSU8xMl9HUElPIHwgTUZQX0xQTV9EUklWRV9ISUdILAkvKiBWSVBFUl9VQVJUX1NIRE5fR1BJTyAqLworCisJLyogQ29tcGFjdC1GbGFzaCAvIFBDMTA0ICovCisJR1BJTzQ4X25QT0UsCisJR1BJTzQ5X25QV0UsCisJR1BJTzUwX25QSU9SLAorCUdQSU81MV9uUElPVywKKwlHUElPNTJfblBDRV8xLAorCUdQSU81M19uUENFXzIsCisJR1BJTzU0X25QU0tUU0VMLAorCUdQSU81NV9uUFJFRywKKwlHUElPNTZfblBXQUlULAorCUdQSU81N19uSU9JUzE2LAorCUdQSU84X0dQSU8sCQkJCS8qIFZJUEVSX0NGX1JEWV9HUElPICovCisJR1BJTzMyX0dQSU8sCQkJCS8qIFZJUEVSX0NGX0NEX0dQSU8gKi8KKwlHUElPODJfR1BJTywJCQkJLyogVklQRVJfQ0ZfUE9XRVJfR1BJTyAqLworCisJLyogSW50ZWdyYXRlZCBVUFMgY29udHJvbCAqLworCUdQSU8yMF9HUElPLAkJCQkvKiBWSVBFUl9VUFNfR1BJTyAqLworCisJLyogVmNjIHJlZ3VsYXRvciBjb250cm9sICovCisJR1BJTzZfR1BJTywJCQkJLyogVklQRVJfUFNVX0RBVEFfR1BJTyAqLworCUdQSU8xMV9HUElPLAkJCQkvKiBWSVBFUl9QU1VfQ0xLX0dQSU8gKi8KKwlHUElPMTlfR1BJTywJCQkJLyogVklQRVJfUFNVX25DU19MRF9HUElPICovCisKKwkvKiBpMmMgYnVzc2VzICovCisJR1BJTzI2X0dQSU8sCQkJCS8qIFZJUEVSX1RQTV9JMkNfU0RBX0dQSU8gKi8KKwlHUElPMjdfR1BJTywJCQkJLyogVklQRVJfVFBNX0kyQ19TQ0xfR1BJTyAqLworCUdQSU84M19HUElPLAkJCQkvKiBWSVBFUl9SVENfSTJDX1NEQV9HUElPICovCisJR1BJTzg0X0dQSU8sCQkJCS8qIFZJUEVSX1JUQ19JMkNfU0NMX0dQSU8gKi8KKworCS8qIFBDLzEwNCBJbnRlcnJ1cHQgKi8KKwlHUElPMV9HUElPIHwgV0FLRVVQX09OX0VER0VfUklTRSwJLyogVklQRVJfQ1BMRF9HUElPICovCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aXBlcl90cG07CisKK3N0YXRpYyBpbnQgX19pbml0IHZpcGVyX3RwbV9zZXR1cChjaGFyICpzdHIpCit7CisJc3RyaWN0X3N0cnRvdWwoc3RyLCAxMCwgJnZpcGVyX3RwbSk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInRwbT0iLCB2aXBlcl90cG1fc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgdmlwZXJfdHBtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cG1fZGV2aWNlOworCXN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGkyY190cG1fZGF0YSA9IHsKKwkJLnNkYV9waW4gPSBWSVBFUl9UUE1fSTJDX1NEQV9HUElPLAorCQkuc2NsX3BpbiA9IFZJUEVSX1RQTV9JMkNfU0NMX0dQSU8sCisJCS51ZGVsYXkgID0gMTAsCisJCS50aW1lb3V0ID0gMTAwLAorCX07CisJY2hhciAqZXJyc3RyOworCisJLyogQWxsb2NhdGUgVFBNIGkyYyBidXMgaWYgcmVxdWVzdGVkICovCisJaWYgKCF2aXBlcl90cG0pCisJCXJldHVybjsKKworCXRwbV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImkyYy1ncGlvIiwgMik7CisJaWYgKHRwbV9kZXZpY2UpIHsKKwkJaWYgKCFwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEodHBtX2RldmljZSwKKwkJCQkJICAgICAgJmkyY190cG1fZGF0YSwKKwkJCQkJICAgICAgc2l6ZW9mKGkyY190cG1fZGF0YSkpKSB7CisJCQlpZiAocGxhdGZvcm1fZGV2aWNlX2FkZCh0cG1fZGV2aWNlKSkgeworCQkJCWVycnN0ciA9ICJyZWdpc3RlciBUUE0gaTJjIGJ1cyI7CisJCQkJZ290byBlcnJvcl9mcmVlX3RwbTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycnN0ciA9ICJhbGxvY2F0ZSBUUE0gaTJjIGJ1cyBkYXRhIjsKKwkJCWdvdG8gZXJyb3JfZnJlZV90cG07CisJCX0KKwl9IGVsc2UgeworCQllcnJzdHIgPSAiYWxsb2NhdGUgVFBNIGkyYyBkZXZpY2UiOworCQlnb3RvIGVycm9yX3RwbTsKKwl9CisKKwlyZXR1cm47CisKK2Vycm9yX2ZyZWVfdHBtOgorCWtmcmVlKHRwbV9kZXZpY2UpOworZXJyb3JfdHBtOgorCXByX2VycigidmlwZXI6IENvdWxkbid0ICVzLCBnaXZpbmcgdXBcbiIsIGVycnN0cik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB2aXBlcl9pbml0X3Zjb3JlX2dwaW9zKHZvaWQpCit7CisJaWYgKGdwaW9fcmVxdWVzdChWSVBFUl9QU1VfREFUQV9HUElPLCAiUFNVIGRhdGEiKSkKKwkJZ290byBlcnJfcmVxdWVzdF9kYXRhOworCisJaWYgKGdwaW9fcmVxdWVzdChWSVBFUl9QU1VfQ0xLX0dQSU8sICJQU1UgY2xvY2siKSkKKwkJZ290byBlcnJfcmVxdWVzdF9jbGs7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KFZJUEVSX1BTVV9uQ1NfTERfR1BJTywgIlBTVSBjcyIpKQorCQlnb3RvIGVycl9yZXF1ZXN0X2NzOworCisJaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChWSVBFUl9QU1VfREFUQV9HUElPLCAwKSB8fAorCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoVklQRVJfUFNVX0NMS19HUElPLCAwKSB8fAorCSAgICBncGlvX2RpcmVjdGlvbl9vdXRwdXQoVklQRVJfUFNVX25DU19MRF9HUElPLCAwKSkKKwkJZ290byBlcnJfZGlyOworCisJLyogYy9zaG91bGQgYXNzdW1lIHJlZGJvb3Qgc2V0IHRoZSBjb3JyZWN0IGxldmVsID8/PyAqLworCXZpcGVyX3NldF9jb3JlX2NwdV92b2x0YWdlKGdldF9jbGtfZnJlcXVlbmN5X2toeigwKSwgMSk7CisKKwlyZXR1cm47CisKK2Vycl9kaXI6CisJZ3Bpb19mcmVlKFZJUEVSX1BTVV9uQ1NfTERfR1BJTyk7CitlcnJfcmVxdWVzdF9jczoKKwlncGlvX2ZyZWUoVklQRVJfUFNVX0NMS19HUElPKTsKK2Vycl9yZXF1ZXN0X2NsazoKKwlncGlvX2ZyZWUoVklQRVJfUFNVX0RBVEFfR1BJTyk7CitlcnJfcmVxdWVzdF9kYXRhOgorCXByX2VycigidmlwZXI6IEZhaWxlZCB0byBzZXR1cCB2Y29yZSBjb250cm9sIEdQSU9zXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHZpcGVyX2luaXRfc2VyaWFsX2dwaW8odm9pZCkKK3sKKwlpZiAoZ3Bpb19yZXF1ZXN0KFZJUEVSX1VBUlRfU0hETl9HUElPLCAiVUFSVHMgc2h1dGRvd24iKSkKKwkJZ290byBlcnJfcmVxdWVzdDsKKworCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoVklQRVJfVUFSVF9TSEROX0dQSU8sIDApKQorCQlnb3RvIGVycl9kaXI7CisKKwlyZXR1cm47CisKK2Vycl9kaXI6CisJZ3Bpb19mcmVlKFZJUEVSX1VBUlRfU0hETl9HUElPKTsKK2Vycl9yZXF1ZXN0OgorCXByX2VycigidmlwZXI6IEZhaWxlZCB0byBzZXR1cCBVQVJUIHNodXRkb3duIEdQSU9cbiIpOworfQorCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCitzdGF0aWMgaW50IHZpcGVyX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKworCS8qIFRPRE86IEFkanVzdCB0aW1pbmdzPz8/ICovCisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgQ1BVRlJFUV9QUkVDSEFOR0U6CisJCWlmIChmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHsKKwkJCS8qIHdlIGFyZSBnZXR0aW5nIGZhc3RlciBzbyByYWlzZSB0aGUgdm9sdGFnZQorCQkJICogYmVmb3JlIHdlIGNoYW5nZSBmcmVxICovCisJCQl2aXBlcl9zZXRfY29yZV9jcHVfdm9sdGFnZShmcmVxLT5uZXcsIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1BVRlJFUV9QT1NUQ0hBTkdFOgorCQlpZiAoZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB7CisJCQkvKiB3ZSBhcmUgc2xvd2luZyBkb3duIHNvIGRyb3AgdGhlIHBvd2VyCisJCQkgKiBhZnRlciB3ZSBjaGFuZ2UgZnJlcSAqLworCQkJdmlwZXJfc2V0X2NvcmVfY3B1X3ZvbHRhZ2UoZnJlcS0+bmV3LCAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENQVUZSRVFfUkVTVU1FQ0hBTkdFOgorCQl2aXBlcl9zZXRfY29yZV9jcHVfdm9sdGFnZShmcmVxLT5uZXcsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBpZ25vcmUgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdmlwZXJfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSB2aXBlcl9jcHVmcmVxX25vdGlmaWVyCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdmlwZXJfaW5pdF9jcHVmcmVxKHZvaWQpCit7CisJaWYgKGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnZpcGVyX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJICAgICAgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKSkKKwkJcHJfZXJyKCJ2aXBlcjogRmFpbGVkIHRvIHNldHVwIGNwdWZyZXEgbm90aWZpZXJcbiIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aXBlcl9pbml0X2NwdWZyZXEodm9pZCkge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2aXBlcl9wb3dlcl9vZmYodm9pZCkKK3sKKwlwcl9ub3RpY2UoIlNodXR0aW5nIG9mZiBVUFNcbiIpOworCWdwaW9fc2V0X3ZhbHVlKFZJUEVSX1VQU19HUElPLCAxKTsKKwkvKiBTcGluIHRvIGRlYXRoLi4uICovCisJd2hpbGUgKDEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdmlwZXJfaW5pdCh2b2lkKQoreworCXU4IHZlcnNpb247CisKKwlwbV9wb3dlcl9vZmYgPSB2aXBlcl9wb3dlcl9vZmY7CisKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRSh2aXBlcl9waW5fY29uZmlnKSk7CisKKwkvKiBXYWtlLXVwIHNlcmlhbCBjb25zb2xlICovCisJdmlwZXJfaW5pdF9zZXJpYWxfZ3BpbygpOworCisJc2V0X3B4YV9mYl9pbmZvKCZmYl9pbmZvKTsKKworCS8qIHYxIGhhcmR3YXJlIGNhbm5vdCB1c2UgdGhlIGRhdGFjcyBsaW5lICovCisJdmVyc2lvbiA9IHZpcGVyX2h3X3ZlcnNpb24oKTsKKwlpZiAodmVyc2lvbiA9PSAwKQorCQlzbWM5MXhfZGV2aWNlLm51bV9yZXNvdXJjZXMtLTsKKworCXB4YV9zZXRfaTJjX2luZm8oTlVMTCk7CisJcGxhdGZvcm1fYWRkX2RldmljZXModmlwZXJfZGV2cywgQVJSQVlfU0laRSh2aXBlcl9kZXZzKSk7CisKKwl2aXBlcl9pbml0X3Zjb3JlX2dwaW9zKCk7CisJdmlwZXJfaW5pdF9jcHVmcmVxKCk7CisKKwlzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLCAmdmlwZXJfY3B1X3N5c2Rldl9kcml2ZXIpOworCisJaWYgKHZlcnNpb24pIHsKKwkJcHJfaW5mbygidmlwZXI6IGhhcmR3YXJlIHYlZGklZCBkZXRlY3RlZC4gIgorCQkJIkNQTEQgcmV2aXNpb24gJWQuXG4iLAorCQkJVklQRVJfQk9BUkRfVkVSU0lPTih2ZXJzaW9uKSwKKwkJCVZJUEVSX0JPQVJEX0lTU1VFKHZlcnNpb24pLAorCQkJVklQRVJfQ1BMRF9SRVZJU0lPTih2ZXJzaW9uKSk7CisJCXN5c3RlbV9yZXYgPSAoVklQRVJfQk9BUkRfVkVSU0lPTih2ZXJzaW9uKSA8PCA4KSB8CisJCQkgICAgIChWSVBFUl9CT0FSRF9JU1NVRSh2ZXJzaW9uKSA8PCA0KSB8CisJCQkgICAgIFZJUEVSX0NQTERfUkVWSVNJT04odmVyc2lvbik7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygidmlwZXI6IE5vIHZlcnNpb24gcmVnaXN0ZXIuXG4iKTsKKwl9CisKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBBUlJBWV9BTkRfU0laRSh2aXBlcl9pMmNfZGV2aWNlcykpOworCisJdmlwZXJfdHBtX2luaXQoKTsKKwlweGFfc2V0X2FjOTdfaW5mbyhOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB2aXBlcl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsID0gVklQRVJfQ1BMRF9CQVNFLAorCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oVklQRVJfQ1BMRF9QSFlTKSwKKwkJLmxlbmd0aCAgPSAweDAwMzAwMDAwLAorCQkudHlwZSAgICA9IE1UX0RFVklDRSwKKwl9LAorCXsKKwkJLnZpcnR1YWwgPSBWSVBFUl9QQzEwNElPX0JBU0UsCisJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihfUENNQ0lBMUlPKSwKKwkJLmxlbmd0aCAgPSAweDAwODAwMDAwLAorCQkudHlwZSAgICA9IE1UX0RFVklDRSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHZpcGVyX21hcF9pbyh2b2lkKQoreworCXB4YV9tYXBfaW8oKTsKKworCWlvdGFibGVfaW5pdCh2aXBlcl9pb19kZXNjLCBBUlJBWV9TSVpFKHZpcGVyX2lvX2Rlc2MpKTsKKworCVBDRlIgfD0gUENGUl9PUERFOworfQorCitNQUNISU5FX1NUQVJUKFZJUEVSLCAiQXJjb20vRXVyb3RlY2ggVklQRVIgU0JDIikKKwkvKiBNYWludGFpbmVyOiBNYXJjIFp5bmdpZXIgPG1hekBtaXN0ZXJqb25lcy5vcmc+ICovCisJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLm1hcF9pbwkJPSB2aXBlcl9tYXBfaW8sCisJLmluaXRfaXJxCT0gdmlwZXJfaW5pdF9pcnEsCisJLnRpbWVyICAgICAgICAgID0gJnB4YV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gdmlwZXJfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGUuYwppbmRleCAwY2I2NWI1Li44MTM4MDQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CiAjaW5jbHVkZSA8bWFjaC96eWxvbml0ZS5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyN3hfa2V5cGFkLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHhfbmFuZC5oPgogCkBAIC00MjMsNiArNDI0LDIxIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgenlsb25pdGVfaW5pdF9uYW5kKHZvaWQpIHt9CiAjZW5kaWYgLyogQ09ORklHX01URF9OQU5EX1BYQTN4eCB8fCBDT05GSUdfTVREX05BTkRfUFhBM3h4X01PRFVMRSAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgenlsb25pdGVfb2hjaV9pbmZvID0geworCS5wb3J0X21vZGUJPSBQTU1fUEVSUE9SVF9NT0RFLAorCS5mbGFncwkJPSBFTkFCTEVfUE9SVDEgfCBFTkFCTEVfUE9SVDIgfAorCQkJICBQT1dFUl9DT05UUk9MX0xPVyB8IFBPV0VSX1NFTlNFX0xPVywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB6eWxvbml0ZV9pbml0X29oY2kodm9pZCkKK3sKKwlweGFfc2V0X29oY2lfaW5mbygmenlsb25pdGVfb2hjaV9pbmZvKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgenlsb25pdGVfaW5pdF9vaGNpKHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX1VTQl9PSENJX0hDRCB8fCBDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSAqLworCiBzdGF0aWMgdm9pZCBfX2luaXQgenlsb25pdGVfaW5pdCh2b2lkKQogewogCS8qIGJvYXJkLXByb2Nlc3NvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLwpAQCAtNDQzLDYgKzQ1OSw3IEBACiAJenlsb25pdGVfaW5pdF9rZXlwYWQoKTsKIAl6eWxvbml0ZV9pbml0X25hbmQoKTsKIAl6eWxvbml0ZV9pbml0X2xlZHMoKTsKKwl6eWxvbml0ZV9pbml0X29oY2koKTsKIH0KIAogTUFDSElORV9TVEFSVChaWUxPTklURSwgIlBYQTN4eCBQbGF0Zm9ybSBEZXZlbG9wbWVudCBLaXQgKGFrYSBaeWxvbml0ZSkiKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGVfcHhhMzAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZV9weGEzMDAuYwppbmRleCAwOTVmNWM2Li40NjUzODg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZV9weGEzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZV9weGEzMDAuYwpAQCAtNzMsNiArNzMsMTIgQEAKIAlHUElPMjdfQUM5N19TREFUQV9PVVQsCiAJR1BJTzI4X0FDOTdfU1lOQywKIAorCS8qIFNTUDMgKi8KKwlHUElPOTFfU1NQM19TQ0xLLAorCUdQSU85Ml9TU1AzX0ZSTSwKKwlHUElPOTNfU1NQM19UWEQsCisJR1BJTzk0X1NTUDNfUlhELAorCiAJLyogV005NzEzIElSUSAqLwogCUdQSU8yNl9HUElPLAogCkBAIC0xMTMsNiArMTE5LDEwIEBACiAJR1BJTzEzX01NQzJfQ0xLLAogCUdQSU8xNF9NTUMyX0NNRCwKIAorCS8qIFVTQiBIb3N0ICovCisJR1BJTzBfMl9VU0JIX1BFTiwKKwlHUElPMV8yX1VTQkhfUFdSLAorCiAJLyogU3RhbmRhcmQgSTJDICovCiAJR1BJTzIxX0kyQ19TQ0wsCiAJR1BJTzIyX0kyQ19TREEsCkBAIC0yMDksNyArMjE5LDcgQEAKIAl9LAogfTsKIAotc3RydWN0IGkyY19ib2FyZF9pbmZvIHp5bG9uaXRlX2kyY19ib2FyZF9pbmZvW10gPSB7CitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHp5bG9uaXRlX2kyY19ib2FyZF9pbmZvW10gPSB7CiAJewogCQkudHlwZQkJPSAicGNhOTUzOSIsCiAJCS5hZGRyCQk9IDB4NzQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZV9weGEzMjAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlX3B4YTMyMC5jCmluZGV4IDk4NzlkN2QuLjBmMjQ0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlX3B4YTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlX3B4YTMyMC5jCkBAIC02OSw2ICs2OSwxMiBAQAogCUdQSU8zOV9BQzk3X0JJVENMSywKIAlHUElPNDBfQUM5N19uQUNSRVNFVCwKIAorCS8qIFNTUDMgKi8KKwlHUElPODlfU1NQM19TQ0xLLAorCUdQSU85MF9TU1AzX0ZSTSwKKwlHUElPOTFfU1NQM19UWEQsCisJR1BJTzkyX1NTUDNfUlhELAorCiAJLyogV005NzEzIElSUSAqLwogCUdQSU8xNV9HUElPLAogCkBAIC0xMTcsNiArMTIzLDEwIEBACiAJR1BJTzI4X01NQzJfQ0xLLAogCUdQSU8yOV9NTUMyX0NNRCwKIAorCS8qIFVTQiBIb3N0ICovCisJR1BJTzJfMl9VU0JIX1BFTiwKKwlHUElPM18yX1VTQkhfUFdSLAorCiAJLyogRGVidWcgTEVEcyAqLwogCUdQSU8xXzJfR1BJTyB8IE1GUF9MUE1fRFJJVkVfSElHSCwKIAlHUElPNF8yX0dQSU8gfCBNRlBfTFBNX0RSSVZFX0hJR0gsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCmluZGV4IDRmOWM4NGEuLjJmMDRkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jCkBAIC0yNywxMCArMjcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmluZGV4IDMzZGJiYjQuLjNjZWE5MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCkBAIC0yMyw5ICsyMyw5IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfUkVBTFZJRVdfSAogCiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBBTUJBX0RFVklDRShuYW1lLGJ1c2lkLGJhc2UscGxhdCkJCQlcCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCA0ZDNjOGYzLi5hMmY2MWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjEsOCArMjEsOCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9sb2NhbHRpbWVyLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYwppbmRleCA4MmZhMWYyLi40NGQxNzhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2xvY2FsdGltZXIuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3R3ZC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbG9jYWxfY2xvY2tldmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCmluZGV4IDE5MDdkMjIuLmUxMDJhZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCkBAIC0xMywxMCArMTMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC1lYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCmluZGV4IDE5YTk5NjguLmViODI5ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCmluZGV4IDA5ODZjYmQuLmNjY2RiM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKaW5kZXggZjRlNzEzNS4uOGI4NjMxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCkBAIC0yMyw5ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9kbWEuYyBiL2FyY2gvYXJtL21hY2gtcnBjL2RtYS5jCmluZGV4IDRiMTlmZTQuLjc5NThhMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL2RtYS5jCkBAIC0xNCwxMSArMTQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2ZpcS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAwNTQyNWQ1Li45YmY3ZTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0zNiw0ICszNiwxMiBAQAogI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMJCTB4MDAwMDAwMDAKICNkZWZpbmUgRkxVU0hfQkFTRQkJMHhkZjAwMDAwMAogCisvKgorICogU3BhcnNlbWVtIHN1cHBvcnQuICBFYWNoIHNlY3Rpb24gaXMgYSBtYXhpbXVtIG9mIDY0TUIuICBUaGUgc2VjdGlvbnMKKyAqIGFyZSBvZmZzZXQgYnkgMTI4TUIgYW5kIGNhbiBjb3ZlciAxMjhNQiwgc28gdGhhdCBnaXZlcyB1cyBhIG1heGltdW0KKyAqIG9mIDI5IHBoeXNtZW0gYml0cy4KKyAqLworI2RlZmluZSBNQVhfUEhZU01FTV9CSVRTCTI5CisjZGVmaW5lIFNFQ1RJT05fU0laRV9CSVRTCTI2CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmluZGV4IDU0ZDZlM2YuLmJkNzI2OGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC03LDkgKzcsOSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggYmFhOWM4NjYuLmQ1ODYyMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtOSw4ICs5LDggQEAKICAqLwogI2RlZmluZSBWSURNRU0gKChjaGFyICopU0NSRUVOX1NUQVJUKQogIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvaXJxLmMKaW5kZXggN2EwMjk2Mi4uOWRkMTVkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvaXJxLmMKQEAgLTEsMTAgKzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIHZvaWQgaW9tZF9hY2tfaXJxX2EodW5zaWduZWQgaW50IGlycSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKaW5kZXggY2U4NDcwZmVhLi5lODhkNDE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQwMC9ncGlvLmMKaW5kZXggMTQ4ZDBkZC4uN2E3ZWQ0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDAwL2dwaW8uYwpAQCAtMjQsMTAgKzI0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCmluZGV4IGM2NjAyMWIuLjlhMzdjODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9iYXN0LWlycS5jCkBAIC0yNSwxMiArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPG1hY2gvYmFzdC1tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2Jhc3QtaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2lycS5oPgorI2luY2x1ZGUgPHBsYXQvaXJxLmg+CiAKICNpZiAwCiAjaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CkBAIC0xMzAsOCArMTMwLDcgQEAKIAkJZm9yIChpID0gMDsgc3RhdCAhPSAwOyBpKyssIHN0YXQgPj49IDEpIHsKIAkJCWlmIChzdGF0ICYgMSkgewogCQkJCWlycW5vID0gYmFzdF9wYzEwNF9pcnFzW2ldOwotCQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycW5vOwotCQkJCWRlc2NfaGFuZGxlX2lycShpcnFubywgZGVzYyk7CisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycW5vKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKaW5kZXggMTMyMjg1MS4uNGUwNzk0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmMKQEAgLTMxLDE5ICszMSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKIGludCBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCmluZGV4IDg3MzA3OTcuLjdkOTE0YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKQEAgLTIwLDEwICsyMCwxMCBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RtYS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYwppbmRleCBjNmVlZmIxLi4zNmEzMTMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKQEAgLTI1LDEwICsyNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDY4MmRmMjMuLjRjMjlhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAKICNkZWZpbmUgUzNDMjQxMF9VQVJUMV9PRkYgKDB4NDAwMCkKICNkZWZpbmUgU0hJRlRfMjQ0MFRYRiAoMTQtOSkKQEAgLTk5LDQgKzk5LDQgQEAKIAogLyogaW5jbHVkZSB0aGUgcmVzZXQgb2YgdGhlIGNvZGUgd2hpY2ggd2lsbCBkbyB0aGUgd29yayAqLwogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL2RlYnVnLW1hY3JvLlM+CisjaW5jbHVkZSA8cGxhdC9kZWJ1Zy1tYWNyby5TPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWFwLmgKaW5kZXggNjRiZjdlOS4uMjNjNDcwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC0xMyw3ICsxMyw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKICNkZWZpbmUgX19BU01fQVJDSF9NQVBfSAogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL21hcC5oPgorI2luY2x1ZGUgPHBsYXQvbWFwLmg+CiAKICNkZWZpbmUgUzNDMjQxMF9BRERSKHgpCQlTM0NfQUREUih4KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAppbmRleCA5MjFiMTNiLi40NmQ0NmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAl1bnNpZ25lZCBpbnQJCSBudW1fY3M7CS8qIHRvdGFsIGNoaXBzZWxlY3RzICovCiAJaW50CQkJIGJ1c19udW07ICAgICAgIC8qIGJ1cyBudW1iZXIgdG8gdXNlLiAqLwogCisJdm9pZCAoKmdwaW9fc2V0dXApKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksIGludCBlbmFibGUpOwogCXZvaWQgKCpzZXRfY3MpKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksIGludCBjcywgaW50IHBvbCk7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS1yZXNldC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0tcmVzZXQuaAppbmRleCBlYzJkZWZlLi40MzUzNWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS1yZXNldC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLXJlc2V0LmgKQEAgLTExLDcgKzExLDcgQEAKICovCiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXdhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCBlOWY2NzZiLi5hOGNiY2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTEwLDggKzEwLDggQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lkbGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggNzA4ZTQ3NC4uYWIzOTQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTIxLDcgKzIxLDcgQEAKICN1bmRlZiBTM0MyNDEwX0dQSU9SRUcKICNkZWZpbmUgUzNDMjQxMF9HUElPUkVHKHgpICgoUzNDMjRYWF9QQV9HUElPICsgKHgpKSkKIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy91bmNvbXByZXNzLmg+CisjaW5jbHVkZSA8cGxhdC91bmNvbXByZXNzLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2FybTkyNih2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmluZGV4IGY1YzVjNTMuLjkyMTUwMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgogCiBzdGF0aWMgaW50IHMzYzI0MTBfaXJxX2FkZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFtbG01OTAwLmMKaW5kZXggZjBkZTNjMi4uZDA2MWZlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbWxtNTkwMC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQzLDE3ICs0NCwxNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kZXZzLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwppbmRleCAyNGM2MzM0Li44ZGI5YzcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZG05MDAwLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG5ldC9heDg4Nzk2Lmg+CiAKQEAgLTM0LDEyICszNSwxMSBAQAogI2luY2x1ZGUgPG1hY2gvYmFzdC1jcGxkLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIC8vI2luY2x1ZGUgPGFzbS9kZWJ1Zy1sbC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CkBAIC01NSw5ICs1NSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNpbmNsdWRlICJ1c2Itc2ltdGVjLmgiCiAjaW5jbHVkZSAibm9yLXNpbXRlYy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKaW5kZXggZTM1OTMzYS4uOTg3MTZkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCkBAIC0yMCwxNyArMjAsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CkBAIC00MCwxMCArNDAsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaDE5NDBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKIAlbMF0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCmluZGV4IDgwZmUyZWQuLjgyNTA1NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jCkBAIC0yNSw5ICsyNSw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKQEAgLTQxLDEyICs0MSwxMiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjL2lpYy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvdWRjLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbjMwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKaW5kZXggNjA2ZWUxNS4uZDgyNTVjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0yNSwxNyArMjYsMTYgQEAKICNpbmNsdWRlIDxtYWNoL290b20tbWFwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG90b20xMV9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogICAvKiBEZXZpY2UgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcXQyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwppbmRleCA3ZDM0ODQ0Li42NjE4MDdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KQEAgLTQzLDIzICs0MywyMiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2xlZHMtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KICNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGktZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgorI2luY2x1ZGUgPHBsYXQvY29tbW9uLXNtZGsuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBxdDI0MTBfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7IDB4ZTAwMDAwMDAsIF9fcGh5c190b19wZm4oUzNDMjQxMF9DUzMrMHgwMTAwMDAwMCksIFNaXzFNLCBNVF9ERVZJQ0UgfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKaW5kZXggYjg4OTM5ZC4uMTUyNTI3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCkBAIC0zNiwyMiArMzYsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kZXZzLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5oPgorI2luY2x1ZGUgPHBsYXQvY29tbW9uLXNtZGsuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzbWRrMjQxMF9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogICAvKiBub3RoaW5nIGhlcmUgeWV0ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMKaW5kZXggZWM4NzMwNi4uMzA5ZGNmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdGN0X2hhbW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXRjdF9oYW1tZXIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQwLDEzICs0MSwxMiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKaW5kZXggZmJjMDIxMy4uOTQxMzUzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpAQCAtMzYsMTcgKzM3LDE2IEBACiAjaW5jbHVkZSA8bWFjaC92cjEwMDAtY3BsZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9sZWRzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjaW5jbHVkZSAidXNiLXNpbXRlYy5oIgogI2luY2x1ZGUgIm5vci1zaW10ZWMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKaW5kZXggYmE0M2ZmOS4uYTY5NzBmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLmMKQEAgLTI1LDE3ICsyNSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2gxOTQwLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogI2lmZGVmIENPTkZJR19TM0MyNDEwX1BNX0RFQlVHCiBleHRlcm4gdm9pZCBwbV9kYmcoY29uc3QgY2hhciAqZm10LCAuLi4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMKaW5kZXggNWQ5NzdmOS4uYWM3OWI1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCkBAIC0xOSwyMiArMTksMjIgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAKIC8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvc2xlZXAuUwppbmRleCBiZTM3ZjIyLi5kZDViNjM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvc2xlZXAuUworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvc2xlZXAuUwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1lbS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KIAogCS8qIHMzYzI0MTBfY3B1X3N1c3BlbmQKIAkgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC91c2Itc2ltdGVjLmMKaW5kZXggNGRhY2Y4YS4uNjA3OGYwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3VzYi1zaW10ZWMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdXNiLXNpbXRlYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTMyLDEwICszMyw5IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlICJ1c2Itc2ltdGVjLmgiCiAKIC8qIGNvbnRyb2wgcG93ZXIgYW5kIG1vbml0b3Igb3Zlci1jdXJyZW50IGV2ZW50cyBvbiB2YXJpb3VzIFNpbXRlYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYwppbmRleCBhZjRiMmNlLi45NmQ5ZWIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvY2xvY2suYwpAQCAtMzEsMTkgKzMxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MTIuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTIuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogLyogV2UgY3VycmVudGx5IGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSBpcyBydW5uaW5nCiAgKiBmcm9tIHRoZSBYVFBsbCBpbnB1dCwgYW5kIHRoYXQgYWxsICoqKlJFRkNMS3MgYXJlIGJlaW5nCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZG1hLmMKaW5kZXggMjJmYzA0YS4uYmEwNTkxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9kbWEuYwpAQCAtMTYsMTUgKzE2LDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZG1hLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvaXJxLmMKaW5kZXggYWM2MmI3OS4uNjAwMGNhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9pcnEuYwpAQCAtMjQsMTAgKzI0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIApAQCAtMzUsOSArMzUsOSBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXBvd2VyLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9pcnEuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKICNkZWZpbmUgSU5UTVNLKHN0YXJ0LCBlbmQpICgoMSA8PCAoKGVuZCkgKyAxIC0gKHN0YXJ0KSkpIC0gMSkKICNkZWZpbmUgSU5UTVNLX1NVQihzdGFydCwgZW5kKSAoSU5UTVNLKHN0YXJ0LCBlbmQpIDw8ICgoc3RhcnQgLSBTM0MyNDEwX0lSUVNVQigwKSkpKQpAQCAtMTIzLDEwICsxMjMsMTAgQEAKIAlzdWJzcmMgICY9IH5zdWJtc2s7CiAKIAlpZiAoc3Vic3JjICYgSU5UQklUKElSUV9TM0MyNDEyX1NESSkpCi0JCWRlc2NfaGFuZGxlX2lycShJUlFfUzNDMjQxMl9TREksIGlycV9kZXNjICsgSVJRX1MzQzI0MTJfU0RJKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9TM0MyNDEyX1NESSk7CiAKIAlpZiAoc3Vic3JjICYgSU5UQklUKElSUV9TM0MyNDEyX0NGKSkKLQkJZGVzY19oYW5kbGVfaXJxKElSUV9TM0MyNDEyX0NGLCBpcnFfZGVzYyArIElSUV9TM0MyNDEyX0NGKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9TM0MyNDEyX0NGKTsKIH0KIAogI2RlZmluZSBJTlRNU0tfQ0ZTREkJKDFVTCA8PCAoSVJRX1MzQzI0MTJfQ0ZTREkgLSBJUlFfRUlOVDApKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCmluZGV4IGFkOTgwYTEuLmIwOGYxOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vcGxhdC1zM2MvbmFuZC5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9paWMuaD4KIApAQCAtNDgsMTAgKzQ4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC91ZGMuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBqaXZlX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYwppbmRleCA4MGFmZmIxLi5jNzE5YjVhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTI3LDEyICsyOCwxMSBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaW9tZC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAvLyNpbmNsdWRlIDxhc20vZGVidWctbGwuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAKQEAgLTQwLDEzICs0MCwxMyBAQAogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvdWRjLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEyLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEyLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NvbW1vbi1zbWRrLmg+CisjaW5jbHVkZSA8cGxhdC9jb21tb24tc21kay5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNtZGsyNDEzX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMKaW5kZXggN2EwOGIzNy4uNGNmYTE5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgpAQCAtMjksMTEgKzI5LDEwIEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CiAKQEAgLTQyLDExICs0MSwxMSBAQAogCiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMi5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQxMi5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdnN0bXNfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMi9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKaW5kZXggNzM3NTIzYS4uMjE3ZTllNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3BtLmMKQEAgLTE4LDkgKzE4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtcG93ZXIuaD4KQEAgLTI4LDEwICsyOCwxMCBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWRzYy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MTIuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTIuaD4KIAogZXh0ZXJuIHZvaWQgczNjMjQxMl9zbGVlcF9lbnRlcih2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3MzYzI0MTIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9zM2MyNDEyLmMKaW5kZXggZDI3ODAxMC4uMzEzNzU5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL3MzYzI0MTIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvczNjMjQxMi5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpAQCAtMjcsMTQgKzI4LDEzIEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogI2luY2x1ZGUgPG1hY2gvaWRsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1wb3dlci5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW9qLmg+CkBAIC00MiwxMSArNDIsMTEgQEAKICNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3JlZ3Mtc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXMzYzI0MTIuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMi5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kZXZzLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTIuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKICNpZm5kZWYgQ09ORklHX0NQVV9TM0MyNDEyX09OTFkKIHZvaWQgX19pb21lbSAqczNjMjR4eF92YV9ncGlvMiA9IFMzQzI0WFhfVkFfR1BJTzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2Nsb2NrLmMKaW5kZXggOTU1NjdlNi4uZDFjMjliMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2Nsb2NrLmMKQEAgLTMzLDE2ICszMywxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogLyogUzNDMjQ0MCBleHRlbmRlZCBjbG9jayBzdXBwb3J0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYwppbmRleCBjZGQ0ZTZlLi4zMjMwM2Y2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RtYS5jCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RtYS5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1hYzk3Lmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1lbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RzYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RzYy5jCmluZGV4IGMwYzY3NDMuLjU1NDA0NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kc2MuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZHNjLmMKQEAgLTE1LDIwICsxNSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWRzYy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0NDAuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQ0MC5oPgogCiBpbnQgczNjMjQ0MF9zZXRfZHNjKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9pcnEuYwppbmRleCAyNzZiODIzLi42M2M1YWI2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9pcnEuYwpAQCAtMjQsMTkgKzI0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9pcnEuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2lycS5oPgogCiAvKiBXRFQvQUM5NyAqLwogCkBAIC00NCw3ICs0NCw2IEBACiAJCQkJICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOwotCXN0cnVjdCBpcnFfZGVzYyAqbXlkZXNjOwogCiAJLyogcmVhZCB0aGUgY3VycmVudCBwZW5kaW5nIGludGVycnVwdHMsIGFuZCB0aGUgbWFzawogCSAqIGZvciB3aGF0IGl0IGlzIGF2YWlsYWJsZSAqLwpAQCAtNTgsMTIgKzU3LDEwIEBACiAKIAlpZiAoc3Vic3JjICE9IDApIHsKIAkJaWYgKHN1YnNyYyAmIDEpIHsKLQkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1MzQzI0NDBfV0RUOwotCQkJZGVzY19oYW5kbGVfaXJxKElSUV9TM0MyNDQwX1dEVCwgbXlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfUzNDMjQ0MF9XRFQpOwogCQl9CiAJCWlmIChzdWJzcmMgJiAyKSB7Ci0JCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9TM0MyNDQwX0FDOTc7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoSVJRX1MzQzI0NDBfQUM5NywgbXlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfUzNDMjQ0MF9BQzk3KTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWFudWJpcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKaW5kZXggNDQxZjRiYy4uZTJiZWNhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc201MDEuaD4KICNpbmNsdWRlIDxsaW51eC9zbTUwMS1yZWdzLmg+CiAKQEAgLTMyLDExICszMiwxMCBAQAogI2luY2x1ZGUgPG1hY2gvYW51YmlzLWNwbGQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CkBAIC00OSw5ICs0OCw5IEBACiAKICNpbmNsdWRlIDxuZXQvYXg4ODc5Ni5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNkZWZpbmUgQ09QWVJJR0hUICIsIChjKSAyMDA1IFNpbXRlYyBFbGVjdHJvbmljcyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwppbmRleCBmMGYwY2M2Li42Njg3NmM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLW1lbS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1sY2QuaD4KQEAgLTQyLDkgKzQyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQyNDQwZXZiX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogTm90aGluZyBoZXJlICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1uZXhjb2Rlci5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbmV4Y29kZXIuYwppbmRleCAxYTVlNzAyLi5hNTQ2MzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1uZXhjb2Rlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAKQEAgLTMwLDE5ICszMSwxOCBAQAogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAvLyNpbmNsdWRlIDxhc20vZGVidWctbGwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQxMC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQ0MC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjMjQ0MC5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG5leGNvZGVyX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogbm90aGluZyBoZXJlIHlldCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtb3NpcmlzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYwppbmRleCA4YjgzZjkzLi4yMzYxZDYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTI5LDExICszMCwxMCBAQAogI2luY2x1ZGUgPG1hY2gvb3NpcmlzLWNwbGQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+CkBAIC00NCw5ICs0NCw5IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAvKiBvbmJvYXJkIHBlcmlocGVyYWwgbWFwICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MzcxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKaW5kZXggZTBiMDdlNi4uNGQxNGM3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KQEAgLTM0LDExICszNCwxMCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogCkBAIC00NiwxMCArNDUsMTAgQEAKICNpbmNsdWRlIDxhc20vcGxhdC1zM2MvbmFuZC5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcngzNzE1X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogZHVtcCBJU0Egc3BhY2Ugc29tZXdoZXJlIHVudXNlZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMKaW5kZXggMzI3YzhmMy4uZmVmZWFhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1zbWRrMjQ0MC5jCkBAIC0yMSwzMCArMjEsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pZGxlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQwLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NvbW1vbi1zbWRrLmg+CisjaW5jbHVkZSA8cGxhdC9jb21tb24tc21kay5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNtZGsyNDQwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogSVNBIElPIFNwYWNlIG1hcCAobWVtb3J5IHNwYWNlIHNlbGVjdGVkIGJ5IEEyNCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0MC5jCmluZGV4IGQ2YjlhOTIuLmFjMWY3ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDAuYwpAQCAtMjAsMTggKzIwLDE4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvczNjMjQ0MC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQwLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHMzYzI0NDBfc3lzZGV2ID0gewogCS5jbHMJCT0gJnMzYzI0NDBfc3lzY2xhc3MsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDIvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9jbG9jay5jCmluZGV4IDU2OWI1YzMuLmVhMWFhMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9jbG9jay5jCkBAIC0zMywxNiArMzMsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKIC8qIFMzQzI0NDIgZXh0ZW5kZWQgY2xvY2sgc3VwcG9ydCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDIvczNjMjQ0Mi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQyL3MzYzI0NDIuYwppbmRleCBmYmY4MjY0Li40NjYzYmRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDIvczNjMjQ0Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0Mi9zM2MyNDQyLmMKQEAgLTE5LDggKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQyLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0NDIuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiBzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgczNjMjQ0Ml9zeXNkZXYgPSB7CiAJLmNscwkJPSAmczNjMjQ0Ml9zeXNjbGFzcywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKaW5kZXggNmE4ZDdjYy4uMmY2MGJmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMKQEAgLTMxLDE3ICszMSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0NDMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0NDMuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogLyogV2UgY3VycmVudGx5IGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHN5c3RlbSBpcyBydW5uaW5nCiAgKiBmcm9tIHRoZSBYVFBsbCBpbnB1dCwgYW5kIHRoYXQgYWxsICoqKlJFRkNMS3MgYXJlIGJlaW5nCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMKaW5kZXggYzFmZjAzYS4uZjczY2NiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9kbWEuYwpAQCAtMTYsMTUgKzE2LDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZG1hLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLWFjOTcuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvaXJxLmMKaW5kZXggOTY3NGRlNy4uMGUwZDY5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9pcnEuYwpAQCAtMjQsMTkgKzI0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9pcnEuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L2lycS5oPgogCiAjZGVmaW5lIElOVE1TSyhzdGFydCwgZW5kKSAoKDEgPDwgKChlbmQpICsgMSAtIChzdGFydCkpKSAtIDEpCiAKQEAgLTQ0LDcgKzQ0LDYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgc3Vic3JjLCBzdWJtc2s7CiAJdW5zaWduZWQgaW50IGVuZDsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKm15ZGVzYzsKIAogCS8qIHJlYWQgdGhlIGN1cnJlbnQgcGVuZGluZyBpbnRlcnJ1cHRzLCBhbmQgdGhlIG1hc2sKIAkgKiBmb3Igd2hhdCBpdCBpcyBhdmFpbGFibGUgKi8KQEAgLTU3LDEzICs1NiwxMSBAQAogCXN1YnNyYyAgJj0gKDEgPDwgbGVuKS0xOwogCiAJZW5kID0gbGVuICsgaXJxOwotCW15ZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCiAJZm9yICg7IGlycSA8IGVuZCAmJiBzdWJzcmM7IGlycSsrKSB7CiAJCWlmIChzdWJzcmMgJiAxKQotCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgbXlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCi0JCW15ZGVzYysrOwogCQlzdWJzcmMgPj49IDE7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9tYWNoLXNtZGsyNDQzLmMKaW5kZXggZTNjMGQ1OC4uYTdmZTY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jCkBAIC0yMSwzMCArMjEsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pZGxlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDEwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQwLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NvbW1vbi1zbWRrLmg+CisjaW5jbHVkZSA8cGxhdC9jb21tb24tc21kay5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNtZGsyNDQzX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJLyogSVNBIElPIFNwYWNlIG1hcCAobWVtb3J5IHNwYWNlIHNlbGVjdGVkIGJ5IEEyNCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvczNjMjQ0My5jCmluZGV4IDM3NzkzZjkuLmJiZWRkZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYwpAQCAtMjAsMjEgKzIwLDIxIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQzLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9kZXZzLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0NDMuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHMzYzI0NDNfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKIAlJT0RFU0NfRU5UKFdBVENIRE9HKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKaW5kZXggM2VmZWZiZC4uYWI1ODgzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMKQEAgLTk1LDE5ICs5NSwxOSBAQAogICogICBPbmUtaHVuZHJlZC10d2VudHktc2V2ZW4gMzIgS2lXIE1haW4gQmxvY2tzICg4MTI4IEtpIGIpCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiYWRnZTRfcGFydGl0aW9uc1tdID0gewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkJMT0IgYm9vdCBsb2FkZXIiLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICAgID0gMHgwMDAwQTAwMAotICAgICAgICB9LCB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gInBhcmFtcyIsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgICA9IDB4MDAwMDYwMDAKLSAgICAgICAgfSwgewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJyb290IiwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICAgID0gTVREUEFSVF9TSVpfRlVMTAotICAgICAgICB9CisJeworCQkubmFtZQk9ICJCTE9CIGJvb3QgbG9hZGVyIiwKKwkJLm9mZnNldAk9IDAsCisJCS5zaXplCT0gMHgwMDAwQTAwMAorCX0sIHsKKwkJLm5hbWUJPSAicGFyYW1zIiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJPSAweDAwMDA2MDAwCisJfSwgeworCQkubmFtZQk9ICJyb290IiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMCisJfQogfTsKIAogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGJhZGdlNF9mbGFzaF9kYXRhID0gewpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZpdmVfdl9vbl9zZXR1cChjaGFyICppZ25vcmUpCiB7Ci0gICAgICAgIGZpdmVfdl9vbiA9IDE7CisJZml2ZV92X29uID0gMTsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoImZpdmVfdl9vbiIsIGZpdmVfdl9vbl9zZXR1cCk7CkBAIC0xNzEsMTUgKzE3MSwxNSBAQAogCUdQQ1IgID0gQkFER0U0X0dQSU9fVEVTVFBUX0o3OwogCUdQRFIgfD0gQkFER0U0X0dQSU9fVEVTVFBUX0o3OwogCi0gCS8qIDVWIHN1cHBseSByYWlsLiAqLwotIAlHUENSICA9IEJBREdFNF9HUElPX1BDTUVONVY7CQkvKiBpbml0aWFsbHkgb2ZmICovCi0gIAlHUERSIHw9IEJBREdFNF9HUElPX1BDTUVONVY7CisJLyogNVYgc3VwcGx5IHJhaWwuICovCisJR1BDUiAgPSBCQURHRTRfR1BJT19QQ01FTjVWOwkJLyogaW5pdGlhbGx5IG9mZiAqLworCUdQRFIgfD0gQkFER0U0X0dQSU9fUENNRU41VjsKIAogCS8qIENQTEQgc2RyYW0gdHlwZSBpbnB1dHM7IHNldCB1cCBieSBibG9iICovCiAJLy9HUERSIHw9IChCQURHRTRfR1BJT19TRFRZUDEgfCBCQURHRTRfR1BJT19TRFRZUDApOwogCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IFNEUkFNIENQTEQgdHlwMT0lZCB0eXAwPSVkXG4iLAotCSAgICAgICAhIShHUExSICYgQkFER0U0X0dQSU9fU0RUWVAxKSwKLQkgICAgICAgISEoR1BMUiAmIEJBREdFNF9HUElPX1NEVFlQMCkpOworCQkhIShHUExSICYgQkFER0U0X0dQSU9fU0RUWVAxKSwKKwkJISEoR1BMUiAmIEJBREdFNF9HUElPX1NEVFlQMCkpOwogCiAJLyogU0ExMTExIHJlc2V0IHBpbjsgc2V0IHVwIGJ5IGJsb2IgKi8KIAkvL0dQU1IgID0gQkFER0U0X0dQSU9fU0ExMTExX05SU1Q7CkBAIC0yMDUsOCArMjA1LDggQEAKIAlyZXQgPSBiYWRnZTRfc2ExMTExX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IFNBLTExMTEgaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJCSIlczogU0EtMTExMSBpbml0aWFsaXphdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCByZXQpOwogCiAKIAkvKiBtYXliZSB0dXJuIG9uIDV2MCBmcm9tIHRoZSBzdGFydCAqLwpAQCAtMjU0LDcgKzI1NCw3IEBACiAKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBiYWRnZTRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0gIAl7CS8qIFNSQU0gIGJhbmsgMSAqLworCXsJLyogU1JBTSAgYmFuayAxICovCiAJCS52aXJ0dWFsCT0gMHhmMTAwMDAwMCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4MDgwMDAwMDApLAogCQkubGVuZ3RoCQk9IDB4MDAxMDAwMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTAwLmMKaW5kZXggZGEzYTg5OC4uMjQ0ZDU5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMDAuYwpAQCAtODgsNiArODgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAKKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgorCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpAQCAtMjIyLDcgKzIyNCw2IEBACiAJaWYgKHBvbGljeS0+Y3B1ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXBvbGljeS0+Y3VyID0gcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IHNhMTF4MF9nZXRzcGVlZCgwKTsKLQlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOwogCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IDU5MDAwOwogCXBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSA9IDI4NzAwMDsKIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOwpAQCAtMjQwLDcgKzI0MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNhMTEwMF9kcmFtX2luaXQodm9pZCkKIHsKLSAJaWYgKChwcm9jZXNzb3JfaWQgJiBDUFVfU0ExMTAwX01BU0spID09IENQVV9TQTExMDBfSUQpCisJaWYgKGNwdV9pc19zYTExMDAoKSkKIAkJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZzYTExMDBfZHJpdmVyKTsKIAllbHNlCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCmluZGV4IDAyOWRiZmIuLjNlNGZiMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKQEAgLTIzLDEwICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKaW5kZXggMTM2Mjk5NC4uYzFmYmQ1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGp1c3QgZm9yIHNjaGVkX2Nsb2NrKCkgLSBmdW5ueSB0aGF0ICovCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY250MzJfdG9fNjMuaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgPGFzbS9jbnQzMl90b182My5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTQyLDcgKzQyLDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjY2xrX2ZyZXF1ZW5jeV8xMDBraHpbTlJfRlJFUVNdID0gewogCSA1OTAsCS8qICA1OS4wIE1IeiAqLwogCSA3MzcsCS8qICA3My43IE1IeiAqLwotCSA4ODUsIAkvKiAgODguNSBNSHogKi8KKwkgODg1LAkvKiAgODguNSBNSHogKi8KIAkxMDMyLAkvKiAxMDMuMiBNSHogKi8KIAkxMTgwLAkvKiAxMTguMCBNSHogKi8KIAkxMzI3LAkvKiAxMzIuNyBNSHogKi8KQEAgLTUyLDEwICs1MiwxMCBAQAogCTE5MTcsCS8qIDE5MS43IE1IeiAqLwogCTIwNjQsCS8qIDIwNi40IE1IeiAqLwogCTIyMTIsCS8qIDIyMS4yIE1IeiAqLwotCTIzNTksICAgLyogMjM1LjkgTUh6ICovCi0JMjUwNywgICAvKiAyNTAuNyBNSHogKi8KLQkyNjU0LCAgIC8qIDI2NS40IE1IeiAqLwotCTI4MDIgICAgLyogMjgwLjIgTUh6ICovCisJMjM1OSwJLyogMjM1LjkgTUh6ICovCisJMjUwNywJLyogMjUwLjcgTUh6ICovCisJMjY1NCwJLyogMjY1LjQgTUh6ICovCisJMjgwMgkvKiAyODAuMiBNSHogKi8KIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9TQTExMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1NBMTExMCkKQEAgLTExMyw3ICsxMTMsNyBAQAogI2Vsc2UKIC8qCiAgKiBXZSBzdGlsbCBuZWVkIHRvIHByb3ZpZGUgdGhpcyBzbyBidWlsZGluZyB3aXRob3V0IGNwdWZyZXEgd29ya3MuCi0gKi8gCisgKi8KIHVuc2lnbmVkIGludCBjcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXJldHVybiBjY2xrX2ZyZXF1ZW5jeV8xMDBraHpbUFBDUiAmIDB4Zl0gKiAxMDA7CkBAIC0zODksNyArMzg5LDcgQEAKICAqLwogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHN0YW5kYXJkX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotICAJewkvKiBQQ00gKi8KKwl7CS8qIFBDTSAqLwogCQkudmlydHVhbAk9ICAweGY4MDAwMDAwLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oMHg4MDAwMDAwMCksCiAJCS5sZW5ndGgJCT0gMHgwMDEwMDAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9TQS0xMTAwLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvU0EtMTEwMC5oCmluZGV4IDYyYWFmMDQuLjRmN2VhMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9TQS0xMTAwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL1NBLTExMDAuaApAQCAtMjA1NCwxOSArMjA1NCwzIEBACiAgICAgICAgICAgICAgICAgCSAgICAgICAgCS8qIGFjdGl2ZSBkaXNwbGF5IG1vZGUpICAgICAgICAgICAgKi8KICNkZWZpbmUgTENDUjNfT3V0RW5ICShMQ0NSM19PRVAqMCkJLyogIE91dHB1dCBFbmFibGUgYWN0aXZlIEhpZ2ggICAgICAqLwogI2RlZmluZSBMQ0NSM19PdXRFbkwJKExDQ1IzX09FUCoxKQkvKiAgT3V0cHV0IEVuYWJsZSBhY3RpdmUgTG93ICAgICAgICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdW5zaWduZWQgaW50IHByb2Nlc3Nvcl9pZDsKLSNlbmRpZgotCi0jZGVmaW5lIENQVV9SRVZJU0lPTgkocHJvY2Vzc29yX2lkICYgMTUpCi0jZGVmaW5lIENQVV9TQTExMTBfQTAJKDApCi0jZGVmaW5lIENQVV9TQTExMTBfQjAJKDQpCi0jZGVmaW5lIENQVV9TQTExMTBfQjEJKDUpCi0jZGVmaW5lIENQVV9TQTExMTBfQjIJKDYpCi0jZGVmaW5lIENQVV9TQTExMTBfQjQJKDgpCi0KLSNkZWZpbmUgQ1BVX1NBMTEwMF9JRAkoMHg0NDAxYTExMCkKLSNkZWZpbmUgQ1BVX1NBMTEwMF9NQVNLCSgweGZmZmZmZmYwKQotI2RlZmluZSBDUFVfU0ExMTEwX0lECSgweDY5MDFiMTEwKQotI2RlZmluZSBDUFVfU0ExMTEwX01BU0sJKDB4ZmZmZmZmZjApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IDU5NzY0MzUuLmI3MDg0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0zNiw4ICszNiwyNiBAQAogI2RlZmluZSBpb192MnAoIHggKSAgICAgICAgICAgICBcCiAgICAoICgoKHgpJjB4MDBmZmZmZmYpIHwgKCgoeCkmKDB4MzAwMDAwMDA+PlZJT19TSElGVCkpPDxWSU9fU0hJRlQpKSArIFBJT19TVEFSVCApCiAKKyNkZWZpbmUgQ1BVX1NBMTExMF9BMAkoMCkKKyNkZWZpbmUgQ1BVX1NBMTExMF9CMAkoNCkKKyNkZWZpbmUgQ1BVX1NBMTExMF9CMQkoNSkKKyNkZWZpbmUgQ1BVX1NBMTExMF9CMgkoNikKKyNkZWZpbmUgQ1BVX1NBMTExMF9CNAkoOCkKKworI2RlZmluZSBDUFVfU0ExMTAwX0lECSgweDQ0MDFhMTEwKQorI2RlZmluZSBDUFVfU0ExMTAwX01BU0sJKDB4ZmZmZmZmZjApCisjZGVmaW5lIENQVV9TQTExMTBfSUQJKDB4NjkwMWIxMTApCisjZGVmaW5lIENQVV9TQTExMTBfTUFTSwkoMHhmZmZmZmZmMCkKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CisKKyNkZWZpbmUgQ1BVX1JFVklTSU9OCShyZWFkX2NwdWlkX2lkKCkgJiAxNSkKKworI2RlZmluZSBjcHVfaXNfc2ExMTAwKCkJKChyZWFkX2NwdWlkX2lkKCkgJiBDUFVfU0ExMTAwX01BU0spID09IENQVV9TQTExMDBfSUQpCisjZGVmaW5lIGNwdV9pc19zYTExMTAoKQkoKHJlYWRfY3B1aWRfaWQoKSAmIENQVV9TQTExMTBfTUFTSykgPT0gQ1BVX1NBMTExMF9JRCkKKwogIyBkZWZpbmUgX19SRUcoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilpb19wMnYoeCkpKQogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHVuc2lnbmVkIGxvbmcpJih4KSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9qb3JuYWRhNzIwLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvam9ybmFkYTcyMC5oCmluZGV4IGJjMTIwODUuLmNjNmI0YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9qb3JuYWRhNzIwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2pvcm5hZGE3MjAuaApAQCAtMSwxMCArMSwxMCBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9qb3JuYWRhNzIwLmgKICAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU1NQL01DVSBjb21tdW5pY2F0aW9uIGRlZmluaXRpb25zIGZvciBIUCBKb3JuYWRhIDcxMC83MjAvNzI4CisgKiBTU1AvTUNVIGNvbW11bmljYXRpb24gZGVmaW5pdGlvbnMgZm9yIEhQIEpvcm5hZGEgNzEwLzcyMC83MjgKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgS3Jpc3RvZmZlciBFcmljc29uIDxLcmlzdG9mZmVyLkVyaWNzb25AZ21haWwuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwMCBKb2huIEFua2Nvcm4gPGpjYUBsY3MubWl0LmVkdT4KKyAqIENvcHlyaWdodCAyMDA3LDIwMDggS3Jpc3RvZmZlciBFcmljc29uIDxLcmlzdG9mZmVyLkVyaWNzb25AZ21haWwuY29tPgorICogIENvcHlyaWdodCAyMDAwIEpvaG4gQW5rY29ybiA8amNhQGxjcy5taXQuZWR1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjUsMyArMjUsOCBAQAogI2RlZmluZSBQV01PRkYJCQkweERGCiAjZGVmaW5lIFRYRFVNTVkJCQkweDExCiAjZGVmaW5lIEVSUk9SQ09ERQkJMHgwMAorCitleHRlcm4gdm9pZCBqb3JuYWRhX3NzcF9zdGFydCh2b2lkKTsKK2V4dGVybiB2b2lkIGpvcm5hZGFfc3NwX2VuZCh2b2lkKTsKK2V4dGVybiBpbnQgam9ybmFkYV9zc3BfaW5vdXQodTggYnl0ZSk7CitleHRlcm4gaW50IGpvcm5hZGFfc3NwX2J5dGUodTggYnl0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjlmNjM5ZS4uMWMxMjdiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtNDAsMjMgKzQwLDIxIEBACiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJIF9fcGh5c190b192aXJ0KHgpCiAKIC8qCi0gKiBCZWNhdXNlIG9mIHRoZSB3aWRlIG1lbW9yeSBhZGRyZXNzIHNwYWNlIGJldHdlZW4gcGh5c2ljYWwgUkFNIGJhbmtzIG9uIHRoZSAKLSAqIFNBMTEwMCwgaXQncyBtdWNoIGNvbnZlbmllbnQgdG8gdXNlIExpbnV4J3MgTlVNQSBzdXBwb3J0IHRvIGltcGxlbWVudCBvdXIgCi0gKiBtZW1vcnkgbWFwIHJlcHJlc2VudGF0aW9uLiAgQXNzdW1pbmcgYWxsIG1lbW9yeSBub2RlcyBoYXZlIGVxdWFsIGFjY2VzcyAKKyAqIEJlY2F1c2Ugb2YgdGhlIHdpZGUgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgYmV0d2VlbiBwaHlzaWNhbCBSQU0gYmFua3Mgb24gdGhlCisgKiBTQTExMDAsIGl0J3MgbXVjaCBjb252ZW5pZW50IHRvIHVzZSBMaW51eCdzIFNwYXJzZU1FTSBzdXBwb3J0IHRvIGltcGxlbWVudAorICogb3VyIG1lbW9yeSBtYXAgcmVwcmVzZW50YXRpb24uICBBc3N1bWluZyBhbGwgbWVtb3J5IG5vZGVzIGhhdmUgZXF1YWwgYWNjZXNzCiAgKiBjaGFyYWN0ZXJpc3RpY3MsIHdlIHRoZW4gaGF2ZSBnZW5lcmljIGRpc2NvbnRpZ3VvdXMgbWVtb3J5IHN1cHBvcnQuCiAgKgotICogT2YgY291cnNlLCBhbGwgdGhpcyBpc24ndCBtYW5kYXRvcnkgZm9yIFNBMTEwMCBpbXBsZW1lbnRhdGlvbnMgd2l0aCBvbmx5Ci0gKiBvbmUgdXNlZCBtZW1vcnkgYmFuay4gIEZvciB0aG9zZSwgc2ltcGx5IHVuZGVmaW5lIENPTkZJR19ESVNDT05USUdNRU0uCi0gKgotICogVGhlIG5vZGVzIGFyZSBtYXRjaGVkIHdpdGggdGhlIHBoeXNpY2FsIG1lbW9yeSBiYW5rIGFkZHJlc3NlcyB3aGljaCBhcmUgCi0gKiBpbmNpZGVudGFsbHkgdGhlIHNhbWUgYXMgdmlydHVhbCBhZGRyZXNzZXMuCisgKiBUaGUgc3BhcnNlbWVtIGJhbmtzIGFyZSBtYXRjaGVkIHdpdGggdGhlIHBoeXNpY2FsIG1lbW9yeSBiYW5rIGFkZHJlc3NlcworICogd2hpY2ggYXJlIGluY2lkZW50YWxseSB0aGUgc2FtZSBhcyB2aXJ0dWFsIGFkZHJlc3Nlcy4KICAqIAogICogCW5vZGUgMDogIDB4YzAwMDAwMDAgLSAweGM3ZmZmZmZmCiAgKiAJbm9kZSAxOiAgMHhjODAwMDAwMCAtIDB4Y2ZmZmZmZmYKICAqIAlub2RlIDI6ICAweGQwMDAwMDAwIC0gMHhkN2ZmZmZmZgogICogCW5vZGUgMzogIDB4ZDgwMDAwMDAgLSAweGRmZmZmZmZmCiAgKi8KLSNkZWZpbmUgTk9ERV9NRU1fU0laRV9CSVRTCTI3CisjZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJMzIKKyNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJMjcKIAogLyoKICAqIENhY2hlIGZsdXNoaW5nIGFyZWEgLSBTQTExMDAgemVybyBiYW5rCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCmluZGV4IDg2MzY5YTguLjMwOTNkNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCkBAIC0xMjIsMTQgKzEyMiwxMiBAQAogCQlHRURSID0gbWFzazsKIAogCQlpcnEgPSBJUlFfR1BJTzExOwotCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJCW1hc2sgPj49IDExOwogCQlkbyB7CiAJCQlpZiAobWFzayAmIDEpCi0JCQkJZGVzY19oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCQltYXNrID4+PSAxOwogCQkJaXJxKys7Ci0JCQlkZXNjKys7CiAJCX0gd2hpbGUgKG1hc2spOwogCiAJCW1hc2sgPSBHRURSICYgMHhmZmZmZjgwMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjBfc3NwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwX3NzcC5jCmluZGV4IDA2ZWE3YWIuLjI4Y2YzNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjBfc3NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMF9zc3AuYwpAQCAtMjEsOCArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc3NwLmg+CiAjaW5jbHVkZSA8bWFjaC9qb3JuYWRhNzIwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NzcC5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGpvcm5hZGFfc3NwX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgam9ybmFkYV9zc3BfZmxhZ3M7CkBAIC0xMDksMTIgKzEwOSwxMiBAQAogICogam9ybmFkYV9zc3Bfc3RhcnQgLSBlbmFibGUgbWN1CiAgKgogICovCi1pbnQgam9ybmFkYV9zc3Bfc3RhcnQoKQordm9pZCBqb3JuYWRhX3NzcF9zdGFydCh2b2lkKQogewogCXNwaW5fbG9ja19pcnFzYXZlKCZqb3JuYWRhX3NzcF9sb2NrLCBqb3JuYWRhX3NzcF9mbGFncyk7CiAJR1BDUiA9IEdQSU9fR1BJTzI1OwogCXVkZWxheSg1MCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOwogfTsKIEVYUE9SVF9TWU1CT0woam9ybmFkYV9zc3Bfc3RhcnQpOwogCkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogICogam9ybmFkYV9zc3BfZW5kIC0gZGlzYWJsZSBtY3UgYW5kIHR1cm4gb2ZmIGxvY2sKICAqCiAgKi8KLWludCBqb3JuYWRhX3NzcF9lbmQoKQordm9pZCBqb3JuYWRhX3NzcF9lbmQodm9pZCkKIHsKIAlHUFNSID0gR1BJT19HUElPMjU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmam9ybmFkYV9zc3BfbG9jaywgam9ybmFkYV9zc3BfZmxhZ3MpOwotCXJldHVybiAwOworCXJldHVybjsKIH07CiBFWFBPUlRfU1lNQk9MKGpvcm5hZGFfc3NwX2VuZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9uZXBvbnNldC5jCmluZGV4IDQ4NTZhNmIuLjZjY2QxNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYwpAQCAtMzMsOCArMzMsNiBAQAogCXVuc2lnbmVkIGludCBpcnI7CiAKIAl3aGlsZSAoMSkgewotCQlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7Ci0KIAkJLyoKIAkJICogQWNrbm93bGVkZ2UgdGhlIHBhcmVudCBJUlEuCiAJCSAqLwpAQCAtNjcsMjEgKzY1LDE4IEBACiAJCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKIAogCQkJaWYgKGlyciAmIElSUl9FVEhFUk5FVCkgewotCQkJCWQgPSBpcnFfZGVzYyArIElSUV9ORVBPTlNFVF9TTUM5MTk2OwotCQkJCWRlc2NfaGFuZGxlX2lycShJUlFfTkVQT05TRVRfU01DOTE5NiwgZCk7CisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9ORVBPTlNFVF9TTUM5MTk2KTsKIAkJCX0KIAogCQkJaWYgKGlyciAmIElSUl9VU0FSKSB7Ci0JCQkJZCA9IGlycV9kZXNjICsgSVJRX05FUE9OU0VUX1VTQVI7Ci0JCQkJZGVzY19oYW5kbGVfaXJxKElSUV9ORVBPTlNFVF9VU0FSLCBkKTsKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX05FUE9OU0VUX1VTQVIpOwogCQkJfQogCiAJCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKIAkJfQogCiAJCWlmIChpcnIgJiBJUlJfU0ExMTExKSB7Ci0JCQlkID0gaXJxX2Rlc2MgKyBJUlFfTkVQT05TRVRfU0ExMTExOwotCQkJZGVzY19oYW5kbGVfaXJxKElSUV9ORVBPTlNFVF9TQTExMTEsIGQpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9ORVBPTlNFVF9TQTExMTEpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCmluZGV4IDgzYmUxYzYuLmU0NWQzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKQEAgLTgsMTEgKzgsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCkBAIC0zOSw4ICszOCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gIFBMRUJfRVRIMF9QLAotCQkuZW5kCT0gIFBMRUJfRVRIMF9QIHwgMHgwM2ZmZmZmZiwKKwkJLnN0YXJ0CT0gUExFQl9FVEgwX1AsCisJCS5lbmQJPSBQTEVCX0VUSDBfUCB8IDB4MDNmZmZmZmYsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAjaWYgMCAvKiBBdXRvcHJvYmUgaW5zdGVhZCwgdG8gZ2V0IHJpc2luZy9mYWxsaW5nIGVkZ2UgY2hhcmFjdGVyaXN0aWMgcmlnaHQgKi8KQEAgLTg3LDE1ICs4NiwxNSBAQAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBsZWJfcGFydGl0aW9uc1tdID0gewogCXsKIAkJLm5hbWUJCT0gImJsb2IiLAotCQkub2Zmc2V0IAk9IDAsCisJCS5vZmZzZXQJCT0gMCwKIAkJLnNpemUJCT0gMHgwMDAyMDAwMCwKIAl9LCB7CiAJCS5uYW1lCQk9ICJrZXJuZWwiLAotCQkub2Zmc2V0IAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCiAJCS5zaXplCQk9IDB4MDAwZTAwMDAsCiAJfSwgewogCQkubmFtZQkJPSAicm9vdGZzIiwKLQkJLm9mZnNldCAJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAogCQkuc2l6ZQkJPSAweDAwMzAwMDAwLAogCX0KIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCmluZGV4IDhkZDYzNTMuLjNjNzQ1MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zc3AuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jCmluZGV4IDY0MWYzNjEuLmIyMGZmOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NzcC5jCkBAIC0xNyw4ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zc3AuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggMDlkOWYzMy4uYTk0MDBkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTksMTAgKzksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCA4NWFjZWVmLi5lNDViZDczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAorKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtNiw3ICs2LDcgQEAKICNpZm5kZWYgX19BU01fQVJDSF9TWVNURU1fSAogI2RlZmluZSBfX0FTTV9BUkNIX1NZU1RFTV9ICiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiBzdGF0aWMgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2lycS5jCmluZGV4IDQ0YjA4MTEuLmMwNGViNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9pcnEuYwpAQCAtMTEsOSArMTEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL2xlZHMuYyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvbGVkcy5jCmluZGV4IGIxODk2NDcuLjhiZDhkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvbGVkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvbGVkcy5jCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjZGVmaW5lIExFRF9TVEFURV9FTkFCTEVECTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCBkNzVlNzk1Li41NjVlMGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbnQzMl90b182My5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vY250MzJfdG9fNjMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hcm1fdGltZXIuaD4KQEAgLTk1LDggKzk1LDcgQEAKIAogCQlpcnEgKz0gSVJRX1NJQ19TVEFSVDsKIAotCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCWRlc2NfaGFuZGxlX2lycShpcnEsIGRlc2MpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAl9IHdoaWxlIChzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvc3lzdGVtLmgKaW5kZXggOTFmYTU1OS4uYzU5ZTYxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMjEsOCArMjEsOCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwppbmRleCAzNmYyM2Y4Li43MTYxYmEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwpAQCAtMjEsOSArMjEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKaW5kZXggNzYzNzVjNi4uYmI4ZWM3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKaW5kZXggMTcyNWYwMS4uYWEwNTFjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IGVkMTVmODcuLmQxMTkzODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtNDI4LDcgKzQyOCw3IEBACiAjIEFSTXY3CiBjb25maWcgQ1BVX1Y3CiAJYm9vbCAiU3VwcG9ydCBBUk0gVjcgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gQVJDSF9JTlRFR1JBVE9SIHx8IE1BQ0hfUkVBTFZJRVdfRUIKKwlkZXBlbmRzIG9uIEFSQ0hfSU5URUdSQVRPUiB8fCBNQUNIX1JFQUxWSUVXX0VCIHx8IEFSQ0hfT01BUDMKIAlzZWxlY3QgQ1BVXzMydjZLCiAJc2VsZWN0IENQVV8zMnY3CiAJc2VsZWN0IENQVV9BQlJUX0VWNwpAQCAtNzM1LDYgKzczNSwxNCBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIEZlcm9jZW9uIEwyIGNhY2hlIGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBDQUNIRV9GRVJPQ0VPTl9MMl9XUklURVRIUk9VR0gKKwlib29sICJGb3JjZSBGZXJvY2VvbiBMMiBjYWNoZSB3cml0ZSB0aHJvdWdoIgorCWRlcGVuZHMgb24gQ0FDSEVfRkVST0NFT05fTDIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHVzZSB0aGUgRmVyb2Nlb24gTDIgY2FjaGUgaW4gd3JpdGV0aHJvdWdoIG1vZGUuCisJICBVbmxlc3MgeW91IHNwZWNpZmljYWxseSByZXF1aXJlIHRoaXMsIHNheSBOIGZvciB3cml0ZWJhY2sgbW9kZS4KKwogY29uZmlnIENBQ0hFX0wyWDAKIAlib29sICJFbmFibGUgdGhlIEwyeDAgb3V0ZXIgY2FjaGUgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFJFQUxWSUVXX0VCX0FSTTExTVAgfHwgTUFDSF9SRUFMVklFV19QQjExTVAgfHwgTUFDSF9SRUFMVklFV19QQjExNzYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL01ha2VmaWxlIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKaW5kZXggMmUyN2E4Yy4uNDgwZjc4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbW0vTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXggYXJtLXNwZWNpZmljIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KICMKIAotb2JqLXkJCQkJOj0gY29uc2lzdGVudC5vIGV4dGFibGUubyBmYXVsdC5vIGluaXQubyBcCitvYmoteQkJCQk6PSBkbWEtbWFwcGluZy5vIGV4dGFibGUubyBmYXVsdC5vIGluaXQubyBcCiAJCQkJICAgaW9tYXAubwogCiBvYmotJChDT05GSUdfTU1VKQkJKz0gZmF1bHQtYXJtdi5vIGZsdXNoLm8gaW9yZW1hcC5vIG1tYXAubyBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hYm9ydC1ldjcuUyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2Ny5TCmluZGV4IGViOTBiY2UuLjJlNmRjMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LWV2Ny5TCisrKyBiL2FyY2gvYXJtL21tL2Fib3J0LWV2Ny5TCkBAIC0zMCwzICszMCw0IEBACiAJICogTmV3IGRlc2lnbnMgc2hvdWxkIG5vdCBuZWVkIHRvIHBhdGNoIHVwIGZhdWx0cy4KIAkgKi8KIAltb3YJcGMsIGxyCitFTkRQUk9DKHY3X2Vhcmx5X2Fib3J0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWJvcnQtbm9tbXUuUyBiL2FyY2gvYXJtL21tL2Fib3J0LW5vbW11LlMKaW5kZXggYTdjYzdmOWUuLjYyNWU1ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2Fib3J0LW5vbW11LlMKKysrIGIvYXJjaC9hcm0vbW0vYWJvcnQtbm9tbXUuUwpAQCAtMTcsMyArMTcsNCBAQAogCW1vdglyMCwgIzAJCQkJQCBjbGVhciByMCwgcjEgKG5vIEZTUi9GQVIpCiAJbW92CXIxLCAjMAogCW1vdglwYywgbHIKK0VORFBST0Mobm9tbXVfZWFybHlfYWJvcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCmluZGV4IGUxNjJjY2EuLjEzM2U2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCisrKyBiL2FyY2gvYXJtL21tL2FsaWdubWVudC5jCkBAIC0xNyw4ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgImZhdWx0LmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS1mZXJvY2Vvbi1sMi5jIGIvYXJjaC9hcm0vbW0vY2FjaGUtZmVyb2Nlb24tbDIuYwppbmRleCA3YjVhMjVkLi4xM2NkYWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS1mZXJvY2Vvbi1sMi5jCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWZlcm9jZW9uLWwyLmMKQEAgLTQ4LDExICs0OCwxMiBAQAogCSAqIEwyIGlzIFBJUFQgYW5kIHJhbmdlIG9wZXJhdGlvbnMgb25seSBkbyBhIFRMQiBsb29rdXAgb24KIAkgKiB0aGUgc3RhcnQgYWRkcmVzcy4KIAkgKi8KLQlCVUdfT04oKHN0YXJ0IF4gZW5kKSAmIH4oUEFHRV9TSVpFIC0gMSkpOworCUJVR19PTigoc3RhcnQgXiBlbmQpID4+IFBBR0VfU0hJRlQpOwogCiAJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX2FzbV9fKCJtY3IgcDE1LCAxLCAlMCwgYzE1LCBjOSwgNCIgOiA6ICJyIiAoc3RhcnQpKTsKLQlfX2FzbV9fKCJtY3IgcDE1LCAxLCAlMCwgYzE1LCBjOSwgNSIgOiA6ICJyIiAoZW5kKSk7CisJX19hc21fXygibWNyIHAxNSwgMSwgJTAsIGMxNSwgYzksIDRcblx0IgorCQkibWNyIHAxNSwgMSwgJTEsIGMxNSwgYzksIDUiCisJCTogOiAiciIgKHN0YXJ0KSwgInIiIChlbmQpKTsKIAlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCkBAIC04MCwxMSArODEsMTIgQEAKIAkgKiBMMiBpcyBQSVBUIGFuZCByYW5nZSBvcGVyYXRpb25zIG9ubHkgZG8gYSBUTEIgbG9va3VwIG9uCiAJICogdGhlIHN0YXJ0IGFkZHJlc3MuCiAJICovCi0JQlVHX09OKChzdGFydCBeIGVuZCkgJiB+KFBBR0VfU0laRSAtIDEpKTsKKwlCVUdfT04oKHN0YXJ0IF4gZW5kKSA+PiBQQUdFX1NISUZUKTsKIAogCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX19hc21fXygibWNyIHAxNSwgMSwgJTAsIGMxNSwgYzExLCA0IiA6IDogInIiIChzdGFydCkpOwotCV9fYXNtX18oIm1jciBwMTUsIDEsICUwLCBjMTUsIGMxMSwgNSIgOiA6ICJyIiAoZW5kKSk7CisJX19hc21fXygibWNyIHAxNSwgMSwgJTAsIGMxNSwgYzExLCA0XG5cdCIKKwkJIm1jciBwMTUsIDEsICUxLCBjMTUsIGMxMSwgNSIKKwkJOiA6ICJyIiAoc3RhcnQpLCAiciIgKGVuZCkpOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTIwNSw3ICsyMDcsNyBAQAogICogdGltZS4gIFRoZXNlIGFyZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgTDIgY2FjaGUgY2FuIG9ubHkgYmUgZW5hYmxlZAogICogb3IgZGlzYWJsZWQgd2hpbGUgdGhlIEwxIERjYWNoZSBhbmQgSWNhY2hlIGFyZSBib3RoIGRpc2FibGVkLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW52YWxpZGF0ZV9hbmRfZGlzYWJsZV9kY2FjaGUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGZsdXNoX2FuZF9kaXNhYmxlX2RjYWNoZSh2b2lkKQogewogCXUzMiBjcjsKIApAQCAtMjE3LDcgKzIxOSw5IEBACiAJCWZsdXNoX2NhY2hlX2FsbCgpOwogCQlzZXRfY3IoY3IgJiB+Q1JfQyk7CiAJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAxOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGVuYWJsZV9kY2FjaGUodm9pZCkKQEAgLTIyNSwxOCArMjI5LDE3IEBACiAJdTMyIGNyOwogCiAJY3IgPSBnZXRfY3IoKTsKLQlpZiAoIShjciAmIENSX0MpKQotCQlzZXRfY3IoY3IgfCBDUl9DKTsKKwlzZXRfY3IoY3IgfCBDUl9DKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IF9faW52YWxpZGF0ZV9pY2FjaGUodm9pZCkKIHsKIAlpbnQgZHVtbXk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgMFxuIiA6ICI9ciIgKGR1bW15KSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1jciBwMTUsIDAsICUwLCBjNywgYzUsIDAiIDogIj1yIiAoZHVtbXkpKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGludmFsaWRhdGVfYW5kX2Rpc2FibGVfaWNhY2hlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbnZhbGlkYXRlX2FuZF9kaXNhYmxlX2ljYWNoZSh2b2lkKQogewogCXUzMiBjcjsKIApAQCAtMjQ0LDcgKzI0Nyw5IEBACiAJaWYgKGNyICYgQ1JfSSkgewogCQlzZXRfY3IoY3IgJiB+Q1JfSSk7CiAJCV9faW52YWxpZGF0ZV9pY2FjaGUoKTsKKwkJcmV0dXJuIDE7CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX2ljYWNoZSh2b2lkKQpAQCAtMjUyLDggKzI1Nyw3IEBACiAJdTMyIGNyOwogCiAJY3IgPSBnZXRfY3IoKTsKLQlpZiAoIShjciAmIENSX0kpKQotCQlzZXRfY3IoY3IgfCBDUl9JKTsKKwlzZXRfY3IoY3IgfCBDUl9JKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgcmVhZF9leHRyYV9mZWF0dXJlcyh2b2lkKQpAQCAtMjkxLDEzICsyOTUsMTcgQEAKIAogCXUgPSByZWFkX2V4dHJhX2ZlYXR1cmVzKCk7CiAJaWYgKCEodSAmIDB4MDA0MDAwMDApKSB7CisJCWludCBpLCBkOworCiAJCXByaW50ayhLRVJOX0lORk8gIkZlcm9jZW9uIEwyOiBFbmFibGluZyBMMlxuIik7CiAKLQkJaW52YWxpZGF0ZV9hbmRfZGlzYWJsZV9kY2FjaGUoKTsKLQkJaW52YWxpZGF0ZV9hbmRfZGlzYWJsZV9pY2FjaGUoKTsKKwkJZCA9IGZsdXNoX2FuZF9kaXNhYmxlX2RjYWNoZSgpOworCQlpID0gaW52YWxpZGF0ZV9hbmRfZGlzYWJsZV9pY2FjaGUoKTsKIAkJd3JpdGVfZXh0cmFfZmVhdHVyZXModSB8IDB4MDA0MDAwMDApOwotCQllbmFibGVfaWNhY2hlKCk7Ci0JCWVuYWJsZV9kY2FjaGUoKTsKKwkJaWYgKGkpCisJCQllbmFibGVfaWNhY2hlKCk7CisJCWlmIChkKQorCQkJZW5hYmxlX2RjYWNoZSgpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCmluZGV4IDc2YjgwMGEuLmI0ODBmMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYworKysgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKQEAgLTE4LDkgKzE4LDkgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CiAKICNkZWZpbmUgQ0FDSEVfTElORV9TSVpFCQkzMgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKaW5kZXggMzVmZmM0ZC4uZDE5YzJiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCkBAIC02Niw2ICs2Niw3IEBACiAJbWNyCXAxNSwgMiwgcjEwLCBjMCwgYzAsIDAJCUAgc2VsZWN0IGN1cnJlbnQgY2FjaGUgbGV2ZWwgaW4gY3NzcgogCWlzYgogCW1vdglwYywgbHIKK0VORFBST0ModjdfZmx1c2hfZGNhY2hlX2FsbCkKIAogLyoKICAqCXY3X2ZsdXNoX2NhY2hlX2FsbCgpCkBAIC04NSw2ICs4Niw3IEBACiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMAkJQCBJK0JUQiBjYWNoZSBpbnZhbGlkYXRlCiAJbGRtZmQJc3AhLCB7cjQtcjUsIHI3LCByOS1yMTEsIGxyfQogCW1vdglwYywgbHIKK0VORFBST0ModjdfZmx1c2hfa2Vybl9jYWNoZV9hbGwpCiAKIC8qCiAgKgl2N19mbHVzaF9jYWNoZV9hbGwoKQpAQCAtMTEwLDYgKzExMiw4IEBACiAgKi8KIEVOVFJZKHY3X2ZsdXNoX3VzZXJfY2FjaGVfcmFuZ2UpCiAJbW92CXBjLCBscgorRU5EUFJPQyh2N19mbHVzaF91c2VyX2NhY2hlX2FsbCkKK0VORFBST0ModjdfZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKIAogLyoKICAqCXY3X2NvaGVyZW50X2tlcm5fcmFuZ2Uoc3RhcnQsZW5kKQpAQCAtMTU1LDYgKzE1OSw4IEBACiAJZHNiCiAJaXNiCiAJbW92CXBjLCBscgorRU5EUFJPQyh2N19jb2hlcmVudF9rZXJuX3JhbmdlKQorRU5EUFJPQyh2N19jb2hlcmVudF91c2VyX3JhbmdlKQogCiAvKgogICoJdjdfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZShrYWRkcikKQEAgLTE3NCw2ICsxODAsNyBAQAogCWJsbwkxYgogCWRzYgogCW1vdglwYywgbHIKK0VORFBST0ModjdfZmx1c2hfa2Vybl9kY2FjaGVfcGFnZSkKIAogLyoKICAqCXY3X2RtYV9pbnZfcmFuZ2Uoc3RhcnQsZW5kKQpAQCAtMjAyLDYgKzIwOSw3IEBACiAJYmxvCTFiCiAJZHNiCiAJbW92CXBjLCBscgorRU5EUFJPQyh2N19kbWFfaW52X3JhbmdlKQogCiAvKgogICoJdjdfZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LGVuZCkKQEAgLTIxOSw2ICsyMjcsNyBAQAogCWJsbwkxYgogCWRzYgogCW1vdglwYywgbHIKK0VORFBST0ModjdfZG1hX2NsZWFuX3JhbmdlKQogCiAvKgogICoJdjdfZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LGVuZCkKQEAgLTIzNiw2ICsyNDUsNyBAQAogCWJsbwkxYgogCWRzYgogCW1vdglwYywgbHIKK0VORFBST0ModjdfZG1hX2ZsdXNoX3JhbmdlKQogCiAJX19JTklUREFUQQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS14c2MzbDIuYyBiL2FyY2gvYXJtL21tL2NhY2hlLXhzYzNsMi5jCmluZGV4IDE1OGJkOTYuLjEwYjFiYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLXhzYzNsMi5jCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXhzYzNsMi5jCkBAIC0xOCwxMCArMTgsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIENSX0wyCSgxIDw8IDI2KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMgYi9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2IzZTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IFJ1c3NlbGwgS2luZwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIERNQSB1bmNhY2hlZCBtYXBwaW5nIHN1cHBvcnQuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0vKiBTYW5pdHkgY2hlY2sgc2l6ZSAqLwotI2lmIChDT05TSVNURU5UX0RNQV9TSVpFICUgU1pfMk0pCi0jZXJyb3IgIkNPTlNJU1RFTlRfRE1BX1NJWkUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyTWlCIgotI2VuZGlmCi0KLSNkZWZpbmUgQ09OU0lTVEVOVF9FTkQJKDB4ZmZlMDAwMDApCi0jZGVmaW5lIENPTlNJU1RFTlRfQkFTRQkoQ09OU0lTVEVOVF9FTkQgLSBDT05TSVNURU5UX0RNQV9TSVpFKQotCi0jZGVmaW5lIENPTlNJU1RFTlRfT0ZGU0VUKHgpCSgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gQ09OU0lTVEVOVF9CQVNFKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSBDT05TSVNURU5UX1BURV9JTkRFWCh4KSAoKCh1bnNpZ25lZCBsb25nKSh4KSAtIENPTlNJU1RFTlRfQkFTRSkgPj4gUEdESVJfU0hJRlQpCi0jZGVmaW5lIE5VTV9DT05TSVNURU5UX1BURVMgKENPTlNJU1RFTlRfRE1BX1NJWkUgPj4gUEdESVJfU0hJRlQpCi0KLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgcGFnZSB0YWJsZXMgKDJNQiBlYWNoKSBjb3ZlcmluZyB1bmNhY2hlZCwgRE1BIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMKLSAqLwotc3RhdGljIHB0ZV90ICpjb25zaXN0ZW50X3B0ZVtOVU1fQ09OU0lTVEVOVF9QVEVTXTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29uc2lzdGVudF9sb2NrKTsKLQotLyoKLSAqIFZNIHJlZ2lvbiBoYW5kbGluZyBzdXBwb3J0LgotICoKLSAqIFRoaXMgc2hvdWxkIGJlY29tZSBzb21ldGhpbmcgZ2VuZXJpYywgaGFuZGxpbmcgVk0gcmVnaW9uIGFsbG9jYXRpb25zIGZvcgotICogdm1hbGxvYyBhbmQgc2ltaWxhciAoaW9yZW1hcCwgbW9kdWxlIHNwYWNlLCBldGMpLgotICoKLSAqIEkgZW52aXNhZ2Ugdm1hbGxvYygpJ3Mgc3VwcG9ydGluZyB2bV9zdHJ1Y3QgYmVjb21pbmc6Ci0gKgotICogIHN0cnVjdCB2bV9zdHJ1Y3QgewotICogICAgc3RydWN0IHZtX3JlZ2lvbglyZWdpb247Ci0gKiAgICB1bnNpZ25lZCBsb25nCWZsYWdzOwotICogICAgc3RydWN0IHBhZ2UJKipwYWdlczsKLSAqICAgIHVuc2lnbmVkIGludAlucl9wYWdlczsKLSAqICAgIHVuc2lnbmVkIGxvbmcJcGh5c19hZGRyOwotICogIH07Ci0gKgotICogZ2V0X3ZtX2FyZWEoKSB3b3VsZCB0aGVuIGNhbGwgdm1fcmVnaW9uX2FsbG9jIHdpdGggYW4gYXBwcm9wcmlhdGUKLSAqIHN0cnVjdCB2bV9yZWdpb24gaGVhZCAoZWcpOgotICoKLSAqICBzdHJ1Y3Qgdm1fcmVnaW9uIHZtYWxsb2NfaGVhZCA9IHsKLSAqCS52bV9saXN0CT0gTElTVF9IRUFEX0lOSVQodm1hbGxvY19oZWFkLnZtX2xpc3QpLAotICoJLnZtX3N0YXJ0CT0gVk1BTExPQ19TVEFSVCwKLSAqCS52bV9lbmQJCT0gVk1BTExPQ19FTkQsCi0gKiAgfTsKLSAqCi0gKiBIb3dldmVyLCB2bWFsbG9jX2hlYWQudm1fc3RhcnQgaXMgdmFyaWFibGUgKHR5cGljYWxseSwgaXQgaXMgZGVwZW5kZW50IG9uCi0gKiB0aGUgYW1vdW50IG9mIFJBTSBmb3VuZCBhdCBib290IHRpbWUuKSAgSSB3b3VsZCBpbWFnaW5lIHRoYXQgZ2V0X3ZtX2FyZWEoKQotICogd291bGQgaGF2ZSB0byBpbml0aWFsaXNlIHRoaXMgZWFjaCB0aW1lIHByaW9yIHRvIGNhbGxpbmcgdm1fcmVnaW9uX2FsbG9jKCkuCi0gKi8KLXN0cnVjdCB2bV9yZWdpb24gewotCXN0cnVjdCBsaXN0X2hlYWQJdm1fbGlzdDsKLQl1bnNpZ25lZCBsb25nCQl2bV9zdGFydDsKLQl1bnNpZ25lZCBsb25nCQl2bV9lbmQ7Ci0Jc3RydWN0IHBhZ2UJCSp2bV9wYWdlczsKLQlpbnQJCQl2bV9hY3RpdmU7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZtX3JlZ2lvbiBjb25zaXN0ZW50X2hlYWQgPSB7Ci0JLnZtX2xpc3QJPSBMSVNUX0hFQURfSU5JVChjb25zaXN0ZW50X2hlYWQudm1fbGlzdCksCi0JLnZtX3N0YXJ0CT0gQ09OU0lTVEVOVF9CQVNFLAotCS52bV9lbmQJCT0gQ09OU0lTVEVOVF9FTkQsCi19OwotCi1zdGF0aWMgc3RydWN0IHZtX3JlZ2lvbiAqCi12bV9yZWdpb25fYWxsb2Moc3RydWN0IHZtX3JlZ2lvbiAqaGVhZCwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSBoZWFkLT52bV9zdGFydCwgZW5kID0gaGVhZC0+dm1fZW5kIC0gc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB2bV9yZWdpb24gKmMsICpuZXc7Ci0KLQluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1fcmVnaW9uKSwgZ2ZwKTsKLQlpZiAoIW5ldykKLQkJZ290byBvdXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoZWFkLT52bV9saXN0LCB2bV9saXN0KSB7Ci0JCWlmICgoYWRkciArIHNpemUpIDwgYWRkcikKLQkJCWdvdG8gbm9zcGM7Ci0JCWlmICgoYWRkciArIHNpemUpIDw9IGMtPnZtX3N0YXJ0KQotCQkJZ290byBmb3VuZDsKLQkJYWRkciA9IGMtPnZtX2VuZDsKLQkJaWYgKGFkZHIgPiBlbmQpCi0JCQlnb3RvIG5vc3BjOwotCX0KLQotIGZvdW5kOgotCS8qCi0JICogSW5zZXJ0IHRoaXMgZW50cnkgX2JlZm9yZV8gdGhlIG9uZSB3ZSBmb3VuZC4KLQkgKi8KLQlsaXN0X2FkZF90YWlsKCZuZXctPnZtX2xpc3QsICZjLT52bV9saXN0KTsKLQluZXctPnZtX3N0YXJ0ID0gYWRkcjsKLQluZXctPnZtX2VuZCA9IGFkZHIgKyBzaXplOwotCW5ldy0+dm1fYWN0aXZlID0gMTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOwotCXJldHVybiBuZXc7Ci0KLSBub3NwYzoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKLQlrZnJlZShuZXcpOwotIG91dDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9yZWdpb24gKnZtX3JlZ2lvbl9maW5kKHN0cnVjdCB2bV9yZWdpb24gKmhlYWQsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlzdHJ1Y3Qgdm1fcmVnaW9uICpjOwotCQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmhlYWQtPnZtX2xpc3QsIHZtX2xpc3QpIHsKLQkJaWYgKGMtPnZtX2FjdGl2ZSAmJiBjLT52bV9zdGFydCA9PSBhZGRyKQotCQkJZ290byBvdXQ7Ci0JfQotCWMgPSBOVUxMOwotIG91dDoKLQlyZXR1cm4gYzsKLX0KLQotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLSNlcnJvciBBUk0gQ29oZXJlbnQgRE1BIGFsbG9jYXRvciBkb2VzIG5vdCAoeWV0KSBzdXBwb3J0IGh1Z2UgVExCCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgKgotX19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLCBnZnBfdCBnZnAsCi0JICAgIHBncHJvdF90IHByb3QpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHZtX3JlZ2lvbiAqYzsKLQl1bnNpZ25lZCBsb25nIG9yZGVyOwotCXU2NCBtYXNrID0gSVNBX0RNQV9USFJFU0hPTEQsIGxpbWl0OwotCi0JaWYgKCFjb25zaXN0ZW50X3B0ZVswXSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgaW5pdGlhbGlzZWRcbiIsIF9fZnVuY19fKTsKLQkJZHVtcF9zdGFjaygpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoZGV2KSB7Ci0JCW1hc2sgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOwotCi0JCS8qCi0JCSAqIFNhbml0eSBjaGVjayB0aGUgRE1BIG1hc2sgLSBpdCBtdXN0IGJlIG5vbi16ZXJvLCBhbmQKLQkJICogbXVzdCBiZSBhYmxlIHRvIGJlIHNhdGlzZmllZCBieSBhIERNQSBhbGxvY2F0aW9uLgotCQkgKi8KLQkJaWYgKG1hc2sgPT0gMCkgewotCQkJZGV2X3dhcm4oZGV2LCAiY29oZXJlbnQgRE1BIG1hc2sgaXMgdW5zZXRcbiIpOwotCQkJZ290byBub19wYWdlOwotCQl9Ci0KLQkJaWYgKCh+bWFzaykgJiBJU0FfRE1BX1RIUkVTSE9MRCkgewotCQkJZGV2X3dhcm4oZGV2LCAiY29oZXJlbnQgRE1BIG1hc2sgJSNsbHggaXMgc21hbGxlciAiCi0JCQkJICJ0aGFuIHN5c3RlbSBHRlBfRE1BIG1hc2sgJSNsbHhcbiIsCi0JCQkJIG1hc2ssICh1bnNpZ25lZCBsb25nIGxvbmcpSVNBX0RNQV9USFJFU0hPTEQpOwotCQkJZ290byBub19wYWdlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTYW5pdHkgY2hlY2sgdGhlIGFsbG9jYXRpb24gc2l6ZS4KLQkgKi8KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlsaW1pdCA9IChtYXNrICsgMSkgJiB+bWFzazsKLQlpZiAoKGxpbWl0ICYmIHNpemUgPj0gbGltaXQpIHx8Ci0JICAgIHNpemUgPj0gKENPTlNJU1RFTlRfRU5EIC0gQ09OU0lTVEVOVF9CQVNFKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb2hlcmVudCBhbGxvY2F0aW9uIHRvbyBiaWcgIgotCQkgICAgICAgIihyZXF1ZXN0ZWQgJSN4IG1hc2sgJSNsbHgpXG4iLCBzaXplLCBtYXNrKTsKLQkJZ290byBub19wYWdlOwotCX0KLQotCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwotCi0JaWYgKG1hc2sgIT0gMHhmZmZmZmZmZikKLQkJZ2ZwIHw9IEdGUF9ETUE7Ci0KLQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7Ci0JaWYgKCFwYWdlKQotCQlnb3RvIG5vX3BhZ2U7Ci0KLQkvKgotCSAqIEludmFsaWRhdGUgYW55IGRhdGEgdGhhdCBtaWdodCBiZSBsdXJraW5nIGluIHRoZQotCSAqIGtlcm5lbCBkaXJlY3QtbWFwcGVkIHJlZ2lvbiBmb3IgZGV2aWNlIERNQS4KLQkgKi8KLQl7Ci0JCXZvaWQgKnB0ciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQkJbWVtc2V0KHB0ciwgMCwgc2l6ZSk7Ci0JCWRtYWNfZmx1c2hfcmFuZ2UocHRyLCBwdHIgKyBzaXplKTsKLQkJb3V0ZXJfZmx1c2hfcmFuZ2UoX19wYShwdHIpLCBfX3BhKHB0cikgKyBzaXplKTsKLQl9Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBjb25zaXN0ZW50IG1hcHBpbmcgcmVnaW9uLgotCSAqLwotCWMgPSB2bV9yZWdpb25fYWxsb2MoJmNvbnNpc3RlbnRfaGVhZCwgc2l6ZSwKLQkJCSAgICBnZnAgJiB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pKTsKLQlpZiAoYykgewotCQlwdGVfdCAqcHRlOwotCQlzdHJ1Y3QgcGFnZSAqZW5kID0gcGFnZSArICgxIDw8IG9yZGVyKTsKLQkJaW50IGlkeCA9IENPTlNJU1RFTlRfUFRFX0lOREVYKGMtPnZtX3N0YXJ0KTsKLQkJdTMyIG9mZiA9IENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KSAmIChQVFJTX1BFUl9QVEUtMSk7Ci0KLQkJcHRlID0gY29uc2lzdGVudF9wdGVbaWR4XSArIG9mZjsKLQkJYy0+dm1fcGFnZXMgPSBwYWdlOwotCi0JCXNwbGl0X3BhZ2UocGFnZSwgb3JkZXIpOwotCi0JCS8qCi0JCSAqIFNldCB0aGUgImRtYSBoYW5kbGUiCi0JCSAqLwotCQkqaGFuZGxlID0gcGFnZV90b19kbWEoZGV2LCBwYWdlKTsKLQotCQlkbyB7Ci0JCQlCVUdfT04oIXB0ZV9ub25lKCpwdGUpKTsKLQotCQkJLyoKLQkJCSAqIHg4NiBkb2VzIG5vdCBtYXJrIHRoZSBwYWdlcyByZXNlcnZlZC4uLgotCQkJICovCi0JCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7Ci0JCQlzZXRfcHRlX2V4dChwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSwgMCk7Ci0JCQlwYWdlKys7Ci0JCQlwdGUrKzsKLQkJCW9mZisrOwotCQkJaWYgKG9mZiA+PSBQVFJTX1BFUl9QVEUpIHsKLQkJCQlvZmYgPSAwOwotCQkJCXB0ZSA9IGNvbnNpc3RlbnRfcHRlWysraWR4XTsKLQkJCX0KLQkJfSB3aGlsZSAoc2l6ZSAtPSBQQUdFX1NJWkUpOwotCi0JCS8qCi0JCSAqIEZyZWUgdGhlIG90aGVyd2lzZSB1bnVzZWQgcGFnZXMuCi0JCSAqLwotCQl3aGlsZSAocGFnZSA8IGVuZCkgewotCQkJX19mcmVlX3BhZ2UocGFnZSk7Ci0JCQlwYWdlKys7Ci0JCX0KLQotCQlyZXR1cm4gKHZvaWQgKiljLT52bV9zdGFydDsKLQl9Ci0KLQlpZiAocGFnZSkKLQkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKLSBub19wYWdlOgotCSpoYW5kbGUgPSB+MDsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIERNQS1jb2hlcmVudCBtZW1vcnkgc3BhY2UgYW5kIHJldHVybiBib3RoIHRoZSBrZXJuZWwgcmVtYXBwZWQKLSAqIHZpcnR1YWwgYW5kIGJ1cyBhZGRyZXNzIGZvciB0aGF0IHNwYWNlLgotICovCi12b2lkICoKLWRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsIGdmcF90IGdmcCkKLXsKLQl2b2lkICptZW1vcnk7Ci0KLQlpZiAoZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoZGV2LCBzaXplLCBoYW5kbGUsICZtZW1vcnkpKQotCQlyZXR1cm4gbWVtb3J5OwotCi0JaWYgKGFyY2hfaXNfY29oZXJlbnQoKSkgewotCQl2b2lkICp2aXJ0OwotCi0JCXZpcnQgPSBrbWFsbG9jKHNpemUsIGdmcCk7Ci0JCWlmICghdmlydCkKLQkJCXJldHVybiBOVUxMOwotCQkqaGFuZGxlID0gIHZpcnRfdG9fZG1hKGRldiwgdmlydCk7Ci0KLQkJcmV0dXJuIHZpcnQ7Ci0JfQotCi0JcmV0dXJuIF9fZG1hX2FsbG9jKGRldiwgc2l6ZSwgaGFuZGxlLCBnZnAsCi0JCQkgICBwZ3Byb3Rfbm9uY2FjaGVkKHBncHJvdF9rZXJuZWwpKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKLQotLyoKLSAqIEFsbG9jYXRlIGEgd3JpdGVjb21iaW5pbmcgcmVnaW9uLCBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcwotICogZG1hX2FsbG9jX2NvaGVyZW50IGFib3ZlLgotICovCi12b2lkICoKLWRtYV9hbGxvY193cml0ZWNvbWJpbmUoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLCBnZnBfdCBnZnApCi17Ci0JcmV0dXJuIF9fZG1hX2FsbG9jKGRldiwgc2l6ZSwgaGFuZGxlLCBnZnAsCi0JCQkgICBwZ3Byb3Rfd3JpdGVjb21iaW5lKHBncHJvdF9rZXJuZWwpKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX3dyaXRlY29tYmluZSk7Ci0KLXN0YXRpYyBpbnQgZG1hX21tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB1c2VyX3NpemUsIGtlcm5fc2l6ZTsKLQlzdHJ1Y3Qgdm1fcmVnaW9uICpjOwotCWludCByZXQgPSAtRU5YSU87Ci0KLQl1c2VyX3NpemUgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOwotCWMgPSB2bV9yZWdpb25fZmluZCgmY29uc2lzdGVudF9oZWFkLCAodW5zaWduZWQgbG9uZyljcHVfYWRkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYykgewotCQl1bnNpZ25lZCBsb25nIG9mZiA9IHZtYS0+dm1fcGdvZmY7Ci0KLQkJa2Vybl9zaXplID0gKGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOwotCi0JCWlmIChvZmYgPCBrZXJuX3NpemUgJiYKLQkJICAgIHVzZXJfc2l6ZSA8PSAoa2Vybl9zaXplIC0gb2ZmKSkgewotCQkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCQkJICAgICAgcGFnZV90b19wZm4oYy0+dm1fcGFnZXMpICsgb2ZmLAotCQkJCQkgICAgICB1c2VyX3NpemUgPDwgUEFHRV9TSElGVCwKLQkJCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGRtYV9tbWFwX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCSAgICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwotCXJldHVybiBkbWFfbW1hcChkZXYsIHZtYSwgY3B1X2FkZHIsIGRtYV9hZGRyLCBzaXplKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX21tYXBfY29oZXJlbnQpOwotCi1pbnQgZG1hX21tYXBfd3JpdGVjb21iaW5lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOwotCXJldHVybiBkbWFfbW1hcChkZXYsIHZtYSwgY3B1X2FkZHIsIGRtYV9hZGRyLCBzaXplKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX21tYXBfd3JpdGVjb21iaW5lKTsKLQotLyoKLSAqIGZyZWUgYSBwYWdlIGFzIGRlZmluZWQgYnkgdGhlIGFib3ZlIG1hcHBpbmcuCi0gKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkLgotICovCi12b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGhhbmRsZSkKLXsKLQlzdHJ1Y3Qgdm1fcmVnaW9uICpjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGFkZHI7Ci0JcHRlX3QgKnB0ZXA7Ci0JaW50IGlkeDsKLQl1MzIgb2ZmOwotCi0JV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwotCi0JaWYgKGRtYV9yZWxlYXNlX2Zyb21fY29oZXJlbnQoZGV2LCBnZXRfb3JkZXIoc2l6ZSksIGNwdV9hZGRyKSkKLQkJcmV0dXJuOwotCi0JaWYgKGFyY2hfaXNfY29oZXJlbnQoKSkgewotCQlrZnJlZShjcHVfYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKLQljID0gdm1fcmVnaW9uX2ZpbmQoJmNvbnNpc3RlbnRfaGVhZCwgKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIpOwotCWlmICghYykKLQkJZ290byBub19hcmVhOwotCi0JYy0+dm1fYWN0aXZlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKLQotCWlmICgoYy0+dm1fZW5kIC0gYy0+dm1fc3RhcnQpICE9IHNpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZnJlZWluZyB3cm9uZyBjb2hlcmVudCBzaXplICglbGQgIT0gJWQpXG4iLAotCQkgICAgICAgX19mdW5jX18sIGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0LCBzaXplKTsKLQkJZHVtcF9zdGFjaygpOwotCQlzaXplID0gYy0+dm1fZW5kIC0gYy0+dm1fc3RhcnQ7Ci0JfQotCi0JaWR4ID0gQ09OU0lTVEVOVF9QVEVfSU5ERVgoYy0+dm1fc3RhcnQpOwotCW9mZiA9IENPTlNJU1RFTlRfT0ZGU0VUKGMtPnZtX3N0YXJ0KSAmIChQVFJTX1BFUl9QVEUtMSk7Ci0JcHRlcCA9IGNvbnNpc3RlbnRfcHRlW2lkeF0gKyBvZmY7Ci0JYWRkciA9IGMtPnZtX3N0YXJ0OwotCWRvIHsKLQkJcHRlX3QgcHRlID0gcHRlcF9nZXRfYW5kX2NsZWFyKCZpbml0X21tLCBhZGRyLCBwdGVwKTsKLQkJdW5zaWduZWQgbG9uZyBwZm47Ci0KLQkJcHRlcCsrOwotCQlhZGRyICs9IFBBR0VfU0laRTsKLQkJb2ZmKys7Ci0JCWlmIChvZmYgPj0gUFRSU19QRVJfUFRFKSB7Ci0JCQlvZmYgPSAwOwotCQkJcHRlcCA9IGNvbnNpc3RlbnRfcHRlWysraWR4XTsKLQkJfQotCi0JCWlmICghcHRlX25vbmUocHRlKSAmJiBwdGVfcHJlc2VudChwdGUpKSB7Ci0JCQlwZm4gPSBwdGVfcGZuKHB0ZSk7Ci0KLQkJCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQotCQkJCS8qCi0JCQkJICogeDg2IGRvZXMgbm90IG1hcmsgdGhlIHBhZ2VzIHJlc2VydmVkLi4uCi0JCQkJICovCi0JCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7Ci0KLQkJCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiBiYWQgcGFnZSBpbiBrZXJuZWwgcGFnZSB0YWJsZVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQl9IHdoaWxlIChzaXplIC09IFBBR0VfU0laRSk7Ci0KLQlmbHVzaF90bGJfa2VybmVsX3JhbmdlKGMtPnZtX3N0YXJ0LCBjLT52bV9lbmQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZjLT52bV9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKLQotCWtmcmVlKGMpOwotCXJldHVybjsKLQotIG5vX2FyZWE6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogdHJ5aW5nIHRvIGZyZWUgaW52YWxpZCBjb2hlcmVudCBhcmVhOiAlcFxuIiwKLQkgICAgICAgX19mdW5jX18sIGNwdV9hZGRyKTsKLQlkdW1wX3N0YWNrKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKLQotLyoKLSAqIEluaXRpYWxpc2UgdGhlIGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGNvbnNpc3RlbnRfaW5pdCh2b2lkKQotewotCXBnZF90ICpwZ2Q7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwotCWludCByZXQgPSAwLCBpID0gMDsKLQl1MzIgYmFzZSA9IENPTlNJU1RFTlRfQkFTRTsKLQotCWRvIHsKLQkJcGdkID0gcGdkX29mZnNldCgmaW5pdF9tbSwgYmFzZSk7Ci0JCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBiYXNlKTsKLQkJaWYgKCFwbWQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHBtZCB0YWJsZXNcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCQlXQVJOX09OKCFwbWRfbm9uZSgqcG1kKSk7Ci0KLQkJcHRlID0gcHRlX2FsbG9jX2tlcm5lbChwbWQsIGJhc2UpOwotCQlpZiAoIXB0ZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gcHRlIHRhYmxlc1xuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY29uc2lzdGVudF9wdGVbaSsrXSA9IHB0ZTsKLQkJYmFzZSArPSAoMSA8PCBQR0RJUl9TSElGVCk7Ci0JfSB3aGlsZSAoYmFzZSA8IENPTlNJU1RFTlRfRU5EKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWNvcmVfaW5pdGNhbGwoY29uc2lzdGVudF9pbml0KTsKLQotLyoKLSAqIE1ha2UgYW4gYXJlYSBjb25zaXN0ZW50IGZvciBkZXZpY2VzLgotICogTm90ZTogRHJpdmVycyBzaG91bGQgTk9UIHVzZSB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBhcyBpdCB3aWxsIGJyZWFrCi0gKiBwbGF0Zm9ybXMgd2l0aCBDT05GSUdfRE1BQk9VTkNFLgotICogVXNlIHRoZSBkcml2ZXIgRE1BIHN1cHBvcnQgLSBzZWUgZG1hLW1hcHBpbmcuaCAoZG1hX3N5bmNfKikKLSAqLwotdm9pZCBkbWFfY2FjaGVfbWFpbnQoY29uc3Qgdm9pZCAqc3RhcnQsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCWNvbnN0IHZvaWQgKmVuZCA9IHN0YXJ0ICsgc2l6ZTsKLQotCUJVR19PTighdmlydF9hZGRyX3ZhbGlkKHN0YXJ0KSB8fCAhdmlydF9hZGRyX3ZhbGlkKGVuZCAtIDEpKTsKLQotCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JY2FzZSBETUFfRlJPTV9ERVZJQ0U6CQkvKiBpbnZhbGlkYXRlIG9ubHkgKi8KLQkJZG1hY19pbnZfcmFuZ2Uoc3RhcnQsIGVuZCk7Ci0JCW91dGVyX2ludl9yYW5nZShfX3BhKHN0YXJ0KSwgX19wYShlbmQpKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfVE9fREVWSUNFOgkJLyogd3JpdGViYWNrIG9ubHkgKi8KLQkJZG1hY19jbGVhbl9yYW5nZShzdGFydCwgZW5kKTsKLQkJb3V0ZXJfY2xlYW5fcmFuZ2UoX19wYShzdGFydCksIF9fcGEoZW5kKSk7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CQkvKiB3cml0ZWJhY2sgYW5kIGludmFsaWRhdGUgKi8KLQkJZG1hY19mbHVzaF9yYW5nZShzdGFydCwgZW5kKTsKLQkJb3V0ZXJfZmx1c2hfcmFuZ2UoX19wYShzdGFydCksIF9fcGEoZW5kKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woZG1hX2NhY2hlX21haW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYwppbmRleCBkZWQwZTk2Li44ZDMzZTI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjRtYy5jCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBzcGVjaWZpYyBoYWNrcyBmb3IgY29weWluZyBwYWdlcyBlZmZpY2llbnRseS4KICAqLwogI2RlZmluZSBtaW5pY2FjaGVfcGdwcm90IF9fcGdwcm90KExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IFwKLQkJCQkgIExfUFRFX0NBQ0hFQUJMRSkKKwkJCQkgIExfUFRFX01UX01JTklDQUNIRSkKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhtaW5pY2FjaGVfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCmluZGV4IDNhZGI3OTIuLjBlMjFjMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9zaG1wYXJhbS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hldHlwZS5oPgogCiAjaW5jbHVkZSAibW0uaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2NhbGUuYwppbmRleCAyZTQ1NWY4Li5iYWQ0OTMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2NhbGUuYworKysgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS14c2NhbGUuYwpAQCAtMzAsNyArMzAsNyBAQAogI2RlZmluZSBDT1BZUEFHRV9NSU5JQ0FDSEUJMHhmZmZmODAwMAogCiAjZGVmaW5lIG1pbmljYWNoZV9wZ3Byb3QgX19wZ3Byb3QoTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgXAotCQkJCSAgTF9QVEVfQ0FDSEVBQkxFKQorCQkJCSAgTF9QVEVfTVRfTUlOSUNBQ0hFKQogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pbmljYWNoZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5NjAwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBETUEgdW5jYWNoZWQgbWFwcGluZyBzdXBwb3J0LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworLyogU2FuaXR5IGNoZWNrIHNpemUgKi8KKyNpZiAoQ09OU0lTVEVOVF9ETUFfU0laRSAlIFNaXzJNKQorI2Vycm9yICJDT05TSVNURU5UX0RNQV9TSVpFIG11c3QgYmUgbXVsdGlwbGUgb2YgMk1pQiIKKyNlbmRpZgorCisjZGVmaW5lIENPTlNJU1RFTlRfRU5ECSgweGZmZTAwMDAwKQorI2RlZmluZSBDT05TSVNURU5UX0JBU0UJKENPTlNJU1RFTlRfRU5EIC0gQ09OU0lTVEVOVF9ETUFfU0laRSkKKworI2RlZmluZSBDT05TSVNURU5UX09GRlNFVCh4KQkoKCh1bnNpZ25lZCBsb25nKSh4KSAtIENPTlNJU1RFTlRfQkFTRSkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgQ09OU0lTVEVOVF9QVEVfSU5ERVgoeCkgKCgodW5zaWduZWQgbG9uZykoeCkgLSBDT05TSVNURU5UX0JBU0UpID4+IFBHRElSX1NISUZUKQorI2RlZmluZSBOVU1fQ09OU0lTVEVOVF9QVEVTIChDT05TSVNURU5UX0RNQV9TSVpFID4+IFBHRElSX1NISUZUKQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBhZ2UgdGFibGVzICgyTUIgZWFjaCkgY292ZXJpbmcgdW5jYWNoZWQsIERNQSBjb25zaXN0ZW50IGFsbG9jYXRpb25zCisgKi8KK3N0YXRpYyBwdGVfdCAqY29uc2lzdGVudF9wdGVbTlVNX0NPTlNJU1RFTlRfUFRFU107CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbnNpc3RlbnRfbG9jayk7CisKKy8qCisgKiBWTSByZWdpb24gaGFuZGxpbmcgc3VwcG9ydC4KKyAqCisgKiBUaGlzIHNob3VsZCBiZWNvbWUgc29tZXRoaW5nIGdlbmVyaWMsIGhhbmRsaW5nIFZNIHJlZ2lvbiBhbGxvY2F0aW9ucyBmb3IKKyAqIHZtYWxsb2MgYW5kIHNpbWlsYXIgKGlvcmVtYXAsIG1vZHVsZSBzcGFjZSwgZXRjKS4KKyAqCisgKiBJIGVudmlzYWdlIHZtYWxsb2MoKSdzIHN1cHBvcnRpbmcgdm1fc3RydWN0IGJlY29taW5nOgorICoKKyAqICBzdHJ1Y3Qgdm1fc3RydWN0IHsKKyAqICAgIHN0cnVjdCB2bV9yZWdpb24JcmVnaW9uOworICogICAgdW5zaWduZWQgbG9uZwlmbGFnczsKKyAqICAgIHN0cnVjdCBwYWdlCSoqcGFnZXM7CisgKiAgICB1bnNpZ25lZCBpbnQJbnJfcGFnZXM7CisgKiAgICB1bnNpZ25lZCBsb25nCXBoeXNfYWRkcjsKKyAqICB9OworICoKKyAqIGdldF92bV9hcmVhKCkgd291bGQgdGhlbiBjYWxsIHZtX3JlZ2lvbl9hbGxvYyB3aXRoIGFuIGFwcHJvcHJpYXRlCisgKiBzdHJ1Y3Qgdm1fcmVnaW9uIGhlYWQgKGVnKToKKyAqCisgKiAgc3RydWN0IHZtX3JlZ2lvbiB2bWFsbG9jX2hlYWQgPSB7CisgKgkudm1fbGlzdAk9IExJU1RfSEVBRF9JTklUKHZtYWxsb2NfaGVhZC52bV9saXN0KSwKKyAqCS52bV9zdGFydAk9IFZNQUxMT0NfU1RBUlQsCisgKgkudm1fZW5kCQk9IFZNQUxMT0NfRU5ELAorICogIH07CisgKgorICogSG93ZXZlciwgdm1hbGxvY19oZWFkLnZtX3N0YXJ0IGlzIHZhcmlhYmxlICh0eXBpY2FsbHksIGl0IGlzIGRlcGVuZGVudCBvbgorICogdGhlIGFtb3VudCBvZiBSQU0gZm91bmQgYXQgYm9vdCB0aW1lLikgIEkgd291bGQgaW1hZ2luZSB0aGF0IGdldF92bV9hcmVhKCkKKyAqIHdvdWxkIGhhdmUgdG8gaW5pdGlhbGlzZSB0aGlzIGVhY2ggdGltZSBwcmlvciB0byBjYWxsaW5nIHZtX3JlZ2lvbl9hbGxvYygpLgorICovCitzdHJ1Y3Qgdm1fcmVnaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXZtX2xpc3Q7CisJdW5zaWduZWQgbG9uZwkJdm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZwkJdm1fZW5kOworCXN0cnVjdCBwYWdlCQkqdm1fcGFnZXM7CisJaW50CQkJdm1fYWN0aXZlOworfTsKKworc3RhdGljIHN0cnVjdCB2bV9yZWdpb24gY29uc2lzdGVudF9oZWFkID0geworCS52bV9saXN0CT0gTElTVF9IRUFEX0lOSVQoY29uc2lzdGVudF9oZWFkLnZtX2xpc3QpLAorCS52bV9zdGFydAk9IENPTlNJU1RFTlRfQkFTRSwKKwkudm1fZW5kCQk9IENPTlNJU1RFTlRfRU5ELAorfTsKKworc3RhdGljIHN0cnVjdCB2bV9yZWdpb24gKgordm1fcmVnaW9uX2FsbG9jKHN0cnVjdCB2bV9yZWdpb24gKmhlYWQsIHNpemVfdCBzaXplLCBnZnBfdCBnZnApCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaGVhZC0+dm1fc3RhcnQsIGVuZCA9IGhlYWQtPnZtX2VuZCAtIHNpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgdm1fcmVnaW9uICpjLCAqbmV3OworCisJbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtX3JlZ2lvbiksIGdmcCk7CisJaWYgKCFuZXcpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaGVhZC0+dm1fbGlzdCwgdm1fbGlzdCkgeworCQlpZiAoKGFkZHIgKyBzaXplKSA8IGFkZHIpCisJCQlnb3RvIG5vc3BjOworCQlpZiAoKGFkZHIgKyBzaXplKSA8PSBjLT52bV9zdGFydCkKKwkJCWdvdG8gZm91bmQ7CisJCWFkZHIgPSBjLT52bV9lbmQ7CisJCWlmIChhZGRyID4gZW5kKQorCQkJZ290byBub3NwYzsKKwl9CisKKyBmb3VuZDoKKwkvKgorCSAqIEluc2VydCB0aGlzIGVudHJ5IF9iZWZvcmVfIHRoZSBvbmUgd2UgZm91bmQuCisJICovCisJbGlzdF9hZGRfdGFpbCgmbmV3LT52bV9saXN0LCAmYy0+dm1fbGlzdCk7CisJbmV3LT52bV9zdGFydCA9IGFkZHI7CisJbmV3LT52bV9lbmQgPSBhZGRyICsgc2l6ZTsKKwluZXctPnZtX2FjdGl2ZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbmV3OworCisgbm9zcGM6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisJa2ZyZWUobmV3KTsKKyBvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fcmVnaW9uICp2bV9yZWdpb25fZmluZChzdHJ1Y3Qgdm1fcmVnaW9uICpoZWFkLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHZtX3JlZ2lvbiAqYzsKKwkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoZWFkLT52bV9saXN0LCB2bV9saXN0KSB7CisJCWlmIChjLT52bV9hY3RpdmUgJiYgYy0+dm1fc3RhcnQgPT0gYWRkcikKKwkJCWdvdG8gb3V0OworCX0KKwljID0gTlVMTDsKKyBvdXQ6CisJcmV0dXJuIGM7Cit9CisKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZXJyb3IgQVJNIENvaGVyZW50IERNQSBhbGxvY2F0b3IgZG9lcyBub3QgKHlldCkgc3VwcG9ydCBodWdlIFRMQgorI2VuZGlmCisKK3N0YXRpYyB2b2lkICoKK19fZG1hX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwgZ2ZwX3QgZ2ZwLAorCSAgICBwZ3Byb3RfdCBwcm90KQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCB2bV9yZWdpb24gKmM7CisJdW5zaWduZWQgbG9uZyBvcmRlcjsKKwl1NjQgbWFzayA9IElTQV9ETUFfVEhSRVNIT0xELCBsaW1pdDsKKworCWlmICghY29uc2lzdGVudF9wdGVbMF0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm90IGluaXRpYWxpc2VkXG4iLCBfX2Z1bmNfXyk7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRldikgeworCQltYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sgdGhlIERNQSBtYXNrIC0gaXQgbXVzdCBiZSBub24temVybywgYW5kCisJCSAqIG11c3QgYmUgYWJsZSB0byBiZSBzYXRpc2ZpZWQgYnkgYSBETUEgYWxsb2NhdGlvbi4KKwkJICovCisJCWlmIChtYXNrID09IDApIHsKKwkJCWRldl93YXJuKGRldiwgImNvaGVyZW50IERNQSBtYXNrIGlzIHVuc2V0XG4iKTsKKwkJCWdvdG8gbm9fcGFnZTsKKwkJfQorCisJCWlmICgofm1hc2spICYgSVNBX0RNQV9USFJFU0hPTEQpIHsKKwkJCWRldl93YXJuKGRldiwgImNvaGVyZW50IERNQSBtYXNrICUjbGx4IGlzIHNtYWxsZXIgIgorCQkJCSAidGhhbiBzeXN0ZW0gR0ZQX0RNQSBtYXNrICUjbGx4XG4iLAorCQkJCSBtYXNrLCAodW5zaWduZWQgbG9uZyBsb25nKUlTQV9ETUFfVEhSRVNIT0xEKTsKKwkJCWdvdG8gbm9fcGFnZTsKKwkJfQorCX0KKworCS8qCisJICogU2FuaXR5IGNoZWNrIHRoZSBhbGxvY2F0aW9uIHNpemUuCisJICovCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbGltaXQgPSAobWFzayArIDEpICYgfm1hc2s7CisJaWYgKChsaW1pdCAmJiBzaXplID49IGxpbWl0KSB8fAorCSAgICBzaXplID49IChDT05TSVNURU5UX0VORCAtIENPTlNJU1RFTlRfQkFTRSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29oZXJlbnQgYWxsb2NhdGlvbiB0b28gYmlnICIKKwkJICAgICAgICIocmVxdWVzdGVkICUjeCBtYXNrICUjbGx4KVxuIiwgc2l6ZSwgbWFzayk7CisJCWdvdG8gbm9fcGFnZTsKKwl9CisKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWlmIChtYXNrICE9IDB4ZmZmZmZmZmYpCisJCWdmcCB8PSBHRlBfRE1BOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcCwgb3JkZXIpOworCWlmICghcGFnZSkKKwkJZ290byBub19wYWdlOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGFueSBkYXRhIHRoYXQgbWlnaHQgYmUgbHVya2luZyBpbiB0aGUKKwkgKiBrZXJuZWwgZGlyZWN0LW1hcHBlZCByZWdpb24gZm9yIGRldmljZSBETUEuCisJICovCisJeworCQl2b2lkICpwdHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCW1lbXNldChwdHIsIDAsIHNpemUpOworCQlkbWFjX2ZsdXNoX3JhbmdlKHB0ciwgcHRyICsgc2l6ZSk7CisJCW91dGVyX2ZsdXNoX3JhbmdlKF9fcGEocHRyKSwgX19wYShwdHIpICsgc2l6ZSk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgY29uc2lzdGVudCBtYXBwaW5nIHJlZ2lvbi4KKwkgKi8KKwljID0gdm1fcmVnaW9uX2FsbG9jKCZjb25zaXN0ZW50X2hlYWQsIHNpemUsCisJCQkgICAgZ2ZwICYgfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKSk7CisJaWYgKGMpIHsKKwkJcHRlX3QgKnB0ZTsKKwkJc3RydWN0IHBhZ2UgKmVuZCA9IHBhZ2UgKyAoMSA8PCBvcmRlcik7CisJCWludCBpZHggPSBDT05TSVNURU5UX1BURV9JTkRFWChjLT52bV9zdGFydCk7CisJCXUzMiBvZmYgPSBDT05TSVNURU5UX09GRlNFVChjLT52bV9zdGFydCkgJiAoUFRSU19QRVJfUFRFLTEpOworCisJCXB0ZSA9IGNvbnNpc3RlbnRfcHRlW2lkeF0gKyBvZmY7CisJCWMtPnZtX3BhZ2VzID0gcGFnZTsKKworCQlzcGxpdF9wYWdlKHBhZ2UsIG9yZGVyKTsKKworCQkvKgorCQkgKiBTZXQgdGhlICJkbWEgaGFuZGxlIgorCQkgKi8KKwkJKmhhbmRsZSA9IHBhZ2VfdG9fZG1hKGRldiwgcGFnZSk7CisKKwkJZG8geworCQkJQlVHX09OKCFwdGVfbm9uZSgqcHRlKSk7CisKKwkJCS8qCisJCQkgKiB4ODYgZG9lcyBub3QgbWFyayB0aGUgcGFnZXMgcmVzZXJ2ZWQuLi4KKwkJCSAqLworCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCQkJc2V0X3B0ZV9leHQocHRlLCBta19wdGUocGFnZSwgcHJvdCksIDApOworCQkJcGFnZSsrOworCQkJcHRlKys7CisJCQlvZmYrKzsKKwkJCWlmIChvZmYgPj0gUFRSU19QRVJfUFRFKSB7CisJCQkJb2ZmID0gMDsKKwkJCQlwdGUgPSBjb25zaXN0ZW50X3B0ZVsrK2lkeF07CisJCQl9CisJCX0gd2hpbGUgKHNpemUgLT0gUEFHRV9TSVpFKTsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBvdGhlcndpc2UgdW51c2VkIHBhZ2VzLgorCQkgKi8KKwkJd2hpbGUgKHBhZ2UgPCBlbmQpIHsKKwkJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQkJcGFnZSsrOworCQl9CisKKwkJcmV0dXJuICh2b2lkICopYy0+dm1fc3RhcnQ7CisJfQorCisJaWYgKHBhZ2UpCisJCV9fZnJlZV9wYWdlcyhwYWdlLCBvcmRlcik7Cisgbm9fcGFnZToKKwkqaGFuZGxlID0gfjA7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBETUEtY29oZXJlbnQgbWVtb3J5IHNwYWNlIGFuZCByZXR1cm4gYm90aCB0aGUga2VybmVsIHJlbWFwcGVkCisgKiB2aXJ0dWFsIGFuZCBidXMgYWRkcmVzcyBmb3IgdGhhdCBzcGFjZS4KKyAqLwordm9pZCAqCitkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLCBnZnBfdCBnZnApCit7CisJdm9pZCAqbWVtb3J5OworCisJaWYgKGRtYV9hbGxvY19mcm9tX2NvaGVyZW50KGRldiwgc2l6ZSwgaGFuZGxlLCAmbWVtb3J5KSkKKwkJcmV0dXJuIG1lbW9yeTsKKworCWlmIChhcmNoX2lzX2NvaGVyZW50KCkpIHsKKwkJdm9pZCAqdmlydDsKKworCQl2aXJ0ID0ga21hbGxvYyhzaXplLCBnZnApOworCQlpZiAoIXZpcnQpCisJCQlyZXR1cm4gTlVMTDsKKwkJKmhhbmRsZSA9ICB2aXJ0X3RvX2RtYShkZXYsIHZpcnQpOworCisJCXJldHVybiB2aXJ0OworCX0KKworCXJldHVybiBfX2RtYV9hbGxvYyhkZXYsIHNpemUsIGhhbmRsZSwgZ2ZwLAorCQkJICAgcGdwcm90X25vbmNhY2hlZChwZ3Byb3Rfa2VybmVsKSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7CisKKy8qCisgKiBBbGxvY2F0ZSBhIHdyaXRlY29tYmluaW5nIHJlZ2lvbiwgaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMKKyAqIGRtYV9hbGxvY19jb2hlcmVudCBhYm92ZS4KKyAqLwordm9pZCAqCitkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwgZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBfX2RtYV9hbGxvYyhkZXYsIHNpemUsIGhhbmRsZSwgZ2ZwLAorCQkJICAgcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3Rfa2VybmVsKSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY193cml0ZWNvbWJpbmUpOworCitzdGF0aWMgaW50IGRtYV9tbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdXNlcl9zaXplLCBrZXJuX3NpemU7CisJc3RydWN0IHZtX3JlZ2lvbiAqYzsKKwlpbnQgcmV0ID0gLUVOWElPOworCisJdXNlcl9zaXplID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKKwljID0gdm1fcmVnaW9uX2ZpbmQoJmNvbnNpc3RlbnRfaGVhZCwgKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCisJaWYgKGMpIHsKKwkJdW5zaWduZWQgbG9uZyBvZmYgPSB2bWEtPnZtX3Bnb2ZmOworCisJCWtlcm5fc2l6ZSA9IChjLT52bV9lbmQgLSBjLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKworCQlpZiAob2ZmIDwga2Vybl9zaXplICYmCisJCSAgICB1c2VyX3NpemUgPD0gKGtlcm5fc2l6ZSAtIG9mZikpIHsKKwkJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJCSAgICAgIHBhZ2VfdG9fcGZuKGMtPnZtX3BhZ2VzKSArIG9mZiwKKwkJCQkJICAgICAgdXNlcl9zaXplIDw8IFBBR0VfU0hJRlQsCisJCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBkbWFfbW1hcF9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlyZXR1cm4gZG1hX21tYXAoZGV2LCB2bWEsIGNwdV9hZGRyLCBkbWFfYWRkciwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tbWFwX2NvaGVyZW50KTsKKworaW50IGRtYV9tbWFwX3dyaXRlY29tYmluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlyZXR1cm4gZG1hX21tYXAoZGV2LCB2bWEsIGNwdV9hZGRyLCBkbWFfYWRkciwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tbWFwX3dyaXRlY29tYmluZSk7CisKKy8qCisgKiBmcmVlIGEgcGFnZSBhcyBkZWZpbmVkIGJ5IHRoZSBhYm92ZSBtYXBwaW5nLgorICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZC4KKyAqLwordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCit7CisJc3RydWN0IHZtX3JlZ2lvbiAqYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBhZGRyOworCXB0ZV90ICpwdGVwOworCWludCBpZHg7CisJdTMyIG9mZjsKKworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKworCWlmIChkbWFfcmVsZWFzZV9mcm9tX2NvaGVyZW50KGRldiwgZ2V0X29yZGVyKHNpemUpLCBjcHVfYWRkcikpCisJCXJldHVybjsKKworCWlmIChhcmNoX2lzX2NvaGVyZW50KCkpIHsKKwkJa2ZyZWUoY3B1X2FkZHIpOworCQlyZXR1cm47CisJfQorCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisJYyA9IHZtX3JlZ2lvbl9maW5kKCZjb25zaXN0ZW50X2hlYWQsICh1bnNpZ25lZCBsb25nKWNwdV9hZGRyKTsKKwlpZiAoIWMpCisJCWdvdG8gbm9fYXJlYTsKKworCWMtPnZtX2FjdGl2ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisKKwlpZiAoKGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0KSAhPSBzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZyZWVpbmcgd3JvbmcgY29oZXJlbnQgc2l6ZSAoJWxkICE9ICVkKVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjLT52bV9lbmQgLSBjLT52bV9zdGFydCwgc2l6ZSk7CisJCWR1bXBfc3RhY2soKTsKKwkJc2l6ZSA9IGMtPnZtX2VuZCAtIGMtPnZtX3N0YXJ0OworCX0KKworCWlkeCA9IENPTlNJU1RFTlRfUFRFX0lOREVYKGMtPnZtX3N0YXJ0KTsKKwlvZmYgPSBDT05TSVNURU5UX09GRlNFVChjLT52bV9zdGFydCkgJiAoUFRSU19QRVJfUFRFLTEpOworCXB0ZXAgPSBjb25zaXN0ZW50X3B0ZVtpZHhdICsgb2ZmOworCWFkZHIgPSBjLT52bV9zdGFydDsKKwlkbyB7CisJCXB0ZV90IHB0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcigmaW5pdF9tbSwgYWRkciwgcHRlcCk7CisJCXVuc2lnbmVkIGxvbmcgcGZuOworCisJCXB0ZXArKzsKKwkJYWRkciArPSBQQUdFX1NJWkU7CisJCW9mZisrOworCQlpZiAob2ZmID49IFBUUlNfUEVSX1BURSkgeworCQkJb2ZmID0gMDsKKwkJCXB0ZXAgPSBjb25zaXN0ZW50X3B0ZVsrK2lkeF07CisJCX0KKworCQlpZiAoIXB0ZV9ub25lKHB0ZSkgJiYgcHRlX3ByZXNlbnQocHRlKSkgeworCQkJcGZuID0gcHRlX3BmbihwdGUpOworCisJCQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKKwkJCQkvKgorCQkJCSAqIHg4NiBkb2VzIG5vdCBtYXJrIHRoZSBwYWdlcyByZXNlcnZlZC4uLgorCQkJCSAqLworCQkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCisJCQkJX19mcmVlX3BhZ2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9DUklUICIlczogYmFkIHBhZ2UgaW4ga2VybmVsIHBhZ2UgdGFibGVcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJfSB3aGlsZSAoc2l6ZSAtPSBQQUdFX1NJWkUpOworCisJZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShjLT52bV9zdGFydCwgYy0+dm1fZW5kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmYy0+dm1fbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7CisKKwlrZnJlZShjKTsKKwlyZXR1cm47CisKKyBub19hcmVhOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnNpc3RlbnRfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBmcmVlIGludmFsaWQgY29oZXJlbnQgYXJlYTogJXBcbiIsCisJICAgICAgIF9fZnVuY19fLCBjcHVfYWRkcik7CisJZHVtcF9zdGFjaygpOworfQorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0aW9uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjb25zaXN0ZW50X2luaXQodm9pZCkKK3sKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwlpbnQgcmV0ID0gMCwgaSA9IDA7CisJdTMyIGJhc2UgPSBDT05TSVNURU5UX0JBU0U7CisKKwlkbyB7CisJCXBnZCA9IHBnZF9vZmZzZXQoJmluaXRfbW0sIGJhc2UpOworCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHBnZCwgYmFzZSk7CisJCWlmICghcG1kKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBwbWQgdGFibGVzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJV0FSTl9PTighcG1kX25vbmUoKnBtZCkpOworCisJCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBiYXNlKTsKKwkJaWYgKCFwdGUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHB0ZSB0YWJsZXNcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWNvbnNpc3RlbnRfcHRlW2krK10gPSBwdGU7CisJCWJhc2UgKz0gKDEgPDwgUEdESVJfU0hJRlQpOworCX0gd2hpbGUgKGJhc2UgPCBDT05TSVNURU5UX0VORCk7CisKKwlyZXR1cm4gcmV0OworfQorCitjb3JlX2luaXRjYWxsKGNvbnNpc3RlbnRfaW5pdCk7CisKKy8qCisgKiBNYWtlIGFuIGFyZWEgY29uc2lzdGVudCBmb3IgZGV2aWNlcy4KKyAqIE5vdGU6IERyaXZlcnMgc2hvdWxkIE5PVCB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgYXMgaXQgd2lsbCBicmVhaworICogcGxhdGZvcm1zIHdpdGggQ09ORklHX0RNQUJPVU5DRS4KKyAqIFVzZSB0aGUgZHJpdmVyIERNQSBzdXBwb3J0IC0gc2VlIGRtYS1tYXBwaW5nLmggKGRtYV9zeW5jXyopCisgKi8KK3ZvaWQgZG1hX2NhY2hlX21haW50KGNvbnN0IHZvaWQgKnN0YXJ0LCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwljb25zdCB2b2lkICplbmQgPSBzdGFydCArIHNpemU7CisKKwlCVUdfT04oIXZpcnRfYWRkcl92YWxpZChzdGFydCkgfHwgIXZpcnRfYWRkcl92YWxpZChlbmQgLSAxKSk7CisKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgRE1BX0ZST01fREVWSUNFOgkJLyogaW52YWxpZGF0ZSBvbmx5ICovCisJCWRtYWNfaW52X3JhbmdlKHN0YXJ0LCBlbmQpOworCQlvdXRlcl9pbnZfcmFuZ2UoX19wYShzdGFydCksIF9fcGEoZW5kKSk7CisJCWJyZWFrOworCWNhc2UgRE1BX1RPX0RFVklDRToJCS8qIHdyaXRlYmFjayBvbmx5ICovCisJCWRtYWNfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCk7CisJCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoc3RhcnQpLCBfX3BhKGVuZCkpOworCQlicmVhazsKKwljYXNlIERNQV9CSURJUkVDVElPTkFMOgkJLyogd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlICovCisJCWRtYWNfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCk7CisJCW91dGVyX2ZsdXNoX3JhbmdlKF9fcGEoc3RhcnQpLCBfX3BhKGVuZCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9jYWNoZV9tYWludCk7CisKKy8qKgorICogZG1hX21hcF9zZyAtIG1hcCBhIHNldCBvZiBTRyBidWZmZXJzIGZvciBzdHJlYW1pbmcgbW9kZSBETUEKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcworICogQHNnOiBsaXN0IG9mIGJ1ZmZlcnMKKyAqIEBuZW50czogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWFwCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKgorICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZyBtb2RlIGZvciBETUEuCisgKiBUaGlzIGlzIHRoZSBzY2F0dGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZSBkbWFfbWFwX3NpbmdsZSBpbnRlcmZhY2UuCisgKiBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0IGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZQorICogYXBwcm9wcmlhdGUgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYQorICogc2dfZG1hX3thZGRyZXNzLGxlbmd0aH0uCisgKgorICogRGV2aWNlIG93bmVyc2hpcCBpc3N1ZXMgYXMgbWVudGlvbmVkIGZvciBkbWFfbWFwX3NpbmdsZSBhcmUgdGhlIHNhbWUKKyAqIGhlcmUuCisgKi8KK2ludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpLCBqOworCisJZm9yX2VhY2hfc2coc2csIHMsIG5lbnRzLCBpKSB7CisJCXMtPmRtYV9hZGRyZXNzID0gZG1hX21hcF9wYWdlKGRldiwgc2dfcGFnZShzKSwgcy0+b2Zmc2V0LAorCQkJCQkJcy0+bGVuZ3RoLCBkaXIpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBzLT5kbWFfYWRkcmVzcykpCisJCQlnb3RvIGJhZF9tYXBwaW5nOworCX0KKwlyZXR1cm4gbmVudHM7CisKKyBiYWRfbWFwcGluZzoKKwlmb3JfZWFjaF9zZyhzZywgcywgaSwgaikKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LCBzZ19kbWFfYWRkcmVzcyhzKSwgc2dfZG1hX2xlbihzKSwgZGlyKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX21hcF9zZyk7CisKKy8qKgorICogZG1hX3VubWFwX3NnIC0gdW5tYXAgYSBzZXQgb2YgU0cgYnVmZmVycyBtYXBwZWQgYnkgZG1hX21hcF9zZworICogQGRldjogdmFsaWQgc3RydWN0IGRldmljZSBwb2ludGVyLCBvciBOVUxMIGZvciBJU0EgYW5kIEVJU0EtbGlrZSBkZXZpY2VzCisgKiBAc2c6IGxpc3Qgb2YgYnVmZmVycworICogQG5lbnRzOiBudW1iZXIgb2YgYnVmZmVycyB0byB1bm1hcCAocmV0dXJuZWQgZnJvbSBkbWFfbWFwX3NnKQorICogQGRpcjogRE1BIHRyYW5zZmVyIGRpcmVjdGlvbiAoc2FtZSBhcyB3YXMgcGFzc2VkIHRvIGRtYV9tYXBfc2cpCisgKgorICogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucy4gIEFnYWluLCBDUFUgYWNjZXNzCisgKiBydWxlcyBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvciBkbWFfdW5tYXBfc2luZ2xlKCkuCisgKi8KK3ZvaWQgZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2csIHMsIG5lbnRzLCBpKQorCQlkbWFfdW5tYXBfcGFnZShkZXYsIHNnX2RtYV9hZGRyZXNzKHMpLCBzZ19kbWFfbGVuKHMpLCBkaXIpOworfQorRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2cpOworCisvKioKKyAqIGRtYV9zeW5jX3NnX2Zvcl9jcHUKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgb3IgTlVMTCBmb3IgSVNBIGFuZCBFSVNBLWxpa2UgZGV2aWNlcworICogQHNnOiBsaXN0IG9mIGJ1ZmZlcnMKKyAqIEBuZW50czogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gbWFwIChyZXR1cm5lZCBmcm9tIGRtYV9tYXBfc2cpCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uIChzYW1lIGFzIHdhcyBwYXNzZWQgdG8gZG1hX21hcF9zZykKKyAqLwordm9pZCBkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3NnKHNnLCBzLCBuZW50cywgaSkgeworCQlkbWFib3VuY2Vfc3luY19mb3JfY3B1KGRldiwgc2dfZG1hX2FkZHJlc3MocyksIDAsCisJCQkJCXNnX2RtYV9sZW4ocyksIGRpcik7CisJfQorfQorRVhQT1JUX1NZTUJPTChkbWFfc3luY19zZ19mb3JfY3B1KTsKKworLyoqCisgKiBkbWFfc3luY19zZ19mb3JfZGV2aWNlCisgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIsIG9yIE5VTEwgZm9yIElTQSBhbmQgRUlTQS1saWtlIGRldmljZXMKKyAqIEBzZzogbGlzdCBvZiBidWZmZXJzCisgKiBAbmVudHM6IG51bWJlciBvZiBidWZmZXJzIHRvIG1hcCAocmV0dXJuZWQgZnJvbSBkbWFfbWFwX3NnKQorICogQGRpcjogRE1BIHRyYW5zZmVyIGRpcmVjdGlvbiAoc2FtZSBhcyB3YXMgcGFzc2VkIHRvIGRtYV9tYXBfc2cpCisgKi8KK3ZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7CisJaW50IGk7CisKKwlmb3JfZWFjaF9zZyhzZywgcywgbmVudHMsIGkpIHsKKwkJaWYgKCFkbWFib3VuY2Vfc3luY19mb3JfZGV2aWNlKGRldiwgc2dfZG1hX2FkZHJlc3MocyksIDAsCisJCQkJCXNnX2RtYV9sZW4ocyksIGRpcikpCisJCQljb250aW51ZTsKKworCQlpZiAoIWFyY2hfaXNfY29oZXJlbnQoKSkKKwkJCWRtYV9jYWNoZV9tYWludChzZ192aXJ0KHMpLCBzLT5sZW5ndGgsIGRpcik7CisJfQorfQorRVhQT1JUX1NZTUJPTChkbWFfc3luY19zZ19mb3JfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2V4dGFibGUuYyBiL2FyY2gvYXJtL21tL2V4dGFibGUuYwppbmRleCA5NTkyYzNlLi45ZDI4NTYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9leHRhYmxlLmMKKysrIGIvYXJjaC9hcm0vbW0vZXh0YWJsZS5jCkBAIC0yLDcgKzIsNyBAQAogICogIGxpbnV4L2FyY2gvYXJtL21tL2V4dGFibGUuYwogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKIGludCBmaXh1cF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMgYi9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKaW5kZXggYThlYzk3Yi4uODFkMGI4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCisrKyBiL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYwpAQCAtMTcsMTEgKzE3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAorI2luY2x1ZGUgPGFzbS9idWdzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3B0ZV9tYXNrID0gTF9QVEVfQ0FDSEVBQkxFOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3B0ZV9tYXNrID0gTF9QVEVfTVRfQlVGRkVSQUJMRTsKIAogLyoKICAqIFdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBvZiB0aGlzIHByb2JsZW0gLSB3ZSBtYWtlIHRoZQpAQCAtNjMsOSArNjUsMTAgQEAKIAkgKiBJZiB0aGlzIHBhZ2UgaXNuJ3QgcHJlc2VudCwgb3IgaXMgYWxyZWFkeSBzZXR1cCB0bwogCSAqIGZhdWx0IChpZSwgaXMgb2xkKSwgd2UgY2FuIHNhZmVseSBpZ25vcmUgYW55IGlzc3Vlcy4KIAkgKi8KLQlpZiAocmV0ICYmIHB0ZV92YWwoZW50cnkpICYgc2hhcmVkX3B0ZV9tYXNrKSB7CisJaWYgKHJldCAmJiAocHRlX3ZhbChlbnRyeSkgJiBMX1BURV9NVF9NQVNLKSAhPSBzaGFyZWRfcHRlX21hc2spIHsKIAkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4oZW50cnkpKTsKLQkJcHRlX3ZhbChlbnRyeSkgJj0gfnNoYXJlZF9wdGVfbWFzazsKKwkJcHRlX3ZhbChlbnRyeSkgJj0gfkxfUFRFX01UX01BU0s7CisJCXB0ZV92YWwoZW50cnkpIHw9IHNoYXJlZF9wdGVfbWFzazsKIAkJc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyZXNzLCBwdGUsIGVudHJ5KTsKIAkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsKIAl9CkBAIC0xOTcsNyArMjAwLDcgQEAKIAkJdW5zaWduZWQgbG9uZyAqcDEsICpwMjsKIAkJcGdwcm90X3QgcHJvdCA9IF9fcGdwcm90KExfUFRFX1BSRVNFTlR8TF9QVEVfWU9VTkd8CiAJCQkJCSBMX1BURV9ESVJUWXxMX1BURV9XUklURXwKLQkJCQkJIExfUFRFX0JVRkZFUkFCTEUpOworCQkJCQkgTF9QVEVfTVRfQlVGRkVSQUJMRSk7CiAKIAkJcDEgPSB2bWFwKCZwYWdlLCAxLCBWTV9JT1JFTUFQLCBwcm90KTsKIAkJcDIgPSB2bWFwKCZwYWdlLCAxLCBWTV9JT1JFTUFQLCBwcm90KTsKQEAgLTIxOCw3ICsyMjEsNyBAQAogCiAJaWYgKHYpIHsKIAkJcHJpbnRrKCJmYWlsZWQsICVzXG4iLCByZWFzb24pOwotCQlzaGFyZWRfcHRlX21hc2sgfD0gTF9QVEVfQlVGRkVSQUJMRTsKKwkJc2hhcmVkX3B0ZV9tYXNrID0gTF9QVEVfTVRfVU5DQUNIRUQ7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJva1xuIik7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggMjhhZDdhYi4uMmRmOGQ5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC0xMywxMSArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImZhdWx0LmgiCiAKQEAgLTcyLDkgKzcyLDggQEAKIAkJfQogCiAJCXBtZCA9IHBtZF9vZmZzZXQocGdkLCBhZGRyKTsKLSNpZiBQVFJTX1BFUl9QTUQgIT0gMQotCQlwcmludGsoIiwgKnBtZD0lMDhseCIsIHBtZF92YWwoKnBtZCkpOwotI2VuZGlmCisJCWlmIChQVFJTX1BFUl9QTUQgIT0gMSkKKwkJCXByaW50aygiLCAqcG1kPSUwOGx4IiwgcG1kX3ZhbCgqcG1kKSk7CiAKIAkJaWYgKHBtZF9ub25lKCpwbWQpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mbHVzaC5jIGIvYXJjaC9hcm0vbW0vZmx1c2guYwppbmRleCAwMjllZTY1Li4wZmE5YmYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mbHVzaC5jCisrKyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZXR5cGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCAzMGE2OWQ2Li44MmM0YjQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0yNiw5ICsyNiw0MiBAQAogCiAjaW5jbHVkZSAibW0uaCIKIAotZXh0ZXJuIHZvaWQgX3RleHQsIF9ldGV4dCwgX19kYXRhX3N0YXJ0LCBfZW5kLCBfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwaHlzX2luaXRyZF9zdGFydDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNfaW5pdHJkX3NpemU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX2luaXRyZF9zdGFydCBfX2luaXRkYXRhID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBoeXNfaW5pdHJkX3NpemUgX19pbml0ZGF0YSA9IDA7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9pbml0cmQoY2hhciAqKnApCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZTsKKworCXN0YXJ0ID0gbWVtcGFyc2UoKnAsIHApOworCWlmICgqKnAgPT0gJywnKSB7CisJCXNpemUgPSBtZW1wYXJzZSgoKnApICsgMSwgcCk7CisKKwkJcGh5c19pbml0cmRfc3RhcnQgPSBzdGFydDsKKwkJcGh5c19pbml0cmRfc2l6ZSA9IHNpemU7CisJfQorfQorX19lYXJseV9wYXJhbSgiaW5pdHJkPSIsIGVhcmx5X2luaXRyZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19pbml0cmQoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIkFUQUdfSU5JVFJEIGlzIGRlcHJlY2F0ZWQ7ICIKKwkJInBsZWFzZSB1cGRhdGUgeW91ciBib290bG9hZGVyLlxuIik7CisJcGh5c19pbml0cmRfc3RhcnQgPSBfX3ZpcnRfdG9fcGh5cyh0YWctPnUuaW5pdHJkLnN0YXJ0KTsKKwlwaHlzX2luaXRyZF9zaXplID0gdGFnLT51LmluaXRyZC5zaXplOworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfSU5JVFJELCBwYXJzZV90YWdfaW5pdHJkKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2luaXRyZDIoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQoreworCXBoeXNfaW5pdHJkX3N0YXJ0ID0gdGFnLT51LmluaXRyZC5zdGFydDsKKwlwaHlzX2luaXRyZF9zaXplID0gdGFnLT51LmluaXRyZC5zaXplOworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEFUQUdfSU5JVFJEMiwgcGFyc2VfdGFnX2luaXRyZDIpOwogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIHBhc3MgbWVtb3J5IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHBhZ2luZ19pbml0CkBAIC0zNiwxMCArNjksNiBAQAogICovCiBzdGF0aWMgc3RydWN0IG1lbWluZm8gbWVtaW5mbyA9IHsgMCwgfTsKIAotI2RlZmluZSBmb3JfZWFjaF9ub2RlYmFuayhpdGVyLG1pLG5vKQkJCVwKLQlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbWktPm5yX2JhbmtzOyBpdGVyKyspCVwKLQkJaWYgKG1pLT5iYW5rW2l0ZXJdLm5vZGUgPT0gbm8pCi0KIHZvaWQgc2hvd19tZW0odm9pZCkKIHsKIAlpbnQgZnJlZSA9IDAsIHRvdGFsID0gMCwgcmVzZXJ2ZWQgPSAwOwpAQCAtNTAsMTQgKzc5LDE1IEBACiAJc2hvd19mcmVlX2FyZWFzKCk7CiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQlwZ19kYXRhX3QgKm4gPSBOT0RFX0RBVEEobm9kZSk7Ci0JCXN0cnVjdCBwYWdlICptYXAgPSBuLT5ub2RlX21lbV9tYXAgLSBuLT5ub2RlX3N0YXJ0X3BmbjsKKwkJc3RydWN0IHBhZ2UgKm1hcCA9IHBnZGF0X3BhZ2VfbnIobiwgMCkgLSBuLT5ub2RlX3N0YXJ0X3BmbjsKIAogCQlmb3JfZWFjaF9ub2RlYmFuayAoaSxtaSxub2RlKSB7CisJCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKIAkJCXVuc2lnbmVkIGludCBwZm4xLCBwZm4yOwogCQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7CiAKLQkJCXBmbjEgPSBfX3BoeXNfdG9fcGZuKG1pLT5iYW5rW2ldLnN0YXJ0KTsKLQkJCXBmbjIgPSBfX3BoeXNfdG9fcGZuKG1pLT5iYW5rW2ldLnNpemUgKyBtaS0+YmFua1tpXS5zdGFydCk7CisJCQlwZm4xID0gYmFua19wZm5fc3RhcnQoYmFuayk7CisJCQlwZm4yID0gYmFua19wZm5fZW5kKGJhbmspOwogCiAJCQlwYWdlID0gbWFwICsgcGZuMTsKIAkJCWVuZCAgPSBtYXAgKyBwZm4yOwpAQCAtOTYsMTcgKzEyNiwxNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQKIGZpbmRfYm9vdG1hcF9wZm4oaW50IG5vZGUsIHN0cnVjdCBtZW1pbmZvICptaSwgdW5zaWduZWQgaW50IGJvb3RtYXBfcGFnZXMpCiB7Ci0JdW5zaWduZWQgaW50IHN0YXJ0X3BmbiwgYmFuaywgYm9vdG1hcF9wZm47CisJdW5zaWduZWQgaW50IHN0YXJ0X3BmbiwgaSwgYm9vdG1hcF9wZm47CiAKIAlzdGFydF9wZm4gICA9IFBBR0VfQUxJR04oX19wYSgmX2VuZCkpID4+IFBBR0VfU0hJRlQ7CiAJYm9vdG1hcF9wZm4gPSAwOwogCi0JZm9yX2VhY2hfbm9kZWJhbmsoYmFuaywgbWksIG5vZGUpIHsKKwlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKIAkJdW5zaWduZWQgaW50IHN0YXJ0LCBlbmQ7CiAKLQkJc3RhcnQgPSBtaS0+YmFua1tiYW5rXS5zdGFydCA+PiBQQUdFX1NISUZUOwotCQllbmQgICA9IChtaS0+YmFua1tiYW5rXS5zaXplICsKLQkJCSBtaS0+YmFua1tiYW5rXS5zdGFydCkgPj4gUEFHRV9TSElGVDsKKwkJc3RhcnQgPSBiYW5rX3Bmbl9zdGFydChiYW5rKTsKKwkJZW5kICAgPSBiYW5rX3Bmbl9lbmQoYmFuayk7CiAKIAkJaWYgKGVuZCA8IHN0YXJ0X3BmbikKIAkJCWNvbnRpbnVlOwpAQCAtMTQ1LDEzICsxNzUsMTAgQEAKIAkJaW5pdHJkX25vZGUgPSAtMTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgYmFua19lbmQ7Ci0KLQkJCWJhbmtfZW5kID0gbWktPmJhbmtbaV0uc3RhcnQgKyBtaS0+YmFua1tpXS5zaXplOwotCi0JCQlpZiAobWktPmJhbmtbaV0uc3RhcnQgPD0gcGh5c19pbml0cmRfc3RhcnQgJiYKLQkJCSAgICBlbmQgPD0gYmFua19lbmQpCi0JCQkJaW5pdHJkX25vZGUgPSBtaS0+YmFua1tpXS5ub2RlOworCQkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07CisJCQlpZiAoYmFua19waHlzX3N0YXJ0KGJhbmspIDw9IHBoeXNfaW5pdHJkX3N0YXJ0ICYmCisJCQkgICAgZW5kIDw9IGJhbmtfcGh5c19lbmQoYmFuaykpCisJCQkJaW5pdHJkX25vZGUgPSBiYW5rLT5ub2RlOwogCQl9CiAJfQogCkBAIC0xNzEsMTkgKzE5OCwxNyBAQAogI2lmZGVmIENPTkZJR19NTVUKIAlzdHJ1Y3QgbWFwX2Rlc2MgbWFwOwogCi0JbWFwLnBmbiA9IF9fcGh5c190b19wZm4oYmFuay0+c3RhcnQpOwotCW1hcC52aXJ0dWFsID0gX19waHlzX3RvX3ZpcnQoYmFuay0+c3RhcnQpOwotCW1hcC5sZW5ndGggPSBiYW5rLT5zaXplOworCW1hcC5wZm4gPSBiYW5rX3Bmbl9zdGFydChiYW5rKTsKKwltYXAudmlydHVhbCA9IF9fcGh5c190b192aXJ0KGJhbmtfcGh5c19zdGFydChiYW5rKSk7CisJbWFwLmxlbmd0aCA9IGJhbmtfcGh5c19zaXplKGJhbmspOwogCW1hcC50eXBlID0gTVRfTUVNT1JZOwogCiAJY3JlYXRlX21hcHBpbmcoJm1hcCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0Ci1ib290bWVtX2luaXRfbm9kZShpbnQgbm9kZSwgaW50IGluaXRyZF9ub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgYm9vdG1lbV9pbml0X25vZGUoaW50IG5vZGUsIHN0cnVjdCBtZW1pbmZvICptaSkKIHsKLQl1bnNpZ25lZCBsb25nIHpvbmVfc2l6ZVtNQVhfTlJfWk9ORVNdLCB6aG9sZV9zaXplW01BWF9OUl9aT05FU107CiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm4sIGJvb3RfcGZuOwogCXVuc2lnbmVkIGludCBib290X3BhZ2VzOwogCXBnX2RhdGFfdCAqcGdkYXQ7CkBAIC0xOTksOCArMjI0LDggQEAKIAkJc3RydWN0IG1lbWJhbmsgKmJhbmsgPSAmbWktPmJhbmtbaV07CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAotCQlzdGFydCA9IGJhbmstPnN0YXJ0ID4+IFBBR0VfU0hJRlQ7Ci0JCWVuZCA9IChiYW5rLT5zdGFydCArIGJhbmstPnNpemUpID4+IFBBR0VfU0hJRlQ7CisJCXN0YXJ0ID0gYmFua19wZm5fc3RhcnQoYmFuayk7CisJCWVuZCA9IGJhbmtfcGZuX2VuZChiYW5rKTsKIAogCQlpZiAoc3RhcnRfcGZuID4gc3RhcnQpCiAJCQlzdGFydF9wZm4gPSBzdGFydDsKQEAgLTIzMCw4ICsyNTUsMTEgQEAKIAlwZ2RhdCA9IE5PREVfREFUQShub2RlKTsKIAlpbml0X2Jvb3RtZW1fbm9kZShwZ2RhdCwgYm9vdF9wZm4sIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiAKLQlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkKLQkJZnJlZV9ib290bWVtX25vZGUocGdkYXQsIG1pLT5iYW5rW2ldLnN0YXJ0LCBtaS0+YmFua1tpXS5zaXplKTsKKwlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkgeworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKKwkJZnJlZV9ib290bWVtX25vZGUocGdkYXQsIGJhbmtfcGh5c19zdGFydChiYW5rKSwgYmFua19waHlzX3NpemUoYmFuaykpOworCQltZW1vcnlfcHJlc2VudChub2RlLCBiYW5rX3Bmbl9zdGFydChiYW5rKSwgYmFua19wZm5fZW5kKGJhbmspKTsKKwl9CiAKIAkvKgogCSAqIFJlc2VydmUgdGhlIGJvb3RtZW0gYml0bWFwIGZvciB0aGlzIG5vZGUuCkBAIC0yMzksMzEgKzI2NywzOSBAQAogCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBib290X3BmbiA8PCBQQUdFX1NISUZULAogCQkJICAgICBib290X3BhZ2VzIDw8IFBBR0VfU0hJRlQsIEJPT1RNRU1fREVGQVVMVCk7CiAKLQkvKgotCSAqIFJlc2VydmUgYW55IHNwZWNpYWwgbm9kZSB6ZXJvIHJlZ2lvbnMuCi0JICovCi0JaWYgKG5vZGUgPT0gMCkKLQkJcmVzZXJ2ZV9ub2RlX3plcm8ocGdkYXQpOworCXJldHVybiBlbmRfcGZuOworfQogCitzdGF0aWMgdm9pZCBfX2luaXQgYm9vdG1lbV9yZXNlcnZlX2luaXRyZChpbnQgbm9kZSkKK3sKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkvKgotCSAqIElmIHRoZSBpbml0cmQgaXMgaW4gdGhpcyBub2RlLCByZXNlcnZlIGl0cyBtZW1vcnkuCi0JICovCi0JaWYgKG5vZGUgPT0gaW5pdHJkX25vZGUpIHsKLQkJaW50IHJlcyA9IHJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBwaHlzX2luaXRyZF9zdGFydCwKLQkJCQkgICAgIHBoeXNfaW5pdHJkX3NpemUsIEJPT1RNRU1fRVhDTFVTSVZFKTsKKwlwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5vZGUpOworCWludCByZXM7CiAKLQkJaWYgKHJlcyA9PSAwKSB7Ci0JCQlpbml0cmRfc3RhcnQgPSBfX3BoeXNfdG9fdmlydChwaHlzX2luaXRyZF9zdGFydCk7Ci0JCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgcGh5c19pbml0cmRfc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJJTklUUkQ6IDB4JTA4bHgrMHglMDhseCBvdmVybGFwcyBpbi11c2UgIgotCQkJCSJtZW1vcnkgcmVnaW9uIC0gZGlzYWJsaW5nIGluaXRyZFxuIiwKLQkJCQlwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7Ci0JCX0KKwlyZXMgPSByZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgcGh5c19pbml0cmRfc3RhcnQsCisJCQkgICAgIHBoeXNfaW5pdHJkX3NpemUsIEJPT1RNRU1fRVhDTFVTSVZFKTsKKworCWlmIChyZXMgPT0gMCkgeworCQlpbml0cmRfc3RhcnQgPSBfX3BoeXNfdG9fdmlydChwaHlzX2luaXRyZF9zdGFydCk7CisJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBwaHlzX2luaXRyZF9zaXplOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIklOSVRSRDogMHglMDhseCsweCUwOGx4IG92ZXJsYXBzIGluLXVzZSAiCisJCQkibWVtb3J5IHJlZ2lvbiAtIGRpc2FibGluZyBpbml0cmRcbiIsCisJCQlwaHlzX2luaXRyZF9zdGFydCwgcGh5c19pbml0cmRfc2l6ZSk7CiAJfQogI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX2ZyZWVfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pKQoreworCXVuc2lnbmVkIGxvbmcgem9uZV9zaXplW01BWF9OUl9aT05FU10sIHpob2xlX3NpemVbTUFYX05SX1pPTkVTXTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKG5vZGUpOworCWludCBpOworCisJc3RhcnRfcGZuID0gcGdkYXQtPmJkYXRhLT5ub2RlX21pbl9wZm47CisJZW5kX3BmbiA9IHBnZGF0LT5iZGF0YS0+bm9kZV9sb3dfcGZuOwogCiAJLyoKIAkgKiBpbml0aWFsaXNlIHRoZSB6b25lcyB3aXRoaW4gdGhpcyBub2RlLgpAQCAtMjg0LDcgKzMyMCw3IEBACiAJICovCiAJemhvbGVfc2l6ZVswXSA9IHpvbmVfc2l6ZVswXTsKIAlmb3JfZWFjaF9ub2RlYmFuayhpLCBtaSwgbm9kZSkKLQkJemhvbGVfc2l6ZVswXSAtPSBtaS0+YmFua1tpXS5zaXplID4+IFBBR0VfU0hJRlQ7CisJCXpob2xlX3NpemVbMF0gLT0gYmFua19wZm5fc2l6ZSgmbWktPmJhbmtbaV0pOwogCiAJLyoKIAkgKiBBZGp1c3QgdGhlIHNpemVzIGFjY29yZGluZyB0byBhbnkgc3BlY2lhbCByZXF1aXJlbWVudHMgZm9yCkBAIC0yOTMsMjEgKzMyOSwxMiBAQAogCWFyY2hfYWRqdXN0X3pvbmVzKG5vZGUsIHpvbmVfc2l6ZSwgemhvbGVfc2l6ZSk7CiAKIAlmcmVlX2FyZWFfaW5pdF9ub2RlKG5vZGUsIHpvbmVfc2l6ZSwgc3RhcnRfcGZuLCB6aG9sZV9zaXplKTsKLQotCXJldHVybiBlbmRfcGZuOwogfQogCiB2b2lkIF9faW5pdCBib290bWVtX2luaXQoc3RydWN0IG1lbWluZm8gKm1pKQogewogCXVuc2lnbmVkIGxvbmcgbWVtZW5kX3BmbiA9IDA7Ci0JaW50IG5vZGUsIGluaXRyZF9ub2RlLCBpOwotCi0JLyoKLQkgKiBJbnZhbGlkYXRlIHRoZSBub2RlIG51bWJlciBmb3IgZW1wdHkgb3IgaW52YWxpZCBtZW1vcnkgYmFua3MKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspCi0JCWlmIChtaS0+YmFua1tpXS5zaXplID09IDAgfHwgbWktPmJhbmtbaV0ubm9kZSA+PSBNQVhfTlVNTk9ERVMpCi0JCQltaS0+YmFua1tpXS5ub2RlID0gLTE7CisJaW50IG5vZGUsIGluaXRyZF9ub2RlOwogCiAJbWVtY3B5KCZtZW1pbmZvLCBtaSwgc2l6ZW9mKG1lbWluZm8pKTsKIApAQCAtMzIwLDkgKzM0NywxOSBAQAogCSAqIFJ1biB0aHJvdWdoIGVhY2ggbm9kZSBpbml0aWFsaXNpbmcgdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgogCSAqLwogCWZvcl9lYWNoX25vZGUobm9kZSkgewotCQl1bnNpZ25lZCBsb25nIGVuZF9wZm47CisJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IGJvb3RtZW1faW5pdF9ub2RlKG5vZGUsIG1pKTsKIAotCQllbmRfcGZuID0gYm9vdG1lbV9pbml0X25vZGUobm9kZSwgaW5pdHJkX25vZGUsIG1pKTsKKwkJLyoKKwkJICogUmVzZXJ2ZSBhbnkgc3BlY2lhbCBub2RlIHplcm8gcmVnaW9ucy4KKwkJICovCisJCWlmIChub2RlID09IDApCisJCQlyZXNlcnZlX25vZGVfemVybyhOT0RFX0RBVEEobm9kZSkpOworCisJCS8qCisJCSAqIElmIHRoZSBpbml0cmQgaXMgaW4gdGhpcyBub2RlLCByZXNlcnZlIGl0cyBtZW1vcnkuCisJCSAqLworCQlpZiAobm9kZSA9PSBpbml0cmRfbm9kZSkKKwkJCWJvb3RtZW1fcmVzZXJ2ZV9pbml0cmQobm9kZSk7CiAKIAkJLyoKIAkJICogUmVtZW1iZXIgdGhlIGhpZ2hlc3QgbWVtb3J5IFBGTi4KQEAgLTMzMSw2ICszNjgsMTkgQEAKIAkJCW1lbWVuZF9wZm4gPSBlbmRfcGZuOwogCX0KIAorCS8qCisJICogc3BhcnNlX2luaXQoKSBuZWVkcyB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgdXAgYW5kIHJ1bm5pbmcuCisJICovCisJc3BhcnNlX2luaXQoKTsKKworCS8qCisJICogTm93IGZyZWUgbWVtb3J5IGluIGVhY2ggbm9kZSAtIGZyZWVfYXJlYV9pbml0X25vZGUgbmVlZHMKKwkgKiB0aGUgc3BhcnNlIG1lbV9tYXAgYXJyYXlzIGluaXRpYWxpemVkIGJ5IHNwYXJzZV9pbml0KCkKKwkgKiBmb3IgbWVtbWFwX2luaXRfem9uZSgpLCBvdGhlcndpc2UgYWxsIFBGTnMgYXJlIGludmFsaWQuCisJICovCisJZm9yX2VhY2hfbm9kZShub2RlKQorCQlib290bWVtX2ZyZWVfbm9kZShub2RlLCBtaSk7CisKIAloaWdoX21lbW9yeSA9IF9fdmEobWVtZW5kX3BmbiA8PCBQQUdFX1NISUZUKTsKIAogCS8qCkBAIC00MDEsNyArNDUxLDkgQEAKIAkgKiBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLgogCSAqLwogCWZvcl9lYWNoX25vZGViYW5rKGksIG1pLCBub2RlKSB7Ci0JCWJhbmtfc3RhcnQgPSBtaS0+YmFua1tpXS5zdGFydCA+PiBQQUdFX1NISUZUOworCQlzdHJ1Y3QgbWVtYmFuayAqYmFuayA9ICZtaS0+YmFua1tpXTsKKworCQliYW5rX3N0YXJ0ID0gYmFua19wZm5fc3RhcnQoYmFuayk7CiAJCWlmIChiYW5rX3N0YXJ0IDwgcHJldl9iYW5rX2VuZCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJNRU06IHVub3JkZXJlZCBtZW1vcnkgYmFua3MuICAiCiAJCQkJIk5vdCBmcmVlaW5nIG1lbW1hcC5cbiIpOwpAQCAtNDE1LDggKzQ2Nyw3IEBACiAJCWlmIChwcmV2X2JhbmtfZW5kICYmIHByZXZfYmFua19lbmQgIT0gYmFua19zdGFydCkKIAkJCWZyZWVfbWVtbWFwKG5vZGUsIHByZXZfYmFua19lbmQsIGJhbmtfc3RhcnQpOwogCi0JCXByZXZfYmFua19lbmQgPSAobWktPmJhbmtbaV0uc3RhcnQgKwotCQkJCSBtaS0+YmFua1tpXS5zaXplKSA+PiBQQUdFX1NISUZUOworCQlwcmV2X2JhbmtfZW5kID0gYmFua19wZm5fZW5kKGJhbmspOwogCX0KIH0KIApAQCAtNDYxLDggKzUxMiw4IEBACiAKIAludW1fcGh5c3BhZ2VzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbWVtaW5mby5ucl9iYW5rczsgaSsrKSB7Ci0JCW51bV9waHlzcGFnZXMgKz0gbWVtaW5mby5iYW5rW2ldLnNpemUgPj4gUEFHRV9TSElGVDsKLQkJcHJpbnRrKCIgJWxkTUIiLCBtZW1pbmZvLmJhbmtbaV0uc2l6ZSA+PiAyMCk7CisJCW51bV9waHlzcGFnZXMgKz0gYmFua19wZm5fc2l6ZSgmbWVtaW5mby5iYW5rW2ldKTsKKwkJcHJpbnRrKCIgJWxkTUIiLCBiYW5rX3BoeXNfc2l6ZSgmbWVtaW5mby5iYW5rW2ldKSA+PiAyMCk7CiAJfQogCiAJcHJpbnRrKCIgPSAlbHVNQiB0b3RhbFxuIiwgbnVtX3BoeXNwYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pb21hcC5jIGIvYXJjaC9hcm0vbW0vaW9tYXAuYwppbmRleCA3NDI5ZjhjLi5mZmFkMDM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pb21hcC5jCisrKyBiL2FyY2gvYXJtL21tL2lvbWFwLmMKQEAgLTcsOCArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaWZkZWYgX19pbwogdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW9yZW1hcC5jIGIvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCmluZGV4IGI4MWRiZjkuLjE4MzczZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2lvcmVtYXAuYworKysgYi9hcmNoL2FybS9tbS9pb3JlbWFwLmMKQEAgLTI0LDkgKzI0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC01NSw4ICs1Niw3IEBACiAJCWlmICghcHRlX25vbmUoKnB0ZSkpCiAJCQlnb3RvIGJhZDsKIAotCQlzZXRfcHRlX2V4dChwdGUsIHBmbl9wdGUocGh5c19hZGRyID4+IFBBR0VfU0hJRlQsIHByb3QpLAotCQkJICAgIHR5cGUtPnByb3RfcHRlX2V4dCk7CisJCXNldF9wdGVfZXh0KHB0ZSwgcGZuX3B0ZShwaHlzX2FkZHIgPj4gUEFHRV9TSElGVCwgcHJvdCksIDApOwogCQlwaHlzX2FkZHIgKz0gUEFHRV9TSVpFOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCXJldHVybiAwOwpAQCAtMzMyLDE1ICszMzIsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19hcm1faW9yZW1hcCk7CiAKLXZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3ZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkcikKIHsKKwl2b2lkICphZGRyID0gKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpaW9fYWRkcik7CiAjaWZuZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKICNlbmRpZgogCXVuc2lnbmVkIGludCBzZWN0aW9uX21hcHBpbmcgPSAwOwogCi0JYWRkciA9ICh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0KICNpZm5kZWYgQ09ORklHX1NNUAogCS8qCiAJICogSWYgdGhpcyBpcyBhIHNlY3Rpb24gYmFzZWQgbWFwcGluZyB3ZSBuZWVkIHRvIGhhbmRsZSBpdApAQCAtMzUxLDcgKzM1MCw3IEBACiAJICovCiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwogCWZvciAocCA9ICZ2bWxpc3QgOyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYoKHRtcC0+ZmxhZ3MgJiBWTV9JT1JFTUFQKSAmJiAodG1wLT5hZGRyID09IGFkZHIpKSB7CisJCWlmICgodG1wLT5mbGFncyAmIFZNX0lPUkVNQVApICYmICh0bXAtPmFkZHIgPT0gYWRkcikpIHsKIAkJCWlmICh0bXAtPmZsYWdzICYgVk1fQVJNX1NFQ1RJT05fTUFQUElORykgewogCQkJCSpwID0gdG1wLT5uZXh0OwogCQkJCXVubWFwX2FyZWFfc2VjdGlvbnMoKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyLApAQCAtMzY2LDYgKzM2NSw2IEBACiAjZW5kaWYKIAogCWlmICghc2VjdGlvbl9tYXBwaW5nKQotCQl2dW5tYXAoKHZvaWQgX19mb3JjZSAqKWFkZHIpOworCQl2dW5tYXAoYWRkcik7CiB9CiBFWFBPUlRfU1lNQk9MKF9faW91bm1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbS5oIGIvYXJjaC9hcm0vbW0vbW0uaAppbmRleCA3NjQ3YzU5Li41ZDlmNTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS5oCisrKyBiL2FyY2gvYXJtL21tL21tLmgKQEAgLTE4LDcgKzE4LDYgQEAKIAogc3RydWN0IG1lbV90eXBlIHsKIAl1bnNpZ25lZCBpbnQgcHJvdF9wdGU7Ci0JdW5zaWduZWQgaW50IHByb3RfcHRlX2V4dDsKIAl1bnNpZ25lZCBpbnQgcHJvdF9sMTsKIAl1bnNpZ25lZCBpbnQgcHJvdF9zZWN0OwogCXVuc2lnbmVkIGludCBkb21haW47CkBAIC0zNSwzICszNCw1IEBACiB2b2lkIF9faW5pdCBjcmVhdGVfbWFwcGluZyhzdHJ1Y3QgbWFwX2Rlc2MgKm1kKTsKIHZvaWQgX19pbml0IGJvb3RtZW1faW5pdChzdHJ1Y3QgbWVtaW5mbyAqbWkpOwogdm9pZCByZXNlcnZlX25vZGVfemVybyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KTsKKworZXh0ZXJuIHZvaWQgX3RleHQsIF9zdGV4dCwgX2V0ZXh0LCBfX2RhdGFfc3RhcnQsIF9lbmQsIF9faW5pdF9iZWdpbiwgX19pbml0X2VuZDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tYXAuYyBiL2FyY2gvYXJtL21tL21tYXAuYwppbmRleCAzZjZkYzQwLi41MzU4ZmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbWFwLmMKKysrIGIvYXJjaC9hcm0vbW0vbW1hcC5jCkBAIC02LDYgKzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgQ09MT1VSX0FMSUdOKGFkZHIscGdvZmYpCQlcCkBAIC0zNyw4ICszOSw4IEBACiAJICogY2FjaGVzIGFsaWFzLiAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYml0cyA5IGFuZCAyMSBvZiB0aGUKIAkgKiBjYWNoZSB0eXBlIHJlZ2lzdGVyLgogCSAqLwotCWNhY2hlX3R5cGUgPSByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7Ci0JaWYgKGNhY2hlX3R5cGUgIT0gcmVhZF9jcHVpZChDUFVJRF9JRCkpIHsKKwljYWNoZV90eXBlID0gcmVhZF9jcHVpZF9jYWNoZXR5cGUoKTsKKwlpZiAoY2FjaGVfdHlwZSAhPSByZWFkX2NwdWlkX2lkKCkpIHsKIAkJYWxpYXNpbmcgPSAoY2FjaGVfdHlwZSB8IGNhY2hlX3R5cGUgPj4gMTIpICYgKDEgPDwgMTEpOwogCQlpZiAoYWxpYXNpbmcpCiAJCQlkb19hbGlnbiA9IGZpbHAgfHwgZmxhZ3MgJiBNQVBfU0hBUkVEOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW11LmMgYi9hcmNoL2FybS9tbS9tbXUuYwppbmRleCAyNWQ5YTExLi44YmE3NTQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbXUuYworKysgYi9hcmNoL2FybS9tbS9tbXUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogCisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgpAQCAtMjcsOSArMjgsNiBAQAogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwogCi1leHRlcm4gdm9pZCBfc3RleHQsIF9ldGV4dCwgX19kYXRhX3N0YXJ0LCBfZW5kOwotZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07Ci0KIC8qCiAgKiBlbXB0eV96ZXJvX3BhZ2UgaXMgYSBzcGVjaWFsIHBhZ2UgdGhhdCBpcyB1c2VkIGZvcgogICogemVyby1pbml0aWFsaXplZCBkYXRhIGFuZCBDT1cuCkBAIC02OCwyNyArNjYsMjcgQEAKIAkJLnBvbGljeQkJPSAidW5jYWNoZWQiLAogCQkuY3JfbWFzawk9IENSX1d8Q1JfQywKIAkJLnBtZAkJPSBQTURfU0VDVF9VTkNBQ0hFRCwKLQkJLnB0ZQkJPSAwLAorCQkucHRlCQk9IExfUFRFX01UX1VOQ0FDSEVELAogCX0sIHsKIAkJLnBvbGljeQkJPSAiYnVmZmVyZWQiLAogCQkuY3JfbWFzawk9IENSX0MsCiAJCS5wbWQJCT0gUE1EX1NFQ1RfQlVGRkVSRUQsCi0JCS5wdGUJCT0gUFRFX0JVRkZFUkFCTEUsCisJCS5wdGUJCT0gTF9QVEVfTVRfQlVGRkVSQUJMRSwKIAl9LCB7CiAJCS5wb2xpY3kJCT0gIndyaXRldGhyb3VnaCIsCiAJCS5jcl9tYXNrCT0gMCwKIAkJLnBtZAkJPSBQTURfU0VDVF9XVCwKLQkJLnB0ZQkJPSBQVEVfQ0FDSEVBQkxFLAorCQkucHRlCQk9IExfUFRFX01UX1dSSVRFVEhST1VHSCwKIAl9LCB7CiAJCS5wb2xpY3kJCT0gIndyaXRlYmFjayIsCiAJCS5jcl9tYXNrCT0gMCwKIAkJLnBtZAkJPSBQTURfU0VDVF9XQiwKLQkJLnB0ZQkJPSBQVEVfQlVGRkVSQUJMRXxQVEVfQ0FDSEVBQkxFLAorCQkucHRlCQk9IExfUFRFX01UX1dSSVRFQkFDSywKIAl9LCB7CiAJCS5wb2xpY3kJCT0gIndyaXRlYWxsb2MiLAogCQkuY3JfbWFzawk9IDAsCiAJCS5wbWQJCT0gUE1EX1NFQ1RfV0JXQSwKLQkJLnB0ZQkJPSBQVEVfQlVGRkVSQUJMRXxQVEVfQ0FDSEVBQkxFLAorCQkucHRlCQk9IExfUFRFX01UX1dSSVRFQUxMT0MsCiAJfQogfTsKIApAQCAtMTg2LDI5ICsxODQsMjggQEAKIAogc3RhdGljIHN0cnVjdCBtZW1fdHlwZSBtZW1fdHlwZXNbXSA9IHsKIAlbTVRfREVWSUNFXSA9IHsJCSAgLyogU3Ryb25nbHkgb3JkZXJlZCAvIEFSTXY2IHNoYXJlZCBkZXZpY2UgKi8KLQkJLnByb3RfcHRlCT0gUFJPVF9QVEVfREVWSUNFLAorCQkucHJvdF9wdGUJPSBQUk9UX1BURV9ERVZJQ0UgfCBMX1BURV9NVF9ERVZfU0hBUkVEIHwKKwkJCQkgIExfUFRFX1NIQVJFRCwKIAkJLnByb3RfbDEJPSBQTURfVFlQRV9UQUJMRSwKIAkJLnByb3Rfc2VjdAk9IFBST1RfU0VDVF9ERVZJQ0UgfCBQTURfU0VDVF9VTkNBQ0hFRCwKIAkJLmRvbWFpbgkJPSBET01BSU5fSU8sCiAJfSwKIAlbTVRfREVWSUNFX05PTlNIQVJFRF0gPSB7IC8qIEFSTXY2IG5vbi1zaGFyZWQgZGV2aWNlICovCi0JCS5wcm90X3B0ZQk9IFBST1RfUFRFX0RFVklDRSwKLQkJLnByb3RfcHRlX2V4dAk9IFBURV9FWFRfVEVYKDIpLAorCQkucHJvdF9wdGUJPSBQUk9UX1BURV9ERVZJQ0UgfCBMX1BURV9NVF9ERVZfTk9OU0hBUkVELAogCQkucHJvdF9sMQk9IFBNRF9UWVBFX1RBQkxFLAogCQkucHJvdF9zZWN0CT0gUFJPVF9TRUNUX0RFVklDRSB8IFBNRF9TRUNUX1RFWCgyKSwKIAkJLmRvbWFpbgkJPSBET01BSU5fSU8sCiAJfSwKIAlbTVRfREVWSUNFX0NBQ0hFRF0gPSB7CSAgLyogaW9yZW1hcF9jYWNoZWQgKi8KLQkJLnByb3RfcHRlCT0gUFJPVF9QVEVfREVWSUNFIHwgTF9QVEVfQ0FDSEVBQkxFIHwgTF9QVEVfQlVGRkVSQUJMRSwKKwkJLnByb3RfcHRlCT0gUFJPVF9QVEVfREVWSUNFIHwgTF9QVEVfTVRfREVWX0NBQ0hFRCwKIAkJLnByb3RfbDEJPSBQTURfVFlQRV9UQUJMRSwKIAkJLnByb3Rfc2VjdAk9IFBST1RfU0VDVF9ERVZJQ0UgfCBQTURfU0VDVF9XQiwKIAkJLmRvbWFpbgkJPSBET01BSU5fSU8sCiAJfSwJCi0JW01UX0RFVklDRV9JWFAyMDAwXSA9IHsJICAvKiBJWFAyNDAwIHJlcXVpcmVzIFhDQj0xMDEgZm9yIG9uLWNoaXAgSS9PICovCi0JCS5wcm90X3B0ZQk9IFBST1RfUFRFX0RFVklDRSwKKwlbTVRfREVWSUNFX1dDXSA9IHsJLyogaW9yZW1hcF93YyAqLworCQkucHJvdF9wdGUJPSBQUk9UX1BURV9ERVZJQ0UgfCBMX1BURV9NVF9ERVZfV0MsCiAJCS5wcm90X2wxCT0gUE1EX1RZUEVfVEFCTEUsCi0JCS5wcm90X3NlY3QJPSBQUk9UX1NFQ1RfREVWSUNFIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSB8Ci0JCQkJICBQTURfU0VDVF9URVgoMSksCisJCS5wcm90X3NlY3QJPSBQUk9UX1NFQ1RfREVWSUNFIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSwKIAkJLmRvbWFpbgkJPSBET01BSU5fSU8sCiAJfSwKIAlbTVRfQ0FDSEVDTEVBTl0gPSB7CkBAIC0yNTMsNyArMjUwLDcgQEAKIHsKIAlzdHJ1Y3QgY2FjaGVwb2xpY3kgKmNwOwogCXVuc2lnbmVkIGludCBjciA9IGdldF9jcigpOwotCXVuc2lnbmVkIGludCB1c2VyX3BncHJvdCwga2Vybl9wZ3Byb3Q7CisJdW5zaWduZWQgaW50IHVzZXJfcGdwcm90LCBrZXJuX3BncHJvdCwgdmVjc19wZ3Byb3Q7CiAJaW50IGNwdV9hcmNoID0gY3B1X2FyY2hpdGVjdHVyZSgpOwogCWludCBpOwogCkBAIC0yNzEsNiArMjY4LDIwIEBACiAJCQljYWNoZXBvbGljeSA9IENQT0xJQ1lfV1JJVEVCQUNLOwogCQllY2NfbWFzayA9IDA7CiAJfQorI2lmZGVmIENPTkZJR19TTVAKKwljYWNoZXBvbGljeSA9IENQT0xJQ1lfV1JJVEVBTExPQzsKKyNlbmRpZgorCisJLyoKKwkgKiBPbiBub24tWHNjYWxlMyBBUk12NS1hbmQtb2xkZXIgc3lzdGVtcywgdXNlIENCPTAxCisJICogKFVuY2FjaGVkL0J1ZmZlcmVkKSBmb3IgaW9yZW1hcF93YygpIG1hcHBpbmdzLiAgT24gWFNjYWxlMworCSAqIGFuZCBBUk12NissIHVzZSBURVhDQj0wMDEwMCBtYXBwaW5ncyAoSW5uZXIvT3V0ZXIgVW5jYWNoZWFibGUKKwkgKiBpbiB4c2MzIHBhcmxhbmNlLCBVbmNhY2hlZCBOb3JtYWwgaW4gQVJNdjYgcGFybGFuY2UpLgorCSAqLworCWlmIChjcHVfaXNfeHNjMygpIHx8IGNwdV9hcmNoID49IENQVV9BUkNIX0FSTXY2KSB7CisJCW1lbV90eXBlc1tNVF9ERVZJQ0VfV0NdLnByb3Rfc2VjdCB8PSBQTURfU0VDVF9URVgoMSk7CisJCW1lbV90eXBlc1tNVF9ERVZJQ0VfV0NdLnByb3Rfc2VjdCAmPSB+UE1EX1NFQ1RfQlVGRkVSQUJMRTsKKwl9CiAKIAkvKgogCSAqIEFSTXY1IGFuZCBsb3dlciwgYml0IDQgbXVzdCBiZSBzZXQgZm9yIHBhZ2UgdGFibGVzLgpAQCAtMjkyLDcgKzMwMywxNSBAQAogCX0KIAogCWNwID0gJmNhY2hlX3BvbGljaWVzW2NhY2hlcG9saWN5XTsKLQlrZXJuX3BncHJvdCA9IHVzZXJfcGdwcm90ID0gY3AtPnB0ZTsKKwl2ZWNzX3BncHJvdCA9IGtlcm5fcGdwcm90ID0gdXNlcl9wZ3Byb3QgPSBjcC0+cHRlOworCisjaWZuZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIE9ubHkgdXNlIHdyaXRlLXRocm91Z2ggZm9yIG5vbi1TTVAgc3lzdGVtcworCSAqLworCWlmIChjcHVfYXJjaCA+PSBDUFVfQVJDSF9BUk12NSAmJiBjYWNoZXBvbGljeSA+IENQT0xJQ1lfV1JJVEVUSFJPVUdIKQorCQl2ZWNzX3BncHJvdCA9IGNhY2hlX3BvbGljaWVzW0NQT0xJQ1lfV1JJVEVUSFJPVUdIXS5wdGU7CisjZW5kaWYKIAogCS8qCiAJICogRW5hYmxlIENQVS1zcGVjaWZpYyBjb2hlcmVuY3kgaWYgc3VwcG9ydGVkLgpAQCAtMzIwLDcgKzMzOSw2IEBACiAJCS8qCiAJCSAqIE1hcmsgdGhlIGRldmljZSBhcmVhIGFzICJzaGFyZWQgZGV2aWNlIgogCQkgKi8KLQkJbWVtX3R5cGVzW01UX0RFVklDRV0ucHJvdF9wdGUgfD0gTF9QVEVfQlVGRkVSQUJMRTsKIAkJbWVtX3R5cGVzW01UX0RFVklDRV0ucHJvdF9zZWN0IHw9IFBNRF9TRUNUX0JVRkZFUkVEOwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMzI5LDMwICszNDcsMjEgQEAKIAkJICovCiAJCXVzZXJfcGdwcm90IHw9IExfUFRFX1NIQVJFRDsKIAkJa2Vybl9wZ3Byb3QgfD0gTF9QVEVfU0hBUkVEOworCQl2ZWNzX3BncHJvdCB8PSBMX1BURV9TSEFSRUQ7CiAJCW1lbV90eXBlc1tNVF9NRU1PUlldLnByb3Rfc2VjdCB8PSBQTURfU0VDVF9TOwogI2VuZGlmCiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyB2ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uX21hcFtpXSk7Ci0JCXYgPSAodiAmIH4oTF9QVEVfQlVGRkVSQUJMRXxMX1BURV9DQUNIRUFCTEUpKSB8IHVzZXJfcGdwcm90OwotCQlwcm90ZWN0aW9uX21hcFtpXSA9IF9fcGdwcm90KHYpOworCQlwcm90ZWN0aW9uX21hcFtpXSA9IF9fcGdwcm90KHYgfCB1c2VyX3BncHJvdCk7CiAJfQogCi0JbWVtX3R5cGVzW01UX0xPV19WRUNUT1JTXS5wcm90X3B0ZSB8PSBrZXJuX3BncHJvdDsKLQltZW1fdHlwZXNbTVRfSElHSF9WRUNUT1JTXS5wcm90X3B0ZSB8PSBrZXJuX3BncHJvdDsKKwltZW1fdHlwZXNbTVRfTE9XX1ZFQ1RPUlNdLnByb3RfcHRlIHw9IHZlY3NfcGdwcm90OworCW1lbV90eXBlc1tNVF9ISUdIX1ZFQ1RPUlNdLnByb3RfcHRlIHw9IHZlY3NfcGdwcm90OwogCi0JaWYgKGNwdV9hcmNoID49IENQVV9BUkNIX0FSTXY1KSB7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQkJLyoKLQkJICogT25seSB1c2Ugd3JpdGUtdGhyb3VnaCBmb3Igbm9uLVNNUCBzeXN0ZW1zCi0JCSAqLwotCQltZW1fdHlwZXNbTVRfTE9XX1ZFQ1RPUlNdLnByb3RfcHRlICY9IH5MX1BURV9CVUZGRVJBQkxFOwotCQltZW1fdHlwZXNbTVRfSElHSF9WRUNUT1JTXS5wcm90X3B0ZSAmPSB+TF9QVEVfQlVGRkVSQUJMRTsKLSNlbmRpZgotCX0gZWxzZSB7CisJaWYgKGNwdV9hcmNoIDwgQ1BVX0FSQ0hfQVJNdjUpCiAJCW1lbV90eXBlc1tNVF9NSU5JQ0xFQU5dLnByb3Rfc2VjdCAmPSB+UE1EX1NFQ1RfVEVYKDEpOwotCX0KIAogCXBncHJvdF91c2VyICAgPSBfX3BncHJvdChMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCB1c2VyX3BncHJvdCk7CiAJcGdwcm90X2tlcm5lbCA9IF9fcGdwcm90KExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8CkBAIC00MDAsOCArNDA5LDcgQEAKIAogCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7CiAJZG8gewotCQlzZXRfcHRlX2V4dChwdGUsIHBmbl9wdGUocGZuLCBfX3BncHJvdCh0eXBlLT5wcm90X3B0ZSkpLAotCQkJICAgIHR5cGUtPnByb3RfcHRlX2V4dCk7CisJCXNldF9wdGVfZXh0KHB0ZSwgcGZuX3B0ZShwZm4sIF9fcGdwcm90KHR5cGUtPnByb3RfcHRlKSksIDApOwogCQlwZm4rKzsKIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIH0KQEAgLTU2OCwxMiArNTc2LDM1IEBACiAJCWNyZWF0ZV9tYXBwaW5nKGlvX2Rlc2MgKyBpKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSB2bWFsbG9jX3Jlc2VydmUgPSBTWl8xMjhNOworCisvKgorICogdm1hbGxvYz1zaXplIGZvcmNlcyB0aGUgdm1hbGxvYyBhcmVhIHRvIGJlIGV4YWN0bHkgJ3NpemUnCisgKiBieXRlcy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbmNyZWFzZSAob3IgZGVjcmVhc2UpIHRoZSB2bWFsbG9jCisgKiBhcmVhIC0gdGhlIGRlZmF1bHQgaXMgMTI4bS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3ZtYWxsb2MoY2hhciAqKmFyZykKK3sKKwl2bWFsbG9jX3Jlc2VydmUgPSBtZW1wYXJzZSgqYXJnLCBhcmcpOworCisJaWYgKHZtYWxsb2NfcmVzZXJ2ZSA8IFNaXzE2TSkgeworCQl2bWFsbG9jX3Jlc2VydmUgPSBTWl8xNk07CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJ2bWFsbG9jIGFyZWEgdG9vIHNtYWxsLCBsaW1pdGluZyB0byAlbHVNQlxuIiwKKwkJCXZtYWxsb2NfcmVzZXJ2ZSA+PiAyMCk7CisJfQorfQorX19lYXJseV9wYXJhbSgidm1hbGxvYz0iLCBlYXJseV92bWFsbG9jKTsKKworI2RlZmluZSBWTUFMTE9DX01JTgkodm9pZCAqKShWTUFMTE9DX0VORCAtIHZtYWxsb2NfcmVzZXJ2ZSkKKwogc3RhdGljIGludCBfX2luaXQgY2hlY2tfbWVtYmFua192YWxpZChzdHJ1Y3QgbWVtYmFuayAqbWIpCiB7CiAJLyoKLQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IHJlZ2lvbiBoYXMgbm9uLXplcm8gc2l6ZS4KKwkgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVtb3J5IHJlZ2lvbiBoYXMgbm9uLXplcm8gc2l6ZSBvcgorCSAqIGludmFsaWQgbm9kZSBudW1iZXIuCiAJICovCi0JaWYgKG1iLT5zaXplID09IDApCisJaWYgKG1iLT5zaXplID09IDAgfHwgbWItPm5vZGUgPj0gTUFYX05VTU5PREVTKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC02MDcsOCArNjM4LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNhbml0eV9jaGVja19tZW1pbmZvKHN0cnVjdCBtZW1pbmZvICptaSkKIHsKLQlpbnQgaTsKLQlpbnQgajsKKwlpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKIAkJaWYgKGNoZWNrX21lbWJhbmtfdmFsaWQoJm1pLT5iYW5rW2ldKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL25vbW11LmMgYi9hcmNoL2FybS9tbS9ub21tdS5jCmluZGV4IDYzYzYyZmQuLjA3YjYyYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL25vbW11LmMKKysrIGIvYXJjaC9hcm0vbW0vbm9tbXUuYwpAQCAtNywxNiArNywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgIm1tLmgiCiAKLWV4dGVybiB2b2lkIF9zdGV4dCwgX19kYXRhX3N0YXJ0LCBfZW5kOwotCiAvKgogICogUmVzZXJ2ZSB0aGUgdmFyaW91cyByZWdpb25zIG9mIG5vZGUgMAogICovCkBAIC00MywxMiArNDEsMjYgQEAKIAkJCUJPT1RNRU1fREVGQVVMVCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBzYW5pdHlfY2hlY2tfbWVtaW5mbyhzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG1pLT5ucl9iYW5rczsgaSsrKSB7CisJCXN0cnVjdCBtZW1iYW5rICptYiA9ICZtaS0+YmFua1tpXTsKKworCQlpZiAobWItPnNpemUgIT0gMCAmJiBtYi0+bm9kZSA8IE1BWF9OVU1OT0RFUykKKwkJCW1pLT5iYW5rW2orK10gPSBtaS0+YmFua1tpXTsKKwl9CisJbWktPm5yX2JhbmtzID0gajsKK30KKwogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMsIGluaXRpYWxpc2VzIHRoZSB6b25lIG1lbW9yeQogICogbWFwcywgYW5kIHNldHMgdXAgdGhlIHplcm8gcGFnZSwgYmFkIHBhZ2UgYW5kIGJhZCBwYWdlIHRhYmxlcy4KICAqLwogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQoc3RydWN0IG1lbWluZm8gKm1pLCBzdHJ1Y3QgbWFjaGluZV9kZXNjICptZGVzYykKIHsKKwlzYW5pdHlfY2hlY2tfbWVtaW5mbyhtaSk7CiAJYm9vdG1lbV9pbml0KG1pKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCA1NjczZjRkLi5iNTU1MWJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0zOTksMjkgKzM5OSw3IEBACiAJLmFsaWduCTUKIEVOVFJZKGNwdV9hcm0xMDIwX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKLQlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCi0KLQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCi0JYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKLQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKLQotCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/Ci0Jb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0Jb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPwotCW1vdm5lCXIyLCAjMAotCi0jaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICi0JZW9yCXIzLCByMSwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPwotCXRzdAlyMywgIzB4MGIKLQliaWNlcQlyMiwgcjIsICM0Ci0jZW5kaWYKLQlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwlhcm12M19zZXRfcHRlX2V4dAogCW1vdglyMCwgcjAKICNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKaW5kZXggNDM0M2ZkYi4uOGJjNjc0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0zODMsMjkgKzM4Myw3IEBACiAJLmFsaWduCTUKIEVOVFJZKGNwdV9hcm0xMDIwZV9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKLQotCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwotCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCi0Jb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCi0KLQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPwotCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PwotCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KLQltb3ZuZQlyMiwgIzAKLQotI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAotCWVvcglyMywgcjEsICMweDBhCQkJQCBDICYgc21hbGwgcGFnZT8KLQl0c3QJcjMsICMweDBiCi0JYmljZXEJcjIsIHIyLCAjNAotI2VuZGlmCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJYXJtdjNfc2V0X3B0ZV9leHQKIAltb3YJcjAsIHIwCiAjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCmluZGV4IDJhNGVhMTYuLjJjZDAzZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTM2NSwyOSArMzY1LDcgQEAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X2FybTEwMjJfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQotCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KLQotCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCi0KLQliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKLQliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSwotCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAotCi0JdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KLQlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KLQlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/Ci0JbW92bmUJcjIsICMwCi0KLSNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKLQllb3IJcjMsIHIxLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/Ci0JdHN0CXIzLCAjMHgwYgotCWJpY2VxCXIyLCByMiwgIzQKLSNlbmRpZgotCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCWFybXYzX3NldF9wdGVfZXh0CiAJbW92CXIwLCByMAogI2lmbmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwppbmRleCA3N2ExYmFiLi5hZDk2MWE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0zNTQsMjkgKzM1NCw3IEBACiAJLmFsaWduCTUKIEVOVFJZKGNwdV9hcm0xMDI2X3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKLQlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCi0KLQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCi0JYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKLQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKLQotCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/Ci0Jb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0Jb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPwotCW1vdm5lCXIyLCAjMAotCi0jaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICi0JZW9yCXIzLCByMSwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPwotCXRzdAlyMywgIzB4MGIKLQliaWNlcQlyMiwgcjIsICM0Ci0jZW5kaWYKLQlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwlhcm12M19zZXRfcHRlX2V4dAogCW1vdglyMCwgcjAKICNpZm5kZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCmluZGV4IGMzNzFmYzguLjgwZDZlMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwpAQCAtMTUsMTEgKzE1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAorI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCisKIEVOVFJZKGNwdV9hcm02X2RjYWNoZV9jbGVhbl9hcmVhKQogRU5UUlkoY3B1X2FybTdfZGNhY2hlX2NsZWFuX2FyZWEpCiAJCW1vdglwYywgbHIKQEAgLTIxNCwzMCArMjE2LDEzIEBACiAgKgkgICA6IHIxID0gdmFsdWUgdG8gc2V0CiAgKiBQdXJwb3NlIDogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQgb2YgYW55IFdCIGNhY2hlCiAgKi8KLQkJLmFsaWduCTUKKwkuYWxpZ24JNQogRU5UUlkoY3B1X2FybTZfc2V0X3B0ZV9leHQpCiBFTlRSWShjcHVfYXJtN19zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCi0JCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KLQotCQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwotCQliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSwotCQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKLQotCQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPwotCQlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVwotCi0JCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0JCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCi0KLQkJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmcKLQkJbW92bmUJcjIsICMwCi0KLQkJc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJYXJtdjNfc2V0X3B0ZV9leHQgd2NfZGlzYWJsZT0wCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwotCQltb3YJcGMsIGxyCisJbW92CXBjLCBscgogCiAvKgogICogRnVuY3Rpb246IF9hcm02XzdfcmVzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCmluZGV4IGVkYTczM2QuLjg1YWUxODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC05MywyOSArOTMsMTIgQEAKICAqCSAgIDogcjEgPSB2YWx1ZSB0byBzZXQKICAqIFB1cnBvc2UgOiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dCBvZiBhbnkgV0IgY2FjaGUKICAqLwotCQkuYWxpZ24JNQorCS5hbGlnbgk1CiBFTlRSWShjcHVfYXJtNzIwX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKLQkJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCi0KLQkJYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCi0JCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCi0JCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAotCi0JCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/Ci0JCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCi0KLQkJdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KLQkJb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKLQotCQl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZwotCQltb3ZuZQlyMiwgIzAKLQotCQlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwlhcm12M19zZXRfcHRlX2V4dCB3Y19kaXNhYmxlPTAKICNlbmRpZgotCQltb3YJcGMsIGxyCisJbW92CXBjLCBscgogCiAvKgogICogRnVuY3Rpb246IGFybTcyMF9yZXNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKaW5kZXggM2E1NzM3Ni4uNGY5NWJlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUwppbmRleCA3YjNlY2RlLi45M2UwNWZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCmluZGV4IDI4Y2RiMDYuLjkxNGQ2ODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTM1MSwzMyArMzUxLDExIEBACiAJLmFsaWduCTUKIEVOVFJZKGNwdV9hcm05MjBfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQotCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KLQotCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCi0KLQliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKLQliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSwotCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAotCi0JdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KLQlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KLQlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/Ci0JbW92bmUJcjIsICMwCi0KLSNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9XUklURVRIUk9VR0gKLQllb3IJcjMsIHIyLCAjMHgwYQkJCUAgQyAmIHNtYWxsIHBhZ2U/Ci0JdHN0CXIzLCAjMHgwYgotCWJpY2VxCXIyLCByMiwgIzQKLSNlbmRpZgotCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCWFybXYzX3NldF9wdGVfZXh0CiAJbW92CXIwLCByMAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KKyNlbmRpZgogCW1vdglwYywgbHIKIAogCV9fSU5JVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKaW5kZXggOTRkZGNiNC4uNTFjOWM5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMzU1LDI5ICszNTUsNyBAQAogCS5hbGlnbgk1CiBFTlRSWShjcHVfYXJtOTIyX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKLQlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCi0KLQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCi0JYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKLQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKLQotCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/Ci0Jb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0Jb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPwotCW1vdm5lCXIyLCAjMAotCi0jaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICi0JZW9yCXIzLCByMiwgIzB4MGEJCQlAIEMgJiBzbWFsbCBwYWdlPwotCXRzdAlyMywgIzB4MGIKLQliaWNlcQlyMiwgcjIsICM0Ci0jZW5kaWYKLQlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwlhcm12M19zZXRfcHRlX2V4dAogCW1vdglyMCwgcjAKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5CiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCmluZGV4IGQwNDU4MTIuLjI3MjQ1MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUwpAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTM5OCwyOSArMzk4LDcgQEAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X2FybTkyNV9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKLQotCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwotCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCi0Jb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCi0KLQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPwotCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PwotCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KLQltb3ZuZQlyMiwgIzAKLQotI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAotCWVvcglyMywgcjIsICMweDBhCQkJQCBDICYgc21hbGwgcGFnZT8KLQl0c3QJcjMsICMweDBiCi0JYmljZXEJcjIsIHIyLCAjNAotI2VuZGlmCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJYXJtdjNfc2V0X3B0ZV9leHQKIAltb3YJcjAsIHIwCiAjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCmluZGV4IDRjZDMzMTYuLjU0NDY2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTM1OSwyOSArMzU5LDcgQEAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X2FybTkyNl9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKLQotCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwotCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCi0Jb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCi0KLQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPwotCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PwotCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KLQltb3ZuZQlyMiwgIzAKLQotI2lmZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAotCWVvcglyMywgcjIsICMweDBhCQkJQCBDICYgc21hbGwgcGFnZT8KLQl0c3QJcjMsICMweDBiCi0JYmljZXEJcjIsIHIyLCAjNAotI2VuZGlmCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJYXJtdjNfc2V0X3B0ZV9leHQKIAltb3YJcjAsIHIwCiAjaWZuZGVmIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TCmluZGV4IDU1MTI0NGQuLmY1OTUxMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKaW5kZXggNjE2OGM2MS4uZTAzZjZmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKaW5kZXggYzg1YzFmNS4uYmU2YzExZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMgYi9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMKaW5kZXggZjJlNTg4NC4uMGZlMWY4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtZmVyb2Nlb24uUwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTgwLDcgKzgwLDggQEAKIAltc3IJY3Bzcl9jLCBpcAogCWJsCWZlcm9jZW9uX2ZsdXNoX2tlcm5fY2FjaGVfYWxsCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMikgJiYgIWRlZmluZWQoQ09ORklHX0wyX0NBQ0hFX1dSSVRFVEhST1VHSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMikgJiYgXAorCSFkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMl9XUklURVRIUk9VR0gpCiAJbW92CXIwLCAjMAogCW1jcglwMTUsIDEsIHIwLCBjMTUsIGM5LCAwCQlAIGNsZWFuIEwyCiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQJCUAgZHJhaW4gV0IKQEAgLTM4OSw3ICszOTAsOCBAQAogCiAJLmFsaWduCTUKIEVOVFJZKGNwdV9mZXJvY2Vvbl9kY2FjaGVfY2xlYW5fYXJlYSkKLSNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMikgJiYgIWRlZmluZWQoQ09ORklHX0wyX0NBQ0hFX1dSSVRFVEhST1VHSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMikgJiYgXAorCSFkZWZpbmVkKENPTkZJR19DQUNIRV9GRVJPQ0VPTl9MMl9XUklURVRIUk9VR0gpCiAJbW92CXIyLCByMAogCW1vdglyMywgcjEKICNlbmRpZgpAQCAtMzk3LDcgKzM5OSw4IEBACiAJYWRkCXIwLCByMCwgI0NBQ0hFX0RMSU5FU0laRQogCXN1YnMJcjEsIHIxLCAjQ0FDSEVfRExJTkVTSVpFCiAJYmhpCTFiCi0jaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpICYmICFkZWZpbmVkKENPTkZJR19MMl9DQUNIRV9XUklURVRIUk9VR0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpICYmIFwKKwkhZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDJfV1JJVEVUSFJPVUdIKQogMToJbWNyCXAxNSwgMSwgcjIsIGMxNSwgYzksIDEJCUAgY2xlYW4gTDIgZW50cnkKIAlhZGQJcjIsIHIyLCAjQ0FDSEVfRExJTkVTSVpFCiAJc3VicwlyMywgcjMsICNDQUNIRV9ETElORVNJWkUKQEAgLTQ0NiwyNyArNDQ5LDExIEBACiAJLmFsaWduCTUKIEVOVFJZKGNwdV9mZXJvY2Vvbl9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JZW9yCXIxLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKLQotCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwotCWJpYwlyMiwgcjIsICNQVEVfVFlQRV9NQVNLCi0Jb3JyCXIyLCByMiwgI1BURV9UWVBFX1NNQUxMCi0KLQl0c3QJcjEsICNMX1BURV9VU0VSCQkJQCBVc2VyPwotCW9ycm5lCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VUk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCUAgV3JpdGUgYW5kIERpcnR5PwotCW9ycmVxCXIyLCByMiwgI1BURV9TTUFMTF9BUF9VTk9fU1JXCi0KLQl0c3QJcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KLQltb3ZuZQlyMiwgIzAKLQotCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCWFybXYzX3NldF9wdGVfZXh0IHdjX2Rpc2FibGU9MAogCW1vdglyMCwgcjAKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBEIGVudHJ5Ci0jaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpICYmICFkZWZpbmVkKENPTkZJR19MMl9DQUNIRV9XUklURVRIUk9VR0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpICYmIFwKKwkhZGVmaW5lZChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDJfV1JJVEVUSFJPVUdIKQogCW1jcglwMTUsIDEsIHIwLCBjMTUsIGM5LCAxCQlAIGNsZWFuIEwyIGVudHJ5CiAjZW5kaWYKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKaW5kZXggYjEzMTUwMC4uNTRiMWY3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCkBAIC03MSwzICs3MSwxNzMgQEAKIAltb3YJXHJlZywgIzE2CQkJQCBzaXplIG9mZnNldAogCW1vdglccmVnLCBccmVnLCBsc2wgXHRtcAkJQCBhY3R1YWwgY2FjaGUgbGluZSBzaXplCiAJLmVuZG0KKworCisvKgorICogU2FuaXR5IGNoZWNrIHRoZSBQVEUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvZGUgYmVsb3cgLSB3aGljaCBtYWtlcworICogY2VydGFpbiBhc3N1bXB0aW9ucyBhYm91dCBob3cgdGhlc2UgYml0cyBhcmUgbGF5ZWQgb3V0LgorICovCisjaWYgTF9QVEVfU0hBUkVEICE9IFBURV9FWFRfU0hBUkVECisjZXJyb3IgUFRFIHNoYXJlZCBiaXQgbWlzbWF0Y2gKKyNlbmRpZgorI2lmIExfUFRFX0JVRkZFUkFCTEUgIT0gUFRFX0JVRkZFUkFCTEUKKyNlcnJvciBQVEUgYnVmZmVyYWJsZSBiaXQgbWlzbWF0Y2gKKyNlbmRpZgorI2lmIExfUFRFX0NBQ0hFQUJMRSAhPSBQVEVfQ0FDSEVBQkxFCisjZXJyb3IgUFRFIGNhY2hlYWJsZSBiaXQgbWlzbWF0Y2gKKyNlbmRpZgorI2lmIChMX1BURV9FWEVDK0xfUFRFX1VTRVIrTF9QVEVfV1JJVEUrTF9QVEVfRElSVFkrTF9QVEVfWU9VTkcrXAorICAgICBMX1BURV9GSUxFK0xfUFRFX1BSRVNFTlQpID4gTF9QVEVfU0hBUkVECisjZXJyb3IgSW52YWxpZCBMaW51eCBQVEUgYml0IHNldHRpbmdzCisjZW5kaWYKKworLyoKKyAqIFRoZSBBUk12NiBhbmQgQVJNdjcgc2V0X3B0ZV9leHQgdHJhbnNsYXRpb24gZnVuY3Rpb24uCisgKgorICogUGVybWlzc2lvbiB0cmFuc2xhdGlvbjoKKyAqICBZVVdEICBBUFggQVAxIEFQMAlTVkMJVXNlcgorICogIDB4eHggICAwICAgMCAgIDAJbm8gYWNjCW5vIGFjYworICogIDEwMHggICAxICAgMCAgIDEJci9vCW5vIGFjYworICogIDEweDAgICAxICAgMCAgIDEJci9vCW5vIGFjYworICogIDEwMTEgICAwICAgMCAgIDEJci93CW5vIGFjYworICogIDExMHggICAwICAgMSAgIDAJci93CXIvbworICogIDExeDAgICAwICAgMSAgIDAJci93CXIvbworICogIDExMTEgICAwICAgMSAgIDEJci93CXIvdworICovCisJLm1hY3JvCWFybXY2X210X3RhYmxlIHBmeAorXHBmeFwoKV9tdF90YWJsZToKKwkubG9uZwkweDAwCQkJCQkJQCBMX1BURV9NVF9VTkNBQ0hFRAorCS5sb25nCVBURV9FWFRfVEVYKDEpCQkJCQlAIExfUFRFX01UX0JVRkZFUkFCTEUKKwkubG9uZwlQVEVfQ0FDSEVBQkxFCQkJCQlAIExfUFRFX01UX1dSSVRFVEhST1VHSAorCS5sb25nCVBURV9DQUNIRUFCTEUgfCBQVEVfQlVGRkVSQUJMRQkJCUAgTF9QVEVfTVRfV1JJVEVCQUNLCisJLmxvbmcJUFRFX0JVRkZFUkFCTEUJCQkJCUAgTF9QVEVfTVRfREVWX1NIQVJFRAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCTB4MDAJCQkJCQlAIExfUFRFX01UX01JTklDQUNIRSAobm90IHByZXNlbnQpCisJLmxvbmcJUFRFX0VYVF9URVgoMSkgfCBQVEVfQ0FDSEVBQkxFIHwgUFRFX0JVRkZFUkFCTEUJQCBMX1BURV9NVF9XUklURUFMTE9DCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJUFRFX0VYVF9URVgoMSkJCQkJCUAgTF9QVEVfTVRfREVWX1dDCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJUFRFX0NBQ0hFQUJMRSB8IFBURV9CVUZGRVJBQkxFCQkJQCBMX1BURV9NVF9ERVZfQ0FDSEVECisJLmxvbmcJUFRFX0VYVF9URVgoMikJCQkJCUAgTF9QVEVfTVRfREVWX05PTlNIQVJFRAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5lbmRtCisKKwkubWFjcm8JYXJtdjZfc2V0X3B0ZV9leHQgcGZ4CisJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgorCisJYmljCXIzLCByMSwgIzB4MDAwMDAzZmMKKwliaWMJcjMsIHIzLCAjUFRFX1RZUEVfTUFTSworCW9ycglyMywgcjMsIHIyCisJb3JyCXIzLCByMywgI1BURV9FWFRfQVAwIHwgMgorCisJYWRyCWlwLCBccGZ4XCgpX210X3RhYmxlCisJYW5kCXIyLCByMSwgI0xfUFRFX01UX01BU0sKKwlsZHIJcjIsIFtpcCwgcjJdCisKKwl0c3QJcjEsICNMX1BURV9XUklURQorCXRzdG5lCXIxLCAjTF9QVEVfRElSVFkKKwlvcnJlcQlyMywgcjMsICNQVEVfRVhUX0FQWAorCisJdHN0CXIxLCAjTF9QVEVfVVNFUgorCW9ycm5lCXIzLCByMywgI1BURV9FWFRfQVAxCisJdHN0bmUJcjMsICNQVEVfRVhUX0FQWAorCWJpY25lCXIzLCByMywgI1BURV9FWFRfQVBYIHwgUFRFX0VYVF9BUDAKKworCXRzdAlyMSwgI0xfUFRFX0VYRUMKKwlvcnJlcQlyMywgcjMsICNQVEVfRVhUX1hOCisKKwlvcnIJcjMsIHIzLCByMgorCisJdHN0CXIxLCAjTF9QVEVfWU9VTkcKKwl0c3RuZQlyMSwgI0xfUFRFX1BSRVNFTlQKKwltb3ZlcQlyMywgIzAKKworCXN0cglyMywgW3IwXQorCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGZsdXNoX3B0ZQorCS5lbmRtCisKKworLyoKKyAqIFRoZSBBUk12MywgQVJNdjQgYW5kIEFSTXY1IHNldF9wdGVfZXh0IHRyYW5zbGF0aW9uIGZ1bmN0aW9uLAorICogY292ZXJpbmcgbW9zdCBDUFVzIGV4Y2VwdCBYc2NhbGUgYW5kIFhzY2FsZSAzLgorICoKKyAqIFBlcm1pc3Npb24gdHJhbnNsYXRpb246CisgKiAgWVVXRCAgIEFQCVNWQwlVc2VyCisgKiAgMHh4eCAgMHgwMAlubyBhY2MJbm8gYWNjCisgKiAgMTAweCAgMHgwMAlyL28Jbm8gYWNjCisgKiAgMTB4MCAgMHgwMAlyL28Jbm8gYWNjCisgKiAgMTAxMSAgMHg1NQlyL3cJbm8gYWNjCisgKiAgMTEweCAgMHhhYQlyL3cJci9vCisgKiAgMTF4MCAgMHhhYQlyL3cJci9vCisgKiAgMTExMSAgMHhmZglyL3cJci93CisgKi8KKwkubWFjcm8JYXJtdjNfc2V0X3B0ZV9leHQgd2NfZGlzYWJsZT0xCisJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgorCisJZW9yCXIzLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKKworCWJpYwlyMiwgcjEsICNQVEVfU01BTExfQVBfTUFTSwlAIGtlZXAgQywgQiBiaXRzCisJYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKKwlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKKworCXRzdAlyMywgI0xfUFRFX1VTRVIJCQlAIHVzZXI/CisJb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKKworCXRzdAlyMywgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCB3cml0ZSBhbmQgZGlydHk/CisJb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKKworCXRzdAlyMywgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIHByZXNlbnQgYW5kIHlvdW5nPworCW1vdm5lCXIyLCAjMAorCisJLmlmCVx3Y19kaXNhYmxlCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdICisJdHN0CXIyLCAjUFRFX0NBQ0hFQUJMRQorCWJpY25lCXIyLCByMiwgI1BURV9CVUZGRVJBQkxFCisjZW5kaWYKKwkuZW5kaWYKKwlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwkuZW5kbQorCisKKy8qCisgKiBYc2NhbGUgc2V0X3B0ZV9leHQgdHJhbnNsYXRpb24sIHNwbGl0IGludG8gdHdvIGhhbHZlcyB0byBjb3BlCisgKiB3aXRoIHdvcmstYXJvdW5kcy4gIHIzIG11c3QgYmUgcHJlc2VydmVkIGJ5IGNvZGUgYmV0d2VlbiB0aGVzZQorICogdHdvIG1hY3Jvcy4KKyAqCisgKiBQZXJtaXNzaW9uIHRyYW5zbGF0aW9uOgorICogIFlVV0QgIEFQCVNWQwlVc2VyCisgKiAgMHh4eCAgMDAJbm8gYWNjCW5vIGFjYworICogIDEwMHggIDAwCXIvbwlubyBhY2MKKyAqICAxMHgwICAwMAlyL28Jbm8gYWNjCisgKiAgMTAxMSAgMDEJci93CW5vIGFjYworICogIDExMHggIDEwCXIvdwlyL28KKyAqICAxMXgwICAxMAlyL3cJci9vCisgKiAgMTExMSAgMTEJci93CXIvdworICovCisJLm1hY3JvCXhzY2FsZV9zZXRfcHRlX2V4dF9wcm9sb2d1ZQorCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KKworCWVvcglyMywgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCisKKwliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sJQCBrZWVwIEMsIEIgYml0cworCW9ycglyMiwgcjIsICNQVEVfVFlQRV9FWFQJCUAgZXh0ZW5kZWQgcGFnZQorCisJdHN0CXIzLCAjTF9QVEVfVVNFUgkJCUAgdXNlcj8KKwlvcnJuZQlyMiwgcjIsICNQVEVfRVhUX0FQX1VST19TUlcJQCB5ZXMgLT4gdXNlciByL28sIHN5c3RlbSByL3cKKworCXRzdAlyMywgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCB3cml0ZSBhbmQgZGlydHk/CisJb3JyZXEJcjIsIHIyLCAjUFRFX0VYVF9BUF9VTk9fU1JXCUAgeWVzIC0+IHVzZXIgbi9hLCBzeXN0ZW0gci93CisJCQkJCQlAIGNvbWJpbmVkIHdpdGggdXNlciAtPiB1c2VyIHIvdworCS5lbmRtCisKKwkubWFjcm8JeHNjYWxlX3NldF9wdGVfZXh0X2VwaWxvZ3VlCisJdHN0CXIzLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgcHJlc2VudCBhbmQgeW91bmc/CisJbW92bmUJcjIsICMwCQkJCUAgbm8gLT4gZmF1bHQKKworCXN0cglyMiwgW3IwXQkJCUAgaGFyZHdhcmUgdmVyc2lvbgorCW1vdglpcCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBjbGVhbiBMMSBEIGxpbmUKKwltY3IJcDE1LCAwLCBpcCwgYzcsIGMxMCwgNAkJQCBkYXRhIHdyaXRlIGJhcnJpZXIKKwkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCmluZGV4IGJiZTEwNTcuLjkwYTdlNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTUzLDI0ICsxNTMsNyBAQAogCS5hbGlnbgk1CiBFTlRSWShjcHVfc2ExMTBfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQotCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KLQotCWVvcglyMSwgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCi0KLQliaWMJcjIsIHIxLCAjUFRFX1NNQUxMX0FQX01BU0sKLQliaWMJcjIsIHIyLCAjUFRFX1RZUEVfTUFTSwotCW9ycglyMiwgcjIsICNQVEVfVFlQRV9TTUFMTAotCi0JdHN0CXIxLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KLQlvcnJuZQlyMiwgcjIsICNQVEVfU01BTExfQVBfVVJPX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIFdyaXRlIGFuZCBEaXJ0eT8KLQlvcnJlcQlyMiwgcjIsICNQVEVfU01BTExfQVBfVU5PX1NSVwotCi0JdHN0CXIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HCUAgUHJlc2VudCBhbmQgWW91bmc/Ci0JbW92bmUJcjIsICMwCi0KLQlzdHIJcjIsIFtyMF0JCQlAIGhhcmR3YXJlIHZlcnNpb24KKwlhcm12M19zZXRfcHRlX2V4dCB3Y19kaXNhYmxlPTAKIAltb3YJcjAsIHIwCiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEJCUAgY2xlYW4gRCBlbnRyeQogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCA0CQlAIGRyYWluIFdCCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwppbmRleCA4NzFiYTAxLi40NTFlMmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTY2LDI0ICsxNjYsNyBAQAogCS5hbGlnbgk1CiBFTlRSWShjcHVfc2ExMTAwX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKLQlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCi0KLQllb3IJcjEsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JYmljCXIyLCByMSwgI1BURV9TTUFMTF9BUF9NQVNLCi0JYmljCXIyLCByMiwgI1BURV9UWVBFX01BU0sKLQlvcnIJcjIsIHIyLCAjUFRFX1RZUEVfU01BTEwKLQotCXRzdAlyMSwgI0xfUFRFX1VTRVIJCQlAIFVzZXI/Ci0Jb3JybmUJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VST19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0Jb3JyZXEJcjIsIHIyLCAjUFRFX1NNQUxMX0FQX1VOT19TUlcKLQotCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORwlAIFByZXNlbnQgYW5kIFlvdW5nPwotCW1vdm5lCXIyLCAjMAotCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCisJYXJtdjNfc2V0X3B0ZV9leHQgd2NfZGlzYWJsZT0wCiAJbW92CXIwLCByMAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEQgZW50cnkKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJQCBkcmFpbiBXQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IDU3MDJlYzUuLjI5NDk0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKQEAgLTExNCw0NiArMTE0LDEyIEBACiAgKgkJICAoaGFyZHdhcmUgdmVyc2lvbiBpcyBzdG9yZWQgYXQgLTEwMjQgYnl0ZXMpCiAgKgktIHB0ZSAgIC0gUFRFIHZhbHVlIHRvIHN0b3JlCiAgKgktIGV4dAktIHZhbHVlIGZvciBleHRlbmRlZCBQVEUgYml0cwotICoKLSAqCVBlcm1pc3Npb25zOgotICoJICBZVVdEICBBUFggQVAxIEFQMAlTVkMJVXNlcgotICoJICAweHh4ICAgMCAgIDAgICAwCW5vIGFjYwlubyBhY2MKLSAqCSAgMTAweCAgIDEgICAwICAgMQlyL28Jbm8gYWNjCi0gKgkgIDEweDAgICAxICAgMCAgIDEJci9vCW5vIGFjYwotICoJICAxMDExICAgMCAgIDAgICAxCXIvdwlubyBhY2MKLSAqCSAgMTEweCAgIDAgICAxICAgMAlyL3cJci9vCi0gKgkgIDExeDAgICAwICAgMSAgIDAJci93CXIvbwotICoJICAxMTExICAgMCAgIDEgICAxCXIvdwlyL3cKICAqLworCWFybXY2X210X3RhYmxlIGNwdV92NgorCiBFTlRSWShjcHVfdjZfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQotCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KLQotCWJpYwlyMywgcjEsICMweDAwMDAwM2YwCi0JYmljCXIzLCByMywgIzB4MDAwMDAwMDMKLQlvcnIJcjMsIHIzLCByMgotCW9ycglyMywgcjMsICNQVEVfRVhUX0FQMCB8IDIKLQotCXRzdAlyMSwgI0xfUFRFX1dSSVRFCi0JdHN0bmUJcjEsICNMX1BURV9ESVJUWQotCW9ycmVxCXIzLCByMywgI1BURV9FWFRfQVBYCi0KLQl0c3QJcjEsICNMX1BURV9VU0VSCi0Jb3JybmUJcjMsIHIzLCAjUFRFX0VYVF9BUDEKLQl0c3RuZQlyMywgI1BURV9FWFRfQVBYCi0JYmljbmUJcjMsIHIzLCAjUFRFX0VYVF9BUFggfCBQVEVfRVhUX0FQMAotCi0JdHN0CXIxLCAjTF9QVEVfWU9VTkcKLQliaWNlcQlyMywgcjMsICNQVEVfRVhUX0FQWCB8IFBURV9FWFRfQVBfTUFTSwotCi0JdHN0CXIxLCAjTF9QVEVfRVhFQwotCW9ycmVxCXIzLCByMywgI1BURV9FWFRfWE4KLQotCXRzdAlyMSwgI0xfUFRFX1BSRVNFTlQKLQltb3ZlcQlyMywgIzAKLQotCXN0cglyMywgW3IwXQotCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxIEAgZmx1c2hfcHRlCisJYXJtdjZfc2V0X3B0ZV9leHQgY3B1X3Y2CiAjZW5kaWYKIAltb3YJcGMsIGxyCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCBiNDlmOWE0Li4zNGU0MjQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCkBAIC0yNSw5ICsyNSwxMSBAQAogCiBFTlRSWShjcHVfdjdfcHJvY19pbml0KQogCW1vdglwYywgbHIKK0VORFBST0MoY3B1X3Y3X3Byb2NfaW5pdCkKIAogRU5UUlkoY3B1X3Y3X3Byb2NfZmluKQogCW1vdglwYywgbHIKK0VORFBST0MoY3B1X3Y3X3Byb2NfZmluKQogCiAvKgogICoJY3B1X3Y3X3Jlc2V0KGxvYykKQEAgLTQzLDYgKzQ1LDcgQEAKIAkuYWxpZ24JNQogRU5UUlkoY3B1X3Y3X3Jlc2V0KQogCW1vdglwYywgcjAKK0VORFBST0MoY3B1X3Y3X3Jlc2V0KQogCiAvKgogICoJY3B1X3Y3X2RvX2lkbGUoKQpAQCAtNTIsOCArNTUsOSBAQAogICoJSVJRcyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KICAqLwogRU5UUlkoY3B1X3Y3X2RvX2lkbGUpCi0JLmxvbmcJMHhlMzIwZjAwMwkJCUAgQVJNIFY3IFdGSSBpbnN0cnVjdGlvbgorCXdmaQogCW1vdglwYywgbHIKK0VORFBST0MoY3B1X3Y3X2RvX2lkbGUpCiAKIEVOVFJZKGNwdV92N19kY2FjaGVfY2xlYW5fYXJlYSkKICNpZm5kZWYgVExCX0NBTl9SRUFEX0ZST01fTDFfQ0FDSEUKQEAgLTY1LDYgKzY5LDcgQEAKIAlkc2IKICNlbmRpZgogCW1vdglwYywgbHIKK0VORFBST0MoY3B1X3Y3X2RjYWNoZV9jbGVhbl9hcmVhKQogCiAvKgogICoJY3B1X3Y3X3N3aXRjaF9tbShwZ2RfcGh5cywgdHNrKQpAQCAtODksNiArOTQsNyBAQAogCWlzYgogI2VuZGlmCiAJbW92CXBjLCBscgorRU5EUFJPQyhjcHVfdjdfc3dpdGNoX21tKQogCiAvKgogICoJY3B1X3Y3X3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSkKQEAgLTk5LDI2ICsxMDUsMTkgQEAKICAqCQkgIChoYXJkd2FyZSB2ZXJzaW9uIGlzIHN0b3JlZCBhdCAtMTAyNCBieXRlcykKICAqCS0gcHRlICAgLSBQVEUgdmFsdWUgdG8gc3RvcmUKICAqCS0gZXh0CS0gdmFsdWUgZm9yIGV4dGVuZGVkIFBURSBiaXRzCi0gKgotICoJUGVybWlzc2lvbnM6Ci0gKgkgIFlVV0QgIEFQWCBBUDEgQVAwCVNWQwlVc2VyCi0gKgkgIDB4eHggICAwICAgMCAgIDAJbm8gYWNjCW5vIGFjYwotICoJICAxMDB4ICAgMSAgIDAgICAxCXIvbwlubyBhY2MKLSAqCSAgMTB4MCAgIDEgICAwICAgMQlyL28Jbm8gYWNjCi0gKgkgIDEwMTEgICAwICAgMCAgIDEJci93CW5vIGFjYwotICoJICAxMTB4ICAgMCAgIDEgICAwCXIvdwlyL28KLSAqCSAgMTF4MCAgIDAgICAxICAgMAlyL3cJci9vCi0gKgkgIDExMTEgICAwICAgMSAgIDEJci93CXIvdwogICovCiBFTlRSWShjcHVfdjdfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIAogCWJpYwlyMywgcjEsICMweDAwMDAwM2YwCi0JYmljCXIzLCByMywgIzB4MDAwMDAwMDMKKwliaWMJcjMsIHIzLCAjUFRFX1RZUEVfTUFTSwogCW9ycglyMywgcjMsIHIyCiAJb3JyCXIzLCByMywgI1BURV9FWFRfQVAwIHwgMgogCisJdHN0CXIyLCAjMSA8PCA0CisJb3JybmUJcjMsIHIzLCAjUFRFX0VYVF9URVgoMSkKKwogCXRzdAlyMSwgI0xfUFRFX1dSSVRFCiAJdHN0bmUJcjEsICNMX1BURV9ESVJUWQogCW9ycmVxCXIzLCByMywgI1BURV9FWFRfQVBYCkBAIC0xMjgsMTkgKzEyNywxOCBAQAogCXRzdG5lCXIzLCAjUFRFX0VYVF9BUFgKIAliaWNuZQlyMywgcjMsICNQVEVfRVhUX0FQWCB8IFBURV9FWFRfQVAwCiAKLQl0c3QJcjEsICNMX1BURV9ZT1VORwotCWJpY2VxCXIzLCByMywgI1BURV9FWFRfQVBYIHwgUFRFX0VYVF9BUF9NQVNLCi0KIAl0c3QJcjEsICNMX1BURV9FWEVDCiAJb3JyZXEJcjMsIHIzLCAjUFRFX0VYVF9YTgogCi0JdHN0CXIxLCAjTF9QVEVfUFJFU0VOVAorCXRzdAlyMSwgI0xfUFRFX1lPVU5HCisJdHN0bmUJcjEsICNMX1BURV9QUkVTRU5UCiAJbW92ZXEJcjMsICMwCiAKIAlzdHIJcjMsIFtyMF0KIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgMQkJQCBmbHVzaF9wdGUKICNlbmRpZgogCW1vdglwYywgbHIKK0VORFBST0MoY3B1X3Y3X3NldF9wdGVfZXh0KQogCiBjcHVfdjdfbmFtZToKIAkuYXNjaWkJIkFSTXY3IFByb2Nlc3NvciIKQEAgLTE4MiwxMiArMTgwLDE3IEBACiAJbW92CXIxMCwgIzB4MWYJCQlAIGRvbWFpbnMgMCwgMSA9IG1hbmFnZXIKIAltY3IJcDE1LCAwLCByMTAsIGMzLCBjMCwgMAkJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgcmVnaXN0ZXIKICNlbmRpZgorCWxkcglyNSwgPTB4NDBlMDQwZTAKKwlsZHIJcjYsID0weGZmMGFhMWE4CisJbWNyCXAxNSwgMCwgcjUsIGMxMCwgYzIsIDAJCUAgd3JpdGUgUFJSUgorCW1jcglwMTUsIDAsIHI2LCBjMTAsIGMyLCAxCQlAIHdyaXRlIE5NUlIKIAlhZHIJcjUsIHY3X2NydmFsCiAJbGRtaWEJcjUsIHtyNSwgcjZ9CiAgICAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCByZWFkIGNvbnRyb2wgcmVnaXN0ZXIKIAliaWMJcjAsIHIwLCByNQkJCUAgY2xlYXIgYml0cyB0aGVtCiAJb3JyCXIwLCByMCwgcjYJCQlAIHNldCB0aGVtCiAJbW92CXBjLCBscgkJCQlAIHJldHVybiB0byBoZWFkLlM6X19yZXQKK0VORFBST0MoX192N19zZXR1cCkKIAogCS8qCiAJICogICAgICAgICBWIFggRiAgIEkgRCBMUgpAQCAtMTk3LDcgKzIwMCw3IEBACiAJICovCiAJLnR5cGUJdjdfY3J2YWwsICNvYmplY3QKIHY3X2NydmFsOgotCWNydmFsCWNsZWFyPTB4MDEyMGMzMDIsIG1tdXNldD0weDAwYzAzODdkLCB1Y3NldD0weDAwYzAxODdjCisJY3J2YWwJY2xlYXI9MHgwMTIwYzMwMiwgbW11c2V0PTB4MTBjMDM4N2QsIHVjc2V0PTB4MDBjMDE4N2MKIAogX192N19zZXR1cF9zdGFjazoKIAkuc3BhY2UJNCAqIDExCQkJCUAgMTEgcmVnaXN0ZXJzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCmluZGV4IDdiZDllNzEuLjA0ZGM4YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CkBAIC0zNDUsMzggKzM0NSwzOCBAQAogICogY3B1X3hzYzNfc2V0X3B0ZV9leHQocHRlcCwgcHRlLCBleHQpCiAgKgogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKLSAqCiAgKi8KK2NwdV94c2MzX210X3RhYmxlOgorCS5sb25nCTB4MDAJCQkJCQlAIExfUFRFX01UX1VOQ0FDSEVECisJLmxvbmcJUFRFX0VYVF9URVgoMSkJCQkJCUAgTF9QVEVfTVRfQlVGRkVSQUJMRQorCS5sb25nCVBURV9DQUNIRUFCTEUJCQkJCUAgTF9QVEVfTVRfV1JJVEVUSFJPVUdICisJLmxvbmcJUFRFX0NBQ0hFQUJMRSB8IFBURV9CVUZGRVJBQkxFCQkJQCBMX1BURV9NVF9XUklURUJBQ0sKKwkubG9uZwlQVEVfRVhUX1RFWCgxKSB8IFBURV9CVUZGRVJBQkxFCQkJQCBMX1BURV9NVF9ERVZfU0hBUkVECisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJMHgwMAkJCQkJCUAgTF9QVEVfTVRfTUlOSUNBQ0hFIChub3QgcHJlc2VudCkKKwkubG9uZwlQVEVfRVhUX1RFWCg1KSB8IFBURV9DQUNIRUFCTEUgfCBQVEVfQlVGRkVSQUJMRQlAIExfUFRFX01UX1dSSVRFQUxMT0MgKG5vdCBwcmVzZW50PykKKwkubG9uZwkweDAwCQkJCQkJQCB1bnVzZWQKKwkubG9uZwlQVEVfRVhUX1RFWCgxKQkJCQkJQCBMX1BURV9NVF9ERVZfV0MKKwkubG9uZwkweDAwCQkJCQkJQCB1bnVzZWQKKwkubG9uZwlQVEVfQ0FDSEVBQkxFIHwgUFRFX0JVRkZFUkFCTEUJCQlAIExfUFRFX01UX0RFVl9DQUNIRUQKKwkubG9uZwlQVEVfRVhUX1RFWCgyKQkJCQkJQCBMX1BURV9NVF9ERVZfTk9OU0hBUkVECisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisKIAkuYWxpZ24JNQogRU5UUlkoY3B1X3hzYzNfc2V0X3B0ZV9leHQpCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgorCXhzY2FsZV9zZXRfcHRlX2V4dF9wcm9sb2d1ZQogCi0JYmljCXIyLCByMSwgIzB4ZmYwCQkJQCBrZWVwIEMsIEIgYml0cwotCW9ycglyMiwgcjIsICNQVEVfVFlQRV9FWFQJCUAgZXh0ZW5kZWQgcGFnZQogCXRzdAlyMSwgI0xfUFRFX1NIQVJFRAkJQCBzaGFyZWQ/Ci0Jb3JybmUJcjIsIHIyLCAjMHgyMDAKKwlhbmQJcjEsIHIxLCAjTF9QVEVfTVRfTUFTSworCWFkcglpcCwgY3B1X3hzYzNfbXRfdGFibGUKKwlsZHIJaXAsIFtpcCwgcjFdCisJb3JybmUJcjIsIHIyLCAjUFRFX0VYVF9DT0hFUkVOVAlAIGludGVybG9jazogbWFzayBpbiBjb2hlcmVudCBiaXQKKwliaWMJcjIsIHIyLCAjMHgwYwkJCUAgY2xlYXIgb2xkIEMsQiBiaXRzCisJb3JyCXIyLCByMiwgaXAKIAotCWVvcglyMywgcjEsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfCBMX1BURV9XUklURSB8IExfUFRFX0RJUlRZCi0KLQl0c3QJcjMsICNMX1BURV9VU0VSCQkJQCB1c2VyPwotCW9ycm5lCXIyLCByMiwgI1BURV9FWFRfQVBfVVJPX1NSVwlAIHllcyAtPiB1c2VyIHIvbywgc3lzdGVtIHIvdwotCi0JdHN0CXIzLCAjTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQlAIHdyaXRlIGFuZCBkaXJ0eT8KLQlvcnJlcQlyMiwgcjIsICNQVEVfRVhUX0FQX1VOT19TUlcJQCB5ZXMgLT4gdXNlciBuL2EsIHN5c3RlbSByL3cKLQkJCQkJCUAgY29tYmluZWQgd2l0aCB1c2VyIC0+IHVzZXIgci93Ci0KLQlAIElmIGl0J3MgY2FjaGVhYmxlLCBpdCBuZWVkcyB0byBiZSBpbiBMMiBhbHNvLgotCWVvcglpcCwgcjEsICNMX1BURV9DQUNIRUFCTEUKLQl0c3QJaXAsICNMX1BURV9DQUNIRUFCTEUKLQlvcnJlcQlyMiwgcjIsICNQVEVfRVhUX1RFWCgweDUpCi0KLQl0c3QJcjMsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBwcmVzZW50IGFuZCB5b3VuZz8KLQltb3ZuZQlyMiwgIzAJCQkJQCBubyAtPiBmYXVsdAotCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCi0JbW92CWlwLCAjMAotCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGNsZWFuIEwxIEQgbGluZQotCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIGRhdGEgd3JpdGUgYmFycmllcgorCXhzY2FsZV9zZXRfcHRlX2V4dF9lcGlsb2d1ZQogCW1vdglwYywgbHIKIAogCS5sdG9yZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKaW5kZXggMmRkODUyNy4uMGNjZTM3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9od2NhcC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDA2LDggKzQwNiw2IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnZVRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFBURV9DQUNIRV9XUklURV9BTExPQ0FURSAwCi0KIC8qCiAgKiBjcHVfeHNjYWxlX3N3aXRjaF9tbShwZ2QpCiAgKgpAQCAtNDMxLDU2ICs0MjksNDIgQEAKICAqCiAgKiBFcnJhdGEgNDA6IG11c3Qgc2V0IG1lbW9yeSB0byB3cml0ZS10aHJvdWdoIGZvciB1c2VyIHJlYWQtb25seSBwYWdlcy4KICAqLworY3B1X3hzY2FsZV9tdF90YWJsZToKKwkubG9uZwkweDAwCQkJCQkJQCBMX1BURV9NVF9VTkNBQ0hFRAorCS5sb25nCVBURV9CVUZGRVJBQkxFCQkJCQlAIExfUFRFX01UX0JVRkZFUkFCTEUKKwkubG9uZwlQVEVfQ0FDSEVBQkxFCQkJCQlAIExfUFRFX01UX1dSSVRFVEhST1VHSAorCS5sb25nCVBURV9DQUNIRUFCTEUgfCBQVEVfQlVGRkVSQUJMRQkJCUAgTF9QVEVfTVRfV1JJVEVCQUNLCisJLmxvbmcJUFRFX0VYVF9URVgoMSkgfCBQVEVfQlVGRkVSQUJMRQkJCUAgTF9QVEVfTVRfREVWX1NIQVJFRAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCVBURV9FWFRfVEVYKDEpIHwgUFRFX0NBQ0hFQUJMRQkJCUAgTF9QVEVfTVRfTUlOSUNBQ0hFCisJLmxvbmcJUFRFX0VYVF9URVgoMSkgfCBQVEVfQ0FDSEVBQkxFIHwgUFRFX0JVRkZFUkFCTEUJQCBMX1BURV9NVF9XUklURUFMTE9DCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJUFRFX0JVRkZFUkFCTEUJCQkJCUAgTF9QVEVfTVRfREVWX1dDCisJLmxvbmcJMHgwMAkJCQkJCUAgdW51c2VkCisJLmxvbmcJUFRFX0NBQ0hFQUJMRSB8IFBURV9CVUZGRVJBQkxFCQkJQCBMX1BURV9NVF9ERVZfQ0FDSEVECisJLmxvbmcJMHgwMAkJCQkJCUAgTF9QVEVfTVRfREVWX05PTlNIQVJFRAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCS5sb25nCTB4MDAJCQkJCQlAIHVudXNlZAorCiAJLmFsaWduCTUKIEVOVFJZKGNwdV94c2NhbGVfc2V0X3B0ZV9leHQpCi0Jc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgotCi0JYmljCXIyLCByMSwgIzB4ZmYwCi0Jb3JyCXIyLCByMiwgI1BURV9UWVBFX0VYVAkJQCBleHRlbmRlZCBwYWdlCi0KLQllb3IJcjMsIHIxLCAjTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfV1JJVEUgfCBMX1BURV9ESVJUWQotCi0JdHN0CXIzLCAjTF9QVEVfVVNFUgkJCUAgVXNlcj8KLQlvcnJuZQlyMiwgcjIsICNQVEVfRVhUX0FQX1VST19TUlcJQCB5ZXMgLT4gdXNlciByL28sIHN5c3RlbSByL3cKLQotCXRzdAlyMywgI0xfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkJQCBXcml0ZSBhbmQgRGlydHk/Ci0Jb3JyZXEJcjIsIHIyLCAjUFRFX0VYVF9BUF9VTk9fU1JXCUAgeWVzIC0+IHVzZXIgbi9hLCBzeXN0ZW0gci93Ci0JCQkJCQlAIGNvbWJpbmVkIHdpdGggdXNlciAtPiB1c2VyIHIvdworCXhzY2FsZV9zZXRfcHRlX2V4dF9wcm9sb2d1ZQogCiAJQAotCUAgSGFuZGxlIHRoZSBYIGJpdC4gIFdlIHdhbnQgdG8gc2V0IHRoaXMgYml0IGZvciB0aGUgbWluaWNhY2hlCi0JQCAoVSA9IEUgPSBCID0gVyA9IDAsIEMgPSAxKSBvciB3aGVuIHdyaXRlIGFsbG9jYXRlIGlzIGVuYWJsZWQsCi0JQCBhbmQgd2UgaGF2ZSBhIHdyaXRlYWJsZSwgY2FjaGVhYmxlIHJlZ2lvbi4gIElmIHdlIGlnbm9yZSB0aGUKLQlAIFUgYW5kIEUgYml0cywgd2UgY2FuIGFsbG93IHVzZXIgc3BhY2UgdG8gdXNlIHRoZSBtaW5pY2FjaGUgYXMKLQlAIHdlbGwuCisJQCBFcnJhdHVtIDQwOiBtdXN0IHNldCBtZW1vcnkgdG8gd3JpdGUtdGhyb3VnaCBmb3IgdXNlciByZWFkLW9ubHkgcGFnZXMKIAlACi0JQCAgWCA9IChDICYgflcgJiB+QikgfCAoQyAmIFcgJiBCICYgd3JpdGVfYWxsb2NhdGUpCi0JQAotCWVvcglpcCwgcjEsICNMX1BURV9DQUNIRUFCTEUKLQl0c3QJaXAsICNMX1BURV9DQUNIRUFCTEUgfCBMX1BURV9XUklURSB8IExfUFRFX0JVRkZFUkFCTEUKLSNpZiBQVEVfQ0FDSEVfV1JJVEVfQUxMT0NBVEUKLQllb3JuZQlpcCwgcjEsICNMX1BURV9DQUNIRUFCTEUgfCBMX1BURV9XUklURSB8IExfUFRFX0JVRkZFUkFCTEUKLQl0c3RuZQlpcCwgI0xfUFRFX0NBQ0hFQUJMRSB8IExfUFRFX1dSSVRFIHwgTF9QVEVfQlVGRkVSQUJMRQotI2VuZGlmCi0Jb3JyZXEJcjIsIHIyLCAjUFRFX0VYVF9URVgoMSkKKwlhbmQJaXAsIHIxLCAjKExfUFRFX01UX01BU0sgfCBMX1BURV9VU0VSIHwgTF9QVEVfV1JJVEUpICYgfig0IDw8IDIpCisJdGVxCWlwLCAjTF9QVEVfTVRfV1JJVEVCQUNLIHwgTF9QVEVfVVNFUgogCi0JQAotCUAgRXJyYXR1bSA0MDogVGhlIEIgYml0IG11c3QgYmUgY2xlYXJlZCBmb3IgYSB1c2VyIHJlYWQtb25seQotCUAgY2FjaGVhYmxlIHBhZ2UuCi0JQAotCUAgIEIgPSBCICYgfihVICYgQyAmIH5XKQotCUAKLQlhbmQJaXAsIHIxLCAjTF9QVEVfVVNFUiB8IExfUFRFX1dSSVRFIHwgTF9QVEVfQ0FDSEVBQkxFCi0JdGVxCWlwLCAjTF9QVEVfVVNFUiB8IExfUFRFX0NBQ0hFQUJMRQotCWJpY2VxCXIyLCByMiwgI1BURV9CVUZGRVJBQkxFCisJbW92ZXEJcjEsICNMX1BURV9NVF9XUklURVRIUk9VR0gKKwlhbmQJcjEsIHIxLCAjTF9QVEVfTVRfTUFTSworCWFkcglpcCwgY3B1X3hzY2FsZV9tdF90YWJsZQorCWxkcglpcCwgW2lwLCByMV0KKwliaWMJcjIsIHIyLCAjMHgwYworCW9ycglyMiwgcjIsIGlwCiAKLQl0c3QJcjMsICNMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcJQCBQcmVzZW50IGFuZCBZb3VuZz8KLQltb3ZuZQlyMiwgIzAJCQkJQCBubyAtPiBmYXVsdAotCi0Jc3RyCXIyLCBbcjBdCQkJQCBoYXJkd2FyZSB2ZXJzaW9uCi0JbW92CWlwLCAjMAotCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIENsZWFuIEQgY2FjaGUgbGluZQotCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIERyYWluIFdyaXRlICgmIEZpbGwpIEJ1ZmZlcgorCXhzY2FsZV9zZXRfcHRlX2V4dF9lcGlsb2d1ZQogCW1vdglwYywgbHIKIAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS90bGItdjcuUyBiL2FyY2gvYXJtL21tL3RsYi12Ny5TCmluZGV4IGI1NmRkYTguLjI0YmE1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3RsYi12Ny5TCisrKyBiL2FyY2gvYXJtL21tL3RsYi12Ny5TCkBAIC01MSw2ICs1MSw3IEBACiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgNgkJQCBmbHVzaCBCVEFDL0JUQgogCWRzYgogCW1vdglwYywgbHIKK0VORFBST0Modjd3YmlfZmx1c2hfdXNlcl90bGJfcmFuZ2UpCiAKIC8qCiAgKgl2N3diaV9mbHVzaF9rZXJuX3RsYl9yYW5nZShzdGFydCxlbmQpCkBAIC03Nyw2ICs3OCw3IEBACiAJZHNiCiAJaXNiCiAJbW92CXBjLCBscgorRU5EUFJPQyh2N3diaV9mbHVzaF9rZXJuX3RsYl9yYW5nZSkKIAogCS5zZWN0aW9uICIudGV4dC5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2ZwYTExX2NwZHQuYyBiL2FyY2gvYXJtL253ZnBlL2ZwYTExX2NwZHQuYwppbmRleCA3OWY4ZTY3Li5kMzFjNDlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ud2ZwZS9mcGExMV9jcGR0LmMKKysrIGIvYXJjaC9hcm0vbndmcGUvZnBhMTFfY3BkdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAiZnBtb2R1bGUuaCIKICNpbmNsdWRlICJmcG1vZHVsZS5pbmwiCiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGxvYWRTaW5nbGUoY29uc3QgdW5zaWduZWQgaW50IEZuLCBjb25zdCB1bnNpZ25lZCBpbnQgX191c2VyICpwTWVtKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCBlNjFkMGNjLi44OGUzMWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMTEsMyArMTEsNCBAQAogb3Byb2ZpbGUtJChDT05GSUdfT1BST0ZJTEVfQVJNMTFfQ09SRSkJKz0gb3BfbW9kZWxfYXJtMTFfY29yZS5vCiBvcHJvZmlsZS0kKENPTkZJR19PUFJPRklMRV9BUk1WNikJKz0gb3BfbW9kZWxfdjYubwogb3Byb2ZpbGUtJChDT05GSUdfT1BST0ZJTEVfTVBDT1JFKQkrPSBvcF9tb2RlbF9tcGNvcmUubworb3Byb2ZpbGUtJChDT05GSUdfT1BST0ZJTEVfQVJNVjcpCSs9IG9wX21vZGVsX3Y3Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvYmFja3RyYWNlLmMKaW5kZXggZjVlYmYzMC4uY2VmYzIxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvYmFja3RyYWNlLmMKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvYmFja3RyYWNlLmMKQEAgLTE2LDggKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICIuLi9rZXJuZWwvc3RhY2t0cmFjZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDBhNWNmM2EuLjNmY2Q3NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCkBAIC0xNDUsNiArMTQ1LDEwIEBACiAJc3BlYyA9ICZvcF9tcGNvcmVfc3BlYzsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0FSTVY3CisJc3BlYyA9ICZvcF9hcm12N19zcGVjOworI2VuZGlmCisKIAlpZiAoc3BlYykgewogCQlyZXQgPSBzcGVjLT5pbml0KCk7CiAJCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmggYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9hcm1fbW9kZWwuaAppbmRleCA0ODk5YzYyLi44YzRlNGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9hcm1fbW9kZWwuaAorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9hcm1fbW9kZWwuaApAQCAtMjYsNiArMjYsNyBAQAogCiBleHRlcm4gc3RydWN0IG9wX2FybV9tb2RlbF9zcGVjIG9wX2FybXY2X3NwZWM7CiBleHRlcm4gc3RydWN0IG9wX2FybV9tb2RlbF9zcGVjIG9wX21wY29yZV9zcGVjOworZXh0ZXJuIHN0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyBvcF9hcm12N19zcGVjOwogCiBleHRlcm4gdm9pZCBhcm1fYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfbXBjb3JlLmMgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF9tcGNvcmUuYwppbmRleCA5MmRiNmUwLi40ZGUzNjZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF9tcGNvcmUuYworKysgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF9tcGNvcmUuYwpAQCAtMzYsOCArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF92Ny5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfdjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjAyOTVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfdjcuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoqCisgKiBvcF9tb2RlbF92Ny5jCisgKiBBUk0gVjcgKENvcnRleCBBOCkgRXZlbnQgTW9uaXRvciBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBKZWFuIFBpaGV0IDxqcGloZXRAbXZpc3RhLmNvbT4KKyAqIENvcHlyaWdodCAyMDA0IEFSTSBTTVAgRGV2ZWxvcG1lbnQgVGVhbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKKyNpbmNsdWRlICJvcF9hcm1fbW9kZWwuaCIKKyNpbmNsdWRlICJvcF9tb2RlbF92Ny5oIgorCisvKiAjZGVmaW5lIERFQlVHICovCisKKworLyoKKyAqIEFSTSBWNyBQTU5DIHN1cHBvcnQKKyAqLworCitzdGF0aWMgdTMyIGNudF9lbltDTlRNQVhdOworCitzdGF0aWMgaW5saW5lIHZvaWQgYXJtdjdfcG1uY193cml0ZSh1MzIgdmFsKQoreworCXZhbCAmPSBQTU5DX01BU0s7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMCIgOiA6ICJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFybXY3X3BtbmNfcmVhZCh2b2lkKQoreworCXUzMiB2YWw7CisKKwlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEyLCAwIiA6ICI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFybXY3X3BtbmNfZW5hYmxlX2NvdW50ZXIodW5zaWduZWQgaW50IGNudCkKK3sKKwl1MzIgdmFsOworCisJaWYgKGNudCA+PSBDTlRNQVgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcHJvZmlsZTogQ1BVJXUgZW5hYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgorCQkJIiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNudCA9PSBDQ05UKQorCQl2YWwgPSBDTlRFTlNfQzsKKwllbHNlCisJCXZhbCA9ICgxIDw8IChjbnQgLSBDTlQwKSk7CisKKwl2YWwgJj0gQ05URU5TX01BU0s7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMSIgOiA6ICJyIiAodmFsKSk7CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2Rpc2FibGVfY291bnRlcih1bnNpZ25lZCBpbnQgY250KQoreworCXUzMiB2YWw7CisKKwlpZiAoY250ID49IENOVE1BWCkgeworCQlwcmludGsoS0VSTl9FUlIgIm9wcm9maWxlOiBDUFUldSBkaXNhYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgorCQkJIiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNudCA9PSBDQ05UKQorCQl2YWwgPSBDTlRFTkNfQzsKKwllbHNlCisJCXZhbCA9ICgxIDw8IChjbnQgLSBDTlQwKSk7CisKKwl2YWwgJj0gQ05URU5DX01BU0s7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMiIgOiA6ICJyIiAodmFsKSk7CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2VuYWJsZV9pbnRlbnModW5zaWduZWQgaW50IGNudCkKK3sKKwl1MzIgdmFsOworCisJaWYgKGNudCA+PSBDTlRNQVgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcHJvZmlsZTogQ1BVJXUgZW5hYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgorCQkJIiBpbnRlcnJ1cHQgZW5hYmxlICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGNudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY250ID09IENDTlQpCisJCXZhbCA9IElOVEVOU19DOworCWVsc2UKKwkJdmFsID0gKDEgPDwgKGNudCAtIENOVDApKTsKKworCXZhbCAmPSBJTlRFTlNfTUFTSzsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE0LCAxIiA6IDogInIiICh2YWwpKTsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFybXY3X3BtbmNfZ2V0cmVzZXRfZmxhZ3Modm9pZCkKK3sKKwl1MzIgdmFsOworCisJLyogUmVhZCAqLworCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDMiIDogIj1yIiAodmFsKSk7CisKKwkvKiBXcml0ZSB0byBjbGVhciBmbGFncyAqLworCXZhbCAmPSBGTEFHX01BU0s7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMyIgOiA6ICJyIiAodmFsKSk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKHVuc2lnbmVkIGludCBjbnQpCit7CisJdTMyIHZhbDsKKworCWlmICgoY250ID09IENDTlQpIHx8IChjbnQgPj0gQ05UTUFYKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9wcm9maWxlOiBDUFUldSBzZWxlY3Rpbmcgd3JvbmcgUE1OQyBjb3VudGVyaSIKKwkJCSIgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgY250KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9IChjbnQgLSBDTlQwKSAmIFNFTEVDVF9NQVNLOworCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTIsIDUiIDogOiAiciIgKHZhbCkpOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKHVuc2lnbmVkIGludCBjbnQsIHUzMiB2YWwpCit7CisJaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoY250KSA9PSBjbnQpIHsKKwkJdmFsICY9IEVWVFNFTF9NQVNLOworCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEzLCAxIiA6IDogInIiICh2YWwpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFybXY3X3BtbmNfcmVzZXRfY291bnRlcih1bnNpZ25lZCBpbnQgY250KQoreworCXUzMiBjcHVfY250ID0gQ1BVX0NPVU5URVIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjbnQpOworCXUzMiB2YWwgPSAtKHUzMiljb3VudGVyX2NvbmZpZ1tjcHVfY250XS5jb3VudDsKKworCXN3aXRjaCAoY250KSB7CisJY2FzZSBDQ05UOgorCQlhcm12N19wbW5jX2Rpc2FibGVfY291bnRlcihjbnQpOworCisJCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogOiAiciIgKHZhbCkpOworCisJCWlmIChjbnRfZW5bY250XSAhPSAwKQorCQkgICAgYXJtdjdfcG1uY19lbmFibGVfY291bnRlcihjbnQpOworCisJCWJyZWFrOworCisJY2FzZSBDTlQwOgorCWNhc2UgQ05UMToKKwljYXNlIENOVDI6CisJY2FzZSBDTlQzOgorCQlhcm12N19wbW5jX2Rpc2FibGVfY291bnRlcihjbnQpOworCisJCWlmIChhcm12N19wbW5jX3NlbGVjdF9jb3VudGVyKGNudCkgPT0gY250KQorCQkgICAgYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIgOiA6ICJyIiAodmFsKSk7CisKKwkJaWYgKGNudF9lbltjbnRdICE9IDApCisJCSAgICBhcm12N19wbW5jX2VuYWJsZV9jb3VudGVyKGNudCk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm9wcm9maWxlOiBDUFUldSByZXNldHRpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgorCQkJIiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjbnQpOworCQlicmVhazsKKwl9Cit9CisKK2ludCBhcm12N19zZXR1cF9wbW5jKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNudDsKKworCWlmIChhcm12N19wbW5jX3JlYWQoKSAmIFBNTkNfRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9wcm9maWxlOiBDUFUldSBQTU5DIHN0aWxsIGVuYWJsZWQgd2hlbiBzZXR1cCIKKwkJCSIgbmV3IGV2ZW50IGNvdW50ZXIuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSAmIFJlc2V0IFBNTkM6IEMgYml0LCBEIGJpdCBhbmQgUCBiaXQuCisJICogIE5vdGU6IFVzaW5nIGEgc2xvd2VyIGNvdW50IGZvciBDQ05UIChEIGJpdDogZGl2aWRlIGJ5IDY0KSByZXN1bHRzCisJICogICBpbiBhIG1vcmUgc3RhYmxlIHN5c3RlbQorCSAqLworCWFybXY3X3BtbmNfd3JpdGUoUE1OQ19QIHwgUE1OQ19DIHwgUE1OQ19EKTsKKworCisJZm9yIChjbnQgPSBDQ05UOyBjbnQgPCBDTlRNQVg7IGNudCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CisJCXUzMiBjcHVfY250ID0gQ1BVX0NPVU5URVIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjbnQpOworCisJCS8qCisJCSAqIERpc2FibGUgY291bnRlcgorCQkgKi8KKwkJYXJtdjdfcG1uY19kaXNhYmxlX2NvdW50ZXIoY250KTsKKwkJY250X2VuW2NudF0gPSAwOworCisJCWlmICghY291bnRlcl9jb25maWdbY3B1X2NudF0uZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCWV2ZW50ID0gY291bnRlcl9jb25maWdbY3B1X2NudF0uZXZlbnQgJiAyNTU7CisKKwkJLyoKKwkJICogU2V0IGV2ZW50IChpZiBkZXN0aW5lZCBmb3IgUE1OeCBjb3VudGVycykKKwkJICogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIGV2ZW50IGlmIGl0J3MgYSBjeWNsZSBjb3VudAorCQkgKi8KKwkJaWYgKGNudCAhPSBDQ05UKQorCQkJYXJtdjdfcG1uY193cml0ZV9ldnRzZWwoY250LCBldmVudCk7CisKKwkJLyoKKwkJICogRW5hYmxlIGludGVycnVwdCBmb3IgdGhpcyBjb3VudGVyCisJCSAqLworCQlhcm12N19wbW5jX2VuYWJsZV9pbnRlbnMoY250KTsKKworCQkvKgorCQkgKiBSZXNldCBjb3VudGVyCisJCSAqLworCQlhcm12N19wbW5jX3Jlc2V0X2NvdW50ZXIoY250KTsKKworCQkvKgorCQkgKiBFbmFibGUgY291bnRlcgorCQkgKi8KKwkJYXJtdjdfcG1uY19lbmFibGVfY291bnRlcihjbnQpOworCQljbnRfZW5bY250XSA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm12N19zdGFydF9wbW5jKHZvaWQpCit7CisJYXJtdjdfcG1uY193cml0ZShhcm12N19wbW5jX3JlYWQoKSB8IFBNTkNfRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm12N19zdG9wX3BtbmModm9pZCkKK3sKKwlhcm12N19wbW5jX3dyaXRlKGFybXY3X3BtbmNfcmVhZCgpICYgflBNTkNfRSk7Cit9CisKKy8qCisgKiBDUFUgY291bnRlcnMnIElSUSBoYW5kbGVyIChvbmUgSVJRIHBlciBDUFUpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm12N19wbW5jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwl1bnNpZ25lZCBpbnQgY250OworCXUzMiBmbGFnczsKKworCisJLyoKKwkgKiBTdG9wIElSUSBnZW5lcmF0aW9uCisJICovCisJYXJtdjdfc3RvcF9wbW5jKCk7CisKKwkvKgorCSAqIEdldCBhbmQgcmVzZXQgb3ZlcmZsb3cgc3RhdHVzIGZsYWdzCisJICovCisJZmxhZ3MgPSBhcm12N19wbW5jX2dldHJlc2V0X2ZsYWdzKCk7CisKKwkvKgorCSAqIEN5Y2xlIGNvdW50ZXIKKwkgKi8KKwlpZiAoZmxhZ3MgJiBGTEFHX0MpIHsKKwkJdTMyIGNwdV9jbnQgPSBDUFVfQ09VTlRFUihzbXBfcHJvY2Vzc29yX2lkKCksIENDTlQpOworCQlhcm12N19wbW5jX3Jlc2V0X2NvdW50ZXIoQ0NOVCk7CisJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgY3B1X2NudCk7CisJfQorCisJLyoKKwkgKiBQTU5DIGNvdW50ZXJzIDA6MworCSAqLworCWZvciAoY250ID0gQ05UMDsgY250IDwgQ05UTUFYOyBjbnQrKykgeworCQlpZiAoZmxhZ3MgJiAoMSA8PCAoY250IC0gQ05UMCkpKSB7CisJCQl1MzIgY3B1X2NudCA9IENQVV9DT1VOVEVSKHNtcF9wcm9jZXNzb3JfaWQoKSwgY250KTsKKwkJCWFybXY3X3BtbmNfcmVzZXRfY291bnRlcihjbnQpOworCQkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCBjcHVfY250KTsKKwkJfQorCX0KKworCS8qCisJICogQWxsb3cgSVJRIGdlbmVyYXRpb24KKwkgKi8KKwlhcm12N19zdGFydF9wbW5jKCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBhcm12N19yZXF1ZXN0X2ludGVycnVwdHMoaW50ICppcnFzLCBpbnQgbnIpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpcnFzW2ldLCBhcm12N19wbW5jX2ludGVycnVwdCwKKwkJCQlJUlFGX0RJU0FCTEVELCAiQ1AxNSBQTU5DIiwgTlVMTCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJvcHJvZmlsZTogdW5hYmxlIHRvIHJlcXVlc3QgSVJRJXUiCisJCQkJIiBmb3IgQVJNdjdcbiIsCisJCQkgICAgICAgaXJxc1tpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IG5yKQorCQl3aGlsZSAoaS0tICE9IDApCisJCQlmcmVlX2lycShpcnFzW2ldLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXJtdjdfcmVsZWFzZV9pbnRlcnJ1cHRzKGludCAqaXJxcywgaW50IG5yKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCWZyZWVfaXJxKGlycXNbaV0sIE5VTEwpOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGFybXY3X3BtbmNfZHVtcF9yZWdzKHZvaWQpCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBpbnQgY250OworCisJcHJpbnRrKEtFUk5fSU5GTyAiUE1OQyByZWdpc3RlcnMgZHVtcDpcbiIpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMiwgMCIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJQTU5DICA9MHglMDh4XG4iLCB2YWwpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMiwgMSIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJDTlRFTlM9MHglMDh4XG4iLCB2YWwpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxNCwgMSIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJJTlRFTlM9MHglMDh4XG4iLCB2YWwpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMiwgMyIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJGTEFHUyA9MHglMDh4XG4iLCB2YWwpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMiwgNSIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJTRUxFQ1Q9MHglMDh4XG4iLCB2YWwpOworCisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiAiPXIiICh2YWwpKTsKKwlwcmludGsoS0VSTl9JTkZPICJDQ05UICA9MHglMDh4XG4iLCB2YWwpOworCisJZm9yIChjbnQgPSBDTlQwOyBjbnQgPCBDTlRNQVg7IGNudCsrKSB7CisJCWFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoY250KTsKKwkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIgOiAiPXIiICh2YWwpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ05UWyVkXSBjb3VudCA9MHglMDh4XG4iLCBjbnQtQ05UMCwgdmFsKTsKKwkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMSIgOiAiPXIiICh2YWwpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ05UWyVkXSBldnRzZWw9MHglMDh4XG4iLCBjbnQtQ05UMCwgdmFsKTsKKwl9Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IGlycXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworCUlOVF8zNFhYX0JFTkNIX01QVV9FTVVMLAorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBhcm12N19wbW5jX3N0b3Aodm9pZCkKK3sKKyNpZmRlZiBERUJVRworCWFybXY3X3BtbmNfZHVtcF9yZWdzKCk7CisjZW5kaWYKKwlhcm12N19zdG9wX3BtbmMoKTsKKwlhcm12N19yZWxlYXNlX2ludGVycnVwdHMoaXJxcywgQVJSQVlfU0laRShpcnFzKSk7Cit9CisKK3N0YXRpYyBpbnQgYXJtdjdfcG1uY19zdGFydCh2b2lkKQoreworCWludCByZXQ7CisKKyNpZmRlZiBERUJVRworCWFybXY3X3BtbmNfZHVtcF9yZWdzKCk7CisjZW5kaWYKKwlyZXQgPSBhcm12N19yZXF1ZXN0X2ludGVycnVwdHMoaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CisJaWYgKHJldCA+PSAwKQorCQlhcm12N19zdGFydF9wbW5jKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFybXY3X2RldGVjdF9wbW5jKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyBvcF9hcm12N19zcGVjID0geworCS5pbml0CQk9IGFybXY3X2RldGVjdF9wbW5jLAorCS5udW1fY291bnRlcnMJPSA1LAorCS5zZXR1cF9jdHJzCT0gYXJtdjdfc2V0dXBfcG1uYywKKwkuc3RhcnQJCT0gYXJtdjdfcG1uY19zdGFydCwKKwkuc3RvcAkJPSBhcm12N19wbW5jX3N0b3AsCisJLm5hbWUJCT0gImFybS9hcm12NyIsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfbW9kZWxfdjcuaCBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3Y3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxOWJjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3Y3LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorICogb3BfbW9kZWxfdjcuaAorICogQVJNIHY3IChDb3J0ZXggQTgpIEV2ZW50IE1vbml0b3IgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDggSmVhbiBQaWhldCA8anBpaGV0QG12aXN0YS5jb20+CisgKiBDb3B5cmlnaHQgMjAwNCBBUk0gU01QIERldmVsb3BtZW50IFRlYW0KKyAqIENvcHlyaWdodCAyMDAwLTIwMDQgRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBtdmlzdGEuY29tPgorICogQ29weXJpZ2h0IDIwMDAtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYworICogQ29weXJpZ2h0IDIwMDQgRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDQgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBhcm0ubGludXgub3JnLnVrPgorICogQ29weXJpZ2h0IDIwMDQgT3Byb2ZpbGUgQXV0aG9ycworICoKKyAqIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgT1BfTU9ERUxfVjdfSAorI2RlZmluZSBPUF9NT0RFTF9WN19ICisKKy8qCisgKiBQZXItQ1BVIFBNTkM6IGNvbmZpZyByZWcKKyAqLworI2RlZmluZSBQTU5DX0UJCSgxIDw8IDApCS8qIEVuYWJsZSBhbGwgY291bnRlcnMgKi8KKyNkZWZpbmUgUE1OQ19QCQkoMSA8PCAxKQkvKiBSZXNldCBhbGwgY291bnRlcnMgKi8KKyNkZWZpbmUgUE1OQ19DCQkoMSA8PCAyKQkvKiBDeWNsZSBjb3VudGVyIHJlc2V0ICovCisjZGVmaW5lIFBNTkNfRAkJKDEgPDwgMykJLyogQ0NOVCBjb3VudHMgZXZlcnkgNjR0aCBjcHUgY3ljbGUgKi8KKyNkZWZpbmUgUE1OQ19YCQkoMSA8PCA0KQkvKiBFeHBvcnQgdG8gRVRNICovCisjZGVmaW5lIFBNTkNfRFAJCSgxIDw8IDUpCS8qIERpc2FibGUgQ0NOVCBpZiBub24taW52YXNpdmUgZGVidWcqLworI2RlZmluZQlQTU5DX01BU0sJMHgzZgkJLyogTWFzayBmb3Igd3JpdGFibGUgYml0cyAqLworCisvKgorICogQXZhaWxhYmxlIGNvdW50ZXJzCisgKi8KKyNkZWZpbmUgQ0NOVCAJCTAKKyNkZWZpbmUgQ05UMCAJCTEKKyNkZWZpbmUgQ05UMSAJCTIKKyNkZWZpbmUgQ05UMiAJCTMKKyNkZWZpbmUgQ05UMyAJCTQKKyNkZWZpbmUgQ05UTUFYIAkJNQorCisjZGVmaW5lIENQVV9DT1VOVEVSKGNwdSwgY291bnRlcikJKChjcHUpICogQ05UTUFYICsgKGNvdW50ZXIpKQorCisvKgorICogQ05URU5TOiBjb3VudGVycyBlbmFibGUgcmVnCisgKi8KKyNkZWZpbmUgQ05URU5TX1AwCSgxIDw8IDApCisjZGVmaW5lIENOVEVOU19QMQkoMSA8PCAxKQorI2RlZmluZSBDTlRFTlNfUDIJKDEgPDwgMikKKyNkZWZpbmUgQ05URU5TX1AzCSgxIDw8IDMpCisjZGVmaW5lIENOVEVOU19DCSgxIDw8IDMxKQorI2RlZmluZQlDTlRFTlNfTUFTSwkweDgwMDAwMDBmCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KKworLyoKKyAqIENOVEVOQzogY291bnRlcnMgZGlzYWJsZSByZWcKKyAqLworI2RlZmluZSBDTlRFTkNfUDAJKDEgPDwgMCkKKyNkZWZpbmUgQ05URU5DX1AxCSgxIDw8IDEpCisjZGVmaW5lIENOVEVOQ19QMgkoMSA8PCAyKQorI2RlZmluZSBDTlRFTkNfUDMJKDEgPDwgMykKKyNkZWZpbmUgQ05URU5DX0MJKDEgPDwgMzEpCisjZGVmaW5lCUNOVEVOQ19NQVNLCTB4ODAwMDAwMGYJLyogTWFzayBmb3Igd3JpdGFibGUgYml0cyAqLworCisvKgorICogSU5URU5TOiBjb3VudGVycyBvdmVyZmxvdyBpbnRlcnJ1cHQgZW5hYmxlIHJlZworICovCisjZGVmaW5lIElOVEVOU19QMAkoMSA8PCAwKQorI2RlZmluZSBJTlRFTlNfUDEJKDEgPDwgMSkKKyNkZWZpbmUgSU5URU5TX1AyCSgxIDw8IDIpCisjZGVmaW5lIElOVEVOU19QMwkoMSA8PCAzKQorI2RlZmluZSBJTlRFTlNfQwkoMSA8PCAzMSkKKyNkZWZpbmUJSU5URU5TX01BU0sJMHg4MDAwMDAwZgkvKiBNYXNrIGZvciB3cml0YWJsZSBiaXRzICovCisKKy8qCisgKiBFVlRTRUw6IEV2ZW50IHNlbGVjdGlvbiByZWcKKyAqLworI2RlZmluZQlFVlRTRUxfTUFTSwkweDdmCQkvKiBNYXNrIGZvciB3cml0YWJsZSBiaXRzICovCisKKy8qCisgKiBTRUxFQ1Q6IENvdW50ZXIgc2VsZWN0aW9uIHJlZworICovCisjZGVmaW5lCVNFTEVDVF9NQVNLCTB4MWYJCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KKworLyoKKyAqIEZMQUc6IGNvdW50ZXJzIG92ZXJmbG93IGZsYWcgc3RhdHVzIHJlZworICovCisjZGVmaW5lIEZMQUdfUDAJCSgxIDw8IDApCisjZGVmaW5lIEZMQUdfUDEJCSgxIDw8IDEpCisjZGVmaW5lIEZMQUdfUDIJCSgxIDw8IDIpCisjZGVmaW5lIEZMQUdfUDMJCSgxIDw8IDMpCisjZGVmaW5lIEZMQUdfQwkJKDEgPDwgMzEpCisjZGVmaW5lCUZMQUdfTUFTSwkweDgwMDAwMDBmCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KKworCitpbnQgYXJtdjdfc2V0dXBfcG11KHZvaWQpOworaW50IGFybXY3X3N0YXJ0X3BtdSh2b2lkKTsKK2ludCBhcm12N19zdG9wX3BtdSh2b2lkKTsKK2ludCBhcm12N19yZXF1ZXN0X2ludGVycnVwdHMoaW50ICosIGludCk7Cit2b2lkIGFybXY3X3JlbGVhc2VfaW50ZXJydXB0cyhpbnQgKiwgaW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF94c2NhbGUuYyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCmluZGV4IDdjMzI4OWMuLjcyNGFiOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KIAogI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKICNpbmNsdWRlICJvcF9hcm1fbW9kZWwuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtaW9wL2kyYy5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvaTJjLmMKaW5kZXggNmRjYmNjNC4uNGVmZTM5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvaTJjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1pb3AvaTJjLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvaW8uYyBiL2FyY2gvYXJtL3BsYXQtaW9wL2lvLmMKaW5kZXggMzlkY2ZiNC4uZWQwYmJlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvaW8uYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC9pby5jCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogdm9pZCAqIF9faW9tZW0gX19pb3AzeHhfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGNvb2tpZSwgc2l6ZV90IHNpemUsCiAJdW5zaWduZWQgaW50IG10eXBlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvcGNpLmMgYi9hcmNoL2FybS9wbGF0LWlvcC9wY2kuYwppbmRleCA1NDcwOGJmLi43N2ZhN2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LWlvcC9wY2kuYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC9wY2kuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMgYi9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMKaW5kZXggYzUzZmVmYi4uMzY5NWJiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYwpAQCAtMTgsOCArMTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnCmluZGV4IGUxNGVhYWQuLmIyYTdlM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZwpAQCAtMjMsNCArMjMsMTUgQEAKIAogZW5kbWVudQogCitjb25maWcgTVhDX0lSUV9QUklPUgorCWJvb2wgIlVzZSBJUlEgcHJpb3JpdHkiCisJZGVwZW5kcyBvbiBBUkNIX01YQworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRvIHVzZSBwcmlvcml0aXplZCBJUlEgaGFuZGxpbmcuCisJICBUaGlzIGZlYXR1cmUgcHJldmVudHMgaGlnaGVyIHByaW9yaXR5IElTUiB0byBiZSBpbnRlcnJ1cHRlZAorCSAgYnkgbG93ZXIgcHJpb3JpdHkgSVJRIGV2ZW4gSVJRRl9ESVNBQkxFRCBmbGFnIGlzIG5vdCBzZXQuCisJICBUaGlzIG1heSBiZSB1c2VmdWwgaW4gZW1iZWRkZWQgYXBwbGljYXRpb25zLCB3aGVyZSBhcmUgc3Ryb25nCisJICByZXF1aXJlbWVudHMgZm9yIHRpbWluZy4KKwkgIFNheSBOIGhlcmUsIHVubGVzcyB5b3UgaGF2ZSBhIHNwZWNpYWxpemVkIHJlcXVpcmVtZW50LgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQppbmRleCBkYjY2ZTlhLi4wNjc1NTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQpAQCAtMyw2ICszLDYgQEAKICMKIAogIyBDb21tb24gc3VwcG9ydAotb2JqLXkgOj0gaXJxLm8gY2xvY2subyBncGlvLm8gdGltZS5vCitvYmoteSA6PSBpcnEubyBjbG9jay5vIGdwaW8ubyB0aW1lLm8gZGV2aWNlcy5vCiAKLW9iai0kKENPTkZJR19BUkNIX01YMikgKz0gaW9tdXgtbXgxLW14Mi5vCitvYmotJChDT05GSUdfQVJDSF9NWDIpICs9IGlvbXV4LW14MS1teDIubyBkbWEtbXgxLW14Mi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1teGMvY2xvY2suYwppbmRleCAyZjg2MjcyLi4wYTM4ZjBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2Nsb2NrLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2NzQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggU2FzY2hhIEhhdWVyLCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworaW50IF9faW5pdCBteGNfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gZGF0YTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihwZGV2KTsKKwlpZiAocmV0KQorCQlwcl9kZWJ1ZygiVW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZSAnJXMnOiAlZFxuIiwKKwkJCSBwZGV2LT5uYW1lLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZG1hLW14MS1teDIuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RtYS1teDEtbXgyLmMKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vcGxhdC1teGMvZG1hLW14MS1teDIuYworICoKKyAqICBpLk1YIERNQSByZWdpc3RyYXRpb24gYW5kIElSUSBkaXNwYXRjaGluZworICoKKyAqIENvcHlyaWdodCAyMDA2IFBhdmVsIFBpc2EgPHBpc2FAY21wLmZlbGsuY3Z1dC5jej4KKyAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4KKyAqIENvcHlyaWdodCAyMDA4IFNhc2NoYSBIYXVlciwgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS1teDEtbXgyLmg+CisKKyNkZWZpbmUgRE1BX0RDUiAgICAgMHgwMAkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfRElTUiAgICAweDA0CQkvKiBJbnRlcnJ1cHQgc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9ESU1SICAgIDB4MDgJCS8qIEludGVycnVwdCBtYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9EQlRPU1IgIDB4MGMJCS8qIEJ1cnN0IHRpbWVvdXQgc3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9EUlRPU1IgIDB4MTAJCS8qIFJlcXVlc3QgdGltZW91dCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfRFNFU1IgICAweDE0CQkvKiBUcmFuc2ZlciBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0RCT1NSICAgMHgxOAkJLyogQnVmZmVyIG92ZXJmbG93IHN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBETUFfREJUT0NSICAweDFjCQkvKiBCdXJzdCB0aW1lb3V0IGNvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX1dTUkEgICAgMHg0MAkJLyogVy1TaXplIFJlZ2lzdGVyIEEgKi8KKyNkZWZpbmUgRE1BX1hTUkEgICAgMHg0NAkJLyogWC1TaXplIFJlZ2lzdGVyIEEgKi8KKyNkZWZpbmUgRE1BX1lTUkEgICAgMHg0OAkJLyogWS1TaXplIFJlZ2lzdGVyIEEgKi8KKyNkZWZpbmUgRE1BX1dTUkIgICAgMHg0YwkJLyogVy1TaXplIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgRE1BX1hTUkIgICAgMHg1MAkJLyogWC1TaXplIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgRE1BX1lTUkIgICAgMHg1NAkJLyogWS1TaXplIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgRE1BX1NBUih4KSAgKDB4ODAgKyAoKHgpIDw8IDYpKQkvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX0RBUih4KSAgKDB4ODQgKyAoKHgpIDw8IDYpKQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQ05UUih4KSAoMHg4OCArICgoeCkgPDwgNikpCS8qIENvdW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQ0NSKHgpICAoMHg4YyArICgoeCkgPDwgNikpCS8qIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9SU1NSKHgpICgweDkwICsgKCh4KSA8PCA2KSkJLyogUmVxdWVzdCBzb3VyY2Ugc2VsZWN0IFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQkxSKHgpICAoMHg5NCArICgoeCkgPDwgNikpCS8qIEJ1cnN0IGxlbmd0aCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX1JUT1IoeCkgKDB4OTggKyAoKHgpIDw8IDYpKQkvKiBSZXF1ZXN0IHRpbWVvdXQgUmVnaXN0ZXJzICovCisjZGVmaW5lIERNQV9CVUNSKHgpICgweDk4ICsgKCh4KSA8PCA2KSkJLyogQnVzIFV0aWxpemF0aW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQ0NOUih4KSAoMHg5QyArICgoeCkgPDwgNikpCS8qIENoYW5uZWwgY291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBEQ1JfRFJTVCAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIERDUl9ERU4gICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgREJUT0NSX0VOICAgICAgICAgICgxPDwxNSkKKyNkZWZpbmUgREJUT0NSX0NOVCh4KSAgICAgICgoeCkgJiAweDdmZmYpCisjZGVmaW5lIENOVFJfQ05UKHgpICAgICAgICAoKHgpICYgMHhmZmZmZmYpCisjZGVmaW5lIENDUl9BQ1JQVCAgICAgICAgICAoMTw8MTQpCisjZGVmaW5lIENDUl9ETU9EX0xJTkVBUiAgICAoMHgwIDw8IDEyKQorI2RlZmluZSBDQ1JfRE1PRF8yRCAgICAgICAgKDB4MSA8PCAxMikKKyNkZWZpbmUgQ0NSX0RNT0RfRklGTyAgICAgICgweDIgPDwgMTIpCisjZGVmaW5lIENDUl9ETU9EX0VPQkZJRk8gICAoMHgzIDw8IDEyKQorI2RlZmluZSBDQ1JfU01PRF9MSU5FQVIgICAgKDB4MCA8PCAxMCkKKyNkZWZpbmUgQ0NSX1NNT0RfMkQgICAgICAgICgweDEgPDwgMTApCisjZGVmaW5lIENDUl9TTU9EX0ZJRk8gICAgICAoMHgyIDw8IDEwKQorI2RlZmluZSBDQ1JfU01PRF9FT0JGSUZPICAgKDB4MyA8PCAxMCkKKyNkZWZpbmUgQ0NSX01ESVJfREVDICAgICAgICgxPDw5KQorI2RlZmluZSBDQ1JfTVNFTF9CICAgICAgICAgKDE8PDgpCisjZGVmaW5lIENDUl9EU0laXzMyICAgICAgICAoMHgwIDw8IDYpCisjZGVmaW5lIENDUl9EU0laXzggICAgICAgICAoMHgxIDw8IDYpCisjZGVmaW5lIENDUl9EU0laXzE2ICAgICAgICAoMHgyIDw8IDYpCisjZGVmaW5lIENDUl9TU0laXzMyICAgICAgICAoMHgwIDw8IDQpCisjZGVmaW5lIENDUl9TU0laXzggICAgICAgICAoMHgxIDw8IDQpCisjZGVmaW5lIENDUl9TU0laXzE2ICAgICAgICAoMHgyIDw8IDQpCisjZGVmaW5lIENDUl9SRU4gICAgICAgICAgICAoMTw8MykKKyNkZWZpbmUgQ0NSX1JQVCAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBDQ1JfRlJDICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIENDUl9DRU4gICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgUlRPUl9FTiAgICAgICAgICAgICgxPDwxNSkKKyNkZWZpbmUgUlRPUl9DTEsgICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgUlRPUl9QU0MgICAgICAgICAgICgxPDwxMykKKworLyoKKyAqIHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgLSBpLk1YIHNwZWNpZmljIERNQSBleHRlbnNpb24KKyAqIEBuYW1lOiBuYW1lIHNwZWNpZmllZCBieSBETUEgY2xpZW50CisgKiBAaXJxX2hhbmRsZXI6IGNsaWVudCBjYWxsYmFjayBmb3IgZW5kIG9mIHRyYW5zZmVyCisgKiBAZXJyX2hhbmRsZXI6IGNsaWVudCBjYWxsYmFjayBmb3IgZXJyb3IgY29uZGl0aW9uCisgKiBAZGF0YTogY2xpZW50cyBjb250ZXh0IGRhdGEgZm9yIGNhbGxiYWNrcworICogQGRtYV9tb2RlOiBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyICVETUFfTU9ERV9SRUFEIG9yICVETUFfTU9ERV9XUklURQorICogQHNnOiBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcmVhZC93cml0dGVuIGNodW5rIGZvciBzY2F0dGVyLWdhdGhlciBlbXVsYXRpb24KKyAqIEByZXNieXRlczogdG90YWwgcmVzaWR1YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyCisgKiAgICAgICAgICAgIChpdCBjYW4gYmUgbG93ZXIgb3Igc2FtZSBhcyBzdW0gb2YgU0cgbWFwcGVkIGNodW5rIHNpemVzKQorICogQHNnY291bnQ6IG51bWJlciBvZiBjaHVua3MgdG8gYmUgcmVhZC93cml0dGVuCisgKgorICogU3RydWN0dXJlIGlzIHVzZWQgZm9yIElNWCBETUEgcHJvY2Vzc2luZy4gSXQgd291bGQgYmUgcHJvYmFibHkgZ29vZAorICogQHN0cnVjdCBkbWFfc3RydWN0IGluIHRoZSBmdXR1cmUgZm9yIGV4dGVybmFsIGludGVyZmFjaW5nIGFuZCB1c2UKKyAqIEBzdHJ1Y3QgaW14X2RtYV9jaGFubmVsIG9ubHkgYXMgZXh0ZW5zaW9uIHRvIGl0LgorICovCisKK3N0cnVjdCBpbXhfZG1hX2NoYW5uZWwgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICopOworCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBpbnQgZXJyY29kZSk7CisJdm9pZCAoKnByb2dfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKik7CisJdm9pZCAqZGF0YTsKKwlkbWFtb2RlX3QgIGRtYV9tb2RlOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IHJlc2J5dGVzOworCWludCBkbWFfbnVtOworCisJaW50IGluX3VzZTsKKworCXUzMiBjY3JfZnJvbV9kZXZpY2U7CisJdTMyIGNjcl90b19kZXZpY2U7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKworCWludCBod19jaGFpbmluZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X2RtYV9jaGFubmVsIGlteF9kbWFfY2hhbm5lbHNbSU1YX0RNQV9DSEFOTkVMU107CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpkbWFfY2xrOworCitzdGF0aWMgaW50IGlteF9kbWFfaHdfY2hhaW4oc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hKQoreworCWlmIChjcHVfaXNfbXgyNygpKQorCQlyZXR1cm4gaW14ZG1hLT5od19jaGFpbmluZzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisKKy8qCisgKiBpbXhfZG1hX3NnX25leHQgLSBwcmVwYXJlIG5leHQgY2h1bmsgZm9yIHNjYXR0ZXItZ2F0aGVyIERNQSBlbXVsYXRpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW14X2RtYV9zZ19uZXh0KGludCBjaGFubmVsLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCXVuc2lnbmVkIGxvbmcgbm93OworCisJaWYgKCFpbXhkbWEtPm5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGNhbGxlZCBmb3IgIG5vdCBhbGxvY2F0ZWQgY2hhbm5lbCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbm93ID0gbWluKGlteGRtYS0+cmVzYnl0ZXMsIHNnLT5sZW5ndGgpOworCWlteGRtYS0+cmVzYnl0ZXMgLT0gbm93OworCisJaWYgKChpbXhkbWEtPmRtYV9tb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfUkVBRCkKKwkJX19yYXdfd3JpdGVsKHNnLT5kbWFfYWRkcmVzcywgRE1BX0JBU0UgKyBETUFfREFSKGNoYW5uZWwpKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChzZy0+ZG1hX2FkZHJlc3MsIERNQV9CQVNFICsgRE1BX1NBUihjaGFubmVsKSk7CisKKwlfX3Jhd193cml0ZWwobm93LCBETUFfQkFTRSArIERNQV9DTlRSKGNoYW5uZWwpKTsKKworCXByX2RlYnVnKCJpbXhkbWElZDogbmV4dCBzZyBjaHVuayBkc3QgMHglMDh4LCBzcmMgMHglMDh4LCAiCisJCSJzaXplIDB4JTA4eFxuIiwgY2hhbm5lbCwKKwkJIF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RBUihjaGFubmVsKSksCisJCSBfX3Jhd19yZWFkbChETUFfQkFTRSArIERNQV9TQVIoY2hhbm5lbCkpLAorCQkgX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfQ05UUihjaGFubmVsKSkpOworCisJcmV0dXJuIG5vdzsKK30KKworLyoqCisgKiBpbXhfZG1hX3NldHVwX3NpbmdsZSAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgZm9yIGxpbmVhciBtZW1vcnkgdG8vZnJvbQorICogZGV2aWNlIHRyYW5zZmVyCisgKgorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAZG1hX2FkZHJlc3M6IHRoZSBETUEvcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGxpbmVhciBkYXRhIGJsb2NrCisgKgkJdG8gdHJhbnNmZXIKKyAqIEBkbWFfbGVuZ3RoOiBsZW5ndGggb2YgdGhlIGRhdGEgYmxvY2sgaW4gYnl0ZXMKKyAqIEBkZXZfYWRkcjogcGh5c2ljYWwgZGV2aWNlIHBvcnQgYWRkcmVzcworICogQGRtYW1vZGU6IERNQSB0cmFuc2ZlciBtb2RlLCAlRE1BX01PREVfUkVBRCBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIG1lbW9yeQorICogICAgICAgICAgIG9yICVETUFfTU9ERV9XUklURSBmcm9tIG1lbW9yeSB0byB0aGUgZGV2aWNlCisgKgorICogUmV0dXJuIHZhbHVlOiBpZiBpbmNvcnJlY3QgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQgLSVFSU5WQUwuCisgKgkJWmVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50CitpbXhfZG1hX3NldHVwX3NpbmdsZShpbnQgY2hhbm5lbCwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKKwkJICAgICB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAorCQkgICAgIGRtYW1vZGVfdCBkbWFtb2RlKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCisJaW14ZG1hLT5zZyA9IE5VTEw7CisJaW14ZG1hLT5kbWFfbW9kZSA9IGRtYW1vZGU7CisKKwlpZiAoIWRtYV9hZGRyZXNzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2luZ2xlIG51bGwgYWRkcmVzc1xuIiwKKwkJICAgICAgIGNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWRtYV9sZW5ndGgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbXhkbWElZDogaW14X2RtYV9zZXR1cF9zaW5nbGUgemVybyBsZW5ndGhcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChkbWFtb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfUkVBRCkgeworCQlwcl9kZWJ1ZygiaW14ZG1hJWQ6ICVzIGRtYV9hZGRyZXNzZz0weCUwOHggZG1hX2xlbmd0aD0lZCAiCisJCQkiZGV2X2FkZHI9MHglMDh4IGZvciByZWFkXG4iLAorCQkJY2hhbm5lbCwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZG1hX2FkZHJlc3MsCisJCQlkbWFfbGVuZ3RoLCBkZXZfYWRkcik7CisKKwkJX19yYXdfd3JpdGVsKGRldl9hZGRyLCBETUFfQkFTRSArIERNQV9TQVIoY2hhbm5lbCkpOworCQlfX3Jhd193cml0ZWwoZG1hX2FkZHJlc3MsIERNQV9CQVNFICsgRE1BX0RBUihjaGFubmVsKSk7CisJCV9fcmF3X3dyaXRlbChpbXhkbWEtPmNjcl9mcm9tX2RldmljZSwKKwkJCQlETUFfQkFTRSArIERNQV9DQ1IoY2hhbm5lbCkpOworCX0gZWxzZSBpZiAoKGRtYW1vZGUgJiBETUFfTU9ERV9NQVNLKSA9PSBETUFfTU9ERV9XUklURSkgeworCQlwcl9kZWJ1ZygiaW14ZG1hJWQ6ICVzIGRtYV9hZGRyZXNzZz0weCUwOHggZG1hX2xlbmd0aD0lZCAiCisJCQkiZGV2X2FkZHI9MHglMDh4IGZvciB3cml0ZVxuIiwKKwkJCWNoYW5uZWwsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KWRtYV9hZGRyZXNzLAorCQkJZG1hX2xlbmd0aCwgZGV2X2FkZHIpOworCisJCV9fcmF3X3dyaXRlbChkbWFfYWRkcmVzcywgRE1BX0JBU0UgKyBETUFfU0FSKGNoYW5uZWwpKTsKKwkJX19yYXdfd3JpdGVsKGRldl9hZGRyLCBETUFfQkFTRSArIERNQV9EQVIoY2hhbm5lbCkpOworCQlfX3Jhd193cml0ZWwoaW14ZG1hLT5jY3JfdG9fZGV2aWNlLAorCQkJCURNQV9CQVNFICsgRE1BX0NDUihjaGFubmVsKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbXhkbWElZDogaW14X2RtYV9zZXR1cF9zaW5nbGUgYmFkIGRtYW1vZGVcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX19yYXdfd3JpdGVsKGRtYV9sZW5ndGgsIERNQV9CQVNFICsgRE1BX0NOVFIoY2hhbm5lbCkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfc2luZ2xlKTsKKworLyoqCisgKiBpbXhfZG1hX3NldHVwX3NnIC0gc2V0dXAgaS5NWCBETUEgY2hhbm5lbCBTRyBsaXN0IHRvL2Zyb20gZGV2aWNlIHRyYW5zZmVyCisgKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKKyAqIEBzZzogcG9pbnRlciB0byB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC92ZWN0b3IKKyAqIEBzZ2NvdW50OiBzY2F0dGVyLWdhdGhlciBsaXN0IGh1bmdzIGNvdW50CisgKiBAZG1hX2xlbmd0aDogdG90YWwgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciByZXF1ZXN0IGluIGJ5dGVzCisgKiBAZGV2X2FkZHI6IHBoeXNpY2FsIGRldmljZSBwb3J0IGFkZHJlc3MKKyAqIEBkbWFtb2RlOiBETUEgdHJhbnNmZXIgbW9kZSwgJURNQV9NT0RFX1JFQUQgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBtZW1vcnkKKyAqICAgICAgICAgICBvciAlRE1BX01PREVfV1JJVEUgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZQorICoKKyAqIFRoZSBmdW5jdGlvbiBzZXRzIHVwIERNQSBjaGFubmVsIHN0YXRlIGFuZCByZWdpc3RlcnMgdG8gYmUgcmVhZHkgZm9yCisgKiB0cmFuc2ZlciBzcGVjaWZpZWQgYnkgcHJvdmlkZWQgcGFyYW1ldGVycy4gVGhlIHNjYXR0ZXItZ2F0aGVyIGVtdWxhdGlvbgorICogaXMgc2V0IHVwIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGUgZnVsbCBwcmVwYXJhdGlvbiBvZiB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgc2V0dXAgb2YgbW9yZSByZWdpc3RlcgorICogYnkgdGhlIGNhbGxlciBiZWZvcmUgaW14X2RtYV9lbmFibGUoKSBjYW4gYmUgY2FsbGVkLgorICoKKyAqICVCTFIoY2hhbm5lbCkgaG9sZHMgdHJhbnNmZXIgYnVyc3QgbGVuZ3RoIGluIGJ5dGVzLCAwIG1lYW5zIDY0IGJ5dGVzCisgKgorICogJVJTU1IoY2hhbm5lbCkgaGFzIHRvIGJlIHNldCB0byB0aGUgRE1BIHJlcXVlc3QgbGluZSBzb3VyY2UgJURNQV9SRVFfeHh4CisgKgorICogJUNDUihjaGFubmVsKSBoYXMgdG8gc3BlY2lmeSB0cmFuc2ZlciBwYXJhbWV0ZXJzLCB0aGUgbmV4dCBzZXR0aW5ncyBpcworICogdHlwaWNhbCBmb3IgbGluZWFyIG9yIHNpbXBsZSBzY2F0dGVyLWdhdGhlciB0cmFuc2ZlcnMgaWYgJURNQV9NT0RFX1JFQUQgaXMKKyAqIHNwZWNpZmllZAorICoKKyAqICVDQ1JfRE1PRF9MSU5FQVIgfCAlQ0NSX0RTSVpfMzIgfCAlQ0NSX1NNT0RfRklGTyB8ICVDQ1JfU1NJWl94CisgKgorICogVGhlIHR5cGljYWwgc2V0dXAgZm9yICVETUFfTU9ERV9XUklURSBpcyBzcGVjaWZpZWQgYnkgbmV4dCBvcHRpb25zCisgKiBjb21iaW5hdGlvbgorICoKKyAqICVDQ1JfU01PRF9MSU5FQVIgfCAlQ0NSX1NTSVpfMzIgfCAlQ0NSX0RNT0RfRklGTyB8ICVDQ1JfRFNJWl94CisgKgorICogQmUgY2FyZWZ1bCBoZXJlIGFuZCBkbyBub3QgbWlzdGFrZW5seSBtaXggc291cmNlIGFuZCB0YXJnZXQgZGV2aWNlCisgKiBwb3J0IHNpemVzIGNvbnN0YW50cywgdGhleSBhcmUgcmVhbGx5IGRpZmZlcmVudDoKKyAqICVDQ1JfU1NJWl84LCAlQ0NSX1NTSVpfMTYsICVDQ1JfU1NJWl8zMiwKKyAqICVDQ1JfRFNJWl84LCAlQ0NSX0RTSVpfMTYsICVDQ1JfRFNJWl8zMgorICoKKyAqIFJldHVybiB2YWx1ZTogaWYgaW5jb3JyZWN0IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIC0lRUlOVkFMLgorICogWmVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworaW50CitpbXhfZG1hX3NldHVwX3NnKGludCBjaGFubmVsLAorCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IHNnY291bnQsCisJCSB1bnNpZ25lZCBpbnQgZG1hX2xlbmd0aCwgdW5zaWduZWQgaW50IGRldl9hZGRyLAorCQkgZG1hbW9kZV90IGRtYW1vZGUpCit7CisJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CisKKwlpZiAoaW14ZG1hLT5pbl91c2UpCisJCXJldHVybiAtRUJVU1k7CisKKwlpbXhkbWEtPnNnID0gc2c7CisJaW14ZG1hLT5kbWFfbW9kZSA9IGRtYW1vZGU7CisJaW14ZG1hLT5yZXNieXRlcyA9IGRtYV9sZW5ndGg7CisKKwlpZiAoIXNnIHx8ICFzZ2NvdW50KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2cgZXB0eSBzZyBsaXN0XG4iLAorCQkgICAgICAgY2hhbm5lbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghc2ctPmxlbmd0aCkgeworCQlwcmludGsoS0VSTl9FUlIgImlteGRtYSVkOiBpbXhfZG1hX3NldHVwX3NnIHplcm8gbGVuZ3RoXG4iLAorCQkgICAgICAgY2hhbm5lbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoZG1hbW9kZSAmIERNQV9NT0RFX01BU0spID09IERNQV9NT0RFX1JFQUQpIHsKKwkJcHJfZGVidWcoImlteGRtYSVkOiAlcyBzZz0lcCBzZ2NvdW50PSVkIHRvdGFsIGxlbmd0aD0lZCAiCisJCQkiZGV2X2FkZHI9MHglMDh4IGZvciByZWFkXG4iLAorCQkJY2hhbm5lbCwgX19mdW5jX18sIHNnLCBzZ2NvdW50LCBkbWFfbGVuZ3RoLCBkZXZfYWRkcik7CisKKwkJX19yYXdfd3JpdGVsKGRldl9hZGRyLCBETUFfQkFTRSArIERNQV9TQVIoY2hhbm5lbCkpOworCQlfX3Jhd193cml0ZWwoaW14ZG1hLT5jY3JfZnJvbV9kZXZpY2UsCisJCQkJRE1BX0JBU0UgKyBETUFfQ0NSKGNoYW5uZWwpKTsKKwl9IGVsc2UgaWYgKChkbWFtb2RlICYgRE1BX01PREVfTUFTSykgPT0gRE1BX01PREVfV1JJVEUpIHsKKwkJcHJfZGVidWcoImlteGRtYSVkOiAlcyBzZz0lcCBzZ2NvdW50PSVkIHRvdGFsIGxlbmd0aD0lZCAiCisJCQkiZGV2X2FkZHI9MHglMDh4IGZvciB3cml0ZVxuIiwKKwkJCWNoYW5uZWwsIF9fZnVuY19fLCBzZywgc2djb3VudCwgZG1hX2xlbmd0aCwgZGV2X2FkZHIpOworCisJCV9fcmF3X3dyaXRlbChkZXZfYWRkciwgRE1BX0JBU0UgKyBETUFfREFSKGNoYW5uZWwpKTsKKwkJX19yYXdfd3JpdGVsKGlteGRtYS0+Y2NyX3RvX2RldmljZSwKKwkJCQlETUFfQkFTRSArIERNQV9DQ1IoY2hhbm5lbCkpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW14ZG1hJWQ6IGlteF9kbWFfc2V0dXBfc2cgYmFkIGRtYW1vZGVcbiIsCisJCSAgICAgICBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW14X2RtYV9zZ19uZXh0KGNoYW5uZWwsIHNnKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX3NldHVwX3NnKTsKKworaW50CitpbXhfZG1hX2NvbmZpZ19jaGFubmVsKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgY29uZmlnX3BvcnQsCisJdW5zaWduZWQgaW50IGNvbmZpZ19tZW0sIHVuc2lnbmVkIGludCBkbWFyZXEsIGludCBod19jaGFpbmluZykKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1MzIgZHJlcSA9IDA7CisKKwlpbXhkbWEtPmh3X2NoYWluaW5nID0gMDsKKworCWlmIChod19jaGFpbmluZykgeworCQlpbXhkbWEtPmh3X2NoYWluaW5nID0gMTsKKwkJaWYgKCFpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZG1hcmVxKQorCQlkcmVxID0gQ0NSX1JFTjsKKworCWlteGRtYS0+Y2NyX2Zyb21fZGV2aWNlID0gY29uZmlnX3BvcnQgfCAoY29uZmlnX21lbSA8PCAyKSB8IGRyZXE7CisJaW14ZG1hLT5jY3JfdG9fZGV2aWNlID0gY29uZmlnX21lbSB8IChjb25maWdfcG9ydCA8PCAyKSB8IGRyZXE7CisKKwlfX3Jhd193cml0ZWwoZG1hcmVxLCBETUFfQkFTRSArIERNQV9SU1NSKGNoYW5uZWwpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX2NvbmZpZ19jaGFubmVsKTsKKwordm9pZCBpbXhfZG1hX2NvbmZpZ19idXJzdGxlbihpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IGJ1cnN0bGVuKQoreworCV9fcmF3X3dyaXRlbChidXJzdGxlbiwgRE1BX0JBU0UgKyBETUFfQkxSKGNoYW5uZWwpKTsKK30KK0VYUE9SVF9TWU1CT0woaW14X2RtYV9jb25maWdfYnVyc3RsZW4pOworCisvKioKKyAqIGlteF9kbWFfc2V0dXBfaGFuZGxlcnMgLSBzZXR1cCBpLk1YIERNQSBjaGFubmVsIGVuZCBhbmQgZXJyb3Igbm90aWZpY2F0aW9uCisgKiBoYW5kbGVycworICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAaXJxX2hhbmRsZXI6IHRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBjYWxsZWQgaWYgdGhlIHRyYW5zZmVyCisgKgkJZW5kcyBzdWNjZXNzZnVsbHkKKyAqIEBlcnJfaGFuZGxlcjogdGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGNhbGxlZCBpZiB0aGUgcHJlbWF0dXJlCisgKgkJZW5kIGNhdXNlZCBieSBlcnJvciBvY2N1cnMKKyAqIEBkYXRhOiB1c2VyIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXJzCisgKi8KK2ludAoraW14X2RtYV9zZXR1cF9oYW5kbGVycyhpbnQgY2hhbm5lbCwKKwkJICAgICAgIHZvaWQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqKSwKKwkJICAgICAgIHZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBpbnQpLAorCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbXhkbWEtPm5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGNhbGxlZCBmb3IgIG5vdCBhbGxvY2F0ZWQgY2hhbm5lbCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fcmF3X3dyaXRlbCgxIDw8IGNoYW5uZWwsIERNQV9CQVNFICsgRE1BX0RJU1IpOworCWlteGRtYS0+aXJxX2hhbmRsZXIgPSBpcnFfaGFuZGxlcjsKKwlpbXhkbWEtPmVycl9oYW5kbGVyID0gZXJyX2hhbmRsZXI7CisJaW14ZG1hLT5kYXRhID0gZGF0YTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfaGFuZGxlcnMpOworCisvKioKKyAqIGlteF9kbWFfc2V0dXBfcHJvZ3Jlc3Npb25faGFuZGxlciAtIHNldHVwIGkuTVggRE1BIGNoYW5uZWwgcHJvZ3Jlc3Npb24KKyAqIGhhbmRsZXJzCisgKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKKyAqIEBwcm9nX2hhbmRsZXI6IHRoZSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBjYWxsZWQgaWYgdGhlIHRyYW5zZmVyIHByb2dyZXNzZXMKKyAqLworaW50CitpbXhfZG1hX3NldHVwX3Byb2dyZXNzaW9uX2hhbmRsZXIoaW50IGNoYW5uZWwsCisJCQl2b2lkICgqcHJvZ19oYW5kbGVyKSAoaW50LCB2b2lkKiwgc3RydWN0IHNjYXR0ZXJsaXN0KikpCit7CisJc3RydWN0IGlteF9kbWFfY2hhbm5lbCAqaW14ZG1hID0gJmlteF9kbWFfY2hhbm5lbHNbY2hhbm5lbF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpbXhkbWEtPnByb2dfaGFuZGxlciA9IHByb2dfaGFuZGxlcjsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfc2V0dXBfcHJvZ3Jlc3Npb25faGFuZGxlcik7CisKKy8qKgorICogaW14X2RtYV9lbmFibGUgLSBmdW5jdGlvbiB0byBzdGFydCBpLk1YIERNQSBjaGFubmVsIG9wZXJhdGlvbgorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKgorICogVGhlIGNoYW5uZWwgaGFzIHRvIGJlIGFsbG9jYXRlZCBieSBkcml2ZXIgdGhyb3VnaCBpbXhfZG1hX3JlcXVlc3QoKQorICogb3IgaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8oKSBmdW5jdGlvbi4KKyAqIFRoZSB0cmFuc2ZlciBwYXJhbWV0ZXJzIGhhcyB0byBiZSBzZXQgdG8gdGhlIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2gKKyAqIGNhbGwgb2YgdGhlIGlteF9kbWFfc2V0dXBfc2luZ2xlKCkgb3IgaW14X2RtYV9zZXR1cF9zZygpIGZ1bmN0aW9uCisgKiBhbmQgcmVnaXN0ZXJzICVCTFIoY2hhbm5lbCksICVSU1NSKGNoYW5uZWwpIGFuZCAlQ0NSKGNoYW5uZWwpIGhhcyB0bworICogYmUgc2V0IHByaW9yIHRoaXMgZnVuY3Rpb24gY2FsbCBieSB0aGUgY2hhbm5lbCB1c2VyLgorICovCit2b2lkIGlteF9kbWFfZW5hYmxlKGludCBjaGFubmVsKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiaW14ZG1hJWQ6IGlteF9kbWFfZW5hYmxlXG4iLCBjaGFubmVsKTsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBjYWxsZWQgZm9yICBub3QgYWxsb2NhdGVkIGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY2hhbm5lbCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW14ZG1hLT5pbl91c2UpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCV9fcmF3X3dyaXRlbCgxIDw8IGNoYW5uZWwsIERNQV9CQVNFICsgRE1BX0RJU1IpOworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChETUFfQkFTRSArIERNQV9ESU1SKSAmIH4oMSA8PCBjaGFubmVsKSwKKwkJRE1BX0JBU0UgKyBETUFfRElNUik7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0NDUihjaGFubmVsKSkgfCBDQ1JfQ0VOIHwKKwkJQ0NSX0FDUlBULAorCQlETUFfQkFTRSArIERNQV9DQ1IoY2hhbm5lbCkpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgyCisJaWYgKGlteGRtYS0+c2cgJiYgaW14X2RtYV9od19jaGFpbihpbXhkbWEpKSB7CisJCWlteGRtYS0+c2cgPSBzZ19uZXh0KGlteGRtYS0+c2cpOworCQlpZiAoaW14ZG1hLT5zZykgeworCQkJdTMyIHRtcDsKKwkJCWlteF9kbWFfc2dfbmV4dChjaGFubmVsLCBpbXhkbWEtPnNnKTsKKwkJCXRtcCA9IF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0NDUihjaGFubmVsKSk7CisJCQlfX3Jhd193cml0ZWwodG1wIHwgQ0NSX1JQVCB8IENDUl9BQ1JQVCwKKwkJCQlETUFfQkFTRSArIERNQV9DQ1IoY2hhbm5lbCkpOworCQl9CisJfQorI2VuZGlmCisJaW14ZG1hLT5pbl91c2UgPSAxOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX2VuYWJsZSk7CisKKy8qKgorICogaW14X2RtYV9kaXNhYmxlIC0gc3RvcCwgZmluaXNoIGkuTVggRE1BIGNoYW5uZWwgb3BlcmF0aW4KKyAqIEBjaGFubmVsOiBpLk1YIERNQSBjaGFubmVsIG51bWJlcgorICovCit2b2lkIGlteF9kbWFfZGlzYWJsZShpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoImlteGRtYSVkOiBpbXhfZG1hX2Rpc2FibGVcbiIsIGNoYW5uZWwpOworCisJaWYgKGlteF9kbWFfaHdfY2hhaW4oaW14ZG1hKSkKKwkJZGVsX3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfRElNUikgfCAoMSA8PCBjaGFubmVsKSwKKwkJRE1BX0JBU0UgKyBETUFfRElNUik7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0NDUihjaGFubmVsKSkgJiB+Q0NSX0NFTiwKKwkJRE1BX0JBU0UgKyBETUFfQ0NSKGNoYW5uZWwpKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBjaGFubmVsLCBETUFfQkFTRSArIERNQV9ESVNSKTsKKwlpbXhkbWEtPmluX3VzZSA9IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX2Rpc2FibGUpOworCitzdGF0aWMgdm9pZCBpbXhfZG1hX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgY2hubykKK3sKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaG5vXTsKKworCV9fcmF3X3dyaXRlbCgwLCBETUFfQkFTRSArIERNQV9DQ1IoY2hubykpOworCWlteGRtYS0+aW5fdXNlID0gMDsKKwlpbXhkbWEtPnNnID0gTlVMTDsKKworCWlmIChpbXhkbWEtPmVycl9oYW5kbGVyKQorCQlpbXhkbWEtPmVycl9oYW5kbGVyKGNobm8sIGlteGRtYS0+ZGF0YSwgSU1YX0RNQV9FUlJfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfZXJyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpLCBkaXNyOworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYTsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2s7CisJaW50IGVycmNvZGU7CisKKwlkaXNyID0gX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfRElTUik7CisKKwllcnJfbWFzayA9IF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RCVE9TUikgfAorCQkgICBfX3Jhd19yZWFkbChETUFfQkFTRSArIERNQV9EUlRPU1IpIHwKKwkJICAgX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfRFNFU1IpICB8CisJCSAgIF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RCT1NSKTsKKworCWlmICghZXJyX21hc2spCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCV9fcmF3X3dyaXRlbChkaXNyICYgZXJyX21hc2ssIERNQV9CQVNFICsgRE1BX0RJU1IpOworCisJZm9yIChpID0gMDsgaSA8IElNWF9ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoIShlcnJfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tpXTsKKwkJZXJyY29kZSA9IDA7CisKKwkJaWYgKF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RCVE9TUikgJiAoMSA8PCBpKSkgeworCQkJX19yYXdfd3JpdGVsKDEgPDwgaSwgRE1BX0JBU0UgKyBETUFfREJUT1NSKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfQlVSU1Q7CisJCX0KKwkJaWYgKF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RSVE9TUikgJiAoMSA8PCBpKSkgeworCQkJX19yYXdfd3JpdGVsKDEgPDwgaSwgRE1BX0JBU0UgKyBETUFfRFJUT1NSKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfUkVRVUVTVDsKKwkJfQorCQlpZiAoX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfRFNFU1IpICYgKDEgPDwgaSkpIHsKKwkJCV9fcmF3X3dyaXRlbCgxIDw8IGksIERNQV9CQVNFICsgRE1BX0RTRVNSKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfVFJBTlNGRVI7CisJCX0KKwkJaWYgKF9fcmF3X3JlYWRsKERNQV9CQVNFICsgRE1BX0RCT1NSKSAmICgxIDw8IGkpKSB7CisJCQlfX3Jhd193cml0ZWwoMSA8PCBpLCBETUFfQkFTRSArIERNQV9EQk9TUik7CisJCQllcnJjb2RlIHw9IElNWF9ETUFfRVJSX0JVRkZFUjsKKwkJfQorCQlpZiAoaW14ZG1hLT5uYW1lICYmIGlteGRtYS0+ZXJyX2hhbmRsZXIpIHsKKwkJCWlteGRtYS0+ZXJyX2hhbmRsZXIoaSwgaW14ZG1hLT5kYXRhLCBlcnJjb2RlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaW14X2RtYV9jaGFubmVsc1tpXS5zZyA9IE5VTEw7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkRNQSB0aW1lb3V0IG9uIGNoYW5uZWwgJWQgKCVzKSAtJXMlcyVzJXNcbiIsCisJCSAgICAgICBpLCBpbXhkbWEtPm5hbWUsCisJCSAgICAgICBlcnJjb2RlICYgSU1YX0RNQV9FUlJfQlVSU1QgPyAgICAiIGJ1cnN0IiA6ICIiLAorCQkgICAgICAgZXJyY29kZSAmIElNWF9ETUFfRVJSX1JFUVVFU1QgPyAgIiByZXF1ZXN0IiA6ICIiLAorCQkgICAgICAgZXJyY29kZSAmIElNWF9ETUFfRVJSX1RSQU5TRkVSID8gIiB0cmFuc2ZlciIgOiAiIiwKKwkJICAgICAgIGVycmNvZGUgJiBJTVhfRE1BX0VSUl9CVUZGRVIgPyAgICIgYnVmZmVyIiA6ICIiKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBkbWFfaXJxX2hhbmRsZV9jaGFubmVsKGludCBjaG5vKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2Nobm9dOworCisJaWYgKCFpbXhkbWEtPm5hbWUpIHsKKwkJLyoKKwkJICogSVJRIGZvciBhbiB1bnJlZ2lzdGVyZWQgRE1BIGNoYW5uZWw6CisJCSAqIGxldCdzIGNsZWFyIHRoZSBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIGl0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInNwdXJpb3VzIElSUSBmb3IgRE1BIGNoYW5uZWwgJWRcbiIsIGNobm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKGlteGRtYS0+c2cpIHsKKwkJdTMyIHRtcDsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpjdXJyZW50X3NnID0gaW14ZG1hLT5zZzsKKwkJaW14ZG1hLT5zZyA9IHNnX25leHQoaW14ZG1hLT5zZyk7CisKKwkJaWYgKGlteGRtYS0+c2cpIHsKKwkJCWlteF9kbWFfc2dfbmV4dChjaG5vLCBpbXhkbWEtPnNnKTsKKworCQkJdG1wID0gX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfQ0NSKGNobm8pKTsKKworCQkJaWYgKGlteF9kbWFfaHdfY2hhaW4oaW14ZG1hKSkgeworCQkJCS8qIEZJWE1FOiBUaGUgdGltZW91dCBzaG91bGQgcHJvYmFibHkgYmUKKwkJCQkgKiBjb25maWd1cmFibGUKKwkJCQkgKi8KKwkJCQltb2RfdGltZXIoJmlteGRtYS0+d2F0Y2hkb2csCisJCQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCisJCQkJdG1wIHw9IENDUl9DRU4gfCBDQ1JfUlBUIHwgQ0NSX0FDUlBUOworCQkJCV9fcmF3X3dyaXRlbCh0bXAsIERNQV9CQVNFICsKKwkJCQkJCURNQV9DQ1IoY2hubykpOworCQkJfSBlbHNlIHsKKwkJCQlfX3Jhd193cml0ZWwodG1wICYgfkNDUl9DRU4sIERNQV9CQVNFICsKKwkJCQkJCURNQV9DQ1IoY2hubykpOworCQkJCXRtcCB8PSBDQ1JfQ0VOOworCQkJfQorCisJCQlfX3Jhd193cml0ZWwodG1wLCBETUFfQkFTRSArIERNQV9DQ1IoY2hubykpOworCisJCQlpZiAoaW14ZG1hLT5wcm9nX2hhbmRsZXIpCisJCQkJaW14ZG1hLT5wcm9nX2hhbmRsZXIoY2hubywgaW14ZG1hLT5kYXRhLAorCQkJCQkJY3VycmVudF9zZyk7CisKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChpbXhfZG1hX2h3X2NoYWluKGlteGRtYSkpIHsKKwkJCWRlbF90aW1lcigmaW14ZG1hLT53YXRjaGRvZyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlfX3Jhd193cml0ZWwoMCwgRE1BX0JBU0UgKyBETUFfQ0NSKGNobm8pKTsKKwlpbXhkbWEtPmluX3VzZSA9IDA7CisJaWYgKGlteGRtYS0+aXJxX2hhbmRsZXIpCisJCWlteGRtYS0+aXJxX2hhbmRsZXIoY2hubywgaW14ZG1hLT5kYXRhKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRtYV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaW50IGksIGRpc3I7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDIKKwlkbWFfZXJyX2hhbmRsZXIoaXJxLCBkZXZfaWQpOworI2VuZGlmCisKKwlkaXNyID0gX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfRElTUik7CisKKwlwcl9kZWJ1ZygiaW14ZG1hOiBkbWFfaXJxX2hhbmRsZXIgY2FsbGVkLCBkaXNyPTB4JTA4eFxuIiwKKwkJICAgICBkaXNyKTsKKworCV9fcmF3X3dyaXRlbChkaXNyLCBETUFfQkFTRSArIERNQV9ESVNSKTsKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChkaXNyICYgKDEgPDwgaSkpCisJCQlkbWFfaXJxX2hhbmRsZV9jaGFubmVsKGkpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBpbXhfZG1hX3JlcXVlc3QgLSByZXF1ZXN0L2FsbG9jYXRlIHNwZWNpZmllZCBjaGFubmVsIG51bWJlcgorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAbmFtZTogdGhlIGRyaXZlci9jYWxsZXIgb3duIG5vbi0lTlVMTCBpZGVudGlmaWNhdGlvbgorICovCitpbnQgaW14X2RtYV9yZXF1ZXN0KGludCBjaGFubmVsLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2NoYW5uZWxdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIGJhc2ljIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNoYW5uZWwgPj0gSU1YX0RNQV9DSEFOTkVMUykgeworCQlwcmludGsoS0VSTl9DUklUICIlczogY2FsbGVkIGZvciAgbm9uLWV4aXN0ZWQgY2hhbm5lbCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbXhkbWEtPm5hbWUpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworI2lmZGVmIENPTkZJR19BUkNIX01YMgorCXJldCA9IHJlcXVlc3RfaXJxKE1YQ19JTlRfRE1BQ0gwICsgY2hhbm5lbCwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwKKwkJCU5VTEwpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ2FuJ3QgcmVnaXN0ZXIgSVJRICVkIGZvciBETUEgY2hhbm5lbCAlZFxuIiwKKwkJCQlNWENfSU5UX0RNQUNIMCArIGNoYW5uZWwsIGNoYW5uZWwpOworCQlyZXR1cm4gcmV0OworCX0KKwlpbml0X3RpbWVyKCZpbXhkbWEtPndhdGNoZG9nKTsKKwlpbXhkbWEtPndhdGNoZG9nLmZ1bmN0aW9uID0gJmlteF9kbWFfd2F0Y2hkb2c7CisJaW14ZG1hLT53YXRjaGRvZy5kYXRhID0gY2hhbm5lbDsKKyNlbmRpZgorCisJaW14ZG1hLT5uYW1lID0gbmFtZTsKKwlpbXhkbWEtPmlycV9oYW5kbGVyID0gTlVMTDsKKwlpbXhkbWEtPmVycl9oYW5kbGVyID0gTlVMTDsKKwlpbXhkbWEtPmRhdGEgPSBOVUxMOworCWlteGRtYS0+c2cgPSBOVUxMOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbXhfZG1hX3JlcXVlc3QpOworCisvKioKKyAqIGlteF9kbWFfZnJlZSAtIHJlbGVhc2UgcHJldmlvdXNseSBhY3F1aXJlZCBjaGFubmVsCisgKiBAY2hhbm5lbDogaS5NWCBETUEgY2hhbm5lbCBudW1iZXIKKyAqLwordm9pZCBpbXhfZG1hX2ZyZWUoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICppbXhkbWEgPSAmaW14X2RtYV9jaGFubmVsc1tjaGFubmVsXTsKKworCWlmICghaW14ZG1hLT5uYW1lKSB7CisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICIlczogdHJ5aW5nIHRvIGZyZWUgZnJlZSBjaGFubmVsICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWwpOworCQlyZXR1cm47CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChETUFfQkFTRSArIERNQV9ESU1SKSB8ICgxIDw8IGNoYW5uZWwpLAorCQlETUFfQkFTRSArIERNQV9ESU1SKTsKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoRE1BX0JBU0UgKyBETUFfQ0NSKGNoYW5uZWwpKSAmIH5DQ1JfQ0VOLAorCQlETUFfQkFTRSArIERNQV9DQ1IoY2hhbm5lbCkpOworCWlteGRtYS0+bmFtZSA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NWDIKKwlmcmVlX2lycShNWENfSU5UX0RNQUNIMCArIGNoYW5uZWwsIE5VTEwpOworI2VuZGlmCisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfZnJlZSk7CisKKy8qKgorICogaW14X2RtYV9yZXF1ZXN0X2J5X3ByaW8gLSBmaW5kIGFuZCByZXF1ZXN0IHNvbWUgb2YgZnJlZSBjaGFubmVscyBiZXN0CisgKiBzdWl0aW5nIHJlcXVlc3RlZCBwcmlvcml0eQorICogQGNoYW5uZWw6IGkuTVggRE1BIGNoYW5uZWwgbnVtYmVyCisgKiBAbmFtZTogdGhlIGRyaXZlci9jYWxsZXIgb3duIG5vbi0lTlVMTCBpZGVudGlmaWNhdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIGZyZWUgY2hhbm5lbCBpbiB0aGUgc3BlY2lmaWVkIHByaW9yaXR5IGdyb3VwCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBmcmVlIGNoYW5uZWwgaW4gdGhlIHNwZWNpZmllZCBwcmlvcml0eSBncm91cAorICogaWYgdGhlIHByaW9yaXR5IGNhbm5vdCBiZSBhY2hpZXZlZCBpdCB0cmllcyB0byBsb29rIGZvciBmcmVlIGNoYW5uZWwKKyAqIGluIHRoZSBoaWdoZXIgYW5kIHRoZW4gZXZlbiBsb3dlciBwcmlvcml0eSBncm91cHMuCisgKgorICogUmV0dXJuIHZhbHVlOiBJZiB0aGVyZSBpcyBubyBmcmVlIGNoYW5uZWwgdG8gYWxsb2NhdGUsIC0lRU5PREVWIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICBPbiBzdWNjZXNzZnVsIGFsbG9jYXRpb24gY2hhbm5lbCBpcyByZXR1cm5lZC4KKyAqLworaW50IGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gaW14X2RtYV9wcmlvIHByaW8pCit7CisJaW50IGk7CisJaW50IGJlc3Q7CisKKwlzd2l0Y2ggKHByaW8pIHsKKwljYXNlIChETUFfUFJJT19ISUdIKToKKwkJYmVzdCA9IDg7CisJCWJyZWFrOworCWNhc2UgKERNQV9QUklPX01FRElVTSk6CisJCWJlc3QgPSA0OworCQlicmVhazsKKwljYXNlIChETUFfUFJJT19MT1cpOgorCWRlZmF1bHQ6CisJCWJlc3QgPSAwOworCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSBiZXN0OyBpIDwgSU1YX0RNQV9DSEFOTkVMUzsgaSsrKQorCQlpZiAoIWlteF9kbWFfcmVxdWVzdChpLCBuYW1lKSkKKwkJCXJldHVybiBpOworCisJZm9yIChpID0gYmVzdCAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAoIWlteF9kbWFfcmVxdWVzdChpLCBuYW1lKSkKKwkJCXJldHVybiBpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gZnJlZSBETUEgY2hhbm5lbCBmb3VuZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKTsKKworc3RhdGljIGludCBfX2luaXQgaW14X2RtYV9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlkbWFfY2xrID0gY2xrX2dldChOVUxMLCAiZG1hX2NsayIpOworCWNsa19lbmFibGUoZG1hX2Nsayk7CisKKwkvKiByZXNldCBETUEgbW9kdWxlICovCisJX19yYXdfd3JpdGVsKERDUl9EUlNULCBETUFfQkFTRSArIERNQV9EQ1IpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfTVgxCisJcmV0ID0gcmVxdWVzdF9pcnEoRE1BX0lOVCwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9DUklUICJXb3chICBDYW4ndCByZWdpc3RlciBJUlEgZm9yIERNQVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoRE1BX0VSUiwgZG1hX2Vycl9oYW5kbGVyLCAwLCAiRE1BIiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9DUklUICJXb3chICBDYW4ndCByZWdpc3RlciBFUlJJUlEgZm9yIERNQVxuIik7CisJCWZyZWVfaXJxKERNQV9JTlQsIE5VTEwpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCS8qIGVuYWJsZSBETUEgbW9kdWxlICovCisJX19yYXdfd3JpdGVsKERDUl9ERU4sIERNQV9CQVNFICsgRE1BX0RDUik7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCV9fcmF3X3dyaXRlbCgoMSA8PCBJTVhfRE1BX0NIQU5ORUxTKSAtIDEsIERNQV9CQVNFICsgRE1BX0RJU1IpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJX19yYXdfd3JpdGVsKCgxIDw8IElNWF9ETUFfQ0hBTk5FTFMpIC0gMSwgRE1BX0JBU0UgKyBETUFfRElNUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJCWlteF9kbWFfY2hhbm5lbHNbaV0uc2cgPSBOVUxMOworCQlpbXhfZG1hX2NoYW5uZWxzW2ldLmRtYV9udW0gPSBpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FyY2hfaW5pdGNhbGwoaW14X2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxYWRzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvYm9hcmQtbXgzMWFkcy5oCmluZGV4IDFiYzZmYjAuLjc0NWI0ODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ib2FyZC1teDMxYWRzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2JvYXJkLW14MzFhZHMuaApAQCAtOTAsNiArOTAsOSBAQAogI2RlZmluZSBQQkNfSU5UTUFTS19DTEVBUl9SRUcJKFBCQ19JTlRNQVNLX0NMRUFSICsgUEJDX0JBU0VfQUREUkVTUykKICNkZWZpbmUgRVhQSU9fUEFSRU5UX0lOVAlJT01VWF9UT19JUlEoTVgzMV9QSU5fR1BJTzFfNCkKIAorI2RlZmluZSBNWENfRVhQX0lPX0JBU0UJCShNWENfTUFYX0lOVF9MSU5FUyArIE1YQ19NQVhfR1BJT19MSU5FUykKKyNkZWZpbmUgTVhDX0lSUV9UT19FWFBJTyhpcnEpCSgoaXJxKSAtIE1YQ19FWFBfSU9fQkFTRSkKKwogI2RlZmluZSBFWFBJT19JTlRfTE9XX0JBVAkoTVhDX0VYUF9JT19CQVNFICsgMCkKICNkZWZpbmUgRVhQSU9fSU5UX1BCX0lSUQkoTVhDX0VYUF9JT19CQVNFICsgMSkKICNkZWZpbmUgRVhQSU9fSU5UX09UR19GU19PVlIJKE1YQ19FWFBfSU9fQkFTRSArIDIpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jbG9jay5oCmluZGV4IDI0Y2FhMmIuLmQyMWY3OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jbG9jay5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jbG9jay5oCkBAIC0zOSw3ICszOSw3IEBACiAJLyogUmVnaXN0ZXIgYml0IHBvc2l0aW9uIGZvciBjbG9jaydzIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2wuICovCiAJdTggZW5hYmxlX3NoaWZ0OwogCS8qIFJlZ2lzdGVyIGFkZHJlc3MgZm9yIGNsb2NrJ3MgZW5hYmxlL2Rpc2FibGUgY29udHJvbC4gKi8KLQl1MzIgZW5hYmxlX3JlZzsKKwl2b2lkIF9faW9tZW0gKmVuYWJsZV9yZWc7CiAJdTMyIGZsYWdzOwogCS8qIGdldCB0aGUgY3VycmVudCBjbG9jayByYXRlIChhbHdheXMgYSBmcmVzaCB2YWx1ZSkgKi8KIAl1bnNpZ25lZCBsb25nICgqZ2V0X3JhdGUpIChzdHJ1Y3QgY2xrICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCmluZGV4IGE2ZDJlMjQuLjYzNTAyODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY29tbW9uLmgKQEAgLTExLDEwICsxMSwxMyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19DT01NT05fSF9fCiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0NPTU1PTl9IX18KIAorc3RydWN0IHBsYXRmb3JtX2RldmljZTsKKwogZXh0ZXJuIHZvaWQgbXhjX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIG14Y19pbml0X2lycSh2b2lkKTsKIGV4dGVybiB2b2lkIG14Y190aW1lcl9pbml0KGNvbnN0IGNoYXIgKmNsa190aW1lcik7CiBleHRlcm4gaW50IG14Y19jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpOwogZXh0ZXJuIGludCBteGNfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7CitleHRlcm4gaW50IG14Y19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqZGF0YSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVmZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS1teDEtbXgyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLW14MS1teDIuaAorICoKKyAqICBpLk1YIERNQSByZWdpc3RyYXRpb24gYW5kIElSUSBkaXNwYXRjaGluZworICoKKyAqIENvcHlyaWdodCAyMDA2IFBhdmVsIFBpc2EgPHBpc2FAY21wLmZlbGsuY3Z1dC5jej4KKyAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4KKyAqIENvcHlyaWdodCAyMDA4IFNhc2NoYSBIYXVlciwgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2lmbmRlZiBfX0FTTV9BUkNIX01YQ19ETUFfSAorI2RlZmluZSBfX0FTTV9BUkNIX01YQ19ETUFfSAorCisjZGVmaW5lIElNWF9ETUFfQ0hBTk5FTFMgIDE2CisKKyNkZWZpbmUgRE1BX0JBU0UgSU9fQUREUkVTUyhETUFfQkFTRV9BRERSKQorCisjZGVmaW5lIElNWF9ETUFfTUVNU0laRV8zMgkoMCA8PCA0KQorI2RlZmluZSBJTVhfRE1BX01FTVNJWkVfOAkoMSA8PCA0KQorI2RlZmluZSBJTVhfRE1BX01FTVNJWkVfMTYJKDIgPDwgNCkKKyNkZWZpbmUgSU1YX0RNQV9UWVBFX0xJTkVBUgkoMCA8PCAxMCkKKyNkZWZpbmUgSU1YX0RNQV9UWVBFXzJECQkoMSA8PCAxMCkKKyNkZWZpbmUgSU1YX0RNQV9UWVBFX0ZJRk8JKDIgPDwgMTApCisKKyNkZWZpbmUgSU1YX0RNQV9FUlJfQlVSU1QgICAgICgxIDw8IDApCisjZGVmaW5lIElNWF9ETUFfRVJSX1JFUVVFU1QgICAoMSA8PCAxKQorI2RlZmluZSBJTVhfRE1BX0VSUl9UUkFOU0ZFUiAgKDEgPDwgMikKKyNkZWZpbmUgSU1YX0RNQV9FUlJfQlVGRkVSICAgICgxIDw8IDMpCisjZGVmaW5lIElNWF9ETUFfRVJSX1RJTUVPVVQgICAoMSA8PCA0KQorCitpbnQKK2lteF9kbWFfY29uZmlnX2NoYW5uZWwoaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBjb25maWdfcG9ydCwKKwl1bnNpZ25lZCBpbnQgY29uZmlnX21lbSwgdW5zaWduZWQgaW50IGRtYXJlcSwgaW50IGh3X2NoYWluaW5nKTsKKwordm9pZAoraW14X2RtYV9jb25maWdfYnVyc3RsZW4oaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBidXJzdGxlbik7CisKK2ludAoraW14X2RtYV9zZXR1cF9zaW5nbGUoaW50IGNoYW5uZWwsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCisJCXVuc2lnbmVkIGludCBkbWFfbGVuZ3RoLCB1bnNpZ25lZCBpbnQgZGV2X2FkZHIsCisJCWRtYW1vZGVfdCBkbWFtb2RlKTsKKworaW50CitpbXhfZG1hX3NldHVwX3NnKGludCBjaGFubmVsLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQl1bnNpZ25lZCBpbnQgc2djb3VudCwgdW5zaWduZWQgaW50IGRtYV9sZW5ndGgsCisJCXVuc2lnbmVkIGludCBkZXZfYWRkciwgZG1hbW9kZV90IGRtYW1vZGUpOworCitpbnQKK2lteF9kbWFfc2V0dXBfaGFuZGxlcnMoaW50IGNoYW5uZWwsCisJCXZvaWQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqKSwKKwkJdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIGludCksIHZvaWQgKmRhdGEpOworCitpbnQKK2lteF9kbWFfc2V0dXBfcHJvZ3Jlc3Npb25faGFuZGxlcihpbnQgY2hhbm5lbCwKKwkJdm9pZCAoKnByb2dfaGFuZGxlcikgKGludCwgdm9pZCosIHN0cnVjdCBzY2F0dGVybGlzdCopKTsKKwordm9pZCBpbXhfZG1hX2VuYWJsZShpbnQgY2hhbm5lbCk7CisKK3ZvaWQgaW14X2RtYV9kaXNhYmxlKGludCBjaGFubmVsKTsKKworaW50IGlteF9kbWFfcmVxdWVzdChpbnQgY2hhbm5lbCwgY29uc3QgY2hhciAqbmFtZSk7CisKK3ZvaWQgaW14X2RtYV9mcmVlKGludCBjaGFubmVsKTsKKworZW51bSBpbXhfZG1hX3ByaW8geworCURNQV9QUklPX0hJR0ggPSAwLAorCURNQV9QUklPX01FRElVTSA9IDEsCisJRE1BX1BSSU9fTE9XID0gMgorfTsKKworaW50IGlteF9kbWFfcmVxdWVzdF9ieV9wcmlvKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gaW14X2RtYV9wcmlvIHByaW8pOworCisjZW5kaWYJLyogX0FTTV9BUkNIX01YQ19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwppbmRleCBiNTQyNDMzLi4xMTYzMjAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtOSwxMSArOSwxNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2RlZmluZSBBVklDX05JTUFTSwkweDA0CisKIAlAIHRoaXMgbWFjcm8gZGlzYWJsZXMgZmFzdCBpcnEgKG5vdCBpbXBsZW1lbnRlZCkKIAkubWFjcm8JZGlzYWJsZV9maXEKIAkuZW5kbQogCiAJLm1hY3JvICBnZXRfaXJxbnJfcHJlYW1ibGUsIGJhc2UsIHRtcAorCWxkcglcYmFzZSwgPUFWSUNfSU9fQUREUkVTUyhBVklDX0JBU0VfQUREUikKKyNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgorCWxkcglyNCwgW1xiYXNlLCAjQVZJQ19OSU1BU0tdCisjZW5kaWYKIAkuZW5kbQogCiAJLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCkBAIC0yMyw3ICsyOSw2IEBACiAJQCBhbmQgcmV0dXJucyBpdHMgbnVtYmVyIGluIGlycW5yCiAJQCBhbmQgcmV0dXJucyBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZCBpbiBpcnFzdGF0CiAJLm1hY3JvCWdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCWxkcglcYmFzZSwgPUFWSUNfSU9fQUREUkVTUyhBVklDX0JBU0VfQUREUikKIAlAIExvYWQgb2Zmc2V0ICYgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkKIAlAIGludGVycnVwdCBwZW5kaW5nIGZyb20gQVZJQ19OSVZFQ1NSCiAJbGRyCVxpcnFzdGF0LCBbXGJhc2UsICMweDQwXQpAQCAtMzIsNiArMzcsMTEgQEAKIAltb3YJXGlycW5yLCBcaXJxc3RhdCwgYXNyICMxNgogCUAgc2V0IHplcm8gZmxhZyBpZiBJUlEgKyAxID09IDAKIAlhZGRzCVx0bXAsIFxpcnFuciwgIzEKKyNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgorCWJpY25lCVx0bXAsIFxpcnFzdGF0LCAjMHhGRkZGRkZFMAorCXN0cm5lCVx0bXAsIFtcYmFzZSwgI0FWSUNfTklNQVNLXQorCXN0cmVxCXI0LCBbXGJhc2UsICNBVklDX05JTUFTS10KKyNlbmRpZgogCS5lbmRtCiAKIAlAIGlycSBwcmlvcml0eSB0YWJsZSAobm90IHVzZWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgxLW14Mi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14MS1teDIuaAppbmRleCAwNzZkMzdiLi4zZDA5YmZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgxLW14Mi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDEtbXgyLmgKQEAgLTI0Nyw2ICsyNDcsMTEgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfTVgyCisjZGVmaW5lIFBBMF9QRl9VU0JIMl9DTEsJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMCkKKyNkZWZpbmUgUEExX1BGX1VTQkgyX0RJUgkoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCAxKQorI2RlZmluZSBQQTJfUEZfVVNCSDJfREFUQTcJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMikKKyNkZWZpbmUgUEEzX1BGX1VTQkgyX05YVAkoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCAzKQorI2RlZmluZSBQQTRfUEZfVVNCSDJfU1RQCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDQpCiAjZGVmaW5lIFBBNV9QRl9MU0NMSwkJKEdQSU9fUE9SVEEgfCBHUElPX09VVCB8IEdQSU9fUEYgfCA1KQogI2RlZmluZSBQQTZfUEZfTEQwCQkoR1BJT19QT1JUQSB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDYpCiAjZGVmaW5lIFBBN19QRl9MRDEJCShHUElPX1BPUlRBIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgNykKQEAgLTI5NCw2ICsyOTksMTYgQEAKICNkZWZpbmUgUEIyMF9BRl9VQVJUNV9DVFMJKEdQSU9fUE9SVEIgfCBHUElPX09VVCB8IEdQSU9fQUYgfCAyMCkKICNkZWZpbmUgUEIyMV9QRl9DU0lfSFNZTkMJKEdQSU9fUE9SVEIgfCBHUElPX09VVCB8IEdQSU9fUEYgfCAyMSkKICNkZWZpbmUgUEIyMV9BRl9VQVJUNV9SVFMJKEdQSU9fUE9SVEIgfCBHUElPX0lOICB8IEdQSU9fQUYgfCAyMSkKKyNkZWZpbmUgUEIyMl9QRl9VU0JIMV9TVVNQCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IDIyKQorI2RlZmluZSBQQjIzX1BGX1VTQl9QV1IJCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IDIzKQorI2RlZmluZSBQQjI0X1BGX1VTQl9PQ19CCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IDI0KQorI2RlZmluZSBQQjI1X1BGX1VTQkgxX1JDVgkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAyNSkKKyNkZWZpbmUgUEIyNl9QRl9VU0JIMV9GUwkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAyNikKKyNkZWZpbmUgUEIyN19QRl9VU0JIMV9PRV9CCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IDI3KQorI2RlZmluZSBQQjI4X1BGX1VTQkgxX1RYRE0JKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjgpCisjZGVmaW5lIFBCMjlfUEZfVVNCSDFfVFhEUAkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAyOSkKKyNkZWZpbmUgUEIzMF9QRl9VU0JIMV9SWERNCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IDMwKQorI2RlZmluZSBQQjMxX1BGX1VTQkgxX1JYRFAJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMzEpCiAjZGVmaW5lIFBCMjZfQUZfVUFSVDRfUlRTCShHUElPX1BPUlRCIHwgR1BJT19JTiAgfCBHUElPX1BGIHwgMjYpCiAjZGVmaW5lIFBCMjhfQUZfVUFSVDRfVFhECShHUElPX1BPUlRCIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgMjgpCiAjZGVmaW5lIFBCMjlfQUZfVUFSVDRfQ1RTCShHUElPX1BPUlRCIHwgR1BJT19PVVQgfCBHUElPX0FGIHwgMjkpCkBAIC0zMzUsOCArMzUwLDE1IEBACiAjZGVmaW5lIFBEMTZfQUlOX0ZFQ19UWF9FUgkoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19BSU4gfCAxNikKICNkZWZpbmUgUEQxN19QRl9JMkNfREFUQQkoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDE3KQogI2RlZmluZSBQRDE4X1BGX0kyQ19DTEsJCShHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTgpCisjZGVmaW5lIFBEMTlfQUZfVVNCSDJfREFUQTQJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMTkpCisjZGVmaW5lIFBEMjBfQUZfVVNCSDJfREFUQTMJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjApCisjZGVmaW5lIFBEMjFfQUZfVVNCSDJfREFUQTYJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjEpCisjZGVmaW5lIFBEMjJfQUZfVVNCSDJfREFUQTAJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjIpCisjZGVmaW5lIFBEMjNfQUZfVVNCSDJfREFUQTIJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjMpCisjZGVmaW5lIFBEMjRfQUZfVVNCSDJfREFUQTEJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjQpCiAjZGVmaW5lIFBEMjVfUEZfQ1NQSTFfUkRZCShHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGICB8IDI1KQogI2RlZmluZSBQRDI2X1BGX0NTUEkxX1NTMgkoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiAgfCAyNikKKyNkZWZpbmUgUEQyNl9BRl9VU0JIMl9EQVRBNSAgICAgKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgMjYpCiAjZGVmaW5lIFBEMjdfUEZfQ1NQSTFfU1MxCShHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGICB8IDI3KQogI2RlZmluZSBQRDI4X1BGX0NTUEkxX1NTMAkoR1BJT19QT1JURCB8IEdQSU9fT1VUIHwgR1BJT19QRiAgfCAyOCkKICNkZWZpbmUgUEQyOV9QRl9DU1BJMV9TQ0xLCShHUElPX1BPUlREIHwgR1BJT19PVVQgfCBHUElPX1BGICB8IDI5KQpAQCAtMzU1LDYgKzM3Nyw4IEBACiAjZGVmaW5lIFBFMTNfUEZfVUFSVDFfUlhECShHUElPX1BPUlRFIHwgR1BJT19JTiAgfCBHUElPX1BGIHwgMTMpCiAjZGVmaW5lIFBFMTRfUEZfVUFSVDFfQ1RTCShHUElPX1BPUlRFIHwgR1BJT19PVVQgfCBHUElPX1BGIHwgMTQpCiAjZGVmaW5lIFBFMTVfUEZfVUFSVDFfUlRTCShHUElPX1BPUlRFIHwgR1BJT19JTiAgfCBHUElPX1BGIHwgMTUpCisjZGVmaW5lIFBFMTZfQUZfUlRDSwkJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fQUYgfCAxNikKKyNkZWZpbmUgUEUxNl9QRl9SVENLCQkoR1BJT19QT1JURSB8IEdQSU9fT1VUIHwgR1BJT19QRiB8IDE2KQogI2RlZmluZSBQRTE4X0FGX0NTUEkzX01JU08JKEdQSU9fUE9SVEUgfCBHUElPX0lOICB8IEdQSU9fQUYgfCAxOCkKICNkZWZpbmUgUEUyMV9BRl9DU1BJM19TUwkoR1BJT19QT1JURSB8IEdQSU9fT1VUIHwgR1BJT19BRiB8IDIxKQogI2RlZmluZSBQRTIyX0FGX0NTUEkzX01PU0kJKEdQSU9fUE9SVEUgfCBHUElPX09VVCB8IEdQSU9fQUYgfCAyMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaAppbmRleCA3NTA5ZTc2Li5jOWYzOWMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oCkBAIC00OTEsNiArNDkxLDI2IEBACiAjZGVmaW5lIE1YMzFfUElOX1JUUzFfX1JUUzEJCUlPTVVYX01PREUoTVgzMV9QSU5fUlRTMSwgSU9NVVhfQ09ORklHX0ZVTkMpCiAjZGVmaW5lIE1YMzFfUElOX1RYRDFfX1RYRDEJCUlPTVVYX01PREUoTVgzMV9QSU5fVFhEMSwgSU9NVVhfQ09ORklHX0ZVTkMpCiAjZGVmaW5lIE1YMzFfUElOX1JYRDFfX1JYRDEJCUlPTVVYX01PREUoTVgzMV9QSU5fUlhEMSwgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX0NTUEkxX01PU0lfX01PU0kJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMV9NT1NJLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTFfTUlTT19fTUlTTwlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkxX01JU08sIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJMV9TQ0xLX19TQ0xLCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTFfU0NMSywgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX0NTUEkxX1NQSV9SRFlfX1NQSV9SRFkJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMV9TUElfUkRZLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTFfU1MwX19TUzAJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTFfU1MwLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTFfU1MxX19TUzEJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTFfU1MxLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTFfU1MyX19TUzIJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTFfU1MyLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTJfTU9TSV9fTU9TSQlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkyX01PU0ksIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJMl9NSVNPX19NSVNPCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTJfTUlTTywgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX0NTUEkyX1NDTEtfX1NDTEsJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9TQ0xLLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTJfU1BJX1JEWV9fU1BJX1JEWQlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkyX1NQSV9SRFksIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJMl9TUzBfX1NTMAkJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9TUzAsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJMl9TUzFfX1NTMQkJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9TUzEsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJMl9TUzJfX1NTMgkJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9TUzIsIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJM19NT1NJX19NT1NJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTNfTU9TSSwgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX0NTUEkzX01JU09fX01JU08JSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJM19NSVNPLCBJT01VWF9DT05GSUdfRlVOQykKKyNkZWZpbmUgTVgzMV9QSU5fQ1NQSTNfU0NMS19fU0NMSwlJT01VWF9NT0RFKE1YMzFfUElOX0NTUEkzX1NDTEssIElPTVVYX0NPTkZJR19GVU5DKQorI2RlZmluZSBNWDMxX1BJTl9DU1BJM19TUElfUkRZX19TUElfUkRZCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NQSTNfU1BJX1JEWSwgSU9NVVhfQ09ORklHX0ZVTkMpCisvKlhYWDogVGhlIFNTMCwgU1MxLCBTUzIsIFNTMyBsaW5lcyBvZiBzcGkzIGFyZSBtdWx0aXBsZXhlZCBieSBjc3BpMl9zczAsIGNzcGkyX3NzMSwgY3NwaTFfc3MwCisgKiBjc3BpMV9zczEqLwogCiAvKgogICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBwYWQgdmFsdWUgZm9yIGEgSU9NVVggcGluLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggMjI4YzRmNi4uYjU1YmJhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xMiw1ICsxMiw2IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0lSUVNfSF9fCiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CitleHRlcm4gdm9pZCBpbXhfaXJxX3NldF9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGlycSwgdW5zaWduZWQgY2hhciBwcmlvKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVhDX0lSUVNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaAppbmRleCAyMTJlY2MyLi5hODZkYjY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmgKQEAgLTEyOCw2ICsxMjgsNyBAQAogICogaXQgcmV0dXJucyAweERFQURCRUVGCiAgKi8KICNkZWZpbmUgSU9fQUREUkVTUyh4KSAgIFwKKwkodm9pZCBfX2lvbWVtICopIFwKIAkoKCh4ID49IEFJUElfQkFTRV9BRERSKSAmJiAoeCA8IChBSVBJX0JBU0VfQUREUiArIEFJUElfU0laRSkpKSA/IFwKIAkJQUlQSV9JT19BRERSRVNTKHgpIDogXAogCSgoeCA+PSBTQUhCMV9CQVNFX0FERFIpICYmICh4IDwgKFNBSEIxX0JBU0VfQUREUiArIFNBSEIxX1NJWkUpKSkgPyBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaAppbmRleCBhNzM3M2U0Li4wNTM2Zjg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmgKQEAgLTE5OCw2ICsxOTgsNyBAQAogICogaXQgcmV0dXJucyAweERFQURCRUVGCiAgKi8KICNkZWZpbmUgSU9fQUREUkVTUyh4KSAgIFwKKwkodm9pZCBfX2lvbWVtICopIFwKIAkoKCh4ID49IElSQU1fQkFTRV9BRERSKSAmJiAoeCA8IChJUkFNX0JBU0VfQUREUiArIElSQU1fU0laRSkpKSA/IElSQU1fSU9fQUREUkVTUyh4KTpcCiAJKCh4ID49IEwyQ0NfQkFTRV9BRERSKSAmJiAoeCA8IChMMkNDX0JBU0VfQUREUiArIEwyQ0NfU0laRSkpKSA/IEwyQ0NfSU9fQUREUkVTUyh4KTpcCiAJKCh4ID49IEFJUFMxX0JBU0VfQUREUikgJiYgKHggPCAoQUlQUzFfQkFTRV9BRERSICsgQUlQUzFfU0laRSkpKSA/IEFJUFMxX0lPX0FERFJFU1MoeCk6XApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oCmluZGV4IDMzMmVkYTQuLmY2Y2FhYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjLmgKQEAgLTMzLDQgKzMzLDEwIEBACiAjIGRlZmluZSBjcHVfaXNfbXgyNygpICgwKQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YMykgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NWDIpCisjZGVmaW5lIENTQ1JfVShuKSAoSU9fQUREUkVTUyhXRUlNX0JBU0VfQUREUikgKyBuICogMHgxMCkKKyNkZWZpbmUgQ1NDUl9MKG4pIChJT19BRERSRVNTKFdFSU1fQkFTRV9BRERSKSArIG4gKiAweDEwICsgMHg0KQorI2RlZmluZSBDU0NSX0EobikgKElPX0FERFJFU1MoV0VJTV9CQVNFX0FERFIpICsgbiAqIDB4MTAgKyAweDgpCisjZW5kaWYKKwogI2VuZGlmIC8qICBfX0FTTV9BUkNIX01YQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2lycS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvaXJxLmMKaW5kZXggMTA1M2I2Ni4uZDg2MmM5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaXJxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaXJxLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogCiAjZGVmaW5lIEFWSUNfQkFTRQkJSU9fQUREUkVTUyhBVklDX0JBU0VfQUREUikKQEAgLTMwLDE0ICszMCw3IEBACiAjZGVmaW5lIEFWSUNfSU5URU5BQkxFTAkJKEFWSUNfQkFTRSArIDB4MTQpCS8qIGludCBlbmFibGUgcmVnIGxvdyAqLwogI2RlZmluZSBBVklDX0lOVFRZUEVICQkoQVZJQ19CQVNFICsgMHgxOCkJLyogaW50IHR5cGUgcmVnIGhpZ2ggKi8KICNkZWZpbmUgQVZJQ19JTlRUWVBFTAkJKEFWSUNfQkFTRSArIDB4MUMpCS8qIGludCB0eXBlIHJlZyBsb3cgKi8KLSNkZWZpbmUgQVZJQ19OSVBSSU9SSVRZNwkoQVZJQ19CQVNFICsgMHgyMCkJLyogbm9ybSBpbnQgcHJpb3JpdHkgbHZsNyAqLwotI2RlZmluZSBBVklDX05JUFJJT1JJVFk2CShBVklDX0JBU0UgKyAweDI0KQkvKiBub3JtIGludCBwcmlvcml0eSBsdmw2ICovCi0jZGVmaW5lIEFWSUNfTklQUklPUklUWTUJKEFWSUNfQkFTRSArIDB4MjgpCS8qIG5vcm0gaW50IHByaW9yaXR5IGx2bDUgKi8KLSNkZWZpbmUgQVZJQ19OSVBSSU9SSVRZNAkoQVZJQ19CQVNFICsgMHgyQykJLyogbm9ybSBpbnQgcHJpb3JpdHkgbHZsNCAqLwotI2RlZmluZSBBVklDX05JUFJJT1JJVFkzCShBVklDX0JBU0UgKyAweDMwKQkvKiBub3JtIGludCBwcmlvcml0eSBsdmwzICovCi0jZGVmaW5lIEFWSUNfTklQUklPUklUWTIJKEFWSUNfQkFTRSArIDB4MzQpCS8qIG5vcm0gaW50IHByaW9yaXR5IGx2bDIgKi8KLSNkZWZpbmUgQVZJQ19OSVBSSU9SSVRZMQkoQVZJQ19CQVNFICsgMHgzOCkJLyogbm9ybSBpbnQgcHJpb3JpdHkgbHZsMSAqLwotI2RlZmluZSBBVklDX05JUFJJT1JJVFkwCShBVklDX0JBU0UgKyAweDNDKQkvKiBub3JtIGludCBwcmlvcml0eSBsdmwwICovCisjZGVmaW5lIEFWSUNfTklQUklPUklUWSh4KQkoQVZJQ19CQVNFICsgKDB4MjAgKyA0ICogKDcgLSAoeCkpKSkgLyogaW50IHByaW9yaXR5ICovCiAjZGVmaW5lIEFWSUNfTklWRUNTUgkJKEFWSUNfQkFTRSArIDB4NDApCS8qIG5vcm0gaW50IHZlY3Rvci9zdGF0dXMgKi8KICNkZWZpbmUgQVZJQ19GSVZFQ1NSCQkoQVZJQ19CQVNFICsgMHg0NCkJLyogZmFzdCBpbnQgdmVjdG9yL3N0YXR1cyAqLwogI2RlZmluZSBBVklDX0lOVFNSQ0gJCShBVklDX0JBU0UgKyAweDQ4KQkvKiBpbnQgc291cmNlIHJlZyBoaWdoICovCkBAIC01NCw2ICs0NywyNCBAQAogI2RlZmluZSBJSU1fUFJPRF9SRVZfU0gJCTMKICNkZWZpbmUgSUlNX1BST0RfUkVWX0xFTgk1CiAKKyNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgordm9pZCBpbXhfaXJxX3NldF9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGlycSwgdW5zaWduZWQgY2hhciBwcmlvKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCXVuc2lnbmVkIGludCBtYXNrID0gMHgwRiA8PCBpcnEgJSA4ICogNDsKKworCWlmIChpcnEgPiA2MykKKwkJcmV0dXJuOworCisJdGVtcCA9IF9fcmF3X3JlYWRsKEFWSUNfTklQUklPUklUWShpcnEgLyA4KSk7CisJdGVtcCAmPSB+bWFzazsKKwl0ZW1wIHw9IHByaW8gJiBtYXNrOworCisJX19yYXdfd3JpdGVsKHRlbXAsIEFWSUNfTklQUklPUklUWShpcnEgLyA4KSk7Cit9CitFWFBPUlRfU1lNQk9MKGlteF9pcnFfc2V0X3ByaW9yaXR5KTsKKyNlbmRpZgorCiAvKiBEaXNhYmxlIGludGVycnVwdCBudW1iZXIgImlycSIgaW4gdGhlIEFWSUMgKi8KIHN0YXRpYyB2b2lkIG14Y19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtMTAxLDEwICsxMTIsOSBAQAogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOwogCX0KIAotCS8qIFNldCBXRE9HMidzIGludGVycnVwdCB0aGUgaGlnaGVzdCBwcmlvcml0eSBsZXZlbCAoYml0IDI4LTMxKSAqLwotCXJlZyA9IF9fcmF3X3JlYWRsKEFWSUNfTklQUklPUklUWTYpOwotCXJlZyB8PSAoMHhGIDw8IDI4KTsKLQlfX3Jhd193cml0ZWwocmVnLCBBVklDX05JUFJJT1JJVFk2KTsKKwkvKiBTZXQgZGVmYXVsdCBwcmlvcml0eSB2YWx1ZSAoMCkgZm9yIGFsbCBJUlEncyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCV9fcmF3X3dyaXRlbCgwLCBBVklDX05JUFJJT1JJVFkoaSkpOwogCiAJLyogaW5pdCBhcmNoaXRlY3R1cmVzIGNoYWluZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlteGNfcmVnaXN0ZXJfZ3Bpb3MoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKaW5kZXggYjkxNzIwNi4uYTk0ZjBjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTE1LDYgKzE1LDkgQEAKIGNvbmZpZyBBUkNIX09NQVAyCiAJYm9vbCAiVEkgT01BUDIiCiAKK2NvbmZpZyBBUkNIX09NQVAzCisJYm9vbCAiVEkgT01BUDMiCisKIGVuZGNob2ljZQogCiBjb21tZW50ICJPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucyIKQEAgLTI5LDYgKzMyLDMwIEBACiAJZGVwZW5kcyBvbiBPTUFQX0RFQlVHX0RFVklDRVMKIAlkZWZhdWx0IHkgaWYgTEVEUyB8fCBMRURTX09NQVBfREVCVUcKIAorY29uZmlnIE9NQVBfREVCVUdfUE9XRVJET01BSU4KKwlib29sICJFbWl0IGRlYnVnIG1lc3NhZ2VzIGZyb20gcG93ZXJkb21haW4gbGF5ZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgaW4gcG93ZXJkb21haW4gbGF5ZXIKKwkgIGRlYnVnZ2luZyBtZXNzYWdlcyBmb3IgT01BUDIvMy4gICBUaGVzZSBtZXNzYWdlcyBjYW4KKwkgIHByb3ZpZGUgbW9yZSBkZXRhaWwgYXMgdG8gd2h5IHNvbWUgcG93ZXJkb21haW4gY2FsbHMKKwkgIG1heSBiZSBmYWlsaW5nLCBhbmQgd2lsbCBhbHNvIGVtaXQgYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCisJICBmb3IgZXZlcnkgcG93ZXJkb21haW4gcmVnaXN0ZXIgd3JpdGUuICBIb3dldmVyLCB0aGUKKwkgIGV4dHJhIGRldGFpbCBjb3N0cyBzb21lIG1lbW9yeS4KKworY29uZmlnIE9NQVBfREVCVUdfQ0xPQ0tET01BSU4KKwlib29sICJFbWl0IGRlYnVnIG1lc3NhZ2VzIGZyb20gY2xvY2tkb21haW4gbGF5ZXIiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgaW4gY2xvY2tkb21haW4gbGF5ZXIKKwkgIGRlYnVnZ2luZyBtZXNzYWdlcyBmb3IgT01BUDIvMy4gICBUaGVzZSBtZXNzYWdlcyBjYW4KKwkgIHByb3ZpZGUgbW9yZSBkZXRhaWwgYXMgdG8gd2h5IHNvbWUgY2xvY2tkb21haW4gY2FsbHMKKwkgIG1heSBiZSBmYWlsaW5nLCBhbmQgd2lsbCBhbHNvIGVtaXQgYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCisJICBmb3IgZXZlcnkgY2xvY2tkb21haW4gcmVnaXN0ZXIgd3JpdGUuICBIb3dldmVyLCB0aGUKKwkgIGV4dHJhIGRldGFpbCBjb3N0cyBzb21lIG1lbW9yeS4KKwogY29uZmlnIE9NQVBfUkVTRVRfQ0xPQ0tTCiAJYm9vbCAiUmVzZXQgdW51c2VkIGNsb2NrcyBkdXJpbmcgYm9vdCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUApAQCAtODgsMTMgKzExNSwxMyBAQAogCiBjb25maWcgT01BUF8zMktfVElNRVIKIAlib29sICJVc2UgMzJLSHogdGltZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDI0WFgKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQMjRYWCB8fCBBUkNIX09NQVAzNFhYCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgT01BUCAzMktIeiB0aW1lci4KIAkgIFRoaXMgdGltZXIgc2F2ZXMgcG93ZXIgY29tcGFyZWQgdG8gdGhlIE9NQVBfTVBVX1RJTUVSLCBhbmQgaGFzCiAJICBzdXBwb3J0IGZvciBubyB0aWNrIGR1cmluZyBpZGxlLiBUaGUgMzJLSHogdGltZXIgcHJvdmlkZXMgbGVzcwogCSAgaW50cmEtdGljayByZXNvbHV0aW9uIHRoYW4gT01BUF9NUFVfVElNRVIuIFRoZSAzMktIeiB0aW1lciBpcwotCSAgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBPTUFQMTZYWCBhbmQgMjRYWC4KKwkgIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgT01BUDE2WFgsIDI0WFggYW5kIDM0WFguCiAKIGVuZGNob2ljZQogCkBAIC0xMDksNyArMTM2LDcgQEAKIAogY29uZmlnIE9NQVBfRE1fVElNRVIKIAlib29sICJVc2UgZHVhbC1tb2RlIHRpbWVyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVAyNFhYCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDI0WFggfHwgQVJDSF9PTUFQMzRYWAogCWhlbHAKIAkgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBPTUFQIER1YWwtTW9kZSB0aW1lcnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQppbmRleCAyYzQwNTFjLi5kZWFmZjU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiAjIENvbW1vbiBzdXBwb3J0CiBvYmoteSA6PSBjb21tb24ubyBzcmFtLm8gY2xvY2subyBkZXZpY2VzLm8gZG1hLm8gbXV4Lm8gZ3Bpby5vIFwKLQkgdXNiLm8gZmIubworCSB1c2IubyBmYi5vIGlvLm8KIG9iai1tIDo9CiBvYmotbiA6PQogb2JqLSAgOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKaW5kZXggMTk3OTc0ZC4uYmY2YTEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKQEAgLTIyLDggKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCmluZGV4IGY0ZGZmNDIuLjA4NDNiODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKQEAgLTE4LDEyICsxOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgpAQCAtMjQ4LDYgKzI0OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBfX29tYXAyX3NldF9nbG9iYWxzKHZvaWQpCiB7CisJb21hcDJfc2V0X2dsb2JhbHNfdGFwKG9tYXAyX2dsb2JhbHMpOwogCW9tYXAyX3NldF9nbG9iYWxzX21lbW9yeShvbWFwMl9nbG9iYWxzKTsKIAlvbWFwMl9zZXRfZ2xvYmFsc19jb250cm9sKG9tYXAyX2dsb2JhbHMpOwogCW9tYXAyX3NldF9nbG9iYWxzX3ByY20ob21hcDJfZ2xvYmFscyk7CkBAIC0yNTgsMTIgKzI1OSwxMyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MjApCiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9nbG9iYWxzIG9tYXAyNDJ4X2dsb2JhbHMgPSB7Ci0JLnRhcAk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoMHg0ODAxNDAwMCksCi0JLnNkcmMJPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKE9NQVAyNDIwX1NEUkNfQkFTRSksCi0JLnNtcwk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoT01BUDI0MjBfU01TX0JBU0UpLAotCS5jdHJsCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUyhPTUFQMjQyMF9DVFJMX0JBU0UpLAotCS5wcm0JPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKE9NQVAyNDIwX1BSTV9CQVNFKSwKLQkuY20JPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKE9NQVAyNDIwX0NNX0JBU0UpLAorCS5jbGFzcwk9IE9NQVAyNDJYX0NMQVNTLAorCS50YXAJPSBPTUFQMl9JT19BRERSRVNTKDB4NDgwMTQwMDApLAorCS5zZHJjCT0gT01BUDJfSU9fQUREUkVTUyhPTUFQMjQyMF9TRFJDX0JBU0UpLAorCS5zbXMJPSBPTUFQMl9JT19BRERSRVNTKE9NQVAyNDIwX1NNU19CQVNFKSwKKwkuY3RybAk9IE9NQVAyX0lPX0FERFJFU1MoT01BUDI0MjBfQ1RSTF9CQVNFKSwKKwkucHJtCT0gT01BUDJfSU9fQUREUkVTUyhPTUFQMjQyMF9QUk1fQkFTRSksCisJLmNtCT0gT01BUDJfSU9fQUREUkVTUyhPTUFQMjQyMF9DTV9CQVNFKSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzXzI0Mngodm9pZCkKQEAgLTI3NiwxMiArMjc4LDEzIEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkKIAogc3RhdGljIHN0cnVjdCBvbWFwX2dsb2JhbHMgb21hcDI0M3hfZ2xvYmFscyA9IHsKLQkudGFwCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUygweDQ5MDBhMDAwKSwKLQkuc2RyYwk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoT01BUDI0M1hfU0RSQ19CQVNFKSwKLQkuc21zCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUyhPTUFQMjQzWF9TTVNfQkFTRSksCi0JLmN0cmwJPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKE9NQVAyNDNYX0NUUkxfQkFTRSksCi0JLnBybQk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoT01BUDI0MzBfUFJNX0JBU0UpLAotCS5jbQk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoT01BUDI0MzBfQ01fQkFTRSksCisJLmNsYXNzCT0gT01BUDI0M1hfQ0xBU1MsCisJLnRhcAk9IE9NQVAyX0lPX0FERFJFU1MoMHg0OTAwYTAwMCksCisJLnNkcmMJPSBPTUFQMl9JT19BRERSRVNTKE9NQVAyNDNYX1NEUkNfQkFTRSksCisJLnNtcwk9IE9NQVAyX0lPX0FERFJFU1MoT01BUDI0M1hfU01TX0JBU0UpLAorCS5jdHJsCT0gT01BUDJfSU9fQUREUkVTUyhPTUFQMjQzWF9DVFJMX0JBU0UpLAorCS5wcm0JPSBPTUFQMl9JT19BRERSRVNTKE9NQVAyNDMwX1BSTV9CQVNFKSwKKwkuY20JPSBPTUFQMl9JT19BRERSRVNTKE9NQVAyNDMwX0NNX0JBU0UpLAogfTsKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfMjQzeCh2b2lkKQpAQCAtMjk0LDEyICsyOTcsMTMgQEAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNDMwKQogCiBzdGF0aWMgc3RydWN0IG9tYXBfZ2xvYmFscyBvbWFwMzQzeF9nbG9iYWxzID0gewotCS50YXAJPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKDB4NDgzMEEwMDApLAotCS5zZHJjCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUyhPTUFQMzQzWF9TRFJDX0JBU0UpLAotCS5zbXMJPSAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilPTUFQMl9JT19BRERSRVNTKE9NQVAzNDNYX1NNU19CQVNFKSwKLQkuY3RybAk9IChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKU9NQVAyX0lPX0FERFJFU1MoT01BUDM0M1hfQ1RSTF9CQVNFKSwKLQkucHJtCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUyhPTUFQMzQzMF9QUk1fQkFTRSksCi0JLmNtCT0gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopT01BUDJfSU9fQUREUkVTUyhPTUFQMzQzMF9DTV9CQVNFKSwKKwkuY2xhc3MJPSBPTUFQMzQzWF9DTEFTUywKKwkudGFwCT0gT01BUDJfSU9fQUREUkVTUygweDQ4MzBBMDAwKSwKKwkuc2RyYwk9IE9NQVAyX0lPX0FERFJFU1MoT01BUDM0M1hfU0RSQ19CQVNFKSwKKwkuc21zCT0gT01BUDJfSU9fQUREUkVTUyhPTUFQMzQzWF9TTVNfQkFTRSksCisJLmN0cmwJPSBPTUFQMl9JT19BRERSRVNTKE9NQVAzNDNYX0NUUkxfQkFTRSksCisJLnBybQk9IE9NQVAyX0lPX0FERFJFU1MoT01BUDM0MzBfUFJNX0JBU0UpLAorCS5jbQk9IE9NQVAyX0lPX0FERFJFU1MoT01BUDM0MzBfQ01fQkFTRSksCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc18zNDN4KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY3B1LW9tYXAuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCmluZGV4IGFlMWRlMzAuLmIyNjkwMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjZGVmaW5lIFZFUllfSElfUkFURQk5MDAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jCmluZGV4IDViNzNiYjIuLmUzMTE1NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYwpAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1sZWRzLmMKaW5kZXggOTQyMmRlZS4uMmY0YzBjYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctbGVkcy5jCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMKaW5kZXggMTg3ZTNkOC4uMGNiMmIyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jCkBAIC0xMywyMyArMTMsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC90Yy5oPgorI2luY2x1ZGUgPG1hY2gvY29udHJvbC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9tZW5lbGF1cy5oPgogI2luY2x1ZGUgPG1hY2gvbWNic3AuaD4KKyNpbmNsdWRlIDxtYWNoL2RzcF9jb21tb24uaD4KIAogI2lmCWRlZmluZWQoQ09ORklHX09NQVBfRFNQKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX0RTUF9NT0RVTEUpCiAKLSNpbmNsdWRlICIuLi9wbGF0LW9tYXAvZHNwL2RzcF9jb21tb24uaCIKLQogc3RhdGljIHN0cnVjdCBkc3BfcGxhdGZvcm1fZGF0YSBkc3BfcGRhdGEgPSB7CiAJLmtkZXZfbGlzdCA9IExJU1RfSEVBRF9JTklUKGRzcF9wZGF0YS5rZGV2X2xpc3QpLAogfTsKQEAgLTc1LDcgKzc2LDcgQEAKIHsKIAlzdGF0aWMgREVGSU5FX01VVEVYKGRzcF9wZGF0YV9sb2NrKTsKIAotCW11dGV4X2luaXQoJmtkZXYtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZrZGV2LT5sb2NrKTsKIAogCW11dGV4X2xvY2soJmRzcF9wZGF0YV9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZrZGV2LT5lbnRyeSwgJmRzcF9wZGF0YS5rZGV2X2xpc3QpOwpAQCAtOTQsNiArOTUsMTAgQEAKIAogc3RhdGljIHZvaWQgb21hcF9pbml0X2twKHZvaWQpCiB7CisJLyogMjQzMCBhbmQgMzR4eCBrZXlwYWQgaXMgb24gVFdMNDAzMCAqLworCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkKKwkJcmV0dXJuOworCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpIHx8IG1hY2hpbmVfaXNfb21hcF9oMygpKSB7CiAJCW9tYXBfY2ZnX3JlZyhGMThfMTYxMF9LQkMwKTsKIAkJb21hcF9jZmdfcmVnKEQyMF8xNjEwX0tCQzEpOwpAQCAtMTU1LDEzICsxNjAsNiBAQAogewogCWludCBpOwogCi0JaWYgKHNpemUgPiBPTUFQX01BWF9NQ0JTUF9DT1VOVCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWdpc3RlcmVkIHRvbyBtYW55IE1jQlNQcyBwbGF0Zm9ybV9kYXRhLiIKLQkJCSIgVXNpbmcgbWF4aW11bSAoJWQpIGF2YWlsYWJsZS5cbiIsCi0JCQlPTUFQX01BWF9NQ0JTUF9DT1VOVCk7Ci0JCXNpemUgPSBPTUFQX01BWF9NQ0JTUF9DT1VOVDsKLQl9Ci0KIAlvbWFwX21jYnNwX2RldmljZXMgPSBremFsbG9jKHNpemUgKiBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghb21hcF9tY2JzcF9kZXZpY2VzKSB7CkBAIC0xOTQsMjUgKzE5MiwzOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYJZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZglkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKSB8fCBcCisJZGVmaW5lZChDT05GSUdfTU1DX09NQVBfSFMpIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTX01PRFVMRSkKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKICNkZWZpbmUJT01BUF9NTUMxX0JBU0UJCTB4NDgwOWMwMDAKLSNkZWZpbmUgT01BUF9NTUMxX0lOVAkJSU5UXzI0WFhfTU1DX0lSUQotI2Vsc2UKLSNkZWZpbmUJT01BUF9NTUMxX0JBU0UJCTB4ZmZmYjc4MDAKLSNkZWZpbmUgT01BUF9NTUMxX0lOVAkJSU5UX01NQwotI2VuZGlmCi0jZGVmaW5lCU9NQVBfTU1DMl9CQVNFCQkweGZmZmI3YzAwCS8qIG9tYXAxNnh4IG9ubHkgKi8KKyNkZWZpbmUJT01BUF9NTUMxX0VORAkJKE9NQVBfTU1DMV9CQVNFICsgMHgxZmMpCisjZGVmaW5lCU9NQVBfTU1DMV9JTlQJCUlOVF8yNFhYX01NQ19JUlEKIAotc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25mIG1tYzFfY29uZjsKKyNkZWZpbmUJT01BUF9NTUMyX0JBU0UJCTB4NDgwYjQwMDAKKyNkZWZpbmUJT01BUF9NTUMyX0VORAkJKE9NQVBfTU1DMl9CQVNFICsgMHgxZmMpCisjZGVmaW5lCU9NQVBfTU1DMl9JTlQJCUlOVF8yNFhYX01NQzJfSVJRCisKKyNlbHNlCisKKyNkZWZpbmUJT01BUF9NTUMxX0JBU0UJCTB4ZmZmYjc4MDAKKyNkZWZpbmUJT01BUF9NTUMxX0VORAkJKE9NQVBfTU1DMV9CQVNFICsgMHg3ZikKKyNkZWZpbmUgT01BUF9NTUMxX0lOVAkJSU5UX01NQworCisjZGVmaW5lCU9NQVBfTU1DMl9CQVNFCQkweGZmZmI3YzAwCS8qIG9tYXAxNnh4IG9ubHkgKi8KKyNkZWZpbmUJT01BUF9NTUMyX0VORAkJKE9NQVBfTU1DMl9CQVNFICsgMHg3ZikKKyNkZWZpbmUJT01BUF9NTUMyX0lOVAkJSU5UXzE2MTBfTU1DMgorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhIG1tYzFfZGF0YTsKIAogc3RhdGljIHU2NCBtbWMxX2RtYW1hc2sgPSAweGZmZmZmZmZmOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG1tYzFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQJCT0gT01BUF9NTUMxX0JBU0UsCi0JCS5lbmQJCT0gT01BUF9NTUMxX0JBU0UgKyAweDdmLAorCQkuZW5kCQk9IE9NQVBfTU1DMV9FTkQsCiAJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKQEAgLTIyNiwyNiArMjM3LDI3IEBACiAJLmlkCQk9IDEsCiAJLmRldiA9IHsKIAkJLmRtYV9tYXNrCT0gJm1tYzFfZG1hbWFzaywKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbW1jMV9jb25mLAorCQkucGxhdGZvcm1fZGF0YQk9ICZtbWMxX2RhdGEsCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobW1jMV9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IG1tYzFfcmVzb3VyY2VzLAogfTsKIAotI2lmZGVmCUNPTkZJR19BUkNIX09NQVAxNlhYCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZiBtbWMyX2NvbmY7CitzdGF0aWMgc3RydWN0IG9tYXBfbW1jX3BsYXRmb3JtX2RhdGEgbW1jMl9kYXRhOwogCiBzdGF0aWMgdTY0IG1tYzJfZG1hbWFzayA9IDB4ZmZmZmZmZmY7CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jMl9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydAkJPSBPTUFQX01NQzJfQkFTRSwKLQkJLmVuZAkJPSBPTUFQX01NQzJfQkFTRSArIDB4N2YsCisJCS5lbmQJCT0gT01BUF9NTUMyX0VORCwKIAkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJewotCQkuc3RhcnQJCT0gSU5UXzE2MTBfTU1DMiwKKwkJLnN0YXJ0CQk9IE9NQVBfTU1DMl9JTlQsCiAJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKQEAgLTI1NSwyNiArMjY3LDE5IEBACiAJLmlkCQk9IDIsCiAJLmRldiA9IHsKIAkJLmRtYV9tYXNrCT0gJm1tYzJfZG1hbWFzaywKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbW1jMl9jb25mLAorCQkucGxhdGZvcm1fZGF0YQk9ICZtbWMyX2RhdGEsCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobW1jMl9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IG1tYzJfcmVzb3VyY2VzLAogfTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9pbml0X21tYyh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tbWNfY29uZihjb25zdCBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnICptbWNfY29uZikKIHsKLQljb25zdCBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnCSptbWNfY29uZjsKLQljb25zdCBzdHJ1Y3Qgb21hcF9tbWNfY29uZgkqbW1jOwotCi0JLyogTk9URTogIGFzc3VtZXMgTU1DIHdhcyBuZXZlciAod3JvbmdseSkgZW5hYmxlZCAqLwotCW1tY19jb25mID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX01NQywgc3RydWN0IG9tYXBfbW1jX2NvbmZpZyk7Ci0JaWYgKCFtbWNfY29uZikKKwlpZiAoY3B1X2lzX29tYXAyNDMwKCkgfHwgY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybjsKIAotCS8qIGJsb2NrIDEgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgaGFzIGp1c3Qgb25lIHBpbm91dCBvcHRpb24gKi8KLQltbWMgPSAmbW1jX2NvbmYtPm1tY1swXTsKLQlpZiAobW1jLT5lbmFibGVkKSB7CisJaWYgKG1tY19jb25mLT5tbWNbMF0uZW5hYmxlZCkgewogCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJCW9tYXBfY2ZnX3JlZyhIMThfMjRYWF9NTUNfQ01EKTsKIAkJCW9tYXBfY2ZnX3JlZyhIMTVfMjRYWF9NTUNfQ0xLSSk7CkBAIC0yOTIsNyArMjk3LDcgQEAKIAkJCQlvbWFwX2NmZ19yZWcoUDIwXzE3MTBfTU1DX0RBVERJUjApOwogCQkJfQogCQl9Ci0JCWlmIChtbWMtPndpcmU0KSB7CisJCWlmIChtbWNfY29uZi0+bW1jWzBdLndpcmU0KSB7CiAJCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJCQlvbWFwX2NmZ19yZWcoSDE0XzI0WFhfTU1DX0RBVDEpOwogCQkJCW9tYXBfY2ZnX3JlZyhFMTlfMjRYWF9NTUNfREFUMik7CkBAIC0zMDMsMjUgKzMwOCwyMiBAQAogCQkJfSBlbHNlIHsKIAkJCQlvbWFwX2NmZ19yZWcoTU1DX0RBVDEpOwogCQkJCS8qIE5PVEU6ICBEQVQyIGNhbiBiZSBvbiBXMTAgKGhlcmUpIG9yIE0xNSAqLwotCQkJCWlmICghbW1jLT5ub211eCkKKwkJCQlpZiAoIW1tY19jb25mLT5tbWNbMF0ubm9tdXgpCiAJCQkJCW9tYXBfY2ZnX3JlZyhNTUNfREFUMik7CiAJCQkJb21hcF9jZmdfcmVnKE1NQ19EQVQzKTsKIAkJCX0KIAkJfQotCQltbWMxX2NvbmYgPSAqbW1jOwotCQkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtbWNfb21hcF9kZXZpY2UxKTsKIAl9CiAKICNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTZYWAogCS8qIGJsb2NrIDIgaXMgb24gbmV3ZXIgY2hpcHMsIGFuZCBoYXMgbWFueSBwaW5vdXQgb3B0aW9ucyAqLwotCW1tYyA9ICZtbWNfY29uZi0+bW1jWzFdOwotCWlmIChtbWMtPmVuYWJsZWQpIHsKLQkJaWYgKCFtbWMtPm5vbXV4KSB7CisJaWYgKG1tY19jb25mLT5tbWNbMV0uZW5hYmxlZCkgeworCQlpZiAoIW1tY19jb25mLT5tbWNbMV0ubm9tdXgpIHsKIAkJCW9tYXBfY2ZnX3JlZyhZOF8xNjEwX01NQzJfQ01EKTsKIAkJCW9tYXBfY2ZnX3JlZyhZMTBfMTYxMF9NTUMyX0NMSyk7CiAJCQlvbWFwX2NmZ19yZWcoUjE4XzE2MTBfTU1DMl9DTEtJTik7CiAJCQlvbWFwX2NmZ19yZWcoVzhfMTYxMF9NTUMyX0RBVDApOwotCQkJaWYgKG1tYy0+d2lyZTQpIHsKKwkJCWlmIChtbWNfY29uZi0+bW1jWzFdLndpcmU0KSB7CiAJCQkJb21hcF9jZmdfcmVnKFY4XzE2MTBfTU1DMl9EQVQxKTsKIAkJCQlvbWFwX2NmZ19yZWcoVzE1XzE2MTBfTU1DMl9EQVQyKTsKIAkJCQlvbWFwX2NmZ19yZWcoUjEwXzE2MTBfTU1DMl9EQVQzKTsKQEAgLTMzNywxNCArMzM5LDU1IEBACiAJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkKIAkJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKSB8ICgxIDw8IDI0KSwKIAkJCQkgICAgIE1PRF9DT05GX0NUUkxfMSk7Ci0JCW1tYzJfY29uZiA9ICptbWM7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2luaXRfbW1jKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IG9tYXBfbW1jX2NvbmZpZwkqbW1jX2NvbmY7CisKKwkvKiBOT1RFOiAgYXNzdW1lcyBNTUMgd2FzIG5ldmVyICh3cm9uZ2x5KSBlbmFibGVkICovCisJbW1jX2NvbmYgPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfTU1DLCBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnKTsKKwlpZiAoIW1tY19jb25mKQorCQlyZXR1cm47CisKKwlvbWFwX2luaXRfbW1jX2NvbmYobW1jX2NvbmYpOworCisJaWYgKG1tY19jb25mLT5tbWNbMF0uZW5hYmxlZCkgeworCQltbWMxX2RhdGEuY29uZiA9IG1tY19jb25mLT5tbWNbMF07CisJCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm1tY19vbWFwX2RldmljZTEpOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQorCWlmIChtbWNfY29uZi0+bW1jWzFdLmVuYWJsZWQpIHsKKwkJbW1jMl9kYXRhLmNvbmYgPSBtbWNfY29uZi0+bW1jWzFdOwogCQkodm9pZCkgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtbWNfb21hcF9kZXZpY2UyKTsKIAl9CiAjZW5kaWYKLQlyZXR1cm47CiB9CisKK3ZvaWQgb21hcF9zZXRfbW1jX2luZm8oaW50IGhvc3QsIGNvbnN0IHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICppbmZvKQoreworCXN3aXRjaCAoaG9zdCkgeworCWNhc2UgMToKKwkJbW1jMV9kYXRhID0gKmluZm87CisJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQorCWNhc2UgMjoKKwkJbW1jMl9kYXRhID0gKmluZm87CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tbWModm9pZCkge30KK3ZvaWQgb21hcF9zZXRfbW1jX2luZm8oaW50IGhvc3QsIGNvbnN0IHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICppbmZvKSB7fQogI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zOTUsMTYgKzQzOCw4IEBACiAKICNpZglkZWZpbmVkKENPTkZJR19PTUFQX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQX1dBVENIRE9HX01PRFVMRSkKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCi0jZGVmaW5lCU9NQVBfV0RUX0JBU0UJCTB4NDgwMjIwMDAKLSNlbHNlCi0jZGVmaW5lCU9NQVBfV0RUX0JBU0UJCTB4ZmZmZWIwMDAKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHdkdF9yZXNvdXJjZXNbXSA9IHsKIAl7Ci0JCS5zdGFydAkJPSBPTUFQX1dEVF9CQVNFLAotCQkuZW5kCQk9IE9NQVBfV0RUX0JBU0UgKyAweDRmLAogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIH07CkBAIC00MTgsNiArNDUzLDE5IEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfaW5pdF93ZHQodm9pZCkKIHsKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCisJCXdkdF9yZXNvdXJjZXNbMF0uc3RhcnQgPSAweGZmZmViMDAwOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMjQyMCgpKQorCQl3ZHRfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gMHg0ODAyMjAwMDsgLyogV0RUMiAqLworCWVsc2UgaWYgKGNwdV9pc19vbWFwMjQzMCgpKQorCQl3ZHRfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gMHg0OTAxNjAwMDsgLyogV0RUMiAqLworCWVsc2UgaWYgKGNwdV9pc19vbWFwMzQzeCgpKQorCQl3ZHRfcmVzb3VyY2VzWzBdLnN0YXJ0ID0gMHg0ODMxNDAwMDsgLyogV0RUMiAqLworCWVsc2UKKwkJcmV0dXJuOworCisJd2R0X3Jlc291cmNlc1swXS5lbmQgPSB3ZHRfcmVzb3VyY2VzWzBdLnN0YXJ0ICsgMHg0ZjsKKwogCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXBfd2R0X2RldmljZSk7CiB9CiAjZWxzZQpAQCAtNDc5LDEwICs1MjcsNiBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXRfZGV2aWNlcyh2b2lkKQogewotLyoKLSAqIE5lZWQgdG8gZW5hYmxlIHJlbGV2YW50IG9uY2UgZm9yIDI0MzAgU0RQCi0gKi8KLSNpZm5kZWYgQ09ORklHX01BQ0hfT01BUF8yNDMwU0RQCiAJLyogcGxlYXNlIGtlZXAgdGhlc2UgY2FsbHMsIGFuZCB0aGVpciBpbXBsZW1lbnRhdGlvbnMgYWJvdmUsCiAJICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHNvIHRoZXkncmUgZWFzaWVyIHRvIHNvcnQgdGhyb3VnaC4KIAkgKi8KQEAgLTQ5Miw3ICs1MzYsNiBAQAogCW9tYXBfaW5pdF91d2lyZSgpOwogCW9tYXBfaW5pdF93ZHQoKTsKIAlvbWFwX2luaXRfcm5nKCk7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwob21hcF9pbml0X2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCmluZGV4IGE2M2I2NDQuLjUwZjhiNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKQEAgLTEyMzMsNyArMTIzMyw3IEBACiAJLyogcmVxdWVzdCBhbmQgcmVzZXJ2ZSBETUEgY2hhbm5lbHMgZm9yIHRoZSBjaGFpbiAqLwogCWZvciAoaSA9IDA7IGkgPCBub19vZl9jaGFuczsgaSsrKSB7CiAJCWVyciA9IG9tYXBfcmVxdWVzdF9kbWEoZGV2X2lkLCBkZXZfbmFtZSwKLQkJCQkJY2FsbGJhY2ssIDAsICZjaGFubmVsc1tpXSk7CisJCQkJCWNhbGxiYWNrLCBOVUxMLCAmY2hhbm5lbHNbaV0pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaW50IGo7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQpAQCAtMjI5NywxMyArMjI5NywxMyBAQAogCWludCBjaCwgcjsKIAogCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQlvbWFwX2RtYV9iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDFfRE1BX0JBU0UpOworCQlvbWFwX2RtYV9iYXNlID0gSU9fQUREUkVTUyhPTUFQMV9ETUFfQkFTRSk7CiAJCWRtYV9sY2hfY291bnQgPSBPTUFQMV9MT0dJQ0FMX0RNQV9DSF9DT1VOVDsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCW9tYXBfZG1hX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhPTUFQMjRYWF9ETUE0X0JBU0UpOworCQlvbWFwX2RtYV9iYXNlID0gSU9fQUREUkVTUyhPTUFQMjRYWF9ETUE0X0JBU0UpOwogCQlkbWFfbGNoX2NvdW50ID0gT01BUF9ETUE0X0xPR0lDQUxfRE1BX0NIX0NPVU5UOwogCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJb21hcF9kbWFfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKE9NQVAzNFhYX0RNQTRfQkFTRSk7CisJCW9tYXBfZG1hX2Jhc2UgPSBJT19BRERSRVNTKE9NQVAzNFhYX0RNQTRfQkFTRSk7CiAJCWRtYV9sY2hfY291bnQgPSBPTUFQX0RNQTRfTE9HSUNBTF9ETUFfQ0hfQ09VTlQ7CiAJfSBlbHNlIHsKIAkJcHJfZXJyKCJETUEgaW5pdCBmYWlsZWQgZm9yIHVuc3VwcG9ydGVkIG9tYXBcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKaW5kZXggNzQzYTRhYi4uOTYzYzMxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCkBAIC0zMiw5ICszMiw5IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9kbXRpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKIC8qIHJlZ2lzdGVyIG9mZnNldHMgKi8KQEAgLTY5Myw3ICs2OTMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGRtX3RpbWVyX2NvdW50OyBpKyspIHsKIAkJdGltZXIgPSAmZG1fdGltZXJzW2ldOwotCQl0aW1lci0+aW9fYmFzZSA9ICh2b2lkIF9faW9tZW0gKilpb19wMnYodGltZXItPnBoeXNfYmFzZSk7CisJCXRpbWVyLT5pb19iYXNlID0gSU9fQUREUkVTUyh0aW1lci0+cGh5c19iYXNlKTsKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQogCQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKIAkJCWNoYXIgY2xrX25hbWVbMTZdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYwppbmRleCAxN2E5MmEzLi5jZTZiNGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYwpAQCAtMjcsOSArMjcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCmluZGV4IDNlNzZlZTIuLjg2NzlmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMjQsMTIgKzI1LDEwIEBACiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLQogLyoKICAqIE9NQVAxNTEwIEdQSU8gcmVnaXN0ZXJzCiAgKi8KLSNkZWZpbmUgT01BUDE1MTBfR1BJT19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZjZTAwMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCUlPX0FERFJFU1MoMHhmZmZjZTAwMCkKICNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKICNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVAkweDA0CiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOApAQCAtNDMsMTAgKzQyLDEwIEBACiAvKgogICogT01BUDE2MTAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTQwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZWMwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYjQwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYmMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQlJT19BRERSRVNTKDB4ZmZmYmU0MDApCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8yX0JBU0UJCUlPX0FERFJFU1MoMHhmZmZiZWMwMCkKKyNkZWZpbmUgT01BUDE2MTBfR1BJTzNfQkFTRQkJSU9fQUREUkVTUygweGZmZmJiNDAwKQorI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQlJT19BRERSRVNTKDB4ZmZmYmJjMDApCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fUkVWSVNJT04JCTB4MDAwMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU0NPTkZJRwkJMHgwMDEwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTU1RBVFVTCQkweDAwMTQKQEAgLTY4LDEyICs2NywxMiBAQAogLyoKICAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJjMDAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmM4MDAKLSNkZWZpbmUgT01BUDczMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZDAwMAotI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJkODAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzVfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmUwMDAKLSNkZWZpbmUgT01BUDczMF9HUElPNl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCUlPX0FERFJFU1MoMHhmZmZiYzAwMCkKKyNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQlJT19BRERSRVNTKDB4ZmZmYmM4MDApCisjZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJSU9fQUREUkVTUygweGZmZmJkMDAwKQorI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCUlPX0FERFJFU1MoMHhmZmZiZDgwMCkKKyNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQlJT19BRERSRVNTKDB4ZmZmYmUwMDApCisjZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJSU9fQUREUkVTUygweGZmZmJlODAwKQogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAogI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOApAQCAtODQsMTYgKzgzLDE2IEBACiAvKgogICogb21hcDI0eHggc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQMjQyWF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxODAwMAotI2RlZmluZSBPTUFQMjQyWF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYTAwMAotI2RlZmluZSBPTUFQMjQyWF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYzAwMAotI2RlZmluZSBPTUFQMjQyWF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxZTAwMAorI2RlZmluZSBPTUFQMjQyWF9HUElPMV9CQVNFCQlJT19BRERSRVNTKDB4NDgwMTgwMDApCisjZGVmaW5lIE9NQVAyNDJYX0dQSU8yX0JBU0UJCUlPX0FERFJFU1MoMHg0ODAxYTAwMCkKKyNkZWZpbmUgT01BUDI0MlhfR1BJTzNfQkFTRQkJSU9fQUREUkVTUygweDQ4MDFjMDAwKQorI2RlZmluZSBPTUFQMjQyWF9HUElPNF9CQVNFCQlJT19BRERSRVNTKDB4NDgwMWUwMDApCiAKLSNkZWZpbmUgT01BUDI0M1hfR1BJTzFfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwMEMwMDAKLSNkZWZpbmUgT01BUDI0M1hfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwMEUwMDAKLSNkZWZpbmUgT01BUDI0M1hfR1BJTzNfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwMTAwMDAKLSNkZWZpbmUgT01BUDI0M1hfR1BJTzRfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwMTIwMDAKLSNkZWZpbmUgT01BUDI0M1hfR1BJTzVfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDgwQjYwMDAKKyNkZWZpbmUgT01BUDI0M1hfR1BJTzFfQkFTRQkJSU9fQUREUkVTUygweDQ5MDBDMDAwKQorI2RlZmluZSBPTUFQMjQzWF9HUElPMl9CQVNFCQlJT19BRERSRVNTKDB4NDkwMEUwMDApCisjZGVmaW5lIE9NQVAyNDNYX0dQSU8zX0JBU0UJCUlPX0FERFJFU1MoMHg0OTAxMDAwMCkKKyNkZWZpbmUgT01BUDI0M1hfR1BJTzRfQkFTRQkJSU9fQUREUkVTUygweDQ5MDEyMDAwKQorI2RlZmluZSBPTUFQMjQzWF9HUElPNV9CQVNFCQlJT19BRERSRVNTKDB4NDgwQjYwMDApCiAKICNkZWZpbmUgT01BUDI0WFhfR1BJT19SRVZJU0lPTgkJMHgwMDAwCiAjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKQEAgLTEyMywxMyArMTIyLDE0IEBACiAgKiBvbWFwMzR4eCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwogICovCiAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzFfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDgzMTAwMDAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwNTAwMDAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzNfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwNTIwMDAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzRfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwNTQwMDAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzVfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwNTYwMDAKLSNkZWZpbmUgT01BUDM0WFhfR1BJTzZfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4NDkwNTgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BJTzFfQkFTRQkJSU9fQUREUkVTUygweDQ4MzEwMDAwKQorI2RlZmluZSBPTUFQMzRYWF9HUElPMl9CQVNFCQlJT19BRERSRVNTKDB4NDkwNTAwMDApCisjZGVmaW5lIE9NQVAzNFhYX0dQSU8zX0JBU0UJCUlPX0FERFJFU1MoMHg0OTA1MjAwMCkKKyNkZWZpbmUgT01BUDM0WFhfR1BJTzRfQkFTRQkJSU9fQUREUkVTUygweDQ5MDU0MDAwKQorI2RlZmluZSBPTUFQMzRYWF9HUElPNV9CQVNFCQlJT19BRERSRVNTKDB4NDkwNTYwMDApCisjZGVmaW5lIE9NQVAzNFhYX0dQSU82X0JBU0UJCUlPX0FERFJFU1MoMHg0OTA1ODAwMCkKIAorI2RlZmluZSBPTUFQX01QVUlPX1ZCQVNFCQlJT19BRERSRVNTKE9NQVBfTVBVSU9fQkFTRSkKIAogc3RydWN0IGdwaW9fYmFuayB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7Ci0JeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKKwl7IE9NQVBfTVBVSU9fVkJBU0UsICAgIElOVF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsICAgICBNRVRIT0RfTVBVSU99LAogCXsgT01BUDE2MTBfR1BJTzFfQkFTRSwgSU5UX0dQSU9fQkFOSzEsCSAgICBJSF9HUElPX0JBU0UsICAgICAgTUVUSE9EX0dQSU9fMTYxMCB9LAogCXsgT01BUDE2MTBfR1BJTzJfQkFTRSwgSU5UXzE2MTBfR1BJT19CQU5LMiwgSUhfR1BJT19CQVNFICsgMTYsIE1FVEhPRF9HUElPXzE2MTAgfSwKIAl7IE9NQVAxNjEwX0dQSU8zX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzMsIElIX0dQSU9fQkFTRSArIDMyLCBNRVRIT0RfR1BJT18xNjEwIH0sCkBAIC0xNzEsMTQgKzE3MSwxNCBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19iYW5rIGdwaW9fYmFua18xNTEwWzJdID0gewotCXsgT01BUF9NUFVJT19CQVNFLCAgICBJTlRfTVBVSU8sICAgICAgSUhfTVBVSU9fQkFTRSwgTUVUSE9EX01QVUlPIH0sCisJeyBPTUFQX01QVUlPX1ZCQVNFLCAgIElOVF9NUFVJTywgICAgICBJSF9NUFVJT19CQVNFLCBNRVRIT0RfTVBVSU8gfSwKIAl7IE9NQVAxNTEwX0dQSU9fQkFTRSwgSU5UX0dQSU9fQkFOSzEsIElIX0dQSU9fQkFTRSwgIE1FVEhPRF9HUElPXzE1MTAgfQogfTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzczMFs3XSA9IHsKLQl7IE9NQVBfTVBVSU9fQkFTRSwgICAgIElOVF83MzBfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLAlNRVRIT0RfTVBVSU8gfSwKKwl7IE9NQVBfTVBVSU9fVkJBU0UsICAgIElOVF83MzBfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLAlNRVRIT0RfTVBVSU8gfSwKIAl7IE9NQVA3MzBfR1BJTzFfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMSwgIElIX0dQSU9fQkFTRSwJTUVUSE9EX0dQSU9fNzMwIH0sCiAJeyBPTUFQNzMwX0dQSU8yX0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzIsICBJSF9HUElPX0JBU0UgKyAzMiwJTUVUSE9EX0dQSU9fNzMwIH0sCiAJeyBPTUFQNzMwX0dQSU8zX0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzMsICBJSF9HUElPX0JBU0UgKyA2NCwJTUVUSE9EX0dQSU9fNzMwIH0sCkBAIC0xMDUxLDEzICsxMDUxLDEwIEBACiAKIAkJZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKIAkJZm9yICg7IGlzciAhPSAwOyBpc3IgPj49IDEsIGdwaW9faXJxKyspIHsKLQkJCXN0cnVjdCBpcnFfZGVzYyAqZDsKLQogCQkJaWYgKCEoaXNyICYgMSkpCiAJCQkJY29udGludWU7Ci0JCQlkID0gaXJxX2Rlc2MgKyBncGlvX2lycTsKIAotCQkJZGVzY19oYW5kbGVfaXJxKGdwaW9faXJxLCBkKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX2lycSk7CiAJCX0KIAl9CiAJLyogaWYgYmFuayBoYXMgYW55IGxldmVsIHNlbnNpdGl2ZSBHUElPIHBpbiBpbnRlcnJ1cHQKQEAgLTEzOTMsNyArMTM5MCw3IEBACiAKIAkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKIAkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7Ci0JCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKKwkJcmV2ID0gX19yYXdfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCiAJCSAgICAgICAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CiAJfQpAQCAtMTQxMiw3ICsxNDA5LDcgQEAKIAogCQlncGlvX2JhbmtfY291bnQgPSA0OwogCQlncGlvX2JhbmsgPSBncGlvX2JhbmtfMjQyeDsKLQkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOworCQlyZXYgPSBfX3Jhd19yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOwogCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMjQyeCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCiAJCQkocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CiAJfQpAQCAtMTQyMSw3ICsxNDE4LDcgQEAKIAogCQlncGlvX2JhbmtfY291bnQgPSA1OwogCQlncGlvX2JhbmsgPSBncGlvX2JhbmtfMjQzeDsKLQkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOworCQlyZXYgPSBfX3Jhd19yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOwogCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMjQzeCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCiAJCQkocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CiAJfQpAQCAtMTQzMiw3ICsxNDI5LDcgQEAKIAogCQlncGlvX2JhbmtfY291bnQgPSBPTUFQMzRYWF9OUl9HUElPUzsKIAkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzM0eHg7Ci0JCXJldiA9IG9tYXBfcmVhZGwoZ3Bpb19iYW5rWzBdLmJhc2UgKyBPTUFQMjRYWF9HUElPX1JFVklTSU9OKTsKKwkJcmV2ID0gX19yYXdfcmVhZGwoZ3Bpb19iYW5rWzBdLmJhc2UgKyBPTUFQMjRYWF9HUElPX1JFVklTSU9OKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDM0eHggR1BJTyBoYXJkd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAogCQkJKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYpOwogCX0KQEAgLTE0NDEsMTAgKzE0MzgsOSBAQAogCQlpbnQgaiwgZ3Bpb19jb3VudCA9IDE2OwogCiAJCWJhbmsgPSAmZ3Bpb19iYW5rW2ldOwotCQliYW5rLT5iYXNlID0gSU9fQUREUkVTUyhiYW5rLT5iYXNlKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmJhbmstPmxvY2spOwogCQlpZiAoYmFua19pc19tcHVpbyhiYW5rKSkKLQkJCW9tYXBfd3JpdGV3KDB4RkZGRiwgT01BUF9NUFVJT19CQVNFICsgT01BUF9NUFVJT19HUElPX01BU0tJVCk7CisJCQlfX3Jhd193cml0ZXcoMHhmZmZmLCBiYW5rLT5iYXNlICsgT01BUF9NUFVJT19HUElPX01BU0tJVCk7CiAJCWlmIChjcHVfaXNfb21hcDE1eHgoKSAmJiBiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkgewogCQkJX19yYXdfd3JpdGV3KDB4ZmZmZiwgYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX01BU0spOwogCQkJX19yYXdfd3JpdGV3KDB4MDAwMCwgYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUyk7CkBAIC0xNDg4LDcgKzE0ODQsNyBAQAogCQliYW5rLT5jaGlwLnNldCA9IGdwaW9fc2V0OwogCQlpZiAoYmFua19pc19tcHVpbyhiYW5rKSkgewogCQkJYmFuay0+Y2hpcC5sYWJlbCA9ICJtcHVpbyI7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogCQkJYmFuay0+Y2hpcC5kZXYgPSAmb21hcF9tcHVpb19kZXZpY2UuZGV2OwogI2VuZGlmCiAJCQliYW5rLT5jaGlwLmJhc2UgPSBPTUFQX01QVUlPKDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC0yNDMwc2RwLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLTI0MzBzZHAuaAppbmRleCBjZjFkYzAyLi4xMGQ0NDllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLTI0MzBzZHAuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLTI0MzBzZHAuaApAQCAtMzAsMTAgKzMwLDEyIEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfT01BUF8yNDMwU0RQX0gKIAogLyogUGxhY2Vob2xkZXIgZm9yIDI0MzBTRFAgc3BlY2lmaWMgZGVmaW5lcyAqLwotI2RlZmluZSBPTUFQMjRYWF9FVEhSX1NUQVJUCQkgMHgwODAwMDMwMAorI2RlZmluZSBPTUFQMjRYWF9FVEhSX1NUQVJUCQkweDA4MDAwMzAwCiAjZGVmaW5lIE9NQVAyNFhYX0VUSFJfR1BJT19JUlEJCTE0OQogI2RlZmluZSBTRFAyNDMwX0NTMF9CQVNFCQkweDA0MDAwMDAwCiAKLSNkZWZpbmUgVFdMNDAzMF9JUlFOVU0JCQlJTlRfMjRYWF9TWVNfTklSUQorLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgc2RwMjQzMF9mbGFzaF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgc2RwMjQzMF91c2JfaW5pdCh2b2lkKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfT01BUF8yNDMwU0RQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtYXBvbGxvbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKaW5kZXggZDZmMmE4ZS4uNzMxYzg1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1hcG9sbG9uLmgKQEAgLTMxLDYgKzMxLDEyIEBACiAKIGV4dGVybiB2b2lkIGFwb2xsb25fbW1jX2luaXQodm9pZCk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGFwb2xsb25fcGx1cyh2b2lkKQoreworCS8qIFRoZSBhcG9sbG9uIHBsdXMgaGFzIElEQ09ERSByZXZpc2lvbiA1ICovCisJcmV0dXJuIHN5c3RlbV9yZXYgJiAweGMwOworfQorCiAvKiBQbGFjZWhvbGRlciBmb3IgQVBPTExPTiBzcGVjaWZpYyBkZWZpbmVzICovCiAjZGVmaW5lIEFQT0xMT05fRVRIUl9HUElPX0lSUQkJNzQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1oNC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1oNC5oCmluZGV4IDE0NzBjZDMuLjdjM2ZhMGYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLWg0LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1oNC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGFyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtaDQuaAogICoKLSAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciBUSSBPTUFQMTYxMCBINCBib2FyZC4KKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciBUSSBPTUFQMjQyMCBINCBib2FyZC4KICAqCiAgKiBJbml0aWFsIGNyZWF0aW9uIGJ5IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPgogICoKQEAgLTI5LDYgKzI5LDkgQEAKICNpZm5kZWYgX19BU01fQVJDSF9PTUFQX0g0X0gKICNkZWZpbmUgX19BU01fQVJDSF9PTUFQX0g0X0gKIAorLyogTU1DIFByb3RvdHlwZXMgKi8KK2V4dGVybiB2b2lkIGg0X21tY19pbml0KHZvaWQpOworCiAvKiBQbGFjZWhvbGRlciBmb3IgSDQgc3BlY2lmaWMgZGVmaW5lcyAqLwogI2RlZmluZSBPTUFQMjRYWF9FVEhSX0dQSU9fSVJRCQk5MgogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVBfSDRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1sZHAuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtbGRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlMjc0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtbGRwLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGFyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtbGRwLmgKKyAqCisgKiBIYXJkd2FyZSBkZWZpbml0aW9ucyBmb3IgVEkgT01BUDMgTERQLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX09NQVBfTERQX0gKKyNkZWZpbmUgX19BU01fQVJDSF9PTUFQX0xEUF9ICisKK2V4dGVybiB2b2lkIHR3bDQwMzBfYmNpX2JhdHRlcnlfaW5pdCh2b2lkKTsKKworI2RlZmluZSBUV0w0MDMwX0lSUU5VTQkJSU5UXzM0WFhfU1lTX05JUlEKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfT01BUF9MRFBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1vbWFwM2JlYWdsZS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC1vbWFwM2JlYWdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODBkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLW9tYXAzYmVhZ2xlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIGFyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtb21hcDNiZWFnbGUuaAorICoKKyAqIEhhcmR3YXJlIGRlZmluaXRpb25zIGZvciBUSSBPTUFQMyBCRUFHTEUuCisgKgorICogSW5pdGlhbCBjcmVhdGlvbiBieSBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8a2hhc2ltQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfT01BUDNfQkVBR0xFX0gKKyNkZWZpbmUgX19BU01fQVJDSF9PTUFQM19CRUFHTEVfSAorCisjZW5kaWYgLyogX19BU01fQVJDSF9PTUFQM19CRUFHTEVfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLW92ZXJvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLW92ZXJvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjYWU2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQtb3Zlcm8uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogYm9hcmQtb3Zlcm8uaCAoR3Vtc3RpeCBPdmVybykKKyAqCisgKiBJbml0aWFsIGNvZGU6IFN0ZXZlIFNha29tYW4gPHN0ZXZlQHNha29tYW4uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfT1ZFUk9fSAorI2RlZmluZSBfX0FTTV9BUkNIX09WRVJPX0gKKworI2RlZmluZSBPVkVST19HUElPX0JUX1hHQVRFCTE1CisjZGVmaW5lIE9WRVJPX0dQSU9fVzJXX05SRVNFVAkxNgorI2RlZmluZSBPVkVST19HUElPX0JUX05SRVNFVAkxNjQKKyNkZWZpbmUgT1ZFUk9fR1BJT19VU0JIX0NQRU4JMTY4CisjZGVmaW5lIE9WRVJPX0dQSU9fVVNCSF9OUkVTRVQJMTgzCisKKyNlbmRpZiAvKiBfX19fQVNNX0FSQ0hfT1ZFUk9fSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggNTQ0NDU2NC4uYzIzYzEyYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvYm9hcmQuaApAQCAtNDUsNiArNDUsOCBAQAogCXVuc2lnbmVkIGNvdmVyOjE7CiAJLyogNCB3aXJlIHNpZ25hbGluZyBpcyBvcHRpb25hbCwgYW5kIGlzIG9ubHkgdXNlZCBmb3IgU0QvU0RJTyAqLwogCXVuc2lnbmVkIHdpcmU0OjE7CisJLyogdXNlIHRoZSBpbnRlcm5hbCBjbG9jayAqLworCXVuc2lnbmVkIGludGVybmFsX2Nsb2NrOjE7CiAJczE2IHBvd2VyX3BpbjsKIAlzMTYgc3dpdGNoX3BpbjsKIAlzMTYgd3BfcGluOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jbG9jay5oCmluZGV4IDkyZjdjNzIuLjcxOTI5ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY2xvY2suaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2Nsb2NrLmgKQEAgLTE1LDYgKzE1LDcgQEAKIAogc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBjbGs7CitzdHJ1Y3QgY2xvY2tkb21haW47CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQogCkBAIC03OSw2ICs4MCw4IEBACiAJdTMyCQkJY2xrc2VsX21hc2s7CiAJY29uc3Qgc3RydWN0IGNsa3NlbAkqY2xrc2VsOwogCXN0cnVjdCBkcGxsX2RhdGEJKmRwbGxfZGF0YTsKKwljb25zdCBjaGFyCQkqY2xrZG1fbmFtZTsKKwlzdHJ1Y3QgY2xvY2tkb21haW4JKmNsa2RtOwogI2Vsc2UKIAlfX3U4CQkJcmF0ZV9vZmZzZXQ7CiAJX191OAkJCXNyY19vZmZzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2Nsb2NrZG9tYWluLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2Nsb2NrZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MWYwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY2xvY2tkb21haW4uaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvY2xvY2tkb21haW4uaAorICoKKyAqIE9NQVAyLzMgY2xvY2tkb21haW4gZnJhbWV3b3JrIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX09NQVBfQ0xPQ0tET01BSU5fSAorI2RlZmluZSBfX0FTTV9BUk1fQVJDSF9PTUFQX0NMT0NLRE9NQUlOX0gKKworI2luY2x1ZGUgPG1hY2gvcG93ZXJkb21haW4uaD4KKyNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKworLyogQ2xvY2tkb21haW4gY2FwYWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBDTEtETV9DQU5fRk9SQ0VfU0xFRVAJCQkoMSA8PCAwKQorI2RlZmluZSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQCQkJKDEgPDwgMSkKKyNkZWZpbmUgQ0xLRE1fQ0FOX0VOQUJMRV9BVVRPCQkJKDEgPDwgMikKKyNkZWZpbmUgQ0xLRE1fQ0FOX0RJU0FCTEVfQVVUTwkJCSgxIDw8IDMpCisKKyNkZWZpbmUgQ0xLRE1fQ0FOX0hXU1VQCQkoQ0xLRE1fQ0FOX0VOQUJMRV9BVVRPIHwgQ0xLRE1fQ0FOX0RJU0FCTEVfQVVUTykKKyNkZWZpbmUgQ0xLRE1fQ0FOX1NXU1VQCQkoQ0xLRE1fQ0FOX0ZPUkNFX1NMRUVQIHwgQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCkKKyNkZWZpbmUgQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQCShDTEtETV9DQU5fU1dTVVAgfCBDTEtETV9DQU5fSFdTVVApCisKKy8qIE9NQVAyNFhYIENNX0NMS1NUQ1RSTF8qLkFVVE9TVEFURV8qIHJlZ2lzdGVyIGJpdCB2YWx1ZXMgKi8KKyNkZWZpbmUgT01BUDI0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTwkJMHgwCisjZGVmaW5lIE9NQVAyNFhYX0NMS1NUQ1RSTF9FTkFCTEVfQVVUTwkJMHgxCisKKy8qIE9NQVAzWFhYIENNX0NMS1NUQ1RSTF8qLkNMS1RSQ1RSTF8qIHJlZ2lzdGVyIGJpdCB2YWx1ZXMgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ0xLU1RDVFJMX0RJU0FCTEVfQVVUTwkJMHgwCisjZGVmaW5lIE9NQVAzNFhYX0NMS1NUQ1RSTF9GT1JDRV9TTEVFUAkJMHgxCisjZGVmaW5lIE9NQVAzNFhYX0NMS1NUQ1RSTF9GT1JDRV9XQUtFVVAJCTB4MgorI2RlZmluZSBPTUFQMzRYWF9DTEtTVENUUkxfRU5BQkxFX0FVVE8JCTB4MworCisvKgorICogc3RydWN0IGNsa2RtX3B3cmRtX2F1dG9kZXAgLSBhIHBvd2VyZG9tYWluIHRoYXQgc2hvdWxkIGhhdmUgd2tkZXBzCisgKiBhbmQgc2xlZXBkZXBzIGFkZGVkIHdoZW4gYSBwb3dlcmRvbWFpbiBzaG91bGQgc3RheSBhY3RpdmUgaW4gaHdzdXAgbW9kZTsKKyAqIGFuZCBjb252ZXJzZWx5LCByZW1vdmVkIHdoZW4gdGhlIHBvd2VyZG9tYWluIHNob3VsZCBiZSBhbGxvd2VkIHRvIGdvCisgKiBpbmFjdGl2ZSBpbiBod3N1cCBtb2RlLgorICovCitzdHJ1Y3QgY2xrZG1fcHdyZG1fYXV0b2RlcCB7CisKKwkvKiBOYW1lIG9mIHRoZSBwb3dlcmRvbWFpbiB0byBhZGQgYSB3a2RlcC9zbGVlcGRlcCBvbiAqLworCWNvbnN0IGNoYXIgKnB3cmRtX25hbWU7CisKKwkvKiBQb3dlcmRvbWFpbiBwb2ludGVyIChsb29rZWQgdXAgYXQgY2xrZG1faW5pdCgpIHRpbWUpICovCisJc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTsKKworCS8qIE9NQVAgY2hpcCB0eXBlcyB0aGF0IHRoaXMgY2xvY2tkb21haW4gZGVwIGlzIHZhbGlkIG9uICovCisJY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CisKK307CisKK3N0cnVjdCBjbG9ja2RvbWFpbiB7CisKKwkvKiBDbG9ja2RvbWFpbiBuYW1lICovCisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIFBvd2VyZG9tYWluIGVuY2xvc2luZyB0aGlzIGNsb2NrZG9tYWluICovCisJY29uc3QgY2hhciAqcHdyZG1fbmFtZTsKKworCS8qIENMS1RSQ1RSTC9BVVRPU1RBVEUgZmllbGQgbWFzayBpbiBDTV9DTEtTVENUUkwgcmVnICovCisJY29uc3QgdTE2IGNsa3RyY3RybF9tYXNrOworCisJLyogQ2xvY2tkb21haW4gY2FwYWJpbGl0eSBmbGFncyAqLworCWNvbnN0IHU4IGZsYWdzOworCisJLyogT01BUCBjaGlwIHR5cGVzIHRoYXQgdGhpcyBjbG9ja2RvbWFpbiBpcyB2YWxpZCBvbiAqLworCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOworCisJLyogVXNlY291bnQgdHJhY2tpbmcgKi8KKwlhdG9taWNfdCB1c2Vjb3VudDsKKworCS8qIFBvd2VyZG9tYWluIHBvaW50ZXIgYXNzaWduZWQgYXQgY2xrZG1fcmVnaXN0ZXIoKSAqLworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG07CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKK307CisKK3ZvaWQgY2xrZG1faW5pdChzdHJ1Y3QgY2xvY2tkb21haW4gKipjbGtkbXMsIHN0cnVjdCBjbGtkbV9wd3JkbV9hdXRvZGVwICphdXRvZGVwcyk7CitpbnQgY2xrZG1fcmVnaXN0ZXIoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSk7CitpbnQgY2xrZG1fdW5yZWdpc3RlcihzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKK3N0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgY2xrZG1fZm9yX2VhY2goaW50ICgqZm4pKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pKTsKK3N0cnVjdCBwb3dlcmRvbWFpbiAqY2xrZG1fZ2V0X3B3cmRtKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pOworCit2b2lkIG9tYXAyX2Nsa2RtX2FsbG93X2lkbGUoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSk7Cit2b2lkIG9tYXAyX2Nsa2RtX2RlbnlfaWRsZShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKKworaW50IG9tYXAyX2Nsa2RtX3dha2V1cChzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKK2ludCBvbWFwMl9jbGtkbV9zbGVlcChzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKKworaW50IG9tYXAyX2Nsa2RtX2Nsa19lbmFibGUoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgc3RydWN0IGNsayAqY2xrKTsKK2ludCBvbWFwMl9jbGtkbV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtLCBzdHJ1Y3QgY2xrICpjbGspOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCmluZGV4IDA2MDkzMTEuLmVmNzBlMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jb21tb24uaApAQCAtMzQsNiArMzQsNyBAQAogZXh0ZXJuIHZvaWQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKIGV4dGVybiB2b2lkIG9tYXBfc2VyaWFsX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX3NlcmlhbF9lbmFibGVfY2xvY2tzKGludCBlbmFibGUpOwogI2lmZGVmIENPTkZJR19JMkNfT01BUAogZXh0ZXJuIGludCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCiAJCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKQEAgLTQ5LDYgKzUwLDcgQEAKIAogLyogSU8gYmFzZXMgZm9yIHZhcmlvdXMgT01BUCBwcm9jZXNzb3JzICovCiBzdHJ1Y3Qgb21hcF9nbG9iYWxzIHsKKwl1MzIJCWNsYXNzOwkJLyogT01BUCBjbGFzcyB0byBkZXRlY3QgKi8KIAl2b2lkIF9faW9tZW0JKnRhcDsJCS8qIENvbnRyb2wgbW9kdWxlIElEIGNvZGUgKi8KIAl2b2lkIF9faW9tZW0JKnNkcmM7CQkvKiBTRFJBTSBDb250cm9sbGVyICovCiAJdm9pZCBfX2lvbWVtCSpzbXM7CQkvKiBTRFJBTSBNZW1vcnkgU2NoZWR1bGVyICovCkBAIC02Miw2ICs2NCw3IEBACiB2b2lkIG9tYXAyX3NldF9nbG9iYWxzXzM0M3godm9pZCk7CiAKIC8qIFRoZXNlIGdldCBjYWxsZWQgZnJvbSBvbWFwMl9zZXRfZ2xvYmFsc194eHh4KCksIGRvIG5vdCBjYWxsIHRoZXNlICovCit2b2lkIG9tYXAyX3NldF9nbG9iYWxzX3RhcChzdHJ1Y3Qgb21hcF9nbG9iYWxzICopOwogdm9pZCBvbWFwMl9zZXRfZ2xvYmFsc19tZW1vcnkoc3RydWN0IG9tYXBfZ2xvYmFscyAqKTsKIHZvaWQgb21hcDJfc2V0X2dsb2JhbHNfY29udHJvbChzdHJ1Y3Qgb21hcF9nbG9iYWxzICopOwogdm9pZCBvbWFwMl9zZXRfZ2xvYmFsc19wcmNtKHN0cnVjdCBvbWFwX2dsb2JhbHMgKik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NvbnRyb2wuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY29udHJvbC5oCmluZGV4IGUzZmQ2MmQuLmRjOTg4Njc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NvbnRyb2wuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NvbnRyb2wuaApAQCAtMSwxMyArMSwxMCBAQAotI2lmbmRlZiBfX0FTTV9BUkNIX0NPTlRST0xfSAotI2RlZmluZSBfX0FTTV9BUkNIX0NPTlRST0xfSAotCiAvKgogICogYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jb250cm9sLmgKICAqCiAgKiBPTUFQMi8zIFN5c3RlbSBDb250cm9sIE1vZHVsZSBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKICAqCkBAIC0xNiwxNCArMTMsMjMgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2lmbmRlZiBfX0FTTV9BUkNIX0NPTlRST0xfSAorI2RlZmluZSBfX0FTTV9BUkNIX0NPTlRST0xfSAorCiAjaW5jbHVkZSA8bWFjaC9pby5oPgogCisjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2RlZmluZSBPTUFQMjQyWF9DVFJMX1JFR0FERFIocmVnKQkJCQkJXAotCSh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKE9NQVAyNDJYX0NUUkxfQkFTRSArIChyZWcpKQorCUlPX0FERFJFU1MoT01BUDI0MlhfQ1RSTF9CQVNFICsgKHJlZykpCiAjZGVmaW5lIE9NQVAyNDNYX0NUUkxfUkVHQUREUihyZWcpCQkJCQlcCi0JKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDI0M1hfQ1RSTF9CQVNFICsgKHJlZykpCisJSU9fQUREUkVTUyhPTUFQMjQzWF9DVFJMX0JBU0UgKyAocmVnKSkKICNkZWZpbmUgT01BUDM0M1hfQ1RSTF9SRUdBRERSKHJlZykJCQkJCVwKLQkodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhPTUFQMzQzWF9DVFJMX0JBU0UgKyAocmVnKSkKKwlJT19BRERSRVNTKE9NQVAzNDNYX0NUUkxfQkFTRSArIChyZWcpKQorI2Vsc2UKKyNkZWZpbmUgT01BUDI0MlhfQ1RSTF9SRUdBRERSKHJlZykJSU9fQUREUkVTUyhPTUFQMjQyWF9DVFJMX0JBU0UgKyAocmVnKSkKKyNkZWZpbmUgT01BUDI0M1hfQ1RSTF9SRUdBRERSKHJlZykJSU9fQUREUkVTUyhPTUFQMjQzWF9DVFJMX0JBU0UgKyAocmVnKSkKKyNkZWZpbmUgT01BUDM0M1hfQ1RSTF9SRUdBRERSKHJlZykJSU9fQUREUkVTUyhPTUFQMzQzWF9DVFJMX0JBU0UgKyAocmVnKSkKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogLyoKICAqIEFzIGVsc2V3aGVyZSwgdGhlICJPTUFQMl8iIHByZWZpeCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFjcm8gaXMgdmFsaWQgZm9yCkBAIC0xMzQsNiArMTQwLDcgQEAKICNkZWZpbmUgT01BUDM0M1hfQ09OVFJPTF9URVNUX0tFWV8xMwkoT01BUDJfQ09OVFJPTF9HRU5FUkFMICsgMHgwMGZjKQogI2RlZmluZSBPTUFQMzQzWF9DT05UUk9MX0lWQTJfQk9PVEFERFIJKE9NQVAyX0NPTlRST0xfR0VORVJBTCArIDB4MDE5MCkKICNkZWZpbmUgT01BUDM0M1hfQ09OVFJPTF9JVkEyX0JPT1RNT0QJKE9NQVAyX0NPTlRST0xfR0VORVJBTCArIDB4MDE5NCkKKyNkZWZpbmUgT01BUDM0M1hfQ09OVFJPTF9URU1QX1NFTlNPUgkoT01BUDJfQ09OVFJPTF9HRU5FUkFMICsgMHgwMmI0KQogCiAvKgogICogUkVWSVNJVDogVGhpcyBsaXN0IG9mIHJlZ2lzdGVycyBpcyBub3QgY29tcHJlaGVuc2l2ZSAtIHRoZXJlIGFyZSBtb3JlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCAwNWFlZTBlLi5lMDQ2NDE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTM0Niw5ICszNDYsMTQgQEAKIAkJZ2V0X3NpbF9yZXZpc2lvbihzeXN0ZW1fcmV2KQogCiAvKiBWYXJpb3VzIHNpbGljb24gbWFjcm9zIGRlZmluZWQgaGVyZSAqLworI2RlZmluZSBPTUFQMjQyWF9DTEFTUwkJMHgyNDIwMDAwMAogI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMxXzAJMHgyNDIwMDAwMAogI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMyXzAJMHgyNDIwMTAwMAorCisjZGVmaW5lIE9NQVAyNDNYX0NMQVNTCQkweDI0MzAwMDAwCiAjZGVmaW5lIE9NQVAyNDMwX1JFVl9FUzFfMAkweDI0MzAwMDAwCisKKyNkZWZpbmUgT01BUDM0M1hfQ0xBU1MJCTB4MzQzMDAwMDAKICNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMV8wCTB4MzQzMDAwMDAKICNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMl8wCTB4MzQzMDEwMDAKICNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMl8xCTB4MzQzMDIwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCAxYjAwMzliLi4xYjExZjVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0zNSw2ICszNSwxOCBAQAogI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzCiAJCWFkZAlccngsIFxyeCwgIzB4MDAwMDQwMDAJQCBVQVJUIDMKICNlbmRpZgorCisjZWxpZglDT05GSUdfQVJDSF9PTUFQMworCQltb3ZlcQlccngsICMweDQ4MDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCisJCW1vdm5lCVxyeCwgIzB4ZDgwMDAwMDAJQCB2aXJ0dWFsIGJhc2UKKwkJb3JyCVxyeCwgXHJ4LCAjMHgwMDA2YTAwMAorI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyCisJCWFkZAlccngsIFxyeCwgIzB4MDAwMDIwMDAJQCBVQVJUIDIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzCisJCWFkZAlccngsIFxyeCwgIzB4MDBmYjAwMDAJQCBVQVJUIDMKKwkJYWRkCVxyeCwgXHJ4LCAjMHgwMDAwNjAwMAorI2VuZGlmCiAjZW5kaWYKIAkJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGQ0ZTkwNDMuLjAzMDExOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKQEAgLTU1LDkgKzU1LDE3IEBACiAxNTEwOgogCQkuZW5kbQogCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpCiAjaW5jbHVkZSA8bWFjaC9vbWFwMjR4eC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKKyNpbmNsdWRlIDxtYWNoL29tYXAzNHh4Lmg+CisjZW5kaWYKKworI2RlZmluZSBJTlRDUFNfU0lSX0lSUV9PRkZTRVQJMHgwMDQwCQkvKiBBY3RpdmUgaW50ZXJydXB0IG51bWJlciAqLwogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQpAQCAtNzksNyArODcsNyBAQAogCQlsZHIJXGlycW5yLCBbXGJhc2UsICMweGQ4XSAvKiBJUlEgcGVuZGluZyByZWcgMyAqLwogCQljbXAJXGlycW5yLCAjMHgwCiAyMjIyOgotCQlsZHJuZQlcaXJxbnIsIFtcYmFzZSwgI0lSUV9TSVJfSVJRXQorCQlsZHJuZQlcaXJxbnIsIFtcYmFzZSwgI0lOVENQU19TSVJfSVJRX09GRlNFVF0KIAogCQkuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2ZwZ2EuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZnBnYS5oCmluZGV4IGM5MmU0YjQuLmYxODY0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZnBnYS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZnBnYS5oCkBAIC0zNCw5ICszNCw5IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogLyogbWFwcyBpbiB0aGUgRlBHQSByZWdpc3RlcnMgYW5kIHRoZSBFVEhSIHJlZ2lzdGVycyAqLwotI2RlZmluZSBIMlAyX0RCR19GUEdBX0JBU0UJCTB4RTgwMDAwMDAJLyogVkEgKi8KLSNkZWZpbmUgSDJQMl9EQkdfRlBHQV9TSVpFCQlTWl80SwkJLyogU0laRSAqLwotI2RlZmluZSBIMlAyX0RCR19GUEdBX1NUQVJUCQkweDA0MDAwMDAwCS8qIFBBICovCisjZGVmaW5lIEgyUDJfREJHX0ZQR0FfQkFTRQkJSU9NRU0oMHhFODAwMDAwMCkJLyogVkEgKi8KKyNkZWZpbmUgSDJQMl9EQkdfRlBHQV9TSVpFCQlTWl80SwkJCS8qIFNJWkUgKi8KKyNkZWZpbmUgSDJQMl9EQkdfRlBHQV9TVEFSVAkJMHgwNDAwMDAwMAkJLyogUEEgKi8KIAogI2RlZmluZSBIMlAyX0RCR19GUEdBX0VUSFJfU1RBUlQJKEgyUDJfREJHX0ZQR0FfU1RBUlQgKyAweDMwMCkKICNkZWZpbmUgSDJQMl9EQkdfRlBHQV9GUEdBX1JFVgkJKEgyUDJfREJHX0ZQR0FfQkFTRSArIDB4MTApCS8qIEZQR0EgUmV2aXNpb24gKi8KQEAgLTg1LDkgKzg1LDkgQEAKICAqICBPTUFQLTE1MTAgRlBHQQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNkZWZpbmUgT01BUDE1MTBfRlBHQV9CQVNFCQkJMHhFODAwMDAwMAkvKiBWaXJ0dWFsICovCi0jZGVmaW5lIE9NQVAxNTEwX0ZQR0FfU0laRQkJCVNaXzRLCi0jZGVmaW5lIE9NQVAxNTEwX0ZQR0FfU1RBUlQJCQkweDA4MDAwMDAwCS8qIFBoeXNpY2FsICovCisjZGVmaW5lIE9NQVAxNTEwX0ZQR0FfQkFTRQkJSU9NRU0oMHhFODAwMDAwMCkJLyogVkEgKi8KKyNkZWZpbmUgT01BUDE1MTBfRlBHQV9TSVpFCQlTWl80SworI2RlZmluZSBPTUFQMTUxMF9GUEdBX1NUQVJUCQkweDA4MDAwMDAwCQkvKiBQQSAqLwogCiAvKiBSZXZpc2lvbiAqLwogI2RlZmluZSBPTUFQMTUxMF9GUEdBX1JFVl9MT1cJCQkoT01BUDE1MTBfRlBHQV9CQVNFICsgMHgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA5NGNlMjc4Li45OGU5MDA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjYsMTAgKzI2LDEwIEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfT01BUF9HUElPX0gKICNkZWZpbmUgX19BU01fQVJDSF9PTUFQX0dQSU9fSAogCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBPTUFQX01QVUlPX0JBU0UJCQkodm9pZCBfX2lvbWVtICopMHhmZmZiNTAwMAorI2RlZmluZSBPTUFQX01QVUlPX0JBU0UJCQkweGZmZmI1MDAwCiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCiAjZGVmaW5lIE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0gJCTB4MDAKQEAgLTc2LDYgKzc2LDggQEAKIGV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpOwogZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGludCBncGlvLCBpbnQgZW5hYmxlKTsKIGV4dGVybiBpbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pOworZXh0ZXJuIHZvaWQgb21hcDJfZ3Bpb19wcmVwYXJlX2Zvcl9yZXRlbnRpb24odm9pZCk7CitleHRlcm4gdm9pZCBvbWFwMl9ncGlvX3Jlc3VtZV9hZnRlcl9yZXRlbnRpb24odm9pZCk7CiBleHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2RlYm91bmNlKGludCBncGlvLCBpbnQgZW5hYmxlKTsKIGV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGVib3VuY2VfdGltZShpbnQgZ3BpbywgaW50IGVuYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZ3BtYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncG1jLmgKaW5kZXggNmE4ZTA3Zi4uNDViNjc4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncG1jLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncG1jLmgKQEAgLTExLDYgKzExLDkgQEAKICNpZm5kZWYgX19PTUFQMl9HUE1DX0gKICNkZWZpbmUgX19PTUFQMl9HUE1DX0gKIAorLyogTWF4aW11bSBOdW1iZXIgb2YgQ2hpcCBTZWxlY3RzICovCisjZGVmaW5lIEdQTUNfQ1NfTlVNCQk4CisKICNkZWZpbmUgR1BNQ19DU19DT05GSUcxCQkweDAwCiAjZGVmaW5lIEdQTUNfQ1NfQ09ORklHMgkJMHgwNAogI2RlZmluZSBHUE1DX0NTX0NPTkZJRzMJCTB4MDgKQEAgLTIyLDYgKzI1LDkgQEAKICNkZWZpbmUgR1BNQ19DU19OQU5EX0FERFJFU1MJMHgyMAogI2RlZmluZSBHUE1DX0NTX05BTkRfREFUQQkweDI0CiAKKyNkZWZpbmUgR1BNQ19DT05GSUcJCTB4NTAKKyNkZWZpbmUgR1BNQ19TVEFUVVMJCTB4NTQKKwogI2RlZmluZSBHUE1DX0NPTkZJRzFfV1JBUEJVUlNUX1NVUFAgICAgICgxIDw8IDMxKQogI2RlZmluZSBHUE1DX0NPTkZJRzFfUkVBRE1VTFRJUExFX1NVUFAgICgxIDw8IDMwKQogI2RlZmluZSBHUE1DX0NPTkZJRzFfUkVBRFRZUEVfQVNZTkMgICAgICgwIDw8IDI5KQpAQCAtNzgsOSArODQsMTQgQEAKIAl1MTYgYWNjZXNzOwkJLyogU3RhcnQtY3ljbGUgdG8gZmlyc3QgZGF0YSB2YWxpZCBkZWxheSAqLwogCXUxNiByZF9jeWNsZTsJCS8qIFRvdGFsIHJlYWQgY3ljbGUgdGltZSAqLwogCXUxNiB3cl9jeWNsZTsJCS8qIFRvdGFsIHdyaXRlIGN5Y2xlIHRpbWUgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgb24gT01BUDM0MzAgKi8KKwl1MTYgd3JfYWNjZXNzOwkJLyogV1JBQ0NFU1NUSU1FICovCisJdTE2IHdyX2RhdGFfbXV4X2J1czsJLyogV1JEQVRBT05BRE1VWEJVUyAqLwogfTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBncG1jX25zX3RvX3RpY2tzKHVuc2lnbmVkIGludCB0aW1lX25zKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ3BtY190aWNrc190b19ucyh1bnNpZ25lZCBpbnQgdGlja3MpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBncG1jX3JvdW5kX25zX3RvX3RpY2tzKHVuc2lnbmVkIGludCB0aW1lX25zKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdwbWNfZ2V0X2ZjbGtfcGVyaW9kKHZvaWQpOwogCkBAIC05Miw1ICsxMDMsNiBAQAogZXh0ZXJuIHZvaWQgZ3BtY19jc19mcmVlKGludCBjcyk7CiBleHRlcm4gaW50IGdwbWNfY3Nfc2V0X3Jlc2VydmVkKGludCBjcywgaW50IHJlc2VydmVkKTsKIGV4dGVybiBpbnQgZ3BtY19jc19yZXNlcnZlZChpbnQgY3MpOworZXh0ZXJuIHZvaWQgZ3BtY19pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCAwN2Y1ZDdmLi42NTg5ZGRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC04OSw3ICs4OSw3IEBACiAjZGVmaW5lIERQTExfQ1RMCQkoMHhmZmZlY2YwMCkKIAogLyogRFNQIGNsb2NrIGNvbnRyb2wuIE11c3QgdXNlIF9fcmF3X3JlYWR3KCkgYW5kIF9fcmF3X3dyaXRldygpIHdpdGggdGhlc2UgKi8KLSNkZWZpbmUgRFNQX0NPTkZJR19SRUdfQkFTRSAgICAgKDB4ZTEwMDgwMDApCisjZGVmaW5lIERTUF9DT05GSUdfUkVHX0JBU0UgICAgIElPTUVNKDB4ZTEwMDgwMDApCiAjZGVmaW5lIERTUF9DS0NUTAkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDApCiAjZGVmaW5lIERTUF9JRExFQ1QxCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4NCkKICNkZWZpbmUgRFNQX0lETEVDVDIJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHg4KQpAQCAtMjgyLDggKzI4Miw4IEBACiAKICNpbmNsdWRlICJvbWFwNzMwLmgiCiAjaW5jbHVkZSAib21hcDE1MTAuaCIKLSNpbmNsdWRlICJvbWFwMjR4eC5oIgogI2luY2x1ZGUgIm9tYXAxNnh4LmgiCisjaW5jbHVkZSAib21hcDI0eHguaCIKICNpbmNsdWRlICJvbWFwMzR4eC5oIgogCiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KQEAgLTMyMiw2ICszMjIsMTQgQEAKICNpbmNsdWRlICJib2FyZC0yNDMwc2RwLmgiCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NQUNIX09NQVAzX0JFQUdMRQorI2luY2x1ZGUgImJvYXJkLW9tYXAzYmVhZ2xlLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfTERQCisjaW5jbHVkZSAiYm9hcmQtbGRwLmgiCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfQVBPTExPTgogI2luY2x1ZGUgImJvYXJkLWFwb2xsb24uaCIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDJhMzBiN2QuLmFkYzgzYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTU1LDE0ICs1NSwxMyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKIAotI2RlZmluZSBJT19QSFlTCQkweEZGRkIwMDAwCi0jZGVmaW5lIElPX09GRlNFVAkweDAxMDAwMDAwCS8qIFZpcnR1YWwgSU8gPSAweGZlZmIwMDAwICovCi0jZGVmaW5lIElPX1NJWkUJCTB4NDAwMDAKLSNkZWZpbmUgSU9fVklSVAkJKElPX1BIWVMgLSBJT19PRkZTRVQpCi0jZGVmaW5lIElPX0FERFJFU1MocGEpCSgocGEpIC0gSU9fT0ZGU0VUKQotI2RlZmluZSBPTUFQMV9JT19BRERSRVNTKHBhKQkoKHBhKSAtIElPX09GRlNFVCkKLSNkZWZpbmUgaW9fcDJ2KHBhKQkoKHBhKSAtIElPX09GRlNFVCkKLSNkZWZpbmUgaW9fdjJwKHZhKQkoKHZhKSArIElPX09GRlNFVCkKKyNkZWZpbmUgSU9fUEhZUwkJCTB4RkZGQjAwMDAKKyNkZWZpbmUgSU9fT0ZGU0VUCQkweDAxMDAwMDAwCS8qIFZpcnR1YWwgSU8gPSAweGZlZmIwMDAwICovCisjZGVmaW5lIElPX1NJWkUJCQkweDQwMDAwCisjZGVmaW5lIElPX1ZJUlQJCQkoSU9fUEhZUyAtIElPX09GRlNFVCkKKyNkZWZpbmUgX19JT19BRERSRVNTKHBhKQkoKHBhKSAtIElPX09GRlNFVCkKKyNkZWZpbmUgX19PTUFQMV9JT19BRERSRVNTKHBhKQkoKHBhKSAtIElPX09GRlNFVCkKKyNkZWZpbmUgaW9fdjJwKHZhKQkJKCh2YSkgKyBJT19PRkZTRVQpCiAKICNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpCiAKQEAgLTc0LDcgKzczLDYgQEAKICNkZWZpbmUgTDRfMjRYWF9WSVJUCTB4ZDgwMDAwMDAKICNkZWZpbmUgTDRfMjRYWF9TSVpFCVNaXzFNCQkvKiAxTUIgb2YgMTI4TUIgdXNlZCwgd2FudCAxTUIgc2VjdCAqLwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0MzAKICNkZWZpbmUgTDRfV0tfMjQzWF9QSFlTCQlMNF9XS18yNDNYX0JBU0UJCS8qIDB4NDkwMDAwMDAgKi8KICNkZWZpbmUgTDRfV0tfMjQzWF9WSVJUCQkweGQ5MDAwMDAwCiAjZGVmaW5lIEw0X1dLXzI0M1hfU0laRQkJU1pfMU0KQEAgLTg4LDEzICs4NiwxMCBAQAogI2RlZmluZSBPTUFQMjQzWF9TTVNfVklSVAkweEZDMDAwMDAwCiAjZGVmaW5lIE9NQVAyNDNYX1NNU19TSVpFCVNaXzFNCiAKLSNlbmRpZgotCi0jZGVmaW5lIElPX09GRlNFVAkweDkwMDAwMDAwCi0jZGVmaW5lIElPX0FERFJFU1MocGEpCSgocGEpICsgSU9fT0ZGU0VUKQkvKiBXb3JrcyBmb3IgTDMgYW5kIEw0ICovCi0jZGVmaW5lIE9NQVAyX0lPX0FERFJFU1MocGEpCSgocGEpICsgSU9fT0ZGU0VUKQkvKiBXb3JrcyBmb3IgTDMgYW5kIEw0ICovCi0jZGVmaW5lIGlvX3AydihwYSkJKChwYSkgKyBJT19PRkZTRVQpCS8qIFdvcmtzIGZvciBMMyBhbmQgTDQgKi8KLSNkZWZpbmUgaW9fdjJwKHZhKQkoKHZhKSAtIElPX09GRlNFVCkJLyogV29ya3MgZm9yIEwzIGFuZCBMNCAqLworI2RlZmluZSBJT19PRkZTRVQJCTB4OTAwMDAwMDAKKyNkZWZpbmUgX19JT19BRERSRVNTKHBhKQkoKHBhKSArIElPX09GRlNFVCkJLyogV29ya3MgZm9yIEwzIGFuZCBMNCAqLworI2RlZmluZSBfX09NQVAyX0lPX0FERFJFU1MocGEpCSgocGEpICsgSU9fT0ZGU0VUKQkvKiBXb3JrcyBmb3IgTDMgYW5kIEw0ICovCisjZGVmaW5lIGlvX3YycCh2YSkJCSgodmEpIC0gSU9fT0ZGU0VUKQkvKiBXb3JrcyBmb3IgTDMgYW5kIEw0ICovCiAKIC8qIERTUCAqLwogI2RlZmluZSBEU1BfTUVNXzI0WFhfUEhZUwlPTUFQMjQyMF9EU1BfTUVNX0JBU0UJLyogMHg1ODAwMDAwMCAqLwpAQCAtMTQ5LDkgKzE0NCw4IEBACiAKIAogI2RlZmluZSBJT19PRkZTRVQJCTB4OTAwMDAwMDAKLSNkZWZpbmUgSU9fQUREUkVTUyhwYSkJCSgocGEpICsgSU9fT0ZGU0VUKS8qIFdvcmtzIGZvciBMMyBhbmQgTDQgKi8KLSNkZWZpbmUgT01BUDJfSU9fQUREUkVTUyhwYSkJKChwYSkgKyBJT19PRkZTRVQpLyogV29ya3MgZm9yIEwzIGFuZCBMNCAqLwotI2RlZmluZSBpb19wMnYocGEpCQkoKHBhKSArIElPX09GRlNFVCkvKiBXb3JrcyBmb3IgTDMgYW5kIEw0ICovCisjZGVmaW5lIF9fSU9fQUREUkVTUyhwYSkJKChwYSkgKyBJT19PRkZTRVQpLyogV29ya3MgZm9yIEwzIGFuZCBMNCAqLworI2RlZmluZSBfX09NQVAyX0lPX0FERFJFU1MocGEpCSgocGEpICsgSU9fT0ZGU0VUKS8qIFdvcmtzIGZvciBMMyBhbmQgTDQgKi8KICNkZWZpbmUgaW9fdjJwKHZhKQkJKCh2YSkgLSBJT19PRkZTRVQpLyogV29ya3MgZm9yIEwzIGFuZCBMNCAqLwogCiAvKiBEU1AgKi8KQEAgLTE2Nyw3ICsxNjEsMTQgQEAKIAogI2VuZGlmCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBJT19BRERSRVNTKHBhKQkJSU9NRU0oX19JT19BRERSRVNTKHBhKSkKKyNkZWZpbmUgT01BUDFfSU9fQUREUkVTUyhwYSkJSU9NRU0oX19PTUFQMV9JT19BRERSRVNTKHBhKSkKKyNkZWZpbmUgT01BUDJfSU9fQUREUkVTUyhwYSkJSU9NRU0oX19PTUFQMl9JT19BRERSRVNTKHBhKSkKKworI2lmZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgSU9NRU0oeCkJCXgKKyNlbHNlCisjZGVmaW5lIElPTUVNKHgpCQkoKHZvaWQgX19mb3JjZSBfX2lvbWVtICopKHgpKQogCiAvKgogICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgT01BUCBJTyByZWdpb24KQEAgLTE3OCwxMyArMTc5LDEzIEBACiAgKgkgLSBETyBOT1QgdXNlIGhhcmRjb2RlZCB2aXJ0dWFsIGFkZHJlc3NlcyB0byBhbGxvdyBjaGFuZ2luZyB0aGUKICAqCSAgIElPIGFkZHJlc3Mgc3BhY2UgYWdhaW4gaWYgbmVlZGVkCiAgKi8KLSNkZWZpbmUgb21hcF9yZWFkYihhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKilJT19BRERSRVNTKGEpKQotI2RlZmluZSBvbWFwX3JlYWR3KGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKUlPX0FERFJFU1MoYSkpCi0jZGVmaW5lIG9tYXBfcmVhZGwoYSkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAgICopSU9fQUREUkVTUyhhKSkKKyNkZWZpbmUgb21hcF9yZWFkYihhKQkJX19yYXdfcmVhZGIoSU9fQUREUkVTUyhhKSkKKyNkZWZpbmUgb21hcF9yZWFkdyhhKQkJX19yYXdfcmVhZHcoSU9fQUREUkVTUyhhKSkKKyNkZWZpbmUgb21hcF9yZWFkbChhKQkJX19yYXdfcmVhZGwoSU9fQUREUkVTUyhhKSkKIAotI2RlZmluZSBvbWFwX3dyaXRlYih2LGEpCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICopSU9fQUREUkVTUyhhKSA9ICh2KSkKLSNkZWZpbmUgb21hcF93cml0ZXcodixhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKUlPX0FERFJFU1MoYSkgPSAodikpCi0jZGVmaW5lIG9tYXBfd3JpdGVsKHYsYSkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICAgKilJT19BRERSRVNTKGEpID0gKHYpKQorI2RlZmluZSBvbWFwX3dyaXRlYih2LGEpCV9fcmF3X3dyaXRlYih2LCBJT19BRERSRVNTKGEpKQorI2RlZmluZSBvbWFwX3dyaXRldyh2LGEpCV9fcmF3X3dyaXRldyh2LCBJT19BRERSRVNTKGEpKQorI2RlZmluZSBvbWFwX3dyaXRlbCh2LGEpCV9fcmF3X3dyaXRlbCh2LCBJT19BRERSRVNTKGEpKQogCiBleHRlcm4gdm9pZCBvbWFwMV9tYXBfY29tbW9uX2lvKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDFfaW5pdF9jb21tb25faHcodm9pZCk7CkBAIC0xOTIsNiArMTkzLDEyIEBACiBleHRlcm4gdm9pZCBvbWFwMl9tYXBfY29tbW9uX2lvKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDJfaW5pdF9jb21tb25faHcodm9pZCk7CiAKKyNkZWZpbmUgX19hcmNoX2lvcmVtYXAocCxzLHQpCW9tYXBfaW9yZW1hcChwLHMsdCkKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAodikJb21hcF9pb3VubWFwKHYpCisKK3ZvaWQgX19pb21lbSAqb21hcF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB0eXBlKTsKK3ZvaWQgb21hcF9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CisKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggMTcyNDhiYi4uYTI5MjlhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTEyNSw2ICsxMjUsNyBAQAogI2RlZmluZSBJTlRfVUFSVDIJCSgxNSArIElIMl9CQVNFKQogI2RlZmluZSBJTlRfQlRfTUNTSTFUWAkJKDE2ICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF9CVF9NQ1NJMVJYCQkoMTcgKyBJSDJfQkFTRSkKKyNkZWZpbmUgSU5UX1NPU1NJX01BVENICQkoMTkgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UX1VTQl9XMkZDCQkoMjAgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzFXSVJFCQkoMjEgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UX09TX1RJTUVSCQkoMjIgKyBJSDJfQkFTRSkKQEAgLTE3Niw2ICsxNzcsNyBAQAogI2RlZmluZSBJTlRfMTYxMF9ETUFfQ0gxNAkoNjEgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfRE1BX0NIMTUJKDYyICsgSUgyX0JBU0UpCiAjZGVmaW5lIElOVF8xNjEwX05BTkQJCSg2MyArIElIMl9CQVNFKQorI2RlZmluZSBJTlRfMTYxMF9TSEExTUQ1CSg5MSArIElIMl9CQVNFKQogCiAvKgogICogT01BUC03MzAgc3BlY2lmaWMgSVJRIG51bWJlcnMgZm9yIGludGVycnVwdCBoYW5kbGVyIDIKQEAgLTI2MywxMiArMjY1LDE4IEBACiAjZGVmaW5lIElOVF8yNFhYX0dQVElNRVIxMAk0NgogI2RlZmluZSBJTlRfMjRYWF9HUFRJTUVSMTEJNDcKICNkZWZpbmUgSU5UXzI0WFhfR1BUSU1FUjEyCTQ4CisjZGVmaW5lIElOVF8yNFhYX1NIQTFNRDUJNTEKKyNkZWZpbmUgSU5UXzI0WFhfTUNCU1A0X0lSUV9UWAk1NAorI2RlZmluZSBJTlRfMjRYWF9NQ0JTUDRfSVJRX1JYCTU1CiAjZGVmaW5lIElOVF8yNFhYX0kyQzFfSVJRCTU2CiAjZGVmaW5lIElOVF8yNFhYX0kyQzJfSVJRCTU3CisjZGVmaW5lIElOVF8yNFhYX0hEUV9JUlEJNTgKICNkZWZpbmUgSU5UXzI0WFhfTUNCU1AxX0lSUV9UWAk1OQogI2RlZmluZSBJTlRfMjRYWF9NQ0JTUDFfSVJRX1JYCTYwCiAjZGVmaW5lIElOVF8yNFhYX01DQlNQMl9JUlFfVFgJNjIKICNkZWZpbmUgSU5UXzI0WFhfTUNCU1AyX0lSUV9SWAk2MworI2RlZmluZSBJTlRfMjRYWF9TUEkxX0lSUQk2NQorI2RlZmluZSBJTlRfMjRYWF9TUEkyX0lSUQk2NgogI2RlZmluZSBJTlRfMjRYWF9VQVJUMV9JUlEJNzIKICNkZWZpbmUgSU5UXzI0WFhfVUFSVDJfSVJRCTczCiAjZGVmaW5lIElOVF8yNFhYX1VBUlQzX0lSUQk3NApAQCAtMjc4LDcgKzI4Niw2MCBAQAogI2RlZmluZSBJTlRfMjRYWF9VU0JfSVJRX0hHRU4JNzgKICNkZWZpbmUgSU5UXzI0WFhfVVNCX0lSUV9IU09GCTc5CiAjZGVmaW5lIElOVF8yNFhYX1VTQl9JUlFfT1RHCTgwCisjZGVmaW5lIElOVF8yNFhYX01DQlNQNV9JUlFfVFgJODEKKyNkZWZpbmUgSU5UXzI0WFhfTUNCU1A1X0lSUV9SWAk4MgogI2RlZmluZSBJTlRfMjRYWF9NTUNfSVJRCTgzCisjZGVmaW5lIElOVF8yNFhYX01NQzJfSVJRCTg2CisjZGVmaW5lIElOVF8yNFhYX01DQlNQM19JUlFfVFgJODkKKyNkZWZpbmUgSU5UXzI0WFhfTUNCU1AzX0lSUV9SWAk5MAorI2RlZmluZSBJTlRfMjRYWF9TUEkzX0lSUQk5MQorCisjZGVmaW5lIElOVF8yNDNYX01DQlNQMl9JUlEJMTYKKyNkZWZpbmUgSU5UXzI0M1hfTUNCU1AzX0lSUQkxNworI2RlZmluZSBJTlRfMjQzWF9NQ0JTUDRfSVJRCTE4CisjZGVmaW5lIElOVF8yNDNYX01DQlNQNV9JUlEJMTkKKyNkZWZpbmUgSU5UXzI0M1hfTUNCU1AxX0lSUQk2NAorI2RlZmluZSBJTlRfMjQzWF9IU19VU0JfTUMJOTIKKyNkZWZpbmUgSU5UXzI0M1hfSFNfVVNCX0RNQQk5MworI2RlZmluZSBJTlRfMjQzWF9DQVJLSVRfSVJRCTk0CisKKyNkZWZpbmUgSU5UXzM0WFhfQkVOQ0hfTVBVX0VNVUwJMworI2RlZmluZSBJTlRfMzRYWF9TVF9NQ0JTUDJfSVJRCTQKKyNkZWZpbmUgSU5UXzM0WFhfU1RfTUNCU1AzX0lSUQk1CisjZGVmaW5lIElOVF8zNFhYX1NTTV9BQk9SVF9JUlEJNgorI2RlZmluZSBJTlRfMzRYWF9TWVNfTklSUQk3CisjZGVmaW5lIElOVF8zNFhYX0QyRF9GV19JUlEJOAorI2RlZmluZSBJTlRfMzRYWF9QUkNNX01QVV9JUlEJMTEKKyNkZWZpbmUgSU5UXzM0WFhfTUNCU1AxX0lSUQkxNgorI2RlZmluZSBJTlRfMzRYWF9NQ0JTUDJfSVJRCTE3CisjZGVmaW5lIElOVF8zNFhYX01DQlNQM19JUlEJMjIKKyNkZWZpbmUgSU5UXzM0WFhfTUNCU1A0X0lSUQkyMworI2RlZmluZSBJTlRfMzRYWF9DQU1fSVJRCTI0CisjZGVmaW5lIElOVF8zNFhYX01DQlNQNV9JUlEJMjcKKyNkZWZpbmUgSU5UXzM0WFhfR1BJT19CQU5LMQkyOQorI2RlZmluZSBJTlRfMzRYWF9HUElPX0JBTksyCTMwCisjZGVmaW5lIElOVF8zNFhYX0dQSU9fQkFOSzMJMzEKKyNkZWZpbmUgSU5UXzM0WFhfR1BJT19CQU5LNAkzMgorI2RlZmluZSBJTlRfMzRYWF9HUElPX0JBTks1CTMzCisjZGVmaW5lIElOVF8zNFhYX0dQSU9fQkFOSzYJMzQKKyNkZWZpbmUgSU5UXzM0WFhfVVNJTV9JUlEJMzUKKyNkZWZpbmUgSU5UXzM0WFhfV0RUM19JUlEJMzYKKyNkZWZpbmUgSU5UXzM0WFhfU1BJNF9JUlEJNDgKKyNkZWZpbmUgSU5UXzM0WFhfU0hBMU1ENTJfSVJRCTQ5CisjZGVmaW5lIElOVF8zNFhYX0ZQS0FfUkVBRFlfSVJRCTUwCisjZGVmaW5lIElOVF8zNFhYX1NIQTFNRDUxX0lSUQk1MQorI2RlZmluZSBJTlRfMzRYWF9STkdfSVJRCTUyCisjZGVmaW5lIElOVF8zNFhYX0kyQzNfSVJRCTYxCisjZGVmaW5lIElOVF8zNFhYX0ZQS0FfRVJST1JfSVJRCTY0CisjZGVmaW5lIElOVF8zNFhYX1BCSUFTX0lSUQk3NQorI2RlZmluZSBJTlRfMzRYWF9PSENJX0lSUQk3NgorI2RlZmluZSBJTlRfMzRYWF9FSENJX0lSUQk3NworI2RlZmluZSBJTlRfMzRYWF9UTExfSVJRCTc4CisjZGVmaW5lIElOVF8zNFhYX1BBUlRIQVNIX0lSUQk3OQorI2RlZmluZSBJTlRfMzRYWF9NTUMzX0lSUQk5NAorI2RlZmluZSBJTlRfMzRYWF9HUFQxMl9JUlEJOTUKKworI2RlZmluZQlJTlRfMzRYWF9CRU5DSF9NUFVfRU1VTAkzCiAKIC8qIE1heC4gMTI4IGxldmVsIDIgSVJRcyAoT01BUDE2MTApLCAxOTIgR1BJT3MgKE9NQVA3MzApIGFuZAogICogMTYgTVBVSU8gbGluZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWNic3AuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWNic3AuaAppbmRleCA2ZWI0NGE5Li42YTBkMWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21jYnNwLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tY2JzcC5oCkBAIC00Myw5ICs0MywxNSBAQAogCiAjZGVmaW5lIE9NQVAyNFhYX01DQlNQMV9CQVNFCTB4NDgwNzQwMDAKICNkZWZpbmUgT01BUDI0WFhfTUNCU1AyX0JBU0UJMHg0ODA3NjAwMAorI2RlZmluZSBPTUFQMjQzMF9NQ0JTUDNfQkFTRQkweDQ4MDhjMDAwCisjZGVmaW5lIE9NQVAyNDMwX01DQlNQNF9CQVNFCTB4NDgwOGUwMDAKKyNkZWZpbmUgT01BUDI0MzBfTUNCU1A1X0JBU0UJMHg0ODA5NjAwMAogCiAjZGVmaW5lIE9NQVAzNFhYX01DQlNQMV9CQVNFCTB4NDgwNzQwMDAKICNkZWZpbmUgT01BUDM0WFhfTUNCU1AyX0JBU0UJMHg0OTAyMjAwMAorI2RlZmluZSBPTUFQMzRYWF9NQ0JTUDNfQkFTRQkweDQ5MDI0MDAwCisjZGVmaW5lIE9NQVAzNFhYX01DQlNQNF9CQVNFCTB4NDkwMjYwMDAKKyNkZWZpbmUgT01BUDM0WFhfTUNCU1A1X0JBU0UJMHg0ODA5NjAwMAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTVYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQogCkBAIC04MSw5ICs4Nyw2IEBACiAjZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJHCTB4M0EKICNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkgJMHgzQwogCi0jZGVmaW5lIE9NQVBfTUFYX01DQlNQX0NPVU5UCTMKLSNkZWZpbmUgTUFYX01DQlNQX0NMT0NLUwkzCi0KICNkZWZpbmUgQVVESU9fTUNCU1BfREFUQVdSSVRFCShPTUFQMTUxMF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RYUjEpCiAjZGVmaW5lIEFVRElPX01DQlNQX0RBVEFSRUFECShPTUFQMTUxMF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUjEpCiAKQEAgLTkxLDEyICs5NCwxNCBAQAogI2RlZmluZSBBVURJT19ETUFfVFgJCU9NQVBfRE1BX01DQlNQMV9UWAogI2RlZmluZSBBVURJT19ETUFfUlgJCU9NQVBfRE1BX01DQlNQMV9SWAogCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKIAogI2RlZmluZSBPTUFQX01DQlNQX1JFR19EUlIyCTB4MDAKICNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSMQkweDA0CiAjZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RYUjIJMHgwOAogI2RlZmluZSBPTUFQX01DQlNQX1JFR19EWFIxCTB4MEMKKyNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSCTB4MDAKKyNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFhSCTB4MDgKICNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1BDUjIJMHgxMAogI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUENSMQkweDE0CiAjZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDUjIJMHgxOApAQCAtMTI0LDkgKzEyOSw5IEBACiAjZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJICTB4NzAKICNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkcJMHg3NAogI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSSAkweDc4Ci0KLSNkZWZpbmUgT01BUF9NQVhfTUNCU1BfQ09VTlQJMgotI2RlZmluZSBNQVhfTUNCU1BfQ0xPQ0tTCTIKKyNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1lTQ09OCTB4OEMKKyNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENDUgkweEFDCisjZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDQ1IJMHhCMAogCiAjZGVmaW5lIEFVRElPX01DQlNQX0RBVEFXUklURQkoT01BUDI0WFhfTUNCU1AyX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIxKQogI2RlZmluZSBBVURJT19NQ0JTUF9EQVRBUkVBRAkoT01BUDI0WFhfTUNCU1AyX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIxKQpAQCAtMTM3LDEwICsxNDIsNiBAQAogCiAjZW5kaWYKIAotI2RlZmluZSBPTUFQX01DQlNQX1JFQUQoYmFzZSwgcmVnKQkJX19yYXdfcmVhZHcoKGJhc2UpICsgT01BUF9NQ0JTUF9SRUdfIyNyZWcpCi0jZGVmaW5lIE9NQVBfTUNCU1BfV1JJVEUoYmFzZSwgcmVnLCB2YWwpCV9fcmF3X3dyaXRldygodmFsKSwgKGJhc2UpICsgT01BUF9NQ0JTUF9SRUdfIyNyZWcpCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1jQlNQIFNQQ1IxIGJpdCBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgUlJTVAkJCTB4MDAwMQogI2RlZmluZSBSUkRZCQkJMHgwMDAyCkBAIC0xNTEsNiArMTUyLDcgQEAKICNkZWZpbmUgRFhFTkEJCQkweDAwODAKICNkZWZpbmUgQ0xLU1RQKHZhbHVlKQkJKCh2YWx1ZSk8PDExKQkvKiBiaXRzIDExOjEyICovCiAjZGVmaW5lIFJKVVNUKHZhbHVlKQkJKCh2YWx1ZSk8PDEzKQkvKiBiaXRzIDEzOjE0ICovCisjZGVmaW5lIEFMQgkJCTB4ODAwMAogI2RlZmluZSBETEIJCQkweDgwMDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1jQlNQIFNQQ1IyIGJpdCBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyOCw2ICsyMzAsMTcgQEAKICNkZWZpbmUgWFBBQkxLKHZhbHVlKQkJKCh2YWx1ZSk8PDUpCS8qIEJpdHMgNTo2ICovCiAjZGVmaW5lIFhQQkJMSyh2YWx1ZSkJCSgodmFsdWUpPDw3KQkvKiBCaXRzIDc6OCAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKiogTWNCU1AgWENDUiBiaXQgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRElMQgkJCTB4MDAyMAorI2RlZmluZSBYRE1BRU4JCQkweDAwMDgKKyNkZWZpbmUgWERJU0FCTEUJCTB4MDAwMQorCisvKioqKioqKioqKioqKioqKioqKioqKiBNY0JTUCBSQ0NSIGJpdCBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSRE1BRU4JCQkweDAwMDgKKyNkZWZpbmUgUkRJU0FCTEUJCTB4MDAwMQorCisvKioqKioqKioqKioqKioqKioqKioqKiBNY0JTUCBTWVNDT05GSUcgYml0IGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTT0ZUUlNUCQkJMHgwMDAyCiAKIC8qIHdlIGRvbid0IGRvIG11bHRpY2hhbm5lbCBmb3Igbm93ICovCiBzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnIHsKQEAgLTI2MCw2ICsyNzMsOCBAQAogCU9NQVBfTUNCU1AxID0gMCwKIAlPTUFQX01DQlNQMiwKIAlPTUFQX01DQlNQMywKKwlPTUFQX01DQlNQNCwKKwlPTUFQX01DQlNQNQogfSBvbWFwX21jYnNwX2lkOwogCiB0eXBlZGVmIGludCBfX2JpdHdpc2Ugb21hcF9tY2JzcF9pb190eXBlX3Q7CkBAIC0zMTEsMTEgKzMyNiwxMCBAQAogc3RydWN0IG9tYXBfbWNic3Bfb3BzIHsKIAl2b2lkICgqcmVxdWVzdCkodW5zaWduZWQgaW50KTsKIAl2b2lkICgqZnJlZSkodW5zaWduZWQgaW50KTsKLQlpbnQgKCpjaGVjaykodW5zaWduZWQgaW50KTsKIH07CiAKIHN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgewotCXUzMiB2aXJ0X2Jhc2U7CisJdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CiAJdTggZG1hX3J4X3N5bmMsIGRtYV90eF9zeW5jOwogCXUxNiByeF9pcnEsIHR4X2lycTsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9vcHMgKm9wczsKQEAgLTMyNCw3ICszMzgsOCBAQAogCiBzdHJ1Y3Qgb21hcF9tY2JzcCB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXUzMiBpb19iYXNlOworCXVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAl1OCBpZDsKIAl1OCBmcmVlOwogCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggcnhfd29yZF9sZW5ndGg7CkBAIC0zNTIsNiArMzY3LDggQEAKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiB9OworZXh0ZXJuIHN0cnVjdCBvbWFwX21jYnNwICoqbWNic3BfcHRyOworZXh0ZXJuIGludCBvbWFwX21jYnNwX2NvdW50OwogCiBpbnQgb21hcF9tY2JzcF9pbml0KHZvaWQpOwogdm9pZCBvbWFwX21jYnNwX3JlZ2lzdGVyX2JvYXJkX2NmZyhzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpjb25maWcsCkBAIC0zNzYsNSArMzkzLDYgQEAKIC8qIFBvbGxlZCByZWFkL3dyaXRlIGZ1bmN0aW9ucyAqLwogaW50IG9tYXBfbWNic3BfcG9sbHJlYWQodW5zaWduZWQgaW50IGlkLCB1MTYgKiBidWYpOwogaW50IG9tYXBfbWNic3BfcG9sbHdyaXRlKHVuc2lnbmVkIGludCBpZCwgdTE2IGJ1Zik7CitpbnQgb21hcF9tY2JzcF9zZXRfaW9fdHlwZSh1bnNpZ25lZCBpbnQgaWQsIG9tYXBfbWNic3BfaW9fdHlwZV90IGlvX3R5cGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmluZGV4IGEzMjVjYWYuLmQ0MGNhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApAQCAtMzgsNyArMzgsNyBAQAogICovCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkKICNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4MTAwMDAwMDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKICNkZWZpbmUgUEhZU19PRkZTRVQJCVVMKDB4ODAwMDAwMDApCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tdGQteGlwLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL210ZC14aXAuaAppbmRleCA1Y2VlN2UxLi4zOWI1OTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL210ZC14aXAuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL210ZC14aXAuaApAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuIEl0J3MgaW5jbHVkZWQgZnJvbSBsaW51eC9tdGQveGlwLmgKICAqCi0gKiBBdXRob3I6IFZsYWRpbWlyIEJhcmlub3YgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKiBBdXRob3I6IFZsYWRpbWlyIEJhcmlub3YgPHZiYXJpbm92QGVtYmVkZGVkYWxsZXkuY29tPgogICoKICAqIChjKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbXV4LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL211eC5oCmluZGV4IDYxNGIyYzEuLjZiYmYxNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbXV4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tdXguaApAQCAtMTI1LDIwICsxMjUsNjQgQEAKIAkucHVfcGRfdmFsCT0gcHVsbF9tb2RlLAkJCQlcCiB9LAogCisvKiAyNHh4LzM0eHggbXV4IGJpdCBkZWZpbmVzICovCisjZGVmaW5lIE9NQVAyX1BVTExfRU5BCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQMl9QVUxMX1VQCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQMl9BTFRFTEVDVFJJQ0FMU0VMCSgxIDw8IDUpCiAKLSNkZWZpbmUgUFVMTF9ESVNBQkxFRAkwCi0jZGVmaW5lIFBVTExfRU5BQkxFRAkxCisvKiAzNHh4IHNwZWNpZmljIG11eCBiaXQgZGVmaW5lcyAqLworI2RlZmluZSBPTUFQM19JTlBVVF9FTgkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDNfT0ZGX0VOCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQM19PRkZPVVRfRU4JCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQM19PRkZPVVRfVkFMCSgxIDw8IDExKQorI2RlZmluZSBPTUFQM19PRkZfUFVMTF9FTgkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDNfT0ZGX1BVTExfVVAJKDEgPDwgMTMpCisjZGVmaW5lIE9NQVAzX1dBS0VVUF9FTgkJKDEgPDwgMTQpCiAKLSNkZWZpbmUgUFVMTF9ET1dOCTAKLSNkZWZpbmUgUFVMTF9VUAkJMQorLyogMzR4eCBtdXggbW9kZSBvcHRpb25zIGZvciBlYWNoIHBpbi4gU2VlIFRSTSBmb3Igb3B0aW9ucyAqLworI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTAJMAorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTEJMQorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTIJMgorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTMJMworI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTQJNAorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTUJNQorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTYJNgorI2RlZmluZQlPTUFQMzRYWF9NVVhfTU9ERTcJNworCisvKiAzNHh4IGFjdGl2ZSBwaW4gc3RhdGVzICovCisjZGVmaW5lIE9NQVAzNFhYX1BJTl9PVVRQVVQJCTAKKyNkZWZpbmUgT01BUDM0WFhfUElOX0lOUFVUCQlPTUFQM19JTlBVVF9FTgorI2RlZmluZSBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQCShPTUFQMl9QVUxMX0VOQSB8IE9NQVAzX0lOUFVUX0VOIFwKKwkJCQkJCXwgT01BUDJfUFVMTF9VUCkKKyNkZWZpbmUgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOCShPTUFQMl9QVUxMX0VOQSB8IE9NQVAzX0lOUFVUX0VOKQorCisvKiAzNHh4IG9mZiBtb2RlIHN0YXRlcyAqLworI2RlZmluZSBPTUFQMzRYWF9QSU5fT0ZGX05PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgT01BUDM0WFhfUElOX09GRl9PVVRQVVRfSElHSAkoT01BUDNfT0ZGX0VOIHwgT01BUDNfT0ZGT1VUX0VOIFwKKwkJCQkJCXwgT01BUDNfT0ZGT1VUX1ZBTCkKKyNkZWZpbmUgT01BUDM0WFhfUElOX09GRl9PVVRQVVRfTE9XCShPTUFQM19PRkZfRU4gfCBPTUFQM19PRkZPVVRfRU4pCisjZGVmaW5lIE9NQVAzNFhYX1BJTl9PRkZfSU5QVVRfUFVMTFVQCShPTUFQM19PRkZfRU4gfCBPTUFQM19PRkZfUFVMTF9FTiBcCisJCQkJCQl8IE9NQVAzX09GRl9QVUxMX1VQKQorI2RlZmluZSBPTUFQMzRYWF9QSU5fT0ZGX0lOUFVUX1BVTExET1dOCShPTUFQM19PRkZfRU4gfCBPTUFQM19PRkZfUFVMTF9FTikKKyNkZWZpbmUgT01BUDM0WFhfUElOX09GRl9XQUtFVVBFTkFCTEUJT01BUDNfV0FLRVVQX0VOCisKKyNkZWZpbmUgTVVYX0NGR18zNFhYKGRlc2MsIHJlZ19vZmZzZXQsIG11eF92YWx1ZSkgewkJXAorCS5uYW1lCQk9IGRlc2MsCQkJCQlcCisJLmRlYnVnCQk9IDAsCQkJCQlcCisJLm11eF9yZWcJPSByZWdfb2Zmc2V0LAkJCQlcCisJLm11eF92YWwJPSBtdXhfdmFsdWUJCQkJXAorfSwKIAogc3RydWN0IHBpbl9jb25maWcgewotCWNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgY2hhciBidXN5OwotCXVuc2lnbmVkIGNoYXIgZGVidWc7CisJY2hhciAJCQkqbmFtZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgCW11eF9yZWc7CisJdW5zaWduZWQgY2hhcgkJZGVidWc7CiAKLQljb25zdCBjaGFyICptdXhfcmVnX25hbWU7Ci0JY29uc3QgdW5zaWduZWQgaW50IG11eF9yZWc7CisjaWYJZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKKwl1MTYJCQltdXhfdmFsOyAvKiBXYWtlLXVwLCBvZmYgbW9kZSwgcHVsbCwgbXV4IG1vZGUgKi8KKyNlbmRpZgorCisjaWYJZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkKIAljb25zdCB1bnNpZ25lZCBjaGFyIG1hc2tfb2Zmc2V0OwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgbWFzazsKIApAQCAtMTUwLDYgKzE5NCwxMiBAQAogCWNvbnN0IGNoYXIgKnB1X3BkX25hbWU7CiAJY29uc3QgdW5zaWduZWQgaW50IHB1X3BkX3JlZzsKIAljb25zdCB1bnNpZ25lZCBjaGFyIHB1X3BkX3ZhbDsKKyNlbmRpZgorCisjaWYJZGVmaW5lZChDT05GSUdfT01BUF9NVVhfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTKQorCWNvbnN0IGNoYXIgKm11eF9yZWdfbmFtZTsKKyNlbmRpZgorCiB9OwogCiBlbnVtIG9tYXA3MzBfaW5kZXggewpAQCAtNTkzLDYgKzY0MywxMTQgQEAKIAogfTsKIAorZW51bSBvbWFwMzR4eF9pbmRleCB7CisJLyogMzR4eCBJMkMgKi8KKwlLMjFfMzRYWF9JMkMxX1NDTCwKKwlKMjFfMzRYWF9JMkMxX1NEQSwKKwlBRjE1XzM0WFhfSTJDMl9TQ0wsCisJQUUxNV8zNFhYX0kyQzJfU0RBLAorCUFGMTRfMzRYWF9JMkMzX1NDTCwKKwlBRzE0XzM0WFhfSTJDM19TREEsCisJQUQyNl8zNFhYX0kyQzRfU0NMLAorCUFFMjZfMzRYWF9JMkM0X1NEQSwKKworCS8qIFBIWSAtIEhTVVNCOiAxMi1waW4gVUxQSSBQSFk6IFBvcnQgMSovCisJWThfMzQzMF9VU0IxSFNfUEhZX0NMSywKKwlZOV8zNDMwX1VTQjFIU19QSFlfU1RQLAorCUFBMTRfMzQzMF9VU0IxSFNfUEhZX0RJUiwKKwlBQTExXzM0MzBfVVNCMUhTX1BIWV9OWFQsCisJVzEzXzM0MzBfVVNCMUhTX1BIWV9EQVRBMCwKKwlXMTJfMzQzMF9VU0IxSFNfUEhZX0RBVEExLAorCVcxMV8zNDMwX1VTQjFIU19QSFlfREFUQTIsCisJWTExXzM0MzBfVVNCMUhTX1BIWV9EQVRBMywKKwlXOV8zNDMwX1VTQjFIU19QSFlfREFUQTQsCisJWTEyXzM0MzBfVVNCMUhTX1BIWV9EQVRBNSwKKwlXOF8zNDMwX1VTQjFIU19QSFlfREFUQTYsCisJWTEzXzM0MzBfVVNCMUhTX1BIWV9EQVRBNywKKworCS8qIFBIWSAtIEhTVVNCOiAxMi1waW4gVUxQSSBQSFk6IFBvcnQgMiovCisJQUE4XzM0MzBfVVNCMkhTX1BIWV9DTEssCisJQUExMF8zNDMwX1VTQjJIU19QSFlfU1RQLAorCUFBOV8zNDMwX1VTQjJIU19QSFlfRElSLAorCUFCMTFfMzQzMF9VU0IySFNfUEhZX05YVCwKKwlBQjEwXzM0MzBfVVNCMkhTX1BIWV9EQVRBMCwKKwlBQjlfMzQzMF9VU0IySFNfUEhZX0RBVEExLAorCVczXzM0MzBfVVNCMkhTX1BIWV9EQVRBMiwKKwlUNF8zNDMwX1VTQjJIU19QSFlfREFUQTMsCisJVDNfMzQzMF9VU0IySFNfUEhZX0RBVEE0LAorCVIzXzM0MzBfVVNCMkhTX1BIWV9EQVRBNSwKKwlSNF8zNDMwX1VTQjJIU19QSFlfREFUQTYsCisJVDJfMzQzMF9VU0IySFNfUEhZX0RBVEE3LAorCisKKwkvKiBUTEwgLSBIU1VTQjogMTItcGluIFRMTCBQb3J0IDEqLworCVk4XzM0MzBfVVNCMUhTX1RMTF9DTEssCisJWTlfMzQzMF9VU0IxSFNfVExMX1NUUCwKKwlBQTE0XzM0MzBfVVNCMUhTX1RMTF9ESVIsCisJQUExMV8zNDMwX1VTQjFIU19UTExfTlhULAorCVcxM18zNDMwX1VTQjFIU19UTExfREFUQTAsCisJVzEyXzM0MzBfVVNCMUhTX1RMTF9EQVRBMSwKKwlXMTFfMzQzMF9VU0IxSFNfVExMX0RBVEEyLAorCVkxMV8zNDMwX1VTQjFIU19UTExfREFUQTMsCisJVzlfMzQzMF9VU0IxSFNfVExMX0RBVEE0LAorCVkxMl8zNDMwX1VTQjFIU19UTExfREFUQTUsCisJVzhfMzQzMF9VU0IxSFNfVExMX0RBVEE2LAorCVkxM18zNDMwX1VTQjFIU19UTExfREFUQTcsCisKKwkvKiBUTEwgLSBIU1VTQjogMTItcGluIFRMTCBQb3J0IDIqLworCUFBOF8zNDMwX1VTQjJIU19UTExfQ0xLLAorCUFBMTBfMzQzMF9VU0IySFNfVExMX1NUUCwKKwlBQTlfMzQzMF9VU0IySFNfVExMX0RJUiwKKwlBQjExXzM0MzBfVVNCMkhTX1RMTF9OWFQsCisJQUIxMF8zNDMwX1VTQjJIU19UTExfREFUQTAsCisJQUI5XzM0MzBfVVNCMkhTX1RMTF9EQVRBMSwKKwlXM18zNDMwX1VTQjJIU19UTExfREFUQTIsCisJVDRfMzQzMF9VU0IySFNfVExMX0RBVEEzLAorCVQzXzM0MzBfVVNCMkhTX1RMTF9EQVRBNCwKKwlSM18zNDMwX1VTQjJIU19UTExfREFUQTUsCisJUjRfMzQzMF9VU0IySFNfVExMX0RBVEE2LAorCVQyXzM0MzBfVVNCMkhTX1RMTF9EQVRBNywKKworCS8qIFRMTCAtIEhTVVNCOiAxMi1waW4gVExMIFBvcnQgMyovCisJQUE2XzM0MzBfVVNCM0hTX1RMTF9DTEssCisJQUIzXzM0MzBfVVNCM0hTX1RMTF9TVFAsCisJQUEzXzM0MzBfVVNCM0hTX1RMTF9ESVIsCisJWTNfMzQzMF9VU0IzSFNfVExMX05YVCwKKwlBQTVfMzQzMF9VU0IzSFNfVExMX0RBVEEwLAorCVk0XzM0MzBfVVNCM0hTX1RMTF9EQVRBMSwKKwlZNV8zNDMwX1VTQjNIU19UTExfREFUQTIsCisJVzVfMzQzMF9VU0IzSFNfVExMX0RBVEEzLAorCUFCMTJfMzQzMF9VU0IzSFNfVExMX0RBVEE0LAorCUFCMTNfMzQzMF9VU0IzSFNfVExMX0RBVEE1LAorCUFBMTNfMzQzMF9VU0IzSFNfVExMX0RBVEE2LAorCUFBMTJfMzQzMF9VU0IzSFNfVExMX0RBVEE3LAorCisJLyogUEhZIEZTVVNCOiBGUyBTZXJpYWwgZm9yIFBvcnQgMSAobXVsdGlwbGUgUEhZIG1vZGVzIHN1cHBvcnRlZCkgKi8KKwlBRjEwXzM0MzBfVVNCMUZTX1BIWV9NTTFfUlhEUCwKKwlBRzlfMzQzMF9VU0IxRlNfUEhZX01NMV9SWERNLAorCVcxM18zNDMwX1VTQjFGU19QSFlfTU0xX1JYUkNWLAorCVcxMl8zNDMwX1VTQjFGU19QSFlfTU0xX1RYU0UwLAorCVcxMV8zNDMwX1VTQjFGU19QSFlfTU0xX1RYREFULAorCVkxMV8zNDMwX1VTQjFGU19QSFlfTU0xX1RYRU5fTiwKKworCS8qIFBIWSBGU1VTQjogRlMgU2VyaWFsIGZvciBQb3J0IDIgKG11bHRpcGxlIFBIWSBtb2RlcyBzdXBwb3J0ZWQpICovCisJQUY3XzM0MzBfVVNCMkZTX1BIWV9NTTJfUlhEUCwKKwlBSDdfMzQzMF9VU0IyRlNfUEhZX01NMl9SWERNLAorCUFCMTBfMzQzMF9VU0IyRlNfUEhZX01NMl9SWFJDViwKKwlBQjlfMzQzMF9VU0IyRlNfUEhZX01NMl9UWFNFMCwKKwlXM18zNDMwX1VTQjJGU19QSFlfTU0yX1RYREFULAorCVQ0XzM0MzBfVVNCMkZTX1BIWV9NTTJfVFhFTl9OLAorCisJLyogUEhZIEZTVVNCOiBGUyBTZXJpYWwgZm9yIFBvcnQgMyAobXVsdGlwbGUgUEhZIG1vZGVzIHN1cHBvcnRlZCkgKi8KKwlBSDNfMzQzMF9VU0IzRlNfUEhZX01NM19SWERQLAorCUFFM18zNDMwX1VTQjNGU19QSFlfTU0zX1JYRE0sCisJQUQxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfUlhSQ1YsCisJQUUxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhTRTAsCisJQUQyXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhEQVQsCisJQUMxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhFTl9OLAorCit9OworCiBzdHJ1Y3Qgb21hcF9tdXhfY2ZnIHsKIAlzdHJ1Y3QgcGluX2NvbmZpZwkqcGluczsKIAl1bnNpZ25lZCBsb25nCQlzaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwMTUxMC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwMTUxMC5oCmluZGV4IDUwNWEzOGEuLmQyNDAwNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvb21hcDE1MTAuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXAxNTEwLmgKQEAgLTQ0LDUgKzQ0LDcgQEAKICNkZWZpbmUgT01BUDE1MTBfRFNQUkVHX1NJWkUJU1pfMTI4SwogI2RlZmluZSBPTUFQMTUxMF9EU1BSRUdfU1RBUlQJMHhFMTAwMDAwMAogCisjZGVmaW5lIE9NQVAxNTEwX0RTUF9NTVVfQkFTRQkoMHhmZmZlZDIwMCkKKwogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVAxNVhYX0ggKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwMTZ4eC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwMTZ4eC5oCmluZGV4IGM2YzkzYWYuLjBlNjliNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvb21hcDE2eHguaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXAxNnh4LmgKQEAgLTQ0LDYgKzQ0LDExIEBACiAjZGVmaW5lIE9NQVAxNlhYX0RTUFJFR19TSVpFCVNaXzEyOEsKICNkZWZpbmUgT01BUDE2WFhfRFNQUkVHX1NUQVJUCTB4RTEwMDAwMDAKIAorI2RlZmluZSBPTUFQMTZYWF9TRUNfQkFTRQkweEZGRkU0MDAwCisjZGVmaW5lIE9NQVAxNlhYX1NFQ19ERVMJKE9NQVAxNlhYX1NFQ19CQVNFICsgMHgwMDAwKQorI2RlZmluZSBPTUFQMTZYWF9TRUNfU0hBMU1ENQkoT01BUDE2WFhfU0VDX0JBU0UgKyAweDA4MDApCisjZGVmaW5lIE9NQVAxNlhYX1NFQ19STkcJKE9NQVAxNlhYX1NFQ19CQVNFICsgMHgxMDAwKQorCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJbnRlcnJ1cHRzCkBAIC0xOTAsNyArMTk1LDcgQEAKICNkZWZpbmUgV1NQUl9ESVNBQkxFXzAgICAgICAgICAoMHgwMDAwYWFhYSkKICNkZWZpbmUgV1NQUl9ESVNBQkxFXzEgICAgICAgICAoMHgwMDAwNTU1NSkKIAotLyogTWFpbGJveCAqLworI2RlZmluZSBPTUFQMTZYWF9EU1BfTU1VX0JBU0UJKDB4ZmZmZWQyMDApCiAjZGVmaW5lIE9NQVAxNlhYX01BSUxCT1hfQkFTRQkoMHhmZmZjZjAwMCkKIAogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVAxNlhYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvb21hcDI0eHguaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvb21hcDI0eHguaAppbmRleCBiYjgzMTlkLi4yNDMzNWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXAyNHh4LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwMjR4eC5oCkBAIC0zOSw3ICszOSw2IEBACiAvKiBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwogI2RlZmluZSBPTUFQMjRYWF9JQ19CQVNFCShMNF8yNFhYX0JBU0UgKyAweGZlMDAwKQogI2RlZmluZSBPTUFQMjRYWF9JVkFfSU5UQ19CQVNFCTB4NDAwMDAwMDAKLSNkZWZpbmUgSVJRX1NJUl9JUlEJCTB4MDA0MAogCiAjZGVmaW5lIE9NQVAyNDIwX0NUUkxfQkFTRQlMNF8yNFhYX0JBU0UKICNkZWZpbmUgT01BUDI0MjBfMzJLU1lOQ1RfQkFTRQkoTDRfMjRYWF9CQVNFICsgMHg0MDAwKQpAQCAtNDgsNiArNDcsNyBAQAogI2RlZmluZSBPTUFQMjQyMF9QUk1fQkFTRQlPTUFQMjQyMF9DTV9CQVNFCiAjZGVmaW5lIE9NQVAyNDIwX1NEUkNfQkFTRQkoTDNfMjRYWF9CQVNFICsgMHg5MDAwKQogI2RlZmluZSBPTUFQMjQyMF9TTVNfQkFTRQkweDY4MDA4MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQTUNfQkFTRQkweDY4MDBhMDAwCiAKICNkZWZpbmUgT01BUDI0MzBfMzJLU1lOQ1RfQkFTRQkoTDRfV0tfMjQzWF9CQVNFICsgMHgyMDAwMCkKICNkZWZpbmUgT01BUDI0MzBfUFJDTV9CQVNFCShMNF9XS18yNDNYX0JBU0UgKyAweDYwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXBmYi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9vbWFwZmIuaAppbmRleCBjYWUwMzdkLi5lYzY3ZmI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXBmYi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvb21hcGZiLmgKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRQkweDAwMDEwMDAwCiAjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19TQ0FMRQkweDAwMDIwMDAwCiAjZGVmaW5lIE9NQVBGQl9DQVBTX1dJTkRPV19PVkVSTEFZCTB4MDAwNDAwMDAKKyNkZWZpbmUgT01BUEZCX0NBUFNfV0lORE9XX1JPVEFURQkweDAwMDgwMDAwCiAjZGVmaW5lIE9NQVBGQl9DQVBTX1NFVF9CQUNLTElHSFQJMHgwMTAwMDAwMAogCiAvKiBWYWx1ZXMgZnJvbSBEU1AgbXVzdCBtYXAgdG8gbG93ZXIgMTYtYml0cyAqLwpAQCAtMzA1LDYgKzMwNiw3IEBACiAJCQkJCSAgIGludCBzY3JlZW5fd2lkdGgsCiAJCQkJCSAgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsCiAJCQkJCSAgIGludCBoZWlnaHQsIGludCBjb2xvcl9tb2RlKTsKKwlpbnQJCSgqc2V0X3JvdGF0ZSkJICAoaW50IGFuZ2xlKTsKIAlpbnQJCSgqc2V0dXBfbWVtKQkgIChpbnQgcGxhbmUsIHNpemVfdCBzaXplLAogCQkJCQkgICBpbnQgbWVtX3R5cGUsIHVuc2lnbmVkIGxvbmcgKnBhZGRyKTsKIAlpbnQJCSgqbW1hcCkJCSAgKHN0cnVjdCBmYl9pbmZvICppbmZvLApAQCAtMzc0LDYgKzM3Niw3IEBACiBleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAyX2Rpc3BfY3RybDsKICNlbmRpZgogCitleHRlcm4gdm9pZCBvbWFwZmJfcmVzZXJ2ZV9zZHJhbSh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXBmYl9yZWdpc3Rlcl9wYW5lbChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCk7CiBleHRlcm4gdm9pZCBvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1MTYgcGl4dmFsKTsKIGV4dGVybiB2b2lkIG9tYXBmYl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3BtLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3BtLmgKaW5kZXggYmZhMDkzMi4uNzY4ZWI2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvcG0uaApAQCAtMzksMTEgKzM5LDExIEBACiAgKiBSZWdpc3RlciBhbmQgb2Zmc2V0IGRlZmluaXRpb25zIHRvIGJlIHVzZWQgaW4gUE0gYXNzZW1ibGVyIGNvZGUKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2RlZmluZSBDTEtHRU5fUkVHX0FTTV9CQVNFCQlpb19wMnYoMHhmZmZlY2UwMCkKKyNkZWZpbmUgQ0xLR0VOX1JFR19BU01fQkFTRQkJSU9fQUREUkVTUygweGZmZmVjZTAwKQogI2RlZmluZSBBUk1fSURMRUNUMV9BU01fT0ZGU0VUCQkweDA0CiAjZGVmaW5lIEFSTV9JRExFQ1QyX0FTTV9PRkZTRVQJCTB4MDgKIAotI2RlZmluZSBUQ01JRl9BU01fQkFTRQkJCWlvX3AydigweGZmZmVjYzAwKQorI2RlZmluZSBUQ01JRl9BU01fQkFTRQkJCUlPX0FERFJFU1MoMHhmZmZlY2MwMCkKICNkZWZpbmUgRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQJCTB4MGMKICNkZWZpbmUgRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQJMHgyMAogCkBAIC0xMzUsNyArMTM1LDggQEAKIGV4dGVybiB2b2lkIG9tYXA3MzBfY3B1X3N1c3BlbmQodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKIGV4dGVybiB2b2lkIG9tYXAxNTEwX2NwdV9zdXNwZW5kKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CiBleHRlcm4gdm9pZCBvbWFwMTYxMF9jcHVfc3VzcGVuZCh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOwotZXh0ZXJuIHZvaWQgb21hcDI0eHhfY3B1X3N1c3BlbmQodTMyIGRsbF9jdHJsLCB1MzIgY3B1X3JldmlzaW9uKTsKK2V4dGVybiB2b2lkIG9tYXAyNHh4X2NwdV9zdXNwZW5kKHUzMiBkbGxfY3RybCwgdm9pZCBfX2lvbWVtICpzZHJjX2RsbGFfY3RybCwKKwkJCQkJdm9pZCBfX2lvbWVtICpzZHJjX3Bvd2VyKTsKIGV4dGVybiB2b2lkIG9tYXA3MzBfaWRsZV9sb29wX3N1c3BlbmQodm9pZCk7CiBleHRlcm4gdm9pZCBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCh2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9wb3dlcmRvbWFpbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9wb3dlcmRvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDZhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3Bvd2VyZG9tYWluLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBPTUFQMi8zIHBvd2VyZG9tYWluIGNvbnRyb2wKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQVNNX0FSTV9BUkNIX09NQVBfUE9XRVJET01BSU4KKyNkZWZpbmUgQVNNX0FSTV9BUkNIX09NQVBfUE9XRVJET01BSU4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKworCisvKiBQb3dlcmRvbWFpbiBiYXNpYyBwb3dlciBzdGF0ZXMgKi8KKyNkZWZpbmUgUFdSRE1fUE9XRVJfT0ZGCQkweDAKKyNkZWZpbmUgUFdSRE1fUE9XRVJfUkVUCQkweDEKKyNkZWZpbmUgUFdSRE1fUE9XRVJfSU5BQ1RJVkUJMHgyCisjZGVmaW5lIFBXUkRNX1BPV0VSX09OCQkweDMKKworLyogUG93ZXJkb21haW4gYWxsb3dhYmxlIHN0YXRlIGJpdGZpZWxkcyAqLworI2RlZmluZSBQV1JTVFNfT0ZGX09OCQkoKDEgPDwgUFdSRE1fUE9XRVJfT0ZGKSB8IFwKKwkJCQkgKDEgPDwgUFdSRE1fUE9XRVJfT04pKQorCisjZGVmaW5lIFBXUlNUU19PRkZfUkVUCQkoKDEgPDwgUFdSRE1fUE9XRVJfT0ZGKSB8IFwKKwkJCQkgKDEgPDwgUFdSRE1fUE9XRVJfUkVUKSkKKworI2RlZmluZSBQV1JTVFNfT0ZGX1JFVF9PTgkoUFdSU1RTX09GRl9SRVQgfCAoMSA8PCBQV1JETV9QT1dFUl9PTikpCisKKworLyogUG93ZXJkb21haW4gZmxhZ3MgKi8KKyNkZWZpbmUgUFdSRE1fSEFTX0hEV1JfU0FSCSgxIDw8IDApIC8qIGhhcmR3YXJlIHNhdmUtYW5kLXJlc3RvcmUgc3VwcG9ydCAqLworCisKKy8qCisgKiBOdW1iZXIgb2YgbWVtb3J5IGJhbmtzIHRoYXQgYXJlIHBvd2VyLWNvbnRyb2xsYWJsZS4JT24gT01BUDM0MzAsIHRoZQorICogbWF4aW11bSBpcyA0LgorICovCisjZGVmaW5lIFBXUkRNX01BWF9NRU1fQkFOS1MJNAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgY2xvY2tkb21haW5zIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHBvd2VyZG9tYWluLgorICogQ09SRSBwb3dlcmRvbWFpbiBpcyBwcm9iYWJseSB0aGUgd29yc3QgY2FzZS4KKyAqLworI2RlZmluZSBQV1JETV9NQVhfQ0xLRE1TCTMKKworLyogWFhYIEEgY29tcGxldGVseSBhcmJpdHJhcnkgbnVtYmVyLiBXaGF0IGlzIHJlYXNvbmFibGUgaGVyZT8gKi8KKyNkZWZpbmUgUFdSRE1fVFJBTlNJVElPTl9CQUlMT1VUIDEwMDAwMAorCitzdHJ1Y3QgY2xvY2tkb21haW47CitzdHJ1Y3QgcG93ZXJkb21haW47CisKKy8qIEVuY29kZXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gcG93ZXJkb21haW5zIC0gc3RhdGljYWxseSBkZWZpbmVkICovCitzdHJ1Y3QgcHdyZG1fZGVwIHsKKworCS8qIFBvd2VyZG9tYWluIG5hbWUgKi8KKwljb25zdCBjaGFyICpwd3JkbV9uYW1lOworCisJLyogUG93ZXJkb21haW4gcG9pbnRlciAtIHJlc29sdmVkIGJ5IHRoZSBwb3dlcmRvbWFpbiBjb2RlICovCisJc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTsKKworCS8qIEZsYWdzIHRvIG1hcmsgT01BUCBjaGlwIHJlc3RyaWN0aW9ucywgZXRjLiAqLworCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOworCit9OworCitzdHJ1Y3QgcG93ZXJkb21haW4geworCisJLyogUG93ZXJkb21haW4gbmFtZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiB0aGUgYWRkcmVzcyBvZmZzZXQgZnJvbSBDTV9CQVNFL1BSTV9CQVNFICovCisJY29uc3QgczE2IHByY21fb2ZmczsKKworCS8qIFVzZWQgdG8gcmVwcmVzZW50IHRoZSBPTUFQIGNoaXAgdHlwZXMgY29udGFpbmluZyB0aGlzIHB3cmRtICovCisJY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CisKKwkvKiBCaXQgc2hpZnQgb2YgdGhpcyBwb3dlcmRvbWFpbidzIFBNX1dLREVQL0NNX1NMRUVQREVQIGJpdCAqLworCWNvbnN0IHU4IGRlcF9iaXQ7CisKKwkvKiBQb3dlcmRvbWFpbnMgdGhhdCBjYW4gYmUgdG9sZCB0byB3YWtlIHRoaXMgcG93ZXJkb21haW4gdXAgKi8KKwlzdHJ1Y3QgcHdyZG1fZGVwICp3a2RlcF9zcmNzOworCisJLyogUG93ZXJkb21haW5zIHRoYXQgY2FuIGJlIHRvbGQgdG8ga2VlcCB0aGlzIHB3cmRtIGZyb20gaW5hY3Rpdml0eSAqLworCXN0cnVjdCBwd3JkbV9kZXAgKnNsZWVwZGVwX3NyY3M7CisKKwkvKiBQb3NzaWJsZSBwb3dlcmRvbWFpbiBwb3dlciBzdGF0ZXMgKi8KKwljb25zdCB1OCBwd3JzdHM7CisKKwkvKiBQb3NzaWJsZSBsb2dpYyBwb3dlciBzdGF0ZXMgd2hlbiBwd3JkbSBpbiBSRVRFTlRJT04gKi8KKwljb25zdCB1OCBwd3JzdHNfbG9naWNfcmV0OworCisJLyogUG93ZXJkb21haW4gZmxhZ3MgKi8KKwljb25zdCB1OCBmbGFnczsKKworCS8qIE51bWJlciBvZiBzb2Z0d2FyZS1jb250cm9sbGFibGUgbWVtb3J5IGJhbmtzIGluIHRoaXMgcG93ZXJkb21haW4gKi8KKwljb25zdCB1OCBiYW5rczsKKworCS8qIFBvc3NpYmxlIG1lbW9yeSBiYW5rIHB3cnN0YXRlcyB3aGVuIHB3cmRtIGluIFJFVEVOVElPTiAqLworCWNvbnN0IHU4IHB3cnN0c19tZW1fcmV0W1BXUkRNX01BWF9NRU1fQkFOS1NdOworCisJLyogUG9zc2libGUgbWVtb3J5IGJhbmsgcHdyc3RhdGVzIHdoZW4gcHdyZG0gaXMgT04gKi8KKwljb25zdCB1OCBwd3JzdHNfbWVtX29uW1BXUkRNX01BWF9NRU1fQkFOS1NdOworCisJLyogQ2xvY2tkb21haW5zIGluIHRoaXMgcG93ZXJkb21haW4gKi8KKwlzdHJ1Y3QgY2xvY2tkb21haW4gKnB3cmRtX2Nsa2Rtc1tQV1JETV9NQVhfQ0xLRE1TXTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKworfTsKKworCit2b2lkIHB3cmRtX2luaXQoc3RydWN0IHBvd2VyZG9tYWluICoqcHdyZG1fbGlzdCk7CisKK2ludCBwd3JkbV9yZWdpc3RlcihzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKK2ludCBwd3JkbV91bnJlZ2lzdGVyKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBwd3JkbV9mb3JfZWFjaChpbnQgKCpmbikoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkpOworCitpbnQgcHdyZG1fYWRkX2Nsa2RtKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pOworaW50IHB3cmRtX2RlbF9jbGtkbShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsa2RtKTsKK2ludCBwd3JkbV9mb3JfZWFjaF9jbGtkbShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLAorCQkJIGludCAoKmZuKShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLAorCQkJCSAgIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pKTsKKworaW50IHB3cmRtX2FkZF93a2RlcChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMSwgc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTIpOworaW50IHB3cmRtX2RlbF93a2RlcChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMSwgc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTIpOworaW50IHB3cmRtX3JlYWRfd2tkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKTsKK2ludCBwd3JkbV9hZGRfc2xlZXBkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKTsKK2ludCBwd3JkbV9kZWxfc2xlZXBkZXAoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbTEsIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0yKTsKK2ludCBwd3JkbV9yZWFkX3NsZWVwZGVwKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0xLCBzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtMik7CisKK2ludCBwd3JkbV9nZXRfbWVtX2JhbmtfY291bnQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CisKK2ludCBwd3JkbV9zZXRfbmV4dF9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB1OCBwd3JzdCk7CitpbnQgcHdyZG1fcmVhZF9uZXh0X3B3cnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworaW50IHB3cmRtX3JlYWRfcHJldl9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKK2ludCBwd3JkbV9jbGVhcl9hbGxfcHJldl9wd3JzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKKworaW50IHB3cmRtX3NldF9sb2dpY19yZXRzdChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB1OCBwd3JzdCk7CitpbnQgcHdyZG1fc2V0X21lbV9vbnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHU4IGJhbmssIHU4IHB3cnN0KTsKK2ludCBwd3JkbV9zZXRfbWVtX3JldHN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHU4IGJhbmssIHU4IHB3cnN0KTsKKworaW50IHB3cmRtX3JlYWRfbG9naWNfcHdyc3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CitpbnQgcHdyZG1fcmVhZF9wcmV2X2xvZ2ljX3B3cnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworaW50IHB3cmRtX3JlYWRfbWVtX3B3cnN0KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHU4IGJhbmspOworaW50IHB3cmRtX3JlYWRfcHJldl9tZW1fcHdyc3Qoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSwgdTggYmFuayk7CisKK2ludCBwd3JkbV9lbmFibGVfaGR3cl9zYXIoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CitpbnQgcHdyZG1fZGlzYWJsZV9oZHdyX3NhcihzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKK2Jvb2wgcHdyZG1faGFzX2hkd3Jfc2FyKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworCitpbnQgcHdyZG1fd2FpdF90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc2RyYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zZHJjLmgKaW5kZXggNzg3YjdhYy4uYTk4YzZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zZHJjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zZHJjLmgKQEAgLTI1LDYgKzI1LDggQEAKICNkZWZpbmUgU0RSQ19ETExCX1NUQVRVUwkweDA2QwogI2RlZmluZSBTRFJDX1BPV0VSCQkweDA3MAogI2RlZmluZSBTRFJDX01SXzAJCTB4MDg0CisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTF9BXzAJMHgwOWMKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMX0JfMAkweDBhMAogI2RlZmluZSBTRFJDX1JGUl9DVFJMXzAJCTB4MGE0CiAKIC8qCkBAIC02Myw5ICs2NSw5IEBACiAgKi8KIAogCi0jZGVmaW5lIE9NQVAyNDJYX1NNU19SRUdBRERSKHJlZykJKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDI0MjBfU01TX0JBU0UgKyByZWcpCi0jZGVmaW5lIE9NQVAyNDNYX1NNU19SRUdBRERSKHJlZykJKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDI0M1hfU01TX0JBU0UgKyByZWcpCi0jZGVmaW5lIE9NQVAzNDNYX1NNU19SRUdBRERSKHJlZykJKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUDM0M1hfU01TX0JBU0UgKyByZWcpCisjZGVmaW5lIE9NQVAyNDJYX1NNU19SRUdBRERSKHJlZykJSU9fQUREUkVTUyhPTUFQMjQyMF9TTVNfQkFTRSArIHJlZykKKyNkZWZpbmUgT01BUDI0M1hfU01TX1JFR0FERFIocmVnKQlJT19BRERSRVNTKE9NQVAyNDNYX1NNU19CQVNFICsgcmVnKQorI2RlZmluZSBPTUFQMzQzWF9TTVNfUkVHQUREUihyZWcpCUlPX0FERFJFU1MoT01BUDM0M1hfU01TX0JBU0UgKyByZWcpCiAKIC8qIFNNUyByZWdpc3RlciBvZmZzZXRzIC0gcmVhZC93cml0ZSB3aXRoIHNtc197cmVhZCx3cml0ZX1fcmVnKCkgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zZXJpYWwuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc2VyaWFsLmgKaW5kZXggY2M2YmZhNS4uOGE2NzZhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zZXJpYWwuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3NlcmlhbC5oCkBAIC0yMCwxOCArMjAsMjQgQEAKICNkZWZpbmUgT01BUF9VQVJUMV9CQVNFCQkweDQ4MDZhMDAwCiAjZGVmaW5lIE9NQVBfVUFSVDJfQkFTRQkJMHg0ODA2YzAwMAogI2RlZmluZSBPTUFQX1VBUlQzX0JBU0UJCTB4NDgwNmUwMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCisvKiBPTUFQMyBzZXJpYWwgcG9ydHMgKi8KKyNkZWZpbmUgT01BUF9VQVJUMV9CQVNFCQkweDQ4MDZhMDAwCisjZGVmaW5lIE9NQVBfVUFSVDJfQkFTRQkJMHg0ODA2YzAwMAorI2RlZmluZSBPTUFQX1VBUlQzX0JBU0UJCTB4NDkwMjAwMDAKICNlbmRpZgogCiAjZGVmaW5lIE9NQVBfTUFYX05SX1BPUlRTCTMKICNkZWZpbmUgT01BUDE1MTBfQkFTRV9CQVVECSgxMjAwMDAwMC8xNikKICNkZWZpbmUgT01BUDE2WFhfQkFTRV9CQVVECSg0ODAwMDAwMC8xNikKKyNkZWZpbmUgT01BUDI0WFhfQkFTRV9CQVVECSg0ODAwMDAwMC8xNikKIAotI2RlZmluZSBpc19vbWFwX3BvcnQocCkJKHtpbnQgX19yZXQgPSAwOwkJCVwKLQkJCWlmIChwID09IElPX0FERFJFU1MoT01BUF9VQVJUMV9CQVNFKSB8fAlcCi0JCQkgICAgcCA9PSBJT19BRERSRVNTKE9NQVBfVUFSVDJfQkFTRSkgfHwJXAotCQkJICAgIHAgPT0gSU9fQUREUkVTUyhPTUFQX1VBUlQzX0JBU0UpKQlcCi0JCQkJX19yZXQgPSAxOwkJCVwKLQkJCV9fcmV0OwkJCQkJXAorI2RlZmluZSBpc19vbWFwX3BvcnQocHQpCSh7aW50IF9fcmV0ID0gMDsJCQlcCisJCQlpZiAoKHB0KS0+cG9ydC5tYXBiYXNlID09IE9NQVBfVUFSVDFfQkFTRSB8fAlcCisJCQkgICAgKHB0KS0+cG9ydC5tYXBiYXNlID09IE9NQVBfVUFSVDJfQkFTRSB8fAlcCisJCQkgICAgKHB0KS0+cG9ydC5tYXBiYXNlID09IE9NQVBfVUFSVDNfQkFTRSkJXAorCQkJCV9fcmV0ID0gMTsJCQkJXAorCQkJX19yZXQ7CQkJCQkJXAogCQkJfSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3NyYW0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc3JhbS5oCmluZGV4IGUwOTMyMzQuLmFiMzVkNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc3JhbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc3JhbS5oCkBAIC0yMSw2ICsyMSwxMCBAQAogCQkJCSAgICAgIHUzMiBtZW1fdHlwZSk7CiBleHRlcm4gdTMyIG9tYXAyX3NldF9wcmNtKHUzMiBkcGxsX2N0cmxfdmFsLCB1MzIgc2RyY19yZnJfdmFsLCBpbnQgYnlwYXNzKTsKIAorZXh0ZXJuIHUzMiBvbWFwM19jb25maWd1cmVfY29yZV9kcGxsKHUzMiBzZHJjX3Jmcl9jdHJsLAorCQkJCSAgICAgdTMyIHNkcmNfYWN0aW1fY3RybGEsCisJCQkJICAgICB1MzIgc2RyY19hY3RpbV9jdHJsYiwgdTMyIG0yKTsKKwogLyogRG8gbm90IHVzZSB0aGVzZSAqLwogZXh0ZXJuIHZvaWQgb21hcDFfc3JhbV9yZXByb2dyYW1fY2xvY2sodTMyIGNrY3RsLCB1MzIgZHBsbGN0bCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvbWFwMV9zcmFtX3JlcHJvZ3JhbV9jbG9ja19zejsKQEAgLTUzLDQgKzU3LDEwIEBACiAJCQkJCQl1MzIgbWVtX3R5cGUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb21hcDI0M3hfc3JhbV9yZXByb2dyYW1fc2RyY19zejsKIAorCitleHRlcm4gdTMyIG9tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbCh1MzIgc2RyY19yZnJfY3RybCwKKwkJCQkJICB1MzIgc2RyY19hY3RpbV9jdHJsYSwKKwkJCQkJICB1MzIgc2RyY19hY3RpbV9jdHJsYiwgdTMyIG0yKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG9tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbF9zejsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCAwNmEyOGM3Li4wNjkyM2YyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTQwLDcgKzQwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlKQogewotCWlmICghY3B1X2lzX29tYXAyNHh4KCkpCisJaWYgKCFjcHVfY2xhc3NfaXNfb21hcDIoKSkKIAkJb21hcDFfYXJjaF9yZXNldChtb2RlKTsKIAllbHNlCiAJCW9tYXBfcHJjbV9hcmNoX3Jlc2V0KG1vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMyNmVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2lvLmMKQEAgLTAsMCArMSwxMDcgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxtYWNoL29tYXA3MzAuaD4KKyNpbmNsdWRlIDxtYWNoL29tYXAxNTEwLmg+CisjaW5jbHVkZSA8bWFjaC9vbWFwMTZ4eC5oPgorI2luY2x1ZGUgPG1hY2gvb21hcDI0eHguaD4KKyNpbmNsdWRlIDxtYWNoL29tYXAzNHh4Lmg+CisKKyNkZWZpbmUgQkVUV0VFTihwLHN0LHN6KQkoKHApID49IChzdCkgJiYgKHApIDwgKChzdCkgKyAoc3opKSkKKyNkZWZpbmUgWExBVEUocCxwc3QsdnN0KQkoKHZvaWQgX19pb21lbSAqKSgocCkgLSAocHN0KSArICh2c3QpKSkKKworLyoKKyAqIEludGVyY2VwdCBpb3JlbWFwKCkgcmVxdWVzdHMgZm9yIGFkZHJlc3NlcyBpbiBvdXIgZml4ZWQgbWFwcGluZyByZWdpb25zLgorICovCit2b2lkIF9faW9tZW0gKm9tYXBfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHAsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgeworCQlpZiAoQkVUV0VFTihwLCBJT19QSFlTLCBJT19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBJT19QSFlTLCBJT19WSVJUKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJaWYgKEJFVFdFRU4ocCwgT01BUDczMF9EU1BfQkFTRSwgT01BUDczMF9EU1BfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgT01BUDczMF9EU1BfQkFTRSwgT01BUDczMF9EU1BfU1RBUlQpOworCisJCWlmIChCRVRXRUVOKHAsIE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NJWkUpKQorCQkJcmV0dXJuIFhMQVRFKHAsIE9NQVA3MzBfRFNQUkVHX0JBU0UsCisJCQkJCU9NQVA3MzBfRFNQUkVHX1NUQVJUKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAxNTEwX0RTUF9CQVNFLCBPTUFQMTUxMF9EU1BfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgT01BUDE1MTBfRFNQX0JBU0UsIE9NQVAxNTEwX0RTUF9TVEFSVCk7CisKKwkJaWYgKEJFVFdFRU4ocCwgT01BUDE1MTBfRFNQUkVHX0JBU0UsIE9NQVAxNTEwX0RTUFJFR19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBPTUFQMTUxMF9EU1BSRUdfQkFTRSwKKwkJCQkJT01BUDE1MTBfRFNQUkVHX1NUQVJUKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAxNlhYX0RTUF9CQVNFLCBPTUFQMTZYWF9EU1BfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgT01BUDE2WFhfRFNQX0JBU0UsIE9NQVAxNlhYX0RTUF9TVEFSVCk7CisKKwkJaWYgKEJFVFdFRU4ocCwgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBPTUFQMTZYWF9EU1BSRUdfQkFTRSwKKwkJCQkJT01BUDE2WFhfRFNQUkVHX1NUQVJUKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMgorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQlpZiAoQkVUV0VFTihwLCBMM18yNFhYX1BIWVMsIEwzXzI0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgTDNfMjRYWF9QSFlTLCBMM18yNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBMNF8yNFhYX1BIWVMsIEw0XzI0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgTDRfMjRYWF9QSFlTLCBMNF8yNFhYX1ZJUlQpOworCX0KKwlpZiAoY3B1X2lzX29tYXAyNDIwKCkpIHsKKwkJaWYgKEJFVFdFRU4ocCwgRFNQX01FTV8yNFhYX1BIWVMsIERTUF9NRU1fMjRYWF9TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBEU1BfTUVNXzI0WFhfUEhZUywgRFNQX01FTV8yNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBEU1BfSVBJXzI0WFhfUEhZUywgRFNQX0lQSV8yNFhYX1NJWkUpKQorCQkJcmV0dXJuIFhMQVRFKHAsIERTUF9JUElfMjRYWF9QSFlTLCBEU1BfSVBJXzI0WFhfU0laRSk7CisJCWlmIChCRVRXRUVOKHAsIERTUF9NTVVfMjRYWF9QSFlTLCBEU1BfTU1VXzI0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgRFNQX01NVV8yNFhYX1BIWVMsIERTUF9NTVVfMjRYWF9WSVJUKTsKKwl9CisJaWYgKGNwdV9pc19vbWFwMjQzMCgpKSB7CisJCWlmIChCRVRXRUVOKHAsIEw0X1dLXzI0M1hfUEhZUywgTDRfV0tfMjQzWF9TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBMNF9XS18yNDNYX1BIWVMsIEw0X1dLXzI0M1hfVklSVCk7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAyNDNYX0dQTUNfUEhZUywgT01BUDI0M1hfR1BNQ19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBPTUFQMjQzWF9HUE1DX1BIWVMsIE9NQVAyNDNYX0dQTUNfVklSVCk7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAyNDNYX1NEUkNfUEhZUywgT01BUDI0M1hfU0RSQ19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBPTUFQMjQzWF9TRFJDX1BIWVMsIE9NQVAyNDNYX1NEUkNfVklSVCk7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAyNDNYX1NNU19QSFlTLCBPTUFQMjQzWF9TTVNfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgT01BUDI0M1hfU01TX1BIWVMsIE9NQVAyNDNYX1NNU19WSVJUKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQlpZiAoQkVUV0VFTihwLCBMM18zNFhYX1BIWVMsIEwzXzM0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgTDNfMzRYWF9QSFlTLCBMM18zNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBMNF8zNFhYX1BIWVMsIEw0XzM0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgTDRfMzRYWF9QSFlTLCBMNF8zNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBMNF9XS18zNFhYX1BIWVMsIEw0X1dLXzM0WFhfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgTDRfV0tfMzRYWF9QSFlTLCBMNF9XS18zNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBPTUFQMzRYWF9HUE1DX1BIWVMsIE9NQVAzNFhYX0dQTUNfU0laRSkpCisJCQlyZXR1cm4gWExBVEUocCwgT01BUDM0WFhfR1BNQ19QSFlTLCBPTUFQMzRYWF9HUE1DX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBPTUFQMzQzWF9TTVNfUEhZUywgT01BUDM0M1hfU01TX1NJWkUpKQorCQkJcmV0dXJuIFhMQVRFKHAsIE9NQVAzNDNYX1NNU19QSFlTLCBPTUFQMzQzWF9TTVNfVklSVCk7CisJCWlmIChCRVRXRUVOKHAsIE9NQVAzNDNYX1NEUkNfUEhZUywgT01BUDM0M1hfU0RSQ19TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBPTUFQMzQzWF9TRFJDX1BIWVMsIE9NQVAzNDNYX1NEUkNfVklSVCk7CisJCWlmIChCRVRXRUVOKHAsIEw0X1BFUl8zNFhYX1BIWVMsIEw0X1BFUl8zNFhYX1NJWkUpKQorCQkJcmV0dXJuIFhMQVRFKHAsIEw0X1BFUl8zNFhYX1BIWVMsIEw0X1BFUl8zNFhYX1ZJUlQpOworCQlpZiAoQkVUV0VFTihwLCBMNF9FTVVfMzRYWF9QSFlTLCBMNF9FTVVfMzRYWF9TSVpFKSkKKwkJCXJldHVybiBYTEFURShwLCBMNF9FTVVfMzRYWF9QSFlTLCBMNF9FTVVfMzRYWF9WSVJUKTsKKwl9CisjZW5kaWYKKworCXJldHVybiBfX2FybV9pb3JlbWFwKHAsIHNpemUsIHR5cGUpOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2lvcmVtYXApOworCit2b2lkIG9tYXBfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB2aXJ0ID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKworCWlmICh2aXJ0ID49IFZNQUxMT0NfU1RBUlQgJiYgdmlydCA8IFZNQUxMT0NfRU5EKQorCQlfX2lvdW5tYXAoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfaW91bm1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYwppbmRleCAxZDdhZWMxLi5iNTJjZTA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9tYWlsYm94Lmg+CiAjaW5jbHVkZSAibWFpbGJveC5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCmluZGV4IGQwODQ0MDUuLmFmMzNmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCkBAIC0yNyw0MyArMjcsNjUgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvbWNic3AuaD4KIAotc3RhdGljIHN0cnVjdCBvbWFwX21jYnNwIG1jYnNwW09NQVBfTUFYX01DQlNQX0NPVU5UXTsKK3N0cnVjdCBvbWFwX21jYnNwICoqbWNic3BfcHRyOworaW50IG9tYXBfbWNic3BfY291bnQ7CiAKLSNkZWZpbmUgb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkJKG1jYnNwW2lkXS5wZGF0YSAmJiBcCi0JCQkJCW1jYnNwW2lkXS5wZGF0YS0+b3BzICYmIFwKLQkJCQkJbWNic3BbaWRdLnBkYXRhLT5vcHMtPmNoZWNrICYmIFwKLQkJCQkJKG1jYnNwW2lkXS5wZGF0YS0+b3BzLT5jaGVjayhpZCkgPT0gMCkpCit2b2lkIG9tYXBfbWNic3Bfd3JpdGUodm9pZCBfX2lvbWVtICppb19iYXNlLCB1MTYgcmVnLCB1MzIgdmFsKQoreworCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSB8fCBjcHVfaXNfb21hcDI0MjAoKSkKKwkJX19yYXdfd3JpdGV3KCh1MTYpdmFsLCBpb19iYXNlICsgcmVnKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbCh2YWwsIGlvX2Jhc2UgKyByZWcpOworfQorCitpbnQgb21hcF9tY2JzcF9yZWFkKHZvaWQgX19pb21lbSAqaW9fYmFzZSwgdTE2IHJlZykKK3sKKwlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkgfHwgY3B1X2lzX29tYXAyNDIwKCkpCisJCXJldHVybiBfX3Jhd19yZWFkdyhpb19iYXNlICsgcmVnKTsKKwllbHNlCisJCXJldHVybiBfX3Jhd19yZWFkbChpb19iYXNlICsgcmVnKTsKK30KKworI2RlZmluZSBPTUFQX01DQlNQX1JFQUQoYmFzZSwgcmVnKSBcCisJCQlvbWFwX21jYnNwX3JlYWQoYmFzZSwgT01BUF9NQ0JTUF9SRUdfIyNyZWcpCisjZGVmaW5lIE9NQVBfTUNCU1BfV1JJVEUoYmFzZSwgcmVnLCB2YWwpIFwKKwkJCW9tYXBfbWNic3Bfd3JpdGUoYmFzZSwgT01BUF9NQ0JTUF9SRUdfIyNyZWcsIHZhbCkKKworI2RlZmluZSBvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKQkoaWQgPCBvbWFwX21jYnNwX2NvdW50KQorI2RlZmluZSBpZF90b19tY2JzcF9wdHIoaWQpCQltY2JzcF9wdHJbaWRdOwogCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX2R1bXBfcmVnKHU4IGlkKQogewotCWRldl9kYmcobWNic3BbaWRdLmRldiwgIioqKiogTWNCU1AlZCByZWdzICoqKipcbiIsIG1jYnNwW2lkXS5pZCk7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiRFJSMjogIDB4JTA0eFxuIiwKLQkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFJSMikpOwotCWRldl9kYmcobWNic3BbaWRdLmRldiwgIkRSUjE6ICAweCUwNHhcbiIsCi0JCQlPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIERSUjEpKTsKLQlkZXZfZGJnKG1jYnNwW2lkXS5kZXYsICJEWFIyOiAgMHglMDR4XG4iLAotCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEWFIyKSk7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiRFhSMTogIDB4JTA0eFxuIiwKLQkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFhSMSkpOwotCWRldl9kYmcobWNic3BbaWRdLmRldiwgIlNQQ1IyOiAweCUwNHhcbiIsCi0JCQlPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNQQ1IyKSk7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiU1BDUjE6IDB4JTA0eFxuIiwKLQkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1BDUjEpKTsKLQlkZXZfZGJnKG1jYnNwW2lkXS5kZXYsICJSQ1IyOiAgMHglMDR4XG4iLAotCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBSQ1IyKSk7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiUkNSMTogIDB4JTA0eFxuIiwKLQkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgUkNSMSkpOwotCWRldl9kYmcobWNic3BbaWRdLmRldiwgIlhDUjI6ICAweCUwNHhcbiIsCi0JCQlPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFhDUjIpKTsKLQlkZXZfZGJnKG1jYnNwW2lkXS5kZXYsICJYQ1IxOiAgMHglMDR4XG4iLAotCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBYQ1IxKSk7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiU1JHUjI6IDB4JTA0eFxuIiwKLQkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1JHUjIpKTsKLQlkZXZfZGJnKG1jYnNwW2lkXS5kZXYsICJTUkdSMTogMHglMDR4XG4iLAotCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBTUkdSMSkpOwotCWRldl9kYmcobWNic3BbaWRdLmRldiwgIlBDUjA6ICAweCUwNHhcbiIsCi0JCQlPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFBDUjApKTsKLQlkZXZfZGJnKG1jYnNwW2lkXS5kZXYsICIqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKworCWRldl9kYmcobWNic3AtPmRldiwgIioqKiogTWNCU1AlZCByZWdzICoqKipcbiIsIG1jYnNwLT5pZCk7CisJZGV2X2RiZyhtY2JzcC0+ZGV2LCAiRFJSMjogIDB4JTA0eFxuIiwKKwkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcC0+aW9fYmFzZSwgRFJSMikpOworCWRldl9kYmcobWNic3AtPmRldiwgIkRSUjE6ICAweCUwNHhcbiIsCisJCQlPTUFQX01DQlNQX1JFQUQobWNic3AtPmlvX2Jhc2UsIERSUjEpKTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICJEWFIyOiAgMHglMDR4XG4iLAorCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwLT5pb19iYXNlLCBEWFIyKSk7CisJZGV2X2RiZyhtY2JzcC0+ZGV2LCAiRFhSMTogIDB4JTA0eFxuIiwKKwkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcC0+aW9fYmFzZSwgRFhSMSkpOworCWRldl9kYmcobWNic3AtPmRldiwgIlNQQ1IyOiAweCUwNHhcbiIsCisJCQlPTUFQX01DQlNQX1JFQUQobWNic3AtPmlvX2Jhc2UsIFNQQ1IyKSk7CisJZGV2X2RiZyhtY2JzcC0+ZGV2LCAiU1BDUjE6IDB4JTA0eFxuIiwKKwkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcC0+aW9fYmFzZSwgU1BDUjEpKTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICJSQ1IyOiAgMHglMDR4XG4iLAorCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwLT5pb19iYXNlLCBSQ1IyKSk7CisJZGV2X2RiZyhtY2JzcC0+ZGV2LCAiUkNSMTogIDB4JTA0eFxuIiwKKwkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcC0+aW9fYmFzZSwgUkNSMSkpOworCWRldl9kYmcobWNic3AtPmRldiwgIlhDUjI6ICAweCUwNHhcbiIsCisJCQlPTUFQX01DQlNQX1JFQUQobWNic3AtPmlvX2Jhc2UsIFhDUjIpKTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICJYQ1IxOiAgMHglMDR4XG4iLAorCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwLT5pb19iYXNlLCBYQ1IxKSk7CisJZGV2X2RiZyhtY2JzcC0+ZGV2LCAiU1JHUjI6IDB4JTA0eFxuIiwKKwkJCU9NQVBfTUNCU1BfUkVBRChtY2JzcC0+aW9fYmFzZSwgU1JHUjIpKTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICJTUkdSMTogMHglMDR4XG4iLAorCQkJT01BUF9NQ0JTUF9SRUFEKG1jYnNwLT5pb19iYXNlLCBTUkdSMSkpOworCWRldl9kYmcobWNic3AtPmRldiwgIlBDUjA6ICAweCUwNHhcbiIsCisJCQlPTUFQX01DQlNQX1JFQUQobWNic3AtPmlvX2Jhc2UsIFBDUjApKTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICIqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTEyNiwxNiArMTQ4LDE4IEBACiAgKi8KIHZvaWQgb21hcF9tY2JzcF9jb25maWcodW5zaWduZWQgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnICpjb25maWcpCiB7Ci0JdTMyIGlvX2Jhc2U7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7Ci0JZGV2X2RiZyhtY2JzcFtpZF0uZGV2LCAiQ29uZmlndXJpbmcgTWNCU1AlZCAgaW9fYmFzZTogMHglOHhcbiIsCi0JCQltY2JzcFtpZF0uaWQsIGlvX2Jhc2UpOworCWlvX2Jhc2UgPSBtY2JzcC0+aW9fYmFzZTsKKwlkZXZfZGJnKG1jYnNwLT5kZXYsICJDb25maWd1cmluZyBNY0JTUCVkICBwaHlzX2Jhc2U6IDB4JTA4bHhcbiIsCisJCQltY2JzcC0+aWQsIG1jYnNwLT5waHlzX2Jhc2UpOwogCiAJLyogV2Ugd3JpdGUgdGhlIGdpdmVuIGNvbmZpZyAqLwogCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIGNvbmZpZy0+c3BjcjIpOwpAQCAtMTU4LDIzICsxODIsMjYgQEAKICAqLwogaW50IG9tYXBfbWNic3Bfc2V0X2lvX3R5cGUodW5zaWduZWQgaW50IGlkLCBvbWFwX21jYnNwX2lvX3R5cGVfdCBpb190eXBlKQogeworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKIAotCXNwaW5fbG9jaygmbWNic3BbaWRdLmxvY2spOworCXNwaW5fbG9jaygmbWNic3AtPmxvY2spOwogCi0JaWYgKCFtY2JzcFtpZF0uZnJlZSkgewotCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJNY0JTUCVkIGlzIGN1cnJlbnRseSBpbiB1c2VcbiIsCi0JCQltY2JzcFtpZF0uaWQpOwotCQlzcGluX3VubG9jaygmbWNic3BbaWRdLmxvY2spOworCWlmICghbWNic3AtPmZyZWUpIHsKKwkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCBpcyBjdXJyZW50bHkgaW4gdXNlXG4iLAorCQkJbWNic3AtPmlkKTsKKwkJc3Bpbl91bmxvY2soJm1jYnNwLT5sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWNic3BbaWRdLmlvX3R5cGUgPSBpb190eXBlOworCW1jYnNwLT5pb190eXBlID0gaW9fdHlwZTsKIAotCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJc3Bpbl91bmxvY2soJm1jYnNwLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTgyLDUzICsyMDksNjAgQEAKIAogaW50IG9tYXBfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpCiB7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCWludCBlcnI7CiAKIAlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlpZiAobWNic3BbaWRdLnBkYXRhLT5vcHMtPnJlcXVlc3QpCi0JCW1jYnNwW2lkXS5wZGF0YS0+b3BzLT5yZXF1ZXN0KGlkKTsKKwlpZiAobWNic3AtPnBkYXRhICYmIG1jYnNwLT5wZGF0YS0+b3BzICYmIG1jYnNwLT5wZGF0YS0+b3BzLT5yZXF1ZXN0KQorCQltY2JzcC0+cGRhdGEtPm9wcy0+cmVxdWVzdChpZCk7CiAKLQljbGtfZW5hYmxlKG1jYnNwW2lkXS5jbGspOworCWNsa19lbmFibGUobWNic3AtPmNsayk7CiAKLQlzcGluX2xvY2soJm1jYnNwW2lkXS5sb2NrKTsKLQlpZiAoIW1jYnNwW2lkXS5mcmVlKSB7Ci0JCWRldl9lcnIobWNic3BbaWRdLmRldiwgIk1jQlNQJWQgaXMgY3VycmVudGx5IGluIHVzZVxuIiwKLQkJCW1jYnNwW2lkXS5pZCk7Ci0JCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJc3Bpbl9sb2NrKCZtY2JzcC0+bG9jayk7CisJaWYgKCFtY2JzcC0+ZnJlZSkgeworCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJNY0JTUCVkIGlzIGN1cnJlbnRseSBpbiB1c2VcbiIsCisJCQltY2JzcC0+aWQpOworCQlzcGluX3VubG9jaygmbWNic3AtPmxvY2spOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JbWNic3BbaWRdLmZyZWUgPSAwOwotCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJbWNic3AtPmZyZWUgPSAwOworCXNwaW5fdW5sb2NrKCZtY2JzcC0+bG9jayk7CiAKLQlpZiAobWNic3BbaWRdLmlvX3R5cGUgPT0gT01BUF9NQ0JTUF9JUlFfSU8pIHsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRyYW5zbWl0dGVyLCByZWNlaXZlciBhbmQgc2FtcGxlLXJhdGUgZ2VuZXJhdG9yIGFyZQorCSAqIG5vdCBydW5uaW5nIGJlZm9yZSBhY3RpdmF0aW5nIElSUXMuCisJICovCisJT01BUF9NQ0JTUF9XUklURShtY2JzcC0+aW9fYmFzZSwgU1BDUjEsIDApOworCU9NQVBfTUNCU1BfV1JJVEUobWNic3AtPmlvX2Jhc2UsIFNQQ1IyLCAwKTsKKworCWlmIChtY2JzcC0+aW9fdHlwZSA9PSBPTUFQX01DQlNQX0lSUV9JTykgewogCQkvKiBXZSBuZWVkIHRvIGdldCBJUlFzIGhlcmUgKi8KLQkJZXJyID0gcmVxdWVzdF9pcnEobWNic3BbaWRdLnR4X2lycSwgb21hcF9tY2JzcF90eF9pcnFfaGFuZGxlciwKLQkJCQkJMCwgIk1jQlNQIiwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZtY2JzcC0+dHhfaXJxX2NvbXBsZXRpb24pOworCQllcnIgPSByZXF1ZXN0X2lycShtY2JzcC0+dHhfaXJxLCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyLAorCQkJCQkwLCAiTWNCU1AiLCAodm9pZCAqKW1jYnNwKTsKIAkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBUWCBJUlEgJWQgIgotCQkJCQkiZm9yIE1jQlNQJWRcbiIsIG1jYnNwW2lkXS50eF9pcnEsCi0JCQkJCW1jYnNwW2lkXS5pZCk7CisJCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBUWCBJUlEgJWQgIgorCQkJCQkiZm9yIE1jQlNQJWRcbiIsIG1jYnNwLT50eF9pcnEsCisJCQkJCW1jYnNwLT5pZCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2lycV9jb21wbGV0aW9uKSk7Ci0KLQkJZXJyID0gcmVxdWVzdF9pcnEobWNic3BbaWRdLnJ4X2lycSwgb21hcF9tY2JzcF9yeF9pcnFfaGFuZGxlciwKLQkJCQkJMCwgIk1jQlNQIiwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZtY2JzcC0+cnhfaXJxX2NvbXBsZXRpb24pOworCQllcnIgPSByZXF1ZXN0X2lycShtY2JzcC0+cnhfaXJxLCBvbWFwX21jYnNwX3J4X2lycV9oYW5kbGVyLAorCQkJCQkwLCAiTWNCU1AiLCAodm9pZCAqKW1jYnNwKTsKIAkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBSWCBJUlEgJWQgIgotCQkJCQkiZm9yIE1jQlNQJWRcbiIsIG1jYnNwW2lkXS5yeF9pcnEsCi0JCQkJCW1jYnNwW2lkXS5pZCk7Ci0JCQlmcmVlX2lycShtY2JzcFtpZF0udHhfaXJxLCAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgUlggSVJRICVkICIKKwkJCQkJImZvciBNY0JTUCVkXG4iLCBtY2JzcC0+cnhfaXJxLAorCQkJCQltY2JzcC0+aWQpOworCQkJZnJlZV9pcnEobWNic3AtPnR4X2lycSwgKHZvaWQgKiltY2JzcCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0KLQkJaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnJ4X2lycV9jb21wbGV0aW9uKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMzcsMzEgKzI3MSwzNCBAQAogCiB2b2lkIG9tYXBfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpCiB7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCiAJaWYgKCFvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwogCQlyZXR1cm47CiAJfQorCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKIAotCWlmIChtY2JzcFtpZF0ucGRhdGEtPm9wcy0+ZnJlZSkKLQkJbWNic3BbaWRdLnBkYXRhLT5vcHMtPmZyZWUoaWQpOworCWlmIChtY2JzcC0+cGRhdGEgJiYgbWNic3AtPnBkYXRhLT5vcHMgJiYgbWNic3AtPnBkYXRhLT5vcHMtPmZyZWUpCisJCW1jYnNwLT5wZGF0YS0+b3BzLT5mcmVlKGlkKTsKIAotCWNsa19kaXNhYmxlKG1jYnNwW2lkXS5jbGspOworCWNsa19kaXNhYmxlKG1jYnNwLT5jbGspOwogCi0Jc3Bpbl9sb2NrKCZtY2JzcFtpZF0ubG9jayk7Ci0JaWYgKG1jYnNwW2lkXS5mcmVlKSB7Ci0JCWRldl9lcnIobWNic3BbaWRdLmRldiwgIk1jQlNQJWQgd2FzIG5vdCByZXNlcnZlZFxuIiwKLQkJCW1jYnNwW2lkXS5pZCk7Ci0JCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisJc3Bpbl9sb2NrKCZtY2JzcC0+bG9jayk7CisJaWYgKG1jYnNwLT5mcmVlKSB7CisJCWRldl9lcnIobWNic3AtPmRldiwgIk1jQlNQJWQgd2FzIG5vdCByZXNlcnZlZFxuIiwKKwkJCW1jYnNwLT5pZCk7CisJCXNwaW5fdW5sb2NrKCZtY2JzcC0+bG9jayk7CiAJCXJldHVybjsKIAl9CiAKLQltY2JzcFtpZF0uZnJlZSA9IDE7Ci0Jc3Bpbl91bmxvY2soJm1jYnNwW2lkXS5sb2NrKTsKKwltY2JzcC0+ZnJlZSA9IDE7CisJc3Bpbl91bmxvY2soJm1jYnNwLT5sb2NrKTsKIAotCWlmIChtY2JzcFtpZF0uaW9fdHlwZSA9PSBPTUFQX01DQlNQX0lSUV9JTykgeworCWlmIChtY2JzcC0+aW9fdHlwZSA9PSBPTUFQX01DQlNQX0lSUV9JTykgewogCQkvKiBGcmVlIElSUXMgKi8KLQkJZnJlZV9pcnEobWNic3BbaWRdLnJ4X2lycSwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKLQkJZnJlZV9pcnEobWNic3BbaWRdLnR4X2lycSwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKKwkJZnJlZV9pcnEobWNic3AtPnJ4X2lycSwgKHZvaWQgKiltY2JzcCk7CisJCWZyZWVfaXJxKG1jYnNwLT50eF9pcnEsICh2b2lkICopbWNic3ApOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9mcmVlKTsKQEAgLTI3MywxOCArMzEwLDE5IEBACiAgKi8KIHZvaWQgb21hcF9tY2JzcF9zdGFydCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdTMyIGlvX2Jhc2U7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAl1MTYgdzsKIAogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisJaW9fYmFzZSA9IG1jYnNwLT5pb19iYXNlOwogCi0JaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOwotCi0JbWNic3BbaWRdLnJ4X3dvcmRfbGVuZ3RoID0gKE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBSQ1IxKSA+PiA1KSAmIDB4NzsKLQltY2JzcFtpZF0udHhfd29yZF9sZW5ndGggPSAoT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFhDUjEpID4+IDUpICYgMHg3OworCW1jYnNwLT5yeF93b3JkX2xlbmd0aCA9IChPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgUkNSMSkgPj4gNSkgJiAweDc7CisJbWNic3AtPnR4X3dvcmRfbGVuZ3RoID0gKE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBYQ1IxKSA+PiA1KSAmIDB4NzsKIAogCS8qIFN0YXJ0IHRoZSBzYW1wbGUgZ2VuZXJhdG9yICovCiAJdyA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBTUENSMik7CkBAIC0zMTAsNyArMzQ4LDggQEAKIAogdm9pZCBvbWFwX21jYnNwX3N0b3AodW5zaWduZWQgaW50IGlkKQogewotCXUzMiBpb19iYXNlOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CiAJdTE2IHc7CiAKIAlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CkBAIC0zMTgsNyArMzU3LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisJaW9fYmFzZSA9IG1jYnNwLT5pb19iYXNlOwogCiAJLyogUmVzZXQgdHJhbnNtaXR0ZXIgKi8KIAl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKQEAgLTMzNywxNCArMzc3LDE3IEBACiAvKiBwb2xsZWQgbWNic3AgaS9vIG9wZXJhdGlvbnMgKi8KIGludCBvbWFwX21jYnNwX3BvbGx3cml0ZSh1bnNpZ25lZCBpbnQgaWQsIHUxNiBidWYpCiB7Ci0JdTMyIGJhc2U7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKwliYXNlID0gbWNic3AtPmlvX2Jhc2U7CisKIAl3cml0ZXcoYnVmLCBiYXNlICsgT01BUF9NQ0JTUF9SRUdfRFhSMSk7CiAJLyogaWYgZnJhbWUgc3luYyBlcnJvciAtIGNsZWFyIHRoZSBlcnJvciAqLwogCWlmIChyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgWFNZTkNfRVJSKSB7CkBAIC0zNjYsOCArNDA5LDggQEAKIAkJCQkgICAgICAgKFhSU1QpLAogCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpOwogCQkJCXVkZWxheSgxMCk7Ci0JCQkJZGV2X2VycihtY2JzcFtpZF0uZGV2LCAiQ291bGQgbm90IHdyaXRlIHRvIgotCQkJCQkiIE1jQlNQJWQgUmVnaXN0ZXJcbiIsIG1jYnNwW2lkXS5pZCk7CisJCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiQ291bGQgbm90IHdyaXRlIHRvIgorCQkJCQkiIE1jQlNQJWQgUmVnaXN0ZXJcbiIsIG1jYnNwLT5pZCk7CiAJCQkJcmV0dXJuIC0yOwogCQkJfQogCQl9CkBAIC0zNzksMTQgKzQyMiwxNiBAQAogCiBpbnQgb21hcF9tY2JzcF9wb2xscmVhZCh1bnNpZ25lZCBpbnQgaWQsIHUxNiAqYnVmKQogewotCXUzMiBiYXNlOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAKIAlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQliYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisJYmFzZSA9IG1jYnNwLT5pb19iYXNlOwogCS8qIGlmIGZyYW1lIHN5bmMgZXJyb3IgLSBjbGVhciB0aGUgZXJyb3IgKi8KIAlpZiAocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKSAmIFJTWU5DX0VSUikgewogCQkvKiBjbGVhciBlcnJvciAqLwpAQCAtNDA3LDggKzQ1Miw4IEBACiAJCQkJICAgICAgIChSUlNUKSwKIAkJCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKTsKIAkJCQl1ZGVsYXkoMTApOwotCQkJCWRldl9lcnIobWNic3BbaWRdLmRldiwgIkNvdWxkIG5vdCByZWFkIGZyb20iCi0JCQkJCSIgTWNCU1AlZCBSZWdpc3RlclxuIiwgbWNic3BbaWRdLmlkKTsKKwkJCQlkZXZfZXJyKG1jYnNwLT5kZXYsICJDb3VsZCBub3QgcmVhZCBmcm9tIgorCQkJCQkiIE1jQlNQJWQgUmVnaXN0ZXJcbiIsIG1jYnNwLT5pZCk7CiAJCQkJcmV0dXJuIC0yOwogCQkJfQogCQl9CkBAIC00MjQsNyArNDY5LDggQEAKICAqLwogdm9pZCBvbWFwX21jYnNwX3htaXRfd29yZCh1bnNpZ25lZCBpbnQgaWQsIHUzMiB3b3JkKQogewotCXUzMiBpb19iYXNlOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CiAJb21hcF9tY2JzcF93b3JkX2xlbmd0aCB3b3JkX2xlbmd0aDsKIAogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKQEAgLTQzMiwxMCArNDc4LDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7Ci0Jd29yZF9sZW5ndGggPSBtY2JzcFtpZF0udHhfd29yZF9sZW5ndGg7CisJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOworCWlvX2Jhc2UgPSBtY2JzcC0+aW9fYmFzZTsKKwl3b3JkX2xlbmd0aCA9IG1jYnNwLT50eF93b3JkX2xlbmd0aDsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0udHhfaXJxX2NvbXBsZXRpb24pKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY2JzcC0+dHhfaXJxX2NvbXBsZXRpb24pOwogCiAJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQogCQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIERYUjIsIHdvcmQgPj4gMTYpOwpAQCAtNDQ1LDcgKzQ5Miw4IEBACiAKIHUzMiBvbWFwX21jYnNwX3JlY3Zfd29yZCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdTMyIGlvX2Jhc2U7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAl1MTYgd29yZF9sc2IsIHdvcmRfbXNiID0gMDsKIAlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHdvcmRfbGVuZ3RoOwogCkBAIC00NTMsMTEgKzUwMSwxMiBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOwogCi0Jd29yZF9sZW5ndGggPSBtY2JzcFtpZF0ucnhfd29yZF9sZW5ndGg7Ci0JaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCXdvcmRfbGVuZ3RoID0gbWNic3AtPnJ4X3dvcmRfbGVuZ3RoOworCWlvX2Jhc2UgPSBtY2JzcC0+aW9fYmFzZTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfaXJxX2NvbXBsZXRpb24pKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY2JzcC0+cnhfaXJxX2NvbXBsZXRpb24pOwogCiAJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQogCQl3b3JkX21zYiA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBEUlIyKTsKQEAgLTQ2OSw3ICs1MTgsOCBAQAogCiBpbnQgb21hcF9tY2JzcF9zcGlfbWFzdGVyX3htaXRfd29yZF9wb2xsKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpCiB7Ci0JdTMyIGlvX2Jhc2U7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHR4X3dvcmRfbGVuZ3RoOwogCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggcnhfd29yZF9sZW5ndGg7CiAJdTE2IHNwY3IyLCBzcGNyMSwgYXR0ZW1wdHMgPSAwLCB3b3JkX2xzYiwgd29yZF9tc2IgPSAwOwpAQCAtNDc4LDEwICs1MjgsMTAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCi0JaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOwotCXR4X3dvcmRfbGVuZ3RoID0gbWNic3BbaWRdLnR4X3dvcmRfbGVuZ3RoOwotCXJ4X3dvcmRfbGVuZ3RoID0gbWNic3BbaWRdLnJ4X3dvcmRfbGVuZ3RoOworCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKwlpb19iYXNlID0gbWNic3AtPmlvX2Jhc2U7CisJdHhfd29yZF9sZW5ndGggPSBtY2JzcC0+dHhfd29yZF9sZW5ndGg7CisJcnhfd29yZF9sZW5ndGggPSBtY2JzcC0+cnhfd29yZF9sZW5ndGg7CiAKIAlpZiAodHhfd29yZF9sZW5ndGggIT0gcnhfd29yZF9sZW5ndGgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDk2LDggKzU0Niw4IEBACiAJCQl1ZGVsYXkoMTApOwogCQkJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMiwgc3BjcjIgfCBYUlNUKTsKIAkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJNY0JTUCVkIHRyYW5zbWl0dGVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcFtpZF0uaWQpOworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCB0cmFuc21pdHRlciBub3QgIgorCQkJCSJyZWFkeVxuIiwgbWNic3AtPmlkKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJfQpAQCAtNTE3LDggKzU2Nyw4IEBACiAJCQl1ZGVsYXkoMTApOwogCQkJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMSwgc3BjcjEgfCBSUlNUKTsKIAkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJNY0JTUCVkIHJlY2VpdmVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcFtpZF0uaWQpOworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCByZWNlaXZlciBub3QgIgorCQkJCSJyZWFkeVxuIiwgbWNic3AtPmlkKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJfQpAQCAtNTM0LDcgKzU4NCw5IEBACiAKIGludCBvbWFwX21jYnNwX3NwaV9tYXN0ZXJfcmVjdl93b3JkX3BvbGwodW5zaWduZWQgaW50IGlkLCB1MzIgKndvcmQpCiB7Ci0JdTMyIGlvX2Jhc2UsIGNsb2NrX3dvcmQgPSAwOworCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwl1MzIgY2xvY2tfd29yZCA9IDA7CisJdm9pZCBfX2lvbWVtICppb19iYXNlOwogCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggdHhfd29yZF9sZW5ndGg7CiAJb21hcF9tY2JzcF93b3JkX2xlbmd0aCByeF93b3JkX2xlbmd0aDsKIAl1MTYgc3BjcjIsIHNwY3IxLCBhdHRlbXB0cyA9IDAsIHdvcmRfbHNiLCB3b3JkX21zYiA9IDA7CkBAIC01NDQsOSArNTk2LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKLQl0eF93b3JkX2xlbmd0aCA9IG1jYnNwW2lkXS50eF93b3JkX2xlbmd0aDsKLQlyeF93b3JkX2xlbmd0aCA9IG1jYnNwW2lkXS5yeF93b3JkX2xlbmd0aDsKKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisJaW9fYmFzZSA9IG1jYnNwLT5pb19iYXNlOworCisJdHhfd29yZF9sZW5ndGggPSBtY2JzcC0+dHhfd29yZF9sZW5ndGg7CisJcnhfd29yZF9sZW5ndGggPSBtY2JzcC0+cnhfd29yZF9sZW5ndGg7CiAKIAlpZiAodHhfd29yZF9sZW5ndGggIT0gcnhfd29yZF9sZW5ndGgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTYxLDggKzYxNSw4IEBACiAJCQl1ZGVsYXkoMTApOwogCQkJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMiwgc3BjcjIgfCBYUlNUKTsKIAkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJNY0JTUCVkIHRyYW5zbWl0dGVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcFtpZF0uaWQpOworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCB0cmFuc21pdHRlciBub3QgIgorCQkJCSJyZWFkeVxuIiwgbWNic3AtPmlkKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJfQpAQCAtNTgyLDggKzYzNiw4IEBACiAJCQl1ZGVsYXkoMTApOwogCQkJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMSwgc3BjcjEgfCBSUlNUKTsKIAkJCXVkZWxheSgxMCk7Ci0JCQlkZXZfZXJyKG1jYnNwW2lkXS5kZXYsICJNY0JTUCVkIHJlY2VpdmVyIG5vdCAiCi0JCQkJInJlYWR5XG4iLCBtY2JzcFtpZF0uaWQpOworCQkJZGV2X2VycihtY2JzcC0+ZGV2LCAiTWNCU1AlZCByZWNlaXZlciBub3QgIgorCQkJCSJyZWFkeVxuIiwgbWNic3AtPmlkKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJfQpAQCAtNjA5LDYgKzY2Myw3IEBACiBpbnQgb21hcF9tY2JzcF94bWl0X2J1ZmZlcih1bnNpZ25lZCBpbnQgaWQsIGRtYV9hZGRyX3QgYnVmZmVyLAogCQkJCXVuc2lnbmVkIGludCBsZW5ndGgpCiB7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCWludCBkbWFfdHhfY2g7CiAJaW50IHNyY19wb3J0ID0gMDsKIAlpbnQgZGVzdF9wb3J0ID0gMDsKQEAgLTYxOCw1MCArNjczLDUxIEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcFtpZF0uZG1hX3R4X3N5bmMsICJNY0JTUCBUWCIsCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNic3AtPmRtYV90eF9zeW5jLCAiTWNCU1AgVFgiLAogCQkJCW9tYXBfbWNic3BfdHhfZG1hX2NhbGxiYWNrLAotCQkJCSZtY2JzcFtpZF0sCisJCQkJbWNic3AsCiAJCQkJJmRtYV90eF9jaCkpIHsKLQkJZGV2X2VycihtY2JzcFtpZF0uZGV2LCAiIFVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsIGZvciAiCisJCWRldl9lcnIobWNic3AtPmRldiwgIiBVbmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCBmb3IgIgogCQkJCSJNY0JTUCVkIFRYLiBUcnlpbmcgSVJRIGJhc2VkIFRYXG4iLAotCQkJCW1jYnNwW2lkXS5pZCk7CisJCQkJbWNic3AtPmlkKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQotCW1jYnNwW2lkXS5kbWFfdHhfbGNoID0gZG1hX3R4X2NoOworCW1jYnNwLT5kbWFfdHhfbGNoID0gZG1hX3R4X2NoOwogCi0JZGV2X2VycihtY2JzcFtpZF0uZGV2LCAiTWNCU1AlZCBUWCBETUEgb24gY2hhbm5lbCAlZFxuIiwgbWNic3BbaWRdLmlkLAorCWRldl9lcnIobWNic3AtPmRldiwgIk1jQlNQJWQgVFggRE1BIG9uIGNoYW5uZWwgJWRcbiIsIG1jYnNwLT5pZCwKIAkJZG1hX3R4X2NoKTsKIAotCWluaXRfY29tcGxldGlvbigmKG1jYnNwW2lkXS50eF9kbWFfY29tcGxldGlvbikpOworCWluaXRfY29tcGxldGlvbigmbWNic3AtPnR4X2RtYV9jb21wbGV0aW9uKTsKIAogCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewogCQlzcmNfcG9ydCA9IE9NQVBfRE1BX1BPUlRfVElQQjsKIAkJZGVzdF9wb3J0ID0gT01BUF9ETUFfUE9SVF9FTUlGRjsKIAl9CiAJaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKQotCQlzeW5jX2RldiA9IG1jYnNwW2lkXS5kbWFfdHhfc3luYzsKKwkJc3luY19kZXYgPSBtY2JzcC0+ZG1hX3R4X3N5bmM7CiAKLQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jYnNwW2lkXS5kbWFfdHhfbGNoLAorCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNic3AtPmRtYV90eF9sY2gsCiAJCQkJICAgICBPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAogCQkJCSAgICAgbGVuZ3RoID4+IDEsIDEsCiAJCQkJICAgICBPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCiAJIHN5bmNfZGV2LCAwKTsKIAotCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKKwlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNic3AtPmRtYV90eF9sY2gsCiAJCQkJIHNyY19wb3J0LAogCQkJCSBPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKLQkJCQkgbWNic3BbaWRdLmlvX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EWFIxLAorCQkJCSBtY2JzcC0+cGh5c19iYXNlICsgT01BUF9NQ0JTUF9SRUdfRFhSMSwKIAkJCQkgMCwgMCk7CiAKLQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcC0+ZG1hX3R4X2xjaCwKIAkJCQlkZXN0X3BvcnQsCiAJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCiAJCQkJYnVmZmVyLAogCQkJCTAsIDApOwogCi0Jb21hcF9zdGFydF9kbWEobWNic3BbaWRdLmRtYV90eF9sY2gpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0udHhfZG1hX2NvbXBsZXRpb24pKTsKKwlvbWFwX3N0YXJ0X2RtYShtY2JzcC0+ZG1hX3R4X2xjaCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmbWNic3AtPnR4X2RtYV9jb21wbGV0aW9uKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjcwLDYgKzcyNiw3IEBACiBpbnQgb21hcF9tY2JzcF9yZWN2X2J1ZmZlcih1bnNpZ25lZCBpbnQgaWQsIGRtYV9hZGRyX3QgYnVmZmVyLAogCQkJCXVuc2lnbmVkIGludCBsZW5ndGgpCiB7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCWludCBkbWFfcnhfY2g7CiAJaW50IHNyY19wb3J0ID0gMDsKIAlpbnQgZGVzdF9wb3J0ID0gMDsKQEAgLTY3OSw1MCArNzM2LDUxIEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcFtpZF0uZG1hX3J4X3N5bmMsICJNY0JTUCBSWCIsCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNic3AtPmRtYV9yeF9zeW5jLCAiTWNCU1AgUlgiLAogCQkJCW9tYXBfbWNic3BfcnhfZG1hX2NhbGxiYWNrLAotCQkJCSZtY2JzcFtpZF0sCisJCQkJbWNic3AsCiAJCQkJJmRtYV9yeF9jaCkpIHsKLQkJZGV2X2VycihtY2JzcFtpZF0uZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgZm9yICIKKwkJZGV2X2VycihtY2JzcC0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgZm9yICIKIAkJCQkiTWNCU1AlZCBSWC4gVHJ5aW5nIElSUSBiYXNlZCBSWFxuIiwKLQkJCQltY2JzcFtpZF0uaWQpOworCQkJCW1jYnNwLT5pZCk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KLQltY2JzcFtpZF0uZG1hX3J4X2xjaCA9IGRtYV9yeF9jaDsKKwltY2JzcC0+ZG1hX3J4X2xjaCA9IGRtYV9yeF9jaDsKIAotCWRldl9lcnIobWNic3BbaWRdLmRldiwgIk1jQlNQJWQgUlggRE1BIG9uIGNoYW5uZWwgJWRcbiIsIG1jYnNwW2lkXS5pZCwKKwlkZXZfZXJyKG1jYnNwLT5kZXYsICJNY0JTUCVkIFJYIERNQSBvbiBjaGFubmVsICVkXG4iLCBtY2JzcC0+aWQsCiAJCWRtYV9yeF9jaCk7CiAKLQlpbml0X2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfZG1hX2NvbXBsZXRpb24pKTsKKwlpbml0X2NvbXBsZXRpb24oJm1jYnNwLT5yeF9kbWFfY29tcGxldGlvbik7CiAKIAlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKIAkJc3JjX3BvcnQgPSBPTUFQX0RNQV9QT1JUX1RJUEI7CiAJCWRlc3RfcG9ydCA9IE9NQVBfRE1BX1BPUlRfRU1JRkY7CiAJfQogCWlmIChjcHVfY2xhc3NfaXNfb21hcDIoKSkKLQkJc3luY19kZXYgPSBtY2JzcFtpZF0uZG1hX3J4X3N5bmM7CisJCXN5bmNfZGV2ID0gbWNic3AtPmRtYV9yeF9zeW5jOwogCi0Jb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jYnNwLT5kbWFfcnhfbGNoLAogCQkJCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAogCQkJCQlsZW5ndGggPj4gMSwgMSwKIAkJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAogCQkJCQlzeW5jX2RldiwgMCk7CiAKLQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcC0+ZG1hX3J4X2xjaCwKIAkJCQlzcmNfcG9ydCwKIAkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKLQkJCQltY2JzcFtpZF0uaW9fYmFzZSArIE9NQVBfTUNCU1BfUkVHX0RSUjEsCisJCQkJbWNic3AtPnBoeXNfYmFzZSArIE9NQVBfTUNCU1BfUkVHX0RSUjEsCiAJCQkJMCwgMCk7CiAKLQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNic3BbaWRdLmRtYV9yeF9sY2gsCisJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jYnNwLT5kbWFfcnhfbGNoLAogCQkJCQlkZXN0X3BvcnQsCiAJCQkJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAogCQkJCQlidWZmZXIsCiAJCQkJCTAsIDApOwogCi0Jb21hcF9zdGFydF9kbWEobWNic3BbaWRdLmRtYV9yeF9sY2gpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfZG1hX2NvbXBsZXRpb24pKTsKKwlvbWFwX3N0YXJ0X2RtYShtY2JzcC0+ZG1hX3J4X2xjaCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmbWNic3AtPnJ4X2RtYV9jb21wbGV0aW9uKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzM3LDEyICs3OTUsMTQgQEAKIHZvaWQgb21hcF9tY2JzcF9zZXRfc3BpX21vZGUodW5zaWduZWQgaW50IGlkLAogCQkJCWNvbnN0IHN0cnVjdCBvbWFwX21jYnNwX3NwaV9jZmcgKnNwaV9jZmcpCiB7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCXN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgbWNic3BfY2ZnOwogCiAJaWYgKCFvbWFwX21jYnNwX2NoZWNrX3ZhbGlkX2lkKGlkKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGlkICglZClcbiIsIF9fZnVuY19fLCBpZCArIDEpOwogCQlyZXR1cm47CiAJfQorCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKIAogCW1lbXNldCgmbWNic3BfY2ZnLCAwLCBzaXplb2Yoc3RydWN0IG9tYXBfbWNic3BfcmVnX2NmZykpOwogCkBAIC04MDMsOSArODYzLDEwIEBACiAgKiBNY0JTUDEgYW5kIE1jQlNQMyBhcmUgZGlyZWN0bHkgbWFwcGVkIG9uIDE2MTAgYW5kIDE1MTAuCiAgKiA3MzAgaGFzIG9ubHkgMiBNY0JTUCwgYW5kIGJvdGggb2YgdGhlbSBhcmUgTVBVIHBlcmlwaGVyYWxzLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwX21jYnNwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwX21jYnNwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CiAJaW50IGlkID0gcGRldi0+aWQgLSAxOwogCWludCByZXQgPSAwOwogCkBAIC04MTgsNDYgKzg3OSw2MyBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiSW5pdGlhbGl6aW5nIE9NQVAgTWNCU1AgKCVkKS5cbiIsIHBkZXYtPmlkKTsKIAotCWlmIChpZCA+PSBPTUFQX01BWF9NQ0JTUF9DT1VOVCkgeworCWlmIChpZCA+PSBvbWFwX21jYnNwX2NvdW50KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgTWNCU1AgZGV2aWNlIGlkICglZClcbiIsIGlkKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZtY2JzcFtpZF0ubG9jayk7Ci0JbWNic3BbaWRdLmlkID0gaWQgKyAxOwotCW1jYnNwW2lkXS5mcmVlID0gMTsKLQltY2JzcFtpZF0uZG1hX3R4X2xjaCA9IC0xOwotCW1jYnNwW2lkXS5kbWFfcnhfbGNoID0gLTE7Ci0KLQltY2JzcFtpZF0uaW9fYmFzZSA9IHBkYXRhLT52aXJ0X2Jhc2U7Ci0JLyogRGVmYXVsdCBJL08gaXMgSVJRIGJhc2VkICovCi0JbWNic3BbaWRdLmlvX3R5cGUgPSBPTUFQX01DQlNQX0lSUV9JTzsKLQltY2JzcFtpZF0udHhfaXJxID0gcGRhdGEtPnR4X2lycTsKLQltY2JzcFtpZF0ucnhfaXJxID0gcGRhdGEtPnJ4X2lycTsKLQltY2JzcFtpZF0uZG1hX3J4X3N5bmMgPSBwZGF0YS0+ZG1hX3J4X3N5bmM7Ci0JbWNic3BbaWRdLmRtYV90eF9zeW5jID0gcGRhdGEtPmRtYV90eF9zeW5jOwotCi0JaWYgKHBkYXRhLT5jbGtfbmFtZSkKLQkJbWNic3BbaWRdLmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgcGRhdGEtPmNsa19uYW1lKTsKLQlpZiAoSVNfRVJSKG1jYnNwW2lkXS5jbGspKSB7Ci0JCW1jYnNwW2lkXS5mcmVlID0gMDsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkludmFsaWQgY2xvY2sgY29uZmlndXJhdGlvbiBmb3IgTWNCU1AlZC5cbiIsCi0JCQltY2JzcFtpZF0uaWQpOwotCQlyZXQgPSAtRUlOVkFMOworCW1jYnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfbWNic3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jYnNwKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CisJbWNic3BfcHRyW2lkXSA9IG1jYnNwOwogCi0JbWNic3BbaWRdLnBkYXRhID0gcGRhdGE7Ci0JbWNic3BbaWRdLmRldiA9ICZwZGV2LT5kZXY7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm1jYnNwW2lkXSk7CisJc3Bpbl9sb2NrX2luaXQoJm1jYnNwLT5sb2NrKTsKKwltY2JzcC0+aWQgPSBpZCArIDE7CisJbWNic3AtPmZyZWUgPSAxOworCW1jYnNwLT5kbWFfdHhfbGNoID0gLTE7CisJbWNic3AtPmRtYV9yeF9sY2ggPSAtMTsKIAorCW1jYnNwLT5waHlzX2Jhc2UgPSBwZGF0YS0+cGh5c19iYXNlOworCW1jYnNwLT5pb19iYXNlID0gaW9yZW1hcChwZGF0YS0+cGh5c19iYXNlLCBTWl80Syk7CisJaWYgKCFtY2JzcC0+aW9fYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCS8qIERlZmF1bHQgSS9PIGlzIElSUSBiYXNlZCAqLworCW1jYnNwLT5pb190eXBlID0gT01BUF9NQ0JTUF9JUlFfSU87CisJbWNic3AtPnR4X2lycSA9IHBkYXRhLT50eF9pcnE7CisJbWNic3AtPnJ4X2lycSA9IHBkYXRhLT5yeF9pcnE7CisJbWNic3AtPmRtYV9yeF9zeW5jID0gcGRhdGEtPmRtYV9yeF9zeW5jOworCW1jYnNwLT5kbWFfdHhfc3luYyA9IHBkYXRhLT5kbWFfdHhfc3luYzsKKworCWlmIChwZGF0YS0+Y2xrX25hbWUpCisJCW1jYnNwLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIHBkYXRhLT5jbGtfbmFtZSk7CisJaWYgKElTX0VSUihtY2JzcC0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjbG9jayBjb25maWd1cmF0aW9uIGZvciBNY0JTUCVkLlxuIiwKKwkJCW1jYnNwLT5pZCk7CisJCXJldCA9IFBUUl9FUlIobWNic3AtPmNsayk7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwltY2JzcC0+cGRhdGEgPSBwZGF0YTsKKwltY2JzcC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2JzcCk7CisJcmV0dXJuIDA7CisKK2Vycl9jbGs6CisJaW91bm1hcChtY2JzcC0+aW9fYmFzZSk7CitlcnJfaW9yZW1hcDoKKwltY2JzcC0+ZnJlZSA9IDA7CiBleGl0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9tY2JzcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfbWNic3BfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKQEAgLTg3MSw2ICs5NDksOCBAQAogCQljbGtfZGlzYWJsZShtY2JzcC0+Y2xrKTsKIAkJY2xrX3B1dChtY2JzcC0+Y2xrKTsKIAorCQlpb3VubWFwKG1jYnNwLT5pb19iYXNlKTsKKwogCQltY2JzcC0+Y2xrID0gTlVMTDsKIAkJbWNic3AtPmZyZWUgPSAwOwogCQltY2JzcC0+ZGV2ID0gTlVMTDsKQEAgLTg4MSw3ICs5NjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX21jYnNwX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gb21hcF9tY2JzcF9wcm9iZSwKLQkucmVtb3ZlCQk9IG9tYXBfbWNic3BfcmVtb3ZlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aob21hcF9tY2JzcF9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJvbWFwLW1jYnNwIiwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCmluZGV4IDg0N2RmMjAuLjgwYjA0MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwppbmRleCA4YmRiZjk3Li5lYmUwYzczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKQEAgLTMxLDggKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNkZWZpbmUgT0NQSV9CQVNFCQkweGZmZmVjMzIwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwppbmRleCBhYzY3ZWViLi45ZjlhOTIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKQEAgLTE1LDkgKzE1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS90bGIuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0yNzEsNyArMjcxLDcgQEAKICNkZWZpbmUgb21hcDFfc3JhbV9pbml0KCkJZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikKIAogc3RhdGljIHZvaWQgKCpfb21hcDJfc3JhbV9kZHJfaW5pdCkodTMyICpzbG93X2RsbF9jdHJsLCB1MzIgZmFzdF9kbGxfY3RybCwKIAkJCSAgICAgIHUzMiBiYXNlX2NzLCB1MzIgZm9yY2VfdW5sb2NrKTsKQEAgLTM1MiwyMyArMzUyLDE5IEBACiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwogCi1zdGF0aWMgdTMyICgqX29tYXAyX3NyYW1fcmVwcm9ncmFtX2dwbWMpKHUzMiBwZXJmX2xldmVsKTsKLXUzMiBvbWFwMl9zcmFtX3JlcHJvZ3JhbV9ncG1jKHUzMiBwZXJmX2xldmVsKQorc3RhdGljIHUzMiAoKl9vbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwpKHUzMiBzZHJjX3Jmcl9jdHJsLAorCQkJCQkgICAgICB1MzIgc2RyY19hY3RpbV9jdHJsYSwKKwkJCQkJICAgICAgdTMyIHNkcmNfYWN0aW1fY3RybGIsCisJCQkJCSAgICAgIHUzMiBtMik7Cit1MzIgb21hcDNfY29uZmlndXJlX2NvcmVfZHBsbCh1MzIgc2RyY19yZnJfY3RybCwgdTMyIHNkcmNfYWN0aW1fY3RybGEsCisJCQkgICAgICB1MzIgc2RyY19hY3RpbV9jdHJsYiwgdTMyIG0yKQogewotCWlmICghX29tYXAyX3NyYW1fcmVwcm9ncmFtX2dwbWMpCisJaWYgKCFfb21hcDNfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsKQogCQlvbWFwX3NyYW1fZXJyb3IoKTsKIAotCXJldHVybiBfb21hcDJfc3JhbV9yZXByb2dyYW1fZ3BtYyhwZXJmX2xldmVsKTsKLX0KLQotc3RhdGljIHUzMiAoKl9vbWFwMl9zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwpKHUzMiBtLCB1MzIgbiwKLQkJCQkJCXUzMiBmcmVxc2VsLCB1MzIgbTIpOwotdTMyIG9tYXAyX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbCh1MzIgbSwgdTMyIG4sIHUzMiBmcmVxc2VsLCB1MzIgbTIpCi17Ci0JaWYgKCFfb21hcDJfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsKQotCQlvbWFwX3NyYW1fZXJyb3IoKTsKLQotCXJldHVybiBfb21hcDJfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsKG0sIG4sIGZyZXFzZWwsIG0yKTsKKwlyZXR1cm4gX29tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbChzZHJjX3Jmcl9jdHJsLAorCQkJCQkgICAgICAgc2RyY19hY3RpbV9jdHJsYSwKKwkJCQkJICAgICAgIHNkcmNfYWN0aW1fY3RybGIsIG0yKTsKIH0KIAogLyogUkVWSVNJVDogU2hvdWxkIHRoaXMgYmUgc2FtZSBhcyBvbWFwMzR4eF9zcmFtX2luaXQoKSBhZnRlciBvZmYtaWRsZT8gKi8KQEAgLTM3NiwzMSArMzcyLDE2IEBACiB7CiAJb21hcF9zcmFtX2NlaWwgPSBvbWFwX3NyYW1fYmFzZSArIG9tYXBfc3JhbV9zaXplOwogCi0JX29tYXAyX3NyYW1fcmVwcm9ncmFtX2dwbWMgPSBvbWFwX3NyYW1fcHVzaChvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9ncG1jLAotCQlvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9ncG1jX3N6KTsKLQotCV9vbWFwMl9zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwgPQotCQkJb21hcF9zcmFtX3B1c2gob21hcDM0eHhfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsLAotCQkJCQlvbWFwMzR4eF9zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGxfc3opOworCV9vbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwgPQorCQlvbWFwX3NyYW1fcHVzaChvbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwsCisJCQkgICAgICAgb21hcDNfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsX3N6KTsKIH0KIAogaW50IF9faW5pdCBvbWFwMzR4eF9zcmFtX2luaXQodm9pZCkKIHsKLQlfb21hcDJfc3JhbV9kZHJfaW5pdCA9IG9tYXBfc3JhbV9wdXNoKG9tYXAzNHh4X3NyYW1fZGRyX2luaXQsCi0JCQkJCW9tYXAzNHh4X3NyYW1fZGRyX2luaXRfc3opOwotCi0JX29tYXAyX3NyYW1fcmVwcm9ncmFtX3NkcmMgPSBvbWFwX3NyYW1fcHVzaChvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9zZHJjLAotCQkJCQlvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9zZHJjX3N6KTsKLQotCV9vbWFwMl9zZXRfcHJjbSA9IG9tYXBfc3JhbV9wdXNoKG9tYXAzNHh4X3NyYW1fc2V0X3ByY20sCi0JCQkJCW9tYXAzNHh4X3NyYW1fc2V0X3ByY21fc3opOwotCi0JX29tYXAyX3NyYW1fcmVwcm9ncmFtX2dwbWMgPSBvbWFwX3NyYW1fcHVzaChvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9ncG1jLAotCQkJCQlvbWFwMzR4eF9zcmFtX3JlcHJvZ3JhbV9ncG1jX3N6KTsKLQotCV9vbWFwMl9zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwgPQotCQkJCW9tYXBfc3JhbV9wdXNoKG9tYXAzNHh4X3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbCwKLQkJCQkJb21hcDM0eHhfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsX3N6KTsKKwlfb21hcDNfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsID0KKwkJb21hcF9zcmFtX3B1c2gob21hcDNfc3JhbV9jb25maWd1cmVfY29yZV9kcGxsLAorCQkJICAgICAgIG9tYXAzX3NyYW1fY29uZmlndXJlX2NvcmVfZHBsbF9zeik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwppbmRleCA3Nzc0ODVlLi42N2NhMWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtczNjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwM2Q3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKKyMgZHVtbXkgbWFrZWZpbGUsIGN1cnJlbnRseSBqdXN0IGluY2x1ZGluZyBhc20vYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdAorCitvYmotbgk6PSBkdW1teS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9kZWJ1Zy1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTdlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUwpAQCAtMCwwICsxLDc1IEBACisvKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvZGVidWctbWFjcm8uUworICoKKyAqIENvcHlyaWdodCAyMDA1LCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKworLyogVGhlIFMzQzI0NDAgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgdGhlCisgKiBtb3N0IHdpZGVseSByZS11c2VkICovCisKKwkubWFjcm8gZmlmb19sZXZlbF9zM2MyNDQwIHJkLCByeAorCQlsZHIJXHJkLCBbIFxyeCwgIyBTM0MyNDEwX1VGU1RBVCBdCisJCWFuZAlccmQsIFxyZCwgI1MzQzI0NDBfVUZTVEFUX1RYTUFTSworCS5lbmRtCisKKyNpZm5kZWYgZmlmb19sZXZlbAorI2RlZmluZSBmaWZvX2xldmVsIGZpZm9fbGV2ZWxfczNjMjQxMAorI2VuZGlmCisKKwkubWFjcm8gIGZpZm9fZnVsbF9zM2MyNDQwIHJkLCByeAorCQlsZHIJXHJkLCBbIFxyeCwgIyBTM0MyNDEwX1VGU1RBVCBdCisJCXRzdAlccmQsICNTM0MyNDQwX1VGU1RBVF9UWEZVTEwKKwkuZW5kbQorCisjaWZuZGVmIGZpZm9fZnVsbAorI2RlZmluZSBmaWZvX2Z1bGwgZmlmb19mdWxsX3MzYzI0NDAKKyNlbmRpZgorCisJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CisJCXN0cmIgCVxyZCwgW1xyeCwgIyBTM0MyNDEwX1VUWEggXQorCS5lbmRtCisKKwkubWFjcm8JYnVzeXVhcnQsIHJkLCByeAorCQlsZHIJXHJkLCBbIFxyeCwgIyBTM0MyNDEwX1VGQ09OIF0KKwkJdHN0CVxyZCwgI1MzQzI0MTBfVUZDT05fRklGT01PREUJQCBmaWZvIGVuYWJsZWQ/CisJCWJlcQkxMDAxZgkJCQlACisJCUAgRklGTyBlbmFibGVkLi4uCisxMDAzOgorCQlmaWZvX2Z1bGwgXHJkLCBccngKKwkJYm5lCTEwMDNiCisJCWIJMTAwMmYKKworMTAwMToKKwkJQCBidXN5IHdhaXRpbmcgZm9yIG5vbiBmaWZvCisJCWxkcglccmQsIFsgXHJ4LCAjIFMzQzI0MTBfVVRSU1RBVCBdCisJCXRzdAlccmQsICNTM0MyNDEwX1VUUlNUQVRfVFhGRQorCQliZXEJMTAwMWIKKworMTAwMjoJCUAgZXhpdCBidXN5dWFydAorCS5lbmRtCisKKwkubWFjcm8Jd2FpdHVhcnQscmQscngKKwkJbGRyCVxyZCwgWyBccngsICMgUzNDMjQxMF9VRkNPTiBdCisJCXRzdAlccmQsICNTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFCUAgZmlmbyBlbmFibGVkPworCQliZXEJMTAwMWYJCQkJQAorCQlAIEZJRk8gZW5hYmxlZC4uLgorMTAwMzoKKwkJZmlmb19sZXZlbCBccmQsIFxyeAorCQl0ZXEJXHJkLCAjMAorCQlibmUJMTAwM2IKKwkJYgkxMDAyZgorMTAwMToKKwkJQCBpZGxlIHdhaXRpbmcgZm9yIG5vbiBmaWZvCisJCWxkcglccmQsIFsgXHJ4LCAjIFMzQzI0MTBfVVRSU1RBVCBdCisJCXRzdAlccmQsICNTM0MyNDEwX1VUUlNUQVRfVFhGRQorCQliZXEJMTAwMWIKKworMTAwMjoJCUAgZXhpdCBidXN5dWFydAorCS5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvbWFwLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvbWFwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9tYXAuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L21hcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1hZGMuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLWFkYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvcmVncy1hZGMuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3MtYWRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L3JlZ3Mtc2VyaWFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvcmVncy1zZXJpYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL3JlZ3MtdGltZXIuaCBiL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXRpbWVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9yZWdzLXRpbWVyLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9yZWdzLXRpbWVyLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjAwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXMzYy9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsMTU1IEBACisvKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvdW5jb21wcmVzcy5oCisgKgorICogQ29weXJpZ2h0IDIwMDMsIDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQyAtIHVuY29tcHJlc3MgY29kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfVU5DT01QUkVTU19ICisjZGVmaW5lIF9fQVNNX1BMQVRfVU5DT01QUkVTU19ICisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVwZl90OwkvKiBjYW5ub3QgaW5jbHVkZSBsaW51eC9zZXJpYWxfY29yZS5oICovCisKKy8qIHVhcnQgc2V0dXAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBmaWZvX21hc2s7CitzdGF0aWMgdW5zaWduZWQgaW50IGZpZm9fbWF4OworCisvKiBmb3J3YXJkIGRlY2xlcmF0aW9ucyAqLworCitzdGF0aWMgdm9pZCBhcmNoX2RldGVjdF9jcHUodm9pZCk7CisKKy8qIGRlZmluZXMgZm9yIFVBUlQgcmVnaXN0ZXJzICovCisKKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaD4KKworLyogd29ya2luZyBpbiBwaHlzaWNhbCBzcGFjZS4uLiAqLworI3VuZGVmIFMzQzI0MTBfV0RPR1JFRworI2RlZmluZSBTM0MyNDEwX1dET0dSRUcoeCkgKChTM0MyNFhYX1BBX1dBVENIRE9HICsgKHgpKSkKKworLyogaG93IG1hbnkgYnl0ZXMgd2UgYWxsb3cgaW50byB0aGUgRklGTyBhdCBhIHRpbWUgaW4gRklGTyBtb2RlICovCisjZGVmaW5lIEZJRk9fTUFYCSAoMTQpCisKKyNkZWZpbmUgdWFydF9iYXNlIFMzQzI0WFhfUEFfVUFSVCArICgweDQwMDAqQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3VhcnRfd3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0cjsKKworCXB0ciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikocmVnICsgdWFydF9iYXNlKTsKKwkqcHRyID0gdmFsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKK3VhcnRfcmQodW5zaWduZWQgaW50IHJlZykKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0cjsKKworCXB0ciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikocmVnICsgdWFydF9iYXNlKTsKKwlyZXR1cm4gKnB0cjsKK30KKworLyogd2UgY2FuIGRlYWwgd2l0aCB0aGUgY2FzZSB0aGUgVUFSVHMgYXJlIGJlaW5nIHJ1bgorICogaW4gRklGTyBtb2RlLCBzbyB0aGF0IHdlIGRvbid0IGhvbGQgdXAgb3VyIGV4ZWN1dGlvbgorICogd2FpdGluZyBmb3IgdHggdG8gaGFwcGVuLi4uCisqLworCitzdGF0aWMgdm9pZCBwdXRjKGludCBjaCkKK3sKKwlpZiAodWFydF9yZChTM0MyNDEwX1VGQ09OKSAmIFMzQzI0MTBfVUZDT05fRklGT01PREUpIHsKKwkJaW50IGxldmVsOworCisJCXdoaWxlICgxKSB7CisJCQlsZXZlbCA9IHVhcnRfcmQoUzNDMjQxMF9VRlNUQVQpOworCQkJbGV2ZWwgJj0gZmlmb19tYXNrOworCisJCQlpZiAobGV2ZWwgPCBmaWZvX21heCkKKwkJCQlicmVhazsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogbm90IHVzaW5nIGZpZm9zICovCisKKwkJd2hpbGUgKCh1YXJ0X3JkKFMzQzI0MTBfVVRSU1RBVCkgJiBTM0MyNDEwX1VUUlNUQVRfVFhFKSAhPSBTM0MyNDEwX1VUUlNUQVRfVFhFKQorCQkJYmFycmllcigpOworCX0KKworCS8qIHdyaXRlIGJ5dGUgdG8gdHJhbnNtaXNzaW9uIHJlZ2lzdGVyICovCisJdWFydF93cihTM0MyNDEwX1VUWEgsIGNoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoKHZvaWQpCit7Cit9CisKKyNkZWZpbmUgX19yYXdfd3JpdGVsKGQsYWQpIGRvIHsgKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkKSkgPSAoZCk7IH0gd2hpbGUoMCkKKworLyogQ09ORklHX1MzQ19CT09UX1dBVENIRE9HCisgKgorICogU2ltcGxlIGJvb3QtdGltZSB3YXRjaGRvZyBzZXR1cCwgdG8gcmVib290IHRoZSBzeXN0ZW0gaWYgdGhlcmUgaXMKKyAqIGFueSBwcm9ibGVtIHdpdGggdGhlIGJvb3QgcHJvY2VzcworKi8KKworI2lmZGVmIENPTkZJR19TM0NfQk9PVF9XQVRDSERPRworCisjZGVmaW5lIFdET0dfQ09VTlQgKDB4ZmYwMCkKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZGVjb21wX3dkb2codm9pZCkKK3sKKwlfX3Jhd193cml0ZWwoV0RPR19DT1VOVCwgUzNDMjQxMF9XVENOVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hfZGVjb21wX3dkb2dfc3RhcnQodm9pZCkKK3sKKwlfX3Jhd193cml0ZWwoV0RPR19DT1VOVCwgUzNDMjQxMF9XVERBVCk7CisJX19yYXdfd3JpdGVsKFdET0dfQ09VTlQsIFMzQzI0MTBfV1RDTlQpOworCV9fcmF3X3dyaXRlbChTM0MyNDEwX1dUQ09OX0VOQUJMRSB8IFMzQzI0MTBfV1RDT05fRElWMTI4IHwgUzNDMjQxMF9XVENPTl9SU1RFTiB8IFMzQzI0MTBfV1RDT05fUFJFU0NBTEUoMHg4MCksIFMzQzI0MTBfV1RDT04pOworfQorCisjZWxzZQorI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nX3N0YXJ0KCkKKyNkZWZpbmUgYXJjaF9kZWNvbXBfd2RvZygpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TM0NfQk9PVF9FUlJPUl9SRVNFVAorCitzdGF0aWMgdm9pZCBhcmNoX2RlY29tcF9lcnJvcihjb25zdCBjaGFyICp4KQoreworCXB1dHN0cigiXG5cbiIpOworCXB1dHN0cih4KTsKKwlwdXRzdHIoIlxuXG4gLS0gU3lzdGVtIHJlc2V0dGluZ1xuIik7CisKKwlfX3Jhd193cml0ZWwoMHg0MDAwLCBTM0MyNDEwX1dUREFUKTsKKwlfX3Jhd193cml0ZWwoMHg0MDAwLCBTM0MyNDEwX1dUQ05UKTsKKwlfX3Jhd193cml0ZWwoUzNDMjQxMF9XVENPTl9FTkFCTEUgfCBTM0MyNDEwX1dUQ09OX0RJVjEyOCB8IFMzQzI0MTBfV1RDT05fUlNURU4gfCBTM0MyNDEwX1dUQ09OX1BSRVNDQUxFKDB4NDApLCBTM0MyNDEwX1dUQ09OKTsKKworCXdoaWxlKDEpOworfQorCisjZGVmaW5lIGFyY2hfZXJyb3IgYXJjaF9kZWNvbXBfZXJyb3IKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBlcnJvcihjaGFyICplcnIpOworCitzdGF0aWMgdm9pZAorYXJjaF9kZWNvbXBfc2V0dXAodm9pZCkKK3sKKwkvKiB3ZSBtYXkgbmVlZCB0byBzZXR1cCB0aGUgdWFydChzKSBoZXJlIGlmIHdlIGFyZSBub3QgcnVubmluZworCSAqIG9uIGFuIEJBU1QuLi4gdGhlIEJBU1Qgd2lsbCBoYXZlIGxlZnQgdGhlIHVhcnRzIGNvbmZpZ3VyZWQKKwkgKiBhZnRlciBjYWxsaW5nIGxpbnV4LgorCSAqLworCisJYXJjaF9kZXRlY3RfY3B1KCk7CisJYXJjaF9kZWNvbXBfd2RvZ19zdGFydCgpOworfQorCisKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1VOQ09NUFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYwppbmRleCA1NGQ0YjhlLi5hMDA1ZGRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY2xvY2suYwpAQCAtMzksMTYgKzM5LDE2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAvKiBjbG9jayBpbmZvcm1hdGlvbiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5jCmluZGV4IDE4NjNhMWIuLjMwOTg3MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0zMiw3ICszMyw2IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgpAQCAtNDAsOSArNDAsOSBAQAogCiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjL25hbmQuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9jb21tb24tc21kay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogLyogTEVEIGRldmljZXMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCmluZGV4IDg5Y2U2MGUuLjIyYTMyOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKQEAgLTI5LDExICsyOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00MiwxOCArNDIsMTggQEAKICNpbmNsdWRlIDxtYWNoL3N5c3RlbS1yZXNldC5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MDAuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MTAuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MTIuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTIuaD4KICNpbmNsdWRlICJzM2MyNDR4LmgiCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQyLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9zM2MyNDQzLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQyLmg+CisjaW5jbHVkZSA8cGxhdC9zM2MyNDQzLmg+CiAKIHN0cnVjdCBjcHVfdGFibGUgewogCXVuc2lnbmVkIGxvbmcJaWRjb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKaW5kZXggZDZmYjc2NS4uZTkzZjhiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCkBAIC0xOSwyMCArMTksMjAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvZmIuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvdWRjLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9yZWdzLXNwaS5oPgogCiAvKiBTZXJpYWwgcG9ydCByZWdpc3RyYXRpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZG1hLmMKaW5kZXggMDhjMmFhZi4uMWJhZjk0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwpAQCAtMjYsMTcgKzI2LDE3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZG1hLmg+CisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIAogLyogaW8gbWFwIGZvciBkbWEgKi8KIHN0YXRpYyB2b2lkIF9faW9tZW0gKmRtYV9iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvLmMKaW5kZXggZGQyNzMzNC4uNGE4OTljMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jCkBAIC0yNiwxMCArMjYsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY2xvY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9jbG9jay5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9jb21tb24tc21kay5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NvbW1vbi1zbWRrLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvY3B1LmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2NwdS5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2RldnMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvZGV2cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2RldnMuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9kZXZzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvZG1hLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2RtYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2RtYS5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2RtYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L2lycS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9pcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9pcnEuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9wbS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3BtLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcG0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDAwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDAwLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQwMC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTAuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0MTAuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQxMi5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQxMi5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQwLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQwLmgKcmVuYW1lIHRvIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0MC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDIuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDIuaApyZW5hbWUgdG8gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDQyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQ0My5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDQzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQ0My5oCnJlbmFtZSB0byBhcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NDMuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2lycS5jCmluZGV4IDM2Y2VmZTEuLjk2M2Y3YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pcnEuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaXJxLmMKQEAgLTU1LDE5ICs1NSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvaXJxLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9pcnEuaD4KIAogLyogd2FrZXVwIGlycSBjb250cm9sICovCiAKQEAgLTQ2OCw3ICs0NjgsNiBAQAogewogCXVuc2lnbmVkIGludCBzdWJzcmMsIHN1Ym1zazsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gOTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKm15ZGVzYzsKIAogCS8qIHJlYWQgdGhlIGN1cnJlbnQgcGVuZGluZyBpbnRlcnJ1cHRzLCBhbmQgdGhlIG1hc2sKIAkgKiBmb3Igd2hhdCBpdCBpcyBhdmFpbGFibGUgKi8KQEAgLTQ4MiwxMiArNDgxLDEwIEBACiAKIAlpZiAoc3Vic3JjICE9IDApIHsKIAkJaWYgKHN1YnNyYyAmIDEpIHsKLQkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1RDOwotCQkJZGVzY19oYW5kbGVfaXJxKElSUV9UQywgbXlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfVEMpOwogCQl9CiAJCWlmIChzdWJzcmMgJiAyKSB7Ci0JCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9BREM7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoSVJRX0FEQywgbXlkZXNjKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQURDKTsKIAkJfQogCX0KIH0KQEAgLTQ5Niw3ICs0OTMsNiBAQAogewogCXVuc2lnbmVkIGludCBzdWJzcmMsIHN1Ym1zazsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc3RhcnQgLSBJUlFfUzNDVUFSVF9SWDA7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJLyogcmVhZCB0aGUgY3VycmVudCBwZW5kaW5nIGludGVycnVwdHMsIGFuZCB0aGUgbWFzawogCSAqIGZvciB3aGF0IGl0IGlzIGF2YWlsYWJsZSAqLwpAQCAtNTEyLDIwICs1MDgsMTQgQEAKIAlzdWJzcmMgJj0gNzsKIAogCWlmIChzdWJzcmMgIT0gMCkgewotCQlkZXNjID0gaXJxX2Rlc2MgKyBzdGFydDsKLQogCQlpZiAoc3Vic3JjICYgMSkKLQkJCWRlc2NfaGFuZGxlX2lycShzdGFydCwgZGVzYyk7Ci0KLQkJZGVzYysrOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHN0YXJ0KTsKIAogCQlpZiAoc3Vic3JjICYgMikKLQkJCWRlc2NfaGFuZGxlX2lycShzdGFydCsxLCBkZXNjKTsKLQotCQlkZXNjKys7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoc3RhcnQrMSk7CiAKIAkJaWYgKHN1YnNyYyAmIDQpCi0JCQlkZXNjX2hhbmRsZV9pcnEoc3RhcnQrMiwgZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoc3RhcnQrMik7CiAJfQogfQogCkBAIC01NzIsNyArNTYyLDcgQEAKIAkJZWludHBuZCAmPSB+KDE8PGlycSk7CiAKIAkJaXJxICs9IChJUlFfRUlOVDQgLSA0KTsKLQkJZGVzY19oYW5kbGVfaXJxKGlycSwgaXJxX2Rlc2MgKyBpcnEpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAl9CiAKIH0KQEAgLTU5NSw3ICs1ODUsNyBAQAogCiAJCWlycSArPSAoSVJRX0VJTlQ0IC0gNCk7CiAKLQkJZGVzY19oYW5kbGVfaXJxKGlycSwgaXJxX2Rlc2MgKyBpcnEpOworCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS1zaW10ZWMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS1zaW10ZWMuYwppbmRleCBlNjcwNTAxLi4yMWRmYTc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcG0tc2ltdGVjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLXNpbXRlYy5jCkBAIC0yMCwxMiArMjAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgogCiAjZGVmaW5lIENPUFlSSUdIVCAiLCAoYykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKaW5kZXggZmM0YjczMS4uOGVmYjU3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3BtLmMKQEAgLTM1LDEyICszNSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbWVtLmg+CkBAIC00OCw3ICs0OCw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgogCiAvKiBmb3IgZXh0ZXJuYWwgdXNlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20tY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20tY2xvY2suYwppbmRleCAzMDZjYzljLi5iOGU4NTRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS1jbG9jay5jCkBAIC0yNCwxMCArMjQsMTAgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy10aW1lci5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy10aW1lci5oPgogCiAvKiBFYWNoIG9mIHRoZSB0aW1lcnMgMCB0aHJvdWdoIDUgZ28gdGhyb3VnaCB0aGUgZm9sbG93aW5nCiAgKiBjbG9jayB0cmVlLCB3aXRoIHRoZSBpbnB1dHMgZGVwZW5kaW5nIG9uIHRoZSB0aW1lcnMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMKaW5kZXggN2E5MmM5My4uZmViNzcwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20uYwpAQCAtMTksOCArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2RldnMuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy10aW1lci5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy10aW1lci5oPgogCiBzdHJ1Y3QgcHdtX2RldmljZSB7CiAJc3RydWN0IGxpc3RfaGVhZAkgbGlzdDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC1jbG9jay5jCmluZGV4IDhhNWZmZmQuLjdjMDk3NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHgtY2xvY2suYwpAQCAtMzMsMTYgKzMzLDE2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiBzdGF0aWMgaW50IHMzYzI0NDBfc2V0cGFyZW50X2FybWNsayhzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LWlycS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHgtaXJxLmMKaW5kZXggZjNkYzM4Yy4uMDkwMmFmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHgtaXJxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHgtaXJxLmMKQEAgLTI0LDE5ICsyNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvaXJxLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisjaW5jbHVkZSA8cGxhdC9pcnEuaD4KIAogLyogY2FtZXJhIGlycSAqLwogCkBAIC00NCw3ICs0NCw2IEBACiAJCQkgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOwotCXN0cnVjdCBpcnFfZGVzYyAqbXlkZXNjOwogCiAJLyogcmVhZCB0aGUgY3VycmVudCBwZW5kaW5nIGludGVycnVwdHMsIGFuZCB0aGUgbWFzawogCSAqIGZvciB3aGF0IGl0IGlzIGF2YWlsYWJsZSAqLwpAQCAtNTgsMTIgKzU3LDEwIEBACiAKIAlpZiAoc3Vic3JjICE9IDApIHsKIAkJaWYgKHN1YnNyYyAmIDEpIHsKLQkJCW15ZGVzYyA9IGlycV9kZXNjICsgSVJRX1MzQzI0NDBfQ0FNX0M7Ci0JCQlkZXNjX2hhbmRsZV9pcnEoSVJRX1MzQzI0NDBfQ0FNX0MsIG15ZGVzYyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX1MzQzI0NDBfQ0FNX0MpOwogCQl9CiAJCWlmIChzdWJzcmMgJiAyKSB7Ci0JCQlteWRlc2MgPSBpcnFfZGVzYyArIElSUV9TM0MyNDQwX0NBTV9QOwotCQkJZGVzY19oYW5kbGVfaXJxKElSUV9TM0MyNDQwX0NBTV9QLCBteWRlc2MpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9TM0MyNDQwX0NBTV9QKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0eC5jCmluZGV4IDI4MWI0ODAuLmMwMzQ0ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDR4LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NHguYwpAQCAtMjAsMjggKzIwLDI4IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpb2ouaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZHNjLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0MTAuaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MyNHh4L3MzYzI0NDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzI0NDAuaD4KICNpbmNsdWRlICJzM2MyNDR4LmgiCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvZGV2cy5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9wbS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzM2MyNDR4X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJSU9ERVNDX0VOVChDTEtQV1IpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NsZWVwLlMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvc2xlZXAuUwppbmRleCA0OTgxYTA4Yi4uNzY1OTRiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NsZWVwLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NsZWVwLlMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tZW0uaD4KLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAKIC8qIENPTkZJR19ERUJVR19SRVNVTUUgaXMgZGFuZ2Vyb3VzIGlmIHlvdXIgYm9vdGxvYWRlciBkb2VzIG5vdAogICogcmVzZXQgdGhlIFVBUlQgY29uZmlndXJhdGlvbiwgb25seSBlbmFibGUgaWYgeW91IHJlYWxseSBuZWVkIHRoaXMhCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3RpbWUuYwppbmRleCBiNDcxYTIxLi5jNTE5MTYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC90aW1lLmMKQEAgLTI1LDIwICsyNSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3MtdGltZXIuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXJ0dmFsOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfdXNlY190aWNrczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCmluZGV4IDU2MjgxYzAuLjQzYWEyMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcwpAQCAtMTIsNyArMTIsNyBAQAogIwogIyAgIGh0dHA6Ly93d3cuYXJtLmxpbnV4Lm9yZy51ay9kZXZlbG9wZXIvbWFjaGluZXMvP2FjdGlvbj1uZXcKICMKLSMgTGFzdCB1cGRhdGU6IFdlZCBBdWcgMTMgMjE6NTY6MDIgMjAwOAorIyBMYXN0IHVwZGF0ZTogVGh1IFNlcCAyNSAxMDoxMDo1MCAyMDA4CiAjCiAjIG1hY2hpbmVfaXNfeHh4CUNPTkZJR194eHh4CQlNQUNIX1RZUEVfeHh4CQludW1iZXIKICMKQEAgLTE4MTAsNyArMTgxMCw3IEBACiBwaWx6X3BtaTUJCU1BQ0hfUElMWl9QTUk1CQlQSUxaX1BNSTUJCTE4MjAKIGphZGUJCQlNQUNIX0pBREUJCUpBREUJCQkxODIxCiBrczg2OTVfc29mdHBsYwkJTUFDSF9LUzg2OTVfU09GVFBMQwlLUzg2OTVfU09GVFBMQwkJMTgyMgotZ3ByaXNjMwkJCU1BQ0hfR1BSSVNDNAkJR1BSSVNDNAkJCTE4MjMKK2dwcmlzYzMJCQlNQUNIX0dQUklTQzMJCUdQUklTQzMJCQkxODIzCiBzdGFtcDkyNjAJCU1BQ0hfU1RBTVA5MjYwCQlTVEFNUDkyNjAJCTE4MjQKIHNtZGs2NDMwCQlNQUNIX1NNREs2NDMwCQlTTURLNjQzMAkJMTgyNQogc21ka2MxMDAJCU1BQ0hfU01ES0MxMDAJCVNNREtDMTAwCQkxODI2CkBAIC0xODU5LDUgKzE4NTksNDMgQEAKIGdpbnphCQkJTUFDSF9HSU5aQQkJR0lOWkEJCQkxODY5CiBhNjM2bgkJCU1BQ0hfQTYzNk4JCUE2MzZOCQkJMTg3MAogaW14MjdpcGNhbQkJTUFDSF9JTVgyN0lQQ0FNCQlJTVgyN0lQQ0FNCQkxODcxCi1uZW5vYwkJCU1BQ0hfTkVNT0MJCU5FTU9DCQkJMTg3MgorbmVtb2MJCQlNQUNIX05FTU9DCQlORU1PQwkJCTE4NzIKIGdlbmV2YQkJCU1BQ0hfR0VORVZBCQlHRU5FVkEJCQkxODczCitodGNwaGFyb3MJCU1BQ0hfSFRDUEhBUk9TCQlIVENQSEFST1MJCTE4NzQKK25lb25jCQkJTUFDSF9ORU9OQwkJTkVPTkMJCQkxODc1CituYXM3MTAwCQkJTUFDSF9OQVM3MTAwCQlOQVM3MTAwCQkJMTg3NgordGV1cGhvbmUJCU1BQ0hfVEVVUEhPTkUJCVRFVVBIT05FCQkxODc3Cithbm5heF9ldGgyCQlNQUNIX0FOTkFYX0VUSDIJCUFOTkFYX0VUSDIJCTE4NzgKK2NzYjczMwkJCU1BQ0hfQ1NCNzMzCQlDU0I3MzMJCQkxODc5CitiazMJCQlNQUNIX0JLMwkJQkszCQkJMTg4MAorb21hcF9lbTMyCQlNQUNIX09NQVBfRU0zMgkJT01BUF9FTTMyCQkxODgxCitldDkyNjFjcAkJTUFDSF9FVDkyNjFDUAkJRVQ5MjYxQ1AJCTE4ODIKK2phc3BlcmMJCQlNQUNIX0pBU1BFUkMJCUpBU1BFUkMJCQkxODgzCitpc3NpX2FybTkJCU1BQ0hfSVNTSV9BUk05CQlJU1NJX0FSTTkJCTE4ODQKK3VlZAkJCU1BQ0hfVUVECQlVRUQJCQkxODg1Citlc2libGFkZQkJTUFDSF9FU0lCTEFERQkJRVNJQkxBREUJCTE4ODYKK2V5ZTAyCQkJTUFDSF9FWUUwMgkJRVlFMDIJCQkxODg3CitpbXgyN2tiZAkJTUFDSF9JTVgyN0tCRAkJSU1YMjdLQkQJCTE4ODgKK3NzdDYxdmMwMTBfZnBnYQkJTUFDSF9TU1Q2MVZDMDEwX0ZQR0EJU1NUNjFWQzAxMF9GUEdBCQkxODg5CitraXh2cDQzNQkJTUFDSF9LSVhWUDQzNQkJS0lYVlA0MzUJCTE4OTAKK2tpeG5wNDM1CQlNQUNIX0tJWE5QNDM1CQlLSVhOUDQzNQkJMTg5MQorYWZyaWNhCQkJTUFDSF9BRlJJQ0EJCUFGUklDQQkJCTE4OTIKK25oMjMzCQkJTUFDSF9OSDIzMwkJTkgyMzMJCQkxODkzCityZDg4ZjYxODNhcF9nZQkJTUFDSF9SRDg4RjYxODNBUF9HRQlSRDg4RjYxODNBUF9HRQkJMTg5NAorYmNtNDc2MAkJCU1BQ0hfQkNNNDc2MAkJQkNNNDc2MAkJCTE4OTUKK2VkZHlfdjIJCQlNQUNIX0VERFlfVjIJCUVERFlfVjIJCQkxODk2CityZWFsdmlld19wYmE4CQlNQUNIX1JFQUxWSUVXX1BCQTgJUkVBTFZJRVdfUEJBOAkJMTg5NworaGlkX2E3CQkJTUFDSF9ISURfQTcJCUhJRF9BNwkJCTE4OTgKK2hlcm8JCQlNQUNIX0hFUk8JCUhFUk8JCQkxODk5CitvbWFwX3Bvc2VpZG9uCQlNQUNIX09NQVBfUE9TRUlET04JT01BUF9QT1NFSURPTgkJMTkwMAorcmVhbHZpZXdfcGJ4CQlNQUNIX1JFQUxWSUVXX1BCWAlSRUFMVklFV19QQlgJCTE5MDEKK21pY3JvOXMJCQlNQUNIX01JQ1JPOVMJCU1JQ1JPOVMJCQkxOTAyCittYWtvCQkJTUFDSF9NQUtPCQlNQUtPCQkJMTkwMworeGRhZmxhbWUJCU1BQ0hfWERBRkxBTUUJCVhEQUZMQU1FCQkxOTA0CitwaGlkZ2V0X3NiYzIJCU1BQ0hfUEhJREdFVF9TQkMyCVBISURHRVRfU0JDMgkJMTkwNQorbGltZXN0b25lCQlNQUNIX0xJTUVTVE9ORQkJTElNRVNUT05FCQkxOTA2CitpcHJvYmVfYzMyCQlNQUNIX0lQUk9CRV9DMzIJCUlQUk9CRV9DMzIJCTE5MDcKK3J1dDEwMAkJCU1BQ0hfUlVUMTAwCQlSVVQxMDAJCQkxOTA4Cithc3VzcDUzNQkJTUFDSF9BU1VTUDUzNQkJQVNVU1A1MzUJCTE5MDkKK2h0Y3JhcGhhZWwJCU1BQ0hfSFRDUkFQSEFFTAkJSFRDUkFQSEFFTAkJMTkxMAorc3lnZGcxCQkJTUFDSF9TWUdERzEJCVNZR0RHMQkJCTE5MTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC9lbnRyeS5TIGIvYXJjaC9hcm0vdmZwL2VudHJ5LlMKaW5kZXggODA2Y2UyNi4uYmE1OTJhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL2VudHJ5LlMKKysrIGIvYXJjaC9hcm0vdmZwL2VudHJ5LlMKQEAgLTIxLDEzICsyMSwxMyBAQAogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vdmZwbWFjcm9zLmg+CiAKLQkuZ2xvYmwJZG9fdmZwCi1kb192ZnA6CitFTlRSWShkb192ZnApCiAJZW5hYmxlX2lycQogIAlsZHIJcjQsIC5MQ3ZmcAogCWxkcglyMTEsIFtyMTAsICNUSV9DUFVdCUAgQ1BVIG51bWJlcgogCWFkZAlyMTAsIHIxMCwgI1RJX1ZGUFNUQVRFCUAgcjEwID0gd29ya3NwYWNlCiAJbGRyCXBjLCBbcjRdCQlAIGNhbGwgVkZQIGVudHJ5IHBvaW50CitFTkRQUk9DKGRvX3ZmcCkKIAogRU5UUlkodmZwX251bGxfZW50cnkpCiAJbW92CXBjLCBscgpAQCAtNDAsMTEgKzQwLDExIEBACiBAIGZhaWx1cmUgdG8gdGhlIFZGUCBpbml0aWFsaXNhdGlvbiBjb2RlLgogCiAJX19JTklUCi0JLmdsb2JsCXZmcF90ZXN0aW5nX2VudHJ5Ci12ZnBfdGVzdGluZ19lbnRyeToKK0VOVFJZKHZmcF90ZXN0aW5nX2VudHJ5KQogCWxkcglyMCwgVkZQX2FyY2hfYWRkcmVzcwogCXN0cglyNSwgW3IwXQkJQCBrbm93biBub24temVybyB2YWx1ZQogCW1vdglwYywgcjkJCQlAIHdlIGhhdmUgaGFuZGxlZCB0aGUgZmF1bHQKK0VORFBST0ModmZwX3Rlc3RpbmdfZW50cnkpCiAKIFZGUF9hcmNoX2FkZHJlc3M6CiAJLndvcmQJVkZQX2FyY2gKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBody5TIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKaW5kZXggMzUzZjllNS4uYTYyZGNmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKQEAgLTY4LDggKzY4LDcgQEAKIEAgIHIxMSA9IENQVSBudW1iZXIKIEAgIGxyICA9IGZhaWx1cmUgcmV0dXJuCiAKLQkuZ2xvYmwJdmZwX3N1cHBvcnRfZW50cnkKLXZmcF9zdXBwb3J0X2VudHJ5OgorRU5UUlkodmZwX3N1cHBvcnRfZW50cnkpCiAJREJHU1RSMwkiaW5zdHIgJTA4eCBwYyAlMDh4IHN0YXRlICVwIiwgcjAsIHIyLCByMTAKIAogCVZGUEZNUlgJcjEsIEZQRVhDCQlAIElzIHRoZSBWRlAgZW5hYmxlZD8KQEAgLTE2NSwxMSArMTY0LDEwIEBACiAJCQkJCUAgY29kZSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZgogCQkJCQlAIHJlcXVpcmVkLiBJZiBub3QsIHRoZSB1c2VyIGNvZGUgd2lsbAogCQkJCQlAIHJldHJ5IHRoZSBmYXVsdGVkIGluc3RydWN0aW9uCitFTkRQUk9DKHZmcF9zdXBwb3J0X2VudHJ5KQogCiAjaWZkZWYgQ09ORklHX1NNUAotCS5nbG9ibAl2ZnBfc2F2ZV9zdGF0ZQotCS50eXBlCXZmcF9zYXZlX3N0YXRlLCAlZnVuY3Rpb24KLXZmcF9zYXZlX3N0YXRlOgorRU5UUlkodmZwX3NhdmVfc3RhdGUpCiAJQCBTYXZlIHRoZSBjdXJyZW50IFZGUCBzdGF0ZQogCUAgcjAgLSBzYXZlIGxvY2F0aW9uCiAJQCByMSAtIEZQRVhDCkBAIC0xODIsMTMgKzE4MCwxMyBAQAogCVZGUEZNUlgJcjEyLCBGUElOU1QyLCBORQlAIEZQSU5TVDIgaWYgbmVlZGVkIChhbmQgcHJlc2VudCkKIAlzdG1pYQlyMCwge3IxLCByMiwgcjMsIHIxMn0JQCBzYXZlIEZQRVhDLCBGUFNDUiwgRlBJTlNULCBGUElOU1QyCiAJbW92CXBjLCBscgorRU5EUFJPQyh2ZnBfc2F2ZV9zdGF0ZSkKICNlbmRpZgogCiBsYXN0X1ZGUF9jb250ZXh0X2FkZHJlc3M6CiAJLndvcmQJbGFzdF9WRlBfY29udGV4dAogCi0JLmdsb2JsCXZmcF9nZXRfZmxvYXQKLXZmcF9nZXRfZmxvYXQ6CitFTlRSWSh2ZnBfZ2V0X2Zsb2F0KQogCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKIAltb3YJcjAsIHIwCiAJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CkBAIC0xOTcsOSArMTk1LDkgQEAKIAltcmMJcDEwLCAwLCByMCwgY1xkciwgYzAsIDQJQCBmbXJzCXIwLCBzMQogCW1vdglwYywgbHIKIAkuZW5kcgorRU5EUFJPQyh2ZnBfZ2V0X2Zsb2F0KQogCi0JLmdsb2JsCXZmcF9wdXRfZmxvYXQKLXZmcF9wdXRfZmxvYXQ6CitFTlRSWSh2ZnBfcHV0X2Zsb2F0KQogCWFkZAlwYywgcGMsIHIxLCBsc2wgIzMKIAltb3YJcjAsIHIwCiAJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CkBAIC0yMDgsOSArMjA2LDkgQEAKIAltY3IJcDEwLCAwLCByMCwgY1xkciwgYzAsIDQJQCBmbXNyCXIwLCBzMQogCW1vdglwYywgbHIKIAkuZW5kcgorRU5EUFJPQyh2ZnBfcHV0X2Zsb2F0KQogCi0JLmdsb2JsCXZmcF9nZXRfZG91YmxlCi12ZnBfZ2V0X2RvdWJsZToKK0VOVFJZKHZmcF9nZXRfZG91YmxlKQogCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKIAltb3YJcjAsIHIwCiAJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1CkBAIC0yMjksOSArMjI3LDkgQEAKIAltb3YJcjAsICMwCiAJbW92CXIxLCAjMAogCW1vdglwYywgbHIKK0VORFBST0ModmZwX2dldF9kb3VibGUpCiAKLQkuZ2xvYmwJdmZwX3B1dF9kb3VibGUKLXZmcF9wdXRfZG91YmxlOgorRU5UUlkodmZwX3B1dF9kb3VibGUpCiAJYWRkCXBjLCBwYywgcjIsIGxzbCAjMwogCW1vdglyMCwgcjAKIAkuaXJwCWRyLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUKQEAgLTI0NSwzICsyNDMsNCBAQAogCW1vdglwYywgbHIKIAkuZW5kcgogI2VuZGlmCitFTkRQUk9DKHZmcF9wdXRfZG91YmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKaW5kZXggYjgyODZmMWNlLi42YzU0NTgwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKQEAgLTksNiArOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgpAQCAtNTMsOCArNTQsMTEgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBtY2kwX2RhdGEgPSB7Ci0JLmRldGVjdF9waW4JPSBHUElPX1BJTl9QQygyNSksCi0JLndwX3BpbgkJPSBHUElPX1BJTl9QRSgwKSwKKwkuc2xvdFswXSA9IHsKKwkJLmJ1c193aWR0aAk9IDQsCisJCS5kZXRlY3RfcGluCT0gR1BJT19QSU5fUEMoMjUpLAorCQkud3BfcGluCQk9IEdQSU9fUElOX1BFKDApLAorCX0sCiB9OwogCiAvKgpAQCAtMTkwLDcgKzE5NCw3IEBACiAJICogUEIyOC9FWFRJTlQzIGRvZXNuJ3Q7IGl0IHNob3VsZCBiZSBTTUJBTEVSVCMgKGZvciBQTUJ1cyksCiAJICogYnV0IGl0J3Mgbm90IGF2YWlsYWJsZSBvZmYtYm9hcmQuCiAJICovCi0JYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElOX1BCKDI4KSwgMCwgQVQzMl9HUElPRl9QVUxMVVApOworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgMSA8PCAyOCwgMCwgQVQzMl9HUElPRl9QVUxMVVApOwogCWF0MzJfc2VsZWN0X2dwaW8oaTJjX2dwaW9fZGF0YS5zZGFfcGluLAogCQlBVDMyX0dQSU9GX01VTFRJRFJWIHwgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOwogCWF0MzJfc2VsZWN0X2dwaW8oaTJjX2dwaW9fZGF0YS5zY2xfcGluLApAQCAtMjA0LDYgKzIwOCwxNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhdG5ndzEwMF9hcmNoX2luaXQodm9pZCkKIHsKKwkvKiBQQjMwIGlzIHRoZSBvdGhlcndpc2UgdW51c2VkIGp1bXBlciBvbiB0aGUgbWFpbmJvYXJkLCB3aXRoIGFuCisJICogZXh0ZXJuYWwgcHVsbHVwOyB0aGUganVtcGVyIGdyb3VuZHMgaXQuICBVc2UgaXQgaG93ZXZlciB5b3UKKwkgKiBsaWtlLCBpbmNsdWRpbmcgbGV0dGluZyBVLUJvb3Qgb3IgTGludXggdHdlYWsgYm9vdCBzZXF1ZW5jZXMuCisJICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigzMCksIDApOworCWdwaW9fcmVxdWVzdChHUElPX1BJTl9QQigzMCksICJqMTUiKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1BJTl9QQigzMCkpOworCWdwaW9fZXhwb3J0KEdQSU9fUElOX1BCKDMwKSwgZmFsc2UpOworCiAJLyogc2V0X2lycV90eXBlKCkgYWZ0ZXIgdGhlIGFyY2hfaW5pdGNhbGwgZm9yIEVJQyBoYXMgcnVuLCBhbmQKIAkgKiBiZWZvcmUgdGhlIEkyQyBzdWJzeXN0ZW0gY291bGQgdHJ5IHVzaW5nIHRoaXMgSVJRLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IGVlNGMyOTIuLjI5ZTViNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQlnb3RvIGVycl9zZXRfY2xrOwogCX0KIAotCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJTl9QQSgzMCksIEdQSU9fUEVSSVBIX0EsIDApOworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0FfQkFTRSwgKDEgPDwgMzApLCBHUElPX1BFUklQSF9BLCAwKTsKIAlhdDczYzIxM19kYXRhLmRhY19jbGsgPSBnY2xrOwogCiBlcnJfc2V0X2NsazoKQEAgLTI2NCwxNiArMjY0LDIwIEBACiAKICNpZm5kZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TVzJfQ1VTVE9NCiAKK3N0YXRpYyBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBtY2kwX2RhdGEgPSB7CisJLnNsb3RbMF0gPSB7CisJCS5idXNfd2lkdGgJPSA0LAorCiAvKiBNTUMgY2FyZCBkZXRlY3QgcmVxdWlyZXMgTUFDQjAgKk5PVCogYmUgdXNlZCAqLwogI2lmZGVmIENPTkZJR19CT0FSRF9BVFNUSzEwMDJfU1c2X0NVU1RPTQotc3RhdGljIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG1jaTBfZGF0YSA9IHsKLQkuZGV0ZWN0X3Bpbgk9IEdQSU9fUElOX1BDKDE0KSwJLyogZ3BpbzMwL3NkY2QgKi8KLQkud3BfcGluCQk9IEdQSU9fUElOX1BDKDE1KSwJLyogZ3BpbzMxL3Nkd3AgKi8KLX07Ci0jZGVmaW5lIE1DSV9QREFUQQkmbWNpMF9kYXRhCisJCS5kZXRlY3RfcGluCT0gR1BJT19QSU5fUEMoMTQpLCAvKiBncGlvMzAvc2RjZCAqLworCQkud3BfcGluCQk9IEdQSU9fUElOX1BDKDE1KSwgLyogZ3BpbzMxL3Nkd3AgKi8KICNlbHNlCi0jZGVmaW5lIE1DSV9QREFUQQlOVUxMCisJCS5kZXRlY3RfcGluCT0gLUVOT0RFViwKKwkJLndwX3BpbgkJPSAtRU5PREVWLAogI2VuZGlmCS8qIFNXNiBmb3Igc2R7Y2Qsd3B9IHJvdXRpbmcgKi8KKwl9LAorfTsKIAogI2VuZGlmCS8qIFNXMiBmb3IgTU1DIHNpZ25hbCByb3V0aW5nICovCiAKQEAgLTMyNSwxNCArMzI5LDE1IEBACiAjaWZkZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TUEkxCiAJYXQzMl9hZGRfZGV2aWNlX3NwaSgxLCBzcGkxX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMV9ib2FyZF9pbmZvKSk7CiAjZW5kaWYKLSNpZm5kZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwMl9TVzJfQ1VTVE9NCi0JYXQzMl9hZGRfZGV2aWNlX21jaSgwLCBNQ0lfUERBVEEpOworI2lmbmRlZiBDT05GSUdfQk9BUkRfQVRTVEsxMDBYX1NXMl9DVVNUT00KKwlhdDMyX2FkZF9kZXZpY2VfbWNpKDAsICZtY2kwX2RhdGEpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwMl9TVzVfQ1VTVE9NCiAJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgxLCAmZXRoX2RhdGFbMV0pKTsKICNlbHNlCiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmF0c3RrMTAwMF9sY2RjX2RhdGEsCi0JCQkgICAgIGZibWVtX3N0YXJ0LCBmYm1lbV9zaXplLCAwKTsKKwkJCSAgICAgZmJtZW1fc3RhcnQsIGZibWVtX3NpemUsCisJCQkgICAgIEFUTUVMX0xDRENfUFJJXzI0QklUIHwgQVRNRUxfTENEQ19QUklfQ09OVFJPTCk7CiAjZW5kaWYKIAlhdDMyX2FkZF9kZXZpY2VfdXNiYSgwLCBOVUxMKTsKICNpZm5kZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TVzNfQ1VTVE9NCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMKaW5kZXggMGNmNjY0MS4uYmUwODlkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDMuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CkBAIC02Niw2ICs2NywxNiBAQAogfSB9OwogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TVzJfQ1VTVE9NCitzdGF0aWMgc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgbWNpMF9kYXRhID0geworCS5zbG90WzBdID0geworCQkuYnVzX3dpZHRoCT0gNCwKKwkJLmRldGVjdF9waW4JPSAtRU5PREVWLAorCQkud3BfcGluCQk9IC1FTk9ERVYsCisJfSwKK307CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19CT0FSRF9BVFNUSzEwMDBfRVhUREFDCiBzdGF0aWMgdm9pZCBfX2luaXQgYXRzdGsxMDAzX3NldHVwX2V4dGRhYyh2b2lkKQogewpAQCAtODQsNyArOTUsNyBAQAogCQlnb3RvIGVycl9zZXRfY2xrOwogCX0KIAotCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJTl9QQSgzMCksIEdQSU9fUEVSSVBIX0EsIDApOworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0FfQkFTRSwgKDEgPDwgMzApLCBHUElPX1BFUklQSF9BLCAwKTsKIAlhdDczYzIxM19kYXRhLmRhY19jbGsgPSBnY2xrOwogCiBlcnJfc2V0X2NsazoKQEAgLTE1NCw3ICsxNjUsNyBAQAogCWF0MzJfYWRkX2RldmljZV9zcGkoMSwgc3BpMV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaTFfYm9hcmRfaW5mbykpOwogI2VuZGlmCiAjaWZuZGVmIENPTkZJR19CT0FSRF9BVFNUSzEwMFhfU1cyX0NVU1RPTQotCWF0MzJfYWRkX2RldmljZV9tY2koMCwgTlVMTCk7CisJYXQzMl9hZGRfZGV2aWNlX21jaSgwLCAmbWNpMF9kYXRhKTsKICNlbmRpZgogCWF0MzJfYWRkX2RldmljZV91c2JhKDAsIE5VTEwpOwogI2lmbmRlZiBDT05GSUdfQk9BUkRfQVRTVEsxMDBYX1NXM19DVVNUT00KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYwppbmRleCA1MGE1MjczLi4yNDhlZjIzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDA0LmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwNC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgpAQCAtNzEsNiArNzIsMTYgQEAKIH0gfTsKICNlbmRpZgogCisjaWZuZGVmIENPTkZJR19CT0FSRF9BVFNUSzEwMFhfU1cyX0NVU1RPTQorc3RhdGljIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG1jaTBfZGF0YSA9IHsKKwkuc2xvdFswXSA9IHsKKwkJLmJ1c193aWR0aAk9IDQsCisJCS5kZXRlY3RfcGluCT0gLUVOT0RFViwKKwkJLndwX3BpbgkJPSAtRU5PREVWLAorCX0sCit9OworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQk9BUkRfQVRTVEsxMDAwX0VYVERBQwogc3RhdGljIHZvaWQgX19pbml0IGF0c3RrMTAwNF9zZXR1cF9leHRkYWModm9pZCkKIHsKQEAgLTg5LDcgKzEwMCw3IEBACiAJCWdvdG8gZXJyX3NldF9jbGs7CiAJfQogCi0JYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElOX1BBKDMwKSwgR1BJT19QRVJJUEhfQSwgMCk7CisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQV9CQVNFLCAoMSA8PCAzMCksIEdQSU9fUEVSSVBIX0EsIDApOwogCWF0NzNjMjEzX2RhdGEuZGFjX2NsayA9IGdjbGs7CiAKIGVycl9zZXRfY2xrOgpAQCAtMTM3LDEwICsxNDgsMTEgQEAKIAlhdDMyX2FkZF9kZXZpY2Vfc3BpKDEsIHNwaTFfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGkxX2JvYXJkX2luZm8pKTsKICNlbmRpZgogI2lmbmRlZiBDT05GSUdfQk9BUkRfQVRTVEsxMDBYX1NXMl9DVVNUT00KLQlhdDMyX2FkZF9kZXZpY2VfbWNpKDAsIE5VTEwpOworCWF0MzJfYWRkX2RldmljZV9tY2koMCwgJm1jaTBfZGF0YSk7CiAjZW5kaWYKIAlhdDMyX2FkZF9kZXZpY2VfbGNkYygwLCAmYXRzdGsxMDAwX2xjZGNfZGF0YSwKLQkJCSAgICAgZmJtZW1fc3RhcnQsIGZibWVtX3NpemUsIDApOworCQkJICAgICBmYm1lbV9zdGFydCwgZmJtZW1fc2l6ZSwKKwkJCSAgICAgQVRNRUxfTENEQ19QUklfMjRCSVQgfCBBVE1FTF9MQ0RDX1BSSV9DT05UUk9MKTsKIAlhdDMyX2FkZF9kZXZpY2VfdXNiYSgwLCBOVUxMKTsKICNpZm5kZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TVzNfQ1VTVE9NCiAJYXQzMl9hZGRfZGV2aWNlX3NzYygwLCBBVE1FTF9TU0NfVFgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib290L2ltYWdlcy8uZ2l0aWdub3JlIGIvYXJjaC9hdnIzMi9ib290L2ltYWdlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWE5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2Jvb3QvaW1hZ2VzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACit1SW1hZ2UKK3VJbWFnZS5zcmVjCit2bWxpbnV4LmNzbworc2Zkd2FyZi5sb2cKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYS5vdXQuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYS5vdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2Mzc1YTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hLm91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9BVlIzMl9BX09VVF9ICi0jZGVmaW5lIF9fQVNNX0FWUjMyX0FfT1VUX0gKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0gIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYgLyogX19BU01fQVZSMzJfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRtZWwtbWNpLmgKaW5kZXggYzJlYTZlMS4uNTlmM2ZhZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0bWVsLW1jaS5oCkBAIC0xLDkgKzEsMzkgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfQVRNRUxfTUNJX0gKICNkZWZpbmUgX19BU01fQVZSMzJfQVRNRUxfTUNJX0gKIAotc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIHsKKyNkZWZpbmUgQVRNRUxfTUNJX01BWF9OUl9TTE9UUwkyCisKK3N0cnVjdCBkbWFfc2xhdmU7CisKKy8qKgorICogc3RydWN0IG1jaV9zbG90X3BkYXRhIC0gYm9hcmQtc3BlY2lmaWMgcGVyLXNsb3QgY29uZmlndXJhdGlvbgorICogQGJ1c193aWR0aDogTnVtYmVyIG9mIGRhdGEgbGluZXMgd2lyZWQgdXAgdGhlIHNsb3QKKyAqIEBkZXRlY3RfcGluOiBHUElPIHBpbiB3aXJlZCB0byB0aGUgY2FyZCBkZXRlY3Qgc3dpdGNoCisgKiBAd3BfcGluOiBHUElPIHBpbiB3aXJlZCB0byB0aGUgd3JpdGUgcHJvdGVjdCBzZW5zb3IKKyAqCisgKiBJZiBhIGdpdmVuIHNsb3QgaXMgbm90IHByZXNlbnQgb24gdGhlIGJvYXJkLCBAYnVzX3dpZHRoIHNob3VsZCBiZQorICogc2V0IHRvIDAuIFRoZSBvdGhlciBmaWVsZHMgYXJlIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgorICoKKyAqIEFueSBwaW5zIHRoYXQgYXJlbid0IGF2YWlsYWJsZSBzaG91bGQgYmUgc2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUuCisgKgorICogTm90ZSB0aGF0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNsb3RzIGlzIGV4cGVyaW1lbnRhbCAtLSBzb21lIGNhcmRzCisgKiBtaWdodCBnZXQgdXBzZXQgaWYgd2UgZG9uJ3QgZ2V0IHRoZSBjbG9jayBtYW5hZ2VtZW50IGV4YWN0bHkgcmlnaHQuCisgKiBCdXQgaW4gbW9zdCBjYXNlcywgaXQgc2hvdWxkIHdvcmsganVzdCBmaW5lLgorICovCitzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEgeworCXVuc2lnbmVkIGludAkJYnVzX3dpZHRoOwogCWludAkJCWRldGVjdF9waW47CiAJaW50CQkJd3BfcGluOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgLSBib2FyZC1zcGVjaWZpYyBNTUMvU0RjYXJkIGNvbmZpZ3VyYXRpb24KKyAqIEBkbWFfc2xhdmU6IERNQSBzbGF2ZSBpbnRlcmZhY2UgdG8gdXNlIGluIGRhdGEgdHJhbnNmZXJzLCBvciBOVUxMLgorICogQHNsb3Q6IFBlci1zbG90IGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAqLworc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgZG1hX3NsYXZlCSpkbWFfc2xhdmU7CisJc3RydWN0IG1jaV9zbG90X3BkYXRhCXNsb3RbQVRNRUxfTUNJX01BWF9OUl9TTE9UU107Cit9OworCiAjZW5kaWYgLyogX19BU01fQVZSMzJfQVRNRUxfTUNJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGQ3N2I0OGIuLjhlM2FmMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCisjZGVmaW5lIF9fQklHX0VORElBTgorI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisKICNpZmRlZiBfX0NIRUNLRVJfXwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19idWlsdGluX2Jzd2FwXzMyKHVuc2lnbmVkIGxvbmcgeCk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgX19idWlsdGluX2Jzd2FwXzE2KHVuc2lnbmVkIHNob3J0IHgpOwpAQCAtMTcsMTUgKzIwLDE4IEBACiAgKiB0aGUgcmVzdWx0LgogICovCiAjaWYgIShfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMikKLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19idWlsdGluX2Jzd2FwXzMyKHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fYnVpbHRpbl9ic3dhcF8xNih4KQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgdmFsKQoreworCXJldHVybiBfX2J1aWx0aW5fYnN3YXBfMTYodmFsKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHZhbCkKK3sKKwlyZXR1cm4gX19idWlsdGluX2Jzd2FwXzMyKHZhbCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgotCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CiAjZW5kaWYgLyogX19BU01fQVZSMzJfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDY0Y2U0MGUuLmQ1ZDFkNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMTAzLDYgKzEwMyw2IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYXzMyQklUKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9pby5oCmluZGV4IGE1MjBmNzcuLjIyYzk3ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTE2MCw2ICsxNjAsMTQgQEAKICNkZWZpbmUgcmVhZHdfcmVsYXhlZAkJCXJlYWR3CiAjZGVmaW5lIHJlYWRsX3JlbGF4ZWQJCQlyZWFkbAogCisjZGVmaW5lIHJlYWRiX2JlCQkJX19yYXdfcmVhZGIKKyNkZWZpbmUgcmVhZHdfYmUJCQlfX3Jhd19yZWFkdworI2RlZmluZSByZWFkbF9iZQkJCV9fcmF3X3JlYWRsCisKKyNkZWZpbmUgd3JpdGViX2JlCQkJX19yYXdfd3JpdGViCisjZGVmaW5lIHdyaXRld19iZQkJCV9fcmF3X3dyaXRldworI2RlZmluZSB3cml0ZWxfYmUJCQlfX3Jhd193cml0ZWwKKwogI2RlZmluZSBfX0JVSUxEX01FTU9SWV9TVFJJTkcoYndsLCB0eXBlKQkJCQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzIyNid2wodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLAkJXAogCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvLmdpdGlnbm9yZSBiL2FyY2gvYXZyMzIva2VybmVsLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmNjc2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIva2VybmVsLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordm1saW51eC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGU0Nzk2YzYuLmQ2YTgxOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNCw2ICs0LDggQEAKICAqIHRvIGV4dHJhY3QgYW5kIGZvcm1hdCB0aGUgcmVxdWlyZWQgZGF0YS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgva2J1aWxkLmg+CiAKQEAgLTE3LDQgKzE5LDggQEAKIAlPRkZTRVQoVElfcmFyX3NhdmVkLCB0aHJlYWRfaW5mbywgcmFyX3NhdmVkKTsKIAlPRkZTRVQoVElfcnNyX3NhdmVkLCB0aHJlYWRfaW5mbywgcnNyX3NhdmVkKTsKIAlPRkZTRVQoVElfcmVzdGFydF9ibG9jaywgdGhyZWFkX2luZm8sIHJlc3RhcnRfYmxvY2spOworCUJMQU5LKCk7CisJT0ZGU0VUKFRTS19hY3RpdmVfbW0sIHRhc2tfc3RydWN0LCBhY3RpdmVfbW0pOworCUJMQU5LKCk7CisJT0ZGU0VUKE1NX3BnZCwgbW1fc3RydWN0LCBwZ2QpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYyBiL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKaW5kZXggODRhN2Q0NC4uMTFlMzEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCkBAIC01OCw2ICs1OCw3IEBACiBFWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF96ZXJvX2JpdCk7CiBFWFBPUlRfU1lNQk9MKGZpbmRfZmlyc3RfYml0KTsKIEVYUE9SVF9TWU1CT0woZmluZF9uZXh0X2JpdCk7CitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmluZF9uZXh0X2xlX2JpdCk7CiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmluZF9uZXh0X3plcm9fbGVfYml0KTsKIAogLyogSS9PIHByaW1pdGl2ZXMgKGxpYi9pby0qLlMpICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9lbnRyeS1hdnIzMmIuUyBiL2FyY2gvYXZyMzIva2VybmVsL2VudHJ5LWF2cjMyYi5TCmluZGV4IDJiMzk4Y2EuLjMzZDQ5MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2VudHJ5LWF2cjMyYi5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2VudHJ5LWF2cjMyYi5TCkBAIC0zMzQsOSArMzM0LDY0IEBACiAKIAkvKiBMb3ctbGV2ZWwgZXhjZXB0aW9uIGhhbmRsZXJzICovCiBoYW5kbGVfY3JpdGljYWw6CisJLyoKKwkgKiBBVDMyQVA3MDB4IGVycmF0YToKKwkgKgorCSAqIEFmdGVyIGEgSmF2YSBzdGFjayBvdmVyZmxvdyBvciB1bmRlcmZsb3cgdHJhcCwgYW55IENQVQorCSAqIG1lbW9yeSBhY2Nlc3MgbWF5IGNhdXNlIGVycmF0aWMgYmVoYXZpb3IuIFRoaXMgd2lsbCBoYXBwZW4KKwkgKiB3aGVuIHRoZSBmb3VyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIEpPU1Agc3lzdGVtCisJICogcmVnaXN0ZXIgY29udGFpbnMgYW55IHZhbHVlIGJldHdlZW4gOSBhbmQgMTUgKGluY2x1c2l2ZSkuCisJICoKKwkgKiBQb3NzaWJsZSB3b3JrYXJvdW5kczoKKwkgKiAgIC0gRG9uJ3QgdXNlIHRoZSBKYXZhIEV4dGVuc2lvbiBNb2R1bGUKKwkgKiAgIC0gRW5zdXJlIHRoYXQgdGhlIHN0YWNrIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdHJhcAorCSAqICAgICBoYW5kbGVycyBkbyBub3QgZG8gYW55IG1lbW9yeSBhY2Nlc3Mgb3IgdHJpZ2dlciBhbnkKKwkgKiAgICAgZXhjZXB0aW9ucyBiZWZvcmUgdGhlIG92ZXJmbG93L3VuZGVyZmxvdyBjb25kaXRpb24gaXMKKwkgKiAgICAgY2xlYXJlZCAoYnkgaW5jcmVtZW50aW5nIG9yIGRlY3JlbWVudGluZyB0aGUgSk9TUCkKKwkgKiAgIC0gTWFrZSBzdXJlIHRoYXQgSk9TUCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9ibGVtYXRpYworCSAqICAgICB2YWx1ZSBiZWZvcmUgZG9pbmcgYW55IGV4Y2VwdGlvbiBvciBpbnRlcnJ1cHQKKwkgKiAgICAgcHJvY2Vzc2luZy4KKwkgKiAgIC0gU2V0IHVwIGEgY3JpdGljYWwgZXhjZXB0aW9uIGhhbmRsZXIgd2hpY2ggd3JpdGVzIGEKKwkgKiAgICAga25vd24tdG8tYmUtc2FmZSB2YWx1ZSwgZS5nLiA0LCB0byBKT1NQIGJlZm9yZSBkb2luZworCSAqICAgICBhbnkgZnVydGhlciBwcm9jZXNzaW5nLgorCSAqCisJICogV2UnbGwgdXNlIHRoZSBsYXN0IHdvcmthcm91bmQgZm9yIG5vdyBzaW5jZSB3ZSBjYW5ub3QKKwkgKiBndWFyYW50ZWUgdGhhdCB1c2VyIHNwYWNlIHByb2Nlc3NlcyBkb24ndCB1c2UgSmF2YSBtb2RlLgorCSAqIE5vbi13ZWxsLWJlaGF2aW5nIHVzZXJsYW5kIHdpbGwgYmUgdGVybWluYXRlZCB3aXRoIGV4dHJlbWUKKwkgKiBwcmVqdWRpY2UuCisJICovCisjaWZkZWYgQ09ORklHX0NQVV9BVDMyQVA3MDBYCisJLyoKKwkgKiBUaGVyZSdzIGEgY2hhbmNlIHdlIGNhbid0IHRvdWNoIG1lbW9yeSwgc28gdGVtcG9yYXJpbHkKKwkgKiBib3Jyb3cgUFRCUiB0byBzYXZlIHRoZSBzdGFjayBwb2ludGVyIHdoaWxlIHdlIGZpeCB0aGluZ3MKKwkgKiB1cC4uLgorCSAqLworCW10c3IJU1lTUkVHX1BUQlIsIHNwCisJbW92CXNwLCA0CisJbXRzcglTWVNSRUdfSk9TUCwgc3AKKwltZnNyCXNwLCBTWVNSRUdfUFRCUgorCXN1YglwYywgLTIKKworCS8qIFB1c2ggbW9zdCBvZiBwdF9yZWdzIG9uIHN0YWNrLiBXZSdsbCBkbyB0aGUgcmVzdCBsYXRlciAqLwogCXN1YglzcCwgNAotCXN0bXRzCS0tc3AsIHIwLWxyCi0JcmNhbGwJc2F2ZV9mdWxsX2NvbnRleHRfZXgKKwlwdXNobQlyMC1yMTIKKworCS8qIFBUQlIgbWlycm9ycyBjdXJyZW50X3RocmVhZF9pbmZvKCktPnRhc2stPmFjdGl2ZV9tbS0+cGdkICovCisJZ2V0X3RocmVhZF9pbmZvIHIwCisJbGQudwlyMSwgcjBbVElfdGFza10KKwlsZC53CXIyLCByMVtUU0tfYWN0aXZlX21tXQorCWxkLncJcjMsIHIyW01NX3BnZF0KKwltdHNyCVNZU1JFR19QVEJSLCByMworI2Vsc2UKKwlzdWIJc3AsIDQKKwlwdXNobQlyMC1yMTIKKyNlbmRpZgorCXN1YglyMCwgc3AsIC0oMTQgKiA0KQorCW1vdglyMSwgbHIKKwltZnNyCXIyLCBTWVNSRUdfUkFSX0VYCisJbWZzcglyMywgU1lTUkVHX1JTUl9FWAorCXB1c2htCXIwLXIzCisKIAltZnNyCXIxMiwgU1lTUkVHX0VDUgogCW1vdglyMTEsIHNwCiAJcmNhbGwJZG9fY3JpdGljYWxfZXhjZXB0aW9uCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMmMwOGFjOS4uMTM0ZDUzMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CkBAIC0yMCw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL3BtLmg+CiAKLXZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gTlVMTDsKK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKaW5kZXggZDhlNjIzYy4uNWM3MDgzOSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCkBAIC0yODMsNiArMjgzLDI1IEBACiB9CiBlYXJseV9wYXJhbSgiZmJtZW0iLCBlYXJseV9wYXJzZV9mYm1lbSk7CiAKKy8qCisgKiBQaWNrIG91dCB0aGUgbWVtb3J5IHNpemUuICBXZSBsb29rIGZvciBtZW09c2l6ZUBzdGFydCwKKyAqIHdoZXJlIHN0YXJ0IGFuZCBzaXplIGFyZSAic2l6ZVtLa01tR2ddIgorICovCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9tZW0oY2hhciAqcCkKK3sKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZSwgc3RhcnQ7CisKKwlzdGFydCA9IHN5c3RlbV9yYW0tPnN0YXJ0OworCXNpemUgID0gbWVtcGFyc2UocCwgJnApOworCWlmICgqcCA9PSAnQCcpCisJCXN0YXJ0ID0gbWVtcGFyc2UocCArIDEsICZwKTsKKworCXN5c3RlbV9yYW0tPnN0YXJ0ID0gc3RhcnQ7CisJc3lzdGVtX3JhbS0+ZW5kID0gc3lzdGVtX3JhbS0+c3RhcnQgKyBzaXplIC0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9tZW0pOworCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfY29yZShzdHJ1Y3QgdGFnICp0YWcpCiB7CiAJaWYgKHRhZy0+aGRyLnNpemUgPiAyKSB7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMKaW5kZXggODkwMjg2YS4uNjczMTc4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbC1zdHVicy5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUwpAQCAtMTA5LDMgKzEwOSwxMiBAQAogCXJjYWxsCXN5c19lcG9sbF9wd2FpdAogCXN1YglzcCwgLTQKIAlwb3BtCXBjCisKKwkuZ2xvYmFsIF9fc3lzX3N5bmNfZmlsZV9yYW5nZQorCS50eXBlCV9fc3lzX3N5bmNfZmlsZV9yYW5nZSxAZnVuY3Rpb24KK19fc3lzX3N5bmNfZmlsZV9yYW5nZToKKwlwdXNobQlscgorCXN0LncJLS1zcCwgQVJHNgorCXJjYWxsCXN5c19zeW5jX2ZpbGVfcmFuZ2UKKwlzdWIJc3AsIC00CisJcG9wbQlwYwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDQ3OGJkYTQuLjdlZTAwNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTI3NSw3ICsyNzUsNyBAQAogCS5sb25nCXN5c19zZXRfcm9idXN0X2xpc3QKIAkubG9uZwlzeXNfZ2V0X3JvYnVzdF9saXN0CS8qIDI2MCAqLwogCS5sb25nCV9fc3lzX3NwbGljZQotCS5sb25nCXN5c19zeW5jX2ZpbGVfcmFuZ2UKKwkubG9uZwlfX3N5c19zeW5jX2ZpbGVfcmFuZ2UKIAkubG9uZwlzeXNfdGVlCiAJLmxvbmcJc3lzX3Ztc3BsaWNlCiAJLmxvbmcJX19zeXNfZXBvbGxfcHdhaXQJLyogMjY1ICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCBiODM1YzRjLi4wZDk4NzM3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTExNiwxNSArMTE2LDE1IEBACiAJc3dpdGNoIChyZXQpIHsKIAljYXNlIE5PVElGWV9PSzoKIAljYXNlIE5PVElGWV9TVE9QOgotCQlyZXR1cm47CisJCWJyZWFrOwogCWNhc2UgTk9USUZZX0JBRDoKIAkJZGllKCJGYXRhbCBOb24tTWFza2FibGUgSW50ZXJydXB0IiwgcmVncywgU0lHSU5UKTsKIAlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9BTEVSVCAiR290IE5NSSwgYnV0IG5vYm9keSBjYXJlZC4gRGlzYWJsaW5nLi4uXG4iKTsKKwkJbm1pX2Rpc2FibGUoKTsKIAkJYnJlYWs7CiAJfQotCi0JcHJpbnRrKEtFUk5fQUxFUlQgIkdvdCBOTUksIGJ1dCBub2JvZHkgY2FyZWQuIERpc2FibGluZy4uLlxuIik7Ci0Jbm1pX2Rpc2FibGUoKTsKKwlubWlfZXhpdCgpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fY3JpdGljYWxfZXhjZXB0aW9uKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2ZpbmRiaXQuUyBiL2FyY2gvYXZyMzIvbGliL2ZpbmRiaXQuUwppbmRleCBjNmI5MWRlLi45OTdiMzNiIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2xpYi9maW5kYml0LlMKKysrIGIvYXJjaC9hdnIzMi9saWIvZmluZGJpdC5TCkBAIC0xMjMsNiArMTIzLDM2IEBACiAJYnJndAkxYgogCXJldGFsCXIxMQogCitFTlRSWShnZW5lcmljX2ZpbmRfbmV4dF9sZV9iaXQpCisJbHNyCXI4LCByMTAsIDUKKwlzdWIJcjksIHIxMSwgcjEwCisJcmV0bGUJcjExCisKKwlsc2wJcjgsIDIKKwlhZGQJcjEyLCByOAorCWFuZGwJcjEwLCAzMSwgQ09ICisJYnJlcQkxZgorCisJLyogb2Zmc2V0IGlzIG5vdCB3b3JkLWFsaWduZWQuIEhhbmRsZSB0aGUgZmlyc3QgKDMyIC0gcjEwKSBiaXRzICovCisJbGRzd3AudwlyOCwgcjEyWzBdCisJc3ViCXIxMiwgLTQKKwlsc3IJcjgsIHI4LCByMTAKKwlicm5lCS5MX2ZvdW5kCisKKwkvKiByOSA9IHI5IC0gKDMyIC0gcjEwKSA9IHI5ICsgcjEwIC0gMzIgKi8KKwlhZGQJcjksIHIxMAorCXN1YglyOSwgMzIKKwlyZXRsZQlyMTEKKworCS8qIE1haW4gbG9vcC4gb2Zmc2V0IG11c3QgYmUgd29yZC1hbGlnbmVkICovCisxOglsZHN3cC53CXI4LCByMTJbMF0KKwljcC53CXI4LCAwCisJYnJuZQkuTF9mb3VuZAorCXN1YglyMTIsIC00CisJc3ViCXI5LCAzMgorCWJyZ3QJMWIKKwlyZXRhbAlyMTEKKwogRU5UUlkoZ2VuZXJpY19maW5kX25leHRfemVyb19sZV9iaXQpCiAJbHNyCXI4LCByMTAsIDUKIAlzdWIJcjksIHIxMSwgcjEwCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCmluZGV4IGUwMWRiZTQuLjgxM2I2ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCkBAIC04Miw4ICs4Miw5IEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKF9uYW1lIyNfaWQjI19yZXNvdXJjZSksCVwKIH0KIAotI2RlZmluZSBzZWxlY3RfcGVyaXBoZXJhbChwaW4sIHBlcmlwaCwgZmxhZ3MpCQkJXAotCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJTl8jI3BpbiwgR1BJT18jI3BlcmlwaCwgZmxhZ3MpCisjZGVmaW5lIHNlbGVjdF9wZXJpcGhlcmFsKHBvcnQsIHBpbl9tYXNrLCBwZXJpcGgsIGZsYWdzKQlcCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fIyNwb3J0IyNfQkFTRSwgcGluX21hc2ssCVwKKwkJCSAgIEdQSU9fIyNwZXJpcGgsIGZsYWdzKQogCiAjZGVmaW5lIERFVl9DTEsoX25hbWUsIGRldm5hbWUsIGJ1cywgX2luZGV4KQkJCVwKIHN0YXRpYyBzdHJ1Y3QgY2xrIGRldm5hbWUjI18jI19uYW1lID0gewkJCQlcCkBAIC04NzEsNiArODcyLDcgQEAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBhdDMyX2FkZF9kZXZpY2VfcHNpZih1bnNpZ25lZCBpbnQgaWQpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1MzIgcGluX21hc2s7CiAKIAlpZiAoIShpZCA9PSAwIHx8IGlkID09IDEpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTg4MSwyMCArODgzLDIyIEBACiAKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSAwOgorCQlwaW5fbWFzayAgPSAoMSA8PCA4KSB8ICgxIDw8IDkpOyAvKiBDTE9DSyAmIERBVEEgKi8KKwogCQlpZiAocGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgYXRtZWxfcHNpZjBfcmVzb3VyY2UsCiAJCQkJCUFSUkFZX1NJWkUoYXRtZWxfcHNpZjBfcmVzb3VyY2UpKSkKIAkJCWdvdG8gZXJyX2FkZF9yZXNvdXJjZXM7CiAJCWF0bWVsX3BzaWYwX3BjbGsuZGV2ID0gJnBkZXYtPmRldjsKLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoOCksIFBFUklQSF9BLCAwKTsgLyogQ0xPQ0sgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoOSksIFBFUklQSF9BLCAwKTsgLyogREFUQSAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUElPQSwgcGluX21hc2ssIFBFUklQSF9BLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSAxOgorCQlwaW5fbWFzayAgPSAoMSA8PCAxMSkgfCAoMSA8PCAxMik7IC8qIENMT0NLICYgREFUQSAqLworCiAJCWlmIChwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCBhdG1lbF9wc2lmMV9yZXNvdXJjZSwKIAkJCQkJQVJSQVlfU0laRShhdG1lbF9wc2lmMV9yZXNvdXJjZSkpKQogCQkJZ290byBlcnJfYWRkX3Jlc291cmNlczsKIAkJYXRtZWxfcHNpZjFfcGNsay5kZXYgPSAmcGRldi0+ZGV2OwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQigxMSksIFBFUklQSF9BLCAwKTsgLyogQ0xPQ0sgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTIpLCBQRVJJUEhfQSwgMCk7IC8qIERBVEEgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0IsIHBpbl9tYXNrLCBQRVJJUEhfQSwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwpAQCAtOTU4LDI2ICs5NjIsMzAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDBfcGlucyh2b2lkKQogewotCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDgpLCAgUEVSSVBIX0IsIDApOwkvKiBSWEQJKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQSg5KSwgIFBFUklQSF9CLCAwKTsJLyogVFhECSovCisJdTMyIHBpbl9tYXNrID0gKDEgPDwgOCkgfCAoMSA8PCA5KTsgLyogUlhEICYgVFhEICovCisKKwlzZWxlY3RfcGVyaXBoZXJhbChQSU9BLCBwaW5fbWFzaywgUEVSSVBIX0IsIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0MV9waW5zKHZvaWQpCiB7Ci0Jc2VsZWN0X3BlcmlwaGVyYWwoUEEoMTcpLCBQRVJJUEhfQSwgMCk7CS8qIFJYRAkqLwotCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDE4KSwgUEVSSVBIX0EsIDApOwkvKiBUWEQJKi8KKwl1MzIgcGluX21hc2sgPSAoMSA8PCAxNykgfCAoMSA8PCAxOCk7IC8qIFJYRCAmIFRYRCAqLworCisJc2VsZWN0X3BlcmlwaGVyYWwoUElPQSwgcGluX21hc2ssIFBFUklQSF9BLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDJfcGlucyh2b2lkKQogewotCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDI2KSwgUEVSSVBIX0IsIDApOwkvKiBSWEQJKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQigyNyksIFBFUklQSF9CLCAwKTsJLyogVFhECSovCisJdTMyIHBpbl9tYXNrID0gKDEgPDwgMjYpIHwgKDEgPDwgMjcpOyAvKiBSWEQgJiBUWEQgKi8KKworCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0IsIHBpbl9tYXNrLCBQRVJJUEhfQiwgMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQzX3BpbnModm9pZCkKIHsKLQlzZWxlY3RfcGVyaXBoZXJhbChQQigxOCksIFBFUklQSF9CLCAwKTsJLyogUlhECSovCi0Jc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTcpLCBQRVJJUEhfQiwgMCk7CS8qIFRYRAkqLworCXUzMiBwaW5fbWFzayA9ICgxIDw8IDE4KSB8ICgxIDw8IDE3KTsgLyogUlhEICYgVFhEICovCisKKwlzZWxlY3RfcGVyaXBoZXJhbChQSU9CLCBwaW5fbWFzaywgUEVSSVBIX0IsIDApOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0ZGF0YSBhdDMyX3VzYXJ0c1s0XTsKQEAgLTEwNTcsNTkgKzEwNjUsNjkgQEAKIGF0MzJfYWRkX2RldmljZV9ldGgodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1MzIgcGluX21hc2s7CiAKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSAwOgogCQlwZGV2ID0gJm1hY2IwX2RldmljZTsKIAotCQlzZWxlY3RfcGVyaXBoZXJhbChQQygzKSwgIFBFUklQSF9BLCAwKTsJLyogVFhEMAkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg0KSwgIFBFUklQSF9BLCAwKTsJLyogVFhEMQkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg3KSwgIFBFUklQSF9BLCAwKTsJLyogVFhFTgkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg4KSwgIFBFUklQSF9BLCAwKTsJLyogVFhDSyAqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg5KSwgIFBFUklQSF9BLCAwKTsJLyogUlhEMAkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMCksIFBFUklQSF9BLCAwKTsJLyogUlhEMQkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMyksIFBFUklQSF9BLCAwKTsJLyogUlhFUgkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxNSksIFBFUklQSF9BLCAwKTsJLyogUlhEVgkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxNiksIFBFUklQSF9BLCAwKTsJLyogTURDCSovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE3KSwgUEVSSVBIX0EsIDApOwkvKiBNRElPCSovCisJCXBpbl9tYXNrICA9ICgxIDw8IDMpOwkvKiBUWEQwICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDQpOwkvKiBUWEQxICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDcpOwkvKiBUWEVOICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDgpOwkvKiBUWENLICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDkpOwkvKiBSWEQwICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDEwKTsJLyogUlhEMSAqLworCQlwaW5fbWFzayB8PSAoMSA8PCAxMyk7CS8qIFJYRVIgKi8KKwkJcGluX21hc2sgfD0gKDEgPDwgMTUpOwkvKiBSWERWICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDE2KTsJLyogTURDICAqLworCQlwaW5fbWFzayB8PSAoMSA8PCAxNyk7CS8qIE1ESU8gKi8KIAogCQlpZiAoIWRhdGEtPmlzX3JtaWkpIHsKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDApLCAgUEVSSVBIX0EsIDApOwkvKiBDT0wJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDEpLCAgUEVSSVBIX0EsIDApOwkvKiBDUlMJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDIpLCAgUEVSSVBIX0EsIDApOwkvKiBUWEVSCSovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg1KSwgIFBFUklQSF9BLCAwKTsJLyogVFhEMgkqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoNiksICBQRVJJUEhfQSwgMCk7CS8qIFRYRDMgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDExKSwgUEVSSVBIX0EsIDApOwkvKiBSWEQyCSovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMiksIFBFUklQSF9BLCAwKTsJLyogUlhEMwkqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMTQpLCBQRVJJUEhfQSwgMCk7CS8qIFJYQ0sJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE4KSwgUEVSSVBIX0EsIDApOwkvKiBTUEQJKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDApOwkvKiBDT0wgICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAxKTsJLyogQ1JTICAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMik7CS8qIFRYRVIgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDUpOwkvKiBUWEQyICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCA2KTsJLyogVFhEMyAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMTEpOwkvKiBSWEQyICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAxMik7CS8qIFJYRDMgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDE0KTsJLyogUlhDSyAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMTgpOwkvKiBTUEQgICovCiAJCX0KKworCQlzZWxlY3RfcGVyaXBoZXJhbChQSU9DLCBwaW5fbWFzaywgUEVSSVBIX0EsIDApOworCiAJCWJyZWFrOwogCiAJY2FzZSAxOgogCQlwZGV2ID0gJm1hY2IxX2RldmljZTsKIAotCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxMyksIFBFUklQSF9CLCAwKTsJCS8qIFRYRDAJKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTQpLCBQRVJJUEhfQiwgMCk7CQkvKiBUWEQxCSovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDExKSwgUEVSSVBIX0IsIDApOwkJLyogVFhFTgkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxMiksIFBFUklQSF9CLCAwKTsJCS8qIFRYQ0sgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTApLCBQRVJJUEhfQiwgMCk7CQkvKiBSWEQwCSovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDYpLCAgUEVSSVBIX0IsIDApOwkJLyogUlhEMQkqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg1KSwgIFBFUklQSF9CLCAwKTsJCS8qIFJYRVIJKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoNCksICBQRVJJUEhfQiwgMCk7CQkvKiBSWERWCSovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDMpLCAgUEVSSVBIX0IsIDApOwkJLyogTURDCSovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDIpLCAgUEVSSVBIX0IsIDApOwkJLyogTURJTwkqLworCQlwaW5fbWFzayAgPSAoMSA8PCAxMyk7CS8qIFRYRDAgKi8KKwkJcGluX21hc2sgfD0gKDEgPDwgMTQpOwkvKiBUWEQxICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDExKTsJLyogVFhFTiAqLworCQlwaW5fbWFzayB8PSAoMSA8PCAxMik7CS8qIFRYQ0sgKi8KKwkJcGluX21hc2sgfD0gKDEgPDwgMTApOwkvKiBSWEQwICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDYpOwkvKiBSWEQxICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDUpOwkvKiBSWEVSICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDQpOwkvKiBSWERWICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDMpOwkvKiBNREMgICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDIpOwkvKiBNRElPICovCisKKwkJaWYgKCFkYXRhLT5pc19ybWlpKQorCQkJcGluX21hc2sgfD0gKDEgPDwgMTUpOwkvKiBTUEQgICovCisKKwkJc2VsZWN0X3BlcmlwaGVyYWwoUElPRCwgcGluX21hc2ssIFBFUklQSF9CLCAwKTsKIAogCQlpZiAoIWRhdGEtPmlzX3JtaWkpIHsKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE5KSwgUEVSSVBIX0IsIDApOwkvKiBDT0wJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDIzKSwgUEVSSVBIX0IsIDApOwkvKiBDUlMJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI2KSwgUEVSSVBIX0IsIDApOwkvKiBUWEVSCSovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyNyksIFBFUklQSF9CLCAwKTsJLyogVFhEMgkqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjgpLCBQRVJJUEhfQiwgMCk7CS8qIFRYRDMgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI5KSwgUEVSSVBIX0IsIDApOwkvKiBSWEQyCSovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygzMCksIFBFUklQSF9CLCAwKTsJLyogUlhEMwkqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjQpLCBQRVJJUEhfQiwgMCk7CS8qIFJYQ0sJKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE1KSwgUEVSSVBIX0IsIDApOwkvKiBTUEQJKi8KKwkJCXBpbl9tYXNrICA9ICgxIDw8IDE5KTsJLyogQ09MICAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMjMpOwkvKiBDUlMgICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAyNik7CS8qIFRYRVIgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDI3KTsJLyogVFhEMiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMjgpOwkvKiBUWEQzICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAyOSk7CS8qIFJYRDIgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDMwKTsJLyogUlhEMyAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMjQpOwkvKiBSWENLICovCisKKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0MsIHBpbl9tYXNrLCBQRVJJUEhfQiwgMCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTExNzcsMjMgKzExOTUsMjggQEAKIAkJeyBHUElPX1BJTl9QQigyKSwgR1BJT19QSU5fUEIoMyksCiAJCSAgR1BJT19QSU5fUEIoNCksIEdQSU9fUElOX1BBKDI3KSwgfTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXUzMiBwaW5fbWFzazsKIAogCXN3aXRjaCAoaWQpIHsKIAljYXNlIDA6CiAJCXBkZXYgPSAmYXRtZWxfc3BpMF9kZXZpY2U7CisJCXBpbl9tYXNrICA9ICgxIDw8IDEpIHwgKDEgPDwgMik7CS8qIE1PU0kgJiBTQ0sgKi8KKwogCQkvKiBwdWxsdXAgTUlTTyBzbyBhIGxldmVsIGlzIGFsd2F5cyBkZWZpbmVkICovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDApLCAgUEVSSVBIX0EsIEFUMzJfR1BJT0ZfUFVMTFVQKTsKLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMSksICBQRVJJUEhfQSwgMCk7CS8qIE1PU0kJICovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDIpLCAgUEVSSVBIX0EsIDApOwkvKiBTQ0sJICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0EsICgxIDw8IDApLCBQRVJJUEhfQSwgQVQzMl9HUElPRl9QVUxMVVApOworCQlzZWxlY3RfcGVyaXBoZXJhbChQSU9BLCBwaW5fbWFzaywgUEVSSVBIX0EsIDApOworCiAJCWF0MzJfc3BpX3NldHVwX3NsYXZlcygwLCBiLCBuLCBzcGkwX3BpbnMpOwogCQlicmVhazsKIAogCWNhc2UgMToKIAkJcGRldiA9ICZhdG1lbF9zcGkxX2RldmljZTsKKwkJcGluX21hc2sgID0gKDEgPDwgMSkgfCAoMSA8PCA1KTsJLyogTU9TSSAqLworCiAJCS8qIHB1bGx1cCBNSVNPIHNvIGEgbGV2ZWwgaXMgYWx3YXlzIGRlZmluZWQgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMCksICBQRVJJUEhfQiwgQVQzMl9HUElPRl9QVUxMVVApOwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQigxKSwgIFBFUklQSF9CLCAwKTsJLyogTU9TSSAgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoNSksICBQRVJJUEhfQiwgMCk7CS8qIFNDSyAgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0IsICgxIDw8IDApLCBQRVJJUEhfQiwgQVQzMl9HUElPRl9QVUxMVVApOworCQlzZWxlY3RfcGVyaXBoZXJhbChQSU9CLCBwaW5fbWFzaywgUEVSSVBIX0IsIDApOworCiAJCWF0MzJfc3BpX3NldHVwX3NsYXZlcygxLCBiLCBuLCBzcGkxX3BpbnMpOwogCQlicmVhazsKIApAQCAtMTIyNiw2ICsxMjQ5LDcgQEAKIAkJCQkJCSAgICB1bnNpZ25lZCBpbnQgbikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXUzMiBwaW5fbWFzazsKIAogCWlmIChpZCAhPSAwKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEyMzgsOCArMTI2Miw5IEBACiAJCQkJQVJSQVlfU0laRShhdG1lbF90d2kwX3Jlc291cmNlKSkpCiAJCWdvdG8gZXJyX2FkZF9yZXNvdXJjZXM7CiAKLQlzZWxlY3RfcGVyaXBoZXJhbChQQSg2KSwgIFBFUklQSF9BLCAwKTsJLyogU0RBCSovCi0Jc2VsZWN0X3BlcmlwaGVyYWwoUEEoNyksICBQRVJJUEhfQSwgMCk7CS8qIFNETAkqLworCXBpbl9tYXNrICA9ICgxIDw8IDYpIHwgKDEgPDwgNyk7CS8qIFNEQSAmIFNETCAqLworCisJc2VsZWN0X3BlcmlwaGVyYWwoUElPQSwgcGluX21hc2ssIFBFUklQSF9BLCAwKTsKIAogCWF0bWVsX3R3aTBfcGNsay5kZXYgPSAmcGRldi0+ZGV2OwogCkBAIC0xMjcyLDEwICsxMjk3LDE2IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQKIGF0MzJfYWRkX2RldmljZV9tY2kodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhCV9kYXRhOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworCXN0cnVjdCBkd19kbWFfc2xhdmUJCSpkd3M7CisJdTMyCQkJCXBpb2FfbWFzazsKKwl1MzIJCQkJcGlvYl9tYXNrOwogCi0JaWYgKGlkICE9IDApCisJaWYgKGlkICE9IDAgfHwgIWRhdGEpCisJCXJldHVybiBOVUxMOworCisJLyogTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB1c2FibGUgc2xvdCAqLworCWlmICghZGF0YS0+c2xvdFswXS5idXNfd2lkdGggJiYgIWRhdGEtPnNsb3RbMV0uYnVzX3dpZHRoKQogCQlyZXR1cm4gTlVMTDsKIAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImF0bWVsX21jaSIsIGlkKTsKQEAgLTEyODYsMjggKzEzMTcsODAgQEAKIAkJCQlBUlJBWV9TSVpFKGF0bWVsX21jaTBfcmVzb3VyY2UpKSkKIAkJZ290byBmYWlsOwogCi0JaWYgKCFkYXRhKSB7Ci0JCWRhdGEgPSAmX2RhdGE7Ci0JCW1lbXNldChkYXRhLCAtMSwgc2l6ZW9mKHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSkpOwotCQlkYXRhLT5kZXRlY3RfcGluID0gR1BJT19QSU5fTk9ORTsKLQkJZGF0YS0+d3BfcGluID0gR1BJT19QSU5fTk9ORTsKLQl9CisJaWYgKGRhdGEtPmRtYV9zbGF2ZSkKKwkJZHdzID0ga21lbWR1cCh0b19kd19kbWFfc2xhdmUoZGF0YS0+ZG1hX3NsYXZlKSwKKwkJCQlzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSksIEdGUF9LRVJORUwpOworCWVsc2UKKwkJZHdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSksIEdGUF9LRVJORUwpOworCisJZHdzLT5zbGF2ZS5kZXYgPSAmcGRldi0+ZGV2OworCWR3cy0+c2xhdmUuZG1hX2RldiA9ICZkd19kbWFjMF9kZXZpY2UuZGV2OworCWR3cy0+c2xhdmUucmVnX3dpZHRoID0gRE1BX1NMQVZFX1dJRFRIXzMyQklUOworCWR3cy0+Y2ZnX2hpID0gKERXQ19DRkdIX1NSQ19QRVIoMCkKKwkJCQl8IERXQ19DRkdIX0RTVF9QRVIoMSkpOworCWR3cy0+Y2ZnX2xvICY9IH4oRFdDX0NGR0xfSFNfRFNUX1BPTAorCQkJCXwgRFdDX0NGR0xfSFNfU1JDX1BPTCk7CisKKwlkYXRhLT5kbWFfc2xhdmUgPSAmZHdzLT5zbGF2ZTsKIAogCWlmIChwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgZGF0YSwKIAkJCQlzaXplb2Yoc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhKSkpCiAJCWdvdG8gZmFpbDsKIAotCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDEwKSwgUEVSSVBIX0EsIDApOwkvKiBDTEsJICovCi0Jc2VsZWN0X3BlcmlwaGVyYWwoUEEoMTEpLCBQRVJJUEhfQSwgMCk7CS8qIENNRAkgKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxMiksIFBFUklQSF9BLCAwKTsJLyogREFUQTAgKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxMyksIFBFUklQSF9BLCAwKTsJLyogREFUQTEgKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxNCksIFBFUklQSF9BLCAwKTsJLyogREFUQTIgKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxNSksIFBFUklQSF9BLCAwKTsJLyogREFUQTMgKi8KKwkvKiBDTEsgbGluZSBpcyBjb21tb24gdG8gYm90aCBzbG90cyAqLworCXBpb2FfbWFzayA9IDEgPDwgMTA7CiAKLQlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT5kZXRlY3RfcGluKSkKLQkJYXQzMl9zZWxlY3RfZ3BpbyhkYXRhLT5kZXRlY3RfcGluLCAwKTsKLQlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT53cF9waW4pKQotCQlhdDMyX3NlbGVjdF9ncGlvKGRhdGEtPndwX3BpbiwgMCk7CisJc3dpdGNoIChkYXRhLT5zbG90WzBdLmJ1c193aWR0aCkgeworCWNhc2UgNDoKKwkJcGlvYV9tYXNrIHw9IDEgPDwgMTM7CQkvKiBEQVRBMSAqLworCQlwaW9hX21hc2sgfD0gMSA8PCAxNDsJCS8qIERBVEEyICovCisJCXBpb2FfbWFzayB8PSAxIDw8IDE1OwkJLyogREFUQTMgKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlwaW9hX21hc2sgfD0gMSA8PCAxMTsJCS8qIENNRAkgKi8KKwkJcGlvYV9tYXNrIHw9IDEgPDwgMTI7CQkvKiBEQVRBMCAqLworCisJCWlmIChncGlvX2lzX3ZhbGlkKGRhdGEtPnNsb3RbMF0uZGV0ZWN0X3BpbikpCisJCQlhdDMyX3NlbGVjdF9ncGlvKGRhdGEtPnNsb3RbMF0uZGV0ZWN0X3BpbiwgMCk7CisJCWlmIChncGlvX2lzX3ZhbGlkKGRhdGEtPnNsb3RbMF0ud3BfcGluKSkKKwkJCWF0MzJfc2VsZWN0X2dwaW8oZGF0YS0+c2xvdFswXS53cF9waW4sIDApOworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIFNsb3QgaXMgdW51c2VkICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzZWxlY3RfcGVyaXBoZXJhbChQSU9BLCBwaW9hX21hc2ssIFBFUklQSF9BLCAwKTsKKwlwaW9iX21hc2sgPSAwOworCisJc3dpdGNoIChkYXRhLT5zbG90WzFdLmJ1c193aWR0aCkgeworCWNhc2UgNDoKKwkJcGlvYl9tYXNrIHw9IDEgPDwgIDg7CQkvKiBEQVRBMSAqLworCQlwaW9iX21hc2sgfD0gMSA8PCAgOTsJCS8qIERBVEEyICovCisJCXBpb2JfbWFzayB8PSAxIDw8IDEwOwkJLyogREFUQTMgKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlwaW9iX21hc2sgfD0gMSA8PCAgNjsJCS8qIENNRAkgKi8KKwkJcGlvYl9tYXNrIHw9IDEgPDwgIDc7CQkvKiBEQVRBMCAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQSU9CLCBwaW9iX21hc2ssIFBFUklQSF9CLCAwKTsKKworCQlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT5zbG90WzFdLmRldGVjdF9waW4pKQorCQkJYXQzMl9zZWxlY3RfZ3BpbyhkYXRhLT5zbG90WzFdLmRldGVjdF9waW4sIDApOworCQlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT5zbG90WzFdLndwX3BpbikpCisJCQlhdDMyX3NlbGVjdF9ncGlvKGRhdGEtPnNsb3RbMV0ud3BfcGluLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQkvKiBTbG90IGlzIHVudXNlZCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoIWRhdGEtPnNsb3RbMF0uYnVzX3dpZHRoKQorCQkJZ290byBmYWlsOworCisJCWRhdGEtPnNsb3RbMV0uYnVzX3dpZHRoID0gMDsKKwkJYnJlYWs7CisJfQogCiAJYXRtZWxfbWNpMF9wY2xrLmRldiA9ICZwZGV2LT5kZXY7CiAKQEAgLTEzNTMsMTMgKzE0MzYsMTQgQEAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdAogYXQzMl9hZGRfZGV2aWNlX2xjZGModW5zaWduZWQgaW50IGlkLCBzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqZGF0YSwKIAkJICAgICB1bnNpZ25lZCBsb25nIGZibWVtX3N0YXJ0LCB1bnNpZ25lZCBsb25nIGZibWVtX2xlbiwKLQkJICAgICB1bnNpZ25lZCBpbnQgcGluX2NvbmZpZykKKwkJICAgICB1NjQgcGluX21hc2spCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZmJfbW9uc3BlY3MgKm1vbnNwZWNzOwogCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGVkYjsKIAl1bnNpZ25lZCBpbnQgbW9kZWRiX3NpemU7CisJdTMyIHBvcnRjX21hc2ssIHBvcnRkX21hc2ssIHBvcnRlX21hc2s7CiAKIAkvKgogCSAqIERvIGEgZGVlcCBjb3B5IG9mIHRoZSBmYiBkYXRhLCBtb25zcGVjcyBhbmQgbW9kZWRiLiBNYWtlCkBAIC0xMzgxLDc2ICsxNDY1LDIxIEBACiAJY2FzZSAwOgogCQlwZGV2ID0gJmF0bWVsX2xjZGZiMF9kZXZpY2U7CiAKLQkJc3dpdGNoIChwaW5fY29uZmlnKSB7Ci0JCWNhc2UgMDoKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE5KSwgUEVSSVBIX0EsIDApOwkvKiBDQwkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMCksIFBFUklQSF9BLCAwKTsJLyogSFNZTkMgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMSksIFBFUklQSF9BLCAwKTsJLyogUENMSwkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMiksIFBFUklQSF9BLCAwKTsJLyogVlNZTkMgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMyksIFBFUklQSF9BLCAwKTsJLyogRFZBTAkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyNCksIFBFUklQSF9BLCAwKTsJLyogTU9ERQkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyNSksIFBFUklQSF9BLCAwKTsJLyogUFdSCSAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI2KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMCAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI3KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMSAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI4KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMiAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI5KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMyAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDMwKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBNCAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDMxKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBNSAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDApLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBNiAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBNyAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDIpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBOCAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDMpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBOSAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDQpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDUpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTEgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDYpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTIgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDcpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTMgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDgpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTQgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDkpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTUgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEwKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTYgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDExKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTcgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEyKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTggKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEzKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTkgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE0KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMjAgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE1KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMjEgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE2KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMjIgKi8KLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE3KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMjMgKi8KLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgwKSwgIFBFUklQSF9CLCAwKTsJLyogQ0MJICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjApLCBQRVJJUEhfQSwgMCk7CS8qIEhTWU5DICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjEpLCBQRVJJUEhfQSwgMCk7CS8qIFBDTEsJICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjIpLCBQRVJJUEhfQSwgMCk7CS8qIFZTWU5DICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEUoMSksICBQRVJJUEhfQiwgMCk7CS8qIERWQUwJICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEUoMiksICBQRVJJUEhfQiwgMCk7CS8qIE1PREUJICAqLwotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjUpLCBQRVJJUEhfQSwgMCk7CS8qIFBXUgkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgzKSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTAgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg0KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTEgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg1KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTIgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg2KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTMgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg3KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTQgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQygzMSksIFBFUklQSF9BLCAwKTsJLyogREFUQTUgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgwKSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTYgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxKSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTcgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg4KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTggICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSg5KSwgIFBFUklQSF9CLCAwKTsJLyogREFUQTkgICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxMCksIFBFUklQSF9CLCAwKTsJLyogREFUQTEwICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxMSksIFBFUklQSF9CLCAwKTsJLyogREFUQTExICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxMiksIFBFUklQSF9CLCAwKTsJLyogREFUQTEyICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg3KSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTEzICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg4KSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTE0ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg5KSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTE1ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxMyksIFBFUklQSF9CLCAwKTsJLyogREFUQTE2ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxNCksIFBFUklQSF9CLCAwKTsJLyogREFUQTE3ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxNSksIFBFUklQSF9CLCAwKTsJLyogREFUQTE4ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxNiksIFBFUklQSF9CLCAwKTsJLyogREFUQTE5ICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxNyksIFBFUklQSF9CLCAwKTsJLyogREFUQTIwICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxOCksIFBFUklQSF9CLCAwKTsJLyogREFUQTIxICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNiksIFBFUklQSF9BLCAwKTsJLyogREFUQTIyICovCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNyksIFBFUklQSF9BLCAwKTsJLyogREFUQTIzICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gZXJyX2ludmFsaWRfaWQ7Ci0JCX0KKwkJaWYgKHBpbl9tYXNrID09IDBVTEwpCisJCQkvKiBEZWZhdWx0IHRvICJmdWxsIiBsY2RjIGNvbnRyb2wgc2lnbmFscyBhbmQgMjRiaXQgKi8KKwkJCXBpbl9tYXNrID0gQVRNRUxfTENEQ19QUklfMjRCSVQgfCBBVE1FTF9MQ0RDX1BSSV9DT05UUk9MOworCisJCS8qIExDREMgb24gcG9ydCBDICovCisJCXBvcnRjX21hc2sgPSAocGluX21hc2sgJiAweGZmZjgwMDAwKSA+PiAxOTsKKwkJc2VsZWN0X3BlcmlwaGVyYWwoUElPQywgcG9ydGNfbWFzaywgUEVSSVBIX0EsIDApOworCisJCS8qIExDREMgb24gcG9ydCBEICovCisJCXBvcnRkX21hc2sgPSBwaW5fbWFzayAmIDB4MDAwM2ZmZmY7CisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0QsIHBvcnRkX21hc2ssIFBFUklQSF9BLCAwKTsKKworCQkvKiBMQ0RDIG9uIHBvcnQgRSAqLworCQlwb3J0ZV9tYXNrID0gKHBpbl9tYXNrID4+IDMyKSAmIDB4MDAwN2ZmZmY7CisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0UsIHBvcnRlX21hc2ssIFBFUklQSF9CLCAwKTsKIAogCQljbGtfc2V0X3BhcmVudCgmYXRtZWxfbGNkZmIwX3BpeGNsaywgJnBsbDApOwogCQljbGtfc2V0X3JhdGUoJmF0bWVsX2xjZGZiMF9waXhjbGssIGNsa19nZXRfcmF0ZSgmcGxsMCkpOwpAQCAtMTQ5OSw2ICsxNTI4LDcgQEAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBhdDMyX2FkZF9kZXZpY2VfcHdtKHUzMiBtYXNrKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdTMyIHBpbl9tYXNrOwogCiAJaWYgKCFtYXNrKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE1MTQsMTQgKzE1NDQsMjEgQEAKIAlpZiAocGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsICZtYXNrLCBzaXplb2YobWFzaykpKQogCQlnb3RvIG91dF9mcmVlX3BkZXY7CiAKKwlwaW5fbWFzayA9IDA7CiAJaWYgKG1hc2sgJiAoMSA8PCAwKSkKLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMjgpLCBQRVJJUEhfQSwgMCk7CisJCXBpbl9tYXNrIHw9ICgxIDw8IDI4KTsKIAlpZiAobWFzayAmICgxIDw8IDEpKQotCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyOSksIFBFUklQSF9BLCAwKTsKKwkJcGluX21hc2sgfD0gKDEgPDwgMjkpOworCWlmIChwaW5fbWFzayA+IDApCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0EsIHBpbl9tYXNrLCBQRVJJUEhfQSwgMCk7CisKKwlwaW5fbWFzayA9IDA7CiAJaWYgKG1hc2sgJiAoMSA8PCAyKSkKLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMjEpLCBQRVJJUEhfQiwgMCk7CisJCXBpbl9tYXNrIHw9ICgxIDw8IDIxKTsKIAlpZiAobWFzayAmICgxIDw8IDMpKQotCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyMiksIFBFUklQSF9CLCAwKTsKKwkJcGluX21hc2sgfD0gKDEgPDwgMjIpOworCWlmIChwaW5fbWFzayA+IDApCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0EsIHBpbl9tYXNrLCBQRVJJUEhfQiwgMCk7CiAKIAlhdG1lbF9wd20wX21jay5kZXYgPSAmcGRldi0+ZGV2OwogCkBAIC0xNTYyLDUyICsxNTk5LDY1IEBACiBhdDMyX2FkZF9kZXZpY2Vfc3NjKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdTMyIHBpbl9tYXNrID0gMDsKIAogCXN3aXRjaCAoaWQpIHsKIAljYXNlIDA6CiAJCXBkZXYgPSAmc3NjMF9kZXZpY2U7CiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19SRikKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDIxKSwgUEVSSVBIX0EsIDApOwkvKiBSRiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMjEpOwkvKiBSRiAqLwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfUkspCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyMiksIFBFUklQSF9BLCAwKTsJLyogUksgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDIyKTsJLyogUksgKi8KIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1RLKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMjMpLCBQRVJJUEhfQSwgMCk7CS8qIFRLICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAyMyk7CS8qIFRLICovCiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19URikKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDI0KSwgUEVSSVBIX0EsIDApOwkvKiBURiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMjQpOwkvKiBURiAqLwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfVEQpCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyNSksIFBFUklQSF9BLCAwKTsJLyogVEQgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDI1KTsJLyogVEQgKi8KIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1JEKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMjYpLCBQRVJJUEhfQSwgMCk7CS8qIFJEICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAyNik7CS8qIFJEICovCisKKwkJaWYgKHBpbl9tYXNrID4gMCkKKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0EsIHBpbl9tYXNrLCBQRVJJUEhfQSwgMCk7CisKIAkJYnJlYWs7CiAJY2FzZSAxOgogCQlwZGV2ID0gJnNzYzFfZGV2aWNlOwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfUkYpCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgwKSwgUEVSSVBIX0IsIDApOwkvKiBSRiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMCk7CS8qIFJGICovCiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19SSykKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDEpLCBQRVJJUEhfQiwgMCk7CS8qIFJLICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAxKTsJLyogUksgKi8KIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1RLKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMiksIFBFUklQSF9CLCAwKTsJLyogVEsgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDIpOwkvKiBUSyAqLwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfVEYpCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgzKSwgUEVSSVBIX0IsIDApOwkvKiBURiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMyk7CS8qIFRGICovCiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19URCkKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDQpLCBQRVJJUEhfQiwgMCk7CS8qIFREICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCA0KTsJLyogVEQgKi8KIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1JEKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoNSksIFBFUklQSF9CLCAwKTsJLyogUkQgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDUpOwkvKiBSRCAqLworCisJCWlmIChwaW5fbWFzayA+IDApCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQSU9BLCBwaW5fbWFzaywgUEVSSVBIX0IsIDApOworCiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJcGRldiA9ICZzc2MyX2RldmljZTsKIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1REKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTMpLCBQRVJJUEhfQSwgMCk7CS8qIFREICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAxMyk7CS8qIFREICovCiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19SRCkKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDE0KSwgUEVSSVBIX0EsIDApOwkvKiBSRCAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMTQpOwkvKiBSRCAqLwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfVEspCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQigxNSksIFBFUklQSF9BLCAwKTsJLyogVEsgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDE1KTsJLyogVEsgKi8KIAkJaWYgKGZsYWdzICYgQVRNRUxfU1NDX1RGKQotCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTYpLCBQRVJJUEhfQSwgMCk7CS8qIFRGICovCisJCQlwaW5fbWFzayB8PSAoMSA8PCAxNik7CS8qIFRGICovCiAJCWlmIChmbGFncyAmIEFUTUVMX1NTQ19SRikKLQkJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDE3KSwgUEVSSVBIX0EsIDApOwkvKiBSRiAqLworCQkJcGluX21hc2sgfD0gKDEgPDwgMTcpOwkvKiBSRiAqLwogCQlpZiAoZmxhZ3MgJiBBVE1FTF9TU0NfUkspCi0JCQlzZWxlY3RfcGVyaXBoZXJhbChQQigxOCksIFBFUklQSF9BLCAwKTsJLyogUksgKi8KKwkJCXBpbl9tYXNrIHw9ICgxIDw8IDE4KTsJLyogUksgKi8KKworCQlpZiAocGluX21hc2sgPiAwKQorCQkJc2VsZWN0X3BlcmlwaGVyYWwoUElPQiwgcGluX21hc2ssIFBFUklQSF9BLCAwKTsKKwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKQEAgLTE3NDUsMTQgKzE3OTUsMTUgQEAKIAkJdW5zaWduZWQgaW50IGNzLCB1bnNpZ25lZCBpbnQgZXh0aW50KQogewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0aW50X3Bpbl9tYXBbNF0gX19pbml0ZGF0YSA9IHsKLQkJR1BJT19QSU5fUEIoMjUpLAotCQlHUElPX1BJTl9QQigyNiksCi0JCUdQSU9fUElOX1BCKDI3KSwKLQkJR1BJT19QSU5fUEIoMjgpLAorCQkoMSA8PCAyNSksCisJCSgxIDw8IDI2KSwKKwkJKDEgPDwgMjcpLAorCQkoMSA8PCAyOCksCiAJfTsKIAlzdGF0aWMgYm9vbCBjb21tb25fcGluc19pbml0aWFsaXplZCBfX2luaXRkYXRhID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IGV4dGludF9waW47CiAJaW50IHJldDsKKwl1MzIgcGluX21hc2s7CiAKIAlpZiAoZXh0aW50ID49IEFSUkFZX1NJWkUoZXh0aW50X3Bpbl9tYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3NjYsNyArMTgxNyw4IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBFKDIxKSwgUEVSSVBIX0EsIDApOyAvKiBOQ1M0ICAgLT4gT0VfTiAgKi8KKwkJLyogTkNTNCAgIC0+IE9FX04gICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0UsICgxIDw8IDIxKSwgUEVSSVBIX0EsIDApOwogCQlobWF0cml4X3Nmcl9zZXRfYml0cyhITUFUUklYX1NMQVZFX0VCSSwgSE1BVFJJWF9FQklfQ0YwX0VOQUJMRSk7CiAJCWJyZWFrOwogCWNhc2UgNToKQEAgLTE3NzYsNyArMTgyOCw4IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBFKDIyKSwgUEVSSVBIX0EsIDApOyAvKiBOQ1M1ICAgLT4gT0VfTiAgKi8KKwkJLyogTkNTNSAgIC0+IE9FX04gICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0UsICgxIDw8IDIyKSwgUEVSSVBIX0EsIDApOwogCQlobWF0cml4X3Nmcl9zZXRfYml0cyhITUFUUklYX1NMQVZFX0VCSSwgSE1BVFJJWF9FQklfQ0YxX0VOQUJMRSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzg0LDE0ICsxODM3LDE3IEBACiAJfQogCiAJaWYgKCFjb21tb25fcGluc19pbml0aWFsaXplZCkgewotCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgxOSksIFBFUklQSF9BLCAwKTsJLyogQ0ZDRTEgIC0+IENTMF9OICovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBFKDIwKSwgUEVSSVBIX0EsIDApOwkvKiBDRkNFMiAgLT4gQ1MxX04gKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEUoMjMpLCBQRVJJUEhfQSwgMCk7IC8qIENGUk5XICAtPiBESVIgICAqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQRSgyNCksIFBFUklQSF9BLCAwKTsgLyogTldBSVQgIDwtIElPUkRZICovCisJCXBpbl9tYXNrICA9ICgxIDw8IDE5KTsJLyogQ0ZDRTEgIC0+IENTMF9OICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDIwKTsJLyogQ0ZDRTIgIC0+IENTMV9OICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDIzKTsJLyogQ0ZSTlcgIC0+IERJUiAgICovCisJCXBpbl9tYXNrIHw9ICgxIDw8IDI0KTsJLyogTldBSVQgIDwtIElPUkRZICovCisKKwkJc2VsZWN0X3BlcmlwaGVyYWwoUElPRSwgcGluX21hc2ssIFBFUklQSF9BLCAwKTsKKwogCQljb21tb25fcGluc19pbml0aWFsaXplZCA9IHRydWU7CiAJfQogCi0JYXQzMl9zZWxlY3RfcGVyaXBoKGV4dGludF9waW4sIEdQSU9fUEVSSVBIX0EsIEFUMzJfR1BJT0ZfREVHTElUQ0gpOworCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0IsIGV4dGludF9waW4sIFBFUklQSF9BLCBBVDMyX0dQSU9GX0RFR0xJVENIKTsKIAogCXBkZXYtPnJlc291cmNlWzFdLnN0YXJ0ID0gRUlNX0lSUV9CQVNFICsgZXh0aW50OwogCXBkZXYtPnJlc291cmNlWzFdLmVuZCA9IHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OwpAQCAtMTkzMCw2ICsxOTg2LDcgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhIF9kYXRhOworCXUzMiBwaW5fbWFzazsKIAogCWlmIChpZCAhPSAwKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE5NTYsMTAgKzIwMTMsMTAgQEAKIAkJCQlzaXplb2Yoc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEpKSkKIAkJZ290byBmYWlsOwogCi0Jc2VsZWN0X3BlcmlwaGVyYWwoUEIoMjApLCBQRVJJUEhfQiwgMCk7CS8qIFNETwkqLwotCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDIxKSwgUEVSSVBIX0IsIDApOwkvKiBTWU5DCSovCi0Jc2VsZWN0X3BlcmlwaGVyYWwoUEIoMjIpLCBQRVJJUEhfQiwgMCk7CS8qIFNDTEsJKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQigyMyksIFBFUklQSF9CLCAwKTsJLyogU0RJCSovCisJcGluX21hc2sgID0gKDEgPDwgMjApIHwgKDEgPDwgMjEpOwkvKiBTRE8gJiBTWU5DICovCisJcGluX21hc2sgfD0gKDEgPDwgMjIpIHwgKDEgPDwgMjMpOwkvKiBTQ0xLICYgU0RJICovCisKKwlzZWxlY3RfcGVyaXBoZXJhbChQSU9CLCBwaW5fbWFzaywgUEVSSVBIX0IsIDApOwogCiAJLyogVE9ETzogZ3Bpb19pc192YWxpZChkYXRhLT5yZXNldF9waW4pIHdpdGgga2VybmVsIDIuNi4yNi4gKi8KIAlpZiAoZGF0YS0+cmVzZXRfcGluICE9IEdQSU9fUElOX05PTkUpCkBAIC0yMDAxLDYgKzIwNTgsNyBAQAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGF0MzJfYWRkX2RldmljZV9hYmRhYyh1bnNpZ25lZCBpbnQgaWQpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1MzIgcGluX21hc2s7CiAKIAlpZiAoaWQgIT0gMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMDEzLDEwICsyMDcxLDEwIEBACiAJCQkJQVJSQVlfU0laRShhYmRhYzBfcmVzb3VyY2UpKSkKIAkJZ290byBlcnJfYWRkX3Jlc291cmNlczsKIAotCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDIwKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMQkqLwotCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDIxKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMAkqLwotCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDIyKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBTjEJKi8KLQlzZWxlY3RfcGVyaXBoZXJhbChQQigyMyksIFBFUklQSF9BLCAwKTsJLyogREFUQU4wCSovCisJcGluX21hc2sgID0gKDEgPDwgMjApIHwgKDEgPDwgMjIpOwkvKiBEQVRBMSAmIERBVEFOMSAqLworCXBpbl9tYXNrIHw9ICgxIDw8IDIxKSB8ICgxIDw8IDIzKTsJLyogREFUQTAgJiBEQVRBTjAgKi8KKworCXNlbGVjdF9wZXJpcGhlcmFsKFBJT0IsIHBpbl9tYXNrLCBQRVJJUEhfQSwgMCk7CiAKIAlhYmRhYzBfcGNsay5kZXYgPSAmcGRldi0+ZGV2OwogCWFiZGFjMF9zYW1wbGVfY2xrLmRldiA9ICZwZGV2LT5kZXY7CkBAIC0yMDczLDcgKzIxMzEsNyBAQAogCS5pbmRleAkJPSA0LAogfTsKIAotc3RydWN0IGNsayAqYXQzMl9jbG9ja19saXN0W10gPSB7CitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgY2xrICppbml0X2Nsb2Nrc1tdID0gewogCSZvc2MzMmssCiAJJm9zYzAsCiAJJm9zYzEsCkBAIC0yMTM3LDcgKzIxOTUsNiBAQAogCSZnY2xrMywKIAkmZ2NsazQsCiB9OwotdW5zaWduZWQgaW50IGF0MzJfbnJfY2xvY2tzID0gQVJSQVlfU0laRShhdDMyX2Nsb2NrX2xpc3QpOwogCiB2b2lkIF9faW5pdCBzZXR1cF9wbGF0Zm9ybSh2b2lkKQogewpAQCAtMjE2OCwxNCArMjIyNSwxOSBAQAogCWdlbmNsa19pbml0X3BhcmVudCgmYWJkYWMwX3NhbXBsZV9jbGspOwogCiAJLyoKLQkgKiBUdXJuIG9uIGFsbCBjbG9ja3MgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB1c2VyIGFscmVhZHksIGFuZAotCSAqIHR1cm4gb2ZmIGV2ZXJ5dGhpbmcgZWxzZS4gV2Ugb25seSBkbyB0aGlzIGZvciBtb2R1bGUKLQkgKiBjbG9ja3MsIGFuZCBldmVuIHRob3VnaCBpdCBpc24ndCBwYXJ0aWN1bGFybHkgcHJldHR5IHRvCi0JICogY2hlY2sgdGhlIGFkZHJlc3Mgb2YgdGhlIG1vZGUgZnVuY3Rpb24sIGl0IHNob3VsZCBkbyB0aGUKLQkgKiB0cmljay4uLgorCSAqIEJ1aWxkIGluaXRpYWwgZHluYW1pYyBjbG9jayBsaXN0IGJ5IHJlZ2lzdGVyaW5nIGFsbCBjbG9ja3MKKwkgKiBmcm9tIHRoZSBhcnJheS4KKwkgKiBBdCB0aGUgc2FtZSB0aW1lLCB0dXJuIG9uIGFsbCBjbG9ja3MgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZQorCSAqIHVzZXIgYWxyZWFkeSwgYW5kIHR1cm4gb2ZmIGV2ZXJ5dGhpbmcgZWxzZS4gV2Ugb25seSBkbyB0aGlzCisJICogZm9yIG1vZHVsZSBjbG9ja3MsIGFuZCBldmVuIHRob3VnaCBpdCBpc24ndCBwYXJ0aWN1bGFybHkKKwkgKiBwcmV0dHkgdG8gIGNoZWNrIHRoZSBhZGRyZXNzIG9mIHRoZSBtb2RlIGZ1bmN0aW9uLCBpdCBzaG91bGQKKwkgKiBkbyB0aGUgdHJpY2suLi4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdDMyX2Nsb2NrX2xpc3QpOyBpKyspIHsKLQkJc3RydWN0IGNsayAqY2xrID0gYXQzMl9jbG9ja19saXN0W2ldOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsayA9IGluaXRfY2xvY2tzW2ldOworCisJCS8qIGZpcnN0LCByZWdpc3RlciBjbG9jayAqLworCQlhdDMyX2Nsa19yZWdpc3RlcihjbGspOwogCiAJCWlmIChjbGstPnVzZXJzID09IDApCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwppbmRleCA2YzI3ZGRhLi4xMzhhMDBhIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCkBAIC0xNSwyNCArMTUsNDAgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2NoaXAuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAKKy8qIGF0MzIgY2xvY2sgbGlzdCAqLworc3RhdGljIExJU1RfSEVBRChhdDMyX2Nsb2NrX2xpc3QpOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsa19sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrX2xpc3RfbG9jayk7CisKK3ZvaWQgYXQzMl9jbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQoreworCXNwaW5fbG9jaygmY2xrX2xpc3RfbG9jayk7CisJLyogYWRkIHRoZSBuZXcgaXRlbSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmY2xrLT5saXN0LCAmYXQzMl9jbG9ja19saXN0KTsKKwlzcGluX3VubG9jaygmY2xrX2xpc3RfbG9jayk7Cit9CiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgY2xrICpjbGs7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYXQzMl9ucl9jbG9ja3M7IGkrKykgewotCQlzdHJ1Y3QgY2xrICpjbGsgPSBhdDMyX2Nsb2NrX2xpc3RbaV07CisJc3Bpbl9sb2NrKCZjbGtfbGlzdF9sb2NrKTsKIAotCQlpZiAoY2xrLT5kZXYgPT0gZGV2ICYmIHN0cmNtcChpZCwgY2xrLT5uYW1lKSA9PSAwKQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xrLCAmYXQzMl9jbG9ja19saXN0LCBsaXN0KSB7CisJCWlmIChjbGstPmRldiA9PSBkZXYgJiYgc3RyY21wKGlkLCBjbGstPm5hbWUpID09IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZjbGtfbGlzdF9sb2NrKTsKIAkJCXJldHVybiBjbGs7CisJCX0KIAl9CiAKKwlzcGluX3VubG9jaygmY2xrX2xpc3RfbG9jayk7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNsa19nZXQpOwpAQCAtMjAzLDggKzIxOSw4IEBACiAKIAkvKiBjb3N0IG9mIHRoaXMgc2NhbiBpcyBzbWFsbCwgYnV0IG5vdCBsaW5lYXIuLi4gKi8KIAlyLT5uZXN0ID0gbmVzdCArIE5FU1RfREVMVEE7Ci0JZm9yIChpID0gMzsgaSA8IGF0MzJfbnJfY2xvY2tzOyBpKyspIHsKLQkJY2xrID0gYXQzMl9jbG9ja19saXN0W2ldOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGssICZhdDMyX2Nsb2NrX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGNsay0+cGFyZW50ID09IHBhcmVudCkKIAkJCWR1bXBfY2xvY2soY2xrLCByKTsKIAl9CkBAIC0yMTUsNiArMjMxLDcgQEAKIHsKIAlzdHJ1Y3QgY2xraW5mCXI7CiAJaW50CQlpOworCXN0cnVjdCBjbGsgCSpjbGs7CiAKIAkvKiBzaG93IGFsbCB0aGUgcG93ZXIgbWFuYWdlciByZWdpc3RlcnMgKi8KIAlzZXFfcHJpbnRmKHMsICJNQ0NUUkwgID0gJTh4XG4iLCBwbV9yZWFkbChNQ0NUUkwpKTsKQEAgLTIzNCwxNCArMjUxLDI1IEBACiAKIAlzZXFfcHJpbnRmKHMsICJcbiIpOwogCi0JLyogc2hvdyBjbG9jayB0cmVlIGFzIGRlcml2ZWQgZnJvbSB0aGUgdGhyZWUgb3NjaWxsYXRvcnMKLQkgKiB3ZSAia25vdyIgYXJlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0Ci0JICovCiAJci5zID0gczsKIAlyLm5lc3QgPSAwOwotCWR1bXBfY2xvY2soYXQzMl9jbG9ja19saXN0WzBdLCAmcik7Ci0JZHVtcF9jbG9jayhhdDMyX2Nsb2NrX2xpc3RbMV0sICZyKTsKLQlkdW1wX2Nsb2NrKGF0MzJfY2xvY2tfbGlzdFsyXSwgJnIpOworCS8qIHByb3RlY3RlZCBmcm9tIGNoYW5nZXMgb24gdGhlIGxpc3Qgd2hpbGUgZHVtcGluZyAqLworCXNwaW5fbG9jaygmY2xrX2xpc3RfbG9jayk7CisKKwkvKiBzaG93IGNsb2NrIHRyZWUgYXMgZGVyaXZlZCBmcm9tIHRoZSB0aHJlZSBvc2NpbGxhdG9ycyAqLworCWNsayA9IGNsa19nZXQoTlVMTCwgIm9zYzMyayIpOworCWR1bXBfY2xvY2soY2xrLCAmcik7CisJY2xrX3B1dChjbGspOworCisJY2xrID0gY2xrX2dldChOVUxMLCAib3NjMCIpOworCWR1bXBfY2xvY2soY2xrLCAmcik7CisJY2xrX3B1dChjbGspOworCisJY2xrID0gY2xrX2dldChOVUxMLCAib3NjMSIpOworCWR1bXBfY2xvY2soY2xrLCAmcik7CisJY2xrX3B1dChjbGspOworCisJc3Bpbl91bmxvY2soJmNsa19saXN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmgKaW5kZXggYmI4ZTFmMi4uNjIzYmYwZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suaApAQCAtMTIsOCArMTIsMTMgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisKK3ZvaWQgYXQzMl9jbGtfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKTsKIAogc3RydWN0IGNsayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGlua2luZyBlbGVtZW50ICovCiAJY29uc3QgY2hhcgkqbmFtZTsJCS8qIENsb2NrIG5hbWUvZnVuY3Rpb24gKi8KIAlzdHJ1Y3QgZGV2aWNlCSpkZXY7CQkvKiBEZXZpY2UgdGhlIGNsb2NrIGlzIHVzZWQgYnkgKi8KIAlzdHJ1Y3QgY2xrCSpwYXJlbnQ7CS8qIFBhcmVudCBjbG9jaywgaWYgYW55ICovCkBAIC0yNSw2ICszMCwzIEBACiAJdTE2CQl1c2VyczsJCS8qIEVuYWJsZWQgaWYgbm9uLXplcm8gKi8KIAl1MTYJCWluZGV4OwkJLyogU2libGluZyBpbmRleCAqLwogfTsKLQotZXh0ZXJuIHN0cnVjdCBjbGsgKmF0MzJfY2xvY2tfbGlzdFtdOwotZXh0ZXJuIHVuc2lnbmVkIGludCBhdDMyX25yX2Nsb2NrczsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY3B1ZnJlcS5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jcHVmcmVxLmMKaW5kZXggNWRkOGQyNS4uZDg0ZWZlNCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jcHVmcmVxLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jcHVmcmVxLmMKQEAgLTg3LDcgKzg3LDYgQEAKIAlwb2xpY3ktPmN1ciA9IGF0MzJfZ2V0X3NwZWVkKDApOwogCXBvbGljeS0+bWluID0gcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxOwogCXBvbGljeS0+bWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOwotCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CiAKIAlwcmludGsoImNwdWZyZXE6IEFUMzJBUCBDUFUgZnJlcXVlbmN5IGRyaXZlclxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaAppbmRleCAxZTk4NTJkLi5hNzdkMzcyIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYXQzMmFwNzAweC5oCkBAIC04Myw0ICs4MywxMzIgQEAKICNkZWZpbmUgSE1BVFJJWF9CQVNFCTB4ZmZmMDA4MDAKICNkZWZpbmUgU0RSQU1DX0JBU0UJMHhmZmYwMzgwMAogCisvKiBMQ0RDIG9uIHBvcnQgQyAqLworI2RlZmluZSBBVE1FTF9MQ0RDX1BDX0NDCSgxVUxMIDw8IDE5KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BDX0hTWU5DCSgxVUxMIDw8IDIwKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BDX1BDTEsJKDFVTEwgPDwgMjEpCisjZGVmaW5lIEFUTUVMX0xDRENfUENfVlNZTkMJKDFVTEwgPDwgMjIpCisjZGVmaW5lIEFUTUVMX0xDRENfUENfRFZBTAkoMVVMTCA8PCAyMykKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19NT0RFCSgxVUxMIDw8IDI0KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BDX1BXUgkoMVVMTCA8PCAyNSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBMAkoMVVMTCA8PCAyNikKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBMQkoMVVMTCA8PCAyNykKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBMgkoMVVMTCA8PCAyOCkKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBMwkoMVVMTCA8PCAyOSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBNAkoMVVMTCA8PCAzMCkKKyNkZWZpbmUgQVRNRUxfTENEQ19QQ19EQVRBNQkoMVVMTCA8PCAzMSkKKworLyogTENEQyBvbiBwb3J0IEQgKi8KKyNkZWZpbmUgQVRNRUxfTENEQ19QRF9EQVRBNgkoMVVMTCA8PCAwKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEE3CSgxVUxMIDw8IDEpCisjZGVmaW5lIEFUTUVMX0xDRENfUERfREFUQTgJKDFVTEwgPDwgMikKKyNkZWZpbmUgQVRNRUxfTENEQ19QRF9EQVRBOQkoMVVMTCA8PCAzKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExMAkoMVVMTCA8PCA0KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExMQkoMVVMTCA8PCA1KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExMgkoMVVMTCA8PCA2KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExMwkoMVVMTCA8PCA3KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExNAkoMVVMTCA8PCA4KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExNQkoMVVMTCA8PCA5KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExNgkoMVVMTCA8PCAxMCkKKyNkZWZpbmUgQVRNRUxfTENEQ19QRF9EQVRBMTcJKDFVTEwgPDwgMTEpCisjZGVmaW5lIEFUTUVMX0xDRENfUERfREFUQTE4CSgxVUxMIDw8IDEyKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEExOQkoMVVMTCA8PCAxMykKKyNkZWZpbmUgQVRNRUxfTENEQ19QRF9EQVRBMjAJKDFVTEwgPDwgMTQpCisjZGVmaW5lIEFUTUVMX0xDRENfUERfREFUQTIxCSgxVUxMIDw8IDE1KQorI2RlZmluZSBBVE1FTF9MQ0RDX1BEX0RBVEEyMgkoMVVMTCA8PCAxNikKKyNkZWZpbmUgQVRNRUxfTENEQ19QRF9EQVRBMjMJKDFVTEwgPDwgMTcpCisKKy8qIExDREMgb24gcG9ydCBFICovCisjZGVmaW5lIEFUTUVMX0xDRENfUEVfQ0MJKDFVTEwgPDwgKDMyICsgMCkpCisjZGVmaW5lIEFUTUVMX0xDRENfUEVfRFZBTAkoMVVMTCA8PCAoMzIgKyAxKSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QRV9NT0RFCSgxVUxMIDw8ICgzMiArIDIpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEEwCSgxVUxMIDw8ICgzMiArIDMpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEExCSgxVUxMIDw8ICgzMiArIDQpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEEyCSgxVUxMIDw8ICgzMiArIDUpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEEzCSgxVUxMIDw8ICgzMiArIDYpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEE0CSgxVUxMIDw8ICgzMiArIDcpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEE4CSgxVUxMIDw8ICgzMiArIDgpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEE5CSgxVUxMIDw8ICgzMiArIDkpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEExMAkoMVVMTCA8PCAoMzIgKyAxMCkpCisjZGVmaW5lIEFUTUVMX0xDRENfUEVfREFUQTExCSgxVUxMIDw8ICgzMiArIDExKSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QRV9EQVRBMTIJKDFVTEwgPDwgKDMyICsgMTIpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEExNgkoMVVMTCA8PCAoMzIgKyAxMykpCisjZGVmaW5lIEFUTUVMX0xDRENfUEVfREFUQTE3CSgxVUxMIDw8ICgzMiArIDE0KSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QRV9EQVRBMTgJKDFVTEwgPDwgKDMyICsgMTUpKQorI2RlZmluZSBBVE1FTF9MQ0RDX1BFX0RBVEExOQkoMVVMTCA8PCAoMzIgKyAxNikpCisjZGVmaW5lIEFUTUVMX0xDRENfUEVfREFUQTIwCSgxVUxMIDw8ICgzMiArIDE3KSkKKyNkZWZpbmUgQVRNRUxfTENEQ19QRV9EQVRBMjEJKDFVTEwgPDwgKDMyICsgMTgpKQorCisKKyNkZWZpbmUgQVRNRUxfTENEQyhQT1JULCBQSU4pCShBVE1FTF9MQ0RDXyMjUE9SVCMjXyMjUElOKQorCisKKyNkZWZpbmUgQVRNRUxfTENEQ19QUklfMjRCX0RBVEEJKAkJCQkJXAorCQlBVE1FTF9MQ0RDKFBDLCBEQVRBMCkgIHwgQVRNRUxfTENEQyhQQywgREFUQTEpICB8CVwKKwkJQVRNRUxfTENEQyhQQywgREFUQTIpICB8IEFUTUVMX0xDREMoUEMsIERBVEEzKSAgfAlcCisJCUFUTUVMX0xDREMoUEMsIERBVEE0KSAgfCBBVE1FTF9MQ0RDKFBDLCBEQVRBNSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBNikgIHwgQVRNRUxfTENEQyhQRCwgREFUQTcpICB8CVwKKwkJQVRNRUxfTENEQyhQRCwgREFUQTgpICB8IEFUTUVMX0xDREMoUEQsIERBVEE5KSAgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEExMCkgfCBBVE1FTF9MQ0RDKFBELCBEQVRBMTEpIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBMTIpIHwgQVRNRUxfTENEQyhQRCwgREFUQTEzKSB8CVwKKwkJQVRNRUxfTENEQyhQRCwgREFUQTE0KSB8IEFUTUVMX0xDREMoUEQsIERBVEExNSkgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEExNikgfCBBVE1FTF9MQ0RDKFBELCBEQVRBMTcpIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBMTgpIHwgQVRNRUxfTENEQyhQRCwgREFUQTE5KSB8CVwKKwkJQVRNRUxfTENEQyhQRCwgREFUQTIwKSB8IEFUTUVMX0xDREMoUEQsIERBVEEyMSkgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEEyMikgfCBBVE1FTF9MQ0RDKFBELCBEQVRBMjMpKQorCisjZGVmaW5lIEFUTUVMX0xDRENfQUxUXzI0Ql9EQVRBICgJCQkJCVwKKwkJQVRNRUxfTENEQyhQRSwgREFUQTApICB8IEFUTUVMX0xDREMoUEUsIERBVEExKSAgfAlcCisJCUFUTUVMX0xDREMoUEUsIERBVEEyKSAgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBMykgIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBNCkgIHwgQVRNRUxfTENEQyhQQywgREFUQTUpICB8CVwKKwkJQVRNRUxfTENEQyhQRCwgREFUQTYpICB8IEFUTUVMX0xDREMoUEQsIERBVEE3KSAgfAlcCisJCUFUTUVMX0xDREMoUEUsIERBVEE4KSAgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBOSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBMTApIHwgQVRNRUxfTENEQyhQRSwgREFUQTExKSB8CVwKKwkJQVRNRUxfTENEQyhQRSwgREFUQTEyKSB8IEFUTUVMX0xDREMoUEQsIERBVEExMykgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEExNCkgfCBBVE1FTF9MQ0RDKFBELCBEQVRBMTUpIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBMTYpIHwgQVRNRUxfTENEQyhQRSwgREFUQTE3KSB8CVwKKwkJQVRNRUxfTENEQyhQRSwgREFUQTE4KSB8IEFUTUVMX0xDREMoUEUsIERBVEExOSkgfAlcCisJCUFUTUVMX0xDREMoUEUsIERBVEEyMCkgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBMjEpIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBMjIpIHwgQVRNRUxfTENEQyhQRCwgREFUQTIzKSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX1BSSV8xNUJfREFUQSAoCQkJCQlcCisJCUFUTUVMX0xDREMoUEMsIERBVEEwKSAgfCBBVE1FTF9MQ0RDKFBDLCBEQVRBMSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBDLCBEQVRBMikgIHwgQVRNRUxfTENEQyhQQywgREFUQTMpICB8CVwKKwkJQVRNRUxfTENEQyhQQywgREFUQTQpICB8IEFUTUVMX0xDREMoUEMsIERBVEE1KSAgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEE4KSAgfCBBVE1FTF9MQ0RDKFBELCBEQVRBOSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBMTApIHwgQVRNRUxfTENEQyhQRCwgREFUQTExKSB8CVwKKwkJQVRNRUxfTENEQyhQRCwgREFUQTEyKSB8IEFUTUVMX0xDREMoUEQsIERBVEExNikgfAlcCisJCUFUTUVMX0xDREMoUEQsIERBVEExNykgfCBBVE1FTF9MQ0RDKFBELCBEQVRBMTgpIHwJXAorCQlBVE1FTF9MQ0RDKFBELCBEQVRBMTkpIHwgQVRNRUxfTENEQyhQRCwgREFUQTIwKSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX0FMVF8xNUJfREFUQQkoCQkJCQlcCisJCUFUTUVMX0xDREMoUEUsIERBVEEwKSAgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBMSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBMikgIHwgQVRNRUxfTENEQyhQRSwgREFUQTMpICB8CVwKKwkJQVRNRUxfTENEQyhQRSwgREFUQTQpICB8IEFUTUVMX0xDREMoUEMsIERBVEE1KSAgfAlcCisJCUFUTUVMX0xDREMoUEUsIERBVEE4KSAgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBOSkgIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBMTApIHwgQVRNRUxfTENEQyhQRSwgREFUQTExKSB8CVwKKwkJQVRNRUxfTENEQyhQRSwgREFUQTEyKSB8IEFUTUVMX0xDREMoUEUsIERBVEExNikgfAlcCisJCUFUTUVMX0xDREMoUEUsIERBVEExNykgfCBBVE1FTF9MQ0RDKFBFLCBEQVRBMTgpIHwJXAorCQlBVE1FTF9MQ0RDKFBFLCBEQVRBMTkpIHwgQVRNRUxfTENEQyhQRSwgREFUQTIwKSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX1BSSV9DT05UUk9MICgJCQkJCVwKKwkJQVRNRUxfTENEQyhQQywgQ0MpICAgfCBBVE1FTF9MQ0RDKFBDLCBEVkFMKSB8CQlcCisJCUFUTUVMX0xDREMoUEMsIE1PREUpIHwgQVRNRUxfTENEQyhQQywgUFdSKSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX0FMVF9DT05UUk9MICgJCQkJCVwKKwkJQVRNRUxfTENEQyhQRSwgQ0MpICAgfCBBVE1FTF9MQ0RDKFBFLCBEVkFMKSB8CQlcCisJCUFUTUVMX0xDREMoUEUsIE1PREUpIHwgQVRNRUxfTENEQyhQQywgUFdSKSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX0NPTlRST0wgKAkJCQkJCVwKKwkJQVRNRUxfTENEQyhQQywgSFNZTkMpIHwgQVRNRUxfTENEQyhQQywgVlNZTkMpIHwJCVwKKwkJQVRNRUxfTENEQyhQQywgUENMSykpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19QUklfMjRCSVQJKEFUTUVMX0xDRENfQ09OVFJPTCB8IEFUTUVMX0xDRENfUFJJXzI0Ql9EQVRBKQorCisjZGVmaW5lIEFUTUVMX0xDRENfQUxUXzI0QklUCShBVE1FTF9MQ0RDX0NPTlRST0wgfCBBVE1FTF9MQ0RDX0FMVF8yNEJfREFUQSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX1BSSV8xNUJJVAkoQVRNRUxfTENEQ19DT05UUk9MIHwgQVRNRUxfTENEQ19QUklfMTVCX0RBVEEpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19BTFRfMTVCSVQJKEFUTUVMX0xDRENfQ09OVFJPTCB8IEFUTUVMX0xDRENfQUxUXzE1Ql9EQVRBKQorCiAjZW5kaWYgLyogX19BU01fQVJDSF9BVDMyQVA3MDBYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYm9hcmQuaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggZTYwZTkwNy4uYzQ4Mzg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYm9hcmQuaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oCkBAIC00Myw3ICs0Myw3IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKIGF0MzJfYWRkX2RldmljZV9sY2RjKHVuc2lnbmVkIGludCBpZCwgc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKmRhdGEsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBmYm1lbV9zdGFydCwgdW5zaWduZWQgbG9uZyBmYm1lbV9sZW4sCi0JCSAgICAgdW5zaWduZWQgaW50IHBpbl9jb25maWcpOworCQkgICAgIHU2NCBwaW5fbWFzayk7CiAKIHN0cnVjdCB1c2JhX3BsYXRmb3JtX2RhdGE7CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDRlYzZhYmMuLjIyZWE3OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvaW8uaApAQCAtMSw4ICsxLDcgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfQVJDSF9BVDMyQVBfSU9fSAogI2RlZmluZSBfX0FTTV9BVlIzMl9BUkNIX0FUMzJBUF9JT19ICiAKLS8qIEZvciAiYml6YXJyZSIgaGFsZndvcmQgc3dhcHBpbmcgKi8KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYmIuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUDcwMFhfMzJfQklUX1NNQykKICMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2IoYWRkcikJKGFkZHIgXiAzVUwpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKaW5kZXggYjFhYmU2Yi4uMjFjNzkzNyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMjEsOSArMjEsMTAgQEAKICNkZWZpbmUgQVQzMl9HUElPRl9ERUdMSVRDSAkweDAwMDAwMDA4CS8qIChJTikgRmlsdGVyIGdsaXRjaGVzICovCiAjZGVmaW5lIEFUMzJfR1BJT0ZfTVVMVElEUlYJMHgwMDAwMDAxMAkvKiBFbmFibGUgbXVsdGlkcml2ZXIgb3B0aW9uICovCiAKLXZvaWQgYXQzMl9zZWxlY3RfcGVyaXBoKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBwZXJpcGgsCi0JCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgYXQzMl9zZWxlY3RfcGVyaXBoKHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgcGluLAorCQkJdW5zaWduZWQgaW50IHBlcmlwaCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGF0MzJfc2VsZWN0X2dwaW8odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIGF0MzJfZGVzZWxlY3RfcGluKHVuc2lnbmVkIGludCBwaW4pOwogdm9pZCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwaW4pOwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9QT1JUTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wZGMuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGRjLmMKaW5kZXggMTA0MGJkYS4uNjFhYjE1YSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wZGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3BkYy5jCkBAIC0zNSw3ICszNSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBkY19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHBkY19wcm9iZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAicGRjIiwKIAl9LApAQCAtNDMsNiArNDIsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwZGNfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBkY19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnBkY19kcml2ZXIsIHBkY19wcm9iZSk7CiB9CiBhcmNoX2luaXRjYWxsKHBkY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCmluZGV4IDQwNWVlNmIuLmVkODFhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwpAQCAtNTAsMzUgKzUwLDQ4IEBACiB9CiAKIC8qIFBpbiBtdWx0aXBsZXhpbmcgQVBJICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBpb19sb2NrKTsKIAotdm9pZCBfX2luaXQgYXQzMl9zZWxlY3RfcGVyaXBoKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBwZXJpcGgsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3ZvaWQgX19pbml0IGF0MzJfc2VsZWN0X3BlcmlwaCh1bnNpZ25lZCBpbnQgcG9ydCwgdTMyIHBpbl9tYXNrLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwZXJpcGgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKLQl1bnNpZ25lZCBpbnQgcGluX2luZGV4ID0gcGluICYgMHgxZjsKLQl1MzIgbWFzayA9IDEgPDwgcGluX2luZGV4OwogCi0JcGlvID0gZ3Bpb190b19waW8ocGluKTsKKwkvKiBhc3NpZ24gYW5kIHZlcmlmeSBwaW8gKi8KKwlwaW8gPSBncGlvX3RvX3Bpbyhwb3J0KTsKIAlpZiAodW5saWtlbHkoIXBpbykpIHsKLQkJcHJpbnRrKCJwaW86IGludmFsaWQgcGluICV1XG4iLCBwaW4pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwaW86IGludmFsaWQgcG9ydCAldVxuIiwgcG9ydCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAodW5saWtlbHkodGVzdF9hbmRfc2V0X2JpdChwaW5faW5kZXgsICZwaW8tPnBpbm11eF9tYXNrKQotCQkJIHx8IGdwaW9jaGlwX2lzX3JlcXVlc3RlZCgmcGlvLT5jaGlwLCBwaW5faW5kZXgpKSkgewotCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCS8qIFRlc3QgaWYgYW55IG9mIHRoZSByZXF1ZXN0ZWQgcGlucyBpcyBhbHJlYWR5IG11eGVkICovCisJc3Bpbl9sb2NrKCZwaW9fbG9jayk7CisJaWYgKHVubGlrZWx5KHBpby0+cGlubXV4X21hc2sgJiBwaW5fbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBpbihzKSBidXN5IChyZXF1ZXN0ZWQgMHgleCwgYnVzeSAweCV4KVxuIiwKKwkJICAgICAgIHBpby0+bmFtZSwgcGluX21hc2ssIHBpby0+cGlubXV4X21hc2sgJiBwaW5fbWFzayk7CisJCXNwaW5fdW5sb2NrKCZwaW9fbG9jayk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlwaW9fd3JpdGVsKHBpbywgUFVFUiwgbWFzayk7CisJcGlvLT5waW5tdXhfbWFzayB8PSBwaW5fbWFzazsKKworCS8qIGVuYWJsZSBwdWxsIHVwcyAqLworCXBpb193cml0ZWwocGlvLCBQVUVSLCBwaW5fbWFzayk7CisKKwkvKiBzZWxlY3QgZWl0aGVyIHBlcmlwaGVyYWwgQSBvciBCICovCiAJaWYgKHBlcmlwaCkKLQkJcGlvX3dyaXRlbChwaW8sIEJTUiwgbWFzayk7CisJCXBpb193cml0ZWwocGlvLCBCU1IsIHBpbl9tYXNrKTsKIAllbHNlCi0JCXBpb193cml0ZWwocGlvLCBBU1IsIG1hc2spOworCQlwaW9fd3JpdGVsKHBpbywgQVNSLCBwaW5fbWFzayk7CiAKLQlwaW9fd3JpdGVsKHBpbywgUERSLCBtYXNrKTsKKwkvKiBlbmFibGUgcGVyaXBoZXJhbCBjb250cm9sICovCisJcGlvX3dyaXRlbChwaW8sIFBEUiwgcGluX21hc2spOworCisJLyogRGlzYWJsZSBwdWxsIHVwcyBpZiBub3QgcmVxdWVzdGVkLiAqLwogCWlmICghKGZsYWdzICYgQVQzMl9HUElPRl9QVUxMVVApKQotCQlwaW9fd3JpdGVsKHBpbywgUFVEUiwgbWFzayk7CisJCXBpb193cml0ZWwocGlvLCBQVURSLCBwaW5fbWFzayk7CisKKwlzcGluX3VubG9jaygmcGlvX2xvY2spOwogCiAJcmV0dXJuOwogCkBAIC0xMzQsNiArMTQ3LDI1IEBACiAJZHVtcF9zdGFjaygpOwogfQogCisvKgorICogVW5kbyBhIHByZXZpb3VzIHBpbiByZXNlcnZhdGlvbi4gV2lsbCBub3QgYWZmZWN0IHRoZSBoYXJkd2FyZQorICogY29uZmlndXJhdGlvbi4KKyAqLwordm9pZCBhdDMyX2Rlc2VsZWN0X3Bpbih1bnNpZ25lZCBpbnQgcGluKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbl9pbmRleCA9IHBpbiAmIDB4MWY7CisKKwlwaW8gPSBncGlvX3RvX3BpbyhwaW4pOworCWlmICh1bmxpa2VseSghcGlvKSkgeworCQlwcmludGsoInBpbzogaW52YWxpZCBwaW4gJXVcbiIsIHBpbik7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuOworCX0KKworCWNsZWFyX2JpdChwaW5faW5kZXgsICZwaW8tPnBpbm11eF9tYXNrKTsKK30KKwogLyogUmVzZXJ2ZSBhIHBpbiwgcHJldmVudGluZyBhbnlvbmUgZWxzZSBmcm9tIGNoYW5naW5nIGl0cyBjb25maWd1cmF0aW9uLiAqLwogdm9pZCBfX2luaXQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKQogewpAQCAtMzgyLDcgKzQxNCw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBpb19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHBpb19wcm9iZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJCT0gInBpbyIsCiAJfSwKQEAgLTM5MCw3ICs0MjEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwaW9faW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBpb19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnBpb19kcml2ZXIsIHBpb19wcm9iZSk7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChwaW9faW5pdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcG0tYXQzMmFwNzAweC5TIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wbS1hdDMyYXA3MDB4LlMKaW5kZXggNWJlNGRlNi4uMTc1MDNiMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wbS1hdDMyYXA3MDB4LlMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wbS1hdDMyYXA3MDB4LlMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCW1vdglyMTEsIFNEUkFNQ19MUFJfTFBDQl9TRUxGX1JGUgogCWJmaW5zCXIxMCwgcjExLCAwLCAyCQkvKiBMUENCIDwtIHNlbGYgUmVmcmVzaCAqLwogCXN5bmMJMAkJCS8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLwotCXN0LncJcjEyW1NEUkFNQ19MUFJdLCByMTEJLyogcHV0IFNEUkFNIGluIHNlbGYtcmVmcmVzaCBtb2RlICovCisJc3QudwlyMTJbU0RSQU1DX0xQUl0sIHIxMAkvKiBwdXQgU0RSQU0gaW4gc2VsZi1yZWZyZXNoIG1vZGUgKi8KIAlsZC53CXIxMSwgcjEyW1NEUkFNQ19MUFJdCiAJdW5tYXNrX2ludGVycnVwdHMKIAlzbGVlcAlDUFVfU0xFRVBfRlJPWkVOCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCAxZmU4MWMzLi5lMGViNTIwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiAJCQkJZXZlbnRfYnVmZmVyLm8gb3Byb2ZpbGVfZmlsZXMubwkJXAogCQkJCW9wcm9maWxlZnMubyBvcHJvZmlsZV9zdGF0cy5vCQlcCiAJCQkJdGltZXJfaW50Lm8pCi1vcHJvZmlsZS15CQkrPSBvcF9tb2RlbF9hdnIzMi5vCitvcHJvZmlsZS15CQkrPSBvcF9tb2RlbF9hdnIzMi5vIGJhY2t0cmFjZS5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC9hdnIzMi9vcHJvZmlsZS9iYWNrdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ5YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9vcHJvZmlsZS9iYWNrdHJhY2UuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQVZSMzIgc3BlY2lmaWMgYmFja3RyYWNpbmcgY29kZSBmb3Igb3Byb2ZpbGUKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBXZWlubWFubiBHbWJICisgKgorICogQXV0aG9yOiBOaWtvbGF1cyBWb3NzIDxuLnZvc3NAd2Vpbm1hbm4uZGU+CisgKgorICogQmFzZWQgb24gaTM4NiBvcHJvZmlsZSBiYWNrdHJhY2UgY29kZSBieSBKb2huIExldm9uIGFuZCBEYXZpZCBTbWl0aAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisvKiBUaGUgZmlyc3QgdHdvIHdvcmRzIG9mIGVhY2ggZnJhbWUgb24gdGhlIHN0YWNrIGxvb2sgbGlrZSB0aGlzIGlmIHdlIGhhdmUKKyAqIGZyYW1lIHBvaW50ZXJzICovCitzdHJ1Y3QgZnJhbWVfaGVhZCB7CisJdW5zaWduZWQgbG9uZyBscjsKKwlzdHJ1Y3QgZnJhbWVfaGVhZCAqZnA7Cit9OworCisvKiBjb3BpZWQgZnJvbSBhcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLCB1bnNpZ25lZCBsb25nIHApCit7CisJcmV0dXJuIChwID4gKHVuc2lnbmVkIGxvbmcpdGluZm8pCisJCSYmIChwIDwgKHVuc2lnbmVkIGxvbmcpdGluZm8gKyBUSFJFQURfU0laRSAtIDMpOworfQorCisvKiBjb3BpZWQgZnJvbSBhcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYyAqLworc3RhdGljIHN0cnVjdCBmcmFtZV9oZWFkICpkdW1wX3VzZXJfYmFja3RyYWNlKHN0cnVjdCBmcmFtZV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBmcmFtZV9oZWFkIGJ1ZmhlYWRbMl07CisKKwkvKiBBbHNvIGNoZWNrIGFjY2Vzc2liaWxpdHkgb2Ygb25lIHN0cnVjdCBmcmFtZV9oZWFkIGJleW9uZCAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhidWZoZWFkLCBoZWFkLCBzaXplb2YoYnVmaGVhZCkpKQorCQlyZXR1cm4gTlVMTDsKKworCW9wcm9maWxlX2FkZF90cmFjZShidWZoZWFkWzBdLmxyKTsKKworCS8qIGZyYW1lIHBvaW50ZXJzIHNob3VsZCBzdHJpY3RseSBwcm9ncmVzcyBiYWNrIHVwIHRoZSBzdGFjaworCSAqICh0b3dhcmRzIGhpZ2hlciBhZGRyZXNzZXMpICovCisJaWYgKGJ1ZmhlYWRbMF0uZnAgPD0gaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gYnVmaGVhZFswXS5mcDsKK30KKwordm9pZCBhdnIzMl9iYWNrdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJLyogR2V0IGZpcnN0IGZyYW1lIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZnJhbWVfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZnJhbWVfaGVhZCAqKShyZWdzLT5yNyk7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJCS8qCisJCSAqIFRyYXZlcnNlIHRoZSBrZXJuZWwgc3RhY2sgZnJvbSBmcmFtZSB0byBmcmFtZSB1cCB0bworCQkgKiAiZGVwdGgiIHN0ZXBzLgorCQkgKi8KKwkJd2hpbGUgKGRlcHRoLS0gJiYgdmFsaWRfc3RhY2tfcHRyKHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCksCisJCQkJCQkgICh1bnNpZ25lZCBsb25nKWhlYWQpKSB7CisJCQlvcHJvZmlsZV9hZGRfdHJhY2UoaGVhZC0+bHIpOworCQkJaWYgKGhlYWQtPmZwIDw9IGhlYWQpCisJCQkJYnJlYWs7CisJCQloZWFkID0gaGVhZC0+ZnA7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIEFzc3VtZSB3ZSBoYXZlIGZyYW1lIHBvaW50ZXJzIGluIHVzZXIgbW9kZSBwcm9jZXNzICovCisJCXdoaWxlIChkZXB0aC0tICYmIGhlYWQpCisJCQloZWFkID0gZHVtcF91c2VyX2JhY2t0cmFjZShoZWFkKTsKKwl9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9vcHJvZmlsZS9vcF9tb2RlbF9hdnIzMi5jIGIvYXJjaC9hdnIzMi9vcHJvZmlsZS9vcF9tb2RlbF9hdnIzMi5jCmluZGV4IGRmNDIzMjUuLmEzZTliM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvb3Byb2ZpbGUvb3BfbW9kZWxfYXZyMzIuYworKysgYi9hcmNoL2F2cjMyL29wcm9maWxlL29wX21vZGVsX2F2cjMyLmMKQEAgLTIyLDYgKzIyLDggQEAKICNkZWZpbmUgQVZSMzJfUEVSRkNUUl9JUlFfR1JPVVAJMAogI2RlZmluZSBBVlIzMl9QRVJGQ1RSX0lSUV9MSU5FCTEKIAordm9pZCBhdnIzMl9iYWNrdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpOworCiBlbnVtIHsgUENDTlQsIFBDTlQwLCBQQ05UMSwgTlJfY291bnRlciB9OwogCiBzdHJ1Y3QgYXZyMzJfcGVyZl9jb3VudGVyIHsKQEAgLTIyMyw2ICsyMjUsOCBAQAogCW1lbWNweShvcHMsICZhdnIzMl9wZXJmX2NvdW50ZXJfb3BzLAogCQkJc2l6ZW9mKHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zKSk7CiAKKwlvcHMtPmJhY2t0cmFjZSA9IGF2cjMyX2JhY2t0cmFjZTsKKwogCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyBBVlIzMiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLlxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwppbmRleCA0MTU0ZmYxLi44MTAyYzc5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnCkBAIC0xNjIsMTYgKzE2MiwyOCBAQAogY29uZmlnIEJGNTYxCiAJYm9vbCAiQkY1NjEiCiAJaGVscAotCSAgTm90IFN1cHBvcnRlZCBZZXQgLSBXb3JrIGluIHByb2dyZXNzIC0gQkY1NjEgUHJvY2Vzc29yIFN1cHBvcnQuCisJICBCRjU2MSBQcm9jZXNzb3IgU3VwcG9ydC4KIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBCRl9SRVZfTUlOCisJaW50CisJZGVmYXVsdCAwIGlmIChCRjUyeCB8fCBCRjU0eCkKKwlkZWZhdWx0IDIgaWYgKEJGNTM3IHx8IEJGNTM2IHx8IEJGNTM0KQorCWRlZmF1bHQgMyBpZiAoQkY1NjEgfHxCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKworY29uZmlnIEJGX1JFVl9NQVgKKwlpbnQKKwlkZWZhdWx0IDIgaWYgKEJGNTJ4IHx8IEJGNTR4KQorCWRlZmF1bHQgMyBpZiAoQkY1MzcgfHwgQkY1MzYgfHwgQkY1MzQpCisJZGVmYXVsdCA1IGlmIChCRjU2MSkKKwlkZWZhdWx0IDYgaWYgKEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQorCiBjaG9pY2UKIAlwcm9tcHQgIlNpbGljb24gUmV2IgotCWRlZmF1bHQgQkZfUkVWXzBfMSBpZiBCRjUyNwotCWRlZmF1bHQgQkZfUkVWXzBfMiBpZiBCRjUzNwotCWRlZmF1bHQgQkZfUkVWXzBfMyBpZiBCRjUzMwotCWRlZmF1bHQgQkZfUkVWXzBfMCBpZiBCRjU0OQorCWRlZmF1bHQgQkZfUkVWXzBfMSBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCBCRl9SRVZfMF8yIGlmIChCRjUzNCB8fCBCRjUzNiB8fCBCRjUzNykKKwlkZWZhdWx0IEJGX1JFVl8wXzMgaWYgKEJGNTMxIHx8IEJGNTMyIHx8IEJGNTMzIHx8IEJGNTYxKQogCiBjb25maWcgQkZfUkVWXzBfMAogCWJvb2wgIjAuMCIKQEAgLTE4Myw3ICsxOTUsNyBAQAogCiBjb25maWcgQkZfUkVWXzBfMgogCWJvb2wgIjAuMiIKLQlkZXBlbmRzIG9uIChCRjUzNyB8fCBCRjUzNiB8fCBCRjUzNCkKKwlkZXBlbmRzIG9uIChCRjUyeCB8fCBCRjUzNyB8fCBCRjUzNiB8fCBCRjUzNCB8fCBCRjU0eCkKIAogY29uZmlnIEJGX1JFVl8wXzMKIAlib29sICIwLjMiCkBAIC0xOTcsNiArMjA5LDEwIEBACiAJYm9vbCAiMC41IgogCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQogCitjb25maWcgQkZfUkVWXzBfNgorCWJvb2wgIjAuNiIKKwlkZXBlbmRzIG9uIChCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKwogY29uZmlnIEJGX1JFVl9BTlkKIAlib29sICJhbnkiCiAKQEAgLTI0OSw3ICsyNjUsNyBAQAogCiBjb25maWcgTUVNX01UNDhMQzMyTTE2QTJUR183NQogCWJvb2wKLQlkZXBlbmRzIG9uIChCRklONTI3X0VaS0lUIHx8IEJGSU41MzJfSVAwWCB8fCBCTEFDS1NUQU1QKQorCWRlcGVuZHMgb24gKEJGSU41MjdfRVpLSVQgfHwgQkZJTjUzMl9JUDBYIHx8IEJMQUNLU1RBTVAgfHwgQkZJTjUyNl9FWkJSRCkKIAlkZWZhdWx0IHkKIAogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZyIKQEAgLTI4NiwxMyArMzAyLDIwIEBACiAJICBtZW1vcnkgcmVnaW9uIGlzIHVzZWQgdG8gY2FwdHVyZSBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlcyBhcyB3ZWxsCiAJICBhcyBzb21lIGNvcmUga2VybmVsIGZ1bmN0aW9ucy4KIAorY29uZmlnIFJPTV9CQVNFCisJaGV4ICJLZXJuZWwgUk9NIEJhc2UiCisJZGVmYXVsdCAiMHgyMDA0MDAwMCIKKwlyYW5nZSAweDIwMDAwMDAwIDB4MjA0MDAwMDAgaWYgIShCRjU0eCB8fCBCRjU2MSkKKwlyYW5nZSAweDIwMDAwMDAwIDB4MzAwMDAwMDAgaWYgKEJGNTR4IHx8IEJGNTYxKQorCWhlbHAKKwogY29tbWVudCAiQ2xvY2svUExMIFNldHVwIgogCiBjb25maWcgQ0xLSU5fSFoKIAlpbnQgIkZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCBvbiB0aGUgYm9hcmQgaW4gSHoiCiAJZGVmYXVsdCAiMTEwNTkyMDAiIGlmIEJGSU41MzNfU1RBTVAKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQkZJTjUzM19FWktJVAotCWRlZmF1bHQgIjI1MDAwMDAwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCkKKwlkZWZhdWx0ICIyNTAwMDAwMCIgaWYgKEJGSU41MzdfU1RBTVAgfHwgQkZJTjUyN19FWktJVCB8fCBIODYwNl9IVlNJU1RFTUFTIHx8IEJMQUNLU1RBTVAgfHwgQkZJTjUyNl9FWkJSRCkKIAlkZWZhdWx0ICIzMDAwMDAwMCIgaWYgQkZJTjU2MV9FWktJVAogCWRlZmF1bHQgIjI0NTc2MDAwIiBpZiBQTkFWMTAKIAlkZWZhdWx0ICIxMDAwMDAwMCIgaWYgQkZJTjUzMl9JUDBYCkBAIC0zMzIsNyArMzU1LDcgQEAKIAlkZWZhdWx0ICIyMiIgaWYgQkZJTjUzM19CTFVFVEVDSE5JWF9DTQogCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19CTFVFVEVDSE5JWF9DTSB8fCBCRklONTI3X0JMVUVURUNITklYX0NNIHx8IEJGSU41NjFfQkxVRVRFQ0hOSVhfQ00pCiAJZGVmYXVsdCAiMjAiIGlmIEJGSU41NjFfRVpLSVQKLQlkZWZhdWx0ICIxNiIgaWYgKEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCkKKwlkZWZhdWx0ICIxNiIgaWYgKEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQogCWhlbHAKIAkgIFRoaXMgY29udHJvbHMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgb24tY2hpcCBQTEwuIFRoaXMgY2FuIGJlIGJldHdlZW4gMSBhbmQgNjQuCiAJICBQTEwgRnJlcXVlbmN5ID0gKENyeXN0YWwgRnJlcXVlbmN5KSAqICh0aGlzIHNldHRpbmcpCkBAIC0zNjgsMTQgKzM5MSw2IEBACiAJICBUaGlzIGNhbiBiZSBiZXR3ZWVuIDEgYW5kIDE1CiAJICBTeXN0ZW0gQ2xvY2sgPSAoUExMIGZyZXF1ZW5jeSkgLyAodGhpcyBzZXR0aW5nKQogCi1jb25maWcgTUFYX01FTV9TSVpFCi0JaW50ICJNYXggU0RSQU0gTWVtb3J5IFNpemUgaW4gTUJ5dGVzIgotCWRlcGVuZHMgb24gIU1QVQotCWRlZmF1bHQgNTEyCi0JaGVscAotCSAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSBzaXplIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGNyZWF0ZSBDUExCCi0JICB0YWJsZXMgZm9yLiAgWW91ciBzeXN0ZW0gd2lsbCBub3QgYmUgYWJsZSB0byBoYW5kbGUgYW55IG1vcmUuCi0KIGNob2ljZQogCXByb21wdCAiRERSIFNEUkFNIENoaXAgVHlwZSIKIAlkZXBlbmRzIG9uIEJGSU5fS0VSTkVMX0NMT0NLCkBAIC0zODksNiArNDA0LDE0IEBACiAJYm9vbCAiTVQ0NlYzMk0xNl81QiIKIGVuZGNob2ljZQogCitjb25maWcgTUFYX01FTV9TSVpFCisJaW50ICJNYXggU0RSQU0gTWVtb3J5IFNpemUgaW4gTUJ5dGVzIgorCWRlcGVuZHMgb24gIU1QVQorCWRlZmF1bHQgNTEyCisJaGVscAorCSAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSBzaXplIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGNyZWF0ZSBDUExCCisJICB0YWJsZXMgZm9yLiAgWW91ciBzeXN0ZW0gd2lsbCBub3QgYmUgYWJsZSB0byBoYW5kbGUgYW55IG1vcmUuCisKICMKICMgTWF4ICYgTWluIFNwZWVkcyBmb3IgdmFyaW91cyBDaGlwcwogIwpAQCAtNDU1LDggKzQ3OCw2IEBACiAKIHNvdXJjZSBrZXJuZWwvdGltZS9LY29uZmlnCiAKLWNvbW1lbnQgIk1lbW9yeSBTZXR1cCIKLQogY29tbWVudCAiTWlzYyIKIAogY2hvaWNlCkBAIC02MjIsNiArNjQzLDE1IEBACiAJICBJZiBlbmFibGVkLCB0aGUgQ1BMQiBTd2l0Y2ggVGFibGVzIGFyZSBsaW5rZWQKIAkgIGludG8gTDEgZGF0YSBtZW1vcnkuIChsZXNzIGxhdGVuY3kpCiAKK2NvbmZpZyBBUFBfU1RBQ0tfTDEKKwlib29sICJTdXBwb3J0IGxvY2F0aW5nIGFwcGxpY2F0aW9uIHN0YWNrIGluIEwxIFNjcmF0Y2ggTWVtb3J5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIGVuYWJsZWQgdGhlIGFwcGxpY2F0aW9uIHN0YWNrIGNhbiBiZSBsb2NhdGVkIGluIEwxCisJICBzY3JhdGNoIG1lbW9yeSAobGVzcyBsYXRlbmN5KS4KKworCSAgQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBGTEFUIGJpbmFyaWVzLgorCiBjb21tZW50ICJTcGVlZCBPcHRpbWl6YXRpb25zIgogY29uZmlnIEJGSU5fSU5TX0xPV09WRVJIRUFECiAJYm9vbCAiaW5zW2J3bF0gbG93IG92ZXJoZWFkLCBoaWdoZXIgaW50ZXJydXB0IGxhdGVuY3kiCkBAIC03NTUsNiArNzg1LDEzIEBACiAKIGVuZGNob2ljZQogCitjb25maWcgQkZJTl9MMl9DQUNIRUFCTEUKKwlib29sICJDYWNoZSBMMiBTUkFNIgorCWRlcGVuZHMgb24gKEJGSU5fRENBQ0hFIHx8IEJGSU5fSUNBQ0hFKSAmJiAoQkY1NHggfHwgQkY1NjEpCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VsZWN0IHRvIG1ha2UgTDIgU1JBTSBjYWNoZWFibGUgaW4gTDEgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGUuCisKIGNvbmZpZyBNUFUKIAlib29sICJFbmFibGUgdGhlIG1lbW9yeSBwcm90ZWN0aW9uIHVuaXQgKEVYUEVSSU1FTlRBTCkiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcKaW5kZXggYzQ2ODYyNC4uM2FkMjU5OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZwpAQCAtMiw2ICsyLDIyIEBACiAKIHNvdXJjZSAibGliL0tjb25maWcuZGVidWciCiAKK2NvbmZpZyBIQVZFX0FSQ0hfS0dEQgorICAgICAgIGRlZl9ib29sIHkKKworY29uZmlnIERFQlVHX1ZFUkJPU0UKKwlib29sICJWZXJib3NlIGZhdWx0IG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQUklOVEsKKwloZWxwCisJICBXaGVuIGEgcHJvZ3JhbSBjcmFzaGVzIGR1ZSB0byBhbiBleGNlcHRpb24sIG9yIHRoZSBrZXJuZWwgZGV0ZWN0cworCSAgYW4gaW50ZXJuYWwgZXJyb3IsIHRoZSBrZXJuZWwgY2FuIHByaW50IGEgbm90IHNvIGJyaWVmIG1lc3NhZ2UKKwkgIGV4cGxhaW5pbmcgd2hhdCB0aGUgcHJvYmxlbSB3YXMuIFRoaXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzCisJICB1c2VmdWwgdG8gZGV2ZWxvcGVycyBhbmQga2VybmVsIGhhY2tlcnMgd2hlbiB0cmFja2luZyBkb3duIHByb2JsZW1zLAorCSAgYnV0IG1vc3RseSBtZWFuaW5nbGVzcyB0byBvdGhlciBwZW9wbGUuIFRoaXMgaXMgYWx3YXlzIGhlbHBmdWwgZm9yCisJICBkZWJ1Z2dpbmcgYnV0IHNlcnZlcyBubyBwdXJwb3NlIG9uIGEgcHJvZHVjdGlvbiBzeXN0ZW0uCisJICBNb3N0IHBlb3BsZSBzaG91bGQgc2F5IE4gaGVyZS4KKwogY29uZmlnIERFQlVHX01NUlMKIAlib29sICJHZW5lcmF0ZSBCbGFja2ZpbiBNTVIgdHJlZSIKIAlzZWxlY3QgREVCVUdfRlMKQEAgLTIyLDYgKzM4LDQ0IEBACiAJICBoYXJkd2FyZSBlcnJvciBpbnRlcnJ1cHRzIGFuZCBuZWVkIHRvIGtub3cgd2hlcmUgdGhleSBhcmUgY29taW5nCiAJICBmcm9tLgogCitjb25maWcgREVCVUdfRE9VQkxFRkFVTFQKKwlib29sICJEZWJ1ZyBEb3VibGUgRmF1bHRzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIGFuIGV4Y2VwdGlvbiBpcyBjYXVzZWQgd2hpbGUgZXhlY3V0aW5nIGNvZGUgd2l0aGluIHRoZSBleGNlcHRpb24KKwkgIGhhbmRsZXIsIHRoZSBOTUkgaGFuZGxlciwgdGhlIHJlc2V0IHZlY3Rvciwgb3IgaW4gZW11bGF0b3IgbW9kZSwKKwkgIGEgZG91YmxlIGZhdWx0IG9jY3Vycy4gT24gdGhlIEJsYWNrZmluLCB0aGlzIGlzIGEgdW5yZWNvdmVyYWJsZQorCSAgZXZlbnQuIFlvdSBoYXZlIHR3byBvcHRpb25zOgorCSAgLSBSRVNFVCBleGFjdGx5IHdoZW4gZG91YmxlIGZhdWx0IG9jY3Vycy4gVGhlIGV4Y2VwdGluZworCSAgICBpbnN0cnVjdGlvbiBhZGRyZXNzIGlzIHN0b3JlZCBpbiBSRVRYLCB3aGVyZSB0aGUgbmV4dCBrZXJuZWwKKwkgICAgYm9vdCB3aWxsIHByaW50IGl0IG91dC4KKwkgIC0gUHJpbnQgZGVidWcgbWVzc2FnZS4gVGhpcyBpcyBtdWNoIG1vcmUgZXJyb3IgcHJvbmUsIGFsdGhvdWdoCisJICAgIGVhc2llciB0byBoYW5kbGUuIEl0IGlzIGVycm9yIHByb25lIHNpbmNlOgorCSAgICAtIFRoZSBleGNlcHRpbmcgaW5zdHJ1Y3Rpb24gaXMgbm90IGNvbW1pdHRlZC4KKwkgICAgLSBBbGwgd3JpdGViYWNrcyBmcm9tIHRoZSBpbnN0cnVjdGlvbiBhcmUgcHJldmVudGVkLgorCSAgICAtIFRoZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIGlzIG5vdCB0YWtlbi4KKwkgICAgLSBUaGUgRVhDQVVTRSBmaWVsZCBpcyB1cGRhdGVkIHdpdGggYW4gdW5yZWNvdmVyYWJsZSBldmVudAorCSAgICBUaGUgb25seSB3YXkgdG8gY2hlY2sgdGhpcyBpcyB0byBzZWUgaWYgRVhDQVVTRSBjb250YWlucyB0aGUKKwkgICAgdW5yZWNvdmVyYWJsZSBldmVudCB2YWx1ZSBhdCBldmVyeSBleGNlcHRpb24gcmV0dXJuLiBCeSBzZWxlY3RpbmcKKwkgICAgdGhpcyBvcHRpb24sIHlvdSBhcmUgc2tpcHBpbmcgb3ZlciB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIGFuZCAKKwkgICAgaG9waW5nIHRoaW5ncyBzdGF5IHRvZ2V0aGVyIGVub3VnaCB0byBwcmludCBvdXQgYSBkZWJ1ZyBtZXNzYWdlLgorCisJICBUaGlzIGRvZXMgYWRkIGEgbGl0dGxlIGtlcm5lbCBjb2RlLCBidXQgaXMgdGhlIG9ubHkgbWV0aG9kIHRvIGRlYnVnCisJICBkb3VibGUgZmF1bHRzIC0gaWYgdW5zdXJlIHNheSAiWSIKKworY2hvaWNlCisJcHJvbXB0ICJEb3VibGUgRmF1bHQgRmFpbHVyZSBNZXRob2QiCisJZGVmYXVsdCBERUJVR19ET1VCTEVGQVVMVF9QUklOVAorCWRlcGVuZHMgb24gREVCVUdfRE9VQkxFRkFVTFQKKworY29uZmlnIERFQlVHX0RPVUJMRUZBVUxUX1BSSU5UCisJYm9vbCAiUHJpbnQiCisKK2NvbmZpZyBERUJVR19ET1VCTEVGQVVMVF9SRVNFVAorCWJvb2wgIlJlc2V0IgorCitlbmRjaG9pY2UKKwogY29uZmlnIERFQlVHX0lDQUNIRV9DSEVDSwogCWJvb2wgIkNoZWNrIEluc3RydWN0aW9uIGNhY2hlIGNvaGVyZW5jeSIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApAQCAtMTQzLDYgKzE5Nyw3IEBACiBjb25maWcgRUFSTFlfUFJJTlRLCiAJYm9vbCAiRWFybHkgcHJpbnRrIiAKIAlkZWZhdWx0IG4KKwlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3BlY2lhbCBjb25zb2xlIGRyaXZlcnMgd2hpY2ggYWxsb3cgdGhlIGtlcm5lbAogCSAgdG8gcHJpbnQgbWVzc2FnZXMgdmVyeSBlYXJseSBpbiB0aGUgYm9vdHVwIHByb2Nlc3MuCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCBlYWMwNTMzLi42YmY1MDk3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTY3LDYgKzY3LDcgQEAKIHJldi0kKENPTkZJR19CRl9SRVZfMF8zKSAgOj0gMC4zCiByZXYtJChDT05GSUdfQkZfUkVWXzBfNCkgIDo9IDAuNAogcmV2LSQoQ09ORklHX0JGX1JFVl8wXzUpICA6PSAwLjUKK3Jldi0kKENPTkZJR19CRl9SRVZfMF82KSAgOj0gMC42CiByZXYtJChDT05GSUdfQkZfUkVWX05PTkUpIDo9IG5vbmUKIHJldi0kKENPTkZJR19CRl9SRVZfQU5ZKSAgOj0gYW55CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNi1FWkJSRF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDNhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTQyNyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LjMKKyMgVGh1IEF1ZyAyOCAxNjo0OTo1MyAyMDA4CisjCisjIENPTkZJR19NTVUgaXMgbm90IHNldAorIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKKyMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEFDS0ZJTj15CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE0CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfS1BST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0tSRVRQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKK0NPTkZJR19USU5ZX1NITUVNPXkKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucworIworCisjCisjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKKyMKKyMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI1IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUyNj15CisjIENPTkZJR19CRjUyNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWXzBfMD15CisjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfQkY1Mng9eQorQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzU9eQorIyBDT05GSUdfQkZJTjUyN19FWktJVCBpcyBub3Qgc2V0CisjIENPTkZJR19CRklONTI3X0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKK0NPTkZJR19CRklONTI2X0VaQlJEPXkKKworIworIyBCRjUyNyBTcGVjaWZpYyBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgQWx0ZXJuYXRpdmUgTXVsdGlwbGV4aW5nIFNjaGVtZQorIworIyBDT05GSUdfQkY1MjdfU1BPUlQwX1BPUlRGIGlzIG5vdCBzZXQKK0NPTkZJR19CRjUyN19TUE9SVDBfUE9SVEc9eQorQ09ORklHX0JGNTI3X1NQT1JUMF9UU0NMS19QRzEwPXkKKyMgQ09ORklHX0JGNTI3X1NQT1JUMF9UU0NMS19QRzE0IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUyN19VQVJUMV9QT1JURj15CisjIENPTkZJR19CRjUyN19VQVJUMV9QT1JURyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyN19OQU5EX0RfUE9SVEYgaXMgbm90IHNldAorQ09ORklHX0JGNTI3X05BTkRfRF9QT1JUSD15CisKKyMKKyMgSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQKKyMKKworIworIyBQcmlvcml0eQorIworQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfU1BJPTEwCitDT05GSUdfSVJRX1VBUlQwX1JYPTEwCitDT05GSUdfSVJRX1VBUlQwX1RYPTEwCitDT05GSUdfSVJRX1VBUlQxX1JYPTEwCitDT05GSUdfSVJRX1VBUlQxX1RYPTEwCitDT05GSUdfSVJRX09QVFNFQz0xMQorQ09ORklHX0lSUV9DTlQ9MTEKK0NPTkZJR19JUlFfTUFDX1JYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKK0NPTkZJR19JUlFfTUFDX1RYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKK0NPTkZJR19JUlFfVE1SMD0xMgorQ09ORklHX0lSUV9UTVIxPTEyCitDT05GSUdfSVJRX1RNUjI9MTIKK0NPTkZJR19JUlFfVE1SMz0xMgorQ09ORklHX0lSUV9UTVI0PTEyCitDT05GSUdfSVJRX1RNUjU9MTIKK0NPTkZJR19JUlFfVE1SNj0xMgorQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgorQ09ORklHX0lSUV9NRU1fRE1BMD0xMworQ09ORklHX0lSUV9NRU1fRE1BMT0xMworQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9QT1JURl9JTlRBPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEI9MTMKK0NPTkZJR19JUlFfU1BJX0VSUk9SPTcKK0NPTkZJR19JUlFfTkZDX0VSUk9SPTcKK0NPTkZJR19JUlFfSERNQV9FUlJPUj03CitDT05GSUdfSVJRX0hETUE9NworQ09ORklHX0lSUV9VU0JfRUlOVD0xMAorQ09ORklHX0lSUV9VU0JfSU5UMD0xMQorQ09ORklHX0lSUV9VU0JfSU5UMT0xMQorQ09ORklHX0lSUV9VU0JfSU5UMj0xMQorQ09ORklHX0lSUV9VU0JfRE1BPTExCisKKyMKKyMgQm9hcmQgY3VzdG9taXphdGlvbnMKKyMKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVF9MT0FEPTB4MTAwMAorCisjCisjIENsb2NrL1BMTCBTZXR1cAorIworQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCisjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfTUFYX01FTV9TSVpFPTUxMgorQ09ORklHX01BWF9WQ09fSFo9NDAwMDAwMDAwCitDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMworQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCisKKyMKKyMgS2VybmVsIFRpbWVyL1NjaGVkdWxlcgorIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorCisjCisjIE1lbW9yeSBTZXR1cAorIworCisjCisjIE1pc2MKKyMKK0NPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfQ1lDTEVTIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBLZXJuZWwgT3B0aW1pemF0aW9ucworIworCisjCisjIE1lbW9yeSBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfSV9FTlRSWV9MMT15CitDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDE9eQorQ09ORklHX0RPX0lSUV9MMT15CitDT05GSUdfQ09SRV9USU1FUl9JUlFfTDE9eQorQ09ORklHX0lETEVfTDE9eQorIyBDT05GSUdfU0NIRURVTEVfTDEgaXMgbm90IHNldAorQ09ORklHX0FSSVRITUVUSUNfT1BTX0wxPXkKK0NPTkZJR19BQ0NFU1NfT0tfTDE9eQorIyBDT05GSUdfTUVNU0VUX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTUNQWV9MMSBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfQkZJTl9TUElOTE9DS19MMSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9DSEVDS1NVTV9MMSBpcyBub3Qgc2V0CitDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQorIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQorQ09ORklHX1JBTUtFUk5FTD15CisjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CitDT05GSUdfQkZJTl9ETUFfNVhYPXkKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAorQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CisjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGUgU3VwcG9ydAorIworQ09ORklHX0JGSU5fSUNBQ0hFPXkKK0NPTkZJR19CRklOX0RDQUNIRT15CisjIENPTkZJR19CRklOX0RDQUNIRV9CQU5LQSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX1dCPXkKKyMgQ09ORklHX0JGSU5fV1QgaXMgbm90IHNldAorIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKKworIworIyBBc3luY2hvbm91cyBNZW1vcnkgQ29uZmlndXJhdGlvbgorIworCisjCisjIEVCSVVfQU1HQ1RMIEdsb2JhbCBDb250cm9sCisjCitDT05GSUdfQ19BTUNLRU49eQorQ09ORklHX0NfQ0RQUklPPXkKKyMgQ09ORklHX0NfQU1CRU4gaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMCBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwX0IxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjBfQjFfQjIgaXMgbm90IHNldAorQ09ORklHX0NfQU1CRU5fQUxMPXkKKworIworIyBFQklVX0FNQkNUTCBDb250cm9sCisjCitDT05GSUdfQkFOS18wPTB4N0JCMAorQ09ORklHX0JBTktfMT0weDU1NTQKK0NPTkZJR19CQU5LXzI9MHg3QkIwCitDT05GSUdfQkFOS18zPTB4RkZDMAorCisjCisjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCisjCisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRl9GRFBJQz15CitDT05GSUdfQklORk1UX0ZMQVQ9eQorQ09ORklHX0JJTkZNVF9aRkxBVD15CisjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj1tCitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0pFREVDUFJPQkU9bQorQ09ORklHX01URF9HRU5fUFJPQkU9bQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX1JBTT15CitDT05GSUdfTVREX1JPTT1tCisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD1tCisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9CRklOPW0KK0NPTkZJR19CRklOX05BTkRfQkFTRT0weDIwMjEyMDAwCitDT05GSUdfQkZJTl9OQU5EX0NMRT0yCitDT05GSUdfQkZJTl9OQU5EX0FMRT0xCitDT05GSUdfQkZJTl9OQU5EX1JFQURZPTMKK0NPTkZJR19NVERfTkFORF9JRFM9bQorIyBDT05GSUdfTVREX05BTkRfQkY1WFggaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CitDT05GSUdfQkZJTl9NQUM9eQorQ09ORklHX0JGSU5fVFhfREVTQ19OVU09MTAKK0NPTkZJR19CRklOX1JYX0RFU0NfTlVNPTIwCitDT05GSUdfQkZJTl9NQUNfUk1JST15CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0UxMDAwRV9FTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NSVNDPXkKKyMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXSV9LRVlQQUQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19BRDk5NjAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX0FEQ19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXSV9MQ0QgaXMgbm90IHNldAorQ09ORklHX1NJTVBMRV9HUElPPW0KK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU5fRE1BPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDE9eQorIyBDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1NQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9PVFA9eQorIyBDT05GSUdfQkZJTl9PVFBfV1JJVEVfRU5BQkxFIGlzIG5vdCBzZXQKKworIworIyBDQU4sIHRoZSBjYXIgYnVzIGFuZCBpbmR1c3RyaWFsIGZpZWxkYnVzCisjCisjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9bQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSTJDX0JMQUNLRklOX1RXST15CitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorCisjCisjIFNQSSBQcm90b2NvbCBNYXN0ZXJzCisjCisjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9XRFQ9eQorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD1tCisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTPW0KK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBTUEkgZGV2aWNlcworIworCisjCisjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcworIworIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQkZJTl9BRDczMzExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CRklOX0FENzMzMjIgaXMgbm90IHNldAorCisjCisjIFVTQiBkZXZpY2VzCisjCisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKKyMKK0NPTkZJR19TTkRfU09DPW0KK0NPTkZJR19TTkRfQkY1WFhfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDI9bQorIyBDT05GSUdfU05EX0JGNVhYX0FDOTcgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKKworIworIyBBTFNBIFNvQyBhdWRpbyBmb3IgRnJlZXNjYWxlIFNPQ3MKKyMKKworIworIyBTb0MgQXVkaW8gZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPTUFQCisjCitDT05GSUdfU05EX1NPQ19TU00yNjAyPW0KKworIworIyBPcGVuIFNvdW5kIFN5c3RlbQorIworIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworIyBDT05GSUdfVVNCX0RFVklDRUZTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUI9eQorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTVVTQl9IRFJDPXkKK0NPTkZJR19VU0JfTVVTQl9TT0M9eQorCisjCisjIEJsYWNrZmluIGhpZ2ggc3BlZWQgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfTVVTQl9IT1NUPXkKKyMgQ09ORklHX1VTQl9NVVNCX1BFUklQSEVSQUwgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfT1RHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTVVTQl9IRFJDX0hDRD15CitDT05GSUdfTVVTQl9QSU9fT05MWT15CitDT05GSUdfVVNCX01VU0JfTE9HTEVWRUw9MAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9CRklOPXkKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfRlM9bQorQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKK0NPTkZJR19ZQUZGU19ZQUZGUzI9eQorQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKKyMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKK0NPTkZJR19KRkZTMl9GUz1tCitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz1tCisjIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9bQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTU1SUz15CitDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX1RXTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OPTAKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ1BMQl9JTkZPPXkKK0NPTkZJR19BQ0NFU1NfQ0hFQ0s9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX1JPT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0NDSVRUPW0KKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPW0KK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCmluZGV4IDY2ODU0YTguLjRhMmE2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZwpAQCAtNzcyLDcgKzc3Miw3IEBACiAjCiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLUNPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLUVaS0lUX2RlZmNvbmZpZwppbmRleCA2YmMxMWRiLi5kZWViNWU0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1FWktJVF9kZWZjb25maWcKQEAgLTY3NCw3ICs2NzQsNyBAQAogIwogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldApAQCAtNzQwLDcgKzc0MCw3IEBACiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotQ09ORklHX0RBQj15CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtU1RBTVBfZGVmY29uZmlnCmluZGV4IGQ3N2Q5OTEuLmMyMzI2N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZwpAQCAtNjgxLDcgKzY4MSw3IEBACiAjCiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLUNPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM3LVNUQU1QX2RlZmNvbmZpZwppbmRleCA1ZmQ3YzRiLi42M2EwZjg1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzNy1TVEFNUF9kZWZjb25maWcKQEAgLTczMSw3ICs3MzEsNyBAQAogIyBDT05GSUdfQ0FOX1VOQ1RXSU5DQU4gaXMgbm90IHNldAogQ09ORklHX0NBTl9CTEFDS0ZJTj1tCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKQEAgLTg3MSw3ICs4NzEsNyBAQAogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19EQUI9eQorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZwppbmRleCAzOTA2NjllLi5iZjYzNjYwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcKQEAgLTg1NSw3ICs4NTUsNyBAQAogIwogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldApAQCAtMTAwMSw3ICsxMDAxLDcgQEAKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfREFCPXkKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcKaW5kZXggOTc2YTRkNy4uM2M3MGQ2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnCkBAIC03MTksNyArNzE5LDcgQEAKICMKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKQEAgLTc4NSw3ICs3ODUsNyBAQAogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19EQUI9eQorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZwppbmRleCAwNzk5YWE5Li5iNmExNDYzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUyN19kZWZjb25maWcKQEAgLTY3OSw3ICs2NzksNyBAQAogIwogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcKaW5kZXggMDlkZWVhNC4uYzNiYTkwNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzNfZGVmY29uZmlnCkBAIC02NzIsNyArNjcyLDcgQEAKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfREFCPXkKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZwppbmRleCAyMTlmYzM0Li5jZGM2YjdmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZwpAQCAtNzAzLDcgKzcwMyw3IEBACiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotQ09ORklHX0RBQj15CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzN1VfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKaW5kZXggOTg3M2Q1OC4uZjA3NGJkYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKQEAgLTY4Myw3ICs2ODMsNyBAQAogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19EQUI9eQorIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwppbmRleCAwZTM2MDVmLi41YzQ0ZmRiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKQEAgLTc2Miw3ICs3NjIsNyBAQAogIwogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldApAQCAtOTA5LDcgKzkwOSw3IEBACiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotQ09ORklHX0RBQj15CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NjFfZGVmY29uZmlnCmluZGV4IDU5YzdjZGIuLjA4NmZlNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZwpAQCAtNjg0LDcgKzY4NCw3IEBACiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAotQ09ORklHX0RBQj15CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCmluZGV4IGJhMGJlZTkuLjFmYzMxZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi4xMgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLjE0CiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTE5Miw3ICsxOTIsNyBAQAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAogQ09ORklHX01BWF9WQ09fSFo9NDAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAotQ09ORklHX01BWF9TQ0xLX0haPTEzMzAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwogQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCiAKICMKQEAgLTUxNiw3ICs1MTYsNyBAQAogIwogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX00yNVA4MD15Ci1DT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQ9eQorIyBDT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTYzNSwyNSArNjM1LDI1IEBACiAjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX0VWREVWPW0KK0NPTkZJR19JTlBVVF9FVkRFVj15CiAjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKICMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9HUElPPXkKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTUlTQz15Ci0jIENPTkZJR19JTlBVVF9BVElfUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRjUzWF9QRkJVVFRPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgSS9PIHBvcnRzCkBAIC02ODEsNyArNjgxLDE1IEBACiAjCiAjIFNlcmlhbCBkcml2ZXJzCiAjCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTA9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CisjIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CiAKICMKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hLm91dC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hLm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNkNjUyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNpZm5kZWYgX19CRklOX0FfT1VUX0hfXwotI2RlZmluZSBfX0JGSU5fQV9PVVRfSF9fCi0KLXN0cnVjdCBleGVjIHsKLQl1bnNpZ25lZCBsb25nIGFfaW5mbzsJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLwotCXVuc2lnbmVkIGFfdGV4dDsJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0JdW5zaWduZWQgYV9kYXRhOwkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX3N5bXM7CS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYJCQkJLyogX19CRklOX0FfT1VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oCmluZGV4IDdiYTcwZGUuLjU2ZGNiMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW4tZ2xvYmFsLmgKQEAgLTYzLDcgKzYzLDYgQEAKIGV4dGVybiB2b2lkIGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCk7CiBleHRlcm4gdm9pZCBwcm9ncmFtX0lBUih2b2lkKTsKIAotZXh0ZXJuIHZvaWQgYmZpbl9yZXNldCh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgbG93ZXJfdG9faXJxMTQodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGJmaW5fcmV0dXJuX2Zyb21fZXhjZXB0aW9uKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBldnQxNF9zb2Z0aXJxKHZvaWQpOwpAQCAtOTIsNiArOTEsOCBAQAogZXh0ZXJuIHZvaWQgKnNyYW1fYWxsb2Nfd2l0aF9sc2woc2l6ZV90LCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgc3JhbV9mcmVlX3dpdGhfbHNsKGNvbnN0IHZvaWQqKTsKIAorZXh0ZXJuIHZvaWQgKmlzcmFtX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKKwogZXh0ZXJuIGNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW107CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGJmaW5fc2ljX2l3cltdOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAJX3N0ZXh0X2wyW10sIF9ldGV4dF9sMltdLCBfc2RhdGFfbDJbXSwgX2VkYXRhX2wyW10sIF9zYnNzX2wyW10sCiAJX2Vic3NfbDJbXSwgX2wyX2xtYV9zdGFydFtdOwogCi0vKiBvbmx5IHVzZWQgd2hlbiBDT05GSUdfTVREX1VDTElOVVggKi8KKy8qIG9ubHkgdXNlZCB3aGVuIE1URF9VQ0xJTlVYICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfbXRkX3N0YXJ0LCBtZW1vcnlfbXRkX2VuZCwgbXRkX3NpemU7CiAKICNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTgwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmgKQEAgLTAsMCArMSw4NSBAQAorLyogQmxhY2tmaW4gb24tY2hpcCBST00gQVBJCisgKgorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZST01fSF9fCisjZGVmaW5lIF9fQkZST01fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBQb3NzaWJsZSBzeXNjb250cm9sIGFjdGlvbiBmbGFncyAqLworI2RlZmluZSBTWVNDVFJMX1JFQUQgICAgICAgIDB4MDAwMDAwMDAgICAgLyogcmVhZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1lTQ1RSTF9XUklURSAgICAgICAweDAwMDAwMDAxICAgIC8qIHdyaXRlIHJlZ2lzdGVycyAqLworI2RlZmluZSBTWVNDVFJMX1NZU1JFU0VUICAgIDB4MDAwMDAwMDIgICAgLyogcGVyZm9ybSBzeXN0ZW0gcmVzZXQgKi8KKyNkZWZpbmUgU1lTQ1RSTF9DT1JFUkVTRVQgICAweDAwMDAwMDA0ICAgIC8qIHBlcmZvcm0gY29yZSByZXNldCAqLworI2RlZmluZSBTWVNDVFJMX1NPRlRSRVNFVCAgIDB4MDAwMDAwMDYgICAgLyogcGVyZm9ybSBjb3JlIGFuZCBzeXN0ZW0gcmVzZXQgKi8KKyNkZWZpbmUgU1lTQ1RSTF9WUkNUTCAgICAgICAweDAwMDAwMDEwICAgIC8qIHJlYWQvd3JpdGUgVlJfQ1RMIHJlZ2lzdGVyICovCisjZGVmaW5lIFNZU0NUUkxfRVhUVk9MVEFHRSAgMHgwMDAwMDAyMCAgICAvKiBWRERJTlQgc3VwcGxpZWQgZXh0ZXJuYWxseSAqLworI2RlZmluZSBTWVNDVFJMX0lOVFZPTFRBR0UgIDB4MDAwMDAwMDAgICAgLyogVkRESU5UIGdlbmVyYXRlZCBieSBvbi1jaGlwIHJlZ3VsYXRvciAqLworI2RlZmluZSBTWVNDVFJMX09UUFZPTFRBR0UgIDB4MDAwMDAwNDAgICAgLyogRm9yIEZhY3RvcnkgUHVycG9zZXMgT25seSAqLworI2RlZmluZSBTWVNDVFJMX1BMTENUTCAgICAgIDB4MDAwMDAxMDAgICAgLyogcmVhZC93cml0ZSBQTExfQ1RMIHJlZ2lzdGVyICovCisjZGVmaW5lIFNZU0NUUkxfUExMRElWICAgICAgMHgwMDAwMDIwMCAgICAvKiByZWFkL3dyaXRlIFBMTF9ESVYgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1lTQ1RSTF9MT0NLQ05UICAgICAweDAwMDAwNDAwICAgIC8qIHJlYWQvd3JpdGUgUExMX0xPQ0tDTlQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1lTQ1RSTF9QTExTVEFUICAgICAweDAwMDAwODAwICAgIC8qIHJlYWQvd3JpdGUgUExMX1NUQVQgcmVnaXN0ZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgQURJX1NZU0NUUkxfVkFMVUVTIHsKKwl1aW50MTZfdCB1d1ZyQ3RsOworCXVpbnQxNl90IHV3UGxsQ3RsOworCXVpbnQxNl90IHV3UGxsRGl2OworCXVpbnQxNl90IHV3UGxsTG9ja0NudDsKKwl1aW50MTZfdCB1d1BsbFN0YXQ7Cit9IEFESV9TWVNDVFJMX1ZBTFVFUzsKKworc3RhdGljIHVpbnQzMl90ICgqIGNvbnN0IGJmcm9tX1N5c0NvbnRyb2wpKHVpbnQzMl90IGFjdGlvbl9mbGFncywgQURJX1NZU0NUUkxfVkFMVUVTICpwb3dlcl9zZXR0aW5ncywgdm9pZCAqcmVzZXJ2ZWQpID0gKHZvaWQgKikweEVGMDAwMDM4OworCisvKiBXZSBuZWVkIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHNpbmNlIHdlIG5lZWQgdG8gc2NyZXcgd2l0aCB0aGUgc3RhY2sgcG9pbnRlcgorICogd2hlbiByZXNldHRpbmcuICBUaGUgb24tY2hpcCBST00gd2lsbCBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjaworICogd2hlbiBkb2luZyBhIHN5c3RlbSByZXNldCwgc28gdGhlIHN0YWNrIGNhbm5vdCBiZSBvdXRzaWRlIG9mIHRoZSBjaGlwLgorICovCitfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorc3RhdGljIGlubGluZSB2b2lkIGJmcm9tX1NvZnRSZXNldCh2b2lkICpuZXdfc3RhY2spCit7CisJd2hpbGUgKDEpCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJInNwID0gJVtzdGFja107IgorCQkJImp1bXAgKCVbYmZyb21fc3lzY29udHJvbF0pOyIKKwkJCTogOiBbYmZyb21fc3lzY29udHJvbF0gInAiKGJmcm9tX1N5c0NvbnRyb2wpLAorCQkJCSJxMCIoU1lTQ1RSTF9TT0ZUUkVTRVQpLAorCQkJCSJxMSIoMCksCisJCQkJInEyIihOVUxMKSwKKwkJCQlbc3RhY2tdICJwIihuZXdfc3RhY2spCisJCSk7Cit9CisKKy8qIE9UUCBGdW5jdGlvbnMgKi8KK3N0YXRpYyB1aW50MzJfdCAoKiBjb25zdCBiZnJvbV9PdHBDb21tYW5kKSh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCB2YWx1ZSkgPSAodm9pZCAqKTB4RUYwMDAwMTg7CitzdGF0aWMgdWludDMyX3QgKCogY29uc3QgYmZyb21fT3RwUmVhZCkodWludDMyX3QgcGFnZSwgdWludDMyX3QgZmxhZ3MsIHVpbnQ2NF90ICpwYWdlX2NvbnRlbnQpID0gKHZvaWQgKikweEVGMDAwMDFBOworc3RhdGljIHVpbnQzMl90ICgqIGNvbnN0IGJmcm9tX090cFdyaXRlKSh1aW50MzJfdCBwYWdlLCB1aW50MzJfdCBmbGFncywgdWludDY0X3QgKnBhZ2VfY29udGVudCkgPSAodm9pZCAqKTB4RUYwMDAwMUM7CisKKy8qIG90cCBjb21tYW5kOiBkZWZpbmVzIGZvciAiY29tbWFuZCIgKi8KKyNkZWZpbmUgT1RQX0lOSVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgT1RQX0NMT1NFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyogb3RwIHJlYWQvd3JpdGU6IGRlZmluZXMgZm9yICJmbGFncyIgKi8KKyNkZWZpbmUgT1RQX0xPV0VSX0hBTEYgICAgICAgICAgIDB4MDAwMDAwMDAgLyogc2VsZWN0IHVwcGVyL2xvd2VyIDY0LWJpdCBoYWxmIChiaXQgMCkgKi8KKyNkZWZpbmUgT1RQX1VQUEVSX0hBTEYgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgT1RQX05PX0VDQyAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogZG8gbm90IHVzZSBFQ0MgKi8KKyNkZWZpbmUgT1RQX0xPQ0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgLyogc2V0cyBwYWdlIHByb3RlY3Rpb24gYml0IGZvciBwYWdlICovCisjZGVmaW5lIE9UUF9DSEVDS19GT1JfUFJFVl9XUklURSAweDAwMDAwMDgwCisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGFsbCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgT1RQX1NVQ0NFU1MgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBPVFBfTUFTVEVSX0VSUk9SICAgICAweDAwMQorI2RlZmluZSBPVFBfV1JJVEVfRVJST1IgICAgICAweDAwMworI2RlZmluZSBPVFBfUkVBRF9FUlJPUiAgICAgICAweDAwNQorI2RlZmluZSBPVFBfQUNDX1ZJT19FUlJPUiAgICAweDAwOQorI2RlZmluZSBPVFBfREFUQV9NVUxUX0VSUk9SICAweDAxMQorI2RlZmluZSBPVFBfRUNDX01VTFRfRVJST1IgICAweDAyMQorI2RlZmluZSBPVFBfUFJFVl9XUl9FUlJPUiAgICAweDA0MQorI2RlZmluZSBPVFBfREFUQV9TQl9XQVJOICAgICAweDEwMAorI2RlZmluZSBPVFBfRUNDX1NCX1dBUk4gICAgICAweDIwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggZDgxYTc3NS4uNDQwMzQxNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTMwLDEzICszMCwxMSBAQAogI2lmbmRlZiBfQkxBQ0tGSU5fQ0FDSEVGTFVTSF9ICiAjZGVmaW5lIF9CTEFDS0ZJTl9DQUNIRUZMVVNIX0gKIAotI2luY2x1ZGUgPGFzbS9jcGxiLmg+Ci0KLWV4dGVybiB2b2lkIGJsYWNrZmluX2ljYWNoZV9kY2FjaGVfZmx1c2hfcmFuZ2UodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBibGFja2Zpbl9kZmx1c2hfcGFnZSh2b2lkICopOworZXh0ZXJuIHZvaWQgYmxhY2tmaW5faWNhY2hlX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHJlc3MpOworZXh0ZXJuIHZvaWQgYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmRfYWRkcmVzcyk7CitleHRlcm4gdm9pZCBibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKK2V4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmRfYWRkcmVzcyk7CitleHRlcm4gdm9pZCBibGFja2Zpbl9kZmx1c2hfcGFnZSh2b2lkICpwYWdlKTsKIAogI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX3VubG9jayhtYXBwaW5nKQlkbyB7IH0gd2hpbGUgKDApCkBAIC04Nyw0ICs4NSwyMSBAQAogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfbWVtX2RjYWNoZV9vbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHJlc2VydmVkX21lbV9pY2FjaGVfb247CisKK3N0YXRpYyBpbmxpbmUgaW50IGJmaW5fYWRkcl9kY2FjaGFibGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQorCWlmIChhZGRyIDwgKF9yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCWlmIChyZXNlcnZlZF9tZW1fZGNhY2hlX29uICYmCisJCWFkZHIgPj0gX3JhbWVuZCAmJiBhZGRyIDwgcGh5c2ljYWxfbWVtX2VuZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9JQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCmluZGV4IDA1ZDZmMDUuLjllOGI0MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oCkBAIC01NSw3ICs1NSwxMyBAQAogI2VuZGlmCiAKICNkZWZpbmUgTDFfRE1FTU9SWSAgICAgICAoQ1BMQl9MT0NLIHwgQ1BMQl9DT01NT04pCi0jZGVmaW5lIEwyX01FTU9SWSAgICAgICAgKENQTEJfQ09NTU9OKQorI2lmZGVmIENPTkZJR19CRklOX0wyX0NBQ0hFQUJMRQorI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAoU0RSQU1fSUdFTkVSSUMpCisjZGVmaW5lIEwyX0RNRU1PUlkgICAgICAgIChTRFJBTV9ER0VORVJJQykKKyNlbHNlCisjZGVmaW5lIEwyX0lNRU1PUlkgICAgICAgIChDUExCX0NPTU1PTikKKyNkZWZpbmUgTDJfRE1FTU9SWSAgICAgICAgKENQTEJfQ09NTU9OKQorI2VuZGlmCiAjZGVmaW5lIFNEUkFNX0ROT05fQ0hCTCAgKENQTEJfQ09NTU9OKQogI2RlZmluZSBTRFJBTV9FQklVICAgICAgIChDUExCX0NPTU1PTikKICNkZWZpbmUgU0RSQU1fT09QUyAgICAgICAoQ1BMQl9WQUxJRCB8IEFOT01BTFlfMDUwMDAxNThfV09SS0FST1VORCB8IENQTEJfTE9DSyB8IENQTEJfRElSVFkpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmgKaW5kZXggMGViMWMxYi4uZjg0NWI0MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaApAQCAtODcsOSArODcsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX01QVSAqLwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyByZXNlcnZlZF9tZW1fZGNhY2hlX29uOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbjsKLQotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfY3BsX3RhYmxlcyh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3B1bWFzay5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHVtYXNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGE4ZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHVtYXNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9CTEFDS0ZJTl9DUFVNQVNLX0gKLSNkZWZpbmUgX0FTTV9CTEFDS0ZJTl9DUFVNQVNLX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NwdW1hc2suaD4KLQotI2VuZGlmCQkJCS8qIF9BU01fQkxBQ0tGSU5fQ1BVTUFTS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggMWExM2MyZi4uZWRlNzQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtODAsNCArODAsMTUgQEAKIGV4dGVybiB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCSAgICAgIGludCBuaHdlbnRyaWVzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJZG1hX2FkZHJfdCBoYW5kbGUsIHNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CiAjZW5kaWYJCQkJLyogX0JMQUNLRklOX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDY3YTAzYThhLi5jZGJmY2ZjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZWxmLmgKQEAgLTEyMiw2ICsxMjIsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KChpYmNzMik/UEVSX1NWUjQ6UEVSX0xJTlVYKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCmluZGV4IGNiYmY3ZmYuLjdkYzc3YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTEzNCw2ICsxMzQsMzYgQEAKIGV4dGVybiB2b2lkIGRtYV9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgY291bnQpOwogZXh0ZXJuIHZvaWQgZG1hX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaW5zbCgodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkc3coY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaW5zdygodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkc2IoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaW5zYigodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCW91dHNsKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlc3coY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisJb3V0c3coKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzYihjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlvdXRzYigodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKIC8qCiAgKiBNYXAgc29tZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2tnZGIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20va2dkYi5oCmluZGV4IDBmNzM4NDcuLjI2ZWJhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20va2dkYi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20va2dkYi5oCkBAIC0xMjQsOSArMTI0LDE2IEBACiAvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcmVnaXN0ZXJzLiAgKi8KICNkZWZpbmUgTlVNUkVHQllURVMgQkZJTl9OVU1fUkVHUyo0CiAKLSNkZWZpbmUgQlJFQUtQT0lOVCgpIGFzbSgiICAgRVhDUFQgMjsiKTsKLSNkZWZpbmUgQlJFQUtfSU5TVFJfU0laRSAgICAgICAyCi0jZGVmaW5lIEhXX0JSRUFLUE9JTlRfTlVNCQk2CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9rZ2RiX2JyZWFrcG9pbnQodm9pZCkKK3sKKwlhc20oIiAgIEVYQ1BUIDI7Iik7Cit9CisjZGVmaW5lIEJSRUFLX0lOU1RSX1NJWkUJMgorI2RlZmluZSBDQUNIRV9GTFVTSF9JU19TQUZFCTEKKyNkZWZpbmUgSFdfSU5TVF9XQVRDSFBPSU5UX05VTQk2CisjZGVmaW5lIEhXX1dBVENIUE9JTlRfTlVNCTgKKyNkZWZpbmUgVFlQRV9JTlNUX1dBVENIUE9JTlQJMAorI2RlZmluZSBUWVBFX0RBVEFfV0FUQ0hQT0lOVAkxCiAKIC8qIEluc3RydWN0aW9uIHdhdGNocG9pbnQgYWRkcmVzcyBjb250cm9sIHJlZ2lzdGVyIGJpdHMgbWFzayAqLwogI2RlZmluZSBXUFBXUgkJMHgxCkBAIC0xNjMsMTAgKzE3MCwxMSBAQAogI2RlZmluZSBXUERBRU4xCQkweDgKICNkZWZpbmUgV1BEQ05URU4wCTB4MTAKICNkZWZpbmUgV1BEQ05URU4xCTB4MjAKKwogI2RlZmluZSBXUERTUkMwCQkweGMwCi0jZGVmaW5lIFdQREFDQzAJCTB4MzAwCisjZGVmaW5lIFdQREFDQzBfT0ZGU0VUCTgKICNkZWZpbmUgV1BEU1JDMQkJMHhjMDAKLSNkZWZpbmUgV1BEQUNDMQkJMHgzMDAwCisjZGVmaW5lIFdQREFDQzFfT0ZGU0VUCTEyCiAKIC8qIFdhdGNocG9pbnQgc3RhdHVzIHJlZ2lzdGVyIGJpdHMgbWFzayAqLwogI2RlZmluZSBTVEFUSUEwCQkweDEKQEAgLTE3OCw3ICsxODYsNCBAQAogI2RlZmluZSBTVEFUREEwCQkweDQwCiAjZGVmaW5lIFNUQVREQTEJCTB4ODAKIAotZXh0ZXJuIHZvaWQga2dkYl9wcmludChjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gdm9pZCBpbml0X2tnZGJfdWFydCh2b2lkKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggODUyOTU1Mi4uMzU1OTNkZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtNDUsNDkgKzQ1LDEyIEBACiBleHRlcm4gaW50IGwxc3JhbV9mcmVlKGNvbnN0IHZvaWQqKTsKIGV4dGVybiB2b2lkICpsMXNyYW1fYWxsb2NfbWF4KHZvaWQqKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLX0KLQotLyogQ2FsbGVkIHdoZW4gY3JlYXRpbmcgYSBuZXcgY29udGV4dCBkdXJpbmcgZm9yaygpIG9yIGV4ZWN2ZSgpLiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLSNpZmRlZiBDT05GSUdfTVBVCi0JdW5zaWduZWQgbG9uZyBwID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBwYWdlX21hc2tfb3JkZXIpOwotCW1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2sgPSAodW5zaWduZWQgbG9uZyAqKXA7Ci0JbWVtc2V0KG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2ssIDAsCi0JICAgICAgIHBhZ2VfbWFza19uZWx0cyAqIDMgKiBzaXplb2YobG9uZykpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2wxc3RhY2sodm9pZCkKIHsKIAlucl9sMXN0YWNrX3Rhc2tzLS07CiAJaWYgKG5yX2wxc3RhY2tfdGFza3MgPT0gMCkKIAkJbDFzcmFtX2ZyZWUobDFfc3RhY2tfYmFzZSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXN0cnVjdCBzcmFtX2xpc3Rfc3RydWN0ICp0bXA7Ci0KLQlpZiAoY3VycmVudF9sMV9zdGFja19zYXZlID09IG1tLT5jb250ZXh0LmwxX3N0YWNrX3NhdmUpCi0JCWN1cnJlbnRfbDFfc3RhY2tfc2F2ZSA9IE5VTEw7Ci0JaWYgKG1tLT5jb250ZXh0LmwxX3N0YWNrX3NhdmUpCi0JCWZyZWVfbDFzdGFjaygpOwotCi0Jd2hpbGUgKCh0bXAgPSBtbS0+Y29udGV4dC5zcmFtX2xpc3QpKSB7Ci0JCW1tLT5jb250ZXh0LnNyYW1fbGlzdCA9IHRtcC0+bmV4dDsKLQkJc3JhbV9mcmVlKHRtcC0+YWRkcik7Ci0JCWtmcmVlKHRtcCk7Ci0JfQotI2lmZGVmIENPTkZJR19NUFUKLQlpZiAoY3VycmVudF9yd3hfbWFzayA9PSBtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrKQotCQljdXJyZW50X3J3eF9tYXNrID0gTlVMTDsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2ssIHBhZ2VfbWFza19vcmRlcik7Ci0jZW5kaWYKLX0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBhbGxvY19sMXN0YWNrKHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB1bnNpZ25lZCBsb25nICpzdGFja19iYXNlKQpAQCAtMTM0LDYgKzk3LDcgQEAKIAl9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUFBfU1RBQ0tfTDEKIAkvKiBMMSBzdGFjayBzd2l0Y2hpbmcuICAqLwogCWlmICghbmV4dF9tbS0+Y29udGV4dC5sMV9zdGFja19zYXZlKQogCQlyZXR1cm47CkBAIC0xNDQsNiArMTA4LDcgQEAKIAl9CiAJY3VycmVudF9sMV9zdGFja19zYXZlID0gbmV4dF9tbS0+Y29udGV4dC5sMV9zdGFja19zYXZlOwogCW1lbWNweShsMV9zdGFja19iYXNlLCBjdXJyZW50X2wxX3N0YWNrX3NhdmUsIGwxX3N0YWNrX2xlbik7CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19NUFUKQEAgLTE4MCw0ICsxNDUsNDQgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworfQorCisvKiBDYWxsZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBjb250ZXh0IGR1cmluZyBmb3JrKCkgb3IgZXhlY3ZlKCkuICAqLworc3RhdGljIGlubGluZSBpbnQKK2luaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworI2lmZGVmIENPTkZJR19NUFUKKwl1bnNpZ25lZCBsb25nIHAgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIHBhZ2VfbWFza19vcmRlcik7CisJbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayA9ICh1bnNpZ25lZCBsb25nICopcDsKKwltZW1zZXQobW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaywgMCwKKwkgICAgICAgcGFnZV9tYXNrX25lbHRzICogMyAqIHNpemVvZihsb25nKSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3Qgc3JhbV9saXN0X3N0cnVjdCAqdG1wOworCisjaWZkZWYgQ09ORklHX0FQUF9TVEFDS19MMQorCWlmIChjdXJyZW50X2wxX3N0YWNrX3NhdmUgPT0gbW0tPmNvbnRleHQubDFfc3RhY2tfc2F2ZSkKKwkJY3VycmVudF9sMV9zdGFja19zYXZlID0gMDsKKwlpZiAobW0tPmNvbnRleHQubDFfc3RhY2tfc2F2ZSkKKwkJZnJlZV9sMXN0YWNrKCk7CisjZW5kaWYKKworCXdoaWxlICgodG1wID0gbW0tPmNvbnRleHQuc3JhbV9saXN0KSkgeworCQltbS0+Y29udGV4dC5zcmFtX2xpc3QgPSB0bXAtPm5leHQ7CisJCXNyYW1fZnJlZSh0bXAtPmFkZHIpOworCQlrZnJlZSh0bXApOworCX0KKyNpZmRlZiBDT05GSUdfTVBVCisJaWYgKGN1cnJlbnRfcnd4X21hc2sgPT0gbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaykKKwkJY3VycmVudF9yd3hfbWFzayA9IE5VTEw7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrLCBwYWdlX21hc2tfb3JkZXIpOworI2VuZGlmCit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNmYzOTk1Yi4uZTNlOWI0MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMzQsNiArMTM0LDEyIEBACiAJcmV0dXJuIHJldmlkOwogfQogCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IF9fcHVyZSBiZmluX2NwdWlkKHZvaWQpCit7CisJcmV0dXJuIChiZmluX3JlYWRfQ0hJUElEKCkgJiBDSElQSURfRkFNSUxZKSA+PiAxMjsKKworfQorCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2NvbXBpbGVkX3JldmlkKHZvaWQpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfQkZfUkVWXzBfMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IGE0NWE4MGUuLmUzZjA4NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMTU4LDYgKzE1OCw4IEBACiAjZGVmaW5lIFBUX1NFUVNUQVQgOAogI2RlZmluZSBQVF9JUEVORCA0CiAKKyNkZWZpbmUgUFRfT1JJR19SMCAyMDgKKyNkZWZpbmUgUFRfT1JJR19QMCAyMTIKICNkZWZpbmUgUFRfU1lTQ0ZHIDIxNgogI2RlZmluZSBQVF9URVhUX0FERFIgMjIwCiAjZGVmaW5lIFBUX1RFWFRfRU5EX0FERFIgMjI0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RpbWV4LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RpbWV4LmgKaW5kZXggMjJiMDgwNi4uMjQ4YWViMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGltZXguaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RpbWV4LmgKQEAgLTE2LDcgKzE2LDcgQEAKIHN0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAyOwotCV9fYXNtX18oIiUwID0gY3ljbGVzOyAlMSA9IGN5Y2xlczI7IiA6ICI9ZCIodG1wKSwgIj1kIih0bXAyKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiUwID0gY3ljbGVzOyAlMSA9IGN5Y2xlczI7IiA6ICI9ZCIodG1wKSwgIj1kIih0bXAyKSk7CiAJcmV0dXJuIHRtcCB8ICgoY3ljbGVzX3QpdG1wMiA8PCAzMik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdHJhcHMuaAppbmRleCBmMGU1Zjk0Li4zNGY3Mjk1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90cmFwcy5oCkBAIC01OSw2ICs1OSw5IEBACiAJbGV2ZWwgIiAgIG9yIGEgMTYtYml0IHJlZ2lzdGVyIGlzIGFjY2Vzc2VkIHdpdGggYSAzMi1iaXQgaW5zdHJ1Y3Rpb24uXG4iCiAjZGVmaW5lIEhXQ194MyhsZXZlbCkgXAogCSJFeHRlcm5hbCBNZW1vcnkgQWRkcmVzc2luZyBFcnJvclxuIgorI2RlZmluZSBFWENfMHgwNChsZXZlbCkgXAorCSJVbmltcGxtZW50ZWQgZXhjZXB0aW9uIG9jY3VyZWRcbiIgXAorCWxldmVsICIgLSBNYXliZSB5b3UgZm9yZ290IHRvIGluc3RhbGwgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXI/XG4iCiAjZGVmaW5lIEhXQ194MTIobGV2ZWwpIFwKIAkiUGVyZm9ybWFuY2UgTW9uaXRvciBPdmVyZmxvd1xuIgogI2RlZmluZSBIV0NfeDE4KGxldmVsKSBcCkBAIC04NCw3ICs4Nyw3IEBACiAJbGV2ZWwgIiAgIGEgcGFydGljdWxhciBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uXG4iCiAjZGVmaW5lIEVYQ18weDIyKGxldmVsKSBcCiAJIklsbGVnYWwgaW5zdHJ1Y3Rpb24gY29tYmluYXRpb25cbiIgXAotCWxldmVsICIgLSBTZWUgc2VjdGlvbiBmb3IgbXVsdGktaXNzdWUgcnVsZXMgaW4gdGhlIEFEU1AtQkY1M3ggQmxhY2tmaW5cbiIgXAorCWxldmVsICIgLSBTZWUgc2VjdGlvbiBmb3IgbXVsdGktaXNzdWUgcnVsZXMgaW4gdGhlIEJsYWNrZmluXG4iIFwKIAlsZXZlbCAiICAgUHJvY2Vzc29yIEluc3RydWN0aW9uIFNldCBSZWZlcmVuY2UuXG4iCiAjZGVmaW5lIEVYQ18weDIzKGxldmVsKSBcCiAJIkRhdGEgYWNjZXNzIENQTEIgcHJvdGVjdGlvbiB2aW9sYXRpb25cbiIgXApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggODgxYWZlOS4uOWJiODVkZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC02MCw2ICs2MCw3IEBACiAJREVGSU5FKEtFUk5FTF9TVEFDS19TSVpFLCBUSFJFQURfU0laRSk7CiAKIAkvKiBvZmZzZXRzIGludG8gdGhlIHB0X3JlZ3MgKi8KKwlERUZJTkUoUFRfT1JJR19SMCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfcjApKTsKIAlERUZJTkUoUFRfT1JJR19QMCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfcDApKTsKIAlERUZJTkUoUFRfT1JJR19QQywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfcGMpKTsKIAlERUZJTkUoUFRfUjAsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYwppbmRleCA5MzIyOWIzLi4zMzkyOTNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYwpAQCAtMTE3LDE1ICsxMTcsMTQgQEAKIAogI2lmZGVmIENPTkZJR19CRjU0eAogCWlmIChjaGFubmVsID49IENIX1VBUlQyX1JYICYmIGNoYW5uZWwgPD0gQ0hfVUFSVDNfVFgpIHsKLQkJaWYgKHN0cm5jbXAoZGV2aWNlX2lkLCAiQkZJTl9VQVJUIiwgOSkgPT0gMCkgewotCQkJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnBlcmlwaGVyYWxfbWFwICY9IDB4MEZGRjsKLQkJCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5wZXJpcGhlcmFsX21hcCB8PQorCQl1bnNpZ25lZCBpbnQgcGVyX21hcDsKKwkJcGVyX21hcCA9IGRtYV9jaFtjaGFubmVsXS5yZWdzLT5wZXJpcGhlcmFsX21hcCAmIDB4RkZGOworCQlpZiAoc3RybmNtcChkZXZpY2VfaWQsICJCRklOX1VBUlQiLCA5KSA9PSAwKQorCQkJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnBlcmlwaGVyYWxfbWFwID0gcGVyX21hcCB8CiAJCQkJKChjaGFubmVsIC0gQ0hfVUFSVDJfUlggKyAweEMpPDwxMik7Ci0JCX0gZWxzZSB7Ci0JCQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+cGVyaXBoZXJhbF9tYXAgJj0gMHgwRkZGOwotCQkJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnBlcmlwaGVyYWxfbWFwIHw9CisJCWVsc2UKKwkJCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5wZXJpcGhlcmFsX21hcCA9IHBlcl9tYXAgfAogCQkJCSgoY2hhbm5lbCAtIENIX1VBUlQyX1JYICsgMHg2KTw8MTIpOwotCQl9CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKaW5kZXggZWNiZDE0MS4uNmUwOGY0MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKQEAgLTIzMSwxNCArMjMxLDE0IEBACiB9CiAjZW5kaWYKIAotdm9pZCBncGlvX2Vycm9yKHVuc2lnbmVkIGdwaW8pCitzdGF0aWMgdm9pZCBncGlvX2Vycm9yKHVuc2lnbmVkIGdwaW8pCiB7CiAJcHJpbnRrKEtFUk5fRVJSICJiZmluLWdwaW86IEdQSU8gJWQgd2Fzbid0IHJlcXVlc3RlZCFcbiIsIGdwaW8pOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfbGFiZWwodW5zaWduZWQgc2hvcnQgaWRlbnQsIGNvbnN0IGNoYXIgKmxhYmVsKQogewotCWlmIChsYWJlbCAmJiBzdHJfaWRlbnQpIHsKKwlpZiAobGFiZWwpIHsKIAkJc3RybmNweShzdHJfaWRlbnRbaWRlbnRdLm5hbWUsIGxhYmVsLAogCQkJIFJFU09VUkNFX0xBQkVMX1NJWkUpOwogCQlzdHJfaWRlbnRbaWRlbnRdLm5hbWVbUkVTT1VSQ0VfTEFCRUxfU0laRSAtIDFdID0gMDsKQEAgLTI0Nyw5ICsyNDcsNiBAQAogCiBzdGF0aWMgY2hhciAqZ2V0X2xhYmVsKHVuc2lnbmVkIHNob3J0IGlkZW50KQogewotCWlmICghc3RyX2lkZW50KQotCQlyZXR1cm4gIlVOS05PV04iOwotCiAJcmV0dXJuICgqc3RyX2lkZW50W2lkZW50XS5uYW1lID8gc3RyX2lkZW50W2lkZW50XS5uYW1lIDogIlVOS05PV04iKTsKIH0KIApAQCAtMjYwLDcgKzI1Nyw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiUGxlYXNlIHByb3ZpZGUgbm9uZS1udWxsIGxhYmVsXG4iKTsKIAl9CiAKLQlpZiAobGFiZWwgJiYgc3RyX2lkZW50KQorCWlmIChsYWJlbCkKIAkJcmV0dXJuIHN0cm5jbXAoc3RyX2lkZW50W2lkZW50XS5uYW1lLAogCQkJCSBsYWJlbCwgc3RybGVuKGxhYmVsKSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKaW5kZXggNDgwNjAxMC4uNTVhZjcyOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCkBAIC0zNiw3ICszNiw3IEBACiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGIsIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwogaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLXZvaWQgX19pbml0IGdlbmVyYXRlX2NwbF90YWJsZXModm9pZCkKK3ZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCiB7CiAJaW50IGlfZCwgaV9pOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTgzLDggKzgzLDE4IEBACiAJZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwxX0RBVEFfQV9TVEFSVDsKIAlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBMMV9ETUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKICNlbmRpZgorI2lmIEwxX0NPREVfTEVOR1RIID4gMAogCWljcGxiX3RibFtpX2ldLmFkZHIgPSBMMV9DT0RFX1NUQVJUOwogCWljcGxiX3RibFtpX2krK10uZGF0YSA9IEwxX0lNRU1PUlkgfCBQQUdFX1NJWkVfNE1COworI2VuZGlmCisKKwkvKiBDb3ZlciBMMiBtZW1vcnkgKi8KKyNpZiBMMl9MRU5HVEggPiAwCisJZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwyX1NUQVJUOworCWRjcGxiX3RibFtpX2QrK10uZGF0YSA9IEwyX0RNRU1PUlkgfCBQQUdFX1NJWkVfMU1COworCWljcGxiX3RibFtpX2ldLmFkZHIgPSBMMl9TVEFSVDsKKwlpY3BsYl90YmxbaV9pKytdLmRhdGEgPSBMMl9JTUVNT1JZIHwgUEFHRV9TSVpFXzFNQjsKKyNlbmRpZgogCiAJZmlyc3RfbWFza19kY3BsYiA9IGlfZDsKIAlmaXJzdF9zd2l0Y2hlZF9kY3BsYiA9IGlfZCArICgxIDw8IHBhZ2VfbWFza19vcmRlcik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKaW5kZXggOTlmMjgzMS4uYmFhNTJlMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCkBAIC0xNDQsOSArMTQ1LDcgQEAKIAogCWRfZGF0YSA9IENQTEJfU1VQVl9XUiB8IENQTEJfVkFMSUQgfCBDUExCX0RJUlRZIHwgUEFHRV9TSVpFXzRLQjsKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKLQlpZiAoYWRkciA8IF9yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OIHx8Ci0JICAgIChyZXNlcnZlZF9tZW1fZGNhY2hlX29uICYmIGFkZHIgPj0gX3JhbWVuZCAmJgotCSAgICAgYWRkciA8IHBoeXNpY2FsX21lbV9lbmQpKSB7CisJaWYgKGJmaW5fYWRkcl9kY2FjaGFibGUoYWRkcikpIHsKIAkJZF9kYXRhIHw9IENQTEJfTDFfQ0hCTCB8IEFOT01BTFlfMDUwMDAxNThfV09SS0FST1VORDsKICNpZmRlZiBDT05GSUdfQkZJTl9XVAogCQlkX2RhdGEgfD0gQ1BMQl9MMV9BT1cgfCBDUExCX1dUOwpAQCAtMzIyLDkgKzMyMSwxMSBAQAogdm9pZCBmbHVzaF9zd2l0Y2hlZF9jcGxicyh2b2lkKQogewogCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlucl9jcGxiX2ZsdXNoKys7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZGlzYWJsZV9pY3BsYigpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKIAkJaWNwbGJfdGJsW2ldLmRhdGEgPSAwOwpAQCAtMzM4LDYgKzMzOSw4IEBACiAJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCAwKTsKIAl9CiAJZW5hYmxlX2RjcGxiKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCiB9CiAKIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKm1hc2tzKQpAQCAtMzQ1LDEwICszNDgsMTUgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZyltYXNrczsKIAl1bnNpZ25lZCBsb25nIGRfZGF0YTsKLQljdXJyZW50X3J3eF9tYXNrID0gbWFza3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghbWFza3MpCisJaWYgKCFtYXNrcykgeworCQljdXJyZW50X3J3eF9tYXNrID0gbWFza3M7CiAJCXJldHVybjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3VycmVudF9yd3hfbWFzayA9IG1hc2tzOwogCiAJZF9kYXRhID0gQ1BMQl9TVVBWX1dSIHwgQ1BMQl9WQUxJRCB8IENQTEJfRElSVFkgfCBQQUdFX1NJWkVfNEtCOwogI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQpAQCAtMzY3LDQgKzM3NSw1IEBACiAJCWFkZHIgKz0gUEFHRV9TSVpFOwogCX0KIAllbmFibGVfZGNwbGIoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKaW5kZXggNzI4ZjcwOC4uNTEyZjhjOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY3BsYi5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogCkBAIC0xNjgsOCArMTY5LDggQEAKIAkJLmVuZCA9IEwyX1NUQVJUICsgTDJfTEVOR1RILAogCQkucHNpemUgPSBTSVpFXzFNLAogCQkuYXR0ciA9IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCLAotCQkuaV9jb25mID0gTDJfTUVNT1JZLAotCQkuZF9jb25mID0gTDJfTUVNT1JZLAorCQkuaV9jb25mID0gTDJfSU1FTU9SWSwKKwkJLmRfY29uZiA9IEwyX0RNRU1PUlksCiAJCS52YWxpZCA9IChMMl9MRU5HVEggPiAwKSwKIAkJLm5hbWUgPSAiTDIgTWVtb3J5IiwKIAl9LApAQCAtMzA4LDcgKzMwOSw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxfdGFibGVzKHZvaWQpCit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlcyh2b2lkKQogewogCiAJdTE2IGksIGosIHByb2Nlc3M7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IDYwZjY3ZjkuLjFmNGUzZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0zNSw2ICszNSw5IEBACiBleHRlcm4gc3RydWN0IGNvbnNvbGUgKmJmaW5fZWFybHlzZXJpYWxfaW5pdCh1bnNpZ25lZCBpbnQgcG9ydCwKIAkJCQkJCXVuc2lnbmVkIGludCBjZmxhZyk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9KVEFHX0NPTU0KK2V4dGVybiBzdHJ1Y3QgY29uc29sZSAqYmZpbl9qY19lYXJseV9pbml0KHZvaWQpOworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSAqZWFybHlfY29uc29sZTsKIApAQCAtMTQyLDYgKzE0NSwxNSBAQAogCQllYXJseV9jb25zb2xlID0gZWFybHlzZXJpYWxfaW5pdChidWYpOwogCX0KICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JGSU5fSlRBR19DT01NCisJLyogQ2hlY2sgZm9yIEJsYWNrZmluIEpUQUcgKi8KKwlpZiAoIXN0cm5jbXAoYnVmLCAianRhZyIsIDQpKSB7CisJCWJ1ZiArPSA0OworCQllYXJseV9jb25zb2xlID0gYmZpbl9qY19lYXJseV9pbml0KCk7CisJfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfRkIKIAkJLyogVE9ETzogYWRkIGZyYW1lYnVmZmVyIGNvbnNvbGUgc3VwcG9ydCAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKaW5kZXggYTFmOTY0MS4uYjc5NWEyMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYwpAQCAtMSwzMiArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBTb25pYyBaaGFuZworICogYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jIC0gQmxhY2tmaW4ga2dkYiBwaWVjZXMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246CisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBSZXY6ICAgICAgICAgICRJZDoga2dkYl9iZmluX2xpbnV4LTIuNi54LnBhdGNoIDQ5MzQgMjAwNy0wMi0xMyAwOTozMjoxMVogc29uaWN6ICQKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMzksMjQgKzE2LDI5IEBACiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdnZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgogCiAvKiBQdXQgdGhlIGVycm9yIGNvZGUgaGVyZSBqdXN0IGluIGNhc2UgdGhlIHVzZXIgY2FyZXMuICAqLwotaW50IGdkYl9iZjUzM2VycmNvZGU7CitpbnQgZ2RiX2JmaW5fZXJyY29kZTsKIC8qIExpa2V3aXNlLCB0aGUgdmVjdG9yIG51bWJlciBoZXJlIChzaW5jZSBHREIgb25seSBnZXRzIHRoZSBzaWduYWwKICAgIG51bWJlciB0aHJvdWdoIHRoZSB1c3VhbCBtZWFucywgYW5kIHRoYXQncyBub3QgdmVyeSBzcGVjaWZpYykuICAqLwotaW50IGdkYl9iZjUzM3ZlY3RvciA9IC0xOworaW50IGdkYl9iZmluX3ZlY3RvciA9IC0xOwogCiAjaWYgS0dEQl9NQVhfTk9fQ1BVUyAhPSA4CiAjZXJyb3IgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHNsYXZlY3B1bG9ja3MKICNlbmRpZgogCi12b2lkIHJlZ3NfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2lmZGVmIENPTkZJR19CRklOX1dEVAorIyBlcnJvciAiUGxlYXNlIHVuc2VsZWN0IGJsYWNrZmluIHdhdGNoZG9nIGRyaXZlciBiZWZvcmUgYnVpbGQgS0dEQi4iCisjZW5kaWYKKwordm9pZCBwdF9yZWdzX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlnZGJfcmVnc1tCRklOX1IwXSA9IHJlZ3MtPnIwOwogCWdkYl9yZWdzW0JGSU5fUjFdID0gcmVncy0+cjE7CkBAIC0xMzMsNyArMTE1LDcgQEAKIAlnZGJfcmVnc1tCRklOX1NFUVNUQVRdID0gcC0+dGhyZWFkLnNlcXN0YXQ7CiB9CiAKLXZvaWQgZ2RiX3JlZ3NfdG9fcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIGdkYl9yZWdzX3RvX3B0X3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJlZ3MtPnIwID0gZ2RiX3JlZ3NbQkZJTl9SMF07CiAJcmVncy0+cjEgPSBnZGJfcmVnc1tCRklOX1IxXTsKQEAgLTE5OSwxNzEgKzE4MSwyMDggQEAKIAl1bnNpZ25lZCBpbnQgZGF0YWFjYzoyOwogCXVuc2lnbmVkIHNob3J0IGNvdW50OwogCXVuc2lnbmVkIGludCBhZGRyOwotfSBicmVha2luZm9bSFdfQlJFQUtQT0lOVF9OVU1dOworfSBicmVha2luZm9bSFdfV0FUQ0hQT0lOVF9OVU1dOwogCi1pbnQga2dkYl9hcmNoX2luaXQodm9pZCkKLXsKLQlkZWJ1Z2dlcl9zdGVwID0gMDsKLQotCWtnZGJfcmVtb3ZlX2FsbF9od19icmVhaygpOwotCXJldHVybiAwOwotfQotCi1pbnQga2dkYl9zZXRfaHdfYnJlYWsodW5zaWduZWQgbG9uZyBhZGRyKQoraW50IGJmaW5fc2V0X2h3X2JyZWFrKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbiwgZW51bSBrZ2RiX2JwdHlwZSB0eXBlKQogewogCWludCBicmVha25vOwotCWZvciAoYnJlYWtubyA9IDA7IGJyZWFrbm8gPCBIV19CUkVBS1BPSU5UX05VTTsgYnJlYWtubysrKQotCQlpZiAoIWJyZWFraW5mb1ticmVha25vXS5vY2N1cGllZCkgeworCWludCBiZmluX3R5cGU7CisJaW50IGRhdGFhY2MgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCUF9IQVJEV0FSRV9CUkVBS1BPSU5UOgorCQliZmluX3R5cGUgPSBUWVBFX0lOU1RfV0FUQ0hQT0lOVDsKKwkJYnJlYWs7CisJY2FzZSBCUF9XUklURV9XQVRDSFBPSU5UOgorCQlkYXRhYWNjID0gMTsKKwkJYmZpbl90eXBlID0gVFlQRV9EQVRBX1dBVENIUE9JTlQ7CisJCWJyZWFrOworCWNhc2UgQlBfUkVBRF9XQVRDSFBPSU5UOgorCQlkYXRhYWNjID0gMjsKKwkJYmZpbl90eXBlID0gVFlQRV9EQVRBX1dBVENIUE9JTlQ7CisJCWJyZWFrOworCWNhc2UgQlBfQUNDRVNTX1dBVENIUE9JTlQ6CisJCWRhdGFhY2MgPSAzOworCQliZmluX3R5cGUgPSBUWVBFX0RBVEFfV0FUQ0hQT0lOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJLyogQmVjYXN1ZSBoYXJkd2FyZSBkYXRhIHdhdGNocG9pbnQgaW1wZWxlbWVudGVkIGluIGN1cnJlbnQKKwkgKiBCbGFja2ZpbiBjYW4gbm90IHRyaWdnZXIgYW4gZXhjZXB0aW9uIGV2ZW50IGFzIHRoZSBoYXJkd2FyZQorCSAqIGluc3RyY3Rpb24gd2F0Y2hwb2ludCBkb2VzLCB3ZSBpZ25hb3JlIGFsbCBkYXRhIHdhdGNoIHBvaW50IGhlcmUuCisJICogVGhleSBjYW4gYmUgdHVybmVkIG9uIGVhc2lseSBhZnRlciBmdXR1cmUgYmxhY2tmaW4gZGVzaWduCisJICogc3VwcG9ydHMgdGhpcyBmZWF0dXJlLgorCSAqLworCWZvciAoYnJlYWtubyA9IDA7IGJyZWFrbm8gPCBIV19JTlNUX1dBVENIUE9JTlRfTlVNOyBicmVha25vKyspCisJCWlmIChiZmluX3R5cGUgPT0gYnJlYWtpbmZvW2JyZWFrbm9dLnR5cGUKKwkJCSYmICFicmVha2luZm9bYnJlYWtub10ub2NjdXBpZWQpIHsKIAkJCWJyZWFraW5mb1ticmVha25vXS5vY2N1cGllZCA9IDE7CiAJCQlicmVha2luZm9bYnJlYWtub10uZW5hYmxlZCA9IDE7Ci0JCQlicmVha2luZm9bYnJlYWtub10udHlwZSA9IDE7CiAJCQlicmVha2luZm9bYnJlYWtub10uYWRkciA9IGFkZHI7CisJCQlicmVha2luZm9bYnJlYWtub10uZGF0YWFjYyA9IGRhdGFhY2M7CisJCQlicmVha2luZm9bYnJlYWtub10uY291bnQgPSAwOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCXJldHVybiAtRU5PU1BDOwogfQogCi1pbnQga2dkYl9yZW1vdmVfaHdfYnJlYWsodW5zaWduZWQgbG9uZyBhZGRyKQoraW50IGJmaW5fcmVtb3ZlX2h3X2JyZWFrKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbiwgZW51bSBrZ2RiX2JwdHlwZSB0eXBlKQogewogCWludCBicmVha25vOwotCWZvciAoYnJlYWtubyA9IDA7IGJyZWFrbm8gPCBIV19CUkVBS1BPSU5UX05VTTsgYnJlYWtubysrKQotCQlpZiAoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIgPT0gYWRkcikKLQkJCW1lbXNldCgmKGJyZWFraW5mb1ticmVha25vXSksIDAsIHNpemVvZihzdHJ1Y3QgaHdfYnJlYWtwb2ludCkpOworCWludCBiZmluX3R5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEJQX0hBUkRXQVJFX0JSRUFLUE9JTlQ6CisJCWJmaW5fdHlwZSA9IFRZUEVfSU5TVF9XQVRDSFBPSU5UOworCQlicmVhazsKKwljYXNlIEJQX1dSSVRFX1dBVENIUE9JTlQ6CisJY2FzZSBCUF9SRUFEX1dBVENIUE9JTlQ6CisJY2FzZSBCUF9BQ0NFU1NfV0FUQ0hQT0lOVDoKKwkJYmZpbl90eXBlID0gVFlQRV9EQVRBX1dBVENIUE9JTlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlmb3IgKGJyZWFrbm8gPSAwOyBicmVha25vIDwgSFdfV0FUQ0hQT0lOVF9OVU07IGJyZWFrbm8rKykKKwkJaWYgKGJmaW5fdHlwZSA9PSBicmVha2luZm9bYnJlYWtub10udHlwZQorCQkJJiYgYnJlYWtpbmZvW2JyZWFrbm9dLm9jY3VwaWVkCisJCQkmJiBicmVha2luZm9bYnJlYWtub10uYWRkciA9PSBhZGRyKSB7CisJCQlicmVha2luZm9bYnJlYWtub10ub2NjdXBpZWQgPSAwOworCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgPSAwOworCQl9CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBrZ2RiX3JlbW92ZV9hbGxfaHdfYnJlYWsodm9pZCkKLXsKLQltZW1zZXQoYnJlYWtpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGh3X2JyZWFrcG9pbnQpKjgpOwotfQotCi0vKgotdm9pZCBrZ2RiX3Nob3dfaW5mbyh2b2lkKQotewotCXByaW50ayhLRVJOX0RFQlVHICJod2Q6IHdwaWEwPTB4JXgsIHdwaWFjbnQwPSVkLCB3cGlhY3RsPTB4JXgsIHdwc3RhdD0weCV4XG4iLAotCQliZmluX3JlYWRfV1BJQTAoKSwgYmZpbl9yZWFkX1dQSUFDTlQwKCksCi0JCWJmaW5fcmVhZF9XUElBQ1RMKCksIGJmaW5fcmVhZF9XUFNUQVQoKSk7Ci19Ci0qLwotCi12b2lkIGtnZGJfY29ycmVjdF9od19icmVhayh2b2lkKQordm9pZCBiZmluX3JlbW92ZV9hbGxfaHdfYnJlYWsodm9pZCkKIHsKIAlpbnQgYnJlYWtubzsKLQlpbnQgY29ycmVjdGl0OwotCXVpbnQzMl90IHdwZGFjdGwgPSBiZmluX3JlYWRfV1BEQUNUTCgpOwogCi0JY29ycmVjdGl0ID0gMDsKLQlmb3IgKGJyZWFrbm8gPSAwOyBicmVha25vIDwgSFdfQlJFQUtQT0lOVF9OVU07IGJyZWFrbm8rKykgewotCQlpZiAoYnJlYWtpbmZvW2JyZWFrbm9dLnR5cGUgPT0gMSkgeworCW1lbXNldChicmVha2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHdfYnJlYWtwb2ludCkqSFdfV0FUQ0hQT0lOVF9OVU0pOworCisJZm9yIChicmVha25vID0gMDsgYnJlYWtubyA8IEhXX0lOU1RfV0FUQ0hQT0lOVF9OVU07IGJyZWFrbm8rKykKKwkJYnJlYWtpbmZvW2JyZWFrbm9dLnR5cGUgPSBUWVBFX0lOU1RfV0FUQ0hQT0lOVDsKKwlmb3IgKDsgYnJlYWtubyA8IEhXX1dBVENIUE9JTlRfTlVNOyBicmVha25vKyspCisJCWJyZWFraW5mb1ticmVha25vXS50eXBlID0gVFlQRV9EQVRBX1dBVENIUE9JTlQ7Cit9CisKK3ZvaWQgYmZpbl9jb3JyZWN0X2h3X2JyZWFrKHZvaWQpCit7CisJaW50IGJyZWFrbm87CisJdW5zaWduZWQgaW50IHdwaWFjdGwgPSAwOworCXVuc2lnbmVkIGludCB3cGRhY3RsID0gMDsKKwlpbnQgZW5hYmxlX3dwID0gMDsKKworCWZvciAoYnJlYWtubyA9IDA7IGJyZWFrbm8gPCBIV19XQVRDSFBPSU5UX05VTTsgYnJlYWtubysrKQorCQlpZiAoYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQpIHsKKwkJCWVuYWJsZV93cCA9IDE7CisKIAkJCXN3aXRjaCAoYnJlYWtubykgewogCQkJY2FzZSAwOgotCQkJCWlmIChicmVha2luZm9bYnJlYWtub10uZW5hYmxlZCAmJiAhKHdwZGFjdGwgJiBXUElBRU4wKSkgewotCQkJCQljb3JyZWN0aXQgPSAxOwotCQkJCQl3cGRhY3RsICY9IH4oV1BJUkVOMDF8RU1VU1cwKTsKLQkJCQkJd3BkYWN0bCB8PSBXUElBRU4wfFdQSUNOVEVOMDsKLQkJCQkJYmZpbl93cml0ZV9XUElBMChicmVha2luZm9bYnJlYWtub10uYWRkcik7Ci0JCQkJCWJmaW5fd3JpdGVfV1BJQUNOVDAoYnJlYWtpbmZvW2JyZWFrbm9dLnNraXApOwotCQkJCX0gZWxzZSBpZiAoIWJyZWFraW5mb1ticmVha25vXS5lbmFibGVkICYmICh3cGRhY3RsICYgV1BJQUVOMCkpIHsKLQkJCQkJY29ycmVjdGl0ID0gMTsKLQkJCQkJd3BkYWN0bCAmPSB+V1BJQUVOMDsKLQkJCQl9CisJCQkJd3BpYWN0bCB8PSBXUElBRU4wfFdQSUNOVEVOMDsKKwkJCQliZmluX3dyaXRlX1dQSUEwKGJyZWFraW5mb1ticmVha25vXS5hZGRyKTsKKwkJCQliZmluX3dyaXRlX1dQSUFDTlQwKGJyZWFraW5mb1ticmVha25vXS5jb3VudAorCQkJCQkrIGJyZWFraW5mby0+c2tpcCk7CiAJCQkJYnJlYWs7Ci0KIAkJCWNhc2UgMToKLQkJCQlpZiAoYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgJiYgISh3cGRhY3RsICYgV1BJQUVOMSkpIHsKLQkJCQkJY29ycmVjdGl0ID0gMTsKLQkJCQkJd3BkYWN0bCAmPSB+KFdQSVJFTjAxfEVNVVNXMSk7Ci0JCQkJCXdwZGFjdGwgfD0gV1BJQUVOMXxXUElDTlRFTjE7Ci0JCQkJCWJmaW5fd3JpdGVfV1BJQTEoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIpOwotCQkJCQliZmluX3dyaXRlX1dQSUFDTlQxKGJyZWFraW5mb1ticmVha25vXS5za2lwKTsKLQkJCQl9IGVsc2UgaWYgKCFicmVha2luZm9bYnJlYWtub10uZW5hYmxlZCAmJiAod3BkYWN0bCAmIFdQSUFFTjEpKSB7Ci0JCQkJCWNvcnJlY3RpdCA9IDE7Ci0JCQkJCXdwZGFjdGwgJj0gfldQSUFFTjE7Ci0JCQkJfQorCQkJCXdwaWFjdGwgfD0gV1BJQUVOMXxXUElDTlRFTjE7CisJCQkJYmZpbl93cml0ZV9XUElBMShicmVha2luZm9bYnJlYWtub10uYWRkcik7CisJCQkJYmZpbl93cml0ZV9XUElBQ05UMShicmVha2luZm9bYnJlYWtub10uY291bnQKKwkJCQkJKyBicmVha2luZm8tPnNraXApOwogCQkJCWJyZWFrOwotCiAJCQljYXNlIDI6Ci0JCQkJaWYgKGJyZWFraW5mb1ticmVha25vXS5lbmFibGVkICYmICEod3BkYWN0bCAmIFdQSUFFTjIpKSB7Ci0JCQkJCWNvcnJlY3RpdCA9IDE7Ci0JCQkJCXdwZGFjdGwgJj0gfihXUElSRU4yM3xFTVVTVzIpOwotCQkJCQl3cGRhY3RsIHw9IFdQSUFFTjJ8V1BJQ05URU4yOwotCQkJCQliZmluX3dyaXRlX1dQSUEyKGJyZWFraW5mb1ticmVha25vXS5hZGRyKTsKLQkJCQkJYmZpbl93cml0ZV9XUElBQ05UMihicmVha2luZm9bYnJlYWtub10uc2tpcCk7Ci0JCQkJfSBlbHNlIGlmICghYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgJiYgKHdwZGFjdGwgJiBXUElBRU4yKSkgewotCQkJCQljb3JyZWN0aXQgPSAxOwotCQkJCQl3cGRhY3RsICY9IH5XUElBRU4yOwotCQkJCX0KKwkJCQl3cGlhY3RsIHw9IFdQSUFFTjJ8V1BJQ05URU4yOworCQkJCWJmaW5fd3JpdGVfV1BJQTIoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIpOworCQkJCWJmaW5fd3JpdGVfV1BJQUNOVDIoYnJlYWtpbmZvW2JyZWFrbm9dLmNvdW50CisJCQkJCSsgYnJlYWtpbmZvLT5za2lwKTsKIAkJCQlicmVhazsKLQogCQkJY2FzZSAzOgotCQkJCWlmIChicmVha2luZm9bYnJlYWtub10uZW5hYmxlZCAmJiAhKHdwZGFjdGwgJiBXUElBRU4zKSkgewotCQkJCQljb3JyZWN0aXQgPSAxOwotCQkJCQl3cGRhY3RsICY9IH4oV1BJUkVOMjN8RU1VU1czKTsKLQkJCQkJd3BkYWN0bCB8PSBXUElBRU4zfFdQSUNOVEVOMzsKLQkJCQkJYmZpbl93cml0ZV9XUElBMyhicmVha2luZm9bYnJlYWtub10uYWRkcik7Ci0JCQkJCWJmaW5fd3JpdGVfV1BJQUNOVDMoYnJlYWtpbmZvW2JyZWFrbm9dLnNraXApOwotCQkJCX0gZWxzZSBpZiAoIWJyZWFraW5mb1ticmVha25vXS5lbmFibGVkICYmICh3cGRhY3RsICYgV1BJQUVOMykpIHsKLQkJCQkJY29ycmVjdGl0ID0gMTsKLQkJCQkJd3BkYWN0bCAmPSB+V1BJQUVOMzsKLQkJCQl9CisJCQkJd3BpYWN0bCB8PSBXUElBRU4zfFdQSUNOVEVOMzsKKwkJCQliZmluX3dyaXRlX1dQSUEzKGJyZWFraW5mb1ticmVha25vXS5hZGRyKTsKKwkJCQliZmluX3dyaXRlX1dQSUFDTlQzKGJyZWFraW5mb1ticmVha25vXS5jb3VudAorCQkJCQkrIGJyZWFraW5mby0+c2tpcCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDQ6Ci0JCQkJaWYgKGJyZWFraW5mb1ticmVha25vXS5lbmFibGVkICYmICEod3BkYWN0bCAmIFdQSUFFTjQpKSB7Ci0JCQkJCWNvcnJlY3RpdCA9IDE7Ci0JCQkJCXdwZGFjdGwgJj0gfihXUElSRU40NXxFTVVTVzQpOwotCQkJCQl3cGRhY3RsIHw9IFdQSUFFTjR8V1BJQ05URU40OwotCQkJCQliZmluX3dyaXRlX1dQSUE0KGJyZWFraW5mb1ticmVha25vXS5hZGRyKTsKLQkJCQkJYmZpbl93cml0ZV9XUElBQ05UNChicmVha2luZm9bYnJlYWtub10uc2tpcCk7Ci0JCQkJfSBlbHNlIGlmICghYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgJiYgKHdwZGFjdGwgJiBXUElBRU40KSkgewotCQkJCQljb3JyZWN0aXQgPSAxOwotCQkJCQl3cGRhY3RsICY9IH5XUElBRU40OwotCQkJCX0KKwkJCQl3cGlhY3RsIHw9IFdQSUFFTjR8V1BJQ05URU40OworCQkJCWJmaW5fd3JpdGVfV1BJQTQoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIpOworCQkJCWJmaW5fd3JpdGVfV1BJQUNOVDQoYnJlYWtpbmZvW2JyZWFrbm9dLmNvdW50CisJCQkJCSsgYnJlYWtpbmZvLT5za2lwKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgNToKLQkJCQlpZiAoYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgJiYgISh3cGRhY3RsICYgV1BJQUVONSkpIHsKLQkJCQkJY29ycmVjdGl0ID0gMTsKLQkJCQkJd3BkYWN0bCAmPSB+KFdQSVJFTjQ1fEVNVVNXNSk7Ci0JCQkJCXdwZGFjdGwgfD0gV1BJQUVONXxXUElDTlRFTjU7Ci0JCQkJCWJmaW5fd3JpdGVfV1BJQTUoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIpOwotCQkJCQliZmluX3dyaXRlX1dQSUFDTlQ1KGJyZWFraW5mb1ticmVha25vXS5za2lwKTsKLQkJCQl9IGVsc2UgaWYgKCFicmVha2luZm9bYnJlYWtub10uZW5hYmxlZCAmJiAod3BkYWN0bCAmIFdQSUFFTjUpKSB7Ci0JCQkJCWNvcnJlY3RpdCA9IDE7Ci0JCQkJCXdwZGFjdGwgJj0gfldQSUFFTjU7Ci0JCQkJfQorCQkJCXdwaWFjdGwgfD0gV1BJQUVONXxXUElDTlRFTjU7CisJCQkJYmZpbl93cml0ZV9XUElBNShicmVha2luZm9bYnJlYWtub10uYWRkcik7CisJCQkJYmZpbl93cml0ZV9XUElBQ05UNShicmVha2luZm9bYnJlYWtub10uY291bnQKKwkJCQkJKyBicmVha2luZm8tPnNraXApOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCXdwZGFjdGwgfD0gV1BEQUVOMHxXUERDTlRFTjB8V1BEU1JDMDsKKwkJCQl3cGRhY3RsIHw9IGJyZWFraW5mb1ticmVha25vXS5kYXRhYWNjCisJCQkJCTw8IFdQREFDQzBfT0ZGU0VUOworCQkJCWJmaW5fd3JpdGVfV1BEQTAoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIpOworCQkJCWJmaW5fd3JpdGVfV1BEQUNOVDAoYnJlYWtpbmZvW2JyZWFrbm9dLmNvdW50CisJCQkJCSsgYnJlYWtpbmZvLT5za2lwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQl3cGRhY3RsIHw9IFdQREFFTjF8V1BEQ05URU4xfFdQRFNSQzE7CisJCQkJd3BkYWN0bCB8PSBicmVha2luZm9bYnJlYWtub10uZGF0YWFjYworCQkJCQk8PCBXUERBQ0MxX09GRlNFVDsKKwkJCQliZmluX3dyaXRlX1dQREExKGJyZWFraW5mb1ticmVha25vXS5hZGRyKTsKKwkJCQliZmluX3dyaXRlX1dQREFDTlQxKGJyZWFraW5mb1ticmVha25vXS5jb3VudAorCQkJCQkrIGJyZWFraW5mby0+c2tpcCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQl9Ci0JaWYgKGNvcnJlY3RpdCkgewotCQl3cGRhY3RsICY9IH5XUEFORDsKLQkJd3BkYWN0bCB8PSBXUFBXUjsKLQkJLypwcmludGsoImNvcnJlY3RfaHdfYnJlYWs6IHdwZGFjdGw9MHgleFxuIiwgd3BkYWN0bCk7Ki8KKworCS8qIFNob3VsZCBlbmFibGUgV1BQV1IgYml0IGZpcnN0IGJlZm9yZSBzZXQgYW55IG90aGVyCisJICogV1BJQUNUTCBhbmQgV1BEQUNUTCBiaXRzICovCisJaWYgKGVuYWJsZV93cCkgeworCQliZmluX3dyaXRlX1dQSUFDVEwoV1BQV1IpOworCQlDU1lOQygpOworCQliZmluX3dyaXRlX1dQSUFDVEwod3BpYWN0bHxXUFBXUik7CiAJCWJmaW5fd3JpdGVfV1BEQUNUTCh3cGRhY3RsKTsKIAkJQ1NZTkMoKTsKLQkJLyprZ2RiX3Nob3dfaW5mbygpOyovCiAJfQogfQogCiB2b2lkIGtnZGJfZGlzYWJsZV9od19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBEaXNhYmxlIGhhcmR3YXJlIGRlYnVnZ2luZyB3aGlsZSB3ZSBhcmUgaW4ga2dkYiAqLwotCWJmaW5fd3JpdGVfV1BJQUNUTChiZmluX3JlYWRfV1BJQUNUTCgpICYgfjB4MSk7CisJYmZpbl93cml0ZV9XUElBQ1RMKDApOworCWJmaW5fd3JpdGVfV1BEQUNUTCgwKTsKIAlDU1lOQygpOwogfQogCi12b2lkIGtnZGJfcG9zdF9tYXN0ZXJfY29kZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVWZWN0b3IsIGludCBlcnJfY29kZSkKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2sodm9pZCAqaW5mbykKIHsKLQkvKiBNYXN0ZXIgcHJvY2Vzc29yIGlzIGNvbXBsZXRlbHkgaW4gdGhlIGRlYnVnZ2VyICovCi0JZ2RiX2JmNTMzdmVjdG9yID0gZVZlY3RvcjsKLQlnZGJfYmY1MzNlcnJjb2RlID0gZXJyX2NvZGU7CisJa2dkYl9ubWljYWxsYmFjayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBnZXRfaXJxX3JlZ3MoKSk7CiB9CiAKLWludCBrZ2RiX2FyY2hfaGFuZGxlX2V4Y2VwdGlvbihpbnQgZXhjZXB0aW9uVmVjdG9yLCBpbnQgc2lnbm8sCit2b2lkIGtnZGJfcm91bmR1cF9jcHVzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc21wX2NhbGxfZnVuY3Rpb24oa2dkYl9wYXNzaXZlX2NwdV9jYWxsYmFjaywgTlVMTCwgMCwgMCk7Cit9CisKK3ZvaWQga2dkYl9yb3VuZHVwX2NwdShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2ssIE5VTEwsIDAsIDApOworfQorI2VuZGlmCisKK3ZvaWQga2dkYl9wb3N0X3ByaW1hcnlfY29kZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVWZWN0b3IsIGludCBlcnJfY29kZSkKK3sKKwkvKiBNYXN0ZXIgcHJvY2Vzc29yIGlzIGNvbXBsZXRlbHkgaW4gdGhlIGRlYnVnZ2VyICovCisJZ2RiX2JmaW5fdmVjdG9yID0gZVZlY3RvcjsKKwlnZGJfYmZpbl9lcnJjb2RlID0gZXJyX2NvZGU7Cit9CisKK2ludCBrZ2RiX2FyY2hfaGFuZGxlX2V4Y2VwdGlvbihpbnQgdmVjdG9yLCBpbnQgc2lnbm8sCiAJCQkgICAgICAgaW50IGVycl9jb2RlLCBjaGFyICpyZW1jb21faW5fYnVmZmVyLAogCQkJICAgICAgIGNoYXIgKnJlbWNvbV9vdXRfYnVmZmVyLAotCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpsaW51eF9yZWdzKQorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWxvbmcgYWRkcjsKIAlsb25nIGJyZWFrbm87CkBAIC0zODUsNDQgKzQwNCw0MCBAQAogCQkvKiB0cnkgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIsIHBjIHVuY2hhbmdlZCBpZiBubyBwYXJtICovCiAJCXB0ciA9ICZyZW1jb21faW5fYnVmZmVyWzFdOwogCQlpZiAoa2dkYl9oZXgybG9uZygmcHRyLCAmYWRkcikpIHsKLQkJCWxpbnV4X3JlZ3MtPnJldHggPSBhZGRyOworCQkJcmVncy0+cmV0eCA9IGFkZHI7CiAJCX0KLQkJbmV3UEMgPSBsaW51eF9yZWdzLT5yZXR4OworCQluZXdQQyA9IHJlZ3MtPnJldHg7CiAKIAkJLyogY2xlYXIgdGhlIHRyYWNlIGJpdCAqLwotCQlsaW51eF9yZWdzLT5zeXNjZmcgJj0gMHhmZmZmZmZmZTsKKwkJcmVncy0+c3lzY2ZnICY9IDB4ZmZmZmZmZmU7CiAKIAkJLyogc2V0IHRoZSB0cmFjZSBiaXQgaWYgd2UncmUgc3RlcHBpbmcgKi8KIAkJaWYgKHJlbWNvbV9pbl9idWZmZXJbMF0gPT0gJ3MnKSB7Ci0JCQlsaW51eF9yZWdzLT5zeXNjZmcgfD0gMHgxOwotCQkJZGVidWdnZXJfc3RlcCA9IGxpbnV4X3JlZ3MtPmlwZW5kOwotCQkJZGVidWdnZXJfc3RlcCA+Pj0gNjsKLQkJCWZvciAoaSA9IDEwOyBpID4gMDsgaS0tLCBkZWJ1Z2dlcl9zdGVwID4+PSAxKQotCQkJCWlmIChkZWJ1Z2dlcl9zdGVwICYgMSkKKwkJCXJlZ3MtPnN5c2NmZyB8PSAweDE7CisJCQlrZ2RiX3NpbmdsZV9zdGVwID0gcmVncy0+aXBlbmQ7CisJCQlrZ2RiX3NpbmdsZV9zdGVwID4+PSA2OworCQkJZm9yIChpID0gMTA7IGkgPiAwOyBpLS0sIGtnZGJfc2luZ2xlX3N0ZXAgPj49IDEpCisJCQkJaWYgKGtnZGJfc2luZ2xlX3N0ZXAgJiAxKQogCQkJCQlicmVhazsKIAkJCS8qIGkgaW5kaWNhdGUgZXZlbnQgcHJpb3JpdHkgb2YgY3VycmVudCBzdG9wcGVkIGluc3RydWN0aW9uCiAJCQkgKiB1c2VyIHNwYWNlIGluc3RydWN0aW9uIGlzIDAsIElWRzE1IGlzIDEsIElWVE1SIGlzIDEwLgotCQkJICogZGVidWdnZXJfc3RlcCA+IDAgbWVhbnMgaW4gc2luZ2xlIHN0ZXAgbW9kZQorCQkJICoga2dkYl9zaW5nbGVfc3RlcCA+IDAgbWVhbnMgaW4gc2luZ2xlIHN0ZXAgbW9kZQogCQkJICovCi0JCQlkZWJ1Z2dlcl9zdGVwID0gaSArIDE7Ci0JCX0gZWxzZSB7Ci0JCQlkZWJ1Z2dlcl9zdGVwID0gMDsKKwkJCWtnZGJfc2luZ2xlX3N0ZXAgPSBpICsgMTsKIAkJfQogCi0JCXdwX3N0YXR1cyA9IGJmaW5fcmVhZF9XUFNUQVQoKTsKLQkJQ1NZTkMoKTsKLQotCQlpZiAoZXhjZXB0aW9uVmVjdG9yID09IFZFQ19XQVRDSCkgewotCQkJZm9yIChicmVha25vID0gMDsgYnJlYWtubyA8IDY7ICsrYnJlYWtubykgeworCQlpZiAodmVjdG9yID09IFZFQ19XQVRDSCkgeworCQkJd3Bfc3RhdHVzID0gYmZpbl9yZWFkX1dQU1RBVCgpOworCQkJZm9yIChicmVha25vID0gMDsgYnJlYWtubyA8IEhXX1dBVENIUE9JTlRfTlVNOyBicmVha25vKyspIHsKIAkJCQlpZiAod3Bfc3RhdHVzICYgKDEgPDwgYnJlYWtubykpIHsKIAkJCQkJYnJlYWtpbmZvLT5za2lwID0gMTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQorCQkJYmZpbl93cml0ZV9XUFNUQVQoMCk7CiAJCX0KLQkJa2dkYl9jb3JyZWN0X2h3X2JyZWFrKCk7CiAKLQkJYmZpbl93cml0ZV9XUFNUQVQoMCk7CisJCWJmaW5fY29ycmVjdF9od19icmVhaygpOwogCiAJCXJldHVybiAwOwogCX0JCQkvKiBzd2l0Y2ggKi8KQEAgLTQzMSw1ICs0NDYsMzg1IEBACiAKIHN0cnVjdCBrZ2RiX2FyY2ggYXJjaF9rZ2RiX29wcyA9IHsKIAkuZ2RiX2JwdF9pbnN0ciA9IHsweGExfSwKKyNpZmRlZiBDT05GSUdfU01QCisJLmZsYWdzID0gS0dEQl9IV19CUkVBS1BPSU5UfEtHREJfVEhSX1BST0NfU1dBUCwKKyNlbHNlCiAJLmZsYWdzID0gS0dEQl9IV19CUkVBS1BPSU5ULAorI2VuZGlmCisJLnNldF9od19icmVha3BvaW50ID0gYmZpbl9zZXRfaHdfYnJlYWssCisJLnJlbW92ZV9od19icmVha3BvaW50ID0gYmZpbl9yZW1vdmVfaHdfYnJlYWssCisJLnJlbW92ZV9hbGxfaHdfYnJlYWsgPSBiZmluX3JlbW92ZV9hbGxfaHdfYnJlYWssCisJLmNvcnJlY3RfaHdfYnJlYWsgPSBiZmluX2NvcnJlY3RfaHdfYnJlYWssCiB9OworCitzdGF0aWMgaW50IGhleChjaGFyIGNoKQoreworCWlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKKwkJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisJaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQorCQlyZXR1cm4gY2ggLSAnMCc7CisJaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKQorCQlyZXR1cm4gY2ggLSAnQScgKyAxMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfbWVtb3J5X2FjY2Vzc19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHNpemUpCit7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoc2l6ZSA8IDApCisJCXJldHVybiBFRkFVTFQ7CisJaWYgKGFkZHIgPj0gMHgxMDAwICYmIChhZGRyICsgc2l6ZSkgPD0gcGh5c2ljYWxfbWVtX2VuZCkKKwkJcmV0dXJuIDA7CisJaWYgKGFkZHIgPj0gU1lTTU1SX0JBU0UpCisJCXJldHVybiAwOworCWlmIChhZGRyID49IEFTWU5DX0JBTkswX0JBU0UKKwkgICAmJiBhZGRyICsgc2l6ZSA8PSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRSkKKwkJcmV0dXJuIDA7CisJaWYgKGNwdSA9PSAwKSB7CisJCWlmIChhZGRyID49IEwxX1NDUkFUQ0hfU1RBUlQKKwkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX1NDUkFUQ0hfU1RBUlQgKyBMMV9TQ1JBVENIX0xFTkdUSCkpCisJCQlyZXR1cm4gMDsKKyNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCisJCWlmIChhZGRyID49IEwxX0NPREVfU1RBUlQKKwkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAorCQlpZiAoYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQKKwkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCQkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKKwkJaWYgKGFkZHIgPj0gTDFfREFUQV9CX1NUQVJUCisJCSAgICYmIChhZGRyICsgc2l6ZSA8PSBMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSkKKwkJCXJldHVybiAwOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCX0gZWxzZSBpZiAoY3B1ID09IDEpIHsKKwkJaWYgKGFkZHIgPj0gQ09SRUJfTDFfU0NSQVRDSF9TVEFSVAorCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfU0NSQVRDSF9TVEFSVAorCQkgICArIEwxX1NDUkFUQ0hfTEVOR1RIKSkKKwkJCXJldHVybiAwOworIyBpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCisJCWlmIChhZGRyID49IENPUkVCX0wxX0NPREVfU1RBUlQKKwkJICAgJiYgKGFkZHIgKyBzaXplIDw9IENPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJCQlyZXR1cm4gMDsKKyMgZW5kaWYKKyMgaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCisJCWlmIChhZGRyID49IENPUkVCX0wxX0RBVEFfQV9TVEFSVAorCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfREFUQV9BX1NUQVJUICsgTDFfREFUQV9BX0xFTkdUSCkpCisJCQlyZXR1cm4gMDsKKyMgZW5kaWYKKyMgaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCisJCWlmIChhZGRyID49IENPUkVCX0wxX0RBVEFfQl9TVEFSVAorCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkpCisJCQlyZXR1cm4gMDsKKyMgZW5kaWYKKyNlbmRpZgorCX0KKworI2lmIEwyX0xFTkdUSCAhPSAwCisJaWYgKGFkZHIgPj0gTDJfU1RBUlQKKwkgICAmJiBhZGRyICsgc2l6ZSA8PSBMMl9TVEFSVCArIEwyX0xFTkdUSCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCXJldHVybiBFRkFVTFQ7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1Zi4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgY2hhciBwdXQgaW4gYnVmIChudWxsKS4gTWF5IHJldHVybiBhbiBlcnJvci4KKyAqLworaW50IGtnZGJfbWVtMmhleChjaGFyICptZW0sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWNoYXIgKnRtcDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyICpwY2g7CisJdW5zaWduZWQgc2hvcnQgbW1yMTY7CisJdW5zaWduZWQgbG9uZyBtbXIzMjsKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICh2YWxpZGF0ZV9tZW1vcnlfYWNjZXNzX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpbWVtLCBjb3VudCkpCisJCXJldHVybiBFRkFVTFQ7CisKKwkvKgorCSAqIFdlIHVzZSB0aGUgdXBwZXIgaGFsZiBvZiBidWYgYXMgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgdGhlCisJICogcmF3IG1lbW9yeSBjb3B5LiAgSGV4IGNvbnZlcnNpb24gd2lsbCB3b3JrIGFnYWluc3QgdGhpcyBvbmUuCisJICovCisJdG1wID0gYnVmICsgY291bnQ7CisKKwlpZiAoKHVuc2lnbmVkIGludCltZW0gPj0gU1lTTU1SX0JBU0UpIHsgLyphY2Nlc3MgTU1SIHJlZ2lzdGVycyovCisJCXN3aXRjaCAoY291bnQpIHsKKwkJY2FzZSAyOgorCQkJaWYgKCh1bnNpZ25lZCBpbnQpbWVtICUgMiA9PSAwKSB7CisJCQkJbW1yMTYgPSAqKHVuc2lnbmVkIHNob3J0ICopbWVtOworCQkJCXBjaCA9ICh1bnNpZ25lZCBjaGFyICopJm1tcjE2OworCQkJCSp0bXArKyA9ICpwY2grKzsKKwkJCQkqdG1wKysgPSAqcGNoKys7CisJCQkJdG1wIC09IDI7CisJCQl9IGVsc2UKKwkJCQllcnIgPSBFRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaWYgKCh1bnNpZ25lZCBpbnQpbWVtICUgNCA9PSAwKSB7CisJCQkJbW1yMzIgPSAqKHVuc2lnbmVkIGxvbmcgKiltZW07CisJCQkJcGNoID0gKHVuc2lnbmVkIGNoYXIgKikmbW1yMzI7CisJCQkJKnRtcCsrID0gKnBjaCsrOworCQkJCSp0bXArKyA9ICpwY2grKzsKKwkJCQkqdG1wKysgPSAqcGNoKys7CisJCQkJKnRtcCsrID0gKnBjaCsrOworCQkJCXRtcCAtPSA0OworCQkJfSBlbHNlCisJCQkJZXJyID0gRUZBVUxUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSBFRkFVTFQ7CisJCX0KKwl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKKwkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorI2lmZGVmIENPTkZJR19TTVAKKwkJfHwgY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludCltZW0gPj0gQ09SRUJfTDFfQ09ERV9TVEFSVCAmJgorCQkodW5zaWduZWQgaW50KShtZW0gKyBjb3VudCkgPD0KKwkJQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisjZW5kaWYKKwkJKSB7CisJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNKi8KKwkJaWYgKGRtYV9tZW1jcHkodG1wLCBtZW0sIGNvdW50KSA9PSBOVUxMKQorCQkJZXJyID0gRUZBVUxUOworCX0gZWxzZQorCQllcnIgPSBwcm9iZV9rZXJuZWxfcmVhZCh0bXAsIG1lbSwgY291bnQpOworCisJaWYgKCFlcnIpIHsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsICp0bXApOworCQkJdG1wKys7CisJCQljb3VudC0tOworCQl9CisKKwkJKmJ1ZiA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENvcHkgdGhlIGJpbmFyeSBhcnJheSBwb2ludGVkIHRvIGJ5IGJ1ZiBpbnRvIG1lbS4gIEZpeCAkLCAjLCBhbmQKKyAqIDB4N2QgZXNjYXBlZCB3aXRoIDB4N2QuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKKyAqIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbi4KKyAqLworaW50IGtnZGJfZWJpbjJtZW0oY2hhciAqYnVmLCBjaGFyICptZW0sIGludCBjb3VudCkKK3sKKwljaGFyICp0bXBfb2xkOworCWNoYXIgKnRtcF9uZXc7CisJdW5zaWduZWQgc2hvcnQgKm1tcjE2OworCXVuc2lnbmVkIGxvbmcgKm1tcjMyOworCWludCBlcnIgPSAwOworCWludCBzaXplID0gMDsKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCXRtcF9vbGQgPSB0bXBfbmV3ID0gYnVmOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCWlmICgqdG1wX29sZCA9PSAweDdkKQorCQkJKnRtcF9uZXcgPSAqKCsrdG1wX29sZCkgXiAweDIwOworCQllbHNlCisJCQkqdG1wX25ldyA9ICp0bXBfb2xkOworCQl0bXBfbmV3Kys7CisJCXRtcF9vbGQrKzsKKwkJc2l6ZSsrOworCX0KKworCWlmICh2YWxpZGF0ZV9tZW1vcnlfYWNjZXNzX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpbWVtLCBzaXplKSkKKwkJcmV0dXJuIEVGQVVMVDsKKworCWlmICgodW5zaWduZWQgaW50KW1lbSA+PSBTWVNNTVJfQkFTRSkgeyAvKmFjY2VzcyBNTVIgcmVnaXN0ZXJzKi8KKwkJc3dpdGNoIChzaXplKSB7CisJCWNhc2UgMjoKKwkJCWlmICgodW5zaWduZWQgaW50KW1lbSAlIDIgPT0gMCkgeworCQkJCW1tcjE2ID0gKHVuc2lnbmVkIHNob3J0ICopYnVmOworCQkJCSoodW5zaWduZWQgc2hvcnQgKiltZW0gPSAqbW1yMTY7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICgodW5zaWduZWQgaW50KW1lbSAlIDQgPT0gMCkgeworCQkJCW1tcjMyID0gKHVuc2lnbmVkIGxvbmcgKilidWY7CisJCQkJKih1bnNpZ25lZCBsb25nICopbWVtID0gKm1tcjMyOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIEVGQVVMVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVGQVVMVDsKKwkJfQorCX0gZWxzZSBpZiAoY3B1ID09IDAgJiYgKHVuc2lnbmVkIGludCltZW0gPj0gTDFfQ09ERV9TVEFSVCAmJgorCQkodW5zaWduZWQgaW50KShtZW0gKyBjb3VudCkgPCBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKyNpZmRlZiBDT05GSUdfU01QCisJCXx8IGNwdSA9PSAxICYmICh1bnNpZ25lZCBpbnQpbWVtID49IENPUkVCX0wxX0NPREVfU1RBUlQgJiYKKwkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9CisJCUNPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorI2VuZGlmCisJCSkgeworCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLworCQlpZiAoZG1hX21lbWNweShtZW0sIGJ1Ziwgc2l6ZSkgPT0gTlVMTCkKKwkJCWVyciA9IEVGQVVMVDsKKwl9IGVsc2UKKwkJZXJyID0gcHJvYmVfa2VybmVsX3dyaXRlKG1lbSwgYnVmLCBzaXplKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbS4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBBRlRFUiB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uCisgKiBNYXkgcmV0dXJuIGFuIGVycm9yLgorICovCitpbnQga2dkYl9oZXgybWVtKGNoYXIgKmJ1ZiwgY2hhciAqbWVtLCBpbnQgY291bnQpCit7CisJY2hhciAqdG1wX3JhdzsKKwljaGFyICp0bXBfaGV4OworCXVuc2lnbmVkIHNob3J0ICptbXIxNjsKKwl1bnNpZ25lZCBsb25nICptbXIzMjsKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICh2YWxpZGF0ZV9tZW1vcnlfYWNjZXNzX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpbWVtLCBjb3VudCkpCisJCXJldHVybiBFRkFVTFQ7CisKKwkvKgorCSAqIFdlIHVzZSB0aGUgdXBwZXIgaGFsZiBvZiBidWYgYXMgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgdGhlCisJICogcmF3IG1lbW9yeSB0aGF0IGlzIGNvbnZlcnRlZCBmcm9tIGhleC4KKwkgKi8KKwl0bXBfcmF3ID0gYnVmICsgY291bnQgKiAyOworCisJdG1wX2hleCA9IHRtcF9yYXcgLSAxOworCXdoaWxlICh0bXBfaGV4ID49IGJ1ZikgeworCQl0bXBfcmF3LS07CisJCSp0bXBfcmF3ID0gaGV4KCp0bXBfaGV4LS0pOworCQkqdG1wX3JhdyB8PSBoZXgoKnRtcF9oZXgtLSkgPDwgNDsKKwl9CisKKwlpZiAoKHVuc2lnbmVkIGludCltZW0gPj0gU1lTTU1SX0JBU0UpIHsgLyphY2Nlc3MgTU1SIHJlZ2lzdGVycyovCisJCXN3aXRjaCAoY291bnQpIHsKKwkJY2FzZSAyOgorCQkJaWYgKCh1bnNpZ25lZCBpbnQpbWVtICUgMiA9PSAwKSB7CisJCQkJbW1yMTYgPSAodW5zaWduZWQgc2hvcnQgKil0bXBfcmF3OworCQkJCSoodW5zaWduZWQgc2hvcnQgKiltZW0gPSAqbW1yMTY7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICgodW5zaWduZWQgaW50KW1lbSAlIDQgPT0gMCkgeworCQkJCW1tcjMyID0gKHVuc2lnbmVkIGxvbmcgKil0bXBfcmF3OworCQkJCSoodW5zaWduZWQgbG9uZyAqKW1lbSA9ICptbXIzMjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBFRkFVTFQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFRkFVTFQ7CisJCX0KKwl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKKwkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorI2lmZGVmIENPTkZJR19TTVAKKwkJfHwgY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludCltZW0gPj0gQ09SRUJfTDFfQ09ERV9TVEFSVCAmJgorCQkodW5zaWduZWQgaW50KShtZW0gKyBjb3VudCkgPD0KKwkJQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisjZW5kaWYKKwkJKSB7CisJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNICovCisJCWlmIChkbWFfbWVtY3B5KG1lbSwgdG1wX3JhdywgY291bnQpID09IE5VTEwpCisJCQlyZXR1cm4gRUZBVUxUOworCX0gZWxzZQorCQlyZXR1cm4gcHJvYmVfa2VybmVsX3dyaXRlKG1lbSwgdG1wX3JhdywgY291bnQpOworCXJldHVybiAwOworfQorCitpbnQga2dkYl92YWxpZGF0ZV9icmVha19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmIChhZGRyID49IDB4MTAwMCAmJiAoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpIDw9IHBoeXNpY2FsX21lbV9lbmQpCisJCXJldHVybiAwOworCWlmIChhZGRyID49IEFTWU5DX0JBTkswX0JBU0UKKwkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfQkFTRSkKKwkJcmV0dXJuIDA7CisjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAorCWlmIChjcHUgPT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKKwkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJCXJldHVybiAwOworIyBpZmRlZiBDT05GSUdfU01QCisJZWxzZSBpZiAoY3B1ID09IDEgJiYgYWRkciA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUCisJICAgJiYgYWRkciArIEJSRUFLX0lOU1RSX1NJWkUgPD0gQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCQlyZXR1cm4gMDsKKyMgZW5kaWYKKyNlbmRpZgorI2lmIEwyX0xFTkdUSCAhPSAwCisJaWYgKGFkZHIgPj0gTDJfU1RBUlQKKwkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMl9TVEFSVCArIEwyX0xFTkdUSCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCXJldHVybiBFRkFVTFQ7Cit9CisKK2ludCBrZ2RiX2FyY2hfc2V0X2JyZWFrcG9pbnQodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpzYXZlZF9pbnN0cikKK3sKKwlpbnQgZXJyOworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKChjcHUgPT0gMCAmJiAodW5zaWduZWQgaW50KWFkZHIgPj0gTDFfQ09ERV9TVEFSVAorCQkmJiAodW5zaWduZWQgaW50KShhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkKKwkJPCBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisjaWZkZWYgQ09ORklHX1NNUAorCQl8fCAoY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludClhZGRyID49IENPUkVCX0wxX0NPREVfU1RBUlQKKwkJJiYgKHVuc2lnbmVkIGludCkoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpCisJCTwgQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorI2VuZGlmCisJCSkgeworCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLworCQlpZiAoZG1hX21lbWNweShzYXZlZF9pbnN0ciwgKHZvaWQgKilhZGRyLCBCUkVBS19JTlNUUl9TSVpFKQorCQkJPT0gTlVMTCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChkbWFfbWVtY3B5KCh2b2lkICopYWRkciwgYXJjaF9rZ2RiX29wcy5nZGJfYnB0X2luc3RyLAorCQkJQlJFQUtfSU5TVFJfU0laRSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWVyciA9IHByb2JlX2tlcm5lbF9yZWFkKHNhdmVkX2luc3RyLCAoY2hhciAqKWFkZHIsCisJCQlCUkVBS19JTlNUUl9TSVpFKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJcmV0dXJuIHByb2JlX2tlcm5lbF93cml0ZSgoY2hhciAqKWFkZHIsCisJCQlhcmNoX2tnZGJfb3BzLmdkYl9icHRfaW5zdHIsIEJSRUFLX0lOU1RSX1NJWkUpOworCX0KK30KKworaW50IGtnZGJfYXJjaF9yZW1vdmVfYnJlYWtwb2ludCh1bnNpZ25lZCBsb25nIGFkZHIsIGNoYXIgKmJ1bmRsZSkKK3sKKwlpZiAoKHVuc2lnbmVkIGludClhZGRyID49IEwxX0NPREVfU1RBUlQgJiYKKwkJKHVuc2lnbmVkIGludCkoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpIDwKKwkJCUwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgeworCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLworCQlpZiAoZG1hX21lbWNweSgodm9pZCAqKWFkZHIsIGJ1bmRsZSwgQlJFQUtfSU5TVFJfU0laRSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gcHJvYmVfa2VybmVsX3dyaXRlKChjaGFyICopYWRkciwKKwkJCQkoY2hhciAqKWJ1bmRsZSwgQlJFQUtfSU5TVFJfU0laRSk7Cit9CisKK2ludCBrZ2RiX2FyY2hfaW5pdCh2b2lkKQoreworCWtnZGJfc2luZ2xlX3N0ZXAgPSAwOworCisJYmZpbl9yZW1vdmVfYWxsX2h3X2JyZWFrKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQga2dkYl9hcmNoX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYmYxYTUxZC4uMTQwYmYwMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KIAotI2RlZmluZSBNQVhfU0hBUkVEX0xJQlMgMwogI2RlZmluZSBURVhUX09GRlNFVCAwCiAvKgogICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgpAQCAtMTYxLDIxICsxNjAsMzIgQEAKIAlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKIAlzdHJ1Y3Qgc3JhbV9saXN0X3N0cnVjdCAqc3JhbWw7CiAKKwkvKiBvdmVyZmxvdyAqLworCWlmIChzdGFydCArIGxlbiA8IHN0YXJ0KQorCQlyZXR1cm4gLUVJTzsKKwogCWZvciAodm1sID0gY2hpbGQtPm1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpCi0JCWlmIChzdGFydCA+PSB2bWwtPnZtYS0+dm1fc3RhcnQgJiYgc3RhcnQgKyBsZW4gPD0gdm1sLT52bWEtPnZtX2VuZCkKKwkJaWYgKHN0YXJ0ID49IHZtbC0+dm1hLT52bV9zdGFydCAmJiBzdGFydCArIGxlbiA8IHZtbC0+dm1hLT52bV9lbmQpCiAJCQlyZXR1cm4gMDsKIAogCWZvciAoc3JhbWwgPSBjaGlsZC0+bW0tPmNvbnRleHQuc3JhbV9saXN0OyBzcmFtbDsgc3JhbWwgPSBzcmFtbC0+bmV4dCkKIAkJaWYgKHN0YXJ0ID49ICh1bnNpZ25lZCBsb25nKXNyYW1sLT5hZGRyCi0JCSAgICAmJiBzdGFydCArIGxlbiA8PSAodW5zaWduZWQgbG9uZylzcmFtbC0+YWRkciArIHNyYW1sLT5sZW5ndGgpCisJCSAgICAmJiBzdGFydCArIGxlbiA8ICh1bnNpZ25lZCBsb25nKXNyYW1sLT5hZGRyICsgc3JhbWwtPmxlbmd0aCkKIAkJCXJldHVybiAwOwogCi0JaWYgKHN0YXJ0ID49IEZJWEVEX0NPREVfU1RBUlQgJiYgc3RhcnQgKyBsZW4gPD0gRklYRURfQ09ERV9FTkQpCisJaWYgKHN0YXJ0ID49IEZJWEVEX0NPREVfU1RBUlQgJiYgc3RhcnQgKyBsZW4gPCBGSVhFRF9DT0RFX0VORCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKIH0KIAordm9pZCBwdHJhY2VfZW5hYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdG1wID0gZ2V0X3JlZyhjaGlsZCwgUFRfU1lTQ0ZHKSB8IChUUkFDRV9CSVRTKTsKKwlwdXRfcmVnKGNoaWxkLCBQVF9TWVNDRkcsIHRtcCk7Cit9CisKIC8qCiAgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KICAqCkBAIC0xOTIsMTQgKzIwMiwxMiBAQAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewogCWludCByZXQ7Ci0JaW50IGFkZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGFwID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YTsKIAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CiAJCXByX2RlYnVnKCJwdHJhY2U6IFBFRUtEQVRBXG4iKTsKLQkJYWRkID0gTUFYX1NIQVJFRF9MSUJTICogNDsJLyogc3BhY2UgYmV0d2VlbiB0ZXh0IGFuZCBkYXRhICovCiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOgkvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAkJewpAQCAtMjA3LDQwICsyMTUsMzUgQEAKIAkJCWludCBjb3BpZWQ7CiAKIAkJCXJldCA9IC1FSU87Ci0JCQlwcl9kZWJ1ZygicHRyYWNlOiBQRUVLVEVYVCBhdCBhZGRyIDB4JTA4bHggKyBhZGQgJWQgJWxkXG4iLCBhZGRyLCBhZGQsCi0JCQkgICAgICAgICBzaXplb2YoZGF0YSkpOwotCQkJaWYgKGlzX3VzZXJfYWRkcl92YWxpZChjaGlsZCwgYWRkciArIGFkZCwgc2l6ZW9mKHRtcCkpIDwgMCkKKwkJCXByX2RlYnVnKCJwdHJhY2U6IFBFRUtURVhUIGF0IGFkZHIgMHglMDhseCArICVsZFxuIiwgYWRkciwgc2l6ZW9mKGRhdGEpKTsKKwkJCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZih0bXApKSA8IDApCiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1ZygicHRyYWNlOiB1c2VyIGFkZHJlc3MgaXMgdmFsaWRcbiIpOwogCi0jaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCQkJaWYgKGFkZHIgKyBhZGQgPj0gTDFfQ09ERV9TVEFSVAotCQkJICAgICYmIGFkZHIgKyBhZGQgKyBzaXplb2YodG1wKSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpIHsKLQkJCQlzYWZlX2RtYV9tZW1jcHkgKCZ0bXAsIChjb25zdCB2b2lkICopKGFkZHIgKyBhZGQpLCBzaXplb2YodG1wKSk7CisJCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKKwkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKHRtcCkgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSB7CisJCQkJc2FmZV9kbWFfbWVtY3B5ICgmdG1wLCAoY29uc3Qgdm9pZCAqKShhZGRyKSwgc2l6ZW9mKHRtcCkpOwogCQkJCWNvcGllZCA9IHNpemVvZih0bXApOwotCQkJfSBlbHNlCi0jZW5kaWYKLSNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQkJCWlmIChhZGRyICsgYWRkID49IEwxX0RBVEFfQV9TVEFSVAotCQkJICAgICYmIGFkZHIgKyBhZGQgKyBzaXplb2YodG1wKSA8PSBMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKSB7Ci0JCQkJbWVtY3B5KCZ0bXAsIChjb25zdCB2b2lkICopKGFkZHIgKyBhZGQpLCBzaXplb2YodG1wKSk7CisKKwkJCX0gZWxzZSBpZiAoTDFfREFUQV9BX0xFTkdUSCAhPSAwICYmIGFkZHIgPj0gTDFfREFUQV9BX1NUQVJUCisJCQkgICAgJiYgYWRkciArIHNpemVvZih0bXApIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpIHsKKwkJCQltZW1jcHkoJnRtcCwgKGNvbnN0IHZvaWQgKikoYWRkciksIHNpemVvZih0bXApKTsKIAkJCQljb3BpZWQgPSBzaXplb2YodG1wKTsKLQkJCX0gZWxzZQotI2VuZGlmCi0jaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JCQlpZiAoYWRkciArIGFkZCA+PSBMMV9EQVRBX0JfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgYWRkICsgc2l6ZW9mKHRtcCkgPD0gTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkgewotCQkJCW1lbWNweSgmdG1wLCAoY29uc3Qgdm9pZCAqKShhZGRyICsgYWRkKSwgc2l6ZW9mKHRtcCkpOworCisJCQl9IGVsc2UgaWYgKEwxX0RBVEFfQl9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0RBVEFfQl9TVEFSVAorCQkJICAgICYmIGFkZHIgKyBzaXplb2YodG1wKSA8PSBMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSB7CisJCQkJbWVtY3B5KCZ0bXAsIChjb25zdCB2b2lkICopKGFkZHIpLCBzaXplb2YodG1wKSk7CiAJCQkJY29waWVkID0gc2l6ZW9mKHRtcCk7Ci0JCQl9IGVsc2UKLSNlbmRpZgotCQkJaWYgKGFkZHIgKyBhZGQgPj0gRklYRURfQ09ERV9TVEFSVAotCQkJICAgICYmIGFkZHIgKyBhZGQgKyBzaXplb2YodG1wKSA8PSBGSVhFRF9DT0RFX0VORCkgewotCQkJCW1lbWNweSgmdG1wLCAoY29uc3Qgdm9pZCAqKShhZGRyICsgYWRkKSwgc2l6ZW9mKHRtcCkpOworCisJCQl9IGVsc2UgaWYgKGFkZHIgPj0gRklYRURfQ09ERV9TVEFSVAorCQkJICAgICYmIGFkZHIgKyBzaXplb2YodG1wKSA8PSBGSVhFRF9DT0RFX0VORCkgeworCQkJCW1lbWNweSgmdG1wLCAoY29uc3Qgdm9pZCAqKShhZGRyKSwgc2l6ZW9mKHRtcCkpOwogCQkJCWNvcGllZCA9IHNpemVvZih0bXApOworCiAJCQl9IGVsc2UKLQkJCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciArIGFkZCwgJnRtcCwKKwkJCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwKIAkJCQkJCQkgICBzaXplb2YodG1wKSwgMCk7CisKIAkJCXByX2RlYnVnKCJwdHJhY2U6IGNvcGllZCBzaXplICVkIFsweCUwOGx4XVxuIiwgY29waWVkLCB0bXApOwogCQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKIAkJCQlicmVhazsKQEAgLTI4NCw0NyArMjg3LDQzIEBACiAKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXByaW50ayhLRVJOX05PVElDRSAicHRyYWNlOiBQVFJBQ0VfUEVFS0RBVEFcbiIpOworCQlwcl9kZWJ1ZygicHRyYWNlOiBQVFJBQ0VfUEVFS0RBVEFcbiIpOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAkJewogCQkJaW50IGNvcGllZDsKIAogCQkJcmV0ID0gLUVJTzsKLQkJCXByX2RlYnVnKCJwdHJhY2U6IFBPS0VURVhUIGF0IGFkZHIgMHglMDhseCArIGFkZCAlZCAlbGQgYnl0ZXMgJWx4XG4iLAotCQkJICAgICAgICAgYWRkciwgYWRkLCBzaXplb2YoZGF0YSksIGRhdGEpOwotCQkJaWYgKGlzX3VzZXJfYWRkcl92YWxpZChjaGlsZCwgYWRkciArIGFkZCwgc2l6ZW9mKGRhdGEpKSA8IDApCisJCQlwcl9kZWJ1ZygicHRyYWNlOiBQT0tFVEVYVCBhdCBhZGRyIDB4JTA4bHggKyAlbGQgYnl0ZXMgJWx4XG4iLAorCQkJICAgICAgICAgYWRkciwgc2l6ZW9mKGRhdGEpLCBkYXRhKTsKKwkJCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZihkYXRhKSkgPCAwKQogCQkJCWJyZWFrOwogCQkJcHJfZGVidWcoInB0cmFjZTogdXNlciBhZGRyZXNzIGlzIHZhbGlkXG4iKTsKIAotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQkJCWlmIChhZGRyICsgYWRkID49IEwxX0NPREVfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgYWRkICsgc2l6ZW9mKGRhdGEpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgewotCQkJCXNhZmVfZG1hX21lbWNweSAoKHZvaWQgKikoYWRkciArIGFkZCksICZkYXRhLCBzaXplb2YoZGF0YSkpOworCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBMMV9DT0RFX1NUQVJUCisJCQkgICAgJiYgYWRkciArIHNpemVvZihkYXRhKSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpIHsKKwkJCQlzYWZlX2RtYV9tZW1jcHkgKCh2b2lkICopKGFkZHIpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJCQljb3BpZWQgPSBzaXplb2YoZGF0YSk7Ci0JCQl9IGVsc2UKLSNlbmRpZgotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCQkJaWYgKGFkZHIgKyBhZGQgPj0gTDFfREFUQV9BX1NUQVJUCi0JCQkgICAgJiYgYWRkciArIGFkZCArIHNpemVvZihkYXRhKSA8PSBMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKSB7Ci0JCQkJbWVtY3B5KCh2b2lkICopKGFkZHIgKyBhZGQpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKworCQkJfSBlbHNlIGlmIChMMV9EQVRBX0FfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQKKwkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKGRhdGEpIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpIHsKKwkJCQltZW1jcHkoKHZvaWQgKikoYWRkciksICZkYXRhLCBzaXplb2YoZGF0YSkpOwogCQkJCWNvcGllZCA9IHNpemVvZihkYXRhKTsKLQkJCX0gZWxzZQotI2VuZGlmCi0jaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JCQlpZiAoYWRkciArIGFkZCA+PSBMMV9EQVRBX0JfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgYWRkICsgc2l6ZW9mKGRhdGEpIDw9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpIHsKLQkJCQltZW1jcHkoKHZvaWQgKikoYWRkciArIGFkZCksICZkYXRhLCBzaXplb2YoZGF0YSkpOworCisJCQl9IGVsc2UgaWYgKEwxX0RBVEFfQl9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0RBVEFfQl9TVEFSVAorCQkJICAgICYmIGFkZHIgKyBzaXplb2YoZGF0YSkgPD0gTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkgeworCQkJCW1lbWNweSgodm9pZCAqKShhZGRyKSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJCQkJY29waWVkID0gc2l6ZW9mKGRhdGEpOwotCQkJfSBlbHNlCi0jZW5kaWYKLQkJCWlmIChhZGRyICsgYWRkID49IEZJWEVEX0NPREVfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgYWRkICsgc2l6ZW9mKGRhdGEpIDw9IEZJWEVEX0NPREVfRU5EKSB7Ci0JCQkJbWVtY3B5KCh2b2lkICopKGFkZHIgKyBhZGQpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKworCQkJfSBlbHNlIGlmIChhZGRyID49IEZJWEVEX0NPREVfU1RBUlQKKwkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKGRhdGEpIDw9IEZJWEVEX0NPREVfRU5EKSB7CisJCQkJbWVtY3B5KCh2b2lkICopKGFkZHIpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJCQljb3BpZWQgPSBzaXplb2YoZGF0YSk7CisKIAkJCX0gZWxzZQotCQkJCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyICsgYWRkLCAmZGF0YSwKKwkJCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCiAJCQkJCQkJICAgc2l6ZW9mKGRhdGEpLCAxKTsKKwogCQkJcHJfZGVidWcoInB0cmFjZTogY29waWVkIHNpemUgJWRcbiIsIGNvcGllZCk7CiAJCQlpZiAoY29waWVkICE9IHNpemVvZihkYXRhKSkKIAkJCQlicmVhazsKQEAgLTM1MSwyOSArMzUwLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoJLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KLQljYXNlIFBUUkFDRV9DT05UOgotCQl7CQkvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQkJCWxvbmcgdG1wOworCWNhc2UgUFRSQUNFX0NPTlQ6CS8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLworCQlwcl9kZWJ1ZygicHRyYWNlOiBzeXNjYWxsL2NvbnRcbiIpOwogCi0JCQlwcl9kZWJ1ZygicHRyYWNlX2NvbnRcbiIpOwotCi0JCQlyZXQgPSAtRUlPOwotCQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkKLQkJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCQllbHNlCi0JCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0KLQkJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotCQkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIFBUX1NZU0NGRykgJiB+KFRSQUNFX0JJVFMpOwotCQkJcHV0X3JlZyhjaGlsZCwgUFRfU1lTQ0ZHLCB0bXApOwotCQkJcHJfZGVidWcoImJlZm9yZSB3YWtlX3VwX3Byb2Nlc3NcbiIpOwotCQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJCXJldCA9IDA7CisJCXJldCA9IC1FSU87CisJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQogCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCisJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCWVsc2UKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJcHRyYWNlX2Rpc2FibGUoY2hpbGQpOworCQlwcl9kZWJ1ZygicHRyYWNlOiBiZWZvcmUgd2FrZV91cF9wcm9jZXNzXG4iKTsKKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CiAKIAkvKgogCSAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLgpAQCAtMzgxLDU1ICszNzMsMzcgQEAKIAkgKiBleGl0LgogCSAqLwogCWNhc2UgUFRSQUNFX0tJTEw6Ci0JCXsKLQkJCWxvbmcgdG1wOwotCQkJcmV0ID0gMDsKLQkJCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCi0JCQkJYnJlYWs7Ci0JCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKLQkJCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBQVF9TWVNDRkcpICYgfihUUkFDRV9CSVRTKTsKLQkJCXB1dF9yZWcoY2hpbGQsIFBUX1NZU0NGRywgdG1wKTsKLQkJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CisJCXJldCA9IDA7CisJCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCiAJCQlicmVhazsKLQkJfQorCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKKwkJcHRyYWNlX2Rpc2FibGUoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKIAotCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6Ci0JCXsJCS8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLwotCQkJbG9uZyB0bXA7Ci0KLQkJCXByX2RlYnVnKCJzaW5nbGUgc3RlcFxuIik7Ci0JCQlyZXQgPSAtRUlPOwotCQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQkJYnJlYWs7Ci0JCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQotCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgUFRfU1lTQ0ZHKSB8IChUUkFDRV9CSVRTKTsKLQkJCXB1dF9yZWcoY2hpbGQsIFBUX1NZU0NGRywgdG1wKTsKLQotCQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCQkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHJ1bi4gKi8KLQkJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCQlyZXQgPSAwOworCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CS8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLworCQlwcl9kZWJ1ZygicHRyYWNlOiBzaW5nbGUgc3RlcFxuIik7CisJCXJldCA9IC1FSU87CisJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQogCQkJYnJlYWs7Ci0JCX0KKwkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCXB0cmFjZV9lbmFibGUoY2hpbGQpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9HRVRSRUdTOgotCQl7Ci0KLQkJCS8qIEdldCBhbGwgZ3AgcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KLQkJCXJldCA9IHB0cmFjZV9nZXRyZWdzKGNoaWxkLCBkYXRhcCk7Ci0JCQlicmVhazsKLQkJfQorCQkvKiBHZXQgYWxsIGdwIHJlZ3MgZnJvbSB0aGUgY2hpbGQuICovCisJCXJldCA9IHB0cmFjZV9nZXRyZWdzKGNoaWxkLCBkYXRhcCk7CisJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfU0VUUkVHUzoKLQkJewotCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkgICAgICAgInB0cmFjZTogU0VUUkVHUzogKioqKiBOT1QgSU1QTEVNRU5URUQgKioqXG4iKTsKLQkJCS8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCi0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicHRyYWNlOiBTRVRSRUdTOiAqKioqIE5PVCBJTVBMRU1FTlRFRCAqKipcbiIpOworCQkvKiBTZXQgYWxsIGdwIHJlZ3MgaW4gdGhlIGNoaWxkLiAqLworCQlyZXQgPSAwOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CkBAIC00NDAsNyArNDE0LDYgQEAKIAogYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKIHsKLQogCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYwppbmRleCAzNjdlMmRjLi5hZTk3Y2E0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9yZWJvb3QuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9iZmluLWdsb2JhbC5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2Jmcm9tLmg+CiAKIC8qIEEgc3lzdGVtIHNvZnQgcmVzZXQgbWFrZXMgZXh0ZXJuYWwgbWVtb3J5IHVudXNhYmxlIHNvIGZvcmNlCiAgKiB0aGlzIGZ1bmN0aW9uIGludG8gTDEuICBXZSB1c2UgdGhlIGNvbXBpbGVyIHNzeW5jIGhlcmUgcmF0aGVyCkBAIC0yMCw3ICsyMSw3IEBACiAgKiB0aGUgY29yZSByZXNldC4KICAqLwogX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCi12b2lkIGJmaW5fcmVzZXQodm9pZCkKK3N0YXRpYyB2b2lkIGJmaW5fcmVzZXQodm9pZCkKIHsKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mICJzeXN0ZW0iIGV2ZW50cyBzdWNoIGFzIGNhY2hlIGxpbmUKIAkgKiBsaW5lIGZpbGxzIHNvIHRoYXQgd2UgYXZvaWQgaW5maW5pdGUgc3RhbGxzIGxhdGVyIG9uIGFzCkBAIC0zNCwxNSArMzUsMTUgQEAKIAkJYmZpbl93cml0ZV9TV1JTVCgweDcpOwogCiAJCS8qIER1ZSB0byB0aGUgd2F5IHJlc2V0IGlzIGhhbmRsZWQgaW4gdGhlIGhhcmR3YXJlLCB3ZSBuZWVkCi0JCSAqIHRvIGRlbGF5IGZvciA3IFNDTEtTLiAgVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIGRvIHRoaXMgaXMKLQkJICogdG8gY2FsY3VsYXRlIHRoZSBDQ0xLL1NDTEsgcmF0aW8gYW5kIG11bHRpcGx5IDcuICBGb3Igbm93LAorCQkgKiB0byBkZWxheSBmb3IgMTAgU0NMS1MuICBUaGUgb25seSByZWxpYWJsZSB3YXkgdG8gZG8gdGhpcyBpcworCQkgKiB0byBjYWxjdWxhdGUgdGhlIENDTEsvU0NMSyByYXRpbyBhbmQgbXVsdGlwbHkgMTAuICBGb3Igbm93LAogCQkgKiB3ZSdsbCBhc3N1bWUgd29yc2UgY2FzZSB3aGljaCBpcyBhIDE6MTUgcmF0aW8uCiAJCSAqLwogCQlhc20oCiAJCQkiTFNFVFVQICgxZiwgMWYpIExDMCA9ICUwXG4iCiAJCQkiMTogbm9wOyIKIAkJCToKLQkJCTogImEiICgxNSAqIDcpCisJCQk6ICJhIiAoMTUgKiAxMCkKIAkJCTogIkxDMCIsICJMQjAiLCAiTFQwIgogCQkpOwogCkBAIC03NCw3ICs3NSwxNCBAQAogewogCW5hdGl2ZV9tYWNoaW5lX3Jlc3RhcnQoY21kKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWJmaW5fcmVzZXQoKTsKKwlpZiAoQU5PTUFMWV8wNTAwMDM1MyB8fCBBTk9NQUxZXzA1MDAwMzg2KQorCQliZmluX3Jlc2V0KCk7CisJZWxzZQorCQkvKiB0aGUgYm9vdHJvbSBjaGVja3MgdG8gc2VlIGhvdyBpdCB3YXMgcmVzZXQgYW5kIHdpbGwKKwkJICogYXV0b21hdGljYWxseSBwZXJmb3JtIGEgc29mdHdhcmUgcmVzZXQgZm9yIHVzIHdoZW4KKwkJICogaXQgc3RhcnRzIGV4ZWN1dGluZyBib290CisJCSAqLworCQlhc20oInJhaXNlIDE7Iik7CiB9CiAKIF9fYXR0cmlidXRlX18oKHdlYWspKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggN2E4MmQxMC4uN2YzNWQxMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC00Miw2ICs0Miw3IEBACiBFWFBPUlRfU1lNQk9MKG1lbW9yeV9lbmQpOwogRVhQT1JUX1NZTUJPTChwaHlzaWNhbF9tZW1fZW5kKTsKIEVYUE9SVF9TWU1CT0woX3JhbWVuZCk7CitFWFBPUlRfU1lNQk9MKHJlc2VydmVkX21lbV9kY2FjaGVfb24pOwogCiAjaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9tdGRfZW5kLCBtZW1vcnlfbXRkX3N0YXJ0LCBtdGRfc2l6ZTsKQEAgLTUyLDcgKzUzLDggQEAKICNlbmRpZgogCiBjaGFyIF9faW5pdGRhdGEgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKLXVuc2lnbmVkIGludCBfX2luaXRkYXRhICpfX3JldHg7Cit2b2lkIF9faW5pdGRhdGEgKmluaXRfcmV0eCwgKmluaXRfc2F2ZWRfcmV0eCwgKmluaXRfc2F2ZWRfc2Vxc3RhdCwKKwkqaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyLCAqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwogCiAvKiBib290IG1lbW1hcCwgZm9yIHBhcnNpbmcgIm1lbW1hcD0iICovCiAjZGVmaW5lIEJGSU5fTUVNTUFQX01BWAkJMTI4IC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGJmaW5fbWVtbWFwICovCkBAIC03NywxMCArNzksMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgKm92ZXJsYXBfbGlzdFtCRklOX01FTU1BUF9NQVhdIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJmaW5fbWVtbWFwX2VudHJ5IG5ld19tYXBbQkZJTl9NRU1NQVBfTUFYXSBfX2luaXRkYXRhOwogCi12b2lkIF9faW5pdCBiZjUzeF9jYWNoZV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBiZmluX2NhY2hlX2luaXQodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi0JZ2VuZXJhdGVfY3BsX3RhYmxlcygpOworCWdlbmVyYXRlX2NwbGJfdGFibGVzKCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRQpAQCAtMTAwLDcgKzEwMiw3IEBACiAjZW5kaWYKIH0KIAotdm9pZCBfX2luaXQgYmY1M3hfcmVsb2NhdGVfbDFfbWVtKHZvaWQpCit2b2lkIF9faW5pdCBiZmluX3JlbG9jYXRlX2wxX21lbSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbDFfY29kZV9sZW5ndGg7CiAJdW5zaWduZWQgbG9uZyBsMV9kYXRhX2FfbGVuZ3RoOwpAQCAtNDEwLDcgKzQxMiw3IEBACiAgKiAgW19yYW1iYXNlLCBfcmFtc3RhcnRdOgkJa2VybmVsIGltYWdlCiAgKiAgW21lbW9yeV9zdGFydCwgbWVtb3J5X2VuZF06CQlkeW5hbWljIG1lbW9yeSBtYW5hZ2VkIGJ5IGtlcm5lbAogICogIFttZW1vcnlfZW5kLCBfcmFtZW5kXToJCXJlc2VydmVkIG1lbW9yeQotICogIAlbbWVvcnlfbXRkX3N0YXJ0KG1lbW9yeV9lbmQpLAorICogIAlbbWVtb3J5X210ZF9zdGFydChtZW1vcnlfZW5kKSwKICAqICAJCW1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZV06CXJvb3RmcyAoaWYgYW55KQogICoJW19yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OLAogICoJCV9yYW1lbmRdOgkJCXVuY2FjaGVkIERNQSByZWdpb24KQEAgLTc4MiwxNiArNzg0LDI1IEBACiAKIAlfYmZpbl9zd3JzdCA9IGJmaW5fcmVhZF9TV1JTVCgpOwogCi0JLyogSWYgd2UgZG91YmxlIGZhdWx0LCByZXNldCB0aGUgc3lzdGVtIC0gb3RoZXJ3aXNlIHdlIGhhbmcgZm9yZXZlciAqLwotCWJmaW5fd3JpdGVfU1dSU1QoRE9VQkxFX0ZBVUxUKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFRfUFJJTlQKKwliZmluX3dyaXRlX1NXUlNUKF9iZmluX3N3cnN0ICYgfkRPVUJMRV9GQVVMVCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFRfUkVTRVQKKwliZmluX3dyaXRlX1NXUlNUKF9iZmluX3N3cnN0IHwgRE9VQkxFX0ZBVUxUKTsKKyNlbmRpZgogCi0JaWYgKF9iZmluX3N3cnN0ICYgUkVTRVRfRE9VQkxFKQotCQkvKgotCQkgKiBkb24ndCBkZWNvZGUgdGhlIGFkZHJlc3MsIHNpbmNlIHlvdSBkb24ndCBrbm93IGlmIHRoaXMKLQkJICoga2VybmVsJ3Mgc3ltYm9sIG1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgY3Jhc2hpbmcga2VybmVsCi0JCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJSZWNvdmVyaW5nIGZyb20gRG91YmxlIEZhdWx0IGV2ZW50IGF0ICVwRlxuIiwgX19yZXR4KTsKLQllbHNlIGlmIChfYmZpbl9zd3JzdCAmIFJFU0VUX1dET0cpCisJaWYgKF9iZmluX3N3cnN0ICYgUkVTRVRfRE9VQkxFKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJSZWNvdmVyaW5nIGZyb20gRE9VQkxFIEZBVUxUIGV2ZW50XG4iKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkJLyogV2UgYXNzdW1lIHRoZSBjcmFzaGluZyBrZXJuZWwsIGFuZCB0aGUgY3VycmVudCBzeW1ib2wgdGFibGUgbWF0Y2ggKi8KKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiBXaGlsZSBoYW5kbGluZyBleGNlcHRpb24gKEVYQ0FVU0UgPSAweCV4KSBhdCAlcEZcbiIsCisJCQkoaW50KWluaXRfc2F2ZWRfc2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSwgaW5pdF9zYXZlZF9yZXR4KTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBEQ1BMQl9GQVVMVF9BRERSOiAlcEZcbiIsIGluaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgSUNQTEJfRkFVTFRfQUREUjogJXBGXG4iLCBpbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHIpOworI2VuZGlmCisJCXByaW50ayhLRVJOX05PVElDRSAiIFRoZSBpbnN0cnVjdGlvbiBhdCAlcEYgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwKKwkJCWluaXRfcmV0eCk7CisJfSBlbHNlIGlmIChfYmZpbl9zd3JzdCAmIFJFU0VUX1dET0cpCiAJCXByaW50ayhLRVJOX0lORk8gIlJlY292ZXJpbmcgZnJvbSBXYXRjaGRvZyBldmVudFxuIik7CiAJZWxzZSBpZiAoX2JmaW5fc3dyc3QgJiBSRVNFVF9TT0ZUV0FSRSkKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJSZXNldCBjYXVzZWQgYnkgU29mdHdhcmUgcmVzZXRcbiIpOwpAQCAtODAzLDE3ICs4MTQsMjQgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQ29tcGlsZWQgZm9yIEFEU1AtJXMgUmV2IG5vbmVcbiIsIENQVSk7CiAJZWxzZQogCQlwcmludGsoS0VSTl9JTkZPICJDb21waWxlZCBmb3IgQURTUC0lcyBSZXYgMC4lZFxuIiwgQ1BVLCBiZmluX2NvbXBpbGVkX3JldmlkKCkpOwotCWlmIChiZmluX3JldmlkKCkgIT0gYmZpbl9jb21waWxlZF9yZXZpZCgpKSB7Ci0JCWlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgPT0gLTEpCi0JCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmc6IENvbXBpbGVkIGZvciBSZXYgbm9uZSwgYnV0IHJ1bm5pbmcgb24gUmV2ICVkXG4iLAotCQkJICAgICAgIGJmaW5fcmV2aWQoKSk7Ci0JCWVsc2UgaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSAhPSAweGZmZmYpCi0JCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmc6IENvbXBpbGVkIGZvciBSZXYgJWQsIGJ1dCBydW5uaW5nIG9uIFJldiAlZFxuIiwKLQkJCSAgICAgICBiZmluX2NvbXBpbGVkX3JldmlkKCksIGJmaW5fcmV2aWQoKSk7CisKKwlpZiAodW5saWtlbHkoQ1BVSUQgIT0gYmZpbl9jcHVpZCgpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogTm90IHJ1bm5pbmcgb24gQURTUC0lczogdW5rbm93biBDUFVJRCAweCUwNHggUmV2IDAuJWRcbiIsCisJCQlDUFUsIGJmaW5fY3B1aWQoKSwgYmZpbl9yZXZpZCgpKTsKKwllbHNlIHsKKwkJaWYgKGJmaW5fcmV2aWQoKSAhPSBiZmluX2NvbXBpbGVkX3JldmlkKCkpIHsKKwkJCWlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgPT0gLTEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBDb21waWxlZCBmb3IgUmV2IG5vbmUsIGJ1dCBydW5uaW5nIG9uIFJldiAlZFxuIiwKKwkJCQkgICAgICAgYmZpbl9yZXZpZCgpKTsKKwkJCWVsc2UgaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSAhPSAweGZmZmYpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBDb21waWxlZCBmb3IgUmV2ICVkLCBidXQgcnVubmluZyBvbiBSZXYgJWRcbiIsCisJCQkJICAgICAgIGJmaW5fY29tcGlsZWRfcmV2aWQoKSwgYmZpbl9yZXZpZCgpKTsKKwkJfQorCQlpZiAoYmZpbl9yZXZpZCgpIDw9IENPTkZJR19CRl9SRVZfTUlOIHx8IGJmaW5fcmV2aWQoKSA+IENPTkZJR19CRl9SRVZfTUFYKQorCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBVbnN1cHBvcnRlZCBDaGlwIFJldmlzaW9uIEFEU1AtJXMgUmV2IDAuJWQgZGV0ZWN0ZWRcbiIsCisJCQkgICAgICAgQ1BVLCBiZmluX3JldmlkKCkpOwogCX0KLQlpZiAoYmZpbl9yZXZpZCgpIDwgU1VQUE9SVEVEX1JFVklEKQotCQlwcmludGsoS0VSTl9FUlIgIldhcm5pbmc6IFVuc3VwcG9ydGVkIENoaXAgUmV2aXNpb24gQURTUC0lcyBSZXYgMC4lZCBkZXRlY3RlZFxuIiwKLQkJICAgICAgIENQVSwgYmZpbl9yZXZpZCgpKTsKKwogCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIExpbnV4IHN1cHBvcnQgYnkgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnL1xuIik7CiAKIAlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3IgU3BlZWQ6ICVsdSBNSHogY29yZSBjbG9jayBhbmQgJWx1IE1IeiBTeXN0ZW0gQ2xvY2tcbiIsCkBAIC04NTAsNyArODY4LDcgQEAKIAkJIT0gU0FGRV9VU0VSX0lOU1RSVUNUSU9OIC0gRklYRURfQ09ERV9TVEFSVCk7CiAKIAlpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKCk7Ci0JYmY1M3hfY2FjaGVfaW5pdCgpOworCWJmaW5fY2FjaGVfaW5pdCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCkBAIC05ODYsMTMgKzEwMDQsMTggQEAKIAl9CiAKIAlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdDogJWRcbiIKLQkJInZlbmRvcl9pZFx0OiAlc1xuIgotCQkiY3B1IGZhbWlseVx0OiAweCV4XG4iCi0JCSJtb2RlbCBuYW1lXHQ6IEFEU1AtJXMgJWx1KE1IeiBDQ0xLKSAlbHUoTUh6IFNDTEspICglcylcbiIKKwkJInZlbmRvcl9pZFx0OiAlc1xuIiwKKwkJKih1bnNpZ25lZCBpbnQgKil2LAorCQl2ZW5kb3IpOworCisJaWYgKENQVUlEID09IGJmaW5fY3B1aWQoKSkKKwkJc2VxX3ByaW50ZihtLCAiY3B1IGZhbWlseVx0OiAweCUwNHhcbiIsIENQVUlEKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgImNwdSBmYW1pbHlcdDogQ29tcGlsZWQgZm9yOjB4JTA0eCwgcnVubmluZyBvbjoweCUwNHhcbiIsCisJCQlDUFVJRCwgYmZpbl9jcHVpZCgpKTsKKworCXNlcV9wcmludGYobSwgIm1vZGVsIG5hbWVcdDogQURTUC0lcyAlbHUoTUh6IENDTEspICVsdShNSHogU0NMSykgKCVzKVxuIgogCQkic3RlcHBpbmdcdDogJWRcbiIsCi0JCTAsCi0JCXZlbmRvciwKLQkJKGJmaW5fcmVhZF9DSElQSUQoKSAmIENISVBJRF9GQU1JTFkpLAogCQljcHUsIGNjbGsvMTAwMDAwMCwgc2Nsay8xMDAwMDAwLAogI2lmZGVmIENPTkZJR19NUFUKIAkJIm1wdSBvbiIsCkBAIC0xMDM4LDcgKzEwNjEsNyBAQAogCWlmICgoYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpICYgKEVORENQTEIgfCBETUNfRU5BQkxFKSkgIT0gKEVORENQTEIgfCBETUNfRU5BQkxFKSkKIAkJZGNhY2hlX3NpemUgPSAwOwogCi0JaWYgKChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgJiAoSU1DIHwgRU5JQ1BMQikpID09IChJTUMgfCBFTklDUExCKSkKKwlpZiAoKGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKSAmIChJTUMgfCBFTklDUExCKSkgIT0gKElNQyB8IEVOSUNQTEIpKQogCQlpY2FjaGVfc2l6ZSA9IDA7CiAKIAlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCKEwxIGljYWNoZSkgIgpAQCAtMTEyNywxMiArMTE1MCwxOCBAQAogCiBzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/ICgodm9pZCAqKTB4MTIzNDU2NzgpIDogTlVMTDsKKwlpZiAoKnBvcyA9PSAwKQorCQkqcG9zID0gZmlyc3RfY3B1KGNwdV9vbmxpbmVfbWFwKTsKKwlpZiAoKnBvcyA+PSBudW1fb25saW5lX2NwdXMoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcG9zOwogfQogCiBzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0JKysqcG9zOworCSpwb3MgPSBuZXh0X2NwdSgqcG9zLCBjcHVfb25saW5lX21hcCk7CisKIAlyZXR1cm4gY19zdGFydChtLCBwb3MpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYwppbmRleCA5YTlkNTA4Li4xYWEyYzc4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKQEAgLTM0LDIwICszNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY3BsYi5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9pcnFfaGFuZGxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS90cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9maXhlZF9jb2RlLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgogCiAjaWZkZWYgQ09ORklHX0tHREIKLSMgaW5jbHVkZSA8bGludXgvZGVidWdnZXIuaD4KICMgaW5jbHVkZSA8bGludXgva2dkYi5oPgogCiAjIGRlZmluZSBDSEtfREVCVUdHRVJfVFJBUCgpIFwKIAlkbyB7IFwKLQkJQ0hLX0RFQlVHR0VSKHRyYXBuciwgc2lnLCBpbmZvLnNpX2NvZGUsIGZwLCApOyBcCisJCWtnZGJfaGFuZGxlX2V4Y2VwdGlvbih0cmFwbnIsIHNpZywgaW5mby5zaV9jb2RlLCBmcCk7IFwKIAl9IHdoaWxlICgwKQogIyBkZWZpbmUgQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKSBcCiAJZG8geyBcCkBAIC01OSw2ICs1OCwxNSBAQAogIyBkZWZpbmUgQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorCisjaWZkZWYgQ09ORklHX1ZFUkJPU0VfREVCVUcKKyNkZWZpbmUgdmVyYm9zZV9wcmludGsoZm10LCBhcmcuLi4pIFwKKwlwcmludGsoZm10LCAjI2FyZykKKyNlbHNlCisjZGVmaW5lIHZlcmJvc2VfcHJpbnRrKGZtdCwgYXJnLi4uKSBcCisJKHsgaWYgKDApIHByaW50ayhmbXQsICMjYXJnKTsgMDsgfSkKKyNlbmRpZgorCiAvKiBJbml0aWF0ZSB0aGUgZXZlbnQgdGFibGUgaGFuZGxlciAqLwogdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCiB7CkBAIC02NywxMCArNzUsMTkgQEAKIAlDU1lOQygpOwogfQogCi11bnNpZ25lZCBsb25nIHNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIsIHNhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7CisvKgorICogVXNlZCB0byBzYXZlIHRoZSBSRVRYLCBTRVFTVEFULCBJL0QgQ1BMQiBGQVVMVCBBRERSCisgKiB2YWx1ZXMgYWNyb3NzIHRoZSB0cmFuc2l0aW9uIGZyb20gZXhjZXB0aW9uIHRvIElSUTUuCisgKiBXZSBwdXQgdGhlc2UgaW4gTDEsIHNvIHRoZXkgYXJlIGdvaW5nIHRvIGJlIGluIGEgdmFsaWQKKyAqIGxvY2F0aW9uIGR1cmluZyBleGNlcHRpb24gY29udGV4dAorICovCitfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfcmV0eCwgc2F2ZWRfc2Vxc3RhdCwKKwlzYXZlZF9pY3BsYl9mYXVsdF9hZGRyLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwogCiBzdGF0aWMgdm9pZCBkZWNvZGVfYWRkcmVzcyhjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKKyNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQogCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKQEAgLTE3OCwxNiArMTk1LDM5IEBACiAKIGRvbmU6CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKKyNlbHNlCisJc3ByaW50ZihidWYsICIgIik7CisjZW5kaWYKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvdWJsZV9mYXVsdF9jKHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKIAljb25zb2xlX3ZlcmJvc2UoKTsKIAlvb3BzX2luX3Byb2dyZXNzID0gMTsKKyNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQogCXByaW50ayhLRVJOX0VNRVJHICJcbiIgS0VSTl9FTUVSRyAiRG91YmxlIEZhdWx0XG4iKTsKLQlkdW1wX2JmaW5fcHJvY2VzcyhmcCk7Ci0JZHVtcF9iZmluX21lbShmcCk7Ci0Jc2hvd19yZWdzKGZwKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFRfUFJJTlQKKwlpZiAoKChsb25nKWZwLT5zZXFzdGF0ICYgIFNFUVNUQVRfRVhDQVVTRSkgPT0gVkVDX1VOQ09WKSB7CisJCWNoYXIgYnVmWzE1MF07CisJCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfcmV0eCk7CisJCXByaW50ayhLRVJOX0VNRVJHICJXaGlsZSBoYW5kbGluZyBleGNlcHRpb24gKEVYQ0FVU0UgPSAweCV4KSBhdCAlczpcbiIsCisJCQkoaW50KXNhdmVkX3NlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UsIGJ1Zik7CisJCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgRENQTEJfRkFVTFRfQUREUjogJXNcbiIsIGJ1Zik7CisJCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgSUNQTEJfRkFVTFRfQUREUjogJXNcbiIsIGJ1Zik7CisKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBmcC0+cmV0eCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiVGhlIGluc3RydWN0aW9uIGF0ICVzIGNhdXNlZCBhIGRvdWJsZSBleGNlcHRpb25cbiIsCisJCQlidWYpOworCX0gZWxzZQorI2VuZGlmCisJeworCQlkdW1wX2JmaW5fcHJvY2VzcyhmcCk7CisJCWR1bXBfYmZpbl9tZW0oZnApOworCQlzaG93X3JlZ3MoZnApOworCX0KKyNlbmRpZgogCXBhbmljKCJEb3VibGUgRmF1bHQgLSB1bnJlY292ZXJhYmxlIGV2ZW50XG4iKTsKIAogfQpAQCAtMjU5LDM0ICsyOTksNDIgQEAKIAkJCXJldHVybjsKIAkJZWxzZQogCQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0tHREIKLQljYXNlIFZFQ19FWENQVDAyIDoJCSAvKiBnZGIgY29ubmVjdGlvbiAqLwotCQlpbmZvLnNpX2NvZGUgPSBUUkFQX0lMTFRSQVA7Ci0JCXNpZyA9IFNJR1RSQVA7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7Ci0JCXJldHVybjsKLSNlbHNlCi0JLyogMHgwMiAtIFVzZXIgRGVmaW5lZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KLSNlbmRpZgogCS8qIDB4MDMgLSBVc2VyIERlZmluZWQsIHVzZXJzcGFjZSBzdGFjayBvdmVyZmxvdyAqLwogCWNhc2UgVkVDX0VYQ1BUMDM6CiAJCWluZm8uc2lfY29kZSA9IFNFR1ZfU1RBQ0tGTE9XOwogCQlzaWcgPSBTSUdTRUdWOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MDMoS0VSTl9OT1RJQ0UpKTsKLQkJQ0hLX0RFQlVHR0VSX1RSQVAoKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MDMoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7Ci0JLyogMHgwNCAtIFVzZXIgRGVmaW5lZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KLQkvKiAweDA1IC0gVXNlciBEZWZpbmVkLCBDYXVnaHQgYnkgZGVmYXVsdCAqLwotCS8qIDB4MDYgLSBVc2VyIERlZmluZWQsIENhdWdodCBieSBkZWZhdWx0ICovCi0JLyogMHgwNyAtIFVzZXIgRGVmaW5lZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KLQkvKiAweDA4IC0gVXNlciBEZWZpbmVkLCBDYXVnaHQgYnkgZGVmYXVsdCAqLwotCS8qIDB4MDkgLSBVc2VyIERlZmluZWQsIENhdWdodCBieSBkZWZhdWx0ICovCi0JLyogMHgwQSAtIFVzZXIgRGVmaW5lZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KLQkvKiAweDBCIC0gVXNlciBEZWZpbmVkLCBDYXVnaHQgYnkgZGVmYXVsdCAqLwotCS8qIDB4MEMgLSBVc2VyIERlZmluZWQsIENhdWdodCBieSBkZWZhdWx0ICovCi0JLyogMHgwRCAtIFVzZXIgRGVmaW5lZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KLQkvKiAweDBFIC0gVXNlciBEZWZpbmVkLCBDYXVnaHQgYnkgZGVmYXVsdCAqLwotCS8qIDB4MEYgLSBVc2VyIERlZmluZWQsIENhdWdodCBieSBkZWZhdWx0ICovCisJLyogMHgwMiAtIEtHREIgaW5pdGlhbCBjb25uZWN0aW9uIGFuZCBicmVhayBzaWduYWwgdHJhcCAqLworCWNhc2UgVkVDX0VYQ1BUMDI6CisjaWZkZWYgQ09ORklHX0tHREIKKwkJaW5mby5zaV9jb2RlID0gVFJBUF9JTExUUkFQOworCQlzaWcgPSBTSUdUUkFQOworCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQlyZXR1cm47CisjZW5kaWYKKwkvKiAweDA0IC0gVXNlciBEZWZpbmVkICovCisJLyogMHgwNSAtIFVzZXIgRGVmaW5lZCAqLworCS8qIDB4MDYgLSBVc2VyIERlZmluZWQgKi8KKwkvKiAweDA3IC0gVXNlciBEZWZpbmVkICovCisJLyogMHgwOCAtIFVzZXIgRGVmaW5lZCAqLworCS8qIDB4MDkgLSBVc2VyIERlZmluZWQgKi8KKwkvKiAweDBBIC0gVXNlciBEZWZpbmVkICovCisJLyogMHgwQiAtIFVzZXIgRGVmaW5lZCAqLworCS8qIDB4MEMgLSBVc2VyIERlZmluZWQgKi8KKwkvKiAweDBEIC0gVXNlciBEZWZpbmVkICovCisJLyogMHgwRSAtIFVzZXIgRGVmaW5lZCAqLworCS8qIDB4MEYgLSBVc2VyIERlZmluZWQgKi8KKwkvKiBJZiB3ZSBnb3QgaGVyZSwgaXQgaXMgbW9zdCBsaWtlbHkgdGhhdCBzb21lb25lIHdhcyB0cnlpbmcgdG8gdXNlIGEKKwkgKiBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIsIGFuZCBpdCBpcyBub3QgYWN0dWFsbHkgaW5zdGFsbGVkIHByb3Blcmx5CisJICovCisJY2FzZSBWRUNfRVhDUFQwNCAuLi4gVkVDX0VYQ1BUMTU6CisJCWluZm8uc2lfY29kZSA9IElMTF9JTExQQVJBT1A7CisJCXNpZyA9IFNJR0lMTDsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MDQoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKKwkJYnJlYWs7CiAJLyogMHgxMCBIVyBTaW5nbGUgc3RlcCwgaGFuZGxlZCBoZXJlICovCiAJY2FzZSBWRUNfU1RFUDoKIAkJaW5mby5zaV9jb2RlID0gVFJBUF9TVEVQOwpAQCAtMzAxLDggKzM0OSw4IEBACiAJY2FzZSBWRUNfT1ZGTE9XOgogCQlpbmZvLnNpX2NvZGUgPSBUUkFQX1RSQUNFRkxPVzsKIAkJc2lnID0gU0lHVFJBUDsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDExKEtFUk5fTk9USUNFKSk7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDExKEtFUk5fTk9USUNFKSk7CisJCUNIS19ERUJVR0dFUl9UUkFQX01BWUJFKCk7CiAJCWJyZWFrOwogCS8qIDB4MTIgLSBSZXNlcnZlZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KIAkvKiAweDEzIC0gUmVzZXJ2ZWQsIENhdWdodCBieSBkZWZhdWx0ICovCkBAIC0zMjMsNDQgKzM3MSw0MyBAQAogCWNhc2UgVkVDX1VOREVGX0k6CiAJCWluZm8uc2lfY29kZSA9IElMTF9JTExPUEM7CiAJCXNpZyA9IFNJR0lMTDsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDIxKEtFUk5fTk9USUNFKSk7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDIxKEtFUk5fTk9USUNFKSk7CisJCUNIS19ERUJVR0dFUl9UUkFQX01BWUJFKCk7CiAJCWJyZWFrOwogCS8qIDB4MjIgLSBJbGxlZ2FsIEluc3RydWN0aW9uIENvbWJpbmF0aW9uLCBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19JTEdBTF9JOgogCQlpbmZvLnNpX2NvZGUgPSBJTExfSUxMUEFSQU9QOwogCQlzaWcgPSBTSUdJTEw7Ci0JCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyMihLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSBFWENfMHgyMihLRVJOX05PVElDRSkpOworCQlDSEtfREVCVUdHRVJfVFJBUF9NQVlCRSgpOwogCQlicmVhazsKIAkvKiAweDIzIC0gRGF0YSBDUExCIHByb3RlY3Rpb24gdmlvbGF0aW9uLCBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19DUExCX1ZMOgogCQlpbmZvLnNpX2NvZGUgPSBJTExfQ1BMQl9WSTsKIAkJc2lnID0gU0lHQlVTOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MjMoS0VSTl9OT1RJQ0UpKTsKLQkJQ0hLX0RFQlVHR0VSX1RSQVAoKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MjMoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAJLyogMHgyNCAtIERhdGEgYWNjZXNzIG1pc2FsaWduZWQsIGhhbmRsZWQgaGVyZSAqLwogCWNhc2UgVkVDX01JU0FMSV9EOgogCQlpbmZvLnNpX2NvZGUgPSBCVVNfQURSQUxOOwogCQlzaWcgPSBTSUdCVVM7Ci0JCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyNChLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSBFWENfMHgyNChLRVJOX05PVElDRSkpOworCQlDSEtfREVCVUdHRVJfVFJBUF9NQVlCRSgpOwogCQlicmVhazsKIAkvKiAweDI1IC0gVW5yZWNvdmVyYWJsZSBFdmVudCwgaGFuZGxlZCBoZXJlICovCiAJY2FzZSBWRUNfVU5DT1Y6CiAJCWluZm8uc2lfY29kZSA9IElMTF9JTExFWENQVDsKIAkJc2lnID0gU0lHSUxMOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MjUoS0VSTl9OT1RJQ0UpKTsKLQkJQ0hLX0RFQlVHR0VSX1RSQVAoKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MjUoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAJLyogMHgyNiAtIERhdGEgQ1BMQiBNaXNzLCBub3JtYWwgY2FzZSBpcyBoYW5kbGVkIGluIF9jcGxiX2hkciwKIAkJZXJyb3IgY2FzZSBpcyBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19DUExCX006CiAJCWluZm8uc2lfY29kZSA9IEJVU19BRFJBTE47CiAJCXNpZyA9IFNJR0JVUzsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDI2KEtFUk5fTk9USUNFKSk7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDI2KEtFUk5fTk9USUNFKSk7CiAJCWJyZWFrOwogCS8qIDB4MjcgLSBEYXRhIENQTEIgTXVsdGlwbGUgSGl0cyAtIExpbnV4IFRyYXAgWmVybywgaGFuZGxlZCBoZXJlICovCiAJY2FzZSBWRUNfQ1BMQl9NSElUOgpAQCAtMzY4LDExICs0MTUsMTEgQEAKIAkJc2lnID0gU0lHU0VHVjsKICNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwogCQlpZiAoc2F2ZWRfZGNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5VTEwgcG9pbnRlciBhY2Nlc3NcbiIpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIk5VTEwgcG9pbnRlciBhY2Nlc3NcbiIpOwogCQllbHNlCiAjZW5kaWYKLQkJCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyNyhLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MjcoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAJLyogMHgyOCAtIEVtdWxhdGlvbiBXYXRjaHBvaW50LCBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19XQVRDSDoKQEAgLTM5MCw4ICs0MzcsOCBAQAogCWNhc2UgVkVDX0lTVFJVX1ZMOiAgICAgIC8qIEFEU1AtQkY1MzUgb25seSAoTUgpICovCiAJCWluZm8uc2lfY29kZSA9IEJVU19PUEZFVENIOwogCQlzaWcgPSBTSUdCVVM7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiQkY1MzU6IFZFQ19JU1RSVV9WTFxuIik7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJCRjUzNTogVkVDX0lTVFJVX1ZMXG4iKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAjZWxzZQogCS8qIDB4MjkgLSBSZXNlcnZlZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KQEAgLTQwMCwyMiArNDQ3LDIxIEBACiAJY2FzZSBWRUNfTUlTQUxJX0k6CiAJCWluZm8uc2lfY29kZSA9IEJVU19BRFJBTE47CiAJCXNpZyA9IFNJR0JVUzsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDJBKEtFUk5fTk9USUNFKSk7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDJBKEtFUk5fTk9USUNFKSk7CisJCUNIS19ERUJVR0dFUl9UUkFQX01BWUJFKCk7CiAJCWJyZWFrOwogCS8qIDB4MkIgLSBJbnN0cnVjdGlvbiBDUExCIHByb3RlY3Rpb24gdmlvbGF0aW9uLCBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19DUExCX0lfVkw6CiAJCWluZm8uc2lfY29kZSA9IElMTF9DUExCX1ZJOwogCQlzaWcgPSBTSUdCVVM7Ci0JCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyQihLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSBFWENfMHgyQihLRVJOX05PVElDRSkpOworCQlDSEtfREVCVUdHRVJfVFJBUF9NQVlCRSgpOwogCQlicmVhazsKIAkvKiAweDJDIC0gSW5zdHJ1Y3Rpb24gQ1BMQiBtaXNzLCBoYW5kbGVkIGluIF9jcGxiX2hkciAqLwogCWNhc2UgVkVDX0NQTEJfSV9NOgogCQlpbmZvLnNpX2NvZGUgPSBJTExfQ1BMQl9NSVNTOwogCQlzaWcgPSBTSUdCVVM7Ci0JCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyQyhLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSBFWENfMHgyQyhLRVJOX05PVElDRSkpOwogCQlicmVhazsKIAkvKiAweDJEIC0gSW5zdHJ1Y3Rpb24gQ1BMQiBNdWx0aXBsZSBIaXRzLCBoYW5kbGVkIGhlcmUgKi8KIAljYXNlIFZFQ19DUExCX0lfTUhJVDoKQEAgLTQyMywxOCArNDY5LDE4IEBACiAJCXNpZyA9IFNJR1NFR1Y7CiAjaWZkZWYgQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8KIAkJaWYgKHNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIgPCBGSVhFRF9DT0RFX1NUQVJUKQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJKdW1wIHRvIE5VTEwgYWRkcmVzc1xuIik7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiSnVtcCB0byBOVUxMIGFkZHJlc3NcbiIpOwogCQllbHNlCiAjZW5kaWYKLQkJCXByaW50ayhLRVJOX05PVElDRSBFWENfMHgyRChLRVJOX05PVElDRSkpOwotCQlDSEtfREVCVUdHRVJfVFJBUCgpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgRVhDXzB4MkQoS0VSTl9OT1RJQ0UpKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAJLyogMHgyRSAtIElsbGVnYWwgdXNlIG9mIFN1cGVydmlzb3IgUmVzb3VyY2UsIGhhbmRsZWQgaGVyZSAqLwogCWNhc2UgVkVDX0lMTF9SRVM6CiAJCWluZm8uc2lfY29kZSA9IElMTF9QUlZPUEM7CiAJCXNpZyA9IFNJR0lMTDsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDJFKEtFUk5fTk9USUNFKSk7Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEVYQ18weDJFKEtFUk5fTk9USUNFKSk7CisJCUNIS19ERUJVR0dFUl9UUkFQX01BWUJFKCk7CiAJCWJyZWFrOwogCS8qIDB4MkYgLSBSZXNlcnZlZCwgQ2F1Z2h0IGJ5IGRlZmF1bHQgKi8KIAkvKiAweDMwIC0gUmVzZXJ2ZWQsIENhdWdodCBieSBkZWZhdWx0ICovCkBAIC00NjEsMTcgKzUwNywxNyBAQAogCQljYXNlIChTRVFTVEFUX0hXRVJSQ0FVU0VfU1lTVEVNX01NUik6CiAJCQlpbmZvLnNpX2NvZGUgPSBCVVNfQURSQUxOOwogCQkJc2lnID0gU0lHQlVTOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFIEhXQ194MihLRVJOX05PVElDRSkpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgSFdDX3gyKEtFUk5fTk9USUNFKSk7CiAJCQlicmVhazsKIAkJLyogRXh0ZXJuYWwgTWVtb3J5IEFkZHJlc3NpbmcgRXJyb3IgKi8KIAkJY2FzZSAoU0VRU1RBVF9IV0VSUkNBVVNFX0VYVEVSTl9BRERSKToKIAkJCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CiAJCQlzaWcgPSBTSUdCVVM7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgSFdDX3gzKEtFUk5fTk9USUNFKSk7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSBIV0NfeDMoS0VSTl9OT1RJQ0UpKTsKIAkJCWJyZWFrOwogCQkvKiBQZXJmb3JtYW5jZSBNb25pdG9yIE92ZXJmbG93ICovCiAJCWNhc2UgKFNFUVNUQVRfSFdFUlJDQVVTRV9QRVJGX0ZMT1cpOgotCQkJcHJpbnRrKEtFUk5fTk9USUNFIEhXQ194MTIoS0VSTl9OT1RJQ0UpKTsKKwkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFIEhXQ194MTIoS0VSTl9OT1RJQ0UpKTsKIAkJCWJyZWFrOwogCQkvKiBSQUlTRSA1IGluc3RydWN0aW9uICovCiAJCWNhc2UgKFNFUVNUQVRfSFdFUlJDQVVTRV9SQUlTRV81KToKQEAgLTQ4MSwyMSArNTI3LDI1IEBACiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgSFdDX2RlZmF1bHQoS0VSTl9OT1RJQ0UpKTsKIAkJCWJyZWFrOwogCQl9Ci0JCUNIS19ERUJVR0dFUl9UUkFQKCk7CisJCUNIS19ERUJVR0dFUl9UUkFQX01BWUJFKCk7CiAJCWJyZWFrOworCS8qCisJICogV2Ugc2hvdWxkIGJlIGhhbmRsaW5nIGFsbCBrbm93biBleGNlcHRpb24gdHlwZXMgYWJvdmUsCisJICogaWYgd2UgZ2V0IGhlcmUgd2UgaGl0IGEgcmVzZXJ2ZWQgb25lLCBzbyBwYW5pYworCSAqLwogCWRlZmF1bHQ6Ci0JCWluZm8uc2lfY29kZSA9IFRSQVBfSUxMVFJBUDsKLQkJc2lnID0gU0lHVFJBUDsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkNhdWdodCBVbmhhbmRsZWQgRXhjZXB0aW9uLCBjb2RlID0gJTA4bHhcbiIsCisJCW9vcHNfaW5fcHJvZ3Jlc3MgPSAxOworCQlpbmZvLnNpX2NvZGUgPSBJTExfSUxMUEFSQU9QOworCQlzaWcgPSBTSUdJTEw7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fRU1FUkcgIkNhdWdodCBVbmhhbmRsZWQgRXhjZXB0aW9uLCBjb2RlID0gJTA4bHhcbiIsCiAJCQkoZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UpKTsKLQkJQ0hLX0RFQlVHR0VSX1RSQVAoKTsKKwkJQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKTsKIAkJYnJlYWs7CiAJfQogCiAJQlVHX09OKHNpZyA9PSAwKTsKIAogCWlmIChzaWcgIT0gU0lHVFJBUCkgewotCQl1bnNpZ25lZCBsb25nICpzdGFjazsKIAkJZHVtcF9iZmluX3Byb2Nlc3MoZnApOwogCQlkdW1wX2JmaW5fbWVtKGZwKTsKIAkJc2hvd19yZWdzKGZwKTsKQEAgLTUwMyw3ICs1NTMsNyBAQAogCQkvKiBQcmludCBvdXQgdGhlIHRyYWNlIGJ1ZmZlciBpZiBpdCBtYWtlcyBzZW5zZSAqLwogI2lmbmRlZiBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UKIAkJaWYgKHRyYXBuciA9PSBWRUNfQ1BMQl9JX00gfHwgdHJhcG5yID09IFZFQ19DUExCX00pCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vIHRyYWNlIHNpbmNlIHlvdSBkbyBub3QgaGF2ZSAiCisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiTm8gdHJhY2Ugc2luY2UgeW91IGRvIG5vdCBoYXZlICIKIAkJCQkiQ09ORklHX0RFQlVHX0JGSU5fTk9fS0VSTl9IV1RSQUNFIGVuYWJsZWRcbiIKIAkJCQlLRVJOX05PVElDRSAiXG4iKTsKIAkJZWxzZQpAQCAtNTEyLDIwICs1NjIsMjIgQEAKIAogCQlpZiAob29wc19pbl9wcm9ncmVzcykgewogCQkJLyogRHVtcCB0aGUgY3VycmVudCBrZXJuZWwgc3RhY2sgKi8KLQkJCXByaW50ayhLRVJOX05PVElDRSAiXG4iIEtFUk5fTk9USUNFICJLZXJuZWwgU3RhY2tcbiIpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIlxuIiBLRVJOX05PVElDRSAiS2VybmVsIFN0YWNrXG4iKTsKIAkJCXNob3dfc3RhY2soY3VycmVudCwgTlVMTCk7Ci0KIAkJCXByaW50X21vZHVsZXMoKTsKICNpZm5kZWYgQ09ORklHX0FDQ0VTU19DSEVDSwotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIlBsZWFzZSB0dXJuIG9uICIKKwkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fRU1FUkcgIlBsZWFzZSB0dXJuIG9uICIKIAkJCSAgICAgICAiQ09ORklHX0FDQ0VTU19DSEVDS1xuIik7CiAjZW5kaWYKIAkJCXBhbmljKCJLZXJuZWwgZXhjZXB0aW9uIik7CiAJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1ZFUkJPU0VfREVCVUcKKwkJCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCQkJLyogRHVtcCB0aGUgdXNlciBzcGFjZSBzdGFjayAqLwogCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXJkdXNwKCk7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzZXJzcGFjZSBTdGFja1xuIik7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiVXNlcnNwYWNlIFN0YWNrXG4iKTsKIAkJCXNob3dfc3RhY2soTlVMTCwgc3RhY2spOworI2VuZGlmCiAJCX0KIAl9CiAKQEAgLTU0Niw3ICs1OTgsNyBAQAogICogU2ltaWxhciB0byBnZXRfdXNlciwgZG8gc29tZSBhZGRyZXNzIGNoZWNraW5nLCB0aGVuIGRlcmVmZXJlbmNlCiAgKiBSZXR1cm4gdHJ1ZSBvbiBzdWNlc3MsIGZhbHNlIG9uIGJhZCBhZGRyZXNzCiAgKi8KLWJvb2wgZ2V0X2luc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0ICp2YWwsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorc3RhdGljIGJvb2wgZ2V0X2luc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0ICp2YWwsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQogewogCiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtNTkyLDcgKzY0NCw3IEBACiAKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCiAJaWYgKGFkZHIgPj0gTDFfQ09ERV9TVEFSVCAmJiAoYWRkciArIDIpIDw9IChMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpKSB7Ci0JCWRtYV9tZW1jcHkodmFsLCBhZGRyZXNzLCAyKTsKKwkJaXNyYW1fbWVtY3B5KHZhbCwgYWRkcmVzcywgMik7CiAJCXJldHVybiB0cnVlOwogCX0KICNlbmRpZgpAQCAtNjA3LDQ1ICs2NTksNDggQEAKICAqIFRoZXNlIGFyZSB0aGUgbm9ybWFsIGluc3RydWN0aW9ucyB3aGljaCBjYXVzZSBjaGFuZ2Ugb2YgZmxvdywgd2hpY2gKICAqIHdvdWxkIGJlIGF0IHRoZSBzb3VyY2Ugb2YgdGhlIHRyYWNlIGJ1ZmZlcgogICovCi12b2lkIGRlY29kZV9pbnN0cnVjdGlvbih1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcykKKyNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQorc3RhdGljIHZvaWQgZGVjb2RlX2luc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQogewogCXVuc2lnbmVkIHNob3J0IG9wY29kZTsKIAogCWlmIChnZXRfaW5zdHJ1Y3Rpb24oJm9wY29kZSwgYWRkcmVzcykpIHsKIAkJaWYgKG9wY29kZSA9PSAweDAwMTApCi0JCQlwcmludGsoIlJUUyIpOworCQkJdmVyYm9zZV9wcmludGsoIlJUUyIpOwogCQllbHNlIGlmIChvcGNvZGUgPT0gMHgwMDExKQotCQkJcHJpbnRrKCJSVEkiKTsKKwkJCXZlcmJvc2VfcHJpbnRrKCJSVEkiKTsKIAkJZWxzZSBpZiAob3Bjb2RlID09IDB4MDAxMikKLQkJCXByaW50aygiUlRYIik7CisJCQl2ZXJib3NlX3ByaW50aygiUlRYIik7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweDAwNTAgJiYgb3Bjb2RlIDw9IDB4MDA1NykKLQkJCXByaW50aygiSlVNUCAoUCVpKSIsIG9wY29kZSAmIDcpOworCQkJdmVyYm9zZV9wcmludGsoIkpVTVAgKFAlaSkiLCBvcGNvZGUgJiA3KTsKIAkJZWxzZSBpZiAob3Bjb2RlID49IDB4MDA2MCAmJiBvcGNvZGUgPD0gMHgwMDY3KQotCQkJcHJpbnRrKCJDQUxMIChQJWkpIiwgb3Bjb2RlICYgNyk7CisJCQl2ZXJib3NlX3ByaW50aygiQ0FMTCAoUCVpKSIsIG9wY29kZSAmIDcpOwogCQllbHNlIGlmIChvcGNvZGUgPj0gMHgwMDcwICYmIG9wY29kZSA8PSAweDAwNzcpCi0JCQlwcmludGsoIkNBTEwgKFBDK1AlaSkiLCBvcGNvZGUgJiA3KTsKKwkJCXZlcmJvc2VfcHJpbnRrKCJDQUxMIChQQytQJWkpIiwgb3Bjb2RlICYgNyk7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweDAwODAgJiYgb3Bjb2RlIDw9IDB4MDA4NykKLQkJCXByaW50aygiSlVNUCAoUEMrUCVpKSIsIG9wY29kZSAmIDcpOworCQkJdmVyYm9zZV9wcmludGsoIkpVTVAgKFBDK1AlaSkiLCBvcGNvZGUgJiA3KTsKIAkJZWxzZSBpZiAoKG9wY29kZSA+PSAweDEwMDAgJiYgb3Bjb2RlIDw9IDB4MTNGRikgfHwgKG9wY29kZSA+PSAweDE4MDAgJiYgb3Bjb2RlIDw9IDB4MUJGRikpCi0JCQlwcmludGsoIklGICFDQyBKVU1QIik7CisJCQl2ZXJib3NlX3ByaW50aygiSUYgIUNDIEpVTVAiKTsKIAkJZWxzZSBpZiAoKG9wY29kZSA+PSAweDE0MDAgJiYgb3Bjb2RlIDw9IDB4MTdmZikgfHwgKG9wY29kZSA+PSAweDFjMDAgJiYgb3Bjb2RlIDw9IDB4MWZmZikpCi0JCQlwcmludGsoIklGIENDIEpVTVAiKTsKKwkJCXZlcmJvc2VfcHJpbnRrKCJJRiBDQyBKVU1QIik7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweDIwMDAgJiYgb3Bjb2RlIDw9IDB4MmZmZikKLQkJCXByaW50aygiSlVNUC5TIik7CisJCQl2ZXJib3NlX3ByaW50aygiSlVNUC5TIik7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweGUwODAgJiYgb3Bjb2RlIDw9IDB4ZTBmZikKLQkJCXByaW50aygiTFNFVFVQIik7CisJCQl2ZXJib3NlX3ByaW50aygiTFNFVFVQIik7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweGUyMDAgJiYgb3Bjb2RlIDw9IDB4ZTJmZikKLQkJCXByaW50aygiSlVNUC5MIik7CisJCQl2ZXJib3NlX3ByaW50aygiSlVNUC5MIik7CiAJCWVsc2UgaWYgKG9wY29kZSA+PSAweGUzMDAgJiYgb3Bjb2RlIDw9IDB4ZTNmZikKLQkJCXByaW50aygiQ0FMTCBwY3JlbCIpOworCQkJdmVyYm9zZV9wcmludGsoIkNBTEwgcGNyZWwiKTsKIAkJZWxzZQotCQkJcHJpbnRrKCIweCUwNHgiLCBvcGNvZGUpOworCQkJdmVyYm9zZV9wcmludGsoIjB4JTA0eCIsIG9wY29kZSk7CiAJfQogCiB9CisjZW5kaWYKIAogdm9pZCBkdW1wX2JmaW5fdHJhY2VfYnVmZmVyKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0RFQlVHX1ZFUkJPU0UKICNpZmRlZiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OCiAJaW50IHRmbGFncywgaSA9IDA7CiAJY2hhciBidWZbMTUwXTsKQEAgLTcwMSw2ICs3NTYsNyBAQAogCiAJdHJhY2VfYnVmZmVyX3Jlc3RvcmUodGZsYWdzKTsKICNlbmRpZgorI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MKGR1bXBfYmZpbl90cmFjZV9idWZmZXIpOwogCkBAIC03MDgsNyArNzY0LDcgQEAKICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGFkZHJlc3MgcG9pbnRlZCB0byBpcyBlaXRoZXIgYQogICogMTYtYml0IENBTEwgaW5zdHJ1Y3Rpb24sIG9yIGEgMzItYml0IENBTEwgaW5zdHJ1Y3Rpb24KICAqLwotYm9vbCBpc19iZmluX2NhbGwodW5zaWduZWQgc2hvcnQgKmFkZHIpCitzdGF0aWMgYm9vbCBpc19iZmluX2NhbGwodW5zaWduZWQgc2hvcnQgKmFkZHIpCiB7CiAJdW5zaWduZWQgc2hvcnQgb3Bjb2RlID0gMCwgKmluc19hZGRyOwogCWluc19hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopYWRkcjsKQEAgLTczMCw4ICs3ODYsMTAgQEAKIAlyZXR1cm4gZmFsc2U7CiAKIH0KKwogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2spCiB7CisjaWZkZWYgQ09ORklHX1BSSU5USwogCXVuc2lnbmVkIGludCAqYWRkciwgKmVuZHN0YWNrLCAqZnAgPSAwLCAqZnJhbWU7CiAJdW5zaWduZWQgc2hvcnQgKmluc19hZGRyOwogCWNoYXIgYnVmWzE1MF07CkBAIC03NTYsOCArODE0LDEwIEBACiAJfSBlbHNlCiAJCWVuZHN0YWNrID0gKHVuc2lnbmVkIGludCAqKVBBR0VfQUxJR04oKHVuc2lnbmVkIGludClzdGFjayk7CiAKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlN0YWNrIGluZm86XG4iKTsKIAlkZWNvZGVfYWRkcmVzcyhidWYsICh1bnNpZ25lZCBpbnQpc3RhY2spOwotCXByaW50ayhLRVJOX05PVElDRSAiU3RhY2sgaW5mbzpcbiIgS0VSTl9OT1RJQ0UgIiBTUDogWzB4JXBdICVzXG4iLCBzdGFjaywgYnVmKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiBTUDogWzB4JXBdICVzXG4iLCBzdGFjaywgYnVmKTsKKwogCWFkZHIgPSAodW5zaWduZWQgaW50ICopKCh1bnNpZ25lZCBpbnQpc3RhY2sgJiB+MHgzRik7CiAKIAkvKiBGaXJzdCB0aGluZyBpcyB0byBsb29rIGZvciBhIGZyYW1lIHBvaW50ZXIgKi8KQEAgLTg0OCw3ICs5MDgsNyBAQAogCQlpZiAoIWopCiAJCQlwcmludGsoIlxuIik7CiAJfQotCisjZW5kaWYKIH0KIAogdm9pZCBkdW1wX3N0YWNrKHZvaWQpCkBAIC04NjYsMzggKzkyNiwzOSBAQAogCiB2b2lkIGR1bXBfYmZpbl9wcm9jZXNzKHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKKyNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQogCS8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxvb2sgYXQgZnAtPmlwZW5kLCBidXQgd2UgZG9uJ3QgcHVzaCBpdCBvbiB0aGUKIAkgKiBzdGFjayBhbGwgdGhlIHRpbWUsIHNvIGRvIHRoaXMgdW50aWwgd2UgZml4IHRoYXQgKi8KIAl1bnNpZ25lZCBpbnQgY29udGV4dCA9IGJmaW5fcmVhZF9JUEVORCgpOwogCiAJaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpCi0JCXByaW50ayhLRVJOX0VNRVJHICJLZXJuZWwgT09QUyBpbiBwcm9ncmVzc1xuIik7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fRU1FUkcgIktlcm5lbCBPT1BTIGluIHByb2dyZXNzXG4iKTsKIAogCWlmIChjb250ZXh0ICYgMHgwMDIwICYmIChmcC0+c2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSkgPT0gVkVDX0hXRVJSKQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkhXIEVycm9yIGNvbnRleHRcbiIpOworCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiSFcgRXJyb3IgY29udGV4dFxuIik7CiAJZWxzZSBpZiAoY29udGV4dCAmIDB4MDAyMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJEZWZlcnJlZCBFeGNlcHRpb24gY29udGV4dFxuIik7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJEZWZlcnJlZCBFeGNlcHRpb24gY29udGV4dFxuIik7CiAJZWxzZSBpZiAoY29udGV4dCAmIDB4M0ZDMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJJbnRlcnJ1cHQgY29udGV4dFxuIik7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJJbnRlcnJ1cHQgY29udGV4dFxuIik7CiAJZWxzZSBpZiAoY29udGV4dCAmIDB4NDAwMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJEZWZlcnJlZCBJbnRlcnJ1cHQgY29udGV4dFxuIik7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJEZWZlcnJlZCBJbnRlcnJ1cHQgY29udGV4dFxuIik7CiAJZWxzZSBpZiAoY29udGV4dCAmIDB4ODAwMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJLZXJuZWwgcHJvY2VzcyBjb250ZXh0XG4iKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIktlcm5lbCBwcm9jZXNzIGNvbnRleHRcbiIpOwogCiAJLyogQmVjYXVzZSB3ZSBhcmUgY3Jhc2hpbmcsIGFuZCBwb2ludGVycyBjb3VsZCBiZSBiYWQsIHdlIGNoZWNrIHRoaW5ncwogCSAqIHByZXR0eSBjbG9zZWx5IGJlZm9yZSB3ZSB1c2UgdGhlbQogCSAqLwogCWlmICgodW5zaWduZWQgbG9uZyljdXJyZW50ID49IEZJWEVEX0NPREVfU1RBUlQgJiYKIAkgICAgISgodW5zaWduZWQgbG9uZyljdXJyZW50ICYgMHgzKSAmJiBjdXJyZW50LT5waWQpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJDVVJSRU5UIFBST0NFU1M6XG4iKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkNVUlJFTlQgUFJPQ0VTUzpcbiIpOwogCQlpZiAoY3VycmVudC0+Y29tbSA+PSAoY2hhciAqKUZJWEVEX0NPREVfU1RBUlQpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNPTU09JXMgUElEPSVkXG4iLAorCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkNPTU09JXMgUElEPSVkXG4iLAogCQkJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX05PVElDRSAiQ09NTT0gaW52YWxpZFxuIik7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiQ09NTT0gaW52YWxpZFxuIik7CiAKIAkJaWYgKCEoKHVuc2lnbmVkIGxvbmcpY3VycmVudC0+bW0gJiAweDMpICYmICh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPm1tID49IEZJWEVEX0NPREVfU1RBUlQpCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgICJURVhUID0gMHglcC0weCVwICAgICAgICBEQVRBID0gMHglcC0weCVwXG4iCisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAgIlRFWFQgPSAweCVwLTB4JXAgICAgICAgIERBVEEgPSAweCVwLTB4JXBcbiIKIAkJCQlLRVJOX05PVElDRSAiIEJTUyA9IDB4JXAtMHglcCAgVVNFUi1TVEFDSyA9IDB4JXBcbiIKIAkJCQlLRVJOX05PVElDRSAiXG4iLAogCQkJCSh2b2lkICopY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUsCkBAIC05MDgsMzggKzk2OSw0MCBAQAogCQkJCSh2b2lkICopY3VycmVudC0+bW0tPmJyaywKIAkJCQkodm9pZCAqKWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX05PVElDRSAiaW52YWxpZCBtbVxuIik7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiaW52YWxpZCBtbVxuIik7CiAJfSBlbHNlCi0JCXByaW50ayhLRVJOX05PVElDRSAiXG4iIEtFUk5fTk9USUNFCisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJcbiIgS0VSTl9OT1RJQ0UKIAkJICAgICAiTm8gVmFsaWQgcHJvY2VzcyBpbiBjdXJyZW50IGNvbnRleHRcbiIpOworI2VuZGlmCiB9CiAKIHZvaWQgZHVtcF9iZmluX21lbShzdHJ1Y3QgcHRfcmVncyAqZnApCiB7CisjaWZkZWYgQ09ORklHX0RFQlVHX1ZFUkJPU0UKIAl1bnNpZ25lZCBzaG9ydCAqYWRkciwgKmVycmFkZHIsIHZhbCA9IDAsIGVyciA9IDA7CiAJY2hhciBzdGkgPSAwLCBidWZbNl07CiAKIAllcnJhZGRyID0gKHZvaWQgKilmcC0+cGM7CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgInJldHVybiBhZGRyZXNzOiBbMHglcF07IGNvbnRlbnRzIG9mOiIsIGVycmFkZHIpOworCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJyZXR1cm4gYWRkcmVzczogWzB4JXBdOyBjb250ZW50cyBvZjoiLCBlcnJhZGRyKTsKIAogCWZvciAoYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKSgodW5zaWduZWQgbG9uZyllcnJhZGRyICYgfjB4RikgLSAweDEwOwogCSAgICAgYWRkciA8ICh1bnNpZ25lZCBzaG9ydCAqKSgodW5zaWduZWQgbG9uZyllcnJhZGRyICYgfjB4RikgKyAweDEwOwogCSAgICAgYWRkcisrKSB7CiAJCWlmICghKCh1bnNpZ25lZCBsb25nKWFkZHIgJiAweEYpKQotCQkJcHJpbnRrKCJcbiIgS0VSTl9OT1RJQ0UgIjB4JXA6ICIsIGFkZHIpOworCQkJdmVyYm9zZV9wcmludGsoIlxuIiBLRVJOX05PVElDRSAiMHglcDogIiwgYWRkcik7CiAKLQkJaWYgKGdldF9pbnN0cnVjdGlvbigmdmFsLCBhZGRyKSkgeworCQlpZiAoIWdldF9pbnN0cnVjdGlvbigmdmFsLCBhZGRyKSkgewogCQkJCXZhbCA9IDA7CiAJCQkJc3ByaW50ZihidWYsICI/Pz8/Iik7CiAJCX0gZWxzZQogCQkJc3ByaW50ZihidWYsICIlMDR4IiwgdmFsKTsKIAogCQlpZiAoYWRkciA9PSBlcnJhZGRyKSB7Ci0JCQlwcmludGsoIlslc10iLCBidWYpOworCQkJdmVyYm9zZV9wcmludGsoIlslc10iLCBidWYpOwogCQkJZXJyID0gdmFsOwogCQl9IGVsc2UKLQkJCXByaW50aygiICVzICIsIGJ1Zik7CisJCQl2ZXJib3NlX3ByaW50aygiICVzICIsIGJ1Zik7CiAKIAkJLyogRG8gYW55IHByZXZpb3VzIGluc3RydWN0aW9ucyB0dXJuIG9uIGludGVycnVwdHM/ICovCiAJCWlmIChhZGRyIDw9IGVycmFkZHIgJiYJCQkJLyogaW4gdGhlIHBhc3QgKi8KQEAgLTk0OCwxNCArMTAxMSwxNCBAQAogCQkJc3RpID0gMTsKIAl9CiAKLQlwcmludGsoIlxuIik7CisJdmVyYm9zZV9wcmludGsoIlxuIik7CiAKIAkvKiBIYXJkd2FyZSBlcnJvciBpbnRlcnJ1cHRzIGNhbiBiZSBkZWZlcnJlZCAqLwogCWlmICh1bmxpa2VseShzdGkgJiYgKGZwLT5zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFKSA9PSBWRUNfSFdFUlIgJiYKIAkgICAgb29wc19pbl9wcm9ncmVzcykpewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkxvb2tzIGxpa2UgdGhpcyB3YXMgYSBkZWZlcnJlZCBlcnJvciAtIHNvcnJ5XG4iKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkxvb2tzIGxpa2UgdGhpcyB3YXMgYSBkZWZlcnJlZCBlcnJvciAtIHNvcnJ5XG4iKTsKICNpZm5kZWYgQ09ORklHX0RFQlVHX0hXRVJSCi0JCXByaW50ayhLRVJOX05PVElDRSAiVGhlIHJlbWFpbmluZyBtZXNzYWdlIG1heSBiZSBtZWFuaW5nbGVzc1xuIgorCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiVGhlIHJlbWFpbmluZyBtZXNzYWdlIG1heSBiZSBtZWFuaW5nbGVzc1xuIgogCQkJS0VSTl9OT1RJQ0UgIllvdSBzaG91bGQgZW5hYmxlIENPTkZJR19ERUJVR19IV0VSUiB0byBnZXQgYSIKIAkJCSAiIGJldHRlciBpZGVhIHdoZXJlIGl0IGNhbWUgZnJvbVxuIik7CiAjZWxzZQpAQCAtOTY5LDM0ICsxMDMyLDQ3IEBACiAJCQkvKiBBbmQgdGhlIGxhc3QgUkVUSSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdXNlcnNwYWNlIGNvbnRleHQgKi8KIAkJCWlmICgoZnAgKyAxKS0+cGMgPj0gY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUgJiYKIAkJCSAgICAoZnAgKyAxKS0+cGMgPD0gY3VycmVudC0+bW0tPmVuZF9jb2RlKSB7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJJdCBtaWdodCBiZSBiZXR0ZXIgdG8gbG9vayBhcm91bmQgaGVyZSA6IFxuIik7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGxvb2sgYXJvdW5kIGhlcmUgOiBcbiIpOworCQkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJCQlzaG93X3JlZ3MoZnAgKyAxKTsKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJCX0KIAkJfQogI2VuZGlmCiAJfQorI2VuZGlmCiB9CiAKIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKKyNpZmRlZiBDT05GSUdfREVCVUdfVkVSQk9TRQogCWNoYXIgYnVmIFsxNTBdOwogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcHJpbnRrKEtFUk5fTk9USUNFICJcbiIgS0VSTl9OT1RJQ0UgIlNFUVVFTkNFUiBTVEFUVVM6XHRcdCVzXG4iLCBwcmludF90YWludGVkKCkpOwotCXByaW50ayhLRVJOX05PVElDRSAiIFNFUVNUQVQ6ICUwOGx4ICBJUEVORDogJTA0bHggIFNZU0NGRzogJTA0bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIlxuIiBLRVJOX05PVElDRSAiU0VRVUVOQ0VSIFNUQVRVUzpcdFx0JXNcbiIsIHByaW50X3RhaW50ZWQoKSk7CisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBTRVFTVEFUOiAlMDhseCAgSVBFTkQ6ICUwNGx4ICBTWVNDRkc6ICUwNGx4XG4iLAogCQkobG9uZylmcC0+c2Vxc3RhdCwgZnAtPmlwZW5kLCBmcC0+c3lzY2ZnKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgSFdFUlJDQVVTRTogMHglbHhcbiIsCi0JCShmcC0+c2Vxc3RhdCAmIFNFUVNUQVRfSFdFUlJDQVVTRSkgPj4gMTQpOwotCXByaW50ayhLRVJOX05PVElDRSAiICBFWENBVVNFICAgOiAweCVseFxuIiwKKwlpZiAoKGZwLT5zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFKSA9PSBWRUNfSFdFUlIpIHsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiAgSFdFUlJDQVVTRTogMHglbHhcbiIsCisJCQkoZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0hXRVJSQ0FVU0UpID4+IDE0KTsKKyNpZmRlZiBFQklVX0VSUk1TVAorCQkvKiBJZiB0aGUgZXJyb3Igd2FzIGZyb20gdGhlIEVCSVUsIHByaW50IGl0IG91dCAqLworCQlpZiAoYmZpbl9yZWFkX0VCSVVfRVJSTVNUKCkgJiBDT1JFX0VSUk9SKSB7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiICBFQklVIEVycm9yIFJlYXNvbiAgOiAweCUwNHhcbiIsCisJCQkJYmZpbl9yZWFkX0VCSVVfRVJSTVNUKCkpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiAgRUJJVSBFcnJvciBBZGRyZXNzIDogMHglMDh4XG4iLAorCQkJCWJmaW5fcmVhZF9FQklVX0VSUkFERCgpKTsKKwkJfQorI2VuZGlmCisJfQorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgIEVYQ0FVU0UgICA6IDB4JWx4XG4iLAogCQlmcC0+c2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSk7CiAJZm9yIChpID0gNjsgaSA8PSAxNSA7IGkrKykgewogCQlpZiAoZnAtPmlwZW5kICYgKDEgPDwgaSkpIHsKIAkJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgYmZpbl9yZWFkMzIoRVZUMCArIDQqaSkpOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICIgIHBoeXNpY2FsIElWRyVpIGFzc2VydGVkIDogJXNcbiIsIGksIGJ1Zik7CisJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiICBwaHlzaWNhbCBJVkclaSBhc3NlcnRlZCA6ICVzXG4iLCBpLCBidWYpOwogCQl9CiAJfQogCkBAIC0xMDA5LDY0ICsxMDg1LDY1IEBACiAJCQkJZ290byB1bmxvY2s7CiAKIAkJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgKHVuc2lnbmVkIGludClhY3Rpb24tPmhhbmRsZXIpOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICIgIGxvZ2ljYWwgaXJxICUzZCBtYXBwZWQgIDogJXMiLCBpLCBidWYpOworCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiAgbG9naWNhbCBpcnEgJTNkIG1hcHBlZCAgOiAlcyIsIGksIGJ1Zik7CiAJCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKIAkJCQlkZWNvZGVfYWRkcmVzcyhidWYsICh1bnNpZ25lZCBpbnQpYWN0aW9uLT5oYW5kbGVyKTsKLQkJCQlwcmludGsoIiwgJXMiLCBidWYpOworCQkJCXZlcmJvc2VfcHJpbnRrKCIsICVzIiwgYnVmKTsKIAkJCX0KLQkJCXByaW50aygiXG4iKTsKKwkJCXZlcmJvc2VfcHJpbnRrKCJcbiIpOwogdW5sb2NrOgogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCiAJZGVjb2RlX2FkZHJlc3MoYnVmLCBmcC0+cmV0ZSk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIgUkVURTogJXNcbiIsIGJ1Zik7CisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBSRVRFOiAlc1xuIiwgYnVmKTsKIAlkZWNvZGVfYWRkcmVzcyhidWYsIGZwLT5yZXRuKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiBSRVROOiAlc1xuIiwgYnVmKTsKKwl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiIFJFVE46ICVzXG4iLCBidWYpOwogCWRlY29kZV9hZGRyZXNzKGJ1ZiwgZnAtPnJldHgpOwotCXByaW50ayhLRVJOX05PVElDRSAiIFJFVFg6ICVzXG4iLCBidWYpOworCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgUkVUWDogJXNcbiIsIGJ1Zik7CiAJZGVjb2RlX2FkZHJlc3MoYnVmLCBmcC0+cmV0cyk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIgUkVUUzogJXNcbiIsIGJ1Zik7CisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBSRVRTOiAlc1xuIiwgYnVmKTsKIAlkZWNvZGVfYWRkcmVzcyhidWYsIGZwLT5wYyk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIgUEMgIDogJXNcbiIsIGJ1Zik7CisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBQQyAgOiAlc1xuIiwgYnVmKTsKIAogCWlmICgoKGxvbmcpZnAtPnNlcXN0YXQgJiAgU0VRU1RBVF9FWENBVVNFKSAmJgogCSAgICAoKChsb25nKWZwLT5zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFKSAhPSBWRUNfSFdFUlIpKSB7CiAJCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcik7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiRENQTEJfRkFVTFRfQUREUjogJXNcbiIsIGJ1Zik7CisJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJEQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKIAkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9pY3BsYl9mYXVsdF9hZGRyKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJJQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKKwkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIklDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwogCX0KIAotCXByaW50ayhLRVJOX05PVElDRSAiXG4iIEtFUk5fTk9USUNFICJQUk9DRVNTT1IgU1RBVEU6XG4iKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiBSMCA6ICUwOGx4ICAgIFIxIDogJTA4bHggICAgUjIgOiAlMDhseCAgICBSMyA6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJcbiIgS0VSTl9OT1RJQ0UgIlBST0NFU1NPUiBTVEFURTpcbiIpOworCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgUjAgOiAlMDhseCAgICBSMSA6ICUwOGx4ICAgIFIyIDogJTA4bHggICAgUjMgOiAlMDhseFxuIiwKIAkJZnAtPnIwLCBmcC0+cjEsIGZwLT5yMiwgZnAtPnIzKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiBSNCA6ICUwOGx4ICAgIFI1IDogJTA4bHggICAgUjYgOiAlMDhseCAgICBSNyA6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgUjQgOiAlMDhseCAgICBSNSA6ICUwOGx4ICAgIFI2IDogJTA4bHggICAgUjcgOiAlMDhseFxuIiwKIAkJZnAtPnI0LCBmcC0+cjUsIGZwLT5yNiwgZnAtPnI3KTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiBQMCA6ICUwOGx4ICAgIFAxIDogJTA4bHggICAgUDIgOiAlMDhseCAgICBQMyA6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgUDAgOiAlMDhseCAgICBQMSA6ICUwOGx4ICAgIFAyIDogJTA4bHggICAgUDMgOiAlMDhseFxuIiwKIAkJZnAtPnAwLCBmcC0+cDEsIGZwLT5wMiwgZnAtPnAzKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiBQNCA6ICUwOGx4ICAgIFA1IDogJTA4bHggICAgRlAgOiAlMDhseCAgICBTUCA6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgUDQgOiAlMDhseCAgICBQNSA6ICUwOGx4ICAgIEZQIDogJTA4bHggICAgU1AgOiAlMDhseFxuIiwKIAkJZnAtPnA0LCBmcC0+cDUsIGZwLT5mcCwgKGxvbmcpZnApOwotCXByaW50ayhLRVJOX05PVElDRSAiIExCMDogJTA4bHggICAgTFQwOiAlMDhseCAgICBMQzA6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgTEIwOiAlMDhseCAgICBMVDA6ICUwOGx4ICAgIExDMDogJTA4bHhcbiIsCiAJCWZwLT5sYjAsIGZwLT5sdDAsIGZwLT5sYzApOwotCXByaW50ayhLRVJOX05PVElDRSAiIExCMTogJTA4bHggICAgTFQxOiAlMDhseCAgICBMQzE6ICUwOGx4XG4iLAorCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgTEIxOiAlMDhseCAgICBMVDE6ICUwOGx4ICAgIExDMTogJTA4bHhcbiIsCiAJCWZwLT5sYjEsIGZwLT5sdDEsIGZwLT5sYzEpOwotCXByaW50ayhLRVJOX05PVElDRSAiIEIwIDogJTA4bHggICAgTDAgOiAlMDhseCAgICBNMCA6ICUwOGx4ICAgIEkwIDogJTA4bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBCMCA6ICUwOGx4ICAgIEwwIDogJTA4bHggICAgTTAgOiAlMDhseCAgICBJMCA6ICUwOGx4XG4iLAogCQlmcC0+YjAsIGZwLT5sMCwgZnAtPm0wLCBmcC0+aTApOwotCXByaW50ayhLRVJOX05PVElDRSAiIEIxIDogJTA4bHggICAgTDEgOiAlMDhseCAgICBNMSA6ICUwOGx4ICAgIEkxIDogJTA4bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBCMSA6ICUwOGx4ICAgIEwxIDogJTA4bHggICAgTTEgOiAlMDhseCAgICBJMSA6ICUwOGx4XG4iLAogCQlmcC0+YjEsIGZwLT5sMSwgZnAtPm0xLCBmcC0+aTEpOwotCXByaW50ayhLRVJOX05PVElDRSAiIEIyIDogJTA4bHggICAgTDIgOiAlMDhseCAgICBNMiA6ICUwOGx4ICAgIEkyIDogJTA4bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBCMiA6ICUwOGx4ICAgIEwyIDogJTA4bHggICAgTTIgOiAlMDhseCAgICBJMiA6ICUwOGx4XG4iLAogCQlmcC0+YjIsIGZwLT5sMiwgZnAtPm0yLCBmcC0+aTIpOwotCXByaW50ayhLRVJOX05PVElDRSAiIEIzIDogJTA4bHggICAgTDMgOiAlMDhseCAgICBNMyA6ICUwOGx4ICAgIEkzIDogJTA4bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIiBCMyA6ICUwOGx4ICAgIEwzIDogJTA4bHggICAgTTMgOiAlMDhseCAgICBJMyA6ICUwOGx4XG4iLAogCQlmcC0+YjMsIGZwLT5sMywgZnAtPm0zLCBmcC0+aTMpOwotCXByaW50ayhLRVJOX05PVElDRSAiQTAudzogJTA4bHggICBBMC54OiAlMDhseCAgIEExLnc6ICUwOGx4ICAgQTEueDogJTA4bHhcbiIsCisJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkEwLnc6ICUwOGx4ICAgQTAueDogJTA4bHggICBBMS53OiAlMDhseCAgIEExLng6ICUwOGx4XG4iLAogCQlmcC0+YTB3LCBmcC0+YTB4LCBmcC0+YTF3LCBmcC0+YTF4KTsKIAotCXByaW50ayhLRVJOX05PVElDRSAiVVNQIDogJTA4bHggIEFTVEFUOiAlMDhseFxuIiwKKwl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiVVNQIDogJTA4bHggIEFTVEFUOiAlMDhseFxuIiwKIAkJcmR1c3AoKSwgZnAtPmFzdGF0KTsKIAotCXByaW50ayhLRVJOX05PVElDRSAiXG4iKTsKKwl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiXG4iKTsKKyNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX1NZU19CRklOX1NQSU5MT0NLX0wxCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL0tjb25maWcKaW5kZXggOGJmOWU1OC4uZGYyMjRkMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvS2NvbmZpZwpAQCAtMTQsNCArMTQsOSBAQAogCWhlbHAKIAkgIENNLUJGNTI3IHN1cHBvcnQgZm9yIEVWQUwtIGFuZCBERVYtQm9hcmQuCiAKK2NvbmZpZyBCRklONTI2X0VaQlJECisJYm9vbCAiQkY1MjYtRVpCUkQiCisJaGVscAorCSAgQkY1MjYtRVpCUkQvRVpLSVQgTGl0ZSBib2FyZCBzdXBwb3J0LgorCiBlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL01ha2VmaWxlCmluZGV4IDdiYTdkMjUuLmViNmVkMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9NYWtlZmlsZQpAQCAtNCwzICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX0JGSU41MjdfRVpLSVQpICAgICAgICAgICAgKz0gZXpraXQubwogb2JqLSQoQ09ORklHX0JGSU41MjdfQkxVRVRFQ0hOSVhfQ00pICAgKz0gY21fYmY1Mjcubworb2JqLSQoQ09ORklHX0JGSU41MjZfRVpCUkQpICAgICAgICAgICAgKz0gZXpicmQubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCmluZGV4IGQyMmJjNzcuLjllYTQ0MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKQEAgLTQzLDEwICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NsODExLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvdXNiL211c2IuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGFzbS9jcGxiLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KQEAgLTEzMCw2ICsxMjcsMTYgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfY29uZmlnIG11c2JfY29uZmlnID0geworCS5tdWx0aXBvaW50CT0gMCwKKwkuZHluX2ZpZm8JPSAwLAorCS5zb2Z0X2Nvbgk9IDEsCisJLmRtYQkJPSAxLAorCS5udW1fZXBzCT0gNywKKwkuZG1hX2NoYW5uZWxzCT0gNywKKwkuZ3Bpb192cnNlbAk9IEdQSU9fUEYxMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykKIAkubW9kZQkJPSBNVVNCX09URywKQEAgLTEzOCw3ICsxNDUsNyBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMpCiAJLm1vZGUJCT0gTVVTQl9QRVJJUEhFUkFMLAogI2VuZGlmCi0JLm11bHRpcG9pbnQJPSAwLAorCS5jb25maWcJCT0gJm11c2JfY29uZmlnLAogfTsKIAogc3RhdGljIHU2NCBtdXNiX2RtYW1hc2sgPSB+KHUzMikwOwpAQCAtMjAxLDcgKzIwOCw3IEBACiAJewogCQkubmFtZSA9ICJsaW51eCBrZXJuZWwobmFuZCkiLAogCQkub2Zmc2V0ID0gMCwKLQkJLnNpemUgPSA0ICogU0laRV8xTSwKKwkJLnNpemUgPSA0ICogMTAyNCAqIDEwMjQsCiAJfSwKIAl7CiAJCS5uYW1lID0gImZpbGUgc3lzdGVtKG5hbmQpIiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM4N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKKyAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCisgKiBBdXRob3I6ICAgICAgIEFpZGFuIFdpbGxpYW1zIDxhaWRhbkBuaWN0YS5jb20uYXU+CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL211c2IuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9uYW5kLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vZHBtYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzcuaD4KKworLyoKKyAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbworICovCitjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkJGNTI2LUVaQlJEIjsKKworLyoKKyAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXVzYl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4ZmZjMDM4MDAsCisJCS5lbmQJPSAweGZmYzAzY2ZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsJLyogZ2VuZXJhbCBJUlEgKi8KKwkJLnN0YXJ0CT0gSVJRX1VTQl9JTlQwLAorCQkuZW5kCT0gSVJRX1VTQl9JTlQwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTCwKKwl9LAorCVsyXSA9IHsJLyogRE1BIElSUSAqLworCQkuc3RhcnQJPSBJUlFfVVNCX0RNQSwKKwkJLmVuZAk9IElSUV9VU0JfRE1BLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfY29uZmlnIG11c2JfY29uZmlnID0geworCS5tdWx0aXBvaW50CT0gMCwKKwkuZHluX2ZpZm8JPSAwLAorCS5zb2Z0X2Nvbgk9IDEsCisJLmRtYQkJPSAxLAorCS5udW1fZXBzCT0gNywKKwkuZG1hX2NoYW5uZWxzCT0gNywKKwkuZ3Bpb192cnNlbAk9IEdQSU9fUEcxMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0geworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykKKwkubW9kZQkJPSBNVVNCX09URywKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkNfSENEKQorCS5tb2RlCQk9IE1VU0JfSE9TVCwKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDKQorCS5tb2RlCQk9IE1VU0JfUEVSSVBIRVJBTCwKKyNlbmRpZgorCS5jb25maWcJCT0gJm11c2JfY29uZmlnLAorfTsKKworc3RhdGljIHU2NCBtdXNiX2RtYW1hc2sgPSB+KHUzMikwOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdXNiX2RldmljZSA9IHsKKwkubmFtZQkJPSAibXVzYl9oZHJjIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJm11c2JfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJm11c2JfcGxhdCwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdXNiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXVzYl9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGV6YnJkX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gImJvb3Rsb2FkZXIobm9yKSIsCisJCS5zaXplICAgICAgID0gMHg0MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4MUMwMDAwLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImZpbGUgc3lzdGVtKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGV6YnJkX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gZXpicmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMgICA9IEFSUkFZX1NJWkUoZXpicmRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV6YnJkX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDNmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV6YnJkX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICA9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQgICAgICAgICAgICA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXpicmRfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZlemJyZF9mbGFzaF9yZXNvdXJjZSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0JGNVhYKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9CRjVYWF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKKwl7CisJCS5uYW1lID0gImxpbnV4IGtlcm5lbChuYW5kKSIsCisJCS5vZmZzZXQgPSAwLAorCQkuc2l6ZSA9IDQgKiAxMDI0ICogMTAyNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiZmlsZSBzeXN0ZW0obmFuZCkiLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmY1eHhfbmFuZF9wbGF0Zm9ybSBiZjV4eF9uYW5kX3BsYXRmb3JtID0geworCS5wYWdlX3NpemUgPSBORkNfUEdfU0laRV8yNTYsCisJLmRhdGFfd2lkdGggPSBORkNfTldJRFRIXzgsCisJLnBhcnRpdGlvbnMgPSBwYXJ0aXRpb25faW5mbywKKwkubnJfcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUocGFydGl0aW9uX2luZm8pLAorCS5yZF9kbHkgPSAzLAorCS53cl9kbHkgPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZjV4eF9uYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gTkZDX0NUTCwKKwkJLmVuZCA9IE5GQ19EQVRBX1JEICsgMiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IENIX05GQywKKwkJLmVuZCA9IENIX05GQywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNXh4X25hbmRfZGV2aWNlID0geworCS5uYW1lID0gImJmNXh4LW5hbmQiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmNXh4X25hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZjV4eF9uYW5kX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZjV4eF9uYW5kX3BsYXRmb3JtLAorCX0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lID0gInJ0Yy1iZmluIiwKKwkuaWQgICA9IC0xLAorfTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9tYWNfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fbWFjIiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJib290bG9hZGVyKHNwaSkiLAorCQkuc2l6ZSA9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCisJfSwgeworCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYmZpbl9zcGlfZmxhc2hfZGF0YSA9IHsKKwkubmFtZSA9ICJtMjVwODAiLAorCS5wYXJ0cyA9IGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKKwkudHlwZSA9ICJtMjVwMTYiLAorfTsKKworLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQURDX0JGNTMzKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzM19NT0RVTEUpCisvKiBTUEkgQURDIGNoaXAgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWRjX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDEsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMSwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQlgpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3NpM3h4eF9jaGlwX2luZm8gPSB7CisJLmN0bF9yZWcJPSAweDQsIC8qIHNlbmQgemVybyAqLworCS5lbmFibGVfZG1hCT0gMCwKKwkuYml0c19wZXJfd29yZAk9IDgsCisJLmNzX2NoYW5nZV9wZXJfd29yZCA9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gMTYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc3LAorCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDQxOSwKKwkueV9wbGF0ZV9vaG1zCQk9IDQ4NiwKKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5zdG9wYWNxX3BvbGFyaXR5IAk9IDEsCisJLmZpcnN0X2NvbnZlcnNpb25fZGVsYXkgPSAzLAorCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCisJLmF2ZXJhZ2luZyAJCT0gMSwKKwkucGVuX2Rvd25fYWNjX2ludGVydmFsIAk9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBscTAzNXExX3NwaV9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZmluX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisJeworCQkvKiB0aGUgbW9kYWxpYXMgbXVzdCBiZSB0aGUgc2FtZSBhcyBzcGkgZGV2aWNlIGRyaXZlciBuYW1lICovCisJCS5tb2RhbGlhcyA9ICJtMjVwODAiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuIE9uIFNUQU1QNTM3IGl0IGlzIFNQSVNTRUwxKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGlfZmxhc2hfZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfZmxhc2hfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzMykgXAorCXx8IGRlZmluZWQoQ09ORklHX1NQSV9BRENfQkY1MzNfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW5fc3BpX2FkYyIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiA9IDYyNTAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KKwkJLmNoaXBfc2VsZWN0ID0gMSwgLyogRnJhbWV3b3JrIGNoaXAgc2VsZWN0LiAqLworCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorCXsKKwkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAorCQkubWF4X3NwZWVkX2h6ID0gMjUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKKwkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKKwl7CisJCS5tb2RhbGlhcyA9ICJmeHMtc3BpIiwKKwkJLm1heF9zcGVlZF9oeiA9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDggLSBDT05GSUdfSjExX0pVTVBFUiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfc2kzeHh4X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisJeworCQkubW9kYWxpYXMgPSAiZnhvLXNwaSIsCisJCS5tYXhfc3BlZWRfaHogPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSA4IC0gQ09ORklHX0oxOV9KVU1QRVIsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX3NpM3h4eF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzdfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzCQk9ICJhZDc4NzciLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKKwkJLmlycQkJCT0gSVJRX1BGOCwKKwkJLm1heF9zcGVlZF9oegk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdCAgPSAyLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKKwl7CisJCS5tb2RhbGlhcwk9ICJ3bTg3MzEiLAorCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0JPSAwLAorCQkuY2hpcF9zZWxlY3QgICAgPSA1LAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzAsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKy8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmaW5fc3BpMF9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdCA9IDgsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTBfU0NLLCBQX1NQSTBfTUlTTywgUF9TUEkwX01PU0ksIDB9LAorfTsKKworLyogU1BJICgwKSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMF9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEksCisJCS5lbmQgICA9IENIX1NQSSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BpMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDAsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTBfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGkwX2luZm8sIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwl9LAorfTsKKyNlbmRpZiAgLyogc3BpIG1hc3RlciBhbmQgZGV2aWNlcyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0geworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMAorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3VhcnRfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tdWFydCIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl91YXJ0X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl91YXJ0X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0geworI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKKwkJLmVuZCA9IDB4RkZDMDIwRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBUV0kwX1JFR0JBU0UsCisJCS5lbmQgICA9IFRXSTBfUkVHQkFTRSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0ksCisJCS5lbmQgICA9IElSUV9UV0ksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYmZpbl90d2lfZGV2aWNlID0geworCS5uYW1lID0gImkyYy1iZmluLXR3aSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl90d2kwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3R3aTBfcmVzb3VyY2UsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSTJDX0JPQVJESU5GTworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJmaW5faTJjX2JvYXJkX2luZm9bXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfTENEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfTENEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2xjZCIsIDB4MjIpLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2tleXBhZCIsIDB4MjcpLAorCQkuaXJxID0gSVJRX1BGOCwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAxLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJe0JUTl8wLCBHUElPX1BHMCwgMSwgImdwaW8ta2V5czogQlROMCJ9LAorCXtCVE5fMSwgR1BJT19QRzEzLCAxLCAiZ3Bpby1rZXlzOiBCVE4xIn0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJmaW5fZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMgICAgICAgID0gYmZpbl9ncGlvX2tleXNfdGFibGUsCisJLm5idXR0b25zICAgICAgID0gQVJSQVlfU0laRShiZmluX2dwaW9fa2V5c190YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RldmljZV9ncGlva2V5cyA9IHsKKwkubmFtZSAgICAgID0gImdwaW8ta2V5cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9ncGlvX2tleXNfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQoreworCVZSUEFJUihWTEVWXzEwMCwgNDAwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMDUsIDQyNjAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTEwLCA1MDAwMDAwMDApLAorCVZSUEFJUihWTEVWXzExNSwgNTMzMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMjAsIDYwMDAwMDAwMCksCit9OworCitzdGF0aWMgc3RydWN0IGJmaW5fZHBtY19wbGF0Zm9ybV9kYXRhIGJmaW5fZG1wY192cmVnX2RhdGEgPSB7CisJLnR1cGxlX3RhYiA9IGNjbGtfdmxldl9kYXRhc2hlZXQsCisJLnRhYnNpemUgPSBBUlJBWV9TSVpFKGNjbGtfdmxldl9kYXRhc2hlZXQpLAorCS52cl9zZXR0bGluZ190aW1lID0gMjUgLyogdXMgKi8sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RwbWMgPSB7CisJLm5hbWUgPSAiYmZpbiBkcG1jIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2RtcGNfdnJlZ19kYXRhLAorCX0sCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorI2luY2x1ZGUgPGFzbS9iZmluLWxxMDM1cTEuaD4KKworc3RhdGljIHN0cnVjdCBiZmluX2xxMDM1cTFmYl9kaXNwX2luZm8gYmZpbl9scTAzNXExX2RhdGEgPSB7CisJLm1vZGUgPSAJTFEwMzVfTk9STSB8IExRMDM1X1JHQiB8IExRMDM1X1JMIHwgTFEwMzVfVEIsCisJLnVzZV9ibCA9IAkxLAorCS5ncGlvX2JsID0JR1BJT19QRzEyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2xxMDM1cTFfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBJUlFfUFBJX0VSUk9SLAorCQkuZW5kID0gSVJRX1BQSV9FUlJPUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fbHEwMzVxMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImJmaW4tbHEwMzVxMSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzIAk9IEFSUkFZX1NJWkUoYmZpbl9scTAzNXExX3Jlc291cmNlcyksCisJLnJlc291cmNlIAk9IGJmaW5fbHEwMzVxMV9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fbHEwMzVxMV9kYXRhLAorCX0sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzdGFtcF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKworCSZiZmluX2RwbWMsCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9CRjVYWCkgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQkY1WFhfTU9EVUxFKQorCSZiZjV4eF9uYW5kX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorCSZydGNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKKwkmbXVzYl9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fTUFDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX01BQ19NT0RVTEUpCisJJmJmaW5fbWFjX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKwkmYmZpbl9zcGkwX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKKwkmYmZpbl91YXJ0X2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCSZiZmluX2xxMDM1cTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorCSZiZmluX3Npcl9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQorCSZpMmNfYmZpbl90d2lfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorCSZiZmluX3Nwb3J0MF91YXJ0X2RldmljZSwKKwkmYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQorCSZiZmluX2RldmljZV9ncGlva2V5cywKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwkmZXpicmRfZmxhc2hfZGV2aWNlLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdGFtcF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOworCisjaWZkZWYgQ09ORklHX0kyQ19CT0FSRElORk8KKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBiZmluX2kyY19ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUoYmZpbl9pMmNfYm9hcmRfaW5mbykpOworI2VuZGlmCisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzdGFtcF9kZXZpY2VzLCBBUlJBWV9TSVpFKHN0YW1wX2RldmljZXMpKTsKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZmluX3NwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKGJmaW5fc3BpX2JvYXJkX2luZm8pKTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChzdGFtcF9pbml0KTsKKwordm9pZCBuYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwkvKiB3b3JrYXJvdW5kIHJlYm9vdCBoYW5nIHdoZW4gYm9vdGluZyBmcm9tIFNQSSAqLworCWlmICgoYmZpbl9yZWFkX1NZU0NSKCkgJiAweDcpID09IDB4MykKKwkJYmZpbl9ncGlvX3Jlc2V0X3NwaTBfc3NlbDEoKTsKK30KKwordm9pZCBiZmluX2dldF9ldGhlcl9hZGRyKGNoYXIgKmFkZHIpCit7CisJLyogdGhlIE1BQyBpcyBzdG9yZWQgaW4gT1RQIG1lbW9yeSBwYWdlIDB4REYgKi8KKwl1MzIgcmV0OworCXU2NCBvdHBfbWFjOworCXUzMiAoKm90cF9yZWFkKSh1MzIgcGFnZSwgdTMyIGZsYWdzLCB1NjQgKnBhZ2VfY29udGVudCkgPSAodm9pZCAqKTB4RUYwMDAwMUE7CisKKwlyZXQgPSBvdHBfcmVhZCgweERGLCAweDAwLCAmb3RwX21hYyk7CisJaWYgKCEocmV0ICYgMHgxKSkgeworCQljaGFyICpvdHBfbWFjX3AgPSAoY2hhciAqKSZvdHBfbWFjOworCQlmb3IgKHJldCA9IDA7IHJldCA8IDY7ICsrcmV0KQorCQkJYWRkcltyZXRdID0gb3RwX21hY19wWzUgLSByZXRdOworCX0KK30KK0VYUE9SVF9TWU1CT0woYmZpbl9nZXRfZXRoZXJfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKaW5kZXggNzYyZjc1NC4uOGVlMmI3NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwpAQCAtNDIsMTAgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc2w4MTEuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgpAQCAtMTI5LDYgKzEyNiwxNiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG11c2JfaGRyY19jb25maWcgbXVzYl9jb25maWcgPSB7CisJLm11bHRpcG9pbnQJPSAwLAorCS5keW5fZmlmbwk9IDAsCisJLnNvZnRfY29uCT0gMSwKKwkuZG1hCQk9IDEsCisJLm51bV9lcHMJPSA3LAorCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5ncGlvX3Zyc2VsCT0gR1BJT19QRzEzLAorfTsKKwogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfT1RHKQogCS5tb2RlCQk9IE1VU0JfT1RHLApAQCAtMTM3LDcgKzE0NCw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQykKIAkubW9kZQkJPSBNVVNCX1BFUklQSEVSQUwsCiAjZW5kaWYKLQkubXVsdGlwb2ludAk9IDAsCisJLmNvbmZpZwkJPSAmbXVzYl9jb25maWcsCiB9OwogCiBzdGF0aWMgdTY0IG11c2JfZG1hbWFzayA9IH4odTMyKTA7CkBAIC0yMTgsNyArMjI1LDcgQEAKIAl7CiAJCS5uYW1lID0gImxpbnV4IGtlcm5lbChuYW5kKSIsCiAJCS5vZmZzZXQgPSAwLAotCQkuc2l6ZSA9IDQgKiBTSVpFXzFNLAorCQkuc2l6ZSA9IDQgKiAxMDI0ICogMTAyNCwKIAl9LAogCXsKIAkJLm5hbWUgPSAiZmlsZSBzeXN0ZW0obmFuZCkiLApAQCAtODQ2LDYgKzg1MywzOCBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfQkZJTl9ST1RBUlkpIHx8IGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0JGSU5fUk9UQVJZX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGFzbS9iZmluX3JvdGFyeS5oPgorCitzdGF0aWMgc3RydWN0IGJmaW5fcm90YXJ5X3BsYXRmb3JtX2RhdGEgYmZpbl9yb3RhcnlfZGF0YSA9IHsKKwkvKi5yb3RhcnlfdXBfa2V5ICAgICA9IEtFWV9VUCwqLworCS8qLnJvdGFyeV9kb3duX2tleSAgID0gS0VZX0RPV04sKi8KKwkucm90YXJ5X3JlbF9jb2RlICAgPSBSRUxfV0hFRUwsCisJLnJvdGFyeV9idXR0b25fa2V5ID0gS0VZX0VOVEVSLAorCS5kZWJvdW5jZQkgICA9IDEwLAkvKiAwLi4xNyAqLworCS5tb2RlCQkgICA9IFJPVF9RVUFEX0VOQyB8IFJPVF9ERUJFLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3JvdGFyeV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IElSUV9DTlQsCisJCS5lbmQgPSBJUlFfQ05ULAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9yb3RhcnlfZGV2aWNlID0geworCS5uYW1lCQk9ICJiZmluLXJvdGFyeSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzIAk9IEFSUkFZX1NJWkUoYmZpbl9yb3RhcnlfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgCT0gYmZpbl9yb3RhcnlfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3JvdGFyeV9kYXRhLAorCX0sCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CiAJLnN0YXJ0ID0gMCwKIAkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLApAQCAtOTYyLDYgKzEwMDEsMTAgQEAKIAkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0JGSU5fUk9UQVJZKSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19CRklOX1JPVEFSWV9NT0RVTEUpCisJJmJmaW5fcm90YXJ5X2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIAkmZXpraXRfZmxhc2hfZGV2aWNlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2hlYWQuUwppbmRleCAyOGM0ODYxLi4wZWIxZGE4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9oZWFkLlMKQEAgLTg3LDYgKzg3LDkgQEAKIAlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCiAJcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwogCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1CisJQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KKyNlbmRpZgogCiAJcDAuaCA9IGhpKFBMTF9DVEwpOwogCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggYjdiMTY2Zi4uNjIzNzNlNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTcsMTIgKzcsMjQgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIEMsIDAxLzI1LzIwMDg7IEFEU1AtQkY1MjcgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gQiwgMDgvMTIvMjAwODsgQURTUC1CRjUyNiBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBFLCAwOC8xOC8yMDA4OyBBRFNQLUJGNTI3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KICNkZWZpbmUgX01BQ0hfQU5PTUFMWV9IXwogCisjaWYgZGVmaW5lZChfX0FEU1BCRjUyMl9fKSB8fCBkZWZpbmVkKF9fQURTUEJGNTI0X18pIHx8IGRlZmluZWQoX19BRFNQQkY1MjZfXykKKyMgZGVmaW5lIEFOT01BTFlfQkY1MjYgMQorI2Vsc2UKKyMgZGVmaW5lIEFOT01BTFlfQkY1MjYgMAorI2VuZGlmCisjaWYgZGVmaW5lZChfX0FEU1BCRjUyM19fKSB8fCBkZWZpbmVkKF9fQURTUEJGNTI1X18pIHx8IGRlZmluZWQoX19BRFNQQkY1MjdfXykKKyMgZGVmaW5lIEFOT01BTFlfQkY1MjcgMQorI2Vsc2UKKyMgZGVmaW5lIEFOT01BTFlfQkY1MjcgMAorI2VuZGlmCisKIC8qIE11bHRpLUlzc3VlIEluc3RydWN0aW9uIHdpdGggZHNwMzJzaGlmdGltbSBpbiBzbG90MSBhbmQgUC1yZWcgU3RvcmUgaW4gc2xvdDIgTm90IFN1cHBvcnRlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMDc0ICgxKQogLyogRE1BX1JVTiBCaXQgSXMgTm90IFZhbGlkIGFmdGVyIGEgUGVyaXBoZXJhbCBSZWNlaXZlIENoYW5uZWwgRE1BIFN0b3BzICovCkBAIC0yMyw2OCArMzUsMTI0IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDUgKDEpCiAvKiBTZW5zaXRpdml0eSBUbyBOb2lzZSB3aXRoIFNsb3cgSW5wdXQgRWRnZSBSYXRlcyBvbiBFeHRlcm5hbCBTUE9SVCBUWCBhbmQgUlggQ2xvY2tzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjUgKDEpCi0vKiBOZXcgRmVhdHVyZTogRU1BQyBUWCBETUEgV29yZCBBbGlnbm1lbnQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4NSAoMSkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCiAvKiBFcnJvcnMgd2hlbiBTU1lOQywgQ1NZTkMsIG9yIExvYWRzIHRvIExULCBMQiBhbmQgTEMgUmVnaXN0ZXJzIEFyZSBJbnRlcnJ1cHRlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyIChBTk9NQUxZX0JGNTI3KQorLyogUFBJIElzIExldmVsLVNlbnNpdGl2ZSBvbiBGaXJzdCBUcmFuc2ZlciBJbiBTaW5nbGUgRnJhbWUgU3luYyBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBJbmNvcnJlY3QgQWNjZXNzIG9mIE9UUF9TVEFUVVMgRHVyaW5nIG90cF93cml0ZSgpIEZ1bmN0aW9uICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMjggKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjggKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogRGlzYWxsb3dlZCBDb25maWd1cmF0aW9uIFByZXZlbnRzIFN1YnNlcXVlbnQgQWxsb3dlZCBDb25maWd1cmF0aW9uIG9uIEhvc3QgRE1BIFBvcnQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDMzNyAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMzNyAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBFdGhlcm5ldCBNQUMgTURJTyBSZWFkcyBEbyBOb3QgTWVldCBJRUVFIFNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0MSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0MSAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBUV0kgTWF5IE5vdCBPcGVyYXRlIENvcnJlY3RseSBVbmRlciBDZXJ0YWluIFNpZ25hbCBUZXJtaW5hdGlvbiBDb25kaXRpb25zICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNDIgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNDIgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogVVNCIENhbGlicmF0aW9uIFZhbHVlIElzIE5vdCBJbml0aWFsaXplZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzQ2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzQ2IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFVTQiBDYWxpYnJhdGlvbiBWYWx1ZSB0byB1c2UgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0Nl92YWx1ZSAweEU1MTAKIC8qIFByZWJvb3QgUm91dGluZSBJbmNvcnJlY3RseSBBbHRlcnMgUmVzZXQgVmFsdWUgb2YgVVNCIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNDcgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNDcgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogU2VjdXJpdHkgRmVhdHVyZXMgQXJlIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNDggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0OCAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBiZnJvbV9TeXNDb250cm9sKCkgRmlybXdhcmUgRnVuY3Rpb24gUGVyZm9ybXMgSW1wcm9wZXIgU3lzdGVtIFJlc2V0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKEFOT01BTFlfQkY1MjYpCiAvKiBSZWd1bGF0b3IgUHJvZ3JhbW1pbmcgQmxvY2tlZCB3aGVuIEhpYmVybmF0ZSBXYWtldXAgU291cmNlIFJlbWFpbnMgQWN0aXZlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogU2VyaWFsIFBvcnQgKFNQT1JUKSBNdWx0aWNoYW5uZWwgVHJhbnNtaXQgRmFpbHVyZSB3aGVuIENoYW5uZWwgMCBJcyBEaXNhYmxlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzU3ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzU3IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIEluY29ycmVjdCBSZXZpc2lvbiBOdW1iZXIgaW4gRFNQSUQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPiAwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY0IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fID09IDEpCiAvKiBQUEkgVW5kZXJmbG93IEVycm9yIEdvZXMgVW5kZXRlY3RlZCBpbiBJVFUtUiA2NTYgTW9kZSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY2ICgxKQotLyogTmV3IEZlYXR1cmU6IEhpZ2hlciBEZWZhdWx0IENDTEsgUmF0ZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY4ICgxKQorLyogSW5jb3JyZWN0IERlZmF1bHQgQ1NFTCBWYWx1ZSBpbiBQTExfRElWICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjggKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyBpbiBEdXJhdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxIChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIEF1dGhlbnRpY2F0aW9uIEZhaWxzIFRvIEluaXRpYXRlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNzYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3NiAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCiAvKiBEYXRhIFJlYWQgRnJvbSBMMyBNZW1vcnkgYnkgVVNCIERNQSBNYXkgYmUgQ29ycnVwdGVkICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzODAgKDEpCi0vKiBVU0IgRnVsbC1zcGVlZCBNb2RlIG5vdCBGdWxseSBUZXN0ZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4MSAoMSkKLS8qIE5ldyBGZWF0dXJlOiBCb290IGZyb20gT1RQIE1lbW9yeSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg1ICgxKQotLyogTmV3IEZlYXR1cmU6IGJmcm9tX1N5c0NvbnRyb2woKSBSb3V0aW5lICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDEpCi0vKiBOZXcgRmVhdHVyZTogUHJvZ3JhbW1hYmxlIFByZWJvb3QgU2V0dGluZ3MgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NyAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4MCAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiA4LUJpdCBOQU5EIEZsYXNoIEJvb3QgTW9kZSBOb3QgRnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBIb3N0IE11c3QgTm90IFJlYWQgQmFjayBEdXJpbmcgSG9zdCBETUEgQm9vdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg0IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIEJvb3QgZnJvbSBPVFAgTWVtb3J5IE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODUgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIFJvdXRpbmUgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBQcm9ncmFtbWFibGUgUHJlYm9vdCBTZXR0aW5ncyBOb3QgRnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg3IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIENSQzMyIENoZWNrc3VtIFN1cHBvcnQgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4OCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogUmVzZXQgVmVjdG9yIE11c3QgTm90IEJlIGluIFNEUkFNIE1lbW9yeSBTcGFjZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg5ICgxKQotLyogTmV3IEZlYXR1cmU6IHBUZW1wQ3VycmVudCBBZGRlZCB0byBBRElfQk9PVF9EQVRBIFN0cnVjdHVyZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzkyICgxKQotLyogTmV3IEZlYXR1cmU6IGRUZW1wQnl0ZUNvdW50IFZhbHVlIEluY3JlYXNlZCBpbiBBRElfQk9PVF9EQVRBIFN0cnVjdHVyZSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzkzICgxKQotLyogTmV3IEZlYXR1cmU6IExvZyBCdWZmZXIgRnVuY3Rpb25hbGl0eSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzk0ICgxKQotLyogTmV3IEZlYXR1cmU6IEhvb2sgUm91dGluZSBGdW5jdGlvbmFsaXR5ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzOTUgKDEpCi0vKiBOZXcgRmVhdHVyZTogSGVhZGVyIEluZGlyZWN0IEJpdCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzk2ICgxKQotLyogTmV3IEZlYXR1cmU6IEJLX09ORVMsIEJLX1pFUk9TLCBhbmQgQktfREFURUNPREUgQ29uc3RhbnRzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzOTcgKDEpCi0vKiBOZXcgRmVhdHVyZTogU1dSRVNFVCwgREZSRVNFVCBhbmQgV0RSRVNFVCBCaXRzIEFkZGVkIHRvIFNZU0NSIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzOTggKDEpCi0vKiBOZXcgRmVhdHVyZTogQkNPREVfTk9CT09UIEFkZGVkIHRvIEJDT0RFIEZpZWxkIG9mIFNZU0NSIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzOTkgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODkgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogcFRlbXBDdXJyZW50IE5vdCBQcmVzZW50IGluIEFESV9CT09UX0RBVEEgU3RydWN0dXJlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTIgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogRGVwcmVjYXRlZCBWYWx1ZSBvZiBkVGVtcEJ5dGVDb3VudCBpbiBBRElfQk9PVF9EQVRBIFN0cnVjdHVyZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzkzIChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIExvZyBCdWZmZXIgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NCAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBIb29rIFJvdXRpbmUgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NSAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBIZWFkZXIgSW5kaXJlY3QgQml0IE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTYgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogQktfT05FUywgQktfWkVST1MsIGFuZCBCS19EQVRFQ09ERSBDb25zdGFudHMgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NyAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBTV1JFU0VULCBERlJFU0VUIGFuZCBXRFJFU0VUIEJpdHMgaW4gdGhlIFNZU0NSIFJlZ2lzdGVyIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTggKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogQkNPREVfTk9CT09UIGluIEJDT0RFIEZpZWxkIG9mIFNZU0NSIFJlZ2lzdGVyIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTkgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogUFBJIERhdGEgU2lnbmFscyBEMCBhbmQgRDggZG8gbm90IFRyaXN0YXRlIEFmdGVyIERpc2FibGluZyBQUEkgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogTGV2ZWwtU2Vuc2l0aXZlIEV4dGVybmFsIEdQSU8gV2FrZXVwcyBNYXkgQ2F1c2UgSW5kZWZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBMb2NrYm94IFNFU1IgRGlzYWxsb3dzIENlcnRhaW4gVXNlciBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIExvY2tib3ggU0VTUiBGaXJtd2FyZSBEb2VzIE5vdCBTYXZlL1Jlc3RvcmUgRnVsbCBDb250ZXh0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDUgKDEpCisvKiBMb2NrYm94IFNFU1IgRmlybXdhcmUgQXJndW1lbnRzIEFyZSBOb3QgUmV0YWluZWQgQWZ0ZXIgRmlyc3QgSW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwNyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogTG9ja2JveCBGaXJtd2FyZSBNZW1vcnkgQ2xlYW51cCBSb3V0aW5lIERvZXMgbm90IENsZWFyIFJlZ2lzdGVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA4ICgxKQorLyogTG9ja2JveCBmaXJtd2FyZSBsZWF2ZXMgTURNQTAgY2hhbm5lbCBlbmFibGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIEluY29ycmVjdCBEZWZhdWx0IEludGVybmFsIFZvbHRhZ2UgUmVndWxhdG9yIFNldHRpbmcgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMCAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBiZnJvbV9TeXNDb250cm9sKCkgRmlybXdhcmUgRnVuY3Rpb24gQ2Fubm90IGJlIFVzZWQgdG8gRW50ZXIgUG93ZXIgU2F2aW5nIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIE9UUF9DSEVDS19GT1JfUFJFVl9XUklURSBCaXQgaXMgTm90IEZ1bmN0aW9uYWwgaW4gYmZyb21fT3RwV3JpdGUoKSBBUEkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogREVCMl9VUkdFTlQgQml0IE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIFNQT1JUMCBJZ25vcmVzIEV4dGVybmFsIFRTQ0xLMCBvbiBQRzE0IFdoZW4gVE1SNiBpcyBhbiBPdXRwdXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNyAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiB0U0ZTUEUgYW5kIHRIRlNQRSBEbyBOb3QgTWVldCBEYXRhIFNoZWV0IFNwZWNpZmljYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFVTQiBQTExfU1RBQkxFIEJpdCBNYXkgTm90IEFjY3VyYXRlbHkgUmVmbGVjdCB0aGUgVVNCIFBMTCdzIFN0YXR1cyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDIwIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBUV0kgRmFsbCBUaW1lIChUb2YpIE1heSBWaW9sYXRlIHRoZSBNaW5pbXVtIEkyQyBTcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjEgKDEpCisvKiBUV0kgSW5wdXQgQ2FwYWNpdGFuY2UgKENpKSBNYXkgVmlvbGF0ZSB0aGUgTWF4aW11bSBJMkMgU3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDIyIChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMSkKKy8qIENlcnRhaW4gRXRoZXJuZXQgRnJhbWVzIFdpdGggRXJyb3JzIGFyZSBNaXNjbGFzc2lmaWVkIGluIFJNSUkgTW9kZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDIzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBJbnRlcm5hbCBWb2x0YWdlIFJlZ3VsYXRvciBOb3QgVHJpbW1lZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI0IChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIE11bHRpY2hhbm5lbCBTUE9SVCBDaGFubmVsIE1pc2FsaWdubWVudCBVbmRlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIFNwdXJpb3VzIEhhcmR3YXJlIEVycm9ycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQorLyogV0JfRURHRSBCaXQgaW4gTkZDX0lSUVNUQVQgSW5jb3JyZWN0bHkgUmVmbGVjdHMgQnVmZmVyIFN0YXR1cyBJbnN0ZWFkIG9mIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyOSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogU29mdHdhcmUgU3lzdGVtIFJlc2V0IENvcnJ1cHRzIFBMTF9MT0NLQ05UIFJlZ2lzdGVyICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzAgKEFOT01BTFlfQkY1MjcgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPiAxKQorLyogYmZyb21fU3lzQ29udHJvbCgpIERvZXMgTm90IENsZWFyIFNJQ19JV1IxIEJlZm9yZSBFeGVjdXRpbmcgUExMIFByb2dyYW1taW5nIFNlcXVlbmNlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKEFOT01BTFlfQkY1MjYpCiAKIC8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQpAQCAtOTcsNiArMTY1LDggQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2MyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NiAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MyAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4NSAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMwNyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyMyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2MyAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaAppbmRleCAwNTZlYjRiLi4xNDRmMDhkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oCkBAIC0zMCw4ICszMCw2IEBACiAjaWZuZGVmIF9fTUFDSF9CRjUyN19IX18KICNkZWZpbmUgX19NQUNIX0JGNTI3X0hfXwogCi0jZGVmaW5lIFNVUFBPUlRFRF9SRVZJRCAyCi0KICNkZWZpbmUgT0ZGU0VUXyh4KSAoKHgpICYgMHgwMDAwRkZGRikKIAogLypzb21lIG1pc2MgZGVmaW5lcyovCkBAIC0xMTIsMTYgKzExMCwzMSBAQAogCiAjaWZkZWYgQ09ORklHX0JGNTI3CiAjZGVmaW5lIENQVSAiQkY1MjciCisjZGVmaW5lIENQVUlEIDB4MjdlNAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTI2CisjZGVmaW5lIENQVSAiQkY1MjYiCisjZGVmaW5lIENQVUlEIDB4MjdlNAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTI1CiAjZGVmaW5lIENQVSAiQkY1MjUiCisjZGVmaW5lIENQVUlEIDB4MjdlNAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTI0CisjZGVmaW5lIENQVSAiQkY1MjQiCisjZGVmaW5lIENQVUlEIDB4MjdlNAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTIzCisjZGVmaW5lIENQVSAiQkY1MjMiCisjZGVmaW5lIENQVUlEIDB4MjdlNAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTIyCiAjZGVmaW5lIENQVSAiQkY1MjIiCisjZGVmaW5lIENQVUlEIDB4MjdlNAogI2VuZGlmCisKICNpZm5kZWYgQ1BVCi0jZGVmaW5lCUNQVSAiVU5LTk9XTiIKLSNkZWZpbmUgQ1BVSUQgMHgwCisjZXJyb3IgVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5CiAjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUyN19IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCAyNTI2YjZlLi43NTcyMmQ2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTc4LDYgKzc4LDkgQEAKICMgIGRlZmluZSBDT05GSUdfVUFSVDFfUlRTX1BJTiAtMQogIyBlbmRpZgogI2VuZGlmCisKKyNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCisKIC8qCiAgKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCiAgKi8KQEAgLTExOSw3ICsxMjIsNiBAQAogCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7CiB9CiAKLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IGJmaW5fc2VyaWFsX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107CiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nIHVhcnRfYmFzZV9hZGRyOwogCWludCB1YXJ0X2lycTsKQEAgLTE2NCw4ICsxNjYsNiBAQAogI2VuZGlmCiB9OwogCi1pbnQgbnJfcG9ydHMgPSBBUlJBWV9TSVpFKGJmaW5fc2VyaWFsX3Jlc291cmNlKTsKLQogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgogCiBzdGF0aWMgdm9pZCBiZmluX3NlcmlhbF9od19pbml0KHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTJ4X2Jhc2UuaAppbmRleCA2YWMyZWQ3Li42OGI1NWQwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTJ4X2Jhc2UuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTJ4X2Jhc2UuaApAQCAtMTg0MCw2ICsxODQwLDMzIEBACiAKICNkZWZpbmUgICAgICAgICAgICAgICAgIERQUkVTQ0FMRSAgMHhmICAgICAgICAvKiBMb2FkIENvdW50ZXIgUmVnaXN0ZXIgKi8KIAorLyogQ05UX0NPTU1BTkQgYml0IGZpZWxkIG9wdGlvbnMgKi8KKworI2RlZmluZSBXMUxDTlRfWkVSTyAgIDB4MDAwMSAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfQ09VTlRFUiB3aXRoIHplcm8gKi8KKyNkZWZpbmUgVzFMQ05UX01JTiAgICAweDAwMDQgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX0NPVU5URVIgZnJvbSBDTlRfTUlOICovCisjZGVmaW5lIFcxTENOVF9NQVggICAgMHgwMDA4ICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9DT1VOVEVSIGZyb20gQ05UX01BWCAqLworCisjZGVmaW5lIFcxTE1JTl9aRVJPICAgMHgwMDEwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NSU4gd2l0aCB6ZXJvICovCisjZGVmaW5lIFcxTE1JTl9DTlQgICAgMHgwMDIwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NSU4gZnJvbSBDTlRfQ09VTlRFUiAqLworI2RlZmluZSBXMUxNSU5fTUFYICAgIDB4MDA4MCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUlOIGZyb20gQ05UX01BWCAqLworCisjZGVmaW5lIFcxTE1BWF9aRVJPICAgMHgwMTAwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NQVggd2l0aCB6ZXJvICovCisjZGVmaW5lIFcxTE1BWF9DTlQgICAgMHgwMjAwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NQVggZnJvbSBDTlRfQ09VTlRFUiAqLworI2RlZmluZSBXMUxNQVhfTUlOICAgIDB4MDQwMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUFYIGZyb20gQ05UX01JTiAqLworCisvKiBDTlRfQ09ORklHIGJpdCBmaWVsZCBvcHRpb25zICovCisKKyNkZWZpbmUgQ05UTU9ERV9RVUFERU5DICAweDAwMDAgIC8qIHF1YWRyYXR1cmUgZW5jb2RlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfQklORU5DICAgMHgwMTAwICAvKiBiaW5hcnkgZW5jb2RlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfVURDTlQgICAgMHgwMjAwICAvKiB1cC9kb3duIGNvdW50ZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX0RJUkNOVCAgIDB4MDQwMCAgLyogZGlyZWN0aW9uIGNvdW50ZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX0RJUlRNUiAgIDB4MDUwMCAgLyogZGlyZWN0aW9uIHRpbWVyIG1vZGUgKi8KKworI2RlZmluZSBCTkRNT0RFX0NPTVAgICAgIDB4MDAwMCAgLyogYm91bmRhcnkgY29tcGFyZSBtb2RlICovCisjZGVmaW5lIEJORE1PREVfWkVSTyAgICAgMHgxMDAwICAvKiBib3VuZGFyeSBjb21wYXJlIGFuZCB6ZXJvIG1vZGUgKi8KKyNkZWZpbmUgQk5ETU9ERV9DQVBUICAgICAweDIwMDAgIC8qIGJvdW5kYXJ5IGNhcHR1cmUgbW9kZSAqLworI2RlZmluZSBCTkRNT0RFX0FFWFQgICAgIDB4MzAwMCAgLyogYm91bmRhcnkgYXV0by1leHRlbmQgbW9kZSAqLworCiAvKiBCaXQgbWFza3MgZm9yIE9UUF9DT05UUk9MICovCiAKICNkZWZpbmUgICAgICAgICAgICAgICAgRlVTRV9GQUREUiAgMHgxZmYgICAgICAvKiBPVFAvRnVzZSBBZGRyZXNzICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IGFlNGQyMDUuLjdmNmRhMmMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BvcnRtdXguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtNjcsNiArNjcsMTAgQEAKICNkZWZpbmUgUF9VQVJUMV9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTMpIHwgUF9GVU5DVCgxKSkKICNlbmRpZgogCisjZGVmaW5lIFBfQ05UX0NaTQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgzKSkKKyNkZWZpbmUgUF9DTlRfQ0RHCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikgfCBQX0ZVTkNUKDMpKQorI2RlZmluZSBQX0NOVF9DVUQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSB8IFBfRlVOQ1QoMykpCisKICNkZWZpbmUgUF9IV0FJVAkJKFBfRE9OVENBUkUpCiAKICNkZWZpbmUgUF9TUEkwX1NTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxKSB8IFBfRlVOQ1QoMCkpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKaW5kZXggYzY2YTY4Zi4uNzJhYzNhYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwpAQCAtOSw3ICs5LDcgQEAKICAqIE1vZGlmaWVkOgogICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKICAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMKLSAqCQkgQ29weXJpZ2h0IDIwMDcgSFYgU2lzdGVtYXMgUy5MLgorICoJCSBDb3B5cmlnaHQgMjAwNywyMDA4IEhWIFNpc3RlbWFzIFMuTC4KICAqCiAgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoKQEAgLTY0LDE4ICs2NCwxOCBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkbTkwMDBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSAweDIwMzAwMDAwLAotCQkuZW5kCT0gMHgyMDMwMDAwMCArIDEsCisJCS5lbmQJPSAweDIwMzAwMDAyLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0CT0gMHgyMDMwMDAwMCArIDQsCi0JCS5lbmQJPSAweDIwMzAwMDAwICsgNSwKKwkJLnN0YXJ0CT0gMHgyMDMwMDAwNCwKKwkJLmVuZAk9IDB4MjAzMDAwMDYsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzJdID0gewogCQkuc3RhcnQJPSBJUlFfUEYxMCwKIAkJLmVuZAk9IElSUV9QRjEwLAotCQkuZmxhZ3MJPSAoSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSksCisJCS5mbGFncwk9IChJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1RSSUdHRVJfSElHSCksCiAJfSwKIH07CiAKQEAgLTE0MCwxOCArMTQwLDIyIEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9uc1tdID0gewogCXsKLQkJLm5hbWUgPSAiYm9vdGxvYWRlcihzcGkpIiwKLQkJLnNpemUgPSAweDAwMDYwMDAwLAorCQkubmFtZSA9ICJib290bG9hZGVyIChzcGkpIiwKKwkJLnNpemUgPSAweDQwMDAwLAogCQkub2Zmc2V0ID0gMCwKIAkJLm1hc2tfZmxhZ3MgPSBNVERfQ0FQX1JPTQogCX0sIHsKLQkJLm5hbWUgPSAibGludXgga2VybmVsKHNwaSkiLAotCQkuc2l6ZSA9IDB4MTAwMDAwLAotCQkub2Zmc2V0ID0gMHg2MDAwMAorCQkubmFtZSA9ICJmcGdhIChzcGkpIiwKKwkJLnNpemUgPSAgIDB4MzAwMDAsCisJCS5vZmZzZXQgPSAweDQwMDAwCiAJfSwgewotCQkubmFtZSA9ICJmaWxlIHN5c3RlbShzcGkpIiwKLQkJLnNpemUgPSAweDZhMDAwMCwKLQkJLm9mZnNldCA9IDB4MDAxNjAwMDAsCisJCS5uYW1lID0gImxpbnV4IGtlcm5lbCAoc3BpKSIsCisJCS5zaXplID0gICAweDE1MDAwMCwKKwkJLm9mZnNldCA9ICAweDcwMDAwCisJfSwgeworCQkubmFtZSA9ICJqZmZzMiByb290IGZpbGUgc3lzdGVtIChzcGkpIiwKKwkJLnNpemUgPSAgIDB4NjQwMDAwLAorCQkub2Zmc2V0ID0gMHgxYzAwMDAsCiAJfQogfTsKIApAQCAtMzQwLDcgKzM0NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsODI1MF9wbGF0Zm9ybV9kYXRhIFtdID0gewogCXsKLQkJLm1lbWJhc2UgPSAweDIwMjAwMDAwLAorCQkubWVtYmFzZSA9ICh2b2lkICopMHgyMDIwMDAwMCwKIAkJLm1hcGJhc2UgPSAweDIwMjAwMDAwLAogCQkuaXJxID0gSVJRX1BGOCwKIAkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVQVJUX0NPTkZJR19UWVBFLApAQCAtMzQ4LDcgKzM1Miw3IEBACiAJCS5yZWdzaGlmdCA9IDEsCiAJCS51YXJ0Y2xrID0gNjY2NjY2NjcsCiAJfSwgewotCQkubWVtYmFzZSA9IDB4MjAyMDAwMTAsCisJCS5tZW1iYXNlID0gKHZvaWQgKikweDIwMjAwMDEwLAogCQkubWFwYmFzZSA9IDB4MjAyMDAwMTAsCiAJCS5pcnEgPSBJUlFfUEY4LAogCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVBUlRfQ09ORklHX1RZUEUsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwppbmRleCAwMWIyYjdlLi45ZmM5NWFhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKQEAgLTc4LDYgKzc4LDkgQEAKIAlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCiAJcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwogCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1CisJQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KKyNlbmRpZgogCiAJcDAuaCA9IGhpKFBMTF9DVEwpOwogCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggOGY3ZWExMS4uZjU0NGZjNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTcsNyArNyw3IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZSBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBDLCAwMi8wOC8yMDA4OyBBRFNQLUJGNTMxL0JGNTMyL0JGNTMzIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEQsIDA2LzE4LzIwMDg7IEFEU1AtQkY1MzEvQkY1MzIvQkY1MzMgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAogICovCiAKICNpZm5kZWYgX01BQ0hfQU5PTUFMWV9IXwpAQCAtOTcsMTEgKzk3LDExIEBACiAvKiBVQVJUIFNUQiBCaXQgSW5jb3JyZWN0bHkgQWZmZWN0cyBSZWNlaXZlciBTZXR0aW5nICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyMzEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIFBQSV9GUzMgSXMgTm90IERyaXZlbiBpbiAyIG9yIDMgSW50ZXJuYWwgRnJhbWUgU3luYyBUcmFuc21pdCBNb2RlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMzMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIEluY29ycmVjdCBSZXZpc2lvbiBOdW1iZXIgaW4gRFNQSUQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDIzNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPT0gNCkKIC8qIERGIEJpdCBpbiBQTExfQ1RMIFJlZ2lzdGVyIERvZXMgTm90IFJlc3BvbmQgdG8gSGFyZHdhcmUgUmVzZXQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0MiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBJZiBJLUNhY2hlIElzIE9uLCBDU1lOQy9TU1lOQy9JRExFIEFyb3VuZCBDaGFuZ2Ugb2YgQ29udHJvbCBDYXVzZXMgRmFpbHVyZXMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQogLyogU3B1cmlvdXMgSGFyZHdhcmUgRXJyb3IgZnJvbSBhbiBBY2Nlc3MgaW4gdGhlIFNoYWRvdyBvZiBhIENvbmRpdGlvbmFsIEJyYW5jaCAqLwpAQCAtMTMxLDcgKzEzMSw3IEBACiAvKiBDU1lOQy9TU1lOQy9JRExFIENhdXNlcyBJbmZpbml0ZSBTdGFsbCBpbiBQZW51bHRpbWF0ZSBJbnN0cnVjdGlvbiBpbiBIYXJkd2FyZSBMb29wICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIFNlbnNpdGl2aXR5IFRvIE5vaXNlIHdpdGggU2xvdyBJbnB1dCBFZGdlIFJhdGVzIG9uIEV4dGVybmFsIFNQT1JUIFRYIGFuZCBSWCBDbG9ja3MgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY1ICgxKQogLyogSGlnaCBJL08gQWN0aXZpdHkgQ2F1c2VzIE91dHB1dCBWb2x0YWdlIG9mIEludGVybmFsIFZvbHRhZ2UgUmVndWxhdG9yIChWZGRpbnQpIHRvIEluY3JlYXNlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIEhpZ2ggSS9PIEFjdGl2aXR5IENhdXNlcyBPdXRwdXQgVm9sdGFnZSBvZiBJbnRlcm5hbCBWb2x0YWdlIFJlZ3VsYXRvciAoVmRkaW50KSB0byBEZWNyZWFzZSAqLwpAQCAtMTQxLDU2ICsxNDEsNTkgQEAKIC8qIENlcnRhaW4gRGF0YSBDYWNoZSBXcml0ZXRocm91Z2ggTW9kZXMgRmFpbCBmb3IgVmRkaW50IDw9IDAuOVYgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MiAoMSkKIC8qIFdyaXRlcyB0byBTeW5jaHJvbm91cyBTRFJBTSBNZW1vcnkgTWF5IEJlIExvc3QgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MyAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA2KQogLyogVGltaW5nIFJlcXVpcmVtZW50cyBDaGFuZ2UgZm9yIEV4dGVybmFsIEZyYW1lIFN5bmMgUFBJIE1vZGVzIHdpdGggTm9uLVplcm8gUFBJX0RFTEFZICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzYgKDEpCiAvKiBXcml0ZXMgdG8gYW4gSS9PIERhdGEgUmVnaXN0ZXIgT25lIFNDTEsgQ3ljbGUgYWZ0ZXIgYW4gRWRnZSBJcyBEZXRlY3RlZCBNYXkgQ2xlYXIgSW50ZXJydXB0ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyNzcgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIERpc2FibGluZyBQZXJpcGhlcmFscyB3aXRoIERNQSBSdW5uaW5nIE1heSBDYXVzZSBETUEgU3lzdGVtIEluc3RhYmlsaXR5ICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiBXaGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgxICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDYpCiAvKiBNZW1vcnkgRE1BIENvcnJ1cHRpb24gd2l0aCAzMi1CaXQgRGF0YSBhbmQgVHJhZmZpYyBDb250cm9sICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyODIgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIFN5c3RlbSBNTVIgV3JpdGUgSXMgU3RhbGxlZCBJbmRlZmluaXRlbHkgV2hlbiBLaWxsZWQgaW4gYSBQYXJ0aWN1bGFyIFN0YWdlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyODMgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIFNQT1JUcyBNYXkgUmVjZWl2ZSBCYWQgRGF0YSBJZiBGSUZPcyBGaWxsIFVwICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAyODggKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIE1lbW9yeS1Uby1NZW1vcnkgRE1BIFNvdXJjZS9EZXN0aW5hdGlvbiBEZXNjcmlwdG9ycyBNdXN0IEJlIGluIFNhbWUgTWVtb3J5IFNwYWNlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMDEgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIFNTWU5DcyBBZnRlciBXcml0ZXMgVG8gRE1BIE1NUiBSZWdpc3RlcnMgTWF5IE5vdCBCZSBIYW5kbGVkIENvcnJlY3RseSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzAyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBOZXcgRmVhdHVyZTogQWRkaXRpb25hbCBIeXN0ZXJlc2lzIG9uIFNQT1JUIElucHV0IFBpbnMgKE5vdCBBdmFpbGFibGUgT24gT2xkZXIgU2lsaWNvbikgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMwNSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQogLyogTmV3IEZlYXR1cmU6IEFkZGl0aW9uYWwgUFBJIEZyYW1lIFN5bmMgU2FtcGxpbmcgT3B0aW9ucyAoTm90IEF2YWlsYWJsZSBPbiBPbGRlciBTaWxpY29uKSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA2IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCisvKiBTQ0tFTE9XIEJpdCBEb2VzIE5vdCBNYWludGFpbiBTdGF0ZSBUaHJvdWdoIEhpYmVybmF0ZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3ICgxKQogLyogRmFsc2UgSGFyZHdhcmUgRXJyb3JzIENhdXNlZCBieSBGZXRjaGVzIGF0IHRoZSBCb3VuZGFyeSBvZiBSZXNlcnZlZCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMCAoMSkKIC8qIEVycm9uZW91cyBGbGFnIChHUElPKSBQaW4gT3BlcmF0aW9ucyB1bmRlciBTcGVjaWZpYyBTZXF1ZW5jZXMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA2KQogLyogRXJyb3JzIFdoZW4gU1NZTkMsIENTWU5DLCBvciBMb2FkcyB0byBMVCwgTEIgYW5kIExDIFJlZ2lzdGVycyBBcmUgSW50ZXJydXB0ZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA2KQogLyogUFBJIElzIExldmVsLVNlbnNpdGl2ZSBvbiBGaXJzdCBUcmFuc2ZlciAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDYpCiAvKiBLaWxsZWQgU3lzdGVtIE1NUiBXcml0ZSBDb21wbGV0ZXMgRXJyb25lb3VzbHkgT24gTmV4dCBTeXN0ZW0gTU1SIEFjY2VzcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE1ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDYpCiAvKiBJbnRlcm5hbCBWb2x0YWdlIFJlZ3VsYXRvciBWYWx1ZXMgb2YgMS4wNVYsIDEuMTBWIGFuZCAxLjE1ViBOb3QgQWxsb3dlZCBmb3IgTFFGUCBQYWNrYWdlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE5IChBTk9NQUxZX0JGNTMxIHx8IEFOT01BTFlfQkY1MzIpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTkgKChBTk9NQUxZX0JGNTMxIHx8IEFOT01BTFlfQkY1MzIpICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIFNlcmlhbCBQb3J0IChTUE9SVCkgTXVsdGljaGFubmVsIFRyYW5zbWl0IEZhaWx1cmUgd2hlbiBDaGFubmVsIDAgSXMgRGlzYWJsZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA2KQogLyogVUFSVCBCcmVhayBTaWduYWwgSXNzdWVzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIFBQSSBVbmRlcmZsb3cgRXJyb3IgR29lcyBVbmRldGVjdGVkIGluIElUVS1SIDY1NiBNb2RlICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjYgKDEpCiAvKiBQb3NzaWJsZSBSRVRTIFJlZ2lzdGVyIENvcnJ1cHRpb24gd2hlbiBTdWJyb3V0aW5lIElzIHVuZGVyIDUgQ3ljbGVzIGluIER1cmF0aW9uICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzNzEgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNikKIC8qIFBQSSBEb2VzIE5vdCBTdGFydCBQcm9wZXJseSBJbiBTcGVjaWZpYyBNb2RlICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDA0MDAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID49IDUpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID09IDUpCiAvKiBTU1lOQyBTdGFsbHMgUHJvY2Vzc29yIHdoZW4gRXhlY3V0ZWQgZnJvbSBOb24tQ2FjaGVhYmxlIE1lbW9yeSAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSA1KQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA9PSA1KQogLyogTGV2ZWwtU2Vuc2l0aXZlIEV4dGVybmFsIEdQSU8gV2FrZXVwcyBNYXkgQ2F1c2UgSW5kZWZpbml0ZSBTdGFsbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAzICgxKQotCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCiAKIC8qIFRoZXNlIGFub21hbGllcyBoYXZlIGJlZW4gInBoYXNlZCIgb3V0IG9mIGFuYWxvZy5jb20gYW5vbWFseSBzaGVldHMgYW5kIGFyZQogICogaGVyZSB0byBzaG93IHJ1bm5pbmcgb24gb2xkZXIgc2lsaWNvbiBqdXN0IGlzbid0IGZlYXNpYmxlLgpAQCAtMjY4LDUgKzI3MSw3IEBACiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NiAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyMyAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MyAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoMSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmgKaW5kZXggMTJhNDE2OS4uZGZjOGMxYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaApAQCAtMzAsOCArMzAsNiBAQAogI2lmbmRlZiBfX01BQ0hfQkY1MzNfSF9fCiAjZGVmaW5lIF9fTUFDSF9CRjUzM19IX18KIAotI2RlZmluZSBTVVBQT1JURURfUkVWSUQgMgotCiAjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCiAKIC8qc29tZSBtaXNjIGRlZmluZXMqLwpAQCAtMTQzLDE5ICsxNDEsMTkgQEAKIAogI2lmZGVmIENPTkZJR19CRjUzMwogI2RlZmluZSBDUFUgIkJGNTMzIgotI2RlZmluZSBDUFVJRCAweDAyN2E1MDAwCisjZGVmaW5lIENQVUlEIDB4MjdhNQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTMyCiAjZGVmaW5lIENQVSAiQkY1MzIiCi0jZGVmaW5lIENQVUlEIDB4MDI3NUEwMDAKKyNkZWZpbmUgQ1BVSUQgMHgyNzVBCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MzEKICNkZWZpbmUgQ1BVICJCRjUzMSIKLSNkZWZpbmUgQ1BVSUQgMHgwMjdhNTAwMAorI2RlZmluZSBDUFVJRCAweDI3YTUKICNlbmRpZgorCiAjaWZuZGVmIENQVQotI2RlZmluZQlDUFUgIlVOS05PV04iCi0jZGVmaW5lIENQVUlEIDB4MAorI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MzNfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggZWJmNTkyYi4uZjNkOWU0OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC02OSw2ICs2OSw4IEBACiAjIGVuZGlmCiAjZW5kaWYKIAorI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKKwogc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewogICAgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICAgICAgICBwb3J0OwogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBvbGRfc3RhdHVzOwpAQCAtODMsNyArODUsNyBAQAogCXVuc2lnbmVkIGludAkJcnhfZG1hX2NoYW5uZWw7CiAJc3RydWN0IHdvcmtfc3RydWN0CXR4X2RtYV93b3JrcXVldWU7CiAjZWxzZQotIyBpZiBBTk9NQUxZXzA1MDAwMjMwCisjIGlmIEFOT01BTFlfMDUwMDAzNjMKIAl1bnNpZ25lZCBpbnQgYW5vbWFseV90aHJlc2hvbGQ7CiAjIGVuZGlmCiAjZW5kaWYKQEAgLTExMSw3ICsxMTMsNiBAQAogCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7CiB9CiAKLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IGJmaW5fc2VyaWFsX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107CiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xNDIsNyArMTQzLDYgQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgogCi1pbnQgbnJfcG9ydHMgPSBCRklOX1VBUlRfTlJfUE9SVFM7CiBzdGF0aWMgdm9pZCBiZmluX3NlcmlhbF9od19pbml0KHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQogewogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAl9CiAJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkgewogCQlncGlvX3JlcXVlc3QodWFydC0+cnRzX3BpbiwgRFJJVkVSX05BTUUpOwotCQlncGlvX2RpcmVjdGlvbl9pbnB1dCh1YXJ0LT5ydHNfcGluLCAwKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVhcnQtPnJ0c19waW4sIDApOwogCX0KICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCmluZGV4IDg0ODJkMjIuLjhkMzk0MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNpbmNsdWRlIDxhc20vcmVib290Lmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KICNpbmNsdWRlIDxhc20vZHBtYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzcuaD4KIAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwpAQCAtNTU1LDYgKzU1NCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLAogCS5iaXRzX3Blcl93b3JkID0gMTYsCkBAIC01NzUsNiArNTc1LDMwIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3OV90c19pbmZvID0geworCS5tb2RlbAkJCT0gNzg3OSwJLyogTW9kZWwgPSBBRDc4NzkgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDYyMCwJLyogNjIwIE9obSBmcm9tIHRoZSB0b3VjaCBkYXRhc2hlZXQgKi8KKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAwLAorCS5wcmVzc3VyZV9taW4JCT0gMCwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCS8qIHdhaXQgNTEydXMgYmVmb3JlIGRvIGEgZmlyc3QgY29udmVyc2lvbiAqLworCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCS8qIDR1cyBhY3F1aXNpdGlvbiB0aW1lIHBlciBzYW1wbGUgKi8KKwkubWVkaWFuCQkJPSAyLAkvKiBkbyA4IG1lYXN1cmVtZW50cyAqLworCS5hdmVyYWdpbmcgCQk9IDEsCS8qIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgNCBtaWRkbGUgc2FtcGxlcyAqLworCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMjU1LAkvKiA5LjQgbXMgKi8KKwkuZ3Bpb19vdXRwdXQJCT0gMSwJLyogY29uZmlndXJlIEFVWC9WQkFUL0dQSU8gYXMgR1BJTyBvdXRwdXQgKi8KKwkuZ3Bpb19kZWZhdWx0IAkJPSAxLAkvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0IEdQSU8gPSBISUdIICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLApAQCAtNTgyLDYgKzYwNiwxMyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGxxMDM1cTFfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYQk9IDAsCisJLmJpdHNfcGVyX3dvcmQJPSA4LAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0RBVEFGTEFTSCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0hfTU9EVUxFKQogCkBAIC03MjEsNiArNzUyLDE4IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImFkNzg3OSIsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fYWQ3ODc5X3RzX2luZm8sCisJCS5pcnEgPSBJUlFfUEY3LAorCQkubWF4X3NwZWVkX2h6ID0gNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzlfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCisJfSwKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQogCXsKIAkJLm1vZGFsaWFzID0gInNwaWRldiIsCkBAIC03MzAsNiArNzczLDE2IEBACiAJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKQEAgLTc3Nyw2ICs4MzAsMzQgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKyNpbmNsdWRlIDxhc20vYmZpbi1scTAzNXExLmg+CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9scTAzNXExZmJfZGlzcF9pbmZvIGJmaW5fbHEwMzVxMV9kYXRhID0geworCS5tb2RlID0gCUxRMDM1X05PUk0gfCBMUTAzNV9SR0IgfCBMUTAzNV9STCB8IExRMDM1X1RCLAorCS51c2VfYmwgPSAJMCwJLyogbGV0IHNvbWV0aGluZyBlbHNlIGNvbnRyb2wgdGhlIExDRCBCbGFja2xpZ2h0ICovCisJLmdwaW9fYmwgPQlHUElPX1BGNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9scTAzNXExX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gSVJRX1BQSV9FUlJPUiwKKwkJLmVuZCA9IElSUV9QUElfRVJST1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2xxMDM1cTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJiZmluLWxxMDM1cTEiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcyAJPSBBUlJBWV9TSVpFKGJmaW5fbHEwMzVxMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAJPSBiZmluX2xxMDM1cTFfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2xxMDM1cTFfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMApAQCAtODU2LDcgKzkzNyw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfQUQ3MTQyKSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19BRDcxNDJfTU9EVUxFKQogCXsKIAkJSTJDX0JPQVJEX0lORk8oImFkNzE0Ml9qb3lzdGljayIsIDB4MkMpLAotCQkuaXJxID0gNTUsCisJCS5pcnEgPSBJUlFfUEY1LAogCX0sCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19UV0lfTENEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfTENEX01PRFVMRSkKQEAgLTg2Nyw3ICs5NDgsMTQgQEAKICNpZiBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEX01PRFVMRSkKIAl7CiAJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2tleXBhZCIsIDB4MjcpLAotCQkuaXJxID0gNzIsCisJCS5pcnEgPSBJUlFfUEc2LAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhZDc4NzkiLCAweDJGKSwKKwkJLmlycSA9IElSUV9QRzUsCisJCS5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikmYmZpbl9hZDc4NzlfdHNfaW5mbywKIAl9LAogI2VuZGlmCiB9OwpAQCAtOTk3LDYgKzEwODUsMTAgQEAKIAkmYmZpbl9mYl9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKwkmYmZpbl9scTAzNXExX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl83MzkzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOXzczOTNfTU9EVUxFKQogCSZiZmluX2ZiX2FkdjczOTNfZGV2aWNlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUwppbmRleCAxMmViNWNjLi5mNWM5NGJmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9oZWFkLlMKQEAgLTg3LDYgKzg3LDkgQEAKIAlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCiAJcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwogCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1CisJQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KKyNlbmRpZgogCiAJcDAuaCA9IGhpKFBMTF9DVEwpOwogCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggODQ2MGFiOS4uYzY4OTkyNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTE1OCw2ICsxNTgsOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY2ICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaAppbmRleCBjZmUyYTIyLi4yNGQ1YzlkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oCkBAIC0zMCw4ICszMCw2IEBACiAjaWZuZGVmIF9fTUFDSF9CRjUzN19IX18KICNkZWZpbmUgX19NQUNIX0JGNTM3X0hfXwogCi0jZGVmaW5lIFNVUFBPUlRFRF9SRVZJRCAyCi0KIC8qIE1hc2tzIGZvciBnZW5lcmljIEVSUk9SIElSUSBkZW11bHRpcGxleGluZyB1c2VkIGluIGludC1wcmlvcml0eS1zYy5jICovCiAKICNkZWZpbmUgU1BJX0VSUl9NQVNLIChUWENPTCB8IFJCU1kgfCBNT0RGIHwgVFhFKQkvKiBTUElfU1RBVCAqLwpAQCAtMTIzLDE5ICsxMjEsMTkgQEAKIAogI2lmZGVmIENPTkZJR19CRjUzNwogI2RlZmluZSBDUFUgIkJGNTM3IgotI2RlZmluZSBDUFVJRCAweDAyN2M4MDAwCisjZGVmaW5lIENQVUlEIDB4MjdjOAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTM2CiAjZGVmaW5lIENQVSAiQkY1MzYiCi0jZGVmaW5lIENQVUlEIDB4MDI3YzgwMDAKKyNkZWZpbmUgQ1BVSUQgMHgyN2M4CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MzQKICNkZWZpbmUgQ1BVICJCRjUzNCIKLSNkZWZpbmUgQ1BVSUQgMHgwMjdjNjAwMAorI2RlZmluZSBDUFVJRCAweDI3YzYKICNlbmRpZgorCiAjaWZuZGVmIENQVQotI2RlZmluZQlDUFUgIlVOS05PV04iCi0jZGVmaW5lIENQVUlEIDB4MAorI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MzdfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggMWJmNTZmZi4uYjNmODdlMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC03OCw2ICs3OCw5IEBACiAjICBkZWZpbmUgQ09ORklHX1VBUlQxX1JUU19QSU4gLTEKICMgZW5kaWYKICNlbmRpZgorCisjZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgorCiAvKgogICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYwogICovCkBAIC0xMTksNyArMTIyLDYgQEAKIAliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOwogfQogCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCBiZmluX3NlcmlhbF9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZwl1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQJCXVhcnRfaXJxOwpAQCAtMTY0LDggKzE2Niw2IEBACiAjZW5kaWYKIH07CiAKLWludCBucl9wb3J0cyA9IEFSUkFZX1NJWkUoYmZpbl9zZXJpYWxfcmVzb3VyY2UpOwotCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCiAKIHN0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX2h3X2luaXQoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKaW5kZXggY2U5MzRlZS4uMjQxOTJhYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwpAQCAtMzYsMTEgKzM2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+Ci0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbmFuZC5oPgpAQCAtMTc1LDYgKzE3Miw3IEBACiAJewogCQkuc3RhcnQgPSAweEZGQzAzMTAwLAogCQkuZW5kID0gMHhGRkMwMzFGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKICNlbmRpZgogfTsKQEAgLTI2OCw2ICsyNjYsMTYgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfY29uZmlnIG11c2JfY29uZmlnID0geworCS5tdWx0aXBvaW50CT0gMCwKKwkuZHluX2ZpZm8JPSAwLAorCS5zb2Z0X2Nvbgk9IDEsCisJLmRtYQkJPSAxLAorCS5udW1fZXBzCT0gNywKKwkuZG1hX2NoYW5uZWxzCT0gNywKKwkuZ3Bpb192cnNlbAk9IEdQSU9fUEg2LAorfTsKKwogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfT1RHKQogCS5tb2RlCQk9IE1VU0JfT1RHLApAQCAtMjc2LDcgKzI4NCw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQykKIAkubW9kZQkJPSBNVVNCX1BFUklQSEVSQUwsCiAjZW5kaWYKLQkubXVsdGlwb2ludAk9IDAsCisJLmNvbmZpZwkJPSAmbXVzYl9jb25maWcsCiB9OwogCiBzdGF0aWMgdTY0IG11c2JfZG1hbWFzayA9IH4odTMyKTA7CkBAIC0zMjEsMTIgKzMyOSwxMiBAQAogCXsKIAkJLm5hbWUgPSAibGludXgga2VybmVsKG5hbmQpIiwKIAkJLm9mZnNldCA9IDAsCi0JCS5zaXplID0gNCAqIFNJWkVfMU0sCisJCS5zaXplID0gNCAqIDEwMjQgKiAxMDI0LAogCX0sCiAJewogCQkubmFtZSA9ICJmaWxlIHN5c3RlbShuYW5kKSIsCi0JCS5vZmZzZXQgPSA0ICogU0laRV8xTSwKLQkJLnNpemUgPSAoMjU2IC0gNCkgKiBTSVpFXzFNLAorCQkub2Zmc2V0ID0gNCAqIDEwMjQgKiAxMDI0LAorCQkuc2l6ZSA9ICgyNTYgLSA0KSAqIDEwMjQgKiAxMDI0LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKaW5kZXggMzkzNTc2OS4uNTI4ODE4NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwpAQCAtMzgsMTEgKzM4LDggQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC91c2IvbXVzYi5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+Ci0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbmFuZC5oPgpAQCAtMTg2LDYgKzE4MywzNyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfQkZJTl9ST1RBUlkpIHx8IGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0JGSU5fUk9UQVJZX01PRFVMRSkKKyNpbmNsdWRlIDxhc20vYmZpbl9yb3RhcnkuaD4KKworc3RhdGljIHN0cnVjdCBiZmluX3JvdGFyeV9wbGF0Zm9ybV9kYXRhIGJmaW5fcm90YXJ5X2RhdGEgPSB7CisJLyoucm90YXJ5X3VwX2tleSAgICAgPSBLRVlfVVAsKi8KKwkvKi5yb3RhcnlfZG93bl9rZXkgICA9IEtFWV9ET1dOLCovCisJLnJvdGFyeV9yZWxfY29kZSAgID0gUkVMX1dIRUVMLAorCS5yb3RhcnlfYnV0dG9uX2tleSA9IEtFWV9FTlRFUiwKKwkuZGVib3VuY2UJICAgPSAxMCwJLyogMC4uMTcgKi8KKwkubW9kZQkJICAgPSBST1RfUVVBRF9FTkMgfCBST1RfREVCRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9yb3RhcnlfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBJUlFfQ05ULAorCQkuZW5kID0gSVJRX0NOVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fcm90YXJ5X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYmZpbi1yb3RhcnkiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcyAJPSBBUlJBWV9TSVpFKGJmaW5fcm90YXJ5X3Jlc291cmNlcyksCisJLnJlc291cmNlIAk9IGJmaW5fcm90YXJ5X3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9yb3RhcnlfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKIAkubmFtZSA9ICJydGMtYmZpbiIsCkBAIC0zMTQsNiArMzQyLDE2IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX2NvbmZpZyBtdXNiX2NvbmZpZyA9IHsKKwkubXVsdGlwb2ludAk9IDAsCisJLmR5bl9maWZvCT0gMCwKKwkuc29mdF9jb24JPSAxLAorCS5kbWEJCT0gMSwKKwkubnVtX2Vwcwk9IDcsCisJLmRtYV9jaGFubmVscwk9IDcsCisJLmdwaW9fdnJzZWwJPSBHUElPX1BFNywKK307CisKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykKIAkubW9kZQkJPSBNVVNCX09URywKQEAgLTMyMiw3ICszNjAsNyBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMpCiAJLm1vZGUJCT0gTVVTQl9QRVJJUEhFUkFMLAogI2VuZGlmCi0JLm11bHRpcG9pbnQJPSAwLAorCS5jb25maWcJCT0gJm11c2JfY29uZmlnLAogfTsKIAogc3RhdGljIHU2NCBtdXNiX2RtYW1hc2sgPSB+KHUzMikwOwpAQCAtMzY3LDcgKzQwNSw3IEBACiAJewogCQkubmFtZSA9ICJsaW51eCBrZXJuZWwobmFuZCkiLAogCQkub2Zmc2V0ID0gMCwKLQkJLnNpemUgPSA0ICogU0laRV8xTSwKKwkJLnNpemUgPSA0ICogMTAyNCAqIDEwMjQsCiAJfSwKIAl7CiAJCS5uYW1lID0gImZpbGUgc3lzdGVtKG5hbmQpIiwKQEAgLTQyNCw3ICs0NjIsNyBAQAogCQkub2Zmc2V0ICAgICA9IDAsCiAJfSwgewogCQkubmFtZSAgICAgICA9ICJsaW51eCBrZXJuZWwobm9yKSIsCi0JCS5zaXplICAgICAgID0gMHgxQzAwMDAsCisJCS5zaXplICAgICAgID0gMHg0MDAwMDAsCiAJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgICAgICAgPSAiZmlsZSBzeXN0ZW0obm9yKSIsCkBAIC00NDEsNyArNDc5LDcgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlemtpdF9mbGFzaF9yZXNvdXJjZSA9IHsKIAkuc3RhcnQgPSAweDIwMDAwMDAwLAotCS5lbmQgICA9IDB4MjBmZmZmZmYsCisJLmVuZCAgID0gMHgyMWZmZmZmZiwKIAkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIH07CiAKQEAgLTU1MSw3ICs1ODksNyBAQAogewogCS5tb2RhbGlhcwkJPSAiYWQ3ODc3IiwKIAkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKLQkuaXJxCQkJPSBJUlFfUEoxMSwKKwkuaXJxCQkJPSBJUlFfUEoxMSwJLyogbmV3ZXIgYm9hcmRzIChSZXYgMS40KykgdXNlIElSUV9QQjQgKi8KIAkubWF4X3NwZWVkX2h6CQk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCS5idXNfbnVtCQk9IDAsCiAJLmNoaXBfc2VsZWN0ICAJCT0gMiwKQEAgLTgxMCw2ICs4NDgsMTAgQEAKIAkmYmY1NHhfa3BhZF9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0JGSU5fUk9UQVJZKSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19CRklOX1JPVEFSWV9NT0RVTEUpCisJJmJmaW5fcm90YXJ5X2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiAJJmkyY19iZmluX3R3aTBfZGV2aWNlLAogI2lmICFkZWZpbmVkKENPTkZJR19CRjU0MikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TCmluZGV4IDRkNWNmZWEuLjkzYjM2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2hlYWQuUwpAQCAtNzMsMjUgKzczLDE5IEBACiAJd1twMF0gPSByMC5sOwogCXNzeW5jOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpCisJLyogZW5hYmxlIHNlbGYgcmVmcmVzaCB2aWEgU1JSRVEgKi8KIAlQMi5IID0gaGkoRUJJVV9SU1RDVEwpOwogCVAyLkwgPSBsbyhFQklVX1JTVENUTCk7CiAJUjAgPSBbUDJdOwogCUJJVFNFVCAoUjAsIDMpOwotI2Vsc2UKLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLSNlbmRpZgogCVtQMl0gPSBSMDsKIAlTU1lOQzsKLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkKKworCS8qIHdhaXQgZm9yIFNSQUNLIGJpdCB0byBiZSBzZXQgKi8KIC5MU1JSX01PREU6CiAJUjAgPSBbUDJdOwogCUNDID0gQklUVFNUKFIwLCA0KTsKIAlpZiAhQ0MgSlVNUCAuTFNSUl9NT0RFOwotI2VuZGlmCiAKIAlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCiAJcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAwLDYgKzk0LDkgQEAKIAlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCiAJcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwogCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1CisJQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KKyNlbmRpZgogCiAJcDAuaCA9IGhpKFBMTF9DVEwpOwogCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KQEAgLTEyMyw3ICsxMjAsNyBAQAogCXdbcDBdID0gcjAubDsKIAlzc3luYzsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorCS8qIGRpc2FibGUgc2VsZiByZWZyZXNoIGJ5IGNsZWFyaW5nIFNSUkVRICovCiAJUDIuSCA9IGhpKEVCSVVfUlNUQ1RMKTsKIAlQMi5MID0gbG8oRUJJVV9SU1RDVEwpOwogCVIwID0gW1AyXTsKQEAgLTE1NSw0MSArMTUyLDYgQEAKIAlyMC5oID0gaGkobWVtX0REUkNUTDIpOwogCVtwMF0gPSByMDsKIAlzc3luYzsKLSNlbHNlCi0JcDAubCA9IGxvKEVCSVVfU0RSUkMpOwotCXAwLmggPSBoaShFQklVX1NEUlJDKTsKLQlyMCA9IG1lbV9TRFJSQzsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gTE8oRUJJVV9TREJDVEwpOwotCXAwLmggPSBISShFQklVX1NEQkNUTCk7ICAgICAvKiBTRFJBTSBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyICovCi0JcjAgPSBtZW1fU0RCQ1RMOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLSNlbmRpZgogCiAJUlRTOwogRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDNhZDU5NjUuLjgxNmIwOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0yLDE4ICsyLDE4IEBACiAgKiBGaWxlOiBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2Fub21hbHkuaAogICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKIC8qIFRoaXMgZmlsZSBzaG91bGUgYmUgdXAgdG8gZGF0ZSB3aXRoOgotICogIC0gUmV2aXNpb24gRSwgMTEvMjgvMjAwNzsgQURTUC1CRjU0Mi9CRjU0NC9CRjU0Ny9CRjU0OC9CRjU0OSBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBHLCAwOC8wNy8yMDA4OyBBRFNQLUJGNTQyL0JGNTQ0L0JGNTQ3L0JGNTQ4L0JGNTQ5IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KICNkZWZpbmUgX01BQ0hfQU5PTUFMWV9IXwogCi0vKiBNdWx0aS1Jc3N1ZSBJbnN0cnVjdGlvbiB3aXRoIGRzcDMyc2hpZnRpbW0gaW4gc2xvdDEgYW5kIFAtcmVnIFN0b3JlIGluIHNsb3QgMiBOb3QgU3VwcG9ydGVkICovCisvKiBNdWx0aS1Jc3N1ZSBJbnN0cnVjdGlvbiB3aXRoIGRzcDMyc2hpZnRpbW0gaW4gc2xvdDEgYW5kIFAtcmVnIFN0b3JlIGluIHNsb3QyIE5vdCBTdXBwb3J0ZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDA3NCAoMSkKIC8qIERNQV9SVU4gQml0IElzIE5vdCBWYWxpZCBhZnRlciBhIFBlcmlwaGVyYWwgUmVjZWl2ZSBDaGFubmVsIERNQSBTdG9wcyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTE5ICgxKQpAQCAtMzYsMTQgKzM2LDE0IEBACiAvKiBUV0kgU2xhdmUgQm9vdCBNb2RlIElzIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIEV4dGVybmFsIEZJRk8gQm9vdCBNb2RlIElzIE5vdCBGdW5jdGlvbmFsICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMjUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMyNSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogRGF0YSBMb3N0IFdoZW4gQ29yZSBhbmQgRE1BIEFjY2Vzc2VzIEFyZSBNYWRlIHRvIHRoZSBVU0IgRklGTyBTaW11bHRhbmVvdXNseSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzI3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBJbmNvcnJlY3QgQWNjZXNzIG9mIE9UUF9TVEFUVVMgRHVyaW5nIG90cF93cml0ZSgpIEZ1bmN0aW9uICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIFN5bmNocm9ub3VzIEJ1cnN0IEZsYXNoIEJvb3QgTW9kZSBJcyBOb3QgRnVuY3Rpb25hbCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzI5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCi0vKiBIb3N0IERNQSBCb290IE1vZGUgSXMgTm90IEZ1bmN0aW9uYWwgKi8KKy8qIEhvc3QgRE1BIEJvb3QgTW9kZXMgQXJlIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMzAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIEluYWRlcXVhdGUgVGltaW5nIE1hcmdpbnMgb24gRERSIERRUyB0byBEUSBhbmQgRFFNIFNrZXcgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMzNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQpAQCAtNjEsMjYgKzYxLDEwMiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzQ0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBVU0IgQ2FsaWJyYXRpb24gVmFsdWUgSXMgTm90IEludGlhbGl6ZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQotLyogQm9vdCBST00gS2VybmVsIEluY29ycmVjdGx5IEFsdGVycyBSZXNldCBWYWx1ZSBvZiBVU0IgUmVnaXN0ZXIgKi8KKy8qIFVTQiBDYWxpYnJhdGlvbiBWYWx1ZSB0byB1c2UgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM0Nl92YWx1ZSAweDU0MTEKKy8qIFByZWJvb3QgUm91dGluZSBJbmNvcnJlY3RseSBBbHRlcnMgUmVzZXQgVmFsdWUgb2YgVVNCIFJlZ2lzdGVyICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNDcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIERhdGEgTG9zdCB3aGVuIENvcmUgUmVhZHMgU0RIIERhdGEgRklGTyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzQ5IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyIElzIEluYWNjdXJhdGUgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIEZ1bmN0aW9uIFBlcmZvcm1zIEltcHJvcGVyIFN5c3RlbSBSZXNldCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBSZWd1bGF0b3IgUHJvZ3JhbW1pbmcgQmxvY2tlZCB3aGVuIEhpYmVybmF0ZSBXYWtldXAgU291cmNlIFJlbWFpbnMgQWN0aXZlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIFN5c3RlbSBTdGFsbGVkIER1cmluZyBBIENvcmUgQWNjZXNzIFRvIEFNQyBXaGlsZSBBIENvcmUgQWNjZXNzIFRvIE5GQyBGSUZPIElzIFJlcXVpcmVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIFNlcmlhbCBQb3J0IChTUE9SVCkgTXVsdGljaGFubmVsIFRyYW5zbWl0IEZhaWx1cmUgd2hlbiBDaGFubmVsIDAgSXMgRGlzYWJsZWQgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoMSkKIC8qIEV4dGVybmFsIE1lbW9yeSBSZWFkIEFjY2VzcyBIYW5ncyBDb3JlIFdpdGggUExMIEJ5cGFzcyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYwICgxKQogLyogRE1BcyB0aGF0IEdvIFVyZ2VudCBkdXJpbmcgVGlnaHQgQ29yZSBXcml0ZXMgdG8gRXh0ZXJuYWwgTWVtb3J5IEFyZSBCbG9ja2VkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjUgKDEpCisvKiBXVVJFU0VUIEJpdCBJbiBTWVNDUiBSZWdpc3RlciBEb2VzIE5vdCBQcm9wZXJseSBJbmRpY2F0ZSBIaWJlcm5hdGUgV2FrZS1VcCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCiAvKiBBZGRyZXNzaW5nIENvbmZsaWN0IGJldHdlZW4gQm9vdCBST00gYW5kIEFzeW5jaHJvbm91cyBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2OSAoMSkKKy8qIERlZmF1bHQgUExMIE1TRUwgYW5kIFNTRUwgU2V0dGluZ3MgQ2FuIENhdXNlIDQwME1IeiBQcm9kdWN0IFRvIFZpb2xhdGUgU3BlY2lmaWNhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQogLyogUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyBpbiBEdXJhdGlvbiAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBVU0IgRFAvRE0gRGF0YSBQaW5zIE1heSBMb3NlIFN0YXRlIFdoZW4gRW50ZXJpbmcgSGliZXJuYXRlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKIC8qIE1vYmlsZSBERFIgT3BlcmF0aW9uIE5vdCBGdW5jdGlvbmFsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzcgKDEpCiAvKiBTZWN1cml0eS9BdXRoZW50aWNhdGlvbiBTcGVlZHBhdGggQ2F1c2VzIEF1dGhlbnRpY2F0aW9uIFRvIEZhaWwgVG8gSW5pdGlhdGUgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3OCAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3OCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogMTYtQml0IE5BTkQgRkxBU0ggQm9vdCBNb2RlIElzIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzkgKDEpCisvKiA4LUJpdCBOQU5EIEZsYXNoIEJvb3QgTW9kZSBOb3QgRnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBTb21lIEFUQVBJIE1vZGVzIEFyZSBOb3QgRnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzgzICgxKQorLyogQm9vdCBmcm9tIE9UUCBNZW1vcnkgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIFJvdXRpbmUgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogUHJvZ3JhbW1hYmxlIFByZWJvb3QgU2V0dGluZ3MgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogQ1JDMzIgQ2hlY2tzdW0gU3VwcG9ydCBOb3QgRnVuY3Rpb25hbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBSZXNldCBWZWN0b3IgTXVzdCBOb3QgQmUgaW4gU0RSQU0gTWVtb3J5IFNwYWNlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIENoYW5nZWQgTWVhbmluZyBvZiBCQ09ERSBGaWVsZCBpbiBTWVNDUiBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzkwIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBSZXBlYXRlZCBCb290IGZyb20gUGFnZS1Nb2RlIG9yIEJ1cnN0LU1vZGUgRmxhc2ggTWVtb3J5IE1heSBGYWlsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIHBUZW1wQ3VycmVudCBOb3QgUHJlc2VudCBpbiBBRElfQk9PVF9EQVRBIFN0cnVjdHVyZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzkyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpCisvKiBEZXByZWNhdGVkIFZhbHVlIG9mIGRUZW1wQnl0ZUNvdW50IGluIEFESV9CT09UX0RBVEEgU3RydWN0dXJlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIExvZyBCdWZmZXIgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogSG9vayBSb3V0aW5lIE5vdCBGdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzOTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMSkKKy8qIEhlYWRlciBJbmRpcmVjdCBCaXQgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogQktfT05FUywgQktfWkVST1MsIGFuZCBCS19EQVRFQ09ERSBDb25zdGFudHMgTm90IEZ1bmN0aW9uYWwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM5NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKQorLyogTG9ja2JveCBTRVNSIERpc2FsbG93cyBDZXJ0YWluIFVzZXIgSW50ZXJydXB0cyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBMb2NrYm94IFNFU1IgRmlybXdhcmUgRG9lcyBOb3QgU2F2ZS9SZXN0b3JlIEZ1bGwgQ29udGV4dCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA1ICgxKQorLyogTG9ja2JveCBTRVNSIEFyZ3VtZW50IENoZWNraW5nIERvZXMgTm90IENoZWNrIEwyIE1lbW9yeSBQcm90ZWN0aW9uIFJhbmdlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIExvY2tib3ggU0VTUiBGaXJtd2FyZSBBcmd1bWVudHMgQXJlIE5vdCBSZXRhaW5lZCBBZnRlciBGaXJzdCBJbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBMb2NrYm94IEZpcm13YXJlIE1lbW9yeSBDbGVhbnVwIFJvdXRpbmUgRG9lcyBub3QgQ2xlYXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDggKDEpCisvKiBMb2NrYm94IGZpcm13YXJlIGxlYXZlcyBNRE1BMCBjaGFubmVsIGVuYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwOSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogYmZyb21fU3lzQ29udHJvbCgpIEZpcm13YXJlIEZ1bmN0aW9uIENhbm5vdCBiZSBVc2VkIHRvIEVudGVyIFBvd2VyIFNhdmluZyBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDExIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDIpCisvKiBOQU5EIEJvb3QgTW9kZSBOb3QgQ29tcGF0aWJsZSBXaXRoIFNvbWUgTkFORCBGbGFzaCBEZXZpY2VzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIE9UUF9DSEVDS19GT1JfUFJFVl9XUklURSBCaXQgaXMgTm90IEZ1bmN0aW9uYWwgaW4gYmZyb21fT3RwV3JpdGUoKSBBUEkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE2ICgxKQorLyogTXVsdGljaGFubmVsIFNQT1JUIENoYW5uZWwgTWlzYWxpZ25tZW50IFVuZGVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNSAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIFNwdXJpb3VzIEhhcmR3YXJlIEVycm9ycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQorLyogQ09SRV9FUFBJX1BSSU8gYml0IGFuZCBTWVNfRVBQSV9QUklPIGJpdCBpbiB0aGUgSE1ETUExX0NPTlRST0wgcmVnaXN0ZXIgYXJlIG5vdCBmdW5jdGlvbmFsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFdCX0VER0UgQml0IGluIE5GQ19JUlFTVEFUIEluY29ycmVjdGx5IEJlaGF2ZXMgYXMgYSBCdWZmZXIgU3RhdHVzIEJpdCBJbnN0ZWFkIG9mIGFuIElSUSBTdGF0dXMgQml0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKKy8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSAyKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoMCkKQEAgLTkzLDYgKzE2OSw3IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjYgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDcgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmgKaW5kZXggZTc0ODU4OC4uNDlmOWI0MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaApAQCAtMzAsOCArMzAsNiBAQAogI2lmbmRlZiBfX01BQ0hfQkY1NDhfSF9fCiAjZGVmaW5lIF9fTUFDSF9CRjU0OF9IX18KIAotI2RlZmluZSBTVVBQT1JURURfUkVWSUQgMAotCiAjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCiAKIC8qc29tZSBtaXNjIGRlZmluZXMqLwpAQCAtMTA4LDIwICsxMDYsMjMgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGNTQyKQogIyBkZWZpbmUgQ1BVICAgIkJGNTQyIgotIyBkZWZpbmUgQ1BVSUQgMHgwMjdjODAwMAorIyBkZWZpbmUgQ1BVSUQgMHgyN2RlCiAjZWxpZiBkZWZpbmVkKENPTkZJR19CRjU0NCkKLSMgZGVmaW5lIENQVSAiQkY1NDQiCi0jIGRlZmluZSBDUFVJRCAweDAyN2M4MDAwCisjIGRlZmluZSBDUFUgICAiQkY1NDQiCisjIGRlZmluZSBDUFVJRCAweDI3ZGUKICNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTQ3KQotIyBkZWZpbmUgQ1BVICJCRjU0NyIKKyMgZGVmaW5lIENQVSAgICJCRjU0NyIKKyMgZGVmaW5lIENQVUlEIDB4MjdkZQogI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NDgpCi0jIGRlZmluZSBDUFUgIkJGNTQ4IgotIyBkZWZpbmUgQ1BVSUQgMHgwMjdjNjAwMAorIyBkZWZpbmUgQ1BVICAgIkJGNTQ4IgorIyBkZWZpbmUgQ1BVSUQgMHgyN2RlCiAjZWxpZiBkZWZpbmVkKENPTkZJR19CRjU0OSkKLSMgZGVmaW5lIENQVSAiQkY1NDkiCi0jZWxzZQotIyBkZWZpbmUgQ1BVICJVTktOT1dOIgotIyBkZWZpbmUgQ1BVSUQgMHgwCisjIGRlZmluZSBDUFUgICAiQkY1NDkiCisjIGRlZmluZSBDUFVJRCAweDI3ZGUKKyNlbmRpZgorCisjaWZuZGVmIENQVQorI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQogI2VuZGlmCiAKICNlbmRpZgkvKiBfX01BQ0hfQkY0OF9IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCA1ZTI5NDQ2Li5lNGNmMzVlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTgyLDYgKzgyLDkgQEAKICMgIGRlZmluZSBDT05GSUdfVUFSVDFfUlRTX1BJTiAtMQogIyBlbmRpZgogI2VuZGlmCisKKyNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCisKIC8qCiAgKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCiAgKi8KQEAgLTEwNSw3ICsxMDgsNiBAQAogI2VuZGlmCiB9OwogCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCBiZmluX3NlcmlhbF9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZwl1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQJCXVhcnRfaXJxOwpAQCAtMTcwLDggKzE3Miw2IEBACiAjZW5kaWYKIH07CiAKLWludCBucl9wb3J0cyA9IEFSUkFZX1NJWkUoYmZpbl9zZXJpYWxfcmVzb3VyY2UpOwotCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCiAKIHN0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX2h3X2luaXQoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IGY5OWY0N2IuLmEyMjI4NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC05NCwxMyArOTQsMTMgQEAKICNlbmRpZiAvKkNPTkZJR19CRklOX0RDQUNIRSovCiAKIC8qIExldmVsIDIgTWVtb3J5ICovCi0jaWYgIWRlZmluZWQoQ09ORklHX0JGNTQyKQotIyBkZWZpbmUgTDJfU1RBUlQgICAgICAgICAgMHhGRUIwMDAwMAotIyBpZiBkZWZpbmVkKENPTkZJR19CRjU0NCkKLSMgIGRlZmluZSBMMl9MRU5HVEggICAgICAgIDB4MTAwMDAKLSMgZWxzZQotIyAgZGVmaW5lIEwyX0xFTkdUSCAgICAgICAgMHgyMDAwMAotIyBlbmRpZgorI2RlZmluZSBMMl9TVEFSVCAgICAgICAgICAgIDB4RkVCMDAwMDAKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0MikKKyMgZGVmaW5lIEwyX0xFTkdUSCAgICAgICAgICAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjU0NCkKKyMgZGVmaW5lIEwyX0xFTkdUSCAgICAgICAgICAweDEwMDAwCisjZWxzZQorIyBkZWZpbmUgTDJfTEVOR1RIICAgICAgICAgIDB4MjAwMDAKICNlbmRpZgogCiAvKiBTY3JhdGNoIFBhZCBNZW1vcnkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCmluZGV4IDc1ZWE2YTkuLjMxYTc3N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUwpAQCAtNzcsNiArNzcsOSBAQAogCXIxID0gUExMX0JZUEFTUzsgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyB0aGUgUExMPyAgICAgICAgICAgICAgICAgKi8KIAlyMSA9IHIxIDw8IDg7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyICAgICAgICAgICAgICAgICAgICovCiAJcjAgPSByMSB8IHIwOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRoZW0gYWxsIHRvZ2V0aGVyICAgICAgICAgICAqLworI2lmZGVmIEFOT01BTFlfMDUwMDAyNjUKKwlCSVRTRVQocjAsIDE1KTsgICAgICAgICAgICAgICAgICAvKiBBZGQgMjUwIG1WIG9mIGh5c3RlcmVzaXMgdG8gU1BPUlQgaW5wdXQgcGlucyAqLworI2VuZGlmCiAKIAlwMC5oID0gaGkoUExMX0NUTCk7CiAJcDAubCA9IGxvKFBMTF9DVEwpOyAgICAgICAgICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCA1YzVkN2Q3Li4yMjk5MGRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMjcwLDUgKzI3MCw3IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxODMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oCmluZGV4IDNlZjllNWYuLjE4YjFiM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmgKQEAgLTMwLDggKzMwLDYgQEAKICNpZm5kZWYgX19NQUNIX0JGNTYxX0hfXwogI2RlZmluZSBfX01BQ0hfQkY1NjFfSF9fCiAKLSNkZWZpbmUgU1VQUE9SVEVEX1JFVklECQkweDMKLQogI2RlZmluZSBPRkZTRVRfKHgpICgoeCkgJiAweDAwMDBGRkZGKQogCiAvKnNvbWUgbWlzYyBkZWZpbmVzKi8KQEAgLTIxMywxMSArMjExLDExIEBACiAKICNpZmRlZiBDT05GSUdfQkY1NjEKICNkZWZpbmUgQ1BVICJCRjU2MSIKLSNkZWZpbmUgQ1BVSUQgMHgwMjdiYjAwMAorI2RlZmluZSBDUFVJRCAweDI3YmIKICNlbmRpZgorCiAjaWZuZGVmIENQVQotI2RlZmluZSBDUFUgIlVOS05PV04iCi0jZGVmaW5lIENQVUlEIDB4MAorI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1NjFfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggOGFhMDI3OC4uMDQzYmZjZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC02OSw2ICs2OSw4IEBACiAjIGVuZGlmCiAjZW5kaWYKIAorI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKKwogc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewogICAgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICAgICAgICBwb3J0OwogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBvbGRfc3RhdHVzOwpAQCAtODMsNyArODUsNyBAQAogCXVuc2lnbmVkIGludAkJcnhfZG1hX2NoYW5uZWw7CiAJc3RydWN0IHdvcmtfc3RydWN0CXR4X2RtYV93b3JrcXVldWU7CiAjZWxzZQotIyBpZiBBTk9NQUxZXzA1MDAwMjMwCisjIGlmIEFOT01BTFlfMDUwMDAzNjMKIAl1bnNpZ25lZCBpbnQgYW5vbWFseV90aHJlc2hvbGQ7CiAjIGVuZGlmCiAjZW5kaWYKQEAgLTExMSw3ICsxMTMsNiBAQAogCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7CiB9CiAKLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IGJmaW5fc2VyaWFsX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107CiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xNDIsNyArMTQzLDYgQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgogCi1pbnQgbnJfcG9ydHMgPSBCRklOX1VBUlRfTlJfUE9SVFM7CiBzdGF0aWMgdm9pZCBiZmluX3NlcmlhbF9od19pbml0KHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQogewogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAl9CiAJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkgewogCQlncGlvX3JlcXVlc3QodWFydC0+cnRzX3BpbiwgRFJJVkVSX05BTUUpOwotCQlncGlvX2RpcmVjdGlvbl9pbnB1dCh1YXJ0LT5ydHNfcGluLCAwKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVhcnQtPnJ0c19waW4sIDApOwogCX0KICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCBjMjZkODQ4Li5mMWQ0YzA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMzUsOSArMzUsMTYgQEAKIC8qIE1lbW9yeSBNYXAgZm9yIEFEU1AtQkY1NjEgcHJvY2Vzc29ycyAqLwogCiAjaWZkZWYgQ09ORklHX0JGNTYxCi0jZGVmaW5lIEwxX0NPREVfU1RBUlQgICAgIDB4RkZBMDAwMDAKLSNkZWZpbmUgTDFfREFUQV9BX1NUQVJUICAgICAweEZGODAwMDAwCi0jZGVmaW5lIEwxX0RBVEFfQl9TVEFSVCAgICAgMHhGRjkwMDAwMAorI2RlZmluZSBDT1JFQV9MMV9DT0RFX1NUQVJUICAgICAgIDB4RkZBMDAwMDAKKyNkZWZpbmUgQ09SRUFfTDFfREFUQV9BX1NUQVJUICAgICAweEZGODAwMDAwCisjZGVmaW5lIENPUkVBX0wxX0RBVEFfQl9TVEFSVCAgICAgMHhGRjkwMDAwMAorI2RlZmluZSBDT1JFQl9MMV9DT0RFX1NUQVJUICAgICAgIDB4RkY2MDAwMDAKKyNkZWZpbmUgQ09SRUJfTDFfREFUQV9BX1NUQVJUICAgICAweEZGNDAwMDAwCisjZGVmaW5lIENPUkVCX0wxX0RBVEFfQl9TVEFSVCAgICAgMHhGRjUwMDAwMAorCisjZGVmaW5lIEwxX0NPREVfU1RBUlQgICAgICAgQ09SRUFfTDFfQ09ERV9TVEFSVAorI2RlZmluZSBMMV9EQVRBX0FfU1RBUlQgICAgIENPUkVBX0wxX0RBVEFfQV9TVEFSVAorI2RlZmluZSBMMV9EQVRBX0JfU1RBUlQgICAgIENPUkVBX0wxX0RBVEFfQl9TVEFSVAogCiAjZGVmaW5lIEwxX0NPREVfTEVOR1RIICAgICAgMHg0MDAwCiAKQEAgLTcyLDcgKzc5LDEwIEBACiAKIC8qIFNjcmF0Y2ggUGFkIE1lbW9yeSAqLwogCi0jZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAorI2RlZmluZSBDT1JFQV9MMV9TQ1JBVENIX1NUQVJUCTB4RkZCMDAwMDAKKyNkZWZpbmUgQ09SRUJfTDFfU0NSQVRDSF9TVEFSVAkweEZGNzAwMDAwCisKKyNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAlDT1JFQV9MMV9TQ1JBVENIX1NUQVJUCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTMzX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMKaW5kZXggODVmOGM3OS4uZGI1MzIxOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUwpAQCAtMSwxNDggKzEsOTEgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIExHIFNvZnQgSW5kaWEKKyAqIEJsYWNrZmluIGNhY2hlIGNvbnRyb2wgY29kZQogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIGNhY2hlIGNvbnRyb2wgc3VwcG9ydAorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgorICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vY3BsYi5oPgotI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC50ZXh0CiAKLS8qCi0gKiBibGFja2Zpbl9jYWNoZV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQotICogSW52YWxpZGF0ZSBhbGwgY2FjaGUgbGluZXMgYXNzb2NvaWF0ZWQgd2l0aCB0aGlzCi0gKiBhcmVhIG9mIG1lbW9yeS4KKy8qIFNpbmNlIGFsbCBMMSBjYWNoZXMgd29yayB0aGUgc2FtZSB3YXksIHdlIHVzZSB0aGUgc2FtZSBtZXRob2QgZm9yIGZsdXNoaW5nCisgKiB0aGVtLiAgT25seSB0aGUgYWN0dWFsIGZsdXNoIGluc3RydWN0aW9uIGRpZmZlcnMuICBXZSB3cml0ZSB0aGlzIGluIGFzbSBhcworICogR0NDIGNhbiBiZSBoYXJkIHRvIGNvYXggaW50byB3cml0aW5nIG5pY2UgaGFyZHdhcmUgbG9vcHMuCiAgKgotICogc3RhcnQ6CVN0YXJ0IGFkZHJlc3MKLSAqIGVuZDoJCUVuZCBhZGRyZXNzCisgKiBBbHNvLCB3ZSBhc3N1bWUgdGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXR1cDoKKyAqIFIwID0gc3RhcnQgYWRkcmVzcworICogUjEgPSBlbmQgYWRkcmVzcwogICovCi1FTlRSWShfYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKQorLm1hY3JvIGRvX2ZsdXNoIGZsdXNoaW5zOnJlcSBvcHRmbHVzaGlucyBvcHRub3BpbnMgbGFiZWwKKworCS8qIGVuZCA9ICgoZW5kIC0gMSkgJiAtTDFfQ0FDSEVfQllURVMpICsgTDFfQ0FDSEVfQllURVM7ICovCisJUjEgKz0gLTE7CiAJUjIgPSAtTDFfQ0FDSEVfQllURVM7Ci0JUjIgPSBSMCAmIFIyOwotCVAwID0gUjI7Ci0JUDEgPSBSMTsKLQlDU1lOQyhSMyk7Ci0JSUZMVVNIIFtQMF07CisJUjEgPSBSMSAmIFIyOworCVIxICs9IEwxX0NBQ0hFX0JZVEVTOworCisJLyogY291bnQgPSAoZW5kIC0gc3RhcnQpID4+IEwxX0NBQ0hFX1NISUZUICovCisJUjIgPSBSMSAtIFIwOworCVIyID4+PSBMMV9DQUNIRV9TSElGVDsKKwlQMSA9IFIyOworCisuaWZuYiBcbGFiZWwKK1xsYWJlbCA6CisuZW5kaWYKKwlQMCA9IFIwOworCUxTRVRVUCAoMWYsIDJmKSBMQzEgPSBQMTsKIDE6Ci0JSUZMVVNIIFtQMCsrXTsKLQlDQyA9IFAwIDwgUDEgKGl1KTsKLQlJRiBDQyBKVU1QIDFiIChicCk7Ci0JSUZMVVNIIFtQMF07Ci0JU1NZTkMoUjMpOworLmlmbmIgXG9wdGZsdXNoaW5zCisJXG9wdGZsdXNoaW5zIFtQMF07CisuZW5kaWYKKy5pZmIgXG9wdG5vcGlucworMjoKKy5lbmRpZgorCVxmbHVzaGlucyBbUDArK107CisuaWZuYiBcb3B0bm9waW5zCisyOiBcb3B0bm9waW5zOworLmVuZGlmCisKIAlSVFM7CisuZW5kbQorCisvKiBJbnZhbGlkYXRlIGFsbCBpbnN0cnVjdGlvbiBjYWNoZSBsaW5lcyBhc3NvY29pYXRlZCB3aXRoIHRoaXMgbWVtb3J5IGFyZWEgKi8KK0VOVFJZKF9ibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UpCisJZG9fZmx1c2ggSUZMVVNILCAsIG5vcAogRU5EUFJPQyhfYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKQogCi0vKgotICogYmxhY2tmaW5faWNhY2hlX2RjYWNoZV9mbHVzaF9yYW5nZShzdGFydCwgZW5kKQotICogRkxVU0ggYWxsIGNhY2hlIGxpbmVzIGFzc29jb2lhdGVkIHdpdGggdGhpcwotICogYXJlYSBvZiBtZW1vcnkuCi0gKgotICogc3RhcnQ6CVN0YXJ0IGFkZHJlc3MKLSAqIGVuZDoJCUVuZCBhZGRyZXNzCi0gKi8KLQorLyogRmx1c2ggYWxsIGNhY2hlIGxpbmVzIGFzc29jb2lhdGVkIHdpdGggdGhpcyBhcmVhIG9mIG1lbW9yeS4gKi8KIEVOVFJZKF9ibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKQotCVIyID0gLUwxX0NBQ0hFX0JZVEVTOwotCVIyID0gUjAgJiBSMjsKLQlQMCA9IFIyOwotCVAxID0gUjE7Ci0JQ1NZTkMoUjMpOwotCUlGTFVTSCBbUDBdOwotMToKLQlGTFVTSCBbUDBdOwotCUlGTFVTSCBbUDArK107Ci0JQ0MgPSBQMCA8IFAxIChpdSk7Ci0JSUYgQ0MgSlVNUCAxYiAoYnApOwotCUlGTFVTSCBbUDBdOwotCUZMVVNIIFtQMF07Ci0JU1NZTkMoUjMpOwotCVJUUzsKKwlkb19mbHVzaCBJRkxVU0gsIEZMVVNICiBFTkRQUk9DKF9ibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKQogCiAvKiBUaHJvdyBhd2F5IGFsbCBELWNhY2hlZCBkYXRhIGluIHNwZWNpZmllZCByZWdpb24gd2l0aG91dCBhbnkgb2JsaWdhdGlvbiB0bwotICogd3JpdGUgdGhlbSBiYWNrLiBIb3dldmVyLCB3ZSBtdXN0IGNsZWFuIHRoZSBELWNhY2hlZCBlbnRyaWVzIGFyb3VuZCB0aGUKLSAqIGJvdW5kYXJpZXMgb2YgdGhlIHN0YXJ0IGFuZC9vciBlbmQgYWRkcmVzcyBpcyBub3QgY2FjaGUgYWxpZ25lZC4KLSAqCi0gKiBTdGFydDogc3RhcnQgYWRkcmVzcywKLSAqIGVuZCAgOiBlbmQgYWRkcmVzcy4KKyAqIHdyaXRlIHRoZW0gYmFjay4gIFNpbmNlIHRoZSBCbGFja2ZpbiBJU0EgZG9lcyBub3QgaGF2ZSBhbiAiaW52YWxpZGF0ZSIKKyAqIGluc3RydWN0aW9uLCB3ZSB1c2UgZmx1c2gvaW52YWxpZGF0ZS4gIFBlcmhhcHMgYXMgYSBzcGVlZCBvcHRpbWl6YXRpb24gd2UKKyAqIGNvdWxkIGJhbmcgb24gdGhlIERURVNUIE1NUnMgLi4uCiAgKi8KLQogRU5UUlkoX2JsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKQotCVIyID0gLUwxX0NBQ0hFX0JZVEVTOwotCVIyID0gUjAgJiBSMjsKLQlQMCA9IFIyOwotCVAxID0gUjE7Ci0JQ1NZTkMoUjMpOwotCUZMVVNISU5WW1AwXTsKLTE6Ci0JRkxVU0hJTlZbUDArK107Ci0JQ0MgPSBQMCA8IFAxIChpdSk7Ci0JSUYgQ0MgSlVNUCAxYiAoYnApOwotCi0JLyogSWYgdGhlIGRhdGEgY3Jvc3NlcyBhIGNhY2hlIGxpbmUsIHRoZW4gd2UnbGwgYmUgcG9pbnRpbmcgdG8KLQkgKiB0aGUgbGFzdCBjYWNoZSBsaW5lLCBidXQgd29uJ3QgaGF2ZSBmbHVzaGVkL2ludmFsaWRhdGVkIGl0IHlldCwKLQkgKiBzbyBkbyBvbmUgbW9yZS4KLQkgKi8KLQlGTFVTSElOVltQMF07Ci0JU1NZTkMoUjMpOwotCVJUUzsKKwlkb19mbHVzaCBGTFVTSElOVgogRU5EUFJPQyhfYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UpCiAKKy8qIEZsdXNoIGFsbCBkYXRhIGNhY2hlIGxpbmVzIGFzc29jb2lhdGVkIHdpdGggdGhpcyBtZW1vcnkgYXJlYSAqLwogRU5UUlkoX2JsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSkKLQlSMiA9IC1MMV9DQUNIRV9CWVRFUzsKLQlSMiA9IFIwICYgUjI7Ci0JUDAgPSBSMjsKLQlQMSA9IFIxOwotCUNTWU5DKFIzKTsKLQlGTFVTSFtQMF07Ci0xOgotCUZMVVNIW1AwKytdOwotCUNDID0gUDAgPCBQMSAoaXUpOwotCUlGIENDIEpVTVAgMWIgKGJwKTsKLQotCS8qIElmIHRoZSBkYXRhIGNyb3NzZXMgYSBjYWNoZSBsaW5lLCB0aGVuIHdlJ2xsIGJlIHBvaW50aW5nIHRvCi0JICogdGhlIGxhc3QgY2FjaGUgbGluZSwgYnV0IHdvbid0IGhhdmUgZmx1c2hlZCBpdCB5ZXQsIHNvIGRvCi0JICogb25lIG1vcmUuCi0JICovCi0JRkxVU0hbUDBdOwotCVNTWU5DKFIzKTsKLQlSVFM7CisJZG9fZmx1c2ggRkxVU0gsICwgLCAuTGRmcgogRU5EUFJPQyhfYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKQogCisvKiBPdXIgaGVhZGVycyBjb252ZXJ0IHRoZSBwYWdlIHN0cnVjdHVyZSB0byBhbiBhZGRyZXNzLCBzbyBqdXN0IG5lZWQgdG8gZmx1c2gKKyAqIGl0cyBjb250ZW50cyBsaWtlIG5vcm1hbC4gIFdlIGtub3cgdGhlIHN0YXJ0IGFkZHJlc3MgaXMgcGFnZSBhbGlnbmVkICh3aGljaAorICogZ3JlYXRlciB0aGFuIG91ciBjYWNoZSBhbGlnbm1lbnQpLCBhcyBpcyB0aGUgZW5kIGFkZHJlc3MuICBTbyBqdXN0IGp1bXAgaW50bworICogdGhlIG1pZGRsZSBvZiB0aGUgZGNhY2hlIGZsdXNoIGZ1bmN0aW9uLgorICovCiBFTlRSWShfYmxhY2tmaW5fZGZsdXNoX3BhZ2UpCiAJUDEgPSAxIDw8IChQQUdFX1NISUZUIC0gTDFfQ0FDSEVfU0hJRlQpOwotCVAwID0gUjA7Ci0JQ1NZTkMoUjMpOwotCUZMVVNIW1AwXTsKLQlMU0VUVVAgKC5MZmwxLCAuTGZsMSkgTEMwID0gUDE7Ci0uTGZsMToJRkxVU0ggW1AwKytdOwotCVNTWU5DKFIzKTsKLQlSVFM7CisJanVtcCAuTGRmcjsKIEVORFBST0MoX2JsYWNrZmluX2RmbHVzaF9wYWdlKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwppbmRleCA3NWNkYWQyLi5jMjJjNDdiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwpAQCAtMTU4LDggKzE1OCw2IEBACiAJCQkJCQkgZHBtX3N0YXRlX3RhYmxlW2luZGV4XS50c2NhbGUpOwogCX0KIAotCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7Ci0KIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gKGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpIC8gKHNjbGsgLyAxMDAwMDAwKSkgKiAxMDAwOwogCS8qTm93ICxvbmx5IHN1cHBvcnQgb25lIGNwdSAqLwogCXBvbGljeS0+Y3VyID0gY2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwppbmRleCA4NDdjMTcyLi5jMTNmYThkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCkBAIC0xMjksNiArMTI5LDE4IEBACiAjZWxzZQogCWNhbGwgX19jcGxiX2hkcjsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJLyogV2hpbGUgd2Ugd2VyZSBwcm9jZXNzaW5nIHRoaXMsIGRpZCB3ZSBkb3VibGUgZmF1bHQ/ICovCisJcjcgPSBTRVFTVEFUOyAgICAgICAgICAgLyogcmVhc29uIGNvZGUgaXMgaW4gYml0IDU6MCAqLworCXI2LmwgPSBsbyhTRVFTVEFUX0VYQ0FVU0UpOworCXI2LmggPSBoaShTRVFTVEFUX0VYQ0FVU0UpOworCXI3ID0gcjcgJiByNjsKKwlyNiA9IDB4MjU7CisJQ0MgPSBSNyA9PSBSNjsKKwlpZiBDQyBKVU1QIF9kb3VibGVfZmF1bHQ7CisjZW5kaWYKKwogCURFQlVHX0hXVFJBQ0VfUkVTVE9SRShwNSwgcjcpCiAJUkVTVE9SRV9BTExfU1lTCiAJU1AgPSBFWF9TQ1JBVENIX1JFRzsKQEAgLTEzNiwxMSArMTQ4LDggQEAKIEVORFBST0MoX2V4X2ljcGxiX21pc3MpCiAKIEVOVFJZKF9leF9zeXNjYWxsKQotCShSNzo2LFA1OjQpID0gW3NwKytdOwotCUFTVEFUID0gW3NwKytdOwogCXJhaXNlIDE1OwkJLyogaW52b2tlZCBieSBUUkFQICMwLCBmb3Igc3lzIGNhbGwgKi8KLQlzcCA9IEVYX1NDUkFUQ0hfUkVHOwotCXJ0eAorCWp1bXAucyBfYmZpbl9yZXR1cm5fZnJvbV9leGNlcHRpb247CiBFTkRQUk9DKF9leF9zeXNjYWxsKQogCiBFTlRSWShfZXhfc29mdF9icCkKQEAgLTE4MSw4ICsxOTAsOCBAQAogCWlmIGNjIGp1bXAgLkxmaW5kX3ByaW9yaXR5X2RvbmU7CiAJanVtcC5zIC5MZmluZF9wcmlvcml0eV9zdGFydDsKIC5MZmluZF9wcmlvcml0eV9kb25lOgotCXA0LmwgPSBfZGVidWdnZXJfc3RlcDsKLQlwNC5oID0gX2RlYnVnZ2VyX3N0ZXA7CisJcDQubCA9IF9rZ2RiX3NpbmdsZV9zdGVwOworCXA0LmggPSBfa2dkYl9zaW5nbGVfc3RlcDsKIAlyNiA9IFtwNF07CiAJY2MgPSByNiA9PSAwOwogCWlmIGNjIGp1bXAgLkxkb19zaW5nbGVfc3RlcDsKQEAgLTI1MCw2ICsyNTksMjkgQEAKIAlSNz1MQzE7CiAJTEMxPVI3OwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkvKiBXaGlsZSB3ZSB3ZXJlIHByb2Nlc3NpbmcgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLAorCSAqIGRpZCB3ZSBjYXVzZSBhbm90aGVyLCBhbmQgZG91YmxlIGZhdWx0PworCSAqLworCXI3ID0gU0VRU1RBVDsgICAgICAgICAgIC8qIHJlYXNvbiBjb2RlIGlzIGluIGJpdCA1OjAgKi8KKwlyNi5sID0gbG8oU0VRU1RBVF9FWENBVVNFKTsKKwlyNi5oID0gaGkoU0VRU1RBVF9FWENBVVNFKTsKKwlyNyA9IHI3ICYgcjY7CisJcjYgPSAweDI1OworCUNDID0gUjcgPT0gUjY7CisJaWYgQ0MgSlVNUCBfZG91YmxlX2ZhdWx0OworCisJLyogRGlkIHdlIGNhdXNlIGEgSFcgZXJyb3I/ICovCisJcDUubCA9IGxvKElMQVQpOworCXA1LmggPSBoaShJTEFUKTsKKwlyNiA9IFtwNV07CisJcjcgPSAweDIwOwkJLyogRGlkIEkganVzdCBjYXVzZSBhbnRoZXIgSFcgZXJyb3I/ICovCisJcjcgPSByNyAmIHIxOworCUNDID0gUjcgPT0gUjY7CisJaWYgQ0MgSlVNUCBfZG91YmxlX2ZhdWx0OworI2VuZGlmCisKIAkoUjc6NixQNTo0KSA9IFtzcCsrXTsKIAlBU1RBVCA9IFtzcCsrXTsKIAlzcCA9IEVYX1NDUkFUQ0hfUkVHOwpAQCAtMjkyLDYgKzMyNCwxNCBAQAogCVtwNF0gPSBwNTsKIAljc3luYzsKIAorI2lmbmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkvKgorCSAqIFNhdmUgdGhlc2UgcmVnaXN0ZXJzLCBhcyB0aGV5IGFyZSBvbmx5IHZhbGlkIGluIGV4Y2VwdGlvbiBjb250ZXh0CisJICogICh3aGVyZSB3ZSBhcmUgbm93IC0gYXMgc29vbiBhcyB3ZSBkZWZlciB0byBJUlE1LCB0aGV5IGNhbiBjaGFuZ2UpCisJICogRENQTEJfU1RBVFVTIGFuZCBJQ1BMQl9TVEFUVVMgYXJlIGFsc28gb25seSB2YWxpZCBpbiBFVlQzLAorCSAqIGJ1dCB0aGV5IGFyZSBub3QgdmVyeSBpbnRlcmVzdGluZywgc28gZG9uJ3Qgc2F2ZSB0aGVtCisJICovCisKIAlwNC5sID0gbG8oRENQTEJfRkFVTFRfQUREUik7CiAJcDQuaCA9IGhpKERDUExCX0ZBVUxUX0FERFIpOwogCXI3ID0gW3A0XTsKQEAgLTMwNCwxMiArMzQ0LDExIEBACiAJcDUubCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwogCVtwNV0gPSByNzsKIAotCXA0LmwgPSBfZXhjcHRfc2F2ZWRfc3R1ZmY7Ci0JcDQuaCA9IF9leGNwdF9zYXZlZF9zdHVmZjsKLQogCXI2ID0gcmV0eDsKKwlwNC5sID0gX3NhdmVkX3JldHg7CisJcDQuaCA9IF9zYXZlZF9yZXR4OwogCVtwNF0gPSByNjsKLQorI2VuZGlmCiAJcjYgPSBTWVNDRkc7CiAJW3A0ICsgNF0gPSByNjsKIAlCSVRDTFIocjYsIDApOwpAQCAtMzI3LDU5ICszNjYsNTYgQEAKIAlyNiA9IDB4M2Y7CiAJc3RpIHI2OwogCi0JKFI3OjYsUDU6NCkgPSBbc3ArK107Ci0JQVNUQVQgPSBbc3ArK107Ci0JU1AgPSBFWF9TQ1JBVENIX1JFRzsKIAlyYWlzZSA1OwotCXJ0eDsKKwlqdW1wLnMgX2JmaW5fcmV0dXJuX2Zyb21fZXhjZXB0aW9uOwogRU5EUFJPQyhfZXhfdHJhcF9jKQogCiAvKiBXZSBqdXN0IHJlYWxpemVkIHdlIGdvdCBhbiBleGNlcHRpb24sIHdoaWxlIHdlIHdlcmUgcHJvY2Vzc2luZyBhIGRpZmZlcmVudAogICogZXhjZXB0aW9uLiBUaGlzIGlzIGEgdW5yZWNvdmVyYWJsZSBldmVudCwgc28gY3Jhc2gKICAqLwogRU5UUlkoX2RvdWJsZV9mYXVsdCkKLSAgICAgICAgLyogVHVybiBjYWNoZXMgJiBwcm90ZWN0aW9uIG9mZiwgdG8gZW5zdXJlIHdlIGRvbid0IGdldCBhbnkgbW9yZQotICAgICAgICAgKiBkb3VibGUgZXhjZXB0aW9ucwotICAgICAgICAgKi8KKwkvKiBUdXJuIGNhY2hlcyAmIHByb3RlY3Rpb24gb2ZmLCB0byBlbnN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBtb3JlCisJICogZG91YmxlIGV4Y2VwdGlvbnMKKwkgKi8KIAotICAgICAgICBQNC5MID0gTE8oSU1FTV9DT05UUk9MKTsKLSAgICAgICAgUDQuSCA9IEhJKElNRU1fQ09OVFJPTCk7CisJUDQuTCA9IExPKElNRU1fQ09OVFJPTCk7CisJUDQuSCA9IEhJKElNRU1fQ09OVFJPTCk7CiAKLSAgICAgICAgUjUgPSBbUDRdOyAgICAgICAgICAgICAgLyogQ29udHJvbCBSZWdpc3RlciovCi0gICAgICAgIEJJVENMUihSNSxFTklDUExCX1ApOwotICAgICAgICBTU1lOQzsgICAgICAgICAgLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gSU1FTV9DT05UUk9MLiAqLwotICAgICAgICAuYWxpZ24gODsKLSAgICAgICAgW1A0XSA9IFI1OwotICAgICAgICBTU1lOQzsKKwlSNSA9IFtQNF07ICAgICAgICAgICAgICAvKiBDb250cm9sIFJlZ2lzdGVyKi8KKwlCSVRDTFIoUjUsRU5JQ1BMQl9QKTsKKwlTU1lOQzsgICAgICAgICAgLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gSU1FTV9DT05UUk9MLiAqLworCS5hbGlnbiA4OworCVtQNF0gPSBSNTsKKwlTU1lOQzsKIAotICAgICAgICBQNC5MID0gTE8oRE1FTV9DT05UUk9MKTsKLSAgICAgICAgUDQuSCA9IEhJKERNRU1fQ09OVFJPTCk7Ci0gICAgICAgIFI1ID0gW1A0XTsKLSAgICAgICAgQklUQ0xSKFI1LEVORENQTEJfUCk7Ci0gICAgICAgIFNTWU5DOyAgICAgICAgICAvKiBTU1lOQyByZXF1aXJlZCBiZWZvcmUgd3JpdGluZyB0byBETUVNX0NPTlRST0wuICovCi0gICAgICAgIC5hbGlnbiA4OwotICAgICAgICBbUDRdID0gUjU7Ci0gICAgICAgIFNTWU5DOworCVA0LkwgPSBMTyhETUVNX0NPTlRST0wpOworCVA0LkggPSBISShETUVNX0NPTlRST0wpOworCVI1ID0gW1A0XTsKKwlCSVRDTFIoUjUsRU5EQ1BMQl9QKTsKKwlTU1lOQzsgICAgICAgICAgLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gRE1FTV9DT05UUk9MLiAqLworCS5hbGlnbiA4OworCVtQNF0gPSBSNTsKKwlTU1lOQzsKIAotICAgICAgICAvKiBGaXggdXAgdGhlIHN0YWNrICovCi0gICAgICAgIChSNzo2LFA1OjQpID0gW3NwKytdOwotICAgICAgICBBU1RBVCA9IFtzcCsrXTsKLSAgICAgICAgU1AgPSBFWF9TQ1JBVENIX1JFRzsKKwkvKiBGaXggdXAgdGhlIHN0YWNrICovCisJKFI3OjYsUDU6NCkgPSBbc3ArK107CisJQVNUQVQgPSBbc3ArK107CisJU1AgPSBFWF9TQ1JBVENIX1JFRzsKIAotICAgICAgICAvKiBXZSBzaG91bGQgYmUgb3V0IG9mIHRoZSBleGNlcHRpb24gc3RhY2ssIGFuZCBiYWNrIGRvd24gaW50bwotICAgICAgICAgKiBrZXJuZWwgb3IgdXNlciBzcGFjZSBzdGFjawotICAgICAgICAgKi8KLSAgICAgICAgU0FWRV9BTExfU1lTCisJLyogV2Ugc2hvdWxkIGJlIG91dCBvZiB0aGUgZXhjZXB0aW9uIHN0YWNrLCBhbmQgYmFjayBkb3duIGludG8KKwkgKiBrZXJuZWwgb3IgdXNlciBzcGFjZSBzdGFjaworCSAqLworCVNBVkVfQUxMX1NZUwogCiAJLyogVGhlIGR1bXBpbmcgZnVuY3Rpb25zIGV4cGVjdCB0aGUgcmV0dXJuIGFkZHJlc3MgaW4gdGhlIFJFVEkKIAkgKiBzbG90LiAgKi8KIAlyNiA9IHJldHg7CiAJW3NwICsgUFRfUENdID0gcjY7CiAKLSAgICAgICAgcjAgPSBzcDsgICAgICAgIC8qIHN0YWNrIGZyYW1lIHB0X3JlZ3MgcG9pbnRlciBhcmd1bWVudCA9PT4gcjAgKi8KLSAgICAgICAgU1AgKz0gLTEyOwotICAgICAgICBjYWxsIF9kb3VibGVfZmF1bHRfYzsKLSAgICAgICAgU1AgKz0gMTI7CisJcjAgPSBzcDsgICAgICAgIC8qIHN0YWNrIGZyYW1lIHB0X3JlZ3MgcG9pbnRlciBhcmd1bWVudCA9PT4gcjAgKi8KKwlTUCArPSAtMTI7CisJY2FsbCBfZG91YmxlX2ZhdWx0X2M7CisJU1AgKz0gMTI7CiAuTF9kb3VibGVfZmF1bHRfcGFuaWM6CiAgICAgICAgIEpVTVAgLkxfZG91YmxlX2ZhdWx0X3BhbmljCiAKQEAgLTM4OCw4ICs0MjQsOCBAQAogRU5UUlkoX2V4Y2VwdGlvbl90b19sZXZlbDUpCiAJU0FWRV9BTExfU1lTCiAKLQlwNC5sID0gX2V4Y3B0X3NhdmVkX3N0dWZmOwotCXA0LmggPSBfZXhjcHRfc2F2ZWRfc3R1ZmY7CisJcDQubCA9IF9zYXZlZF9yZXR4OworCXA0LmggPSBfc2F2ZWRfcmV0eDsKIAlyNiA9IFtwNF07CiAJW3NwICsgUFRfUENdID0gcjY7CiAKQEAgLTQyMCw2ICs0NTYsMTcgQEAKIAljYWxsIF90cmFwX2M7CiAJU1AgKz0gMTI7CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkvKiBHcmFiIElMQVQgKi8KKwlwMi5sID0gbG8oSUxBVCk7CisJcDIuaCA9IGhpKElMQVQpOworCXIwID0gW3AyXTsKKwlyMSA9IDB4MjA7ICAvKiBEaWQgSSBqdXN0IGNhdXNlIGFudGhlciBIVyBlcnJvcj8gKi8KKwlyMCA9IHIwICYgcjE7CisJQ0MgPSBSMCA9PSBSMTsKKwlpZiBDQyBKVU1QIF9kb3VibGVfZmF1bHQ7CisjZW5kaWYKKwogCWNhbGwgX3JldF9mcm9tX2V4Y2VwdGlvbjsKIAlSRVNUT1JFX0FMTF9TWVMKIAlydGk7CkBAIC00MzYsNyArNDgzLDQ4IEBACiAJLyogVHJ5IHRvIGRlYWwgd2l0aCBzeXNjYWxscyBxdWlja2x5LiAgKi8KIAlbLS1zcF0gPSBBU1RBVDsKIAlbLS1zcF0gPSAoUjc6NixQNTo0KTsKKworI2lmIEFOT01BTFlfMDUwMDAyODMgfHwgQU5PTUFMWV8wNTAwMDMxNQorCWNjID0gcjcgPT0gcjc7CisJcDUuaCA9IEhJKENISVBJRCk7CisJcDUubCA9IExPKENISVBJRCk7CisJaWYgY2MganVtcCAxZjsKKwlyNy5sID0gV1twNV07CisxOgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkvKgorCSAqIFNhdmUgdGhlc2UgcmVnaXN0ZXJzLCBhcyB0aGV5IGFyZSBvbmx5IHZhbGlkIGluIGV4Y2VwdGlvbiBjb250ZXh0CisJICogKHdoZXJlIHdlIGFyZSBub3cgLSBhcyBzb29uIGFzIHdlIGRlZmVyIHRvIElSUTUsIHRoZXkgY2FuIGNoYW5nZSkKKwkgKiBEQ1BMQl9TVEFUVVMgYW5kIElDUExCX1NUQVRVUyBhcmUgYWxzbyBvbmx5IHZhbGlkIGluIEVWVDMsCisJICogYnV0IHRoZXkgYXJlIG5vdCB2ZXJ5IGludGVyZXN0aW5nLCBzbyBkb24ndCBzYXZlIHRoZW0KKwkgKi8KKworCXA0LmwgPSBsbyhEQ1BMQl9GQVVMVF9BRERSKTsKKwlwNC5oID0gaGkoRENQTEJfRkFVTFRfQUREUik7CisJcjcgPSBbcDRdOworCXA1LmggPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKKwlwNS5sID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7CisJW3A1XSA9IHI3OworCisJcjcgPSBbcDQgKyAoSUNQTEJfRkFVTFRfQUREUiAtIERDUExCX0ZBVUxUX0FERFIpXTsKKwlwNS5oID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7CisJcDUubCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOworCVtwNV0gPSByNzsKKworCXA0LmwgPSBfc2F2ZWRfcmV0eDsKKwlwNC5oID0gX3NhdmVkX3JldHg7CisJcjYgPSByZXR4OworCVtwNF0gPSByNjsKKwogCXI3ID0gU0VRU1RBVDsJCS8qIHJlYXNvbiBjb2RlIGlzIGluIGJpdCA1OjAgKi8KKwlwNC5sID0gX3NhdmVkX3NlcXN0YXQ7CisJcDQuaCA9IF9zYXZlZF9zZXFzdGF0OworCVtwNF0gPSByNzsKKyNlbHNlCisJcjcgPSBTRVFTVEFUOyAgICAgICAgICAgLyogcmVhc29uIGNvZGUgaXMgaW4gYml0IDU6MCAqLworI2VuZGlmCiAJcjYubCA9IGxvKFNFUVNUQVRfRVhDQVVTRSk7CiAJcjYuaCA9IGhpKFNFUVNUQVRfRVhDQVVTRSk7CiAJcjcgPSByNyAmIHI2OwpAQCAtNjE2LDYgKzcwNCw5IEBACiAJcnRzOwogRU5EUFJPQyhfc3lzdGVtX2NhbGwpCiAKKy8qIERvIG5vdCBtYXJrIGFzIEVOVFJZKCkgdG8gYXZvaWQgZXJyb3IgaW4gYXNzZW1ibGVyIC4uLgorICogdGhpcyBzeW1ib2wgbmVlZCBub3QgYmUgZ2xvYmFsIGFueXdheXMsIHNvIC4uLgorICovCiBfc3lzX3RyYWNlOgogCWNhbGwgX3N5c2NhbGxfdHJhY2U7CiAKQEAgLTk0MSw2ICsxMDMyLDE1IEBACiAJU0FWRV9BTExfU1lTCiAJdHJhY2VfYnVmZmVyX3N0b3AocDAscjApOwogCisjaWYgQU5PTUFMWV8wNTAwMDI4MyB8fCBBTk9NQUxZXzA1MDAwMzE1CisJY2MgPSByNSA9PSByNTsKKwlwNC5oID0gSEkoQ0hJUElEKTsKKwlwNC5sID0gTE8oQ0hJUElEKTsKKwlpZiBjYyBqdW1wIDFmOworCXI1LmwgPSBXW3A0XTsKKzE6CisjZW5kaWYKKwogCS8qIFR1cm4gY2FjaGVzIG9mZiwgdG8gZW5zdXJlIHdlIGRvbid0IGdldCBkb3VibGUgZXhjZXB0aW9ucyAqLwogCiAJUDQuTCA9IExPKElNRU1fQ09OVFJPTCk7CkBAIC05OTIsNyArMTA5MiwxMiBAQAogCSAqLwogCS5sb25nIF9leF9zeXNjYWxsICAgICAgIC8qIDB4MDAgLSBVc2VyIERlZmluZWQgLSBMaW51eCBTeXNjYWxsICovCiAJLmxvbmcgX2V4X3NvZnRfYnAgICAgICAgLyogMHgwMSAtIFVzZXIgRGVmaW5lZCAtIFNvZnR3YXJlIGJyZWFrcG9pbnQgKi8KKyNpZmRlZglDT05GSUdfS0dEQgorCS5sb25nIF9leF90cmFwX2MJLyogMHgwMiAtIFVzZXIgRGVmaW5lZCAtIEtHREIgaW5pdGlhbCBjb25uZWN0aW9uCisJCQkJCQkJIGFuZCBicmVhayBzaWduYWwgdHJhcCAqLworI2Vsc2UKIAkubG9uZyBfZXhfcmVwbGFjZWFibGUgICAvKiAweDAyIC0gVXNlciBEZWZpbmVkICovCisjZW5kaWYKIAkubG9uZyBfZXhfdHJhcF9jICAgICAgICAvKiAweDAzIC0gVXNlciBEZWZpbmVkIC0gdXNlcnNwYWNlIHN0YWNrIG92ZXJmbG93ICovCiAJLmxvbmcgX2V4X3RyYXBfYyAgICAgICAgLyogMHgwNCAtIFVzZXIgRGVmaW5lZCAtIGR1bXAgdHJhY2UgYnVmZmVyICovCiAJLmxvbmcgX2V4X3JlcGxhY2VhYmxlICAgLyogMHgwNSAtIFVzZXIgRGVmaW5lZCAqLwpAQCAtMTQzMiwxNSArMTUzNyw3IEBACiAJLnJlcHQgTlJfc3lzY2FsbHMtKC4tX3N5c19jYWxsX3RhYmxlKS80CiAJLmxvbmcgX3N5c19uaV9zeXNjYWxsCiAJLmVuZHIKLQotCS8qCi0JICogVXNlZCB0byBzYXZlIHRoZSByZWFsIFJFVFgsIElNQVNLIGFuZCBTWVNDRkcgd2hlbiB0ZW1wb3JhcmlseQotCSAqIHN0b3Jpbmcgc2FmZSB2YWx1ZXMgYWNyb3NzIHRoZSB0cmFuc2l0aW9uIGZyb20gZXhjZXB0aW9uIHRvIElSUTUuCi0JICovCi1fZXhjcHRfc2F2ZWRfc3R1ZmY6Ci0JLmxvbmcgMDsKLQkubG9uZyAwOwotCS5sb25nIDA7CitFTkQoX3N5c19jYWxsX3RhYmxlKQogCiBfZXhjZXB0aW9uX3N0YWNrOgogCS5yZXB0IDEwMjQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKaW5kZXggMTkxYjRlOS4uZjEyM2E2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKQEAgLTY4LDYgKzY4LDE2IEBACiAJTTIgPSByMDsKIAlNMyA9IHIwOwogCisJLyoKKwkgKiBDbGVhciBJVEVTVF9DT01NQU5EIGFuZCBEVEVTVF9DT01NQU5EIHJlZ2lzdGVycywKKwkgKiBMZWF2aW5nIHRoZXNlIGFzIG5vbi16ZXJvIGNhbiBjb25mdXNlIHRoZSBlbXVsYXRvcgorCSAqLworCXAwLkwgPSBMTyhEVEVTVF9DT01NQU5EKTsKKwlwMC5IID0gSEkoRFRFU1RfQ09NTUFORCk7CisJW3AwXSA9IFIwOworCVtwMCArIChJVEVTVF9DT01NQU5EIC0gRFRFU1RfQ09NTUFORCldID0gUjA7CisJQ1NZTkM7CisKIAl0cmFjZV9idWZmZXJfaW5pdChwMCxyMCk7CiAJUDAgPSBSMTsKIAlSMCA9IFIxOwpAQCAtOTAsMTIgKzEwMCw0NiBAQAogCVtwMF0gPSBSMDsKIAlTU1lOQzsKIAotCS8qIFNhdmUgUkVUWCwgaW4gY2FzZSBvZiBkb3VibGVmYXVsdCAqLwotCXAwLmwgPSBfX19yZXR4OwotCXAwLmggPSBfX19yZXR4OworCS8qIGluIGNhc2Ugb2YgZG91YmxlIGZhdWx0cywgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKwlwMC5sID0gX2luaXRfcmV0eDsKKwlwMC5oID0gX2luaXRfcmV0eDsKIAlSMCA9IFJFVFg7CiAJW1AwXSA9IFIwOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJLyogT25seSBzYXZlIHRoZXNlIGlmIHdlIGFyZSBzdG9yaW5nIHRoZW0sCisJICogVGhpcyBoYXBwZW5zIGhlcmUsIHNpbmNlIEwxIGdldHMgY2xvYmJlcmVkCisJICogYmVsb3cKKwkgKi8KKwlwMC5sID0gX3NhdmVkX3JldHg7CisJcDAuaCA9IF9zYXZlZF9yZXR4OworCXAxLmwgPSBfaW5pdF9zYXZlZF9yZXR4OworCXAxLmggPSBfaW5pdF9zYXZlZF9yZXR4OworCXIwID0gW3AwXTsKKwlbcDFdID0gcjA7CisKKwlwMC5sID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7CisJcDAuaCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOworCXAxLmwgPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOworCXAxLmggPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOworCXIwID0gW3AwXTsKKwlbcDFdID0gcjA7CisKKwlwMC5sID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7CisJcDAuaCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOworCXAxLmwgPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOworCXAxLmggPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOworCXIwID0gW3AwXTsKKwlbcDFdID0gcjA7CisKKwlwMC5sID0gX3NhdmVkX3NlcXN0YXQ7CisJcDAuaCA9IF9zYXZlZF9zZXFzdGF0OworCXAxLmwgPSBfaW5pdF9zYXZlZF9zZXFzdGF0OworCXAxLmggPSBfaW5pdF9zYXZlZF9zZXFzdGF0OworCXIwID0gW3AwXTsKKwlbcDFdID0gcjA7CisjZW5kaWYKKwogCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLwogCXNwLmwgPSBsbyhJTklUSUFMX1NUQUNLKTsKIAlzcC5oID0gaGkoSU5JVElBTF9TVEFDSyk7CkBAIC0xMDcsNyArMTUxLDcgQEAKICNlbmRpZgogCiAJLyogUHV0IFRoZSBDb2RlIGZvciBQTEwgUHJvZ3JhbW1pbmcgYW5kIFNEUkFNIFByb2dyYW1taW5nIGluIEwxIElTUkFNICovCi0JY2FsbCBfYmY1M3hfcmVsb2NhdGVfbDFfbWVtOworCWNhbGwgX2JmaW5fcmVsb2NhdGVfbDFfbWVtOwogI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwogCWNhbGwgX3N0YXJ0X2RtYV9jb2RlOwogI2VuZGlmCkBAIC0xNjIsNiArMjA2LDYwIEBACiAJd1twMF0gPSByMDsKIAlzc3luYzsKIAorI2lmIEwxX0RBVEFfQV9MRU5HVEggPiAwCisJcjEubCA9IF9fc2Jzc19sMTsKKwlyMS5oID0gX19zYnNzX2wxOworCXIyLmwgPSBfX2Vic3NfbDE7CisJcjIuaCA9IF9fZWJzc19sMTsKKwlyMCA9IDAgKHopOworCXIyID0gcjIgLSByMTsKKwljYyA9IHIyID09IDA7CisJaWYgY2MganVtcCAuTF9hX2wxX2RvbmU7CisJcjIgPj49IDI7CisJcDEgPSByMTsKKwlwMiA9IHIyOworCWxzZXR1cCAoLkxfY2xlYXJfYV9sMSwgLkxfY2xlYXJfYV9sMSApIGxjMCA9IHAyOworLkxfY2xlYXJfYV9sMToKKwlbcDErK10gPSByMDsKKy5MX2FfbDFfZG9uZToKKyNlbmRpZgorCisjaWYgTDFfREFUQV9CX0xFTkdUSCA+IDAKKwlyMS5sID0gX19zYnNzX2JfbDE7CisJcjEuaCA9IF9fc2Jzc19iX2wxOworCXIyLmwgPSBfX2Vic3NfYl9sMTsKKwlyMi5oID0gX19lYnNzX2JfbDE7CisJcjAgPSAwICh6KTsKKwlyMiA9IHIyIC0gcjE7CisJY2MgPSByMiA9PSAwOworCWlmIGNjIGp1bXAgLkxfYl9sMV9kb25lOworCXIyID4+PSAyOworCXAxID0gcjE7CisJcDIgPSByMjsKKwlsc2V0dXAgKC5MX2NsZWFyX2JfbDEsIC5MX2NsZWFyX2JfbDEgKSBsYzAgPSBwMjsKKy5MX2NsZWFyX2JfbDE6CisJW3AxKytdID0gcjA7CisuTF9iX2wxX2RvbmU6CisjZW5kaWYKKworI2lmIEwyX0xFTkdUSCA+IDAKKwlyMS5sID0gX19zYnNzX2wyOworCXIxLmggPSBfX3Nic3NfbDI7CisJcjIubCA9IF9fZWJzc19sMjsKKwlyMi5oID0gX19lYnNzX2wyOworCXIwID0gMCAoeik7CisJcjIgPSByMiAtIHIxOworCWNjID0gcjIgPT0gMDsKKwlpZiBjYyBqdW1wIC5MX2wyX2RvbmU7CisJcjIgPj49IDI7CisJcDEgPSByMTsKKwlwMiA9IHIyOworCWxzZXR1cCAoLkxfY2xlYXJfbDIsIC5MX2NsZWFyX2wyICkgbGMwID0gcDI7CisuTF9jbGVhcl9sMjoKKwlbcDErK10gPSByMDsKKy5MX2wyX2RvbmU6CisjZW5kaWYKKwogCS8qIFplcm8gb3V0IHRoZSBic3MgcmVnaW9uCiAJICogTm90ZTogdGhpcyB3aWxsIGZhaWwgaWYgYnNzIGlzIDAgYnl0ZXMgLi4uCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUwppbmRleCBiMjdlNTlkLi40YTJlYzdhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCWZwID0gMDsKICNlbmRpZgogCi0jaWYgQU5PTUFMWV8wNTAwMDI4MworI2lmIEFOT01BTFlfMDUwMDAyODMgfHwgQU5PTUFMWV8wNTAwMDMxNQogCWNjID0gcjcgPT0gcjc7CiAJcDUuaCA9IEhJKENISVBJRCk7CiAJcDUubCA9IExPKENISVBJRCk7CkBAIC0xNzksNyArMTc5LDE2IEBACiAJY2FsbCBfdHJhcF9jOwogCVNQICs9IDEyOwogCisjaWZkZWYgRUJJVV9FUlJNU1QKKwkvKiBtYWtlIHN1cmUgRUJJVV9FUlJNU1QgaXMgY2xlYXIgKi8KKwlwMC5sID0gTE8oRUJJVV9FUlJNU1QpOworCXAwLmggPSBISShFQklVX0VSUk1TVCk7CisJcjAubCA9IChDT1JFX0VSUk9SIHwgQ09SRV9NRVJST1IpOworCXdbcDBdID0gcjAubDsKKyNlbmRpZgorCiAJY2FsbCBfcmV0X2Zyb21fZXhjZXB0aW9uOworCiAuTGNvbW1vbl9yZXN0b3JlX2FsbF9zeXM6CiAJUkVTVE9SRV9BTExfU1lTCiAJcnRpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwppbmRleCA1ZmE1MzY3Mi4uMzRlOGE3MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKQEAgLTI0MywxMiArMjQzLDE0IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2NvcmVfaXJxY2hpcCA9IHsKKwkubmFtZSA9ICJDT1JFIiwKIAkuYWNrID0gYmZpbl9hY2tfbm9vcCwKIAkubWFzayA9IGJmaW5fY29yZV9tYXNrX2lycSwKIAkudW5tYXNrID0gYmZpbl9jb3JlX3VubWFza19pcnEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5faW50ZXJuYWxfaXJxY2hpcCA9IHsKKwkubmFtZSA9ICJJTlROIiwKIAkuYWNrID0gYmZpbl9hY2tfbm9vcCwKIAkubWFzayA9IGJmaW5faW50ZXJuYWxfbWFza19pcnEsCiAJLnVubWFzayA9IGJmaW5faW50ZXJuYWxfdW5tYXNrX2lycSwKQEAgLTI3OCw2ICsyODAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ2VuZXJpY19lcnJvcl9pcnFjaGlwID0geworCS5uYW1lID0gIkVSUk9SIiwKIAkuYWNrID0gYmZpbl9hY2tfbm9vcCwKIAkubWFza19hY2sgPSBiZmluX2dlbmVyaWNfZXJyb3JfbWFza19pcnEsCiAJLm1hc2sgPSBiZmluX2dlbmVyaWNfZXJyb3JfbWFza19pcnEsCkBAIC0zNjEsNiArMzY0LDE0IEBACiB9CiAjZW5kaWYJCQkJLyogQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVggKi8KIAorc3RhdGljIGlubGluZSB2b2lkIGJmaW5fc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkvKiBNYXkgbm90IGNhbGwgZ2VuZXJpYyBzZXRfaXJxX2hhbmRsZXIoKSBkdWUgdG8gc3BpbmxvY2sKKwkgICByZWN1cnNpb24uICovCisJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZTsKK30KKwogI2lmICFkZWZpbmVkKENPTkZJR19CRjU0eCkKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CkBAIC00NzMsOSArNDg0LDkgQEAKIAlTU1lOQygpOwogCiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOworCQliZmluX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJZWxzZQotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJYmZpbl9zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDk1LDYgKzUwNiw3IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKKwkubmFtZSA9ICJHUElPIiwKIAkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCiAJLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCiAJLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKQEAgLTgwNCwxMCArODE2LDEwIEBACiAKIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKIAkJcGludFtiYW5rXS0+ZWRnZV9zZXQgPSBwaW50Yml0OwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOworCQliZmluX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJfSBlbHNlIHsKIAkJcGludFtiYW5rXS0+ZWRnZV9jbGVhciA9IHBpbnRiaXQ7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQliZmluX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCX0KIAogCVNTWU5DKCk7CkBAIC04ODQsNiArODk2LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ3Bpb19pcnFjaGlwID0geworCS5uYW1lID0gIkdQSU8iLAogCS5hY2sgPSBiZmluX2dwaW9fYWNrX2lycSwKIAkubWFzayA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKIAkubWFza19hY2sgPSBiZmluX2dwaW9fbWFza19hY2tfaXJxLApAQCAtMTEzNiw4ICsxMTQ5LDQgQEAKIAkJdmVjID0gaXZnLT5pcnFubzsKIAl9CiAJYXNtX2RvX0lSUSh2ZWMsIGZwKTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0Ja2dkYl9wcm9jZXNzX2JyZWFrcG9pbnQoKTsKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tbS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbW0vTWFrZWZpbGUKaW5kZXggMmE3MjAyYy4uZDQ4OWY4OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21tL01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBhcmNoL2JsYWNrZmluL21tL01ha2VmaWxlCiAjCiAKLW9iai15IDo9IGJsYWNrZmluX3NyYW0ubyBpbml0Lm8KK29iai15IDo9IHNyYW0tYWxsb2MubyBpc3JhbS1kcml2ZXIubyBpbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vYmxhY2tmaW5fc3JhbS5jIGIvYXJjaC9ibGFja2Zpbi9tbS9ibGFja2Zpbl9zcmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWU4ODcuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9ibGFja2Zpbl9zcmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tbS9ibGFja2Zpbl9zcmFtLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFNSQU0gZHJpdmVyIGZvciBCbGFja2ZpbiBBRFNQLUJGNXh4Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSAiYmxhY2tmaW5fc3JhbS5oIgotCi1zdGF0aWMgc3BpbmxvY2tfdCBsMXNyYW1fbG9jaywgbDFfZGF0YV9zcmFtX2xvY2ssIGwxX2luc3Rfc3JhbV9sb2NrOwotc3RhdGljIHNwaW5sb2NrX3QgbDJfc3JhbV9sb2NrOwotCi0vKiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIEwxIHNjcmF0Y2hwYWQgYW5kIERBVEEgU1JBTSAqLwotc3RydWN0IHNyYW1fcGllY2UgewotCXZvaWQgKnBhZGRyOwotCWludCBzaXplOwotCXBpZF90IHBpZDsKLQlzdHJ1Y3Qgc3JhbV9waWVjZSAqbmV4dDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX3NzcmFtX2hlYWQsIHVzZWRfbDFfc3NyYW1faGVhZDsKLQotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkOwotI2VuZGlmCi0KLSNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZDsKLSNlbmRpZgotCi0jaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQ7Ci0jZW5kaWYKLQotI2lmIEwyX0xFTkdUSCAhPSAwCi1zdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMl9zcmFtX2hlYWQsIHVzZWRfbDJfc3JhbV9oZWFkOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3JhbV9waWVjZV9jYWNoZTsKLQotLyogTDEgU2NyYXRjaHBhZCBTUkFNIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBfX2luaXQgbDFzcmFtX2luaXQodm9pZCkKLXsKLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dCA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2wxX3NzcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPIkZhaWwgdG8gaW5pdGlhbGl6ZSBTY3JhdGNocGFkIGRhdGEgU1JBTS5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPnBhZGRyID0gKHZvaWQgKilMMV9TQ1JBVENIX1NUQVJUOwotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5zaXplID0gTDFfU0NSQVRDSF9MRU5HVEg7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9zc3JhbV9oZWFkLm5leHQgPSBOVUxMOwotCi0JLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwotCXNwaW5fbG9ja19pbml0KCZsMXNyYW1fbG9jayk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBTY3JhdGNocGFkIGRhdGEgU1JBTTogJWQgS0JcbiIsCi0JICAgICAgIEwxX1NDUkFUQ0hfTEVOR1RIID4+IDEwKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGwxX2RhdGFfc3JhbV9pbml0KHZvaWQpCi17Ci0jaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyJGYWlsIHRvIGluaXRpYWxpemUgTDEgRGF0YSBBIFNSQU0uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5wYWRkciA9Ci0JCSh2b2lkICopTDFfREFUQV9BX1NUQVJUICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+c2l6ZSA9Ci0JCUwxX0RBVEFfQV9MRU5HVEggLSAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOwotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQSBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwxX0RBVEFfQV9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8iRmFpbCB0byBpbml0aWFsaXplIEwxIERhdGEgQiBTUkFNLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPQotCQkodm9pZCAqKUwxX0RBVEFfQl9TVEFSVCArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5zaXplID0KLQkJTDFfREFUQV9CX0xFTkdUSCAtIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwxX0RBVEFfQl9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKLSNlbmRpZgotCi0JLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwotCXNwaW5fbG9ja19pbml0KCZsMV9kYXRhX3NyYW1fbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBsMV9pbnN0X3NyYW1faW5pdCh2b2lkKQotewotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8iRmFpbCB0byBpbml0aWFsaXplIEwxIEluc3RydWN0aW9uIFNSQU0uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPQotCQkodm9pZCAqKUwxX0NPREVfU1RBUlQgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnNpemUgPQotCQlMMV9DT0RFX0xFTkdUSCAtIChfZXRleHRfbDEgLSBfc3RleHRfbDEpOwotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+cGlkID0gMDsKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9pbnN0X3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIEluc3RydWN0aW9uIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKLQkJTDFfQ09ERV9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7Ci0jZW5kaWYKLQotCS8qIG11dGV4IGluaXRpYWxpemUgKi8KLQlzcGluX2xvY2tfaW5pdCgmbDFfaW5zdF9zcmFtX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbDJfc3JhbV9pbml0KHZvaWQpCi17Ci0jaWYgTDJfTEVOR1RIICE9IDAKLQlmcmVlX2wyX3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDJfc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyJGYWlsIHRvIGluaXRpYWxpemUgTDIgU1JBTS5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZnJlZV9sMl9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPSAodm9pZCAqKUwyX1NUQVJUICsKLQkJKF9ldGV4dF9sMiAtIF9zdGV4dF9sMikgKyAoX2VkYXRhX2wyIC0gX3NkYXRhX2wyKTsKLQlmcmVlX2wyX3NyYW1faGVhZC5uZXh0LT5zaXplID0gTDJfTEVOR1RIIC0KLQkJKF9ldGV4dF9sMiAtIF9zdGV4dF9sMikgKyAoX2VkYXRhX2wyIC0gX3NkYXRhX2wyKTsKLQlmcmVlX2wyX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDJfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMl9zcmFtX2hlYWQubmV4dCA9IE5VTEw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwyX0xFTkdUSCA+PiAxMCwKLQkJZnJlZV9sMl9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7Ci0jZW5kaWYKLQotCS8qIG11dGV4IGluaXRpYWxpemUgKi8KLQlzcGluX2xvY2tfaW5pdCgmbDJfc3JhbV9sb2NrKTsKLX0KLXZvaWQgX19pbml0IGJmaW5fc3JhbV9pbml0KHZvaWQpCi17Ci0Jc3JhbV9waWVjZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzcmFtX3BpZWNlX2NhY2hlIiwKLQkJCQlzaXplb2Yoc3RydWN0IHNyYW1fcGllY2UpLAotCQkJCTAsIFNMQUJfUEFOSUMsIE5VTEwpOwotCi0JbDFzcmFtX2luaXQoKTsKLQlsMV9kYXRhX3NyYW1faW5pdCgpOwotCWwxX2luc3Rfc3JhbV9pbml0KCk7Ci0JbDJfc3JhbV9pbml0KCk7Ci19Ci0KLS8qIFNSQU0gYWxsb2NhdGUgZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkICpfc3JhbV9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCi0JCXN0cnVjdCBzcmFtX3BpZWNlICpwdXNlZF9oZWFkKQotewotCXN0cnVjdCBzcmFtX3BpZWNlICpwc2xvdCwgKnBsYXN0LCAqcGF2YWlsOwotCi0JaWYgKHNpemUgPD0gMCB8fCAhcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBBbGlnbiB0aGUgc2l6ZSAqLwotCXNpemUgPSAoc2l6ZSArIDMpICYgfjM7Ci0KLQlwc2xvdCA9IHBmcmVlX2hlYWQtPm5leHQ7Ci0JcGxhc3QgPSBwZnJlZV9oZWFkOwotCi0JLyogc2VhcmNoIGFuIGF2YWlsYWJsZSBwaWVjZSBzbG90ICovCi0Jd2hpbGUgKHBzbG90ICE9IE5VTEwgJiYgc2l6ZSA+IHBzbG90LT5zaXplKSB7Ci0JCXBsYXN0ID0gcHNsb3Q7Ci0JCXBzbG90ID0gcHNsb3QtPm5leHQ7Ci0JfQotCi0JaWYgKCFwc2xvdCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAocHNsb3QtPnNpemUgPT0gc2l6ZSkgewotCQlwbGFzdC0+bmV4dCA9IHBzbG90LT5uZXh0OwotCQlwYXZhaWwgPSBwc2xvdDsKLQl9IGVsc2UgewotCQlwYXZhaWwgPSBrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCi0JCWlmICghcGF2YWlsKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcGF2YWlsLT5wYWRkciA9IHBzbG90LT5wYWRkcjsKLQkJcGF2YWlsLT5zaXplID0gc2l6ZTsKLQkJcHNsb3QtPnBhZGRyICs9IHNpemU7Ci0JCXBzbG90LT5zaXplIC09IHNpemU7Ci0JfQotCi0JcGF2YWlsLT5waWQgPSBjdXJyZW50LT5waWQ7Ci0KLQlwc2xvdCA9IHB1c2VkX2hlYWQtPm5leHQ7Ci0JcGxhc3QgPSBwdXNlZF9oZWFkOwotCi0JLyogaW5zZXJ0IG5ldyBwaWVjZSBpbnRvIHVzZWQgcGllY2UgbGlzdCAhISEgKi8KLQl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBwYXZhaWwtPnBhZGRyIDwgcHNsb3QtPnBhZGRyKSB7Ci0JCXBsYXN0ID0gcHNsb3Q7Ci0JCXBzbG90ID0gcHNsb3QtPm5leHQ7Ci0JfQotCi0JcGF2YWlsLT5uZXh0ID0gcHNsb3Q7Ci0JcGxhc3QtPm5leHQgPSBwYXZhaWw7Ci0KLQlyZXR1cm4gcGF2YWlsLT5wYWRkcjsKLX0KLQotLyogQWxsb2NhdGUgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIGJsb2NrLiAgKi8KLXN0YXRpYyB2b2lkICpfc3JhbV9hbGxvY19tYXgoc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCi0JCQkJc3RydWN0IHNyYW1fcGllY2UgKnB1c2VkX2hlYWQsCi0JCQkJdW5zaWduZWQgbG9uZyAqcHNpemUpCi17Ci0Jc3RydWN0IHNyYW1fcGllY2UgKnBzbG90LCAqcG1heDsKLQotCWlmICghcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwbWF4ID0gcHNsb3QgPSBwZnJlZV9oZWFkLT5uZXh0OwotCi0JLyogc2VhcmNoIGFuIGF2YWlsYWJsZSBwaWVjZSBzbG90ICovCi0Jd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKLQkJaWYgKHBzbG90LT5zaXplID4gcG1heC0+c2l6ZSkKLQkJCXBtYXggPSBwc2xvdDsKLQkJcHNsb3QgPSBwc2xvdC0+bmV4dDsKLQl9Ci0KLQlpZiAoIXBtYXgpCi0JCXJldHVybiBOVUxMOwotCi0JKnBzaXplID0gcG1heC0+c2l6ZTsKLQotCXJldHVybiBfc3JhbV9hbGxvYygqcHNpemUsIHBmcmVlX2hlYWQsIHB1c2VkX2hlYWQpOwotfQotCi0vKiBTUkFNIGZyZWUgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyLAotCQkJc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCi0JCQlzdHJ1Y3Qgc3JhbV9waWVjZSAqcHVzZWRfaGVhZCkKLXsKLQlzdHJ1Y3Qgc3JhbV9waWVjZSAqcHNsb3QsICpwbGFzdCwgKnBhdmFpbDsKLQotCWlmICghcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKLQkJcmV0dXJuIC0xOwotCi0JLyogc2VhcmNoIHRoZSByZWxldmFudCBtZW1vcnkgc2xvdCAqLwotCXBzbG90ID0gcHVzZWRfaGVhZC0+bmV4dDsKLQlwbGFzdCA9IHB1c2VkX2hlYWQ7Ci0KLQkvKiBzZWFyY2ggYW4gYXZhaWxhYmxlIHBpZWNlIHNsb3QgKi8KLQl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBwc2xvdC0+cGFkZHIgIT0gYWRkcikgewotCQlwbGFzdCA9IHBzbG90OwotCQlwc2xvdCA9IHBzbG90LT5uZXh0OwotCX0KLQotCWlmICghcHNsb3QpCi0JCXJldHVybiAtMTsKLQotCXBsYXN0LT5uZXh0ID0gcHNsb3QtPm5leHQ7Ci0JcGF2YWlsID0gcHNsb3Q7Ci0JcGF2YWlsLT5waWQgPSAwOwotCi0JLyogaW5zZXJ0IGZyZWUgcGllY2VzIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLwotCXBzbG90ID0gcGZyZWVfaGVhZC0+bmV4dDsKLQlwbGFzdCA9IHBmcmVlX2hlYWQ7Ci0KLQl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBhZGRyID4gcHNsb3QtPnBhZGRyKSB7Ci0JCXBsYXN0ID0gcHNsb3Q7Ci0JCXBzbG90ID0gcHNsb3QtPm5leHQ7Ci0JfQotCi0JaWYgKHBsYXN0ICE9IHBmcmVlX2hlYWQgJiYgcGxhc3QtPnBhZGRyICsgcGxhc3QtPnNpemUgPT0gcGF2YWlsLT5wYWRkcikgewotCQlwbGFzdC0+c2l6ZSArPSBwYXZhaWwtPnNpemU7Ci0JCWttZW1fY2FjaGVfZnJlZShzcmFtX3BpZWNlX2NhY2hlLCBwYXZhaWwpOwotCX0gZWxzZSB7Ci0JCXBhdmFpbC0+bmV4dCA9IHBsYXN0LT5uZXh0OwotCQlwbGFzdC0+bmV4dCA9IHBhdmFpbDsKLQkJcGxhc3QgPSBwYXZhaWw7Ci0JfQotCi0JaWYgKHBzbG90ICYmIHBsYXN0LT5wYWRkciArIHBsYXN0LT5zaXplID09IHBzbG90LT5wYWRkcikgewotCQlwbGFzdC0+c2l6ZSArPSBwc2xvdC0+c2l6ZTsKLQkJcGxhc3QtPm5leHQgPSBwc2xvdC0+bmV4dDsKLQkJa21lbV9jYWNoZV9mcmVlKHNyYW1fcGllY2VfY2FjaGUsIHBzbG90KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQotewotCWlmICgwKSB7fQotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQllbHNlIGlmIChhZGRyID49ICh2b2lkICopTDFfQ09ERV9TVEFSVAotCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCi0JCXJldHVybiBsMV9pbnN0X3NyYW1fZnJlZShhZGRyKTsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWVsc2UgaWYgKGFkZHIgPj0gKHZvaWQgKilMMV9EQVRBX0FfU1RBUlQKLQkJICYmIGFkZHIgPCAodm9pZCAqKShMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKSkKLQkJcmV0dXJuIGwxX2RhdGFfQV9zcmFtX2ZyZWUoYWRkcik7Ci0jZW5kaWYKLSNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQllbHNlIGlmIChhZGRyID49ICh2b2lkICopTDFfREFUQV9CX1NUQVJUCi0JCSAmJiBhZGRyIDwgKHZvaWQgKikoTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkpCi0JCXJldHVybiBsMV9kYXRhX0Jfc3JhbV9mcmVlKGFkZHIpOwotI2VuZGlmCi0jaWYgTDJfTEVOR1RIICE9IDAKLQllbHNlIGlmIChhZGRyID49ICh2b2lkICopTDJfU1RBUlQKLQkJICYmIGFkZHIgPCAodm9pZCAqKShMMl9TVEFSVCArIEwyX0xFTkdUSCkpCi0JCXJldHVybiBsMl9zcmFtX2ZyZWUoYWRkcik7Ci0jZW5kaWYKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLUVYUE9SVF9TWU1CT0woc3JhbV9mcmVlKTsKLQotdm9pZCAqbDFfZGF0YV9BX3NyYW1fYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICphZGRyID0gTlVMTDsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCk7Ci0jZW5kaWYKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JcHJfZGVidWcoIkFsbG9jYXRlZCBhZGRyZXNzIGluIGwxX2RhdGFfQV9zcmFtX2FsbG9jIGlzIDB4JWx4KzB4JWx4XG4iLAotCQkgKGxvbmcgdW5zaWduZWQgaW50KWFkZHIsIHNpemUpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGwxX2RhdGFfQV9zcmFtX2FsbG9jKTsKLQotaW50IGwxX2RhdGFfQV9zcmFtX2ZyZWUoY29uc3Qgdm9pZCAqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLSNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKLSNlbHNlCi0JcmV0ID0gLTE7Ci0jZW5kaWYKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wobDFfZGF0YV9BX3NyYW1fZnJlZSk7Ci0KLXZvaWQgKmwxX2RhdGFfQl9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQotewotI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAqYWRkcjsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9kYXRhX0Jfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKLQkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKLQotCXJldHVybiBhZGRyOwotI2Vsc2UKLQlyZXR1cm4gTlVMTDsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTChsMV9kYXRhX0Jfc3JhbV9hbGxvYyk7Ci0KLWludCBsMV9kYXRhX0Jfc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0jaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTChsMV9kYXRhX0Jfc3JhbV9mcmVlKTsKLQotdm9pZCAqbDFfZGF0YV9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQotewotCXZvaWQgKmFkZHIgPSBsMV9kYXRhX0Ffc3JhbV9hbGxvYyhzaXplKTsKLQotCWlmICghYWRkcikKLQkJYWRkciA9IGwxX2RhdGFfQl9zcmFtX2FsbG9jKHNpemUpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGwxX2RhdGFfc3JhbV9hbGxvYyk7Ci0KLXZvaWQgKmwxX2RhdGFfc3JhbV96YWxsb2Moc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqYWRkciA9IGwxX2RhdGFfc3JhbV9hbGxvYyhzaXplKTsKLQotCWlmIChhZGRyKQotCQltZW1zZXQoYWRkciwgMHgwMCwgc2l6ZSk7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLUVYUE9SVF9TWU1CT0wobDFfZGF0YV9zcmFtX3phbGxvYyk7Ci0KLWludCBsMV9kYXRhX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQotewotCWludCByZXQ7Ci0JcmV0ID0gbDFfZGF0YV9BX3NyYW1fZnJlZShhZGRyKTsKLQlpZiAocmV0ID09IC0xKQotCQlyZXQgPSBsMV9kYXRhX0Jfc3JhbV9mcmVlKGFkZHIpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGwxX2RhdGFfc3JhbV9mcmVlKTsKLQotdm9pZCAqbDFfaW5zdF9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQotewotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvaWQgKmFkZHI7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9pbnN0X3NyYW1fYWxsb2MgaXMgMHglbHgrMHglbHhcbiIsCi0JCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSk7Ci0KLQlyZXR1cm4gYWRkcjsKLSNlbHNlCi0JcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLUVYUE9SVF9TWU1CT0wobDFfaW5zdF9zcmFtX2FsbG9jKTsKLQotaW50IGwxX2luc3Rfc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0jaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTChsMV9pbnN0X3NyYW1fZnJlZSk7Ci0KLS8qIEwxIFNjcmF0Y2hwYWQgbWVtb3J5IGFsbG9jYXRlIGZ1bmN0aW9uICovCi12b2lkICpsMXNyYW1fYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICphZGRyOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX3NzcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9zc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qIEwxIFNjcmF0Y2hwYWQgbWVtb3J5IGFsbG9jYXRlIGZ1bmN0aW9uICovCi12b2lkICpsMXNyYW1fYWxsb2NfbWF4KHNpemVfdCAqcHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICphZGRyOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jX21heCgmZnJlZV9sMV9zc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfc3NyYW1faGVhZCwgcHNpemUpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotLyogTDEgU2NyYXRjaHBhZCBtZW1vcnkgZnJlZSBmdW5jdGlvbiAqLwotaW50IGwxc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9zc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfc3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgKmwyX3NyYW1fYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0jaWYgTDJfTEVOR1RIICE9IDAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvaWQgKmFkZHI7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwyX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wyX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wyX3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDJfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlwcl9kZWJ1ZygiQWxsb2NhdGVkIGFkZHJlc3MgaW4gbDJfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKLQkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKLQotCXJldHVybiBhZGRyOwotI2Vsc2UKLQlyZXR1cm4gTlVMTDsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTChsMl9zcmFtX2FsbG9jKTsKLQotdm9pZCAqbDJfc3JhbV96YWxsb2Moc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqYWRkciA9IGwyX3NyYW1fYWxsb2Moc2l6ZSk7Ci0KLQlpZiAoYWRkcikKLQkJbWVtc2V0KGFkZHIsIDB4MDAsIHNpemUpOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGwyX3NyYW1femFsbG9jKTsKLQotaW50IGwyX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQotewotI2lmIEwyX0xFTkdUSCAhPSAwCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMl9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDJfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDJfc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMl9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTChsMl9zcmFtX2ZyZWUpOwotCi1pbnQgc3JhbV9mcmVlX3dpdGhfbHNsKGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0Jc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKmxzbCwgKip0bXA7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCWZvciAodG1wID0gJm1tLT5jb250ZXh0LnNyYW1fbGlzdDsgKnRtcDsgdG1wID0gJigqdG1wKS0+bmV4dCkKLQkJaWYgKCgqdG1wKS0+YWRkciA9PSBhZGRyKQotCQkJZ290byBmb3VuZDsKLQlyZXR1cm4gLTE7Ci1mb3VuZDoKLQlsc2wgPSAqdG1wOwotCXNyYW1fZnJlZShhZGRyKTsKLQkqdG1wID0gbHNsLT5uZXh0OwotCWtmcmVlKGxzbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woc3JhbV9mcmVlX3dpdGhfbHNsKTsKLQotdm9pZCAqc3JhbV9hbGxvY193aXRoX2xzbChzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQl2b2lkICphZGRyID0gTlVMTDsKLQlzdHJ1Y3Qgc3JhbV9saXN0X3N0cnVjdCAqbHNsID0gTlVMTDsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCi0JbHNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxzbCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoZmxhZ3MgJiBMMV9JTlNUX1NSQU0pCi0JCWFkZHIgPSBsMV9pbnN0X3NyYW1fYWxsb2Moc2l6ZSk7Ci0KLQlpZiAoYWRkciA9PSBOVUxMICYmIChmbGFncyAmIEwxX0RBVEFfQV9TUkFNKSkKLQkJYWRkciA9IGwxX2RhdGFfQV9zcmFtX2FsbG9jKHNpemUpOwotCi0JaWYgKGFkZHIgPT0gTlVMTCAmJiAoZmxhZ3MgJiBMMV9EQVRBX0JfU1JBTSkpCi0JCWFkZHIgPSBsMV9kYXRhX0Jfc3JhbV9hbGxvYyhzaXplKTsKLQotCWlmIChhZGRyID09IE5VTEwgJiYgKGZsYWdzICYgTDJfU1JBTSkpCi0JCWFkZHIgPSBsMl9zcmFtX2FsbG9jKHNpemUpOwotCi0JaWYgKGFkZHIgPT0gTlVMTCkgewotCQlrZnJlZShsc2wpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHNsLT5hZGRyID0gYWRkcjsKLQlsc2wtPmxlbmd0aCA9IHNpemU7Ci0JbHNsLT5uZXh0ID0gbW0tPmNvbnRleHQuc3JhbV9saXN0OwotCW1tLT5jb250ZXh0LnNyYW1fbGlzdCA9IGxzbDsKLQlyZXR1cm4gYWRkcjsKLX0KLUVYUE9SVF9TWU1CT0woc3JhbV9hbGxvY193aXRoX2xzbCk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotLyogT25jZSB3ZSBnZXQgYSByZWFsIGFsbG9jYXRvciwgd2UnbGwgdGhyb3cgYWxsIG9mIHRoaXMgYXdheS4KLSAqIFVudGlsIHRoZW4sIHdlIG5lZWQgc29tZSBzb3J0IG9mIHZpc2liaWxpdHkgaW50byB0aGUgTDEgYWxsb2MuCi0gKi8KLS8qIE5lZWQgdG8ga2VlcCBsaW5lIG9mIG91dHB1dCB0aGUgc2FtZS4gIEN1cnJlbnRseSwgdGhhdCBpcyA0NCBieXRlcwotICogKGluY2x1ZGluZyBuZXdsaW5lKS4KLSAqLwotc3RhdGljIGludCBfc3JhbV9wcm9jX3JlYWQoY2hhciAqYnVmLCBpbnQgKmxlbiwgaW50IGNvdW50LCBjb25zdCBjaGFyICpkZXNjLAotCQlzdHJ1Y3Qgc3JhbV9waWVjZSAqcGZyZWVfaGVhZCwKLQkJc3RydWN0IHNyYW1fcGllY2UgKnB1c2VkX2hlYWQpCi17Ci0Jc3RydWN0IHNyYW1fcGllY2UgKnBzbG90OwotCi0JaWYgKCFwZnJlZV9oZWFkIHx8ICFwdXNlZF9oZWFkKQotCQlyZXR1cm4gLTE7Ci0KLQkqbGVuICs9IHNwcmludGYoJmJ1ZlsqbGVuXSwgIi0tLSBTUkFNICUtMTRzIFNpemUgICBQSUQgU3RhdGUgICAgIFxuIiwgZGVzYyk7Ci0KLQkvKiBzZWFyY2ggdGhlIHJlbGV2YW50IG1lbW9yeSBzbG90ICovCi0JcHNsb3QgPSBwdXNlZF9oZWFkLT5uZXh0OwotCi0Jd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKLQkJKmxlbiArPSBzcHJpbnRmKCZidWZbKmxlbl0sICIlcC0lcCAlMTBpICU1aSAlLTEwc1xuIiwKLQkJCXBzbG90LT5wYWRkciwgcHNsb3QtPnBhZGRyICsgcHNsb3QtPnNpemUsCi0JCQlwc2xvdC0+c2l6ZSwgcHNsb3QtPnBpZCwgIkFMTE9DQVRFRCIpOwotCi0JCXBzbG90ID0gcHNsb3QtPm5leHQ7Ci0JfQotCi0JcHNsb3QgPSBwZnJlZV9oZWFkLT5uZXh0OwotCi0Jd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKLQkJKmxlbiArPSBzcHJpbnRmKCZidWZbKmxlbl0sICIlcC0lcCAlMTBpICU1aSAlLTEwc1xuIiwKLQkJCXBzbG90LT5wYWRkciwgcHNsb3QtPnBhZGRyICsgcHNsb3QtPnNpemUsCi0JCQlwc2xvdC0+c2l6ZSwgcHNsb3QtPnBpZCwgIkZSRUUiKTsKLQotCQlwc2xvdCA9IHBzbG90LT5uZXh0OwotCX0KLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBzcmFtX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCWludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWludCBsZW4gPSAwOwotCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiU2NyYXRjaHBhZCIsCi0JCQkmZnJlZV9sMV9zc3JhbV9oZWFkLCAmdXNlZF9sMV9zc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKLSNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEEiLAotCQkJJmZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOwotI2VuZGlmCi0jaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBCIiwKLQkJCSZmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKLSNlbmRpZgotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBJbnN0cnVjdGlvbiIsCi0JCQkmZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgJnVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOwotI2VuZGlmCi0jaWYgTDJfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMiIsCi0JCQkmZnJlZV9sMl9zcmFtX2hlYWQsICZ1c2VkX2wyX3NyYW1faGVhZCkpCi0JCWdvdG8gbm90X2RvbmU7Ci0jZW5kaWYKLQotCSplb2YgPSAxOwotIG5vdF9kb25lOgotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNyYW1fcHJvY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwdHI7Ci0JcHRyID0gY3JlYXRlX3Byb2NfZW50cnkoInNyYW0iLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCk7Ci0JaWYgKCFwdHIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9zcmFtXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwdHItPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JcHRyLT5yZWFkX3Byb2MgPSBzcmFtX3Byb2NfcmVhZDsKLQlyZXR1cm4gMDsKLX0KLWxhdGVfaW5pdGNhbGwoc3JhbV9wcm9jX2luaXQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2lzcmFtLWRyaXZlci5jIGIvYXJjaC9ibGFja2Zpbi9tbS9pc3JhbS1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjkxM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9pc3JhbS1kcml2ZXIuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIERlc2NyaXB0aW9uOiBJbnN0cnVjdGlvbiBTUkFNIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhlIEJsYWNrZmluCisgKgorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKy8qCisgKiBJTVBPUlRBTlQgV0FSTklORyBBQk9VVCBUSEVTRSBGVU5DVElPTlMKKyAqCisgKiBUaGUgZW11bGF0b3Igd2lsbCBub3QgZnVuY3Rpb24gY29ycmVjdGx5IGlmIGEgd3JpdGUgY29tbWFuZCBpcyBsZWZ0IGluCisgKiBJVEVTVF9DT01NQU5EIG9yIERURVNUX0NPTU1BTkQgQU5EIGFjY2VzcyB0byBjYWNoZSBtZW1vcnkgaXMgbmVlZGVkIGJ5CisgKiB0aGUgZW11bGF0b3IuIFRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGVuc3VyZSB0aGF0IGJvdGggSVRFU1RfQ09NTUFORAorICogYW5kIERURVNUX0NPTU1BTkQgYXJlIHplcm8gd2hlbiBleGl0aW5nIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworCisKKy8qCisgKiBPbiB0aGUgQmxhY2tmaW4sIEwxIGluc3RydWN0aW9uIHNyYW0gKHdoaWNoIG9wZXJhdGVzIGF0IGNvcmUgc3BlZWRzKSBjYW4gbm90CisgKiBiZSBhY2Nlc3NlZCBieSBhIG5vcm1hbCBjb3JlIGxvYWQsIHNvIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBhIGZldyBob29wcyB0bworICogcmVhZC93cml0ZSBpdC4KKyAqIFRvIHRyeSB0byBtYWtlIGl0IGVhc2llciAtIHdlIGV4cG9ydCBhIG1lbWNweSBpbnRlcmZhY2UsIHdoZXJlIGVpdGhlciBzcmMgb3IKKyAqIGRlc3QgY2FuIGJlIGluIHRoaXMgc3BlY2lhbCBMMSBtZW1vcnkgYXJlYS4KKyAqIFRoZSBsb3cgbGV2ZWwgcmVhZC93cml0ZSBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBleHBvc2VkIHRvIHRoZSByZXN0IG9mIHRoZQorICoga2VybmVsLCBzaW5jZSB0aGV5IG9wZXJhdGUgb24gNjQtYml0IGRhdGEsIGFuZCBuZWVkIHNwZWNpZmljIGFkZHJlc3MgYWxpZ25tZW50CisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhkdGVzdF9sb2NrKTsKKworLyogVGFrZXMgYSB2b2lkIHBvaW50ZXIgKi8KKyNkZWZpbmUgSUFERFIyRFRFU1QoeCkgXAorCSh7IHVuc2lnbmVkIGxvbmcgX19hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHgpOyBcCisJCShfX2FkZHIgJiAweDQ3RjgpICAgICAgICB8IC8qIGFkZHJlc3MgYml0cyAxNCAmIDEwOjMgKi8gXAorCQkoX19hZGRyICYgMHgwODAwKSA8PCAxNSAgfCAvKiBhZGRyZXNzIGJpdCAgMTEgICAgICAgICovIFwKKwkJKF9fYWRkciAgJiAweDMwMDApIDw8IDQgIHwgLyogYWRkcmVzcyBiaXRzIDEzOjEyICAgICAqLyBcCisJCShfX2FkZHIgICYgMHg4MDAwKSA8PCA4ICB8IC8qIGFkZHJlc3MgYml0ICAxNSAgICAgICAgKi8gXAorCQkoMHgxMDAwMDA0KTsgICAgICAgICAgICAgICAvKiBpc3JhbSBhY2Nlc3MgICAgICAgICAgICovIFwKKwl9KQorCisvKiBUYWtlcyBhIHBvaW50ZXIsIGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgKGluIGJpdHMpIHdoaWNoIHRoaW5ncyBzaG91bGQgYmUgc2hpZnRlZCAqLworI2RlZmluZSBBRERSMk9GRlNFVCh4KSAoKCgodW5zaWduZWQgbG9uZykoeCkpICYgMHg3KSAqIDgpCisKKy8qIFRha2VzIGEgcG9pbnRlciwgZGV0ZXJtaW5lcyBpZiBpdCBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBpc3JhbSA2NC1iaXQgZGF0YSB0eXBlICovCisjZGVmaW5lIEFERFIyTEFTVCh4KSAoKCgodW5zaWduZWQgbG9uZyl4KSAmIDB4NykgPT0gMHg3KQorCitzdGF0aWMgdm9pZCBpc3JhbV93cml0ZShjb25zdCB2b2lkICphZGRyLCB1aW50NjRfdCBkYXRhKQoreworCXVpbnQzMl90IGNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFkZHIgPj0gKHZvaWQgKikoTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJcmV0dXJuOworCisJY21kID0gSUFERFIyRFRFU1QoYWRkcikgfCAxOyAgICAgICAgICAgICAvKiB3cml0ZSAqLworCisJLyoKKwkgKiBXcml0ZXMgdG8gRFRFU1RfREFUQVswOjFdIG5lZWQgdG8gYmUgYXRvbWljIHdpdGggd3JpdGUgdG8gRFRFU1RfQ09NTUFORAorCSAqIFdoaWxlIGluIGV4Y2VwdGlvbiBjb250ZXh0IC0gYXRvbWljaXR5IGlzIGd1YXJhbnRlZWQgb3IgZG91YmxlIGZhdWx0CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR0ZXN0X2xvY2ssIGZsYWdzKTsKKworCWJmaW5fd3JpdGVfRFRFU1RfREFUQTAoZGF0YSAmIDB4RkZGRkZGRkYpOworCWJmaW5fd3JpdGVfRFRFU1RfREFUQTEoZGF0YSA+PiAzMik7CisKKwkvKiB1c2UgdGhlIGJ1aWx0aW4sIHNpbmNlIGludGVycnVwdHMgYXJlIGFscmVhZHkgdHVybmVkIG9mZiAqLworCV9fYnVpbHRpbl9iZmluX2NzeW5jKCk7CisJYmZpbl93cml0ZV9EVEVTVF9DT01NQU5EKGNtZCk7CisJX19idWlsdGluX2JmaW5fY3N5bmMoKTsKKworCWJmaW5fd3JpdGVfRFRFU1RfQ09NTUFORCgwKTsKKwlfX2J1aWx0aW5fYmZpbl9jc3luYygpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHRlc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdWludDY0X3QgaXNyYW1fcmVhZChjb25zdCB2b2lkICphZGRyKQoreworCXVpbnQzMl90IGNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQ2NF90IHJldDsKKworCWlmIChhZGRyID4gKHZvaWQgKikoTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJcmV0dXJuIDA7CisKKwljbWQgPSBJQUREUjJEVEVTVChhZGRyKSB8IDA7ICAgICAgICAgICAgICAvKiByZWFkICovCisKKwkvKgorCSAqIFJlYWRzIG9mIERURVNUX0RBVEFbMDoxXSBuZWVkIHRvIGJlIGF0b21pYyB3aXRoIHdyaXRlIHRvIERURVNUX0NPTU1BTkQKKwkgKiBXaGlsZSBpbiBleGNlcHRpb24gY29udGV4dCAtIGF0b21pY2l0eSBpcyBndWFyYW50ZWVkIG9yIGRvdWJsZSBmYXVsdAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkdGVzdF9sb2NrLCBmbGFncyk7CisJLyogdXNlIHRoZSBidWlsdGluLCBzaW5jZSBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IHR1cm5lZCBvZmYgKi8KKwlfX2J1aWx0aW5fYmZpbl9jc3luYygpOworCWJmaW5fd3JpdGVfRFRFU1RfQ09NTUFORChjbWQpOworCV9fYnVpbHRpbl9iZmluX2NzeW5jKCk7CisJcmV0ID0gYmZpbl9yZWFkX0RURVNUX0RBVEEwKCkgfCAoKHVpbnQ2NF90KWJmaW5fcmVhZF9EVEVTVF9EQVRBMSgpIDw8IDMyKTsKKworCWJmaW5fd3JpdGVfRFRFU1RfQ09NTUFORCgwKTsKKwlfX2J1aWx0aW5fYmZpbl9jc3luYygpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR0ZXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIGlzcmFtX2NoZWNrX2FkZHIoY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IG4pCit7CisJaWYgKChhZGRyID49ICh2b2lkICopTDFfQ09ERV9TVEFSVCkgJiYKKwkgICAgKGFkZHIgPCAodm9pZCAqKShMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpKSkgeworCQlpZiAoKGFkZHIgKyBuKSA+PSAodm9pZCAqKShMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpKSB7CisJCQlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOworCQkJcHJpbnRrKEtFUk5fRVJSICJpc3JhbV9tZW1jcHk6IGNvcHkgaW52b2x2aW5nICVwIGxlbmd0aCAiCisJCQkJCSIoJXp1KSB0b28gbG9uZ1xuIiwgYWRkciwgbik7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFRoZSBpc3JhbV9tZW1jcHkoKSBmdW5jdGlvbiBjb3BpZXMgbiBieXRlcyBmcm9tIG1lbW9yeSBhcmVhIHNyYyB0byBtZW1vcnkgYXJlYSBkZXN0LgorICogVGhlIGlzcmFtX21lbWNweSgpIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGRlc3QuCisgKiBFaXRoZXIgZGVzdCBvciBzcmMgY2FuIGJlIGluIEwxIGluc3RydWN0aW9uIHNyYW0uCisgKi8KK3ZvaWQgKmlzcmFtX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCXVpbnQ2NF90IGRhdGFfaW4gPSAwLCBkYXRhX291dCA9IDA7CisJc2l6ZV90IGNvdW50OworCWJvb2wgZGVzdF9pbl9sMSwgc3JjX2luX2wxLCBuZWVkX2RhdGEsIHB1dF9kYXRhOworCXVuc2lnbmVkIGNoYXIgYnl0ZSwgKnNyY19ieXRlLCAqZGVzdF9ieXRlOworCisJc3JjX2J5dGUgPSAodW5zaWduZWQgY2hhciAqKXNyYzsKKwlkZXN0X2J5dGUgPSAodW5zaWduZWQgY2hhciAqKWRlc3Q7CisKKwlkZXN0X2luX2wxID0gaXNyYW1fY2hlY2tfYWRkcihkZXN0LCBuKTsKKwlzcmNfaW5fbDEgPSBpc3JhbV9jaGVja19hZGRyKHNyYywgbik7CisKKwluZWVkX2RhdGEgPSB0cnVlOworCXB1dF9kYXRhID0gdHJ1ZTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBuOyBjb3VudCsrKSB7CisJCWlmIChzcmNfaW5fbDEpIHsKKwkJCWlmIChuZWVkX2RhdGEpIHsKKwkJCQlkYXRhX2luID0gaXNyYW1fcmVhZChzcmMgKyBjb3VudCk7CisJCQkJbmVlZF9kYXRhID0gZmFsc2U7CisJCQl9CisKKwkJCWlmIChBRERSMkxBU1Qoc3JjICsgY291bnQpKQorCQkJCW5lZWRfZGF0YSA9IHRydWU7CisKKwkJCWJ5dGUgPSAodW5zaWduZWQgY2hhcikoKGRhdGFfaW4gPj4gQUREUjJPRkZTRVQoc3JjICsgY291bnQpKSAmIDB4ZmYpOworCisJCX0gZWxzZSB7CisJCQkvKiBzcmMgaXMgaW4gTDIgb3IgTDMgLSBzbyBqdXN0IGRlcmVmZXJlbmNlKi8KKwkJCWJ5dGUgPSBzcmNfYnl0ZVtjb3VudF07CisJCX0KKworCQlpZiAoZGVzdF9pbl9sMSkgeworCQkJaWYgKHB1dF9kYXRhKSB7CisJCQkJZGF0YV9vdXQgPSBpc3JhbV9yZWFkKGRlc3QgKyBjb3VudCk7CisJCQkJcHV0X2RhdGEgPSBmYWxzZTsKKwkJCX0KKworCQkJZGF0YV9vdXQgJj0gfigodWludDY0X3QpMHhmZiA8PCBBRERSMk9GRlNFVChkZXN0ICsgY291bnQpKTsKKwkJCWRhdGFfb3V0IHw9ICgodWludDY0X3QpYnl0ZSA8PCBBRERSMk9GRlNFVChkZXN0ICsgY291bnQpKTsKKworCQkJaWYgKEFERFIyTEFTVChkZXN0ICsgY291bnQpKSB7CisJCQkJcHV0X2RhdGEgPSB0cnVlOworCQkJCWlzcmFtX3dyaXRlKGRlc3QgKyBjb3VudCwgZGF0YV9vdXQpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogZGVzdCBpbiBMMiBvciBMMyAtIHNvIGp1c3QgZGVyZWZlcmVuY2UgKi8KKwkJCWRlc3RfYnl0ZVtjb3VudF0gPSBieXRlOworCQl9CisJfQorCisJLyogbWFrZSBzdXJlIHdlIGR1bXAgdGhlIGxhc3QgYnl0ZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZGVzdF9pbl9sMSAmJiAhcHV0X2RhdGEpCisJCWlzcmFtX3dyaXRlKGRlc3QgKyBjb3VudCwgZGF0YV9vdXQpOworCisJcmV0dXJuIGRlc3Q7Cit9CitFWFBPUlRfU1lNQk9MKGlzcmFtX21lbWNweSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxY2E2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jCkBAIC0wLDAgKzEsODA5IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYworICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU1JBTSBhbGxvY2F0b3IgZm9yIEJsYWNrZmluIEwxIGFuZCBMMiBtZW1vcnkKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlICJibGFja2Zpbl9zcmFtLmgiCisKK3N0YXRpYyBzcGlubG9ja190IGwxc3JhbV9sb2NrLCBsMV9kYXRhX3NyYW1fbG9jaywgbDFfaW5zdF9zcmFtX2xvY2s7CitzdGF0aWMgc3BpbmxvY2tfdCBsMl9zcmFtX2xvY2s7CisKKy8qIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgTDEgc2NyYXRjaHBhZCBhbmQgREFUQSBTUkFNICovCitzdHJ1Y3Qgc3JhbV9waWVjZSB7CisJdm9pZCAqcGFkZHI7CisJaW50IHNpemU7CisJcGlkX3QgcGlkOworCXN0cnVjdCBzcmFtX3BpZWNlICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfc3NyYW1faGVhZCwgdXNlZF9sMV9zc3JhbV9oZWFkOworCisjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCitzdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCB1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQ7CisjZW5kaWYKKworI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAorc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkOworI2VuZGlmCisKKyNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCitzdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgdXNlZF9sMV9pbnN0X3NyYW1faGVhZDsKKyNlbmRpZgorCisjaWYgTDJfTEVOR1RIICE9IDAKK3N0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wyX3NyYW1faGVhZCwgdXNlZF9sMl9zcmFtX2hlYWQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzcmFtX3BpZWNlX2NhY2hlOworCisvKiBMMSBTY3JhdGNocGFkIFNSQU0gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsMXNyYW1faW5pdCh2b2lkKQoreworCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0ID0KKwkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIFNjcmF0Y2hwYWQgZGF0YSBTUkFNXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5wYWRkciA9ICh2b2lkICopTDFfU0NSQVRDSF9TVEFSVDsKKwlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dC0+c2l6ZSA9IEwxX1NDUkFUQ0hfTEVOR1RIOworCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOworCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKKworCXVzZWRfbDFfc3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKKworCS8qIG11dGV4IGluaXRpYWxpemUgKi8KKwlzcGluX2xvY2tfaW5pdCgmbDFzcmFtX2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gU2NyYXRjaHBhZCBkYXRhIFNSQU06ICVkIEtCXG4iLAorCSAgICAgICBMMV9TQ1JBVENIX0xFTkdUSCA+PiAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsMV9kYXRhX3NyYW1faW5pdCh2b2lkKQoreworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAorCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0ID0KKwkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIERhdGEgQSBTUkFNXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5wYWRkciA9CisJCSh2b2lkICopTDFfREFUQV9BX1NUQVJUICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKKwlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+c2l6ZSA9CisJCUwxX0RBVEFfQV9MRU5HVEggLSAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOworCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOworCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKKworCXVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKKworCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQSBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCUwxX0RBVEFfQV9MRU5HVEggPj4gMTAsCisJCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKKyNlbmRpZgorI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAorCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0ID0KKwkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIERhdGEgQiBTUkFNXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5wYWRkciA9CisJCSh2b2lkICopTDFfREFUQV9CX1NUQVJUICsgKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7CisJZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnNpemUgPQorCQlMMV9EQVRBX0JfTEVOR1RIIC0gKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7CisJZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7CisJZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOworCisJdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQgPSBOVUxMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgRGF0YSBCIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKKwkJTDFfREFUQV9CX0xFTkdUSCA+PiAxMCwKKwkJZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnNpemUgPj4gMTApOworI2VuZGlmCisKKwkvKiBtdXRleCBpbml0aWFsaXplICovCisJc3Bpbl9sb2NrX2luaXQoJmwxX2RhdGFfc3JhbV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGwxX2luc3Rfc3JhbV9pbml0KHZvaWQpCit7CisjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAorCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dCA9CisJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDEgSW5zdHJ1Y3Rpb24gU1JBTVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnBhZGRyID0KKwkJKHZvaWQgKilMMV9DT0RFX1NUQVJUICsgKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSk7CisJZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5zaXplID0KKwkJTDFfQ09ERV9MRU5HVEggLSAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKKwlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7CisJZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKKworCXVzZWRfbDFfaW5zdF9zcmFtX2hlYWQubmV4dCA9IE5VTEw7CisKKwlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBJbnN0cnVjdGlvbiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCUwxX0NPREVfTEVOR1RIID4+IDEwLAorCQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnNpemUgPj4gMTApOworI2VuZGlmCisKKwkvKiBtdXRleCBpbml0aWFsaXplICovCisJc3Bpbl9sb2NrX2luaXQoJmwxX2luc3Rfc3JhbV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGwyX3NyYW1faW5pdCh2b2lkKQoreworI2lmIEwyX0xFTkdUSCAhPSAwCisJZnJlZV9sMl9zcmFtX2hlYWQubmV4dCA9CisJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmcmVlX2wyX3NyYW1faGVhZC5uZXh0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwyIFNSQU1cbiIpOworCQlyZXR1cm47CisJfQorCisJZnJlZV9sMl9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPSAodm9pZCAqKUwyX1NUQVJUICsKKwkJKF9ldGV4dF9sMiAtIF9zdGV4dF9sMikgKyAoX2VkYXRhX2wyIC0gX3NkYXRhX2wyKTsKKwlmcmVlX2wyX3NyYW1faGVhZC5uZXh0LT5zaXplID0gTDJfTEVOR1RIIC0KKwkJKF9ldGV4dF9sMiAtIF9zdGV4dF9sMikgKyAoX2VkYXRhX2wyIC0gX3NkYXRhX2wyKTsKKwlmcmVlX2wyX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOworCWZyZWVfbDJfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOworCisJdXNlZF9sMl9zcmFtX2hlYWQubmV4dCA9IE5VTEw7CisKKwlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCUwyX0xFTkdUSCA+PiAxMCwKKwkJZnJlZV9sMl9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7CisjZW5kaWYKKworCS8qIG11dGV4IGluaXRpYWxpemUgKi8KKwlzcGluX2xvY2tfaW5pdCgmbDJfc3JhbV9sb2NrKTsKK30KK3ZvaWQgX19pbml0IGJmaW5fc3JhbV9pbml0KHZvaWQpCit7CisJc3JhbV9waWVjZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzcmFtX3BpZWNlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IHNyYW1fcGllY2UpLAorCQkJCTAsIFNMQUJfUEFOSUMsIE5VTEwpOworCisJbDFzcmFtX2luaXQoKTsKKwlsMV9kYXRhX3NyYW1faW5pdCgpOworCWwxX2luc3Rfc3JhbV9pbml0KCk7CisJbDJfc3JhbV9pbml0KCk7Cit9CisKKy8qIFNSQU0gYWxsb2NhdGUgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkICpfc3JhbV9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCisJCXN0cnVjdCBzcmFtX3BpZWNlICpwdXNlZF9oZWFkKQoreworCXN0cnVjdCBzcmFtX3BpZWNlICpwc2xvdCwgKnBsYXN0LCAqcGF2YWlsOworCisJaWYgKHNpemUgPD0gMCB8fCAhcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGlnbiB0aGUgc2l6ZSAqLworCXNpemUgPSAoc2l6ZSArIDMpICYgfjM7CisKKwlwc2xvdCA9IHBmcmVlX2hlYWQtPm5leHQ7CisJcGxhc3QgPSBwZnJlZV9oZWFkOworCisJLyogc2VhcmNoIGFuIGF2YWlsYWJsZSBwaWVjZSBzbG90ICovCisJd2hpbGUgKHBzbG90ICE9IE5VTEwgJiYgc2l6ZSA+IHBzbG90LT5zaXplKSB7CisJCXBsYXN0ID0gcHNsb3Q7CisJCXBzbG90ID0gcHNsb3QtPm5leHQ7CisJfQorCisJaWYgKCFwc2xvdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocHNsb3QtPnNpemUgPT0gc2l6ZSkgeworCQlwbGFzdC0+bmV4dCA9IHBzbG90LT5uZXh0OworCQlwYXZhaWwgPSBwc2xvdDsKKwl9IGVsc2UgeworCQlwYXZhaWwgPSBrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOworCisJCWlmICghcGF2YWlsKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcGF2YWlsLT5wYWRkciA9IHBzbG90LT5wYWRkcjsKKwkJcGF2YWlsLT5zaXplID0gc2l6ZTsKKwkJcHNsb3QtPnBhZGRyICs9IHNpemU7CisJCXBzbG90LT5zaXplIC09IHNpemU7CisJfQorCisJcGF2YWlsLT5waWQgPSBjdXJyZW50LT5waWQ7CisKKwlwc2xvdCA9IHB1c2VkX2hlYWQtPm5leHQ7CisJcGxhc3QgPSBwdXNlZF9oZWFkOworCisJLyogaW5zZXJ0IG5ldyBwaWVjZSBpbnRvIHVzZWQgcGllY2UgbGlzdCAhISEgKi8KKwl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBwYXZhaWwtPnBhZGRyIDwgcHNsb3QtPnBhZGRyKSB7CisJCXBsYXN0ID0gcHNsb3Q7CisJCXBzbG90ID0gcHNsb3QtPm5leHQ7CisJfQorCisJcGF2YWlsLT5uZXh0ID0gcHNsb3Q7CisJcGxhc3QtPm5leHQgPSBwYXZhaWw7CisKKwlyZXR1cm4gcGF2YWlsLT5wYWRkcjsKK30KKworLyogQWxsb2NhdGUgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIGJsb2NrLiAgKi8KK3N0YXRpYyB2b2lkICpfc3JhbV9hbGxvY19tYXgoc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCisJCQkJc3RydWN0IHNyYW1fcGllY2UgKnB1c2VkX2hlYWQsCisJCQkJdW5zaWduZWQgbG9uZyAqcHNpemUpCit7CisJc3RydWN0IHNyYW1fcGllY2UgKnBzbG90LCAqcG1heDsKKworCWlmICghcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwbWF4ID0gcHNsb3QgPSBwZnJlZV9oZWFkLT5uZXh0OworCisJLyogc2VhcmNoIGFuIGF2YWlsYWJsZSBwaWVjZSBzbG90ICovCisJd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKKwkJaWYgKHBzbG90LT5zaXplID4gcG1heC0+c2l6ZSkKKwkJCXBtYXggPSBwc2xvdDsKKwkJcHNsb3QgPSBwc2xvdC0+bmV4dDsKKwl9CisKKwlpZiAoIXBtYXgpCisJCXJldHVybiBOVUxMOworCisJKnBzaXplID0gcG1heC0+c2l6ZTsKKworCXJldHVybiBfc3JhbV9hbGxvYygqcHNpemUsIHBmcmVlX2hlYWQsIHB1c2VkX2hlYWQpOworfQorCisvKiBTUkFNIGZyZWUgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyLAorCQkJc3RydWN0IHNyYW1fcGllY2UgKnBmcmVlX2hlYWQsCisJCQlzdHJ1Y3Qgc3JhbV9waWVjZSAqcHVzZWRfaGVhZCkKK3sKKwlzdHJ1Y3Qgc3JhbV9waWVjZSAqcHNsb3QsICpwbGFzdCwgKnBhdmFpbDsKKworCWlmICghcGZyZWVfaGVhZCB8fCAhcHVzZWRfaGVhZCkKKwkJcmV0dXJuIC0xOworCisJLyogc2VhcmNoIHRoZSByZWxldmFudCBtZW1vcnkgc2xvdCAqLworCXBzbG90ID0gcHVzZWRfaGVhZC0+bmV4dDsKKwlwbGFzdCA9IHB1c2VkX2hlYWQ7CisKKwkvKiBzZWFyY2ggYW4gYXZhaWxhYmxlIHBpZWNlIHNsb3QgKi8KKwl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBwc2xvdC0+cGFkZHIgIT0gYWRkcikgeworCQlwbGFzdCA9IHBzbG90OworCQlwc2xvdCA9IHBzbG90LT5uZXh0OworCX0KKworCWlmICghcHNsb3QpCisJCXJldHVybiAtMTsKKworCXBsYXN0LT5uZXh0ID0gcHNsb3QtPm5leHQ7CisJcGF2YWlsID0gcHNsb3Q7CisJcGF2YWlsLT5waWQgPSAwOworCisJLyogaW5zZXJ0IGZyZWUgcGllY2VzIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLworCXBzbG90ID0gcGZyZWVfaGVhZC0+bmV4dDsKKwlwbGFzdCA9IHBmcmVlX2hlYWQ7CisKKwl3aGlsZSAocHNsb3QgIT0gTlVMTCAmJiBhZGRyID4gcHNsb3QtPnBhZGRyKSB7CisJCXBsYXN0ID0gcHNsb3Q7CisJCXBzbG90ID0gcHNsb3QtPm5leHQ7CisJfQorCisJaWYgKHBsYXN0ICE9IHBmcmVlX2hlYWQgJiYgcGxhc3QtPnBhZGRyICsgcGxhc3QtPnNpemUgPT0gcGF2YWlsLT5wYWRkcikgeworCQlwbGFzdC0+c2l6ZSArPSBwYXZhaWwtPnNpemU7CisJCWttZW1fY2FjaGVfZnJlZShzcmFtX3BpZWNlX2NhY2hlLCBwYXZhaWwpOworCX0gZWxzZSB7CisJCXBhdmFpbC0+bmV4dCA9IHBsYXN0LT5uZXh0OworCQlwbGFzdC0+bmV4dCA9IHBhdmFpbDsKKwkJcGxhc3QgPSBwYXZhaWw7CisJfQorCisJaWYgKHBzbG90ICYmIHBsYXN0LT5wYWRkciArIHBsYXN0LT5zaXplID09IHBzbG90LT5wYWRkcikgeworCQlwbGFzdC0+c2l6ZSArPSBwc2xvdC0+c2l6ZTsKKwkJcGxhc3QtPm5leHQgPSBwc2xvdC0+bmV4dDsKKwkJa21lbV9jYWNoZV9mcmVlKHNyYW1fcGllY2VfY2FjaGUsIHBzbG90KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQoreworCisjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAorCWlmIChhZGRyID49ICh2b2lkICopTDFfQ09ERV9TVEFSVAorCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJCXJldHVybiBsMV9pbnN0X3NyYW1fZnJlZShhZGRyKTsKKwllbHNlCisjZW5kaWYKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKKwlpZiAoYWRkciA+PSAodm9pZCAqKUwxX0RBVEFfQV9TVEFSVAorCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCQlyZXR1cm4gbDFfZGF0YV9BX3NyYW1fZnJlZShhZGRyKTsKKwllbHNlCisjZW5kaWYKKyNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKKwlpZiAoYWRkciA+PSAodm9pZCAqKUwxX0RBVEFfQl9TVEFSVAorCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpKQorCQlyZXR1cm4gbDFfZGF0YV9CX3NyYW1fZnJlZShhZGRyKTsKKwllbHNlCisjZW5kaWYKKyNpZiBMMl9MRU5HVEggIT0gMAorCWlmIChhZGRyID49ICh2b2lkICopTDJfU1RBUlQKKwkJICYmIGFkZHIgPCAodm9pZCAqKShMMl9TVEFSVCArIEwyX0xFTkdUSCkpCisJCXJldHVybiBsMl9zcmFtX2ZyZWUoYWRkcik7CisJZWxzZQorI2VuZGlmCisJCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woc3JhbV9mcmVlKTsKKwordm9pZCAqbDFfZGF0YV9BX3NyYW1fYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICphZGRyID0gTlVMTDsKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAorCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLAorCQkJJnVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCk7CisjZW5kaWYKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIkFsbG9jYXRlZCBhZGRyZXNzIGluIGwxX2RhdGFfQV9zcmFtX2FsbG9jIGlzIDB4JWx4KzB4JWx4XG4iLAorCQkgKGxvbmcgdW5zaWduZWQgaW50KWFkZHIsIHNpemUpOworCisJcmV0dXJuIGFkZHI7Cit9CitFWFBPUlRfU1lNQk9MKGwxX2RhdGFfQV9zcmFtX2FsbG9jKTsKKworaW50IGwxX2RhdGFfQV9zcmFtX2ZyZWUoY29uc3Qgdm9pZCAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKKwlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsCisJCQkmdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKKyNlbHNlCisJcmV0ID0gLTE7CisjZW5kaWYKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobDFfZGF0YV9BX3NyYW1fZnJlZSk7CisKK3ZvaWQgKmwxX2RhdGFfQl9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQoreworI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqYWRkcjsKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKworCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAorCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9kYXRhX0Jfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKKwkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKKworCXJldHVybiBhZGRyOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChsMV9kYXRhX0Jfc3JhbV9hbGxvYyk7CisKK2ludCBsMV9kYXRhX0Jfc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCit7CisjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAorCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisjZWxzZQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChsMV9kYXRhX0Jfc3JhbV9mcmVlKTsKKwordm9pZCAqbDFfZGF0YV9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKmFkZHIgPSBsMV9kYXRhX0Ffc3JhbV9hbGxvYyhzaXplKTsKKworCWlmICghYWRkcikKKwkJYWRkciA9IGwxX2RhdGFfQl9zcmFtX2FsbG9jKHNpemUpOworCisJcmV0dXJuIGFkZHI7Cit9CitFWFBPUlRfU1lNQk9MKGwxX2RhdGFfc3JhbV9hbGxvYyk7CisKK3ZvaWQgKmwxX2RhdGFfc3JhbV96YWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqYWRkciA9IGwxX2RhdGFfc3JhbV9hbGxvYyhzaXplKTsKKworCWlmIChhZGRyKQorCQltZW1zZXQoYWRkciwgMHgwMCwgc2l6ZSk7CisKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0wobDFfZGF0YV9zcmFtX3phbGxvYyk7CisKK2ludCBsMV9kYXRhX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQoreworCWludCByZXQ7CisJcmV0ID0gbDFfZGF0YV9BX3NyYW1fZnJlZShhZGRyKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXQgPSBsMV9kYXRhX0Jfc3JhbV9mcmVlKGFkZHIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGwxX2RhdGFfc3JhbV9mcmVlKTsKKwordm9pZCAqbDFfaW5zdF9zcmFtX2FsbG9jKHNpemVfdCBzaXplKQoreworI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKmFkZHI7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7CisKKwlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCisJCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9pbnN0X3NyYW1fYWxsb2MgaXMgMHglbHgrMHglbHhcbiIsCisJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSk7CisKKwlyZXR1cm4gYWRkcjsKKyNlbHNlCisJcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wobDFfaW5zdF9zcmFtX2FsbG9jKTsKKworaW50IGwxX2luc3Rfc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCit7CisjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCisJCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisjZWxzZQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChsMV9pbnN0X3NyYW1fZnJlZSk7CisKKy8qIEwxIFNjcmF0Y2hwYWQgbWVtb3J5IGFsbG9jYXRlIGZ1bmN0aW9uICovCit2b2lkICpsMXNyYW1fYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICphZGRyOworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX3NzcmFtX2hlYWQsCisJCQkmdXNlZF9sMV9zc3JhbV9oZWFkKTsKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGFkZHI7Cit9CisKKy8qIEwxIFNjcmF0Y2hwYWQgbWVtb3J5IGFsbG9jYXRlIGZ1bmN0aW9uICovCit2b2lkICpsMXNyYW1fYWxsb2NfbWF4KHNpemVfdCAqcHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICphZGRyOworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jX21heCgmZnJlZV9sMV9zc3JhbV9oZWFkLAorCQkJJnVzZWRfbDFfc3NyYW1faGVhZCwgcHNpemUpOworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogTDEgU2NyYXRjaHBhZCBtZW1vcnkgZnJlZSBmdW5jdGlvbiAqLworaW50IGwxc3JhbV9mcmVlKGNvbnN0IHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9zc3JhbV9oZWFkLAorCQkJJnVzZWRfbDFfc3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKmwyX3NyYW1fYWxsb2Moc2l6ZV90IHNpemUpCit7CisjaWYgTDJfTEVOR1RIICE9IDAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKmFkZHI7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmwyX3NyYW1fbG9jaywgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wyX3NyYW1faGVhZCwKKwkJCSZ1c2VkX2wyX3NyYW1faGVhZCk7CisKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDJfc3JhbV9sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiQWxsb2NhdGVkIGFkZHJlc3MgaW4gbDJfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKKwkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKKworCXJldHVybiBhZGRyOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChsMl9zcmFtX2FsbG9jKTsKKwordm9pZCAqbDJfc3JhbV96YWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqYWRkciA9IGwyX3NyYW1fYWxsb2Moc2l6ZSk7CisKKwlpZiAoYWRkcikKKwkJbWVtc2V0KGFkZHIsIDB4MDAsIHNpemUpOworCisJcmV0dXJuIGFkZHI7Cit9CitFWFBPUlRfU1lNQk9MKGwyX3NyYW1femFsbG9jKTsKKworaW50IGwyX3NyYW1fZnJlZShjb25zdCB2b2lkICphZGRyKQoreworI2lmIEwyX0xFTkdUSCAhPSAwCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsMl9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDJfc3JhbV9oZWFkLAorCQkJJnVzZWRfbDJfc3JhbV9oZWFkKTsKKworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMl9zcmFtX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisjZWxzZQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChsMl9zcmFtX2ZyZWUpOworCitpbnQgc3JhbV9mcmVlX3dpdGhfbHNsKGNvbnN0IHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKmxzbCwgKip0bXA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKworCWZvciAodG1wID0gJm1tLT5jb250ZXh0LnNyYW1fbGlzdDsgKnRtcDsgdG1wID0gJigqdG1wKS0+bmV4dCkKKwkJaWYgKCgqdG1wKS0+YWRkciA9PSBhZGRyKQorCQkJZ290byBmb3VuZDsKKwlyZXR1cm4gLTE7Citmb3VuZDoKKwlsc2wgPSAqdG1wOworCXNyYW1fZnJlZShhZGRyKTsKKwkqdG1wID0gbHNsLT5uZXh0OworCWtmcmVlKGxzbCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3JhbV9mcmVlX3dpdGhfbHNsKTsKKwordm9pZCAqc3JhbV9hbGxvY193aXRoX2xzbChzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwl2b2lkICphZGRyID0gTlVMTDsKKwlzdHJ1Y3Qgc3JhbV9saXN0X3N0cnVjdCAqbHNsID0gTlVMTDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCisJbHNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxzbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZmxhZ3MgJiBMMV9JTlNUX1NSQU0pCisJCWFkZHIgPSBsMV9pbnN0X3NyYW1fYWxsb2Moc2l6ZSk7CisKKwlpZiAoYWRkciA9PSBOVUxMICYmIChmbGFncyAmIEwxX0RBVEFfQV9TUkFNKSkKKwkJYWRkciA9IGwxX2RhdGFfQV9zcmFtX2FsbG9jKHNpemUpOworCisJaWYgKGFkZHIgPT0gTlVMTCAmJiAoZmxhZ3MgJiBMMV9EQVRBX0JfU1JBTSkpCisJCWFkZHIgPSBsMV9kYXRhX0Jfc3JhbV9hbGxvYyhzaXplKTsKKworCWlmIChhZGRyID09IE5VTEwgJiYgKGZsYWdzICYgTDJfU1JBTSkpCisJCWFkZHIgPSBsMl9zcmFtX2FsbG9jKHNpemUpOworCisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlrZnJlZShsc2wpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbHNsLT5hZGRyID0gYWRkcjsKKwlsc2wtPmxlbmd0aCA9IHNpemU7CisJbHNsLT5uZXh0ID0gbW0tPmNvbnRleHQuc3JhbV9saXN0OworCW1tLT5jb250ZXh0LnNyYW1fbGlzdCA9IGxzbDsKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woc3JhbV9hbGxvY193aXRoX2xzbCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworLyogT25jZSB3ZSBnZXQgYSByZWFsIGFsbG9jYXRvciwgd2UnbGwgdGhyb3cgYWxsIG9mIHRoaXMgYXdheS4KKyAqIFVudGlsIHRoZW4sIHdlIG5lZWQgc29tZSBzb3J0IG9mIHZpc2liaWxpdHkgaW50byB0aGUgTDEgYWxsb2MuCisgKi8KKy8qIE5lZWQgdG8ga2VlcCBsaW5lIG9mIG91dHB1dCB0aGUgc2FtZS4gIEN1cnJlbnRseSwgdGhhdCBpcyA0NCBieXRlcworICogKGluY2x1ZGluZyBuZXdsaW5lKS4KKyAqLworc3RhdGljIGludCBfc3JhbV9wcm9jX3JlYWQoY2hhciAqYnVmLCBpbnQgKmxlbiwgaW50IGNvdW50LCBjb25zdCBjaGFyICpkZXNjLAorCQlzdHJ1Y3Qgc3JhbV9waWVjZSAqcGZyZWVfaGVhZCwKKwkJc3RydWN0IHNyYW1fcGllY2UgKnB1c2VkX2hlYWQpCit7CisJc3RydWN0IHNyYW1fcGllY2UgKnBzbG90OworCisJaWYgKCFwZnJlZV9oZWFkIHx8ICFwdXNlZF9oZWFkKQorCQlyZXR1cm4gLTE7CisKKwkqbGVuICs9IHNwcmludGYoJmJ1ZlsqbGVuXSwgIi0tLSBTUkFNICUtMTRzIFNpemUgICBQSUQgU3RhdGUgICAgIFxuIiwgZGVzYyk7CisKKwkvKiBzZWFyY2ggdGhlIHJlbGV2YW50IG1lbW9yeSBzbG90ICovCisJcHNsb3QgPSBwdXNlZF9oZWFkLT5uZXh0OworCisJd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKKwkJKmxlbiArPSBzcHJpbnRmKCZidWZbKmxlbl0sICIlcC0lcCAlMTBpICU1aSAlLTEwc1xuIiwKKwkJCXBzbG90LT5wYWRkciwgcHNsb3QtPnBhZGRyICsgcHNsb3QtPnNpemUsCisJCQlwc2xvdC0+c2l6ZSwgcHNsb3QtPnBpZCwgIkFMTE9DQVRFRCIpOworCisJCXBzbG90ID0gcHNsb3QtPm5leHQ7CisJfQorCisJcHNsb3QgPSBwZnJlZV9oZWFkLT5uZXh0OworCisJd2hpbGUgKHBzbG90ICE9IE5VTEwpIHsKKwkJKmxlbiArPSBzcHJpbnRmKCZidWZbKmxlbl0sICIlcC0lcCAlMTBpICU1aSAlLTEwc1xuIiwKKwkJCXBzbG90LT5wYWRkciwgcHNsb3QtPnBhZGRyICsgcHNsb3QtPnNpemUsCisJCQlwc2xvdC0+c2l6ZSwgcHNsb3QtPnBpZCwgIkZSRUUiKTsKKworCQlwc2xvdCA9IHBzbG90LT5uZXh0OworCX0KKworCXJldHVybiAwOworfQorc3RhdGljIGludCBzcmFtX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCWludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwOworCisJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiU2NyYXRjaHBhZCIsCisJCQkmZnJlZV9sMV9zc3JhbV9oZWFkLCAmdXNlZF9sMV9zc3JhbV9oZWFkKSkKKwkJZ290byBub3RfZG9uZTsKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKKwlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEEiLAorCQkJJmZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwKKwkJCSZ1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpKQorCQlnb3RvIG5vdF9kb25lOworI2VuZGlmCisjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCisJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBCIiwKKwkJCSZmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsCisJCQkmdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKSkKKwkJZ290byBub3RfZG9uZTsKKyNlbmRpZgorI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKKwlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBJbnN0cnVjdGlvbiIsCisJCQkmZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgJnVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpKQorCQlnb3RvIG5vdF9kb25lOworI2VuZGlmCisjaWYgTDJfTEVOR1RIICE9IDAKKwlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMiIsCisJCQkmZnJlZV9sMl9zcmFtX2hlYWQsICZ1c2VkX2wyX3NyYW1faGVhZCkpCisJCWdvdG8gbm90X2RvbmU7CisjZW5kaWYKKworCSplb2YgPSAxOworIG5vdF9kb25lOgorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNyYW1fcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwdHI7CisJcHRyID0gY3JlYXRlX3Byb2NfZW50cnkoInNyYW0iLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCk7CisJaWYgKCFwdHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9zcmFtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwdHItPm93bmVyID0gVEhJU19NT0RVTEU7CisJcHRyLT5yZWFkX3Byb2MgPSBzcmFtX3Byb2NfcmVhZDsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc3JhbV9wcm9jX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCAyZjliYmIyLi5jOGFkZWYzIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC90b29scy9idWlsZC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Rvb2xzL2J1aWxkLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CS8qIGNvbnRhaW5zIHJlYWQvd3JpdGUgKi8KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAogI2RlZmluZSBNSU5JWF9IRUFERVIgMzIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCmluZGV4IDk1MmEyNGIuLjUyZTE2YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwpAQCAtMTc4LDYgKzE3OCw3IEBACiAJdW5tYXNrX2lycShJUElfSU5UUl9WRUNUKTsKIAl1bm1hc2tfaXJxKFRJTUVSMF9JTlRSX1ZFQ1QpOwogCXByZWVtcHRfZGlzYWJsZSgpOworCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAljcHVfc2V0KGNwdSwgY3B1X29ubGluZV9tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvY3B1ZnJlcS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvY3B1ZnJlcS5jCmluZGV4IDhlNWEzY2EuLmVlMzkxZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2NwdWZyZXEuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9jcHVmcmVxLmMKQEAgLTg1LDcgKzg1LDYgQEAKIAlpbnQgcmVzdWx0OwogCiAJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCi0JcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMTAwMDAwMDsgLyogMW1zICovCiAJcG9saWN5LT5jdXIgPSBjcmlzX2ZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2NwdWZyZXEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2NwdWZyZXEuYwppbmRleCBkNTc2MzFjLi41OGJkNzFlIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9jcHVmcmVxLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvY3B1ZnJlcS5jCkBAIC04MSw3ICs4MSw2IEBACiAJaW50IHJlc3VsdDsKIAogCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLwotCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CiAJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwMDA7CS8qIDFtcyAqLwogCXBvbGljeS0+Y3VyID0gY3Jpc19mcmVxX2dldF9jcHVfZnJlcXVlbmN5KDApOwogCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvcG0uYyBiL2FyY2gvZnJ2L2tlcm5lbC9wbS5jCmluZGV4IGQxMTEzYzUuLmJlNzIyZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wbS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9wbS5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gdHJ5X3NldF9jbW9kZShuZXdfY21vZGUpPzoqbGVucDsKIH0KIAotc3RhdGljIGludCBjbW9kZV9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgaW50IGNtb2RlX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CkBAIC0zMTQsNyArMzE0LDcgQEAKIAlyZXR1cm4gdHJ5X3NldF9wMChuZXdfcDApPzoqbGVucDsKIH0KIAotc3RhdGljIGludCBwMF9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgaW50IHAwX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLAogCQkgICAgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCSAgICAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTM1OCw3ICszNTgsNyBAQAogCXJldHVybiB0cnlfc2V0X2NtKG5ld19jbSk/OipsZW5wOwogfQogCi1zdGF0aWMgaW50IGNtX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK3N0YXRpYyBpbnQgY21fc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsCiAJCSAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEtbm9tbXUuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLW5vbW11LmMKaW5kZXggNjRlZTU4ZC4uNTJmZjlhZSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEtbm9tbXUuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS1ub21tdS5jCkBAIC0xMTEsNyArMTExLDcgQEAKICAqIFRoZSAzMi1iaXQgYnVzIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgogICoKICAqIE9uY2UgdGhlIGRldmljZSBpcyBnaXZlbiB0aGUgZG1hIGFkZHJlc3MsIHRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeQotICogdW50aWwgZWl0aGVyIHBjaV91bm1hcF9zaW5nbGUgb3IgcGNpX2RtYV9zeW5jX3NpbmdsZSBpcyBwZXJmb3JtZWQuCisgKiB1bnRpbCBlaXRoZXIgZG1hX3VubWFwX3NpbmdsZSBvciBwY2lfZG1hX3N5bmNfc2luZ2xlIGlzIHBlcmZvcm1lZC4KICAqLwogZG1hX2FkZHJfdCBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCiAJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKQEAgLTEyOSw3ICsxMjksNyBAQAogLyoKICAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0dGVybGlzdCBpbiBzdHJlYW1pbmcKICAqIG1vZGUgZm9yIERNQS4gIFRoaXMgaXMgdGhlIHNjYXRoZXItZ2F0aGVyIHZlcnNpb24gb2YgdGhlCi0gKiBhYm92ZSBwY2lfbWFwX3NpbmdsZSBpbnRlcmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0CisgKiBhYm92ZSBkbWFfbWFwX3NpbmdsZSBpbnRlcmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0CiAgKiBlbGVtZW50cyBhcmUgZWFjaCB0YWdnZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZG1hIGFkZHJlc3MKICAqIGFuZCBsZW5ndGguICBUaGV5IGFyZSBvYnRhaW5lZCB2aWEgc2dfZG1hX3thZGRyZXNzLGxlbmd0aH0oU0cpLgogICoKQEAgLTEzOSw3ICsxMzksNyBAQAogICogICAgICAgVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkZHIvbGVuZ3RoIHBhaXJzIGFjdHVhbGx5CiAgKiAgICAgICB1c2VkLCBhdCBtb3N0IG5lbnRzLgogICoKLSAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3IgcGNpX21hcF9zaW5nbGUgYXJlCisgKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIGRtYV9tYXBfc2luZ2xlIGFyZQogICogdGhlIHNhbWUgaGVyZS4KICAqLwogaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCkBAIC0xNTgsMyArMTU4LDIwIEBACiB9CiAKIEVYUE9SVF9TWU1CT0woZG1hX21hcF9zZyk7CisKKy8qCisgKiBNYXAgYSBzaW5nbGUgcGFnZSBvZiB0aGUgaW5kaWNhdGVkIHNpemUgZm9yIERNQSBpbiBzdHJlYW1pbmcgbW9kZS4KKyAqIFRoZSAzMi1iaXQgYnVzIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgorICoKKyAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3IgZG1hX21hcF9zaW5nbGUgYXJlCisgKiB0aGUgc2FtZSBoZXJlLgorICovCitkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJcmV0dXJuIChkbWFfYWRkcl90KSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG1hX21hcF9wYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS5jCmluZGV4IDY2MmY3YjEuLjNkZGVkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLmMKKysrIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEuYwpAQCAtNjEsNyArNjEsNyBAQAogLyoKICAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0dGVybGlzdCBpbiBzdHJlYW1pbmcKICAqIG1vZGUgZm9yIERNQS4gIFRoaXMgaXMgdGhlIHNjYXRoZXItZ2F0aGVyIHZlcnNpb24gb2YgdGhlCi0gKiBhYm92ZSBwY2lfbWFwX3NpbmdsZSBpbnRlcmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0CisgKiBhYm92ZSBkbWFfbWFwX3NpbmdsZSBpbnRlcmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0CiAgKiBlbGVtZW50cyBhcmUgZWFjaCB0YWdnZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZG1hIGFkZHJlc3MKICAqIGFuZCBsZW5ndGguICBUaGV5IGFyZSBvYnRhaW5lZCB2aWEgc2dfZG1hX3thZGRyZXNzLGxlbmd0aH0oU0cpLgogICoKQEAgLTcxLDcgKzcxLDcgQEAKICAqICAgICAgIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyL2xlbmd0aCBwYWlycyBhY3R1YWxseQogICogICAgICAgdXNlZCwgYXQgbW9zdCBuZW50cy4KICAqCi0gKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIHBjaV9tYXBfc2luZ2xlIGFyZQorICogRGV2aWNlIG93bmVyc2hpcCBpc3N1ZXMgYXMgbWVudGlvbmVkIGFib3ZlIGZvciBkbWFfbWFwX3NpbmdsZSBhcmUKICAqIHRoZSBzYW1lIGhlcmUuCiAgKi8KIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLApAQCAtMTA1LDYgKzEwNSwxMyBAQAogCiBFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOwogCisvKgorICogTWFwIGEgc2luZ2xlIHBhZ2Ugb2YgdGhlIGluZGljYXRlZCBzaXplIGZvciBETUEgaW4gc3RyZWFtaW5nIG1vZGUuCisgKiBUaGUgMzItYml0IGJ1cyBhZGRyZXNzIHRvIHVzZSBpcyByZXR1cm5lZC4KKyAqCisgKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIGRtYV9tYXBfc2luZ2xlIGFyZQorICogdGhlIHNhbWUgaGVyZS4KKyAqLwogZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmMKaW5kZXggZWRhZTExNy4uNDNkNjc1MyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1mcnYuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5jCkBAIC0yMDEsMzggKzIwMSw2IEBACiAJcGNpYmlvc19hc3NpZ25fcmVzb3VyY2VzKCk7CiB9CiAKLWludCBwY2liaW9zX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCi17Ci0JdTE2IGNtZCwgb2xkX2NtZDsKLQlpbnQgaWR4OwotCXN0cnVjdCByZXNvdXJjZSAqcjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwotCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQotCQkJY29udGludWU7Ci0KLQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07Ci0JCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JaWYgKGNtZCAhPSBvbGRfY21kKSB7Ci0JCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqICBJZiB3ZSBzZXQgdXAgYSBkZXZpY2UgZm9yIGJ1cyBtYXN0ZXJpbmcsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhdGVuY3kKICAqICB0aW1lciBhcyBjZXJ0YWluIGNyYXBweSBCSU9TZXMgZm9yZ2V0IHRvIHNldCBpdCBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmggYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5oCmluZGV4IDBjN2JmMzkuLmYzZmU1NTkxIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWZydi5oCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZnJ2LmgKQEAgLTI5LDcgKzI5LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgcGNpYmlvc19tYXhfbGF0ZW5jeTsKIAogdm9pZCBwY2liaW9zX3Jlc291cmNlX3N1cnZleSh2b2lkKTsKLWludCBwY2liaW9zX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50KTsKIAogLyogcGNpLXZkay5jICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktdmRrLmMgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLXZkay5jCmluZGV4IGYwMDNjZmEuLjBmNDFjM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktdmRrLmMKKysrIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS12ZGsuYwpAQCAtNDEyLDcgKzQxMiw3IEBACiB7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzaykpIDwgMCkKKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzaykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoIWRldi0+bXNpX2VuYWJsZWQpCiAJCXBjaWJpb3NfZW5hYmxlX2lycShkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbW0vaW5pdC5jIGIvYXJjaC9mcnYvbW0vaW5pdC5jCmluZGV4IDFiODUxZGIuLjA3MDgyODQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21tL2luaXQuYworKysgYi9hcmNoL2Zydi9tbS9pbml0LmMKQEAgLTg3LDggKzg3LDYgQEAKIAogCQlwa21hcF9wYWdlX3RhYmxlID0gYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwogCi0JCW1lbXNldChwa21hcF9wYWdlX3RhYmxlLCAwLCBQQUdFX1NJWkUpOwotCiAJCXBnZSA9IHN3YXBwZXJfcGdfZGlyICsgcGdkX2luZGV4X2soUEtNQVBfQkFTRSk7CiAJCXB1ZSA9IHB1ZF9vZmZzZXQocGdlLCBQS01BUF9CQVNFKTsKIAkJcG1lID0gcG1kX29mZnNldChwdWUsIFBLTUFQX0JBU0UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDM5NmFiMDUuLmM3OTY2NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTYyLDEzICs2MiwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfQlVHCisgICAgICAgIGJvb2wKKyAgICAgICAgZGVwZW5kcyBvbiBCVUcKKwogY29uZmlnIFRJTUVfTE9XX1JFUwogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAotCWRlZl9ib29sIHkKLQogY29uZmlnIE5PX0lPUE9SVAogCWRlZl9ib29sIHkKIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnLmNwdSBiL2FyY2gvaDgzMDAvS2NvbmZpZy5jcHUKaW5kZXggNTgyNzk3ZC4uYjY1ZGNmZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnLmNwdQorKysgYi9hcmNoL2g4MzAwL0tjb25maWcuY3B1CkBAIC0xLDUgKzEsNyBAQAogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgogCitzb3VyY2UgImtlcm5lbC90aW1lL0tjb25maWciCisKIGNob2ljZQogCXByb21wdCAiSDgvMzAwIHBsYXRmb3JtIgogCWRlZmF1bHQgSDgzMDBIX0dFTkVSSUMKQEAgLTExLDYgKzEzLDcgQEAKIAogY29uZmlnIEg4MzAwSF9BS0kzMDY4TkVUCiAJYm9vbCAiQUUtMzA2OC82OSIKKwlzZWxlY3QgQ09ORklHX0g4MzA2OAogCWhlbHAKIAkgIEFLSS1IOC8zMDY4RiAvIEFLSS1IOC8zMDY5RiBGbGFzaG1pY29tIExBTiBCb2FyZCBTdXBwb3J0CiAJICBNb3JlIEluZm9ybWF0aW9uLiAoSmFwYW5lc2UgT25seSkKQEAgLTIxLDYgKzI0LDcgQEAKIAogY29uZmlnIEg4MzAwSF9IOE1BWAogCWJvb2wgIkg4TUFYIgorCXNlbGVjdCBDT05GSUdfSDgzMDY4CiAJaGVscAogCSAgSDhNQVggRXZhbHVhdGlvbiBCb2FyZCBTdXBwb3J0CiAJICBNb3JlIEluZm9ybWF0aW9uLiAoSmFwYW5lc2UgT25seSkKQEAgLTI4LDYgKzMyLDcgQEAKIAogY29uZmlnIEg4MzAwSF9TSU0KIAlib29sICJIOC8zMDBIIFNpbXVsYXRvciIKKwlzZWxlY3QgQ09ORklHX0g4MzAwNwogCWhlbHAKIAkgIEdEQiBTaW11bGF0b3IgU3VwcG9ydAogCSAgTW9yZSBJbmZvcm1hdGlvbi4KQEAgLTQwLDYgKzQ1LDcgQEAKIAogY29uZmlnIEg4U19FRE9TSzI2NzQKIAlib29sICJFRE9TSy0yNjc0IgorCXNlbGVjdCBDT05GSUdfSDhTMjc2OAogCWhlbHAKIAkgIFJlbmVzYXMgRURPU0stMjY3NCBFdmFsdWF0aW9uIEJvYXJkIFN1cHBvcnQKIAkgIE1vcmUgSW5mb3JtYXRpb24uCkBAIC01NSw0NCArNjEsMzcgQEAKIAogZW5kY2hvaWNlCiAKLWlmIChIODMwMEhfR0VORVJJQyB8fCBIOFNfR0VORVJJQykKLW1lbnUgIkRldGFpbCBTZWxlY3Rpb24iCi1pZiAoSDgzMDBIX0dFTkVSSUMpCiBjaG9pY2UKIAlwcm9tcHQgIkNQVSBTZWxlY3Rpb24iCiAKIGNvbmZpZyBIODMwMDIKIAlib29sICJIOC8zMDAxLDMwMDIsMzAwMyIKKwlzZWxlY3QgQ1BVX0g4MzAwSAogCiBjb25maWcgSDgzMDA3CiAJYm9vbCAiSDgvMzAwNiwzMDA3IgorCXNlbGVjdCBDUFVfSDgzMDBICiAKIGNvbmZpZyBIODMwNDgKIAlib29sICJIOC8zMDQ0LDMwNDUsMzA0NiwzMDQ3LDMwNDgsMzA1MiIKKwlzZWxlY3QgQ1BVX0g4MzAwSAogCiBjb25maWcgSDgzMDY4CiAJYm9vbCAiSDgvMzA2NSwzMDY2LDMwNjcsMzA2OCwzMDY5IgotZW5kY2hvaWNlCi1lbmRpZgotCi1pZiAoSDhTX0dFTkVSSUMpCi1jaG9pY2UKLQlwcm9tcHQgIkNQVSBTZWxlY3Rpb24iCisJc2VsZWN0IENQVV9IODMwMEgKIAogY29uZmlnIEg4UzI2NzgKIAlib29sICJIOFMvMjY3MCwyNjczLDI2NzRSLDI2NzUsMjY3NiIKKwlzZWxlY3QgQ1BVX0g4UworCiBlbmRjaG9pY2UKLWVuZGlmCiAKIGNvbmZpZyBDUFVfQ0xPQ0sKIAlpbnQgIkNQVSBDbG9jayBGcmVxdWVuY3kgKC8xS0h6KSIKIAlkZWZhdWx0ICIyMDAwMCIKIAloZWxwCiAJICBDUFUgQ2xvY2sgRnJlcXVlbmN5IGRpdmlkZSB0byAxMDAwCi1lbmRtZW51Ci1lbmRpZgogCi1pZiAoSDgzMDBIX0dFTkVSSUMgfHwgSDhTX0dFTkVSSUMgfHwgSDgzMDBIX1NJTSB8fCBIOFNfU0lNIHx8IEg4U19FRE9TSzI2NzQpCiBjaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBleGVjdXRlcyBmcm9tIgogCS0tLWhlbHAtLS0KQEAgLTEwNyw2NSArMTA2LDggQEAKIAlib29sICJST00iCiAJaGVscAogCSAgVGhlIGtlcm5lbCB3aWxsIGJlIHJlc2lkZW50IGluIEZMQVNIL1JPTSB3aGVuIHJ1bm5pbmcuCi0KIGVuZGNob2ljZQotZW5kaWYKIAotaWYgKEg4MzAwSF9BS0kzMDY4TkVUKQotY29uZmlnIEg4MzA2OAotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIENQVV9DTE9DSwotCWludAotCWRlZmF1bHQgIjIwMDAwIgotCi1jb25maWcgUkFNS0VSTkVMCi0JYm9vbAotCWRlZmF1bHQgeQotZW5kaWYKLQotaWYgKEg4MzAwSF9IOE1BWCkKLWNvbmZpZyBIODMwNjgKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBDUFVfQ0xPQ0sKLQlpbnQKLQlkZWZhdWx0IDI1MDAwCi0KLWNvbmZpZyBSQU1LRVJORUwKLQlib29sCi0JZGVmYXVsdCB5Ci1lbmRpZgotCi1pZiAoSDgzMDBIX1NJTSkKLWNvbmZpZyBIODMwMDcKLQlib29sCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBDUFVfQ0xPQ0sKLQlpbnQKLQlkZWZhdWx0ICIxNjAwMCIKLWVuZGlmCi0KLWlmIChIOFNfRURPU0syNjc0KQotY29uZmlnIEg4UzI2NzgKLQlib29sCi0JZGVmYXVsdCB5Ci1jb25maWcgQ1BVX0NMT0NLCi0JaW50Ci0JZGVmYXVsdCAzMzAwMAotZW5kaWYKLQotaWYgKEg4U19TSU0pCi1jb25maWcgSDhTMjY3OAotCWJvb2wKLQlkZWZhdWx0IHkKLWNvbmZpZyBDUFVfQ0xPQ0sKLQlpbnQKLQlkZWZhdWx0IDMzMDAwCi1lbmRpZgogCiBjb25maWcgQ1BVX0g4MzAwSAogCWJvb2wKQEAgLTE3Nyw2ICsxMTksNDkgQEAKIAlkZXBlbmRzIG9uIEg4UzI2NzgKIAlkZWZhdWx0IHkKIAorY2hvaWNlCisJcHJvbXB0ICJUaW1lciIKK2NvbmZpZyBIODMwMF9USU1FUjgKKwlib29sICI4Yml0IHRpbWVyICgyY2ggY2FzY2FkZSkiCisJZGVwZW5kcyBvbiAoSDgzMDA3IHx8IEg4MzA2OCB8fCBIOFMyNjc4KQorCitjb25maWcgSDgzMDBfVElNRVIxNgorCWJvb2wgIjE2Yml0IHRpbWVyIgorCWRlcGVuZHMgb24gKEg4MzAwNyB8fCBIODMwNjgpCisKK2NvbmZpZyBIODMwMF9JVFUKKwlib29sICJJVFUiCisJZGVwZW5kcyBvbiAoSDgzMDAyIHx8IEg4MzA0OCkKKworY29uZmlnIEg4MzAwX1RQVQorCWJvb2wgIlRQVSIKKwlkZXBlbmRzIG9uIEg4UzI2NzgKK2VuZGNob2ljZQorCitpZiBIODMwMF9USU1FUjgKK2Nob2ljZQorCXByb21wdCAiVGltZXIgQ2hhbm5lbCIKK2NvbmZpZyBIODMwMF9USU1FUjhfQ0gwCisJYm9vbCAiQ2hhbm5lbCAwIgorY29uZmlnIEg4MzAwX1RJTUVSOF9DSDIKKwlib29sICJDaGFubmVsIDIiCisJZGVwZW5kcyBvbiBDUFVfSDgzMDBICitlbmRjaG9pY2UKK2VuZGlmCisKK2NvbmZpZyBIODMwMF9USU1FUjE2X0NICisJaW50ICIxNmJpdCB0aW1lciBjaGFubmVsICgwIC0gMikiCisJZGVwZW5kcyBvbiBIODMwMF9USU1FUjE2CisJcmFuZ2UgMCAyCisKK2NvbmZpZyBIODMwMF9JVFVfQ0gKKwlpbnQgIklUVSBjaGFubmVsIgorCWRlcGVuZHMgb24gSDgzMDBfSVRVCisKK2NvbmZpZyBIODMwMF9UUFVfQ0gKKwlpbnQgIlRQVSBjaGFubmVsIgorCWRlcGVuZHMgb24gSDgzMDBfVFBVCisKIGNvbmZpZyBQUkVFTVBUCiAJYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hLm91dC5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hLm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWQ3ODBmLi4wMDAwMDAwCi0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgX19IODMwMF9BX09VVF9IX18KLSNkZWZpbmUgX19IODMwMF9BX09VVF9IX18KLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0gIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYgLyogX19IODMwMF9BX09VVF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnVnLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J1Zy5oCmluZGV4IGVkZGRmNWIuLjg4N2MxOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnVnLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9idWcuaApAQCAtMSw0ICsxLDggQEAKICNpZm5kZWYgX0g4MzAwX0JVR19ICiAjZGVmaW5lIF9IODMwMF9CVUdfSAorCisvKiBhbHdheXMgdHJ1ZSAqLworI2RlZmluZSBpc192YWxpZF9idWdhZGRyKGFkZHIpICgxKQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGE4YjU3ZDEuLjk0ZTIyODQgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9lbGYuaApAQCAtNTUsNyArNTUsNyBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQogCiAjZGVmaW5lIFJfSDhfTk9ORSAgICAgICAwCiAjZGVmaW5lIFJfSDhfRElSMzIgICAgICAxCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggMjZkYzZjYy4uMzNlODQyZiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vaW8uaApAQCAtMjk1LDYgKzI5NSw0MCBAQAogICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKWFkZHIgPSBiOwogfQogCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGN0cmxfYmNscihpbnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChiKSkKKwkJc3dpdGNoIChiKSB7CisJCWNhc2UgMDogX19hc21fXygiYmNsciAjMCxAJTAiOjoiciIoYWRkcikpOyBicmVhazsKKwkJY2FzZSAxOiBfX2FzbV9fKCJiY2xyICMxLEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQljYXNlIDI6IF9fYXNtX18oImJjbHIgIzIsQCUwIjo6InIiKGFkZHIpKTsgYnJlYWs7CisJCWNhc2UgMzogX19hc21fXygiYmNsciAjMyxAJTAiOjoiciIoYWRkcikpOyBicmVhazsKKwkJY2FzZSA0OiBfX2FzbV9fKCJiY2xyICM0LEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQljYXNlIDU6IF9fYXNtX18oImJjbHIgIzUsQCUwIjo6InIiKGFkZHIpKTsgYnJlYWs7CisJCWNhc2UgNjogX19hc21fXygiYmNsciAjNixAJTAiOjoiciIoYWRkcikpOyBicmVhazsKKwkJY2FzZSA3OiBfX2FzbV9fKCJiY2xyICM3LEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQl9CisJZWxzZQorCQlfX2FzbV9fKCJiY2xyICV3MCxAJTEiOjoiciIoYiksICJyIihhZGRyKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY3RybF9ic2V0KGludCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGIpKQorCQlzd2l0Y2ggKGIpIHsKKwkJY2FzZSAwOiBfX2FzbV9fKCJic2V0ICMwLEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQljYXNlIDE6IF9fYXNtX18oImJzZXQgIzEsQCUwIjo6InIiKGFkZHIpKTsgYnJlYWs7CisJCWNhc2UgMjogX19hc21fXygiYnNldCAjMixAJTAiOjoiciIoYWRkcikpOyBicmVhazsKKwkJY2FzZSAzOiBfX2FzbV9fKCJic2V0ICMzLEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQljYXNlIDQ6IF9fYXNtX18oImJzZXQgIzQsQCUwIjo6InIiKGFkZHIpKTsgYnJlYWs7CisJCWNhc2UgNTogX19hc21fXygiYnNldCAjNSxAJTAiOjoiciIoYWRkcikpOyBicmVhazsKKwkJY2FzZSA2OiBfX2FzbV9fKCJic2V0ICM2LEAlMCI6OiJyIihhZGRyKSk7IGJyZWFrOworCQljYXNlIDc6IF9fYXNtX18oImJzZXQgIzcsQCUwIjo6InIiKGFkZHIpKTsgYnJlYWs7CisJCX0KKwllbHNlCisJCV9fYXNtX18oImJzZXQgJXcwLEAlMSI6OiJyIihiKSwgInIiKGFkZHIpKTsKK30KKwogLyogUGFnZXMgdG8gcGh5c2ljYWwgYWRkcmVzcy4uLiAqLwogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkgICAgICAoKHBhZ2UgLSBtZW1fbWFwKSA8PCBQQUdFX1NISUZUKQogI2RlZmluZSBwYWdlX3RvX2J1cyhwYWdlKSAgICAgICAoKHBhZ2UgLSBtZW1fbWFwKSA8PCBQQUdFX1NISUZUKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9tZC5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9tZC5oCmluZGV4IDFhNDdkYzYuLjFiNzMwMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vbWQuaAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL21kLmgKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IG1kLmgsdiAxLjEgMjAwMi8xMS8xOSAwMjowOToyNiBnZXJnIEV4cCAkCisvKgogICogbWQuaDogSGlnaCBzcGVlZCB4b3JfYmxvY2sgb3BlcmF0aW9uIGZvciBSQUlENC81IAogICoKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggNGI4ZTQ3NS4uZDk4ZDk3NiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xNTUsNCArMTU1LDYgQEAKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCit2b2lkIGRpZShjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpmcCwgdW5zaWduZWQgbG9uZyBlcnIpOworCiAjZW5kaWYgLyogX0g4MzAwX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCmluZGV4IDZjMjQ4YzMuLjhkNGQyYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCkBAIC03LDYgKzcsNiBAQAogb2JqLXkgOj0gcHJvY2Vzcy5vIHRyYXBzLm8gcHRyYWNlLm8gaXJxLm8gXAogCSBzeXNfaDgzMDAubyB0aW1lLm8gc2lnbmFsLm8gXAogICAgICAgICAgc2V0dXAubyBncGlvLm8gaW5pdF90YXNrLm8gc3lzY2FsbHMubyBcCi0JIGVudHJ5Lm8KKwkgZW50cnkubyB0aW1lci8KIAogb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vIGg4MzAwX2tzeW1zLm8gCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCmluZGV4IDRmZDcxMzguLmNmYzkxMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL21vZHVsZS5jCkBAIC0xMTQsOSArMTE0LDEwIEBACiAJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQogewotCXJldHVybiAwOworCXJldHVybiBtb2R1bGVfYnVnX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbWUpOwogfQogCiB2b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQogeworCW1vZHVsZV9idWdfY2xlYW51cChtb2QpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGRmYmU3YWIuLmE4ZWY2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWUuYyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWUuYwppbmRleCBlMzdjODM1Li43ZjJkNmNmIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZS5jCkBAIC0yNywyNyArMjcsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdGFyZ2V0X3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KIAogI2RlZmluZQlUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCiAKLS8qCi0gKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCi0gKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawotICovCi1zdGF0aWMgdm9pZCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3ZvaWQgaDgzMDBfdGltZXJfdGljayh2b2lkKQogewotCS8qIG1heSBuZWVkIHRvIGtpY2sgdGhlIGhhcmR3YXJlIHRpbWVyICovCi0JcGxhdGZvcm1fdGltZXJfZW9pKCk7Ci0KKwlpZiAoY3VycmVudC0+cGlkKQorCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CiAJZG9fdGltZXIoMSk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOwotI2VuZGlmCi0JcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7CiB9CiAKLXZvaWQgdGltZV9pbml0KHZvaWQpCit2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjOwogCkBAIC01NywxMiArNTEsMTMgQEAKIAl5ZWFyID0gMTk4MDsKIAltb24gPSBkYXkgPSAxOwogCWhvdXIgPSBtaW4gPSBzZWMgPSAwOwotCXBsYXRmb3JtX2dldHRvZCAoJnllYXIsICZtb24sICZkYXksICZob3VyLCAmbWluLCAmc2VjKTsKLQorI2lmZGVmIENPTkZJR19IODMwMF9HRVRUT0QKKwloODMwMF9nZXR0b2QgKCZ5ZWFyLCAmbW9uLCAmZGF5LCAmaG91ciwgJm1pbiwgJnNlYyk7CisjZW5kaWYKIAlpZiAoKHllYXIgKz0gMTkwMCkgPCAxOTcwKQogCQl5ZWFyICs9IDEwMDsKIAl4dGltZS50dl9zZWMgPSBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKIAl4dGltZS50dl9uc2VjID0gMDsKIAotCXBsYXRmb3JtX3RpbWVyX3NldHVwKHRpbWVyX2ludGVycnVwdCk7CisJaDgzMDBfdGltZXJfc2V0dXAoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL01ha2VmaWxlIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmMDUxMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyBoODMwMCBpbnRlcm5hbCB0aW1lciBoYW5kbGVyCisKK29iai0kKENPTkZJR19IODMwMF9USU1FUjgpICA6PSB0aW1lcjgubworb2JqLSQoQ09ORklHX0g4MzAwX1RJTUVSMTYpIDo9IHRpbWVyMTYubworb2JqLSQoQ09ORklHX0g4MzAwX0lUVSkgICAgIDo9IGl0dS5vCitvYmotJChDT05GSUdfSDgzMDBfVFBVKSAgICAgOj0gdHB1Lm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL2l0dS5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvaXR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjOTI2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL2l0dS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvaXR1LmMKKyAqCisgKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvZ2UuanA+CisgKgorICogIElUVSBUaW1lciBIYW5kbGVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorCisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3JlZ3MzMDZ4Lmg+CisKKyNpZiBDT05GSUdfSDgzMDBfSVRVX0NIID09IDAKKyNkZWZpbmUgSVRVQkFTRQkweGZmZmY2NAorI2RlZmluZSBJVFVJUlEJMjQKKyNlbGlmIENPTkZJR19IODMwMF9JVFVfQ0ggPT0gMQorI2RlZmluZSBJVFVCQVNFCTB4ZmZmZjZlCisjZGVmaW5lIElUVUlSUQkyOAorI2VsaWYgQ09ORklHX0g4MzAwX0lUVV9DSCA9PSAyCisjZGVmaW5lIElUVUJBU0UJMHhmZmZmNzgKKyNkZWZpbmUgSVRVSVJRCTMyCisjZWxpZiBDT05GSUdfSDgzMDBfSVRVX0NIID09IDMKKyNkZWZpbmUgSVRVQkFTRQkweGZmZmY4MgorI2RlZmluZSBJVFVJUlEJMzYKKyNlbGlmIENPTkZJR19IODMwMF9JVFVfQ0ggPT0gNAorI2RlZmluZSBJVFVCQVNFCTB4ZmZmZjkyCisjZGVmaW5lIElUVUlSUQk0MAorI2Vsc2UKKyNlcnJvciBVbmtub3duIHRpbWVyIGNoYW5uZWwuCisjZW5kaWYKKworI2RlZmluZSBUQ1IJMAorI2RlZmluZSBUSU9SCTEKKyNkZWZpbmUgVElFUgkyCisjZGVmaW5lIFRTUgkzCisjZGVmaW5lIFRDTlQJNAorI2RlZmluZSBHUkEJNgorI2RlZmluZSBHUkIJOAorCitzdGF0aWMgaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwloODMwMF90aW1lcl90aWNrKCk7CisJY3RybF9iY2xyKElNRkEsIElUVUJBU0UgKyBUU1IpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXR1X2lycSA9IHsKKwkubmFtZQkJPSAiaXR1IiwKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSBkaXZpZGVfcmF0ZVtdID0gezEsIDIsIDQsIDh9OworCit2b2lkIF9faW5pdCBoODMwMF90aW1lcl9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IGNudDsKKworCWNhbGNfcGFyYW0oY250LCBkaXYsIGRpdmlkZV9yYXRlLCAweDEwMDAwKTsKKworCXNldHVwX2lycShJVFVJUlEsICZpdHVfaXJxKTsKKworCS8qIGluaXRhbGl6ZSB0aW1lciAqLworCWN0cmxfb3V0YigwLCBUU1RSKTsKKwljdHJsX291dGIoQ0NMUjAgfCBkaXYsIElUVUJBU0UgKyBUQ1IpOworCWN0cmxfb3V0YigweDAxLCBJVFVCQVNFICsgVElFUik7CisJY3RybF9vdXR3KGNudCwgSVRVQkFTRSArIEdSQSk7CisJY3RybF9ic2V0KENPTkZJR19IODMwMF9JVFVfQ0gsIFRTVFIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdGltZXIxNi5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdGltZXIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDI3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2g4MzAwL2tlcm5lbC90aW1lci90aW1lcjE2LmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2g4MzAwL2tlcm5lbC90aW1lci90aW1lcjE2LmMKKyAqCisgKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvZ2UuanA+CisgKgorICogIDE2Yml0IFRpbWVyIEhhbmRsZXIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisKKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KKworLyogMTZiaXQgdGltZXIgKi8KKyNpZiBDT05GSUdfSDgzMDBfVElNRVIxNl9DSCA9PSAwCisjZGVmaW5lIF8xNkJBU0UJMHhmZmZmNzgKKyNkZWZpbmUgXzE2SVJRCTI0CisjZWxpZiBDT05GSUdfSDgzMDBfVElNRVIxNl9DSCA9PSAxCisjZGVmaW5lIF8xNkJBU0UJMHhmZmZmODAKKyNkZWZpbmUgXzE2SVJRCTI4CisjZWxpZiBDT05GSUdfSDgzMDBfVElNRVIxNl9DSCA9PSAyCisjZGVmaW5lIF8xNkJBU0UJMHhmZmZmODgKKyNkZWZpbmUgXzE2SVJRCTMyCisjZWxzZQorI2Vycm9yIFVua25vd24gdGltZXIgY2hhbm5lbC4KKyNlbmRpZgorCisjZGVmaW5lIFRDUgkwCisjZGVmaW5lIFRJT1IJMQorI2RlZmluZSBUQ05UCTIKKyNkZWZpbmUgR1JBCTQKKyNkZWZpbmUgR1JCCTYKKworI2RlZmluZSBIODMwMF9USU1FUl9GUkVRIENPTkZJR19DUFVfQ0xPQ0sqMTAwMDAgLyogVGltZXIgaW5wdXQgZnJlcS4gKi8KKworc3RhdGljIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaDgzMDBfdGltZXJfdGljaygpOworCWN0cmxfYmNscihDT05GSUdfSDgzMDBfVElNRVIxNl9DSCwgVElTUkEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXIxNl9pcnEgPSB7CisJLm5hbWUJCT0gInRpbWVyLTE2IiwKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSBkaXZpZGVfcmF0ZVtdID0gezEsIDIsIDQsIDh9OworCit2b2lkIF9faW5pdCBoODMwMF90aW1lcl9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IGNudDsKKworCWNhbGNfcGFyYW0oY250LCBkaXYsIGRpdmlkZV9yYXRlLCAweDEwMDAwKTsKKworCXNldHVwX2lycShfMTZJUlEsICZ0aW1lcjE2X2lycSk7CisKKwkvKiBpbml0YWxpemUgdGltZXIgKi8KKwljdHJsX291dGIoMCwgVFNUUik7CisJY3RybF9vdXRiKENDTFIwIHwgZGl2LCBfMTZCQVNFICsgVENSKTsKKwljdHJsX291dHcoY250LCBfMTZCQVNFICsgR1JBKTsKKwljdHJsX2JzZXQoNCArIENPTkZJR19IODMwMF9USU1FUjE2X0NILCBUSVNSQSk7CisJY3RybF9ic2V0KENPTkZJR19IODMwMF9USU1FUjE2X0NILCBUU1RSKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyOC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdGltZXI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1NmQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3RpbWVyL3RpbWVyOC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogIGxpbnV4L2FyY2gvaDgzMDAva2VybmVsL2NwdS90aW1lci90aW1lcjguYworICoKKyAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9nZS5qcD4KKyAqCisgKiAgOGJpdCBUaW1lciBIYW5kbGVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4MzAwSCkKKyNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IOFMpCisjaW5jbHVkZSA8YXNtL3JlZ3MyNjd4Lmg+CisjZW5kaWYKKworLyogOGJpdCB0aW1lciB4MiAqLworI2RlZmluZSBDTUZBCTYKKworI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwX1RJTUVSOF9DSDApCisjZGVmaW5lIF84QkFTRQlfOFRDUjAKKyNpZmRlZiBDT05GSUdfQ1BVX0g4MzAwSAorI2RlZmluZSBfOElSUQkzNgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9IOFMKKyNkZWZpbmUgXzhJUlEJNzIKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfSDgzMDBfVElNRVI4X0NIMikKKyNpZmRlZiBDT05GSUdfQ1BVX0g4MzAwSAorI2RlZmluZSBfOEJBU0UJXzhUQ1IyCisjZGVmaW5lIF84SVJRCTQwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF84QkFTRQorI2Vycm9yIFVua25vd24gdGltZXIgY2hhbm5lbC4KKyNlbmRpZgorCisjZGVmaW5lIF84VENSCTAKKyNkZWZpbmUgXzhUQ1NSCTIKKyNkZWZpbmUgVENPUkEJNAorI2RlZmluZSBUQ09SQgk2CisjZGVmaW5lIF84VENOVAk4CisKKyNkZWZpbmUgQ01JRUEJMHg0MAorI2RlZmluZSBDQ0xSX0NNQSAweDA4CisjZGVmaW5lIENLUzIJMHgwNAorCisvKgorICogdGltZXJfaW50ZXJydXB0KCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAorICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwloODMwMF90aW1lcl90aWNrKCk7CisJY3RybF9iY2xyKENNRkEsIF84QkFTRSArIF84VENTUik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0aW1lcjhfaXJxID0geworCS5uYW1lCQk9ICJ0aW1lci04IiwKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgX19pbml0ZGF0YSBkaXZpZGVfcmF0ZVtdID0gezgsIDY0LCA4MTkyfTsKKwordm9pZCBfX2luaXQgaDgzMDBfdGltZXJfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBjbnQ7CisKKwljYWxjX3BhcmFtKGNudCwgZGl2LCBkaXZpZGVfcmF0ZSwgMHgxMDAwMCk7CisJZGl2Kys7CisKKwlzZXR1cF9pcnEoXzhJUlEsICZ0aW1lcjhfaXJxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IOFMpCisJLyogVGltZXIgbW9kdWxlIGVuYWJsZSAqLworCWN0cmxfYmNscigwLCBNU1RQQ1JMKQorI2VuZGlmCisKKwkvKiBpbml0YWxpemUgdGltZXIgKi8KKwljdHJsX291dHcoY250LCBfOEJBU0UgKyBUQ09SQSk7CisJY3RybF9vdXR3KDB4MDAwMCwgXzhCQVNFICsgXzhUQ1NSKTsKKwljdHJsX291dHcoKENNSUVBfENDTFJfQ01BfENLUzIpIDw8IDggfCBkaXYsCisJCSAgXzhCQVNFICsgXzhUQ1IpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdHB1LmMgYi9hcmNoL2g4MzAwL2tlcm5lbC90aW1lci90cHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdmNDUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdHB1LmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9oODMwMC9rZXJuZWwvdGltZXIvdHB1LmMKKyAqCisgKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPgorICoKKyAqICBUUFUgVGltZXIgSGFuZGxlcgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKworI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9yZWdzMjY3eC5oPgorCisvKiBUUFUgKi8KKyNpZiBDT05GSUdfSDgzMDBfVFBVX0NIID09IDAKKyNkZWZpbmUgVFBVQkFTRQkweGZmZmZkMAorI2RlZmluZSBUUFVJUlEJNDAKKyNlbGlmIENPTkZJR19IODMwMF9UUFVfQ0ggPT0gMQorI2RlZmluZSBUUFVCQVNFCTB4ZmZmZmUwCisjZGVmaW5lIFRQVUlSUQk0OAorI2VsaWYgQ09ORklHX0g4MzAwX1RQVV9DSCA9PSAyCisjZGVmaW5lIFRQVUJBU0UJMHhmZmZmZjAKKyNkZWZpbmUgVFBVSVJRCTUyCisjZWxpZiBDT05GSUdfSDgzMDBfVFBVX0NIID09IDMKKyNkZWZpbmUgVFBVQkFTRQkweGZmZmU4MAorI2RlZmluZSBUUFVJUlEJNTYKKyNlbGlmIENPTkZJR19IODMwMF9UUFVfQ0ggPT0gNAorI2RlZmluZSBUUFVCQVNFCTB4ZmZmZTkwCisjZGVmaW5lIFRQVUlSUQk2NAorI2Vsc2UKKyNlcnJvciBVbmtub3duIHRpbWVyIGNoYW5uZWwuCisjZW5kaWYKKworI2RlZmluZSBfVENSCTAKKyNkZWZpbmUgX1RNRFIJMQorI2RlZmluZSBfVElPUgkyCisjZGVmaW5lIF9USUVSCTQKKyNkZWZpbmUgX1RTUgk1CisjZGVmaW5lIF9UQ05UCTYKKyNkZWZpbmUgX0dSQQk4CisjZGVmaW5lIF9HUkIJMTAKKworI2RlZmluZSBDQ0xSMAkweDIwCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWg4MzAwX3RpbWVyX3RpY2soKTsKKwljdHJsX2JjbHIoMCwgVFBVQkFTRSArIF9UU1IpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdHB1X2lycSA9IHsKKwkubmFtZQkJPSAidHB1IiwKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKK307CisKK2NvbnN0IHN0YXRpYyBpbnQgX19pbml0ZGF0YSBkaXZpZGVfcmF0ZVtdID0geworI2lmIENPTkZJR19IODMwMF9UUFVfQ0ggPT0gMAorCTEsNCwxNiw2NCwwLDAsMCwwLAorI2VsaWYgKENPTkZJR19IODMwMF9UUFVfQ0ggPT0gMSkgfHwgKENPTkZJR19IODMwMF9UUFVfQ0ggPT0gNSkKKwkxLDQsMTYsNjQsMCwwLDI1NiwwLAorI2VsaWYgKENPTkZJR19IODMwMF9UUFVfQ0ggPT0gMikgfHwgKENPTkZJR19IODMwMF9UUFVfQ0ggPT0gNCkKKwkxLDQsMTYsNjQsMCwwLDAsMTAyNCwKKyNlbGlmIENPTkZJR19IODMwMF9UUFVfQ0ggPT0gMworCTEsNCwxNiw2NCwwLDEwMjQsMjU2LDQwOTYsCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IGg4MzAwX3RpbWVyX3NldHVwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNudDsKKwl1bnNpZ25lZCBpbnQgZGl2OworCisJY2FsY19wYXJhbShjbnQsIGRpdiwgZGl2aWRlX3JhdGUsIDB4MTAwMDApOworCisJc2V0dXBfaXJxKFRQVUlSUSwgJnRwdV9pcnEpOworCisJLyogVFBVIG1vZHVsZSBlbmFibGVkICovCisJY3RybF9iY2xyKDMsIE1TVFBDUkgpOworCisJY3RybF9vdXRiKDAsIFRTVFIpOworCWN0cmxfb3V0YihDQ0xSMCB8IGRpdiwgVFBVQkFTRSArIF9UQ1IpOworCWN0cmxfb3V0YigwLCBUUFVCQVNFICsgX1RNRFIpOworCWN0cmxfb3V0dygwLCBUUFVCQVNFICsgX1RJT1IpOworCWN0cmxfb3V0YigweDAxLCBUUFVCQVNFICsgX1RJRVIpOworCWN0cmxfb3V0dyhjbnQsIFRQVUJBU0UgKyBfR1JBKTsKKwljdHJsX2JzZXQoQ09ORklHX0g4MzAwX1RQVV9DSCwgVFNUUik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvdHJhcHMuYwppbmRleCBmOGY3ZDdlYS4uM2MwYjY2YiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC90cmFwcy5jCkBAIC0yMCwxMiArMjAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKIAogLyoKICAqIHRoaXMgbXVzdCBiZSBjYWxsZWQgdmVyeSBlYXJseSBhcyB0aGUga2VybmVsIG1pZ2h0CkBAIC05NCwxNiArOTYsMTkgQEAKIAlwcmludGsoIlxuXG4iKTsKIH0KIAotdm9pZCBkaWVfaWZfa2VybmVsIChjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpmcCwgaW50IG5yKQordm9pZCBkaWUoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqZnAsIHVuc2lnbmVkIGxvbmcgZXJyKQogewotCWV4dGVybiBpbnQgY29uc29sZV9sb2dsZXZlbDsKKwlzdGF0aWMgaW50IGRpZWNvdW50OwogCi0JaWYgKCEoZnAtPmNjciAmIFBTX1MpKQotCQlyZXR1cm47CisJb29wc19lbnRlcigpOwogCi0JY29uc29sZV9sb2dsZXZlbCA9IDE1OworCWNvbnNvbGVfdmVyYm9zZSgpOworCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKKwlyZXBvcnRfYnVnKGZwLT5wYywgZnApOworCXByaW50ayhLRVJOX0VNRVJHICIlczogJTA0bHggWyMlZF0gIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllY291bnQpOwogCWR1bXAoZnApOwogCisJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9tbS9mYXVsdC5jIGIvYXJjaC9oODMwMC9tbS9mYXVsdC5jCmluZGV4IDI5ZTlhZjkuLjFkMDkyYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvbW0vZmF1bHQuYworKysgYi9hcmNoL2g4MzAwL21tL2ZhdWx0LmMKQEAgLTIwLDggKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotZXh0ZXJuIHZvaWQgZGllX2lmX2tlcm5lbChjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotCiAvKgogICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcGFnZSBmYXVsdHMuICBJdCBkZXRlcm1pbmVzIHRoZSBwcm9ibGVtLCBhbmQKICAqIHRoZW4gcGFzc2VzIGl0IG9mZiB0byBvbmUgb2YgdGhlIGFwcHJvcHJpYXRlIHJvdXRpbmVzLgpAQCAtNTAsNyArNDgsOCBAQAogCX0gZWxzZQogCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgYWNjZXNzIik7CiAJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLGFkZHJlc3MpOwotCWRpZV9pZl9rZXJuZWwoIk9vcHMiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJZGllKCJPb3BzIiwgcmVncywgZXJyb3JfY29kZSk7CiAJZG9fZXhpdChTSUdLSUxMKTsKIAogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvYWtpMzA2OG5ldC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2FraTMwNjhuZXQvTWFrZWZpbGUKaW5kZXggYjAzYzMyOC4uYjdmZjc4MCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvYWtpMzA2OG5ldC9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9ha2kzMDY4bmV0L01ha2VmaWxlCkBAIC0zLDQgKzMsMyBAQAogIwogCiBleHRyYS15IDo9IGNydDBfcmFtLm8KLW9iai15IDo9IHRpbWVyLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2FraTMwNjhuZXQvdGltZXIuYyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2FraTMwNjhuZXQvdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjZDg1ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9ha2kzMDY4bmV0L3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2FraTMwNjhuZXQvdGltZXIuYwotICoKLSAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9nZS5qcD4KLSAqCi0gKiAgUGxhdGZvcm0gZGVwZW5kIFRpbWVyIEhhbmRsZXIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KLQotI2RlZmluZSBDTUZBIDYKLQotI2RlZmluZSBDTUlFQSAweDQwCi0jZGVmaW5lIENDTFJfQ01BIDB4MDgKLSNkZWZpbmUgQ0xLX0RJVjgxOTIgMHgwMwotCi0jZGVmaW5lIEg4MzAwX1RJTUVSX0ZSRVEgQ09ORklHX0NQVV9DTE9DSyoxMDAwLzgxOTIgLyogVGltZXIgaW5wdXQgZnJlcS4gKi8KLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fdGltZXJfc2V0dXAoaXJxcmV0dXJuX3QgKCp0aW1lcl9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiBzZXR1cCA4Yml0IHRpbWVyIGNoMiAqLwotCWN0cmxfb3V0YihIODMwMF9USU1FUl9GUkVRIC8gSFosIFRDT1JBMik7ICAgICAgLyogc2V0IGludGVydmFsICovCi0JY3RybF9vdXRiKDB4MDAsIF84VENTUjIpOyAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdXRwdXQgKi8KLQlyZXF1ZXN0X2lycSg0MCwgdGltZXJfaW50LCAwLCAidGltZXIiLCAwKTsKLQljdHJsX291dGIoQ01JRUF8Q0NMUl9DTUF8Q0xLX0RJVjgxOTIsIF84VENSMik7IC8qIHN0YXJ0IGNvdW50ICovCi19Ci0KLXZvaWQgcGxhdGZvcm1fdGltZXJfZW9pKHZvaWQpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopXzhUQ1NSMiAmPSB+KDEgPDwgQ01GQSk7Ci19Ci0KLXZvaWQgcGxhdGZvcm1fZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsCi0JCSBpbnQgKm1pbiwgaW50ICpzZWMpCi17Ci0JKnllYXIgPSAqbW9uID0gKmRheSA9ICpob3VyID0gKm1pbiA9ICpzZWMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZ2VuZXJpYy9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2dlbmVyaWMvTWFrZWZpbGUKaW5kZXggMzJiOTY0YS4uMmIxMmExNyAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZ2VuZXJpYy9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9nZW5lcmljL01ha2VmaWxlCkBAIC0zLDQgKzMsMyBAQAogIwogCiBleHRyYS15IDo9ICBjcnQwXyQoTU9ERUwpLm8KLW9iai15IDo9IHRpbWVyLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2dlbmVyaWMvdGltZXIuYyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2dlbmVyaWMvdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1Y2VmZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZ2VuZXJpYy90aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9nZW5lcmljL3RpbWVyLmMKLSAqCi0gKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPgotICoKLSAqICBQbGF0Zm9ybSBkZXBlbmQgVGltZXIgSGFuZGxlcgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLQotI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwNykgfHwgZGVmaW5lZChDT05GSUdfSDgzMDY4KQotI2luY2x1ZGUgPGFzbS9yZWdzMzA2eC5oPgotI2RlZmluZSBDTUZBIDYKLQotI2RlZmluZSBDTUlFQSAweDQwCi0jZGVmaW5lIENDTFJfQ01BIDB4MDgKLSNkZWZpbmUgQ0xLX0RJVjgxOTIgMHgwMwotCi0jZGVmaW5lIEg4MzAwX1RJTUVSX0ZSRVEgQ09ORklHX0NQVV9DTE9DSyoxMDAwLzgxOTIgLyogVGltZXIgaW5wdXQgZnJlcS4gKi8KLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fdGltZXJfc2V0dXAoaXJxcmV0dXJuX3QgKCp0aW1lcl9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiBzZXR1cCA4Yml0IHRpbWVyIGNoMiAqLwotCWN0cmxfb3V0YihIODMwMF9USU1FUl9GUkVRIC8gSFosIFRDT1JBMik7ICAgICAgLyogc2V0IGludGVydmFsICovCi0JY3RybF9vdXRiKDB4MDAsIF84VENTUjIpOyAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdXRwdXQgKi8KLQlyZXF1ZXN0X2lycSg0MCwgdGltZXJfaW50LCAwLCAidGltZXIiLCAwKTsKLQljdHJsX291dGIoQ01JRUF8Q0NMUl9DTUF8Q0xLX0RJVjgxOTIsIF84VENSMik7IC8qIHN0YXJ0IGNvdW50ICovCi19Ci0KLXZvaWQgcGxhdGZvcm1fdGltZXJfZW9pKHZvaWQpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopXzhUQ1NSMiAmPSB+KDEgPDwgQ01GQSk7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwMikgfHwgZGVmaW5lZChDT05GSUdfSDgzMDQ4KQotLyogRklYTUUhICovCi0jZGVmaW5lIFRTVFIgMHgwMGZmZmY2MAotI2RlZmluZSBUU05DIDB4MDBmZmZmNjEKLSNkZWZpbmUgVE1EUiAweDAwZmZmZjYyCi0jZGVmaW5lIFRGQ1IgMHgwMGZmZmY2MwotI2RlZmluZSBUT0VSIDB4MDBmZmZmOTAKLSNkZWZpbmUgVE9DUiAweDAwZmZmZjkxCi0vKiBJVFUwICovCi0jZGVmaW5lIFRDUiAgMHgwMGZmZmY2NAotI2RlZmluZSBUSU9SIDB4MDBmZmZmNjUKLSNkZWZpbmUgVElFUiAweDAwZmZmZjY2Ci0jZGVmaW5lIFRTUiAgMHgwMGZmZmY2NwotI2RlZmluZSBUQ05UIDB4MDBmZmZmNjgKLSNkZWZpbmUgR1JBICAweDAwZmZmZjZhCi0jZGVmaW5lIEdSQiAgMHgwMGZmZmY2YwotCi0jZGVmaW5lIENDTFJfQ01HUkEgMHgyMAotI2RlZmluZSBDTEtfRElWOCAweDAzCi0KLSNkZWZpbmUgSDgzMDBfVElNRVJfRlJFUSBDT05GSUdfQ1BVX0NMT0NLKjEwMDAvOCAvKiBUaW1lciBpbnB1dCBmcmVxLiAqLwotCi12b2lkIF9faW5pdCBwbGF0Zm9ybV90aW1lcl9zZXR1cChpcnFyZXR1cm5fdCAoKnRpbWVyX2ludCkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQotewotCSoodW5zaWduZWQgc2hvcnQgKilHUkE9IEg4MzAwX1RJTUVSX0ZSRVEgLyBIWjsgIC8qIHNldCBpbnRlcnZhbCAqLwotCSoodW5zaWduZWQgc2hvcnQgKilUQ05UPTA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGNvdW50ZXIgKi8KLQljdHJsX291dGIoMHg4MHxDQ0xSX0NNR1JBfENMS19ESVY4LCBUQ1IpOyAgICAgICAvKiBzZXQgSVRVMCBjbG9jayAqLwotCWN0cmxfb3V0YigweDg4LCBUSU9SKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG91dHB1dCAqLwotCXJlcXVlc3RfaXJxKDI2LCB0aW1lcl9pbnQsIDAsICJ0aW1lciIsIDApOwotCWN0cmxfb3V0YigweGY5LCBUSUVSKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBhcmUgbWF0Y2ggR1JBIGludGVycnVwdCAqLwotCWN0cmxfb3V0YihjdHJsX2luYihUU05DKSAmIH4weDAxLCBUU05DKTsgICAgICAgIC8qIElUVTAgYXN5bmMgKi8KLQljdHJsX291dGIoY3RybF9pbmIoVE1EUikgJiB+MHgwMSwgVE1EUik7ICAgICAgICAvKiBJVFUwIG5vcm1hbCBtb2RlICovCi0JY3RybF9vdXRiKGN0cmxfaW5iKFRTVFIpIHwgMHgwMSwgVFNUUik7ICAgICAgICAgLyogSVRVMCBTdGFydCAqLwotCXJldHVybiAwOwotfQotCi12b2lkIHBsYXRmb3JtX3RpbWVyX2VvaSh2b2lkKQotewotCWN0cmxfb3V0YihjdHJsX2luYihUU1IpICYgfjB4MDEsVFNSKTsKLX0KLSNlbmRpZgotCi12b2lkIHBsYXRmb3JtX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLAotCQkgaW50ICptaW4sIGludCAqc2VjKQotewotCSp5ZWFyID0gKm1vbiA9ICpkYXkgPSAqaG91ciA9ICptaW4gPSAqc2VjID0gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2g4bWF4L01ha2VmaWxlIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvTWFrZWZpbGUKaW5kZXggYjAzYzMyOC4uYjdmZjc4MCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvTWFrZWZpbGUKQEAgLTMsNCArMywzIEBACiAjCiAKIGV4dHJhLXkgOj0gY3J0MF9yYW0ubwotb2JqLXkgOj0gdGltZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvdGltZXIuYyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2g4bWF4L3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTU3NGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaDhtYXgvdGltZXIuYwotICoKLSAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9nZS5qcD4KLSAqCi0gKiAgUGxhdGZvcm0gZGVwZW5kIFRpbWVyIEhhbmRsZXIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KLQotI2RlZmluZSBDTUZBIDYKLQotI2RlZmluZSBDTUlFQSAweDQwCi0jZGVmaW5lIENDTFJfQ01BIDB4MDgKLSNkZWZpbmUgQ0xLX0RJVjgxOTIgMHgwMwotCi0jZGVmaW5lIEg4MzAwX1RJTUVSX0ZSRVEgQ09ORklHX0NQVV9DTE9DSyoxMDAwLzgxOTIgLyogVGltZXIgaW5wdXQgZnJlcS4gKi8KLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fdGltZXJfc2V0dXAoaXJxcmV0dXJuX3QgKCp0aW1lcl9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiBzZXR1cCA4Yml0IHRpbWVyIGNoMiAqLwotCWN0cmxfb3V0YihIODMwMF9USU1FUl9GUkVRIC8gSFosIFRDT1JBMik7ICAgICAgLyogc2V0IGludGVydmFsICovCi0JY3RybF9vdXRiKDB4MDAsIF84VENTUjIpOyAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdXRwdXQgKi8KLQlyZXF1ZXN0X2lycSg0MCwgdGltZXJfaW50LCAwLCAidGltZXIiLCAwKTsKLQljdHJsX291dGIoQ01JRUF8Q0NMUl9DTUF8Q0xLX0RJVjgxOTIsIF84VENSMik7IC8qIHN0YXJ0IGNvdW50ICovCi19Ci0KLXZvaWQgcGxhdGZvcm1fdGltZXJfZW9pKHZvaWQpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopXzhUQ1NSMiAmPSB+KDEgPDwgQ01GQSk7Ci19Ci0KLXZvaWQgcGxhdGZvcm1fZ2V0dG9kKGludCAqeWVhciwgaW50ICptb24sIGludCAqZGF5LCBpbnQgKmhvdXIsCi0JCSBpbnQgKm1pbiwgaW50ICpzZWMpCi17Ci0JKnllYXIgPSAqbW9uID0gKmRheSA9ICpob3VyID0gKm1pbiA9ICpzZWMgPSAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lZG9zazI2NzQvTWFrZWZpbGUgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lZG9zazI2NzQvTWFrZWZpbGUKaW5kZXggZjc2MzY1NC4uOGUzNDk3MiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZWRvc2syNjc0L01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2Vkb3NrMjY3NC9NYWtlZmlsZQpAQCAtMyw0ICszLDMgQEAKICMKIAogZXh0cmEteSA6PSBjcnQwXyQoTU9ERUwpLm8KLW9iai15IDo9IHRpbWVyLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2Vkb3NrMjY3NC90aW1lci5jIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZWRvc2syNjc0L3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjE0MjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZWRvc2syNjc0L3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2Vkb3NrMjY3NC90aW1lci5jCi0gKgotICogIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KLSAqCi0gKiAgUGxhdGZvcm0gZGVwZW5kIFRpbWVyIEhhbmRsZXIKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcmVnczI2N3guaD4KLQotI2RlZmluZSBDTUZBIDYKLQotI2RlZmluZSBDTUlFQSAweDQwCi0jZGVmaW5lIENDTFJfQ01BIDB4MDgKLSNkZWZpbmUgQ0xLX0RJVjgxOTIgMHgwMwotCi0jZGVmaW5lIEg4MzAwX1RJTUVSX0ZSRVEgQ09ORklHX0NQVV9DTE9DSyoxMDAwLzgxOTIgLyogVGltZXIgaW5wdXQgZnJlcS4gKi8KLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fdGltZXJfc2V0dXAoaXJxcmV0dXJuX3QgKCp0aW1lcl9pbnQpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkKLXsKLQkvKiA4Yml0IHRpbWVyIG1vZHVsZSBlbmFibGVkICovCi0JY3RybF9vdXRiKGN0cmxfaW5iKE1TVFBDUkwpICYgfjB4MDEsIE1TVFBDUkwpOwotCS8qIHNldHVwIDhiaXQgdGltZXIgY2gxICovCi0JY3RybF9vdXRiKEg4MzAwX1RJTUVSX0ZSRVEgLyBIWiwgXzhUQ09SQTEpOyAgICAgIC8qIHNldCBpbnRlcnZhbCAqLwotCWN0cmxfb3V0YigweDAwLCBfOFRDU1IxKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdXRwdXQgKi8KLQlyZXF1ZXN0X2lycSg3NiwgdGltZXJfaW50LCAwLCAidGltZXIiICwwKTsKLQljdHJsX291dGIoQ01JRUF8Q0NMUl9DTUF8Q0xLX0RJVjgxOTIsIF84VENSMSk7ICAgLyogc3RhcnQgY291bnQgKi8KLX0KLQotdm9pZCBwbGF0Zm9ybV90aW1lcl9lb2kodm9pZCkKLXsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilfOFRDU1IxICY9IH4oMSA8PCBDTUZBKTsKLX0KLQotdm9pZCBwbGF0Zm9ybV9nZXR0b2QoaW50ICp5ZWFyLCBpbnQgKm1vbiwgaW50ICpkYXksIGludCAqaG91ciwKLQkJIGludCAqbWluLCBpbnQgKnNlYykKLXsKLS8qIEZJWE1FISBub3QgUlRDIHN1cHBvcnQgKi8KLQkqeWVhciA9ICptb24gPSAqZGF5ID0gKmhvdXIgPSAqbWluID0gKnNlYyA9IDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9nZW5lcmljL01ha2VmaWxlIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZ2VuZXJpYy9NYWtlZmlsZQppbmRleCAwNTVkNTNhLi40NGI0Njg1IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9nZW5lcmljL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2dlbmVyaWMvTWFrZWZpbGUKQEAgLTMsNCArMywzIEBACiAjCiAKIGV4dHJhLXkgPSAgY3J0MF8kKE1PREVMKS5vCi1vYmoteSA6PSB0aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9nZW5lcmljL3RpbWVyLmMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9nZW5lcmljL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjExYzYuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZ2VuZXJpYy90aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9nZW5lcmljL3RpbWVyLmMKLSAqCi0gKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPgotICoKLSAqICBQbGF0Zm9ybSBkZXBlbmQgVGltZXIgSGFuZGxlcgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLQotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9yZWdzMjY3eC5oPgotCi0jZGVmaW5lIENNRkEgNgotCi0jZGVmaW5lIENNSUVBIDB4NDAKLSNkZWZpbmUgQ0NMUl9DTUEgMHgwOAotI2RlZmluZSBDTEtfRElWODE5MiAweDAzCi0KLSNkZWZpbmUgSDgzMDBfVElNRVJfRlJFUSBDT05GSUdfQ1BVX0NMT0NLKjEwMDAvODE5MiAvKiBUaW1lciBpbnB1dCBmcmVxLiAqLwotCi12b2lkIF9faW5pdCBwbGF0Zm9ybV90aW1lcl9zZXR1cChpcnFyZXR1cm5fdCAoKnRpbWVyX2ludCkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQotewotCS8qIDhiaXQgdGltZXIgbW9kdWxlIGVuYWJsZWQgKi8KLQljdHJsX291dGIoY3RybF9pbmIoTVNUUENSTCkgJiB+MHgwMSwgTVNUUENSTCk7Ci0JLyogc2V0dXAgOGJpdCB0aW1lciBjaDEgKi8KLQljdHJsX291dGIoSDgzMDBfVElNRVJfRlJFUSAvIEhaLCBfOFRDT1JBMSk7ICAgICAgLyogc2V0IGludGVydmFsICovCi0JY3RybF9vdXRiKDB4MDAsIF84VENTUjEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG91dHB1dCAqLwotCXJlcXVlc3RfaXJxKDc2LCB0aW1lcl9pbnQsIDAsICJ0aW1lciIgLDApOwotCWN0cmxfb3V0YihDTUlFQXxDQ0xSX0NNQXxDTEtfRElWODE5MiwgXzhUQ1IxKTsgICAvKiBzdGFydCBjb3VudCAqLwotfQotCi12b2lkIHBsYXRmb3JtX3RpbWVyX2VvaSh2b2lkKQotewotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKV84VENTUjEgJj0gfigxIDw8IENNRkEpOwotfQotCi12b2lkIHBsYXRmb3JtX2dldHRvZChpbnQgKnllYXIsIGludCAqbW9uLCBpbnQgKmRheSwgaW50ICpob3VyLAotCQkgaW50ICptaW4sIGludCAqc2VjKQotewotCSp5ZWFyID0gKm1vbiA9ICpkYXkgPSAqaG91ciA9ICptaW4gPSAqc2VjID0gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggNDhlNDk2Zi4uM2I3YWEzOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTYwLDE0ICs2MCw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCi0JYm9vbAotCWRlZmF1bHQgbgotCi1jb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0Ci0JYm9vbAotCWRlZmF1bHQgbgotCiBjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEUKIAlib29sCiAJZGVwZW5kcyBvbiBIVUdFVExCX1BBR0UKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKaW5kZXggNGYwYzMwYy4uZjkyYmRhYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgZWxmX21hcAkJCQllbGYzMl9tYXAKIAogI3VuZGVmIFNFVF9QRVJTT05BTElUWQotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQllbGYzMl9zZXRfcGVyc29uYWxpdHkoKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpCWVsZjMyX3NldF9wZXJzb25hbGl0eSgpCiAKICNkZWZpbmUgZWxmX3JlYWRfaW1wbGllc19leGVjKGV4LCBoYXZlX3B0X2dudV9zdGFjaykJKCEoaGF2ZV9wdF9nbnVfc3RhY2spKQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKaW5kZXggZmY4OGM0OC4uNTM1MDViYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwpAQCAtMjUxLDggKzI1MSw4IEBACiAJZGF0YTggY29tcGF0X3N5c19zZXRybGltaXQJICAvKiA3NSAqLwogCWRhdGE4IGNvbXBhdF9zeXNfb2xkX2dldHJsaW1pdAogCWRhdGE4IGNvbXBhdF9zeXNfZ2V0cnVzYWdlCi0JZGF0YTggc3lzMzJfZ2V0dGltZW9mZGF5Ci0JZGF0YTggc3lzMzJfc2V0dGltZW9mZGF5CisJZGF0YTggY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkKKwlkYXRhOCBjb21wYXRfc3lzX3NldHRpbWVvZmRheQogCWRhdGE4IHN5czMyX2dldGdyb3VwczE2CSAgLyogODAgKi8KIAlkYXRhOCBzeXMzMl9zZXRncm91cHMxNgogCWRhdGE4IHN5czMyX29sZF9zZWxlY3QKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJwcml2LmggYi9hcmNoL2lhNjQvaWEzMi9pYTMycHJpdi5oCmluZGV4IGRkMGM1MzYuLjBmMTUzNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJwcml2LmgKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMnByaXYuaApAQCAtMzMyLDggKzMzMiw4IEBACiAjZGVmaW5lIEVMRl9QTEFURk9STQlOVUxMCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jIGRlZmluZSBTRVRfUEVSU09OQUxJVFkoRVgsSUJDUzIpCQkJCVwKLQkoY3VycmVudC0+cGVyc29uYWxpdHkgPSAoSUJDUzIpID8gUEVSX1NWUjQgOiBQRVJfTElOVVgpCisjIGRlZmluZSBTRVRfUEVSU09OQUxJVFkoRVgpCQkJCVwKKwkoY3VycmVudC0+cGVyc29uYWxpdHkgPSBQRVJfTElOVVgpCiAjZW5kaWYKIAogI2RlZmluZSBJQTMyX0VGTEFHCTB4MjAwCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCBiZjE5NmNiLi5mNDQzMGJiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKQEAgLTExOCw0MSArMTE4LDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludCBjcF9jb21wYXRfc3RhdChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnVidWYpCi17Ci0JY29tcGF0X2lub190IGlubzsKLQlpbnQgZXJyOwotCi0JaWYgKCh1NjQpIHN0YXQtPnNpemUgPiBNQVhfTk9OX0xGUyB8fAotCSAgICAhb2xkX3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8Ci0JICAgICFvbGRfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWlubyA9IHN0YXQtPmlubzsKLQlpZiAoc2l6ZW9mKGlubykgPCBzaXplb2Yoc3RhdC0+aW5vKSAmJiBpbm8gIT0gc3RhdC0+aW5vKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWlmIChjbGVhcl91c2VyKHVidWYsIHNpemVvZigqdWJ1ZikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVyciAgPSBfX3B1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPmRldiksICZ1YnVmLT5zdF9kZXYpOwotCWVyciB8PSBfX3B1dF91c2VyKGlubywgJnVidWYtPnN0X2lubyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+bW9kZSwgJnVidWYtPnN0X21vZGUpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPm5saW5rLCAmdWJ1Zi0+c3RfbmxpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKGhpZ2gybG93dWlkKHN0YXQtPnVpZCksICZ1YnVmLT5zdF91aWQpOwotCWVyciB8PSBfX3B1dF91c2VyKGhpZ2gybG93Z2lkKHN0YXQtPmdpZCksICZ1YnVmLT5zdF9naWQpOwotCWVyciB8PSBfX3B1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPnJkZXYpLCAmdWJ1Zi0+c3RfcmRldik7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+c2l6ZSwgJnVidWYtPnN0X3NpemUpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmF0aW1lLnR2X3NlYywgJnVidWYtPnN0X2F0aW1lKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5hdGltZS50dl9uc2VjLCAmdWJ1Zi0+c3RfYXRpbWVfbnNlYyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+bXRpbWUudHZfc2VjLCAmdWJ1Zi0+c3RfbXRpbWUpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPm10aW1lLnR2X25zZWMsICZ1YnVmLT5zdF9tdGltZV9uc2VjKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5jdGltZS50dl9zZWMsICZ1YnVmLT5zdF9jdGltZSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+Y3RpbWUudHZfbnNlYywgJnVidWYtPnN0X2N0aW1lX25zZWMpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmJsa3NpemUsICZ1YnVmLT5zdF9ibGtzaXplKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5ibG9ja3MsICZ1YnVmLT5zdF9ibG9ja3MpOwotCXJldHVybiBlcnI7Ci19CiAKICNpZiBQQUdFX1NISUZUID4gSUEzMl9QQUdFX1NISUZUCiAKQEAgLTExNDgsNjggKzExMTMsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcKLWdldF90djMyIChzdHJ1Y3QgdGltZXZhbCAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKLXsKLQlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGksIHNpemVvZigqaSkpIHx8Ci0JCShfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykgfCBfX2dldF91c2VyKG8tPnR2X3VzZWMsICZpLT50dl91c2VjKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcKLXB1dF90djMyIChzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpvLCBzdHJ1Y3QgdGltZXZhbCAqaSkKLXsKLQlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvLCBzaXplb2YoKm8pKSB8fAotCQkoX19wdXRfdXNlcihpLT50dl9zZWMsICZvLT50dl9zZWMpIHwgX19wdXRfdXNlcihpLT50dl91c2VjLCAmby0+dHZfdXNlYykpKTsKLX0KLQogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nCiBzeXMzMl9hbGFybSAodW5zaWduZWQgaW50IHNlY29uZHMpCiB7CiAJcmV0dXJuIGFsYXJtX3NldGl0aW1lcihzZWNvbmRzKTsKIH0KIAotLyogVHJhbnNsYXRpb25zIGR1ZSB0byB0aW1lX3Qgc2l6ZSBkaWZmZXJlbmNlcy4gIFdoaWNoIGFmZmVjdHMgYWxsCi0gICBzb3J0cyBvZiB0aGluZ3MsIGxpa2UgdGltZXZhbCBhbmQgaXRpbWVydmFsLiAgKi8KLQotZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7Ci0KLWFzbWxpbmthZ2UgbG9uZwotc3lzMzJfZ2V0dGltZW9mZGF5IChzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0diwgc3RydWN0IHRpbWV6b25lIF9fdXNlciAqdHopCi17Ci0JaWYgKHR2KSB7Ci0JCXN0cnVjdCB0aW1ldmFsIGt0djsKLQkJZG9fZ2V0dGltZW9mZGF5KCZrdHYpOwotCQlpZiAocHV0X3R2MzIodHYsICZrdHYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWlmICh0eikgewotCQlpZiAoY29weV90b191c2VyKHR6LCAmc3lzX3R6LCBzaXplb2Yoc3lzX3R6KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZwotc3lzMzJfc2V0dGltZW9mZGF5IChzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0diwgc3RydWN0IHRpbWV6b25lIF9fdXNlciAqdHopCi17Ci0Jc3RydWN0IHRpbWV2YWwga3R2OwotCXN0cnVjdCB0aW1lc3BlYyBrdHM7Ci0Jc3RydWN0IHRpbWV6b25lIGt0ejsKLQotCWlmICh0dikgewotCQlpZiAoZ2V0X3R2MzIoJmt0diwgdHYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWt0cy50dl9zZWMgPSBrdHYudHZfc2VjOwotCQlrdHMudHZfbnNlYyA9IGt0di50dl91c2VjICogMTAwMDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Ci19Ci0KIHN0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CiAJdW5zaWduZWQgaW50IG47CiAJdW5zaWduZWQgaW50IGlucDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hLm91dC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2Eub3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2RjZmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2Eub3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jaWZuZGVmIF9BU01fSUE2NF9BX09VVF9ICi0jZGVmaW5lIF9BU01fSUE2NF9BX09VVF9ICi0KLS8qCi0gKiBObyBhLm91dCBmb3JtYXQgaGFzIGJlZW4gKG9yIHNob3VsZCBiZSkgZGVmaW5lZCBzbyB0aGlzIGZpbGUgaXMKLSAqIGp1c3QgYSBkdW1teSB0aGF0IGFsbG93cyB1cyB0byBnZXQgYmluZm10X2VsZiBjb21waWxlZC4gIEl0Ci0gKiBwcm9iYWJseSB3b3VsZCBiZSBiZXR0ZXIgdG8gY2xlYW4gdXAgYmluZm10X2VsZi5jIHNvIGl0IGRvZXMgbm90Ci0gKiBuZWNlc3NhcmlseSBkZXBlbmQgb24gdGhlcmUgYmVpbmcgYS5vdXQgc3VwcG9ydC4KLSAqCi0gKiBNb2RpZmllZCAxOTk4LTIwMDIKLSAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4sIEhld2xldHQtUGFja2FyZCBDby4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IGV4ZWMgewotCXVuc2lnbmVkIGxvbmcgYV9pbmZvOwotCXVuc2lnbmVkIGxvbmcgYV90ZXh0OwotCXVuc2lnbmVkIGxvbmcgYV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgYV9ic3M7Ci0JdW5zaWduZWQgbG9uZyBhX2VudHJ5OwotfTsKLQotI2RlZmluZSBOX1RYVEFERFIoeCkJMAotI2RlZmluZSBOX0RBVEFERFIoeCkJMAotI2RlZmluZSBOX0JTU0FERFIoeCkJMAotI2RlZmluZSBOX0RSU0laRSh4KQkwCi0jZGVmaW5lIE5fVFJTSVpFKHgpCTAKLSNkZWZpbmUgTl9TWU1TSVpFKHgpCTAKLSNkZWZpbmUgTl9UWFRPRkYoeCkJMAotCi0jZW5kaWYgLyogX0FTTV9JQTY0X0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKaW5kZXggOWYwZGY5Yi4uMDZmZjFiYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTgsNyArOCw5IEBACiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCi0jZGVmaW5lIGRtYV9hbGxvY19jb2hlcmVudAlwbGF0Zm9ybV9kbWFfYWxsb2NfY29oZXJlbnQKKyNkZWZpbmUgZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgaGFuZGxlLCBnZnApCVwKKwlwbGF0Zm9ybV9kbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBoYW5kbGUsIChnZnApIHwgR0ZQX0RNQSkKKwogLyogY29oZXJlbnQgbWVtLiBpcyBjaGVhcCAqLwogc3RhdGljIGlubGluZSB2b2lkICoKIGRtYV9hbGxvY19ub25jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDVlMGMxYTYuLjg2ZWRkZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTIwMiw3ICsyMDIsNyBAQAogICAgcmVsZXZhbnQgdW50aWwgd2UgaGF2ZSByZWFsIGhhcmR3YXJlIHRvIHBsYXkgd2l0aC4uLiAqLwogI2RlZmluZSBFTEZfUExBVEZPUk0JTlVMTAogCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKICNkZWZpbmUgZWxmX3JlYWRfaW1wbGllc19leGVjKGV4LCBleGVjdXRhYmxlX3N0YWNrKQkJCQkJXAogCSgoZXhlY3V0YWJsZV9zdGFjayE9RVhTVEFDS19ESVNBQkxFX1gpICYmICgoZXgpLmVfZmxhZ3MgJiBFRl9JQV82NF9MSU5VWF9FWEVDVVRBQkxFX1NUQUNLKSAhPSAwKQogCkBAIC0yNjYsNCArMjY2LDE5IEBACiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorLyoKKyAqIGZvcm1hdCBmb3IgZW50cmllcyBpbiB0aGUgR2xvYmFsIE9mZnNldCBUYWJsZQorICovCitzdHJ1Y3QgZ290X2VudHJ5IHsKKwl1aW50NjRfdCB2YWw7Cit9OworCisvKgorICogTGF5b3V0IG9mIHRoZSBGdW5jdGlvbiBEZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBmZGVzYyB7CisJdWludDY0X3QgaXA7CisJdWludDY0X3QgZ3A7Cit9OworCiAjZW5kaWYgLyogX0FTTV9JQTY0X0VMRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDFlZmU1MTMuLjg1ZGIxMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xMzIsNyArMTMyLDcgQEAKICNkZWZpbmUgR1BGTl9JT1NBUElDICAgICAgICAoNFVMIDw8IDYwKSAvKiBJT1NBUElDIGJhc2UgKi8KICNkZWZpbmUgR1BGTl9MRUdBQ1lfSU8gICAgICAoNVVMIDw8IDYwKSAvKiBMZWdhY3kgSS9PIGJhc2UgKi8KICNkZWZpbmUgR1BGTl9HRlcgICAgICAgICg2VUwgPDwgNjApIC8qIEd1ZXN0IEZpcm13YXJlICovCi0jZGVmaW5lIEdQRk5fSElHSF9NTUlPICAgICAgKDdVTCA8PCA2MCkgLyogSGlnaCBNTUlPIHJhbmdlICovCisjZGVmaW5lIEdQRk5fUEhZU19NTUlPICAgICAgKDdVTCA8PCA2MCkgLyogRGlyZWN0ZWQgTU1JTyBSYW5nZSAqLwogCiAjZGVmaW5lIEdQRk5fSU9fTUFTSyAgICAgICAgKDdVTCA8PCA2MCkgLyogR3Vlc3QgcGZuIGlzIEkvTyB0eXBlICovCiAjZGVmaW5lIEdQRk5fSU5WX01BU0sgICAgICAgKDFVTCA8PCA2MykgLyogR3Vlc3QgcGZuIGlzIGludmFsaWQgKi8KQEAgLTQxMyw2ICs0MTMsMTAgQEAKIAlzdHJ1Y3Qga3ZtX2lvYXBpYyAqdmlvYXBpYzsKIAlzdHJ1Y3Qga3ZtX3ZtX3N0YXQgc3RhdDsKIAlzdHJ1Y3Qga3ZtX3NhbF9kYXRhIHJkdl9zYWxfZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQgYXNzaWduZWRfZGV2X2hlYWQ7CisJc3RydWN0IGRtYXJfZG9tYWluICppbnRlbF9pb21tdV9kb21haW47CisJc3RydWN0IGhsaXN0X2hlYWQgaXJxX2Fja19ub3RpZmllcl9saXN0OwogfTsKIAogdW5pb24gY3B1aWQzX3QgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NlY3Rpb25zLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc2VjdGlvbnMuaAppbmRleCA3Mjg2ZTRhLi4xYTg3M2IzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc2VjdGlvbnMuaApAQCAtNiw5ICs2LDE0IEBACiAgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogCiBleHRlcm4gY2hhciBfX3Blcl9jcHVfc3RhcnRbXSwgX19wZXJfY3B1X2VuZFtdLCBfX3BoeXNfcGVyX2NwdV9zdGFydFtdOworI2lmZGVmCUNPTkZJR19TTVAKK2V4dGVybiBjaGFyIF9fY3B1MF9wZXJfY3B1W107CisjZW5kaWYKIGV4dGVybiBjaGFyIF9fc3RhcnRfX192dG9wX3BhdGNobGlzdFtdLCBfX2VuZF9fX3Z0b3BfcGF0Y2hsaXN0W107CiBleHRlcm4gY2hhciBfX3N0YXJ0X19fcnNlX3BhdGNobGlzdFtdLCBfX2VuZF9fX3JzZV9wYXRjaGxpc3RbXTsKIGV4dGVybiBjaGFyIF9fc3RhcnRfX19tY2tpbmxleV9lOV9idW5kbGVzW10sIF9fZW5kX19fbWNraW5sZXlfZTlfYnVuZGxlc1tdOwpAQCAtMjEsNSArMjYsMTcgQEAKIGV4dGVybiBjaGFyIF9fc3RhcnRfdW53aW5kW10sIF9fZW5kX3Vud2luZFtdOwogZXh0ZXJuIGNoYXIgX19zdGFydF9pdnRfdGV4dFtdLCBfX2VuZF9pdnRfdGV4dFtdOwogCisjdW5kZWYgZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcgorc3RhdGljIGlubGluZSB2b2lkICpkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgZmRlc2MgKmRlc2MgPSBwdHI7CisJdm9pZCAqcDsKKworCWlmICghcHJvYmVfa2VybmVsX2FkZHJlc3MoJmRlc2MtPmlwLCBwKSkKKwkJcHRyID0gcDsKKwlyZXR1cm4gcHRyOworfQorCisKICNlbmRpZiAvKiBfQVNNX0lBNjRfU0VDVElPTlNfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc2lnaW5mby5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NpZ2luZm8uaAppbmRleCA5Mjk0ZTRiLi4xMThkNDI5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc2lnaW5mby5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKQEAgLTExMywxMSArMTEzLDYgQEAKICN1bmRlZiBOU0lHU0VHVgogI2RlZmluZSBOU0lHU0VHVgkzCiAKLS8qCi0gKiBTSUdUUkFQIHNpX2NvZGVzCi0gKi8KLSNkZWZpbmUgVFJBUF9CUkFOQ0gJKF9fU0lfRkFVTFR8MykJLyogcHJvY2VzcyB0YWtlbiBicmFuY2ggdHJhcCAqLwotI2RlZmluZSBUUkFQX0hXQktQVAkoX19TSV9GQVVMVHw0KQkvKiBoYXJkd2FyZSBicmVha3BvaW50IG9yIHdhdGNocG9pbnQgKi8KICN1bmRlZiBOU0lHVFJBUAogI2RlZmluZSBOU0lHVFJBUAk0CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi9idGUuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi9idGUuaAppbmRleCBhMGQyMTRmLi41ZWZlY2YwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc24vYnRlLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL2J0ZS5oCkBAIC0yMjMsMTAgKzIyMywxMSBAQAogICogdW50aWwgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgSW4gb3JkZXIgdG8gZ2V0IHRoZSBhc3luY2gKICAqIHZlcnNpb24gb2YgYnRlX2NvcHksIHlvdSBtdXN0IHBlcmZvcm0gdGhpcyBjaGVjayB5b3Vyc2VsZi4KICAqLwotI2RlZmluZSBCVEVfVU5BTElHTkVEX0NPUFkoc3JjLCBkZXN0LCBsZW4sIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgoKGxlbiAmIEwxX0NBQ0hFX01BU0spIHx8IChzcmMgJiBMMV9DQUNIRV9NQVNLKSB8fCAgICAgICAgICAgICBcCi0JICAoZGVzdCAmIEwxX0NBQ0hFX01BU0spKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgYnRlX3VuYWxpZ25lZF9jb3B5KHNyYywgZGVzdCwgbGVuLCBtb2RlKSA6ICAgICAgICAgICAgICAJXAorI2RlZmluZSBCVEVfVU5BTElHTkVEX0NPUFkoc3JjLCBkZXN0LCBsZW4sIG1vZGUpCQkJXAorCSgoKGxlbiAmIChMMV9DQUNIRV9CWVRFUyAtIDEpKSB8fAkJCQlcCisJICAoc3JjICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpIHx8CQkJCVwKKwkgIChkZXN0ICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpKSA/CQkJCVwKKwkgYnRlX3VuYWxpZ25lZF9jb3B5KHNyYywgZGVzdCwgbGVuLCBtb2RlKSA6CQkJXAogCSBidGVfY29weShzcmMsIGRlc3QsIGxlbiwgbW9kZSwgTlVMTCkpCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N0YXRmcy5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N0YXRmcy5oCmluZGV4IDgxMTA5NzkuLjFlNTg5NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zdGF0ZnMuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3RhdGZzLmgKQEAgLTgsNTUgKzgsMTMgQEAKICAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4sIEhld2xldHQtUGFja2FyZCBDbwogICovCiAKLSNpZm5kZWYgX19LRVJORUxfU1RSSUNUX05BTUVTCi0jIGluY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci10eXBlZGVmIF9fa2VybmVsX2ZzaWRfdAlmc2lkX3Q7Ci0jZW5kaWYKLQogLyoKLSAqIFRoaXMgaXMgdWdseSAtLS0gd2UncmUgYWxyZWFkeSA2NC1iaXQsIHNvIGp1c3QgZHVwbGljYXRlIHRoZSBkZWZpbml0aW9ucworICogV2UgbmVlZCBjb21wYXRfc3RhdGZzNjQgdG8gYmUgcGFja2VkLCBiZWNhdXNlIHRoZSBpMzg2IEFCSSB3b24ndAorICogYWRkIHBhZGRpbmcgYXQgdGhlIGVuZCB0byBicmluZyBpdCB0byBhIG11bHRpcGxlIG9mIDggYnl0ZXMsIGJ1dAorICogdGhlIElBNjQgQUJJIHdpbGwuCiAgKi8KLXN0cnVjdCBzdGF0ZnMgewotCWxvbmcgZl90eXBlOwotCWxvbmcgZl9ic2l6ZTsKLQlsb25nIGZfYmxvY2tzOwotCWxvbmcgZl9iZnJlZTsKLQlsb25nIGZfYmF2YWlsOwotCWxvbmcgZl9maWxlczsKLQlsb25nIGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlsb25nIGZfbmFtZWxlbjsKLQlsb25nIGZfZnJzaXplOwotCWxvbmcgZl9zcGFyZVs1XTsKLX07CisjZGVmaW5lIEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQgX19hdHRyaWJ1dGVfXygocGFja2VkLGFsaWduZWQoNCkpKQogCi0KLXN0cnVjdCBzdGF0ZnM2NCB7Ci0JbG9uZyBmX3R5cGU7Ci0JbG9uZyBmX2JzaXplOwotCWxvbmcgZl9ibG9ja3M7Ci0JbG9uZyBmX2JmcmVlOwotCWxvbmcgZl9iYXZhaWw7Ci0JbG9uZyBmX2ZpbGVzOwotCWxvbmcgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCWxvbmcgZl9uYW1lbGVuOwotCWxvbmcgZl9mcnNpemU7Ci0JbG9uZyBmX3NwYXJlWzVdOwotfTsKLQotc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCB7Ci0JX191MzIgZl90eXBlOwotCV9fdTMyIGZfYnNpemU7Ci0JX191NjQgZl9ibG9ja3M7Ci0JX191NjQgZl9iZnJlZTsKLQlfX3U2NCBmX2JhdmFpbDsKLQlfX3U2NCBmX2ZpbGVzOwotCV9fdTY0IGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlfX3UzMiBmX25hbWVsZW47Ci0JX191MzIgZl9mcnNpemU7Ci0JX191MzIgZl9zcGFyZVs1XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3RhdGZzLmg+CiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU1RBVEZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCmluZGV4IGQ0NWYyMTUuLjUxYjc1Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwpAQCAtMTIzMiw5ICsxMjMyLDEwIEBACiAJCQkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dQKSB7CiAJCQkJCW5hbWUgPSAiU3lzdGVtIFJPTSI7CiAJCQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfUkVBRE9OTFk7Ci0JCQkJfSBlbHNlIHsKKwkJCQl9IGVsc2UgaWYgKG1kLT5hdHRyaWJ1dGUgPT0gRUZJX01FTU9SWV9VQykKKwkJCQkJbmFtZSA9ICJVbmNhY2hlZCBSQU0iOworCQkJCWVsc2UKIAkJCQkJbmFtZSA9ICJTeXN0ZW0gUkFNIjsKLQkJCQl9CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgRUZJX0FDUElfTUVNT1JZX05WUzoKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggOGJkZWE4ZS4uNjZlNDkxZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKQEAgLTM2NywxNiArMzY3LDE3IEBACiAJOzsKICNlbHNlCiAoaXNBUCkJYnIuZmV3IDJmCi0JbW92IHIyMD1yMTkKLQlzdWIgcjE5PXIxOSxyMTgKKwltb3ZsIHIyMD1fX2NwdTBfcGVyX2NwdQogCTs7CiAJc2hyLnUgcjE4PXIxOCwzCiAxOgotCWxkOCByMjE9W3IyMF0sODs7Ci0Jc3Q4W3IxOV09cjIxLDgKKwlsZDggcjIxPVtyMTldLDg7OworCXN0OFtyMjBdPXIyMSw4CiAJYWRkcyByMTg9LTEscjE4OzsKIAljbXA0Lmx0IHA3LHA2PTAscjE4CiAocDcpCWJyLmNvbmQuZHB0ay5mZXcgMWIKKwltb3YgcjE5PXIyMAorCTs7CiAyOgogI2VuZGlmCiAJdHBhIHIxOT1yMTkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2lhNjQva2VybmVsL21vZHVsZS5jCmluZGV4IDI5YWFkMzQuLmFhYTdkOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tb2R1bGUuYwpAQCAtMTM1LDE1ICsxMzUsNiBAQAogCiAjdW5kZWYgTgogCi1zdHJ1Y3QgZ290X2VudHJ5IHsKLQl1aW50NjRfdCB2YWw7Ci19OwotCi1zdHJ1Y3QgZmRlc2MgewotCXVpbnQ2NF90IGlwOwotCXVpbnQ2NF90IGdwOwotfTsKLQogLyogT3BhcXVlIHN0cnVjdCBmb3IgaW5zbnMsIHRvIHByb3RlY3QgYWdhaW5zdCBkZXJlZnMuICovCiBzdHJ1Y3QgaW5zbjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGMyN2Q1YjIuLmRlNjM2YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTYxNiw3ICs2MTYsOSBAQAogCQlpYTY0X21jYV9pbml0KCk7CiAKIAlwbGF0Zm9ybV9zZXR1cChjbWRsaW5lX3ApOworI2lmbmRlZiBDT05GSUdfSUE2NF9IUF9TSU0KIAljaGVja19zYWxfY2FjaGVfZmx1c2goKTsKKyNlbmRpZgogCXBhZ2luZ19pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggYmNlYTgxZS4uMWRjYmI4NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKQEAgLTQwMSw2ICs0MDEsNyBAQAogCXNwaW5fbG9jaygmdmVjdG9yX2xvY2spOwogCS8qIFNldHVwIHRoZSBwZXIgY3B1IGlycSBoYW5kbGluZyBkYXRhIHN0cnVjdHVyZXMgKi8KIAlfX3NldHVwX3ZlY3Rvcl9pcnEoY3B1aWQpOworCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1aWQpOwogCWNwdV9zZXQoY3B1aWQsIGNwdV9vbmxpbmVfbWFwKTsKIAlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1aWQpID0gQ1BVX09OTElORTsKIAlzcGluX3VubG9jaygmdmVjdG9yX2xvY2spOwpAQCAtNzQxLDE2ICs3NDIsMTQgQEAKIAkJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOwotCiAJaWYgKG1pZ3JhdGVfcGxhdGZvcm1faXJxcyhjcHUpKSB7CiAJCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CiAJCXJldHVybiAoLUVCVVNZKTsKIAl9CiAKIAlyZW1vdmVfc2libGluZ2luZm8oY3B1KTsKLQljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CiAJZml4dXBfaXJxcygpOworCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKIAlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxpbl9tYXApOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGRlNzFkYTguLjEwYTdkNDdlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0yMTUsOSArMjE1LDYgQEAKICAgLyogUGVyLWNwdSBkYXRhOiAqLwogICBwZXJjcHUgOiB7IH0gOnBlcmNwdQogICAuID0gQUxJR04oUEVSQ1BVX1BBR0VfU0laRSk7Ci0jaWZkZWYJQ09ORklHX1NNUAotICAuID0gLiArIFBFUkNQVV9QQUdFX1NJWkU7CS8qIGNwdTAgcGVyLWNwdSBzcGFjZSAqLwotI2VuZGlmCiAgIF9fcGh5c19wZXJfY3B1X3N0YXJ0ID0gLjsKICAgLmRhdGEucGVyY3B1IFBFUkNQVV9BRERSIDogQVQoX19waHlzX3Blcl9jcHVfc3RhcnQgLSBMT0FEX09GRlNFVCkKIAl7CkBAIC0yMzMsNiArMjMwLDExIEBACiAgIGRhdGEgOiB7IH0gOmRhdGEKICAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKQogCXsKKyNpZmRlZglDT05GSUdfU01QCisgIC4gPSBBTElHTihQRVJDUFVfUEFHRV9TSVpFKTsKKwkJX19jcHUwX3Blcl9jcHUgPSAuOworICAuID0gLiArIFBFUkNQVV9QQUdFX1NJWkU7CS8qIGNwdTAgcGVyLWNwdSBzcGFjZSAqLworI2VuZGlmCiAJCURBVEFfREFUQQogCQkqKC5kYXRhMSkKIAkJKiguZ251LmxpbmtvbmNlLmQqKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9LY29uZmlnIGIvYXJjaC9pYTY0L2t2bS9LY29uZmlnCmluZGV4IDc5MTRlNDguLjhlOTlmZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0vS2NvbmZpZworKysgYi9hcmNoL2lhNjQva3ZtL0tjb25maWcKQEAgLTQ2LDQgKzQ2LDYgQEAKIGNvbmZpZyBLVk1fVFJBQ0UKICAgICAgICBib29sCiAKK3NvdXJjZSBkcml2ZXJzL3ZpcnRpby9LY29uZmlnCisKIGVuZGlmICMgVklSVFVBTElaQVRJT04KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vTWFrZWZpbGUgYi9hcmNoL2lhNjQva3ZtL01ha2VmaWxlCmluZGV4IGJmMjJmYjkuLmNmMzdmOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2t2bS9NYWtlZmlsZQpAQCAtNDQsNyArNDQsMTEgQEAKIEVYVFJBX0FGTEFHUyArPSAtSXZpcnQva3ZtIC1JYXJjaC9pYTY0L2t2bS8KIAogY29tbW9uLW9ianMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIGt2bV9tYWluLm8gaW9hcGljLm8gXAotCQljb2FsZXNjZWRfbW1pby5vKQorCQljb2FsZXNjZWRfbW1pby5vIGlycV9jb21tLm8pCisKK2lmZXEgKCQoQ09ORklHX0RNQVIpLHkpCitjb21tb24tb2JqcyArPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIHZ0ZC5vKQorZW5kaWYKIAoga3ZtLW9ianMgOj0gJChjb21tb24tb2Jqcykga3ZtLWlhNjQubyBrdm1fZncubwogb2JqLSQoQ09ORklHX0tWTSkgKz0ga3ZtLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vaXJxLmggYi9hcmNoL2lhNjQva3ZtL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Nzg2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva3ZtL2lycS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBpcnEuaDogSW4ta2VybmVsIGludGVycnVwdCBjb250cm9sbGVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEF1dGhvcnM6CisgKiAgIFhpYW50YW8gWmhhbmcgPHhpYW50YW8uemhhbmdAaW50ZWwuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9fSVJRX0gKKyNkZWZpbmUgX19JUlFfSAorCitzdGF0aWMgaW5saW5lIGludCBpcnFjaGlwX2luX2tlcm5lbChzdHJ1Y3Qga3ZtICprdm0pCit7CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jIGIvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jCmluZGV4IGNmOGVhZTEuLmEzMTJjOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9nY2NfaW50cmluLmg+CkBAIC0zOCwxMiArMzksMTQgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAKICNpbmNsdWRlICJtaXNjLmgiCiAjaW5jbHVkZSAidnRpLmgiCiAjaW5jbHVkZSAiaW9kZXYuaCIKICNpbmNsdWRlICJpb2FwaWMuaCIKICNpbmNsdWRlICJsYXBpYy5oIgorI2luY2x1ZGUgImlycS5oIgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBrdm1fdm1tX2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBrdm1fdnNhX2Jhc2U7CkBAIC02MSwxMiArNjQsNiBAQAogCXsgTlVMTCB9CiB9OwogCi0KLXN0cnVjdCBmZGVzY3sKLSAgICB1bnNpZ25lZCBsb25nIGlwOwotICAgIHVuc2lnbmVkIGxvbmcgZ3A7Ci19OwotCiBzdGF0aWMgdm9pZCBrdm1fZmx1c2hfaWNhY2hlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCWludCBsOwpAQCAtMTg0LDEyICsxODEsMTYgQEAKIAlzd2l0Y2ggKGV4dCkgewogCWNhc2UgS1ZNX0NBUF9JUlFDSElQOgogCWNhc2UgS1ZNX0NBUF9VU0VSX01FTU9SWToKKwljYXNlIEtWTV9DQVBfTVBfU1RBVEU6CiAKIAkJciA9IDE7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9DT0FMRVNDRURfTU1JTzoKIAkJciA9IEtWTV9DT0FMRVNDRURfTU1JT19QQUdFX09GRlNFVDsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX0lPTU1VOgorCQlyID0gaW50ZWxfaW9tbXVfZm91bmQoKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJciA9IDA7CiAJfQpAQCAtNzc2LDYgKzc3Nyw3IEBACiAJICovCiAJa3ZtX2J1aWxkX2lvX3BtdChrdm0pOwogCisJSU5JVF9MSVNUX0hFQUQoJmt2bS0+YXJjaC5hc3NpZ25lZF9kZXZfaGVhZCk7CiB9CiAKIHN0cnVjdCAga3ZtICprdm1fYXJjaF9jcmVhdGVfdm0odm9pZCkKQEAgLTEzMzksNiArMTM0MSwxMCBAQAogCiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKQogeworCWt2bV9pb21tdV91bm1hcF9ndWVzdChrdm0pOworI2lmZGVmICBLVk1fQ0FQX0RFVklDRV9BU1NJR05NRU5UCisJa3ZtX2ZyZWVfYWxsX2Fzc2lnbmVkX2RldmljZXMoa3ZtKTsKKyNlbmRpZgogCWtmcmVlKGt2bS0+YXJjaC52aW9hcGljKTsKIAlrdm1fcmVsZWFzZV92bV9wYWdlcyhrdm0pOwogCWt2bV9mcmVlX3BoeXNtZW0oa3ZtKTsKQEAgLTE0NDAsMTcgKzE0NDYsMjQgQEAKIAkJaW50IHVzZXJfYWxsb2MpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgcGZuOwogCWludCBucGFnZXMgPSBtZW0tPm1lbW9yeV9zaXplID4+IFBBR0VfU0hJRlQ7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzW21lbS0+c2xvdF07CiAJdW5zaWduZWQgbG9uZyBiYXNlX2dmbiA9IG1lbXNsb3QtPmJhc2VfZ2ZuOwogCiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7Ci0JCXBhZ2UgPSBnZm5fdG9fcGFnZShrdm0sIGJhc2VfZ2ZuICsgaSk7Ci0JCWt2bV9zZXRfcG10X2VudHJ5KGt2bSwgYmFzZV9nZm4gKyBpLAotCQkJCXBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQsCi0JCQkJX1BBR0VfQVJfUldYfF9QQUdFX01BX1dCKTsKLQkJbWVtc2xvdC0+cm1hcFtpXSA9ICh1bnNpZ25lZCBsb25nKXBhZ2U7CisJCXBmbiA9IGdmbl90b19wZm4oa3ZtLCBiYXNlX2dmbiArIGkpOworCQlpZiAoIWt2bV9pc19tbWlvX3BmbihwZm4pKSB7CisJCQlrdm1fc2V0X3BtdF9lbnRyeShrdm0sIGJhc2VfZ2ZuICsgaSwKKwkJCQkJcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkJX1BBR0VfQVJfUldYIHwgX1BBR0VfTUFfV0IpOworCQkJbWVtc2xvdC0+cm1hcFtpXSA9ICh1bnNpZ25lZCBsb25nKXBmbl90b19wYWdlKHBmbik7CisJCX0gZWxzZSB7CisJCQlrdm1fc2V0X3BtdF9lbnRyeShrdm0sIGJhc2VfZ2ZuICsgaSwKKwkJCQkJR1BGTl9QSFlTX01NSU8gfCAocGZuIDw8IFBBR0VfU0hJRlQpLAorCQkJCQlfUEFHRV9NQV9VQyk7CisJCQltZW1zbG90LT5ybWFwW2ldID0gMDsKKwkJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE3OTQsMTEgKzE4MDcsNDMgQEAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9tcHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgICAgc3RydWN0IGt2bV9tcF9zdGF0ZSAqbXBfc3RhdGUpCiB7Ci0JcmV0dXJuIC1FSU5WQUw7CisJdmNwdV9sb2FkKHZjcHUpOworCW1wX3N0YXRlLT5tcF9zdGF0ZSA9IHZjcHUtPmFyY2gubXBfc3RhdGU7CisJdmNwdV9wdXQodmNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmNwdV9yZXNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IHI7CisJbG9uZyBwc3I7CisJbG9jYWxfaXJxX3NhdmUocHNyKTsKKwlyID0ga3ZtX2luc2VydF92bW1fbWFwcGluZyh2Y3B1KTsKKwlpZiAocikKKwkJZ290byBmYWlsOworCisJdmNwdS0+YXJjaC5sYXVuY2hlZCA9IDA7CisJa3ZtX2FyY2hfdmNwdV91bmluaXQodmNwdSk7CisJciA9IGt2bV9hcmNoX3ZjcHVfaW5pdCh2Y3B1KTsKKwlpZiAocikKKwkJZ290byBmYWlsOworCisJa3ZtX3B1cmdlX3ZtbV9tYXBwaW5nKHZjcHUpOworCXIgPSAwOworZmFpbDoKKwlsb2NhbF9pcnFfcmVzdG9yZShwc3IpOworCXJldHVybiByOwogfQogCiBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfbXBzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICAgIHN0cnVjdCBrdm1fbXBfc3RhdGUgKm1wX3N0YXRlKQogewotCXJldHVybiAtRUlOVkFMOworCWludCByID0gMDsKKworCXZjcHVfbG9hZCh2Y3B1KTsKKwl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gbXBfc3RhdGUtPm1wX3N0YXRlOworCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9VTklOSVRJQUxJWkVEKQorCQlyID0gdmNwdV9yZXNldCh2Y3B1KTsKKwl2Y3B1X3B1dCh2Y3B1KTsKKwlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0va3ZtX21pbnN0YXRlLmggYi9hcmNoL2lhNjQva3ZtL2t2bV9taW5zdGF0ZS5oCmluZGV4IDEzOTgwZDkuLjJjYzQxZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtX21pbnN0YXRlLmgKKysrIGIvYXJjaC9pYTY0L2t2bS9rdm1fbWluc3RhdGUuaApAQCAtNTAsMjcgKzUwLDE4IEBACiAKICNkZWZpbmUgUEFMX1ZTQV9TWU5DX1JFQUQJCQkJCQlcCiAJLyogYmVnaW4gdG8gY2FsbCBwYWwgdnBzIHN5bmNfcmVhZCAqLwkJCQlcCit7Lm1paTsJCQkJCQkJCQlcCiAJYWRkIHIyNSA9IFZNTV9WUERfQkFTRV9PRkZTRVQsIHIyMTsJCQkJXAotCWFkZHMgcjIwID0gVk1NX1ZDUFVfVlNBX0JBU0VfT0ZGU0VULCByMjE7ICAvKiBlbnRyeSBwb2ludCAqLwlcCi0JOzsJCQkJCQkJCVwKLQlsZDggcjI1ID0gW3IyNV07ICAgICAgLyogcmVhZCB2cGQgYmFzZSAqLwkJCVwKLQlsZDggcjIwID0gW3IyMF07CQkJCQkJXAotCTs7CQkJCQkJCQlcCi0JYWRkIHIyMCA9IFBBTF9WUFNfU1lOQ19SRUFELHIyMDsJCQkJXAotCTs7CQkJCQkJCQlcCi17IC5taWk7CQkJCQkJCQkJXAogCW5vcCAweDA7CQkJCQkJCVwKLQltb3YgcjI0ID0gaXA7CQkJCQkJCVwKLQltb3YgYjAgPSByMjA7CQkJCQkJCVwKKwltb3YgcjI0PWlwOwkJCQkJCQlcCisJOzsJCQkJCQkJCVwKK30JCQkJCQkJCQlcCit7Lm1tYgkJCQkJCQkJCVwKKwlhZGQgcjI0PTB4MjAsIHIyNDsJCQkJCQlcCisJbGQ4IHIyNSA9IFtyMjVdOyAgICAgIC8qIHJlYWQgdnBkIGJhc2UgKi8JCQlcCisJYnIuY29uZC5zcHRrIGt2bV92cHNfc3luY19yZWFkOwkJLypjYWxsIHRoZSBzZXJ2aWNlKi8JXAogCTs7CQkJCQkJCQlcCiB9OwkJCQkJCQkJCVwKLXsgLm1tYjsJCQkJCQkJCQlcCi0JYWRkIHIyNCA9IDB4MjAsIHIyNDsJCQkJCQlcCi0Jbm9wIDB4MDsJCQkJCQkJXAotCWJyLmNvbmQuc3B0ayBiMDsgICAgICAgIC8qICBjYWxsIHRoZSBzZXJ2aWNlICovCQkJXAotCTs7CQkJCQkJCQlcCi19OwotCiAKIAogI2RlZmluZSBLVk1fTUlOU1RBVEVfR0VUX0NVUlJFTlQocmVnKSAgIG1vdiByZWc9cjIxCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL29wdHZmYXVsdC5TIGIvYXJjaC9pYTY0L2t2bS9vcHR2ZmF1bHQuUwppbmRleCBlNGYxNWQ2Li42MzRhYmFkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL29wdHZmYXVsdC5TCisrKyBiL2FyY2gvaWE2NC9rdm0vb3B0dmZhdWx0LlMKQEAgLTEsOSArMSwxMiBAQAogLyoKLSAqIGFyY2gvaWE2NC92bXgvb3B0dmZhdWx0LlMKKyAqIGFyY2gvaWE2NC9rdm0vb3B0dmZhdWx0LlMKICAqIG9wdGltaXplIHZpcnR1YWxpemF0aW9uIGZhdWx0IGhhbmRsZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSW50ZWwgQ28KICAqCVh1ZWZlaSBYdSAoQW50aG9ueSBYdSkgPGFudGhvbnkueHVAaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEludGVsIENvCisgKiAgICAgIEFkZCB0aGUgc3VwcG9ydCBmb3IgVHVrd2lsYSBwcm9jZXNzb3JzLgorICoJWGlhbnRhbyBaaGFuZyA8eGlhbnRhby56aGFuZ0BpbnRlbC5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgpAQCAtMjAsNiArMjMsOTggQEAKICNkZWZpbmUgQUNDRV9NT1ZfVE9fUFNSCiAjZGVmaW5lIEFDQ0VfVEhBU0gKIAorI2RlZmluZSBWTVhfVlBTX1NZTkNfUkVBRAkJCVwKKwlhZGQgcjE2PVZNTV9WUERfQkFTRV9PRkZTRVQscjIxOwlcCisJbW92IHIxNyA9IGIwOwkJCQlcCisJbW92IHIxOCA9IHIyNDsJCQkJXAorCW1vdiByMTkgPSByMjU7CQkJCVwKKwltb3YgcjIwID0gcjMxOwkJCQlcCisJOzsJCQkJCVwKK3subWlpOwkJCQkJCVwKKwlsZDggcjE2ID0gW3IxNl07CQkJXAorCW5vcCAweDA7CQkJCVwKKwltb3YgcjI0ID0gaXA7CQkJCVwKKwk7OwkJCQkJXAorfTsJCQkJCQlcCit7Lm1tYjsJCQkJCQlcCisJYWRkIHIyND0weDIwLCByMjQ7CQkJXAorCW1vdiByMjUgPXIxNjsJCQkJXAorCWJyLnNwdGsubWFueSBrdm1fdnBzX3N5bmNfcmVhZDsJCVwKK307CQkJCQkJXAorCW1vdiBiMCA9IHIxNzsJCQkJXAorCW1vdiByMjQgPSByMTg7CQkJCVwKKwltb3YgcjI1ID0gcjE5OwkJCQlcCisJbW92IHIzMSA9IHIyMAorCitFTlRSWShrdm1fdnBzX2VudHJ5KQorCWFkZHMgcjI5ID0gVk1NX1ZDUFVfVlNBX0JBU0VfT0ZGU0VULHIyMQorCTs7CisJbGQ4IHIyOSA9IFtyMjldCisJOzsKKwlhZGQgcjI5ID0gcjI5LCByMzAKKwk7OworCW1vdiBiMCA9IHIyOQorCWJyLnNwdGsubWFueSBiMAorRU5EKGt2bV92cHNfZW50cnkpCisKKy8qCisgKglJbnB1dHM6CisgKglyMjQgOiByZXR1cm4gYWRkcmVzcworICogIAlyMjUgOiB2cGQKKyAqCXIyOSA6IHNjcmF0Y2gKKyAqCisgKi8KK0dMT0JBTF9FTlRSWShrdm1fdnBzX3N5bmNfcmVhZCkKKwltb3ZsIHIzMCA9IFBBTF9WUFNfU1lOQ19SRUFECisJOzsKKwlici5zcHRrLm1hbnkga3ZtX3Zwc19lbnRyeQorRU5EKGt2bV92cHNfc3luY19yZWFkKQorCisvKgorICoJSW5wdXRzOgorICoJcjI0IDogcmV0dXJuIGFkZHJlc3MKKyAqICAJcjI1IDogdnBkCisgKglyMjkgOiBzY3JhdGNoCisgKgorICovCitHTE9CQUxfRU5UUlkoa3ZtX3Zwc19zeW5jX3dyaXRlKQorCW1vdmwgcjMwID0gUEFMX1ZQU19TWU5DX1dSSVRFCisJOzsKKwlici5zcHRrLm1hbnkga3ZtX3Zwc19lbnRyeQorRU5EKGt2bV92cHNfc3luY193cml0ZSkKKworLyoKKyAqCUlucHV0czoKKyAqCXIyMyA6IHByCisgKglyMjQgOiBndWVzdCBiMAorICogIAlyMjUgOiB2cGQKKyAqCisgKi8KK0dMT0JBTF9FTlRSWShrdm1fdnBzX3Jlc3VtZV9ub3JtYWwpCisJbW92bCByMzAgPSBQQUxfVlBTX1JFU1VNRV9OT1JNQUwKKwk7OworCW1vdiBwcj1yMjMsLTIKKwlici5zcHRrLm1hbnkga3ZtX3Zwc19lbnRyeQorRU5EKGt2bV92cHNfcmVzdW1lX25vcm1hbCkKKworLyoKKyAqCUlucHV0czoKKyAqCXIyMyA6IHByCisgKglyMjQgOiBndWVzdCBiMAorICogIAlyMjUgOiB2cGQKKyAqCXIxNyA6IGlzcgorICovCitHTE9CQUxfRU5UUlkoa3ZtX3Zwc19yZXN1bWVfaGFuZGxlcikKKwltb3ZsIHIzMCA9IFBBTF9WUFNfUkVTVU1FX0hBTkRMRVIKKwk7OworCWxkOCByMjc9W3IyNV0KKwlzaHIgcjE3PXIxNyxJQTY0X0lTUl9JUl9CSVQKKwk7OworCWRlcCByMjc9cjE3LHIyNyw2MywxICAgLy8gYml0IDYzIG9mIHIyNyBpbmRpY2F0ZSB3aGV0aGVyIGVuYWJsZSBDRkxFCisJbW92IHByPXIyMywtMgorCWJyLnNwdGsubWFueSBrdm1fdnBzX2VudHJ5CitFTkQoa3ZtX3Zwc19yZXN1bWVfaGFuZGxlcikKKwogLy9tb3YgcjE9YXIzCiBHTE9CQUxfRU5UUlkoa3ZtX2FzbV9tb3ZfZnJvbV9hcikKICNpZm5kZWYgQUNDRV9NT1ZfRlJPTV9BUgpAQCAtMTU3LDExICsyNTIsMTEgQEAKICNpZm5kZWYgQUNDRV9SU00KIAlici5tYW55IGt2bV92aXJ0dWFsaXphdGlvbl9mYXVsdF9iYWNrCiAjZW5kaWYKLQlhZGQgcjE2PVZNTV9WUERfQkFTRV9PRkZTRVQscjIxCisJVk1YX1ZQU19TWU5DX1JFQUQKKwk7OwogCWV4dHIudSByMjY9cjI1LDYsMjEKIAlleHRyLnUgcjI3PXIyNSwzMSwyCiAJOzsKLQlsZDggcjE2PVtyMTZdCiAJZXh0ci51IHIyOD1yMjUsMzYsMQogCWRlcCByMjY9cjI3LHIyNiwyMSwyCiAJOzsKQEAgLTE5Niw3ICsyOTEsNyBAQAogCXRiaXQubnogcDYscDA9cjIzLDAKIAk7OwogCXRiaXQuei5vciBwNixwMD1yMjYsSUE2NF9QU1JfRFRfQklUCi0JKHA2KSBici5kcHRrIGt2bV9yZXN1bWVfdG9fZ3Vlc3QKKwkocDYpIGJyLmRwdGsga3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMKIAk7OwogCWFkZCByMjY9Vk1NX1ZDUFVfTUVUQV9SUjBfT0ZGU0VULHIyMQogCWFkZCByMjc9Vk1NX1ZDUFVfTUVUQV9SUjBfT0ZGU0VUKzgscjIxCkBAIC0yMTIsNyArMzA3LDcgQEAKIAltb3YgcnJbcjI4XT1yMjcKIAk7OwogCXNybHouZAotCWJyLm1hbnkga3ZtX3Jlc3VtZV90b19ndWVzdAorCWJyLm1hbnkga3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMKIEVORChrdm1fYXNtX3JzbSkKIAogCkBAIC0yMjEsMTEgKzMxNiwxMSBAQAogI2lmbmRlZiBBQ0NFX1NTTQogCWJyLm1hbnkga3ZtX3ZpcnR1YWxpemF0aW9uX2ZhdWx0X2JhY2sKICNlbmRpZgotCWFkZCByMTY9Vk1NX1ZQRF9CQVNFX09GRlNFVCxyMjEKKwlWTVhfVlBTX1NZTkNfUkVBRAorCTs7CiAJZXh0ci51IHIyNj1yMjUsNiwyMQogCWV4dHIudSByMjc9cjI1LDMxLDIKIAk7OwotCWxkOCByMTY9W3IxNl0KIAlleHRyLnUgcjI4PXIyNSwzNiwxCiAJZGVwIHIyNj1yMjcscjI2LDIxLDIKIAk7OyAgLy9yMjYgaXMgaW1tMjQKQEAgLTI3MSw3ICszNjYsNyBAQAogCXRiaXQubnogcDYscDA9cjI5LElBNjRfUFNSX0lfQklUCiAJOzsKIAl0Yml0Lnoub3IgcDYscDA9cjE5LElBNjRfUFNSX0lfQklUCi0JKHA2KSBici5kcHRrIGt2bV9yZXN1bWVfdG9fZ3Vlc3QKKwkocDYpIGJyLmRwdGsga3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMKIAk7OwogCWFkZCByMjk9VlBEX1ZUUFJfU1RBUlRfT0ZGU0VULHIxNgogCWFkZCByMzA9VlBEX1ZIUElfU1RBUlRfT0ZGU0VULHIxNgpAQCAtMjg2LDcgKzM4MSw3IEBACiAJOzsKIAljbXAuZ3QgcDYscDA9cjMwLHIxNwogCShwNikgYnIuZHBudC5mZXcga3ZtX2FzbV9kaXNwYXRjaF92ZXhpcnEKLQlici5tYW55IGt2bV9yZXN1bWVfdG9fZ3Vlc3QKKwlici5tYW55IGt2bV9yZXN1bWVfdG9fZ3Vlc3Rfd2l0aF9zeW5jCiBFTkQoa3ZtX2FzbV9zc20pCiAKIApAQCAtMjk1LDEwICszOTAsOSBAQAogI2lmbmRlZiBBQ0NFX01PVl9UT19QU1IKIAlici5tYW55IGt2bV92aXJ0dWFsaXphdGlvbl9mYXVsdF9iYWNrCiAjZW5kaWYKLQlhZGQgcjE2PVZNTV9WUERfQkFTRV9PRkZTRVQscjIxCi0JZXh0ci51IHIyNj1yMjUsMTMsNyAvL3IyCisJVk1YX1ZQU19TWU5DX1JFQUQKIAk7OwotCWxkOCByMTY9W3IxNl0KKwlleHRyLnUgcjI2PXIyNSwxMyw3IC8vcjIKIAlhZGRsIHIyMD1AZ3ByZWwoYXNtX21vdl9mcm9tX3JlZyksZ3AKIAk7OwogCWFkZHMgcjMwPWt2bV9hc21fbW92X3RvX3Bzcl9iYWNrLWFzbV9tb3ZfZnJvbV9yZWcscjIwCkBAIC0zNzQsNyArNDY4LDcgQEAKIAk7OwogCXRiaXQubnoub3IgcDYscDA9cjE3LElBNjRfUFNSX0lfQklUCiAJdGJpdC56Lm9yIHA2LHAwPXIzMCxJQTY0X1BTUl9JX0JJVAotCShwNikgYnIuZHBudC5mZXcga3ZtX3Jlc3VtZV90b19ndWVzdAorCShwNikgYnIuZHBudC5mZXcga3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMKIAk7OwogCWFkZCByMjk9VlBEX1ZUUFJfU1RBUlRfT0ZGU0VULHIxNgogCWFkZCByMzA9VlBEX1ZIUElfU1RBUlRfT0ZGU0VULHIxNgpAQCAtMzg5LDEzICs0ODMsMjkgQEAKIAk7OwogCWNtcC5ndCBwNixwMD1yMzAscjE3CiAJKHA2KSBici5kcG50LmZldyBrdm1fYXNtX2Rpc3BhdGNoX3ZleGlycQotCWJyLm1hbnkga3ZtX3Jlc3VtZV90b19ndWVzdAorCWJyLm1hbnkga3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMKIEVORChrdm1fYXNtX21vdl90b19wc3IpCiAKIAogRU5UUlkoa3ZtX2FzbV9kaXNwYXRjaF92ZXhpcnEpCiAvL2luY3JlbWVudCBpaXAKKwltb3YgcjE3ID0gYjAKKwltb3YgcjE4ID0gcjMxCit7Lm1paQorCWFkZCByMjU9Vk1NX1ZQRF9CQVNFX09GRlNFVCxyMjEKKwlub3AgMHgwCisJbW92IHIyNCA9IGlwCisJOzsKK30KK3subW1iCisJYWRkIHIyNCA9IDB4MjAsIHIyNAorCWxkOCByMjUgPSBbcjI1XQorCWJyLnNwdGsubWFueSBrdm1fdnBzX3N5bmNfd3JpdGUKK30KKwltb3YgYjAgPXIxNwogCW1vdiByMTY9Y3IuaXBzcgorCW1vdiByMzEgPSByMTgKKwltb3YgcjE5ID0gMzcKIAk7OwogCWV4dHIudSByMTc9cjE2LElBNjRfUFNSX1JJX0JJVCwyCiAJdGJpdC5ueiBwNixwNz1yMTYsSUE2NF9QU1JfUklfQklUKzEKQEAgLTQzNSwyNSArNTQ1LDMxIEBACiAJOzsKIGt2bV9hc21fdGhhc2hfYmFjazE6CiAJc2hyLnUgcjIzPXIxOSw2MQkJLy8gZ2V0IFJSIG51bWJlcgotCWFkZHMgcjI1PVZNTV9WQ1BVX1ZSUjBfT0ZGU0VULHIyMQkvLyBnZXQgdmNwdS0+YXJjaC52cnJbMF0ncyBhZGRyCisJYWRkcyByMjg9Vk1NX1ZDUFVfVlJSMF9PRkZTRVQscjIxCS8vIGdldCB2Y3B1LT5hcmNoLnZyclswXSdzIGFkZHIKIAlhZGRzIHIxNj1WTU1fVlBEX1ZQVEFfT0ZGU0VULHIxNgkvLyBnZXQgdnB0YQogCTs7Ci0Jc2hsYWRkIHIyNz1yMjMsMyxyMjUJLy8gZ2V0IHZjcHUtPmFyY2gudnJyW3IyM10ncyBhZGRyCisJc2hsYWRkIHIyNz1yMjMsMyxyMjgJLy8gZ2V0IHZjcHUtPmFyY2gudnJyW3IyM10ncyBhZGRyCiAJbGQ4IHIxNz1bcjE2XQkJLy8gZ2V0IFBUQQogCW1vdiByMjY9MQogCTs7Ci0JZXh0ci51IHIyOT1yMTcsMiw2CQkvLyBnZXQgcHRhLnNpemUKLQlsZDggcjI1PVtyMjddCQkvLyBnZXQgdmNwdS0+YXJjaC52cnJbcjIzXSdzIHZhbHVlCisJZXh0ci51IHIyOT1yMTcsMiw2CS8vIGdldCBwdGEuc2l6ZQorCWxkOCByMjg9W3IyN10JCS8vIGdldCB2Y3B1LT5hcmNoLnZycltyMjNdJ3MgdmFsdWUKIAk7OwotCWV4dHIudSByMjU9cjI1LDIsNgkJLy8gZ2V0IHJyLnBzCisJbW92IGIwPXIyNAorCS8vRmFsbGJhY2sgdG8gQyBpZiBwdGEudmYgaXMgc2V0CisJdGJpdC5ueiBwNixwMD1yMTcsIDgKKwk7OworCShwNikgbW92IHIyND1FVkVOVF9USEFTSAorCShwNikgYnIuY29uZC5kcG50Lm1hbnkga3ZtX3ZpcnR1YWxpemF0aW9uX2ZhdWx0X2JhY2sKKwlleHRyLnUgcjI4PXIyOCwyLDYJLy8gZ2V0IHJyLnBzCiAJc2hsIHIyMj1yMjYscjI5CQkvLyAxVUwgPDwgcHRhLnNpemUKIAk7OwotCXNoci51IHIyMz1yMTkscjI1CQkvLyB2YWRkciA+PiByci5wcworCXNoci51IHIyMz1yMTkscjI4CS8vIHZhZGRyID4+IHJyLnBzCiAJYWRkcyByMjY9MyxyMjkJCS8vIHB0YS5zaXplICsgMwogCXNobCByMjc9cjE3LDMJCS8vIHB0YSA8PCAzCiAJOzsKIAlzaGwgcjIzPXIyMywzCQkvLyAodmFkZHIgPj4gcnIucHMpIDw8IDMKLQlzaHIudSByMjc9cjI3LHIyNgkJLy8gKHB0YSA8PCAzKSA+PiAocHRhLnNpemUrMykKKwlzaHIudSByMjc9cjI3LHIyNgkvLyAocHRhIDw8IDMpID4+IChwdGEuc2l6ZSszKQogCW1vdmwgcjE2PTc8PDYxCiAJOzsKIAlhZGRzIHIyMj0tMSxyMjIJCS8vICgxVUwgPDwgcHRhLnNpemUpIC0gMQpAQCAtNzI0LDYgKzg0MCwyOSBAQAogICogcjMxOiBwcgogICogcjI0OiBiMAogICovCitFTlRSWShrdm1fcmVzdW1lX3RvX2d1ZXN0X3dpdGhfc3luYykKKwlhZGRzIHIxOT1WTU1fVlBEX0JBU0VfT0ZGU0VULHIyMQorCW1vdiByMTYgPSByMzEKKwltb3YgcjE3ID0gcjI0CisJOzsKK3subWlpCisJbGQ4IHIyNSA9W3IxOV0KKwlub3AgMHgwCisJbW92IHIyNCA9IGlwCisJOzsKK30KK3subW1iCisJYWRkIHIyNCA9MHgyMCwgcjI0CisJbm9wIDB4MAorCWJyLnNwdGsubWFueSBrdm1fdnBzX3N5bmNfd3JpdGUKK30KKworCW1vdiByMzEgPSByMTYKKwltb3YgcjI0ID1yMTcKKwk7OworCWJyLnNwdGsubWFueSBrdm1fcmVzdW1lX3RvX2d1ZXN0CitFTkQoa3ZtX3Jlc3VtZV90b19ndWVzdF93aXRoX3N5bmMpCisKIEVOVFJZKGt2bV9yZXN1bWVfdG9fZ3Vlc3QpCiAJYWRkcyByMTYgPSBWTU1fVkNQVV9TQVZFRF9HUF9PRkZTRVQscjIxCiAJOzsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vcHJvY2Vzcy5jIGIvYXJjaC9pYTY0L2t2bS9wcm9jZXNzLmMKaW5kZXggNWEzM2Y3ZS4uMzQxNzc4MyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS9wcm9jZXNzLmMKKysrIGIvYXJjaC9pYTY0L2t2bS9wcm9jZXNzLmMKQEAgLTk2Miw5ICs5NjIsOSBAQAogdm9pZCB2bW1fdHJhbnNpdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJaWE2NF9jYWxsX3ZzYShQQUxfVlBTX1NBVkUsICh1bnNpZ25lZCBsb25nKXZjcHUtPmFyY2gudnBkLAotCQkJMCwgMCwgMCwgMCwgMCwgMCk7CisJCQkxLCAwLCAwLCAwLCAwLCAwKTsKIAl2bW1fdHJhbXBvbGluZSgmdmNwdS0+YXJjaC5ndWVzdCwgJnZjcHUtPmFyY2guaG9zdCk7CiAJaWE2NF9jYWxsX3ZzYShQQUxfVlBTX1JFU1RPUkUsICh1bnNpZ25lZCBsb25nKXZjcHUtPmFyY2gudnBkLAotCQkJCQkJMCwgMCwgMCwgMCwgMCwgMCk7CisJCQkJCQkxLCAwLCAwLCAwLCAwLCAwKTsKIAlrdm1fZG9fcmVzdW1lX29wKHZjcHUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS92Y3B1LmggYi9hcmNoL2lhNjQva3ZtL3ZjcHUuaAppbmRleCBiMGZjZmI2Li4zNDFlM2ZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL3ZjcHUuaAorKysgYi9hcmNoL2lhNjQva3ZtL3ZjcHUuaApAQCAtMzEzLDIxICszMTMsMjEgQEAKIAl0cnAtPnJpZCA9IHJpZDsKIH0KIAotZXh0ZXJuIHU2NCBrdm1fbG9va3VwX21wYSh1NjQgZ3Bmbik7Ci1leHRlcm4gdTY0IGt2bV9ncGFfdG9fbXBhKHU2NCBncGEpOworZXh0ZXJuIHU2NCBrdm1fZ2V0X21wdF9lbnRyeSh1NjQgZ3Bmbik7CiAKLS8qIFJldHVybiBJL08gdHlwZSBpZiB0cnllICovCi0jZGVmaW5lIF9fZ3Bmbl9pc19pbyhncGZuKQkJCVwKLQkoewkJCQkJCVwKLQkgdTY0IHB0ZSwgcmV0ID0gMDsJCQlcCi0JIHB0ZSA9IGt2bV9sb29rdXBfbXBhKGdwZm4pOwkJXAotCSBpZiAoIShwdGUgJiBHUEZOX0lOVl9NQVNLKSkJCVwKLQkgcmV0ID0gcHRlICYgR1BGTl9JT19NQVNLOwlcCi0JIHJldDsJCQkJCVwKLQkgfSkKLQorLyogUmV0dXJuIEkvICovCitzdGF0aWMgaW5saW5lIHU2NCBfX2dwZm5faXNfaW8odTY0IGdwZm4pCit7CisJdTY0ICBwdGU7CisJcHRlID0ga3ZtX2dldF9tcHRfZW50cnkoZ3Bmbik7CisJaWYgKCEocHRlICYgR1BGTl9JTlZfTUFTSykpIHsKKwkJcHRlID0gcHRlICYgR1BGTl9JT19NQVNLOworCQlpZiAocHRlICE9IEdQRk5fUEhZU19NTUlPKQorCQkJcmV0dXJuIHB0ZTsKKwl9CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKLQogI2RlZmluZSBJQTY0X05PX0ZBVUxUCTAKICNkZWZpbmUgSUE2NF9GQVVMVAkxCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vdm1tX2l2dC5TIGIvYXJjaC9pYTY0L2t2bS92bW1faXZ0LlMKaW5kZXggM2VlNWY0OC4uYzFkNzI1MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS92bW1faXZ0LlMKKysrIGIvYXJjaC9pYTY0L2t2bS92bW1faXZ0LlMKQEAgLTEyNjEsMTEgKzEyNjEsNiBAQAogICAgIGFkZHMgcjE5PVZNTV9WUERfVlBTUl9PRkZTRVQscjE4CiAgICAgOzsKICAgICBsZDggcjE5PVtyMTldICAgICAgICAvL3Zwc3IKLSAgICBhZGRzIHIyMD1WTU1fVkNQVV9WU0FfQkFTRV9PRkZTRVQscjIxCi0gICAgOzsKLSAgICBsZDggcjIwPVtyMjBdCi0gICAgOzsKLS8vdnNhX3N5bmNfd3JpdGVfc3RhcnQKICAgICBtb3YgcjI1PXIxOAogICAgIGFkZHMgcjE2PSBWTU1fVkNQVV9HUF9PRkZTRVQscjIxCiAgICAgOzsKQEAgLTEyNzQsMTAgKzEyNjksNyBAQAogICAgIDs7CiAgICAgYWRkICByMjQ9cjI0LHIxNgogICAgIDs7Ci0gICAgYWRkIHIxNj1QQUxfVlBTX1NZTkNfV1JJVEUscjIwCi0gICAgOzsKLSAgICBtb3YgYjA9cjE2Ci0gICAgYnIuY29uZC5zcHRrIGIwICAgICAgICAgLy8gY2FsbCB0aGUgc2VydmljZQorICAgIGJyLnNwdGsubWFueSAga3ZtX3Zwc19zeW5jX3dyaXRlICAgICAgIC8vIGNhbGwgdGhlIHNlcnZpY2UKICAgICA7OwogRU5EKGlhNjRfbGVhdmVfaHlwZXJ2aXNvcikKIC8vIGZhbGwgdGhyb3VnaApAQCAtMTI4OCwyOCArMTI4MCwxNSBAQAogICogIHIxNzpjci5pc3IKICAqICByMTg6dnBkCiAgKiAgcjE5OnZwc3IKLSAqICByMjA6X192c2FfYmFzZQogICogIHIyMjpiMAogICogIHIyMzpwcmVkaWNhdGUKICAqLwogICAgIG1vdiByMjQ9cjIyCiAgICAgbW92IHIyNT1yMTgKICAgICB0Yml0Lm56IHAxLHAyID0gcjE5LElBNjRfUFNSX0lDX0JJVCAgICAgICAgLy8gcDE9dnBzci5pYworICAgIChwMSkgYnIuY29uZC5zcHRrLmZldyBrdm1fdnBzX3Jlc3VtZV9ub3JtYWwKKyAgICAocDIpIGJyLmNvbmQuc3B0ay5tYW55IGt2bV92cHNfcmVzdW1lX2hhbmRsZXIKICAgICA7OwotICAgIChwMSkgYWRkIHIyOT1QQUxfVlBTX1JFU1VNRV9OT1JNQUwscjIwCi0gICAgKHAxKSBici5zcHRrLm1hbnkgaWE2NF92bW1fZW50cnlfb3V0Ci0gICAgOzsKLSAgICB0Yml0Lm56IHAxLHAyID0gcjE3LElBNjRfSVNSX0lSX0JJVAkJLy9wMT1jci5pc3IuaXIKLSAgICA7OwotICAgIChwMSkgYWRkIHIyOT1QQUxfVlBTX1JFU1VNRV9OT1JNQUwscjIwCi0gICAgKHAyKSBhZGQgcjI5PVBBTF9WUFNfUkVTVU1FX0hBTkRMRVIscjIwCi0gICAgKHAyKSBsZDggcjI2PVtyMjVdCi0gICAgOzsKLWlhNjRfdm1tX2VudHJ5X291dDoKLSAgICBtb3YgcHI9cjIzLC0yCi0gICAgbW92IGIwPXIyOQotICAgIDs7Ci0gICAgYnIuY29uZC5zcHRrIGIwICAgICAgICAgICAgIC8vIGNhbGwgcGFsIHNlcnZpY2UKIEVORChpYTY0X3ZtbV9lbnRyeSkKIAogCkBAIC0xMzc2LDYgKzEzNTUsOSBAQAogICAgIC8vc2V0IHVwIGlwc3IsIGlpcCwgdnBkLnZwc3IsIGRjcgogICAgIC8vIEZvciBJUFNSOiBpdC9kdC9ydD0xLCBpL2ljPTEsIHNpPTEsIHZtL2JuPTEKICAgICAvLyBGb3IgRENSOiBhbGwgYml0cyAwCisgICAgYnN3LjAKKyAgICA7OworICAgIG1vdiByMjEgPXIxMwogICAgIGFkZHMgcjE0PS1WTU1fUFRfUkVHU19TSVpFLCByMTIKICAgICA7OwogICAgIG1vdmwgcjY9MHg1MDEwMDg4MjYwMDAgICAgICAvLyBJUFNSIGR0L3J0L2l0OjE7aS9pYzoxLCBzaToxLCB2bS9ibjoxCkBAIC0xMzg3LDEyICsxMzY5LDYgQEAKICAgICA7OwogICAgIHNybHouaQogICAgIDs7Ci0gICAgYnN3LjAKLSAgICA7OwotICAgIG1vdiByMjEgPXIxMwotICAgIDs7Ci0gICAgYnN3LjEKLSAgICA7OwogICAgIG1vdiBhci5yc2MgPSAwCiAgICAgOzsKICAgICBmbHVzaHJzCkBAIC0xNDA2LDEyICsxMzgyLDkgQEAKICAgICBsZDggcjEgPSBbcjIwXQogICAgIDs7CiAgICAgbW92IGNyLmlpcD1yNAotICAgIDs7CiAgICAgYWRkcyByMTY9Vk1NX1ZQRF9CQVNFX09GRlNFVCxyMTMKLSAgICBhZGRzIHIyMD1WTU1fVkNQVV9WU0FfQkFTRV9PRkZTRVQscjEzCiAgICAgOzsKICAgICBsZDggcjE4PVtyMTZdCi0gICAgbGQ4IHIyMD1bcjIwXQogICAgIDs7CiAgICAgYWRkcyByMTk9Vk1NX1ZQRF9WUFNSX09GRlNFVCxyMTgKICAgICA7OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS92dGxiLmMgYi9hcmNoL2lhNjQva3ZtL3Z0bGIuYwppbmRleCBkZWY0NTc2Li5lMjJiOTMzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL3Z0bGIuYworKysgYi9hcmNoL2lhNjQva3ZtL3Z0bGIuYwpAQCAtMzkwLDcgKzM5MCw3IEBACiAKIHU2NCB0cmFuc2xhdGVfcGh5X3B0ZSh1NjQgKnB0ZSwgdTY0IGl0aXIsIHU2NCB2YSkKIHsKLQl1NjQgcHMsIHBzX21hc2ssIHBhZGRyLCBtYWRkcjsKKwl1NjQgcHMsIHBzX21hc2ssIHBhZGRyLCBtYWRkciwgaW9fbWFzazsKIAl1bmlvbiBwdGVfZmxhZ3MgcGh5X3B0ZTsKIAogCXBzID0gaXRpcl9wcyhpdGlyKTsKQEAgLTM5OCw4ICszOTgsOSBAQAogCXBoeV9wdGUudmFsID0gKnB0ZTsKIAlwYWRkciA9ICpwdGU7CiAJcGFkZHIgPSAoKHBhZGRyICYgX1BBR0VfUFBOX01BU0spICYgcHNfbWFzaykgfCAodmEgJiB+cHNfbWFzayk7Ci0JbWFkZHIgPSBrdm1fbG9va3VwX21wYShwYWRkciA+PiBQQUdFX1NISUZUKTsKLQlpZiAobWFkZHIgJiBHUEZOX0lPX01BU0spIHsKKwltYWRkciA9IGt2bV9nZXRfbXB0X2VudHJ5KHBhZGRyID4+IFBBR0VfU0hJRlQpOworCWlvX21hc2sgPSBtYWRkciAmIEdQRk5fSU9fTUFTSzsKKwlpZiAoaW9fbWFzayAmJiAoaW9fbWFzayAhPSBHUEZOX1BIWVNfTU1JTykpIHsKIAkJKnB0ZSB8PSBWVExCX1BURV9JTzsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQxOCw3ICs0MTksNyBAQAogCQkJCQkJdTY0IGlmYSwgaW50IHR5cGUpCiB7CiAJdTY0IHBzOwotCXU2NCBwaHlfcHRlOworCXU2NCBwaHlfcHRlLCBpb19tYXNrLCBpbmRleDsKIAl1bmlvbiBpYTY0X3JyIHZyciwgbXJyOwogCWludCByZXQgPSAwOwogCkBAIC00MjYsMTMgKzQyNywxNiBAQAogCXZyci52YWwgPSB2Y3B1X2dldF9ycih2LCBpZmEpOwogCW1yci52YWwgPSBpYTY0X2dldF9ycihpZmEpOwogCisJaW5kZXggPSAocHRlICYgX1BBR0VfUFBOX01BU0spID4+IFBBR0VfU0hJRlQ7CisJaW9fbWFzayA9IGt2bV9nZXRfbXB0X2VudHJ5KGluZGV4KSAmIEdQRk5fSU9fTUFTSzsKIAlwaHlfcHRlID0gdHJhbnNsYXRlX3BoeV9wdGUoJnB0ZSwgaXRpciwgaWZhKTsKIAogCS8qIEVuc3VyZSBXQiBhdHRyaWJ1dGUgaWYgcHRlIGlzIHJlbGF0ZWQgdG8gYSBub3JtYWwgbWVtIHBhZ2UsCiAJICogd2hpY2ggaXMgcmVxdWlyZWQgYnkgdmdhIGFjY2VsZXJhdGlvbiBzaW5jZSBxZW11IG1hcHMgc2hhcmVkCiAJICogdnJhbSBidWZmZXIgd2l0aCBXQi4KIAkgKi8KLQlpZiAoIShwdGUgJiBWVExCX1BURV9JTykgJiYgKChwdGUgJiBfUEFHRV9NQV9NQVNLKSAhPSBfUEFHRV9NQV9OQVQpKSB7CisJaWYgKCEocHRlICYgVlRMQl9QVEVfSU8pICYmICgocHRlICYgX1BBR0VfTUFfTUFTSykgIT0gX1BBR0VfTUFfTkFUKSAmJgorCQkJaW9fbWFzayAhPSBHUEZOX1BIWVNfTU1JTykgewogCQlwdGUgJj0gfl9QQUdFX01BX01BU0s7CiAJCXBoeV9wdGUgJj0gfl9QQUdFX01BX01BU0s7CiAJfQpAQCAtNTY2LDEyICs1NzAsMTkgQEAKIAl9CiB9CiAKLXU2NCBrdm1fbG9va3VwX21wYSh1NjQgZ3BmbikKK3U2NCBrdm1fZ2V0X21wdF9lbnRyeSh1NjQgZ3BmbikKIHsKIAl1NjQgKmJhc2UgPSAodTY0ICopIEtWTV9QMk1fQkFTRTsKIAlyZXR1cm4gKihiYXNlICsgZ3Bmbik7CiB9CiAKK3U2NCBrdm1fbG9va3VwX21wYSh1NjQgZ3BmbikKK3sKKwl1NjQgbWFkZHI7CisJbWFkZHIgPSBrdm1fZ2V0X21wdF9lbnRyeShncGZuKTsKKwlyZXR1cm4gbWFkZHImX1BBR0VfUFBOX01BU0s7Cit9CisKIHU2NCBrdm1fZ3BhX3RvX21wYSh1NjQgZ3BhKQogewogCXU2NCBwdGUgPSBrdm1fbG9va3VwX21wYShncGEgPj4gUEFHRV9TSElGVCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKaW5kZXggZTU2NmZmNC4uMGVlMDg1ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9jb250aWcuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJICogZ2V0X3plcm9lZF9wYWdlKCkuCiAJICovCiAJaWYgKGZpcnN0X3RpbWUpIHsKLQkJdm9pZCAqY3B1MF9kYXRhID0gX19waHlzX3Blcl9jcHVfc3RhcnQgLSBQRVJDUFVfUEFHRV9TSVpFOworCQl2b2lkICpjcHUwX2RhdGEgPSBfX2NwdTBfcGVyX2NwdTsKIAogCQlmaXJzdF90aW1lPTA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwppbmRleCA3ODAyNmFhLi5kOGM1ZmNkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2Vhcmx5X2NwdShjcHUpIHsKIAkJaWYgKGNwdSA9PSAwKSB7Ci0JCQl2b2lkICpjcHUwX2RhdGEgPSBfX3BoeXNfcGVyX2NwdV9zdGFydCAtIFBFUkNQVV9QQUdFX1NJWkU7CisJCQl2b2lkICpjcHUwX2RhdGEgPSBfX2NwdTBfcGVyX2NwdTsKIAkJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IChjaGFyKiljcHUwX2RhdGEgLQogCQkJCV9fcGVyX2NwdV9zdGFydDsKIAkJfSBlbHNlIGlmIChub2RlID09IG5vZGVfY3B1aWRbY3B1XS5uaWQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9pbml0LmMgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCmluZGV4IDIwMDEwMGUuLmY0ODJhOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9pYTY0L21tL2luaXQuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKLSNpbmNsdWRlIDxhc20vYS5vdXQuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwppbmRleCA1Mjk0NjJjLi43OTE2NTEyMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwpAQCAtNDIwLDggKzQyMCwxMCBAQAogCQllbnRyeSA9IGZpbmRfbmV4dF96ZXJvX2JpdChtYXAsIG1hcHNpemUsIGxhc3RfZW50cnkpOwogCX0KIAotCWlmIChlbnRyeSA+IG1hcHNpemUpCisJaWYgKGVudHJ5ID4gbWFwc2l6ZSkgeworCQlrZnJlZShjYV9kbWFtYXApOwogCQlnb3RvIG1hcF9yZXR1cm47CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKIAkJc2V0X2JpdChlbnRyeSArIGksIG1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IGE1Zjg2NGMuLjAwMjg5YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0zNiw5ICszNiw2IEBACiBjb25maWcgTk9fRE1BCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgQVJDSF9TVVBQT1JUU19BT1VUCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgSFoKIAlpbnQKIAlkZWZhdWx0IDEwMApAQCAtMjE2LDEwICsyMTMsNiBAQAogCWRlZmF1bHQgIjAxMDAwMDAwIiBpZiBQTEFUX00zMjEwNFVUCiAJZGVmYXVsdCAiMDA4MDAwMDAiIGlmIFBMQVRfT0FLUzMyUgogCi1jb25maWcgTk9ISUdITUVNCi0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFCiAJYm9vbCAiSW50ZXJuYWwgUkFNIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDSElQX00zMjcwMCB8fCBDSElQX00zMjEwMiB8fCBDSElQX1ZERUMyIHx8IENISVBfT1BTUCB8fCBDSElQX00zMjEwNApAQCAtNDEwLDExICs0MDMsNyBAQAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogCiBjb25maWcgSVNBCi0JYm9vbCAiSVNBIHN1cHBvcnQiCi0JaGVscAotCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKLQkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKLQkgIGluc2lkZSB5b3VyIGJveC4gIElmIHlvdSBoYXZlIElTQSwgc2F5IFksIG90aGVyd2lzZSBOLgorCWJvb2wKIAogc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMgYi9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMKaW5kZXggZDRlYWEyZi4uNjEyZDM1YiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvZW50cnkuUwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJYW5kMwlyNCwgcjQsICMweDgwMDAJCTsgY2hlY2sgQlNNIGJpdAogI2VuZGlmCiAJYmVxeglyNCwgcmVzdW1lX2tlcm5lbAotRU5UUlkocmVzdW1lX3VzZXJzcGFjZSkKK3Jlc3VtZV91c2Vyc3BhY2U6CiAJRElTQUJMRV9JTlRFUlJVUFRTKHI0KQkJOyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKIAkJCQkJOyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCiAJCQkJCTsgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvaGVhZC5TIGIvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKaW5kZXggZGFiNzQzNi4uNDAxODA3NyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9oZWFkLlMKQEAgLTI5LDcgKzI5LDYgQEAKIAkuZ2xvYmFsIF9lbmQKIEVOVFJZKHN0ZXh0KQogRU5UUlkoX3N0ZXh0KQotRU5UUlkoc3RhcnR1cF8zMikKIAkvKiBTZXR1cCB1cCB0aGUgc3RhY2sgcG9pbnRlciAqLwogCUxESU1NCShyMCwgc3BpX3N0YWNrX3RvcCkKIAlMRElNTQkocjEsIHNwdV9zdGFja190b3ApCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL2lycS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9pcnEuYwppbmRleCBkMGM1YjBiLi4yYWVhZTQ2IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvaXJxLmMKQEAgLTIyLDkgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1hdG9taWNfdCBpcnFfZXJyX2NvdW50OwotYXRvbWljX3QgaXJxX21pc19jb3VudDsKLQogLyoKICAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgogICovCkBAIC02Myw5ICs2MCw2IEBACiAJCXNlcV9wdXRjKHAsICdcbicpOwogc2tpcDoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwotCX0gZWxzZSBpZiAoaSA9PSBOUl9JUlFTKSB7Ci0JCXNlcV9wcmludGYocCwgIkVSUjogJTEwdVxuIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKLQkJc2VxX3ByaW50ZihwLCAiTUlTOiAlMTB1XG4iLCBhdG9taWNfcmVhZCgmaXJxX21pc19jb3VudCkpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvbTMycl9rc3ltcy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9tMzJyX2tzeW1zLmMKaW5kZXggMTZiY2IxOC4uMjI2MjRiNSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9tMzJyX2tzeW1zLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9tMzJyX2tzeW1zLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KIEVYUE9SVF9TWU1CT0woYm9vdF9jcHVfZGF0YSk7CkBAIC02NSw2ICs2Niw3IEBACiBFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2UpOwogRVhQT1JUX1NZTUJPTChzdHJsZW4pOworRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwogCiBFWFBPUlRfU1lNQk9MKF9pbmIpOwogRVhQT1JUX1NZTUJPTChfaW53KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYTY4OWUyOS4uNzEwM2Q5MSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTExLDcgKzExLDcgQEAKICN1bmRlZiBERUJVR19QUk9DRVNTCiAjaWZkZWYgREVCVUdfUFJPQ0VTUwogI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgIHByaW50aygiJXM6JWQ6JXM6ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sIFwKLSAgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisgIF9fZnVuY19fLCAjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKICNlbmRpZgpAQCAtMzUsOCArMzUsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKLXN0YXRpYyBpbnQgaGx0X2NvdW50ZXI9MDsKLQogLyoKICAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgogICovCkBAIC00OCwzMSArNDYsMTYgQEAKIC8qCiAgKiBQb3dlcm1hbmFnZW1lbnQgaWRsZSBmdW5jdGlvbiwgaWYgYW55Li4KICAqLwotdm9pZCAoKnBtX2lkbGUpKHZvaWQpID0gTlVMTDsKLUVYUE9SVF9TWU1CT0wocG1faWRsZSk7CitzdGF0aWMgdm9pZCAoKnBtX2lkbGUpKHZvaWQpID0gTlVMTDsKIAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBOVUxMOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCi12b2lkIGRpc2FibGVfaGx0KHZvaWQpCi17Ci0JaGx0X2NvdW50ZXIrKzsKLX0KLQotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2hsdCk7Ci0KLXZvaWQgZW5hYmxlX2hsdCh2b2lkKQotewotCWhsdF9jb3VudGVyLS07Ci19Ci0KLUVYUE9SVF9TWU1CT0woZW5hYmxlX2hsdCk7Ci0KIC8qCiAgKiBXZSB1c2UgdGhpcyBpcyB3ZSBkb24ndCBoYXZlIGFueSBiZXR0ZXIKICAqIGlkbGUgcm91dGluZS4uCiAgKi8KLXZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCitzdGF0aWMgdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKIAkvKiBNMzJSX0ZJWE1FOiBQbGVhc2UgdXNlICJjcHVfc2xlZXAiIG1vZGUuICAqLwogCWNwdV9yZWxheCgpOwpAQCAtMjYwLDE1ICsyNDMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogQ2FwdHVyZSB0aGUgdXNlciBzcGFjZSByZWdpc3RlcnMgaWYgdGhlIHRhc2sgaXMgbm90IHJ1bm5pbmcgKGluIHVzZXIgc3BhY2UpCi0gKi8KLWludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2dyZWdzZXRfdCAqcmVncykKLXsKLQkvKiBNMzJSX0ZJWE1FICovCi0JcmV0dXJuIDE7Ci19Ci0KIGFzbWxpbmthZ2UgaW50IHN5c19mb3JrKHVuc2lnbmVkIGxvbmcgcjAsIHVuc2lnbmVkIGxvbmcgcjEsIHVuc2lnbmVkIGxvbmcgcjIsCiAJdW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwKIAlzdHJ1Y3QgcHRfcmVncyByZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKaW5kZXggNzU3N2Y5Ny4uOTI5ZTVjOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXAuYwpAQCAtODQsNyArODQsNyBAQAogdm9pZCBzbXBfaXBpX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKIHZvaWQgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCh2b2lkKTsKIAotdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHNlbmRfSVBJX2FsbGJ1dHNlbGYoaW50LCBpbnQpOwogc3RhdGljIHZvaWQgc2VuZF9JUElfbWFzayhjcHVtYXNrX3QsIGludCwgaW50KTsKIHVuc2lnbmVkIGxvbmcgc2VuZF9JUElfbWFza19waHlzKGNwdW1hc2tfdCwgaW50LCBpbnQpOwogCkBAIC03MjIsNyArNzIyLDcgQEAKICAqIC0tLS0tLS0tLS0gLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIHNlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IGlwaV9udW0sIGludCB0cnkpCitzdGF0aWMgdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCBpcGlfbnVtLCBpbnQgdHJ5KQogewogCWNwdW1hc2tfdCBjcHVtYXNrOwogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDJjMDNhYzEuLmZjMjk5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCkBAIC00OTgsNiArNDk4LDggQEAKIHsKIAlpbnQgY3B1X2lkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCisJbm90aWZ5X2NwdV9zdGFydGluZyhjcHVfaWQpOworCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJLyogR2V0IG91ciBib2dvbWlwcy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvdGltZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKaW5kZXggOTk0Y2MxNS4uNmVhMDE3NyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC90aW1lLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCwgaW50KTsKIGV4dGVybiB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCk7CiAjZW5kaWYKIApAQCAtMTg4LDcgKzE4Nyw3IEBACiAgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCiAgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawogICovCi1pcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAjaWZuZGVmIENPTkZJR19TTVAKIAlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CkBAIC0yMjgsNyArMjI3LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0cnVjdCBpcnFhY3Rpb24gaXJxMCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgPSB7CiAJLmhhbmRsZXIgPSB0aW1lcl9pbnRlcnJ1cHQsCiAJLmZsYWdzID0gSVJRRl9ESVNBQkxFRCwKIAkubWFzayA9IENQVV9NQVNLX05PTkUsCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMgYi9hcmNoL20zMnIva2VybmVsL3RyYXBzLmMKaW5kZXggNDYxNTlhNC4uMDNiMTRlNSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvdHJhcHMuYwpAQCAtNjEsNyArNjEsNyBAQAogCSgodW5zaWduZWQgbG9uZylmdW5jIC0gKHVuc2lnbmVkIGxvbmcpZWl0X3ZlY3RvciAtIGVudHJ5KjQpLzQgXAogCSsgMHhmZjAwMDAwMFVMCiAKLXZvaWQJc2V0X2VpdF92ZWN0b3JfZW50cmllcyh2b2lkKQorc3RhdGljIHZvaWQgc2V0X2VpdF92ZWN0b3JfZW50cmllcyh2b2lkKQogewogCWV4dGVybiB2b2lkIGRlZmF1bHRfZWl0X2hhbmRsZXIodm9pZCk7CiAJZXh0ZXJuIHZvaWQgc3lzdGVtX2NhbGwodm9pZCk7CkBAIC0xMjEsOSArMTIxLDkgQEAKIAljcHVfaW5pdCgpOwogfQogCi1pbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMjQ7CitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0OwogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKK3N0YXRpYyB2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKQEAgLTIyNCw3ICsyMjQsNyBAQAogCXByaW50aygiXG4iKTsKIH0KIAotREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwogCiB2b2lkIGRpZShjb25zdCBjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2xpYi9kZWxheS5jIGIvYXJjaC9tMzJyL2xpYi9kZWxheS5jCmluZGV4IDU5YmZjMzQuLmNlZDU0OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9saWIvZGVsYXkuYworKysgYi9hcmNoL20zMnIvbGliL2RlbGF5LmMKQEAgLTYsNiArNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaWZkZWYgQ09ORklHX1NNUAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KQEAgLTEyMSwzICsxMjIsNCBAQAogewogCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7ICAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCiB9CitFWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYyBiL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYwppbmRleCBjYmMzYzRjLi43ZGFmODk3IDEwMDY0NAotLS0gYS9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9tMzJyL21tL2Rpc2NvbnRpZy5jCkBAIC0xMTEsOSArMTExLDkgQEAKIAkJCQlpbml0cmRfc3RhcnQsIElOSVRSRF9TSVpFKTsKIAkJfSBlbHNlIHsKIAkJCXByaW50aygiaW5pdHJkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBtZW1vcnkgIgotCQkJCSIoMHglMDhseCA+IDB4JTA4bHgpXG5kaXNhYmxpbmcgaW5pdHJkXG4iLAorCQkJCSIoMHglMDhseCA+IDB4JTA4bGx4KVxuZGlzYWJsaW5nIGluaXRyZFxuIiwKIAkJCQlJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSwKLQkJCQlQRk5fUEhZUyhtYXhfbG93X3BmbikpOworCQkJICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKVBGTl9QSFlTKG1heF9sb3dfcGZuKSk7CiAKIAkJCWluaXRyZF9zdGFydCA9IDA7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggOGM1ZTFkZS4uNjc3YzkzYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTUsNiArNSw3IEBACiBjb25maWcgTTY4SwogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgSEFWRV9BT1VUCiAJc2VsZWN0IEhBVkVfSURFCiAKIGNvbmZpZyBNTVUKQEAgLTUzLDkgKzU0LDYgQEAKIGNvbmZpZyBOT19ETUEKIAlkZWZfYm9vbCBTVU4zCiAKLWNvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKLQlkZWZfYm9vbCB5Ci0KIGNvbmZpZyBIWgogCWludAogCWRlZmF1bHQgMTAwCkBAIC0xMDcsMjEgKzEwNSw5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZXMsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBwY21jaWFfY29yZSBhbmQgZHMuCiAKLWNvbmZpZyBTVU4zCi0JYm9vbCAiU3VuMyBzdXBwb3J0IgotCXNlbGVjdCBNNjgwMjAKLQlzZWxlY3QgTU1VX1NVTjMgaWYgTU1VCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU3VuIDMgc2VyaWVzIG9mIHdvcmtzdGF0aW9ucwotCSAgKDMvNTAsIDMvNjAsIDMvMXh4LCAzLzJ4eCBzeXN0ZW1zKS4gRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMKLQkgIHRoYXQgYWxsIG90aGVyIGhhcmR3YXJlIHR5cGVzIG11c3QgYmUgZGlzYWJsZWQsIGFzIFN1biAzIGtlcm5lbHMKLQkgIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbTY4ayB0YXJnZXRzIChpbmNsdWRpbmcgU3VuIDN4ISkuCi0KLQkgIElmIHlvdSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYSBrZXJuZWwgZXhjbHVzaXZlbHkgZm9yIGEgU3VuIDMsIHNheSBOLgotCiBjb25maWcgQU1JR0EKIAlib29sICJBbWlnYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbWlnYSBzZXJpZXMgb2YgY29tcHV0ZXJzLiBJZgogCSAgeW91IHBsYW4gdG8gdXNlIHRoaXMga2VybmVsIG9uIGFuIEFtaWdhLCBzYXkgWSBoZXJlIGFuZCBicm93c2UgdGhlCkBAIC0xMjksMzMgKzExNSwxNiBAQAogCiBjb25maWcgQVRBUkkKIAlib29sICJBdGFyaSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSA2ODAwMC1iYXNlZCBBdGFyaSBzZXJpZXMgb2YKIAkgIGNvbXB1dGVycyAoaW5jbHVkaW5nIHRoZSBUVCwgRmFsY29uIGFuZCBNZWR1c2EpLiBJZiB5b3UgcGxhbiB0byB1c2UKIAkgIHRoaXMga2VybmVsIG9uIGFuIEF0YXJpLCBzYXkgWSBoZXJlIGFuZCBicm93c2UgdGhlIG1hdGVyaWFsCiAJICBhdmFpbGFibGUgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9tNjhrPjsgb3RoZXJ3aXNlIHNheSBOLgogCi1jb25maWcgSEFERVMKLQlib29sICJIYWRlcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVRBUkkgJiYgQlJPS0VOCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSGFkZXMgQXRhcmkgY2xvbmUuIElmIHlvdSBwbGFuCi0JICB0byB1c2UgdGhpcyBrZXJuZWwgb24gYSBIYWRlcywgc2F5IFkgaGVyZTsgb3RoZXJ3aXNlIHNheSBOLgotCi1jb25maWcgUENJCi0JYm9vbAotCWRlcGVuZHMgb24gSEFERVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBGaW5kIG91dCB3aGV0aGVyIHlvdSBoYXZlIGEgUENJIG1vdGhlcmJvYXJkLiBQQ0kgaXMgdGhlIG5hbWUgb2YgYQotCSAgYnVzIHN5c3RlbSwgaS5lLiB0aGUgd2F5IHRoZSBDUFUgdGFsa3MgdG8gdGhlIG90aGVyIHN0dWZmIGluc2lkZQotCSAgeW91ciBib3guIE90aGVyIGJ1cyBzeXN0ZW1zIGFyZSBJU0EsIEVJU0EsIE1pY3JvQ2hhbm5lbCAoTUNBKSBvcgotCSAgVkVTQS4gSWYgeW91IGhhdmUgUENJLCBzYXkgWSwgb3RoZXJ3aXNlIE4uCi0KIGNvbmZpZyBNQUMKIAlib29sICJNYWNpbnRvc2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFNTVVfU1VOMworCXNlbGVjdCBNTVVfTU9UT1JPTEEgaWYgTU1VCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQXBwbGUgTWFjaW50b3NoIHNlcmllcyBvZgogCSAgY29tcHV0ZXJzICh5ZXMsIHRoZXJlIGlzIGV4cGVyaW1lbnRhbCBzdXBwb3J0IG5vdywgYXQgbGVhc3QgZm9yIHBhcnQKQEAgLTE3NiwxNCArMTQ1LDE0IEBACiAKIGNvbmZpZyBBUE9MTE8KIAlib29sICJBcG9sbG8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFNTVVfU1VOMworCXNlbGVjdCBNTVVfTU9UT1JPTEEgaWYgTU1VCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBydW4gTGludXggb24gYW4gTUM2ODB4MC1iYXNlZCBBcG9sbG8KIAkgIERvbWFpbiB3b3Jrc3RhdGlvbiBzdWNoIGFzIHRoZSBETjM1MDAuCiAKIGNvbmZpZyBWTUUKIAlib29sICJWTUUgKE1vdG9yb2xhIGFuZCBCVk0pIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhTU1VX1NVTjMKKwlzZWxlY3QgTU1VX01PVE9ST0xBIGlmIE1NVQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBrZXJuZWwgZm9yIGEgNjgweDAgYmFzZWQgVk1FCiAJICBib2FyZC4gIEJvYXJkcyBjdXJyZW50bHkgc3VwcG9ydGVkIGluY2x1ZGUgTW90b3JvbGEgYm9hcmRzIE1WTUUxNDcsCkBAIC0yMjAsNyArMTg5LDcgQEAKIAogY29uZmlnIEhQMzAwCiAJYm9vbCAiSFA5MDAwLzMwMCBhbmQgSFA5MDAwLzQwMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBIUDkwMDAvMzAwIGFuZCBIUDkwMDAvNDAwIHNlcmllcwogCSAgb2Ygd29ya3N0YXRpb25zLiBTdXBwb3J0IGZvciB0aGVzZSBtYWNoaW5lcyBpcyBzdGlsbCBzb21ld2hhdApAQCAtMjM5LDcgKzIwOCw3IEBACiAKIGNvbmZpZyBTVU4zWAogCWJvb2wgIlN1bjN4IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhTU1VX1NVTjMKKwlzZWxlY3QgTU1VX01PVE9ST0xBIGlmIE1NVQogCXNlbGVjdCBNNjgwMzAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTdW4gM3ggc2VyaWVzIG9mIHdvcmtzdGF0aW9ucy4KQEAgLTI1Miw3ICsyMjEsNyBAQAogCiBjb25maWcgUTQwCiAJYm9vbCAiUTQwL1E2MCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIU1NVV9TVU4zCisJc2VsZWN0IE1NVV9NT1RPUk9MQSBpZiBNTVUKIAloZWxwCiAJICBUaGUgUTQwIGlzIGEgTW90b3JvbGEgNjgwNDAtYmFzZWQgc3VjY2Vzc29yIHRvIHRoZSBTaW5jbGFpciBRTAogCSAgbWFudWZhY3R1cmVkIGluIEdlcm1hbnkuICBUaGVyZSBpcyBhbiBvZmZpY2lhbCBRNDAgaG9tZSBwYWdlIGF0CkBAIC0yNjAsNiArMjI5LDE5IEBACiAJICBRNjAuIFNlbGVjdCB5b3VyIENQVSBiZWxvdy4gIEZvciA2OExDMDYwIGRvbid0IGZvcmdldCB0byBlbmFibGUgRlBVCiAJICBlbXVsYXRpb24uCiAKK2NvbmZpZyBTVU4zCisJYm9vbCAiU3VuMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gIU1NVV9NT1RPUk9MQQorCXNlbGVjdCBNTVVfU1VOMyBpZiBNTVUKKwlzZWxlY3QgTTY4MDIwCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU3VuIDMgc2VyaWVzIG9mIHdvcmtzdGF0aW9ucworCSAgKDMvNTAsIDMvNjAsIDMvMXh4LCAzLzJ4eCBzeXN0ZW1zKS4gRW5hYmxpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMKKwkgIHRoYXQgYWxsIG90aGVyIGhhcmR3YXJlIHR5cGVzIG11c3QgYmUgZGlzYWJsZWQsIGFzIFN1biAzIGtlcm5lbHMKKwkgIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbTY4ayB0YXJnZXRzIChpbmNsdWRpbmcgU3VuIDN4ISkuCisKKwkgIElmIHlvdSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYSBrZXJuZWwgZXhjbHVzaXZlbHkgZm9yIGEgU3VuIDMsIHNheSBOLgorCiBjb21tZW50ICJQcm9jZXNzb3IgdHlwZSIKIAogY29uZmlnIE02ODAyMApAQCAtMjk3LDEwICsyNzksMTAgQEAKIGNvbmZpZyBNTVVfTU9UT1JPTEEKIAlib29sCiAJZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9TVU4zCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBNTVVfU1VOMwogCWJvb2wKKwlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX01PVE9ST0xBCiAKIGNvbmZpZyBNNjhLRlBVX0VNVQogCWJvb2wgIk1hdGggZW11bGF0aW9uIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKaW5kZXggZGY2NzlkOS4uMGEzZjllOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2V5Ym9hcmQuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtOTg0LDMgKzk4NSwxMSBAQAogCiAJcmV0dXJuIGxlbjsKIH0KKworLyoKKyAqIFRoZSBBbWlnYSBrZXlib2FyZCBkcml2ZXIgbmVlZHMga2V5X21hcHMsIGJ1dCB3ZSBjYW5ub3QgZXhwb3J0IGl0IGluCisgKiBkcml2ZXJzL2NoYXIvZGVma2V5bWFwLmMsIGFzIGl0IGlzIGF1dG9nZW5lcmF0ZWQKKyAqLworI2lmZGVmIENPTkZJR19IV19DT05TT0xFCitFWFBPUlRfU1lNQk9MX0dQTChrZXlfbWFwcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9NYWtlZmlsZSBiL2FyY2gvbTY4ay9hdGFyaS9NYWtlZmlsZQppbmRleCAyY2Q5MDVlLi4wY2FjNzIzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2F0YXJpL01ha2VmaWxlCkBAIC01LDcgKzUsNCBAQAogb2JqLXkJCTo9IGNvbmZpZy5vIHRpbWUubyBkZWJ1Zy5vIGF0YWludHMubyBzdGRtYS5vIFwKIAkJCWF0YXNvdW5kLm8gc3RyYW0ubwogCi1pZmVxICgkKENPTkZJR19QQ0kpLHkpCi1vYmotJChDT05GSUdfSEFERVMpCSs9IGhhZGVzLXBjaS5vCi1lbmRpZgogb2JqLSQoQ09ORklHX0FUQVJJX0tCRF9DT1JFKQkrPSBhdGFrZXliLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCmluZGV4IGI0NTU5M2EuLmRiYTRhZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwpAQCAtNDA3LDEwICs0MDcsOCBAQAogCQkgKiBnZXRzIG92ZXJydW5zKQogCQkgKi8KIAotCQlpZiAoIU1BQ0hfSVNfSEFERVMpIHsKLQkJCXZlY3RvcnNbVkVDX0lOVDJdID0gZmFsY29uX2hibGhhbmRsZXI7Ci0JCQl2ZWN0b3JzW1ZFQ19JTlQ0XSA9IGZhbGNvbl9oYmxoYW5kbGVyOwotCQl9CisJCXZlY3RvcnNbVkVDX0lOVDJdID0gZmFsY29uX2hibGhhbmRsZXI7CisJCXZlY3RvcnNbVkVDX0lOVDRdID0gZmFsY29uX2hibGhhbmRsZXI7CiAJfQogCiAJaWYgKEFUQVJJSFdfUFJFU0VOVChQQ01fOEJJVCkgJiYgQVRBUklIV19QUkVTRU5UKE1JQ1JPV0lSRSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMgYi9hcmNoL202OGsvYXRhcmkvYXRha2V5Yi5jCmluZGV4IGJiOTU5ZmIuLmMwMzhiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWtleWIuYwpAQCAtNjM1LDE1ICs2MzUsMyBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhcmlfa2V5Yl9pbml0KTsKLQotaW50IGF0YXJpX2tiZF90cmFuc2xhdGUodW5zaWduZWQgY2hhciBrZXljb2RlLCB1bnNpZ25lZCBjaGFyICprZXljb2RlcCwgY2hhciByYXdfbW9kZSkKLXsKLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkvKiBBTFQrSEVMUCBwcmVzc2VkPyAqLwotCWlmICgoa2V5Y29kZSA9PSA5OCkgJiYgKChzaGlmdF9zdGF0ZSAmIDB4ZmYpID09IDgpKQotCQkqa2V5Y29kZXAgPSAweGZmOwotCWVsc2UKLSNlbmRpZgotCQkqa2V5Y29kZXAgPSBrZXljb2RlOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCmluZGV4IDU5NDVlMTUuLmFmMDMxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYworKysgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCSAqLwogCiAJcHJpbnRrKCJBdGFyaSBoYXJkd2FyZSBmb3VuZDogIik7Ci0JaWYgKE1BQ0hfSVNfTUVEVVNBIHx8IE1BQ0hfSVNfSEFERVMpIHsKKwlpZiAoTUFDSF9JU19NRURVU0EpIHsKIAkJLyogVGhlcmUncyBubyBBdGFyaSB2aWRlbyBoYXJkd2FyZSBvbiB0aGUgTWVkdXNhLCBidXQgYWxsIHRoZQogCQkgKiBhZGRyZXNzZXMgYmVsb3cgZ2VuZXJhdGUgYSBEVEFDSyBzbyBubyBidXMgZXJyb3Igb2NjdXJzISAqLwogCX0gZWxzZSBpZiAoaHdyZWdfcHJlc2VudChmMDMwX3hyZWcpKSB7CkBAIC0yNjksMTAgKzI2OSw2IEBACiAJCUFUQVJJSFdfU0VUKFNDU0lfRE1BKTsKIAkJcHJpbnRrKCJUVF9TQ1NJX0RNQSAiKTsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoJnN0X2RtYS5kbWFfaGkpKSB7Ci0JCUFUQVJJSFdfU0VUKFNUTkRfRE1BKTsKLQkJcHJpbnRrKCJTVE5EX0RNQSAiKTsKLQl9CiAJLyoKIAkgKiBUaGUgU1QtRE1BIGFkZHJlc3MgcmVnaXN0ZXJzIGFyZW4ndCByZWFkYWJsZQogCSAqIG9uIGFsbCBNZWR1c2FzLCBzbyB0aGUgdGVzdCBiZWxvdyBtYXkgZmFpbApAQCAtMjk0LDEyICsyOTAsMTEgQEAKIAkJQVRBUklIV19TRVQoWU1fMjE0OSk7CiAJCXByaW50aygiWU0yMTQ5ICIpOwogCX0KLQlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmICFNQUNIX0lTX0hBREVTICYmCi0JCWh3cmVnX3ByZXNlbnQoJnR0X2RtYXNuZC5jdHJsKSkgeworCWlmICghTUFDSF9JU19NRURVU0EgJiYgaHdyZWdfcHJlc2VudCgmdHRfZG1hc25kLmN0cmwpKSB7CiAJCUFUQVJJSFdfU0VUKFBDTV84QklUKTsKIAkJcHJpbnRrKCJQQ00gIik7CiAJfQotCWlmICghTUFDSF9JU19IQURFUyAmJiBod3JlZ19wcmVzZW50KCZmYWxjb25fY29kZWMudW51c2VkNSkpIHsKKwlpZiAoaHdyZWdfcHJlc2VudCgmZmFsY29uX2NvZGVjLnVudXNlZDUpKSB7CiAJCUFUQVJJSFdfU0VUKENPREVDKTsKIAkJcHJpbnRrKCJDT0RFQyAiKTsKIAl9CkBAIC0zMTMsNyArMzA4LDcgQEAKIAkgICAgKHR0X3NjY19kbWEuZG1hX2N0cmwgPSAweDAxLCAodHRfc2NjX2RtYS5kbWFfY3RybCAmIDEpID09IDEpICYmCiAJICAgICh0dF9zY2NfZG1hLmRtYV9jdHJsID0gMHgwMCwgKHR0X3NjY19kbWEuZG1hX2N0cmwgJiAxKSA9PSAwKQogI2Vsc2UKLQkgICAgIU1BQ0hfSVNfTUVEVVNBICYmICFNQUNIX0lTX0hBREVTCisJICAgICFNQUNIX0lTX01FRFVTQQogI2VuZGlmCiAJICAgICkgewogCQlBVEFSSUhXX1NFVChTQ0NfRE1BKTsKQEAgLTMyNywxMCArMzIyLDcgQEAKIAkJQVRBUklIV19TRVQoU1RfRVNDQyk7CiAJCXByaW50aygiU1RfRVNDQyAiKTsKIAl9Ci0JaWYgKE1BQ0hfSVNfSEFERVMpIHsKLQkJQVRBUklIV19TRVQoVk1FKTsKLQkJcHJpbnRrKCJWTUUgIik7Ci0JfSBlbHNlIGlmIChod3JlZ19wcmVzZW50KCZ0dF9zY3Uuc3lzX21hc2spKSB7CisJaWYgKGh3cmVnX3ByZXNlbnQoJnR0X3NjdS5zeXNfbWFzaykpIHsKIAkJQVRBUklIV19TRVQoU0NVKTsKIAkJLyogQXNzdW1lIGEgVk1FIGJ1cyBpZiB0aGVyZSdzIGEgU0NVICovCiAJCUFUQVJJSFdfU0VUKFZNRSk7CkBAIC0zNDAsNyArMzMyLDcgQEAKIAkJQVRBUklIV19TRVQoQU5BTE9HX0pPWSk7CiAJCXByaW50aygiQU5BTE9HX0pPWSAiKTsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoYmxpdHRlci5oYWxmdG9uZSkpIHsKKwlpZiAoaHdyZWdfcHJlc2VudChibGl0dGVyLmhhbGZ0b25lKSkgewogCQlBVEFSSUhXX1NFVChCTElUVEVSKTsKIAkJcHJpbnRrKCJCTElUVEVSICIpOwogCX0KQEAgLTM0OSw4ICszNDEsNyBAQAogCQlwcmludGsoIklERSAiKTsKIAl9CiAjaWYgMSAvKiBUaGlzIG1heWJlIHdyb25nICovCi0JaWYgKCFNQUNIX0lTX01FRFVTQSAmJiAhTUFDSF9JU19IQURFUyAmJgotCSAgICBod3JlZ19wcmVzZW50KCZ0dF9taWNyb3dpcmUuZGF0YSkgJiYKKwlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmIGh3cmVnX3ByZXNlbnQoJnR0X21pY3Jvd2lyZS5kYXRhKSAmJgogCSAgICBod3JlZ19wcmVzZW50KCZ0dF9taWNyb3dpcmUubWFzaykgJiYKIAkgICAgKHR0X21pY3Jvd2lyZS5tYXNrID0gMHg3ZmYsCiAJICAgICB1ZGVsYXkoMSksCkBAIC0zNjksMTkgKzM2MCwxOCBAQAogCQltYWNoX2h3Y2xrID0gYXRhcmlfdHRfaHdjbGs7CiAJCW1hY2hfc2V0X2Nsb2NrX21tc3MgPSBhdGFyaV90dF9zZXRfY2xvY2tfbW1zczsKIAl9Ci0JaWYgKCFNQUNIX0lTX0hBREVTICYmIGh3cmVnX3ByZXNlbnQoJm1zdGVfcnRjLnNlY19vbmVzKSkgeworCWlmIChod3JlZ19wcmVzZW50KCZtc3RlX3J0Yy5zZWNfb25lcykpIHsKIAkJQVRBUklIV19TRVQoTVNURV9DTEspOwogCQlwcmludGsoIk1TVEVfQ0xLICIpOwogCQltYWNoX2h3Y2xrID0gYXRhcmlfbXN0ZV9od2NsazsKIAkJbWFjaF9zZXRfY2xvY2tfbW1zcyA9IGF0YXJpX21zdGVfc2V0X2Nsb2NrX21tc3M7CiAJfQotCWlmICghTUFDSF9JU19NRURVU0EgJiYgIU1BQ0hfSVNfSEFERVMgJiYKLQkgICAgaHdyZWdfcHJlc2VudCgmZG1hX3dkLmZkY19zcGVlZCkgJiYKKwlpZiAoIU1BQ0hfSVNfTUVEVVNBICYmIGh3cmVnX3ByZXNlbnQoJmRtYV93ZC5mZGNfc3BlZWQpICYmCiAJICAgIGh3cmVnX3dyaXRlKCZkbWFfd2QuZmRjX3NwZWVkLCAwKSkgewogCQlBVEFSSUhXX1NFVChGRENTUEVFRCk7CiAJCXByaW50aygiRkRDX1NQRUVEICIpOwogCX0KLQlpZiAoIU1BQ0hfSVNfSEFERVMgJiYgIUFUQVJJSFdfUFJFU0VOVChTVF9TQ1NJKSkgeworCWlmICghQVRBUklIV19QUkVTRU5UKFNUX1NDU0kpKSB7CiAJCUFUQVJJSFdfU0VUKEFDU0kpOwogCQlwcmludGsoIkFDU0kgIik7CiAJfQpAQCAtNDQ5LDcgKzQzOSw3IEBACiAJICogMHhGRnh4eHh4eCAtPiAweDAweHh4eHh4LCBzbyB0aGF0IHRoZSBmaXJzdCAxNk1CIGlzIGFjY2Vzc2libGUKIAkgKiBpbiB0aGUgbGFzdCAxNk1CIG9mIHRoZSBhZGRyZXNzIHNwYWNlLgogCSAqLwotCXRvc192ZXJzaW9uID0gKE1BQ0hfSVNfTUVEVVNBIHx8IE1BQ0hfSVNfSEFERVMpID8KKwl0b3NfdmVyc2lvbiA9IChNQUNIX0lTX01FRFVTQSkgPwogCQkJMHhmZmYgOiAqKHVuc2lnbmVkIHNob3J0ICopMHhmZjAwMDAwMjsKIAlhdGFyaV9ydGNfeWVhcl9vZmZzZXQgPSAodG9zX3ZlcnNpb24gPCAweDMwNikgPyA3MCA6IDY4OwogfQpAQCAtNTExLDggKzUwMSw3IEBACiAJICogT24gdGhlIE1lZHVzYSwgcGh5cy4gMHg0IG1heSBjb250YWluIGdhcmJhZ2UgYmVjYXVzZSBpdCdzIG5vCiAJICogUk9NLiAgU2VlIGFib3ZlIGZvciBleHBsYW5hdGlvbiB3aHkgd2UgY2Fubm90IHVzZSBQVE9WKDQpLgogCSAqLwotCXJlc2V0X2FkZHIgPSBNQUNIX0lTX0hBREVTID8gMHg3ZmUwMDAzMCA6Ci0JCSAgICAgTUFDSF9JU19NRURVU0EgfHwgTUFDSF9JU19BQjQwID8gMHhlMDAwMzAgOgorCXJlc2V0X2FkZHIgPSBNQUNIX0lTX01FRFVTQSB8fCBNQUNIX0lTX0FCNDAgPyAweGUwMDAzMCA6CiAJCSAgICAgKih1bnNpZ25lZCBsb25nICopIDB4ZmYwMDAwMDQ7CiAKIAkvKiByZXNldCBBQ0lBIGZvciBzd2l0Y2ggb2ZmIE92ZXJTY2FuLCBpZiBpdCdzIGFjdGl2ZSAqLwpAQCAtNjA2LDggKzU5NSw2IEBACiAJCWlmIChNQUNIX0lTX01FRFVTQSkKIAkJCS8qIE1lZHVzYSBoYXMgVFQgX01DSCBjb29raWUgKi8KIAkJCXN0cmNhdChtb2RlbCwgIk1lZHVzYSIpOwotCQllbHNlIGlmIChNQUNIX0lTX0hBREVTKQotCQkJc3RyY2F0KG1vZGVsLCAiSGFkZXMiKTsKIAkJZWxzZQogCQkJc3RyY2F0KG1vZGVsLCAiVFQiKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMgYi9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYmFiYzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2hhZGVzLXBjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBoYWRlcy1wY2kuYyAtIEhhcmR3YXJlIHNwZWNpZmljIFBDSSBCSU9TIGZ1bmN0aW9ucyB0aGUgSGFkZXMgQXRhcmkgY2xvbmUuCi0gKgotICogV3JpdHRlbiBieSBXb3V0IEtsYXJlbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWYgMAotIyBkZWZpbmUgREJHX0RFVlMoYXJncykJCXByaW50ayBhcmdzCi0jZWxzZQotIyBkZWZpbmUgREJHX0RFVlMoYXJncykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR19IQURFUykKLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9wY2kuaD4KLQotI2RlZmluZSBIQURFU19NRU1fQkFTRQkJMHg4MDAwMDAwMAotI2RlZmluZSBIQURFU19NRU1fU0laRQkJMHgyMDAwMDAwMAotI2RlZmluZSBIQURFU19DT05GSUdfQkFTRQkweEEwMDAwMDAwCi0jZGVmaW5lIEhBREVTX0NPTkZJR19TSVpFCTB4MTAwMDAwMDAKLSNkZWZpbmUgSEFERVNfSU9fQkFTRQkJMHhCMDAwMDAwMAotI2RlZmluZSBIQURFU19JT19TSVpFCQkweDEwMDAwMDAwCi0jZGVmaW5lIEhBREVTX1ZJUlRfSU9fU0laRQkweDAwMDEwMDAwCS8qIE9ubHkgNjRrIGlzIHJlbWFwcGVkIGFuZCBhY3R1YWxseSB1c2VkLiAqLwotCi0jZGVmaW5lIE5fU0xPVFMJCQkJNAkJCS8qIE51bWJlciBvZiBQQ0kgc2xvdHMuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyIHBjaV9tZW1fbmFtZVtdID0gIlBDSSBtZW1vcnkgc3BhY2UiOwotc3RhdGljIGNvbnN0IGNoYXIgcGNpX2lvX25hbWVbXSA9ICJQQ0kgSS9PIHNwYWNlIjsKLXN0YXRpYyBjb25zdCBjaGFyIHBjaV9jb25maWdfbmFtZVtdID0gIlBDSSBjb25maWcgc3BhY2UiOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbmZpZ19zcGFjZSA9IHsKLSAgICAubmFtZSA9IHBjaV9jb25maWdfbmFtZSwKLSAgICAuc3RhcnQgPSBIQURFU19DT05GSUdfQkFTRSwKLSAgICAuZW5kID0gSEFERVNfQ09ORklHX0JBU0UgKyBIQURFU19DT05GSUdfU0laRSAtIDEKLX07Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlvX3NwYWNlID0gewotICAgIC5uYW1lID0gcGNpX2lvX25hbWUsCi0gICAgLnN0YXJ0ID0gSEFERVNfSU9fQkFTRSwKLSAgICAuZW5kID0gSEFERVNfSU9fQkFTRSArIEhBREVTX0lPX1NJWkUgLSAxCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBwY2lfY29uZl9iYXNlX3BoeXNbXSA9IHsKLSAgICAweEEwMDgwMDAwLCAweEEwMDQwMDAwLCAweEEwMDIwMDAwLCAweEEwMDEwMDAwCi19Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2NvbmZfYmFzZV92aXJ0W05fU0xPVFNdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2lvX2Jhc2VfdmlydDsKLQotLyoKLSAqIHN0YXRpYyB2b2lkICpta19jb25mX2FkZHIodW5zaWduZWQgY2hhciBidXMsIHVuc2lnbmVkIGNoYXIgZGV2aWNlX2ZuLAotICoJCQkgICAgIHVuc2lnbmVkIGNoYXIgd2hlcmUpCi0gKgotICogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBhcmVhIG9mIHRoZSBnaXZlbgotICogZGV2aWNlLgotICoKLSAqIEJVRzogYm9hcmRzIHdpdGggbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBwcm9iYWJseSBub3QgY29ycmVjdGx5Ci0gKiBzdXBwb3J0ZWQuCi0gKi8KLQotc3RhdGljIHZvaWQgKm1rX2NvbmZfYWRkcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUpCi17Ci0JaW50IGRldmljZSA9IGRldi0+ZGV2Zm4gPj4gMywgZnVuY3Rpb24gPSBkZXYtPmRldmZuICYgNzsKLQl2b2lkICpyZXN1bHQ7Ci0KLQlEQkdfREVWUygoIm1rX2NvbmZfYWRkcihidXM9JWQgLGRldmljZV9mbj0weCV4LCB3aGVyZT0weCV4LCBwY2lfYWRkcj0weCVwKVxuIiwKLQkJICBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuLCB3aGVyZSwgcGNpX2FkZHIpKTsKLQotCWlmIChkZXZpY2UgPiAzKQotCXsKLQkJREJHX0RFVlMoKCJta19jb25mX2FkZHI6IGRldmljZSAoJWQpID4gMywgcmV0dXJuaW5nIE5VTExcbiIsIGRldmljZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoZGV2LT5idXMtPm51bWJlciAhPSAwKQotCXsKLQkJREJHX0RFVlMoKCJta19jb25mX2FkZHI6IGJ1cyAoJWQpID4gMCwgcmV0dXJuaW5nIE5VTExcbiIsIGRldmljZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXN1bHQgPSAodm9pZCAqKSAocGNpX2NvbmZfYmFzZV92aXJ0W2RldmljZV0gfCAoZnVuY3Rpb24gPDwgOCkgfCAod2hlcmUpKTsKLQlEQkdfREVWUygoIm1rX2NvbmZfYWRkcjogcmV0dXJuaW5nIHBjaV9hZGRyIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZykgcmVzdWx0KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBoYWRlc19yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTggKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBjaV9hZGRyOwotCi0JKnZhbHVlID0gMHhmZjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqdmFsdWUgPSAqcGNpX2FkZHI7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGhhZGVzX3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MTYgKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwY2lfYWRkcjsKLQotCSp2YWx1ZSA9IDB4ZmZmZjsKLQotCWlmICh3aGVyZSAmIDB4MSkKLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikgbWtfY29uZl9hZGRyKGRldiwgd2hlcmUpKSA9PSBOVUxMKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JKnZhbHVlID0gbGUxNl90b19jcHUoKnBjaV9hZGRyKTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MzIgKnZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqcGNpX2FkZHI7Ci0JdW5zaWduZWQgY2hhciBoZWFkZXJfdHlwZTsKLQlpbnQgcmVzdWx0OwotCi0JKnZhbHVlID0gMHhmZmZmZmZmZjsKLQotCWlmICh3aGVyZSAmIDB4MykKLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgaW50ICopIG1rX2NvbmZfYWRkcihkZXYsIHdoZXJlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KCpwY2lfYWRkcik7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhbiBhZGRyZXNzIG9uIHRoZSBidXMuIElmIHRydWUsIGFkZCB0aGUKLQkgKiBiYXNlIGFkZHJlc3Mgb2YgdGhlIFBDSSBtZW1vcnkgb3IgUENJIEkvTyBhcmVhIG9uIHRoZSBIYWRlcy4KLQkgKi8KLQotCWlmICgocmVzdWx0ID0gaGFkZXNfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwKLQkJCQkJICAgICAmaGVhZGVyX3R5cGUpKSAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoKCh3aGVyZSA+PSBQQ0lfQkFTRV9BRERSRVNTXzApICYmICh3aGVyZSA8PSBQQ0lfQkFTRV9BRERSRVNTXzEpKSB8fAotCSAgICAoKGhlYWRlcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9CUklER0UpICYmICgod2hlcmUgPj0gUENJX0JBU0VfQUREUkVTU18yKSAmJgotCQkJCQkJCSAod2hlcmUgPD0gUENJX0JBU0VfQUREUkVTU181KSkpKQotCXsKLQkJaWYgKCgqdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKQotCQl7Ci0JCQkvKgotCQkJICogQmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgYW4gSS9PIGFkZHJlc3MuIElmIHRoZQotCQkJICogYWRkcmVzcyBpcyB2YWxpZCBvbiB0aGUgSGFkZXMgKDAgPD0gKnZhbHVlIDwgSEFERVNfVklSVF9JT19TSVpFKSwKLQkJCSAqIGFkZCAncGNpX2lvX2Jhc2VfdmlydCcgdG8gdGhlIHZhbHVlLgotCQkJICovCi0KLQkJCWlmICgqdmFsdWUgPCBIQURFU19WSVJUX0lPX1NJWkUpCi0JCQkJKnZhbHVlICs9IHBjaV9pb19iYXNlX3ZpcnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJICogQmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgYW4gbWVtb3J5IGFkZHJlc3MuIElmIHRoZQotCQkJICogYWRkcmVzcyBpcyB2YWxpZCBvbiB0aGUgSGFkZXMgKDAgPD0gKnZhbHVlIDwgSEFERVNfTUVNX1NJWkUpLAotCQkJICogYWRkIEhBREVTX01FTV9CQVNFIHRvIHRoZSB2YWx1ZS4KLQkJCSAqLwotCi0JCQlpZiAoKnZhbHVlID09IDApCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBCYXNlIGFkZHJlc3MgaXMgMC4gVGVzdCBpZiB0aGlzIGJhc2UKLQkJCQkgKiBhZGRyZXNzIHJlZ2lzdGVyIGlzIHVzZWQuCi0JCQkJICovCi0KLQkJCQkqcGNpX2FkZHIgPSAweGZmZmZmZmZmOwotCQkJCWlmICgqcGNpX2FkZHIgIT0gMCkKLQkJCQl7Ci0JCQkJCSpwY2lfYWRkciA9ICp2YWx1ZTsKLQkJCQkJaWYgKCp2YWx1ZSA8IEhBREVTX01FTV9TSVpFKQotCQkJCQkJKnZhbHVlICs9IEhBREVTX01FTV9CQVNFOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKnZhbHVlIDwgSEFERVNfTUVNX1NJWkUpCi0JCQkJCSp2YWx1ZSArPSBIQURFU19NRU1fQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1OCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2lfYWRkcjsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgY2hhciAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqcGNpX2FkZHIgPSB2YWx1ZTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgaGFkZXNfd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MTYgdmFsdWUpCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnBjaV9hZGRyOwotCi0JaWYgKChwY2lfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKSBta19jb25mX2FkZHIoZGV2LCB3aGVyZSkpID09IE5VTEwpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkqcGNpX2FkZHIgPSBjcHVfdG9fbGUxNih2YWx1ZSk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGhhZGVzX3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHUzMiB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnBjaV9hZGRyOwotCXVuc2lnbmVkIGNoYXIgaGVhZGVyX3R5cGU7Ci0JaW50IHJlc3VsdDsKLQotCWlmICgocGNpX2FkZHIgPSAodW5zaWduZWQgaW50ICopIG1rX2NvbmZfYWRkcihkZXYsIHdoZXJlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGFkZHJlc3Mgb24gdGhlIGJ1cy4gSWYgdHJ1ZSwgc3VidHJhY3QgdGhlCi0JICogYmFzZSBhZGRyZXNzIG9mIHRoZSBQQ0kgbWVtb3J5IG9yIFBDSSBJL08gYXJlYSBvbiB0aGUgSGFkZXMuCi0JICovCi0KLQlpZiAoKHJlc3VsdCA9IGhhZGVzX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsCi0JCQkJCSAgICAgJmhlYWRlcl90eXBlKSkgIT0gUENJQklPU19TVUNDRVNTRlVMKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JaWYgKCgod2hlcmUgPj0gUENJX0JBU0VfQUREUkVTU18wKSAmJiAod2hlcmUgPD0gUENJX0JBU0VfQUREUkVTU18xKSkgfHwKLQkgICAgKChoZWFkZXJfdHlwZSAhPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSAmJiAoKHdoZXJlID49IFBDSV9CQVNFX0FERFJFU1NfMikgJiYKLQkJCQkJCQkgKHdoZXJlIDw9IFBDSV9CQVNFX0FERFJFU1NfNSkpKSkKLQl7Ci0JCWlmICgodmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PQotCQkgICAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKLQkJewotCQkJLyoKLQkJCSAqIEkvTyBhZGRyZXNzLiBDaGVjayBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCBhZGRyZXNzIG9uCi0JCQkgKiB0aGUgSGFkZXMgKHBjaV9pb19iYXNlX3ZpcnQgPD0gdmFsdWUgPCBwY2lfaW9fYmFzZV92aXJ0ICsKLQkJCSAqIEhBREVTX1ZJUlRfSU9fU0laRSkgb3IgaWYgdGhlIHZhbHVlIGlzIDB4ZmZmZmZmZmYuIElmIG5vdAotCQkJICogdHJ1ZSBkbyBub3Qgd3JpdGUgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4gSWYgaXQgaXMgYQotCQkJICogdmFsaWQgYmFzZSBhZGRyZXNzIHN1YnRyYWN0ICdwY2lfaW9fYmFzZV92aXJ0JyBmcm9tIHRoZSB2YWx1ZS4KLQkJCSAqLwotCi0JCQlpZiAoKHZhbHVlID49IHBjaV9pb19iYXNlX3ZpcnQpICYmICh2YWx1ZSA8IChwY2lfaW9fYmFzZV92aXJ0ICsKLQkJCQkJCQkJCQkJCQkJIEhBREVTX1ZJUlRfSU9fU0laRSkpKQotCQkJCXZhbHVlIC09IHBjaV9pb19iYXNlX3ZpcnQ7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQkJCXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJICogTWVtb3J5IGFkZHJlc3MuIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkIGFkZHJlc3Mgb24KLQkJCSAqIHRoZSBIYWRlcyAoSEFERVNfTUVNX0JBU0UgPD0gdmFsdWUgPCBIQURFU19NRU1fQkFTRSArIEhBREVTX01FTV9TSVpFKSBvcgotCQkJICogaWYgdGhlIHZhbHVlIGlzIDB4ZmZmZmZmZmYuIElmIG5vdCB0cnVlIGRvIG5vdCB3cml0ZQotCQkJICogdGhlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4gSWYgaXQgaXMgYSB2YWxpZCBiYXNlIGFkZHJlc3MKLQkJCSAqIHN1YnRyYWN0IEhBREVTX01FTV9CQVNFIGZyb20gdGhlIHZhbHVlLgotCQkJICovCi0KLQkJCWlmICgodmFsdWUgPj0gSEFERVNfTUVNX0JBU0UpICYmICh2YWx1ZSA8IChIQURFU19NRU1fQkFTRSArIEhBREVTX01FTV9TSVpFKSkpCi0JCQkJdmFsdWUgLT0gSEFERVNfTUVNX0JBU0U7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQkJCXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkqcGNpX2FkZHIgPSBjcHVfdG9fbGUzMih2YWx1ZSk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi0vKgotICogc3RhdGljIGlubGluZSB2b2lkIGhhZGVzX2ZpeHVwKHZvaWQpCi0gKgotICogQXNzaWduIElSUSBudW1iZXJzIGFzIHVzZWQgYnkgTGludXggdG8gdGhlIGludGVycnVwdCBwaW5zCi0gKiBvZiB0aGUgUENJIGNhcmRzLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBoYWRlc19maXh1cChpbnQgcGNpX21vZGlmeSkKLXsKLQljaGFyIGlycV90YWJbNF0gPSB7Ci0JCVswXSA9IElSUV9UVF9NRlBfSU8wLAkJLyogU2xvdCAwLiAqLwotCQlbMV0gPSBJUlFfVFRfTUZQX0lPMSwJCS8qIFNsb3QgMS4gKi8KLQkJWzJdID0gSVJRX1RUX01GUF9TQ0MsCQkvKiBTbG90IDIuICovCi0JCVszXSA9IElSUV9UVF9NRlBfU0NTSURNQQkvKiBTbG90IDMuICovCi0JfTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIHNsb3Q7Ci0KLQkvKgotCSAqIEdvIHRocm91Z2ggYWxsIGRldmljZXMsIGZpeGluZyB1cCBpcnFzIGFzIHdlIHNlZSBmaXQ6Ci0JICovCi0KLQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpCi0JewotCQlpZiAoZGV2LT5jbGFzcyA+PiAxNiAhPSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCi0JCXsKLQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKTsJLyogRGV0ZXJtaW5lIHNsb3QgbnVtYmVyLiAqLwotCQkJZGV2LT5pcnEgPSBpcnFfdGFiW3Nsb3RdOwotCQkJaWYgKHBjaV9tb2RpZnkpCi0JCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBzdGF0aWMgdm9pZCBoYWRlc19jb25mX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotICoKLSAqIE1hY2hpbmUgZGVwZW5kZW50IENvbmZpZ3VyZSB0aGUgZ2l2ZW4gZGV2aWNlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICogZGV2CQktIHRoZSBwY2kgZGV2aWNlLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBoYWRlc19jb25mX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDApOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaGFkZXNfcGNpX29wcyA9IHsKLQkucmVhZF9ieXRlID0JaGFkZXNfcmVhZF9jb25maWdfYnl0ZSwKLQkucmVhZF93b3JkID0JaGFkZXNfcmVhZF9jb25maWdfd29yZCwKLQkucmVhZF9kd29yZCA9CWhhZGVzX3JlYWRfY29uZmlnX2R3b3JkLAotCS53cml0ZV9ieXRlID0JaGFkZXNfd3JpdGVfY29uZmlnX2J5dGUsCi0JLndyaXRlX3dvcmQgPQloYWRlc193cml0ZV9jb25maWdfd29yZCwKLQkud3JpdGVfZHdvcmQgPQloYWRlc193cml0ZV9jb25maWdfZHdvcmQKLX07Ci0KLS8qCi0gKiBzdHJ1Y3QgcGNpX2J1c19pbmZvICppbml0X2hhZGVzX3BjaSh2b2lkKQotICoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb246Ci0gKgotICogLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhICdwY2lfYnVzX2luZm8nIHN0cnVjdHVyZQotICogLSBJbml0aWFsaXNlIGhhcmR3YXJlCi0gKgotICogUmVzdWx0OiBwb2ludGVyIHRvICdwY2lfYnVzX2luZm8nIHN0cnVjdHVyZS4KLSAqLwotCi1zdHJ1Y3QgcGNpX2J1c19pbmZvICogX19pbml0IGluaXRfaGFkZXNfcGNpKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9idXNfaW5mbyAqYnVzOwotCWludCBpOwotCi0JLyoKLQkgKiBSZW1hcCBJL08gYW5kIGNvbmZpZ3VyYXRpb24gc3BhY2UuCi0JICovCi0KLQlwY2lfaW9fYmFzZV92aXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoSEFERVNfSU9fQkFTRSwgSEFERVNfVklSVF9JT19TSVpFKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOX1NMT1RTOyBpKyspCi0JCXBjaV9jb25mX2Jhc2VfdmlydFtpXSA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKHBjaV9jb25mX2Jhc2VfcGh5c1tpXSwgMHgxMDAwMCk7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYnVzIGluZm8gc3RydWN0dXJlLgotCSAqLwotCi0JYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9idXNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghYnVzKSkKLQkJZ290byBpb3VubWFwX2Jhc2VfdmlydDsKLQotCS8qCi0JICogQ2xhaW0gcmVzb3VyY2VzLiBUaGUgbTY4ayBoYXMgbm8gc2VwYXJhdGUgSS9PIHNwYWNlLCBib3RoCi0JICogUENJIG1lbW9yeSBzcGFjZSBhbmQgUENJIEkvTyBzcGFjZSBhcmUgaW4gbWVtb3J5IHNwYWNlLiBUaGVyZWZvcmUKLQkgKiB0aGUgSS9PIHJlc291cmNlcyBhcmUgcmVxdWVzdGVkIGluIG1lbW9yeSBzcGFjZSBhcyB3ZWxsLgotCSAqLwotCi0JaWYgKHVubGlrZWx5KHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmY29uZmlnX3NwYWNlKSAhPSAwKSkKLQkJZ290byBmcmVlX2J1czsKLQotCWlmICh1bmxpa2VseShyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmlvX3NwYWNlKSAhPSAwKSkKLQkJZ290byByZWxlYXNlX2NvbmZpZ19zcGFjZTsKLQotCWJ1cy0+bWVtX3NwYWNlLnN0YXJ0ID0gSEFERVNfTUVNX0JBU0U7Ci0JYnVzLT5tZW1fc3BhY2UuZW5kID0gSEFERVNfTUVNX0JBU0UgKyBIQURFU19NRU1fU0laRSAtIDE7Ci0JYnVzLT5tZW1fc3BhY2UubmFtZSA9IHBjaV9tZW1fbmFtZTsKLSNpZiAxCi0JaWYgKHVubGlrZWx5KHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmYnVzLT5tZW1fc3BhY2UpICE9IDApKQotCQlnb3RvIHJlbGVhc2VfaW9fc3BhY2U7Ci0jZW5kaWYKLQlidXMtPmlvX3NwYWNlLnN0YXJ0ID0gcGNpX2lvX2Jhc2VfdmlydDsKLQlidXMtPmlvX3NwYWNlLmVuZCA9IHBjaV9pb19iYXNlX3ZpcnQgKyBIQURFU19WSVJUX0lPX1NJWkUgLSAxOwotCWJ1cy0+aW9fc3BhY2UubmFtZSA9IHBjaV9pb19uYW1lOwotI2lmIDEKLQlpZiAodW5saWtlbHkocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmYnVzLT5pb19zcGFjZSkgIT0gMCkpCi0JCWdvdG8gcmVsZWFzZV9idXNfbWVtX3NwYWNlOwotI2VuZGlmCi0JLyoKLQkgKiBTZXQgaGFyZHdhcmUgZGVwZW5kZW50IGZ1bmN0aW9ucy4KLQkgKi8KLQotCWJ1cy0+bTY4a19wY2lfb3BzID0gJmhhZGVzX3BjaV9vcHM7Ci0JYnVzLT5maXh1cCA9IGhhZGVzX2ZpeHVwOwotCWJ1cy0+Y29uZl9kZXZpY2UgPSBoYWRlc19jb25mX2RldmljZTsKLQotCS8qCi0JICogU2VsZWN0IGhpZ2ggdG8gbG93IGVkZ2UgZm9yIFBDSSBpbnRlcnJ1cHRzLgotCSAqLwotCi0JdHRfbWZwLmFjdGl2ZV9lZGdlICY9IH4weDI3OwotCi0JcmV0dXJuIGJ1czsKLQotcmVsZWFzZV9idXNfbWVtX3NwYWNlOgotCXJlbGVhc2VfcmVzb3VyY2UoJmJ1cy0+bWVtX3NwYWNlKTsKLXJlbGVhc2VfaW9fc3BhY2U6Ci0JcmVsZWFzZV9yZXNvdXJjZSgmaW9fc3BhY2UpOwotcmVsZWFzZV9jb25maWdfc3BhY2U6Ci0JcmVsZWFzZV9yZXNvdXJjZSgmY29uZmlnX3NwYWNlKTsKLWZyZWVfYnVzOgotCWtmcmVlKGJ1cyk7Ci1pb3VubWFwX2Jhc2VfdmlydDoKLQlpb3VubWFwKCh2b2lkICopcGNpX2lvX2Jhc2VfdmlydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTl9TTE9UUzsgaSsrKQotCQlpb3VubWFwKCh2b2lkICopcGNpX2NvbmZfYmFzZV92aXJ0W2ldKTsKLQotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvdGltZS5jIGIvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYwppbmRleCBlMGQzYzhiLi4xZWRkZTI3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvdGltZS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KIAorREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19sb2NrKTsKKwogdm9pZCBfX2luaXQKIGF0YXJpX3NjaGVkX2luaXQoaXJxX2hhbmRsZXJfdCB0aW1lcl9yb3V0aW5lKQogewpAQCAtMTkxLDEzICsxOTQsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSkgewotICAgICAgICAgICAgQklOX1RPX0JDRChzZWMpOwotICAgICAgICAgICAgQklOX1RPX0JDRChtaW4pOwotICAgICAgICAgICAgQklOX1RPX0JDRChob3VyKTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QoZGF5KTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QobW9uKTsKLSAgICAgICAgICAgIEJJTl9UT19CQ0QoeWVhcik7Ci0gICAgICAgICAgICBpZiAod2RheSA+PSAwKSBCSU5fVE9fQkNEKHdkYXkpOworCSAgICBzZWMgPSBiaW4yYmNkKHNlYyk7CisJICAgIG1pbiA9IGJpbjJiY2QobWluKTsKKwkgICAgaG91ciA9IGJpbjJiY2QoaG91cik7CisJICAgIGRheSA9IGJpbjJiY2QoZGF5KTsKKwkgICAgbW9uID0gYmluMmJjZChtb24pOworCSAgICB5ZWFyID0gYmluMmJjZCh5ZWFyKTsKKwkgICAgaWYgKHdkYXkgPj0gMCkKKwkJd2RheSA9IGJpbjJiY2Qod2RheSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MiwxMyArMjU2LDEzIEBACiAJfQogCiAJaWYgKCEoY3RybCAmIFJUQ19ETV9CSU5BUlkpKSB7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKHNlYyk7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKG1pbik7Ci0gICAgICAgICAgICBCQ0RfVE9fQklOKGhvdXIpOwotICAgICAgICAgICAgQkNEX1RPX0JJTihkYXkpOwotICAgICAgICAgICAgQkNEX1RPX0JJTihtb24pOwotICAgICAgICAgICAgQkNEX1RPX0JJTih5ZWFyKTsKLSAgICAgICAgICAgIEJDRF9UT19CSU4od2RheSk7CisJICAgIHNlYyA9IGJjZDJiaW4oc2VjKTsKKwkgICAgbWluID0gYmNkMmJpbihtaW4pOworCSAgICBob3VyID0gYmNkMmJpbihob3VyKTsKKwkgICAgZGF5ID0gYmNkMmJpbihkYXkpOworCSAgICBtb24gPSBiY2QyYmluKG1vbik7CisJICAgIHllYXIgPSBiY2QyYmluKHllYXIpOworCSAgICB3ZGF5ID0gYmNkMmJpbih3ZGF5KTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghKGN0cmwgJiBSVENfMjRIKSkgewpAQCAtMzE4LDcgKzMyMiw3IEBACiAKICAgICBydGNfbWludXRlcyA9IFJUQ19SRUFEIChSVENfTUlOVVRFUyk7CiAgICAgaWYgKCEoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkpCi0gICAgICAgIEJDRF9UT19CSU4gKHJ0Y19taW51dGVzKTsKKwlydGNfbWludXRlcyA9IGJjZDJiaW4ocnRjX21pbnV0ZXMpOwogCiAgICAgLyogU2luY2Ugd2UncmUgb25seSBhZGp1c3RpbmcgbWludXRlcyBhbmQgc2Vjb25kcywgZG9uJ3QgaW50ZXJmZXJlCiAgICAgICAgd2l0aCBob3VyIG92ZXJmbG93LiAgVGhpcyBhdm9pZHMgbWVzc2luZyB3aXRoIHVua25vd24gdGltZSB6b25lcwpAQCAtMzI5LDggKzMzMyw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghKHNhdmVfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQklOX1RPX0JDRCAocmVhbF9zZWNvbmRzKTsKLSAgICAgICAgICAgICAgICAgICAgQklOX1RPX0JDRCAocmVhbF9taW51dGVzKTsKKwkJICAgIHJlYWxfc2Vjb25kcyA9IGJpbjJiY2QocmVhbF9zZWNvbmRzKTsKKwkJICAgIHJlYWxfbWludXRlcyA9IGJpbjJiY2QocmVhbF9taW51dGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBSVENfV1JJVEUgKFJUQ19TRUNPTkRTLCByZWFsX3NlY29uZHMpOwogICAgICAgICAgICAgUlRDX1dSSVRFIChSVENfTUlOVVRFUywgcmVhbF9taW51dGVzKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYwppbmRleCA5NDMzYTg4Li42NWM5MjA0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTQ2LDkgKzQ3LDYgQEAKIGV4dGVybiB2b2lkIGJ2bWU2MDAwX3dhaXRidXQodm9pZCk7CiB2b2lkIGJ2bWU2MDAwX3NldF92ZWN0b3JzICh2b2lkKTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmNkMmJpbiAodW5zaWduZWQgY2hhciBiKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJpbjJiY2QgKHVuc2lnbmVkIGNoYXIgYik7Ci0KIC8qIFNhdmUgdGljayBoYW5kbGVyIHJvdXRpbmUgcG9pbnRlciwgd2lsbCBwb2ludCB0byBkb190aW1lcigpIGluCiAgKiBrZXJuZWwvc2NoZWQuYywgY2FsbGVkIHZpYSBidm1lNjAwMF9wcm9jZXNzX2ludCgpICovCiAKQEAgLTI2NCwxNyArMjYyLDYgQEAKICAgICByZXR1cm4gdjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmNkMmJpbiAodW5zaWduZWQgY2hhciBiKQotewotCXJldHVybiAoKGI+PjQpKjEwICsgKGImMTUpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmluMmJjZCAodW5zaWduZWQgY2hhciBiKQotewotCXJldHVybiAoKChiLzEwKSoxNikgKyAoYiUxMCkpOwotfQotCi0KIC8qCiAgKiBMb29rcyBsaWtlIG9wIGlzIG5vbi16ZXJvIGZvciBzZXR0aW5nIHRoZSBjbG9jaywgYW5kIHplcm8gZm9yCiAgKiByZWFkaW5nIHRoZSBjbG9jay4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9ydGMuYwppbmRleCBlOGFjM2Y3Li44MDhjOTAxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvcnRjLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL3J0Yy5jCkBAIC01NywxNiArNTcsMTYgQEAKIAkJcnRjLT5tc3IgPSAweDQwOwogCQltZW1zZXQoJnd0aW1lLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CiAJCWRvIHsKLQkJCXd0aW1lLnRtX3NlYyA9ICBCQ0QyQklOKHJ0Yy0+YmNkX3NlYyk7Ci0JCQl3dGltZS50bV9taW4gPSAgQkNEMkJJTihydGMtPmJjZF9taW4pOwotCQkJd3RpbWUudG1faG91ciA9IEJDRDJCSU4ocnRjLT5iY2RfaHIpOwotCQkJd3RpbWUudG1fbWRheSA9ICBCQ0QyQklOKHJ0Yy0+YmNkX2RvbSk7Ci0JCQl3dGltZS50bV9tb24gPSAgQkNEMkJJTihydGMtPmJjZF9tdGgpLTE7Ci0JCQl3dGltZS50bV95ZWFyID0gQkNEMkJJTihydGMtPmJjZF95ZWFyKTsKKwkJCXd0aW1lLnRtX3NlYyA9ICBiY2QyYmluKHJ0Yy0+YmNkX3NlYyk7CisJCQl3dGltZS50bV9taW4gPSAgYmNkMmJpbihydGMtPmJjZF9taW4pOworCQkJd3RpbWUudG1faG91ciA9IGJjZDJiaW4ocnRjLT5iY2RfaHIpOworCQkJd3RpbWUudG1fbWRheSA9ICBiY2QyYmluKHJ0Yy0+YmNkX2RvbSk7CisJCQl3dGltZS50bV9tb24gPSAgYmNkMmJpbihydGMtPmJjZF9tdGgpLTE7CisJCQl3dGltZS50bV95ZWFyID0gYmNkMmJpbihydGMtPmJjZF95ZWFyKTsKIAkJCWlmICh3dGltZS50bV95ZWFyIDwgNzApCiAJCQkJd3RpbWUudG1feWVhciArPSAxMDA7Ci0JCQl3dGltZS50bV93ZGF5ID0gQkNEMkJJTihydGMtPmJjZF9kb3cpLTE7Ci0JCX0gd2hpbGUgKHd0aW1lLnRtX3NlYyAhPSBCQ0QyQklOKHJ0Yy0+YmNkX3NlYykpOworCQkJd3RpbWUudG1fd2RheSA9IGJjZDJiaW4ocnRjLT5iY2RfZG93KS0xOworCQl9IHdoaWxlICh3dGltZS50bV9zZWMgIT0gYmNkMmJpbihydGMtPmJjZF9zZWMpKTsKIAkJcnRjLT5tc3IgPSBtc3I7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmd3RpbWUsIHNpemVvZiB3dGltZSkgPwpAQCAtMTE0LDE0ICsxMTQsMTQgQEAKIAogCQlydGMtPnQwY3JfcnRtciA9IHlycyU0OwogCQlydGMtPmJjZF90ZW5tcyA9IDA7Ci0JCXJ0Yy0+YmNkX3NlYyAgID0gQklOMkJDRChzZWMpOwotCQlydGMtPmJjZF9taW4gICA9IEJJTjJCQ0QobWluKTsKLQkJcnRjLT5iY2RfaHIgICAgPSBCSU4yQkNEKGhycyk7Ci0JCXJ0Yy0+YmNkX2RvbSAgID0gQklOMkJDRChkYXkpOwotCQlydGMtPmJjZF9tdGggICA9IEJJTjJCQ0QobW9uKTsKLQkJcnRjLT5iY2RfeWVhciAgPSBCSU4yQkNEKHlycyUxMDApOworCQlydGMtPmJjZF9zZWMgICA9IGJpbjJiY2Qoc2VjKTsKKwkJcnRjLT5iY2RfbWluICAgPSBiaW4yYmNkKG1pbik7CisJCXJ0Yy0+YmNkX2hyICAgID0gYmluMmJjZChocnMpOworCQlydGMtPmJjZF9kb20gICA9IGJpbjJiY2QoZGF5KTsKKwkJcnRjLT5iY2RfbXRoICAgPSBiaW4yYmNkKG1vbik7CisJCXJ0Yy0+YmNkX3llYXIgID0gYmluMmJjZCh5cnMlMTAwKTsKIAkJaWYgKHJ0Y190bS50bV93ZGF5ID49IDApCi0JCQlydGMtPmJjZF9kb3cgPSBCSU4yQkNEKHJ0Y190bS50bV93ZGF5KzEpOworCQkJcnRjLT5iY2RfZG93ID0gYmluMmJjZChydGNfdG0udG1fd2RheSsxKTsKIAkJcnRjLT50MGNyX3J0bXIgPSB5cnMlNCB8IDB4MDg7CiAKIAkJcnRjLT5tc3IgPSBtc3I7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKaW5kZXggOGUyYTBmNS4uOGJkNjFhNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmM0Ci0jIFdlZCBNYXkgMjggMjI6NDc6MzUgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNgorIyBXZWQgU2VwIDEwIDA5OjAyOjAwIDIwMDgKICMKIENPTkZJR19NNjhLPXkKIENPTkZJR19NTVU9eQpAQCAtNTIsNyArNTIsNiBAQAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQpAQCAtNzUsMTAgKzc0LDE2IEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX09QUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKQEAgLTk1LDYgKzEwMCw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9CU0c9eQorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTE2NiwxMCArMTcyLDYgQEAKIENPTkZJR19aT05FX0RNQT15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfWk9SUk9fTkFNRVM9eQotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0xODMsNiArMTg1LDcgQEAKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiBDT05GSUdfWEZSTV9NSUdSQVRFPXkKICMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfWEZSTV9JUENPTVA9bQogQ09ORklHX05FVF9LRVk9eQogQ09ORklHX05FVF9LRVlfTUlHUkFURT15CiBDT05GSUdfSU5FVD15CkBAIC00MTMsNiArNDE2LDcgQEAKICMKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19JRUVFODAyMTE9bQogIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTQzMiw3ICs0MzYsOSBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9bQorQ09ORklHX0ZXX0xPQURFUj15CisjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OTkVDVE9SPW0KICMgQ09ORklHX01URCBpcyBub3Qgc2V0CkBAIC00NjAsNiArNDY2LDcgQEAKIENPTkZJR19DRFJPTV9QS1RDRFZEX0JVRkZFUlM9OAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEUgaXMgbm90IHNldAogQ09ORklHX0FUQV9PVkVSX0VUSD1tCisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CkBAIC00NzAsNiArNDc3LDcgQEAKICMKICMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwogIworQ09ORklHX0lERV9BVEFQST15CiAjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lERURJU0s9eQogIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKQEAgLTQ4OSw4ICs0OTcsNiBAQAogQ09ORklHX0JMS19ERVZfSURFRE9VQkxFUj15CiBDT05GSUdfQkxLX0RFVl9CVURESEE9eQogIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRF9PTkxZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKQEAgLTU1Niw2ICs1NjIsNyBAQAogQ09ORklHX0dWUDExX1NDU0k9eQogQ09ORklHX1NDU0lfQTQwMDBUPXkKIENPTkZJR19TQ1NJX1pPUlJPN1hYPXkKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX01EPW0KIENPTkZJR19NRF9MSU5FQVI9bQpAQCAtNTY0LDcgKzU3MSw3IEBACiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAogQ09ORklHX01EX1JBSUQ0NTY9bQogQ09ORklHX01EX1JBSUQ1X1JFU0hBUEU9eQotQ09ORklHX01EX01VTFRJUEFUSD1tCisjIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAogIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0RNPW0KICMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTU3MywxMyArNTgwLDkgQEAKIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0VNQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX1JEQUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9IUD1tCiAjIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfRE1fVUVWRU5UPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiBDT05GSUdfTUFDVkxBTj1tCkBAIC03MjIsNiArNzI1LDcgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CkBAIC03NTcsNiArNzYxLDcgQEAKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCkBAIC03NjgsOCArNzczLDEwIEBACiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTg0NCwxMCArODUxLDYgQEAKIENPTkZJR19MT0dPX0xJTlVYX01PTk89eQogQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQogQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD1tCiBDT05GSUdfRE1BU09VTkRfUEFVTEE9bQogQ09ORklHX0RNQVNPVU5EPW0KQEAgLTg2MSw2ICs4NjQsNyBAQAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKQEAgLTg5OSw2ICs5MDMsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTk1OCw2ICs5NjMsNyBAQAogQ09ORklHX0NSQU1GUz1tCiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19IUEZTX0ZTPW0KICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05ODAsNyArOTg2LDYgQEAKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQogQ09ORklHX1NVTlJQQ19HU1M9bQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtOTg5LDcgKzk5NCw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA1NCw2ICsxMDU4LDggQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMTMsNiArMTExOSwxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9bQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTE1NCw2ICsxMTY0LDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj1tCitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCmluZGV4IGUyZDUxMWUuLmM0MWI4NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNi1yYzQKLSMgV2VkIE1heSAyOCAyMjo0NzozNSAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM2CisjIFdlZCBTZXAgMTAgMDk6MDI6MDEgMjAwOAogIwogQ09ORklHX002OEs9eQogQ09ORklHX01NVT15CkBAIC01Miw3ICs1Miw2IEBACiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CkBAIC03NSwxMCArNzQsMTYgQEAKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfT1BST0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tQUk9CRVMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUkVUUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldApAQCAtOTUsNiArMTAwLDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0JTRz15CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTYxLDEwICsxNjcsNiBAQAogQ09ORklHX1BST0NfSEFSRFdBUkU9eQogQ09ORklHX1pPTkVfRE1BPXkKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMTc4LDYgKzE4MCw3IEBACiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogQ09ORklHX1hGUk1fTUlHUkFURT15CiAjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19ORVRfS0VZX01JR1JBVEU9eQogQ09ORklHX0lORVQ9eQpAQCAtNDExLDYgKzQxNCw3IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTgwMjExPW0KICMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MzAsNyArNDM0LDkgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogQ09ORklHX0NPTk5FQ1RPUj1tCiAjIENPTkZJR19NVEQgaXMgbm90IHNldApAQCAtNDQ4LDYgKzQ1NCw3IEBACiBDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKICMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldApAQCAtNDk5LDYgKzUwNiw3IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiBDT05GSUdfSVNDU0lfVENQPW0KICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfTUQ9eQogQ09ORklHX0JMS19ERVZfTUQ9bQogQ09ORklHX01EX0xJTkVBUj1tCkBAIC01MDcsNyArNTE1LDcgQEAKICMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CiBDT05GSUdfTURfUkFJRDQ1Nj1tCiBDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfRE09bQogIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldApAQCAtNTE2LDEzICs1MjQsOSBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfRU1DPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfUkRBQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0hQPW0KICMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19ETV9VRVZFTlQ9eQogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWT1tCiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19NQUNWTEFOPW0KQEAgLTUzMiw3ICs1MzYsNiBAQAogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLUNPTkZJR19BUE9MTE9fRUxQTFVTPXkKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKQEAgLTYyNyw2ICs2MzAsNyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQEAgLTY1Nyw2ICs2NjEsNyBAQAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKQEAgLTY2OCw4ICs2NzMsMTAgQEAKICMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtNzM4LDEwICs3NDUsNiBAQAogQ09ORklHX0xPR09fTElOVVhfTU9OTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyNCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPW0KQEAgLTc1Myw2ICs3NTYsNyBAQAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCkBAIC03ODksNiArNzkzLDcgQEAKIENPTkZJR19PQ0ZTMl9GUz1tCiBDT05GSUdfT0NGUzJfRlNfTzJDQj1tCiBDT05GSUdfT0NGUzJfRlNfVVNFUlNQQUNFX0NMVVNURVI9bQorIyBDT05GSUdfT0NGUzJfRlNfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfTUFTS0xPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CkBAIC04NDgsNiArODUzLDcgQEAKIENPTkZJR19DUkFNRlM9bQogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTUlOSVhfRlM9eQorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSFBGU19GUz1tCiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODYwLDE4ICs4NjYsMTcgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19TVU5SUENfQklORDM0PXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTg4MCw3ICs4ODUsNiBAQAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogQ09ORklHX0NPREFfRlM9bQotIyBDT05GSUdfQ09EQV9GU19PTERfQVBJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTk0NCw2ICs5NDgsOCBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAwMyw2ICsxMDA5LDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDQ0LDYgKzEwNTQsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCmluZGV4IDZlMjBkNjUuLjY1NGM1YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmM0Ci0jIFdlZCBNYXkgMjggMjI6NDc6MzUgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNgorIyBXZWQgU2VwIDEwIDA5OjAyOjAyIDIwMDgKICMKIENPTkZJR19NNjhLPXkKIENPTkZJR19NTVU9eQpAQCAtNTIsNyArNTIsNiBAQAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQpAQCAtNzUsMTAgKzc0LDE2IEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX09QUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKQEAgLTk1LDYgKzEwMCw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9CU0c9eQorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTE2MiwxMCArMTY4LDYgQEAKIENPTkZJR19QUk9DX0hBUkRXQVJFPXkKIENPTkZJR19aT05FX0RNQT15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTE3OSw2ICsxODEsNyBAQAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19YRlJNX01JR1JBVEU9eQogIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCiBDT05GSUdfTkVUX0tFWT15CiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFPXkKIENPTkZJR19JTkVUPXkKQEAgLTQwOSw2ICs0MTIsNyBAQAogIwogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogQ09ORklHX0lFRUU4MDIxMT1tCiAjIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldApAQCAtNDI4LDcgKzQzMiw5IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19DT05ORUNUT1I9bQogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKQEAgLTQ1Miw2ICs0NTgsNyBAQAogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX09WRVJfRVRIPW0KKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTQ2Miw2ICs0NjksNyBAQAogIwogIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCiAjCitDT05GSUdfSURFX0FUQVBJPXkKICMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRElTSz15CiAjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldApAQCAtNDc5LDggKzQ4Nyw2IEBACiAjIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0ZBTENPTl9JREU9eQogIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRF9PTkxZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKQEAgLTUzMCw2ICs1MzYsNyBAQAogQ09ORklHX0FUQVJJX1NDU0k9eQogIyBDT05GSUdfQVRBUklfU0NTSV9UT1NISUJBX0RFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQVJJX1NDU0lfUkVTRVRfQk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIENPTkZJR19NRD15CiBDT05GSUdfQkxLX0RFVl9NRD1tCiBDT05GSUdfTURfTElORUFSPW0KQEAgLTUzOCw3ICs1NDUsNyBAQAogIyBDT05GSUdfTURfUkFJRDEwIGlzIG5vdCBzZXQKIENPTkZJR19NRF9SQUlENDU2PW0KIENPTkZJR19NRF9SQUlENV9SRVNIQVBFPXkKLUNPTkZJR19NRF9NVUxUSVBBVEg9bQorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT1tCiAjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CkBAIC01NDcsMTMgKzU1NCw5IEBACiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9aRVJPPW0KIENPTkZJR19ETV9NVUxUSVBBVEg9bQotQ09ORklHX0RNX01VTFRJUEFUSF9FTUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9SREFDPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfSFA9bQogIyBDT05GSUdfRE1fREVMQVkgaXMgbm90IHNldAogQ09ORklHX0RNX1VFVkVOVD15CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogQ09ORklHX01BQ1ZMQU49bQpAQCAtNjY2LDYgKzY2OSw3IEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQpAQCAtNzAwLDYgKzcwNCw3IEBACiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwpAQCAtNzExLDggKzcxNiwxMCBAQAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC03ODIsMTAgKzc4OSw2IEBACiBDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9bQogQ09ORklHX0RNQVNPVU5EX0FUQVJJPW0KIENPTkZJR19ETUFTT1VORD1tCkBAIC03OTksNiArODAyLDcgQEAKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCkBAIC04MDYsMTEgKzgxMCw4IEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfQVRBUklfTUZQU0VSPW0KLUNPTkZJR19BVEFSSV9TQ0M9eQotQ09ORklHX0FUQVJJX1NDQ19ETUE9eQogQ09ORklHX0FUQVJJX01JREk9bQogQ09ORklHX0FUQVJJX0RTUDU2Sz1tCi0jIENPTkZJR19TRVJJQUxfQ09OU09MRSBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC04MjAsOCArODIxLDEwIEBACiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0VYVDRERVZfRlM9eQorIyBDT05GSUdfRVhUNERFVl9GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKK0NPTkZJR19KQkQyPXkKIENPTkZJR19SRUlTRVJGU19GUz1tCiAjIENPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gaXMgbm90IHNldApAQCAtODQwLDYgKzg0Myw3IEBACiBDT05GSUdfT0NGUzJfRlM9bQogQ09ORklHX09DRlMyX0ZTX08yQ0I9bQogQ09ORklHX09DRlMyX0ZTX1VTRVJTUEFDRV9DTFVTVEVSPW0KKyMgQ09ORklHX09DRlMyX0ZTX1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX01BU0tMT0cgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQpAQCAtODk5LDYgKzkwMyw3IEBACiBDT05GSUdfQ1JBTUZTPW0KICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0hQRlNfRlM9bQogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTkyMCw3ICs5MjUsNiBAQAogQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05MjksNyArOTMzLDYgQEAKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19DT0RBX0ZTPW0KLSMgQ09ORklHX0NPREFfRlNfT0xEX0FQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAogCiAjCkBAIC05OTQsNiArOTk3LDggQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwNTMsNiArMTA1OCwxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9bQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTA5NCw2ICsxMTAzLDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj15CitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwppbmRleCBhMGE5YjMwLi4yZTQ0YWYwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LXJjNAotIyBXZWQgTWF5IDI4IDIyOjQ3OjM1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzYKKyMgV2VkIFNlcCAxMCAwOTowMjowMyAyMDA4CiAjCiBDT05GSUdfTTY4Sz15CiBDT05GSUdfTU1VPXkKQEAgLTUyLDcgKzUyLDYgQEAKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKQEAgLTc1LDEwICs3NCwxNiBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9PUFJPRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1BST0JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tSRVRQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CkBAIC05NSw2ICsxMDAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfQlNHPXkKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xNjMsMTAgKzE2OSw2IEBACiBDT05GSUdfUFJPQ19IQVJEV0FSRT15CiBDT05GSUdfWk9ORV9ETUE9eQogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0xODAsNiArMTgyLDcgQEAKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiBDT05GSUdfWEZSTV9NSUdSQVRFPXkKICMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfWEZSTV9JUENPTVA9bQogQ09ORklHX05FVF9LRVk9eQogQ09ORklHX05FVF9LRVlfTUlHUkFURT15CiBDT05GSUdfSU5FVD15CkBAIC00MTMsNiArNDE2LDcgQEAKICMKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19JRUVFODAyMTE9bQogIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTQzMiw3ICs0MzYsOSBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9bQorQ09ORklHX0ZXX0xPQURFUj15CisjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OTkVDVE9SPW0KICMgQ09ORklHX01URCBpcyBub3Qgc2V0CkBAIC00NTAsNiArNDU2LDcgQEAKIENPTkZJR19DRFJPTV9QS1RDRFZEX0JVRkZFUlM9OAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEUgaXMgbm90IHNldAogQ09ORklHX0FUQV9PVkVSX0VUSD1tCisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CkBAIC01MDMsNiArNTEwLDcgQEAKIENPTkZJR181M0M3MDBfQkVfQlVTPXkKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0JWTUU2MDAwX1NDU0k9eQorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfTUQ9eQogQ09ORklHX0JMS19ERVZfTUQ9bQogQ09ORklHX01EX0xJTkVBUj1tCkBAIC01MTEsNyArNTE5LDcgQEAKICMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CiBDT05GSUdfTURfUkFJRDQ1Nj1tCiBDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfRE09bQogIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldApAQCAtNTIwLDEzICs1MjgsOSBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfRU1DPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfUkRBQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0hQPW0KICMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19ETV9VRVZFTlQ9eQogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWT1tCiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19NQUNWTEFOPW0KQEAgLTYzMSw2ICs2MzUsNyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQEAgLTY2MSw2ICs2NjYsNyBAQAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3Miw4ICs2NzgsMTAgQEAKICMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtNzA4LDEwICs3MTYsNiBAQAogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQpAQCAtNzIzLDYgKzcyNyw3IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKQEAgLTc1OSw2ICs3NjQsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTgxOCw2ICs4MjQsNyBAQAogQ09ORklHX0NSQU1GUz1tCiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19IUEZTX0ZTPW0KICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC04MzAsMTggKzgzNywxNyBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKICMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtODUwLDcgKzg1Niw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtOTE1LDYgKzkyMCw4IEBACiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogCiAjCkBAIC05NzQsNiArOTgxLDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDE1LDYgKzEwMjYsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPW0KICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCmluZGV4IDY3NzgwNDEuLjM1NzBmYzggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmM0Ci0jIFdlZCBNYXkgMjggMjI6NDc6MzUgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNgorIyBXZWQgU2VwIDEwIDA5OjAyOjA0IDIwMDgKICMKIENPTkZJR19NNjhLPXkKIENPTkZJR19NTVU9eQpAQCAtNTIsNyArNTIsNiBAQAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQpAQCAtNzUsMTAgKzc0LDE2IEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX09QUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKQEAgLTk1LDYgKzEwMCw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9CU0c9eQorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTE2MiwxMCArMTY4LDYgQEAKIENPTkZJR19QUk9DX0hBUkRXQVJFPXkKIENPTkZJR19aT05FX0RNQT15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTE3OSw2ICsxODEsNyBAQAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19YRlJNX01JR1JBVEU9eQogIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCiBDT05GSUdfTkVUX0tFWT15CiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFPXkKIENPTkZJR19JTkVUPXkKQEAgLTQxMiw2ICs0MTUsNyBAQAogIwogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogQ09ORklHX0lFRUU4MDIxMT1tCiAjIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldApAQCAtNDMxLDcgKzQzNSw5IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19DT05ORUNUT1I9bQogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKQEAgLTQ0OSw2ICs0NTUsNyBAQAogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX09WRVJfRVRIPW0KKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTUwMCw2ICs1MDcsNyBAQAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogQ09ORklHX0lTQ1NJX1RDUD1tCiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX01EPW0KIENPTkZJR19NRF9MSU5FQVI9bQpAQCAtNTA4LDcgKzUxNiw3IEBACiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAogQ09ORklHX01EX1JBSUQ0NTY9bQogQ09ORklHX01EX1JBSUQ1X1JFU0hBUEU9eQotQ09ORklHX01EX01VTFRJUEFUSD1tCisjIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAogIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0RNPW0KICMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTUxNywxMyArNTI1LDkgQEAKIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0VNQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX1JEQUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9IUD1tCiAjIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfRE1fVUVWRU5UPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiBDT05GSUdfTUFDVkxBTj1tCkBAIC02MzYsNiArNjQwLDcgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CkBAIC02NjYsNiArNjcxLDcgQEAKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCkBAIC02NzcsOCArNjgzLDEwIEBACiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTc0NywxMCArNzU1LDYgQEAKICMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD1tCkBAIC03NjIsNiArNzY2LDcgQEAKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwpAQCAtNzk2LDYgKzgwMSw3IEBACiBDT05GSUdfT0NGUzJfRlM9bQogQ09ORklHX09DRlMyX0ZTX08yQ0I9bQogQ09ORklHX09DRlMyX0ZTX1VTRVJTUEFDRV9DTFVTVEVSPW0KKyMgQ09ORklHX09DRlMyX0ZTX1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX01BU0tMT0cgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQpAQCAtODU1LDYgKzg2MSw3IEBACiBDT05GSUdfQ1JBTUZTPW0KICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0hQRlNfRlM9bQogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTg2NywxOCArODc0LDE3IEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CitDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX05GU0Q9bQogQ09ORklHX05GU0RfVjM9eQogIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX0xPQ0tEPXkKIENPTkZJR19MT0NLRF9WND15CiBDT05GSUdfRVhQT1JURlM9bQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiBDT05GSUdfU1VOUlBDX0dTUz15Ci1DT05GSUdfU1VOUlBDX0JJTkQzND15CiBDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC04ODcsNyArODkzLDYgQEAKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19DT0RBX0ZTPW0KLSMgQ09ORklHX0NPREFfRlNfT0xEX0FQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAogCiAjCkBAIC05NTEsNiArOTU2LDggQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwMTAsNiArMTAxNywxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9eQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTA1MSw2ICsxMDYyLDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj1tCitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCmluZGV4IDdjZDM3NTcuLmRiNmU4ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNi1yYzQKLSMgV2VkIE1heSAyOCAyMjo0NzozNSAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM2CisjIFdlZCBTZXAgMTAgMDk6MDI6MDYgMjAwOAogIwogQ09ORklHX002OEs9eQogQ09ORklHX01NVT15CkBAIC01Miw3ICs1Miw2IEBACiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CkBAIC03NSwxMCArNzQsMTYgQEAKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfT1BST0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tQUk9CRVMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUkVUUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldApAQCAtOTUsNiArMTAwLDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0JTRz15CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTYzLDEwICsxNjksNiBAQAogQ09ORklHX1BST0NfSEFSRFdBUkU9eQogQ09ORklHX1pPTkVfRE1BPXkKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMTgwLDYgKzE4Miw3IEBACiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogQ09ORklHX1hGUk1fTUlHUkFURT15CiAjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19ORVRfS0VZX01JR1JBVEU9eQogQ09ORklHX0lORVQ9eQpAQCAtNDEzLDYgKzQxNiw3IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTgwMjExPW0KICMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MzIsNyArNDM2LDkgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogQ09ORklHX0NPTk5FQ1RPUj1tCiAjIENPTkZJR19NVEQgaXMgbm90IHNldApAQCAtNDUwLDYgKzQ1Niw3IEBACiBDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKICMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldApAQCAtNDYwLDYgKzQ2Nyw3IEBACiAjCiAjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKICMKK0NPTkZJR19JREVfQVRBUEk9eQogIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKICMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CkBAIC00NzcsOCArNDg1LDYgQEAKICMgQ09ORklHX0JMS19ERVZfUExBVEZPUk0gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTUFDX0lERT15CiAjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEX09OTFkgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydApAQCAtNTI3LDYgKzUzMyw3IEBACiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NQUNfU0NTST15CiBDT05GSUdfU0NTSV9NQUNfRVNQPXkKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX01EPW0KIENPTkZJR19NRF9MSU5FQVI9bQpAQCAtNTM1LDcgKzU0Miw3IEBACiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAogQ09ORklHX01EX1JBSUQ0NTY9bQogQ09ORklHX01EX1JBSUQ1X1JFU0hBUEU9eQotQ09ORklHX01EX01VTFRJUEFUSD1tCisjIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAogIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0RNPW0KICMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTU0NCw5ICs1NTEsNiBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfRU1DPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfUkRBQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0hQPW0KICMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19ETV9VRVZFTlQ9eQogQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTPXkKQEAgLTU1OSw3ICs1NjMsNiBAQAogQ09ORklHX0lOUFVUX0FEQkhJRD15CiBDT05GSUdfTUFDX0VNVU1PVVNFQlROPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiBDT05GSUdfTUFDVkxBTj1tCkBAIC02NzAsNiArNjczLDcgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CkBAIC03MDAsNiArNzA0LDcgQEAKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCkBAIC03MTEsOCArNzE2LDEwIEBACiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTc4NCwxMCArNzkxLDYgQEAKIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQogQ09ORklHX0xPR09fTUFDX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD1tCkBAIC03OTksNiArODAyLDcgQEAKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIAogIwpAQCAtODM2LDYgKzg0MCw3IEBACiBDT05GSUdfT0NGUzJfRlM9bQogQ09ORklHX09DRlMyX0ZTX08yQ0I9bQogQ09ORklHX09DRlMyX0ZTX1VTRVJTUEFDRV9DTFVTVEVSPW0KKyMgQ09ORklHX09DRlMyX0ZTX1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX01BU0tMT0cgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQpAQCAtODk1LDYgKzkwMCw3IEBACiBDT05GSUdfQ1JBTUZTPW0KICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0hQRlNfRlM9bQogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTkxNyw3ICs5MjMsNiBAQAogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCiBDT05GSUdfU1VOUlBDX0dTUz1tCi1DT05GSUdfU1VOUlBDX0JJTkQzND15CiBDT05GSUdfUlBDU0VDX0dTU19LUkI1PW0KICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05MjYsNyArOTMxLDYgQEAKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19DT0RBX0ZTPW0KLSMgQ09ORklHX0NPREFfRlNfT0xEX0FQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAogCiAjCkBAIC05OTEsNiArOTk1LDggQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTEwNTAsNiArMTA1NiwxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9bQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTA5MSw2ICsxMTAxLDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj1tCitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZwppbmRleCAwNzQ3ZmEzLi4xYTgwNjEwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LXJjNAotIyBXZWQgTWF5IDI4IDIyOjQ3OjM1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzYKKyMgV2VkIFNlcCAxMCAwOTowMjowNyAyMDA4CiAjCiBDT05GSUdfTTY4Sz15CiBDT05GSUdfTU1VPXkKQEAgLTUyLDcgKzUyLDYgQEAKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKQEAgLTc1LDEwICs3NCwxNiBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9PUFJPRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1BST0JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tSRVRQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CkBAIC05NSw2ICsxMDAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfQlNHPXkKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xNzMsMTAgKzE3OSw2IEBACiBDT05GSUdfWk9ORV9ETUE9eQogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1pPUlJPX05BTUVTPXkKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMTkwLDYgKzE5Miw3IEBACiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogQ09ORklHX1hGUk1fTUlHUkFURT15CiAjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19ORVRfS0VZX01JR1JBVEU9eQogQ09ORklHX0lORVQ9eQpAQCAtNDI3LDYgKzQzMCw3IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTgwMjExPW0KICMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CkBAIC00NDYsNyArNDUwLDkgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogQ09ORklHX0NPTk5FQ1RPUj1tCiAjIENPTkZJR19NVEQgaXMgbm90IHNldApAQCAtNDc2LDYgKzQ4Miw3IEBACiBDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKICMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldApAQCAtNDg2LDYgKzQ5Myw3IEBACiAjCiAjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKICMKK0NPTkZJR19JREVfQVRBUEk9eQogIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKICMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CkBAIC01MDgsOCArNTE2LDYgQEAKIENPTkZJR19CTEtfREVWX01BQ19JREU9eQogQ09ORklHX0JMS19ERVZfUTQwSURFPXkKICMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSERfT05MWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CkBAIC01ODQsNiArNTkwLDcgQEAKIENPTkZJR19NVk1FMTZ4X1NDU0k9eQogQ09ORklHX0JWTUU2MDAwX1NDU0k9eQogQ09ORklHX1NVTjNYX0VTUD15CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIENPTkZJR19NRD15CiBDT05GSUdfQkxLX0RFVl9NRD1tCiBDT05GSUdfTURfTElORUFSPW0KQEAgLTU5Miw3ICs1OTksNyBAQAogIyBDT05GSUdfTURfUkFJRDEwIGlzIG5vdCBzZXQKIENPTkZJR19NRF9SQUlENDU2PW0KIENPTkZJR19NRF9SQUlENV9SRVNIQVBFPXkKLUNPTkZJR19NRF9NVUxUSVBBVEg9bQorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT1tCiAjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CkBAIC02MDEsOSArNjA4LDYgQEAKIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0VNQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX1JEQUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9IUD1tCiAjIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfRE1fVUVWRU5UPXkKIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUz15CkBAIC02MTYsNyArNjIwLDYgQEAKIENPTkZJR19JTlBVVF9BREJISUQ9eQogQ09ORklHX01BQ19FTVVNT1VTRUJUTj15CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogQ09ORklHX01BQ1ZMQU49bQpAQCAtNjMyLDcgKzYzNSw2IEBACiBDT05GSUdfSFlEUkE9bQogQ09ORklHX1pPUlJPODM5MD1tCiBDT05GSUdfQVBORT1tCi1DT05GSUdfQVBPTExPX0VMUExVUz15CiBDT05GSUdfTUFDODM5MD15CiBDT05GSUdfTUFDODl4MD1tCiBDT05GSUdfTUFDU09OSUM9bQpAQCAtNzkxLDYgKzc5Myw3IEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQpAQCAtODI3LDYgKzgzMCw3IEBACiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwpAQCAtODM4LDggKzg0MiwxMCBAQAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC05MjMsMTAgKzkyOSw2IEBACiBDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CiBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKIENPTkZJR19MT0dPX01BQ19DTFVUMjI0PXkKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KIENPTkZJR19ETUFTT1VORF9BVEFSST1tCiBDT05GSUdfRE1BU09VTkRfUEFVTEE9bQpAQCAtOTQyLDYgKzk0NCw3IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKIApAQCAtOTQ5LDggKzk1Miw2IEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfQVRBUklfTUZQU0VSPW0KLUNPTkZJR19BVEFSSV9TQ0M9eQotQ09ORklHX0FUQVJJX1NDQ19ETUE9eQogQ09ORklHX0FUQVJJX01JREk9bQogQ09ORklHX0FUQVJJX0RTUDU2Sz1tCiBDT05GSUdfQU1JR0FfQlVJTFRJTl9TRVJJQUw9eQpAQCAtOTcyLDggKzk3MywxMCBAQAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQ0REVWX0ZTPXkKKyMgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX0pCRD15CitDT05GSUdfSkJEMj15CiBDT05GSUdfUkVJU0VSRlNfRlM9bQogIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKQEAgLTk5Miw2ICs5OTUsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTEwNTEsNiArMTA1NSw3IEBACiBDT05GSUdfQ1JBTUZTPW0KICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0hQRlNfRlM9bQogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwNjMsMTggKzEwNjgsMTcgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19TVU5SUENfQklORDM0PXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTEwODMsNyArMTA4Nyw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTE1Miw2ICsxMTU1LDggQEAKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMTEsNiArMTIxNiwxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9eQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTI1Miw2ICsxMjYxLDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj15CitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKaW5kZXggZTdhODI0Ni4uY2FjYjVhZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmM0Ci0jIFdlZCBNYXkgMjggMjI6NDc6MzUgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNgorIyBXZWQgU2VwIDEwIDA5OjAyOjA4IDIwMDgKICMKIENPTkZJR19NNjhLPXkKIENPTkZJR19NTVU9eQpAQCAtNTIsNyArNTIsNiBAQAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQpAQCAtNzUsMTAgKzc0LDE2IEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX09QUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1QgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKQEAgLTk1LDYgKzEwMCw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9CU0c9eQorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTE2MywxMCArMTY5LDYgQEAKIENPTkZJR19QUk9DX0hBUkRXQVJFPXkKIENPTkZJR19aT05FX0RNQT15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTE4MCw2ICsxODIsNyBAQAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19YRlJNX01JR1JBVEU9eQogIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCiBDT05GSUdfTkVUX0tFWT15CiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFPXkKIENPTkZJR19JTkVUPXkKQEAgLTQxMyw2ICs0MTYsNyBAQAogIwogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogQ09ORklHX0lFRUU4MDIxMT1tCiAjIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldApAQCAtNDMyLDcgKzQzNiw5IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19DT05ORUNUT1I9bQogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKQEAgLTQ1MCw2ICs0NTYsNyBAQAogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX09WRVJfRVRIPW0KKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTUwMiw2ICs1MDksNyBAQAogQ09ORklHX0lTQ1NJX1RDUD1tCiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVk1FMTQ3X1NDU0k9eQorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfTUQ9eQogQ09ORklHX0JMS19ERVZfTUQ9bQogQ09ORklHX01EX0xJTkVBUj1tCkBAIC01MTAsNyArNTE4LDcgQEAKICMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CiBDT05GSUdfTURfUkFJRDQ1Nj1tCiBDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfRE09bQogIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldApAQCAtNTE5LDEzICs1MjcsOSBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfRU1DPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfUkRBQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0hQPW0KICMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19ETV9VRVZFTlQ9eQogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWT1tCiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19NQUNWTEFOPW0KQEAgLTYzMCw2ICs2MzQsNyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQEAgLTY2MCw2ICs2NjUsNyBAQAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3MSw4ICs2NzcsMTAgQEAKICMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtNzA3LDEwICs3MTUsNiBAQAogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQpAQCAtNzIyLDYgKzcyNiw3IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKQEAgLTc1OCw2ICs3NjMsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTgxNyw2ICs4MjMsNyBAQAogQ09ORklHX0NSQU1GUz1tCiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19IUEZTX0ZTPW0KICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC04MjksMTggKzgzNiwxNyBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKICMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtODQ5LDcgKzg1NSw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtOTE0LDYgKzkxOSw4IEBACiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogCiAjCkBAIC05NzMsNiArOTgwLDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDE0LDYgKzEwMjUsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwppbmRleCBhYjUzNmViLi5hMTgzZTI1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNi1yYzQKLSMgV2VkIE1heSAyOCAyMjo0NzozNSAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM2CisjIFdlZCBTZXAgMTAgMDk6MDI6MDkgMjAwOAogIwogQ09ORklHX002OEs9eQogQ09ORklHX01NVT15CkBAIC01Miw3ICs1Miw2IEBACiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CkBAIC03NSwxMCArNzQsMTYgQEAKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfT1BST0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tQUk9CRVMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUkVUUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldApAQCAtOTUsNiArMTAwLDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0JTRz15CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTYzLDEwICsxNjksNiBAQAogQ09ORklHX1BST0NfSEFSRFdBUkU9eQogQ09ORklHX1pPTkVfRE1BPXkKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMTgwLDYgKzE4Miw3IEBACiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogQ09ORklHX1hGUk1fTUlHUkFURT15CiAjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19ORVRfS0VZX01JR1JBVEU9eQogQ09ORklHX0lORVQ9eQpAQCAtNDEzLDYgKzQxNiw3IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTgwMjExPW0KICMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MzIsNyArNDM2LDkgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogQ09ORklHX0NPTk5FQ1RPUj1tCiAjIENPTkZJR19NVEQgaXMgbm90IHNldApAQCAtNDUwLDYgKzQ1Niw3IEBACiBDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKICMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldApAQCAtNTAzLDYgKzUxMCw3IEBACiBDT05GSUdfNTNDNzAwX0JFX0JVUz15CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVk1FMTZ4X1NDU0k9eQorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfTUQ9eQogQ09ORklHX0JMS19ERVZfTUQ9bQogQ09ORklHX01EX0xJTkVBUj1tCkBAIC01MTEsNyArNTE5LDcgQEAKICMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CiBDT05GSUdfTURfUkFJRDQ1Nj1tCiBDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15Ci1DT05GSUdfTURfTVVMVElQQVRIPW0KKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfRE09bQogIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldApAQCAtNTIwLDEzICs1MjgsOSBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiBDT05GSUdfRE1fTVVMVElQQVRIPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfRU1DPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfUkRBQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0hQPW0KICMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19ETV9VRVZFTlQ9eQogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWT1tCiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKIENPTkZJR19NQUNWTEFOPW0KQEAgLTYzMSw2ICs2MzUsNyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQEAgLTY2MSw2ICs2NjYsNyBAQAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3Miw4ICs2NzgsMTAgQEAKICMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtNzA4LDEwICs3MTYsNiBAQAogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQpAQCAtNzIzLDYgKzcyNyw3IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKQEAgLTc2MCw2ICs3NjUsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTgxOSw2ICs4MjUsNyBAQAogQ09ORklHX0NSQU1GUz1tCiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19IUEZTX0ZTPW0KICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC04MzEsMTggKzgzOCwxNyBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKICMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtODUxLDcgKzg1Nyw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtOTE2LDYgKzkyMSw4IEBACiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogCiAjCkBAIC05NzUsNiArOTgyLDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDE2LDYgKzEwMjcsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKaW5kZXggZTA1YmU2OC4uNzJlYWZmMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LXJjNAotIyBXZWQgTWF5IDI4IDIyOjQ3OjM1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzYKKyMgV2VkIFNlcCAxMCAwOTowMjoxMCAyMDA4CiAjCiBDT05GSUdfTTY4Sz15CiBDT05GSUdfTU1VPXkKQEAgLTUyLDcgKzUyLDYgQEAKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKQEAgLTc1LDEwICs3NCwxNiBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9PUFJPRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1BST0JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tSRVRQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CkBAIC05NSw2ICsxMDAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfQlNHPXkKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xNjMsMTAgKzE2OSw2IEBACiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKIENPTkZJR19aT05FX0RNQT15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTE4MCw2ICsxODIsNyBAQAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19YRlJNX01JR1JBVEU9eQogIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCiBDT05GSUdfTkVUX0tFWT15CiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFPXkKIENPTkZJR19JTkVUPXkKQEAgLTQxMCw2ICs0MTMsNyBAQAogIwogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogQ09ORklHX0lFRUU4MDIxMT1tCiAjIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldApAQCAtNDI5LDcgKzQzMyw5IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCitDT05GSUdfRldfTE9BREVSPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19DT05ORUNUT1I9bQogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKQEAgLTQ0OCw2ICs0NTQsNyBAQAogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX09WRVJfRVRIPW0KKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTQ1OCw2ICs0NjUsNyBAQAogIwogIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCiAjCitDT05GSUdfSURFX0FUQVBJPXkKICMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRElTSz15CiAjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldApAQCAtNDc1LDggKzQ4Myw2IEBACiAjIENPTkZJR19CTEtfREVWX1BMQVRGT1JNIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1E0MElERT15CiAjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEX09OTFkgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydApAQCAtNTM2LDYgKzU0Miw3IEBACiAjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIENPTkZJR19NRD15CiBDT05GSUdfQkxLX0RFVl9NRD1tCiBDT05GSUdfTURfTElORUFSPW0KQEAgLTU0NCw3ICs1NTEsNyBAQAogIyBDT05GSUdfTURfUkFJRDEwIGlzIG5vdCBzZXQKIENPTkZJR19NRF9SQUlENDU2PW0KIENPTkZJR19NRF9SQUlENV9SRVNIQVBFPXkKLUNPTkZJR19NRF9NVUxUSVBBVEg9bQorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT1tCiAjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CkBAIC01NTMsMTMgKzU2MCw5IEBACiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9aRVJPPW0KIENPTkZJR19ETV9NVUxUSVBBVEg9bQotQ09ORklHX0RNX01VTFRJUEFUSF9FTUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9SREFDPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfSFA9bQogIyBDT05GSUdfRE1fREVMQVkgaXMgbm90IHNldAogQ09ORklHX0RNX1VFVkVOVD15CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogQ09ORklHX01BQ1ZMQU49bQpAQCAtNjgwLDYgKzY4Myw3IEBACiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQpAQCAtNzExLDYgKzcxNSw3IEBACiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwpAQCAtNzIyLDggKzcyNywxMCBAQAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC03OTIsMTAgKzc5OSw2IEBACiBDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9bQogQ09ORklHX0RNQVNPVU5EX1E0MD1tCiBDT05GSUdfRE1BU09VTkQ9bQpAQCAtODA5LDYgKzgxMiw3IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKQEAgLTg0Myw2ICs4NDcsNyBAQAogQ09ORklHX09DRlMyX0ZTPW0KIENPTkZJR19PQ0ZTMl9GU19PMkNCPW0KIENPTkZJR19PQ0ZTMl9GU19VU0VSU1BBQ0VfQ0xVU1RFUj1tCisjIENPTkZJR19PQ0ZTMl9GU19TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19NQVNLTE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ETk9USUZZPXkKQEAgLTkwMiw2ICs5MDcsNyBAQAogQ09ORklHX0NSQU1GUz1tCiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19IUEZTX0ZTPW0KICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05MjQsNyArOTMwLDYgQEAKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotQ09ORklHX1NVTlJQQ19CSU5EMzQ9eQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtOTMzLDcgKzkzOCw2IEBACiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ09EQV9GUz1tCi0jIENPTkZJR19DT0RBX0ZTX09MRF9BUEkgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtOTk3LDYgKzEwMDEsOCBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA1Niw2ICsxMDYyLDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDk3LDYgKzExMDcsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwppbmRleCAyOTYzNDBkLi5jYjYyYjk2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNi1yYzQKLSMgV2VkIE1heSAyOCAyMjo0NzozNSAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM2CisjIFdlZCBTZXAgMTAgMDk6MDI6MTEgMjAwOAogIwogQ09ORklHX002OEs9eQogQ09ORklHX01NVT15CkBAIC01Miw3ICs1Miw2IEBACiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CkBAIC03NSwxMCArNzQsMTYgQEAKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfT1BST0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tQUk9CRVMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9LUkVUUFJPQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAogQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldApAQCAtOTUsNiArMTAwLDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0JTRz15CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTQ5LDEwICsxNTUsNiBAQAogQ09ORklHX1BST0NfSEFSRFdBUkU9eQogQ09ORklHX1pPTkVfRE1BPXkKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMTY2LDYgKzE2OCw3IEBACiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogQ09ORklHX1hGUk1fTUlHUkFURT15CiAjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KIENPTkZJR19ORVRfS0VZPXkKIENPTkZJR19ORVRfS0VZX01JR1JBVEU9eQogQ09ORklHX0lORVQ9eQpAQCAtMzk5LDYgKzQwMiw3IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfSUVFRTgwMjExPW0KICMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MTgsNyArNDIyLDkgQEAKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPW0KK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogQ09ORklHX0NPTk5FQ1RPUj1tCiAjIENPTkZJR19NVEQgaXMgbm90IHNldApAQCAtNDM2LDYgKzQ0Miw3IEBACiBDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKICMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldApAQCAtNDg4LDYgKzQ5NSw3IEBACiBDT05GSUdfSVNDU0lfVENQPW0KICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NVTjNfU0NTST15CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIENPTkZJR19NRD15CiBDT05GSUdfQkxLX0RFVl9NRD1tCiBDT05GSUdfTURfTElORUFSPW0KQEAgLTQ5Niw3ICs1MDQsNyBAQAogIyBDT05GSUdfTURfUkFJRDEwIGlzIG5vdCBzZXQKIENPTkZJR19NRF9SQUlENDU2PW0KIENPTkZJR19NRF9SQUlENV9SRVNIQVBFPXkKLUNPTkZJR19NRF9NVUxUSVBBVEg9bQorIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX01EX0ZBVUxUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9ETT1tCiAjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CkBAIC01MDUsMTMgKzUxMyw5IEBACiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9aRVJPPW0KIENPTkZJR19ETV9NVUxUSVBBVEg9bQotQ09ORklHX0RNX01VTFRJUEFUSF9FTUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9SREFDPW0KLUNPTkZJR19ETV9NVUxUSVBBVEhfSFA9bQogIyBDT05GSUdfRE1fREVMQVkgaXMgbm90IHNldAogQ09ORklHX0RNX1VFVkVOVD15CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogQ09ORklHX01BQ1ZMQU49bQpAQCAtNTI3LDcgKzUzMSw2IEBACiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CiAKQEAgLTYxNyw2ICs2MjAsNyBAQAogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKQEAgLTY0NywxOSArNjUxLDIwIEBACiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwogIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC03MjcsMTAgKzczMiw2IEBACiBDT05GSUdfTE9HT19MSU5VWF9NT05PPXkKIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2PXkKIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD1tCkBAIC03NzYsNiArNzc3LDcgQEAKIENPTkZJR19PQ0ZTMl9GUz1tCiBDT05GSUdfT0NGUzJfRlNfTzJDQj1tCiBDT05GSUdfT0NGUzJfRlNfVVNFUlNQQUNFX0NMVVNURVI9bQorIyBDT05GSUdfT0NGUzJfRlNfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfTUFTS0xPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CkBAIC04MzUsNiArODM3LDcgQEAKIENPTkZJR19DUkFNRlM9bQogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTUlOSVhfRlM9eQorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSFBGU19GUz1tCiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODQ3LDE4ICs4NTAsMTcgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19TVU5SUENfQklORDM0PXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTg2Nyw3ICs4NjksNiBAQAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogQ09ORklHX0NPREFfRlM9bQotIyBDT05GSUdfQ09EQV9GU19PTERfQVBJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTkzMiw2ICs5MzMsOCBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIAogIwpAQCAtOTkxLDYgKzk5NCwxMCBAQAogQ09ORklHX0NSWVBUT19NRDQ9bQogQ09ORklHX0NSWVBUT19NRDU9eQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCitDT05GSUdfQ1JZUFRPX1JNRDEyOD1tCitDT05GSUdfQ1JZUFRPX1JNRDE2MD1tCitDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCitDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTE9bQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtMTAzMiw2ICsxMDM5LDcgQEAKICMgQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj1tCitDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfQ1JDX0lUVV9UPW0KIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwppbmRleCA4ZDNhNDE2Li4wNGI0MzYzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LXJjNAotIyBXZWQgTWF5IDI4IDIyOjQ3OjM1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzYKKyMgV2VkIFNlcCAxMCAwOTowMjoxMiAyMDA4CiAjCiBDT05GSUdfTTY4Sz15CiBDT05GSUdfTU1VPXkKQEAgLTUyLDcgKzUyLDYgQEAKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKQEAgLTc1LDEwICs3NCwxNiBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9PUFJPRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfS1BST0JFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0tSRVRQUk9CRVMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CkBAIC05NSw2ICsxMDAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfQlNHPXkKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xNjAsMTAgKzE2Niw2IEBACiBDT05GSUdfUFJPQ19IQVJEV0FSRT15CiBDT05GSUdfWk9ORV9ETUE9eQogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0xNzcsNiArMTc5LDcgQEAKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiBDT05GSUdfWEZSTV9NSUdSQVRFPXkKICMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfWEZSTV9JUENPTVA9bQogQ09ORklHX05FVF9LRVk9eQogQ09ORklHX05FVF9LRVlfTUlHUkFURT15CiBDT05GSUdfSU5FVD15CkBAIC00MTAsNiArNDEzLDcgQEAKICMKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19JRUVFODAyMTE9bQogIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTQyOSw3ICs0MzMsOSBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLUNPTkZJR19GV19MT0FERVI9bQorQ09ORklHX0ZXX0xPQURFUj15CisjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OTkVDVE9SPW0KICMgQ09ORklHX01URCBpcyBub3Qgc2V0CkBAIC00NDcsNiArNDUzLDcgQEAKIENPTkZJR19DRFJPTV9QS1RDRFZEX0JVRkZFUlM9OAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEUgaXMgbm90IHNldAogQ09ORklHX0FUQV9PVkVSX0VUSD1tCisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CkBAIC00OTksNiArNTA2LDcgQEAKIENPTkZJR19JU0NTSV9UQ1A9bQogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1VOM1hfRVNQPXkKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX01EPW0KIENPTkZJR19NRF9MSU5FQVI9bQpAQCAtNTA3LDcgKzUxNSw3IEBACiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAogQ09ORklHX01EX1JBSUQ0NTY9bQogQ09ORklHX01EX1JBSUQ1X1JFU0hBUEU9eQotQ09ORklHX01EX01VTFRJUEFUSD1tCisjIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAogIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0RNPW0KICMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTUxNiwxMyArNTI0LDkgQEAKIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX1pFUk89bQogQ09ORklHX0RNX01VTFRJUEFUSD1tCi1DT05GSUdfRE1fTVVMVElQQVRIX0VNQz1tCi1DT05GSUdfRE1fTVVMVElQQVRIX1JEQUM9bQotQ09ORklHX0RNX01VTFRJUEFUSF9IUD1tCiAjIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfRE1fVUVWRU5UPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiBDT05GSUdfTUFDVkxBTj1tCkBAIC02MjcsNiArNjMxLDcgQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CkBAIC02NTcsNiArNjYyLDcgQEAKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCkBAIC02NjgsOCArNjc0LDEwIEBACiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTczNywxMCArNzQ1LDYgQEAKIENPTkZJR19MT0dPX0xJTlVYX01PTk89eQogQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQogQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPW0KQEAgLTc1Miw2ICs3NTYsNyBAQAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCkBAIC03ODYsNiArNzkxLDcgQEAKIENPTkZJR19PQ0ZTMl9GUz1tCiBDT05GSUdfT0NGUzJfRlNfTzJDQj1tCiBDT05GSUdfT0NGUzJfRlNfVVNFUlNQQUNFX0NMVVNURVI9bQorIyBDT05GSUdfT0NGUzJfRlNfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfREVCVUdfTUFTS0xPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CkBAIC04NDUsNiArODUxLDcgQEAKIENPTkZJR19DUkFNRlM9bQogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTUlOSVhfRlM9eQorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSFBGU19GUz1tCiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODU3LDE4ICs4NjQsMTcgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19TVU5SUENfQklORDM0PXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTg3Nyw3ICs4ODMsNiBAQAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogQ09ORklHX0NPREFfRlM9bQotIyBDT05GSUdfQ09EQV9GU19PTERfQVBJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTk0Miw2ICs5NDcsOCBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAwMSw2ICsxMDA4LDEwIEBACiBDT05GSUdfQ1JZUFRPX01END1tCiBDT05GSUdfQ1JZUFRPX01ENT15CiBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fUk1EMTI4PW0KK0NPTkZJR19DUllQVE9fUk1EMTYwPW0KK0NPTkZJR19DUllQVE9fUk1EMjU2PW0KK0NPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBMT1tCiBDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCkBAIC0xMDQyLDYgKzEwNTMsNyBAQAogIyBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUIGlzIG5vdCBzZXQKIENPTkZJR19DUkNfQ0NJVFQ9bQogQ09ORklHX0NSQzE2PW0KK0NPTkZJR19DUkNfVDEwRElGPXkKIENPTkZJR19DUkNfSVRVX1Q9bQogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKaW5kZXggM2E3ZjYyMi4uNTVkNWQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCkBAIC0xNCw1ICsxNCw0IEBACiAKIGRldnJlcy15ID0gLi4vLi4vLi4va2VybmVsL2lycS9kZXZyZXMubwogCi1vYmotJChDT05GSUdfUENJKQkrPSBiaW9zMzIubwogb2JqLXkkKENPTkZJR19NTVVfU1VOMykgKz0gZG1hLm8JIyBubywgaXQncyBub3QgYSB0eXBvCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9tNjhrL2tlcm5lbC9iaW9zMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxNzBjMmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9iaW9zMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKgotICogYmlvczMyLmMgLSBQQ0kgQklPUyBmdW5jdGlvbnMgZm9yIG02OGsgc3lzdGVtcy4KLSAqCi0gKiBXcml0dGVuIGJ5IFdvdXQgS2xhcmVuLgotICoKLSAqIEJhc2VkIG9uIHRoZSBERUMgQWxwaGEgYmlvczMyLmMgYnkgRGF2ZSBSdXNsaW5nIGFuZCBEYXZpZCBNb3NiZXJnZXIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2lmIDAKLSMgZGVmaW5lIERCR19ERVZTKGFyZ3MpCQlwcmludGsgYXJncwotI2Vsc2UKLSMgZGVmaW5lIERCR19ERVZTKGFyZ3MpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QQ0kKLQotLyoKLSAqIFBDSSBzdXBwb3J0IGZvciBMaW51eC9tNjhrLiBDdXJyZW50bHkgb25seSB0aGUgSGFkZXMgaXMgc3VwcG9ydGVkLgotICoKLSAqIFRoZSBzdXBwb3J0IGZvciBQQ0kgYnJpZGdlcyBpbiB0aGUgREVDIEFscGhhIHZlcnNpb24gaGFzCi0gKiBiZWVuIHJlbW92ZWQgaW4gdGhpcyB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wY2kuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jZGVmaW5lIEtCCQkxMDI0Ci0jZGVmaW5lIE1CCQkoMTAyNCpLQikKLSNkZWZpbmUgR0IJCSgxMDI0Kk1CKQotCi0jZGVmaW5lIE1BSk9SX1JFVgkwCi0jZGVmaW5lIE1JTk9SX1JFVgk1Ci0KLS8qCi0gKiBBbGlnbiBWQUwgdG8gQUxJR04sIHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKi8KLQotI2RlZmluZSBBTElHTih2YWwsYWxpZ24pCSgoKHZhbCkgKyAoKGFsaWduKSAtIDEpKSAmIH4oKGFsaWduKSAtIDEpKQotCi0vKgotICogT2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgSS9PIGFuZCBtZW1vcnkgYmFzZSBhZGRyZXNzZXMgZnJvbSB3aGVyZSByZXNvdXJjZXMKLSAqIGFyZSBhbGxvY2F0ZWQuCi0gKi8KLQotI2RlZmluZSBJT19BTExPQ19PRkZTRVQJCTB4MDAwMDQwMDAKLSNkZWZpbmUgTUVNX0FMTE9DX09GRlNFVAkweDA0MDAwMDAwCi0KLS8qCi0gKiBEZWNsYXJhdGlvbnMgb2YgaGFyZHdhcmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zLgotICovCi0KLWV4dGVybiBzdHJ1Y3QgcGNpX2J1c19pbmZvICppbml0X2hhZGVzX3BjaSh2b2lkKTsKLQotLyoKLSAqIEJ1cyBpbmZvIHN0cnVjdHVyZSBvZiB0aGUgUENJIGJ1cy4gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGlzCi0gKiBwdXQgaW4gdGhlIHN5c2RhdGEgbWVtYmVyIG9mIHRoZSBwY2lfYnVzIHN0cnVjdHVyZS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9idXNfaW5mbyAqYnVzX2luZm87Ci0KLXN0YXRpYyBpbnQgcGNpX21vZGlmeSA9IDE7CQkvKiBJZiBzZXQsIGxheW91dCB0aGUgUENJIGJ1cyBvdXJzZWxmLiAqLwotc3RhdGljIGludCBza2lwX3ZnYTsJCQkvKiBJZiBzZXQgZG8gbm90IG1vZGlmeSBiYXNlIGFkZHJlc3NlcwotCQkJCQkgICBvZiB2Z2EgY2FyZHMuKi8KLXN0YXRpYyBpbnQgZGlzYWJsZV9wY2lfYnVyc3Q7CQkvKiBJZiBzZXQgZG8gbm90IGFsbG93IFBDSSBidXJzdHMuICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW9fYmFzZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtX2Jhc2U7Ci0KLS8qCi0gKiBzdGF0aWMgdm9pZCBkaXNhYmxlX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQotICoKLSAqIERpc2FibGUgUENJIGRldmljZSBERVYgc28gdGhhdCBpdCBkb2VzIG5vdCByZXNwb25kIHRvIEkvTyBvciBtZW1vcnkKLSAqIGFjY2Vzc2VzLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICogZGV2CS0gZGV2aWNlIHRvIGRpc2FibGUuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IGRpc2FibGVfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgc2hvcnQgY21kOwotCi0JaWYgKCgoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EpIHx8Ci0JICAgICAoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgfHwKLQkgICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfWEdBKSkgJiYgc2tpcF92Z2EpCi0JCXJldHVybjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCi0JY21kICY9ICh+UENJX0NPTU1BTkRfSU8gJiB+UENJX0NPTU1BTkRfTUVNT1JZICYgflBDSV9DT01NQU5EX01BU1RFUik7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci19Ci0KLS8qCi0gKiBzdGF0aWMgdm9pZCBsYXlvdXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi0gKgotICogTGF5b3V0IG1lbW9yeSBhbmQgSS9PIGZvciBhIGRldmljZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICoKLSAqIGRldmljZQktIGRldmljZSB0byBsYXlvdXQgbWVtb3J5IGFuZCBJL08gZm9yLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBsYXlvdXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgc2hvcnQgY21kOwotCXVuc2lnbmVkIGludCBiYXNlLCBtYXNrLCBzaXplLCByZWc7Ci0JdW5zaWduZWQgaW50IGFsaWdudG87Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFNraXAgdmlkZW8gY2FyZHMgaWYgcmVxdWVzdGVkLgotCSAqLwotCi0JaWYgKCgoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EpIHx8Ci0JICAgICAoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgfHwKLQkgICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfWEdBKSkgJiYgc2tpcF92Z2EpCi0JCXJldHVybjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCi0JZm9yIChyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAsIGkgPSAwOyByZWcgPD0gUENJX0JBU0VfQUREUkVTU181OyByZWcgKz0gNCwgaSsrKQotCXsKLQkJLyoKLQkJICogRmlndXJlIG91dCBob3cgbXVjaCBzcGFjZSBhbmQgb2Ygd2hhdCB0eXBlIHRoaXMKLQkJICogZGV2aWNlIHdhbnRzLgotCQkgKi8KLQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAweGZmZmZmZmZmKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAmYmFzZSk7Ci0KLQkJaWYgKCFiYXNlKQotCQl7Ci0JCQkvKiB0aGlzIGJhc2UtYWRkcmVzcyByZWdpc3RlciBpcyB1bnVzZWQgKi8KLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIFdlJ3ZlIHJlYWQgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciBiYWNrIGFmdGVyCi0JCSAqIHdyaXRpbmcgYWxsIG9uZXMgYW5kIHNvIG5vdyB3ZSBtdXN0IGRlY29kZSBpdC4KLQkJICovCi0KLQkJaWYgKGJhc2UgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKQotCQl7Ci0JCQkvKgotCQkJICogSS9PIHNwYWNlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4KLQkJCSAqLwotCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0KLQkJCWJhc2UgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwotCQkJbWFzayA9ICh+YmFzZSA8PCAxKSB8IDB4MTsKLQkJCXNpemUgPSAobWFzayAmIGJhc2UpICYgMHhmZmZmZmZmZjsKLQotCQkJLyoKLQkJCSAqIEFsaWduIHRvIG11bHRpcGxlIG9mIHNpemUgb2YgbWluaW11bSBiYXNlLgotCQkJICovCi0KLQkJCWFsaWdudG8gPSBtYXhfdCh1bnNpZ25lZCBpbnQsIDB4MDQwLCBzaXplKTsKLQkJCWJhc2UgPSBBTElHTihpb19iYXNlLCBhbGlnbnRvKTsKLQkJCWlvX2Jhc2UgPSBiYXNlICsgc2l6ZTsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcsIGJhc2UgfCBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKTsKLQotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IGJhc2U7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyBzaXplIC0gMTsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPIHwgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTzsKLQotCQkJREJHX0RFVlMoKCJsYXlvdXRfZGV2OiBJTyBhZGRyZXNzOiAlbFhcbiIsIGJhc2UpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXVuc2lnbmVkIGludCB0eXBlOwotCi0JCQkvKgotCQkJICogTWVtb3J5IHNwYWNlIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4KLQkJCSAqLwotCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwotCQkJdHlwZSA9IGJhc2UgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0s7Ci0JCQliYXNlICY9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7Ci0JCQltYXNrID0gKH5iYXNlIDw8IDEpIHwgMHgxOwotCQkJc2l6ZSA9IChtYXNrICYgYmFzZSkgJiAweGZmZmZmZmZmOwotCQkJc3dpdGNoICh0eXBlKQotCQkJewotCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyOgotCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OgotCQkJCWJyZWFrOwotCi0JCQljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU06Ci0JCQkJcHJpbnRrKCJiaW9zMzIgV0FSTklORzogc2xvdCAlZCwgZnVuY3Rpb24gJWQgIgotCQkJCSAgICAgICAicmVxdWVzdHMgbWVtb3J5IGJlbG93IDFNQi0tLWRvbid0ICIKLQkJCQkgICAgICAgImtub3cgaG93IHRvIGRvIHRoYXQuXG4iLAotCQkJCSAgICAgICBQQ0lfU0xPVChkZXYtPmRldmZuKSwKLQkJCQkgICAgICAgUENJX0ZVTkMoZGV2LT5kZXZmbikpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogQWxpZ24gdG8gbXVsdGlwbGUgb2Ygc2l6ZSBvZiBtaW5pbXVtIGJhc2UuCi0JCQkgKi8KLQotCQkJYWxpZ250byA9IG1heF90KHVuc2lnbmVkIGludCwgMHgxMDAwLCBzaXplKTsKLQkJCWJhc2UgPSBBTElHTihtZW1fYmFzZSwgYWxpZ250byk7Ci0JCQltZW1fYmFzZSA9IGJhc2UgKyBzaXplOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgYmFzZSk7Ci0KLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSBiYXNlOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgc2l6ZSAtIDE7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0KLQkJCWlmICh0eXBlID09IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiA2NC1iaXQgYWRkcmVzcywgc2V0IHRoZSBoaWdoZXN0IDMyIGJpdHMKLQkJCQkgKiB0byB6ZXJvLgotCQkJCSAqLwotCi0JCQkJcmVnICs9IDQ7Ci0JCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgMCk7Ci0KLQkJCQlpKys7Ci0JCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgZGV2aWNlOgotCSAqLwotCi0JaWYgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfTk9UX0RFRklORUQgfHwKLQkgICAgZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19OT1RfREVGSU5FRF9WR0EgfHwKLQkgICAgZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSB8fAotCSAgICBkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0RJU1BMQVlfWEdBKQotCXsKLQkJLyoKLQkJICogQWxsIG9mIHRoZXNlIChtYXkpIGhhdmUgSS9PIHNjYXR0ZXJlZCBhbGwgYXJvdW5kCi0JCSAqIGFuZCBtYXkgbm90IHVzZSBpL28tYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyBhdCBhbGwuCi0JCSAqIFNvIHdlIGp1c3QgaGF2ZSB0byBhbHdheXMgZW5hYmxlIEkvTyB0byB0aGVzZQotCQkgKiBkZXZpY2VzLgotCQkgKi8KLQkJY21kIHw9IFBDSV9DT01NQU5EX0lPOwotCX0KLQotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQgfCBQQ0lfQ09NTUFORF9NQVNURVIpOwotCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIChkaXNhYmxlX3BjaV9idXJzdCkgPyAwIDogMzIpOwotCi0JaWYgKGJ1c19pbmZvICE9IE5VTEwpCi0JCWJ1c19pbmZvLT5jb25mX2RldmljZShkZXYpOwkvKiBNYWNoaW5lIGRlcGVuZGVudCBjb25maWd1cmF0aW9uLiAqLwotCi0JREJHX0RFVlMoKCJsYXlvdXRfZGV2OiBidXMgJWQgIHNsb3QgMHgleCAgVklEIDB4JXggIERJRCAweCV4ICBjbGFzcyAweCV4XG4iLAotCQkgIGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIGRldi0+Y2xhc3MpKTsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIGxheW91dF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLSAqCi0gKiBMYXlvdXQgbWVtb3J5IGFuZCBJL08gZm9yIGFsbCBkZXZpY2VzIG9uIHRoZSBnaXZlbiBidXMuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKiBidXMJLSBidXMuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IGxheW91dF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBpbnQgYmlvLCBibWVtOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlEQkdfREVWUygoImxheW91dF9idXM6IHN0YXJ0aW5nIGJ1cyAlZFxuIiwgYnVzLT5udW1iZXIpKTsKLQotCWlmICghYnVzLT5kZXZpY2VzICYmICFidXMtPmNoaWxkcmVuKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIEFsaWduIHRoZSBjdXJyZW50IGJhc2VzIG9uIGFwcHJvcHJpYXRlIGJvdW5kYXJpZXMgKDRLIGZvcgotCSAqIElPIGFuZCAxTUIgZm9yIG1lbW9yeSkuCi0JICovCi0KLQliaW8gPSBpb19iYXNlID0gQUxJR04oaW9fYmFzZSwgNCpLQik7Ci0JYm1lbSA9IG1lbV9iYXNlID0gQUxJR04obWVtX2Jhc2UsIDEqTUIpOwotCi0JLyoKLQkgKiBQQ0kgZGV2aWNlcyBtaWdodCBoYXZlIGJlZW4gc2V0dXAgYnkgYSBQQ0kgQklPUyBlbXVsYXRpb24KLQkgKiBydW5uaW5nIHVuZGVyIFRPUy4gSW4gdGhlc2UgY2FzZXMgdGhlcmUgaXMgYQotCSAqIHdpbmRvdyBkdXJpbmcgd2hpY2ggdHdvIGRldmljZXMgbWF5IGhhdmUgYW4gb3ZlcmxhcHBpbmcKLQkgKiBhZGRyZXNzIHJhbmdlLiBUbyBhdm9pZCB0aGlzIGNhdXNpbmcgdHJvdWJsZSwgd2UgZmlyc3QKLQkgKiB0dXJuIG9mZiB0aGUgSS9PIGFuZCBtZW1vcnkgYWRkcmVzcyBkZWNvZGVycyBmb3IgYWxsIFBDSQotCSAqIGRldmljZXMuICBUaGV5J2xsIGJlIHJlLWVuYWJsZWQgb25seSBvbmNlIGFsbCBhZGRyZXNzCi0JICogZGVjb2RlcnMgYXJlIHByb2dyYW1tZWQgY29uc2lzdGVudGx5LgotCSAqLwotCi0JREJHX0RFVlMoKCJsYXlvdXRfYnVzOiBkaXNhYmxlX2RldiBmb3IgYnVzICVkXG4iLCBidXMtPm51bWJlcikpOwotCi0JZm9yIChkZXYgPSBidXMtPmRldmljZXM7IGRldjsgZGV2ID0gZGV2LT5zaWJsaW5nKQotCXsKLQkJaWYgKChkZXYtPmNsYXNzID4+IDE2ICE9IFBDSV9CQVNFX0NMQVNTX0JSSURHRSkgfHwKLQkJICAgIChkZXYtPmNsYXNzID4+IDggPT0gUENJX0NMQVNTX0JSSURHRV9QQ01DSUEpKQotCQkJZGlzYWJsZV9kZXYoZGV2KTsKLQl9Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHNwYWNlIHRvIGVhY2ggZGV2aWNlOgotCSAqLwotCi0JREJHX0RFVlMoKCJsYXlvdXRfYnVzOiBzdGFydGluZyBidXMgJWQgZGV2aWNlc1xuIiwgYnVzLT5udW1iZXIpKTsKLQotCWZvciAoZGV2ID0gYnVzLT5kZXZpY2VzOyBkZXY7IGRldiA9IGRldi0+c2libGluZykKLQl7Ci0JCWlmICgoZGV2LT5jbGFzcyA+PiAxNiAhPSBQQ0lfQkFTRV9DTEFTU19CUklER0UpIHx8Ci0JCSAgICAoZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19CUklER0VfUENNQ0lBKSkKLQkJCWxheW91dF9kZXYoZGV2KTsKLQl9Ci0KLQlEQkdfREVWUygoImxheW91dF9idXM6IGJ1cyAlZCBmaW5pc2hlZFxuIiwgYnVzLT5udW1iZXIpKTsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXAodm9pZCkKLSAqCi0gKiBMYXlvdXQgbWVtb3J5IGFuZCBJL08gb2YgYWxsIGRldmljZXMgb24gdGhlIFBDSSBidXMgaWYgJ3BjaV9tb2RpZnknIGlzCi0gKiB0cnVlLiBUaGlzIG1pZ2h0IGJlIG5lY2Vzc2FyeSBiZWNhdXNlIG5vdCBldmVyeSBtNjhrIG1hY2hpbmUgd2l0aCBhIFBDSQotICogYnVzIGhhcyBhIFBDSSBCSU9TLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIKLSAqIHBjaV9zY2FuX2J1cygpIGluIHBjaWJpb3NfaW5pdCgpLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0JaWYgKHBjaV9tb2RpZnkpCi0JewotCQkvKgotCQkgKiBTZXQgYmFzZSBhZGRyZXNzZXMgZm9yIGFsbG9jYXRpb24gb2YgSS9PIGFuZCBtZW1vcnkgc3BhY2UuCi0JCSAqLwotCi0JCWlvX2Jhc2UgPSBidXNfaW5mby0+aW9fc3BhY2Uuc3RhcnQgKyBJT19BTExPQ19PRkZTRVQ7Ci0JCW1lbV9iYXNlID0gYnVzX2luZm8tPm1lbV9zcGFjZS5zdGFydCArIE1FTV9BTExPQ19PRkZTRVQ7Ci0KLQkJLyoKLQkJICogU2NhbiB0aGUgdHJlZSwgYWxsb2NhdGluZyBQQ0kgbWVtb3J5IGFuZCBJL08gc3BhY2UuCi0JCSAqLwotCi0JCWxheW91dF9idXMocGNpX2J1c19iKHBjaV9yb290Lm5leHQpKTsKLQl9Ci0KLQkvKgotCSAqIEZpeCBpbnRlcnJ1cHQgYXNzaWdubWVudHMsIGV0Yy4KLQkgKi8KLQotCWJ1c19pbmZvLT5maXh1cChwY2lfbW9kaWZ5KTsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIHBjaWJpb3NfY2xhaW1fcmVzb3VyY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCi0gKgotICogQ2xhaW0gYWxsIHJlc291cmNlcyB0aGF0IGFyZSBhc3NpZ25lZCB0byBkZXZpY2VzIG9uIHRoZSBnaXZlbiBidXMuCi0gKgotICogUGFyYW1ldGVyczoKLSAqCi0gKiBidXMJLSBidXMuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfY2xhaW1fcmVzb3VyY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQlpbnQgaTsKLQotCXdoaWxlIChidXMpCi0JewotCQlmb3IgKGRldiA9IGJ1cy0+ZGV2aWNlczsgKGRldiAhPSBOVUxMKTsgZGV2ID0gZGV2LT5zaWJsaW5nKQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykKLQkJCXsKLQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKnByOwotCQkJCXN0cnVjdCBwY2lfYnVzX2luZm8gKmJ1c19pbmZvID0gKHN0cnVjdCBwY2lfYnVzX2luZm8gKikgZGV2LT5zeXNkYXRhOwotCi0JCQkJaWYgKChyLT5zdGFydCA9PSAwKSB8fCAoci0+cGFyZW50ICE9IE5VTEwpKQotCQkJCQljb250aW51ZTsKLSNpZiAxCi0JCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCQkJcHIgPSAmYnVzX2luZm8tPmlvX3NwYWNlOwotCQkJCWVsc2UKLQkJCQkJcHIgPSAmYnVzX2luZm8tPm1lbV9zcGFjZTsKLSNlbHNlCi0JCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCQkJcHIgPSAmaW9wb3J0X3Jlc291cmNlOwotCQkJCWVsc2UKLQkJCQkJcHIgPSAmaW9tZW1fcmVzb3VyY2U7Ci0jZW5kaWYKLQkJCQlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uIG9uIHJlZ2lvbiAlZCBvZiBkZXZpY2UgJXNcbiIsIGksIGRldi0+bmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1cy0+Y2hpbGRyZW4pCi0JCQlwY2liaW9zX2NsYWltX3Jlc291cmNlcyhidXMtPmNoaWxkcmVuKTsKLQotCQlidXMgPSBidXMtPm5leHQ7Ci0JfQotfQotCi0vKgotICogaW50IHBjaWJpb3NfYXNzaWduX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpKQotICoKLSAqIEFzc2lnbiBhIG5ldyBhZGRyZXNzIHRvIGEgUENJIHJlc291cmNlLgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKgotICogZGV2CS0gZGV2aWNlLgotICogaQktIHJlc291cmNlLgotICoKLSAqIFJlc3VsdDogMCBpZiBzdWNjZXNzZnVsLgotICovCi0KLWludCBfX2luaXQgcGNpYmlvc19hc3NpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGkpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0Jc3RydWN0IHJlc291cmNlICpwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHItPmVuZCArIDE7Ci0KLQlpZiAoIXByKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JewotCQlpZiAoc2l6ZSA+IDB4MTAwKQotCQkJcmV0dXJuIC1FRkJJRzsKLQotCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2UocHIsIHIsIHNpemUsIGJ1c19pbmZvLT5pb19zcGFjZS5zdGFydCArCi0JCQkJICAgICAgSU9fQUxMT0NfT0ZGU0VULCAgYnVzX2luZm8tPmlvX3NwYWNlLmVuZCwgMTAyNCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KLQllbHNlCi0JewotCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2UocHIsIHIsIHNpemUsIGJ1c19pbmZvLT5tZW1fc3BhY2Uuc3RhcnQgKwotCQkJCSAgICAgIE1FTV9BTExPQ19PRkZTRVQsIGJ1c19pbmZvLT5tZW1fc3BhY2UuZW5kLCBzaXplKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKGkgPCA2KQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgNCAqIGksIHItPnN0YXJ0KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jdm9pZCAqc3lzZGF0YTsKLQotCXN5c2RhdGEgPSAoYnVzLT5wYXJlbnQpID8gYnVzLT5wYXJlbnQtPnN5c2RhdGEgOiBidXMtPnN5c2RhdGE7Ci0KLQlmb3IgKGRldiA9IGJ1cy0+ZGV2aWNlczsgKGRldiAhPSBOVUxMKTsgZGV2ID0gZGV2LT5zaWJsaW5nKQotCQlkZXYtPnN5c2RhdGEgPSBzeXNkYXRhOwotfQotCi12b2lkIF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKLXsKLQlwcmludGsoIkxpbnV4L202OGsgUENJIEJJT1MzMiByZXZpc2lvbiAleC4lMDJ4XG4iLCBNQUpPUl9SRVYsIE1JTk9SX1JFVik7Ci0KLQlidXNfaW5mbyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX0hBREVTCi0JaWYgKE1BQ0hfSVNfSEFERVMpCi0JCWJ1c19pbmZvID0gaW5pdF9oYWRlc19wY2koKTsKLSNlbmRpZgotCWlmIChidXNfaW5mbyAhPSBOVUxMKQotCXsKLQkJcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKLQkJcGNpX3NjYW5fYnVzKDAsIGJ1c19pbmZvLT5tNjhrX3BjaV9vcHMsIGJ1c19pbmZvKTsKLQkJcGNpYmlvc19maXh1cCgpOwotCQlwY2liaW9zX2NsYWltX3Jlc291cmNlcyhwY2lfcm9vdCk7Ci0JfQotCWVsc2UKLQkJcHJpbnRrKCJQQ0k6IE5vIFBDSSBidXMgZGV0ZWN0ZWRcbiIpOwotfQotCi1jaGFyICogX19pbml0IHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQotewotCWlmICghc3RyY21wKHN0ciwgIm5vbW9kaWZ5IikpCi0JewotCQlwY2lfbW9kaWZ5ID0gMDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAic2tpcHZnYSIpKQotCXsKLQkJc2tpcF92Z2EgPSAxOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub2J1cnN0IikpCi0JewotCQlkaXNhYmxlX3BjaV9idXJzdCA9IDE7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBzdHI7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9kbWEuYyBiL2FyY2gvbTY4ay9rZXJuZWwvZG1hLmMKaW5kZXggNmY4YzA4MC4uMmJiNDI0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9kbWEuYworKysgYi9hcmNoL202OGsva2VybmVsL2RtYS5jCkBAIC02Niw4ICs2Niw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKIAotaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3ZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwKKwkJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCXN3aXRjaCAoZGlyKSB7CiAJY2FzZSBETUFfVE9fREVWSUNFOgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwppbmRleCBkZWQ3ZGQyLi43ZThhMGQzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2ludHMuYworKysgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwpAQCAtNDI5LDggKzQyOSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpCiB7CiAJLyogSW5zZXJ0IC9wcm9jL2lycSBkcml2ZXIgaGVyZSAqLwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzg4OGNkZi4uMzA0MmMyYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTc4LDcgKzc4LDcgQEAKIHN0YXRpYyB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewogCWlmICghbmVlZF9yZXNjaGVkKCkpCi0jaWYgZGVmaW5lZChNQUNIX0FUQVJJX09OTFkpICYmICFkZWZpbmVkKENPTkZJR19IQURFUykKKyNpZiBkZWZpbmVkKE1BQ0hfQVRBUklfT05MWSkKIAkJLyogYmxvY2sgb3V0IEhTWU5DIG9uIHRoZSBhdGFyaSAoZmFsY29uKSAqLwogCQlfX2FzbV9fKCJzdG9wICMweDIyMDAiIDogOiA6ICJjYyIpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCA3NWI4MzQwLi42ZDgxM2RlIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC04ODMsOCArODgzLDcgQEAKIAkJCWlmIChpICUgNSA9PSAwKQogCQkJCXByaW50aygiXG4gICAgICAgIik7CiAjZW5kaWYKLQkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOwotCQkJcHJpbnRfc3ltYm9sKCIgJXNcbiIsIGFkZHIpOworCQkJcHJpbnRrKCIgWzwlMDhseD5dICVwU1xuIiwgYWRkciwgKHZvaWQgKilhZGRyKTsKIAkJCWkrKzsKIAkJfQogCX0KQEAgLTkwMCwxMCArODk5LDggQEAKIAlpbnQgaTsKIAogCXByaW50X21vZHVsZXMoKTsKLQlwcmludGsoIlBDOiBbPCUwOGx4Pl0iLHJlZ3MtPnBjKTsKLQlwcmludF9zeW1ib2woIiAlcyIsIHJlZ3MtPnBjKTsKLQlwcmludGsoIlxuU1I6ICUwNHggIFNQOiAlcCAgYTI6ICUwOGx4XG4iLAotCSAgICAgICByZWdzLT5zciwgcmVncywgcmVncy0+YTIpOworCXByaW50aygiUEM6IFs8JTA4bHg+XSAlcFNcbiIsIHJlZ3MtPnBjLCAodm9pZCAqKXJlZ3MtPnBjKTsKKwlwcmludGsoIlNSOiAlMDR4ICBTUDogJXAgIGEyOiAlMDhseFxuIiwgcmVncy0+c3IsIHJlZ3MsIHJlZ3MtPmEyKTsKIAlwcmludGsoImQwOiAlMDhseCAgICBkMTogJTA4bHggICAgZDI6ICUwOGx4ICAgIGQzOiAlMDhseFxuIiwKIAkgICAgICAgcmVncy0+ZDAsIHJlZ3MtPmQxLCByZWdzLT5kMiwgcmVncy0+ZDMpOwogCXByaW50aygiZDQ6ICUwOGx4ICAgIGQ1OiAlMDhseCAgICBhMDogJTA4bHggICAgYTE6ICUwOGx4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwppbmRleCA5OWIwNzg0Li5mODQ2ZDRlIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwpAQCAtMzQsMTAgKzM0LDEwIEBACiAJQ09OU1RSVUNUT1JTCiAJfQogCi0gIC5ic3MgOiB7ICooLmJzcykgfQkJLyogQlNTICovCi0KICAgLiA9IEFMSUdOKDE2KTsKLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7ICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpIH0gOmRhdGEKKyAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7ICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpIH0KKworICAuYnNzIDogeyAqKC5ic3MpIH0JCS8qIEJTUyAqLwogCiAgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwogCkBAIC00OCw3ICs0OCw3IEBACiAJX3Npbml0dGV4dCA9IC47CiAJSU5JVF9URVhUCiAJX2Vpbml0dGV4dCA9IC47Ci0gIH0KKyAgfSA6ZGF0YQogICAuaW5pdC5kYXRhIDogeyBJTklUX0RBVEEgfQogICAuID0gQUxJR04oMTYpOwogICBfX3NldHVwX3N0YXJ0ID0gLjsKQEAgLTc0LDYgKzc0LDcgQEAKICAgLmluaXQucmFtZnMgOiB7ICooLmluaXQucmFtZnMpIH0KICAgX19pbml0cmFtZnNfZW5kID0gLjsKICNlbmRpZgorICBOT1RFUwogICAuID0gQUxJR04oODE5Mik7CiAgIF9faW5pdF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0va21hcC5jIGIvYXJjaC9tNjhrL21tL2ttYXAuYwppbmRleCA0NmI3ZDYwLi5kZjYyMGFjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0va21hcC5jCisrKyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKQEAgLTY2LDggKzY2LDEwIEBACiAJZm9yIChwID0gJmlvbGlzdDsgKHRtcCA9ICpwKSA7IHAgPSAmdG1wLT5uZXh0KSB7CiAJCWlmIChzaXplICsgYWRkciA8ICh1bnNpZ25lZCBsb25nKXRtcC0+YWRkcikKIAkJCWJyZWFrOwotCQlpZiAoYWRkciA+IEtNQVBfRU5ELXNpemUpCisJCWlmIChhZGRyID4gS01BUF9FTkQtc2l6ZSkgeworCQkJa2ZyZWUoYXJlYSk7CiAJCQlyZXR1cm4gTlVMTDsKKwkJfQogCQlhZGRyID0gdG1wLT5zaXplICsgKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyOwogCX0KIAlhcmVhLT5hZGRyID0gKHZvaWQgKilhZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvcnRjLmMgYi9hcmNoL202OGsvbXZtZTE2eC9ydGMuYwppbmRleCA0MzJhOWYxLi5jZWE1ZTNlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC9ydGMuYworKysgYi9hcmNoL202OGsvbXZtZTE2eC9ydGMuYwpAQCAtNTIsMTUgKzUyLDE1IEBACiAJCS8qIEVuc3VyZSBjbG9jayBhbmQgcmVhbC10aW1lLW1vZGUtcmVnaXN0ZXIgYXJlIGFjY2Vzc2libGUgKi8KIAkJcnRjLT5jdHJsID0gUlRDX1JFQUQ7CiAJCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKLQkJd3RpbWUudG1fc2VjID0gIEJDRDJCSU4ocnRjLT5iY2Rfc2VjKTsKLQkJd3RpbWUudG1fbWluID0gIEJDRDJCSU4ocnRjLT5iY2RfbWluKTsKLQkJd3RpbWUudG1faG91ciA9IEJDRDJCSU4ocnRjLT5iY2RfaHIpOwotCQl3dGltZS50bV9tZGF5ID0gIEJDRDJCSU4ocnRjLT5iY2RfZG9tKTsKLQkJd3RpbWUudG1fbW9uID0gIEJDRDJCSU4ocnRjLT5iY2RfbXRoKS0xOwotCQl3dGltZS50bV95ZWFyID0gQkNEMkJJTihydGMtPmJjZF95ZWFyKTsKKwkJd3RpbWUudG1fc2VjID0gIGJjZDJiaW4ocnRjLT5iY2Rfc2VjKTsKKwkJd3RpbWUudG1fbWluID0gIGJjZDJiaW4ocnRjLT5iY2RfbWluKTsKKwkJd3RpbWUudG1faG91ciA9IGJjZDJiaW4ocnRjLT5iY2RfaHIpOworCQl3dGltZS50bV9tZGF5ID0gIGJjZDJiaW4ocnRjLT5iY2RfZG9tKTsKKwkJd3RpbWUudG1fbW9uID0gIGJjZDJiaW4ocnRjLT5iY2RfbXRoKS0xOworCQl3dGltZS50bV95ZWFyID0gYmNkMmJpbihydGMtPmJjZF95ZWFyKTsKIAkJaWYgKHd0aW1lLnRtX3llYXIgPCA3MCkKIAkJCXd0aW1lLnRtX3llYXIgKz0gMTAwOwotCQl3dGltZS50bV93ZGF5ID0gQkNEMkJJTihydGMtPmJjZF9kb3cpLTE7CisJCXd0aW1lLnRtX3dkYXkgPSBiY2QyYmluKHJ0Yy0+YmNkX2RvdyktMTsKIAkJcnRjLT5jdHJsID0gMDsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZ3dGltZSwgc2l6ZW9mIHd0aW1lKSA/CkBAIC0xMDQsMTIgKzEwNCwxMiBAQAogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXJ0Yy0+Y3RybCAgICAgPSBSVENfV1JJVEU7CiAKLQkJcnRjLT5iY2Rfc2VjICA9IEJJTjJCQ0Qoc2VjKTsKLQkJcnRjLT5iY2RfbWluICA9IEJJTjJCQ0QobWluKTsKLQkJcnRjLT5iY2RfaHIgICA9IEJJTjJCQ0QoaHJzKTsKLQkJcnRjLT5iY2RfZG9tICA9IEJJTjJCQ0QoZGF5KTsKLQkJcnRjLT5iY2RfbXRoICA9IEJJTjJCQ0QobW9uKTsKLQkJcnRjLT5iY2RfeWVhciA9IEJJTjJCQ0QoeXJzJTEwMCk7CisJCXJ0Yy0+YmNkX3NlYyAgPSBiaW4yYmNkKHNlYyk7CisJCXJ0Yy0+YmNkX21pbiAgPSBiaW4yYmNkKG1pbik7CisJCXJ0Yy0+YmNkX2hyICAgPSBiaW4yYmNkKGhycyk7CisJCXJ0Yy0+YmNkX2RvbSAgPSBiaW4yYmNkKGRheSk7CisJCXJ0Yy0+YmNkX210aCAgPSBiaW4yYmNkKG1vbik7CisJCXJ0Yy0+YmNkX3llYXIgPSBiaW4yYmNkKHlycyUxMDApOwogCiAJCXJ0Yy0+Y3RybCAgICAgPSAwOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwppbmRleCBiZTlkZTJmLi45YzdlZWZhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgpAQCAtMjE2LDE3ICsyMTcsNiBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBiY2QyYmluKHVuc2lnbmVkIGNoYXIgYikKLXsKLQlyZXR1cm4gKGIgPj4gNCkgKiAxMCArIChiICYgMTUpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgYmluMmJjZCh1bnNpZ25lZCBjaGFyIGIpCi17Ci0JcmV0dXJuIChiIC8gMTApICogMTYgKyAoYiAlIDEwKTsKLX0KLQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBxNDBfZ2V0dGltZW9mZnNldCh2b2lkKQogewogCXJldHVybiA1MDAwICogKHFsX3RpY2tzICE9IDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3N1bjN4L3RpbWUuYyBiL2FyY2gvbTY4ay9zdW4zeC90aW1lLmMKaW5kZXggZjVlYWFmYi4uNTM2YTA0YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjN4L3RpbWUuYworKysgYi9hcmNoL202OGsvc3VuM3gvdGltZS5jCkBAIC00NywyMyArNDcsMjMgQEAKIAogCWlmKHNldCkgewogCQloLT5jc3IgfD0gQ19XUklURTsKLQkJaC0+c2VjID0gQklOMkJDRCh0LT50bV9zZWMpOwotCQloLT5taW4gPSBCSU4yQkNEKHQtPnRtX21pbik7Ci0JCWgtPmhvdXIgPSBCSU4yQkNEKHQtPnRtX2hvdXIpOwotCQloLT53ZGF5ID0gQklOMkJDRCh0LT50bV93ZGF5KTsKLQkJaC0+bWRheSA9IEJJTjJCQ0QodC0+dG1fbWRheSk7Ci0JCWgtPm1vbnRoID0gQklOMkJDRCh0LT50bV9tb24pOwotCQloLT55ZWFyID0gQklOMkJDRCh0LT50bV95ZWFyKTsKKwkJaC0+c2VjID0gYmluMmJjZCh0LT50bV9zZWMpOworCQloLT5taW4gPSBiaW4yYmNkKHQtPnRtX21pbik7CisJCWgtPmhvdXIgPSBiaW4yYmNkKHQtPnRtX2hvdXIpOworCQloLT53ZGF5ID0gYmluMmJjZCh0LT50bV93ZGF5KTsKKwkJaC0+bWRheSA9IGJpbjJiY2QodC0+dG1fbWRheSk7CisJCWgtPm1vbnRoID0gYmluMmJjZCh0LT50bV9tb24pOworCQloLT55ZWFyID0gYmluMmJjZCh0LT50bV95ZWFyKTsKIAkJaC0+Y3NyICY9IH5DX1dSSVRFOwogCX0gZWxzZSB7CiAJCWgtPmNzciB8PSBDX1JFQUQ7Ci0JCXQtPnRtX3NlYyA9IEJDRDJCSU4oaC0+c2VjKTsKLQkJdC0+dG1fbWluID0gQkNEMkJJTihoLT5taW4pOwotCQl0LT50bV9ob3VyID0gQkNEMkJJTihoLT5ob3VyKTsKLQkJdC0+dG1fd2RheSA9IEJDRDJCSU4oaC0+d2RheSk7Ci0JCXQtPnRtX21kYXkgPSBCQ0QyQklOKGgtPm1kYXkpOwotCQl0LT50bV9tb24gPSBCQ0QyQklOKGgtPm1vbnRoKTsKLQkJdC0+dG1feWVhciA9IEJDRDJCSU4oaC0+eWVhcik7CisJCXQtPnRtX3NlYyA9IGJjZDJiaW4oaC0+c2VjKTsKKwkJdC0+dG1fbWluID0gYmNkMmJpbihoLT5taW4pOworCQl0LT50bV9ob3VyID0gYmNkMmJpbihoLT5ob3VyKTsKKwkJdC0+dG1fd2RheSA9IGJjZDJiaW4oaC0+d2RheSk7CisJCXQtPnRtX21kYXkgPSBiY2QyYmluKGgtPm1kYXkpOworCQl0LT50bV9tb24gPSBiY2QyYmluKGgtPm1vbnRoKTsKKwkJdC0+dG1feWVhciA9IGJjZDJiaW4oaC0+eWVhcik7CiAJCWgtPmNzciAmPSB+Q19SRUFEOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKaW5kZXggMmU3NTE1ZS4uMGE4OTk4MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZworKysgYi9hcmNoL202OGtub21tdS9LY29uZmlnCkBAIC03Myw5ICs3Myw2IEBACiBjb25maWcgTk9fSU9QT1JUCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgQVJDSF9TVVBQT1JUU19BT1VUCi0JZGVmX2Jvb2wgeQotCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYS5vdXQuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2Eub3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMThlZjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tbTY4ay9hLm91dC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAyN2YwZWM3Li5iODA0NjgzIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMTA1LDYgKzEwNSw2IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwppbmRleCA0NzUwMmQ1Li4zZjJkNzc0IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggNDZmOGY5ZC4uNWQ1ZDU2YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCA0ZGE3MzZlLi5iOTA1NzQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNTIsNiArNTIsNyBAQAogCXNlbGVjdCBTU0IKIAlzZWxlY3QgU1NCX0RSSVZFUl9NSVBTCiAJc2VsZWN0IFNTQl9EUklWRVJfRVhUSUYKKwlzZWxlY3QgU1NCX0VNQkVEREVECiAJc2VsZWN0IFNTQl9QQ0lDT1JFX0hPU1RNT0RFIGlmIFBDSQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKQEAgLTIxMSw2ICsyMTIsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisJc2VsZWN0IFNZU19TVVBQT1JUU19NSVBTX0NNUCBpZiBCUk9LRU4JIyBiZWNhdXNlIFNZTkNfUjRLIGlzIGJyb2tlbgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNQVJUTUlQUwogCWhlbHAKQEAgLTU2Nyw3ICs1NjksNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IEJPT1RfUkFXCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIE1pa3JvdGlrKHRtKSBSb3V0ZXJCb2FyZCA1MzIgc2VyaWVzLAogCSAgYmFzZWQgb24gdGhlIElEVCBSQzMyNDM0IFNvQy4KQEAgLTU5Nyw3ICs1OTksNyBAQAogCiBlbmRjaG9pY2UKIAotc291cmNlICJhcmNoL21pcHMvYXUxMDAwL0tjb25maWciCitzb3VyY2UgImFyY2gvbWlwcy9hbGNoZW15L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9qYXp6L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9sYXNhdC9LY29uZmlnIgpAQCAtNjA5LDExICs2MTEsNiBAQAogCiBlbmRtZW51CiAKLWNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBSwotCWJvb2wKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIFNNUCAmJiBQUkVFTVBUCi0KIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMTI3Miw2ICsxMjY5LDEzIEBACiBjb25maWcgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCWJvb2wKIAorIworIyBTZXQgdG8geSBmb3IgcHRyYWNlIGFjY2VzcyB0byB3YXRjaCByZWdpc3RlcnMuCisjCitjb25maWcgSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKyAgICAgICBib29sCisgICAgICAgZGVmYXVsdCB5IGlmIENQVV9NSVBTMzIgfHwgQ1BVX01JUFM2NAorCiBtZW51ICJLZXJuZWwgdHlwZSIKIAogY2hvaWNlCkBAIC0xNDAzLDcgKzE0MDcsNiBAQAogCWRlcGVuZHMgb24gQ1BVX01JUFMzMl9SMgogCSNkZXBlbmRzIG9uIENQVV9NSVBTNjRfUjIJCSMgb25jZSB0aGVyZSBpcyBoYXJkd2FyZSAuLi4KIAlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NVUxUSVRIUkVBRElORwotCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAogCXNlbGVjdCBDUFVfTUlQU1IyX0lSUV9WSQogCXNlbGVjdCBDUFVfTUlQU1IyX0lSUV9FSQogCXNlbGVjdCBNSVBTX01UCkBAIC0xNDUxLDMyICsxNDU0LDE3IEBACiAJICBJbmNsdWRlcyBhIGxvYWRlciBmb3IgbG9hZGluZyBhbiBlbGYgcmVsb2NhdGFibGUgb2JqZWN0CiAJICBvbnRvIGFub3RoZXIgVlBFIGFuZCBydW5uaW5nIGl0LgogCi1jb25maWcgTUlQU19NVF9TTVRDX0lOU1RBTlRfUkVQTEFZCi0JYm9vbCAiTG93LWxhdGVuY3kgRGlzcGF0Y2ggb2YgRGVmZXJyZWQgU01UQyBJUElzIgotCWRlcGVuZHMgb24gTUlQU19NVF9TTVRDICYmICFQUkVFTVBUCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU01UQyBwc2V1ZG8taW50ZXJydXB0cyBiZXR3ZWVuIFRDcyBhcmUgZGVmZXJyZWQgYW5kIHF1ZXVlZAotCSAgaWYgdGhlIHRhcmdldCBUQyBpcyBpbnRlcnJ1cHQtaW5oaWJpdGVkIChJWE1UKS4gSW4gdGhlIGZpcnN0Ci0JICBTTVRDIHByb3RvdHlwZXMsIHRoZXNlIHF1ZXVlZCBJUElzIHdlcmUgc2VydmljZWQgb24gcmV0dXJuCi0JICB0byB1c2VyIG1vZGUsIG9yIG9uIGVudHJ5IGludG8gdGhlIGtlcm5lbCBpZGxlIGxvb3AuIFRoZQotCSAgSU5TVEFOVF9SRVBMQVkgb3B0aW9uIGRpc3BhdGNoZXMgdGhlbSBhcyBwYXJ0IG9mIGxvY2FsX2lycV9yZXN0b3JlKCkKLQkgIHByb2Nlc3NpbmcsIHdoaWNoIGFkZHMgcnVudGltZSBvdmVyaGVhZCAoaGVuY2UgdGhlIG9wdGlvbiB0byB0dXJuCi0JICBpdCBvZmYpLCBidXQgZW5zdXJlcyB0aGF0IElQSXMgYXJlIGhhbmRsZWQgcHJvbXB0bHkgZXZlbiB1bmRlcgotCSAgaGVhdnkgSS9PIGludGVycnVwdCBsb2FkLgotCiBjb25maWcgTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QCiAJYm9vbCAiVXNlIHBlci1UQyByZWdpc3RlciBiaXRzIGFzIGJhY2tzdG9wIGZvciBpbmhpYml0ZWQgSU0gYml0cyIKIAlkZXBlbmRzIG9uIE1JUFNfTVRfU01UQwotCWRlZmF1bHQgeQorCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRvIHN1cHBvcnQgbXVsdGlwbGUgVEMgbWljcm90aHJlYWRzIGFjdGluZyBhcyAiQ1BVcyIgd2l0aGluCiAJICBhIFZQRSwgVlBFLXdpZGUgaW50ZXJydXB0IG1hc2sgYml0cyBtdXN0IGJlIHNwZWNpYWxseSBtYW5pcHVsYXRlZAogCSAgZHVyaW5nIGludGVycnVwdCBoYW5kbGluZy4gVG8gc3VwcG9ydCBsZWdhY3kgZHJpdmVycyBhbmQgaW50ZXJydXB0CiAJICBjb250cm9sbGVyIG1hbmFnZW1lbnQgY29kZSwgU01UQyBoYXMgYSAiYmFja3N0b3AiIHRvIHRyYWNrIGFuZAogCSAgaWYgbmVjZXNzYXJ5IHJlc3RvcmUgdGhlIGludGVycnVwdCBtYXNrLiBUaGlzIGhhcyBzb21lIHBlcmZvcm1hbmNlCi0JICBpbXBhY3Qgb24gaW50ZXJydXB0IHNlcnZpY2Ugb3ZlcmhlYWQuIERpc2FibGUgaXQgb25seSBpZiB5b3Uga25vdwotCSAgd2hhdCB5b3UgYXJlIGRvaW5nLgorCSAgaW1wYWN0IG9uIGludGVycnVwdCBzZXJ2aWNlIG92ZXJoZWFkLgogCiBjb25maWcgTUlQU19NVF9TTVRDX0lSUUFGRgogCWJvb2wgIlN1cHBvcnQgSVJRIGFmZmluaXR5IEFQSSIKQEAgLTE0ODYsMTAgKzE0NzQsOCBAQAogCSAgRW5hYmxlcyBTTVAgSVJRIGFmZmluaXR5IEFQSSAoL3Byb2MvaXJxLyovc21wX2FmZmluaXR5LCBldGMuKQogCSAgZm9yIFNNVEMgTGludXgga2VybmVsLiBSZXF1aXJlcyBwbGF0Zm9ybSBzdXBwb3J0LCBvZiB3aGljaAogCSAgYW4gZXhhbXBsZSBjYW4gYmUgZm91bmQgaW4gdGhlIE1JUFMga2VybmVsIGk4MjU5IGFuZCBNYWx0YQotCSAgcGxhdGZvcm0gY29kZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgTUlQU19NVF9TTVRDX0lOU1RBTlRfUkVQTEFZCi0JICBiZSBlbmFibGVkIGlmIE1JUFNfTVRfU01UQ19JUlFBRkYgaXMgdXNlZC4gQWRkcyBvdmVyaGVhZCB0bwotCSAgaW50ZXJydXB0IGRpc3BhdGNoLCBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3Uga25vdyB3aGF0Ci0JICB5b3UgYXJlIGRvaW5nLgorCSAgcGxhdGZvcm0gY29kZS4gIEFkZHMgc29tZSBvdmVyaGVhZCB0byBpbnRlcnJ1cHQgZGlzcGF0Y2gsIGFuZAorCSAgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKIGNvbmZpZyBNSVBTX1ZQRV9MT0FERVJfVE9NCiAJYm9vbCAiTG9hZCBWUEUgcHJvZ3JhbSBpbnRvIG1lbW9yeSBoaWRkZW4gZnJvbSBsaW51eCIKQEAgLTE1MTcsNiArMTUwMywxOCBAQAogCSAgImV4aXQiIHN5c2NhbGwgbm90aWZ5aW5nIG90aGVyIGtlcm5lbCBtb2R1bGVzIHRoZSBTUCBwcm9ncmFtIGlzCiAJICBleGl0aW5nLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IHllcyBoZXJlLgogCitjb25maWcgTUlQU19DTVAKKwlib29sICJNSVBTIENNUCBmcmFtZXdvcmsgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19NSVBTX0NNUAorCXNlbGVjdCBTWU5DX1I0SyBpZiBCUk9LRU4KKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0NIRURfU01UIGlmIFNNUAorCXNlbGVjdCBXRUFLX09SREVSSU5HCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBpcyBhIHBsYWNlaG9sZGVyIG9wdGlvbiBmb3IgdGhlIEdDTVAgd29yay4gSXQgd2lsbCBuZWVkIHRvCisJICBiZSBoYW5kbGVkIGRpZmZlcmVudGx5Li4uCisKIGNvbmZpZyBTQjFfUEFTU18xX1dPUktBUk9VTkRTCiAJYm9vbAogCWRlcGVuZHMgb24gQ1BVX1NCMV9QQVNTXzEKQEAgLTE2OTMsNiArMTY5MSw5IEBACiBjb25maWcgU01QX1VQCiAJYm9vbAogCitjb25maWcgU1lTX1NVUFBPUlRTX01JUFNfQ01QCisJYm9vbAorCiBjb25maWcgU1lTX1NVUFBPUlRTX1NNUAogCWJvb2wKIApAQCAtMTc0MCwxNyArMTc0MSw2IEBACiAJICBwZXJmb3JtYW5jZSBzaG91bGQgcm91bmQgdXAgeW91ciBudW1iZXIgb2YgcHJvY2Vzc29ycyB0byB0aGUgbmV4dAogCSAgcG93ZXIgb2YgdHdvLgogCi1jb25maWcgTUlQU19DTVAKLQlib29sICJNSVBTIENNUCBmcmFtZXdvcmsgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNNUAotCXNlbGVjdCBTWU5DX1I0SwotCXNlbGVjdCBTWVNfU1VQUE9SVFNfU0NIRURfU01UCi0Jc2VsZWN0IFdFQUtfT1JERVJJTkcKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgb3B0aW9uIGZvciB0aGUgR0NNUCB3b3JrLiBJdCB3aWxsIG5lZWQgdG8KLQkgIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkuLi4KLQogc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgogCiAjCkBAIC0xODg2LDYgKzE4NzYsMTUgQEAKIAogc291cmNlICJpbml0L0tjb25maWciCiAKK2NvbmZpZyBQUk9CRV9JTklUUkRfSEVBREVSCisJYm9vbCAiUHJvYmUgaW5pdHJkIGhlYWRlciBjcmVhdGVkIGJ5IGFkZGluaXRyZCIKKwlkZXBlbmRzIG9uIEJMS19ERVZfSU5JVFJECisJaGVscAorCSAgUHJvYmUgaW5pdHJkIGhlYWRlciBhdCB0aGUgbGFzdCBwYWdlIG9mIGtlcm5lbCBpbWFnZS4KKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBhcmNoL21pcHMvYm9vdC9hZGRpbml0cmQuYyB0bworCSAgYWRkIGluaXRyZCBvciBpbml0cmFtZnMgaW1hZ2UgdG8gdGhlIGtlcm5lbCBpbWFnZS4KKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKIG1lbnUgIkJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykiCiAKIGNvbmZpZyBIV19IQVNfRUlTQQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDlhYWI1MWNhLi43ZjM5ZmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0xNzAsMTIzICsxNzAsMTIzIEBACiAjIEFjZXIgUElDQSA2MSwgTWlwcyBNYWdudW0gNDAwMCBhbmQgT2xpdmV0dGkgTTcwMC4KICMKIGNvcmUtJChDT05GSUdfTUFDSF9KQVpaKQkrPSBhcmNoL21pcHMvamF6ei8KLWNmbGFncy0kKENPTkZJR19NQUNIX0pBWlopCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenoKK2NmbGFncy0kKENPTkZJR19NQUNIX0pBWlopCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qYXp6CiBsb2FkLSQoQ09ORklHX01BQ0hfSkFaWikJKz0gMHhmZmZmZmZmZjgwMDgwMDAwCiAKICMKICMgQ29tbW9uIEFsY2hlbXkgQXUxeDAwIHN0dWZmCiAjCi1jb3JlLSQoQ09ORklHX1NPQ19BVTFYMDApCSs9IGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uLwotY2ZsYWdzLSQoQ09ORklHX1NPQ19BVTFYMDApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMAorY29yZS0kKENPTkZJR19TT0NfQVUxWDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vCitjZmxhZ3MtJChDT05GSUdfU09DX0FVMVgwMCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTAwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMDAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTAwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTAwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfUEIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTEwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMTAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTEwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTEwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfUEIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjExMDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTUwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxNTAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTUwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTUwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfUEIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjE1MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTU1MCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxNTUwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTU1MC8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTU1MCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfUEIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTIwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMjAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTIwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX1BCMTIwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfUEIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTAwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTAwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTEwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMTAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTEwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfREIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTUwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxNTAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTUwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfREIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTU1MCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxNTUwKQkrPSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTU1MCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfREIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTIwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMjAwKQkrPSBhcmNoL21pcHMvYXUxMDAwL3BiMTIwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0RCMTIwMCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfREIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IEJvc3BvcnVzIGV2YWwgYm9hcmQKICMKLWxpYnMtJChDT05GSUdfTUlQU19CT1NQT1JVUykJKz0gYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvCi1jZmxhZ3MtJChDT05GSUdfTUlQU19CT1NQT1JVUykJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpCSs9IGFyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC8KK2NmbGFncy0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCiBsb2FkLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IE1pcmFnZSBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX01JUkFHRSkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwCitsaWJzLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjZmxhZ3MtJChDT05GSUdfTUlQU19NSVJBR0UpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19NSVJBR0UpCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIDRHLVN5c3RlbXMgZXZhbCBib2FyZAogIwotbGlicy0kKENPTkZJR19NSVBTX01UWDEpCSs9IGFyY2gvbWlwcy9hdTEwMDAvbXR4LTEvCitsaWJzLSQoQ09ORklHX01JUFNfTVRYMSkJKz0gYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvCiBsb2FkLSQoQ09ORklHX01JUFNfTVRYMSkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKICMgTXlDYWJsZSBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfWFhTMTUwMCkJKz0gYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwLworbGlicy0kKENPTkZJR19NSVBTX1hYUzE1MDApCSs9IGFyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvCiBsb2FkLSQoQ09ORklHX01JUFNfWFhTMTUwMCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKICMgQ29iYWx0IFNlcnZlcgogIwogY29yZS0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gYXJjaC9taXBzL2NvYmFsdC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0CitjZmxhZ3MtJChDT05GSUdfTUlQU19DT0JBTFQpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jb2JhbHQKIGxvYWQtJChDT05GSUdfTUlQU19DT0JBTFQpCSs9IDB4ZmZmZmZmZmY4MDA4MDAwMAogCiAjCiAjIERFQ3N0YXRpb24gZmFtaWx5CiAjCiBjb3JlLSQoQ09ORklHX01BQ0hfREVDU1RBVElPTikJKz0gYXJjaC9taXBzL2RlYy8KLWNmbGFncy0kKENPTkZJR19NQUNIX0RFQ1NUQVRJT04pKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZGVjCitjZmxhZ3MtJChDT05GSUdfTUFDSF9ERUNTVEFUSU9OKSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kZWMKIGxpYnMtJChDT05GSUdfTUFDSF9ERUNTVEFUSU9OKQkrPSBhcmNoL21pcHMvZGVjL3Byb20vCiBsb2FkLSQoQ09ORklHX01BQ0hfREVDU1RBVElPTikJKz0gMHhmZmZmZmZmZjgwMDQwMDAwCiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogIyBXaW5kIFJpdmVyIFBQTUMgQm9hcmQgKDRLQyArIEdUNjQxMjApCiAjCiBjb3JlLSQoQ09ORklHX1dSX1BQTUMpCQkrPSBhcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvCi1jZmxhZ3MtJChDT05GSUdfV1JfUFBNQykJCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXdycHBtYworY2ZsYWdzLSQoQ09ORklHX1dSX1BQTUMpCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtd3JwcG1jCiBsb2FkLSQoQ09ORklHX1dSX1BQTUMpCQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIAogIwpAQCAtMzAyLDEzICszMDIsMTMgQEAKICMKIGNvcmUtJChDT05GSUdfTEVNT1RFX0ZVTE9ORykgKz1hcmNoL21pcHMvbGVtb3RlL2xtMmUvCiBsb2FkLSQoQ09ORklHX0xFTU9URV9GVUxPTkcpICs9MHhmZmZmZmZmZjgwMTAwMDAwCi1jZmxhZ3MtJChDT05GSUdfTEVNT1RFX0ZVTE9ORykgKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtbGVtb3RlCitjZmxhZ3MtJChDT05GSUdfTEVNT1RFX0ZVTE9ORykgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxlbW90ZQogCiAjCiAjIE1JUFMgTWFsdGEgYm9hcmQKICMKIGNvcmUtJChDT05GSUdfTUlQU19NQUxUQSkJKz0gYXJjaC9taXBzL210aS1tYWx0YS8KLWNmbGFncy0kKENPTkZJR19NSVBTX01BTFRBKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1tYWx0YQorY2ZsYWdzLSQoQ09ORklHX01JUFNfTUFMVEEpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YQogbG9hZC0kKENPTkZJR19NSVBTX01BTFRBKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIGFsbC0kKENPTkZJR19NSVBTX01BTFRBKQk6PSB2bWxpbnV4LmJpbgogCkBAIC0zMTYsMTQgKzMxNiwxNCBAQAogIyBNSVBTIFNJTQogIwogY29yZS0kKENPTkZJR19NSVBTX1NJTSkJCSs9IGFyY2gvbWlwcy9taXBzc2ltLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfU0lNKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1taXBzc2ltCitjZmxhZ3MtJChDT05GSUdfTUlQU19TSU0pCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1taXBzc2ltCiBsb2FkLSQoQ09ORklHX01JUFNfU0lNKQkJKz0gMHg4MDEwMDAwMAogCiAjCiAjIFBNQy1TaWVycmEgTVNQIFNPQ3MKICMKIGNvcmUtJChDT05GSUdfUE1DX01TUCkJCSs9IGFyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvCi1jZmxhZ3MtJChDT05GSUdfUE1DX01TUCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eCBcCitjZmxhZ3MtJChDT05GSUdfUE1DX01TUCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHggXAogCQkJCQktbW5vLWJyYW5jaC1saWtlbHkKIGxvYWQtJChDT05GSUdfUE1DX01TUCkJCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCkBAIC0zMzEsMjggKzMzMSwyOCBAQAogIyBQTUMtU2llcnJhIFlvc2VtaXRlCiAjCiBjb3JlLSQoQ09ORklHX1BNQ19ZT1NFTUlURSkJKz0gYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvCi1jZmxhZ3MtJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC15b3NlbWl0ZQorY2ZsYWdzLSQoQ09ORklHX1BNQ19ZT1NFTUlURSkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXlvc2VtaXRlCiBsb2FkLSQoQ09ORklHX1BNQ19ZT1NFTUlURSkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKICMgQmFzbGVyIGVYY2l0ZQogIwogY29yZS0kKENPTkZJR19CQVNMRVJfRVhDSVRFKQkrPSBhcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS8KLWNmbGFncy0kKENPTkZJR19CQVNMRVJfRVhDSVRFKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUKK2NmbGFncy0kKENPTkZJR19CQVNMRVJfRVhDSVRFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlCiBsb2FkLSQoQ09ORklHX0JBU0xFUl9FWENJVEUpCSs9IDB4ODAxMDAwMDAKIAogIwogIyBMQVNBVCBwbGF0Zm9ybXMKICMKIGNvcmUtJChDT05GSUdfTEFTQVQpCQkrPSBhcmNoL21pcHMvbGFzYXQvCi1jZmxhZ3MtJChDT05GSUdfTEFTQVQpCQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1sYXNhdAorY2ZsYWdzLSQoQ09ORklHX0xBU0FUKQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhc2F0CiBsb2FkLSQoQ09ORklHX0xBU0FUKQkJKz0gMHhmZmZmZmZmZjgwMDAwMDAwCiAKICMKICMgQ29tbW9uIFZSNDF4eAogIwogY29yZS0kKENPTkZJR19NQUNIX1ZSNDFYWCkJKz0gYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfTUFDSF9WUjQxWFgpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXZyNDF4eAorY2ZsYWdzLSQoQ09ORklHX01BQ0hfVlI0MVhYKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdnI0MXh4CiAKICMKICMgWkFPIE5ldHdvcmtzIENhcGNlbGxhIChWUjQxMzEpCkBAIC0zODUsMTMgKzM4NSwxMyBAQAogIyBDb21tb24gTlhQIFBOWDg1NTAKICMKIGNvcmUtJChDT05GSUdfU09DX1BOWDg1NTApCSs9IGFyY2gvbWlwcy9ueHAvcG54ODU1MC9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfU09DX1BOWDg1NTApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAKK2NmbGFncy0kKENPTkZJR19TT0NfUE5YODU1MCkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAKIAogIwogIyBOWFAgUE5YODU1MCBKQlMgYm9hcmQKICMKIGxpYnMtJChDT05GSUdfUE5YODU1MF9KQlMpCSs9IGFyY2gvbWlwcy9ueHAvcG54ODU1MC9qYnMvCi0jY2ZsYWdzLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwCisjY2ZsYWdzLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MAogbG9hZC0kKENPTkZJR19QTlg4NTUwX0pCUykJKz0gMHhmZmZmZmZmZjgwMDYwMDAwCiAKICMgTlhQIFBOWDg1NTAgU1RCODEwIGJvYXJkCkBAIC00MDIsNyArNDAyLDcgQEAKICMgTkVDIEVNTUEyUkggYm9hcmRzCiAjCiBjb3JlLSQoQ09ORklHX0VNTUEyUkgpICAgICAgICAgICs9IGFyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi8KLWNmbGFncy0kKENPTkZJR19FTU1BMlJIKSAgICAgICAgKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZW1tYTJyaAorY2ZsYWdzLSQoQ09ORklHX0VNTUEyUkgpICAgICAgICArPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZW1tYTJyaAogCiAjIE5FQyBFTU1BMlJIIE1hcmstZWlucwogY29yZS0kKENPTkZJR19NQVJLRUlOUykgICAgICAgICArPSBhcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy8KQEAgLTQxOCw3ICs0MTgsNyBAQAogIyBhZGRyZXNzIGJ5IDhrYi4KICMKIGNvcmUtJChDT05GSUdfU0dJX0lQMjIpCQkrPSBhcmNoL21pcHMvc2dpLWlwMjIvCi1jZmxhZ3MtJChDT05GSUdfU0dJX0lQMjIpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjIKK2NmbGFncy0kKENPTkZJR19TR0lfSVAyMikJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjIKIGlmZGVmIENPTkZJR18zMkJJVAogbG9hZC0kKENPTkZJR19TR0lfSVAyMikJCSs9IDB4ZmZmZmZmZmY4ODAwMjAwMAogZW5kaWYKQEAgLTQzNSw3ICs0MzUsNyBAQAogIwogaWZkZWYgQ09ORklHX1NHSV9JUDI3CiBjb3JlLSQoQ09ORklHX1NHSV9JUDI3KQkJKz0gYXJjaC9taXBzL3NnaS1pcDI3LwotY2ZsYWdzLSQoQ09ORklHX1NHSV9JUDI3KQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3CitjZmxhZ3MtJChDT05GSUdfU0dJX0lQMjcpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3CiBpZmRlZiBDT05GSUdfTUFQUEVEX0tFUk5FTAogbG9hZC0kKENPTkZJR19TR0lfSVAyNykJCSs9IDB4YzAwMDAwMDA0MDAxYzAwMAogT0JKQ09QWUZMQUdTCQkJOj0gLS1jaGFuZ2UtYWRkcmVzc2VzPTB4M2ZmZmZmZmY4MDAwMDAwMApAQCAtNDYwLDcgKzQ2MCw3IEBACiAgIGVuZGlmCiBlbmRpZgogY29yZS0kKENPTkZJR19TR0lfSVAyOCkJCSs9IGFyY2gvbWlwcy9zZ2ktaXAyMi8KLWNmbGFncy0kKENPTkZJR19TR0lfSVAyOCkJKz0gLW1yMTBrLWNhY2hlLWJhcnJpZXI9MSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI4CitjZmxhZ3MtJChDT05GSUdfU0dJX0lQMjgpCSs9IC1tcjEway1jYWNoZS1iYXJyaWVyPTEgLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjgKIGxvYWQtJChDT05GSUdfU0dJX0lQMjgpCQkrPSAweGE4MDAwMDAwMjAwMDQwMDAKIAogIwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAjIHdpbGwgYnJlYWsuCiAjCiBjb3JlLSQoQ09ORklHX1NHSV9JUDMyKQkJKz0gYXJjaC9taXBzL3NnaS1pcDMyLwotY2ZsYWdzLSQoQ09ORklHX1NHSV9JUDMyKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyCitjZmxhZ3MtJChDT05GSUdfU0dJX0lQMzIpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDMyCiBsb2FkLSQoQ09ORklHX1NHSV9JUDMyKQkJKz0gMHhmZmZmZmZmZjgwMDA0MDAwCiAKICMKQEAgLTQ4NCwyMiArNDg0LDIyIEBACiAjCiBjb3JlLSQoQ09ORklHX1NJQllURV9CQ00xMTJYKQkrPSBhcmNoL21pcHMvc2lieXRlL3NiMTI1MC8KIGNvcmUtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwotY2ZsYWdzLSQoQ09ORklHX1NJQllURV9CQ00xMTJYKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1zaWJ5dGUgXAorY2ZsYWdzLSQoQ09ORklHX1NJQllURV9CQ00xMTJYKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtc2lieXRlIFwKIAkJCS1EU0lCWVRFX0hEUl9GRUFUVVJFUz1TSUJZVEVfSERSX0ZNQVNLXzEyNTBfMTEyeF9BTEwKIAogY29yZS0kKENPTkZJR19TSUJZVEVfU0IxMjUwKQkrPSBhcmNoL21pcHMvc2lieXRlL3NiMTI1MC8KIGNvcmUtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtc2lieXRlIFwKK2NmbGFncy0kKENPTkZJR19TSUJZVEVfU0IxMjUwKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtc2lieXRlIFwKIAkJCS1EU0lCWVRFX0hEUl9GRUFUVVJFUz1TSUJZVEVfSERSX0ZNQVNLXzEyNTBfMTEyeF9BTEwKIAogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg1NSkJKz0gYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwLwogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg1NSkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCitjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUgXAogCQkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTQ4MF9BTEwKIAogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwLwogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCi1jZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCitjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUgXAogCQkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTQ4MF9BTEwKIAogIwpAQCAtNTI5LDE0ICs1MjksMTQgQEAKICMgQnJvYWRjb20gQkNNNDdYWCBib2FyZHMKICMKIGNvcmUtJChDT05GSUdfQkNNNDdYWCkJCSs9IGFyY2gvbWlwcy9iY200N3h4LwotY2ZsYWdzLSQoQ09ORklHX0JDTTQ3WFgpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTQ3eHgKK2NmbGFncy0kKENPTkZJR19CQ000N1hYKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eAogbG9hZC0kKENPTkZJR19CQ000N1hYKQkJOj0gMHhmZmZmZmZmZjgwMDAxMDAwCiAKICMKICMgU05JIFJNCiAjCiBjb3JlLSQoQ09ORklHX1NOSV9STSkJCSs9IGFyY2gvbWlwcy9zbmkvCi1jZmxhZ3MtJChDT05GSUdfU05JX1JNKQkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtcm0KK2NmbGFncy0kKENPTkZJR19TTklfUk0pCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcm0KIGlmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogbG9hZC0kKENPTkZJR19TTklfUk0pCQkrPSAweGZmZmZmZmZmODA2MDAwMDAKIGVsc2UKQEAgLTU0OCwxMCArNTQ4LDEwIEBACiAjIENvbW1vbiBUWHg5CiAjCiBjb3JlLSQoQ09ORklHX01BQ0hfVFgzOVhYKQkrPSBhcmNoL21pcHMvdHh4OS9nZW5lcmljLwotY2ZsYWdzLSQoQ09ORklHX01BQ0hfVFgzOVhYKSArPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDM5eHgKK2NmbGFncy0kKENPTkZJR19NQUNIX1RYMzlYWCkgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4Mzl4eAogbG9hZC0kKENPTkZJR19NQUNIX1RYMzlYWCkJKz0gMHhmZmZmZmZmZjgwMDUwMDAwCiBjb3JlLSQoQ09ORklHX01BQ0hfVFg0OVhYKQkrPSBhcmNoL21pcHMvdHh4OS9nZW5lcmljLwotY2ZsYWdzLSQoQ09ORklHX01BQ0hfVFg0OVhYKSArPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDQ5eHgKK2NmbGFncy0kKENPTkZJR19NQUNIX1RYNDlYWCkgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4NDl4eAogbG9hZC0kKENPTkZJR19NQUNIX1RYNDlYWCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKQEAgLTU2MywyMSArNTYzLDE3IEBACiAjIFJvdXRlcmJvYXJkIDUzMiBib2FyZAogIwogY29yZS0kKENPTkZJR19NSUtST1RJS19SQjUzMikJKz0gYXJjaC9taXBzL3JiNTMyLwotY2ZsYWdzLSQoQ09ORklHX01JS1JPVElLX1JCNTMyKSArPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0CitjZmxhZ3MtJChDT05GSUdfTUlLUk9USUtfUkI1MzIpICs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0CiBsb2FkLSQoQ09ORklHX01JS1JPVElLX1JCNTMyKQkrPSAweGZmZmZmZmZmODAxMDEwMDAKIAogIwotIyBUb3NoaWJhIFJCVFg0OTI3IGJvYXJkIG9yCi0jIFRvc2hpYmEgUkJUWDQ5MzcgYm9hcmQKKyMgVG9zaGliYSBSQlRYNDlYWCBib2FyZHMKICMKIGNvcmUtJChDT05GSUdfVE9TSElCQV9SQlRYNDkyNykJKz0gYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvCi0KLSMKLSMgVG9zaGliYSBSQlRYNDkzOCBib2FyZAotIwogY29yZS0kKENPTkZJR19UT1NISUJBX1JCVFg0OTM4KSArPSBhcmNoL21pcHMvdHh4OS9yYnR4NDkzOC8KK2NvcmUtJChDT05GSUdfVE9TSElCQV9SQlRYNDkzOSkgKz0gYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvCiAKLWNmbGFncy15CQkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYworY2ZsYWdzLXkJCQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYwogZHJpdmVycy0kKENPTkZJR19QQ0kpCQkrPSBhcmNoL21pcHMvcGNpLwogCiBpZmRlZiBDT05GSUdfMzJCSVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvS2NvbmZpZyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvS2NvbmZpZwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL01ha2VmaWxlCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2F1MXh4eF9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9hdTF4eHhfaXJxbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2F1MXh4eF9pcnFtYXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2F1MXh4eF9pcnFtYXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vY2xvY2tzLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY2xvY2tzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2Nsb2Nrcy5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vY2xvY2tzLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2NwdXRhYmxlLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY3B1dGFibGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9jb21tb24vY3B1dGFibGUuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2NwdXRhYmxlLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2RiZG1hLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9jb21tb24vZGJkbWEuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2RtYS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9kbWEuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZ3Bpby5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYwZGRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW8uYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcsIE9wZW5XcnQub3JnLCBGbG9yaWFuIEZhaW5lbGxpIDxmbG9yaWFuQG9wZW53cnQub3JnPgorICogIAlBcmNoaXRlY3R1cmUgc3BlY2lmaWMgR1BJTyBzdXBwb3J0CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBOb3RlcyA6CisgKiAJYXUxMDAwIFNvQyBoYXZlIG9ubHkgb25lIEdQSU8gbGluZSA6IEdQSU8xCisgKiAJb3RoZXJzIGhhdmUgYSBzZWNvbmQgb25lIDogR1BJTzIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKworI2RlZmluZSBncGlvMSBzeXMKKyNpZiAhZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkKKworc3RhdGljIHN0cnVjdCBhdTF4MDBfZ3BpbzIgKmNvbnN0IGdwaW8yID0gKHN0cnVjdCBhdTF4MDBfZ3BpbzIgKikgR1BJTzJfQkFTRTsKKyNkZWZpbmUgR1BJTzJfT1VUUFVUX0VOQUJMRV9NQVNLIAkweDAwMDEwMDAwCisKK3N0YXRpYyBpbnQgYXUxeHh4X2dwaW8yX3JlYWQodW5zaWduZWQgZ3BpbykKK3sKKwlncGlvIC09IEFVMVhYWF9HUElPX0JBU0U7CisJcmV0dXJuICgoZ3BpbzItPnBpbnN0YXRlID4+IGdwaW8pICYgMHgwMSk7Cit9CisKK3N0YXRpYyB2b2lkIGF1MXh4eF9ncGlvMl93cml0ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJZ3BpbyAtPSBBVTFYWFhfR1BJT19CQVNFOworCisJZ3BpbzItPm91dHB1dCA9IChHUElPMl9PVVRQVVRfRU5BQkxFX01BU0sgPDwgZ3BpbykgfCAoKCEhdmFsdWUpIDw8IGdwaW8pOworfQorCitzdGF0aWMgaW50IGF1MXh4eF9ncGlvMl9kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKK3sKKwlncGlvIC09IEFVMVhYWF9HUElPX0JBU0U7CisJZ3BpbzItPmRpciAmPSB+KDB4MDEgPDwgZ3Bpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxeHh4X2dwaW8yX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCWdwaW8gLT0gQVUxWFhYX0dQSU9fQkFTRTsKKwlncGlvMi0+ZGlyIHw9IDB4MDEgPDwgZ3BpbzsKKwlncGlvMi0+b3V0cHV0ID0gKEdQSU8yX09VVFBVVF9FTkFCTEVfTUFTSyA8PCBncGlvKSB8ICgoISF2YWx1ZSkgPDwgZ3Bpbyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkgKi8KKworc3RhdGljIGludCBhdTF4eHhfZ3BpbzFfcmVhZCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAoZ3BpbzEtPnBpbnN0YXRlcmQgPj4gZ3BpbykgJiAweDAxOworfQorCitzdGF0aWMgdm9pZCBhdTF4eHhfZ3BpbzFfd3JpdGUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJZ3BpbzEtPm91dHB1dHNldCA9ICgweDAxIDw8IGdwaW8pOworCWVsc2UKKwkJLyogT3V0cHV0IGEgemVybyAqLworCQlncGlvMS0+b3V0cHV0Y2xyID0gKDB4MDEgPDwgZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCWdwaW8xLT5waW5pbnB1dGVuID0gKDB4MDEgPDwgZ3Bpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCWdwaW8xLT50cmlvdXRjbHIgPSAoMHgwMSAmIGdwaW8pOworCWF1MXh4eF9ncGlvMV93cml0ZShncGlvLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhdTF4eHhfZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKK3sKKwlpZiAoZ3BpbyA+PSBBVTFYWFhfR1BJT19CQVNFKQorI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCisJCXJldHVybiAwOworI2Vsc2UKKwkJcmV0dXJuIGF1MXh4eF9ncGlvMl9yZWFkKGdwaW8pOworI2VuZGlmCisJZWxzZQorCQlyZXR1cm4gYXUxeHh4X2dwaW8xX3JlYWQoZ3Bpbyk7Cit9CitFWFBPUlRfU1lNQk9MKGF1MXh4eF9ncGlvX2dldF92YWx1ZSk7CisKK3ZvaWQgYXUxeHh4X2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlpZiAoZ3BpbyA+PSBBVTFYWFhfR1BJT19CQVNFKQorI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCisJCTsKKyNlbHNlCisJCWF1MXh4eF9ncGlvMl93cml0ZShncGlvLCB2YWx1ZSk7CisjZW5kaWYKKwllbHNlCisJCWF1MXh4eF9ncGlvMV93cml0ZShncGlvLCB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGF1MXh4eF9ncGlvX3NldF92YWx1ZSk7CisKK2ludCBhdTF4eHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKK3sKKwlpZiAoZ3BpbyA+PSBBVTFYWFhfR1BJT19CQVNFKQorI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCisJCXJldHVybiAtRU5PREVWOworI2Vsc2UKKwkJcmV0dXJuIGF1MXh4eF9ncGlvMl9kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisjZW5kaWYKKworCXJldHVybiBhdTF4eHhfZ3BpbzFfZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorRVhQT1JUX1NZTUJPTChhdTF4eHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQpOworCitpbnQgYXUxeHh4X2dwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJaWYgKGdwaW8gPj0gQVUxWFhYX0dQSU9fQkFTRSkKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbHNlCisJCXJldHVybiBhdTF4eHhfZ3BpbzJfZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7CisjZW5kaWYKKworCXJldHVybiBhdTF4eHhfZ3BpbzFfZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGF1MXh4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2lycS5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3BjaS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BjaS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wY2kuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BjaS5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3BsYXRmb3JtLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wb3dlci5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3Bvd2VyLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wcm9tLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcHJvbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wcm9tLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wcm9tLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3B1dHMuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wdXRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3B1dHMuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3B1dHMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vcmVzZXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9yZXNldC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9yZXNldC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vcmVzZXQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zZXR1cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NsZWVwZXIuUyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwNmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiBFbWJlZGRlZCBFZGdlLCBMTEMKKyAqIEF1dGhvcjogZGFuQGVtYmVkZGVkZWRnZS5jb20KKyAqCisgKiBTbGVlcCBoZWxwZXIgZm9yIEF1MXh4eCBzbGVlcCBtb2RlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQlpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mCXRoZSBHTlUgR2VuZXJhbAkgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CisKKwkudGV4dAorCS5zZXQJbWFjcm8KKwkuc2V0CW5vYXQKKwkuYWxpZ24JNQorCisvKiBTYXZlIGFsbCBvZiB0aGUgcHJvY2Vzc29yIGdlbmVyYWwgcmVnaXN0ZXJzIGFuZCBnbyB0byBzbGVlcC4KKyAqIEEgd2FrZXVwIGNvbmRpdGlvbiB3aWxsIGdldCB1cyBiYWNrIGhlcmUgdG8gcmVzdG9yZSB0aGUgcmVnaXN0ZXJzLgorICovCitMRUFGKHNhdmVfYW5kX3NsZWVwKQorCisJc3VidQlzcCwgUFRfU0laRQorCXN3CSQxLCBQVF9SMShzcCkKKwlzdwkkMiwgUFRfUjIoc3ApCisJc3cJJDMsIFBUX1IzKHNwKQorCXN3CSQ0LCBQVF9SNChzcCkKKwlzdwkkNSwgUFRfUjUoc3ApCisJc3cJJDYsIFBUX1I2KHNwKQorCXN3CSQ3LCBQVF9SNyhzcCkKKwlzdwkkOCwgUFRfUjgoc3ApCisJc3cJJDksIFBUX1I5KHNwKQorCXN3CSQxMCwgUFRfUjEwKHNwKQorCXN3CSQxMSwgUFRfUjExKHNwKQorCXN3CSQxMiwgUFRfUjEyKHNwKQorCXN3CSQxMywgUFRfUjEzKHNwKQorCXN3CSQxNCwgUFRfUjE0KHNwKQorCXN3CSQxNSwgUFRfUjE1KHNwKQorCXN3CSQxNiwgUFRfUjE2KHNwKQorCXN3CSQxNywgUFRfUjE3KHNwKQorCXN3CSQxOCwgUFRfUjE4KHNwKQorCXN3CSQxOSwgUFRfUjE5KHNwKQorCXN3CSQyMCwgUFRfUjIwKHNwKQorCXN3CSQyMSwgUFRfUjIxKHNwKQorCXN3CSQyMiwgUFRfUjIyKHNwKQorCXN3CSQyMywgUFRfUjIzKHNwKQorCXN3CSQyNCwgUFRfUjI0KHNwKQorCXN3CSQyNSwgUFRfUjI1KHNwKQorCXN3CSQyNiwgUFRfUjI2KHNwKQorCXN3CSQyNywgUFRfUjI3KHNwKQorCXN3CSQyOCwgUFRfUjI4KHNwKQorCXN3CSQyOSwgUFRfUjI5KHNwKQorCXN3CSQzMCwgUFRfUjMwKHNwKQorCXN3CSQzMSwgUFRfUjMxKHNwKQorCW1mYzAJazAsIENQMF9TVEFUVVMKKwlzdwlrMCwgMHgyMChzcCkKKwltZmMwCWswLCBDUDBfQ09OVEVYVAorCXN3CWswLCAweDFjKHNwKQorCW1mYzAJazAsIENQMF9QQUdFTUFTSworCXN3CWswLCAweDE4KHNwKQorCW1mYzAJazAsIENQMF9DT05GSUcKKwlzdwlrMCwgMHgxNChzcCkKKworCS8qIE5vdyBzZXQgdXAgdGhlIHNjcmF0Y2ggcmVnaXN0ZXJzIHNvIHRoZSBib290IHJvbSB3aWxsCisJICogcmV0dXJuIHRvIHRoaXMgcG9pbnQgdXBvbiB3YWtldXAuCisJICovCisJbGEJazAsIDFmCisJbHVpCWsxLCAweGIxOTAKKwlvcmkJazEsIDB4MTgKKwlzdwlzcCwgMChrMSkKKwlvcmkgCWsxLCAweDFjCisJc3cJazAsIDAoazEpCisKKy8qIFB1dCBTRFJBTSBpbnRvIHNlbGYgcmVmcmVzaC4gIFByZWxvYWQgaW5zdHJ1Y3Rpb25zIGludG8gY2FjaGUsCisgKiBpc3N1ZSBhIHByZWNoYXJnZSwgdGhlbiBhdXRvIHJlZnJlc2gsIHRoZW4gc2xlZXAgY29tbWFuZHMgdG8gaXQuCisgKi8KKwlsYQl0MCwgc2RzbGVlcAorCS5zZXQJbWlwczMKKwljYWNoZQkweDE0LCAwKHQwKQorCWNhY2hlCTB4MTQsIDMyKHQwKQorCWNhY2hlCTB4MTQsIDY0KHQwKQorCWNhY2hlCTB4MTQsIDk2KHQwKQorCS5zZXQJbWlwczAKKworc2RzbGVlcDoKKwlsdWkgCWswLCAweGI0MDAKKwlzdwl6ZXJvLCAweDAwMWMoazApCS8qIFByZWNoYXJnZSAqLworCXN3CXplcm8sIDB4MDAyMChrMCkJLyogQXV0byByZWZyZXNoICovCisJc3cJemVybywgMHgwMDMwKGswKQkvKiBTRFJBTSBzbGVlcCAqLworCXN5bmMKKworCWx1aSAJazEsIDB4YjE5MAorCXN3CXplcm8sIDB4MDA3OChrMSkJLyogZ2V0IHJlYWR5ICB0byBzbGVlcCAqLworCXN5bmMKKwlzdwl6ZXJvLCAweDAwN2MoazEpCS8qIFB1dCBwcm9jZXNzb3IgdG8gc2xlZXAgKi8KKwlzeW5jCisKKwkvKiBUaGlzIGlzIHdoZXJlIHdlIHJldHVybiB1cG9uIHdha2V1cC4KKwkgKiBSZWxvYWQgYWxsIG9mIHRoZSByZWdpc3RlcnMgYW5kIHJldHVybi4KKwkgKi8KKzE6CW5vcAorCWx3CWswLCAweDIwKHNwKQorCW10YzAJazAsIENQMF9TVEFUVVMKKwlsdwlrMCwgMHgxYyhzcCkKKwltdGMwCWswLCBDUDBfQ09OVEVYVAorCWx3CWswLCAweDE4KHNwKQorCW10YzAJazAsIENQMF9QQUdFTUFTSworCWx3CWswLCAweDE0KHNwKQorCW10YzAJazAsIENQMF9DT05GSUcKKworCS8qIFdlIG5lZWQgdG8gY2F0Y2ggdGhlIGVhbHJ5IEFsY2hlbXkgU09DcyB3aXRoCisJICogdGhlIHdyaXRlLW9ubHkgQ29uZmlnW09EXSBiaXQgYW5kIHNldCBpdCBiYWNrIHRvIG9uZS4uLgorCSAqLworCWphbAlhdTF4MDBfZml4dXBfY29uZmlnX29kCisJbHcJJDEsIFBUX1IxKHNwKQorCWx3CSQyLCBQVF9SMihzcCkKKwlsdwkkMywgUFRfUjMoc3ApCisJbHcJJDQsIFBUX1I0KHNwKQorCWx3CSQ1LCBQVF9SNShzcCkKKwlsdwkkNiwgUFRfUjYoc3ApCisJbHcJJDcsIFBUX1I3KHNwKQorCWx3CSQ4LCBQVF9SOChzcCkKKwlsdwkkOSwgUFRfUjkoc3ApCisJbHcJJDEwLCBQVF9SMTAoc3ApCisJbHcJJDExLCBQVF9SMTEoc3ApCisJbHcJJDEyLCBQVF9SMTIoc3ApCisJbHcJJDEzLCBQVF9SMTMoc3ApCisJbHcJJDE0LCBQVF9SMTQoc3ApCisJbHcJJDE1LCBQVF9SMTUoc3ApCisJbHcJJDE2LCBQVF9SMTYoc3ApCisJbHcJJDE3LCBQVF9SMTcoc3ApCisJbHcJJDE4LCBQVF9SMTgoc3ApCisJbHcJJDE5LCBQVF9SMTkoc3ApCisJbHcJJDIwLCBQVF9SMjAoc3ApCisJbHcJJDIxLCBQVF9SMjEoc3ApCisJbHcJJDIyLCBQVF9SMjIoc3ApCisJbHcJJDIzLCBQVF9SMjMoc3ApCisJbHcJJDI0LCBQVF9SMjQoc3ApCisJbHcJJDI1LCBQVF9SMjUoc3ApCisJbHcJJDI2LCBQVF9SMjYoc3ApCisJbHcJJDI3LCBQVF9SMjcoc3ApCisJbHcJJDI4LCBQVF9SMjgoc3ApCisJbHcJJDI5LCBQVF9SMjkoc3ApCisJbHcJJDMwLCBQVF9SMzAoc3ApCisJbHcJJDMxLCBQVF9SMzEoc3ApCisJYWRkaXUJc3AsIFBUX1NJWkUKKworCWpyCXJhCitFTkQoc2F2ZV9hbmRfc2xlZXApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi90aW1lLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vdGltZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi90aW1lLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi90aW1lLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9NYWtlZmlsZQpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL01ha2VmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL2JvYXJkX3NldHVwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL2JvYXJkX3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9ib2FyZF9zZXR1cC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9pbml0LmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9pbml0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL2lycW1hcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9pcnFtYXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL210eC0xL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvbXR4LTEvTWFrZWZpbGUKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L210eC0xL01ha2VmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL210eC0xL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL210eC0xL2JvYXJkX3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvbXR4LTEvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL210eC0xL2luaXQuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaW5pdC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL210eC0xL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaXJxbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvbXR4LTEvaXJxbWFwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L210eC0xL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL210eC0xL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9wbGF0Zm9ybS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL210eC0xL3BsYXRmb3JtLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L210eC0xL3BsYXRmb3JtLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMDAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9NYWtlZmlsZQpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL01ha2VmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2JvYXJkX3NldHVwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvcGIxMDAwL2JvYXJkX3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9ib2FyZF9zZXR1cC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9pbml0LmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9pbml0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMDAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2lycW1hcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTAwMC9pcnFtYXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTEwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjExMDAvTWFrZWZpbGUKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjExMDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9ib2FyZF9zZXR1cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTEwMC9ib2FyZF9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjExMDAvYm9hcmRfc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjExMDAvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMTAwL2luaXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjExMDAvaW5pdC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjExMDAvaW5pdC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTEwMC9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9pcnFtYXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjExMDAvaXJxbWFwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9pcnFtYXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL01ha2VmaWxlCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvYm9hcmRfc2V0dXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvYm9hcmRfc2V0dXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2JvYXJkX3NldHVwLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTIwMC9pbml0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2luaXQuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2luaXQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaXJxbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2lycW1hcC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaXJxbWFwLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvcGxhdGZvcm0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvcGxhdGZvcm0uYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL3BsYXRmb3JtLmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxNTAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTUwMC9NYWtlZmlsZQpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL01ha2VmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTUwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2JvYXJkX3NldHVwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvbWlwcy9hdTEwMDAvcGIxNTAwL2JvYXJkX3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTUwMC9ib2FyZF9zZXR1cC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTUwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjE1MDAvaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTUwMC9pbml0LmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTUwMC9pbml0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvcGIxNTAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2lycW1hcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTUwMC9pcnFtYXAuYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTU1MC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjE1NTAvTWFrZWZpbGUKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjE1NTAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9ib2FyZF9zZXR1cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3BiMTU1MC9ib2FyZF9zZXR1cC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvYm9hcmRfc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9wYjE1NTAvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL2luaXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjE1NTAvaW5pdC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvaW5pdC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTU1MC9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9pcnFtYXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC9wYjE1NTAvaXJxbWFwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9pcnFtYXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL01ha2VmaWxlCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL01ha2VmaWxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3h4czE1MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2JvYXJkX3NldHVwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYXUxMDAwL3h4czE1MDAvaW5pdC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2luaXQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9pcnFtYXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2F1MTAwMC94eHMxNTAwL2lycW1hcC5jCnJlbmFtZSB0byBhcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2lycW1hcC5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9ncGlvLmMgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODVkOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LCBPcGVuV3J0Lm9yZywgRmxvcmlhbiBGYWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4KLSAqICAJQXJjaGl0ZWN0dXJlIHNwZWNpZmljIEdQSU8gc3VwcG9ydAotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgTm90ZXMgOgotICogCWF1MTAwMCBTb0MgaGF2ZSBvbmx5IG9uZSBHUElPIGxpbmUgOiBHUElPMQotICogCW90aGVycyBoYXZlIGEgc2Vjb25kIG9uZSA6IEdQSU8yCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3BpbzEgc3lzCi0jaWYgIWRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCi0KLXN0YXRpYyBzdHJ1Y3QgYXUxeDAwX2dwaW8yICpjb25zdCBncGlvMiA9IChzdHJ1Y3QgYXUxeDAwX2dwaW8yICopIEdQSU8yX0JBU0U7Ci0jZGVmaW5lIEdQSU8yX09VVFBVVF9FTkFCTEVfTUFTSyAJMHgwMDAxMDAwMAotCi1zdGF0aWMgaW50IGF1MXh4eF9ncGlvMl9yZWFkKHVuc2lnbmVkIGdwaW8pCi17Ci0JZ3BpbyAtPSBBVTFYWFhfR1BJT19CQVNFOwotCXJldHVybiAoKGdwaW8yLT5waW5zdGF0ZSA+PiBncGlvKSAmIDB4MDEpOwotfQotCi1zdGF0aWMgdm9pZCBhdTF4eHhfZ3BpbzJfd3JpdGUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWdwaW8gLT0gQVUxWFhYX0dQSU9fQkFTRTsKLQotCWdwaW8yLT5vdXRwdXQgPSAoR1BJTzJfT1VUUFVUX0VOQUJMRV9NQVNLIDw8IGdwaW8pIHwgKHZhbHVlIDw8IGdwaW8pOwotfQotCi1zdGF0aWMgaW50IGF1MXh4eF9ncGlvMl9kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKLXsKLQlncGlvIC09IEFVMVhYWF9HUElPX0JBU0U7Ci0JZ3BpbzItPmRpciAmPSB+KDB4MDEgPDwgZ3Bpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXUxeHh4X2dwaW8yX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWdwaW8gLT0gQVUxWFhYX0dQSU9fQkFTRTsKLQlncGlvMi0+ZGlyID0gKDB4MDEgPDwgZ3BpbykgfCAodmFsdWUgPDwgZ3Bpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkgKi8KLQotc3RhdGljIGludCBhdTF4eHhfZ3BpbzFfcmVhZCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiAoZ3BpbzEtPnBpbnN0YXRlcmQgPj4gZ3BpbykgJiAweDAxOwotfQotCi1zdGF0aWMgdm9pZCBhdTF4eHhfZ3BpbzFfd3JpdGUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWlmICh2YWx1ZSkKLQkJZ3BpbzEtPm91dHB1dHNldCA9ICgweDAxIDw8IGdwaW8pOwotCWVsc2UKLQkJLyogT3V0cHV0IGEgemVybyAqLwotCQlncGlvMS0+b3V0cHV0Y2xyID0gKDB4MDEgPDwgZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQotewotCWdwaW8xLT5waW5pbnB1dGVuID0gKDB4MDEgPDwgZ3Bpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWdwaW8xLT50cmlvdXRjbHIgPSAoMHgwMSAmIGdwaW8pOwotCXJldHVybiAwOwotfQotCi1pbnQgYXUxeHh4X2dwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JaWYgKGdwaW8gPj0gQVUxWFhYX0dQSU9fQkFTRSkKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQotCQlyZXR1cm4gMDsKLSNlbHNlCi0JCXJldHVybiBhdTF4eHhfZ3BpbzJfcmVhZChncGlvKTsKLSNlbmRpZgotCWVsc2UKLQkJcmV0dXJuIGF1MXh4eF9ncGlvMV9yZWFkKGdwaW8pOwotfQotRVhQT1JUX1NZTUJPTChhdTF4eHhfZ3Bpb19nZXRfdmFsdWUpOwotCi12b2lkIGF1MXh4eF9ncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCi17Ci0JaWYgKGdwaW8gPj0gQVUxWFhYX0dQSU9fQkFTRSkKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQotCQk7Ci0jZWxzZQotCQlhdTF4eHhfZ3BpbzJfd3JpdGUoZ3BpbywgdmFsdWUpOwotI2VuZGlmCi0JZWxzZQotCQlhdTF4eHhfZ3BpbzFfd3JpdGUoZ3BpbywgdmFsdWUpOwotfQotRVhQT1JUX1NZTUJPTChhdTF4eHhfZ3Bpb19zZXRfdmFsdWUpOwotCi1pbnQgYXUxeHh4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCi17Ci0JaWYgKGdwaW8gPj0gQVUxWFhYX0dQSU9fQkFTRSkKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLSNlbHNlCi0JCXJldHVybiBhdTF4eHhfZ3BpbzJfZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotI2VuZGlmCi0KLQlyZXR1cm4gYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLX0KLUVYUE9SVF9TWU1CT0woYXUxeHh4X2dwaW9fZGlyZWN0aW9uX2lucHV0KTsKLQotaW50IGF1MXh4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWlmIChncGlvID49IEFVMVhYWF9HUElPX0JBU0UpCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZWxzZQotCQlyZXR1cm4gYXUxeHh4X2dwaW8yX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgdmFsdWUpOwotI2VuZGlmCi0KLQlyZXR1cm4gYXUxeHh4X2dwaW8xX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgdmFsdWUpOwotfQotRVhQT1JUX1NZTUJPTChhdTF4eHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NsZWVwZXIuUyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NsZWVwZXIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzY2YwMi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9zbGVlcGVyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyIEVtYmVkZGVkIEVkZ2UsIExMQwotICogQXV0aG9yOiBkYW5AZW1iZWRkZWRlZGdlLmNvbQotICoKLSAqIFNsZWVwIGhlbHBlciBmb3IgQXUxeHh4IHNsZWVwIG1vZGUuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCWl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YJdGhlIEdOVSBHZW5lcmFsCSBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vcmVnZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL3N0YWNrZnJhbWUuaD4KLQotCS50ZXh0Ci0JLnNldAltYWNybwotCS5zZXQJbm9hdAotCS5hbGlnbgk1Ci0KLS8qIFNhdmUgYWxsIG9mIHRoZSBwcm9jZXNzb3IgZ2VuZXJhbCByZWdpc3RlcnMgYW5kIGdvIHRvIHNsZWVwLgotICogQSB3YWtldXAgY29uZGl0aW9uIHdpbGwgZ2V0IHVzIGJhY2sgaGVyZSB0byByZXN0b3JlIHRoZSByZWdpc3RlcnMuCi0gKi8KLUxFQUYoc2F2ZV9hbmRfc2xlZXApCi0KLQlzdWJ1CXNwLCBQVF9TSVpFCi0Jc3cJJDEsIFBUX1IxKHNwKQotCXN3CSQyLCBQVF9SMihzcCkKLQlzdwkkMywgUFRfUjMoc3ApCi0Jc3cJJDQsIFBUX1I0KHNwKQotCXN3CSQ1LCBQVF9SNShzcCkKLQlzdwkkNiwgUFRfUjYoc3ApCi0Jc3cJJDcsIFBUX1I3KHNwKQotCXN3CSQ4LCBQVF9SOChzcCkKLQlzdwkkOSwgUFRfUjkoc3ApCi0Jc3cJJDEwLCBQVF9SMTAoc3ApCi0Jc3cJJDExLCBQVF9SMTEoc3ApCi0Jc3cJJDEyLCBQVF9SMTIoc3ApCi0Jc3cJJDEzLCBQVF9SMTMoc3ApCi0Jc3cJJDE0LCBQVF9SMTQoc3ApCi0Jc3cJJDE1LCBQVF9SMTUoc3ApCi0Jc3cJJDE2LCBQVF9SMTYoc3ApCi0Jc3cJJDE3LCBQVF9SMTcoc3ApCi0Jc3cJJDE4LCBQVF9SMTgoc3ApCi0Jc3cJJDE5LCBQVF9SMTkoc3ApCi0Jc3cJJDIwLCBQVF9SMjAoc3ApCi0Jc3cJJDIxLCBQVF9SMjEoc3ApCi0Jc3cJJDIyLCBQVF9SMjIoc3ApCi0Jc3cJJDIzLCBQVF9SMjMoc3ApCi0Jc3cJJDI0LCBQVF9SMjQoc3ApCi0Jc3cJJDI1LCBQVF9SMjUoc3ApCi0Jc3cJJDI2LCBQVF9SMjYoc3ApCi0Jc3cJJDI3LCBQVF9SMjcoc3ApCi0Jc3cJJDI4LCBQVF9SMjgoc3ApCi0Jc3cJJDI5LCBQVF9SMjkoc3ApCi0Jc3cJJDMwLCBQVF9SMzAoc3ApCi0Jc3cJJDMxLCBQVF9SMzEoc3ApCi0JbWZjMAlrMCwgQ1AwX1NUQVRVUwotCXN3CWswLCAweDIwKHNwKQotCW1mYzAJazAsIENQMF9DT05URVhUCi0Jc3cJazAsIDB4MWMoc3ApCi0JbWZjMAlrMCwgQ1AwX1BBR0VNQVNLCi0Jc3cJazAsIDB4MTgoc3ApCi0JbWZjMAlrMCwgQ1AwX0NPTkZJRwotCXN3CWswLCAweDE0KHNwKQotCi0JLyogTm93IHNldCB1cCB0aGUgc2NyYXRjaCByZWdpc3RlcnMgc28gdGhlIGJvb3Qgcm9tIHdpbGwKLQkgKiByZXR1cm4gdG8gdGhpcyBwb2ludCB1cG9uIHdha2V1cC4KLQkgKi8KLQlsYQlrMCwgMWYKLQlsdWkJazEsIDB4YjE5MAotCW9yaQlrMSwgMHgxOAotCXN3CXNwLCAwKGsxKQotCW9yaSAJazEsIDB4MWMKLQlzdwlrMCwgMChrMSkKLQotLyogUHV0IFNEUkFNIGludG8gc2VsZiByZWZyZXNoLiAgUHJlbG9hZCBpbnN0cnVjdGlvbnMgaW50byBjYWNoZSwKLSAqIGlzc3VlIGEgcHJlY2hhcmdlLCB0aGVuIGF1dG8gcmVmcmVzaCwgdGhlbiBzbGVlcCBjb21tYW5kcyB0byBpdC4KLSAqLwotIAlsYQl0MCwgc2RzbGVlcAotCS5zZXQJbWlwczMKLSAJY2FjaGUJMHgxNCwgMCh0MCkKLSAJY2FjaGUJMHgxNCwgMzIodDApCi0gCWNhY2hlCTB4MTQsIDY0KHQwKQotIAljYWNoZQkweDE0LCA5Nih0MCkKLQkuc2V0CW1pcHMwCi0KLXNkc2xlZXA6Ci0JbHVpIAlrMCwgMHhiNDAwCi0Jc3cJemVybywgMHgwMDFjKGswKQkvKiBQcmVjaGFyZ2UgKi8KLQlzdwl6ZXJvLCAweDAwMjAoazApCS8qIEF1dG8gcmVmcmVzaCAqLwotCXN3CXplcm8sIDB4MDAzMChrMCkJLyogU0RSQU0gc2xlZXAgKi8KLQlzeW5jCi0KLQlsdWkgCWsxLCAweGIxOTAKLQlzdwl6ZXJvLCAweDAwNzgoazEpCS8qIGdldCByZWFkeSAgdG8gc2xlZXAgKi8KLQlzeW5jCi0Jc3cJemVybywgMHgwMDdjKGsxKQkvKiBQdXQgcHJvY2Vzc29yIHRvIHNsZWVwICovCi0Jc3luYwotCi0JLyogVGhpcyBpcyB3aGVyZSB3ZSByZXR1cm4gdXBvbiB3YWtldXAuCi0JICogUmVsb2FkIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIGFuZCByZXR1cm4uCi0JICovCi0xOglub3AKLQlsdwlrMCwgMHgyMChzcCkKLQltdGMwCWswLCBDUDBfU1RBVFVTCi0JbHcJazAsIDB4MWMoc3ApCi0JbXRjMAlrMCwgQ1AwX0NPTlRFWFQKLQlsdwlrMCwgMHgxOChzcCkKLQltdGMwCWswLCBDUDBfUEFHRU1BU0sKLQlsdwlrMCwgMHgxNChzcCkKLQltdGMwCWswLCBDUDBfQ09ORklHCi0KLQkvKiBXZSBuZWVkIHRvIGNhdGNoIHRoZSBlYWxyeSBBbGNoZW15IFNPQ3Mgd2l0aAotCSAqIHRoZSB3cml0ZS1vbmx5IENvbmZpZ1tPRF0gYml0IGFuZCBzZXQgaXQgYmFjayB0byBvbmUuLi4KLQkgKi8KLQlqYWwJYXUxeDAwX2ZpeHVwX2NvbmZpZ19vZAotCWx3CSQxLCBQVF9SMShzcCkKLQlsdwkkMiwgUFRfUjIoc3ApCi0JbHcJJDMsIFBUX1IzKHNwKQotCWx3CSQ0LCBQVF9SNChzcCkKLQlsdwkkNSwgUFRfUjUoc3ApCi0JbHcJJDYsIFBUX1I2KHNwKQotCWx3CSQ3LCBQVF9SNyhzcCkKLQlsdwkkOCwgUFRfUjgoc3ApCi0JbHcJJDksIFBUX1I5KHNwKQotCWx3CSQxMCwgUFRfUjEwKHNwKQotCWx3CSQxMSwgUFRfUjExKHNwKQotCWx3CSQxMiwgUFRfUjEyKHNwKQotCWx3CSQxMywgUFRfUjEzKHNwKQotCWx3CSQxNCwgUFRfUjE0KHNwKQotCWx3CSQxNSwgUFRfUjE1KHNwKQotCWx3CSQxNiwgUFRfUjE2KHNwKQotCWx3CSQxNywgUFRfUjE3KHNwKQotCWx3CSQxOCwgUFRfUjE4KHNwKQotCWx3CSQxOSwgUFRfUjE5KHNwKQotCWx3CSQyMCwgUFRfUjIwKHNwKQotCWx3CSQyMSwgUFRfUjIxKHNwKQotCWx3CSQyMiwgUFRfUjIyKHNwKQotCWx3CSQyMywgUFRfUjIzKHNwKQotCWx3CSQyNCwgUFRfUjI0KHNwKQotCWx3CSQyNSwgUFRfUjI1KHNwKQotCWx3CSQyNiwgUFRfUjI2KHNwKQotCWx3CSQyNywgUFRfUjI3KHNwKQotCWx3CSQyOCwgUFRfUjI4KHNwKQotCWx3CSQyOSwgUFRfUjI5KHNwKQotCWx3CSQzMCwgUFRfUjMwKHNwKQotCWx3CSQzMSwgUFRfUjMxKHNwKQotCWFkZGl1CXNwLCBQVF9TSVpFCi0KLQlqcglyYQotRU5EKHNhdmVfYW5kX3NsZWVwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2JjbTQ3eHgvZ3Bpby5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvZ3Bpby5jCmluZGV4IGY1YTUzYWMuLjliNzk4ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L2dwaW8uYworKysgYi9hcmNoL21pcHMvYmNtNDd4eC9ncGlvLmMKQEAgLTEyLDY4ICsxMiw1MSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLWJjbTQ3eHgvYmNtNDd4eC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWJjbTQ3eHgvZ3Bpby5oPgogCi1pbnQgYmNtNDd4eF9ncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQorI2lmIChCQ000N1hYX0NISVBDT19HUElPX0xJTkVTID4gQkNNNDdYWF9FWFRJRl9HUElPX0xJTkVTKQorc3RhdGljIERFQ0xBUkVfQklUTUFQKGdwaW9faW5fdXNlLCBCQ000N1hYX0NISVBDT19HUElPX0xJTkVTKTsKKyNlbHNlCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoZ3Bpb19pbl91c2UsIEJDTTQ3WFhfRVhUSUZfR1BJT19MSU5FUyk7CisjZW5kaWYKKworaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICp0YWcpCiB7Ci0JaWYgKHNzYl9iY200N3h4LmNoaXBjby5kZXYpCisJaWYgKHNzYl9jaGlwY29fYXZhaWxhYmxlKCZzc2JfYmNtNDd4eC5jaGlwY28pICYmCisJICAgICgodW5zaWduZWQpZ3BpbyA+PSBCQ000N1hYX0NISVBDT19HUElPX0xJTkVTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3NiX2V4dGlmX2F2YWlsYWJsZSgmc3NiX2JjbTQ3eHguZXh0aWYpICYmCisJICAgICgodW5zaWduZWQpZ3BpbyA+PSBCQ000N1hYX0VYVElGX0dQSU9fTElORVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KGdwaW8sIGdwaW9faW5fdXNlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQoreworCWlmIChzc2JfY2hpcGNvX2F2YWlsYWJsZSgmc3NiX2JjbTQ3eHguY2hpcGNvKSAmJgorCSAgICAoKHVuc2lnbmVkKWdwaW8gPj0gQkNNNDdYWF9DSElQQ09fR1BJT19MSU5FUykpCisJCXJldHVybjsKKworCWlmIChzc2JfZXh0aWZfYXZhaWxhYmxlKCZzc2JfYmNtNDd4eC5leHRpZikgJiYKKwkgICAgKCh1bnNpZ25lZClncGlvID49IEJDTTQ3WFhfRVhUSUZfR1BJT19MSU5FUykpCisJCXJldHVybjsKKworCWNsZWFyX2JpdChncGlvLCBncGlvX2luX3VzZSk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZnJlZSk7CisKK2ludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQoreworCWlmIChzc2JfY2hpcGNvX2F2YWlsYWJsZSgmc3NiX2JjbTQ3eHguY2hpcGNvKSkKIAkJcmV0dXJuIHNzYl9taXBzX2lycShzc2JfYmNtNDd4eC5jaGlwY28uZGV2KSArIDI7Ci0JZWxzZSBpZiAoc3NiX2JjbTQ3eHguZXh0aWYuZGV2KQorCWVsc2UgaWYgKHNzYl9leHRpZl9hdmFpbGFibGUoJnNzYl9iY200N3h4LmV4dGlmKSkKIAkJcmV0dXJuIHNzYl9taXBzX2lycShzc2JfYmNtNDd4eC5leHRpZi5kZXYpICsgMjsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmNtNDd4eF9ncGlvX3RvX2lycSk7Ci0KLWludCBiY200N3h4X2dwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JaWYgKHNzYl9iY200N3h4LmNoaXBjby5kZXYpCi0JCXJldHVybiBzc2JfY2hpcGNvX2dwaW9faW4oJnNzYl9iY200N3h4LmNoaXBjbywgMSA8PCBncGlvKTsKLQllbHNlIGlmIChzc2JfYmNtNDd4eC5leHRpZi5kZXYpCi0JCXJldHVybiBzc2JfZXh0aWZfZ3Bpb19pbigmc3NiX2JjbTQ3eHguZXh0aWYsIDEgPDwgZ3Bpbyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJjbTQ3eHhfZ3Bpb19nZXRfdmFsdWUpOwotCi12b2lkIGJjbTQ3eHhfZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWlmIChzc2JfYmNtNDd4eC5jaGlwY28uZGV2KQotCQlzc2JfY2hpcGNvX2dwaW9fb3V0KCZzc2JfYmNtNDd4eC5jaGlwY28sCi0JCQkJICAgIDEgPDwgZ3BpbywKLQkJCQkgICAgdmFsdWUgPyAxIDw8IGdwaW8gOiAwKTsKLQllbHNlIGlmIChzc2JfYmNtNDd4eC5leHRpZi5kZXYpCi0JCXNzYl9leHRpZl9ncGlvX291dCgmc3NiX2JjbTQ3eHguZXh0aWYsCi0JCQkJICAgMSA8PCBncGlvLAotCQkJCSAgIHZhbHVlID8gMSA8PCBncGlvIDogMCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChiY200N3h4X2dwaW9fc2V0X3ZhbHVlKTsKLQotaW50IGJjbTQ3eHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKLXsKLQlpZiAoc3NiX2JjbTQ3eHguY2hpcGNvLmRldiAmJiAoZ3BpbyA8IEJDTTQ3WFhfQ0hJUENPX0dQSU9fTElORVMpKQotCQlzc2JfY2hpcGNvX2dwaW9fb3V0ZW4oJnNzYl9iY200N3h4LmNoaXBjbywKLQkJCQkgICAgICAxIDw8IGdwaW8sIDApOwotCWVsc2UgaWYgKHNzYl9iY200N3h4LmV4dGlmLmRldiAmJiAoZ3BpbyA8IEJDTTQ3WFhfRVhUSUZfR1BJT19MSU5FUykpCi0JCXNzYl9leHRpZl9ncGlvX291dGVuKCZzc2JfYmNtNDd4eC5leHRpZiwKLQkJCQkgICAgIDEgPDwgZ3BpbywgMCk7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJjbTQ3eHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQpOwotCi1pbnQgYmNtNDd4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWJjbTQ3eHhfZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOwotCi0JaWYgKHNzYl9iY200N3h4LmNoaXBjby5kZXYgJiYgKGdwaW8gPCBCQ000N1hYX0NISVBDT19HUElPX0xJTkVTKSkKLQkJc3NiX2NoaXBjb19ncGlvX291dGVuKCZzc2JfYmNtNDd4eC5jaGlwY28sCi0JCQkJICAgICAgMSA8PCBncGlvLCAxIDw8IGdwaW8pOwotCWVsc2UgaWYgKHNzYl9iY200N3h4LmV4dGlmLmRldiAmJiAoZ3BpbyA8IEJDTTQ3WFhfRVhUSUZfR1BJT19MSU5FUykpCi0JCXNzYl9leHRpZl9ncGlvX291dGVuKCZzc2JfYmNtNDd4eC5leHRpZiwKLQkJCQkgICAgIDEgPDwgZ3BpbywgMSA8PCBncGlvKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYmNtNDd4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoZ3Bpb190b19pcnEpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwppbmRleCA4ZDM2ZjE4Li4yZjU4MGZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZW1iZWRkZWQuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KQEAgLTQxLDcgKzQyLDcgQEAKIAlwcmludGsoS0VSTl9BTEVSVCAiUGxlYXNlIHN0YW5kIGJ5IHdoaWxlIHJlYm9vdGluZyB0aGUgc3lzdGVtLi4uXG4iKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCS8qIFNldCB0aGUgd2F0Y2hkb2cgdGltZXIgdG8gcmVzZXQgaW1tZWRpYXRlbHkgKi8KLQlzc2JfY2hpcGNvX3dhdGNoZG9nX3RpbWVyX3NldCgmc3NiX2JjbTQ3eHguY2hpcGNvLCAxKTsKKwlzc2Jfd2F0Y2hkb2dfdGltZXJfc2V0KCZzc2JfYmNtNDd4eCwgMSk7CiAJd2hpbGUgKDEpCiAJCWNwdV9yZWxheCgpOwogfQpAQCAtNTAsNyArNTEsNyBAQAogewogCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgd2F0Y2hkb2cgYW5kIHNwaW4gZm9yZXZlciAqLwogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0Jc3NiX2NoaXBjb193YXRjaGRvZ190aW1lcl9zZXQoJnNzYl9iY200N3h4LmNoaXBjbywgMCk7CisJc3NiX3dhdGNoZG9nX3RpbWVyX3NldCgmc3NiX2JjbTQ3eHgsIDApOwogCXdoaWxlICgxKQogCQljcHVfcmVsYXgoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3dndDYzNHUuYyBiL2FyY2gvbWlwcy9iY200N3h4L3dndDYzNHUuYwppbmRleCBkMWQ5MGM5ZS4uZWYwMGU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvd2d0NjM0dS5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L3dndDYzNHUuYwpAQCAtMTEsNiArMTEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYmNtNDd4eC9iY200N3h4Lmg+CiAKIC8qIEdQSU8gZGVmaW5pdGlvbnMgZm9yIHRoZSBXR1Q2MzRVICovCkBAIC05OSw2ICsxMDIsMzAgQEAKIAkmd2d0NjM0dV9ncGlvX2xlZHMsCiB9OwogCitzdGF0aWMgaXJxcmV0dXJuX3QgZ3Bpb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaWdub3JlZCkKK3sKKwlpbnQgc3RhdGU7CisKKwkvKiBJbnRlcnJ1cHRzIGFyZSBzaGFyZWQsIGNoZWNrIGlmIHRoZSBjdXJyZW50IG9uZSBpcworCSAgIGEgR1BJTyBpbnRlcnJ1cHQuICovCisJaWYgKCFzc2JfY2hpcGNvX2lycV9zdGF0dXMoJnNzYl9iY200N3h4LmNoaXBjbywKKwkJCQkgICBTU0JfQ0hJUENPX0lSUV9HUElPKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3RhdGUgPSBncGlvX2dldF92YWx1ZShXR1Q2MzRVX0dQSU9fUkVTRVQpOworCisJLyogSW50ZXJydXB0IGFyZSBsZXZlbCB0cmlnZ2VyZWQsIHJldmVydCB0aGUgaW50ZXJydXB0IHBvbGFyaXR5CisJICAgdG8gY2xlYXIgdGhlIGludGVycnVwdC4gKi8KKwlncGlvX3BvbGFyaXR5KFdHVDYzNFVfR1BJT19SRVNFVCwgc3RhdGUpOworCisJaWYgKCFzdGF0ZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJSZXNldCBidXR0b24gcHJlc3NlZCIpOworCQljdHJsX2FsdF9kZWwoKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHdndDYzNHVfaW5pdCh2b2lkKQogewogCS8qIFRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGRldGVjdCB0aGF0IHdlIGFyZSBydW5uaW5nIG9uIGEgV0dUNjM0VQpAQCAtMTEyLDYgKzEzOSwxOSBAQAogCSAgICAoKGV0MG1hY1sxXSA9PSAweDA5ICYmIGV0MG1hY1syXSA9PSAweDViKSB8fAogCSAgICAgKGV0MG1hY1sxXSA9PSAweDBmICYmIGV0MG1hY1syXSA9PSAweGI1KSkpIHsKIAkJc3RydWN0IHNzYl9taXBzY29yZSAqbWNvcmUgPSAmc3NiX2JjbTQ3eHgubWlwc2NvcmU7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV0dUNjM0VSBtYWNoaW5lIGRldGVjdGVkLlxuIik7CisKKwkJaWYgKCFyZXF1ZXN0X2lycShncGlvX3RvX2lycShXR1Q2MzRVX0dQSU9fUkVTRVQpLAorCQkJCSBncGlvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICJXR1Q2MzRVIEdQSU8iLCAmc3NiX2JjbTQ3eHguY2hpcGNvKSkgeworCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoV0dUNjM0VV9HUElPX1JFU0VUKTsKKwkJCWdwaW9faW50bWFzayhXR1Q2MzRVX0dQSU9fUkVTRVQsIDEpOworCQkJc3NiX2NoaXBjb19pcnFfbWFzaygmc3NiX2JjbTQ3eHguY2hpcGNvLAorCQkJCQkgICAgU1NCX0NISVBDT19JUlFfR1BJTywKKwkJCQkJICAgIFNTQl9DSElQQ09fSVJRX0dQSU8pOworCQl9CisKIAkJd2d0NjM0dV9mbGFzaF9kYXRhLndpZHRoID0gbWNvcmUtPmZsYXNoX2J1c3dpZHRoOwogCQl3Z3Q2MzR1X2ZsYXNoX3Jlc291cmNlLnN0YXJ0ID0gbWNvcmUtPmZsYXNoX3dpbmRvdzsKIAkJd2d0NjM0dV9mbGFzaF9yZXNvdXJjZS5lbmQgPSBtY29yZS0+Zmxhc2hfd2luZG93CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZW1tYTJyaC9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvZW1tYTJyaC9jb21tb24vaXJxLmMKaW5kZXggZDk1NjA0Ny4uOTFjYmQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycS5jCisrKyBiL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnEuYwpAQCAtMjksNyArMjksNiBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL3Byb20uYyBiL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9wcm9tLmMKaW5kZXggNWU5MmIzYS4uZTE0YTJlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvZW1tYTJyaC9jb21tb24vcHJvbS5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgogI2luY2x1ZGUgPGFzbS9lbW1hMnJoL2VtbWEycmguaD4KLSNpbmNsdWRlIDxhc20vZGVidWcuaD4KIAogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvcGxhdGZvcm0uYwppbmRleCBkNzA2MjdkLi5mYjljZGEyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL3BsYXRmb3JtLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogCiAjaW5jbHVkZSA8YXNtL2VtbWEycmgvZW1tYTJyaC5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL0tidWlsZCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvS2J1aWxkCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FiaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FiaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2FiaS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYWJpLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYWRkcnNwYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9hZGRyc3BhY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hc20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc20uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9hc20uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLTMyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby0zMi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hc21tYWNyby02NC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTY0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8tNjQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLTY0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXNtbWFjcm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2FzbW1hY3JvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYXV4dmVjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXV4dmVjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvYXV4dmVjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdXh2ZWMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9iYXJyaWVyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYmFycmllci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2JhcnJpZXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JhcnJpZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9iY2FjaGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9iY2FjaGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9iY2FjaGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JjYWNoZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JpdG9wcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYml0b3BzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ib290aW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2Jvb3RpbmZvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9ib290aW5mby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2JyYW5jaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2JyYW5jaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2JyYW5jaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYnJhbmNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYnJlYWsuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9icmVhay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2JyZWFrLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9icmVhay5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2J1Zy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2J1Zy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vYnVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYnVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J1Z3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9idWdzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9idWdzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYnl0ZW9yZGVyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvYnl0ZW9yZGVyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jYWNoZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY2FjaGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVjdGwuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZWN0bC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2NhY2hlY3RsLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZWN0bC5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2IxZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwLCAwMSwgMDIsIDAzIGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2lmbmRlZiBfQVNNX0NBQ0hFRkxVU0hfSAorI2RlZmluZSBfQVNNX0NBQ0hFRkxVU0hfSAorCisvKiBLZWVwIGluY2x1ZGVzIHRoZSBzYW1lIGFjcm9zcyBhcmNoZXMuICAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgorCisvKiBDYWNoZSBmbHVzaGluZzoKKyAqCisgKiAgLSBmbHVzaF9jYWNoZV9hbGwoKSBmbHVzaGVzIGVudGlyZSBjYWNoZQorICogIC0gZmx1c2hfY2FjaGVfbW0obW0pIGZsdXNoZXMgdGhlIHNwZWNpZmllZCBtbSBjb250ZXh0J3MgY2FjaGUgbGluZXMKKyAqICAtIGZsdXNoX2NhY2hlX2R1cCBtbShtbSkgaGFuZGxlcyBjYWNoZSBmbHVzaGluZyB3aGVuIGZvcmtpbmcKKyAqICAtIGZsdXNoX2NhY2hlX3BhZ2UobW0sIHZtYWRkciwgcGZuKSBmbHVzaGVzIGEgc2luZ2xlIHBhZ2UKKyAqICAtIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkgZmx1c2hlcyBhIHJhbmdlIG9mIHBhZ2VzCisgKiAgLSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkgZmx1c2ggYSByYW5nZSBvZiBpbnN0cnVjdGlvbnMKKyAqICAtIGZsdXNoX2RjYWNoZV9wYWdlKHBnKSBmbHVzaGVzKHdiYWNrJmludmFsaWRhdGVzKSBhIHBhZ2UgZm9yIGRjYWNoZQorICoKKyAqIE1JUFMgc3BlY2lmaWMgZmx1c2ggb3BlcmF0aW9uczoKKyAqCisgKiAgLSBmbHVzaF9jYWNoZV9zaWd0cmFtcCgpIGZsdXNoIHNpZ25hbCB0cmFtcG9saW5lCisgKiAgLSBmbHVzaF9pY2FjaGVfYWxsKCkgZmx1c2ggdGhlIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZQorICogIC0gZmx1c2hfZGF0YV9jYWNoZV9wYWdlKCkgZmx1c2hlcyBhIHBhZ2UgZnJvbSB0aGUgZGF0YSBjYWNoZQorICovCitleHRlcm4gdm9pZCAoKmZsdXNoX2NhY2hlX2FsbCkodm9pZCk7CitleHRlcm4gdm9pZCAoKl9fZmx1c2hfY2FjaGVfYWxsKSh2b2lkKTsKK2V4dGVybiB2b2lkICgqZmx1c2hfY2FjaGVfbW0pKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQlkbyB7ICh2b2lkKSAobW0pOyB9IHdoaWxlICgwKQorZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9yYW5nZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9wYWdlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlLCB1bnNpZ25lZCBsb25nIHBmbik7CitleHRlcm4gdm9pZCBfX2ZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMgfHwgIWNwdV9oYXNfaWNfZmlsbHNfZl9kYykKKwkJX19mbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworfQorCisjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBUkNIX0hBU19GTFVTSF9BTk9OX1BBR0UKK2V4dGVybiB2b2lkIF9fZmx1c2hfYW5vbl9wYWdlKHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2Fub25fcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2bWFkZHIpCit7CisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcyAmJiBQYWdlQW5vbihwYWdlKSkKKwkJX19mbHVzaF9hbm9uX3BhZ2UocGFnZSwgdm1hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2ljYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCXN0cnVjdCBwYWdlICpwYWdlKQoreworfQorCitleHRlcm4gdm9pZCAoKmZsdXNoX2ljYWNoZV9yYW5nZSkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgKCpsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworZXh0ZXJuIHZvaWQgKCpfX2ZsdXNoX2NhY2hlX3ZtYXApKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGVfdm1hcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKQorCQlfX2ZsdXNoX2NhY2hlX3ZtYXAoKTsKK30KKworZXh0ZXJuIHZvaWQgKCpfX2ZsdXNoX2NhY2hlX3Z1bm1hcCkodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV92dW5tYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKKwkJX19mbHVzaF9jYWNoZV92dW5tYXAoKTsKK30KKworZXh0ZXJuIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAorCXVuc2lnbmVkIGxvbmcgbGVuKTsKKworZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCisJdW5zaWduZWQgbG9uZyBsZW4pOworCitleHRlcm4gdm9pZCAoKmZsdXNoX2NhY2hlX3NpZ3RyYW1wKSh1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHZvaWQgKCpmbHVzaF9pY2FjaGVfYWxsKSh2b2lkKTsKK2V4dGVybiB2b2lkICgqbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlKSh2b2lkICogYWRkcik7CitleHRlcm4gdm9pZCAoKmZsdXNoX2RhdGFfY2FjaGVfcGFnZSkodW5zaWduZWQgbG9uZyBhZGRyKTsKKworLyoKKyAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhZ2UgcG9pbnRlZCB0byBieSBhIHB0ZQorICogaXMgZGlydHkgYW5kIHJlcXVpcmVzIGNsZWFuaW5nIGJlZm9yZSByZXR1cm5pbmcgaXQgdG8gdGhlIHVzZXIuCisgKi8KKyNkZWZpbmUgUEdfZGNhY2hlX2RpcnR5CQkJUEdfYXJjaF8xCisKKyNkZWZpbmUgUGFnZV9kY2FjaGVfZGlydHkocGFnZSkJCVwKKwl0ZXN0X2JpdChQR19kY2FjaGVfZGlydHksICYocGFnZSktPmZsYWdzKQorI2RlZmluZSBTZXRQYWdlRGNhY2hlRGlydHkocGFnZSkJXAorCXNldF9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmKHBhZ2UpLT5mbGFncykKKyNkZWZpbmUgQ2xlYXJQYWdlRGNhY2hlRGlydHkocGFnZSkJXAorCWNsZWFyX2JpdChQR19kY2FjaGVfZGlydHksICYocGFnZSktPmZsYWdzKQorCisvKiBSdW4ga2VybmVsIGNvZGUgdW5jYWNoZWQsIHVzZWZ1bCBmb3IgY2FjaGUgcHJvYmluZyBmdW5jdGlvbnMuICovCit1bnNpZ25lZCBsb25nIHJ1bl91bmNhY2hlZCh2b2lkICpmdW5jKTsKKworZXh0ZXJuIHZvaWQgKmttYXBfY29oZXJlbnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdm9pZCBrdW5tYXBfY29oZXJlbnQodm9pZCk7CisKKyNlbmRpZiAvKiBfQVNNX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jYWNoZW9wcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlb3BzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY2FjaGVvcHMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlb3BzLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jZXZ0LXI0ay5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NldnQtcjRrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0MzI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jZXZ0LXI0ay5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS2V2aW4gRC4gS2lzc2VsbAorICovCisKKy8qCisgKiBEZWZpbml0aW9ucyB1c2VkIGZvciBjb21tb24gZXZlbnQgdGltZXIgaW1wbGVtZW50YXRpb24KKyAqIGZvciBNSVBTIDRLLXR5cGUgcHJvY2Vzc29ycyBhbmQgdGhlaXIgTUlQUyBNVCB2YXJpYW50cy4KKyAqIEF2b2lkcyB1bnNpZ2h0bHkgZXh0ZXJuIGRlY2xhcmF0aW9ucyBpbiBDIGZpbGVzLgorICovCisjaWZuZGVmIF9fQVNNX0NFVlRfUjRLX0gKKyNkZWZpbmUgX19BU01fQ0VWVF9SNEtfSAorCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbWlwc19jbG9ja2V2ZW50X2RldmljZSk7CisKK3ZvaWQgbWlwc19ldmVudF9oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CitpbnQgYzBfY29tcGFyZV9pbnRfdXNhYmxlKHZvaWQpOwordm9pZCBtaXBzX3NldF9jbG9ja19tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKK2lycXJldHVybl90IGMwX2NvbXBhcmVfaW50ZXJydXB0KGludCwgdm9pZCAqKTsKKworZXh0ZXJuIHN0cnVjdCBpcnFhY3Rpb24gYzBfY29tcGFyZV9pcnFhY3Rpb247CitleHRlcm4gaW50IGNwMF90aW1lcl9pcnFfaW5zdGFsbGVkOworCisvKgorICogUG9zc2libHkgaGFuZGxlIGEgcGVyZm9ybWFuY2UgY291bnRlciBpbnRlcnJ1cHQuCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGltZXIgaW50ZXJydXB0IHNob3VsZCBub3QgYmUgY2hlY2tlZAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9wZXJmX2lycShpbnQgcjIpCit7CisJLyoKKwkgKiBUaGUgcGVyZm9ybWFuY2UgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZQorCSAqIHRpbWVyIGludGVycnVwdCAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKS4gSWYgaXQgaXMgYW5kIGEKKwkgKiBwZXJmb3JtYW5jZSBjb3VudGVyIGhhcyBvdmVyZmxvd2VkIChwZXJmX2lycSgpID09IElSUV9IQU5ETEVEKQorCSAqIGFuZCB3ZSBjYW4ndCByZWxpYWJseSBkZXRlcm1pbmUgaWYgYSBjb3VudGVyIGludGVycnVwdCBoYXMgYWxzbworCSAqIGhhcHBlbmVkICghcjIpIHRoZW4gZG9uJ3QgY2hlY2sgZm9yIGEgdGltZXIgaW50ZXJydXB0LgorCSAqLworCXJldHVybiAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKSAmJgorCQlwZXJmX2lycSgpID09IElSUV9IQU5ETEVEICYmCisJCSFyMjsKK30KKworI2VuZGlmIC8qIF9fQVNNX0NFVlRfUjRLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY2hlY2tzdW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2NoZWNrc3VtLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NtcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NtcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2NtcC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vY21wLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY21weGNoZy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NtcHhjaGcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9jbXB4Y2hnLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LXNpZ25hbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBhdC1zaWduYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9jb21wYXQtc2lnbmFsLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb21wYXQtc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY29tcGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb21wYXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jb21waWxlci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBpbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY29tcGlsZXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBpbGVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWZlYXR1cmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY3B1LWZlYXR1cmVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1pbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDRjZDhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1pbmZvLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCBXYWxkb3JmIEdNQkgKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwMyBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE0uIEFudG9pbmUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIE1hY2llaiBXLiBSb3p5Y2tpCisgKi8KKyNpZm5kZWYgX19BU01fQ1BVX0lORk9fSAorI2RlZmluZSBfX0FTTV9DUFVfSU5GT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKy8qCisgKiBEZXNjcmlwdG9yIGZvciBhIGNhY2hlCisgKi8KK3N0cnVjdCBjYWNoZV9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgd2F5c2l6ZTsJLyogQnl0ZXMgcGVyIHdheSAqLworCXVuc2lnbmVkIHNob3J0IHNldHM7CS8qIE51bWJlciBvZiBsaW5lcyBwZXIgc2V0ICovCisJdW5zaWduZWQgY2hhciB3YXlzOwkvKiBOdW1iZXIgb2Ygd2F5cyAqLworCXVuc2lnbmVkIGNoYXIgbGluZXN6OwkvKiBTaXplIG9mIGxpbmUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHdheWJpdDsJLyogQml0cyB0byBzZWxlY3QgaW4gYSBjYWNoZSBzZXQgKi8KKwl1bnNpZ25lZCBjaGFyIGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIGNhY2hlIHByb3BlcnRpZXMgKi8KK307CisKKy8qCisgKiBGbGFnIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTUlQU19DQUNIRV9OT1RfUFJFU0VOVAkweDAwMDAwMDAxCisjZGVmaW5lIE1JUFNfQ0FDSEVfVlRBRwkJMHgwMDAwMDAwMgkvKiBWaXJ0dWFsbHkgdGFnZ2VkIGNhY2hlICovCisjZGVmaW5lIE1JUFNfQ0FDSEVfQUxJQVNFUwkweDAwMDAwMDA0CS8qIENhY2hlIGNvdWxkIGhhdmUgYWxpYXNlcyAqLworI2RlZmluZSBNSVBTX0NBQ0hFX0lDX0ZfREMJMHgwMDAwMDAwOAkvKiBJYyBjYW4gcmVmaWxsIGZyb20gRC1jYWNoZSAqLworI2RlZmluZSBNSVBTX0lDX1NOT09QU19SRU1PVEUJMHgwMDAwMDAxMAkvKiBJYyBzbm9vcHMgcmVtb3RlIHN0b3JlcyAqLworI2RlZmluZSBNSVBTX0NBQ0hFX1BJTkRFWAkweDAwMDAwMDIwCS8qIFBoeXNpY2FsbHkgaW5kZXhlZCBjYWNoZSAqLworCitzdHJ1Y3QgY3B1aW5mb19taXBzIHsKKwl1bnNpZ25lZCBsb25nCQl1ZGVsYXlfdmFsOworCXVuc2lnbmVkIGxvbmcJCWFzaWRfY2FjaGU7CisKKwkvKgorCSAqIENhcGFiaWxpdHkgYW5kIGZlYXR1cmUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgZm9yIE1JUFMgQ1BVCisJICovCisJdW5zaWduZWQgbG9uZwkJb3B0aW9uczsKKwl1bnNpZ25lZCBsb25nCQlhc2VzOworCXVuc2lnbmVkIGludAkJcHJvY2Vzc29yX2lkOworCXVuc2lnbmVkIGludAkJZnB1X2lkOworCXVuc2lnbmVkIGludAkJY3B1dHlwZTsKKwlpbnQJCQlpc2FfbGV2ZWw7CisJaW50CQkJdGxic2l6ZTsKKwlzdHJ1Y3QgY2FjaGVfZGVzYwlpY2FjaGU7CS8qIFByaW1hcnkgSS1jYWNoZSAqLworCXN0cnVjdCBjYWNoZV9kZXNjCWRjYWNoZTsJLyogUHJpbWFyeSBEIG9yIGNvbWJpbmVkIEkvRCBjYWNoZSAqLworCXN0cnVjdCBjYWNoZV9kZXNjCXNjYWNoZTsJLyogU2Vjb25kYXJ5IGNhY2hlICovCisJc3RydWN0IGNhY2hlX2Rlc2MJdGNhY2hlOwkvKiBUZXJ0aWFyeS9zcGxpdCBzZWNvbmRhcnkgY2FjaGUgKi8KKwlpbnQJCQlzcnNldHM7CS8qIFNoYWRvdyByZWdpc3RlciBzZXRzICovCisJaW50CQkJY29yZTsJLyogcGh5c2ljYWwgY29yZSBudW1iZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQorCS8qCisJICogSW4gdGhlIE1JUFMgTVQgIlNNVEMiIG1vZGVsLCBlYWNoIFRDIGlzIGNvbnNpZGVyZWQKKwkgKiB0byBiZSBhICJDUFUiIGZvciB0aGUgcHVycG9zZXMgb2Ygc2NoZWR1bGluZywgYnV0CisJICogZXhjZXB0aW9uIHJlc291cmNlcywgQVNJRCBzcGFjZXMsIGV0YywgYXJlIGNvbW1vbgorCSAqIHRvIGFsbCBUQ3Mgd2l0aGluIHRoZSBzYW1lIFZQRS4KKwkgKi8KKwlpbnQJCQl2cGVfaWQ7ICAvKiBWaXJ0dWFsIFByb2Nlc3NvciBudW1iZXIgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwlpbnQJCQl0Y19pZDsgICAvKiBUaHJlYWQgQ29udGV4dCBudW1iZXIgKi8KKyNlbmRpZgorCXZvaWQgCQkJKmRhdGE7CS8qIEFkZGl0aW9uYWwgZGF0YSAqLworCXVuc2lnbmVkIGludAkJd2F0Y2hfcmVnX2NvdW50OyAgIC8qIE51bWJlciB0aGF0IGV4aXN0ICovCisJdW5zaWduZWQgaW50CQl3YXRjaF9yZWdfdXNlX2NudDsgLyogVXNhYmxlIGJ5IHB0cmFjZSAqLworI2RlZmluZSBOVU1fV0FUQ0hfUkVHUyA0CisJdTE2CQkJd2F0Y2hfcmVnX21hc2tzW05VTV9XQVRDSF9SRUdTXTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChTTVBfQ0FDSEVfQllURVMpKSk7CisKK2V4dGVybiBzdHJ1Y3QgY3B1aW5mb19taXBzIGNwdV9kYXRhW107CisjZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXQorI2RlZmluZSByYXdfY3VycmVudF9jcHVfZGF0YSBjcHVfZGF0YVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXQorCitleHRlcm4gdm9pZCBjcHVfcHJvYmUodm9pZCk7CitleHRlcm4gdm9pZCBjcHVfcmVwb3J0KHZvaWQpOworCitleHRlcm4gY29uc3QgY2hhciAqX19jcHVfbmFtZVtdOworI2RlZmluZSBjcHVfbmFtZV9zdHJpbmcoKQlfX2NwdV9uYW1lW3NtcF9wcm9jZXNzb3JfaWQoKV0KKworI2VuZGlmIC8qIF9fQVNNX0NQVV9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvY3B1LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jcHV0aW1lLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1dGltZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2NwdXRpbWUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jdXJyZW50LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3VycmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2N1cnJlbnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2N1cnJlbnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWJ1Zy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYnVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVidWcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYnVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2VjYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9lY2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kZWMvZWNjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvZWNjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2ludGVycnVwdHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvaW50ZXJydXB0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9pbnRlcnJ1cHRzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvaW50ZXJydXB0cy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9pb2FzaWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvaW9hc2ljLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVjL2lvYXNpYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2lvYXNpYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9pb2FzaWNfYWRkcnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvaW9hc2ljX2FkZHJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVjL2lvYXNpY19hZGRycy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2lvYXNpY19hZGRycy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9pb2FzaWNfaW50cy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9pb2FzaWNfaW50cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9pb2FzaWNfaW50cy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2lvYXNpY19pbnRzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2tuMDEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMva24wMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAxLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMva24wMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMDIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMDIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMmJhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMDJiYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyYmEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjAyYmEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMmNhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMDJjYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyY2EuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjAyY2EuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMnhhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMDJ4YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyeGEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjAyeGEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjAzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVjL2tuMDMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjAzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2tuMDUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMva24wNS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjA1LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMva24wNS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RlYy9rbjIzMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9rbjIzMC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlYy9rbjIzMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL2tuMjMwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL21hY2h0eXBlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZGVjL21hY2h0eXBlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVjL21hY2h0eXBlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvbWFjaHR5cGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMvcHJvbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9wcm9tLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZGVjL3Byb20uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9wcm9tLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL3N5c3RlbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RlYy9zeXN0ZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kZWMvc3lzdGVtLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWMvc3lzdGVtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGVsYXkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWxheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RlbGF5LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kZWxheS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RldmljZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RldmljZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RldmljZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZGV2aWNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kaXY2NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RpdjY0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kaXY2NC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RtYS1tYXBwaW5nLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kbWEtbWFwcGluZy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kbWEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kbWEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kbWEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RtYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RzMTI4Ni5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RzMTI4Ni5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2RzMTI4Ni5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZHMxMjg2LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZHMxMjg3LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZHMxMjg3LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZHMxMjg3LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9kczEyODcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kc3AuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9kc3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9kc3AuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2RzcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2VkYWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lZGFjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZWRhYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZWRhYy5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlYWMxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE11Y2ggb2YgdGhpcyBpcyB0YWtlbiBmcm9tIGJpbnV0aWxzIGFuZCBHTlUgbGliYyAuLi4KKyAqLworI2lmbmRlZiBfQVNNX0VMRl9ICisjZGVmaW5lIF9BU01fRUxGX0gKKworCisvKiBFTEYgaGVhZGVyIGVfZmxhZ3MgZGVmaW5lcy4gKi8KKy8qIE1JUFMgYXJjaGl0ZWN0dXJlIGxldmVsLiAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMQkJMHgwMDAwMDAwMAkvKiAtbWlwczEgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwCS8qIC1taXBzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzMJCTB4MjAwMDAwMDAJLyogLW1pcHMzIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNAkJMHgzMDAwMDAwMAkvKiAtbWlwczQgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF81CQkweDQwMDAwMDAwCS8qIC1taXBzNSBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzMyCQkweDUwMDAwMDAwCS8qIE1JUFMzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzY0CQkweDYwMDAwMDAwCS8qIE1JUFM2NCBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzMyUjIJMHg3MDAwMDAwMAkvKiBNSVBTMzIgUjIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF82NFIyCTB4ODAwMDAwMDAJLyogTUlQUzY0IFIyIGNvZGUuICAqLworCisvKiBUaGUgQUJJIG9mIGEgZmlsZS4gKi8KKyNkZWZpbmUgRUZfTUlQU19BQklfTzMyCQkweDAwMDAxMDAwCS8qIE8zMiBBQkkuICAqLworI2RlZmluZSBFRl9NSVBTX0FCSV9PNjQJCTB4MDAwMDIwMDAJLyogTzMyIGV4dGVuZGVkIGZvciA2NCBiaXQuICAqLworCisjZGVmaW5lIFBUX01JUFNfUkVHSU5GTwkJMHg3MDAwMDAwMAorI2RlZmluZSBQVF9NSVBTX1JUUFJPQwkJMHg3MDAwMDAwMQorI2RlZmluZSBQVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMDIKKworLyogRmxhZ3MgaW4gdGhlIGVfZmxhZ3MgZmllbGQgb2YgdGhlIGhlYWRlciAqLworI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUgkweDAwMDAwMDAxCisjZGVmaW5lIEVGX01JUFNfUElDCQkweDAwMDAwMDAyCisjZGVmaW5lIEVGX01JUFNfQ1BJQwkJMHgwMDAwMDAwNAorI2RlZmluZSBFRl9NSVBTX0FCSTIJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRUZfTUlQU19PUFRJT05TX0ZJUlNUCTB4MDAwMDAwODAKKyNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUJMHgwMDAwMDEwMAorI2RlZmluZSBFRl9NSVBTX0FCSQkJMHgwMDAwZjAwMAorI2RlZmluZSBFRl9NSVBTX0FSQ0gJCTB4ZjAwMDAwMDAKKworI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKKyNkZWZpbmUgRFRfTUlQU19USU1FX1NUQU1QCTB4NzAwMDAwMDIKKyNkZWZpbmUgRFRfTUlQU19JQ0hFQ0tTVU0JMHg3MDAwMDAwMworI2RlZmluZSBEVF9NSVBTX0lWRVJTSU9OCTB4NzAwMDAwMDQKKyNkZWZpbmUgRFRfTUlQU19GTEFHUwkJMHg3MDAwMDAwNQorCSNkZWZpbmUgUkhGX05PTkUJMHgwMDAwMDAwMAorCSNkZWZpbmUgUkhGX0hBUkRXQVkJMHgwMDAwMDAwMQorCSNkZWZpbmUgUkhGX05PVFBPVAkweDAwMDAwMDAyCisJI2RlZmluZSBSSEZfU0dJX09OTFkJMHgwMDAwMDAxMAorI2RlZmluZSBEVF9NSVBTX0JBU0VfQUREUkVTUwkweDcwMDAwMDA2CisjZGVmaW5lIERUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwOAorI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJCTB4NzAwMDAwMDkKKyNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTwkweDcwMDAwMDBhCisjZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTwkweDcwMDAwMDBiCisjZGVmaW5lIERUX01JUFNfTElCTElTVE5PCTB4NzAwMDAwMTAKKyNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTwkweDcwMDAwMDExCisjZGVmaW5lIERUX01JUFNfVU5SRUZFWFROTwkweDcwMDAwMDEyCisjZGVmaW5lIERUX01JUFNfR09UU1lNCQkweDcwMDAwMDEzCisjZGVmaW5lIERUX01JUFNfSElQQUdFTk8JMHg3MDAwMDAxNAorI2RlZmluZSBEVF9NSVBTX1JMRF9NQVAJCTB4NzAwMDAwMTYKKworI2RlZmluZSBSX01JUFNfTk9ORQkJMAorI2RlZmluZSBSX01JUFNfMTYJCTEKKyNkZWZpbmUgUl9NSVBTXzMyCQkyCisjZGVmaW5lIFJfTUlQU19SRUwzMgkJMworI2RlZmluZSBSX01JUFNfMjYJCTQKKyNkZWZpbmUgUl9NSVBTX0hJMTYJCTUKKyNkZWZpbmUgUl9NSVBTX0xPMTYJCTYKKyNkZWZpbmUgUl9NSVBTX0dQUkVMMTYJCTcKKyNkZWZpbmUgUl9NSVBTX0xJVEVSQUwJCTgKKyNkZWZpbmUgUl9NSVBTX0dPVDE2CQk5CisjZGVmaW5lIFJfTUlQU19QQzE2CQkxMAorI2RlZmluZSBSX01JUFNfQ0FMTDE2CQkxMQorI2RlZmluZSBSX01JUFNfR1BSRUwzMgkJMTIKKy8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXgsIGFsdGhvdWdoIHRoZXkgYXJlIG5vdAorICAgaW4gdGhlIE1JUFMgRUxGIEFCSS4gICovCisjZGVmaW5lIFJfTUlQU19VTlVTRUQxCQkxMworI2RlZmluZSBSX01JUFNfVU5VU0VEMgkJMTQKKyNkZWZpbmUgUl9NSVBTX1VOVVNFRDMJCTE1CisjZGVmaW5lIFJfTUlQU19TSElGVDUJCTE2CisjZGVmaW5lIFJfTUlQU19TSElGVDYJCTE3CisjZGVmaW5lIFJfTUlQU182NAkJMTgKKyNkZWZpbmUgUl9NSVBTX0dPVF9ESVNQCQkxOQorI2RlZmluZSBSX01JUFNfR09UX1BBR0UJCTIwCisjZGVmaW5lIFJfTUlQU19HT1RfT0ZTVAkJMjEKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR3byByZWxvY2F0aW9uIHR5cGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIE1JUFMgQUJJCisgKiBjb25mb3JtYW5jZSBndWlkZSB2ZXJzaW9uIDEuMiBidXQgbm90IHlldCBpbiB0aGUgcHNBQkkuCisgKi8KKyNkZWZpbmUgUl9NSVBTX0dPVEhJMTYJCTIyCisjZGVmaW5lIFJfTUlQU19HT1RMTzE2CQkyMworI2RlZmluZSBSX01JUFNfU1VCCQkyNAorI2RlZmluZSBSX01JUFNfSU5TRVJUX0EJCTI1CisjZGVmaW5lIFJfTUlQU19JTlNFUlRfQgkJMjYKKyNkZWZpbmUgUl9NSVBTX0RFTEVURQkJMjcKKyNkZWZpbmUgUl9NSVBTX0hJR0hFUgkJMjgKKyNkZWZpbmUgUl9NSVBTX0hJR0hFU1QJCTI5CisvKgorICogVGhlIGZvbGxvd2luZyB0d28gcmVsb2NhdGlvbiB0eXBlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBNSVBTIEFCSQorICogY29uZm9ybWFuY2UgZ3VpZGUgdmVyc2lvbiAxLjIgYnV0IG5vdCB5ZXQgaW4gdGhlIHBzQUJJLgorICovCisjZGVmaW5lIFJfTUlQU19DQUxMSEkxNgkJMzAKKyNkZWZpbmUgUl9NSVBTX0NBTExMTzE2CQkzMQorLyoKKyAqIFRoaXMgcmFuZ2UgaXMgcmVzZXJ2ZWQgZm9yIHZlbmRvciBzcGVjaWZpYyByZWxvY2F0aW9ucy4KKyAqLworI2RlZmluZSBSX01JUFNfTE9WRU5ET1IJCTEwMAorI2RlZmluZSBSX01JUFNfSElWRU5ET1IJCTEyNworCisjZGVmaW5lIFNITl9NSVBTX0FDQ09NT04JMHhmZjAwCQkvKiBBbGxvY2F0ZWQgY29tbW9uIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hOX01JUFNfVEVYVAkJMHhmZjAxCQkvKiBBbGxvY2F0ZWQgdGVzdCBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfREFUQQkJMHhmZjAyCQkvKiBBbGxvY2F0ZWQgZGF0YSBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTgkweGZmMDMJCS8qIFNtYWxsIGNvbW1vbiBzeW1ib2xzICovCisjZGVmaW5lIFNITl9NSVBTX1NVTkRFRklORUQJMHhmZjA0CQkvKiBTbWFsbCB1bmRlZmluZWQgc3ltYm9scyAqLworCisjZGVmaW5lIFNIVF9NSVBTX0xJU1QJCTB4NzAwMDAwMDAKKyNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgorI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMworI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAorI2RlZmluZSBTSFRfTUlQU19ERUJVRwkJMHg3MDAwMDAwNQorI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDYKKyNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRQkweDcwMDAwMDA3CisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0JMHg3MDAwMDAwOAorI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5CisjZGVmaW5lIFNIVF9NSVBTX0lGQUNFCQkweDcwMDAwMDBiCisjZGVmaW5lIFNIVF9NSVBTX0NPTlRFTlQJMHg3MDAwMDAwYworI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQKKyNkZWZpbmUgU0hUX01JUFNfU0hEUgkJMHg3MDAwMDAxMAorI2RlZmluZSBTSFRfTUlQU19GREVTQwkJMHg3MDAwMDAxMQorI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKKyNkZWZpbmUgU0hUX01JUFNfREVOU0UJCTB4NzAwMDAwMTMKKyNkZWZpbmUgU0hUX01JUFNfUERFU0MJCTB4NzAwMDAwMTQKKyNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1CisjZGVmaW5lIFNIVF9NSVBTX0FVWFNZTQkJMHg3MDAwMDAxNgorI2RlZmluZSBTSFRfTUlQU19PUFRTWU0JCTB4NzAwMDAwMTcKKyNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4CisjZGVmaW5lIFNIVF9NSVBTX0xJTkUJCTB4NzAwMDAwMTkKKyNkZWZpbmUgU0hUX01JUFNfUkZERVNDCQkweDcwMDAwMDFhCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUCTB4NzAwMDAwMWMKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFDTEFTUwkweDcwMDAwMDFkCisjZGVmaW5lIFNIVF9NSVBTX0RXQVJGCQkweDcwMDAwMDFlCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTAkweDcwMDAwMDFmCisjZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyMAorI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEKKyNkZWZpbmUgU0hUX01JUFNfVFJBTlNMQVRFCTB4NzAwMDAwMjIKKyNkZWZpbmUgU0hUX01JUFNfUElYSUUJCTB4NzAwMDAwMjMKKyNkZWZpbmUgU0hUX01JUFNfWExBVEUJCTB4NzAwMDAwMjQKKyNkZWZpbmUgU0hUX01JUFNfWExBVEVfREVCVUcJMHg3MDAwMDAyNQorI2RlZmluZSBTSFRfTUlQU19XSElSTAkJMHg3MDAwMDAyNgorI2RlZmluZSBTSFRfTUlQU19FSF9SRUdJT04JMHg3MDAwMDAyNworI2RlZmluZSBTSFRfTUlQU19YTEFURV9PTEQJMHg3MDAwMDAyOAorI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OCTB4NzAwMDAwMjkKKworI2RlZmluZSBTSEZfTUlQU19HUFJFTAkJMHgxMDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19NRVJHRQkJMHgyMDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19BRERSCQkweDQwMDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX1NUUklORwkJMHg4MDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19OT1NUUklQCTB4MDgwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTE9DQUwJCTB4MDQwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTkFNRVMJCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTk9EVVBFUwkweDAxMDAwMDAwCisKKyNpZm5kZWYgRUxGX0FSQ0gKKy8qIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFTEZfTkdSRUcJNDUKKyNkZWZpbmUgRUxGX05GUFJFRwkzMworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKK3R5cGVkZWYgZG91YmxlIGVsZl9mcHJlZ190OwordHlwZWRlZiBlbGZfZnByZWdfdCBlbGZfZnByZWdzZXRfdFtFTEZfTkZQUkVHXTsKKworI2lmZGVmIENPTkZJR18zMkJJVAorCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBlbGZfY2hlY2tfYXJjaChoZHIpCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJaW50IF9fcmVzID0gMTsJCQkJCQkJXAorCXN0cnVjdCBlbGZoZHIgKl9faCA9IChoZHIpOwkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChfX2gtPmVfbWFjaGluZSAhPSBFTV9NSVBTKQkJCQkJXAorCQlfX3JlcyA9IDA7CQkJCQkJXAorCWlmIChfX2gtPmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTMzIpCQkJXAorCQlfX3JlcyA9IDA7CQkJCQkJXAorCWlmICgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkyKSAhPSAwKQkJCQlcCisJCV9fcmVzID0gMDsJCQkJCQlcCisJaWYgKCgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpICE9IDApICYmCQkJXAorCSAgICAoKF9faC0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSAhPSBFRl9NSVBTX0FCSV9PMzIpKQkJXAorCQlfX3JlcyA9IDA7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fcmVzOwkJCQkJCQkJXAorfSkKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIGluIHRoZSBjb3JlIGR1bXBzLgorICovCisjZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzMyCisKKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KKworI2lmZGVmIENPTkZJR182NEJJVAorLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCisgKi8KKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goaGRyKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX3JlcyA9IDE7CQkJCQkJCVwKKwlzdHJ1Y3QgZWxmaGRyICpfX2ggPSAoaGRyKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoX19oLT5lX21hY2hpbmUgIT0gRU1fTUlQUykJCQkJCVwKKwkJX19yZXMgPSAwOwkJCQkJCVwKKwlpZiAoX19oLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KSAJCQlcCisJCV9fcmVzID0gMDsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19yZXM7CQkJCQkJCQlcCit9KQorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTNjQKKworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLworCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNpZmRlZiBfX01JUFNFQl9fCisjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCisjZWxpZiBfX01JUFNFTF9fCisjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTFNCCisjZW5kaWYKKyNkZWZpbmUgRUxGX0FSQ0gJRU1fTUlQUworCisjZW5kaWYgLyogIWRlZmluZWQoRUxGX0FSQ0gpICovCisKK3N0cnVjdCBtaXBzX2FiaTsKKworZXh0ZXJuIHN0cnVjdCBtaXBzX2FiaSBtaXBzX2FiaTsKK2V4dGVybiBzdHJ1Y3QgbWlwc19hYmkgbWlwc19hYmlfMzI7CitleHRlcm4gc3RydWN0IG1pcHNfYWJpIG1pcHNfYWJpX24zMjsKKworI2lmZGVmIENPTkZJR18zMkJJVAorCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOwkJCQkJXAorCQkJCQkJCQkJXAorCWN1cnJlbnQtPnRocmVhZC5hYmkgPSAmbWlwc19hYmk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KKworI2lmZGVmIENPTkZJR182NEJJVAorCisjaWZkZWYgQ09ORklHX01JUFMzMl9OMzIKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9OMzIoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKTsJCQlcCisJCWN1cnJlbnQtPnRocmVhZC5hYmkgPSAmbWlwc19hYmlfbjMyOwkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9OMzIoKQkJCQkJXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFMzMl9PMzIKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9SRUdTKTsJCQlcCisJCXNldF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfQUREUik7CQkJXAorCQljdXJyZW50LT50aHJlYWQuYWJpID0gJm1pcHNfYWJpXzMyOwkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoKQkJCQkJXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFMzMl9DT01QQVQKKyNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMihleCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICgoKChleCkuZV9mbGFncyAmIEVGX01JUFNfQUJJMikgIT0gMCkgJiYJCQlcCisJICAgICAoKGV4KS5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IDApCQkJCVwKKwkJX19TRVRfUEVSU09OQUxJVFkzMl9OMzIoKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJX19TRVRfUEVSU09OQUxJVFkzMl9PMzIoKTsJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIF9fU0VUX1BFUlNPTkFMSVRZMzIoZXgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWNsZWFyX3RocmVhZF9mbGFnKFRJRl8zMkJJVF9SRUdTKTsJCQkJXAorCWNsZWFyX3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKTsJCQkJXAorCQkJCQkJCQkJXAorCWlmICgoZXgpLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCQkJXAorCQlfX1NFVF9QRVJTT05BTElUWTMyKGV4KTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJY3VycmVudC0+dGhyZWFkLmFiaSA9ICZtaXBzX2FiaTsJCQlcCisJCQkJCQkJCQlcCisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWDMyKQkJCVwKKwkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KKworc3RydWN0IHRhc2tfc3RydWN0OworCitleHRlcm4gdm9pZCBlbGZfZHVtcF9yZWdzKGVsZl9ncmVnX3QgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2dyZWdzZXRfdCAqKTsKK2V4dGVybiBpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKGVsZl9yZWdzLCByZWdzKQkJCVwKKwllbGZfZHVtcF9yZWdzKChlbGZfZ3JlZ190ICopJihlbGZfcmVncyksIHJlZ3MpOworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1RBU0tfUkVHUyh0c2ssIGVsZl9yZWdzKSBkdW1wX3Rhc2tfcmVncyh0c2ssIGVsZl9yZWdzKQorI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0c2ssIGVsZl9mcHJlZ3MpCQkJXAorCWR1bXBfdGFza19mcHUodHNrLCBlbGZfZnByZWdzKQorCisjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCisjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCVBBR0VfU0laRQorCisvKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CisgICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBjcHUgc3VwcG9ydHMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlLAorICAgYnV0IGl0J3Mgbm90IGVhc3ksIGFuZCB3ZSd2ZSBhbHJlYWR5IGRvbmUgaXQgaGVyZS4gICovCisKKyNkZWZpbmUgRUxGX0hXQ0FQICAgICAgICgwKQorCisvKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KKworICAgRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgb25seSBvcHRpbWl6YXRpb25zIGZvciB0aGUgSW50ZWwgZ2VuZXJhdGlvbnMsCisgICBidXQgdGhhdCBjb3VsZCBjaGFuZ2UuLi4gKi8KKworI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQorCisvKgorICogU2VlIGNvbW1lbnRzIGluIGFzbS1hbHBoYS9lbGYuaCwgdGhpcyBpcyB0aGUgc2FtZSB0aGluZworICogb24gdGhlIE1JUFMuCisgKi8KKyNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKQlkbyB7IFwKKwlfci0+cmVnc1sxXSA9IF9yLT5yZWdzWzJdID0gX3ItPnJlZ3NbM10gPSBfci0+cmVnc1s0XSA9IDA7CVwKKwlfci0+cmVnc1s1XSA9IF9yLT5yZWdzWzZdID0gX3ItPnJlZ3NbN10gPSBfci0+cmVnc1s4XSA9IDA7CVwKKwlfci0+cmVnc1s5XSA9IF9yLT5yZWdzWzEwXSA9IF9yLT5yZWdzWzExXSA9IF9yLT5yZWdzWzEyXSA9IDA7CVwKKwlfci0+cmVnc1sxM10gPSBfci0+cmVnc1sxNF0gPSBfci0+cmVnc1sxNV0gPSBfci0+cmVnc1sxNl0gPSAwOwlcCisJX3ItPnJlZ3NbMTddID0gX3ItPnJlZ3NbMThdID0gX3ItPnJlZ3NbMTldID0gX3ItPnJlZ3NbMjBdID0gMDsJXAorCV9yLT5yZWdzWzIxXSA9IF9yLT5yZWdzWzIyXSA9IF9yLT5yZWdzWzIzXSA9IF9yLT5yZWdzWzI0XSA9IDA7CVwKKwlfci0+cmVnc1syNV0gPSBfci0+cmVnc1syNl0gPSBfci0+cmVnc1syN10gPSBfci0+cmVnc1syOF0gPSAwOwlcCisJX3ItPnJlZ3NbMzBdID0gX3ItPnJlZ3NbMzFdID0gMDsJCQkJXAorfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKKyAgIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgorICAgdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KKyAgIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4gICovCisKKyNpZm5kZWYgRUxGX0VUX0RZTl9CQVNFCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIChUQVNLX1NJWkUgLyAzICogMikKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9lbWVyZ2VuY3ktcmVzdGFydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZW1lcmdlbmN5LXJlc3RhcnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZW1tYTJyaC9lbW1hMnJoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYTJyaC9lbW1hMnJoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZW1tYTJyaC9lbW1hMnJoLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbW1hMnJoL2VtbWEycmguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9lbW1hMnJoL21hcmtlaW5zLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZW1tYTJyaC9tYXJrZWlucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2VtbWEycmgvbWFya2VpbnMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VtbWEycmgvbWFya2VpbnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9lcnJuby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Vycm5vLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZXJybm8uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Vycm5vLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZmIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2ZiLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZmNudGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9mY250bC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZmNudGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9maXhtYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Zsb3BweS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Zsb3BweS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2Zsb3BweS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZmxvcHB5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZnByZWdkZWYuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHJlZ2RlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2ZwcmVnZGVmLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHJlZ2RlZi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2ZwdS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZnB1X2VtdWxhdG9yLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1X2VtdWxhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZnB1X2VtdWxhdG9yLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHVfZW11bGF0b3IuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z1dGV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZnV0ZXguaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z1dGV4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZncvYXJjL2hpbnYuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9hcmMvaGludi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2Z3L2FyYy9oaW52LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9hcmMvaGludi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Z3L2FyYy90eXBlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2Z3L2FyYy90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2Z3L2FyYy90eXBlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZncvYXJjL3R5cGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZncvY2ZlL2NmZV9hcGkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9jZmUvY2ZlX2FwaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2Z3L2NmZS9jZmVfYXBpLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9jZmUvY2ZlX2FwaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Z3L2NmZS9jZmVfZXJyb3IuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mdy9jZmUvY2ZlX2Vycm9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZncvY2ZlL2NmZV9lcnJvci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZncvY2ZlL2NmZV9lcnJvci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2djbXByZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9nY21wcmVncy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZ2NtcHJlZ3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9naWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9naWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9naWMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2dpYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2dwaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ncGlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZ3Bpby5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZ3Bpby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2d0NjQxMjAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ndDY0MTIwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vZ3Q2NDEyMC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hhcmRpcnEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaGFyZGlycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaGFyZGlycS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hhemFyZHMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXphcmRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaGF6YXJkcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hpZ2htZW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oaWdobWVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaGlnaG1lbS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaGlnaG1lbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2h3X2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2h3X2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2h3X2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaHdfaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaTgyNTMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2k4MjUzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9pODI1My5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2k4MjU5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaTgyNTkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pODI1OS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaTgyNTkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pZGUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pZGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lkZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2luc3QuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pbnN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaW5zdC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaW5zdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2lvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pby5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pb2N0bC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvY3RsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaW9jdGwuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvY3RsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaW9jdGxzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW9jdGxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaW9jdGxzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9pb2N0bHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcDMyL2NyaW1lLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXAzMi9jcmltZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2lwMzIvY3JpbWUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lwMzIvY3JpbWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcDMyL2lwMzJfaW50cy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lwMzIvaXAzMl9pbnRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaXAzMi9pcDMyX2ludHMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lwMzIvaXAzMl9pbnRzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXAzMi9tYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXAzMi9tYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvaXAzMi9tYWNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcDMyL21hY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcGNidWYuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcGNidWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pcGNidWYuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxX2NwdS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycV9jcHUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pcnFfY3B1LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcnFfY3B1LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxX2d0NjQxeHguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcnFfZ3Q2NDF4eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2lycV9ndDY0MXh4LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcnFfZ3Q2NDF4eC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2lycV9yZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pcnFfcmVncy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycWZsYWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFlYzBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMyBieSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5NiBieSBQYXVsIE0uIEFudG9pbmUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KKyAqLworI2lmbmRlZiBfQVNNX0lSUUZMQUdTX0gKKyNkZWZpbmUgX0FTTV9JUlFGTEFHU19ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9oYXphcmRzLmg+CisKK19fYXNtX18oCisJIgkubWFjcm8JcmF3X2xvY2FsX2lycV9lbmFibGUJCQkJXG4iCisJIgkuc2V0CXB1c2gJCQkJCQlcbiIKKwkiCS5zZXQJcmVvcmRlcgkJCQkJCVxuIgorCSIJLnNldAlub2F0CQkJCQkJXG4iCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCSIJbWZjMAkkMSwgJDIsIDEJIyBTTVRDIC0gY2xlYXIgVENTdGF0dXMuSVhNVAlcbiIKKwkiCW9yaQkkMSwgMHg0MDAJCQkJCVxuIgorCSIJeG9yaQkkMSwgMHg0MDAJCQkJCVxuIgorCSIJbXRjMAkkMSwgJDIsIDEJCQkJCVxuIgorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFNSMikKKwkiCWVpCQkJCQkJCVxuIgorI2Vsc2UKKwkiCW1mYzAJJDEsJDEyCQkJCQkJXG4iCisJIglvcmkJJDEsMHgxZgkJCQkJCVxuIgorCSIJeG9yaQkkMSwweDFlCQkJCQkJXG4iCisJIgltdGMwCSQxLCQxMgkJCQkJCVxuIgorI2VuZGlmCisJIglpcnFfZW5hYmxlX2hhemFyZAkJCQkJXG4iCisJIgkuc2V0CXBvcAkJCQkJCVxuIgorCSIJLmVuZG0iKTsKKworZXh0ZXJuIHZvaWQgc210Y19pcGlfcmVwbGF5KHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJLyoKKwkgKiBTTVRDIGtlcm5lbCBuZWVkcyB0byBkbyBhIHNvZnR3YXJlIHJlcGxheSBvZiBxdWV1ZWQKKwkgKiBJUElzLCBhdCB0aGUgY29zdCBvZiBjYWxsIG92ZXJoZWFkIG9uIGVhY2ggbG9jYWxfaXJxX2VuYWJsZSgpCisJICovCisJc210Y19pcGlfcmVwbGF5KCk7CisjZW5kaWYKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJInJhd19sb2NhbF9pcnFfZW5hYmxlIgorCQk6IC8qIG5vIG91dHB1dHMgKi8KKwkJOiAvKiBubyBpbnB1dHMgKi8KKwkJOiAibWVtb3J5Iik7Cit9CisKKworLyoKKyAqIEZvciBjbGkoKSB3ZSBoYXZlIHRvIGluc2VydCBub3BzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgdmFsdWUKKyAqIGhhcyBhY3R1YWxseSBhcnJpdmVkIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcworICogbWFjcm8uCisgKiBSNDAwMC9SNDQwMCBuZWVkIHRocmVlIG5vcHMsIHRoZSBSNDYwMCB0d28gbm9wcyBhbmQgdGhlIFIxMDAwMCBuZWVkcworICogbm8gbm9wcyBhdCBhbGwuCisgKi8KKy8qCisgKiBGb3IgVFg0OSwgb3BlcmF0aW5nIG9ubHkgSUUgYml0IGlzIG5vdCBlbm91Z2guCisgKgorICogSWYgbWZjMCAkMTIgZm9sbG93cyBzdG9yZSBhbmQgdGhlIG1mYzAgaXMgbGFzdCBpbnN0cnVjdGlvbiBvZiBhCisgKiBwYWdlIGFuZCBmZXRjaGluZyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBjYXVzZXMgVExCIG1pc3MsIHRoZSByZXN1bHQKKyAqIG9mIHRoZSBtZmMwIG1pZ2h0IHdyb25nbHkgY29udGFpbiBFWEwgYml0LgorICoKKyAqIEVSVC1UWDQ5SDItMDI3LCBFUlQtVFg0OUgzLTAxMiwgRVJULVRYNDlITDMtMDA2LCBFUlQtVFg0OUg0LTAwOAorICoKKyAqIFdvcmthcm91bmQ6IG1hc2sgRVhMIGJpdCBvZiB0aGUgcmVzdWx0IG9yIHBsYWNlIGEgbm9wIGJlZm9yZSBtZmMwLgorICovCitfX2FzbV9fKAorCSIJLm1hY3JvCXJhd19sb2NhbF9pcnFfZGlzYWJsZVxuIgorCSIJLnNldAlwdXNoCQkJCQkJXG4iCisJIgkuc2V0CW5vYXQJCQkJCQlcbiIKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJIgltZmMwCSQxLCAkMiwgMQkJCQkJXG4iCisJIglvcmkJJDEsIDB4NDAwCQkJCQlcbiIKKwkiCS5zZXQJbm9yZW9yZGVyCQkJCQlcbiIKKwkiCW10YzAJJDEsICQyLCAxCQkJCQlcbiIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCisJIglkaQkJCQkJCQlcbiIKKyNlbHNlCisJIgltZmMwCSQxLCQxMgkJCQkJCVxuIgorCSIJb3JpCSQxLDB4MWYJCQkJCQlcbiIKKwkiCXhvcmkJJDEsMHgxZgkJCQkJCVxuIgorCSIJLnNldAlub3Jlb3JkZXIJCQkJCVxuIgorCSIJbXRjMAkkMSwkMTIJCQkJCQlcbiIKKyNlbmRpZgorCSIJaXJxX2Rpc2FibGVfaGF6YXJkCQkJCQlcbiIKKwkiCS5zZXQJcG9wCQkJCQkJXG4iCisJIgkuZW5kbQkJCQkJCQlcbiIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyYXdfbG9jYWxfaXJxX2Rpc2FibGUiCisJCTogLyogbm8gb3V0cHV0cyAqLworCQk6IC8qIG5vIGlucHV0cyAqLworCQk6ICJtZW1vcnkiKTsKK30KKworX19hc21fXygKKwkiCS5tYWNybwlyYXdfbG9jYWxfc2F2ZV9mbGFncyBmbGFncwkJCVxuIgorCSIJLnNldAlwdXNoCQkJCQkJXG4iCisJIgkuc2V0CXJlb3JkZXIJCQkJCQlcbiIKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJIgltZmMwCVxcZmxhZ3MsICQyLCAxCQkJCQlcbiIKKyNlbHNlCisJIgltZmMwCVxcZmxhZ3MsICQxMgkJCQkJXG4iCisjZW5kaWYKKwkiCS5zZXQJcG9wCQkJCQkJXG4iCisJIgkuZW5kbQkJCQkJCQlcbiIpOworCisjZGVmaW5lIHJhd19sb2NhbF9zYXZlX2ZsYWdzKHgpCQkJCQkJXAorX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJCVwKKwkicmF3X2xvY2FsX3NhdmVfZmxhZ3MgJTAiCQkJCQlcCisJOiAiPXIiICh4KSkKKworX19hc21fXygKKwkiCS5tYWNybwlyYXdfbG9jYWxfaXJxX3NhdmUgcmVzdWx0CQkJXG4iCisJIgkuc2V0CXB1c2gJCQkJCQlcbiIKKwkiCS5zZXQJcmVvcmRlcgkJCQkJCVxuIgorCSIJLnNldAlub2F0CQkJCQkJXG4iCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCSIJbWZjMAlcXHJlc3VsdCwgJDIsIDEJCQkJCVxuIgorCSIJb3JpCSQxLCBcXHJlc3VsdCwgMHg0MDAJCQkJXG4iCisJIgkuc2V0CW5vcmVvcmRlcgkJCQkJXG4iCisJIgltdGMwCSQxLCAkMiwgMQkJCQkJXG4iCisJIglhbmRpCVxccmVzdWx0LCBcXHJlc3VsdCwgMHg0MDAJCQlcbiIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCisJIglkaQlcXHJlc3VsdAkJCQkJXG4iCisJIglhbmRpCVxccmVzdWx0LCAxCQkJCQlcbiIKKyNlbHNlCisJIgltZmMwCVxccmVzdWx0LCAkMTIJCQkJCVxuIgorCSIJb3JpCSQxLCBcXHJlc3VsdCwgMHgxZgkJCQlcbiIKKwkiCXhvcmkJJDEsIDB4MWYJCQkJCVxuIgorCSIJLnNldAlub3Jlb3JkZXIJCQkJCVxuIgorCSIJbXRjMAkkMSwgJDEyCQkJCQkJXG4iCisjZW5kaWYKKwkiCWlycV9kaXNhYmxlX2hhemFyZAkJCQkJXG4iCisJIgkuc2V0CXBvcAkJCQkJCVxuIgorCSIJLmVuZG0JCQkJCQkJXG4iKTsKKworI2RlZmluZSByYXdfbG9jYWxfaXJxX3NhdmUoeCkJCQkJCQlcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkJXAorCSJyYXdfbG9jYWxfaXJxX3NhdmVcdCUwIgkJCQkJXAorCTogIj1yIiAoeCkJCQkJCQkJXAorCTogLyogbm8gaW5wdXRzICovCQkJCQkJXAorCTogIm1lbW9yeSIpCisKK19fYXNtX18oCisJIgkubWFjcm8JcmF3X2xvY2FsX2lycV9yZXN0b3JlIGZsYWdzCQkJXG4iCisJIgkuc2V0CXB1c2gJCQkJCQlcbiIKKwkiCS5zZXQJbm9yZW9yZGVyCQkJCQlcbiIKKwkiCS5zZXQJbm9hdAkJCQkJCVxuIgorI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkibWZjMAkkMSwgJDIsIDEJCQkJCQlcbiIKKwkiYW5kaQlcXGZsYWdzLCAweDQwMAkJCQkJCVxuIgorCSJvcmkJJDEsIDB4NDAwCQkJCQkJXG4iCisJInhvcmkJJDEsIDB4NDAwCQkJCQkJXG4iCisJIm9yCVxcZmxhZ3MsICQxCQkJCQkJXG4iCisJIm10YzAJXFxmbGFncywgJDIsIDEJCQkJCQlcbiIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpICYmIGRlZmluZWQoQ09ORklHX0lSUV9DUFUpCisJLyoKKwkgKiBTbG93LCBidXQgZG9lc24ndCBzdWZmZXIgZnJvbSBhIHJlbGF0aXZseSB1bmxpa2VseSByYWNlCisJICogY29uZGl0aW9uIHdlJ3JlIGhhdmluZyBzaW5jZSBkYXlzIDEuCisJICovCisJIgliZXF6CVxcZmxhZ3MsIDFmCQkJCQlcbiIKKwkiCSBkaQkJCQkJCQlcbiIKKwkiCWVpCQkJCQkJCVxuIgorCSIxOgkJCQkJCQkJXG4iCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfTUlQU1IyKQorCS8qCisJICogRmFzdCwgZGFuZ2Vyb3VzLiAgTGlmZSBpcyBmdW4sIGxpZmUgaXMgZ29vZC4KKwkgKi8KKwkiCW1mYzAJJDEsICQxMgkJCQkJCVxuIgorCSIJaW5zCSQxLCBcXGZsYWdzLCAwLCAxCQkJCVxuIgorCSIJbXRjMAkkMSwgJDEyCQkJCQkJXG4iCisjZWxzZQorCSIJbWZjMAkkMSwgJDEyCQkJCQkJXG4iCisJIglhbmRpCVxcZmxhZ3MsIDEJCQkJCVxuIgorCSIJb3JpCSQxLCAweDFmCQkJCQlcbiIKKwkiCXhvcmkJJDEsIDB4MWYJCQkJCVxuIgorCSIJb3IJXFxmbGFncywgJDEJCQkJCVxuIgorCSIJbXRjMAlcXGZsYWdzLCAkMTIJCQkJCVxuIgorI2VuZGlmCisJIglpcnFfZGlzYWJsZV9oYXphcmQJCQkJCVxuIgorCSIJLnNldAlwb3AJCQkJCQlcbiIKKwkiCS5lbmRtCQkJCQkJCVxuIik7CisKKworc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgX190bXAxOworCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCS8qCisJICogU01UQyBrZXJuZWwgbmVlZHMgdG8gZG8gYSBzb2Z0d2FyZSByZXBsYXkgb2YgcXVldWVkCisJICogSVBJcywgYXQgdGhlIGNvc3Qgb2YgYnJhbmNoIGFuZCBjYWxsIG92ZXJoZWFkIG9uIGVhY2gKKwkgKiBsb2NhbF9pcnFfcmVzdG9yZSgpCisJICovCisJaWYgKHVubGlrZWx5KCEoZmxhZ3MgJiAweDA0MDApKSkKKwkJc210Y19pcGlfcmVwbGF5KCk7CisjZW5kaWYKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkicmF3X2xvY2FsX2lycV9yZXN0b3JlXHQlMCIKKwkJOiAiPXIiIChfX3RtcDEpCisJCTogIjAiIChmbGFncykKKwkJOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgX190bXAxOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyYXdfbG9jYWxfaXJxX3Jlc3RvcmVcdCUwIgorCQk6ICI9ciIgKF9fdG1wMSkKKwkJOiAiMCIgKGZsYWdzKQorCQk6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJLyoKKwkgKiBTTVRDIG1vZGVsIHVzZXMgVENTdGF0dXMuSVhNVCB0byBkaXNhYmxlIGludGVycnVwdHMgZm9yIGEgdGhyZWFkL0NQVQorCSAqLworCXJldHVybiBmbGFncyAmIDB4NDAwOworI2Vsc2UKKwlyZXR1cm4gIShmbGFncyAmIDEpOworI2VuZGlmCit9CisKKyNlbmRpZgorCisvKgorICogRG8gdGhlIENQVSdzIElSUS1zdGF0ZSB0cmFjaW5nIGZyb20gYXNzZW1ibHkgY29kZS4KKyAqLworI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworLyogUmVsb2FkIHNvbWUgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSB0cmFjZV9oYXJkaXJxc19vbiAqLworI2lmZGVmIENPTkZJR182NEJJVAorIyBkZWZpbmUgVFJBQ0VfSVJRU19SRUxPQURfUkVHUwkJCQkJCVwKKwlMT05HX0wJJDExLCBQVF9SMTEoc3ApOwkJCQkJXAorCUxPTkdfTAkkMTAsIFBUX1IxMChzcCk7CQkJCQlcCisJTE9OR19MCSQ5LCBQVF9SOShzcCk7CQkJCQkJXAorCUxPTkdfTAkkOCwgUFRfUjgoc3ApOwkJCQkJCVwKKwlMT05HX0wJJDcsIFBUX1I3KHNwKTsJCQkJCQlcCisJTE9OR19MCSQ2LCBQVF9SNihzcCk7CQkJCQkJXAorCUxPTkdfTAkkNSwgUFRfUjUoc3ApOwkJCQkJCVwKKwlMT05HX0wJJDQsIFBUX1I0KHNwKTsJCQkJCQlcCisJTE9OR19MCSQyLCBQVF9SMihzcCkKKyNlbHNlCisjIGRlZmluZSBUUkFDRV9JUlFTX1JFTE9BRF9SRUdTCQkJCQkJXAorCUxPTkdfTAkkNywgUFRfUjcoc3ApOwkJCQkJCVwKKwlMT05HX0wJJDYsIFBUX1I2KHNwKTsJCQkJCQlcCisJTE9OR19MCSQ1LCBQVF9SNShzcCk7CQkJCQkJXAorCUxPTkdfTAkkNCwgUFRfUjQoc3ApOwkJCQkJCVwKKwlMT05HX0wJJDIsIFBUX1IyKHNwKQorI2VuZGlmCisjIGRlZmluZSBUUkFDRV9JUlFTX09OCQkJCQkJCVwKKwlDTEk7CS8qIG1ha2Ugc3VyZSB0cmFjZV9oYXJkaXJxc19vbigpIGlzIGNhbGxlZCBpbiBrZXJuZWwgbGV2ZWwgKi8gXAorCWphbAl0cmFjZV9oYXJkaXJxc19vbgorIyBkZWZpbmUgVFJBQ0VfSVJRU19PTl9SRUxPQUQJCQkJCQlcCisJVFJBQ0VfSVJRU19PTjsJCQkJCQkJXAorCVRSQUNFX0lSUVNfUkVMT0FEX1JFR1MKKyMgZGVmaW5lIFRSQUNFX0lSUVNfT0ZGCQkJCQkJCVwKKwlqYWwJdHJhY2VfaGFyZGlycXNfb2ZmCisjZWxzZQorIyBkZWZpbmUgVFJBQ0VfSVJRU19PTgorIyBkZWZpbmUgVFJBQ0VfSVJRU19PTl9SRUxPQUQKKyMgZGVmaW5lIFRSQUNFX0lSUVNfT0ZGCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fSVJRRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pc2FkZXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pc2FkZXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9pc2FkZXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lzYWRlcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2phenouaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9qYXp6LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvamF6ei5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vamF6ei5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2phenpkbWEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9qYXp6ZG1hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvamF6emRtYS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vamF6emRtYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2tkZWJ1Zy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2tkZWJ1Zy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20va2RlYnVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMva2V4ZWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZXhlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2tleGVjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZXhlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2tnZGIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZ2RiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMva2dkYi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20va2dkYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ttYXBfdHlwZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rbWFwX3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMva21hcF90eXBlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20va21hcF90eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2tzcGQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rc3BkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMva3NwZC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20va3NwZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2xhc2F0L2RzMTYwMy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xhc2F0L2RzMTYwMy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2xhc2F0L2RzMTYwMy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbGFzYXQvZHMxNjAzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbGFzYXQvZWVwcm9tLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbGFzYXQvZWVwcm9tLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbGFzYXQvZWVwcm9tLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9sYXNhdC9lZXByb20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9sYXNhdC9oZWFkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbGFzYXQvaGVhZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2xhc2F0L2hlYWQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xhc2F0L2hlYWQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9sYXNhdC9sYXNhdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xhc2F0L2xhc2F0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbGFzYXQvbGFzYXQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xhc2F0L2xhc2F0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbGFzYXQvbGFzYXRpbnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9sYXNhdC9sYXNhdGludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2xhc2F0L2xhc2F0aW50LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9sYXNhdC9sYXNhdGludC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2xhc2F0L3BpY3Z1ZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xhc2F0L3BpY3Z1ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2xhc2F0L3BpY3Z1ZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbGFzYXQvcGljdnVlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbGFzYXQvc2VyaWFsLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbGFzYXQvc2VyaWFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbGFzYXQvc2VyaWFsLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9sYXNhdC9zZXJpYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9saW5rYWdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbGlua2FnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL2xpbmthZ2UuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9sb2NhbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbG9jYWwuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL2xvY2FsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbTQ4dDM1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbTQ4dDM1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbTQ4dDM1LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tNDh0MzUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tNDh0MzcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tNDh0MzcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tNDh0MzcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL200OHQzNy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTAwMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMDAwX2RtYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMF9kbWEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMDAwX2dwaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZ3Bpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTAwMF9ncGlvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZ3Bpby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTEwMF9tbWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTExMDBfbW1jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxMTAwX21tYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMTAwX21tYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MTU1MF9zcGkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTE1NTBfc3BpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxNTUwX3NwaS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxNTUwX3NwaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MXh4eC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MXh4eC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2dwaW8uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9pb3JlbWFwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvaW9yZW1hcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL2lvcmVtYXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2lvcmVtYXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9wcm9tLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvcHJvbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtYXUxeDAwL3Byb20uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL3Byb20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYmNtNDd4eC9iY200N3h4LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTQ3eHgvYmNtNDd4eC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2JjbTQ3eHguaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGZmNGNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNDd4eC9ncGlvLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CisgKi8KKworI2lmbmRlZiBfX0JDTTQ3WFhfR1BJT19ICisjZGVmaW5lIF9fQkNNNDdYWF9HUElPX0gKKworI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZW1iZWRkZWQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1iY200N3h4L2JjbTQ3eHguaD4KKworI2RlZmluZSBCQ000N1hYX0VYVElGX0dQSU9fTElORVMJNQorI2RlZmluZSBCQ000N1hYX0NISVBDT19HUElPX0xJTkVTCTE2CisKK2V4dGVybiBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKK2V4dGVybiB2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKTsKK2V4dGVybiBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIHNzYl9ncGlvX2luKCZzc2JfYmNtNDd4eCwgMSA8PCBncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlzc2JfZ3Bpb19vdXQoJnNzYl9iY200N3h4LCAxIDw8IGdwaW8sIHZhbHVlID8gMSA8PCBncGlvIDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIHNzYl9ncGlvX291dGVuKCZzc2JfYmNtNDd4eCwgMSA8PCBncGlvLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gc3NiX2dwaW9fb3V0ZW4oJnNzYl9iY200N3h4LCAxIDw8IGdwaW8sIDEgPDwgZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19pbnRtYXNrKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gc3NiX2dwaW9faW50bWFzaygmc3NiX2JjbTQ3eHgsIDEgPDwgZ3BpbywKKwkJCQl2YWx1ZSA/IDEgPDwgZ3BpbyA6IDApOworfQorCitzdGF0aWMgaW50IGdwaW9fcG9sYXJpdHkodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCXJldHVybiBzc2JfZ3Bpb19wb2xhcml0eSgmc3NiX2JjbTQ3eHgsIDEgPDwgZ3BpbywKKwkJCQkgdmFsdWUgPyAxIDw8IGdwaW8gOiAwKTsKK30KKworCisvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKworI2VuZGlmIC8qIF9fQkNNNDdYWF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTQ3eHgvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L3dhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2Q0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY200N3h4L3dhci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDQsIDIwMDcgYnkgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgorICovCisjaWZuZGVmIF9fQVNNX01JUFNfTUFDSF9CQ000N1hYX1dBUl9ICisjZGVmaW5lIF9fQVNNX01JUFNfTUFDSF9CQ000N1hYX1dBUl9ICisKKyNkZWZpbmUgUjQ2MDBfVjFfSU5ERVhfSUNBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjFfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjU0MzJfQ1AwX0lOVEVSUlVQVF9XQVIJCTAKKyNkZWZpbmUgQkNNMTI1MF9NM19XQVIJCQkwCisjZGVmaW5lIFNJQllURV8xOTU2X1dBUgkJCTAKKyNkZWZpbmUgTUlQUzRLX0lDQUNIRV9SRUZJTExfV0FSCTAKKyNkZWZpbmUgTUlQU19DQUNIRV9TWU5DX1dBUgkJMAorI2RlZmluZSBUWDQ5WFhfSUNBQ0hFX0lOREVYX0lOVl9XQVIJMAorI2RlZmluZSBSTTkwMDBfQ0RFWF9TTVBfV0FSCQkwCisjZGVmaW5lIElDQUNIRV9SRUZJTExTX1dPUktBUk9VTkRfV0FSCTAKKyNkZWZpbmUgUjEwMDAwX0xMU0NfV0FSCQkJMAorI2RlZmluZSBNSVBTMzRLX01JU1NFRF9JVExCX1dBUgkJMAorCisjZW5kaWYgLyogX19BU01fTUlQU19NQUNIX0JDTTQ3WFhfV0FSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jb2JhbHQvY29iYWx0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNvYmFsdC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY29iYWx0L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY29iYWx0L2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jb2JhbHQvaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvbWFjaC1ndDY0MTIwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jb2JhbHQvbWFjaC1ndDY0MTIwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvbWFjaC1ndDY0MTIwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNvYmFsdC9tYWNoLWd0NjQxMjAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNvYmFsdC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY29iYWx0L3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwL2RiMTIwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwL2RiMTIwMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1kYjF4MDAvZGIxeDAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxeDAwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1kYjF4MDAvZGIxeDAwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjF4MDAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWRlYy9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGVjL21jMTQ2ODE4cnRjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1kZWMvbWMxNDY4MThydGMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGVjL21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1kZWMvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kZWMvd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1kZWMvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRlYy93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWVtbWEycmgvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1lbW1hMnJoL2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZW1tYTJyaC9pcnEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZW1tYTJyaC9pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWVtbWEycmgvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1lbW1hMnJoL3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZW1tYTJyaC93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZW1tYTJyaC93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL2V4Y2l0ZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlL2V4Y2l0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL2V4Y2l0ZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1leGNpdGUvZXhjaXRlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvZXhjaXRlX2ZwZ2EuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS9leGNpdGVfZnBnYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL2V4Y2l0ZV9mcGdhLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS9leGNpdGVfZnBnYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL2V4Y2l0ZV9uYW5kZmxhc2guaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS9leGNpdGVfbmFuZGZsYXNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvZXhjaXRlX25hbmRmbGFzaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1leGNpdGUvZXhjaXRlX25hbmRmbGFzaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL3JtOWtfZXRoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1leGNpdGUvcm05a19ldGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9ybTlrX2V0aC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1leGNpdGUvcm05a19ldGguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9ybTlrX3dkdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlL3JtOWtfd2R0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvcm05a193ZHQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlL3JtOWtfd2R0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvcm05a194aWNhcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZXhjaXRlL3JtOWtfeGljYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9ybTlrX3hpY2FwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS9ybTlrX3hpY2FwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1leGNpdGUvd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWV4Y2l0ZS93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZG1hLWNvaGVyZW5jZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9kbWEtY29oZXJlbmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2RtYS1jb2hlcmVuY2UuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9kbWEtY29oZXJlbmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2Zsb3BweS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9mbG9wcHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2dwaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZ3Bpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9ncGlvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZ3Bpby5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2lkZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9pZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzkzYTViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9pZGUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMKKyAqCisgKiBDb3BpZWQgZnJvbSBpMzg2OyBtYW55IG9mIHRoZSBlc3BlY2lhbGx5IG9sZGVyIE1JUFMgb3IgSVNBLWJhc2VkIHBsYXRmb3JtcworICogYXJlIGJhc2ljYWxseSBpZGVudGljYWwuICBVc2luZyB0aGlzIGZpbGUgcHJvYmFibHkgaW1wbGllcyBpODI1OSBQSUMKKyAqIHN1cHBvcnQgaW4gYSBzeXN0ZW0gYnV0IHRoZSB2ZXJ5IGxlYXN0IGludGVycnVwdCBudW1iZXJzIDAgLSAxNSBuZWVkIHRvCisgKiBiZSBwdXQgYXNpZGUgZm9yIGxlZ2FjeSBkZXZpY2VzLgorICovCisjaWZuZGVmIF9fQVNNX01BQ0hfR0VORVJJQ19JREVfSAorI2RlZmluZSBfX0FTTV9NQUNIX0dFTkVSSUNfSURFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyogTUlQUyBwb3J0IGFuZCBtZW1vcnktbWFwcGVkIEkvTyBzdHJpbmcgb3BlcmF0aW9ucy4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfZmx1c2hfcHJvbG9ndWUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2ZsdXNoX2VwaWxvZ3VlKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCisJCXByZWVtcHRfZW5hYmxlKCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKSB7CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIHNpemU7CisKKwkJd2hpbGUgKGFkZHIgPCBlbmQpIHsKKwkJCWxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSgodm9pZCAqKWFkZHIpOworCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCX0KKwl9Cit9CisKKy8qCisgKiBpbnN3KCkgYW5kIGdhbmcgbWlnaHQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgc28gd2UgY2FuJ3QKKyAqIHNlbmQgSVBJcyBmb3IgZmx1c2hpbmcgZHVlIHRvIHRoZSBwb3RlbmNpYWwgb2YgZGVhZGxvY2tzLCBzZWUgdGhlIGNvbW1lbnQKKyAqIGFib3ZlIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaW4gYXJjaC9taXBzL2tlcm5lbC9zbXAuYy4gIFdlIHdvcmsgYXJvdW5kIHRoZQorICogcHJvYmxlbSBieSBkaXNhYmxpbmcgcHJlZW1wdGlvbiBzbyB3ZSBrbm93IHdlIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGZsdXNoCisgKiBvbiB0aGUgcHJvY2Vzc29yIHRoYXQgYWN0dWFsbHkgaGFzIHRoZSBsaW5lcyB0byBiZSBmbHVzaGVkIHdoaWNoIGhvcGVmdWxseQorICogaXMgZXZlbiBiZXR0ZXIgZm9yIHBlcmZvcm1hbmNlIGFueXdheS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLAorCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOworCWluc3cocG9ydCwgYWRkciwgY291bnQpOworCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDIpOworCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7CisJaW5zbChwb3J0LCBhZGRyLCBjb3VudCk7CisJX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogNCk7CisJX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faWRlX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwKKwl1bnNpZ25lZCBsb25nIGNvdW50KQoreworCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7CisJb3V0c3cocG9ydCwgYWRkciwgY291bnQpOworCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDIpOworCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsCisJdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOworCW91dHNsKHBvcnQsIGFkZHIsIGNvdW50KTsKKwlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgY291bnQgKiA0KTsKKwlfX2lkZV9mbHVzaF9lcGlsb2d1ZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfbW1faW5zdyh2b2lkIF9faW9tZW0gKnBvcnQsIHZvaWQgKmFkZHIsIHUzMiBjb3VudCkKK3sKKwlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOworCXJlYWRzdyhwb3J0LCBhZGRyLCBjb3VudCk7CisJX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogMik7CisJX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faWRlX21tX2luc2wodm9pZCBfX2lvbWVtICpwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJX19pZGVfZmx1c2hfcHJvbG9ndWUoKTsKKwlyZWFkc2wocG9ydCwgYWRkciwgY291bnQpOworCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDQpOworCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9tbV9vdXRzdyh2b2lkIF9faW9tZW0gKnBvcnQsIHZvaWQgKmFkZHIsIHUzMiBjb3VudCkKK3sKKwlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOworCXdyaXRlc3cocG9ydCwgYWRkciwgY291bnQpOworCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDIpOworCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9tbV9vdXRzbCh2b2lkIF9faW9tZW0gKiBwb3J0LCB2b2lkICphZGRyLCB1MzIgY291bnQpCit7CisJX19pZGVfZmx1c2hfcHJvbG9ndWUoKTsKKwl3cml0ZXNsKHBvcnQsIGFkZHIsIGNvdW50KTsKKwlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgY291bnQgKiA0KTsKKwlfX2lkZV9mbHVzaF9lcGlsb2d1ZSgpOworfQorCisvKiBpZGVfaW5zdyBjYWxscyBpbnN3LCBub3QgX19pZGVfaW5zdy4gIFdoeT8gKi8KKyN1bmRlZiBpbnN3CisjdW5kZWYgaW5zbAorI3VuZGVmIG91dHN3CisjdW5kZWYgb3V0c2wKKyNkZWZpbmUgaW5zdyhwb3J0LCBhZGRyLCBjb3VudCkgX19pZGVfaW5zdyhwb3J0LCBhZGRyLCBjb3VudCkKKyNkZWZpbmUgaW5zbChwb3J0LCBhZGRyLCBjb3VudCkgX19pZGVfaW5zbChwb3J0LCBhZGRyLCBjb3VudCkKKyNkZWZpbmUgb3V0c3cocG9ydCwgYWRkciwgY291bnQpIF9faWRlX291dHN3KHBvcnQsIGFkZHIsIGNvdW50KQorI2RlZmluZSBvdXRzbChwb3J0LCBhZGRyLCBjb3VudCkgX19pZGVfb3V0c2wocG9ydCwgYWRkciwgY291bnQpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfX0FTTV9NQUNIX0dFTkVSSUNfSURFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2lvcmVtYXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvaW9yZW1hcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9pb3JlbWFwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvaW9yZW1hcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9pcnEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvaXJxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2lycS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9rZXJuZWwtZW50cnktaW5pdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9rZXJuZWwtZW50cnktaW5pdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9rZXJuZWwtZW50cnktaW5pdC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL2tlcm5lbC1lbnRyeS1pbml0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2ttYWxsb2MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMva21hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9rbWFsbG9jLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMva21hbGxvYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9tYW5nbGUtcG9ydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9tYW5nbGUtcG9ydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9tYW5nbGUtcG9ydC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL21hbmdsZS1wb3J0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL21jMTQ2ODE4cnRjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL21jMTQ2ODE4cnRjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL21jMTQ2ODE4cnRjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvbWMxNDY4MThydGMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvc3BhY2VzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL3NwYWNlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9zcGFjZXMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9zcGFjZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvdG9wb2xvZ3kuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvdG9wb2xvZ3kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvdG9wb2xvZ3kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy90b3BvbG9neS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDIyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDIyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9zcGFjZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjIvc3BhY2VzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDIyL3NwYWNlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDIyL3NwYWNlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjIvd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDIyL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDIyL3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9kbWEtY29oZXJlbmNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2RtYS1jb2hlcmVuY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvZG1hLWNvaGVyZW5jZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2RtYS1jb2hlcmVuY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9pcnEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy9pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcva2VybmVsLWVudHJ5LWluaXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcva2VybmVsLWVudHJ5LWluaXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcva2VybmVsLWVudHJ5LWluaXQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy9rZXJuZWwtZW50cnktaW5pdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9rbWFsbG9jLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2ttYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcva21hbGxvYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2ttYWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvbWFuZ2xlLXBvcnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvbWFuZ2xlLXBvcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvbWFuZ2xlLXBvcnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy9tYW5nbGUtcG9ydC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9tbXpvbmUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvbW16b25lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L21tem9uZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L21tem9uZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy9zcGFjZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvc3BhY2VzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3NwYWNlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L3NwYWNlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy90b3BvbG9neS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L3RvcG9sb2d5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyNy93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI4L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyOC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI4L3NwYWNlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyOC9zcGFjZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjgvc3BhY2VzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjgvc3BhY2VzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI4L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAyOC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjgvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjgvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAzMi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvZG1hLWNvaGVyZW5jZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtaXAzMi9kbWEtY29oZXJlbmNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvZG1hLWNvaGVyZW5jZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAzMi9rbWFsbG9jLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDMyL2ttYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIva21hbGxvYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDMyL2ttYWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvbWFuZ2xlLXBvcnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvbWFuZ2xlLXBvcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvbWFuZ2xlLXBvcnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAzMi9tYW5nbGUtcG9ydC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAzMi9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAzMi9tYzE0NjgxOHJ0Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtaXAzMi9tYzE0NjgxOHJ0Yy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDMyL21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDMyL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtaXAzMi93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMzIvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZG1hLWNvaGVyZW5jZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9kbWEtY29oZXJlbmNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZG1hLWNvaGVyZW5jZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9mbG9wcHkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZmxvcHB5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L2Zsb3BweS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qYXp6L2Zsb3BweS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtamF6ei9tYzE0NjgxOHJ0Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9tYzE0NjgxOHJ0Yy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qYXp6L21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYXp6L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtamF6ei93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenovd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1sYXNhdC9pcnEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhc2F0L2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbGFzYXQvaXJxLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxhc2F0L2lycS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtbGFzYXQvbWFjaC1ndDY0MTIwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYXNhdC9tYWNoLWd0NjQxMjAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWxhc2F0L21hY2gtZ3Q2NDEyMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sYXNhdC9tYWNoLWd0NjQxMjAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWxhc2F0L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFzYXQvd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1sYXNhdC93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGFzYXQvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1sZW1vdGUvZG1hLWNvaGVyZW5jZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGVtb3RlL2RtYS1jb2hlcmVuY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWxlbW90ZS9kbWEtY29oZXJlbmNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxlbW90ZS9kbWEtY29oZXJlbmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1sZW1vdGUvbWMxNDY4MThydGMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxlbW90ZS9tYzE0NjgxOHJ0Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbGVtb3RlL21jMTQ2ODE4cnRjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxlbW90ZS9tYzE0NjgxOHJ0Yy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtbGVtb3RlL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGVtb3RlL3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbGVtb3RlL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sZW1vdGUvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1tYWx0YS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbWFsdGEvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtbWFsdGEvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9pcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLW1hbHRhL2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLW1hbHRhL2tlcm5lbC1lbnRyeS1pbml0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1tYWx0YS9rZXJuZWwtZW50cnktaW5pdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbWFsdGEva2VybmVsLWVudHJ5LWluaXQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEva2VybmVsLWVudHJ5LWluaXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLW1hbHRhL21hY2gtZ3Q2NDEyMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvbWFjaC1ndDY0MTIwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1tYWx0YS9tYWNoLWd0NjQxMjAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvbWFjaC1ndDY0MTIwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1tYWx0YS9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbWFsdGEvbWMxNDY4MThydGMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLW1hbHRhL21jMTQ2ODE4cnRjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1tYWx0YS93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtbWFsdGEvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1hbHRhL3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtbWlwc3NpbS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1pcHNzaW0vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1taXBzc2ltL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1taXBzc2ltL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtbWlwc3NpbS93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLW1pcHNzaW0vd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1taXBzc2ltL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1taXBzc2ltL3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL21jMTQ2ODE4cnRjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvbWMxNDY4MThydGMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9tYzE0NjgxOHJ0Yy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvbWMxNDY4MThydGMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjEwMDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjEwMDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjEwMDAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTAwMC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTEwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTEwMC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTEwMC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxMTAwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1wYjF4MDAvcGIxMjAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxMjAwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1wYjF4MDAvcGIxMjAwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjE1MDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjE1MDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBiMXgwMC9wYjE1MDAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTUwMC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTU1MC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcGIxeDAwL3BiMTU1MC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxNTUwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwL2NtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL2NtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwL2NtLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAvY20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvZ2xiLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL2dsYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcG54ODU1MC9nbGIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC9nbGIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvaW50LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcG54ODU1MC9pbnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC9pbnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAva2VybmVsLWVudHJ5LWluaXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAva2VybmVsLWVudHJ5LWluaXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAva2VybmVsLWVudHJ5LWluaXQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC9rZXJuZWwtZW50cnktaW5pdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcG54ODU1MC9uYW5kLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL25hbmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvbmFuZC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL25hbmQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wbng4NTUwL3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcG54ODU1MC9wY2kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC9wY2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvdWFydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC91YXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwL3VhcnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC91YXJ0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwL3VzYi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC91c2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvdXNiLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAvdXNiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG54ODU1MC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXBueDg1NTAvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBueDg1NTAvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2Rkci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9kZHIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvZGRyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvZGRyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2RtYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9kbWEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvZG1hLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvZG1hLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2RtYV92LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2RtYV92LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2RtYV92LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvZG1hX3YuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvZXRoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2V0aC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9ldGguaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9ldGguaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU1NTRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9ncGlvLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KKyAqCUFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogR1BJTyByZWdpc3RlciBkZWZpbml0aW9uLgorICoKKyAqIEF1dGhvciA6IHJ5YW4uaG9sbVFWaXN0QGlkdC5jb20KKyAqIERhdGUgICA6IDIwMDExMDA1CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUnlhbiBIb2xtIDxyeWFuLmhvbG1RVmlzdEBpZHQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CisgKi8KKworI2lmbmRlZiBfUkMzMjQzNF9HUElPX0hfCisjZGVmaW5lIF9SQzMyNDM0X0dQSU9fSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisjZGVmaW5lIE5SX0JVSUxUSU5fR1BJTwkJMzIKKworI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKKyNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKKworI2RlZmluZSBncGlvX3RvX2lycShncGlvKQkoOCArIDQgKiAzMiArIGdwaW8pCisjZGVmaW5lIGlycV90b19ncGlvKGlycSkJKGlycSAtICg4ICsgNCAqIDMyKSkKKworc3RydWN0IHJiNTMyX2dwaW9fcmVnIHsKKwl1MzIgICBncGlvZnVuYzsgICAvKiBHUElPIEZ1bmN0aW9uIFJlZ2lzdGVyCisJCQkgICAqIGdwaW9mdW5jW3hdPT0wIGJpdCA9IGdwaW8KKwkJCSAgICogZnVuY1t4XT09MSAgYml0ID0gYWx0ZnVuYworCQkJICAgKi8KKwl1MzIgICBncGlvY2ZnOwkgIC8qIEdQSU8gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCQkJICAgKiBncGlvY2ZnW3hdPT0wIGJpdCA9IGlucHV0CisJCQkgICAqIGdwaW9jZmdbeF09PTEgYml0ID0gb3V0cHV0CisJCQkgICAqLworCXUzMiAgIGdwaW9kOwkgIC8qIEdQSU8gRGF0YSBSZWdpc3RlcgorCQkJICAgKiBncGlvZFt4XSByZWFkL3dyaXRlIGdwaW8gcGluWCBzdGF0dXMKKwkJCSAgICovCisJdTMyICAgZ3Bpb2lsZXZlbDsgLyogR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisJCQkgICAqIGludGVycnVwdCBsZXZlbCAoc2VlIGdwaW9pc3RhdCkKKwkJCSAgICovCisJdTMyICAgZ3Bpb2lzdGF0OyAgLyogR3BpbyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisJCQkgICAqIGlzdGF0W3hdID0gKGdwaW9kW3hdID09IGxldmVsW3hdKQorCQkJICAgKiBjbGVhcmVkIGluIElTUiAoU1RJQ0tZIGJpdHMpCisJCQkgICAqLworCXUzMiAgIGdwaW9ubWllbjsgIC8qIEdQSU8gTm9uLW1hc2thYmxlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KK307CisKKy8qIFVBUlQgR1BJTyBzaWduYWxzICovCisjZGVmaW5lIFJDMzI0MzRfVUFSVDBfU09VVAkoMSA8PCAwKQorI2RlZmluZSBSQzMyNDM0X1VBUlQwX1NJTgkoMSA8PCAxKQorI2RlZmluZSBSQzMyNDM0X1VBUlQwX1JUUwkoMSA8PCAyKQorI2RlZmluZSBSQzMyNDM0X1VBUlQwX0NUUwkoMSA8PCAzKQorCisvKiBNICYgUCBidXMgR1BJTyBzaWduYWxzICovCisjZGVmaW5lIFJDMzI0MzRfTVBfQklUXzIyCSgxIDw8IDQpCisjZGVmaW5lIFJDMzI0MzRfTVBfQklUXzIzCSgxIDw8IDUpCisjZGVmaW5lIFJDMzI0MzRfTVBfQklUXzI0CSgxIDw8IDYpCisjZGVmaW5lIFJDMzI0MzRfTVBfQklUXzI1CSgxIDw8IDcpCisKKy8qIENQVSBHUElPIHNpZ25hbHMgKi8KKyNkZWZpbmUgUkMzMjQzNF9DUFVfR1BJTwkoMSA8PCA4KQorCisvKiBSZXNlcnZlZCBHUElPIHNpZ25hbHMgKi8KKyNkZWZpbmUgUkMzMjQzNF9BRl9TUEFSRV82CSgxIDw8IDkpCisjZGVmaW5lIFJDMzI0MzRfQUZfU1BBUkVfNAkoMSA8PCAxMCkKKyNkZWZpbmUgUkMzMjQzNF9BRl9TUEFSRV8zCSgxIDw8IDExKQorI2RlZmluZSBSQzMyNDM0X0FGX1NQQVJFXzIJKDEgPDwgMTIpCisKKy8qIFBDSSBtZXNzYWdpbmcgdW5pdCAqLworI2RlZmluZSBSQzMyNDM0X1BDSV9NU1VfR1BJTwkoMSA8PCAxMykKKworLyogTkFORCBHUElPIHNpZ25hbHMgKi8KKyNkZWZpbmUgR1BJT19SRFkJCTgKKyNkZWZpbmUgR1BJT19XUFgJOQorI2RlZmluZSBHUElPX0FMRQkJMTAKKyNkZWZpbmUgR1BJT19DTEUJCTExCisKKy8qIENvbXBhY3QgRmxhc2ggR1BJTyBwaW4gKi8KKyNkZWZpbmUgQ0ZfR1BJT19OVU0JCTEzCisKK2V4dGVybiB2b2lkIHNldF80MzRfcmVnKHVuc2lnbmVkIHJlZ19vZmZzLCB1bnNpZ25lZCBiaXQsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgdmFsKTsKK2V4dGVybiB1bnNpZ25lZCBnZXRfNDM0X3JlZyh1bnNpZ25lZCByZWdfb2Zmcyk7CitleHRlcm4gdm9pZCBzZXRfbGF0Y2hfdTUodW5zaWduZWQgY2hhciBvcl9tYXNrLCB1bnNpZ25lZCBjaGFyIG5hbmRfbWFzayk7CitleHRlcm4gdW5zaWduZWQgY2hhciBnZXRfbGF0Y2hfdTUodm9pZCk7CisKKyNlbmRpZiAvKiBfUkMzMjQzNF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9pbnRlZy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9pbnRlZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9pbnRlZy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2ludGVnLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzM4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L2lycS5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX19BU01fUkMzMjQzNF9JUlFfSAorI2RlZmluZSBfX0FTTV9SQzMyNDM0X0lSUV9ICisKKyNkZWZpbmUgTlJfSVJRUwkyNTYKKworI2luY2x1ZGUgPGFzbS9tYWNoLWdlbmVyaWMvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYi5oPgorCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworI2RlZmluZSBJQ19HUk9VUDBfUEVORAkJKFJFR0JBU0UgKyAweDM4MDAwKQorI2RlZmluZSBJQ19HUk9VUDBfTUFTSwkJKFJFR0JBU0UgKyAweDM4MDA4KQorI2RlZmluZSBJQ19HUk9VUF9PRkZTRVQJCTB4MEMKKworI2RlZmluZSBOVU1fSU5UUl9HUk9VUFMJCTUKKworLyogMTY1NTAgVUFSVHMgKi8KKyNkZWZpbmUgR1JPVVAwX0lSUV9CQVNFCQk4CS8qIEdSUDIgSVJRIG51bWJlcnMgc3RhcnQgaGVyZSAqLworCQkJCQkvKiBHUlAzIElSUSBudW1iZXJzIHN0YXJ0IGhlcmUgKi8KKyNkZWZpbmUgR1JPVVAxX0lSUV9CQVNFCQkoR1JPVVAwX0lSUV9CQVNFICsgMzIpCisJCQkJCS8qIEdSUDQgSVJRIG51bWJlcnMgc3RhcnQgaGVyZSAqLworI2RlZmluZSBHUk9VUDJfSVJRX0JBU0UJCShHUk9VUDFfSVJRX0JBU0UgKyAzMikKKwkJCQkJLyogR1JQNSBJUlEgbnVtYmVycyBzdGFydCBoZXJlICovCisjZGVmaW5lIEdST1VQM19JUlFfQkFTRQkJKEdST1VQMl9JUlFfQkFTRSArIDMyKQorI2RlZmluZSBHUk9VUDRfSVJRX0JBU0UJCShHUk9VUDNfSVJRX0JBU0UgKyAzMikKKworI2RlZmluZSBVQVJUMF9JUlEJCShHUk9VUDNfSVJRX0JBU0UgKyAwKQorCisjZGVmaW5lIEVUSDBfRE1BX1JYX0lSUSAgIAkoR1JPVVAxX0lSUV9CQVNFICsgMCkKKyNkZWZpbmUgRVRIMF9ETUFfVFhfSVJRICAgCShHUk9VUDFfSVJRX0JBU0UgKyAxKQorI2RlZmluZSBFVEgwX1JYX09WUl9JUlEgICAJKEdST1VQM19JUlFfQkFTRSArIDkpCisjZGVmaW5lIEVUSDBfVFhfVU5EX0lSUSAgIAkoR1JPVVAzX0lSUV9CQVNFICsgMTApCisKKyNlbmRpZiAgLyogX19BU01fUkMzMjQzNF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9wY2kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9wY2kuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9wcm9tLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L3Byb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA3MDdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9wcm9tLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqICBEZWZpbml0aW9ucyBmb3IgdGhlIFBST00KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDIgUnlhbiBIb2xtIDxyeWFuLmhvbG1RVmlzdEBpZHQuY29tPgorICogIENvcHlyaWdodCAyMDA4IEZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjZGVmaW5lIFBST01fRU5UUlkoeCkJCSgweGJmYzAwMDAwICsgKCh4KSAqIDgpKQorCisjZGVmaW5lIFNSX05NSQkJCTB4MDAxODAwMDAKKyNkZWZpbmUgU0VSSUFMX1NQRUVEX0VOVFJZCTB4MDAwMDAwMDEKKworI2RlZmluZSBGUkVRX1RBRwkJIkhaPSIKKyNkZWZpbmUgS01BQ19UQUcJCSJrbWFjPSIKKyNkZWZpbmUgTUVNX1RBRwkJCSJtZW09IgorI2RlZmluZSBCT0FSRF9UQUcJCSJib2FyZD0iCisKKyNkZWZpbmUgQk9BUkRfUkI1MzIJCSI1MDAiCisjZGVmaW5lIEJPQVJEX1JCNTMyQQkJIjUwMHI1IgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9yYi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9yYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZThlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L3JiLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBJRFQgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwNiBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKi8KKyNpZm5kZWYgX19BU01fUkMzMjQzNF9SQl9ICisjZGVmaW5lIF9fQVNNX1JDMzI0MzRfUkJfSAorCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKworI2RlZmluZSBSRUdCQVNFCQkweDE4MDAwMDAwCisjZGVmaW5lIElEVDQzNF9SRUdfQkFTRQkoKHZvbGF0aWxlIHZvaWQgKikgS1NFRzFBRERSKFJFR0JBU0UpKQorI2RlZmluZSBVQVJUMEJBU0UJMHg1ODAwMAorI2RlZmluZSBSU1QJCSgxIDw8IDE1KQorI2RlZmluZSBERVYwQkFTRQkweDAxMDAwMAorI2RlZmluZSBERVYwTUFTSwkweDAxMDAwNAorI2RlZmluZSBERVYwQwkJMHgwMTAwMDgKKyNkZWZpbmUgREVWMFQJCTB4MDEwMDBDCisjZGVmaW5lIERFVjFCQVNFCTB4MDEwMDEwCisjZGVmaW5lIERFVjFNQVNLCTB4MDEwMDE0CisjZGVmaW5lIERFVjFDCQkweDAxMDAxOAorI2RlZmluZSBERVYxVEMJCTB4MDEwMDFDCisjZGVmaW5lIERFVjJCQVNFCTB4MDEwMDIwCisjZGVmaW5lIERFVjJNQVNLCTB4MDEwMDI0CisjZGVmaW5lIERFVjJDCQkweDAxMDAyOAorI2RlZmluZSBERVYyVEMJCTB4MDEwMDJDCisjZGVmaW5lIERFVjNCQVNFCTB4MDEwMDMwCisjZGVmaW5lIERFVjNNQVNLCTB4MDEwMDM0CisjZGVmaW5lIERFVjNDCQkweDAxMDAzOAorI2RlZmluZSBERVYzVEMJCTB4MDEwMDNDCisjZGVmaW5lIEJUQ1MJCTB4MDEwMDQwCisjZGVmaW5lIEJUQ09NUEFSRQkweDAxMDA0NAorI2RlZmluZSBHUElPQkFTRQkweDA1MDAwMAorI2RlZmluZSBHUElPQ0ZHCQkweDA1MDAwNAorI2RlZmluZSBHUElPRAkJMHgwNTAwMDgKKyNkZWZpbmUgR1BJT0lMRVZFTAkweDA1MDAwQworI2RlZmluZSBHUElPSVNUQVQJMHgwNTAwMTAKKyNkZWZpbmUgR1BJT05NSUVOCTB4MDUwMDE0CisjZGVmaW5lIElNQVNLNgkJMHgwMzgwMzgKKyNkZWZpbmUgTE9fV1BYCQkoMSA8PCAwKQorI2RlZmluZSBMT19BTEUJCSgxIDw8IDEpCisjZGVmaW5lIExPX0NMRQkJKDEgPDwgMikKKyNkZWZpbmUgTE9fQ0VYCQkoMSA8PCAzKQorI2RlZmluZSBMT19GT0ZGCQkoMSA8PCA1KQorI2RlZmluZSBMT19TUElDUwkoMSA8PCA2KQorI2RlZmluZSBMT19VTEVECQkoMSA8PCA3KQorCisjZGVmaW5lIEJJVF9UT19NQVNLKHgpCSgxIDw8IHgpCisKK3N0cnVjdCBkZXZfcmVnIHsKKwl1MzIJYmFzZTsKKwl1MzIJbWFzazsKKwl1MzIJY3RsOworCXUzMgl0aW1pbmc7Cit9OworCitzdHJ1Y3Qga29yaW5hX2RldmljZSB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIG1hY1s2XTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworfTsKKworc3RydWN0IGNmX2RldmljZSB7CisJaW50IGdwaW9fcGluOworCXZvaWQgKmRldjsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7Cit9OworCitzdHJ1Y3QgbXBtY19kZXZpY2UgeworCXVuc2lnbmVkIGNoYXIJc3RhdGU7CisJc3BpbmxvY2tfdAlsb2NrOworCXZvaWQgX19pb21lbSAJKmJhc2U7Cit9OworCisjZW5kaWYgIC8qIF9fQVNNX1JDMzI0MzRfUkJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9yYzMyNDM0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L3JjMzI0MzQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UyNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC9yYzMyNDM0LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBJRFQgUkMzMjM0MzQgQ1BVLgorICovCisKKyNpZm5kZWYgX0FTTV9SQzMyNDM0X1JDMzI0MzRfSF8KKyNkZWZpbmUgX0FTTV9SQzMyNDM0X1JDMzI0MzRfSF8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBJRFRfQ0xPQ0tfTVVMVAkJMgorCisvKiBjcHUgcGlwZWxpbmUgZmx1c2ggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYzMyNDM0X3N5bmModm9pZCkKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOworfQorCisjZW5kaWYgIC8qIF9BU01fUkMzMjQzNF9SQzMyNDM0X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC90aW1lci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC90aW1lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC90aW1lci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1yYzMyNDM0L3RpbWVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcmMzMjQzNC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJjMzI0MzQvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJtL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcm0vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJtL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0vbWMxNDY4MThydGMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXJtL21jMTQ2ODE4cnRjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybS9tYzE0NjgxOHJ0Yy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1ybS9tYzE0NjgxOHJ0Yy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0vd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1ybS93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1ybS93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXNpYnl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtc2lieXRlL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtc2lieXRlL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtc2lieXRlL3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtc2lieXRlL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1zaWJ5dGUvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDM5eHgvaW9yZW1hcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHgzOXh4L2lvcmVtYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXR4Mzl4eC9pb3JlbWFwLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4Mzl4eC9pb3JlbWFwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDM5eHgvbWFuZ2xlLXBvcnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4Mzl4eC9tYW5nbGUtcG9ydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtdHgzOXh4L21hbmdsZS1wb3J0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4Mzl4eC9tYW5nbGUtcG9ydC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdHgzOXh4L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHgzOXh4L3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtdHgzOXh4L3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDM5eHgvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDQ5eHgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC10eDQ5eHgvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4NDl4eC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXR4NDl4eC9pb3JlbWFwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgvaW9yZW1hcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtdHg0OXh4L2lvcmVtYXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHg0OXh4L2lvcmVtYXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXR4NDl4eC9rbWFsbG9jLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC10eDQ5eHgva21hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtdHg0OXh4L2ttYWxsb2MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHg0OXh4L2ttYWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXR4NDl4eC93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXR4NDl4eC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXR4NDl4eC93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdHg0OXh4L3dhci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdnI0MXh4L2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtdnI0MXh4L2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtdnI0MXh4L2lycS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC12cjQxeHgvaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC12cjQxeHgvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC12cjQxeHgvd2FyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC12cjQxeHgvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXZyNDF4eC93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXdycHBtYy9tYWNoLWd0NjQxMjAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXdycHBtYy9tYWNoLWd0NjQxMjAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXdycHBtYy9tYWNoLWd0NjQxMjAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtd3JwcG1jL21hY2gtZ3Q2NDEyMC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtd3JwcG1jL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtd3JwcG1jL3dhci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtd3JwcG1jL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC13cnBwbWMvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC15b3NlbWl0ZS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXlvc2VtaXRlL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gteW9zZW1pdGUvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXlvc2VtaXRlL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gteW9zZW1pdGUvd2FyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC15b3NlbWl0ZS93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXlvc2VtaXRlL3dhci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC15b3NlbWl0ZS93YXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYzE0NjgxOC10aW1lLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWMxNDY4MTgtdGltZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21jMTQ2ODE4LXRpbWUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21jMTQ2ODE4LXRpbWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWMxNDY4MThydGMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvYm9uaXRvNjQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9ib25pdG82NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL2Jvbml0bzY0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9ib25pdG82NC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9nZW5lcmljLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvZ2VuZXJpYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL2xhdW5jaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL2xhdW5jaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL2xhdW5jaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbGF1bmNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvbWFsdGEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9tYWx0YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL21hbHRhLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9tYWx0YS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL21hbHRhaW50LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9tYWx0YWludC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL21zYzAxX3BjaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL3BpaXg0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9waWl4NC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcGlpeDQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9wcm9tLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvcHJvbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL3Byb20uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3Byb20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9zaW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWJvYXJkcy9zaW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9zaW0uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3NpbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL3NpbWludC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtYm9hcmRzL3NpbWludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL3NpbWludC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1ib2FyZHMvc2ltaW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc19tdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNfbXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzX210LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzX210LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc210cmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNtdHJlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9taXBzbXRyZWdzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzbXRyZWdzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc3Byb20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21pcHNwcm9tLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTg2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaApAQCAtMCwwICsxLDE1MjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogTW9kaWZpZWQgZm9yIGZ1cnRoZXIgUlsyMzZdMDAwIHN1cHBvcnQgYnkgUGF1bCBNLiBBbnRvaW5lLCAxOTk2LgorICogS2V2aW4gRC4gS2lzc2VsbCwga2V2aW5rQG1pcHMuY29tIGFuZCBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMDcgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgTWFjaWVqIFcuIFJvenlja2kKKyAqLworI2lmbmRlZiBfQVNNX01JUFNSRUdTX0gKKyNkZWZpbmUgX0FTTV9NSVBTUkVHU19ICisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2hhemFyZHMuaD4KKyNpbmNsdWRlIDxhc20vd2FyLmg+CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZXNwZWNpYWxseSB1c2VmdWwgZm9yIF9fYXNtX18KKyAqIGlubGluZSBhc3NlbWJsZXIuCisgKi8KKyNpZm5kZWYgX19TVFIKKyNkZWZpbmUgX19TVFIoeCkgI3gKKyNlbmRpZgorI2lmbmRlZiBTVFIKKyNkZWZpbmUgU1RSKHgpIF9fU1RSKHgpCisjZW5kaWYKKworLyoKKyAqICBDb25maWd1cmUgbGFuZ3VhZ2UKKyAqLworI2lmZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBfVUxDQVNUXworI2Vsc2UKKyNkZWZpbmUgX1VMQ0FTVF8gKHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKworLyoKKyAqIENvcHJvY2Vzc29yIDAgcmVnaXN0ZXIgbmFtZXMKKyAqLworI2RlZmluZSBDUDBfSU5ERVggJDAKKyNkZWZpbmUgQ1AwX1JBTkRPTSAkMQorI2RlZmluZSBDUDBfRU5UUllMTzAgJDIKKyNkZWZpbmUgQ1AwX0VOVFJZTE8xICQzCisjZGVmaW5lIENQMF9DT05GICQzCisjZGVmaW5lIENQMF9DT05URVhUICQ0CisjZGVmaW5lIENQMF9QQUdFTUFTSyAkNQorI2RlZmluZSBDUDBfV0lSRUQgJDYKKyNkZWZpbmUgQ1AwX0lORk8gJDcKKyNkZWZpbmUgQ1AwX0JBRFZBRERSICQ4CisjZGVmaW5lIENQMF9DT1VOVCAkOQorI2RlZmluZSBDUDBfRU5UUllISSAkMTAKKyNkZWZpbmUgQ1AwX0NPTVBBUkUgJDExCisjZGVmaW5lIENQMF9TVEFUVVMgJDEyCisjZGVmaW5lIENQMF9DQVVTRSAkMTMKKyNkZWZpbmUgQ1AwX0VQQyAkMTQKKyNkZWZpbmUgQ1AwX1BSSUQgJDE1CisjZGVmaW5lIENQMF9DT05GSUcgJDE2CisjZGVmaW5lIENQMF9MTEFERFIgJDE3CisjZGVmaW5lIENQMF9XQVRDSExPICQxOAorI2RlZmluZSBDUDBfV0FUQ0hISSAkMTkKKyNkZWZpbmUgQ1AwX1hDT05URVhUICQyMAorI2RlZmluZSBDUDBfRlJBTUVNQVNLICQyMQorI2RlZmluZSBDUDBfRElBR05PU1RJQyAkMjIKKyNkZWZpbmUgQ1AwX0RFQlVHICQyMworI2RlZmluZSBDUDBfREVQQyAkMjQKKyNkZWZpbmUgQ1AwX1BFUkZPUk1BTkNFICQyNQorI2RlZmluZSBDUDBfRUNDICQyNgorI2RlZmluZSBDUDBfQ0FDSEVFUlIgJDI3CisjZGVmaW5lIENQMF9UQUdMTyAkMjgKKyNkZWZpbmUgQ1AwX1RBR0hJICQyOQorI2RlZmluZSBDUDBfRVJST1JFUEMgJDMwCisjZGVmaW5lIENQMF9ERVNBVkUgJDMxCisKKy8qCisgKiBSNDY0MC9SNDY1MCBjcDAgcmVnaXN0ZXIgbmFtZXMuICBUaGVzZSByZWdpc3RlcnMgYXJlIGxpc3RlZAorICogaGVyZSBvbmx5IGZvciBjb21wbGV0ZW5lc3M7IHdpdGhvdXQgTU1VIHRoZXNlIENQVXMgYXJlIG5vdCB1c2VhYmxlCisgKiBieSBMaW51eC4gIEEgZnV0dXJlIEVMS1MgcG9ydCBtaWdodCB0YWtlIG1ha2UgTGludXggcnVuIG9uIHRoZW0KKyAqIHRob3VnaCAuLi4KKyAqLworI2RlZmluZSBDUDBfSUJBU0UgJDAKKyNkZWZpbmUgQ1AwX0lCT1VORCAkMQorI2RlZmluZSBDUDBfREJBU0UgJDIKKyNkZWZpbmUgQ1AwX0RCT1VORCAkMworI2RlZmluZSBDUDBfQ0FMRyAkMTcKKyNkZWZpbmUgQ1AwX0lXQVRDSCAkMTgKKyNkZWZpbmUgQ1AwX0RXQVRDSCAkMTkKKworLyoKKyAqIENvcHJvY2Vzc29yIDAgU2V0IDEgcmVnaXN0ZXIgbmFtZXMKKyAqLworI2RlZmluZSBDUDBfUzFfREVSUkFERFIwICAkMjYKKyNkZWZpbmUgQ1AwX1MxX0RFUlJBRERSMSAgJDI3CisjZGVmaW5lIENQMF9TMV9JTlRDT05UUk9MICQyMAorCisvKgorICogQ29wcm9jZXNzb3IgMCBTZXQgMiByZWdpc3RlciBuYW1lcworICovCisjZGVmaW5lIENQMF9TMl9TUlNDVEwJICAkMTIJLyogTUlQU1IyICovCisKKy8qCisgKiBDb3Byb2Nlc3NvciAwIFNldCAzIHJlZ2lzdGVyIG5hbWVzCisgKi8KKyNkZWZpbmUgQ1AwX1MzX1NSU01BUAkgICQxMgkvKiBNSVBTUjIgKi8KKworLyoKKyAqICBUWDM5IFNlcmllcworICovCisjZGVmaW5lIENQMF9UWDM5X0NBQ0hFCSQ3CisKKy8qCisgKiBDb3Byb2Nlc3NvciAxIChGUFUpIHJlZ2lzdGVyIG5hbWVzCisgKi8KKyNkZWZpbmUgQ1AxX1JFVklTSU9OICAgJDAKKyNkZWZpbmUgQ1AxX1NUQVRVUyAgICAgJDMxCisKKy8qCisgKiBGUFUgU3RhdHVzIFJlZ2lzdGVyIFZhbHVlcworICovCisvKgorICogU3RhdHVzIFJlZ2lzdGVyIFZhbHVlcworICovCisKKyNkZWZpbmUgRlBVX0NTUl9GTFVTSCAgIDB4MDEwMDAwMDAgICAgICAvKiBmbHVzaCBkZW5vcm1hbGlzZWQgcmVzdWx0cyB0byAwICovCisjZGVmaW5lIEZQVV9DU1JfQ09ORCAgICAweDAwODAwMDAwICAgICAgLyogJGZjYzAgKi8KKyNkZWZpbmUgRlBVX0NTUl9DT05EMCAgIDB4MDA4MDAwMDAgICAgICAvKiAkZmNjMCAqLworI2RlZmluZSBGUFVfQ1NSX0NPTkQxICAgMHgwMjAwMDAwMCAgICAgIC8qICRmY2MxICovCisjZGVmaW5lIEZQVV9DU1JfQ09ORDIgICAweDA0MDAwMDAwICAgICAgLyogJGZjYzIgKi8KKyNkZWZpbmUgRlBVX0NTUl9DT05EMyAgIDB4MDgwMDAwMDAgICAgICAvKiAkZmNjMyAqLworI2RlZmluZSBGUFVfQ1NSX0NPTkQ0ICAgMHgxMDAwMDAwMCAgICAgIC8qICRmY2M0ICovCisjZGVmaW5lIEZQVV9DU1JfQ09ORDUgICAweDIwMDAwMDAwICAgICAgLyogJGZjYzUgKi8KKyNkZWZpbmUgRlBVX0NTUl9DT05ENiAgIDB4NDAwMDAwMDAgICAgICAvKiAkZmNjNiAqLworI2RlZmluZSBGUFVfQ1NSX0NPTkQ3ICAgMHg4MDAwMDAwMCAgICAgIC8qICRmY2M3ICovCisKKy8qCisgKiBYIHRoZSBleGNlcHRpb24gY2F1c2UgaW5kaWNhdG9yCisgKiBFIHRoZSBleGNlcHRpb24gZW5hYmxlCisgKiBTIHRoZSBzdGlja3kvZmxhZyBiaXQKKyovCisjZGVmaW5lIEZQVV9DU1JfQUxMX1ggICAweDAwMDNmMDAwCisjZGVmaW5lIEZQVV9DU1JfVU5JX1ggICAweDAwMDIwMDAwCisjZGVmaW5lIEZQVV9DU1JfSU5WX1ggICAweDAwMDEwMDAwCisjZGVmaW5lIEZQVV9DU1JfRElWX1ggICAweDAwMDA4MDAwCisjZGVmaW5lIEZQVV9DU1JfT1ZGX1ggICAweDAwMDA0MDAwCisjZGVmaW5lIEZQVV9DU1JfVURGX1ggICAweDAwMDAyMDAwCisjZGVmaW5lIEZQVV9DU1JfSU5FX1ggICAweDAwMDAxMDAwCisKKyNkZWZpbmUgRlBVX0NTUl9BTExfRSAgIDB4MDAwMDBmODAKKyNkZWZpbmUgRlBVX0NTUl9JTlZfRSAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRlBVX0NTUl9ESVZfRSAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRlBVX0NTUl9PVkZfRSAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRlBVX0NTUl9VREZfRSAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRlBVX0NTUl9JTkVfRSAgIDB4MDAwMDAwODAKKworI2RlZmluZSBGUFVfQ1NSX0FMTF9TICAgMHgwMDAwMDA3YworI2RlZmluZSBGUFVfQ1NSX0lOVl9TICAgMHgwMDAwMDA0MAorI2RlZmluZSBGUFVfQ1NSX0RJVl9TICAgMHgwMDAwMDAyMAorI2RlZmluZSBGUFVfQ1NSX09WRl9TICAgMHgwMDAwMDAxMAorI2RlZmluZSBGUFVfQ1NSX1VERl9TICAgMHgwMDAwMDAwOAorI2RlZmluZSBGUFVfQ1NSX0lORV9TICAgMHgwMDAwMDAwNAorCisvKiByb3VuZGluZyBtb2RlICovCisjZGVmaW5lIEZQVV9DU1JfUk4gICAgICAweDAgICAgIC8qIG5lYXJlc3QgKi8KKyNkZWZpbmUgRlBVX0NTUl9SWiAgICAgIDB4MSAgICAgLyogdG93YXJkcyB6ZXJvICovCisjZGVmaW5lIEZQVV9DU1JfUlUgICAgICAweDIgICAgIC8qIHRvd2FyZHMgK0luZmluaXR5ICovCisjZGVmaW5lIEZQVV9DU1JfUkQgICAgICAweDMgICAgIC8qIHRvd2FyZHMgLUluZmluaXR5ICovCisKKworLyoKKyAqIFZhbHVlcyBmb3IgUGFnZU1hc2sgcmVnaXN0ZXIKKyAqLworI2lmZGVmIENPTkZJR19DUFVfVlI0MVhYCisKKy8qIFdoeSBkb2Vzbid0IHN0dXBpZGl0eSBodXJ0IC4uLiAqLworCisjZGVmaW5lIFBNXzFLCQkweDAwMDAwMDAwCisjZGVmaW5lIFBNXzRLCQkweDAwMDAxODAwCisjZGVmaW5lIFBNXzE2SwkJMHgwMDAwNzgwMAorI2RlZmluZSBQTV82NEsJCTB4MDAwMWY4MDAKKyNkZWZpbmUgUE1fMjU2SwkJMHgwMDA3ZjgwMAorCisjZWxzZQorCisjZGVmaW5lIFBNXzRLCQkweDAwMDAwMDAwCisjZGVmaW5lIFBNXzE2SwkJMHgwMDAwNjAwMAorI2RlZmluZSBQTV82NEsJCTB4MDAwMWUwMDAKKyNkZWZpbmUgUE1fMjU2SwkJMHgwMDA3ZTAwMAorI2RlZmluZSBQTV8xTQkJMHgwMDFmZTAwMAorI2RlZmluZSBQTV80TQkJMHgwMDdmZTAwMAorI2RlZmluZSBQTV8xNk0JCTB4MDFmZmUwMDAKKyNkZWZpbmUgUE1fNjRNCQkweDA3ZmZlMDAwCisjZGVmaW5lIFBNXzI1Nk0JCTB4MWZmZmUwMDAKKworI2VuZGlmCisKKy8qCisgKiBEZWZhdWx0IHBhZ2Ugc2l6ZSBmb3IgYSBnaXZlbiBrZXJuZWwgY29uZmlndXJhdGlvbgorICovCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV80S0IKKyNkZWZpbmUgUE1fREVGQVVMVF9NQVNLCVBNXzRLCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfMTZLQikKKyNkZWZpbmUgUE1fREVGQVVMVF9NQVNLCVBNXzE2SworI2VsaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzY0S0IpCisjZGVmaW5lIFBNX0RFRkFVTFRfTUFTSwlQTV82NEsKKyNlbHNlCisjZXJyb3IgQmFkIHBhZ2Ugc2l6ZSBjb25maWd1cmF0aW9uIQorI2VuZGlmCisKKworLyoKKyAqIFZhbHVlcyB1c2VkIGZvciBjb21wdXRhdGlvbiBvZiBuZXcgdGxiIGVudHJpZXMKKyAqLworI2RlZmluZSBQTF80SwkJMTIKKyNkZWZpbmUgUExfMTZLCQkxNAorI2RlZmluZSBQTF82NEsJCTE2CisjZGVmaW5lIFBMXzI1NksJCTE4CisjZGVmaW5lIFBMXzFNCQkyMAorI2RlZmluZSBQTF80TQkJMjIKKyNkZWZpbmUgUExfMTZNCQkyNAorI2RlZmluZSBQTF82NE0JCTI2CisjZGVmaW5lIFBMXzI1Nk0JCTI4CisKKy8qCisgKiBSNHgwMCBpbnRlcnJ1cHQgZW5hYmxlIC8gY2F1c2UgYml0cworICovCisjZGVmaW5lIElFX1NXMCAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgIDgpCisjZGVmaW5lIElFX1NXMSAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgIDkpCisjZGVmaW5lIElFX0lSUTAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTApCisjZGVmaW5lIElFX0lSUTEgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTEpCisjZGVmaW5lIElFX0lSUTIgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTIpCisjZGVmaW5lIElFX0lSUTMgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTMpCisjZGVmaW5lIElFX0lSUTQgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTQpCisjZGVmaW5lIElFX0lSUTUgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTUpCisKKy8qCisgKiBSNHgwMCBpbnRlcnJ1cHQgY2F1c2UgYml0cworICovCisjZGVmaW5lIENfU1cwICAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgIDgpCisjZGVmaW5lIENfU1cxICAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgIDkpCisjZGVmaW5lIENfSVJRMCAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTApCisjZGVmaW5lIENfSVJRMSAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTEpCisjZGVmaW5lIENfSVJRMiAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTIpCisjZGVmaW5lIENfSVJRMyAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTMpCisjZGVmaW5lIENfSVJRNCAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTQpCisjZGVmaW5lIENfSVJRNSAgICAgICAgICAoX1VMQ0FTVF8oMSkgPDwgMTUpCisKKy8qCisgKiBCaXRmaWVsZHMgaW4gdGhlIFI0eHgwIGNwMCBzdGF0dXMgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBTVDBfSUUJCQkweDAwMDAwMDAxCisjZGVmaW5lIFNUMF9FWEwJCQkweDAwMDAwMDAyCisjZGVmaW5lIFNUMF9FUkwJCQkweDAwMDAwMDA0CisjZGVmaW5lIFNUMF9LU1UJCQkweDAwMDAwMDE4CisjICBkZWZpbmUgS1NVX1VTRVIJCTB4MDAwMDAwMTAKKyMgIGRlZmluZSBLU1VfU1VQRVJWSVNPUgkweDAwMDAwMDA4CisjICBkZWZpbmUgS1NVX0tFUk5FTAkJMHgwMDAwMDAwMAorI2RlZmluZSBTVDBfVVgJCQkweDAwMDAwMDIwCisjZGVmaW5lIFNUMF9TWAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU1QwX0tYIAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgU1QwX0RFCQkJMHgwMDAxMDAwMAorI2RlZmluZSBTVDBfQ0UJCQkweDAwMDIwMDAwCisKKy8qCisgKiBTZXR0aW5nIGMwX3N0YXR1cy5jbyBlbmFibGVzIEhpdF9Xcml0ZWJhY2sgYW5kIEhpdF9Xcml0ZWJhY2tfSW52YWxpZGF0ZQorICogY2FjaGVvcHMgaW4gdXNlcnNwYWNlLiAgVGhpcyBiaXQgZXhpc3RzIG9ubHkgb24gUk03MDAwIGFuZCBSTTkwMDAKKyAqIHByb2Nlc3NvcnMuCisgKi8KKyNkZWZpbmUgU1QwX0NPCQkJMHgwODAwMDAwMAorCisvKgorICogQml0ZmllbGRzIGluIHRoZSBSWzIzXTAwMCBjcDAgc3RhdHVzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNUMF9JRUMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1QwX0tVQwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1QwX0lFUAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU1QwX0tVUAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1QwX0lFTwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1QwX0tVTwkJCTB4MDAwMDAwMjAKKy8qIGJpdHMgNiAmIDcgYXJlIHJlc2VydmVkIG9uIFJbMjNdMDAwICovCisjZGVmaW5lIFNUMF9JU0MJCQkweDAwMDEwMDAwCisjZGVmaW5lIFNUMF9TV0MJCQkweDAwMDIwMDAwCisjZGVmaW5lIFNUMF9DTQkJCTB4MDAwODAwMDAKKworLyoKKyAqIEJpdHMgc3BlY2lmaWMgdG8gdGhlIFI0NjQwL1I0NjUwCisgKi8KKyNkZWZpbmUgU1QwX1VNCQkJKF9VTENBU1RfKDEpIDw8ICA0KQorI2RlZmluZSBTVDBfSUwJCQkoX1VMQ0FTVF8oMSkgPDwgMjMpCisjZGVmaW5lIFNUMF9ETAkJCShfVUxDQVNUXygxKSA8PCAyNCkKKworLyoKKyAqIEVuYWJsZSB0aGUgTUlQUyBNRE1YIGFuZCBEU1AgQVNFcworICovCisjZGVmaW5lIFNUMF9NWAkJCTB4MDEwMDAwMDAKKworLyoKKyAqIEJpdGZpZWxkcyBpbiB0aGUgVFgzOSBmYW1pbHkgQ1AwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMworICovCisjZGVmaW5lIFRYMzlfQ09ORl9JQ1NfU0hJRlQJMTkKKyNkZWZpbmUgVFgzOV9DT05GX0lDU19NQVNLCTB4MDAzODAwMDAKKyNkZWZpbmUgVFgzOV9DT05GX0lDU18xS0IgCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFgzOV9DT05GX0lDU18yS0IgCTB4MDAwODAwMDAKKyNkZWZpbmUgVFgzOV9DT05GX0lDU180S0IgCTB4MDAxMDAwMDAKKyNkZWZpbmUgVFgzOV9DT05GX0lDU184S0IgCTB4MDAxODAwMDAKKyNkZWZpbmUgVFgzOV9DT05GX0lDU18xNktCIAkweDAwMjAwMDAwCisKKyNkZWZpbmUgVFgzOV9DT05GX0RDU19TSElGVAkxNgorI2RlZmluZSBUWDM5X0NPTkZfRENTX01BU0sJMHgwMDA3MDAwMAorI2RlZmluZSBUWDM5X0NPTkZfRENTXzFLQiAJMHgwMDAwMDAwMAorI2RlZmluZSBUWDM5X0NPTkZfRENTXzJLQiAJMHgwMDAxMDAwMAorI2RlZmluZSBUWDM5X0NPTkZfRENTXzRLQiAJMHgwMDAyMDAwMAorI2RlZmluZSBUWDM5X0NPTkZfRENTXzhLQiAJMHgwMDAzMDAwMAorI2RlZmluZSBUWDM5X0NPTkZfRENTXzE2S0IgCTB4MDAwNDAwMDAKKworI2RlZmluZSBUWDM5X0NPTkZfQ1dGT04gCTB4MDAwMDQwMDAKKyNkZWZpbmUgVFgzOV9DT05GX1dCT04gIAkweDAwMDAyMDAwCisjZGVmaW5lIFRYMzlfQ09ORl9SRl9TSElGVAkxMAorI2RlZmluZSBUWDM5X0NPTkZfUkZfTUFTSwkweDAwMDAwYzAwCisjZGVmaW5lIFRYMzlfQ09ORl9ET1pFCQkweDAwMDAwMjAwCisjZGVmaW5lIFRYMzlfQ09ORl9IQUxUCQkweDAwMDAwMTAwCisjZGVmaW5lIFRYMzlfQ09ORl9MT0NLCQkweDAwMDAwMDgwCisjZGVmaW5lIFRYMzlfQ09ORl9JQ0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFgzOV9DT05GX0RDRQkJMHgwMDAwMDAxMAorI2RlZmluZSBUWDM5X0NPTkZfSVJTSVpFX1NISUZUCTIKKyNkZWZpbmUgVFgzOV9DT05GX0lSU0laRV9NQVNLCTB4MDAwMDAwMGMKKyNkZWZpbmUgVFgzOV9DT05GX0RSU0laRV9TSElGVAkwCisjZGVmaW5lIFRYMzlfQ09ORl9EUlNJWkVfTUFTSwkweDAwMDAwMDAzCisKKy8qCisgKiBTdGF0dXMgcmVnaXN0ZXIgYml0cyBhdmFpbGFibGUgaW4gYWxsIE1JUFMgQ1BVcy4KKyAqLworI2RlZmluZSBTVDBfSU0JCQkweDAwMDBmZjAwCisjZGVmaW5lICBTVEFUVVNCX0lQMAkJOAorI2RlZmluZSAgU1RBVFVTRl9JUDAJCShfVUxDQVNUXygxKSA8PCAgOCkKKyNkZWZpbmUgIFNUQVRVU0JfSVAxCQk5CisjZGVmaW5lICBTVEFUVVNGX0lQMQkJKF9VTENBU1RfKDEpIDw8ICA5KQorI2RlZmluZSAgU1RBVFVTQl9JUDIJCTEwCisjZGVmaW5lICBTVEFUVVNGX0lQMgkJKF9VTENBU1RfKDEpIDw8IDEwKQorI2RlZmluZSAgU1RBVFVTQl9JUDMJCTExCisjZGVmaW5lICBTVEFUVVNGX0lQMwkJKF9VTENBU1RfKDEpIDw8IDExKQorI2RlZmluZSAgU1RBVFVTQl9JUDQJCTEyCisjZGVmaW5lICBTVEFUVVNGX0lQNAkJKF9VTENBU1RfKDEpIDw8IDEyKQorI2RlZmluZSAgU1RBVFVTQl9JUDUJCTEzCisjZGVmaW5lICBTVEFUVVNGX0lQNQkJKF9VTENBU1RfKDEpIDw8IDEzKQorI2RlZmluZSAgU1RBVFVTQl9JUDYJCTE0CisjZGVmaW5lICBTVEFUVVNGX0lQNgkJKF9VTENBU1RfKDEpIDw8IDE0KQorI2RlZmluZSAgU1RBVFVTQl9JUDcJCTE1CisjZGVmaW5lICBTVEFUVVNGX0lQNwkJKF9VTENBU1RfKDEpIDw8IDE1KQorI2RlZmluZSAgU1RBVFVTQl9JUDgJCTAKKyNkZWZpbmUgIFNUQVRVU0ZfSVA4CQkoX1VMQ0FTVF8oMSkgPDwgIDApCisjZGVmaW5lICBTVEFUVVNCX0lQOQkJMQorI2RlZmluZSAgU1RBVFVTRl9JUDkJCShfVUxDQVNUXygxKSA8PCAgMSkKKyNkZWZpbmUgIFNUQVRVU0JfSVAxMAkJMgorI2RlZmluZSAgU1RBVFVTRl9JUDEwCQkoX1VMQ0FTVF8oMSkgPDwgIDIpCisjZGVmaW5lICBTVEFUVVNCX0lQMTEJCTMKKyNkZWZpbmUgIFNUQVRVU0ZfSVAxMQkJKF9VTENBU1RfKDEpIDw8ICAzKQorI2RlZmluZSAgU1RBVFVTQl9JUDEyCQk0CisjZGVmaW5lICBTVEFUVVNGX0lQMTIJCShfVUxDQVNUXygxKSA8PCAgNCkKKyNkZWZpbmUgIFNUQVRVU0JfSVAxMwkJNQorI2RlZmluZSAgU1RBVFVTRl9JUDEzCQkoX1VMQ0FTVF8oMSkgPDwgIDUpCisjZGVmaW5lICBTVEFUVVNCX0lQMTQJCTYKKyNkZWZpbmUgIFNUQVRVU0ZfSVAxNAkJKF9VTENBU1RfKDEpIDw8ICA2KQorI2RlZmluZSAgU1RBVFVTQl9JUDE1CQk3CisjZGVmaW5lICBTVEFUVVNGX0lQMTUJCShfVUxDQVNUXygxKSA8PCAgNykKKyNkZWZpbmUgU1QwX0NICQkJMHgwMDA0MDAwMAorI2RlZmluZSBTVDBfU1IJCQkweDAwMTAwMDAwCisjZGVmaW5lIFNUMF9UUwkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1QwX0JFVgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgU1QwX1JFCQkJMHgwMjAwMDAwMAorI2RlZmluZSBTVDBfRlIJCQkweDA0MDAwMDAwCisjZGVmaW5lIFNUMF9DVQkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgU1QwX0NVMAkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgU1QwX0NVMQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgU1QwX0NVMgkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1QwX0NVMwkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgU1QwX1hYCQkJMHg4MDAwMDAwMAkvKiBNSVBTIElWIG5hbWluZyAqLworCisvKgorICogQml0ZmllbGRzIGFuZCBiaXQgbnVtYmVycyBpbiB0aGUgY29wcm9jZXNzb3IgMCBjYXVzZSByZWdpc3Rlci4KKyAqCisgKiBSZWZlciB0byB5b3VyIE1JUFMgUjR4eDAgbWFudWFsLCBjaGFwdGVyIDUgZm9yIGV4cGxhbmF0aW9uLgorICovCisjZGVmaW5lICBDQVVTRUJfRVhDQ09ERQkJMgorI2RlZmluZSAgQ0FVU0VGX0VYQ0NPREUJCShfVUxDQVNUXygzMSkgIDw8ICAyKQorI2RlZmluZSAgQ0FVU0VCX0lQCQk4CisjZGVmaW5lICBDQVVTRUZfSVAJCShfVUxDQVNUXygyNTUpIDw8ICA4KQorI2RlZmluZSAgQ0FVU0VCX0lQMAkJOAorI2RlZmluZSAgQ0FVU0VGX0lQMAkJKF9VTENBU1RfKDEpICAgPDwgIDgpCisjZGVmaW5lICBDQVVTRUJfSVAxCQk5CisjZGVmaW5lICBDQVVTRUZfSVAxCQkoX1VMQ0FTVF8oMSkgICA8PCAgOSkKKyNkZWZpbmUgIENBVVNFQl9JUDIJCTEwCisjZGVmaW5lICBDQVVTRUZfSVAyCQkoX1VMQ0FTVF8oMSkgICA8PCAxMCkKKyNkZWZpbmUgIENBVVNFQl9JUDMJCTExCisjZGVmaW5lICBDQVVTRUZfSVAzCQkoX1VMQ0FTVF8oMSkgICA8PCAxMSkKKyNkZWZpbmUgIENBVVNFQl9JUDQJCTEyCisjZGVmaW5lICBDQVVTRUZfSVA0CQkoX1VMQ0FTVF8oMSkgICA8PCAxMikKKyNkZWZpbmUgIENBVVNFQl9JUDUJCTEzCisjZGVmaW5lICBDQVVTRUZfSVA1CQkoX1VMQ0FTVF8oMSkgICA8PCAxMykKKyNkZWZpbmUgIENBVVNFQl9JUDYJCTE0CisjZGVmaW5lICBDQVVTRUZfSVA2CQkoX1VMQ0FTVF8oMSkgICA8PCAxNCkKKyNkZWZpbmUgIENBVVNFQl9JUDcJCTE1CisjZGVmaW5lICBDQVVTRUZfSVA3CQkoX1VMQ0FTVF8oMSkgICA8PCAxNSkKKyNkZWZpbmUgIENBVVNFQl9JVgkJMjMKKyNkZWZpbmUgIENBVVNFRl9JVgkJKF9VTENBU1RfKDEpICAgPDwgMjMpCisjZGVmaW5lICBDQVVTRUJfQ0UJCTI4CisjZGVmaW5lICBDQVVTRUZfQ0UJCShfVUxDQVNUXygzKSAgIDw8IDI4KQorI2RlZmluZSAgQ0FVU0VCX0JECQkzMQorI2RlZmluZSAgQ0FVU0VGX0JECQkoX1VMQ0FTVF8oMSkgICA8PCAzMSkKKworLyoKKyAqIEJpdHMgaW4gdGhlIGNvcHJvY2Vzc29yIDAgY29uZmlnIHJlZ2lzdGVyLgorICovCisvKiBHZW5lcmljIGJpdHMuICAqLworI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX05PX1dBCQkwCisjZGVmaW5lIENPTkZfQ01fQ0FDSEFCTEVfV0EJCTEKKyNkZWZpbmUgQ09ORl9DTV9VTkNBQ0hFRAkJMgorI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX05PTkNPSEVSRU5UCTMKKyNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9DRQkJNAorI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX0NPVwkJNQorI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX0NVVwkJNgorI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX0FDQ0VMRVJBVEVECTcKKyNkZWZpbmUgQ09ORl9DTV9DTUFTSwkJCTcKKyNkZWZpbmUgQ09ORl9CRQkJCShfVUxDQVNUXygxKSA8PCAxNSkKKworLyogQml0cyBjb21tb24gdG8gdmFyaW91cyBwcm9jZXNzb3JzLiAgKi8KKyNkZWZpbmUgQ09ORl9DVQkJCShfVUxDQVNUXygxKSA8PCAgMykKKyNkZWZpbmUgQ09ORl9EQgkJCShfVUxDQVNUXygxKSA8PCAgNCkKKyNkZWZpbmUgQ09ORl9JQgkJCShfVUxDQVNUXygxKSA8PCAgNSkKKyNkZWZpbmUgQ09ORl9EQwkJCShfVUxDQVNUXyg3KSA8PCAgNikKKyNkZWZpbmUgQ09ORl9JQwkJCShfVUxDQVNUXyg3KSA8PCAgOSkKKyNkZWZpbmUgQ09ORl9FQgkJCShfVUxDQVNUXygxKSA8PCAxMykKKyNkZWZpbmUgQ09ORl9FTQkJCShfVUxDQVNUXygxKSA8PCAxNCkKKyNkZWZpbmUgQ09ORl9TTQkJCShfVUxDQVNUXygxKSA8PCAxNikKKyNkZWZpbmUgQ09ORl9TQwkJCShfVUxDQVNUXygxKSA8PCAxNykKKyNkZWZpbmUgQ09ORl9FVwkJCShfVUxDQVNUXygzKSA8PCAxOCkKKyNkZWZpbmUgQ09ORl9FUAkJCShfVUxDQVNUXygxNSk8PCAyNCkKKyNkZWZpbmUgQ09ORl9FQwkJCShfVUxDQVNUXyg3KSA8PCAyOCkKKyNkZWZpbmUgQ09ORl9DTQkJCShfVUxDQVNUXygxKSA8PCAzMSkKKworLyogQml0cyBzcGVjaWZpYyB0byB0aGUgUjR4eDAuICAqLworI2RlZmluZSBSNEtfQ09ORl9TVwkJKF9VTENBU1RfKDEpIDw8IDIwKQorI2RlZmluZSBSNEtfQ09ORl9TUwkJKF9VTENBU1RfKDEpIDw8IDIxKQorI2RlZmluZSBSNEtfQ09ORl9TQgkJKF9VTENBU1RfKDMpIDw8IDIyKQorCisvKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBSNTAwMC4gICovCisjZGVmaW5lIFI1S19DT05GX1NFCQkoX1VMQ0FTVF8oMSkgPDwgMTIpCisjZGVmaW5lIFI1S19DT05GX1NTCQkoX1VMQ0FTVF8oMykgPDwgMjApCisKKy8qIEJpdHMgc3BlY2lmaWMgdG8gdGhlIFJNNzAwMC4gICovCisjZGVmaW5lIFJNN0tfQ09ORl9TRQkJKF9VTENBU1RfKDEpIDw8ICAzKQorI2RlZmluZSBSTTdLX0NPTkZfVEUJCShfVUxDQVNUXygxKSA8PCAxMikKKyNkZWZpbmUgUk03S19DT05GX0NMSwkJKF9VTENBU1RfKDEpIDw8IDE2KQorI2RlZmluZSBSTTdLX0NPTkZfVEMJCShfVUxDQVNUXygxKSA8PCAxNykKKyNkZWZpbmUgUk03S19DT05GX1NJCQkoX1VMQ0FTVF8oMykgPDwgMjApCisjZGVmaW5lIFJNN0tfQ09ORl9TQwkJKF9VTENBU1RfKDEpIDw8IDMxKQorCisvKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBSMTAwMDAuICAqLworI2RlZmluZSBSMTBLX0NPTkZfRE4JCShfVUxDQVNUXygzKSA8PCAgMykKKyNkZWZpbmUgUjEwS19DT05GX0NUCQkoX1VMQ0FTVF8oMSkgPDwgIDUpCisjZGVmaW5lIFIxMEtfQ09ORl9QRQkJKF9VTENBU1RfKDEpIDw8ICA2KQorI2RlZmluZSBSMTBLX0NPTkZfUE0JCShfVUxDQVNUXygzKSA8PCAgNykKKyNkZWZpbmUgUjEwS19DT05GX0VDCQkoX1VMQ0FTVF8oMTUpPDwgIDkpCisjZGVmaW5lIFIxMEtfQ09ORl9TQgkJKF9VTENBU1RfKDEpIDw8IDEzKQorI2RlZmluZSBSMTBLX0NPTkZfU0sJCShfVUxDQVNUXygxKSA8PCAxNCkKKyNkZWZpbmUgUjEwS19DT05GX1NTCQkoX1VMQ0FTVF8oNykgPDwgMTYpCisjZGVmaW5lIFIxMEtfQ09ORl9TQwkJKF9VTENBU1RfKDcpIDw8IDE5KQorI2RlZmluZSBSMTBLX0NPTkZfREMJCShfVUxDQVNUXyg3KSA8PCAyNikKKyNkZWZpbmUgUjEwS19DT05GX0lDCQkoX1VMQ0FTVF8oNykgPDwgMjkpCisKKy8qIEJpdHMgc3BlY2lmaWMgdG8gdGhlIFZSNDF4eC4gICovCisjZGVmaW5lIFZSNDFfQ09ORl9DUwkJKF9VTENBU1RfKDEpIDw8IDEyKQorI2RlZmluZSBWUjQxX0NPTkZfUDRLCQkoX1VMQ0FTVF8oMSkgPDwgMTMpCisjZGVmaW5lIFZSNDFfQ09ORl9CUAkJKF9VTENBU1RfKDEpIDw8IDE2KQorI2RlZmluZSBWUjQxX0NPTkZfTTE2CQkoX1VMQ0FTVF8oMSkgPDwgMjApCisjZGVmaW5lIFZSNDFfQ09ORl9BRAkJKF9VTENBU1RfKDEpIDw8IDIzKQorCisvKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBSMzB4eC4gICovCisjZGVmaW5lIFIzMFhYX0NPTkZfRkRNCQkoX1VMQ0FTVF8oMSkgPDwgMTkpCisjZGVmaW5lIFIzMFhYX0NPTkZfUkVWCQkoX1VMQ0FTVF8oMSkgPDwgMjIpCisjZGVmaW5lIFIzMFhYX0NPTkZfQUMJCShfVUxDQVNUXygxKSA8PCAyMykKKyNkZWZpbmUgUjMwWFhfQ09ORl9SRgkJKF9VTENBU1RfKDEpIDw8IDI0KQorI2RlZmluZSBSMzBYWF9DT05GX0hBTFQJCShfVUxDQVNUXygxKSA8PCAyNSkKKyNkZWZpbmUgUjMwWFhfQ09ORl9GUElOVAkoX1VMQ0FTVF8oNykgPDwgMjYpCisjZGVmaW5lIFIzMFhYX0NPTkZfREJSCQkoX1VMQ0FTVF8oMSkgPDwgMjkpCisjZGVmaW5lIFIzMFhYX0NPTkZfU0IJCShfVUxDQVNUXygxKSA8PCAzMCkKKyNkZWZpbmUgUjMwWFhfQ09ORl9MT0NLCQkoX1VMQ0FTVF8oMSkgPDwgMzEpCisKKy8qIEJpdHMgc3BlY2lmaWMgdG8gdGhlIFRYNDkuICAqLworI2RlZmluZSBUWDQ5X0NPTkZfREMJCShfVUxDQVNUXygxKSA8PCAxNikKKyNkZWZpbmUgVFg0OV9DT05GX0lDCQkoX1VMQ0FTVF8oMSkgPDwgMTcpICAvKiBjb25mbGljdCB3aXRoIENPTkZfU0MgKi8KKyNkZWZpbmUgVFg0OV9DT05GX0hBTFQJCShfVUxDQVNUXygxKSA8PCAxOCkKKyNkZWZpbmUgVFg0OV9DT05GX0NXRk9OCQkoX1VMQ0FTVF8oMSkgPDwgMjcpCisKKy8qIEJpdHMgc3BlY2lmaWMgdG8gdGhlIE1JUFMzMi82NCBQUkEuICAqLworI2RlZmluZSBNSVBTX0NPTkZfTVQJCShfVUxDQVNUXyg3KSA8PCAgNykKKyNkZWZpbmUgTUlQU19DT05GX0FSCQkoX1VMQ0FTVF8oNykgPDwgMTApCisjZGVmaW5lIE1JUFNfQ09ORl9BVAkJKF9VTENBU1RfKDMpIDw8IDEzKQorI2RlZmluZSBNSVBTX0NPTkZfTQkJKF9VTENBU1RfKDEpIDw8IDMxKQorCisvKgorICogQml0cyBpbiB0aGUgTUlQUzMyLzY0IFBSQSBjb3Byb2Nlc3NvciAwIGNvbmZpZyByZWdpc3RlcnMgMSBhbmQgYWJvdmUuCisgKi8KKyNkZWZpbmUgTUlQU19DT05GMV9GUAkJKF9VTENBU1RfKDEpIDw8ICAwKQorI2RlZmluZSBNSVBTX0NPTkYxX0VQCQkoX1VMQ0FTVF8oMSkgPDwgIDEpCisjZGVmaW5lIE1JUFNfQ09ORjFfQ0EJCShfVUxDQVNUXygxKSA8PCAgMikKKyNkZWZpbmUgTUlQU19DT05GMV9XUgkJKF9VTENBU1RfKDEpIDw8ICAzKQorI2RlZmluZSBNSVBTX0NPTkYxX1BDCQkoX1VMQ0FTVF8oMSkgPDwgIDQpCisjZGVmaW5lIE1JUFNfQ09ORjFfTUQJCShfVUxDQVNUXygxKSA8PCAgNSkKKyNkZWZpbmUgTUlQU19DT05GMV9DMgkJKF9VTENBU1RfKDEpIDw8ICA2KQorI2RlZmluZSBNSVBTX0NPTkYxX0RBCQkoX1VMQ0FTVF8oNykgPDwgIDcpCisjZGVmaW5lIE1JUFNfQ09ORjFfREwJCShfVUxDQVNUXyg3KSA8PCAxMCkKKyNkZWZpbmUgTUlQU19DT05GMV9EUwkJKF9VTENBU1RfKDcpIDw8IDEzKQorI2RlZmluZSBNSVBTX0NPTkYxX0lBCQkoX1VMQ0FTVF8oNykgPDwgMTYpCisjZGVmaW5lIE1JUFNfQ09ORjFfSUwJCShfVUxDQVNUXyg3KSA8PCAxOSkKKyNkZWZpbmUgTUlQU19DT05GMV9JUwkJKF9VTENBU1RfKDcpIDw8IDIyKQorI2RlZmluZSBNSVBTX0NPTkYxX1RMQlMJCShfVUxDQVNUXyg2Myk8PCAyNSkKKworI2RlZmluZSBNSVBTX0NPTkYyX1NBCQkoX1VMQ0FTVF8oMTUpPDwgIDApCisjZGVmaW5lIE1JUFNfQ09ORjJfU0wJCShfVUxDQVNUXygxNSk8PCAgNCkKKyNkZWZpbmUgTUlQU19DT05GMl9TUwkJKF9VTENBU1RfKDE1KTw8ICA4KQorI2RlZmluZSBNSVBTX0NPTkYyX1NVCQkoX1VMQ0FTVF8oMTUpPDwgMTIpCisjZGVmaW5lIE1JUFNfQ09ORjJfVEEJCShfVUxDQVNUXygxNSk8PCAxNikKKyNkZWZpbmUgTUlQU19DT05GMl9UTAkJKF9VTENBU1RfKDE1KTw8IDIwKQorI2RlZmluZSBNSVBTX0NPTkYyX1RTCQkoX1VMQ0FTVF8oMTUpPDwgMjQpCisjZGVmaW5lIE1JUFNfQ09ORjJfVFUJCShfVUxDQVNUXyg3KSA8PCAyOCkKKworI2RlZmluZSBNSVBTX0NPTkYzX1RMCQkoX1VMQ0FTVF8oMSkgPDwgIDApCisjZGVmaW5lIE1JUFNfQ09ORjNfU00JCShfVUxDQVNUXygxKSA8PCAgMSkKKyNkZWZpbmUgTUlQU19DT05GM19NVAkJKF9VTENBU1RfKDEpIDw8ICAyKQorI2RlZmluZSBNSVBTX0NPTkYzX1NQCQkoX1VMQ0FTVF8oMSkgPDwgIDQpCisjZGVmaW5lIE1JUFNfQ09ORjNfVklOVAkJKF9VTENBU1RfKDEpIDw8ICA1KQorI2RlZmluZSBNSVBTX0NPTkYzX1ZFSUMJCShfVUxDQVNUXygxKSA8PCAgNikKKyNkZWZpbmUgTUlQU19DT05GM19MUEEJCShfVUxDQVNUXygxKSA8PCAgNykKKyNkZWZpbmUgTUlQU19DT05GM19EU1AJCShfVUxDQVNUXygxKSA8PCAxMCkKKyNkZWZpbmUgTUlQU19DT05GM19VTFJJCQkoX1VMQ0FTVF8oMSkgPDwgMTMpCisKKyNkZWZpbmUgTUlQU19DT05GN19XSUkJCShfVUxDQVNUXygxKSA8PCAzMSkKKworI2RlZmluZSBNSVBTX0NPTkY3X1JQUwkJKF9VTENBU1RfKDEpIDw8IDIpCisKKworLyoKKyAqIEJpdHMgaW4gdGhlIE1JUFMzMi82NCBjb3Byb2Nlc3NvciAxIChGUFUpIHJldmlzaW9uIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIE1JUFNfRlBJUl9TCQkoX1VMQ0FTVF8oMSkgPDwgMTYpCisjZGVmaW5lIE1JUFNfRlBJUl9ECQkoX1VMQ0FTVF8oMSkgPDwgMTcpCisjZGVmaW5lIE1JUFNfRlBJUl9QUwkJKF9VTENBU1RfKDEpIDw8IDE4KQorI2RlZmluZSBNSVBTX0ZQSVJfM0QJCShfVUxDQVNUXygxKSA8PCAxOSkKKyNkZWZpbmUgTUlQU19GUElSX1cJCShfVUxDQVNUXygxKSA8PCAyMCkKKyNkZWZpbmUgTUlQU19GUElSX0wJCShfVUxDQVNUXygxKSA8PCAyMSkKKyNkZWZpbmUgTUlQU19GUElSX0Y2NAkJKF9VTENBU1RfKDEpIDw8IDIyKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgUjEwMDAwIHBlcmZvcm1hbmNlIGNvdW50ZXJzLiAgVGhlc2UgYXJlIGJhc2ljYWxseQorICogbWZjMCBhbmQgbXRjMCBpbnN0cnVjdGlvbnMgZnJvbSBhbmQgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIgd2l0aCBhIDUtYml0CisgKiBwZXJmb3JtYW5jZSBjb3VudGVyIG51bWJlciBlbmNvZGVkIGludG8gYml0cyAxIC4uLiA1IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAqIE9ubHkgcGVyZm9ybWFuY2UgY291bnRlcnMgMCB0byAxIGFjdHVhbGx5IGV4aXN0LCBzbyBmb3IgYSBub24tUjEwMDAwIGF3YXJlCisgKiBkaXNhc3NlbWJsZXIgdGhlc2Ugd2lsbCBsb29rIGxpa2UgYW4gYWNjZXNzIHRvIHNlbCAwIG9yIDEuCisgKi8KKyNkZWZpbmUgcmVhZF9yMTBrX3BlcmZfY250cihjb3VudGVyKQkJCQlcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX3JlczsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkibWZwY1x0JTAsICUxIgkJCQkJCVwKKyAgICAgICAgOiAiPXIiIChfX3JlcykJCQkJCQlcCisJOiAiaSIgKGNvdW50ZXIpKTsJCQkJCVwKKwkJCQkJCQkJXAorICAgICAgICBfX3JlczsJCQkJCQkJXAorfSkKKworI2RlZmluZSB3cml0ZV9yMTBrX3BlcmZfY250cihjb3VudGVyLHZhbCkgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkibXRwY1x0JTAsICUxIgkJCQkJCVwKKwk6CQkJCQkJCVwKKwk6ICJyIiAodmFsKSwgImkiIChjb3VudGVyKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgcmVhZF9yMTBrX3BlcmZfZXZlbnQoY291bnRlcikJCQkJXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19yZXM7CQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIm1mcHNcdCUwLCAlMSIJCQkJCQlcCisgICAgICAgIDogIj1yIiAoX19yZXMpCQkJCQkJXAorCTogImkiIChjb3VudGVyKSk7CQkJCQlcCisJCQkJCQkJCVwKKyAgICAgICAgX19yZXM7CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgd3JpdGVfcjEwa19wZXJmX2NudGwoY291bnRlcix2YWwpICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7CQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIm10cHNcdCUwLCAlMSIJCQkJCQlcCisJOgkJCQkJCQlcCisJOiAiciIgKHZhbCksICJpIiAoY291bnRlcikpOwkJCQlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBzeXN0ZW0gY29udHJvbCBjb3Byb2Nlc3NvcgorICovCisKKyNkZWZpbmUgX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKHNvdXJjZSwgc2VsKQkJCQlcCisoeyBpbnQgX19yZXM7CQkJCQkJCQlcCisJaWYgKHNlbCA9PSAwKQkJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCQkJIm1mYzBcdCUwLCAiICNzb3VyY2UgIlxuXHQiCQkJXAorCQkJOiAiPXIiIChfX3JlcykpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJCSIuc2V0XHRtaXBzMzJcblx0IgkJCQlcCisJCQkibWZjMFx0JTAsICIgI3NvdXJjZSAiLCAiICNzZWwgIlxuXHQiCQlcCisJCQkiLnNldFx0bWlwczBcblx0IgkJCQlcCisJCQk6ICI9ciIgKF9fcmVzKSk7CQkJCVwKKwlfX3JlczsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKHNvdXJjZSwgc2VsKQkJCQlcCisoeyB1bnNpZ25lZCBsb25nIGxvbmcgX19yZXM7CQkJCQkJXAorCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCkJCQkJCVwKKwkJX19yZXMgPSBfX3JlYWRfNjRiaXRfYzBfc3BsaXQoc291cmNlLCBzZWwpOwkJXAorCWVsc2UgaWYgKHNlbCA9PSAwKQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiLnNldFx0bWlwczNcblx0IgkJCQlcCisJCQkiZG1mYzBcdCUwLCAiICNzb3VyY2UgIlxuXHQiCQkJXAorCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAorCQkJOiAiPXIiIChfX3JlcykpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJCSIuc2V0XHRtaXBzNjRcblx0IgkJCQlcCisJCQkiZG1mYzBcdCUwLCAiICNzb3VyY2UgIiwgIiAjc2VsICJcblx0IgkJXAorCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAorCQkJOiAiPXIiIChfX3JlcykpOwkJCQlcCisJX19yZXM7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIocmVnaXN0ZXIsIHNlbCwgdmFsdWUpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoc2VsID09IDApCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkibXRjMFx0JXowLCAiICNyZWdpc3RlciAiXG5cdCIJCQlcCisJCQk6IDogIkpyIiAoKHVuc2lnbmVkIGludCkodmFsdWUpKSk7CQlcCisJZWxzZQkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJCSIuc2V0XHRtaXBzMzJcblx0IgkJCQlcCisJCQkibXRjMFx0JXowLCAiICNyZWdpc3RlciAiLCAiICNzZWwgIlxuXHQiCVwKKwkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKKwkJCTogOiAiSnIiICgodW5zaWduZWQgaW50KSh2YWx1ZSkpKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcihyZWdpc3Rlciwgc2VsLCB2YWx1ZSkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCkJCQkJCVwKKwkJX193cml0ZV82NGJpdF9jMF9zcGxpdChyZWdpc3Rlciwgc2VsLCB2YWx1ZSk7CQlcCisJZWxzZSBpZiAoc2VsID09IDApCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJCSIuc2V0XHRtaXBzM1xuXHQiCQkJCVwKKwkJCSJkbXRjMFx0JXowLCAiICNyZWdpc3RlciAiXG5cdCIJCQlcCisJCQkiLnNldFx0bWlwczAiCQkJCQlcCisJCQk6IDogIkpyIiAodmFsdWUpKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAorCQkJImRtdGMwXHQlejAsICIgI3JlZ2lzdGVyICIsICIgI3NlbCAiXG5cdCIJXAorCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAorCQkJOiA6ICJKciIgKHZhbHVlKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKHJlZywgc2VsKQkJCQlcCisJKChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCkgPwkJCQkJXAorCSh1bnNpZ25lZCBsb25nKSBfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIocmVnLCBzZWwpIDoJCVwKKwkodW5zaWduZWQgbG9uZykgX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKHJlZywgc2VsKSkKKworI2RlZmluZSBfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKHJlZywgc2VsLCB2YWwpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQpCQkJCQlcCisJCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIocmVnLCBzZWwsIHZhbCk7CQlcCisJZWxzZQkJCQkJCQkJXAorCQlfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKHJlZywgc2VsLCB2YWwpOwkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIE9uIFJNNzAwMC9STTkwMDAgdGhlc2UgYXJlIHVzZXMgdG8gYWNjZXNzIGNvcDAgc2V0IDEgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgX19yZWFkXzMyYml0X2MwX2N0cmxfcmVnaXN0ZXIoc291cmNlKQkJCQlcCisoeyBpbnQgX19yZXM7CQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCQkiY2ZjMFx0JTAsICIgI3NvdXJjZSAiXG5cdCIJCQkJXAorCQk6ICI9ciIgKF9fcmVzKSk7CQkJCQlcCisJX19yZXM7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fd3JpdGVfMzJiaXRfYzBfY3RybF9yZWdpc3RlcihyZWdpc3RlciwgdmFsdWUpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCSJjdGMwXHQlejAsICIgI3JlZ2lzdGVyICJcblx0IgkJCQlcCisJCTogOiAiSnIiICgodW5zaWduZWQgaW50KSh2YWx1ZSkpKTsJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogVGhlc2UgdmVyc2lvbnMgYXJlIG9ubHkgbmVlZGVkIGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDM4IGJpdHMgb2YKKyAqIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgcnVubmluZyB0aGUgMzItYml0IGtlcm5lbC4gIFRoYXQncyBub25lIGF0bSA6LSkKKyAqLworI2RlZmluZSBfX3JlYWRfNjRiaXRfYzBfc3BsaXQoc291cmNlLCBzZWwpCQkJCVwKKyh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbDsJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZmxhZ3M7CQkJCQkJXAorCQkJCQkJCQkJXAorCWxvY2FsX2lycV9zYXZlKF9fZmxhZ3MpOwkJCQkJXAorCWlmIChzZWwgPT0gMCkJCQkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwkJCSIuc2V0XHRtaXBzNjRcblx0IgkJCQlcCisJCQkiZG1mYzBcdCVNMCwgIiAjc291cmNlICJcblx0IgkJCVwKKwkJCSJkc2xsXHQlTDAsICVNMCwgMzJcblx0IgkJCVwKKwkJCSJkc3JsXHQlTTAsICVNMCwgMzJcblx0IgkJCVwKKwkJCSJkc3JsXHQlTDAsICVMMCwgMzJcblx0IgkJCVwKKwkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKKwkJCTogIj1yIiAoX192YWwpKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAorCQkJImRtZmMwXHQlTTAsICIgI3NvdXJjZSAiLCAiICNzZWwgIlxuXHQiCQlcCisJCQkiZHNsbFx0JUwwLCAlTTAsIDMyXG5cdCIJCQlcCisJCQkiZHNybFx0JU0wLCAlTTAsIDMyXG5cdCIJCQlcCisJCQkiZHNybFx0JUwwLCAlTDAsIDMyXG5cdCIJCQlcCisJCQkiLnNldFx0bWlwczAiCQkJCQlcCisJCQk6ICI9ciIgKF9fdmFsKSk7CQkJCVwKKwlsb2NhbF9pcnFfcmVzdG9yZShfX2ZsYWdzKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX3ZhbDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgX193cml0ZV82NGJpdF9jMF9zcGxpdChzb3VyY2UsIHNlbCwgdmFsKQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX2ZsYWdzOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlsb2NhbF9pcnFfc2F2ZShfX2ZsYWdzKTsJCQkJCVwKKwlpZiAoc2VsID09IDApCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAorCQkJImRzbGxcdCVMMCwgJUwwLCAzMlxuXHQiCQkJXAorCQkJImRzcmxcdCVMMCwgJUwwLCAzMlxuXHQiCQkJXAorCQkJImRzbGxcdCVNMCwgJU0wLCAzMlxuXHQiCQkJXAorCQkJIm9yXHQlTDAsICVMMCwgJU0wXG5cdCIJCQkJXAorCQkJImRtdGMwXHQlTDAsICIgI3NvdXJjZSAiXG5cdCIJCQlcCisJCQkiLnNldFx0bWlwczAiCQkJCQlcCisJCQk6IDogInIiICh2YWwpKTsJCQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCQkJIi5zZXRcdG1pcHM2NFxuXHQiCQkJCVwKKwkJCSJkc2xsXHQlTDAsICVMMCwgMzJcblx0IgkJCVwKKwkJCSJkc3JsXHQlTDAsICVMMCwgMzJcblx0IgkJCVwKKwkJCSJkc2xsXHQlTTAsICVNMCwgMzJcblx0IgkJCVwKKwkJCSJvclx0JUwwLCAlTDAsICVNMFxuXHQiCQkJCVwKKwkJCSJkbXRjMFx0JUwwLCAiICNzb3VyY2UgIiwgIiAjc2VsICJcblx0IgkJXAorCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAorCQkJOiA6ICJyIiAodmFsKSk7CQkJCQlcCisJbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHJlYWRfYzBfaW5kZXgoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQwLCAwKQorI2RlZmluZSB3cml0ZV9jMF9pbmRleCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDAsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX3JhbmRvbSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMSwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfcmFuZG9tKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMSwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfZW50cnlsbzAoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDIsIDApCisjZGVmaW5lIHdyaXRlX2MwX2VudHJ5bG8wKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMiwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfZW50cnlsbzEoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDMsIDApCisjZGVmaW5lIHdyaXRlX2MwX2VudHJ5bG8xKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMywgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfY29uZigpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDMsIDApCisjZGVmaW5lIHdyaXRlX2MwX2NvbmYodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQzLCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9jb250ZXh0KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQ0LCAwKQorI2RlZmluZSB3cml0ZV9jMF9jb250ZXh0KHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkNCwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfdXNlcmxvY2FsKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQ0LCAyKQorI2RlZmluZSB3cml0ZV9jMF91c2VybG9jYWwodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQ0LCAyLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9wYWdlbWFzaygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkNSwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfcGFnZW1hc2sodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ1LCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF93aXJlZCgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDYsIDApCisjZGVmaW5lIHdyaXRlX2MwX3dpcmVkKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkNiwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfaW5mbygpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDcsIDApCisKKyNkZWZpbmUgcmVhZF9jMF9jYWNoZSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDcsIDApCS8qIFRYMzl4eCAqLworI2RlZmluZSB3cml0ZV9jMF9jYWNoZSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDcsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2JhZHZhZGRyKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQ4LCAwKQorI2RlZmluZSB3cml0ZV9jMF9iYWR2YWRkcih2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDgsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2NvdW50KCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkOSwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfY291bnQodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ5LCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9jb3VudDIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDksIDYpIC8qIHBueDg1NTAgKi8KKyNkZWZpbmUgd3JpdGVfYzBfY291bnQyKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkOSwgNiwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfY291bnQzKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ5LCA3KSAvKiBwbng4NTUwICovCisjZGVmaW5lIHdyaXRlX2MwX2NvdW50Myh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDksIDcsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2VudHJ5aGkoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDEwLCAwKQorI2RlZmluZSB3cml0ZV9jMF9lbnRyeWhpKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTAsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2NvbXBhcmUoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDExLCAwKQorI2RlZmluZSB3cml0ZV9jMF9jb21wYXJlKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTEsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2NvbXBhcmUyKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMSwgNikgLyogcG54ODU1MCAqLworI2RlZmluZSB3cml0ZV9jMF9jb21wYXJlMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDExLCA2LCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9jb21wYXJlMygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTEsIDcpIC8qIHBueDg1NTAgKi8KKyNkZWZpbmUgd3JpdGVfYzBfY29tcGFyZTModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMSwgNywgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfc3RhdHVzKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMCkKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisjZGVmaW5lIHdyaXRlX2MwX3N0YXR1cyh2YWwpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMCwgdmFsKTsJCQkJXAorCV9fZWhiKCk7CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZWxzZQorLyoKKyAqIExlZ2FjeSBub24tU01UQyBjb2RlLCB3aGljaCBtYXkgYmUgaGF6YXJkb3VzCisgKiBidXQgd2hpY2ggbWlnaHQgbm90IHN1cHBvcnQgRUhCCisgKi8KKyNkZWZpbmUgd3JpdGVfYzBfc3RhdHVzKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDAsIHZhbCkKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisKKyNkZWZpbmUgcmVhZF9jMF9jYXVzZSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDEzLCAwKQorI2RlZmluZSB3cml0ZV9jMF9jYXVzZSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDEzLCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9lcGMoKQkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxNCwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfZXBjKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTQsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX3ByaWQoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxNSwgMCkKKworI2RlZmluZSByZWFkX2MwX2NvbmZpZygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDApCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDEpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDIpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnMygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDMpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnNCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDQpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnNSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDUpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnNigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDYpCisjZGVmaW5lIHJlYWRfYzBfY29uZmlnNygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDcpCisjZGVmaW5lIHdyaXRlX2MwX2NvbmZpZyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAwLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX2NvbmZpZzEodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMSwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF9jb25maWcyKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDIsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfY29uZmlnMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAzLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX2NvbmZpZzQodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgNCwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF9jb25maWc1KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDUsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfY29uZmlnNih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA2LCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX2NvbmZpZzcodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgNywgdmFsKQorCisvKgorICogVGhlIFdhdGNoTG8gcmVnaXN0ZXIuICBUaGVyZSBtYXkgYmUgdXB0byA4IG9mIHRoZW0uCisgKi8KKyNkZWZpbmUgcmVhZF9jMF93YXRjaGxvMCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDApCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzEoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAxKQorI2RlZmluZSByZWFkX2MwX3dhdGNobG8yKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgMikKKyNkZWZpbmUgcmVhZF9jMF93YXRjaGxvMygpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDMpCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzQoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA0KQorI2RlZmluZSByZWFkX2MwX3dhdGNobG81KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgNSkKKyNkZWZpbmUgcmVhZF9jMF93YXRjaGxvNigpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDYpCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzcoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA3KQorI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvMCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAwLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNobG8xKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDEsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hsbzIodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgMiwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvMyh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAzLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNobG80KHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDQsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hsbzUodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgNSwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvNih2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA2LCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNobG83KHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDcsIHZhbCkKKworLyoKKyAqIFRoZSBXYXRjaEhpIHJlZ2lzdGVyLiAgVGhlcmUgbWF5IGJlIHVwdG8gOCBvZiB0aGVtLgorICovCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hoaTAoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAwKQorI2RlZmluZSByZWFkX2MwX3dhdGNoaGkxKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMSkKKyNkZWZpbmUgcmVhZF9jMF93YXRjaGhpMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDIpCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hoaTMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAzKQorI2RlZmluZSByZWFkX2MwX3dhdGNoaGk0KCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgNCkKKyNkZWZpbmUgcmVhZF9jMF93YXRjaGhpNSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDUpCisjZGVmaW5lIHJlYWRfYzBfd2F0Y2hoaTYoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCA2KQorI2RlZmluZSByZWFkX2MwX3dhdGNoaGk3KCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgNykKKworI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpMCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAwLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNoaGkxKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDEsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hoaTIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMiwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAzLCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNoaGk0KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDQsIHZhbCkKKyNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hoaTUodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgNSwgdmFsKQorI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpNih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCA2LCB2YWwpCisjZGVmaW5lIHdyaXRlX2MwX3dhdGNoaGk3KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDcsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX3hjb250ZXh0KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQyMCwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfeGNvbnRleHQodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQyMCwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfaW50Y29udHJvbCgpCV9fcmVhZF8zMmJpdF9jMF9jdHJsX3JlZ2lzdGVyKCQyMCkKKyNkZWZpbmUgd3JpdGVfYzBfaW50Y29udHJvbCh2YWwpIF9fd3JpdGVfMzJiaXRfYzBfY3RybF9yZWdpc3RlcigkMjAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2ZyYW1lbWFzaygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjEsIDApCisjZGVmaW5lIHdyaXRlX2MwX2ZyYW1lbWFzayh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIxLCAwLCB2YWwpCisKKy8qIFJNOTAwMCBQZXJmQ29udHJvbCBwZXJmb3JtYW5jZSBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgcmVhZF9jMF9wZXJmY29udHJvbCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjIsIDApCisjZGVmaW5lIHdyaXRlX2MwX3BlcmZjb250cm9sKHZhbCkgX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjIsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2RpYWcoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfZGlhZyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kaWFnMSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAxKQorI2RlZmluZSB3cml0ZV9jMF9kaWFnMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAxLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kaWFnMigpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAyKQorI2RlZmluZSB3cml0ZV9jMF9kaWFnMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAyLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kaWFnMygpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAzKQorI2RlZmluZSB3cml0ZV9jMF9kaWFnMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAzLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kaWFnNCgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCA0KQorI2RlZmluZSB3cml0ZV9jMF9kaWFnNCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCA0LCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kaWFnNSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCA1KQorI2RlZmluZSB3cml0ZV9jMF9kaWFnNSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCA1LCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kZWJ1ZygpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIzLCAwKQorI2RlZmluZSB3cml0ZV9jMF9kZWJ1Zyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIzLCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9kZXBjKCkJCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMjQsIDApCisjZGVmaW5lIHdyaXRlX2MwX2RlcGModmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQyNCwgMCwgdmFsKQorCisvKgorICogTUlQUzMyIC8gTUlQUzY0IHBlcmZvcm1hbmNlIGNvdW50ZXJzCisgKi8KKyNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDAoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAwKQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDAodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMCwgdmFsKQorI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDEpCisjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAxLCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmN0cmwxKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMikKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmN0cmwxKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDIsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjEoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAzKQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjEodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMywgdmFsKQorI2RlZmluZSByZWFkX2MwX3BlcmZjdHJsMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDQpCisjZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA0LCB2YWwpCisjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIyKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNSkKKyNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIyKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDUsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA2KQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNiwgdmFsKQorI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDcpCisjZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA3LCB2YWwpCisKKy8qIFJNOTAwMCBQZXJmQ291bnQgcGVyZm9ybWFuY2UgY291bnRlciByZWdpc3RlciAqLworI2RlZmluZSByZWFkX2MwX3BlcmZjb3VudCgpCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkMjUsIDApCisjZGVmaW5lIHdyaXRlX2MwX3BlcmZjb3VudCh2YWwpCV9fd3JpdGVfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCAwLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9lY2MoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNiwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfZWNjKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjYsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2RlcnJhZGRyMCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMjYsIDEpCisjZGVmaW5lIHdyaXRlX2MwX2RlcnJhZGRyMCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDI2LCAxLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9jYWNoZWVycigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjcsIDApCisKKyNkZWZpbmUgcmVhZF9jMF9kZXJyYWRkcjEoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDI3LCAxKQorI2RlZmluZSB3cml0ZV9jMF9kZXJyYWRkcjEodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQyNywgMSwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfdGFnbG8oKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyOCwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfdGFnbG8odmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyOCwgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfZHRhZ2xvKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyOCwgMikKKyNkZWZpbmUgd3JpdGVfYzBfZHRhZ2xvKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjgsIDIsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX3RhZ2hpKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjksIDApCisjZGVmaW5lIHdyaXRlX2MwX3RhZ2hpKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjksIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2Vycm9yZXBjKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQzMCwgMCkKKyNkZWZpbmUgd3JpdGVfYzBfZXJyb3JlcGModmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQzMCwgMCwgdmFsKQorCisvKiBNSVBTUjIgKi8KKyNkZWZpbmUgcmVhZF9jMF9od3JlbmEoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDcsIDApCisjZGVmaW5lIHdyaXRlX2MwX2h3cmVuYSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDcsIDAsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2ludGN0bCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDEpCisjZGVmaW5lIHdyaXRlX2MwX2ludGN0bCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDEyLCAxLCB2YWwpCisKKyNkZWZpbmUgcmVhZF9jMF9zcnNjdGwoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDEyLCAyKQorI2RlZmluZSB3cml0ZV9jMF9zcnNjdGwodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMiwgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfc3JzbWFwKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMykKKyNkZWZpbmUgd3JpdGVfYzBfc3JzbWFwKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDMsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2ViYXNlKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDEpCisjZGVmaW5lIHdyaXRlX2MwX2ViYXNlKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDEsIHZhbCkKKworLyoKKyAqIE1hY3JvcyB0byBhY2Nlc3MgdGhlIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGNvbnRyb2wgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgcmVhZF8zMmJpdF9jcDFfcmVnaXN0ZXIoc291cmNlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyBpbnQgX19yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSIuc2V0XHRwdXNoXG5cdCIJCQkJCVwKKwkiLnNldFx0cmVvcmRlclxuXHQiCQkJCQlcCisgICAgICAgICJjZmMxXHQlMCwiU1RSKHNvdXJjZSkiXG5cdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSIuc2V0XHRwb3AiCQkJCQkJXAorICAgICAgICA6ICI9ciIgKF9fcmVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19yZXM7fSkKKworI2RlZmluZSByZGRzcChtYXNrKQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19yZXM7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQJcHVzaAkJCQlcbiIJCVwKKwkiCS5zZXQJbm9hdAkJCQlcbiIJCVwKKwkiCSMgcmRkc3AgJDEsICV4MQkJCQlcbiIJCVwKKwkiCS53b3JkCTB4N2MwMDBjYjggfCAoJXgxIDw8IDE2KQlcbiIJCVwKKwkiCW1vdmUJJTAsICQxCQkJCVxuIgkJXAorCSIJLnNldAlwb3AJCQkJXG4iCQlcCisJOiAiPXIiIChfX3JlcykJCQkJCQkJXAorCTogImkiIChtYXNrKSk7CQkJCQkJCVwKKwlfX3JlczsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgd3Jkc3AodmFsLCBtYXNrKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIHdyZHNwICQxLCAleDEJCQkJCVxuIglcCisJIgkud29yZAkweDdjMjAwNGY4IHwgKCV4MSA8PCAxMSkJCVxuIglcCisJIgkuc2V0CXBvcAkJCQkJXG4iCVwKKyAgICAgICAgOgkJCQkJCQkJXAorCTogInIiICh2YWwpLCAiaSIgKG1hc2spKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNpZiAwCS8qIE5lZWQgRFNQIEFTRSBjYXBhYmxlIGFzc2VtYmxlciAuLi4gKi8KKyNkZWZpbmUgbWZsbzAoKSAoeyBsb25nIG1mbG8wOyBfX2FzbV9fKCJtZmxvICUwLCAkYWMwIiA6ICI9ciIgKG1mbG8wKSk7IG1mbG8wO30pCisjZGVmaW5lIG1mbG8xKCkgKHsgbG9uZyBtZmxvMTsgX19hc21fXygibWZsbyAlMCwgJGFjMSIgOiAiPXIiIChtZmxvMSkpOyBtZmxvMTt9KQorI2RlZmluZSBtZmxvMigpICh7IGxvbmcgbWZsbzI7IF9fYXNtX18oIm1mbG8gJTAsICRhYzIiIDogIj1yIiAobWZsbzIpKTsgbWZsbzI7fSkKKyNkZWZpbmUgbWZsbzMoKSAoeyBsb25nIG1mbG8zOyBfX2FzbV9fKCJtZmxvICUwLCAkYWMzIiA6ICI9ciIgKG1mbG8zKSk7IG1mbG8zO30pCisKKyNkZWZpbmUgbWZoaTAoKSAoeyBsb25nIG1maGkwOyBfX2FzbV9fKCJtZmhpICUwLCAkYWMwIiA6ICI9ciIgKG1maGkwKSk7IG1maGkwO30pCisjZGVmaW5lIG1maGkxKCkgKHsgbG9uZyBtZmhpMTsgX19hc21fXygibWZoaSAlMCwgJGFjMSIgOiAiPXIiIChtZmhpMSkpOyBtZmhpMTt9KQorI2RlZmluZSBtZmhpMigpICh7IGxvbmcgbWZoaTI7IF9fYXNtX18oIm1maGkgJTAsICRhYzIiIDogIj1yIiAobWZoaTIpKTsgbWZoaTI7fSkKKyNkZWZpbmUgbWZoaTMoKSAoeyBsb25nIG1maGkzOyBfX2FzbV9fKCJtZmhpICUwLCAkYWMzIiA6ICI9ciIgKG1maGkzKSk7IG1maGkzO30pCisKKyNkZWZpbmUgbXRsbzAoeCkgX19hc21fXygibXRsbyAlMCwgJGFjMCIgOjoiciIgKHgpKQorI2RlZmluZSBtdGxvMSh4KSBfX2FzbV9fKCJtdGxvICUwLCAkYWMxIiA6OiJyIiAoeCkpCisjZGVmaW5lIG10bG8yKHgpIF9fYXNtX18oIm10bG8gJTAsICRhYzIiIDo6InIiICh4KSkKKyNkZWZpbmUgbXRsbzMoeCkgX19hc21fXygibXRsbyAlMCwgJGFjMyIgOjoiciIgKHgpKQorCisjZGVmaW5lIG10aGkwKHgpIF9fYXNtX18oIm10aGkgJTAsICRhYzAiIDo6InIiICh4KSkKKyNkZWZpbmUgbXRoaTEoeCkgX19hc21fXygibXRoaSAlMCwgJGFjMSIgOjoiciIgKHgpKQorI2RlZmluZSBtdGhpMih4KSBfX2FzbV9fKCJtdGhpICUwLCAkYWMyIiA6OiJyIiAoeCkpCisjZGVmaW5lIG10aGkzKHgpIF9fYXNtX18oIm10aGkgJTAsICRhYzMiIDo6InIiICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBtZmhpMCgpCQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fdHJlZzsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJXG4iCQkJXAorCSIJLnNldAlub2F0CQkJXG4iCQkJXAorCSIJIyBtZmhpCSUwLCAkYWMwCQlcbiIJCQlcCisJIgkud29yZAkweDAwMDAwODEwCQlcbiIJCQlcCisJIgltb3ZlCSUwLCAkMQkJCVxuIgkJCVwKKwkiCS5zZXQJcG9wCQkJXG4iCQkJXAorCTogIj1yIiAoX190cmVnKSk7CQkJCQkJXAorCV9fdHJlZzsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgbWZoaTEoKQkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKKwkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKKwkiCSMgbWZoaQklMCwgJGFjMQkJXG4iCQkJXAorCSIJLndvcmQJMHgwMDIwMDgxMAkJXG4iCQkJXAorCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCisJIgkuc2V0CXBvcAkJCVxuIgkJCVwKKwk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKKwlfX3RyZWc7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIG1maGkyKCkJCQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX190cmVnOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIgkuc2V0CXB1c2gJCQlcbiIJCQlcCisJIgkuc2V0CW5vYXQJCQlcbiIJCQlcCisJIgkjIG1maGkJJTAsICRhYzIJCVxuIgkJCVwKKwkiCS53b3JkCTB4MDA0MDA4MTAJCVxuIgkJCVwKKwkiCW1vdmUJJTAsICQxCQkJXG4iCQkJXAorCSIJLnNldAlwb3AJCQlcbiIJCQlcCisJOiAiPXIiIChfX3RyZWcpKTsJCQkJCQlcCisJX190cmVnOwkJCQkJCQkJXAorfSkKKworI2RlZmluZSBtZmhpMygpCQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fdHJlZzsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJXG4iCQkJXAorCSIJLnNldAlub2F0CQkJXG4iCQkJXAorCSIJIyBtZmhpCSUwLCAkYWMzCQlcbiIJCQlcCisJIgkud29yZAkweDAwNjAwODEwCQlcbiIJCQlcCisJIgltb3ZlCSUwLCAkMQkJCVxuIgkJCVwKKwkiCS5zZXQJcG9wCQkJXG4iCQkJXAorCTogIj1yIiAoX190cmVnKSk7CQkJCQkJXAorCV9fdHJlZzsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgbWZsbzAoKQkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKKwkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKKwkiCSMgbWZsbwklMCwgJGFjMAkJXG4iCQkJXAorCSIJLndvcmQJMHgwMDAwMDgxMgkJXG4iCQkJXAorCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCisJIgkuc2V0CXBvcAkJCVxuIgkJCVwKKwk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKKwlfX3RyZWc7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIG1mbG8xKCkJCQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX190cmVnOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIgkuc2V0CXB1c2gJCQlcbiIJCQlcCisJIgkuc2V0CW5vYXQJCQlcbiIJCQlcCisJIgkjIG1mbG8JJTAsICRhYzEJCVxuIgkJCVwKKwkiCS53b3JkCTB4MDAyMDA4MTIJCVxuIgkJCVwKKwkiCW1vdmUJJTAsICQxCQkJXG4iCQkJXAorCSIJLnNldAlwb3AJCQlcbiIJCQlcCisJOiAiPXIiIChfX3RyZWcpKTsJCQkJCQlcCisJX190cmVnOwkJCQkJCQkJXAorfSkKKworI2RlZmluZSBtZmxvMigpCQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fdHJlZzsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJXG4iCQkJXAorCSIJLnNldAlub2F0CQkJXG4iCQkJXAorCSIJIyBtZmxvCSUwLCAkYWMyCQlcbiIJCQlcCisJIgkud29yZAkweDAwNDAwODEyCQlcbiIJCQlcCisJIgltb3ZlCSUwLCAkMQkJCVxuIgkJCVwKKwkiCS5zZXQJcG9wCQkJXG4iCQkJXAorCTogIj1yIiAoX190cmVnKSk7CQkJCQkJXAorCV9fdHJlZzsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgbWZsbzMoKQkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKKwkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKKwkiCSMgbWZsbwklMCwgJGFjMwkJXG4iCQkJXAorCSIJLndvcmQJMHgwMDYwMDgxMgkJXG4iCQkJXAorCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCisJIgkuc2V0CXBvcAkJCVxuIgkJCVwKKwk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKKwlfX3RyZWc7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIG10aGkwKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10aGkJJDEsICRhYzAJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDAwMTEJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10aGkxKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10aGkJJDEsICRhYzEJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDA4MTEJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10aGkyKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10aGkJJDEsICRhYzIJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDEwMTEJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10aGkzKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10aGkJJDEsICRhYzMJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDE4MTEJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10bG8wKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10bG8JJDEsICRhYzAJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDAwMTMJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10bG8xKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10bG8JJDEsICRhYzEJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDA4MTMJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10bG8yKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10bG8JJDEsICRhYzIJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDEwMTMJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG10bG8zKHgpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIJLnNldAlwdXNoCQkJCQlcbiIJXAorCSIJLnNldAlub2F0CQkJCQlcbiIJXAorCSIJbW92ZQkkMSwgJTAJCQkJCVxuIglcCisJIgkjIG10bG8JJDEsICRhYzMJCQkJXG4iCVwKKwkiCS53b3JkCTB4MDAyMDE4MTMJCQkJXG4iCVwKKwkiCS5zZXQJcG9wCQkJCQlcbiIJXAorCToJCQkJCQkJCVwKKwk6ICJyIiAoeCkpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZW5kaWYKKworLyoKKyAqIFRMQiBvcGVyYXRpb25zLgorICoKKyAqIEl0IGlzIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gdGFrZSBjYXJlIG9mIGFueSBUTEIgaGF6YXJkcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRsYl9wcm9iZSh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBub3Jlb3JkZXJcblx0IgorCQkidGxicFxuXHQiCisJCSIuc2V0IHJlb3JkZXIiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRsYl9yZWFkKHZvaWQpCit7CisjaWYgTUlQUzM0S19NSVNTRURfSVRMQl9XQVIKKwlpbnQgcmVzID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIJLnNldAlwdXNoCQkJCQlcbiIKKwkiCS5zZXQJbm9yZW9yZGVyCQkJCVxuIgorCSIJLnNldAlub2F0CQkJCQlcbiIKKwkiCS5zZXQJbWlwczMycjIJCQkJXG4iCisJIgkud29yZAkweDQxNjEwMDAxCQkjIGR2cGUgJDEJXG4iCisJIgltb3ZlCSUwLCAkMQkJCQkJXG4iCisJIgllaGIJCQkJCQlcbiIKKwkiCS5zZXQJcG9wCQkJCQlcbiIKKwk6ICI9ciIgKHJlcykpOworCisJaW5zdHJ1Y3Rpb25faGF6YXJkKCk7CisjZW5kaWYKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBub3Jlb3JkZXJcblx0IgorCQkidGxiclxuXHQiCisJCSIuc2V0IHJlb3JkZXIiKTsKKworI2lmIE1JUFMzNEtfTUlTU0VEX0lUTEJfV0FSCisJaWYgKChyZXMgJiBfVUxDQVNUXygxKSkpCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJcHVzaAkJCQlcbiIKKwkJIgkuc2V0CW5vcmVvcmRlcgkJCVxuIgorCQkiCS5zZXQJbm9hdAkJCQlcbiIKKwkJIgkuc2V0CW1pcHMzMnIyCQkJXG4iCisJCSIJLndvcmQJMHg0MTYwMDAyMQkjIGV2cGUJCVxuIgorCQkiCWVoYgkJCQkJXG4iCisJCSIJLnNldAlwb3AJCQkJXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX3dyaXRlX2luZGV4ZWQodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgbm9yZW9yZGVyXG5cdCIKKwkJInRsYndpXG5cdCIKKwkJIi5zZXQgcmVvcmRlciIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX3dyaXRlX3JhbmRvbSh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBub3Jlb3JkZXJcblx0IgorCQkidGxid3Jcblx0IgorCQkiLnNldCByZW9yZGVyIik7Cit9CisKKy8qCisgKiBNYW5pcHVsYXRlIGJpdHMgaW4gYSBjMCByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisvKgorICogU01UQyBMaW51eCByZXF1aXJlcyBzaHV0dGluZy1kb3duIG1pY3JvdGhyZWFkIHNjaGVkdWxpbmcKKyAqIGR1cmluZyBDUDAgcmVnaXN0ZXIgcmVhZC1tb2RpZnktd3JpdGUgc2VxdWVuY2VzLgorICovCisjZGVmaW5lIF9fQlVJTERfU0VUX0MwKG5hbWUpCQkJCQlcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAkJCQkJXAorc2V0X2MwXyMjbmFtZSh1bnNpZ25lZCBpbnQgc2V0KQkJCQkJXAorewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCByZXM7CQkJCQlcCisJCQkJCQkJCVwKKwlyZXMgPSByZWFkX2MwXyMjbmFtZSgpOwkJCQkJXAorCXJlcyB8PSBzZXQ7CQkJCQkJXAorCXdyaXRlX2MwXyMjbmFtZShyZXMpOwkJCQkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHJlczsJCQkJCQlcCit9CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CQkJCQlcCitjbGVhcl9jMF8jI25hbWUodW5zaWduZWQgaW50IGNsZWFyKQkJCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IHJlczsJCQkJCVwKKwkJCQkJCQkJXAorCXJlcyA9IHJlYWRfYzBfIyNuYW1lKCk7CQkJCQlcCisJcmVzICY9IH5jbGVhcjsJCQkJCQlcCisJd3JpdGVfYzBfIyNuYW1lKHJlcyk7CQkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcmVzOwkJCQkJCVwKK30JCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKK2NoYW5nZV9jMF8jI25hbWUodW5zaWduZWQgaW50IGNoYW5nZSwgdW5zaWduZWQgaW50IG5ldykJCVwKK3sJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAorCQkJCQkJCQlcCisJcmVzID0gcmVhZF9jMF8jI25hbWUoKTsJCQkJCVwKKwlyZXMgJj0gfmNoYW5nZTsJCQkJCQlcCisJcmVzIHw9IChuZXcgJiBjaGFuZ2UpOwkJCQkJXAorCXdyaXRlX2MwXyMjbmFtZShyZXMpOwkJCQkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHJlczsJCQkJCQlcCit9CisKKyNlbHNlIC8qIFNNVEMgdmVyc2lvbnMgdGhhdCBtYW5hZ2UgTVQgc2NoZWR1bGluZyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKworLyoKKyAqIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgZG10KCkgaW4gbWlwc210cmVncy5oIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKKyAqIGhlYWRlciBmaWxlIHJlY3Vyc2lvbi4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19kbXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIgkuc2V0CXB1c2gJCQkJCQlcbiIKKwkiCS5zZXQJbWlwczMycjIJCQkJCVxuIgorCSIJLnNldAlub2F0CQkJCQkJXG4iCisJIgkud29yZAkweDQxNjEwQkMxCQkJIyBkbXQgJDEJXG4iCisJIgllaGIJCQkJCQkJXG4iCisJIgltb3ZlCSUwLCAkMQkJCQkJCVxuIgorCSIJLnNldAlwb3AJCQkJCQlcbiIKKwk6ICI9ciIgKHJlcykpOworCisJaW5zdHJ1Y3Rpb25faGF6YXJkKCk7CisKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIF9fVlBFQ09OVFJPTF9URV9TSElGVAkxNQorI2RlZmluZSBfX1ZQRUNPTlRST0xfVEUJCSgxVUwgPDwgX19WUEVDT05UUk9MX1RFX1NISUZUKQorCisjZGVmaW5lIF9fRU1UX0VOQUJMRQkJX19WUEVDT05UUk9MX1RFCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2VtdCh1bnNpZ25lZCBpbnQgcHJldmlvdXMpCit7CisJaWYgKChwcmV2aW91cyAmIF9fRU1UX0VOQUJMRSkpCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbWlwczMycjIJCQkJXG4iCisJCSIJLndvcmQJMHg0MTYwMGJlMQkJIyBlbXQJCVxuIgorCQkiCWVoYgkJCQkJCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2VoYih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIJLnNldAltaXBzMzJyMgkJCQkJXG4iCisJIgllaGIJCQkJCQkJXG4iCQkiCS5zZXQJbWlwczAJCQkJCQlcbiIpOworfQorCisvKgorICogTm90ZSB0aGF0IGxvY2FsX2lycV9zYXZlL3Jlc3RvcmUgYWZmZWN0IFRDLXNwZWNpZmljIElYTVQgc3RhdGUsCisgKiBub3QgU3RhdHVzLklFIGFzIGluIG5vbi1TTVRDIGtlcm5lbC4KKyAqLworCisjZGVmaW5lIF9fQlVJTERfU0VUX0MwKG5hbWUpCQkJCQlcCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAkJCQkJXAorc2V0X2MwXyMjbmFtZSh1bnNpZ25lZCBpbnQgc2V0KQkJCQkJXAorewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCByZXM7CQkJCQlcCisJdW5zaWduZWQgaW50IG9tdDsJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJXAorCQkJCQkJCQlcCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwkJCQkJXAorCW9tdCA9IF9fZG10KCk7CQkJCQkJXAorCXJlcyA9IHJlYWRfYzBfIyNuYW1lKCk7CQkJCQlcCisJcmVzIHw9IHNldDsJCQkJCQlcCisJd3JpdGVfYzBfIyNuYW1lKHJlcyk7CQkJCQlcCisJX19lbXQob210KTsJCQkJCQlcCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcmVzOwkJCQkJCVwKK30JCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKK2NsZWFyX2MwXyMjbmFtZSh1bnNpZ25lZCBpbnQgY2xlYXIpCQkJCVwKK3sJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAorCXVuc2lnbmVkIGludCBvbXQ7CQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKKwkJCQkJCQkJXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsJCQkJCVwKKwlvbXQgPSBfX2RtdCgpOwkJCQkJCVwKKwlyZXMgPSByZWFkX2MwXyMjbmFtZSgpOwkJCQkJXAorCXJlcyAmPSB+Y2xlYXI7CQkJCQkJXAorCXdyaXRlX2MwXyMjbmFtZShyZXMpOwkJCQkJXAorCV9fZW10KG9tdCk7CQkJCQkJXAorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJCQkJXAorCQkJCQkJCQlcCisJcmV0dXJuIHJlczsJCQkJCQlcCit9CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CQkJCQlcCitjaGFuZ2VfYzBfIyNuYW1lKHVuc2lnbmVkIGludCBjaGFuZ2UsIHVuc2lnbmVkIGludCBuZXcpCQlcCit7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IHJlczsJCQkJCVwKKwl1bnNpZ25lZCBpbnQgb210OwkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQlcCisJCQkJCQkJCVwKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CQkJCQlcCisJCQkJCQkJCVwKKwlvbXQgPSBfX2RtdCgpOwkJCQkJCVwKKwlyZXMgPSByZWFkX2MwXyMjbmFtZSgpOwkJCQkJXAorCXJlcyAmPSB+Y2hhbmdlOwkJCQkJCVwKKwlyZXMgfD0gKG5ldyAmIGNoYW5nZSk7CQkJCQlcCisJd3JpdGVfYzBfIyNuYW1lKHJlcyk7CQkJCQlcCisJX19lbXQob210KTsJCQkJCQlcCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcmVzOwkJCQkJCVwKK30KKyNlbmRpZgorCitfX0JVSUxEX1NFVF9DMChzdGF0dXMpCitfX0JVSUxEX1NFVF9DMChjYXVzZSkKK19fQlVJTERfU0VUX0MwKGNvbmZpZykKK19fQlVJTERfU0VUX0MwKGludGNvbnRyb2wpCitfX0JVSUxEX1NFVF9DMChpbnRjdGwpCitfX0JVSUxEX1NFVF9DMChzcnNtYXApCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX01JUFNSRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbW1hbi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tbWFuLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbWFuLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbW11LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW11LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbW11LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbXUuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2YzZWIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBTd2l0Y2ggYSBNTVUgY29udGV4dC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaWZuZGVmIF9BU01fTU1VX0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX01NVV9DT05URVhUX0gKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisjaW5jbHVkZSA8YXNtL21pcHNtdHJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc210Yy5oPgorI2VuZGlmIC8qIFNNVEMgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgorCisvKgorICogRm9yIHRoZSBmYXN0IHRsYiBtaXNzIGhhbmRsZXJzLCB3ZSBrZWVwIGEgcGVyIGNwdSBhcnJheSBvZiBwb2ludGVycworICogdG8gdGhlIGN1cnJlbnQgcGdkIGZvciBlYWNoIHByb2Nlc3Nvci4gQWxzbywgdGhlIHByb2MuIGlkIGlzIHN0dWZmZWQKKyAqIGludG8gdGhlIGNvbnRleHQgcmVnaXN0ZXIuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHBnZF9jdXJyZW50W107CisKKyNkZWZpbmUgVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChwZ2QpIFwKKwlwZ2RfY3VycmVudFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKHVuc2lnbmVkIGxvbmcpKHBnZCkKKworI2lmZGVmIENPTkZJR18zMkJJVAorI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKKwl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSBzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMjUpOwlcCisJVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChzd2FwcGVyX3BnX2RpcikKKyNlbmRpZgorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKKwl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSBzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMjYpOwlcCisJVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChzd2FwcGVyX3BnX2RpcikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQorCisjZGVmaW5lIEFTSURfSU5DCTB4NDAKKyNkZWZpbmUgQVNJRF9NQVNLCTB4ZmMwCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9SODAwMCkKKworI2RlZmluZSBBU0lEX0lOQwkweDEwCisjZGVmaW5lIEFTSURfTUFTSwkweGZmMAorCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfUk05MDAwKQorCisjZGVmaW5lIEFTSURfSU5DCTB4MQorI2RlZmluZSBBU0lEX01BU0sJMHhmZmYKKworLyogU01UQy8zNEsgZGVidWcgaGFjayAtIGJ1dCBtYXliZSB3ZSdsbCBrZWVwIGl0ICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCisKKyNkZWZpbmUgQVNJRF9JTkMJMHgxCitleHRlcm4gdW5zaWduZWQgbG9uZyBzbXRjX2FzaWRfbWFzazsKKyNkZWZpbmUgQVNJRF9NQVNLCShzbXRjX2FzaWRfbWFzaykKKyNkZWZpbmUJSFdfQVNJRF9NQVNLCTB4ZmYKKy8qIEVuZCBTTVRDLzM0SyBkZWJ1ZyBoYWNrICovCisjZWxzZSAvKiBGSVhNRTogbm90IGNvcnJlY3QgZm9yIFI2MDAwICovCisKKyNkZWZpbmUgQVNJRF9JTkMJMHgxCisjZGVmaW5lIEFTSURfTUFTSwkweGZmCisKKyNlbmRpZgorCisjZGVmaW5lIGNwdV9jb250ZXh0KGNwdSwgbW0pCSgobW0pLT5jb250ZXh0W2NwdV0pCisjZGVmaW5lIGNwdV9hc2lkKGNwdSwgbW0pCShjcHVfY29udGV4dCgoY3B1KSwgKG1tKSkgJiBBU0lEX01BU0spCisjZGVmaW5lIGFzaWRfY2FjaGUoY3B1KQkJKGNwdV9kYXRhW2NwdV0uYXNpZF9jYWNoZSkKKworc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKK30KKworLyoKKyAqICBBbGwgdW51c2VkIGJ5IGhhcmR3YXJlIHVwcGVyIGJpdHMgd2lsbCBiZSBjb25zaWRlcmVkCisgKiAgYXMgYSBzb2Z0d2FyZSBhc2lkIGV4dGVuc2lvbi4KKyAqLworI2RlZmluZSBBU0lEX1ZFUlNJT05fTUFTSyAgKCh1bnNpZ25lZCBsb25nKX4oQVNJRF9NQVNLfChBU0lEX01BU0stMSkpKQorI2RlZmluZSBBU0lEX0ZJUlNUX1ZFUlNJT04gKCh1bnNpZ25lZCBsb25nKSh+QVNJRF9WRVJTSU9OX01BU0spICsgMSkKKworI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisvKiBOb3JtYWwsIGNsYXNzaWMgTUlQUyBnZXRfbmV3X21tdV9jb250ZXh0ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2dldF9uZXdfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgYXNpZCA9IGFzaWRfY2FjaGUoY3B1KTsKKworCWlmICghICgoYXNpZCArPSBBU0lEX0lOQykgJiBBU0lEX01BU0spICkgeworCQlpZiAoY3B1X2hhc192dGFnX2ljYWNoZSkKKwkJCWZsdXNoX2ljYWNoZV9hbGwoKTsKKwkJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwkvKiBzdGFydCBuZXcgYXNpZCBjeWNsZSAqLworCQlpZiAoIWFzaWQpCQkvKiBmaXggdmVyc2lvbiBpZiBuZWVkZWQgKi8KKwkJCWFzaWQgPSBBU0lEX0ZJUlNUX1ZFUlNJT047CisJfQorCWNwdV9jb250ZXh0KGNwdSwgbW0pID0gYXNpZF9jYWNoZShjcHUpID0gYXNpZDsKK30KKworI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCisjZGVmaW5lIGdldF9uZXdfbW11X2NvbnRleHQobW0sIGNwdSkgc210Y19nZXRfbmV3X21tdV9jb250ZXh0KChtbSksIChjcHUpKQorCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGEgbmV3IG1tX3N0cnVjdAorICogaW5zdGFuY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKKwkJY3B1X2NvbnRleHQoaSwgbW0pID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJdW5zaWduZWQgbG9uZyBvbGRhc2lkOworCXVuc2lnbmVkIGxvbmcgbXRmbGFnczsKKwlpbnQgbXl0bGIgPSAoc210Y19zdGF0dXMgJiBTTVRDX1RMQl9TSEFSRUQpID8gMCA6IGNwdV9kYXRhW2NwdV0udnBlX2lkOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltdGZsYWdzID0gZHZwZSgpOworI2Vsc2UgLyogTm90IFNNVEMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCisJLyogQ2hlY2sgaWYgb3VyIEFTSUQgaXMgb2YgYW4gb2xkZXIgdmVyc2lvbiBhbmQgdGh1cyBpbnZhbGlkICovCisJaWYgKChjcHVfY29udGV4dChjcHUsIG5leHQpIF4gYXNpZF9jYWNoZShjcHUpKSAmIEFTSURfVkVSU0lPTl9NQVNLKQorCQlnZXRfbmV3X21tdV9jb250ZXh0KG5leHQsIGNwdSk7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCS8qCisJICogSWYgdGhlIEVudHJ5SGkgQVNJRCBiZWluZyByZXBsYWNlZCBoYXBwZW5zIHRvIGJlCisJICogdGhlIHZhbHVlIGZsYWdnZWQgYXQgQVNJRCByZWN5Y2xpbmcgdGltZSBhcyBoYXZpbmcKKwkgKiBhbiBleHRlbmRlZCBsaWZlLCBjbGVhciB0aGUgYml0IHNob3dpbmcgaXQgYmVpbmcKKwkgKiBpbiB1c2UgYnkgdGhpcyAiQ1BVIiwgYW5kIGlmIHRoYXQncyB0aGUgbGFzdCBiaXQsCisJICogZnJlZSB1cCB0aGUgQVNJRCB2YWx1ZSBmb3IgdXNlIGFuZCBmbHVzaCBhbnkgb2xkCisJICogaW5zdGFuY2VzIG9mIGl0IGZyb20gdGhlIFRMQi4KKwkgKi8KKwlvbGRhc2lkID0gKHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLKTsKKwlpZihzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0pIHsKKwkJc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdICY9IH4oMHgxIDw8IGNwdSk7CisJCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSA9PSAwKQorCQkJc210Y19mbHVzaF90bGJfYXNpZChvbGRhc2lkKTsKKwl9CisJLyoKKwkgKiBUcmVhZCBzb2Z0bHkgb24gRW50cnlIaSwgYW5kIHNvIGxvbmcgYXMgd2Ugc3VwcG9ydAorCSAqIGhhdmluZyBBU0lEX01BU0sgc21hbGxlciB0aGFuIHRoZSBoYXJkd2FyZSBtYXhpbXVtLAorCSAqIG1ha2Ugc3VyZSBubyAic29mdCIgYml0cyBiZWNvbWUgImhhcmQiLi4uCisJICovCisJd3JpdGVfYzBfZW50cnloaSgocmVhZF9jMF9lbnRyeWhpKCkgJiB+SFdfQVNJRF9NQVNLKQorCQkJfCAoY3B1X2NvbnRleHQoY3B1LCBuZXh0KSAmIEFTSURfTUFTSykpOworCWVoYigpOyAvKiBNYWtlIHN1cmUgaXQgcHJvcGFnYXRlcyB0byBUQ1N0YXR1cyAqLworCWV2cGUobXRmbGFncyk7CisjZWxzZQorCXdyaXRlX2MwX2VudHJ5aGkoY3B1X2NvbnRleHQoY3B1LCBuZXh0KSk7CisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCVRMQk1JU1NfSEFORExFUl9TRVRVUF9QR0QobmV4dC0+cGdkKTsKKworCS8qCisJICogTWFyayBjdXJyZW50LT5hY3RpdmVfbW0gYXMgbm90ICJhY3RpdmUiIGFueW1vcmUuCisJICogV2UgZG9uJ3Qgd2FudCB0byBtaXNsZWFkIHBvc3NpYmxlIElQSSB0bGIgZmx1c2ggcm91dGluZXMuCisJICovCisJY3B1X2NsZWFyKGNwdSwgcHJldi0+Y3B1X3ZtX21hc2spOworCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBEZXN0cm95IGNvbnRleHQgcmVsYXRlZCBpbmZvIGZvciBhbiBtbV9zdHJ1Y3QgdGhhdCBpcyBhYm91dAorICogdG8gYmUgcHV0IHRvIHJlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKKyNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKKyAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCXVuc2lnbmVkIGxvbmcgb2xkYXNpZDsKKwl1bnNpZ25lZCBsb25nIG10ZmxhZ3M7CisJaW50IG15dGxiID0gKHNtdGNfc3RhdHVzICYgU01UQ19UTEJfU0hBUkVEKSA/IDAgOiBjcHVfZGF0YVtjcHVdLnZwZV9pZDsKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBVbmNvbmRpdGlvbmFsbHkgZ2V0IGEgbmV3IEFTSUQuICAqLworCWdldF9uZXdfbW11X2NvbnRleHQobmV4dCwgY3B1KTsKKworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLworCW10ZmxhZ3MgPSBkdnBlKCk7CisJb2xkYXNpZCA9IHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLOworCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSkgeworCQlzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0gJj0gfigweDEgPDwgY3B1KTsKKwkJaWYoc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdID09IDApCisJCQkgc210Y19mbHVzaF90bGJfYXNpZChvbGRhc2lkKTsKKwl9CisJLyogU2VlIGNvbW1lbnRzIGZvciBzaW1pbGFyIGNvZGUgYWJvdmUgKi8KKwl3cml0ZV9jMF9lbnRyeWhpKChyZWFkX2MwX2VudHJ5aGkoKSAmIH5IV19BU0lEX01BU0spIHwKKwkgICAgICAgICAgICAgICAgIChjcHVfY29udGV4dChjcHUsIG5leHQpICYgQVNJRF9NQVNLKSk7CisJZWhiKCk7IC8qIE1ha2Ugc3VyZSBpdCBwcm9wYWdhdGVzIHRvIFRDU3RhdHVzICovCisJZXZwZShtdGZsYWdzKTsKKyNlbHNlCisJd3JpdGVfYzBfZW50cnloaShjcHVfY29udGV4dChjcHUsIG5leHQpKTsKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChuZXh0LT5wZ2QpOworCisJLyogbWFyayBtbXUgb3duZXJzaGlwIGNoYW5nZSAqLworCWNwdV9jbGVhcihjcHUsIHByZXYtPmNwdV92bV9tYXNrKTsKKwljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogSWYgbW0gaXMgY3VycmVudGx5IGFjdGl2ZV9tbSwgd2UgY2FuJ3QgcmVhbGx5IGRyb3AgaXQuICBJbnN0ZWFkLAorICogd2Ugd2lsbCBnZXQgYSBuZXcgb25lIGZvciBpdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkcm9wX21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJdW5zaWduZWQgbG9uZyBvbGRhc2lkOworCS8qIENhbid0IHVzZSBzcGlubG9jayBiZWNhdXNlIGNhbGxlZCBmcm9tIFRMQiBmbHVzaCB3aXRoaW4gRFZQRSAqLworCXVuc2lnbmVkIGludCBwcmV2dnBlOworCWludCBteXRsYiA9IChzbXRjX3N0YXR1cyAmIFNNVENfVExCX1NIQVJFRCkgPyAwIDogY3B1X2RhdGFbY3B1XS52cGVfaWQ7CisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKGNwdV9pc3NldChjcHUsIG1tLT5jcHVfdm1fbWFzaykpICB7CisJCWdldF9uZXdfbW11X2NvbnRleHQobW0sIGNwdSk7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCQkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLworCQlwcmV2dnBlID0gZHZwZSgpOworCQlvbGRhc2lkID0gKHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLKTsKKwkJaWYgKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSkgeworCQkJc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdICY9IH4oMHgxIDw8IGNwdSk7CisJCQlpZihzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0gPT0gMCkKKwkJCQlzbXRjX2ZsdXNoX3RsYl9hc2lkKG9sZGFzaWQpOworCQl9CisJCS8qIFNlZSBjb21tZW50cyBmb3Igc2ltaWxhciBjb2RlIGFib3ZlICovCisJCXdyaXRlX2MwX2VudHJ5aGkoKHJlYWRfYzBfZW50cnloaSgpICYgfkhXX0FTSURfTUFTSykKKwkJCQl8IGNwdV9hc2lkKGNwdSwgbW0pKTsKKwkJZWhiKCk7IC8qIE1ha2Ugc3VyZSBpdCBwcm9wYWdhdGVzIHRvIFRDU3RhdHVzICovCisJCWV2cGUocHJldnZwZSk7CisjZWxzZSAvKiBub3QgQ09ORklHX01JUFNfTVRfU01UQyAqLworCQl3cml0ZV9jMF9lbnRyeWhpKGNwdV9hc2lkKGNwdSwgbW0pKTsKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJfSBlbHNlIHsKKwkJLyogd2lsbCBnZXQgYSBuZXcgY29udGV4dCBuZXh0IHRpbWUgKi8KKyNpZm5kZWYgQ09ORklHX01JUFNfTVRfU01UQworCQljcHVfY29udGV4dChjcHUsIG1tKSA9IDA7CisjZWxzZSAvKiBTTVRDICovCisJCWludCBpOworCisJCS8qIFNNVEMgc2hhcmVzIHRoZSBUTEIgKGFuZCBBU0lEcykgYWNyb3NzIFZQRXMgKi8KKwkJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCSAgICBpZigoc210Y19zdGF0dXMgJiBTTVRDX1RMQl9TSEFSRUQpCisJCSAgICB8fCAoY3B1X2RhdGFbaV0udnBlX2lkID09IGNwdV9kYXRhW2NwdV0udnBlX2lkKSkKKwkJCWNwdV9jb250ZXh0KGksIG1tKSA9IDA7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9BU01fTU1VX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tbXpvbmUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbXpvbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9tbXpvbmUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tem9uZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21vZHVsZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21vZHVsZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbXNjMDFfaWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tc2MwMV9pYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21zYzAxX2ljLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tc2MwMV9pYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21zZ2J1Zi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21zZ2J1Zi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbXNnYnVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbXV0ZXguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tdXRleC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL211dGV4LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9tdXRleC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL25pbGU0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbmlsZTQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9uaWxlNC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vbmlsZTQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wYWNjZXNzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFjY2Vzcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BhY2Nlc3MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhY2Nlc3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BhZ2UuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wYXJhbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhcmFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcGFyYW0uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhcmFtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGFycG9ydC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhcnBvcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wYXJwb3J0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGNpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcGNpLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wY2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wY2kvYnJpZGdlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGNpL2JyaWRnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BjaS9icmlkZ2UuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BjaS9icmlkZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZXJjcHUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZXJjcHUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wZXJjcHUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BlcmNwdS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BnYWxsb2MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcGdhbGxvYy5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS0zMi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTgxM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtMzIuaApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAyMDAwLCAyMDAzIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2lmbmRlZiBfQVNNX1BHVEFCTEVfMzJfSAorI2RlZmluZSBfQVNNX1BHVEFCTEVfMzJfSAorCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgorCisvKgorICogLSBhZGRfd2lyZWRfZW50cnkoKSBhZGQgYSBmaXhlZCBUTEIgZW50cnksIGFuZCBtb3ZlIHdpcmVkIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB2b2lkIGFkZF93aXJlZF9lbnRyeSh1bnNpZ25lZCBsb25nIGVudHJ5bG8wLCB1bnNpZ25lZCBsb25nIGVudHJ5bG8xLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW50cnloaSwgdW5zaWduZWQgbG9uZyBwYWdlbWFzayk7CisKKy8qCisgKiAtIGFkZF90ZW1wb3JhcnlfZW50cnkoKSBhZGQgYSB0ZW1wb3JhcnkgVExCIGVudHJ5LiBXZSB1c2UgVExCIGVudHJpZXMKKyAqCXN0YXJ0aW5nIGF0IHRoZSB0b3AgYW5kIHdvcmtpbmcgZG93bi4gVGhpcyBpcyBmb3IgcG9wdWxhdGluZyB0aGUKKyAqCVRMQiBiZWZvcmUgdHJhcF9pbml0KCkgcHV0cyB0aGUgVExCIG1pc3MgaGFuZGxlciBpbiBwbGFjZS4gSXQKKyAqCXNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGVudHJpZXMgbWF0Y2hpbmcgdGhlIGFjdHVhbCBwYWdlIHRhYmxlcywKKyAqCXRvIHByZXZlbnQgaW5jb25zaXN0ZW5jaWVzLgorICovCitleHRlcm4gaW50IGFkZF90ZW1wb3JhcnlfZW50cnkodW5zaWduZWQgbG9uZyBlbnRyeWxvMCwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGVudHJ5aGksIHVuc2lnbmVkIGxvbmcgcGFnZW1hc2spOworCisKKy8qIEJhc2ljYWxseSB3ZSBoYXZlIHRoZSBzYW1lIHR3by1sZXZlbCAod2hpY2ggaXMgdGhlIGxvZ2ljYWwgdGhyZWUgbGV2ZWwKKyAqIExpbnV4IHBhZ2UgdGFibGUgbGF5b3V0IGZvbGRlZCkgcGFnZSB0YWJsZXMgYXMgdGhlIGkzODYuICBTb21lIGRheQorICogd2hlbiB3ZSBoYXZlIHByb3BlciBwYWdlIGNvbG9yaW5nIHN1cHBvcnQgd2UgY2FuIGhhdmUgYSAxJSBxdWlja2VyCisgKiB0bGIgcmVmaWxsIGhhbmRsaW5nIG1lY2hhbmlzbSwgYnV0IGZvciBub3cgaXQgaXMgYSBiaXQgc2xvd2VyIGJ1dAorICogd29ya3MgZXZlbiB3aXRoIHRoZSBjYWNoZSBhbGlhc2luZyBwcm9ibGVtIHRoZSBSNGsgYW5kIGFib3ZlIGhhdmUuCisgKi8KKworLyogUEdESVJfU0hJRlQgZGV0ZXJtaW5lcyB3aGF0IGEgdGhpcmQtbGV2ZWwgcGFnZSB0YWJsZSBlbnRyeSBjYW4gbWFwICovCisjZGVmaW5lIFBHRElSX1NISUZUCSgyICogUEFHRV9TSElGVCArIFBURV9PUkRFUiAtIFBURV9UX0xPRzIpCisjZGVmaW5lIFBHRElSX1NJWkUJKDFVTCA8PCBQR0RJUl9TSElGVCkKKyNkZWZpbmUgUEdESVJfTUFTSwkofihQR0RJUl9TSVpFLTEpKQorCisvKgorICogRW50cmllcyBwZXIgcGFnZSBkaXJlY3RvcnkgbGV2ZWw6IHdlIHVzZSB0d28tbGV2ZWwsIHNvCisgKiB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhbnkgUFVEL1BNRCBkaXJlY3RvcnkgcGh5c2ljYWxseS4KKyAqLworI2RlZmluZSBfX1BHRF9PUkRFUgkoMzIgLSAzICogUEFHRV9TSElGVCArIFBHRF9UX0xPRzIgKyBQVEVfVF9MT0cyKQorI2RlZmluZSBQR0RfT1JERVIJKF9fUEdEX09SREVSID49IDAgPyBfX1BHRF9PUkRFUiA6IDApCisjZGVmaW5lIFBVRF9PUkRFUglhaWVlZWVfYXR0ZW1wdF90b19hbGxvY2F0ZV9wdWQKKyNkZWZpbmUgUE1EX09SREVSCTEKKyNkZWZpbmUgUFRFX09SREVSCTAKKworI2RlZmluZSBQVFJTX1BFUl9QR0QJKFVTRVJfUFRSU19QRVJfUEdEICogMikKKyNkZWZpbmUgUFRSU19QRVJfUFRFCSgoUEFHRV9TSVpFIDw8IFBURV9PUkRFUikgLyBzaXplb2YocHRlX3QpKQorCisjZGVmaW5lIFVTRVJfUFRSU19QRVJfUEdECSgweDgwMDAwMDAwVUwvUEdESVJfU0laRSkKKyNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTCTAKKworI2RlZmluZSBWTUFMTE9DX1NUQVJUICAgICBNQVBfQkFTRQorCisjZGVmaW5lIFBLTUFQX0JBU0UJCSgweGZlMDAwMDAwVUwpCisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorIyBkZWZpbmUgVk1BTExPQ19FTkQJKFBLTUFQX0JBU0UtMipQQUdFX1NJWkUpCisjZWxzZQorIyBkZWZpbmUgVk1BTExPQ19FTkQJKEZJWEFERFJfU1RBUlQtMipQQUdFX1NJWkUpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR182NEJJVF9QSFlTX0FERFIKKyNkZWZpbmUgcHRlX0VSUk9SKGUpIFwKKwlwcmludGsoIiVzOiVkOiBiYWQgcHRlICUwMTZMeC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRlX3ZhbChlKSkKKyNlbHNlCisjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCisJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRlX3ZhbChlKSkKKyNlbmRpZgorI2RlZmluZSBwZ2RfRVJST1IoZSkgXAorCXByaW50aygiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHBnZF92YWwoZSkpCisKK2V4dGVybiB2b2lkIGxvYWRfcGdkKHVuc2lnbmVkIGxvbmcgcGdfZGlyKTsKKworZXh0ZXJuIHB0ZV90IGludmFsaWRfcHRlX3RhYmxlW1BBR0VfU0laRS9zaXplb2YocHRlX3QpXTsKKworLyoKKyAqIEVtcHR5IHBnZC9wbWQgZW50cmllcyBwb2ludCB0byB0aGUgaW52YWxpZF9wdGVfdGFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBtZF9ub25lKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3ZhbChwbWQpID09ICh1bnNpZ25lZCBsb25nKSBpbnZhbGlkX3B0ZV90YWJsZTsKK30KKworI2RlZmluZSBwbWRfYmFkKHBtZCkJCShwbWRfdmFsKHBtZCkgJiB+UEFHRV9NQVNLKQorCitzdGF0aWMgaW5saW5lIGludCBwbWRfcHJlc2VudChwbWRfdCBwbWQpCit7CisJcmV0dXJuIHBtZF92YWwocG1kKSAhPSAodW5zaWduZWQgbG9uZykgaW52YWxpZF9wdGVfdGFibGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfY2xlYXIocG1kX3QgKnBtZHApCit7CisJcG1kX3ZhbCgqcG1kcCkgPSAoKHVuc2lnbmVkIGxvbmcpIGludmFsaWRfcHRlX3RhYmxlKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikKKyNkZWZpbmUgcHRlX3BhZ2UoeCkJCXBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCisjZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoKHgpLnB0ZV9oaWdoID4+IDYpKQorc3RhdGljIGlubGluZSBwdGVfdAorcGZuX3B0ZSh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKK3sKKwlwdGVfdCBwdGU7CisJcHRlLnB0ZV9oaWdoID0gKHBmbiA8PCA2KSB8IChwZ3Byb3RfdmFsKHByb3QpICYgMHgzZik7CisJcHRlLnB0ZV9sb3cgPSBwZ3Byb3RfdmFsKHByb3QpOworCXJldHVybiBwdGU7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgcHRlX3BhZ2UoeCkJCXBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCisKKyNpZmRlZiBDT05GSUdfQ1BVX1ZSNDFYWAorI2RlZmluZSBwdGVfcGZuKHgpCQkoKHVuc2lnbmVkIGxvbmcpKCh4KS5wdGUgPj4gKFBBR0VfU0hJRlQgKyAyKSkpCisjZGVmaW5lIHBmbl9wdGUocGZuLCBwcm90KQlfX3B0ZSgoKHBmbikgPDwgKFBBR0VfU0hJRlQgKyAyKSkgfCBwZ3Byb3RfdmFsKHByb3QpKQorI2Vsc2UKKyNkZWZpbmUgcHRlX3Bmbih4KQkJKCh1bnNpZ25lZCBsb25nKSgoeCkucHRlID4+IFBBR0VfU0hJRlQpKQorI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJX19wdGUoKCh1bnNpZ25lZCBsb25nIGxvbmcpKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQorI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyKSAqLworCisjZGVmaW5lIF9fcGdkX29mZnNldChhZGRyZXNzKQlwZ2RfaW5kZXgoYWRkcmVzcykKKyNkZWZpbmUgX19wdWRfb2Zmc2V0KGFkZHJlc3MpCSgoKGFkZHJlc3MpID4+IFBVRF9TSElGVCkgJiAoUFRSU19QRVJfUFVELTEpKQorI2RlZmluZSBfX3BtZF9vZmZzZXQoYWRkcmVzcykJKCgoYWRkcmVzcykgPj4gUE1EX1NISUZUKSAmIChQVFJTX1BFUl9QTUQtMSkpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBrZXJuZWwgcGFnZS10YWJsZS1kaXJlY3RvcnkgKi8KKyNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIHBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpCisKKyNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpCSgoKGFkZHJlc3MpID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QtMSkpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKQkoKG1tKS0+cGdkICsgcGdkX2luZGV4KGFkZHIpKQorCisvKiBGaW5kIGFuIGVudHJ5IGluIHRoZSB0aGlyZC1sZXZlbCBwYWdlIHRhYmxlLi4gKi8KKyNkZWZpbmUgX19wdGVfb2Zmc2V0KGFkZHJlc3MpCQkJCQkJXAorCSgoKGFkZHJlc3MpID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURSAtIDEpKQorI2RlZmluZSBwdGVfb2Zmc2V0KGRpciwgYWRkcmVzcykJCQkJCVwKKwkoKHB0ZV90ICopIHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV9vZmZzZXRfa2VybmVsKGRpciwgYWRkcmVzcykJCQkJCVwKKwkoKHB0ZV90ICopIHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLCBhZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCooZGlyKSkpICsgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQorI2RlZmluZSBwdGVfb2Zmc2V0X21hcF9uZXN0ZWQoZGlyLCBhZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgocHRlX3QgKilwYWdlX2FkZHJlc3MocG1kX3BhZ2UoKihkaXIpKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV91bm1hcChwdGUpICgodm9pZCkocHRlKSkKKyNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpICgodm9pZCkocHRlKSkKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9SMzAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1RYMzlYWCkKKworLyogU3dhcCBlbnRyaWVzIG11c3QgaGF2ZSBWQUxJRCBiaXQgY2xlYXJlZC4gKi8KKyNkZWZpbmUgX19zd3BfdHlwZSh4KQkJKCgoeCkudmFsID4+IDEwKSAmIDB4MWYpCisjZGVmaW5lIF9fc3dwX29mZnNldCh4KQkJKCh4KS52YWwgPj4gMTUpCisjZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsb2Zmc2V0KQlcCisJKChzd3BfZW50cnlfdCkgeyAoKHR5cGUpIDw8IDEwKSB8ICgob2Zmc2V0KSA8PCAxNSkgfSkKKworLyoKKyAqIEJpdHMgMCwgNCwgOCwgYW5kIDkgYXJlIHRha2VuLCBzcGxpdCB1cCAyOCBiaXRzIG9mIG9mZnNldCBpbnRvIHRoaXMgcmFuZ2U6CisgKi8KKyNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJMjgKKworI2RlZmluZSBwdGVfdG9fcGdvZmYoX3B0ZSkJKCgoKF9wdGUpLnB0ZSA+PiAxICkgJiAweDA3KSB8IFwKKwkJCQkgKCgoX3B0ZSkucHRlID4+IDIgKSAmIDB4MzgpIHwgXAorCQkJCSAoKChfcHRlKS5wdGUgPj4gMTApIDw8ICA2ICkpCisKKyNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeyAoKChvZmYpICYgMHgwNykgPDwgMSApIHwgXAorCQkJCQkgICAoKChvZmYpICYgMHgzOCkgPDwgMiApIHwgXAorCQkJCQkgICAoKChvZmYpID4+ICA2ICkgPDwgMTApIHwgXAorCQkJCQkgICBfUEFHRV9GSUxFIH0pCisKKyNlbHNlCisKKy8qIFN3YXAgZW50cmllcyBtdXN0IGhhdmUgVkFMSUQgYW5kIEdMT0JBTCBiaXRzIGNsZWFyZWQuICovCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyKQorI2RlZmluZSBfX3N3cF90eXBlKHgpCQkoKCh4KS52YWwgPj4gMikgJiAweDFmKQorI2RlZmluZSBfX3N3cF9vZmZzZXQoeCkgCSAoKHgpLnZhbCA+PiA3KQorI2RlZmluZSBfX3N3cF9lbnRyeSh0eXBlLG9mZnNldCkJXAorCQkoKHN3cF9lbnRyeV90KSAgeyAoKHR5cGUpIDw8IDIpIHwgKChvZmZzZXQpIDw8IDcpIH0pCisjZWxzZQorI2RlZmluZSBfX3N3cF90eXBlKHgpCQkoKCh4KS52YWwgPj4gOCkgJiAweDFmKQorI2RlZmluZSBfX3N3cF9vZmZzZXQoeCkgCSAoKHgpLnZhbCA+PiAxMykKKyNkZWZpbmUgX19zd3BfZW50cnkodHlwZSxvZmZzZXQpCVwKKwkJKChzd3BfZW50cnlfdCkgIHsgKCh0eXBlKSA8PCA4KSB8ICgob2Zmc2V0KSA8PCAxMykgfSkKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpICovCisKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpCisvKgorICogQml0cyAwIGFuZCAxIG9mIHB0ZV9oaWdoIGFyZSB0YWtlbiwgdXNlIHRoZSByZXN0IGZvciB0aGUgcGFnZSBvZmZzZXQuLi4KKyAqLworI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkzMAorCisjZGVmaW5lIHB0ZV90b19wZ29mZihfcHRlKQkoKF9wdGUpLnB0ZV9oaWdoID4+IDIpCisjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpIAkoKHB0ZV90KSB7IF9QQUdFX0ZJTEUsIChvZmYpIDw8IDIgfSkKKworI2Vsc2UKKy8qCisgKiBCaXRzIDAsIDQsIDYsIGFuZCA3IGFyZSB0YWtlbiwgc3BsaXQgdXAgMjggYml0cyBvZiBvZmZzZXQgaW50byB0aGlzIHJhbmdlOgorICovCisjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCTI4CisKKyNkZWZpbmUgcHRlX3RvX3Bnb2ZmKF9wdGUpCSgoKChfcHRlKS5wdGUgPj4gMSkgJiAweDcpIHwgXAorCQkJCSAoKChfcHRlKS5wdGUgPj4gMikgJiAweDgpIHwgXAorCQkJCSAoKChfcHRlKS5wdGUgPj4gOCkgPDwgIDQpKQorCisjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsgKCgob2ZmKSAmIDB4NykgPDwgMSkgfCBcCisJCQkJCSAgICgoKG9mZikgJiAweDgpIDw8IDIpIHwgXAorCQkJCQkgICAoKChvZmYpID4+ICA0KSA8PCA4KSB8IFwKKwkJCQkJICAgX1BBR0VfRklMRSB9KQorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyKQorI2RlZmluZSBfX3B0ZV90b19zd3BfZW50cnkocHRlKSAoKHN3cF9lbnRyeV90KSB7IChwdGUpLnB0ZV9oaWdoIH0pCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkoKHB0ZV90KSB7IDAsICh4KS52YWwgfSkKKyNlbHNlCisjZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpCSgoc3dwX2VudHJ5X3QpIHsgcHRlX3ZhbChwdGUpIH0pCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkoKHB0ZV90KSB7ICh4KS52YWwgfSkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9QR1RBQkxFXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS02NC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUtNjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZ3RhYmxlLTY0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS1iaXRzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS1iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS1iaXRzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wZ3RhYmxlLWJpdHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BndGFibGUuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRiYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9ncGlvLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLW1pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L2dwaW8uaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQGF1dGhvciBQYXRyaWNrIEdsYXNzIDxwYXRyaWNrZ2xhc3NAZ21haWwuY29tPgorICovCisKKyNpZm5kZWYgX19QTUNfTVNQNzFYWF9HUElPX0gKKyNkZWZpbmUgX19QTUNfTVNQNzFYWF9HUElPX0gKKworLyogTWF4IG51bWJlciBvZiBncGlvJ3MgaXMgMjggb24gY2hpcCBwbHVzIDMgYmFua3Mgb2YgSTJDIElPIEV4cGFuZGVycyAqLworI2RlZmluZSBBUkNIX05SX0dQSU9TICgyOCArICgzICogOCkpCisKKy8qIG5ldyBnZW5lcmljIEdQSU8gQVBJIC0gc2VlIERvY3VtZW50YXRpb24vZ3Bpby50eHQgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQorI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCisKKy8qIFNldHVwIGNhbGxzIGZvciB0aGUgZ3BpbyBhbmQgZ3BpbyBleHRlbmRlZCAqLworZXh0ZXJuIHZvaWQgbXNwNzF4eF9pbml0X2dwaW8odm9pZCk7CitleHRlcm4gdm9pZCBtc3A3MXh4X2luaXRfZ3Bpb19leHRlbmRlZCh2b2lkKTsKK2V4dGVybiBpbnQgbXNwNzF4eF9zZXRfb3V0cHV0X2RyaXZlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CisKKy8qIEN1c3RvbSBvdXRwdXQgZHJpdmUgZnVuY3Rpb25zcyAqLworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19zZXRfb3V0cHV0X2RyaXZlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gbXNwNzF4eF9zZXRfb3V0cHV0X2RyaXZlKGdwaW8sIHZhbHVlKTsKK30KKworLyogSVJRJ3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGdwaW8gbGluZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGlycSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2VuZGlmIC8qIF9fUE1DX01TUDcxWFhfR1BJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfY2ljX2ludC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfY2ljX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfY2ljX2ludC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9jaWNfaW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9pbnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfaW50LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX2ludC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9wY2kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3BjaS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9wY2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3Byb20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3Byb20uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3Byb20uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfcHJvbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfcmVnb3BzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9yZWdvcHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3JlZ29wcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9yZWdvcHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3JlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3JlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3JlZ3MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9tc3BfcmVncy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3Bfc2xwX2ludC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC9tc3Bfc2xwX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3Bfc2xwX2ludC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9zbHBfaW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BtYy1zaWVycmEvbXNwNzF4eC93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvd2FyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbWMtc2llcnJhL21zcDcxeHgvd2FyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG1vbi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Btb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wbW9uLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wbW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG9sbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BvbGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wb2xsLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wb2xsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG9zaXhfdHlwZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3Bvc2l4X3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ByZWZldGNoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJlZmV0Y2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9wcmVmZXRjaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcHJlZmV0Y2guaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZWU1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgV2FsZG9yZiBHTUJICisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDEsIDIwMDIsIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNLiBBbnRvaW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaWZuZGVmIF9BU01fUFJPQ0VTU09SX0gKKyNkZWZpbmUgX0FTTV9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KKyNpbmNsdWRlIDxhc20vY3B1LWluZm8uaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KKyAqLworI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICh7IF9fbGFiZWxfXyBfbDsgX2w6ICYmX2w7fSkKKworLyoKKyAqIFN5c3RlbSBzZXR1cCBhbmQgaGFyZHdhcmUgZmxhZ3MuLgorICovCitleHRlcm4gdm9pZCAoKmNwdV93YWl0KSh2b2lkKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2Y2VkX2NvdW50LCB2Y2VpX2NvdW50OworCisjaWZkZWYgQ09ORklHXzMyQklUCisvKgorICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDJHQi4gVGhpcyBpcyBoYXJkY29kZWQgaW50byBhIGZldyBwbGFjZXMsCisgKiBzbyBkb24ndCBjaGFuZ2UgaXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKyAqLworI2RlZmluZSBUQVNLX1NJWkUJMHg3ZmZmODAwMFVMCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKworLyoKKyAqIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KKyAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCisgKi8KKyNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCSgoVEFTS19TSVpFIC8gMykgJiB+KFBBR0VfU0laRSkpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR182NEJJVAorLyoKKyAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAxVEIuIFRoaXMgaXMgaGFyZGNvZGVkIGludG8gYSBmZXcgcGxhY2VzLAorICogc28gZG9uJ3QgY2hhbmdlIGl0IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuICBUQVNLX1NJWkUKKyAqIGlzIGxpbWl0ZWQgdG8gMVRCIGJ5IHRoZSBSNDAwMCBhcmNoaXRlY3R1cmU7IFIxMDAwMCBhbmQgYmV0dGVyIGNhbgorICogc3VwcG9ydCAxNlRCOyB0aGUgYXJjaGl0ZWN0dXJhbCByZXNlcnZlIGZvciBmdXR1cmUgZXhwYW5zaW9uIGlzCisgKiA4MTkyRUIgLi4uCisgKi8KKyNkZWZpbmUgVEFTS19TSVpFMzIJMHg3ZmZmODAwMFVMCisjZGVmaW5lIFRBU0tfU0laRQkweDEwMDAwMDAwMDAwVUwKKyNkZWZpbmUgU1RBQ0tfVE9QCVwKKyAgICAgICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKSA/IFRBU0tfU0laRTMyIDogVEFTS19TSVpFKQorCisvKgorICogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQorICogc3BhY2UgZHVyaW5nIG1tYXAncy4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJCQkJCQlcCisJKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpID8JCQkJXAorCQlQQUdFX0FMSUdOKFRBU0tfU0laRTMyIC8gMykgOiBQQUdFX0FMSUdOKFRBU0tfU0laRSAvIDMpKQorI2RlZmluZSBUQVNLX1NJWkVfT0YodHNrKQkJCQkJCVwKKwkodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfMzJCSVRfQUREUikgPyBUQVNLX1NJWkUzMiA6IFRBU0tfU0laRSkKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTVEFDS19UT1BfTUFYCVRBU0tfU0laRQorI2VuZGlmCisKKyNkZWZpbmUgTlVNX0ZQVV9SRUdTCTMyCisKK3R5cGVkZWYgX191NjQgZnB1cmVnX3Q7CisKKy8qCisgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBzb21lIG1vcmUgZmllbGRzIGZvciBlbXVsYXRvciBzdGF0aXN0aWNzLCBidXQgdGhlcmUKKyAqIGFyZSBhIG51bWJlciBvZiBmaXhlZCBvZmZzZXRzIGluIG9mZnNldC5oIGFuZCBlbHNld2hlcmUgdGhhdCB3b3VsZCBoYXZlIHRvCisgKiBiZSByZWNhbGN1bGF0ZWQgYnkgaGFuZC4gIFNvIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJpdmF0ZSB0bworICogdGhlIEZQVSBlbXVsYXRvciBmb3Igbm93LiAgU2VlIGFzbS1taXBzL2ZwdV9lbXVsYXRvci5oLgorICovCisKK3N0cnVjdCBtaXBzX2ZwdV9zdHJ1Y3QgeworCWZwdXJlZ190CWZwcltOVU1fRlBVX1JFR1NdOworCXVuc2lnbmVkIGludAlmY3IzMTsKK307CisKKyNkZWZpbmUgTlVNX0RTUF9SRUdTICAgNgorCit0eXBlZGVmIF9fdTMyIGRzcHJlZ190OworCitzdHJ1Y3QgbWlwc19kc3Bfc3RhdGUgeworCWRzcHJlZ190ICAgICAgICBkc3ByW05VTV9EU1BfUkVHU107CisJdW5zaWduZWQgaW50ICAgIGRzcGNvbnRyb2w7Cit9OworCisjZGVmaW5lIElOSVRfQ1BVTUFTSyB7IFwKKwl7MCx9IFwKK30KKworc3RydWN0IG1pcHMzMjY0X3dhdGNoX3JlZ19zdGF0ZSB7CisJLyogVGhlIHdpZHRoIG9mIHdhdGNobG8gaXMgMzIgaW4gYSAzMiBiaXQga2VybmVsIGFuZCA2NCBpbiBhCisJICAgNjQgYml0IGtlcm5lbC4gIFdlIHVzZSB1bnNpZ25lZCBsb25nIGFzIGl0IGhhcyB0aGUgc2FtZQorCSAgIHByb3BlcnR5LiAqLworCXVuc2lnbmVkIGxvbmcgd2F0Y2hsb1tOVU1fV0FUQ0hfUkVHU107CisJLyogT25seSB0aGUgbWFzayBhbmQgSVJXIGJpdHMgZnJvbSB3YXRjaGhpLiAqLworCXUxNiB3YXRjaGhpW05VTV9XQVRDSF9SRUdTXTsKK307CisKK3VuaW9uIG1pcHNfd2F0Y2hfcmVnX3N0YXRlIHsKKwlzdHJ1Y3QgbWlwczMyNjRfd2F0Y2hfcmVnX3N0YXRlIG1pcHMzMjY0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgc2VnOworfSBtbV9zZWdtZW50X3Q7CisKKyNkZWZpbmUgQVJDSF9NSU5fVEFTS0FMSUdOCTgKKworc3RydWN0IG1pcHNfYWJpOworCisvKgorICogSWYgeW91IGNoYW5nZSB0aHJlYWRfc3RydWN0IHJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgI2RlZmluZXMgYmVsb3cgdG9vIQorICovCitzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CisJLyogU2F2ZWQgbWFpbiBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAqLworCXVuc2lnbmVkIGxvbmcgcmVnMTY7CisJdW5zaWduZWQgbG9uZyByZWcxNywgcmVnMTgsIHJlZzE5LCByZWcyMCwgcmVnMjEsIHJlZzIyLCByZWcyMzsKKwl1bnNpZ25lZCBsb25nIHJlZzI5LCByZWczMCwgcmVnMzE7CisKKwkvKiBTYXZlZCBjcDAgc3R1ZmYuICovCisJdW5zaWduZWQgbG9uZyBjcDBfc3RhdHVzOworCisJLyogU2F2ZWQgZnB1L2ZwdSBlbXVsYXRvciBzdHVmZi4gKi8KKwlzdHJ1Y3QgbWlwc19mcHVfc3RydWN0IGZwdTsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9GUEFGRgorCS8qIEVtdWxhdGVkIGluc3RydWN0aW9uIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBlbXVsYXRlZF9mcDsKKwkvKiBTYXZlZCBwZXItdGhyZWFkIHNjaGVkdWxlciBhZmZpbml0eSBtYXNrICovCisJY3B1bWFza190IHVzZXJfY3B1c19hbGxvd2VkOworI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX0ZQQUZGICovCisKKwkvKiBTYXZlZCBzdGF0ZSBvZiB0aGUgRFNQIEFTRSwgaWYgYXZhaWxhYmxlLiAqLworCXN0cnVjdCBtaXBzX2RzcF9zdGF0ZSBkc3A7CisKKwkvKiBTYXZlZCB3YXRjaCByZWdpc3RlciBzdGF0ZSwgaWYgYXZhaWxhYmxlLiAqLworCXVuaW9uIG1pcHNfd2F0Y2hfcmVnX3N0YXRlIHdhdGNoOworCisJLyogT3RoZXIgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aHJlYWQuICovCisJdW5zaWduZWQgbG9uZyBjcDBfYmFkdmFkZHI7CS8qIExhc3QgdXNlciBmYXVsdCAqLworCXVuc2lnbmVkIGxvbmcgY3AwX2JhZHVhZGRyOwkvKiBMYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgVVNFRyAqLworCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKwl1bnNpZ25lZCBsb25nIHRyYXBfbm87CisJdW5zaWduZWQgbG9uZyBpcml4X3RyYW1wb2xpbmU7ICAvKiBXaGVlZS4uLiAqLworCXVuc2lnbmVkIGxvbmcgaXJpeF9vbGRjdHg7CisJc3RydWN0IG1pcHNfYWJpICphYmk7Cit9OworCisjaWZkZWYgQ09ORklHX01JUFNfTVRfRlBBRkYKKyNkZWZpbmUgRlBBRkZfSU5JVAkJCQkJCVwKKwkuZW11bGF0ZWRfZnAJCQk9IDAsCQkJXAorCS51c2VyX2NwdXNfYWxsb3dlZAkJPSBJTklUX0NQVU1BU0ssCisjZWxzZQorI2RlZmluZSBGUEFGRl9JTklUCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfRlBBRkYgKi8KKworI2RlZmluZSBJTklUX1RIUkVBRCAgewkJCQkJCVwKKyAgICAgICAgLyoJCQkJCQkJXAorICAgICAgICAgKiBTYXZlZCBtYWluIHByb2Nlc3NvciByZWdpc3RlcnMJCQlcCisgICAgICAgICAqLwkJCQkJCQlcCisJLnJlZzE2CQkJPSAwLAkJCQlcCisJLnJlZzE3CQkJPSAwLAkJCQlcCisJLnJlZzE4CQkJPSAwLAkJCQlcCisJLnJlZzE5CQkJPSAwLAkJCQlcCisJLnJlZzIwCQkJPSAwLAkJCQlcCisJLnJlZzIxCQkJPSAwLAkJCQlcCisJLnJlZzIyCQkJPSAwLAkJCQlcCisJLnJlZzIzCQkJPSAwLAkJCQlcCisJLnJlZzI5CQkJPSAwLAkJCQlcCisJLnJlZzMwCQkJPSAwLAkJCQlcCisJLnJlZzMxCQkJPSAwLAkJCQlcCisJLyoJCQkJCQkJXAorCSAqIFNhdmVkIGNwMCBzdHVmZgkJCQkJXAorCSAqLwkJCQkJCQlcCisJLmNwMF9zdGF0dXMJCT0gMCwJCQkJXAorCS8qCQkJCQkJCVwKKwkgKiBTYXZlZCBGUFUvRlBVIGVtdWxhdG9yIHN0dWZmCQkJCVwKKwkgKi8JCQkJCQkJXAorCS5mcHUJCQk9IHsJCQkJXAorCQkuZnByCQk9IHswLH0sCQkJCVwKKwkJLmZjcjMxCQk9IDAsCQkJCVwKKwl9LAkJCQkJCQlcCisJLyoJCQkJCQkJXAorCSAqIEZQVSBhZmZpbml0eSBzdGF0ZSAobnVsbCBpZiBub3QgRlBBRkYpCQlcCisJICovCQkJCQkJCVwKKwlGUEFGRl9JTklUCQkJCQkJXAorCS8qCQkJCQkJCVwKKwkgKiBTYXZlZCBEU1Agc3R1ZmYJCQkJCVwKKwkgKi8JCQkJCQkJXAorCS5kc3AJCQk9IHsJCQkJXAorCQkuZHNwcgkJPSB7MCwgfSwJCQlcCisJCS5kc3Bjb250cm9sCT0gMCwJCQkJXAorCX0sCQkJCQkJCVwKKwkvKgkJCQkJCQlcCisJICogc2F2ZWQgd2F0Y2ggcmVnaXN0ZXIgc3R1ZmYJCQkJXAorCSAqLwkJCQkJCQlcCisJLndhdGNoID0ge3t7MCx9LH0sfSwJCQkJCVwKKwkvKgkJCQkJCQlcCisJICogT3RoZXIgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzCQlcCisJICovCQkJCQkJCVwKKwkuY3AwX2JhZHZhZGRyCQk9IDAsCQkJCVwKKwkuY3AwX2JhZHVhZGRyCQk9IDAsCQkJCVwKKwkuZXJyb3JfY29kZQkJPSAwLAkJCQlcCisJLnRyYXBfbm8JCT0gMCwJCQkJXAorCS5pcml4X3RyYW1wb2xpbmUJPSAwLAkJCQlcCisJLmlyaXhfb2xkY3R4CQk9IDAsCQkJCVwKK30KKworc3RydWN0IHRhc2tfc3RydWN0OworCisvKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KKyNkZWZpbmUgcmVsZWFzZV90aHJlYWQodGhyZWFkKSBkbyB7IH0gd2hpbGUoMCkKKworLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KKyNkZWZpbmUgcHJlcGFyZV90b19jb3B5KHRzaykJZG8geyB9IHdoaWxlICgwKQorCitleHRlcm4gbG9uZyBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKworLyoKKyAqIERvIG5lY2Vzc2FyeSBzZXR1cCB0byBzdGFydCB1cCBhIG5ld2x5IGV4ZWN1dGVkIHRocmVhZC4KKyAqLworZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCk7CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKyNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSArIFRIUkVBRF9TSVpFIC0gMzIpCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKilfX0tTVEtfVE9TKHRzaykgLSAxKQorI2RlZmluZSBLU1RLX0VJUCh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX2VwYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAodGFza19wdF9yZWdzKHRzayktPnJlZ3NbMjldKQorI2RlZmluZSBLU1RLX1NUQVRVUyh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX3N0YXR1cykKKworI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKKworLyoKKyAqIFJldHVybl9hZGRyZXNzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyhjb3VudCkKKyAqIHdoaWNoIG9uIGNlcnRhaW4gYXJjaGl0ZWN0dXJlcyBjYW5ub3QgcmVhc29uYWJseSBiZSBpbXBsZW1lbnRlZCBpbiBHQ0MKKyAqIChNSVBTLCBBbHBoYSkgb3IgaXMgdW51c2VhYmxlIHdpdGggLWZvbWl0LWZyYW1lLXBvaW50ZXIgKGkzODYpLgorICogTm90ZSB0aGF0IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyh4Pj0xKSBpcyBmb3JiaWRkZW4gYmVjYXVzZSBHQ0MKKyAqIGFib3J0cyBjb21waWxhdGlvbiBvbiBzb21lIENQVXMuICBJdCdzIHNpbXBseSBub3QgcG9zc2libGUgdG8gdW53aW5kCisgKiBzb21lIENQVSdzIHN0YWNrZnJhbWVzLgorICoKKyAqIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyB3b3JrcyBvbmx5IGZvciBub24tbGVhZiBmdW5jdGlvbnMuICBXZSBhdm9pZCB0aGUKKyAqIG92ZXJoZWFkIG9mIGEgZnVuY3Rpb24gY2FsbCBieSBmb3JjaW5nIHRoZSBjb21waWxlciB0byBzYXZlIHRoZSByZXR1cm4KKyAqIGFkZHJlc3MgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLgorICovCisjZGVmaW5lIHJldHVybl9hZGRyZXNzKCkgKHtfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiIkMzEiKTtfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7fSkKKworI2lmZGVmIENPTkZJR19DUFVfSEFTX1BSRUZFVENICisKKyNkZWZpbmUgQVJDSF9IQVNfUFJFRkVUQ0gKKworc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKmFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIgkuc2V0CW1pcHM0CQlcbiIKKwkiCXByZWYJJTAsICglMSkJXG4iCisJIgkuc2V0CW1pcHMwCQlcbiIKKwk6CisJOiAiaSIgKFByZWZfTG9hZCksICJyIiAoYWRkcikpOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzIyNTcxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaWZuZGVmIF9BU01fUFRSQUNFX0gKKyNkZWZpbmUgX0FTTV9QVFJBQ0VfSAorCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFRSQUNFCisjZW5kaWYKKworLyogMCAtIDMxIGFyZSBpbnRlZ2VyIHJlZ2lzdGVycywgMzIgLSA2MyBhcmUgZnAgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgRlBSX0JBU0UJMzIKKyNkZWZpbmUgUEMJCTY0CisjZGVmaW5lIENBVVNFCQk2NQorI2RlZmluZSBCQURWQUREUgk2NgorI2RlZmluZSBNTUhJCQk2NworI2RlZmluZSBNTUxPCQk2OAorI2RlZmluZSBGUENfQ1NSCQk2OQorI2RlZmluZSBGUENfRUlSCQk3MAorI2RlZmluZSBEU1BfQkFTRQk3MQkJLyogMyBtb3JlIGhpIC8gbG8gcmVnaXN0ZXIgcGFpcnMgKi8KKyNkZWZpbmUgRFNQX0NPTlRST0wJNzcKKyNkZWZpbmUgQUNYCQk3OAorCisvKgorICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sgZHVyaW5nIGEKKyAqIHN5c3RlbSBjYWxsL2V4Y2VwdGlvbi4gQXMgdXN1YWwgdGhlIHJlZ2lzdGVycyBrMC9rMSBhcmVuJ3QgYmVpbmcgc2F2ZWQuCisgKi8KK3N0cnVjdCBwdF9yZWdzIHsKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwkvKiBQYWQgYnl0ZXMgZm9yIGFyZ3VtZW50IHNhdmUgc3BhY2Ugb24gdGhlIHN0YWNrLiAqLworCXVuc2lnbmVkIGxvbmcgcGFkMFs2XTsKKyNlbmRpZgorCisJLyogU2F2ZWQgbWFpbiBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAqLworCXVuc2lnbmVkIGxvbmcgcmVnc1szMl07CisKKwkvKiBTYXZlZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KKwl1bnNpZ25lZCBsb25nIGNwMF9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBoaTsKKwl1bnNpZ25lZCBsb25nIGxvOworI2lmZGVmIENPTkZJR19DUFVfSEFTX1NNQVJUTUlQUworCXVuc2lnbmVkIGxvbmcgYWN4OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBjcDBfYmFkdmFkZHI7CisJdW5zaWduZWQgbG9uZyBjcDBfY2F1c2U7CisJdW5zaWduZWQgbG9uZyBjcDBfZXBjOworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwl1bnNpZ25lZCBsb25nIGNwMF90Y3N0YXR1czsKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOworCisvKiBBcmJpdHJhcmlseSBjaG9vc2UgdGhlIHNhbWUgcHRyYWNlIG51bWJlcnMgYXMgdXNlZCBieSB0aGUgU3BhcmMgY29kZS4gKi8KKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MJCTEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTCQkxMworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTCQkxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTCQkxNQorLyogI2RlZmluZSBQVFJBQ0VfR0VURlBYUkVHUwkJMTggKi8KKy8qICNkZWZpbmUgUFRSQUNFX1NFVEZQWFJFR1MJCTE5ICovCisKKyNkZWZpbmUgUFRSQUNFX09MRFNFVE9QVElPTlMJMjEKKworI2RlZmluZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCTI1CisjZGVmaW5lIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEJMjYKKworLyogQ2FsbHMgdG8gdHJhY2UgYSA2NGJpdCBwcm9ncmFtIGZyb20gYSAzMmJpdCBwcm9ncmFtLiAgKi8KKyNkZWZpbmUgUFRSQUNFX1BFRUtURVhUXzMyNjQJMHhjMAorI2RlZmluZSBQVFJBQ0VfUEVFS0RBVEFfMzI2NAkweGMxCisjZGVmaW5lIFBUUkFDRV9QT0tFVEVYVF8zMjY0CTB4YzIKKyNkZWZpbmUgUFRSQUNFX1BPS0VEQVRBXzMyNjQJMHhjMworI2RlZmluZSBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBXzMyNjQJMHhjNAorCisvKiBSZWFkIGFuZCB3cml0ZSB3YXRjaHBvaW50IHJlZ2lzdGVycy4gICovCitlbnVtIHB0X3dhdGNoX3N0eWxlIHsKKwlwdF93YXRjaF9zdHlsZV9taXBzMzIsCisJcHRfd2F0Y2hfc3R5bGVfbWlwczY0Cit9Oworc3RydWN0IG1pcHMzMl93YXRjaF9yZWdzIHsKKwl1aW50MzJfdCB3YXRjaGxvWzhdOworCS8qIExvd2VyIDE2IGJpdHMgb2Ygd2F0Y2hoaS4gKi8KKwl1aW50MTZfdCB3YXRjaGhpWzhdOworCS8qIFZhbGlkIG1hc2sgYW5kIEkgUiBXIGJpdHMuCisJICogYml0IDAgLS0gMSBpZiBXIGJpdCBpcyB1c2FibGUuCisJICogYml0IDEgLS0gMSBpZiBSIGJpdCBpcyB1c2FibGUuCisJICogYml0IDIgLS0gMSBpZiBJIGJpdCBpcyB1c2FibGUuCisJICogYml0cyAzIC0gMTEgLS0gVmFsaWQgd2F0Y2hoaSBtYXNrIGJpdHMuCisJICovCisJdWludDE2X3Qgd2F0Y2hfbWFza3NbOF07CisJLyogVGhlIG51bWJlciBvZiB2YWxpZCB3YXRjaCByZWdpc3RlciBwYWlycy4gICovCisJdWludDMyX3QgbnVtX3ZhbGlkOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CisKK3N0cnVjdCBtaXBzNjRfd2F0Y2hfcmVncyB7CisJdWludDY0X3Qgd2F0Y2hsb1s4XTsKKwl1aW50MTZfdCB3YXRjaGhpWzhdOworCXVpbnQxNl90IHdhdGNoX21hc2tzWzhdOworCXVpbnQzMl90IG51bV92YWxpZDsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCitzdHJ1Y3QgcHRfd2F0Y2hfcmVncyB7CisJZW51bSBwdF93YXRjaF9zdHlsZSBzdHlsZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBtaXBzMzJfd2F0Y2hfcmVncyBtaXBzMzI7CisJCXN0cnVjdCBtaXBzMzJfd2F0Y2hfcmVncyBtaXBzNjQ7CisJfTsKK307CisKKyNkZWZpbmUgUFRSQUNFX0dFVF9XQVRDSF9SRUdTCTB4ZDAKKyNkZWZpbmUgUFRSQUNFX1NFVF9XQVRDSF9SRUdTCTB4ZDEKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9pc2FkZXAuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCitleHRlcm4gaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fczY0IF9fdXNlciAqZGF0YSk7CitleHRlcm4gaW50IHB0cmFjZV9zZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fczY0IF9fdXNlciAqZGF0YSk7CisKK2V4dGVybiBpbnQgcHRyYWNlX2dldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBfX3UzMiBfX3VzZXIgKmRhdGEpOworZXh0ZXJuIGludCBwdHJhY2Vfc2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fdTMyIF9fdXNlciAqZGF0YSk7CisKK2V4dGVybiBpbnQgcHRyYWNlX2dldF93YXRjaF9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJc3RydWN0IHB0X3dhdGNoX3JlZ3MgX191c2VyICphZGRyKTsKK2V4dGVybiBpbnQgcHRyYWNlX3NldF93YXRjaF9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJc3RydWN0IHB0X3dhdGNoX3JlZ3MgX191c2VyICphZGRyKTsKKworLyoKKyAqIERvZXMgdGhlIHByb2Nlc3MgYWNjb3VudCBmb3IgdXNlciBvciBmb3Igc3lzdGVtIHRpbWU/CisgKi8KKyNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5jcDBfc3RhdHVzICYgS1VfTUFTSykgPT0gS1VfVVNFUikKKworI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPmNwMF9lcGMpCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQorCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGRvX3N5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlbnRyeWV4aXQpOworCitleHRlcm4gTk9SRVRfVFlQRSB2b2lkIGRpZShjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBwdF9yZWdzICopIEFUVFJJQl9OT1JFVDsKKworc3RhdGljIGlubGluZSB2b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAodW5saWtlbHkoIXVzZXJfbW9kZShyZWdzKSkpCisJCWRpZShzdHIsIHJlZ3MpOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcjRrLXRpbWVyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcjRrLXRpbWVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcjRrLXRpbWVyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9yNGstdGltZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9yNGtjYWNoZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3I0a2NhY2hlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcjRrY2FjaGUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3I0a2NhY2hlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcmVib290LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcmVib290LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvcmVib290LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZWJvb3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9yZWcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9yZWcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3JlZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3JlZ2RlZi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3JlZ2RlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3JlZ2RlZi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcmVnZGVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcmVzb3VyY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3Jlc291cmNlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3JtOWstb2NkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcm05ay1vY2QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9ybTlrLW9jZC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vcm05ay1vY2QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9ydGx4LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcnRseC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3J0bHguaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3J0bHguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zY2F0dGVybGlzdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2NhdHRlcmxpc3QuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2VjY29tcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NlY2NvbXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZWNjb21wLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZWNjb21wLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2VjdGlvbnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NlY3Rpb25zLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NlZ21lbnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZWdtZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2VnbWVudC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2VnbWVudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NlbWJ1Zi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NlbWJ1Zi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2VtYnVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2VyaWFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZXJpYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZXR1cC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NldHVwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2V0dXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NldHVwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2dpby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NnaS9naW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZ2kvZ2lvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvZ2lvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2hwYzMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvaHBjMy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NnaS9ocGMzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvaHBjMy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9pb2MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvaW9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2dpL2lvYy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL2lvYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9pcDIyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL2lwMjIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZ2kvaXAyMi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL2lwMjIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvbWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NnaS9tYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9waTEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvcGkxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2dpL3BpMS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL3BpMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9zZWVxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL3NlZXEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZ2kvc2VlcS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL3NlZXEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvc2dpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpL3NnaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NnaS9zZ2kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NnaS9zZ2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvd2QuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2kvd2QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zZ2kvd2QuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NnaS93ZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaWFsaWIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2lhbGliLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2dpYWxpYi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpYWxpYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaWFyY3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2lhcmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2dpYXJjcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpYXJjcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaWRlZnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zZ2lkZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2dpZGVmcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2dpZGVmcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NobWJ1Zi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NobWJ1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NobWJ1Zi5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2htYnVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2htcGFyYW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NobXBhcmFtLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX2ludC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9iY20xNDgwX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX2ludC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL2JjbTE0ODBfaW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbDJjLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL2JjbTE0ODBfbDJjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbDJjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvYmNtMTQ4MF9sMmMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9tYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9iY20xNDgwX21jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbWMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9iY20xNDgwX21jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfc2NkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL2JjbTE0ODBfc2NkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfc2NkLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvYmNtMTQ4MF9zY2QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmlnc3VyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL2JpZ3N1ci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iaWdzdXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9iaWdzdXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYm9hcmQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvYm9hcmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYm9hcmQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9ib2FyZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvY2FybWVsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL2Nhcm1lbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZGVmcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZGVmcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9kZWZzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9kbWEuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX2RtYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZG1hLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX2RtYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZ2VuYnVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9nZW5idXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2dlbmJ1cy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9nZW5idXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2ludC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfaW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9pbnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfaW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9sMmMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX2wyYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbDJjLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX2wyYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbGR0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9sZHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2xkdC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9sZHQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21hYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfbWFjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfbWFjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfbWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21jLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX21jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9yZWdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX3JlZ3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zbWJ1cy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfc21idXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NtYnVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX3NtYnVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zeW5jc2VyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NiMTI1MF9zeW5jc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zeW5jc2VyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX3N5bmNzZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc2IxMjUwX3VhcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zYjEyNTBfdWFydC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zZW50b3NhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NlbnRvc2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2VudG9zYS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lieXRlL3NlbnRvc2EuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc3dhcm0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWJ5dGUvc3dhcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc3dhcm0uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpYnl0ZS9zd2FybS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpZ2NvbnRleHQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lnY29udGV4dC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpZ2luZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2lnaW5mby5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lnaW5mby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpZ25hbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NpZ25hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NpZ25hbC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2ltLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc2ltLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc2ltLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zaW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbXAtb3BzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLW9wcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NtcC1vcHMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC1vcHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbXAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc210Yy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTYwYmYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGMuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9BU01fU01UQ19NVF9ICisjZGVmaW5lIF9BU01fU01UQ19NVF9ICisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgU01UQyBtdWx0aXRhc2tpbmcgb24gTUlQUyBNVCBjb3JlcworICovCisKKyNpbmNsdWRlIDxhc20vbWlwc19tdC5oPgorI2luY2x1ZGUgPGFzbS9zbXRjX2lwaS5oPgorCisvKgorICogU3lzdGVtLXdpZGUgU01UQyBzdGF0dXMgaW5mb3JtYXRpb24KKyAqLworCitleHRlcm4gdW5zaWduZWQgaW50IHNtdGNfc3RhdHVzOworCisjZGVmaW5lIFNNVENfVExCX1NIQVJFRAkweDAwMDAwMDAxCisjZGVmaW5lIFNNVENfTVRDX0FDVElWRQkweDAwMDAwMDAyCisKKy8qCisgKiBUTEIvQVNJRCBNYW5hZ2VtZW50IGluZm9ybWF0aW9uCisgKi8KKworI2RlZmluZSBNQVhfU01UQ19UTEJTIDIKKyNkZWZpbmUgTUFYX1NNVENfQVNJRFMgMjU2CisjaWYgTlJfQ1BVUyA8PSA4Cit0eXBlZGVmIGNoYXIgYXNpZHVzZTsKKyNlbHNlCisjaWYgTlJfQ1BVUyA8PSAxNgordHlwZWRlZiBzaG9ydCBhc2lkdXNlOworI2Vsc2UKK3R5cGVkZWYgbG9uZyBhc2lkdXNlOworI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIGFzaWR1c2Ugc210Y19saXZlX2FzaWRbTUFYX1NNVENfVExCU11bTUFYX1NNVENfQVNJRFNdOworCitzdHJ1Y3QgbW1fc3RydWN0Oworc3RydWN0IHRhc2tfc3RydWN0OworCit2b2lkIHNtdGNfZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBjcHUpOwordm9pZCBzZWxmX2lwaShzdHJ1Y3Qgc210Y19pcGkgKik7Cit2b2lkIHNtdGNfZmx1c2hfdGxiX2FzaWQodW5zaWduZWQgbG9uZyBhc2lkKTsKK2V4dGVybiBpbnQgc210Y19idWlsZF9jcHVfbWFwKGludCBzdGFydHNsb3QpOworZXh0ZXJuIHZvaWQgc210Y19wcmVwYXJlX2NwdXMoaW50IGNwdXMpOworZXh0ZXJuIHZvaWQgc210Y19zbXBfZmluaXNoKHZvaWQpOworZXh0ZXJuIHZvaWQgc210Y19ib290X3NlY29uZGFyeShpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOworZXh0ZXJuIHZvaWQgc210Y19jcHVzX2RvbmUodm9pZCk7CisKKworLyoKKyAqIFNoYXJpbmcgdGhlIFRMQiBiZXR3ZWVuIG11bHRpcGxlIFZQRXMgbWVhbnMgdGhhdCB0aGUKKyAqICJyYW5kb20iIGluZGV4IHNlbGVjdGlvbiBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCB0bworICogc2VsZWN0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBJbmRleCByZWdpc3Rlci4gVG8KKyAqIGF2b2lkIGFkZGl0aW9uYWwgVExCIHByZXNzdXJlLCB0aGUgSW5kZXggcmVnaXN0ZXJzCisgKiBhcmUgInBhcmtlZCIgd2l0aCBhbiBub24tVmFsaWQgdmFsdWUuCisgKi8KKworI2RlZmluZSBQQVJLRURfSU5ERVgJKCh1bnNpZ25lZCBpbnQpMHg4MDAwMDAwMCkKKworLyoKKyAqIERlZmluZSBsb3ctbGV2ZWwgaW50ZXJydXB0IG1hc2sgZm9yIElQSXMsIGlmIG5lY2Vzc2FyeS4KKyAqIEJ5IGRlZmF1bHQsIHVzZSBTVyBpbnRlcnJ1cHQgMSwgd2hpY2ggcmVxdWlyZXMgbm8gZXh0ZXJuYWwKKyAqIGhhcmR3YXJlIHN1cHBvcnQsIGJ1dCB3aGljaCB3b3JrcyBvbmx5IGZvciBzaW5nbGUtY29yZQorICogTUlQUyBNVCBzeXN0ZW1zLgorICovCisjaWZuZGVmIE1JUFNfQ1BVX0lQSV9JUlEKKyNkZWZpbmUgTUlQU19DUFVfSVBJX0lSUSAxCisjZW5kaWYKKworI2VuZGlmIC8qICBfQVNNX1NNVENfTVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbXRjX2lwaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGNfaXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc210Y19pcGkuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdGNfaXBpLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc210Y19wcm9jLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc210Y19wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc210Y19wcm9jLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXRjX3Byb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbXZwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc212cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NtdnAuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtdnAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9hZGRycy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2FkZHJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vYWRkcnMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2FkZHJzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vYWdlbnQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9hZ2VudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL2FnZW50LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9hZ2VudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2FyY2guaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9hcmNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vYXJjaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vYXJjaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2ZydS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2ZydS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL2ZydS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vZnJ1LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vZ2RhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vZ2RhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vZ2RhLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9nZGEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9odWIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9odWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbi9odWIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2h1Yi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2ludHIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9pbnRyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vaW50ci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vaW50ci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2lvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbi9pby5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vaW8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9pb2MzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vaW9jMy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL2lvYzMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2lvYzMuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2tsY29uZmlnLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24va2xjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU1OTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2tsY29uZmlnLmgKQEAgLTAsMCArMSw4OTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBEZXJpdmVkIGZyb20gSVJJWCA8c3lzL1NOL2tsY29uZmlnLmg+LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIGJ5IFJhbGYgQmFlY2hsZQorICovCisjaWZuZGVmCV9BU01fU05fS0xDT05GSUdfSAorI2RlZmluZQlfQVNNX1NOX0tMQ09ORklHX0gKKworLyoKKyAqIFRoZSBLTENPTkZJRyBzdHJ1Y3R1cmVzIHN0b3JlIGluZm8gYWJvdXQgdGhlIHZhcmlvdXMgQk9BUkRzIGZvdW5kCisgKiBkdXJpbmcgSGFyZHdhcmUgRGlzY292ZXJ5LiBJbiBhZGRpdGlvbiwgaXQgc3RvcmVzIGluZm8gYWJvdXQgdGhlCisgKiBjb21wb25lbnRzIGZvdW5kIG9uIHRoZSBCT0FSRHMuCisgKi8KKworLyoKKyAqIFdBUk5JTkc6CisgKglDZXJ0YWluIGFzc2VtYmx5IGxhbmd1YWdlIHJvdXRpbmVzIChub3RhYmx5IHh4eHh4LnMpIGluIHRoZSBJUDI3UFJPTQorICoJd2lsbCBkZXBlbmQgb24gdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZS4gIEluCisgKiAgICAgIG1vc3QgY2FzZXMsIHJlYXJyYW5naW5nIHRoZSBmaWVsZHMgY2FuIHNlcmlvdXNseSBicmVhayB0aGluZ3MuCisgKiAgICAgIEFkZGluZyBmaWVsZHMgaW4gdGhlIGJlZ2lubmluZyBvciBtaWRkbGUgY2FuIGFsc28gYnJlYWsgdGhpbmdzLgorICogICAgICBBZGQgZmllbGRzIGlmIG5lY2Vzc2FyeSwgdG8gdGhlIGVuZCBvZiBhIHN0cnVjdCBpbiBzdWNoIGEgd2F5CisgKiAgICAgIHRoYXQgb2Zmc2V0cyBvZiBleGlzdGluZyBmaWVsZHMgZG8gbm90IGNoYW5nZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NHSV9JUDI3KQorCisjaW5jbHVkZSA8YXNtL3NuL3NuMC9hZGRycy5oPgorLy8jaW5jbHVkZSA8c3lzL1NOL3JvdXRlci5oPgorLy8gWFhYIFN0b2xlbiBmcm9tIDxzeXMvU04vcm91dGVyLmg+OgorI2RlZmluZSBNQVhfUk9VVEVSX1BPUlRTICg2KSAgICAvKiBNYXguIG51bWJlciBvZiBwb3J0cyBvbiBhIHJvdXRlciAqLworI2luY2x1ZGUgPGFzbS9zbi9mcnUuaD4KKy8vI2luY2x1ZGUgPHN5cy9ncmFwaC5oPgorLy8jaW5jbHVkZSA8c3lzL3h0YWxrL3hib3cuaD4KKworI2VsaWYgZGVmaW5lZChDT05GSUdfU0dJX0lQMzUpCisKKyNpbmNsdWRlIDxhc20vc24vc24xL2FkZHJzLmg+CisjaW5jbHVkZSA8c3lzL3NuL3JvdXRlci5oPgorI2luY2x1ZGUgPHN5cy9ncmFwaC5oPgorI2luY2x1ZGUgPGFzbS94dGFsay94Ym93Lmg+CisKKyNlbmRpZiAvKiAhQ09ORklHX1NHSV9JUDI3ICYmICFDT05GSUdfU0dJX0lQMzUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NHSV9JUDI3KSB8fCBkZWZpbmVkKENPTkZJR19TR0lfSVAzNSkKKyNpbmNsdWRlIDxhc20vc24vYWdlbnQuaD4KKyNpbmNsdWRlIDxhc20vZncvYXJjL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2Z3L2FyYy9oaW52Lmg+CisjaWYgZGVmaW5lZChDT05GSUdfU0dJX0lQMzUpCisvLyBUaGUgaGFjayBmaWxlIGhhcyB0byBiZSBiZWZvcmUgdmVjdG9yIGFuZCBhZnRlciBzbjBfZnJ1Li4uLgorI2luY2x1ZGUgPGFzbS9oYWNrLmg+CisjaW5jbHVkZSA8YXNtL3NuL3ZlY3Rvci5oPgorI2luY2x1ZGUgPGFzbS94dGFsay94dGFsay5oPgorI2VuZGlmIC8qIENPTkZJR19TR0lfSVAzNSAqLworI2VuZGlmIC8qIENPTkZJR19TR0lfSVAyNyB8fCBDT05GSUdfU0dJX0lQMzUgKi8KKwordHlwZWRlZiB1NjQgIG5pY190OworCisjZGVmaW5lIEtMQ0ZHSU5GT19NQUdJQwkweGJlZWRiYWJlCisKK3R5cGVkZWYgczMyIGtsY29uZl9vZmZfdDsKKworLyoKKyAqIFNvbWUgSU1QT1JUQU5UIE9GRlNFVFMuIFRoZXNlIGFyZSB0aGUgb2Zmc2V0cyBvbiBhbGwgTk9ERVMuCisgKi8KKyNkZWZpbmUJTUFYX01PRFVMRV9JRAkJMjU1CisjZGVmaW5lIFNJWkVfUEFECQk0MDk2IC8qIDRrIHBhZGRpbmcgZm9yIHN0cnVjdHVyZXMgKi8KKy8qCisgKiAxIE5PREUgYnJkLCAyIFJvdXRlciBicmQgKDEgOHAsIDEgbWV0YSksIDYgV2lkZ2V0cywKKyAqIDIgTWlkcGxhbmVzIGFzc3VtaW5nIG5vIHBjaSBjYXJkIGNhZ2VzCisgKi8KKyNkZWZpbmUgTUFYX1NMT1RTX1BFUl9OT0RFCSgxICsgMiArIDYgKyAyKQorCisvKiBYWFggaWYgZWFjaCBub2RlIGlzIGd1cmFudGVlZCB0byBoYXZlIHNvbWUgbWVtb3J5ICovCisKKyNkZWZpbmUgTUFYX1BDSV9ERVZTCQk4CisKKy8qIGxib2FyZF90LT5icmRfZmxhZ3MgZmllbGRzICovCisvKiBBbGwgYml0cyBpbiB0aGlzIGZpZWxkIGFyZSBjdXJyZW50bHkgdXNlZC4gVHJ5IHRoZSBwYWQgZmllbGRzIGlmCisgICB5b3UgbmVlZCBtb3JlIGZsYWcgYml0cyAqLworCisjZGVmaW5lIEVOQUJMRV9CT0FSRCAJCTB4MDEKKyNkZWZpbmUgRkFJTEVEX0JPQVJEICAJCTB4MDIKKyNkZWZpbmUgRFVQTElDQVRFX0JPQVJEIAkweDA0ICAgIC8qIEJvYXJkcyBsaWtlIG1pZHBsYW5lcy9yb3V0ZXJzIHdoaWNoCisJCQkJCSAgIGFyZSBkaXNjb3ZlcmVkIHR3aWNlLiBVc2Ugb25lIG9mIHRoZW0gKi8KKyNkZWZpbmUgVklTSVRFRF9CT0FSRAkJMHgwOAkvKiBVc2VkIGZvciBjb21wYWN0IGh1YiBudW1iZXJpbmcuICovCisjZGVmaW5lIExPQ0FMX01BU1RFUl9JTzYJMHgxMCAJLyogbWFzdGVyIGlvNiBmb3IgdGhhdCBub2RlICovCisjZGVmaW5lIEdMT0JBTF9NQVNURVJfSU82CTB4MjAKKyNkZWZpbmUgVEhJUkRfTklDX1BSRVNFTlQgCTB4NDAgIAkvKiBmb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBTRUNPTkRfTklDX1BSRVNFTlQgCTB4ODAgCS8qIGFkZG9ucyBsaWtlIE1JTyBhcmUgcHJlc2VudCAqLworCisvKiBrbGluZm8tPmZsYWdzIGZpZWxkcyAqLworCisjZGVmaW5lIEtMSU5GT19FTkFCTEUgCQkweDAxICAgIC8qIFRoaXMgY29tcG9uZW50IGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgS0xJTkZPX0ZBSUxFRCAgIAkweDAyIAkvKiBUaGlzIGNvbXBvbmVudCBmYWlsZWQgKi8KKyNkZWZpbmUgS0xJTkZPX0RFVklDRSAgIAkweDA0IAkvKiBUaGlzIGNvbXBvbmVudCBpcyBhIGRldmljZSAqLworI2RlZmluZSBLTElORk9fVklTSVRFRCAgCTB4MDggCS8qIFRoaXMgY29tcG9uZW50IGhhcyBiZWVuIHZpc2l0ZWQgKi8KKyNkZWZpbmUgS0xJTkZPX0NPTlRST0xMRVIgICAJMHgxMCAJLyogVGhpcyBjb21wb25lbnQgaXMgYSBkZXZpY2UgY29udHJvbGxlciAqLworI2RlZmluZSBLTElORk9fSU5TVEFMTCAgIAkweDIwICAJLyogSW5zdGFsbCBhIGRyaXZlciAqLworI2RlZmluZQlLTElORk9fSEVBRExFU1MJCTB4NDAJLyogSGVhZGxlc3MgKG9yIGh1Ymxlc3MpIGNvbXBvbmVudCAqLworI2RlZmluZSBJU19DT05TT0xFX0lPQzMoaSkJKCgoKGtsaW5mb190ICopaSktPmZsYWdzKSAmIEtMSU5GT19JTlNUQUxMKQorCisjZGVmaW5lIEdCMgkJMHg4MDAwMDAwMAorCisjZGVmaW5lIE1BWF9SU1ZfUFRSUwkzMgorCisvKiBTdHJ1Y3R1cmVzIHRvIG1hbmFnZSB2YXJpb3VzIGRhdGEgc3RvcmFnZSBhcmVhcyAqLworLyogVGhlIG51bWJlcnMgbXVzdCBiZSBjb250aWd1b3VzIHNpbmNlIHRoZSBhcnJheSBpbmRleCBpCisgICBpcyB1c2VkIGluIHRoZSBjb2RlIHRvIGFsbG9jYXRlIHZhcmlvdXMgYXJlYXMuCisqLworCisjZGVmaW5lIEJPQVJEX1NUUlVDVCAJCTAKKyNkZWZpbmUgQ09NUE9ORU5UX1NUUlVDVCAJMQorI2RlZmluZSBFUlJJTkZPX1NUUlVDVCAJCTIKKyNkZWZpbmUgS0xNQUxMT0NfVFlQRV9NQVggCShFUlJJTkZPX1NUUlVDVCArIDEpCisjZGVmaW5lIERFVklDRV9TVFJVQ1QgCQkzCisKKwordHlwZWRlZiBzdHJ1Y3QgY29uc29sZV9zIHsKKwl1bnNpZ25lZCBsb25nIAl1YXJ0X2Jhc2U7CisJdW5zaWduZWQgbG9uZyAJY29uZmlnX2Jhc2U7CisJdW5zaWduZWQgbG9uZyAJbWVtb3J5X2Jhc2U7CisJc2hvcnQJCWJhdWQ7CisJc2hvcnQJCWZsYWc7CisJaW50CQl0eXBlOworCW5hc2lkX3QJCW5hc2lkOworCWNoYXIJCXdpZDsKKwljaGFyIAkJbnBjaTsKKwluaWNfdAkJYmFzZWlvX25pYzsKK30gY29uc29sZV90OworCit0eXBlZGVmIHN0cnVjdCBrbGNfbWFsbG9jX2hkciB7CisgICAgICAgIGtsY29uZl9vZmZfdCBrbV9iYXNlOworICAgICAgICBrbGNvbmZfb2ZmX3Qga21fbGltaXQ7CisgICAgICAgIGtsY29uZl9vZmZfdCBrbV9jdXJyZW50OworfSBrbGNfbWFsbG9jX2hkcl90OworCisvKiBGdW5jdGlvbnMvbWFjcm9zIG5lZWRlZCB0byB1c2UgdGhpcyBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3Qga2xfY29uZmlnX2hkciB7CisJdTY0CQljaF9tYWdpYzsJLyogc2V0IHRoaXMgdG8gS0xDRkdJTkZPX01BR0lDICovCisJdTMyCQljaF92ZXJzaW9uOyAgICAvKiBzdHJ1Y3R1cmUgdmVyc2lvbiBudW1iZXIgKi8KKwlrbGNvbmZfb2ZmX3QJY2hfbWFsbG9jX2hkcl9vZmY7IC8qIG9mZnNldCBvZiBjaF9tYWxsb2NfaGRyICovCisJa2xjb25mX29mZl90CWNoX2NvbnNfb2ZmOyAgICAgICAvKiBvZmZzZXQgb2YgY2hfY29ucyAqLworCWtsY29uZl9vZmZfdAljaF9ib2FyZF9pbmZvOwkvKiB0aGUgbGluayBsaXN0IG9mIGJvYXJkcyAqLworCWNvbnNvbGVfdAljaF9jb25zX2luZm87CS8qIGFkZHJlc3MgaW5mbyBvZiB0aGUgY29uc29sZSAqLworCWtsY19tYWxsb2NfaGRyX3QgY2hfbWFsbG9jX2hkcltLTE1BTExPQ19UWVBFX01BWF07CisJY29uZmlkZW5jZV90CWNoX3N3X2JlbGllZjsJLyogY29uZmlkZW5jZSB0aGF0IHNvZnR3YXJlIGlzIGJhZCovCisJY29uZmlkZW5jZV90CWNoX3NuMG5ldF9iZWxpZWY7IC8qIGNvbmZpZGVuY2UgdGhhdCBzbjBuZXQgaXMgYmFkICovCit9IGtsX2NvbmZpZ19oZHJfdDsKKworCisjZGVmaW5lIEtMX0NPTkZJR19IRFIoX25hc2lkKSAJKChrbF9jb25maWdfaGRyX3QgKikoS0xDT05GSUdfQUREUihfbmFzaWQpKSkKKyNkZWZpbmUgS0xfQ09ORklHX0lORk9fT0ZGU0VUKF9uYXNpZCkJCQkJCVwKKyAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbykKKyNkZWZpbmUgS0xfQ09ORklHX0lORk9fU0VUX09GRlNFVChfbmFzaWQsIF9vZmYpCQkJCVwKKyAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbyA9IChfb2ZmKSkKKworI2RlZmluZSBLTF9DT05GSUdfSU5GTyhfbmFzaWQpIAkJCQkJCVwKKyAgICAgICAgKGxib2FyZF90ICopKChLTF9DT05GSUdfSERSKF9uYXNpZCktPmNoX2JvYXJkX2luZm8pID8JCVwKKwkgTk9ERV9PRkZTRVRfVE9fSzEoKF9uYXNpZCksIEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbykgOiBcCisJIDApCisjZGVmaW5lIEtMX0NPTkZJR19NQUdJQyhfbmFzaWQpCQkoS0xfQ09ORklHX0hEUihfbmFzaWQpLT5jaF9tYWdpYykKKworI2RlZmluZSBLTF9DT05GSUdfQ0hFQ0tfTUFHSUMoX25hc2lkKQkJCQkJXAorICAgICAgICAoS0xfQ09ORklHX0hEUihfbmFzaWQpLT5jaF9tYWdpYyA9PSBLTENGR0lORk9fTUFHSUMpCisKKyNkZWZpbmUgS0xfQ09ORklHX0hEUl9JTklUX01BR0lDKF9uYXNpZCkJXAorICAgICAgICAgICAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfbWFnaWMgPSBLTENGR0lORk9fTUFHSUMpCisKKy8qIC0tLSBOZXcgTWFjcm9zIGZvciB0aGUgY2hhbmdlZCBrbF9jb25maWdfaGRyX3Qgc3RydWN0dXJlIC0tLSAqLworCisjZGVmaW5lIFBUUl9DSF9NQUxMT0NfSERSKF9rKSAgICgoa2xjX21hbGxvY19oZHJfdCAqKVwKKwkJCSgodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfbWFsbG9jX2hkcl9vZmYpKSkKKworI2RlZmluZSBLTF9DT05GSUdfQ0hfTUFMTE9DX0hEUihfbikgICBQVFJfQ0hfTUFMTE9DX0hEUihLTF9DT05GSUdfSERSKF9uKSkKKworI2RlZmluZSBQVFJfQ0hfQ09OU19JTkZPKF9rKQkoKGNvbnNvbGVfdCAqKVwKKwkJCSgodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfY29uc19vZmYpKSkKKworI2RlZmluZSBLTF9DT05GSUdfQ0hfQ09OU19JTkZPKF9uKSAgIFBUUl9DSF9DT05TX0lORk8oS0xfQ09ORklHX0hEUihfbikpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTF9DT05GSUdfSU5GT19TVEFSVChfbmFzaWQpCVwKKyAgICAgICAgKGtsY29uZl9vZmZfdCkoS0xDT05GSUdfT0ZGU0VUKF9uYXNpZCkgKyBzaXplb2Yoa2xfY29uZmlnX2hkcl90KSkKKworI2RlZmluZSBLTF9DT05GSUdfQk9BUkRfTkFTSUQoX2JyZCkJKChfYnJkKS0+YnJkX25hc2lkKQorI2RlZmluZSBLTF9DT05GSUdfQk9BUkRfU0VUX05FWFQoX2JyZCwgX29mZikJKChfYnJkKS0+YnJkX25leHQgPSAoX29mZikpCisKKyNkZWZpbmUgS0xfQ09ORklHX0RVUExJQ0FURV9CT0FSRChfYnJkKQkoKF9icmQpLT5icmRfZmxhZ3MgJiBEVVBMSUNBVEVfQk9BUkQpCisKKyNkZWZpbmUgWEJPV19QT1JUX1RZUEVfSFVCKF94Ym93cCwgX2xpbmspIAlcCisgICAgICAgICAgICAgICAoKF94Ym93cCktPnhib3dfcG9ydF9pbmZvWyhfbGluaykgLSBCQVNFX1hCT1dfUE9SVF0ucG9ydF9mbGFnICYgWEJPV19QT1JUX0hVQikKKyNkZWZpbmUgWEJPV19QT1JUX1RZUEVfSU8oX3hib3dwLCBfbGluaykgCVwKKyAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X2ZsYWcgJiBYQk9XX1BPUlRfSU8pCisKKyNkZWZpbmUgWEJPV19QT1JUX0lTX0VOQUJMRUQoX3hib3dwLCBfbGluaykgCVwKKyAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X2ZsYWcgJiBYQk9XX1BPUlRfRU5BQkxFKQorI2RlZmluZSBYQk9XX1BPUlRfTkFTSUQoX3hib3dwLCBfbGluaykgCVwKKyAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X25hc2lkKQorCisjZGVmaW5lIFhCT1dfUE9SVF9JTyAgICAgMHgxCisjZGVmaW5lIFhCT1dfUE9SVF9IVUIgICAgMHgyCisjZGVmaW5lIFhCT1dfUE9SVF9FTkFCTEUgMHg0CisKKyNkZWZpbmUJU04wX1BPUlRfRkVOQ0VfU0hGVAkwCisjZGVmaW5lCVNOMF9QT1JUX0ZFTkNFX01BU0sJKDEgPDwgU04wX1BPUlRfRkVOQ0VfU0hGVCkKKworLyoKKyAqIFRoZSBLTENPTkZJRyBhcmVhIGlzIG9yZ2FuaXplZCBhcyBhIExJTktFRCBMSVNUIG9mIEJPQVJEcy4gQSBCT0FSRAorICogY2FuIGJlIGVpdGhlciAnTE9DQUwnIG9yICdSRU1PVEUnLiBMT0NBTCBtZWFucyBpdCBpcyBhdHRhY2hlZCB0bworICogdGhlIExPQ0FML2N1cnJlbnQgTk9ERS4gUkVNT1RFIG1lYW5zIGl0IGlzIGF0dGFjaGVkIHRvIGEgZGlmZmVyZW50CisgKiBub2RlLihUQkQgLSBOZWVkIGEgd2F5IHRvIHRyZWF0IFJPVVRFUiBib2FyZHMuKQorICoKKyAqIFRoZXJlIGFyZSAyIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCB0aGVzZSBib2FyZHMgLQorICogbGJvYXJkIC0gTG9jYWwgYm9hcmQsIHJib2FyZCAtIHJlbW90ZSBib2FyZC4gVGhlc2UgMiBzdHJ1Y3R1cmVzCisgKiBjYW4gYmUgYXJiaXRyYXJpbHkgbWl4ZWQgaW4gdGhlIExJTktFRCBMSVNUIG9mIEJPQVJEcy4gKFJlZmVyCisgKiBGaWd1cmUgYmVsb3cpLiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmJvYXJkIG9yIGxib2FyZCBzdHJ1Y3R1cmUKKyAqIGlzIHVzZWQgdG8gZmluZCBvdXQgaXRzIHR5cGUgLSBubyB1bmlvbnMgYXJlIHVzZWQuCisgKiBJZiBpdCBpcyBhIGxib2FyZCwgdGhlbiB0aGUgY29uZmlnIGluZm8gb2YgdGhpcyBib2FyZCB3aWxsIGJlIGZvdW5kCisgKiBvbiB0aGUgbG9jYWwgbm9kZS4gKExPQ0FMIE5PREUgQkFTRSArIG9mZnNldCB2YWx1ZSBnaXZlcyBwb2ludGVyIHRvCisgKiB0aGUgc3RydWN0dXJlLgorICogSWYgaXQgaXMgYSByYm9hcmQsIHRoZSBsb2NhbCBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG5vZGUgbnVtYmVyCisgKiBhbmQgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBMSU5LRUQgTElTVCBvbiB0aGUgcmVtb3RlIG5vZGUuCisgKiBUaGUgZGV0YWlscyBvZiB0aGUgaGFyZHdhcmUgb24gYSByZW1vdGUgbm9kZSBjYW4gYmUgYnVpbHQgbG9jYWxseSwKKyAqIGlmIHJlcXVpcmVkLCBieSByZWFkaW5nIHRoZSBMSU5LRUQgTElTVCBvbiB0aGUgcmVtb3RlIG5vZGUgYW5kCisgKiBpZ25vcmluZyBhbGwgdGhlIHJib2FyZHMgb24gdGhhdCBub2RlLgorICoKKyAqIFRoZSBsb2NhbCBub2RlIHVzZXMgdGhlIFJFTU9URSBOT0RFIE5VTUJFUiArIE9GRlNFVCB0byBwb2ludCB0byB0aGUKKyAqIEZpcnN0IGJvYXJkIGluZm8gb24gdGhlIHJlbW90ZSBub2RlLiBUaGUgcmVtb3RlIG5vZGUgbGlzdCBpcworICogdHJhdmVyc2VkIGFzIHRoZSBsb2NhbCBsaXN0LCB1c2luZyB0aGUgUkVNT1RFIEJBU0UgQUREUkVTUyBhbmQgbm90CisgKiB0aGUgbG9jYWwgYmFzZSBhZGRyZXNzIGFuZCBpZ25vcmluZyBhbGwgcmJvYXJkIHZhbHVlcy4KKyAqCisgKgorIEtMQ09ORklHCisKKyArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tKworIHwgIGxib2FyZCAgICB8ICArLS0+fCAgIGxib2FyZCAgIHwgICstLT58ICAgcmJvYXJkICAgfCAgKy0tPnwgICBsYm9hcmQgICB8CisgKy0tLS0tLS0tLS0tLSsgIHwgICArLS0tLS0tLS0tLS0tKyAgfCAgICstLS0tLS0tLS0tLS0rICB8ICAgKy0tLS0tLS0tLS0tLSsKKyB8IGJvYXJkIGluZm8gfCAgfCAgIHwgYm9hcmQgaW5mbyB8ICB8ICAgfGVycmluZm8sYnB0cnwgIHwgICB8IGJvYXJkIGluZm8gfAorICstLS0tLS0tLS0tLS0rICB8ICAgKy0tLS0tLS0tLS0tLSsgIHwgICArLS0tLS0tLS0tLS0tKyAgfCAgICstLS0tLS0tLS0tLS0rCisgfCBvZmZzZXQgICAgIHwtLSsgICB8ICBvZmZzZXQgICAgfC0tKyAgIHwgIG9mZnNldCAgICB8LS0rICAgfG9mZnNldD1OVUxMIHwKKyArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tKworCisKKyArLS0tLS0tLS0tLS0tKworIHwgYm9hcmQgaW5mbyB8CisgKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgY29tcHQgMSAgICB8LS0tLS0tPnwgdHlwZSwgcmV2LCBkaWFnaW5mbywgc2l6ZSAuLi4gIHwgIChDUFUpCisgKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgY29tcHQgMiAgICB8LS0rCisgKy0tLS0tLS0tLS0tLSsgIHwgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIC4uLiAgICAgICB8ICArLS0tPnwgdHlwZSwgcmV2LCBkaWFnaW5mbywgc2l6ZSAuLi4gIHwgIChNRU1fQkFOSykKKyArLS0tLS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBlcnJpbmZvICAgIHwtLSsKKyArLS0tLS0tLS0tLS0tKyAgfCAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICstLS0+fHIvbCBicmQgZXJyaW5mbyxjb21wdCBlcnIgZmxhZ3MgfAorICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICoKKyAqIEVhY2ggQk9BUkQgY29uc2lzdHMgb2YgQ09NUE9ORU5UcyBhbmQgdGhlIEJPQVJEIHN0cnVjdHVyZSBoYXMKKyAqIHBvaW50ZXJzIChvZmZzZXRzKSB0byBpdHMgQ09NUE9ORU5UIHN0cnVjdHVyZS4KKyAqIFRoZSBDT01QT05FTlQgc3RydWN0dXJlIGhhcyB2ZXJzaW9uIGluZm8sIHNpemUgYW5kIHNwZWVkIGluZm8sIHJldmlzaW9uLAorICogZXJyb3IgaW5mbyBhbmQgdGhlIE5JQyBpbmZvLiBUaGlzIHN0cnVjdHVyZSBjYW4gYWNjb21tb2RhdGUgYW55CisgKiBCT0FSRCB3aXRoIGFyYml0cmFyeSBDT01QT05FTlQgY29tcG9zaXRpb24uCisgKgorICogVGhlIEVSUk9SSU5GTyBwYXJ0IG9mIGVhY2ggQk9BUkQgaGFzIGVycm9yIGluZm9ybWF0aW9uCisgKiB0aGF0IGRlc2NyaWJlcyBlcnJvcnMgYWJvdXQgdGhlIEJPQVJEIGl0c2VsZi4gSXQgYWxzbyBoYXMgZmxhZ3MgdG8KKyAqIGluZGljYXRlIHRoZSBDT01QT05FTlQocykgb24gdGhlIGJvYXJkIHRoYXQgaGF2ZSBlcnJvcnMuIFRoZSBlcnJvcgorICogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIENPTVBPTkVOVCBpcyBwcmVzZW50IGluIHRoZSByZXNwZWN0aXZlCisgKiBDT01QT05FTlQgc3RydWN0dXJlLgorICoKKyAqIFRoZSBFUlJPUklORk8gc3RydWN0dXJlIGlzIGFsc28gdHJlYXRlZCBsaWtlIGEgQ09NUE9ORU5ULCBpZS4gdGhlCisgKiBCT0FSRCBoYXMgcG9pbnRlcnMob2Zmc2V0KSB0byB0aGUgRVJST1JJTkZPIHN0cnVjdHVyZS4gVGhlIHJib2FyZAorICogc3RydWN0dXJlIGFsc28gaGFzIGEgcG9pbnRlciB0byB0aGUgRVJST1JJTkZPIHN0cnVjdHVyZS4gVGhpcyBpcworICogdGhlIHBsYWNlIHRvIHN0b3JlIEVSUk9SSU5GTyBhYm91dCBhIFJFTU9URSBOT0RFLCBpZiB0aGUgSFVCIG9uCisgKiB0aGF0IE5PREUgaXMgbm90IHdvcmtpbmcgb3IgaWYgdGhlIFJFTU9URSBNRU1PUlkgaXMgQkFELiBJbiBjYXNlcyB3aGVyZQorICogb25seSB0aGUgQ1BVIG9mIHRoZSBSRU1PVEUgTk9ERSBpcyBkaXNhYmxlZCwgdGhlIEVSUk9SSU5GTyBwb2ludGVyIGNhbgorICogYmUgYSBOT0RFIE5VTUJFUiwgUkVNT1RFIE9GRlNFVCBjb21iaW5hdGlvbiwgcG9pbnRpbmcgdG8gZXJyb3IgaW5mbworICogd2hpY2ggaXMgcHJlc2VudCBvbiB0aGUgUkVNT1RFIE5PREUuKFRCRCkKKyAqIFJFTU9URSBFUlJJTkZPIGNhbiBiZSBzdG9yZWQgb24gYW55IG9mIHRoZSBuZWFyZXN0IG5vZGVzCisgKiBvciBvbiBhbGwgdGhlIG5lYXJlc3Qgbm9kZXMuKFRCRCkKKyAqIExpa2UgQk9BUkQgc3RydWN0dXJlcywgUkVNT1RFIEVSUklORk8gc3RydWN0dXJlcyBjYW4gYmUgYnVpbHQgbG9jYWxseQorICogdXNpbmcgdGhlIHJib2FyZCBlcnJpbmZvIHBvaW50ZXIuCisgKgorICogSW4gb3JkZXIgdG8gZ2V0IHVzZWZ1bCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgRGF0YSBvcmdhbml6YXRpb24sIGEgc2V0IG9mCisgKiBpbnRlcmZhY2Ugcm91dGluZXMgYXJlIHByb3ZpZGVkIChUQkQpLiBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIHJlbWVtYmVyIHdoaWxlCisgKiBtYW5pcHVsYXRpbmcgdGhlIHN0cnVjdHVyZXMsIGlzIHRoYXQsIHRoZSBOT0RFIG51bWJlciBpbmZvcm1hdGlvbiBzaG91bGQKKyAqIGJlIHVzZWQuIElmIHRoZSBOT0RFIGlzIG5vbi16ZXJvIChyZW1vdGUpIHRoZW4gZWFjaCBvZmZzZXQgc2hvdWxkCisgKiBiZSBhZGRlZCB0byB0aGUgUkVNT1RFIEJBU0UgQUREUiBlbHNlIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgTE9DQUwgQkFTRSBBRERSLgorICogVGhpcyBpbmNsdWRlcyBvZmZzZXRzIGZvciBCT0FSRFMsIENPTVBPTkVOVFMgYW5kIEVSUk9SSU5GTy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2Ugc3RydWN0dXJlcyBkbyBub3QgcHJvdmlkZSBtdWNoIGluZm8gYWJvdXQgY29ubmVjdGl2aXR5LgorICogVGhhdCBpbmZvIHdpbGwgYmUgcGFydCBvZiBIV0dSQVBILCB3aGljaCBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGNmZ190CisgKiBkYXRhIHN0cnVjdHVyZS4gKHJlZiBJUDI3cHJvbS9jZmcuaCkgSXQgaGFzIHRvIGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUKKyAqIHRoZSBJTyBwYXJ0IG9mIHRoZSBOZXR3b3JrKFRCRCkuCisgKgorICogVGhlIGRhdGEgc3RydWN0dXJlcyBiZWxvdyBkZWZpbmUgdGhlIGFib3ZlIGNvbmNlcHRzLgorICovCisKKy8qCisgKiBWYWx1ZXMgZm9yIENQVSB0eXBlcworICovCisjZGVmaW5lIEtMX0NQVV9SNDAwMAkJMHgxCS8qIFN0YW5kYXJkIFI0MDAwICovCisjZGVmaW5lIEtMX0NQVV9URlAJCTB4MgkvKiBURlAgcHJvY2Vzc29yICovCisjZGVmaW5lCUtMX0NQVV9SMTAwMDAJCTB4MwkvKiBSMTAwMDAgKFQ1KSAqLworI2RlZmluZSBLTF9DUFVfTk9ORQkJKC0xKQkvKiBubyBjcHUgcHJlc2VudCBpbiBzbG90ICovCisKKy8qCisgKiBJUDI3IEJPQVJEIGNsYXNzZXMKKyAqLworCisjZGVmaW5lIEtMQ0xBU1NfTUFTSwkweGYwCisjZGVmaW5lIEtMQ0xBU1NfTk9ORQkweDAwCisjZGVmaW5lIEtMQ0xBU1NfTk9ERQkweDEwICAgICAgICAgICAgIC8qIENQVSwgTWVtb3J5IGFuZCBIVUIgYm9hcmQgKi8KKyNkZWZpbmUgS0xDTEFTU19DUFUJS0xDTEFTU19OT0RFCisjZGVmaW5lIEtMQ0xBU1NfSU8JMHgyMCAgICAgICAgICAgICAvKiBCYXNlSU8sIDQgY2ggU0NTSSwgZXRoZXJuZXQsIEZEREkKKwkJCQkJICAgIGFuZCB0aGUgbm9uLWdyYXBoaWNzIHdpZGdldCBib2FyZHMgKi8KKyNkZWZpbmUgS0xDTEFTU19ST1VURVIJMHgzMCAgICAgICAgICAgICAvKiBSb3V0ZXIgYm9hcmQgKi8KKyNkZWZpbmUgS0xDTEFTU19NSURQTEFORSAweDQwICAgICAgICAgICAgLyogV2UgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgYm9hcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIGVycm9yIGluZm8gKi8KKyNkZWZpbmUgS0xDTEFTU19HRlgJMHg1MAkJLyogZ3JhcGhpY3MgYm9hcmRzICovCisKKyNkZWZpbmUgS0xDTEFTU19QU0VVRE9fR0ZYCTB4NjAJLyogSERUViB0eXBlIGNhcmRzIHRoYXQgdXNlIGEgZ2Z4CisJCQkJCSAqIGh3IGlmYyB0byB4dGFsayBhbmQgYXJlIG5vdCBnZngKKwkJCQkJICogY2xhc3MgZm9yIHN3IHB1cnBvc2VzICovCisKKyNkZWZpbmUgS0xDTEFTU19NQVgJNwkJLyogQnVtcCB0aGlzIGlmIGEgbmV3IENMQVNTIGlzIGFkZGVkICovCisjZGVmaW5lIEtMVFlQRV9NQVgJMTAJCS8qIEJ1bXAgdGhpcyBpZiBhIG5ldyBDTEFTUyBpcyBhZGRlZCAqLworCisjZGVmaW5lIEtMQ0xBU1NfVU5LTk9XTgkweGYwCisKKyNkZWZpbmUgS0xDTEFTUyhfeCkgKChfeCkgJiBLTENMQVNTX01BU0spCisKKy8qCisgKiBJUDI3IGJvYXJkIHR5cGVzCisgKi8KKworI2RlZmluZSBLTFRZUEVfTUFTSwkweDBmCisjZGVmaW5lIEtMVFlQRV9OT05FCTB4MDAKKyNkZWZpbmUgS0xUWVBFX0VNUFRZCTB4MDAKKworI2RlZmluZSBLTFRZUEVfV0VJUkRDUFUgKEtMQ0xBU1NfQ1BVIHwgMHgwKQorI2RlZmluZSBLTFRZUEVfSVAyNwkoS0xDTEFTU19DUFUgfCAweDEpIC8qIDIgQ1BVcyhSMTBLKSBwZXIgYm9hcmQgKi8KKworI2RlZmluZSBLTFRZUEVfV0VJUkRJTwkoS0xDTEFTU19JTyAgfCAweDApCisjZGVmaW5lIEtMVFlQRV9CQVNFSU8JKEtMQ0xBU1NfSU8gIHwgMHgxKSAvKiBJT0MzLCBTdXBlcklPLCBCcmlkZ2UsIFNDU0kgKi8KKyNkZWZpbmUgS0xUWVBFX0lPNglLTFRZUEVfQkFTRUlPICAgICAgIC8qIEFkZGl0aW9uYWwgbmFtZSAqLworI2RlZmluZSBLTFRZUEVfNENIU0NTSQkoS0xDTEFTU19JTyAgfCAweDIpCisjZGVmaW5lIEtMVFlQRV9NU0NTSQlLTFRZUEVfNENIU0NTSSAgICAgIC8qIEFkZGl0aW9uYWwgbmFtZSAqLworI2RlZmluZSBLTFRZUEVfRVRIRVJORVQJKEtMQ0xBU1NfSU8gIHwgMHgzKQorI2RlZmluZSBLTFRZUEVfTUVORVQJS0xUWVBFX0VUSEVSTkVUICAgICAvKiBBZGRpdGlvbmFsIG5hbWUgKi8KKyNkZWZpbmUgS0xUWVBFX0ZEREkgIAkoS0xDTEFTU19JTyAgfCAweDQpCisjZGVmaW5lIEtMVFlQRV9VTlVTRUQJKEtMQ0xBU1NfSU8gIHwgMHg1KSAvKiBYWFggVU5VU0VEICovCisjZGVmaW5lIEtMVFlQRV9IQVJPTEQgICAoS0xDTEFTU19JTyAgfCAweDYpIC8qIFBDSSBTSE9FIEJPWCAqLworI2RlZmluZSBLTFRZUEVfUENJCUtMVFlQRV9IQVJPTEQKKyNkZWZpbmUgS0xUWVBFX1ZNRSAgICAgIChLTENMQVNTX0lPICB8IDB4NykgLyogQW55IDNyZCBwYXJ0eSBWTUUgY2FyZCAqLworI2RlZmluZSBLTFRZUEVfTUlPICAgCShLTENMQVNTX0lPICB8IDB4OCkKKyNkZWZpbmUgS0xUWVBFX0ZDICAgIAkoS0xDTEFTU19JTyAgfCAweDkpCisjZGVmaW5lIEtMVFlQRV9MSU5DICAgIAkoS0xDTEFTU19JTyAgfCAweEEpCisjZGVmaW5lIEtMVFlQRV9UUFUgICAgCShLTENMQVNTX0lPICB8IDB4QikgLyogVGVuc29yIFByb2Nlc3NpbmcgVW5pdCAqLworI2RlZmluZSBLTFRZUEVfR1NOX0EgICAJKEtMQ0xBU1NfSU8gIHwgMHhDKSAvKiBNYWluIEdTTiBib2FyZCAqLworI2RlZmluZSBLTFRZUEVfR1NOX0IgICAJKEtMQ0xBU1NfSU8gIHwgMHhEKSAvKiBBdXhpbGlhcnkgR1NOIGJvYXJkICovCisKKyNkZWZpbmUgS0xUWVBFX0dGWAkoS0xDTEFTU19HRlggfCAweDApIC8qIHVua25vd24gZ3JhcGhpY3MgdHlwZSAqLworI2RlZmluZSBLTFRZUEVfR0ZYX0tPTkEgKEtMQ0xBU1NfR0ZYIHwgMHgxKSAvKiBLT05BIGdyYXBoaWNzIG9uIElQMjcgKi8KKyNkZWZpbmUgS0xUWVBFX0dGWF9NR1JBIChLTENMQVNTX0dGWCB8IDB4MykgLyogTUdSQVMgZ3JhcGhpY3Mgb24gSVAyNyAqLworCisjZGVmaW5lIEtMVFlQRV9XRUlSRFJPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDApCisjZGVmaW5lIEtMVFlQRV9ST1VURVIgICAgIChLTENMQVNTX1JPVVRFUiB8IDB4MSkKKyNkZWZpbmUgS0xUWVBFX1JPVVRFUjIgICAgS0xUWVBFX1JPVVRFUgkJLyogT2Jzb2xldGUhICovCisjZGVmaW5lIEtMVFlQRV9OVUxMX1JPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDIpCisjZGVmaW5lIEtMVFlQRV9NRVRBX1JPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDMpCisKKyNkZWZpbmUgS0xUWVBFX1dFSVJETUlEUExBTkUgKEtMQ0xBU1NfTUlEUExBTkUgfCAweDApCisjZGVmaW5lIEtMVFlQRV9NSURQTEFORTggIChLTENMQVNTX01JRFBMQU5FIHwgMHgxKSAvKiA4IHNsb3QgYmFja3BsYW5lICovCisjZGVmaW5lIEtMVFlQRV9NSURQTEFORSAgICBLTFRZUEVfTUlEUExBTkU4CisjZGVmaW5lIEtMVFlQRV9QQlJJQ0tfWEJPVwkoS0xDTEFTU19NSURQTEFORSB8IDB4MikKKworI2RlZmluZSBLTFRZUEVfSU9CUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MCkKKyNkZWZpbmUgS0xUWVBFX0lCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MSkKKyNkZWZpbmUgS0xUWVBFX1BCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MikKKyNkZWZpbmUgS0xUWVBFX1hCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MykKKworI2RlZmluZSBLTFRZUEVfUEJSSUNLX0JSSURHRQlLTFRZUEVfUEJSSUNLCisKKy8qIFRoZSB2YWx1ZSBvZiB0eXBlIHNob3VsZCBiZSBtb3JlIHRoYW4gOCBzbyB0aGF0IGhpbnYgcHJpbnRzCisgKiBvdXQgdGhlIGJvYXJkIG5hbWUgZnJvbSB0aGUgTklDIHN0cmluZy4gRm9yIHZhbHVlcyBsZXNzIHRoYW4KKyAqIDggdGhlIG5hbWUgb2YgdGhlIGJvYXJkIG5lZWRzIHRvIGJlIGhhcmQgY29kZWQgaW4gYSBmZXcgcGxhY2VzLgorICogV2hlbiBicmluZ3VwIHN0YXJ0ZWQgbmljIG5hbWVzIGhhZCBub3Qgc3RhbmRhcmRpemVkIGFuZCBzbyB3ZQorICogaGFkIHRvIGhhcmQgY29kZS4gKEZvciBwZW9wbGUgaW50ZXJlc3RlZCBpbiBoaXN0b3J5LikKKyAqLworI2RlZmluZSBLTFRZUEVfWFRIRCAgIAkoS0xDTEFTU19QU0VVRE9fR0ZYIHwgMHg5KQorCisjZGVmaW5lIEtMVFlQRV9VTktOT1dOCShLTENMQVNTX1VOS05PV04gfCAweGYpCisKKyNkZWZpbmUgS0xUWVBFKF94KSAJKChfeCkgJiBLTFRZUEVfTUFTSykKKyNkZWZpbmUgSVNfTUlPX1BSRVNFTlQobCkJKChsLT5icmRfdHlwZSA9PSBLTFRZUEVfQkFTRUlPKSAmJiBcCisJCQkJIChsLT5icmRfZmxhZ3MgJiBTRUNPTkRfTklDX1BSRVNFTlQpKQorI2RlZmluZSBJU19NSU9fSU9DMyhsLCBuKQkoSVNfTUlPX1BSRVNFTlQobCkgJiYgKG4gPiAyKSkKKworLyoKKyAqIGJvYXJkIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIE1BWF9DT01QVFNfUEVSX0JSRCAyNAorCisjZGVmaW5lIExPQ0FMX0JPQVJEIDEKKyNkZWZpbmUgUkVNT1RFX0JPQVJEIDIKKworI2RlZmluZSBMQk9BUkRfU1RSVUNUX1ZFUlNJT04gCTIKKwordHlwZWRlZiBzdHJ1Y3QgbGJvYXJkX3MgeworCWtsY29uZl9vZmZfdCAJYnJkX25leHQ7ICAgICAgICAgLyogTmV4dCBCT0FSRCAqLworCXVuc2lnbmVkIGNoYXIgCXN0cnVjdF90eXBlOyAgICAgIC8qIHR5cGUgb2Ygc3RydWN0dXJlLCBsb2NhbCBvciByZW1vdGUgKi8KKwl1bnNpZ25lZCBjaGFyIAlicmRfdHlwZTsgICAgICAgICAvKiB0eXBlK2NsYXNzICovCisJdW5zaWduZWQgY2hhciAJYnJkX3N2ZXJzaW9uOyAgICAgLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfYnJldmlzaW9uOyAgICAvKiBib2FyZCByZXZpc2lvbiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfcHJvbXZlcjsgICAgICAvKiBib2FyZCBwcm9tIHZlcnNpb24sIGlmIGFueSAqLworCXVuc2lnbmVkIGNoYXIgCWJyZF9mbGFnczsgICAgICAgIC8qIEVuYWJsZWQsIERpc2FibGVkIGV0YyAqLworCXVuc2lnbmVkIGNoYXIgCWJyZF9zbG90OyAgICAgICAgIC8qIHNsb3QgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQJYnJkX2RlYnVnc3c7ICAgICAgLyogRGVidWcgc3dpdGNoZXMgKi8KKwltb2R1bGVpZF90CWJyZF9tb2R1bGU7ICAgICAgIC8qIG1vZHVsZSB0byB3aGljaCBpdCBiZWxvbmdzICovCisJcGFydGlkX3QgCWJyZF9wYXJ0aXRpb247ICAgIC8qIFBhcnRpdGlvbiBudW1iZXIgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgCWJyZF9kaWFndmFsOyAgICAgIC8qIGRpYWdub3N0aWMgdmFsdWUgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgCWJyZF9kaWFncGFybTsgICAgIC8qIGRpYWdub3N0aWMgcGFyYW1ldGVyICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgCWJyZF9pbnZlbnRvcnk7ICAgIC8qIGludmVudG9yeSBoaXN0b3J5ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgCWJyZF9udW1jb21wdHM7ICAgIC8qIE51bWJlciBvZiBjb21wb25lbnRzICovCisgICAgICAgIG5pY190ICAgICAgICAgCWJyZF9uaWM7ICAgICAgICAgIC8qIE51bWJlciBpbiBDQU4gKi8KKwluYXNpZF90CQlicmRfbmFzaWQ7ICAgICAgICAvKiBwYXNzZWQgcGFyYW1ldGVyICovCisJa2xjb25mX29mZl90IAlicmRfY29tcHRzW01BWF9DT01QVFNfUEVSX0JSRF07IC8qIHBvaW50ZXJzIHRvIENPTVBPTkVOVFMgKi8KKwlrbGNvbmZfb2ZmX3QgCWJyZF9lcnJpbmZvOyAgICAgIC8qIEJvYXJkJ3MgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgbGJvYXJkX3MgKmJyZF9wYXJlbnQ7CSAgLyogTG9naWNhbCBwYXJlbnQgZm9yIHRoaXMgYnJkICovCisJdmVydGV4X2hkbF90CWJyZF9ncmFwaF9saW5rOyAgIC8qIHZlcnRleCBoZGwgdG8gY29ubmVjdCBleHRlcm4gY29tcHRzICovCisJY29uZmlkZW5jZV90CWJyZF9jb25maWRlbmNlOwkgIC8qIGNvbmZpZGVuY2UgdGhhdCB0aGUgYm9hcmQgaXMgYmFkICovCisJbmFzaWRfdAkJYnJkX293bmVyOyAgICAgICAgLyogd2hvIG93bnMgdGhpcyBib2FyZCAqLworCXVuc2lnbmVkIGNoYXIgCWJyZF9uaWNfZmxhZ3M7ICAgIC8qIFRvIGhhbmRsZSA4IG1vcmUgTklDcyAqLworCWNoYXIJCWJyZF9uYW1lWzMyXTsKK30gbGJvYXJkX3Q7CisKKworLyoKKyAqCU1ha2Ugc3VyZSB3ZSBwYXNzIGJhY2sgdGhlIGNhbGlhcyBzcGFjZSBhZGRyZXNzIGZvciBsb2NhbCBib2FyZHMuCisgKglrbGNvbmZpZyBib2FyZCB0cmF2ZXJzYWwgYW5kIGVycm9yIHN0cnVjdHVyZSBleHRyYWN0aW9uIGRlZmluZXMuCisgKi8KKworI2RlZmluZSBCT0FSRF9TTE9UKF9icmQpCSgoX2JyZCktPmJyZF9zbG90KQorCisjZGVmaW5lIEtMQ0ZfQ0xBU1MoX2JyZCkJS0xDTEFTUygoX2JyZCktPmJyZF90eXBlKQorI2RlZmluZSBLTENGX1RZUEUoX2JyZCkJCUtMVFlQRSgoX2JyZCktPmJyZF90eXBlKQorI2RlZmluZSBLTENGX1JFTU9URShfYnJkKSAgCSgoKF9icmQpLT5zdHJ1Y3RfdHlwZSAmIExPQ0FMX0JPQVJEKSA/IDAgOiAxKQorI2RlZmluZSBLTENGX05VTV9DT01QUyhfYnJkKQkoKF9icmQpLT5icmRfbnVtY29tcHRzKQorI2RlZmluZSBLTENGX01PRFVMRV9JRChfYnJkKQkoKF9icmQpLT5icmRfbW9kdWxlKQorCisjZGVmaW5lIEtMQ0ZfTkVYVChfYnJkKSAJXAorICAgICAgICAoKF9icmQpLT5icmRfbmV4dCA/IAlcCisJIChsYm9hcmRfdCAqKShOT0RFX09GRlNFVF9UT19LMShOQVNJRF9HRVQoX2JyZCksIChfYnJkKS0+YnJkX25leHQpKTpcCisJIE5VTEwpCisjZGVmaW5lIEtMQ0ZfQ09NUChfYnJkLCBfbmR4KSAgIFwKKyAgICAgICAgICAgICAgICAoa2xpbmZvX3QgKikoTk9ERV9PRkZTRVRfVE9fSzEoTkFTSURfR0VUKF9icmQpLAlcCisJCQkJCSAgICAgICAoX2JyZCktPmJyZF9jb21wdHNbKF9uZHgpXSkpCisKKyNkZWZpbmUgS0xDRl9DT01QX0VSUk9SKF9icmQsIF9jb21wKQlcCisgICAgICAgICAgICAgICAoTk9ERV9PRkZTRVRfVE9fSzEoTkFTSURfR0VUKF9icmQpLCAoX2NvbXApLT5lcnJpbmZvKSkKKworI2RlZmluZSBLTENGX0NPTVBfVFlQRShfY29tcCkJKChfY29tcCktPnN0cnVjdF90eXBlKQorI2RlZmluZSBLTENGX0JSSURHRV9XX0lEKF9jb21wKQkoKF9jb21wKS0+cGh5c2lkKQkvKiBXaWRnZXQgSUQgKi8KKworCisKKy8qCisgKiBHZW5lcmljIGluZm8gc3RydWN0dXJlLiBUaGlzIHN0b3JlcyBjb21tb24gaW5mbyBhYm91dCBhCisgKiBjb21wb25lbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qga2xpbmZvX3MgeyAgICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgaW5mbyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICAgc3RydWN0X3R5cGU7ICAgICAgIC8qIHR5cGUgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgIHN0cnVjdF92ZXJzaW9uOyAgICAvKiB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBmbGFnczsgICAgICAgICAgICAvKiBFbmFibGVkLCBkaXNhYmxlZCBldGMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgIHJldmlzaW9uOyAgICAgICAgIC8qIGNvbXBvbmVudCByZXZpc2lvbiAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgZGlhZ3ZhbDsgICAgICAgICAgLyogcmVzdWx0IG9mIGRpYWdub3N0aWNzICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBkaWFncGFybTsgICAgICAgICAvKiBkaWFnbm9zdGljIHBhcmFtZXRlciAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICAgaW52ZW50b3J5OyAgICAgICAgLyogcHJldmlvdXMgaW52ZW50b3J5IHN0YXR1cyAqLworCW5pY190IAkJbmljOyAgICAgICAgICAgICAgLyogTVVzdCBiZSBhbGlnbmVkIHByb3Blcmx5ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBwaHlzaWQ7ICAgICAgICAgICAvKiBwaHlzaWNhbCBpZCBvZiBjb21wb25lbnQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgIHZpcnRpZDsgICAgICAgICAgIC8qIHZpcnR1YWwgaWQgYXMgc2VlbiBieSBzeXN0ZW0gKi8KKwl1bnNpZ25lZCBjaGFyCXdpZGlkOwkgICAgICAgICAgLyogV2lkZ2V0IGlkIC0gaWYgYXBwbGljYWJsZSAqLworCW5hc2lkX3QJCW5hc2lkOyAgICAgICAgICAgIC8qIG5vZGUgbnVtYmVyIC0gZnJvbSBwYXJlbnQgKi8KKwljaGFyCQlwYWQxOwkJICAvKiBwYWQgb3V0IHN0cnVjdHVyZS4gKi8KKwljaGFyCQlwYWQyOwkJICAvKiBwYWQgb3V0IHN0cnVjdHVyZS4gKi8KKwlDT01QT05FTlQJKmFyY3NfY29tcHQ7ICAgICAgLyogcHRyIHRvIHRoZSBhcmNzIHN0cnVjdCBmb3IgZWFzZSovCisgICAgICAgIGtsY29uZl9vZmZfdAllcnJpbmZvOyAgICAgICAgICAvKiBjb21wb25lbnQgc3BlY2lmaWMgZXJyb3JzICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBwYWQzOyAgICAgICAgICAgICAvKiBwY2kgZmllbGRzIGhhdmUgbW92ZWQgb3ZlciB0byAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgcGFkNDsgICAgICAgICAgICAgLyoga2xicmlfdCAqLworfSBrbGluZm9fdCA7CisKKyNkZWZpbmUgS0xDT05GSUdfSU5GT19FTkFCTEVEKF9pKQkoKF9pKS0+ZmxhZ3MgJiBLTElORk9fRU5BQkxFKQorLyoKKyAqIENvbXBvbmVudCBzdHJ1Y3R1cmVzLgorICogRm9sbG93aW5nIGFyZSB0aGUgY3VycmVudGx5IGlkZW50aWZpZWQgY29tcG9uZW50czoKKyAqIAlDUFUsIEhVQiwgTUVNX0JBTkssCisgKiAJWEJPVyhjb25zaXN0cyBvZiAxNiBXSURHRVRzLCBlYWNoIG9mIHdoaWNoIGNhbiBiZSBIVUIgb3IgR1JBUEhJQ1Mgb3IgQlJJREdFKQorICogCUJSSURHRSwgSU9DMywgU3VwZXJJTywgU0NTSSwgRkRESQorICogCVJPVVRFUgorICogCUdSQVBISUNTCisgKi8KKyNkZWZpbmUgS0xTVFJVQ1RfVU5LTk9XTgkwCisjZGVmaW5lIEtMU1RSVUNUX0NQVSAgCQkxCisjZGVmaW5lIEtMU1RSVUNUX0hVQiAgCQkyCisjZGVmaW5lIEtMU1RSVUNUX01FTUJOSyAJMworI2RlZmluZSBLTFNUUlVDVF9YQk9XIAkJNAorI2RlZmluZSBLTFNUUlVDVF9CUkkgCQk1CisjZGVmaW5lIEtMU1RSVUNUX0lPQzMgCQk2CisjZGVmaW5lIEtMU1RSVUNUX1BDSSAJCTcKKyNkZWZpbmUgS0xTVFJVQ1RfVk1FIAkJOAorI2RlZmluZSBLTFNUUlVDVF9ST1UJCTkKKyNkZWZpbmUgS0xTVFJVQ1RfR0ZYIAkJMTAKKyNkZWZpbmUgS0xTVFJVQ1RfU0NTSSAJCTExCisjZGVmaW5lIEtMU1RSVUNUX0ZEREkgCQkxMgorI2RlZmluZSBLTFNUUlVDVF9NSU8gCQkxMworI2RlZmluZSBLTFNUUlVDVF9ESVNLIAkJMTQKKyNkZWZpbmUgS0xTVFJVQ1RfVEFQRSAJCTE1CisjZGVmaW5lIEtMU1RSVUNUX0NEUk9NIAkJMTYKKyNkZWZpbmUgS0xTVFJVQ1RfSFVCX1VBUlQgCTE3CisjZGVmaW5lIEtMU1RSVUNUX0lPQzNFTkVUIAkxOAorI2RlZmluZSBLTFNUUlVDVF9JT0MzVUFSVCAJMTkKKyNkZWZpbmUgS0xTVFJVQ1RfVU5VU0VECQkyMCAvKiBYWFggVU5VU0VEICovCisjZGVmaW5lIEtMU1RSVUNUX0lPQzNQQ0tNICAgICAgIDIxCisjZGVmaW5lIEtMU1RSVUNUX1JBRCAgICAgICAgCTIyCisjZGVmaW5lIEtMU1RSVUNUX0hVQl9UVFkgICAgICAgIDIzCisjZGVmaW5lIEtMU1RSVUNUX0lPQzNfVFRZIAkyNAorCisvKiBFYXJseSBBY2Nlc3MgSU8gcHJvbXMgYXJlIGNvbXBhdGlibGUKKyAgIG9ubHkgd2l0aCBLTFNUUlVDVCB2YWx1ZXMgdXB0byAyNC4gKi8KKworI2RlZmluZSBLTFNUUlVDVF9GSUJFUkNIQU5ORUwgCTI1CisjZGVmaW5lIEtMU1RSVUNUX01PRF9TRVJJQUxfTlVNIDI2CisjZGVmaW5lIEtMU1RSVUNUX0lPQzNNUyAgICAgICAgIDI3CisjZGVmaW5lIEtMU1RSVUNUX1RQVSAgICAgICAgICAgIDI4CisjZGVmaW5lIEtMU1RSVUNUX0dTTl9BICAgICAgICAgIDI5CisjZGVmaW5lIEtMU1RSVUNUX0dTTl9CICAgICAgICAgIDMwCisjZGVmaW5lIEtMU1RSVUNUX1hUSEQgICAgICAgICAgIDMxCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGluZGljZXMgb2YgdmFyaW91cyBjb21wb25lbnRzIHdpdGhpbiBhIGxib2FyZCBzdHJ1Y3R1cmUuCisgKi8KKworI2RlZmluZSBJUDI3X0NQVTBfSU5ERVggMAorI2RlZmluZSBJUDI3X0NQVTFfSU5ERVggMQorI2RlZmluZSBJUDI3X0hVQl9JTkRFWCAyCisjZGVmaW5lIElQMjdfTUVNX0lOREVYIDMKKworI2RlZmluZSBCQVNFSU9fQlJJREdFX0lOREVYIDAKKyNkZWZpbmUgQkFTRUlPX0lPQzNfSU5ERVggMQorI2RlZmluZSBCQVNFSU9fU0NTSTFfSU5ERVggMgorI2RlZmluZSBCQVNFSU9fU0NTSTJfSU5ERVggMworCisjZGVmaW5lIE1JRFBMQU5FX1hCT1dfSU5ERVggMAorI2RlZmluZSBST1VURVJfQ09NUE9ORU5UX0lOREVYIDAKKworI2RlZmluZSBDSDRTQ1NJX0JSSURHRV9JTkRFWCAwCisKKy8qIEluZm8gaG9sZGVycyBmb3IgdmFyaW91cyBoYXJkd2FyZSBjb21wb25lbnRzICovCisKK3R5cGVkZWYgdTY0ICpwY2lfdDsKK3R5cGVkZWYgdTY0ICp2bWViX3Q7Cit0eXBlZGVmIHU2NCAqdm1lZF90OwordHlwZWRlZiB1NjQgKmZkZGlfdDsKK3R5cGVkZWYgdTY0ICpzY3NpX3Q7Cit0eXBlZGVmIHU2NCAqbWlvX3Q7Cit0eXBlZGVmIHU2NCAqZ3JhcGhpY3NfdDsKK3R5cGVkZWYgdTY0ICpyb3V0ZXJfdDsKKworLyoKKyAqIFRoZSBwb3J0IGluZm8gaW4gaXAyN19jZmcgYXJlYSB0cmFuc2xhdGVzIHRvIGEgbGJvYXJ0X3QgaW4gdGhlCisgKiBLTENPTkZJRyBhcmVhLiBCdXQgc2luY2UgS0xDT05GSUcgZG9lcyBub3QgdXNlIHBvaW50ZXJzLCBsYm9hcnRfdAorICogaXMgc3RvcmVkIGluIHRlcm1zIG9mIGEgbmFzaWQgYW5kIGEgb2Zmc2V0IGZyb20gc3RhcnQgb2YgS0xDT05GSUcKKyAqIGFyZWEgIG9uIHRoYXQgbmFzaWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGtscG9ydF9zIHsKKwluYXNpZF90CQlwb3J0X25hc2lkOworCXVuc2lnbmVkIGNoYXIJcG9ydF9mbGFnOworCWtsY29uZl9vZmZfdAlwb3J0X29mZnNldDsKK30ga2xwb3J0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGtsY3B1X3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1BVICovCisJa2xpbmZvX3QgCWNwdV9pbmZvOworCXVuc2lnbmVkIHNob3J0IAljcHVfcHJpZDsJLyogUHJvY2Vzc29yIFBSSUQgdmFsdWUgKi8KKwl1bnNpZ25lZCBzaG9ydCAJY3B1X2ZwaXJyOwkvKiBGUFUgSVJSIHZhbHVlICovCisJdW5zaWduZWQgc2hvcnQgCWNwdV9zcGVlZDsJLyogU3BlZWQgaW4gTUhaICovCisJdW5zaWduZWQgc2hvcnQgCWNwdV9zY2FjaGVzejsJLyogc2Vjb25kYXJ5IGNhY2hlIHNpemUgaW4gTUIgKi8KKwl1bnNpZ25lZCBzaG9ydCAJY3B1X3NjYWNoZXNwZWVkOy8qIHNlY29uZGFyeSBjYWNoZSBzcGVlZCBpbiBNSHogKi8KK30ga2xjcHVfdCA7CisKKyNkZWZpbmUgQ1BVX1NUUlVDVF9WRVJTSU9OICAgMgorCit0eXBlZGVmIHN0cnVjdCBrbGh1Yl9zIHsJCQkvKiBIVUIgKi8KKwlrbGluZm9fdCAJaHViX2luZm87CisJdW5zaWduZWQgaW50IAkJaHViX2ZsYWdzOwkJLyogUENGR19IVUJfeHh4IGZsYWdzICovCisJa2xwb3J0X3QJaHViX3BvcnQ7CQkvKiBodWIgaXMgY29ubmVjdGVkIHRvIHRoaXMgKi8KKwluaWNfdAkJaHViX2JveF9uaWM7CQkvKiBuaWMgb2YgY29udGFpbmluZyBib3ggKi8KKwlrbGNvbmZfb2ZmX3QJaHViX21mZ19uaWM7CQkvKiBNRkcgTklDIHN0cmluZyAqLworCXU2NAkJaHViX3NwZWVkOwkJLyogU3BlZWQgb2YgaHViIGluIEhaICovCit9IGtsaHViX3QgOworCit0eXBlZGVmIHN0cnVjdCBrbGh1Yl91YXJ0X3MgewkJCS8qIEhVQiAqLworCWtsaW5mb190IAlodWJ1YXJ0X2luZm87CisJdW5zaWduZWQgaW50IAkJaHVidWFydF9mbGFnczsJCS8qIFBDRkdfSFVCX3h4eCBmbGFncyAqLworCW5pY190CQlodWJ1YXJ0X2JveF9uaWM7CS8qIG5pYyBvZiBjb250YWluaW5nIGJveCAqLworfSBrbGh1Yl91YXJ0X3QgOworCisjZGVmaW5lIE1FTU9SWV9TVFJVQ1RfVkVSU0lPTiAgIDIKKwordHlwZWRlZiBzdHJ1Y3Qga2xtZW1ibmtfcyB7CQkJLyogTUVNT1JZIEJBTksgKi8KKwlrbGluZm9fdCAJbWVtYm5rX2luZm87CisJc2hvcnQgCQltZW1ibmtfbWVtc3o7CQkvKiBUb3RhbCBtZW1vcnkgaW4gbWVnYWJ5dGVzICovCisJc2hvcnQJCW1lbWJua19kaW1tX3NlbGVjdDsgLyogYmFuayB0byBwaHlzaWNhbCBhZGRyIG1hcHBpbmcqLworCXNob3J0CQltZW1ibmtfYm5rc3pbTURfTUVNX0JBTktTXTsgLyogTWVtb3J5IGJhbmsgc2l6ZXMgKi8KKwlzaG9ydAkJbWVtYm5rX2F0dHI7Cit9IGtsbWVtYm5rX3QgOworCisjZGVmaW5lIEtMQ09ORklHX01FTUJOS19TSVpFKF9pbmZvLCBfYmFuaykJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX2luZm8pLT5tZW1ibmtfYm5rc3pbKF9iYW5rKV0pCisKKworI2RlZmluZSBNRU1CTktfUFJFTUlVTSAxCisjZGVmaW5lIEtMQ09ORklHX01FTUJOS19QUkVNSVVNKF9pbmZvLCBfYmFuaykJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX2luZm8pLT5tZW1ibmtfYXR0ciAmIChNRU1CTktfUFJFTUlVTSA8PCAoX2JhbmspKSkKKworI2RlZmluZSBNQVhfU0VSSUFMX05VTV9TSVpFIDEwCisKK3R5cGVkZWYgc3RydWN0IGtsbW9kX3NlcmlhbF9udW1fcyB7CisgICAgICBrbGluZm9fdCAgICAgICAgc251bV9pbmZvOworICAgICAgdW5pb24geworICAgICAgICAgICAgICBjaGFyIHNudW1fc3RyW01BWF9TRVJJQUxfTlVNX1NJWkVdOworICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgICAgICAgc251bV9pbnQ7CisgICAgICB9IHNudW07Cit9IGtsbW9kX3NlcmlhbF9udW1fdDsKKworLyogTWFjcm9zIG5lZWRlZCB0byBhY2Nlc3Mgc2VyaWFsIG51bWJlciBzdHJ1Y3R1cmUgaW4gbGJvYXJkX3QuCisgICBIYXJkIGNvZGVkIHZhbHVlcyBhcmUgbmVjZXNzYXJ5IHNpbmNlIHdlIGNhbm5vdCB0cmVhdAorICAgc2VyaWFsIG51bWJlciBzdHJ1Y3QgYXMgYSBjb21wb25lbnQgd2l0aG91dCBsb3NpbmcgY29tcGF0aWJpbGl0eQorICAgYmV0d2VlbiBwcm9tIHZlcnNpb25zLiAqLworCisjZGVmaW5lIEdFVF9TTlVNX0NPTVAoX2wpIAkoKGtsbW9kX3NlcmlhbF9udW1fdCAqKVwKKwkJCQlLTENGX0NPTVAoX2wsIF9sLT5icmRfbnVtY29tcHRzKSkKKworI2RlZmluZSBNQVhfWEJPV19MSU5LUyAxNgorCit0eXBlZGVmIHN0cnVjdCBrbHhib3dfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYQk9XICovCisJa2xpbmZvX3QgCXhib3dfaW5mbyA7CisJa2xwb3J0X3QJeGJvd19wb3J0X2luZm9bTUFYX1hCT1dfTElOS1NdIDsgLyogTW9kdWxlIG51bWJlciAqLworICAgICAgICBpbnQJCXhib3dfbWFzdGVyX2h1Yl9saW5rOworICAgICAgICAvKiB0eXBlIG9mIGJyZCBjb25uZWN0ZWQrY29tcG9uZW50IHN0cnVjdCBwdHIrZmxhZ3MgKi8KK30ga2x4Ym93X3QgOworCisjZGVmaW5lIE1BWF9QQ0lfU0xPVFMgOAorCit0eXBlZGVmIHN0cnVjdCBrbHBjaV9kZXZpY2VfcyB7CisJczMyCXBjaV9kZXZpY2VfaWQ7CS8qIDMyIGJpdHMgb2YgdmVuZG9yL2RldmljZSBJRC4gKi8KKwlzMzIJcGNpX2RldmljZV9wYWQ7CS8qIDMyIGJpdHMgb2YgcGFkZGluZy4gKi8KK30ga2xwY2lfZGV2aWNlX3Q7CisKKyNkZWZpbmUgQlJJREdFX1NUUlVDVF9WRVJTSU9OCTIKKwordHlwZWRlZiBzdHJ1Y3Qga2xicmlfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCUklER0UgKi8KKwlrbGluZm9fdCAJYnJpX2luZm8gOworCXVuc2lnbmVkIGNoYXIJYnJpX2Vwcm9taW5mbyA7ICAgIC8qIElPNnByb20gY29ubmVjdGVkIHRvIGJyaWRnZSAqLworCXVuc2lnbmVkIGNoYXIJYnJpX2J1c3R5cGUgOyAgICAgIC8qIFBDSS9WTUUgQlVTIGJyaWRnZS9HSU8gKi8KKwlwY2lfdCAgICAJcGNpX3NwZWNpZmljICA7ICAgIC8qIFBDSSBCb2FyZCBjb25maWcgaW5mbyAqLworCWtscGNpX2RldmljZV90CWJyaV9kZXZpY2VzW01BWF9QQ0lfREVWU10gOwkvKiBQQ0kgSURzICovCisJa2xjb25mX29mZl90CWJyaV9tZmdfbmljIDsKK30ga2xicmlfdCA7CisKKyNkZWZpbmUgTUFYX0lPQzNfVFRZCTIKKwordHlwZWRlZiBzdHJ1Y3Qga2xpb2MzX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU9DMyAqLworCWtsaW5mb190IAlpb2MzX2luZm8gOworCXVuc2lnbmVkIGNoYXIJaW9jM19zc3JhbSA7ICAgICAgICAvKiBJbmZvIGFib3V0IHNzcmFtICovCisJdW5zaWduZWQgY2hhcglpb2MzX252cmFtIDsgICAgICAgIC8qIEluZm8gYWJvdXQgbnZyYW0gKi8KKwlrbGluZm9fdAlpb2MzX3N1cGVyaW8gOyAgICAgIC8qIEluZm8gYWJvdXQgc3VwZXJpbyAqLworCWtsY29uZl9vZmZfdAlpb2MzX3R0eV9vZmYgOworCWtsaW5mb190CWlvYzNfZW5ldCA7CisJa2xjb25mX29mZl90CWlvYzNfZW5ldF9vZmYgOworCWtsY29uZl9vZmZfdAlpb2MzX2tiZF9vZmYgOworfSBrbGlvYzNfdCA7CisKKyNkZWZpbmUgTUFYX1ZNRV9TTE9UUyA4CisKK3R5cGVkZWYgc3RydWN0IGtsdm1lYl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNRSBCUklER0UgLSBQQ0kgQ1RMUiAqLworCWtsaW5mb190IAl2bWViX2luZm8gOworCXZtZWJfdAkJdm1lYl9zcGVjaWZpYyA7CisJa2xjb25mX29mZl90ICAgCXZtZWJfYnJkaW5mb1tNQVhfVk1FX1NMT1RTXSAgIDsgICAgLyogVk1FIEJvYXJkIGNvbmZpZyBpbmZvICovCit9IGtsdm1lYl90IDsKKwordHlwZWRlZiBzdHJ1Y3Qga2x2bWVkX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVk1FIERFVklDRSAtIFZNRSBCT0FSRCAqLworCWtsaW5mb190CXZtZWRfaW5mbyA7CisJdm1lZF90CQl2bWVkX3NwZWNpZmljIDsKKwlrbGNvbmZfb2ZmX3QgICAJdm1lZF9icmRpbmZvW01BWF9WTUVfU0xPVFNdICAgOyAgICAvKiBWTUUgQm9hcmQgY29uZmlnIGluZm8gKi8KK30ga2x2bWVkX3QgOworCisjZGVmaW5lIFJPVVRFUl9WRUNUT1JfVkVSUwkyCisKKy8qIFhYWCAtIERvbid0IHdlIG5lZWQgdGhlIG51bWJlciBvZiBwb3J0cyBoZXJlPyE/ICovCit0eXBlZGVmIHN0cnVjdCBrbHJvdV9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJPVVRFUiAqLworCWtsaW5mb190IAlyb3VfaW5mbyA7CisJdW5zaWduZWQgaW50CQlyb3VfZmxhZ3MgOyAgICAgICAgICAgLyogUENGR19ST1VURVJfeHh4IGZsYWdzICovCisJbmljX3QJCXJvdV9ib3hfbmljIDsgICAgICAgICAvKiBuaWMgb2YgdGhlIGNvbnRhaW5pbmcgbW9kdWxlICovCisJa2xwb3J0X3QgCXJvdV9wb3J0W01BWF9ST1VURVJfUE9SVFMgKyAxXSA7IC8qIGFycmF5IGluZGV4IDEgdG8gNiAqLworCWtsY29uZl9vZmZfdAlyb3VfbWZnX25pYyA7ICAgICAvKiBNRkcgTklDIHN0cmluZyAqLworCXU2NAlyb3VfdmVjdG9yOwkgIC8qIHZlY3RvciBmcm9tIG1hc3RlciBub2RlICovCit9IGtscm91X3QgOworCisvKgorICogIEdyYXBoaWNzIENvbnRyb2xsZXIvRGV2aWNlCisgKgorICogIChJUDI3L0lPNikgUHJvbSB2ZXJzaW9ucyA2LjEzIChhbmQgNi41LjEga2VybmVscykgYW5kIGVhcmxpZXIKKyAqICB1c2VkIGEgY291cGxlIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIHRvIHN0b3JlIGdyYXBoaWNzIGluZm9ybWF0aW9uLgorICogIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHRoZSBuZXdlciBkYXRhIHN0cnVjdHVyZSBwcmVzZXJ2ZXMgc29tZQorICogIG9mIHRoZSBsYXlvdXQgc28gdGhhdCBmaWVsZHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgb2xkIHZlcnNpb25zIHJlbWFpbgorICogIGluIHRoZSBzYW1lIHBsYWNlICh3aXRoIHRoZSBzYW1lIGluZm8pLiAgRGV0ZXJtaW5hdGlvbiBvZiB3aGF0IHZlcnNpb24KKyAqICBvZiB0aGlzIHN0cnVjdHVyZSB3ZSBoYXZlIGlzIGRvbmUgYnkgY2hlY2tpbmcgdGhlIGNvb2tpZSBmaWVsZC4KKyAqLworI2RlZmluZSBLTEdGWF9DT09LSUUJMHgwYzBkZTAwMAorCit0eXBlZGVmIHN0cnVjdCBrbGdmeF9zIHsJCS8qIEdSQVBISUNTIERldmljZSAqLworCWtsaW5mb190IAlnZnhfaW5mbzsKKwlrbGNvbmZfb2ZmX3QgICAgb2xkX2duZGV2czsJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9tcyAqLworCWtsY29uZl9vZmZfdCAgICBvbGRfZ2RvZmYwOwkvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHByb21zICovCisJdW5zaWduZWQgaW50CQljb29raWU7CQkvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHByb21zICovCisJdW5zaWduZWQgaW50CQltb2R1bGVzbG90OworCXN0cnVjdCBrbGdmeF9zCSpnZnhfbmV4dF9waXBlOworCWdyYXBoaWNzX3QJZ2Z4X3NwZWNpZmljOworCWtsY29uZl9vZmZfdCAgICBwYWQwOwkJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9tcyAqLworCWtsY29uZl9vZmZfdCAgICBnZnhfbWZnX25pYzsKK30ga2xnZnhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga2x4dGhkX3MgeworCWtsaW5mb190IAl4dGhkX2luZm8gOworCWtsY29uZl9vZmZfdAl4dGhkX21mZ19uaWMgOyAgICAgICAgLyogTUZHIE5JQyBzdHJpbmcgKi8KK30ga2x4dGhkX3QgOworCit0eXBlZGVmIHN0cnVjdCBrbHRwdV9zIHsgICAgICAgICAgICAgICAgICAgICAvKiBUUFUgYm9hcmQgKi8KKwlrbGluZm9fdCAJdHB1X2luZm8gOworCWtsY29uZl9vZmZfdAl0cHVfbWZnX25pYyA7ICAgICAgICAvKiBNRkcgTklDIHN0cmluZyAqLworfSBrbHRwdV90IDsKKwordHlwZWRlZiBzdHJ1Y3Qga2xnc25fcyB7ICAgICAgICAgICAgICAgICAgICAgLyogR1NOIGJvYXJkICovCisJa2xpbmZvX3QgCWdzbl9pbmZvIDsKKwlrbGNvbmZfb2ZmX3QJZ3NuX21mZ19uaWMgOyAgICAgICAgLyogTUZHIE5JQyBzdHJpbmcgKi8KK30ga2xnc25fdCA7CisKKyNkZWZpbmUgTUFYX1NDU0lfREVWUyAxNgorCisvKgorICogTk9URTogVEhpcyBpcyB0aGUgbWF4IHNpemVkIGtsKiBzdHJ1Y3R1cmUgYW5kIGlzIHVzZWQgaW4ga2xtYWxsb2MuYworICogdG8gYWxsb2NhdGUgc3BhY2Ugb2YgdHlwZSBDT01QT05FTlQuIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBzaXplIG9mCisgKiBhbnkgb3RoZXIgY29tcG9uZW50IHN0cnVjdCBiZWNvbWVzIG1vcmUgdGhhbiB0aGlzLCB0aGVuIHJlZGVmaW5lCisgKiB0aGF0IGFzIHRoZSBzaXplIHRvIGJlIGtsbWFsbG9jZWQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qga2xzY3NpX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBDb250cm9sbGVyICovCisJa2xpbmZvX3QgCXNjc2lfaW5mbyA7CisJc2NzaV90ICAgICAgIAlzY3NpX3NwZWNpZmljICAgOworCXVuc2lnbmVkIGNoYXIgCXNjc2lfbnVtZGV2cyA7CisJa2xjb25mX29mZl90CXNjc2lfZGV2aW5mb1tNQVhfU0NTSV9ERVZTXSA7Cit9IGtsc2NzaV90IDsKKwordHlwZWRlZiBzdHJ1Y3Qga2xzY2Rldl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNDU0kgZGV2aWNlICovCisJa2xpbmZvX3QgCXNjZGV2X2luZm8gOworCXN0cnVjdCBzY3NpZGlza19kYXRhICpzY2Rldl9jZmcgOyAvKiBkcml2ZXIgZmlsbHMgdXAgdGhpcyAqLworfSBrbHNjZGV2X3QgOworCit0eXBlZGVmIHN0cnVjdCBrbHR0eWRldl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUWSBkZXZpY2UgKi8KKwlrbGluZm9fdCAJdHR5ZGV2X2luZm8gOworCXN0cnVjdCB0ZXJtaW5hbF9kYXRhICp0dHlkZXZfY2ZnIDsgLyogZHJpdmVyIGZpbGxzIHVwIHRoaXMgKi8KK30ga2x0dHlkZXZfdCA7CisKK3R5cGVkZWYgc3RydWN0IGtsZW5ldGRldl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVORVQgZGV2aWNlICovCisJa2xpbmZvX3QgCWVuZXRkZXZfaW5mbyA7CisJc3RydWN0IG5ldF9kYXRhICplbmV0ZGV2X2NmZyA7IC8qIGRyaXZlciBmaWxscyB1cCB0aGlzICovCit9IGtsZW5ldGRldl90IDsKKwordHlwZWRlZiBzdHJ1Y3Qga2xrYmRkZXZfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBLQkQgZGV2aWNlICovCisJa2xpbmZvX3QgCWtiZGRldl9pbmZvIDsKKwlzdHJ1Y3Qga2V5Ym9hcmRfZGF0YSAqa2JkZGV2X2NmZyA7IC8qIGRyaXZlciBmaWxscyB1cCB0aGlzICovCit9IGtsa2JkZGV2X3QgOworCit0eXBlZGVmIHN0cnVjdCBrbG1zZGV2X3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW91c2UgZGV2aWNlICovCisgICAgICAgIGtsaW5mb190ICAgICAgICBtc2Rldl9pbmZvIDsKKyAgICAgICAgdm9pZCAJCSptc2Rldl9jZmcgOworfSBrbG1zZGV2X3QgOworCisjZGVmaW5lIE1BWF9GRERJX0RFVlMgMTAgLyogWFhYIElzIHRoaXMgdHJ1ZSAqLworCit0eXBlZGVmIHN0cnVjdCBrbGZkZGlfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRERJICovCisJa2xpbmZvX3QgCWZkZGlfaW5mbyA7CisJZmRkaV90ICAgICAgICAJZmRkaV9zcGVjaWZpYyA7CisJa2xjb25mX29mZl90CWZkZGlfZGV2aW5mb1tNQVhfRkRESV9ERVZTXSA7Cit9IGtsZmRkaV90IDsKKwordHlwZWRlZiBzdHJ1Y3Qga2xtaW9fcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNSU8gKi8KKwlrbGluZm9fdCAJbWlvX2luZm8gOworCW1pb190ICAgICAgIAltaW9fc3BlY2lmaWMgICA7Cit9IGtsbWlvX3QgOworCisKK3R5cGVkZWYgdW5pb24ga2xjb21wX3MgeworCWtsY3B1X3QJCWtjX2NwdTsKKwlrbGh1Yl90CQlrY19odWI7CisJa2xtZW1ibmtfdCAJa2NfbWVtOworCWtseGJvd190ICAJa2NfeGJvdzsKKwlrbGJyaV90CQlrY19icmk7CisJa2xpb2MzX3QJa2NfaW9jMzsKKwlrbHZtZWJfdAlrY192bWViOworCWtsdm1lZF90CWtjX3ZtZWQ7CisJa2xyb3VfdAkJa2Nfcm91OworCWtsZ2Z4X3QJCWtjX2dmeDsKKwlrbHNjc2lfdAlrY19zY3NpOworCWtsc2NkZXZfdAlrY19zY3NpX2RldjsKKwlrbGZkZGlfdAlrY19mZGRpOworCWtsbWlvX3QJCWtjX21pbzsKKwlrbG1vZF9zZXJpYWxfbnVtX3Qga2Nfc251bSA7Cit9IGtsY29tcF90OworCit0eXBlZGVmIHVuaW9uIGtsZGV2X3MgeyAgICAgIC8qIGZvciBkZXZpY2Ugc3RydWN0dXJlIGFsbG9jYXRpb24gKi8KKwlrbHNjZGV2X3QJa2Nfc2NzaV9kZXYgOworCWtsdHR5ZGV2X3QJa2NfdHR5X2RldiA7CisJa2xlbmV0ZGV2X3QJa2NfZW5ldF9kZXYgOworCWtsa2JkZGV2X3QgCWtjX2tiZF9kZXYgOworfSBrbGRldl90IDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgaW50ZXJmYWNlIHJvdXRpbmVzLiBUQkQgKi8KKworLyogSW5jbHVkZSBsYXVuY2ggaW5mbyBpbiB0aGlzIGZpbGUgaXRzZWxmPyBUQkQgKi8KKworLyoKKyAqIFRCRCAtIENhbiB0aGUgQVJDUyBhbmQgZGV2aWNlIGRyaXZlciByZWxhdGVkIGluZm8gYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUKKyAqIEtMQ09ORklHIGFyZWEuIE9uIHRoZSBJTzRQUk9NLCBwcm9tIGRldmljZSBkcml2ZXIgaW5mbyBpcyBwYXJ0IG9mIGNmZ25vZGVfdAorICogc3RydWN0dXJlLCB2aXogcHJpdmF0ZSB0byB0aGUgSU80cHJvbS4KKyAqLworCisvKgorICogVEJEIC0gQWxsb2NhdGlvbiBpc3N1ZXMuCisgKgorICogRG8gd2UgbmVlZCB0byBNYXJrIG9mZiBzZXBhdGF0ZSBoZWFwcyBmb3IgbGJvYXJkX3QsIHJib2FyZF90LCBjb21wb25lbnQsCisgKiBlcnJpbmZvIGFuZCBhbGxvY2F0ZSBmcm9tIHRoZW0sIG9yIGhhdmUgYSBzaW5nbGUgaGVhcCBhbmQgYWxsb2NhdGUgYWxsCisgKiBzdHJ1Y3R1cmVzIGZyb20gaXQuIERlYnVnIGlzIGVhc2llciBpbiB0aGUgZm9ybWVyIG1ldGhvZCBzaW5jZSB3ZSBjYW4KKyAqIGR1bXAgYWxsIHNpbWlsYXIgc3RydWN0cyBpbiBvbmUgY29tbWFuZCwgYnV0IHRoZXJlIHdpbGwgYmUgbG90cyBvZiBob2xlcywKKyAqIGluIG1lbW9yeSBhbmQgbWF4IGxpbWl0cyBhcmUgbmVlZGVkIGZvciBudW1iZXIgb2Ygc3RydWN0dXJlcy4KKyAqIEFub3RoZXIgd2F5IHRvIG1ha2UgaXQgb3JnYW5pemVkLCBpcyB0byBoYXZlIGEgdW5pb24gb2YgYWxsIGNvbXBvbmVudHMKKyAqIGFuZCBhbGxvY2F0ZSBhIGFsaWduZWQgY2h1bmsgb2YgbWVtb3J5IGdyZWF0ZXIgdGhhbiB0aGUgYmlnZ2VzdAorICogY29tcG9uZW50LgorICovCisKK3R5cGVkZWYgdW5pb24geworCWxib2FyZF90ICpsYmluZm8gOworfSBiaXB0cl90IDsKKworCisjZGVmaW5lIEJSSV9QRVJfWEJPVyA2CisjZGVmaW5lIFBDSV9QRVJfQlJJICA4CisjZGVmaW5lIERFVl9QRVJfUENJICAxNgorCisKKy8qIFZpcnR1YWwgZGlwc3dpdGNoIHZhbHVlcyAoc3RhcnRpbmcgZnJvbSBzd2l0Y2ggIjciKTogKi8KKworI2RlZmluZSBWRFNfTk9HRlgJCTB4ODAwMAkvKiBEb24ndCBlbmFibGUgZ2Z4IGFuZCBhdXRvYm9vdCAqLworI2RlZmluZSBWRFNfTk9NUAkJMHgxMDAJLyogRG9uJ3Qgc3RhcnQgc2xhdmUgcHJvY2Vzc29ycyAqLworI2RlZmluZSBWRFNfTUFOVU1PREUJCTB4ODAJLyogTWFudWZhY3R1cmluZyBtb2RlICovCisjZGVmaW5lIFZEU19OT0FSQgkJMHg0MAkvKiBObyBib290bWFzdGVyIGFyYml0cmF0aW9uICovCisjZGVmaW5lIFZEU19QT0RNT0RFCQkweDIwCS8qIEdvIHN0cmFpZ2h0IHRvIFBPRCBtb2RlICovCisjZGVmaW5lIFZEU19OT19ESUFHUwkJMHgxMAkvKiBEb24ndCBydW4gYW55IGRpYWdzIGFmdGVyIEJNIGFyYiAqLworI2RlZmluZSBWRFNfREVGQVVMVFMJCTB4MDgJLyogVXNlIGRlZmF1bHQgZW52aXJvbm1lbnQgdmFsdWVzICovCisjZGVmaW5lIFZEU19OT01FTUNMRUFSCQkweDA0CS8qIERvbid0IHJ1biBtZW0gY2ZnIGNvZGUgKi8KKyNkZWZpbmUgVkRTXzJORF9JTzQJCTB4MDIJLyogQm9vdCBmcm9tIHRoZSBzZWNvbmQgSU80ICovCisjZGVmaW5lIFZEU19ERUJVR19QUk9NCQkweDAxCS8qIFByaW50IFBST00gZGVidWdnaW5nIG1lc3NhZ2VzICovCisKKy8qIGV4dGVybmFsIGRlY2xhcmF0aW9ucyBvZiBMaW51eCBrZXJuZWwgZnVuY3Rpb25zLiAqLworCitleHRlcm4gbGJvYXJkX3QgKmZpbmRfbGJvYXJkKGxib2FyZF90ICpzdGFydCwgdW5zaWduZWQgY2hhciB0eXBlKTsKK2V4dGVybiBrbGluZm9fdCAqZmluZF9jb21wb25lbnQobGJvYXJkX3QgKmJyZCwga2xpbmZvX3QgKmtsaSwgdW5zaWduZWQgY2hhciB0eXBlKTsKK2V4dGVybiBrbGluZm9fdCAqZmluZF9maXJzdF9jb21wb25lbnQobGJvYXJkX3QgKmJyZCwgdW5zaWduZWQgY2hhciB0eXBlKTsKK2V4dGVybiBrbGNwdV90ICpuYXNpZF9zbGljZV90b19jcHVpbmZvKG5hc2lkX3QsIGludCk7CitleHRlcm4gbGJvYXJkX3QgKmZpbmRfbGJvYXJkX2NsYXNzKGxib2FyZF90ICpzdGFydCwgdW5zaWduZWQgY2hhciBicmRfY2xhc3MpOworCisKK2V4dGVybiBrbGNwdV90ICpzbl9nZXRfY3B1aW5mbyhjcHVpZF90IGNwdSk7CisKKyNlbmRpZiAvKiBfQVNNX1NOX0tMQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24va2xkaXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9rbGRpci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL2tsZGlyLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9rbGRpci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2tsa2VybnZhcnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9rbGtlcm52YXJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24va2xrZXJudmFycy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24va2xrZXJudmFycy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2xhdW5jaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2xhdW5jaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL2xhdW5jaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbGF1bmNoLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9tYXBwZWRfa2VybmVsLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbWFwcGVkX2tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTQ5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbWFwcGVkX2tlcm5lbC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBGaWxlIGNyZWF0ZWQgYnkgS2Fub2ogU2FyY2FyIDA2LzA2LzAwLgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICovCisjaWZuZGVmIF9fQVNNX1NOX01BUFBFRF9LRVJORUxfSAorI2RlZmluZSBfX0FTTV9TTl9NQVBQRURfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorCisvKgorICogTm90ZSBvbiBob3cgbWFwcGVkIGtlcm5lbHMgd29yazogdGhlIHRleHQgYW5kIGRhdGEgc2VjdGlvbiBpcworICogY29tcGlsZWQgYXQgY2tzc2VnIHNlZ21lbnQgKExPQURBRERSID0gMHhjMDAxYzAwMCksIGFuZCB0aGUKKyAqIGluaXQvc2V0dXAvZGF0YSBzZWN0aW9uIGdldHMgYSAxNk0gdmlydHVhbCBhZGRyZXNzIGJ1bXAgaW4gdGhlCisgKiBsZC5zY3JpcHQgZmlsZSAoc28gdGhhdCB0bGJsbzAgYW5kIHRsYmxvMSBtYXBzIHRoZSBzZWN0aW9ucykuCisgKiBUaGUgdm1saW51eC42NCBzZWN0aW9uIGFkZHJlc3NlcyBhcmUgcHV0IGluIHRoZSB4a3NlZyByYW5nZQorICogdXNpbmcgdGhlIGNoYW5nZS1hZGRyZXNzZXMgbWFrZWZpbGUgb3B0aW9uLiBVc2UgZWxmZHVtcCAtb2YKKyAqIG9uIElSSVggdG8gc2VlIHdoZXJlIHRoZSBzZWN0aW9ucyBnby4gVGhlIE9yaWdpbiBsb2FkZXIgbG9hZHMKKyAqIHRoZSB0d28gc2VjdGlvbnMgY29udGlndW91c2x5IGluIHBoeXNpY2FsIG1lbW9yeS4gVGhlIGxvYWRlcgorICogc2V0cyB0aGUgZW50cnkgcG9pbnQgaW50byBrZXJuZWxfZW50cnkgdXNpbmcgYSB4a3BoeXMgYWRkcmVzcywKKyAqIGJ1dCBpbnN0ZWFkIG9mIHVzaW5nIDB4YTgwMDAwMDAwMTE2MDAwMCwgaXQgdXNlcyB0aGUgYWRkcmVzcworICogMHhhODAwMDAwMDAwMTYwMDAwLCB3aGljaCBpcyB3aGVyZSBpdCBwaHlzaWNhbGx5IGxvYWRlZCB0aGF0CisgKiBjb2RlLiBTbyBubyBqdW1wcyBjYW4gYmUgZG9uZSBiZWZvcmUgd2UgaGF2ZSBzd2l0Y2hlZCB0byB1c2luZworICogY2tzc2VnIGFkZHJlc3Nlcy4KKyAqLworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKworI2RlZmluZSBSRVBfQkFTRQlDQUNfQkFTRQorCisjaWZkZWYgQ09ORklHX01BUFBFRF9LRVJORUwKKworI2RlZmluZSBNQVBQRURfQUREUl9ST19UT19QSFlTKHgpCSh4IC0gUkVQX0JBU0UpCisjZGVmaW5lIE1BUFBFRF9BRERSX1JXX1RPX1BIWVMoeCkJKHggLSBSRVBfQkFTRSAtIDE2Nzc3MjE2KQorCisjZGVmaW5lIE1BUFBFRF9LRVJOX1JPX1BIWVNCQVNFKG4pIChodWJfZGF0YShuKS0+a2Vybl92YXJzLmt2X3JvX2Jhc2VhZGRyKQorI2RlZmluZSBNQVBQRURfS0VSTl9SV19QSFlTQkFTRShuKSAoaHViX2RhdGEobiktPmtlcm5fdmFycy5rdl9yd19iYXNlYWRkcikKKworI2RlZmluZSBNQVBQRURfS0VSTl9ST19UT19QSFlTKHgpIFwKKwkJCQkoKHVuc2lnbmVkIGxvbmcpTUFQUEVEX0FERFJfUk9fVE9fUEhZUyh4KSB8IFwKKwkJCQlNQVBQRURfS0VSTl9ST19QSFlTQkFTRShnZXRfY29tcGFjdF9ub2RlaWQoKSkpCisjZGVmaW5lIE1BUFBFRF9LRVJOX1JXX1RPX1BIWVMoeCkgXAorCQkJCSgodW5zaWduZWQgbG9uZylNQVBQRURfQUREUl9SV19UT19QSFlTKHgpIHwgXAorCQkJCU1BUFBFRF9LRVJOX1JXX1BIWVNCQVNFKGdldF9jb21wYWN0X25vZGVpZCgpKSkKKworI2Vsc2UgLyogQ09ORklHX01BUFBFRF9LRVJORUwgKi8KKworI2RlZmluZSBNQVBQRURfS0VSTl9ST19UT19QSFlTKHgpCSh4IC0gUkVQX0JBU0UpCisjZGVmaW5lIE1BUFBFRF9LRVJOX1JXX1RPX1BIWVMoeCkJKHggLSBSRVBfQkFTRSkKKworI2VuZGlmIC8qIENPTkZJR19NQVBQRURfS0VSTkVMICovCisKKyNkZWZpbmUgTUFQUEVEX0tFUk5fUk9fVE9fSzAoeCkJUEhZU19UT19LMChNQVBQRURfS0VSTl9ST19UT19QSFlTKHgpKQorI2RlZmluZSBNQVBQRURfS0VSTl9SV19UT19LMCh4KQlQSFlTX1RPX0swKE1BUFBFRF9LRVJOX1JXX1RPX1BIWVMoeCkpCisKKyNlbmRpZiAvKiBfX0FTTV9TTl9NQVBQRURfS0VSTkVMX0ggICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL25taS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL25taS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL25taS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbm1pLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc24wL2FkZHJzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vc24wL2FkZHJzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vc24wL2FkZHJzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvYWRkcnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9zbjAvYXJjaC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9hcmNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vc24wL2FyY2guaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9hcmNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc24wL2h1Yi5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9odWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbi9zbjAvaHViLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHViLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHViaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHViaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGMyOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9odWJpby5oCkBAIC0wLDAgKzEsOTcyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRGVyaXZlZCBmcm9tIElSSVggPHN5cy9TTi9TTjAvaHViaW8uaD4sIFJldmlzaW9uIDEuODAuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUmFsZiBCYWVjaGxlCisgKi8KKyNpZm5kZWYJX0FTTV9TR0lfU05fU04wX0hVQklPX0gKKyNkZWZpbmUJX0FTTV9TR0lfU05fU04wX0hVQklPX0gKKworLyoKKyAqIEh1YiBJL08gaW50ZXJmYWNlIHJlZ2lzdGVycworICoKKyAqIEFsbCByZWdpc3RlcnMgaW4gdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSB1bnRpbCBIdWIgY2hpcCB0YXBlb3V0LgorICogSW4gZ2VuZXJhbCwgdGhlIGxvbmdlciBzb2Z0d2FyZSBuYW1lIHNob3VsZCBiZSB1c2VkIHdoZW4gYXZhaWxhYmxlLgorICovCisKKy8qCisgKiBTbGlnaHRseSBmcmllbmRsaWVyIG5hbWVzIGZvciBzb21lIGNvbW1vbiByZWdpc3RlcnMuCisgKiBUaGUgaGFyZHdhcmUgZGVmaW5pdGlvbnMgZm9sbG93LgorICovCisjZGVmaW5lIElJT19XSURHRVQJCUlJT19XSUQgICAgICAvKiBXaWRnZXQgaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgSUlPX1dJREdFVF9TVEFUCQlJSU9fV1NUQVQgICAgLyogV2lkZ2V0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJSU9fV0lER0VUX0NUUkwJCUlJT19XQ1IJICAgICAvKiBXaWRnZXQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJSU9fV0lER0VUX1RPVVQJCUlJT19XUlRPICAgICAvKiBXaWRnZXQgcmVxdWVzdCB0aW1lb3V0ICovCisjZGVmaW5lIElJT19XSURHRVRfRkxVU0gJSUlPX1dURlIgICAgIC8qIFdpZGdldCB0YXJnZXQgZmx1c2ggKi8KKyNkZWZpbmUgSUlPX1BST1RFQ1QJCUlJT19JTEFQUiAgICAvKiBJTyBpbnRlcmZhY2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSBJSU9fUFJPVEVDVF9PVlJSRAlJSU9fSUxBUE8gICAgLyogSU8gcHJvdGVjdCBvdmVycmlkZSAqLworI2RlZmluZSBJSU9fT1VUV0lER0VUX0FDQ0VTUwlJSU9fSU9XQSAgICAgLyogT3V0Ym91bmQgd2lkZ2V0IGFjY2VzcyAqLworI2RlZmluZSBJSU9fSU5XSURHRVRfQUNDRVNTCUlJT19JSVdBICAgICAvKiBJbmJvdW5kIHdpZGdldCBhY2Nlc3MgKi8KKyNkZWZpbmUgSUlPX0lOREVWX0VSUl9NQVNLCUlJT19JSURFTSAgICAvKiBJbmJvdW5kIGRldmljZSBlcnJvciBtYXNrICovCisjZGVmaW5lIElJT19MTFBfQ1NSCQlJSU9fSUxDU1IgICAgLyogTExQIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworI2RlZmluZSBJSU9fTExQX0xPRwkJSUlPX0lMTFIgICAgIC8qIExMUCBsb2cgKi8KKyNkZWZpbmUgSUlPX1hUQUxLQ0NfVE9VVAlJSU9fSVhDQyAgICAgLyogWHRhbGsgY3JlZGl0IGNvdW50IHRpbWVvdXQqLworI2RlZmluZSBJSU9fWFRBTEtUVF9UT1VUCUlJT19JWFRUICAgICAvKiBYdGFsayB0YWlsIHRpbWVvdXQgKi8KKyNkZWZpbmUgSUlPX0lPX0VSUl9DTFIJCUlJT19JRUNMUiAgICAvKiBJTyBlcnJvciBjbGVhciAqLworI2RlZmluZSBJSU9fQlRFX0NSQl9DTlQgICAgICAgICBJSU9fSUJDTiAgICAgLyogSU8gQlRFIENSQiBjb3VudCAqLworCisjZGVmaW5lIElJT19MTFBfQ1NSX0lTX1VQCQkweDAwMDAyMDAwCisjZGVmaW5lCUlJT19MTFBfQ1NSX0xMUF9TVEFUX01BU0sJMHgwMDAwMzAwMAorI2RlZmluZQlJSU9fTExQX0NTUl9MTFBfU1RBVF9TSEZUCTEyCisKKy8qIGtleSB0byBJSU9fUFJPVEVDVF9PVlJSRCAqLworI2RlZmluZSBJSU9fUFJPVEVDVF9PVlJSRF9LRVkJMHg1MzQ3NDk3Mjc1NmM2NTczdWxsCS8qICJTR0lydWxlcyIgKi8KKworLyogQlRFIHJlZ2lzdGVyIG5hbWVzICovCisjZGVmaW5lIElJT19CVEVfU1RBVF8wCQlJSU9fSUJMU18wICAgLyogQWxzbyBCVEUgbGVuZ3RoL3N0YXR1cyAwICovCisjZGVmaW5lIElJT19CVEVfU1JDXzAJCUlJT19JQlNBXzAgICAvKiBBbHNvIEJURSBzb3VyY2UgYWRkcmVzcyAgMCAqLworI2RlZmluZSBJSU9fQlRFX0RFU1RfMAkJSUlPX0lCREFfMCAgIC8qIEFsc28gQlRFIGRlc3QuIGFkZHJlc3MgMCAqLworI2RlZmluZSBJSU9fQlRFX0NUUkxfMAkJSUlPX0lCQ1RfMCAgIC8qIEFsc28gQlRFIGNvbnRyb2wvdGVybWluYXRlIDAgKi8KKyNkZWZpbmUgSUlPX0JURV9OT1RJRllfMCAJSUlPX0lCTkFfMCAgIC8qIEFsc28gQlRFIG5vdGlmaWNhdGlvbiAwICovCisjZGVmaW5lIElJT19CVEVfSU5UXzAJCUlJT19JQklBXzAgICAvKiBBbHNvIEJURSBpbnRlcnJ1cHQgMCAqLworI2RlZmluZSBJSU9fQlRFX09GRl8wCQkwCSAgICAgLyogQmFzZSBvZmZzZXQgZnJvbSBCVEUgMCByZWdzLiAqLworI2RlZmluZSBJSU9fQlRFX09GRl8xCUlJT19JQkxTXzEgLSBJSU9fSUJMU18wIC8qIE9mZnNldCBmcm9tIGJhc2UgdG8gQlRFIDEgKi8KKworLyogQlRFIHJlZ2lzdGVyIG9mZnNldHMgZnJvbSBiYXNlICovCisjZGVmaW5lIEJURU9GRl9TVEFUCQkwCisjZGVmaW5lIEJURU9GRl9TUkMJCShJSU9fQlRFX1NSQ18wIC0gSUlPX0JURV9TVEFUXzApCisjZGVmaW5lIEJURU9GRl9ERVNUCQkoSUlPX0JURV9ERVNUXzAgLSBJSU9fQlRFX1NUQVRfMCkKKyNkZWZpbmUgQlRFT0ZGX0NUUkwJCShJSU9fQlRFX0NUUkxfMCAtIElJT19CVEVfU1RBVF8wKQorI2RlZmluZSBCVEVPRkZfTk9USUZZCQkoSUlPX0JURV9OT1RJRllfMCAtIElJT19CVEVfU1RBVF8wKQorI2RlZmluZSBCVEVPRkZfSU5UCQkoSUlPX0JURV9JTlRfMCAtIElJT19CVEVfU1RBVF8wKQorCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHVzZSB0aGUgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSU8gaW50ZXJmYWNlCisgKiBkb2N1bWVudCBmb3IgZWFzZSBvZiByZWZlcmVuY2UuICBXaGVuIHBvc3NpYmxlLCBzb2Z0d2FyZSBzaG91bGQKKyAqIGdlbmVyYWxseSB1c2UgdGhlIGxvbmdlciBidXQgY2xlYXJlciBuYW1lcyBkZWZpbmVkIGFib3ZlLgorICovCisKKyNkZWZpbmUgSUlPX0JBU0UJMHg0MDAwMDAKKyNkZWZpbmUgSUlPX0JBU0VfQlRFMAkweDQxMDAwMAorI2RlZmluZSBJSU9fQkFTRV9CVEUxCTB4NDIwMDAwCisjZGVmaW5lIElJT19CQVNFX1BFUkYJMHg0MzAwMDAKKyNkZWZpbmUgSUlPX1BFUkZfQ05UCTB4NDMwMDA4CisKKyNkZWZpbmUgSU9fUEVSRl9TRVRTCTMyCisKKyNkZWZpbmUgSUlPX1dJRAkJMHg0MDAwMDAJLyogV2lkZ2V0IGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIElJT19XU1RBVAkweDQwMDAwOAkvKiBXaWRnZXQgc3RhdHVzICovCisjZGVmaW5lIElJT19XQ1IJCTB4NDAwMDIwCS8qIFdpZGdldCBjb250cm9sICovCisKKyNkZWZpbmUJSUlPX1dTVEFUX0VDUkFaWQkoMVVMTCA8PCAzMikJLyogSHViIGdvbmUgY3JhenkgKi8KKyNkZWZpbmUJSUlPX1dTVEFUX1RYUkVUUlkJKDFVTEwgPDwgOSkJLyogSHViIFR4IFJldHJ5IHRpbWVvdXQgKi8KKyNkZWZpbmUJSUlPX1dTVEFUX1RYUkVUUllfTUFTSwkoMHg3RikKKyNkZWZpbmUJSUlPX1dTVEFUX1RYUkVUUllfU0hGVAkoMTYpCisjZGVmaW5lCUlJT19XU1RBVF9UWFJFVFJZX0NOVCh3KQkoKCh3KSA+PiBJSU9fV1NUQVRfVFhSRVRSWV9TSEZUKSAmIFwKKwkJCQkJICBJSU9fV1NUQVRfVFhSRVRSWV9NQVNLKQorCisjZGVmaW5lIElJT19JTEFQUgkweDQwMDEwMAkvKiBMb2NhbCBBY2Nlc3MgUHJvdGVjdGlvbiAqLworI2RlZmluZSBJSU9fSUxBUE8JMHg0MDAxMDgJLyogUHJvdGVjdGlvbiBvdmVycmlkZSAqLworI2RlZmluZSBJSU9fSU9XQQkweDQwMDExMAkvKiBvdXRib3VuZCB3aWRnZXQgYWNjZXNzICovCisjZGVmaW5lIElJT19JSVdBCTB4NDAwMTE4CS8qIGluYm91bmQgd2lkZ2V0IGFjY2VzcyAqLworI2RlZmluZSBJSU9fSUlERU0JMHg0MDAxMjAJLyogSW5ib3VuZCBEZXZpY2UgRXJyb3IgTWFzayAqLworI2RlZmluZSBJSU9fSUxDU1IJMHg0MDAxMjgJLyogTExQIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworI2RlZmluZSBJSU9fSUxMUgkweDQwMDEzMAkvKiBMTFAgTG9nICovCisjZGVmaW5lIElJT19JSURTUgkweDQwMDEzOAkvKiBJbnRlcnJ1cHQgZGVzdGluYXRpb24gKi8KKworI2RlZmluZSBJSU9fSUlCVVNFUlIJMHgxNDAwMjA4CS8qIFJlYWRzIGhlcmUgY2F1c2UgYSBidXMgZXJyb3IuICovCisKKy8qIElPIEludGVycnVwdCBEZXN0aW5hdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBJSU9fSUlEU1JfU0VOVF9TSElGVAkyOAorI2RlZmluZSBJSU9fSUlEU1JfU0VOVF9NQVNLCTB4MTAwMDAwMDAKKyNkZWZpbmUgSUlPX0lJRFNSX0VOQl9TSElGVAkyNAorI2RlZmluZSBJSU9fSUlEU1JfRU5CX01BU0sJMHgwMTAwMDAwMAorI2RlZmluZSBJSU9fSUlEU1JfTk9ERV9TSElGVAk4CisjZGVmaW5lIElJT19JSURTUl9OT0RFX01BU0sJMHgwMDAwZmYwMAorI2RlZmluZSBJSU9fSUlEU1JfTFZMX1NISUZUCTAKKyNkZWZpbmUgSUlPX0lJRFNSX0xWTF9NQVNLCTB4MDAwMDAwM2YKKworCisvKiBHRlggRmxvdyBDb250cm9sIE5vZGUvV2lkZ2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIElJT19JR0ZYXzAJMHg0MDAxNDAJLyogZ2Z4IG5vZGUvd2lkZ2V0IHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgSUlPX0lHRlhfMQkweDQwMDE0OAkvKiBnZnggbm9kZS93aWRnZXQgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBJSU9fSUdGWF9XX05VTV9CSVRTCTQJLyogc2l6ZSBvZiB3aWRnZXQgbnVtIGZpZWxkICovCisjZGVmaW5lIElJT19JR0ZYX1dfTlVNX01BU0sJKCgxPDxJSU9fSUdGWF9XX05VTV9CSVRTKS0xKQorI2RlZmluZSBJSU9fSUdGWF9XX05VTV9TSElGVAkwCisjZGVmaW5lIElJT19JR0ZYX05fTlVNX0JJVFMJOQkvKiBzaXplIG9mIG5vZGUgbnVtIGZpZWxkICovCisjZGVmaW5lIElJT19JR0ZYX05fTlVNX01BU0sJKCgxPDxJSU9fSUdGWF9OX05VTV9CSVRTKS0xKQorI2RlZmluZSBJSU9fSUdGWF9OX05VTV9TSElGVAk0CisjZGVmaW5lIElJT19JR0ZYX1BfTlVNX0JJVFMJMQkvKiBzaXplIG9mIHByb2Nlc3NvciBudW0gZmllbGQgKi8KKyNkZWZpbmUgSUlPX0lHRlhfUF9OVU1fTUFTSwkoKDE8PElJT19JR0ZYX1BfTlVNX0JJVFMpLTEpCisjZGVmaW5lIElJT19JR0ZYX1BfTlVNX1NISUZUCTE2CisjZGVmaW5lIElJT19JR0ZYX1ZMRF9CSVRTCTEJLyogc2l6ZSBvZiB2YWxpZCBmaWVsZCAqLworI2RlZmluZSBJSU9fSUdGWF9WTERfTUFTSwkoKDE8PElJT19JR0ZYX1ZMRF9CSVRTKS0xKQorI2RlZmluZSBJSU9fSUdGWF9WTERfU0hJRlQJMjAKKyNkZWZpbmUgSUlPX0lHRlhfSU5JVCh3aWRnZXQsIG5vZGUsIGNwdSwgdmFsaWQpCQkJCShcCisJKCgod2lkZ2V0KSAmIElJT19JR0ZYX1dfTlVNX01BU0spIDw8IElJT19JR0ZYX1dfTlVNX1NISUZUKSB8CSBcCisJKCgobm9kZSkgICAmIElJT19JR0ZYX05fTlVNX01BU0spIDw8IElJT19JR0ZYX05fTlVNX1NISUZUKSB8CSBcCisJKCgoY3B1KSAgICAmIElJT19JR0ZYX1BfTlVNX01BU0spIDw8IElJT19JR0ZYX1BfTlVNX1NISUZUKSB8CSBcCisJKCgodmFsaWQpICAmIElJT19JR0ZYX1ZMRF9NQVNLKSAgIDw8IElJT19JR0ZYX1ZMRF9TSElGVCkJICkKKworLyogU2NyYXRjaCByZWdpc3RlcnMgKG5vdCBhbGwgYml0cyBhdmFpbGFibGUpICovCisjZGVmaW5lIElJT19TQ1JBVENIX1JFRzAJMHg0MDAxNTAKKyNkZWZpbmUJSUlPX1NDUkFUQ0hfUkVHMQkweDQwMDE1OAorI2RlZmluZSBJSU9fU0NSQVRDSF9NQVNLCTB4MDAwMDAwMGYwMGYxMWZmZgorCisjZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfMAkweDAwMDAwMDA4MDAwMDAwMDAKKyNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF8xCTB4MDAwMDAwMDQwMDAwMDAwMAorI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzIJMHgwMDAwMDAwMjAwMDAwMDAwCisjZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfMwkweDAwMDAwMDAxMDAwMDAwMDAKKyNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF80CTB4MDAwMDAwMDAwMDgwMDAwMAorI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzUJMHgwMDAwMDAwMDAwNDAwMDAwCisjZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfNgkweDAwMDAwMDAwMDAyMDAwMDAKKyNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF83CTB4MDAwMDAwMDAwMDEwMDAwMAorI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzgJMHgwMDAwMDAwMDAwMDEwMDAwCisjZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfOQkweDAwMDAwMDAwMDAwMDEwMDAKKyNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF9SCTB4MDAwMDAwMDAwMDAwMGZmZgorCisvKiBJTyBUcmFuc2xhdGlvbiBUYWJsZSBFbnRyaWVzICovCisjZGVmaW5lIElJT19OVU1fSVRURVMJNwkJLyogSVRURXMgbnVtYmVyZWQgMC4uNiAqLworCQkJCQkvKiBIdyBtYW51YWxzIG51bWJlciB0aGVtIDEuLjchICovCisKKy8qCisgKiBBcyBhIHBlcm1hbmVudCB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB0aGUgUEkgc2lkZSBvZiB0aGUgaHViLCB3ZSd2ZQorICogcmVkZWZpbmVkIGJpZyB3aW5kb3cgNyBhcyBzbWFsbCB3aW5kb3cgMC4KKyAqLworI2RlZmluZSBIVUJfTlVNX0JJR19XSU5ET1cJSUlPX05VTV9JVFRFUyAtIDEKKworLyoKKyAqIFVzZSB0aGUgdG9wIGJpZyB3aW5kb3cgYXMgYSBzdXJyb2dhdGUgZm9yIHRoZSBmaXJzdCBzbWFsbCB3aW5kb3cKKyAqLworI2RlZmluZSBTV0lOMF9CSUdXSU4JCUhVQl9OVU1fQklHX1dJTkRPVworCisjZGVmaW5lIElMQ1NSX1dBUk1fUkVTRVQJMHgxMDAKKy8qCisgKiBUaGUgSU8gTExQIGNvbnRyb2wgc3RhdHVzIHJlZ2lzdGVyIGFuZCB3aWRnZXQgY29udHJvbCByZWdpc3RlcgorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuaW9uIGh1YmlpX3dpZF91IHsKKwl1NjQJd2lkX3JlZ192YWx1ZTsKKwlzdHJ1Y3QgeworCQl1NjQgCXdpZF9yc3ZkOiAJMzIsCS8qIHVudXNlZCAqLworCQkJd2lkX3Jldl9udW06CSA0LAkvKiByZXZpc2lvbiBudW1iZXIgKi8KKwkJCXdpZF9wYXJ0X251bToJMTYsCS8qIHRoZSB3aWRnZXQgdHlwZTogaHViPWMxMDEgKi8KKwkJCXdpZF9tZmdfbnVtOgkxMSwJLyogTWFudWZhY3R1cmVyIGlkIChJQk0pICovCisJCQl3aWRfcnN2ZDE6CSAxOwkvKiBSZXNlcnZlZCAqLworICAgICAgICB9IHdpZF9maWVsZHNfczsKK30gaHViaWlfd2lkX3Q7CisKKwordHlwZWRlZiB1bmlvbiBodWJpaV93Y3JfdSB7CisJdTY0CXdjcl9yZWdfdmFsdWU7CisJc3RydWN0IHsKKwkJdTY0IAl3Y3JfcnN2ZDogCTQxLAkvKiB1bnVzZWQgKi8KKwkJCXdjcl9lX3RocmVzaDoJIDUsCS8qIGVsYXN0aWNpdHkgdGhyZXNob2xkICovCisJCQl3Y3JfZGlyX2NvbjoJIDEsCS8qIHdpZGdldCBkaXJlY3QgY29ubmVjdCAqLworCQkJd2NyX2ZfYmFkX3BrdDoJIDEsCS8qIEZvcmNlIGJhZCBsbHAgcGt0IGVuYWJsZSAqLworCQkJd2NyX3hiYXJfY3JkOgkgMywJLyogTExQIGNyb3NzYmFyIGNyZWRpdCAqLworCQkJd2NyX3JzdmQxOgkgOCwJLyogUmVzZXJ2ZWQgKi8KKwkJCXdjcl90YWdfbW9kZTogICAgMSwJLyogVGFnIG1vZGUgKi8KKwkJCXdjcl93aWRnZXRfaWQ6CSA0OwkvKiBMTFAgY3Jvc3NiYXIgY3JlZGl0ICovCisgICAgICAgIH0gd2NyX2ZpZWxkc19zOworfSBodWJpaV93Y3JfdDsKKworI2RlZmluZQlpd2NyX2Rpcl9jb24Jd2NyX2ZpZWxkc19zLndjcl9kaXJfY29uCisKK3R5cGVkZWYgdW5pb24gaHViaWlfd3N0YXRfdSB7CisJdTY0ICAgICAgcmVnX3ZhbHVlOworCXN0cnVjdCB7CisJCXU2NAlyc3ZkMToJCTMxLAorCQkJY3Jhenk6CQkgMSwJLyogQ3JhenkgYml0CQkqLworCQkJcnN2ZDI6CQkgOCwKKwkJCWxscF90eF9jbnQ6CSA4LCAJLyogTExQIFhtaXQgcmV0cnkgY291bnRlciAqLworCQkJcnN2ZDM6CQkgNiwKKwkJCXR4X21heF9ydHJ5OgkgMSwJLyogTExQIFJldHJ5IFRpbWVvdXQgU2lnbmFsICovCisJCQlyc3ZkNDoJCSAyLAorCQkJeHRfdGFpbF90bzoJIDEsCS8qIFh0YWxrIFRhaWwgVGltZW91dAkqLworCQkJeHRfY3JkX3RvOgkgMSwJLyogWHRhbGsgQ3JlZGl0IFRpbWVvdXQJKi8KKwkJCXBlbmRpbmc6CSA0OwkvKiBQZW5kaW5nIFJlcXVlc3RzCSovCisJfSB3c3RhdF9maWVsZHNfczsKK30gaHViaWlfd3N0YXRfdDsKKworCit0eXBlZGVmIHVuaW9uIGh1YmlpX2lsY3NyX3UgeworCXU2NAlpY3NyX3JlZ192YWx1ZTsKKwlzdHJ1Y3QgeworCQl1NjQgCWljc3JfcnN2ZDogCTIyLAkvKiB1bnVzZWQgKi8KKwkJCWljc3JfbWF4X2J1cnN0OgkxMCwJLyogbWF4IGJ1cnN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpY3NyX3JzdmQ0OgkgNiwJLyogcmVzZXJ2ZWQgKi8KKwkJCWljc3JfbWF4X3JldHJ5OgkxMCwJLyogbWF4IHJldHJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpY3NyX3JzdmQzOgkgMiwJLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGljc3JfbG5rX3N0YXQ6CSAyLAkvKiBsaW5rIHN0YXR1cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWNzcl9ibTg6CSAxLAkvKiBCaXQgbW9kZSA4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpY3NyX2xscF9lbjoJIDEsCS8qIExMUCBlbmFibGUgYml0ICovCisJCQlpY3NyX3JzdmQyOgkgMSwgICAgIC8qIHJlc2VydmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpY3NyX3dybV9yZXNldDoJIDEsCS8qIFdhcm0gcmVzZXQgYml0ICovCisJCQlpY3NyX3JzdmQxOgkgMiwJLyogRGF0YSByZWFkeSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGljc3JfbnVsbF90bzoJIDY7CS8qIE51bGwgdGltZW91dCAgICovCisKKyAgICAgICAgfSBpY3NyX2ZpZWxkc19zOworfSBodWJpaV9pbGNzcl90OworCisKK3R5cGVkZWYgdW5pb24gaHViaWlfaW93YV91IHsKKwl1NjQJaW93YV9yZWdfdmFsdWU7CisJc3RydWN0IHsKKwkJdTY0IAlpb3dhX3JzdmQ6IAk0OCwJLyogdW51c2VkICovCisJCQlpb3dhX3d4b2FjOgkgOCwJLyogeHRhbGsgd2lkZ2V0IGFjY2VzcyBiaXRzICovCisJCQlpb3dhX3JzdmQxOgkgNywJLyogeHRhbGsgd2lkZ2V0IGFjY2VzcyBiaXRzICovCisJCQlpb3dhX3cwb2FjOgkgMTsJLyogeHRhbGsgd2lkZ2V0IGFjY2VzcyBiaXRzICovCisgICAgICAgIH0gaW93YV9maWVsZHNfczsKK30gaHViaWlfaW93YV90OworCit0eXBlZGVmIHVuaW9uIGh1YmlpX2lpd2FfdSB7CisJdTY0CWlpd2FfcmVnX3ZhbHVlOworCXN0cnVjdCB7CisJCXU2NCAJaWl3YV9yc3ZkOiAJNDgsCS8qIHVudXNlZCAqLworCQkJaWl3YV93eGlhYzoJIDgsCS8qIGh1YiB3aWQgYWNjZXNzIGJpdHMgKi8KKwkJCWlpd2FfcnN2ZDE6CSA3LAkvKiByZXNlcnZlZCAqLworCQkJaWl3YV93MGlhYzoJIDE7CS8qIGh1YiB3aWQwIGFjY2VzcyAqLworICAgICAgICB9IGlpd2FfZmllbGRzX3M7Cit9IGh1YmlpX2lpd2FfdDsKKwordHlwZWRlZiB1bmlvbglodWJpaV9pbGxyX3UgeworCXU2NAlpbGxyX3JlZ192YWx1ZTsKKwlzdHJ1Y3QgeworCQl1NjQgCWlsbHJfcnN2ZDogCTMyLAkvKiB1bnVzZWQgKi8KKwkJCWlsbHJfY2JfY250OgkxNiwJLyogY2hlY2tiaXQgZXJyb3IgY291bnQgKi8KKwkJCWlsbHJfc25fY250OgkxNjsJLyogc2VxdWVuY2UgbnVtYmVyIGNvdW50ICovCisgICAgICAgIH0gaWxscl9maWVsZHNfczsKK30gaHViaWlfaWxscl90OworCisvKiBUaGUgc3RydWN0dXJlcyBiZWxvdyBhcmUgZGVmaW5lZCB0byBleHRyYWN0IGFuZCBtb2RpZnkgdGhlIGlpCitwZXJmb3JtYW5jZSByZWdpc3RlcnMgKi8KKworLyogaW9fcGVyZl9zZWwgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSB3aGF0IHRlc3RzIHdpbGwgYmUKKyAgIHBlcmZvcm1lZCAqLwordHlwZWRlZiB1bmlvbiBpb19wZXJmX3NlbCB7CisJdTY0IHBlcmZfc2VsX3JlZzsKKwlzdHJ1Y3QgeworCQl1NjQgCXBlcmZfcnN2ZCAgOiA0OCwKKwkJCXBlcmZfaWNjdCAgOiAgOCwKKwkJCXBlcmZfaXBwcjEgOiAgNCwKKwkJCXBlcmZfaXBwcjAgOiAgNDsKKwl9IHBlcmZfc2VsX2JpdHM7Cit9IGlvX3BlcmZfc2VsX3Q7CisKKy8qIGlvX3BlcmZfY250IGlzIHRvIGV4dHJhY3QgdGhlIGNvdW50IGZyb20gdGhlIGh1YiByZWdpc3RlcnMuIER1ZSB0bworICAgaGFyZHdhcmUgcHJvYmxlbXMgdGhlcmUgaXMgb25seSBvbmUgY291bnRlciwgbm90IHR3by4gKi8KKwordHlwZWRlZiB1bmlvbiBpb19wZXJmX2NudCB7CisJdTY0CXBlcmZfY250OworCXN0cnVjdCB7CisJCXU2NAlwZXJmX3JzdmQxIDogMzIsCisJCQlwZXJmX3JzdmQyIDogMTIsCisJCQlwZXJmX2NudCAgIDogMjA7CisJfSBwZXJmX2NudF9iaXRzOworfSBpb19wZXJmX2NudF90OworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisKKyNkZWZpbmUgTE5LX1NUQVRfV09SS0lORwkweDIKKworI2RlZmluZSBJSU9fTExQX0NCX01BWAkweGZmZmYKKyNkZWZpbmUgSUlPX0xMUF9TTl9NQVgJMHhmZmZmCisKKy8qIElPIFBSQiBFbnRyaWVzICovCisjZGVmaW5lCUlJT19OVU1fSVBSQlMJKDkpCisjZGVmaW5lIElJT19JT1BSQl8wCTB4NDAwMTk4CS8qIFBSQiBlbnRyeSAwICovCisjZGVmaW5lIElJT19JT1BSQl84CTB4NDAwMWEwCS8qIFBSQiBlbnRyeSA4ICovCisjZGVmaW5lIElJT19JT1BSQl85CTB4NDAwMWE4CS8qIFBSQiBlbnRyeSA5ICovCisjZGVmaW5lIElJT19JT1BSQl9BCTB4NDAwMWIwCS8qIFBSQiBlbnRyeSBhICovCisjZGVmaW5lIElJT19JT1BSQl9CCTB4NDAwMWI4CS8qIFBSQiBlbnRyeSBiICovCisjZGVmaW5lIElJT19JT1BSQl9DCTB4NDAwMWMwCS8qIFBSQiBlbnRyeSBjICovCisjZGVmaW5lIElJT19JT1BSQl9ECTB4NDAwMWM4CS8qIFBSQiBlbnRyeSBkICovCisjZGVmaW5lIElJT19JT1BSQl9FCTB4NDAwMWQwCS8qIFBSQiBlbnRyeSBlICovCisjZGVmaW5lIElJT19JT1BSQl9GCTB4NDAwMWQ4CS8qIFBSQiBlbnRyeSBmICovCisKKworI2RlZmluZSBJSU9fSVhDQwkweDQwMDFlMAkvKiBDcm9zc3RhbGsgY3JlZGl0IGNvdW50IHRpbWVvdXQgKi8KKyNkZWZpbmUgSUlPX0lYVENDCUlJT19JWENDCisjZGVmaW5lIElJT19JTUVNCTB4NDAwMWU4CS8qIE1pc2NlbGxhbmVvdXMgRW5hYmxlIE1hc2sgKi8KKyNkZWZpbmUgSUlPX0lYVFQJMHg0MDAxZjAJLyogQ3Jvc3N0YWxrIHRhaWwgdGltZW91dCAqLworI2RlZmluZSBJSU9fSUVDTFIJMHg0MDAxZjgJLyogSU8gZXJyb3IgY2xlYXIgKi8KKyNkZWZpbmUgSUlPX0lCQ04gICAgICAgIDB4NDAwMjAwICAgICAgICAvKiBJTyBCVEUgQ1JCIGNvdW50ICovCisKKy8qCisgKiBJSU9fSU1FTSBSZWdpc3RlciBmaWVsZHMuCisgKi8KKyNkZWZpbmUgSUlPX0lNRU1fVzBFU0QgIDB4MSAgICAgICAgICAgICAvKiBXaWRnZXQgMCBzaHV0IGRvd24gZHVlIHRvIGVycm9yICovCisjZGVmaW5lIElJT19JTUVNX0IwRVNEICAoMSA8PCA0KSAgICAgICAgLyogQlRFIDAgc2h1dCBkb3duIGR1ZSB0byBlcnJvciAqLworI2RlZmluZSBJSU9fSU1FTV9CMUVTRCAgKDEgPDwgOCkgICAgICAgIC8qIEJURSAxIFNodXQgZG93biBkdWUgdG8gZXJyb3IgKi8KKworLyogUElPIFJlYWQgYWRkcmVzcyBUYWJsZSBFbnRyaWVzICovCisjZGVmaW5lIElJT19JUENBCTB4NDAwMzAwCS8qIFBSQiBDb3VudGVyIGFkanVzdCAqLworI2RlZmluZSBJSU9fTlVNX1BSVEVTCTgJCS8qIFRvdGFsIG51bWJlciBvZiBQUkIgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBJSU9fUFJURV8wCTB4NDAwMzA4CS8qIFBJTyBSZWFkIGFkZHJlc3MgdGFibGUgZW50cnkgMCAqLworI2RlZmluZSBJSU9fUFJURShfeCkJKElJT19QUlRFXzAgKyAoOCAqIChfeCkpKQorI2RlZmluZQlJSU9fV0lEUFJURSh4KQlJSU9fUFJURSgoKHgpIC0gOCkpIC8qIHdpZGdldCBJRCB0byBpdHMgUFJURSBudW0gKi8KKyNkZWZpbmUgSUlPX0lQRFIJMHg0MDAzODgJLyogUElPIHRhYmxlIGVudHJ5IGRlYWxsb2NhdGlvbiAqLworI2RlZmluZSBJSU9fSUNEUgkweDQwMDM5MAkvKiBDUkIgRW50cnkgRGVhbGxvY2F0aW9uICovCisjZGVmaW5lIElJT19JRkRSCTB4NDAwMzk4CS8qIElPUSBGSUZPIERlcHRoICovCisjZGVmaW5lIElJT19JSUFQCTB4NDAwM2EwCS8qIElJUSBBcmJpdHJhdGlvbiBQYXJhbWV0ZXJzICovCisjZGVmaW5lIElJT19JTU1SCUlJT19JSUFQCisjZGVmaW5lIElJT19JQ01SCTB4NDAwM2E4CS8qIENSQiBNYW5hZ2VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIElJT19JQ0NSCTB4NDAwM2IwCS8qIENSQiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElJT19JQ1RPCTB4NDAwM2I4CS8qIENSQiBUaW1lIE91dCBSZWdpc3RlciAqLworI2RlZmluZSBJSU9fSUNUUAkweDQwMDNjMAkvKiBDUkIgVGltZSBPdXQgUHJlc2NhbGFyICovCisKKworLyoKKyAqIElDTVIgcmVnaXN0ZXIgZmllbGRzCisgKi8KKyNkZWZpbmUgSUlPX0lDTVJfUENfVkxEX1NIRlQJMzYKKyNkZWZpbmUgSUlPX0lDTVJfUENfVkxEX01BU0sJKDB4N2ZmZlVMIDw8IElJT19JQ01SX1BDX1ZMRF9TSEZUKQorCisjZGVmaW5lIElJT19JQ01SX0NSQl9WTERfU0hGVAkyMAorI2RlZmluZSBJSU9fSUNNUl9DUkJfVkxEX01BU0sJKDB4N2ZmZlVMIDw8IElJT19JQ01SX0NSQl9WTERfU0hGVCkKKworI2RlZmluZSBJSU9fSUNNUl9GQ19DTlRfU0hGVAkxNgorI2RlZmluZSBJSU9fSUNNUl9GQ19DTlRfTUFTSwkoMHhmIDw8IElJT19JQ01SX0ZDX0NOVF9TSEZUKQorCisjZGVmaW5lIElJT19JQ01SX0NfQ05UX1NIRlQJNAorI2RlZmluZSBJSU9fSUNNUl9DX0NOVF9NQVNLCSgweGYgPDwgSUlPX0lDTVJfQ19DTlRfU0hGVCkKKworI2RlZmluZSBJSU9fSUNNUl9QX0NOVF9TSEZUCTAKKyNkZWZpbmUgSUlPX0lDTVJfUF9DTlRfTUFTSwkoMHhmIDw8IElJT19JQ01SX1BfQ05UX1NIRlQpCisKKyNkZWZpbmUgSUlPX0lDTVJfUFJFQ0lTRQkoMVVMIDw8IDUyKQorI2RlZmluZSBJSU9fSUNNUl9DTFJfUlBQRAkoMVVMIDw8IDEzKQorI2RlZmluZSBJSU9fSUNNUl9DTFJfUlFQRAkoMVVMIDw8IDEyKQorCisvKgorICogSUlPIFBJTyBEZWFsbG9jYXRpb24gcmVnaXN0ZXIgZmllbGQgbWFza3MgOiAoSUlPX0lQRFIpCisgKi8KKyNkZWZpbmUJSUlPX0lQRFJfUE5ECSgxIDw8IDQpCisKKy8qCisgKiBJSU8gQ1JCIGRlYWxsb2NhdGlvbiByZWdpc3RlciBmaWVsZCBtYXNrczogKElJT19JQ0RSKQorICovCisjZGVmaW5lCUlJT19JQ0RSX1BORAkoMSA8PCA0KQorCisvKgorICogSUlPIENSQiBjb250cm9sIHJlZ2lzdGVyIEZpZWxkczogSUlPX0lDQ1IKKyAqLworI2RlZmluZQlJSU9fSUNDUl9QRU5ESU5HCSgweDEwMDAwKQorI2RlZmluZQlJSU9fSUNDUl9DTURfTUFTSwkoMHhGRikKKyNkZWZpbmUJSUlPX0lDQ1JfQ01EX1NIRlQJKDcpCisjZGVmaW5lCUlJT19JQ0NSX0NNRF9OT1AJKDB4MCkJLyogTm8gT3AgKi8KKyNkZWZpbmUJSUlPX0lDQ1JfQ01EX1dBS0UJKDB4MTAwKSAvKiBSZWFjdGl2YXRlIENSQiBlbnRyeSBhbmQgcHJvY2VzcyAqLworI2RlZmluZQlJSU9fSUNDUl9DTURfVElNRU9VVAkoMHgyMDApCS8qIE1ha2UgQ1JCIHRpbWVvdXQgJiBtYXJrIGludmFsaWQgKi8KKyNkZWZpbmUJSUlPX0lDQ1JfQ01EX0VKRUNUCSgweDQwMCkJLyogQ29udGVudHMgb2YgZW50cnkgd3JpdHRlbiB0byBtZW1vcnkKKwkJCQkJICogdmlhIGEgV0IKKwkJCQkJICovCisjZGVmaW5lCUlJT19JQ0NSX0NNRF9GTFVTSAkoMHg4MDApCisKKy8qCisgKiBDUkIgbWFuaXB1bGF0aW9uIG1hY3JvcworICoJVGhlIENSQiBtYWNyb3MgYXJlIHNsaWdodGx5IGNvbXBsaWNhdGVkLCBzaW5jZSB0aGVyZSBhcmUgdXAgdG8KKyAqIAlmb3VyIHJlZ2lzdGVycyBhc3NvY2lhdGVkIHdpdGggZWFjaCBDUkIgZW50cnkuCisgKi8KKyNkZWZpbmUgSUlPX05VTV9DUkJTCQkxNQkvKiBOdW1iZXIgb2YgQ1JCcyAqLworI2RlZmluZSBJSU9fTlVNX05PUk1BTF9DUkJTICAgICAxMgkvKiBOdW1iZXIgb2YgcmVndWxhciBDUkIgZW50cmllcyAqLworI2RlZmluZSBJSU9fTlVNX1BDX0NSQlMgCTQJLyogTnVtYmVyIG9mIHBhcnRpYWwgY2FjaGUgQ1JCcyAqLworI2RlZmluZSBJSU9fSUNSQl9PRkZTRVQJCTgKKyNkZWZpbmUgSUlPX0lDUkJfMAkJMHg0MDA0MDAKKy8qIFhYWCAtIFRoaXMgaXMgbm93IHR1bmVhYmxlOgorCSNkZWZpbmUgSUlPX0ZJUlNUX1BDX0VOVFJZIDEyCisgKi8KKworI2RlZmluZSBJSU9fSUNSQl9BKF94KQkoSUlPX0lDUkJfMCArICg0ICogSUlPX0lDUkJfT0ZGU0VUICogKF94KSkpCisjZGVmaW5lIElJT19JQ1JCX0IoX3gpICAoSUlPX0lDUkJfQShfeCkgKyAxKklJT19JQ1JCX09GRlNFVCkKKyNkZWZpbmUgSUlPX0lDUkJfQyhfeCkJKElJT19JQ1JCX0EoX3gpICsgMipJSU9fSUNSQl9PRkZTRVQpCisjZGVmaW5lIElJT19JQ1JCX0QoX3gpICAoSUlPX0lDUkJfQShfeCkgKyAzKklJT19JQ1JCX09GRlNFVCkKKworLyogWFhYIC0gSUJVRSByZWdpc3RlciBjb21pbmcgZm9yIEh1YiAyICovCisKKy8qCisgKgorICogQ1JCIFJlZ2lzdGVyIGRlc2NyaXB0aW9uLgorICoKKyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcKKyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcKKyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcKKyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcKKyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcKKyAqCisgKiBNYW55IG9mIHRoZSBmaWVsZHMgaW4gQ1JCIGFyZSBzdGF0dXMgYml0cyB1c2VkIGJ5IGhhcmR3YXJlCisgKiBmb3IgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByb3RvY29sLiBJdCdzIHZlcnkgZGFuZ2Vyb3VzIHRvCisgKiBtZXNzIGFyb3VuZCB3aXRoIHRoZSBDUkIgcmVnaXN0ZXJzLgorICoKKyAqIEl0J3MgT0sgdG8gcmVhZCB0aGUgQ1JCIHJlZ2lzdGVycyBhbmQgdHJ5IHRvIG1ha2Ugc2Vuc2Ugb3V0IG9mIHRoZQorICogZmllbGRzIGluIENSQi4KKyAqCisgKiBVcGRhdGluZyBDUkIgcmVxdWlyZXMgYWxsIGFjdGl2aXRpZXMgaW4gSHViIElJTyB0byBiZSBxdWllc2NlZC4KKyAqIG90aGVyd2lzZSwgYSB3cml0ZSB0byBDUkIgY291bGQgY29ycnVwdCBvdGhlciBDUkIgZW50cmllcy4KKyAqIENSQnMgYXJlIGhlcmUgb25seSBhcyBhIGJhY2sgZG9vciBwZWVrIHRvIGh1YiBJSU8ncyBzdGF0dXMuCisgKiBRdWllc2NpbmcgaW1wbGllcyAgbm8gZG1hcyBubyBQSU9zCisgKiBlaXRoZXIgZGlyZWN0bHkgZnJvbSB0aGUgY3B1IG9yIGZyb20gc24wbmV0LgorICogdGhpcyBpcyBub3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgZWFzaWx5LiBTbywgQVZPSUQgdXBkYXRpbmcKKyAqIENSQnMuCisgKi8KKworLyoKKyAqIEZpZWxkcyBpbiBDUkIgUmVnaXN0ZXIgQQorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiB1bmlvbiBpY3JiYV91IHsKKwl1NjQJcmVnX3ZhbHVlOworCXN0cnVjdCB7CisJCXU2NCAJcmVzdmQ6IAk2LAorCQkJc3RhbGxfYnRlMDogMSwJLyogU3RhbGwgQlRFIDAgKi8KKwkJCXN0YWxsX2J0ZTE6IDEsCS8qIFN0YWxsIEJURSAxICovCisJCQllcnJvcjoJMSwJLyogQ1JCIGhhcyBhbiBlcnJvcgkqLworCQkJZWNvZGU6CTMsCS8qIEVycm9yIENvZGUgCQkqLworCQkJbG5ldHVjZTogMSwJLyogU04wbmV0IFVuY29ycmVjdGFibGUgZXJyb3IgKi8KKwkJCW1hcms6CTEsCS8qIENSQiBIYXMgYmVlbiBtYXJrZWQgCSovCisJCQl4ZXJyOgkxLAkvKiBFcnJvciBiaXQgc2V0IGluIHh0YWxrIGhlYWRlciAqLworCQkJc2lkbjoJNCwJLyogU0lETiBmaWVsZCBmcm9tIHh0YWxrCSovCisJCQl0bnVtOiAJNSwJLyogVE5VTSBmaWVsZCBpbiB4dGFsawkJKi8KKwkJCWFkZHI6CTM4LAkvKiBBZGRyZXNzIG9mIHJlcXVlc3QJKi8KKwkJCXZhbGlkOgkxLAkvKiBWYWxpZCBzdGF0dXMJCSovCisJCQlpb3c6CTE7CS8qIElPIFdyaXRlIG9wZXJhdGlvbgkqLworCX0gaWNyYmFfZmllbGRzX3M7Cit9IGljcmJhX3Q7CisKKy8qIFRoaXMgaXMgYW4gYWx0ZXJuYXRlIHR5cGVkZWYgZm9yIHRoZSBIVUIxIENSQiBBIGluIG9yZGVyIHRvIGFsbG93CisgICBydW50aW1lIHNlbGVjdGlvbiBvZiB0aGUgZm9ybWF0IGJhc2VkIG9uIHRoZSBSRVZfSUQgZmllbGQgb2YgdGhlCisgICBOSV9TVEFUVVNfUkVWX0lEIHJlZ2lzdGVyLiAqLwordHlwZWRlZiB1bmlvbiBoMV9pY3JiYV91IHsKKwl1NjQJcmVnX3ZhbHVlOworCisJc3RydWN0IHsKKwkJdTY0IAlyZXN2ZDogCTYsCisJCQl1bnVzZWQ6CTEsCS8qIFVudXNlZCBidXQgUlchIQkqLworCQkJZXJyb3I6CTEsCS8qIENSQiBoYXMgYW4gZXJyb3IJKi8KKwkJCWVjb2RlOgk0LAkvKiBFcnJvciBDb2RlIAkJKi8KKwkJCWxuZXR1Y2U6IDEsCS8qIFNOMG5ldCBVbmNvcnJlY3RhYmxlIGVycm9yICovCisJCQltYXJrOgkxLAkvKiBDUkIgSGFzIGJlZW4gbWFya2VkIAkqLworCQkJeGVycjoJMSwJLyogRXJyb3IgYml0IHNldCBpbiB4dGFsayBoZWFkZXIgKi8KKwkJCXNpZG46CTQsCS8qIFNJRE4gZmllbGQgZnJvbSB4dGFsawkqLworCQkJdG51bTogCTUsCS8qIFROVU0gZmllbGQgaW4geHRhbGsJCSovCisJCQlhZGRyOgkzOCwJLyogQWRkcmVzcyBvZiByZXF1ZXN0CSovCisJCQl2YWxpZDoJMSwJLyogVmFsaWQgc3RhdHVzCQkqLworCQkJaW93OgkxOwkvKiBJTyBXcml0ZSBvcGVyYXRpb24JKi8KKwl9IGgxX2ljcmJhX2ZpZWxkc19zOworfSBoMV9pY3JiYV90OworCisvKiBYWFggLSBJcyB0aGlzIHN0aWxsIHJpZ2h0PyAgQ2hlY2sgdGhlIHNwZWMuICovCisjZGVmaW5lIElDUkJOX0FfQ0VSUl9TSEZUCTU0CisjZGVmaW5lIElDUkJOX0FfRVJSX01BU0sJMHgzZmYKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZQlJSU9fSUNSQl9BRERSX1NIRlQJMgkvKiBTaGlmdCB0byBnZXQgcHJvcGVyIGFkZHJlc3MgKi8KKworLyoKKyAqIHZhbHVlcyBmb3IgImVjb2RlIiBmaWVsZAorICovCisjZGVmaW5lCUlJT19JQ1JCX0VDT0RFX0RFUlIJMAkvKiBEaXJlY3RvcnkgZXJyb3IgZHVlIHRvIElJTyBhY2Nlc3MgKi8KKyNkZWZpbmUJSUlPX0lDUkJfRUNPREVfUEVSUgkxCS8qIFBvaXNvbiBlcnJvciBvbiBJTyBhY2Nlc3MgKi8KKyNkZWZpbmUJSUlPX0lDUkJfRUNPREVfV0VSUgkyCS8qIFdyaXRlIGVycm9yIGJ5IElJTyBhY2Nlc3MKKwkJCQkJICogZS5nLiBXSU5WIHRvIGEgUmVhZCBvbmx5IGxpbmUuCisJCQkJCSAqLworI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9BRVJSCTMJLyogQWNjZXNzIGVycm9yIGNhdXNlZCBieSBJSU8gYWNjZXNzICovCisjZGVmaW5lCUlJT19JQ1JCX0VDT0RFX1BXRVJSCTQJLyogRXJyb3Igb24gcGFydGlhbCB3cml0ZQkqLworI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9QUkVSUgk1CS8qIEVycm9yIG9uIHBhcnRpYWwgcmVhZAkqLworI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9UT1VUCTYJLyogQ1JCIHRpbWVvdXQgYmVmb3JlIGRlYWxsb2NhdGluZyAqLworI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9YVEVSUgk3CS8qIEluY29taW5nIHh0YWxrIHBrdCBoYWQgZXJyb3IgYml0ICovCisKKworCisvKgorICogRmllbGRzIGluIENSQiBSZWdpc3RlciBCCisgKi8KKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuaW9uIGljcmJiX3UgeworCXU2NAlyZWdfdmFsdWU7CisJc3RydWN0IHsKKwkgICAgdTY0CXJzdmQxOgk1LAorCQlidGVudW06CTEsCS8qIEJURSB0byB3aGljaCBlbnRyeSBiZWxvbmdzIHRvICovCisJCWNvaHRyYW5zOiAxLAkvKiBDb2hlcmVudCB0cmFuc2FjdGlvbgkqLworCQl4dHNpemU6CTIsCS8qIFh0YWxrIG9wZXJhdGlvbiBzaXplCisJCQkJICogMDogRG91YmxlIFdvcmQKKwkJCQkgKiAxOiAzMiBCeXRlcy4KKwkJCQkgKiAyOiAxMjggQnl0ZXMsCisJCQkJICogMzogUmVzZXJ2ZWQuCisJCQkJICovCisJCXNyY25vZGU6IDksCS8qIFNvdXJjZSBOb2RlIElECQkqLworCQlzcmNpbml0OiAyLAkvKiBTb3VyY2UgSW5pdGlhdG9yOgorCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgorCQkJCSAqLworCQl1c2VvbGQ6CTEsCS8qIFVzZSBPTEQgY29tbWFuZCBmb3IgcHJvY2Vzc2luZyAqLworCQlpbXNndHlwZTogMiwJLyogSW5jb21pbmcgbWVzc2FnZSB0eXBlCisJCQkJICogc2VlIGJlbG93IGZvciBmaWVsZCB2YWx1ZXMKKwkJCQkgKi8KKwkJaW1zZzogCTgsCS8qIEluY29taW5nIG1lc3NhZ2UgCSovCisJCWluaXRhdG9yOiAzLAkvKiBJbml0aWF0b3Igb2Ygb3JpZ2luYWwgcmVxdWVzdAorCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgorCQkJCSAqLworCQlyZXF0eXBlOiA1LAkvKiBJZGVudGlmaWVzIHR5cGUgb2YgcmVxdWVzdAorCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgorCQkJCSAqLworCQlyc3ZkMjoJNywKKwkJYWNrY250OgkxMSwJLyogSW52YWxpZGF0ZSBhY2sgY291bnQJKi8KKwkJcmVzcDoJMSwJLyogZGF0YSByZXNwb25zZSAgZ2l2ZW4gdG8gcHJvY2Vzc29yICovCisJCWFjazogCTEsCS8qIGluZGljYXRlcyBkYXRhIGFjayByZWNlaXZlZCAJKi8KKwkJaG9sZDoJMSwJLyogZW50cnkgaXMgZ2F0aGVyaW5nIGludmFsIGFja3MgKi8KKwkJd2JfcGVuZDoxLAkvKiB3YWl0aW5nIGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUgKi8KKwkJaW50dm46IAkxLAkvKiBJbnRlcnZlbnRpb24gKi8KKwkJc3RhbGxfaWI6IDEsCS8qIFN0YWxsIElidWYgKGZyb20gY3Jvc3N0YWxrKSAqLworCQlzdGFsbF9pbnRyOiAxOwkvKiBTdGFsbCBpbnRlcm5hbCBpbnRlcnJ1cHRzICovCisJfSBpY3JiYl9maWVsZF9zOworfSBpY3JiYl90OworCisvKiBUaGlzIGlzIGFuIGFsdGVybmF0ZSB0eXBlZGVmIGZvciB0aGUgSFVCMSBDUkIgQiBpbiBvcmRlciB0byBhbGxvdworICAgcnVudGltZSBzZWxlY3Rpb24gb2YgdGhlIGZvcm1hdCBiYXNlZCBvbiB0aGUgUkVWX0lEIGZpZWxkIG9mIHRoZQorICAgTklfU1RBVFVTX1JFVl9JRCByZWdpc3Rlci4gKi8KK3R5cGVkZWYgdW5pb24gaDFfaWNyYmJfdSB7CisJdTY0CXJlZ192YWx1ZTsKKwlzdHJ1Y3QgeworCQl1NjQJcnN2ZDE6CTUsCisJCQlidGVudW06CTEsCS8qIEJURSB0byB3aGljaCBlbnRyeSBiZWxvbmdzIHRvICovCisJCQljb2h0cmFuczogMSwJLyogQ29oZXJlbnQgdHJhbnNhY3Rpb24JKi8KKwkJCXh0c2l6ZToJMiwJLyogWHRhbGsgb3BlcmF0aW9uIHNpemUKKwkJCQkJICogMDogRG91YmxlIFdvcmQKKwkJCQkJICogMTogMzIgQnl0ZXMuCisJCQkJCSAqIDI6IDEyOCBCeXRlcywKKwkJCQkJICogMzogUmVzZXJ2ZWQuCisJCQkJCSAqLworCQkJc3Jjbm9kZTogOSwJLyogU291cmNlIE5vZGUgSUQJCSovCisJCQlzcmNpbml0OiAyLAkvKiBTb3VyY2UgSW5pdGlhdG9yOgorCQkJCQkgKiBTZWUgYmVsb3cgZm9yIGZpZWxkIHZhbHVlcy4KKwkJCQkJICovCisJCQl1c2VvbGQ6CTEsCS8qIFVzZSBPTEQgY29tbWFuZCBmb3IgcHJvY2Vzc2luZyAqLworCQkJaW1zZ3R5cGU6IDIsCS8qIEluY29taW5nIG1lc3NhZ2UgdHlwZQorCQkJCQkgKiBzZWUgYmVsb3cgZm9yIGZpZWxkIHZhbHVlcworCQkJCQkgKi8KKwkJCWltc2c6IAk4LAkvKiBJbmNvbWluZyBtZXNzYWdlIAkqLworCQkJaW5pdGF0b3I6IDMsCS8qIEluaXRpYXRvciBvZiBvcmlnaW5hbCByZXF1ZXN0CisJCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgorCQkJCQkgKi8KKwkJCXJzdmQyOiAJMSwKKwkJCXBjYWNoZTogMSwJLyogZW50cnkgYmVsb25ncyB0byBwYXJ0aWFsIGNhY2hlICovCisJCQlyZXF0eXBlOiA1LAkvKiBJZGVudGlmaWVzIHR5cGUgb2YgcmVxdWVzdAorCQkJCQkgKiBTZWUgYmVsb3cgZm9yIGZpZWxkIHZhbHVlcy4KKwkJCQkJICovCisJCQlzdGxfaWI6CTEsCS8qIHN0YWxsIElidXMgY29taW5nIGZyb20geHRhbGsJKi8KKwkJCXN0bF9pbnRyOiAxLAkvKiBTdGFsbCBpbnRlcm5hbCBpbnRlcnJ1cHRzICovCisJCQlzdGxfYnRlMDogMSwJLyogU3RhbGwgQlRFIDAgCSovCisJCQlzdGxfYnRlMTogMSwJLyogU3RhbGwgQlRFIDEJKi8KKwkJCWludHJ2bjoJMSwJLyogUmVxIHdhcyB0YXJnZXQgb2YgaW50ZXJ2ZW50aW9uICovCisJCQlhY2tjbnQ6CTExLAkvKiBJbnZhbGlkYXRlIGFjayBjb3VudAkqLworCQkJcmVzcDoJMSwJLyogZGF0YSByZXNwb25zZSAgZ2l2ZW4gdG8gcHJvY2Vzc29yICovCisJCQlhY2s6IAkxLAkvKiBpbmRpY2F0ZXMgZGF0YSBhY2sgcmVjZWl2ZWQgCSovCisJCQlob2xkOgkxLAkvKiBlbnRyeSBpcyBnYXRoZXJpbmcgaW52YWwgYWNrcyAqLworCQkJd2JfcGVuZDoxLAkvKiB3YWl0aW5nIGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUgKi8KKwkJCXNsZWVwOiAJMSwJLyogeHRhbGsgcmVxIHNsZWVwaW5nIHRpbGwgSU8tc3luYyAqLworCQkJcG5kX3JlcGx5OiAxLAkvKiByZXBsaWVzIG5vdCBpc3NlZCBkdWUgdG8gSU9RIGZ1bGwgKi8KKwkJCXBuZF9yZXE6IDE7CS8qIHJlcXMgbm90IGlzc3VlZCBkdWUgdG8gSU9RIGZ1bGwgKi8KKwl9IGgxX2ljcmJiX2ZpZWxkX3M7Cit9IGgxX2ljcmJiX3Q7CisKKworI2RlZmluZQliX2ltc2d0eXBlCWljcmJiX2ZpZWxkX3MuaW1zZ3R5cGUKKyNkZWZpbmUJYl9idGVudW0JaWNyYmJfZmllbGRfcy5idGVudW0KKyNkZWZpbmUJYl9jb2h0cmFucwlpY3JiYl9maWVsZF9zLmNvaHRyYW5zCisjZGVmaW5lCWJfeHRzaXplCWljcmJiX2ZpZWxkX3MueHRzaXplCisjZGVmaW5lCWJfc3Jjbm9kZQlpY3JiYl9maWVsZF9zLnNyY25vZGUKKyNkZWZpbmUJYl9zcmNpbml0CWljcmJiX2ZpZWxkX3Muc3JjaW5pdAorI2RlZmluZQliX2ltc2d0eXBlCWljcmJiX2ZpZWxkX3MuaW1zZ3R5cGUKKyNkZWZpbmUJYl9pbXNnCQlpY3JiYl9maWVsZF9zLmltc2cKKyNkZWZpbmUJYl9pbml0aWF0b3IJaWNyYmJfZmllbGRfcy5pbml0aWF0b3IKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIHZhbHVlcyBmb3IgZmllbGQgeHRzaXplCisgKi8KKyNkZWZpbmUJSUlPX0lDUkJfWFRTSVpFX0RXCTAJLyogWHRhbGsgb3BlcmF0aW9uIHNpemUgaXMgOCBieXRlcyAgKi8KKyNkZWZpbmUJSUlPX0lDUkJfWFRTSVpFXzMyCTEJLyogWHRhbGsgb3BlcmF0aW9uIHNpemUgaXMgMzIgYnl0ZXMgKi8KKyNkZWZpbmUJSUlPX0lDUkJfWFRTSVpFXzEyOAkyCS8qIFh0YWxrIG9wZXJhdGlvbiBzaXplIGlzIDEyOCBieXRlcyAqLworCisvKgorICogdmFsdWVzIGZvciBmaWVsZCBzcmNpbml0CisgKi8KKyNkZWZpbmUJSUlPX0lDUkJfUFJPQzAJCTAJLyogU291cmNlIG9mIHJlcXVlc3QgaXMgUHJvYyAwICovCisjZGVmaW5lCUlJT19JQ1JCX1BST0MxCQkxCS8qIFNvdXJjZSBvZiByZXF1ZXN0IGlzIFByb2MgMSAqLworI2RlZmluZQlJSU9fSUNSQl9HQl9SRVEJCTIJLyogU291cmNlIGlzIEd1cmFudGVlZCBCVyByZXF1ZXN0ICovCisjZGVmaW5lCUlJT19JQ1JCX0lPX1JFUQkJMwkvKiBTb3VyY2UgaXMgTm9ybWFsIElPIHJlcXVlc3QJKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgZmllbGQgaW1zZ3R5cGUKKyAqLworI2RlZmluZQlJSU9fSUNSQl9JTVNHVF9YVEFMSwkwCS8qIEluY29taW5nIE1lZXNzYWdlIGZyb20gWHRhbGsJKi8KKyNkZWZpbmUJSUlPX0lDUkJfSU1TR1RfQlRFCTEJLyogSW5jb21pbmcgbWVzc2FnZSBmcm9tIEJURSAJKi8KKyNkZWZpbmUJSUlPX0lDUkJfSU1TR1RfU04wTkVUCTIJLyogSW5jb21pbmcgbWVzc2FnZSBmcm9tIFNOMCBuZXQgKi8KKyNkZWZpbmUJSUlPX0lDUkJfSU1TR1RfQ1JCCTMJLyogSW5jb21pbmcgbWVzc2FnZSBmcm9tIENSQiA/Pz8gICovCisKKy8qCisgKiB2YWx1ZXMgZm9yIGZpZWxkIGluaXRpYXRvci4KKyAqLworI2RlZmluZQlJSU9fSUNSQl9JTklUX1hUQUxLCTAJLyogTWVzc2FnZSBvcmlnaW5hdGVkIGluIHh0YWxrCSovCisjZGVmaW5lCUlJT19JQ1JCX0lOSVRfQlRFMAkweDEJLyogTWVzc2FnZSBvcmlnaW5hdGVkIGluIEJURSAwCSovCisjZGVmaW5lCUlJT19JQ1JCX0lOSVRfU04wTkVUCTB4MgkvKiBNZXNzYWdlIG9yaWdpbmF0ZWQgaW4gU04wbmV0ICovCisjZGVmaW5lCUlJT19JQ1JCX0lOSVRfQ1JCCTB4MwkvKiBNZXNzYWdlIG9yaWdpbmF0ZWQgaW4gQ1JCID8gCSovCisjZGVmaW5lCUlJT19JQ1JCX0lOSVRfQlRFMQkweDUJLyogTUVzc2FnZSBvcmlnaW5hdGVkIGluIEJURSAxCSovCisKKy8qCisgKiBWYWx1ZXMgZm9yIGZpZWxkIHJlcXR5cGUuCisgKi8KKy8qIFhYWCAtIE5lZWQgdG8gZml4IHRoaXMgZm9yIEh1YiAyICovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9EV1JECTAJLyogUmVxdWVzdCB0eXBlIGRvdWJsZSB3b3JkCSovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9RQ0xSRAkxCS8qIFJlcXVlc3QgaXMgUXJ0ciBDYWNlaCBsaW5lIFJkICovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9CTEtSRAkyCS8qIFJlcXVlc3QgaXMgYmxvY2sgcmVhZAkqLworI2RlZmluZQlJSU9fSUNSQl9SRVFfUlNIVQk2CS8qIFJlcXVlc3QgaXMgQlRFIGJsb2NrIHJlYWQJKi8KKyNkZWZpbmUJSUlPX0lDUkJfUkVRX1JFWFUJNwkvKiByZXF1ZXN0IGlzIEJURSBFeGNsIFJlYWQJKi8KKyNkZWZpbmUJSUlPX0lDUkJfUkVRX1JERVgJOAkvKiBSZXF1ZXN0IGlzIFJlYWQgRXhjbHVzaXZlCSovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9XSU5DCTkJLyogUmVxdWVzdCBpcyBXcml0ZSBJbnZhbGlkYXRlIAkqLworI2RlZmluZQlJSU9fSUNSQl9SRVFfQldJTlYJMTAJLyogUmVxdWVzdCBpcyBCVEUgV2ludgkJKi8KKyNkZWZpbmUJSUlPX0lDUkJfUkVRX1BJT1JECTExCS8qIFJlcXVlc3QgaXMgUElPIHJlYWQJCSovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9QSU9XUgkxMgkvKiBSZXF1ZXN0IGlzIFBJTyBXcml0ZSAJKi8KKyNkZWZpbmUJSUlPX0lDUkJfUkVRX1BSRE0JMTMJLyogUmVxdWVzdCBpcyBGZXRjaCZPcAkJKi8KKyNkZWZpbmUJSUlPX0lDUkJfUkVRX1BXUk0JMTQJLyogUmVxdWVzdCBpcyBTdG9yZSAmT3AJCSovCisjZGVmaW5lCUlJT19JQ1JCX1JFUV9QVFBXUgkxNQkvKiBSZXF1ZXN0IGlzIFBlZXIgdG8gcGVlcgkqLworI2RlZmluZQlJSU9fSUNSQl9SRVFfV0IJCTE2CS8qIFJlcXVlc3QgaXMgV3JpdGUgYmFjawkqLworI2RlZmluZQlJSU9fSUNSQl9SRVFfREVYCTE3CS8qIFJldGFpbmVkIERFWCBDYWNoZSBsaW5lCSovCisKKy8qCisgKiBGaWVsZHMgaW4gQ1JCIFJlZ2lzdGVyIEMKKyAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuaW9uIGljcmJjX3MgeworCXU2NAlyZWdfdmFsdWU7CisJc3RydWN0IHsKKwkJdTY0CXJzdmQ6CTYsCisJCQlzbGVlcDoJMSwKKwkJCXByaWNudDogNCwJLyogUHJpb3JpdHkgY291bnQgc2VudCB3aXRoIFJlYWQgcmVxICovCisJCQlwcmlwc2M6IDQsCS8qIFByaW9yaXR5IFByZSBzY2FsYXIgCSovCisJCQlidGVvcDoJMSwJLyogQlRFIE9wZXJhdGlvbiAJKi8KKwkJCXB1c2hfYmU6IDM0LAkvKiBQdXNoIGFkZHJlc3MgQnl0ZSBlbmFibGUKKwkJCQkJICogSG9sZHMgcHVzaCBhZGRyLCBpZiBDUkIgaXMgZm9yIEJURQorCQkJCQkgKiBJZiBDUkIgYmVsb25ncyB0byBQYXJ0aWFsIGNhY2hlLAorCQkJCQkgKiB0aGlzIGNvbnRhaW5zIGJ5dGUgZW5hYmxlcyBiaXRzCisJCQkJCSAqIChbNDc6NDZdID0gMCkKKwkJCQkJICovCisJCQlzdXBwbDoJMTEsCS8qIFN1cHBsZW1lbnRhbCBmaWVsZAkqLworCQkJYmFycm9wOiAxLAkvKiBCYXJyaWVyIE9wIGJpdCBzZXQgaW4geHRhbGsgcmVxICovCisJCQlkb3Jlc3A6IDEsCS8qIFh0YWxrIHJlcSBuZWVkcyBhIHJlc3BvbnNlIAkqLworCQkJZ2JyOgkxOwkvKiBHQlIgYml0IHNldCBpbiB4dGFsayBwYWNrZXQgCSovCisJfSBpY3JiY19maWVsZF9zOworfSBpY3JiY190OworCisjZGVmaW5lCWNfcHJpY250CWljcmJjX2ZpZWxkX3MucHJpY250CisjZGVmaW5lCWNfcHJpcHNjCWljcmJjX2ZpZWxkX3MucHJpcHNjCisjZGVmaW5lCWNfYnRlb3AJCWljcmJjX2ZpZWxkX3MuYnRlb3AKKyNkZWZpbmUJY19idGVhZGRyCWljcmJjX2ZpZWxkX3MucHVzaF9iZQkvKiBwdXNoX2JlIGZpZWxkIGhhcyAyIG5hbWVzICovCisjZGVmaW5lIGNfYmVuYWJsZSAJaWNyYmNfZmllbGRfcy5wdXNoX2JlCS8qIHB1c2hfYmUgZmllbGQgaGFzIDIgbmFtZXMgKi8KKyNkZWZpbmUJY19zdXBwbAkJaWNyYmNfZmllbGRfcy5zdXBwbAorI2RlZmluZQljX2JhcnJvcAlpY3JiY19maWVsZF9zLmJhcnJvcAorI2RlZmluZQljX2RvcmVzcAlpY3JiY19maWVsZF9zLmRvcmVzcAorI2RlZmluZQljX2dicglpY3JiY19maWVsZF9zLmdicgorI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIEZpZWxkcyBpbiBDUkIgUmVnaXN0ZXIgRAorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuaW9uIGljcmJkX3MgeworCXU2NAlyZWdfdmFsdWU7CisJc3RydWN0IHsKKwkgICAgdTY0CXJzdmQ6CTM4LAorCQl0b3V0dmxkOiAxLAkvKiBUaW1lb3V0IGluIHByb2dyZXNzIGZvciB0aGlzIENSQiAqLworCQljdHh0dmxkOiAxLAkvKiBDb250ZXh0IGZpZWxkIGJlbG93IGlzIHZhbGlkCSovCisJCXJzdmQyOgkxLAorCQljb250ZXh0OiAxNSwgCS8qIEJpdCB2ZWN0b3I6CisJCQkJICogSGFzIGEgYml0IHNldCBmb3IgZWFjaCBDUkIgZW50cnkKKwkJCQkgKiB3aGljaCBuZWVkcyB0byBiZSBkZWFsbG9jYXRlZAorCQkJCSAqIGJlZm9yZSB0aGlzIENSQiBlbnRyeSBpcyBwcm9jZXNzZWQuCisJCQkJICogU2V0IG9ubHkgZm9yIGJhcnJpZXIgb3BlcmF0aW9ucy4KKwkJCQkgKi8KKwkJdGltZW91dDogODsJLyogVGltZW91dCBVcHBlciA4IGJpdHMJKi8KKwl9IGljcmJkX2ZpZWxkX3M7Cit9IGljcmJkX3Q7CisKKyNkZWZpbmUJaWNyYmRfdG91dHZsZAlpY3JiZF9maWVsZF9zLnRvdXR2bGQKKyNkZWZpbmUJaWNyYmRfY3R4dHZsZAlpY3JiZF9maWVsZF9zLmN0eHR2bGQKKyNkZWZpbmUJaWNyYmRfY29udGV4dAlpY3JiZF9maWVsZF9zLmNvbnRleHQKKworCit0eXBlZGVmIHVuaW9uIGh1YmlpX2lmZHJfdSB7CisJdTY0CWhpX2lmZHJfdmFsdWU7CisJc3RydWN0IHsKKwkJdTY0CWlmZHJfcnN2ZDoJNDksCisJICAgICAgICAgICAgICAgIGlmZHJfbWF4cnA6CSA3LAorCSAgICAgICAgICAgICAgICBpZmRyX3JzdmQxOgkgMSwKKwkJCWlmZHJfbWF4cnE6CSA3OworCX0gaGlfaWZkcl9maWVsZHM7Cit9IGh1YmlpX2lmZHJfdDsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIEhhcmR3YXJlIGRlc2lnbmVkIG5hbWVzIGZvciB0aGUgQlRFIGNvbnRyb2wgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIElJT19JQkxTXzAJMHg0MTAwMDAJLyogQlRFIGxlbmd0aC9zdGF0dXMgMCAqLworI2RlZmluZSBJSU9fSUJTQV8wCTB4NDEwMDA4CS8qIEJURSBzb3VyY2UgYWRkcmVzcyAwICovCisjZGVmaW5lIElJT19JQkRBXzAJMHg0MTAwMTAJLyogQlRFIGRlc3RpbmF0aW9uIGFkZHJlc3MgMCAqLworI2RlZmluZSBJSU9fSUJDVF8wCTB4NDEwMDE4CS8qIEJURSBjb250cm9sL3Rlcm1pbmF0ZSAwICovCisjZGVmaW5lIElJT19JQk5BXzAJMHg0MTAwMjAJLyogQlRFIG5vdGlmaWNhdGlvbiBhZGRyZXNzIDAgKi8KKyNkZWZpbmUgSUlPX0lCTlJfMAlJSU9fSUJOQV8wCisjZGVmaW5lIElJT19JQklBXzAJMHg0MTAwMjgJLyogQlRFIGludGVycnVwdCBhZGRyZXNzIDAgKi8KKworI2RlZmluZSBJSU9fSUJMU18xCTB4NDIwMDAwCS8qIEJURSBsZW5ndGgvc3RhdHVzIDEgKi8KKyNkZWZpbmUgSUlPX0lCU0FfMQkweDQyMDAwOAkvKiBCVEUgc291cmNlIGFkZHJlc3MgMSAqLworI2RlZmluZSBJSU9fSUJEQV8xCTB4NDIwMDEwCS8qIEJURSBkZXN0aW5hdGlvbiBhZGRyZXNzIDEgKi8KKyNkZWZpbmUgSUlPX0lCQ1RfMQkweDQyMDAxOAkvKiBCVEUgY29udHJvbC90ZXJtaW5hdGUgMSAqLworI2RlZmluZSBJSU9fSUJOQV8xCTB4NDIwMDIwCS8qIEJURSBub3RpZmljYXRpb24gYWRkcmVzcyAxICovCisjZGVmaW5lIElJT19JQk5SXzEJSUlPX0lCTkFfMQorI2RlZmluZSBJSU9fSUJJQV8xCTB4NDIwMDI4CS8qIEJURSBpbnRlcnJ1cHQgYWRkcmVzcyAxICovCisKKy8qCisgKiBNb3JlIG1pc2NlbGxhbmVvdXMgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgSUlPX0lQQ1IJMHg0MzAwMDAJLyogUGVyZm9ybWFuY2UgQ29udHJvbCAqLworI2RlZmluZSBJSU9fSVBQUgkweDQzMDAwOAkvKiBQZXJmb3JtYW5jZSBQcm9maWxpbmcgKi8KKworLyoKKyAqIElPIEVycm9yIENsZWFyIHJlZ2lzdGVyIGJpdCBmaWVsZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIElFQ0xSX0JURTEJCSgxIDw8IDE4KSAgLyogY2xlYXIgYnRlIGVycm9yIDEgPz8/ICovCisjZGVmaW5lIElFQ0xSX0JURTAJCSgxIDw8IDE3KSAgLyogY2xlYXIgYnRlIGVycm9yIDAgPz8/ICovCisjZGVmaW5lIElFQ0xSX0NSQVpZCQkoMSA8PCAxNikgIC8qIGNsZWFyIGNyYXp5IGJpdCBpbiB3c3RhdCByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0YJCSgxIDw8IDE1KSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfRiByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0UJCSgxIDw8IDE0KSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfRSByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0QJCSgxIDw8IDEzKSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfRCByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0MJCSgxIDw8IDEyKSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfQyByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0IJCSgxIDw8IDExKSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfQiByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCX0EJCSgxIDw8IDEwKSAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfQSByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCXzkJCSgxIDw8IDkpICAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfOSByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCXzgJCSgxIDw8IDgpICAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfOCByZWcgKi8KKyNkZWZpbmUgSUVDTFJfUFJCXzAJCSgxIDw8IDApICAgLyogY2xlYXIgZXJyIGJpdCBpbiBQUkJfMCByZWcgKi8KKworLyoKKyAqIElPIFBJTyBSZWFkIFRhYmxlIEVudHJ5IGZvcm1hdAorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3R5cGVkZWYgdW5pb24gaXBydGVfYSB7CisJdTY0CWVudHJ5OworCXN0cnVjdCB7CisJICAgIHU2NAlyc3ZkMSAgICAgOiA3LCAgLyogUmVzZXJ2ZWQgZmllbGQgCQkqLworCQl2YWxpZCAgICAgOiAxLAkvKiBNYXBzIHRvIGEgdGltZW91dCBlbnRyeQkqLworCQlyc3ZkMiAgICAgOiAxLAorCQlzcmNub2RlICAgOiA5LAkvKiBOb2RlIHdoaWNoIGRpZCB0aGlzIFBJTwkqLworCQlpbml0aWF0b3IgOiAyLAkvKiBJZiBUNUEgb3IgVDVCIG9yIElPIAkJKi8KKwkJcnN2ZDMgICAgIDogMywKKwkJYWRkciAgICAgIDogMzgsCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgUElPCSovCisJCXJzdmQ0ICAgICA6IDM7CisJfSBpcHJ0ZV9maWVsZHM7Cit9IGlwcnRlX2FfdDsKKworI2RlZmluZQlpcHJ0ZV92YWxpZAlpcHJ0ZV9maWVsZHMudmFsaWQKKyNkZWZpbmUJaXBydGVfdGltZW91dAlpcHJ0ZV9maWVsZHMudGltZW91dAorI2RlZmluZQlpcHJ0ZV9zcmNub2RlCWlwcnRlX2ZpZWxkcy5zcmNub2RlCisjZGVmaW5lCWlwcnRlX2luaXQJaXBydGVfZmllbGRzLmluaXRpYXRvcgorI2RlZmluZQlpcHJ0ZV9hZGRyCWlwcnRlX2ZpZWxkcy5hZGRyCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNkZWZpbmUJSVBSVEVfQUREUlNIRlQJMworCisvKgorICogSHViIElJTyBQUkIgUmVnaXN0ZXIgZm9ybWF0LgorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogTm90ZTogRmllbGRzIGJuYWtjdHIsIGFuYWtjdHIsIHh0YWxrY3RybW9kZSwgb3ZmbG93IGZpZWxkcyBhcmUKKyAqICJTdGF0dXMiIGZpZWxkcywgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gY2FzZSBvZiBjbGVhbiB1cCBhZnRlciBlcnJvcnMuCisgKi8KKwordHlwZWRlZiB1bmlvbiBpcHJiX3UgeworCXU2NAlyZWdfdmFsdWU7CisJc3RydWN0IHsKKwkgICAgdTY0CXJzdmQxOgkxNSwKKwkJZXJyb3I6CTEsCS8qIFdpZGdldCByY3ZkIHdyIHJlc3AgcGt0IHcvIGVycm9yICovCisJCW92ZmxvdzoJNSwJLyogT3ZlciBmbG93IGNvdW50LiBwZXJmIG1lYXN1cmVtZW50ICovCisJCWZpcmVfYW5kX2ZvcmdldDogMSwgLyogTGF1bmNoIFdyaXRlIHdpdGhvdXQgcmVzcG9uc2UgKi8KKwkJbW9kZToJMiwJLyogV2lkZ2V0IG9wZXJhdGlvbiBNb2RlCSovCisJCXJzdmQyOgkyLAorCQlibmFrY3RyOiAxNCwKKwkJcnN2ZDM6IAkyLAorCQlhbmFrY3RyOiAxNCwKKwkJeHRhbGtjdHI6IDg7CisJfSBpcHJiX2ZpZWxkc19zOworfSBpcHJiX3Q7CisKKyNkZWZpbmUgaXByYl9yZWd2YWwJcmVnX3ZhbHVlCisKKyNkZWZpbmUJaXByYl9lcnJvcglpcHJiX2ZpZWxkc19zLmVycm9yCisjZGVmaW5lCWlwcmJfb3ZmbG93CWlwcmJfZmllbGRzX3Mub3ZmbG93CisjZGVmaW5lCWlwcmJfZmYJCWlwcmJfZmllbGRzX3MuZmlyZV9hbmRfZm9yZ2V0CisjZGVmaW5lCWlwcmJfbW9kZQlpcHJiX2ZpZWxkc19zLm1vZGUKKyNkZWZpbmUJaXByYl9ibmFrY3RyCWlwcmJfZmllbGRzX3MuYm5ha2N0cgorI2RlZmluZQlpcHJiX2FuYWtjdHIJaXByYl9maWVsZHNfcy5hbmFrY3RyCisjZGVmaW5lCWlwcmJfeHRhbGtjdHIJaXByYl9maWVsZHNfcy54dGFsa2N0cgorCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKgorICogdmFsdWVzIGZvciBtb2RlIGZpZWxkIGluIGlwcmJfdC4KKyAqIEZvciBkZXRhaWxzIG9mIHRoZSBtZWFuaW5ncyBvZiBOQUsgYW5kIEFjY2VwdCwgcmVmZXIgdGhlIFBJTyBmbG93CisgKiBkb2N1bWVudAorICovCisjZGVmaW5lCUlQUkJfTU9ERV9OT1JNQUwJKDApCisjZGVmaW5lCUlQUkJfTU9ERV9DT0xMRUNUX0EJKDEpCS8qIFBSQiBpbiBjb2xsZWN0IEEgbW9kZSAqLworI2RlZmluZQlJUFJCX01PREVfU0VSVklDRV9BCSgyKQkvKiBOQUsgQiBhbmQgQWNjZXB0IEEgKi8KKyNkZWZpbmUJSVBSQl9NT0RFX1NFUlZJQ0VfQgkoMykJLyogTkFLIEEgYW5kIEFjY2VwdCBCICovCisKKy8qCisgKiBJTyBDUkIgZW50cnkgQ19BIHRvIEVfQSA6IFBhcnRpYWwgKGNhY2hlKSBDUkJTCisgKi8KKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuaW9uIGljcmJwX2EgeworCXU2NCAgIGlwX3JlZzsJICAgIC8qIHRoZSBlbnRpcmUgcmVnaXN0ZXIgdmFsdWUJKi8KKwlzdHJ1Y3QgeworCSAgICAgdTY0IGVycm9yOgkxLCAgLyogICAgNjMsIGVycm9yIG9jY3VycmVkCQkqLworCQlsbl91Y2U6CTEsICAvKiAgICA2MjogdW5jb3JyZWN0YWJsZSBtZW1vcnkgCSovCisJCWxuX2FlOgkxLCAgLyogICAgNjE6IHByb3RlY3Rpb24gdmlvbGF0aW9uIAkqLworCQlsbl93ZXJyOjEsICAvKiAgICA2MDogd3JpdGUgYWNjZXNzIGVycm9yIAkqLworCQlsbl9hZXJyOjEsICAvKiAgICA1OTogc24wbmV0OiBBZGRyZXNzIGVycm9yCSovCisJCWxuX3BlcnI6MSwgIC8qICAgIDU4OiBzbjBuZXQ6IHBvaXNvbiBlcnJvcgkqLworCQl0aW1lb3V0OjEsICAvKiAgICA1NzogQ1JCIHRpbWVkIG91dAkJKi8KKwkJbF9iZHBrdDoxLCAgLyogICAgNTY6IHRydW5jYXRlZCBwa3Qgb24gc24wbmV0CSovCisJCWNfYmRwa3Q6MSwgIC8qICAgIDU1OiB0cnVuY2F0ZWQgcGt0IG9uIHh0YWxrCSovCisJCWNfZXJyOgkxLCAgLyogICAgNTQ6IGluY29taW5nIHh0YWxrIHJlcSwgZXJyIHNldCovCisJCXJzdmQxOiAxMiwgIC8qIDUzLTQyOiByZXNlcnZlZAkJCSovCisJCXZhbGlkOgkxLCAgLyogICAgNDE6IFZhbGlkIHN0YXR1cwkJKi8KKwkJc2lkbjoJNCwgIC8qIDQwLTM3OiBTSUROIGZpZWxkIG9mIHh0YWxrIHJxc3QJKi8KKwkJdG51bToJNSwgIC8qIDM2LTMyOiBUTlVNIG9mIHh0YWxrIHJlcXVlc3QJKi8KKwkJYm86CTEsICAvKiAgICAzMTogYmFycmllciBvcCBzZXQgaW4geHRhbGsgcnFzdCovCisJCXJlc3BycWQ6MSwgIC8qICAgIDMwOiB4dGFsayBycXN0IHJlcXVpcmVzIHJlc3BvbnNlKi8KKwkJZ2JyOgkxLCAgLyogICAgMjk6IGdiciBiaXQgc2V0IGluIHh0YWxrIHJxc3QJKi8KKwkJc2l6ZToJMiwgIC8qIDI4LTI3OiBzaXplIG9mIHh0YWxrIHJlcXVlc3QJKi8KKwkJZXhjbDoJNCwgIC8qIDI2LTIzOiBleGNsdXNpdmUgYml0KHMpCQkqLworCQlzdGFsbDoJMywgIC8qIDIyLTIwOiBzdGFsbCAoeHRhbGssIGJ0ZSAwLzEpCSovCisJCWludHZuOgkxLCAgLyogICAgMTk6IHJxc3QgdGFyZ2V0IG9mIGludGVydmVudGlvbiovCisJCXJlc3A6CTEsICAvKiAgICAxODogRGF0YSByZXNwb25zZSBnaXZlbiB0byB0NQkqLworCQlhY2s6CTEsICAvKiAgICAxNzogRGF0YSBhY2sgcmVjZWl2ZWQuCSovCisJCWhvbGQ6CTEsICAvKiAgICAxNjogY3JiIGdhdGhlcmluZyBpbnZhbGlkYXRlIGFja3MqLworCQl3YjoJMSwgIC8qICAgIDE1OiB3cml0ZWJhY2sgcGVuZGluZy4JKi8KKwkJYWNrX2NudDoxMSwgLyogMTQtMDQ6IGNvdW50ZXIgb2YgaW52YWxpZGF0ZSBhY2tzKi8KKwkJdHNjYWxlcjo0OyAgLyogMDMtMDA6IFRpbWVvdXQgcHJlc2NhbGVyCQkqLworCX0gaXBfZm10OworfSBpY3JicF9hX3Q7CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBBIGNvdXBsZSBvZiBkZWZpbmVzIHRvIGdvIHdpdGggdGhlIGFib3ZlIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBJQ1JCUF9BX0NFUlJfU0hGVAk1NAorI2RlZmluZSBJQ1JCUF9BX0VSUl9NQVNLCTB4M2ZmCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuaW9uIGh1YmlpX2lkc3IgeworCXU2NCBpaW5fcmVnOworCXN0cnVjdCB7CisJCXU2NCByc3ZkMSA6IDM1LAorCSAgICAgICAgICAgIGlzZW50IDogMSwKKwkgICAgICAgICAgICByc3ZkMiA6IDMsCisJICAgICAgICAgICAgaWVuYWJsZTogMSwKKwkgICAgICAgICAgICByc3ZkICA6IDcsCisJICAgICAgICAgICAgbm9kZSAgOiA5LAorCSAgICAgICAgICAgIHJzdmQ0IDogMSwKKwkgICAgICAgICAgICBsZXZlbCA6IDc7CisJfSBpaW5fZm10OworfSBodWJpaV9pZHNyX3Q7CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKgorICogSU8gQlRFIExlbmd0aC9TdGF0dXMgKElJT19JQkxTKSByZWdpc3RlciBiaXQgZmllbGQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBJQkxTX0JVU1kJCSgweDEgPDwgMjApCisjZGVmaW5lIElCTFNfRVJST1JfU0hGVAkJMTYKKyNkZWZpbmUgSUJMU19FUlJPUgkJKDB4MSA8PCBJQkxTX0VSUk9SX1NIRlQpCisjZGVmaW5lIElCTFNfTEVOR1RIX01BU0sJMHhmZmZmCisKKy8qCisgKiBJTyBCVEUgQ29udHJvbC9UZXJtaW5hdGUgcmVnaXN0ZXIgKElCQ1QpIHJlZ2lzdGVyIGJpdCBmaWVsZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIElCQ1RfUE9JU09OCQkoMHgxIDw8IDgpCisjZGVmaW5lIElCQ1RfTk9USUZZCQkoMHgxIDw8IDQpCisjZGVmaW5lIElCQ1RfWkZJTF9NT0RFCQkoMHgxIDw8IDApCisKKy8qCisgKiBJTyBCVEUgSW50ZXJydXB0IEFkZHJlc3MgUmVnaXN0ZXIgKElCSUEpIHJlZ2lzdGVyIGJpdCBmaWVsZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIElCSUFfTEVWRUxfU0hGVAkJMTYKKyNkZWZpbmUgSUJJQV9MRVZFTF9NQVNLCQkoMHg3ZiA8PCBJQklBX0xFVkVMX1NIRlQpCisjZGVmaW5lIElCSUFfTk9ERV9JRF9TSEZUCTAKKyNkZWZpbmUgSUJJQV9OT0RFX0lEX01BU0sJKDB4MWZmKQorCisvKgorICogTWlzY2VsbGFuZW91cyBodWIgY29uc3RhbnRzCisgKi8KKworLyogTnVtYmVyIG9mIHdpZGdldHMgc3VwcG9ydGVkIGJ5IGh1YiAqLworI2RlZmluZSBIVUJfTlVNX1dJREdFVAkJOQorI2RlZmluZSBIVUJfV0lER0VUX0lEX01JTgkweDgKKyNkZWZpbmUgSFVCX1dJREdFVF9JRF9NQVgJMHhmCisKKyNkZWZpbmUgSFVCX1dJREdFVF9QQVJUX05VTQkweGMxMDEKKyNkZWZpbmUgTUFYX0hVQlNfUEVSX1hCT1cJMgorCisvKgorICogR2V0IGEgaHViJ3Mgd2lkZ2V0IGlkIGZyb20gd2lkZ2V0IGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBJSU9fV0NSX1dJRF9HRVQobmFzaWQpCShSRU1PVEVfSFVCX0wobmFzaWQsIElJSV9XQ1IpICYgMHhmKQorI2RlZmluZSBJSU9fV1NUX0VSUk9SX01BU0sJKFVJTlQ2NF9DQVNUIDEgPDwgMzIpIC8qIFdpZGdldCBzdGF0dXMgZXJyb3IgKi8KKworLyoKKyAqIE51bWJlciBvZiBjcmVkaXRzIEh1YiB3aWRnZXQgaGFzIHdoaWxlIHNlbmRpbmcgcmVxL3Jlc3BvbnNlIHRvCisgKiB4Ym93LgorICogVmFsdWUgb2YgMyBpcyByZXF1aXJlZCBieSBYYm93IDEuMQorICogV2UgbWF5IGJlIGFibGUgdG8gaW5jcmVhc2UgdGhpcyB0byA0IHdpdGggWGJvdyAxLjIuCisgKi8KKyNkZWZpbmUgICAgICAgSFVCSUlfWEJPV19DUkVESVQgICAgICAgMworI2RlZmluZQkgICAgICBIVUJJSV9YQk9XX1JFVjJfQ1JFRElUICA0CisKKyNlbmRpZiAvKiBfQVNNX1NHSV9TTl9TTjBfSFVCSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9zbjAvaHVibWQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHVibWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbi9zbjAvaHVibWQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9odWJtZC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL3NuMC9odWJuaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9odWJuaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL3NuMC9odWJuaS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vc24wL2h1Ym5pLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc24wL2h1YnBpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc24vc24wL2h1YnBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vc24wL2h1YnBpLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbjAvaHVicGkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zbi9zbjAvaXAyNy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9pcDI3LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc24vc24wL2lwMjcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuMC9pcDI3LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc25fcHJpdmF0ZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL3NuX3ByaXZhdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zbi9zbl9wcml2YXRlLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi9zbl9wcml2YXRlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vdHlwZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuL3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbi90eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuaS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NuaS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc25pLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc29ja2V0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zb2NrZXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zb2NraW9zLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc29ja2lvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3NvY2tpb3MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NvY2tpb3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zcGFyc2VtZW0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy9zcGFyc2VtZW0uaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWYzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMDYgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworI2lmbmRlZiBfQVNNX1NQSU5MT0NLX0gKKyNkZWZpbmUgX0FTTV9TUElOTE9DS19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKyNpbmNsdWRlIDxhc20vd2FyLmg+CisKKy8qCisgKiBZb3VyIGJhc2ljIFNNUCBzcGlubG9ja3MsIGFsbG93aW5nIG9ubHkgYSBzaW5nbGUgQ1BVIGFueXdoZXJlCisgKgorICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncworICogb24gdGhlIGxvY2FsIHByb2Nlc3Nvciwgb25lIGRvZXMgbm90LgorICoKKyAqIFRoZXNlIGFyZSBmYWlyIEZJRk8gdGlja2V0IGxvY2tzCisgKgorICogKHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBpbiBhc20vc3BpbmxvY2tfdHlwZXMuaCkKKyAqLworCisKKy8qCisgKiBUaWNrZXQgbG9ja3MgYXJlIGNvbmNlcHR1YWxseSB0d28gcGFydHMsIG9uZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IGhlYWQgb2YKKyAqIHRoZSBxdWV1ZSwgYW5kIHRoZSBvdGhlciBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRhaWwuIFRoZSBsb2NrIGlzIGFjcXVpcmVkCisgKiBieSBhdG9taWNhbGx5IG5vdGluZyB0aGUgdGFpbCBhbmQgaW5jcmVtZW50aW5nIGl0IGJ5IG9uZSAodGh1cyBhZGRpbmcKKyAqIG91cnNlbGYgdG8gdGhlIHF1ZXVlIGFuZCBub3Rpbmcgb3VyIHBvc2l0aW9uKSwgdGhlbiB3YWl0aW5nIHVudGlsIHRoZSBoZWFkCisgKiBiZWNvbWVzIGVxdWFsIHRvIHRoZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdGFpbC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX2lzX2xvY2tlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgY291bnRlcnMgPSBBQ0NFU1NfT05DRShsb2NrLT5sb2NrKTsKKworCXJldHVybiAoKGNvdW50ZXJzID4+IDE0KSBeIGNvdW50ZXJzKSAmIDB4MWZmZjsKK30KKworI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKKwl3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkpIHsgY3B1X3JlbGF4KCk7IH0KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19jb250ZW5kZWQocmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJdW5zaWduZWQgaW50IGNvdW50ZXJzID0gQUNDRVNTX09OQ0UobG9jay0+bG9jayk7CisKKwlyZXR1cm4gKCgoY291bnRlcnMgPj4gMTQpIC0gY291bnRlcnMpICYgMHgxZmZmKSA+IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJaW50IG15X3RpY2tldDsKKwlpbnQgdG1wOworCisJaWYgKFIxMDAwMF9MTFNDX1dBUikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIJLnNldCBwdXNoCQkjIF9fcmF3X3NwaW5fbG9jawlcbiIKKwkJIgkuc2V0IG5vcmVvcmRlcgkJCQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSIxOglsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiCWFkZGl1CSVbbXlfdGlja2V0XSwgJVt0aWNrZXRdLCAweDQwMDAJCVxuIgorCQkiCXNjCSVbbXlfdGlja2V0XSwgJVt0aWNrZXRfcHRyXQkJXG4iCisJCSIJYmVxemwJJVtteV90aWNrZXRdLCAxYgkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJIglzcmwJJVtteV90aWNrZXRdLCAlW3RpY2tldF0sIDE0CQlcbiIKKwkJIglhbmRpCSVbbXlfdGlja2V0XSwgJVtteV90aWNrZXRdLCAweDFmZmYJXG4iCisJCSIJYW5kaQklW3RpY2tldF0sICVbdGlja2V0XSwgMHgxZmZmCQlcbiIKKwkJIglibmUJJVt0aWNrZXRdLCAlW215X3RpY2tldF0sIDRmCQlcbiIKKwkJIgkgc3VidQklW3RpY2tldF0sICVbbXlfdGlja2V0XSwgJVt0aWNrZXRdCVxuIgorCQkiMjoJCQkJCQkJXG4iCisJCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCisJCSI0OglhbmRpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDFmZmYJCVxuIgorCQkiNToJc2xsCSVbdGlja2V0XSwgNQkJCQlcbiIKKwkJIgkJCQkJCQlcbiIKKwkJIjY6CWJuZXoJJVt0aWNrZXRdLCA2YgkJCQlcbiIKKwkJIgkgc3VidQklW3RpY2tldF0sIDEJCQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSIJbHcJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIglhbmRpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDFmZmYJCVxuIgorCQkiCWJlcQklW3RpY2tldF0sICVbbXlfdGlja2V0XSwgMmIJCVxuIgorCQkiCSBzdWJ1CSVbdGlja2V0XSwgJVtteV90aWNrZXRdLCAlW3RpY2tldF0JXG4iCisJCSIJYgk1YgkJCQkJXG4iCisJCSIJIHN1YnUJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDEJCQlcbiIKKwkJIgkucHJldmlvdXMJCQkJCVxuIgorCQkiCS5zZXQgcG9wCQkJCQlcbiIKKwkJOiBbdGlja2V0X3B0cl0gIittIiAobG9jay0+bG9jayksCisJCSAgW3RpY2tldF0gIj0mciIgKHRtcCksCisJCSAgW215X3RpY2tldF0gIj0mciIgKG15X3RpY2tldCkpOworCX0gZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgkuc2V0IHB1c2gJCSMgX19yYXdfc3Bpbl9sb2NrCVxuIgorCQkiCS5zZXQgbm9yZW9yZGVyCQkJCQlcbiIKKwkJIgkJCQkJCQlcbiIKKwkJIglsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiMToJYWRkaXUJJVtteV90aWNrZXRdLCAlW3RpY2tldF0sIDB4NDAwMAkJXG4iCisJCSIJc2MJJVtteV90aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIgliZXF6CSVbbXlfdGlja2V0XSwgM2YJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJc3JsCSVbbXlfdGlja2V0XSwgJVt0aWNrZXRdLCAxNAkJXG4iCisJCSIJYW5kaQklW215X3RpY2tldF0sICVbbXlfdGlja2V0XSwgMHgxZmZmCVxuIgorCQkiCWFuZGkJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDB4MWZmZgkJXG4iCisJCSIJYm5lCSVbdGlja2V0XSwgJVtteV90aWNrZXRdLCA0ZgkJXG4iCisJCSIJIHN1YnUJJVt0aWNrZXRdLCAlW215X3RpY2tldF0sICVbdGlja2V0XQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgorCQkiMzoJYgkxYgkJCQkJXG4iCisJCSIJIGxsCSVbdGlja2V0XSwgJVt0aWNrZXRfcHRyXQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSI0OglhbmRpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDFmZmYJCVxuIgorCQkiNToJc2xsCSVbdGlja2V0XSwgNQkJCQlcbiIKKwkJIgkJCQkJCQlcbiIKKwkJIjY6CWJuZXoJJVt0aWNrZXRdLCA2YgkJCQlcbiIKKwkJIgkgc3VidQklW3RpY2tldF0sIDEJCQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSIJbHcJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIglhbmRpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDFmZmYJCVxuIgorCQkiCWJlcQklW3RpY2tldF0sICVbbXlfdGlja2V0XSwgMmIJCVxuIgorCQkiCSBzdWJ1CSVbdGlja2V0XSwgJVtteV90aWNrZXRdLCAlW3RpY2tldF0JXG4iCisJCSIJYgk1YgkJCQkJXG4iCisJCSIJIHN1YnUJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDEJCQlcbiIKKwkJIgkucHJldmlvdXMJCQkJCVxuIgorCQkiCS5zZXQgcG9wCQkJCQlcbiIKKwkJOiBbdGlja2V0X3B0cl0gIittIiAobG9jay0+bG9jayksCisJCSAgW3RpY2tldF0gIj0mciIgKHRtcCksCisJCSAgW215X3RpY2tldF0gIj0mciIgKG15X3RpY2tldCkpOworCX0KKworCXNtcF9sbHNjX21iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgdG1wOworCisJc21wX2xsc2NfbWIoKTsKKworCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCQkJCSMgX19yYXdfc3Bpbl91bmxvY2sJXG4iCisJCSIxOglsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiCWFkZGl1CSVbdGlja2V0XSwgJVt0aWNrZXRdLCAxCQkJXG4iCisJCSIJb3JpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDIwMDAJCVxuIgorCQkiCXhvcmkJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDB4MjAwMAkJXG4iCisJCSIJc2MJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIgliZXF6bAklW3RpY2tldF0sIDFiCQkJCVxuIgorCQk6IFt0aWNrZXRfcHRyXSAiK20iIChsb2NrLT5sb2NrKSwKKwkJICBbdGlja2V0XSAiPSZyIiAodG1wKSk7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCS5zZXQgcHVzaAkJIyBfX3Jhd19zcGluX3VubG9jawlcbiIKKwkJIgkuc2V0IG5vcmVvcmRlcgkJCQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSIJbGwJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIjE6CWFkZGl1CSVbdGlja2V0XSwgJVt0aWNrZXRdLCAxCQkJXG4iCisJCSIJb3JpCSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDIwMDAJCVxuIgorCQkiCXhvcmkJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDB4MjAwMAkJXG4iCisJCSIJc2MJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIgliZXF6CSVbdGlja2V0XSwgMmYJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgorCQkiCQkJCQkJCVxuIgorCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgorCQkiMjoJYgkxYgkJCQkJXG4iCisJCSIJIGxsCSVbdGlja2V0XSwgJVt0aWNrZXRfcHRyXQkJXG4iCisJCSIJLnByZXZpb3VzCQkJCQlcbiIKKwkJIgkuc2V0IHBvcAkJCQkJXG4iCisJCTogW3RpY2tldF9wdHJdICIrbSIgKGxvY2stPmxvY2spLAorCQkgIFt0aWNrZXRdICI9JnIiICh0bXApKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgdG1wLCB0bXAyLCB0bXAzOworCisJaWYgKFIxMDAwMF9MTFNDX1dBUikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIJLnNldCBwdXNoCQkjIF9fcmF3X3NwaW5fdHJ5bG9jawlcbiIKKwkJIgkuc2V0IG5vcmVvcmRlcgkJCQkJXG4iCisJCSIJCQkJCQkJXG4iCisJCSIxOglsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiCXNybAklW215X3RpY2tldF0sICVbdGlja2V0XSwgMTQJCVxuIgorCQkiCWFuZGkJJVtteV90aWNrZXRdLCAlW215X3RpY2tldF0sIDB4MWZmZglcbiIKKwkJIglhbmRpCSVbbm93X3NlcnZpbmddLCAlW3RpY2tldF0sIDB4MWZmZglcbiIKKwkJIglibmUJJVtteV90aWNrZXRdLCAlW25vd19zZXJ2aW5nXSwgM2YJXG4iCisJCSIJIGFkZGl1CSVbdGlja2V0XSwgJVt0aWNrZXRdLCAweDQwMDAJCVxuIgorCQkiCXNjCSVbdGlja2V0XSwgJVt0aWNrZXRfcHRyXQkJXG4iCisJCSIJYmVxemwJJVt0aWNrZXRdLCAxYgkJCQlcbiIKKwkJIgkgbGkJJVt0aWNrZXRdLCAxCQkJCVxuIgorCQkiMjoJCQkJCQkJXG4iCisJCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCisJCSIzOgliCTJiCQkJCQlcbiIKKwkJIgkgbGkJJVt0aWNrZXRdLCAwCQkJCVxuIgorCQkiCS5wcmV2aW91cwkJCQkJXG4iCisJCSIJLnNldCBwb3AJCQkJCVxuIgorCQk6IFt0aWNrZXRfcHRyXSAiK20iIChsb2NrLT5sb2NrKSwKKwkJICBbdGlja2V0XSAiPSZyIiAodG1wKSwKKwkJICBbbXlfdGlja2V0XSAiPSZyIiAodG1wMiksCisJCSAgW25vd19zZXJ2aW5nXSAiPSZyIiAodG1wMykpOworCX0gZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgkuc2V0IHB1c2gJCSMgX19yYXdfc3Bpbl90cnlsb2NrCVxuIgorCQkiCS5zZXQgbm9yZW9yZGVyCQkJCQlcbiIKKwkJIgkJCQkJCQlcbiIKKwkJIglsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiMToJc3JsCSVbbXlfdGlja2V0XSwgJVt0aWNrZXRdLCAxNAkJXG4iCisJCSIJYW5kaQklW215X3RpY2tldF0sICVbbXlfdGlja2V0XSwgMHgxZmZmCVxuIgorCQkiCWFuZGkJJVtub3dfc2VydmluZ10sICVbdGlja2V0XSwgMHgxZmZmCVxuIgorCQkiCWJuZQklW215X3RpY2tldF0sICVbbm93X3NlcnZpbmddLCAzZglcbiIKKwkJIgkgYWRkaXUJJVt0aWNrZXRdLCAlW3RpY2tldF0sIDB4NDAwMAkJXG4iCisJCSIJc2MJJVt0aWNrZXRdLCAlW3RpY2tldF9wdHJdCQlcbiIKKwkJIgliZXF6CSVbdGlja2V0XSwgNGYJCQkJXG4iCisJCSIJIGxpCSVbdGlja2V0XSwgMQkJCQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgorCQkiMzoJYgkyYgkJCQkJXG4iCisJCSIJIGxpCSVbdGlja2V0XSwgMAkJCQlcbiIKKwkJIjQ6CWIJMWIJCQkJCVxuIgorCQkiCSBsbAklW3RpY2tldF0sICVbdGlja2V0X3B0cl0JCVxuIgorCQkiCS5wcmV2aW91cwkJCQkJXG4iCisJCSIJLnNldCBwb3AJCQkJCVxuIgorCQk6IFt0aWNrZXRfcHRyXSAiK20iIChsb2NrLT5sb2NrKSwKKwkJICBbdGlja2V0XSAiPSZyIiAodG1wKSwKKwkJICBbbXlfdGlja2V0XSAiPSZyIiAodG1wMiksCisJCSAgW25vd19zZXJ2aW5nXSAiPSZyIiAodG1wMykpOworCX0KKworCXNtcF9sbHNjX21iKCk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKgorICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMgYnV0IG9ubHkgb25lIHdyaXRlci4KKyAqCisgKiBOT1RFISBpdCBpcyBxdWl0ZSBjb21tb24gdG8gaGF2ZSByZWFkZXJzIGluIGludGVycnVwdHMgYnV0IG5vIGludGVycnVwdAorICogd3JpdGVycy4gRm9yIHRob3NlIGNpcmN1bXN0YW5jZXMgd2UgY2FuICJtaXgiIGlycS1zYWZlIGxvY2tzIC0gYW55IHdyaXRlcgorICogbmVlZHMgdG8gZ2V0IGEgaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQorICogcmVhZC1sb2Nrcy4KKyAqLworCisvKgorICogcmVhZF9jYW5fbG9jayAtIHdvdWxkIHJlYWRfdHJ5bG9jaygpIHN1Y2NlZWQ/CisgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KKyAqLworI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJ3KQkoKHJ3KS0+bG9jayA+PSAwKQorCisvKgorICogd3JpdGVfY2FuX2xvY2sgLSB3b3VsZCB3cml0ZV90cnlsb2NrKCkgc3VjY2VlZD8KKyAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgorICovCisjZGVmaW5lIF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJ3KQkoIShydyktPmxvY2spCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJaWYgKFIxMDAwMF9MTFNDX1dBUikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3JlYWRfbG9jawlcbiIKKwkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCisJCSIJYmx0egklMSwgMWIJCQkJCVxuIgorCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKKwkJIglzYwklMSwgJTAJCQkJCVxuIgorCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgorCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCisJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQorCQk6ICJtIiAocnctPmxvY2spCisJCTogIm1lbW9yeSIpOworCX0gZWxzZSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF9sb2NrCVxuIgorCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKKwkJIglibHR6CSUxLCAyZgkJCQkJXG4iCisJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxegklMSwgMWIJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJIgkuc3Vic2VjdGlvbiAyCQkJCQlcbiIKKwkJIjI6CWxsCSUxLCAlMgkJCQkJXG4iCisJCSIJYmx0egklMSwgMmIJCQkJCVxuIgorCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKKwkJIgliCTFiCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJLnByZXZpb3VzCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKKwkJOiAibSIgKHJ3LT5sb2NrKQorCQk6ICJtZW1vcnkiKTsKKwl9CisKKwlzbXBfbGxzY19tYigpOworfQorCisvKiBOb3RlIHRoZSB1c2Ugb2Ygc3ViLCBub3Qgc3VidSB3aGljaCB3aWxsIG1ha2UgdGhlIGtlcm5lbCBkaWUgd2l0aCBhbgorICAgb3ZlcmZsb3cgZXhjZXB0aW9uIGlmIHdlIGV2ZXIgdHJ5IHRvIHVubG9jayBhbiByd2xvY2sgdGhhdCBpcyBhbHJlYWR5CisgICB1bmxvY2tlZCBvciBpcyBiZWluZyBoZWxkIGJ5IGEgd3JpdGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlzbXBfbGxzY19tYigpOworCisJaWYgKFIxMDAwMF9MTFNDX1dBUikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIjE6CWxsCSUxLCAlMgkJIyBfX3Jhd19yZWFkX3VubG9jawlcbiIKKwkJIglzdWIJJTEsIDEJCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKKwkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCisJCTogIm0iIChydy0+bG9jaykKKwkJOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX3VubG9jawlcbiIKKwkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCisJCSIJc3ViCSUxLCAxCQkJCQlcbiIKKwkJIglzYwklMSwgJTAJCQkJCVxuIgorCQkiCWJlcXoJJTEsIDJmCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCisJCSIyOgliCTFiCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJLnByZXZpb3VzCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKKwkJOiAibSIgKHJ3LT5sb2NrKQorCQk6ICJtZW1vcnkiKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKworCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV9sb2NrCVxuIgorCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKKwkJIglibmV6CSUxLCAxYgkJCQkJXG4iCisJCSIJIGx1aQklMSwgMHg4MDAwCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKKwkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCisJCTogIm0iIChydy0+bG9jaykKKwkJOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV9sb2NrCVxuIgorCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKKwkJIglibmV6CSUxLCAyZgkJCQkJXG4iCisJCSIJIGx1aQklMSwgMHg4MDAwCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxegklMSwgMmYJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJIgkuc3Vic2VjdGlvbiAyCQkJCQlcbiIKKwkJIjI6CWxsCSUxLCAlMgkJCQkJXG4iCisJCSIJYm5legklMSwgMmIJCQkJCVxuIgorCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKKwkJIgliCTFiCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCSIJLnByZXZpb3VzCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKKwkJOiAibSIgKHJ3LT5sb2NrKQorCQk6ICJtZW1vcnkiKTsKKwl9CisKKwlzbXBfbGxzY19tYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJc21wX21iKCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiCQkJCSMgX19yYXdfd3JpdGVfdW5sb2NrCVxuIgorCSIJc3cJJDAsICUwCQkJCQlcbiIKKwk6ICI9bSIgKHJ3LT5sb2NrKQorCTogIm0iIChydy0+bG9jaykKKwk6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmV0OworCisJaWYgKFIxMDAwMF9MTFNDX1dBUikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3JlYWRfdHJ5bG9jawlcbiIKKwkJIglsaQklMiwgMAkJCQkJXG4iCisJCSIxOglsbAklMSwgJTMJCQkJCVxuIgorCQkiCWJsdHoJJTEsIDJmCQkJCQlcbiIKKwkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCisJCSIJc2MJJTEsICUwCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgorCQlfX1dFQUtfTExTQ19NQgorCQkiCWxpCSUyLCAxCQkJCQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCisJCTogIm0iIChydy0+bG9jaykKKwkJOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX3RyeWxvY2sJXG4iCisJCSIJbGkJJTIsIDAJCQkJCVxuIgorCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKKwkJIglibHR6CSUxLCAyZgkJCQkJXG4iCisJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxegklMSwgMWIJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQlfX1dFQUtfTExTQ19NQgorCQkiCWxpCSUyLCAxCQkJCQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCisJCTogIm0iIChydy0+bG9jaykKKwkJOiAibWVtb3J5Iik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IHJldDsKKworCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV90cnlsb2NrCVxuIgorCQkiCWxpCSUyLCAwCQkJCQlcbiIKKwkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCisJCSIJYm5legklMSwgMmYJCQkJCVxuIgorCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKKwkJIglzYwklMSwgJTAJCQkJCVxuIgorCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgorCQlfX1dFQUtfTExTQ19NQgorCQkiCWxpCSUyLCAxCQkJCQlcbiIKKwkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgorCQkiMjoJCQkJCQkJXG4iCisJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKSwgIj0mciIgKHJldCkKKwkJOiAibSIgKHJ3LT5sb2NrKQorCQk6ICJtZW1vcnkiKTsKKwl9IGVsc2UgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3dyaXRlX3RyeWxvY2sJXG4iCisJCSIJbGkJJTIsIDAJCQkJCVxuIgorCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKKwkJIglibmV6CSUxLCAyZgkJCQkJXG4iCisJCSIJbHVpCSUxLCAweDgwMDAJCQkJXG4iCisJCSIJc2MJJTEsICUwCQkJCQlcbiIKKwkJIgliZXF6CSUxLCAzZgkJCQkJXG4iCisJCSIJIGxpCSUyLCAxCQkJCQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQlfX1dFQUtfTExTQ19NQgorCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgorCQkiMzoJYgkxYgkJCQkJXG4iCisJCSIJIGxpCSUyLCAwCQkJCQlcbiIKKwkJIgkucHJldmlvdXMJCQkJCVxuIgorCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCisJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKSwgIj0mciIgKHJldCkKKwkJOiAibSIgKHJ3LT5sb2NrKQorCQk6ICJtZW1vcnkiKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKyNkZWZpbmUgX3Jhd19zcGluX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCisjZGVmaW5lIF9yYXdfcmVhZF9yZWxheChsb2NrKQljcHVfcmVsYXgoKQorI2RlZmluZSBfcmF3X3dyaXRlX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCisKKyNlbmRpZiAvKiBfQVNNX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlZWRhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9BU01fU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJLyoKKwkgKiBiaXRzICAwLi4xMzogc2VydmluZ19ub3cKKwkgKiBiaXRzIDE0ICAgIDoganVuayBkYXRhCisJICogYml0cyAxNS4uMjg6IHRpY2tldAorCSAqLworCXVuc2lnbmVkIGludCBsb2NrOworfSByYXdfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworfSByYXdfcndsb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2tmcmFtZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM3YzRlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja2ZyYW1lLmgKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTksIDIwMDEgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgUGF1bCBNLiBBbnRvaW5lLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgTWFjaWVqIFcuIFJvenlja2kKKyAqLworI2lmbmRlZiBfQVNNX1NUQUNLRlJBTUVfSAorI2RlZmluZSBfQVNNX1NUQUNLRlJBTUVfSAorCisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisvKgorICogRm9yIFNNVEMga2VybmVsLCBnbG9iYWwgSUUgc2hvdWxkIGJlIGxlZnQgc2V0LCBhbmQgaW50ZXJydXB0cworICogY29udHJvbGxlZCBleGNsdXNpdmVseSB2aWEgSVhNVC4KKyAqLworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKyNkZWZpbmUgU1RBVE1BU0sgMHgxZQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQorI2RlZmluZSBTVEFUTUFTSyAweDNmCisjZWxzZQorI2RlZmluZSBTVEFUTUFTSyAweDFmCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKyNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgorI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KKworCQkubWFjcm8JU0FWRV9BVAorCQkuc2V0CXB1c2gKKwkJLnNldAlub2F0CisJCUxPTkdfUwkkMSwgUFRfUjEoc3ApCisJCS5zZXQJcG9wCisJCS5lbmRtCisKKwkJLm1hY3JvCVNBVkVfVEVNUAorI2lmZGVmIENPTkZJR19DUFVfSEFTX1NNQVJUTUlQUworCQltZmxoeHUJdjEKKwkJTE9OR19TCXYxLCBQVF9MTyhzcCkKKwkJbWZsaHh1CXYxCisJCUxPTkdfUwl2MSwgUFRfSEkoc3ApCisJCW1mbGh4dQl2MQorCQlMT05HX1MJdjEsIFBUX0FDWChzcCkKKyNlbHNlCisJCW1maGkJdjEKKwkJTE9OR19TCXYxLCBQVF9ISShzcCkKKwkJbWZsbwl2MQorCQlMT05HX1MJdjEsIFBUX0xPKHNwKQorI2VuZGlmCisjaWZkZWYgQ09ORklHXzMyQklUCisJCUxPTkdfUwkkOCwgUFRfUjgoc3ApCisJCUxPTkdfUwkkOSwgUFRfUjkoc3ApCisjZW5kaWYKKwkJTE9OR19TCSQxMCwgUFRfUjEwKHNwKQorCQlMT05HX1MJJDExLCBQVF9SMTEoc3ApCisJCUxPTkdfUwkkMTIsIFBUX1IxMihzcCkKKwkJTE9OR19TCSQxMywgUFRfUjEzKHNwKQorCQlMT05HX1MJJDE0LCBQVF9SMTQoc3ApCisJCUxPTkdfUwkkMTUsIFBUX1IxNShzcCkKKwkJTE9OR19TCSQyNCwgUFRfUjI0KHNwKQorCQkuZW5kbQorCisJCS5tYWNybwlTQVZFX1NUQVRJQworCQlMT05HX1MJJDE2LCBQVF9SMTYoc3ApCisJCUxPTkdfUwkkMTcsIFBUX1IxNyhzcCkKKwkJTE9OR19TCSQxOCwgUFRfUjE4KHNwKQorCQlMT05HX1MJJDE5LCBQVF9SMTkoc3ApCisJCUxPTkdfUwkkMjAsIFBUX1IyMChzcCkKKwkJTE9OR19TCSQyMSwgUFRfUjIxKHNwKQorCQlMT05HX1MJJDIyLCBQVF9SMjIoc3ApCisJCUxPTkdfUwkkMjMsIFBUX1IyMyhzcCkKKwkJTE9OR19TCSQzMCwgUFRfUjMwKHNwKQorCQkuZW5kbQorCisjaWZkZWYgQ09ORklHX1NNUAorI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKyNkZWZpbmUgUFRFQkFTRV9TSElGVAkxOQkvKiBUQ0JJTkQgKi8KKyNlbHNlCisjZGVmaW5lIFBURUJBU0VfU0hJRlQJMjMJLyogQ09OVEVYVCAqLworI2VuZGlmCisJCS5tYWNybwlnZXRfc2F2ZWRfc3AJLyogU01QIHZhcmlhdGlvbiAqLworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkJbWZjMAlrMCwgQ1AwX1RDQklORAorI2Vsc2UKKwkJTUZDMAlrMCwgQ1AwX0NPTlRFWFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHXzMyQklUKSB8fCBkZWZpbmVkKEtCVUlMRF82NEJJVF9TWU0zMikKKwkJbHVpCWsxLCAlaGkoa2VybmVsc3ApCisjZWxzZQorCQlsdWkJazEsICVoaWdoZXN0KGtlcm5lbHNwKQorCQlkYWRkaXUJazEsICVoaWdoZXIoa2VybmVsc3ApCisJCWRzbGwJazEsIDE2CisJCWRhZGRpdQlrMSwgJWhpKGtlcm5lbHNwKQorCQlkc2xsCWsxLCAxNgorI2VuZGlmCisJCUxPTkdfU1JMCWswLCBQVEVCQVNFX1NISUZUCisJCUxPTkdfQUREVQlrMSwgazAKKwkJTE9OR19MCWsxLCAlbG8oa2VybmVsc3ApKGsxKQorCQkuZW5kbQorCisJCS5tYWNybwlzZXRfc2F2ZWRfc3Agc3RhY2twIHRlbXAgdGVtcDIKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJCW1mYzAJXHRlbXAsIENQMF9UQ0JJTkQKKyNlbHNlCisJCU1GQzAJXHRlbXAsIENQMF9DT05URVhUCisjZW5kaWYKKwkJTE9OR19TUkwJXHRlbXAsIFBURUJBU0VfU0hJRlQKKwkJTE9OR19TCVxzdGFja3AsIGtlcm5lbHNwKFx0ZW1wKQorCQkuZW5kbQorI2Vsc2UKKwkJLm1hY3JvCWdldF9zYXZlZF9zcAkvKiBVbmlwcm9jZXNzb3IgdmFyaWF0aW9uICovCisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpIHx8IGRlZmluZWQoS0JVSUxEXzY0QklUX1NZTTMyKQorCQlsdWkJazEsICVoaShrZXJuZWxzcCkKKyNlbHNlCisJCWx1aQlrMSwgJWhpZ2hlc3Qoa2VybmVsc3ApCisJCWRhZGRpdQlrMSwgJWhpZ2hlcihrZXJuZWxzcCkKKwkJZHNsbAlrMSwgazEsIDE2CisJCWRhZGRpdQlrMSwgJWhpKGtlcm5lbHNwKQorCQlkc2xsCWsxLCBrMSwgMTYKKyNlbmRpZgorCQlMT05HX0wJazEsICVsbyhrZXJuZWxzcCkoazEpCisJCS5lbmRtCisKKwkJLm1hY3JvCXNldF9zYXZlZF9zcCBzdGFja3AgdGVtcCB0ZW1wMgorCQlMT05HX1MJXHN0YWNrcCwga2VybmVsc3AKKwkJLmVuZG0KKyNlbmRpZgorCisJCS5tYWNybwlTQVZFX1NPTUUKKwkJLnNldAlwdXNoCisJCS5zZXQJbm9hdAorCQkuc2V0CXJlb3JkZXIKKwkJbWZjMAlrMCwgQ1AwX1NUQVRVUworCQlzbGwJazAsIDMJCS8qIGV4dHJhY3QgY3UwIGJpdCAqLworCQkuc2V0CW5vcmVvcmRlcgorCQlibHR6CWswLCA4ZgorCQkgbW92ZQlrMSwgc3AKKwkJLnNldAlyZW9yZGVyCisJCS8qIENhbGxlZCBmcm9tIHVzZXIgbW9kZSwgbmV3IHN0YWNrLiAqLworCQlnZXRfc2F2ZWRfc3AKKyNpZm5kZWYgQ09ORklHX0NQVV9EQURESV9XT1JLQVJPVU5EUworODoJCW1vdmUJazAsIHNwCisJCVBUUl9TVUJVIHNwLCBrMSwgUFRfU0laRQorI2Vsc2UKKwkJLnNldAlhdD1rMAorODoJCVBUUl9TVUJVIGsxLCBQVF9TSVpFCisJCS5zZXQJbm9hdAorCQltb3ZlCWswLCBzcAorCQltb3ZlCXNwLCBrMQorI2VuZGlmCisJCUxPTkdfUwlrMCwgUFRfUjI5KHNwKQorCQlMT05HX1MJJDMsIFBUX1IzKHNwKQorCQkvKgorCQkgKiBZb3UgbWlnaHQgdGhpbmsgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzYXZlICQwLAorCQkgKiBidXQgdGhlIEZQVSBlbXVsYXRvciBhbmQgZ2RiIHJlbW90ZSBkZWJ1ZyBzdHViCisJCSAqIG5lZWQgaXQgdG8gb3BlcmF0ZSBjb3JyZWN0bHkKKwkJICovCisJCUxPTkdfUwkkMCwgUFRfUjAoc3ApCisJCW1mYzAJdjEsIENQMF9TVEFUVVMKKwkJTE9OR19TCSQyLCBQVF9SMihzcCkKKwkJTE9OR19TCXYxLCBQVF9TVEFUVVMoc3ApCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCQkvKgorCQkgKiBJZGVhbGx5LCB0aGVzZSBpbnN0cnVjdGlvbnMgd291bGQgYmUgc2h1ZmZsZWQgaW4KKwkJICogdG8gY292ZXIgdGhlIHBpcGVsaW5lIGRlbGF5LgorCQkgKi8KKwkJLnNldAltaXBzMzIKKwkJbWZjMAl2MSwgQ1AwX1RDU1RBVFVTCisJCS5zZXQJbWlwczAKKwkJTE9OR19TCXYxLCBQVF9UQ1NUQVRVUyhzcCkKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJCUxPTkdfUwkkNCwgUFRfUjQoc3ApCisJCW1mYzAJdjEsIENQMF9DQVVTRQorCQlMT05HX1MJJDUsIFBUX1I1KHNwKQorCQlMT05HX1MJdjEsIFBUX0NBVVNFKHNwKQorCQlMT05HX1MJJDYsIFBUX1I2KHNwKQorCQlNRkMwCXYxLCBDUDBfRVBDCisJCUxPTkdfUwkkNywgUFRfUjcoc3ApCisjaWZkZWYgQ09ORklHXzY0QklUCisJCUxPTkdfUwkkOCwgUFRfUjgoc3ApCisJCUxPTkdfUwkkOSwgUFRfUjkoc3ApCisjZW5kaWYKKwkJTE9OR19TCXYxLCBQVF9FUEMoc3ApCisJCUxPTkdfUwkkMjUsIFBUX1IyNShzcCkKKwkJTE9OR19TCSQyOCwgUFRfUjI4KHNwKQorCQlMT05HX1MJJDMxLCBQVF9SMzEoc3ApCisJCW9yaQkkMjgsIHNwLCBfVEhSRUFEX01BU0sKKwkJeG9yaQkkMjgsIF9USFJFQURfTUFTSworCQkuc2V0CXBvcAorCQkuZW5kbQorCisJCS5tYWNybwlTQVZFX0FMTAorCQlTQVZFX1NPTUUKKwkJU0FWRV9BVAorCQlTQVZFX1RFTVAKKwkJU0FWRV9TVEFUSUMKKwkJLmVuZG0KKworCQkubWFjcm8JUkVTVE9SRV9BVAorCQkuc2V0CXB1c2gKKwkJLnNldAlub2F0CisJCUxPTkdfTAkkMSwgIFBUX1IxKHNwKQorCQkuc2V0CXBvcAorCQkuZW5kbQorCisJCS5tYWNybwlSRVNUT1JFX1RFTVAKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19TTUFSVE1JUFMKKwkJTE9OR19MCSQyNCwgUFRfQUNYKHNwKQorCQltdGxoeAkkMjQKKwkJTE9OR19MCSQyNCwgUFRfSEkoc3ApCisJCW10bGh4CSQyNAorCQlMT05HX0wJJDI0LCBQVF9MTyhzcCkKKwkJbXRsaHgJJDI0CisjZWxzZQorCQlMT05HX0wJJDI0LCBQVF9MTyhzcCkKKwkJbXRsbwkkMjQKKwkJTE9OR19MCSQyNCwgUFRfSEkoc3ApCisJCW10aGkJJDI0CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwkJTE9OR19MCSQ4LCBQVF9SOChzcCkKKwkJTE9OR19MCSQ5LCBQVF9SOShzcCkKKyNlbmRpZgorCQlMT05HX0wJJDEwLCBQVF9SMTAoc3ApCisJCUxPTkdfTAkkMTEsIFBUX1IxMShzcCkKKwkJTE9OR19MCSQxMiwgUFRfUjEyKHNwKQorCQlMT05HX0wJJDEzLCBQVF9SMTMoc3ApCisJCUxPTkdfTAkkMTQsIFBUX1IxNChzcCkKKwkJTE9OR19MCSQxNSwgUFRfUjE1KHNwKQorCQlMT05HX0wJJDI0LCBQVF9SMjQoc3ApCisJCS5lbmRtCisKKwkJLm1hY3JvCVJFU1RPUkVfU1RBVElDCisJCUxPTkdfTAkkMTYsIFBUX1IxNihzcCkKKwkJTE9OR19MCSQxNywgUFRfUjE3KHNwKQorCQlMT05HX0wJJDE4LCBQVF9SMTgoc3ApCisJCUxPTkdfTAkkMTksIFBUX1IxOShzcCkKKwkJTE9OR19MCSQyMCwgUFRfUjIwKHNwKQorCQlMT05HX0wJJDIxLCBQVF9SMjEoc3ApCisJCUxPTkdfTAkkMjIsIFBUX1IyMihzcCkKKwkJTE9OR19MCSQyMywgUFRfUjIzKHNwKQorCQlMT05HX0wJJDMwLCBQVF9SMzAoc3ApCisJCS5lbmRtCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUjMwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9UWDM5WFgpCisKKwkJLm1hY3JvCVJFU1RPUkVfU09NRQorCQkuc2V0CXB1c2gKKwkJLnNldAlyZW9yZGVyCisJCS5zZXQJbm9hdAorCQltZmMwCWEwLCBDUDBfU1RBVFVTCisJCWxpCXYxLCAweGZmMDAKKwkJb3JpCWEwLCBTVEFUTUFTSworCQl4b3JpCWEwLCBTVEFUTUFTSworCQltdGMwCWEwLCBDUDBfU1RBVFVTCisJCWFuZAlhMCwgdjEKKwkJTE9OR19MCXYwLCBQVF9TVEFUVVMoc3ApCisJCW5vcgl2MSwgJDAsIHYxCisJCWFuZAl2MCwgdjEKKwkJb3IJdjAsIGEwCisJCW10YzAJdjAsIENQMF9TVEFUVVMKKwkJTE9OR19MCSQzMSwgUFRfUjMxKHNwKQorCQlMT05HX0wJJDI4LCBQVF9SMjgoc3ApCisJCUxPTkdfTAkkMjUsIFBUX1IyNShzcCkKKwkJTE9OR19MCSQ3LCAgUFRfUjcoc3ApCisJCUxPTkdfTAkkNiwgIFBUX1I2KHNwKQorCQlMT05HX0wJJDUsICBQVF9SNShzcCkKKwkJTE9OR19MCSQ0LCAgUFRfUjQoc3ApCisJCUxPTkdfTAkkMywgIFBUX1IzKHNwKQorCQlMT05HX0wJJDIsICBQVF9SMihzcCkKKwkJLnNldAlwb3AKKwkJLmVuZG0KKworCQkubWFjcm8JUkVTVE9SRV9TUF9BTkRfUkVUCisJCS5zZXQJcHVzaAorCQkuc2V0CW5vcmVvcmRlcgorCQlMT05HX0wJazAsIFBUX0VQQyhzcCkKKwkJTE9OR19MCXNwLCBQVF9SMjkoc3ApCisJCWpyCWswCisJCSByZmUKKwkJLnNldAlwb3AKKwkJLmVuZG0KKworI2Vsc2UKKwkJLm1hY3JvCVJFU1RPUkVfU09NRQorCQkuc2V0CXB1c2gKKwkJLnNldAlyZW9yZGVyCisJCS5zZXQJbm9hdAorI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkJLnNldAltaXBzMzJyMgorCQkvKgorCQkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgcmVhZC1tb2RpZnktd3JpdGUKKwkJICogb2YgU3RhdHVzIGJlbG93IGlzbid0IHBlcnR1cmJlZCBieSBhbiBpbnRlcnJ1cHQKKwkJICogb3IgY3Jvc3MtVEMgYWNjZXNzLCBzbyB3ZSBuZWVkIHRvIGRvIGF0IGxlYXN0IGEgRE1ULAorCQkgKiBwcm90ZWN0ZWQgYnkgYW4gaW50ZXJydXB0LWluaGliaXQuIEJ1dCBzZXR0aW5nIElYTVQKKwkJICogYWxzbyBjcmVhdGVzIGEgZmV3LWN5Y2xlIHdpbmRvdyB3aGVyZSBhbiBJUEkgY291bGQKKwkJICogYmUgcXVldWVkIGFuZCBub3QgYmUgZGV0ZWN0ZWQgYmVmb3JlIHBvdGVudGlhbGx5CisJCSAqIHJldHVybmluZyB0byBhIFdBSVQgb3IgdXNlci1tb2RlIGxvb3AuIEl0IG11c3QgYmUKKwkJICogcmVwbGF5ZWQuCisJCSAqCisJCSAqIFdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBjb250ZXh0IHN3aXRjaCwgYW5kCisJCSAqIHdlIGNhbid0IGRpc3BhdGNoIGl0IGRpcmVjdGx5IHdpdGhvdXQgdHJhc2hpbmcKKwkJICogc29tZSByZWdpc3RlcnMsIHNvIHdlJ2xsIHRyeSB0byBkZXRlY3QgdGhpcyB1bmxpa2VseQorCQkgKiBjYXNlIGFuZCBwcm9ncmFtIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHRoZSBWUEUsCisJCSAqIGFzIHdvdWxkIGJlIGRvbmUgZm9yIGEgY3Jvc3MtVlBFIElQSS4gIFRvIGFjY29tb2RhdGUKKwkJICogdGhlIGhhbmRsaW5nIG9mIHRoYXQgY2FzZSwgd2UncmUgZG9pbmcgYSBEVlBFIGluc3RlYWQKKwkJICogb2YganVzdCBhIERNVCBoZXJlIHRvIHByb3RlY3QgYWdhaW5zdCBvdGhlciB0aHJlYWRzLgorCQkgKiBUaGlzIGlzIGEgbG90IG9mIGNydWZ0IHRvIGNvdmVyIGEgdGlueSB3aW5kb3cuCisJCSAqIElmIHlvdSBjYW4gZmluZCBhIGJldHRlciBkZXNpZ24sIGltcGxlbWVudCBpdCEKKwkJICoKKwkJICovCisJCW1mYzAJdjAsIENQMF9UQ1NUQVRVUworCQlvcmkJdjAsIFRDU1RBVFVTX0lYTVQKKwkJbXRjMAl2MCwgQ1AwX1RDU1RBVFVTCisJCV9laGIKKwkJRFZQRQk1CQkJCSMgZHZwZSBhMQorCQlqYWwJbWlwc19paGIKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJCW1mYzAJYTAsIENQMF9TVEFUVVMKKwkJb3JpCWEwLCBTVEFUTUFTSworCQl4b3JpCWEwLCBTVEFUTUFTSworCQltdGMwCWEwLCBDUDBfU1RBVFVTCisJCWxpCXYxLCAweGZmMDAKKwkJYW5kCWEwLCB2MQorCQlMT05HX0wJdjAsIFBUX1NUQVRVUyhzcCkKKwkJbm9yCXYxLCAkMCwgdjEKKwkJYW5kCXYwLCB2MQorCQlvcgl2MCwgYTAKKwkJbXRjMAl2MCwgQ1AwX1NUQVRVUworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKy8qCisgKiBPbmx5IGFmdGVyIEVYTC9FUkwgaGF2ZSBiZWVuIHJlc3RvcmVkIHRvIHN0YXR1cyBjYW4gd2UKKyAqIHJlc3RvcmUgVENTdGF0dXMuSVhNVC4KKyAqLworCQlMT05HX0wJdjEsIFBUX1RDU1RBVFVTKHNwKQorCQlfZWhiCisJCW1mYzAJYTAsIENQMF9UQ1NUQVRVUworCQlhbmRpCXYxLCBUQ1NUQVRVU19JWE1UCisJCWJuZXoJdjEsIDBmCisKKy8qCisgKiBXZSdkIGxpa2UgdG8gZGV0ZWN0IGFueSBJUElzIHF1ZXVlZCBpbiB0aGUgdGlueSB3aW5kb3cKKyAqIGFib3ZlIGFuZCByZXF1ZXN0IGFuIHNvZnR3YXJlIGludGVycnVwdCB0byBzZXJ2aWNlIHRoZW0KKyAqIHdoZW4gd2UgRVJFVC4KKyAqCisgKiBDb21wdXRpbmcgdGhlIG9mZnNldCBpbnRvIHRoZSBJUElRIGFycmF5IG9mIHRoZSBleGVjdXRpbmcKKyAqIFRDJ3MgSVBJIHF1ZXVlIGluLWxpbmUgd291bGQgYmUgdGVkaW91cy4gIFdlIHVzZSBwYXJ0IG9mCisgKiB0aGUgVENDb250ZXh0IHJlZ2lzdGVyIHRvIGhvbGQgMTYgYml0cyBvZiBvZmZzZXQgdGhhdCB3ZQorICogY2FuIGFkZCBpbi1saW5lIHRvIGZpbmQgdGhlIHF1ZXVlIGhlYWQuCisgKi8KKwkJbWZjMAl2MCwgQ1AwX1RDQ09OVEVYVAorCQlsYQlhMiwgSVBJUQorCQlzcmwJdjAsIHYwLCAxNgorCQlhZGR1CWEyLCBhMiwgdjAKKwkJTE9OR19MCXYwLCAwKGEyKQorCQliZXF6CXYwLCAwZgorLyoKKyAqIElmIHdlIGhhdmUgYSBxdWV1ZSwgcHJvdm9rZSBkaXNwYXRjaCB3aXRoaW4gdGhlIFZQRSBieSBzZXR0aW5nIENfU1cxCisgKi8KKwkJbWZjMAl2MCwgQ1AwX0NBVVNFCisJCW9yaQl2MCwgdjAsIENfU1cxCisJCW10YzAJdjAsIENQMF9DQVVTRQorMDoKKwkJLyoKKwkJICogVGhpcyB0ZXN0IHNob3VsZCByZWFsbHkgbmV2ZXIgYnJhbmNoIGJ1dAorCQkgKiBsZXQncyBiZSBwcnVkZW50IGhlcmUuICBIYXZpbmcgYXRvbWl6ZWQKKwkJICogdGhlIHNoYXJlZCByZWdpc3RlciBtb2RpZmljYXRpb25zLCB3ZSBjYW4KKwkJICogbm93IEVWUEUsIGFuZCBtdXN0IGRvIHNvIGJlZm9yZSBpbnRlcnJ1cHRzCisJCSAqIGFyZSBwb3RlbnRpYWxseSByZS1lbmFibGVkLgorCQkgKi8KKwkJYW5kaQlhMSwgYTEsIE1WUENPTlRST0xfRVZQCisJCWJlcXoJYTEsIDFmCisJCWV2cGUKKzE6CisJCS8qIFdlIGtub3cgdGhhdCBUQ1N0YXR1YS5JWE1UIHNob3VsZCBiZSBzZXQgZnJvbSBhYm92ZSAqLworCQl4b3JpCWEwLCBhMCwgVENTVEFUVVNfSVhNVAorCQlvcglhMCwgYTAsIHYxCisJCW10YzAJYTAsIENQMF9UQ1NUQVRVUworCQlfZWhiCisKKwkJLnNldAltaXBzMAorI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KKwkJTE9OR19MCXYxLCBQVF9FUEMoc3ApCisJCU1UQzAJdjEsIENQMF9FUEMKKwkJTE9OR19MCSQzMSwgUFRfUjMxKHNwKQorCQlMT05HX0wJJDI4LCBQVF9SMjgoc3ApCisJCUxPTkdfTAkkMjUsIFBUX1IyNShzcCkKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwkJTE9OR19MCSQ4LCBQVF9SOChzcCkKKwkJTE9OR19MCSQ5LCBQVF9SOShzcCkKKyNlbmRpZgorCQlMT05HX0wJJDcsICBQVF9SNyhzcCkKKwkJTE9OR19MCSQ2LCAgUFRfUjYoc3ApCisJCUxPTkdfTAkkNSwgIFBUX1I1KHNwKQorCQlMT05HX0wJJDQsICBQVF9SNChzcCkKKwkJTE9OR19MCSQzLCAgUFRfUjMoc3ApCisJCUxPTkdfTAkkMiwgIFBUX1IyKHNwKQorCQkuc2V0CXBvcAorCQkuZW5kbQorCisJCS5tYWNybwlSRVNUT1JFX1NQX0FORF9SRVQKKwkJTE9OR19MCXNwLCBQVF9SMjkoc3ApCisJCS5zZXQJbWlwczMKKwkJZXJldAorCQkuc2V0CW1pcHMwCisJCS5lbmRtCisKKyNlbmRpZgorCisJCS5tYWNybwlSRVNUT1JFX1NQCisJCUxPTkdfTAlzcCwgUFRfUjI5KHNwKQorCQkuZW5kbQorCisJCS5tYWNybwlSRVNUT1JFX0FMTAorCQlSRVNUT1JFX1RFTVAKKwkJUkVTVE9SRV9TVEFUSUMKKwkJUkVTVE9SRV9BVAorCQlSRVNUT1JFX1NPTUUKKwkJUkVTVE9SRV9TUAorCQkuZW5kbQorCisJCS5tYWNybwlSRVNUT1JFX0FMTF9BTkRfUkVUCisJCVJFU1RPUkVfVEVNUAorCQlSRVNUT1JFX1NUQVRJQworCQlSRVNUT1JFX0FUCisJCVJFU1RPUkVfU09NRQorCQlSRVNUT1JFX1NQX0FORF9SRVQKKwkJLmVuZG0KKworLyoKKyAqIE1vdmUgdG8ga2VybmVsIG1vZGUgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKyAqIFNldCBjcDAgZW5hYmxlIGJpdCBhcyBzaWduIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUga2VybmVsIHN0YWNrCisgKi8KKwkJLm1hY3JvCUNMSQorI2lmICFkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCisJCW1mYzAJdDAsIENQMF9TVEFUVVMKKwkJbGkJdDEsIFNUMF9DVTAgfCBTVEFUTUFTSworCQlvcgl0MCwgdDEKKwkJeG9yaQl0MCwgU1RBVE1BU0sKKwkJbXRjMAl0MCwgQ1AwX1NUQVRVUworI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCQkvKgorCQkgKiBGb3IgU01UQywgd2UgbmVlZCB0byBzZXQgcHJpdmlsZWdlCisJCSAqIGFuZCBkaXNhYmxlIGludGVycnVwdHMgb25seSBmb3IgdGhlCisJCSAqIGN1cnJlbnQgVEMsIHVzaW5nIHRoZSBUQ1N0YXR1cyByZWdpc3Rlci4KKwkJICovCisJCW1mYzAJdDAsIENQMF9UQ1NUQVRVUworCQkvKiBGb3J0dW5hdGVseSBDVSAwIGlzIGluIHRoZSBzYW1lIHBsYWNlIGluIGJvdGggcmVnaXN0ZXJzICovCisJCS8qIFNldCBUQ1UwLCBUTVgsIFRLU1UgKGZvciBsYXRlciBpbnZlcnNpb24pIGFuZCBJWE1UICovCisJCWxpCXQxLCBTVDBfQ1UwIHwgMHgwODAwMWMwMAorCQlvcgl0MCwgdDEKKwkJLyogQ2xlYXIgVEtTVSwgbGVhdmUgSVhNVCAqLworCQl4b3JpCXQwLCAweDAwMDAxODAwCisJCW10YzAJdDAsIENQMF9UQ1NUQVRVUworCQlfZWhiCisJCS8qIFdlIG5lZWQgdG8gbGVhdmUgdGhlIGdsb2JhbCBJRSBiaXQgc2V0LCBidXQgY2xlYXIgRVhMLi4uKi8KKwkJbWZjMAl0MCwgQ1AwX1NUQVRVUworCQlvcmkJdDAsIFNUMF9FWEwgfCBTVDBfRVJMCisJCXhvcmkJdDAsIFNUMF9FWEwgfCBTVDBfRVJMCisJCW10YzAJdDAsIENQMF9TVEFUVVMKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisJCWlycV9kaXNhYmxlX2hhemFyZAorCQkuZW5kbQorCisvKgorICogTW92ZSB0byBrZXJuZWwgbW9kZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCisgKiBTZXQgY3AwIGVuYWJsZSBiaXQgYXMgc2lnbiB0aGF0IHdlJ3JlIHJ1bm5pbmcgb24gdGhlIGtlcm5lbCBzdGFjaworICovCisJCS5tYWNybwlTVEkKKyNpZiAhZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQorCQltZmMwCXQwLCBDUDBfU1RBVFVTCisJCWxpCXQxLCBTVDBfQ1UwIHwgU1RBVE1BU0sKKwkJb3IJdDAsIHQxCisJCXhvcmkJdDAsIFNUQVRNQVNLICYgfjEKKwkJbXRjMAl0MCwgQ1AwX1NUQVRVUworI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCQkvKgorCQkgKiBGb3IgU01UQywgd2UgbmVlZCB0byBzZXQgcHJpdmlsZWdlCisJCSAqIGFuZCBlbmFibGUgaW50ZXJydXB0cyBvbmx5IGZvciB0aGUKKwkJICogY3VycmVudCBUQywgdXNpbmcgdGhlIFRDU3RhdHVzIHJlZ2lzdGVyLgorCQkgKi8KKwkJX2VoYgorCQltZmMwCXQwLCBDUDBfVENTVEFUVVMKKwkJLyogRm9ydHVuYXRlbHkgQ1UgMCBpcyBpbiB0aGUgc2FtZSBwbGFjZSBpbiBib3RoIHJlZ2lzdGVycyAqLworCQkvKiBTZXQgVENVMCwgVEtTVSAoZm9yIGxhdGVyIGludmVyc2lvbikgYW5kIElYTVQgKi8KKwkJbGkJdDEsIFNUMF9DVTAgfCAweDA4MDAxYzAwCisJCW9yCXQwLCB0MQorCQkvKiBDbGVhciBUS1NVICphbmQqIElYTVQgKi8KKwkJeG9yaQl0MCwgMHgwMDAwMWMwMAorCQltdGMwCXQwLCBDUDBfVENTVEFUVVMKKwkJX2VoYgorCQkvKiBXZSBuZWVkIHRvIGxlYXZlIHRoZSBnbG9iYWwgSUUgYml0IHNldCwgYnV0IGNsZWFyIEVYTC4uLiovCisJCW1mYzAJdDAsIENQMF9TVEFUVVMKKwkJb3JpCXQwLCBTVDBfRVhMCisJCXhvcmkJdDAsIFNUMF9FWEwKKwkJbXRjMAl0MCwgQ1AwX1NUQVRVUworCQkvKiBpcnFfZW5hYmxlX2hhemFyZCBiZWxvdyBzaG91bGQgZXhwYW5kIHRvIEVIQiBmb3IgMjRLLzM0SyBjcHVzICovCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCQlpcnFfZW5hYmxlX2hhemFyZAorCQkuZW5kbQorCisvKgorICogSnVzdCBtb3ZlIHRvIGtlcm5lbCBtb2RlIGFuZCBsZWF2ZSBpbnRlcnJ1cHRzIGFzIHRoZXkgYXJlLiAgTm90ZQorICogZm9yIHRoZSBSMzAwMCB0aGlzIG1lYW5zIGNvcHlpbmcgdGhlIHByZXZpb3VzIGVuYWJsZSBmcm9tIElFcC4KKyAqIFNldCBjcDAgZW5hYmxlIGJpdCBhcyBzaWduIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUga2VybmVsIHN0YWNrCisgKi8KKwkJLm1hY3JvCUtNT0RFCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCQkvKgorCQkgKiBUaGlzIGdldHMgYmFyb3F1ZSBpbiBTTVRDLiAgV2Ugd2FudCB0bworCQkgKiBwcm90ZWN0IHRoZSBub24tYXRvbWljIGNsZWFyaW5nIG9mIEVYTAorCQkgKiB3aXRoIERNVC9FTVQsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHRha2UKKwkJICogYW4gaW50ZXJydXB0IHdoaWxlIERNVCBpcyBzdGlsbCBpbiBlZmZlY3QuCisJCSAqLworCisJCS8qIEtNT0RFIGdldHMgaW52b2tlZCBmcm9tIGJvdGggcmVvcmRlciBhbmQgbm9yZW9yZGVyIGNvZGUgKi8KKwkJLnNldAlwdXNoCisJCS5zZXQJbWlwczMycjIKKwkJLnNldAlub3Jlb3JkZXIKKwkJbWZjMAl2MCwgQ1AwX1RDU1RBVFVTCisJCWFuZGkJdjEsIHYwLCBUQ1NUQVRVU19JWE1UCisJCW9yaQl2MCwgVENTVEFUVVNfSVhNVAorCQltdGMwCXYwLCBDUDBfVENTVEFUVVMKKwkJX2VoYgorCQlETVQJMgkJCQkjIGRtdAl2MAorCQkvKgorCQkgKiBXZSBkb24ndCBrbm93IGEgcHJpb3JpIGlmIHJhIGlzICJsaXZlIgorCQkgKi8KKwkJbW92ZQl0MCwgcmEKKwkJamFsCW1pcHNfaWhiCisJCW5vcAkvKiBkZWxheSBzbG90ICovCisJCW1vdmUJcmEsIHQwCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCQltZmMwCXQwLCBDUDBfU1RBVFVTCisJCWxpCXQxLCBTVDBfQ1UwIHwgKFNUQVRNQVNLICYgfjEpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQorCQlhbmRpCXQyLCB0MCwgU1QwX0lFUAorCQlzcmwJdDIsIDIKKwkJb3IJdDAsIHQyCisjZW5kaWYKKwkJb3IJdDAsIHQxCisJCXhvcmkJdDAsIFNUQVRNQVNLICYgfjEKKwkJbXRjMAl0MCwgQ1AwX1NUQVRVUworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkJX2VoYgorCQlhbmRpCXYwLCB2MCwgVlBFQ09OVFJPTF9URQorCQliZXF6CXYwLCAyZgorCQlub3AJLyogZGVsYXkgc2xvdCAqLworCQllbXQKKzI6CisJCW1mYzAJdjAsIENQMF9UQ1NUQVRVUworCQkvKiBDbGVhciBJWE1ULCB0aGVuIE9SIGluIHByZXZpb3VzIHZhbHVlICovCisJCW9yaQl2MCwgVENTVEFUVVNfSVhNVAorCQl4b3JpCXYwLCBUQ1NUQVRVU19JWE1UCisJCW9yCXYwLCB2MSwgdjAKKwkJbXRjMAl2MCwgQ1AwX1RDU1RBVFVTCisJCS8qCisJCSAqIGlycV9kaXNhYmxlX2hhemFyZCBiZWxvdyBzaG91bGQgZXhwYW5kIHRvIEVIQgorCQkgKiBvbiAyNEsvMzRLIENQVVMKKwkJICovCisJCS5zZXQgcG9wCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCQlpcnFfZGlzYWJsZV9oYXphcmQKKwkJLmVuZG0KKworI2VuZGlmIC8qIF9BU01fU1RBQ0tGUkFNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YWNrdHJhY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc3RhY2t0cmFjZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc3RhdC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YXRmcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YXRmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3N0YXRmcy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhdGZzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc3RyaW5nLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvc3RyaW5nLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS9zdHJpbmcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zdXNwZW5kLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3VzcGVuZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3N1c3BlbmQuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N1c3BlbmQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXNtaXBzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzbWlwcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3N5c21pcHMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c21pcHMuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzBmODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMywgMDYgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgUGF1bCBNLiBBbnRvaW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcworICogS2V2aW4gRC4gS2lzc2VsbCwga2V2aW5rQG1pcHMub3JnIGFuZCBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgorICovCisjaWZuZGVmIF9BU01fU1lTVEVNX0gKKyNkZWZpbmUgX0FTTV9TWVNURU1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CisjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KKyNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YXNtL2RzcC5oPgorI2luY2x1ZGUgPGFzbS93YXRjaC5oPgorI2luY2x1ZGUgPGFzbS93YXIuaD4KKworCisvKgorICogc3dpdGNoX3RvKG4pIHNob3VsZCBzd2l0Y2ggdGFza3MgdG8gdGFzayBuciBuLCBmaXJzdAorICogY2hlY2tpbmcgdGhhdCBuIGlzbid0IHRoZSBjdXJyZW50IHRhc2ssIGluIHdoaWNoIGNhc2UgaXQgZG9lcyBub3RoaW5nLgorICovCitleHRlcm4gYXNtbGlua2FnZSB2b2lkICpyZXN1bWUodm9pZCAqbGFzdCwgdm9pZCAqbmV4dCwgdm9pZCAqbmV4dF90aSk7CisKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworI2lmZGVmIENPTkZJR19NSVBTX01UX0ZQQUZGCisKKy8qCisgKiBIYW5kbGUgdGhlIHNjaGVkdWxlciByZXN1bWUgZW5kIG9mIEZQVSBhZmZpbml0eSBtYW5hZ2VtZW50LiAgV2UgZG8gdGhpcworICogaW5saW5lIHRvIHRyeSB0byBrZWVwIHRoZSBvdmVyaGVhZCBkb3duLiBJZiB3ZSBoYXZlIGJlZW4gZm9yY2VkIHRvIHJ1biBvbgorICogYSAiQ1BVIiB3aXRoIGFuIEZQVSBiZWNhdXNlIG9mIGEgcHJldmlvdXMgaGlnaCBsZXZlbCBvZiBGUCBjb21wdXRhdGlvbiwKKyAqIGJ1dCBkaWQgbm90IGFjdHVhbGx5IHVzZSB0aGUgRlBVIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgdGltZS1zbGljZSAoQ1UxCisgKiBpc24ndCBzZXQpLCB3ZSB1bmRvIHRoZSByZXN0cmljdGlvbiBvbiBjcHVzX2FsbG93ZWQuCisgKgorICogV2UncmUgbm90IGNhbGxpbmcgc2V0X2NwdXNfYWxsb3dlZCgpIGhlcmUsIGJlY2F1c2Ugd2UgaGF2ZSBubyBuZWVkIHRvCisgKiBmb3JjZSBwcm9tcHQgbWlncmF0aW9uIC0gd2UncmUgYWxyZWFkeSBzd2l0Y2hpbmcgdGhlIGN1cnJlbnQgQ1BVIHRvIGEKKyAqIGRpZmZlcmVudCB0aHJlYWQuCisgKi8KKworI2RlZmluZSBfX21pcHNfbXRfZnBhZmZfc3dpdGNoX3RvKHByZXYpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN0cnVjdCB0aHJlYWRfaW5mbyAqX19wcmV2X3RpID0gdGFza190aHJlYWRfaW5mbyhwcmV2KTsJCVwKKwkJCQkJCQkJCVwKKwlpZiAoY3B1X2hhc19mcHUgJiYJCQkJCQlcCisJICAgIHRlc3RfdGlfdGhyZWFkX2ZsYWcoX19wcmV2X3RpLCBUSUZfRlBVQk9VTkQpICYmCQlcCisJICAgICghKEtTVEtfU1RBVFVTKHByZXYpICYgU1QwX0NVMSkpKSB7CQkJCVwKKwkJY2xlYXJfdGlfdGhyZWFkX2ZsYWcoX19wcmV2X3RpLCBUSUZfRlBVQk9VTkQpOwkJXAorCQlwcmV2LT5jcHVzX2FsbG93ZWQgPSBwcmV2LT50aHJlYWQudXNlcl9jcHVzX2FsbG93ZWQ7CVwKKwl9CQkJCQkJCQlcCisJbmV4dC0+dGhyZWFkLmVtdWxhdGVkX2ZwID0gMDsJCQkJCVwKK30gd2hpbGUoMCkKKworI2Vsc2UKKyNkZWZpbmUgX19taXBzX210X2ZwYWZmX3N3aXRjaF90byhwcmV2KSBkbyB7ICh2b2lkKSAocHJldik7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX19taXBzX210X2ZwYWZmX3N3aXRjaF90byhwcmV2KTsJCQkJXAorCWlmIChjcHVfaGFzX2RzcCkJCQkJCQlcCisJCV9fc2F2ZV9kc3AocHJldik7CQkJCQlcCisJKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQsIHRhc2tfdGhyZWFkX2luZm8obmV4dCkpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGNwdV9oYXNfZHNwKQkJCQkJCVwKKwkJX19yZXN0b3JlX2RzcChjdXJyZW50KTsJCQkJCVwKKwlpZiAoY3B1X2hhc191c2VybG9jYWwpCQkJCQkJXAorCQl3cml0ZV9jMF91c2VybG9jYWwoY3VycmVudF90aHJlYWRfaW5mbygpLT50cF92YWx1ZSk7CVwKKwlfX3Jlc3RvcmVfd2F0Y2goKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX194Y2hnX3UzMih2b2xhdGlsZSBpbnQgKiBtLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCV9fdTMyIHJldHZhbDsKKworCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CisJCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIxOglsbAklMCwgJTMJCQkjIHhjaGdfdTMyCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIgorCQkiCW1vdmUJJTIsICV6NAkJCQkJXG4iCisJCSIJLnNldAltaXBzMwkJCQkJXG4iCisJCSIJc2MJJTIsICUxCQkJCQlcbiIKKwkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIgorCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKKwkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQorCQk6ICJtZW1vcnkiKTsKKwl9IGVsc2UgaWYgKGNwdV9oYXNfbGxzYykgeworCQl1bnNpZ25lZCBsb25nIGR1bW15OworCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiMToJbGwJJTAsICUzCQkJIyB4Y2hnX3UzMglcbiIKKwkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKKwkJIgltb3ZlCSUyLCAlejQJCQkJCVxuIgorCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiCXNjCSUyLCAlMQkJCQkJXG4iCisJCSIJYmVxegklMiwgMmYJCQkJCVxuIgorCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgorCQkiMjoJYgkxYgkJCQkJXG4iCisJCSIJLnByZXZpb3VzCQkJCQlcbiIKKwkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKKwkJOiAiPSZyIiAocmV0dmFsKSwgIj1tIiAoKm0pLCAiPSZyIiAoZHVtbXkpCisJCTogIlIiICgqbSksICJKciIgKHZhbCkKKwkJOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlyZXR2YWwgPSAqbTsKKwkJKm0gPSB2YWw7CisJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CS8qIGltcGxpZXMgbWVtb3J5IGJhcnJpZXIgICovCisJfQorCisJc21wX2xsc2NfbWIoKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfNjRCSVQKK3N0YXRpYyBpbmxpbmUgX191NjQgX194Y2hnX3U2NCh2b2xhdGlsZSBfX3U2NCAqIG0sIF9fdTY0IHZhbCkKK3sKKwlfX3U2NCByZXR2YWw7CisKKwlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgeworCQl1bnNpZ25lZCBsb25nIGR1bW15OworCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiMToJbGxkCSUwLCAlMwkJCSMgeGNoZ191NjQJXG4iCisJCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKKwkJIglzY2QJJTIsICUxCQkJCQlcbiIKKwkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIgorCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKKwkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQorCQk6ICJtZW1vcnkiKTsKKwl9IGVsc2UgaWYgKGNwdV9oYXNfbGxzYykgeworCQl1bnNpZ25lZCBsb25nIGR1bW15OworCisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbWlwczMJCQkJCVxuIgorCQkiMToJbGxkCSUwLCAlMwkJCSMgeGNoZ191NjQJXG4iCisJCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKKwkJIglzY2QJJTIsICUxCQkJCQlcbiIKKwkJIgliZXF6CSUyLCAyZgkJCQkJXG4iCisJCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCisJCSIyOgliCTFiCQkJCQlcbiIKKwkJIgkucHJldmlvdXMJCQkJCVxuIgorCQkiCS5zZXQJbWlwczAJCQkJCVxuIgorCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKKwkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQorCQk6ICJtZW1vcnkiKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXJldHZhbCA9ICptOworCQkqbSA9IHZhbDsKKwkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJLyogaW1wbGllcyBtZW1vcnkgYmFycmllciAgKi8KKwl9CisKKwlzbXBfbGxzY19tYigpOworCisJcmV0dXJuIHJldHZhbDsKK30KKyNlbHNlCitleHRlcm4gX191NjQgX194Y2hnX3U2NF91bnN1cHBvcnRlZF9vbl8zMmJpdF9rZXJuZWxzKHZvbGF0aWxlIF9fdTY0ICogbSwgX191NjQgdmFsKTsKKyNkZWZpbmUgX194Y2hnX3U2NCBfX3hjaGdfdTY0X3Vuc3VwcG9ydGVkX29uXzMyYml0X2tlcm5lbHMKKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3QsIHNvIHlvdSdsbCBnZXQgYSBsaW5rZXIgZXJyb3IKKyAgIGlmIHNvbWV0aGluZyB0cmllcyB0byBkbyBhbiBpbnZhbGlkIHhjaGcoKS4gICovCitleHRlcm4gdm9pZCBfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICogcHRyLCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6CisJCXJldHVybiBfX3hjaGdfdTMyKHB0ciwgeCk7CisJY2FzZSA4OgorCQlyZXR1cm4gX194Y2hnX3U2NChwdHIsIHgpOworCX0KKwlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKKwlyZXR1cm4geDsKK30KKworI2RlZmluZSB4Y2hnKHB0ciwgeCkgKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKSkKKworZXh0ZXJuIHZvaWQgc2V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2V4dGVybiB2b2lkIHNldF91bmNhY2hlZF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CisKK3R5cGVkZWYgdm9pZCAoKnZpX2hhbmRsZXJfdCkodm9pZCk7CitleHRlcm4gdm9pZCAqc2V0X3ZpX2hhbmRsZXIoaW50IG4sIHZpX2hhbmRsZXJfdCBhZGRyKTsKKworZXh0ZXJuIHZvaWQgKnNldF9leGNlcHRfdmVjdG9yKGludCBuLCB2b2lkICphZGRyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGViYXNlOworZXh0ZXJuIHZvaWQgcGVyX2NwdV90cmFwX2luaXQodm9pZCk7CisKKy8qCisgKiBTZWUgaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaDsgcHJldmVudHMgZGVhZGxvY2sgb24gU01QCisgKiBzeXN0ZW1zLgorICovCisjZGVmaW5lIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CisKKyNlbmRpZiAvKiBfQVNNX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3Rlcm1iaXRzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGVybWJpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90ZXJtYml0cy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdGVybWJpdHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90ZXJtaW9zLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGVybWlvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3Rlcm1pb3MuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc2ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIHRocmVhZF9pbmZvLmg6IE1JUFMgbG93LWxldmVsIHRocmVhZCBpbmZvcm1hdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIC0gSW5jb3Jwb3JhdGluZyBzdWdnZXN0aW9ucyBtYWRlIGJ5IExpbnVzIFRvcnZhbGRzIGFuZCBEYXZlIE1pbGxlcgorICovCisKKyNpZm5kZWYgX0FTTV9USFJFQURfSU5GT19ICisjZGVmaW5lIF9BU01fVEhSRUFEX0lORk9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBsb3cgbGV2ZWwgdGFzayBkYXRhIHRoYXQgZW50cnkuUyBuZWVkcyBpbW1lZGlhdGUgYWNjZXNzIHRvCisgKiAtIHRoaXMgc3RydWN0IHNob3VsZCBmaXQgZW50aXJlbHkgaW5zaWRlIG9mIG9uZSBjYWNoZSBsaW5lCisgKiAtIHRoaXMgc3RydWN0IHNoYXJlcyB0aGUgc3VwZXJ2aXNvciBzdGFjayBwYWdlcworICogLSBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIGNoYW5nZWQsIHRoZSBhc3NlbWJseSBjb25zdGFudHMKKyAqICAgbXVzdCBhbHNvIGJlIGNoYW5nZWQKKyAqLworc3RydWN0IHRocmVhZF9pbmZvIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCisJc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCisJdW5zaWduZWQgbG9uZwkJdHBfdmFsdWU7CS8qIHRocmVhZCBwb2ludGVyICovCisJX191MzIJCQljcHU7CQkvKiBjdXJyZW50IENQVSAqLworCWludAkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLworCisJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwkvKiB0aHJlYWQgYWRkcmVzcyBzcGFjZToKKwkJCQkJCSAgIDAtMHhCRkZGRkZGRiBmb3IgdXNlci10aGVhZAorCQkJCQkJICAgMC0weEZGRkZGRkZGIGZvciBrZXJuZWwtdGhyZWFkCisJCQkJCQkqLworCXN0cnVjdCByZXN0YXJ0X2Jsb2NrCXJlc3RhcnRfYmxvY2s7CisJc3RydWN0IHB0X3JlZ3MJCSpyZWdzOworfTsKKworLyoKKyAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogcHJlZW1wdF9jb3VudCBuZWVkcyB0byBiZSAxIGluaXRpYWxseSwgdW50aWwgdGhlIHNjaGVkdWxlciBpcyBmdW5jdGlvbmFsLgorICovCisjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKK3sJCQkJCQlcCisJLnRhc2sJCT0gJnRzaywJCQlcCisJLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKKwkuZmxhZ3MJCT0gX1RJRl9GSVhBREUsCQlcCisJLmNwdQkJPSAwLAkJCVwKKwkucHJlZW1wdF9jb3VudAk9IDEsCQkJXAorCS5hZGRyX2xpbWl0CT0gS0VSTkVMX0RTLAkJXAorCS5yZXN0YXJ0X2Jsb2NrCT0gewkJCVwKKwkJLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsLAlcCisJfSwJCQkJCVwKK30KKworI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKKyNkZWZpbmUgaW5pdF9zdGFjawkJKGluaXRfdGhyZWFkX3VuaW9uLnN0YWNrKQorCisvKiBIb3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQy4gICovCityZWdpc3RlciBzdHJ1Y3QgdGhyZWFkX2luZm8gKl9fY3VycmVudF90aHJlYWRfaW5mbyBfX2FzbV9fKCIkMjgiKTsKKyNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpICBfX2N1cnJlbnRfdGhyZWFkX2luZm8KKworLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEtCKSAmJiBkZWZpbmVkKENPTkZJR18zMkJJVCkKKyNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIgKDEpCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEtCKSAmJiBkZWZpbmVkKENPTkZJR182NEJJVCkKKyNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIgKDIpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzhLQgorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMSkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMTZLQgorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfNjRLQgorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFRIUkVBRF9TSVpFIChQQUdFX1NJWkUgPDwgVEhSRUFEX1NJWkVfT1JERVIpCisjZGVmaW5lIFRIUkVBRF9NQVNLIChUSFJFQURfU0laRSAtIDFVTCkKKworI2RlZmluZSBfX0hBVkVfQVJDSF9USFJFQURfSU5GT19BTExPQ0FUT1IKKworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spCQkJCQlcCisoewkJCQkJCQkJXAorCXN0cnVjdCB0aHJlYWRfaW5mbyAqcmV0OwkJCQlcCisJCQkJCQkJCVwKKwlyZXQgPSBremFsbG9jKFRIUkVBRF9TSVpFLCBHRlBfS0VSTkVMKTsJCQlcCisJCQkJCQkJCVwKKwlyZXQ7CQkJCQkJCVwKK30pCisjZWxzZQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIGttYWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpCisjZW5kaWYKKworI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKGluZm8pIGtmcmVlKGluZm8pCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNkZWZpbmUgUFJFRU1QVF9BQ1RJVkUJCTB4MTAwMDAwMDAKKworLyoKKyAqIHRocmVhZCBpbmZvcm1hdGlvbiBmbGFncworICogLSB0aGVzZSBhcmUgcHJvY2VzcyBzdGF0ZSBmbGFncyB0aGF0IHZhcmlvdXMgYXNzZW1ibHkgZmlsZXMgbWF5IG5lZWQgdG8KKyAqICAgYWNjZXNzCisgKiAtIHBlbmRpbmcgd29yay10by1iZS1kb25lIGZsYWdzIGFyZSBpbiBMU1cKKyAqIC0gb3RoZXIgZmxhZ3MgaW4gTVNXCisgKi8KKyNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTEJLyogc2lnbmFsIHBlbmRpbmcgKi8KKyNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkyCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJMwkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLworI2RlZmluZSBUSUZfU0VDQ09NUAkJNAkvKiBzZWN1cmUgY29tcHV0aW5nICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJOQkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCisjZGVmaW5lIFRJRl9VU0VERlBVCQkxNgkvKiBGUFUgd2FzIHVzZWQgYnkgdGhpcyB0YXNrIHRoaXMgcXVhbnR1bSAoU01QKSAqLworI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMTcJLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nIFRJRl9ORUVEX1JFU0NIRUQgKi8KKyNkZWZpbmUgVElGX01FTURJRQkJMTgKKyNkZWZpbmUgVElGX0ZSRUVaRQkJMTkKKyNkZWZpbmUgVElGX0ZJWEFERQkJMjAJLyogRml4IGFkZHJlc3MgZXJyb3JzIGluIHNvZnR3YXJlICovCisjZGVmaW5lIFRJRl9MT0dBREUJCTIxCS8qIExvZyBhZGRyZXNzIGVycm9ycyB0byBzeXNsb2cgKi8KKyNkZWZpbmUgVElGXzMyQklUX1JFR1MJCTIyCS8qIGFsc28gaW1wbGllcyAxNi8zMiBmcHJzICovCisjZGVmaW5lIFRJRl8zMkJJVF9BRERSCQkyMwkvKiAzMi1iaXQgYWRkcmVzcyBzcGFjZSAobzMyL24zMikgKi8KKyNkZWZpbmUgVElGX0ZQVUJPVU5ECQkyNAkvKiB0aHJlYWQgYm91bmQgdG8gRlBVLWZ1bGwgQ1BVIHNldCAqLworI2RlZmluZSBUSUZfTE9BRF9XQVRDSAkJMjUJLyogSWYgc2V0LCBsb2FkIHdhdGNoIHJlZ2lzdGVycyAqLworI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkzMQkvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLworCisjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCisjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQorI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKKyNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKKyNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQorI2RlZmluZSBfVElGX1VTRURGUFUJCSgxPDxUSUZfVVNFREZQVSkKKyNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQorI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCisjZGVmaW5lIF9USUZfRklYQURFCQkoMTw8VElGX0ZJWEFERSkKKyNkZWZpbmUgX1RJRl9MT0dBREUJCSgxPDxUSUZfTE9HQURFKQorI2RlZmluZSBfVElGXzMyQklUX1JFR1MJCSgxPDxUSUZfMzJCSVRfUkVHUykKKyNkZWZpbmUgX1RJRl8zMkJJVF9BRERSCQkoMTw8VElGXzMyQklUX0FERFIpCisjZGVmaW5lIF9USUZfRlBVQk9VTkQJCSgxPDxUSUZfRlBVQk9VTkQpCisjZGVmaW5lIF9USUZfTE9BRF9XQVRDSAkJKDE8PFRJRl9MT0FEX1dBVENIKQorCisvKiB3b3JrIHRvIGRvIG9uIGludGVycnVwdC9leGNlcHRpb24gcmV0dXJuICovCisjZGVmaW5lIF9USUZfV09SS19NQVNLCQkoMHgwMDAwZmZlZiAmIH5fVElGX1NFQ0NPTVApCisvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLworI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkoMHg4MDAwZmZmZiAmIH5fVElGX1NFQ0NPTVApCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1RIUkVBRF9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGltZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RpbWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90aW1lLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90aW1lLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGltZXguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aW1leC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3RpbWV4LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90aW1leC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3RpdGFuX2RlcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RpdGFuX2RlcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3RpdGFuX2RlcC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdGl0YW5fZGVwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGxiLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGxiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdGxiLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90bGIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90bGJkZWJ1Zy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RsYmRlYnVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdGxiZGVidWcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RsYmRlYnVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGxiZmx1c2guaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3RsYmZsdXNoLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3RvcG9sb2d5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90b3BvbG9neS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90cmFwcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RyYXBzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdHJhcHMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RyYXBzLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L2JvYXJkcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvYm9hcmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlOTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L2JvYXJkcy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZmRlZiBDT05GSUdfVE9TSElCQV9KTVIzOTI3CitCT0FSRF9WRUMoam1yMzkyN192ZWMpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVE9TSElCQV9SQlRYNDkyNworQk9BUkRfVkVDKHJidHg0OTI3X3ZlYykKK0JPQVJEX1ZFQyhyYnR4NDkzN192ZWMpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVE9TSElCQV9SQlRYNDkzOAorQk9BUkRfVkVDKHJidHg0OTM4X3ZlYykKKyNlbmRpZgorI2lmZGVmIENPTkZJR19UT1NISUJBX1JCVFg0OTM5CitCT0FSRF9WRUMocmJ0eDQ5MzlfdmVjKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9nZW5lcmljLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxNmEzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L2dlbmVyaWMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tbWlwcy90eHg5L2dlbmVyaWMuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQVNNX1RYWDlfR0VORVJJQ19ICisjZGVmaW5lIF9fQVNNX1RYWDlfR0VORVJJQ19ICisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIGZvciBzdHJ1Y3QgcmVzb3VyY2UgKi8KKworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSB0eHg5X2NlX3Jlc1tdOworI2RlZmluZSBUWFg5X0NFKG4pCSh1bnNpZ25lZCBsb25nKSh0eHg5X2NlX3Jlc1sobildLnN0YXJ0KQorZXh0ZXJuIHVuc2lnbmVkIGludCB0eHg5X3Bjb2RlOworZXh0ZXJuIGNoYXIgdHh4OV9wY29kZV9zdHJbOF07Cit2b2lkIHR4eDlfcmVnX3Jlc19pbml0KHVuc2lnbmVkIGludCBwY29kZSwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB0eHg5X21hc3Rlcl9jbG9jazsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdHh4OV9jcHVfY2xvY2s7CitleHRlcm4gdW5zaWduZWQgaW50IHR4eDlfZ2J1c19jbG9jazsKKyNkZWZpbmUgVFhYOV9JTUNMSwkodHh4OV9nYnVzX2Nsb2NrIC8gMikKKworZXh0ZXJuIGludCB0eHg5X2NjZmdfdG9lb247CitzdHJ1Y3QgdWFydF9wb3J0OworaW50IGVhcmx5X3NlcmlhbF90eHg5X3NldHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCitzdHJ1Y3QgcGNpX2RldjsKK3N0cnVjdCB0eHg5X2JvYXJkX3ZlYyB7CisJY29uc3QgY2hhciAqc3lzdGVtOworCXZvaWQgKCpwcm9tX2luaXQpKHZvaWQpOworCXZvaWQgKCptZW1fc2V0dXApKHZvaWQpOworCXZvaWQgKCppcnFfc2V0dXApKHZvaWQpOworCXZvaWQgKCp0aW1lX2luaXQpKHZvaWQpOworCXZvaWQgKCphcmNoX2luaXQpKHZvaWQpOworCXZvaWQgKCpkZXZpY2VfaW5pdCkodm9pZCk7CisjaWZkZWYgQ09ORklHX1BDSQorCWludCAoKnBjaV9tYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOworI2VuZGlmCit9OworZXh0ZXJuIHN0cnVjdCB0eHg5X2JvYXJkX3ZlYyAqdHh4OV9ib2FyZF92ZWM7CitleHRlcm4gaW50ICgqdHh4OV9pcnFfZGlzcGF0Y2gpKGludCBwZW5kaW5nKTsKK2NoYXIgKnByb21fZ2V0Y21kbGluZSh2b2lkKTsKK2NvbnN0IGNoYXIgKnByb21fZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB0eHg5X3dkdF9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZSk7Cit2b2lkIHR4eDlfd2R0X25vdyh1bnNpZ25lZCBsb25nIGJhc2UpOwordm9pZCB0eHg5X3NwaV9pbml0KGludCBidXNpZCwgdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgaXJxKTsKK3ZvaWQgdHh4OV9ldGhhZGRyX2luaXQodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBjaGFyICpldGhhZGRyKTsKK3ZvaWQgdHh4OV9zaW9faW5pdCh1bnNpZ25lZCBsb25nIGJhc2VhZGRyLCBpbnQgaXJxLAorCQkgICB1bnNpZ25lZCBpbnQgbGluZSwgdW5zaWduZWQgaW50IHNjbGssIGludCBub2N0cyk7Cit2b2lkIHByb21fcHV0Y2hhcihjaGFyIGMpOworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKK2V4dGVybiB2b2lkICgqdHh4OV9wcm9tX3B1dGNoYXIpKGNoYXIgYyk7Cit2b2lkIHR4eDlfc2lvX3B1dGNoYXJfaW5pdCh1bnNpZ25lZCBsb25nIGJhc2VhZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdHh4OV9zaW9fcHV0Y2hhcl9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIpCit7Cit9CisjZW5kaWYKKworc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YTsKK3ZvaWQgdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoaW50IG5vLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSAqcGRhdGEpOworCisvKiA4IGJpdCB2ZXJzaW9uIG9mIF9fZmxzKCk6IGZpbmQgZmlyc3QgYml0IHNldCAocmV0dXJucyAwLi43KSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19mbHM4KHVuc2lnbmVkIGNoYXIgeCkKK3sKKwlpbnQgciA9IDc7CisKKwlpZiAoISh4ICYgMHhmMCkpIHsKKwkJciAtPSA0OworCQl4IDw8PSA0OworCX0KKwlpZiAoISh4ICYgMHhjMCkpIHsKKwkJciAtPSAyOworCQl4IDw8PSAyOworCX0KKwlpZiAoISh4ICYgMHg4MCkpCisJCXIgLT0gMTsKKwlyZXR1cm4gcjsKK30KKwordm9pZCB0eHg5X2lvY2xlZF9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIsCisJCSAgICAgIGludCBiYXNlbnVtLCB1bnNpZ25lZCBpbnQgbnVtLCBpbnQgbG93YWN0aXZlLAorCQkgICAgICBjb25zdCBjaGFyICpjb2xvciwgY2hhciAqKmRlZnRyaWdnZXJzKTsKKworI2VuZGlmIC8qIF9fQVNNX1RYWDlfR0VORVJJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvam1yMzkyNy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvam1yMzkyNy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3R4eDkvam1yMzkyNy5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9qbXIzOTI3LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9wY2kuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3R4eDkvcGNpLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3BjaS5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9yYnR4NDkyNy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvcmJ0eDQ5MjcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFkYWIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvcmJ0eDQ5MjcuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIF9fQVNNX1RYWDlfUkJUWDQ5MjdfSAorI2RlZmluZSBfX0FTTV9UWFg5X1JCVFg0OTI3X0gKKworI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkyNy5oPgorCisjZGVmaW5lIFJCVFg0OTI3X1BDSU1FTQkJMHgwODAwMDAwMAorI2RlZmluZSBSQlRYNDkyN19QQ0lNRU1fU0laRQkweDA4MDAwMDAwCisjZGVmaW5lIFJCVFg0OTI3X1BDSUlPCQkweDE2MDAwMDAwCisjZGVmaW5lIFJCVFg0OTI3X1BDSUlPX1NJWkUJMHgwMTAwMDAwMAorCisjZGVmaW5lIFJCVFg0OTI3X0xFRF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMDEwMDApCisjZGVmaW5lIFJCVFg0OTI3X0lNQVNLX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwMjAwMCkKKyNkZWZpbmUgUkJUWDQ5MjdfSU1TVEFUX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwMjAwNikKKyNkZWZpbmUgUkJUWDQ5MjdfU09GVElOVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMDMwMDApCisjZGVmaW5lIFJCVFg0OTI3X1NPRlRSRVNFVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMGYwMDApCisjZGVmaW5lIFJCVFg0OTI3X1NPRlRSRVNFVExPQ0tfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMikgKyAweDAwMDBmMDAyKQorI2RlZmluZSBSQlRYNDkyN19QQ0lSRVNFVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMGYwMDYpCisjZGVmaW5lIFJCVFg0OTI3X0JSQU1SVENfQkFTRQkoSU9fQkFTRSArIFRYWDlfQ0UoMikgKyAweDAwMDEwMDAwKQorI2RlZmluZSBSQlRYNDkyN19FVEhFUl9CQVNFCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMjAwMDApCisKKy8qIEV0aGVybmV0IHBvcnQgYWRkcmVzcyAqLworI2RlZmluZSBSQlRYNDkyN19FVEhFUl9BRERSCShSQlRYNDkyN19FVEhFUl9CQVNFICsgMHgyODApCisKKyNkZWZpbmUgcmJ0eDQ5MjdfaW1hc2tfYWRkcgkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X0lNQVNLX0FERFIpCisjZGVmaW5lIHJidHg0OTI3X2ltc3RhdF9hZGRyCSgoX191OCBfX2lvbWVtICopUkJUWDQ5MjdfSU1TVEFUX0FERFIpCisjZGVmaW5lIHJidHg0OTI3X3NvZnRpbnRfYWRkcgkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X1NPRlRJTlRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5Mjdfc29mdHJlc2V0X2FkZHIJKChfX3U4IF9faW9tZW0gKilSQlRYNDkyN19TT0ZUUkVTRVRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5Mjdfc29mdHJlc2V0bG9ja19hZGRyCVwKKwkJCQkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X1NPRlRSRVNFVExPQ0tfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MjdfcGNpcmVzZXRfYWRkcgkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X1BDSVJFU0VUX0FERFIpCisKKy8qIGJpdHMgZm9yIElTVEFUL0lNQVNLL0lNU1RBVCAqLworI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUQJMAorI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUMJMQorI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUIJMgorI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUEJMworI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUQJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lEKQorI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUMJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lDKQorI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUIJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lCKQorI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUEJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lBKQorCisjZGVmaW5lIFJCVFg0OTI3X05SX0lSUV9JT0MJOAkvKiBJT0MgKi8KKworI2RlZmluZSBSQlRYNDkyN19JUlFfSU9DCShUWFg5X0lSUV9CQVNFICsgVFg0OTI3X05VTV9JUikKKyNkZWZpbmUgUkJUWDQ5MjdfSVJRX0lPQ19QQ0lECShSQlRYNDkyN19JUlFfSU9DICsgUkJUWDQ5MjdfSU5UQl9QQ0lEKQorI2RlZmluZSBSQlRYNDkyN19JUlFfSU9DX1BDSUMJKFJCVFg0OTI3X0lSUV9JT0MgKyBSQlRYNDkyN19JTlRCX1BDSUMpCisjZGVmaW5lIFJCVFg0OTI3X0lSUV9JT0NfUENJQgkoUkJUWDQ5MjdfSVJRX0lPQyArIFJCVFg0OTI3X0lOVEJfUENJQikKKyNkZWZpbmUgUkJUWDQ5MjdfSVJRX0lPQ19QQ0lBCShSQlRYNDkyN19JUlFfSU9DICsgUkJUWDQ5MjdfSU5UQl9QQ0lBKQorCisjZGVmaW5lIFJCVFg0OTI3X0lSUV9JT0NJTlQJKFRYWDlfSVJRX0JBU0UgKyBUWDQ5MjdfSVJfSU5UKDEpKQorCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBSQlRYNDkyN19JU0FfSU9fT0ZGU0VUIFJCVFg0OTI3X1BDSUlPCisjZWxzZQorI2RlZmluZSBSQlRYNDkyN19JU0FfSU9fT0ZGU0VUIDAKKyNlbmRpZgorCisjZGVmaW5lIFJCVFg0OTI3X1JUTF84MDE5X0JBU0UgKFJCVFg0OTI3X0VUSEVSX0FERFIgLSBtaXBzX2lvX3BvcnRfYmFzZSkKKyNkZWZpbmUgUkJUWDQ5MjdfUlRMXzgwMTlfSVJRICAoVFhYOV9JUlFfQkFTRSArIFRYNDkyN19JUl9JTlQoMykpCisKK3ZvaWQgcmJ0eDQ5MjdfcHJvbV9pbml0KHZvaWQpOwordm9pZCByYnR4NDkyN19pcnFfc2V0dXAodm9pZCk7CitzdHJ1Y3QgcGNpX2RldjsKK2ludCByYnR4NDkyN19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOworCisjZW5kaWYgLyogX19BU01fVFhYOV9SQlRYNDkyN19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvcmJ0eDQ5MzguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3JidHg0OTM4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdHh4OS9yYnR4NDkzOC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9yYnR4NDkzOC5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9yYnR4NDkzOS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvcmJ0eDQ5MzkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWNmNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvcmJ0eDQ5MzkuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBSQlRYNDkzOQorICoKKyAqIChDKSBDb3B5cmlnaHQgVE9TSElCQSBDT1JQT1JBVElPTiAyMDA1LTIwMDYKKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2lmbmRlZiBfX0FTTV9UWFg5X1JCVFg0OTM5X0gKKyNkZWZpbmUgX19BU01fVFhYOV9SQlRYNDkzOV9ICisKKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL3R4eDlpcnEuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9nZW5lcmljLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CisKKy8qIEFkZHJlc3MgbWFwICovCisjZGVmaW5lIFJCVFg0OTM5X0lPQ19SRUdfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDAwMDAwKQorI2RlZmluZSBSQlRYNDkzOV9CT0FSRF9SRVZfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDAwMDAwKQorI2RlZmluZSBSQlRYNDkzOV9JT0NfUkVWX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMDAwMikKKyNkZWZpbmUgUkJUWDQ5MzlfQ09ORklHMV9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDAwMDQpCisjZGVmaW5lIFJCVFg0OTM5X0NPTkZJRzJfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDAwMDA2KQorI2RlZmluZSBSQlRYNDkzOV9DT05GSUczX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMDAwOCkKKyNkZWZpbmUgUkJUWDQ5MzlfQ09ORklHNF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDAwMGEpCisjZGVmaW5lIFJCVFg0OTM5X1VTVEFUX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMTAwMCkKKyNkZWZpbmUgUkJUWDQ5MzlfVURJUFNXX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMTAwMikKKyNkZWZpbmUgUkJUWDQ5MzlfQkRJUFNXX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMTAwNCkKKyNkZWZpbmUgUkJUWDQ5MzlfSUVOX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMjAwMCkKKyNkZWZpbmUgUkJUWDQ5MzlfSVBPTF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDIwMDIpCisjZGVmaW5lIFJCVFg0OTM5X0lGQUMxX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMjAwNCkKKyNkZWZpbmUgUkJUWDQ5MzlfSUZBQzJfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDAyMDA2KQorI2RlZmluZSBSQlRYNDkzOV9TT0ZUSU5UX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwMzAwMCkKKyNkZWZpbmUgUkJUWDQ5MzlfSVNBU1RBVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDQwMDApCisjZGVmaW5lIFJCVFg0OTM5X1BDSVNUQVRfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDA0MDAyKQorI2RlZmluZSBSQlRYNDkzOV9ST01FX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwNDAwNCkKKyNkZWZpbmUgUkJUWDQ5MzlfU1BJQ1NfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDA0MDA2KQorI2RlZmluZSBSQlRYNDkzOV9BVURJX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwNDAwOCkKKyNkZWZpbmUgUkJUWDQ5MzlfSVNBR1BJT19BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDQwMGEpCisjZGVmaW5lIFJCVFg0OTM5X1BFMV9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDUwMDApCisjZGVmaW5lIFJCVFg0OTM5X1BFMl9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDUwMDIpCisjZGVmaW5lIFJCVFg0OTM5X1BFM19BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDUwMDQpCisjZGVmaW5lIFJCVFg0OTM5X1ZQX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwNTAwNikKKyNkZWZpbmUgUkJUWDQ5MzlfVlBSRVNFVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDUwMDgpCisjZGVmaW5lIFJCVFg0OTM5X1ZQU09VVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDUwMGEpCisjZGVmaW5lIFJCVFg0OTM5X1ZQU0lOX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwNTAwYykKKyNkZWZpbmUgUkJUWDQ5MzlfN1NFR19BRERSKHMsIGNoKQlcCisJKElPX0JBU0UgKyBUWFg5X0NFKDEpICsgMHgwMDAwNjAwMCArIChzKSAqIDE2ICsgKChjaCkgJiAzKSAqIDIpCisjZGVmaW5lIFJCVFg0OTM5X1NPRlRSRVNFVF9BRERSCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMDcwMDApCisjZGVmaW5lIFJCVFg0OTM5X1JFU0VURU5fQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDA3MDAyKQorI2RlZmluZSBSQlRYNDkzOV9SRVNFVFNUQVRfQUREUgkoSU9fQkFTRSArIFRYWDlfQ0UoMSkgKyAweDAwMDA3MDA0KQorI2RlZmluZSBSQlRYNDkzOV9FVEhFUl9CQVNFCShJT19CQVNFICsgVFhYOV9DRSgxKSArIDB4MDAwMjAwMDApCisKKy8qIEV0aGVybmV0IHBvcnQgYWRkcmVzcyAqLworI2RlZmluZSBSQlRYNDkzOV9FVEhFUl9BRERSCShSQlRYNDkzOV9FVEhFUl9CQVNFICsgMHgzMDApCisKKy8qIGJpdHMgZm9yIElFTi9JUE9ML0lGQUMgKi8KKyNkZWZpbmUgUkJUWDQ5MzhfSU5UQl9JU0EwCTAKKyNkZWZpbmUgUkJUWDQ5MzhfSU5UQl9JU0ExMQkxCisjZGVmaW5lIFJCVFg0OTM4X0lOVEJfSVNBMTIJMgorI2RlZmluZSBSQlRYNDkzOF9JTlRCX0lTQTE1CTMKKyNkZWZpbmUgUkJUWDQ5MzhfSU5UQl9JMlMJNAorI2RlZmluZSBSQlRYNDkzOF9JTlRCX1NXCTUKKyNkZWZpbmUgUkJUWDQ5MzhfSU5URl9JU0EwCSgxIDw8IFJCVFg0OTM4X0lOVEJfSVNBMCkKKyNkZWZpbmUgUkJUWDQ5MzhfSU5URl9JU0ExMQkoMSA8PCBSQlRYNDkzOF9JTlRCX0lTQTExKQorI2RlZmluZSBSQlRYNDkzOF9JTlRGX0lTQTEyCSgxIDw8IFJCVFg0OTM4X0lOVEJfSVNBMTIpCisjZGVmaW5lIFJCVFg0OTM4X0lOVEZfSVNBMTUJKDEgPDwgUkJUWDQ5MzhfSU5UQl9JU0ExNSkKKyNkZWZpbmUgUkJUWDQ5MzhfSU5URl9JMlMJKDEgPDwgUkJUWDQ5MzhfSU5UQl9JMlMpCisjZGVmaW5lIFJCVFg0OTM4X0lOVEZfU1cJKDEgPDwgUkJUWDQ5MzhfSU5UQl9TVykKKworLyogYml0cyBmb3IgUEUxLFBFMixQRTMgKi8KKyNkZWZpbmUgUkJUWDQ5MzlfUEUxX0FUQShjaCkJKDB4MDEgPDwgKGNoKSkKKyNkZWZpbmUgUkJUWDQ5MzlfUEUxX1JNSUkoY2gpCSgweDA0IDw8IChjaCkpCisjZGVmaW5lIFJCVFg0OTM5X1BFMl9TSU8wCTB4MDEKKyNkZWZpbmUgUkJUWDQ5MzlfUEUyX1NJTzIJMHgwMgorI2RlZmluZSBSQlRYNDkzOV9QRTJfU0lPMwkweDA0CisjZGVmaW5lIFJCVFg0OTM5X1BFMl9DSVIJMHgwOAorI2RlZmluZSBSQlRYNDkzOV9QRTJfU1BJCTB4MTAKKyNkZWZpbmUgUkJUWDQ5MzlfUEUyX0dQSU8JMHgyMAorI2RlZmluZSBSQlRYNDkzOV9QRTNfVlAJMHgwMQorI2RlZmluZSBSQlRYNDkzOV9QRTNfVlBfUAkweDAyCisjZGVmaW5lIFJCVFg0OTM5X1BFM19WUF9TCTB4MDQKKworI2RlZmluZSByYnR4NDkzOV9ib2FyZF9yZXZfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9CT0FSRF9SRVZfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfaW9jX3Jldl9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0lPQ19SRVZfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfY29uZmlnMV9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0NPTkZJRzFfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfY29uZmlnMl9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0NPTkZJRzJfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfY29uZmlnM19hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0NPTkZJRzNfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfY29uZmlnNF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0NPTkZJRzRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfdXN0YXRfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9VU1RBVF9BRERSKQorI2RlZmluZSByYnR4NDkzOV91ZGlwc3dfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9VRElQU1dfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfYmRpcHN3X2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfQkRJUFNXX0FERFIpCisjZGVmaW5lIHJidHg0OTM5X2llbl9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0lFTl9BRERSKQorI2RlZmluZSByYnR4NDkzOV9pcG9sX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfSVBPTF9BRERSKQorI2RlZmluZSByYnR4NDkzOV9pZmFjMV9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0lGQUMxX0FERFIpCisjZGVmaW5lIHJidHg0OTM5X2lmYWMyX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfSUZBQzJfQUREUikKKyNkZWZpbmUgcmJ0eDQ5Mzlfc29mdGludF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1NPRlRJTlRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfaXNhc3RhdF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X0lTQVNUQVRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfcGNpc3RhdF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1BDSVNUQVRfQUREUikKKyNkZWZpbmUgcmJ0eDQ5Mzlfcm9tZV9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1JPTUVfQUREUikKKyNkZWZpbmUgcmJ0eDQ5Mzlfc3BpY3NfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9TUElDU19BRERSKQorI2RlZmluZSByYnR4NDkzOV9hdWRpX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfQVVESV9BRERSKQorI2RlZmluZSByYnR4NDkzOV9pc2FncGlvX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfSVNBR1BJT19BRERSKQorI2RlZmluZSByYnR4NDkzOV9wZTFfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9QRTFfQUREUikKKyNkZWZpbmUgcmJ0eDQ5MzlfcGUyX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfUEUyX0FERFIpCisjZGVmaW5lIHJidHg0OTM5X3BlM19hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1BFM19BRERSKQorI2RlZmluZSByYnR4NDkzOV92cF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1ZQX0FERFIpCisjZGVmaW5lIHJidHg0OTM5X3ZwcmVzZXRfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9WUFJFU0VUX0FERFIpCisjZGVmaW5lIHJidHg0OTM5X3Zwc291dF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1ZQU09VVF9BRERSKQorI2RlZmluZSByYnR4NDkzOV92cHNpbl9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1ZQU0lOX0FERFIpCisjZGVmaW5lIHJidHg0OTM5XzdzZWdfYWRkcihzLCBjaCkgXAorCQkJCSgodTggX19pb21lbSAqKVJCVFg0OTM5XzdTRUdfQUREUihzLCBjaCkpCisjZGVmaW5lIHJidHg0OTM5X3NvZnRyZXNldF9hZGRyCSgodTggX19pb21lbSAqKVJCVFg0OTM5X1NPRlRSRVNFVF9BRERSKQorI2RlZmluZSByYnR4NDkzOV9yZXNldGVuX2FkZHIJKCh1OCBfX2lvbWVtICopUkJUWDQ5MzlfUkVTRVRFTl9BRERSKQorI2RlZmluZSByYnR4NDkzOV9yZXNldHN0YXRfYWRkcgkoKHU4IF9faW9tZW0gKilSQlRYNDkzOV9SRVNFVFNUQVRfQUREUikKKworLyoKKyAqIElSUSBtYXBwaW5ncworICovCisjZGVmaW5lIFJCVFg0OTM5X05SX0lSUV9JT0MJOAorCisjZGVmaW5lIFJCVFg0OTM5X0lSUV9JT0MJKFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfTlVNX0lSKQorI2RlZmluZSBSQlRYNDkzOV9JUlFfRU5ECShSQlRYNDkzOV9JUlFfSU9DICsgUkJUWDQ5MzlfTlJfSVJRX0lPQykKKworLyogSU9DIChJU0EsIGV0YykgKi8KKyNkZWZpbmUgUkJUWDQ5MzlfSVJRX0lPQ0lOVAkoVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9JTlQoMCkpCisvKiBPbmJvYXJkIDEwTSBFdGhlciAqLworI2RlZmluZSBSQlRYNDkzOV9JUlFfRVRIRVIJKFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfSU5UKDEpKQorCit2b2lkIHJidHg0OTM5X3Byb21faW5pdCh2b2lkKTsKK3ZvaWQgcmJ0eDQ5MzlfaXJxX3NldHVwKHZvaWQpOworCisjZW5kaWYgLyogX19BU01fVFhYOV9SQlRYNDkzOV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9zbXNjX2ZkYzM3bTgxeC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvc21zY19mZGMzN204MXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ2MzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvc21zY19mZGMzN204MXguaApAQCAtMCwwICsxLDY4IEBACisvKgorICogSW50ZXJmYWNlIGZvciBzbXNjIGZkYzQ4bTgxeCBTdXBlciBJTyBjaGlwCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogMjAwMS0yMDAzIChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIE1hbmlzaCBMYWNod2FuaSwgbWxhY2h3YW5pQG12aXN0YS5jb20KKyAqLworCisjaWZuZGVmIF9TTVNDX0ZEQzM3TTgxWF9IXworI2RlZmluZSBfU01TQ19GREMzN004MVhfSF8KKworLyogQ29tbW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfSU5ERVggIDB4MDAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORklHX0RBVEEgICAweDAxCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkYgICAgICAgICAgMHgwMgorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9JTkRFWCAgICAgICAgIDB4MDMKKyNkZWZpbmUgU01TQ19GREMzN004MVhfRE5VTSAgICAgICAgICAweDA3CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0RJRCAgICAgICAgICAgMHgyMAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9EUkVWICAgICAgICAgIDB4MjEKKyNkZWZpbmUgU01TQ19GREMzN004MVhfUENOVCAgICAgICAgICAweDIyCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1BNR1QgICAgICAgICAgMHgyMworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9PU0MgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORlBBMCAgICAgICAweDI2CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZQQTEgICAgICAgMHgyNworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUNCAgICAgICAgIDB4MkIKKyNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDUgICAgICAgICAweDJDCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1QxICAgICAgICAgMHgyRAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUMiAgICAgICAgIDB4MkUKKyNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDMgICAgICAgICAweDJGCisKKy8qIExvZ2ljYWwgZGV2aWNlIG51bWJlcnMgKi8KKyNkZWZpbmUgU01TQ19GREMzN004MVhfRkREICAgICAgICAgICAweDAwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1BBUkFMTEVMICAgICAgMHgwMworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9TRVJJQUwxICAgICAgIDB4MDQKKyNkZWZpbmUgU01TQ19GREMzN004MVhfU0VSSUFMMiAgICAgICAweDA1CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0tCRCAgICAgICAgICAgMHgwNworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9BVVhJTyAgICAgICAgIDB4MDgKKyNkZWZpbmUgU01TQ19GREMzN004MVhfTk9ORSAgICAgICAgICAweGZmCisKKy8qIExvZ2ljYWwgZGV2aWNlIENvbmZpZyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01TQ19GREMzN004MVhfQUNUSVZFICAgICAgICAweDMwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0JBU0VBRERSMCAgICAgMHg2MAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9CQVNFQUREUjEgICAgIDB4NjEKKyNkZWZpbmUgU01TQ19GREMzN004MVhfSU5UICAgICAgICAgICAweDcwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0lOVDIgICAgICAgICAgMHg3MgorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9MRENSX0YwICAgICAgIDB4RjAKKworLyogQ2hpcCBDb25maWcgVmFsdWVzICovCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19FTlRFUiAgMHg1NQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfRVhJVCAgIDB4YWEKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ0hJUF9JRCAgICAgICAweDRkCisKK3Vuc2lnbmVkIGxvbmcgc21zY19mZGMzN204MXhfaW5pdCh1bnNpZ25lZCBsb25nIHBvcnQpOworCit2b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19iZWcodm9pZCk7CisKK3ZvaWQgc21zY19mZGMzN204MXhfY29uZmlnX2VuZCh2b2lkKTsKKwordTggc21zY19mZGMzN204MXhfY29uZmlnX2dldCh1OCByZWcpOwordm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfc2V0KHU4IHJlZywgdTggdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9zcGkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzI3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS9zcGkuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIFRYNDkzNy9UWDQ5MzggU1BJCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgorICoKKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKiBTdXBwb3J0IGZvciBUWDQ5MzggaW4gMi42IC0gTWFuaXNoIExhY2h3YW5pIChtbGFjaHdhbmlAbXZpc3RhLmNvbSkKKyAqLworI2lmbmRlZiBfX0FTTV9UWFg5X1NQSV9ICisjZGVmaW5lIF9fQVNNX1RYWDlfU1BJX0gKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpZmRlZiBDT05GSUdfU1BJCitpbnQgc3BpX2VlcHJvbV9yZWdpc3RlcihpbnQgYnVzaWQsIGludCBjaGlwaWQsIGludCBzaXplKTsKK2ludCBzcGlfZWVwcm9tX3JlYWQoaW50IGJ1c2lkLCBpbnQgY2hpcGlkLAorCQkgICAgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc3BpX2VlcHJvbV9yZWdpc3RlcihpbnQgYnVzaWQsIGludCBjaGlwaWQsIGludCBzaXplKQoreworCXJldHVybiAtRU5PREVWOworfQorc3RhdGljIGlubGluZSBpbnQgc3BpX2VlcHJvbV9yZWFkKGludCBidXNpZCwgaW50IGNoaXBpZCwKKwkJCQkgIGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX1RYWDlfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4MzkyNy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvdHgzOTI3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4MzkyNy5oCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqLworI2lmbmRlZiBfX0FTTV9UWFg5X1RYMzkyN19ICisjZGVmaW5lIF9fQVNNX1RYWDlfVFgzOTI3X0gKKworI2RlZmluZSBUWDM5MjdfUkVHX0JBU0UJMHhmZmZlMDAwMFVMCisjZGVmaW5lIFRYMzkyN19SRUdfU0laRQkweDAwMDEwMDAwCisjZGVmaW5lIFRYMzkyN19TRFJBTUNfUkVHCShUWDM5MjdfUkVHX0JBU0UgKyAweDgwMDApCisjZGVmaW5lIFRYMzkyN19ST01DX1JFRwkJKFRYMzkyN19SRUdfQkFTRSArIDB4OTAwMCkKKyNkZWZpbmUgVFgzOTI3X0RNQV9SRUcJCShUWDM5MjdfUkVHX0JBU0UgKyAweGIwMDApCisjZGVmaW5lIFRYMzkyN19JUkNfUkVHCQkoVFgzOTI3X1JFR19CQVNFICsgMHhjMDAwKQorI2RlZmluZSBUWDM5MjdfUENJQ19SRUcJCShUWDM5MjdfUkVHX0JBU0UgKyAweGQwMDApCisjZGVmaW5lIFRYMzkyN19DQ0ZHX1JFRwkJKFRYMzkyN19SRUdfQkFTRSArIDB4ZTAwMCkKKyNkZWZpbmUgVFgzOTI3X05SX1RNUgkzCisjZGVmaW5lIFRYMzkyN19UTVJfUkVHKGNoKQkoVFgzOTI3X1JFR19CQVNFICsgMHhmMDAwICsgKGNoKSAqIDB4MTAwKQorI2RlZmluZSBUWDM5MjdfTlJfU0lPCTIKKyNkZWZpbmUgVFgzOTI3X1NJT19SRUcoY2gpCShUWDM5MjdfUkVHX0JBU0UgKyAweGYzMDAgKyAoY2gpICogMHgxMDApCisjZGVmaW5lIFRYMzkyN19QSU9fUkVHCQkoVFgzOTI3X1JFR19CQVNFICsgMHhmNTAwKQorCitzdHJ1Y3QgdHgzOTI3X3NkcmFtY19yZWcgeworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY3JbOF07CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0clszXTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNtZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNtcnNbMl07Cit9OworCitzdHJ1Y3QgdHgzOTI3X3JvbWNfcmVnIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNyWzhdOworfTsKKworc3RydWN0IHR4MzkyN19kbWFfcmVnIHsKKwlzdHJ1Y3QgdHgzOTI3X2RtYV9jaF9yZWcgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNoYTsKKwkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzYXI7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGFyOworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNudHI7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc2FpcjsKKwkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkYWlyOworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNjcjsKKwkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjc3I7CisJfSBjaFs0XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRicls4XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRkaHI7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBtY3I7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQwOworfTsKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBlbmRpYW5fZGVmX3MyKGUxLCBlMikJXAorCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGUxLCBlMgorI2RlZmluZSBlbmRpYW5fZGVmX3NiMihlMSwgZTIsIGUzKQlcCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTE7dm9sYXRpbGUgdW5zaWduZWQgY2hhciBlMiwgZTMKKyNkZWZpbmUgZW5kaWFuX2RlZl9iMnMoZTEsIGUyLCBlMykJXAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZTEsIGUyO3ZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGUzCisjZGVmaW5lIGVuZGlhbl9kZWZfYjQoZTEsIGUyLCBlMywgZTQpCVwKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGUxLCBlMiwgZTMsIGU0CisjZWxzZQorI2RlZmluZSBlbmRpYW5fZGVmX3MyKGUxLCBlMikJXAorCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGUyLCBlMQorI2RlZmluZSBlbmRpYW5fZGVmX3NiMihlMSwgZTIsIGUzKQlcCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBlMywgZTI7dm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTEKKyNkZWZpbmUgZW5kaWFuX2RlZl9iMnMoZTEsIGUyLCBlMykJXAorCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGUzO3ZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZTIsIGUxCisjZGVmaW5lIGVuZGlhbl9kZWZfYjQoZTEsIGUyLCBlMywgZTQpCVwKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGU0LCBlMywgZTIsIGUxCisjZW5kaWYKKworc3RydWN0IHR4MzkyN19wY2ljX3JlZyB7CisJZW5kaWFuX2RlZl9zMihkaWQsIHZpZCk7CisJZW5kaWFuX2RlZl9zMihwY2lzdGF0LCBwY2ljbWQpOworCWVuZGlhbl9kZWZfYjQoY2MsIHNjYywgcnBsaSwgcmlkKTsKKwllbmRpYW5fZGVmX2I0KHVudXNlZDAsIGh0LCBtbHQsIGNscyk7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpb2JhOwkJLyogKzEwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBtYmE7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQxWzVdOworCWVuZGlhbl9kZWZfczIoc3ZpZCwgc3N2aWQpOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkMjsJCS8qICszMCAqLworCWVuZGlhbl9kZWZfc2IyKHVudXNlZDMsIHVudXNlZDQsIGNhcHB0cik7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQ1OworCWVuZGlhbl9kZWZfYjQobWwsIG1nLCBpcCwgaWwpOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkNjsJCS8qICs0MCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXN0YXQ7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpaW07CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBycnQ7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQ3WzNdOwkJLyogKzUwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcGJtbWE7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcGJpb21hOwkJLyogKzYwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpbGJtbWE7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpbGJpb21hOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkOFs5XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRjOwkJLyogKzkwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0c3RhdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRpbTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRjY21kOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGNpcnJ0OwkJLyogK2EwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwY2lycnRfY21kOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGNpcnJkdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVudXNlZDlbM107CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0bGJvYXA7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0bGJpYXA7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0bGJtbWE7CQkvKiArYzAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRsYmlvbWE7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzY19tc2c7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzY19iZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRibDsJCS8qICtkMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkMTBbM107CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwd21uZzsJCS8qICtlMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcHdtbmdzOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkMTFbNl07CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZXFfdHJhY2U7CQkvKiArMTAwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwYmFwbWM7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwYmFwbXM7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwYmFwbWltOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYm07CQkvKiArMTEwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjcGNpYnJzOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY3BjaWJnczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBiYWNzOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaW9iYXM7CQkvKiArMTIwICovCisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBtYmFzOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbGJjOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbGJzdGF0OworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbGJpbTsJCS8qICsxMzAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBjaXN0YXRpbTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGljYTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGljZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlpYWRwOwkJLyogKzE0MCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXNjZHA7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBtbWFzOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaW9tYXM7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcGNpYWRkcjsJCS8qICsxNTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlwY2lkYXRhOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXBjaWJlOworfTsKKworc3RydWN0IHR4MzkyN19jY2ZnX3JlZyB7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjY2ZnOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY3JpcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBjZmc7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0ZWFyOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGRjcjsKK307CisKKy8qCisgKiBTRFJBTUMKKyAqLworCisvKgorICogUk9NQworICovCisKKy8qCisgKiBETUEKKyAqLworLyogYml0cyBmb3IgTUNSICovCisjZGVmaW5lIFRYMzkyN19ETUFfTUNSX0VJUyhjaCkJKDB4MTAwMDAwMDA8PChjaCkpCisjZGVmaW5lIFRYMzkyN19ETUFfTUNSX0RJUyhjaCkJKDB4MDEwMDAwMDA8PChjaCkpCisjZGVmaW5lIFRYMzkyN19ETUFfTUNSX1JTRklGCTB4MDAwMDAwODAKKyNkZWZpbmUgVFgzOTI3X0RNQV9NQ1JfRklGVU0oY2gpCSgweDAwMDAwMDA4PDwoY2gpKQorI2RlZmluZSBUWDM5MjdfRE1BX01DUl9MRQkweDAwMDAwMDA0CisjZGVmaW5lIFRYMzkyN19ETUFfTUNSX1JQUlQJMHgwMDAwMDAwMgorI2RlZmluZSBUWDM5MjdfRE1BX01DUl9NU1RFTgkweDAwMDAwMDAxCisKKy8qIGJpdHMgZm9yIENDUm4gKi8KKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfREJJTkgJMHgwNDAwMDAwMAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9TQklOSAkweDAyMDAwMDAwCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0NIUlNUCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfUlZCWVRFCTB4MDA4MDAwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfQUNLUE9MCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfUkVRUEwJMHgwMDIwMDAwMAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9FR1JFUQkweDAwMTAwMDAwCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0NIRE4JMHgwMDA4MDAwMAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9ETkNUTAkweDAwMDYwMDAwCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0VYVFJRCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfSU5UUlFECTB4MDAwMGUwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfSU5URU5FCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfSU5URU5DCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfSU5URU5UCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfQ0hORU4JMHgwMDAwMDIwMAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9YRkFDVAkweDAwMDAwMTAwCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1NOT1AJMHgwMDAwMDA4MAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9EU1RJTkMJMHgwMDAwMDA0MAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9TUkNJTkMJMHgwMDAwMDAyMAorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9YRlNaKG9yZGVyKQkoKChvcmRlcikgPDwgMikgJiAweDAwMDAwMDFjKQorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9YRlNaXzFXCVRYMzkyN19ETUFfQ0NSX1hGU1ooMikKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfWEZTWl80VwlUWDM5MjdfRE1BX0NDUl9YRlNaKDQpCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGU1pfOFcJVFgzOTI3X0RNQV9DQ1JfWEZTWig1KQorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9YRlNaXzE2VwlUWDM5MjdfRE1BX0NDUl9YRlNaKDYpCisjZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGU1pfMzJXCVRYMzkyN19ETUFfQ0NSX1hGU1ooNykKKyNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfTUVNSU8JMHgwMDAwMDAwMgorI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9PTkVBRAkweDAwMDAwMDAxCisKKy8qIGJpdHMgZm9yIENTUm4gKi8KKyNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfQ0hOQUNUCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfQUJDSEMJMHgwMDAwMDA4MAorI2RlZmluZSBUWDM5MjdfRE1BX0NTUl9OQ0hOQwkweDAwMDAwMDQwCisjZGVmaW5lIFRYMzkyN19ETUFfQ1NSX05UUk5GQwkweDAwMDAwMDIwCisjZGVmaW5lIFRYMzkyN19ETUFfQ1NSX0VYVEROCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfQ0ZFUlIJMHgwMDAwMDAwOAorI2RlZmluZSBUWDM5MjdfRE1BX0NTUl9DSEVSUgkweDAwMDAwMDA0CisjZGVmaW5lIFRYMzkyN19ETUFfQ1NSX0RFU0VSUgkweDAwMDAwMDAyCisjZGVmaW5lIFRYMzkyN19ETUFfQ1NSX1NPUkVSUgkweDAwMDAwMDAxCisKKy8qCisgKiBJUkMKKyAqLworI2RlZmluZSBUWDM5MjdfSVJfSU5UMAkwCisjZGVmaW5lIFRYMzkyN19JUl9JTlQxCTEKKyNkZWZpbmUgVFgzOTI3X0lSX0lOVDIJMgorI2RlZmluZSBUWDM5MjdfSVJfSU5UMwkzCisjZGVmaW5lIFRYMzkyN19JUl9JTlQ0CTQKKyNkZWZpbmUgVFgzOTI3X0lSX0lOVDUJNQorI2RlZmluZSBUWDM5MjdfSVJfU0lPMAk2CisjZGVmaW5lIFRYMzkyN19JUl9TSU8xCTcKKyNkZWZpbmUgVFgzOTI3X0lSX1NJTyhjaCkJKDYgKyAoY2gpKQorI2RlZmluZSBUWDM5MjdfSVJfRE1BCTgKKyNkZWZpbmUgVFgzOTI3X0lSX1BJTwk5CisjZGVmaW5lIFRYMzkyN19JUl9QQ0kJMTAKKyNkZWZpbmUgVFgzOTI3X0lSX1RNUihjaCkJKDEzICsgKGNoKSkKKyNkZWZpbmUgVFgzOTI3X05VTV9JUgkxNgorCisvKgorICogUENJQworICovCisvKiBiaXRzIGZvciBQQ0lDTUQgKi8KKy8qIHNlZSBQQ0lfQ09NTUFORF9YWFggaW4gbGludXgvcGNpLmggKi8KKworLyogYml0cyBmb3IgUENJU1RBVCAqLworLyogc2VlIFBDSV9TVEFUVVNfWFhYIGluIGxpbnV4L3BjaS5oICovCisjZGVmaW5lIFBDSV9TVEFUVVNfTkVXX0NBUAkweDAwMTAKKworLyogYml0cyBmb3IgSVNUQVQvSUlNICovCisjZGVmaW5lIFRYMzkyN19QQ0lDX0lJTV9BTEwJMHgwMDAwMTYwMAorCisvKiBiaXRzIGZvciBUQyAqLworI2RlZmluZSBUWDM5MjdfUENJQ19UQ19PRjE2RQkweDAwMDAwMDIwCisjZGVmaW5lIFRYMzkyN19QQ0lDX1RDX0lGOEUJMHgwMDAwMDAxMAorI2RlZmluZSBUWDM5MjdfUENJQ19UQ19PRjhFCTB4MDAwMDAwMDgKKworLyogYml0cyBmb3IgVFNUQVQvVElNICovCisjZGVmaW5lIFRYMzkyN19QQ0lDX1RJTV9BTEwJMHgwMDAzZmZmZgorCisvKiBiaXRzIGZvciBJT0JBL01CQSAqLworLyogc2VlIFBDSV9CQVNFX0FERFJFU1NfWFhYIGluIGxpbnV4L3BjaS5oICovCisKKy8qIGJpdHMgZm9yIFBCQVBNQyAqLworI2RlZmluZSBUWDM5MjdfUENJQ19QQkFQTUNfUlBCQQkweDAwMDAwMDA0CisjZGVmaW5lIFRYMzkyN19QQ0lDX1BCQVBNQ19QQkFFTgkweDAwMDAwMDAyCisjZGVmaW5lIFRYMzkyN19QQ0lDX1BCQVBNQ19CTUNFTgkweDAwMDAwMDAxCisKKy8qIGJpdHMgZm9yIExCU1RBVC9MQklNICovCisjZGVmaW5lIFRYMzkyN19QQ0lDX0xCSU1fQUxMCTB4MDAwMDAwM2UKKworLyogYml0cyBmb3IgUENJU1RBVElNIChzZWUgYWxzbyBQQ0lfU1RBVFVTX1hYWCBpbiBsaW51eC9wY2kuaCAqLworI2RlZmluZSBUWDM5MjdfUENJQ19QQ0lTVEFUSU1fQUxMCTB4MDAwMGY5MDAKKworLyogYml0cyBmb3IgTEJDICovCisjZGVmaW5lIFRYMzkyN19QQ0lDX0xCQ19JQlNFCTB4MDAwMDQwMDAKKyNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX1RJQlNFCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX1RNRkJTRQkweDAwMDAxMDAwCisjZGVmaW5lIFRYMzkyN19QQ0lDX0xCQ19IUlNUCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX1NSU1QJMHgwMDAwMDQwMAorI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfRVBDQUQJMHgwMDAwMDIwMAorI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfTVNEU0UJMHgwMDAwMDEwMAorI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfQ1JSCTB4MDAwMDAwODAKKyNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX0lMTURFCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX0lMSURFCTB4MDAwMDAwMjAKKworI2RlZmluZSBUWDM5MjdfUENJQ19JRFNFTF9BRF9UT19TTE9UKGFkKQkoKGFkKSAtIDExKQorI2RlZmluZSBUWDM5MjdfUENJQ19NQVhfREVWTlUJVFgzOTI3X1BDSUNfSURTRUxfQURfVE9fU0xPVCgzMikKKworLyoKKyAqIENDRkcKKyAqLworLyogQ0NGRyA6IENoaXAgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUWDM5MjdfQ0NGR19UTEJPRkYJMHgwMDAyMDAwMAorI2RlZmluZSBUWDM5MjdfQ0NGR19CRU9XCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFgzOTI3X0NDRkdfV1IJMHgwMDAwODAwMAorI2RlZmluZSBUWDM5MjdfQ0NGR19UT0UJMHgwMDAwNDAwMAorI2RlZmluZSBUWDM5MjdfQ0NGR19QQ0lYQVJCCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFgzOTI3X0NDRkdfUENJMwkweDAwMDAxMDAwCisjZGVmaW5lIFRYMzkyN19DQ0ZHX1BTTlAJMHgwMDAwMDgwMAorI2RlZmluZSBUWDM5MjdfQ0NGR19QUFJJCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFgzOTI3X0NDRkdfUExMTQkweDAwMDAwMDMwCisjZGVmaW5lIFRYMzkyN19DQ0ZHX0VORElBTgkweDAwMDAwMDA0CisjZGVmaW5lIFRYMzkyN19DQ0ZHX0hBTFQJMHgwMDAwMDAwMgorI2RlZmluZSBUWDM5MjdfQ0NGR19BQ0VIT0xECTB4MDAwMDAwMDEKKworLyogUENGRyA6IFBpbiBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NZU0NMS0VOCTB4MDgwMDAwMDAKKyNkZWZpbmUgVFgzOTI3X1BDRkdfU0RSQ0xLRU5fQUxMCTB4MDdjMDAwMDAKKyNkZWZpbmUgVFgzOTI3X1BDRkdfU0RSQ0xLRU4oY2gpCSgweDAwNDAwMDAwPDwoY2gpKQorI2RlZmluZSBUWDM5MjdfUENGR19QQ0lDTEtFTl9BTEwJMHgwMDNjMDAwMAorI2RlZmluZSBUWDM5MjdfUENGR19QQ0lDTEtFTihjaCkJKDB4MDAwNDAwMDA8PChjaCkpCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTEFMTAkweDAwMDNmZmZmCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTENTCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMRFNGCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMU0lPQ19BTEwJMHgwMDAwYzAwMAorI2RlZmluZSBUWDM5MjdfUENGR19TRUxTSU9DKGNoKQkoMHgwMDAwNDAwMDw8KGNoKSkKKyNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMU0lPX0FMTAkweDAwMDAzMDAwCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTFNJTyhjaCkJKDB4MDAwMDEwMDA8PChjaCkpCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTFRNUl9BTEwJMHgwMDAwMGUwMAorI2RlZmluZSBUWDM5MjdfUENGR19TRUxUTVIoY2gpCSgweDAwMDAwMjAwPDwoY2gpKQorI2RlZmluZSBUWDM5MjdfUENGR19TRUxET05FCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFgzOTI3X1BDRkdfSU5URE1BX0FMTAkweDAwMDAwMGYwCisjZGVmaW5lIFRYMzkyN19QQ0ZHX0lOVERNQShjaCkJKDB4MDAwMDAwMTA8PChjaCkpCisjZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTERNQV9BTEwJMHgwMDAwMDAwZgorI2RlZmluZSBUWDM5MjdfUENGR19TRUxETUEoY2gpCSgweDAwMDAwMDAxPDwoY2gpKQorCisjZGVmaW5lIHR4MzkyN19zZHJhbWNwdHIJKChzdHJ1Y3QgdHgzOTI3X3NkcmFtY19yZWcgKilUWDM5MjdfU0RSQU1DX1JFRykKKyNkZWZpbmUgdHgzOTI3X3JvbWNwdHIJCSgoc3RydWN0IHR4MzkyN19yb21jX3JlZyAqKVRYMzkyN19ST01DX1JFRykKKyNkZWZpbmUgdHgzOTI3X2RtYXB0cgkJKChzdHJ1Y3QgdHgzOTI3X2RtYV9yZWcgKilUWDM5MjdfRE1BX1JFRykKKyNkZWZpbmUgdHgzOTI3X3BjaWNwdHIJCSgoc3RydWN0IHR4MzkyN19wY2ljX3JlZyAqKVRYMzkyN19QQ0lDX1JFRykKKyNkZWZpbmUgdHgzOTI3X2NjZmdwdHIJCSgoc3RydWN0IHR4MzkyN19jY2ZnX3JlZyAqKVRYMzkyN19DQ0ZHX1JFRykKKyNkZWZpbmUgdHgzOTI3X3Npb3B0cihjaCkJKChzdHJ1Y3QgdHh4OTI3X3Npb19yZWcgKilUWDM5MjdfU0lPX1JFRyhjaCkpCisjZGVmaW5lIHR4MzkyN19waW9wdHIJCSgoc3RydWN0IHR4eDlfcGlvX3JlZyBfX2lvbWVtICopVFgzOTI3X1BJT19SRUcpCisKKyNkZWZpbmUgVFgzOTI3X1JFVl9QQ09ERSgpCSh0eDM5MjdfY2NmZ3B0ci0+Y3JpciA+PiAxNikKKyNkZWZpbmUgVFgzOTI3X1JPTUNfQkEoY2gpCSh0eDM5Mjdfcm9tY3B0ci0+Y3JbKGNoKV0gJiAweGZmZjAwMDAwKQorI2RlZmluZSBUWDM5MjdfUk9NQ19TSVpFKGNoKQlcCisJKDB4MDAxMDAwMDAgPDwgKCh0eDM5Mjdfcm9tY3B0ci0+Y3JbKGNoKV0gPj4gOCkgJiAweGYpKQorI2RlZmluZSBUWDM5MjdfUk9NQ19XSURUSChjaCkJKDMyID4+ICgodHgzOTI3X3JvbWNwdHItPmNyWyhjaCldID4+IDcpICYgMHgxKSkKKwordm9pZCB0eDM5Mjdfd2R0X2luaXQodm9pZCk7Cit2b2lkIHR4MzkyN19zZXR1cCh2b2lkKTsKK3ZvaWQgdHgzOTI3X3RpbWVfaW5pdCh1bnNpZ25lZCBpbnQgZXZ0X3Rtcm5yLCB1bnNpZ25lZCBpbnQgc3JjX3Rtcm5yKTsKK3ZvaWQgdHgzOTI3X3Npb19pbml0KHVuc2lnbmVkIGludCBzY2xrLCB1bnNpZ25lZCBpbnQgY3RzX21hc2spOworc3RydWN0IHBjaV9jb250cm9sbGVyOwordm9pZCB0eDM5MjdfcGNpY19zZXR1cChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNoYW5uZWwsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHNkcmFtX3NpemUsIGludCBleHRhcmIpOwordm9pZCB0eDM5Mjdfc2V0dXBfcGNpZXJyX2lycSh2b2lkKTsKK3ZvaWQgdHgzOTI3X2lycV9pbml0KHZvaWQpOwordm9pZCB0eDM5MjdfbXRkX2luaXQoaW50IGNoKTsKKworI2VuZGlmIC8qIF9fQVNNX1RYWDlfVFgzOTI3X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4NDkyNy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvdHg0OTI3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MTNmMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4NDkyNy5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDEtMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIF9fQVNNX1RYWDlfVFg0OTI3X0gKKyNkZWZpbmUgX19BU01fVFhYOV9UWDQ5MjdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS90eHg5aXJxLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTI3cGNpYy5oPgorCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIFRYNDkyN19SRUdfQkFTRQkweGZmZmZmZmZmZmYxZjAwMDBVTAorI2Vsc2UKKyNkZWZpbmUgVFg0OTI3X1JFR19CQVNFCTB4ZmYxZjAwMDBVTAorI2VuZGlmCisjZGVmaW5lIFRYNDkyN19SRUdfU0laRQkweDAwMDEwMDAwCisKKyNkZWZpbmUgVFg0OTI3X1NEUkFNQ19SRUcJKFRYNDkyN19SRUdfQkFTRSArIDB4ODAwMCkKKyNkZWZpbmUgVFg0OTI3X0VCVVNDX1JFRwkoVFg0OTI3X1JFR19CQVNFICsgMHg5MDAwKQorI2RlZmluZSBUWDQ5MjdfUENJQ19SRUcJCShUWDQ5MjdfUkVHX0JBU0UgKyAweGQwMDApCisjZGVmaW5lIFRYNDkyN19DQ0ZHX1JFRwkJKFRYNDkyN19SRUdfQkFTRSArIDB4ZTAwMCkKKyNkZWZpbmUgVFg0OTI3X0lSQ19SRUcJCShUWDQ5MjdfUkVHX0JBU0UgKyAweGY2MDApCisjZGVmaW5lIFRYNDkyN19OUl9UTVIJMworI2RlZmluZSBUWDQ5MjdfVE1SX1JFRyhjaCkJKFRYNDkyN19SRUdfQkFTRSArIDB4ZjAwMCArIChjaCkgKiAweDEwMCkKKyNkZWZpbmUgVFg0OTI3X05SX1NJTwkyCisjZGVmaW5lIFRYNDkyN19TSU9fUkVHKGNoKQkoVFg0OTI3X1JFR19CQVNFICsgMHhmMzAwICsgKGNoKSAqIDB4MTAwKQorI2RlZmluZSBUWDQ5MjdfUElPX1JFRwkJKFRYNDkyN19SRUdfQkFTRSArIDB4ZjUwMCkKKworI2RlZmluZSBUWDQ5MjdfSVJfRUNDRVJSCTAKKyNkZWZpbmUgVFg0OTI3X0lSX1dUT0VSUgkxCisjZGVmaW5lIFRYNDkyN19OVU1fSVJfSU5UCTYKKyNkZWZpbmUgVFg0OTI3X0lSX0lOVChuKQkoMiArIChuKSkKKyNkZWZpbmUgVFg0OTI3X05VTV9JUl9TSU8JMgorI2RlZmluZSBUWDQ5MjdfSVJfU0lPKG4pCSg4ICsgKG4pKQorI2RlZmluZSBUWDQ5MjdfTlVNX0lSX0RNQQk0CisjZGVmaW5lIFRYNDkyN19JUl9ETUEobikJKDEwICsgKG4pKQorI2RlZmluZSBUWDQ5MjdfSVJfUElPCQkxNAorI2RlZmluZSBUWDQ5MjdfSVJfUERNQUMJCTE1CisjZGVmaW5lIFRYNDkyN19JUl9QQ0lDCQkxNgorI2RlZmluZSBUWDQ5MjdfTlVNX0lSX1RNUgkzCisjZGVmaW5lIFRYNDkyN19JUl9UTVIobikJKDE3ICsgKG4pKQorI2RlZmluZSBUWDQ5MjdfSVJfUENJRVJSCTIyCisjZGVmaW5lIFRYNDkyN19JUl9QQ0lQTUUJMjMKKyNkZWZpbmUgVFg0OTI3X0lSX0FDTEMJCTI0CisjZGVmaW5lIFRYNDkyN19JUl9BQ0xDUE1FCTI1CisjZGVmaW5lIFRYNDkyN19OVU1fSVIJMzIKKworI2RlZmluZSBUWDQ5MjdfSVJDX0lOVAkyCS8qIElQWzJdIGluIFN0YXR1cyByZWdpc3RlciAqLworCisjZGVmaW5lIFRYNDkyN19OVU1fUElPCTE2CisKK3N0cnVjdCB0eDQ5Mjdfc2RyYW1jX3JlZyB7CisJdTY0IGNyWzRdOworCXU2NCB1bnVzZWQwWzRdOworCXU2NCB0cjsKKwl1NjQgdW51c2VkMVsyXTsKKwl1NjQgY21kOworfTsKKworc3RydWN0IHR4NDkyN19lYnVzY19yZWcgeworCXU2NCBjcls4XTsKK307CisKK3N0cnVjdCB0eDQ5MjdfY2NmZ19yZWcgeworCXU2NCBjY2ZnOworCXU2NCBjcmlyOworCXU2NCBwY2ZnOworCXU2NCB0b2VhOworCXU2NCBjbGtjdHI7CisJdTY0IHVudXNlZDA7CisJdTY0IGdhcmJjOworCXU2NCB1bnVzZWQxOworCXU2NCB1bnVzZWQyOworCXU2NCByYW1wOworfTsKKworLyoKKyAqIENDRkcKKyAqLworLyogQ0NGRyA6IENoaXAgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUWDQ5MjdfQ0NGR19XRFJTVAkweDAwMDAwMjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTI3X0NDRkdfV0RSRVhFTgkweDAwMDAwMTAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTI3X0NDRkdfQkNGR19NQVNLCTB4MDAwMDAwZmYwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MjdfQ0NGR19USU5URElTCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfUENJNjYJMHgwMDgwMDAwMAorI2RlZmluZSBUWDQ5MjdfQ0NGR19QQ0lNT0RFCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV9NQVNLCTB4MDAwZTAwMDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV84CSgweDAgPDwgMTcpCisjZGVmaW5lIFRYNDkyN19DQ0ZHX0RJVk1PREVfMTIJKDB4MSA8PCAxNykKKyNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV8xNgkoMHgyIDw8IDE3KQorI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFXzEwCSgweDMgPDwgMTcpCisjZGVmaW5lIFRYNDkyN19DQ0ZHX0RJVk1PREVfMgkoMHg0IDw8IDE3KQorI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFXzMJKDB4NSA8PCAxNykKKyNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV80CSgweDYgPDwgMTcpCisjZGVmaW5lIFRYNDkyN19DQ0ZHX0RJVk1PREVfMl81CSgweDcgPDwgMTcpCisjZGVmaW5lIFRYNDkyN19DQ0ZHX0JFT1cJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MjdfQ0NGR19XUgkweDAwMDA4MDAwCisjZGVmaW5lIFRYNDkyN19DQ0ZHX1RPRQkweDAwMDA0MDAwCisjZGVmaW5lIFRYNDkyN19DQ0ZHX1BDSUFSQgkweDAwMDAyMDAwCisjZGVmaW5lIFRYNDkyN19DQ0ZHX1BDSURJVk1PREVfTUFTSwkweDAwMDAxODAwCisjZGVmaW5lIFRYNDkyN19DQ0ZHX1BDSURJVk1PREVfMl81CTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfUENJRElWTU9ERV8zCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfUENJRElWTU9ERV81CTB4MDAwMDEwMDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfUENJRElWTU9ERV82CTB4MDAwMDE4MDAKKyNkZWZpbmUgVFg0OTI3X0NDRkdfU1lTU1BfTUFTSwkweDAwMDAwMGMwCisjZGVmaW5lIFRYNDkyN19DQ0ZHX0VORElBTgkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkyN19DQ0ZHX0hBTFQJMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MjdfQ0NGR19BQ0VIT0xECTB4MDAwMDAwMDEKKyNkZWZpbmUgVFg0OTI3X0NDRkdfVzFDQklUUwkoVFg0OTI3X0NDRkdfV0RSU1QgfCBUWDQ5MjdfQ0NGR19CRU9XKQorCisvKiBQQ0ZHIDogUGluIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVFg0OTI3X1BDRkdfU0RDTEtETFlfTUFTSwkweDMwMDAwMDAwCisjZGVmaW5lIFRYNDkyN19QQ0ZHX1NEQ0xLRExZKGQpCSgoZCk8PDI4KQorI2RlZmluZSBUWDQ5MjdfUENGR19TWVNDTEtFTgkweDA4MDAwMDAwCisjZGVmaW5lIFRYNDkyN19QQ0ZHX1NEQ0xLRU5fQUxMCTB4MDc4MDAwMDAKKyNkZWZpbmUgVFg0OTI3X1BDRkdfU0RDTEtFTihjaCkJKDB4MDA4MDAwMDA8PChjaCkpCisjZGVmaW5lIFRYNDkyN19QQ0ZHX1BDSUNMS0VOX0FMTAkweDAwM2YwMDAwCisjZGVmaW5lIFRYNDkyN19QQ0ZHX1BDSUNMS0VOKGNoKQkoMHgwMDAxMDAwMDw8KGNoKSkKKyNkZWZpbmUgVFg0OTI3X1BDRkdfU0VMMgkweDAwMDAwMjAwCisjZGVmaW5lIFRYNDkyN19QQ0ZHX1NFTDEJMHgwMDAwMDEwMAorI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUxfQUxMCTB4MDAwMDAwZmYKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMF9NQVNLCTB4MDAwMDAwMDMKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMV9NQVNLCTB4MDAwMDAwMGMKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMl9NQVNLCTB4MDAwMDAwMzAKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMM19NQVNLCTB4MDAwMDAwYzAKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMF9EUlEwCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMF9TSU8xCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMF9BQ0wwCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMF9BQ0wyCTB4MDAwMDAwMDMKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMV9EUlExCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMV9TSU8xCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMV9BQ0wxCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMV9BQ0wzCTB4MDAwMDAwMGMKKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMl9EUlEyCTB4MDAwMDAwMDAJLyogU0VMMj0wICovCisjZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDJfU0lPMAkweDAwMDAwMDEwCS8qIFNFTDI9MCAqLworI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwyX0FDTDEJMHgwMDAwMDAwMAkvKiBTRUwyPTEgKi8KKyNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMl9BQ0wyCTB4MDAwMDAwMjAJLyogU0VMMj0xICovCisjZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDJfQUNMMAkweDAwMDAwMDMwCS8qIFNFTDI9MSAqLworI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwzX0RSUTMJMHgwMDAwMDAwMAorI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwzX1NJTzAJMHgwMDAwMDA0MAorI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwzX0FDTDMJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwzX0FDTDEJMHgwMDAwMDBjMAorCisvKiBDTEtDVFIgOiBDbG9jayBDb250cm9sICovCisjZGVmaW5lIFRYNDkyN19DTEtDVFJfQUNMQ0tECTB4MDIwMDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9QSU9DS0QJMHgwMTAwMDAwMAorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX0RNQUNLRAkweDAwODAwMDAwCisjZGVmaW5lIFRYNDkyN19DTEtDVFJfUENJQ0tECTB4MDA0MDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9UTTBDS0QJMHgwMDEwMDAwMAorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1RNMUNLRAkweDAwMDgwMDAwCisjZGVmaW5lIFRYNDkyN19DTEtDVFJfVE0yQ0tECTB4MDAwNDAwMDAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9TSU8wQ0tECTB4MDAwMjAwMDAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9TSU8xQ0tECTB4MDAwMTAwMDAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9BQ0xSU1QJMHgwMDAwMDIwMAorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1BJT1JTVAkweDAwMDAwMTAwCisjZGVmaW5lIFRYNDkyN19DTEtDVFJfRE1BUlNUCTB4MDAwMDAwODAKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9QQ0lSU1QJMHgwMDAwMDA0MAorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1RNMFJTVAkweDAwMDAwMDEwCisjZGVmaW5lIFRYNDkyN19DTEtDVFJfVE0xUlNUCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFg0OTI3X0NMS0NUUl9UTTJSU1QJMHgwMDAwMDAwNAorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1NJTzBSU1QJMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1NJTzFSU1QJMHgwMDAwMDAwMQorCisjZGVmaW5lIHR4NDkyN19zZHJhbWNwdHIgXAorCQkoKHN0cnVjdCB0eDQ5Mjdfc2RyYW1jX3JlZyBfX2lvbWVtICopVFg0OTI3X1NEUkFNQ19SRUcpCisjZGVmaW5lIHR4NDkyN19wY2ljcHRyIFwKKwkJKChzdHJ1Y3QgdHg0OTI3X3BjaWNfcmVnIF9faW9tZW0gKilUWDQ5MjdfUENJQ19SRUcpCisjZGVmaW5lIHR4NDkyN19jY2ZncHRyIFwKKwkJKChzdHJ1Y3QgdHg0OTI3X2NjZmdfcmVnIF9faW9tZW0gKilUWDQ5MjdfQ0NGR19SRUcpCisjZGVmaW5lIHR4NDkyN19lYnVzY3B0ciBcCisJCSgoc3RydWN0IHR4NDkyN19lYnVzY19yZWcgX19pb21lbSAqKVRYNDkyN19FQlVTQ19SRUcpCisjZGVmaW5lIHR4NDkyN19waW9wdHIJCSgoc3RydWN0IHR4eDlfcGlvX3JlZyBfX2lvbWVtICopVFg0OTI3X1BJT19SRUcpCisKKyNkZWZpbmUgVFg0OTI3X1JFVl9QQ09ERSgpCVwKKwkoKF9fdTMyKV9fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+Y3JpcikgPj4gMTYpCisKKyNkZWZpbmUgVFg0OTI3X1NEUkFNQ19DUihjaCkJX19yYXdfcmVhZHEoJnR4NDkyN19zZHJhbWNwdHItPmNyWyhjaCldKQorI2RlZmluZSBUWDQ5MjdfU0RSQU1DX0JBKGNoKQkoKFRYNDkyN19TRFJBTUNfQ1IoY2gpID4+IDQ5KSA8PCAyMSkKKyNkZWZpbmUgVFg0OTI3X1NEUkFNQ19TSVpFKGNoKQlcCisJKCgoKFRYNDkyN19TRFJBTUNfQ1IoY2gpID4+IDMzKSAmIDB4N2ZmZikgKyAxKSA8PCAyMSkKKworI2RlZmluZSBUWDQ5MjdfRUJVU0NfQ1IoY2gpCV9fcmF3X3JlYWRxKCZ0eDQ5MjdfZWJ1c2NwdHItPmNyWyhjaCldKQorI2RlZmluZSBUWDQ5MjdfRUJVU0NfQkEoY2gpCSgoVFg0OTI3X0VCVVNDX0NSKGNoKSA+PiA0OCkgPDwgMjApCisjZGVmaW5lIFRYNDkyN19FQlVTQ19TSVpFKGNoKQlcCisJKDB4MDAxMDAwMDAgPDwgKCh1bnNpZ25lZCBsb25nKShUWDQ5MjdfRUJVU0NfQ1IoY2gpID4+IDgpICYgMHhmKSkKKyNkZWZpbmUgVFg0OTI3X0VCVVNDX1dJRFRIKGNoKQlcCisJKDY0ID4+ICgoX191MzIpKFRYNDkyN19FQlVTQ19DUihjaCkgPj4gMjApICYgMHgzKSkKKworLyogdXRpbGl0aWVzICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHh4OV9jbGVhcjY0KF9fdTY0IF9faW9tZW0gKmFkciwgX191NjQgYml0cykKK3sKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyNlbmRpZgorCV9fX19yYXdfd3JpdGVxKF9fX19yYXdfcmVhZHEoYWRyKSAmIH5iaXRzLCBhZHIpOworI2lmZGVmIENPTkZJR18zMkJJVAorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgorfQorc3RhdGljIGlubGluZSB2b2lkIHR4eDlfc2V0NjQoX191NjQgX19pb21lbSAqYWRyLCBfX3U2NCBiaXRzKQoreworI2lmZGVmIENPTkZJR18zMkJJVAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2VuZGlmCisJX19fX3Jhd193cml0ZXEoX19fX3Jhd19yZWFkcShhZHIpIHwgYml0cywgYWRyKTsKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaW50ZXJydXB0IHNhZmUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHg0OTI3X2NjZmdfY2xlYXIoX191NjQgYml0cykKK3sKKwlfX19fcmF3X3dyaXRlcShfX19fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZykKKwkJICAgICAgICYgfihUWDQ5MjdfQ0NGR19XMUNCSVRTIHwgYml0cyksCisJCSAgICAgICAmdHg0OTI3X2NjZmdwdHItPmNjZmcpOworfQorc3RhdGljIGlubGluZSB2b2lkIHR4NDkyN19jY2ZnX3NldChfX3U2NCBiaXRzKQoreworCV9fX19yYXdfd3JpdGVxKChfX19fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZykKKwkJCSYgflRYNDkyN19DQ0ZHX1cxQ0JJVFMpIHwgYml0cywKKwkJICAgICAgICZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHg0OTI3X2NjZmdfY2hhbmdlKF9fdTY0IGNoYW5nZSwgX191NjQgbmV3KQoreworCV9fX19yYXdfd3JpdGVxKChfX19fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZykKKwkJCSYgfihUWDQ5MjdfQ0NGR19XMUNCSVRTIHwgY2hhbmdlKSkgfAorCQkgICAgICAgbmV3LAorCQkgICAgICAgJnR4NDkyN19jY2ZncHRyLT5jY2ZnKTsKK30KKwordW5zaWduZWQgaW50IHR4NDkyN19nZXRfbWVtX3NpemUodm9pZCk7Cit2b2lkIHR4NDkyN193ZHRfaW5pdCh2b2lkKTsKK3ZvaWQgdHg0OTI3X3NldHVwKHZvaWQpOwordm9pZCB0eDQ5MjdfdGltZV9pbml0KHVuc2lnbmVkIGludCB0bXJucik7Cit2b2lkIHR4NDkyN19zaW9faW5pdCh1bnNpZ25lZCBpbnQgc2NsaywgdW5zaWduZWQgaW50IGN0c19tYXNrKTsKK2ludCB0eDQ5MjdfcmVwb3J0X3BjaWNsayh2b2lkKTsKK2ludCB0eDQ5MjdfcGNpY2xrNjZfc2V0dXAodm9pZCk7Cit2b2lkIHR4NDkyN19zZXR1cF9wY2llcnJfaXJxKHZvaWQpOwordm9pZCB0eDQ5MjdfaXJxX2luaXQodm9pZCk7Cit2b2lkIHR4NDkyN19tdGRfaW5pdChpbnQgY2gpOworCisjZW5kaWYgLyogX19BU01fVFhYOV9UWDQ5MjdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90eHg5L3R4NDkyN3BjaWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4NDkyN3BjaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90eHg5L3R4NDkyN3BjaWMuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDkvdHg0OTI3cGNpYy5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS90eDQ5MzguaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4NDkzOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OWU3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS90eDQ5MzguaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBUWDQ5MzcvVFg0OTM4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCisgKgorICogMjAwMy0yMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcworICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqIFN1cHBvcnQgZm9yIFRYNDkzOCBpbiAyLjYgLSBNYW5pc2ggTGFjaHdhbmkgKG1sYWNod2FuaUBtdmlzdGEuY29tKQorICovCisjaWZuZGVmIF9fQVNNX1RYWDlfVFg0OTM4X0gKKyNkZWZpbmUgX19BU01fVFhYOV9UWDQ5MzhfSAorCisvKiBzb21lIGNvbnRyb2xsZXJzIGFyZSBjb21wYXRpYmxlIHdpdGggNDkyNyAqLworI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkyNy5oPgorCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIFRYNDkzOF9SRUdfQkFTRQkweGZmZmZmZmZmZmYxZjAwMDBVTCAvKiA9PSBUWDQ5MzdfUkVHX0JBU0UgKi8KKyNlbHNlCisjZGVmaW5lIFRYNDkzOF9SRUdfQkFTRQkweGZmMWYwMDAwVUwgLyogPT0gVFg0OTM3X1JFR19CQVNFICovCisjZW5kaWYKKyNkZWZpbmUgVFg0OTM4X1JFR19TSVpFCTB4MDAwMTAwMDAgLyogPT0gVFg0OTM3X1JFR19TSVpFICovCisKKy8qIE5ERk1DLCBTUkFNQywgUENJQzEsIFNQSUM6IFRYNDkzOCBvbmx5ICovCisjZGVmaW5lIFRYNDkzOF9OREZNQ19SRUcJKFRYNDkzOF9SRUdfQkFTRSArIDB4NTAwMCkKKyNkZWZpbmUgVFg0OTM4X1NSQU1DX1JFRwkoVFg0OTM4X1JFR19CQVNFICsgMHg2MDAwKQorI2RlZmluZSBUWDQ5MzhfUENJQzFfUkVHCShUWDQ5MzhfUkVHX0JBU0UgKyAweDcwMDApCisjZGVmaW5lIFRYNDkzOF9TRFJBTUNfUkVHCShUWDQ5MzhfUkVHX0JBU0UgKyAweDgwMDApCisjZGVmaW5lIFRYNDkzOF9FQlVTQ19SRUcJKFRYNDkzOF9SRUdfQkFTRSArIDB4OTAwMCkKKyNkZWZpbmUgVFg0OTM4X0RNQV9SRUcoY2gpCShUWDQ5MzhfUkVHX0JBU0UgKyAweGIwMDAgKyAoY2gpICogMHg4MDApCisjZGVmaW5lIFRYNDkzOF9QQ0lDX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZDAwMCkKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhlMDAwKQorI2RlZmluZSBUWDQ5MzhfTlJfVE1SCTMKKyNkZWZpbmUgVFg0OTM4X1RNUl9SRUcoY2gpCSgoVFg0OTM4X1JFR19CQVNFICsgMHhmMDAwKSArIChjaCkgKiAweDEwMCkKKyNkZWZpbmUgVFg0OTM4X05SX1NJTwkyCisjZGVmaW5lIFRYNDkzOF9TSU9fUkVHKGNoKQkoKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjMwMCkgKyAoY2gpICogMHgxMDApCisjZGVmaW5lIFRYNDkzOF9QSU9fUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhmNTAwKQorI2RlZmluZSBUWDQ5MzhfSVJDX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjYwMCkKKyNkZWZpbmUgVFg0OTM4X0FDTENfUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhmNzAwKQorI2RlZmluZSBUWDQ5MzhfU1BJX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjgwMCkKKworc3RydWN0IHR4NDkzOF9zcmFtY19yZWcgeworCXU2NCBjcjsKK307CisKK3N0cnVjdCB0eDQ5MzhfY2NmZ19yZWcgeworCXU2NCBjY2ZnOworCXU2NCBjcmlyOworCXU2NCBwY2ZnOworCXU2NCB0b2VhOworCXU2NCBjbGtjdHI7CisJdTY0IHVudXNlZDA7CisJdTY0IGdhcmJjOworCXU2NCB1bnVzZWQxOworCXU2NCB1bnVzZWQyOworCXU2NCByYW1wOworCXU2NCB1bnVzZWQzOworCXU2NCBqbXBhZHI7Cit9OworCisvKgorICogSVJDCisgKi8KKworI2RlZmluZSBUWDQ5MzhfSVJfRUNDRVJSCTAKKyNkZWZpbmUgVFg0OTM4X0lSX1dUT0VSUgkxCisjZGVmaW5lIFRYNDkzOF9OVU1fSVJfSU5UCTYKKyNkZWZpbmUgVFg0OTM4X0lSX0lOVChuKQkoMiArIChuKSkKKyNkZWZpbmUgVFg0OTM4X05VTV9JUl9TSU8JMgorI2RlZmluZSBUWDQ5MzhfSVJfU0lPKG4pCSg4ICsgKG4pKQorI2RlZmluZSBUWDQ5MzhfTlVNX0lSX0RNQQk0CisjZGVmaW5lIFRYNDkzOF9JUl9ETUEoY2gsIG4pCSgoY2ggPyAyNyA6IDEwKSArIChuKSkgLyogMTAtMTMsIDI3LTMwICovCisjZGVmaW5lIFRYNDkzOF9JUl9QSU8JMTQKKyNkZWZpbmUgVFg0OTM4X0lSX1BETUFDCTE1CisjZGVmaW5lIFRYNDkzOF9JUl9QQ0lDCTE2CisjZGVmaW5lIFRYNDkzOF9OVU1fSVJfVE1SCTMKKyNkZWZpbmUgVFg0OTM4X0lSX1RNUihuKQkoMTcgKyAobikpCisjZGVmaW5lIFRYNDkzOF9JUl9OREZNQwkyMQorI2RlZmluZSBUWDQ5MzhfSVJfUENJRVJSCTIyCisjZGVmaW5lIFRYNDkzOF9JUl9QQ0lQTUUJMjMKKyNkZWZpbmUgVFg0OTM4X0lSX0FDTEMJMjQKKyNkZWZpbmUgVFg0OTM4X0lSX0FDTENQTUUJMjUKKyNkZWZpbmUgVFg0OTM4X0lSX1BDSUMxCTI2CisjZGVmaW5lIFRYNDkzOF9JUl9TUEkJMzEKKyNkZWZpbmUgVFg0OTM4X05VTV9JUgkzMgorLyogbXVsdGlwbGV4ICovCisjZGVmaW5lIFRYNDkzOF9JUl9FVEgwCVRYNDkzOF9JUl9JTlQoNCkKKyNkZWZpbmUgVFg0OTM4X0lSX0VUSDEJVFg0OTM4X0lSX0lOVCgzKQorCisjZGVmaW5lIFRYNDkzOF9JUkNfSU5UCTIJLyogSVBbMl0gaW4gU3RhdHVzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgVFg0OTM4X05VTV9QSU8JMTYKKworLyoKKyAqIENDRkcKKyAqLworLyogQ0NGRyA6IENoaXAgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUWDQ5MzhfQ0NGR19XRFJTVAkweDAwMDAwMjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM4X0NDRkdfV0RSRVhFTgkweDAwMDAwMTAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM4X0NDRkdfQkNGR19NQVNLCTB4MDAwMDAwZmYwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzhfQ0NGR19USU5URElTCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUENJNjYJMHgwMDgwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lNT0RFCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUENJMV82NgkweDAwMjAwMDAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfTUFTSwkweDAwMWUwMDAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfMgkoMHg0IDw8IDE3KQorI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzJfNQkoMHhmIDw8IDE3KQorI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzMJKDB4NSA8PCAxNykKKyNkZWZpbmUgVFg0OTM4X0NDRkdfRElWTU9ERV80CSgweDYgPDwgMTcpCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfNF81CSgweGQgPDwgMTcpCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfOAkoMHgwIDw8IDE3KQorI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzEwCSgweGIgPDwgMTcpCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfMTIJKDB4MSA8PCAxNykKKyNkZWZpbmUgVFg0OTM4X0NDRkdfRElWTU9ERV8xNgkoMHgyIDw8IDE3KQorI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzE4CSgweDkgPDwgMTcpCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX0JFT1cJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0NGR19XUgkweDAwMDA4MDAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1RPRQkweDAwMDA0MDAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSUFSQgkweDAwMDAyMDAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfTUFTSwkweDAwMDAxYzAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfNAkoMHgxIDw8IDEwKQorI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzRfNQkoMHgzIDw8IDEwKQorI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzUJKDB4NSA8PCAxMCkKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUENJRElWTU9ERV81XzUJKDB4NyA8PCAxMCkKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUENJRElWTU9ERV84CSgweDAgPDwgMTApCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfOQkoMHgyIDw8IDEwKQorI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzEwCSgweDQgPDwgMTApCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfMTEJKDB4NiA8PCAxMCkKKyNkZWZpbmUgVFg0OTM4X0NDRkdfUENJMURNRAkweDAwMDAwMTAwCisjZGVmaW5lIFRYNDkzOF9DQ0ZHX1NZU1NQX01BU0sJMHgwMDAwMDBjMAorI2RlZmluZSBUWDQ5MzhfQ0NGR19FTkRJQU4JMHgwMDAwMDAwNAorI2RlZmluZSBUWDQ5MzhfQ0NGR19IQUxUCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFg0OTM4X0NDRkdfQUNFSE9MRAkweDAwMDAwMDAxCisKKy8qIFBDRkcgOiBQaW4gQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUWDQ5MzhfUENGR19FVEgwX1NFTAkweDgwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM4X1BDRkdfRVRIMV9TRUwJMHg0MDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0FUQV9TRUwJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0lTQV9TRUwJMHgxMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX1NQSV9TRUwJMHgwODAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX05ERl9TRUwJMHgwNDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX1NEQ0xLRExZX01BU0sJMHgzMDAwMDAwMAorI2RlZmluZSBUWDQ5MzhfUENGR19TRENMS0RMWShkKQkoKGQpPDwyOCkKKyNkZWZpbmUgVFg0OTM4X1BDRkdfU1lTQ0xLRU4JMHgwODAwMDAwMAorI2RlZmluZSBUWDQ5MzhfUENGR19TRENMS0VOX0FMTAkweDA3ODAwMDAwCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX1NEQ0xLRU4oY2gpCSgweDAwODAwMDAwPDwoY2gpKQorI2RlZmluZSBUWDQ5MzhfUENGR19QQ0lDTEtFTl9BTEwJMHgwMDNmMDAwMAorI2RlZmluZSBUWDQ5MzhfUENGR19QQ0lDTEtFTihjaCkJKDB4MDAwMTAwMDA8PChjaCkpCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX1NFTDIJMHgwMDAwMDIwMAorI2RlZmluZSBUWDQ5MzhfUENGR19TRUwxCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFg0OTM4X1BDRkdfRE1BU0VMX0FMTAkweDAwMDAwMDBmCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDBfRFJRMAkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDBfU0lPMQkweDAwMDAwMDAxCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDFfRFJRMQkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDFfU0lPMQkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDJfRFJRMgkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDJfU0lPMAkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDNfRFJRMwkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDNfU0lPMAkweDAwMDAwMDA4CisKKy8qIENMS0NUUiA6IENsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9OREZDS0QJMHgwMDAxMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfTkRGUlNUCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0VUSDFDS0QJMHg4MDAwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0VUSDBDS0QJMHg0MDAwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1NQSUNLRAkweDIwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfU1JBTUNLRAkweDEwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfUENJQzFDS0QJMHgwODAwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0RNQTFDS0QJMHgwNDAwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0FDTENLRAkweDAyMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfUElPQ0tECTB4MDEwMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9ETUFDS0QJMHgwMDgwMDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1BDSUNLRAkweDAwNDAwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfVE0wQ0tECTB4MDAxMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9UTTFDS0QJMHgwMDA4MDAwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1RNMkNLRAkweDAwMDQwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfU0lPMENLRAkweDAwMDIwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfU0lPMUNLRAkweDAwMDEwMDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfRVRIMVJTVAkweDAwMDA4MDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfRVRIMFJTVAkweDAwMDA0MDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfU1BJUlNUCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TUkFNUlNUCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9QQ0lDMVJTVAkweDAwMDAwODAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfRE1BMVJTVAkweDAwMDAwNDAwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfQUNMUlNUCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9QSU9SU1QJMHgwMDAwMDEwMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0RNQVJTVAkweDAwMDAwMDgwCisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfUENJUlNUCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9UTTBSU1QJMHgwMDAwMDAxMAorI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1RNMVJTVAkweDAwMDAwMDA4CisjZGVmaW5lIFRYNDkzOF9DTEtDVFJfVE0yUlNUCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TSU8wUlNUCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TSU8xUlNUCTB4MDAwMDAwMDEKKworLyoKKyAqIERNQQorICovCisvKiBiaXRzIGZvciBNQ1IgKi8KKyNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfRUlTKGNoKQkoMHgxMDAwMDAwMDw8KGNoKSkKKyNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfRElTKGNoKQkoMHgwMTAwMDAwMDw8KGNoKSkKKyNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfUlNGSUYJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzhfRE1BX01DUl9GSUZVTShjaCkJKDB4MDAwMDAwMDg8PChjaCkpCisjZGVmaW5lIFRYNDkzOF9ETUFfTUNSX1JQUlQJMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MzhfRE1BX01DUl9NU1RFTgkweDAwMDAwMDAxCisKKy8qIGJpdHMgZm9yIENDUm4gKi8KKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU1NQ0hOCTB4MjAwMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfVVNFWEZTWgkweDEwMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0xFCTB4MDgwMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfREJJTkgJMHgwNDAwMDAwMAorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9TQklOSAkweDAyMDAwMDAwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0NIUlNUCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfUlZCWVRFCTB4MDA4MDAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfQUNLUE9MCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfUkVRUEwJMHgwMDIwMDAwMAorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9FR1JFUQkweDAwMTAwMDAwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0NIRE4JMHgwMDA4MDAwMAorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9ETkNUTAkweDAwMDYwMDAwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0VYVFJRCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5UUlFECTB4MDAwMGUwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5FCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5DCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5UCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfQ0hORU4JMHgwMDAwMDIwMAorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRkFDVAkweDAwMDAwMTAwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1NNUENITgkweDAwMDAwMDIwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1oob3JkZXIpCSgoKG9yZGVyKSA8PCAyKSAmIDB4MDAwMDAwMWMpCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfMVcJVFg0OTM4X0RNQV9DQ1JfWEZTWigyKQorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRlNaXzJXCVRYNDkzOF9ETUFfQ0NSX1hGU1ooMykKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfWEZTWl80VwlUWDQ5MzhfRE1BX0NDUl9YRlNaKDQpCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfOFcJVFg0OTM4X0RNQV9DQ1JfWEZTWig1KQorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRlNaXzE2VwlUWDQ5MzhfRE1BX0NDUl9YRlNaKDYpCisjZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfMzJXCVRYNDkzOF9ETUFfQ0NSX1hGU1ooNykKKyNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfTUVNSU8JMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9TTkdBRAkweDAwMDAwMDAxCisKKy8qIGJpdHMgZm9yIENTUm4gKi8KKyNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0hORU4JMHgwMDAwMDQwMAorI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9TVExYRkVSCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0hOQUNUCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQUJDSEMJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9OQ0hOQwkweDAwMDAwMDQwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX05UUk5GQwkweDAwMDAwMDIwCisjZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX0VYVEROCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0ZFUlIJMHgwMDAwMDAwOAorI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9DSEVSUgkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX0RFU0VSUgkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX1NPUkVSUgkweDAwMDAwMDAxCisKKyNkZWZpbmUgdHg0OTM4X3NkcmFtY3B0cgl0eDQ5Mjdfc2RyYW1jcHRyCisjZGVmaW5lIHR4NDkzOF9lYnVzY3B0cgkJdHg0OTI3X2VidXNjcHRyCisjZGVmaW5lIHR4NDkzOF9wY2ljcHRyCQl0eDQ5MjdfcGNpY3B0cgorI2RlZmluZSB0eDQ5MzhfcGNpYzFwdHIgXAorCQkoKHN0cnVjdCB0eDQ5MjdfcGNpY19yZWcgX19pb21lbSAqKVRYNDkzOF9QQ0lDMV9SRUcpCisjZGVmaW5lIHR4NDkzOF9jY2ZncHRyIFwKKwkJKChzdHJ1Y3QgdHg0OTM4X2NjZmdfcmVnIF9faW9tZW0gKilUWDQ5MzhfQ0NGR19SRUcpCisjZGVmaW5lIHR4NDkzOF9waW9wdHIJCSgoc3RydWN0IHR4eDlfcGlvX3JlZyBfX2lvbWVtICopVFg0OTM4X1BJT19SRUcpCisjZGVmaW5lIHR4NDkzOF9zcmFtY3B0ciBcCisJCSgoc3RydWN0IHR4NDkzOF9zcmFtY19yZWcgX19pb21lbSAqKVRYNDkzOF9TUkFNQ19SRUcpCisKKworI2RlZmluZSBUWDQ5MzhfUkVWX1BDT0RFKCkJXAorCSgoX191MzIpX19yYXdfcmVhZHEoJnR4NDkzOF9jY2ZncHRyLT5jcmlyKSA+PiAxNikKKworI2RlZmluZSB0eDQ5MzhfY2NmZ19jbGVhcihiaXRzKQl0eDQ5MjdfY2NmZ19jbGVhcihiaXRzKQorI2RlZmluZSB0eDQ5MzhfY2NmZ19zZXQoYml0cykJdHg0OTI3X2NjZmdfc2V0KGJpdHMpCisjZGVmaW5lIHR4NDkzOF9jY2ZnX2NoYW5nZShjaGFuZ2UsIG5ldykJdHg0OTI3X2NjZmdfY2hhbmdlKGNoYW5nZSwgbmV3KQorCisjZGVmaW5lIFRYNDkzOF9TRFJBTUNfQ1IoY2gpCVRYNDkyN19TRFJBTUNfQ1IoY2gpCisjZGVmaW5lIFRYNDkzOF9TRFJBTUNfQkEoY2gpCVRYNDkyN19TRFJBTUNfQkEoY2gpCisjZGVmaW5lIFRYNDkzOF9TRFJBTUNfU0laRShjaCkJVFg0OTI3X1NEUkFNQ19TSVpFKGNoKQorCisjZGVmaW5lIFRYNDkzOF9FQlVTQ19DUihjaCkJVFg0OTI3X0VCVVNDX0NSKGNoKQorI2RlZmluZSBUWDQ5MzhfRUJVU0NfQkEoY2gpCVRYNDkyN19FQlVTQ19CQShjaCkKKyNkZWZpbmUgVFg0OTM4X0VCVVNDX1NJWkUoY2gpCVRYNDkyN19FQlVTQ19TSVpFKGNoKQorI2RlZmluZSBUWDQ5MzhfRUJVU0NfV0lEVEgoY2gpCVRYNDkyN19FQlVTQ19XSURUSChjaCkKKworI2RlZmluZSB0eDQ5MzhfZ2V0X21lbV9zaXplKCkgdHg0OTI3X2dldF9tZW1fc2l6ZSgpCit2b2lkIHR4NDkzOF93ZHRfaW5pdCh2b2lkKTsKK3ZvaWQgdHg0OTM4X3NldHVwKHZvaWQpOwordm9pZCB0eDQ5MzhfdGltZV9pbml0KHVuc2lnbmVkIGludCB0bXJucik7Cit2b2lkIHR4NDkzOF9zaW9faW5pdCh1bnNpZ25lZCBpbnQgc2NsaywgdW5zaWduZWQgaW50IGN0c19tYXNrKTsKK3ZvaWQgdHg0OTM4X3NwaV9pbml0KGludCBidXNpZCk7Cit2b2lkIHR4NDkzOF9ldGhhZGRyX2luaXQodW5zaWduZWQgY2hhciAqYWRkcjAsIHVuc2lnbmVkIGNoYXIgKmFkZHIxKTsKK2ludCB0eDQ5MzhfcmVwb3J0X3BjaWNsayh2b2lkKTsKK3ZvaWQgdHg0OTM4X3JlcG9ydF9wY2kxY2xrKHZvaWQpOworaW50IHR4NDkzOF9wY2ljbGs2Nl9zZXR1cCh2b2lkKTsKK3N0cnVjdCBwY2lfZGV2OworaW50IHR4NDkzOF9wY2ljMV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QpOwordm9pZCB0eDQ5Mzhfc2V0dXBfcGNpZXJyX2lycSh2b2lkKTsKK3ZvaWQgdHg0OTM4X2lycV9pbml0KHZvaWQpOwordm9pZCB0eDQ5MzhfbXRkX2luaXQoaW50IGNoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS90eDQ5MzkuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5L3R4NDkzOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YmFkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdHh4OS90eDQ5MzkuaApAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBUWDQ5MzkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwyMDA1LTIwMDYgVG9zaGliYSBDb3Jwb3JhdGlvbgorICogMjAwMy0yMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcworICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9fQVNNX1RYWDlfVFg0OTM5X0gKKyNkZWZpbmUgX19BU01fVFhYOV9UWDQ5MzlfSAorCisvKiBzb21lIGNvbnRyb2xsZXJzIGFyZSBjb21wYXRpYmxlIHdpdGggNDkyNy80OTM4ICovCisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM4Lmg+CisKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgVFg0OTM5X1JFR19CQVNFCTB4ZmZmZmZmZmZmZjFmMDAwMFVMIC8qID09IFRYNDkzOF9SRUdfQkFTRSAqLworI2Vsc2UKKyNkZWZpbmUgVFg0OTM5X1JFR19CQVNFCTB4ZmYxZjAwMDBVTCAvKiA9PSBUWDQ5MzhfUkVHX0JBU0UgKi8KKyNlbmRpZgorI2RlZmluZSBUWDQ5MzlfUkVHX1NJWkUJMHgwMDAxMDAwMCAvKiA9PSBUWDQ5MzhfUkVHX1NJWkUgKi8KKworI2RlZmluZSBUWDQ5MzlfQVRBX1JFRyhjaCkJKFRYNDkzOV9SRUdfQkFTRSArIDB4MzAwMCArIChjaCkgKiAweDEwMDApCisjZGVmaW5lIFRYNDkzOV9OREZNQ19SRUcJKFRYNDkzOV9SRUdfQkFTRSArIDB4NTAwMCkKKyNkZWZpbmUgVFg0OTM5X1NSQU1DX1JFRwkoVFg0OTM5X1JFR19CQVNFICsgMHg2MDAwKQorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX1JFRwkoVFg0OTM5X1JFR19CQVNFICsgMHg2ODAwKQorI2RlZmluZSBUWDQ5MzlfUENJQzFfUkVHCShUWDQ5MzlfUkVHX0JBU0UgKyAweDcwMDApCisjZGVmaW5lIFRYNDkzOV9ERFJDX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4ODAwMCkKKyNkZWZpbmUgVFg0OTM5X0VCVVNDX1JFRwkoVFg0OTM5X1JFR19CQVNFICsgMHg5MDAwKQorI2RlZmluZSBUWDQ5MzlfVlBDX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4YTAwMCkKKyNkZWZpbmUgVFg0OTM5X0RNQV9SRUcoY2gpCShUWDQ5MzlfUkVHX0JBU0UgKyAweGIwMDAgKyAoY2gpICogMHg4MDApCisjZGVmaW5lIFRYNDkzOV9QQ0lDX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4ZDAwMCkKKyNkZWZpbmUgVFg0OTM5X0NDRkdfUkVHCQkoVFg0OTM5X1JFR19CQVNFICsgMHhlMDAwKQorI2RlZmluZSBUWDQ5MzlfSVJDX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4ZTgwMCkKKyNkZWZpbmUgVFg0OTM5X05SX1RNUgk2CS8qIDB4ZjAwMCwweGYxMDAsMHhmMjAwLDB4ZmQwMCwweGZlMDAsMHhmZjAwICovCisjZGVmaW5lIFRYNDkzOV9UTVJfUkVHKGNoKQlcCisJKFRYNDkzOV9SRUdfQkFTRSArIDB4ZjAwMCArICgoY2gpICsgKChjaCkgPj0gMykgKiAxMCkgKiAweDEwMCkKKyNkZWZpbmUgVFg0OTM5X05SX1NJTwk0CS8qIDB4ZjMwMCwgMHhmNDAwLCAweGYzODAsIDB4ZjQ4MCAqLworI2RlZmluZSBUWDQ5MzlfU0lPX1JFRyhjaCkJXAorCShUWDQ5MzlfUkVHX0JBU0UgKyAweGYzMDAgKyAoKChjaCkgJiAxKSA8PCA4KSArICgoKGNoKSAmIDIpIDw8IDYpKQorI2RlZmluZSBUWDQ5MzlfQUNMQ19SRUcJCShUWDQ5MzlfUkVHX0JBU0UgKyAweGY3MDApCisjZGVmaW5lIFRYNDkzOV9TUElfUkVHCQkoVFg0OTM5X1JFR19CQVNFICsgMHhmODAwKQorI2RlZmluZSBUWDQ5MzlfSTJDX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4ZjkwMCkKKyNkZWZpbmUgVFg0OTM5X0kyU19SRUcJCShUWDQ5MzlfUkVHX0JBU0UgKyAweGZhMDApCisjZGVmaW5lIFRYNDkzOV9SVENfUkVHCQkoVFg0OTM5X1JFR19CQVNFICsgMHhmYjAwKQorI2RlZmluZSBUWDQ5MzlfQ0lSX1JFRwkJKFRYNDkzOV9SRUdfQkFTRSArIDB4ZmMwMCkKKworc3RydWN0IHR4NDkzOV9sZV9yZWcgeworCV9fdTMyIHI7CisJX191MzIgdW51c2VkOworfTsKKworc3RydWN0IHR4NDkzOV9kZHJjX3JlZyB7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgY3RsWzQ3XTsKKwlfX3U2NCB1bnVzZWQwWzE3XTsKKwlfX3U2NCB3aW5lbjsKKwlfX3U2NCB3aW5bNF07Cit9OworCitzdHJ1Y3QgdHg0OTM5X2NjZmdfcmVnIHsKKwlfX3U2NCBjY2ZnOworCV9fdTY0IGNyaXI7CisJX191NjQgcGNmZzsKKwlfX3U2NCB0b2VhOworCV9fdTY0IGNsa2N0cjsKKwlfX3U2NCB1bnVzZWQwOworCV9fdTY0IGdhcmJjOworCV9fdTY0IHVudXNlZDFbMl07CisJX191NjQgcmFtcDsKKwlfX3U2NCB1bnVzZWQyWzJdOworCV9fdTY0IGRza3djdHJsOworCV9fdTY0IG1jbGtvc2M7CisJX191NjQgbWNsa2N0bDsKKwlfX3U2NCB1bnVzZWQzWzE3XTsKKwlzdHJ1Y3QgeworCQlfX3U2NCBtcjsKKwkJX191NjQgZHI7CisJfSBncGlvWzJdOworfTsKKworc3RydWN0IHR4NDkzOV9pcmNfcmVnIHsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBkZW47CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgc2NpcGI7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgZG1bMl07CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgbHZsWzE2XTsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBtc2s7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgZWRjOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIHBuZDA7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgY3M7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgcG5kMTsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBkbTJbMl07CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgZGJyWzJdOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGRiZW47CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgdW51c2VkMFsyXTsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBmbGFnWzJdOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIHBvbDsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBjbnQ7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgbWFza2ludDsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBtYXNrZXh0OworfTsKKworc3RydWN0IHR4NDkzOV9ydGNfcmVnIHsKKwlfX3UzMiBjdGw7CisJX191MzIgYWRyOworCV9fdTMyIGRhdDsKKwlfX3UzMiB0YmM7Cit9OworCitzdHJ1Y3QgdHg0OTM5X2NyeXB0b19yZWcgeworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGNzcjsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBpZGVzcHRyOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGNkZXNwdHI7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgYnVzZXJyOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGNpcF90b3V0OworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGNpcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBkYXRhWzhdOworCQkJc3RydWN0IHR4NDkzOV9sZV9yZWcgY3RybDsKKwkJfSBnZW47CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGw7CisJCQkJc3RydWN0IHR4NDkzOV9sZV9yZWcgdTsKKwkJCX0ga2V5WzNdLCBpbmk7CisJCQlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBjdHJsOworCQl9IGRlczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGtleVs0XTsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGluaVs0XTsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGN0cmw7CisJCX0gYWVzOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBsOworCQkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIHU7CisJCQl9IGNudDsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGluaVs1XTsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIHVudXNlZDsKKwkJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGN0cmw7CisJCX0gaGFzaDsKKwl9IGNkcjsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyB1bnVzZWQwWzddOworCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIHJjc3I7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgcnByOworCV9fdTY0IHJkcjsKKwlfX3U2NCByb3JbM107CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgdW51c2VkMVsyXTsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyB4b3JzbHI7CisJc3RydWN0IHR4NDkzOV9sZV9yZWcgeG9yc3VyOworfTsKKworc3RydWN0IHR4NDkzOV9jcnlwdG9fZGVzYyB7CisJX191MzIgc3JjOworCV9fdTMyIGRzdDsKKwlfX3UzMiBuZXh0OworCV9fdTMyIGN0cmw7CisJX191MzIgaW5kZXg7CisJX191MzIgeG9yOworfTsKKworc3RydWN0IHR4NDkzOV92cGNfcmVnIHsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBjc3I7CisJc3RydWN0IHsKKwkJc3RydWN0IHR4NDkzOV9sZV9yZWcgY3RybEE7CisJCXN0cnVjdCB0eDQ5MzlfbGVfcmVnIGN0cmxCOworCQlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBpZGVzcHRyOworCQlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBjZGVzcHRyOworCX0gcG9ydFszXTsKKwlzdHJ1Y3QgdHg0OTM5X2xlX3JlZyBidXNlcnI7Cit9OworCitzdHJ1Y3QgdHg0OTM5X3ZwY19kZXNjIHsKKwlfX3UzMiBzcmM7CisJX191MzIgbmV4dDsKKwlfX3UzMiBjdHJsMTsKKwlfX3UzMiBjdHJsMjsKK307CisKKy8qCisgKiBJUkMKKyAqLworI2RlZmluZSBUWDQ5MzlfSVJfTk9ORQkwCisjZGVmaW5lIFRYNDkzOV9JUl9ERFIJMQorI2RlZmluZSBUWDQ5MzlfSVJfV1RPRVJSCTIKKyNkZWZpbmUgVFg0OTM5X05VTV9JUl9JTlQJMworI2RlZmluZSBUWDQ5MzlfSVJfSU5UKG4pCSgzICsgKG4pKQorI2RlZmluZSBUWDQ5MzlfTlVNX0lSX0VUSAkyCisjZGVmaW5lIFRYNDkzOV9JUl9FVEgobikJKChuKSA/IDQzIDogNikKKyNkZWZpbmUgVFg0OTM5X0lSX1ZJREVPCTcKKyNkZWZpbmUgVFg0OTM5X0lSX0NJUgk4CisjZGVmaW5lIFRYNDkzOV9OVU1fSVJfU0lPCTQKKyNkZWZpbmUgVFg0OTM5X0lSX1NJTyhuKQkoKG4pID8gNDMgKyAobikgOiA5KQkvKiA5LDQ0LTQ2ICovCisjZGVmaW5lIFRYNDkzOV9OVU1fSVJfRE1BCTQKKyNkZWZpbmUgVFg0OTM5X0lSX0RNQShjaCwgbikJKCgoY2gpID8gMjIgOiAxMCkgKyAobikpIC8qIDEwLTEzLDIyLTI1ICovCisjZGVmaW5lIFRYNDkzOV9JUl9JUkMJMTQKKyNkZWZpbmUgVFg0OTM5X0lSX1BETUFDCTE1CisjZGVmaW5lIFRYNDkzOV9OVU1fSVJfVE1SCTYKKyNkZWZpbmUgVFg0OTM5X0lSX1RNUihuKQkoKChuKSA+PSAzID8gNDUgOiAxNikgKyAobikpIC8qIDE2LTE4LDQ4LTUwICovCisjZGVmaW5lIFRYNDkzOV9OVU1fSVJfQVRBCTIKKyNkZWZpbmUgVFg0OTM5X0lSX0FUQShuKQkoMTkgKyAobikpCisjZGVmaW5lIFRYNDkzOV9JUl9BQ0xDCTIxCisjZGVmaW5lIFRYNDkzOV9JUl9DSVBIRVIJMjYKKyNkZWZpbmUgVFg0OTM5X0lSX0lOVEEJMjcKKyNkZWZpbmUgVFg0OTM5X0lSX0lOVEIJMjgKKyNkZWZpbmUgVFg0OTM5X0lSX0lOVEMJMjkKKyNkZWZpbmUgVFg0OTM5X0lSX0lOVEQJMzAKKyNkZWZpbmUgVFg0OTM5X0lSX0kyQwkzMworI2RlZmluZSBUWDQ5MzlfSVJfU1BJCTM0CisjZGVmaW5lIFRYNDkzOV9JUl9QQ0lDCTM1CisjZGVmaW5lIFRYNDkzOV9JUl9QQ0lDMQkzNgorI2RlZmluZSBUWDQ5MzlfSVJfUENJRVJSCTM3CisjZGVmaW5lIFRYNDkzOV9JUl9QQ0lQTUUJMzgKKyNkZWZpbmUgVFg0OTM5X0lSX05ERk1DCTM5CisjZGVmaW5lIFRYNDkzOV9JUl9BQ0xDUE1FCTQwCisjZGVmaW5lIFRYNDkzOV9JUl9SVEMJNDEKKyNkZWZpbmUgVFg0OTM5X0lSX1JORAk0MgorI2RlZmluZSBUWDQ5MzlfSVJfSTJTCTQ3CisjZGVmaW5lIFRYNDkzOV9OVU1fSVIJNjQKKworI2RlZmluZSBUWDQ5MzlfSVJDX0lOVAkyCS8qIElQWzJdIGluIFN0YXR1cyByZWdpc3RlciAqLworCisvKgorICogQ0NGRworICovCisvKiBDQ0ZHIDogQ2hpcCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1BDSUJPT1QJMHgwMDAwMDQwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1dEUlNUCTB4MDAwMDAyMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0NGR19XRFJFWEVOCTB4MDAwMDAxMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0NGR19CQ0ZHX01BU0sJMHgwMDAwMDBmZjAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0dUT1RfTUFTSwkweDA2MDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0dUT1RfNDA5NgkweDA2MDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0dUT1RfMjA0OAkweDA0MDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0dUT1RfMTAyNAkweDAyMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0dUT1RfNTEyCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NDRkdfVElOVERJUwkweDAxMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1BDSTY2CTB4MDA4MDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NDRkdfUENJTU9ERQkweDAwNDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1NTQ0cJMHgwMDEwMDAwMAorI2RlZmluZSBUWDQ5MzlfQ0NGR19NVUxDTEtfTUFTSwkweDAwMGUwMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX01VTENMS184CSgweDcgPDwgMTcpCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX01VTENMS185CSgweDAgPDwgMTcpCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX01VTENMS18xMAkoMHgxIDw8IDE3KQorI2RlZmluZSBUWDQ5MzlfQ0NGR19NVUxDTEtfMTEJKDB4MiA8PCAxNykKKyNkZWZpbmUgVFg0OTM5X0NDRkdfTVVMQ0xLXzEyCSgweDMgPDwgMTcpCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX01VTENMS18xMwkoMHg0IDw8IDE3KQorI2RlZmluZSBUWDQ5MzlfQ0NGR19NVUxDTEtfMTQJKDB4NSA8PCAxNykKKyNkZWZpbmUgVFg0OTM5X0NDRkdfTVVMQ0xLXzE1CSgweDYgPDwgMTcpCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0JFT1cJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MzlfQ0NGR19XUgkweDAwMDA4MDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1RPRQkweDAwMDA0MDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1BDSUFSQgkweDAwMDAyMDAwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1lESVZNT0RFX01BU0sJMHgwMDAwMWMwMAorI2RlZmluZSBUWDQ5MzlfQ0NGR19ZRElWTU9ERV8yCSgweDAgPDwgMTApCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1lESVZNT0RFXzMJKDB4MSA8PCAxMCkKKyNkZWZpbmUgVFg0OTM5X0NDRkdfWURJVk1PREVfNQkoMHg2IDw8IDEwKQorI2RlZmluZSBUWDQ5MzlfQ0NGR19ZRElWTU9ERV82CSgweDcgPDwgMTApCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX1BUU0VMCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFg0OTM5X0NDRkdfQkVTRUwJMHgwMDAwMDEwMAorI2RlZmluZSBUWDQ5MzlfQ0NGR19TWVNTUF9NQVNLCTB4MDAwMDAwYzAKKyNkZWZpbmUgVFg0OTM5X0NDRkdfQUNLU0VMCTB4MDAwMDAwMjAKKyNkZWZpbmUgVFg0OTM5X0NDRkdfUk9NVwkweDAwMDAwMDEwCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0VORElBTgkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0FSTU9ERQkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOV9DQ0ZHX0FDRUhPTEQJMHgwMDAwMDAwMQorCisvKiBQQ0ZHIDogUGluIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVFg0OTM5X1BDRkdfU0lPMk1PREVfTUFTSwkweGMwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU0lPMk1PREVfR1BJTwkweDgwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU0lPMk1PREVfU0lPMgkweDQwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU0lPMk1PREVfU0lPMAkweDAwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU1BJTU9ERQkweDIwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfSTJDTU9ERQkweDEwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfSTJTTU9ERV9NQVNLCTB4MGMwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19JMlNNT0RFX0dQSU8JMHgwYzAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0kyU01PREVfSTJTCTB4MDgwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19JMlNNT0RFX0kyU19BTFQJMHgwNDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0kyU01PREVfQUNMQwkweDAwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU0lPM01PREUJMHgwMjAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0RNQVNFTDMJMHgwMDA0MDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0RNQVNFTDNfU0lPMAkweDAwMDQwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfRE1BU0VMM19OREZDCTB4MDAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19WU1NNT0RFCTB4MDAwMDIwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19WUFNNT0RFCTB4MDAwMDEwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19FVDFNT0RFCTB4MDAwMDA4MDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19FVDBNT0RFCTB4MDAwMDA0MDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfUENGR19BVEExTU9ERQkweDAwMDAwMjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X1BDRkdfQVRBME1PREUJMHgwMDAwMDEwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0JQX1BMTAkweDAwMDAwMDAxMDAwMDAwMDBVTEwKKworI2RlZmluZSBUWDQ5MzlfUENGR19TWVNDTEtFTgkweDA4MDAwMDAwCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX1BDSUNMS0VOX0FMTAkweDAwMGYwMDAwCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX1BDSUNMS0VOKGNoKQkoMHgwMDAxMDAwMDw8KGNoKSkKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU1BFRUQxCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFg0OTM5X1BDRkdfU1BFRUQwCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFg0OTM5X1BDRkdfSVRNT0RFCTB4MDAwMDAzMDAKKyNkZWZpbmUgVFg0OTM5X1BDRkdfRE1BU0VMX0FMTAkoMHgwMDAwMDAwNyB8IFRYNDkzOV9QQ0ZHX0RNQVNFTDMpCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0RNQVNFTDIJMHgwMDAwMDAwNAorI2RlZmluZSBUWDQ5MzlfUENGR19ETUFTRUwyX0RSUTIJMHgwMDAwMDAwMAorI2RlZmluZSBUWDQ5MzlfUENGR19ETUFTRUwyX1NJTzAJMHgwMDAwMDAwNAorI2RlZmluZSBUWDQ5MzlfUENGR19ETUFTRUwxCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFg0OTM5X1BDRkdfRE1BU0VMMV9EUlExCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X1BDRkdfRE1BU0VMMAkweDAwMDAwMDAxCisjZGVmaW5lIFRYNDkzOV9QQ0ZHX0RNQVNFTDBfRFJRMAkweDAwMDAwMDAwCisKKy8qIENMS0NUUiA6IENsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9JT1NDS0QJMHg4MDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU1lTQ0tECTB4NDAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1RNNUNLRAkweDIwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9UTTRDS0QJMHgxMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfVE0zQ0tECTB4MDgwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0NJUkNLRAkweDA0MDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9TSU8zQ0tECTB4MDIwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1NJTzJDS0QJMHgwMTAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPMUNLRAkweDAwODAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9WUENDS0QJMHgwMDQwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfRVBDSUNLRAkweDAwMjAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9FVEgxQ0tECTB4MDAwODAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0FUQTFDS0QJMHgwMDA0MDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfQlJPTUNLRAkweDAwMDIwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9ORENDS0QJMHgwMDAxMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfSTJDQ0tECTB4MDAwMDgwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0VUSDBDS0QJMHgwMDAwNDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU1BJQ0tECTB4MDAwMDIwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1NSQU1DS0QJMHgwMDAwMTAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfUENJMUNLRAkweDAwMDAwODAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9ETUExQ0tECTB4MDAwMDA0MDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0FDTENLRAkweDAwMDAwMjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9BVEEwQ0tECTB4MDAwMDAxMDAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0RNQTBDS0QJMHgwMDAwMDA4MDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfUENJQ0NLRAkweDAwMDAwMDQwMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9JMlNDS0QJMHgwMDAwMDAyMDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfVE0wQ0tECTB4MDAwMDAwMTAwMDAwMDAwMFVMTAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1RNMUNLRAkweDAwMDAwMDA4MDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9UTTJDS0QJMHgwMDAwMDAwNDAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPMENLRAkweDAwMDAwMDAyMDAwMDAwMDBVTEwKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9DWVBDS0QJMHgwMDAwMDAwMTAwMDAwMDAwVUxMCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfSU9TUlNUCTB4ODAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9TWVNSU1QJMHg0MDAwMDAwMAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1RNNVJTVAkweDIwMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfVE00UlNUCTB4MTAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9UTTNSU1QJMHgwODAwMDAwMAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0NJUlJTVAkweDA0MDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPM1JTVAkweDAyMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPMlJTVAkweDAxMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPMVJTVAkweDAwODAwMDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfVlBDUlNUCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9FUENJUlNUCTB4MDAyMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9FVEgxUlNUCTB4MDAwODAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9BVEExUlNUCTB4MDAwNDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9CUk9NUlNUCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9ORENSU1QJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0kyQ1JTVAkweDAwMDA4MDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfRVRIMFJTVAkweDAwMDA0MDAwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU1BJUlNUCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9TUkFNUlNUCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9QQ0kxUlNUCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9ETUExUlNUCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9BQ0xSU1QJMHgwMDAwMDIwMAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0FUQTBSU1QJMHgwMDAwMDEwMAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0RNQTBSU1QJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1BDSUNSU1QJMHgwMDAwMDA0MAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX0kyU1JTVAkweDAwMDAwMDIwCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfVE0wUlNUCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFg0OTM5X0NMS0NUUl9UTTFSU1QJMHgwMDAwMDAwOAorI2RlZmluZSBUWDQ5MzlfQ0xLQ1RSX1RNMlJTVAkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfU0lPMFJTVAkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOV9DTEtDVFJfQ1lQUlNUCTB4MDAwMDAwMDEKKworLyoKKyAqIFJUQworICovCisjZGVmaW5lIFRYNDkzOV9SVENDVExfQUxNRQkweDAwMDAwMDgwCisjZGVmaW5lIFRYNDkzOV9SVENDVExfQUxNRAkweDAwMDAwMDQwCisjZGVmaW5lIFRYNDkzOV9SVENDVExfQlVTWQkweDAwMDAwMDIwCisKKyNkZWZpbmUgVFg0OTM5X1JUQ0NUTF9DT01NQU5ECTB4MDAwMDAwMDcKKyNkZWZpbmUgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUAkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9SVENDVExfQ09NTUFORF9HRVRUSU1FCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX1NFVFRJTUUJMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfR0VUQUxBUk0JMHgwMDAwMDAwMworI2RlZmluZSBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfU0VUQUxBUk0JMHgwMDAwMDAwNAorCisjZGVmaW5lIFRYNDkzOV9SVENUQkNfUE0JMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzlfUlRDVEJDX0NPTVAJMHgwMDAwMDA3ZgorCisjZGVmaW5lIFRYNDkzOV9SVENfUkVHX1JBTVNJWkUJMHgwMDAwMDEwMAorI2RlZmluZSBUWDQ5MzlfUlRDX1JFR19SV0JTSVpFCTB4MDAwMDAwMDYKKworLyoKKyAqIENSWVBUTworICovCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX1NBRVNPCTB4MDgwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfU0FFU0kJMHgwNDAwMDAwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9TREVTTwkweDAyMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX1NERVNJCTB4MDEwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfSU5EWEJTVF9NQVNLCTB4MDA3MDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfSU5EWEJTVChuKQkoKG4pIDw8IDIwKQorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9UT0lOVAkweDAwMDgwMDAwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX0RDSU5UCTB4MDAwNDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfR0JJTlQJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9JTkRYQVNUX01BU0sJMHgwMDAwZTAwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9JTkRYQVNUKG4pCSgobikgPDwgMTMpCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX0NTV0FQX01BU0sJMHgwMDAwMTgwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9DU1dBUF9OT05FCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ1NXQVBfSU4JMHgwMDAwMDgwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9DU1dBUF9PVVQJMHgwMDAwMTAwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9DU1dBUF9CT1RICTB4MDAwMDE4MDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ0RJVl9NQVNLCTB4MDAwMDA2MDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ0RJVl9ESVYyCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ0RJVl9ESVYxCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ0RJVl9ESVYyQUxUCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfQ0RJVl9ESVYxQUxUCTB4MDAwMDA2MDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfUERJTlRfTUFTSwkweDAwMDAwMGMwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX1BESU5UX0FMTAkweDAwMDAwMDAwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX1BESU5UX0VORAkweDAwMDAwMDQwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX1BESU5UX05FWFQJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9QRElOVF9OT05FCTB4MDAwMDAwYzAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfR0lOVEUJMHgwMDAwMDAwOAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NTUl9SU1RECTB4MDAwMDAwMDQKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DU1JfUlNUQwkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1NSX0VOQ1IJMHgwMDAwMDAwMQorCisvKiBiaXRzIGZvciB0eDQ5MzlfY3J5cHRvX3JlZy5jZHIuZ2VuLmN0cmwgKi8KKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DVFhfRU5HSU5FX01BU0sJMHgwMDAwMDAwMworI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NUWF9FTkdJTkVfREVTCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19DVFhfRU5HSU5FX0FFUwkweDAwMDAwMDAxCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1RYX0VOR0lORV9NRDUJMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NUWF9FTkdJTkVfU0hBMQkweDAwMDAwMDAzCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fQ1RYX1RETVMJMHgwMDAwMDAxMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NUWF9DTVMJMHgwMDAwMDAyMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NUWF9ETVMJMHgwMDAwMDA0MAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0NUWF9VUERBVEUJMHgwMDAwMDA4MAorCisvKiBiaXRzIGZvciB0eDQ5MzlfY3J5cHRvX2Rlc2MuY3RybCAqLworI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfT0JfQ05UX01BU0sJMHhmZmUwMDAwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfT0JfQ05UKGNudCkJKChjbnQpIDw8IDIxKQorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfSUJfQ05UX01BU0sJMHgwMDFmZmMwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfSUJfQ05UKGNudCkJKChjbnQpIDw8IDEwKQorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfU1RBUlQJMHgwMDAwMDIwMAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfRU5ECTB4MDAwMDAxMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX1hPUgkweDAwMDAwMDEwCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fREVTQ19MQVNUCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0VSUl9NQVNLCTB4MDAwMDAwMDYKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0VSUl9OT05FCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0VSUl9UT1VUCTB4MDAwMDAwMDIKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0VSUl9ESUdFU1QJMHgwMDAwMDAwNAorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX0RFU0NfT1dOCTB4MDAwMDAwMDEKKworLyogYml0cyBmb3IgdHg0OTM5X2NyeXB0b19kZXNjLmluZGV4ICovCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fREVTQ19IQVNIX0lEWF9NQVNLCTB4MDAwMDAwNzAKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0hBU0hfSURYKGlkeCkJKChpZHgpIDw8IDQpCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fREVTQ19FTkNSWVBUX0lEWF9NQVNLCTB4MDAwMDAwMDcKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19ERVNDX0VOQ1JZUFRfSURYKGlkeCkJKChpZHgpIDw8IDApCisKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19OUl9TRVQJNgorCisjZGVmaW5lIFRYNDkzOV9DUllQVE9fUkNTUl9JTlRFCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFg0OTM5X0NSWVBUT19SQ1NSX1JTVAkweDAwMDAwMDA0CisjZGVmaW5lIFRYNDkzOV9DUllQVE9fUkNTUl9GSU4JMHgwMDAwMDAwMgorI2RlZmluZSBUWDQ5MzlfQ1JZUFRPX1JDU1JfU1QJMHgwMDAwMDAwMQorCisvKgorICogVlBDCisgKi8KKyNkZWZpbmUgVFg0OTM5X1ZQQ19DU1JfR0JJTlQJMHgwMDAxMDAwMAorI2RlZmluZSBUWDQ5MzlfVlBDX0NTUl9TV0FQTwkweDAwMDAwMDIwCisjZGVmaW5lIFRYNDkzOV9WUENfQ1NSX1NXQVBJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DU1JfR0lOVEUJMHgwMDAwMDAwOAorI2RlZmluZSBUWDQ5MzlfVlBDX0NTUl9SU1RECTB4MDAwMDAwMDQKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DU1JfUlNUVlBDCTB4MDAwMDAwMDIKKworI2RlZmluZSBUWDQ5MzlfVlBDX0NUUkxBX1ZEUFNOCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DVFJMQV9QQlVTWQkweDAwMDAwMTAwCisjZGVmaW5lIFRYNDkzOV9WUENfQ1RSTEFfRENJTlQJMHgwMDAwMDA4MAorI2RlZmluZSBUWDQ5MzlfVlBDX0NUUkxBX1VPSU5UCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DVFJMQV9QRElOVF9NQVNLCTB4MDAwMDAwMzAKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DVFJMQV9QRElOVF9BTEwJMHgwMDAwMDAwMAorI2RlZmluZSBUWDQ5MzlfVlBDX0NUUkxBX1BESU5UX05FWFQJMHgwMDAwMDAxMAorI2RlZmluZSBUWDQ5MzlfVlBDX0NUUkxBX1BESU5UX05PTkUJMHgwMDAwMDAzMAorI2RlZmluZSBUWDQ5MzlfVlBDX0NUUkxBX1ZEVkxEUAkweDAwMDAwMDA4CisjZGVmaW5lIFRYNDkzOV9WUENfQ1RSTEFfVkRNT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFg0OTM5X1ZQQ19DVFJMQV9WREZPUgkweDAwMDAwMDAyCisjZGVmaW5lIFRYNDkzOV9WUENfQ1RSTEFfRU5WUEMJMHgwMDAwMDAwMQorCisvKiBiaXRzIGZvciB0eDQ5MzlfdnBjX2Rlc2MuY3RybDEgKi8KKyNkZWZpbmUgVFg0OTM5X1ZQQ19ERVNDX0NUUkwxX0VSUl9NQVNLCTB4MDAwMDAwMDYKKyNkZWZpbmUgVFg0OTM5X1ZQQ19ERVNDX0NUUkwxX09XTgkweDAwMDAwMDAxCisKKyNkZWZpbmUgdHg0OTM5X2RkcmNwdHIJKChzdHJ1Y3QgdHg0OTM5X2RkcmNfcmVnIF9faW9tZW0gKilUWDQ5MzlfRERSQ19SRUcpCisjZGVmaW5lIHR4NDkzOV9lYnVzY3B0cgkJdHg0OTM4X2VidXNjcHRyCisjZGVmaW5lIHR4NDkzOV9pcmNwdHIgXAorCQkoKHN0cnVjdCB0eDQ5MzlfaXJjX3JlZyBfX2lvbWVtICopVFg0OTM5X0lSQ19SRUcpCisjZGVmaW5lIHR4NDkzOV9wY2ljcHRyCQl0eDQ5MzhfcGNpY3B0cgorI2RlZmluZSB0eDQ5MzlfcGNpYzFwdHIJCXR4NDkzOF9wY2ljMXB0cgorI2RlZmluZSB0eDQ5MzlfY2NmZ3B0ciBcCisJCSgoc3RydWN0IHR4NDkzOV9jY2ZnX3JlZyBfX2lvbWVtICopVFg0OTM5X0NDRkdfUkVHKQorI2RlZmluZSB0eDQ5Mzlfc3JhbWNwdHIJCXR4NDkzOF9zcmFtY3B0cgorI2RlZmluZSB0eDQ5MzlfcnRjcHRyIFwKKwkJKChzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqKVRYNDkzOV9SVENfUkVHKQorI2RlZmluZSB0eDQ5MzlfY3J5cHRvcHRyIFwKKwkJKChzdHJ1Y3QgdHg0OTM5X2NyeXB0b19yZWcgX19pb21lbSAqKVRYNDkzOV9DUllQVE9fUkVHKQorI2RlZmluZSB0eDQ5MzlfdnBjcHRyCSgoc3RydWN0IHR4NDkzOV92cGNfcmVnIF9faW9tZW0gKilUWDQ5MzlfVlBDX1JFRykKKworI2RlZmluZSBUWDQ5MzlfUkVWX01BSl9NSU4oKQlcCisJKChfX3UzMilfX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPmNyaXIpICYgMHgwMGZmKQorI2RlZmluZSBUWDQ5MzlfUkVWX1BDT0RFKCkJXAorCSgoX191MzIpX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jcmlyKSA+PiAxNikKKyNkZWZpbmUgVFg0OTM5X0NDRkdfQkNGRygpCVwKKwkoKF9fdTMyKSgoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX0JDRkdfTUFTSykgXAorCQkgPj4gMzIpKQorCisjZGVmaW5lIHR4NDkzOV9jY2ZnX2NsZWFyKGJpdHMpCXR4NDkzOF9jY2ZnX2NsZWFyKGJpdHMpCisjZGVmaW5lIHR4NDkzOV9jY2ZnX3NldChiaXRzKQl0eDQ5MzhfY2NmZ19zZXQoYml0cykKKyNkZWZpbmUgdHg0OTM5X2NjZmdfY2hhbmdlKGNoYW5nZSwgbmV3KQl0eDQ5MzhfY2NmZ19jaGFuZ2UoY2hhbmdlLCBuZXcpCisKKyNkZWZpbmUgVFg0OTM5X0VCVVNDX0NSKGNoKQlUWDQ5MjdfRUJVU0NfQ1IoY2gpCisjZGVmaW5lIFRYNDkzOV9FQlVTQ19CQShjaCkJVFg0OTI3X0VCVVNDX0JBKGNoKQorI2RlZmluZSBUWDQ5MzlfRUJVU0NfU0laRShjaCkJVFg0OTI3X0VCVVNDX1NJWkUoY2gpCisjZGVmaW5lIFRYNDkzOV9FQlVTQ19XSURUSChjaCkJXAorCSgxNiA+PiAoKF9fdTMyKShUWDQ5MzlfRUJVU0NfQ1IoY2gpID4+IDIwKSAmIDB4MSkpCisKKy8qIFNDTEswID0gTVNUQ0xLICogNDI5LzE5ICogMTYvMjQ1IC8gMiAgKDE0Ljc0NU1IeiBmb3IgTVNUIDIwTUh6KSAqLworI2RlZmluZSBUWDQ5MzlfU0NMSzAobXN0KQlcCisJKCgoKG1zdCkgKyAyNDUvMikgLyAyNDVVTCAqIDQyOSAqIDE2ICsgMTkpIC8gMTkgLyAyKQorCit2b2lkIHR4NDkzOV93ZHRfaW5pdCh2b2lkKTsKK3ZvaWQgdHg0OTM5X2FkZF9tZW1vcnlfcmVnaW9ucyh2b2lkKTsKK3ZvaWQgdHg0OTM5X3NldHVwKHZvaWQpOwordm9pZCB0eDQ5MzlfdGltZV9pbml0KHVuc2lnbmVkIGludCB0bXJucik7Cit2b2lkIHR4NDkzOV9zaW9faW5pdCh1bnNpZ25lZCBpbnQgc2NsaywgdW5zaWduZWQgaW50IGN0c19tYXNrKTsKK3ZvaWQgdHg0OTM5X3NwaV9pbml0KGludCBidXNpZCk7Cit2b2lkIHR4NDkzOV9ldGhhZGRyX2luaXQodW5zaWduZWQgY2hhciAqYWRkcjAsIHVuc2lnbmVkIGNoYXIgKmFkZHIxKTsKK2ludCB0eDQ5MzlfcmVwb3J0X3BjaWNsayh2b2lkKTsKK3ZvaWQgdHg0OTM5X3JlcG9ydF9wY2kxY2xrKHZvaWQpOworc3RydWN0IHBjaV9kZXY7CitpbnQgdHg0OTM5X3BjaWMxX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCk7CitpbnQgdHg0OTM5X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7Cit2b2lkIHR4NDkzOV9zZXR1cF9wY2llcnJfaXJxKHZvaWQpOwordm9pZCB0eDQ5MzlfaXJxX2luaXQodm9pZCk7CitpbnQgdHg0OTM5X2lycSh2b2lkKTsKK3ZvaWQgdHg0OTM5X210ZF9pbml0KGludCBjaCk7Cit2b2lkIHR4NDkzOV9hdGFfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9fQVNNX1RYWDlfVFg0OTM5X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OWlycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDlpcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90eHg5aXJxLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5aXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OXBpby5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDlwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90eHg5cGlvLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5cGlvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OXRtci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3R4eDl0bXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy90eHg5dG1yLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90eHg5dG1yLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHlwZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS90eXBlcy5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZmNWJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMCwwICsxLDExMTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDAzLCAwNCBieSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE1hY2llaiBXLiBSb3p5Y2tpCisgKi8KKyNpZm5kZWYgX0FTTV9VQUNDRVNTX0gKKyNkZWZpbmUgX0FTTV9VQUNDRVNTX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKworLyoKKyAqIFRoZSBmcyB2YWx1ZSBkZXRlcm1pbmVzIHdoZXRoZXIgYXJndW1lbnQgdmFsaWRpdHkgY2hlY2tpbmcgc2hvdWxkIGJlCisgKiBwZXJmb3JtZWQgb3Igbm90LiAgSWYgZ2V0X2ZzKCkgPT0gVVNFUl9EUywgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLCB3aXRoCisgKiBnZXRfZnMoKSA9PSBLRVJORUxfRFMsIGNoZWNraW5nIGlzIGJ5cGFzc2VkLgorICoKKyAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZXNlIG1hY3JvcyBhcmUgZ3Jvc3NseSBtaXNuYW1lZC4KKyAqLworI2lmZGVmIENPTkZJR18zMkJJVAorCisjZGVmaW5lIF9fVUFfTElNSVQJMHg4MDAwMDAwMFVMCisKKyNkZWZpbmUgX19VQV9BRERSCSIud29yZCIKKyNkZWZpbmUgX19VQV9MQQkJImxhIgorI2RlZmluZSBfX1VBX0FERFUJImFkZHUiCisjZGVmaW5lIF9fVUFfdDAJCSIkOCIKKyNkZWZpbmUgX19VQV90MQkJIiQ5IgorCisjZW5kaWYgLyogQ09ORklHXzMyQklUICovCisKKyNpZmRlZiBDT05GSUdfNjRCSVQKKworI2RlZmluZSBfX1VBX0xJTUlUCSgtIFRBU0tfU0laRSkKKworI2RlZmluZSBfX1VBX0FERFIJIi5kd29yZCIKKyNkZWZpbmUgX19VQV9MQQkJImRsYSIKKyNkZWZpbmUgX19VQV9BRERVCSJkYWRkdSIKKyNkZWZpbmUgX19VQV90MAkJIiQxMiIKKyNkZWZpbmUgX19VQV90MQkJIiQxMyIKKworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLworCisvKgorICogVVNFUl9EUyBpcyBhIGJpdG1hc2sgdGhhdCBoYXMgdGhlIGJpdHMgc2V0IHRoYXQgbWF5IG5vdCBiZSBzZXQgaW4gYSB2YWxpZAorICogdXNlcnNwYWNlIGFkZHJlc3MuICBOb3RlIHRoYXQgd2UgbGltaXQgMzItYml0IHVzZXJzcGFjZSB0byAweDdmZmY4MDAwIGJ1dAorICogdGhlIGFyaXRobWV0aWMgd2UncmUgZG9pbmcgb25seSB3b3JrcyBpZiB0aGUgbGltaXQgaXMgYSBwb3dlciBvZiB0d28sIHNvCisgKiB3ZSB1c2UgMHg4MDAwMDAwMCBoZXJlIG9uIDMyLWJpdCBrZXJuZWxzLiAgSWYgYSBwcm9jZXNzIHBhc3NlcyBhbiBpbnZhbGlkCisgKiBhZGRyZXNzIGluIHRoaXMgcmFuZ2UgaXQncyB0aGUgcHJvY2VzcydzIHByb2JsZW0sIG5vdCBvdXJzIDotKQorICovCisKKyNkZWZpbmUgS0VSTkVMX0RTCSgobW1fc2VnbWVudF90KSB7IDBVTCB9KQorI2RlZmluZSBVU0VSX0RTCQkoKG1tX3NlZ21lbnRfdCkgeyBfX1VBX0xJTUlUIH0pCisKKyNkZWZpbmUgVkVSSUZZX1JFQUQgICAgMAorI2RlZmluZSBWRVJJRllfV1JJVEUgICAxCisKKyNkZWZpbmUgZ2V0X2RzKCkJKEtFUk5FTF9EUykKKyNkZWZpbmUgZ2V0X2ZzKCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCkKKyNkZWZpbmUgc2V0X2ZzKHgpCShjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQgPSAoeCkpCisKKyNkZWZpbmUgc2VnbWVudF9lcShhLCBiKQkoKGEpLnNlZyA9PSAoYikuc2VnKQorCisKKy8qCisgKiBJcyBhIGFkZHJlc3MgdmFsaWQ/IFRoaXMgZG9lcyBhIHN0cmFpZ2hmb3J3YXJkIGNhbGN1bGF0aW9uIHJhdGhlcgorICogdGhhbiB0ZXN0cy4KKyAqCisgKiBBZGRyZXNzIHZhbGlkIGlmOgorICogIC0gImFkZHIiIGRvZXNuJ3QgaGF2ZSBhbnkgaGlnaC1iaXRzIHNldAorICogIC0gQU5EICJzaXplIiBkb2Vzbid0IGhhdmUgYW55IGhpZ2gtYml0cyBzZXQKKyAqICAtIEFORCAiYWRkcitzaXplIiBkb2Vzbid0IGhhdmUgYW55IGhpZ2gtYml0cyBzZXQKKyAqICAtIE9SIHdlIGFyZSBpbiBrZXJuZWwgbW9kZS4KKyAqCisgKiBfX3VhX3NpemUoKSBpcyBhIHRyaWNrIHRvIGF2b2lkIHJ1bnRpbWUgY2hlY2tpbmcgb2YgcG9zaXRpdmUgY29uc3RhbnQKKyAqIHNpemVzOyBmb3IgdGhvc2Ugd2UgYWxyZWFkeSBrbm93IGF0IGNvbXBpbGUgdGltZSB0aGF0IHRoZSBzaXplIGlzIG9rLgorICovCisjZGVmaW5lIF9fdWFfc2l6ZShzaXplKQkJCQkJCQlcCisJKChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSAmJiAoc2lnbmVkIGxvbmcpIChzaXplKSA+IDApID8gMCA6IChzaXplKSkKKworLyoKKyAqIGFjY2Vzc19vazogLSBDaGVja3MgaWYgYSB1c2VyIHNwYWNlIHBvaW50ZXIgaXMgdmFsaWQKKyAqIEB0eXBlOiBUeXBlIG9mIGFjY2VzczogJVZFUklGWV9SRUFEIG9yICVWRVJJRllfV1JJVEUuICBOb3RlIHRoYXQKKyAqICAgICAgICAlVkVSSUZZX1dSSVRFIGlzIGEgc3VwZXJzZXQgb2YgJVZFUklGWV9SRUFEIC0gaWYgaXQgaXMgc2FmZQorICogICAgICAgIHRvIHdyaXRlIHRvIGEgYmxvY2ssIGl0IGlzIGFsd2F5cyBzYWZlIHRvIHJlYWQgZnJvbSBpdC4KKyAqIEBhZGRyOiBVc2VyIHNwYWNlIHBvaW50ZXIgdG8gc3RhcnQgb2YgYmxvY2sgdG8gY2hlY2sKKyAqIEBzaXplOiBTaXplIG9mIGJsb2NrIHRvIGNoZWNrCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDaGVja3MgaWYgYSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UgaXMgdmFsaWQuCisgKgorICogUmV0dXJucyB0cnVlIChub256ZXJvKSBpZiB0aGUgbWVtb3J5IGJsb2NrIG1heSBiZSB2YWxpZCwgZmFsc2UgKHplcm8pCisgKiBpZiBpdCBpcyBkZWZpbml0ZWx5IGludmFsaWQuCisgKgorICogTm90ZSB0aGF0LCBkZXBlbmRpbmcgb24gYXJjaGl0ZWN0dXJlLCB0aGlzIGZ1bmN0aW9uIHByb2JhYmx5IGp1c3QKKyAqIGNoZWNrcyB0aGF0IHRoZSBwb2ludGVyIGlzIGluIHRoZSB1c2VyIHNwYWNlIHJhbmdlIC0gYWZ0ZXIgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiwgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMgbWF5IHN0aWxsIHJldHVybiAtRUZBVUxULgorICovCisKKyNkZWZpbmUgX19hY2Nlc3NfbWFzayBnZXRfZnMoKS5zZWcKKworI2RlZmluZSBfX2FjY2Vzc19vayhhZGRyLCBzaXplLCBtYXNrKQkJCQkJXAorCSgoKHNpZ25lZCBsb25nKSgobWFzaykgJiAoKGFkZHIpIHwgKChhZGRyKSArIChzaXplKSkgfCBfX3VhX3NpemUoc2l6ZSkpKSkgPT0gMCkKKworI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkJCQkJCVwKKwlsaWtlbHkoX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpKGFkZHIpLCAoc2l6ZSksIF9fYWNjZXNzX21hc2spKQorCisvKgorICogcHV0X3VzZXI6IC0gV3JpdGUgYSBzaW1wbGUgdmFsdWUgaW50byB1c2VyIHNwYWNlLgorICogQHg6ICAgVmFsdWUgdG8gY29weSB0byB1c2VyIHNwYWNlLgorICogQHB0cjogRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIFRoaXMgbWFjcm8gY29waWVzIGEgc2luZ2xlIHNpbXBsZSB2YWx1ZSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyCisgKiBzcGFjZS4gIEl0IHN1cHBvcnRzIHNpbXBsZSB0eXBlcyBsaWtlIGNoYXIgYW5kIGludCwgYnV0IG5vdCBsYXJnZXIKKyAqIGRhdGEgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIG9yIGFycmF5cy4KKyAqCisgKiBAcHRyIG11c3QgaGF2ZSBwb2ludGVyLXRvLXNpbXBsZS12YXJpYWJsZSB0eXBlLCBhbmQgQHggbXVzdCBiZSBhc3NpZ25hYmxlCisgKiB0byB0aGUgcmVzdWx0IG9mIGRlcmVmZXJlbmNpbmcgQHB0ci4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLUVGQVVMVCBvbiBlcnJvci4KKyAqLworI2RlZmluZSBwdXRfdXNlcih4LHB0cikJXAorCV9fcHV0X3VzZXJfY2hlY2soKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCisKKy8qCisgKiBnZXRfdXNlcjogLSBHZXQgYSBzaW1wbGUgdmFyaWFibGUgZnJvbSB1c2VyIHNwYWNlLgorICogQHg6ICAgVmFyaWFibGUgdG8gc3RvcmUgcmVzdWx0LgorICogQHB0cjogU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBUaGlzIG1hY3JvIGNvcGllcyBhIHNpbmdsZSBzaW1wbGUgdmFyaWFibGUgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbAorICogc3BhY2UuICBJdCBzdXBwb3J0cyBzaW1wbGUgdHlwZXMgbGlrZSBjaGFyIGFuZCBpbnQsIGJ1dCBub3QgbGFyZ2VyCisgKiBkYXRhIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBvciBhcnJheXMuCisgKgorICogQHB0ciBtdXN0IGhhdmUgcG9pbnRlci10by1zaW1wbGUtdmFyaWFibGUgdHlwZSwgYW5kIHRoZSByZXN1bHQgb2YKKyAqIGRlcmVmZXJlbmNpbmcgQHB0ciBtdXN0IGJlIGFzc2lnbmFibGUgdG8gQHggd2l0aG91dCBhIGNhc3QuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIC1FRkFVTFQgb24gZXJyb3IuCisgKiBPbiBlcnJvciwgdGhlIHZhcmlhYmxlIEB4IGlzIHNldCB0byB6ZXJvLgorICovCisjZGVmaW5lIGdldF91c2VyKHgscHRyKSBcCisJX19nZXRfdXNlcl9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKworLyoKKyAqIF9fcHV0X3VzZXI6IC0gV3JpdGUgYSBzaW1wbGUgdmFsdWUgaW50byB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCisgKiBAeDogICBWYWx1ZSB0byBjb3B5IHRvIHVzZXIgc3BhY2UuCisgKiBAcHRyOiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogVGhpcyBtYWNybyBjb3BpZXMgYSBzaW5nbGUgc2ltcGxlIHZhbHVlIGZyb20ga2VybmVsIHNwYWNlIHRvIHVzZXIKKyAqIHNwYWNlLiAgSXQgc3VwcG9ydHMgc2ltcGxlIHR5cGVzIGxpa2UgY2hhciBhbmQgaW50LCBidXQgbm90IGxhcmdlcgorICogZGF0YSB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgb3IgYXJyYXlzLgorICoKKyAqIEBwdHIgbXVzdCBoYXZlIHBvaW50ZXItdG8tc2ltcGxlLXZhcmlhYmxlIHR5cGUsIGFuZCBAeCBtdXN0IGJlIGFzc2lnbmFibGUKKyAqIHRvIHRoZSByZXN1bHQgb2YgZGVyZWZlcmVuY2luZyBAcHRyLgorICoKKyAqIENhbGxlciBtdXN0IGNoZWNrIHRoZSBwb2ludGVyIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcworICogZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIC1FRkFVTFQgb24gZXJyb3IuCisgKi8KKyNkZWZpbmUgX19wdXRfdXNlcih4LHB0cikgXAorCV9fcHV0X3VzZXJfbm9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKworLyoKKyAqIF9fZ2V0X3VzZXI6IC0gR2V0IGEgc2ltcGxlIHZhcmlhYmxlIGZyb20gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQHg6ICAgVmFyaWFibGUgdG8gc3RvcmUgcmVzdWx0LgorICogQHB0cjogU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBUaGlzIG1hY3JvIGNvcGllcyBhIHNpbmdsZSBzaW1wbGUgdmFyaWFibGUgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbAorICogc3BhY2UuICBJdCBzdXBwb3J0cyBzaW1wbGUgdHlwZXMgbGlrZSBjaGFyIGFuZCBpbnQsIGJ1dCBub3QgbGFyZ2VyCisgKiBkYXRhIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBvciBhcnJheXMuCisgKgorICogQHB0ciBtdXN0IGhhdmUgcG9pbnRlci10by1zaW1wbGUtdmFyaWFibGUgdHlwZSwgYW5kIHRoZSByZXN1bHQgb2YKKyAqIGRlcmVmZXJlbmNpbmcgQHB0ciBtdXN0IGJlIGFzc2lnbmFibGUgdG8gQHggd2l0aG91dCBhIGNhc3QuCisgKgorICogQ2FsbGVyIG11c3QgY2hlY2sgdGhlIHBvaW50ZXIgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLUVGQVVMVCBvbiBlcnJvci4KKyAqIE9uIGVycm9yLCB0aGUgdmFyaWFibGUgQHggaXMgc2V0IHRvIHplcm8uCisgKi8KKyNkZWZpbmUgX19nZXRfdXNlcih4LHB0cikgXAorCV9fZ2V0X3VzZXJfbm9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKworc3RydWN0IF9fbGFyZ2Vfc3RydWN0IHsgdW5zaWduZWQgbG9uZyBidWZbMTAwXTsgfTsKKyNkZWZpbmUgX19tKHgpICgqKHN0cnVjdCBfX2xhcmdlX3N0cnVjdCBfX3VzZXIgKikoeCkpCisKKy8qCisgKiBZdWNrLiAgV2UgbmVlZCB0d28gdmFyaWFudHMsIG9uZSBmb3IgNjRiaXQgb3BlcmF0aW9uIGFuZCBvbmUKKyAqIGZvciAzMiBiaXQgbW9kZSBhbmQgb2xkIGlyb24uCisgKi8KKyNpZmRlZiBDT05GSUdfMzJCSVQKKyNkZWZpbmUgX19HRVRfVVNFUl9EVyh2YWwsIHB0cikgX19nZXRfdXNlcl9hc21fbGwzMih2YWwsIHB0cikKKyNlbmRpZgorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBfX0dFVF9VU0VSX0RXKHZhbCwgcHRyKSBfX2dldF91c2VyX2FzbSh2YWwsICJsZCIsIHB0cikKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2dldF91c2VyX3Vua25vd24odm9pZCk7CisKKyNkZWZpbmUgX19nZXRfdXNlcl9jb21tb24odmFsLCBzaXplLCBwdHIpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIDE6IF9fZ2V0X3VzZXJfYXNtKHZhbCwgImxiIiwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgMjogX19nZXRfdXNlcl9hc20odmFsLCAibGgiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSA0OiBfX2dldF91c2VyX2FzbSh2YWwsICJsdyIsIHB0cik7IGJyZWFrOwkJCVwKKwljYXNlIDg6IF9fR0VUX1VTRVJfRFcodmFsLCBwdHIpOyBicmVhazsJCQkJXAorCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJXAorKHsJCQkJCQkJCQlcCisJaW50IF9fZ3VfZXJyOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19nZXRfdXNlcl9jb21tb24oKHgpLCBzaXplLCBwdHIpOwkJCQlcCisJX19ndV9lcnI7CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LCBwdHIsIHNpemUpCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19ndV9lcnIgPSAtRUZBVUxUOwkJCQkJCVwKKwljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICogX19ndV9wdHIgPSAocHRyKTsJCVwKKwkJCQkJCQkJCVwKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgIF9fZ3VfcHRyLCBzaXplKSkpCQlcCisJCV9fZ2V0X3VzZXJfY29tbW9uKCh4KSwgc2l6ZSwgX19ndV9wdHIpOwkJCVwKKwkJCQkJCQkJCVwKKwlfX2d1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2dldF91c2VyX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJCQlcCit7CQkJCQkJCQkJXAorCWxvbmcgX19ndV90bXA7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CSIgaW5zbiAiCSUxLCAlMwkJCQlcbiIJXAorCSIyOgkJCQkJCQlcbiIJXAorCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIgkJCQlcbiIJXAorCSIzOglsaQklMCwgJTQJCQkJCVxuIglcCisJIglqCTJiCQkJCQlcbiIJXAorCSIJLnByZXZpb3VzCQkJCQlcbiIJXAorCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIgkJCVxuIglcCisJIgkiX19VQV9BRERSICJcdDFiLCAzYgkJCQlcbiIJXAorCSIJLnByZXZpb3VzCQkJCQlcbiIJXAorCTogIj1yIiAoX19ndV9lcnIpLCAiPXIiIChfX2d1X3RtcCkJCQkJXAorCTogIjAiICgwKSwgIm8iIChfX20oYWRkcikpLCAiaSIgKC1FRkFVTFQpKTsJCQlcCisJCQkJCQkJCQlcCisJKHZhbCkgPSAoX190eXBlb2ZfXygqKGFkZHIpKSkgX19ndV90bXA7CQkJCVwKK30KKworLyoKKyAqIEdldCBhIGxvbmcgbG9uZyA2NCB1c2luZyAzMiBiaXQgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2xsMzIodmFsLCBhZGRyKQkJCQkJXAorewkJCQkJCQkJCVwKKwl1bmlvbiB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGxvbmcgbG9uZwlsOwkJCQlcCisJCV9fdHlwZW9mX18oKihhZGRyKSkJdDsJCQkJXAorCX0gX19ndV90bXA7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CWx3CSUxLCAoJTMpCQkJCVxuIglcCisJIjI6CWx3CSVEMSwgNCglMykJCQkJXG4iCVwKKwkiMzoJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCisJIjQ6CWxpCSUwLCAlNAkJCQkJXG4iCVwKKwkiCW1vdmUJJTEsICQwCQkJCQlcbiIJXAorCSIJbW92ZQklRDEsICQwCQkJCQlcbiIJXAorCSIJagkzYgkJCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwkiCS5zZWN0aW9uCV9fZXhfdGFibGUsXCJhXCIJCVxuIglcCisJIgkiIF9fVUFfQUREUiAiCTFiLCA0YgkJCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkyYiwgNGIJCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwk6ICI9ciIgKF9fZ3VfZXJyKSwgIj0mciIgKF9fZ3VfdG1wLmwpCQkJCVwKKwk6ICIwIiAoMCksICJyIiAoYWRkciksICJpIiAoLUVGQVVMVCkpOwkJCQlcCisJCQkJCQkJCQlcCisJKHZhbCkgPSBfX2d1X3RtcC50OwkJCQkJCVwKK30KKworLyoKKyAqIFl1Y2suICBXZSBuZWVkIHR3byB2YXJpYW50cywgb25lIGZvciA2NGJpdCBvcGVyYXRpb24gYW5kIG9uZQorICogZm9yIDMyIGJpdCBtb2RlIGFuZCBvbGQgaXJvbi4KKyAqLworI2lmZGVmIENPTkZJR18zMkJJVAorI2RlZmluZSBfX1BVVF9VU0VSX0RXKHB0cikgX19wdXRfdXNlcl9hc21fbGwzMihwdHIpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgX19QVVRfVVNFUl9EVyhwdHIpIF9fcHV0X3VzZXJfYXNtKCJzZCIsIHB0cikKKyNlbmRpZgorCisjZGVmaW5lIF9fcHV0X3VzZXJfbm9jaGVjayh4LCBwdHIsIHNpemUpCQkJCVwKKyh7CQkJCQkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbDsJCQkJCVwKKwlpbnQgX19wdV9lcnIgPSAwOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX3B1X3ZhbCA9ICh4KTsJCQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCisJY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSAyOiBfX3B1dF91c2VyX2FzbSgic2giLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSA0OiBfX3B1dF91c2VyX2FzbSgic3ciLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSA4OiBfX1BVVF9VU0VSX0RXKHB0cik7IGJyZWFrOwkJCQlcCisJZGVmYXVsdDogX19wdXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCisJfQkJCQkJCQkJXAorCV9fcHVfZXJyOwkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fcHV0X3VzZXJfY2hlY2soeCwgcHRyLCBzaXplKQkJCQkJXAorKHsJCQkJCQkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19wdV9hZGRyID0gKHB0cik7CQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbCA9ICh4KTsJCQkJXAorCWludCBfX3B1X2VyciA9IC1FRkFVTFQ7CQkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgIF9fcHVfYWRkciwgc2l6ZSkpKSB7CVwKKwkJc3dpdGNoIChzaXplKSB7CQkJCQkJXAorCQljYXNlIDE6IF9fcHV0X3VzZXJfYXNtKCJzYiIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAorCQljYXNlIDI6IF9fcHV0X3VzZXJfYXNtKCJzaCIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAorCQljYXNlIDQ6IF9fcHV0X3VzZXJfYXNtKCJzdyIsIF9fcHVfYWRkcik7IGJyZWFrOwkJXAorCQljYXNlIDg6IF9fUFVUX1VTRVJfRFcoX19wdV9hZGRyKTsgYnJlYWs7CQlcCisJCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX3B1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX2FzbShpbnNuLCBwdHIpCQkJCQlcCit7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJIiBpbnNuICIJJXoyLCAlMwkJIyBfX3B1dF91c2VyX2FzbVxuIglcCisJIjI6CQkJCQkJCVxuIglcCisJIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiCQkJXG4iCVwKKwkiMzoJbGkJJTAsICU0CQkJCQlcbiIJXAorCSIJagkyYgkJCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwkiCS5zZWN0aW9uCV9fZXhfdGFibGUsXCJhXCIJCVxuIglcCisJIgkiIF9fVUFfQUREUiAiCTFiLCAzYgkJCQlcbiIJXAorCSIJLnByZXZpb3VzCQkJCQlcbiIJXAorCTogIj1yIiAoX19wdV9lcnIpCQkJCQkJXAorCTogIjAiICgwKSwgIkpyIiAoX19wdV92YWwpLCAibyIgKF9fbShwdHIpKSwJCQlcCisJICAiaSIgKC1FRkFVTFQpKTsJCQkJCQlcCit9CisKKyNkZWZpbmUgX19wdXRfdXNlcl9hc21fbGwzMihwdHIpCQkJCQlcCit7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJc3cJJTIsICglMykJIyBfX3B1dF91c2VyX2FzbV9sbDMyCVxuIglcCisJIjI6CXN3CSVEMiwgNCglMykJCQkJXG4iCVwKKwkiMzoJCQkJCQkJXG4iCVwKKwkiCS5zZWN0aW9uCS5maXh1cCxcImF4XCIJCQlcbiIJXAorCSI0OglsaQklMCwgJTQJCQkJCVxuIglcCisJIglqCTNiCQkJCQlcbiIJXAorCSIJLnByZXZpb3VzCQkJCQlcbiIJXAorCSIJLnNlY3Rpb24JX19leF90YWJsZSxcImFcIgkJXG4iCVwKKwkiCSIgX19VQV9BRERSICIJMWIsIDRiCQkJCVxuIglcCisJIgkiIF9fVUFfQUREUiAiCTJiLCA0YgkJCQlcbiIJXAorCSIJLnByZXZpb3VzIgkJCQkJCVwKKwk6ICI9ciIgKF9fcHVfZXJyKQkJCQkJCVwKKwk6ICIwIiAoMCksICJyIiAoX19wdV92YWwpLCAiciIgKHB0ciksCQkJCVwKKwkgICJpIiAoLUVGQVVMVCkpOwkJCQkJCVwKK30KKworZXh0ZXJuIHZvaWQgX19wdXRfdXNlcl91bmtub3duKHZvaWQpOworCisvKgorICogcHV0X3VzZXJfdW5hbGlnbmVkOiAtIFdyaXRlIGEgc2ltcGxlIHZhbHVlIGludG8gdXNlciBzcGFjZS4KKyAqIEB4OiAgIFZhbHVlIHRvIGNvcHkgdG8gdXNlciBzcGFjZS4KKyAqIEBwdHI6IERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBUaGlzIG1hY3JvIGNvcGllcyBhIHNpbmdsZSBzaW1wbGUgdmFsdWUgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlcgorICogc3BhY2UuICBJdCBzdXBwb3J0cyBzaW1wbGUgdHlwZXMgbGlrZSBjaGFyIGFuZCBpbnQsIGJ1dCBub3QgbGFyZ2VyCisgKiBkYXRhIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBvciBhcnJheXMuCisgKgorICogQHB0ciBtdXN0IGhhdmUgcG9pbnRlci10by1zaW1wbGUtdmFyaWFibGUgdHlwZSwgYW5kIEB4IG11c3QgYmUgYXNzaWduYWJsZQorICogdG8gdGhlIHJlc3VsdCBvZiBkZXJlZmVyZW5jaW5nIEBwdHIuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIC1FRkFVTFQgb24gZXJyb3IuCisgKi8KKyNkZWZpbmUgcHV0X3VzZXJfdW5hbGlnbmVkKHgscHRyKQlcCisJX19wdXRfdXNlcl91bmFsaWduZWRfY2hlY2soKHgpLChwdHIpLHNpemVvZigqKHB0cikpKQorCisvKgorICogZ2V0X3VzZXJfdW5hbGlnbmVkOiAtIEdldCBhIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UuCisgKiBAeDogICBWYXJpYWJsZSB0byBzdG9yZSByZXN1bHQuCisgKiBAcHRyOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIFRoaXMgbWFjcm8gY29waWVzIGEgc2luZ2xlIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsCisgKiBzcGFjZS4gIEl0IHN1cHBvcnRzIHNpbXBsZSB0eXBlcyBsaWtlIGNoYXIgYW5kIGludCwgYnV0IG5vdCBsYXJnZXIKKyAqIGRhdGEgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIG9yIGFycmF5cy4KKyAqCisgKiBAcHRyIG11c3QgaGF2ZSBwb2ludGVyLXRvLXNpbXBsZS12YXJpYWJsZSB0eXBlLCBhbmQgdGhlIHJlc3VsdCBvZgorICogZGVyZWZlcmVuY2luZyBAcHRyIG11c3QgYmUgYXNzaWduYWJsZSB0byBAeCB3aXRob3V0IGEgY2FzdC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLUVGQVVMVCBvbiBlcnJvci4KKyAqIE9uIGVycm9yLCB0aGUgdmFyaWFibGUgQHggaXMgc2V0IHRvIHplcm8uCisgKi8KKyNkZWZpbmUgZ2V0X3VzZXJfdW5hbGlnbmVkKHgscHRyKSBcCisJX19nZXRfdXNlcl91bmFsaWduZWRfY2hlY2soKHgpLChwdHIpLHNpemVvZigqKHB0cikpKQorCisvKgorICogX19wdXRfdXNlcl91bmFsaWduZWQ6IC0gV3JpdGUgYSBzaW1wbGUgdmFsdWUgaW50byB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCisgKiBAeDogICBWYWx1ZSB0byBjb3B5IHRvIHVzZXIgc3BhY2UuCisgKiBAcHRyOiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogVGhpcyBtYWNybyBjb3BpZXMgYSBzaW5nbGUgc2ltcGxlIHZhbHVlIGZyb20ga2VybmVsIHNwYWNlIHRvIHVzZXIKKyAqIHNwYWNlLiAgSXQgc3VwcG9ydHMgc2ltcGxlIHR5cGVzIGxpa2UgY2hhciBhbmQgaW50LCBidXQgbm90IGxhcmdlcgorICogZGF0YSB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgb3IgYXJyYXlzLgorICoKKyAqIEBwdHIgbXVzdCBoYXZlIHBvaW50ZXItdG8tc2ltcGxlLXZhcmlhYmxlIHR5cGUsIGFuZCBAeCBtdXN0IGJlIGFzc2lnbmFibGUKKyAqIHRvIHRoZSByZXN1bHQgb2YgZGVyZWZlcmVuY2luZyBAcHRyLgorICoKKyAqIENhbGxlciBtdXN0IGNoZWNrIHRoZSBwb2ludGVyIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcworICogZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIC1FRkFVTFQgb24gZXJyb3IuCisgKi8KKyNkZWZpbmUgX19wdXRfdXNlcl91bmFsaWduZWQoeCxwdHIpIFwKKwlfX3B1dF91c2VyX3VuYWxpZ25lZF9ub2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKKworLyoKKyAqIF9fZ2V0X3VzZXJfdW5hbGlnbmVkOiAtIEdldCBhIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB4OiAgIFZhcmlhYmxlIHRvIHN0b3JlIHJlc3VsdC4KKyAqIEBwdHI6IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogVGhpcyBtYWNybyBjb3BpZXMgYSBzaW5nbGUgc2ltcGxlIHZhcmlhYmxlIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwKKyAqIHNwYWNlLiAgSXQgc3VwcG9ydHMgc2ltcGxlIHR5cGVzIGxpa2UgY2hhciBhbmQgaW50LCBidXQgbm90IGxhcmdlcgorICogZGF0YSB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgb3IgYXJyYXlzLgorICoKKyAqIEBwdHIgbXVzdCBoYXZlIHBvaW50ZXItdG8tc2ltcGxlLXZhcmlhYmxlIHR5cGUsIGFuZCB0aGUgcmVzdWx0IG9mCisgKiBkZXJlZmVyZW5jaW5nIEBwdHIgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIEB4IHdpdGhvdXQgYSBjYXN0LgorICoKKyAqIENhbGxlciBtdXN0IGNoZWNrIHRoZSBwb2ludGVyIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcworICogZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIC1FRkFVTFQgb24gZXJyb3IuCisgKiBPbiBlcnJvciwgdGhlIHZhcmlhYmxlIEB4IGlzIHNldCB0byB6ZXJvLgorICovCisjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkKHgscHRyKSBcCisJX19nZXRfdXNlcl9fdW5hbGlnbmVkbm9jaGVjaygoeCksKHB0ciksc2l6ZW9mKCoocHRyKSkpCisKKy8qCisgKiBZdWNrLiAgV2UgbmVlZCB0d28gdmFyaWFudHMsIG9uZSBmb3IgNjRiaXQgb3BlcmF0aW9uIGFuZCBvbmUKKyAqIGZvciAzMiBiaXQgbW9kZSBhbmQgb2xkIGlyb24uCisgKi8KKyNpZmRlZiBDT05GSUdfMzJCSVQKKyNkZWZpbmUgX19HRVRfVVNFUl9VTkFMSUdORURfRFcodmFsLCBwdHIpCQkJCVwKKwlfX2dldF91c2VyX3VuYWxpZ25lZF9hc21fbGwzMih2YWwsIHB0cikKKyNlbmRpZgorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBfX0dFVF9VU0VSX1VOQUxJR05FRF9EVyh2YWwsIHB0cikJCQkJXAorCV9fZ2V0X3VzZXJfdW5hbGlnbmVkX2FzbSh2YWwsICJ1bGQiLCBwdHIpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19nZXRfdXNlcl91bmFsaWduZWRfdW5rbm93bih2b2lkKTsKKworI2RlZmluZSBfX2dldF91c2VyX3VuYWxpZ25lZF9jb21tb24odmFsLCBzaXplLCBwdHIpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogX19nZXRfdXNlcl9hc20odmFsLCAibGIiLCBwdHIpOyBicmVhazsJCQlcCisJY2FzZSAyOiBfX2dldF91c2VyX3VuYWxpZ25lZF9hc20odmFsLCAidWxoIiwgcHRyKTsgYnJlYWs7CVwKKwljYXNlIDQ6IF9fZ2V0X3VzZXJfdW5hbGlnbmVkX2FzbSh2YWwsICJ1bHciLCBwdHIpOyBicmVhazsJXAorCWNhc2UgODogX19HRVRfVVNFUl9VTkFMSUdORURfRFcodmFsLCBwdHIpOyBicmVhazsJCVwKKwlkZWZhdWx0OiBfX2dldF91c2VyX3VuYWxpZ25lZF91bmtub3duKCk7IGJyZWFrOwkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkX25vY2hlY2soeCxwdHIsc2l6ZSkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19ndV9lcnI7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2dldF91c2VyX3VuYWxpZ25lZF9jb21tb24oKHgpLCBzaXplLCBwdHIpOwkJCVwKKwlfX2d1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2dldF91c2VyX3VuYWxpZ25lZF9jaGVjayh4LHB0cixzaXplKQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19ndV9lcnIgPSAtRUZBVUxUOwkJCQkJCVwKKwljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICogX19ndV9wdHIgPSAocHRyKTsJCVwKKwkJCQkJCQkJCVwKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgIF9fZ3VfcHRyLCBzaXplKSkpCQlcCisJCV9fZ2V0X3VzZXJfdW5hbGlnbmVkX2NvbW1vbigoeCksIHNpemUsIF9fZ3VfcHRyKTsJXAorCQkJCQkJCQkJXAorCV9fZ3VfZXJyOwkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJXAorewkJCQkJCQkJCVwKKwlsb25nIF9fZ3VfdG1wOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIxOgkiIGluc24gIgklMSwgJTMJCQkJXG4iCVwKKwkiMjoJCQkJCQkJXG4iCVwKKwkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCVwKKwkiMzoJbGkJJTAsICU0CQkJCQlcbiIJXAorCSIJagkyYgkJCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCIJCQlcbiIJXAorCSIJIl9fVUFfQUREUiAiXHQxYiwgM2IJCQkJXG4iCVwKKwkiCSJfX1VBX0FERFIgIlx0MWIgKyA0LCAzYgkJCVxuIglcCisJIgkucHJldmlvdXMJCQkJCVxuIglcCisJOiAiPXIiIChfX2d1X2VyciksICI9ciIgKF9fZ3VfdG1wKQkJCQlcCisJOiAiMCIgKDApLCAibyIgKF9fbShhZGRyKSksICJpIiAoLUVGQVVMVCkpOwkJCVwKKwkJCQkJCQkJCVwKKwkodmFsKSA9IChfX3R5cGVvZl9fKCooYWRkcikpKSBfX2d1X3RtcDsJCQkJXAorfQorCisvKgorICogR2V0IGEgbG9uZyBsb25nIDY0IHVzaW5nIDMyIGJpdCByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgX19nZXRfdXNlcl91bmFsaWduZWRfYXNtX2xsMzIodmFsLCBhZGRyKQkJCVwKK3sJCQkJCQkJCQlcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2d1X3RtcDsJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CXVsdwklMSwgKCUzKQkJCQlcbiIJXAorCSIyOgl1bHcJJUQxLCA0KCUzKQkJCQlcbiIJXAorCSIJbW92ZQklMCwgJDAJCQkJCVxuIglcCisJIjM6CS5zZWN0aW9uCS5maXh1cCxcImF4XCIJCQlcbiIJXAorCSI0OglsaQklMCwgJTQJCQkJCVxuIglcCisJIgltb3ZlCSUxLCAkMAkJCQkJXG4iCVwKKwkiCW1vdmUJJUQxLCAkMAkJCQkJXG4iCVwKKwkiCWoJM2IJCQkJCVxuIglcCisJIgkucHJldmlvdXMJCQkJCVxuIglcCisJIgkuc2VjdGlvbglfX2V4X3RhYmxlLFwiYVwiCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkxYiwgNGIJCQkJXG4iCVwKKwkiCSIgX19VQV9BRERSICIJMWIgKyA0LCA0YgkJCVxuIglcCisJIgkiIF9fVUFfQUREUiAiCTJiLCA0YgkJCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkyYiArIDQsIDRiCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwk6ICI9ciIgKF9fZ3VfZXJyKSwgIj0mciIgKF9fZ3VfdG1wKQkJCQlcCisJOiAiMCIgKDApLCAiciIgKGFkZHIpLCAiaSIgKC1FRkFVTFQpKTsJCQkJXAorCSh2YWwpID0gKF9fdHlwZW9mX18oKihhZGRyKSkpIF9fZ3VfdG1wOwkJCQlcCit9CisKKy8qCisgKiBZdWNrLiAgV2UgbmVlZCB0d28gdmFyaWFudHMsIG9uZSBmb3IgNjRiaXQgb3BlcmF0aW9uIGFuZCBvbmUKKyAqIGZvciAzMiBiaXQgbW9kZSBhbmQgb2xkIGlyb24uCisgKi8KKyNpZmRlZiBDT05GSUdfMzJCSVQKKyNkZWZpbmUgX19QVVRfVVNFUl9VTkFMSUdORURfRFcocHRyKSBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc21fbGwzMihwdHIpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgX19QVVRfVVNFUl9VTkFMSUdORURfRFcocHRyKSBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzZCIsIHB0cikKKyNlbmRpZgorCisjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkX25vY2hlY2soeCxwdHIsc2l6ZSkJCQlcCisoewkJCQkJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19wdV92YWw7CQkJCQlcCisJaW50IF9fcHVfZXJyID0gMDsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19wdV92YWwgPSAoeCk7CQkJCQkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAorCWNhc2UgMTogX19wdXRfdXNlcl9hc20oInNiIiwgcHRyKTsgYnJlYWs7CQkJXAorCWNhc2UgMjogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c2giLCBwdHIpOyBicmVhazsJCVwKKwljYXNlIDQ6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbSgidXN3IiwgcHRyKTsgYnJlYWs7CQlcCisJY2FzZSA4OiBfX1BVVF9VU0VSX1VOQUxJR05FRF9EVyhwdHIpOyBicmVhazsJCQlcCisJZGVmYXVsdDogX19wdXRfdXNlcl91bmFsaWduZWRfdW5rbm93bigpOyBicmVhazsJCQlcCisJfQkJCQkJCQkJXAorCV9fcHVfZXJyOwkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkX2NoZWNrKHgscHRyLHNpemUpCQkJCVwKKyh7CQkJCQkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3VzZXIgKl9fcHVfYWRkciA9IChwdHIpOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19wdV92YWwgPSAoeCk7CQkJCVwKKwlpbnQgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICBfX3B1X2FkZHIsIHNpemUpKSkgewlcCisJCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKKwkJY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBfX3B1X2FkZHIpOyBicmVhazsJCVwKKwkJY2FzZSAyOiBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oInVzaCIsIF9fcHVfYWRkcik7IGJyZWFrOyBcCisJCWNhc2UgNDogX19wdXRfdXNlcl91bmFsaWduZWRfYXNtKCJ1c3ciLCBfX3B1X2FkZHIpOyBicmVhazsgXAorCQljYXNlIDg6IF9fUFVUX1VTRVJfVU5BTEdJTkVEX0RXKF9fcHVfYWRkcik7IGJyZWFrOwlcCisJCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5hbGlnbmVkX3Vua25vd24oKTsgYnJlYWs7CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX3B1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc20oaW5zbiwgcHRyKQkJCQlcCit7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJIiBpbnNuICIJJXoyLCAlMwkJIyBfX3B1dF91c2VyX3VuYWxpZ25lZF9hc21cbiIgXAorCSIyOgkJCQkJCQlcbiIJXAorCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCisJIjM6CWxpCSUwLCAlNAkJCQkJXG4iCVwKKwkiCWoJMmIJCQkJCVxuIglcCisJIgkucHJldmlvdXMJCQkJCVxuIglcCisJIgkuc2VjdGlvbglfX2V4X3RhYmxlLFwiYVwiCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkxYiwgM2IJCQkJXG4iCVwKKwkiCS5wcmV2aW91cwkJCQkJXG4iCVwKKwk6ICI9ciIgKF9fcHVfZXJyKQkJCQkJCVwKKwk6ICIwIiAoMCksICJKciIgKF9fcHVfdmFsKSwgIm8iIChfX20ocHRyKSksCQkJXAorCSAgImkiICgtRUZBVUxUKSk7CQkJCQkJXAorfQorCisjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkX2FzbV9sbDMyKHB0cikJCQkJXAorewkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CXN3CSUyLCAoJTMpCSMgX19wdXRfdXNlcl91bmFsaWduZWRfYXNtX2xsMzIJXG4iIFwKKwkiMjoJc3cJJUQyLCA0KCUzKQkJCQlcbiIJXAorCSIzOgkJCQkJCQlcbiIJXAorCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCisJIjQ6CWxpCSUwLCAlNAkJCQkJXG4iCVwKKwkiCWoJM2IJCQkJCVxuIglcCisJIgkucHJldmlvdXMJCQkJCVxuIglcCisJIgkuc2VjdGlvbglfX2V4X3RhYmxlLFwiYVwiCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkxYiwgNGIJCQkJXG4iCVwKKwkiCSIgX19VQV9BRERSICIJMWIgKyA0LCA0YgkJCVxuIglcCisJIgkiIF9fVUFfQUREUiAiCTJiLCA0YgkJCQlcbiIJXAorCSIJIiBfX1VBX0FERFIgIgkyYiArIDQsIDRiCQkJXG4iCVwKKwkiCS5wcmV2aW91cyIJCQkJCQlcCisJOiAiPXIiIChfX3B1X2VycikJCQkJCQlcCisJOiAiMCIgKDApLCAiciIgKF9fcHVfdmFsKSwgInIiIChwdHIpLAkJCQlcCisJICAiaSIgKC1FRkFVTFQpKTsJCQkJCQlcCit9CisKK2V4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5hbGlnbmVkX3Vua25vd24odm9pZCk7CisKKy8qCisgKiBXZSdyZSBnZW5lcmF0aW5nIGp1bXAgdG8gc3Vicm91dGluZXMgd2hpY2ggd2lsbCBiZSBvdXRzaWRlIHRoZSByYW5nZSBvZgorICoganVtcCBpbnN0cnVjdGlvbnMKKyAqLworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBfX01PRFVMRV9KQUwoZGVzdGluYXRpb24pCQkJCQlcCisJIi5zZXRcdG5vYXRcblx0IgkJCQkJCVwKKwlfX1VBX0xBICJcdCQxLCAiICNkZXN0aW5hdGlvbiAiXG5cdCIgCQkJCVwKKwkiamFsclx0JDFcblx0IgkJCQkJCQlcCisJIi5zZXRcdGF0XG5cdCIKKyNlbHNlCisjZGVmaW5lIF9fTU9EVUxFX0pBTChkZXN0aW5hdGlvbikJCQkJCVwKKwkiamFsXHQiICNkZXN0aW5hdGlvbiAiXG5cdCIKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19DUFVfREFERElfV09SS0FST1VORFMKKyNkZWZpbmUgREFERElfU0NSQVRDSCAiJDAiCisjZWxzZQorI2RlZmluZSBEQURESV9TQ1JBVENIICIkMyIKKyNlbmRpZgorCitleHRlcm4gc2l6ZV90IF9fY29weV91c2VyKHZvaWQgKl9fdG8sIGNvbnN0IHZvaWQgKl9fZnJvbSwgc2l6ZV90IF9fbik7CisKKyNkZWZpbmUgX19pbnZva2VfY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCQlcCisoewkJCQkJCQkJCVwKKwlyZWdpc3RlciB2b2lkIF9fdXNlciAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJXAorCXJlZ2lzdGVyIGNvbnN0IHZvaWQgKl9fY3VfZnJvbV9yIF9fYXNtX18oIiQ1Iik7CQkJXAorCXJlZ2lzdGVyIGxvbmcgX19jdV9sZW5fciBfX2FzbV9fKCIkNiIpOwkJCQlcCisJCQkJCQkJCQlcCisJX19jdV90b19yID0gKHRvKTsJCQkJCQlcCisJX19jdV9mcm9tX3IgPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuX3IgPSAobik7CQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwlfX01PRFVMRV9KQUwoX19jb3B5X3VzZXIpCQkJCQlcCisJOiAiK3IiIChfX2N1X3RvX3IpLCAiK3IiIChfX2N1X2Zyb21fciksICIrciIgKF9fY3VfbGVuX3IpCVwKKwk6CQkJCQkJCQlcCisJOiAiJDgiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDE1IiwgIiQyNCIsICIkMzEiLAkJXAorCSAgREFERElfU0NSQVRDSCwgIm1lbW9yeSIpOwkJCQkJXAorCV9fY3VfbGVuX3I7CQkJCQkJCVwKK30pCisKKy8qCisgKiBfX2NvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDb3B5IGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLworI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXZvaWQgX191c2VyICpfX2N1X3RvOwkJCQkJCVwKKwljb25zdCB2b2lkICpfX2N1X2Zyb207CQkJCQkJXAorCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwltaWdodF9zbGVlcCgpOwkJCQkJCQlcCisJX19jdV90byA9ICh0byk7CQkJCQkJCVwKKwlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCisJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLCBfX2N1X2xlbik7CVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworZXh0ZXJuIHNpemVfdCBfX2NvcHlfdXNlcl9pbmF0b21pYyh2b2lkICpfX3RvLCBjb25zdCB2b2lkICpfX2Zyb20sIHNpemVfdCBfX24pOworCisjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkJCQlcCisoewkJCQkJCQkJCVwKKwl2b2lkIF9fdXNlciAqX19jdV90bzsJCQkJCQlcCisJY29uc3Qgdm9pZCAqX19jdV9mcm9tOwkJCQkJCVwKKwlsb25nIF9fY3VfbGVuOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19jdV90byA9ICh0byk7CQkJCQkJCVwKKwlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCisJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLCBfX2N1X2xlbik7CVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkJCQlcCisoewkJCQkJCQkJCVwKKwl2b2lkICpfX2N1X3RvOwkJCQkJCQlcCisJY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbTsJCQkJCVwKKwlsb25nIF9fY3VfbGVuOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19jdV90byA9ICh0byk7CQkJCQkJCVwKKwlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCisJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhfX2N1X3RvLCBfX2N1X2Zyb20sCVwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3VfbGVuKTsJCVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworLyoKKyAqIGNvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgorICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgorICoKKyAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCisgKgorICogQ29weSBkYXRhIGZyb20ga2VybmVsIHNwYWNlIHRvIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKi8KKyNkZWZpbmUgY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdm9pZCBfX3VzZXIgKl9fY3VfdG87CQkJCQkJXAorCWNvbnN0IHZvaWQgKl9fY3VfZnJvbTsJCQkJCQlcCisJbG9uZyBfX2N1X2xlbjsJCQkJCQkJXAorCQkJCQkJCQkJXAorCW1pZ2h0X3NsZWVwKCk7CQkJCQkJCVwKKwlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAorCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCisJX19jdV9sZW4gPSAobik7CQkJCQkJCVwKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgX19jdV90bywgX19jdV9sZW4pKQkJCVwKKwkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X3RvX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3VfbGVuKTsJCVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJXAorKHsJCQkJCQkJCQlcCisJcmVnaXN0ZXIgdm9pZCAqX19jdV90b19yIF9fYXNtX18oIiQ0Iik7CQkJCVwKKwlyZWdpc3RlciBjb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tX3IgX19hc21fXygiJDUiKTsJCVwKKwlyZWdpc3RlciBsb25nIF9fY3VfbGVuX3IgX19hc21fXygiJDYiKTsJCQkJXAorCQkJCQkJCQkJXAorCV9fY3VfdG9fciA9ICh0byk7CQkJCQkJXAorCV9fY3VfZnJvbV9yID0gKGZyb20pOwkJCQkJCVwKKwlfX2N1X2xlbl9yID0gKG4pOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIi5zZXRcdG5vcmVvcmRlclxuXHQiCQkJCQkJXAorCV9fTU9EVUxFX0pBTChfX2NvcHlfdXNlcikJCQkJCVwKKwkiLnNldFx0bm9hdFxuXHQiCQkJCQkJXAorCV9fVUFfQUREVSAiXHQkMSwgJTEsICUyXG5cdCIJCQkJCVwKKwkiLnNldFx0YXRcblx0IgkJCQkJCQlcCisJIi5zZXRcdHJlb3JkZXIiCQkJCQkJCVwKKwk6ICIrciIgKF9fY3VfdG9fciksICIrciIgKF9fY3VfZnJvbV9yKSwgIityIiAoX19jdV9sZW5fcikJXAorCToJCQkJCQkJCVwKKwk6ICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTUiLCAiJDI0IiwgIiQzMSIsCQlcCisJICBEQURESV9TQ1JBVENILCAibWVtb3J5Iik7CQkJCQlcCisJX19jdV9sZW5fcjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJCQlcCisoewkJCQkJCQkJCVwKKwlyZWdpc3RlciB2b2lkICpfX2N1X3RvX3IgX19hc21fXygiJDQiKTsJCQkJXAorCXJlZ2lzdGVyIGNvbnN0IHZvaWQgX191c2VyICpfX2N1X2Zyb21fciBfX2FzbV9fKCIkNSIpOwkJXAorCXJlZ2lzdGVyIGxvbmcgX19jdV9sZW5fciBfX2FzbV9fKCIkNiIpOwkJCQlcCisJCQkJCQkJCQlcCisJX19jdV90b19yID0gKHRvKTsJCQkJCQlcCisJX19jdV9mcm9tX3IgPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuX3IgPSAobik7CQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiLnNldFx0bm9yZW9yZGVyXG5cdCIJCQkJCQlcCisJX19NT0RVTEVfSkFMKF9fY29weV91c2VyX2luYXRvbWljKQkJCQlcCisJIi5zZXRcdG5vYXRcblx0IgkJCQkJCVwKKwlfX1VBX0FERFUgIlx0JDEsICUxLCAlMlxuXHQiCQkJCQlcCisJIi5zZXRcdGF0XG5cdCIJCQkJCQkJXAorCSIuc2V0XHRyZW9yZGVyIgkJCQkJCQlcCisJOiAiK3IiIChfX2N1X3RvX3IpLCAiK3IiIChfX2N1X2Zyb21fciksICIrciIgKF9fY3VfbGVuX3IpCVwKKwk6CQkJCQkJCQlcCisJOiAiJDgiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDE1IiwgIiQyNCIsICIkMzEiLAkJXAorCSAgREFERElfU0NSQVRDSCwgIm1lbW9yeSIpOwkJCQkJXAorCV9fY3VfbGVuX3I7CQkJCQkJCVwKK30pCisKKy8qCisgKiBfX2NvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KKyAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKKyAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICoKKyAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKKyAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCisgKi8KKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXZvaWQgKl9fY3VfdG87CQkJCQkJCVwKKwljb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tOwkJCQkJXAorCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwltaWdodF9zbGVlcCgpOwkJCQkJCQlcCisJX19jdV90byA9ICh0byk7CQkJCQkJCVwKKwlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAorCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCisJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCQlcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2N1X2xlbik7CQkJXAorCV9fY3VfbGVuOwkJCQkJCQlcCit9KQorCisvKgorICogY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KKyAqIEBmcm9tOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICoKKyAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKKyAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCisgKi8KKyNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCisoewkJCQkJCQkJCVwKKwl2b2lkICpfX2N1X3RvOwkJCQkJCQlcCisJY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbTsJCQkJCVwKKwlsb25nIF9fY3VfbGVuOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJbWlnaHRfc2xlZXAoKTsJCQkJCQkJXAorCV9fY3VfdG8gPSAodG8pOwkJCQkJCQlcCisJX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKKwlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAorCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fY3VfZnJvbSwgX19jdV9sZW4pKQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3VfbGVuKTsJCVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgbikJX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKKworI2RlZmluZSBjb3B5X2luX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCisoewkJCQkJCQkJCVwKKwl2b2lkIF9fdXNlciAqX19jdV90bzsJCQkJCQlcCisJY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbTsJCQkJCVwKKwlsb25nIF9fY3VfbGVuOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJbWlnaHRfc2xlZXAoKTsJCQkJCQkJXAorCV9fY3VfdG8gPSAodG8pOwkJCQkJCQlcCisJX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKKwlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX2N1X2Zyb20sIF9fY3VfbGVuKSAmJglcCisJICAgICAgICAgICBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBfX2N1X3RvLCBfX2N1X2xlbikpKQkJXAorCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3VfbGVuKTsJCVwKKwlfX2N1X2xlbjsJCQkJCQkJXAorfSkKKworLyoKKyAqIF9fY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byB6ZXJvLgorICoKKyAqIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjbGVhcmVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgX19rZXJuZWxfc2l6ZV90CitfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKmFkZHIsIF9fa2VybmVsX3NpemVfdCBzaXplKQoreworCV9fa2VybmVsX3NpemVfdCByZXM7CisKKwltaWdodF9zbGVlcCgpOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJIm1vdmVcdCQ1LCAkMFxuXHQiCisJCSJtb3ZlXHQkNiwgJTJcblx0IgorCQlfX01PRFVMRV9KQUwoX19iemVybykKKwkJIm1vdmVcdCUwLCAkNiIKKwkJOiAiPXIiIChyZXMpCisJCTogInIiIChhZGRyKSwgInIiIChzaXplKQorCQk6ICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsIF9fVUFfdDEsICIkMzEiKTsKKworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgY2xlYXJfdXNlcihhZGRyLG4pCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdm9pZCBfX3VzZXIgKiBfX2NsX2FkZHIgPSAoYWRkcik7CQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fY2xfc2l6ZSA9IChuKTsJCQkJCVwKKwlpZiAoX19jbF9zaXplICYmIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsCQkJXAorCQkoKHVuc2lnbmVkIGxvbmcpKF9fY2xfYWRkcikpLCBfX2NsX3NpemUpKQkJXAorCQlfX2NsX3NpemUgPSBfX2NsZWFyX3VzZXIoX19jbF9hZGRyLCBfX2NsX3NpemUpOwkJXAorCV9fY2xfc2l6ZTsJCQkJCQkJXAorfSkKKworLyoKKyAqIF9fc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKgorICogQ29waWVzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqIENhbGxlciBtdXN0IGNoZWNrIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAobm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcKKyAqIE5VTCkuCisgKgorICogSWYgYWNjZXNzIHRvIHVzZXJzcGFjZSBmYWlscywgcmV0dXJucyAtRUZBVUxUIChzb21lIGRhdGEgbWF5IGhhdmUgYmVlbgorICogY29waWVkKS4KKyAqCisgKiBJZiBAY291bnQgaXMgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgY29waWVzIEBjb3VudCBieXRlcworICogYW5kIHJldHVybnMgQGNvdW50LgorICovCitzdGF0aWMgaW5saW5lIGxvbmcKK19fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqX190bywgY29uc3QgY2hhciBfX3VzZXIgKl9fZnJvbSwgbG9uZyBfX2xlbikKK3sKKwlsb25nIHJlczsKKworCW1pZ2h0X3NsZWVwKCk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJtb3ZlXHQkNCwgJTFcblx0IgorCQkibW92ZVx0JDUsICUyXG5cdCIKKwkJIm1vdmVcdCQ2LCAlM1xuXHQiCisJCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV91c2VyX25vY2hlY2tfYXNtKQorCQkibW92ZVx0JTAsICQyIgorCQk6ICI9ciIgKHJlcykKKwkJOiAiciIgKF9fdG8pLCAiciIgKF9fZnJvbSksICJyIiAoX19sZW4pCisJCTogIiQyIiwgIiQzIiwgIiQ0IiwgIiQ1IiwgIiQ2IiwgX19VQV90MCwgIiQzMSIsICJtZW1vcnkiKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBzdHJuY3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKgorICogQ29waWVzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAobm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcKKyAqIE5VTCkuCisgKgorICogSWYgYWNjZXNzIHRvIHVzZXJzcGFjZSBmYWlscywgcmV0dXJucyAtRUZBVUxUIChzb21lIGRhdGEgbWF5IGhhdmUgYmVlbgorICogY29waWVkKS4KKyAqCisgKiBJZiBAY291bnQgaXMgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgY29waWVzIEBjb3VudCBieXRlcworICogYW5kIHJldHVybnMgQGNvdW50LgorICovCitzdGF0aWMgaW5saW5lIGxvbmcKK3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKl9fdG8sIGNvbnN0IGNoYXIgX191c2VyICpfX2Zyb20sIGxvbmcgX19sZW4pCit7CisJbG9uZyByZXM7CisKKwltaWdodF9zbGVlcCgpOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJIm1vdmVcdCQ1LCAlMlxuXHQiCisJCSJtb3ZlXHQkNiwgJTNcblx0IgorCQlfX01PRFVMRV9KQUwoX19zdHJuY3B5X2Zyb21fdXNlcl9hc20pCisJCSJtb3ZlXHQlMCwgJDIiCisJCTogIj1yIiAocmVzKQorCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKKwkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHJlczsKK30KKworLyogUmV0dXJuczogMCBpZiBiYWQsIHN0cmluZyBsZW5ndGgrMSAobWVtb3J5IHNpemUpIG9mIHN0cmluZyBpZiBvayAqLworc3RhdGljIGlubGluZSBsb25nIF9fc3RybGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMpCit7CisJbG9uZyByZXM7CisKKwltaWdodF9zbGVlcCgpOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkibW92ZVx0JDQsICUxXG5cdCIKKwkJX19NT0RVTEVfSkFMKF9fc3RybGVuX3VzZXJfbm9jaGVja19hc20pCisJCSJtb3ZlXHQlMCwgJDIiCisJCTogIj1yIiAocmVzKQorCQk6ICJyIiAocykKKwkJOiAiJDIiLCAiJDQiLCBfX1VBX3QwLCAiJDMxIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogc3RybGVuX3VzZXI6IC0gR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIGluIHVzZXIgc3BhY2UuCisgKiBAc3RyOiBUaGUgc3RyaW5nIHRvIG1lYXN1cmUuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBHZXQgdGhlIHNpemUgb2YgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gdXNlciBzcGFjZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgSU5DTFVESU5HIHRoZSB0ZXJtaW5hdGluZyBOVUwuCisgKiBPbiBleGNlcHRpb24sIHJldHVybnMgMC4KKyAqCisgKiBJZiB0aGVyZSBpcyBhIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgYSB2YWxpZCBzdHJpbmcsIHlvdSBtYXkgd2lzaCB0bworICogY29uc2lkZXIgdXNpbmcgc3Rybmxlbl91c2VyKCkgaW5zdGVhZC4KKyAqLworc3RhdGljIGlubGluZSBsb25nIHN0cmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzKQoreworCWxvbmcgcmVzOworCisJbWlnaHRfc2xlZXAoKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCV9fTU9EVUxFX0pBTChfX3N0cmxlbl91c2VyX2FzbSkKKwkJIm1vdmVcdCUwLCAkMiIKKwkJOiAiPXIiIChyZXMpCisJCTogInIiIChzKQorCQk6ICIkMiIsICIkNCIsIF9fVUFfdDAsICIkMzEiKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qIFJldHVybnM6IDAgaWYgYmFkLCBzdHJpbmcgbGVuZ3RoKzEgKG1lbW9yeSBzaXplKSBvZiBzdHJpbmcgaWYgb2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcywgbG9uZyBuKQoreworCWxvbmcgcmVzOworCisJbWlnaHRfc2xlZXAoKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQlfX01PRFVMRV9KQUwoX19zdHJubGVuX3VzZXJfbm9jaGVja19hc20pCisJCSJtb3ZlXHQlMCwgJDIiCisJCTogIj1yIiAocmVzKQorCQk6ICJyIiAocyksICJyIiAobikKKwkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogc3RybGVuX3VzZXI6IC0gR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIGluIHVzZXIgc3BhY2UuCisgKiBAc3RyOiBUaGUgc3RyaW5nIHRvIG1lYXN1cmUuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBHZXQgdGhlIHNpemUgb2YgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgaW4gdXNlciBzcGFjZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgSU5DTFVESU5HIHRoZSB0ZXJtaW5hdGluZyBOVUwuCisgKiBPbiBleGNlcHRpb24sIHJldHVybnMgMC4KKyAqCisgKiBJZiB0aGVyZSBpcyBhIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgYSB2YWxpZCBzdHJpbmcsIHlvdSBtYXkgd2lzaCB0bworICogY29uc2lkZXIgdXNpbmcgc3Rybmxlbl91c2VyKCkgaW5zdGVhZC4KKyAqLworc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcywgbG9uZyBuKQoreworCWxvbmcgcmVzOworCisJbWlnaHRfc2xlZXAoKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIm1vdmVcdCQ0LCAlMVxuXHQiCisJCSJtb3ZlXHQkNSwgJTJcblx0IgorCQlfX01PRFVMRV9KQUwoX19zdHJubGVuX3VzZXJfYXNtKQorCQkibW92ZVx0JTAsICQyIgorCQk6ICI9ciIgKHJlcykKKwkJOiAiciIgKHMpLCAiciIgKG4pCisJCTogIiQyIiwgIiQ0IiwgIiQ1IiwgX19VQV90MCwgIiQzMSIpOworCisJcmV0dXJuIHJlczsKK30KKworc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeQoreworCXVuc2lnbmVkIGxvbmcgaW5zbjsKKwl1bnNpZ25lZCBsb25nIG5leHRpbnNuOworfTsKKworZXh0ZXJuIGludCBmaXh1cF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZW5kaWYgLyogX0FTTV9VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdWNvbnRleHQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91Y29udGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3Vjb250ZXh0LmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS91Y29udGV4dC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VuYWxpZ25lZC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3VuYWxpZ25lZC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdW5pc3RkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS91bmlzdGQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy91c2VyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdXNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3VzZXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VzZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92Z2EuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS92Z2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy92Z2EuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZnYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3ZwZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZwZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZwZS5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vdnBlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2NhcGNlbGxhLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L2NhcGNlbGxhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L2NhcGNlbGxhLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS92cjQxeHgvY2FwY2VsbGEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvZ2l1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L2dpdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9naXUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC9naXUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9pcnEuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC9pcnEuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvbXBjMzB4LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L21wYzMweC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9tcGMzMHguaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC9tcGMzMHguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvcGNpLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9wY2kuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC9wY2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvc2l1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3NpdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC9zaXUuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC9zaXUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjE5LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3RiMDIxOS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyMTkuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC90YjAyMTkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjI2LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3RiMDIyNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyMjYuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC90YjAyMjYuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdGIwMjg3LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3RiMDI4Ny5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC90YjAyODcuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC90YjAyODcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdnI0MXh4L3ZyNDF4eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3ZyNDF4eC92cjQxeHguaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3ZyNDF4eC92cjQxeHguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy93YXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS93YXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tbWlwcy93YXIuaApyZW5hbWUgdG8gYXJjaC9taXBzL2luY2x1ZGUvYXNtL3dhci5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vd2F0Y2guaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS93YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vd2F0Y2guaApAQCAtMCwwICsxLDMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIERhbmV5CisgKi8KKyNpZm5kZWYgX0FTTV9XQVRDSF9ICisjZGVmaW5lIF9BU01fV0FUQ0hfSAorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKwordm9pZCBtaXBzX2luc3RhbGxfd2F0Y2hfcmVnaXN0ZXJzKHZvaWQpOwordm9pZCBtaXBzX3JlYWRfd2F0Y2hfcmVnaXN0ZXJzKHZvaWQpOwordm9pZCBtaXBzX2NsZWFyX3dhdGNoX3JlZ2lzdGVycyh2b2lkKTsKK3ZvaWQgbWlwc19wcm9iZV93YXRjaF9yZWdpc3RlcnMoc3RydWN0IGNwdWluZm9fbWlwcyAqYyk7CisKKyNpZmRlZiBDT05GSUdfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKyNkZWZpbmUgX19yZXN0b3JlX3dhdGNoKCkgZG8gewkJCQkJCVwKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoVElGX0xPQURfV0FUQ0gsCQkJCVwKKwkJCSAgICAgICZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKSkpIHsJXAorCQltaXBzX2luc3RhbGxfd2F0Y2hfcmVnaXN0ZXJzKCk7CQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZWxzZQorI2RlZmluZSBfX3Jlc3RvcmVfd2F0Y2goKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9XQVRDSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3diZmx1c2guaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS93YmZsdXNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvd2JmbHVzaC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20vd2JmbHVzaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3hvci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3hvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3hvci5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20veG9yLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMveHRhbGsveHRhbGsuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS94dGFsay94dGFsay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL3h0YWxrL3h0YWxrLmgKcmVuYW1lIHRvIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS94dGFsay94dGFsay5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3h0YWxrL3h3aWRnZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS94dGFsay94d2lkZ2V0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMveHRhbGsveHdpZGdldC5oCnJlbmFtZSB0byBhcmNoL21pcHMvaW5jbHVkZS9hc20veHRhbGsveHdpZGdldC5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQppbmRleCA3MDZmOTM5Li5kOWRhNzExIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsMTAgKzYsMTEgQEAKIAogb2JqLXkJCSs9IGNwdS1wcm9iZS5vIGJyYW5jaC5vIGVudHJ5Lm8gZ2VuZXgubyBpcnEubyBwcm9jZXNzLm8gXAogCQkgICBwdHJhY2UubyByZXNldC5vIHNldHVwLm8gc2lnbmFsLm8gc3lzY2FsbC5vIFwKLQkJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubyB1bmFsaWduZWQubworCQkgICB0aW1lLm8gdG9wb2xvZ3kubyB0cmFwcy5vIHVuYWxpZ25lZC5vIHdhdGNoLm8KIAogb2JqLSQoQ09ORklHX0NFVlRfQkNNMTQ4MCkJKz0gY2V2dC1iY20xNDgwLm8KIG9iai0kKENPTkZJR19DRVZUX1I0SykJCSs9IGNldnQtcjRrLm8KK29iai0kKENPTkZJR19NSVBTX01UX1NNVEMpCSs9IGNldnQtc210Yy5vCiBvYmotJChDT05GSUdfQ0VWVF9EUzEyODcpCSs9IGNldnQtZHMxMjg3Lm8KIG9iai0kKENPTkZJR19DRVZUX0dUNjQxWFgpCSs9IGNldnQtZ3Q2NDF4eC5vCiBvYmotJChDT05GSUdfQ0VWVF9TQjEyNTApCSs9IGNldnQtc2IxMjUwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYwppbmRleCAyNGEyZDkwLi40YTRjNTlmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NldnQtcjRrLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXI0ay5jCkBAIC0xMiw2ICsxMiwxNCBAQAogCiAjaW5jbHVkZSA8YXNtL3NtdGNfaXBpLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vY2V2dC1yNGsuaD4KKworLyoKKyAqIFRoZSBTTVRDIEtlcm5lbCBmb3IgdGhlIDM0SywgMTAwNEssIGV0LiBhbC4gcmVwbGFjZXMgc2V2ZXJhbAorICogb2YgdGhlc2Ugcm91dGluZXMgd2l0aCBTTVRDLXNwZWNpZmljIHZhcmlhbnRzLgorICovCisKKyNpZm5kZWYgQ09ORklHX01JUFNfTVRfU01UQwogCiBzdGF0aWMgaW50IG1pcHNfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQpAQCAtMTksNjAgKzI3LDI3IEBACiAJdW5zaWduZWQgaW50IGNudDsKIAlpbnQgcmVzOwogCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCB2cGZsYWdzOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2cGZsYWdzID0gZHZwZSgpOwotI2VuZGlmCiAJY250ID0gcmVhZF9jMF9jb3VudCgpOwogCWNudCArPSBkZWx0YTsKIAl3cml0ZV9jMF9jb21wYXJlKGNudCk7CiAJcmVzID0gKChpbnQpKHJlYWRfYzBfY291bnQoKSAtIGNudCkgPiAwKSA/IC1FVElNRSA6IDA7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCWV2cGUodnBmbGFncyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KLSNlbmRpZgogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyB2b2lkIG1pcHNfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisKK3ZvaWQgbWlwc19zZXRfY2xvY2tfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7CiAJLyogTm90aGluZyB0byBkbyAuLi4gICovCiB9CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBtaXBzX2Nsb2NrZXZlbnRfZGV2aWNlKTsKLXN0YXRpYyBpbnQgY3AwX3RpbWVyX2lycV9pbnN0YWxsZWQ7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBtaXBzX2Nsb2NrZXZlbnRfZGV2aWNlKTsKK2ludCBjcDBfdGltZXJfaXJxX2luc3RhbGxlZDsKIAotLyoKLSAqIFRpbWVyIGFjayBmb3IgYW4gUjRrLWNvbXBhdGlibGUgdGltZXIgb2YgYSBrbm93biBmcmVxdWVuY3kuCi0gKi8KLXN0YXRpYyB2b2lkIGMwX3RpbWVyX2Fjayh2b2lkKQotewotCXdyaXRlX2MwX2NvbXBhcmUocmVhZF9jMF9jb21wYXJlKCkpOwotfQorI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAKLS8qCi0gKiBQb3NzaWJseSBoYW5kbGUgYSBwZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdC4KLSAqIFJldHVybiB0cnVlIGlmIHRoZSB0aW1lciBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBiZSBjaGVja2VkCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9wZXJmX2lycShpbnQgcjIpCi17Ci0JLyoKLQkgKiBUaGUgcGVyZm9ybWFuY2UgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZQotCSAqIHRpbWVyIGludGVycnVwdCAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKS4gSWYgaXQgaXMgYW5kIGEKLQkgKiBwZXJmb3JtYW5jZSBjb3VudGVyIGhhcyBvdmVyZmxvd2VkIChwZXJmX2lycSgpID09IElSUV9IQU5ETEVEKQotCSAqIGFuZCB3ZSBjYW4ndCByZWxpYWJseSBkZXRlcm1pbmUgaWYgYSBjb3VudGVyIGludGVycnVwdCBoYXMgYWxzbwotCSAqIGhhcHBlbmVkICghcjIpIHRoZW4gZG9uJ3QgY2hlY2sgZm9yIGEgdGltZXIgaW50ZXJydXB0LgotCSAqLwotCXJldHVybiAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKSAmJgotCQlwZXJmX2lycSgpID09IElSUV9IQU5ETEVEICYmCi0JCSFyMjsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGMwX2NvbXBhcmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK2lycXJldHVybl90IGMwX2NvbXBhcmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAljb25zdCBpbnQgcjIgPSBjcHVfaGFzX21pcHNfcjI7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2Q7CkBAIC05MywxMiArNjgsOCBAQAogCSAqIGludGVycnVwdC4gIEJlaW5nIHRoZSBwYXJhbm9pYWNzIHdlIGFyZSB3ZSBjaGVjayBhbnl3YXkuCiAJICovCiAJaWYgKCFyMiB8fCAocmVhZF9jMF9jYXVzZSgpICYgKDEgPDwgMzApKSkgewotCQljMF90aW1lcl9hY2soKTsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCWlmIChjcHVfZGF0YVtjcHVdLnZwZV9pZCkKLQkJCWdvdG8gb3V0OwotCQljcHUgPSAwOwotI2VuZGlmCisJCS8qIENsZWFyIENvdW50L0NvbXBhcmUgSW50ZXJydXB0ICovCisJCXdyaXRlX2MwX2NvbXBhcmUocmVhZF9jMF9jb21wYXJlKCkpOwogCQljZCA9ICZwZXJfY3B1KG1pcHNfY2xvY2tldmVudF9kZXZpY2UsIGNwdSk7CiAJCWNkLT5ldmVudF9oYW5kbGVyKGNkKTsKIAl9CkBAIC0xMDcsNjUgKzc4LDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjMF9jb21wYXJlX2lycWFjdGlvbiA9IHsKKyNlbmRpZiAvKiBOb3QgQ09ORklHX01JUFNfTVRfU01UQyAqLworCitzdHJ1Y3QgaXJxYWN0aW9uIGMwX2NvbXBhcmVfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0gYzBfY29tcGFyZV9pbnRlcnJ1cHQsCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCS5mbGFncyA9IElSUUZfRElTQUJMRUQsCi0jZWxzZQogCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwKLSNlbmRpZgogCS5uYW1lID0gInRpbWVyIiwKIH07CiAKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBzbXRjX2R1bW15X2Nsb2NrZXZlbnRfZGV2aWNlKTsKIAotc3RhdGljIHZvaWQgc210Y19zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotfQotCi1zdGF0aWMgdm9pZCBtaXBzX2Jyb2FkY2FzdChjcHVtYXNrX3QgbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgY3B1OwotCi0JZm9yX2VhY2hfY3B1X21hc2soY3B1LCBtYXNrKQotCQlzbXRjX3NlbmRfaXBpKGNwdSwgU01UQ19DTE9DS19USUNLLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfc210Y19kdW1teV9jbG9ja2V2ZW50X2RldmljZSh2b2lkKQotewotCS8vdWludDY0X3QgbWlwc19mcmVxID0gbWlwc19ocHRfXmZyZXF1ZW5jeTsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkOwotCi0JY2QgPSAmcGVyX2NwdShzbXRjX2R1bW15X2Nsb2NrZXZlbnRfZGV2aWNlLCBjcHUpOwotCi0JY2QtPm5hbWUJCT0gIlNNVEMiOwotCWNkLT5mZWF0dXJlcwkJPSBDTE9DS19FVlRfRkVBVF9EVU1NWTsKLQotCS8qIENhbGN1bGF0ZSB0aGUgbWluIC8gbWF4IGRlbHRhICovCi0JY2QtPm11bHQJPSAwOyAvL2Rpdl9zYygodW5zaWduZWQgbG9uZykgbWlwc19mcmVxLCBOU0VDX1BFUl9TRUMsIDMyKTsKLQljZC0+c2hpZnQJCT0gMDsgLy8zMjsKLQljZC0+bWF4X2RlbHRhX25zCT0gMDsgLy9jbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZmZmZmYsIGNkKTsKLQljZC0+bWluX2RlbHRhX25zCT0gMDsgLy9jbG9ja2V2ZW50X2RlbHRhMm5zKDB4MzAsIGNkKTsKLQotCWNkLT5yYXRpbmcJCT0gMjAwOwotCWNkLT5pcnEJCQk9IDE3OyAvLy0xOwotLy8JaWYgKGNwdSkKLS8vCQljZC0+Y3B1bWFzawk9IENQVV9NQVNLX0FMTDsgLy8gY3B1bWFza19vZl9jcHUoY3B1KTsKLS8vCWVsc2UKLQkJY2QtPmNwdW1hc2sJPSBjcHVtYXNrX29mX2NwdShjcHUpOwotCi0JY2QtPnNldF9tb2RlCQk9IHNtdGNfc2V0X21vZGU7Ci0KLQljZC0+YnJvYWRjYXN0CQk9IG1pcHNfYnJvYWRjYXN0OwotCi0JY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNkKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBtaXBzX2V2ZW50X2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQordm9pZCBtaXBzX2V2ZW50X2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQogewogfQogCkBAIC0xNzcsNyArOTksMjMgQEAKIAlyZXR1cm4gKHJlYWRfYzBfY2F1c2UoKSA+PiBjcDBfY29tcGFyZV9pcnEpICYgMHgxMDA7CiB9CiAKLXN0YXRpYyBpbnQgYzBfY29tcGFyZV9pbnRfdXNhYmxlKHZvaWQpCisvKgorICogQ29tcGFyZSBpbnRlcnJ1cHQgY2FuIGJlIHJvdXRlZCBhbmQgbGF0Y2hlZCBvdXRzaWRlIHRoZSBjb3JlLAorICogc28gYSBzaW5nbGUgZXhlY3V0aW9uIGhhemFyZCBiYXJyaWVyIG1heSBub3QgYmUgZW5vdWdoIHRvIGdpdmUKKyAqIGl0IHRpbWUgdG8gY2xlYXIgYXMgc2VlbiBpbiB0aGUgQ2F1c2UgcmVnaXN0ZXIuICA0IHRpbWUgdGhlCisgKiBwaXBlbGluZSBkZXB0aCBzZWVtcyByZWFzb25hYmx5IGNvbnNlcnZhdGl2ZSwgYW5kIGVtcGlyaWNhbGx5CisgKiB3b3JrcyBiZXR0ZXIgaW4gY29uZmlndXJhdGlvbnMgd2l0aCBoaWdoIENQVS9idXMgY2xvY2sgcmF0aW9zLgorICovCisKKyNkZWZpbmUgY29tcGFyZV9jaGFuZ2VfaGF6YXJkKCkgXAorCWRvIHsgXAorCQlpcnFfZGlzYWJsZV9oYXphcmQoKTsgXAorCQlpcnFfZGlzYWJsZV9oYXphcmQoKTsgXAorCQlpcnFfZGlzYWJsZV9oYXphcmQoKTsgXAorCQlpcnFfZGlzYWJsZV9oYXphcmQoKTsgXAorCX0gd2hpbGUgKDApCisKK2ludCBjMF9jb21wYXJlX2ludF91c2FibGUodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZGVsdGE7CiAJdW5zaWduZWQgaW50IGNudDsKQEAgLTE4Nyw3ICsxMjUsNyBAQAogCSAqLwogCWlmIChjMF9jb21wYXJlX2ludF9wZW5kaW5nKCkpIHsKIAkJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkpOwotCQlpcnFfZGlzYWJsZV9oYXphcmQoKTsKKwkJY29tcGFyZV9jaGFuZ2VfaGF6YXJkKCk7CiAJCWlmIChjMF9jb21wYXJlX2ludF9wZW5kaW5nKCkpCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0xOTYsNyArMTM0LDcgQEAKIAkJY250ID0gcmVhZF9jMF9jb3VudCgpOwogCQljbnQgKz0gZGVsdGE7CiAJCXdyaXRlX2MwX2NvbXBhcmUoY250KTsKLQkJaXJxX2Rpc2FibGVfaGF6YXJkKCk7CisJCWNvbXBhcmVfY2hhbmdlX2hhemFyZCgpOwogCQlpZiAoKGludCkocmVhZF9jMF9jb3VudCgpIC0gY250KSA8IDApCiAJCSAgICBicmVhazsKIAkJLyogaW5jcmVhc2UgZGVsdGEgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGV4cGlyZWQgKi8KQEAgLTIwNSwxMSArMTQzLDEyIEBACiAJd2hpbGUgKChpbnQpKHJlYWRfYzBfY291bnQoKSAtIGNudCkgPD0gMCkKIAkJOwkvKiBXYWl0IGZvciBleHBpcnkgICovCiAKKwljb21wYXJlX2NoYW5nZV9oYXphcmQoKTsKIAlpZiAoIWMwX2NvbXBhcmVfaW50X3BlbmRpbmcoKSkKIAkJcmV0dXJuIDA7CiAKIAl3cml0ZV9jMF9jb21wYXJlKHJlYWRfYzBfY291bnQoKSk7Ci0JaXJxX2Rpc2FibGVfaGF6YXJkKCk7CisJY29tcGFyZV9jaGFuZ2VfaGF6YXJkKCk7CiAJaWYgKGMwX2NvbXBhcmVfaW50X3BlbmRpbmcoKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTIxOSw2ICsxNTgsOCBAQAogCXJldHVybiAxOwogfQogCisjaWZuZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwogaW50IF9fY3B1aW5pdCBtaXBzX2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQogewogCXVpbnQ2NF90IG1pcHNfZnJlcSA9IG1pcHNfaHB0X2ZyZXF1ZW5jeTsKQEAgLTIyOSwxNyArMTcwLDYgQEAKIAlpZiAoIWNwdV9oYXNfY291bnRlciB8fCAhbWlwc19ocHRfZnJlcXVlbmN5KQogCQlyZXR1cm4gLUVOWElPOwogCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCXNldHVwX3NtdGNfZHVtbXlfY2xvY2tldmVudF9kZXZpY2UoKTsKLQotCS8qCi0JICogT24gU01UQyB3ZSBvbmx5IHJlZ2lzdGVyIFZQRTAncyBjb21wYXJlIGludGVycnVwdCBhcyBjbG9ja2V2ZW50Ci0JICogZGV2aWNlLgotCSAqLwotCWlmIChjcHUpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KIAlpZiAoIWMwX2NvbXBhcmVfaW50X3VzYWJsZSgpKQogCQlyZXR1cm4gLUVOWElPOwogCkBAIC0yNjUsMTMgKzE5NSw5IEBACiAKIAljZC0+cmF0aW5nCQk9IDMwMDsKIAljZC0+aXJxCQkJPSBpcnE7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCWNkLT5jcHVtYXNrCQk9IENQVV9NQVNLX0FMTDsKLSNlbHNlCiAJY2QtPmNwdW1hc2sJCT0gY3B1bWFza19vZl9jcHUoY3B1KTsKLSNlbmRpZgogCWNkLT5zZXRfbmV4dF9ldmVudAk9IG1pcHNfbmV4dF9ldmVudDsKLQljZC0+c2V0X21vZGUJCT0gbWlwc19zZXRfbW9kZTsKKwljZC0+c2V0X21vZGUJCT0gbWlwc19zZXRfY2xvY2tfbW9kZTsKIAljZC0+ZXZlbnRfaGFuZGxlcgk9IG1pcHNfZXZlbnRfaGFuZGxlcjsKIAogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjZCk7CkBAIC0yODEsMTIgKzIwNyw5IEBACiAKIAljcDBfdGltZXJfaXJxX2luc3RhbGxlZCA9IDE7CiAKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0jZGVmaW5lIENQVUNUUl9JTUFTS0JJVCAoMHgxMDAgPDwgY3AwX2NvbXBhcmVfaXJxKQotCXNldHVwX2lycV9zbXRjKGlycSwgJmMwX2NvbXBhcmVfaXJxYWN0aW9uLCBDUFVDVFJfSU1BU0tCSVQpOwotI2Vsc2UKIAlzZXR1cF9pcnEoaXJxLCAmYzBfY29tcGFyZV9pcnFhY3Rpb24pOwotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIE5vdCBDT05GSUdfTUlQU19NVF9TTVRDICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NldnQtc210Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXNtdGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYyZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXNtdGMuYwpAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBLZXZpbiBELiBLaXNzZWxsLCBQYXJhbG9nb3Mgc2FybAorICovCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCisjaW5jbHVkZSA8YXNtL3NtdGNfaXBpLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vY2V2dC1yNGsuaD4KKworLyoKKyAqIFZhcmlhbnQgY2xvY2sgZXZlbnQgdGltZXIgc3VwcG9ydCBmb3IgU01UQyBvbiBNSVBTIDM0SywgMTAwNEsKKyAqIG9yIG90aGVyIE1JUFMgTVQgY29yZXMuCisgKgorICogTm90ZXMgb24gU01UQyBTdXBwb3J0OgorICoKKyAqIFNNVEMgaGFzIG11bHRpcGxlIG1pY3JvdGhyZWFkIFRDcyBwcmV0ZW5kaW5nIHRvIGJlIExpbnV4IENQVXMuCisgKiBCdXQgdGhlcmUncyBvbmx5IG9uZSBDb3VudC9Db21wYXJlIHBhaXIgcGVyIFZQRSwgYW5kIENvbXBhcmUKKyAqIGludGVycnVwdHMgYXJlIHRha2VuIG9wcG9ydHVuaXNpdGljYWxseSBieSBhdmFpbGFibGUgVENzCisgKiBib3VuZCB0byB0aGUgVlBFIHdpdGggdGhlIENvdW50IHJlZ2lzdGVyLiAgVGhlIG5ldyB0aW1lcgorICogZnJhbWV3b3JrIHByb3ZpZGVzIGZvciBnbG9iYWwgYnJvYWRjYXN0cywgYnV0IHdlIHJlYWxseQorICogd2FudCBWUEUtbGV2ZWwgbXVsdGljYXN0cyBmb3IgYmVzdCBiZWhhdmlvci4gU28gaW5zdGVhZAorICogb2YgaW52b2tpbmcgdGhlIGhpZ2gtbGV2ZWwgY2xvY2stZXZlbnQgYnJvYWRjYXN0IGNvZGUsCisgKiB0aGlzIHZlcnNpb24gb2YgU01UQyBzdXBwb3J0IHVzZXMgdGhlIGhpc3RvcmljYWwgU01UQworICogbXVsdGljYXN0IG1lY2hhbmlzbXMgInVuZGVyIHRoZSBob29kIiwgYXBwZWFyaW5nIHRvIHRoZQorICogZ2VuZXJpYyBjbG9jayBsYXllciBhcyBpZiB0aGUgaW50ZXJydXB0cyBhcmUgcGVyLUNQVS4KKyAqCisgKiBUaGUgYXBwcm9hY2ggdGFrZW4gaGVyZSBpcyB0byBtYWludGFpbiBhIHNldCBvZiBOUl9DUFVTCisgKiB2aXJ0dWFsIHRpbWVycywgYW5kIHRyYWNrIHdoaWNoICJDUFUiIG5lZWRzIHRvIGJlIGFsZXJ0ZWQKKyAqIGF0IGVhY2ggZXZlbnQuCisgKgorICogSXQncyB1bmxpa2VseSB0aGF0IHdlJ2xsIHNlZSBhIE1JUFMgTVQgY29yZSB3aXRoIG1vcmUgdGhhbgorICogMiBWUEVzLCBidXQgd2UgKmtub3cqIHRoYXQgd2Ugd29uJ3QgbmVlZCB0byBoYW5kbGUgbW9yZQorICogVlBFcyB0aGFuIHdlIGhhdmUgIkNQVXMiLiAgU28gTkNQVXMgYXJyYXlzIG9mIE5DUFVzIGVsZW1lbnRzCisgKiBpcyBhbHdheXMgZ29pbmcgdG8gYmUgb3ZlcmtpbGwsIGJ1dCBhbHdheXMgZ29pbmcgdG8gYmUgZW5vdWdoLgorICovCisKK3Vuc2lnbmVkIGxvbmcgc210Y19uZXh0dGltZVtOUl9DUFVTXVtOUl9DUFVTXTsKK3N0YXRpYyBpbnQgc210Y19uZXh0aW52cGVbTlJfQ1BVU107CisKKy8qCisgKiBUaW1lc3RhbXBzIHN0b3JlZCBhcmUgYWJzb2x1dGUgdmFsdWVzIHRvIGJlIHByb2dyYW1tZWQKKyAqIGludG8gQ291bnQgcmVnaXN0ZXIuICBWYWxpZCB0aW1lc3RhbXBzIHdpbGwgbmV2ZXIgYmUgemVyby4KKyAqIElmIGEgWmVybyBDb3VudCB2YWx1ZSBpcyBhY3R1YWxseSBjYWxjdWxhdGVkLCBpdCBpcyBjb252ZXJ0ZWQKKyAqIHRvIGJlIGEgMSwgd2hpY2ggd2lsbCBpbnRyb2R1Y2UgMSBvciB0d28gQ1BVIGN5Y2xlcyBvZiBlcnJvcgorICogcm91Z2hseSBvbmNlIGV2ZXJ5IGZvdXIgYmlsbGlvbiBldmVudHMsIHdoaWNoIGF0IDEwMDAgSFogbWVhbnMKKyAqIGFib3V0IG9uY2UgZXZlcnkgNTAgZGF5cy4gIElmIHRoYXQncyBhY3R1YWxseSBhIHByb2JsZW0sIG9uZQorICogY291bGQgYWx0ZXJuYXRlIHNxdWFzaGluZyAwIHRvIDEgYW5kIHRvIC0xLgorICovCisKKyNkZWZpbmUgTUFLRVZBTElEKHgpICgoKHgpID09IDBMKSA/IDFMIDogKHgpKQorI2RlZmluZSBJU1ZBTElEKHgpICgoeCkgIT0gMEwpCisKKy8qCisgKiBUaW1lIGNvbXBhcmlzb24gaXMgc3VidGxlLCBhcyBpdCdzIHJlYWxseSB0cnVuY2F0ZWQKKyAqIG1vZHVsYXIgYXJpdGhtZXRpYy4KKyAqLworCisjZGVmaW5lIElTX1NPT05FUihhLCBiLCByZWZlcmVuY2UpIFwKKyAgICAoKChhKSAtICh1bnNpZ25lZCBsb25nKShyZWZlcmVuY2UpKSA8ICgoYikgLSAodW5zaWduZWQgbG9uZykocmVmZXJlbmNlKSkpCisKKy8qCisgKiBDQVRDSFVQX0lOQ1JFTUVOVCwgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBmYWxscyBiZWhpbmQgdGhlIGNvdW50ZXIuCisgKiBDb3VsZCBiZSBhbiBpbmNyZWFzaW5nIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBjb25zdGFudDsKKyAqLworCisjZGVmaW5lIENBVENIVVBfSU5DUkVNRU5UIDY0CisKK3N0YXRpYyBpbnQgbWlwc19uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG10ZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAsIHJlZmVyZW5jZSwgcHJldmlvdXM7CisJdW5zaWduZWQgbG9uZyBuZXh0Y29tcCA9IDBMOworCWludCB2cGUgPSBjdXJyZW50X2NwdV9kYXRhLnZwZV9pZDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltdGZsYWdzID0gZG10KCk7CisKKwkvKgorCSAqIE1haW50YWluIHRoZSBwZXItVEMgdmlydHVhbCB0aW1lcgorCSAqIGFuZCBwcm9ncmFtIHRoZSBwZXItVlBFIHNoYXJlZCBDb3VudCByZWdpc3RlcgorCSAqIGFzIGFwcHJvcHJpYXRlIGhlcmUuLi4KKwkgKi8KKwlyZWZlcmVuY2UgPSAodW5zaWduZWQgbG9uZylyZWFkX2MwX2NvdW50KCk7CisJdGltZXN0YW1wID0gTUFLRVZBTElEKHJlZmVyZW5jZSArIGRlbHRhKTsKKwkvKgorCSAqIFRvIHJlYWxseSBtb2RlbCB0aGUgY2xvY2ssIHdlIGhhdmUgdG8gY2F0Y2ggdGhlIGNhc2UKKwkgKiB3aGVyZSB0aGUgY3VycmVudCBuZXh0LWluLVZQRSB0aW1lc3RhbXAgaXMgdGhlIG9sZAorCSAqIHRpbWVzdGFtcCBmb3IgdGhlIGNhbGxpbmcgQ1BFLCBidXQgdGhlIG5ldyB2YWx1ZSBpcworCSAqIGluIGZhY3QgbGF0ZXIuICBJbiB0aGF0IGNhc2UsIHdlIGhhdmUgdG8gZG8gYSBmdWxsCisJICogc2NhbiBhbmQgZGlzY292ZXIgdGhlIG5ldyBuZXh0LWluLVZQRSBDUFUgaWQgYW5kCisJICogdGltZXN0YW1wLgorCSAqLworCXByZXZpb3VzID0gc210Y19uZXh0dGltZVt2cGVdW2NwdV07CisJaWYgKGNwdSA9PSBzbXRjX25leHRpbnZwZVt2cGVdICYmIElTVkFMSUQocHJldmlvdXMpCisJICAgICYmIElTX1NPT05FUihwcmV2aW91cywgdGltZXN0YW1wLCByZWZlcmVuY2UpKSB7CisJCWludCBpOworCQlpbnQgc29vbmVzdCA9IGNwdTsKKworCQkvKgorCQkgKiBVcGRhdGUgdGltZXN0YW1wIGFycmF5IGhlcmUsIHNvIHRoYXQgbmV3CisJCSAqIHZhbHVlIGdldHMgY29uc2lkZXJlZCBhbG9uZyB3aXRoIHRob3NlIG9mCisJCSAqIG90aGVyIHZpcnR1YWwgQ1BVcyBvbiB0aGUgVlBFLgorCQkgKi8KKwkJc210Y19uZXh0dGltZVt2cGVdW2NwdV0gPSB0aW1lc3RhbXA7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQkJaWYgKElTVkFMSUQoc210Y19uZXh0dGltZVt2cGVdW2ldKQorCQkJICAgICYmIElTX1NPT05FUihzbXRjX25leHR0aW1lW3ZwZV1baV0sCisJCQkJc210Y19uZXh0dGltZVt2cGVdW3Nvb25lc3RdLCByZWZlcmVuY2UpKSB7CisJCQkJICAgIHNvb25lc3QgPSBpOworCQkJfQorCQl9CisJCXNtdGNfbmV4dGludnBlW3ZwZV0gPSBzb29uZXN0OworCQluZXh0Y29tcCA9IHNtdGNfbmV4dHRpbWVbdnBlXVtzb29uZXN0XTsKKwkvKgorCSAqIE90aGVyd2lzZSwgd2UgZG9uJ3QgaGF2ZSB0byBwcm9jZXNzIHRoZSB3aG9sZSBhcnJheSByYW5rLAorCSAqIHdlIGp1c3QgaGF2ZSB0byBzZWUgaWYgdGhlIGV2ZW50IGhvcml6b24gaGFzIGdvdHRlbiBjbG9zZXIuCisJICovCisJfSBlbHNlIHsKKwkJaWYgKCFJU1ZBTElEKHNtdGNfbmV4dHRpbWVbdnBlXVtzbXRjX25leHRpbnZwZVt2cGVdXSkgfHwKKwkJICAgIElTX1NPT05FUih0aW1lc3RhbXAsCisJCQlzbXRjX25leHR0aW1lW3ZwZV1bc210Y19uZXh0aW52cGVbdnBlXV0sIHJlZmVyZW5jZSkpIHsKKwkJCSAgICBzbXRjX25leHRpbnZwZVt2cGVdID0gY3B1OworCQkJICAgIG5leHRjb21wID0gdGltZXN0YW1wOworCQl9CisJCS8qCisJCSAqIFNpbmNlIG5leHQtaW4tVlBFIG1heSBtZSB0aGUgc2FtZSBhcyB0aGUgZXhlY3V0aW5nCisJCSAqIHZpcnR1YWwgQ1BVLCB3ZSB1cGRhdGUgdGhlIGFycmF5ICphZnRlciogY2hlY2tpbmcKKwkJICogaXRzIHZhbHVlLgorCQkgKi8KKwkJc210Y19uZXh0dGltZVt2cGVdW2NwdV0gPSB0aW1lc3RhbXA7CisJfQorCisJLyoKKwkgKiBJdCBtYXkgYmUgdGhhdCwgaW4gZmFjdCwgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgQ29tcGFyZSwKKwkgKiBidXQgaWYgd2UgZG8sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRpZG4ndCBmYWxsIGludG8KKwkgKiBhIGNyYWNrIGp1c3QgYmVoaW5kIENvdW50LgorCSAqLworCWlmIChJU1ZBTElEKG5leHRjb21wKSkgeworCQl3cml0ZV9jMF9jb21wYXJlKG5leHRjb21wKTsKKwkJZWhiKCk7CisJCS8qCisJCSAqIFdlIG5ldmVyIHJldHVybiBhbiBlcnJvciwgd2UganVzdCBtYWtlIHN1cmUKKwkJICogdGhhdCB3ZSB0cmlnZ2VyIHRoZSBoYW5kbGVycyBhcyBxdWlja2x5IGFzCisJCSAqIHdlIGNhbiBpZiB3ZSBmZWxsIGJlaGluZC4KKwkJICovCisJCXdoaWxlICgobmV4dGNvbXAgLSAodW5zaWduZWQgbG9uZylyZWFkX2MwX2NvdW50KCkpCisJCQk+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7CisJCQluZXh0Y29tcCArPSBDQVRDSFVQX0lOQ1JFTUVOVDsKKwkJCXdyaXRlX2MwX2NvbXBhcmUobmV4dGNvbXApOworCQkJZWhiKCk7CisJCX0KKwl9CisJZW10KG10ZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHNtdGNfZGlzdHJpYnV0ZV90aW1lcihpbnQgdnBlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG10ZmxhZ3M7CisJaW50IGNwdTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZDsKKwl1bnNpZ25lZCBsb25nIG5leHRzdGFtcCA9IDBMOworCXVuc2lnbmVkIGxvbmcgcmVmZXJlbmNlOworCisKK3JlcGVhdDoKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCSAgICAvKgorCSAgICAgKiBGaW5kIHZpcnR1YWwgQ1BVcyB3aXRoaW4gdGhlIGN1cnJlbnQgVlBFIHdobyBoYXZlCisJICAgICAqIHVuc2VydmljZWQgdGltZXIgcmVxdWVzdHMgd2hvc2UgdGltZSBpcyBub3cgcGFzdC4KKwkgICAgICovCisJICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkgICAgbXRmbGFncyA9IGRtdCgpOworCSAgICBpZiAoY3B1X2RhdGFbY3B1XS52cGVfaWQgPT0gdnBlICYmCisJCUlTVkFMSUQoc210Y19uZXh0dGltZVt2cGVdW2NwdV0pKSB7CisJCXJlZmVyZW5jZSA9ICh1bnNpZ25lZCBsb25nKXJlYWRfYzBfY291bnQoKTsKKwkJaWYgKChzbXRjX25leHR0aW1lW3ZwZV1bY3B1XSAtIHJlZmVyZW5jZSkKKwkJCSA+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7CisJCQkgICAgc210Y19uZXh0dGltZVt2cGVdW2NwdV0gPSAwTDsKKwkJCSAgICBlbXQobXRmbGFncyk7CisJCQkgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJICAgIC8qCisJCQkgICAgICogV2UgZG9uJ3Qgc2VuZCBJUElzIHRvIG91cnNlbGYuCisJCQkgICAgICovCisJCQkgICAgaWYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJCQlzbXRjX3NlbmRfaXBpKGNwdSwgU01UQ19DTE9DS19USUNLLCAwKTsKKwkJCSAgICB9IGVsc2UgeworCQkJCWNkID0gJnBlcl9jcHUobWlwc19jbG9ja2V2ZW50X2RldmljZSwgY3B1KTsKKwkJCQljZC0+ZXZlbnRfaGFuZGxlcihjZCk7CisJCQkgICAgfQorCQl9IGVsc2UgeworCQkJLyogTG9jYWwgdG8gVlBFIGJ1dCBWYWxpZCBUaW1lIG5vdCB5ZXQgcmVhY2hlZC4gKi8KKwkJCWlmICghSVNWQUxJRChuZXh0c3RhbXApIHx8CisJCQkgICAgSVNfU09PTkVSKHNtdGNfbmV4dHRpbWVbdnBlXVtjcHVdLCBuZXh0c3RhbXAsCisJCQkgICAgcmVmZXJlbmNlKSkgeworCQkJCXNtdGNfbmV4dGludnBlW3ZwZV0gPSBjcHU7CisJCQkJbmV4dHN0YW1wID0gc210Y19uZXh0dGltZVt2cGVdW2NwdV07CisJCQl9CisJCQllbXQobXRmbGFncyk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJZW10KG10ZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkgICAgfQorCX0KKwkvKiBSZXByb2dyYW0gZm9yIGludGVycnVwdCBhdCBuZXh0IHNvb25lc3QgdGltZXN0YW1wIGZvciBWUEUgKi8KKwlpZiAoSVNWQUxJRChuZXh0c3RhbXApKSB7CisJCXdyaXRlX2MwX2NvbXBhcmUobmV4dHN0YW1wKTsKKwkJZWhiKCk7CisJCWlmICgobmV4dHN0YW1wIC0gKHVuc2lnbmVkIGxvbmcpcmVhZF9jMF9jb3VudCgpKQorCQkJPiAodW5zaWduZWQgbG9uZylMT05HX01BWCkKKwkJCQlnb3RvIHJlcGVhdDsKKwl9Cit9CisKKworaXJxcmV0dXJuX3QgYzBfY29tcGFyZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBJZiB3ZSdyZSBydW5uaW5nIFNNVEMsIHdlJ3ZlIGdvdCBNSVBTIE1UIGFuZCB0aGVyZWZvcmUgTUlQUzMyUjIgKi8KKwloYW5kbGVfcGVyZl9pcnEoMSk7CisKKwlpZiAocmVhZF9jMF9jYXVzZSgpICYgKDEgPDwgMzApKSB7CisJCS8qIENsZWFyIENvdW50L0NvbXBhcmUgSW50ZXJydXB0ICovCisJCXdyaXRlX2MwX2NvbXBhcmUocmVhZF9jMF9jb21wYXJlKCkpOworCQlzbXRjX2Rpc3RyaWJ1dGVfdGltZXIoY3B1X2RhdGFbY3B1XS52cGVfaWQpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworaW50IF9fY3B1aW5pdCBtaXBzX2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQoreworCXVpbnQ2NF90IG1pcHNfZnJlcSA9IG1pcHNfaHB0X2ZyZXF1ZW5jeTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkOworCXVuc2lnbmVkIGludCBpcnE7CisJaW50IGk7CisJaW50IGo7CisKKwlpZiAoIWNwdV9oYXNfY291bnRlciB8fCAhbWlwc19ocHRfZnJlcXVlbmN5KQorCQlyZXR1cm4gLUVOWElPOworCWlmIChjcHUgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKSB7CisJCQlzbXRjX25leHRpbnZwZVtpXSA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaisrKQorCQkJCXNtdGNfbmV4dHRpbWVbaV1bal0gPSAwTDsKKwkJfQorCQkvKgorCQkgKiBTTVRDIGFsc28gY2FuJ3QgaGF2ZSB0aGUgdXNhYmxpbGl0eSB0ZXN0CisJCSAqIHJ1biBieSBzZWNvbmRhcnkgVENzIG9uY2UgQ29tcGFyZSBpcyBpbiB1c2UuCisJCSAqLworCQlpZiAoIWMwX2NvbXBhcmVfaW50X3VzYWJsZSgpKQorCQkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKgorCSAqIFdpdGggdmVjdG9yZWQgaW50ZXJydXB0cyB0aGluZ3MgYXJlIGdldHRpbmcgcGxhdGZvcm0gc3BlY2lmaWMuCisJICogZ2V0X2MwX2NvbXBhcmVfaW50IGlzIGEgaG9vayB0byBhbGxvdyBhIHBsYXRmb3JtIHRvIHJldHVybiB0aGUKKwkgKiBpbnRlcnJ1cHQgbnVtYmVyIG9mIGl0J3MgbGlraW5nLgorCSAqLworCWlycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgY3AwX2NvbXBhcmVfaXJxOworCWlmIChnZXRfYzBfY29tcGFyZV9pbnQpCisJCWlycSA9IGdldF9jMF9jb21wYXJlX2ludCgpOworCisJY2QgPSAmcGVyX2NwdShtaXBzX2Nsb2NrZXZlbnRfZGV2aWNlLCBjcHUpOworCisJY2QtPm5hbWUJCT0gIk1JUFMiOworCWNkLT5mZWF0dXJlcwkJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UOworCisJLyogQ2FsY3VsYXRlIHRoZSBtaW4gLyBtYXggZGVsdGEgKi8KKwljZC0+bXVsdAk9IGRpdl9zYygodW5zaWduZWQgbG9uZykgbWlwc19mcmVxLCBOU0VDX1BFUl9TRUMsIDMyKTsKKwljZC0+c2hpZnQJCT0gMzI7CisJY2QtPm1heF9kZWx0YV9ucwk9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHg3ZmZmZmZmZiwgY2QpOworCWNkLT5taW5fZGVsdGFfbnMJPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4MzAwLCBjZCk7CisKKwljZC0+cmF0aW5nCQk9IDMwMDsKKwljZC0+aXJxCQkJPSBpcnE7CisJY2QtPmNwdW1hc2sJCT0gY3B1bWFza19vZl9jcHUoY3B1KTsKKwljZC0+c2V0X25leHRfZXZlbnQJPSBtaXBzX25leHRfZXZlbnQ7CisJY2QtPnNldF9tb2RlCQk9IG1pcHNfc2V0X2Nsb2NrX21vZGU7CisJY2QtPmV2ZW50X2hhbmRsZXIJPSBtaXBzX2V2ZW50X2hhbmRsZXI7CisKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2QpOworCisJLyoKKwkgKiBPbiBTTVRDIHdlIG9ubHkgd2FudCB0byBkbyB0aGUgZGF0YSBzdHJ1Y3R1cmUKKwkgKiBpbml0aWFsaXphdGlvbiBhbmQgSVJRIHNldHVwIG9uY2UuCisJICovCisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBBbmQgd2UgbmVlZCB0aGUgaHdtYXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYzBfY29tcGFyZQorCSAqIHZlY3RvciB0byBiZSBpbml0aWFsaXplZC4KKwkgKi8KKwlpcnFfaHdtYXNrW2lycV0gPSAoMHgxMDAgPDwgY3AwX2NvbXBhcmVfaXJxKTsKKwlpZiAoY3AwX3RpbWVyX2lycV9pbnN0YWxsZWQpCisJCXJldHVybiAwOworCisJY3AwX3RpbWVyX2lycV9pbnN0YWxsZWQgPSAxOworCisJc2V0dXBfaXJxKGlycSwgJmMwX2NvbXBhcmVfaXJxYWN0aW9uKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggMzM1YTZhZS4uMGNmMTU0NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2ZwdS5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vd2F0Y2guaD4KIAogLyoKICAqIE5vdCBhbGwgb2YgdGhlIE1JUFMgQ1BVcyBoYXZlIHRoZSAid2FpdCIgaW5zdHJ1Y3Rpb24gYXZhaWxhYmxlLiBNb3Jlb3ZlciwKQEAgLTQ1LDE4ICs0Niw3IEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCi0vKgotICogVGhlcmUgaXMgYSByYWNlIHdoZW4gV0FJVCBpbnN0cnVjdGlvbiBleGVjdXRlZCB3aXRoIGludGVycnVwdAotICogZW5hYmxlZC4KLSAqIEJ1dCBpdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgd2hldGVyIHRoZSBwaXBlbGllIHJlc3RhcnRzIHdoZW4KLSAqIGEgbm9uLWVuYWJsZWQgaW50ZXJydXB0IGlzIHJlcXVlc3RlZC4KLSAqLwotc3RhdGljIHZvaWQgcjRrX3dhaXQodm9pZCkKLXsKLQlfX2FzbV9fKCIJLnNldAltaXBzMwkJCVxuIgotCQkiCXdhaXQJCQkJXG4iCi0JCSIJLnNldAltaXBzMAkJCVxuIik7Ci19CitleHRlcm4gdm9pZCByNGtfd2FpdCh2b2lkKTsKIAogLyoKICAqIFRoaXMgdmFyaWFudCBpcyBwcmVmZXJhYmxlIGFzIGl0IGFsbG93cyB0ZXN0aW5nIG5lZWRfcmVzY2hlZCBhbmQgZ29pbmcgdG8KQEAgLTY1LDE0ICs1NSwxOCBAQAogICogaW50ZXJydXB0IGlzIHJlcXVlc3RlZCIgcmVzdHJpY3Rpb24gaW4gdGhlIE1JUFMzMi9NSVBTNjQgYXJjaGl0ZWN0dXJlIG1ha2VzCiAgKiB1c2luZyB0aGlzIHZlcnNpb24gYSBnYW1ibGUuCiAgKi8KLXN0YXRpYyB2b2lkIHI0a193YWl0X2lycW9mZih2b2lkKQordm9pZCByNGtfd2FpdF9pcnFvZmYodm9pZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCV9fYXNtX18oIgkuc2V0CW1pcHMzCQlcbiIKKwkJX19hc21fXygiCS5zZXQJcHVzaAkJXG4iCisJCQkiCS5zZXQJbWlwczMJCVxuIgogCQkJIgl3YWl0CQkJXG4iCi0JCQkiCS5zZXQJbWlwczAJCVxuIik7CisJCQkiCS5zZXQJcG9wCQlcbiIpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKKwlfX2FzbV9fKCIgCS5nbG9ibCBfX3Bhc3R3YWl0CVxuIgorCQkiX19wYXN0d2FpdDoJCQlcbiIpOworCXJldHVybjsKIH0KIAogLyoKQEAgLTEyOCw3ICsxMjIsNyBAQAogCiBfX3NldHVwKCJub3dhaXQiLCB3YWl0X2Rpc2FibGUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfd2FpdCh2b2lkKQordm9pZCBfX2luaXQgY2hlY2tfd2FpdCh2b2lkKQogewogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKIApAQCAtMjQyLDcgKzIzNiw2IEBACiAKIHZvaWQgX19pbml0IGNoZWNrX2J1Z3MzMih2b2lkKQogewotCWNoZWNrX3dhaXQoKTsKIAljaGVja19lcnJhdGEoKTsKIH0KIApAQCAtNjg1LDYgKzY3OCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3Byb2JlX21pcHMoc3RydWN0IGNwdWluZm9fbWlwcyAqYykKIHsKIAlkZWNvZGVfY29uZmlncyhjKTsKKwltaXBzX3Byb2JlX3dhdGNoX3JlZ2lzdGVycyhjKTsKIAlzd2l0Y2ggKGMtPnByb2Nlc3Nvcl9pZCAmIDB4ZmYwMCkgewogCWNhc2UgUFJJRF9JTVBfNEtDOgogCQljLT5jcHV0eXBlID0gQ1BVXzRLQzsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUwppbmRleCBlMjk1OThhLi5mZmEzMzEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9lbnRyeS5TCkBAIC03OSwxMSArNzksNiBAQAogCiBGRVhQT1JUKHJlc3RvcmVfYWxsKQkJCSMgcmVzdG9yZSBmdWxsIGZyYW1lCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotLyogRGV0ZWN0IGFuZCBleGVjdXRlIGRlZmVycmVkIElQSSAiaW50ZXJydXB0cyIgKi8KLQlMT05HX0wJczAsIFRJX1JFR1MoJDI4KQotCUxPTkdfUwlzcCwgVElfUkVHUygkMjgpCi0JamFsCWRlZmVycmVkX3NtdGNfaXBpCi0JTE9OR19TCXMwLCBUSV9SRUdTKCQyOCkKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QCiAvKiBSZS1hcm0gYW55IHRlbXBvcmFyaWx5IG1hc2tlZCBpbnRlcnJ1cHRzIG5vdCBleHBsaWNpdGx5ICJhY2tlZCIgKi8KIAltZmMwCXYwLCBDUDBfVENTVEFUVVMKQEAgLTExMiw2ICsxMDcsMTEgQEAKIAl4b3IJdDAsIHQwLCB0MwogCW10YzAJdDAsIENQMF9UQ0NPTlRFWFQKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QICovCisvKiBEZXRlY3QgYW5kIGV4ZWN1dGUgZGVmZXJyZWQgSVBJICJpbnRlcnJ1cHRzIiAqLworCUxPTkdfTAlzMCwgVElfUkVHUygkMjgpCisJTE9OR19TCXNwLCBUSV9SRUdTKCQyOCkKKwlqYWwJZGVmZXJyZWRfc210Y19pcGkKKwlMT05HX1MJczAsIFRJX1JFR1MoJDI4KQogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAkuc2V0CW5vYXQKIAlSRVNUT1JFX1RFTVAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwppbmRleCBjNmFkYTk4Li43NTdkNDhmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3N0YWNrZnJhbWUuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAogI2RlZmluZSBQQU5JQ19QSUMobXNnKQkJCQkJXAogCQkuc2V0IHB1c2g7CQkJCVwKQEAgLTEyNiw3ICsxMjcsNDIgQEAKIAogCV9fRklOSVQKIAorCS5hbGlnbgk1CS8qIDMyIGJ5dGUgcm9sbGJhY2sgcmVnaW9uICovCitMRUFGKHI0a193YWl0KQorCS5zZXQJcHVzaAorCS5zZXQJbm9yZW9yZGVyCisJLyogc3RhcnQgb2Ygcm9sbGJhY2sgcmVnaW9uICovCisJTE9OR19MCXQwLCBUSV9GTEFHUygkMjgpCisJbm9wCisJYW5kaQl0MCwgX1RJRl9ORUVEX1JFU0NIRUQKKwlibmV6CXQwLCAxZgorCSBub3AKKwlub3AKKwlub3AKKwkuc2V0CW1pcHMzCisJd2FpdAorCS8qIGVuZCBvZiByb2xsYmFjayByZWdpb24gKHRoZSByZWdpb24gc2l6ZSBtdXN0IGJlIHBvd2VyIG9mIHR3bykgKi8KKwkuc2V0CXBvcAorMToKKwlqcglyYQorCUVORChyNGtfd2FpdCkKKworCS5tYWNybwlCVUlMRF9ST0xMQkFDS19QUk9MT0dVRSBoYW5kbGVyCisJRkVYUE9SVChyb2xsYmFja19caGFuZGxlcikKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKwlNRkMwCWswLCBDUDBfRVBDCisJUFRSX0xBCWsxLCByNGtfd2FpdAorCW9yaQlrMCwgMHgxZgkvKiAzMiBieXRlIHJvbGxiYWNrIHJlZ2lvbiAqLworCXhvcmkJazAsIDB4MWYKKwlibmUJazAsIGsxLCA5ZgorCU1UQzAJazAsIENQMF9FUEMKKzk6CisJLnNldCBwb3AKKwkuZW5kbQorCiAJLmFsaWduICA1CitCVUlMRF9ST0xMQkFDS19QUk9MT0dVRSBoYW5kbGVfaW50CiBORVNURUQoaGFuZGxlX2ludCwgUFRfU0laRSwgc3ApCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAJLyoKQEAgLTIwMSw2ICsyMzcsNyBAQAogICogVGhpcyBwcm90b3R5cGUgaXMgY29waWVkIHRvIGViYXNlICsgbipJbnRDdGwuVlMgYW5kIHBhdGNoZWQKICAqIHRvIGludm9rZSB0aGUgaGFuZGxlcgogICovCitCVUlMRF9ST0xMQkFDS19QUk9MT0dVRSBleGNlcHRfdmVjX3ZpCiBORVNURUQoZXhjZXB0X3ZlY192aSwgMCwgc3ApCiAJU0FWRV9TT01FCiAJU0FWRV9BVApAQCAtMjQ1LDggKzI4Miw4IEBACiAJYW5kCXQwLCBhMCwgdDEKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QCiAJbWZjMAl0MiwgQ1AwX1RDQ09OVEVYVAotCW9yCXQwLCB0MCwgdDIKLQltdGMwCXQwLCBDUDBfVENDT05URVhUCisJb3IJdDIsIHQwLCB0MgorCW10YzAJdDIsIENQMF9UQ0NPTlRFWFQKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDX0lNX0JBQ0tTVE9QICovCiAJeG9yCXQxLCB0MSwgdDAKIAltdGMwCXQxLCBDUDBfU1RBVFVTCkBAIC00MTYsNyArNDUzLDExIEBACiAJQlVJTERfSEFORExFUiB0ciB0ciBzdGkgc2lsZW50CQkJLyogIzEzICovCiAJQlVJTERfSEFORExFUiBmcGUgZnBlIGZwZSBzaWxlbnQJCS8qICMxNSAqLwogCUJVSUxEX0hBTkRMRVIgbWRteCBtZG14IHN0aSBzaWxlbnQJCS8qICMyMiAqLworI2lmZGVmIAlDT05GSUdfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKwlCVUlMRF9IQU5ETEVSIHdhdGNoIHdhdGNoIHN0aSBzaWxlbnQJCS8qICMyMyAqLworI2Vsc2UKIAlCVUlMRF9IQU5ETEVSIHdhdGNoIHdhdGNoIHN0aSB2ZXJib3NlCQkvKiAjMjMgKi8KKyNlbmRpZgogCUJVSUxEX0hBTkRMRVIgbWNoZWNrIG1jaGVjayBjbGkgdmVyYm9zZQkJLyogIzI0ICovCiAJQlVJTERfSEFORExFUiBtdCBtdCBzdGkgc2lsZW50CQkJLyogIzI1ICovCiAJQlVJTERfSEFORExFUiBkc3AgZHNwIHN0aSBzaWxlbnQJCS8qICMyNiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwppbmRleCAzNjEzNjQ1Li40OTJhMGE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUworKysgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWJpdHMuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tnZGIuYyBiL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCmluZGV4IDhmNmQ1OGUuLjZlMTUyYzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva2dkYi5jCkBAIC0yMzYsOCArMjM2LDcgQEAKIAogCQlhdG9taWNfc2V0KCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCwgLTEpOwogCQlpZiAocmVtY29tX2luX2J1ZmZlclswXSA9PSAncycpCi0JCQlpZiAoa2dkYl9jb250dGhyZWFkKQotCQkJCWF0b21pY19zZXQoJmtnZGJfY3B1X2RvaW5nX3NpbmdsZV9zdGVwLCBjcHUpOworCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsIGNwdSk7CiAKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwppbmRleCAyZmVmYjE0Li5hYTJjNTVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwpAQCAtNjMsNDEgKzYzLDYgQEAKICNkZWZpbmUgbWVyZ2VfNjQocjEsIHIyKSAoKCgocjIpICYgMHhmZmZmZmZmZlVMKSA8PCAzMikgKyAoKHIxKSAmIDB4ZmZmZmZmZmZVTCkpCiAjZW5kaWYKIAotLyoKLSAqIFJldmFsaWRhdGUgdGhlIGlub2RlLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgTkZTIGF0dHJpYnV0ZSBjYWNoaW5nLgotICovCi0KLWludCBjcF9jb21wYXRfc3RhdChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYpCi17Ci0Jc3RydWN0IGNvbXBhdF9zdGF0IHRtcDsKLQotCWlmICghbmV3X3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8ICFuZXdfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnN0X2RldiA9IG5ld19lbmNvZGVfZGV2KHN0YXQtPmRldik7Ci0JdG1wLnN0X2lubyA9IHN0YXQtPmlubzsKLQlpZiAoc2l6ZW9mKHRtcC5zdF9pbm8pIDwgc2l6ZW9mKHN0YXQtPmlubykgJiYgdG1wLnN0X2lubyAhPSBzdGF0LT5pbm8pCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKLQl0bXAuc3RfbmxpbmsgPSBzdGF0LT5ubGluazsKLQlTRVRfVUlEKHRtcC5zdF91aWQsIHN0YXQtPnVpZCk7Ci0JU0VUX0dJRCh0bXAuc3RfZ2lkLCBzdGF0LT5naWQpOwotCXRtcC5zdF9yZGV2ID0gbmV3X2VuY29kZV9kZXYoc3RhdC0+cmRldik7Ci0JdG1wLnN0X3NpemUgPSBzdGF0LT5zaXplOwotCXRtcC5zdF9hdGltZSA9IHN0YXQtPmF0aW1lLnR2X3NlYzsKLQl0bXAuc3RfbXRpbWUgPSBzdGF0LT5tdGltZS50dl9zZWM7Ci0JdG1wLnN0X2N0aW1lID0gc3RhdC0+Y3RpbWUudHZfc2VjOwotI2lmZGVmIFNUQVRfSEFWRV9OU0VDCi0JdG1wLnN0X2F0aW1lX25zZWMgPSBzdGF0LT5hdGltZS50dl9uc2VjOwotCXRtcC5zdF9tdGltZV9uc2VjID0gc3RhdC0+bXRpbWUudHZfbnNlYzsKLQl0bXAuc3RfY3RpbWVfbnNlYyA9IHN0YXQtPmN0aW1lLnR2X25zZWM7Ci0jZW5kaWYKLQl0bXAuc3RfYmxvY2tzID0gc3RhdC0+YmxvY2tzOwotCXRtcC5zdF9ibGtzaXplID0gc3RhdC0+Ymxrc2l6ZTsKLQlyZXR1cm4gY29weV90b191c2VyKHN0YXRidWYsICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOwotfQotCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKIHN5czMyX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCkBAIC0xNjgsNzIgKzEzMyw2IEBACiAJcmV0dXJuIHN5c19mdHJ1bmNhdGUoZmQsIG1lcmdlXzY0KGEyLCBhMykpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcKLWdldF90djMyKHN0cnVjdCB0aW1ldmFsICpvLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICppKQotewotCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaSwgc2l6ZW9mKCppKSkgfHwKLQkJKF9fZ2V0X3VzZXIoby0+dHZfc2VjLCAmaS0+dHZfc2VjKSB8Ci0JCSBfX2dldF91c2VyKG8tPnR2X3VzZWMsICZpLT50dl91c2VjKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcKLXB1dF90djMyKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKm8sIHN0cnVjdCB0aW1ldmFsICppKQotewotCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG8sIHNpemVvZigqbykpIHx8Ci0JCShfX3B1dF91c2VyKGktPnR2X3NlYywgJm8tPnR2X3NlYykgfAotCQkgX19wdXRfdXNlcihpLT50dl91c2VjLCAmby0+dHZfdXNlYykpKTsKLX0KLQotZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7Ci0KLWFzbWxpbmthZ2UgaW50Ci1zeXMzMl9nZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQotewotCWlmICh0dikgewotCQlzdHJ1Y3QgdGltZXZhbCBrdHY7Ci0JCWRvX2dldHRpbWVvZmRheSgma3R2KTsKLQkJaWYgKHB1dF90djMyKHR2LCAma3R2KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAodHopIHsKLQkJaWYgKGNvcHlfdG9fdXNlcih0eiwgJnN5c190eiwgc2l6ZW9mKHN5c190eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgZ2V0X3RzMzIoc3RydWN0IHRpbWVzcGVjICpvLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICppKQotewotCWxvbmcgdXNlYzsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpLCBzaXplb2YoKmkpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKF9fZ2V0X3VzZXIoby0+dHZfc2VjLCAmaS0+dHZfc2VjKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKF9fZ2V0X3VzZXIodXNlYywgJmktPnR2X3VzZWMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlvLT50dl9uc2VjID0gdXNlYyAqIDEwMDA7Ci0JCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGludAotc3lzMzJfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlzdHJ1Y3QgdGltZXNwZWMga3RzOwotCXN0cnVjdCB0aW1lem9uZSBrdHo7Ci0KLSAJaWYgKHR2KSB7Ci0JCWlmIChnZXRfdHMzMigma3RzLCB0dikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Ci19Ci0KIGFzbWxpbmthZ2UgaW50IHN5czMyX2xsc2Vlayh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBvZmZzZXRfaGlnaCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0X2xvdywgbG9mZl90IF9fdXNlciAqIHJlc3VsdCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgb3JpZ2luKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLW10LWZwYWZmLmMgYi9hcmNoL21pcHMva2VybmVsL21pcHMtbXQtZnBhZmYuYwppbmRleCBkZjRkM2YyLi5kYzllYjcyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21pcHMtbXQtZnBhZmYuYworKysgYi9hcmNoL21pcHMva2VybmVsL21pcHMtbXQtZnBhZmYuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAvKgogICogRlBVIFVzZSBGYWN0b3IgZW1waXJpY2FsbHkgZGVyaXZlZCBmcm9tIGV4cGVyaW1lbnRzIG9uIDM0SwogICovCi0jZGVmaW5lIEZQVVNFRkFDVE9SIDMzMworI2RlZmluZSBGUFVTRUZBQ1RPUiAyMDAwCiAKIHN0YXRpYyBfX2luaXQgaW50IG10X2ZwX2FmZmluaXR5X2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKaW5kZXggMzZmMDY1My4uMjY3NjBjYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAl1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IGNwdV9kYXRhW25dLnByb2Nlc3Nvcl9pZDsKIAl1bnNpZ25lZCBpbnQgZnBfdmVycyA9IGNwdV9kYXRhW25dLmZwdV9pZDsKIAljaGFyIGZtdCBbNjRdOworCWludCBpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWlmICghY3B1X2lzc2V0KG4sIGNwdV9vbmxpbmVfbWFwKSkKQEAgLTM4LDcgKzM5LDcgQEAKIAlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdFx0OiAlbGRcbiIsIG4pOwogCXNwcmludGYoZm10LCAiY3B1IG1vZGVsXHRcdDogJSVzIFYlJWQuJSVkJXNcbiIsCiAJICAgICAgICBjcHVfZGF0YVtuXS5vcHRpb25zICYgTUlQU19DUFVfRlBVID8gIiAgRlBVIFYlZC4lZCIgOiAiIik7Ci0Jc2VxX3ByaW50ZihtLCBmbXQsIF9fY3B1X25hbWVbc21wX3Byb2Nlc3Nvcl9pZCgpXSwKKwlzZXFfcHJpbnRmKG0sIGZtdCwgX19jcHVfbmFtZVtuXSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiA+PiA0KSAmIDB4MGYsIHZlcnNpb24gJiAweDBmLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcF92ZXJzID4+IDQpICYgMHgwZiwgZnBfdmVycyAmIDB4MGYpOwogCXNlcV9wcmludGYobSwgIkJvZ29NSVBTXHRcdDogJWx1LiUwMmx1XG4iLApAQCAtNTAsOCArNTEsMTYgQEAKIAlzZXFfcHJpbnRmKG0sICJ0bGJfZW50cmllc1x0XHQ6ICVkXG4iLCBjcHVfZGF0YVtuXS50bGJzaXplKTsKIAlzZXFfcHJpbnRmKG0sICJleHRyYSBpbnRlcnJ1cHQgdmVjdG9yXHQ6ICVzXG4iLAogCSAgICAgICAgICAgICAgY3B1X2hhc19kaXZlYyA/ICJ5ZXMiIDogIm5vIik7Ci0Jc2VxX3ByaW50ZihtLCAiaGFyZHdhcmUgd2F0Y2hwb2ludFx0OiAlc1xuIiwKLQkgICAgICAgICAgICAgIGNwdV9oYXNfd2F0Y2ggPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYobSwgImhhcmR3YXJlIHdhdGNocG9pbnRcdDogJXMiLAorCQkgICBjcHVfaGFzX3dhdGNoID8gInllcywgIiA6ICJub1xuIik7CisJaWYgKGNwdV9oYXNfd2F0Y2gpIHsKKwkJc2VxX3ByaW50ZihtLCAiY291bnQ6ICVkLCBhZGRyZXNzL2lydyBtYXNrOiBbIiwKKwkJCSAgIGNwdV9kYXRhW25dLndhdGNoX3JlZ19jb3VudCk7CisJCWZvciAoaSA9IDA7IGkgPCBjcHVfZGF0YVtuXS53YXRjaF9yZWdfY291bnQ7IGkrKykKKwkJCXNlcV9wcmludGYobSwgIiVzMHglMDR4IiwgaSA/ICIsICIgOiAiIiAsCisJCQkJICAgY3B1X2RhdGFbbl0ud2F0Y2hfcmVnX21hc2tzW2ldKTsKKwkJc2VxX3ByaW50ZihtLCAiXVxuIik7CisJfQogCXNlcV9wcmludGYobSwgIkFTRXMgaW1wbGVtZW50ZWRcdDolcyVzJXMlcyVzJXNcbiIsCiAJCSAgICAgIGNwdV9oYXNfbWlwczE2ID8gIiBtaXBzMTYiIDogIiIsCiAJCSAgICAgIGNwdV9oYXNfbWRteCA/ICIgbWRteCIgOiAiIiwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjE2ZmFjZC4uY2EyZTQwMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KQEAgLTU1LDcgKzU0LDcgQEAKIAl3aGlsZSAoMSkgewogCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0jaWZkZWYgQ09ORklHX1NNVENfSURMRV9IT09LX0RFQlVHCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCQkJZXh0ZXJuIHZvaWQgc210Y19pZGxlX2xvb3BfaG9vayh2b2lkKTsKIAogCQkJc210Y19pZGxlX2xvb3BfaG9vaygpOwpAQCAtMTQ1LDE3ICsxNDQsMTggQEAKIAkgKi8KIAlwLT50aHJlYWQuY3AwX3N0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCkgJiB+KFNUMF9DVTJ8U1QwX0NVMSk7CiAJY2hpbGRyZWdzLT5jcDBfc3RhdHVzICY9IH4oU1QwX0NVMnxTVDBfQ1UxKTsKKworI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwkvKgorCSAqIFNNVEMgcmVzdG9yZXMgVENTdGF0dXMgYWZ0ZXIgU3RhdHVzLCBhbmQgdGhlIENVIGJpdHMKKwkgKiBhcmUgYWxpYXNlZCB0aGVyZS4KKwkgKi8KKwljaGlsZHJlZ3MtPmNwMF90Y3N0YXR1cyAmPSB+KFNUMF9DVTJ8U1QwX0NVMSk7CisjZW5kaWYKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcocCwgVElGX1VTRURGUFUpOwogCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfRlBBRkYKLQkvKgotCSAqIEZQVSBhZmZpbml0eSBzdXBwb3J0IGlzIGNsZWFuZXIgaWYgd2UgdHJhY2sgdGhlCi0JICogdXNlci12aXNpYmxlIENQVSBhZmZpbml0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZy4KLQkgKiBUaGUgZ2VuZXJpYyBjcHVzX2FsbG93ZWQgbWFzayB3aWxsIGFscmVhZHkgaGF2ZQotCSAqIGJlZW4gY29waWVkIGZyb20gdGhlIHBhcmVudCBiZWZvcmUgY29weV90aHJlYWQKLQkgKiBpcyBpbnZva2VkLgotCSAqLwotCXAtPnRocmVhZC51c2VyX2NwdXNfYWxsb3dlZCA9IHAtPmNwdXNfYWxsb3dlZDsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0ZQVUJPVU5EKTsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9GUEFGRiAqLwogCiAJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMzUyMzRiOS4uMDU0ODYxYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC00Niw3ICs0Niw4IEBACiAgKi8KIHZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQkvKiBOb3RoaW5nIHRvIGRvLi4gKi8KKwkvKiBEb24ndCBsb2FkIHRoZSB3YXRjaHBvaW50IHJlZ2lzdGVycyBmb3IgdGhlIGV4LWNoaWxkLiAqLworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0xPQURfV0FUQ0gpOwogfQogCiAvKgpAQCAtMTY3LDYgKzE2OCw5MyBAQAogCXJldHVybiAwOwogfQogCitpbnQgcHRyYWNlX2dldF93YXRjaF9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJCQkgIHN0cnVjdCBwdF93YXRjaF9yZWdzIF9fdXNlciAqYWRkcikKK3sKKwllbnVtIHB0X3dhdGNoX3N0eWxlIHN0eWxlOworCWludCBpOworCisJaWYgKCFjcHVfaGFzX3dhdGNoIHx8IGN1cnJlbnRfY3B1X2RhdGEud2F0Y2hfcmVnX3VzZV9jbnQgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCBzaXplb2Yoc3RydWN0IHB0X3dhdGNoX3JlZ3MpKSkKKwkJcmV0dXJuIC1FSU87CisKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwlzdHlsZSA9IHB0X3dhdGNoX3N0eWxlX21pcHMzMjsKKyNkZWZpbmUgV0FUQ0hfU1RZTEUgbWlwczMyCisjZWxzZQorCXN0eWxlID0gcHRfd2F0Y2hfc3R5bGVfbWlwczY0OworI2RlZmluZSBXQVRDSF9TVFlMRSBtaXBzNjQKKyNlbmRpZgorCisJX19wdXRfdXNlcihzdHlsZSwgJmFkZHItPnN0eWxlKTsKKwlfX3B1dF91c2VyKGN1cnJlbnRfY3B1X2RhdGEud2F0Y2hfcmVnX3VzZV9jbnQsCisJCSAgICZhZGRyLT5XQVRDSF9TVFlMRS5udW1fdmFsaWQpOworCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X2NwdV9kYXRhLndhdGNoX3JlZ191c2VfY250OyBpKyspIHsKKwkJX19wdXRfdXNlcihjaGlsZC0+dGhyZWFkLndhdGNoLm1pcHMzMjY0LndhdGNobG9baV0sCisJCQkgICAmYWRkci0+V0FUQ0hfU1RZTEUud2F0Y2hsb1tpXSk7CisJCV9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZC53YXRjaC5taXBzMzI2NC53YXRjaGhpW2ldICYgMHhmZmYsCisJCQkgICAmYWRkci0+V0FUQ0hfU1RZTEUud2F0Y2hoaVtpXSk7CisJCV9fcHV0X3VzZXIoY3VycmVudF9jcHVfZGF0YS53YXRjaF9yZWdfbWFza3NbaV0sCisJCQkgICAmYWRkci0+V0FUQ0hfU1RZTEUud2F0Y2hfbWFza3NbaV0pOworCX0KKwlmb3IgKDsgaSA8IDg7IGkrKykgeworCQlfX3B1dF91c2VyKDAsICZhZGRyLT5XQVRDSF9TVFlMRS53YXRjaGxvW2ldKTsKKwkJX19wdXRfdXNlcigwLCAmYWRkci0+V0FUQ0hfU1RZTEUud2F0Y2hoaVtpXSk7CisJCV9fcHV0X3VzZXIoMCwgJmFkZHItPldBVENIX1NUWUxFLndhdGNoX21hc2tzW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHB0cmFjZV9zZXRfd2F0Y2hfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkJICBzdHJ1Y3QgcHRfd2F0Y2hfcmVncyBfX3VzZXIgKmFkZHIpCit7CisJaW50IGk7CisJaW50IHdhdGNoX2FjdGl2ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsdFtOVU1fV0FUQ0hfUkVHU107CisJdTE2IGh0W05VTV9XQVRDSF9SRUdTXTsKKworCWlmICghY3B1X2hhc193YXRjaCB8fCBjdXJyZW50X2NwdV9kYXRhLndhdGNoX3JlZ191c2VfY250ID09IDApCisJCXJldHVybiAtRUlPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhZGRyLCBzaXplb2Yoc3RydWN0IHB0X3dhdGNoX3JlZ3MpKSkKKwkJcmV0dXJuIC1FSU87CisJLyogQ2hlY2sgdGhlIHZhbHVlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9jcHVfZGF0YS53YXRjaF9yZWdfdXNlX2NudDsgaSsrKSB7CisJCV9fZ2V0X3VzZXIobHRbaV0sICZhZGRyLT5XQVRDSF9TVFlMRS53YXRjaGxvW2ldKTsKKyNpZmRlZiBDT05GSUdfMzJCSVQKKwkJaWYgKGx0W2ldICYgX19VQV9MSU1JVCkKKwkJCXJldHVybiAtRUlOVkFMOworI2Vsc2UKKwkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfMzJCSVRfQUREUikpIHsKKwkJCWlmIChsdFtpXSAmIDB4ZmZmZmZmZmY4MDAwMDAwMFVMKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJaWYgKGx0W2ldICYgX19VQV9MSU1JVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2VuZGlmCisJCV9fZ2V0X3VzZXIoaHRbaV0sICZhZGRyLT5XQVRDSF9TVFlMRS53YXRjaGhpW2ldKTsKKwkJaWYgKGh0W2ldICYgfjB4ZmY4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIEluc3RhbGwgdGhlbS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9jcHVfZGF0YS53YXRjaF9yZWdfdXNlX2NudDsgaSsrKSB7CisJCWlmIChsdFtpXSAmIDcpCisJCQl3YXRjaF9hY3RpdmUgPSAxOworCQljaGlsZC0+dGhyZWFkLndhdGNoLm1pcHMzMjY0LndhdGNobG9baV0gPSBsdFtpXTsKKwkJLyogU2V0IHRoZSBHIGJpdC4gKi8KKwkJY2hpbGQtPnRocmVhZC53YXRjaC5taXBzMzI2NC53YXRjaGhpW2ldID0gaHRbaV07CisJfQorCisJaWYgKHdhdGNoX2FjdGl2ZSkKKwkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0xPQURfV0FUQ0gpOworCWVsc2UKKwkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfTE9BRF9XQVRDSCk7CisKKwlyZXR1cm4gMDsKK30KKwogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewogCWludCByZXQ7CkBAIC0yMzgsNyArMzI2LDcgQEAKIAkJY2FzZSBGUENfRUlSOiB7CS8qIGltcGxlbWVudGF0aW9uIC8gdmVyc2lvbiByZWdpc3RlciAqLwogCQkJdW5zaWduZWQgaW50IGZsYWdzOwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJCXVuc2lnbmVkIGludCBpcnFmbGFnczsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJCQl1bnNpZ25lZCBpbnQgbXRmbGFnczsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAKQEAgLTQ0MCw2ICs1MjgsMTYgQEAKIAkJCQkodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CiAJCWJyZWFrOwogCisJY2FzZSBQVFJBQ0VfR0VUX1dBVENIX1JFR1M6CisJCXJldCA9IHB0cmFjZV9nZXRfd2F0Y2hfcmVncyhjaGlsZCwKKwkJCQkJKHN0cnVjdCBwdF93YXRjaF9yZWdzIF9fdXNlciAqKSBhZGRyKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TRVRfV0FUQ0hfUkVHUzoKKwkJcmV0ID0gcHRyYWNlX3NldF93YXRjaF9yZWdzKGNoaWxkLAorCQkJCQkoc3RydWN0IHB0X3dhdGNoX3JlZ3MgX191c2VyICopIGFkZHIpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggNzY4MThiZS4uMWNhMzQxMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMTUsNiArMTUsNyBAQAogICogYmluYXJpZXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTM2LDQ3ICszNywxNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAKLWludCBwdHJhY2VfZ2V0cmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBfX3M2NCBfX3VzZXIgKmRhdGEpOwotaW50IHB0cmFjZV9zZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fczY0IF9fdXNlciAqZGF0YSk7Ci0KLWludCBwdHJhY2VfZ2V0ZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIF9fdTMyIF9fdXNlciAqZGF0YSk7Ci1pbnQgcHRyYWNlX3NldGZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBfX3UzMiBfX3VzZXIgKmRhdGEpOwotCiAvKgogICogVHJhY2luZyBhIDMyLWJpdCBwcm9jZXNzIHdpdGggYSA2NC1iaXQgc3RyYWNlIGFuZCB2aWNlIHZlcnNhIHdpbGwgbm90CiAgKiB3b3JrLiAgSSBkb24ndCBrbm93IGhvdyB0byBmaXggdGhpcy4KICAqLwotYXNtbGlua2FnZSBpbnQgc3lzMzJfcHRyYWNlKGludCByZXF1ZXN0LCBpbnQgcGlkLCBpbnQgYWRkciwgaW50IGRhdGEpCitsb25nIGNvbXBhdF9hcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBjb21wYXRfbG9uZ190IHJlcXVlc3QsCisJCQljb21wYXRfdWxvbmdfdCBjYWRkciwgY29tcGF0X3Vsb25nX3QgY2RhdGEpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZDsKKwlpbnQgYWRkciA9IGNhZGRyOworCWludCBkYXRhID0gY2RhdGE7CiAJaW50IHJldDsKIAotI2lmIDAKLQlwcmludGsoInB0cmFjZShyPSVkLHBpZD0lZCxhZGRyPSUwOGx4LGRhdGE9JTA4bHgpXG4iLAotCSAgICAgICAoaW50KSByZXF1ZXN0LCAoaW50KSBwaWQsICh1bnNpZ25lZCBsb25nKSBhZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgZGF0YSk7Ci0jZW5kaWYKLQlsb2NrX2tlcm5lbCgpOwotCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7Ci0JCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOwotCWlmIChJU19FUlIoY2hpbGQpKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2hpbGQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7Ci0JCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X3RzazsKLQogCXN3aXRjaCAocmVxdWVzdCkgewogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCkBAIC0yMTQsNyArMTg1LDcgQEAKIAkJCWlmICghY3B1X2hhc19kc3ApIHsKIAkJCQl0bXAgPSAwOwogCQkJCXJldCA9IC1FSU87Ci0JCQkJZ290byBvdXRfdHNrOworCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJZHJlZ3MgPSBfX2dldF9kc3BfcmVncyhjaGlsZCk7CiAJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgKGRyZWdzW2FkZHIgLSBEU1BfQkFTRV0pOwpAQCAtMjI0LDE0ICsxOTUsMTQgQEAKIAkJCWlmICghY3B1X2hhc19kc3ApIHsKIAkJCQl0bXAgPSAwOwogCQkJCXJldCA9IC1FSU87Ci0JCQkJZ290byBvdXRfdHNrOworCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJdG1wID0gY2hpbGQtPnRocmVhZC5kc3AuZHNwY29udHJvbDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJdG1wID0gMDsKIAkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dF90c2s7CisJCQlnb3RvIG91dDsKIAkJfQogCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGRhdGEpOwogCQlicmVhazsKQEAgLTQxMCwxNCArMzgxLDIwIEBACiAJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKIAkJYnJlYWs7CiAKKwljYXNlIFBUUkFDRV9HRVRfV0FUQ0hfUkVHUzoKKwkJcmV0ID0gcHRyYWNlX2dldF93YXRjaF9yZWdzKGNoaWxkLAorCQkJKHN0cnVjdCBwdF93YXRjaF9yZWdzIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgYWRkcik7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU0VUX1dBVENIX1JFR1M6CisJCXJldCA9IHB0cmFjZV9zZXRfd2F0Y2hfcmVncyhjaGlsZCwKKwkJCShzdHJ1Y3QgcHRfd2F0Y2hfcmVncyBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGFkZHIpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAJfQotCi1vdXRfdHNrOgotCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3J0bHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCmluZGV4IGRmZDg2OGIuLjRjZTkzYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCkBAIC01MjIsOCArNTIyLDggQEAKIAkJYXRvbWljX3NldCgmY2hhbm5lbF93cXNbaV0uaW5fb3BlbiwgMCk7CiAJCW11dGV4X2luaXQoJmNoYW5uZWxfd3FzW2ldLm11dGV4KTsKIAotCQlkZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEobXRfY2xhc3MsIE5VTEwsIE1LREVWKG1ham9yLCBpKSwKLQkJCQkJICAgIE5VTEwsICIlcyVkIiwgbW9kdWxlX25hbWUsIGkpOworCQlkZXYgPSBkZXZpY2VfY3JlYXRlKG10X2NsYXNzLCBOVUxMLCBNS0RFVihtYWpvciwgaSksIE5VTEwsCisJCQkJICAgICIlcyVkIiwgbW9kdWxlX25hbWUsIGkpOwogCQlpZiAoSVNfRVJSKGRldikpIHsKIAkJCWVyciA9IFBUUl9FUlIoZGV2KTsKIAkJCWdvdG8gb3V0X2NocmRldjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwppbmRleCBkYTdmMWI2Li5lMjY2YjNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCkBAIC0yMTQsMTIgKzIxNCwxMiBAQAogCVBUUglzeXNfZmNob3duCiAJUFRSCXN5c19sY2hvd24KIAlQVFIJc3lzX3VtYXNrCi0JUFRSCXN5czMyX2dldHRpbWVvZmRheQorCVBUUgljb21wYXRfc3lzX2dldHRpbWVvZmRheQogCVBUUgljb21wYXRfc3lzX2dldHJsaW1pdAkJLyogNjA5NSAqLwogCVBUUgljb21wYXRfc3lzX2dldHJ1c2FnZQogCVBUUgljb21wYXRfc3lzX3N5c2luZm8KIAlQVFIJY29tcGF0X3N5c190aW1lcwotCVBUUglzeXMzMl9wdHJhY2UKKwlQVFIJY29tcGF0X3N5c19wdHJhY2UKIAlQVFIJc3lzX2dldHVpZAkJCS8qIDYxMDAgKi8KIAlQVFIJc3lzX3N5c2xvZwogCVBUUglzeXNfZ2V0Z2lkCkBAIC0yNzksNyArMjc5LDcgQEAKIAlQVFIJc3lzX2Nocm9vdAogCVBUUglzeXNfc3luYwogCVBUUglzeXNfYWNjdAotCVBUUglzeXMzMl9zZXR0aW1lb2ZkYXkKKwlQVFIJY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkKIAlQVFIJY29tcGF0X3N5c19tb3VudAkJLyogNjE2MCAqLwogCVBUUglzeXNfdW1vdW50CiAJUFRSCXN5c19zd2Fwb24KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwppbmRleCBkN2NkMWFhLi42YzdlZjgzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCkBAIC0yMzEsNyArMjMxLDcgQEAKIAlQVFIJc3lzX3NldHVpZAogCVBUUglzeXNfZ2V0dWlkCiAJUFRSCWNvbXBhdF9zeXNfc3RpbWUJCS8qIDQwMjUgKi8KLQlQVFIJc3lzMzJfcHRyYWNlCisJUFRSCWNvbXBhdF9zeXNfcHRyYWNlCiAJUFRSCXN5c19hbGFybQogCVBUUglzeXNfbmlfc3lzY2FsbAkJCS8qIHdhcyBzeXNfZnN0YXQgKi8KIAlQVFIJc3lzX3BhdXNlCkBAIC0yODMsOCArMjgzLDggQEAKIAlQVFIJY29tcGF0X3N5c19zZXRybGltaXQJCS8qIDQwNzUgKi8KIAlQVFIJY29tcGF0X3N5c19nZXRybGltaXQKIAlQVFIJY29tcGF0X3N5c19nZXRydXNhZ2UKLQlQVFIJc3lzMzJfZ2V0dGltZW9mZGF5Ci0JUFRSCXN5czMyX3NldHRpbWVvZmRheQorCVBUUgljb21wYXRfc3lzX2dldHRpbWVvZmRheQorCVBUUgljb21wYXRfc3lzX3NldHRpbWVvZmRheQogCVBUUglzeXNfZ2V0Z3JvdXBzCQkJLyogNDA4MCAqLwogCVBUUglzeXNfc2V0Z3JvdXBzCiAJUFRSCXN5c19uaV9zeXNjYWxsCQkJLyogb2xkX3NlbGVjdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IDJhYWU3NmIuLjE2ZjhlZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTE2MCwzMCArMTYwLDMzIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgaW5pdF9pbml0cmQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGVuZDsKLQl1MzIgKmluaXRyZF9oZWFkZXI7CiAKIAkvKgogCSAqIEJvYXJkIHNwZWNpZmljIGNvZGUgb3IgY29tbWFuZCBsaW5lIHBhcnNlciBzaG91bGQgaGF2ZQogCSAqIGFscmVhZHkgc2V0IHVwIGluaXRyZF9zdGFydCBhbmQgaW5pdHJkX2VuZC4gSW4gdGhlc2UgY2FzZXMKIAkgKiBwZXJmb20gc2FuaXR5IGNoZWNrcyBhbmQgdXNlIHRoZW0gaWYgYWxsIGxvb2tzIGdvb2QuCiAJICovCi0JaWYgKGluaXRyZF9zdGFydCAmJiBpbml0cmRfZW5kID4gaW5pdHJkX3N0YXJ0KQotCQlnb3RvIHNhbml0aXplOworCWlmICghaW5pdHJkX3N0YXJ0IHx8IGluaXRyZF9lbmQgPD0gaW5pdHJkX3N0YXJ0KSB7CisjaWZkZWYgQ09ORklHX1BST0JFX0lOSVRSRF9IRUFERVIKKwkJdTMyICppbml0cmRfaGVhZGVyOwogCi0JLyoKLQkgKiBTZWUgaWYgaW5pdHJkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBrZXJuZWwgaW1hZ2UgYnkKLQkgKiBhcmNoL21pcHMvYm9vdC9hZGRpbml0cmQuYy4gSW4gdGhhdCBjYXNlIGEgaGVhZGVyIGlzCi0JICogcHJlcGVuZGVkIHRvIGluaXRyZCBhbmQgaXMgbWFkZSB1cCBieSA4IGJ5dGVzLiBUaGUgZmlzcnQKLQkgKiB3b3JkIGlzIGEgbWFnaWMgbnVtYmVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgc2l6ZSBvZgotCSAqIGluaXRyZC4gIEluaXRyZCBzdGFydCBtdXN0IGJlIHBhZ2UgYWxpZ25lZCBpbiBhbnkgY2FzZXMuCi0JICovCi0JaW5pdHJkX2hlYWRlciA9IF9fdmEoUEFHRV9BTElHTihfX3BhX3N5bWJvbCgmX2VuZCkgKyA4KSkgLSA4OwotCWlmIChpbml0cmRfaGVhZGVyWzBdICE9IDB4NDk0RTUyNDQpCisJCS8qCisJCSAqIFNlZSBpZiBpbml0cmQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGtlcm5lbCBpbWFnZSBieQorCQkgKiBhcmNoL21pcHMvYm9vdC9hZGRpbml0cmQuYy4gSW4gdGhhdCBjYXNlIGEgaGVhZGVyIGlzCisJCSAqIHByZXBlbmRlZCB0byBpbml0cmQgYW5kIGlzIG1hZGUgdXAgYnkgOCBieXRlcy4gVGhlIGZpcnN0CisJCSAqIHdvcmQgaXMgYSBtYWdpYyBudW1iZXIgYW5kIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBzaXplIG9mCisJCSAqIGluaXRyZC4gIEluaXRyZCBzdGFydCBtdXN0IGJlIHBhZ2UgYWxpZ25lZCBpbiBhbnkgY2FzZXMuCisJCSAqLworCQlpbml0cmRfaGVhZGVyID0gX192YShQQUdFX0FMSUdOKF9fcGFfc3ltYm9sKCZfZW5kKSArIDgpKSAtIDg7CisJCWlmIChpbml0cmRfaGVhZGVyWzBdICE9IDB4NDk0RTUyNDQpCisJCQlnb3RvIGRpc2FibGU7CisJCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKShpbml0cmRfaGVhZGVyICsgMik7CisJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBpbml0cmRfaGVhZGVyWzFdOworI2Vsc2UKIAkJZ290byBkaXNhYmxlOwotCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKShpbml0cmRfaGVhZGVyICsgMik7Ci0JaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIGluaXRyZF9oZWFkZXJbMV07CisjZW5kaWYKKwl9CiAKLXNhbml0aXplOgogCWlmIChpbml0cmRfc3RhcnQgJiB+UEFHRV9NQVNLKSB7CiAJCXByX2VycigiaW5pdHJkIHN0YXJ0IG11c3QgYmUgcGFnZSBhbGlnbmVkXG4iKTsKIAkJZ290byBkaXNhYmxlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCmluZGV4IDU3MmM2MTAuLjY1MjcwOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKQEAgLTQ4Miw2ICs0ODIsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgY29weV9zaWdpbmZvX2Zyb21fdXNlcjMyKHNpZ2luZm9fdCAqdG8sIGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICpmcm9tKQoreworCW1lbXNldCh0bywgMCwgc2l6ZW9mICp0byk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIodG8sIGZyb20sIDMqc2l6ZW9mKGludCkpIHx8CisJICAgIGNvcHlfZnJvbV91c2VyKHRvLT5fc2lmaWVsZHMuX3BhZCwKKwkJCSAgIGZyb20tPl9zaWZpZWxkcy5fcGFkLCBTSV9QQURfU0laRTMyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwogYXNtbGlua2FnZSB2b2lkIHN5czMyX3NpZ3JldHVybihuYWJpX25vX3JlZ2FyZ3Mgc3RydWN0IHB0X3JlZ3MgcmVncykKIHsKIAlzdHJ1Y3Qgc2lnZnJhbWUzMiBfX3VzZXIgKmZyYW1lOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKaW5kZXggNDQxMGYxNy4uN2I1OWNmYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCkBAIC0xMjEsNiArMTIxLDggQEAKIAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJY3B1X2RhdGFbY3B1XS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogCisJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOworCiAJbXBfb3BzLT5zbXBfZmluaXNoKCk7CiAJc2V0X2NwdV9zaWJsaW5nX21hcChjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtdGMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCmluZGV4IGE1MTYyODYuLjg5N2ZiMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jCkBAIC0xLDQgKzEsMjEgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwNCBNaXBzIFRlY2hub2xvZ2llcywgSW5jICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1pcHMgVGVjaG5vbG9naWVzLCBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLZXZpbiBELiBLaXNzZWxsCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTIxLDcgKzM4LDYgQEAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vc210Yy5oPgotI2luY2x1ZGUgPGFzbS9zbXRjX2lwaS5oPgogI2luY2x1ZGUgPGFzbS9zbXRjX3Byb2MuaD4KIAogLyoKQEAgLTU4LDExICs3NCw2IEBACiAKIGFzaWR1c2Ugc210Y19saXZlX2FzaWRbTUFYX1NNVENfVExCU11bTUFYX1NNVENfQVNJRFNdOwogCi0vKgotICogQ2xvY2sgaW50ZXJydXB0ICJsYXRjaCIgYnVmZmVycywgcGVyICJDUFUiCi0gKi8KLQotc3RhdGljIGF0b21pY190IGlwaV90aW1lcl9sYXRjaFtOUl9DUFVTXTsKIAogLyoKICAqIE51bWJlciBvZiBJbnRlclByb2Nlc3NvciBJbnRlcnJ1cHQgKElQSSkgbWVzc2FnZSBidWZmZXJzIHRvIGFsbG9jYXRlCkBAIC03MCw3ICs4MSw3IEBACiAKICNkZWZpbmUgSVBJQlVGX1BFUl9DUFUgNAogCi1zdGF0aWMgc3RydWN0IHNtdGNfaXBpX3EgSVBJUVtOUl9DUFVTXTsKK3N0cnVjdCBzbXRjX2lwaV9xIElQSVFbTlJfQ1BVU107CiBzdGF0aWMgc3RydWN0IHNtdGNfaXBpX3EgZnJlZUlQSXE7CiAKIApAQCAtMjgyLDcgKzI5Myw3IEBACiAgKiBwaHlzX2NwdV9wcmVzZW50X21hcCBhbmQgdGhlIGxvZ2ljYWwvcGh5c2ljYWwgbWFwcGluZ3MuCiAgKi8KIAotaW50IF9faW5pdCBtaXBzbXRfYnVpbGRfY3B1X21hcChpbnQgc3RhcnRfY3B1X3Nsb3QpCitpbnQgX19pbml0IHNtdGNfYnVpbGRfY3B1X21hcChpbnQgc3RhcnRfY3B1X3Nsb3QpCiB7CiAJaW50IGksIG50Y3M7CiAKQEAgLTMyNSw3ICszMzYsMTIgQEAKIAl3cml0ZV90Y19jMF90Y3N0YXR1cygocmVhZF90Y19jMF90Y3N0YXR1cygpCiAJCQkmIH4oVENTVEFUVVNfVEtTVSB8IFRDU1RBVFVTX0RBIHwgVENTVEFUVVNfSVhNVCkpCiAJCQl8IFRDU1RBVFVTX0EpOwotCXdyaXRlX3RjX2MwX3RjY29udGV4dCgwKTsKKwkvKgorCSAqIFRDQ29udGV4dCBnZXRzIGFuIG9mZnNldCBmcm9tIHRoZSBiYXNlIG9mIHRoZSBJUElRIGFycmF5CisJICogdG8gYmUgdXNlZCBpbiBsb3ctbGV2ZWwgY29kZSB0byBkZXRlY3QgdGhlIHByZXNlbmNlIG9mCisJICogYW4gYWN0aXZlIElQSSBxdWV1ZQorCSAqLworCXdyaXRlX3RjX2MwX3RjY29udGV4dCgoc2l6ZW9mKHN0cnVjdCBzbXRjX2lwaV9xKSAqIGNwdSkgPDwgMTYpOwogCS8qIEJpbmQgdGMgdG8gdnBlICovCiAJd3JpdGVfdGNfYzBfdGNiaW5kKHZwZSk7CiAJLyogSW4gZ2VuZXJhbCwgYWxsIFRDcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBjcHVfZGF0YSBpbmRpY2F0aW9ucyAqLwpAQCAtMzM2LDEwICszNTIsMTggQEAKIAkJY3B1X2RhdGFbY3B1XS5vcHRpb25zICY9IH5NSVBTX0NQVV9GUFU7CiAJY3B1X2RhdGFbY3B1XS52cGVfaWQgPSB2cGU7CiAJY3B1X2RhdGFbY3B1XS50Y19pZCA9IHRjOworCS8qIE11bHRpLWNvcmUgU01UQyBoYXNuJ3QgYmVlbiB0ZXN0ZWQsIGJ1dCBiZSBwcmVwYXJlZCAqLworCWNwdV9kYXRhW2NwdV0uY29yZSA9IChyZWFkX3ZwZV9jMF9lYmFzZSgpID4+IDEpICYgMHhmZjsKIH0KIAorLyoKKyAqIFR3ZWFrIHRvIGdldCBDb3VudCByZWdpc3RlcyBpbiBhcyBjbG9zZSBhIHN5bmMgYXMgcG9zc2libGUuCisgKiBWYWx1ZSBzZWVtcyBnb29kIGZvciAzNEstY2xhc3MgY29yZXMuCisgKi8KIAotdm9pZCBtaXBzbXRfcHJlcGFyZV9jcHVzKHZvaWQpCisjZGVmaW5lIENQMF9TS0VXIDgKKwordm9pZCBzbXRjX3ByZXBhcmVfY3B1cyhpbnQgY3B1cykKIHsKIAlpbnQgaSwgdnBlLCB0YywgbnRjLCBudnBlLCB0Y3BlcnZwZVtOUl9DUFVTXSwgc2xvcCwgY3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNjMsMTMgKzM4NywxMyBAQAogCQlJUElRW2ldLmhlYWQgPSBJUElRW2ldLnRhaWwgPSBOVUxMOwogCQlzcGluX2xvY2tfaW5pdCgmSVBJUVtpXS5sb2NrKTsKIAkJSVBJUVtpXS5kZXB0aCA9IDA7Ci0JCWF0b21pY19zZXQoJmlwaV90aW1lcl9sYXRjaFtpXSwgMCk7CiAJfQogCiAJLyogY3B1X2RhdGEgaW5kZXggc3RhcnRzIGF0IHplcm8gKi8KIAljcHUgPSAwOwogCWNwdV9kYXRhW2NwdV0udnBlX2lkID0gMDsKIAljcHVfZGF0YVtjcHVdLnRjX2lkID0gMDsKKwljcHVfZGF0YVtjcHVdLmNvcmUgPSAocmVhZF9jMF9lYmFzZSgpID4+IDEpICYgMHhmZjsKIAljcHUrKzsKIAogCS8qIFJlcG9ydCBvbiBib290LXRpbWUgb3B0aW9ucyAqLwpAQCAtNDg0LDcgKzUwOCw4IEBACiAJCQl3cml0ZV92cGVfYzBfY29tcGFyZSgwKTsKIAkJCS8qIFByb3BhZ2F0ZSBDb25maWc3ICovCiAJCQl3cml0ZV92cGVfYzBfY29uZmlnNyhyZWFkX2MwX2NvbmZpZzcoKSk7Ci0JCQl3cml0ZV92cGVfYzBfY291bnQocmVhZF9jMF9jb3VudCgpKTsKKwkJCXdyaXRlX3ZwZV9jMF9jb3VudChyZWFkX2MwX2NvdW50KCkgKyBDUDBfU0tFVyk7CisJCQllaGIoKTsKIAkJfQogCQkvKiBlbmFibGUgbXVsdGktdGhyZWFkaW5nIHdpdGhpbiBWUEUgKi8KIAkJd3JpdGVfdnBlX2MwX3ZwZWNvbnRyb2wocmVhZF92cGVfYzBfdnBlY29udHJvbCgpIHwgVlBFQ09OVFJPTF9URSk7CkBAIC01NTYsNyArNTgxLDcgQEAKIHZvaWQgX19jcHVpbml0IHNtdGNfYm9vdF9zZWNvbmRhcnkoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQogewogCWV4dGVybiB1MzIga2VybmVsc3BbTlJfQ1BVU107Ci0JbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBtdGZsYWdzOwogCiAJTE9DS19NVF9QUkEoKTsKQEAgLTU4NSwyNCArNjEwLDIyIEBACiAKIHZvaWQgc210Y19pbml0X3NlY29uZGFyeSh2b2lkKQogewotCS8qCi0JICogU3RhcnQgdGltZXIgb24gc2Vjb25kYXJ5IFZQRXMgaWYgbmVjZXNzYXJ5LgotCSAqIHBsYXRfdGltZXJfc2V0dXAgaGFzIGFscmVhZHkgaGF2ZSBiZWVuIGludm9rZWQgYnkgaW5pdC9tYWluCi0JICogb24gImJvb3QiIFRDLiAgTGlrZSBwZXJfY3B1X3RyYXBfaW5pdCgpIGhhY2ssIHRoaXMgYXNzdW1lcyB0aGF0Ci0JICogU01UQyBpbml0IGNvZGUgYXNzaWducyBUQ3MgY29uc2RlY3V0aXZlbHkgYW5kIGluIGFzY2VuZGluZyBvcmRlcgotCSAqIHRvIGFjcm9zcyBhdmFpbGFibGUgVlBFcy4KLQkgKi8KLQlpZiAoKChyZWFkX2MwX3RjYmluZCgpICYgVENCSU5EX0NVUlRDKSAhPSAwKSAmJgotCSAgICAoKHJlYWRfYzBfdGNiaW5kKCkgJiBUQ0JJTkRfQ1VSVlBFKQotCSAgICAhPSBjcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCkgLSAxXS52cGVfaWQpKXsKLQkJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkgKyBtaXBzX2hwdF9mcmVxdWVuY3kvSFopOwotCX0KLQogCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAogdm9pZCBzbXRjX3NtcF9maW5pc2godm9pZCkKIHsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBMb3dlc3QtbnVtYmVyZWQgQ1BVIHBlciBWUEUgc3RhcnRzIGEgY2xvY2sgdGljay4KKwkgKiBMaWtlIHBlcl9jcHVfdHJhcF9pbml0KCkgaGFjaywgdGhpcyBhc3N1bWVzIHRoYXQKKwkgKiBTTVRDIGluaXQgY29kZSBhc3NpZ25zIFRDcyBjb25zZGVjdXRpdmVseSBhbmQKKwkgKiBpbiBhc2NlbmRpbmcgb3JkZXIgYWNyb3NzIGF2YWlsYWJsZSBWUEVzLgorCSAqLworCWlmIChjcHUgPiAwICYmIChjcHVfZGF0YVtjcHVdLnZwZV9pZCAhPSBjcHVfZGF0YVtjcHUgLSAxXS52cGVfaWQpKQorCQl3cml0ZV9jMF9jb21wYXJlKHJlYWRfYzBfY291bnQoKSArIG1pcHNfaHB0X2ZyZXF1ZW5jeS9IWik7CisKIAlwcmludGsoIlRDICVkIGdvaW5nIG9uLWxpbmUgYXMgQ1BVICVkXG4iLAogCQljcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCldLnRjX2lkLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogfQpAQCAtNzUzLDggKzc3NiwxMCBAQAogewogCWludCB0Y3N0YXR1czsKIAlzdHJ1Y3Qgc210Y19pcGkgKnBpcGk7Ci0JbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBtdGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGNyZXN0YXJ0OworCWV4dGVybiB2b2lkIHI0a193YWl0X2lycW9mZih2b2lkKSwgX19wYXN0d2FpdCh2b2lkKTsKIAogCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CiAJCXByaW50aygiQ2Fubm90IFNlbmQgSVBJIHRvIHNlbGYhXG4iKTsKQEAgLTc3MSw4ICs3OTYsNiBAQAogCXBpcGktPmFyZyA9ICh2b2lkICopYWN0aW9uOwogCXBpcGktPmRlc3QgPSBjcHU7CiAJaWYgKGNwdV9kYXRhW2NwdV0udnBlX2lkICE9IGNwdV9kYXRhW3NtcF9wcm9jZXNzb3JfaWQoKV0udnBlX2lkKSB7Ci0JCWlmICh0eXBlID09IFNNVENfQ0xPQ0tfVElDSykKLQkJCWF0b21pY19pbmMoJmlwaV90aW1lcl9sYXRjaFtjcHVdKTsKIAkJLyogSWYgbm90IG9uIHNhbWUgVlBFLCBlbnF1ZXVlIGFuZCBzZW5kIGNyb3NzLVZQRSBpbnRlcnJ1cHQgKi8KIAkJc210Y19pcGlfbnEoJklQSVFbY3B1XSwgcGlwaSk7CiAJCUxPQ0tfQ09SRV9QUkEoKTsKQEAgLTgwMCwyMiArODIzLDI5IEBACiAKIAkJaWYgKCh0Y3N0YXR1cyAmIFRDU1RBVFVTX0lYTVQpICE9IDApIHsKIAkJCS8qCi0JCQkgKiBTcGluLXdhaXRpbmcgaGVyZSBjYW4gZGVhZGxvY2ssCi0JCQkgKiBzbyB3ZSBxdWV1ZSB0aGUgbWVzc2FnZSBmb3IgdGhlIHRhcmdldCBUQy4KKwkJCSAqIElmIHdlJ3JlIGluIHRoZSB0aGUgaXJxLW9mZiB2ZXJzaW9uIG9mIHRoZSB3YWl0CisJCQkgKiBsb29wLCB3ZSBuZWVkIHRvIGZvcmNlIGV4aXQgZnJvbSB0aGUgd2FpdCBhbmQKKwkJCSAqIGRvIGEgZGlyZWN0IHBvc3Qgb2YgdGhlIElQSS4KKwkJCSAqLworCQkJaWYgKGNwdV93YWl0ID09IHI0a193YWl0X2lycW9mZikgeworCQkJCXRjcmVzdGFydCA9IHJlYWRfdGNfYzBfdGNyZXN0YXJ0KCk7CisJCQkJaWYgKHRjcmVzdGFydCA+PSAodW5zaWduZWQgbG9uZylyNGtfd2FpdF9pcnFvZmYKKwkJCQkgICAgJiYgdGNyZXN0YXJ0IDwgKHVuc2lnbmVkIGxvbmcpX19wYXN0d2FpdCkgeworCQkJCQl3cml0ZV90Y19jMF90Y3Jlc3RhcnQoX19wYXN0d2FpdCk7CisJCQkJCXRjc3RhdHVzICY9IH5UQ1NUQVRVU19JWE1UOworCQkJCQl3cml0ZV90Y19jMF90Y3N0YXR1cyh0Y3N0YXR1cyk7CisJCQkJCWdvdG8gcG9zdGRpcmVjdDsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogT3RoZXJ3aXNlIHdlIHF1ZXVlIHRoZSBtZXNzYWdlIGZvciB0aGUgdGFyZ2V0IFRDCisJCQkgKiB0byBwaWNrIHVwIHdoZW4gaGUgZG9lcyBhIGxvY2FsX2lycV9yZXN0b3JlKCkKIAkJCSAqLwogCQkJd3JpdGVfdGNfYzBfdGNoYWx0KDApOwogCQkJVU5MT0NLX0NPUkVfUFJBKCk7Ci0JCQkvKiBUcnkgdG8gcmVkdWNlIHJlZHVuZGFudCB0aW1lciBpbnRlcnJ1cHQgbWVzc2FnZXMgKi8KLQkJCWlmICh0eXBlID09IFNNVENfQ0xPQ0tfVElDSykgewotCQkJICAgIGlmIChhdG9taWNfcG9zdGluY3JlbWVudCgmaXBpX3RpbWVyX2xhdGNoW2NwdV0pIT0wKXsKLQkJCQlzbXRjX2lwaV9ucSgmZnJlZUlQSXEsIHBpcGkpOwotCQkJCXJldHVybjsKLQkJCSAgICB9Ci0JCQl9CiAJCQlzbXRjX2lwaV9ucSgmSVBJUVtjcHVdLCBwaXBpKTsKIAkJfSBlbHNlIHsKLQkJCWlmICh0eXBlID09IFNNVENfQ0xPQ0tfVElDSykKLQkJCQlhdG9taWNfaW5jKCZpcGlfdGltZXJfbGF0Y2hbY3B1XSk7Citwb3N0ZGlyZWN0OgogCQkJcG9zdF9kaXJlY3RfaXBpKGNwdSwgcGlwaSk7CiAJCQl3cml0ZV90Y19jMF90Y2hhbHQoMCk7CiAJCQlVTkxPQ0tfQ09SRV9QUkEoKTsKQEAgLTg4Myw3ICs5MTMsNyBAQAogCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwogfQogCi1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgc210Y19kdW1teV9jbG9ja2V2ZW50X2RldmljZSk7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbWlwc19jbG9ja2V2ZW50X2RldmljZSk7CiAKIHZvaWQgaXBpX2RlY29kZShzdHJ1Y3Qgc210Y19pcGkgKnBpcGkpCiB7CkBAIC04OTEsMjAgKzkyMSwxMyBAQAogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkOwogCXZvaWQgKmFyZ19jb3B5ID0gcGlwaS0+YXJnOwogCWludCB0eXBlX2NvcHkgPSBwaXBpLT50eXBlOwotCWludCB0aWNrczsKLQogCXNtdGNfaXBpX25xKCZmcmVlSVBJcSwgcGlwaSk7CiAJc3dpdGNoICh0eXBlX2NvcHkpIHsKIAljYXNlIFNNVENfQ0xPQ0tfVElDSzoKIAkJaXJxX2VudGVyKCk7CiAJCWtzdGF0X3RoaXNfY3B1LmlycXNbTUlQU19DUFVfSVJRX0JBU0UgKyAxXSsrOwotCQljZCA9ICZwZXJfY3B1KHNtdGNfZHVtbXlfY2xvY2tldmVudF9kZXZpY2UsIGNwdSk7Ci0JCXRpY2tzID0gYXRvbWljX3JlYWQoJmlwaV90aW1lcl9sYXRjaFtjcHVdKTsKLQkJYXRvbWljX3N1Yih0aWNrcywgJmlwaV90aW1lcl9sYXRjaFtjcHVdKTsKLQkJd2hpbGUgKHRpY2tzKSB7Ci0JCQljZC0+ZXZlbnRfaGFuZGxlcihjZCk7Ci0JCQl0aWNrcy0tOwotCQl9CisJCWNkID0gJnBlcl9jcHUobWlwc19jbG9ja2V2ZW50X2RldmljZSwgY3B1KTsKKwkJY2QtPmV2ZW50X2hhbmRsZXIoY2QpOwogCQlpcnFfZXhpdCgpOwogCQlicmVhazsKIApAQCAtOTM3LDI0ICs5NjAsNDggQEAKIAl9CiB9CiAKKy8qCisgKiBTaW1pbGFyIHRvIHNtdGNfaXBpX3JlcGxheSgpLCBidXQgaW52b2tlZCBmcm9tIGNvbnRleHQgcmVzdG9yZSwKKyAqIHNvIGl0IHJldXNlcyB0aGUgY3VycmVudCBleGNlcHRpb24gZnJhbWUgcmF0aGVyIHRoYW4gc2V0IHVwIGEKKyAqIG5ldyBvbmUgd2l0aCBzZWxmX2lwaS4KKyAqLworCiB2b2lkIGRlZmVycmVkX3NtdGNfaXBpKHZvaWQpCiB7Ci0Jc3RydWN0IHNtdGNfaXBpICpwaXBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0vKiBERUJVRyAqLwotCWludCBxID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKgogCSAqIFRlc3QgaXMgbm90IGF0b21pYywgYnV0IG11Y2ggZmFzdGVyIHRoYW4gYSBkZXF1ZXVlLAogCSAqIGFuZCB0aGUgdmFzdCBtYWpvcml0eSBvZiBpbnZvY2F0aW9ucyB3aWxsIGhhdmUgYSBudWxsIHF1ZXVlLgorCSAqIElmIGlycV9kaXNhYmxlZCB3aGVuIHRoaXMgd2FzIGNhbGxlZCwgdGhlbiBhbnkgSVBJcyBxdWV1ZWQKKwkgKiBhZnRlciB3ZSB0ZXN0IGxhc3Qgd2lsbCBiZSB0YWtlbiBvbiB0aGUgbmV4dCBpcnFfZW5hYmxlL3Jlc3RvcmUuCisJICogSWYgaW50ZXJydXB0cyB3ZXJlIGVuYWJsZWQsIHRoZW4gYW55IElQSXMgYWRkZWQgYWZ0ZXIgdGhlCisJICogbGFzdCB0ZXN0IHdpbGwgYmUgdGFrZW4gZGlyZWN0bHkuCiAJICovCi0JaWYgKElQSVFbcV0uaGVhZCAhPSBOVUxMKSB7Ci0JCXdoaWxlKChwaXBpID0gc210Y19pcGlfZHEoJklQSVFbcV0pKSAhPSBOVUxMKSB7Ci0JCQkvKiBpcGlfZGVjb2RlKCkgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmICovCi0JCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl3aGlsZSAoSVBJUVtjcHVdLmhlYWQgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc210Y19pcGlfcSAqcSA9ICZJUElRW2NwdV07CisJCXN0cnVjdCBzbXRjX2lwaSAqcGlwaTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKgorCQkgKiBJdCBtYXkgYmUgcG9zc2libGUgd2UnbGwgY29tZSBpbiB3aXRoIGludGVycnVwdHMKKwkJICogYWxyZWFkeSBlbmFibGVkLgorCQkgKi8KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCXNwaW5fbG9jaygmcS0+bG9jayk7CisJCXBpcGkgPSBfX3NtdGNfaXBpX2RxKHEpOworCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJCWlmIChwaXBpICE9IE5VTEwpCiAJCQlpcGlfZGVjb2RlKHBpcGkpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQl9CisJCS8qCisJCSAqIFRoZSB1c2Ugb2YgdGhlIF9fcmF3X2xvY2FsIHJlc3RvcmUgaXNuJ3QKKwkJICogYXMgb2J2aW91c2x5IG5lY2Vzc2FyeSBoZXJlIGFzIGluIHNtdGNfaXBpX3JlcGxheSgpLAorCQkgKiBidXQgaXQncyBtb3JlIGVmZmljaWVudCwgZ2l2ZW4gdGhhdCB3ZSdyZSBhbHJlYWR5CisJCSAqIHJ1bm5pbmcgZG93biB0aGUgSVBJIHF1ZXVlLgorCQkgKi8KKwkJX19yYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIApAQCAtOTc1LDcgKzEwMjIsNyBAQAogCXN0cnVjdCBzbXRjX2lwaSAqcGlwaTsKIAl1bnNpZ25lZCBsb25nIHRjc3RhdHVzOwogCWludCBzZW50OwotCWxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbXRmbGFnczsKIAl1bnNpZ25lZCBpbnQgdnBmbGFnczsKIApAQCAtMTA2Niw1NSArMTExMyw1MyBAQAogCiAvKgogICogU01UQy1zcGVjaWZpYyBoYWNrcyBpbnZva2VkIGZyb20gZWxzZXdoZXJlIGluIHRoZSBrZXJuZWwuCi0gKgotICogc210Y19pcGlfcmVwbGF5IGlzIGNhbGxlZCBmcm9tIHJhd19sb2NhbF9pcnFfcmVzdG9yZSB3aGljaCBpcyBvbmx5IGV2ZXIKLSAqIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBXZSBkbyByZWx5IG9uIGludGVycnVwdHMgYmVpbmcgZGlzYWJsZWQKLSAqIGhlcmUgYmVjYXVzZSB1c2luZyBzcGluX2xvY2tfaXJxc2F2ZSgpL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoKSB3b3VsZAotICogcmVzdWx0IGluIGEgcmVjdXJzaXZlIGNhbGwgdG8gcmF3X2xvY2FsX2lycV9yZXN0b3JlKCkuCiAgKi8KIAotc3RhdGljIHZvaWQgX19zbXRjX2lwaV9yZXBsYXkodm9pZCkKKyAvKgorICAqIHNtdGNfaXBpX3JlcGxheSBpcyBjYWxsZWQgZnJvbSByYXdfbG9jYWxfaXJxX3Jlc3RvcmUKKyAgKi8KKwordm9pZCBzbXRjX2lwaV9yZXBsYXkodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyoKIAkgKiBUbyB0aGUgZXh0ZW50IHRoYXQgd2UndmUgZXZlciB0dXJuZWQgaW50ZXJydXB0cyBvZmYsCiAJICogd2UgbWF5IGhhdmUgYWNjdW11bGF0ZWQgZGVmZXJyZWQgSVBJcy4gIFRoaXMgaXMgc3VidGxlLgotCSAqIElmIHdlIHVzZSB0aGUgc210Y19pcGlfcWRlcHRoKCkgbWFjcm8sIHdlJ2xsIGdldCBhbgotCSAqIGV4YWN0IG51bWJlciAtIGJ1dCB3ZSdsbCBhbHNvIGRpc2FibGUgaW50ZXJydXB0cwotCSAqIGFuZCBjcmVhdGUgYSB3aW5kb3cgb2YgZmFpbHVyZSB3aGVyZSBhIG5ldyBJUEkgZ2V0cwotCSAqIHF1ZXVlZCBhZnRlciB3ZSB0ZXN0IHRoZSBkZXB0aCBidXQgYmVmb3JlIHdlIHJlLWVuYWJsZQotCSAqIGludGVycnVwdHMuIFNvIGxvbmcgYXMgSVhNVCBuZXZlciBnZXRzIHNldCwgaG93ZXZlciwKIAkgKiB3ZSBzaG91bGQgYmUgT0s6ICBJZiB3ZSBwaWNrIHVwIHNvbWV0aGluZyBhbmQgZGlzcGF0Y2gKIAkgKiBpdCBoZXJlLCB0aGF0J3MgZ3JlYXQuIElmIHdlIHNlZSBub3RoaW5nLCBidXQgY29uY3VycmVudAogCSAqIHdpdGggdGhpcyBvcGVyYXRpb24sIGFub3RoZXIgVEMgc2VuZHMgdXMgYW4gSVBJLCBJWE1UCiAJICogaXMgY2xlYXIsIGFuZCB3ZSdsbCBoYW5kbGUgaXQgYXMgYSByZWFsIHBzZXVkby1pbnRlcnJ1cHQKLQkgKiBhbmQgbm90IGEgcHNldWRvLXBzZXVkbyBpbnRlcnJ1cHQuCisJICogYW5kIG5vdCBhIHBzZXVkby1wc2V1ZG8gaW50ZXJydXB0LiAgVGhlIGltcG9ydGFudCB0aGluZworCSAqIGlzIHRvIGRvIHRoZSBsYXN0IGNoZWNrIGZvciBxdWV1ZWQgbWVzc2FnZSAqYWZ0ZXIqIHRoZQorCSAqIHJlLWVuYWJsaW5nIG9mIGludGVycnVwdHMuCiAJICovCi0JaWYgKElQSVFbY3B1XS5kZXB0aCA+IDApIHsKLQkJd2hpbGUgKDEpIHsKLQkJCXN0cnVjdCBzbXRjX2lwaV9xICpxID0gJklQSVFbY3B1XTsKLQkJCXN0cnVjdCBzbXRjX2lwaSAqcGlwaTsKLQkJCWV4dGVybiB2b2lkIHNlbGZfaXBpKHN0cnVjdCBzbXRjX2lwaSAqKTsKKwl3aGlsZSAoSVBJUVtjcHVdLmhlYWQgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc210Y19pcGlfcSAqcSA9ICZJUElRW2NwdV07CisJCXN0cnVjdCBzbXRjX2lwaSAqcGlwaTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQkJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKLQkJCXBpcGkgPSBfX3NtdGNfaXBpX2RxKHEpOwotCQkJc3Bpbl91bmxvY2soJnEtPmxvY2spOwotCQkJaWYgKCFwaXBpKQotCQkJCWJyZWFrOworCQkvKgorCQkgKiBJdCdzIGp1c3QgcG9zc2libGUgd2UnbGwgY29tZSBpbiB3aXRoIGludGVycnVwdHMKKwkJICogYWxyZWFkeSBlbmFibGVkLgorCQkgKi8KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCisJCXNwaW5fbG9jaygmcS0+bG9jayk7CisJCXBpcGkgPSBfX3NtdGNfaXBpX2RxKHEpOworCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJCS8qCisJCSAqKiBCdXQgdXNlIGEgcmF3IHJlc3RvcmUgaGVyZSB0byBhdm9pZCByZWN1cnNpb24uCisJCSAqLworCQlfX3Jhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJaWYgKHBpcGkpIHsKIAkJCXNlbGZfaXBpKHBpcGkpOwogCQkJc210Y19jcHVfc3RhdHNbY3B1XS5zZWxmaXBpcysrOwogCQl9CiAJfQogfQogCi12b2lkIHNtdGNfaXBpX3JlcGxheSh2b2lkKQotewotCXJhd19sb2NhbF9pcnFfZGlzYWJsZSgpOwotCV9fc210Y19pcGlfcmVwbGF5KCk7Ci19Ci0KIEVYUE9SVF9TWU1CT0woc210Y19pcGlfcmVwbGF5KTsKIAogdm9pZCBzbXRjX2lkbGVfbG9vcF9ob29rKHZvaWQpCkBAIC0xMTkzLDQwICsxMjM4LDEzIEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIE5vdyB0aGF0IHdlIGxpbWl0IG91dHN0YW5kaW5nIHRpbWVyIElQSXMsIGNoZWNrIGZvciBodW5nIFRDCi0JICovCi0JZm9yICh0YyA9IDA7IHRjIDwgTlJfQ1BVUzsgdGMrKykgewotCQkvKiBEb24ndCBjaGVjayBvdXJzZWxmIC0gd2UnbGwgZGVxdWV1ZSBJUElzIGp1c3QgYmVsb3cgKi8KLQkJaWYgKCh0YyAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpICYmCi0JCSAgICBhdG9taWNfcmVhZCgmaXBpX3RpbWVyX2xhdGNoW3RjXSkgPiB0aW1lcnFfbGltaXQpIHsKLQkJICAgIGlmIChjbG9ja19oYW5nX3JlcG9ydGVkW3RjXSA9PSAwKSB7Ci0JCQlwZGJfbXNnICs9IHNwcmludGYocGRiX21zZywKLQkJCQkiVEMgJWQgbG9va3MgaHVuZyB3aXRoIHRpbWVyIGxhdGNoIGF0ICVkXG4iLAotCQkJCXRjLCBhdG9taWNfcmVhZCgmaXBpX3RpbWVyX2xhdGNoW3RjXSkpOwotCQkJY2xvY2tfaGFuZ19yZXBvcnRlZFt0Y10rKzsKLQkJCX0KLQkJfQotCX0KIAllbXQobXRmbGFncyk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCWlmIChwZGJfbXNnICE9ICZpZF9ob19kYl9tc2dbMF0pCiAJCXByaW50aygiQ1BVJWQ6ICVzIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZF9ob19kYl9tc2cpOwogI2VuZGlmIC8qIENPTkZJR19TTVRDX0lETEVfSE9PS19ERUJVRyAqLwogCi0JLyoKLQkgKiBSZXBsYXkgYW55IGFjY3VtdWxhdGVkIGRlZmVycmVkIElQSXMuIElmICJJbnN0YW50IFJlcGxheSIKLQkgKiBpcyBpbiB1c2UsIHRoZXJlIHNob3VsZCBuZXZlciBiZSBhbnkuCi0JICovCi0jaWZuZGVmIENPTkZJR19NSVBTX01UX1NNVENfSU5TVEFOVF9SRVBMQVkKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX3NtdGNfaXBpX3JlcGxheSgpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVENfSU5TVEFOVF9SRVBMQVkgKi8KKwlzbXRjX2lwaV9yZXBsYXkoKTsKIH0KIAogdm9pZCBzbXRjX3NvZnRfZHVtcCh2b2lkKQpAQCAtMTI0MiwxMCArMTI2MCw2IEBACiAJCXByaW50aygiJWQ6ICVsZFxuIiwgaSwgc210Y19jcHVfc3RhdHNbaV0uc2VsZmlwaXMpOwogCX0KIAlzbXRjX2lwaV9xZHVtcCgpOwotCXByaW50aygiVGltZXIgSVBJIEJhY2tsb2dzOlxuIik7Ci0JZm9yIChpPTA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJcHJpbnRrKCIlZDogJWRcbiIsIGksIGF0b21pY19yZWFkKCZpcGlfdGltZXJfbGF0Y2hbaV0pKTsKLQl9CiAJcHJpbnRrKCIlZCBSZWNvdmVyaWVzIG9mIFwic3RvbGVuXCIgRlBVXG4iLAogCSAgICAgICBhdG9taWNfcmVhZCgmc210Y19mcHVfcmVjb3ZlcmllcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCAzNDMwMTVhLi4zNzk3MGQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtNyw3ICs3LDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IDQyNmNjZWQuLjgwYjllMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTQyLDEwICs0MiwxNCBAQAogI2luY2x1ZGUgPGFzbS90bGJkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3dhdGNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAorZXh0ZXJuIHZvaWQgY2hlY2tfd2FpdCh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgcjRrX3dhaXQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHJvbGxiYWNrX2hhbmRsZV9pbnQodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9pbnQodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV90bGJtKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfdGxibCh2b2lkKTsKQEAgLTM3Myw4ICszNzcsOCBAQAogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5IF9fc3RhcnRfX19kYmVfdGFibGVbXTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5IF9fc3RvcF9fX2RiZV90YWJsZVtdOworZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgX19zdGFydF9fX2RiZV90YWJsZVtdOworZXh0ZXJuIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgX19zdG9wX19fZGJlX3RhYmxlW107CiAKIF9fYXNtX18oCiAiCS5zZWN0aW9uCV9fZGJlX3RhYmxlLCBcImFcIlxuIgpAQCAtODIyLDggKzgyNiwxMCBAQAogCQlpZiAoY3B1c19pbnRlcnNlY3RzKGN1cnJlbnQtPmNwdXNfYWxsb3dlZCwgbXRfZnB1X2NwdW1hc2spKSB7CiAJCQljcHVtYXNrX3QgdG1hc2s7CiAKLQkJCWNwdXNfYW5kKHRtYXNrLCBjdXJyZW50LT50aHJlYWQudXNlcl9jcHVzX2FsbG93ZWQsCi0JCQkgICAgICAgICBtdF9mcHVfY3B1bWFzayk7CisJCQljdXJyZW50LT50aHJlYWQudXNlcl9jcHVzX2FsbG93ZWQKKwkJCQk9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwkJCWNwdXNfYW5kKHRtYXNrLCBjdXJyZW50LT5jcHVzX2FsbG93ZWQsCisJCQkJbXRfZnB1X2NwdW1hc2spOwogCQkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCB0bWFzayk7CiAJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX0ZQVUJPVU5EKTsKIAkJfQpAQCAtOTA3LDEzICs5MTMsMjYgQEAKIAogYXNtbGlua2FnZSB2b2lkIGRvX3dhdGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXUzMiBjYXVzZTsKKwogCS8qCi0JICogV2UgdXNlIHRoZSB3YXRjaCBleGNlcHRpb24gd2hlcmUgYXZhaWxhYmxlIHRvIGRldGVjdCBzdGFjawotCSAqIG92ZXJmbG93cy4KKwkgKiBDbGVhciBXUCAoYml0IDIyKSBiaXQgb2YgY2F1c2UgcmVnaXN0ZXIgc28gd2UgZG9uJ3QgbG9vcAorCSAqIGZvcmV2ZXIuCiAJICovCi0JZHVtcF90bGJfYWxsKCk7Ci0Jc2hvd19yZWdzKHJlZ3MpOwotCXBhbmljKCJDYXVnaHQgV0FUQ0ggZXhjZXB0aW9uIC0gcHJvYmFibHkgY2F1c2VkIGJ5IHN0YWNrIG92ZXJmbG93LiIpOworCWNhdXNlID0gcmVhZF9jMF9jYXVzZSgpOworCWNhdXNlICY9IH4oMSA8PCAyMik7CisJd3JpdGVfYzBfY2F1c2UoY2F1c2UpOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaGFzIHRoZSB3YXRjaCByZWdpc3RlcnMgbG9hZGVkLCBzYXZlCisJICogdGhlaXIgdmFsdWVzIGFuZCBzZW5kIFNJR1RSQVAuICBPdGhlcndpc2UgYW5vdGhlciB0aHJlYWQKKwkgKiBsZWZ0IHRoZSByZWdpc3RlcnMgc2V0LCBjbGVhciB0aGVtIGFuZCBjb250aW51ZS4KKwkgKi8KKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX0xPQURfV0FUQ0gpKSB7CisJCW1pcHNfcmVhZF93YXRjaF9yZWdpc3RlcnMoKTsKKwkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOworCX0gZWxzZQorCQltaXBzX2NsZWFyX3dhdGNoX3JlZ2lzdGVycygpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fbWNoZWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTIwMCw3ICsxMjE5LDcgQEAKIAlpZiAobiA9PSAwICYmIGNwdV9oYXNfZGl2ZWMpIHsKIAkJKih1MzIgKikoZWJhc2UgKyAweDIwMCkgPSAweDA4MDAwMDAwIHwKIAkJCQkJICAoMHgwM2ZmZmZmZiAmIChoYW5kbGVyID4+IDIpKTsKLQkJZmx1c2hfaWNhY2hlX3JhbmdlKGViYXNlICsgMHgyMDAsIGViYXNlICsgMHgyMDQpOworCQlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoZWJhc2UgKyAweDIwMCwgZWJhc2UgKyAweDIwNCk7CiAJfQogCXJldHVybiAodm9pZCAqKW9sZF9oYW5kbGVyOwogfQpAQCAtMTI1MSw2ICsxMjcwLDkgQEAKIAogCQlleHRlcm4gY2hhciBleGNlcHRfdmVjX3ZpLCBleGNlcHRfdmVjX3ZpX2x1aTsKIAkJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlY192aV9vcmksIGV4Y2VwdF92ZWNfdmlfZW5kOworCQlleHRlcm4gY2hhciByb2xsYmFja19leGNlcHRfdmVjX3ZpOworCQljaGFyICp2ZWNfc3RhcnQgPSAoY3B1X3dhaXQgPT0gcjRrX3dhaXQpID8KKwkJCSZyb2xsYmFja19leGNlcHRfdmVjX3ZpIDogJmV4Y2VwdF92ZWNfdmk7CiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCQkvKgogCQkgKiBXZSBuZWVkIHRvIHByb3ZpZGUgdGhlIFNNVEMgdmVjdG9yZWQgaW50ZXJydXB0IGhhbmRsZXIKQEAgLTEyNTgsMTEgKzEyODAsMTEgQEAKIAkJICogU3RhdHVzLklNIGJpdCB0byBiZSBtYXNrZWQgYmVmb3JlIGdvaW5nIHRoZXJlLgogCQkgKi8KIAkJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlY192aV9tb3JpOwotCQljb25zdCBpbnQgbW9yaV9vZmZzZXQgPSAmZXhjZXB0X3ZlY192aV9tb3JpIC0gJmV4Y2VwdF92ZWNfdmk7CisJCWNvbnN0IGludCBtb3JpX29mZnNldCA9ICZleGNlcHRfdmVjX3ZpX21vcmkgLSB2ZWNfc3RhcnQ7CiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQljb25zdCBpbnQgaGFuZGxlcl9sZW4gPSAmZXhjZXB0X3ZlY192aV9lbmQgLSAmZXhjZXB0X3ZlY192aTsKLQkJY29uc3QgaW50IGx1aV9vZmZzZXQgPSAmZXhjZXB0X3ZlY192aV9sdWkgLSAmZXhjZXB0X3ZlY192aTsKLQkJY29uc3QgaW50IG9yaV9vZmZzZXQgPSAmZXhjZXB0X3ZlY192aV9vcmkgLSAmZXhjZXB0X3ZlY192aTsKKwkJY29uc3QgaW50IGhhbmRsZXJfbGVuID0gJmV4Y2VwdF92ZWNfdmlfZW5kIC0gdmVjX3N0YXJ0OworCQljb25zdCBpbnQgbHVpX29mZnNldCA9ICZleGNlcHRfdmVjX3ZpX2x1aSAtIHZlY19zdGFydDsKKwkJY29uc3QgaW50IG9yaV9vZmZzZXQgPSAmZXhjZXB0X3ZlY192aV9vcmkgLSB2ZWNfc3RhcnQ7CiAKIAkJaWYgKGhhbmRsZXJfbGVuID4gVkVDVE9SU1BBQ0lORykgewogCQkJLyoKQEAgLTEyNzIsNyArMTI5NCw3IEBACiAJCQlwYW5pYygiVkVDVE9SU1BBQ0lORyB0b28gc21hbGwiKTsKIAkJfQogCi0JCW1lbWNweShiLCAmZXhjZXB0X3ZlY192aSwgaGFuZGxlcl9sZW4pOworCQltZW1jcHkoYiwgdmVjX3N0YXJ0LCBoYW5kbGVyX2xlbik7CiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCQlCVUdfT04obiA+IDcpOwkvKiBWZWN0b3IgaW5kZXggJWQgZXhjZWVkcyBTTVRDIG1heGltdW0uICovCiAKQEAgLTEyODMsNyArMTMwNSw4IEBACiAJCSp3ID0gKCp3ICYgMHhmZmZmMDAwMCkgfCAoKCh1MzIpaGFuZGxlciA+PiAxNikgJiAweGZmZmYpOwogCQl3ID0gKHUzMiAqKShiICsgb3JpX29mZnNldCk7CiAJCSp3ID0gKCp3ICYgMHhmZmZmMDAwMCkgfCAoKHUzMiloYW5kbGVyICYgMHhmZmZmKTsKLQkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWIsICh1bnNpZ25lZCBsb25nKShiK2hhbmRsZXJfbGVuKSk7CisJCWxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyliLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcpKGIraGFuZGxlcl9sZW4pKTsKIAl9CiAJZWxzZSB7CiAJCS8qCkBAIC0xMjk1LDcgKzEzMTgsOCBAQAogCQl3ID0gKHUzMiAqKWI7CiAJCSp3KysgPSAweDA4MDAwMDAwIHwgKCgodTMyKWhhbmRsZXIgPj4gMikgJiAweDAzZmZmZmYpOyAvKiBqIGhhbmRsZXIgKi8KIAkJKncgPSAwOwotCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYiwgKHVuc2lnbmVkIGxvbmcpKGIrOCkpOworCQlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYiwKKwkJCQkJICh1bnNpZ25lZCBsb25nKShiKzgpKTsKIAl9CiAKIAlyZXR1cm4gKHZvaWQgKilvbGRfaGFuZGxlcjsKQEAgLTE1MTUsNyArMTUzOSw3IEBACiB2b2lkIF9faW5pdCBzZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCW1lbWNweSgodm9pZCAqKShlYmFzZSArIG9mZnNldCksIGFkZHIsIHNpemUpOwotCWZsdXNoX2ljYWNoZV9yYW5nZShlYmFzZSArIG9mZnNldCwgZWJhc2UgKyBvZmZzZXQgKyBzaXplKTsKKwlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoZWJhc2UgKyBvZmZzZXQsIGViYXNlICsgb2Zmc2V0ICsgc2l6ZSk7CiB9CiAKIHN0YXRpYyBjaGFyIHBhbmljX251bGxfY2VycltdIF9fY3B1aW5pdGRhdGEgPQpAQCAtMTU1Miw2ICsxNTc2LDEwIEBACiAJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlYzNfZ2VuZXJpYywgZXhjZXB0X3ZlYzNfcjQwMDA7CiAJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlYzQ7CiAJdW5zaWduZWQgbG9uZyBpOworCWludCByb2xsYmFjazsKKworCWNoZWNrX3dhaXQoKTsKKwlyb2xsYmFjayA9IChjcHVfd2FpdCA9PSByNGtfd2FpdCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19LR0RCKQogCWlmIChrZ2RiX2Vhcmx5X3NldHVwKQpAQCAtMTYxNiw3ICsxNjQ0LDcgQEAKIAlpZiAoYm9hcmRfYmVfaW5pdCkKIAkJYm9hcmRfYmVfaW5pdCgpOwogCi0Jc2V0X2V4Y2VwdF92ZWN0b3IoMCwgaGFuZGxlX2ludCk7CisJc2V0X2V4Y2VwdF92ZWN0b3IoMCwgcm9sbGJhY2sgPyByb2xsYmFja19oYW5kbGVfaW50IDogaGFuZGxlX2ludCk7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMSwgaGFuZGxlX3RsYm0pOwogCXNldF9leGNlcHRfdmVjdG9yKDIsIGhhbmRsZV90bGJsKTsKIAlzZXRfZXhjZXB0X3ZlY3RvcigzLCBoYW5kbGVfdGxicyk7CkBAIC0xNjgwLDYgKzE3MDgsOCBAQAogCXNpZ25hbDMyX2luaXQoKTsKICNlbmRpZgogCi0JZmx1c2hfaWNhY2hlX3JhbmdlKGViYXNlLCBlYmFzZSArIDB4NDAwKTsKKwlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoZWJhc2UsIGViYXNlICsgMHg0MDApOwogCWZsdXNoX3RsYl9oYW5kbGVycygpOworCisJc29ydF9leHRhYmxlKF9fc3RhcnRfX19kYmVfdGFibGUsIF9fc3RvcF9fX2RiZV90YWJsZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjU0NzBjZS4uNTg3MzhjOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzYsNiArMzYsNyBAQAogCQlTQ0hFRF9URVhUCiAJCUxPQ0tfVEVYVAogCQlLUFJPQkVTX1RFWFQKKwkJKigudGV4dC4qKQogCQkqKC5maXh1cCkKIAkJKiguZ251Lndhcm5pbmcpCiAJfSA6dGV4dCA9IDAKQEAgLTEwMyw3ICsxMDQsNyBAQAogCS4gPSBBTElHTihfUEFHRV9TSVpFKTsKIAlfX25vc2F2ZV9lbmQgPSAuOwogCi0JLiA9IEFMSUdOKDMyKTsKKwkuID0gQUxJR04oMSA8PCBDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVCk7CiAJLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7CiAJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC93YXRjaC5jIGIvYXJjaC9taXBzL2tlcm5lbC93YXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTQwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMva2VybmVsL3dhdGNoLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgRGFuZXkKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vd2F0Y2guaD4KKworLyoKKyAqIEluc3RhbGwgdGhlIHdhdGNoIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiAgQSBtYXhpbXVtIG9mCisgKiBmb3VyIHJlZ2lzdGVycyBhcmUgaW5zdGFsbGVkIGFsdGhvdWdoIHRoZSBtYWNoaW5lIG1heSBoYXZlIG1vcmUuCisgKi8KK3ZvaWQgbWlwc19pbnN0YWxsX3dhdGNoX3JlZ2lzdGVycyh2b2lkKQoreworCXN0cnVjdCBtaXBzMzI2NF93YXRjaF9yZWdfc3RhdGUgKndhdGNoZXMgPQorCQkmY3VycmVudC0+dGhyZWFkLndhdGNoLm1pcHMzMjY0OworCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS53YXRjaF9yZWdfdXNlX2NudCkgeworCWRlZmF1bHQ6CisJCUJVRygpOworCWNhc2UgNDoKKwkJd3JpdGVfYzBfd2F0Y2hsbzMod2F0Y2hlcy0+d2F0Y2hsb1szXSk7CisJCS8qIFdyaXRlIDEgdG8gdGhlIEksIFIsIGFuZCBXIGJpdHMgdG8gY2xlYXIgdGhlbSwgYW5kCisJCSAgIDEgdG8gRyBzbyBhbGwgQVNJRHMgYXJlIHRyYXBwZWQuICovCisJCXdyaXRlX2MwX3dhdGNoaGkzKDB4NDAwMDAwMDcgfCB3YXRjaGVzLT53YXRjaGhpWzNdKTsKKwljYXNlIDM6CisJCXdyaXRlX2MwX3dhdGNobG8yKHdhdGNoZXMtPndhdGNobG9bMl0pOworCQl3cml0ZV9jMF93YXRjaGhpMigweDQwMDAwMDA3IHwgd2F0Y2hlcy0+d2F0Y2hoaVsyXSk7CisJY2FzZSAyOgorCQl3cml0ZV9jMF93YXRjaGxvMSh3YXRjaGVzLT53YXRjaGxvWzFdKTsKKwkJd3JpdGVfYzBfd2F0Y2hoaTEoMHg0MDAwMDAwNyB8IHdhdGNoZXMtPndhdGNoaGlbMV0pOworCWNhc2UgMToKKwkJd3JpdGVfYzBfd2F0Y2hsbzAod2F0Y2hlcy0+d2F0Y2hsb1swXSk7CisJCXdyaXRlX2MwX3dhdGNoaGkwKDB4NDAwMDAwMDcgfCB3YXRjaGVzLT53YXRjaGhpWzBdKTsKKwl9Cit9CisKKy8qCisgKiBSZWFkIGJhY2sgdGhlIHdhdGNoaGkgcmVnaXN0ZXJzIHNvIHRoZSB1c2VyIHNwYWNlIGRlYnVnZ2VyIGhhcworICogYWNjZXNzIHRvIHRoZSBJLCBSLCBhbmQgVyBiaXRzLiAgQSBtYXhpbXVtIG9mIGZvdXIgcmVnaXN0ZXJzIGFyZQorICogcmVhZCBhbHRob3VnaCB0aGUgbWFjaGluZSBtYXkgaGF2ZSBtb3JlLgorICovCit2b2lkIG1pcHNfcmVhZF93YXRjaF9yZWdpc3RlcnModm9pZCkKK3sKKwlzdHJ1Y3QgbWlwczMyNjRfd2F0Y2hfcmVnX3N0YXRlICp3YXRjaGVzID0KKwkJJmN1cnJlbnQtPnRocmVhZC53YXRjaC5taXBzMzI2NDsKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEud2F0Y2hfcmVnX3VzZV9jbnQpIHsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwljYXNlIDQ6CisJCXdhdGNoZXMtPndhdGNoaGlbM10gPSAocmVhZF9jMF93YXRjaGhpMygpICYgMHgwZmZmKTsKKwljYXNlIDM6CisJCXdhdGNoZXMtPndhdGNoaGlbMl0gPSAocmVhZF9jMF93YXRjaGhpMigpICYgMHgwZmZmKTsKKwljYXNlIDI6CisJCXdhdGNoZXMtPndhdGNoaGlbMV0gPSAocmVhZF9jMF93YXRjaGhpMSgpICYgMHgwZmZmKTsKKwljYXNlIDE6CisJCXdhdGNoZXMtPndhdGNoaGlbMF0gPSAocmVhZF9jMF93YXRjaGhpMCgpICYgMHgwZmZmKTsKKwl9CisJaWYgKGN1cnJlbnRfY3B1X2RhdGEud2F0Y2hfcmVnX3VzZV9jbnQgPT0gMSAmJgorCSAgICAod2F0Y2hlcy0+d2F0Y2hoaVswXSAmIDcpID09IDApIHsKKwkJLyogUGF0aG9sb2dpY2FsIGNhc2Ugb2YgcmVsZWFzZSAxIGFyY2hpdGVjdHVyZSB0aGF0CisJCSAqIGRvZXNuJ3Qgc2V0IHRoZSBjb25kaXRpb24gYml0cy4gIFdlIGFzc3VtZSB0aGF0CisJCSAqIHNpbmNlIHdlIGdvdCBoZXJlLCB0aGUgd2F0Y2ggY29uZGl0aW9uIHdhcyBtZXQgYW5kCisJCSAqIHNpZ25hbCB0aGF0IHRoZSBjb25kaXRpb25zIHJlcXVlc3RlZCBpbiB3YXRjaGxvCisJCSAqIHdlcmUgbWV0LiAgKi8KKwkJd2F0Y2hlcy0+d2F0Y2hoaVswXSB8PSAod2F0Y2hlcy0+d2F0Y2hsb1swXSAmIDcpOworCX0KKyB9CisKKy8qCisgKiBEaXNhYmxlIGFsbCB3YXRjaCByZWdpc3RlcnMuICBBbHRob3VnaCBvbmx5IGZvdXIgcmVnaXN0ZXJzIGFyZQorICogaW5zdGFsbGVkLCBhbGwgYXJlIGNsZWFyZWQgdG8gZWxpbWluYXRlIHRoZSBwb3NzaWJpbGl0eSBvZiBlbmRsZXNzCisgKiBsb29waW5nIGluIHRoZSB3YXRjaCBoYW5kbGVyLgorICovCit2b2lkIG1pcHNfY2xlYXJfd2F0Y2hfcmVnaXN0ZXJzKHZvaWQpCit7CisJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLndhdGNoX3JlZ19jb3VudCkgeworCWRlZmF1bHQ6CisJCUJVRygpOworCWNhc2UgODoKKwkJd3JpdGVfYzBfd2F0Y2hsbzcoMCk7CisJY2FzZSA3OgorCQl3cml0ZV9jMF93YXRjaGxvNigwKTsKKwljYXNlIDY6CisJCXdyaXRlX2MwX3dhdGNobG81KDApOworCWNhc2UgNToKKwkJd3JpdGVfYzBfd2F0Y2hsbzQoMCk7CisJY2FzZSA0OgorCQl3cml0ZV9jMF93YXRjaGxvMygwKTsKKwljYXNlIDM6CisJCXdyaXRlX2MwX3dhdGNobG8yKDApOworCWNhc2UgMjoKKwkJd3JpdGVfYzBfd2F0Y2hsbzEoMCk7CisJY2FzZSAxOgorCQl3cml0ZV9jMF93YXRjaGxvMCgwKTsKKwl9Cit9CisKK19fY3B1aW5pdCB2b2lkIG1pcHNfcHJvYmVfd2F0Y2hfcmVnaXN0ZXJzKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMpCit7CisJdW5zaWduZWQgaW50IHQ7CisKKwlpZiAoKGMtPm9wdGlvbnMgJiBNSVBTX0NQVV9XQVRDSCkgPT0gMCkKKwkJcmV0dXJuOworCS8qCisJICogQ2hlY2sgd2hpY2ggb2YgdGhlIEksUiBhbmQgVyBiaXRzIGFyZSBzdXBwb3J0ZWQsIHRoZW4KKwkgKiBkaXNhYmxlIHRoZSByZWdpc3Rlci4KKwkgKi8KKwl3cml0ZV9jMF93YXRjaGxvMCg3KTsKKwl0ID0gcmVhZF9jMF93YXRjaGxvMCgpOworCXdyaXRlX2MwX3dhdGNobG8wKDApOworCWMtPndhdGNoX3JlZ19tYXNrc1swXSA9IHQgJiA3OworCisJLyogV3JpdGUgdGhlIG1hc2sgYml0cyBhbmQgcmVhZCB0aGVtIGJhY2sgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogY2FuIGJlIHVzZWQuICovCisJYy0+d2F0Y2hfcmVnX2NvdW50ID0gMTsKKwljLT53YXRjaF9yZWdfdXNlX2NudCA9IDE7CisJdCA9IHJlYWRfYzBfd2F0Y2hoaTAoKTsKKwl3cml0ZV9jMF93YXRjaGhpMCh0IHwgMHhmZjgpOworCXQgPSByZWFkX2MwX3dhdGNoaGkwKCk7CisJYy0+d2F0Y2hfcmVnX21hc2tzWzBdIHw9ICh0ICYgMHhmZjgpOworCWlmICgodCAmIDB4ODAwMDAwMDApID09IDApCisJCXJldHVybjsKKworCXdyaXRlX2MwX3dhdGNobG8xKDcpOworCXQgPSByZWFkX2MwX3dhdGNobG8xKCk7CisJd3JpdGVfYzBfd2F0Y2hsbzEoMCk7CisJYy0+d2F0Y2hfcmVnX21hc2tzWzFdID0gdCAmIDc7CisKKwljLT53YXRjaF9yZWdfY291bnQgPSAyOworCWMtPndhdGNoX3JlZ191c2VfY250ID0gMjsKKwl0ID0gcmVhZF9jMF93YXRjaGhpMSgpOworCXdyaXRlX2MwX3dhdGNoaGkxKHQgfCAweGZmOCk7CisJdCA9IHJlYWRfYzBfd2F0Y2hoaTEoKTsKKwljLT53YXRjaF9yZWdfbWFza3NbMV0gfD0gKHQgJiAweGZmOCk7CisJaWYgKCh0ICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJcmV0dXJuOworCisJd3JpdGVfYzBfd2F0Y2hsbzIoNyk7CisJdCA9IHJlYWRfYzBfd2F0Y2hsbzIoKTsKKwl3cml0ZV9jMF93YXRjaGxvMigwKTsKKwljLT53YXRjaF9yZWdfbWFza3NbMl0gPSB0ICYgNzsKKworCWMtPndhdGNoX3JlZ19jb3VudCA9IDM7CisJYy0+d2F0Y2hfcmVnX3VzZV9jbnQgPSAzOworCXQgPSByZWFkX2MwX3dhdGNoaGkyKCk7CisJd3JpdGVfYzBfd2F0Y2hoaTIodCB8IDB4ZmY4KTsKKwl0ID0gcmVhZF9jMF93YXRjaGhpMigpOworCWMtPndhdGNoX3JlZ19tYXNrc1syXSB8PSAodCAmIDB4ZmY4KTsKKwlpZiAoKHQgJiAweDgwMDAwMDAwKSA9PSAwKQorCQlyZXR1cm47CisKKwl3cml0ZV9jMF93YXRjaGxvMyg3KTsKKwl0ID0gcmVhZF9jMF93YXRjaGxvMygpOworCXdyaXRlX2MwX3dhdGNobG8zKDApOworCWMtPndhdGNoX3JlZ19tYXNrc1szXSA9IHQgJiA3OworCisJYy0+d2F0Y2hfcmVnX2NvdW50ID0gNDsKKwljLT53YXRjaF9yZWdfdXNlX2NudCA9IDQ7CisJdCA9IHJlYWRfYzBfd2F0Y2hoaTMoKTsKKwl3cml0ZV9jMF93YXRjaGhpMyh0IHwgMHhmZjgpOworCXQgPSByZWFkX2MwX3dhdGNoaGkzKCk7CisJYy0+d2F0Y2hfcmVnX21hc2tzWzNdIHw9ICh0ICYgMHhmZjgpOworCWlmICgodCAmIDB4ODAwMDAwMDApID09IDApCisJCXJldHVybjsKKworCS8qIFdlIHVzZSBhdCBtb3N0IDQsIGJ1dCBwcm9iZSBhbmQgcmVwb3J0IHVwIHRvIDguICovCisJYy0+d2F0Y2hfcmVnX2NvdW50ID0gNTsKKwl0ID0gcmVhZF9jMF93YXRjaGhpNCgpOworCWlmICgodCAmIDB4ODAwMDAwMDApID09IDApCisJCXJldHVybjsKKworCWMtPndhdGNoX3JlZ19jb3VudCA9IDY7CisJdCA9IHJlYWRfYzBfd2F0Y2hoaTUoKTsKKwlpZiAoKHQgJiAweDgwMDAwMDAwKSA9PSAwKQorCQlyZXR1cm47CisKKwljLT53YXRjaF9yZWdfY291bnQgPSA3OworCXQgPSByZWFkX2MwX3dhdGNoaGk2KCk7CisJaWYgKCh0ICYgMHg4MDAwMDAwMCkgPT0gMCkKKwkJcmV0dXJuOworCisJYy0+d2F0Y2hfcmVnX2NvdW50ID0gODsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYyBiL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYwppbmRleCA4NjY4ODFlLi44Zjg4ODg2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jCkBAIC0zOCwxNCArMzgsMTMgQEAKICNlbmRpZgogCiAvKiBTdHJhdGVneSBmdW5jdGlvbiB0byB3cml0ZSBFRVBST00gYWZ0ZXIgY2hhbmdpbmcgc3RyaW5nIGVudHJ5ICovCi1pbnQgc3lzY3RsX2xhc2F0c3RyaW5nKGN0bF90YWJsZSAqdGFibGUsIGludCAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX2xhc2F0c3RyaW5nKGN0bF90YWJsZSAqdGFibGUsCiAJCXZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAogCQl2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJaW50IHI7CiAKLQlyID0gc3lzY3RsX3N0cmluZyh0YWJsZSwgbmFtZSwKLQkJCSAgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CisJciA9IHN5c2N0bF9zdHJpbmcodGFibGUsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CiAKQEAgLTExMywxMyArMTEyLDEzIEBACiAjZW5kaWYKIAogLyogU3lzY3RsIGZvciBzZXR0aW5nIHRoZSBJUCBhZGRyZXNzZXMgKi8KLWludCBzeXNjdGxfbGFzYXRfaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX2xhc2F0X2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLAogCQkgICAgdm9pZCAqb2xkdmFsLCBzaXplX3QgKm9sZGxlbnAsCiAJCSAgICB2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJaW50IHI7CiAKLQlyID0gc3lzY3RsX2ludHZlYyh0YWJsZSwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CisJciA9IHN5c2N0bF9pbnR2ZWModGFibGUsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CiAKQEAgLTEzMSw3ICsxMzAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RTMTYwMwogLyogU2FtZSBmb3IgUlRDICovCi1pbnQgc3lzY3RsX2xhc2F0X3J0YyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgKm5hbWUsIGludCBubGVuLAoraW50IHN5c2N0bF9sYXNhdF9ydGMoY3RsX3RhYmxlICp0YWJsZSwKIAkJICAgIHZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAogCQkgICAgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpAQCAtMTQwLDcgKzEzOSw3IEBACiAJcnRjdG1wID0gcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCk7CiAJaWYgKHJ0Y3RtcCA8IDApCiAJCXJ0Y3RtcCA9IDA7Ci0JciA9IHN5c2N0bF9pbnR2ZWModGFibGUsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOworCXIgPSBzeXNjdGxfaW50dmVjKHRhYmxlLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCWlmIChuZXd2YWwgJiYgbmV3bGVuKQpAQCAtMjExLDEzICsyMTAsMTMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHN5c2N0bF9sYXNhdF9wcmlkKGN0bF90YWJsZSAqdGFibGUsIGludCAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgaW50IHN5c2N0bF9sYXNhdF9wcmlkKGN0bF90YWJsZSAqdGFibGUsCiAJCQkJICAgICB2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwKIAkJCQkgICAgIHZvaWQgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlpbnQgcjsKIAotCXIgPSBzeXNjdGxfaW50dmVjKHRhYmxlLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKKwlyID0gc3lzY3RsX2ludHZlYyh0YWJsZSwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHIgPCAwKQogCQlyZXR1cm4gcjsKIAlpZiAobmV3dmFsICYmIG5ld2xlbikgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKaW5kZXggOGQ3Nzg0MS4uNmI4NzZjYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUworKysgYi9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbC5TCkBAIC0zOSwxMiArMzksMTQgQEAKICNpZmRlZiBVU0VfRE9VQkxFCiAKICNkZWZpbmUgTE9BRCAgIGxkCisjZGVmaW5lIExPQUQzMiBsd3UKICNkZWZpbmUgQUREICAgIGRhZGR1CiAjZGVmaW5lIE5CWVRFUyA4CiAKICNlbHNlCiAKICNkZWZpbmUgTE9BRCAgIGx3CisjZGVmaW5lIExPQUQzMiBsdwogI2RlZmluZSBBREQgICAgYWRkdQogI2RlZmluZSBOQllURVMgNAogCkBAIC01MywxMiArNTUsMTQgQEAKICNkZWZpbmUgVU5JVCh1bml0KSAgKCh1bml0KSpOQllURVMpCiAKICNkZWZpbmUgQUREQyhzdW0scmVnKQkJCQkJCVwKLQkuc2V0CXB1c2g7CQkJCQkJXAotCS5zZXQJbm9hdDsJCQkJCQlcCiAJQURECXN1bSwgcmVnOwkJCQkJXAogCXNsdHUJdjEsIHN1bSwgcmVnOwkJCQkJXAogCUFERAlzdW0sIHYxOwkJCQkJXAotCS5zZXQJcG9wCisKKyNkZWZpbmUgQUREQzMyKHN1bSxyZWcpCQkJCQkJXAorCWFkZHUJc3VtLCByZWc7CQkJCQlcCisJc2x0dQl2MSwgc3VtLCByZWc7CQkJCQlcCisJYWRkdQlzdW0sIHYxOwkJCQkJXAogCiAjZGVmaW5lIENTVU1fQklHQ0hVTksxKHNyYywgb2Zmc2V0LCBzdW0sIF90MCwgX3QxLCBfdDIsIF90MykJXAogCUxPQUQJX3QwLCAob2Zmc2V0ICsgVU5JVCgwKSkoc3JjKTsJCQlcCkBAIC0xMzIsNyArMTM2LDcgQEAKIAliZXF6CXQ4LCAuTHF3b3JkX2FsaWduCiAJIGFuZGkJdDgsIHNyYywgMHg4CiAKLQlsdwl0MCwgMHgwMChzcmMpCisJTE9BRDMyCXQwLCAweDAwKHNyYykKIAlMT05HX1NVQlUJYTEsIGExLCAweDQKIAlBRERDKHN1bSwgdDApCiAJUFRSX0FERFUJc3JjLCBzcmMsIDB4NApAQCAtMjExLDcgKzIxNSw3IEBACiAJTE9OR19TUkwJdDgsIHQ4LCAweDIKIAogLkxlbmRfd29yZHM6Ci0JbHcJdDAsIChzcmMpCisJTE9BRDMyCXQwLCAoc3JjKQogCUxPTkdfU1VCVQl0OCwgdDgsIDB4MQogCUFEREMoc3VtLCB0MCkKIAkuc2V0CXJlb3JkZXIJCQkJLyogREFERElfV0FSICovCkBAIC0yMzAsNiArMjM0LDkgQEAKIAkvKiBTdGlsbCBhIGZ1bGwgd29yZCB0byBnbyAgKi8KIAl1bHcJdDEsIChzcmMpCiAJUFRSX0FERElVCXNyYywgNAorI2lmZGVmIFVTRV9ET1VCTEUKKwlkc2xsCXQxLCB0MSwgMzIJCQkvKiBjbGVhciBsb3dlciAzMmJpdCAqLworI2VuZGlmCiAJQUREQyhzdW0sIHQxKQogCiAxOgltb3ZlCXQxLCB6ZXJvCkBAIC0yNTQsOCArMjYxLDYgQEAKIDE6CUFEREMoc3VtLCB0MSkKIAogCS8qIGZvbGQgY2hlY2tzdW0gKi8KLQkuc2V0CXB1c2gKLQkuc2V0CW5vYXQKICNpZmRlZiBVU0VfRE9VQkxFCiAJZHNsbDMyCXYxLCBzdW0sIDAKIAlkYWRkdQlzdW0sIHYxCkBAIC0yNjMsMjQgKzI2OCwyNSBAQAogCWRzcmEzMglzdW0sIHN1bSwgMAogCWFkZHUJc3VtLCB2MQogI2VuZGlmCi0Jc2xsCXYxLCBzdW0sIDE2Ci0JYWRkdQlzdW0sIHYxCi0Jc2x0dQl2MSwgc3VtLCB2MQotCXNybAlzdW0sIHN1bSwgMTYKLQlhZGR1CXN1bSwgdjEKIAogCS8qIG9kZCBidWZmZXIgYWxpZ25tZW50PyAqLwotCWJlcXoJdDcsIDFmCi0JIG5vcAotCXNsbAl2MSwgc3VtLCA4CisjaWZkZWYgQ1BVX01JUFNSMgorCXdzYmgJdjEsIHN1bQorCW1vdm4Jc3VtLCB2MSwgdDcKKyNlbHNlCisJYmVxegl0NywgMWYJCQkvKiBvZGQgYnVmZmVyIGFsaWdubWVudD8gKi8KKwkgbHVpCXYxLCAweDAwZmYKKwlhZGR1CXYxLCAweDAwZmYKKwlhbmQJdDAsIHN1bSwgdjEKKwlzbGwJdDAsIHQwLCA4CiAJc3JsCXN1bSwgc3VtLCA4Ci0Jb3IJc3VtLCB2MQotCWFuZGkJc3VtLCAweGZmZmYKLQkuc2V0CXBvcAorCWFuZAlzdW0sIHN1bSwgdjEKKwlvcglzdW0sIHN1bSwgdDAKIDE6CisjZW5kaWYKIAkuc2V0CXJlb3JkZXIKIAkvKiBBZGQgdGhlIHBhc3NlZCBwYXJ0aWFsIGNzdW0uICAqLwotCUFEREMoc3VtLCBhMikKKwlBRERDMzIoc3VtLCBhMikKIAlqcglyYQogCS5zZXQJbm9yZW9yZGVyCiAJRU5EKGNzdW1fcGFydGlhbCkKQEAgLTY1Niw4ICs2NjIsNiBAQAogCUFEREMoc3VtLCB0MikKIC5MZG9uZToKIAkvKiBmb2xkIGNoZWNrc3VtICovCi0JLnNldAlwdXNoCi0JLnNldAlub2F0CiAjaWZkZWYgVVNFX0RPVUJMRQogCWRzbGwzMgl2MSwgc3VtLCAwCiAJZGFkZHUJc3VtLCB2MQpAQCAtNjY1LDIzICs2NjksMjMgQEAKIAlkc3JhMzIJc3VtLCBzdW0sIDAKIAlhZGR1CXN1bSwgdjEKICNlbmRpZgotCXNsbAl2MSwgc3VtLCAxNgotCWFkZHUJc3VtLCB2MQotCXNsdHUJdjEsIHN1bSwgdjEKLQlzcmwJc3VtLCBzdW0sIDE2Ci0JYWRkdQlzdW0sIHYxCiAKLQkvKiBvZGQgYnVmZmVyIGFsaWdubWVudD8gKi8KLQliZXF6CW9kZCwgMWYKLQkgbm9wCi0Jc2xsCXYxLCBzdW0sIDgKKyNpZmRlZiBDUFVfTUlQU1IyCisJd3NiaAl2MSwgc3VtCisJbW92bglzdW0sIHYxLCBvZGQKKyNlbHNlCisJYmVxeglvZGQsIDFmCQkJLyogb2RkIGJ1ZmZlciBhbGlnbm1lbnQ/ICovCisJIGx1aQl2MSwgMHgwMGZmCisJYWRkdQl2MSwgMHgwMGZmCisJYW5kCXQwLCBzdW0sIHYxCisJc2xsCXQwLCB0MCwgOAogCXNybAlzdW0sIHN1bSwgOAotCW9yCXN1bSwgdjEKLQlhbmRpCXN1bSwgMHhmZmZmCi0JLnNldAlwb3AKKwlhbmQJc3VtLCBzdW0sIHYxCisJb3IJc3VtLCBzdW0sIHQwCiAxOgorI2VuZGlmCiAJLnNldCByZW9yZGVyCi0JQUREQyhzdW0sIHBzdW0pCisJQUREQzMyKHN1bSwgcHN1bSkKIAlqcglyYQogCS5zZXQgbm9yZW9yZGVyCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXIzay5jIGIvYXJjaC9taXBzL21tL2MtcjNrLmMKaW5kZXggMjdhNWI0Ni4uNTUwMGMyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtcjNrLmMKKysrIGIvYXJjaC9taXBzL21tL2MtcjNrLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCWZsdXNoX2NhY2hlX3JhbmdlID0gcjNrX2ZsdXNoX2NhY2hlX3JhbmdlOwogCWZsdXNoX2NhY2hlX3BhZ2UgPSByM2tfZmx1c2hfY2FjaGVfcGFnZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UgPSByM2tfZmx1c2hfaWNhY2hlX3JhbmdlOworCWxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZSA9IHIza19mbHVzaF9pY2FjaGVfcmFuZ2U7CiAKIAlmbHVzaF9jYWNoZV9zaWd0cmFtcCA9IHIza19mbHVzaF9jYWNoZV9zaWd0cmFtcDsKIAlsb2NhbF9mbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSBsb2NhbF9yM2tfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCA3MWRmMzM5Li42ZTk5NjY1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtNTQzLDEyICs1NDMsOCBAQAogCXVuc2lnbmVkIGxvbmcgZW5kOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX3I0a19mbHVzaF9pY2FjaGVfcmFuZ2Uodm9pZCAqYXJncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9yNGtfZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXN0cnVjdCBmbHVzaF9pY2FjaGVfcmFuZ2VfYXJncyAqZmlyX2FyZ3MgPSBhcmdzOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBmaXJfYXJncy0+c3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBmaXJfYXJncy0+ZW5kOwotCiAJaWYgKCFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpIHsKIAkJaWYgKGVuZCAtIHN0YXJ0ID49IGRjYWNoZV9zaXplKSB7CiAJCQlyNGtfYmxhc3RfZGNhY2hlKCk7CkBAIC01NjQsNiArNTYwLDE1IEBACiAJCXByb3RlY3RlZF9ibGFzdF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9yNGtfZmx1c2hfaWNhY2hlX3JhbmdlX2lwaSh2b2lkICphcmdzKQoreworCXN0cnVjdCBmbHVzaF9pY2FjaGVfcmFuZ2VfYXJncyAqZmlyX2FyZ3MgPSBhcmdzOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBmaXJfYXJncy0+c3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBmaXJfYXJncy0+ZW5kOworCisJbG9jYWxfcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKTsKK30KKwogc3RhdGljIHZvaWQgcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgZmx1c2hfaWNhY2hlX3JhbmdlX2FyZ3MgYXJnczsKQEAgLTU3MSw3ICs1NzYsNyBAQAogCWFyZ3Muc3RhcnQgPSBzdGFydDsKIAlhcmdzLmVuZCA9IGVuZDsKIAotCXI0a19vbl9lYWNoX2NwdShsb2NhbF9yNGtfZmx1c2hfaWNhY2hlX3JhbmdlLCAmYXJncywgMSk7CisJcjRrX29uX2VhY2hfY3B1KGxvY2FsX3I0a19mbHVzaF9pY2FjaGVfcmFuZ2VfaXBpLCAmYXJncywgMSk7CiAJaW5zdHJ1Y3Rpb25faGF6YXJkKCk7CiB9CiAKQEAgLTEzNzUsNiArMTM4MCw3IEBACiAJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlCT0gbG9jYWxfcjRrX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZTsKIAlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UJPSByNGtfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwogCWZsdXNoX2ljYWNoZV9yYW5nZQk9IHI0a19mbHVzaF9pY2FjaGVfcmFuZ2U7CisJbG9jYWxfZmx1c2hfaWNhY2hlX3JhbmdlCT0gbG9jYWxfcjRrX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkKIAlpZiAoY29oZXJlbnRpbykgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtdHgzOS5jIGIvYXJjaC9taXBzL21tL2MtdHgzOS5jCmluZGV4IGE5ZjdmMWYuLmY3YzhmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXR4MzkuYworKysgYi9hcmNoL21pcHMvbW0vYy10eDM5LmMKQEAgLTM2Miw2ICszNjIsNyBAQAogCQlmbHVzaF9jYWNoZV9yYW5nZQk9ICh2b2lkICopIHR4MzloX2ZsdXNoX2ljYWNoZV9hbGw7CiAJCWZsdXNoX2NhY2hlX3BhZ2UJPSAodm9pZCAqKSB0eDM5aF9mbHVzaF9pY2FjaGVfYWxsOwogCQlmbHVzaF9pY2FjaGVfcmFuZ2UJPSAodm9pZCAqKSB0eDM5aF9mbHVzaF9pY2FjaGVfYWxsOworCQlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UgPSAodm9pZCAqKSB0eDM5aF9mbHVzaF9pY2FjaGVfYWxsOwogCiAJCWZsdXNoX2NhY2hlX3NpZ3RyYW1wCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKIAkJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKQEAgLTM5MCw2ICszOTEsNyBAQAogCQlmbHVzaF9jYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfY2FjaGVfcmFuZ2U7CiAJCWZsdXNoX2NhY2hlX3BhZ2UgPSB0eDM5X2ZsdXNoX2NhY2hlX3BhZ2U7CiAJCWZsdXNoX2ljYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfaWNhY2hlX3JhbmdlOworCQlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UgPSB0eDM5X2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAogCQlmbHVzaF9jYWNoZV9zaWd0cmFtcCA9IHR4MzlfZmx1c2hfY2FjaGVfc2lndHJhbXA7CiAJCWxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9IGxvY2FsX3R4MzlfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NhY2hlLmMgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwppbmRleCAwMzRlODUwLi4xZWI3YzcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vY2FjaGUuYworKysgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwpAQCAtMjksNiArMjksNyBAQAogdm9pZCAoKmZsdXNoX2NhY2hlX3BhZ2UpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UsCiAJdW5zaWduZWQgbG9uZyBwZm4pOwogdm9pZCAoKmZsdXNoX2ljYWNoZV9yYW5nZSkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwordm9pZCAoKmxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZSkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCiB2b2lkICgqX19mbHVzaF9jYWNoZV92bWFwKSh2b2lkKTsKIHZvaWQgKCpfX2ZsdXNoX2NhY2hlX3Z1bm1hcCkodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiZXguYyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCmluZGV4IDc2ZGE3M2EuLjk3OWNmOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGJleC5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCkBAIC0xMjczLDEwICsxMjczLDEwIEBACiAKIHZvaWQgX19jcHVpbml0IGZsdXNoX3RsYl9oYW5kbGVycyh2b2lkKQogewotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyloYW5kbGVfdGxibCwKKwlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpaGFuZGxlX3RsYmwsCiAJCQkgICAodW5zaWduZWQgbG9uZyloYW5kbGVfdGxibCArIHNpemVvZihoYW5kbGVfdGxibCkpOwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyloYW5kbGVfdGxicywKKwlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpaGFuZGxlX3RsYnMsCiAJCQkgICAodW5zaWduZWQgbG9uZyloYW5kbGVfdGxicyArIHNpemVvZihoYW5kbGVfdGxicykpOwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyloYW5kbGVfdGxibSwKKwlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpaGFuZGxlX3RsYm0sCiAJCQkgICAodW5zaWduZWQgbG9uZyloYW5kbGVfdGxibSArIHNpemVvZihoYW5kbGVfdGxibSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL210aS1tYWx0YS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tdGktbWFsdGEvTWFrZWZpbGUKaW5kZXggM2I3ZGQ3Mi4uY2VmMmRiOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbXRpLW1hbHRhL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw2IEBACiBvYmotJChDT05GSUdfUENJKQkJKz0gbWFsdGEtcGNpLm8KIAogIyBGSVhNRSBGSVhNRSBGSVhNRQotb2JqLSQoQ09ORklHX01JUFNfTVRfU01UQykJKz0gbWFsdGFfc210Yy5vCitvYmotJChDT05GSUdfTUlQU19NVF9TTVRDKQkrPSBtYWx0YS1zbXRjLm8KIAogRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKaW5kZXggNWVhNzA1ZS4uZjg0YTQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKQEAgLTg0LDEyICs4NCwxNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXNtdGNfc21wX3NldHVwKHZvaWQpCiB7Ci0JbWlwc210X2J1aWxkX2NwdV9tYXAoMCk7CisJLyoKKwkgKiB3ZSB3b24ndCBnZXQgdGhlIGRlZmluaXRpdmUgdmFsdWUgdW50aWwKKwkgKiB3ZSd2ZSBydW4gc210Y19wcmVwYXJlX2NwdXMgbGF0ZXIsIGJ1dAorCSAqIHdlIHdvdWxkIGFwcGVhciB0byBuZWVkIGFuIHVwcGVyIGJvdW5kIG5vdy4KKwkgKi8KKwlzbXBfbnVtX3NpYmxpbmdzID0gc210Y19idWlsZF9jcHVfbWFwKDApOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXNtdGNfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKLQltaXBzbXRfcHJlcGFyZV9jcHVzKCk7CisJc210Y19wcmVwYXJlX2NwdXMobWF4X2NwdXMpOwogfQogCiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIG1zbXRjX3NtcF9vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQppbmRleCAxNWUwMWFlLi5iMTg4NjI0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIG9iai0kKENPTkZJR19QQ0lfVlI0MVhYKQkrPSBvcHMtdnI0MXh4Lm8gcGNpLXZyNDF4eC5vCiBvYmotJChDT05GSUdfTUFSS0VJTlMpCQkrPSBvcHMtZW1tYTJyaC5vIHBjaS1lbW1hMnJoLm8gZml4dXAtZW1tYTJyaC5vCiBvYmotJChDT05GSUdfUENJX1RYNDkyNykJKz0gb3BzLXR4NDkyNy5vCitvYmotJChDT05GSUdfQkNNNDdYWCkJCSs9IHBjaS1iY200N3h4Lm8KIAogIwogIyBUaGVzZSBhcmUgc3RpbGwgcHJldHR5IG11Y2ggaW4gdGhlIG9sZCBzdGF0ZSwgd2F0Y2gsIGdvIGJsaW5kLgpAQCAtNDQsNiArNDUsNyBAQAogb2JqLSQoQ09ORklHX1RPU0hJQkFfSk1SMzkyNykJKz0gZml4dXAtam1yMzkyNy5vCiBvYmotJChDT05GSUdfU09DX1RYNDkyNykJKz0gcGNpLXR4NDkyNy5vCiBvYmotJChDT05GSUdfU09DX1RYNDkzOCkJKz0gcGNpLXR4NDkzOC5vCitvYmotJChDT05GSUdfU09DX1RYNDkzOSkJKz0gcGNpLXR4NDkzOS5vCiBvYmotJChDT05GSUdfVE9TSElCQV9SQlRYNDkyNykJKz0gZml4dXAtcmJ0eDQ5Mjcubwogb2JqLSQoQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzgpCSs9IGZpeHVwLXJidHg0OTM4Lm8KIG9iai0kKENPTkZJR19WSUNUT1JfTVBDMzBYKQkrPSBmaXh1cC1tcGMzMHgubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1lbW1hMnJoLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWVtbWEycmguYwppbmRleCBhMjcwNTg5Li44NDZlYWU5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWVtbWEycmguYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWVtbWEycmguYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAKICNpbmNsdWRlIDxhc20vZW1tYTJyaC9lbW1hMnJoLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLXBueDg1NTAuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLXBueDg1NTAuYwppbmRleCAwZTE2MGQ5ZjAuLjFlNjIxM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLXBueDg1NTAuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1wbng4NTUwLmMKQEAgLTI5LDggKzI5LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoLXBueDg1NTAvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtcG54ODU1MC9nbGIuaD4KLSNpbmNsdWRlIDxhc20vZGVidWcuaD4KLQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc3RhdHVzKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1iY200N3h4LmMgYi9hcmNoL21pcHMvcGNpL3BjaS1iY200N3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhOWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWJjbTQ3eHguYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOCBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KKworaW50IF9faW5pdCBwY2liaW9zX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXJldHVybiAwOworfQorCitpbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJlczsKKwl1OCBzbG90LCBwaW47CisKKwlyZXMgPSBzc2JfcGNpYmlvc19wbGF0X2Rldl9pbml0KGRldik7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlBDSTogRmFpbGVkIHRvIGluaXQgZGV2aWNlICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCXJldHVybiByZXM7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJc2xvdCA9IFBDSV9TTE9UKGRldi0+ZGV2Zm4pOworCXJlcyA9IHNzYl9wY2liaW9zX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCisJLyogSVJRLTAgYW5kIElSUS0xIGFyZSBzb2Z0d2FyZSBpbnRlcnJ1cHRzLiAqLworCWlmIChyZXMgPCAyKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICJQQ0k6IEZhaWxlZCB0byBtYXAgSVJRIG9mIGRldmljZSAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gcmVzOworCX0KKworCWRldi0+aXJxID0gcmVzOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1lbW1hMnJoLmMgYi9hcmNoL21pcHMvcGNpL3BjaS1lbW1hMnJoLmMKaW5kZXggZDk5NTkxYS4uNzcyZTI4MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktZW1tYTJyaC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWVtbWEycmguYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAKICNpbmNsdWRlIDxhc20vZW1tYTJyaC9lbW1hMnJoLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwppbmRleCBiZDc4MzY4Li5mOTdhYjE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCkBAIC0xNDMsMjUgKzE0Myw0NyBAQAogICovCiBpbnQgX19kZXZpbml0IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0Jc3RydWN0IGJyaWRnZV9jb250cm9sbGVyICpiYyA9IEJSSURHRV9DT05UUk9MTEVSKGRldi0+YnVzKTsKLQlpbnQgaXJxID0gYmMtPnBjaV9pbnRbc2xvdF07CisJcmV0dXJuIDA7Cit9CiAKLQlpZiAoaXJxID09IC0xKSB7Ci0JCWlycSA9IGJjLT5wY2lfaW50W3Nsb3RdID0gcmVxdWVzdF9icmlkZ2VfaXJxKGJjKTsKLQkJaWYgKGlycSA8IDApCi0JCQlwYW5pYygiQ2FuJ3QgYWxsb2NhdGUgaW50ZXJydXB0IGZvciBQQ0kgZGV2aWNlICVzXG4iLAotCQkJICAgICAgcGNpX25hbWUoZGV2KSk7CisvKiBNb3N0IE1JUFMgc3lzdGVtcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KK3N0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KQoreworCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpicmlkZ2Vfcm9vdF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl3aGlsZSAoZGV2LT5idXMtPnBhcmVudCkgeworCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLworCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKIAl9CiAKLQlpcnFfdG9fYnJpZGdlW2lycV0gPSBiYzsKLQlpcnFfdG9fc2xvdFtpcnFdID0gc2xvdDsKLQotCXJldHVybiBpcnE7CisJcmV0dXJuIGRldjsKIH0KIAogLyogRG8gcGxhdGZvcm0gc3BlY2lmaWMgZGV2aWNlIGluaXRpYWxpemF0aW9uIGF0IHBjaV9lbmFibGVfZGV2aWNlKCkgdGltZSAqLwogaW50IHBjaWJpb3NfcGxhdF9kZXZfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworCXN0cnVjdCBicmlkZ2VfY29udHJvbGxlciAqYmMgPSBCUklER0VfQ09OVFJPTExFUihkZXYtPmJ1cyk7CisJc3RydWN0IHBjaV9kZXYgKnJkZXYgPSBicmlkZ2Vfcm9vdF9kZXYoZGV2KTsKKwlpbnQgc2xvdCA9IFBDSV9TTE9UKHJkZXYtPmRldmZuKTsKKwlpbnQgaXJxOworCisJaXJxID0gYmMtPnBjaV9pbnRbc2xvdF07CisJaWYgKGlycSA9PSAtMSkgeworCQlpcnEgPSByZXF1ZXN0X2JyaWRnZV9pcnEoYmMpOworCQlpZiAoaXJxIDwgMCkKKwkJCXJldHVybiBpcnE7CisKKwkJYmMtPnBjaV9pbnRbc2xvdF0gPSBpcnE7CisJfQorCisJaXJxX3RvX2JyaWRnZVtpcnFdID0gYmM7CisJaXJxX3RvX3Nsb3RbaXJxXSA9IHNsb3Q7CisKKwlkZXYtPmlycSA9IGlycTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS10eDQ5MzguYyBiL2FyY2gvbWlwcy9wY2kvcGNpLXR4NDkzOC5jCmluZGV4IDYwZTJjNTIuLjFlYTI1N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLXR4NDkzOC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLXR4NDkzOC5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlyZXR1cm4gcGNpY2xrOwogfQogCi1pbnQgdHg0OTM4X3BjaWMxX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCkKK2ludCBfX2luaXQgdHg0OTM4X3BjaWMxX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCkKIHsKIAlpZiAoZ2V0X3R4NDkyN19wY2ljcHRyKGRldi0+YnVzLT5zeXNkYXRhKSA9PSB0eDQ5MzhfcGNpYzFwdHIpIHsKIAkJc3dpdGNoIChzbG90KSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS10eDQ5MzkuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLXR4NDkzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZWNmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGNpL3BjaS10eDQ5MzkuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvbWlwcy9wY2kvcGNpLXR4NDkzOS5jCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzkvc2V0dXAuYywKKyAqCSAgICBhbmQgUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogQ29weXJpZ2h0IDIwMDEsIDIwMDMtMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBieSBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCisgKiAoQykgQ29weXJpZ2h0IFRPU0hJQkEgQ09SUE9SQVRJT04gMjAwMC0yMDAxLCAyMDA0LTIwMDcKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9nZW5lcmljLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CisKK2ludCBfX2luaXQgdHg0OTM5X3JlcG9ydF9wY2ljbGsodm9pZCkKK3sKKwlpbnQgcGNpY2xrID0gMDsKKworCXByX2luZm8oIlBDSUMgLS0lcyBQQ0lDTEs6IiwKKwkJKF9fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+Y2NmZykgJiBUWDQ5MzlfQ0NGR19QQ0k2NikgPworCQkiIFBDSTY2IiA6ICIiKTsKKwlpZiAoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnKSAmIFRYNDkzOV9QQ0ZHX1BDSUNMS0VOX0FMTCkgeworCQlwY2ljbGsgPSB0eHg5X21hc3Rlcl9jbG9jayAqIDIwIC8gNjsKKwkJaWYgKCEoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1BDSTY2KSkKKwkJCXBjaWNsayAvPSAyOworCQlwcmludGsoS0VSTl9DT05UICJJbnRlcm5hbCgldS4ldU1IeikiLAorCQkgICAgICAgKHBjaWNsayArIDUwMDAwKSAvIDEwMDAwMDAsCisJCSAgICAgICAoKHBjaWNsayArIDUwMDAwKSAvIDEwMDAwMCkgJSAxMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRXh0ZXJuYWwiKTsKKwkJcGNpY2xrID0gLTE7CisJfQorCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJcmV0dXJuIHBjaWNsazsKK30KKwordm9pZCBfX2luaXQgdHg0OTM5X3JlcG9ydF9wY2kxY2xrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHBjaWNsayA9IHR4eDlfbWFzdGVyX2Nsb2NrICogMjAgLyA2OworCisJcHJfaW5mbygiUENJQzEgLS0gUENJQ0xLOiV1LiV1TUh6XG4iLAorCQkocGNpY2xrICsgNTAwMDApIC8gMTAwMDAwMCwKKwkJKChwY2ljbGsgKyA1MDAwMCkgLyAxMDAwMDApICUgMTApOworfQorCitpbnQgX19pbml0IHR4NDkzOV9wY2ljMV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QpCit7CisJaWYgKGdldF90eDQ5MjdfcGNpY3B0cihkZXYtPmJ1cy0+c3lzZGF0YSkgPT0gdHg0OTM5X3BjaWMxcHRyKSB7CisJCXN3aXRjaCAoc2xvdCkgeworCQljYXNlIFRYNDkyN19QQ0lDX0lEU0VMX0FEX1RPX1NMT1QoMzEpOgorCQkJaWYgKF9fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZykgJgorCQkJICAgIFRYNDkzOV9QQ0ZHX0VUME1PREUpCisJCQkJcmV0dXJuIFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfRVRIKDApOworCQkJYnJlYWs7CisJCWNhc2UgVFg0OTI3X1BDSUNfSURTRUxfQURfVE9fU0xPVCgzMCk6CisJCQlpZiAoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnKSAmCisJCQkgICAgVFg0OTM5X1BDRkdfRVQxTU9ERSkKKwkJCQlyZXR1cm4gVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9FVEgoMSk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgX19pbml0IHR4NDkzOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaW50IGlycSA9IHR4NDkzOV9wY2ljMV9tYXBfaXJxKGRldiwgc2xvdCk7CisKKwlpZiAoaXJxID49IDApCisJCXJldHVybiBpcnE7CisJaXJxID0gcGluOworCS8qIElSUSByb3RhdGlvbiAqLworCWlycS0tOwkvKiAwLTMgKi8KKwlpcnEgPSAoaXJxICsgMzMgLSBzbG90KSAlIDQ7CisJaXJxKys7CS8qIDEtNCAqLworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDE6CisJCWlycSA9IFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfSU5UQTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpcnEgPSBUWFg5X0lSUV9CQVNFICsgVFg0OTM5X0lSX0lOVEI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaXJxID0gVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9JTlRDOworCQlicmVhazsKKwljYXNlIDQ6CisJCWlycSA9IFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfSU5URDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBpcnE7Cit9CisKK3ZvaWQgX19pbml0IHR4NDkzOV9zZXR1cF9wY2llcnJfaXJxKHZvaWQpCit7CisJaWYgKHJlcXVlc3RfaXJxKFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfUENJRVJSLAorCQkJdHg0OTI3X3BjaWVycl9pbnRlcnJ1cHQsCisJCQlJUlFGX0RJU0FCTEVELCAiUENJIGVycm9yIiwKKwkJCSh2b2lkICopVFg0OTM5X1BDSUNfUkVHKSkKKwkJcHJfd2FybmluZygiRmFpbGVkIHRvIHJlcXVlc3QgaXJxIGZvciBQQ0lFUlJcbiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2kuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKaW5kZXggYzdmZTZlYy4uYTM3N2U5ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2kuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS5jCkBAIC0zNCw2ICszNCw4IEBACiB1bnNpZ25lZCBsb25nIFBDSUJJT1NfTUlOX0lPCT0gMHgwMDAwOwogdW5zaWduZWQgbG9uZyBQQ0lCSU9TX01JTl9NRU0JPSAwOwogCitzdGF0aWMgaW50IHBjaV9pbml0aWFsaXplZDsKKwogLyoKICAqIFdlIG5lZWQgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIGBtaXJyb3JlZCcgVkdBIHBvcnRzCiAgKiBhbmQgb3RoZXIgc3RyYW5nZSBJU0EgaGFyZHdhcmUsIHNvIHdlIGFsd2F5cyB3YW50IHRoZQpAQCAtNzQsNiArNzYsNDIgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX3NjYW5idXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXN0YXRpYyBpbnQgbmV4dF9idXNubzsKKwlzdGF0aWMgaW50IG5lZWRfZG9tYWluX2luZm87CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCWlmICghaG9zZS0+aW9tbXUpCisJCVBDSV9ETUFfQlVTX0lTX1BIWVMgPSAxOworCisJaWYgKGhvc2UtPmdldF9idXNubyAmJiBwY2lfcHJvYmVfb25seSkKKwkJbmV4dF9idXNubyA9ICgqaG9zZS0+Z2V0X2J1c25vKSgpOworCisJYnVzID0gcGNpX3NjYW5fYnVzKG5leHRfYnVzbm8sIGhvc2UtPnBjaV9vcHMsIGhvc2UpOworCWhvc2UtPmJ1cyA9IGJ1czsKKworCW5lZWRfZG9tYWluX2luZm8gPSBuZWVkX2RvbWFpbl9pbmZvIHx8IGhvc2UtPmluZGV4OworCWhvc2UtPm5lZWRfZG9tYWluX2luZm8gPSBuZWVkX2RvbWFpbl9pbmZvOworCWlmIChidXMpIHsKKwkJbmV4dF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgKyAxOworCQkvKiBEb24ndCBhbGxvdyA4LWJpdCBidXMgbnVtYmVyIG92ZXJmbG93IGluc2lkZSB0aGUgaG9zZSAtCisJCSAgIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYnJpZGdlcy4gKi8KKwkJaWYgKG5leHRfYnVzbm8gPiAyMjQpIHsKKwkJCW5leHRfYnVzbm8gPSAwOworCQkJbmVlZF9kb21haW5faW5mbyA9IDE7CisJCX0KKworCQlpZiAoIXBjaV9wcm9iZV9vbmx5KSB7CisJCQlwY2lfYnVzX3NpemVfYnJpZGdlcyhidXMpOworCQkJcGNpX2J1c19hc3NpZ25fcmVzb3VyY2VzKGJ1cyk7CisJCQlwY2lfZW5hYmxlX2JyaWRnZXMoYnVzKTsKKwkJfQorCX0KK30KKworc3RhdGljIERFRklORV9NVVRFWChwY2lfc2Nhbl9tdXRleCk7CisKIHZvaWQgX19kZXZpbml0IHJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKIHsKIAlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGhvc2UtPm1lbV9yZXNvdXJjZSkgPCAwKQpAQCAtOTMsNiArMTMxLDE3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJyZWdpc3RlcmluZyBQQ0kgY29udHJvbGxlciB3aXRoIGlvX21hcF9iYXNlIHVuc2V0XG4iKTsKIAl9CisKKwkvKgorCSAqIFNjYW4gdGhlIGJ1cyBpZiBpdCBpcyByZWdpc3RlciBhZnRlciB0aGUgUENJIHN1YnN5c3RlbQorCSAqIGluaXRpYWxpemF0aW9uLgorCSAqLworCWlmIChwY2lfaW5pdGlhbGl6ZWQpIHsKKwkJbXV0ZXhfbG9jaygmcGNpX3NjYW5fbXV0ZXgpOworCQlwY2liaW9zX3NjYW5idXMoaG9zZSk7CisJCW11dGV4X3VubG9jaygmcGNpX3NjYW5fbXV0ZXgpOworCX0KKwogCXJldHVybjsKIAogb3V0OgpAQCAtMTI1LDM4ICsxNzQsMTUgQEAKIHN0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCWludCBuZXh0X2J1c25vOwotCWludCBuZWVkX2RvbWFpbl9pbmZvID0gMDsKIAogCS8qIFNjYW4gYWxsIG9mIHRoZSByZWNvcmRlZCBQQ0kgY29udHJvbGxlcnMuICAqLwotCWZvciAobmV4dF9idXNubyA9IDAsIGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJZm9yIChob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkKKwkJcGNpYmlvc19zY2FuYnVzKGhvc2UpOwogCi0JCWlmICghaG9zZS0+aW9tbXUpCi0JCQlQQ0lfRE1BX0JVU19JU19QSFlTID0gMTsKLQotCQlpZiAoaG9zZS0+Z2V0X2J1c25vICYmIHBjaV9wcm9iZV9vbmx5KQotCQkJbmV4dF9idXNubyA9ICgqaG9zZS0+Z2V0X2J1c25vKSgpOwotCi0JCWJ1cyA9IHBjaV9zY2FuX2J1cyhuZXh0X2J1c25vLCBob3NlLT5wY2lfb3BzLCBob3NlKTsKLQkJaG9zZS0+YnVzID0gYnVzOwotCQluZWVkX2RvbWFpbl9pbmZvID0gbmVlZF9kb21haW5faW5mbyB8fCBob3NlLT5pbmRleDsKLQkJaG9zZS0+bmVlZF9kb21haW5faW5mbyA9IG5lZWRfZG9tYWluX2luZm87Ci0JCWlmIChidXMpIHsKLQkJCW5leHRfYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlICsgMTsKLQkJCS8qIERvbid0IGFsbG93IDgtYml0IGJ1cyBudW1iZXIgb3ZlcmZsb3cgaW5zaWRlIHRoZSBob3NlIC0KLQkJCSAgIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYnJpZGdlcy4gKi8KLQkJCWlmIChuZXh0X2J1c25vID4gMjI0KSB7Ci0JCQkJbmV4dF9idXNubyA9IDA7Ci0JCQkJbmVlZF9kb21haW5faW5mbyA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIXBjaV9wcm9iZV9vbmx5KQotCQlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CiAJcGNpX2ZpeHVwX2lycXMoY29tbW9uX3N3aXp6bGUsIHBjaWJpb3NfbWFwX2lycSk7CiAKKwlwY2lfaW5pdGlhbGl6ZWQgPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvTWFrZWZpbGUgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L01ha2VmaWxlCmluZGV4IDRiYmE3OWMuLmUxMDdmNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIG9iai15ICs9IG1zcF9wcm9tLm8gbXNwX3NldHVwLm8gbXNwX2lycS5vIFwKIAkgbXNwX3RpbWUubyBtc3Bfc2VyaWFsLm8gbXNwX2VsYi5vCitvYmotJChDT05GSUdfSEFWRV9HUElPX0xJQikgKz0gZ3Bpby5vIGdwaW9fZXh0ZW5kZWQubwogb2JqLSQoQ09ORklHX1BNQ19NU1A3MTIwX0dXKSArPSBtc3BfaHdidXR0b24ubwogb2JqLSQoQ09ORklHX0lSUV9NU1BfU0xQKSArPSBtc3BfaXJxX3NscC5vCiBvYmotJChDT05GSUdfSVJRX01TUF9DSUMpICs9IG1zcF9pcnFfY2ljLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpby5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4NDhjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpby5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQGZpbGUgL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpby5jCisgKgorICogR2VuZXJpYyBQTUMgTVNQNzF4eCBHUElPIGhhbmRsaW5nLiBUaGVzZSBiYXNlIGdwaW8gYXJlIGNvbnRyb2xsZWQgYnkgdHdvCisgKiB0eXBlcyBvZiByZWdpc3RlcnMuIFRoZSBkYXRhIHJlZ2lzdGVyIHNldHMgdGhlIG91dHB1dCBsZXZlbCB3aGVuIGluIG91dHB1dAorICogbW9kZSBhbmQgd2hlbiBpbiBpbnB1dCBtb2RlIHdpbGwgY29udGFpbiB0aGUgdmFsdWUgYXQgdGhlIGlucHV0LiBUaGUgY29uZmlnCisgKiByZWdpc3RlciBzZXRzIHRoZSB2YXJpb3VzIG1vZGVzIGZvciBlYWNoIGdwaW8uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgR2xhc3MgPHBhdHJpY2tnbGFzc0BnbWFpbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIE1TUDcxWFhfQ0ZHX09GRlNFVChncGlvKQkoNCAqIChncGlvKSkKKyNkZWZpbmUgQ09ORl9NQVNLCQkJMHgwRgorI2RlZmluZSBNU1A3MVhYX0dQSU9fSU5QVVQJCTB4MDEKKyNkZWZpbmUgTVNQNzFYWF9HUElPX09VVFBVVAkJMHgwOAorCisjZGVmaW5lIE1TUDcxWFhfR1BJT19CQVNFCQkweDBCODQwMDAwMEwKKworI2RlZmluZSB0b19tc3A3MXh4X2dwaW9fY2hpcChjKSBjb250YWluZXJfb2YoYywgc3RydWN0IG1zcDcxeHhfZ3Bpb19jaGlwLCBjaGlwKQorCitzdGF0aWMgc3BpbmxvY2tfdCBncGlvX2xvY2s7CisKKy8qCisgKiBzdHJ1Y3QgbXNwNzF4eF9ncGlvX2NoaXAgLSBjb250YWluZXIgZm9yIGdwaW8gY2hpcCBhbmQgcmVnaXN0ZXJzCisgKiBAY2hpcDogY2hpcCBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgZ3BpbyBiYW5rCisgKiBAZGF0YV9yZWc6IHJlZ2lzdGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBncGlvIHBpbiB2YWx1ZQorICogQGNvbmZpZ19yZWc6IHJlZ2lzdGVyIHRvIHNldCB0aGUgbW9kZSBmb3IgdGhlIGdwaW8gcGluIGJhbmsKKyAqIEBvdXRfZHJpdmVfcmVnOiByZWdpc3RlciB0byBzZXQgdGhlIG91dHB1dCBkcml2ZSBtb2RlIGZvciB0aGUgZ3BpbyBwaW4gYmFuaworICovCitzdHJ1Y3QgbXNwNzF4eF9ncGlvX2NoaXAgeworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwl2b2lkIF9faW9tZW0gKmRhdGFfcmVnOworCXZvaWQgX19pb21lbSAqY29uZmlnX3JlZzsKKwl2b2lkIF9faW9tZW0gKm91dF9kcml2ZV9yZWc7Cit9OworCisvKgorICogbXNwNzF4eF9ncGlvX2dldCgpIC0gcmV0dXJuIHRoZSBjaGlwJ3MgZ3BpbyB2YWx1ZQorICogQGNoaXA6IGNoaXAgc3RydWN0dXJlIHdoaWNoIGNvbnRyb2xzIHRoZSBzcGVjaWZpZWQgZ3BpbworICogQG9mZnNldDogZ3BpbyB3aG9zZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkCisgKgorICogSXQgd2lsbCByZXR1cm4gMCBpZiBncGlvIHZhbHVlIGlzIGxvdyBhbmQgb3RoZXIgaWYgaGlnaC4KKyAqLworc3RhdGljIGludCBtc3A3MXh4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbXNwNzF4eF9ncGlvX2NoaXAgKm1zcF9jaGlwID0gdG9fbXNwNzF4eF9ncGlvX2NoaXAoY2hpcCk7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwobXNwX2NoaXAtPmRhdGFfcmVnKSAmICgxIDw8IG9mZnNldCk7Cit9CisKKy8qCisgKiBtc3A3MXh4X2dwaW9fc2V0KCkgLSBzZXQgdGhlIG91dHB1dCB2YWx1ZSBmb3IgdGhlIGdwaW8KKyAqIEBjaGlwOiBjaGlwIHN0cnVjdHVyZSB3aG8gY29udHJvbHMgdGhlIHNwZWNpZmllZCBncGlvCisgKiBAb2Zmc2V0OiBncGlvIHdob3NlIHZhbHVlIHdpbGwgYmUgYXNzaWduZWQKKyAqIEB2YWx1ZTogbG9naWMgbGV2ZWwgdG8gYXNzaWduIHRvIHRoZSBncGlvIGluaXRpYWxseQorICoKKyAqIFRoaXMgd2lsbCBzZXQgdGhlIGdwaW8gYml0IHNwZWNpZmllZCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gSXQgd2lsbCBzZXQgdGhlCisgKiBncGlvIHBpbiBsb3cgaWYgdmFsdWUgaXMgMCBvdGhlcndpc2UgaXQgd2lsbCBiZSBoaWdoLgorICovCitzdGF0aWMgdm9pZCBtc3A3MXh4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBtc3A3MXh4X2dwaW9fY2hpcCAqbXNwX2NoaXAgPSB0b19tc3A3MXh4X2dwaW9fY2hpcChjaGlwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJZGF0YSA9IF9fcmF3X3JlYWRsKG1zcF9jaGlwLT5kYXRhX3JlZyk7CisJaWYgKHZhbHVlKQorCQlkYXRhIHw9ICgxIDw8IG9mZnNldCk7CisJZWxzZQorCQlkYXRhICY9IH4oMSA8PCBvZmZzZXQpOworCV9fcmF3X3dyaXRlbChkYXRhLCBtc3BfY2hpcC0+ZGF0YV9yZWcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBtc3A3MXh4X3NldF9ncGlvX21vZGUoKSAtIGRlY2xhcmUgdGhlIG1vZGUgZm9yIGEgZ3BpbworICogQGNoaXA6IGNoaXAgc3RydWN0dXJlIHdoaWNoIGNvbnRyb2xzIHRoZSBzcGVjaWZpZWQgZ3BpbworICogQG9mZnNldDogZ3BpbyB3aG9zZSB2YWx1ZSB3aWxsIGJlIGFzc2lnbmVkCisgKiBAbW9kZTogZGVzaXJlZCBjb25maWd1cmF0aW9uIGZvciB0aGUgZ3BpbyAoc2VlIGRhdGFzaGVldCkKKyAqCisgKiBJdCB3aWxsIHNldCB0aGUgZ3BpbyBwaW4gY29uZmlnIHRvIHRoZSBAbW9kZSB2YWx1ZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgbXNwNzF4eF9zZXRfZ3Bpb19tb2RlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJIHVuc2lnbmVkIG9mZnNldCwgaW50IG1vZGUpCit7CisJc3RydWN0IG1zcDcxeHhfZ3Bpb19jaGlwICptc3BfY2hpcCA9IHRvX21zcDcxeHhfZ3Bpb19jaGlwKGNoaXApOworCWNvbnN0IHVuc2lnbmVkIGJpdF9vZmZzZXQgPSBNU1A3MVhYX0NGR19PRkZTRVQob2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjZmc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwljZmcgPSBfX3Jhd19yZWFkbChtc3BfY2hpcC0+Y29uZmlnX3JlZyk7CisJY2ZnICY9IH4oQ09ORl9NQVNLIDw8IGJpdF9vZmZzZXQpOworCWNmZyB8PSAobW9kZSA8PCBiaXRfb2Zmc2V0KTsKKwlfX3Jhd193cml0ZWwoY2ZnLCBtc3BfY2hpcC0+Y29uZmlnX3JlZyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogbXNwNzF4eF9kaXJlY3Rpb25fb3V0cHV0KCkgLSBkZWNsYXJlIHRoZSBkaXJlY3Rpb24gbW9kZSBmb3IgYSBncGlvCisgKiBAY2hpcDogY2hpcCBzdHJ1Y3R1cmUgd2hpY2ggY29udHJvbHMgdGhlIHNwZWNpZmllZCBncGlvCisgKiBAb2Zmc2V0OiBncGlvIHdob3NlIHZhbHVlIHdpbGwgYmUgYXNzaWduZWQKKyAqIEB2YWx1ZTogbG9naWMgbGV2ZWwgdG8gYXNzaWduIHRvIHRoZSBncGlvIGluaXRpYWxseQorICoKKyAqIFRoaXMgY2FsbCB3aWxsIHNldCB0aGUgbW9kZSBmb3IgdGhlIEBncGlvIHRvIG91dHB1dC4gSXQgd2lsbCBzZXQgdGhlCisgKiBncGlvIHBpbiBsb3cgaWYgdmFsdWUgaXMgMCBvdGhlcndpc2UgaXQgd2lsbCBiZSBoaWdoLgorICovCitzdGF0aWMgaW50IG1zcDcxeHhfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwltc3A3MXh4X2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIG1zcDcxeHhfc2V0X2dwaW9fbW9kZShjaGlwLCBvZmZzZXQsIE1TUDcxWFhfR1BJT19PVVRQVVQpOworfQorCisvKgorICogbXNwNzF4eF9kaXJlY3Rpb25faW5wdXQoKSAtIGRlY2xhcmUgdGhlIGRpcmVjdGlvbiBtb2RlIGZvciBhIGdwaW8KKyAqIEBjaGlwOiBjaGlwIHN0cnVjdHVyZSB3aGljaCBjb250cm9scyB0aGUgc3BlY2lmaWVkIGdwaW8KKyAqIEBvZmZzZXQ6IGdwaW8gd2hvc2UgdG8gd2hpY2ggdGhlIHZhbHVlIHdpbGwgYmUgYXNzaWduZWQKKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBzZXQgdGhlIG1vZGUgZm9yIHRoZSBAZ3BpbyB0byBpbnB1dC4KKyAqLworc3RhdGljIGludCBtc3A3MXh4X2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIG1zcDcxeHhfc2V0X2dwaW9fbW9kZShjaGlwLCBvZmZzZXQsIE1TUDcxWFhfR1BJT19JTlBVVCk7Cit9CisKKy8qCisgKiBtc3A3MXh4X3NldF9vdXRwdXRfZHJpdmUoKSAtIGRlY2xhcmUgdGhlIG91dHB1dCBkcml2ZSBmb3IgdGhlIGdwaW8gbGluZQorICogQGdwaW86IGdwaW8gcGluIHdob3NlIG91dHB1dCBkcml2ZSB5b3Ugd2lzaCB0byBtb2RpZnkKKyAqIEB2YWx1ZTogemVybyBmb3IgYWN0aXZlIGRyYWluIDEgZm9yIG9wZW4gZHJhaW4gZHJpdmUKKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBzZXQgdGhlIG91dHB1dCBkcml2ZSBtb2RlIGZvciB0aGUgQGdwaW8gdG8gb3V0cHV0LgorICovCitpbnQgbXNwNzF4eF9zZXRfb3V0cHV0X2RyaXZlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBkYXRhOworCisJaWYgKGdwaW8gPiAxNSB8fCBncGlvIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlkYXRhID0gX19yYXdfcmVhZGwoKHZvaWQgX19pb21lbSAqKShNU1A3MVhYX0dQSU9fQkFTRSArIDB4MTkwKSk7CisJaWYgKHZhbHVlKQorCQlkYXRhIHw9ICgxIDw8IGdwaW8pOworCWVsc2UKKwkJZGF0YSAmPSB+KDEgPDwgZ3Bpbyk7CisJX19yYXdfd3JpdGVsKGRhdGEsICh2b2lkIF9faW9tZW0gKikoTVNQNzFYWF9HUElPX0JBU0UgKyAweDE5MCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXNwNzF4eF9zZXRfb3V0cHV0X2RyaXZlKTsKKworI2RlZmluZSBNU1A3MVhYX0dQSU9fQkFOSyhuYW1lLCBkciwgY3IsIGJhc2VfZ3BpbywgbnVtX2dwaW8pIFwKK3sgXAorCS5jaGlwID0geyBcCisJCS5sYWJlbAkJICA9IG5hbWUsIFwKKwkJLmRpcmVjdGlvbl9pbnB1dCAgPSBtc3A3MXh4X2RpcmVjdGlvbl9pbnB1dCwgXAorCQkuZGlyZWN0aW9uX291dHB1dCA9IG1zcDcxeHhfZGlyZWN0aW9uX291dHB1dCwgXAorCQkuZ2V0CQkgID0gbXNwNzF4eF9ncGlvX2dldCwgXAorCQkuc2V0CQkgID0gbXNwNzF4eF9ncGlvX3NldCwgXAorCQkuYmFzZQkJICA9IGJhc2VfZ3BpbywgXAorCQkubmdwaW8JCSAgPSBudW1fZ3BpbyBcCisJfSwgXAorCS5kYXRhX3JlZwk9ICh2b2lkIF9faW9tZW0gKikoTVNQNzFYWF9HUElPX0JBU0UgKyBkciksIFwKKwkuY29uZmlnX3JlZwk9ICh2b2lkIF9faW9tZW0gKikoTVNQNzFYWF9HUElPX0JBU0UgKyBjciksIFwKKwkub3V0X2RyaXZlX3JlZwk9ICh2b2lkIF9faW9tZW0gKikoTVNQNzFYWF9HUElPX0JBU0UgKyAweDE5MCksIFwKK30KKworLyoKKyAqIHN0cnVjdCBtc3A3MXh4X2dwaW9fYmFua3NbXSAtIGNvbnRhaW5lciBhcnJheSBvZiBncGlvIGJhbmtzCisgKiBAY2hpcDogY2hpcCBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgZ3BpbyBiYW5rCisgKiBAZGF0YV9yZWc6IHJlZ2lzdGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBncGlvIHBpbiB2YWx1ZQorICogQGNvbmZpZ19yZWc6IHJlZ2lzdGVyIHRvIHNldCB0aGUgbW9kZSBmb3IgdGhlIGdwaW8gcGluIGJhbmsKKyAqCisgKiBUaGlzIGFycmF5IHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBncGlvIGJhbmtzIGZvciB0aGUgUE1DIE1JUFMgUHJvY2Vzc29yLgorICogV2Ugc3BlY2lmeSB0aGUgYmFuayBuYW1lLCB0aGUgZGF0YSByZWdpc3RlciwgdGhlIGNvbmZpZyByZWdpc3RlciwgYmFzZQorICogc3RhcnRpbmcgZ3BpbyBudW1iZXIsIGFuZCB0aGUgbnVtYmVyIG9mIGdwaW9zIGV4cG9zZWQgYnkgdGhlIGJhbmsuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXNwNzF4eF9ncGlvX2NoaXAgbXNwNzF4eF9ncGlvX2JhbmtzW10gPSB7CisKKwlNU1A3MVhYX0dQSU9fQkFOSygiR1BJT18xXzAiLCAweDE3MCwgMHgxODAsIDAsIDIpLAorCU1TUDcxWFhfR1BJT19CQU5LKCJHUElPXzVfMiIsIDB4MTc0LCAweDE4NCwgMiwgNCksCisJTVNQNzFYWF9HUElPX0JBTksoIkdQSU9fOV82IiwgMHgxNzgsIDB4MTg4LCA2LCA0KSwKKwlNU1A3MVhYX0dQSU9fQkFOSygiR1BJT18xNV8xMCIsIDB4MTdDLCAweDE4QywgMTAsIDYpLAorfTsKKwordm9pZCBfX2luaXQgbXNwNzF4eF9pbml0X2dwaW8odm9pZCkKK3sKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCZncGlvX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNwNzF4eF9ncGlvX2JhbmtzKTsgaSsrKQorCQlncGlvY2hpcF9hZGQoJm1zcDcxeHhfZ3Bpb19iYW5rc1tpXS5jaGlwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpb19leHRlbmRlZC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9ncGlvX2V4dGVuZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2ZGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpb19leHRlbmRlZC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQGZpbGUgL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvZ3Bpb19leHRlbmRlZC5jCisgKgorICogR2VuZXJpYyBQTUMgTVNQNzF4eCBFWFRFTkRFRCAoRVhEKSBHUElPIGhhbmRsaW5nLiBUaGUgZXh0ZW5kZWQgZ3BpbyBpcworICogYSBzZXQgb2YgaGFyZHdhcmUgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBubyBuZWVkIGZvciBleHBsaWNpdCBsb2NraW5nIGFzCisgKiBpdCBpcyBoYW5kbGVkIGJ5IHVuaXF1ZSBtZXRob2Qgb2Ygd3JpdGluZyBpbmRpdmlkdWFsIHNldC9jbHIgYml0cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBHbGFzcyA8cGF0cmlja2dsYXNzQGdtYWlsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIE1TUDcxWFhfREFUQV9PRkZTRVQoZ3BpbykJKDIgKiAoZ3BpbykpCisjZGVmaW5lIE1TUDcxWFhfUkVBRF9PRkZTRVQoZ3BpbykJKE1TUDcxWFhfREFUQV9PRkZTRVQoZ3BpbykgKyAxKQorI2RlZmluZSBNU1A3MVhYX0NGR19PVVRfT0ZGU0VUKGdwaW8pCShNU1A3MVhYX0RBVEFfT0ZGU0VUKGdwaW8pICsgMTYpCisjZGVmaW5lIE1TUDcxWFhfQ0ZHX0lOX09GRlNFVChncGlvKQkoTVNQNzFYWF9DRkdfT1VUX09GRlNFVChncGlvKSArIDEpCisKKyNkZWZpbmUgTVNQNzFYWF9FWERfR1BJT19CQVNFCTB4MEJDMDAwMDAwTAorCisjZGVmaW5lIHRvX21zcDcxeHhfZXhkX2dwaW9fY2hpcChjKSBcCisJCQljb250YWluZXJfb2YoYywgc3RydWN0IG1zcDcxeHhfZXhkX2dwaW9fY2hpcCwgY2hpcCkKKworLyoKKyAqIHN0cnVjdCBtc3A3MXh4X2V4ZF9ncGlvX2NoaXAgLSBjb250YWluZXIgZm9yIGdwaW8gY2hpcCBhbmQgcmVnaXN0ZXJzCisgKiBAY2hpcDogY2hpcCBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgZ3BpbyBiYW5rCisgKiBAcmVnOiByZWdpc3RlciBmb3IgY29udHJvbCBhbmQgZGF0YSBvZiBncGlvIHBpbgorICovCitzdHJ1Y3QgbXNwNzF4eF9leGRfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJdm9pZCBfX2lvbWVtICpyZWc7Cit9OworCisvKgorICogbXNwNzF4eF9leGRfZ3Bpb19nZXQoKSAtIHJldHVybiB0aGUgY2hpcCdzIGdwaW8gdmFsdWUKKyAqIEBjaGlwOiBjaGlwIHN0cnVjdHVyZSB3aGljaCBjb250cm9scyB0aGUgc3BlY2lmaWVkIGdwaW8KKyAqIEBvZmZzZXQ6IGdwaW8gd2hvc2UgdmFsdWUgd2lsbCBiZSByZXR1cm5lZAorICoKKyAqIEl0IHdpbGwgcmV0dXJuIDAgaWYgZ3BpbyB2YWx1ZSBpcyBsb3cgYW5kIG90aGVyIGlmIGhpZ2guCisgKi8KK3N0YXRpYyBpbnQgbXNwNzF4eF9leGRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtc3A3MXh4X2V4ZF9ncGlvX2NoaXAgKm1zcDcxeHhfY2hpcCA9CisJICAgIHRvX21zcDcxeHhfZXhkX2dwaW9fY2hpcChjaGlwKTsKKwljb25zdCB1bnNpZ25lZCBiaXQgPSBNU1A3MVhYX1JFQURfT0ZGU0VUKG9mZnNldCk7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwobXNwNzF4eF9jaGlwLT5yZWcpICYgKDEgPDwgYml0KTsKK30KKworLyoKKyAqIG1zcDcxeHhfZXhkX2dwaW9fc2V0KCkgLSBzZXQgdGhlIG91dHB1dCB2YWx1ZSBmb3IgdGhlIGdwaW8KKyAqIEBjaGlwOiBjaGlwIHN0cnVjdHVyZSB3aG8gY29udHJvbHMgdGhlIHNwZWNpZmllZCBncGlvCisgKiBAb2Zmc2V0OiBncGlvIHdob3NlIHZhbHVlIHdpbGwgYmUgYXNzaWduZWQKKyAqIEB2YWx1ZTogbG9naWMgbGV2ZWwgdG8gYXNzaWduIHRvIHRoZSBncGlvIGluaXRpYWxseQorICoKKyAqIFRoaXMgd2lsbCBzZXQgdGhlIGdwaW8gYml0IHNwZWNpZmllZCB0byB0aGUgZGVzaXJlZCB2YWx1ZS4gSXQgd2lsbCBzZXQgdGhlCisgKiBncGlvIHBpbiBsb3cgaWYgdmFsdWUgaXMgMCBvdGhlcndpc2UgaXQgd2lsbCBiZSBoaWdoLgorICovCitzdGF0aWMgdm9pZCBtc3A3MXh4X2V4ZF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNwNzF4eF9leGRfZ3Bpb19jaGlwICptc3A3MXh4X2NoaXAgPQorCSAgICB0b19tc3A3MXh4X2V4ZF9ncGlvX2NoaXAoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgYml0ID0gTVNQNzFYWF9EQVRBX09GRlNFVChvZmZzZXQpOworCisJX19yYXdfd3JpdGVsKDEgPDwgKGJpdCArICh2YWx1ZSA/IDEgOiAwKSksIG1zcDcxeHhfY2hpcC0+cmVnKTsKK30KKworLyoKKyAqIG1zcDcxeHhfZXhkX2RpcmVjdGlvbl9vdXRwdXQoKSAtIGRlY2xhcmUgdGhlIGRpcmVjdGlvbiBtb2RlIGZvciBhIGdwaW8KKyAqIEBjaGlwOiBjaGlwIHN0cnVjdHVyZSB3aGljaCBjb250cm9scyB0aGUgc3BlY2lmaWVkIGdwaW8KKyAqIEBvZmZzZXQ6IGdwaW8gd2hvc2UgdmFsdWUgd2lsbCBiZSBhc3NpZ25lZAorICogQHZhbHVlOiBsb2dpYyBsZXZlbCB0byBhc3NpZ24gdG8gdGhlIGdwaW8gaW5pdGlhbGx5CisgKgorICogVGhpcyBjYWxsIHdpbGwgc2V0IHRoZSBtb2RlIGZvciB0aGUgQGdwaW8gdG8gb3V0cHV0LiBJdCB3aWxsIHNldCB0aGUKKyAqIGdwaW8gcGluIGxvdyBpZiB2YWx1ZSBpcyAwIG90aGVyd2lzZSBpdCB3aWxsIGJlIGhpZ2guCisgKi8KK3N0YXRpYyBpbnQgbXNwNzF4eF9leGRfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNwNzF4eF9leGRfZ3Bpb19jaGlwICptc3A3MXh4X2NoaXAgPQorCSAgICB0b19tc3A3MXh4X2V4ZF9ncGlvX2NoaXAoY2hpcCk7CisKKwltc3A3MXh4X2V4ZF9ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlfX3Jhd193cml0ZWwoMSA8PCBNU1A3MVhYX0NGR19PVVRfT0ZGU0VUKG9mZnNldCksIG1zcDcxeHhfY2hpcC0+cmVnKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1zcDcxeHhfZXhkX2RpcmVjdGlvbl9pbnB1dCgpIC0gZGVjbGFyZSB0aGUgZGlyZWN0aW9uIG1vZGUgZm9yIGEgZ3BpbworICogQGNoaXA6IGNoaXAgc3RydWN0dXJlIHdoaWNoIGNvbnRyb2xzIHRoZSBzcGVjaWZpZWQgZ3BpbworICogQG9mZnNldDogZ3BpbyB3aG9zZSB0byB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBhc3NpZ25lZAorICoKKyAqIFRoaXMgY2FsbCB3aWxsIHNldCB0aGUgbW9kZSBmb3IgdGhlIEBncGlvIHRvIGlucHV0LgorICovCitzdGF0aWMgaW50IG1zcDcxeHhfZXhkX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1zcDcxeHhfZXhkX2dwaW9fY2hpcCAqbXNwNzF4eF9jaGlwID0KKwkgICAgdG9fbXNwNzF4eF9leGRfZ3Bpb19jaGlwKGNoaXApOworCisJX19yYXdfd3JpdGVsKDEgPDwgTVNQNzFYWF9DRkdfSU5fT0ZGU0VUKG9mZnNldCksIG1zcDcxeHhfY2hpcC0+cmVnKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNU1A3MVhYX0VYRF9HUElPX0JBTksobmFtZSwgZXhkX3JlZywgYmFzZV9ncGlvLCBudW1fZ3BpbykgXAoreyBcCisJLmNoaXAgPSB7IFwKKwkJLmxhYmVsCQkgID0gbmFtZSwgXAorCQkuZGlyZWN0aW9uX2lucHV0ICA9IG1zcDcxeHhfZXhkX2RpcmVjdGlvbl9pbnB1dCwgXAorCQkuZGlyZWN0aW9uX291dHB1dCA9IG1zcDcxeHhfZXhkX2RpcmVjdGlvbl9vdXRwdXQsIFwKKwkJLmdldAkJICA9IG1zcDcxeHhfZXhkX2dwaW9fZ2V0LCBcCisJCS5zZXQJCSAgPSBtc3A3MXh4X2V4ZF9ncGlvX3NldCwgXAorCQkuYmFzZQkJICA9IGJhc2VfZ3BpbywgXAorCQkubmdwaW8JCSAgPSBudW1fZ3BpbywgXAorCX0sIFwKKwkucmVnCT0gKHZvaWQgX19pb21lbSAqKShNU1A3MVhYX0VYRF9HUElPX0JBU0UgKyBleGRfcmVnKSwgXAorfQorCisvKgorICogc3RydWN0IG1zcDcxeHhfZXhkX2dwaW9fYmFua3NbXSAtIGNvbnRhaW5lciBhcnJheSBvZiBncGlvIGJhbmtzCisgKiBAY2hpcDogY2hpcCBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpZWQgZ3BpbyBiYW5rCisgKiBAcmVnOiByZWdpc3RlciBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgZ3BpbyBwaW4gdmFsdWUKKyAqCisgKiBUaGlzIGFycmF5IHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBleHRlbmRlZCBncGlvIGJhbmtzIGZvciB0aGUKKyAqIFBNQyBNSVBTIFByb2Nlc3Nvci4gV2Ugc3BlY2lmeSB0aGUgYmFuayBuYW1lLCB0aGUgZGF0YS9jb25maWcKKyAqIHJlZ2lzdGVyLHRoZSBiYXNlIHN0YXJ0aW5nIGdwaW8gbnVtYmVyLCBhbmQgdGhlIG51bWJlciBvZgorICogZ3Bpb3MgZXhwb3NlZCBieSB0aGUgYmFuayBvZiBncGlvcy4KKyAqLworc3RhdGljIHN0cnVjdCBtc3A3MXh4X2V4ZF9ncGlvX2NoaXAgbXNwNzF4eF9leGRfZ3Bpb19iYW5rc1tdID0geworCisJTVNQNzFYWF9FWERfR1BJT19CQU5LKCJHUElPXzIzXzE2IiwgMHgxODgsIDE2LCA4KSwKKwlNU1A3MVhYX0VYRF9HUElPX0JBTksoIkdQSU9fMjdfMjQiLCAweDE4QywgMjQsIDQpLAorfTsKKwordm9pZCBfX2luaXQgbXNwNzF4eF9pbml0X2dwaW9fZXh0ZW5kZWQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zcDcxeHhfZXhkX2dwaW9fYmFua3MpOyBpKyspCisJCWdwaW9jaGlwX2FkZCgmbXNwNzF4eF9leGRfZ3Bpb19iYW5rc1tpXS5jaGlwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYjUzMi9kZXZpY2VzLmMgYi9hcmNoL21pcHMvcmI1MzIvZGV2aWNlcy5jCmluZGV4IDgyYWIzOTUuLjMxNjE5YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9yYjUzMi9kZXZpY2VzLmMKKysrIGIvYXJjaC9taXBzL3JiNTMyL2RldmljZXMuYwpAQCAtMzQsMjEgKzM0LDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvaW50ZWcuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1yYzMyNDM0L2dwaW8uaD4KLQotI2RlZmluZSBFVEgwX0RNQV9SWF9JUlEgICAJKEdST1VQMV9JUlFfQkFTRSArIDApCi0jZGVmaW5lIEVUSDBfRE1BX1RYX0lSUSAgIAkoR1JPVVAxX0lSUV9CQVNFICsgMSkKLSNkZWZpbmUgRVRIMF9SWF9PVlJfSVJRICAgCShHUk9VUDNfSVJRX0JBU0UgKyA5KQotI2RlZmluZSBFVEgwX1RYX1VORF9JUlEgICAJKEdST1VQM19JUlFfQkFTRSArIDEwKQorI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvaXJxLmg+CiAKICNkZWZpbmUgRVRIMF9SWF9ETUFfQUREUiAgKERNQTBfQkFTRV9BRERSICsgMCAqIERNQV9DSEFOX09GRlNFVCkKICNkZWZpbmUgRVRIMF9UWF9ETUFfQUREUiAgKERNQTBfQkFTRV9BRERSICsgMSAqIERNQV9DSEFOX09GRlNFVCkKIAotLyogTkFORCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBHUElPX1JEWSAoMSA8PCAweDA4KQotI2RlZmluZSBHUElPX1dQWCAoMSA8PCAweDA5KQotI2RlZmluZSBHUElPX0FMRSAoMSA8PCAweDBhKQotI2RlZmluZSBHUElPX0NMRSAoMSA8PCAweDBiKQotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGtvcmluYV9kZXYwX3Jlc1tdID0gewogCXsKIAkJLm5hbWUgPSAia29yaW5hX3JlZ3MiLApAQCAtOTQsMTUgKzg0LDEzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBrb3JpbmFfZGV2MCA9IHsKLQkuaWQgPSAwLAorCS5pZCA9IC0xLAogCS5uYW1lID0gImtvcmluYSIsCiAJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmtvcmluYV9kZXYwX2RhdGEsCiAJLnJlc291cmNlID0ga29yaW5hX2RldjBfcmVzLAogCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShrb3JpbmFfZGV2MF9yZXMpLAogfTsKIAotI2RlZmluZSBDRl9HUElPX05VTSAxMwotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNmX3Nsb3QwX3Jlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiY2ZfbWVtYmFzZSIsCkBAIC0xMTYsMTEgKzEwNCwxMSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjZl9kZXZpY2UgY2Zfc2xvdDBfZGF0YSA9IHsKLQkuZ3Bpb19waW4gPSAxMworCS5ncGlvX3BpbiA9IENGX0dQSU9fTlVNCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZl9zbG90MCA9IHsKLQkuaWQgPSAwLAorCS5pZCA9IC0xLAogCS5uYW1lID0gInBhdGEtcmI1MzItY2YiLAogCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZjZl9zbG90MF9kYXRhLAogCS5yZXNvdXJjZSA9IGNmX3Nsb3QwX3JlcywKQEAgLTE4NSw3ICsxNzMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByYjUzMl9sZWQgPSB7CiAJLm5hbWUgPSAicmI1MzItbGVkIiwKLQkuaWQgPSAwLAorCS5pZCA9IC0xLAogfTsKIAogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIHJiNTMyX2dwaW9fYnRuW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcmI1MzIvZ3Bpby5jIGIvYXJjaC9taXBzL3JiNTMyL2dwaW8uYwppbmRleCAwMGExYzc4Li43NmE3ZmQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvZ3Bpby5jCisrKyBiL2FyY2gvbWlwcy9yYjUzMi9ncGlvLmMKQEAgLTI3LDI4ICsyNywzMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvcmIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1yYzMyNDM0L2dwaW8uaD4KIAotc3RydWN0IHJiNTMyX2dwaW9fcmVnIF9faW9tZW0gKnJiNTMyX2dwaW9fcmVnMDsKLUVYUE9SVF9TWU1CT0wocmI1MzJfZ3Bpb19yZWcwKTsKK3N0cnVjdCByYjUzMl9ncGlvX2NoaXAgeworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwl2b2lkIF9faW9tZW0JICpyZWdiYXNlOworCXZvaWQJCSgqc2V0X2ludF9sZXZlbCkoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpOworCWludAkJKCpnZXRfaW50X2xldmVsKShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpOworCXZvaWQJCSgqc2V0X2ludF9zdGF0dXMpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKTsKKwlpbnQJCSgqZ2V0X2ludF9zdGF0dXMpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCk7Cit9OwogCiBzdHJ1Y3QgbXBtY19kZXZpY2UgZGV2MzsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSByYjUzMl9ncGlvX3JlZzBfcmVzW10gPSB7CiAJewogCQkubmFtZSAJPSAiZ3Bpb19yZWcwIiwKLQkJLnN0YXJ0IAk9ICh1MzIpKElEVDQzNF9SRUdfQkFTRSArIEdQSU9CQVNFKSwKLQkJLmVuZCAJPSAodTMyKShJRFQ0MzRfUkVHX0JBU0UgKyBHUElPQkFTRSArIHNpemVvZihzdHJ1Y3QgcmI1MzJfZ3Bpb19yZWcpKSwKKwkJLnN0YXJ0IAk9IFJFR0JBU0UgKyBHUElPQkFTRSwKKwkJLmVuZCAJPSBSRUdCQVNFICsgR1BJT0JBU0UgKyBzaXplb2Yoc3RydWN0IHJiNTMyX2dwaW9fcmVnKSAtIDEsCiAJCS5mbGFncyAJPSBJT1JFU09VUkNFX01FTSwKIAl9CiB9OwpAQCAtNTYsOCArNTksOCBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSByYjUzMl9kZXYzX2N0bF9yZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gImRldjNfY3RsIiwKLQkJLnN0YXJ0CT0gKHUzMikoSURUNDM0X1JFR19CQVNFICsgREVWM0JBU0UpLAotCQkuZW5kCT0gKHUzMikoSURUNDM0X1JFR19CQVNFICsgREVWM0JBU0UgKyBzaXplb2Yoc3RydWN0IGRldl9yZWcpKSwKKwkJLnN0YXJ0CT0gUkVHQkFTRSArIERFVjNCQVNFLAorCQkuZW5kCT0gUkVHQkFTRSArIERFVjNCQVNFICsgc2l6ZW9mKHN0cnVjdCBkZXZfcmVnKSAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0KIH07CkBAIC03MCw3ICs3Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2My5sb2NrLCBmbGFncyk7CiAKLQlkYXRhID0gKih2b2xhdGlsZSB1bnNpZ25lZCAqKSAoSURUNDM0X1JFR19CQVNFICsgcmVnX29mZnMpOworCWRhdGEgPSByZWFkbChJRFQ0MzRfUkVHX0JBU0UgKyByZWdfb2Zmcyk7CiAJZm9yIChpID0gMDsgaSAhPSBsZW47ICsraSkgewogCQlpZiAodmFsICYgKDEgPDwgaSkpCiAJCQlkYXRhIHw9ICgxIDw8IChpICsgYml0KSk7CkBAIC0xMDgsMTA4ICsxMTEsMTk5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGdldF9sYXRjaF91NSk7CiAKLWludCByYjUzMl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQorLyoKKyAqIFJldHVybiBHUElPIGxldmVsICovCitzdGF0aWMgaW50IHJiNTMyX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKLQlyZXR1cm4gcmVhZGwoJnJiNTMyX2dwaW9fcmVnMC0+Z3Bpb2QpICYgKDEgPDwgZ3Bpbyk7CisJdTMyCQkJbWFzayA9IDEgPDwgb2Zmc2V0OworCXN0cnVjdCByYjUzMl9ncGlvX2NoaXAJKmdwY2g7CisKKwlncGNoID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCByYjUzMl9ncGlvX2NoaXAsIGNoaXApOworCXJldHVybiByZWFkbChncGNoLT5yZWdiYXNlICsgR1BJT0QpICYgbWFzazsKIH0KLUVYUE9SVF9TWU1CT0wocmI1MzJfZ3Bpb19nZXRfdmFsdWUpOwogCi12b2lkIHJiNTMyX2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKKy8qCisgKiBTZXQgb3V0cHV0IEdQSU8gbGV2ZWwKKyAqLworc3RhdGljIHZvaWQgcmI1MzJfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKIHsKLQl1bnNpZ25lZCB0bXA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdTMyCQkJbWFzayA9IDEgPDwgb2Zmc2V0OworCXUzMgkJCXRtcDsKKwlzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwCSpncGNoOworCXZvaWQgX19pb21lbQkJKmdwdnI7CiAKLQl0bXAgPSByZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvZCkgJiB+KDEgPDwgZ3Bpbyk7CisJZ3BjaCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwLCBjaGlwKTsKKwlncHZyID0gZ3BjaC0+cmVnYmFzZSArIEdQSU9EOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRtcCA9IHJlYWRsKGdwdnIpOwogCWlmICh2YWx1ZSkKLQkJdG1wIHw9IDEgPDwgZ3BpbzsKLQotCXdyaXRlbCh0bXAsICh2b2lkICopJnJiNTMyX2dwaW9fcmVnMC0+Z3Bpb2QpOworCQl0bXAgfD0gbWFzazsKKwllbHNlCisJCXRtcCAmPSB+bWFzazsKKwl3cml0ZWwodG1wLCBncHZyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJiNTMyX2dwaW9fc2V0X3ZhbHVlKTsKIAotaW50IHJiNTMyX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCisvKgorICogU2V0IEdQSU8gZGlyZWN0aW9uIHRvIGlucHV0CisgKi8KK3N0YXRpYyBpbnQgcmI1MzJfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXdyaXRlbChyZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvY2ZnKSAmIH4oMSA8PCBncGlvKSwKLQkgICAgICAgKHZvaWQgKikmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvY2ZnKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1MzIJCQltYXNrID0gMSA8PCBvZmZzZXQ7CisJdTMyCQkJdmFsdWU7CisJc3RydWN0IHJiNTMyX2dwaW9fY2hpcAkqZ3BjaDsKKwl2b2lkIF9faW9tZW0JCSpncGRyOworCisJZ3BjaCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwLCBjaGlwKTsKKwlncGRyID0gZ3BjaC0+cmVnYmFzZSArIEdQSU9DRkc7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsdWUgPSByZWFkbChncGRyKTsKKwl2YWx1ZSAmPSB+bWFzazsKKwl3cml0ZWwodmFsdWUsIGdwZHIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChyYjUzMl9ncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLWludCByYjUzMl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQorLyoKKyAqIFNldCBHUElPIGRpcmVjdGlvbiB0byBvdXRwdXQKKyAqLworc3RhdGljIGludCByYjUzMl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOwotCXdyaXRlbChyZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvY2ZnKSB8ICgxIDw8IGdwaW8pLAotCSAgICAgICAodm9pZCAqKSZyYjUzMl9ncGlvX3JlZzAtPmdwaW9jZmcpOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXUzMgkJCW1hc2sgPSAxIDw8IG9mZnNldDsKKwl1MzIJCQl0bXA7CisJc3RydWN0IHJiNTMyX2dwaW9fY2hpcAkqZ3BjaDsKKwl2b2lkIF9faW9tZW0JCSpncGRyOworCisJZ3BjaCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwLCBjaGlwKTsKKwl3cml0ZWwobWFzaywgZ3BjaC0+cmVnYmFzZSArIEdQSU9EKTsKKwlncGRyID0gZ3BjaC0+cmVnYmFzZSArIEdQSU9DRkc7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdG1wID0gcmVhZGwoZ3Bkcik7CisJdG1wIHw9IG1hc2s7CisJd3JpdGVsKHRtcCwgZ3Bkcik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHJiNTMyX2dwaW9fZGlyZWN0aW9uX291dHB1dCk7CiAKLXZvaWQgcmI1MzJfZ3Bpb19zZXRfaW50X2xldmVsKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKKy8qCisgKiBTZXQgdGhlIEdQSU8gaW50ZXJydXB0IGxldmVsCisgKi8KK3N0YXRpYyB2b2lkIHJiNTMyX2dwaW9fc2V0X2ludF9sZXZlbChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKIHsKLQl1bnNpZ25lZCB0bXA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdTMyCQkJbWFzayA9IDEgPDwgb2Zmc2V0OworCXUzMgkJCXRtcDsKKwlzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwCSpncGNoOworCXZvaWQgX19pb21lbQkJKmdwaWw7CiAKLQl0bXAgPSByZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvaWxldmVsKSAmIH4oMSA8PCBncGlvKTsKKwlncGNoID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCByYjUzMl9ncGlvX2NoaXAsIGNoaXApOworCWdwaWwgPSBncGNoLT5yZWdiYXNlICsgR1BJT0lMRVZFTDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0bXAgPSByZWFkbChncGlsKTsKIAlpZiAodmFsdWUpCi0JCXRtcCB8PSAxIDw8IGdwaW87Ci0Jd3JpdGVsKHRtcCwgKHZvaWQgKikmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvaWxldmVsKTsKKwkJdG1wIHw9IG1hc2s7CisJZWxzZQorCQl0bXAgJj0gfm1hc2s7CisJd3JpdGVsKHRtcCwgZ3BpbCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChyYjUzMl9ncGlvX3NldF9pbnRfbGV2ZWwpOwogCi1pbnQgcmI1MzJfZ3Bpb19nZXRfaW50X2xldmVsKHVuc2lnbmVkIGdwaW8pCisvKgorICogR2V0IHRoZSBHUElPIGludGVycnVwdCBsZXZlbAorICovCitzdGF0aWMgaW50IHJiNTMyX2dwaW9fZ2V0X2ludF9sZXZlbChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0JcmV0dXJuIHJlYWRsKCZyYjUzMl9ncGlvX3JlZzAtPmdwaW9pbGV2ZWwpICYgKDEgPDwgZ3Bpbyk7CisJdTMyCQkJbWFzayA9IDEgPDwgb2Zmc2V0OworCXN0cnVjdCByYjUzMl9ncGlvX2NoaXAJKmdwY2g7CisKKwlncGNoID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCByYjUzMl9ncGlvX2NoaXAsIGNoaXApOworCXJldHVybiByZWFkbChncGNoLT5yZWdiYXNlICsgR1BJT0lMRVZFTCkgJiBtYXNrOwogfQotRVhQT1JUX1NZTUJPTChyYjUzMl9ncGlvX2dldF9pbnRfbGV2ZWwpOwogCi12b2lkIHJiNTMyX2dwaW9fc2V0X2ludF9zdGF0dXModW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQorLyoKKyAqIFNldCB0aGUgR1BJTyBpbnRlcnJ1cHQgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIHJiNTMyX2dwaW9fc2V0X2ludF9zdGF0dXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKIHsKLQl1bnNpZ25lZCB0bXA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdTMyCQkJbWFzayA9IDEgPDwgb2Zmc2V0OworCXUzMgkJCXRtcDsKKwlzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwCSpncGNoOworCXZvaWQgX19pb21lbQkJKmdwaXM7CiAKLQl0bXAgPSByZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvaXN0YXQpOworCWdwY2ggPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHJiNTMyX2dwaW9fY2hpcCwgY2hpcCk7CisJZ3BpcyA9IGdwY2gtPnJlZ2Jhc2UgKyBHUElPSVNUQVQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdG1wID0gcmVhZGwoZ3Bpcyk7CiAJaWYgKHZhbHVlKQotCQl0bXAgfD0gMSA8PCBncGlvOwotCXdyaXRlbCh0bXAsICh2b2lkICopJnJiNTMyX2dwaW9fcmVnMC0+Z3Bpb2lzdGF0KTsKKwkJdG1wIHw9IG1hc2s7CisJZWxzZQorCQl0bXAgJj0gfm1hc2s7CisJd3JpdGVsKHRtcCwgZ3Bpcyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChyYjUzMl9ncGlvX3NldF9pbnRfc3RhdHVzKTsKIAotaW50IHJiNTMyX2dwaW9fZ2V0X2ludF9zdGF0dXModW5zaWduZWQgZ3BpbykKKy8qCisgKiBHZXQgdGhlIEdQSU8gaW50ZXJydXB0IHN0YXR1cworICovCitzdGF0aWMgaW50IHJiNTMyX2dwaW9fZ2V0X2ludF9zdGF0dXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXJldHVybiByZWFkbCgmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvaXN0YXQpICYgKDEgPDwgZ3Bpbyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJiNTMyX2dwaW9fZ2V0X2ludF9zdGF0dXMpOworCXUzMgkJCW1hc2sgPSAxIDw8IG9mZnNldDsKKwlzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwCSpncGNoOwogCi12b2lkIHJiNTMyX2dwaW9fc2V0X2Z1bmModW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIHRtcDsKLQotCXRtcCA9IHJlYWRsKCZyYjUzMl9ncGlvX3JlZzAtPmdwaW9mdW5jKTsKLQlpZiAodmFsdWUpCi0JCXRtcCB8PSAxIDw8IGdwaW87Ci0Jd3JpdGVsKHRtcCwgKHZvaWQgKikmcmI1MzJfZ3Bpb19yZWcwLT5ncGlvZnVuYyk7CisJZ3BjaCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmI1MzJfZ3Bpb19jaGlwLCBjaGlwKTsKKwlyZXR1cm4gcmVhZGwoZ3BjaC0+cmVnYmFzZSArIEdQSU9JU1RBVCkgJiBtYXNrOwogfQotRVhQT1JUX1NZTUJPTChyYjUzMl9ncGlvX3NldF9mdW5jKTsKIAotaW50IHJiNTMyX2dwaW9fZ2V0X2Z1bmModW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gcmVhZGwoJnJiNTMyX2dwaW9fcmVnMC0+Z3Bpb2Z1bmMpICYgKDEgPDwgZ3Bpbyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJiNTMyX2dwaW9fZ2V0X2Z1bmMpOworc3RhdGljIHN0cnVjdCByYjUzMl9ncGlvX2NoaXAgcmI1MzJfZ3Bpb19jaGlwW10gPSB7CisJWzBdID0geworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwaW8wIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSByYjUzMl9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gcmI1MzJfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCQkJLmdldAkJCT0gcmI1MzJfZ3Bpb19nZXQsCisJCQkuc2V0CQkJPSByYjUzMl9ncGlvX3NldCwKKwkJCS5iYXNlCQkJPSAwLAorCQkJLm5ncGlvCQkJPSAzMiwKKwkJfSwKKwkJLmdldF9pbnRfbGV2ZWwJCT0gcmI1MzJfZ3Bpb19nZXRfaW50X2xldmVsLAorCQkuc2V0X2ludF9sZXZlbAkJPSByYjUzMl9ncGlvX3NldF9pbnRfbGV2ZWwsCisJCS5nZXRfaW50X3N0YXR1cwkJPSByYjUzMl9ncGlvX2dldF9pbnRfc3RhdHVzLAorCQkuc2V0X2ludF9zdGF0dXMJCT0gcmI1MzJfZ3Bpb19zZXRfaW50X3N0YXR1cywKKwl9LAorfTsKIAogaW50IF9faW5pdCByYjUzMl9ncGlvX2luaXQodm9pZCkKIHsKLQlyYjUzMl9ncGlvX3JlZzAgPSBpb3JlbWFwX25vY2FjaGUocmI1MzJfZ3Bpb19yZWcwX3Jlc1swXS5zdGFydCwKLQkJCQlyYjUzMl9ncGlvX3JlZzBfcmVzWzBdLmVuZCAtCi0JCQkJcmI1MzJfZ3Bpb19yZWcwX3Jlc1swXS5zdGFydCk7CisJc3RydWN0IHJlc291cmNlICpyOwogCi0JaWYgKCFyYjUzMl9ncGlvX3JlZzApIHsKKwlyID0gcmI1MzJfZ3Bpb19yZWcwX3JlczsKKwlyYjUzMl9ncGlvX2NoaXAtPnJlZ2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0KTsKKworCWlmICghcmI1MzJfZ3Bpb19jaGlwLT5yZWdiYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicmI1MzI6IGNhbm5vdCByZW1hcCBHUElPIHJlZ2lzdGVyIDBcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWRldjMuYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyYjUzMl9kZXYzX2N0bF9yZXNbMF0uc3RhcnQsCi0JCQkJcmI1MzJfZGV2M19jdGxfcmVzWzBdLmVuZCAtCi0JCQkJcmI1MzJfZGV2M19jdGxfcmVzWzBdLnN0YXJ0KTsKKwkvKiBSZWdpc3RlciBvdXIgR1BJTyBjaGlwICovCisJZ3Bpb2NoaXBfYWRkKCZyYjUzMl9ncGlvX2NoaXAtPmNoaXApOworCisJciA9IHJiNTMyX2RldjNfY3RsX3JlczsKKwlkZXYzLmJhc2UgPSBpb3JlbWFwX25vY2FjaGUoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0KTsKIAogCWlmICghZGV2My5iYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicmI1MzI6IGNhbm5vdCByZW1hcCBkZXZpY2UgY29udHJvbGxlciAzXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9yYjUzMi9pcnEuYyBiL2FyY2gvbWlwcy9yYjUzMi9pcnEuYwppbmRleCBjMGQwZjk1Li41NDliNDZkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvaXJxLmMKKysrIGIvYXJjaC9taXBzL3JiNTMyL2lycS5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYzMyNDM0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9pcnEuaD4KIAogc3RydWN0IGludHJfZ3JvdXAgewogCXUzMiBtYXNrOwkvKiBtYXNrIG9mIHZhbGlkIGJpdHMgaW4gcGVuZGluZy9tYXNrIHJlZ2lzdGVycyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JiNTMyL3Byb20uYyBiL2FyY2gvbWlwcy9yYjUzMi9wcm9tLmMKaW5kZXggMWJjMGFmOC4uNDZjYTI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3JiNTMyL3Byb20uYworKysgYi9hcmNoL21pcHMvcmI1MzIvcHJvbS5jCkBAIC0zNywxMiArMzcsOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvZGRyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9wcm9tLmg+CiAKLWV4dGVybiB2b2lkIF9faW5pdCBzZXR1cF9zZXJpYWxfcG9ydCh2b2lkKTsKLQogdW5zaWduZWQgaW50IGlkdF9jcHVfZnJlcSA9IDEzMjAwMDAwMDsKIEVYUE9SVF9TWU1CT0woaWR0X2NwdV9mcmVxKTsKLXVuc2lnbmVkIGludCBncGlvX2Jvb3R1cF9zdGF0ZTsKLUVYUE9SVF9TWU1CT0woZ3Bpb19ib290dXBfc3RhdGUpOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRkcl9yZWdbXSA9IHsKIAl7CkBAIC0xMDgsOSArMTA0LDYgQEAKIAkJCQltaXBzX21hY2h0eXBlID0gTUFDSF9NSUtST1RJS19SQjUzMjsKIAkJfQogCi0JCWlmIChtYXRjaF90YWcocHJvbV9hcmd2W2ldLCBHUElPX1RBRykpCi0JCQlncGlvX2Jvb3R1cF9zdGF0ZSA9IHRhZzJ1bChwcm9tX2FyZ3ZbaV0sIEdQSU9fVEFHKTsKLQogCQlzdHJjcHkoY3AsIHByb21fYXJndltpXSk7CiAJCWNwICs9IHN0cmxlbihwcm9tX2FyZ3ZbaV0pOwogCX0KQEAgLTEyMiwxMSArMTE1LDYgQEAKIAkJc3RyY3B5KGNwLCBhcmNzX2NtZGxpbmUpOwogCQljcCArPSBzdHJsZW4oYXJjc19jbWRsaW5lKTsKIAl9Ci0JaWYgKGdwaW9fYm9vdHVwX3N0YXRlICYgMHgwMikKLQkJc3RyY3B5KGNwLCBHUElPX0lOSVRfTk9CVVRUT04pOwotCWVsc2UKLQkJc3RyY3B5KGNwLCBHUElPX0lOSVRfQlVUVE9OKTsKLQogCWNtZF9saW5lW0NMX1NJWkUtMV0gPSAnXDAnOwogCiAJc3RyY3B5KGFyY3NfY21kbGluZSwgY21kX2xpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JiNTMyL3NlcmlhbC5jIGIvYXJjaC9taXBzL3JiNTMyL3NlcmlhbC5jCmluZGV4IDFhMDViNWQuLjNlMGQ3ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9yYjUzMi9zZXJpYWwuYworKysgYi9hcmNoL21pcHMvcmI1MzIvc2VyaWFsLmMKQEAgLTMxLDE2ICszMSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAKICNpbmNsdWRlIDxhc20vc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYzMyNDM0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYi5oPgogCiBleHRlcm4gdW5zaWduZWQgaW50IGlkdF9jcHVfZnJlcTsKIAogc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgcmI1MzJfdWFydCA9IHsKIAkudHlwZSA9IFBPUlRfMTY1NTBBLAogCS5saW5lID0gMCwKLQkuaXJxID0gUkMzMjQzNF9VQVJUMF9JUlEsCisJLmlycSA9IFVBUlQwX0lSUSwKIAkuaW90eXBlID0gVVBJT19NRU0sCi0JLm1lbWJhc2UgPSAoY2hhciAqKUtTRUcxQUREUihSQzMyNDM0X1VBUlQwX0JBU0UpLAorCS5tZW1iYXNlID0gKGNoYXIgKilLU0VHMUFERFIoUkVHQkFTRSArIFVBUlQwQkFTRSksCiAJLnJlZ3NoaWZ0ID0gMgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JiNTMyL3NldHVwLmMgYi9hcmNoL21pcHMvcmI1MzIvc2V0dXAuYwppbmRleCA3YWFmYTk1Li41MGY1MzBmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvc2V0dXAuYworKysgYi9hcmNoL21pcHMvcmI1MzIvc2V0dXAuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYzMyNDM0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtcmMzMjQzNC9yYi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXJjMzI0MzQvcGNpLmg+CiAKIHN0cnVjdCBwY2lfcmVnIF9faW9tZW0gKnBjaV9yZWc7CkBAIC0yNyw3ICsyNyw3IEBACiBzdGF0aWMgdm9pZCByYl9tYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCkKIHsKIAkvKiBqdXN0IGp1bXAgdG8gdGhlIHJlc2V0IHZlY3RvciAqLwotCXdyaXRlbCgweDgwMDAwMDAxLCAodm9pZCAqKUtTRUcxQUREUihSQzMyNDM0X1JFR19CQVNFICsgUkMzMjQzNF9SU1QpKTsKKwl3cml0ZWwoMHg4MDAwMDAwMSwgSURUNDM0X1JFR19CQVNFICsgUlNUKTsKIAkoKHZvaWQgKCopKHZvaWQpKSBLU0VHMUFERFIoMHgxRkMwMDAwMHUpKSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcmI1MzIvdGltZS5jIGIvYXJjaC9taXBzL3JiNTMyL3RpbWUuYwppbmRleCA4ZTdhNDY4Li4xMzc3ZDU5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcmI1MzIvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9yYjUzMi90aW1lLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogCiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1yYzMyNDM0L3JjMzI0MzQuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXBsYXRmb3JtLmMKaW5kZXggNjAxNDEyMy4uZGVkZGJmMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1wbGF0Zm9ybS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJcmV0dXJuIHJlczsKIAogCS8qIFNlY29uZCBIUEMgaXMgbWlzc2luZz8gKi8KLQlpZiAoIWlwMjJfaXNfZnVsbGhvdXNlKCkgfHwKKwlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSB8fAogCSAgICBnZXRfZGJlKHRtcCwgKHVuc2lnbmVkIGludCAqKSZocGMzYzEtPnBiZG1hWzFdKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTE5MiwzICsxOTIsMTggQEAKIH0KIAogZGV2aWNlX2luaXRjYWxsKHNnaV9idXR0b25fZGV2aW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNnaV9kczEyODZfZGV2aW5pdCh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSByZXM7CisKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCXJlcy5zdGFydCA9IEhQQzNfQ0hJUDBfQkFTRSArIG9mZnNldG9mKHN0cnVjdCBocGMzX3JlZ3MsIHJ0Y3JlZ3MpOworCXJlcy5lbmQgPSByZXMuc3RhcnQgKyBzaXplb2YoaHBjM2MwLT5ydGNyZWdzKSAtIDE7CisJcmVzLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXR1cm4gSVNfRVJSKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Yy1kczEyODYiLCAtMSwKKwkJCQkJCSAgICAgICZyZXMsIDEpKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHNnaV9kczEyODZfZGV2aW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1zZXR1cC5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItc2V0dXAuYwppbmRleCA4OTZhMWVmLi5iOWE5MzEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXNldHVwLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggUmFsZiBCYWVjaGxlIChyYWxmQGdudS5vcmcpCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9kczEyODYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKaW5kZXggMTBlNTA1NC4uM2RjYjI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYwpAQCAtMTAsNyArMTAsNiBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzLCAwNiBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCiAgKi8KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9kczEyODYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yOSw2OSArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgogI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgogCi0vKgotICogTm90ZSB0aGF0IG1rdGltZSB1c2VzIG1vbnRoIGZyb20gMSB0byAxMiB3aGlsZSBydGNfdGltZV90b190bQotICogdXNlcyAwIHRvIDExLgotICovCi11bnNpZ25lZCBsb25nIHJlYWRfcGVyc2lzdGVudF9jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGludCB5cnMsIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjOwotCXVuc2lnbmVkIGludCBzYXZlX2NvbnRyb2w7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwotCXNhdmVfY29udHJvbCA9IGhwYzNjMC0+cnRjcmVnc1tSVENfQ01EXSAmIDB4ZmY7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19DTURdID0gc2F2ZV9jb250cm9sIHwgUlRDX1RFOwotCi0Jc2VjID0gQkNEMkJJTihocGMzYzAtPnJ0Y3JlZ3NbUlRDX1NFQ09ORFNdICYgMHhmZik7Ci0JbWluID0gQkNEMkJJTihocGMzYzAtPnJ0Y3JlZ3NbUlRDX01JTlVURVNdICYgMHhmZik7Ci0JaHJzID0gQkNEMkJJTihocGMzYzAtPnJ0Y3JlZ3NbUlRDX0hPVVJTXSAmIDB4M2YpOwotCWRheSA9IEJDRDJCSU4oaHBjM2MwLT5ydGNyZWdzW1JUQ19EQVRFXSAmIDB4ZmYpOwotCW1vbiA9IEJDRDJCSU4oaHBjM2MwLT5ydGNyZWdzW1JUQ19NT05USF0gJiAweDFmKTsKLQl5cnMgPSBCQ0QyQklOKGhwYzNjMC0+cnRjcmVnc1tSVENfWUVBUl0gJiAweGZmKTsKLQotCWhwYzNjMC0+cnRjcmVnc1tSVENfQ01EXSA9IHNhdmVfY29udHJvbDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHlycyA8IDQ1KQotCQl5cnMgKz0gMzA7Ci0JaWYgKCh5cnMgKz0gNDApIDwgNzApCi0JCXlycyArPSAxMDA7Ci0KLQlyZXR1cm4gbWt0aW1lKHlycyArIDE5MDAsIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjKTsKLX0KLQotaW50IHJ0Y19taXBzX3NldF90aW1lKHVuc2lnbmVkIGxvbmcgdGltKQotewotCXN0cnVjdCBydGNfdGltZSB0bTsKLQl1bnNpZ25lZCBpbnQgc2F2ZV9jb250cm9sOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlydGNfdGltZV90b190bSh0aW0sICZ0bSk7Ci0KLQl0bS50bV9tb24gKz0gMTsJCS8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLwotCXRtLnRtX3llYXIgLT0gNDA7Ci0JaWYgKHRtLnRtX3llYXIgPj0gMTAwKQotCQl0bS50bV95ZWFyIC09IDEwMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwotCXNhdmVfY29udHJvbCA9IGhwYzNjMC0+cnRjcmVnc1tSVENfQ01EXSAmIDB4ZmY7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19DTURdID0gc2F2ZV9jb250cm9sIHwgUlRDX1RFOwotCi0JaHBjM2MwLT5ydGNyZWdzW1JUQ19ZRUFSXSA9IEJJTjJCQ0QodG0udG1feWVhcik7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19NT05USF0gPSBCSU4yQkNEKHRtLnRtX21vbik7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19EQVRFXSA9IEJJTjJCQ0QodG0udG1fbWRheSk7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19IT1VSU10gPSBCSU4yQkNEKHRtLnRtX2hvdXIpOwotCWhwYzNjMC0+cnRjcmVnc1tSVENfTUlOVVRFU10gPSBCSU4yQkNEKHRtLnRtX21pbik7Ci0JaHBjM2MwLT5ydGNyZWdzW1JUQ19TRUNPTkRTXSA9IEJJTjJCQ0QodG0udG1fc2VjKTsKLQlocGMzYzAtPnJ0Y3JlZ3NbUlRDX0hVTkRSRURUSF9TRUNPTkRdID0gMDsKLQotCWhwYzNjMC0+cnRjcmVnc1tSVENfQ01EXSA9IHNhdmVfY29udHJvbDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRvc2FtcGxlKHZvaWQpCiB7CiAJdTMyIGN0MCwgY3QxOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKaW5kZXggOGI0ZTg1NC4uMTMyN2MyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCkBAIC0xMywxMiArMTMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zZ2lhbGliLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2lvYzMuaD4KLSNpbmNsdWRlIDxhc20vbTQ4dDM1Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL2tsY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KQEAgLTI4LDUxICsyOCw2IEBACiAKICNkZWZpbmUgVElDS19TSVpFICh0aWNrX25zZWMgLyAxMDAwKQogCi0jaWYgMAotc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQotewotCWludCByZXR2YWwgPSAwOwotCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlcywgY21vc19taW51dGVzOwotCXN0cnVjdCBtNDh0MzVfcnRjICpydGM7Ci0JbmFzaWRfdCBuaWQ7Ci0KLQluaWQgPSBnZXRfbmFzaWQoKTsKLQlydGMgPSAoc3RydWN0IG00OHQzNV9ydGMgKikoS0xfQ09ORklHX0NIX0NPTlNfSU5GTyhuaWQpLT5tZW1vcnlfYmFzZSArCi0JCQkJCQkJSU9DM19CWVRFQlVTX0RFVjApOwotCi0JcnRjLT5jb250cm9sIHw9IE00OFQzNV9SVENfUkVBRDsKLQljbW9zX21pbnV0ZXMgPSBCQ0QyQklOKHJ0Yy0+bWluKTsKLQlydGMtPmNvbnRyb2wgJj0gfk00OFQzNV9SVENfUkVBRDsKLQotCS8qCi0JICogU2luY2Ugd2UncmUgb25seSBhZGp1c3RpbmcgbWludXRlcyBhbmQgc2Vjb25kcywgZG9uJ3QgaW50ZXJmZXJlIHdpdGgKLQkgKiBob3VyIG92ZXJmbG93LiBUaGlzIGF2b2lkcyBtZXNzaW5nIHdpdGggdW5rbm93biB0aW1lIHpvbmVzIGJ1dAotCSAqIHJlcXVpcmVzIHlvdXIgUlRDIG5vdCB0byBiZSBvZmYgYnkgbW9yZSB0aGFuIDE1IG1pbnV0ZXMKLQkgKi8KLQlyZWFsX3NlY29uZHMgPSBub3d0aW1lICUgNjA7Ci0JcmVhbF9taW51dGVzID0gbm93dGltZSAvIDYwOwotCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBjbW9zX21pbnV0ZXMpICsgMTUpLzMwKSAmIDEpCi0JCXJlYWxfbWludXRlcyArPSAzMDsJLyogY29ycmVjdCBmb3IgaGFsZiBob3VyIHRpbWUgem9uZSAqLwotCXJlYWxfbWludXRlcyAlPSA2MDsKLQotCWlmIChhYnMocmVhbF9taW51dGVzIC0gY21vc19taW51dGVzKSA8IDMwKSB7Ci0JCXJlYWxfc2Vjb25kcyA9IEJJTjJCQ0QocmVhbF9zZWNvbmRzKTsKLQkJcmVhbF9taW51dGVzID0gQklOMkJDRChyZWFsX21pbnV0ZXMpOwotCQlydGMtPmNvbnRyb2wgfD0gTTQ4VDM1X1JUQ19TRVQ7Ci0JCXJ0Yy0+c2VjID0gcmVhbF9zZWNvbmRzOwotCQlydGMtPm1pbiA9IHJlYWxfbWludXRlczsKLQkJcnRjLT5jb250cm9sICY9IH5NNDhUMzVfUlRDX1NFVDsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKLQkJICAgICAgIGNtb3NfbWludXRlcywgcmVhbF9taW51dGVzKTsKLQkJcmV0dmFsID0gLTE7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgotCiAvKiBJbmNsdWRlcyBmb3IgaW9jM19pbml0KCkuICAqLwogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbjAvYWRkcnMuaD4KQEAgLTgwLDM3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL3NuL3NuMC9odWJpby5oPgogI2luY2x1ZGUgPGFzbS9wY2kvYnJpZGdlLmg+CiAKLXVuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF0ZSwgaG91ciwgbWluLCBzZWM7Ci0Jc3RydWN0IG00OHQzNV9ydGMgKnJ0YzsKLQluYXNpZF90IG5pZDsKLQotCW5pZCA9IGdldF9uYXNpZCgpOwotCXJ0YyA9IChzdHJ1Y3QgbTQ4dDM1X3J0YyAqKShLTF9DT05GSUdfQ0hfQ09OU19JTkZPKG5pZCktPm1lbW9yeV9iYXNlICsKLQkJCQkJCQlJT0MzX0JZVEVCVVNfREVWMCk7Ci0KLQlydGMtPmNvbnRyb2wgfD0gTTQ4VDM1X1JUQ19SRUFEOwotCXNlYyA9IHJ0Yy0+c2VjOwotCW1pbiA9IHJ0Yy0+bWluOwotCWhvdXIgPSBydGMtPmhvdXI7Ci0JZGF0ZSA9IHJ0Yy0+ZGF0ZTsKLQltb250aCA9IHJ0Yy0+bW9udGg7Ci0JeWVhciA9IHJ0Yy0+eWVhcjsKLQlydGMtPmNvbnRyb2wgJj0gfk00OFQzNV9SVENfUkVBRDsKLQotICAgICAgICBzZWMgPSBCQ0QyQklOKHNlYyk7Ci0gICAgICAgIG1pbiA9IEJDRDJCSU4obWluKTsKLSAgICAgICAgaG91ciA9IEJDRDJCSU4oaG91cik7Ci0gICAgICAgIGRhdGUgPSBCQ0QyQklOKGRhdGUpOwotICAgICAgICBtb250aCA9IEJDRDJCSU4obW9udGgpOwotICAgICAgICB5ZWFyID0gQkNEMkJJTih5ZWFyKTsKLQotICAgICAgICB5ZWFyICs9IDE5NzA7Ci0KLSAgICAgICAgcmV0dXJuIG1rdGltZSh5ZWFyLCBtb250aCwgZGF0ZSwgaG91ciwgbWluLCBzZWMpOwotfQotCiBzdGF0aWMgdm9pZCBlbmFibGVfcnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiB9CkBAIC0yODYsNiArMjEwLDcgQEAKIAogdm9pZCBfX2NwdWluaXQgaHViX3J0Y19pbml0KGNub2RlaWRfdCBjbm9kZSkKIHsKKwogCS8qCiAJICogV2Ugb25seSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgbm9kZS4KIAkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgY3VycmVudCBub2RlIHRoZW4gaXQgaXMgYSBjcHVsZXNzCkBAIC0zMDEsMyArMjI2LDIzIEBACiAJCUxPQ0FMX0hVQl9TKFBJX1JUX1BFTkRfQiwgMCk7CiAJfQogfQorCitzdGF0aWMgaW50IF9faW5pdCBzZ2lfaXAyN19ydGNfZGV2aW5pdCh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSByZXM7CisKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCXJlcy5zdGFydCA9IFhQSFlTQUREUihLTF9DT05GSUdfQ0hfQ09OU19JTkZPKG1hc3Rlcl9uYXNpZCktPm1lbW9yeV9iYXNlICsKKwkJCSAgICAgIElPQzNfQllURUJVU19ERVYwKTsKKwlyZXMuZW5kID0gcmVzLnN0YXJ0ICsgMzI3Njc7CisJcmVzLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXR1cm4gSVNfRVJSKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Yy1tNDh0MzUiLCAtMSwKKwkJCQkJCSAgICAgICZyZXMsIDEpKTsKK30KKworLyoKKyAqIGtsdWRnZSBtYWtlIHRoaXMgYSBkZXZpY2VfaW5pdGNhbGwgYWZ0ZXIgaW9jMyByZXNvdXJjZSBjb25mbGljdHMKKyAqIGFyZSByZXNvbHZlZAorICovCitsYXRlX2luaXRjYWxsKHNnaV9pcDI3X3J0Y19kZXZpbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXBsYXRmb3JtLmMgYi9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1wbGF0Zm9ybS5jCmluZGV4IDNkNjM3MjEuLjUxMWU5ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXBsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcGxhdGZvcm0uYwpAQCAtOTAsNiArOTAsMjIgQEAKIAogZGV2aWNlX2luaXRjYWxsKHNnaW8yYnRuc19kZXZpbml0KTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZ2lvMl9jbW9zX3JzcmNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4NzAsCisJCS5lbmQgICA9IDB4NzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8KKwl9Cit9OworCitzdGF0aWMgX19pbml0IGludCBzZ2lvMl9jbW9zX2RldmluaXQodm9pZCkKK3sKKwlyZXR1cm4gSVNfRVJSKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Y19jbW9zIiwgLTEsCisJCQkJCQkgICAgICBzZ2lvMl9jbW9zX3JzcmMsIDEpKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHNnaW8yX2Ntb3NfZGV2aW5pdCk7CisKIE1PRFVMRV9BVVRIT1IoIlJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiODI1MCBVQVJUIHByb2JlIGRyaXZlciBmb3IgU0dJIElQMzIgYWthIE8yIik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1zZXR1cC5jIGIvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItc2V0dXAuYwppbmRleCAxMDI0YmY0Li5jNWE1ZDRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXNldHVwLmMKQEAgLTYyLDExICs2Miw2IEBACiB9CiAjZW5kaWYKIAotdW5zaWduZWQgbG9uZyByZWFkX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKLXsKLQlyZXR1cm4gbWMxNDY4MThfZ2V0X2Ntb3NfdGltZSgpOwotfQotCiAvKiBBbiBhcmJpdHJhcnkgdGltZTsgdGhpcyBjYW4gYmUgZGVjcmVhc2VkIGlmIHJlbGlhYmlsaXR5IGxvb2tzIGdvb2QgKi8KICNkZWZpbmUgV0FJVF9NUyAxMAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL3NiX3RicHJvZi5jCmluZGV4IDY2ZTNlM2YuLjYzN2ExOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL3NiX3RicHJvZi5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL3NiX3RicHJvZi5jCkBAIC01NzYsOCArNTc2LDcgQEAKIAogCXRiX2NsYXNzID0gdGJjOwogCi0JZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHRiYywgTlVMTCwgTUtERVYoU0JQUk9GX1RCX01BSk9SLCAwKSwKLQkJCQkgICAgTlVMTCwgInRiIik7CisJZGV2ID0gZGV2aWNlX2NyZWF0ZSh0YmMsIE5VTEwsIE1LREVWKFNCUFJPRl9UQl9NQUpPUiwgMCksIE5VTEwsICJ0YiIpOwogCWlmIChJU19FUlIoZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRldik7CiAJCWdvdG8gb3V0X2NsYXNzOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vTWFrZWZpbGUKaW5kZXggZjE4YmE5Mi4uN2I0NWYxOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvc2lieXRlL3N3YXJtL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAotb2JqLXkJCQkJOj0gc2V0dXAubyBydGNfeGljb3IxMjQxLm8gcnRjX200MXQ4MS5vCitvYmoteQkJCQk6PSBwbGF0Zm9ybS5vIHNldHVwLm8gcnRjX3hpY29yMTI0MS5vIFwKKwkJCQkgICBydGNfbTQxdDgxLm8KIAogb2JqLSQoQ09ORklHX0kyQ19CT0FSRElORk8pCSs9IHN3YXJtLWkyYy5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4NDdmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vcGxhdGZvcm0uYwpAQCAtMCwwICsxLDg1IEBACisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vc2lieXRlL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfZ2VuYnVzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NXQVJNKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfTElUVExFU1VSKQorCisjZGVmaW5lIERSVl9OQU1FCSJwYXRhLXN3YXJtIgorCisjZGVmaW5lIFNXQVJNX0lERV9TSElGVAk1CisjZGVmaW5lIFNXQVJNX0lERV9CQVNFCTB4MWYwCisjZGVmaW5lIFNXQVJNX0lERV9DVFJMCTB4M2Y2CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3dhcm1fcGF0YV9yZXNvdXJjZVtdID0geworCXsKKwkJLm5hbWUJPSAiU3dhcm0gR2VuQnVzIElERSIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLm5hbWUJPSAiU3dhcm0gR2VuQnVzIElERSIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLm5hbWUJPSAiU3dhcm0gR2VuQnVzIElERSIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkuc3RhcnQJPSBLX0lOVF9HQl9JREUsCisJCS5lbmQJPSBLX0lOVF9HQl9JREUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGF0YV9wbGF0Zm9ybV9pbmZvIHBhdGFfcGxhdGZvcm1fZGF0YSA9IHsKKwkuaW9wb3J0X3NoaWZ0CT0gU1dBUk1fSURFX1NISUZULAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3dhcm1fcGF0YV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBhdGFfcGxhdGZvcm0iLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSBzd2FybV9wYXRhX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzd2FybV9wYXRhX3Jlc291cmNlKSwKKwkuZGV2ICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnBhdGFfcGxhdGZvcm1fZGF0YSwKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gfjAsCS8qIGdydW1ibGUgKi8KKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3dhcm1fcGF0YV9pbml0KHZvaWQpCit7CisJdTggX19pb21lbSAqYmFzZTsKKwlwaHlzX3Qgb2Zmc2V0LCBzaXplOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWlmICghU0lCWVRFX0hBVkVfSURFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJhc2UgPSBpb3JlbWFwKEFfSU9fRVhUX0JBU0UsIDB4ODAwKTsKKwlvZmZzZXQgPSBfX3Jhd19yZWFkcShiYXNlICsgUl9JT19FWFRfUkVHKFJfSU9fRVhUX1NUQVJUX0FERFIsIElERV9DUykpOworCXNpemUgPSBfX3Jhd19yZWFkcShiYXNlICsgUl9JT19FWFRfUkVHKFJfSU9fRVhUX01VTFRfU0laRSwgSURFX0NTKSk7CisJaW91bm1hcChiYXNlKTsKKworCW9mZnNldCA9IEdfSU9fU1RBUlRfQUREUihvZmZzZXQpIDw8IFNfSU9fQUREUkJBU0U7CisJc2l6ZSA9IChHX0lPX01VTFRfU0laRShzaXplKSArIDEpIDw8IFNfSU9fUkVHU0laRTsKKwlpZiAob2Zmc2V0IDwgQV9QSFlTX0dFTkJVUyB8fCBvZmZzZXQgPj0gQV9QSFlTX0dFTkJVU19FTkQpIHsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiBQQVRBIGludGVyZmFjZSBhdCBHZW5CdXMgZGlzYWJsZWRcbiIpOworCisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcHJfaW5mbyhEUlZfTkFNRSAiOiBQQVRBIGludGVyZmFjZSBhdCBHZW5CdXMgc2xvdCAlaVxuIiwgSURFX0NTKTsKKworCXIgPSBzd2FybV9wYXRhX3Jlc291cmNlOworCXJbMF0uc3RhcnQgPSBvZmZzZXQgKyAoU1dBUk1fSURFX0JBU0UgPDwgU1dBUk1fSURFX1NISUZUKTsKKwlyWzBdLmVuZCAgID0gb2Zmc2V0ICsgKChTV0FSTV9JREVfQkFTRSArIDgpIDw8IFNXQVJNX0lERV9TSElGVCkgLSAxOworCXJbMV0uc3RhcnQgPSBvZmZzZXQgKyAoU1dBUk1fSURFX0NUUkwgPDwgU1dBUk1fSURFX1NISUZUKTsKKwlyWzFdLmVuZCAgID0gb2Zmc2V0ICsgKChTV0FSTV9JREVfQ1RSTCArIDEpIDw8IFNXQVJNX0lERV9TSElGVCkgLSAxOworCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc3dhcm1fcGF0YV9kZXZpY2UpOworfQorCitkZXZpY2VfaW5pdGNhbGwoc3dhcm1fcGF0YV9pbml0KTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NJQllURV9TV0FSTSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0xJVFRMRVNVUikgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L0tjb25maWcgYi9hcmNoL21pcHMvdHh4OS9LY29uZmlnCmluZGV4IDg0MGZlNzUuLjE3MDUyZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L0tjb25maWcKKysrIGIvYXJjaC9taXBzL3R4eDkvS2NvbmZpZwpAQCAtNDUsNiArNDUsMTQgQEAKIAkgIFRoaXMgVG9zaGliYSBib2FyZCBpcyBiYXNlZCBvbiB0aGUgVFg0OTM4IHByb2Nlc3Nvci4gU2F5IFkgaGVyZSB0bwogCSAgc3VwcG9ydCB0aGlzIG1hY2hpbmUgdHlwZQogCitjb25maWcgVE9TSElCQV9SQlRYNDkzOQorCWJvb2wgIlRvc2hpYmEgUkJUWDQ5MzkgYm9iYXJkIgorCWRlcGVuZHMgb24gTUFDSF9UWDQ5WFgKKwlzZWxlY3QgU09DX1RYNDkzOQorCWhlbHAKKwkgIFRoaXMgVG9zaGliYSBib2FyZCBpcyBiYXNlZCBvbiB0aGUgVFg0OTM5IHByb2Nlc3Nvci4gU2F5IFkgaGVyZSB0bworCSAgc3VwcG9ydCB0aGlzIG1hY2hpbmUgdHlwZQorCiBjb25maWcgU09DX1RYMzkyNwogCWJvb2wKIAlzZWxlY3QgQ0VWVF9UWFg5CkBAIC03MSw2ICs3OSwxMyBAQAogCXNlbGVjdCBQQ0lfVFg0OTI3CiAJc2VsZWN0IEdQSU9fVFhYOQogCitjb25maWcgU09DX1RYNDkzOQorCWJvb2wKKwlzZWxlY3QgQ0VWVF9UWFg5CisJc2VsZWN0IEhBU19UWFg5X1NFUklBTAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFBDSV9UWDQ5MjcKKwogY29uZmlnIFRPU0hJQkFfRlBDSUIwCiAJYm9vbCAiRlBDSUIwIEJhY2twbGFuZSBTdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIE1BQ0hfVFhYOQpAQCAtOTQsMTYgKzEwOSwxMSBAQAogCWJvb2wgIk5BTkQiCiBjb25maWcgVE9TSElCQV9SQlRYNDkzOF9NUExFWF9BVEEKIAlib29sICJBVEEiCitjb25maWcgVE9TSElCQV9SQlRYNDkzOF9NUExFWF9LRUVQCisJYm9vbCAiS2VlcCBmaXJtd2FyZSBzZXR0aW5ncyIKIAogZW5kY2hvaWNlCiAKLWNvbmZpZyBUWDQ5MzhfTkFORF9CT09UCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgVE9TSElCQV9SQlRYNDkzOF9NUExFWF9OQU5ECi0JYm9vbCAiTkFORCBCb290IFN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JaGVscAotCSAgVGhpcyBpcyBvbmx5IGZvciBUb3NoaWJhIFJCVFg0OTM4IHJlZmVyZW5jZSBib2FyZCwgd2hpY2ggaGFzIE5BTkQgSVBMLgotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBOQU5EIGJvb3QuCi0KIGVuZGlmCiAKIGNvbmZpZyBQQ0lfVFg0OTI3CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL01ha2VmaWxlIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9NYWtlZmlsZQppbmRleCA5YmIzNGFmLi4wMDMwZDIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvTWFrZWZpbGUKQEAgLTcsNiArNyw4IEBACiBvYmotJChDT05GSUdfU09DX1RYMzkyNykJKz0gc2V0dXBfdHgzOTI3Lm8gaXJxX3R4MzkyNy5vCiBvYmotJChDT05GSUdfU09DX1RYNDkyNykJKz0gbWVtX3R4NDkyNy5vIHNldHVwX3R4NDkyNy5vIGlycV90eDQ5Mjcubwogb2JqLSQoQ09ORklHX1NPQ19UWDQ5MzgpCSs9IG1lbV90eDQ5MjcubyBzZXR1cF90eDQ5MzgubyBpcnFfdHg0OTM4Lm8KK29iai0kKENPTkZJR19TT0NfVFg0OTM5KQkrPSBzZXR1cF90eDQ5MzkubyBpcnFfdHg0OTM5Lm8KIG9iai0kKENPTkZJR19UT1NISUJBX0ZQQ0lCMCkJKz0gc21zY19mZGMzN204MXgubworb2JqLSQoQ09ORklHX1NQSSkJCSs9IHNwaV9lZXByb20ubwogCiBFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9pcnFfdHg0OTI3LmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MjcuYwppbmRleCBjYmVhMWZkLi5hZDI4NzBkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MjcuYworKysgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MjcuYwpAQCAtMzAsOCArMzAsMTkgQEAKIAogdm9pZCBfX2luaXQgdHg0OTI3X2lycV9pbml0KHZvaWQpCiB7CisJaW50IGk7CisKIAltaXBzX2NwdV9pcnFfaW5pdCgpOwogCXR4eDlfaXJxX2luaXQoVFg0OTI3X0lSQ19SRUcgJiAweGZmZmZmZmZmZlVMTCk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoTUlQU19DUFVfSVJRX0JBU0UgKyBUWDQ5MjdfSVJDX0lOVCwKIAkJCQloYW5kbGVfc2ltcGxlX2lycSk7CisJLyogcmFpc2UgcHJpb3JpdHkgZm9yIGVycm9ycywgdGltZXJzLCBTSU8gKi8KKwl0eHg5X2lycV9zZXRfcHJpKFRYNDkyN19JUl9FQ0NFUlIsIDcpOworCXR4eDlfaXJxX3NldF9wcmkoVFg0OTI3X0lSX1dUT0VSUiwgNyk7CisJdHh4OV9pcnFfc2V0X3ByaShUWDQ5MjdfSVJfUENJRVJSLCA3KTsKKwl0eHg5X2lycV9zZXRfcHJpKFRYNDkyN19JUl9QQ0lQTUUsIDcpOworCWZvciAoaSA9IDA7IGkgPCBUWDQ5MjdfTlVNX0lSX1RNUjsgaSsrKQorCQl0eHg5X2lycV9zZXRfcHJpKFRYNDkyN19JUl9UTVIoaSksIDYpOworCWZvciAoaSA9IDA7IGkgPCBUWDQ5MjdfTlVNX0lSX1NJTzsgaSsrKQorCQl0eHg5X2lycV9zZXRfcHJpKFRYNDkyN19JUl9TSU8oaSksIDUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9pcnFfdHg0OTM4LmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MzguYwppbmRleCA2ZWFjNjg0Li4wMjVhZTExIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MzguYworKysgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MzguYwpAQCAtMTgsOCArMTgsMTkgQEAKIAogdm9pZCBfX2luaXQgdHg0OTM4X2lycV9pbml0KHZvaWQpCiB7CisJaW50IGk7CisKIAltaXBzX2NwdV9pcnFfaW5pdCgpOwogCXR4eDlfaXJxX2luaXQoVFg0OTM4X0lSQ19SRUcgJiAweGZmZmZmZmZmZlVMTCk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoTUlQU19DUFVfSVJRX0JBU0UgKyBUWDQ5MzhfSVJDX0lOVCwKIAkJCQloYW5kbGVfc2ltcGxlX2lycSk7CisJLyogcmFpc2UgcHJpb3JpdHkgZm9yIGVycm9ycywgdGltZXJzLCBTSU8gKi8KKwl0eHg5X2lycV9zZXRfcHJpKFRYNDkzOF9JUl9FQ0NFUlIsIDcpOworCXR4eDlfaXJxX3NldF9wcmkoVFg0OTM4X0lSX1dUT0VSUiwgNyk7CisJdHh4OV9pcnFfc2V0X3ByaShUWDQ5MzhfSVJfUENJRVJSLCA3KTsKKwl0eHg5X2lycV9zZXRfcHJpKFRYNDkzOF9JUl9QQ0lQTUUsIDcpOworCWZvciAoaSA9IDA7IGkgPCBUWDQ5MzhfTlVNX0lSX1RNUjsgaSsrKQorCQl0eHg5X2lycV9zZXRfcHJpKFRYNDkzOF9JUl9UTVIoaSksIDYpOworCWZvciAoaSA9IDA7IGkgPCBUWDQ5MzhfTlVNX0lSX1NJTzsgaSsrKQorCQl0eHg5X2lycV9zZXRfcHJpKFRYNDkzOF9JUl9TSU8oaSksIDUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9pcnFfdHg0OTM5LmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL2lycV90eDQ5MzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMyMTNhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvaXJxX3R4NDkzOS5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogVFg0OTM5IGlycSByb3V0aW5lcworICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL2tlcm5lbC9pcnFfdHh4OS5jLAorICoJICAgIGFuZCBSQlRYNDl4eCBwYXRjaCBmcm9tIENFTEYgcGF0Y2ggYXJjaGl2ZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMy0yMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIGFoZW5uZXNzeUBtdmlzdGEuY29tCisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwyMDA1LTIwMDcgVG9zaGliYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisvKgorICogVFg0OTM5IGRlZmluZXMgNjQgSVJRcy4KKyAqIFNpbWlsZXIgdG8gaXJxX3R4eDkuYyBidXQgZGlmZmVyZW50IHJlZ2lzdGVyIGxheW91dHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgorI2luY2x1ZGUgPGFzbS90eHg5aXJxLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CisKKy8qIElSQ0VSIDogSW50LiBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBUWHg5X0lSQ0VSX0lDRQkweDAwMDAwMDAxCisKKy8qIElSQ1IgOiBJbnQuIENvbnRyb2wgKi8KKyNkZWZpbmUgVFh4OV9JUkNSX0xPVwkweDAwMDAwMDAwCisjZGVmaW5lIFRYeDlfSVJDUl9ISUdICTB4MDAwMDAwMDEKKyNkZWZpbmUgVFh4OV9JUkNSX0RPV04JMHgwMDAwMDAwMgorI2RlZmluZSBUWHg5X0lSQ1JfVVAJMHgwMDAwMDAwMworI2RlZmluZSBUWHg5X0lSQ1JfRURHRShjcikJKChjcikgJiAweDAwMDAwMDAyKQorCisvKiBJUlNDUiA6IEludC4gU3RhdHVzIENvbnRyb2wgKi8KKyNkZWZpbmUgVFh4OV9JUlNDUl9FSUNsckUJMHgwMDAwMDEwMAorI2RlZmluZSBUWHg5X0lSU0NSX0VJQ2xyX01BU0sJMHgwMDAwMDAwZgorCisvKiBJUkNTUiA6IEludC4gQ3VycmVudCBTdGF0dXMgKi8KKyNkZWZpbmUgVFh4OV9JUkNTUl9JRgkweDAwMDEwMDAwCisKKyNkZWZpbmUgaXJjX2RsZXZlbAkwCisjZGVmaW5lIGlyY19lbGV2ZWwJMQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGxldmVsOworCXVuc2lnbmVkIGNoYXIgbW9kZTsKK30gdHg0OTM5aXJxW1RYNDkzOV9OVU1fSVJdIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyB2b2lkIHR4NDkzOV9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IGlycV9uciA9IGlycSAtIFRYWDlfSVJRX0JBU0U7CisJdTMyIF9faW9tZW0gKmx2bHA7CisJaW50IG9mczsKKwlpZiAoaXJxX25yIDwgMzIpIHsKKwkJaXJxX25yLS07CisJCWx2bHAgPSAmdHg0OTM5X2lyY3B0ci0+bHZsWyhpcnFfbnIgJSAxNikgLyAyXS5yOworCX0gZWxzZSB7CisJCWlycV9uciAtPSAzMjsKKwkJbHZscCA9ICZ0eDQ5MzlfaXJjcHRyLT5sdmxbOCArIChpcnFfbnIgJSAxNikgLyAyXS5yOworCX0KKwlvZnMgPSAoaXJxX25yICYgMTYpICsgKGlycV9uciAmIDEpICogODsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKGx2bHApICYgfigweGZmIDw8IG9mcykpCisJCSAgICAgfCAodHg0OTM5aXJxW2lycV9ucl0ubGV2ZWwgPDwgb2ZzKSwKKwkJICAgICBsdmxwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHR4NDkzOV9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBUWFg5X0lSUV9CQVNFOworCXUzMiBfX2lvbWVtICpsdmxwOworCWludCBvZnM7CisJaWYgKGlycV9uciA8IDMyKSB7CisJCWlycV9uci0tOworCQlsdmxwID0gJnR4NDkzOV9pcmNwdHItPmx2bFsoaXJxX25yICUgMTYpIC8gMl0ucjsKKwl9IGVsc2UgeworCQlpcnFfbnIgLT0gMzI7CisJCWx2bHAgPSAmdHg0OTM5X2lyY3B0ci0+bHZsWzggKyAoaXJxX25yICUgMTYpIC8gMl0ucjsKKwl9CisJb2ZzID0gKGlycV9uciAmIDE2KSArIChpcnFfbnIgJiAxKSAqIDg7CisJX19yYXdfd3JpdGVsKChfX3Jhd19yZWFkbChsdmxwKSAmIH4oMHhmZiA8PCBvZnMpKQorCQkgICAgIHwgKGlyY19kbGV2ZWwgPDwgb2ZzKSwKKwkJICAgICBsdmxwKTsKKwltbWlvd2IoKTsKK30KKworc3RhdGljIHZvaWQgdHg0OTM5X2lycV9tYXNrX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBUWFg5X0lSUV9CQVNFOworCisJdHg0OTM5X2lycV9tYXNrKGlycSk7CisJaWYgKFRYeDlfSVJDUl9FREdFKHR4NDkzOWlycVtpcnFfbnJdLm1vZGUpKSB7CisJCWlycV9uci0tOworCQkvKiBjbGVhciBlZGdlIGRldGVjdGlvbiAqLworCQlfX3Jhd193cml0ZWwoKFRYeDlfSVJTQ1JfRUlDbHJFIHwgKGlycV9uciAmIDB4ZikpCisJCQkgICAgIDw8IChpcnFfbnIgJiAweDEwKSwKKwkJCSAgICAgJnR4NDkzOV9pcmNwdHItPmVkYy5yKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X2lycV9zZXRfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQoreworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBUWFg5X0lSUV9CQVNFOworCXUzMiBjcjsKKwl1MzIgX19pb21lbSAqY3JwOworCWludCBvZnM7CisJaW50IG1vZGU7CisKKwlpZiAoZmxvd190eXBlICYgSVJRRl9UUklHR0VSX1BST0JFKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGZsb3dfdHlwZSAmIElSUUZfVFJJR0dFUl9NQVNLKSB7CisJY2FzZSBJUlFGX1RSSUdHRVJfUklTSU5HOgorCQltb2RlID0gVFh4OV9JUkNSX1VQOworCQlicmVhazsKKwljYXNlIElSUUZfVFJJR0dFUl9GQUxMSU5HOgorCQltb2RlID0gVFh4OV9JUkNSX0RPV047CisJCWJyZWFrOworCWNhc2UgSVJRRl9UUklHR0VSX0hJR0g6CisJCW1vZGUgPSBUWHg5X0lSQ1JfSElHSDsKKwkJYnJlYWs7CisJY2FzZSBJUlFGX1RSSUdHRVJfTE9XOgorCQltb2RlID0gVFh4OV9JUkNSX0xPVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChpcnFfbnIgPCAzMikgeworCQlpcnFfbnItLTsKKwkJY3JwID0gJnR4NDkzOV9pcmNwdHItPmRtWyhpcnFfbnIgJiA4KSA+PiAzXS5yOworCX0gZWxzZSB7CisJCWlycV9uciAtPSAzMjsKKwkJY3JwID0gJnR4NDkzOV9pcmNwdHItPmRtMlsoKGlycV9uciAmIDgpID4+IDMpXS5yOworCX0KKwlvZnMgPSAoKChpcnFfbnIgJiAxNikgPj4gMSkgfCAoaXJxX25yICYgKDggLSAxKSkpICogMjsKKwljciA9IF9fcmF3X3JlYWRsKGNycCk7CisJY3IgJj0gfigweDMgPDwgb2ZzKTsKKwljciB8PSAobW9kZSAmIDB4MykgPDwgb2ZzOworCV9fcmF3X3dyaXRlbChjciwgY3JwKTsKKwl0eDQ5MzlpcnFbaXJxX25yXS5tb2RlID0gbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0eDQ5MzlfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIlRYNDkzOSIsCisJLmFjawkJPSB0eDQ5MzlfaXJxX21hc2tfYWNrLAorCS5tYXNrCQk9IHR4NDkzOV9pcnFfbWFzaywKKwkubWFza19hY2sJPSB0eDQ5MzlfaXJxX21hc2tfYWNrLAorCS51bm1hc2sJCT0gdHg0OTM5X2lycV91bm1hc2ssCisJLnNldF90eXBlCT0gdHg0OTM5X2lycV9zZXRfdHlwZSwKK307CisKK3N0YXRpYyBpbnQgdHg0OTM5X2lycV9zZXRfcHJpKGludCBpcmNfaXJxLCBpbnQgbmV3X3ByaSkKK3sKKwlpbnQgb2xkX3ByaTsKKworCWlmICgodW5zaWduZWQgaW50KWlyY19pcnEgPj0gVFg0OTM5X05VTV9JUikKKwkJcmV0dXJuIDA7CisJb2xkX3ByaSA9IHR4NDkzOWlycVtpcmNfaXJxXS5sZXZlbDsKKwl0eDQ5MzlpcnFbaXJjX2lycV0ubGV2ZWwgPSBuZXdfcHJpOworCXJldHVybiBvbGRfcHJpOworfQorCit2b2lkIF9faW5pdCB0eDQ5MzlfaXJxX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW1pcHNfY3B1X2lycV9pbml0KCk7CisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29udHJvbCAqLworCV9fcmF3X3dyaXRlbCgwLCAmdHg0OTM5X2lyY3B0ci0+ZGVuLnIpOworCV9fcmF3X3dyaXRlbCgwLCAmdHg0OTM5X2lyY3B0ci0+bWFza2ludC5yKTsKKwlfX3Jhd193cml0ZWwoMCwgJnR4NDkzOV9pcmNwdHItPm1hc2tleHQucik7CisJLyogaXJxX2Jhc2UgKyAwIGlzIG5vdCB1c2VkICovCisJZm9yIChpID0gMTsgaSA8IFRYNDkzOV9OVU1fSVI7IGkrKykgeworCQl0eDQ5MzlpcnFbaV0ubGV2ZWwgPSA0OyAvKiBtaWRkbGUgbGV2ZWwgKi8KKwkJdHg0OTM5aXJxW2ldLm1vZGUgPSBUWHg5X0lSQ1JfTE9XOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoVFhYOV9JUlFfQkFTRSArIGksCisJCQkJCSAmdHg0OTM5X2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwl9CisKKwkvKiBtYXNrIGFsbCBJUkMgaW50ZXJydXB0cyAqLworCV9fcmF3X3dyaXRlbCgwLCAmdHg0OTM5X2lyY3B0ci0+bXNrLnIpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlfX3Jhd193cml0ZWwoMCwgJnR4NDkzOV9pcmNwdHItPmx2bFtpXS5yKTsKKwkvKiBzZXR1cCBJUkMgaW50ZXJydXB0IG1vZGUgKExvdyBBY3RpdmUpICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJX19yYXdfd3JpdGVsKDAsICZ0eDQ5MzlfaXJjcHRyLT5kbVtpXS5yKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlfX3Jhd193cml0ZWwoMCwgJnR4NDkzOV9pcmNwdHItPmRtMltpXS5yKTsKKwkvKiBlbmFibGUgaW50ZXJydXB0IGNvbnRyb2wgKi8KKwlfX3Jhd193cml0ZWwoVFh4OV9JUkNFUl9JQ0UsICZ0eDQ5MzlfaXJjcHRyLT5kZW4ucik7CisJX19yYXdfd3JpdGVsKGlyY19lbGV2ZWwsICZ0eDQ5MzlfaXJjcHRyLT5tc2sucik7CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihNSVBTX0NQVV9JUlFfQkFTRSArIFRYNDkzOV9JUkNfSU5ULAorCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKKworCS8qIHJhaXNlIHByaW9yaXR5IGZvciBlcnJvcnMsIHRpbWVycywgc2lvICovCisJdHg0OTM5X2lycV9zZXRfcHJpKFRYNDkzOV9JUl9XVE9FUlIsIDcpOworCXR4NDkzOV9pcnFfc2V0X3ByaShUWDQ5MzlfSVJfUENJRVJSLCA3KTsKKwl0eDQ5MzlfaXJxX3NldF9wcmkoVFg0OTM5X0lSX1BDSVBNRSwgNyk7CisJZm9yIChpID0gMDsgaSA8IFRYNDkzOV9OVU1fSVJfVE1SOyBpKyspCisJCXR4NDkzOV9pcnFfc2V0X3ByaShUWDQ5MzlfSVJfVE1SKGkpLCA2KTsKKwlmb3IgKGkgPSAwOyBpIDwgVFg0OTM5X05VTV9JUl9TSU87IGkrKykKKwkJdHg0OTM5X2lycV9zZXRfcHJpKFRYNDkzOV9JUl9TSU8oaSksIDUpOworfQorCitpbnQgdHg0OTM5X2lycSh2b2lkKQoreworCXUzMiBjc3IgPSBfX3Jhd19yZWFkbCgmdHg0OTM5X2lyY3B0ci0+Y3Mucik7CisKKwlpZiAobGlrZWx5KCEoY3NyICYgVFh4OV9JUkNTUl9JRikpKQorCQlyZXR1cm4gVFhYOV9JUlFfQkFTRSArIChjc3IgJiAoVFg0OTM5X05VTV9JUiAtIDEpKTsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwLmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwLmMKaW5kZXggMGFmZTk0Yy4uNTUyNjM3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXAuYwpAQCAtMjIsMTEgKzIyLDE2IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3I0a2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3R4eDkvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGFzbS90eHg5L3BjaS5oPgorI2luY2x1ZGUgPGFzbS90eHg5dG1yLmg+CiAjaWZkZWYgQ09ORklHX0NQVV9UWDQ5WFgKICNpbmNsdWRlIDxhc20vdHh4OS90eDQ5MzguaD4KICNlbmRpZgpAQCAtNTMsNiArNTgsNyBAQAogCQl0eHg5X2NlX3Jlc1tpXS5uYW1lID0gdHh4OV9jZV9yZXNfbmFtZVtpXTsKIAl9CiAKKwl0eHg5X3Bjb2RlID0gcGNvZGU7CiAJc3ByaW50Zih0eHg5X3Bjb2RlX3N0ciwgIlRYJXgiLCBwY29kZSk7CiAJaWYgKGJhc2UpIHsKIAkJdHh4OV9yZWdfcmVzLnN0YXJ0ID0gYmFzZSAmIDB4ZmZmZmZmZmZmVUxMOwpAQCAtNjYsNyArNzIsMTIgQEAKIHVuc2lnbmVkIGludCB0eHg5X2NwdV9jbG9jazsKIHVuc2lnbmVkIGludCB0eHg5X2didXNfY2xvY2s7CiAKKyNpZmRlZiBDT05GSUdfQ1BVX1RYMzlYWAorLyogZG9uJ3QgZW5hYmxlIGJ5IGRlZmF1bHQgLSBzZWUgZXJyYXRhICovCitpbnQgdHh4OV9jY2ZnX3RvZW9uIF9faW5pdGRhdGE7CisjZWxzZQogaW50IHR4eDlfY2NmZ190b2VvbiBfX2luaXRkYXRhID0gMTsKKyNlbmRpZgogCiAvKiBNaW5pbXVtIENMSyBzdXBwb3J0ICovCiAKQEAgLTExOCwzOSArMTI5LDIzMiBAQAogRVhQT1JUX1NZTUJPTChpcnFfdG9fZ3Bpbyk7CiAjZW5kaWYKIAotZXh0ZXJuIHN0cnVjdCB0eHg5X2JvYXJkX3ZlYyBqbXIzOTI3X3ZlYzsKLWV4dGVybiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgcmJ0eDQ5MjdfdmVjOwotZXh0ZXJuIHN0cnVjdCB0eHg5X2JvYXJkX3ZlYyByYnR4NDkzN192ZWM7Ci1leHRlcm4gc3RydWN0IHR4eDlfYm9hcmRfdmVjIHJidHg0OTM4X3ZlYzsKKyNkZWZpbmUgQk9BUkRfVkVDKGJvYXJkKQlleHRlcm4gc3RydWN0IHR4eDlfYm9hcmRfdmVjIGJvYXJkOworI2luY2x1ZGUgPGFzbS90eHg5L2JvYXJkcy5oPgorI3VuZGVmIEJPQVJEX1ZFQwogCiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgKnR4eDlfYm9hcmRfdmVjIF9faW5pdGRhdGE7CiBzdGF0aWMgY2hhciB0eHg5X3N5c3RlbV90eXBlWzMyXTsKIAotdm9pZCBfX2luaXQgcHJvbV9pbml0X2NtZGxpbmUodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgKmJvYXJkX3ZlY3NbXSBfX2luaXRkYXRhID0geworI2RlZmluZSBCT0FSRF9WRUMoYm9hcmQpCSZib2FyZCwKKyNpbmNsdWRlIDxhc20vdHh4OS9ib2FyZHMuaD4KKyN1bmRlZiBCT0FSRF9WRUMKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgKl9faW5pdCBmaW5kX2JvYXJkX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJLyogc2VhcmNoIGJvYXJkX3ZlY3MgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZF92ZWNzKTsgaSsrKSB7CisJCWlmIChzdHJzdHIoYm9hcmRfdmVjc1tpXS0+c3lzdGVtLCBuYW1lKSkKKwkJCXJldHVybiBib2FyZF92ZWNzW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHByb21faW5pdF9jbWRsaW5lKHZvaWQpCiB7CiAJaW50IGFyZ2MgPSAoaW50KWZ3X2FyZzA7Ci0JY2hhciAqKmFyZ3YgPSAoY2hhciAqKilmd19hcmcxOworCWludCAqYXJndjMyID0gKGludCAqKWZ3X2FyZzE7CiAJaW50IGk7CQkJLyogQWx3YXlzIGlnbm9yZSB0aGUgIi1jIiBhdCBhcmd2WzBdICovCi0jaWZkZWYgQ09ORklHXzY0QklUCi0JY2hhciAqZml4ZWRfYXJndlszMl07Ci0JZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKLQkJZml4ZWRfYXJndltpXSA9IChjaGFyICopKGxvbmcpKCooKF9fczMyICopYXJndiArIGkpKTsKLQlhcmd2ID0gZml4ZWRfYXJndjsKLSNlbmRpZgorCWNoYXIgYnVpbHRpbltDTF9TSVpFXTsKIAogCS8qIGlnbm9yZSBhbGwgYnVpbHQtaW4gYXJncyBpZiBhbnkgZi93IGFyZ3MgZ2l2ZW4gKi8KLQlpZiAoYXJnYyA+IDEpCi0JCSphcmNzX2NtZGxpbmUgPSAnXDAnOworCS8qCisJICogQnV0IGlmIGJ1aWx0LWluIHN0cmluZ3Mgd2FzIHN0YXJ0ZWQgd2l0aCAnKycsIGFwcGVuZCB0aGVtCisJICogdG8gY29tbWFuZCBsaW5lIGFyZ3MuICBJZiBidWlsdC1pbiB3YXMgc3RhcnRlZCB3aXRoICctJywKKwkgKiBpZ25vcmUgYWxsIGYvdyBhcmdzLgorCSAqLworCWJ1aWx0aW5bMF0gPSAnXDAnOworCWlmIChhcmNzX2NtZGxpbmVbMF0gPT0gJysnKQorCQlzdHJjcHkoYnVpbHRpbiwgYXJjc19jbWRsaW5lICsgMSk7CisJZWxzZSBpZiAoYXJjc19jbWRsaW5lWzBdID09ICctJykgeworCQlzdHJjcHkoYnVpbHRpbiwgYXJjc19jbWRsaW5lICsgMSk7CisJCWFyZ2MgPSAwOworCX0gZWxzZSBpZiAoYXJnYyA8PSAxKQorCQlzdHJjcHkoYnVpbHRpbiwgYXJjc19jbWRsaW5lKTsKKwlhcmNzX2NtZGxpbmVbMF0gPSAnXDAnOwogCiAJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICpzdHIgPSAoY2hhciAqKShsb25nKWFyZ3YzMltpXTsKIAkJaWYgKGkgIT0gMSkKIAkJCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgIik7Ci0JCXN0cmNhdChhcmNzX2NtZGxpbmUsIGFyZ3ZbaV0pOworCQlpZiAoc3RyY2hyKHN0ciwgJyAnKSkgeworCQkJc3RyY2F0KGFyY3NfY21kbGluZSwgIlwiIik7CisJCQlzdHJjYXQoYXJjc19jbWRsaW5lLCBzdHIpOworCQkJc3RyY2F0KGFyY3NfY21kbGluZSwgIlwiIik7CisJCX0gZWxzZQorCQkJc3RyY2F0KGFyY3NfY21kbGluZSwgc3RyKTsKKwl9CisJLyogYXBwZW5kIHNhdmVkIGJ1aWx0aW4gYXJncyAqLworCWlmIChidWlsdGluWzBdKSB7CisJCWlmIChhcmNzX2NtZGxpbmVbMF0pCisJCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiICIpOworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCBidWlsdGluKTsKIAl9CiB9CiAKLXZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQorc3RhdGljIGludCB0eHg5X2ljX2Rpc2FibGUgX19pbml0ZGF0YTsKK3N0YXRpYyBpbnQgdHh4OV9kY19kaXNhYmxlIF9faW5pdGRhdGE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfVFg0OVhYKQorLyogZmx1c2ggYWxsIGNhY2hlIG9uIHZlcnkgZWFybHkgc3RhZ2UgKGJlZm9yZSA0a19jYWNoZV9pbml0KSAqLworc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X2ZsdXNoX2RjYWNoZSh2b2lkKQogeworCXVuc2lnbmVkIGludCBjb25mID0gcmVhZF9jMF9jb25maWcoKTsKKwl1bnNpZ25lZCBpbnQgZGNfc2l6ZSA9IDEgPDwgKDEyICsgKChjb25mICYgQ09ORl9EQykgPj4gNikpOworCXVuc2lnbmVkIGludCBsaW5lc3ogPSAzMjsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKKworCWVuZCA9IElOREVYX0JBU0UgKyBkY19zaXplIC8gNDsKKwkvKiA0d2F5LCB3YXliaXQ9MCAqLworCWZvciAoYWRkciA9IElOREVYX0JBU0U7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gbGluZXN6KSB7CisJCWNhY2hlX29wKEluZGV4X1dyaXRlYmFja19JbnZfRCwgYWRkciB8IDApOworCQljYWNoZV9vcChJbmRleF9Xcml0ZWJhY2tfSW52X0QsIGFkZHIgfCAxKTsKKwkJY2FjaGVfb3AoSW5kZXhfV3JpdGViYWNrX0ludl9ELCBhZGRyIHwgMik7CisJCWNhY2hlX29wKEluZGV4X1dyaXRlYmFja19JbnZfRCwgYWRkciB8IDMpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHR4eDlfY2FjaGVfZml4dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY29uZjsKKworCWNvbmYgPSByZWFkX2MwX2NvbmZpZygpOworCS8qIGZsdXNoIGFuZCBkaXNhYmxlICovCisJaWYgKHR4eDlfaWNfZGlzYWJsZSkgeworCQljb25mIHw9IFRYNDlfQ09ORl9JQzsKKwkJd3JpdGVfYzBfY29uZmlnKGNvbmYpOworCX0KKwlpZiAodHh4OV9kY19kaXNhYmxlKSB7CisJCWVhcmx5X2ZsdXNoX2RjYWNoZSgpOworCQljb25mIHw9IFRYNDlfQ09ORl9EQzsKKwkJd3JpdGVfYzBfY29uZmlnKGNvbmYpOworCX0KKworCS8qIGVuYWJsZSBjYWNoZSAqLworCWNvbmYgPSByZWFkX2MwX2NvbmZpZygpOworCWlmICghdHh4OV9pY19kaXNhYmxlKQorCQljb25mICY9IH5UWDQ5X0NPTkZfSUM7CisJaWYgKCF0eHg5X2RjX2Rpc2FibGUpCisJCWNvbmYgJj0gflRYNDlfQ09ORl9EQzsKKwl3cml0ZV9jMF9jb25maWcoY29uZik7CisKKwlpZiAoY29uZiAmIFRYNDlfQ09ORl9JQykKKwkJcHJfaW5mbygiVFg0OVhYIEktQ2FjaGUgZGlzYWJsZWQuXG4iKTsKKwlpZiAoY29uZiAmIFRYNDlfQ09ORl9EQykKKwkJcHJfaW5mbygiVFg0OVhYIEQtQ2FjaGUgZGlzYWJsZWQuXG4iKTsKK30KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9UWDM5WFgpCisvKiBmbHVzaCBhbGwgY2FjaGUgb24gdmVyeSBlYXJseSBzdGFnZSAoYmVmb3JlIHR4MzlfY2FjaGVfaW5pdCkgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9mbHVzaF9kY2FjaGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY29uZiA9IHJlYWRfYzBfY29uZmlnKCk7CisJdW5zaWduZWQgaW50IGRjX3NpemUgPSAxIDw8ICgxMCArICgoY29uZiAmIFRYMzlfQ09ORl9EQ1NfTUFTSykgPj4KKwkJCQkJICAgVFgzOV9DT05GX0RDU19TSElGVCkpOworCXVuc2lnbmVkIGludCBsaW5lc3ogPSAxNjsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKKworCWVuZCA9IElOREVYX0JBU0UgKyBkY19zaXplIC8gMjsKKwkvKiAyd2F5LCB3YXliaXQ9MCAqLworCWZvciAoYWRkciA9IElOREVYX0JBU0U7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gbGluZXN6KSB7CisJCWNhY2hlX29wKEluZGV4X1dyaXRlYmFja19JbnZfRCwgYWRkciB8IDApOworCQljYWNoZV9vcChJbmRleF9Xcml0ZWJhY2tfSW52X0QsIGFkZHIgfCAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0eHg5X2NhY2hlX2ZpeHVwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNvbmY7CisKKwljb25mID0gcmVhZF9jMF9jb25maWcoKTsKKwkvKiBmbHVzaCBhbmQgZGlzYWJsZSAqLworCWlmICh0eHg5X2ljX2Rpc2FibGUpIHsKKwkJY29uZiAmPSB+VFgzOV9DT05GX0lDRTsKKwkJd3JpdGVfYzBfY29uZmlnKGNvbmYpOworCX0KKwlpZiAodHh4OV9kY19kaXNhYmxlKSB7CisJCWVhcmx5X2ZsdXNoX2RjYWNoZSgpOworCQljb25mICY9IH5UWDM5X0NPTkZfRENFOworCQl3cml0ZV9jMF9jb25maWcoY29uZik7CisJfQorCisJLyogZW5hYmxlIGNhY2hlICovCisJY29uZiA9IHJlYWRfYzBfY29uZmlnKCk7CisJaWYgKCF0eHg5X2ljX2Rpc2FibGUpCisJCWNvbmYgfD0gVFgzOV9DT05GX0lDRTsKKwlpZiAoIXR4eDlfZGNfZGlzYWJsZSkKKwkJY29uZiB8PSBUWDM5X0NPTkZfRENFOworCXdyaXRlX2MwX2NvbmZpZyhjb25mKTsKKworCWlmICghKGNvbmYgJiBUWDM5X0NPTkZfSUNFKSkKKwkJcHJfaW5mbygiVFgzOVhYIEktQ2FjaGUgZGlzYWJsZWQuXG4iKTsKKwlpZiAoIShjb25mICYgVFgzOV9DT05GX0RDRSkpCisJCXByX2luZm8oIlRYMzlYWCBELUNhY2hlIGRpc2FibGVkLlxuIik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHR4eDlfY2FjaGVfZml4dXAodm9pZCkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJlcHJvY2Vzc19jbWRsaW5lKHZvaWQpCit7CisJY2hhciBjbWRsaW5lW0NMX1NJWkVdOworCWNoYXIgKnM7CisKKwlzdHJjcHkoY21kbGluZSwgYXJjc19jbWRsaW5lKTsKKwlzID0gY21kbGluZTsKKwlhcmNzX2NtZGxpbmVbMF0gPSAnXDAnOworCXdoaWxlIChzICYmICpzKSB7CisJCWNoYXIgKnN0ciA9IHN0cnNlcCgmcywgIiAiKTsKKwkJaWYgKHN0cm5jbXAoc3RyLCAiYm9hcmQ9IiwgNikgPT0gMCkgeworCQkJdHh4OV9ib2FyZF92ZWMgPSBmaW5kX2JvYXJkX2J5bmFtZShzdHIgKyA2KTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCAibWFzdGVyY2xrPSIsIDEwKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHZhbDsKKwkJCWlmIChzdHJpY3Rfc3RydG91bChzdHIgKyAxMCwgMTAsICZ2YWwpID09IDApCisJCQkJdHh4OV9tYXN0ZXJfY2xvY2sgPSB2YWw7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoc3RyLCAiaWNkaXNhYmxlIikgPT0gMCkgeworCQkJdHh4OV9pY19kaXNhYmxlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcChzdHIsICJkY2Rpc2FibGUiKSA9PSAwKSB7CisJCQl0eHg5X2RjX2Rpc2FibGUgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RyY21wKHN0ciwgInRvZW9mZiIpID09IDApIHsKKwkJCXR4eDlfY2NmZ190b2VvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoc3RyLCAidG9lb24iKSA9PSAwKSB7CisJCQl0eHg5X2NjZmdfdG9lb24gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyY3NfY21kbGluZVswXSkKKwkJCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgIik7CisJCXN0cmNhdChhcmNzX2NtZGxpbmUsIHN0cik7CisJfQorCisJdHh4OV9jYWNoZV9maXh1cCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2VsZWN0X2JvYXJkKHZvaWQpCit7CisJY29uc3QgY2hhciAqZW52c3RyOworCisJLyogZmlyc3QsIGRldGVybWluZSBieSAiYm9hcmQ9IiBhcmd1bWVudCBpbiBwcmVwcm9jZXNzX2NtZGxpbmUoKSAqLworCWlmICh0eHg5X2JvYXJkX3ZlYykKKwkJcmV0dXJuOworCS8qIG5leHQsIGRldGVybWluZSBieSAiYm9hcmQiIGVudnZhciAqLworCWVudnN0ciA9IHByb21fZ2V0ZW52KCJib2FyZCIpOworCWlmIChlbnZzdHIpIHsKKwkJdHh4OV9ib2FyZF92ZWMgPSBmaW5kX2JvYXJkX2J5bmFtZShlbnZzdHIpOworCQlpZiAodHh4OV9ib2FyZF92ZWMpCisJCQlyZXR1cm47CisJfQorCisJLyogc2VsZWN0ICJkZWZhdWx0IiBib2FyZCAqLwogI2lmZGVmIENPTkZJR19DUFVfVFgzOVhYCiAJdHh4OV9ib2FyZF92ZWMgPSAmam1yMzkyN192ZWM7CiAjZW5kaWYKQEAgLTE2OSw4ICszNzMsMjAgQEAKIAkJdHh4OV9ib2FyZF92ZWMgPSAmcmJ0eDQ5MzhfdmVjOwogCQlicmVhazsKICNlbmRpZgorI2lmZGVmIENPTkZJR19UT1NISUJBX1JCVFg0OTM5CisJY2FzZSAweDQ5Mzk6CisJCXR4eDlfYm9hcmRfdmVjID0gJnJidHg0OTM5X3ZlYzsKKwkJYnJlYWs7CisjZW5kaWYKIAl9CiAjZW5kaWYKK30KKwordm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCit7CisJcHJvbV9pbml0X2NtZGxpbmUoKTsKKwlwcmVwcm9jZXNzX2NtZGxpbmUoKTsKKwlzZWxlY3RfYm9hcmQoKTsKIAogCXN0cmNweSh0eHg5X3N5c3RlbV90eXBlLCB0eHg5X2JvYXJkX3ZlYy0+c3lzdGVtKTsKIApAQCAtMTc5LDYgKzM5NSwxMSBAQAogCiB2b2lkIF9faW5pdCBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIHNhZGRyID0gUEFHRV9TSVpFOworCXVuc2lnbmVkIGxvbmcgZWFkZHIgPSBfX3BhX3N5bWJvbCgmX3RleHQpOworCisJaWYgKHNhZGRyIDwgZWFkZHIpCisJCWZyZWVfaW5pdF9wYWdlcygicHJvbSBtZW1vcnkiLCBzYWRkciwgZWFkZHIpOwogfQogCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKQEAgLTE5MSw2ICs0MTIsMjEgQEAKIAlyZXR1cm4gJihhcmNzX2NtZGxpbmVbMF0pOwogfQogCitjb25zdCBjaGFyICpfX2luaXQgcHJvbV9nZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzMzIgKnN0ciA9IChjb25zdCBzMzIgKilmd19hcmcyOworCisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCS8qIFlBTU9OIHN0eWxlICgibmFtZSIsICJ2YWx1ZSIgcGFpcnMpICovCisJd2hpbGUgKHN0clswXSAmJiBzdHJbMV0pIHsKKwkJaWYgKCFzdHJjbXAoKGNvbnN0IGNoYXIgKikodW5zaWduZWQgbG9uZylzdHJbMF0sIG5hbWUpKQorCQkJcmV0dXJuIChjb25zdCBjaGFyICopKHVuc2lnbmVkIGxvbmcpc3RyWzFdOworCQlzdHIgKz0gMjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIF9fbm9yZXR1cm4gdHh4OV9tYWNoaW5lX2hhbHQodm9pZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMjIxLDYgKzQ1NywyMCBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInR4eDl3ZHQiLCAtMSwgJnJlcywgMSk7CiB9CiAKK3ZvaWQgdHh4OV93ZHRfbm93KHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlzdHJ1Y3QgdHh4OV90bXJfcmVnIF9faW9tZW0gKnRtcnB0ciA9CisJCWlvcmVtYXAoYmFzZSwgc2l6ZW9mKHN0cnVjdCB0eHg5X3Rtcl9yZWcpKTsKKwkvKiBkaXNhYmxlIHdhdGNoIGRvZyB0aW1lciAqLworCV9fcmF3X3dyaXRlbChUWHg5X1RNV1RNUl9XRElTIHwgVFh4OV9UTVdUTVJfVFdDLCAmdG1ycHRyLT53dG1yKTsKKwlfX3Jhd193cml0ZWwoMCwgJnRtcnB0ci0+dGNyKTsKKwkvKiBraWNrIHdhdGNoZG9nICovCisJX19yYXdfd3JpdGVsKFRYeDlfVE1XVE1SX1RXSUUsICZ0bXJwdHItPnd0bXIpOworCV9fcmF3X3dyaXRlbCgxLCAmdG1ycHRyLT5jcHJhKTsgLyogaW1tZWRpYXRlICovCisJX19yYXdfd3JpdGVsKFRYeDlfVE1UQ1JfVENFIHwgVFh4OV9UTVRDUl9DQ0RFIHwgVFh4OV9UTVRDUl9UTU9ERV9XRE9HLAorCQkgICAgICZ0bXJwdHItPnRjcik7Cit9CisKIC8qIFNQSSBzdXBwb3J0ICovCiB2b2lkIF9faW5pdCB0eHg5X3NwaV9pbml0KGludCBidXNpZCwgdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgaXJxKQogewpAQCAtMzcxLDMgKzYyMSwxNTMgQEAKIHVuc2lnbmVkIGxvbmcgKCpfX3N3aXp6bGVfYWRkcl9iKSh1bnNpZ25lZCBsb25nIHBvcnQpID0gX19zd2l6emxlX2FkZHJfbm9uZTsKIEVYUE9SVF9TWU1CT0woX19zd2l6emxlX2FkZHJfYik7CiAjZW5kaWYKKwordm9pZCBfX2luaXQgdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoaW50IG5vLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSAqcGRhdGEpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzID0geworCQkuc3RhcnQgPSBhZGRyLAorCQkuZW5kID0gYWRkciArIHNpemUgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRzWzJdOworCXN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcGRhdGFfcGFydDsKKworCS8qIElmIHRoaXMgYXJlYSBjb250YWluZWQgYm9vdCBhcmVhLCBtYWtlIHNlcGFyYXRlIHBhcnRpdGlvbiAqLworCWlmIChwZGF0YS0+bnJfcGFydHMgPT0gMCAmJiAhcGRhdGEtPnBhcnRzICYmCisJICAgIGFkZHIgPCAweDFmYzAwMDAwICYmIGFkZHIgKyBzaXplID4gMHgxZmMwMDAwMCAmJgorCSAgICAhcGFydHNbMF0ubmFtZSkgeworCQlwYXJ0c1swXS5uYW1lID0gImJvb3QiOworCQlwYXJ0c1swXS5vZmZzZXQgPSAweDFmYzAwMDAwIC0gYWRkcjsKKwkJcGFydHNbMF0uc2l6ZSA9IGFkZHIgKyBzaXplIC0gMHgxZmMwMDAwMDsKKwkJcGFydHNbMV0ubmFtZSA9ICJ1c2VyIjsKKwkJcGFydHNbMV0ub2Zmc2V0ID0gMDsKKwkJcGFydHNbMV0uc2l6ZSA9IDB4MWZjMDAwMDAgLSBhZGRyOworCQlwZGF0YV9wYXJ0ID0gKnBkYXRhOworCQlwZGF0YV9wYXJ0Lm5yX3BhcnRzID0gQVJSQVlfU0laRShwYXJ0cyk7CisJCXBkYXRhX3BhcnQucGFydHMgPSBwYXJ0czsKKwkJcGRhdGEgPSAmcGRhdGFfcGFydDsKKwl9CisjZW5kaWYKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJwaHlzbWFwLWZsYXNoIiwgbm8pOworCWlmICghcGRldiB8fAorCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKSB8fAorCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEsIHNpemVvZigqcGRhdGEpKSB8fAorCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpKQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19MRURTX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0xFRFNfR1BJT19NT0RVTEUpCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHR4eDlfaW9jbGVkX2xvY2spOworCisjZGVmaW5lIFRYWDlfSU9DTEVEX01BWExFRFMgOAorCitzdHJ1Y3QgdHh4OV9pb2NsZWRfZGF0YSB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXU4IGN1cl92YWw7CisJdm9pZCBfX2lvbWVtICptbWlvYWRkcjsKKwlzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBwZGF0YTsKKwlzdHJ1Y3QgZ3Bpb19sZWQgbGVkc1tUWFg5X0lPQ0xFRF9NQVhMRURTXTsKKwljaGFyIG5hbWVzW1RYWDlfSU9DTEVEX01BWExFRFNdWzMyXTsKK307CisKK3N0YXRpYyBpbnQgdHh4OV9pb2NsZWRfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHR4eDlfaW9jbGVkX2RhdGEgKmRhdGEgPQorCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHR4eDlfaW9jbGVkX2RhdGEsIGNoaXApOworCXJldHVybiBkYXRhLT5jdXJfdmFsICYgKDEgPDwgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgdHh4OV9pb2NsZWRfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgaW50IHZhbHVlKQoreworCXN0cnVjdCB0eHg5X2lvY2xlZF9kYXRhICpkYXRhID0KKwkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCB0eHg5X2lvY2xlZF9kYXRhLCBjaGlwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0eHg5X2lvY2xlZF9sb2NrLCBmbGFncyk7CisJaWYgKHZhbHVlKQorCQlkYXRhLT5jdXJfdmFsIHw9IDEgPDwgb2Zmc2V0OworCWVsc2UKKwkJZGF0YS0+Y3VyX3ZhbCAmPSB+KDEgPDwgb2Zmc2V0KTsKKwl3cml0ZWIoZGF0YS0+Y3VyX3ZhbCwgZGF0YS0+bW1pb2FkZHIpOworCW1taW93YigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4eDlfaW9jbGVkX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0eHg5X2lvY2xlZF9kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eHg5X2lvY2xlZF9kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgICAgaW50IHZhbHVlKQoreworCXR4eDlfaW9jbGVkX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgdHh4OV9pb2NsZWRfaW5pdCh1bnNpZ25lZCBsb25nIGJhc2VhZGRyLAorCQkJICAgICBpbnQgYmFzZW51bSwgdW5zaWduZWQgaW50IG51bSwgaW50IGxvd2FjdGl2ZSwKKwkJCSAgICAgY29uc3QgY2hhciAqY29sb3IsIGNoYXIgKipkZWZ0cmlnZ2VycykKK3sKKwlzdHJ1Y3QgdHh4OV9pb2NsZWRfZGF0YSAqaW9jbGVkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJaW50IGk7CisJc3RhdGljIGNoYXIgKmRlZmF1bHRfdHJpZ2dlcnNbXSBfX2luaXRkYXRhID0geworCQkiaGVhcnRiZWF0IiwKKwkJImlkZS1kaXNrIiwKKwkJIm5hbmQtZGlzayIsCisJCU5VTEwsCisJfTsKKworCWlmICghZGVmdHJpZ2dlcnMpCisJCWRlZnRyaWdnZXJzID0gZGVmYXVsdF90cmlnZ2VyczsKKwlpb2NsZWQgPSBremFsbG9jKHNpemVvZigqaW9jbGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb2NsZWQpCisJCXJldHVybjsKKwlpb2NsZWQtPm1taW9hZGRyID0gaW9yZW1hcChiYXNlYWRkciwgMSk7CisJaWYgKCFpb2NsZWQtPm1taW9hZGRyKQorCQlyZXR1cm47CisJaW9jbGVkLT5jaGlwLmdldCA9IHR4eDlfaW9jbGVkX2dldDsKKwlpb2NsZWQtPmNoaXAuc2V0ID0gdHh4OV9pb2NsZWRfc2V0OworCWlvY2xlZC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSB0eHg5X2lvY2xlZF9kaXJfaW47CisJaW9jbGVkLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSB0eHg5X2lvY2xlZF9kaXJfb3V0OworCWlvY2xlZC0+Y2hpcC5sYWJlbCA9ICJpb2NsZWQiOworCWlvY2xlZC0+Y2hpcC5iYXNlID0gYmFzZW51bTsKKwlpb2NsZWQtPmNoaXAubmdwaW8gPSBudW07CisJaWYgKGdwaW9jaGlwX2FkZCgmaW9jbGVkLT5jaGlwKSkKKwkJcmV0dXJuOworCWlmIChiYXNlbnVtIDwgMCkKKwkJYmFzZW51bSA9IGlvY2xlZC0+Y2hpcC5iYXNlOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygibGVkcy1ncGlvIiwgYmFzZW51bSk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm47CisJaW9jbGVkLT5wZGF0YS5udW1fbGVkcyA9IG51bTsKKwlpb2NsZWQtPnBkYXRhLmxlZHMgPSBpb2NsZWQtPmxlZHM7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXN0cnVjdCBncGlvX2xlZCAqbGVkID0gJmlvY2xlZC0+bGVkc1tpXTsKKwkJc25wcmludGYoaW9jbGVkLT5uYW1lc1tpXSwgc2l6ZW9mKGlvY2xlZC0+bmFtZXNbaV0pLAorCQkJICJpb2NsZWQ6JXM6JXUiLCBjb2xvciwgaSk7CisJCWxlZC0+bmFtZSA9IGlvY2xlZC0+bmFtZXNbaV07CisJCWxlZC0+Z3BpbyA9IGJhc2VudW0gKyBpOworCQlsZWQtPmFjdGl2ZV9sb3cgPSBsb3dhY3RpdmU7CisJCWlmIChkZWZ0cmlnZ2VycyAmJiAqZGVmdHJpZ2dlcnMpCisJCQlsZWQtPmRlZmF1bHRfdHJpZ2dlciA9ICpkZWZ0cmlnZ2VycysrOworCX0KKwlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZpb2NsZWQtPnBkYXRhOworCWlmIChwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpKQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworfQorI2Vsc2UgLyogQ09ORklHX0xFRFNfR1BJTyAqLwordm9pZCBfX2luaXQgdHh4OV9pb2NsZWRfaW5pdCh1bnNpZ25lZCBsb25nIGJhc2VhZGRyLAorCQkJICAgICBpbnQgYmFzZW51bSwgdW5zaWduZWQgaW50IG51bSwgaW50IGxvd2FjdGl2ZSwKKwkJCSAgICAgY29uc3QgY2hhciAqY29sb3IsIGNoYXIgKipkZWZ0cmlnZ2VycykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfTEVEU19HUElPICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwX3R4MzkyNy5jIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cF90eDM5MjcuYwppbmRleCA3YmQ5NjNkLi45NTA1ZDU4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwX3R4MzkyNy5jCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHgzOTI3LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS90eHg5aXJxLmg+CiAjaW5jbHVkZSA8YXNtL3R4eDl0bXIuaD4KQEAgLTMyLDExICszMyw2IEBACiAJaW50IGk7CiAJdW5zaWduZWQgaW50IGNvbmY7CiAKLQkvKiBkb24ndCBlbmFibGUgLSBzZWUgZXJyYXRhICovCi0JdHh4OV9jY2ZnX3RvZW9uID0gMDsKLQlpZiAoc3Ryc3RyKHByb21fZ2V0Y21kbGluZSgpLCAidG9lb24iKSAhPSBOVUxMKQotCQl0eHg5X2NjZmdfdG9lb24gPSAxOwotCiAJdHh4OV9yZWdfcmVzX2luaXQoVFgzOTI3X1JFVl9QQ09ERSgpLCBUWDM5MjdfUkVHX0JBU0UsCiAJCQkgIFRYMzkyN19SRUdfU0laRSk7CiAKQEAgLTk5LDE2ICs5NSwxNCBAQAogCXR4eDlfZ3Bpb19pbml0KFRYMzkyN19QSU9fUkVHLCAwLCAxNik7CiAKIAljb25mID0gcmVhZF9jMF9jb25mKCk7Ci0JaWYgKCEoY29uZiAmIFRYMzlfQ09ORl9JQ0UpKQotCQlwcmludGsoS0VSTl9JTkZPICJUWDM5MjcgSS1DYWNoZSBkaXNhYmxlZC5cbiIpOwotCWlmICghKGNvbmYgJiBUWDM5X0NPTkZfRENFKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVFgzOTI3IEQtQ2FjaGUgZGlzYWJsZWQuXG4iKTsKLQllbHNlIGlmICghKGNvbmYgJiBUWDM5X0NPTkZfV0JPTikpCi0JCXByaW50ayhLRVJOX0lORk8gIlRYMzkyNyBELUNhY2hlIFdyaXRlVGhyb3VnaC5cbiIpOwotCWVsc2UgaWYgKCEoY29uZiAmIFRYMzlfQ09ORl9DV0ZPTikpCi0JCXByaW50ayhLRVJOX0lORk8gIlRYMzkyNyBELUNhY2hlIFdyaXRlQmFjay5cbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVFgzOTI3IEQtQ2FjaGUgV3JpdGVCYWNrIChDV0YpIC5cbiIpOworCWlmIChjb25mICYgVFgzOV9DT05GX0RDRSkgeworCQlpZiAoIShjb25mICYgVFgzOV9DT05GX1dCT04pKQorCQkJcHJfaW5mbygiVFgzOTI3IEQtQ2FjaGUgV3JpdGVUaHJvdWdoLlxuIik7CisJCWVsc2UgaWYgKCEoY29uZiAmIFRYMzlfQ09ORl9DV0ZPTikpCisJCQlwcl9pbmZvKCJUWDM5MjcgRC1DYWNoZSBXcml0ZUJhY2suXG4iKTsKKwkJZWxzZQorCQkJcHJfaW5mbygiVFgzOTI3IEQtQ2FjaGUgV3JpdGVCYWNrIChDV0YpIC5cbiIpOworCX0KIH0KIAogdm9pZCBfX2luaXQgdHgzOTI3X3RpbWVfaW5pdCh1bnNpZ25lZCBpbnQgZXZ0X3Rtcm5yLCB1bnNpZ25lZCBpbnQgc3JjX3Rtcm5yKQpAQCAtMTI4LDMgKzEyMiwxNiBAQAogCQkJICAgICAgVFhYOV9JUlFfQkFTRSArIFRYMzkyN19JUl9TSU8oaSksCiAJCQkgICAgICBpLCBzY2xrLCAoMSA8PCBpKSAmIGN0c19tYXNrKTsKIH0KKwordm9pZCBfX2luaXQgdHgzOTI3X210ZF9pbml0KGludCBjaCkKK3sKKwlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBkYXRhID0geworCQkud2lkdGggPSBUWDM5MjdfUk9NQ19XSURUSChjaCkgLyA4LAorCX07CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHR4eDlfY2VfcmVzW2NoXS5zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSB0eHg5X2NlX3Jlc1tjaF0uZW5kIC0gc3RhcnQgKyAxOworCisJaWYgKCEodHgzOTI3X3JvbWNwdHItPmNyW2NoXSAmIDB4OCkpCisJCXJldHVybjsJLyogZGlzYWJsZWQgKi8KKwl0eHg5X3BoeXNtYXBfZmxhc2hfaW5pdChjaCwgc3RhcnQsIHNpemUsICZwZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwX3R4NDkyNy5jIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cF90eDQ5MjcuYwppbmRleCBmODBkNGI3Li45MTRlOTNjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwX3R4NDkyNy5jCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHg0OTI3LmMKQEAgLTE0LDYgKzE0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS90eHg5aXJxLmg+CiAjaW5jbHVkZSA8YXNtL3R4eDl0bXIuaD4KICNpbmNsdWRlIDxhc20vdHh4OXBpby5oPgpAQCAtMjIsNiArMjYsMTAgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHR4NDkyN193ZHJfaW5pdCh2b2lkKQogeworCS8qIHJlcG9ydCB3YXRjaGRvZyByZXNldCBzdGF0dXMgKi8KKwlpZiAoX19fX3Jhd19yZWFkcSgmdHg0OTI3X2NjZmdwdHItPmNjZmcpICYgVFg0OTI3X0NDRkdfV0RSU1QpCisJCXByX3dhcm5pbmcoIldhdGNoZG9nIHJlc2V0IGRldGVjdGVkIGF0IDB4JWx4XG4iLAorCQkJICAgcmVhZF9jMF9lcnJvcmVwYygpKTsKIAkvKiBjbGVhciBXYXRjaERvZ1Jlc2V0IChXMUMpICovCiAJdHg0OTI3X2NjZmdfc2V0KFRYNDkyN19DQ0ZHX1dEUlNUKTsKIAkvKiBkbyByZXNldCBvbiB3YXRjaGRvZyAqLwpAQCAtMzMsNiArNDEsNDcgQEAKIAl0eHg5X3dkdF9pbml0KFRYNDkyN19UTVJfUkVHKDIpICYgMHhmZmZmZmZmZmZVTEwpOwogfQogCitzdGF0aWMgdm9pZCB0eDQ5MjdfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlwcl9lbWVyZygiUmVib290aW5nICh3aXRoICVzIHdhdGNoZG9nIHJlc2V0KS4uLlxuIiwKKwkJIChfX19fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZykgJiBUWDQ5MjdfQ0NGR19XRFJFWEVOKSA/CisJCSAiZXh0ZXJuYWwiIDogImludGVybmFsIik7CisJLyogY2xlYXIgd2F0Y2hkb2cgc3RhdHVzICovCisJdHg0OTI3X2NjZmdfc2V0KFRYNDkyN19DQ0ZHX1dEUlNUKTsJLyogVzFDICovCisJdHh4OV93ZHRfbm93KFRYNDkyN19UTVJfUkVHKDIpICYgMHhmZmZmZmZmZmZVTEwpOworCXdoaWxlICghKF9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jY2ZnKSAmIFRYNDkyN19DQ0ZHX1dEUlNUKSkKKwkJOworCW1kZWxheSgxMCk7CisJaWYgKF9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jY2ZnKSAmIFRYNDkyN19DQ0ZHX1dEUkVYRU4pIHsKKwkJcHJfZW1lcmcoIlJlYm9vdGluZyAod2l0aCBpbnRlcm5hbCB3YXRjaGRvZyByZXNldCkuLi5cbiIpOworCQkvKiBFeHRlcm5hbCBXRFJTVCBmYWlsZWQuICBEbyBpbnRlcm5hbCB3YXRjaGRvZyByZXNldCAqLworCQl0eDQ5MjdfY2NmZ19jbGVhcihUWDQ5MjdfQ0NGR19XRFJFWEVOKTsKKwl9CisJLyogZmFsbGJhY2sgKi8KKwkoKl9tYWNoaW5lX2hhbHQpKCk7Cit9CisKK3ZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB0eDQ5MjdfYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlzX2ZpeHVwKQoreworCWludCBkYXRhID0gcmVncy0+Y3AwX2NhdXNlICYgNDsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlwcl9lcnIoIiVjQkUgZXhjZXB0aW9uIGF0ICUjbHhcbiIsIGRhdGEgPyAnRCcgOiAnSScsIHJlZ3MtPmNwMF9lcGMpOworCXByX2VycigiY2NmZzolbGx4LCB0b2VhOiVsbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpX19fX3Jhd19yZWFkcSgmdHg0OTI3X2NjZmdwdHItPmNjZmcpLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKV9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT50b2VhKSk7CisjaWZkZWYgQ09ORklHX1BDSQorCXR4NDkyN19yZXBvcnRfcGNpY19zdGF0dXMoKTsKKyNlbmRpZgorCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXBhbmljKCJCdXNFcnJvciEiKTsKK30KK3N0YXRpYyB2b2lkIF9faW5pdCB0eDQ5MjdfYmVfaW5pdCh2b2lkKQoreworCWJvYXJkX2JlX2hhbmRsZXIgPSB0eDQ5MjdfYmVfaGFuZGxlcjsKK30KKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0eDQ5Mjdfc2RyYW1fcmVzb3VyY2VbNF07CiAKIHZvaWQgX19pbml0IHR4NDkyN19zZXR1cCh2b2lkKQpAQCAtNDQsNiArOTMsNyBAQAogCiAJdHh4OV9yZWdfcmVzX2luaXQoVFg0OTI3X1JFVl9QQ09ERSgpLCBUWDQ5MjdfUkVHX0JBU0UsCiAJCQkgIFRYNDkyN19SRUdfU0laRSk7CisJc2V0X2MwX2NvbmZpZyhUWDQ5X0NPTkZfQ1dGT04pOwogCiAJLyogU0RSQU1DLEVCVVNDIGFyZSBjb25maWd1cmVkIGJ5IFBST00gKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CkBAIC0xNjcsNiArMjE3LDkgQEAKIAl0eHg5X2dwaW9faW5pdChUWDQ5MjdfUElPX1JFRyAmIDB4ZmZmZmZmZmZmVUxMLCAwLCBUWDQ5MjdfTlVNX1BJTyk7CiAJX19yYXdfd3JpdGVsKDAsICZ0eDQ5MjdfcGlvcHRyLT5tYXNrY3B1KTsKIAlfX3Jhd193cml0ZWwoMCwgJnR4NDkyN19waW9wdHItPm1hc2tleHQpOworCisJX21hY2hpbmVfcmVzdGFydCA9IHR4NDkyN19tYWNoaW5lX3Jlc3RhcnQ7CisJYm9hcmRfYmVfaW5pdCA9IHR4NDkyN19iZV9pbml0OwogfQogCiB2b2lkIF9faW5pdCB0eDQ5MjdfdGltZV9pbml0KHVuc2lnbmVkIGludCB0bXJucikKQEAgLTE4NiwzICsyMzksNDcgQEAKIAkJCSAgICAgIFRYWDlfSVJRX0JBU0UgKyBUWDQ5MjdfSVJfU0lPKGkpLAogCQkJICAgICAgaSwgc2NsaywgKDEgPDwgaSkgJiBjdHNfbWFzayk7CiB9CisKK3ZvaWQgX19pbml0IHR4NDkyN19tdGRfaW5pdChpbnQgY2gpCit7CisJc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwZGF0YSA9IHsKKwkJLndpZHRoID0gVFg0OTI3X0VCVVNDX1dJRFRIKGNoKSAvIDgsCisJfTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdHh4OV9jZV9yZXNbY2hdLnN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHR4eDlfY2VfcmVzW2NoXS5lbmQgLSBzdGFydCArIDE7CisKKwlpZiAoIShUWDQ5MjdfRUJVU0NfQ1IoY2gpICYgMHg4KSkKKwkJcmV0dXJuOwkvKiBkaXNhYmxlZCAqLworCXR4eDlfcGh5c21hcF9mbGFzaF9pbml0KGNoLCBzdGFydCwgc2l6ZSwgJnBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHR4NDkyN19zdG9wX3VudXNlZF9tb2R1bGVzKHZvaWQpCit7CisJX191NjQgcGNmZywgcnN0ID0gMCwgY2tkID0gMDsKKwljaGFyIGJ1ZlsxMjhdOworCisJYnVmWzBdID0gJ1wwJzsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXBjZmcgPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MjdfY2NmZ3B0ci0+cGNmZyk7CisJaWYgKCEocGNmZyAmIFRYNDkyN19QQ0ZHX1NFTDIpKSB7CisJCXJzdCB8PSBUWDQ5MjdfQ0xLQ1RSX0FDTFJTVDsKKwkJY2tkIHw9IFRYNDkyN19DTEtDVFJfQUNMQ0tEOworCQlzdHJjYXQoYnVmLCAiIEFDTEMiKTsKKwl9CisJaWYgKHJzdCB8IGNrZCkgeworCQl0eHg5X3NldDY0KCZ0eDQ5MjdfY2NmZ3B0ci0+Y2xrY3RyLCByc3QpOworCQl0eHg5X3NldDY0KCZ0eDQ5MjdfY2NmZ3B0ci0+Y2xrY3RyLCBja2QpOworCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKGJ1ZlswXSkKKwkJcHJfaW5mbygiJXM6IHN0b3Alc1xuIiwgdHh4OV9wY29kZV9zdHIsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkyN19sYXRlX2luaXQodm9pZCkKK3sKKwlpZiAodHh4OV9wY29kZSAhPSAweDQ5MjcpCisJCXJldHVybiAtRU5PREVWOworCXR4NDkyN19zdG9wX3VudXNlZF9tb2R1bGVzKCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHR4NDkyN19sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cF90eDQ5MzguYyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHg0OTM4LmMKaW5kZXggZjMwNDBiOS4uYWY3MjRlNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cF90eDQ5MzguYworKysgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NldHVwX3R4NDkzOC5jCkBAIC0xNCw2ICsxNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vdHh4OWlycS5oPgogI2luY2x1ZGUgPGFzbS90eHg5dG1yLmg+CiAjaW5jbHVkZSA8YXNtL3R4eDlwaW8uaD4KQEAgLTIyLDYgKzI2LDEwIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0eDQ5Mzhfd2RyX2luaXQodm9pZCkKIHsKKwkvKiByZXBvcnQgd2F0Y2hkb2cgcmVzZXQgc3RhdHVzICovCisJaWYgKF9fX19yYXdfcmVhZHEoJnR4NDkzOF9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOF9DQ0ZHX1dEUlNUKQorCQlwcl93YXJuaW5nKCJXYXRjaGRvZyByZXNldCBkZXRlY3RlZCBhdCAweCVseFxuIiwKKwkJCSAgIHJlYWRfYzBfZXJyb3JlcGMoKSk7CiAJLyogY2xlYXIgV2F0Y2hEb2dSZXNldCAoVzFDKSAqLwogCXR4NDkzOF9jY2ZnX3NldChUWDQ5MzhfQ0NGR19XRFJTVCk7CiAJLyogZG8gcmVzZXQgb24gd2F0Y2hkb2cgKi8KQEAgLTMzLDYgKzQxLDQ3IEBACiAJdHh4OV93ZHRfaW5pdChUWDQ5MzhfVE1SX1JFRygyKSAmIDB4ZmZmZmZmZmZmVUxMKTsKIH0KIAorc3RhdGljIHZvaWQgdHg0OTM4X21hY2hpbmVfcmVzdGFydChjaGFyICpjb21tYW5kKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcHJfZW1lcmcoIlJlYm9vdGluZyAod2l0aCAlcyB3YXRjaGRvZyByZXNldCkuLi5cbiIsCisJCSAoX19fX3Jhd19yZWFkcSgmdHg0OTM4X2NjZmdwdHItPmNjZmcpICYgVFg0OTM4X0NDRkdfV0RSRVhFTikgPworCQkgImV4dGVybmFsIiA6ICJpbnRlcm5hbCIpOworCS8qIGNsZWFyIHdhdGNoZG9nIHN0YXR1cyAqLworCXR4NDkzOF9jY2ZnX3NldChUWDQ5MzhfQ0NGR19XRFJTVCk7CS8qIFcxQyAqLworCXR4eDlfd2R0X25vdyhUWDQ5MzhfVE1SX1JFRygyKSAmIDB4ZmZmZmZmZmZmVUxMKTsKKwl3aGlsZSAoIShfX19fcmF3X3JlYWRxKCZ0eDQ5MzhfY2NmZ3B0ci0+Y2NmZykgJiBUWDQ5MzhfQ0NGR19XRFJTVCkpCisJCTsKKwltZGVsYXkoMTApOworCWlmIChfX19fcmF3X3JlYWRxKCZ0eDQ5MzhfY2NmZ3B0ci0+Y2NmZykgJiBUWDQ5MzhfQ0NGR19XRFJFWEVOKSB7CisJCXByX2VtZXJnKCJSZWJvb3RpbmcgKHdpdGggaW50ZXJuYWwgd2F0Y2hkb2cgcmVzZXQpLi4uXG4iKTsKKwkJLyogRXh0ZXJuYWwgV0RSU1QgZmFpbGVkLiAgRG8gaW50ZXJuYWwgd2F0Y2hkb2cgcmVzZXQgKi8KKwkJdHg0OTM4X2NjZmdfY2xlYXIoVFg0OTM4X0NDRkdfV0RSRVhFTik7CisJfQorCS8qIGZhbGxiYWNrICovCisJKCpfbWFjaGluZV9oYWx0KSgpOworfQorCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgdHg0OTM4X2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBpc19maXh1cCkKK3sKKwlpbnQgZGF0YSA9IHJlZ3MtPmNwMF9jYXVzZSAmIDQ7CisJY29uc29sZV92ZXJib3NlKCk7CisJcHJfZXJyKCIlY0JFIGV4Y2VwdGlvbiBhdCAlI2x4XG4iLCBkYXRhID8gJ0QnIDogJ0knLCByZWdzLT5jcDBfZXBjKTsKKwlwcl9lcnIoImNjZmc6JWxseCwgdG9lYTolbGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKV9fX19yYXdfcmVhZHEoJnR4NDkzOF9jY2ZncHRyLT5jY2ZnKSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX19fcmF3X3JlYWRxKCZ0eDQ5MzhfY2NmZ3B0ci0+dG9lYSkpOworI2lmZGVmIENPTkZJR19QQ0kKKwl0eDQ5MjdfcmVwb3J0X3BjaWNfc3RhdHVzKCk7CisjZW5kaWYKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlwYW5pYygiQnVzRXJyb3IhIik7Cit9CitzdGF0aWMgdm9pZCBfX2luaXQgdHg0OTM4X2JlX2luaXQodm9pZCkKK3sKKwlib2FyZF9iZV9oYW5kbGVyID0gdHg0OTM4X2JlX2hhbmRsZXI7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHg0OTM4X3NkcmFtX3Jlc291cmNlWzRdOwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0eDQ5Mzhfc3JhbV9yZXNvdXJjZTsKIApAQCAtNDcsNiArOTYsNyBAQAogCiAJdHh4OV9yZWdfcmVzX2luaXQoVFg0OTM4X1JFVl9QQ09ERSgpLCBUWDQ5MzhfUkVHX0JBU0UsCiAJCQkgIFRYNDkzOF9SRUdfU0laRSk7CisJc2V0X2MwX2NvbmZpZyhUWDQ5X0NPTkZfQ1dGT04pOwogCiAJLyogU0RSQU1DLEVCVVNDIGFyZSBjb25maWd1cmVkIGJ5IFBST00gKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CkBAIC0yMjcsNiArMjc3LDkgQEAKIAkJCQkgICBUWDQ5MzhfQ0xLQ1RSX0VUSDFDS0QpOwogCQl9CiAJfQorCisJX21hY2hpbmVfcmVzdGFydCA9IHR4NDkzOF9tYWNoaW5lX3Jlc3RhcnQ7CisJYm9hcmRfYmVfaW5pdCA9IHR4NDkzOF9iZV9pbml0OwogfQogCiB2b2lkIF9faW5pdCB0eDQ5MzhfdGltZV9pbml0KHVuc2lnbmVkIGludCB0bXJucikKQEAgLTI2OCwzICszMjEsNzIgQEAKIAlpZiAoYWRkcjEgJiYgKHBjZmcgJiBUWDQ5MzhfUENGR19FVEgxX1NFTCkpCiAJCXR4eDlfZXRoYWRkcl9pbml0KFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzhfSVJfRVRIMSwgYWRkcjEpOwogfQorCit2b2lkIF9faW5pdCB0eDQ5MzhfbXRkX2luaXQoaW50IGNoKQoreworCXN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcGRhdGEgPSB7CisJCS53aWR0aCA9IFRYNDkzOF9FQlVTQ19XSURUSChjaCkgLyA4LAorCX07CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHR4eDlfY2VfcmVzW2NoXS5zdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSB0eHg5X2NlX3Jlc1tjaF0uZW5kIC0gc3RhcnQgKyAxOworCisJaWYgKCEoVFg0OTM4X0VCVVNDX0NSKGNoKSAmIDB4OCkpCisJCXJldHVybjsJLyogZGlzYWJsZWQgKi8KKwl0eHg5X3BoeXNtYXBfZmxhc2hfaW5pdChjaCwgc3RhcnQsIHNpemUsICZwZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0eDQ5Mzhfc3RvcF91bnVzZWRfbW9kdWxlcyh2b2lkKQoreworCV9fdTY0IHBjZmcsIHJzdCA9IDAsIGNrZCA9IDA7CisJY2hhciBidWZbMTI4XTsKKworCWJ1ZlswXSA9ICdcMCc7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlwY2ZnID0gX19fX3Jhd19yZWFkcSgmdHg0OTM4X2NjZmdwdHItPnBjZmcpOworCXN3aXRjaCAodHh4OV9wY29kZSkgeworCWNhc2UgMHg0OTM3OgorCQlpZiAoIShwY2ZnICYgVFg0OTM4X1BDRkdfU0VMMikpIHsKKwkJCXJzdCB8PSBUWDQ5MzhfQ0xLQ1RSX0FDTFJTVDsKKwkJCWNrZCB8PSBUWDQ5MzhfQ0xLQ1RSX0FDTENLRDsKKwkJCXN0cmNhdChidWYsICIgQUNMQyIpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg0OTM4OgorCQlpZiAoIShwY2ZnICYgVFg0OTM4X1BDRkdfU0VMMikgfHwKKwkJICAgIChwY2ZnICYgVFg0OTM4X1BDRkdfRVRIMF9TRUwpKSB7CisJCQlyc3QgfD0gVFg0OTM4X0NMS0NUUl9BQ0xSU1Q7CisJCQlja2QgfD0gVFg0OTM4X0NMS0NUUl9BQ0xDS0Q7CisJCQlzdHJjYXQoYnVmLCAiIEFDTEMiKTsKKwkJfQorCQlpZiAoKHBjZmcgJgorCQkgICAgIChUWDQ5MzhfUENGR19BVEFfU0VMIHwgVFg0OTM4X1BDRkdfSVNBX1NFTCB8CisJCSAgICAgIFRYNDkzOF9QQ0ZHX05ERl9TRUwpKQorCQkgICAgIT0gVFg0OTM4X1BDRkdfTkRGX1NFTCkgeworCQkJcnN0IHw9IFRYNDkzOF9DTEtDVFJfTkRGUlNUOworCQkJY2tkIHw9IFRYNDkzOF9DTEtDVFJfTkRGQ0tEOworCQkJc3RyY2F0KGJ1ZiwgIiBOREZNQyIpOworCQl9CisJCWlmICghKHBjZmcgJiBUWDQ5MzhfUENGR19TUElfU0VMKSkgeworCQkJcnN0IHw9IFRYNDkzOF9DTEtDVFJfU1BJUlNUOworCQkJY2tkIHw9IFRYNDkzOF9DTEtDVFJfU1BJQ0tEOworCQkJc3RyY2F0KGJ1ZiwgIiBTUEkiKTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKHJzdCB8IGNrZCkgeworCQl0eHg5X3NldDY0KCZ0eDQ5MzhfY2NmZ3B0ci0+Y2xrY3RyLCByc3QpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzhfY2NmZ3B0ci0+Y2xrY3RyLCBja2QpOworCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKGJ1ZlswXSkKKwkJcHJfaW5mbygiJXM6IHN0b3Alc1xuIiwgdHh4OV9wY29kZV9zdHIsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOF9sYXRlX2luaXQodm9pZCkKK3sKKwlpZiAodHh4OV9wY29kZSAhPSAweDQ5MzcgJiYgdHh4OV9wY29kZSAhPSAweDQ5MzgpCisJCXJldHVybiAtRU5PREVWOworCXR4NDkzOF9zdG9wX3VudXNlZF9tb2R1bGVzKCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHR4NDkzOF9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zZXR1cF90eDQ5MzkuYyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHg0OTM5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwMDQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHg0OTM5LmMKQEAgLTAsMCArMSw1MDYgQEAKKy8qCisgKiBUWDQ5Mzkgc2V0dXAgcm91dGluZXMKKyAqIEJhc2VkIG9uIGxpbnV4L2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvc2V0dXBfdHg0OTM4LmMsCisgKgkgICAgYW5kIFJCVFg0OXh4IHBhdGNoIGZyb20gQ0VMRiBwYXRjaCBhcmNoaXZlLgorICoKKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogKEMpIENvcHlyaWdodCBUT1NISUJBIENPUlBPUkFUSU9OIDIwMDAtMjAwMSwgMjAwNC0yMDA3CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS90eHg5aXJxLmg+CisjaW5jbHVkZSA8YXNtL3R4eDl0bXIuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9nZW5lcmljLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0eDQ5Mzlfd2RyX2luaXQodm9pZCkKK3sKKwkvKiByZXBvcnQgd2F0Y2hkb2cgcmVzZXQgc3RhdHVzICovCisJaWYgKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1dEUlNUKQorCQlwcl93YXJuaW5nKCJXYXRjaGRvZyByZXNldCBkZXRlY3RlZCBhdCAweCVseFxuIiwKKwkJCSAgIHJlYWRfYzBfZXJyb3JlcGMoKSk7CisJLyogY2xlYXIgV2F0Y2hEb2dSZXNldCAoVzFDKSAqLworCXR4NDkzOV9jY2ZnX3NldChUWDQ5MzlfQ0NGR19XRFJTVCk7CisJLyogZG8gcmVzZXQgb24gd2F0Y2hkb2cgKi8KKwl0eDQ5MzlfY2NmZ19zZXQoVFg0OTM5X0NDRkdfV1IpOworfQorCit2b2lkIF9faW5pdCB0eDQ5Mzlfd2R0X2luaXQodm9pZCkKK3sKKwl0eHg5X3dkdF9pbml0KFRYNDkzOV9UTVJfUkVHKDIpICYgMHhmZmZmZmZmZmZVTEwpOworfQorCitzdGF0aWMgdm9pZCB0eDQ5MzlfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlwcl9lbWVyZygiUmVib290aW5nICh3aXRoICVzIHdhdGNoZG9nIHJlc2V0KS4uLlxuIiwKKwkJIChfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+Y2NmZykgJiBUWDQ5MzlfQ0NGR19XRFJFWEVOKSA/CisJCSAiZXh0ZXJuYWwiIDogImludGVybmFsIik7CisJLyogY2xlYXIgd2F0Y2hkb2cgc3RhdHVzICovCisJdHg0OTM5X2NjZmdfc2V0KFRYNDkzOV9DQ0ZHX1dEUlNUKTsJLyogVzFDICovCisJdHh4OV93ZHRfbm93KFRYNDkzOV9UTVJfUkVHKDIpICYgMHhmZmZmZmZmZmZVTEwpOworCXdoaWxlICghKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1dEUlNUKSkKKwkJOworCW1kZWxheSgxMCk7CisJaWYgKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1dEUkVYRU4pIHsKKwkJcHJfZW1lcmcoIlJlYm9vdGluZyAod2l0aCBpbnRlcm5hbCB3YXRjaGRvZyByZXNldCkuLi5cbiIpOworCQkvKiBFeHRlcm5hbCBXRFJTVCBmYWlsZWQuICBEbyBpbnRlcm5hbCB3YXRjaGRvZyByZXNldCAqLworCQl0eDQ5MzlfY2NmZ19jbGVhcihUWDQ5MzlfQ0NGR19XRFJFWEVOKTsKKwl9CisJLyogZmFsbGJhY2sgKi8KKwkoKl9tYWNoaW5lX2hhbHQpKCk7Cit9CisKK3ZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCB0eDQ5MzlfYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlzX2ZpeHVwKQoreworCWludCBkYXRhID0gcmVncy0+Y3AwX2NhdXNlICYgNDsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlwcl9lcnIoIiVjQkUgZXhjZXB0aW9uIGF0ICUjbHhcbiIsCisJICAgICAgIGRhdGEgPyAnRCcgOiAnSScsIHJlZ3MtPmNwMF9lcGMpOworCXByX2VycigiY2NmZzolbGx4LCB0b2VhOiVsbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpX19fX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPmNjZmcpLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKV9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT50b2VhKSk7CisjaWZkZWYgQ09ORklHX1BDSQorCXR4NDkyN19yZXBvcnRfcGNpY19zdGF0dXMoKTsKKyNlbmRpZgorCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXBhbmljKCJCdXNFcnJvciEiKTsKK30KK3N0YXRpYyB2b2lkIF9faW5pdCB0eDQ5MzlfYmVfaW5pdCh2b2lkKQoreworCWJvYXJkX2JlX2hhbmRsZXIgPSB0eDQ5MzlfYmVfaGFuZGxlcjsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0eDQ5Mzlfc2RyYW1fcmVzb3VyY2VbNF07CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHR4NDkzOV9zcmFtX3Jlc291cmNlOworI2RlZmluZSBUWDQ5MzlfU1JBTV9TSVpFIDB4ODAwCisKK3ZvaWQgX19pbml0IHR4NDkzOV9hZGRfbWVtb3J5X3JlZ2lvbnModm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplOworCXU2NCB3aW47CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICghKChfX3UzMilfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfZGRyY3B0ci0+d2luZW4pICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCXdpbiA9IF9fX19yYXdfcmVhZHEoJnR4NDkzOV9kZHJjcHRyLT53aW5baV0pOworCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKSh3aW4gPj4gNDgpOworCQlzaXplID0gKCgodW5zaWduZWQgbG9uZykod2luID4+IDMyKSAmIDB4ZmZmZikgKyAxKSAtIHN0YXJ0OworCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydCA8PCAyMCwgc2l6ZSA8PCAyMCwgQk9PVF9NRU1fUkFNKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHR4NDkzOV9zZXR1cCh2b2lkKQoreworCWludCBpOworCV9fdTMyIGRpdm1vZGU7CisJX191NjQgcGNmZzsKKwlpbnQgY3B1Y2xrID0gMDsKKworCXR4eDlfcmVnX3Jlc19pbml0KFRYNDkzOV9SRVZfUENPREUoKSwgVFg0OTM5X1JFR19CQVNFLAorCQkJICBUWDQ5MzlfUkVHX1NJWkUpOworCXNldF9jMF9jb25maWcoVFg0OV9DT05GX0NXRk9OKTsKKworCS8qIFNEUkFNQyxFQlVTQyBhcmUgY29uZmlndXJlZCBieSBQUk9NICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoIShUWDQ5MzlfRUJVU0NfQ1IoaSkgJiAweDgpKQorCQkJY29udGludWU7CS8qIGRpc2FibGVkICovCisJCXR4eDlfY2VfcmVzW2ldLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpVFg0OTM5X0VCVVNDX0JBKGkpOworCQl0eHg5X2NlX3Jlc1tpXS5lbmQgPQorCQkJdHh4OV9jZV9yZXNbaV0uc3RhcnQgKyBUWDQ5MzlfRUJVU0NfU0laRShpKSAtIDE7CisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmdHh4OV9jZV9yZXNbaV0pOworCX0KKworCS8qIGNsb2NrcyAqLworCWlmICh0eHg5X21hc3Rlcl9jbG9jaykgeworCQkvKiBjYWxjdWxhdGUgY3B1X2Nsb2NrIGZyb20gbWFzdGVyX2Nsb2NrICovCisJCWRpdm1vZGUgPSAoX191MzIpX19fX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPmNjZmcpICYKKwkJCVRYNDkzOV9DQ0ZHX01VTENMS19NQVNLOworCQljcHVjbGsgPSB0eHg5X21hc3Rlcl9jbG9jayAqIDIwIC8gMjsKKwkJc3dpdGNoIChkaXZtb2RlKSB7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzg6CisJCQljcHVjbGsgPSBjcHVjbGsgLyAzICogNCAvKiAvIDYgKiAgOCAqLzsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzk6CisJCQljcHVjbGsgPSBjcHVjbGsgLyAyICogMyAvKiAvIDYgKiAgOSAqLzsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzEwOgorCQkJY3B1Y2xrID0gY3B1Y2xrIC8gMyAqIDUgLyogLyA2ICogMTAgKi87IGJyZWFrOworCQljYXNlIFRYNDkzOV9DQ0ZHX01VTENMS18xMToKKwkJCWNwdWNsayA9IGNwdWNsayAvIDYgKiAxMTsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzEyOgorCQkJY3B1Y2xrID0gY3B1Y2xrICogMiAvKiAvIDYgKiAxMiAqLzsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzEzOgorCQkJY3B1Y2xrID0gY3B1Y2xrIC8gNiAqIDEzOyBicmVhazsKKwkJY2FzZSBUWDQ5MzlfQ0NGR19NVUxDTEtfMTQ6CisJCQljcHVjbGsgPSBjcHVjbGsgLyAzICogNyAvKiAvIDYgKiAxNCAqLzsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzE1OgorCQkJY3B1Y2xrID0gY3B1Y2xrIC8gMiAqIDUgLyogLyA2ICogMTUgKi87IGJyZWFrOworCQl9CisJCXR4eDlfY3B1X2Nsb2NrID0gY3B1Y2xrOworCX0gZWxzZSB7CisJCWlmICh0eHg5X2NwdV9jbG9jayA9PSAwKQorCQkJdHh4OV9jcHVfY2xvY2sgPSA0MDAwMDAwMDA7CS8qIDQwME1IeiAqLworCQkvKiBjYWxjdWxhdGUgbWFzdGVyX2Nsb2NrIGZyb20gY3B1X2Nsb2NrICovCisJCWNwdWNsayA9IHR4eDlfY3B1X2Nsb2NrOworCQlkaXZtb2RlID0gKF9fdTMyKV9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmCisJCQlUWDQ5MzlfQ0NGR19NVUxDTEtfTUFTSzsKKwkJc3dpdGNoIChkaXZtb2RlKSB7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzg6CisJCQl0eHg5X21hc3Rlcl9jbG9jayA9IGNwdWNsayAqIDYgLyA4OyBicmVhazsKKwkJY2FzZSBUWDQ5MzlfQ0NGR19NVUxDTEtfOToKKwkJCXR4eDlfbWFzdGVyX2Nsb2NrID0gY3B1Y2xrICogNiAvIDk7IGJyZWFrOworCQljYXNlIFRYNDkzOV9DQ0ZHX01VTENMS18xMDoKKwkJCXR4eDlfbWFzdGVyX2Nsb2NrID0gY3B1Y2xrICogNiAvIDEwOyBicmVhazsKKwkJY2FzZSBUWDQ5MzlfQ0NGR19NVUxDTEtfMTE6CisJCQl0eHg5X21hc3Rlcl9jbG9jayA9IGNwdWNsayAqIDYgLyAxMTsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzEyOgorCQkJdHh4OV9tYXN0ZXJfY2xvY2sgPSBjcHVjbGsgKiA2IC8gMTI7IGJyZWFrOworCQljYXNlIFRYNDkzOV9DQ0ZHX01VTENMS18xMzoKKwkJCXR4eDlfbWFzdGVyX2Nsb2NrID0gY3B1Y2xrICogNiAvIDEzOyBicmVhazsKKwkJY2FzZSBUWDQ5MzlfQ0NGR19NVUxDTEtfMTQ6CisJCQl0eHg5X21hc3Rlcl9jbG9jayA9IGNwdWNsayAqIDYgLyAxNDsgYnJlYWs7CisJCWNhc2UgVFg0OTM5X0NDRkdfTVVMQ0xLXzE1OgorCQkJdHh4OV9tYXN0ZXJfY2xvY2sgPSBjcHVjbGsgKiA2IC8gMTU7IGJyZWFrOworCQl9CisJCXR4eDlfbWFzdGVyX2Nsb2NrIC89IDEwOyAvKiAqIDIgLyAyMCAqLworCX0KKwkvKiBjYWxjdWxhdGUgZ2J1c19jbG9jayBmcm9tIGNwdV9jbG9jayAqLworCWRpdm1vZGUgPSAoX191MzIpX19fX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPmNjZmcpICYKKwkJVFg0OTM5X0NDRkdfWURJVk1PREVfTUFTSzsKKwl0eHg5X2didXNfY2xvY2sgPSB0eHg5X2NwdV9jbG9jazsKKwlzd2l0Y2ggKGRpdm1vZGUpIHsKKwljYXNlIFRYNDkzOV9DQ0ZHX1lESVZNT0RFXzI6CisJCXR4eDlfZ2J1c19jbG9jayAvPSAyOyBicmVhazsKKwljYXNlIFRYNDkzOV9DQ0ZHX1lESVZNT0RFXzM6CisJCXR4eDlfZ2J1c19jbG9jayAvPSAzOyBicmVhazsKKwljYXNlIFRYNDkzOV9DQ0ZHX1lESVZNT0RFXzU6CisJCXR4eDlfZ2J1c19jbG9jayAvPSA1OyBicmVhazsKKwljYXNlIFRYNDkzOV9DQ0ZHX1lESVZNT0RFXzY6CisJCXR4eDlfZ2J1c19jbG9jayAvPSA2OyBicmVhazsKKwl9CisJLyogY2hhbmdlIGRlZmF1bHQgdmFsdWUgdG8gdWRlbGF5L21kZWxheSB0YWtlIHJlYXNvbmFibGUgdGltZSAqLworCWxvb3BzX3Blcl9qaWZmeSA9IHR4eDlfY3B1X2Nsb2NrIC8gSFogLyAyOworCisJLyogQ0NGRyAqLworCXR4NDkzOV93ZHJfaW5pdCgpOworCS8qIGNsZWFyIEJ1c0Vycm9yT25Xcml0ZSBmbGFnIChXMUMpICovCisJdHg0OTM5X2NjZmdfc2V0KFRYNDkzOV9DQ0ZHX1dEUlNUIHwgVFg0OTM5X0NDRkdfQkVPVyk7CisJLyogZW5hYmxlIFRpbWVvdXQgQnVzRXJyb3IgKi8KKwlpZiAodHh4OV9jY2ZnX3RvZW9uKQorCQl0eDQ5MzlfY2NmZ19zZXQoVFg0OTM5X0NDRkdfVE9FKTsKKworCS8qIERNQSBzZWxlY3Rpb24gKi8KKwl0eHg5X2NsZWFyNjQoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnLCBUWDQ5MzlfUENGR19ETUFTRUxfQUxMKTsKKworCS8qIFVzZSBleHRlcm5hbCBjbG9jayBmb3IgZXh0ZXJuYWwgYXJiaXRlciAqLworCWlmICghKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1BDSUFSQikpCisJCXR4eDlfY2xlYXI2NCgmdHg0OTM5X2NjZmdwdHItPnBjZmcsIFRYNDkzOV9QQ0ZHX1BDSUNMS0VOX0FMTCk7CisKKwlwcl9pbmZvKCIlcyAtLSAlZE1IeihNJWRNSHosRyVkTUh6KSBDUklSOiUwOHggQ0NGRzolbGx4IFBDRkc6JWxseFxuIiwKKwkJdHh4OV9wY29kZV9zdHIsCisJCShjcHVjbGsgKyA1MDAwMDApIC8gMTAwMDAwMCwKKwkJKHR4eDlfbWFzdGVyX2Nsb2NrICsgNTAwMDAwKSAvIDEwMDAwMDAsCisJCSh0eHg5X2didXNfY2xvY2sgKyA1MDAwMDApIC8gMTAwMDAwMCwKKwkJKF9fdTMyKV9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jcmlyKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+Y2NmZyksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpX19fX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPnBjZmcpKTsKKworCXByX2luZm8oIiVzIEREUkMgLS0gRU46JTA4eCIsIHR4eDlfcGNvZGVfc3RyLAorCQkoX191MzIpX19fX3Jhd19yZWFkcSgmdHg0OTM5X2RkcmNwdHItPndpbmVuKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlfX3U2NCB3aW4gPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfZGRyY3B0ci0+d2luW2ldKTsKKwkJaWYgKCEoKF9fdTMyKV9fX19yYXdfcmVhZHEoJnR4NDkzOV9kZHJjcHRyLT53aW5lbikgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsJLyogZGlzYWJsZWQgKi8KKwkJcHJpbnRrKEtFUk5fQ09OVCAiICMlZDolMDE2bGx4IiwgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZyl3aW4pOworCQl0eDQ5Mzlfc2RyYW1fcmVzb3VyY2VbaV0ubmFtZSA9ICJERFIgU0RSQU0iOworCQl0eDQ5Mzlfc2RyYW1fcmVzb3VyY2VbaV0uc3RhcnQgPQorCQkJKHVuc2lnbmVkIGxvbmcpKHdpbiA+PiA0OCkgPDwgMjA7CisJCXR4NDkzOV9zZHJhbV9yZXNvdXJjZVtpXS5lbmQgPQorCQkJKCgoKHVuc2lnbmVkIGxvbmcpKHdpbiA+PiAzMikgJiAweGZmZmYpICsgMSkgPDwKKwkJCSAyMCkgLSAxOworCQl0eDQ5Mzlfc2RyYW1fcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZ0eDQ5Mzlfc2RyYW1fcmVzb3VyY2VbaV0pOworCX0KKwlwcmludGsoS0VSTl9DT05UICJcbiIpOworCisJLyogU1JBTSAqLworCWlmIChfX19fcmF3X3JlYWRxKCZ0eDQ5Mzlfc3JhbWNwdHItPmNyKSAmIDEpIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBUWDQ5MzlfU1JBTV9TSVpFOworCQl0eDQ5Mzlfc3JhbV9yZXNvdXJjZS5uYW1lID0gIlNSQU0iOworCQl0eDQ5Mzlfc3JhbV9yZXNvdXJjZS5zdGFydCA9CisJCQkoX19fX3Jhd19yZWFkcSgmdHg0OTM5X3NyYW1jcHRyLT5jcikgPj4gKDM5LTExKSkKKwkJCSYgfihzaXplIC0gMSk7CisJCXR4NDkzOV9zcmFtX3Jlc291cmNlLmVuZCA9CisJCQl0eDQ5Mzlfc3JhbV9yZXNvdXJjZS5zdGFydCArIFRYNDkzOV9TUkFNX1NJWkUgLSAxOworCQl0eDQ5Mzlfc3JhbV9yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnR4NDkzOV9zcmFtX3Jlc291cmNlKTsKKwl9CisKKwkvKiBUTVIgKi8KKwkvKiBkaXNhYmxlIGFsbCB0aW1lcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFg0OTM5X05SX1RNUjsgaSsrKQorCQl0eHg5X3Rtcl9pbml0KFRYNDkzOV9UTVJfUkVHKGkpICYgMHhmZmZmZmZmZmZVTEwpOworCisJLyogRE1BICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJX19fX3Jhd193cml0ZXEoVFg0OTM4X0RNQV9NQ1JfTVNURU4sCisJCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShUWDQ5MzlfRE1BX1JFRyhpKSArIDB4NTApKTsKKworCS8qIHNldCBQQ0lDMSByZXNldCAocmVxdWlyZWQgdG8gcHJldmVudCBoYW5ndXAgb24gQklTVCkgKi8KKwl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX1BDSTFSU1QpOworCXBjZmcgPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZyk7CisJaWYgKHBjZmcgJiAoVFg0OTM5X1BDRkdfRVQwTU9ERSB8IFRYNDkzOV9QQ0ZHX0VUMU1PREUpKSB7CisJCW1kZWxheSgxKTsJLyogYXQgbGVhc3QgMTI4IGNwdSBjbG9jayAqLworCQkvKiBjbGVhciBQQ0lDMSByZXNldCAqLworCQl0eHg5X2NsZWFyNjQoJnR4NDkzOV9jY2ZncHRyLT5jbGtjdHIsIFRYNDkzOV9DTEtDVFJfUENJMVJTVCk7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiJXM6IHN0b3AgUENJQzFcbiIsIHR4eDlfcGNvZGVfc3RyKTsKKwkJLyogc3RvcCBQQ0lDMSAqLworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX1BDSTFDS0QpOworCX0KKwlpZiAoIShwY2ZnICYgVFg0OTM5X1BDRkdfRVQwTU9ERSkpIHsKKwkJcHJfaW5mbygiJXM6IHN0b3AgRVRIMFxuIiwgdHh4OV9wY29kZV9zdHIpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX0VUSDBSU1QpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX0VUSDBDS0QpOworCX0KKwlpZiAoIShwY2ZnICYgVFg0OTM5X1BDRkdfRVQxTU9ERSkpIHsKKwkJcHJfaW5mbygiJXM6IHN0b3AgRVRIMVxuIiwgdHh4OV9wY29kZV9zdHIpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX0VUSDFSU1QpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBUWDQ5MzlfQ0xLQ1RSX0VUSDFDS0QpOworCX0KKworCV9tYWNoaW5lX3Jlc3RhcnQgPSB0eDQ5MzlfbWFjaGluZV9yZXN0YXJ0OworCWJvYXJkX2JlX2luaXQgPSB0eDQ5MzlfYmVfaW5pdDsKK30KKwordm9pZCBfX2luaXQgdHg0OTM5X3RpbWVfaW5pdCh1bnNpZ25lZCBpbnQgdG1ybnIpCit7CisJaWYgKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKSAmIFRYNDkzOV9DQ0ZHX1RJTlRESVMpCisJCXR4eDlfY2xvY2tldmVudF9pbml0KFRYNDkzOV9UTVJfUkVHKHRtcm5yKSAmIDB4ZmZmZmZmZmZmVUxMLAorCQkJCSAgICAgVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9UTVIodG1ybnIpLAorCQkJCSAgICAgVFhYOV9JTUNMSyk7Cit9CisKK3ZvaWQgX19pbml0IHR4NDkzOV9zaW9faW5pdCh1bnNpZ25lZCBpbnQgc2NsaywgdW5zaWduZWQgaW50IGN0c19tYXNrKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjaF9tYXNrID0gMDsKKwlfX3U2NCBwY2ZnID0gX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnKTsKKworCWN0c19tYXNrIHw9IH4xOwkvKiBvbmx5IFNJTzAgaGF2ZSBSVFMvQ1RTICovCisJaWYgKChwY2ZnICYgVFg0OTM5X1BDRkdfU0lPMk1PREVfTUFTSykgIT0gVFg0OTM5X1BDRkdfU0lPMk1PREVfU0lPMCkKKwkJY3RzX21hc2sgfD0gMSA8PCAwOyAvKiBkaXNhYmxlIFNJTzAgUlRTL0NUUyBieSBQQ0ZHIHNldHRpbmcgKi8KKwlpZiAoKHBjZmcgJiBUWDQ5MzlfUENGR19TSU8yTU9ERV9NQVNLKSAhPSBUWDQ5MzlfUENGR19TSU8yTU9ERV9TSU8yKQorCQljaF9tYXNrIHw9IDEgPDwgMjsgLyogZGlzYWJsZSBTSU8yIGJ5IFBDRkcgc2V0dGluZyAqLworCWlmIChwY2ZnICYgVFg0OTM5X1BDRkdfU0lPM01PREUpCisJCWNoX21hc2sgfD0gMSA8PCAzOyAvKiBkaXNhYmxlIFNJTzMgYnkgUENGRyBzZXR0aW5nICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoKDEgPDwgaSkgJiBjaF9tYXNrKQorCQkJY29udGludWU7CisJCXR4eDlfc2lvX2luaXQoVFg0OTM5X1NJT19SRUcoaSkgJiAweGZmZmZmZmZmZlVMTCwKKwkJCSAgICAgIFRYWDlfSVJRX0JBU0UgKyBUWDQ5MzlfSVJfU0lPKGkpLAorCQkJICAgICAgaSwgc2NsaywgKDEgPDwgaSkgJiBjdHNfbWFzayk7CisJfQorfQorCisjaWYgZGVmaW5lZChDT05GSUdfVEMzNTgxNSkgfHwgZGVmaW5lZChDT05GSUdfVEMzNTgxNV9NT0RVTEUpCitzdGF0aWMgaW50IHR4NDkzOV9nZXRfZXRoX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aHRvb2xfY21kIGNtZCA9IHsgRVRIVE9PTF9HU0VUIH07CisJaW50IHNwZWVkID0gMTAwOwkvKiBkZWZhdWx0IDEwME1icHMgKi8KKwlpbnQgZXJyOworCWlmICghZGV2LT5ldGh0b29sX29wcyB8fCAhZGV2LT5ldGh0b29sX29wcy0+Z2V0X3NldHRpbmdzKQorCQlyZXR1cm4gc3BlZWQ7CisJZXJyID0gZGV2LT5ldGh0b29sX29wcy0+Z2V0X3NldHRpbmdzKGRldiwgJmNtZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBzcGVlZDsKKwlzcGVlZCA9IGNtZC5zcGVlZCA9PSBTUEVFRF8xMDAgPyAxMDAgOiAxMDsKKwlyZXR1cm4gc3BlZWQ7Cit9CitzdGF0aWMgaW50IHR4NDkzOV9uZXRkZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkgICAgICAgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisJaWYgKGV2ZW50ID09IE5FVERFVl9DSEFOR0UgJiYgbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCV9fdTY0IGJpdCA9IDA7CisJCWlmIChkZXYtPmlycSA9PSBUWFg5X0lSUV9CQVNFICsgVFg0OTM5X0lSX0VUSCgwKSkKKwkJCWJpdCA9IFRYNDkzOV9QQ0ZHX1NQRUVEMDsKKwkJZWxzZSBpZiAoZGV2LT5pcnEgPT0gVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9FVEgoMSkpCisJCQliaXQgPSBUWDQ5MzlfUENGR19TUEVFRDE7CisJCWlmIChiaXQpIHsKKwkJCWludCBzcGVlZCA9IHR4NDkzOV9nZXRfZXRoX3NwZWVkKGRldik7CisJCQlpZiAoc3BlZWQgPT0gMTAwKQorCQkJCXR4eDlfc2V0NjQoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnLCBiaXQpOworCQkJZWxzZQorCQkJCXR4eDlfY2xlYXI2NCgmdHg0OTM5X2NjZmdwdHItPnBjZmcsIGJpdCk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHR4NDkzOV9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB0eDQ5MzlfbmV0ZGV2X2V2ZW50LAorCS5wcmlvcml0eSA9IDEsCit9OworCit2b2lkIF9faW5pdCB0eDQ5MzlfZXRoYWRkcl9pbml0KHVuc2lnbmVkIGNoYXIgKmFkZHIwLCB1bnNpZ25lZCBjaGFyICphZGRyMSkKK3sKKwl1NjQgcGNmZyA9IF9fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZyk7CisKKwlpZiAoYWRkcjAgJiYgKHBjZmcgJiBUWDQ5MzlfUENGR19FVDBNT0RFKSkKKwkJdHh4OV9ldGhhZGRyX2luaXQoVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9FVEgoMCksIGFkZHIwKTsKKwlpZiAoYWRkcjEgJiYgKHBjZmcgJiBUWDQ5MzlfUENGR19FVDFNT0RFKSkKKwkJdHh4OV9ldGhhZGRyX2luaXQoVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9FVEgoMSksIGFkZHIxKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnR4NDkzOV9uZXRkZXZfbm90aWZpZXIpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IHR4NDkzOV9ldGhhZGRyX2luaXQodW5zaWduZWQgY2hhciAqYWRkcjAsIHVuc2lnbmVkIGNoYXIgKmFkZHIxKQoreworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHR4NDkzOV9tdGRfaW5pdChpbnQgY2gpCit7CisJc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwZGF0YSA9IHsKKwkJLndpZHRoID0gVFg0OTM5X0VCVVNDX1dJRFRIKGNoKSAvIDgsCisJfTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdHh4OV9jZV9yZXNbY2hdLnN0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHR4eDlfY2VfcmVzW2NoXS5lbmQgLSBzdGFydCArIDE7CisKKwlpZiAoIShUWDQ5MzlfRUJVU0NfQ1IoY2gpICYgMHg4KSkKKwkJcmV0dXJuOwkvKiBkaXNhYmxlZCAqLworCXR4eDlfcGh5c21hcF9mbGFzaF9pbml0KGNoLCBzdGFydCwgc2l6ZSwgJnBkYXRhKTsKK30KKworI2RlZmluZSBUWDQ5MzlfQVRBX1JFR19QSFlTKGNoKSAoVFg0OTM5X0FUQV9SRUcoY2gpICYgMHhmZmZmZmZmZmZVTEwpCit2b2lkIF9faW5pdCB0eDQ5MzlfYXRhX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHJlc291cmNlIGF0YTBfcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IFRYNDkzOV9BVEFfUkVHX1BIWVMoMCksCisJCQkuZW5kID0gVFg0OTM5X0FUQV9SRUdfUEhZUygwKSArIDB4MTAwMCAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gVFhYOV9JUlFfQkFTRSArIFRYNDkzOV9JUl9BVEEoMCksCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXRhMV9yZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gVFg0OTM5X0FUQV9SRUdfUEhZUygxKSwKKwkJCS5lbmQgPSBUWDQ5MzlfQVRBX1JFR19QSFlTKDEpICsgMHgxMDAwIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBUWFg5X0lSUV9CQVNFICsgVFg0OTM5X0lSX0FUQSgxKSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LAorCX07CisJc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXRhMF9kZXYgPSB7CisJCS5uYW1lID0gInR4NDkzOWlkZSIsCisJCS5pZCA9IDAsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhdGEwX3JlcyksCisJCS5yZXNvdXJjZSA9IGF0YTBfcmVzLAorCX07CisJc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXRhMV9kZXYgPSB7CisJCS5uYW1lID0gInR4NDkzOWlkZSIsCisJCS5pZCA9IDEsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhdGExX3JlcyksCisJCS5yZXNvdXJjZSA9IGF0YTFfcmVzLAorCX07CisJX191NjQgcGNmZyA9IF9fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZyk7CisKKwlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX0FUQTBNT0RFKQorCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0YTBfZGV2KTsKKwlpZiAoKHBjZmcgJiAoVFg0OTM5X1BDRkdfQVRBMU1PREUgfAorCQkgICAgIFRYNDkzOV9QQ0ZHX0VUMU1PREUgfAorCQkgICAgIFRYNDkzOV9QQ0ZHX0VUME1PREUpKSA9PSBUWDQ5MzlfUENGR19BVEExTU9ERSkKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdGExX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0eDQ5Mzlfc3RvcF91bnVzZWRfbW9kdWxlcyh2b2lkKQoreworCV9fdTY0IHBjZmcsIHJzdCA9IDAsIGNrZCA9IDA7CisJY2hhciBidWZbMTI4XTsKKworCWJ1ZlswXSA9ICdcMCc7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlwY2ZnID0gX19fX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPnBjZmcpOworCWlmICgocGNmZyAmIFRYNDkzOV9QQ0ZHX0kyU01PREVfTUFTSykgIT0KKwkgICAgVFg0OTM5X1BDRkdfSTJTTU9ERV9BQ0xDKSB7CisJCXJzdCB8PSBUWDQ5MzlfQ0xLQ1RSX0FDTFJTVDsKKwkJY2tkIHw9IFRYNDkzOV9DTEtDVFJfQUNMQ0tEOworCQlzdHJjYXQoYnVmLCAiIEFDTEMiKTsKKwl9CisJaWYgKChwY2ZnICYgVFg0OTM5X1BDRkdfSTJTTU9ERV9NQVNLKSAhPQorCSAgICBUWDQ5MzlfUENGR19JMlNNT0RFX0kyUyAmJgorCSAgICAocGNmZyAmIFRYNDkzOV9QQ0ZHX0kyU01PREVfTUFTSykgIT0KKwkgICAgVFg0OTM5X1BDRkdfSTJTTU9ERV9JMlNfQUxUKSB7CisJCXJzdCB8PSBUWDQ5MzlfQ0xLQ1RSX0kyU1JTVDsKKwkJY2tkIHw9IFRYNDkzOV9DTEtDVFJfSTJTQ0tEOworCQlzdHJjYXQoYnVmLCAiIEkyUyIpOworCX0KKwlpZiAoIShwY2ZnICYgVFg0OTM5X1BDRkdfQVRBME1PREUpKSB7CisJCXJzdCB8PSBUWDQ5MzlfQ0xLQ1RSX0FUQTBSU1Q7CisJCWNrZCB8PSBUWDQ5MzlfQ0xLQ1RSX0FUQTBDS0Q7CisJCXN0cmNhdChidWYsICIgQVRBMCIpOworCX0KKwlpZiAoIShwY2ZnICYgVFg0OTM5X1BDRkdfQVRBMU1PREUpKSB7CisJCXJzdCB8PSBUWDQ5MzlfQ0xLQ1RSX0FUQTFSU1Q7CisJCWNrZCB8PSBUWDQ5MzlfQ0xLQ1RSX0FUQTFDS0Q7CisJCXN0cmNhdChidWYsICIgQVRBMSIpOworCX0KKwlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX1NQSU1PREUpIHsKKwkJcnN0IHw9IFRYNDkzOV9DTEtDVFJfU1BJUlNUOworCQlja2QgfD0gVFg0OTM5X0NMS0NUUl9TUElDS0Q7CisJCXN0cmNhdChidWYsICIgU1BJIik7CisJfQorCWlmICghKHBjZmcgJiAoVFg0OTM5X1BDRkdfVlNTTU9ERSB8IFRYNDkzOV9QQ0ZHX1ZQU01PREUpKSkgeworCQlyc3QgfD0gVFg0OTM5X0NMS0NUUl9WUENSU1Q7CisJCWNrZCB8PSBUWDQ5MzlfQ0xLQ1RSX1ZQQ0NLRDsKKwkJc3RyY2F0KGJ1ZiwgIiBWUEMiKTsKKwl9CisJaWYgKChwY2ZnICYgVFg0OTM5X1BDRkdfU0lPMk1PREVfTUFTSykgIT0gVFg0OTM5X1BDRkdfU0lPMk1PREVfU0lPMikgeworCQlyc3QgfD0gVFg0OTM5X0NMS0NUUl9TSU8yUlNUOworCQlja2QgfD0gVFg0OTM5X0NMS0NUUl9TSU8yQ0tEOworCQlzdHJjYXQoYnVmLCAiIFNJTzIiKTsKKwl9CisJaWYgKHBjZmcgJiBUWDQ5MzlfUENGR19TSU8zTU9ERSkgeworCQlyc3QgfD0gVFg0OTM5X0NMS0NUUl9TSU8zUlNUOworCQlja2QgfD0gVFg0OTM5X0NMS0NUUl9TSU8zQ0tEOworCQlzdHJjYXQoYnVmLCAiIFNJTzMiKTsKKwl9CisJaWYgKHJzdCB8IGNrZCkgeworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCByc3QpOworCQl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+Y2xrY3RyLCBja2QpOworCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKGJ1ZlswXSkKKwkJcHJfaW5mbygiJXM6IHN0b3Alc1xuIiwgdHh4OV9wY29kZV9zdHIsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR4NDkzOV9sYXRlX2luaXQodm9pZCkKK3sKKwlpZiAodHh4OV9wY29kZSAhPSAweDQ5MzkpCisJCXJldHVybiAtRU5PREVWOworCXR4NDkzOV9zdG9wX3VudXNlZF9tb2R1bGVzKCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHR4NDkzOV9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zcGlfZWVwcm9tLmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NwaV9lZXByb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWMzNDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zcGlfZWVwcm9tLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBzcGlfZWVwcm9tLmMKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqCisgKiAyMDAzLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCisgKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICogU3VwcG9ydCBmb3IgVFg0OTM4IGluIDIuNiAtIE1hbmlzaCBMYWNod2FuaSAobWxhY2h3YW5pQG12aXN0YS5jb20pCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9lZXByb20uaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9zcGkuaD4KKworI2RlZmluZSBBVDI1MFgwX1BBR0VfU0laRQk4CisKKy8qIHJlZ2lzdGVyIGJvYXJkIGluZm9ybWF0aW9uIGZvciBhdDI1IGRyaXZlciAqLworaW50IF9faW5pdCBzcGlfZWVwcm9tX3JlZ2lzdGVyKGludCBidXNpZCwgaW50IGNoaXBpZCwgaW50IHNpemUpCit7CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvIGluZm8gPSB7CisJCS5tb2RhbGlhcyA9ICJhdDI1IiwKKwkJLm1heF9zcGVlZF9oeiA9IDE1MDAwMDAsCS8qIDEuNU1icHMgKi8KKwkJLmJ1c19udW0gPSBidXNpZCwKKwkJLmNoaXBfc2VsZWN0ID0gY2hpcGlkLAorCQkvKiBNb2RlIDA6IEhpZ2gtQWN0aXZlLCBTYW1wbGUtVGhlbi1TaGlmdCAqLworCX07CisJc3RydWN0IHNwaV9lZXByb20gKmVlcHJvbTsKKwllZXByb20gPSBremFsbG9jKHNpemVvZigqZWVwcm9tKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZXByb20pCisJCXJldHVybiAtRU5PTUVNOworCXN0cmNweShlZXByb20tPm5hbWUsICJhdDI1MHgwIik7CisJZWVwcm9tLT5ieXRlX2xlbiA9IHNpemU7CisJZWVwcm9tLT5wYWdlX3NpemUgPSBBVDI1MFgwX1BBR0VfU0laRTsKKwllZXByb20tPmZsYWdzID0gRUVfQUREUjE7CisJaW5mby5wbGF0Zm9ybV9kYXRhID0gZWVwcm9tOworCXJldHVybiBzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbygmaW5mbywgMSk7Cit9CisKKy8qIHNpbXBsZSB0ZW1wb3Jhcnkgc3BpIGRyaXZlciB0byBwcm92aWRlIGVhcmx5IGFjY2VzcyB0byBzZWVwcm9tLiAqLworCitzdGF0aWMgc3RydWN0IHJlYWRfcGFyYW0geworCWludCBidXNpZDsKKwlpbnQgY2hpcGlkOworCWludCBhZGRyZXNzOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgbGVuOworfSAqcmVhZF9wYXJhbTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfc2VlcHJvbV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCBzdGF0ID0gMDsKKwl1OCBjbWRbMl07CisJaW50IGxlbiA9IHJlYWRfcGFyYW0tPmxlbjsKKwljaGFyICpidWYgPSByZWFkX3BhcmFtLT5idWY7CisJaW50IGFkZHJlc3MgPSByZWFkX3BhcmFtLT5hZGRyZXNzOworCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAic3BpY2xrICV1IEtIei5cbiIsCisJCSAoc3BpLT5tYXhfc3BlZWRfaHogKyA1MDApIC8gMTAwMCk7CisJaWYgKHJlYWRfcGFyYW0tPmJ1c2lkICE9IHNwaS0+bWFzdGVyLT5idXNfbnVtIHx8CisJICAgIHJlYWRfcGFyYW0tPmNoaXBpZCAhPSBzcGktPmNoaXBfc2VsZWN0KQorCQlyZXR1cm4gLUVOT0RFVjsKKwl3aGlsZSAobGVuID4gMCkgeworCQkvKiBzcGlfd3JpdGVfdGhlbl9yZWFkIGNhbiBvbmx5IHdvcmsgd2l0aCBzbWFsbCBjaHVuayAqLworCQlpbnQgYyA9IGxlbiA8IEFUMjUwWDBfUEFHRV9TSVpFID8gbGVuIDogQVQyNTBYMF9QQUdFX1NJWkU7CisJCWNtZFswXSA9IDB4MDM7CS8qIEFUMjVfUkVBRCAqLworCQljbWRbMV0gPSBhZGRyZXNzOworCQlzdGF0ID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGNtZCwgc2l6ZW9mKGNtZCksIGJ1ZiwgYyk7CisJCWJ1ZiArPSBjOworCQlsZW4gLT0gYzsKKwkJYWRkcmVzcyArPSBjOworCX0KKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGVhcmx5X3NlZXByb21fZHJpdmVyIF9faW5pdGRhdGEgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYXQyNSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gZWFybHlfc2VlcHJvbV9wcm9iZSwKK307CisKK2ludCBfX2luaXQgc3BpX2VlcHJvbV9yZWFkKGludCBidXNpZCwgaW50IGNoaXBpZCwgaW50IGFkZHJlc3MsCisJCQkgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVhZF9wYXJhbSBwYXJhbSA9IHsKKwkJLmJ1c2lkID0gYnVzaWQsCisJCS5jaGlwaWQgPSBjaGlwaWQsCisJCS5hZGRyZXNzID0gYWRkcmVzcywKKwkJLmJ1ZiA9IGJ1ZiwKKwkJLmxlbiA9IGxlbgorCX07CisKKwlyZWFkX3BhcmFtID0gJnBhcmFtOworCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmVhcmx5X3NlZXByb21fZHJpdmVyKTsKKwlpZiAoIXJldCkKKwkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZlYXJseV9zZWVwcm9tX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L2ptcjM5MjcvcHJvbS5jIGIvYXJjaC9taXBzL3R4eDkvam1yMzkyNy9wcm9tLmMKaW5kZXggNzBjNGM4ZS4uYzg5OWMwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvam1yMzkyNy9wcm9tLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvam1yMzkyNy9wcm9tLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIAlpZiAoKHR4MzkyN19jY2ZncHRyLT5jY2ZnICYgVFgzOTI3X0NDRkdfVExCT0ZGKSA9PSAwKQogCQlwcmludGsoS0VSTl9FUlIgIlRYMzkyNyBUTEIgb2ZmXG4iKTsKIAotCXByb21faW5pdF9jbWRsaW5lKCk7CiAJYWRkX21lbW9yeV9yZWdpb24oMCwgSk1SMzkyN19TRFJBTV9TSVpFLCBCT09UX01FTV9SQU0pOwogCXR4eDlfc2lvX3B1dGNoYXJfaW5pdChUWDM5MjdfU0lPX1JFRygxKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9qbXIzOTI3L3NldHVwLmMgYi9hcmNoL21pcHMvdHh4OS9qbXIzOTI3L3NldHVwLmMKaW5kZXggODdkYjQxYi4uMjVlNTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvam1yMzkyNy9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eHg5L2ptcjM5Mjcvc2V0dXAuYwpAQCAtNjIsNyArNjIsNiBAQAogfQogCiAjZGVmaW5lIERPX1dSSVRFX1RIUk9VR0gKLSNkZWZpbmUgRE9fRU5BQkxFX0NBQ0hFCiAKIHN0YXRpYyB2b2lkIGptcjM5MjdfYm9hcmRfaW5pdCh2b2lkKTsKIApAQCAtNzcsMTEgKzc2LDYgQEAKIAkvKiBjYWNoZSBzZXR1cCAqLwogCXsKIAkJdW5zaWduZWQgaW50IGNvbmY7Ci0jaWZkZWYgRE9fRU5BQkxFX0NBQ0hFCi0JCWludCBtaXBzX2ljX2Rpc2FibGUgPSAwLCBtaXBzX2RjX2Rpc2FibGUgPSAwOwotI2Vsc2UKLQkJaW50IG1pcHNfaWNfZGlzYWJsZSA9IDEsIG1pcHNfZGNfZGlzYWJsZSA9IDE7Ci0jZW5kaWYKICNpZmRlZiBET19XUklURV9USFJPVUdICiAJCWludCBtaXBzX2NvbmZpZ19jd2ZvbiA9IDA7CiAJCWludCBtaXBzX2NvbmZpZ193Ym9uID0gMDsKQEAgLTkxLDEwICs4NSw3IEBACiAjZW5kaWYKIAogCQljb25mID0gcmVhZF9jMF9jb25mKCk7Ci0JCWNvbmYgJj0gfihUWDM5X0NPTkZfSUNFIHwgVFgzOV9DT05GX0RDRSB8Ci0JCQkgIFRYMzlfQ09ORl9XQk9OIHwgVFgzOV9DT05GX0NXRk9OKTsKLQkJY29uZiB8PSBtaXBzX2ljX2Rpc2FibGUgPyAwIDogVFgzOV9DT05GX0lDRTsKLQkJY29uZiB8PSBtaXBzX2RjX2Rpc2FibGUgPyAwIDogVFgzOV9DT05GX0RDRTsKKwkJY29uZiAmPSB+KFRYMzlfQ09ORl9XQk9OIHwgVFgzOV9DT05GX0NXRk9OKTsKIAkJY29uZiB8PSBtaXBzX2NvbmZpZ193Ym9uID8gVFgzOV9DT05GX1dCT04gOiAwOwogCQljb25mIHw9IG1pcHNfY29uZmlnX2N3Zm9uID8gVFgzOV9DT05GX0NXRk9OIDogMDsKIApAQCAtMTk5LDExICsxOTAsMjUgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJydGMtZHMxNzQyIiwgLTEsICZyZXMsIDEpOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19tdGRfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJdHgzOTI3X210ZF9pbml0KGkpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19kZXZpY2VfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgaW9jbGVkX2Jhc2UgPSBKTVIzOTI3X0lPQ19MRURfQUREUiAtIElPX0JBU0U7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJaW9jbGVkX2Jhc2UgfD0gMTsKKyNlbmRpZgogCV9fc3dpenpsZV9hZGRyX2IgPSBqbXIzOTI3X3N3aXp6bGVfYWRkcl9iOwogCWptcjM5MjdfcnRjX2luaXQoKTsKIAl0eDM5Mjdfd2R0X2luaXQoKTsKKwlqbXIzOTI3X210ZF9pbml0KCk7CisJdHh4OV9pb2NsZWRfaW5pdChpb2NsZWRfYmFzZSwgLTEsIDgsIDEsICJncmVlbiIsIE5VTEwpOwogfQogCiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgam1yMzkyN192ZWMgX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L2lycS5jIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvaXJxLmMKaW5kZXggMDBjZDUyMy4uOWMxNGViYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvaXJxLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvaXJxLmMKQEAgLTEzMywxNSArMTMzLDIwIEBACiAJdTggbGV2ZWwzOwogCiAJbGV2ZWwzID0gcmVhZGIocmJ0eDQ5MjdfaW1zdGF0X2FkZHIpICYgMHgxZjsKLQlpZiAobGV2ZWwzKQotCQlzd19pcnEgPSBSQlRYNDkyN19JUlFfSU9DICsgZmxzKGxldmVsMykgLSAxOwotCXJldHVybiBzd19pcnE7CisJaWYgKHVubGlrZWx5KCFsZXZlbDMpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIFJCVFg0OTI3X0lSUV9JT0MgKyBfX2ZsczgobGV2ZWwzKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKKwkvKiBtYXNrIGFsbCBJT0MgaW50ZXJydXB0cyAqLworCXdyaXRlYigwLCByYnR4NDkyN19pbWFza19hZGRyKTsKKwkvKiBjbGVhciBTb2Z0SW50IGludGVycnVwdHMgKi8KKwl3cml0ZWIoMCwgcmJ0eDQ5Mjdfc29mdGludF9hZGRyKTsKKwogCWZvciAoaSA9IFJCVFg0OTI3X0lSUV9JT0M7CiAJICAgICBpIDwgUkJUWDQ5MjdfSVJRX0lPQyArIFJCVFg0OTI3X05SX0lSUV9JT0M7IGkrKykKIAkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfdHlwZSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L3Byb20uYyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L3Byb20uYwppbmRleCAxZGMwYTViLi5jYzk3YzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkyNy9wcm9tLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MjcvcHJvbS5jCkBAIC0zNiw3ICszNiw2IEBACiAKIHZvaWQgX19pbml0IHJidHg0OTI3X3Byb21faW5pdCh2b2lkKQogewotCXByb21faW5pdF9jbWRsaW5lKCk7CiAJYWRkX21lbW9yeV9yZWdpb24oMCwgdHg0OTI3X2dldF9tZW1fc2l6ZSgpLCBCT09UX01FTV9SQU0pOwogCXR4eDlfc2lvX3B1dGNoYXJfaW5pdChUWDQ5MjdfU0lPX1JFRygwKSAmIDB4ZmZmZmZmZmZmVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L3NldHVwLmMgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkyNy9zZXR1cC5jCmluZGV4IDBkMzliYWYuLjRhNzQ0MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTI3L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mjcvc2V0dXAuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdHh4OS9nZW5lcmljLmg+CkBAIC0xODUsMTQgKzE4Niw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCByYnR4NDkyN19tZW1fc2V0dXAodm9pZCkKIHsKLQl1MzIgY3AwX2NvbmZpZzsKIAljaGFyICphcmdwdHI7CiAKLQkvKiBlbmFibGUgY2FjaGVzIC0tIEhDUDUgZG9lcyB0aGlzLCBwbW9uIGRvZXMgbm90ICovCi0JY3AwX2NvbmZpZyA9IHJlYWRfYzBfY29uZmlnKCk7Ci0JY3AwX2NvbmZpZyA9IGNwMF9jb25maWcgJiB+KFRYNDlfQ09ORl9JQyB8IFRYNDlfQ09ORl9EQyk7Ci0Jd3JpdGVfYzBfY29uZmlnKGNwMF9jb25maWcpOwotCiAJaWYgKFRYNDkyN19SRVZfUENPREUoKSA9PSAweDQ5MjcpIHsKIAkJcmJ0eDQ5MjdfY2xvY2tfaW5pdCgpOwogCQl0eDQ5Mjdfc2V0dXAoKTsKQEAgLTIxMiw2ICsyMDcsMTQgQEAKIAlzZXRfaW9fcG9ydF9iYXNlKEtTRUcxICsgUkJUWDQ5MjdfSVNBX0lPX09GRlNFVCk7CiAjZW5kaWYKIAorCS8qIFRYNDkyNy1TSU8gRFRSIG9uIChQSU9bMTVdKSAqLworCWdwaW9fcmVxdWVzdCgxNSwgInNpby1kdHIiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTUsIDEpOworCWdwaW9fcmVxdWVzdCgwLCAibGVkIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDAsIDEpOworCWdwaW9fcmVxdWVzdCgxLCAibGVkIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDEsIDEpOworCiAJdHg0OTI3X3Npb19pbml0KDAsIDApOwogI2lmZGVmIENPTkZJR19TRVJJQUxfVFhYOV9DT05TT0xFCiAJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CkBAIC0zMDQsMTEgKzMwNywyMSBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIm5lIiwgLTEsIHJlcywgQVJSQVlfU0laRShyZXMpKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTI3X210ZF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQl0eDQ5MjdfbXRkX2luaXQoaSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCByYnR4NDkyN19kZXZpY2VfaW5pdCh2b2lkKQogewogCXRvc2hpYmFfcmJ0eDQ5MjdfcnRjX2luaXQoKTsKIAlyYnR4NDkyN19uZV9pbml0KCk7CiAJdHg0OTI3X3dkdF9pbml0KCk7CisJcmJ0eDQ5MjdfbXRkX2luaXQoKTsKKwl0eHg5X2lvY2xlZF9pbml0KFJCVFg0OTI3X0xFRF9BRERSIC0gSU9fQkFTRSwgLTEsIDMsIDEsICJncmVlbiIsIE5VTEwpOwogfQogCiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgcmJ0eDQ5MjdfdmVjIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9NYWtlZmlsZSBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCmluZGV4IDlkY2M1MmEuLmYzZTFmNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAotb2JqLXkJKz0gcHJvbS5vIHNldHVwLm8gaXJxLm8gc3BpX2VlcHJvbS5vCitvYmoteQkrPSBwcm9tLm8gc2V0dXAubyBpcnEubwogCiBFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzgvaXJxLmMgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9pcnEuYwppbmRleCBjYTJmODMwLi43ZDIxYmVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9pcnEuYworKysgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9pcnEuYwpAQCAtODUsMTAgKzg1LDEwIEBACiAJdTggbGV2ZWwzOwogCiAJbGV2ZWwzID0gcmVhZGIocmJ0eDQ5MzhfaW1zdGF0X2FkZHIpOwotCWlmIChsZXZlbDMpCi0JCS8qIG11c3QgdXNlIGZscyBzbyBvbmJvYXJkIEFUQSBoYXMgcHJpb3JpdHkgKi8KLQkJc3dfaXJxID0gUkJUWDQ5MzhfSVJRX0lPQyArIGZscyhsZXZlbDMpIC0gMTsKLQlyZXR1cm4gc3dfaXJxOworCWlmICh1bmxpa2VseSghbGV2ZWwzKSkKKwkJcmV0dXJuIC0xOworCS8qIG11c3QgdXNlIGZscyBzbyBvbmJvYXJkIEFUQSBoYXMgcHJpb3JpdHkgKi8KKwlyZXR1cm4gUkJUWDQ5MzhfSVJRX0lPQyArIF9fZmxzOChsZXZlbDMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L3Byb20uYyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L3Byb20uYwppbmRleCBkNzMxMjNjLi5iY2I0NjkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9wcm9tLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzgvcHJvbS5jCkBAIC0xOCw5ICsxOCw2IEBACiAKIHZvaWQgX19pbml0IHJidHg0OTM4X3Byb21faW5pdCh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfVFg0OTM4X05BTkRfQk9PVAotCXByb21faW5pdF9jbWRsaW5lKCk7Ci0jZW5kaWYKIAlhZGRfbWVtb3J5X3JlZ2lvbigwLCB0eDQ5MzhfZ2V0X21lbV9zaXplKCksIEJPT1RfTUVNX1JBTSk7CiAJdHh4OV9zaW9fcHV0Y2hhcl9pbml0KFRYNDkzOF9TSU9fUkVHKDApICYgMHhmZmZmZmZmZmZVTEwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzgvc2V0dXAuYyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM4L3NldHVwLmMKaW5kZXggOWFiNDhkZS4uZTA3N2NjNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzgvc2V0dXAuYworKysgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9zZXR1cC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTExMCw2ICsxMTEsNyBAQAogI2RlZmluZQlTRUVQUk9NMl9DUwkwCS8qIElPQyAqLwogI2RlZmluZQlTRUVQUk9NM19DUwkxCS8qIElPQyAqLwogI2RlZmluZQlTUlRDX0NTCTIJLyogSU9DICovCisjZGVmaW5lIFNQSV9CVVNOTwkwCiAKIHN0YXRpYyBpbnQgX19pbml0IHJidHg0OTM4X2V0aGFkZHJfaW5pdCh2b2lkKQogewpAQCAtMTE5LDcgKzEyMSw3IEBACiAJaW50IGk7CiAKIAkvKiAwLTM6ICJNQUNcMCIsIDQtOTpldGgwLCAxMC0xNTpldGgxLCAxNjpzdW0gKi8KLQlpZiAoc3BpX2VlcHJvbV9yZWFkKFNFRVBST00xX0NTLCAwLCBkYXQsIHNpemVvZihkYXQpKSkgeworCWlmIChzcGlfZWVwcm9tX3JlYWQoU1BJX0JVU05PLCBTRUVQUk9NMV9DUywgMCwgZGF0LCBzaXplb2YoZGF0KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzZWVwcm9tOiByZWFkIGVycm9yLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7CkBAIC0xNzMsMjMgKzE3NSwzMCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVE9TSElCQV9SQlRYNDkzOF9NUExFWF9QSU81OF82MQotCXByaW50ayhLRVJOX0lORk8gIlBJT1NFTDogZGlzYWJsaW5nIGJvdGggYXRhIGFuZCBuYW5kIHNlbGVjdGlvblxuIik7CisJcHJfaW5mbygiUElPU0VMOiBkaXNhYmxpbmcgYm90aCBBVEEgYW5kIE5BTkQgc2VsZWN0aW9uXG4iKTsKIAl0eHg5X2NsZWFyNjQoJnR4NDkzOF9jY2ZncHRyLT5wY2ZnLAogCQkgICAgIFRYNDkzOF9QQ0ZHX05ERl9TRUwgfCBUWDQ5MzhfUENGR19BVEFfU0VMKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzhfTVBMRVhfTkFORAotCXByaW50ayhLRVJOX0lORk8gIlBJT1NFTDogZW5hYmxpbmcgbmFuZCBzZWxlY3Rpb25cbiIpOworCXByX2luZm8oIlBJT1NFTDogZW5hYmxpbmcgTkFORCBzZWxlY3Rpb25cbiIpOwogCXR4eDlfc2V0NjQoJnR4NDkzOF9jY2ZncHRyLT5wY2ZnLCBUWDQ5MzhfUENGR19OREZfU0VMKTsKIAl0eHg5X2NsZWFyNjQoJnR4NDkzOF9jY2ZncHRyLT5wY2ZnLCBUWDQ5MzhfUENGR19BVEFfU0VMKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzhfTVBMRVhfQVRBCi0JcHJpbnRrKEtFUk5fSU5GTyAiUElPU0VMOiBlbmFibGluZyBhdGEgc2VsZWN0aW9uXG4iKTsKKwlwcl9pbmZvKCJQSU9TRUw6IGVuYWJsaW5nIEFUQSBzZWxlY3Rpb25cbiIpOwogCXR4eDlfc2V0NjQoJnR4NDkzOF9jY2ZncHRyLT5wY2ZnLCBUWDQ5MzhfUENGR19BVEFfU0VMKTsKIAl0eHg5X2NsZWFyNjQoJnR4NDkzOF9jY2ZncHRyLT5wY2ZnLCBUWDQ5MzhfUENGR19OREZfU0VMKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzhfTVBMRVhfS0VFUAorCXBjZmcgPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MzhfY2NmZ3B0ci0+cGNmZyk7CisJcHJfaW5mbygiUElPU0VMOiBOQU5EICVzLCBBVEEgJXNcbiIsCisJCShwY2ZnICYgVFg0OTM4X1BDRkdfTkRGX1NFTCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCQkocGNmZyAmIFRYNDkzOF9QQ0ZHX0FUQV9TRUwpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisjZW5kaWYKKwogCXJidHg0OTM4X3NwaV9zZXR1cCgpOwogCXBjZmcgPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MzhfY2NmZ3B0ci0+cGNmZyk7CS8qIHVwZGF0ZWQgKi8KIAkvKiBmaXh1cCBwaW9zZWwgKi8KQEAgLTI3OSw5ICsyODgsOSBAQAogCQkubW9kZSA9IFNQSV9NT0RFXzEgfCBTUElfQ1NfSElHSCwKIAl9OwogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKCZzcnRjX2luZm8sIDEpOwotCXNwaV9lZXByb21fcmVnaXN0ZXIoU0VFUFJPTTFfQ1MpOwotCXNwaV9lZXByb21fcmVnaXN0ZXIoMTYgKyBTRUVQUk9NMl9DUyk7Ci0Jc3BpX2VlcHJvbV9yZWdpc3RlcigxNiArIFNFRVBST00zX0NTKTsKKwlzcGlfZWVwcm9tX3JlZ2lzdGVyKFNQSV9CVVNOTywgU0VFUFJPTTFfQ1MsIDEyOCk7CisJc3BpX2VlcHJvbV9yZWdpc3RlcihTUElfQlVTTk8sIDE2ICsgU0VFUFJPTTJfQ1MsIDEyOCk7CisJc3BpX2VlcHJvbV9yZWdpc3RlcihTUElfQlVTTk8sIDE2ICsgU0VFUFJPTTNfQ1MsIDEyOCk7CiAJZ3Bpb19yZXF1ZXN0KDE2ICsgU1JUQ19DUywgInJ0Yy1yczVjMzQ4Iik7CiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDE2ICsgU1JUQ19DUywgMCk7CiAJZ3Bpb19yZXF1ZXN0KFNFRVBST00xX0NTLCAic2VlcHJvbTEiKTsKQEAgLTI5MCwxMCArMjk5LDQ2IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDE2ICsgU0VFUFJPTTJfQ1MsIDEpOwogCWdwaW9fcmVxdWVzdCgxNiArIFNFRVBST00zX0NTLCAic2VlcHJvbTMiKTsKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTYgKyBTRUVQUk9NM19DUywgMSk7Ci0JdHg0OTM4X3NwaV9pbml0KDApOworCXR4NDkzOF9zcGlfaW5pdChTUElfQlVTTk8pOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgcmJ0eDQ5MzhfbXRkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBkYXRhID0geworCQkud2lkdGggPSA0LAorCX07CisKKwlzd2l0Y2ggKHJlYWRiKHJidHg0OTM4X2JkaXBzd19hZGRyKSAmIDcpIHsKKwljYXNlIDA6CisJCS8qIEJvb3QgKi8KKwkJdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoMCwgMHgxZmMwMDAwMCwgMHg0MDAwMDAsICZwZGF0YSk7CisJCS8qIFN5c3RlbSAqLworCQl0eHg5X3BoeXNtYXBfZmxhc2hfaW5pdCgxLCAweDFlMDAwMDAwLCAweDEwMDAwMDAsICZwZGF0YSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogU3lzdGVtICovCisJCXR4eDlfcGh5c21hcF9mbGFzaF9pbml0KDAsIDB4MWYwMDAwMDAsIDB4MTAwMDAwMCwgJnBkYXRhKTsKKwkJLyogQm9vdCAqLworCQl0eHg5X3BoeXNtYXBfZmxhc2hfaW5pdCgxLCAweDFlYzAwMDAwLCAweDQwMDAwMCwgJnBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBFeHQgKi8KKwkJdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoMCwgMHgxZjAwMDAwMCwgMHgxMDAwMDAwLCAmcGRhdGEpOworCQkvKiBTeXN0ZW0gKi8KKwkJdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoMSwgMHgxZTAwMDAwMCwgMHgxMDAwMDAwLCAmcGRhdGEpOworCQkvKiBCb290ICovCisJCXR4eDlfcGh5c21hcF9mbGFzaF9pbml0KDIsIDB4MWRjMDAwMDAsIDB4NDAwMDAwLCAmcGRhdGEpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qIEJvb3QgKi8KKwkJdHh4OV9waHlzbWFwX2ZsYXNoX2luaXQoMSwgMHgxYmMwMDAwMCwgMHg0MDAwMDAsICZwZGF0YSk7CisJCS8qIFN5c3RlbSAqLworCQl0eHg5X3BoeXNtYXBfZmxhc2hfaW5pdCgyLCAweDFhMDAwMDAwLCAweDEwMDAwMDAsICZwZGF0YSk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTM4X2FyY2hfaW5pdCh2b2lkKQogewogCWdwaW9jaGlwX2FkZCgmcmJ0eDQ5Mzhfc3BpX2dwaW9fY2hpcCk7CkBAIC0zMDYsNiArMzUxLDggQEAKIAlyYnR4NDkzOF9ldGhhZGRyX2luaXQoKTsKIAlyYnR4NDkzOF9uZV9pbml0KCk7CiAJdHg0OTM4X3dkdF9pbml0KCk7CisJcmJ0eDQ5MzhfbXRkX2luaXQoKTsKKwl0eHg5X2lvY2xlZF9pbml0KFJCVFg0OTM4X0xFRF9BRERSIC0gSU9fQkFTRSwgLTEsIDgsIDEsICJncmVlbiIsIE5VTEwpOwogfQogCiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgcmJ0eDQ5MzhfdmVjIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9zcGlfZWVwcm9tLmMgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9zcGlfZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWE4YjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzgvc3BpX2VlcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIHNwaV9lZXByb20uYwotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgotICoKLSAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKLSAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqCi0gKiBTdXBwb3J0IGZvciBUWDQ5MzggaW4gMi42IC0gTWFuaXNoIExhY2h3YW5pIChtbGFjaHdhbmlAbXZpc3RhLmNvbSkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL2VlcHJvbS5oPgotI2luY2x1ZGUgPGFzbS90eHg5L3NwaS5oPgotCi0jZGVmaW5lIEFUMjUwWDBfUEFHRV9TSVpFCTgKLQotLyogcmVnaXN0ZXIgYm9hcmQgaW5mb3JtYXRpb24gZm9yIGF0MjUgZHJpdmVyICovCi1pbnQgX19pbml0IHNwaV9lZXByb21fcmVnaXN0ZXIoaW50IGNoaXBpZCkKLXsKLQlzdGF0aWMgc3RydWN0IHNwaV9lZXByb20gZWVwcm9tID0gewotCQkubmFtZSA9ICJhdDI1MHgwIiwKLQkJLmJ5dGVfbGVuID0gMTI4LAotCQkucGFnZV9zaXplID0gQVQyNTBYMF9QQUdFX1NJWkUsCi0JCS5mbGFncyA9IEVFX0FERFIxLAotCX07Ci0Jc3RydWN0IHNwaV9ib2FyZF9pbmZvIGluZm8gPSB7Ci0JCS5tb2RhbGlhcyA9ICJhdDI1IiwKLQkJLm1heF9zcGVlZF9oeiA9IDE1MDAwMDAsCS8qIDEuNU1icHMgKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSBjaGlwaWQsCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmVlcHJvbSwKLQkJLyogTW9kZSAwOiBIaWdoLUFjdGl2ZSwgU2FtcGxlLVRoZW4tU2hpZnQgKi8KLQl9OwotCi0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKCZpbmZvLCAxKTsKLX0KLQotLyogc2ltcGxlIHRlbXBvcmFyeSBzcGkgZHJpdmVyIHRvIHByb3ZpZGUgZWFybHkgYWNjZXNzIHRvIHNlZXByb20uICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVhZF9wYXJhbSB7Ci0JaW50IGNoaXBpZDsKLQlpbnQgYWRkcmVzczsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JaW50IGxlbjsKLX0gKnJlYWRfcGFyYW07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3NlZXByb21fcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlpbnQgc3RhdCA9IDA7Ci0JdTggY21kWzJdOwotCWludCBsZW4gPSByZWFkX3BhcmFtLT5sZW47Ci0JY2hhciAqYnVmID0gcmVhZF9wYXJhbS0+YnVmOwotCWludCBhZGRyZXNzID0gcmVhZF9wYXJhbS0+YWRkcmVzczsKLQotCWRldl9pbmZvKCZzcGktPmRldiwgInNwaWNsayAldSBLSHouXG4iLAotCQkgKHNwaS0+bWF4X3NwZWVkX2h6ICsgNTAwKSAvIDEwMDApOwotCWlmIChyZWFkX3BhcmFtLT5jaGlwaWQgIT0gc3BpLT5jaGlwX3NlbGVjdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJLyogc3BpX3dyaXRlX3RoZW5fcmVhZCBjYW4gb25seSB3b3JrIHdpdGggc21hbGwgY2h1bmsgKi8KLQkJaW50IGMgPSBsZW4gPCBBVDI1MFgwX1BBR0VfU0laRSA/IGxlbiA6IEFUMjUwWDBfUEFHRV9TSVpFOwotCQljbWRbMF0gPSAweDAzOwkvKiBBVDI1X1JFQUQgKi8KLQkJY21kWzFdID0gYWRkcmVzczsKLQkJc3RhdCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBjbWQsIHNpemVvZihjbWQpLCBidWYsIGMpOwotCQlidWYgKz0gYzsKLQkJbGVuIC09IGM7Ci0JCWFkZHJlc3MgKz0gYzsKLQl9Ci0JcmV0dXJuIHN0YXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBlYXJseV9zZWVwcm9tX2RyaXZlciBfX2luaXRkYXRhID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImF0MjUiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQk9IGVhcmx5X3NlZXByb21fcHJvYmUsCi19OwotCi1pbnQgX19pbml0IHNwaV9lZXByb21fcmVhZChpbnQgY2hpcGlkLCBpbnQgYWRkcmVzcywKLQkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCByZWFkX3BhcmFtIHBhcmFtID0gewotCQkuY2hpcGlkID0gY2hpcGlkLAotCQkuYWRkcmVzcyA9IGFkZHJlc3MsCi0JCS5idWYgPSBidWYsCi0JCS5sZW4gPSBsZW4KLQl9OwotCi0JcmVhZF9wYXJhbSA9ICZwYXJhbTsKLQlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZlYXJseV9zZWVwcm9tX2RyaXZlcik7Ci0JaWYgKCFyZXQpCi0JCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmZWFybHlfc2VlcHJvbV9kcml2ZXIpOwotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9NYWtlZmlsZSBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzJjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai15CSArPSBpcnEubyBzZXR1cC5vIHByb20ubworCitFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvaXJxLmMgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDBjYzBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvaXJxLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIFRvc2hpYmEgUkJUWDQ5MzkgaW50ZXJydXB0IHJvdXRpbmVzCisgKiBCYXNlZCBvbiBsaW51eC9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOC9pcnEuYywKKyAqCSAgICBhbmQgUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsMjAwNS0yMDA2IFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9yYnR4NDkzOS5oPgorCisvKgorICogUkJUWDQ5MzkgSU9DIGNvbnRyb2xsZXIgZGVmaW5pdGlvbgorICovCisKK3N0YXRpYyB2b2lkIHJidHg0OTM5X2lvY19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGlvY19uciA9IGlycSAtIFJCVFg0OTM5X0lSUV9JT0M7CisKKwl3cml0ZWIocmVhZGIocmJ0eDQ5MzlfaWVuX2FkZHIpIHwgKDEgPDwgaW9jX25yKSwgcmJ0eDQ5MzlfaWVuX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCByYnR4NDkzOV9pb2NfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgaW9jX25yID0gaXJxIC0gUkJUWDQ5MzlfSVJRX0lPQzsKKworCXdyaXRlYihyZWFkYihyYnR4NDkzOV9pZW5fYWRkcikgJiB+KDEgPDwgaW9jX25yKSwgcmJ0eDQ5MzlfaWVuX2FkZHIpOworCW1taW93YigpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHJidHg0OTM5X2lvY19pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAiSU9DIiwKKwkuYWNrCQk9IHJidHg0OTM5X2lvY19pcnFfbWFzaywKKwkubWFzawkJPSByYnR4NDkzOV9pb2NfaXJxX21hc2ssCisJLm1hc2tfYWNrCT0gcmJ0eDQ5MzlfaW9jX2lycV9tYXNrLAorCS51bm1hc2sJCT0gcmJ0eDQ5MzlfaW9jX2lycV91bm1hc2ssCit9OworCisKK3N0YXRpYyBpbmxpbmUgaW50IHJidHg0OTM5X2lvY19pcnFyb3V0ZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgaXN0YXQgPSByZWFkYihyYnR4NDkzOV9pZmFjMl9hZGRyKTsKKworCWlmICh1bmxpa2VseShpc3RhdCA9PSAwKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBSQlRYNDkzOV9JUlFfSU9DICsgX19mbHM4KGlzdGF0KTsKK30KKworc3RhdGljIGludCByYnR4NDkzOV9pcnFfZGlzcGF0Y2goaW50IHBlbmRpbmcpCit7CisJaW50IGlycTsKKworCWlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNykKKwkJcmV0dXJuIE1JUFNfQ1BVX0lSUV9CQVNFICsgNzsKKwlpcnEgPSB0eDQ5MzlfaXJxKCk7CisJaWYgKGxpa2VseShpcnEgPj0gMCkpIHsKKwkJLyogcmVkaXJlY3QgSU9DIGludGVycnVwdHMgKi8KKwkJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSBSQlRYNDkzOV9JUlFfSU9DSU5UOgorCQkJaXJxID0gcmJ0eDQ5MzlfaW9jX2lycXJvdXRlKCk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDApCisJCWlycSA9IE1JUFNfQ1BVX0lSUV9CQVNFICsgMDsKKwllbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQMSkKKwkJaXJxID0gTUlQU19DUFVfSVJRX0JBU0UgKyAxOworCWVsc2UKKwkJaXJxID0gLTE7CisJcmV0dXJuIGlycTsKK30KKwordm9pZCBfX2luaXQgcmJ0eDQ5MzlfaXJxX3NldHVwKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBtYXNrIGFsbCBJT0MgaW50ZXJydXB0cyAqLworCXdyaXRlYigwLCByYnR4NDkzOV9pZW5fYWRkcik7CisKKwkvKiBjbGVhciBTb2Z0SW50IGludGVycnVwdHMgKi8KKwl3cml0ZWIoMCwgcmJ0eDQ5Mzlfc29mdGludF9hZGRyKTsKKworCXR4eDlfaXJxX2Rpc3BhdGNoID0gcmJ0eDQ5MzlfaXJxX2Rpc3BhdGNoOworCisJdHg0OTM5X2lycV9pbml0KCk7CisJZm9yIChpID0gUkJUWDQ5MzlfSVJRX0lPQzsKKwkgICAgIGkgPCBSQlRYNDkzOV9JUlFfSU9DICsgUkJUWDQ5MzlfTlJfSVJRX0lPQzsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnJidHg0OTM5X2lvY19pcnFfY2hpcCwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoUkJUWDQ5MzlfSVJRX0lPQ0lOVCwgaGFuZGxlX3NpbXBsZV9pcnEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvcHJvbS5jIGIvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjc3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9wcm9tLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHJidHg0OTM5IHNwZWNpZmljIHByb20gcm91dGluZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS90eHg5L2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxhc20vdHh4OS9yYnR4NDkzOS5oPgorCit2b2lkIF9faW5pdCByYnR4NDkzOV9wcm9tX2luaXQodm9pZCkKK3sKKwl0eDQ5MzlfYWRkX21lbW9yeV9yZWdpb25zKCk7CisJdHh4OV9zaW9fcHV0Y2hhcl9pbml0KFRYNDkzOV9TSU9fUkVHKDApICYgMHhmZmZmZmZmZmZVTEwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzkvc2V0dXAuYyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1NWQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L3NldHVwLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBUb3NoaWJhIFJCVFg0OTM5IHNldHVwIHJvdXRpbmVzLgorICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzgvc2V0dXAuYywKKyAqCSAgICBhbmQgUkJUWDQ5eHggcGF0Y2ggZnJvbSBDRUxGIHBhdGNoIGFyY2hpdmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsMjAwNS0yMDA3IFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGFzbS90eHg5L3BjaS5oPgorI2luY2x1ZGUgPGFzbS90eHg5L3JidHg0OTM5Lmg+CisKK3N0YXRpYyB2b2lkIHJidHg0OTM5X21hY2hpbmVfcmVzdGFydChjaGFyICpjb21tYW5kKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd3JpdGViKDEsIHJidHg0OTM5X3Jlc2V0ZW5fYWRkcik7CisJd3JpdGViKDEsIHJidHg0OTM5X3NvZnRyZXNldF9hZGRyKTsKKwl3aGlsZSAoMSkKKwkJOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcmJ0eDQ5MzlfdGltZV9pbml0KHZvaWQpCit7CisJdHg0OTM5X3RpbWVfaW5pdCgwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTM5X3BjaV9zZXR1cCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpbnQgZXh0YXJiID0gIShfX3Jhd19yZWFkcSgmdHg0OTM5X2NjZmdwdHItPmNjZmcpICYgVFg0OTM5X0NDRkdfUENJQVJCKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmMgPSAmdHh4OV9wcmltYXJ5X3BjaWM7CisKKwlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcihjKTsKKworCXR4NDkzOV9yZXBvcnRfcGNpY2xrKCk7CisJdHg0OTI3X3BjaWNfc2V0dXAodHg0OTM5X3BjaWNwdHIsIGMsIGV4dGFyYik7CisJaWYgKCEoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnKSAmIFRYNDkzOV9QQ0ZHX0FUQTFNT0RFKSAmJgorCSAgICAoX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5wY2ZnKSAmCisJICAgICAoVFg0OTM5X1BDRkdfRVQwTU9ERSB8IFRYNDkzOV9QQ0ZHX0VUMU1PREUpKSkgeworCQl0eDQ5MzlfcmVwb3J0X3BjaTFjbGsoKTsKKworCQkvKiBtZW06NjRLKG1heCksIGlvOjY0SyhtYXgpIChlbm91Z2ggZm9yIEVUSDAsRVRIMSkgKi8KKwkJYyA9IHR4eDlfYWxsb2NfcGNpX2NvbnRyb2xsZXIoTlVMTCwgMCwgMHgxMDAwMCwgMCwgMHgxMDAwMCk7CisJCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKGMpOworCQl0eDQ5MjdfcGNpY19zZXR1cCh0eDQ5MzlfcGNpYzFwdHIsIGMsIDApOworCX0KKworCXR4NDkzOV9zZXR1cF9wY2llcnJfaXJxKCk7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGRlZmF1bHRfZWJjY3JbXSBfX2luaXRkYXRhID0geworCTB4MDFjMDAwMDAwMDAwNzYwOFVMTCwgLyogNjRNIFJPTSAqLworCTB4MDE3ZjAwMDAwMDAwNzA0OVVMTCwgLyogMU0gSU9DICovCisJMHgwMTgwMDAwMDAwNDA4NjA4VUxMLCAvKiBJU0EgKi8KKwkwLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTM5X2VidXNjX3NldHVwKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHNwOworCisJLyogdXNlIHVzZXItY29uZmlndXJlZCBzcGVlZCAqLworCXNwID0gVFg0OTM5X0VCVVNDX0NSKDApICYgMHgzMDsKKwlkZWZhdWx0X2ViY2NyWzBdIHw9IHNwOworCWRlZmF1bHRfZWJjY3JbMV0gfD0gc3A7CisJZGVmYXVsdF9lYmNjclsyXSB8PSBzcDsKKwkvKiBpbml0aWFsaXNlIGJ5IG15c2VsZiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlZmF1bHRfZWJjY3IpOyBpKyspIHsKKwkJaWYgKGRlZmF1bHRfZWJjY3JbaV0pCisJCQlfX19fcmF3X3dyaXRlcShkZWZhdWx0X2ViY2NyW2ldLAorCQkJCSAgICAgICAmdHg0OTM5X2VidXNjcHRyLT5jcltpXSk7CisJCWVsc2UKKwkJCV9fX19yYXdfd3JpdGVxKF9fX19yYXdfcmVhZHEoJnR4NDkzOV9lYnVzY3B0ci0+Y3JbaV0pCisJCQkJICAgICAgICYgfjgsCisJCQkJICAgICAgICZ0eDQ5MzlfZWJ1c2NwdHItPmNyW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCByYnR4NDkzOV91cGRhdGVfaW9jX3Blbih2b2lkKQoreworCV9fdTY0IHBjZmcgPSBfX19fcmF3X3JlYWRxKCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZyk7CisJX191NjQgY2NmZyA9IF9fX19yYXdfcmVhZHEoJnR4NDkzOV9jY2ZncHRyLT5jY2ZnKTsKKwlfX3U4IHBlMSA9IHJlYWRiKHJidHg0OTM5X3BlMV9hZGRyKTsKKwlfX3U4IHBlMiA9IHJlYWRiKHJidHg0OTM5X3BlMl9hZGRyKTsKKwlfX3U4IHBlMyA9IHJlYWRiKHJidHg0OTM5X3BlM19hZGRyKTsKKwlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX0FUQTBNT0RFKQorCQlwZTEgfD0gUkJUWDQ5MzlfUEUxX0FUQSgwKTsKKwllbHNlCisJCXBlMSAmPSB+UkJUWDQ5MzlfUEUxX0FUQSgwKTsKKwlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX0FUQTFNT0RFKSB7CisJCXBlMSB8PSBSQlRYNDkzOV9QRTFfQVRBKDEpOworCQlwZTEgJj0gfihSQlRYNDkzOV9QRTFfUk1JSSgwKSB8IFJCVFg0OTM5X1BFMV9STUlJKDEpKTsKKwl9IGVsc2UgeworCQlwZTEgJj0gflJCVFg0OTM5X1BFMV9BVEEoMSk7CisJCWlmIChwY2ZnICYgVFg0OTM5X1BDRkdfRVQwTU9ERSkKKwkJCXBlMSB8PSBSQlRYNDkzOV9QRTFfUk1JSSgwKTsKKwkJZWxzZQorCQkJcGUxICY9IH5SQlRYNDkzOV9QRTFfUk1JSSgwKTsKKwkJaWYgKHBjZmcgJiBUWDQ5MzlfUENGR19FVDFNT0RFKQorCQkJcGUxIHw9IFJCVFg0OTM5X1BFMV9STUlJKDEpOworCQllbHNlCisJCQlwZTEgJj0gflJCVFg0OTM5X1BFMV9STUlJKDEpOworCX0KKwlpZiAoY2NmZyAmIFRYNDkzOV9DQ0ZHX1BUU0VMKQorCQlwZTMgJj0gfihSQlRYNDkzOV9QRTNfVlAgfCBSQlRYNDkzOV9QRTNfVlBfUCB8CisJCQkgUkJUWDQ5MzlfUEUzX1ZQX1MpOworCWVsc2UgeworCQlfX3U2NCB2bW9kZSA9IHBjZmcgJgorCQkJKFRYNDkzOV9QQ0ZHX1ZTU01PREUgfCBUWDQ5MzlfUENGR19WUFNNT0RFKTsKKwkJaWYgKHZtb2RlID09IDApCisJCQlwZTMgJj0gfihSQlRYNDkzOV9QRTNfVlAgfCBSQlRYNDkzOV9QRTNfVlBfUCB8CisJCQkJIFJCVFg0OTM5X1BFM19WUF9TKTsKKwkJZWxzZSBpZiAodm1vZGUgPT0gVFg0OTM5X1BDRkdfVlBTTU9ERSkgeworCQkJcGUzIHw9IFJCVFg0OTM5X1BFM19WUF9QOworCQkJcGUzICY9IH4oUkJUWDQ5MzlfUEUzX1ZQIHwgUkJUWDQ5MzlfUEUzX1ZQX1MpOworCQl9IGVsc2UgaWYgKHZtb2RlID09IFRYNDkzOV9QQ0ZHX1ZTU01PREUpIHsKKwkJCXBlMyB8PSBSQlRYNDkzOV9QRTNfVlAgfCBSQlRYNDkzOV9QRTNfVlBfUzsKKwkJCXBlMyAmPSB+UkJUWDQ5MzlfUEUzX1ZQX1A7CisJCX0gZWxzZSB7CisJCQlwZTMgfD0gUkJUWDQ5MzlfUEUzX1ZQIHwgUkJUWDQ5MzlfUEUzX1ZQX1A7CisJCQlwZTMgJj0gflJCVFg0OTM5X1BFM19WUF9TOworCQl9CisJfQorCWlmIChwY2ZnICYgVFg0OTM5X1BDRkdfU1BJTU9ERSkgeworCQlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX1NJTzJNT0RFX0dQSU8pCisJCQlwZTIgJj0gfihSQlRYNDkzOV9QRTJfU0lPMiB8IFJCVFg0OTM5X1BFMl9TSU8wKTsKKwkJZWxzZSB7CisJCQlpZiAocGNmZyAmIFRYNDkzOV9QQ0ZHX1NJTzJNT0RFX1NJTzIpIHsKKwkJCQlwZTIgfD0gUkJUWDQ5MzlfUEUyX1NJTzI7CisJCQkJcGUyICY9IH5SQlRYNDkzOV9QRTJfU0lPMDsKKwkJCX0gZWxzZSB7CisJCQkJcGUyIHw9IFJCVFg0OTM5X1BFMl9TSU8wOworCQkJCXBlMiAmPSB+UkJUWDQ5MzlfUEUyX1NJTzI7CisJCQl9CisJCX0KKwkJaWYgKHBjZmcgJiBUWDQ5MzlfUENGR19TSU8zTU9ERSkKKwkJCXBlMiB8PSBSQlRYNDkzOV9QRTJfU0lPMzsKKwkJZWxzZQorCQkJcGUyICY9IH5SQlRYNDkzOV9QRTJfU0lPMzsKKwkJcGUyICY9IH5SQlRYNDkzOV9QRTJfU1BJOworCX0gZWxzZSB7CisJCXBlMiB8PSBSQlRYNDkzOV9QRTJfU1BJOworCQlwZTIgJj0gfihSQlRYNDkzOV9QRTJfU0lPMyB8IFJCVFg0OTM5X1BFMl9TSU8yIHwKKwkJCSBSQlRYNDkzOV9QRTJfU0lPMCk7CisJfQorCWlmICgocGNmZyAmIFRYNDkzOV9QQ0ZHX0kyU01PREVfTUFTSykgPT0gVFg0OTM5X1BDRkdfSTJTTU9ERV9HUElPKQorCQlwZTIgfD0gUkJUWDQ5MzlfUEUyX0dQSU87CisJZWxzZQorCQlwZTIgJj0gflJCVFg0OTM5X1BFMl9HUElPOworCXdyaXRlYihwZTEsIHJidHg0OTM5X3BlMV9hZGRyKTsKKwl3cml0ZWIocGUyLCByYnR4NDkzOV9wZTJfYWRkcik7CisJd3JpdGViKHBlMywgcmJ0eDQ5MzlfcGUzX2FkZHIpOworfQorCisjZGVmaW5lIFJCVFg0OTM5X01BWF83U0VHTEVEUwk4CisKKyNpZiBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTX01PRFVMRSkKK3N0YXRpYyB1OCBsZWRfdmFsW1JCVFg0OTM5X01BWF83U0VHTEVEU107CitzdHJ1Y3QgcmJ0eDQ5MzlfbGVkX2RhdGEgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYgY2RldjsKKwljaGFyIG5hbWVbMzJdOworCXVuc2lnbmVkIGludCBudW07Cit9OworCisvKiBVc2UgImRvdCIgaW4gN3NlZyBMRURzICovCitzdGF0aWMgdm9pZCByYnR4NDkzOV9sZWRfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IHJidHg0OTM5X2xlZF9kYXRhICpsZWRfZGF0ID0KKwkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgcmJ0eDQ5MzlfbGVkX2RhdGEsIGNkZXYpOworCXVuc2lnbmVkIGludCBudW0gPSBsZWRfZGF0LT5udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsZWRfdmFsW251bV0gPSAobGVkX3ZhbFtudW1dICYgMHg3ZikgfCAodmFsdWUgPyAweDgwIDogMCk7CisJd3JpdGViKGxlZF92YWxbbnVtXSwgcmJ0eDQ5MzlfN3NlZ19hZGRyKG51bSAvIDQsIG51bSAlIDQpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJidHg0OTM5X2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByYnR4NDkzOV9sZWRfZGF0YSAqbGVkc19kYXRhOworCWludCBpOworCXN0YXRpYyBjaGFyICpkZWZhdWx0X3RyaWdnZXJzW10gX19pbml0ZGF0YSA9IHsKKwkJImhlYXJ0YmVhdCIsCisJCSJpZGUtZGlzayIsCisJCSJuYW5kLWRpc2siLAorCX07CisKKwlsZWRzX2RhdGEgPSBremFsbG9jKHNpemVvZigqbGVkc19kYXRhKSAqIFJCVFg0OTM5X01BWF83U0VHTEVEUywKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlZHNfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IFJCVFg0OTM5X01BWF83U0VHTEVEUzsgaSsrKSB7CisJCWludCByYzsKKwkJc3RydWN0IHJidHg0OTM5X2xlZF9kYXRhICpsZWRfZGF0ID0gJmxlZHNfZGF0YVtpXTsKKworCQlsZWRfZGF0LT5udW0gPSBpOworCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gcmJ0eDQ5MzlfbGVkX2JyaWdodG5lc3Nfc2V0OworCQlzcHJpbnRmKGxlZF9kYXQtPm5hbWUsICJyYnR4NDkzOTphbWJlcjoldSIsIGkpOworCQlsZWRfZGF0LT5jZGV2Lm5hbWUgPSBsZWRfZGF0LT5uYW1lOworCQlpZiAoaSA8IEFSUkFZX1NJWkUoZGVmYXVsdF90cmlnZ2VycykpCisJCQlsZWRfZGF0LT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IGRlZmF1bHRfdHJpZ2dlcnNbaV07CisJCXJjID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZsZWRfZGF0LT5jZGV2KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzX3NldCgmbGVkX2RhdC0+Y2RldiwgMCk7CisJfQorCXJldHVybiAwOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJidHg0OTM5X2xlZF9kcml2ZXIgPSB7CisJLmRyaXZlciAgPSB7CisJCS5uYW1lID0gInJidHg0OTM5LWxlZCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcmJ0eDQ5MzlfbGVkX3NldHVwKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgicmJ0eDQ5MzktbGVkIiwgLTEsIE5VTEwsIDApOworCXBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmcmJ0eDQ5MzlfbGVkX2RyaXZlciwgcmJ0eDQ5MzlfbGVkX3Byb2JlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmJ0eDQ5MzlfbGVkX3NldHVwKHZvaWQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTM5X2FyY2hfaW5pdCh2b2lkKQoreworCXJidHg0OTM5X3BjaV9zZXR1cCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcmJ0eDQ5MzlfZGV2aWNlX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19UQzM1ODE1KSB8fCBkZWZpbmVkKENPTkZJR19UQzM1ODE1X01PRFVMRSkKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIGV0aGFkZHJbMl1bNl07CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGFyZWEgPSBDS1NFRzEgKyAweDFmZmYwMDAwICsgKGkgKiAweDEwKTsKKwkJaWYgKHJlYWRiKHJidHg0OTM5X2JkaXBzd19hZGRyKSAmIDgpIHsKKwkJCXUxNiBidWZbM107CisJCQlhcmVhIC09IDB4MDMwMDAwMDA7CisJCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorCQkJCWJ1ZltqXSA9IGxlMTZfdG9fY3B1cCgodTE2ICopKGFyZWEgKyBqICogMikpOworCQkJbWVtY3B5KGV0aGFkZHJbaV0sIGJ1ZiwgNik7CisJCX0gZWxzZQorCQkJbWVtY3B5KGV0aGFkZHJbaV0sICh2b2lkICopYXJlYSwgNik7CisJfQorCXR4NDkzOV9ldGhhZGRyX2luaXQoZXRoYWRkclswXSwgZXRoYWRkclsxXSk7CisjZW5kaWYKKwlyYnR4NDkzOV9sZWRfc2V0dXAoKTsKKwl0eDQ5Mzlfd2R0X2luaXQoKTsKKwl0eDQ5MzlfYXRhX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHJidHg0OTM5X3NldHVwKHZvaWQpCit7CisJcmJ0eDQ5MzlfZWJ1c2Nfc2V0dXAoKTsKKwkvKiBhbHdheXMgZW5hYmxlIEFUQTAgKi8KKwl0eHg5X3NldDY0KCZ0eDQ5MzlfY2NmZ3B0ci0+cGNmZywgVFg0OTM5X1BDRkdfQVRBME1PREUpOworCXJidHg0OTM5X3VwZGF0ZV9pb2NfcGVuKCk7CisJaWYgKHR4eDlfbWFzdGVyX2Nsb2NrID09IDApCisJCXR4eDlfbWFzdGVyX2Nsb2NrID0gMjAwMDAwMDA7CisJdHg0OTM5X3NldHVwKCk7CisKKwlfbWFjaGluZV9yZXN0YXJ0ID0gcmJ0eDQ5MzlfbWFjaGluZV9yZXN0YXJ0OworCisJcHJfaW5mbygiUkJUWDQ5MzkgKFJldiAlMDJ4KSAtLS0gRlBHQShSZXYgJTAyeCkgRElQU1c6JTAyeCwlMDJ4XG4iLAorCQlyZWFkYihyYnR4NDkzOV9ib2FyZF9yZXZfYWRkciksIHJlYWRiKHJidHg0OTM5X2lvY19yZXZfYWRkciksCisJCXJlYWRiKHJidHg0OTM5X3VkaXBzd19hZGRyKSwgcmVhZGIocmJ0eDQ5MzlfYmRpcHN3X2FkZHIpKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwl0eHg5X2FsbG9jX3BjaV9jb250cm9sbGVyKCZ0eHg5X3ByaW1hcnlfcGNpYywgMCwgMCwgMCwgMCk7CisJdHh4OV9ib2FyZF9wY2liaW9zX3NldHVwID0gdHg0OTI3X3BjaWJpb3Nfc2V0dXA7CisjZWxzZQorCXNldF9pb19wb3J0X2Jhc2UoUkJUWDQ5MzlfRVRIRVJfQkFTRSk7CisjZW5kaWYKKworCXR4NDkzOV9zaW9faW5pdChUWDQ5MzlfU0NMSzAodHh4OV9tYXN0ZXJfY2xvY2spLCAwKTsKK30KKworc3RydWN0IHR4eDlfYm9hcmRfdmVjIHJidHg0OTM5X3ZlYyBfX2luaXRkYXRhID0geworCS5zeXN0ZW0gPSAiVG90aGliYSBSQlRYNDkzOSIsCisJLnByb21faW5pdCA9IHJidHg0OTM5X3Byb21faW5pdCwKKwkubWVtX3NldHVwID0gcmJ0eDQ5Mzlfc2V0dXAsCisJLmlycV9zZXR1cCA9IHJidHg0OTM5X2lycV9zZXR1cCwKKwkudGltZV9pbml0ID0gcmJ0eDQ5MzlfdGltZV9pbml0LAorCS5kZXZpY2VfaW5pdCA9IHJidHg0OTM5X2RldmljZV9pbml0LAorCS5hcmNoX2luaXQgPSByYnR4NDkzOV9hcmNoX2luaXQsCisjaWZkZWYgQ09ORklHX1BDSQorCS5wY2lfbWFwX2lycSA9IHR4NDkzOV9wY2lfbWFwX2lycSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL2lycS5jIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaXJxLmMKaW5kZXggY2JhMzZhMi4uOTJkZDFhMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaXJxLmMKQEAgLTcyLDYgKzcyLDcgQEAKIAljYXNjYWRlID0gaXJxX2Nhc2NhZGUgKyBpcnE7CiAJaWYgKGNhc2NhZGUtPmdldF9pcnEgIT0gTlVMTCkgewogCQl1bnNpZ25lZCBpbnQgc291cmNlX2lycSA9IGlycTsKKwkJaW50IHJldDsKIAkJZGVzYyA9IGlycV9kZXNjICsgc291cmNlX2lycTsKIAkJaWYgKGRlc2MtPmNoaXAtPm1hc2tfYWNrKQogCQkJZGVzYy0+Y2hpcC0+bWFza19hY2soc291cmNlX2lycSk7CkBAIC03OSw4ICs4MCw5IEBACiAJCQlkZXNjLT5jaGlwLT5tYXNrKHNvdXJjZV9pcnEpOwogCQkJZGVzYy0+Y2hpcC0+YWNrKHNvdXJjZV9pcnEpOwogCQl9Ci0JCWlycSA9IGNhc2NhZGUtPmdldF9pcnEoaXJxKTsKLQkJaWYgKGlycSA8IDApCisJCXJldCA9IGNhc2NhZGUtPmdldF9pcnEoaXJxKTsKKwkJaXJxID0gcmV0OworCQlpZiAocmV0IDwgMCkKIAkJCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwogCQllbHNlCiAJCQlpcnFfZGlzcGF0Y2goaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9LY29uZmlnIGIvYXJjaC9tbjEwMzAwL0tjb25maWcKaW5kZXggZTg1NjIxOC4uZGQ1NTdjOSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL0tjb25maWcKKysrIGIvYXJjaC9tbjEwMzAwL0tjb25maWcKQEAgLTUzLDkgKzUzLDYgQEAKIGNvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKLQlkZWZfYm9vbCBuCi0KICMgVXNlIHRoZSBnZW5lcmljIGludGVycnVwdCBoYW5kbGluZyBjb2RlIGluIGtlcm5lbC9pcnEvCiBjb25maWcgR0VORVJJQ19IQVJESVJRUwogCWRlZl9ib29sIHkKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvaXJxLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL2lycS5jCmluZGV4IDc2MWM0MzQuLjU2YzY0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pcnEuYwpAQCAtMjAsMjIgKzIwLDggQEAKIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKIC8qCi0gKiBNTjEwMzAwIElOVEMgY29udHJvbGxlciBvcGVyYXRpb25zCisgKiBNTjEwMzAwIGludGVycnVwdCBjb250cm9sbGVyIG9wZXJhdGlvbnMKICAqLwotc3RhdGljIHZvaWQgbW4xMDMwMF9jcHVwaWNfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXUxNiB0bXAgPSBHeElDUihpcnEpOwotCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfTEVWRUwpIHwgR3hJQ1JfREVURUNUOwotCXRtcCA9IEd4SUNSKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXUxNiB0bXAgPSBHeElDUihpcnEpOwotCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfTEVWRUwpIHwgR3hJQ1JfRU5BQkxFOwotCXRtcCA9IEd4SUNSKGlycSk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQogewogCXUxNiB0bXA7CkBAIC02MCwyNiArNDYsNTQgQEAKIHN0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQogewogCXUxNiB0bXAgPSBHeElDUihpcnEpOwotCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfTEVWRUwpIHwgR3hJQ1JfRU5BQkxFIHwgR3hJQ1JfREVURUNUOwotCXRtcCA9IEd4SUNSKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXUxNiB0bXAgPSBHeElDUihpcnEpOwogCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfTEVWRUwpIHwgR3hJQ1JfRU5BQkxFOwogCXRtcCA9IEd4SUNSKGlycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbW4xMDMwMF9jcHVfcGljID0gewotCS5uYW1lCQk9ICJjcHUiLAotCS5kaXNhYmxlCT0gbW4xMDMwMF9jcHVwaWNfZGlzYWJsZSwKLQkuZW5hYmxlCQk9IG1uMTAzMDBfY3B1cGljX2VuYWJsZSwKK3N0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX3VubWFza19jbGVhcih1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIHRoZSBNTjEwMzAwIFBJQyBsYXRjaGVzIGl0cyBpbnRlcnJ1cHQgcmVxdWVzdCBiaXQsIGV2ZW4gYWZ0ZXIgdGhlCisJICogZGV2aWNlIGhhcyBjZWFzZWQgdG8gYXNzZXJ0IGl0cyBpbnRlcnJ1cHQgbGluZSBhbmQgdGhlIGludGVycnVwdAorCSAqIGNoYW5uZWwgaGFzIGJlZW4gZGlzYWJsZWQgaW4gdGhlIFBJQywgc28gZm9yIGxldmVsLXRyaWdnZXJlZAorCSAqIGludGVycnVwdHMgd2UgbmVlZCB0byBjbGVhciB0aGUgcmVxdWVzdCBiaXQgd2hlbiB3ZSByZS1lbmFibGUgKi8KKwl1MTYgdG1wID0gR3hJQ1IoaXJxKTsKKwlHeElDUihpcnEpID0gKHRtcCAmIEd4SUNSX0xFVkVMKSB8IEd4SUNSX0VOQUJMRSB8IEd4SUNSX0RFVEVDVDsKKwl0bXAgPSBHeElDUihpcnEpOworfQorCisvKgorICogTU4xMDMwMCBQSUMgbGV2ZWwtdHJpZ2dlcmVkIElSUSBoYW5kbGluZy4KKyAqCisgKiBUaGUgUElDIGhhcyBubyAnQUNLJyBmdW5jdGlvbiBwZXIgc2UuICBJdCBpcyBwb3NzaWJsZSB0byBjbGVhciBpbmRpdmlkdWFsCisgKiBjaGFubmVsIGxhdGNoZXMsIGJ1dCBlYWNoIGxhdGNoIHJlbGF0Y2hlcyB3aGV0aGVyIG9yIG5vdCB0aGUgY2hhbm5lbCBpcworICogbWFza2VkLCBzbyB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBsYXRjaCB3aGVuIHdlIHVubWFzayB0aGUgY2hhbm5lbC4KKyAqCisgKiBBbHNvIGZvciB0aGlzIHJlYXNvbiwgd2UgZG9uJ3Qgc3VwcGx5IGFuIGFjaygpIG9wIChpdCdzIHVudXNlZCBhbnl3YXkgaWYKKyAqIG1hc2tfYWNrKCkgaXMgcHJvdmlkZWQpLCBhbmQgbWFza19hY2soKSBqdXN0IG1hc2tzLgorICovCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1uMTAzMDBfY3B1X3BpY19sZXZlbCA9IHsKKwkubmFtZQkJPSAiY3B1X2wiLAorCS5kaXNhYmxlCT0gbW4xMDMwMF9jcHVwaWNfbWFzaywKKwkuZW5hYmxlCQk9IG1uMTAzMDBfY3B1cGljX3VubWFza19jbGVhciwKKwkuYWNrCQk9IE5VTEwsCisJLm1hc2sJCT0gbW4xMDMwMF9jcHVwaWNfbWFzaywKKwkubWFza19hY2sJPSBtbjEwMzAwX2NwdXBpY19tYXNrLAorCS51bm1hc2sJCT0gbW4xMDMwMF9jcHVwaWNfdW5tYXNrX2NsZWFyLAorfTsKKworLyoKKyAqIE1OMTAzMDAgUElDIGVkZ2UtdHJpZ2dlcmVkIElSUSBoYW5kbGluZy4KKyAqCisgKiBXZSB1c2UgdGhlIGxhdGNoIGNsZWFyaW5nIGZ1bmN0aW9uIG9mIHRoZSBQSUMgYXMgdGhlICdBQ0snIGZ1bmN0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1uMTAzMDBfY3B1X3BpY19lZGdlID0geworCS5uYW1lCQk9ICJjcHVfZSIsCisJLmRpc2FibGUJPSBtbjEwMzAwX2NwdXBpY19tYXNrLAorCS5lbmFibGUJCT0gbW4xMDMwMF9jcHVwaWNfdW5tYXNrLAogCS5hY2sJCT0gbW4xMDMwMF9jcHVwaWNfYWNrLAogCS5tYXNrCQk9IG1uMTAzMDBfY3B1cGljX21hc2ssCiAJLm1hc2tfYWNrCT0gbW4xMDMwMF9jcHVwaWNfbWFza19hY2ssCiAJLnVubWFzawkJPSBtbjEwMzAwX2NwdXBpY191bm1hc2ssCi0JLmVuZAkJPSBtbjEwMzAwX2NwdXBpY19lbmQsCiB9OwogCiAvKgpAQCAtMTE0LDcgKzEyOCw4IEBACiAgKi8KIHZvaWQgc2V0X2ludHJfcG9zdGFja2FibGUoaW50IGlycSkKIHsKLQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbW4xMDMwMF9jcHVfcGljX2xldmVsLAorCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KIAogLyoKQEAgLTEyNiw4ICsxNDEsMTIgQEAKIAogCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspCiAJCWlmIChpcnFfZGVzY1tpcnFdLmNoaXAgPT0gJm5vX2lycV90eXBlKQotCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm1uMTAzMDBfY3B1X3BpYywKLQkJCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQkJLyogZHVlIHRvIHRoZSBQSUMgbGF0Y2hpbmcgaW50ZXJydXB0IHJlcXVlc3RzLCBldmVuCisJCQkgKiB3aGVuIHRoZSBJUlEgaXMgZGlzYWJsZWQsIElSUV9QRU5ESU5HIGlzIHN1cGVyZmx1b3VzCisJCQkgKiBhbmQgd2UgY2FuIHVzZSBoYW5kbGVfbGV2ZWxfaXJxKCkgZm9yIGVkZ2UtdHJpZ2dlcmVkCisJCQkgKiBpbnRlcnJ1cHRzICovCisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbW4xMDMwMF9jcHVfcGljX2VkZ2UsCisJCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAJdW5pdF9pbml0X0lSUSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3RpbWUuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdGltZS5jCmluZGV4IGJhYmI3YzIuLmU0NjA2NTggMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdGltZS5jCkBAIC0xLDYgKzEsNiBAQAogLyogTU4xMDMwMCBMb3cgbGV2ZWwgdGltZSBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqIC0gRGVyaXZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCiAgKgpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY250MzJfdG9fNjMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtNDAsMjcgKzQxLDU0IEBACiAJLm5hbWUJCT0gInRpbWVyIiwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNjaGVkX2Nsb2NrX211bHRpcGxpZXI7CisKIC8qCiAgKiBzY2hlZHVsZXIgY2xvY2sgLSByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiBuYW5vc2VjIHVuaXRzLgogICovCiB1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKIHsKIAl1bmlvbiB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBsOwotCQl1MzIgd1syXTsKLQl9IHF1b3Q7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKKwkJdW5zaWduZWQgbFsyXTsKKwl9IHRzYzY0LCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyB0c2MsIHRtcDsKKwl1bnNpZ25lZCBwcm9kdWN0WzNdOyAvKiA5Ni1iaXQgaW50ZXJtZWRpYXRlIHZhbHVlICovCiAKLQlxdW90LndbMF0gPSBtbjEwMzAwX2xhc3RfdHNjIC0gZ2V0X2N5Y2xlcygpOwotCXF1b3Qud1sxXSA9IDEwMDAwMDAwMDA7CisJLyogcmVhZCB0aGUgVFNDIHZhbHVlCisJICovCisJdHNjID0gMCAtIGdldF9jeWNsZXMoKTsgLyogZ2V0X2N5Y2xlcygpIGNvdW50cyBkb3duICovCiAKLQlhc20oIm11bHUgJTIsJTMsJTAsJTEiCi0JICAgIDogIj1yIihxdW90LndbMV0pLCAiPXIiKHF1b3Qud1swXSkKLQkgICAgOiAiMCIocXVvdC53WzFdKSwgIjEiKHF1b3Qud1swXSkKKwkvKiBleHBhbmQgdG8gNjQtYml0cy4KKwkgKiAtIHNjaGVkX2Nsb2NrKCkgbXVzdCBiZSBjYWxsZWQgb25jZSBhIG1pbnV0ZSBvciBiZXR0ZXIgb3IgdGhlCisJICogICBmb2xsb3dpbmcgd2lsbCBnbyBob3JyaWJseSB3cm9uZyAtIHNlZSBjbnQzMl90b182MygpCisJICovCisJdHNjNjQubGwgPSBjbnQzMl90b182Myh0c2MpICYgMHg3ZmZmZmZmZmZmZmZmZmZmVUxMOworCisJLyogc2NhbGUgdGhlIDY0LWJpdCBUU0MgdmFsdWUgdG8gYSBuYW5vc2Vjb25kIHZhbHVlIHZpYSBhIDk2LWJpdAorCSAqIGludGVybWVkaWF0ZQorCSAqLworCWFzbSgibXVsdQklMiwlMCwlMywlMAlcbiIJLyogTFNXICogbXVsdCAtPiAgMDolMzolMCAqLworCSAgICAibXVsdQklMiwlMSwlMiwlMQlcbiIJLyogTVNXICogbXVsdCAtPiAlMjolMTowICovCisJICAgICJhZGQJJTMsJTEJCVxuIgorCSAgICAiYWRkYwkwLCUyCQlcbiIJLyogcmVzdWx0IGluICUyOiUxOiUwICovCisJICAgIDogIj1yIihwcm9kdWN0WzBdKSwgIj1yIihwcm9kdWN0WzFdKSwgIj1yIihwcm9kdWN0WzJdKSwgIj1yIih0bXApCisJICAgIDogICIwIih0c2M2NC5sWzBdKSwgICIxIih0c2M2NC5sWzFdKSwgICIyIihzY2hlZF9jbG9ja19tdWx0aXBsaWVyKQogCSAgICA6ICJjYyIpOwogCi0JZG9fZGl2KHF1b3QubCwgTU4xMDMwMF9UU0NDTEspOworCXJlc3VsdC5sWzBdID0gcHJvZHVjdFsxXSA8PCAxNiB8IHByb2R1Y3RbMF0gPj4gMTY7CisJcmVzdWx0LmxbMV0gPSBwcm9kdWN0WzJdIDw8IDE2IHwgcHJvZHVjdFsxXSA+PiAxNjsKIAotCXJldHVybiBxdW90Lmw7CisJcmV0dXJuIHJlc3VsdC5sbDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIHNjaGVkdWxlciBjbG9jaworICovCitzdGF0aWMgdm9pZCBfX2luaXQgbW4xMDMwMF9zY2hlZF9jbG9ja19pbml0KHZvaWQpCit7CisJc2NoZWRfY2xvY2tfbXVsdGlwbGllciA9CisJCV9fbXVsZGl2NjR1KE5TRUNfUEVSX1NFQywgMSA8PCAxNiwgTU4xMDMwMF9UU0NDTEspOwogfQogCiAvKgpAQCAtMTI4LDQgKzE1Niw2IEBACiAJLyogc3RhcnQgdGhlIHdhdGNoZG9nIHRpbWVyICovCiAJd2F0Y2hkb2dfZ28oKTsKICNlbmRpZgorCisJbW4xMDMwMF9zY2hlZF9jbG9ja19pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbW0vZmF1bHQuYyBiL2FyY2gvbW4xMDMwMC9tbS9mYXVsdC5jCmluZGV4IDc4ZjA5MmMuLjMzY2YyNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvbW4xMDMwMC9tbS9mYXVsdC5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCiAJICogY29udGV4dCwgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgogCSAqLwotCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJaWYgKGluX2F0b21pYygpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwMy91bml0LWluaXQuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvdW5pdC1pbml0LmMKaW5kZXggMTRiMmM4MS4uNzBlOGNiNCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwMy91bml0LWluaXQuYworKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL3VuaXQtaW5pdC5jCkBAIC01MSw3ICs1MSw3IEBACiAJCXN3aXRjaCAoR0VUX1hJUlFfVFJJR0dFUihleHRudW0pKSB7CiAJCWNhc2UgWElSUV9UUklHR0VSX0hJTEVWRUw6CiAJCWNhc2UgWElSUV9UUklHR0VSX0xPV0xFVkVMOgotCQkJc2V0X2lycV9oYW5kbGVyKFhJUlEySVJRKGV4dG51bSksIGhhbmRsZV9sZXZlbF9pcnEpOworCQkJc2V0X2ludHJfcG9zdGFja2FibGUoWElSUTJJUlEoZXh0bnVtKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS91bml0LWluaXQuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvdW5pdC1pbml0LmMKaW5kZXggNmEzNTI0MS4uNzI4MTJhOSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS91bml0LWluaXQuYworKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L3VuaXQtaW5pdC5jCkBAIC01Miw3ICs1Miw3IEBACiAJCXN3aXRjaCAoR0VUX1hJUlFfVFJJR0dFUihleHRudW0pKSB7CiAJCWNhc2UgWElSUV9UUklHR0VSX0hJTEVWRUw6CiAJCWNhc2UgWElSUV9UUklHR0VSX0xPV0xFVkVMOgotCQkJc2V0X2lycV9oYW5kbGVyKFhJUlEySVJRKGV4dG51bSksIGhhbmRsZV9sZXZlbF9pcnEpOworCQkJc2V0X2ludHJfcG9zdGFja2FibGUoWElSUTJJUlEoZXh0bnVtKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggYTdkNGZkMzUuLjgzMTNmY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtNzYsOSArNzYsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAotCWRlZl9ib29sIHkKLQogIyB1bmxlc3MgeW91IHdhbnQgdG8gaW1wbGVtZW50IEFDUEkgb24gUEEtUklTQyAuLi4gOy0pCiBjb25maWcgUE0KIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvYmluZm10X2VsZjMyLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvYmluZm10X2VsZjMyLmMKaW5kZXggZWNiMTBhNC4uZjYxNjkyZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2JpbmZtdF9lbGYzMi5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpAQCAtODUsNyArODUsNyBAQAogICogY291bGQgc2V0IGEgcHJvY2Vzc29yIGRlcGVuZGVudCBmbGFnIGluIHRoZSB0aHJlYWRfc3RydWN0LgogICovCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgXAorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIFwKIAlzZXRfdGhyZWFkX2ZsYWcoVElGXzMyQklUKTsgXAogCWN1cnJlbnQtPnRocmVhZC5tYXBfYmFzZSA9IERFRkFVTFRfTUFQX0JBU0UzMjsgXAogCWN1cnJlbnQtPnRocmVhZC50YXNrX3NpemUgPSBERUZBVUxUX1RBU0tfU0laRTMyIFwKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYwppbmRleCBmZGFjZGQ0Li40NDEzOGMzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jCkBAIC00Nyw3ICs0Nyw5IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiAjaWYgMApAQCAtODYwLDMgKzg2MiwxNSBAQAogCWRlcmVnaXN0ZXJfdW53aW5kX3RhYmxlKG1vZCk7CiAJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiB9CisKKyNpZmRlZiBDT05GSUdfNjRCSVQKK3ZvaWQgKmRlcmVmZXJlbmNlX2Z1bmN0aW9uX2Rlc2NyaXB0b3Iodm9pZCAqcHRyKQoreworCUVsZjY0X0ZkZXNjICpkZXNjID0gcHRyOworCXZvaWQgKnA7CisKKwlpZiAoIXByb2JlX2tlcm5lbF9hZGRyZXNzKCZkZXNjLT5hZGRyLCBwKSkKKwkJcHRyID0gcDsKKwlyZXR1cm4gcHRyOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYzMyLmMKaW5kZXggNzFlZmQ2YS4uMDgzODE1NSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MzMi5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjMzIuYwpAQCAtMTc5LDExMSArMTc5LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50Ci1wdXRfY29tcGF0X3RpbWV2YWwoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdSwgc3RydWN0IHRpbWV2YWwgKnQpCi17Ci0Jc3RydWN0IGNvbXBhdF90aW1ldmFsIHQzMjsKLQl0MzIudHZfc2VjID0gdC0+dHZfc2VjOwotCXQzMi50dl91c2VjID0gdC0+dHZfdXNlYzsKLQlyZXR1cm4gY29weV90b191c2VyKHUsICZ0MzIsIHNpemVvZiB0MzIpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgZ2V0X3RzMzIoc3RydWN0IHRpbWVzcGVjICpvLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICppKQotewotCWxvbmcgdXNlYzsKLQotCWlmIChfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChfX2dldF91c2VyKHVzZWMsICZpLT50dl91c2VjKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jby0+dHZfbnNlYyA9IHVzZWMgKiAxMDAwOwotCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGludAotc3lzMzJfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLSAgICBleHRlcm4gdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KTsKLQotICAgIGlmICh0dikgewotCSAgICBzdHJ1Y3QgdGltZXZhbCBrdHY7Ci0JICAgIGRvX2dldHRpbWVvZmRheSgma3R2KTsKLQkgICAgaWYgKHB1dF9jb21wYXRfdGltZXZhbCh0diwgJmt0dikpCi0JCSAgICByZXR1cm4gLUVGQVVMVDsKLSAgICB9Ci0gICAgaWYgKHR6KSB7Ci0JICAgIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotCSAgICBpZiAoY29weV90b191c2VyKHR6LCAmc3lzX3R6LCBzaXplb2Yoc3lzX3R6KSkpCi0JCSAgICByZXR1cm4gLUVGQVVMVDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWFzbWxpbmthZ2UgCi1pbnQgc3lzMzJfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlzdHJ1Y3QgdGltZXNwZWMga3RzOwotCXN0cnVjdCB0aW1lem9uZSBrdHo7Ci0KLSAJaWYgKHR2KSB7Ci0JCWlmIChnZXRfdHMzMigma3RzLCB0dikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Ci19Ci0KLWludCBjcF9jb21wYXRfc3RhdChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYpCi17Ci0JY29tcGF0X2lub190IGlubzsKLQlpbnQgZXJyOwotCi0JaWYgKHN0YXQtPnNpemUgPiBNQVhfTk9OX0xGUyB8fCAhbmV3X3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8Ci0JICAgICFuZXdfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWlubyA9IHN0YXQtPmlubzsKLQlpZiAoc2l6ZW9mKGlubykgPCBzaXplb2Yoc3RhdC0+aW5vKSAmJiBpbm8gIT0gc3RhdC0+aW5vKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWVyciAgPSBwdXRfdXNlcihuZXdfZW5jb2RlX2RldihzdGF0LT5kZXYpLCAmc3RhdGJ1Zi0+c3RfZGV2KTsKLQllcnIgfD0gcHV0X3VzZXIoaW5vLCAmc3RhdGJ1Zi0+c3RfaW5vKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+bW9kZSwgJnN0YXRidWYtPnN0X21vZGUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5ubGluaywgJnN0YXRidWYtPnN0X25saW5rKTsKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPnN0X3Jlc2VydmVkMSk7Ci0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5zdF9yZXNlcnZlZDIpOwotCWVyciB8PSBwdXRfdXNlcihuZXdfZW5jb2RlX2RldihzdGF0LT5yZGV2KSwgJnN0YXRidWYtPnN0X3JkZXYpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5zaXplLCAmc3RhdGJ1Zi0+c3Rfc2l6ZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPmF0aW1lLnR2X3NlYywgJnN0YXRidWYtPnN0X2F0aW1lKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YXRpbWUudHZfbnNlYywgJnN0YXRidWYtPnN0X2F0aW1lX25zZWMpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5tdGltZS50dl9zZWMsICZzdGF0YnVmLT5zdF9tdGltZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPm10aW1lLnR2X25zZWMsICZzdGF0YnVmLT5zdF9tdGltZV9uc2VjKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+Y3RpbWUudHZfc2VjLCAmc3RhdGJ1Zi0+c3RfY3RpbWUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5jdGltZS50dl9uc2VjLCAmc3RhdGJ1Zi0+c3RfY3RpbWVfbnNlYyk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPmJsa3NpemUsICZzdGF0YnVmLT5zdF9ibGtzaXplKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YmxvY2tzLCAmc3RhdGJ1Zi0+c3RfYmxvY2tzKTsKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPl9fdW51c2VkMSk7Ci0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDIpOwotCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+X191bnVzZWQzKTsKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPl9fdW51c2VkNCk7Ci0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDUpOwotCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+c3RfZnN0eXBlKTsgLyogbm90IGF2YWlsICovCi0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5zdF9yZWFsZGV2KTsgLyogbm90IGF2YWlsICovCi0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5zdF9iYXNlbW9kZSk7IC8qIG5vdCBhdmFpbCAqLwotCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+c3Rfc3BhcmVzaG9ydCk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPnVpZCwgJnN0YXRidWYtPnN0X3VpZCk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPmdpZCwgJnN0YXRidWYtPnN0X2dpZCk7Ci0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5zdF9zcGFyZTRbMF0pOwotCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+c3Rfc3BhcmU0WzFdKTsKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPnN0X3NwYXJlNFsyXSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiAvKioqIGNvcGllZCBmcm9tIG1pcHM2NCAqKiovCiAvKgogICogT29vLCBuYXN0eS4gIFdlIG5lZWQgaGVyZSB0byBmcm9iIDMyLWJpdCB1bnNpZ25lZCBsb25ncyB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggNmI1YWMzOC4uYzdlNTlmNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC0xNDksOCArMTQ5LDggQEAKIAlFTlRSWV9DT01QKGdldHJsaW1pdCkKIAlFTlRSWV9DT01QKGdldHJ1c2FnZSkKIAkvKiBzdHJ1Y3QgdGltZXZhbCBhbmQgdGltZXpvbmUgYXJlIG1heWJlPz8gY29uc2lzdGVudCB3aWRlIGFuZCBuYXJyb3cgKi8KLQlFTlRSWV9ESUZGKGdldHRpbWVvZmRheSkKLQlFTlRSWV9ESUZGKHNldHRpbWVvZmRheSkKKwlFTlRSWV9DT01QKGdldHRpbWVvZmRheSkKKwlFTlRSWV9DT01QKHNldHRpbWVvZmRheSkKIAlFTlRSWV9TQU1FKGdldGdyb3VwcykJCS8qIDgwICovCiAJRU5UUllfU0FNRShzZXRncm91cHMpCiAJLyogc3RydWN0IHNvY2tldGFkZHIuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNTg3ZGE1ZS4uMzgwYmFhMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTIyLDYgKzIyLDkgQEAKIGNvbmZpZyBQUENfTUVSR0UKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBBUkNIX1BIWVNfQUREUl9UXzY0QklUCisgICAgICAgZGVmX2Jvb2wgUFBDNjQgfHwgUEhZU182NEJJVAorCiBjb25maWcgTU1VCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtNDE1LDggKzQxOCwxMSBAQAogCiBjb25maWcgRk9SQ0VfTUFYX1pPTkVPUkRFUgogCWludCAiTWF4aW11bSB6b25lIG9yZGVyIgorCXJhbmdlIDkgNjQgaWYgUFBDXzY0S19QQUdFUwogCWRlZmF1bHQgIjkiIGlmIFBQQ182NEtfUEFHRVMKKwlyYW5nZSAxMyA2NCBpZiBQUEM2NCAmJiAhUFBDXzY0S19QQUdFUwogCWRlZmF1bHQgIjEzIiBpZiBQUEM2NCAmJiAhUFBDXzY0S19QQUdFUworCXJhbmdlIDExIDY0CiAJZGVmYXVsdCAiMTEiCiAJaGVscAogCSAgVGhlIGtlcm5lbCBtZW1vcnkgYWxsb2NhdG9yIGRpdmlkZXMgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeQpAQCAtODA2LDYgKzgxMiwxOSBAQAogZW5kbWVudQogCiBpZiBQUEM2NAorY29uZmlnIFJFTE9DQVRBQkxFCisJYm9vbCAiQnVpbGQgYSByZWxvY2F0YWJsZSBrZXJuZWwiCisJaGVscAorCSAgVGhpcyBidWlsZHMgYSBrZXJuZWwgaW1hZ2UgdGhhdCBpcyBjYXBhYmxlIG9mIHJ1bm5pbmcgYW55d2hlcmUKKwkgIGluIHRoZSBSTUEgKHJlYWwgbWVtb3J5IGFyZWEpIGF0IGFueSAxNmstYWxpZ25lZCBiYXNlIGFkZHJlc3MuCisJICBUaGUga2VybmVsIGlzIGxpbmtlZCBhcyBhIHBvc2l0aW9uLWluZGVwZW5kZW50IGV4ZWN1dGFibGUgKFBJRSkKKwkgIGFuZCBjb250YWlucyBkeW5hbWljIHJlbG9jYXRpb25zIHdoaWNoIGFyZSBwcm9jZXNzZWQgZWFybHkKKwkgIGluIHRoZSBib290dXAgcHJvY2Vzcy4KKworCSAgT25lIHVzZSBpcyBmb3IgdGhlIGtleGVjIG9uIHBhbmljIGNhc2Ugd2hlcmUgdGhlIHJlY292ZXJ5IGtlcm5lbAorCSAgbXVzdCBsaXZlIGF0IGEgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3MgdGhhbiB0aGUgcHJpbWFyeQorCSAga2VybmVsLgorCiBjb25maWcgUEFHRV9PRkZTRVQKIAloZXgKIAlkZWZhdWx0ICIweGMwMDAwMDAwMDAwMDAwMDAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCmluZGV4IDRlYmM1MmEuLjE1ZWIyNzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCkBAIC01MSw2ICs1MSwxMSBAQAogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBNU0lfQklUTUFQX1NFTEZURVNUCisJYm9vbCAiUnVuIHNlbGYtdGVzdHMgb2YgdGhlIE1TSSBiaXRtYXAgY29kZS4iCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZWZhdWx0IG4KKwogY29uZmlnIFhNT04KIAlib29sICJJbmNsdWRlIHhtb24ga2VybmVsIGRlYnVnZ2VyIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggYzZiZTE5ZS4uMjRkZDFhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtNjMsNyArNjMsOSBAQAogb3ZlcnJpZGUgQVIJOj0gR05VVEFSR0VUPWVsZiQoQ09ORklHX1dPUkRfU0laRSktcG93ZXJwYyAkKEFSKQogZW5kaWYKIAotTERGTEFHU192bWxpbnV4CTo9IC1Cc3RhdGljCitMREZMQUdTX3ZtbGludXgteXkgOj0gLUJzdGF0aWMKK0xERkxBR1Nfdm1saW51eC0kKENPTkZJR19QUEM2NCkkKENPTkZJR19SRUxPQ0FUQUJMRSkgOj0gLXBpZQorTERGTEFHU192bWxpbnV4CTo9ICQoTERGTEFHU192bWxpbnV4LXl5KQogCiBDRkxBR1MtJChDT05GSUdfUFBDNjQpCTo9IC1tbWluaW1hbC10b2MgLW10cmFjZWJhY2s9bm9uZSAgLW1jYWxsLWFpeGRlc2MKIENGTEFHUy0kKENPTkZJR19QUEMzMikJOj0gLWZmaXhlZC1yMiAtbW11bHRpcGxlCkBAIC0xMDIsNyArMTA0LDEwIEBACiBLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLW1uby1hbHRpdmVjKQogCiAjIE5vIFNQRSBpbnN0cnVjdGlvbiB3aGVuIGJ1aWxkaW5nIGtlcm5lbAorIyAoV2UgdXNlIGFsbCBhdmFpbGFibGUgb3B0aW9ucyB0byBoZWxwIHNlbWktYnJva2VuIGNvbXBpbGVycykKIEtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLXNwZSkKK0tCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXNwZT1ubykKK0tCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFiaT1uby1zcGUpCiAKICMgRW5hYmxlIHVuaXQtYXQtYS10aW1lIG1vZGUgd2hlbiBwb3NzaWJsZS4gSXQgc2hyaW5rcyB0aGUKICMga2VybmVsIGNvbnNpZGVyYWJseS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggMTQxNzRhYS4uYWFjMTQwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTQ5LDcgKzQ5LDcgQEAKIHpsaWJoZWFkZXIgOj0gaW5mZmFzdC5oIGluZmZpeGVkLmggaW5mbGF0ZS5oIGluZnRyZWVzLmggaW5mdXRpbC5oCiB6bGlibGludXhoZWFkZXIgOj0gemxpYi5oIHpjb25mLmggenV0aWwuaAogCi0kKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgZ3VuemlwX3V0aWwubyBtYWluLm8pOiBcCiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYikgY3Vib290LWMyay5vIGd1bnppcF91dGlsLm8gbWFpbi5vIHBycG1jMjgwMC5vKTogXAogCSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGlibGludXhoZWFkZXIpKSAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlcikpCiAKIHNyYy1saWJmZHQgOj0gZmR0LmMgZmR0X3JvLmMgZmR0X3dpcC5jIGZkdF9zdy5jIGZkdF9ydy5jIGZkdF9zdHJlcnJvci5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCi1pbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHkKK2ltYWdlLSQoQ09ORklHX1BQQ19IT0xMWSkJCSs9IGR0YkltYWdlLmhvbGx5CiBpbWFnZS0kKENPTkZJR19QUENfUFJQTUMyODAwKQkJKz0gZHRiSW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykJCSs9IHpJbWFnZS5pc2VyaWVzCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQpAQCAtMzEwLDggKzMxMCwxMSBAQAogJChvYmopL3ZtbGludXguc3RyaXA6IHZtbGludXgKIAkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCisjIFRoZSBpc2VyaWVzIGh5cGVydmlzb3Igd29uJ3QgdGFrZSBhbiBFVF9EWU4gZXhlY3V0YWJsZSwgc28gdGhpcworIyBjaGFuZ2VzIHRoZSB0eXBlIChieXRlIDE3KSBpbiB0aGUgZmlsZSB0byBFVF9FWEVDICgyKS4KICQob2JqKS96SW1hZ2UuaXNlcmllczogdm1saW51eAogCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACisJcHJpbnRmICJceDAyIiB8IGRkIG9mPSRAIGNvbnY9bm90cnVuYyBicz0xIHNlZWs9MTcKIAogJChvYmopL3VJbWFnZTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdWJvb3QpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9hZGRub3RlLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9hZGRub3RlLmMKaW5kZXggYjFlNTYxMS4uZGNjOWFiMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvYWRkbm90ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2FkZG5vdGUuYwpAQCAtMTEsNyArMTEsMTIgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiBVc2FnZTogYWRkbm90ZSB6SW1hZ2UKKyAqIFVzYWdlOiBhZGRub3RlIHpJbWFnZSBbbm90ZS5lbGZdCisgKgorICogSWYgbm90ZS5lbGYgaXMgc3VwcGxpZWQsIGl0IGlzIHRoZSBuYW1lIG9mIGFuIEVMRiBmaWxlIHRoYXQgY29udGFpbnMKKyAqIGFuIFJQQSBub3RlIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUuICBBbHRlcm5hdGl2ZWx5LCB0aGUKKyAqIG5vdGUuZWxmIGZpbGUgbWF5IGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZSBidWlsdC1pbiBSUEEgbm90ZSBpcworICogdXNlZCAodGhpcyBpcyB0byBzaW1wbGlmeSBob3cgdGhpcyBpcyBpbnZva2VkIGZyb20gdGhlIHdyYXBwZXIgc2NyaXB0KS4KICAqLwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC00MywyNyArNDgsMjkgQEAKICAqLwogI2RlZmluZSBOX1JQQV9ERVNDUgk4CiB1bnNpZ25lZCBpbnQgcnBhbm90ZVtOX1JQQV9ERVNDUl0gPSB7Ci0JMCwJCQkvKiBscGFyYWZmaW5pdHkgKi8KLQk2NCwJCQkvKiBtaW5fcm1vX3NpemUgKi8KKwkxLAkJCS8qIGxwYXJhZmZpbml0eSAqLworCTEyOCwJCQkvKiBtaW5fcm1vX3NpemUgKi8KIAkwLAkJCS8qIG1pbl9ybW9fcGVyY2VudCAqLwotCTQwLAkJCS8qIG1heF9wZnRfc2l6ZSAqLworCTQ2LAkJCS8qIG1heF9wZnRfc2l6ZSAqLwogCTEsCQkJLyogc3BscGFyICovCiAJLTEsCQkJLyogbWluX2xvYWQgKi8KLQkwLAkJCS8qIG5ld19tZW1fZGVmICovCi0JMSwJCQkvKiBpZ25vcmVfbXlfY2xpZW50X2NvbmZpZyAqLworCTEsCQkJLyogbmV3X21lbV9kZWYgKi8KKwkwLAkJCS8qIGlnbm9yZV9teV9jbGllbnRfY29uZmlnICovCiB9OwogCiAjZGVmaW5lIFJPVU5EVVAobGVuKQkoKChsZW4pICsgMykgJiB+MykKIAogdW5zaWduZWQgY2hhciBidWZbNTEyXTsKK3Vuc2lnbmVkIGNoYXIgbm90ZWJ1Zls1MTJdOwogCi0jZGVmaW5lIEdFVF8xNkJFKG9mZikJKChidWZbb2ZmXSA8PCA4KSArIChidWZbKG9mZikrMV0pKQotI2RlZmluZSBHRVRfMzJCRShvZmYpCSgoR0VUXzE2QkUob2ZmKSA8PCAxNikgKyBHRVRfMTZCRSgob2ZmKSsyKSkKKyNkZWZpbmUgR0VUXzE2QkUoYiwgb2ZmKQkoKChiKVtvZmZdIDw8IDgpICsgKChiKVsob2ZmKSsxXSkpCisjZGVmaW5lIEdFVF8zMkJFKGIsIG9mZikJKChHRVRfMTZCRSgoYiksIChvZmYpKSA8PCAxNikgKyBcCisJCQkJIEdFVF8xNkJFKChiKSwgKG9mZikrMikpCiAKLSNkZWZpbmUgUFVUXzE2QkUob2ZmLCB2KQkoYnVmW29mZl0gPSAoKHYpID4+IDgpICYgMHhmZiwgXAotCQkJCSBidWZbKG9mZikgKyAxXSA9ICh2KSAmIDB4ZmYpCi0jZGVmaW5lIFBVVF8zMkJFKG9mZiwgdikJKFBVVF8xNkJFKChvZmYpLCAodikgPj4gMTYpLCBcCi0JCQkJIFBVVF8xNkJFKChvZmYpICsgMiwgKHYpKSkKKyNkZWZpbmUgUFVUXzE2QkUoYiwgb2ZmLCB2KQkoKGIpW29mZl0gPSAoKHYpID4+IDgpICYgMHhmZiwgXAorCQkJCSAoYilbKG9mZikgKyAxXSA9ICh2KSAmIDB4ZmYpCisjZGVmaW5lIFBVVF8zMkJFKGIsIG9mZiwgdikJKFBVVF8xNkJFKChiKSwgKG9mZiksICh2KSA+PiAxNiksIFwKKwkJCQkgUFVUXzE2QkUoKGIpLCAob2ZmKSArIDIsICh2KSkpCiAKIC8qIFN0cnVjdHVyZSBvZiBhbiBFTEYgZmlsZSAqLwogI2RlZmluZSBFX0lERU5UCQkwCS8qIEVMRiBoZWFkZXIgKi8KQEAgLTg4LDE1ICs5NSw3MSBAQAogCiB1bnNpZ25lZCBjaGFyIGVsZl9tYWdpY1s0XSA9IHsgMHg3ZiwgJ0UnLCAnTCcsICdGJyB9OwogCit1bnNpZ25lZCBjaGFyICpyZWFkX3JwYW5vdGUoY29uc3QgY2hhciAqZm5hbWUsIGludCAqbm5wKQoreworCWludCBub3RlZmQsIG5yLCBpOworCWludCBwaCwgcHMsIG5wOworCWludCBub3RlLCBub3Rlc2l6ZTsKKworCW5vdGVmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKwlpZiAobm90ZWZkIDwgMCkgeworCQlwZXJyb3IoZm5hbWUpOworCQlleGl0KDEpOworCX0KKwluciA9IHJlYWQobm90ZWZkLCBub3RlYnVmLCBzaXplb2Yobm90ZWJ1ZikpOworCWlmIChuciA8IDApIHsKKwkJcGVycm9yKCJyZWFkIG5vdGUiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKG5yID09IDApCQkvKiBlbXB0eSBmaWxlICovCisJCXJldHVybiBOVUxMOworCWlmIChuciA8IEVfSFNJWkUgfHwKKwkgICAgbWVtY21wKCZub3RlYnVmW0VfSURFTlQrRUlfTUFHSUNdLCBlbGZfbWFnaWMsIDQpICE9IDAgfHwKKwkgICAgbm90ZWJ1ZltFX0lERU5UK0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyIHx8CisJICAgIG5vdGVidWZbRV9JREVOVCtFSV9EQVRBXSAhPSBFTEZEQVRBMk1TQikKKwkJZ290byBub3RlbGY7CisJY2xvc2Uobm90ZWZkKTsKKworCS8qIG5vdyBsb29rIGZvciB0aGUgUlBBLW5vdGUgKi8KKwlwaCA9IEdFVF8zMkJFKG5vdGVidWYsIEVfUEhPRkYpOworCXBzID0gR0VUXzE2QkUobm90ZWJ1ZiwgRV9QSEVOVFNJWkUpOworCW5wID0gR0VUXzE2QkUobm90ZWJ1ZiwgRV9QSE5VTSk7CisJaWYgKHBoIDwgRV9IU0laRSB8fCBwcyA8IFBIX0hTSVpFIHx8IG5wIDwgMSkKKwkJZ290byBub3RlbGY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnA7ICsraSwgcGggKz0gcHMpIHsKKwkJaWYgKEdFVF8zMkJFKG5vdGVidWYsIHBoICsgUEhfVFlQRSkgIT0gUFRfTk9URSkKKwkJCWNvbnRpbnVlOworCQlub3RlID0gR0VUXzMyQkUobm90ZWJ1ZiwgcGggKyBQSF9PRkZTRVQpOworCQlub3Rlc2l6ZSA9IEdFVF8zMkJFKG5vdGVidWYsIHBoICsgUEhfRklMRVNaKTsKKwkJaWYgKG5vdGVzaXplIDwgMzQgfHwgbm90ZSArIG5vdGVzaXplID4gbnIpCisJCQljb250aW51ZTsKKwkJaWYgKEdFVF8zMkJFKG5vdGVidWYsIG5vdGUpICE9IHN0cmxlbihycGFuYW1lKSArIDEgfHwKKwkJICAgIEdFVF8zMkJFKG5vdGVidWYsIG5vdGUgKyA4KSAhPSAweDEyNzU5OTk5IHx8CisJCSAgICBzdHJjbXAoKGNoYXIgKikmbm90ZWJ1Zltub3RlICsgMTJdLCBycGFuYW1lKSAhPSAwKQorCQkJY29udGludWU7CisJCS8qIGxvb2tzIGxpa2UgYW4gUlBBIG5vdGUsIHJldHVybiBpdCAqLworCQkqbm5wID0gbm90ZXNpemU7CisJCXJldHVybiAmbm90ZWJ1Zltub3RlXTsKKwl9CisJLyogbm8gUlBBIG5vdGUgZm91bmQgKi8KKwlyZXR1cm4gTlVMTDsKKworIG5vdGVsZjoKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIGlzIG5vdCBhIGJpZy1lbmRpYW4gMzItYml0IEVMRiBpbWFnZVxuIiwgZm5hbWUpOworCWV4aXQoMSk7Cit9CisKIGludAogbWFpbihpbnQgYWMsIGNoYXIgKiphdikKIHsKIAlpbnQgZmQsIG4sIGk7CiAJaW50IHBoLCBwcywgbnA7CiAJaW50IG5ub3RlLCBubm90ZTIsIG5zOworCXVuc2lnbmVkIGNoYXIgKnJwYXA7CiAKLQlpZiAoYWMgIT0gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBlbGYtZmlsZVxuIiwgYXZbMF0pOworCWlmIChhYyAhPSAyICYmIGFjICE9IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZWxmLWZpbGUgW3JwYW5vdGUuZWxmXVxuIiwgYXZbMF0pOwogCQlleGl0KDEpOwogCX0KIAlmZCA9IG9wZW4oYXZbMV0sIE9fUkRXUik7CkBAIC0xMDcsNiArMTcwLDcgQEAKIAogCW5ub3RlID0gMTIgKyBST1VORFVQKHN0cmxlbihhcmNoKSArIDEpICsgc2l6ZW9mKGRlc2NyKTsKIAlubm90ZTIgPSAxMiArIFJPVU5EVVAoc3RybGVuKHJwYW5hbWUpICsgMSkgKyBzaXplb2YocnBhbm90ZSk7CisJcnBhcCA9IE5VTEw7CiAKIAluID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKG4gPCAwKSB7CkBAIC0xMjQsMTYgKzE4OCwxOSBAQAogCQlleGl0KDEpOwogCX0KIAotCXBoID0gR0VUXzMyQkUoRV9QSE9GRik7Ci0JcHMgPSBHRVRfMTZCRShFX1BIRU5UU0laRSk7Ci0JbnAgPSBHRVRfMTZCRShFX1BITlVNKTsKKwlpZiAoYWMgPT0gMykKKwkJcnBhcCA9IHJlYWRfcnBhbm90ZShhdlsyXSwgJm5ub3RlMik7CisKKwlwaCA9IEdFVF8zMkJFKGJ1ZiwgRV9QSE9GRik7CisJcHMgPSBHRVRfMTZCRShidWYsIEVfUEhFTlRTSVpFKTsKKwlucCA9IEdFVF8xNkJFKGJ1ZiwgRV9QSE5VTSk7CiAJaWYgKHBoIDwgRV9IU0laRSB8fCBwcyA8IFBIX0hTSVpFIHx8IG5wIDwgMSkKIAkJZ290byBub3RlbGY7CiAJaWYgKHBoICsgKG5wICsgMikgKiBwcyArIG5ub3RlICsgbm5vdGUyID4gbikKIAkJZ290byBub3NwYWNlOwogCiAJZm9yIChpID0gMDsgaSA8IG5wOyArK2kpIHsKLQkJaWYgKEdFVF8zMkJFKHBoICsgUEhfVFlQRSkgPT0gUFRfTk9URSkgeworCQlpZiAoR0VUXzMyQkUoYnVmLCBwaCArIFBIX1RZUEUpID09IFBUX05PVEUpIHsKIAkJCWZwcmludGYoc3RkZXJyLCAiJXMgYWxyZWFkeSBoYXMgYSBub3RlIGVudHJ5XG4iLAogCQkJCWF2WzFdKTsKIAkJCWV4aXQoMCk7CkBAIC0xNDgsMzcgKzIxNSw0MiBAQAogCiAJLyogZmlsbCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KIAlucyA9IHBoICsgMiAqIHBzOwotCVBVVF8zMkJFKHBoICsgUEhfVFlQRSwgUFRfTk9URSk7Ci0JUFVUXzMyQkUocGggKyBQSF9PRkZTRVQsIG5zKTsKLQlQVVRfMzJCRShwaCArIFBIX0ZJTEVTWiwgbm5vdGUpOworCVBVVF8zMkJFKGJ1ZiwgcGggKyBQSF9UWVBFLCBQVF9OT1RFKTsKKwlQVVRfMzJCRShidWYsIHBoICsgUEhfT0ZGU0VULCBucyk7CisJUFVUXzMyQkUoYnVmLCBwaCArIFBIX0ZJTEVTWiwgbm5vdGUpOwogCiAJLyogZmlsbCBpbiB0aGUgbm90ZSBhcmVhIHdlIHBvaW50IHRvICovCiAJLyogWFhYIHdlIHNob3VsZCBwcm9iYWJseSBtYWtlIHRoaXMgYSBwcm9wZXIgc2VjdGlvbiAqLwotCVBVVF8zMkJFKG5zLCBzdHJsZW4oYXJjaCkgKyAxKTsKLQlQVVRfMzJCRShucyArIDQsIE5fREVTQ1IgKiA0KTsKLQlQVVRfMzJCRShucyArIDgsIDB4MTI3NSk7CisJUFVUXzMyQkUoYnVmLCBucywgc3RybGVuKGFyY2gpICsgMSk7CisJUFVUXzMyQkUoYnVmLCBucyArIDQsIE5fREVTQ1IgKiA0KTsKKwlQVVRfMzJCRShidWYsIG5zICsgOCwgMHgxMjc1KTsKIAlzdHJjcHkoKGNoYXIgKikgJmJ1ZltucyArIDEyXSwgYXJjaCk7CiAJbnMgKz0gMTIgKyBzdHJsZW4oYXJjaCkgKyAxOwogCWZvciAoaSA9IDA7IGkgPCBOX0RFU0NSOyArK2ksIG5zICs9IDQpCi0JCVBVVF8zMkJFKG5zLCBkZXNjcltpXSk7CisJCVBVVF8zMkJFKGJ1ZiwgbnMsIGRlc2NyW2ldKTsKIAogCS8qIGZpbGwgaW4gdGhlIHNlY29uZCBwcm9ncmFtIGhlYWRlciBlbnRyeSBhbmQgdGhlIFJQQSBub3RlIGFyZWEgKi8KIAlwaCArPSBwczsKLQlQVVRfMzJCRShwaCArIFBIX1RZUEUsIFBUX05PVEUpOwotCVBVVF8zMkJFKHBoICsgUEhfT0ZGU0VULCBucyk7Ci0JUFVUXzMyQkUocGggKyBQSF9GSUxFU1osIG5ub3RlMik7CisJUFVUXzMyQkUoYnVmLCBwaCArIFBIX1RZUEUsIFBUX05PVEUpOworCVBVVF8zMkJFKGJ1ZiwgcGggKyBQSF9PRkZTRVQsIG5zKTsKKwlQVVRfMzJCRShidWYsIHBoICsgUEhfRklMRVNaLCBubm90ZTIpOwogCiAJLyogZmlsbCBpbiB0aGUgbm90ZSBhcmVhIHdlIHBvaW50IHRvICovCi0JUFVUXzMyQkUobnMsIHN0cmxlbihycGFuYW1lKSArIDEpOwotCVBVVF8zMkJFKG5zICsgNCwgc2l6ZW9mKHJwYW5vdGUpKTsKLQlQVVRfMzJCRShucyArIDgsIDB4MTI3NTk5OTkpOwotCXN0cmNweSgoY2hhciAqKSAmYnVmW25zICsgMTJdLCBycGFuYW1lKTsKLQlucyArPSAxMiArIFJPVU5EVVAoc3RybGVuKHJwYW5hbWUpICsgMSk7Ci0JZm9yIChpID0gMDsgaSA8IE5fUlBBX0RFU0NSOyArK2ksIG5zICs9IDQpCi0JCVBVVF8zMkJFKG5zLCBycGFub3RlW2ldKTsKKwlpZiAocnBhcCkgeworCQkvKiBSUEEgbm90ZSBzdXBwbGllZCBpbiBmaWxlLCBqdXN0IGNvcHkgdGhlIHdob2xlIHRoaW5nIG92ZXIgKi8KKwkJbWVtY3B5KGJ1ZiArIG5zLCBycGFwLCBubm90ZTIpOworCX0gZWxzZSB7CisJCVBVVF8zMkJFKGJ1ZiwgbnMsIHN0cmxlbihycGFuYW1lKSArIDEpOworCQlQVVRfMzJCRShidWYsIG5zICsgNCwgc2l6ZW9mKHJwYW5vdGUpKTsKKwkJUFVUXzMyQkUoYnVmLCBucyArIDgsIDB4MTI3NTk5OTkpOworCQlzdHJjcHkoKGNoYXIgKikgJmJ1ZltucyArIDEyXSwgcnBhbmFtZSk7CisJCW5zICs9IDEyICsgUk9VTkRVUChzdHJsZW4ocnBhbmFtZSkgKyAxKTsKKwkJZm9yIChpID0gMDsgaSA8IE5fUlBBX0RFU0NSOyArK2ksIG5zICs9IDQpCisJCQlQVVRfMzJCRShidWYsIG5zLCBycGFub3RlW2ldKTsKKwl9CiAKIAkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KLQlQVVRfMTZCRShFX1BITlVNLCBucCArIDIpOworCVBVVF8xNkJFKGJ1ZiwgRV9QSE5VTSwgbnAgKyAyKTsKIAogCS8qIHdyaXRlIGJhY2sgKi8KIAlsc2VlayhmZCwgKGxvbmcpIDAsIFNFRUtfU0VUKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvTWFrZWZpbGUuZHRjIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9NYWtlZmlsZS5kdGMKaW5kZXggZDYwN2ZkYi4uNmRkZjllYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9NYWtlZmlsZS5kdGMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9NYWtlZmlsZS5kdGMKQEAgLTUsMjEgKzUsNSBAQAogIwogRFRDX1NSQ1MgPSBkdGMuYyBmbGF0dHJlZS5jIGZzdHJlZS5jIGRhdGEuYyBsaXZldHJlZS5jIHRyZWVzb3VyY2UuYyBzcmNwb3MuYyBcCiAJY2hlY2tzLmMKLURUQ19FWFRSQSA9IGR0Yy5oIHNyY3Bvcy5oCi1EVENfTEVYRklMRVMgPSBkdGMtbGV4ZXIubAotRFRDX0JJU09ORklMRVMgPSBkdGMtcGFyc2VyLnkKLQotRFRDX0xFWF9TUkNTID0gJChEVENfTEVYRklMRVM6JS5sPSUubGV4LmMpCi1EVENfQklTT05fU1JDUyA9ICQoRFRDX0JJU09ORklMRVM6JS55PSUudGFiLmMpCi1EVENfQklTT05fSU5DTFVERVMgPSAkKERUQ19CSVNPTkZJTEVTOiUueT0lLnRhYi5oKQotCi1EVENfR0VOX1NSQ1MgPSAkKERUQ19MRVhfU1JDUykgJChEVENfQklTT05fU1JDUykKLURUQ19HRU5fQUxMID0gJChEVENfR0VOX1NSQ1MpICQoRFRDX0JJU09OX0lOQ0xVREVTKQorRFRDX0dFTl9TUkNTID0gZHRjLWxleGVyLmxleC5jIGR0Yy1wYXJzZXIudGFiLmMKIERUQ19PQkpTID0gJChEVENfU1JDUzolLmM9JS5vKSAkKERUQ19HRU5fU1JDUzolLmM9JS5vKQotCi1EVENfQ0xFQU5GSUxFUyA9ICQoRFRDX0dFTl9BTEwpCi0KLSMgV2UgYXNzdW1lIHRoZSBjb250YWluaW5nIE1ha2VmaWxlIHN5c3RlbSBjYW4gZG8gYXV0by1kZXBlbmRlbmNpZXMgZm9yIG1vc3QKLSMgdGhpbmdzLCBidXQgd2Ugc3VwcGx5IHRoZSBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGhlYWRlciBmaWxlcyBleHBsaWNpdGx5Ci0KLSQoYWRkcHJlZml4ICQoRFRDX29iamRpcikvLCQoRFRDX0dFTl9TUkNTOiUuYz0lLm8pKTogJChhZGRwcmVmaXggJChEVENfb2JqZGlyKS8sJChEVENfQklTT05fSU5DTFVERVMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9jaGVja3MuYyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvY2hlY2tzLmMKaW5kZXggMmNlOTYxYy4uOTU0ODU3OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9jaGVja3MuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2NoZWNrcy5jCkBAIC0yNDIsNiArMjQyLDQyIEBACiB9CiBOT0RFX0NIRUNLKGR1cGxpY2F0ZV9wcm9wZXJ0eV9uYW1lcywgTlVMTCwgRVJST1IpOwogCisjZGVmaW5lIExPV0VSQ0FTRQkiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisjZGVmaW5lIFVQUEVSQ0FTRQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisjZGVmaW5lIERJR0lUUwkJIjAxMjM0NTY3ODkiCisjZGVmaW5lIFBST1BOT0RFQ0hBUlMJTE9XRVJDQVNFIFVQUEVSQ0FTRSBESUdJVFMgIiwuXysqIz8tIgorCitzdGF0aWMgdm9pZCBjaGVja19ub2RlX25hbWVfY2hhcnMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCisJCQkJICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlpbnQgbiA9IHN0cnNwbihub2RlLT5uYW1lLCBjLT5kYXRhKTsKKworCWlmIChuIDwgc3RybGVuKG5vZGUtPm5hbWUpKQorCQlGQUlMKGMsICJCYWQgY2hhcmFjdGVyICclYycgaW4gbm9kZSAlcyIsCisJCSAgICAgbm9kZS0+bmFtZVtuXSwgbm9kZS0+ZnVsbHBhdGgpOworfQorTk9ERV9DSEVDSyhub2RlX25hbWVfY2hhcnMsIFBST1BOT0RFQ0hBUlMgIkAiLCBFUlJPUik7CisKK3N0YXRpYyB2b2lkIGNoZWNrX25vZGVfbmFtZV9mb3JtYXQoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCisJCQkJICAgc3RydWN0IG5vZGUgKm5vZGUpCit7CisJaWYgKHN0cmNocihnZXRfdW5pdG5hbWUobm9kZSksICdAJykpCisJCUZBSUwoYywgIk5vZGUgJXMgaGFzIG11bHRpcGxlICdAJyBjaGFyYWN0ZXJzIGluIG5hbWUiLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoKTsKK30KK05PREVfQ0hFQ0sobm9kZV9uYW1lX2Zvcm1hdCwgTlVMTCwgRVJST1IsICZub2RlX25hbWVfY2hhcnMpOworCitzdGF0aWMgdm9pZCBjaGVja19wcm9wZXJ0eV9uYW1lX2NoYXJzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKmR0LAorCQkJCSAgICAgIHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJaW50IG4gPSBzdHJzcG4ocHJvcC0+bmFtZSwgYy0+ZGF0YSk7CisKKwlpZiAobiA8IHN0cmxlbihwcm9wLT5uYW1lKSkKKwkJRkFJTChjLCAiQmFkIGNoYXJhY3RlciAnJWMnIGluIHByb3BlcnR5IG5hbWUgXCIlc1wiLCBub2RlICVzIiwKKwkJICAgICBwcm9wLT5uYW1lW25dLCBwcm9wLT5uYW1lLCBub2RlLT5mdWxscGF0aCk7Cit9CitQUk9QX0NIRUNLKHByb3BlcnR5X25hbWVfY2hhcnMsIFBST1BOT0RFQ0hBUlMsIEVSUk9SKTsKKwogc3RhdGljIHZvaWQgY2hlY2tfZXhwbGljaXRfcGhhbmRsZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqcm9vdCwKIAkJCQkJICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKIHsKQEAgLTI4MCwxNiArMzE2LDI5IEBACiBzdGF0aWMgdm9pZCBjaGVja19uYW1lX3Byb3BlcnRpZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqcm9vdCwKIAkJCQkgIHN0cnVjdCBub2RlICpub2RlKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcCwgKnByb3AgPSBOVUxMOwogCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShub2RlLCAibmFtZSIpOworCWZvciAocHAgPSAmbm9kZS0+cHJvcGxpc3Q7ICpwcDsgcHAgPSAmKCgqcHApLT5uZXh0KSkKKwkJaWYgKHN0cmVxKCgqcHApLT5uYW1lLCAibmFtZSIpKSB7CisJCQlwcm9wID0gKnBwOworCQkJYnJlYWs7CisJCX0KKwogCWlmICghcHJvcCkKIAkJcmV0dXJuOyAvKiBObyBuYW1lIHByb3BlcnR5LCB0aGF0J3MgZmluZSAqLwogCiAJaWYgKChwcm9wLT52YWwubGVuICE9IG5vZGUtPmJhc2VuYW1lbGVuKzEpCi0JICAgIHx8IChtZW1jbXAocHJvcC0+dmFsLnZhbCwgbm9kZS0+bmFtZSwgbm9kZS0+YmFzZW5hbWVsZW4pICE9IDApKQorCSAgICB8fCAobWVtY21wKHByb3AtPnZhbC52YWwsIG5vZGUtPm5hbWUsIG5vZGUtPmJhc2VuYW1lbGVuKSAhPSAwKSkgewogCQlGQUlMKGMsICJcIm5hbWVcIiBwcm9wZXJ0eSBpbiAlcyBpcyBpbmNvcnJlY3QgKFwiJXNcIiBpbnN0ZWFkIgogCQkgICAgICIgb2YgYmFzZSBub2RlIG5hbWUpIiwgbm9kZS0+ZnVsbHBhdGgsIHByb3AtPnZhbC52YWwpOworCX0gZWxzZSB7CisJCS8qIFRoZSBuYW1lIHByb3BlcnR5IGlzIGNvcnJlY3QsIGFuZCB0aGVyZWZvcmUgcmVkdW5kYW50LgorCQkgKiBEZWxldGUgaXQgKi8KKwkJKnBwID0gcHJvcC0+bmV4dDsKKwkJZnJlZShwcm9wLT5uYW1lKTsKKwkJZGF0YV9mcmVlKHByb3AtPnZhbCk7CisJCWZyZWUocHJvcCk7CisJfQogfQogQ0hFQ0tfSVNfU1RSSU5HKG5hbWVfaXNfc3RyaW5nLCAibmFtZSIsIEVSUk9SKTsKIE5PREVfQ0hFQ0sobmFtZV9wcm9wZXJ0aWVzLCBOVUxMLCBFUlJPUiwgJm5hbWVfaXNfc3RyaW5nKTsKQEAgLTMwMSwyMyArMzUwLDIzIEBACiBzdGF0aWMgdm9pZCBmaXh1cF9waGFuZGxlX3JlZmVyZW5jZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCiAJCQkJICAgICBzdHJ1Y3Qgbm9kZSAqbm9kZSwgc3RydWN0IHByb3BlcnR5ICpwcm9wKQogewotICAgICAgc3RydWN0IG1hcmtlciAqbSA9IHByb3AtPnZhbC5tYXJrZXJzOwotICAgICAgc3RydWN0IG5vZGUgKnJlZm5vZGU7Ci0gICAgICBjZWxsX3QgcGhhbmRsZTsKKwlzdHJ1Y3QgbWFya2VyICptID0gcHJvcC0+dmFsLm1hcmtlcnM7CisJc3RydWN0IG5vZGUgKnJlZm5vZGU7CisJY2VsbF90IHBoYW5kbGU7CiAKLSAgICAgIGZvcl9lYWNoX21hcmtlcl9vZl90eXBlKG0sIFJFRl9QSEFORExFKSB7Ci0JICAgICAgYXNzZXJ0KG0tPm9mZnNldCArIHNpemVvZihjZWxsX3QpIDw9IHByb3AtPnZhbC5sZW4pOworCWZvcl9lYWNoX21hcmtlcl9vZl90eXBlKG0sIFJFRl9QSEFORExFKSB7CisJCWFzc2VydChtLT5vZmZzZXQgKyBzaXplb2YoY2VsbF90KSA8PSBwcm9wLT52YWwubGVuKTsKIAotCSAgICAgIHJlZm5vZGUgPSBnZXRfbm9kZV9ieV9yZWYoZHQsIG0tPnJlZik7Ci0JICAgICAgaWYgKCEgcmVmbm9kZSkgewotCQkgICAgICBGQUlMKGMsICJSZWZlcmVuY2UgdG8gbm9uLWV4aXN0ZW50IG5vZGUgb3IgbGFiZWwgXCIlc1wiXG4iLAotCQkJICAgbS0+cmVmKTsKLQkJICAgICAgY29udGludWU7Ci0JICAgICAgfQorCQlyZWZub2RlID0gZ2V0X25vZGVfYnlfcmVmKGR0LCBtLT5yZWYpOworCQlpZiAoISByZWZub2RlKSB7CisJCQlGQUlMKGMsICJSZWZlcmVuY2UgdG8gbm9uLWV4aXN0ZW50IG5vZGUgb3IgbGFiZWwgXCIlc1wiXG4iLAorCQkJICAgICBtLT5yZWYpOworCQkJY29udGludWU7CisJCX0KIAotCSAgICAgIHBoYW5kbGUgPSBnZXRfbm9kZV9waGFuZGxlKGR0LCByZWZub2RlKTsKLQkgICAgICAqKChjZWxsX3QgKikocHJvcC0+dmFsLnZhbCArIG0tPm9mZnNldCkpID0gY3B1X3RvX2JlMzIocGhhbmRsZSk7Ci0gICAgICB9CisJCXBoYW5kbGUgPSBnZXRfbm9kZV9waGFuZGxlKGR0LCByZWZub2RlKTsKKwkJKigoY2VsbF90ICopKHByb3AtPnZhbC52YWwgKyBtLT5vZmZzZXQpKSA9IGNwdV90b19mZHQzMihwaGFuZGxlKTsKKwl9CiB9CiBDSEVDSyhwaGFuZGxlX3JlZmVyZW5jZXMsIE5VTEwsIE5VTEwsIGZpeHVwX3BoYW5kbGVfcmVmZXJlbmNlcywgTlVMTCwgRVJST1IsCiAgICAgICAmZHVwbGljYXRlX25vZGVfbmFtZXMsICZleHBsaWNpdF9waGFuZGxlcyk7CkBAIC00OTgsNiArNTQ3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjaGVjayAqY2hlY2tfdGFibGVbXSA9IHsKIAkmZHVwbGljYXRlX25vZGVfbmFtZXMsICZkdXBsaWNhdGVfcHJvcGVydHlfbmFtZXMsCisJJm5vZGVfbmFtZV9jaGFycywgJm5vZGVfbmFtZV9mb3JtYXQsICZwcm9wZXJ0eV9uYW1lX2NoYXJzLAogCSZuYW1lX2lzX3N0cmluZywgJm5hbWVfcHJvcGVydGllcywKIAkmZXhwbGljaXRfcGhhbmRsZXMsCiAJJnBoYW5kbGVfcmVmZXJlbmNlcywgJnBhdGhfcmVmZXJlbmNlcywKQEAgLTUxMSwxMCArNTYxLDcgQEAKIAkmb2Jzb2xldGVfY2hvc2VuX2ludGVycnVwdF9jb250cm9sbGVyLAogfTsKIAotaW50IGNoZWNrX3NlbWFudGljcyhzdHJ1Y3Qgbm9kZSAqZHQsIGludCBvdXR2ZXJzaW9uLCBpbnQgYm9vdF9jcHVpZF9waHlzKTsKLQotdm9pZCBwcm9jZXNzX2NoZWNrcyhpbnQgZm9yY2UsIHN0cnVjdCBib290X2luZm8gKmJpLAotCQkgICAgaW50IGNoZWNrZmxhZywgaW50IG91dHZlcnNpb24sIGludCBib290X2NwdWlkX3BoeXMpCit2b2lkIHByb2Nlc3NfY2hlY2tzKGludCBmb3JjZSwgc3RydWN0IGJvb3RfaW5mbyAqYmkpCiB7CiAJc3RydWN0IG5vZGUgKmR0ID0gYmktPmR0OwogCWludCBpOwpAQCAtNTM3LDIxNCArNTg0LDQgQEAKIAkJCQkib3V0cHV0IGZvcmNlZFxuIik7CiAJCX0KIAl9Ci0KLQlpZiAoY2hlY2tmbGFnKSB7Ci0JCWlmIChlcnJvcikgewotCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBTa2lwcGluZyBzZW1hbnRpYyBjaGVja3MgZHVlIHRvIHN0cnVjdHVyYWwgZXJyb3JzXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghY2hlY2tfc2VtYW50aWNzKGJpLT5kdCwgb3V0dmVyc2lvbiwKLQkJCQkJICAgICBib290X2NwdWlkX3BoeXMpKQotCQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogSW5wdXQgdHJlZSBoYXMgc2VtYW50aWMgZXJyb3JzXG4iKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFNlbWFudGljIGNoZWNrIGZ1bmN0aW9ucwotICovCi0KLSNkZWZpbmUgRVJSTVNHKC4uLikgaWYgKHF1aWV0IDwgMikgZnByaW50ZihzdGRlcnIsICJFUlJPUjogIiBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgV0FSTk1TRyguLi4pIGlmIChxdWlldCA8IDEpIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogIiBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBET19FUlIoLi4uKSBkbyB7RVJSTVNHKF9fVkFfQVJHU19fKTsgb2sgPSAwOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIENIRUNLX0hBVkUobm9kZSwgcHJvcG5hbWUpIFwKLQlkbyB7IFwKLQkJaWYgKCEgKHByb3AgPSBnZXRfcHJvcGVydHkoKG5vZGUpLCAocHJvcG5hbWUpKSkpIFwKLQkJCURPX0VSUigiTWlzc2luZyBcIiVzXCIgcHJvcGVydHkgaW4gJXNcbiIsIChwcm9wbmFtZSksIFwKLQkJCQkobm9kZSktPmZ1bGxwYXRoKTsgXAotCX0gd2hpbGUgKDApOwotCi0jZGVmaW5lIENIRUNLX0hBVkVfV0FSTihub2RlLCBwcm9wbmFtZSkgXAotCWRvIHsgXAotCQlpZiAoISAocHJvcCAgPSBnZXRfcHJvcGVydHkoKG5vZGUpLCAocHJvcG5hbWUpKSkpIFwKLQkJCVdBUk5NU0coIiVzIGhhcyBubyBcIiVzXCIgcHJvcGVydHlcbiIsIFwKLQkJCQkobm9kZSktPmZ1bGxwYXRoLCAocHJvcG5hbWUpKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0hFQ0tfSEFWRV9TVFJJTkcobm9kZSwgcHJvcG5hbWUpIFwKLQlkbyB7IFwKLQkJQ0hFQ0tfSEFWRSgobm9kZSksIChwcm9wbmFtZSkpOyBcCi0JCWlmIChwcm9wICYmICFkYXRhX2lzX29uZV9zdHJpbmcocHJvcC0+dmFsKSkgXAotCQkJRE9fRVJSKCJcIiVzXCIgcHJvcGVydHkgaW4gJXMgaXMgbm90IGEgc3RyaW5nXG4iLCBcCi0JCQkJKHByb3BuYW1lKSwgKG5vZGUpLT5mdWxscGF0aCk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIENIRUNLX0hBVkVfU1RSRVEobm9kZSwgcHJvcG5hbWUsIHZhbHVlKSBcCi0JZG8geyBcCi0JCUNIRUNLX0hBVkVfU1RSSU5HKChub2RlKSwgKHByb3BuYW1lKSk7IFwKLQkJaWYgKHByb3AgJiYgIXN0cmVxKHByb3AtPnZhbC52YWwsICh2YWx1ZSkpKSBcCi0JCQlET19FUlIoIiVzIGhhcyB3cm9uZyAlcywgJXMgKHNob3VsZCBiZSAlc1xuIiwgXAotCQkJCShub2RlKS0+ZnVsbHBhdGgsIChwcm9wbmFtZSksIFwKLQkJCQlwcm9wLT52YWwudmFsLCAodmFsdWUpKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0hFQ0tfSEFWRV9PTkVDRUxMKG5vZGUsIHByb3BuYW1lKSBcCi0JZG8geyBcCi0JCUNIRUNLX0hBVkUoKG5vZGUpLCAocHJvcG5hbWUpKTsgXAotCQlpZiAocHJvcCAmJiAocHJvcC0+dmFsLmxlbiAhPSBzaXplb2YoY2VsbF90KSkpIFwKLQkJCURPX0VSUigiXCIlc1wiIHByb3BlcnR5IGluICVzIGhhcyB3cm9uZyBzaXplICVkIChzaG91bGQgYmUgMSBjZWxsKVxuIiwgKHByb3BuYW1lKSwgKG5vZGUpLT5mdWxscGF0aCwgcHJvcC0+dmFsLmxlbik7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIENIRUNLX0hBVkVfV0FSTl9PTkVDRUxMKG5vZGUsIHByb3BuYW1lKSBcCi0JZG8geyBcCi0JCUNIRUNLX0hBVkVfV0FSTigobm9kZSksIChwcm9wbmFtZSkpOyBcCi0JCWlmIChwcm9wICYmIChwcm9wLT52YWwubGVuICE9IHNpemVvZihjZWxsX3QpKSkgXAotCQkJRE9fRVJSKCJcIiVzXCIgcHJvcGVydHkgaW4gJXMgaGFzIHdyb25nIHNpemUgJWQgKHNob3VsZCBiZSAxIGNlbGwpXG4iLCAocHJvcG5hbWUpLCAobm9kZSktPmZ1bGxwYXRoLCBwcm9wLT52YWwubGVuKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0hFQ0tfSEFWRV9XQVJOX1BIQU5ETEUoeG5vZGUsIHByb3BuYW1lLCByb290KSBcCi0JZG8geyBcCi0JCXN0cnVjdCBub2RlICpyZWY7IFwKLQkJQ0hFQ0tfSEFWRV9XQVJOX09ORUNFTEwoKHhub2RlKSwgKHByb3BuYW1lKSk7IFwKLQkJaWYgKHByb3ApIHtcCi0JCQljZWxsX3QgcGhhbmRsZSA9IHByb3B2YWxfY2VsbChwcm9wKTsgXAotCQkJaWYgKChwaGFuZGxlID09IDApIHx8IChwaGFuZGxlID09IC0xKSkgeyBcCi0JCQkJRE9fRVJSKCJcIiVzXCIgcHJvcGVydHkgaW4gJXMgY29udGFpbnMgYW4gaW52YWxpZCBwaGFuZGxlICV4XG4iLCAocHJvcG5hbWUpLCAoeG5vZGUpLT5mdWxscGF0aCwgcGhhbmRsZSk7IFwKLQkJCX0gZWxzZSB7IFwKLQkJCQlyZWYgPSBnZXRfbm9kZV9ieV9waGFuZGxlKChyb290KSwgcHJvcHZhbF9jZWxsKHByb3ApKTsgXAotCQkJCWlmICghIHJlZikgXAotCQkJCQlET19FUlIoIlwiJXNcIiBwcm9wZXJ0eSBpbiAlcyByZWZlcnMgdG8gbm9uLWV4aXN0YW50IHBoYW5kbGUgJXhcbiIsIChwcm9wbmFtZSksICh4bm9kZSktPmZ1bGxwYXRoLCBwcm9wdmFsX2NlbGwocHJvcCkpOyBcCi0JCQl9IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSEVDS19IQVZFX1dBUk5fU1RSSU5HKG5vZGUsIHByb3BuYW1lKSBcCi0JZG8geyBcCi0JCUNIRUNLX0hBVkVfV0FSTigobm9kZSksIChwcm9wbmFtZSkpOyBcCi0JCWlmIChwcm9wICYmICFkYXRhX2lzX29uZV9zdHJpbmcocHJvcC0+dmFsKSkgXAotCQkJRE9fRVJSKCJcIiVzXCIgcHJvcGVydHkgaW4gJXMgaXMgbm90IGEgc3RyaW5nXG4iLCBcCi0JCQkJKHByb3BuYW1lKSwgKG5vZGUpLT5mdWxscGF0aCk7IFwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgaW50IGNoZWNrX3Jvb3Qoc3RydWN0IG5vZGUgKnJvb3QpCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCWludCBvayA9IDE7Ci0KLQlDSEVDS19IQVZFX1NUUklORyhyb290LCAibW9kZWwiKTsKLQlDSEVDS19IQVZFX1dBUk4ocm9vdCwgImNvbXBhdGlibGUiKTsKLQotCXJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBjaGVja19jcHVzKHN0cnVjdCBub2RlICpyb290LCBpbnQgb3V0dmVyc2lvbiwgaW50IGJvb3RfY3B1aWRfcGh5cykKLXsKLQlzdHJ1Y3Qgbm9kZSAqY3B1cywgKmNwdTsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0Jc3RydWN0IG5vZGUgKmJvb3RjcHUgPSBOVUxMOwotCWludCBvayA9IDE7Ci0KLQljcHVzID0gZ2V0X3N1Ym5vZGUocm9vdCwgImNwdXMiKTsKLQlpZiAoISBjcHVzKSB7Ci0JCUVSUk1TRygiTWlzc2luZyAvY3B1cyBub2RlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNwdXMtPmFkZHJfY2VsbHMgIT0gMSkKLQkJRE9fRVJSKCIlcyBoYXMgYmFkICNhZGRyZXNzLWNlbGxzIHZhbHVlICVkIChzaG91bGQgYmUgMSlcbiIsCi0JCSAgICAgICBjcHVzLT5mdWxscGF0aCwgY3B1cy0+YWRkcl9jZWxscyk7Ci0JaWYgKGNwdXMtPnNpemVfY2VsbHMgIT0gMCkKLQkJRE9fRVJSKCIlcyBoYXMgYmFkICNzaXplLWNlbGxzIHZhbHVlICVkIChzaG91bGQgYmUgMClcbiIsCi0JCSAgICAgICBjcHVzLT5mdWxscGF0aCwgY3B1cy0+c2l6ZV9jZWxscyk7Ci0KLQlmb3JfZWFjaF9jaGlsZChjcHVzLCBjcHUpIHsKLQkJQ0hFQ0tfSEFWRV9TVFJFUShjcHUsICJkZXZpY2VfdHlwZSIsICJjcHUiKTsKLQotCQlDSEVDS19IQVZFX09ORUNFTEwoY3B1LCAicmVnIik7Ci0JCWlmIChwcm9wKSB7Ci0JCQljZWxsX3QgdW5pdG51bTsKLQkJCWNoYXIgKmVwdHI7Ci0KLQkJCXVuaXRudW0gPSBzdHJ0b2woZ2V0X3VuaXRuYW1lKGNwdSksICZlcHRyLCAxNik7Ci0JCQlpZiAoKmVwdHIpIHsKLQkJCQlXQVJOTVNHKCIlcyBoYXMgYmFkIGZvcm1hdCB1bml0IG5hbWUgJXMgKHNob3VsZCBiZSBDUFUgbnVtYmVyXG4iLAotCQkJCQljcHUtPmZ1bGxwYXRoLCBnZXRfdW5pdG5hbWUoY3B1KSk7Ci0JCQl9IGVsc2UgaWYgKHVuaXRudW0gIT0gcHJvcHZhbF9jZWxsKHByb3ApKSB7Ci0JCQkJV0FSTk1TRygiJXMgdW5pdCBuYW1lIFwiJXNcIiBkb2VzIG5vdCBtYXRjaCBcInJlZ1wiIHByb3BlcnR5IDwleD5cbiIsCi0JCQkJICAgICAgIGNwdS0+ZnVsbHBhdGgsIGdldF91bml0bmFtZShjcHUpLAotCQkJCSAgICAgICBwcm9wdmFsX2NlbGwocHJvcCkpOwotCQkJfQotCQl9Ci0KLS8qIAkJQ0hFQ0tfSEFWRV9PTkVDRUxMKGNwdSwgImQtY2FjaGUtbGluZS1zaXplIik7ICovCi0vKiAJCUNIRUNLX0hBVkVfT05FQ0VMTChjcHUsICJpLWNhY2hlLWxpbmUtc2l6ZSIpOyAqLwotCQlDSEVDS19IQVZFX09ORUNFTEwoY3B1LCAiZC1jYWNoZS1zaXplIik7Ci0JCUNIRUNLX0hBVkVfT05FQ0VMTChjcHUsICJpLWNhY2hlLXNpemUiKTsKLQotCQlDSEVDS19IQVZFX1dBUk5fT05FQ0VMTChjcHUsICJjbG9jay1mcmVxdWVuY3kiKTsKLQkJQ0hFQ0tfSEFWRV9XQVJOX09ORUNFTEwoY3B1LCAidGltZWJhc2UtZnJlcXVlbmN5Iik7Ci0KLQkJcHJvcCA9IGdldF9wcm9wZXJ0eShjcHUsICJsaW51eCxib290LWNwdSIpOwotCQlpZiAocHJvcCkgewotCQkJaWYgKHByb3AtPnZhbC5sZW4pCi0JCQkJV0FSTk1TRygiXCJsaW51eCxib290LWNwdVwiIHByb3BlcnR5IGluICVzIGlzIG5vbi1lbXB0eVxuIiwKLQkJCQkJY3B1LT5mdWxscGF0aCk7Ci0JCQlpZiAoYm9vdGNwdSkKLQkJCQlET19FUlIoIk11bHRpcGxlIGJvb3QgY3B1cyAoJXMgYW5kICVzKVxuIiwKLQkJCQkgICAgICAgYm9vdGNwdS0+ZnVsbHBhdGgsIGNwdS0+ZnVsbHBhdGgpOwotCQkJZWxzZQotCQkJCWJvb3RjcHUgPSBjcHU7Ci0JCX0KLQl9Ci0KLQlpZiAob3V0dmVyc2lvbiA8IDIpIHsKLQkJaWYgKCEgYm9vdGNwdSkKLQkJCVdBUk5NU0coIk5vIGNwdSBoYXMgXCJsaW51eCxib290LWNwdVwiIHByb3BlcnR5XG4iKTsKLQl9IGVsc2UgewotCQlpZiAoYm9vdGNwdSkKLQkJCVdBUk5NU0coIlwibGludXgsYm9vdC1jcHVcIiBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGluIGJsb2IgdmVyc2lvbiAyIG9yIGhpZ2hlclxuIik7Ci0JCWlmIChib290X2NwdWlkX3BoeXMgPT0gMHhmZWVkYmVlZikKLQkJCVdBUk5NU0coInBoeXNpY2FsIGJvb3QgQ1BVIG5vdCBzZXQuICBVc2UgLWIgb3B0aW9uIHRvIHNldFxuIik7Ci0JfQotCi0JcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX21lbW9yeShzdHJ1Y3Qgbm9kZSAqcm9vdCkKLXsKLQlzdHJ1Y3Qgbm9kZSAqbWVtOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQlpbnQgbm5vZGVzID0gMDsKLQlpbnQgb2sgPSAxOwotCi0JZm9yX2VhY2hfY2hpbGQocm9vdCwgbWVtKSB7Ci0JCWlmICghIHN0cm5lcShtZW0tPm5hbWUsICJtZW1vcnkiLCBtZW0tPmJhc2VuYW1lbGVuKSkKLQkJCWNvbnRpbnVlOwotCi0JCW5ub2RlcysrOwotCi0JCUNIRUNLX0hBVkVfU1RSRVEobWVtLCAiZGV2aWNlX3R5cGUiLCAibWVtb3J5Iik7Ci0JCUNIRUNLX0hBVkUobWVtLCAicmVnIik7Ci0JfQotCi0JaWYgKG5ub2RlcyA9PSAwKSB7Ci0JCUVSUk1TRygiTm8gbWVtb3J5IG5vZGVzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIG9rOwotfQotCi1pbnQgY2hlY2tfc2VtYW50aWNzKHN0cnVjdCBub2RlICpkdCwgaW50IG91dHZlcnNpb24sIGludCBib290X2NwdWlkX3BoeXMpCi17Ci0JaW50IG9rID0gMTsKLQotCW9rID0gb2sgJiYgY2hlY2tfcm9vdChkdCk7Ci0Jb2sgPSBvayAmJiBjaGVja19jcHVzKGR0LCBvdXR2ZXJzaW9uLCBib290X2NwdWlkX3BoeXMpOwotCW9rID0gb2sgJiYgY2hlY2tfbWVtb3J5KGR0KTsKLQlpZiAoISBvaykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZGF0YS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kYXRhLmMKaW5kZXggYTk0NzE4Yy4uZGQyZTNkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kYXRhLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kYXRhLmMKQEAgLTMyLDggKzMyLDYgQEAKIAkJbSA9IG5tOwogCX0KIAotCWFzc2VydCghZC52YWwgfHwgZC5hc2l6ZSk7Ci0KIAlpZiAoZC52YWwpCiAJCWZyZWUoZC52YWwpOwogfQpAQCAtNDMsOSArNDEsNiBAQAogCXN0cnVjdCBkYXRhIG5kOwogCWludCBuZXdzaXplOwogCi0JLyogd2UgbXVzdCBzdGFydCB3aXRoIGFuIGFsbG9jYXRlZCBkYXR1bSAqLwotCWFzc2VydCghZC52YWwgfHwgZC5hc2l6ZSk7Ci0KIAlpZiAoeGxlbiA9PSAwKQogCQlyZXR1cm4gZDsKIApAQCAtNTYsMTEgKzUxLDggQEAKIAl3aGlsZSAoKGQubGVuICsgeGxlbikgPiBuZXdzaXplKQogCQluZXdzaXplICo9IDI7CiAKLQluZC5hc2l6ZSA9IG5ld3NpemU7CiAJbmQudmFsID0geHJlYWxsb2MoZC52YWwsIG5ld3NpemUpOwogCi0JYXNzZXJ0KG5kLmFzaXplID49IChkLmxlbiArIHhsZW4pKTsKLQogCXJldHVybiBuZDsKIH0KIApAQCAtODMsMTYgKzc1LDExIEBACiAJbG9uZyB2YWw7CiAKIAl4WzNdID0gJ1wwJzsKLQl4WzBdID0gc1soKmkpXTsKLQlpZiAoeFswXSkgewotCQl4WzFdID0gc1soKmkpKzFdOwotCQlpZiAoeFsxXSkKLQkJCXhbMl0gPSBzWygqaSkrMl07Ci0JfQorCXN0cm5jcHkoeCwgcyArICppLCAzKTsKIAogCXZhbCA9IHN0cnRvbCh4LCAmZW5keCwgOCk7Ci0JaWYgKChlbmR4IC0geCkgPT0gMCkKLQkJZnByaW50ZihzdGRlcnIsICJFbXB0eSBcXG5ubiBlc2NhcGVcbiIpOworCisJYXNzZXJ0KGVuZHggPiB4KTsKIAogCSgqaSkgKz0gZW5keCAtIHg7CiAJcmV0dXJuIHZhbDsKQEAgLTEwNSwxMyArOTIsMTEgQEAKIAlsb25nIHZhbDsKIAogCXhbMl0gPSAnXDAnOwotCXhbMF0gPSBzWygqaSldOwotCWlmICh4WzBdKQotCQl4WzFdID0gc1soKmkpKzFdOworCXN0cm5jcHkoeCwgcyArICppLCAyKTsKIAogCXZhbCA9IHN0cnRvbCh4LCAmZW5keCwgMTYpOwotCWlmICgoZW5keCAtIHgpID09IDApCi0JCWZwcmludGYoc3RkZXJyLCAiRW1wdHkgXFx4IGVzY2FwZVxuIik7CisJaWYgKCEoZW5keCAgPiB4KSkKKwkJZGllKCJcXHggdXNlZCB3aXRoIG5vIGZvbGxvd2luZyBoZXggZGlnaXRzXG4iKTsKIAogCSgqaSkgKz0gZW5keCAtIHg7CiAJcmV0dXJuIHZhbDsKQEAgLTE4MiwxNCArMTY3LDI5IEBACiAJcmV0dXJuIGQ7CiB9CiAKLXN0cnVjdCBkYXRhIGRhdGFfY29weV9maWxlKEZJTEUgKmYsIHNpemVfdCBsZW4pCitzdHJ1Y3QgZGF0YSBkYXRhX2NvcHlfZmlsZShGSUxFICpmLCBzaXplX3QgbWF4bGVuKQogewotCXN0cnVjdCBkYXRhIGQ7CisJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CiAKLQlkID0gZGF0YV9ncm93X2ZvcihlbXB0eV9kYXRhLCBsZW4pOworCXdoaWxlICghZmVvZihmKSAmJiAoZC5sZW4gPCBtYXhsZW4pKSB7CisJCXNpemVfdCBjaHVua3NpemUsIHJldDsKIAotCWQubGVuID0gbGVuOwotCWZyZWFkKGQudmFsLCBsZW4sIDEsIGYpOworCQlpZiAobWF4bGVuID09IC0xKQorCQkJY2h1bmtzaXplID0gNDA5NjsKKwkJZWxzZQorCQkJY2h1bmtzaXplID0gbWF4bGVuIC0gZC5sZW47CisKKwkJZCA9IGRhdGFfZ3Jvd19mb3IoZCwgY2h1bmtzaXplKTsKKwkJcmV0ID0gZnJlYWQoZC52YWwgKyBkLmxlbiwgMSwgY2h1bmtzaXplLCBmKTsKKworCQlpZiAoZmVycm9yKGYpKQorCQkJZGllKCJFcnJvciByZWFkaW5nIGZpbGUgaW50byBkYXRhOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKGQubGVuICsgcmV0IDwgZC5sZW4pCisJCQlkaWUoIk92ZXJmbG93IHJlYWRpbmcgZmlsZSBpbnRvIGRhdGFcbiIpOworCisJCWQubGVuICs9IHJldDsKKwl9CiAKIAlyZXR1cm4gZDsKIH0KQEAgLTI0Nyw3ICsyNDcsNyBAQAogCiBzdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF9jZWxsKHN0cnVjdCBkYXRhIGQsIGNlbGxfdCB3b3JkKQogewotCWNlbGxfdCBiZXdvcmQgPSBjcHVfdG9fYmUzMih3b3JkKTsKKwljZWxsX3QgYmV3b3JkID0gY3B1X3RvX2ZkdDMyKHdvcmQpOwogCiAJcmV0dXJuIGRhdGFfYXBwZW5kX2RhdGEoZCwgJmJld29yZCwgc2l6ZW9mKGJld29yZCkpOwogfQpAQCAtMjU2LDE1ICsyNTYsMTUgQEAKIHsKIAlzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgYmVyZTsKIAotCWJlcmUuYWRkcmVzcyA9IGNwdV90b19iZTY0KHJlLT5hZGRyZXNzKTsKLQliZXJlLnNpemUgPSBjcHVfdG9fYmU2NChyZS0+c2l6ZSk7CisJYmVyZS5hZGRyZXNzID0gY3B1X3RvX2ZkdDY0KHJlLT5hZGRyZXNzKTsKKwliZXJlLnNpemUgPSBjcHVfdG9fZmR0NjQocmUtPnNpemUpOwogCiAJcmV0dXJuIGRhdGFfYXBwZW5kX2RhdGEoZCwgJmJlcmUsIHNpemVvZihiZXJlKSk7CiB9CiAKLXN0cnVjdCBkYXRhIGRhdGFfYXBwZW5kX2FkZHIoc3RydWN0IGRhdGEgZCwgdTY0IGFkZHIpCitzdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF9hZGRyKHN0cnVjdCBkYXRhIGQsIHVpbnQ2NF90IGFkZHIpCiB7Ci0JdTY0IGJlYWRkciA9IGNwdV90b19iZTY0KGFkZHIpOworCXVpbnQ2NF90IGJlYWRkciA9IGNwdV90b19mZHQ2NChhZGRyKTsKIAogCXJldHVybiBkYXRhX2FwcGVuZF9kYXRhKGQsICZiZWFkZHIsIHNpemVvZihiZWFkZHIpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLWxleGVyLmwgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2R0Yy1sZXhlci5sCmluZGV4IGM4MTFiMjIuLjQ0ZGJmZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLWxleGVyLmwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtbGV4ZXIubApAQCAtMjgsNiArMjgsMTAgQEAKIFBST1BOT0RFQ0hBUglbYS16QS1aMC05LC5fKyojP0AtXQogUEFUSENIQVIJKHtQUk9QTk9ERUNIQVJ9fFsvXSkKIExBQkVMCQlbYS16QS1aX11bYS16QS1aMC05X10qCitTVFJJTkcJCVwiKFteXFwiXXxcXC4pKlwiCitXUwkJW1s6c3BhY2U6XV0KK0NPTU1FTlQJCSIvKiIoW14qXXxcKitbXiovXSkqXCorIi8iCitMSU5FQ09NTUVOVAkiLy8iLipcbgogCiAlewogI2luY2x1ZGUgImR0Yy5oIgpAQCAtNTIsMjkgKzU2LDI2IEBACiAJCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAogCQkJCUJFR0lOKFYxKTsgXAogCQkJfQorCitzdGF0aWMgdm9pZCBwdXNoX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKTsKICV9CiAKICUlCi08Kj4iL2luY2x1ZGUvIgkJQkVHSU4oSU5DTFVERSk7Ci0KLTxJTkNMVURFPlwiW14iXG5dKlwiCXsKLQkJCXl5dGV4dFtzdHJsZW4oeXl0ZXh0KSAtIDFdID0gMDsKLQkJCWlmICghcHVzaF9pbnB1dF9maWxlKHl5dGV4dCArIDEpKSB7Ci0JCQkJLyogU29tZSB1bnJlY292ZXJhYmxlIGVycm9yLiovCi0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJCUJFR0lOX0RFRkFVTFQoKTsKKzwqPiIvaW5jbHVkZS8ie1dTfSp7U1RSSU5HfSB7CisJCQljaGFyICpuYW1lID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykgKyAxOworCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CisJCQlwdXNoX2lucHV0X2ZpbGUobmFtZSk7CiAJCX0KIAotCiA8Kj48PEVPRj4+CQl7CiAJCQlpZiAoIXBvcF9pbnB1dF9maWxlKCkpIHsKIAkJCQl5eXRlcm1pbmF0ZSgpOwogCQkJfQogCQl9CiAKLTwqPlwiKFteXFwiXXxcXC4pKlwiCXsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07Cis8Kj57U1RSSU5HfQl7CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCkBAIC04NCw3ICs4NSw3IEBACiAJCX0KIAogPCo+Ii9kdHMtdjEvIgl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKQEAgLTkzLDcgKzk0LDcgQEAKIAkJfQogCiA8Kj4iL21lbXJlc2VydmUvIgl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9tZW1yZXNlcnZlL1xuIik7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CkBAIC0xMDEsNyArMTAyLDcgQEAKIAkJfQogCiA8Kj57TEFCRUx9Ogl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkxhYmVsOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5sYWJlbHJlZiA9IHN0cmR1cCh5eXRleHQpOwpAQCAtMTEwLDcgKzExMSw3IEBACiAJCX0KIAogPElOSVRJQUw+W2JvZGhdIyB7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlpZiAoKnl5dGV4dCA9PSAnYicpCiAJCQkJeXlsdmFsLmNiYXNlID0gMjsKQEAgLTEyNSw3ICsxMjYsNyBAQAogCQl9CiAKIDxJTklUSUFMPlswLTlhLWZBLUZdKwl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOwogCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7CkBAIC0xMzMsNyArMTM0LDcgQEAKIAkJfQogCiA8VjE+WzAtOV0rfDBbeFhdWzAtOWEtZkEtRl0rICAgICAgewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKIAkJCURQUklOVCgiTGl0ZXJhbDogJyVzJ1xuIiwgeXlsdmFsLmxpdGVyYWwpOwpAQCAtMTQxLDcgKzE0Miw3IEBACiAJCX0KIAogXCZ7TEFCRUx9CXsJLyogbGFiZWwgcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIlJlZjogJXNcbiIsIHl5dGV4dCsxKTsKIAkJCXl5bHZhbC5sYWJlbHJlZiA9IHN0cmR1cCh5eXRleHQrMSk7CkBAIC0xNDksNyArMTUwLDcgQEAKIAkJfQogCiAiJnsvIntQQVRIQ0hBUn0rXH0JewkvKiBuZXctc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMik7CkBAIC0xNTgsNyArMTU5LDcgQEAKIAkJfQogCiA8SU5JVElBTD4iJi8ie1BBVEhDSEFSfSsgewkvKiBvbGQtc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwogCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKQEAgLTE2Niw3ICsxNjcsNyBAQAogCQl9CiAKIDxCWVRFU1RSSU5HPlswLTlhLWZBLUZdezJ9IHsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5bHZhbC5ieXRlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgMTYpOwogCQkJRFBSSU5UKCJCeXRlOiAlMDJ4XG4iLCAoaW50KXl5bHZhbC5ieXRlKTsKQEAgLTE3NCw3ICsxNzUsNyBAQAogCQl9CiAKIDxCWVRFU1RSSU5HPiJdIgl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIi9CWVRFU1RSSU5HXG4iKTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKQEAgLTE4Miw3ICsxODMsNyBAQAogCQl9CiAKIDxQUk9QTk9ERU5BTUU+e1BST1BOT0RFQ0hBUn0rIHsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUHJvcE5vZGVOYW1lOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5wcm9wbm9kZW5hbWUgPSBzdHJkdXAoeXl0ZXh0KTsKQEAgLTE5MCwyMCArMTkxLDE5IEBACiAJCQlyZXR1cm4gRFRfUFJPUE5PREVOQU1FOwogCQl9CiAKLQotPCo+W1s6c3BhY2U6XV0rCS8qIGVhdCB3aGl0ZXNwYWNlICovCi0KLTwqPiIvKiIoW14qXXxcKitbXiovXSkqXCorIi8iCXsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisiL2luY2Jpbi8iCXsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJRFBSSU5UKCJDb21tZW50OiAlc1xuIiwgeXl0ZXh0KTsKLQkJCS8qIGVhdCBjb21tZW50cyAqLworCQkJRFBSSU5UKCJCaW5hcnkgSW5jbHVkZVxuIik7CisJCQlyZXR1cm4gRFRfSU5DQklOOwogCQl9CiAKLTwqPiIvLyIuKlxuCS8qIGVhdCBsaW5lIGNvbW1lbnRzICovCis8Kj57V1N9KwkvKiBlYXQgd2hpdGVzcGFjZSAqLworPCo+e0NPTU1FTlR9KwkvKiBlYXQgQy1zdHlsZSBjb21tZW50cyAqLworPCo+e0xJTkVDT01NRU5UfSsgLyogZWF0IEMrKy1zdHlsZSBjb21tZW50cyAqLwogCiA8Kj4uCQl7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkNoYXI6ICVjIChcXHglMDJ4KVxuIiwgeXl0ZXh0WzBdLAogCQkJCSh1bnNpZ25lZCl5eXRleHRbMF0pOwpAQCAtMjI3LDE0ICsyMjcsMTMgQEAKICAqLwogCiBzdHJ1Y3QgaW5jbF9maWxlIHsKLQlpbnQgZmlsZW51bTsKLQlGSUxFICpmaWxlOworCXN0cnVjdCBkdGNfZmlsZSAqZmlsZTsKIAlZWV9CVUZGRVJfU1RBVEUgeXlfcHJldl9idWY7CiAJaW50IHl5X3ByZXZfbGluZW5vOwogCXN0cnVjdCBpbmNsX2ZpbGUgKnByZXY7CiB9OwogCi1zdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7CitzdGF0aWMgc3RydWN0IGluY2xfZmlsZSAqaW5jbF9maWxlX3N0YWNrOwogCiAKIC8qCkBAIC0yNDUsMzYgKzI0NCwzNCBAQAogc3RhdGljIGludCBpbmNsX2RlcHRoID0gMDsKIAogCi1pbnQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCUZJTEUgKmY7CiAJc3RydWN0IGluY2xfZmlsZSAqaW5jbF9maWxlOworCXN0cnVjdCBkdGNfZmlsZSAqbmV3ZmlsZTsKKwlzdHJ1Y3Qgc2VhcmNoX3BhdGggc2VhcmNoLCAqc2VhcmNocHRyID0gTlVMTDsKIAotCWlmICghZmlsZW5hbWUpIHsKLQkJeXllcnJvcigiTm8gaW5jbHVkZSBmaWxlIG5hbWUgZ2l2ZW4uIik7Ci0JCXJldHVybiAwOworCWFzc2VydChmaWxlbmFtZSk7CisKKwlpZiAoaW5jbF9kZXB0aCsrID49IE1BWF9JTkNMVURFX0RFUFRIKQorCQlkaWUoIkluY2x1ZGVzIG5lc3RlZCB0b28gZGVlcGx5Iik7CisKKwlpZiAoc3JjcG9zX2ZpbGUpIHsKKwkJc2VhcmNoLmRpciA9IHNyY3Bvc19maWxlLT5kaXI7CisJCXNlYXJjaC5uZXh0ID0gTlVMTDsKKwkJc2VhcmNoLnByZXYgPSBOVUxMOworCQlzZWFyY2hwdHIgPSAmc2VhcmNoOwogCX0KIAotCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpIHsKLQkJeXllcnJvcigiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCW5ld2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZpbGVuYW1lLCBzZWFyY2hwdHIpOwogCi0JZiA9IGR0Y19vcGVuX2ZpbGUoZmlsZW5hbWUpOwotCi0JaW5jbF9maWxlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5jbF9maWxlKSk7Ci0JaWYgKCFpbmNsX2ZpbGUpIHsKLQkJeXllcnJvcigiQ2FuIG5vdCBhbGxvY2F0ZSBpbmNsdWRlIGZpbGUgc3BhY2UuIik7Ci0JCXJldHVybiAwOwotCX0KKwlpbmNsX2ZpbGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5jbF9maWxlKSk7CiAKIAkvKgogCSAqIFNhdmUgY3VycmVudCBjb250ZXh0LgogCSAqLwogCWluY2xfZmlsZS0+eXlfcHJldl9idWYgPSBZWV9DVVJSRU5UX0JVRkZFUjsKIAlpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vID0geXlsaW5lbm87Ci0JaW5jbF9maWxlLT5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07Ci0JaW5jbF9maWxlLT5maWxlID0geXlpbjsKKwlpbmNsX2ZpbGUtPmZpbGUgPSBzcmNwb3NfZmlsZTsKIAlpbmNsX2ZpbGUtPnByZXYgPSBpbmNsX2ZpbGVfc3RhY2s7CiAKIAlpbmNsX2ZpbGVfc3RhY2sgPSBpbmNsX2ZpbGU7CkBAIC0yODIsMjMgKzI3OSwyMSBAQAogCS8qCiAJICogRXN0YWJsaXNoIG5ldyBjb250ZXh0LgogCSAqLwotCXNyY3Bvc19maWxlbnVtID0gbG9va3VwX2ZpbGVfbmFtZShmaWxlbmFtZSwgMCk7CisJc3JjcG9zX2ZpbGUgPSBuZXdmaWxlOwogCXl5bGluZW5vID0gMTsKLQl5eWluID0gZjsKKwl5eWluID0gbmV3ZmlsZS0+ZmlsZTsKIAl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKLQotCXJldHVybiAxOwogfQogCiAKLWludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQorc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewogCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKIAogCWlmIChpbmNsX2ZpbGVfc3RhY2sgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlmY2xvc2UoeXlpbik7CisJZHRjX2Nsb3NlX2ZpbGUoc3JjcG9zX2ZpbGUpOwogCiAJLyoKIAkgKiBQb3AuCkBAIC0zMTMsMTYgKzMwOCwxMyBAQAogCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOwogCXl5X3N3aXRjaF90b19idWZmZXIoaW5jbF9maWxlLT55eV9wcmV2X2J1Zik7CiAJeXlsaW5lbm8gPSBpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vOwotCXNyY3Bvc19maWxlbnVtID0gaW5jbF9maWxlLT5maWxlbnVtOwotCXl5aW4gPSBpbmNsX2ZpbGUtPmZpbGU7CisJc3JjcG9zX2ZpbGUgPSBpbmNsX2ZpbGUtPmZpbGU7CisJeXlpbiA9IGluY2xfZmlsZS0+ZmlsZSA/IGluY2xfZmlsZS0+ZmlsZS0+ZmlsZSA6IE5VTEw7CiAKIAkvKgogCSAqIEZyZWUgb2xkIHN0YXRlLgogCSAqLwogCWZyZWUoaW5jbF9maWxlKTsKIAotCWlmIChZWV9DVVJSRU5UX0JVRkZFUiA9PSAwKQotCQlyZXR1cm4gMDsKLQogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZCBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLWxleGVyLmxleC5jX3NoaXBwZWQKaW5kZXggZDBmNzQyNC4uYWMzOTJjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCkBAIC05LDcgKzksNyBAQAogI2RlZmluZSBGTEVYX1NDQU5ORVIKICNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKICNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKLSNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDMzCisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzNAogI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKICNkZWZpbmUgRkxFWF9CRVRBCiAjZW5kaWYKQEAgLTMxLDcgKzMxLDcgQEAKIAogLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KIAotI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAogCiAvKiBDOTkgc2F5cyB0byBkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyBiZWZvcmUgaW5jbHVkaW5nIHN0ZGludC5oLAogICogaWYgeW91IHdhbnQgdGhlIGxpbWl0IChtYXgvbWluKSBtYWNyb3MgZm9yIGludCB0eXBlcy4gCkBAIC05NCwxMSArOTQsMTIgQEAKIAogI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLwogCi0jaWYgX19TVERDX18KKy8qIEM5OSByZXF1aXJlcyBfX1NURENfXyB0byBiZSBkZWZpbmVkIGFzIDEuICovCisjaWYgZGVmaW5lZCAoX19TVERDX18pCiAKICNkZWZpbmUgWVlfVVNFX0NPTlNUCiAKLSNlbmRpZgkvKiBfX1NURENfXyAqLworI2VuZGlmCS8qIGRlZmluZWQgKF9fU1REQ19fKSAqLwogI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KIAogI2lmZGVmIFlZX1VTRV9DT05TVApAQCAtMTk0LDExICsxOTUsMTMgQEAKIC8qIFRoZSBmb2xsb3dpbmcgaXMgYmVjYXVzZSB3ZSBjYW5ub3QgcG9ydGFibHkgZ2V0IG91ciBoYW5kcyBvbiBzaXplX3QKICAqICh3aXRob3V0IGF1dG9jb25mJ3MgaGVscCwgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIGJlY2F1c2Ugd2Ugd2FudAogICogZmxleC1nZW5lcmF0ZWQgc2Nhbm5lcnMgdG8gY29tcGlsZSBvbiB0aGVpciBvd24pLgorICogR2l2ZW4gdGhhdCB0aGUgc3RhbmRhcmQgaGFzIGRlY3JlZWQgdGhhdCBzaXplX3QgZXhpc3RzIHNpbmNlIDE5ODksCisgKiBJIGd1ZXNzIHdlIGNhbiBhZmZvcmQgdG8gZGVwZW5kIG9uIGl0LiBNYW5vai4KICAqLwogCiAjaWZuZGVmIFlZX1RZUEVERUZfWVlfU0laRV9UCiAjZGVmaW5lIFlZX1RZUEVERUZfWVlfU0laRV9UCi10eXBlZGVmIHVuc2lnbmVkIGludCB5eV9zaXplX3Q7Cit0eXBlZGVmIHNpemVfdCB5eV9zaXplX3Q7CiAjZW5kaWYKIAogI2lmbmRlZiBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCkBAIC0zNDksNyArMzUyLDcgQEAKIAogLyogQmVnaW4gdXNlciBzZWN0MyAqLwogCi0jZGVmaW5lIHl5d3JhcCgpIDEKKyNkZWZpbmUgeXl3cmFwKG4pIDEKICNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CkBAIC0zODksMTkgKzM5MiwyMCBAQAogCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CiAJZmxleF9pbnQzMl90IHl5X254dDsKIAl9Owotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFs5NF0gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFsxMDRdID0KICAgICB7ICAgMCwKICAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAyMSwgICAxOSwgICAxNiwgICAxNiwgICAxOSwgICAxOSwgICAxOSwgICAgOCwgICAgOCwgICAxOSwKLSAgICAgICAgOCwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxNCwgICAxNSwgICAxNSwgICAxOSwgICAgOSwKLSAgICAgICAgOSwgICAxNiwgICAgMCwgICAgMywgICAgMCwgICAgMCwgICAxMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgOCwgICAgOCwgICAgNiwgICAgMCwgICAgNywgICAgMCwgICAgMiwKLSAgICAgICAgMCwgICAxMywgICAxMywgICAxNSwgICAxNSwgICAgOSwgICAgMCwgICAxMiwgICAxMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAxOCwgICAgMCwgICAgMCwgICAgMCwgICAgMiwgICAgOSwgICAgMCwKLSAgICAgICAxNywgICAgMCwgICAgMCwgICAgMCwgICAxMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNCwgICAgMCwgICAgMCwgICAgMSwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgNSwgICAgMAorICAgICAgIDIxLCAgIDE5LCAgIDE2LCAgIDE2LCAgIDE5LCAgIDE5LCAgIDE5LCAgICA3LCAgICA3LCAgIDE5LAorICAgICAgICA3LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDEzLCAgIDE0LCAgIDE0LCAgIDE5LCAgICA4LAorICAgICAgICA4LCAgIDE2LCAgICAwLCAgICAyLCAgICAwLCAgICAwLCAgICA5LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICA3LCAgICA3LCAgICA1LCAgICAwLCAgICA2LCAgICAwLCAgIDEyLAorICAgICAgIDEyLCAgIDE0LCAgIDE0LCAgICA4LCAgICAwLCAgIDExLCAgICA5LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgIDE4LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA4LCAgICAwLCAgIDE3LCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgIDEwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAzLCAgIDE1LAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAxLCAgICAwLAogCisgICAgICAgIDAsICAgIDQsICAgIDAKICAgICB9IDsKIAogc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQpAQCAtNDQ0LDEyMiArNDQ4LDEyNiBAQAogICAgICAgICA3LCAgICA3LCAgICA3LCAgICA4LCAgICAxCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzEwN10gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Jhc2VbMTE3XSA9CiAgICAgeyAgIDAsCi0gICAgICAgIDAsICAgIDAsICAgMzIsICAgIDAsICAgNTMsICAgIDAsICAgNzYsICAgIDAsICAxMDgsICAxMTEsCi0gICAgICAyODAsICAyODgsICAgMzcsICAgMzksICAgMzMsICAgMzYsICAxMDYsICAgIDAsICAxMjMsICAxNDYsCi0gICAgICAyNTUsICAyNTEsICAgNDUsICAgIDAsICAxNTksICAyODgsICAgIDAsICAgNTMsICAxMDgsICAxNzIsCi0gICAgICAxMTQsICAxMjcsICAxNTgsICAyODgsICAyNDUsICAgIDAsICAgIDAsICAyMzQsICAyMzUsICAyMzYsCi0gICAgICAxOTcsICAxOTUsICAxOTksICAgIDAsICAgIDAsICAyODgsICAgIDAsICAyODgsICAxNjAsICAyODgsCi0gICAgICAxODMsICAyODgsICAgIDAsICAgIDAsICAxODMsICAxODIsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCi0gICAgICAyMDQsICAxODksICAyMDcsICAyODgsICAxNzksICAxODcsICAxODAsICAxOTQsICAgIDAsICAxNzEsCi0gICAgICAyODgsICAxOTYsICAxNzgsICAxNzQsICAyODgsICAxNjksICAxNjksICAxNzcsICAxNjUsICAxNTMsCi0gICAgICAxNDMsICAxNTUsICAxMzcsICAxMTgsICAyODgsICAxMjIsICAgNDIsICAyODgsICAgMzYsICAgMzYsCi0gICAgICAgNDAsICAyODgsICAyODgsICAyMTIsICAyMTgsICAyMjMsICAyMjksICAyMzQsICAyMzksICAyNDUsCisgICAgICAgIDAsICAgIDAsICAgMzAsICAgIDAsICAgNDQsICAgIDAsICAgNjcsICAgIDAsICAgOTcsICAxMDUsCisgICAgICAzMDIsICAzMDMsICAgMzUsICAgNDQsICAgNDAsICAgOTQsICAxMTIsICAgIDAsICAxMjksICAxNTIsCisgICAgICAyOTYsICAyOTUsICAxNTksICAgIDAsICAxNzYsICAzMDMsICAgIDAsICAxMTYsICAgOTUsICAxNjUsCisgICAgICAgNDksICAgNDYsICAxMDIsICAzMDMsICAyOTYsICAgIDAsICAgIDAsICAyODgsICAyOTAsICAyOTMsCisgICAgICAyNjQsICAyNjYsICAyNzAsICAgIDAsICAgIDAsICAzMDMsICAgIDAsICAzMDMsICAyNjQsICAzMDMsCisgICAgICAgIDAsICAgIDAsICAxOTUsICAxMDEsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAyODQsICAxMjUsCisgICAgICAyNzcsICAyNjUsICAyMjUsICAyMzAsICAyMTYsICAyMTgsICAgIDAsICAyMDIsICAyMjQsICAyMjEsCisgICAgICAyMTcsICAxMDcsICAxOTYsICAxODgsICAzMDMsICAyMDYsICAxNzksICAxODYsICAxNzgsICAxODUsCisgICAgICAxODMsICAxNjIsICAxNjEsICAxNTAsICAxNjksICAxNjAsICAxNDUsICAxMjUsICAzMDMsICAzMDMsCisgICAgICAxMzcsICAxMDksICAxOTAsICAxMDMsICAyMDMsICAxNjcsICAxMDgsICAxOTcsICAzMDMsICAxMjMsCiAKLSAgICAgIDI1MSwgIDI1NSwgIDI2MiwgIDI3MCwgIDI3NSwgIDI4MAorICAgICAgIDI5LCAgMzAzLCAgMzAzLCAgMjE1LCAgMjIxLCAgMjI2LCAgMjI5LCAgMjM0LCAgMjQwLCAgMjQ2LAorICAgICAgMjUwLCAgMjU3LCAgMjY1LCAgMjcwLCAgMjc1LCAgMjgyCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9kZWZbMTA3XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfZGVmWzExN10gPQogICAgIHsgICAwLAotICAgICAgIDkzLCAgICAxLCAgICAxLCAgICAzLCAgICAzLCAgICA1LCAgIDkzLCAgICA3LCAgICAzLCAgICAzLAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDk0LCAgIDk1LCAgIDkzLCAgIDk2LCAgIDkzLCAgIDE5LAotICAgICAgIDE5LCAgIDIwLCAgIDk3LCAgIDk4LCAgIDIwLCAgIDkzLCAgIDk5LCAgMTAwLCAgIDk1LCAgIDkzLAotICAgICAgIDkzLCAgIDkzLCAgIDk0LCAgIDkzLCAgIDk0LCAgMTAxLCAgMTAyLCAgIDkzLCAgMTAzLCAgMTA0LAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDk2LCAgIDE5LCAgIDkzLCAgIDIwLCAgIDkzLCAgIDk3LCAgIDkzLAotICAgICAgIDk3LCAgIDkzLCAgIDIwLCAgIDk5LCAgMTAwLCAgIDkzLCAgMTA1LCAgMTAxLCAgMTAyLCAgMTA2LAotICAgICAgMTAzLCAgMTAzLCAgMTA0LCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDk0LCAgMTA1LCAgMTA2LAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAotICAgICAgIDkzLCAgIDkzLCAgICAwLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAorICAgICAgMTAzLCAgICAxLCAgICAxLCAgICAzLCAgICAzLCAgICA1LCAgMTAzLCAgICA3LCAgICAzLCAgICAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTAzLCAgMTA2LCAgMTAzLCAgIDE5LAorICAgICAgIDE5LCAgIDIwLCAgMTAzLCAgMTA3LCAgIDIwLCAgMTAzLCAgMTA4LCAgMTA5LCAgMTA1LCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTA0LCAgMTAzLCAgMTA0LCAgMTEwLCAgMTExLCAgMTAzLCAgMTEyLCAgMTEzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTA2LCAgIDE5LCAgMTAzLCAgIDIwLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgIDIwLCAgMTA4LCAgMTA5LCAgMTAzLCAgMTE0LCAgMTEwLCAgMTExLCAgMTE1LCAgMTEyLCAgMTEyLAorICAgICAgMTEzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTE0LCAgMTE1LCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTE2LCAgMTAzLCAgMTE2LCAgMTAzLCAgMTE2LAogCi0gICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMKKyAgICAgIDEwMywgIDEwMywgICAgMCwgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKKyAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMwogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0WzMyNF0gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFszMzldID0KICAgICB7ICAgMCwKICAgICAgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxMiwgICAxNiwgICAxMiwgICAxMiwgICAxMiwgICAxNywKICAgICAgICAxOCwgICAxOCwgICAxOCwgICAxMiwgICAxOSwgICAyMCwgICAyMCwgICAxMiwgICAxMiwgICAyMSwKICAgICAgICAxOSwgICAyMSwgICAxOSwgICAyMiwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAyMCwKLSAgICAgICAyMCwgICAyMCwgICAyMCwgICAxMiwgICAxMiwgICAyMywgICAzNCwgICAxMiwgICAzMiwgICAzMiwKLSAgICAgICAzMiwgICAzMiwgICAxMiwgICAxMiwgICAxMiwgICAzNiwgICAyMCwgICAzMywgICA1MCwgICA5MiwKLSAgICAgICAzNSwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAxNSwgICA1NCwgICA5MSwgICA1NCwKLSAgICAgICA1NCwgICA1NCwgICA1MSwgICAyNCwgICAyNCwgICAyNCwgICA0NiwgICAyNSwgICA5MCwgICAzOCwKLSAgICAgICA4OSwgICAyNiwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAxMiwgICAxMywgICAxNCwgICAxNSwKLSAgICAgICAyNywgICAxMiwgICAyNywgICAyNywgICAyNywgICAxNywgICAyNywgICAyNywgICAyNywgICAxMiwKLSAgICAgICAyOCwgICAyOCwgICAyOCwgICAxMiwgICAxMiwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwKKyAgICAgICAyMCwgICAyMCwgICAyMCwgICAxMiwgICAxMiwgICAxMiwgICAzMiwgICAzMiwgIDEwMiwgICAyMywKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAzNCwgICAyMCwgICAzMiwgICAzMiwgICAzMiwgICAzMiwgICAyMCwKKyAgICAgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAyNCwgICAyNCwgICAyNCwgICAzNSwgICAyNSwgICA1NCwKKyAgICAgICA1NCwgICA1NCwgICAyNiwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAxMiwgICAxMywgICAxNCwKKyAgICAgICAxNSwgICAyNywgICAxMiwgICAyNywgICAyNywgICAyNywgICAyMywgICAyNywgICAyNywgICAyNywKKyAgICAgICAxMiwgICAyOCwgICAyOCwgICAyOCwgICAxMiwgICAxMiwgICAyOCwgICAyOCwgICAyOCwgICAyOCwKKyAgICAgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwKIAotICAgICAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDEyLAotICAgICAgIDEyLCAgIDE1LCAgIDM5LCAgIDI5LCAgIDE1LCAgIDQwLCAgIDI5LCAgIDkzLCAgIDMwLCAgIDMxLAotICAgICAgIDMxLCAgIDMwLCAgIDMxLCAgIDMxLCAgIDU2LCAgIDU2LCAgIDU2LCAgIDQxLCAgIDMyLCAgIDMyLAotICAgICAgIDQyLCAgIDg4LCAgIDQzLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ2LCAgIDQ1LCAgIDQ3LCAgIDQ3LAotICAgICAgIDg3LCAgIDM4LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LAotICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDg2LAotICAgICAgIDQ3LCAgIDM0LCAgIDMzLCAgIDUwLCAgIDg1LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUzLAotICAgICAgIDUzLCAgIDUzLCAgIDg0LCAgIDUzLCAgIDgzLCAgIDM1LCAgIDgyLCAgIDUxLCAgIDUzLCAgIDUzLAotICAgICAgIDUzLCAgIDUzLCAgIDU2LCAgIDU2LCAgIDU2LCAgIDkzLCAgIDY4LCAgIDU0LCAgIDU3LCAgIDU0LAotICAgICAgIDU0LCAgIDU0LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDYyLCAgIDQ2LCAgIDM0LCAgIDcxLCAgIDgxLAorICAgICAgIDEyLCAgIDEyLCAgIDI5LCAgIDM2LCAgMTAzLCAgIDM0LCAgIDE3LCAgIDMwLCAgIDMxLCAgIDMxLAorICAgICAgIDI5LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDE3LCAgIDMwLCAgIDMxLCAgIDMxLCAgIDM5LCAgIDM1LAorICAgICAgIDUyLCAgIDQwLCAgIDUyLCAgIDUyLCAgIDUyLCAgMTAzLCAgIDc4LCAgIDM4LCAgIDM4LCAgIDQ2LAorICAgICAgMTAxLCAgIDYwLCAgIDc5LCAgIDQxLCAgIDY5LCAgIDk3LCAgIDQyLCAgIDk0LCAgIDQzLCAgIDQ1LAorICAgICAgIDQ1LCAgIDQ1LCAgIDQ2LCAgIDQ1LCAgIDQ3LCAgIDQ3LCAgIDkzLCAgIDkyLCAgIDQ1LCAgIDQ1LAorICAgICAgIDQ1LCAgIDQ1LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LAorICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDM5LCAgIDQ3LCAgIDkxLCAgIDQwLCAgIDkwLAorICAgICAgIDk5LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDg5LCAgIDg4LAorICAgICAgIDQxLCAgIDU1LCAgIDg3LCAgIDQ5LCAgMTAwLCAgIDQzLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDg2LAorICAgICAgIDUxLCAgIDk1LCAgIDk1LCAgIDk2LCAgIDg1LCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUyLAogCi0gICAgICAgODAsICAgNzksICAgNzgsICAgNzcsICAgNzYsICAgNzUsICAgNzQsICAgNzMsICAgNzIsICAgNjQsCi0gICAgICAgNjIsICAgMzUsICAgMzMsICAgMzMsICAgMzMsICAgMzMsICAgMzMsICAgMzMsICAgMzMsICAgMzMsCi0gICAgICAgMzcsICAgNjcsICAgNjYsICAgMzcsICAgMzcsICAgMzcsICAgNDQsICAgNjUsICAgNDQsICAgNDksCi0gICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAgNTIsICAgNjQsICAgNTIsCi0gICAgICAgNTQsICAgNjIsICAgNTQsICAgNjAsICAgNTQsICAgNTQsICAgNTUsICAgOTMsICAgNTUsICAgNTUsCi0gICAgICAgNTUsICAgNTUsICAgNTgsICAgNTgsICAgNTgsICAgNDgsICAgNTgsICAgNTgsICAgNTksICAgNDgsCi0gICAgICAgNTksICAgNTksICAgNjEsICAgNjEsICAgNjEsICAgNjEsICAgNjEsICAgNjEsICAgNjEsICAgNjEsCi0gICAgICAgNjMsICAgNjMsICAgNjMsICAgNjMsICAgNjMsICAgNjMsICAgNjMsICAgNjMsICAgNjksICAgOTMsCi0gICAgICAgNjksICAgNzAsICAgNzAsICAgNzAsICAgOTMsICAgNzAsICAgNzAsICAgMTEsICAgOTMsICAgOTMsCi0gICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTksICAgNTIsICAgNTIsICAgNTIsICAgOTUsICAgOTUsICAgOTYsICAgODQsICAgNDYsICAgODMsCisgICAgICAgODIsICAgODEsICAgMzksICAgNzksICAxMDAsICAgMzMsICAgMzMsICAgMzMsICAgMzMsICAgMzMsCisgICAgICAgMzMsICAgMzMsICAgMzMsICAgMzcsICAgODAsICAgNzcsICAgMzcsICAgMzcsICAgMzcsICAgNDQsCisgICAgICAgNDAsICAgNDQsICAgNTAsICAgNzYsICAgNTAsICAgNTIsICAgNzUsICAgNTIsICAgNzQsICAgNTIsCisgICAgICAgNTIsICAgNTMsICAgNzMsICAgNTMsICAgNTMsICAgNTMsICAgNTMsICAgNTYsICAgNTYsICAgNTYsCisgICAgICAgNzIsICAgNTYsICAgNTYsICAgNTcsICAgNzEsICAgNTcsICAgNTcsICAgNTksICAgNTksICAgNTksCisgICAgICAgNTksICAgNTksICAgNTksICAgNTksICAgNTksICAgNjEsICAgNjEsICAgNjEsICAgNjEsICAgNjEsCisgICAgICAgNjEsICAgNjEsICAgNjEsICAgNjcsICAgNzAsICAgNjcsICAgNjgsICAgNjgsICAgNjgsICAgNjIsCisgICAgICAgNjgsICAgNjgsICAgOTgsICAgOTgsICAgOTgsICAgOTgsICAgOTgsICAgOTgsICAgOTgsICAgOTgsCisgICAgICAgNjAsICAgNjYsICAgNjUsICAgNjQsICAgNjMsICAgNjIsICAgNjAsICAgNTgsICAxMDMsICAgNDgsCiAKLSAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKLSAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKLSAgICAgICA5MywgICA5MywgICA5MworICAgICAgIDQ4LCAgMTAzLCAgIDExLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAorICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9jaGtbMzI0XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfY2hrWzMzOV0gPQogICAgIHsgICAwLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgIDE1LCAgICAzLCAgIDEzLCAgIDEzLAotICAgICAgIDE0LCAgIDE0LCAgICAzLCAgICAzLCAgICAzLCAgIDE2LCAgICAzLCAgIDIzLCAgIDIzLCAgIDkxLAotICAgICAgIDE1LCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICA1LCAgIDI4LCAgIDkwLCAgIDI4LAotICAgICAgIDI4LCAgIDI4LCAgIDIzLCAgICA1LCAgICA1LCAgICA1LCAgIDI4LCAgICA1LCAgIDg5LCAgIDE2LAotICAgICAgIDg3LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgIDEzLCAgIDEzLCAgMTAxLCAgICAzLAorICAgICAgICAzLCAgICAzLCAgICAzLCAgIDE1LCAgICAzLCAgIDE0LCAgIDE0LCAgIDMyLCAgIDMyLCAgICAzLAorICAgICAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICA1LCAgICA1LCAgICA1LCAgIDE1LCAgICA1LCAgIDMxLAorICAgICAgIDMxLCAgIDMxLCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA1LCAgICA3LCAgICA3LCAgICA3LAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAogICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAogICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAogCi0gICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCi0gICAgICAgIDcsICAgIDksICAgMTcsICAgIDksICAgMTAsICAgMTcsICAgMTAsICAgMjksICAgIDksICAgIDksCi0gICAgICAgIDksICAgMTAsICAgMTAsICAgMTAsICAgMzEsICAgMzEsICAgMzEsICAgMTcsICAgMzIsICAgMzIsCi0gICAgICAgMTcsICAgODYsICAgMTcsICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCi0gICAgICAgODQsICAgMjksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCi0gICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMjAsICAgMjAsICAgMjAsICAgODMsCi0gICAgICAgMjAsICAgMzMsICAgNDksICAgNDksICAgODIsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjUsCi0gICAgICAgMjUsICAgMjUsICAgODEsICAgMjUsICAgODAsICAgMzMsICAgNzksICAgNDksICAgMjUsICAgMjUsCi0gICAgICAgMjUsICAgMjUsICAgMzAsICAgMzAsICAgMzAsICAgNTEsICAgNTEsICAgNTUsICAgMzAsICAgNTUsCi0gICAgICAgNTUsICAgNTUsICAgNTYsICAgNTYsICAgNTYsICAgNjIsICAgNTUsICAgNjgsICAgNjIsICAgNzgsCisgICAgICAgIDcsICAgIDcsICAgIDksICAgMTYsICAgMjksICAgMzMsICAgIDksICAgIDksICAgIDksICAgIDksCisgICAgICAgMTAsICAgNTQsICAgNTQsICAgNTQsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTcsICAgMzMsCisgICAgICAgMjgsICAgMTcsICAgMjgsICAgMjgsICAgMjgsICAxMDAsICAgNzIsICAgMTYsICAgMjksICAgMjgsCisgICAgICAgOTcsICAgNjAsICAgNzIsICAgMTcsICAgNjAsICAgOTQsICAgMTcsICAgOTIsICAgMTcsICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgOTEsICAgODgsICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMjAsICAgMjAsICAgMjAsICAgMjMsICAgMjAsICAgODcsICAgMjMsICAgODYsCisgICAgICAgOTYsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMzAsICAgMzAsICAgMzAsICAgODUsICAgODQsCisgICAgICAgMjMsICAgMzAsICAgODMsICAgMjMsICAgOTYsICAgMjMsICAgMjUsICAgMjUsICAgMjUsICAgODIsCisgICAgICAgMjUsICAgOTMsICAgOTMsICAgOTMsICAgODEsICAgMjUsICAgMjUsICAgMjUsICAgMjUsICAgNTMsCiAKLSAgICAgICA3NywgICA3NiwgICA3NCwgICA3MywgICA3MiwgICA3MCwgICA2NywgICA2NiwgICA2NSwgICA2MywKLSAgICAgICA2MSwgICA2OCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwKLSAgICAgICA5NSwgICA0MywgICA0MiwgICA5NSwgICA5NSwgICA5NSwgICA5NiwgICA0MSwgICA5NiwgICA5NywKLSAgICAgICA5NywgICA5NywgICA5NywgICA5NywgICA5NywgICA5NywgICA5NywgICA5OCwgICA0MCwgICA5OCwKLSAgICAgICA5OSwgICAzOSwgICA5OSwgICAzOCwgICA5OSwgICA5OSwgIDEwMCwgICAzNSwgIDEwMCwgIDEwMCwKLSAgICAgIDEwMCwgIDEwMCwgIDEwMSwgIDEwMSwgIDEwMSwgICAyMiwgIDEwMSwgIDEwMSwgIDEwMiwgICAyMSwKLSAgICAgIDEwMiwgIDEwMiwgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNSwgICAxMSwKLSAgICAgIDEwNSwgIDEwNiwgIDEwNiwgIDEwNiwgICAgMCwgIDEwNiwgIDEwNiwgICA5MywgICA5MywgICA5MywKLSAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5OCwgICA1MywgICA1MywgICA1MywgICA5NSwgICA5NSwgICA5NSwgICA4MCwgICA1MywgICA3OSwKKyAgICAgICA3OCwgICA3NywgICA3NiwgICA3NCwgICA5OCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNCwKKyAgICAgIDEwNCwgIDEwNCwgIDEwNCwgIDEwNSwgICA3MywgICA3MSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNiwKKyAgICAgICA3MCwgIDEwNiwgIDEwNywgICA2OSwgIDEwNywgIDEwOCwgICA2OCwgIDEwOCwgICA2NiwgIDEwOCwKKyAgICAgIDEwOCwgIDEwOSwgICA2NSwgIDEwOSwgIDEwOSwgIDEwOSwgIDEwOSwgIDExMCwgIDExMCwgIDExMCwKKyAgICAgICA2NCwgIDExMCwgIDExMCwgIDExMSwgICA2MywgIDExMSwgIDExMSwgIDExMiwgIDExMiwgIDExMiwKKyAgICAgIDExMiwgIDExMiwgIDExMiwgIDExMiwgIDExMiwgIDExMywgIDExMywgIDExMywgIDExMywgIDExMywKKyAgICAgIDExMywgIDExMywgIDExMywgIDExNCwgICA2MiwgIDExNCwgIDExNSwgIDExNSwgIDExNSwgICA2MSwKKyAgICAgIDExNSwgIDExNSwgIDExNiwgIDExNiwgIDExNiwgIDExNiwgIDExNiwgIDExNiwgIDExNiwgIDExNiwKKyAgICAgICA1OSwgICA0OSwgICA0MywgICA0MiwgICA0MSwgICA0MCwgICAzOSwgICAzOCwgICAzNSwgICAyMiwKIAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAotICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAotICAgICAgIDkzLCAgIDkzLCAgIDkzCisgICAgICAgMjEsICAgMTEsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCisgICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCisgICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCisgICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMKICAgICB9IDsKIAogLyogVGFibGUgb2YgYm9vbGVhbnMsIHRydWUgaWYgcnVsZSBjb3VsZCBtYXRjaCBlb2wuICovCiBzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfcnVsZV9jYW5fbWF0Y2hfZW9sWzIxXSA9CiAgICAgeyAgIDAsCi0wLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAKKzEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIAogICAgIDAsICAgICB9OwogCiBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKQEAgLTYwMCw3ICs2MDgsNyBAQAogCiAKIAotI2xpbmUgMzMgImR0Yy1sZXhlci5sIgorI2xpbmUgMzcgImR0Yy1sZXhlci5sIgogI2luY2x1ZGUgImR0Yy5oIgogI2luY2x1ZGUgInNyY3Bvcy5oIgogI2luY2x1ZGUgImR0Yy1wYXJzZXIudGFiLmgiCkBAIC02MjMsNyArNjMxLDEwIEBACiAJCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAogCQkJCUJFR0lOKFYxKTsgXAogCQkJfQotI2xpbmUgNjI3ICJkdGMtbGV4ZXIubGV4LmMiCisKK3N0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CitzdGF0aWMgaW50IHBvcF9pbnB1dF9maWxlKHZvaWQpOworI2xpbmUgNjM4ICJkdGMtbGV4ZXIubGV4LmMiCiAKICNkZWZpbmUgSU5JVElBTCAwCiAjZGVmaW5lIElOQ0xVREUgMQpAQCAtNjg1LDcgKzY5Niw3IEBACiAvKiBUaGlzIHVzZWQgdG8gYmUgYW4gZnB1dHMoKSwgYnV0IHNpbmNlIHRoZSBzdHJpbmcgbWlnaHQgY29udGFpbiBOVUwncywKICAqIHdlIG5vdyB1c2UgZndyaXRlKCkuCiAgKi8KLSNkZWZpbmUgRUNITyAodm9pZCkgZndyaXRlKCB5eXRleHQsIHl5bGVuZywgMSwgeXlvdXQgKQorI2RlZmluZSBFQ0hPIGZ3cml0ZSggeXl0ZXh0LCB5eWxlbmcsIDEsIHl5b3V0ICkKICNlbmRpZgogCiAvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCkBAIC02OTYsNyArNzA3LDcgQEAKIAlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgKSBcCiAJCXsgXAogCQlpbnQgYyA9ICcqJzsgXAotCQlzaXplX3QgbjsgXAorCQlpbnQgbjsgXAogCQlmb3IgKCBuID0gMDsgbiA8IG1heF9zaXplICYmIFwKIAkJCSAgICAgKGMgPSBnZXRjKCB5eWluICkpICE9IEVPRiAmJiBjICE9ICdcbic7ICsrbiApIFwKIAkJCWJ1ZltuXSA9IChjaGFyKSBjOyBcCkBAIC03NzgsOSArNzg5LDkgQEAKIAlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOwogCXJlZ2lzdGVyIGludCB5eV9hY3Q7CiAgICAgCi0jbGluZSA1NyAiZHRjLWxleGVyLmwiCisjbGluZSA2NCAiZHRjLWxleGVyLmwiCiAKLSNsaW5lIDc4NCAiZHRjLWxleGVyLmxleC5jIgorI2xpbmUgNzk1ICJkdGMtbGV4ZXIubGV4LmMiCiAKIAlpZiAoICEoeXlfaW5pdCkgKQogCQl7CkBAIC04MzMsMTMgKzg0NCwxMyBAQAogCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQogCQkJCXsKIAkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCisJCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCiAJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJCX0KIAkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJKyt5eV9jcDsKIAkJCX0KLQkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDI4OCApOworCQl3aGlsZSAoIHl5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gIT0gMzAzICk7CiAKIHl5X2ZpbmRfYWN0aW9uOgogCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CkBAIC04NzQsMjAgKzg4NSwxMyBAQAogCQkJZ290byB5eV9maW5kX2FjdGlvbjsKIAogY2FzZSAxOgorLyogcnVsZSAxIGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDU4ICJkdGMtbGV4ZXIubCIKLUJFR0lOKElOQ0xVREUpOwotCVlZX0JSRUFLCi1jYXNlIDI6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSA2MCAiZHRjLWxleGVyLmwiCisjbGluZSA2NSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eXRleHRbc3RybGVuKHl5dGV4dCkgLSAxXSA9IDA7Ci0JCQlpZiAoIXB1c2hfaW5wdXRfZmlsZSh5eXRleHQgKyAxKSkgewotCQkJCS8qIFNvbWUgdW5yZWNvdmVyYWJsZSBlcnJvci4qLwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCQlCRUdJTl9ERUZBVUxUKCk7CisJCQljaGFyICpuYW1lID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykgKyAxOworCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CisJCQlwdXNoX2lucHV0X2ZpbGUobmFtZSk7CiAJCX0KIAlZWV9CUkVBSwogY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6CkBAIC04OTUsMTkgKzg5OSwxOSBAQAogY2FzZSBZWV9TVEFURV9FT0YoQllURVNUUklORyk6CiBjYXNlIFlZX1NUQVRFX0VPRihQUk9QTk9ERU5BTUUpOgogY2FzZSBZWV9TVEFURV9FT0YoVjEpOgotI2xpbmUgNzAgImR0Yy1sZXhlci5sIgorI2xpbmUgNzEgImR0Yy1sZXhlci5sIgogewogCQkJaWYgKCFwb3BfaW5wdXRfZmlsZSgpKSB7CiAJCQkJeXl0ZXJtaW5hdGUoKTsKIAkJCX0KIAkJfQogCVlZX0JSRUFLCi1jYXNlIDM6Ci0vKiBydWxlIDMgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAyOgorLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDc2ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDc3ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCkBAIC05MTYsMTEgKzkyMCwxMSBAQAogCQkJcmV0dXJuIERUX1NUUklORzsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDQ6CitjYXNlIDM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSA4NiAiZHRjLWxleGVyLmwiCisjbGluZSA4NyAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKQEAgLTkyOCwyMiArOTMyLDIyIEBACiAJCQlyZXR1cm4gRFRfVjE7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSA1OgorY2FzZSA0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgOTUgImR0Yy1sZXhlci5sIgorI2xpbmUgOTYgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvbWVtcmVzZXJ2ZS9cbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuIERUX01FTVJFU0VSVkU7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSA2OgorY2FzZSA1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTAzICJkdGMtbGV4ZXIubCIKKyNsaW5lIDEwNCAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkxhYmVsOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5sYWJlbHJlZiA9IHN0cmR1cCh5eXRleHQpOwpAQCAtOTUxLDExICs5NTUsMTEgQEAKIAkJCXJldHVybiBEVF9MQUJFTDsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDc6CitjYXNlIDY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxMTIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTEzICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCWlmICgqeXl0ZXh0ID09ICdiJykKIAkJCQl5eWx2YWwuY2Jhc2UgPSAyOwpAQCAtOTY5LDQ0ICs5NzMsNDQgQEAKIAkJCXJldHVybiBEVF9CQVNFOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgODoKK2Nhc2UgNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDEyNyAiZHRjLWxleGVyLmwiCisjbGluZSAxMjggImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKIAkJCURQUklOVCgiTGl0ZXJhbDogJyVzJ1xuIiwgeXlsdmFsLmxpdGVyYWwpOwogCQkJcmV0dXJuIERUX0xFR0FDWUxJVEVSQUw7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSA5OgorY2FzZSA4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTM1ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDEzNiAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZW51bSA9IHNyY3Bvc19maWxlbnVtOworCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKIAkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOwogCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7CiAJCQlyZXR1cm4gRFRfTElURVJBTDsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEwOgorY2FzZSA5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTQzICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE0NCAiZHRjLWxleGVyLmwiCiB7CS8qIGxhYmVsIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7CiAJCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDExOgorY2FzZSAxMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE1MSAiZHRjLWxleGVyLmwiCisjbGluZSAxNTIgImR0Yy1sZXhlci5sIgogewkvKiBuZXctc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMik7CkBAIC0xMDE0LDQ0ICsxMDE4LDQ0IEBACiAJCQlyZXR1cm4gRFRfUkVGOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTI6CitjYXNlIDExOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTYwICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE2MSAiZHRjLWxleGVyLmwiCiB7CS8qIG9sZC1zdHlsZSBwYXRoIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7CiAJCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEzOgorY2FzZSAxMjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE2OCAiZHRjLWxleGVyLmwiCisjbGluZSAxNjkgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJeXlsdmFsLmJ5dGUgPSBzdHJ0b2woeXl0ZXh0LCBOVUxMLCAxNik7CiAJCQlEUFJJTlQoIkJ5dGU6ICUwMnhcbiIsIChpbnQpeXlsdmFsLmJ5dGUpOwogCQkJcmV0dXJuIERUX0JZVEU7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNDoKK2Nhc2UgMTM6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNzYgImR0Yy1sZXhlci5sIgorI2xpbmUgMTc3ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07CisJCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwogCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiL0JZVEVTVFJJTkdcbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuICddJzsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDE1OgorY2FzZSAxNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NCAiZHRjLWxleGVyLmwiCisjbGluZSAxODUgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJQcm9wTm9kZU5hbWU6ICVzXG4iLCB5eXRleHQpOwogCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHN0cmR1cCh5eXRleHQpOwpAQCAtMTA1OSwzNCArMTA2MywzOSBAQAogCQkJcmV0dXJuIERUX1BST1BOT0RFTkFNRTsKIAkJfQogCVlZX0JSRUFLCitjYXNlIDE1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgMTk0ICJkdGMtbGV4ZXIubCIKK3sKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CisJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOworCQkJRFBSSU5UKCJCaW5hcnkgSW5jbHVkZVxuIik7CisJCQlyZXR1cm4gRFRfSU5DQklOOworCQl9CisJWVlfQlJFQUsKIGNhc2UgMTY6CiAvKiBydWxlIDE2IGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5NCAiZHRjLWxleGVyLmwiCisjbGluZSAyMDEgImR0Yy1sZXhlci5sIgogLyogZWF0IHdoaXRlc3BhY2UgKi8KIAlZWV9CUkVBSwogY2FzZSAxNzoKIC8qIHJ1bGUgMTcgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTk2ICJkdGMtbGV4ZXIubCIKLXsKLQkJCXl5bGxvYy5maWxlbnVtID0gc3JjcG9zX2ZpbGVudW07Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJRFBSSU5UKCJDb21tZW50OiAlc1xuIiwgeXl0ZXh0KTsKLQkJCS8qIGVhdCBjb21tZW50cyAqLwotCQl9CisjbGluZSAyMDIgImR0Yy1sZXhlci5sIgorLyogZWF0IEMtc3R5bGUgY29tbWVudHMgKi8KIAlZWV9CUkVBSwogY2FzZSAxODoKIC8qIHJ1bGUgMTggY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAogI2xpbmUgMjAzICJkdGMtbGV4ZXIubCIKLS8qIGVhdCBsaW5lIGNvbW1lbnRzICovCisvKiBlYXQgQysrLXN0eWxlIGNvbW1lbnRzICovCiAJWVlfQlJFQUsKIGNhc2UgMTk6CiBZWV9SVUxFX1NFVFVQCiAjbGluZSAyMDUgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKKwkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7CiAJCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJDaGFyOiAlYyAoXFx4JTAyeClcbiIsIHl5dGV4dFswXSwKIAkJCQkodW5zaWduZWQpeXl0ZXh0WzBdKTsKQEAgLTExMDcsNyArMTExNiw3IEBACiAjbGluZSAyMjIgImR0Yy1sZXhlci5sIgogRUNITzsKIAlZWV9CUkVBSwotI2xpbmUgMTExMSAiZHRjLWxleGVyLmxleC5jIgorI2xpbmUgMTEyMCAiZHRjLWxleGVyLmxleC5jIgogCiAJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgogCQl7CkBAIC0xMzYwLDYgKzEzNjksMTQgQEAKIAllbHNlCiAJCXJldF92YWwgPSBFT0JfQUNUX0NPTlRJTlVFX1NDQU47CiAKKwlpZiAoKHl5X3NpemVfdCkgKCh5eV9uX2NoYXJzKSArIG51bWJlcl90b19tb3ZlKSA+IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUpIHsKKwkJLyogRXh0ZW5kIHRoZSBhcnJheSBieSA1MCUsIHBsdXMgdGhlIG51bWJlciB3ZSByZWFsbHkgbmVlZC4gKi8KKwkJeXlfc2l6ZV90IG5ld19zaXplID0gKHl5X25fY2hhcnMpICsgbnVtYmVyX3RvX21vdmUgKyAoKHl5X25fY2hhcnMpID4+IDEpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiA9IChjaGFyICopIHl5cmVhbGxvYygodm9pZCAqKSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZixuZXdfc2l6ZSAgKTsKKwkJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2dldF9uZXh0X2J1ZmZlcigpIiApOworCX0KKwogCSh5eV9uX2NoYXJzKSArPSBudW1iZXJfdG9fbW92ZTsKIAlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwogCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwpAQCAtMTM4OSw3ICsxNDA2LDcgQEAKIAkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQogCQkJewogCQkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKLQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCisJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTA0ICkKIAkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKIAkJCX0KIAkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CkBAIC0xNDE3LDExICsxNDM0LDExIEBACiAJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQogCQl7CiAJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCisJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSAxMDQgKQogCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CiAJCX0KIAl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKLQl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA9PSA5Myk7CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gMTAzKTsKIAogCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKIH0KQEAgLTE3NDMsNyArMTc2MCw5IEBACiAJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil5eWFsbG9jCiAJCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCiAJCQkJCQkJCSk7Ci0JCQorCQlpZiAoICEgKHl5X2J1ZmZlcl9zdGFjaykgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXllbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7CisJCQkJCQkJCSAgCiAJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSwgMCwgbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CiAJCQkJCiAJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKQEAgLTE3NjEsNiArMTc4MCw4IEBACiAJCQkJCQkJCSgoeXlfYnVmZmVyX3N0YWNrKSwKIAkJCQkJCQkJbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQogCQkJCQkJCQkpOworCQlpZiAoICEgKHl5X2J1ZmZlcl9zdGFjaykgKQorCQkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXllbnN1cmVfYnVmZmVyX3N0YWNrKCkiICk7CiAKIAkJLyogemVybyBvbmx5IHRoZSBuZXcgc2xvdHMuKi8KIAkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spICsgKHl5X2J1ZmZlcl9zdGFja19tYXgpLCAwLCBncm93X3NpemUgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKQEAgLTIwNzIsMTQgKzIwOTMsMTMgQEAKICAqLwogCiBzdHJ1Y3QgaW5jbF9maWxlIHsKLQlpbnQgZmlsZW51bTsKLQlGSUxFICpmaWxlOworCXN0cnVjdCBkdGNfZmlsZSAqZmlsZTsKIAlZWV9CVUZGRVJfU1RBVEUgeXlfcHJldl9idWY7CiAJaW50IHl5X3ByZXZfbGluZW5vOwogCXN0cnVjdCBpbmNsX2ZpbGUgKnByZXY7CiB9OwogCi1zdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7CitzdGF0aWMgc3RydWN0IGluY2xfZmlsZSAqaW5jbF9maWxlX3N0YWNrOwogCiAKIC8qCkBAIC0yMDkwLDM2ICsyMTEwLDM0IEBACiBzdGF0aWMgaW50IGluY2xfZGVwdGggPSAwOwogCiAKLWludCBwdXNoX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCitzdGF0aWMgdm9pZCBwdXNoX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JRklMRSAqZjsKIAlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7CisJc3RydWN0IGR0Y19maWxlICpuZXdmaWxlOworCXN0cnVjdCBzZWFyY2hfcGF0aCBzZWFyY2gsICpzZWFyY2hwdHIgPSBOVUxMOwogCi0JaWYgKCFmaWxlbmFtZSkgewotCQl5eWVycm9yKCJObyBpbmNsdWRlIGZpbGUgbmFtZSBnaXZlbi4iKTsKLQkJcmV0dXJuIDA7CisJYXNzZXJ0KGZpbGVuYW1lKTsKKworCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpCisJCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKworCWlmIChzcmNwb3NfZmlsZSkgeworCQlzZWFyY2guZGlyID0gc3JjcG9zX2ZpbGUtPmRpcjsKKwkJc2VhcmNoLm5leHQgPSBOVUxMOworCQlzZWFyY2gucHJldiA9IE5VTEw7CisJCXNlYXJjaHB0ciA9ICZzZWFyY2g7CiAJfQogCi0JaWYgKGluY2xfZGVwdGgrKyA+PSBNQVhfSU5DTFVERV9ERVBUSCkgewotCQl5eWVycm9yKCJJbmNsdWRlcyBuZXN0ZWQgdG9vIGRlZXBseSIpOwotCQlyZXR1cm4gMDsKLQl9CisJbmV3ZmlsZSA9IGR0Y19vcGVuX2ZpbGUoZmlsZW5hbWUsIHNlYXJjaHB0cik7CiAKLQlmID0gZHRjX29wZW5fZmlsZShmaWxlbmFtZSk7Ci0KLQlpbmNsX2ZpbGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbmNsX2ZpbGUpKTsKLQlpZiAoIWluY2xfZmlsZSkgewotCQl5eWVycm9yKCJDYW4gbm90IGFsbG9jYXRlIGluY2x1ZGUgZmlsZSBzcGFjZS4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWluY2xfZmlsZSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbmNsX2ZpbGUpKTsKIAogCS8qCiAJICogU2F2ZSBjdXJyZW50IGNvbnRleHQuCiAJICovCiAJaW5jbF9maWxlLT55eV9wcmV2X2J1ZiA9IFlZX0NVUlJFTlRfQlVGRkVSOwogCWluY2xfZmlsZS0+eXlfcHJldl9saW5lbm8gPSB5eWxpbmVubzsKLQlpbmNsX2ZpbGUtPmZpbGVudW0gPSBzcmNwb3NfZmlsZW51bTsKLQlpbmNsX2ZpbGUtPmZpbGUgPSB5eWluOworCWluY2xfZmlsZS0+ZmlsZSA9IHNyY3Bvc19maWxlOwogCWluY2xfZmlsZS0+cHJldiA9IGluY2xfZmlsZV9zdGFjazsKIAogCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZTsKQEAgLTIxMjcsMjMgKzIxNDUsMjEgQEAKIAkvKgogCSAqIEVzdGFibGlzaCBuZXcgY29udGV4dC4KIAkgKi8KLQlzcmNwb3NfZmlsZW51bSA9IGxvb2t1cF9maWxlX25hbWUoZmlsZW5hbWUsIDApOworCXNyY3Bvc19maWxlID0gbmV3ZmlsZTsKIAl5eWxpbmVubyA9IDE7Ci0JeXlpbiA9IGY7CisJeXlpbiA9IG5ld2ZpbGUtPmZpbGU7CiAJeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUpKTsKLQotCXJldHVybiAxOwogfQogCiAKLWludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQorc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewogCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKIAogCWlmIChpbmNsX2ZpbGVfc3RhY2sgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlmY2xvc2UoeXlpbik7CisJZHRjX2Nsb3NlX2ZpbGUoc3JjcG9zX2ZpbGUpOwogCiAJLyoKIAkgKiBQb3AuCkBAIC0yMTU4LDE3ICsyMTc0LDE0IEBACiAJeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CiAJeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmKTsKIAl5eWxpbmVubyA9IGluY2xfZmlsZS0+eXlfcHJldl9saW5lbm87Ci0Jc3JjcG9zX2ZpbGVudW0gPSBpbmNsX2ZpbGUtPmZpbGVudW07Ci0JeXlpbiA9IGluY2xfZmlsZS0+ZmlsZTsKKwlzcmNwb3NfZmlsZSA9IGluY2xfZmlsZS0+ZmlsZTsKKwl5eWluID0gaW5jbF9maWxlLT5maWxlID8gaW5jbF9maWxlLT5maWxlLT5maWxlIDogTlVMTDsKIAogCS8qCiAJICogRnJlZSBvbGQgc3RhdGUuCiAJICovCiAJZnJlZShpbmNsX2ZpbGUpOwogCi0JaWYgKFlZX0NVUlJFTlRfQlVGRkVSID09IDApCi0JCXJldHVybiAwOwotCiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKaW5kZXggMjhlNmVjMC4uMjcxMjkzNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKQEAgLTc1LDcgKzc1LDggQEAKICAgICAgRFRfQllURSA9IDI2NCwKICAgICAgRFRfU1RSSU5HID0gMjY1LAogICAgICBEVF9MQUJFTCA9IDI2NiwKLSAgICAgRFRfUkVGID0gMjY3CisgICAgIERUX1JFRiA9IDI2NywKKyAgICAgRFRfSU5DQklOID0gMjY4CiAgICB9OwogI2VuZGlmCiAvKiBUb2tlbnMuICAqLwpAQCAtODksNiArOTAsNyBAQAogI2RlZmluZSBEVF9TVFJJTkcgMjY1CiAjZGVmaW5lIERUX0xBQkVMIDI2NgogI2RlZmluZSBEVF9SRUYgMjY3CisjZGVmaW5lIERUX0lOQ0JJTiAyNjgKIAogCiAKQEAgLTk2LDE0ICs5OCwxNyBAQAogLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCiAjbGluZSAyMyAiZHRjLXBhcnNlci55IgogCisjaW5jbHVkZSA8c3RkaW8uaD4KKwogI2luY2x1ZGUgImR0Yy5oIgogI2luY2x1ZGUgInNyY3Bvcy5oIgogCi1pbnQgeXlsZXgodm9pZCk7Ci11bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cyk7CitleHRlcm4gaW50IHl5bGV4KHZvaWQpOwogCiBleHRlcm4gc3RydWN0IGJvb3RfaW5mbyAqdGhlX2Jvb3RfaW5mbzsKK2V4dGVybiBpbnQgdHJlZXNvdXJjZV9lcnJvcjsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBldmFsX2xpdGVyYWwoY29uc3QgY2hhciAqcywgaW50IGJhc2UsIGludCBiaXRzKTsKIAogCiAvKiBFbmFibGluZyB0cmFjZXMuICAqLwpAQCAtMTI2LDE2ICsxMzEsMTYgQEAKIAogI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKLSNsaW5lIDM0ICJkdGMtcGFyc2VyLnkiCisjbGluZSAzNyAiZHRjLXBhcnNlci55IgogewogCWNoYXIgKnByb3Bub2RlbmFtZTsKIAljaGFyICpsaXRlcmFsOwogCWNoYXIgKmxhYmVscmVmOwogCXVuc2lnbmVkIGludCBjYmFzZTsKLQl1OCBieXRlOworCXVpbnQ4X3QgYnl0ZTsKIAlzdHJ1Y3QgZGF0YSBkYXRhOwogCi0JdTY0IGFkZHI7CisJdWludDY0X3QgYWRkcjsKIAljZWxsX3QgY2VsbDsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wbGlzdDsKQEAgLTE0NCw3ICsxNDksNyBAQAogCXN0cnVjdCByZXNlcnZlX2luZm8gKnJlOwogfQogLyogTGluZSAxODcgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDE0OCAiZHRjLXBhcnNlci50YWIuYyIKKyNsaW5lIDE1MyAiZHRjLXBhcnNlci50YWIuYyIKIAlZWVNUWVBFOwogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCkBAIC0xNjksNyArMTc0LDcgQEAKIAogCiAvKiBMaW5lIDIxNiBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTczICJkdGMtcGFyc2VyLnRhYi5jIgorI2xpbmUgMTc4ICJkdGMtcGFyc2VyLnRhYi5jIgogCiAjaWZkZWYgc2hvcnQKICMgdW5kZWYgc2hvcnQKQEAgLTM4NiwyMCArMzkxLDIwIEBACiAvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwogI2RlZmluZSBZWUZJTkFMICA5CiAvKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KLSNkZWZpbmUgWVlMQVNUICAgNjAKKyNkZWZpbmUgWVlMQVNUICAgNzMKIAogLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLwotI2RlZmluZSBZWU5UT0tFTlMgIDI0CisjZGVmaW5lIFlZTlRPS0VOUyAgMjcKIC8qIFlZTk5UUyAtLSBOdW1iZXIgb2Ygbm9udGVybWluYWxzLiAgKi8KICNkZWZpbmUgWVlOTlRTICAyMAogLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAgKi8KLSNkZWZpbmUgWVlOUlVMRVMgIDQzCisjZGVmaW5lIFlZTlJVTEVTICA0NQogLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHN0YXRlcy4gICovCi0jZGVmaW5lIFlZTlNUQVRFUyAgNjcKKyNkZWZpbmUgWVlOU1RBVEVTICA3NgogCiAvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KICNkZWZpbmUgWVlVTkRFRlRPSyAgMgotI2RlZmluZSBZWU1BWFVUT0sgICAyNjcKKyNkZWZpbmUgWVlNQVhVVE9LICAgMjY4CiAKICNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKICAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQpAQCAtNDExLDE1ICs0MTYsMTUgQEAKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAyMywgICAgMTQsICAgICAyLCAgICAxNSwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTMsCi0gICAgICAxOSwgICAgMTgsICAgIDIwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgIDI0LCAgICAyNiwgICAgIDIsICAgICAyLCAgICAyNSwgICAgMTUsICAgICAyLCAgICAxNiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTQsCisgICAgICAyMCwgICAgMTksICAgIDIxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgMjEsICAgICAyLCAgICAyMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAyMiwgICAgIDIsICAgIDIzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE2LCAgICAgMiwgICAgMTcsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTcsICAgICAyLCAgICAxOCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCkBAIC00MzMsNyArNDM4LDcgQEAKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKLSAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMgorICAgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMwogfTsKIAogI2lmIFlZREVCVUcKQEAgLTQ0MywzNyArNDQ4LDM5IEBACiB7CiAgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgOCwgICAgMTEsICAgIDEyLCAgICAxNSwgICAgMjEsICAgIDIyLCAgICAyNSwKICAgICAgIDI3LCAgICAzNCwgICAgMzYsICAgIDM4LCAgICA0MSwgICAgNDcsICAgIDQ4LCAgICA1MSwgICAgNTcsICAgIDYxLAotICAgICAgNjQsICAgIDY5LCAgICA3NCwgICAgNzcsICAgIDgwLCAgICA4MSwgICAgODQsICAgIDg3LCAgICA4OCwgICAgOTEsCi0gICAgICA5NCwgICAgOTcsICAgIDk4LCAgIDEwMCwgICAxMDIsICAgMTA1LCAgIDEwNiwgICAxMDksICAgMTEyLCAgIDExMywKLSAgICAgMTE2LCAgIDExOSwgICAxMjMsICAgMTI0CisgICAgICA2NCwgICAgNjksICAgIDc0LCAgICA3NywgICAgODcsICAgIDkzLCAgICA5NiwgICAgOTcsICAgMTAwLCAgIDEwMywKKyAgICAgMTA0LCAgIDEwNywgICAxMTAsICAgMTEzLCAgIDExNCwgICAxMTYsICAgMTE4LCAgIDEyMSwgICAxMjIsICAgMTI1LAorICAgICAxMjgsICAgMTI5LCAgIDEzMiwgICAxMzUsICAgMTM5LCAgIDE0MAogfTsKIAogLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXJoc1tdID0KIHsKLSAgICAgIDI1LCAgICAgMCwgICAgLTEsICAgICAzLCAgICAxMywgICAgMjYsICAgIDMxLCAgICAtMSwgICAgMjgsICAgIDMxLAotICAgICAgLTEsICAgIC0xLCAgICAyNywgICAgMjYsICAgIC0xLCAgICA0MywgICAgIDQsICAgIDMwLCAgICAzMCwgICAgMTMsCi0gICAgICAtMSwgICAgLTEsICAgIDI5LCAgICAyOCwgICAgLTEsICAgIDI3LCAgICAtMSwgICAgNDMsICAgICA0LCAgICAzMCwKLSAgICAgIDE0LCAgICAzMCwgICAgMTMsICAgIC0xLCAgICAgNiwgICAgLTEsICAgICA3LCAgICAtMSwgICAgMTUsICAgIDMyLAotICAgICAgLTEsICAgIDE2LCAgICAzMywgICAgNDEsICAgIDE3LCAgICAxMywgICAgLTEsICAgIC0xLCAgICAzMywgICAgMzQsCi0gICAgICAtMSwgICAgNDMsICAgICA1LCAgICAxOCwgICAgMzUsICAgIDEzLCAgICAtMSwgICAgNDMsICAgICA1LCAgICAxMywKLSAgICAgIC0xLCAgICAzNiwgICAgMTAsICAgIC0xLCAgICAzNiwgICAgMTksICAgIDM3LCAgICAyMCwgICAgLTEsICAgIDM2LAotICAgICAgMjEsICAgIDQwLCAgICAyMiwgICAgLTEsICAgIDM2LCAgICAxMiwgICAgLTEsICAgIDM1LCAgICAxMSwgICAgLTEsCi0gICAgICAtMSwgICAgMzUsICAgIDIzLCAgICAtMSwgICAgMzYsICAgIDExLCAgICAtMSwgICAgLTEsICAgIDM3LCAgICAzOSwKLSAgICAgIC0xLCAgICAzNywgICAgMTIsICAgIC0xLCAgICAzNywgICAgMTEsICAgIC0xLCAgICAtMSwgICAgIDgsICAgIC0xLAotICAgICAgIDYsICAgIC0xLCAgICAzOCwgICAgIDcsICAgIC0xLCAgICAtMSwgICAgNDAsICAgICA5LCAgICAtMSwgICAgNDAsCi0gICAgICAxMSwgICAgLTEsICAgIC0xLCAgICA0MiwgICAgNDEsICAgIC0xLCAgICA0MiwgICAgMzQsICAgIC0xLCAgICA0MywKLSAgICAgICA1LCAgICAzMiwgICAgLTEsICAgIC0xLCAgICAxMSwgICAgLTEKKyAgICAgIDI4LCAgICAgMCwgICAgLTEsICAgICAzLCAgICAxNCwgICAgMjksICAgIDM0LCAgICAtMSwgICAgMzEsICAgIDM0LAorICAgICAgLTEsICAgIC0xLCAgICAzMCwgICAgMjksICAgIC0xLCAgICA0NiwgICAgIDQsICAgIDMzLCAgICAzMywgICAgMTQsCisgICAgICAtMSwgICAgLTEsICAgIDMyLCAgICAzMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgNDYsICAgICA0LCAgICAzMywKKyAgICAgIDE1LCAgICAzMywgICAgMTQsICAgIC0xLCAgICAgNiwgICAgLTEsICAgICA3LCAgICAtMSwgICAgMTYsICAgIDM1LAorICAgICAgLTEsICAgIDE3LCAgICAzNiwgICAgNDQsICAgIDE4LCAgICAxNCwgICAgLTEsICAgIC0xLCAgICAzNiwgICAgMzcsCisgICAgICAtMSwgICAgNDYsICAgICA1LCAgICAxOSwgICAgMzgsICAgIDE0LCAgICAtMSwgICAgNDYsICAgICA1LCAgICAxNCwKKyAgICAgIC0xLCAgICAzOSwgICAgMTAsICAgIC0xLCAgICAzOSwgICAgMjAsICAgIDQwLCAgICAyMSwgICAgLTEsICAgIDM5LAorICAgICAgMjIsICAgIDQzLCAgICAyMywgICAgLTEsICAgIDM5LCAgICAxMiwgICAgLTEsICAgIDM5LCAgICAxMywgICAgMjQsCisgICAgICAxMCwgICAgMjUsICAgIDMzLCAgICAyNSwgICAgMzMsICAgIDI2LCAgICAtMSwgICAgMzksICAgIDEzLCAgICAyNCwKKyAgICAgIDEwLCAgICAyNiwgICAgLTEsICAgIDM4LCAgICAxMSwgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMjUsICAgIC0xLAorICAgICAgMzksICAgIDExLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICA0MiwgICAgLTEsICAgIDQwLCAgICAxMiwgICAgLTEsCisgICAgICA0MCwgICAgMTEsICAgIC0xLCAgICAtMSwgICAgIDgsICAgIC0xLCAgICAgNiwgICAgLTEsICAgIDQxLCAgICAgNywKKyAgICAgIC0xLCAgICAtMSwgICAgNDMsICAgICA5LCAgICAtMSwgICAgNDMsICAgIDExLCAgICAtMSwgICAgLTEsICAgIDQ1LAorICAgICAgNDQsICAgIC0xLCAgICA0NSwgICAgMzcsICAgIC0xLCAgICA0NiwgICAgIDUsICAgIDM1LCAgICAtMSwgICAgLTEsCisgICAgICAxMSwgICAgLTEKIH07CiAKIC8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlybGluZVtdID0KIHsKLSAgICAgICAwLCAgICA4NSwgICAgODUsICAgIDg5LCAgICA5NywgICAxMDAsICAgMTA3LCAgIDExNSwgICAxMTgsICAgMTI1LAotICAgICAxMjksICAgMTM2LCAgIDE0MCwgICAxNDcsICAgMTU0LCAgIDE2MiwgICAxNjUsICAgMTcyLCAgIDE3NiwgICAxODMsCi0gICAgIDE4NywgICAxOTEsICAgMTk1LCAgIDE5OSwgICAyMDcsICAgMjEwLCAgIDIxNCwgICAyMjIsICAgMjI1LCAgIDIyOSwKLSAgICAgMjM0LCAgIDI0MiwgICAyNDUsICAgMjQ5LCAgIDI1MywgICAyNjEsICAgMjY0LCAgIDI2OCwgICAyNzYsICAgMjc5LAotICAgICAyODMsICAgMjkxLCAgIDI5OSwgICAzMDIKKyAgICAgICAwLCAgICA4OSwgICAgODksICAgIDkzLCAgIDEwMSwgICAxMDQsICAgMTExLCAgIDExOSwgICAxMjIsICAgMTI5LAorICAgICAxMzMsICAgMTQwLCAgIDE0NCwgICAxNTEsICAgMTU4LCAgIDE2NiwgICAxNjksICAgMTc2LCAgIDE4MCwgICAxODcsCisgICAgIDE5MSwgICAxOTUsICAgMTk5LCAgIDIwMywgICAyMjAsICAgMjMxLCAgIDIzOSwgICAyNDIsICAgMjQ2LCAgIDI1NCwKKyAgICAgMjU3LCAgIDI2MSwgICAyNjYsICAgMjc0LCAgIDI3NywgICAyODEsICAgMjg1LCAgIDI5MywgICAyOTYsICAgMzAwLAorICAgICAzMDgsICAgMzExLCAgIDMxNSwgICAzMjMsICAgMzMxLCAgIDMzNAogfTsKICNlbmRpZgogCkBAIC00ODQsMTIgKzQ5MSwxMiBAQAogewogICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIkRUX1YxIiwgIkRUX01FTVJFU0VSVkUiLAogICAiRFRfUFJPUE5PREVOQU1FIiwgIkRUX0xJVEVSQUwiLCAiRFRfTEVHQUNZTElURVJBTCIsICJEVF9CQVNFIiwKLSAgIkRUX0JZVEUiLCAiRFRfU1RSSU5HIiwgIkRUX0xBQkVMIiwgIkRUX1JFRiIsICInOyciLCAiJy0nIiwgIicvJyIsICIneyciLAotICAiJ30nIiwgIic9JyIsICInPCciLCAiJz4nIiwgIidbJyIsICInXSciLCAiJywnIiwgIiRhY2NlcHQiLCAic291cmNlZmlsZSIsCi0gICJtZW1yZXNlcnZlcyIsICJtZW1yZXNlcnZlIiwgInYwX21lbXJlc2VydmVzIiwgInYwX21lbXJlc2VydmUiLCAiYWRkciIsCi0gICJkZXZpY2V0cmVlIiwgIm5vZGVkZWYiLCAicHJvcGxpc3QiLCAicHJvcGRlZiIsICJwcm9wZGF0YSIsCi0gICJwcm9wZGF0YXByZWZpeCIsICJjZWxsbGlzdCIsICJjZWxsYmFzZSIsICJjZWxsdmFsIiwgImJ5dGVzdHJpbmciLAotICAic3Vibm9kZXMiLCAic3Vibm9kZSIsICJsYWJlbCIsIDAKKyAgIkRUX0JZVEUiLCAiRFRfU1RSSU5HIiwgIkRUX0xBQkVMIiwgIkRUX1JFRiIsICJEVF9JTkNCSU4iLCAiJzsnIiwgIictJyIsCisgICInLyciLCAiJ3snIiwgIid9JyIsICInPSciLCAiJzwnIiwgIic+JyIsICInWyciLCAiJ10nIiwgIicoJyIsICInLCciLAorICAiJyknIiwgIiRhY2NlcHQiLCAic291cmNlZmlsZSIsICJtZW1yZXNlcnZlcyIsICJtZW1yZXNlcnZlIiwKKyAgInYwX21lbXJlc2VydmVzIiwgInYwX21lbXJlc2VydmUiLCAiYWRkciIsICJkZXZpY2V0cmVlIiwgIm5vZGVkZWYiLAorICAicHJvcGxpc3QiLCAicHJvcGRlZiIsICJwcm9wZGF0YSIsICJwcm9wZGF0YXByZWZpeCIsICJjZWxsbGlzdCIsCisgICJjZWxsYmFzZSIsICJjZWxsdmFsIiwgImJ5dGVzdHJpbmciLCAic3Vibm9kZXMiLCAic3Vibm9kZSIsICJsYWJlbCIsIDAKIH07CiAjZW5kaWYKIApAQCAtNDk5LDE5ICs1MDYsMTkgQEAKIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQogewogICAgICAgIDAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjQsCi0gICAgIDI2NSwgICAyNjYsICAgMjY3LCAgICA1OSwgICAgNDUsICAgIDQ3LCAgIDEyMywgICAxMjUsICAgIDYxLCAgICA2MCwKLSAgICAgIDYyLCAgICA5MSwgICAgOTMsICAgIDQ0CisgICAgIDI2NSwgICAyNjYsICAgMjY3LCAgIDI2OCwgICAgNTksICAgIDQ1LCAgICA0NywgICAxMjMsICAgMTI1LCAgICA2MSwKKyAgICAgIDYwLCAgICA2MiwgICAgOTEsICAgIDkzLCAgICA0MCwgICAgNDQsICAgIDQxCiB9OwogIyBlbmRpZgogCiAvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMVtdID0KIHsKLSAgICAgICAwLCAgICAyNCwgICAgMjUsICAgIDI1LCAgICAyNiwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjgsICAgIDI5LAotICAgICAgMjksICAgIDMwLCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzMsICAgIDM0LCAgICAzNCwgICAgMzUsCi0gICAgICAzNSwgICAgMzUsICAgIDM1LCAgICAzNSwgICAgMzYsICAgIDM2LCAgICAzNiwgICAgMzcsICAgIDM3LCAgICAzNywKLSAgICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM5LCAgICAzOSwgICAgNDAsICAgIDQwLCAgICA0MCwgICAgNDEsICAgIDQxLAotICAgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDMKKyAgICAgICAwLCAgICAyNywgICAgMjgsICAgIDI4LCAgICAyOSwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzEsICAgIDMyLAorICAgICAgMzIsICAgIDMzLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzYsICAgIDM3LCAgICAzNywgICAgMzgsCisgICAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOSwgICAgMzksICAgIDM5LCAgICA0MCwKKyAgICAgIDQwLCAgICA0MCwgICAgNDAsICAgIDQxLCAgICA0MSwgICAgNDIsICAgIDQyLCAgICA0MywgICAgNDMsICAgIDQzLAorICAgICAgNDQsICAgIDQ0LCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NgogfTsKIAogLyogWVlSMltZWU5dIC0tIE51bWJlciBvZiBzeW1ib2xzIGNvbXBvc2luZyByaWdodCBoYW5kIHNpZGUgb2YgcnVsZSBZWU4uICAqLwpAQCAtNTE5LDkgKzUyNiw5IEBACiB7CiAgICAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgMSwKICAgICAgICA2LCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDMsICAgICAyLAotICAgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMiwKLSAgICAgICAyLCAgICAgMywgICAgIDAsICAgICAxCisgICAgICAgNCwgICAgIDQsICAgICAyLCAgICAgOSwgICAgIDUsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMCwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLAorICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAwLCAgICAgMQogfTsKIAogLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCkBAIC01MjksODEgKzUzNiw4NiBAQAogICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eWRlZmFjdFtdID0KIHsKLSAgICAgICA3LCAgICAgMCwgICAgNDMsICAgICAwLCAgICAgOSwgICAgIDAsICAgICA3LCAgICAgMCwgICAgIDQsICAgICAxLAorICAgICAgIDcsICAgICAwLCAgICA0NSwgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDcsICAgICAwLCAgICAgNCwgICAgIDEsCiAgICAgICAgMCwgICAgIDMsICAgICA4LCAgICAgMCwgICAgIDAsICAgICA0LCAgICAgMCwgICAgMTUsICAgIDEzLCAgICAxMSwKLSAgICAgIDEyLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMCwgICAgMzgsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE2LAotICAgICAgIDAsICAgIDM4LCAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDAsICAgIDM5LCAgICAgMCwgICAgMTAsCi0gICAgICAxNCwgICAgMTgsICAgIDI0LCAgICA0MSwgICAgIDAsICAgICAwLCAgICAyMywgICAgMTcsICAgIDI1LCAgICAxOSwKLSAgICAgIDI2LCAgICAyMiwgICAgMjcsICAgIDM1LCAgICAzMSwgICAgIDAsICAgIDMzLCAgICAzMiwgICAgMzAsICAgIDI5LAotICAgICAgMjAsICAgICAwLCAgICAyOCwgICAgMzYsICAgIDM3LCAgICAyMSwgICAgMzQKKyAgICAgIDEyLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMCwgICAgNDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE2LAorICAgICAgIDAsICAgIDQwLCAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDIsICAgIDQxLCAgICAgMCwgICAgMTAsCisgICAgICAxNCwgICAgMTgsICAgIDI2LCAgICA0MywgICAgIDAsICAgICAwLCAgICAyNSwgICAgMTcsICAgIDI3LCAgICAxOSwKKyAgICAgIDI4LCAgICAyMiwgICAgIDAsICAgIDI5LCAgICAzNywgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgIDM1LAorICAgICAgMzQsICAgIDMyLCAgICAzMSwgICAgMjAsICAgICAwLCAgICAzMCwgICAgMzgsICAgIDM5LCAgICAyMSwgICAgIDAsCisgICAgICAyNCwgICAgMzYsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzCiB9OwogCiAvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlkZWZnb3RvW10gPQogewogICAgICAgLTEsICAgICAzLCAgICAxNCwgICAgIDQsICAgICA1LCAgICAgNiwgICAgMjcsICAgIDExLCAgICAxOCwgICAgMjUsCi0gICAgICAyOSwgICAgNDQsICAgIDQ1LCAgICA1NCwgICAgNjEsICAgIDYyLCAgICA1NSwgICAgMzAsICAgIDMxLCAgICAgNworICAgICAgMjksICAgIDQ0LCAgICA0NSwgICAgNTYsICAgIDY0LCAgICA2NSwgICAgNTcsICAgIDMwLCAgICAzMSwgICAgIDcKIH07CiAKIC8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZwogICAgU1RBVEUtTlVNLiAgKi8KLSNkZWZpbmUgWVlQQUNUX05JTkYgLTEzCisjZGVmaW5lIFlZUEFDVF9OSU5GIC0xNAogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cGFjdFtdID0KIHsKLSAgICAgIDIzLCAgICAxMSwgICAtMTMsICAgIDM3LCAgIC0xMywgICAgLTQsICAgIDE4LCAgICAzOSwgICAgMTgsICAgLTEzLAotICAgICAgMjgsICAgLTEzLCAgIC0xMywgICAgMzQsICAgIC00LCAgICAxOCwgICAgNDEsICAgLTEzLCAgIC0xMywgICAtMTMsCi0gICAgIC0xMywgICAgMjUsICAgLTEzLCAgIC0xMywgICAgMzQsICAgIC0zLCAgICAzNCwgICAgMzMsICAgIDM0LCAgIC0xMywKLSAgICAgIDMwLCAgICAtMywgICAgNDMsICAgIDM2LCAgIC0xMywgICAgMzgsICAgLTEzLCAgIC0xMywgICAgMjAsICAgLTEzLAotICAgICAtMTMsICAgLTEzLCAgIC0xMywgICAtMTMsICAgICAyLCAgICAgOSwgICAtMTMsICAgLTEzLCAgIC0xMywgICAtMTMsCi0gICAgIC0xMywgICAtMTMsICAgLTEzLCAgIC0xMywgICAgLTIsICAgIC02LCAgIC0xMywgICAtMTMsICAgLTEzLCAgIC0xMywKLSAgICAgLTEzLCAgICA0NSwgICAtMTMsICAgLTEzLCAgIC0xMywgICAtMTMsICAgLTEzCisgICAgICAzMCwgICAtMTEsICAgLTE0LCAgICAgNywgICAtMTQsICAgIC0xLCAgICAyNywgICAgMTMsICAgIDI3LCAgIC0xNCwKKyAgICAgICA4LCAgIC0xNCwgICAtMTQsICAgIDQwLCAgICAtMSwgICAgMjcsICAgIDM1LCAgIC0xNCwgICAtMTQsICAgLTE0LAorICAgICAtMTQsICAgIDIxLCAgIC0xNCwgICAtMTQsICAgIDQwLCAgICAyNCwgICAgNDAsICAgIDI4LCAgICA0MCwgICAtMTQsCisgICAgICAzMiwgICAgMjQsICAgIDQ2LCAgICAzOCwgICAtMTQsICAgIDM5LCAgIC0xNCwgICAtMTQsICAgIDI2LCAgIC0xNCwKKyAgICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgICAtOSwgICAgMTAsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LAorICAgICAtMTQsICAgLTE0LCAgICAzMSwgICAtMTQsICAgLTE0LCAgICA0NCwgICAgLTIsICAgICAzLCAgICAyMywgICAtMTQsCisgICAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNTAsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgICA0MCwKKyAgICAgLTE0LCAgIC0xNCwgICAgMzMsICAgIDQwLCAgICAzNiwgICAtMTQKIH07CiAKIC8qIFlZUEdPVE9bTlRFUk0tTlVNXS4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwZ290b1tdID0KIHsKLSAgICAgLTEzLCAgIC0xMywgICAgMzUsICAgIDI3LCAgICA0NywgICAtMTMsICAgLTEyLCAgICA0MCwgICAgMTcsICAgLTEzLAotICAgICAgMjYsICAgLTEzLCAgIC0xMywgICAtMTMsICAgLTEzLCAgIC0xMywgICAtMTMsICAgIDI5LCAgIC0xMywgICAgLTgKKyAgICAgLTE0LCAgIC0xNCwgICAgNDgsICAgIDI5LCAgICA1MywgICAtMTQsICAgLTEzLCAgICA0NywgICAgMzQsICAgLTE0LAorICAgICAgMzcsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgIDQyLCAgIC0xNCwgICAgLTcKIH07CiAKIC8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgogICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCiAgICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgogICAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLwotI2RlZmluZSBZWVRBQkxFX05JTkYgLTQzCisjZGVmaW5lIFlZVEFCTEVfTklORiAtNDUKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXRhYmxlW10gPQogewotICAgICAgMTYsICAgIDIxLCAgIC00MiwgICAgNjMsICAgIDU2LCAgICA2NCwgICAgNTcsICAgIDE2LCAgICAgMiwgICAgNTgsCi0gICAgICA1OSwgICAgMTAsICAgIDI4LCAgICA0NiwgICAgMzMsICAgIDQ3LCAgICA2NSwgICAgMzIsICAgIDYwLCAgICA0OSwKLSAgICAgIDUwLCAgICA1MSwgICAtNDIsICAgIDMyLCAgICAgOCwgICAgNDgsICAgICAxLCAgIC00MiwgICAgNTIsICAgICAyLAotICAgICAgNTMsICAgIDE5LCAgICAyMCwgICAgNDEsICAgICAyLCAgICAxNSwgICAgMTcsICAgICA5LCAgICA0MiwgICAgMjYsCi0gICAgICAxOSwgICAgMjAsICAgIDE1LCAgICAxMywgICAgMTcsICAgIDI0LCAgICAzNCwgICAgMzUsICAgIDM4LCAgICAzOSwKLSAgICAgIDIzLCAgICA0MCwgICAgNjYsICAgIDEyLCAgICAyMiwgICAgNDMsICAgICAwLCAgICAzNiwgICAgIDAsICAgICAwLAotICAgICAgMzcKKyAgICAgIDIxLCAgICAxNiwgICAgNDYsICAgICA4LCAgICA1OSwgICAgNDcsICAgIDYwLCAgICAgOSwgICAgMTYsICAgIDYxLAorICAgICAgNjIsICAgIDI4LCAgICA2NiwgICAgMzMsICAgIDY3LCAgICAxMCwgICAgNDgsICAgIDEzLCAgICAzMiwgICAgNjMsCisgICAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgMzIsICAgIDE3LCAgICA2OCwgICAgMTksICAgIDIwLCAgIC00NCwKKyAgICAgIDUzLCAgIC00NCwgICAgNTQsICAgICAxLCAgIC00NCwgICAgIDIsICAgIDI2LCAgICAxNSwgICAgIDIsICAgIDI0LAorICAgICAgNDEsICAgICAyLCAgICAzNCwgICAgMTcsICAgIDE1LCAgICA0MiwgICAgMTksICAgIDIwLCAgICA2OSwgICAgNzAsCisgICAgICAzNSwgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNTgsICAgIDU1LCAgICA3MiwgICAgNzEsICAgIDczLCAgICAxMiwKKyAgICAgIDc0LCAgICAyMiwgICAgNzUsICAgIDIzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzYsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICA0MywgICAgMzcKIH07CiAKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eWNoZWNrW10gPQogewotICAgICAgIDgsICAgIDEzLCAgICAgNSwgICAgIDksICAgICA2LCAgICAxMSwgICAgIDgsICAgIDE1LCAgICAxMSwgICAgMTEsCi0gICAgICAxMiwgICAgMTUsICAgIDI0LCAgICAxMSwgICAgMjYsICAgIDEzLCAgICAyMiwgICAgMjUsICAgIDIwLCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgIDQsICAgIDMxLCAgICAxMywgICAgMjMsICAgICAzLCAgICAgNCwgICAgMTksICAgIDExLAotICAgICAgMjEsICAgICA2LCAgICAgNywgICAgMTMsICAgIDExLCAgICAgOCwgICAgMTYsICAgICAwLCAgICAxOCwgICAgMTQsCi0gICAgICAgNiwgICAgIDcsICAgIDE1LCAgICAgNCwgICAgMTYsICAgICA0LCAgICAxMywgICAgMTcsICAgICA1LCAgICAxMywKLSAgICAgIDE1LCAgICAxMywgICAgIDcsICAgICA2LCAgICAxNCwgICAgMzgsICAgIC0xLCAgICAzMSwgICAgLTEsICAgIC0xLAotICAgICAgMzEKKyAgICAgIDEzLCAgICAgOCwgICAgMTEsICAgIDE0LCAgICAgNiwgICAgMTQsICAgICA4LCAgICAgMCwgICAgMTUsICAgIDExLAorICAgICAgMTIsICAgIDI0LCAgICAgOSwgICAgMjYsICAgIDExLCAgICAxNiwgICAgMjUsICAgICA0LCAgICAyNSwgICAgMjEsCisgICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMzEsICAgIDE3LCAgICAyMywgICAgIDYsICAgICA3LCAgICAgNSwKKyAgICAgIDIwLCAgICAgNCwgICAgMjIsICAgICAzLCAgICAgNCwgICAgMTEsICAgIDE1LCAgICAgOCwgICAgMTEsICAgICA0LAorICAgICAgMTQsICAgIDExLCAgICAxNCwgICAgMTcsICAgIDE1LCAgICAxOSwgICAgIDYsICAgICA3LCAgICAyNSwgICAgMjYsCisgICAgICAxOCwgICAgIDUsICAgIDE0LCAgICAxNCwgICAgMTAsICAgIDI0LCAgICA2OSwgICAgIDcsICAgIDI1LCAgICAgNiwKKyAgICAgIDczLCAgICAxNCwgICAgMjYsICAgIDE1LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLAorICAgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMzEKIH07CiAKIC8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCiAgICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlzdG9zW10gPQogewotICAgICAgIDAsICAgICAzLCAgICAxMSwgICAgMjUsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDQzLCAgICAxMywgICAgIDAsCi0gICAgICAxNSwgICAgMzEsICAgIDI4LCAgICAgNCwgICAgMjYsICAgIDI3LCAgICA0MywgICAgMTYsICAgIDMyLCAgICAgNiwKLSAgICAgICA3LCAgICAzMCwgICAgMzEsICAgIDI2LCAgICAgNCwgICAgMzMsICAgIDE0LCAgICAzMCwgICAgMzAsICAgIDM0LAotICAgICAgNDEsICAgIDQyLCAgICA0MywgICAgMzAsICAgIDEzLCAgICAxNywgICAgMzQsICAgIDQxLCAgICAgNSwgICAgMTMsCi0gICAgICAxMywgICAgMTMsICAgIDE4LCAgICAzMiwgICAgMzUsICAgIDM2LCAgICAxMSwgICAgMTMsICAgIDIzLCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgMTksICAgIDIxLCAgICAzNywgICAgNDAsICAgICA2LCAgICAgOCwgICAgMTEsICAgIDEyLAotICAgICAgMjAsICAgIDM4LCAgICAzOSwgICAgIDksICAgIDExLCAgICAyMiwgICAgIDcKKyAgICAgICAwLCAgICAgMywgICAgMTEsICAgIDI4LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICA0NiwgICAgMTQsICAgICAwLAorICAgICAgMTYsICAgIDM0LCAgICAzMSwgICAgIDQsICAgIDI5LCAgICAzMCwgICAgNDYsICAgIDE3LCAgICAzNSwgICAgIDYsCisgICAgICAgNywgICAgMzMsICAgIDM0LCAgICAyOSwgICAgIDQsICAgIDM2LCAgICAxNSwgICAgMzMsICAgIDMzLCAgICAzNywKKyAgICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDMzLCAgICAxNCwgICAgMTgsICAgIDM3LCAgICA0NCwgICAgIDUsICAgIDE0LAorICAgICAgMTQsICAgIDE0LCAgICAxOSwgICAgMzUsICAgIDM4LCAgICAzOSwgICAgMTEsICAgIDE0LCAgICAyNSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAyMCwgICAgMjIsICAgIDI0LCAgICA0MCwgICAgNDMsICAgIDEwLCAgICAgNiwKKyAgICAgICA4LCAgICAxMSwgICAgMTIsICAgIDIxLCAgICA0MSwgICAgNDIsICAgICA5LCAgICAxMSwgICAgMjMsICAgIDI1LAorICAgICAgMjYsICAgICA3LCAgICAzMywgICAgMjUsICAgIDMzLCAgICAyNgogfTsKIAogI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQpAQCAtMTQ0MCwyODkgKzE0NTIsMzIzIEBACiAgIHN3aXRjaCAoeXluKQogICAgIHsKICAgICAgICAgY2FzZSAyOgotI2xpbmUgODYgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDkwICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygoeXl2c3BbKDMpIC0gKDQpXS5yZSksICh5eXZzcFsoNCkgLSAoNCldLm5vZGUpKTsKKwkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oKHl5dnNwWygzKSAtICg0KV0ucmUpLCAoeXl2c3BbKDQpIC0gKDQpXS5ub2RlKSwgMCk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzOgotI2xpbmUgOTAgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDk0ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygoeXl2c3BbKDEpIC0gKDIpXS5yZSksICh5eXZzcFsoMikgLSAoMildLm5vZGUpKTsKKwkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKSwgMCk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0OgotI2xpbmUgOTcgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDEwMSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5yZSkgPSBOVUxMOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNToKLSNsaW5lIDEwMSAiZHRjLXBhcnNlci55IgorI2xpbmUgMTA1ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjoKLSNsaW5lIDEwOCAiZHRjLXBhcnNlci55IgorI2xpbmUgMTEyICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnJlKSA9IGJ1aWxkX3Jlc2VydmVfZW50cnkoKHl5dnNwWygzKSAtICg1KV0uYWRkciksICh5eXZzcFsoNCkgLSAoNSldLmFkZHIpLCAoeXl2c3BbKDEpIC0gKDUpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzoKLSNsaW5lIDExNSAiZHRjLXBhcnNlci55IgorI2xpbmUgMTE5ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnJlKSA9IE5VTEw7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4OgotI2xpbmUgMTE5ICJkdGMtcGFyc2VyLnkiCisjbGluZSAxMjMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucmUpID0gY2hhaW5fcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDEpIC0gKDIpXS5yZSksICh5eXZzcFsoMikgLSAoMildLnJlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5OgotI2xpbmUgMTI2ICJkdGMtcGFyc2VyLnkiCisjbGluZSAxMzAgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucmUpID0gKHl5dnNwWygxKSAtICgxKV0ucmUpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA6Ci0jbGluZSAxMzAgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDEzNCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5yZSkgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMykgLSAoNildLmFkZHIpLCAoeXl2c3BbKDUpIC0gKDYpXS5hZGRyKSAtICh5eXZzcFsoMykgLSAoNildLmFkZHIpICsgMSwgKHl5dnNwWygxKSAtICg2KV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDExOgotI2xpbmUgMTM3ICJkdGMtcGFyc2VyLnkiCisjbGluZSAxNDEgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuYWRkcikgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDAsIDY0KTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDEyOgotI2xpbmUgMTQxICJkdGMtcGFyc2VyLnkiCisjbGluZSAxNDUgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuYWRkcikgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDE2LCA2NCk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzoKLSNsaW5lIDE0OCAiZHRjLXBhcnNlci55IgorI2xpbmUgMTUyICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLm5vZGUpID0gbmFtZV9ub2RlKCh5eXZzcFsoMikgLSAoMildLm5vZGUpLCAiIiwgTlVMTCk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNDoKLSNsaW5lIDE1NSAiZHRjLXBhcnNlci55IgorI2xpbmUgMTU5ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLm5vZGUpID0gYnVpbGRfbm9kZSgoeXl2c3BbKDIpIC0gKDUpXS5wcm9wbGlzdCksICh5eXZzcFsoMykgLSAoNSldLm5vZGVsaXN0KSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNToKLSNsaW5lIDE2MiAiZHRjLXBhcnNlci55IgorI2xpbmUgMTY2ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnByb3BsaXN0KSA9IE5VTEw7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNjoKLSNsaW5lIDE2NiAiZHRjLXBhcnNlci55IgorI2xpbmUgMTcwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLnByb3BsaXN0KSA9IGNoYWluX3Byb3BlcnR5KCh5eXZzcFsoMikgLSAoMildLnByb3ApLCAoeXl2c3BbKDEpIC0gKDIpXS5wcm9wbGlzdCkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc6Ci0jbGluZSAxNzMgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDE3NyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5wcm9wKSA9IGJ1aWxkX3Byb3BlcnR5KCh5eXZzcFsoMikgLSAoNSldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoNCkgLSAoNSldLmRhdGEpLCAoeXl2c3BbKDEpIC0gKDUpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTg6Ci0jbGluZSAxNzcgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDE4MSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5wcm9wKSA9IGJ1aWxkX3Byb3BlcnR5KCh5eXZzcFsoMikgLSAoMyldLnByb3Bub2RlbmFtZSksIGVtcHR5X2RhdGEsICh5eXZzcFsoMSkgLSAoMyldLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxOToKLSNsaW5lIDE4NCAiZHRjLXBhcnNlci55IgorI2xpbmUgMTg4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgKHl5dnNwWygyKSAtICgyKV0uZGF0YSkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjA6Ci0jbGluZSAxODggImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyMToKICNsaW5lIDE5MiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDIyOgorICBjYXNlIDIxOgogI2xpbmUgMTk2ICJkdGMtcGFyc2VyLnkiCiAgICAgeworCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDQpXS5kYXRhKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjI6CisjbGluZSAyMDAgImR0Yy1wYXJzZXIueSIKKyAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIFJFRl9QQVRILCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjM6Ci0jbGluZSAyMDAgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDIwNCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCh5eXZzcFsoNCkgLSAoOSldLmRhdGEpLnZhbCwgJnBhdGgpOworCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CisKKwkJCWlmICgoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSAhPSAwKQorCQkJCWlmIChmc2VlayhmaWxlLT5maWxlLCAoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwgU0VFS19TRVQpICE9IDApCisJCQkJCXl5ZXJyb3JmKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAorCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpKHl5dnNwWyg2KSAtICg5KV0uYWRkciksCisJCQkJCQkgKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCBzdHJlcnJvcihlcnJubykpOworCisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgKHl5dnNwWyg4KSAtICg5KV0uYWRkcikpOworCisJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoOSldLmRhdGEpLCBkKTsKKwkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjQ6CisjbGluZSAyMjEgImR0Yy1wYXJzZXIueSIKKyAgICB7CisJCQlzdHJ1Y3Qgc2VhcmNoX3BhdGggcGF0aCA9IHsgc3JjcG9zX2ZpbGUtPmRpciwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGR0Y19maWxlICpmaWxlID0gZHRjX29wZW5fZmlsZSgoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKS52YWwsICZwYXRoKTsKKwkJCXN0cnVjdCBkYXRhIGQgPSBlbXB0eV9kYXRhOworCisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgLTEpOworCisJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNSldLmRhdGEpLCBkKTsKKwkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjU6CisjbGluZSAyMzIgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjQ6Ci0jbGluZSAyMDcgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyNjoKKyNsaW5lIDIzOSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGVtcHR5X2RhdGE7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNToKLSNsaW5lIDIxMSAiZHRjLXBhcnNlci55IgorICBjYXNlIDI3OgorI2xpbmUgMjQzICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gKHl5dnNwWygxKSAtICgyKV0uZGF0YSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNjoKLSNsaW5lIDIxNSAiZHRjLXBhcnNlci55IgorICBjYXNlIDI4OgorI2xpbmUgMjQ3ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI3OgotI2xpbmUgMjIyICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjk6CisjbGluZSAyNTQgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBlbXB0eV9kYXRhOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjg6Ci0jbGluZSAyMjYgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzMDoKKyNsaW5lIDI1OCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYXBwZW5kX2NlbGwoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksICh5eXZzcFsoMikgLSAoMildLmNlbGwpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI5OgotI2xpbmUgMjMwICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzE6CisjbGluZSAyNjIgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9jZWxsKGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgUkVGX1BIQU5ETEUsCiAJCQkJCQkJICAgICAgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKSwgLTEpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzA6Ci0jbGluZSAyMzUgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzMjoKKyNsaW5lIDI2NyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgTEFCRUwsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMToKLSNsaW5lIDI0MiAiZHRjLXBhcnNlci55IgorICBjYXNlIDMzOgorI2xpbmUgMjc0ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmNiYXNlKSA9IDE2OwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzM6Ci0jbGluZSAyNTAgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzNToKKyNsaW5lIDI4MiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5jZWxsKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDEpIC0gKDEpXS5saXRlcmFsKSwgMCwgMzIpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzQ6Ci0jbGluZSAyNTQgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzNjoKKyNsaW5lIDI4NiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5jZWxsKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDIpIC0gKDIpXS5saXRlcmFsKSwgKHl5dnNwWygxKSAtICgyKV0uY2Jhc2UpLCAzMik7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzNToKLSNsaW5lIDI2MSAiZHRjLXBhcnNlci55IgorICBjYXNlIDM3OgorI2xpbmUgMjkzICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM2OgotI2xpbmUgMjY1ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzg6CisjbGluZSAyOTcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9ieXRlKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5ieXRlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzNzoKLSNsaW5lIDI2OSAiZHRjLXBhcnNlci55IgorICBjYXNlIDM5OgorI2xpbmUgMzAxICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM4OgotI2xpbmUgMjc2ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgNDA6CisjbGluZSAzMDggImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM5OgotI2xpbmUgMjgwICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgNDE6CisjbGluZSAzMTIgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gY2hhaW5fbm9kZSgoeXl2c3BbKDEpIC0gKDIpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgyKV0ubm9kZWxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQwOgotI2xpbmUgMjg0ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgNDI6CisjbGluZSAzMTYgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl5eWVycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzXG4iKTsKKwkJCXl5ZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKIAkJCVlZRVJST1I7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA0MToKLSNsaW5lIDI5MiAiZHRjLXBhcnNlci55IgorICBjYXNlIDQzOgorI2xpbmUgMzI0ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLm5vZGUpID0gbmFtZV9ub2RlKCh5eXZzcFsoMykgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5wcm9wbm9kZW5hbWUpLCAoeXl2c3BbKDEpIC0gKDMpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDI6Ci0jbGluZSAyOTkgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSA0NDoKKyNsaW5lIDMzMSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5sYWJlbHJlZikgPSBOVUxMOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDM6Ci0jbGluZSAzMDMgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSA0NToKKyNsaW5lIDMzNSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5sYWJlbHJlZikgPSAoeXl2c3BbKDEpIC0gKDEpXS5sYWJlbHJlZik7CiAJCTt9CkBAIC0xNzMwLDcgKzE3NzYsNyBAQAogCiAKIC8qIExpbmUgMTI2NyBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTczNCAiZHRjLXBhcnNlci50YWIuYyIKKyNsaW5lIDE3ODAgImR0Yy1wYXJzZXIudGFiLmMiCiAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICB9CiAgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKQEAgLTE5NTAsMjEgKzE5OTYsMzIgQEAKIH0KIAogCi0jbGluZSAzMDggImR0Yy1wYXJzZXIueSIKKyNsaW5lIDM0MCAiZHRjLXBhcnNlci55IgogCiAKLXZvaWQgeXllcnJvciAoY2hhciBjb25zdCAqcykKK3ZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqcywgLi4uKQogewotCWNvbnN0IGNoYXIgKmZuYW1lID0gc3JjcG9zX2ZpbGVuYW1lX2Zvcl9udW0oeXlsbG9jLmZpbGVudW0pOworCWNvbnN0IGNoYXIgKmZuYW1lID0gc3JjcG9zX2ZpbGUgPyBzcmNwb3NfZmlsZS0+bmFtZSA6ICI8bm8tZmlsZT4iOworCXZhX2xpc3QgdmE7CisJdmFfc3RhcnQodmEsIHMpOwogCiAJaWYgKHN0cmNtcChmbmFtZSwgIi0iKSA9PSAwKQogCQlmbmFtZSA9ICJzdGRpbiI7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkICVzXG4iLAotCQlmbmFtZSwgeXlsbG9jLmZpcnN0X2xpbmUsIHMpOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQgIiwgZm5hbWUsIHl5bGxvYy5maXJzdF9saW5lKTsKKwl2ZnByaW50ZihzdGRlcnIsIHMsIHZhKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwl0cmVlc291cmNlX2Vycm9yID0gMTsKKwl2YV9lbmQodmEpOwogfQogCi11bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cykKK3ZvaWQgeXllcnJvciAoY2hhciBjb25zdCAqcykKK3sKKwl5eWVycm9yZigiJXMiLCBzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBldmFsX2xpdGVyYWwoY29uc3QgY2hhciAqcywgaW50IGJhc2UsIGludCBiaXRzKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CiAJY2hhciAqZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKaW5kZXggNDcwN2IwMi4uYmE5OTEwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKQEAgLTQ4LDcgKzQ4LDggQEAKICAgICAgRFRfQllURSA9IDI2NCwKICAgICAgRFRfU1RSSU5HID0gMjY1LAogICAgICBEVF9MQUJFTCA9IDI2NiwKLSAgICAgRFRfUkVGID0gMjY3CisgICAgIERUX1JFRiA9IDI2NywKKyAgICAgRFRfSU5DQklOID0gMjY4CiAgICB9OwogI2VuZGlmCiAvKiBUb2tlbnMuICAqLwpAQCAtNjIsMjIgKzYzLDIzIEBACiAjZGVmaW5lIERUX1NUUklORyAyNjUKICNkZWZpbmUgRFRfTEFCRUwgMjY2CiAjZGVmaW5lIERUX1JFRiAyNjcKKyNkZWZpbmUgRFRfSU5DQklOIDI2OAogCiAKIAogCiAjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKIHR5cGVkZWYgdW5pb24gWVlTVFlQRQotI2xpbmUgMzQgImR0Yy1wYXJzZXIueSIKKyNsaW5lIDM3ICJkdGMtcGFyc2VyLnkiCiB7CiAJY2hhciAqcHJvcG5vZGVuYW1lOwogCWNoYXIgKmxpdGVyYWw7CiAJY2hhciAqbGFiZWxyZWY7CiAJdW5zaWduZWQgaW50IGNiYXNlOwotCXU4IGJ5dGU7CisJdWludDhfdCBieXRlOwogCXN0cnVjdCBkYXRhIGRhdGE7CiAKLQl1NjQgYWRkcjsKKwl1aW50NjRfdCBhZGRyOwogCWNlbGxfdCBjZWxsOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3BsaXN0OwpAQCAtODYsNyArODgsNyBAQAogCXN0cnVjdCByZXNlcnZlX2luZm8gKnJlOwogfQogLyogTGluZSAxNDg5IG9mIHlhY2MuYy4gICovCi0jbGluZSA5MCAiZHRjLXBhcnNlci50YWIuaCIKKyNsaW5lIDkyICJkdGMtcGFyc2VyLnRhYi5oIgogCVlZU1RZUEU7CiAjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCiAjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLXBhcnNlci55IGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnkKaW5kZXggMDAyZWE3Zi4uYjJhYjU2MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnkKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMtcGFyc2VyLnkKQEAgLTIxLDE0ICsyMSwxNyBAQAogJWxvY2F0aW9ucwogCiAleworI2luY2x1ZGUgPHN0ZGlvLmg+CisKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAotaW50IHl5bGV4KHZvaWQpOwotdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpOworZXh0ZXJuIGludCB5eWxleCh2b2lkKTsKIAogZXh0ZXJuIHN0cnVjdCBib290X2luZm8gKnRoZV9ib290X2luZm87CitleHRlcm4gaW50IHRyZWVzb3VyY2VfZXJyb3I7CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cyk7CiAlfQogCiAldW5pb24gewpAQCAtMzYsMTAgKzM5LDEwIEBACiAJY2hhciAqbGl0ZXJhbDsKIAljaGFyICpsYWJlbHJlZjsKIAl1bnNpZ25lZCBpbnQgY2Jhc2U7Ci0JdTggYnl0ZTsKKwl1aW50OF90IGJ5dGU7CiAJc3RydWN0IGRhdGEgZGF0YTsKIAotCXU2NCBhZGRyOworCXVpbnQ2NF90IGFkZHI7CiAJY2VsbF90IGNlbGw7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcGxpc3Q7CkBAIC01OCw2ICs2MSw3IEBACiAldG9rZW4gPGRhdGE+IERUX1NUUklORwogJXRva2VuIDxsYWJlbHJlZj4gRFRfTEFCRUwKICV0b2tlbiA8bGFiZWxyZWY+IERUX1JFRgorJXRva2VuIERUX0lOQ0JJTgogCiAldHlwZSA8ZGF0YT4gcHJvcGRhdGEKICV0eXBlIDxkYXRhPiBwcm9wZGF0YXByZWZpeApAQCAtODQsMTEgKzg4LDExIEBACiBzb3VyY2VmaWxlOgogCSAgRFRfVjEgJzsnIG1lbXJlc2VydmVzIGRldmljZXRyZWUKIAkJewotCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMywgJDQpOworCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMywgJDQsIDApOwogCQl9CiAJfCB2MF9tZW1yZXNlcnZlcyBkZXZpY2V0cmVlCiAJCXsKLQkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oJDEsICQyKTsKKwkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oJDEsICQyLCAwKTsKIAkJfQogCTsKIApAQCAtMTk2LDYgKzIwMCwzNCBAQAogCQl7CiAJCQkkJCA9IGRhdGFfYWRkX21hcmtlcigkMSwgUkVGX1BBVEgsICQyKTsKIAkJfQorCXwgcHJvcGRhdGFwcmVmaXggRFRfSU5DQklOICcoJyBEVF9TVFJJTkcgJywnIGFkZHIgJywnIGFkZHIgJyknCisJCXsKKwkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07CisJCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCQ0LnZhbCwgJnBhdGgpOworCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CisKKwkJCWlmICgkNiAhPSAwKQorCQkJCWlmIChmc2VlayhmaWxlLT5maWxlLCAkNiwgU0VFS19TRVQpICE9IDApCisJCQkJCXl5ZXJyb3JmKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAorCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpJDYsCisJCQkJCQkgJDQudmFsLCBzdHJlcnJvcihlcnJubykpOworCisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgJDgpOworCisJCQkkJCA9IGRhdGFfbWVyZ2UoJDEsIGQpOworCQkJZHRjX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCX0KKwl8IHByb3BkYXRhcHJlZml4IERUX0lOQ0JJTiAnKCcgRFRfU1RSSU5HICcpJworCQl7CisJCQlzdHJ1Y3Qgc2VhcmNoX3BhdGggcGF0aCA9IHsgc3JjcG9zX2ZpbGUtPmRpciwgTlVMTCwgTlVMTCB9OworCQkJc3RydWN0IGR0Y19maWxlICpmaWxlID0gZHRjX29wZW5fZmlsZSgkNC52YWwsICZwYXRoKTsKKwkJCXN0cnVjdCBkYXRhIGQgPSBlbXB0eV9kYXRhOworCisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgLTEpOworCisJCQkkJCA9IGRhdGFfbWVyZ2UoJDEsIGQpOworCQkJZHRjX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCX0KIAl8IHByb3BkYXRhIERUX0xBQkVMCiAJCXsKIAkJCSQkID0gZGF0YV9hZGRfbWFya2VyKCQxLCBMQUJFTCwgJDIpOwpAQCAtMjgyLDcgKzMxNCw3IEBACiAJCX0KIAl8IHN1Ym5vZGUgcHJvcGRlZgogCQl7Ci0JCQl5eWVycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzXG4iKTsKKwkJCXl5ZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKIAkJCVlZRVJST1I7CiAJCX0KIAk7CkBAIC0zMDcsMTggKzMzOSwyOSBAQAogCiAlJQogCi12b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCit2b2lkIHl5ZXJyb3JmKGNoYXIgY29uc3QgKnMsIC4uLikKIHsKLQljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlbmFtZV9mb3JfbnVtKHl5bGxvYy5maWxlbnVtKTsKKwljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlID8gc3JjcG9zX2ZpbGUtPm5hbWUgOiAiPG5vLWZpbGU+IjsKKwl2YV9saXN0IHZhOworCXZhX3N0YXJ0KHZhLCBzKTsKIAogCWlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCkKIAkJZm5hbWUgPSAic3RkaW4iOwogCi0JZnByaW50ZihzdGRlcnIsICIlczolZCAlc1xuIiwKLQkJZm5hbWUsIHl5bGxvYy5maXJzdF9saW5lLCBzKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkICIsIGZuYW1lLCB5eWxsb2MuZmlyc3RfbGluZSk7CisJdmZwcmludGYoc3RkZXJyLCBzLCB2YSk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCisJdHJlZXNvdXJjZV9lcnJvciA9IDE7CisJdmFfZW5kKHZhKTsKIH0KIAotdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpCit2b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCit7CisJeXllcnJvcmYoIiVzIiwgcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwogCWNoYXIgKmU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2R0Yy5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMuYwppbmRleCAwMTEzMWQ3Li5kOGZkNDNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2R0Yy5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlyZXR1cm4gc3RyOwogfQogCi12b2lkIGZpbGxfZnVsbHBhdGhzKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpwcmVmaXgpCitzdGF0aWMgdm9pZCBmaWxsX2Z1bGxwYXRocyhzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqcHJlZml4KQogewogCXN0cnVjdCBub2RlICpjaGlsZDsKIAljb25zdCBjaGFyICp1bml0OwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJZnByaW50ZihzdGRlcnIsICJcdFx0Rm9yY2UgLSB0cnkgdG8gcHJvZHVjZSBvdXRwdXQgZXZlbiBpZiB0aGUgaW5wdXQgdHJlZSBoYXMgZXJyb3JzXG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0LXZcbiIpOwogCWZwcmludGYoc3RkZXJyLCAiXHRcdFByaW50IERUQyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKLQlleGl0KDIpOworCWV4aXQoMyk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCkBAIC0xMTgsMTAgKzExOCw5IEBACiAJaW50IGZvcmNlID0gMCwgY2hlY2sgPSAwOwogCWNvbnN0IGNoYXIgKmFyZzsKIAlpbnQgb3B0OwotCUZJTEUgKmluZiA9IE5VTEw7CiAJRklMRSAqb3V0ZiA9IE5VTEw7CiAJaW50IG91dHZlcnNpb24gPSBERUZBVUxUX0ZEVF9WRVJTSU9OOwotCWludCBib290X2NwdWlkX3BoeXMgPSAweGZlZWRiZWVmOworCWxvbmcgbG9uZyBjbWRsaW5lX2Jvb3RfY3B1aWQgPSAtMTsKIAogCXF1aWV0ICAgICAgPSAwOwogCXJlc2VydmVudW0gPSAwOwpAQCAtMTYxLDExICsxNjAsMTEgQEAKIAkJCXF1aWV0Kys7CiAJCQlicmVhazsKIAkJY2FzZSAnYic6Ci0JCQlib290X2NwdWlkX3BoeXMgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAwKTsKKwkJCWNtZGxpbmVfYm9vdF9jcHVpZCA9IHN0cnRvbGwob3B0YXJnLCBOVUxMLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlICd2JzoKLQkJICAgIHByaW50ZigiVmVyc2lvbjogJXNcbiIsIERUQ19WRVJTSU9OKTsKLQkJICAgIGV4aXQoMCk7CisJCQlwcmludGYoIlZlcnNpb246ICVzXG4iLCBEVENfVkVSU0lPTik7CisJCQlleGl0KDApOwogCQljYXNlICdoJzoKIAkJZGVmYXVsdDoKIAkJCXVzYWdlKCk7CkBAIC0xODAsMzEgKzE3OSwyNyBAQAogCQlhcmcgPSBhcmd2W29wdGluZF07CiAKIAkvKiBtaW5zaXplIGFuZCBwYWRzaXplIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KLQlpZiAoKG1pbnNpemUpICYmIChwYWRzaXplKSkgeworCWlmIChtaW5zaXplICYmIHBhZHNpemUpCiAJCWRpZSgiQ2FuJ3Qgc2V0IGJvdGggLXAgYW5kIC1TXG4iKTsKLQl9CiAKIAlmcHJpbnRmKHN0ZGVyciwgIkRUQzogJXMtPiVzICBvbiBmaWxlIFwiJXNcIlxuIiwKIAkJaW5mb3JtLCBvdXRmb3JtLCBhcmcpOwogCi0JaWYgKHN0cmVxKGluZm9ybSwgImR0cyIpKSB7CisJaWYgKHN0cmVxKGluZm9ybSwgImR0cyIpKQogCQliaSA9IGR0X2Zyb21fc291cmNlKGFyZyk7Ci0JfSBlbHNlIGlmIChzdHJlcShpbmZvcm0sICJmcyIpKSB7CisJZWxzZSBpZiAoc3RyZXEoaW5mb3JtLCAiZnMiKSkKIAkJYmkgPSBkdF9mcm9tX2ZzKGFyZyk7Ci0JfSBlbHNlIGlmKHN0cmVxKGluZm9ybSwgImR0YiIpKSB7Ci0JCWluZiA9IGR0Y19vcGVuX2ZpbGUoYXJnKTsKLQkJYmkgPSBkdF9mcm9tX2Jsb2IoaW5mKTsKLQl9IGVsc2UgeworCWVsc2UgaWYoc3RyZXEoaW5mb3JtLCAiZHRiIikpCisJCWJpID0gZHRfZnJvbV9ibG9iKGFyZyk7CisJZWxzZQogCQlkaWUoIlVua25vd24gaW5wdXQgZm9ybWF0IFwiJXNcIlxuIiwgaW5mb3JtKTsKLQl9CiAKLQlpZiAoaW5mICYmIChpbmYgIT0gc3RkaW4pKQotCQlmY2xvc2UoaW5mKTsKKwlpZiAoY21kbGluZV9ib290X2NwdWlkICE9IC0xKQorCQliaS0+Ym9vdF9jcHVpZF9waHlzID0gY21kbGluZV9ib290X2NwdWlkOwogCi0JaWYgKCEgYmkgfHwgISBiaS0+ZHQpCi0JCWRpZSgiQ291bGRuJ3QgcmVhZCBpbnB1dCB0cmVlXG4iKTsKKwlmaWxsX2Z1bGxwYXRocyhiaS0+ZHQsICIiKTsKKwlwcm9jZXNzX2NoZWNrcyhmb3JjZSwgYmkpOwogCi0JcHJvY2Vzc19jaGVja3MoZm9yY2UsIGJpLCBjaGVjaywgb3V0dmVyc2lvbiwgYm9vdF9jcHVpZF9waHlzKTsKIAogCWlmIChzdHJlcShvdXRuYW1lLCAiLSIpKSB7CiAJCW91dGYgPSBzdGRvdXQ7CkBAIC0yMTgsOSArMjEzLDkgQEAKIAlpZiAoc3RyZXEob3V0Zm9ybSwgImR0cyIpKSB7CiAJCWR0X3RvX3NvdXJjZShvdXRmLCBiaSk7CiAJfSBlbHNlIGlmIChzdHJlcShvdXRmb3JtLCAiZHRiIikpIHsKLQkJZHRfdG9fYmxvYihvdXRmLCBiaSwgb3V0dmVyc2lvbiwgYm9vdF9jcHVpZF9waHlzKTsKKwkJZHRfdG9fYmxvYihvdXRmLCBiaSwgb3V0dmVyc2lvbik7CiAJfSBlbHNlIGlmIChzdHJlcShvdXRmb3JtLCAiYXNtIikpIHsKLQkJZHRfdG9fYXNtKG91dGYsIGJpLCBvdXR2ZXJzaW9uLCBib290X2NwdWlkX3BoeXMpOworCQlkdF90b19hc20ob3V0ZiwgYmksIG91dHZlcnNpb24pOwogCX0gZWxzZSBpZiAoc3RyZXEob3V0Zm9ybSwgIm51bGwiKSkgewogCQkvKiBkbyBub3RoaW5nICovCiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2R0Yy5oCmluZGV4IDY1MjgxNzcuLjA4ZDU0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZHRjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9kdGMuaApAQCAtMzAsMTAgKzMwLDggQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGVuZGlhbi5oPgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CiAKKyNpbmNsdWRlIDxsaWJmZHRfZW52Lmg+CiAjaW5jbHVkZSA8ZmR0Lmg+CiAKICNkZWZpbmUgREVGQVVMVF9GRFRfVkVSU0lPTgkxNwpAQCAtNzUsMjUgKzczLDggQEAKIAlyZXR1cm4gbmV3OwogfQogCi10eXBlZGVmIHVpbnQ4X3QgdTg7Ci10eXBlZGVmIHVpbnQxNl90IHUxNjsKLXR5cGVkZWYgdWludDMyX3QgdTMyOwotdHlwZWRlZiB1aW50NjRfdCB1NjQ7Ci10eXBlZGVmIHUzMiBjZWxsX3Q7Cit0eXBlZGVmIHVpbnQzMl90IGNlbGxfdDsKIAotI2RlZmluZSBjcHVfdG9fYmUxNih4KQlodG9ucyh4KQotI2RlZmluZSBiZTE2X3RvX2NwdSh4KQludG9ocyh4KQotCi0jZGVmaW5lIGNwdV90b19iZTMyKHgpCWh0b25sKHgpCi0jZGVmaW5lIGJlMzJfdG9fY3B1KHgpCW50b2hsKHgpCi0KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jZGVmaW5lIGNwdV90b19iZTY0KHgpCSh4KQotI2RlZmluZSBiZTY0X3RvX2NwdSh4KQkoeCkKLSNlbHNlCi0jZGVmaW5lIGNwdV90b19iZTY0KHgpCWJzd2FwXzY0KHgpCi0jZGVmaW5lIGJlNjRfdG9fY3B1KHgpCWJzd2FwXzY0KHgpCi0jZW5kaWYKIAogI2RlZmluZSBzdHJlcShhLCBiKQkoc3RyY21wKChhKSwgKGIpKSA9PSAwKQogI2RlZmluZSBzdHJuZXEoYSwgYiwgbikJKHN0cm5jbXAoKGEpLCAoYiksIChuKSkgPT0gMCkKQEAgLTExOCw3ICs5OSw2IEBACiBzdHJ1Y3QgZGF0YSB7CiAJaW50IGxlbjsKIAljaGFyICp2YWw7Ci0JaW50IGFzaXplOwogCXN0cnVjdCBtYXJrZXIgKm1hcmtlcnM7CiB9OwogCkBAIC0xNDUsNyArMTI1LDcgQEAKIHN0cnVjdCBkYXRhIGRhdGFfbWVyZ2Uoc3RydWN0IGRhdGEgZDEsIHN0cnVjdCBkYXRhIGQyKTsKIHN0cnVjdCBkYXRhIGRhdGFfYXBwZW5kX2NlbGwoc3RydWN0IGRhdGEgZCwgY2VsbF90IHdvcmQpOwogc3RydWN0IGRhdGEgZGF0YV9hcHBlbmRfcmUoc3RydWN0IGRhdGEgZCwgY29uc3Qgc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpyZSk7Ci1zdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF9hZGRyKHN0cnVjdCBkYXRhIGQsIHU2NCBhZGRyKTsKK3N0cnVjdCBkYXRhIGRhdGFfYXBwZW5kX2FkZHIoc3RydWN0IGRhdGEgZCwgdWludDY0X3QgYWRkcik7CiBzdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF9ieXRlKHN0cnVjdCBkYXRhIGQsIHVpbnQ4X3QgYnl0ZSk7CiBzdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF96ZXJvZXMoc3RydWN0IGRhdGEgZCwgaW50IGxlbik7CiBzdHJ1Y3QgZGF0YSBkYXRhX2FwcGVuZF9hbGlnbihzdHJ1Y3QgZGF0YSBkLCBpbnQgYWxpZ24pOwpAQCAtMjIzLDcgKzIwMyw3IEBACiAJY2hhciAqbGFiZWw7CiB9OwogCi1zdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpidWlsZF9yZXNlcnZlX2VudHJ5KHU2NCBzdGFydCwgdTY0IGxlbiwgY2hhciAqbGFiZWwpOworc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBjaGFyICpsYWJlbCk7CiBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpjaGFpbl9yZXNlcnZlX2VudHJ5KHN0cnVjdCByZXNlcnZlX2luZm8gKmZpcnN0LAogCQkJCQkgc3RydWN0IHJlc2VydmVfaW5mbyAqbGlzdCk7CiBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICphZGRfcmVzZXJ2ZV9lbnRyeShzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpsaXN0LApAQCAtMjMzLDI0ICsyMTMsMjIgQEAKIHN0cnVjdCBib290X2luZm8gewogCXN0cnVjdCByZXNlcnZlX2luZm8gKnJlc2VydmVsaXN0OwogCXN0cnVjdCBub2RlICpkdDsJCS8qIHRoZSBkZXZpY2UgdHJlZSAqLworCXVpbnQzMl90IGJvb3RfY3B1aWRfcGh5czsKIH07CiAKIHN0cnVjdCBib290X2luZm8gKmJ1aWxkX2Jvb3RfaW5mbyhzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpyZXNlcnZlbGlzdCwKLQkJCQkgIHN0cnVjdCBub2RlICp0cmVlKTsKKwkJCQkgIHN0cnVjdCBub2RlICp0cmVlLCB1aW50MzJfdCBib290X2NwdWlkX3BoeXMpOwogCiAvKiBDaGVja3MgKi8KIAotdm9pZCBwcm9jZXNzX2NoZWNrcyhpbnQgZm9yY2UsIHN0cnVjdCBib290X2luZm8gKmJpLAotCQkgICAgaW50IGNoZWNrZmxhZywgaW50IG91dHZlcnNpb24sIGludCBib290X2NwdWlkX3BoeXMpOwordm9pZCBwcm9jZXNzX2NoZWNrcyhpbnQgZm9yY2UsIHN0cnVjdCBib290X2luZm8gKmJpKTsKIAogLyogRmxhdHRlbmVkIHRyZWVzICovCiAKLXZvaWQgZHRfdG9fYmxvYihGSUxFICpmLCBzdHJ1Y3QgYm9vdF9pbmZvICpiaSwgaW50IHZlcnNpb24sCi0JCWludCBib290X2NwdWlkX3BoeXMpOwotdm9pZCBkdF90b19hc20oRklMRSAqZiwgc3RydWN0IGJvb3RfaW5mbyAqYmksIGludCB2ZXJzaW9uLAotCSAgICAgICBpbnQgYm9vdF9jcHVpZF9waHlzKTsKK3ZvaWQgZHRfdG9fYmxvYihGSUxFICpmLCBzdHJ1Y3QgYm9vdF9pbmZvICpiaSwgaW50IHZlcnNpb24pOwordm9pZCBkdF90b19hc20oRklMRSAqZiwgc3RydWN0IGJvb3RfaW5mbyAqYmksIGludCB2ZXJzaW9uKTsKIAotc3RydWN0IGJvb3RfaW5mbyAqZHRfZnJvbV9ibG9iKEZJTEUgKmYpOworc3RydWN0IGJvb3RfaW5mbyAqZHRfZnJvbV9ibG9iKGNvbnN0IGNoYXIgKmZuYW1lKTsKIAogLyogVHJlZSBzb3VyY2UgKi8KIApAQCAtMjY0LDYgKzI0Miw1IEBACiAvKiBtaXNjICovCiAKIGNoYXIgKmpvaW5fcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgZmlsbF9mdWxscGF0aHMoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiAKICNlbmRpZiAvKiBfRFRDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZmxhdHRyZWUuYyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZmxhdHRyZWUuYwppbmRleCBhN2NmYjg0Li43NmFjZDI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2ZsYXR0cmVlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9mbGF0dHJlZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImR0Yy5oIgorI2luY2x1ZGUgInNyY3Bvcy5oIgogCiAjZGVmaW5lIEZURl9GVUxMUEFUSAkweDEKICNkZWZpbmUgRlRGX1ZBUkFMSUdOCTB4MgpAQCAtMTYyLDI4ICsxNjMsMTggQEAKIHsKIAlGSUxFICpmID0gZTsKIAlpbnQgb2ZmID0gMDsKLQlzdHJ1Y3QgbWFya2VyICptOworCXN0cnVjdCBtYXJrZXIgKm0gPSBkLm1hcmtlcnM7CiAKLQltID0gZC5tYXJrZXJzOwotCXdoaWxlIChtKSB7Ci0JCWlmIChtLT50eXBlID09IExBQkVMKQotCQkJZW1pdF9vZmZzZXRfbGFiZWwoZiwgbS0+cmVmLCBtLT5vZmZzZXQpOwotCQltID0gbS0+bmV4dDsKLQl9CisJZm9yX2VhY2hfbWFya2VyX29mX3R5cGUobSwgTEFCRUwpCisJCWVtaXRfb2Zmc2V0X2xhYmVsKGYsIG0tPnJlZiwgbS0+b2Zmc2V0KTsKIAotCXdoaWxlICgoZC5sZW4gLSBvZmYpID49IHNpemVvZih1MzIpKSB7CisJd2hpbGUgKChkLmxlbiAtIG9mZikgPj0gc2l6ZW9mKHVpbnQzMl90KSkgewogCQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCV4XG4iLAotCQkJYmUzMl90b19jcHUoKigodTMyICopKGQudmFsK29mZikpKSk7Ci0JCW9mZiArPSBzaXplb2YodTMyKTsKKwkJCWZkdDMyX3RvX2NwdSgqKCh1aW50MzJfdCAqKShkLnZhbCtvZmYpKSkpOworCQlvZmYgKz0gc2l6ZW9mKHVpbnQzMl90KTsKIAl9CiAKLQlpZiAoKGQubGVuIC0gb2ZmKSA+PSBzaXplb2YodTE2KSkgewotCQlmcHJpbnRmKGYsICJcdC5zaG9ydFx0MHglaHhcbiIsCi0JCQliZTE2X3RvX2NwdSgqKCh1MTYgKikoZC52YWwrb2ZmKSkpKTsKLQkJb2ZmICs9IHNpemVvZih1MTYpOwotCX0KLQotCWlmICgoZC5sZW4gLSBvZmYpID49IDEpIHsKKwl3aGlsZSAoKGQubGVuIC0gb2ZmKSA+PSAxKSB7CiAJCWZwcmludGYoZiwgIlx0LmJ5dGVcdDB4JWhoeFxuIiwgZC52YWxbb2ZmXSk7CiAJCW9mZiArPSAxOwogCX0KQEAgLTMzNiwyOSArMzI3LDI4IEBACiAKIAltZW1zZXQoZmR0LCAweGZmLCBzaXplb2YoKmZkdCkpOwogCi0JZmR0LT5tYWdpYyA9IGNwdV90b19iZTMyKEZEVF9NQUdJQyk7Ci0JZmR0LT52ZXJzaW9uID0gY3B1X3RvX2JlMzIodmktPnZlcnNpb24pOwotCWZkdC0+bGFzdF9jb21wX3ZlcnNpb24gPSBjcHVfdG9fYmUzMih2aS0+bGFzdF9jb21wX3ZlcnNpb24pOworCWZkdC0+bWFnaWMgPSBjcHVfdG9fZmR0MzIoRkRUX01BR0lDKTsKKwlmZHQtPnZlcnNpb24gPSBjcHVfdG9fZmR0MzIodmktPnZlcnNpb24pOworCWZkdC0+bGFzdF9jb21wX3ZlcnNpb24gPSBjcHVfdG9fZmR0MzIodmktPmxhc3RfY29tcF92ZXJzaW9uKTsKIAogCS8qIFJlc2VydmUgbWFwIHNob3VsZCBiZSBkb3VibGV3b3JkIGFsaWduZWQgKi8KIAlyZXNlcnZlX29mZiA9IEFMSUdOKHZpLT5oZHJfc2l6ZSwgOCk7CiAKLQlmZHQtPm9mZl9tZW1fcnN2bWFwID0gY3B1X3RvX2JlMzIocmVzZXJ2ZV9vZmYpOwotCWZkdC0+b2ZmX2R0X3N0cnVjdCA9IGNwdV90b19iZTMyKHJlc2VydmVfb2ZmICsgcmVzZXJ2ZXNpemUpOwotCWZkdC0+b2ZmX2R0X3N0cmluZ3MgPSBjcHVfdG9fYmUzMihyZXNlcnZlX29mZiArIHJlc2VydmVzaXplCisJZmR0LT5vZmZfbWVtX3Jzdm1hcCA9IGNwdV90b19mZHQzMihyZXNlcnZlX29mZik7CisJZmR0LT5vZmZfZHRfc3RydWN0ID0gY3B1X3RvX2ZkdDMyKHJlc2VydmVfb2ZmICsgcmVzZXJ2ZXNpemUpOworCWZkdC0+b2ZmX2R0X3N0cmluZ3MgPSBjcHVfdG9fZmR0MzIocmVzZXJ2ZV9vZmYgKyByZXNlcnZlc2l6ZQogCQkJCQkgICsgZHRzaXplKTsKLQlmZHQtPnRvdGFsc2l6ZSA9IGNwdV90b19iZTMyKHJlc2VydmVfb2ZmICsgcmVzZXJ2ZXNpemUgKyBkdHNpemUgKyBzdHJzaXplKTsKKwlmZHQtPnRvdGFsc2l6ZSA9IGNwdV90b19mZHQzMihyZXNlcnZlX29mZiArIHJlc2VydmVzaXplICsgZHRzaXplICsgc3Ryc2l6ZSk7CiAKIAlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkKLQkJZmR0LT5ib290X2NwdWlkX3BoeXMgPSBjcHVfdG9fYmUzMihib290X2NwdWlkX3BoeXMpOworCQlmZHQtPmJvb3RfY3B1aWRfcGh5cyA9IGNwdV90b19mZHQzMihib290X2NwdWlkX3BoeXMpOwogCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVEFCU0laRSkKLQkJZmR0LT5zaXplX2R0X3N0cmluZ3MgPSBjcHVfdG9fYmUzMihzdHJzaXplKTsKKwkJZmR0LT5zaXplX2R0X3N0cmluZ3MgPSBjcHVfdG9fZmR0MzIoc3Ryc2l6ZSk7CiAJaWYgKHZpLT5mbGFncyAmIEZURl9TVFJVQ1RTSVpFKQotCQlmZHQtPnNpemVfZHRfc3RydWN0ID0gY3B1X3RvX2JlMzIoZHRzaXplKTsKKwkJZmR0LT5zaXplX2R0X3N0cnVjdCA9IGNwdV90b19mZHQzMihkdHNpemUpOwogfQogCi12b2lkIGR0X3RvX2Jsb2IoRklMRSAqZiwgc3RydWN0IGJvb3RfaW5mbyAqYmksIGludCB2ZXJzaW9uLAotCQlpbnQgYm9vdF9jcHVpZF9waHlzKQordm9pZCBkdF90b19ibG9iKEZJTEUgKmYsIHN0cnVjdCBib290X2luZm8gKmJpLCBpbnQgdmVyc2lvbikKIHsKIAlzdHJ1Y3QgdmVyc2lvbl9pbmZvICp2aSA9IE5VTEw7CiAJaW50IGk7CkBAIC0zODMsMjYgKzM3MywyNiBAQAogCiAJLyogTWFrZSBoZWFkZXIgKi8KIAltYWtlX2ZkdF9oZWFkZXIoJmZkdCwgdmksIHJlc2VydmVidWYubGVuLCBkdGJ1Zi5sZW4sIHN0cmJ1Zi5sZW4sCi0JCQlib290X2NwdWlkX3BoeXMpOworCQkJYmktPmJvb3RfY3B1aWRfcGh5cyk7CiAKIAkvKgogCSAqIElmIHRoZSB1c2VyIGFza2VkIGZvciBtb3JlIHNwYWNlIHRoYW4gaXMgdXNlZCwgYWRqdXN0IHRoZSB0b3RhbHNpemUuCiAJICovCiAJaWYgKG1pbnNpemUgPiAwKSB7Ci0JCXBhZGxlbiA9IG1pbnNpemUgLSBiZTMyX3RvX2NwdShmZHQudG90YWxzaXplKTsKKwkJcGFkbGVuID0gbWluc2l6ZSAtIGZkdDMyX3RvX2NwdShmZHQudG90YWxzaXplKTsKIAkJaWYgKChwYWRsZW4gPCAwKSAmJiAocXVpZXQgPCAxKSkKIAkJCWZwcmludGYoc3RkZXJyLAogCQkJCSJXYXJuaW5nOiBibG9iIHNpemUgJWQgPj0gbWluaW11bSBzaXplICVkXG4iLAotCQkJCWJlMzJfdG9fY3B1KGZkdC50b3RhbHNpemUpLCBtaW5zaXplKTsKKwkJCQlmZHQzMl90b19jcHUoZmR0LnRvdGFsc2l6ZSksIG1pbnNpemUpOwogCX0KIAogCWlmIChwYWRzaXplID4gMCkKIAkJcGFkbGVuID0gcGFkc2l6ZTsKIAogCWlmIChwYWRsZW4gPiAwKSB7Ci0JCWludCB0c2l6ZSA9IGJlMzJfdG9fY3B1KGZkdC50b3RhbHNpemUpOworCQlpbnQgdHNpemUgPSBmZHQzMl90b19jcHUoZmR0LnRvdGFsc2l6ZSk7CiAJCXRzaXplICs9IHBhZGxlbjsKLQkJZmR0LnRvdGFsc2l6ZSA9IGNwdV90b19iZTMyKHRzaXplKTsKKwkJZmR0LnRvdGFsc2l6ZSA9IGNwdV90b19mZHQzMih0c2l6ZSk7CiAJfQogCiAJLyoKQEAgLTQxMCw3ICs0MDAsNyBAQAogCSAqIHRoZSByZXNlcnZlIGJ1ZmZlciwgYWRkIHRoZSByZXNlcnZlIG1hcCB0ZXJtaW5hdGluZyB6ZXJvZXMsCiAJICogdGhlIGRldmljZSB0cmVlIGl0c2VsZiwgYW5kIGZpbmFsbHkgdGhlIHN0cmluZ3MuCiAJICovCi0JYmxvYiA9IGRhdGFfYXBwZW5kX2RhdGEoYmxvYiwgJmZkdCwgc2l6ZW9mKGZkdCkpOworCWJsb2IgPSBkYXRhX2FwcGVuZF9kYXRhKGJsb2IsICZmZHQsIHZpLT5oZHJfc2l6ZSk7CiAJYmxvYiA9IGRhdGFfYXBwZW5kX2FsaWduKGJsb2IsIDgpOwogCWJsb2IgPSBkYXRhX21lcmdlKGJsb2IsIHJlc2VydmVidWYpOwogCWJsb2IgPSBkYXRhX2FwcGVuZF96ZXJvZXMoYmxvYiwgc2l6ZW9mKHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSkpOwpAQCAtNDQ5LDcgKzQzOSw3IEBACiAJfQogfQogCi12b2lkIGR0X3RvX2FzbShGSUxFICpmLCBzdHJ1Y3QgYm9vdF9pbmZvICpiaSwgaW50IHZlcnNpb24sIGludCBib290X2NwdWlkX3BoeXMpCit2b2lkIGR0X3RvX2FzbShGSUxFICpmLCBzdHJ1Y3QgYm9vdF9pbmZvICpiaSwgaW50IHZlcnNpb24pCiB7CiAJc3RydWN0IHZlcnNpb25faW5mbyAqdmkgPSBOVUxMOwogCWludCBpOwpAQCAtNDg5LDcgKzQ3OSw3IEBACiAKIAlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkKIAkJZnByaW50ZihmLCAiXHQubG9uZ1x0JWlcdFx0XHRcdFx0LyogYm9vdF9jcHVpZF9waHlzICovXG4iLAotCQkJYm9vdF9jcHVpZF9waHlzKTsKKwkJCWJpLT5ib290X2NwdWlkX3BoeXMpOwogCiAJaWYgKHZpLT5mbGFncyAmIEZURl9TVFJUQUJTSVpFKQogCQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfc3RyaW5nc19lbmQgLSBfJXNfc3RyaW5nc19zdGFydFx0Lyogc2l6ZV9kdF9zdHJpbmdzICovXG4iLApAQCAtNTc5LDE1ICs1NjksMTUgQEAKIAlpbmItPnB0ciArPSBsZW47CiB9CiAKLXN0YXRpYyB1MzIgZmxhdF9yZWFkX3dvcmQoc3RydWN0IGluYnVmICppbmIpCitzdGF0aWMgdWludDMyX3QgZmxhdF9yZWFkX3dvcmQoc3RydWN0IGluYnVmICppbmIpCiB7Ci0JdTMyIHZhbDsKKwl1aW50MzJfdCB2YWw7CiAKIAlhc3NlcnQoKChpbmItPnB0ciAtIGluYi0+YmFzZSkgJSBzaXplb2YodmFsKSkgPT0gMCk7CiAKIAlmbGF0X3JlYWRfY2h1bmsoaW5iLCAmdmFsLCBzaXplb2YodmFsKSk7CiAKLQlyZXR1cm4gYmUzMl90b19jcHUodmFsKTsKKwlyZXR1cm4gZmR0MzJfdG9fY3B1KHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZsYXRfcmVhbGlnbihzdHJ1Y3QgaW5idWYgKmluYiwgaW50IGFsaWduKQpAQCAtNjE1LDcgKzYwNSw3IEBACiAKIAlpbmItPnB0ciArPSBsZW47CiAKLQlmbGF0X3JlYWxpZ24oaW5iLCBzaXplb2YodTMyKSk7CisJZmxhdF9yZWFsaWduKGluYiwgc2l6ZW9mKHVpbnQzMl90KSk7CiAKIAlyZXR1cm4gc3RyOwogfQpAQCAtNjMyLDcgKzYyMiw3IEBACiAKIAlmbGF0X3JlYWRfY2h1bmsoaW5iLCBkLnZhbCwgbGVuKTsKIAotCWZsYXRfcmVhbGlnbihpbmIsIHNpemVvZih1MzIpKTsKKwlmbGF0X3JlYWxpZ24oaW5iLCBzaXplb2YodWludDMyX3QpKTsKIAogCXJldHVybiBkOwogfQpAQCAtNjU5LDcgKzY0OSw3IEBACiBzdGF0aWMgc3RydWN0IHByb3BlcnR5ICpmbGF0X3JlYWRfcHJvcGVydHkoc3RydWN0IGluYnVmICpkdGJ1ZiwKIAkJCQkJICAgc3RydWN0IGluYnVmICpzdHJidWYsIGludCBmbGFncykKIHsKLQl1MzIgcHJvcGxlbiwgc3Ryb2ZmOworCXVpbnQzMl90IHByb3BsZW4sIHN0cm9mZjsKIAljaGFyICpuYW1lOwogCXN0cnVjdCBkYXRhIHZhbDsKIApAQCAtNjkzLDggKzY4Myw4IEBACiAJcCA9IGluYi0+cHRyOwogCXdoaWxlICgxKSB7CiAJCWZsYXRfcmVhZF9jaHVuayhpbmIsICZyZSwgc2l6ZW9mKHJlKSk7Ci0JCXJlLmFkZHJlc3MgID0gYmU2NF90b19jcHUocmUuYWRkcmVzcyk7Ci0JCXJlLnNpemUgPSBiZTY0X3RvX2NwdShyZS5zaXplKTsKKwkJcmUuYWRkcmVzcyAgPSBmZHQ2NF90b19jcHUocmUuYWRkcmVzcyk7CisJCXJlLnNpemUgPSBmZHQ2NF90b19jcHUocmUuc2l6ZSk7CiAJCWlmIChyZS5zaXplID09IDApCiAJCQlicmVhazsKIApAQCAtNzA4LDc3ICs2OTgsMzcgQEAKIAogc3RhdGljIGNoYXIgKm5vZGVuYW1lX2Zyb21fcGF0aChjb25zdCBjaGFyICpwcGF0aCwgY29uc3QgY2hhciAqY3BhdGgpCiB7Ci0JY29uc3QgY2hhciAqbHNsYXNoOwogCWludCBwbGVuOwogCi0JbHNsYXNoID0gc3RycmNocihjcGF0aCwgJy8nKTsKLQlpZiAoISBsc2xhc2gpCi0JCXJldHVybiBOVUxMOworCXBsZW4gPSBzdHJsZW4ocHBhdGgpOwogCi0JcGxlbiA9IGxzbGFzaCAtIGNwYXRoOworCWlmICghc3RybmVxKHBwYXRoLCBjcGF0aCwgcGxlbikpCisJCWRpZSgiUGF0aCBcIiVzXCIgaXMgbm90IHZhbGlkIGFzIGEgY2hpbGQgb2YgXCIlc1wiXG4iLAorCQkgICAgY3BhdGgsIHBwYXRoKTsKIAotCWlmIChzdHJlcShjcGF0aCwgIi8iKSAmJiBzdHJlcShwcGF0aCwgIiIpKQotCQlyZXR1cm4gIiI7CisJLyogcm9vdCBub2RlIGlzIGEgc3BlY2lhbCBjYXNlICovCisJaWYgKCFzdHJlcShwcGF0aCwgIi8iKSkKKwkJcGxlbisrOwogCi0JaWYgKChwbGVuID09IDApICYmIHN0cmVxKHBwYXRoLCAiLyIpKQotCQlyZXR1cm4gc3RyZHVwKGxzbGFzaCsxKTsKLQotCWlmICghIHN0cm5lcShwcGF0aCwgY3BhdGgsIHBsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBzdHJkdXAobHNsYXNoKzEpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciBQUk9QQ0hBUltdID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5LC5fKyojPy0iOwotc3RhdGljIGNvbnN0IGNoYXIgVU5JVENIQVJbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmLCI7Ci0KLXN0YXRpYyBpbnQgY2hlY2tfbm9kZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY29uc3QgY2hhciAqYXRwb3M7Ci0JaW50IGJhc2VuYW1lbGVuOwotCi0JYXRwb3MgPSBzdHJyY2hyKG5hbWUsICdAJyk7Ci0KLQlpZiAoYXRwb3MpCi0JCWJhc2VuYW1lbGVuID0gYXRwb3MgLSBuYW1lOwotCWVsc2UKLQkJYmFzZW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0KLQlpZiAoc3Ryc3BuKG5hbWUsIFBST1BDSEFSKSA8IGJhc2VuYW1lbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoYXRwb3MKLQkgICAgJiYgKChiYXNlbmFtZWxlbiArIDEgKyBzdHJzcG4oYXRwb3MrMSwgVU5JVENIQVIpKSA8IHN0cmxlbihuYW1lKSkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBiYXNlbmFtZWxlbjsKKwlyZXR1cm4gc3RyZHVwKGNwYXRoICsgcGxlbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm9kZSAqdW5mbGF0dGVuX3RyZWUoc3RydWN0IGluYnVmICpkdGJ1ZiwKIAkJCQkgICBzdHJ1Y3QgaW5idWYgKnN0cmJ1ZiwKLQkJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfcGF0aCwgaW50IGZsYWdzKQorCQkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9mbGF0bmFtZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBub2RlICpub2RlOwotCXUzMiB2YWw7CisJY2hhciAqZmxhdG5hbWU7CisJdWludDMyX3QgdmFsOwogCiAJbm9kZSA9IGJ1aWxkX25vZGUoTlVMTCwgTlVMTCk7CiAKLQlpZiAoZmxhZ3MgJiBGVEZfRlVMTFBBVEgpIHsKLQkJbm9kZS0+ZnVsbHBhdGggPSBmbGF0X3JlYWRfc3RyaW5nKGR0YnVmKTsKLQkJbm9kZS0+bmFtZSA9IG5vZGVuYW1lX2Zyb21fcGF0aChwYXJlbnRfcGF0aCwgbm9kZS0+ZnVsbHBhdGgpOworCWZsYXRuYW1lID0gZmxhdF9yZWFkX3N0cmluZyhkdGJ1Zik7CiAKLQkJaWYgKCEgbm9kZS0+bmFtZSkKLQkJCWRpZSgiUGF0aCBcIiVzXCIgaXMgbm90IHZhbGlkIGFzIGEgY2hpbGQgb2YgXCIlc1wiXG4iLAotCQkJICAgIG5vZGUtPmZ1bGxwYXRoLCBwYXJlbnRfcGF0aCk7Ci0JfSBlbHNlIHsKLQkJbm9kZS0+bmFtZSA9IGZsYXRfcmVhZF9zdHJpbmcoZHRidWYpOwotCQlub2RlLT5mdWxscGF0aCA9IGpvaW5fcGF0aChwYXJlbnRfcGF0aCwgbm9kZS0+bmFtZSk7Ci0JfQotCi0Jbm9kZS0+YmFzZW5hbWVsZW4gPSBjaGVja19ub2RlX25hbWUobm9kZS0+bmFtZSk7Ci0JaWYgKG5vZGUtPmJhc2VuYW1lbGVuIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmcgXCIlc1wiIGhhcyBpbmNvcnJlY3QgZm9ybWF0XG4iLCBub2RlLT5uYW1lKTsKLQl9CisJaWYgKGZsYWdzICYgRlRGX0ZVTExQQVRIKQorCQlub2RlLT5uYW1lID0gbm9kZW5hbWVfZnJvbV9wYXRoKHBhcmVudF9mbGF0bmFtZSwgZmxhdG5hbWUpOworCWVsc2UKKwkJbm9kZS0+bmFtZSA9IGZsYXRuYW1lOwogCiAJZG8gewogCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CkBAIC03OTUsOCArNzQ1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgRkRUX0JFR0lOX05PREU6Ci0JCQljaGlsZCA9IHVuZmxhdHRlbl90cmVlKGR0YnVmLHN0cmJ1Ziwgbm9kZS0+ZnVsbHBhdGgsCi0JCQkJCSAgICAgICBmbGFncyk7CisJCQljaGlsZCA9IHVuZmxhdHRlbl90cmVlKGR0YnVmLHN0cmJ1ZiwgZmxhdG5hbWUsIGZsYWdzKTsKIAkJCWFkZF9jaGlsZChub2RlLCBjaGlsZCk7CiAJCQlicmVhazsKIApAQCAtODI1LDEwICs3NzQsMTEgQEAKIH0KIAogCi1zdHJ1Y3QgYm9vdF9pbmZvICpkdF9mcm9tX2Jsb2IoRklMRSAqZikKK3N0cnVjdCBib290X2luZm8gKmR0X2Zyb21fYmxvYihjb25zdCBjaGFyICpmbmFtZSkKIHsKLQl1MzIgbWFnaWMsIHRvdGFsc2l6ZSwgdmVyc2lvbiwgc2l6ZV9zdHIsIHNpemVfZHQ7Ci0JdTMyIG9mZl9kdCwgb2ZmX3N0ciwgb2ZmX21lbV9yc3ZtYXA7CisJc3RydWN0IGR0Y19maWxlICpkdGNmOworCXVpbnQzMl90IG1hZ2ljLCB0b3RhbHNpemUsIHZlcnNpb24sIHNpemVfZHQsIGJvb3RfY3B1aWRfcGh5czsKKwl1aW50MzJfdCBvZmZfZHQsIG9mZl9zdHIsIG9mZl9tZW1fcnN2bWFwOwogCWludCByYzsKIAljaGFyICpibG9iOwogCXN0cnVjdCBmZHRfaGVhZGVyICpmZHQ7CkBAIC04MzgsNTQgKzc4OCw1NiBAQAogCWludCBzaXplbGVmdDsKIAlzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpyZXNlcnZlbGlzdDsKIAlzdHJ1Y3Qgbm9kZSAqdHJlZTsKLQl1MzIgdmFsOworCXVpbnQzMl90IHZhbDsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGYpOwotCWlmIChmZXJyb3IoZikpCisJZHRjZiA9IGR0Y19vcGVuX2ZpbGUoZm5hbWUsIE5VTEwpOworCisJcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGR0Y2YtPmZpbGUpOworCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCiAJCWRpZSgiRXJyb3IgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlcjogJXNcbiIsCiAJCSAgICBzdHJlcnJvcihlcnJubykpOwogCWlmIChyYyA8IDEpIHsKLQkJaWYgKGZlb2YoZikpCisJCWlmIChmZW9mKGR0Y2YtPmZpbGUpKQogCQkJZGllKCJFT0YgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlclxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgbWFnaWMgbnVtYmVyXG4iKTsKIAl9CiAKLQltYWdpYyA9IGJlMzJfdG9fY3B1KG1hZ2ljKTsKKwltYWdpYyA9IGZkdDMyX3RvX2NwdShtYWdpYyk7CiAJaWYgKG1hZ2ljICE9IEZEVF9NQUdJQykKIAkJZGllKCJCbG9iIGhhcyBpbmNvcnJlY3QgbWFnaWMgbnVtYmVyXG4iKTsKIAotCXJjID0gZnJlYWQoJnRvdGFsc2l6ZSwgc2l6ZW9mKHRvdGFsc2l6ZSksIDEsIGYpOwotCWlmIChmZXJyb3IoZikpCisJcmMgPSBmcmVhZCgmdG90YWxzaXplLCBzaXplb2YodG90YWxzaXplKSwgMSwgZHRjZi0+ZmlsZSk7CisJaWYgKGZlcnJvcihkdGNmLT5maWxlKSkKIAkJZGllKCJFcnJvciByZWFkaW5nIERUIGJsb2Igc2l6ZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAJaWYgKHJjIDwgMSkgewotCQlpZiAoZmVvZihmKSkKKwkJaWYgKGZlb2YoZHRjZi0+ZmlsZSkpCiAJCQlkaWUoIkVPRiByZWFkaW5nIERUIGJsb2Igc2l6ZVxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgYmxvYiBzaXplXG4iKTsKIAl9CiAKLQl0b3RhbHNpemUgPSBiZTMyX3RvX2NwdSh0b3RhbHNpemUpOworCXRvdGFsc2l6ZSA9IGZkdDMyX3RvX2NwdSh0b3RhbHNpemUpOwogCWlmICh0b3RhbHNpemUgPCBGRFRfVjFfU0laRSkKIAkJZGllKCJEVCBibG9iIHNpemUgKCVkKSBpcyB0b28gc21hbGxcbiIsIHRvdGFsc2l6ZSk7CiAKIAlibG9iID0geG1hbGxvYyh0b3RhbHNpemUpOwogCiAJZmR0ID0gKHN0cnVjdCBmZHRfaGVhZGVyICopYmxvYjsKLQlmZHQtPm1hZ2ljID0gY3B1X3RvX2JlMzIobWFnaWMpOwotCWZkdC0+dG90YWxzaXplID0gY3B1X3RvX2JlMzIodG90YWxzaXplKTsKKwlmZHQtPm1hZ2ljID0gY3B1X3RvX2ZkdDMyKG1hZ2ljKTsKKwlmZHQtPnRvdGFsc2l6ZSA9IGNwdV90b19mZHQzMih0b3RhbHNpemUpOwogCiAJc2l6ZWxlZnQgPSB0b3RhbHNpemUgLSBzaXplb2YobWFnaWMpIC0gc2l6ZW9mKHRvdGFsc2l6ZSk7CiAJcCA9IGJsb2IgKyBzaXplb2YobWFnaWMpICArIHNpemVvZih0b3RhbHNpemUpOwogCiAJd2hpbGUgKHNpemVsZWZ0KSB7Ci0JCWlmIChmZW9mKGYpKQorCQlpZiAoZmVvZihkdGNmLT5maWxlKSkKIAkJCWRpZSgiRU9GIGJlZm9yZSByZWFkaW5nICVkIGJ5dGVzIG9mIERUIGJsb2JcbiIsCiAJCQkgICAgdG90YWxzaXplKTsKIAotCQlyYyA9IGZyZWFkKHAsIDEsIHNpemVsZWZ0LCBmKTsKLQkJaWYgKGZlcnJvcihmKSkKKwkJcmMgPSBmcmVhZChwLCAxLCBzaXplbGVmdCwgZHRjZi0+ZmlsZSk7CisJCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCiAJCQlkaWUoIkVycm9yIHJlYWRpbmcgRFQgYmxvYjogJXNcbiIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIApAQCAtODkzLDE5ICs4NDUsMTEgQEAKIAkJcCArPSByYzsKIAl9CiAKLQlvZmZfZHQgPSBiZTMyX3RvX2NwdShmZHQtPm9mZl9kdF9zdHJ1Y3QpOwotCW9mZl9zdHIgPSBiZTMyX3RvX2NwdShmZHQtPm9mZl9kdF9zdHJpbmdzKTsKLQlvZmZfbWVtX3Jzdm1hcCA9IGJlMzJfdG9fY3B1KGZkdC0+b2ZmX21lbV9yc3ZtYXApOwotCXZlcnNpb24gPSBiZTMyX3RvX2NwdShmZHQtPnZlcnNpb24pOwotCi0JZnByaW50ZihzdGRlcnIsICJcdG1hZ2ljOlx0XHRcdDB4JXhcbiIsIG1hZ2ljKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0dG90YWxzaXplOlx0XHQlZFxuIiwgdG90YWxzaXplKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0b2ZmX2R0X3N0cnVjdDpcdFx0MHgleFxuIiwgb2ZmX2R0KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0b2ZmX2R0X3N0cmluZ3M6XHRcdDB4JXhcbiIsIG9mZl9zdHIpOwotCWZwcmludGYoc3RkZXJyLCAiXHRvZmZfbWVtX3Jzdm1hcDpcdFx0MHgleFxuIiwgb2ZmX21lbV9yc3ZtYXApOwotCWZwcmludGYoc3RkZXJyLCAiXHR2ZXJzaW9uOlx0XHQweCV4XG4iLCB2ZXJzaW9uICk7Ci0JZnByaW50ZihzdGRlcnIsICJcdGxhc3RfY29tcF92ZXJzaW9uOlx0MHgleFxuIiwKLQkJYmUzMl90b19jcHUoZmR0LT5sYXN0X2NvbXBfdmVyc2lvbikpOworCW9mZl9kdCA9IGZkdDMyX3RvX2NwdShmZHQtPm9mZl9kdF9zdHJ1Y3QpOworCW9mZl9zdHIgPSBmZHQzMl90b19jcHUoZmR0LT5vZmZfZHRfc3RyaW5ncyk7CisJb2ZmX21lbV9yc3ZtYXAgPSBmZHQzMl90b19jcHUoZmR0LT5vZmZfbWVtX3Jzdm1hcCk7CisJdmVyc2lvbiA9IGZkdDMyX3RvX2NwdShmZHQtPnZlcnNpb24pOworCWJvb3RfY3B1aWRfcGh5cyA9IGZkdDMyX3RvX2NwdShmZHQtPmJvb3RfY3B1aWRfcGh5cyk7CiAKIAlpZiAob2ZmX21lbV9yc3ZtYXAgPj0gdG90YWxzaXplKQogCQlkaWUoIk1lbSBSZXNlcnZlIHN0cnVjdHVyZSBvZmZzZXQgZXhjZWVkcyB0b3RhbCBzaXplXG4iKTsKQEAgLTkxNiwyMSArODYwLDE3IEBACiAJaWYgKG9mZl9zdHIgPiB0b3RhbHNpemUpCiAJCWRpZSgiU3RyaW5nIHRhYmxlIG9mZnNldCBleGNlZWRzIHRvdGFsIHNpemVcbiIpOwogCi0JaWYgKHZlcnNpb24gPj0gMikKLQkJZnByaW50ZihzdGRlcnIsICJcdGJvb3RfY3B1aWRfcGh5czpcdDB4JXhcbiIsCi0JCQliZTMyX3RvX2NwdShmZHQtPmJvb3RfY3B1aWRfcGh5cykpOwotCi0Jc2l6ZV9zdHIgPSAtMTsKIAlpZiAodmVyc2lvbiA+PSAzKSB7Ci0JCXNpemVfc3RyID0gYmUzMl90b19jcHUoZmR0LT5zaXplX2R0X3N0cmluZ3MpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlx0c2l6ZV9kdF9zdHJpbmdzOlx0JWRcbiIsIHNpemVfc3RyKTsKKwkJdWludDMyX3Qgc2l6ZV9zdHIgPSBmZHQzMl90b19jcHUoZmR0LT5zaXplX2R0X3N0cmluZ3MpOwogCQlpZiAob2ZmX3N0citzaXplX3N0ciA+IHRvdGFsc2l6ZSkKIAkJCWRpZSgiU3RyaW5nIHRhYmxlIGV4dGVuZHMgcGFzdCB0b3RhbCBzaXplXG4iKTsKKwkJaW5idWZfaW5pdCgmc3RyYnVmLCBibG9iICsgb2ZmX3N0ciwgYmxvYiArIG9mZl9zdHIgKyBzaXplX3N0cik7CisJfSBlbHNlIHsKKwkJaW5idWZfaW5pdCgmc3RyYnVmLCBibG9iICsgb2ZmX3N0ciwgYmxvYiArIHRvdGFsc2l6ZSk7CiAJfQogCiAJaWYgKHZlcnNpb24gPj0gMTcpIHsKLQkJc2l6ZV9kdCA9IGJlMzJfdG9fY3B1KGZkdC0+c2l6ZV9kdF9zdHJ1Y3QpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlx0c2l6ZV9kdF9zdHJ1Y3Q6XHRcdCVkXG4iLCBzaXplX2R0KTsKKwkJc2l6ZV9kdCA9IGZkdDMyX3RvX2NwdShmZHQtPnNpemVfZHRfc3RydWN0KTsKIAkJaWYgKG9mZl9kdCtzaXplX2R0ID4gdG90YWxzaXplKQogCQkJZGllKCJTdHJ1Y3R1cmUgYmxvY2sgZXh0ZW5kcyBwYXN0IHRvdGFsIHNpemVcbiIpOwogCX0KQEAgLTk0NCwxMCArODg0LDYgQEAKIAlpbmJ1Zl9pbml0KCZtZW1yZXN2YnVmLAogCQkgICBibG9iICsgb2ZmX21lbV9yc3ZtYXAsIGJsb2IgKyB0b3RhbHNpemUpOwogCWluYnVmX2luaXQoJmR0YnVmLCBibG9iICsgb2ZmX2R0LCBibG9iICsgdG90YWxzaXplKTsKLQlpZiAoc2l6ZV9zdHIgPj0gMCkKLQkJaW5idWZfaW5pdCgmc3RyYnVmLCBibG9iICsgb2ZmX3N0ciwgYmxvYiArIG9mZl9zdHIgKyBzaXplX3N0cik7Ci0JZWxzZQotCQlpbmJ1Zl9pbml0KCZzdHJidWYsIGJsb2IgKyBvZmZfc3RyLCBibG9iICsgdG90YWxzaXplKTsKIAogCXJlc2VydmVsaXN0ID0gZmxhdF9yZWFkX21lbV9yZXNlcnZlKCZtZW1yZXN2YnVmKTsKIApAQCAtOTY0LDUgKzkwMCw3IEBACiAKIAlmcmVlKGJsb2IpOwogCi0JcmV0dXJuIGJ1aWxkX2Jvb3RfaW5mbyhyZXNlcnZlbGlzdCwgdHJlZSk7CisJZHRjX2Nsb3NlX2ZpbGUoZHRjZik7CisKKwlyZXR1cm4gYnVpbGRfYm9vdF9pbmZvKHJlc2VydmVsaXN0LCB0cmVlLCBib290X2NwdWlkX3BoeXMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9mc3RyZWUuYyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvZnN0cmVlLmMKaW5kZXggMmExNjBhNC4uNzY2YjI2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9mc3RyZWUuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2ZzdHJlZS5jCkBAIC0zMSw4ICszMSw4IEBACiAJc3RydWN0IG5vZGUgKnRyZWU7CiAKIAlkID0gb3BlbmRpcihkaXJuYW1lKTsKLQlpZiAoISBkKQotCQlkaWUoIm9wZW5kaXIoKTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKCFkKQorCQlkaWUoIkNvdWxkbid0IG9wZW5kaXIoKSBcIiVzXCI6ICVzXG4iLCBkaXJuYW1lLCBzdHJlcnJvcihlcnJubykpOwogCiAJdHJlZSA9IGJ1aWxkX25vZGUoTlVMTCwgTlVMTCk7CiAKQEAgLTg3LDggKzg3LDYgQEAKIAl0cmVlID0gcmVhZF9mc3RyZWUoZGlybmFtZSk7CiAJdHJlZSA9IG5hbWVfbm9kZSh0cmVlLCAiIiwgTlVMTCk7CiAKLQlmaWxsX2Z1bGxwYXRocyh0cmVlLCAiIik7Ci0KLQlyZXR1cm4gYnVpbGRfYm9vdF9pbmZvKE5VTEwsIHRyZWUpOworCXJldHVybiBidWlsZF9ib290X2luZm8oTlVMTCwgdHJlZSwgMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvbGliZmR0X2Vudi5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9saWJmZHRfZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5YmY2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvbGliZmR0X2Vudi5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX0xJQkZEVF9FTlZfSAorI2RlZmluZSBfTElCRkRUX0VOVl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBfQihuKQkoKHVuc2lnbmVkIGxvbmcgbG9uZykoKHVpbnQ4X3QgKikmeClbbl0pCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGZkdDMyX3RvX2NwdSh1aW50MzJfdCB4KQoreworCXJldHVybiAoX0IoMCkgPDwgMjQpIHwgKF9CKDEpIDw8IDE2KSB8IChfQigyKSA8PCA4KSB8IF9CKDMpOworfQorI2RlZmluZSBjcHVfdG9fZmR0MzIoeCkgZmR0MzJfdG9fY3B1KHgpCisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZmR0NjRfdG9fY3B1KHVpbnQ2NF90IHgpCit7CisJcmV0dXJuIChfQigwKSA8PCA1NikgfCAoX0IoMSkgPDwgNDgpIHwgKF9CKDIpIDw8IDQwKSB8IChfQigzKSA8PCAzMikKKwkJfCAoX0IoNCkgPDwgMjQpIHwgKF9CKDUpIDw8IDE2KSB8IChfQig2KSA8PCA4KSB8IF9CKDcpOworfQorI2RlZmluZSBjcHVfdG9fZmR0NjQoeCkgZmR0NjRfdG9fY3B1KHgpCisjdW5kZWYgX0IKKworI2VuZGlmIC8qIF9MSUJGRFRfRU5WX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvbGl2ZXRyZWUuYyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvbGl2ZXRyZWUuYwppbmRleCA2YmEwODQ2Li4wY2EzZGU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL2xpdmV0cmVlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9saXZldHJlZS5jCkBAIC0xMTUsNiArMTE1LDcgQEAKIAlzdHJ1Y3Qgbm9kZSAqKnA7CiAKIAljaGlsZC0+bmV4dF9zaWJsaW5nID0gTlVMTDsKKwljaGlsZC0+cGFyZW50ID0gcGFyZW50OwogCiAJcCA9ICZwYXJlbnQtPmNoaWxkcmVuOwogCXdoaWxlICgqcCkKQEAgLTEyMyw3ICsxMjQsOCBAQAogCSpwID0gY2hpbGQ7CiB9CiAKLXN0cnVjdCByZXNlcnZlX2luZm8gKmJ1aWxkX3Jlc2VydmVfZW50cnkodTY0IGFkZHJlc3MsIHU2NCBzaXplLCBjaGFyICpsYWJlbCkKK3N0cnVjdCByZXNlcnZlX2luZm8gKmJ1aWxkX3Jlc2VydmVfZW50cnkodWludDY0X3QgYWRkcmVzcywgdWludDY0X3Qgc2l6ZSwKKwkJCQkJIGNoYXIgKmxhYmVsKQogewogCXN0cnVjdCByZXNlcnZlX2luZm8gKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKIApAQCAtMTY1LDEzICsxNjcsMTQgQEAKIH0KIAogc3RydWN0IGJvb3RfaW5mbyAqYnVpbGRfYm9vdF9pbmZvKHN0cnVjdCByZXNlcnZlX2luZm8gKnJlc2VydmVsaXN0LAotCQkJCSAgc3RydWN0IG5vZGUgKnRyZWUpCisJCQkJICBzdHJ1Y3Qgbm9kZSAqdHJlZSwgdWludDMyX3QgYm9vdF9jcHVpZF9waHlzKQogewogCXN0cnVjdCBib290X2luZm8gKmJpOwogCiAJYmkgPSB4bWFsbG9jKHNpemVvZigqYmkpKTsKIAliaS0+cmVzZXJ2ZWxpc3QgPSByZXNlcnZlbGlzdDsKIAliaS0+ZHQgPSB0cmVlOworCWJpLT5ib290X2NwdWlkX3BoeXMgPSBib290X2NwdWlkX3BoeXM7CiAKIAlyZXR1cm4gYmk7CiB9CkBAIC0yMDIsNyArMjA1LDcgQEAKIGNlbGxfdCBwcm9wdmFsX2NlbGwoc3RydWN0IHByb3BlcnR5ICpwcm9wKQogewogCWFzc2VydChwcm9wLT52YWwubGVuID09IHNpemVvZihjZWxsX3QpKTsKLQlyZXR1cm4gYmUzMl90b19jcHUoKigoY2VsbF90ICopcHJvcC0+dmFsLnZhbCkpOworCXJldHVybiBmZHQzMl90b19jcHUoKigoY2VsbF90ICopcHJvcC0+dmFsLnZhbCkpOwogfQogCiBzdHJ1Y3Qgbm9kZSAqZ2V0X3N1Ym5vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9zcmNwb3MuYyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvc3JjcG9zLmMKaW5kZXggMzUyYjBmZS4uOTY0MWI3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9zcmNwb3MuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL3NyY3Bvcy5jCkBAIC0yMCw4NiArMjAsOTcgQEAKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAotCi0vKgotICogUmVjb3JkIHRoZSBjb21wbGV0ZSB1bmlxdWUgc2V0IG9mIG9wZW5lZCBmaWxlIG5hbWVzLgotICogUHJpbWFyaWx5IHVzZWQgdG8gY2FjaGUgc291cmNlIHBvc2l0aW9uIGZpbGUgbmFtZXMuCi0gKi8KLSNkZWZpbmUgTUFYX05fRklMRV9OQU1FUwkoMTAwKQotCi1jb25zdCBjaGFyICpmaWxlX25hbWVzW01BWF9OX0ZJTEVfTkFNRVNdOwotc3RhdGljIGludCBuX2ZpbGVfbmFtZXMgPSAwOwotCiAvKgogICogTGlrZSB5eWxpbmVubywgdGhpcyBpcyB0aGUgY3VycmVudCBvcGVuIGZpbGUgcG9zLgogICovCiAKLWludCBzcmNwb3NfZmlsZW51bSA9IC0xOworc3RydWN0IGR0Y19maWxlICpzcmNwb3NfZmlsZTsKIAotCi0KLUZJTEUgKmR0Y19vcGVuX2ZpbGUoY29uc3QgY2hhciAqZm5hbWUpCitzdGF0aWMgaW50IGR0Y19vcGVuX29uZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbmFtZSkKIHsKLQlGSUxFICpmOworCWNoYXIgKmZ1bGxuYW1lOwogCi0JaWYgKGxvb2t1cF9maWxlX25hbWUoZm5hbWUsIDEpIDwgMCkKLQkJZGllKCJUb28gbWFueSBmaWxlcyBvcGVuZWRcbiIpOworCWlmIChzZWFyY2gpIHsKKwkJZnVsbG5hbWUgPSB4bWFsbG9jKHN0cmxlbihzZWFyY2gpICsgc3RybGVuKGZuYW1lKSArIDIpOwogCi0JaWYgKHN0cmVxKGZuYW1lLCAiLSIpKQotCQlmID0gc3RkaW47Ci0JZWxzZQotCQlmID0gZm9wZW4oZm5hbWUsICJyIik7CisJCXN0cmNweShmdWxsbmFtZSwgc2VhcmNoKTsKKwkJc3RyY2F0KGZ1bGxuYW1lLCAiLyIpOworCQlzdHJjYXQoZnVsbG5hbWUsIGZuYW1lKTsKKwl9IGVsc2UgeworCQlmdWxsbmFtZSA9IHN0cmR1cChmbmFtZSk7CisJfQogCi0JaWYgKCEgZikKLQkJZGllKCJDb3VsZG4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWZpbGUtPmZpbGUgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwlpZiAoIWZpbGUtPmZpbGUpIHsKKwkJZnJlZShmdWxsbmFtZSk7CisJCXJldHVybiAwOworCX0KIAotCXJldHVybiBmOworCWZpbGUtPm5hbWUgPSBmdWxsbmFtZTsKKwlyZXR1cm4gMTsKIH0KIAogCi0KLS8qCi0gKiBMb2NhdGUgYW5kIG9wdGlvbmFsbHkgYWRkIGZpbGVuYW1lIGZuYW1lIGluIHRoZSBmaWxlX25hbWVzW10gYXJyYXkuCi0gKgotICogSWYgdGhlIGZpbGVuYW1lIGlzIGN1cnJlbnRseSBub3QgaW4gdGhlIGFycmF5IGFuZCB0aGUgYm9vbGVhbgotICogYWRkX2l0IGlzIG5vbi16ZXJvLCBhbiBhdHRlbXB0IHRvIGFkZCB0aGUgZmlsZW5hbWUgd2lsbCBiZSBtYWRlLgotICoKLSAqIFJldHVybnM7Ci0gKiAgICBJbmRleCBbMC4uTUFYX05fRklMRV9OQU1FUykgd2hlcmUgdGhlIGZpbGVuYW1lIGlzIGtlcHQKLSAqICAgIC0xIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVjb3JkZWQKLSAqLwotCi1pbnQgbG9va3VwX2ZpbGVfbmFtZShjb25zdCBjaGFyICpmbmFtZSwgaW50IGFkZF9pdCkKK3N0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2VhcmNoX3BhdGggKnNlYXJjaCkKIHsKLQlpbnQgaTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoIGRlZmF1bHRfc2VhcmNoID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CiAKLQlmb3IgKGkgPSAwOyBpIDwgbl9maWxlX25hbWVzOyBpKyspIHsKLQkJaWYgKHN0cmNtcChmaWxlX25hbWVzW2ldLCBmbmFtZSkgPT0gMCkKLQkJCXJldHVybiBpOworCXN0cnVjdCBkdGNfZmlsZSAqZmlsZTsKKwljb25zdCBjaGFyICpzbGFzaDsKKworCWZpbGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZHRjX2ZpbGUpKTsKKworCXNsYXNoID0gc3RycmNocihmbmFtZSwgJy8nKTsKKwlpZiAoc2xhc2gpIHsKKwkJY2hhciAqZGlyID0geG1hbGxvYyhzbGFzaCAtIGZuYW1lICsgMSk7CisKKwkJbWVtY3B5KGRpciwgZm5hbWUsIHNsYXNoIC0gZm5hbWUpOworCQlkaXJbc2xhc2ggLSBmbmFtZV0gPSAwOworCQlmaWxlLT5kaXIgPSBkaXI7CisJfSBlbHNlIHsKKwkJZmlsZS0+ZGlyID0gTlVMTDsKIAl9CiAKLQlpZiAoYWRkX2l0KSB7Ci0JCWlmIChuX2ZpbGVfbmFtZXMgPCBNQVhfTl9GSUxFX05BTUVTKSB7Ci0JCQlmaWxlX25hbWVzW25fZmlsZV9uYW1lc10gPSBzdHJkdXAoZm5hbWUpOwotCQkJcmV0dXJuIG5fZmlsZV9uYW1lcysrOwotCQl9CisJaWYgKHN0cmVxKGZuYW1lLCAiLSIpKSB7CisJCWZpbGUtPm5hbWUgPSAic3RkaW4iOworCQlmaWxlLT5maWxlID0gc3RkaW47CisJCXJldHVybiBmaWxlOwogCX0KIAotCXJldHVybiAtMTsKKwlpZiAoZm5hbWVbMF0gPT0gJy8nKSB7CisJCWZpbGUtPmZpbGUgPSBmb3BlbihmbmFtZSwgInIiKTsKKwkJaWYgKCFmaWxlLT5maWxlKQorCQkJZ290byBmYWlsOworCisJCWZpbGUtPm5hbWUgPSBzdHJkdXAoZm5hbWUpOworCQlyZXR1cm4gZmlsZTsKKwl9CisKKwlpZiAoIXNlYXJjaCkKKwkJc2VhcmNoID0gJmRlZmF1bHRfc2VhcmNoOworCisJd2hpbGUgKHNlYXJjaCkgeworCQlpZiAoZHRjX29wZW5fb25lKGZpbGUsIHNlYXJjaC0+ZGlyLCBmbmFtZSkpCisJCQlyZXR1cm4gZmlsZTsKKworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZ290byBmYWlsOworCisJCXNlYXJjaCA9IHNlYXJjaC0+bmV4dDsKKwl9CisKK2ZhaWw6CisJZGllKCJDb3VsZG4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOwogfQogCi0KLWNvbnN0IGNoYXIgKnNyY3Bvc19maWxlbmFtZV9mb3JfbnVtKGludCBmaWxlbnVtKQordm9pZCBkdGNfY2xvc2VfZmlsZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUpCiB7Ci0JaWYgKDAgPD0gZmlsZW51bSAmJiBmaWxlbnVtIDwgbl9maWxlX25hbWVzKSB7Ci0JCXJldHVybiBmaWxlX25hbWVzW2ZpbGVudW1dOwotCX0KKwlpZiAoZmNsb3NlKGZpbGUtPmZpbGUpKQorCQlkaWUoIkVycm9yIGNsb3NpbmcgXCIlc1wiOiAlc1xuIiwgZmlsZS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKIAotCXJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIgKnNyY3Bvc19nZXRfZmlsZW5hbWUodm9pZCkKLXsKLQlyZXR1cm4gc3JjcG9zX2ZpbGVuYW1lX2Zvcl9udW0oc3JjcG9zX2ZpbGVudW0pOworCWZyZWUoZmlsZS0+ZGlyKTsKKwlmcmVlKGZpbGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9zcmNwb3MuaCBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvc3JjcG9zLmgKaW5kZXggY2U3YWI1Yi4uZTE3YzdjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy9zcmNwb3MuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL3NyY3Bvcy5oCkBAIC0yMiwxMyArMjIsMjEgQEAKICAqIGFycmF5IG9mIGFsbCBvcGVuZWQgZmlsZW5hbWVzLgogICovCiAKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdHJ1Y3QgZHRjX2ZpbGUgeworCWNoYXIgKmRpcjsKKwljb25zdCBjaGFyICpuYW1lOworCUZJTEUgKmZpbGU7Cit9OworCiAjaWYgISBkZWZpbmVkKFlZTFRZUEUpICYmICEgZGVmaW5lZChZWUxUWVBFX0lTX0RFQ0xBUkVEKQogdHlwZWRlZiBzdHJ1Y3QgWVlMVFlQRSB7CiAgICAgaW50IGZpcnN0X2xpbmU7CiAgICAgaW50IGZpcnN0X2NvbHVtbjsKICAgICBpbnQgbGFzdF9saW5lOwogICAgIGludCBsYXN0X2NvbHVtbjsKLSAgICBpbnQgZmlsZW51bTsKKyAgICBzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7CiB9IFlZTFRZUEU7CiAKICNkZWZpbmUgWVlMVFlQRV9JU19ERUNMQVJFRAkxCkBAIC00OCw3ICs1Niw3IEBACiAJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCiAJICAoQ3VycmVudCkubGFzdF9saW5lICAgID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9saW5lOwkJXAogCSAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCi0JICAoQ3VycmVudCkuZmlsZW51bSAgICAgID0gWVlSSFNMT0MgKFJocywgTikuZmlsZW51bTsJCVwKKwkgIChDdXJyZW50KS5maWxlICAgICAgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5maWxlOwkJXAogCX0JCQkJCQkJCVwKICAgICAgIGVsc2UJCQkJCQkJCVwKIAl7CQkJCQkJCQlcCkBAIC01NiwyMCArNjQsMjIgQEAKIAkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCiAJICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKIAkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKLQkgIChDdXJyZW50KS5maWxlbnVtICAgICAgPSBZWVJIU0xPQyAoUmhzLCAwKS5maWxlbnVtOwkJXAorCSAgKEN1cnJlbnQpLmZpbGUgICAgICAgICA9IFlZUkhTTE9DIChSaHMsIDApLmZpbGU7CQlcCiAJfQkJCQkJCQkJXAogICAgIHdoaWxlIChZWUlEICgwKSkKIAogCiAKIGV4dGVybiB2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqKTsKK2V4dGVybiB2b2lkIHl5ZXJyb3JmKGNoYXIgY29uc3QgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwogCi1leHRlcm4gaW50IHNyY3Bvc19maWxlbnVtOworZXh0ZXJuIHN0cnVjdCBkdGNfZmlsZSAqc3JjcG9zX2ZpbGU7CiAKLWV4dGVybiBpbnQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLWV4dGVybiBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCk7CitzdHJ1Y3Qgc2VhcmNoX3BhdGggeworCWNvbnN0IGNoYXIgKmRpcjsgLyogTlVMTCBmb3IgY3VycmVudCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3Qgc2VhcmNoX3BhdGggKnByZXYsICpuZXh0OworfTsKIAotZXh0ZXJuIEZJTEUgKmR0Y19vcGVuX2ZpbGUoY29uc3QgY2hhciAqZm5hbWUpOwotZXh0ZXJuIGludCBsb29rdXBfZmlsZV9uYW1lKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgYWRkX2l0KTsKLWV4dGVybiBjb25zdCBjaGFyICpzcmNwb3NfZmlsZW5hbWVfZm9yX251bShpbnQgZmlsZW51bSk7Ci1jb25zdCBjaGFyICpzcmNwb3NfZ2V0X2ZpbGVuYW1lKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoICpzZWFyY2gpOworZXh0ZXJuIHZvaWQgZHRjX2Nsb3NlX2ZpbGUoc3RydWN0IGR0Y19maWxlICpmaWxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvdHJlZXNvdXJjZS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy90cmVlc291cmNlLmMKaW5kZXggYTZhNzc2Ny4uZWJlYjZlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy90cmVlc291cmNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy90cmVlc291cmNlLmMKQEAgLTIzLDIwICsyMywyMyBAQAogCiBleHRlcm4gRklMRSAqeXlpbjsKIGV4dGVybiBpbnQgeXlwYXJzZSh2b2lkKTsKLWV4dGVybiB2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqKTsKIAogc3RydWN0IGJvb3RfaW5mbyAqdGhlX2Jvb3RfaW5mbzsKK2ludCB0cmVlc291cmNlX2Vycm9yOwogCiBzdHJ1Y3QgYm9vdF9pbmZvICpkdF9mcm9tX3NvdXJjZShjb25zdCBjaGFyICpmbmFtZSkKIHsKIAl0aGVfYm9vdF9pbmZvID0gTlVMTDsKKwl0cmVlc291cmNlX2Vycm9yID0gMDsKIAotCXB1c2hfaW5wdXRfZmlsZShmbmFtZSk7CisJc3JjcG9zX2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZuYW1lLCBOVUxMKTsKKwl5eWluID0gc3JjcG9zX2ZpbGUtPmZpbGU7CiAKIAlpZiAoeXlwYXJzZSgpICE9IDApCi0JCXJldHVybiBOVUxMOworCQlkaWUoIlVuYWJsZSB0byBwYXJzZSBpbnB1dCB0cmVlXG4iKTsKIAotCWZpbGxfZnVsbHBhdGhzKHRoZV9ib290X2luZm8tPmR0LCAiIik7CisJaWYgKHRyZWVzb3VyY2VfZXJyb3IpCisJCWRpZSgiU3ludGF4IGVycm9yIHBhcnNpbmcgaW5wdXQgdHJlZVxuIik7CiAKIAlyZXR1cm4gdGhlX2Jvb3RfaW5mbzsKIH0KQEAgLTE0NCw3ICsxNDcsNyBAQAogCQkJbSA9IG0tPm5leHQ7CiAJCX0KIAotCQlmcHJpbnRmKGYsICIweCV4IiwgYmUzMl90b19jcHUoKmNwKyspKTsKKwkJZnByaW50ZihmLCAiMHgleCIsIGZkdDMyX3RvX2NwdSgqY3ArKykpOwogCQlpZiAoKHZvaWQgKiljcCA+PSBwcm9wZW5kKQogCQkJYnJlYWs7CiAJCWZwcmludGYoZiwgIiAiKTsKQEAgLTE3Myw3ICsxNzYsNyBAQAogCQl9CiAKIAkJZnByaW50ZihmLCAiJTAyaGh4IiwgKmJwKyspOwotCQlpZiAoKHZvaWQgKilicCA+PSBwcm9wZW5kKQorCQlpZiAoKGNvbnN0IHZvaWQgKilicCA+PSBwcm9wZW5kKQogCQkJYnJlYWs7CiAJCWZwcmludGYoZiwgIiAiKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL3ZlcnNpb25fZ2VuLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9kdGMtc3JjL3ZlcnNpb25fZ2VuLmgKaW5kZXggNmMzNDMwMy4uNjU4ZmY0MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRjLXNyYy92ZXJzaW9uX2dlbi5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0Yy1zcmMvdmVyc2lvbl9nZW4uaApAQCAtMSArMSBAQAotI2RlZmluZSBEVENfVkVSU0lPTiAiRFRDIDEuMC4wLWdkNmY5YjYyZiIKKyNkZWZpbmUgRFRDX1ZFUlNJT04gIkRUQyAxLjIuMCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hcmNoZXMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2FyY2hlcy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMTNiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hcmNoZXMuZHRzCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogRGV2aWNlIFRyZWUgU291cmNlIGZvciBBTUNDIEFyY2hlcyAoZHVhbCA0NjBHVCBib2FyZCkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDggQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbgorICogVmljdG9yIEdhbGxhcmRvIDx2Z2FsbGFyZG9AYW1jYy5jb20+CisgKiBBZGFtIEdyYWhhbSA8YWdyYWhhbUBhbWNjLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgZ2xhY2llci5kdHMgZmlsZQorICogICBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisgKiAgIENvcHlyaWdodCAyMDA4IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy9kdHMtdjEvOworCisvIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwltb2RlbCA9ICJhbWNjLGFyY2hlcyI7CisJY29tcGF0aWJsZSA9ICJhbWNjLGFyY2hlcyI7CisJZGNyLXBhcmVudCA9IDwmey9jcHVzL2NwdUAwfT47CisKKwlhbGlhc2VzIHsKKwkJZXRoZXJuZXQwID0gJkVNQUMwOworCQlldGhlcm5ldDEgPSAmRU1BQzE7CisJCWV0aGVybmV0MiA9ICZFTUFDMjsKKwkJc2VyaWFsMCA9ICZVQVJUMDsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJbW9kZWwgPSAiUG93ZXJQQyw0NjBHVCI7CisJCQlyZWcgPSA8MHgwMDAwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1zaXplID0gPDMyNzY4PjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CisJCQlkY3ItY29udHJvbGxlcjsKKwkJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwl9OworCisJVUlDMDogaW50ZXJydXB0LWNvbnRyb2xsZXIwIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljLTQ2MGd0IiwiaWJtLHVpYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljZWxsLWluZGV4ID0gPDA+OworCQlkY3ItcmVnID0gPDB4MGMwIDB4MDA5PjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCX07CisKKwlVSUMxOiBpbnRlcnJ1cHQtY29udHJvbGxlcjEgeworCQljb21wYXRpYmxlID0gImlibSx1aWMtNDYwZ3QiLCJpYm0sdWljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWNlbGwtaW5kZXggPSA8MT47CisJCWRjci1yZWcgPSA8MHgwZDAgMHgwMDk+OworCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWludGVycnVwdHMgPSA8MHgxZSAweDQgMHgxZiAweDQ+OyAvKiBjYXNjYWRlICovCisJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCX07CisKKwlVSUMyOiBpbnRlcnJ1cHQtY29udHJvbGxlcjIgeworCQljb21wYXRpYmxlID0gImlibSx1aWMtNDYwZ3QiLCJpYm0sdWljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWNlbGwtaW5kZXggPSA8Mj47CisJCWRjci1yZWcgPSA8MHgwZTAgMHgwMDk+OworCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWludGVycnVwdHMgPSA8MHhhIDB4NCAweGIgMHg0PjsgLyogY2FzY2FkZSAqLworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwl9OworCisJVUlDMzogaW50ZXJydXB0LWNvbnRyb2xsZXIzIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljLTQ2MGd0IiwiaWJtLHVpYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljZWxsLWluZGV4ID0gPDM+OworCQlkY3ItcmVnID0gPDB4MGYwIDB4MDA5PjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDB4MTAgMHg0IDB4MTEgMHg0PjsgLyogY2FzY2FkZSAqLworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwl9OworCisJU0RSMDogc2RyIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sc2RyLTQ2MGd0IjsKKwkJZGNyLXJlZyA9IDwweDAwZSAweDAwMj47CisJfTsKKworCUNQUjA6IGNwciB7CisJCWNvbXBhdGlibGUgPSAiaWJtLGNwci00NjBndCI7CisJCWRjci1yZWcgPSA8MHgwMGMgMHgwMDI+OworCX07CisKKwlwbGIgeworCQljb21wYXRpYmxlID0gImlibSxwbGItNDYwZ3QiLCAiaWJtLHBsYjQiOworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisKKwkJU0RSQU0wOiBzZHJhbSB7CisJCQljb21wYXRpYmxlID0gImlibSxzZHJhbS00NjBndCIsICJpYm0sc2RyYW0tNDA1Z3AiOworCQkJZGNyLXJlZyA9IDwweDAxMCAweDAwMj47CisJCX07CisKKwkJTUFMMDogbWNtYWwgeworCQkJY29tcGF0aWJsZSA9ICJpYm0sbWNtYWwtNDYwZ3QiLCAiaWJtLG1jbWFsMiI7CisJCQlkY3ItcmVnID0gPDB4MTgwIDB4MDYyPjsKKwkJCW51bS10eC1jaGFucyA9IDwzPjsKKwkJCW51bS1yeC1jaGFucyA9IDwyND47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMj47CisJCQlpbnRlcnJ1cHRzID0gPAkvKlRYRU9CKi8gMHg2IDB4NAorCQkJCQkvKlJYRU9CKi8gMHg3IDB4NAorCQkJCQkvKlNFUlIqLyAgMHgzIDB4NAorCQkJCQkvKlRYREUqLyAgMHg0IDB4NAorCQkJCQkvKlJYREUqLyAgMHg1IDB4ND47CisJCQlkZXNjLWJhc2UtYWRkci1oaWdoID0gPDB4OD47CisJCX07CisKKwkJUE9CMDogb3BiIHsKKwkJCWNvbXBhdGlibGUgPSAiaWJtLG9wYi00NjBndCIsICJpYm0sb3BiIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MHhiMDAwMDAwMCAweDAwMDAwMDA0IDB4YjAwMDAwMDAgMHg1MDAwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKworCQkJRUJDMDogZWJjIHsKKwkJCQljb21wYXRpYmxlID0gImlibSxlYmMtNDYwZ3QiLCAiaWJtLGViYyI7CisJCQkJZGNyLXJlZyA9IDwweDAxMiAweDAwMj47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJLyogcmFuZ2VzIHByb3BlcnR5IGlzIHN1cHBsaWVkIGJ5IFUtQm9vdCAqLworCQkJCWludGVycnVwdHMgPSA8MHg2IDB4ND47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMT47CisJCQl9OworCisJCQlVQVJUMDogc2VyaWFsQGVmNjAwMzAwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQkJcmVnID0gPDB4ZWY2MDAzMDAgMHgwMDAwMDAwOD47CisJCQkJdmlydHVhbC1yZWcgPSA8MHhlZjYwMDMwMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OworCQkJCWludGVycnVwdHMgPSA8MHgxIDB4ND47CisJCQl9OworCisJCQlJSUMwOiBpMmNAZWY2MDA3MDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy00NjBndCIsICJpYm0saWljIjsKKwkJCQlyZWcgPSA8MHhlZjYwMDcwMCAweDAwMDAwMDE0PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MiAweDQ+OworCQkJfTsKKworCQkJSUlDMTogaTJjQGVmNjAwODAwIHsKKwkJCQljb21wYXRpYmxlID0gImlibSxpaWMtNDYwZ3QiLCAiaWJtLGlpYyI7CisJCQkJcmVnID0gPDB4ZWY2MDA4MDAgMHgwMDAwMDAxND47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CisJCQkJaW50ZXJydXB0cyA9IDwweDMgMHg0PjsKKwkJCX07CisKKwkJCVRBSDA6IGVtYWMtdGFoQGVmNjAxMzUwIHsKKwkJCQljb21wYXRpYmxlID0gImlibSx0YWgtNDYwZ3QiLCAiaWJtLHRhaCI7CisJCQkJcmVnID0gPDB4ZWY2MDEzNTAgMHgwMDAwMDAzMD47CisJCQl9OworCisJCQlUQUgxOiBlbWFjLXRhaEBlZjYwMTQ1MCB7CisJCQkJY29tcGF0aWJsZSA9ICJpYm0sdGFoLTQ2MGd0IiwgImlibSx0YWgiOworCQkJCXJlZyA9IDwweGVmNjAxNDUwIDB4MDAwMDAwMzA+OworCQkJfTsKKworCQkJRU1BQzA6IGV0aGVybmV0QGVmNjAwZTAwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCQljb21wYXRpYmxlID0gImlibSxlbWFjLTQ2MGd0IiwgImlibSxlbWFjNHN5bmMiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkVNQUMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDE+OworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJaW50ZXJydXB0LW1hcCA9IDwvKlN0YXR1cyovIDB4MCAmVUlDMiAweDEwIDB4NAorCQkJCQkJIC8qV2FrZSovICAgMHgxICZVSUMyIDB4MTQgMHg0PjsKKwkJCQlyZWcgPSA8MHhlZjYwMGUwMCAweDAwMDAwMGM0PjsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMDAwMDAwMDAwMDBdOyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJbWFsLWRldmljZSA9IDwmTUFMMD47CisJCQkJbWFsLXR4LWNoYW5uZWwgPSA8MD47CisJCQkJbWFsLXJ4LWNoYW5uZWwgPSA8MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKKwkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CisJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXBoeS1tb2RlID0gInNnbWlpIjsKKwkJCQlwaHktbWFwID0gPDB4ZmZmZmZmZmY+OworCQkJCWdwY3MtYWRkcmVzcyA9IDwweDAwMDAwMDBhPjsKKwkJCQl0YWgtZGV2aWNlID0gPCZUQUgwPjsKKwkJCQl0YWgtY2hhbm5lbCA9IDwwPjsKKwkJCQloYXMtaW52ZXJ0ZWQtc3RhY3Itb2M7CisJCQkJaGFzLW5ldy1zdGFjci1zdGFvcGM7CisJCQl9OworCisJCQlFTUFDMTogZXRoZXJuZXRAZWY2MDBmMDAgeworCQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGVtYWMtNDYwZ3QiLCAiaWJtLGVtYWM0c3luYyI7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmRU1BQzE+OworCQkJCWludGVycnVwdHMgPSA8MHgwIDB4MT47CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlpbnRlcnJ1cHQtbWFwID0gPC8qU3RhdHVzKi8gMHgwICZVSUMyIDB4MTEgMHg0CisJCQkJCQkgLypXYWtlKi8gICAweDEgJlVJQzIgMHgxNSAweDQ+OworCQkJCXJlZyA9IDwweGVmNjAwZjAwIDB4MDAwMDAwYzQ+OworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAwMDAwMDAwMDAwMF07IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCQltYWwtZGV2aWNlID0gPCZNQUwwPjsKKwkJCQltYWwtdHgtY2hhbm5lbCA9IDwxPjsKKwkJCQltYWwtcngtY2hhbm5lbCA9IDw4PjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OworCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKKwkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcGh5LW1vZGUgPSAic2dtaWkiOworCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CisJCQkJZ3Bjcy1hZGRyZXNzID0gPDB4MDAwMDAwMGI+OworCQkJCXRhaC1kZXZpY2UgPSA8JlRBSDE+OworCQkJCXRhaC1jaGFubmVsID0gPDE+OworCQkJCWhhcy1pbnZlcnRlZC1zdGFjci1vYzsKKwkJCQloYXMtbmV3LXN0YWNyLXN0YW9wYzsKKwkJCQltZGlvLWRldmljZSA9IDwmRU1BQzA+OworCQkJfTsKKworCQkJRU1BQzI6IGV0aGVybmV0QGVmNjAxMTAwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCQljb21wYXRpYmxlID0gImlibSxlbWFjLTQ2MGd0IiwgImlibSxlbWFjNHN5bmMiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkVNQUMyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDE+OworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJaW50ZXJydXB0LW1hcCA9IDwvKlN0YXR1cyovIDB4MCAmVUlDMiAweDEyIDB4NAorCQkJCQkJIC8qV2FrZSovICAgMHgxICZVSUMyIDB4MTYgMHg0PjsKKwkJCQlyZWcgPSA8MHhlZjYwMTEwMCAweDAwMDAwMGM0PjsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMDAwMDAwMDAwMDBdOyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJbWFsLWRldmljZSA9IDwmTUFMMD47CisJCQkJbWFsLXR4LWNoYW5uZWwgPSA8Mj47CisJCQkJbWFsLXJ4LWNoYW5uZWwgPSA8MTY+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CisJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OworCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlwaHktbW9kZSA9ICJzZ21paSI7CisJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAxPjsKKwkJCQlncGNzLWFkZHJlc3MgPSA8MHgwMDAwMDAwQz47CisJCQkJaGFzLWludmVydGVkLXN0YWNyLW9jOworCQkJCWhhcy1uZXctc3RhY3Itc3Rhb3BjOworCQkJCW1kaW8tZGV2aWNlID0gPCZFTUFDMD47CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2FzcDgzNHgtcmVkYm9vdC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cwppbmRleCA4YjFiYjBlLi42MjM1ZmNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cwpAQCAtMTMwLDI0ICsxMzAsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ3LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkNjA4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cwpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIEdFIEZhbnVjIFNCQzYxMCBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQmFzZWQgb246IFNCUyBDTTYgRGV2aWNlIFRyZWUgU291cmNlCisgKiBDb3B5cmlnaHQgMjAwNyBTQlMgVGVjaG5vbG9naWVzIEdtYkggJiBDby4gS0cKKyAqIEFuZDogbXBjODY0MV9ocGNuLmR0cyAoTVBDODY0MSBIUENOIERldmljZSBUcmVlIFNvdXJjZSkKKyAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqLworCisvKgorICogQ29tcGlsZWQgd2l0aCBkdGMgLUkgZHRzIC1PIGR0YiAtbyBnZWZfc2JjNjEwLmR0YiBnZWZfc2JjNjEwLmR0cworICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJHRUZfU0JDNjEwIjsKKwljb21wYXRpYmxlID0gImdlZixzYmM2MTAiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJYWxpYXNlcyB7CisJCWV0aGVybmV0MCA9ICZlbmV0MDsKKwkJZXRoZXJuZXQxID0gJmVuZXQxOworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJcGNpMCA9ICZwY2kwOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsODY0MUAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCQlkLWNhY2hlLXNpemUgPSA8MzI3Njg+OwkJLy8gTDEsIDMySworCQkJaS1jYWNoZS1zaXplID0gPDMyNzY4PjsJCS8vIEwxLCAzMksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gRnJvbSB1Ym9vdAorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZyb20gdWJvb3QKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZyb20gdWJvb3QKKwkJfTsKKwkJUG93ZXJQQyw4NjQxQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CQkvLyBMMSwgMzJLCisJCQlpLWNhY2hlLXNpemUgPSA8MzI3Njg+OwkJLy8gTDEsIDMySworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBGcm9tIHVib290CisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRnJvbSB1Ym9vdAorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gRnJvbSB1Ym9vdAorCQl9OworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwIDB4NDAwMDAwMDA+OwkvLyBzZXQgYnkgdWJvb3QKKwl9OworCisJbG9jYWxidXNAZmVmMDUwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtbG9jYWxidXMiLCAic2ltcGxlLWJ1cyI7CisJCXJlZyA9IDwweGY4MDA1MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTkgMj47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDAxMDAwMDAwICAgICAvLyAxNk1CIEJvb3QgZmxhc2gKKwkJCSAgMSAwIDB4ZTgwMDAwMDAgMHgwODAwMDAwMCAgICAgLy8gUGFnZWQgRmxhc2ggMAorCQkJICAyIDAgMHhlMDAwMDAwMCAweDA4MDAwMDAwICAgICAvLyBQYWdlZCBGbGFzaCAxCisJCQkgIDMgMCAweGZjMTAwMDAwIDB4MDAwMjAwMDAgICAgIC8vIE5WUkFNCisJCQkgIDQgMCAweGZjMDAwMDAwIDB4MDAwMDgwMDAgICAgIC8vIEZQR0EKKwkJCSAgNSAwIDB4ZmMwMDgwMDAgMHgwMDAwODAwMCAgICAgLy8gQUZJWCBGUEdBCisJCQkgIDYgMCAweGZkMDAwMDAwIDB4MDA4MDAwMDAgICAgIC8vIElPIEZQR0EgKDgtYml0KQorCQkJICA3IDAgMHhmZDgwMDAwMCAweDAwODAwMDAwPjsgICAvLyBJTyBGUEdBICgzMi1iaXQpCisKKwkJZnBnYUA0LDAgeworCQkJY29tcGF0aWJsZSA9ICJnZWYsZnBnYS1yZWdzIjsKKwkJCXJlZyA9IDwweDQgMHgwIDB4NDA+OworCQl9OworCQlnZWZfcGljOiBwaWNANCw0MDAwIHsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCWNvbXBhdGlibGUgPSAiZ2VmLGZwZ2EtcGljIjsKKwkJCXJlZyA9IDwweDQgMHg0MDAwIDB4MjA+OworCQkJaW50ZXJydXB0cyA9IDwweDgKKwkJCQkgICAgICAweDk+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwkJfTsKKwl9OworCisJc29jQGZlZjAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwIDB4ZmVmMDAwMDAgMHgwMDEwMDAwMD47CisJCXJlZyA9IDwweGZlZjAwMDAwIDB4MTAwMDAwPjsJLy8gQ0NTUkJBUiAxTQorCQlidXMtZnJlcXVlbmN5ID0gPDA+OworCisJCWkyYzE6IGkyY0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MmIgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisKKwkJCWV0aUA2YiB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxNjgyIjsKKwkJCQlyZWcgPSA8MHg2Yj47CisJCQl9OworCQl9OworCisJCWkyYzI6IGkyY0AzMTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MmIgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCX07CisKKwkJZG1hQDIxMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjQxLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1kbWEtY2hhbm5lbCIsCisJCQkJCSAgICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtZG1hLWNoYW5uZWwiLAorCQkJCQkgICAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtZG1hLWNoYW5uZWwiLAorCQkJCQkgICAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjIgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjQxLWRtYS1jaGFubmVsIiwKKwkJCQkJICAgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OworCQkJfTsKKwkJfTsKKworCQltZGlvQDI0NTIwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLW1kaW8iOworCQkJcmVnID0gPDB4MjQ1MjAgMHgyMD47CisKKwkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnZWZfcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4OSAweDQ+OworCQkJCXJlZyA9IDwxPjsKKwkJCX07CisJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CisJCQkJaW50ZXJydXB0cyA9IDwweDggMHg0PjsKKwkJCQlyZWcgPSA8Mz47CisJCQl9OworCQl9OworCisJCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCW1vZGVsID0gImVUU0VDIjsKKwkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CisJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDB4MWQgMHgyIDB4MWUgMHgyIDB4MjIgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gImdtaWkiOworCQl9OworCisJCWVuZXQxOiBldGhlcm5ldEAyNjAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCW1vZGVsID0gImVUU0VDIjsKKwkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CisJCQlyZWcgPSA8MHgyNjAwMCAweDEwMDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDB4MWYgMHgyIDB4MjAgMHgyIDB4MjEgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gImdtaWkiOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwweDJhIDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MHgxYyAweDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJbXBpYzogcGljQDQwMDAwIHsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47CisJCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOworCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOworCQl9OworCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1ndXRzIjsKKwkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47CisJCQlmc2wsaGFzLXJzdGNyOworCQl9OworCX07CisKKwlwY2kwOiBwY2llQGZlZjA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlyZWcgPSA8MHhmZWYwODAwMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDB4MCAweDQwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmZTAwMDAwMCAweDAgMHgwMDQwMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDB4MTggMHgyPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkweDAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQorCQkJMHgwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKKwkJCTB4MDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCisJCQkweDAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCQk+OworCisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCQkgIDB4MCAweDQwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MCAweDAwNDAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nbGFjaWVyLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nbGFjaWVyLmR0cwppbmRleCAyNGNmMGRiLi5mMzc4N2EyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dsYWNpZXIuZHRzCkBAIC0xNCw3ICsxNCw3IEBACiAJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJI3NpemUtY2VsbHMgPSA8MT47CiAJbW9kZWwgPSAiYW1jYyxnbGFjaWVyIjsKLQljb21wYXRpYmxlID0gImFtY2MsZ2xhY2llciIsICJhbWNjLGNhbnlvbmxhbmRzIjsKKwljb21wYXRpYmxlID0gImFtY2MsZ2xhY2llciI7CiAJZGNyLXBhcmVudCA9IDwmey9jcHVzL2NwdUAwfT47CiAKIAlhbGlhc2VzIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCmluZGV4IGY4N2ZlN2IuLmM2ZTExZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cwpAQCAtMTMzLDYxICsxMzMsNjEgQEAKIAkJCXJlZyA9IDwweDAwMDA3NDAwIDB4MDAwMDA0MDA+OwogCQkJYmlnLWVuZGlhbjsKIAkJfTsKKwl9OwogCi0JCXBjaUAxMDAwIHsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQljb21wYXRpYmxlID0gInRzaTEwOS1wY2kiLCAidHNpMTA4LXBjaSI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCXJlZyA9IDwweDAwMDAxMDAwIDB4MDAwMDEwMDA+OwotCQkJYnVzLXJhbmdlID0gPDB4MCAweDA+OwotCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQkJfCBQQ0kgbWVtb3J5IHJhbmdlLgotCQkJfCAwMSBkZW5vdGVzIEkvTyBzcGFjZQotCQkJfCAwMiBkZW5vdGVzIDMyLWJpdCBtZW1vcnkgc3BhY2UKLQkJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MDAwMDAwMDAgMHg0MDAwMDAwMCAweDQwMDAwMDAwIDB4MDAwMDAwMDAgMHgxMDAwMDAwMAotCQkJCSAgMHgwMTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHg3ZTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMTAwMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMzMzMzMzMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKKwlwY2lAYzAwMDEwMDAgeworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQljb21wYXRpYmxlID0gInRzaTEwOS1wY2kiLCAidHNpMTA4LXBjaSI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4YzAwMDEwMDAgMHgwMDAwMTAwMD47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHgwPjsKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IFBDSSBtZW1vcnkgcmFuZ2UuCisJCXwgMDEgZGVub3RlcyBJL08gc3BhY2UKKwkJfCAwMiBkZW5vdGVzIDMyLWJpdCBtZW1vcnkgc3BhY2UKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4NDAwMDAwMDAgMHg0MDAwMDAwMCAweDAwMDAwMDAwIDB4MTAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHg3ZTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMTAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MTMzMzMzMzMyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CisJCWludGVycnVwdHMgPSA8MHgxNyAweDI+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IFRoZSBJTlRBLCBJTlRCLCBJTlRDLCBJTlREIGFyZSBzaGFyZWQuCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCTB4ODAwIDB4MCAweDAgMHgxICZSVDAgMHgyNCAweDAKKwkJCTB4ODAwIDB4MCAweDAgMHgyICZSVDAgMHgyNSAweDAKKwkJCTB4ODAwIDB4MCAweDAgMHgzICZSVDAgMHgyNiAweDAKKwkJCTB4ODAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNyAweDAKKworCQkJMHgxMDAwIDB4MCAweDAgMHgxICZSVDAgMHgyNSAweDAKKwkJCTB4MTAwMCAweDAgMHgwIDB4MiAmUlQwIDB4MjYgMHgwCisJCQkweDEwMDAgMHgwIDB4MCAweDMgJlJUMCAweDI3IDB4MAorCQkJMHgxMDAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNCAweDAKKworCQkJMHgxODAwIDB4MCAweDAgMHgxICZSVDAgMHgyNiAweDAKKwkJCTB4MTgwMCAweDAgMHgwIDB4MiAmUlQwIDB4MjcgMHgwCisJCQkweDE4MDAgMHgwIDB4MCAweDMgJlJUMCAweDI0IDB4MAorCQkJMHgxODAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNSAweDAKKworCQkJMHgyMDAwIDB4MCAweDAgMHgxICZSVDAgMHgyNyAweDAKKwkJCTB4MjAwMCAweDAgMHgwIDB4MiAmUlQwIDB4MjQgMHgwCisJCQkweDIwMDAgMHgwIDB4MCAweDMgJlJUMCAweDI1IDB4MAorCQkJMHgyMDAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNiAweDAKKwkJCT47CisKKwkJUlQwOiByb3V0ZXJAMTE4MCB7CisJCQlkZXZpY2VfdHlwZSA9ICJwaWMtcm91dGVyIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJYmlnLWVuZGlhbjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJCWludGVycnVwdHMgPSA8MHgxNyAweDI+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCQl8IFRoZSBJTlRBLCBJTlRCLCBJTlRDLCBJTlREIGFyZSBzaGFyZWQuCi0JCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCTB4ODAwIDB4MCAweDAgMHgxICZSVDAgMHgyNCAweDAKLQkJCQkweDgwMCAweDAgMHgwIDB4MiAmUlQwIDB4MjUgMHgwCi0JCQkJMHg4MDAgMHgwIDB4MCAweDMgJlJUMCAweDI2IDB4MAotCQkJCTB4ODAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNyAweDAKLQotCQkJCTB4MTAwMCAweDAgMHgwIDB4MSAmUlQwIDB4MjUgMHgwCi0JCQkJMHgxMDAwIDB4MCAweDAgMHgyICZSVDAgMHgyNiAweDAKLQkJCQkweDEwMDAgMHgwIDB4MCAweDMgJlJUMCAweDI3IDB4MAotCQkJCTB4MTAwMCAweDAgMHgwIDB4NCAmUlQwIDB4MjQgMHgwCi0KLQkJCQkweDE4MDAgMHgwIDB4MCAweDEgJlJUMCAweDI2IDB4MAotCQkJCTB4MTgwMCAweDAgMHgwIDB4MiAmUlQwIDB4MjcgMHgwCi0JCQkJMHgxODAwIDB4MCAweDAgMHgzICZSVDAgMHgyNCAweDAKLQkJCQkweDE4MDAgMHgwIDB4MCAweDQgJlJUMCAweDI1IDB4MAotCi0JCQkJMHgyMDAwIDB4MCAweDAgMHgxICZSVDAgMHgyNyAweDAKLQkJCQkweDIwMDAgMHgwIDB4MCAweDIgJlJUMCAweDI0IDB4MAotCQkJCTB4MjAwMCAweDAgMHgwIDB4MyAmUlQwIDB4MjUgMHgwCi0JCQkJMHgyMDAwIDB4MCAweDAgMHg0ICZSVDAgMHgyNiAweDAKLQkJCQk+OwotCi0JCQlSVDA6IHJvdXRlckAxMTgwIHsKLSAJCQkJZGV2aWNlX3R5cGUgPSAicGljLXJvdXRlciI7Ci0gCQkJCWludGVycnVwdC1jb250cm9sbGVyOwotIAkJCQliaWctZW5kaWFuOwotIAkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0gCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotIAkJCQlpbnRlcnJ1cHRzID0gPDB4MTcgMHgyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKLQkJCX07CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJfTsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ2NvZ2UuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzI1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIERldmljZSBUcmVlIGZvciB0aGUgTUdDT0dFIHBsYXR0Zm9ybSBmcm9tIGtleW1pbGUKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgKKyAqIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisvIHsKKwltb2RlbCA9ICJNR0NPR0UiOworCWNvbXBhdGlibGUgPSAia2V5bWlsZSxtZ2NvZ2UiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJYWxpYXNlcyB7CisJCWV0aGVybmV0MCA9ICZldGgwOworCQlzZXJpYWwwID0gJnNtYzI7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4MjQ3QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwxNjM4ND47CisJCQlpLWNhY2hlLXNpemUgPSA8MTYzODQ+OworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJfTsKKwl9OworCisJbG9jYWxidXNAZjAwMTAxMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4MjQ3LWxvY2FsYnVzIiwKKwkJICAgICAgICAgICAgICJmc2wscHEyLWxvY2FsYnVzIiwKKwkJICAgICAgICAgICAgICJzaW1wbGUtYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhmMDAxMDEwMCAweDQwPjsKKworCQlyYW5nZXMgPSA8MCAwIDB4ZmUwMDAwMDAgMHgwMDQwMDAwMAorCQkJICA1IDAgMHg1MDAwMDAwMCAweDIwMDAwMDAwCisJCQk+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisKKwkJZmxhc2hAMCwwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJCXJlZyA9IDwwIDB4MCAweDQwMDAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJYmFuay13aWR0aCA9IDwxPjsKKwkJCWRldmljZS13aWR0aCA9IDwxPjsKKwkJCXBhcnRpdGlvbkAwIHsKKwkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCXJlZyA9IDwwIDB4NDAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkJbGFiZWwgPSAiZW52IjsKKwkJCQlyZWcgPSA8MHg0MDAwMCAweDIwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25ANjAwMDAgeworCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJcmVnID0gPDB4NjAwMDAgMHgyMjAwMDA+OworCQkJfTsKKwkJCXBhcnRpdGlvbkAyODAwMDAgeworCQkJCWxhYmVsID0gImR0YiI7CisJCQkJcmVnID0gPDB4MjgwMDAwIDB4MjAwMDA+OworCQkJfTsKKwkJfTsKKworCQlmbGFzaEA1LDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDUgMHgwIDB4MjAwMDAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJCXBhcnRpdGlvbkAwIHsKKwkJCQlsYWJlbCA9ICJyYW1kaXNrIjsKKwkJCQlyZWcgPSA8MCAweDdhMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDdhMDAwMCB7CisJCQkJbGFiZWwgPSAidXNlciI7CisJCQkJcmVnID0gPDB4N2EwMDAwIDB4MTg2MDAwMD47CisJCQl9OworCQl9OworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MCAwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCX07CisKKwlzb2NAZjAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgyNDctaW1tciIsICJmc2wscHEyLXNvYyIsICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmMDAwMDAwMCAweDAwMDUzMDAwPjsKKworCQkvLyBUZW1wb3JhcnkgdW50aWwgY29kZSBzdG9wcyBkZXBlbmRpbmcgb24gaXQuCisJCWRldmljZV90eXBlID0gInNvYyI7CisKKwkJY3BtQDExOWMwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODI0Ny1jcG0iLCAiZnNsLGNwbTIiLAorCQkJCQkic2ltcGxlLWJ1cyI7CisJCQlyZWcgPSA8MHgxMTljMCAweDMwPjsKKwkJCXJhbmdlczsKKworCQkJbXVyYW0geworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGNwbS1tdXJhbSI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmFuZ2VzID0gPDAgMCAweDEwMDAwPjsKKworCQkJCWRhdGFAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGNwbS1tdXJhbS1kYXRhIjsKKwkJCQkJcmVnID0gPDB4ODAgMHgxZjgwIDB4OTgwMCAweDgwMD47CisJCQkJfTsKKwkJCX07CisKKwkJCWJyZ0AxMTlmMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODI0Ny1icmciLAorCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTItYnJnIiwKKwkJCQkgICAgICAgICAgICAgImZzbCxjcG0tYnJnIjsKKwkJCQlyZWcgPSA8MHgxMTlmMCAweDEwIDB4MTE1ZjAgMHgxMD47CisJCQl9OworCisJCQkvKiBNb25pdG9yIHBvcnQvU01DMiAqLworCQkJc21jMjogc2VyaWFsQDExYTkwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgyNDctc21jLXVhcnQiLAorCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTItc21jLXVhcnQiOworCQkJCXJlZyA9IDwweDExYTkwIDB4MjAgMHg4OGZjIDB4MDI+OworCQkJCWludGVycnVwdHMgPSA8NSA4PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZQSUM+OworCQkJCWZzbCxjcG0tYnJnID0gPDI+OworCQkJCWZzbCxjcG0tY29tbWFuZCA9IDwweDIxMjAwMDAwPjsKKwkJCQljdXJyZW50LXNwZWVkID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQl9OworCisJCQlldGgwOiBldGhlcm5ldEAxMWE2MCB7CisJCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODI0Ny1zY2MtZW5ldCIsCisJCQkJICAgICAgICAgICAgICJmc2wsY3BtMi1zY2MtZW5ldCI7CisJCQkJcmVnID0gPDB4MTFhNjAgMHgyMCAweDgzMDAgMHgxMDAgMHgxMTM5MCAxPjsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJCWludGVycnVwdHMgPSA8NDMgOD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJCQlsaW51eCxuZXR3b3JrLWluZGV4ID0gPDA+OworCQkJCWZzbCxjcG0tY29tbWFuZCA9IDwweGNlMDAwMDA+OworCQkJCWZpeGVkLWxpbmsgPSA8MCAwIDEwIDAgMD47CisJCQl9OworCisJCX07CisKKwkJUElDOiBpbnRlcnJ1cHQtY29udHJvbGxlckAxMGMwMCB7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8MHgxMGMwMCAweDgwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgyNDctcGljIiwgImZzbCxwcTItcGljIjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ3N1dmQuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21nc3V2ZC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmYzUzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ3N1dmQuZHRzCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTUdTVVZEIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAyMDA4IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAorICogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvZHRzLXYxLzsKKy8geworCW1vZGVsID0gIk1HU1VWRCI7CisJY29tcGF0aWJsZSA9ICJrZXltaWxlLG1nc3V2ZCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsODUyQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDE2PjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDE2PjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDw4MTkyPjsKKwkJCWktY2FjaGUtc2l6ZSA9IDw4MTkyPjsKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLyogRmlsbGVkIGluIGJ5IHUtYm9vdCAqLworCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8qIEZpbGxlZCBpbiBieSB1LWJvb3QgKi8KKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8qIEZpbGxlZCBpbiBieSB1LWJvb3QgKi8KKwkJCWludGVycnVwdHMgPSA8MTUgMj47CQkvKiBkZWNyZW1lbnRlciBpbnRlcnJ1cHQgKi8KKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JlBJQz47CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwwMDAwMDAwMCAweDQwMDAwMDA+OyAgLyogRmlsbGVkIGluIGJ5IHUtYm9vdCAqLworCX07CisKKwlsb2NhbGJ1c0BmZmYwMDEwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1Mi1sb2NhbGJ1cyIsICJmc2wscHExLWxvY2FsYnVzIiwgInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJlZyA9IDwweGZmZjAwMTAwIDB4NDA+OworCisJCXJhbmdlcyA9IDwwIDAgMHhmMDAwMDAwMCAweDAxMDAwMDAwPjsgIC8qIEZpbGxlZCBpbiBieSB1LWJvb3QgKi8KKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDEwMDAwMDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWJhbmstd2lkdGggPSA8MT47CisJCQlkZXZpY2Utd2lkdGggPSA8MT47CisJCQlwYXJ0aXRpb25AMCB7CisJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQlyZWcgPSA8MCAweDgwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AODAwMDAgeworCQkJCWxhYmVsID0gImVudiI7CisJCQkJcmVnID0gPDB4ODAwMDAgMHgyMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQGEwMDAwIHsKKwkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCXJlZyA9IDwweGEwMDAwIDB4MWUwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMjgwMDAwIHsKKwkJCQlsYWJlbCA9ICJkdGIiOworCQkJCXJlZyA9IDwweDI4MDAwMCAweDIwMDAwPjsKKwkJCX07CisJCQlwYXJ0aXRpb25AMmEwMDAwIHsKKwkJCSAgICAgICAgbGFiZWwgPSAicm9vdCI7CisJCQkgICAgICAgIHJlZyA9IDwweDJhMDAwMCAweDUwMDAwMD47CisJCQl9OworCQkJcGFydGl0aW9uQDdhMDAwMCB7CisJCQkgICAgICAgIGxhYmVsID0gInVzZXIiOworCQkJICAgICAgICByZWcgPSA8MHg3YTAwMDAgMHg4NjAwMDA+OworCQkJfTsKKwkJfTsKKwl9OworCisJc29jQGZmZjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUyIiwgImZzbCxwcTEtc29jIiwgInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCXJhbmdlcyA9IDwwIDB4ZmZmMDAwMDAgMHgwMDAwNDAwMD47CisKKwkJUElDOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwIHsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwwIDI0PjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1Mi1waWMiLCAiZnNsLHBxMS1waWMiOworCQl9OworCisJCWNwbUA5YzAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1Mi1jcG0iLCAiZnNsLGNwbTEiLCAic2ltcGxlLWJ1cyI7CisJCQlpbnRlcnJ1cHRzID0gPDA+OwkvKiBjcG0gZXJyb3IgaW50ZXJydXB0ICovCisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDUE1fUElDPjsKKwkJCXJlZyA9IDwweDljMCAxMD47CisJCQlyYW5nZXM7CisKKwkJCW11cmFtQDIwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGNwbS1tdXJhbSI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmFuZ2VzID0gPDAgMHgyMDAwIDB4MjAwMD47CisKKwkJCQlkYXRhQDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxjcG0tbXVyYW0tZGF0YSI7CisJCQkJCXJlZyA9IDwweDgwMCAweDE4MDA+OworCQkJCX07CisJCQl9OworCisJCQlicmdAOWYwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTItYnJnIiwKKwkJCQkgICAgICAgICAgICAgImZzbCxjcG0xLWJyZyIsCisJCQkJICAgICAgICAgICAgICJmc2wsY3BtLWJyZyI7CisJCQkJcmVnID0gPDB4OWYwIDB4MTA+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IHUtYm9vdCAqLworCQkJfTsKKworCQkJQ1BNX1BJQzogaW50ZXJydXB0LWNvbnRyb2xsZXJAOTMwIHsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJCQlyZWcgPSA8MHg5MzAgMHgyMD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsY3BtMS1waWMiOworCQkJfTsKKworCQkJLyogTU9OLTEgKi8KKwkJCXNlcmlhbEBhODAgeworCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsY3BtMS1zbWMtdWFydCI7CisJCQkJcmVnID0gPDB4YTgwIDB4MTAgMHgzZmMwIDB4NDA+OworCQkJCWludGVycnVwdHMgPSA8ND47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ1BNX1BJQz47CisJCQkJZnNsLGNwbS1icmcgPSA8MT47CisJCQkJZnNsLGNwbS1jb21tYW5kID0gPDB4MDA5MD47CisJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IHUtYm9vdCAqLworCQkJfTsKKworCQkJZXRoZXJuZXRAYTQwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCQljb21wYXRpYmxlICA9ICJmc2wsbXBjODY2LXNjYy1lbmV0IiwKKwkJCQkgICAgICAgICAgICAgICJmc2wsY3BtMS1zY2MtZW5ldCI7CisJCQkJcmVnID0gPDB4YTQwIDB4MTggMHgzZTAwIDB4MTAwPjsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsgIC8qIEZpbGxlZCBpbiBieSB1LWJvb3QgKi8KKwkJCQlpbnRlcnJ1cHRzID0gPDI4PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDUE1fUElDPjsKKwkJCQlmc2wsY3BtLWNvbW1hbmQgPSA8MHg4MD47CisJCQkJZml4ZWQtbGluayA9IDwwIDAgMTAgMCAwPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyMWFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTEyMWFkcy5kdHMKaW5kZXggMWY5MDM2Yy4uYzJiOGRiZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjFhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTIxYWRzLmR0cwpAQCAtNDAzLDcgKzQwMyw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ODAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHg4MDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweDgwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzCmluZGV4IDJhOTRhZTAuLjc0N2YyNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTNlcmRiLmR0cwpAQCAtMTc2LDI0ICsxNzYsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTMtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzEzLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTMtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTMtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zNTksNyArMzYzLDggQEAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTVlcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMKaW5kZXggZjcwNDUxMy4uNzQ0OWU1NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTVlcmRiLmR0cwpAQCAtMTQ0LDI0ICsxNDQsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTUtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzE1LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTUtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMTUtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zMTQsNyArMzE4LDggQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMD47CisJCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwCQkvKiBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKwkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggZmJjOTMwNC4uZTRjYzE3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC0xMjcsMjQgKzEyNywyOCBAQAogCQkJZG1hLWNoYW5uZWxAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMyMy1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMjMtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDEwMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMyMy1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDE4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMyMy1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHgxODAgMHgyOD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKQEAgLTQxOSw3ICs0MjMsOCBAQAogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwPjsKKwkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgMHhlMDAwODMwMCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cwppbmRleCBiMTU3ZDE4Li4yMjZmZjA2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKQEAgLTEwNSwyNCArMTA1LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzIzLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMyMy1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzIzLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzIzLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMzI3LDcgKzMzMSw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggNzAwZTA3Ni4uNWNlZGYzNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTEwNiwyNCArMTA2LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMjUwLDcgKzI1NCw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKQEAgLTI3Niw3ICsyODEsOCBAQAogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDA4NjAwIDB4MTAwPjsKKwkJcmVnID0gPDB4ZTAwMDg2MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgMHhlMDAwODM4MCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4Z3AuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cwppbmRleCBjZGQzMDYzLi44MWFlMWQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4Z3AuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHhncC5kdHMKQEAgLTEwNCwyNCArMTA0LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMjI0LDcgKzIyOCw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg2MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODYwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzgwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IDc4MzI0MWMuLjA0YmZkZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMTE2LDI0ICsxMTYsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zMTEsNyArMzE1LDggQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMD47CisJCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwCQkvKiBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKwkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAl9OwpAQCAtMzcyLDcgKzM3Nyw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg2MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODYwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzgwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IGEzYjc2YTcuLjY2YTEyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cwpAQCAtNTIsOSArNTIsMjYgQEAKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHgxMDAwMDAwMD47CiAJfTsKIAotCWJjc3JAZjgwMDAwMDAgewotCQlkZXZpY2VfdHlwZSA9ICJib2FyZC1jb250cm9sIjsKLQkJcmVnID0gPDB4ZjgwMDAwMDAgMHg4MDAwPjsKKwlsb2NhbGJ1c0BlMDAwNTAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1sb2NhbGJ1cyIsICJmc2wscHEycHJvLWxvY2FsYnVzIiwKKwkJCSAgICAgInNpbXBsZS1idXMiOworCQlyZWcgPSA8MHhlMDAwNTAwMCAweGQ4PjsKKwkJcmFuZ2VzID0gPDAgMCAweGZlMDAwMDAwIDB4MDIwMDAwMDAKKwkJICAgICAgICAgIDEgMCAweGY4MDAwMDAwIDB4MDAwMDgwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MjAwMDAwMD47CisJCQliYW5rLXdpZHRoID0gPDI+OworCQkJZGV2aWNlLXdpZHRoID0gPDE+OworCQl9OworCisJCWJjc3JAMSwwIHsKKwkJCWRldmljZV90eXBlID0gImJvYXJkLWNvbnRyb2wiOworCQkJcmVnID0gPDEgMCAweDgwMDA+OworCQl9OwogCX07CiAKIAlzb2M4MzYwQGUwMDAwMDAwIHsKQEAgLTEzMSwyNCArMTQ4LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtNDA1LDcgKzQyNiw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCmluZGV4IDg5YzkyMDIuLmRlY2FkZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cwpAQCAtMTI1LDI0ICsxMjUsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zODMsNiArMzg3LDE4IEBACiAJCQlkZXZpY2Utd2lkdGggPSA8MT47CiAJCX07CiAKKwkJdXBtQDEsMCB7CisJCQljb21wYXRpYmxlID0gImZzbCx1cG0tbmFuZCI7CisJCQlyZWcgPSA8MSAwIDE+OworCQkJZnNsLHVwbS1hZGRyLW9mZnNldCA9IDwxNj47CisJCQlmc2wsdXBtLWNtZC1vZmZzZXQgPSA8OD47CisJCQlncGlvcyA9IDwmcWVfcGlvX2UgMTggMD47CisKKwkJCWZsYXNoIHsKKwkJCQljb21wYXRpYmxlID0gInN0bSxuYW5kNTEyLWEiOworCQkJfTsKKwkJfTsKKwogCQlkaXNwbGF5QDIsMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJkaXNwbGF5IjsKIAkJCWNvbXBhdGlibGUgPSAiZnVqaXRzdSxNQjg2Mjc3IiwgImZ1aml0c3UsbWludCI7CkBAIC00MDUsNyArNDIxLDggQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1wY2kiLCAiZnNsLG1wYzgzNDktcGNpIjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAgMHg5MDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4ZTAzMDAwMDAgMHhlMDMwMDAwMCAwIDB4MDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzdfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X21kcy5kdHMKaW5kZXggNDMyNzgyYi4uMDQ4NDU2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzdfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19tZHMuZHRzCkBAIC0xMzYsNiArMTM2LDEzIEBACiAJCQlpbnRlcnJ1cHRzID0gPDE0IDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCWRmc3JyOworCisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTM3NCI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJCWludGVycnVwdHMgPSA8MTkgMHg4PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKKwkJCX07CiAJCX07CiAKIAkJaTJjQDMxMDAgewpAQCAtMjQ2LDI0ICsyNTMsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDB4NDcgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDB4NDcgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc3LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8MHg0NyA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzctZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDwweDQ3IDg+OwogCQkJfTsKQEAgLTM3NCw3ICszODUsOCBAQAogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwPjsKKwkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgMHhlMDAwODMwMCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19yZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzdfcmRiLmR0cwppbmRleCBlZDEzN2FhLi41MzE5MWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19yZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X3JkYi5kdHMKQEAgLTE1NSwyNCArMTU1LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc3LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3Ny1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc3LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc3LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMzE1LDcgKzMxOSw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OF9tZHMuZHRzCmluZGV4IGVkMzJjOGQuLjY3YTA4ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfbWRzLmR0cwpAQCAtMTM2LDYgKzEzNiwxMyBAQAogCQkJaW50ZXJydXB0cyA9IDwxNCAweDg+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQlkZnNycjsKKworCQkJcnRjQDY4IHsKKwkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOworCQkJCXJlZyA9IDwweDY4PjsKKwkJCQlpbnRlcnJ1cHRzID0gPDE5IDB4OD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCQl9OwogCQl9OwogCiAJCWkyY0AzMTAwIHsKQEAgLTE3MCwyNCArMTc3LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc4LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc4LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc4LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMzYwLDcgKzM3MSw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X3JkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OF9yZGIuZHRzCmluZGV4IDM0YTdmMmYuLjRhMDkxNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X3JkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfcmRiLmR0cwpAQCAtMTU1LDI0ICsxNTUsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzgtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc4LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzgtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzgtZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zMDEsNyArMzA1LDggQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMD47CisJCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwCQkvKiBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKwkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc5X21kcy5kdHMKaW5kZXggZjRkYjllZC4uMzIzMzcwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OV9tZHMuZHRzCkBAIC0xMzYsNiArMTM2LDEzIEBACiAJCQlpbnRlcnJ1cHRzID0gPDE0IDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCWRmc3JyOworCisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTM3NCI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJCWludGVycnVwdHMgPSA8MTkgMHg4PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKKwkJCX07CiAJCX07CiAKIAkJaTJjQDMxMDAgewpAQCAtMTcwLDI0ICsxNzcsMjggQEAKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4Mzc5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxMDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4MTgwIDB4Mjg+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CkBAIC0zODgsNyArMzk5LDggQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMD47CisJCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwCQkvKiBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKwkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc5X3JkYi5kdHMKaW5kZXggZTRkNzAzMC4uYmJkODg0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OV9yZGIuZHRzCkBAIC0xNTUsMjQgKzE1NSwyOCBAQAogCQkJZG1hLWNoYW5uZWxAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAODAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNzktZG1hLWNoYW5uZWwiLCAiZnNsLGVsby1kbWEtY2hhbm5lbCI7CiAJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDEwMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDE4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM3OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHgxODAgMHgyOD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDcxIDg+OwogCQkJfTsKQEAgLTMyOSw3ICszMzMsOCBAQAogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDA4NTAwIDB4MTAwPjsKKwkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDAJCS8qIGludGVybmFsIHJlZ2lzdGVycyAqLworCQkgICAgICAgMHhlMDAwODMwMCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTM2ZHMuZHRzCmluZGV4IDE1MDVkNjguLjkzZmRkOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTM2ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTM2ZHMuZHRzCkBAIC05MSw2ICs5MSw4IEBACiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMzIzMiI7CiAJCQkJcmVnID0gPDB4Njg+OworCQkJCWludGVycnVwdHMgPSA8MCAweDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJfTsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2MTBfaHBjZC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODYxMF9ocGNkLmR0cwppbmRleCAzYjNhMTA2Li5mNzI0ZDcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODYxMF9ocGNkLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODYxMF9ocGNkLmR0cwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJCQlyZWcgPSA8MHhlNDAwMCAweDEwMD47CiAJCX07CiAKLQkJaTJzQDE2MDAwIHsKKwkJc3NpQDE2MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtc3NpIjsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlyZWcgPSA8MHgxNjAwMCAweDEwMD47CkBAIC0yMTUsNiArMjE1LDggQEAKIAkJCWludGVycnVwdHMgPSA8NjIgMj47CiAJCQlmc2wsbW9kZSA9ICJpMnMtc2xhdmUiOwogCQkJY29kZWMtaGFuZGxlID0gPCZjczQyNzA+OworCQkJZnNsLHBsYXliYWNrLWRtYSA9IDwmZG1hMDA+OworCQkJZnNsLGNhcHR1cmUtZG1hID0gPCZkbWEwMT47CiAJCX07CiAKIAkJc3NpQDE2MTAwIHsKQEAgLTIzMywxNyArMjM1LDE3IEBACiAJCQlyZWcgPSA8MHgyMTMwMCAweDQ+OyAvKiBETUEgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KIAkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47CiAKLQkJCWRtYS1jaGFubmVsQDAgeworCQkJZG1hMDA6IGRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZG1hLWNoYW5uZWwiLAotCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCQkiZnNsLHNzaS1kbWEtY2hhbm5lbCI7CiAJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlyZWcgPSA8MHgwIDB4ODA+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MjAgMj47CiAJCQl9OwotCQkJZG1hLWNoYW5uZWxAMSB7CisJCQlkbWEwMTogZG1hLWNoYW5uZWxAMSB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1kbWEtY2hhbm5lbCIsCi0JCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJCSJmc2wsc3NpLWRtYS1jaGFubmVsIjsKIAkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCXJlZyA9IDwweDgwIDB4ODA+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwpAQCAtMjgxLDcgKzI4Myw3IEBACiAJCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCQlyZWcgPSA8MHgwIDB4ODA+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NjAgMj47CisJCQkJaW50ZXJydXB0cyA9IDw3NiAyPjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEAxIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjEwLWRtYS1jaGFubmVsIiwKQEAgLTI4OSw3ICsyOTEsNyBAQAogCQkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQkJcmVnID0gPDB4ODAgMHg4MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw2MSAyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc3IDI+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDIgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZG1hLWNoYW5uZWwiLApAQCAtMjk3LDcgKzI5OSw3IEBACiAJCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw2MiAyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc4IDI+OwogCQkJfTsKIAkJCWRtYS1jaGFubmVsQDMgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZG1hLWNoYW5uZWwiLApAQCAtMzA1LDcgKzMwNyw3IEBACiAJCQkJY2VsbC1pbmRleCA9IDwzPjsKIAkJCQlyZWcgPSA8MHgxODAgMHg4MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw2MyAyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc5IDI+OwogCQkJfTsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzgzNDkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzgzNDkuZHRzCmluZGV4IDQ1Zjc4OWIuLjBmOTQxZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4MzQ5LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODM0OS5kdHMKQEAgLTEwNywyNCArMTA3LDI4IEBACiAJCQlkbWEtY2hhbm5lbEAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCQkJaW50ZXJydXB0cyA9IDw3MSA4PjsKIAkJCX07CiAJCQlkbWEtY2hhbm5lbEA4MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1kbWEtY2hhbm5lbCIsICJmc2wsZWxvLWRtYS1jaGFubmVsIjsKIAkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTAwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwogCQkJZG1hLWNoYW5uZWxAMTgwIHsKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWRtYS1jaGFubmVsIiwgImZzbCxlbG8tZG1hLWNoYW5uZWwiOwogCQkJCXJlZyA9IDwweDE4MCAweDI4PjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJCWludGVycnVwdHMgPSA8NzEgOD47CiAJCQl9OwpAQCAtMjY4LDcgKzI3Miw4IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDg1MDAgMHgxMDA+OworCQlyZWcgPSA8MHhlMDAwODUwMCAweDEwMAkJLyogaW50ZXJuYWwgcmVnaXN0ZXJzICovCisJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cwppbmRleCA3MmQxNWYwLi4zYjI5NWU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCkBAIC0yNDYsMTMgKzI0NiwyMiBAQAogCSAgIAkJfTsKIAogCQkJSUlDMDogaTJjQGVmNjAwNzAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCQljb21wYXRpYmxlID0gImlibSxpaWMtNDQwZXB4IiwgImlibSxpaWMiOwogCQkJCXJlZyA9IDwweGVmNjAwNzAwIDB4MDAwMDAwMTQ+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OwogCQkJCWludGVycnVwdHMgPSA8MHgyIDB4ND47CisKKwkJCQlod21vbkA0OCB7CisJCQkJCWNvbXBhdGlibGUgPSAiYWRpLGFkNzQxNCI7CisJCQkJCXJlZyA9IDwweDQ4PjsKKwkJCQl9OwogCQkJfTsKIAogCQkJSUlDMTogaTJjQGVmNjAwODAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCQljb21wYXRpYmxlID0gImlibSxpaWMtNDQwZXB4IiwgImlibSxpaWMiOwogCQkJCXJlZyA9IDwweGVmNjAwODAwIDB4MDAwMDAwMTQ+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy95b3NlbWl0ZS5kdHMKaW5kZXggZTM5NDIyYS4uMWZhM2NiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveW9zZW1pdGUuZHRzCkBAIC0xNSw3ICsxNSw3IEBACiAJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJI3NpemUtY2VsbHMgPSA8MT47CiAJbW9kZWwgPSAiYW1jYyx5b3NlbWl0ZSI7Ci0JY29tcGF0aWJsZSA9ICJhbWNjLHlvc2VtaXRlIiwiYW1jYyxiYW1ib28iOworCWNvbXBhdGlibGUgPSAiYW1jYyx5b3NlbWl0ZSI7CiAJZGNyLXBhcmVudCA9IDwmey9jcHVzL2NwdUAwfT47CiAKIAlhbGlhc2VzIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2VsZl91dGlsLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9lbGZfdXRpbC5jCmluZGV4IDc0NTRhYTQuLjE1NjdhMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2VsZl91dGlsLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWxmX3V0aWwuYwpAQCAtMjcsNyArMjcsOCBAQAogCSAgICAgIGVsZjY0LT5lX2lkZW50W0VJX01BRzNdICA9PSBFTEZNQUczCSYmCiAJICAgICAgZWxmNjQtPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQJJiYKIAkgICAgICBlbGY2NC0+ZV9pZGVudFtFSV9EQVRBXSAgPT0gRUxGREFUQTJNU0IJJiYKLQkgICAgICBlbGY2NC0+ZV90eXBlICAgICAgICAgICAgPT0gRVRfRVhFQwkmJgorCSAgICAgIChlbGY2NC0+ZV90eXBlICAgICAgICAgICAgPT0gRVRfRVhFQyB8fAorCSAgICAgICBlbGY2NC0+ZV90eXBlICAgICAgICAgICAgPT0gRVRfRFlOKQkmJgogCSAgICAgIGVsZjY0LT5lX21hY2hpbmUgICAgICAgICA9PSBFTV9QUEM2NCkpCiAJCXJldHVybiAwOwogCkBAIC01OCw3ICs1OSw4IEBACiAJICAgICAgZWxmMzItPmVfaWRlbnRbRUlfTUFHM10gID09IEVMRk1BRzMJJiYKIAkgICAgICBlbGYzMi0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMgkmJgogCSAgICAgIGVsZjMyLT5lX2lkZW50W0VJX0RBVEFdICA9PSBFTEZEQVRBMk1TQgkmJgotCSAgICAgIGVsZjMyLT5lX3R5cGUgICAgICAgICAgICA9PSBFVF9FWEVDCSYmCisJICAgICAgKGVsZjMyLT5lX3R5cGUgICAgICAgICAgICA9PSBFVF9FWEVDIHx8CisJICAgICAgIGVsZjMyLT5lX3R5cGUgICAgICAgICAgICA9PSBFVF9EWU4pICAgICAgJiYKIAkgICAgICBlbGYzMi0+ZV9tYWNoaW5lICAgICAgICAgPT0gRU1fUFBDKSkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9NYWtlZmlsZS5saWJmZHQgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvTWFrZWZpbGUubGliZmR0CmluZGV4IDgyZjljNmEuLjZjNDJhY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9NYWtlZmlsZS5saWJmZHQKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L01ha2VmaWxlLmxpYmZkdApAQCAtMywxMiArMyw2IEBACiAjIFRoaXMgaXMgbm90IGEgY29tcGxldGUgTWFrZWZpbGUgb2YgaXRzZWxmLiAgSW5zdGVhZCwgaXQgaXMgZGVzaWduZWQgdG8KICMgYmUgZWFzaWx5IGVtYmVkZGFibGUgaW50byBvdGhlciBzeXN0ZW1zIG9mIE1ha2VmaWxlcy4KICMKLUxJQkZEVF9TUkNTID0gZmR0LmMgZmR0X3JvLmMgZmR0X3dpcC5jIGZkdF9zdy5jIGZkdF9ydy5jIGZkdF9zdHJlcnJvci5jCiBMSUJGRFRfSU5DTFVERVMgPSBmZHQuaCBsaWJmZHQuaAotTElCRkRUX0VYVFJBID0gbGliZmR0X2ludGVybmFsLmgKLUxJQkZEVF9MSUIgPSBsaWJmZHQvbGliZmR0LmEKLQorTElCRkRUX1NSQ1MgPSBmZHQuYyBmZHRfcm8uYyBmZHRfd2lwLmMgZmR0X3N3LmMgZmR0X3J3LmMgZmR0X3N0cmVycm9yLmMKIExJQkZEVF9PQkpTID0gJChMSUJGRFRfU1JDUzolLmM9JS5vKQotCi0kKExJQkZEVF9vYmpkaXIpLyQoTElCRkRUX0xJQik6ICQoYWRkcHJlZml4ICQoTElCRkRUX29iamRpcikvLCQoTElCRkRUX09CSlMpKQotCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0LmMKaW5kZXggNTg2YTM2MS4uMmFjYWVjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHQuYwpAQCAtNjMsNyArNjMsNyBAQAogCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFZFUlNJT047CiAJCWlmIChmZHRfbGFzdF9jb21wX3ZlcnNpb24oZmR0KSA+IEZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKQogCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFZFUlNJT047Ci0JfSBlbHNlIGlmIChmZHRfbWFnaWMoZmR0KSA9PSBTV19NQUdJQykgeworCX0gZWxzZSBpZiAoZmR0X21hZ2ljKGZkdCkgPT0gRkRUX1NXX01BR0lDKSB7CiAJCS8qIFVuZmluaXNoZWQgc2VxdWVudGlhbC13cml0ZSBibG9iICovCiAJCWlmIChmZHRfc2l6ZV9kdF9zdHJ1Y3QoZmR0KSA9PSAwKQogCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUQVRFOwpAQCAtNzYsNyArNzYsNyBAQAogCiBjb25zdCB2b2lkICpmZHRfb2Zmc2V0X3B0cihjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQsIGludCBsZW4pCiB7Ci0JY29uc3Qgdm9pZCAqcDsKKwljb25zdCBjaGFyICpwOwogCiAJaWYgKGZkdF92ZXJzaW9uKGZkdCkgPj0gMHgxMSkKIAkJaWYgKCgob2Zmc2V0ICsgbGVuKSA8IG9mZnNldCkKQEAgLTEyNCwxMSArMTI0LDU5IEBACiAJfQogCiAJaWYgKG5leHRvZmZzZXQpCi0JCSpuZXh0b2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBGRFRfVEFHU0laRSk7CisJCSpuZXh0b2Zmc2V0ID0gRkRUX1RBR0FMSUdOKG9mZnNldCk7CiAKIAlyZXR1cm4gdGFnOwogfQogCitpbnQgX2ZkdF9jaGVja19ub2RlX29mZnNldChjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQpCit7CisJaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ICUgRkRUX1RBR1NJWkUpCisJICAgIHx8IChmZHRfbmV4dF90YWcoZmR0LCBvZmZzZXQsICZvZmZzZXQpICE9IEZEVF9CRUdJTl9OT0RFKSkKKwkJcmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBmZHRfbmV4dF9ub2RlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwgaW50ICpkZXB0aCkKK3sKKwlpbnQgbmV4dG9mZnNldCA9IDA7CisJdWludDMyX3QgdGFnOworCisJaWYgKG9mZnNldCA+PSAwKQorCQlpZiAoKG5leHRvZmZzZXQgPSBfZmR0X2NoZWNrX25vZGVfb2Zmc2V0KGZkdCwgb2Zmc2V0KSkgPCAwKQorCQkJcmV0dXJuIG5leHRvZmZzZXQ7CisKKwlkbyB7CisJCW9mZnNldCA9IG5leHRvZmZzZXQ7CisJCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG9mZnNldCwgJm5leHRvZmZzZXQpOworCisJCXN3aXRjaCAodGFnKSB7CisJCWNhc2UgRkRUX1BST1A6CisJCWNhc2UgRkRUX05PUDoKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX0JFR0lOX05PREU6CisJCQlpZiAoZGVwdGgpCisJCQkJKCpkZXB0aCkrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX0VORF9OT0RFOgorCQkJaWYgKGRlcHRoKQorCQkJCSgqZGVwdGgpLS07CisJCQlicmVhazsKKworCQljYXNlIEZEVF9FTkQ6CisJCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisJCX0KKwl9IHdoaWxlICh0YWcgIT0gRkRUX0JFR0lOX05PREUpOworCisJcmV0dXJuIG9mZnNldDsKK30KKwogY29uc3QgY2hhciAqX2ZkdF9maW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHJ0YWIsIGludCB0YWJzaXplLCBjb25zdCBjaGFyICpzKQogewogCWludCBsZW4gPSBzdHJsZW4ocykgKyAxOwpAQCAtMTM2LDE3ICsxODQsMTQgQEAKIAljb25zdCBjaGFyICpwOwogCiAJZm9yIChwID0gc3RydGFiOyBwIDw9IGxhc3Q7IHArKykKLQkJaWYgKG1lbWVxKHAsIHMsIGxlbikpCisJCWlmIChtZW1jbXAocCwgcywgbGVuKSA9PSAwKQogCQkJcmV0dXJuIHA7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBmZHRfbW92ZShjb25zdCB2b2lkICpmZHQsIHZvaWQgKmJ1ZiwgaW50IGJ1ZnNpemUpCiB7Ci0JaW50IGVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJaWYgKGZkdF90b3RhbHNpemUoZmR0KSA+IGJ1ZnNpemUpCiAJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9yby5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9yby5jCmluZGV4IDEyYTM3ZDUuLjEyOWI1MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHRfcm8uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3JvLmMKQEAgLTU1LDE3ICs1NSwxMCBAQAogCiAjaW5jbHVkZSAibGliZmR0X2ludGVybmFsLmgiCiAKLSNkZWZpbmUgQ0hFQ0tfSEVBREVSKGZkdCkgXAotCXsgXAotCQlpbnQgZXJyOyBcCi0JCWlmICgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKSBcCi0JCQlyZXR1cm4gZXJyOyBcCi0JfQotCi1zdGF0aWMgaW50IG5vZGVuYW1lX2VxKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pCitzdGF0aWMgaW50IF9mZHRfbm9kZW5hbWVfZXEoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LAorCQkJICAgIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pCiB7Ci0JY29uc3QgY2hhciAqcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0LCBsZW4rMSk7CisJY29uc3QgY2hhciAqcCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0ICsgRkRUX1RBR1NJWkUsIGxlbisxKTsKIAogCWlmICghIHApCiAJCS8qIHNob3J0IG1hdGNoICovCkBAIC04NCwxMiArNzcsMTIgQEAKIAogY29uc3QgY2hhciAqZmR0X3N0cmluZyhjb25zdCB2b2lkICpmZHQsIGludCBzdHJvZmZzZXQpCiB7Ci0JcmV0dXJuIChjaGFyICopZmR0ICsgZmR0X29mZl9kdF9zdHJpbmdzKGZkdCkgKyBzdHJvZmZzZXQ7CisJcmV0dXJuIChjb25zdCBjaGFyICopZmR0ICsgZmR0X29mZl9kdF9zdHJpbmdzKGZkdCkgKyBzdHJvZmZzZXQ7CiB9CiAKIGludCBmZHRfZ2V0X21lbV9yc3YoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbiwgdWludDY0X3QgKmFkZHJlc3MsIHVpbnQ2NF90ICpzaXplKQogewotCUNIRUNLX0hFQURFUihmZHQpOworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKIAkqYWRkcmVzcyA9IGZkdDY0X3RvX2NwdShfZmR0X21lbV9yc3YoZmR0LCBuKS0+YWRkcmVzcyk7CiAJKnNpemUgPSBmZHQ2NF90b19jcHUoX2ZkdF9tZW1fcnN2KGZkdCwgbiktPnNpemUpOwogCXJldHVybiAwOwpAQCAtMTA0LDUwICs5NywyNCBAQAogCXJldHVybiBpOwogfQogCi1pbnQgZmR0X3N1Ym5vZGVfb2Zmc2V0X25hbWVsZW4oY29uc3Qgdm9pZCAqZmR0LCBpbnQgcGFyZW50b2Zmc2V0LAoraW50IGZkdF9zdWJub2RlX29mZnNldF9uYW1lbGVuKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKIHsKLQlpbnQgbGV2ZWwgPSAwOwotCXVpbnQzMl90IHRhZzsKLQlpbnQgb2Zmc2V0LCBuZXh0b2Zmc2V0OworCWludCBkZXB0aDsKIAotCUNIRUNLX0hFQURFUihmZHQpOworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKIAotCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIHBhcmVudG9mZnNldCwgJm5leHRvZmZzZXQpOwotCWlmICh0YWcgIT0gRkRUX0JFR0lOX05PREUpCi0JCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJZm9yIChkZXB0aCA9IDA7CisJICAgICBvZmZzZXQgPj0gMDsKKwkgICAgIG9mZnNldCA9IGZkdF9uZXh0X25vZGUoZmR0LCBvZmZzZXQsICZkZXB0aCkpIHsKKwkJaWYgKGRlcHRoIDwgMCkKKwkJCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwkJZWxzZSBpZiAoKGRlcHRoID09IDEpCisJCQkgJiYgX2ZkdF9ub2RlbmFtZV9lcShmZHQsIG9mZnNldCwgbmFtZSwgbmFtZWxlbikpCisJCQlyZXR1cm4gb2Zmc2V0OworCX0KIAotCWRvIHsKLQkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zmc2V0LCAmbmV4dG9mZnNldCk7Ci0KLQkJc3dpdGNoICh0YWcpIHsKLQkJY2FzZSBGRFRfRU5EOgotCQkJcmV0dXJuIC1GRFRfRVJSX1RSVU5DQVRFRDsKLQotCQljYXNlIEZEVF9CRUdJTl9OT0RFOgotCQkJbGV2ZWwrKzsKLQkJCWlmIChsZXZlbCAhPSAxKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5vZGVuYW1lX2VxKGZkdCwgb2Zmc2V0K0ZEVF9UQUdTSVpFLCBuYW1lLCBuYW1lbGVuKSkKLQkJCQkvKiBGb3VuZCBpdCEgKi8KLQkJCQlyZXR1cm4gb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGRFRfRU5EX05PREU6Ci0JCQlsZXZlbC0tOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGRFRfUFJPUDoKLQkJY2FzZSBGRFRfTk9QOgotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7Ci0JCX0KLQl9IHdoaWxlIChsZXZlbCA+PSAwKTsKLQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gb2Zmc2V0OyAvKiBlcnJvciAqLwogfQogCiBpbnQgZmR0X3N1Ym5vZGVfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNldCwKQEAgLTE2Miw3ICsxMjksNyBAQAogCWNvbnN0IGNoYXIgKnAgPSBwYXRoOwogCWludCBvZmZzZXQgPSAwOwogCi0JQ0hFQ0tfSEVBREVSKGZkdCk7CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJaWYgKCpwYXRoICE9ICcvJykKIAkJcmV0dXJuIC1GRFRfRVJSX0JBRFBBVEg7CkBAIC0xOTAsMTYgKzE1NywxMiBAQAogCiBjb25zdCBjaGFyICpmZHRfZ2V0X25hbWUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgaW50ICpsZW4pCiB7Ci0JY29uc3Qgc3RydWN0IGZkdF9ub2RlX2hlYWRlciAqbmg7CisJY29uc3Qgc3RydWN0IGZkdF9ub2RlX2hlYWRlciAqbmggPSBfZmR0X29mZnNldF9wdHIoZmR0LCBub2Rlb2Zmc2V0KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBmZHRfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApCi0JCWdvdG8gZmFpbDsKLQotCWVyciA9IC1GRFRfRVJSX0JBRE9GRlNFVDsKLQluaCA9IGZkdF9vZmZzZXRfcHRyKGZkdCwgbm9kZW9mZnNldCwgc2l6ZW9mKCpuaCkpOwotCWlmICghbmggfHwgKGZkdDMyX3RvX2NwdShuaC0+dGFnKSAhPSBGRFRfQkVHSU5fTk9ERSkpCi0JCWdvdG8gZmFpbDsKKwlpZiAoKChlcnIgPSBmZHRfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApCisJICAgIHx8ICgoZXJyID0gX2ZkdF9jaGVja19ub2RlX29mZnNldChmZHQsIG5vZGVvZmZzZXQpKSA8IDApKQorCQkJZ290byBmYWlsOwogCiAJaWYgKGxlbikKIAkJKmxlbiA9IHN0cmxlbihuaC0+bmFtZSk7CkBAIC0yMjIsMTcgKzE4NSwxMSBAQAogCWludCBvZmZzZXQsIG5leHRvZmZzZXQ7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKQotCQlnb3RvIGZhaWw7CisJaWYgKCgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKQorCSAgICB8fCAoKGVyciA9IF9mZHRfY2hlY2tfbm9kZV9vZmZzZXQoZmR0LCBub2Rlb2Zmc2V0KSkgPCAwKSkKKwkJCWdvdG8gZmFpbDsKIAotCWVyciA9IC1GRFRfRVJSX0JBRE9GRlNFVDsKLQlpZiAobm9kZW9mZnNldCAlIEZEVF9UQUdTSVpFKQotCQlnb3RvIGZhaWw7Ci0KLQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBub2Rlb2Zmc2V0LCAmbmV4dG9mZnNldCk7Ci0JaWYgKHRhZyAhPSBGRFRfQkVHSU5fTk9ERSkKLQkJZ290byBmYWlsOwotCisJbmV4dG9mZnNldCA9IGVycjsKIAlkbyB7CiAJCW9mZnNldCA9IG5leHRvZmZzZXQ7CiAKQEAgLTI1Myw3ICsyMTAsNyBAQAogCQkJaWYgKCEgcHJvcCkKIAkJCQlnb3RvIGZhaWw7CiAJCQluYW1lc3Ryb2ZmID0gZmR0MzJfdG9fY3B1KHByb3AtPm5hbWVvZmYpOwotCQkJaWYgKHN0cmVxKGZkdF9zdHJpbmcoZmR0LCBuYW1lc3Ryb2ZmKSwgbmFtZSkpIHsKKwkJCWlmIChzdHJjbXAoZmR0X3N0cmluZyhmZHQsIG5hbWVzdHJvZmYpLCBuYW1lKSA9PSAwKSB7CiAJCQkJLyogRm91bmQgaXQhICovCiAJCQkJaW50IGxlbiA9IGZkdDMyX3RvX2NwdShwcm9wLT5sZW4pOwogCQkJCXByb3AgPSBmZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCwKQEAgLTMwNywxMTUgKzI2NCw5MSBAQAogCiBpbnQgZmR0X2dldF9wYXRoKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKLQl1aW50MzJfdCB0YWc7Ci0JaW50IHAgPSAwLCBvdmVyZmxvdyA9IDA7Ci0JaW50IG9mZnNldCwgbmV4dG9mZnNldCwgbmFtZWxlbjsKKwlpbnQgcGRlcHRoID0gMCwgcCA9IDA7CisJaW50IG9mZnNldCwgZGVwdGgsIG5hbWVsZW47CiAJY29uc3QgY2hhciAqbmFtZTsKIAotCUNIRUNLX0hFQURFUihmZHQpOwotCi0JdGFnID0gZmR0X25leHRfdGFnKGZkdCwgMCwgJm5leHRvZmZzZXQpOwotCWlmICh0YWcgIT0gRkRUX0JFR0lOX05PREUpCi0JCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJaWYgKGJ1ZmxlbiA8IDIpCiAJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwotCWJ1ZlswXSA9ICcvJzsKLQlwID0gMTsKIAotCXdoaWxlIChuZXh0b2Zmc2V0IDw9IG5vZGVvZmZzZXQpIHsKLQkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zmc2V0LCAmbmV4dG9mZnNldCk7Ci0JCXN3aXRjaCAodGFnKSB7Ci0JCWNhc2UgRkRUX0VORDoKLQkJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJZm9yIChvZmZzZXQgPSAwLCBkZXB0aCA9IDA7CisJICAgICAob2Zmc2V0ID49IDApICYmIChvZmZzZXQgPD0gbm9kZW9mZnNldCk7CisJICAgICBvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgb2Zmc2V0LCAmZGVwdGgpKSB7CisJCWlmIChwZGVwdGggPCBkZXB0aCkKKwkJCWNvbnRpbnVlOyAvKiBvdmVyZmxvd2VkIGJ1ZmZlciAqLwogCi0JCWNhc2UgRkRUX0JFR0lOX05PREU6Ci0JCQluYW1lID0gZmR0X2dldF9uYW1lKGZkdCwgb2Zmc2V0LCAmbmFtZWxlbik7Ci0JCQlpZiAoIW5hbWUpCi0JCQkJcmV0dXJuIG5hbWVsZW47Ci0JCQlpZiAob3ZlcmZsb3cgfHwgKChwICsgbmFtZWxlbiArIDEpID4gYnVmbGVuKSkgewotCQkJCW92ZXJmbG93Kys7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCXdoaWxlIChwZGVwdGggPiBkZXB0aCkgeworCQkJZG8geworCQkJCXAtLTsKKwkJCX0gd2hpbGUgKGJ1ZltwLTFdICE9ICcvJyk7CisJCQlwZGVwdGgtLTsKKwkJfQorCisJCW5hbWUgPSBmZHRfZ2V0X25hbWUoZmR0LCBvZmZzZXQsICZuYW1lbGVuKTsKKwkJaWYgKCFuYW1lKQorCQkJcmV0dXJuIG5hbWVsZW47CisJCWlmICgocCArIG5hbWVsZW4gKyAxKSA8PSBidWZsZW4pIHsKIAkJCW1lbWNweShidWYgKyBwLCBuYW1lLCBuYW1lbGVuKTsKIAkJCXAgKz0gbmFtZWxlbjsKIAkJCWJ1ZltwKytdID0gJy8nOwotCQkJYnJlYWs7CisJCQlwZGVwdGgrKzsKKwkJfQogCi0JCWNhc2UgRkRUX0VORF9OT0RFOgotCQkJaWYgKG92ZXJmbG93KSB7Ci0JCQkJb3ZlcmZsb3ctLTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRvIHsKKwkJaWYgKG9mZnNldCA9PSBub2Rlb2Zmc2V0KSB7CisJCQlpZiAocGRlcHRoIDwgKGRlcHRoICsgMSkpCisJCQkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisKKwkJCWlmIChwID4gMSkgLyogc3BlY2lhbCBjYXNlIHNvIHRoYXQgcm9vdCBwYXRoIGlzICIvIiwgbm90ICIiICovCiAJCQkJcC0tOwotCQkJfSB3aGlsZSAgKGJ1ZltwLTFdICE9ICcvJyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEZEVF9QUk9QOgotCQljYXNlIEZEVF9OT1A6Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKKwkJCWJ1ZltwXSA9ICdcMCc7CisJCQlyZXR1cm4gcDsKIAkJfQogCX0KIAotCWlmIChvdmVyZmxvdykKLQkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CisJaWYgKChvZmZzZXQgPT0gLUZEVF9FUlJfTk9URk9VTkQpIHx8IChvZmZzZXQgPj0gMCkpCisJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJZWxzZSBpZiAob2Zmc2V0ID09IC1GRFRfRVJSX0JBRE9GRlNFVCkKKwkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKIAotCWlmIChwID4gMSkgLyogc3BlY2lhbCBjYXNlIHNvIHRoYXQgcm9vdCBwYXRoIGlzICIvIiwgbm90ICIiICovCi0JCXAtLTsKLQlidWZbcF0gPSAnXDAnOwotCXJldHVybiBwOworCXJldHVybiBvZmZzZXQ7IC8qIGVycm9yIGZyb20gZmR0X25leHRfbm9kZSgpICovCiB9CiAKIGludCBmZHRfc3VwZXJub2RlX2F0ZGVwdGhfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCiAJCQkJIGludCBzdXBlcm5vZGVkZXB0aCwgaW50ICpub2RlZGVwdGgpCiB7Ci0JaW50IGxldmVsID0gLTE7Ci0JdWludDMyX3QgdGFnOwotCWludCBvZmZzZXQsIG5leHRvZmZzZXQgPSAwOworCWludCBvZmZzZXQsIGRlcHRoOwogCWludCBzdXBlcm5vZGVvZmZzZXQgPSAtRkRUX0VSUl9JTlRFUk5BTDsKIAotCUNIRUNLX0hFQURFUihmZHQpOworCUZEVF9DSEVDS19IRUFERVIoZmR0KTsKIAogCWlmIChzdXBlcm5vZGVkZXB0aCA8IDApCiAJCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKIAotCWRvIHsKLQkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zmc2V0LCAmbmV4dG9mZnNldCk7Ci0JCXN3aXRjaCAodGFnKSB7Ci0JCWNhc2UgRkRUX0VORDoKLQkJCXJldHVybiAtRkRUX0VSUl9CQURPRkZTRVQ7CisJZm9yIChvZmZzZXQgPSAwLCBkZXB0aCA9IDA7CisJICAgICAob2Zmc2V0ID49IDApICYmIChvZmZzZXQgPD0gbm9kZW9mZnNldCk7CisJICAgICBvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgb2Zmc2V0LCAmZGVwdGgpKSB7CisJCWlmIChkZXB0aCA9PSBzdXBlcm5vZGVkZXB0aCkKKwkJCXN1cGVybm9kZW9mZnNldCA9IG9mZnNldDsKIAotCQljYXNlIEZEVF9CRUdJTl9OT0RFOgotCQkJbGV2ZWwrKzsKLQkJCWlmIChsZXZlbCA9PSBzdXBlcm5vZGVkZXB0aCkKLQkJCQlzdXBlcm5vZGVvZmZzZXQgPSBvZmZzZXQ7Ci0JCQlicmVhazsKKwkJaWYgKG9mZnNldCA9PSBub2Rlb2Zmc2V0KSB7CisJCQlpZiAobm9kZWRlcHRoKQorCQkJCSpub2RlZGVwdGggPSBkZXB0aDsKIAotCQljYXNlIEZEVF9FTkRfTk9ERToKLQkJCWxldmVsLS07Ci0JCQlicmVhazsKLQotCQljYXNlIEZEVF9QUk9QOgotCQljYXNlIEZEVF9OT1A6Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKKwkJCWlmIChzdXBlcm5vZGVkZXB0aCA+IGRlcHRoKQorCQkJCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gc3VwZXJub2Rlb2Zmc2V0OwogCQl9Ci0JfSB3aGlsZSAob2Zmc2V0IDwgbm9kZW9mZnNldCk7CisJfQogCi0JaWYgKG5vZGVkZXB0aCkKLQkJKm5vZGVkZXB0aCA9IGxldmVsOworCWlmICgob2Zmc2V0ID09IC1GRFRfRVJSX05PVEZPVU5EKSB8fCAob2Zmc2V0ID49IDApKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFET0ZGU0VUOworCWVsc2UgaWYgKG9mZnNldCA9PSAtRkRUX0VSUl9CQURPRkZTRVQpCisJCXJldHVybiAtRkRUX0VSUl9CQURTVFJVQ1RVUkU7CiAKLQlpZiAoc3VwZXJub2RlZGVwdGggPiBsZXZlbCkKLQkJcmV0dXJuIC1GRFRfRVJSX05PVEZPVU5EOwotCXJldHVybiBzdXBlcm5vZGVvZmZzZXQ7CisJcmV0dXJuIG9mZnNldDsgLyogZXJyb3IgZnJvbSBmZHRfbmV4dF9ub2RlKCkgKi8KIH0KIAogaW50IGZkdF9ub2RlX2RlcHRoKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQpCkBAIC00NDMsNTEgKzM3NiwyNyBAQAogCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICBjb25zdCB2b2lkICpwcm9wdmFsLCBpbnQgcHJvcGxlbikKIHsKLQl1aW50MzJfdCB0YWc7Ci0JaW50IG9mZnNldCwgbmV4dG9mZnNldDsKKwlpbnQgb2Zmc2V0OwogCWNvbnN0IHZvaWQgKnZhbDsKIAlpbnQgbGVuOwogCi0JQ0hFQ0tfSEVBREVSKGZkdCk7Ci0KLQlpZiAoc3RhcnRvZmZzZXQgPj0gMCkgewotCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBzdGFydG9mZnNldCwgJm5leHRvZmZzZXQpOwotCQlpZiAodGFnICE9IEZEVF9CRUdJTl9OT0RFKQotCQkJcmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKLQl9IGVsc2UgewotCQluZXh0b2Zmc2V0ID0gMDsKLQl9CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJLyogRklYTUU6IFRoZSBhbGdvcml0aG0gaGVyZSBpcyBwcmV0dHkgaG9ycmlibGU6IHdlIHNjYW4gZWFjaAogCSAqIHByb3BlcnR5IG9mIGEgbm9kZSBpbiBmZHRfZ2V0cHJvcCgpLCB0aGVuIGlmIHRoYXQgZGlkbid0CiAJICogZmluZCB3aGF0IHdlIHdhbnQsIHdlIHNjYW4gb3ZlciB0aGVtIGFnYWluIG1ha2luZyBvdXIgd2F5CiAJICogdG8gdGhlIG5leHQgbm9kZS4gIFN0aWxsIGl0J3MgdGhlIGVhc2llc3QgdG8gaW1wbGVtZW50CiAJICogYXBwcm9hY2g7IHBlcmZvcm1hbmNlIGNhbiBjb21lIGxhdGVyLiAqLwotCWRvIHsKLQkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKLQkJdGFnID0gZmR0X25leHRfdGFnKGZkdCwgb2Zmc2V0LCAmbmV4dG9mZnNldCk7CisJZm9yIChvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgc3RhcnRvZmZzZXQsIE5VTEwpOworCSAgICAgb2Zmc2V0ID49IDA7CisJICAgICBvZmZzZXQgPSBmZHRfbmV4dF9ub2RlKGZkdCwgb2Zmc2V0LCBOVUxMKSkgeworCQl2YWwgPSBmZHRfZ2V0cHJvcChmZHQsIG9mZnNldCwgcHJvcG5hbWUsICZsZW4pOworCQlpZiAodmFsICYmIChsZW4gPT0gcHJvcGxlbikKKwkJICAgICYmIChtZW1jbXAodmFsLCBwcm9wdmFsLCBsZW4pID09IDApKQorCQkJcmV0dXJuIG9mZnNldDsKKwl9CiAKLQkJc3dpdGNoICh0YWcpIHsKLQkJY2FzZSBGRFRfQkVHSU5fTk9ERToKLQkJCXZhbCA9IGZkdF9nZXRwcm9wKGZkdCwgb2Zmc2V0LCBwcm9wbmFtZSwgJmxlbik7Ci0JCQlpZiAodmFsCi0JCQkgICAgJiYgKGxlbiA9PSBwcm9wbGVuKQotCQkJICAgICYmIChtZW1jbXAodmFsLCBwcm9wdmFsLCBsZW4pID09IDApKQotCQkJCXJldHVybiBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEZEVF9QUk9QOgotCQljYXNlIEZEVF9FTkQ6Ci0JCWNhc2UgRkRUX0VORF9OT0RFOgotCQljYXNlIEZEVF9OT1A6Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKLQkJfQotCX0gd2hpbGUgKHRhZyAhPSBGRFRfRU5EKTsKLQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gb2Zmc2V0OyAvKiBlcnJvciBmcm9tIGZkdF9uZXh0X25vZGUoKSAqLwogfQogCiBpbnQgZmR0X25vZGVfb2Zmc2V0X2J5X3BoYW5kbGUoY29uc3Qgdm9pZCAqZmR0LCB1aW50MzJfdCBwaGFuZGxlKQpAQCAtNDk5LDEwICs0MDgsMTAgQEAKIAkJCQkJICAgICAmcGhhbmRsZSwgc2l6ZW9mKHBoYW5kbGUpKTsKIH0KIAotaW50IF9zdHJpbmdsaXN0X2NvbnRhaW5zKGNvbnN0IHZvaWQgKnN0cmxpc3QsIGludCBsaXN0bGVuLCBjb25zdCBjaGFyICpzdHIpCitpbnQgX3N0cmluZ2xpc3RfY29udGFpbnMoY29uc3QgY2hhciAqc3RybGlzdCwgaW50IGxpc3RsZW4sIGNvbnN0IGNoYXIgKnN0cikKIHsKIAlpbnQgbGVuID0gc3RybGVuKHN0cik7Ci0JY29uc3Qgdm9pZCAqcDsKKwljb25zdCBjaGFyICpwOwogCiAJd2hpbGUgKGxpc3RsZW4gPj0gbGVuKSB7CiAJCWlmIChtZW1jbXAoc3RyLCBzdHJsaXN0LCBsZW4rMSkgPT0gMCkKQEAgLTUzNCw1MCArNDQzLDI0IEBACiBpbnQgZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGlibGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgc3RhcnRvZmZzZXQsCiAJCQkJICBjb25zdCBjaGFyICpjb21wYXRpYmxlKQogewotCXVpbnQzMl90IHRhZzsKLQlpbnQgb2Zmc2V0LCBuZXh0b2Zmc2V0OwotCWludCBlcnI7CisJaW50IG9mZnNldCwgZXJyOwogCi0JQ0hFQ0tfSEVBREVSKGZkdCk7Ci0KLQlpZiAoc3RhcnRvZmZzZXQgPj0gMCkgewotCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBzdGFydG9mZnNldCwgJm5leHRvZmZzZXQpOwotCQlpZiAodGFnICE9IEZEVF9CRUdJTl9OT0RFKQotCQkJcmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKLQl9IGVsc2UgewotCQluZXh0b2Zmc2V0ID0gMDsKLQl9CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJLyogRklYTUU6IFRoZSBhbGdvcml0aG0gaGVyZSBpcyBwcmV0dHkgaG9ycmlibGU6IHdlIHNjYW4gZWFjaAogCSAqIHByb3BlcnR5IG9mIGEgbm9kZSBpbiBmZHRfbm9kZV9jaGVja19jb21wYXRpYmxlKCksIHRoZW4gaWYKIAkgKiB0aGF0IGRpZG4ndCBmaW5kIHdoYXQgd2Ugd2FudCwgd2Ugc2NhbiBvdmVyIHRoZW0gYWdhaW4KIAkgKiBtYWtpbmcgb3VyIHdheSB0byB0aGUgbmV4dCBub2RlLiAgU3RpbGwgaXQncyB0aGUgZWFzaWVzdCB0bwogCSAqIGltcGxlbWVudCBhcHByb2FjaDsgcGVyZm9ybWFuY2UgY2FuIGNvbWUgbGF0ZXIuICovCi0JZG8gewotCQlvZmZzZXQgPSBuZXh0b2Zmc2V0OwotCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBvZmZzZXQsICZuZXh0b2Zmc2V0KTsKKwlmb3IgKG9mZnNldCA9IGZkdF9uZXh0X25vZGUoZmR0LCBzdGFydG9mZnNldCwgTlVMTCk7CisJICAgICBvZmZzZXQgPj0gMDsKKwkgICAgIG9mZnNldCA9IGZkdF9uZXh0X25vZGUoZmR0LCBvZmZzZXQsIE5VTEwpKSB7CisJCWVyciA9IGZkdF9ub2RlX2NoZWNrX2NvbXBhdGlibGUoZmR0LCBvZmZzZXQsIGNvbXBhdGlibGUpOworCQlpZiAoKGVyciA8IDApICYmIChlcnIgIT0gLUZEVF9FUlJfTk9URk9VTkQpKQorCQkJcmV0dXJuIGVycjsKKwkJZWxzZSBpZiAoZXJyID09IDApCisJCQlyZXR1cm4gb2Zmc2V0OworCX0KIAotCQlzd2l0Y2ggKHRhZykgewotCQljYXNlIEZEVF9CRUdJTl9OT0RFOgotCQkJZXJyID0gZmR0X25vZGVfY2hlY2tfY29tcGF0aWJsZShmZHQsIG9mZnNldCwKLQkJCQkJCQljb21wYXRpYmxlKTsKLQkJCWlmICgoZXJyIDwgMCkKLQkJCSAgICAmJiAoZXJyICE9IC1GRFRfRVJSX05PVEZPVU5EKSkKLQkJCQlyZXR1cm4gZXJyOwotCQkJZWxzZSBpZiAoZXJyID09IDApCi0JCQkJcmV0dXJuIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRkRUX1BST1A6Ci0JCWNhc2UgRkRUX0VORDoKLQkJY2FzZSBGRFRfRU5EX05PREU6Ci0JCWNhc2UgRkRUX05PUDoKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOwotCQl9Ci0JfSB3aGlsZSAodGFnICE9IEZEVF9FTkQpOwotCi0JcmV0dXJuIC1GRFRfRVJSX05PVEZPVU5EOworCXJldHVybiBvZmZzZXQ7IC8qIGVycm9yIGZyb20gZmR0X25leHRfbm9kZSgpICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3J3LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3J3LmMKaW5kZXggNjY3M2Y4ZS4uOGU3ZWM0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9ydy5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHRfcncuYwpAQCAtNTUsMTAgKzU1LDEwIEBACiAKICNpbmNsdWRlICJsaWJmZHRfaW50ZXJuYWwuaCIKIAotc3RhdGljIGludCBfYmxvY2tzX21pc29yZGVyZWQoY29uc3Qgdm9pZCAqZmR0LAorc3RhdGljIGludCBfZmR0X2Jsb2Nrc19taXNvcmRlcmVkKGNvbnN0IHZvaWQgKmZkdCwKIAkJCSAgICAgIGludCBtZW1fcnN2X3NpemUsIGludCBzdHJ1Y3Rfc2l6ZSkKIHsKLQlyZXR1cm4gKGZkdF9vZmZfbWVtX3Jzdm1hcChmZHQpIDwgQUxJR04oc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSwgOCkpCisJcmV0dXJuIChmZHRfb2ZmX21lbV9yc3ZtYXAoZmR0KSA8IEZEVF9BTElHTihzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpLCA4KSkKIAkJfHwgKGZkdF9vZmZfZHRfc3RydWN0KGZkdCkgPAogCQkgICAgKGZkdF9vZmZfbWVtX3Jzdm1hcChmZHQpICsgbWVtX3Jzdl9zaXplKSkKIAkJfHwgKGZkdF9vZmZfZHRfc3RyaW5ncyhmZHQpIDwKQEAgLTY3LDE2ICs2NywxNCBAQAogCQkgICAgKGZkdF9vZmZfZHRfc3RyaW5ncyhmZHQpICsgZmR0X3NpemVfZHRfc3RyaW5ncyhmZHQpKSk7CiB9CiAKLXN0YXRpYyBpbnQgcndfY2hlY2tfaGVhZGVyKHZvaWQgKmZkdCkKK3N0YXRpYyBpbnQgX2ZkdF9yd19jaGVja19oZWFkZXIodm9pZCAqZmR0KQogewotCWludCBlcnI7CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCi0JaWYgKChlcnIgPSBmZHRfY2hlY2tfaGVhZGVyKGZkdCkpKQotCQlyZXR1cm4gZXJyOwogCWlmIChmZHRfdmVyc2lvbihmZHQpIDwgMTcpCiAJCXJldHVybiAtRkRUX0VSUl9CQURWRVJTSU9OOwotCWlmIChfYmxvY2tzX21pc29yZGVyZWQoZmR0LCBzaXplb2Yoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5KSwKLQkJCSAgICAgICBmZHRfc2l6ZV9kdF9zdHJ1Y3QoZmR0KSkpCisJaWYgKF9mZHRfYmxvY2tzX21pc29yZGVyZWQoZmR0LCBzaXplb2Yoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5KSwKKwkJCQkgICBmZHRfc2l6ZV9kdF9zdHJ1Y3QoZmR0KSkpCiAJCXJldHVybiAtRkRUX0VSUl9CQURMQVlPVVQ7CiAJaWYgKGZkdF92ZXJzaW9uKGZkdCkgPiAxNykKIAkJZmR0X3NldF92ZXJzaW9uKGZkdCwgMTcpOwpAQCAtODQsMzYgKzgyLDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgUldfQ0hFQ0tfSEVBREVSKGZkdCkgXAorI2RlZmluZSBGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCkgXAogCXsgXAogCQlpbnQgZXJyOyBcCi0JCWlmICgoZXJyID0gcndfY2hlY2tfaGVhZGVyKGZkdCkpICE9IDApIFwKKwkJaWYgKChlcnIgPSBfZmR0X3J3X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKSBcCiAJCQlyZXR1cm4gZXJyOyBcCiAJfQogCi1zdGF0aWMgaW5saW5lIGludCBfYmxvYl9kYXRhX3NpemUodm9pZCAqZmR0KQorc3RhdGljIGlubGluZSBpbnQgX2ZkdF9kYXRhX3NpemUodm9pZCAqZmR0KQogewogCXJldHVybiBmZHRfb2ZmX2R0X3N0cmluZ3MoZmR0KSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKIH0KIAotc3RhdGljIGludCBfYmxvYl9zcGxpY2Uodm9pZCAqZmR0LCB2b2lkICpwLCBpbnQgb2xkbGVuLCBpbnQgbmV3bGVuKQorc3RhdGljIGludCBfZmR0X3NwbGljZSh2b2lkICpmZHQsIHZvaWQgKnNwbGljZXBvaW50LCBpbnQgb2xkbGVuLCBpbnQgbmV3bGVuKQogewotCXZvaWQgKmVuZCA9IGZkdCArIF9ibG9iX2RhdGFfc2l6ZShmZHQpOworCWNoYXIgKnAgPSBzcGxpY2Vwb2ludDsKKwljaGFyICplbmQgPSAoY2hhciAqKWZkdCArIF9mZHRfZGF0YV9zaXplKGZkdCk7CiAKIAlpZiAoKChwICsgb2xkbGVuKSA8IHApIHx8ICgocCArIG9sZGxlbikgPiBlbmQpKQogCQlyZXR1cm4gLUZEVF9FUlJfQkFET0ZGU0VUOwotCWlmICgoZW5kIC0gb2xkbGVuICsgbmV3bGVuKSA+IChmZHQgKyBmZHRfdG90YWxzaXplKGZkdCkpKQorCWlmICgoZW5kIC0gb2xkbGVuICsgbmV3bGVuKSA+ICgoY2hhciAqKWZkdCArIGZkdF90b3RhbHNpemUoZmR0KSkpCiAJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwogCW1lbW1vdmUocCArIG5ld2xlbiwgcCArIG9sZGxlbiwgZW5kIC0gcCAtIG9sZGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2Jsb2Jfc3BsaWNlX21lbV9yc3Yodm9pZCAqZmR0LCBzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKnAsCi0JCQkJaW50IG9sZG4sIGludCBuZXduKQorc3RhdGljIGludCBfZmR0X3NwbGljZV9tZW1fcnN2KHZvaWQgKmZkdCwgc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpwLAorCQkJICAgICAgIGludCBvbGRuLCBpbnQgbmV3bikKIHsKIAlpbnQgZGVsdGEgPSAobmV3biAtIG9sZG4pICogc2l6ZW9mKCpwKTsKIAlpbnQgZXJyOwotCWVyciA9IF9ibG9iX3NwbGljZShmZHQsIHAsIG9sZG4gKiBzaXplb2YoKnApLCBuZXduICogc2l6ZW9mKCpwKSk7CisJZXJyID0gX2ZkdF9zcGxpY2UoZmR0LCBwLCBvbGRuICogc2l6ZW9mKCpwKSwgbmV3biAqIHNpemVvZigqcCkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJZmR0X3NldF9vZmZfZHRfc3RydWN0KGZkdCwgZmR0X29mZl9kdF9zdHJ1Y3QoZmR0KSArIGRlbHRhKTsKQEAgLTEyMSwxMyArMTIwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2Jsb2Jfc3BsaWNlX3N0cnVjdCh2b2lkICpmZHQsIHZvaWQgKnAsCi0JCQkgICAgICAgaW50IG9sZGxlbiwgaW50IG5ld2xlbikKK3N0YXRpYyBpbnQgX2ZkdF9zcGxpY2Vfc3RydWN0KHZvaWQgKmZkdCwgdm9pZCAqcCwKKwkJCSAgICAgIGludCBvbGRsZW4sIGludCBuZXdsZW4pCiB7CiAJaW50IGRlbHRhID0gbmV3bGVuIC0gb2xkbGVuOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IF9ibG9iX3NwbGljZShmZHQsIHAsIG9sZGxlbiwgbmV3bGVuKSkpCisJaWYgKChlcnIgPSBfZmR0X3NwbGljZShmZHQsIHAsIG9sZGxlbiwgbmV3bGVuKSkpCiAJCXJldHVybiBlcnI7CiAKIAlmZHRfc2V0X3NpemVfZHRfc3RydWN0KGZkdCwgZmR0X3NpemVfZHRfc3RydWN0KGZkdCkgKyBkZWx0YSk7CkBAIC0xMzUsMTkgKzEzNCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9ibG9iX3NwbGljZV9zdHJpbmcodm9pZCAqZmR0LCBpbnQgbmV3bGVuKQorc3RhdGljIGludCBfZmR0X3NwbGljZV9zdHJpbmcodm9pZCAqZmR0LCBpbnQgbmV3bGVuKQogewotCXZvaWQgKnAgPSBmZHQgKyBmZHRfb2ZmX2R0X3N0cmluZ3MoZmR0KSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKKwl2b2lkICpwID0gKGNoYXIgKilmZHQKKwkJKyBmZHRfb2ZmX2R0X3N0cmluZ3MoZmR0KSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBfYmxvYl9zcGxpY2UoZmR0LCBwLCAwLCBuZXdsZW4pKSkKKwlpZiAoKGVyciA9IF9mZHRfc3BsaWNlKGZkdCwgcCwgMCwgbmV3bGVuKSkpCiAJCXJldHVybiBlcnI7CiAKIAlmZHRfc2V0X3NpemVfZHRfc3RyaW5ncyhmZHQsIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KSArIG5ld2xlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX2ZpbmRfYWRkX3N0cmluZyh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKnMpCitzdGF0aWMgaW50IF9mZHRfZmluZF9hZGRfc3RyaW5nKHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcykKIHsKIAljaGFyICpzdHJ0YWIgPSAoY2hhciAqKWZkdCArIGZkdF9vZmZfZHRfc3RyaW5ncyhmZHQpOwogCWNvbnN0IGNoYXIgKnA7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAkJcmV0dXJuIChwIC0gc3RydGFiKTsKIAogCW5ldyA9IHN0cnRhYiArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKLQllcnIgPSBfYmxvYl9zcGxpY2Vfc3RyaW5nKGZkdCwgbGVuKTsKKwllcnIgPSBfZmR0X3NwbGljZV9zdHJpbmcoZmR0LCBsZW4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTE3NCwxMSArMTc0LDEwIEBACiAJc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpyZTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSByd19jaGVja19oZWFkZXIoZmR0KSkpCi0JCXJldHVybiBlcnI7CisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOwogCiAJcmUgPSBfZmR0X21lbV9yc3ZfdyhmZHQsIGZkdF9udW1fbWVtX3JzdihmZHQpKTsKLQllcnIgPSBfYmxvYl9zcGxpY2VfbWVtX3JzdihmZHQsIHJlLCAwLCAxKTsKKwllcnIgPSBfZmR0X3NwbGljZV9tZW1fcnN2KGZkdCwgcmUsIDAsIDEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTE5MiwxOSArMTkxLDE5IEBACiAJc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICpyZSA9IF9mZHRfbWVtX3Jzdl93KGZkdCwgbik7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gcndfY2hlY2tfaGVhZGVyKGZkdCkpKQotCQlyZXR1cm4gZXJyOworCUZEVF9SV19DSEVDS19IRUFERVIoZmR0KTsKKwogCWlmIChuID49IGZkdF9udW1fbWVtX3JzdihmZHQpKQogCQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CiAKLQllcnIgPSBfYmxvYl9zcGxpY2VfbWVtX3JzdihmZHQsIHJlLCAxLCAwKTsKKwllcnIgPSBfZmR0X3NwbGljZV9tZW1fcnN2KGZkdCwgcmUsIDEsIDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX3Jlc2l6ZV9wcm9wZXJ0eSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAotCQkJICAgIHN0cnVjdCBmZHRfcHJvcGVydHkgKipwcm9wKQorc3RhdGljIGludCBfZmR0X3Jlc2l6ZV9wcm9wZXJ0eSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWludCBsZW4sIHN0cnVjdCBmZHRfcHJvcGVydHkgKipwcm9wKQogewogCWludCBvbGRsZW47CiAJaW50IGVycjsKQEAgLTIxMywzNiArMjEyLDMzIEBACiAJaWYgKCEgKCpwcm9wKSkKIAkJcmV0dXJuIG9sZGxlbjsKIAotCWlmICgoZXJyID0gX2Jsb2Jfc3BsaWNlX3N0cnVjdChmZHQsICgqcHJvcCktPmRhdGEsCi0JCQkJICAgICAgIEFMSUdOKG9sZGxlbiwgRkRUX1RBR1NJWkUpLAotCQkJCSAgICAgICBBTElHTihsZW4sIEZEVF9UQUdTSVpFKSkpKQorCWlmICgoZXJyID0gX2ZkdF9zcGxpY2Vfc3RydWN0KGZkdCwgKCpwcm9wKS0+ZGF0YSwgRkRUX1RBR0FMSUdOKG9sZGxlbiksCisJCQkJICAgICAgRkRUX1RBR0FMSUdOKGxlbikpKSkKIAkJcmV0dXJuIGVycjsKIAogCSgqcHJvcCktPmxlbiA9IGNwdV90b19mZHQzMihsZW4pOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9hZGRfcHJvcGVydHkodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKLQkJCSBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICoqcHJvcCkKK3N0YXRpYyBpbnQgX2ZkdF9hZGRfcHJvcGVydHkodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgaW50IGxlbiwgc3RydWN0IGZkdF9wcm9wZXJ0eSAqKnByb3ApCiB7Ci0JdWludDMyX3QgdGFnOwogCWludCBwcm9wbGVuOwogCWludCBuZXh0b2Zmc2V0OwogCWludCBuYW1lc3Ryb2ZmOwogCWludCBlcnI7CiAKLQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBub2Rlb2Zmc2V0LCAmbmV4dG9mZnNldCk7Ci0JaWYgKHRhZyAhPSBGRFRfQkVHSU5fTk9ERSkKLQkJcmV0dXJuIC1GRFRfRVJSX0JBRE9GRlNFVDsKKwlpZiAoKG5leHRvZmZzZXQgPSBfZmR0X2NoZWNrX25vZGVfb2Zmc2V0KGZkdCwgbm9kZW9mZnNldCkpIDwgMCkKKwkJcmV0dXJuIG5leHRvZmZzZXQ7CiAKLQluYW1lc3Ryb2ZmID0gX2ZpbmRfYWRkX3N0cmluZyhmZHQsIG5hbWUpOworCW5hbWVzdHJvZmYgPSBfZmR0X2ZpbmRfYWRkX3N0cmluZyhmZHQsIG5hbWUpOwogCWlmIChuYW1lc3Ryb2ZmIDwgMCkKIAkJcmV0dXJuIG5hbWVzdHJvZmY7CiAKIAkqcHJvcCA9IF9mZHRfb2Zmc2V0X3B0cl93KGZkdCwgbmV4dG9mZnNldCk7Ci0JcHJvcGxlbiA9IHNpemVvZigqKnByb3ApICsgQUxJR04obGVuLCBGRFRfVEFHU0laRSk7CisJcHJvcGxlbiA9IHNpemVvZigqKnByb3ApICsgRkRUX1RBR0FMSUdOKGxlbik7CiAKLQllcnIgPSBfYmxvYl9zcGxpY2Vfc3RydWN0KGZkdCwgKnByb3AsIDAsIHByb3BsZW4pOworCWVyciA9IF9mZHRfc3BsaWNlX3N0cnVjdChmZHQsICpwcm9wLCAwLCBwcm9wbGVuKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNTIsMTggKzI0OCw0MCBAQAogCXJldHVybiAwOwogfQogCitpbnQgZmR0X3NldF9uYW1lKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqbmFtZXA7CisJaW50IG9sZGxlbiwgbmV3bGVuOworCWludCBlcnI7CisKKwlGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCk7CisKKwluYW1lcCA9IChjaGFyICopKHVpbnRwdHJfdClmZHRfZ2V0X25hbWUoZmR0LCBub2Rlb2Zmc2V0LCAmb2xkbGVuKTsKKwlpZiAoIW5hbWVwKQorCQlyZXR1cm4gb2xkbGVuOworCisJbmV3bGVuID0gc3RybGVuKG5hbWUpOworCisJZXJyID0gX2ZkdF9zcGxpY2Vfc3RydWN0KGZkdCwgbmFtZXAsIEZEVF9UQUdBTElHTihvbGRsZW4rMSksCisJCQkJIEZEVF9UQUdBTElHTihuZXdsZW4rMSkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltZW1jcHkobmFtZXAsIG5hbWUsIG5ld2xlbisxKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGZkdF9zZXRwcm9wKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHJ3X2NoZWNrX2hlYWRlcihmZHQpKSkKLQkJcmV0dXJuIGVycjsKKwlGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCk7CiAKLQllcnIgPSBfcmVzaXplX3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgbGVuLCAmcHJvcCk7CisJZXJyID0gX2ZkdF9yZXNpemVfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBsZW4sICZwcm9wKTsKIAlpZiAoZXJyID09IC1GRFRfRVJSX05PVEZPVU5EKQotCQllcnIgPSBfYWRkX3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgbGVuLCAmcHJvcCk7CisJCWVyciA9IF9mZHRfYWRkX3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgbGVuLCAmcHJvcCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjc2LDE0ICsyOTQsMTQgQEAKIAlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOwogCWludCBsZW4sIHByb3BsZW47CiAKLQlSV19DSEVDS19IRUFERVIoZmR0KTsKKwlGRFRfUldfQ0hFQ0tfSEVBREVSKGZkdCk7CiAKIAlwcm9wID0gZmR0X2dldF9wcm9wZXJ0eV93KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgJmxlbik7CiAJaWYgKCEgcHJvcCkKIAkJcmV0dXJuIGxlbjsKIAotCXByb3BsZW4gPSBzaXplb2YoKnByb3ApICsgQUxJR04obGVuLCBGRFRfVEFHU0laRSk7Ci0JcmV0dXJuIF9ibG9iX3NwbGljZV9zdHJ1Y3QoZmR0LCBwcm9wLCBwcm9wbGVuLCAwKTsKKwlwcm9wbGVuID0gc2l6ZW9mKCpwcm9wKSArIEZEVF9UQUdBTElHTihsZW4pOworCXJldHVybiBfZmR0X3NwbGljZV9zdHJ1Y3QoZmR0LCBwcm9wLCBwcm9wbGVuLCAwKTsKIH0KIAogaW50IGZkdF9hZGRfc3Vibm9kZV9uYW1lbGVuKHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNldCwKQEAgLTI5Niw3ICszMTQsNyBAQAogCXVpbnQzMl90IHRhZzsKIAl1aW50MzJfdCAqZW5kdGFnOwogCi0JUldfQ0hFQ0tfSEVBREVSKGZkdCk7CisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOwogCiAJb2Zmc2V0ID0gZmR0X3N1Ym5vZGVfb2Zmc2V0X25hbWVsZW4oZmR0LCBwYXJlbnRvZmZzZXQsIG5hbWUsIG5hbWVsZW4pOwogCWlmIChvZmZzZXQgPj0gMCkKQEAgLTMwOSwxOSArMzI3LDE5IEBACiAJZG8gewogCQlvZmZzZXQgPSBuZXh0b2Zmc2V0OwogCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBvZmZzZXQsICZuZXh0b2Zmc2V0KTsKLQl9IHdoaWxlICh0YWcgPT0gRkRUX1BST1ApOworCX0gd2hpbGUgKCh0YWcgPT0gRkRUX1BST1ApIHx8ICh0YWcgPT0gRkRUX05PUCkpOwogCiAJbmggPSBfZmR0X29mZnNldF9wdHJfdyhmZHQsIG9mZnNldCk7Ci0Jbm9kZWxlbiA9IHNpemVvZigqbmgpICsgQUxJR04obmFtZWxlbisxLCBGRFRfVEFHU0laRSkgKyBGRFRfVEFHU0laRTsKKwlub2RlbGVuID0gc2l6ZW9mKCpuaCkgKyBGRFRfVEFHQUxJR04obmFtZWxlbisxKSArIEZEVF9UQUdTSVpFOwogCi0JZXJyID0gX2Jsb2Jfc3BsaWNlX3N0cnVjdChmZHQsIG5oLCAwLCBub2RlbGVuKTsKKwllcnIgPSBfZmR0X3NwbGljZV9zdHJ1Y3QoZmR0LCBuaCwgMCwgbm9kZWxlbik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCW5oLT50YWcgPSBjcHVfdG9fZmR0MzIoRkRUX0JFR0lOX05PREUpOwotCW1lbXNldChuaC0+bmFtZSwgMCwgQUxJR04obmFtZWxlbisxLCBGRFRfVEFHU0laRSkpOworCW1lbXNldChuaC0+bmFtZSwgMCwgRkRUX1RBR0FMSUdOKG5hbWVsZW4rMSkpOwogCW1lbWNweShuaC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7Ci0JZW5kdGFnID0gKHVpbnQzMl90ICopKCh2b2lkICopbmggKyBub2RlbGVuIC0gRkRUX1RBR1NJWkUpOworCWVuZHRhZyA9ICh1aW50MzJfdCAqKSgoY2hhciAqKW5oICsgbm9kZWxlbiAtIEZEVF9UQUdTSVpFKTsKIAkqZW5kdGFnID0gY3B1X3RvX2ZkdDMyKEZEVF9FTkRfTk9ERSk7CiAKIAlyZXR1cm4gb2Zmc2V0OwpAQCAtMzM2LDM2ICszNTQsMzYgQEAKIHsKIAlpbnQgZW5kb2Zmc2V0OwogCi0JUldfQ0hFQ0tfSEVBREVSKGZkdCk7CisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOwogCiAJZW5kb2Zmc2V0ID0gX2ZkdF9ub2RlX2VuZF9vZmZzZXQoZmR0LCBub2Rlb2Zmc2V0KTsKIAlpZiAoZW5kb2Zmc2V0IDwgMCkKIAkJcmV0dXJuIGVuZG9mZnNldDsKIAotCXJldHVybiBfYmxvYl9zcGxpY2Vfc3RydWN0KGZkdCwgX2ZkdF9vZmZzZXRfcHRyX3coZmR0LCBub2Rlb2Zmc2V0KSwKLQkJCQkgICBlbmRvZmZzZXQgLSBub2Rlb2Zmc2V0LCAwKTsKKwlyZXR1cm4gX2ZkdF9zcGxpY2Vfc3RydWN0KGZkdCwgX2ZkdF9vZmZzZXRfcHRyX3coZmR0LCBub2Rlb2Zmc2V0KSwKKwkJCQkgIGVuZG9mZnNldCAtIG5vZGVvZmZzZXQsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfcGFja2Jsb2Nrcyhjb25zdCB2b2lkICpmZHQsIHZvaWQgKmJ1ZiwKLQkJICAgICAgIGludCBtZW1fcnN2X3NpemUsIGludCBzdHJ1Y3Rfc2l6ZSkKK3N0YXRpYyB2b2lkIF9mZHRfcGFja2Jsb2Nrcyhjb25zdCBjaGFyICpvbGQsIGNoYXIgKm5ldywKKwkJCSAgICBpbnQgbWVtX3Jzdl9zaXplLCBpbnQgc3RydWN0X3NpemUpCiB7CiAJaW50IG1lbV9yc3Zfb2ZmLCBzdHJ1Y3Rfb2ZmLCBzdHJpbmdzX29mZjsKIAotCW1lbV9yc3Zfb2ZmID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSwgOCk7CisJbWVtX3Jzdl9vZmYgPSBGRFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSwgOCk7CiAJc3RydWN0X29mZiA9IG1lbV9yc3Zfb2ZmICsgbWVtX3Jzdl9zaXplOwogCXN0cmluZ3Nfb2ZmID0gc3RydWN0X29mZiArIHN0cnVjdF9zaXplOwogCi0JbWVtbW92ZShidWYgKyBtZW1fcnN2X29mZiwgZmR0ICsgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCksIG1lbV9yc3Zfc2l6ZSk7Ci0JZmR0X3NldF9vZmZfbWVtX3Jzdm1hcChidWYsIG1lbV9yc3Zfb2ZmKTsKKwltZW1tb3ZlKG5ldyArIG1lbV9yc3Zfb2ZmLCBvbGQgKyBmZHRfb2ZmX21lbV9yc3ZtYXAob2xkKSwgbWVtX3Jzdl9zaXplKTsKKwlmZHRfc2V0X29mZl9tZW1fcnN2bWFwKG5ldywgbWVtX3Jzdl9vZmYpOwogCi0JbWVtbW92ZShidWYgKyBzdHJ1Y3Rfb2ZmLCBmZHQgKyBmZHRfb2ZmX2R0X3N0cnVjdChmZHQpLCBzdHJ1Y3Rfc2l6ZSk7Ci0JZmR0X3NldF9vZmZfZHRfc3RydWN0KGJ1Ziwgc3RydWN0X29mZik7Ci0JZmR0X3NldF9zaXplX2R0X3N0cnVjdChidWYsIHN0cnVjdF9zaXplKTsKKwltZW1tb3ZlKG5ldyArIHN0cnVjdF9vZmYsIG9sZCArIGZkdF9vZmZfZHRfc3RydWN0KG9sZCksIHN0cnVjdF9zaXplKTsKKwlmZHRfc2V0X29mZl9kdF9zdHJ1Y3QobmV3LCBzdHJ1Y3Rfb2ZmKTsKKwlmZHRfc2V0X3NpemVfZHRfc3RydWN0KG5ldywgc3RydWN0X3NpemUpOwogCi0JbWVtbW92ZShidWYgKyBzdHJpbmdzX29mZiwgZmR0ICsgZmR0X29mZl9kdF9zdHJpbmdzKGZkdCksCi0JCWZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KSk7Ci0JZmR0X3NldF9vZmZfZHRfc3RyaW5ncyhidWYsIHN0cmluZ3Nfb2ZmKTsKLQlmZHRfc2V0X3NpemVfZHRfc3RyaW5ncyhidWYsIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KSk7CisJbWVtbW92ZShuZXcgKyBzdHJpbmdzX29mZiwgb2xkICsgZmR0X29mZl9kdF9zdHJpbmdzKG9sZCksCisJCWZkdF9zaXplX2R0X3N0cmluZ3Mob2xkKSk7CisJZmR0X3NldF9vZmZfZHRfc3RyaW5ncyhuZXcsIHN0cmluZ3Nfb2ZmKTsKKwlmZHRfc2V0X3NpemVfZHRfc3RyaW5ncyhuZXcsIGZkdF9zaXplX2R0X3N0cmluZ3Mob2xkKSk7CiB9CiAKIGludCBmZHRfb3Blbl9pbnRvKGNvbnN0IHZvaWQgKmZkdCwgdm9pZCAqYnVmLCBpbnQgYnVmc2l6ZSkKQEAgLTM3MywxMSArMzkxLDExIEBACiAJaW50IGVycjsKIAlpbnQgbWVtX3Jzdl9zaXplLCBzdHJ1Y3Rfc2l6ZTsKIAlpbnQgbmV3c2l6ZTsKLQl2b2lkICp0bXA7CisJY29uc3QgY2hhciAqZmR0c3RhcnQgPSBmZHQ7CisJY29uc3QgY2hhciAqZmR0ZW5kID0gZmR0c3RhcnQgKyBmZHRfdG90YWxzaXplKGZkdCk7CisJY2hhciAqdG1wOwogCi0JZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJRkRUX0NIRUNLX0hFQURFUihmZHQpOwogCiAJbWVtX3Jzdl9zaXplID0gKGZkdF9udW1fbWVtX3JzdihmZHQpKzEpCiAJCSogc2l6ZW9mKHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSk7CkBAIC0zOTAsNyArNDA4LDcgQEAKIAkJCTsKIAl9CiAKLQlpZiAoIV9ibG9ja3NfbWlzb3JkZXJlZChmZHQsIG1lbV9yc3Zfc2l6ZSwgc3RydWN0X3NpemUpKSB7CisJaWYgKCFfZmR0X2Jsb2Nrc19taXNvcmRlcmVkKGZkdCwgbWVtX3Jzdl9zaXplLCBzdHJ1Y3Rfc2l6ZSkpIHsKIAkJLyogbm8gZnVydGhlciB3b3JrIG5lY2Vzc2FyeSAqLwogCQllcnIgPSBmZHRfbW92ZShmZHQsIGJ1ZiwgYnVmc2l6ZSk7CiAJCWlmIChlcnIpCkBAIC00MDIsMjIgKzQyMCwyMyBAQAogCX0KIAogCS8qIE5lZWQgdG8gcmVvcmRlciAqLwotCW5ld3NpemUgPSBBTElHTihzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpLCA4KSArIG1lbV9yc3Zfc2l6ZQorCW5ld3NpemUgPSBGRFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSwgOCkgKyBtZW1fcnN2X3NpemUKIAkJKyBzdHJ1Y3Rfc2l6ZSArIGZkdF9zaXplX2R0X3N0cmluZ3MoZmR0KTsKIAogCWlmIChidWZzaXplIDwgbmV3c2l6ZSkKIAkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CiAKLQlpZiAoKChidWYgKyBuZXdzaXplKSA8PSBmZHQpCi0JICAgIHx8IChidWYgPj0gKGZkdCArIGZkdF90b3RhbHNpemUoZmR0KSkpKSB7Ci0JCXRtcCA9IGJ1ZjsKLQl9IGVsc2UgewotCQl0bXAgPSAodm9pZCAqKWZkdCArIGZkdF90b3RhbHNpemUoZmR0KTsKLQkJaWYgKCh0bXAgKyBuZXdzaXplKSA+IChidWYgKyBidWZzaXplKSkKKwkvKiBGaXJzdCBhdHRlbXB0IHRvIGJ1aWxkIGNvbnZlcnRlZCB0cmVlIGF0IGJlZ2lubmluZyBvZiBidWZmZXIgKi8KKwl0bXAgPSBidWY7CisJLyogQnV0IGlmIHRoYXQgb3ZlcmxhcHMgd2l0aCB0aGUgb2xkIHRyZWUuLi4gKi8KKwlpZiAoKCh0bXAgKyBuZXdzaXplKSA+IGZkdHN0YXJ0KSAmJiAodG1wIDwgZmR0ZW5kKSkgeworCQkvKiBUcnkgcmlnaHQgYWZ0ZXIgdGhlIG9sZCB0cmVlIGluc3RlYWQgKi8KKwkJdG1wID0gKGNoYXIgKikodWludHB0cl90KWZkdGVuZDsKKwkJaWYgKCh0bXAgKyBuZXdzaXplKSA+ICgoY2hhciAqKWJ1ZiArIGJ1ZnNpemUpKQogCQkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CiAJfQogCi0JX3BhY2tibG9ja3MoZmR0LCB0bXAsIG1lbV9yc3Zfc2l6ZSwgc3RydWN0X3NpemUpOworCV9mZHRfcGFja2Jsb2NrcyhmZHQsIHRtcCwgbWVtX3Jzdl9zaXplLCBzdHJ1Y3Rfc2l6ZSk7CiAJbWVtbW92ZShidWYsIHRtcCwgbmV3c2l6ZSk7CiAKIAlmZHRfc2V0X21hZ2ljKGJ1ZiwgRkRUX01BR0lDKTsKQEAgLTQzMiwxNiArNDUxLDEzIEBACiBpbnQgZmR0X3BhY2sodm9pZCAqZmR0KQogewogCWludCBtZW1fcnN2X3NpemU7Ci0JaW50IGVycjsKIAotCWVyciA9IHJ3X2NoZWNrX2hlYWRlcihmZHQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJRkRUX1JXX0NIRUNLX0hFQURFUihmZHQpOwogCiAJbWVtX3Jzdl9zaXplID0gKGZkdF9udW1fbWVtX3JzdihmZHQpKzEpCiAJCSogc2l6ZW9mKHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSk7Ci0JX3BhY2tibG9ja3MoZmR0LCBmZHQsIG1lbV9yc3Zfc2l6ZSwgZmR0X3NpemVfZHRfc3RydWN0KGZkdCkpOwotCWZkdF9zZXRfdG90YWxzaXplKGZkdCwgX2Jsb2JfZGF0YV9zaXplKGZkdCkpOworCV9mZHRfcGFja2Jsb2NrcyhmZHQsIGZkdCwgbWVtX3Jzdl9zaXplLCBmZHRfc2l6ZV9kdF9zdHJ1Y3QoZmR0KSk7CisJZmR0X3NldF90b3RhbHNpemUoZmR0LCBfZmR0X2RhdGFfc2l6ZShmZHQpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9zdHJlcnJvci5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9zdHJlcnJvci5jCmluZGV4IGY5ZDMyZWYuLmU2YzNjZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHRfc3RyZXJyb3IuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3N0cmVycm9yLmMKQEAgLTU1LDI5ICs1NSwyOSBAQAogCiAjaW5jbHVkZSAibGliZmR0X2ludGVybmFsLmgiCiAKLXN0cnVjdCBlcnJ0YWJlbnQgeworc3RydWN0IGZkdF9lcnJ0YWJlbnQgewogCWNvbnN0IGNoYXIgKnN0cjsKIH07CiAKLSNkZWZpbmUgRVJSVEFCRU5UKHZhbCkgXAorI2RlZmluZSBGRFRfRVJSVEFCRU5UKHZhbCkgXAogCVsodmFsKV0gPSB7IC5zdHIgPSAjdmFsLCB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXJydGFiZW50IGVycnRhYmxlW10gPSB7Ci0JRVJSVEFCRU5UKEZEVF9FUlJfTk9URk9VTkQpLAotCUVSUlRBQkVOVChGRFRfRVJSX0VYSVNUUyksCi0JRVJSVEFCRU5UKEZEVF9FUlJfTk9TUEFDRSksCitzdGF0aWMgc3RydWN0IGZkdF9lcnJ0YWJlbnQgZmR0X2VycnRhYmxlW10gPSB7CisJRkRUX0VSUlRBQkVOVChGRFRfRVJSX05PVEZPVU5EKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfRVhJU1RTKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfTk9TUEFDRSksCiAKLQlFUlJUQUJFTlQoRkRUX0VSUl9CQURPRkZTRVQpLAotCUVSUlRBQkVOVChGRFRfRVJSX0JBRFBBVEgpLAotCUVSUlRBQkVOVChGRFRfRVJSX0JBRFNUQVRFKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfQkFET0ZGU0VUKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfQkFEUEFUSCksCisJRkRUX0VSUlRBQkVOVChGRFRfRVJSX0JBRFNUQVRFKSwKIAotCUVSUlRBQkVOVChGRFRfRVJSX1RSVU5DQVRFRCksCi0JRVJSVEFCRU5UKEZEVF9FUlJfQkFETUFHSUMpLAotCUVSUlRBQkVOVChGRFRfRVJSX0JBRFZFUlNJT04pLAotCUVSUlRBQkVOVChGRFRfRVJSX0JBRFNUUlVDVFVSRSksCi0JRVJSVEFCRU5UKEZEVF9FUlJfQkFETEFZT1VUKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfVFJVTkNBVEVEKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfQkFETUFHSUMpLAorCUZEVF9FUlJUQUJFTlQoRkRUX0VSUl9CQURWRVJTSU9OKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfQkFEU1RSVUNUVVJFKSwKKwlGRFRfRVJSVEFCRU5UKEZEVF9FUlJfQkFETEFZT1VUKSwKIH07Ci0jZGVmaW5lIEVSUlRBQlNJWkUJKHNpemVvZihlcnJ0YWJsZSkgLyBzaXplb2YoZXJydGFibGVbMF0pKQorI2RlZmluZSBGRFRfRVJSVEFCU0laRQkoc2l6ZW9mKGZkdF9lcnJ0YWJsZSkgLyBzaXplb2YoZmR0X2VycnRhYmxlWzBdKSkKIAogY29uc3QgY2hhciAqZmR0X3N0cmVycm9yKGludCBlcnJ2YWwpCiB7CkBAIC04NSw4ICs4NSw4IEBACiAJCXJldHVybiAiPHZhbGlkIG9mZnNldC9sZW5ndGg+IjsKIAllbHNlIGlmIChlcnJ2YWwgPT0gMCkKIAkJcmV0dXJuICI8bm8gZXJyb3I+IjsKLQllbHNlIGlmIChlcnJ2YWwgPiAtRVJSVEFCU0laRSkgewotCQljb25zdCBjaGFyICpzID0gZXJydGFibGVbLWVycnZhbF0uc3RyOworCWVsc2UgaWYgKGVycnZhbCA+IC1GRFRfRVJSVEFCU0laRSkgeworCQljb25zdCBjaGFyICpzID0gZmR0X2VycnRhYmxlWy1lcnJ2YWxdLnN0cjsKIAogCQlpZiAocykKIAkJCXJldHVybiBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9zdy5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF9zdy5jCmluZGV4IGRkYTJkZTMuLjY5ODMyOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHRfc3cuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3N3LmMKQEAgLTU1LDE0ICs1NSwyMiBAQAogCiAjaW5jbHVkZSAibGliZmR0X2ludGVybmFsLmgiCiAKLXN0YXRpYyBpbnQgY2hlY2tfaGVhZGVyX3N3KHZvaWQgKmZkdCkKK3N0YXRpYyBpbnQgX2ZkdF9zd19jaGVja19oZWFkZXIodm9pZCAqZmR0KQogewotCWlmIChmZHRfbWFnaWMoZmR0KSAhPSBTV19NQUdJQykKKwlpZiAoZmR0X21hZ2ljKGZkdCkgIT0gRkRUX1NXX01BR0lDKQogCQlyZXR1cm4gLUZEVF9FUlJfQkFETUFHSUM7CisJLyogRklYTUU6IHNob3VsZCBjaGVjayBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIGhlYWRlciBzdGF0ZSAqLwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqZ3JhYl9zcGFjZSh2b2lkICpmZHQsIGludCBsZW4pCisjZGVmaW5lIEZEVF9TV19DSEVDS19IRUFERVIoZmR0KSBcCisJeyBcCisJCWludCBlcnI7IFwKKwkJaWYgKChlcnIgPSBfZmR0X3N3X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKSBcCisJCQlyZXR1cm4gZXJyOyBcCisJfQorCitzdGF0aWMgdm9pZCAqX2ZkdF9ncmFiX3NwYWNlKHZvaWQgKmZkdCwgaW50IGxlbikKIHsKIAlpbnQgb2Zmc2V0ID0gZmR0X3NpemVfZHRfc3RydWN0KGZkdCk7CiAJaW50IHNwYWNlbGVmdDsKQEAgLTg2LDEzICs5NCwxMyBAQAogCiAJbWVtc2V0KGJ1ZiwgMCwgYnVmc2l6ZSk7CiAKLQlmZHRfc2V0X21hZ2ljKGZkdCwgU1dfTUFHSUMpOworCWZkdF9zZXRfbWFnaWMoZmR0LCBGRFRfU1dfTUFHSUMpOwogCWZkdF9zZXRfdmVyc2lvbihmZHQsIEZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKIAlmZHRfc2V0X2xhc3RfY29tcF92ZXJzaW9uKGZkdCwgRkRUX0ZJUlNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKIAlmZHRfc2V0X3RvdGFsc2l6ZShmZHQsICBidWZzaXplKTsKIAotCWZkdF9zZXRfb2ZmX21lbV9yc3ZtYXAoZmR0LCBBTElHTihzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpLAotCQkJCQkgIHNpemVvZihzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkpKSk7CisJZmR0X3NldF9vZmZfbWVtX3Jzdm1hcChmZHQsIEZEVF9BTElHTihzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5KSkpOwogCWZkdF9zZXRfb2ZmX2R0X3N0cnVjdChmZHQsIGZkdF9vZmZfbWVtX3Jzdm1hcChmZHQpKTsKIAlmZHRfc2V0X29mZl9kdF9zdHJpbmdzKGZkdCwgYnVmc2l6ZSk7CiAKQEAgLTEwMiwxMSArMTEwLDEwIEBACiBpbnQgZmR0X2FkZF9yZXNlcnZlbWFwX2VudHJ5KHZvaWQgKmZkdCwgdWludDY0X3QgYWRkciwgdWludDY0X3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKnJlOwotCWludCBlcnIgPSBjaGVja19oZWFkZXJfc3coZmR0KTsKIAlpbnQgb2Zmc2V0OwogCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlGRFRfU1dfQ0hFQ0tfSEVBREVSKGZkdCk7CisKIAlpZiAoZmR0X3NpemVfZHRfc3RydWN0KGZkdCkpCiAJCXJldHVybiAtRkRUX0VSUl9CQURTVEFURTsKIApAQCAtMTE0LDcgKzEyMSw3IEBACiAJaWYgKChvZmZzZXQgKyBzaXplb2YoKnJlKSkgPiBmZHRfdG90YWxzaXplKGZkdCkpCiAJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwogCi0JcmUgPSAoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICopKGZkdCArIG9mZnNldCk7CisJcmUgPSAoc3RydWN0IGZkdF9yZXNlcnZlX2VudHJ5ICopKChjaGFyICopZmR0ICsgb2Zmc2V0KTsKIAlyZS0+YWRkcmVzcyA9IGNwdV90b19mZHQ2NChhZGRyKTsKIAlyZS0+c2l6ZSA9IGNwdV90b19mZHQ2NChzaXplKTsKIApAQCAtMTMxLDEzICsxMzgsMTEgQEAKIGludCBmZHRfYmVnaW5fbm9kZSh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGZkdF9ub2RlX2hlYWRlciAqbmg7Ci0JaW50IGVyciA9IGNoZWNrX2hlYWRlcl9zdyhmZHQpOwogCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpICsgMTsKIAotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJRkRUX1NXX0NIRUNLX0hFQURFUihmZHQpOwogCi0JbmggPSBncmFiX3NwYWNlKGZkdCwgc2l6ZW9mKCpuaCkgKyBBTElHTihuYW1lbGVuLCBGRFRfVEFHU0laRSkpOworCW5oID0gX2ZkdF9ncmFiX3NwYWNlKGZkdCwgc2l6ZW9mKCpuaCkgKyBGRFRfVEFHQUxJR04obmFtZWxlbikpOwogCWlmICghIG5oKQogCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKIApAQCAtMTQ5LDEyICsxNTQsMTAgQEAKIGludCBmZHRfZW5kX25vZGUodm9pZCAqZmR0KQogewogCXVpbnQzMl90ICplbjsKLQlpbnQgZXJyID0gY2hlY2tfaGVhZGVyX3N3KGZkdCk7CiAKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCUZEVF9TV19DSEVDS19IRUFERVIoZmR0KTsKIAotCWVuID0gZ3JhYl9zcGFjZShmZHQsIEZEVF9UQUdTSVpFKTsKKwllbiA9IF9mZHRfZ3JhYl9zcGFjZShmZHQsIEZEVF9UQUdTSVpFKTsKIAlpZiAoISBlbikKIAkJcmV0dXJuIC1GRFRfRVJSX05PU1BBQ0U7CiAKQEAgLTE2Miw3ICsxNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbmRfYWRkX3N0cmluZyh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKnMpCitzdGF0aWMgaW50IF9mZHRfZmluZF9hZGRfc3RyaW5nKHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcykKIHsKIAljaGFyICpzdHJ0YWIgPSAoY2hhciAqKWZkdCArIGZkdF90b3RhbHNpemUoZmR0KTsKIAljb25zdCBjaGFyICpwOwpAQCAtMTg4LDE3ICsxOTEsMTUgQEAKIGludCBmZHRfcHJvcGVydHkodm9pZCAqZmR0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWwsIGludCBsZW4pCiB7CiAJc3RydWN0IGZkdF9wcm9wZXJ0eSAqcHJvcDsKLQlpbnQgZXJyID0gY2hlY2tfaGVhZGVyX3N3KGZkdCk7CiAJaW50IG5hbWVvZmY7CiAKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCUZEVF9TV19DSEVDS19IRUFERVIoZmR0KTsKIAotCW5hbWVvZmYgPSBmaW5kX2FkZF9zdHJpbmcoZmR0LCBuYW1lKTsKKwluYW1lb2ZmID0gX2ZkdF9maW5kX2FkZF9zdHJpbmcoZmR0LCBuYW1lKTsKIAlpZiAobmFtZW9mZiA9PSAwKQogCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKIAotCXByb3AgPSBncmFiX3NwYWNlKGZkdCwgc2l6ZW9mKCpwcm9wKSArIEFMSUdOKGxlbiwgRkRUX1RBR1NJWkUpKTsKKwlwcm9wID0gX2ZkdF9ncmFiX3NwYWNlKGZkdCwgc2l6ZW9mKCpwcm9wKSArIEZEVF9UQUdBTElHTihsZW4pKTsKIAlpZiAoISBwcm9wKQogCQlyZXR1cm4gLUZEVF9FUlJfTk9TUEFDRTsKIApAQCAtMjExLDE4ICsyMTIsMTYgQEAKIAogaW50IGZkdF9maW5pc2godm9pZCAqZmR0KQogewotCWludCBlcnIgPSBjaGVja19oZWFkZXJfc3coZmR0KTsKIAljaGFyICpwID0gKGNoYXIgKilmZHQ7CiAJdWludDMyX3QgKmVuZDsKIAlpbnQgb2xkc3Ryb2Zmc2V0LCBuZXdzdHJvZmZzZXQ7CiAJdWludDMyX3QgdGFnOwogCWludCBvZmZzZXQsIG5leHRvZmZzZXQ7CiAKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCUZEVF9TV19DSEVDS19IRUFERVIoZmR0KTsKIAogCS8qIEFkZCB0ZXJtaW5hdG9yICovCi0JZW5kID0gZ3JhYl9zcGFjZShmZHQsIHNpemVvZigqZW5kKSk7CisJZW5kID0gX2ZkdF9ncmFiX3NwYWNlKGZkdCwgc2l6ZW9mKCplbmQpKTsKIAlpZiAoISBlbmQpCiAJCXJldHVybiAtRkRUX0VSUl9OT1NQQUNFOwogCSplbmQgPSBjcHVfdG9fZmR0MzIoRkRUX0VORCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3dpcC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2ZkdF93aXAuYwppbmRleCA4OGUyNGI4Li5hNDY1MmM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvZmR0X3dpcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9mZHRfd2lwLmMKQEAgLTcyLDExICs3MiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBub3BfcmVnaW9uKHZvaWQgKnN0YXJ0LCBpbnQgbGVuKQorc3RhdGljIHZvaWQgX2ZkdF9ub3BfcmVnaW9uKHZvaWQgKnN0YXJ0LCBpbnQgbGVuKQogewogCXVpbnQzMl90ICpwOwogCi0JZm9yIChwID0gc3RhcnQ7ICh2b2lkICopcCA8IChzdGFydCArIGxlbik7IHArKykKKwlmb3IgKHAgPSBzdGFydDsgKGNoYXIgKilwIDwgKChjaGFyICopc3RhcnQgKyBsZW4pOyBwKyspCiAJCSpwID0gY3B1X3RvX2ZkdDMyKEZEVF9OT1ApOwogfQogCkBAIC04OSw3ICs4OSw3IEBACiAJaWYgKCEgcHJvcCkKIAkJcmV0dXJuIGxlbjsKIAotCW5vcF9yZWdpb24ocHJvcCwgbGVuICsgc2l6ZW9mKCpwcm9wKSk7CisJX2ZkdF9ub3BfcmVnaW9uKHByb3AsIGxlbiArIHNpemVvZigqcHJvcCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzksNiArMTM5LDcgQEAKIAlpZiAoZW5kb2Zmc2V0IDwgMCkKIAkJcmV0dXJuIGVuZG9mZnNldDsKIAotCW5vcF9yZWdpb24oZmR0X29mZnNldF9wdHJfdyhmZHQsIG5vZGVvZmZzZXQsIDApLCBlbmRvZmZzZXQgLSBub2Rlb2Zmc2V0KTsKKwlfZmR0X25vcF9yZWdpb24oZmR0X29mZnNldF9wdHJfdyhmZHQsIG5vZGVvZmZzZXQsIDApLAorCQkJZW5kb2Zmc2V0IC0gbm9kZW9mZnNldCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvbGliZmR0LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvbGliZmR0LmgKaW5kZXggNmIyZmI5Mi4uY2U4MGU0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2xpYmZkdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9saWJmZHQuaApAQCAtMTI1LDEyICsxMjUsMTggQEAKIGNvbnN0IHZvaWQgKmZkdF9vZmZzZXRfcHRyKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwgaW50IGNoZWNrbGVuKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCAqZmR0X29mZnNldF9wdHJfdyh2b2lkICpmZHQsIGludCBvZmZzZXQsIGludCBjaGVja2xlbikKIHsKLQlyZXR1cm4gKHZvaWQgKilmZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCwgY2hlY2tsZW4pOworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpZmR0X29mZnNldF9wdHIoZmR0LCBvZmZzZXQsIGNoZWNrbGVuKTsKIH0KIAogdWludDMyX3QgZmR0X25leHRfdGFnKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCwgaW50ICpuZXh0b2Zmc2V0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUcmF2ZXJzYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmR0X25leHRfbm9kZShjb25zdCB2b2lkICpmZHQsIGludCBvZmZzZXQsIGludCAqZGVwdGgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEdlbmVyYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTIwNyw3ICsyMTMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogZmR0X3N0cmluZyAtIHJldHJlaXZlIGEgc3RyaW5nIGZyb20gdGhlIHN0cmluZ3MgYmxvY2sgb2YgYSBkZXZpY2UgdHJlZQorICogZmR0X3N0cmluZyAtIHJldHJpZXZlIGEgc3RyaW5nIGZyb20gdGhlIHN0cmluZ3MgYmxvY2sgb2YgYSBkZXZpY2UgdHJlZQogICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgogICogQHN0cm9mZnNldDogb2Zmc2V0IG9mIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzdHJpbmdzIGJsb2NrIChuYXRpdmUgZW5kaWFuKQogICoKQEAgLTIyMSw3ICsyMjcsNyBAQAogY29uc3QgY2hhciAqZmR0X3N0cmluZyhjb25zdCB2b2lkICpmZHQsIGludCBzdHJvZmZzZXQpOwogCiAvKioKLSAqIGZkdF9udW1fbWVtX3JzdiAtIHJldHJlaXZlIHRoZSBudW1iZXIgb2YgbWVtb3J5IHJlc2VydmUgbWFwIGVudHJpZXMKKyAqIGZkdF9udW1fbWVtX3JzdiAtIHJldHJpZXZlIHRoZSBudW1iZXIgb2YgbWVtb3J5IHJlc2VydmUgbWFwIGVudHJpZXMKICAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKICAqCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGV2aWNlIHRyZWUgYmxvYidzIG1lbW9yeQpAQCAtMjM0LDcgKzI0MCw3IEBACiBpbnQgZmR0X251bV9tZW1fcnN2KGNvbnN0IHZvaWQgKmZkdCk7CiAKIC8qKgotICogZmR0X2dldF9tZW1fcnN2IC0gcmV0cmVpdmUgb25lIG1lbW9yeSByZXNlcnZlIG1hcCBlbnRyeQorICogZmR0X2dldF9tZW1fcnN2IC0gcmV0cmlldmUgb25lIG1lbW9yeSByZXNlcnZlIG1hcCBlbnRyeQogICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgogICogQGFkZHJlc3MsIEBzaXplOiBwb2ludGVycyB0byA2NC1iaXQgdmFyaWFibGVzCiAgKgpAQCAtMzE0LDcgKzMyMCw3IEBACiBpbnQgZmR0X3BhdGhfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcGF0aCk7CiAKIC8qKgotICogZmR0X2dldF9uYW1lIC0gcmV0cmVpdmUgdGhlIG5hbWUgb2YgYSBnaXZlbiBub2RlCisgKiBmZHRfZ2V0X25hbWUgLSByZXRyaWV2ZSB0aGUgbmFtZSBvZiBhIGdpdmVuIG5vZGUKICAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKICAqIEBub2Rlb2Zmc2V0OiBzdHJ1Y3R1cmUgYmxvY2sgb2Zmc2V0IG9mIHRoZSBzdGFydGluZyBub2RlCiAgKiBAbGVucDogcG9pbnRlciB0byBhbiBpbnRlZ2VyIHZhcmlhYmxlICh3aWxsIGJlIG92ZXJ3cml0dGVuKSBvciBOVUxMCkBAIC0zNDYsNyArMzUyLDcgQEAKICAqIGZkdF9nZXRfcHJvcGVydHkoKSByZXRyaWV2ZXMgYSBwb2ludGVyIHRvIHRoZSBmZHRfcHJvcGVydHkKICAqIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGRldmljZSB0cmVlIGJsb2IgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkKICAqIG5hbWVkICduYW1lJyBvZiB0aGUgbm9kZSBhdCBvZmZzZXQgbm9kZW9mZnNldC4gIElmIGxlbnAgaXMKLSAqIG5vbi1OVUxMLCB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhbHNvIHJldHVybmVkLCBpbiB0aGUKKyAqIG5vbi1OVUxMLCB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbHNvIHJldHVybmVkLCBpbiB0aGUKICAqIGludGVnZXIgcG9pbnRlZCB0byBieSBsZW5wLgogICoKICAqIHJldHVybnM6CkBAIC0zNjksOCArMzc1LDggQEAKIAkJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQkgICAgICBpbnQgKmxlbnApCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZmR0X3Byb3BlcnR5ICopZmR0X2dldF9wcm9wZXJ0eShmZHQsIG5vZGVvZmZzZXQsCi0JCQkJCQkgICAgICAgbmFtZSwgbGVucCk7CisJcmV0dXJuIChzdHJ1Y3QgZmR0X3Byb3BlcnR5ICopKHVpbnRwdHJfdCkKKwkJZmR0X2dldF9wcm9wZXJ0eShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGxlbnApOwogfQogCiAvKioKQEAgLTM4Myw3ICszODksNyBAQAogICogZmR0X2dldHByb3AoKSByZXRyaWV2ZXMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKICAqIG5hbWVkICduYW1lJyBvZiB0aGUgbm9kZSBhdCBvZmZzZXQgbm9kZW9mZnNldCAodGhpcyB3aWxsIGJlIGEKICAqIHBvaW50ZXIgdG8gd2l0aGluIHRoZSBkZXZpY2UgYmxvYiBpdHNlbGYsIG5vdCBhIGNvcHkgb2YgdGhlIHZhbHVlKS4KLSAqIElmIGxlbnAgaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlIGFsc28KKyAqIElmIGxlbnAgaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGFsc28KICAqIHJldHVybmVkLCBpbiB0aGUgaW50ZWdlciBwb2ludGVkIHRvIGJ5IGxlbnAuCiAgKgogICogcmV0dXJuczoKQEAgLTQwNSwxMSArNDExLDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgKmZkdF9nZXRwcm9wX3codm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwKIAkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKIHsKLQlyZXR1cm4gKHZvaWQgKilmZHRfZ2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGxlbnApOworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpZmR0X2dldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBsZW5wKTsKIH0KIAogLyoqCi0gKiBmZHRfZ2V0X3BoYW5kbGUgLSByZXRyZWl2ZSB0aGUgcGhhbmRsZSBvZiBhIGdpdmVuIG5vZGUKKyAqIGZkdF9nZXRfcGhhbmRsZSAtIHJldHJpZXZlIHRoZSBwaGFuZGxlIG9mIGEgZ2l2ZW4gbm9kZQogICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgogICogQG5vZGVvZmZzZXQ6IHN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgdGhlIG5vZGUKICAqCkBAIC00MTcsNyArNDIzLDcgQEAKICAqIHN0cnVjdHVyZSBibG9jayBvZmZzZXQgbm9kZW9mZnNldC4KICAqCiAgKiByZXR1cm5zOgotICoJdGhlIHBoYW5kbGUgb2YgdGhlIG5vZGUgYXQgbm9kZW9mZnNldCwgb24gc3VjY2VzICghPSAwLCAhPSAtMSkKKyAqCXRoZSBwaGFuZGxlIG9mIHRoZSBub2RlIGF0IG5vZGVvZmZzZXQsIG9uIHN1Y2Nlc3MgKCE9IDAsICE9IC0xKQogICoJMCwgaWYgdGhlIG5vZGUgaGFzIG5vIHBoYW5kbGUsIG9yIGFub3RoZXIgZXJyb3Igb2NjdXJzCiAgKi8KIHVpbnQzMl90IGZkdF9nZXRfcGhhbmRsZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0KTsKQEAgLTUxNiw3ICs1MjIsNyBAQAogICogc3RydWN0dXJlIGZyb20gdGhlIHN0YXJ0IHRvIG5vZGVvZmZzZXQsICp0d2ljZSouCiAgKgogICogcmV0dXJuczoKLSAqCXN0dWN0dXJlIGJsb2NrIG9mZnNldCBvZiB0aGUgcGFyZW50IG9mIHRoZSBub2RlIGF0IG5vZGVvZmZzZXQKKyAqCXN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBhdCBub2Rlb2Zmc2V0CiAgKgkJKD49MCksIG9uIHN1Y2Nlc3MKICAqIAktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZG9lcyBub3QgcmVmZXIgdG8gYSBCRUdJTl9OT0RFIHRhZwogICoJLUZEVF9FUlJfQkFETUFHSUMsCkBAIC01NzMsNyArNTc5LDcgQEAKICAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKICAqIEBwaGFuZGxlOiBwaGFuZGxlIHZhbHVlCiAgKgotICogZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoKSByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG5vZGUKKyAqIGZkdF9ub2RlX29mZnNldF9ieV9waGFuZGxlKCkgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlCiAgKiB3aGljaCBoYXMgdGhlIGdpdmVuIHBoYW5kbGUgdmFsdWUuICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG5vZGUKICAqIGluIHRoZSB0cmVlIHdpdGggdGhlIGdpdmVuIHBoYW5kbGUgKGFuIGludmFsaWQgdHJlZSksIHJlc3VsdHMgYXJlCiAgKiB1bmRlZmluZWQuCkBAIC02NTUsOCArNjYxLDY1IEBACiAvKiBXcml0ZS1pbi1wbGFjZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKioKKyAqIGZkdF9zZXRwcm9wX2lucGxhY2UgLSBjaGFuZ2UgYSBwcm9wZXJ0eSdzIHZhbHVlLCBidXQgbm90IGl0cyBzaXplCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9kZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHdob3NlIHByb3BlcnR5IHRvIGNoYW5nZQorICogQG5hbWU6IG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoYW5nZQorICogQHZhbDogcG9pbnRlciB0byBkYXRhIHRvIHJlcGxhY2UgdGhlIHByb3BlcnR5IHZhbHVlIHdpdGgKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgdmFsdWUKKyAqCisgKiBmZHRfc2V0cHJvcF9pbnBsYWNlKCkgcmVwbGFjZXMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcHJvcGVydHkgd2l0aAorICogdGhlIGRhdGEgaW4gdmFsLCBvZiBsZW5ndGggbGVuLiAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgY2hhbmdlIHRoZQorICogc2l6ZSBvZiBhIHByb3BlcnR5LCBhbmQgc28gd2lsbCBvbmx5IHdvcmsgaWYgbGVuIGlzIGVxdWFsIHRvIHRoZQorICogY3VycmVudCBsZW5ndGggb2YgdGhlIHByb3BlcnR5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHRlciBvbmx5IHRoZSBieXRlcyBpbiB0aGUgYmxvYiB3aGljaCBjb250YWluCisgKiB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUsIGFuZCB3aWxsIG5vdCBhbHRlciBvciBtb3ZlIGFueSBvdGhlciBwYXJ0CisgKiBvZiB0aGUgdHJlZS4KKyAqCisgKiByZXR1cm5zOgorICoJMCwgb24gc3VjY2VzcworICoJLUZEVF9FUlJfTk9TUEFDRSwgaWYgbGVuIGlzIG5vdCBlcXVhbCB0byB0aGUgcHJvcGVydHkncyBjdXJyZW50IGxlbmd0aAorICoJLUZEVF9FUlJfTk9URk9VTkQsIG5vZGUgZG9lcyBub3QgaGF2ZSB0aGUgbmFtZWQgcHJvcGVydHkKKyAqCS1GRFRfRVJSX0JBRE9GRlNFVCwgbm9kZW9mZnNldCBkaWQgbm90IHBvaW50IHRvIEZEVF9CRUdJTl9OT0RFIHRhZworICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgktRkRUX0VSUl9UUlVOQ0FURUQsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KIGludCBmZHRfc2V0cHJvcF9pbnBsYWNlKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQljb25zdCB2b2lkICp2YWwsIGludCBsZW4pOworCisvKioKKyAqIGZkdF9zZXRwcm9wX2lucGxhY2VfY2VsbCAtIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBzaW5nbGUtY2VsbCBwcm9wZXJ0eQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB3aG9zZSBwcm9wZXJ0eSB0byBjaGFuZ2UKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGFuZ2UKKyAqIEB2YWw6IGNlbGwgKDMyLWJpdCBpbnRlZ2VyKSB2YWx1ZSB0byByZXBsYWNlIHRoZSBwcm9wZXJ0eSB3aXRoCisgKgorICogZmR0X3NldHByb3BfaW5wbGFjZV9jZWxsKCkgcmVwbGFjZXMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcHJvcGVydHkKKyAqIHdpdGggdGhlIDMyLWJpdCBpbnRlZ2VyIGNlbGwgdmFsdWUgaW4gdmFsLCBjb252ZXJ0aW5nIHZhbCB0bworICogYmlnLWVuZGlhbiBpZiBuZWNlc3NhcnkuICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYQorICogcHJvcGVydHksIGFuZCBzbyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMgYW5kCisgKiBoYXMgbGVuZ3RoIDQuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsdGVyIG9ubHkgdGhlIGJ5dGVzIGluIHRoZSBibG9iIHdoaWNoIGNvbnRhaW4KKyAqIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZSwgYW5kIHdpbGwgbm90IGFsdGVyIG9yIG1vdmUgYW55IG90aGVyIHBhcnQKKyAqIG9mIHRoZSB0cmVlLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1NQQUNFLCBpZiB0aGUgcHJvcGVydHkncyBsZW5ndGggaXMgbm90IGVxdWFsIHRvIDQKKyAgKgktRkRUX0VSUl9OT1RGT1VORCwgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBuYW1lZCBwcm9wZXJ0eQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwogc3RhdGljIGlubGluZSBpbnQgZmR0X3NldHByb3BfaW5wbGFjZV9jZWxsKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHZhbCkKIHsKQEAgLTY2NCw3ICs3MjcsNTQgQEAKIAlyZXR1cm4gZmR0X3NldHByb3BfaW5wbGFjZShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsICZ2YWwsIHNpemVvZih2YWwpKTsKIH0KIAorLyoqCisgKiBmZHRfbm9wX3Byb3BlcnR5IC0gcmVwbGFjZSBhIHByb3BlcnR5IHdpdGggbm9wIHRhZ3MKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gbm9wCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gbm9wCisgKgorICogZmR0X25vcF9wcm9wZXJ0eSgpIHdpbGwgcmVwbGFjZSBhIGdpdmVuIHByb3BlcnR5J3MgcmVwcmVzZW50YXRpb24KKyAqIGluIHRoZSBibG9iIHdpdGggRkRUX05PUCB0YWdzLCBlZmZlY3RpdmVseSByZW1vdmluZyBpdCBmcm9tIHRoZQorICogdHJlZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWx0ZXIgb25seSB0aGUgYnl0ZXMgaW4gdGhlIGJsb2Igd2hpY2ggY29udGFpbgorICogdGhlIHByb3BlcnR5LCBhbmQgd2lsbCBub3QgYWx0ZXIgb3IgbW92ZSBhbnkgb3RoZXIgcGFydCBvZiB0aGUKKyAqIHRyZWUuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCBub2RlIGRvZXMgbm90IGhhdmUgdGhlIG5hbWVkIHByb3BlcnR5CisgKgktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCiBpbnQgZmR0X25vcF9wcm9wZXJ0eSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBmZHRfbm9wX25vZGUgLSByZXBsYWNlIGEgbm9kZSAoc3VidHJlZSkgd2l0aCBub3AgdGFncworICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB0byBub3AKKyAqCisgKiBmZHRfbm9wX25vZGUoKSB3aWxsIHJlcGxhY2UgYSBnaXZlbiBub2RlJ3MgcmVwcmVzZW50YXRpb24gaW4gdGhlCisgKiBibG9iLCBpbmNsdWRpbmcgYWxsIGl0cyBzdWJub2RlcywgaWYgYW55LCB3aXRoIEZEVF9OT1AgdGFncywKKyAqIGVmZmVjdGl2ZWx5IHJlbW92aW5nIGl0IGZyb20gdGhlIHRyZWUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsdGVyIG9ubHkgdGhlIGJ5dGVzIGluIHRoZSBibG9iIHdoaWNoIGNvbnRhaW4KKyAqIHRoZSBub2RlIGFuZCBpdHMgcHJvcGVydGllcyBhbmQgc3Vibm9kZXMsIGFuZCB3aWxsIG5vdCBhbHRlciBvcgorICogbW92ZSBhbnkgb3RoZXIgcGFydCBvZiB0aGUgdHJlZS4KKyAqCisgKiByZXR1cm5zOgorICoJMCwgb24gc3VjY2VzcworICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwogaW50IGZkdF9ub3Bfbm9kZSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02OTMsMjMgKzgwMywyNjggQEAKIGludCBmZHRfb3Blbl9pbnRvKGNvbnN0IHZvaWQgKmZkdCwgdm9pZCAqYnVmLCBpbnQgYnVmc2l6ZSk7CiBpbnQgZmR0X3BhY2sodm9pZCAqZmR0KTsKIAorLyoqCisgKiBmZHRfYWRkX21lbV9yc3YgLSBhZGQgb25lIG1lbW9yeSByZXNlcnZlIG1hcCBlbnRyeQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQGFkZHJlc3MsIEBzaXplOiA2NC1iaXQgdmFsdWVzIChuYXRpdmUgZW5kaWFuKQorICoKKyAqIEFkZHMgYSByZXNlcnZlIG1hcCBlbnRyeSB0byB0aGUgZ2l2ZW4gYmxvYiByZXNlcnZpbmcgYSByZWdpb24gYXQKKyAqIGFkZHJlc3MgYWRkcmVzcyBvZiBsZW5ndGggc2l6ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGRhdGEgaW50byB0aGUgcmVzZXJ2ZSBtYXAgYW5kIHdpbGwKKyAqIHRoZXJlZm9yZSBjaGFuZ2UgdGhlIGluZGV4ZXMgb2Ygc29tZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKyAqCisgKiByZXR1cm5zOgorICoJMCwgb24gc3VjY2VzcworICoJLUZEVF9FUlJfTk9TUEFDRSwgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGZyZWUgc3BhY2UgaW4gdGhlIGJsb2IgdG8KKyAqCQljb250YWluIHRoZSBuZXcgcmVzZXJ2YXRpb24gZW50cnkKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfQkFETEFZT1VULAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCiBpbnQgZmR0X2FkZF9tZW1fcnN2KHZvaWQgKmZkdCwgdWludDY0X3QgYWRkcmVzcywgdWludDY0X3Qgc2l6ZSk7CisKKy8qKgorICogZmR0X2RlbF9tZW1fcnN2IC0gcmVtb3ZlIGEgbWVtb3J5IHJlc2VydmUgbWFwIGVudHJ5CisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbjogZW50cnkgdG8gcmVtb3ZlCisgKgorICogZmR0X2RlbF9tZW1fcnN2KCkgcmVtb3ZlcyB0aGUgbi10aCBtZW1vcnkgcmVzZXJ2ZSBtYXAgZW50cnkgZnJvbQorICogdGhlIGJsb2IuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHJlc2VydmF0aW9uIHRhYmxlIGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hhbmdlIHRoZSBpbmRleGVzIG9mIHNvbWUgZW50cmllcyBpbiB0aGUgdGFibGUuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCB0aGVyZSBpcyBubyBlbnRyeSBvZiB0aGUgZ2l2ZW4gaW5kZXggKGkuZS4gdGhlcmUKKyAqCQlhcmUgbGVzcyB0aGFuIG4rMSByZXNlcnZlIG1hcCBlbnRyaWVzKQorICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsCisgKgktRkRUX0VSUl9CQURTVFJVQ1RVUkUsCisgKgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9UUlVOQ0FURUQsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KIGludCBmZHRfZGVsX21lbV9yc3Yodm9pZCAqZmR0LCBpbnQgbik7CiAKKy8qKgorICogZmR0X3NldF9uYW1lIC0gY2hhbmdlIHRoZSBuYW1lIG9mIGEgZ2l2ZW4gbm9kZQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IHN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgYSBub2RlCisgKiBAbmFtZTogbmFtZSB0byBnaXZlIHRoZSBub2RlCisgKgorICogZmR0X3NldF9uYW1lKCkgcmVwbGFjZXMgdGhlIG5hbWUgKGluY2x1ZGluZyB1bml0IGFkZHJlc3MsIGlmIGFueSkKKyAqIG9mIHRoZSBnaXZlbiBub2RlIHdpdGggdGhlIGdpdmVuIHN0cmluZy4gIE5PVEU6IHRoaXMgZnVuY3Rpb24gY2FuJ3QKKyAqIGVmZmljaWVudGx5IGNoZWNrIGlmIHRoZSBuZXcgbmFtZSBpcyB1bmlxdWUgYW1vbmdzdCB0aGUgZ2l2ZW4KKyAqIG5vZGUncyBzaWJsaW5nczsgcmVzdWx0cyBhcmUgdW5kZWZpbmVkIGlmIHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZAorICogd2l0aCBhIG5hbWUgZXF1YWwgdG8gb25lIG9mIHRoZSBnaXZlbiBub2RlJ3Mgc2libGluZ3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgaW5zZXJ0IG9yIGRlbGV0ZSBkYXRhIGZyb20gdGhlIGJsb2IsIGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hhbmdlIHRoZSBvZmZzZXRzIG9mIHNvbWUgZXhpc3Rpbmcgbm9kZXMuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PU1BBQ0UsIHRoZXJlIGlzIGluc3VmZmljaWVudCBmcmVlIHNwYWNlIGluIHRoZSBibG9iCisgKgkJdG8gY29udGFpbiB0aGUgbmV3IG5hbWUKKyAqCS1GRFRfRVJSX0JBRE9GRlNFVCwgbm9kZW9mZnNldCBkaWQgbm90IHBvaW50IHRvIEZEVF9CRUdJTl9OT0RFIHRhZworICoJLUZEVF9FUlJfQkFETUFHSUMsCisgKgktRkRUX0VSUl9CQURWRVJTSU9OLAorICoJLUZEVF9FUlJfQkFEU1RBVEUsIHN0YW5kYXJkIG1lYW5pbmdzCisgKi8KK2ludCBmZHRfc2V0X25hbWUodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogZmR0X3NldHByb3AgLSBjcmVhdGUgb3IgY2hhbmdlIGEgcHJvcGVydHkKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAdmFsOiBwb2ludGVyIHRvIGRhdGEgdG8gc2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSB0bworICogQGxlbjogbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICoKKyAqIGZkdF9zZXRwcm9wKCkgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIHByb3BlcnR5IGluIHRoZSBnaXZlbgorICogbm9kZSB0byB0aGUgZ2l2ZW4gdmFsdWUgYW5kIGxlbmd0aCwgY3JlYXRpbmcgdGhlIHByb3BlcnR5IGlmIGl0CisgKiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGluc2VydCBvciBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBhbmQgd2lsbAorICogdGhlcmVmb3JlIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1NQQUNFLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBpbiB0aGUgYmxvYiB0bworICoJCWNvbnRhaW4gdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwogaW50IGZkdF9zZXRwcm9wKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGxlbik7CisKKy8qKgorICogZmR0X3NldHByb3BfY2VsbCAtIHNldCBhIHByb3BlcnR5IHRvIGEgc2luZ2xlIGNlbGwgdmFsdWUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAdmFsOiAzMi1iaXQgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IChuYXRpdmUgZW5kaWFuKQorICoKKyAqIGZkdF9zZXRwcm9wX2NlbGwoKSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkgaW4gdGhlCisgKiBnaXZlbiBub2RlIHRvIHRoZSBnaXZlbiBjZWxsIHZhbHVlIChjb252ZXJ0aW5nIHRvIGJpZy1lbmRpYW4gaWYKKyAqIG5lY2Vzc2FyeSksIG9yIGNyZWF0ZXMgYSBuZXcgcHJvcGVydHkgd2l0aCB0aGF0IHZhbHVlIGlmIGl0IGRvZXMKKyAqIG5vdCBhbHJlYWR5IGV4aXN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGluc2VydCBvciBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBhbmQgd2lsbAorICogdGhlcmVmb3JlIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1NQQUNFLCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBpbiB0aGUgYmxvYiB0bworICoJCWNvbnRhaW4gdGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwogc3RhdGljIGlubGluZSBpbnQgZmR0X3NldHByb3BfY2VsbCh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgIHVpbnQzMl90IHZhbCkKIHsKIAl2YWwgPSBjcHVfdG9fZmR0MzIodmFsKTsKIAlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAmdmFsLCBzaXplb2YodmFsKSk7CiB9CisKKy8qKgorICogZmR0X3NldHByb3Bfc3RyaW5nIC0gc2V0IGEgcHJvcGVydHkgdG8gYSBzdHJpbmcgdmFsdWUKKyAqIEBmZHQ6IHBvaW50ZXIgdG8gdGhlIGRldmljZSB0cmVlIGJsb2IKKyAqIEBub2Rlb2Zmc2V0OiBvZmZzZXQgb2YgdGhlIG5vZGUgd2hvc2UgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hhbmdlCisgKiBAc3RyOiBzdHJpbmcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQorICoKKyAqIGZkdF9zZXRwcm9wX3N0cmluZygpIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eSBpbiB0aGUKKyAqIGdpdmVuIG5vZGUgdG8gdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSAodXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHN0cmluZyB0byBkZXRlcm1pbmUgdGhlIG5ldyBsZW5ndGggb2YgdGhlIHByb3BlcnR5KSwgb3IgY3JlYXRlcyBhCisgKiBuZXcgcHJvcGVydHkgd2l0aCB0aGF0IHZhbHVlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgaW5zZXJ0IG9yIGRlbGV0ZSBkYXRhIGZyb20gdGhlIGJsb2IsIGFuZCB3aWxsCisgKiB0aGVyZWZvcmUgY2hhbmdlIHRoZSBvZmZzZXRzIG9mIHNvbWUgZXhpc3Rpbmcgbm9kZXMuCisgKgorICogcmV0dXJuczoKKyAqCTAsIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PU1BBQ0UsIHRoZXJlIGlzIGluc3VmZmljaWVudCBmcmVlIHNwYWNlIGluIHRoZSBibG9iIHRvCisgKgkJY29udGFpbiB0aGUgbmV3IHByb3BlcnR5IHZhbHVlCisgKgktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfQkFETEFZT1VULAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCiAjZGVmaW5lIGZkdF9zZXRwcm9wX3N0cmluZyhmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIHN0cikgXAogCWZkdF9zZXRwcm9wKChmZHQpLCAobm9kZW9mZnNldCksIChuYW1lKSwgKHN0ciksIHN0cmxlbihzdHIpKzEpCisKKy8qKgorICogZmR0X2RlbHByb3AgLSBkZWxldGUgYSBwcm9wZXJ0eQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQG5vZGVvZmZzZXQ6IG9mZnNldCBvZiB0aGUgbm9kZSB3aG9zZSBwcm9wZXJ0eSB0byBub3AKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBub3AKKyAqCisgKiBmZHRfZGVsX3Byb3BlcnR5KCkgd2lsbCBkZWxldGUgdGhlIGdpdmVuIHByb3BlcnR5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBhbmQgd2lsbCB0aGVyZWZvcmUKKyAqIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9OT1RGT1VORCwgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBuYW1lZCBwcm9wZXJ0eQorICoJLUZEVF9FUlJfQkFET0ZGU0VULCBub2Rlb2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9CQURMQVlPVVQsCisgKgktRkRUX0VSUl9CQURNQUdJQywKKyAqCS1GRFRfRVJSX0JBRFZFUlNJT04sCisgKgktRkRUX0VSUl9CQURTVEFURSwKKyAqCS1GRFRfRVJSX0JBRFNUUlVDVFVSRSwKKyAqCS1GRFRfRVJSX1RSVU5DQVRFRCwgc3RhbmRhcmQgbWVhbmluZ3MKKyAqLwogaW50IGZkdF9kZWxwcm9wKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIGZkdF9hZGRfc3Vibm9kZV9uYW1lbGVuIC0gY3JlYXRlcyBhIG5ldyBub2RlIGJhc2VkIG9uIHN1YnN0cmluZworICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhcmVudG9mZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWJub2RlIHRvIGxvY2F0ZQorICogQG5hbWVsZW46IG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIG5hbWUgdG8gY29uc2lkZXIKKyAqCisgKiBJZGVudGljYWwgdG8gZmR0X2FkZF9zdWJub2RlKCksIGJ1dCB1c2Ugb25seSB0aGUgZmlyc3QgbmFtZWxlbgorICogY2hhcmFjdGVycyBvZiBuYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBuZXcgbm9kZS4gIFRoaXMgaXMgdXNlZnVsIGZvcgorICogY3JlYXRpbmcgc3Vibm9kZXMgYmFzZWQgb24gYSBwb3J0aW9uIG9mIGEgbGFyZ2VyIHN0cmluZywgc3VjaCBhcyBhCisgKiBmdWxsIHBhdGguCisgKi8KIGludCBmZHRfYWRkX3N1Ym5vZGVfbmFtZWxlbih2b2lkICpmZHQsIGludCBwYXJlbnRvZmZzZXQsCiAJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCisvKioKKyAqIGZkdF9hZGRfc3Vibm9kZSAtIGNyZWF0ZXMgYSBuZXcgbm9kZQorICogQGZkdDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgYmxvYgorICogQHBhcmVudG9mZnNldDogc3RydWN0dXJlIGJsb2NrIG9mZnNldCBvZiBhIG5vZGUKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzdWJub2RlIHRvIGxvY2F0ZQorICoKKyAqIGZkdF9hZGRfc3Vibm9kZSgpIGNyZWF0ZXMgYSBuZXcgbm9kZSBhcyBhIHN1Ym5vZGUgb2YgdGhlIG5vZGUgYXQKKyAqIHN0cnVjdHVyZSBibG9jayBvZmZzZXQgcGFyZW50b2Zmc2V0LCB3aXRoIHRoZSBnaXZlbiBuYW1lICh3aGljaAorICogc2hvdWxkIGluY2x1ZGUgdGhlIHVuaXQgYWRkcmVzcywgaWYgYW55KS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGRhdGEgaW50byB0aGUgYmxvYiwgYW5kIHdpbGwgdGhlcmVmb3JlCisgKiBjaGFuZ2UgdGhlIG9mZnNldHMgb2Ygc29tZSBleGlzdGluZyBub2Rlcy4KKworICogcmV0dXJuczoKKyAqCXN0cnVjdHVyZSBibG9jayBvZmZzZXQgb2YgdGhlIGNyZWF0ZWQgbm9kZWVxdWVzdGVkIHN1Ym5vZGUgKD49MCksIG9uIHN1Y2Nlc3MKKyAqCS1GRFRfRVJSX05PVEZPVU5ELCBpZiB0aGUgcmVxdWVzdGVkIHN1Ym5vZGUgZG9lcyBub3QgZXhpc3QKKyAqCS1GRFRfRVJSX0JBRE9GRlNFVCwgaWYgcGFyZW50b2Zmc2V0IGRpZCBub3QgcG9pbnQgdG8gYW4gRkRUX0JFR0lOX05PREUgdGFnCisgKgktRkRUX0VSUl9FWElTVFMsIGlmIHRoZSBub2RlIGF0IHBhcmVudG9mZnNldCBhbHJlYWR5IGhhcyBhIHN1Ym5vZGUgb2YKKyAqCQl0aGUgZ2l2ZW4gbmFtZQorICoJLUZEVF9FUlJfTk9TUEFDRSwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGZyZWUgc3BhY2UgaW4gdGhlCisgKgkJYmxvYiB0byBjb250YWluIHRoZSBuZXcgbm9kZQorICoJLUZEVF9FUlJfTk9TUEFDRQorICoJLUZEVF9FUlJfQkFETEFZT1VUCisgKiAgICAgIC1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncy4KKyAqLwogaW50IGZkdF9hZGRfc3Vibm9kZSh2b2lkICpmZHQsIGludCBwYXJlbnRvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIGZkdF9kZWxfbm9kZSAtIGRlbGV0ZSBhIG5vZGUgKHN1YnRyZWUpCisgKiBAZmR0OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdHJlZSBibG9iCisgKiBAbm9kZW9mZnNldDogb2Zmc2V0IG9mIHRoZSBub2RlIHRvIG5vcAorICoKKyAqIGZkdF9kZWxfbm9kZSgpIHdpbGwgcmVtb3ZlIHRoZSBnaXZlbiBub2RlLCBpbmNsdWRpbmcgYWxsIGl0cworICogc3Vibm9kZXMgaWYgYW55LCBmcm9tIHRoZSBibG9iLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgZGF0YSBmcm9tIHRoZSBibG9iLCBhbmQgd2lsbCB0aGVyZWZvcmUKKyAqIGNoYW5nZSB0aGUgb2Zmc2V0cyBvZiBzb21lIGV4aXN0aW5nIG5vZGVzLgorICoKKyAqIHJldHVybnM6CisgKgkwLCBvbiBzdWNjZXNzCisgKgktRkRUX0VSUl9CQURPRkZTRVQsIG5vZGVvZmZzZXQgZGlkIG5vdCBwb2ludCB0byBGRFRfQkVHSU5fTk9ERSB0YWcKKyAqCS1GRFRfRVJSX0JBRExBWU9VVCwKKyAqCS1GRFRfRVJSX0JBRE1BR0lDLAorICoJLUZEVF9FUlJfQkFEVkVSU0lPTiwKKyAqCS1GRFRfRVJSX0JBRFNUQVRFLAorICoJLUZEVF9FUlJfQkFEU1RSVUNUVVJFLAorICoJLUZEVF9FUlJfVFJVTkNBVEVELCBzdGFuZGFyZCBtZWFuaW5ncworICovCiBpbnQgZmR0X2RlbF9ub2RlKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9saWJmZHRfaW50ZXJuYWwuaCBiL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdC9saWJmZHRfaW50ZXJuYWwuaAppbmRleCAxZTYwOTM2Li40NmViOTNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHQvbGliZmR0X2ludGVybmFsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0L2xpYmZkdF9pbnRlcm5hbC5oCkBAIC01MiwzOCArNTIsNDQgQEAKICAqLwogI2luY2x1ZGUgPGZkdC5oPgogCi0jZGVmaW5lIEFMSUdOKHgsIGEpCSgoKHgpICsgKGEpIC0gMSkgJiB+KChhKSAtIDEpKQotI2RlZmluZSBQQUxJR04ocCwgYSkJKCh2b2lkICopQUxJR04oKHVuc2lnbmVkIGxvbmcpKHApLCAoYSkpKQorI2RlZmluZSBGRFRfQUxJR04oeCwgYSkJCSgoKHgpICsgKGEpIC0gMSkgJiB+KChhKSAtIDEpKQorI2RlZmluZSBGRFRfVEFHQUxJR04oeCkJCShGRFRfQUxJR04oKHgpLCBGRFRfVEFHU0laRSkpCiAKLSNkZWZpbmUgbWVtZXEocCwgcSwgbikJKG1lbWNtcCgocCksIChxKSwgKG4pKSA9PSAwKQotI2RlZmluZSBzdHJlcShwLCBxKQkoc3RyY21wKChwKSwgKHEpKSA9PSAwKQorI2RlZmluZSBGRFRfQ0hFQ0tfSEVBREVSKGZkdCkgXAorCXsgXAorCQlpbnQgZXJyOyBcCisJCWlmICgoZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpKSAhPSAwKSBcCisJCQlyZXR1cm4gZXJyOyBcCisJfQogCiB1aW50MzJfdCBfZmR0X25leHRfdGFnKGNvbnN0IHZvaWQgKmZkdCwgaW50IHN0YXJ0b2Zmc2V0LCBpbnQgKm5leHRvZmZzZXQpOworaW50IF9mZHRfY2hlY2tfbm9kZV9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0KTsKIGNvbnN0IGNoYXIgKl9mZHRfZmluZF9zdHJpbmcoY29uc3QgY2hhciAqc3RydGFiLCBpbnQgdGFic2l6ZSwgY29uc3QgY2hhciAqcyk7CiBpbnQgX2ZkdF9ub2RlX2VuZF9vZmZzZXQodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCk7CiAKIHN0YXRpYyBpbmxpbmUgY29uc3Qgdm9pZCAqX2ZkdF9vZmZzZXRfcHRyKGNvbnN0IHZvaWQgKmZkdCwgaW50IG9mZnNldCkKIHsKLQlyZXR1cm4gZmR0ICsgZmR0X29mZl9kdF9zdHJ1Y3QoZmR0KSArIG9mZnNldDsKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKilmZHQgKyBmZHRfb2ZmX2R0X3N0cnVjdChmZHQpICsgb2Zmc2V0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKl9mZHRfb2Zmc2V0X3B0cl93KHZvaWQgKmZkdCwgaW50IG9mZnNldCkKIHsKLQlyZXR1cm4gKHZvaWQgKilfZmR0X29mZnNldF9wdHIoZmR0LCBvZmZzZXQpOworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpX2ZkdF9vZmZzZXRfcHRyKGZkdCwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKl9mZHRfbWVtX3Jzdihjb25zdCB2b2lkICpmZHQsIGludCBuKQogewogCWNvbnN0IHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSAqcnN2X3RhYmxlID0KLQkJZmR0ICsgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCk7CisJCShjb25zdCBzdHJ1Y3QgZmR0X3Jlc2VydmVfZW50cnkgKikKKwkJKChjb25zdCBjaGFyICopZmR0ICsgZmR0X29mZl9tZW1fcnN2bWFwKGZkdCkpOwogCiAJcmV0dXJuIHJzdl90YWJsZSArIG47CiB9CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmZHRfcmVzZXJ2ZV9lbnRyeSAqX2ZkdF9tZW1fcnN2X3codm9pZCAqZmR0LCBpbnQgbikKIHsKLQlyZXR1cm4gKHZvaWQgKilfZmR0X21lbV9yc3YoZmR0LCBuKTsKKwlyZXR1cm4gKHZvaWQgKikodWludHB0cl90KV9mZHRfbWVtX3JzdihmZHQsIG4pOwogfQogCi0jZGVmaW5lIFNXX01BR0lDCQkofkZEVF9NQUdJQykKKyNkZWZpbmUgRkRUX1NXX01BR0lDCQkofkZEVF9NQUdJQykKIAogI2VuZGlmIC8qIF9MSUJGRFRfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0X2Vudi5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbGliZmR0X2Vudi5oCmluZGV4IGE0YjBmYzkuLmM4OWZkYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2xpYmZkdF9lbnYuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9saWJmZHRfZW52LmgKQEAgLTYsNiArNiw3IEBACiAKIHR5cGVkZWYgdTMyIHVpbnQzMl90OwogdHlwZWRlZiB1NjQgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwogCiAjZGVmaW5lIGZkdDE2X3RvX2NwdSh4KQkJKHgpCiAjZGVmaW5lIGNwdV90b19mZHQxNih4KQkJKHgpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCA5NjVjMjM3Li5lZTBkYzQxIDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTMwNyw3ICszMDcsOSBAQAogIyBwb3N0LXByb2Nlc3NpbmcgbmVlZGVkIGZvciBzb21lIHBsYXRmb3JtcwogY2FzZSAiJHBsYXRmb3JtIiBpbgogcHNlcmllc3xjaHJwKQotICAgICRvYmpiaW4vYWRkbm90ZSAiJG9maWxlIgorICAgICR7Q1JPU1N9b2JqY29weSAtTyBiaW5hcnkgLWogLmZha2VlbGYgIiRrZXJuZWwiICIkb2ZpbGUiLnJwYW5vdGUKKyAgICAkb2JqYmluL2FkZG5vdGUgIiRvZmlsZSIgIiRvZmlsZSIucnBhbm90ZQorICAgIHJtIC1yICIkb2ZpbGUiLnJwYW5vdGUKICAgICA7OwogY29mZikKICAgICAke0NST1NTfW9iamNvcHkgLU8gYWl4Y29mZi1yczYwMDAgLS1zZXQtc3RhcnQgIiRlbnRyeSIgIiRvZmlsZSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9hcmNoZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2FyY2hlc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmNDYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9hcmNoZXNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzY3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM1CisjIFdlZCBPY3QgIDEgMTU6NTQ6NTcgMjAwOAorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorQ09ORklHXzQ0eD15CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfRlBVPXkKK0NPTkZJR180eHg9eQorQ09ORklHX0JPT0tFPXkKK0NPTkZJR19QVEVfNjRCSVQ9eQorQ09ORklHX1BIWVNfNjRCSVQ9eQorIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKK0NPTkZJR19QUEMzMj15CitDT05GSUdfV09SRF9TSVpFPTMyCitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CitDT05GSUdfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVF9BUkNIPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0RDUl9OQVRJVkU9eQorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfRENSPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKK0NPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkQ9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CitDT05GSUdfUFBDNHh4X1BDSV9FWFBSRVNTPXkKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFEyQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBTUJPTyBpcyBub3Qgc2V0CisjIENPTkZJR19FQk9OWSBpcyBub3Qgc2V0CisjIENPTkZJR19TQU00NDBFUCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVFVT0lBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBSVNIQU4gaXMgbm90IHNldAorIyBDT05GSUdfS0FUTUFJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBSU5JRVIgaXMgbm90IHNldAorIyBDT05GSUdfV0FSUCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSEVTPXkKKyMgQ09ORklHX0NBTllPTkxBTkRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dMQUNJRVIgaXMgbm90IHNldAorIyBDT05GSUdfWU9TRU1JVEUgaXMgbm90IHNldAorIyBDT05GSUdfWElMSU5YX1ZJUlRFWDQ0MF9HRU5FUklDX0JPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19QUEM0NHhfU0lNUExFPXkKK0NPTkZJR180NjBFWD15CisjIENPTkZJR19JUElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTTF9VTEkxNTc1IGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19TQ0hFRF9IUlRJQ0s9eQorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTU1VX0hFTFBFUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQorQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZPXkKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUkVNT1ZFPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKK0NPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKK0NPTkZJR19QUk9DX0RFVklDRVRSRUU9eQorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iIgorQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfNHh4X1NPQz15CitDT05GSUdfUFBDX1BDSV9DSE9JQ0U9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSV9TWVNDQUxMPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX01TST15CisjIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTEVHQUNZPXkKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfSEFTX1JBUElESU8gaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfUEFHRV9PRkZTRVQ9MHhjMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weGMwMDAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKK0NPTkZJR19DT05ORUNUT1I9eQorQ09ORklHX1BST0NfRVZFTlRTPXkKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CitDT05GSUdfT0ZfREVWSUNFPXkKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zNTAwMAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfWElMSU5YX1NZU0FDRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX0lCTV9ORVdfRU1BQz15CitDT05GSUdfSUJNX05FV19FTUFDX1JYQj0yNTYKK0NPTkZJR19JQk1fTkVXX0VNQUNfVFhCPTI1NgorQ09ORklHX0lCTV9ORVdfRU1BQ19QT0xMX1dFSUdIVD0zMgorQ09ORklHX0lCTV9ORVdfRU1BQ19SWF9DT1BZX1RIUkVTSE9MRD0yNTYKK0NPTkZJR19JQk1fTkVXX0VNQUNfUlhfU0tCX0hFQURST09NPTAKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorQ09ORklHX0lCTV9ORVdfRU1BQ19UQUg9eQorQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDND15CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CisjIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0RFVlBPUlQ9eQorIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCitDT05GSUdfREFCPXkKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VEQUMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19IQVZFX0ZUUkFDRT15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREVfUEFUQ0hJTkdfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRSX0ZJWFVQX1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSV9CSVRNQVBfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfWE1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTVEFDS1MgaXMgbm90IHNldAorIyBDT05GSUdfVklSUV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRElfU1dJVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJUlRVQUxJWkFUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvYXNwODM0N19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L2FzcDgzNDdfZGVmY29uZmlnCmluZGV4IDVlNjc4MGEuLjBiMWZhMjBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L2FzcDgzNDdfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvYXNwODM0N19kZWZjb25maWcKQEAgLTE2NCwxMSArMTY0LDExIEBACiAjCiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQogQ09ORklHX0NMQVNTSUMzMj15Ci1DT05GSUdfUFBDX0NIUlA9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfUE1BQz15CiAjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzEzX3JkYl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTNfcmRiX2RlZmNvbmZpZwppbmRleCAyMDI4MzM3Li5iN2VhZTJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTNfcmRiX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTNfcmRiX2RlZmNvbmZpZwpAQCAtMTYzLDExICsxNjMsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMTVfcmRiX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCmluZGV4IGRkODBlYjAuLmIwYTI3YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMxNV9yZGJfZGVmY29uZmlnCkBAIC0xNjMsMTEgKzE2MywxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODMyeF9tZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzJ4X21kc19kZWZjb25maWcKaW5kZXggYmRmNTBjOC4uYWQ4MjViYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzJ4X21kc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzJ4X21kc19kZWZjb25maWcKQEAgLTE2MywxMSArMTYzLDExIEBACiAjCiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQogQ09ORklHX0NMQVNTSUMzMj15Ci1DT05GSUdfUFBDX0NIUlA9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfUE1BQz15CiAjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzJ4X3JkYl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMnhfcmRiX2RlZmNvbmZpZwppbmRleCA0ZWVmOGM5Li4zODI2NzUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMnhfcmRiX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzMnhfcmRiX2RlZmNvbmZpZwpAQCAtMTYzLDExICsxNjMsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfaXR4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM0eF9pdHhfZGVmY29uZmlnCmluZGV4IDhkNjUxMzkuLjkwYWFiMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM0eF9pdHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM0eF9pdHhfZGVmY29uZmlnCkBAIC0xNjMsMTEgKzE2MywxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM0eF9pdHhncF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfaXR4Z3BfZGVmY29uZmlnCmluZGV4IGE4YWZhMzkuLjc0NThhMjQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfaXR4Z3BfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM0eF9pdHhncF9kZWZjb25maWcKQEAgLTE2MywxMSArMTYzLDExIEBACiAjCiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQogQ09ORklHX0NMQVNTSUMzMj15Ci1DT05GSUdfUFBDX0NIUlA9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfUE1BQz15CiAjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4MzR4X21kc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfbWRzX2RlZmNvbmZpZwppbmRleCAyNGMzMjBhLi4xYTkyNzk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfbWRzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNHhfbWRzX2RlZmNvbmZpZwpAQCAtMTYzLDExICsxNjMsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNnhfbWRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCmluZGV4IGUwMjllOWUuLjAzZDhjZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9tZHNfZGVmY29uZmlnCkBAIC0xNjMsMTEgKzE2MywxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKQEAgLTM4Myw3ICszODMsODQgQEAKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfT0ZfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQX09GPXkKKyMgQ09ORklHX01URF9JTlRFTF9WUl9OT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiBDT05GSUdfT0ZfREVWSUNFPXkKIENPTkZJR19PRl9JMkM9eQogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzNnhfcmRrX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCmluZGV4IDdkNjc0YmUuLmNkZjg0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM2eF9yZGtfZGVmY29uZmlnCkBAIC0xNjQsMTEgKzE2NCwxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvbXBjODM3eF9tZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4Mzd4X21kc19kZWZjb25maWcKaW5kZXggZGU0NzIwMi4uOTdlMDJkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4Mzd4X21kc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4Mzd4X21kc19kZWZjb25maWcKQEAgLTE2NCwxMSArMTY0LDExIEBACiAjCiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQogQ09ORklHX0NMQVNTSUMzMj15Ci1DT05GSUdfUFBDX0NIUlA9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfUE1BQz15CiAjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9tcGM4Mzd4X3JkYl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzN3hfcmRiX2RlZmNvbmZpZwppbmRleCBlOGQyZDY5Li41YWMzMzA1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzN3hfcmRiX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L21wYzgzN3hfcmRiX2RlZmNvbmZpZwpAQCAtMTY0LDExICsxNjQsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L3NiYzgzNHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODN4eC9zYmM4MzR4X2RlZmNvbmZpZwppbmRleCA5MjQ1YTY3Li5jMzU5Y2MyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84M3h4L3NiYzgzNHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzgzeHgvc2JjODM0eF9kZWZjb25maWcKQEAgLTE2MiwxMSArMTYyLDExIEBACiAjCiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQogQ09ORklHX0NMQVNTSUMzMj15Ci1DT05GSUdfUFBDX0NIUlA9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAogIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfUE1BQz15CiAjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyZDdhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKQEAgLTAsMCArMSwxNjU3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmM1CisjIFdlZCBKdW4gMTEgMTI6MDY6NTMgMjAwOAorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCitDT05GSUdfNnh4PXkKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfRlBVPXkKK0NPTkZJR19BTFRJVkVDPXkKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTIKK0NPTkZJR19QUEMzMj15CitDT05GSUdfV09SRF9TSVpFPTMyCitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0xPQ0tCUkVBSz15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CitDT05GSUdfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKK0NPTkZJR19HRU5FUklDX1RCU1lOQz15CitDT05GSUdfQVVESVRfQVJDSD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19HUk9VUF9TQ0hFRD15CitDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CisjIENPTkZJR19SVF9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNFUl9TQ0hFRD15CisjIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184Nnh4PXkKKyMgQ09ORklHX1BQQ19NUEM1MTJ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1MTIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDODY0MV9IUENOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NCQzg2NDFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg2MTBfSFBDRCBpcyBub3Qgc2V0CitDT05GSUdfR0VGX1NCQzYxMD15CitDT05GSUdfTVBDODY0MT15CisjIENPTkZJR19JUElDIGlzIG5vdCBzZXQKK0NPTkZJR19NUElDPXkKKyMgQ09ORklHX01QSUNfV0VJUkQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOTcwX05BUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19JT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19GU0xfVUxJMTU3NSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDAwPXkKK0NPTkZJR19IWj0xMDAwCisjIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKKyMgQ09ORklHX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz1tCisjIENPTkZJR19JT01NVV9IRUxQRVIgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CitDT05GSUdfSVJRX0FMTF9DUFVTPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKKyMgQ09ORklHX1BST0NfREVWSUNFVFJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0lTQV9ETUFfQVBJPXkKKworIworIyBCdXMgb3B0aW9ucworIworQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQorQ09ORklHX0ZTTF9TT0M9eQorQ09ORklHX0ZTTF9QQ0k9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSV9TWVNDQUxMPXkKK0NPTkZJR19QQ0lFUE9SVEJVUz15CitDT05GSUdfUENJRUFFUj15CisjIENPTkZJR19QQ0lFQVNQTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQorIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWT15CitDT05GSUdfUENJX0RFQlVHPXkKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfSEFTX1JBUElESU89eQorIyBDT05GSUdfUkFQSURJTyBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19QQUdFX09GRlNFVD0weGMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19QSFlTSUNBTF9TVEFSVD0weDAwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4YzAwMDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX05FVF9LRVk9bQorIyBDT05GSUdfTkVUX0tFWV9NSUdSQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfQVNLX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX05FVF9JUElQPW0KK0NPTkZJR19ORVRfSVBHUkU9bQorQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1Q9eQorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorQ09ORklHX0lQX1BJTVNNX1YyPXkKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPW0KK0NPTkZJR19JTkVUX0VTUD1tCitDT05GSUdfSU5FVF9JUENPTVA9bQorQ09ORklHX0lORVRfWEZSTV9UVU5ORUw9bQorQ09ORklHX0lORVRfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PW0KKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQgaXMgbm90IHNldAorQ09ORklHX0lORVQ2X0FIPW0KK0NPTkZJR19JTkVUNl9FU1A9bQorQ09ORklHX0lORVQ2X0lQQ09NUD1tCisjIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAorQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMPW0KK0NPTkZJR19JTkVUNl9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9bQorQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQorQ09ORklHX0lQVjZfVFVOTkVMPW0KKyMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEPXkKK0NPTkZJR19CUklER0VfTkVURklMVEVSPXkKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0cgaXMgbm90IHNldAorIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRBQkxFUz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfRFNDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0cgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9SQVRFRVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BPUFRTVFJJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEggaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1QgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVCBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfSVBfTkZfUVVFVUU9bQorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQorQ09ORklHX0lQX05GX01BVENIX0VDTj1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9BSCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRT1tCitDT05GSUdfSVBfTkZfRklMVEVSPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KKyMgQ09ORklHX0lQX05GX1RBUkdFVF9UVEwgaXMgbm90IHNldAorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorCisjCisjIElQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfSVA2X05GX1FVRVVFPW0KK0NPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9SVD1tCitDT05GSUdfSVA2X05GX01BVENIX09QVFM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfSEw9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSPW0KKyMgQ09ORklHX0lQNl9ORl9NQVRDSF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUDZfTkZfTUFUQ0hfTUggaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9NQVRDSF9FVUk2ND1tCitDT05GSUdfSVA2X05GX0ZJTFRFUj1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9MT0c9bQorIyBDT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1QgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9NQU5HTEU9bQorIyBDT05GSUdfSVA2X05GX1RBUkdFVF9ITCBpcyBub3Qgc2V0CitDT05GSUdfSVA2X05GX1JBVz1tCisKKyMKKyMgQnJpZGdlOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1NDVFA9bQorIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0CitDT05GSUdfU0NUUF9ITUFDX01ENT15CitDT05GSUdfVElQQz1tCisjIENPTkZJR19USVBDX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUENfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0FUTT1tCitDT05GSUdfQVRNX0NMSVA9bQorIyBDT05GSUdfQVRNX0NMSVBfTk9fSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfQVRNX0xBTkU9bQorQ09ORklHX0FUTV9NUE9BPW0KK0NPTkZJR19BVE1fQlIyNjg0PW0KKyMgQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIgaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCitDT05GSUdfVkxBTl84MDIxUT1tCisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorQ09ORklHX0xMQz1tCisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorQ09ORklHX1dBTl9ST1VURVI9bQorQ09ORklHX05FVF9TQ0hFRD15CisKKyMKKyMgUXVldWVpbmcvU2NoZWR1bGluZworIworQ09ORklHX05FVF9TQ0hfQ0JRPW0KK0NPTkZJR19ORVRfU0NIX0hUQj1tCitDT05GSUdfTkVUX1NDSF9IRlNDPW0KK0NPTkZJR19ORVRfU0NIX0FUTT1tCitDT05GSUdfTkVUX1NDSF9QUklPPW0KKyMgQ09ORklHX05FVF9TQ0hfUlIgaXMgbm90IHNldAorQ09ORklHX05FVF9TQ0hfUkVEPW0KK0NPTkZJR19ORVRfU0NIX1NGUT1tCitDT05GSUdfTkVUX1NDSF9URVFMPW0KK0NPTkZJR19ORVRfU0NIX1RCRj1tCitDT05GSUdfTkVUX1NDSF9HUkVEPW0KK0NPTkZJR19ORVRfU0NIX0RTTUFSSz1tCitDT05GSUdfTkVUX1NDSF9ORVRFTT1tCisKKyMKKyMgQ2xhc3NpZmljYXRpb24KKyMKK0NPTkZJR19ORVRfQ0xTPXkKKyMgQ09ORklHX05FVF9DTFNfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCitDT05GSUdfTkVUX0NMU19ST1VURTQ9bQorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorQ09ORklHX05FVF9DTFNfRlc9bQorQ09ORklHX05FVF9DTFNfVTMyPW0KKyMgQ09ORklHX0NMU19VMzJfUEVSRiBpcyBub3Qgc2V0CisjIENPTkZJR19DTFNfVTMyX01BUksgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfUlNWUD1tCitDT05GSUdfTkVUX0NMU19SU1ZQNj1tCisjIENPTkZJR19ORVRfQ0xTX0ZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0VNQVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX0FDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX0lORCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9GSUZPPXkKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKK0NPTkZJR19ORVRfUEtUR0VOPW0KKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19GSUJfUlVMRVM9eQorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09GX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKKyMgQ09ORklHX01URF9DRklfTk9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0dFT01FVFJZIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PVFAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorIyBDT05GSUdfTVREX0lOVEVMX1ZSX05PUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQorQ09ORklHX09GX0kyQz15CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KK0NPTkZJR19CTEtfREVWX0NSWVBUT0xPT1A9bQorQ09ORklHX0JMS19ERVZfTkJEPW0KKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTMxMDcyCisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfQ0hSX0RFVl9TVD15CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU1I9eQorIyBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTVZTQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1BNUD15CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0ZTTCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1NGRj15CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorQ09ORklHX1NBVEFfU0lMPXkKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05JTkpBMzIgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVk9bQorQ09ORklHX0JPTkRJTkc9bQorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTUFSVkVMTF9QSFk9eQorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMEVfRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorQ09ORklHX0dJQU5GQVI9eQorIyBDT05GSUdfR0ZBUl9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX0FUTV9EUklWRVJTPXkKKyMgQ09ORklHX0FUTV9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9OSUNTVEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSUEgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0ZPUkUyMDBFX01BWUJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9IRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAorQ09ORklHX1BQUE9FPW0KK0NPTkZJR19QUFBPQVRNPW0KKyMgQ09ORklHX1BQUE9MMlRQIGlzIG5vdCBzZXQKK0NPTkZJR19TTElQPW0KK0NPTkZJR19TTElQX0NPTVBSRVNTRUQ9eQorQ09ORklHX1NMSEM9bQorQ09ORklHX1NMSVBfU01BUlQ9eQorQ09ORklHX1NMSVBfTU9ERV9TTElQNj15CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorQ09ORklHX05FVENPTlNPTEU9eQorIyBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRQT0xMPXkKK0NPTkZJR19ORVRQT0xMX1RSQVA9eQorQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9eQorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfRFMxNjgyPXkKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0k1S19BTUIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfTE05MD15CitDT05GSUdfU0VOU09SU19MTTkyPXkKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKK0NPTkZJR19EQUI9eQorIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9bQorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9eQorIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX0ZTTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9IQ0RfUFBDX09GIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9OIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj1tCitDT05GSUdfUlRDX0NMQVNTPW0KKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKKyMgQ09ORklHX1JUQ19JTlRGX1BST0MgaXMgbm90IHNldAorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfUFBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CitDT05GSUdfQ0lGUz1tCisjIENPTkZJR19DSUZTX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIGlzIG5vdCBzZXQKK0NPTkZJR19DSUZTX1hBVFRSPXkKK0NPTkZJR19DSUZTX1BPU0lYPXkKKyMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV83NzU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTc9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjA9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjE9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjI9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjM9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjQ9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjU9bQorQ09ORklHX05MU19DT0RFUEFHRV84NjY9bQorQ09ORklHX05MU19DT0RFUEFHRV84Njk9bQorQ09ORklHX05MU19DT0RFUEFHRV85MzY9bQorQ09ORklHX05MU19DT0RFUEFHRV85NTA9bQorQ09ORklHX05MU19DT0RFUEFHRV85MzI9bQorQ09ORklHX05MU19DT0RFUEFHRV85NDk9bQorQ09ORklHX05MU19DT0RFUEFHRV84NzQ9bQorQ09ORklHX05MU19JU084ODU5Xzg9bQorQ09ORklHX05MU19DT0RFUEFHRV8xMjUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MT1tCitDT05GSUdfTkxTX0FTQ0lJPW0KK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KK0NPTkZJR19OTFNfSVNPODg1OV8yPW0KK0NPTkZJR19OTFNfSVNPODg1OV8zPW0KK0NPTkZJR19OTFNfSVNPODg1OV80PW0KK0NPTkZJR19OTFNfSVNPODg1OV81PW0KK0NPTkZJR19OTFNfSVNPODg1OV82PW0KK0NPTkZJR19OTFNfSVNPODg1OV83PW0KK0NPTkZJR19OTFNfSVNPODg1OV85PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTQ9bQorQ09ORklHX05MU19JU084ODU5XzE1PW0KK0NPTkZJR19OTFNfS09JOF9SPW0KK0NPTkZJR19OTFNfS09JOF9VPW0KK0NPTkZJR19OTFNfVVRGOD1tCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfWkxJQl9JTkZMQVRFPW0KK0NPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdHRVI9eQorIyBDT05GSUdfWE1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTVEFDS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKK0NPTkZJR19TRUNVUklUWV9ORVRXT1JLPXkKKyMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTSBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTPXkKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX1JPT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FFQUQ9bQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19OVUxMPW0KKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BVVRIRU5DPW0KK0NPTkZJR19DUllQVE9fVEVTVD1tCisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworQ09ORklHX0NSWVBUT19DQkM9eQorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCitDT05GSUdfQ1JZUFRPX0NSQzMyQz1tCitDT05GSUdfQ1JZUFRPX01END1tCitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fU0hBMT1tCitDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCitDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fV1A1MTI9bQorCisjCisjIENpcGhlcnMKKyMKK0NPTkZJR19DUllQVE9fQUVTPW0KK0NPTkZJR19DUllQVE9fQU5VQklTPW0KK0NPTkZJR19DUllQVE9fQVJDND1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0NBU1Q1PW0KK0NPTkZJR19DUllQVE9fQ0FTVDY9bQorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQorQ09ORklHX0NSWVBUT19URUE9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049bQorCisjCisjIENvbXByZXNzaW9uCisjCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJUlRVQUxJWkFUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODYxMF9ocGNkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThjNmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9tcGM4NjEwX2hwY2RfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTQ5NyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNAorIyBUaHUgQXVnIDIxIDAwOjUyOjEwIDIwMDgKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworQ09ORklHXzZ4eD15CisjIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0ZQVT15CitDT05GSUdfQUxUSVZFQz15CitDT05GSUdfUFBDX1NURF9NTVU9eQorQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKKyMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19QUEMzMj15CitDT05GSUdfV09SRF9TSVpFPTMyCitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CitDT05GSUdfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVF9BUkNIPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQVVMVF9VSU1BR0U9eQorQ09ORklHX0hJQkVSTkFURV8zMj15CitDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19HUk9VUF9TQ0hFRD15CisjIENPTkZJR19GQUlSX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QQ1NQS1JfUExBVEZPUk09eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15CitDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJkZWFkbGluZSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184Nnh4PXkKKyMgQ09ORklHX01QQzg2NDFfSFBDTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQkM4NjQxRCBpcyBub3Qgc2V0CitDT05GSUdfTVBDODYxMF9IUENEPXkKK0NPTkZJR19NUEM4NjEwPXkKKyMgQ09ORklHX0VNQkVEREVENnh4IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTkFUSVZFPXkKKyMgQ09ORklHX1VEQkdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorQ09ORklHX01QSUM9eQorIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0k4MjU5PXkKK0NPTkZJR19QUENfUlRBUz15CisjIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcgaXMgbm90IHNldAorQ09ORklHX1JUQVNfUFJPQz15CisjIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTVBDMTA2PXkKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQzYwMV9TWU5DX0ZJWCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVUgaXMgbm90IHNldAorQ09ORklHX0ZTTF9VTEkxNTc1PXkKKworIworIyBLZXJuZWwgb3B0aW9ucworIworQ09ORklHX0hJR0hNRU09eQorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMTAwMD15CitDT05GSUdfSFo9MTAwMAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKK0NPTkZJR19NSUdSQVRJT049eQorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEyCitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfRVhUUkFfVEFSR0VUUz0iIgorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19JU0EgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQorQ09ORklHX0ZTTF9TT0M9eQorQ09ORklHX0ZTTF9QQ0k9eQorQ09ORklHX1BQQ19QQ0lfQ0hPSUNFPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CitDT05GSUdfUENJRVBPUlRCVVM9eQorQ09ORklHX1BDSUVBRVI9eQorIyBDT05GSUdfUENJRUFTUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKKyMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAorQ09ORklHX1BDSV9MRUdBQ1k9eQorQ09ORklHX1BDSV9ERUJVRz15CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfSEFTX1JBUElESU8gaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfUEFHRV9PRkZTRVQ9MHhjMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weGMwMDAwMDAwCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj15CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorQ09ORklHX0lQVjY9eQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9eQorQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQorIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX09GX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CisjIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9DQUZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0ZTTF9FTEJDPXkKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorQ09ORklHX09GX0RFVklDRT15CitDT05GSUdfT0ZfSTJDPXkKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTMxMDcyCisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKK0NPTkZJR19JREU9eQorIyBDT05GSUdfQkxLX0RFVl9JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKK0NPTkZJR19TQ1NJX1RHVD15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9eQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01FU0ggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9NQUM1M0M5NCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1BNUD15CitDT05GSUdfU0FUQV9BSENJPXkKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9GU0wgaXMgbm90IHNldAorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX0FMST15CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQk1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfVFVMSVA9eQorIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAorQ09ORklHX1VMSTUyNlg9eQorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CisjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fWElMSU5YX1hQU19QUzIgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTIKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CitDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRPXkKK0NPTkZJR19TRVJJQUxfODI1MF9SU0E9eQorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfQlJJUV9QQU5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVkNfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKworIworIyBNYWMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19IWURSQSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1BPV0VSTUFDPXkKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBhZGFwdGVyIEkyQy9EREMgY2hhbm5lbCBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCitDT05GSUdfREFCPXkKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NZQkVSMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9PRiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BMQVRJTlVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZBTEtZUklFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NUNjU1NTAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVkdBMTYgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DQVJNSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9GU0xfRElVPXkKKyMgQ09ORklHX0ZCX0lCTV9HWFQ0NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfVElNRVI9eQorQ09ORklHX1NORF9QQ009eQorIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU05EX0RSSVZFUlM9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfUENJPXkKKyMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxTNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hJRklFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1BQQz15CisjIENPTkZJR19TTkRfUE9XRVJNQUMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FPQSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz15CitDT05GSUdfU05EX1NPQ19NUEM4NjEwPXkKK0NPTkZJR19TTkRfU09DX01QQzg2MTBfSFBDRD15CitDT05GSUdfU05EX1NPQ19DUzQyNzA9eQorQ09ORklHX1NORF9TT0NfQ1M0MjcwX1ZEMzNfRVJSQVRBPXkKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CisKKyMKKyMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKKyMKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQ01PUz15CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9QUEMgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkZTRD15CisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MRE1fUEFSVElUSU9OPXkKKyMgQ09ORklHX0xETV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfVDEwRElGPXkKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVCVUdfU0hJUlE9eQorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfQ09ERV9QQVRDSElOR19TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJfRklYVVBfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfWE1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTVEFDS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFVl9UQUxJVE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0xJQl9SSEVBUD15CisjIENPTkZJR19WSVJUVUFMSVpBVElPTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2NDFfaHBjbl9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L21wYzg2NDFfaHBjbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZGRmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvbXBjODY0MV9ocGNuX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE2NjYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzQKKyMgVGh1IEF1ZyAyMSAwMDo1MjoxMSAyMDA4CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKK0NPTkZJR182eHg9eQorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX0FMVElWRUM9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CisjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9MgorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19XT1JEX1NJWkU9MzIKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX1RJTUVfVlNZU0NBTEw9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorIyBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEgaXMgbm90IHNldAorQ09ORklHX0lSUV9QRVJfQ1BVPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19PRj15CitDT05GSUdfUFBDX1VEQkdfMTY1NTA9eQorQ09ORklHX0dFTkVSSUNfVEJTWU5DPXkKK0NPTkZJR19BVURJVF9BUkNIPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQVVMVF9VSU1BR0U9eQorIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVD15CisjIENPTkZJR19BVURJVFNZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19HUk9VUF9TQ0hFRD15CisjIENPTkZJR19GQUlSX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKK0NPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX1BDU1BLUl9QTEFURk9STT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKK0NPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NUT1BfTUFDSElORT15CitDT05GSUdfQkxPQ0s9eQorQ09ORklHX0xCRD15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCitDT05GSUdfUFBDX01VTFRJUExBVEZPUk09eQorQ09ORklHX0NMQVNTSUMzMj15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BRMkFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0CitDT05GSUdfUFBDXzg2eHg9eQorQ09ORklHX01QQzg2NDFfSFBDTj15CisjIENPTkZJR19TQkM4NjQxRCBpcyBub3Qgc2V0CisjIENPTkZJR19NUEM4NjEwX0hQQ0QgaXMgbm90IHNldAorQ09ORklHX01QQzg2NDE9eQorQ09ORklHX1BQQ19OQVRJVkU9eQorIyBDT05GSUdfVURCR19SVEFTX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBJQyBpcyBub3Qgc2V0CitDT05GSUdfTVBJQz15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSTgyNTk9eQorQ09ORklHX1BQQ19SVEFTPXkKKyMgQ09ORklHX1JUQVNfRVJST1JfTE9HR0lORyBpcyBub3Qgc2V0CitDT05GSUdfUlRBU19QUk9DPXkKKyMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAorQ09ORklHX1BQQ19NUEMxMDY9eQorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfSU9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfUFBDNjAxX1NZTkNfRklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVSBpcyBub3Qgc2V0CitDT05GSUdfRlNMX1VMSTE1NzU9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCitDT05GSUdfSElHSE1FTT15CitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDAwPXkKK0NPTkZJR19IWj0xMDAwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9bQorIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfSVJRX0FMTF9DUFVTIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CitDT05GSUdfRlNMX1BDST15CitDT05GSUdfUFBDX1BDSV9DSE9JQ0U9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSV9TWVNDQUxMPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX01TST15CisjIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lfTEVHQUNZPXkKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorQ09ORklHX0hBU19SQVBJRElPPXkKKyMgQ09ORklHX1JBUElESU8gaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfUEFHRV9PRkZTRVQ9MHhjMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weGMwMDAwMDAwCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj15CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0tFWT1tCisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CitDT05GSUdfTkVUX0lQSVA9eQorQ09ORklHX05FVF9JUEdSRT15CitDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorQ09ORklHX0FSUEQ9eQorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1RVTk5FTD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD15CitDT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1NDVFA9bQorIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0CitDT05GSUdfU0NUUF9ITUFDX01ENT15CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorQ09ORklHX0ZJQl9SVUxFUz15CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQorQ09ORklHX09GX0kyQz15CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDX0ZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD15CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKKyMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT0dHSU5HPXkKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01FU0ggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9NQUM1M0M5NCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1BNUD15CitDT05GSUdfU0FUQV9BSENJPXkKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9GU0wgaXMgbm90IHNldAorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX0FMST15CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfVklURVNTRV9QSFk9eQorIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfTUFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWXzEwMDA9eQorIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CitDT05GSUdfR0lBTkZBUj15CisjIENPTkZJR19NVjY0M1hYX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19URUhVVEkgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMlggaXMgbm90IHNldAorIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX0k4MDQyPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19YSUxJTlhfWFBTX1BTMiBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19OT1pPTUkgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX1BDST15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfUE1BQ1pJTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19CUklRX1BBTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hWQ19SVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX05WUkFNPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKworIworIyBNYWMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19IWURSQSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1BPV0VSTUFDPXkKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycworIworIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19FRVBST009eQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKK0NPTkZJR19EVkJfQ09SRT1tCitDT05GSUdfVklERU9fTUVESUE9bQorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfTUVESUFfQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19NRURJQV9UVU5FUj1tCisjIENPTkZJR19NRURJQV9UVU5FUl9DVVNUT01JWkUgaXMgbm90IHNldAorQ09ORklHX01FRElBX1RVTkVSX1NJTVBMRT1tCitDT05GSUdfTUVESUFfVFVORVJfVERBODI5MD1tCitDT05GSUdfTUVESUFfVFVORVJfVERBOTg4Nz1tCitDT05GSUdfTUVESUFfVFVORVJfVEVBNTc2MT1tCitDT05GSUdfTUVESUFfVFVORVJfVEVBNTc2Nz1tCitDT05GSUdfTUVESUFfVFVORVJfTVQyMFhYPW0KK0NPTkZJR19NRURJQV9UVU5FUl9YQzIwMjg9bQorQ09ORklHX01FRElBX1RVTkVSX1hDNTAwMD1tCitDT05GSUdfRFZCX0NBUFRVUkVfRFJJVkVSUz15CisKKyMKKyMgU3VwcG9ydGVkIFNBQTcxNDYgYmFzZWQgUENJIEFkYXB0ZXJzCisjCisjIENPTkZJR19UVFBDSV9FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0JVREdFVF9DT1JFIGlzIG5vdCBzZXQKKworIworIyBTdXBwb3J0ZWQgVVNCIEFkYXB0ZXJzCisjCisjIENPTkZJR19EVkJfVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UVFVTQl9CVURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1RUVVNCX0RFQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ0lORVJHWVQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9TSUFOT19TTVMxWFhYIGlzIG5vdCBzZXQKKworIworIyBTdXBwb3J0ZWQgRmxleENvcElJIChCMkMyKSBBZGFwdGVycworIworIyBDT05GSUdfRFZCX0IyQzJfRkxFWENPUCBpcyBub3Qgc2V0CisKKyMKKyMgU3VwcG9ydGVkIEJUODc4IEFkYXB0ZXJzCisjCisKKyMKKyMgU3VwcG9ydGVkIFBsdXRvMiBBZGFwdGVycworIworIyBDT05GSUdfRFZCX1BMVVRPMiBpcyBub3Qgc2V0CisKKyMKKyMgU3VwcG9ydGVkIERWQiBGcm9udGVuZHMKKyMKKworIworIyBDdXN0b21pc2UgRFZCIEZyb250ZW5kcworIworIyBDT05GSUdfRFZCX0ZFX0NVU1RPTUlTRSBpcyBub3Qgc2V0CisKKyMKKyMgRFZCLVMgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzCisjCisjIENPTkZJR19EVkJfQ1gyNDExMCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ1gyNDEyMyBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfTVQzMTIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1M1SDE0MjAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1NUVjAyOTkgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1REQTgwODMgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1REQTEwMDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9WRVMxWDkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UVU5FUl9JVEQxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREE4MjZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UVUE2MTAwIGlzIG5vdCBzZXQKKworIworIyBEVkItVCAodGVycmVzdHJpYWwpIGZyb250ZW5kcworIworIyBDT05GSUdfRFZCX1NQODg3MCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfU1A4ODdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DWDIyNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DWDIyNzAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9EUlgzOTdYRCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfTDY0NzgxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREExMDA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfTlhUNjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfTVQzNTIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1pMMTAzNTMgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0RJQjMwMDBNQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfRElCMzAwME1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9ESUI3MDAwTSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfRElCNzAwMFAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1REQTEwMDQ4IGlzIG5vdCBzZXQKKworIworIyBEVkItQyAoY2FibGUpIGZyb250ZW5kcworIworIyBDT05GSUdfRFZCX1ZFUzE4MjAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1REQTEwMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREExMDAyMyBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfU1RWMDI5NyBpcyBub3Qgc2V0CisKKyMKKyMgQVRTQyAoTm9ydGggQW1lcmljYW4vS29yZWFuIFRlcnJlc3RyaWFsL0NhYmxlIERUVikgZnJvbnRlbmRzCisjCisjIENPTkZJR19EVkJfTlhUMjAwWCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfT1I1MTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfT1I1MTEzMiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQkNNMzUxMCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfTEdEVDMzMFggaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1M1SDE0MDkgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0FVODUyMiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfUzVIMTQxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCB0ZXJyZXN0cmlhbCBvbmx5IHR1bmVycy9QTEwKKyMKKyMgQ09ORklHX0RWQl9QTEwgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1RVTkVSX0RJQjAwNzAgaXMgbm90IHNldAorCisjCisjIFNFQyBjb250cm9sIGRldmljZXMgZm9yIERWQi1TCisjCisjIENPTkZJR19EVkJfTE5CUDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9JU0w2NDA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9JU0w2NDIxIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQorIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CisjIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfT1NTRU1VTD15CitDT05GSUdfU05EX01JWEVSX09TUz15CitDT05GSUdfU05EX1BDTV9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVk1BU1RFUj15CitDT05GSUdfU05EX0FDOTdfQ09ERUM9eQorQ09ORklHX1NORF9EUklWRVJTPXkKKyMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfUENJPXkKKyMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxTNDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hJRklFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0CitDT05GSUdfU05EX0lOVEVMOFgwPXkKKyMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0tPUkcxMjEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUlYQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9OTTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENYSFIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JJUFRJREUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklBODJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklBODJYWF9NT0RFTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklSVFVPU08gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAorQ09ORklHX1NORF9QUEM9eQorIyBDT05GSUdfU05EX1BPV0VSTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BT0EgaXMgbm90IHNldAorQ09ORklHX1NORF9VU0I9eQorIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCX1VTWDJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9eQorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKK0NPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX0ZTTCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfSENEX1BQQ19PRj15CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEU9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QQ0k9eQorQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQz15CitDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPPXkKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TSUVSUkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19FREFDIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9DTU9TPXkKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX1BQQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKK0NPTkZJR19OVEZTX0ZTPXkKKyMgQ09ORklHX05URlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfQURGU19GUz1tCisjIENPTkZJR19BREZTX0ZTX1JXIGlzIG5vdCBzZXQKK0NPTkZJR19BRkZTX0ZTPW0KK0NPTkZJR19IRlNfRlM9bQorQ09ORklHX0hGU1BMVVNfRlM9bQorQ09ORklHX0JFRlNfRlM9bQorIyBDT05GSUdfQkVGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQkZTX0ZTPW0KK0NPTkZJR19FRlNfRlM9bQorQ09ORklHX0NSQU1GUz15CitDT05GSUdfVlhGU19GUz1tCisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19IUEZTX0ZTPW0KK0NPTkZJR19RTlg0RlNfRlM9bQorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZfRlM9bQorQ09ORklHX1VGU19GUz1tCisjIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19ORlNEPXkKKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNfUEFSVElUSU9OPXkKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfVVRGOD1tCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfVDEwRElGPXkKK0NPTkZJR19DUkNfSVRVX1Q9bQorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19IQVZFX0xNQj15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RFX1BBVENISU5HX1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRElfU1dJVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworQ09ORklHX0NSWVBUT19DQkM9eQorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVZfVEFMSVRPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfVklSVFVBTElaQVRJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L3NiYzg2NDFkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTAwZjhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9zYmM4NjQxZF9kZWZjb25maWcKQEAgLTAsMCArMSwxNDgxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM0CisjIFRodSBBdWcgMjEgMDA6NTI6MTUgMjAwOAorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCitDT05GSUdfNnh4PXkKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfRlBVPXkKK0NPTkZJR19BTFRJVkVDPXkKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTIKK0NPTkZJR19QUEMzMj15CitDT05GSUdfV09SRF9TSVpFPTMyCitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19MT0NLQlJFQUs9eQorQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMj15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKKyMgQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVMgaXMgbm90IHNldAorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX09GPXkKK0NPTkZJR19QUENfVURCR18xNjU1MD15CitDT05GSUdfR0VORVJJQ19UQlNZTkM9eQorQ09ORklHX0FVRElUX0FSQ0g9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZBVUxUX1VJTUFHRT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19QQ1NQS1JfUExBVEZPUk09eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15CitDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CisjIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184Nnh4PXkKKyMgQ09ORklHX01QQzg2NDFfSFBDTiBpcyBub3Qgc2V0CitDT05GSUdfU0JDODY0MUQ9eQorIyBDT05GSUdfTVBDODYxMF9IUENEIGlzIG5vdCBzZXQKK0NPTkZJR19NUEM4NjQxPXkKK0NPTkZJR19QUENfTkFUSVZFPXkKKyMgQ09ORklHX1VEQkdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorQ09ORklHX01QSUM9eQorIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0k4MjU5PXkKK0NPTkZJR19QUENfUlRBUz15CisjIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcgaXMgbm90IHNldAorQ09ORklHX1JUQVNfUFJPQz15CisjIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTVBDMTA2PXkKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQzYwMV9TWU5DX0ZJWCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVUgaXMgbm90IHNldAorIyBDT05GSUdfRlNMX1VMSTE1NzUgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9bQorIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0lSUV9BTExfQ1BVUz15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKKyMgQ09ORklHX1BST0NfREVWSUNFVFJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CitDT05GSUdfRlNMX1BDST15CitDT05GSUdfUFBDX1BDSV9DSE9JQ0U9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorQ09ORklHX1BDSV9TWVNDQUxMPXkKK0NPTkZJR19QQ0lFUE9SVEJVUz15CitDT05GSUdfUENJRUFFUj15CisjIENPTkZJR19QQ0lFQVNQTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQorIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWT15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBU19SQVBJRElPIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4YzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MDAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHhjMDAwMDAwMAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPW0KKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD1tCitDT05GSUdfTkVUX0tFWT1tCisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CitDT05GSUdfTkVUX0lQSVA9bQorQ09ORklHX05FVF9JUEdSRT1tCitDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9bQorQ09ORklHX0lORVRfRVNQPW0KK0NPTkZJR19JTkVUX0lQQ09NUD1tCitDT05GSUdfSU5FVF9YRlJNX1RVTk5FTD1tCitDT05GSUdfSU5FVF9UVU5ORUw9bQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorQ09ORklHX0lQVjY9bQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfQUg9bQorQ09ORklHX0lORVQ2X0VTUD1tCitDT05GSUdfSU5FVDZfSVBDT01QPW0KKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1RVTk5FTD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2X1NJVD1tCitDT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15CitDT05GSUdfSVBWNl9UVU5ORUw9bQorIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQorQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9DT05OVFJBQ0sgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1JBVEVFU1QgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KKyMgQ09ORklHX0lQX05GX01BVENIX0FIIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX1RUTCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfUkFXPW0KKyMgQ09ORklHX0lQX05GX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisKKyMKKyMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUDZfTkZfUVVFVUU9bQorQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVA2X05GX01BVENIX1JUPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfT1BUUz1tCitDT05GSUdfSVA2X05GX01BVENIX0ZSQUc9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9ITD1tCitDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9bQorIyBDT05GSUdfSVA2X05GX01BVENIX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQNl9ORl9NQVRDSF9NSCBpcyBub3Qgc2V0CitDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KK0NPTkZJR19JUDZfTkZfRklMVEVSPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCisjIENPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfSVA2X05GX01BTkdMRT1tCisjIENPTkZJR19JUDZfTkZfVEFSR0VUX0hMIGlzIG5vdCBzZXQKK0NPTkZJR19JUDZfTkZfUkFXPW0KKyMgQ09ORklHX0lQNl9ORl9TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQnJpZGdlOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1NDVFA9bQorIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0CitDT05GSUdfU0NUUF9ITUFDX01ENT15CitDT05GSUdfVElQQz1tCisjIENPTkZJR19USVBDX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUENfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0FUTT1tCitDT05GSUdfQVRNX0NMSVA9bQorIyBDT05GSUdfQVRNX0NMSVBfTk9fSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfQVRNX0xBTkU9bQorQ09ORklHX0FUTV9NUE9BPW0KK0NPTkZJR19BVE1fQlIyNjg0PW0KKyMgQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIgaXMgbm90IHNldAorQ09ORklHX1NUUD1tCitDT05GSUdfQlJJREdFPW0KK0NPTkZJR19WTEFOXzgwMjFRPW0KKyMgQ09ORklHX1ZMQU5fODAyMVFfR1ZSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorQ09ORklHX0xMQz1tCisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorQ09ORklHX1dBTl9ST1VURVI9bQorQ09ORklHX05FVF9TQ0hFRD15CisKKyMKKyMgUXVldWVpbmcvU2NoZWR1bGluZworIworQ09ORklHX05FVF9TQ0hfQ0JRPW0KK0NPTkZJR19ORVRfU0NIX0hUQj1tCitDT05GSUdfTkVUX1NDSF9IRlNDPW0KK0NPTkZJR19ORVRfU0NIX0FUTT1tCitDT05GSUdfTkVUX1NDSF9QUklPPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorQ09ORklHX05FVF9TQ0hfTkVURU09bQorCisjCisjIENsYXNzaWZpY2F0aW9uCisjCitDT05GSUdfTkVUX0NMUz15CisjIENPTkZJR19ORVRfQ0xTX0JBU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQorQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KK0NPTkZJR19ORVRfQ0xTX1JPVVRFPXkKK0NPTkZJR19ORVRfQ0xTX0ZXPW0KK0NPTkZJR19ORVRfQ0xTX1UzMj1tCisjIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfQ0xTX1UzMl9NQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1JTVlA9bQorQ09ORklHX05FVF9DTFNfUlNWUDY9bQorIyBDT05GSUdfTkVUX0NMU19GTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9FTUFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19BQ1QgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAorQ09ORklHX05FVF9TQ0hfRklGTz15CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCitDT05GSUdfTkVUX1BLVEdFTj1tCisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CitDT05GSUdfRklCX1JVTEVTPXkKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PRl9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CisjIENPTkZJR19NVERfQ0ZJX05PU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVA9eQorIyBDT05GSUdfTVREX0NGSV9HRU9NRVRSWSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT1RQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorIyBDT05GSUdfTVREX0lOVEVMX1ZSX05PUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQorQ09ORklHX09GX0kyQz15CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDX0ZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCitDT05GSUdfQkxLX0RFVl9OQkQ9bQorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19NRD15CitDT05GSUdfQkxLX0RFVl9NRD15CitDT05GSUdfTURfTElORUFSPXkKK0NPTkZJR19NRF9SQUlEMD15CitDT05GSUdfTURfUkFJRDE9eQorQ09ORklHX01EX1JBSUQxMD15CisjIENPTkZJR19NRF9SQUlENDU2IGlzIG5vdCBzZXQKK0NPTkZJR19NRF9NVUxUSVBBVEg9eQorQ09ORklHX01EX0ZBVUxUWT15CitDT05GSUdfQkxLX0RFVl9ETT15CisjIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRE1fQ1JZUFQ9eQorQ09ORklHX0RNX1NOQVBTSE9UPXkKK0NPTkZJR19ETV9NSVJST1I9eQorQ09ORklHX0RNX1pFUk89eQorIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX1VFVkVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9bQorQ09ORklHX0JPTkRJTkc9bQorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKK0NPTkZJR19CUk9BRENPTV9QSFk9eQorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19NQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JNQUMgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAorIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKKyMgQ09ORklHX01WNjQzWFhfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX0FUTV9EUklWRVJTPXkKKyMgQ09ORklHX0FUTV9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9OSUNTVEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1fSUEgaXMgbm90IHNldAorIyBDT05GSUdfQVRNX0ZPUkUyMDBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9IRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAorQ09ORklHX1BQUE9FPW0KK0NPTkZJR19QUFBPQVRNPW0KKyMgQ09ORklHX1BQUE9MMlRQIGlzIG5vdCBzZXQKK0NPTkZJR19TTElQPW0KK0NPTkZJR19TTElQX0NPTVBSRVNTRUQ9eQorQ09ORklHX1NMSEM9bQorQ09ORklHX1NMSVBfU01BUlQ9eQorQ09ORklHX1NMSVBfTU9ERV9TTElQNj15CitDT05GSUdfTkVUQ09OU09MRT15CisjIENPTkZJR19ORVRDT05TT0xFX0RZTkFNSUMgaXMgbm90IHNldAorQ09ORklHX05FVFBPTEw9eQorQ09ORklHX05FVFBPTExfVFJBUD15CitDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUj15CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfQlJJUV9QQU5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVkNfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT1tCisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisKKyMKKyMgTWFjIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfSFlEUkEgaXMgbm90IHNldAorQ09ORklHX0kyQ19QT1dFUk1BQz15CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycworIworIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FNUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19TT0ZUX1dBVENIRE9HPW0KKyMgQ09ORklHX0FMSU03MTAxX1dEVCBpcyBub3Qgc2V0CisjIENPTkZJR184eHh4X1dEVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPR19SVEFTIGlzIG5vdCBzZXQKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCitDT05GSUdfREFCPXkKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfVkdBX0NPTlNPTEU9eQorIyBDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDSyBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBIb3N0IG9yIEdhZGdldCBzdXBwb3J0IHRvIHNlZSBJbnZlbnRyYSBvcHRpb25zCisjCisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VEQUMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorQ09ORklHX1JFSVNFUkZTX0ZTPW0KKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorQ09ORklHX09DRlMyX0ZTPW0KK0NPTkZJR19PQ0ZTMl9GU19PMkNCPW0KK0NPTkZJR19PQ0ZTMl9GU19TVEFUUz15CitDT05GSUdfT0NGUzJfREVCVUdfTUFTS0xPRz15CisjIENPTkZJR19PQ0ZTMl9ERUJVR19GUyBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlNfRlM9bQorQ09ORklHX0FVVE9GUzRfRlM9bQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19DT05GSUdGU19GUz1tCisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlOSVhfRlM9bQorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9bQorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorQ09ORklHX1NNQl9OTFNfREVGQVVMVD15CitDT05GSUdfU01CX05MU19SRU1PVEU9ImNwNDM3IgorQ09ORklHX0NJRlM9bQorIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0CitDT05GSUdfQ0lGU19YQVRUUj15CitDT05GSUdfQ0lGU19QT1NJWD15CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNfUEFSVElUSU9OPXkKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzc1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYxPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYzPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY0PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODc0PW0KK0NPTkZJR19OTFNfSVNPODg1OV84PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQorQ09ORklHX05MU19BU0NJST1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMj1tCitDT05GSUdfTkxTX0lTTzg4NTlfMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfND1tCitDT05GSUdfTkxTX0lTTzg4NTlfNT1tCitDT05GSUdfTkxTX0lTTzg4NTlfNj1tCitDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX0tPSThfUj1tCitDT05GSUdfTkxTX0tPSThfVT1tCitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfWkxJQl9JTkZMQVRFPW0KK0NPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0hBVkVfTE1CPXkKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CitDT05GSUdfSEFWRV9GVFJBQ0U9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RFX1BBVENISU5HX1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19WSVJRX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKK0NPTkZJR19TRUNVUklUWV9ORVRXT1JLPXkKKyMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BRUFEPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTlVMTD1tCisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVVUSEVOQz1tCitDT05GSUdfQ1JZUFRPX1RFU1Q9bQorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0hNQUM9eQorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworQ09ORklHX0NSWVBUT19DUkMzMkM9bQorQ09ORklHX0NSWVBUT19NRDQ9bQorQ09ORklHX0NSWVBUT19NRDU9eQorQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fU0hBMT1tCitDT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCitDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fV1A1MTI9bQorCisjCisjIENpcGhlcnMKKyMKK0NPTkZJR19DUllQVE9fQUVTPW0KK0NPTkZJR19DUllQVE9fQU5VQklTPW0KK0NPTkZJR19DUllQVE9fQVJDND1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0NBU1Q1PW0KK0NPTkZJR19DUllQVE9fQ0FTVDY9bQorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQorQ09ORklHX0NSWVBUT19URUE9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049bQorCisjCisjIENvbXByZXNzaW9uCisjCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVZfVEFMSVRPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfVklSVFVBTElaQVRJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvZXA4MjQ4ZV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9lcDgyNDhlX2RlZmNvbmZpZwppbmRleCBlZjBjNmU4Li5jZDY5MWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9lcDgyNDhlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9lcDgyNDhlX2RlZmNvbmZpZwpAQCAtMTUwLDExICsxNTAsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiBDT05GSUdfUFBDXzgyeHg9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWdjb2dlX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21nY29nZV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5ZWFiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21nY29nZV9kZWZjb25maWcKQEAgLTAsMCArMSw5MDAgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNi1yYzIKKyMgVGh1IE1heSAyMiAwODoxODo0NyAyMDA4CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKK0NPTkZJR182eHg9eQorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0UyMDAgaXMgbm90IHNldAorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CisjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1dPUkRfU0laRT0zMgorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CisjIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSBpcyBub3Qgc2V0CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CitDT05GSUdfT0Y9eQorIyBDT05GSUdfUFBDX1VEQkdfMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAorQ09ORklHX0FVRElUX0FSQ0g9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKKyMgQ09ORklHX0RFRkFVTFRfVUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKKyMgQ09ORklHX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0tBTExTWU1TPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CisjIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfODJ4eD15CisjIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDNTEyeCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDNTEyMSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfTVBDODI3Ml9BRFMgaXMgbm90IHNldAorIyBDT05GSUdfUFEyRkFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19FUDgyNDhFIGlzIG5vdCBzZXQKK0NPTkZJR19NR0NPR0U9eQorIyBDT05GSUdfUFEyQURTIGlzIG5vdCBzZXQKK0NPTkZJR184MjYwPXkKK0NPTkZJR184MjcyPXkKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEMxMDYgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfSU9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX0NQTTI9eQorQ09ORklHX1BQQ19DUE1fTkVXX0JJTkRJTkc9eQorIyBDT05GSUdfRlNMX1VMSTE1NzUgaXMgbm90IHNldAorQ09ORklHX0NQTT15CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCisjIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CisjIENPTkZJR19JT01NVV9IRUxQRVIgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0ZTTF9TT0M9eQorIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVNfUkFQSURJTyBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19QQUdFX09GRlNFVD0weGMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19QSFlTSUNBTF9TVEFSVD0weDAwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4YzAwMDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEPXkKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0cgaXMgbm90IHNldAorIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKK0NPTkZJR19NVERfT0ZfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorIyBDT05GSUdfTVREX0JMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DS19STyBpcyBub3Qgc2V0CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CitDT05GSUdfT0ZfREVWSUNFPXkKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKK0NPTkZJR19GSVhFRF9QSFk9eQorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKK0NPTkZJR19GU19FTkVUPXkKK0NPTkZJR19GU19FTkVUX0hBU19TQ0M9eQorIyBDT05GSUdfRlNfRU5FVF9IQVNfRkNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX0VORVRfTURJT19GQ0MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKK0NPTkZJR19TRVJJQUxfQ1BNX1NNQzI9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR0dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJUlFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0JESV9TV0lUQ0g9eQorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj15CitDT05GSUdfQ1JZUFRPX1BDQkM9eQorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTElCX1JIRUFQPXkKKyMgQ09ORklHX1ZJUlRVQUxJWkFUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21nc3V2ZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tZ3N1dmRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDZjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tZ3N1dmRfZGVmY29uZmlnCkBAIC0wLDAgKzEsODcyIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYtcmMyCisjIFdlZCBNYXkgMjEgMTM6MzA6MzMgMjAwOAorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorQ09ORklHX1BQQ184eHg9eQorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR184eHg9eQorIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKK0NPTkZJR19QUEMzMj15CitDT05GSUdfV09SRF9TSVpFPTMyCitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKKyMgQ09ORklHX0JVRyBpcyBub3Qgc2V0CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0NPTVBBVF9CUks9eQorIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CisjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKKyMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0xCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworIyBDT05GSUdfUFBDX01QQzUxMnggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX01QQzUxMjEgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUE0xPXkKKyMgQ09ORklHX01QQzhYWEZBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDODZYQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg4NUFEUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRVA4OFhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19BRERFUjg3NSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX01HU1VWRD15CisKKyMKKyMgTVBDOHh4IENQTSBPcHRpb25zCisjCisKKyMKKyMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucworIworQ09ORklHXzh4eF9DT1BZQkFDSz15CitDT05GSUdfOHh4X0NQVTY9eQorQ09ORklHXzh4eF9DUFUxNT15CisjIENPTkZJR19OT19VQ09ERV9QQVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU09GX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TUElfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorQ09ORklHX0kyQ19TUElfU01DMV9VQ09ERV9QQVRDSD15CitDT05GSUdfVUNPREVfUEFUQ0g9eQorIyBDT05GSUdfUFEyQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQyBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEMxMDYgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTkVSSUNfSU9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX1BQQ19DUE1fTkVXX0JJTkRJTkc9eQorIyBDT05GSUdfRlNMX1VMSTE1NzUgaXMgbm90IHNldAorQ09ORklHX0NQTT15CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMTAwMD15CitDT05GSUdfSFo9MTAwMAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorIyBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfRlNMX1NPQz15CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1FTUEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBU19SQVBJRElPIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4YzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MDAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU1RBUlQ9MHhmZDAwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU0laRT0weDAwMjAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKK0NPTkZJR19NVERfT0ZfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfU1RBQT15CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorIyBDT05GSUdfTVREX0NGSV9GTEFHQURNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlMgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfRklYRURfUEhZPXkKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CitDT05GSUdfRlNfRU5FVD15CitDT05GSUdfRlNfRU5FVF9IQVNfU0NDPXkKKyMgQ09ORklHX0ZTX0VORVRfSEFTX0ZFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19FTkVUX01ESU9fRkVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU01DMiBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfQ1JBTUZTPXkKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD15CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJUlFfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfUFBDX0NMT0NLIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTElCX1JIRUFQPXkKKyMgQ09ORklHX1ZJUlRVQUxJWkFUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgyNzJfYWRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgyNzJfYWRzX2RlZmNvbmZpZwppbmRleCA3YzQzNWM4Li5mZjZmN2M0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4MjcyX2Fkc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODI3Ml9hZHNfZGVmY29uZmlnCkBAIC0xNTEsMTEgKzE1MSwxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKIENPTkZJR19QUENfODJ4eD15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4M3h4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzeHhfZGVmY29uZmlnCmluZGV4IDkxNmUzZGYuLjk5MWM5YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzeHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzeHhfZGVmY29uZmlnCkBAIC0xNjYsMTEgKzE2NiwxMSBAQAogIwogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKIENPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKICMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQogIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg2MTBfaHBjZF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NjEwX2hwY2RfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5OTA3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg2MTBfaHBjZF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxNDk3ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNy1yYzQKLSMgVGh1IEF1ZyAyMSAwMDo1MjoxMCAyMDA4Ci0jCi0jIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHN1cHBvcnQKLSMKLUNPTkZJR182eHg9eQotIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAotIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0UyMDAgaXMgbm90IHNldAotQ09ORklHX1BQQ19GUFU9eQotQ09ORklHX0FMVElWRUM9eQotQ09ORklHX1BQQ19TVERfTU1VPXkKLUNPTkZJR19QUENfU1REX01NVV8zMj15Ci0jIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDMzI9eQotQ09ORklHX1dPUkRfU0laRT0zMgotQ09ORklHX1BQQ19NRVJHRT15Ci1DT05GSUdfTU1VPXkKLUNPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci0jIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSBpcyBub3Qgc2V0Ci1DT05GSUdfSVJRX1BFUl9DUFU9eQotQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15Ci1DT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQotQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMj15Ci1DT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKLSMgQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVMgaXMgbm90IHNldAotQ09ORklHX1BQQz15Ci1DT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19HRU5FUklDX05WUkFNPXkKLUNPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKLUNPTkZJR19QUENfT0Y9eQotQ09ORklHX09GPXkKLUNPTkZJR19QUENfVURCR18xNjU1MD15Ci0jIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfQVVESVRfQVJDSD15Ci1DT05GSUdfR0VORVJJQ19CVUc9eQotQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKLUNPTkZJR19ISUJFUk5BVEVfMzI9eQotQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQotIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfR1JPVVBfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVF9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKLUNPTkZJR19IT1RQTFVHPXkKLUNPTkZJR19QUklOVEs9eQotQ09ORklHX0JVRz15Ci0jIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKLUNPTkZJR19DT01QQVRfQlJLPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19BTk9OX0lOT0RFUz15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NJR05BTEZEPXkKLUNPTkZJR19USU1FUkZEPXkKLUNPTkZJR19FVkVOVEZEPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotQ09ORklHX1NMVUJfREVCVUc9eQotIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0Ci1DT05GSUdfU0xVQj15Ci0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX09QUk9GSUxFPXkKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQotQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKLUNPTkZJR19IQVZFX0tQUk9CRVM9eQotQ09ORklHX0hBVkVfS1JFVFBST0JFUz15Ci1DT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15Ci0jIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0xBQklORk89eQotQ09ORklHX1JUX01VVEVYRVM9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS01PRD15Ci1DT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLSMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9ERUFETElORT15Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotCi0jCi0jIFBsYXRmb3JtIHN1cHBvcnQKLSMKLUNPTkZJR19QUENfTVVMVElQTEFURk9STT15Ci1DT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15Ci0jIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKLSMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAotIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAotQ09ORklHX1BQQ184Nnh4PXkKLSMgQ09ORklHX01QQzg2NDFfSFBDTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQkM4NjQxRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVBDODYxMF9IUENEPXkKLUNPTkZJR19NUEM4NjEwPXkKLSMgQ09ORklHX0VNQkVEREVENnh4IGlzIG5vdCBzZXQKLUNPTkZJR19QUENfTkFUSVZFPXkKLSMgQ09ORklHX1VEQkdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQSUMgaXMgbm90IHNldAotQ09ORklHX01QSUM9eQotIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0k4MjU5PXkKLUNPTkZJR19QUENfUlRBUz15Ci0jIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcgaXMgbm90IHNldAotQ09ORklHX1JUQVNfUFJPQz15Ci0jIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfTVBDMTA2PXkKLSMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQzYwMV9TWU5DX0ZJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVUgaXMgbm90IHNldAotQ09ORklHX0ZTTF9VTEkxNTc1PXkKLQotIwotIyBLZXJuZWwgb3B0aW9ucwotIwotQ09ORklHX0hJR0hNRU09eQotQ09ORklHX1RJQ0tfT05FU0hPVD15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMTAwMD15Ci1DT05GSUdfSFo9MTAwMAotQ09ORklHX1NDSEVEX0hSVElDSz15Ci1DT05GSUdfUFJFRU1QVF9OT05FPXkKLSMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci1DT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQotQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQotIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKLUNPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLUNPTkZJR19NSUdSQVRJT049eQotIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19CT1VOQ0U9eQotQ09ORklHX1ZJUlRfVE9fQlVTPXkKLUNPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEyCi1DT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKLSMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUUkFfVEFSR0VUUz0iIgotIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVNBX0RNQV9BUEk9eQotCi0jCi0jIEJ1cyBvcHRpb25zCi0jCi0jIENPTkZJR19JU0EgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19HRU5FUklDX0lTQV9ETUE9eQotQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQotQ09ORklHX0ZTTF9TT0M9eQotQ09ORklHX0ZTTF9QQ0k9eQotQ09ORklHX1BQQ19QQ0lfQ0hPSUNFPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9ET01BSU5TPXkKLUNPTkZJR19QQ0lfU1lTQ0FMTD15Ci1DT05GSUdfUENJRVBPUlRCVVM9eQotQ09ORklHX1BDSUVBRVI9eQotIyBDT05GSUdfUENJRUFTUE0gaXMgbm90IHNldAotQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKLSMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAotQ09ORklHX1BDSV9MRUdBQ1k9eQotQ09ORklHX1BDSV9ERUJVRz15Ci0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfSEFTX1JBUElESU8gaXMgbm90IHNldAotCi0jCi0jIEFkdmFuY2VkIHNldHVwCi0jCi0jIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKLQotIwotIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKLSMKLUNPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCi1DT05GSUdfUEFHRV9PRkZTRVQ9MHhjMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weGMwMDAwMDAwCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotQ09ORklHX1hGUk1fVVNFUj15Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotQ09ORklHX0lQX1BOUF9SQVJQPXkKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9UVU5ORUw9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0NVQklDPXkKLUNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKLSMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAotQ09ORklHX0lQVjY9eQotIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPXkKLSMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNl9TSVQ9eQotQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQotIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIwotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRktJTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPXkKLUNPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQotQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCi0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREPXkKLSMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci0jIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotIyBDT05GSUdfTVREX09GX1BBUlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAotCi0jCi0jIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCi0jCi1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTEtERVZTPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKLSMKLUNPTkZJR19NVERfQ0ZJPXkKLSMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfR0VOX1BST0JFPXkKLSMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JMT15Ci1DT05GSUdfTVREX0NGSV9JMj15Ci0jIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9BTURTVEQ9eQotIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX1VUSUw9eQotIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotCi0jCi0jIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKLSMKLSMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfUEhZU01BUF9PRj15Ci0jIENPTkZJR19NVERfSU5URUxfVlJfTk9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKLQotIwotIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAotCi0jCi0jIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTkFORD15Ci0jIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTkFORF9JRFM9eQotIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9DQUZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfUExBVEZPUk0gaXMgbm90IHNldAotQ09ORklHX01URF9OQU5EX0ZTTF9FTEJDPXkKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKLQotIwotIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKLSMKLSMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAotQ09ORklHX09GX0RFVklDRT15Ci1DT05GSUdfT0ZfSTJDPXkKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVY9eQotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTMxMDcyCi0jIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLUNPTkZJR19NSVNDX0RFVklDRVM9eQotIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAotIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAotQ09ORklHX0hBVkVfSURFPXkKLUNPTkZJR19JREU9eQotIyBDT05GSUdfQkxLX0RFVl9JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfRE1BPXkKLUNPTkZJR19TQ1NJX1RHVD15Ci0jIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotQ09ORklHX1NDU0lfUFJPQ19GUz15Ci0KLSMKLSMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKLSMKLUNPTkZJR19CTEtfREVWX1NEPXkKLSMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAotIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAotQ09ORklHX0NIUl9ERVZfU0c9eQotIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAotCi0jCi0jIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwotIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9XQUlUX1NDQU49bQotCi0jCi0jIFNDU0kgVHJhbnNwb3J0cwotIwotIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9MT1dMRVZFTD15Ci0jIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01FU0ggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9NQUM1M0M5NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKLUNPTkZJR19BVEE9eQotIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19TQVRBX1BNUD15Ci1DT05GSUdfU0FUQV9BSENJPXkKLSMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9GU0wgaXMgbm90IHNldAotQ09ORklHX0FUQV9TRkY9eQotIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAotIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKLUNPTkZJR19QQVRBX0FMST15Ci0jIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKLSMKLSMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfRFVNTVk9eQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0UgaXMgbm90IHNldAotIyBDT05GSUdfQk1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfVFVMSVA9eQotIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVUxJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAotQ09ORklHX1VMSTUyNlg9eQotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOCi0jCi0jIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19JODA0Mj15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD15Ci0jIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX0xJQlBTMj15Ci0jIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fWElMSU5YX1hQU19QUzIgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWS01FTT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTIKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTIKLUNPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15Ci1DT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKLUNPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRPXkKLUNPTkZJR19TRVJJQUxfODI1MF9SU0E9eQotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAotIyBDT05GSUdfQlJJUV9QQU5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVkNfUlRBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQk9BUkRJTkZPPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfSEVMUEVSX0FVVE89eQotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotCi0jCi0jIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKLQotIwotIyBNYWMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKLSMKLSMgQ09ORklHX0kyQ19IWURSQSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX1BPV0VSTUFDPXkKLQotIwotIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKLSMKLUNPTkZJR19JMkNfTVBDPXkKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBhZGFwdGVyIEkyQy9EREMgY2hhbm5lbCBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0Ci0KLSMKLSMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQotIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLQotIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi1DT05GSUdfREFCPXkKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15Ci1DT05GSUdfRkI9eQotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9EREMgaXMgbm90IHNldAotQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15Ci1DT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKLUNPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLSMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotCi0jCi0jIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCi0jCi0jIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NZQkVSMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9PRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DT05UUk9MIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BMQVRJTlVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZBTEtZUklFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NUNjU1NTAgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVkdBMTYgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DQVJNSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9GU0xfRElVPXkKLSMgQ09ORklHX0ZCX0lCTV9HWFQ0NTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotQ09ORklHX1ZHQV9DT05TT0xFPXkKLSMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORD15Ci1DT05GSUdfU05EPXkKLUNPTkZJR19TTkRfVElNRVI9eQotQ09ORklHX1NORF9QQ009eQotIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX09TU0VNVUw9eQotQ09ORklHX1NORF9NSVhFUl9PU1M9eQotQ09ORklHX1NORF9QQ01fT1NTPXkKLUNPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKLSMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQotIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0RSSVZFUlM9eQotIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfUENJPXkKLSMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxTNDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hJRklFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSUE4MlhYX01PREVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9WSVJUVU9TTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1BQQz15Ci0jIENPTkZJR19TTkRfUE9XRVJNQUMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FPQSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1NPQz15Ci1DT05GSUdfU05EX1NPQ19NUEM4NjEwPXkKLUNPTkZJR19TTkRfU09DX01QQzg2MTBfSFBDRD15Ci1DT05GSUdfU05EX1NPQ19DUzQyNzA9eQotQ09ORklHX1NORF9TT0NfQ1M0MjcwX1ZEMzNfRVJSQVRBPXkKLSMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKLUNPTkZJR19ISURfU1VQUE9SVD15Ci1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURSQVcgaXMgbm90IHNldAotQ09ORklHX1VTQl9TVVBQT1JUPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKLSMKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0xJQj15Ci1DT05GSUdfUlRDX0NMQVNTPXkKLUNPTkZJR19SVENfSENUT1NZUz15Ci1DT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgotIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBSVEMgaW50ZXJmYWNlcwotIwotQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKLUNPTkZJR19SVENfSU5URl9QUk9DPXkKLUNPTkZJR19SVENfSU5URl9ERVY9eQotIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIFJUQyBkcml2ZXJzCi0jCi0jIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgUlRDIGRyaXZlcnMKLSMKLQotIwotIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwotIwotQ09ORklHX1JUQ19EUlZfQ01PUz15Ci0jIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAotCi0jCi0jIG9uLUNQVSBSVEMgZHJpdmVycwotIwotIyBDT05GSUdfUlRDX0RSVl9QUEMgaXMgbm90IHNldAotIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VSU8gaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkZTRD15Ci0jIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci1DT05GSUdfRVhQT1JURlM9eQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MRE1fUEFSVElUSU9OPXkKLSMgQ09ORklHX0xETV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9eQotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCi0jIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETE0gaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19CSVRSRVZFUlNFPXkKLSMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKLSMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAotQ09ORklHX1BMSVNUPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlQ9eQotQ09ORklHX0hBU19ETUE9eQotQ09ORklHX0hBVkVfTE1CPXkKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTEwMjQKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfREVCVUdfU0hJUlE9eQotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQotQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAotIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotQ09ORklHX0hBVkVfRlRSQUNFPXkKLUNPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKLSMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfQ09ERV9QQVRDSElOR19TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVFJfRklYVVBfU0VMRlRFU1QgaXMgbm90IHNldAotIyBDT05GSUdfWE1PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUlFTVEFDS1MgaXMgbm90IHNldAotIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPPXkKLQotIwotIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKLSMKLSMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKLSMKLSMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFzaCBtb2RlcwotIwotIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotCi0jCi0jIERpZ2VzdAotIwotIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLQotIwotIyBDaXBoZXJzCi0jCi0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotCi0jCi0jIENvbXByZXNzaW9uCi0jCi0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fSFc9eQotIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFVl9UQUxJVE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0xJQl9SSEVBUD15Ci0jIENPTkZJR19WSVJUVUFMSVpBVElPTiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NjQxX2hwY25fZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODY0MV9ocGNuX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwOWJlMy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NjQxX2hwY25fZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTY2NiArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM0Ci0jIFRodSBBdWcgMjEgMDA6NTI6MTEgMjAwOAotIwotIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzdXBwb3J0Ci0jCi1DT05GSUdfNnh4PXkKLSMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAotIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKLSMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfRlBVPXkKLUNPTkZJR19BTFRJVkVDPXkKLUNPTkZJR19QUENfU1REX01NVT15Ci1DT05GSUdfUFBDX1NURF9NTVVfMzI9eQotIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTIKLUNPTkZJR19QUEMzMj15Ci1DT05GSUdfV09SRF9TSVpFPTMyCi1DT05GSUdfUFBDX01FUkdFPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQotQ09ORklHX0dFTkVSSUNfVElNRT15Ci1DT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLSMgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBIGlzIG5vdCBzZXQKLUNPTkZJR19JUlFfUEVSX0NQVT15Ci1DT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKLUNPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQotIyBDT05GSUdfQVJDSF9OT19WSVJUX1RPX0JVUyBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDPXkKLUNPTkZJR19FQVJMWV9QUklOVEs9eQotQ09ORklHX0dFTkVSSUNfTlZSQU09eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQotQ09ORklHX1BQQ19PRj15Ci1DT05GSUdfT0Y9eQotQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKLUNPTkZJR19HRU5FUklDX1RCU1lOQz15Ci1DT05GSUdfQVVESVRfQVJDSD15Ci1DT05GSUdfR0VORVJJQ19CVUc9eQotQ09ORklHX0RFRkFVTFRfVUlNQUdFPXkKLSMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0xPQ0tfS0VSTkVMPXkKLUNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfU1lTVklQQ19TWVNDVEw9eQotQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci1DT05GSUdfQVVESVQ9eQotIyBDT05GSUdfQVVESVRTWVNDQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfR1JPVVBfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVF9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19QQ1NQS1JfUExBVEZPUk09eQotQ09ORklHX0NPTVBBVF9CUks9eQotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfU0xVQl9ERUJVRz15Ci0jIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19TTFVCPXkKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15Ci1DT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQotQ09ORklHX0hBVkVfS1BST0JFUz15Ci1DT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKLUNPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKLSMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKLUNPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15Ci0jIENPTkZJR19IQVZFX0NMSyBpcyBub3Qgc2V0Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQotIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0xBQklORk89eQotQ09ORklHX1JUX01VVEVYRVM9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15Ci1DT05GSUdfTU9EVkVSU0lPTlM9eQotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLUNPTkZJR19TVE9QX01BQ0hJTkU9eQotQ09ORklHX0JMT0NLPXkKLUNPTkZJR19MQkQ9eQotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MU0YgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9DRlE9eQotIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKLUNPTkZJR19DTEFTU0lDX1JDVT15Ci0KLSMKLSMgUGxhdGZvcm0gc3VwcG9ydAotIwotQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKLUNPTkZJR19DTEFTU0lDMzI9eQotQ09ORklHX1BQQ19DSFJQPXkKLSMgQ09ORklHX01QQzUxMjFfQURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01QQzUxMjFfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfTVBDNTJ4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX1BNQUM9eQotIyBDT05GSUdfUFBDX0NFTEwgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BRMkFEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDXzg2eHg9eQotQ09ORklHX01QQzg2NDFfSFBDTj15Ci0jIENPTkZJR19TQkM4NjQxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUEM4NjEwX0hQQ0QgaXMgbm90IHNldAotQ09ORklHX01QQzg2NDE9eQotQ09ORklHX1BQQ19OQVRJVkU9eQotIyBDT05GSUdfVURCR19SVEFTX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfSVBJQyBpcyBub3Qgc2V0Ci1DT05GSUdfTVBJQz15Ci0jIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfSTgyNTk9eQotQ09ORklHX1BQQ19SVEFTPXkKLSMgQ09ORklHX1JUQVNfRVJST1JfTE9HR0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfUlRBU19QUk9DPXkKLSMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAotQ09ORklHX1BQQ19NUEMxMDY9eQotIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTkVSSUNfSU9NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotIyBDT05GSUdfUFBDNjAxX1NZTkNfRklYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBVSBpcyBub3Qgc2V0Ci1DT05GSUdfRlNMX1VMSTE1NzU9eQotCi0jCi0jIEtlcm5lbCBvcHRpb25zCi0jCi1DT05GSUdfSElHSE1FTT15Ci1DT05GSUdfVElDS19PTkVTSE9UPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKLSMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKLUNPTkZJR19IWl8xMDAwPXkKLUNPTkZJR19IWj0xMDAwCi1DT05GSUdfU0NIRURfSFJUSUNLPXkKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9bQotIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci1DT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQotQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQotIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfSVJRX0FMTF9DUFVTIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15Ci1DT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfRkxBVE1FTV9NQU5VQUw9eQotIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19GTEFUTUVNPXkKLUNPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKLUNPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00Ci1DT05GSUdfTUlHUkFUSU9OPXkKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi1DT05GSUdfQk9VTkNFPXkKLUNPTkZJR19WSVJUX1RPX0JVUz15Ci1DT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQotQ09ORklHX1BST0NfREVWSUNFVFJFRT15Ci0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAotQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNDT01QPXkKLUNPTkZJR19JU0FfRE1BX0FQST15Ci0KLSMKLSMgQnVzIG9wdGlvbnMKLSMKLSMgQ09ORklHX0lTQSBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15Ci1DT05GSUdfUFBDX0lORElSRUNUX1BDST15Ci1DT05GSUdfRlNMX1NPQz15Ci1DT05GSUdfRlNMX1BDST15Ci1DT05GSUdfUFBDX1BDSV9DSE9JQ0U9eQotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotQ09ORklHX1BDSV9TWVNDQUxMPXkKLSMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1NVUFBPUlRTX01TST15Ci0jIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKLUNPTkZJR19QQ0lfTEVHQUNZPXkKLSMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAotQ09ORklHX0hBU19SQVBJRElPPXkKLSMgQ09ORklHX1JBUElESU8gaXMgbm90IHNldAotCi0jCi0jIEFkdmFuY2VkIHNldHVwCi0jCi0jIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKLQotIwotIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKLSMKLUNPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCi1DT05GSUdfUEFHRV9PRkZTRVQ9MHhjMDAwMDAwMAotQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCi1DT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgwMDAwMDAwMAotQ09ORklHX1RBU0tfU0laRT0weGMwMDAwMDAwCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotQ09ORklHX1hGUk1fVVNFUj15Ci0jIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0tFWT1tCi0jIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKLUNPTkZJR19BU0tfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLUNPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci1DT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci1DT05GSUdfTkVUX0lQSVA9eQotQ09ORklHX05FVF9JUEdSRT15Ci1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15Ci1DT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQotQ09ORklHX0FSUEQ9eQotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1RVTk5FTD15Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotQ09ORklHX0lORVRfRElBRz15Ci1DT05GSUdfSU5FVF9UQ1BfRElBRz15Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNj15Ci0jIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9eQotIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1NJVD15Ci1DT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15Ci0jIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2X01ST1VURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1NDVFA9bQotIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0Ci1DT05GSUdfU0NUUF9ITUFDX01ENT15Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotQ09ORklHX0ZJQl9SVUxFUz15Ci0KLSMKLSMgV2lyZWxlc3MKLSMKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15Ci1DT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKLUNPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLUNPTkZJR19PRl9ERVZJQ0U9eQotQ09ORklHX09GX0kyQz15Ci0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWPXkKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDX0ZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX05CRD15Ci0jIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgotIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0lERT15Ci0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotQ09ORklHX1NDU0k9eQotQ09ORklHX1NDU0lfRE1BPXkKLSMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwotQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NIUl9ERVZfU1Q9eQotIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1NSPXkKLSMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKLUNPTkZJR19DSFJfREVWX1NHPXkKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLUNPTkZJR19TQ1NJX01VTFRJX0xVTj15Ci0jIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9MT0dHSU5HPXkKLSMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9XQUlUX1NDQU49bQotCi0jCi0jIFNDU0kgVHJhbnNwb3J0cwotIwotIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9MT1dMRVZFTD15Ci0jIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX01FU0ggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9NQUM1M0M5NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKLUNPTkZJR19BVEE9eQotIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19TQVRBX1BNUD15Ci1DT05GSUdfU0FUQV9BSENJPXkKLSMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9GU0wgaXMgbm90IHNldAotQ09ORklHX0FUQV9TRkY9eQotIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAotIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKLUNPTkZJR19QQVRBX0FMST15Ci0jIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKLSMKLSMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfRFVNTVk9eQotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotQ09ORklHX1BIWUxJQj15Ci0KLSMKLSMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0Ci1DT05GSUdfVklURVNTRV9QSFk9eQotIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotIyBDT05GSUdfTUFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTUFDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWXzEwMDA9eQotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JR0IgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUdPTjMgaXMgbm90IHNldAotIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0Ci1DT05GSUdfR0lBTkZBUj15Ci0jIENPTkZJR19NVjY0M1hYX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldAotQ09ORklHX05FVERFVl8xMDAwMD15Ci0jIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKLSMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUhVVEkgaXMgbm90IHNldAotIyBDT05GSUdfQk5YMlggaXMgbm90IHNldAotIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4KLSMKLSMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAotCi0jCi0jIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX0k4MDQyPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19YSUxJTlhfWFBTX1BTMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZLTUVNPXkKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OT1pPTUkgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX1BDST15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgotQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKLUNPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKLUNPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQotQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQotQ09ORklHX1NFUklBTF84MjUwX1JTQT15Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfUE1BQ1pJTE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0jIENPTkZJR19CUklRX1BBTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hWQ19SVEFTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX05WUkFNPXkKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQk9BUkRJTkZPPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfSEVMUEVSX0FVVE89eQotCi0jCi0jIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAotIwotCi0jCi0jIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JU0NIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKLQotIwotIyBNYWMgU01CdXMgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKLSMKLSMgQ09ORklHX0kyQ19IWURSQSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX1BPV0VSTUFDPXkKLQotIwotIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKLSMKLUNPTkZJR19JMkNfTVBDPXkKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19FRVBST009eQotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15Ci0jIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCi0jIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19EVkJfQ09SRT1tCi1DT05GSUdfVklERU9fTUVESUE9bQotCi0jCi0jIE11bHRpbWVkaWEgZHJpdmVycwotIwotIyBDT05GSUdfTUVESUFfQVRUQUNIIGlzIG5vdCBzZXQKLUNPTkZJR19NRURJQV9UVU5FUj1tCi0jIENPTkZJR19NRURJQV9UVU5FUl9DVVNUT01JWkUgaXMgbm90IHNldAotQ09ORklHX01FRElBX1RVTkVSX1NJTVBMRT1tCi1DT05GSUdfTUVESUFfVFVORVJfVERBODI5MD1tCi1DT05GSUdfTUVESUFfVFVORVJfVERBOTg4Nz1tCi1DT05GSUdfTUVESUFfVFVORVJfVEVBNTc2MT1tCi1DT05GSUdfTUVESUFfVFVORVJfVEVBNTc2Nz1tCi1DT05GSUdfTUVESUFfVFVORVJfTVQyMFhYPW0KLUNPTkZJR19NRURJQV9UVU5FUl9YQzIwMjg9bQotQ09ORklHX01FRElBX1RVTkVSX1hDNTAwMD1tCi1DT05GSUdfRFZCX0NBUFRVUkVfRFJJVkVSUz15Ci0KLSMKLSMgU3VwcG9ydGVkIFNBQTcxNDYgYmFzZWQgUENJIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19UVFBDSV9FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0JVREdFVF9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBTdXBwb3J0ZWQgVVNCIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19EVkJfVVNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UVFVTQl9CVURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1RUVVNCX0RFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ0lORVJHWVQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9TSUFOT19TTVMxWFhYIGlzIG5vdCBzZXQKLQotIwotIyBTdXBwb3J0ZWQgRmxleENvcElJIChCMkMyKSBBZGFwdGVycwotIwotIyBDT05GSUdfRFZCX0IyQzJfRkxFWENPUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU3VwcG9ydGVkIEJUODc4IEFkYXB0ZXJzCi0jCi0KLSMKLSMgU3VwcG9ydGVkIFBsdXRvMiBBZGFwdGVycwotIwotIyBDT05GSUdfRFZCX1BMVVRPMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU3VwcG9ydGVkIERWQiBGcm9udGVuZHMKLSMKLQotIwotIyBDdXN0b21pc2UgRFZCIEZyb250ZW5kcwotIwotIyBDT05GSUdfRFZCX0ZFX0NVU1RPTUlTRSBpcyBub3Qgc2V0Ci0KLSMKLSMgRFZCLVMgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzCi0jCi0jIENPTkZJR19EVkJfQ1gyNDExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ1gyNDEyMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfTVQzMTIgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1M1SDE0MjAgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1NUVjAyOTkgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1REQTgwODMgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1REQTEwMDg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9WRVMxWDkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UVU5FUl9JVEQxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UREE4MjZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UVUE2MTAwIGlzIG5vdCBzZXQKLQotIwotIyBEVkItVCAodGVycmVzdHJpYWwpIGZyb250ZW5kcwotIwotIyBDT05GSUdfRFZCX1NQODg3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfU1A4ODdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9DWDIyNzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9DWDIyNzAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9EUlgzOTdYRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfTDY0NzgxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UREExMDA0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfTlhUNjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfTVQzNTIgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1pMMTAzNTMgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0RJQjMwMDBNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfRElCMzAwME1DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9ESUI3MDAwTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfRElCNzAwMFAgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1REQTEwMDQ4IGlzIG5vdCBzZXQKLQotIwotIyBEVkItQyAoY2FibGUpIGZyb250ZW5kcwotIwotIyBDT05GSUdfRFZCX1ZFUzE4MjAgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1REQTEwMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9UREExMDAyMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfU1RWMDI5NyBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRTQyAoTm9ydGggQW1lcmljYW4vS29yZWFuIFRlcnJlc3RyaWFsL0NhYmxlIERUVikgZnJvbnRlbmRzCi0jCi0jIENPTkZJR19EVkJfTlhUMjAwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfT1I1MTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfT1I1MTEzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQkNNMzUxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfTEdEVDMzMFggaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1M1SDE0MDkgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX0FVODUyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfUzVIMTQxMSBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCB0ZXJyZXN0cmlhbCBvbmx5IHR1bmVycy9QTEwKLSMKLSMgQ09ORklHX0RWQl9QTEwgaXMgbm90IHNldAotIyBDT05GSUdfRFZCX1RVTkVSX0RJQjAwNzAgaXMgbm90IHNldAotCi0jCi0jIFNFQyBjb250cm9sIGRldmljZXMgZm9yIERWQi1TCi0jCi0jIENPTkZJR19EVkJfTE5CUDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9JU0w2NDA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0RWQl9JU0w2NDIxIGlzIG5vdCBzZXQKLUNPTkZJR19EQUI9eQotIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQotIyBDT05GSUdfRkIgaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotQ09ORklHX1ZHQV9DT05TT0xFPXkKLSMgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotQ09ORklHX1NPVU5EPXkKLUNPTkZJR19TTkQ9eQotQ09ORklHX1NORF9USU1FUj15Ci1DT05GSUdfU05EX1BDTT15Ci0jIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfT1NTRU1VTD15Ci1DT05GSUdfU05EX01JWEVSX09TUz15Ci1DT05GSUdfU05EX1BDTV9PU1M9eQotQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQotIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAotQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15Ci0jIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfVk1BU1RFUj15Ci1DT05GSUdfU05EX0FDOTdfQ09ERUM9eQotQ09ORklHX1NORF9EUklWRVJTPXkKLSMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfUENJPXkKLSMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMUzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxTNDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQUxJNTQ1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVElJWFBfTU9ERU0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FXMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVpUMzMyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQlQ4N1ggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ01JUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9PWFlHRU4gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FTlMxMzcxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9FUzE5MzggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTk2OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hEQV9JTlRFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERTUE0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0hJRklFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0lOVEVMOFgwPXkKLSMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0tPUkcxMjEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTUlYQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9OTTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUENYSFIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JJUFRJREUgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09OSUNWSUJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklBODJYWF9NT0RFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklSVFVPU08gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAotQ09ORklHX1NORF9QUEM9eQotIyBDT05GSUdfU05EX1BPV0VSTUFDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BT0EgaXMgbm90IHNldAotQ09ORklHX1NORF9VU0I9eQotIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVVNCX1VTWDJZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0Ci1DT05GSUdfQUM5N19CVVM9eQotQ09ORklHX0hJRF9TVVBQT1JUPXkKLUNPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIElucHV0IERldmljZXMKLSMKLUNPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAotQ09ORklHX1VTQl9TVVBQT1JUPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQotQ09ORklHX1VTQj15Ci0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCi0jCi1DT05GSUdfVVNCX0RFVklDRUZTPXkKLUNPTkZJR19VU0JfREVWSUNFX0NMQVNTPXkKLSMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX01PTj15Ci0KLSMKLSMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0VIQ0lfSENEPXkKLSMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX0ZTTCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0VIQ0lfSENEX1BQQ19PRj15Ci0jIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfT0hDSV9IQ0Q9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEU9eQotQ09ORklHX1VTQl9PSENJX0hDRF9QQ0k9eQotQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQz15Ci1DT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPPXkKLUNPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKLSMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotQ09ORklHX1VTQl9TVE9SQUdFPXkKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9TSUVSUkEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBJbWFnaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgcG9ydCBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FREFDIGlzIG5vdCBzZXQKLUNPTkZJR19SVENfTElCPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUQ19IQ1RPU1lTPXkKLUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCi0jIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFJUQyBpbnRlcmZhY2VzCi0jCi1DT05GSUdfUlRDX0lOVEZfU1lTRlM9eQotQ09ORklHX1JUQ19JTlRGX1BST0M9eQotQ09ORklHX1JUQ19JTlRGX0RFVj15Ci0jIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgUlRDIGRyaXZlcnMKLSMKLSMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBSVEMgZHJpdmVycwotIwotCi0jCi0jIFBsYXRmb3JtIFJUQyBkcml2ZXJzCi0jCi1DT05GSUdfUlRDX0RSVl9DTU9TPXkKLSMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0Ci0KLSMKLSMgb24tQ1BVIFJUQyBkcml2ZXJzCi0jCi0jIENPTkZJR19SVENfRFJWX1BQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKLSMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSkJEPXkKLUNPTkZJR19GU19NQkNBQ0hFPXkKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19JTk9USUZZPXkKLUNPTkZJR19JTk9USUZZX1VTRVI9eQotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0lTTzk2NjBfRlM9bQotQ09ORklHX0pPTElFVD15Ci1DT05GSUdfWklTT0ZTPXkKLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VERl9OTFM9eQotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPW0KLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLUNPTkZJR19OVEZTX0ZTPXkKLSMgQ09ORklHX05URlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfQURGU19GUz1tCi0jIENPTkZJR19BREZTX0ZTX1JXIGlzIG5vdCBzZXQKLUNPTkZJR19BRkZTX0ZTPW0KLUNPTkZJR19IRlNfRlM9bQotQ09ORklHX0hGU1BMVVNfRlM9bQotQ09ORklHX0JFRlNfRlM9bQotIyBDT05GSUdfQkVGU19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZTX0ZTPW0KLUNPTkZJR19FRlNfRlM9bQotQ09ORklHX0NSQU1GUz15Ci1DT05GSUdfVlhGU19GUz1tCi0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19IUEZTX0ZTPW0KLUNPTkZJR19RTlg0RlNfRlM9bQotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotQ09ORklHX1NZU1ZfRlM9bQotQ09ORklHX1VGU19GUz1tCi0jIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19ORlNEPXkKLSMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19FWFBPUlRGUz15Ci1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPXkKLUNPTkZJR19TVU5SUENfR1NTPXkKLUNPTkZJR19SUENTRUNfR1NTX0tSQjU9eQotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19NQUNfUEFSVElUSU9OPXkKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfVVRGOD1tCi0jIENPTkZJR19ETE0gaXMgbm90IHNldAotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLUNPTkZJR19CSVRSRVZFUlNFPXkKLSMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfVDEwRElGPXkKLUNPTkZJR19DUkNfSVRVX1Q9bQotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0NSQzcgaXMgbm90IHNldAotQ09ORklHX0xJQkNSQzMyQz1tCi1DT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19QTElTVD15Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfSU9QT1JUPXkKLUNPTkZJR19IQVNfRE1BPXkKLUNPTkZJR19IQVZFX0xNQj15Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLUNPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKLUNPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci1DT05GSUdfRlJBTUVfV0FSTj0xMDI0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19LRVJORUw9eQotIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAotQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKLSMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15Ci1DT05GSUdfSEFWRV9GVFJBQ0U9eQotQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQotIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9BUkNIX0tHREI9eQotIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RFX1BBVENISU5HX1NFTEZURVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSUVNUQUNLUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRElfU1dJVENIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE89eQotCi0jCi0jIENyeXB0byBjb3JlIG9yIGhlbHBlcgotIwotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci0jIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCi0jCi0jIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBtb2RlcwotIwotQ09ORklHX0NSWVBUT19DQkM9eQotIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1BDQkM9bQotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFzaCBtb2RlcwotIwotQ09ORklHX0NSWVBUT19ITUFDPXkKLSMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKLQotIwotIyBEaWdlc3QKLSMKLSMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1NIQTE9bQotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLQotIwotIyBDaXBoZXJzCi0jCi0jIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fREVTPXkKLSMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKLQotIwotIyBDb21wcmVzc2lvbgotIwotIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0hXPXkKLSMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVZfVEFMSVRPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfQ0xPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfVklSVFVBTElaQVRJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODZ4eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4Nnh4X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDRiZTgyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg2eHhfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTY0NiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNQorIyBUdWUgU2VwIDIzIDIzOjI4OjM4IDIwMDgKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworQ09ORklHXzZ4eD15CisjIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0ZQVT15CitDT05GSUdfQUxUSVZFQz15CitDT05GSUdfUFBDX1NURF9NTVU9eQorQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKKyMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz0yCitDT05GSUdfUFBDMzI9eQorQ09ORklHX1dPUkRfU0laRT0zMgorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CisjIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSBpcyBub3Qgc2V0CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMj15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKKyMgQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVMgaXMgbm90IHNldAorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX09GPXkKK0NPTkZJR19QUENfVURCR18xNjU1MD15CitDT05GSUdfR0VORVJJQ19UQlNZTkM9eQorQ09ORklHX0FVRElUX0FSQ0g9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZBVUxUX1VJTUFHRT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorQ09ORklHX0FVRElUPXkKKyMgQ09ORklHX0FVRElUU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKK0NPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorIyBDT05GSUdfSEFWRV9ETUFfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKKyMgQ09ORklHX0hBVkVfQ0xLIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX1NUT1BfTUFDSElORT15CitDT05GSUdfQkxPQ0s9eQorQ09ORklHX0xCRD15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX01QQzh4eHhfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNPXkKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9BRFMgaXMgbm90IHNldAorIyBDT05GSUdfTVBDNTEyMV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184Nnh4PXkKK0NPTkZJR19NUEM4NjQxX0hQQ049eQorQ09ORklHX1NCQzg2NDFEPXkKK0NPTkZJR19NUEM4NjEwX0hQQ0Q9eQorQ09ORklHX0dFRl9TQkM2MTA9eQorQ09ORklHX01QQzg2NDE9eQorQ09ORklHX01QQzg2MTA9eQorIyBDT05GSUdfSVBJQyBpcyBub3Qgc2V0CitDT05GSUdfTVBJQz15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSTgyNTk9eQorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVSBpcyBub3Qgc2V0CitDT05GSUdfRlNMX1VMSTE1NzU9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCitDT05GSUdfSElHSE1FTT15CitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDAwPXkKK0NPTkZJR19IWj0xMDAwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9bQorIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfSVJRX0FMTF9DUFVTIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19GU0xfU09DPXkKK0NPTkZJR19GU0xfUENJPXkKK0NPTkZJR19QUENfUENJX0NIT0lDRT15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CitDT05GSUdfUENJX1NZU0NBTEw9eQorIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKKyMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAorQ09ORklHX1BDSV9MRUdBQ1k9eQorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfSEFTX1JBUElESU89eQorIyBDT05GSUdfUkFQSURJTyBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19QQUdFX09GRlNFVD0weGMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19QSFlTSUNBTF9TVEFSVD0weDAwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4YzAwMDAwMDAKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPW0KKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKK0NPTkZJR19ORVRfSVBJUD15CitDT05GSUdfTkVUX0lQR1JFPXkKK0NPTkZJR19ORVRfSVBHUkVfQlJPQURDQVNUPXkKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKK0NPTkZJR19JUF9QSU1TTV9WMj15CitDT05GSUdfQVJQRD15CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfVFVOTkVMPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PXkKKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPXkKK0NPTkZJR19JUFY2X05ESVNDX05PREVUWVBFPXkKKyMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfU0NUUD1tCisjIENPTkZJR19TQ1RQX0RCR19NU0cgaXMgbm90IHNldAorIyBDT05GSUdfU0NUUF9EQkdfT0JKQ05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfSE1BQ19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfSE1BQ19TSEExIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1RQX0hNQUNfTUQ1PXkKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CitDT05GSUdfRklCX1JVTEVTPXkKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVEQgaXMgbm90IHNldAorQ09ORklHX09GX0RFVklDRT15CitDT05GSUdfT0ZfSTJDPXkKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX05CRD15CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKKyMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT0dHSU5HPXkKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQURWQU5TWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1BNUD15CitDT05GSUdfU0FUQV9BSENJPXkKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9GU0wgaXMgbm90IHNldAorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX0FMST15CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OSU5KQTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfVklURVNTRV9QSFk9eQorIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAorIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKKyMgQ09ORklHX01WNjQzWFhfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWXzEwMDAwPXkKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CisjIENPTkZJR19OSVUgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFSFVUSSBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0CisjIENPTkZJR19TRkMgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1hJTElOWF9YUFNfUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PWk9NSSBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19TRVJJQUxfVUFSVExJVEUgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKK0NPTkZJR19OVlJBTT15CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0RFVlBPUlQ9eQorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIGFkYXB0ZXIgSTJDL0REQyBjaGFubmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorQ09ORklHX1NFTlNPUlNfRUVQUk9NPXkKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfRFZCX0NPUkU9bQorQ09ORklHX1ZJREVPX01FRElBPW0KKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX01FRElBX0FUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfTUVESUFfVFVORVI9bQorIyBDT05GSUdfTUVESUFfVFVORVJfQ1VTVE9NSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19NRURJQV9UVU5FUl9TSU1QTEU9bQorQ09ORklHX01FRElBX1RVTkVSX1REQTgyOTA9bQorQ09ORklHX01FRElBX1RVTkVSX1REQTk4ODc9bQorQ09ORklHX01FRElBX1RVTkVSX1RFQTU3NjE9bQorQ09ORklHX01FRElBX1RVTkVSX1RFQTU3Njc9bQorQ09ORklHX01FRElBX1RVTkVSX01UMjBYWD1tCitDT05GSUdfTUVESUFfVFVORVJfWEMyMDI4PW0KK0NPTkZJR19NRURJQV9UVU5FUl9YQzUwMDA9bQorQ09ORklHX0RWQl9DQVBUVVJFX0RSSVZFUlM9eQorCisjCisjIFN1cHBvcnRlZCBTQUE3MTQ2IGJhc2VkIFBDSSBBZGFwdGVycworIworIyBDT05GSUdfVFRQQ0lfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9CVURHRVRfQ09SRSBpcyBub3Qgc2V0CisKKyMKKyMgU3VwcG9ydGVkIFVTQiBBZGFwdGVycworIworIyBDT05GSUdfRFZCX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVFRVU0JfQlVER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UVFVTQl9ERUMgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NJTkVSR1lUMiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfU0lBTk9fU01TMVhYWCBpcyBub3Qgc2V0CisKKyMKKyMgU3VwcG9ydGVkIEZsZXhDb3BJSSAoQjJDMikgQWRhcHRlcnMKKyMKKyMgQ09ORklHX0RWQl9CMkMyX0ZMRVhDT1AgaXMgbm90IHNldAorCisjCisjIFN1cHBvcnRlZCBCVDg3OCBBZGFwdGVycworIworCisjCisjIFN1cHBvcnRlZCBQbHV0bzIgQWRhcHRlcnMKKyMKKyMgQ09ORklHX0RWQl9QTFVUTzIgaXMgbm90IHNldAorCisjCisjIFN1cHBvcnRlZCBEVkIgRnJvbnRlbmRzCisjCisKKyMKKyMgQ3VzdG9taXNlIERWQiBGcm9udGVuZHMKKyMKKyMgQ09ORklHX0RWQl9GRV9DVVNUT01JU0UgaXMgbm90IHNldAorCisjCisjIERWQi1TIChzYXRlbGxpdGUpIGZyb250ZW5kcworIworIyBDT05GSUdfRFZCX0NYMjQxMTAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NYMjQxMjMgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX01UMzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9TNUgxNDIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9TVFYwMjk5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREE4MDgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREExMDA4NiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVkVTMVg5MyBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVFVORVJfSVREMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVERBODI2WCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVFVBNjEwMCBpcyBub3Qgc2V0CisKKyMKKyMgRFZCLVQgKHRlcnJlc3RyaWFsKSBmcm9udGVuZHMKKyMKKyMgQ09ORklHX0RWQl9TUDg4NzAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1NQODg3WCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ1gyMjcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ1gyMjcwMiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfRFJYMzk3WEQgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0w2NDc4MSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVERBMTAwNFggaXMgbm90IHNldAorIyBDT05GSUdfRFZCX05YVDYwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX01UMzUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9aTDEwMzUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9ESUIzMDAwTUIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0RJQjMwMDBNQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfRElCNzAwME0gaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0RJQjcwMDBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREExMDA0OCBpcyBub3Qgc2V0CisKKyMKKyMgRFZCLUMgKGNhYmxlKSBmcm9udGVuZHMKKyMKKyMgQ09ORklHX0RWQl9WRVMxODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UREExMDAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfVERBMTAwMjMgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1NUVjAyOTcgaXMgbm90IHNldAorCisjCisjIEFUU0MgKE5vcnRoIEFtZXJpY2FuL0tvcmVhbiBUZXJyZXN0cmlhbC9DYWJsZSBEVFYpIGZyb250ZW5kcworIworIyBDT05GSUdfRFZCX05YVDIwMFggaXMgbm90IHNldAorIyBDT05GSUdfRFZCX09SNTEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX09SNTExMzIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0JDTTM1MTAgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0xHRFQzMzBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9TNUgxNDA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9BVTg1MjIgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX1M1SDE0MTEgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgdGVycmVzdHJpYWwgb25seSB0dW5lcnMvUExMCisjCisjIENPTkZJR19EVkJfUExMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9UVU5FUl9ESUIwMDcwIGlzIG5vdCBzZXQKKworIworIyBTRUMgY29udHJvbCBkZXZpY2VzIGZvciBEVkItUworIworIyBDT05GSUdfRFZCX0xOQlAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfSVNMNjQwNSBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfSVNMNjQyMSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPXkKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19WR0FfQ09OU09MRT15CisjIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfVElNRVI9eQorQ09ORklHX1NORF9QQ009eQorIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQorIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZNQVNURVI9eQorQ09ORklHX1NORF9BQzk3X0NPREVDPXkKK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1BDST15CisjIENPTkZJR19TTkRfQUQxODg5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTFMzMDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DQTAxMDYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1hZR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyODEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EQVJMQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9HSU5BMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0xBWUxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTU9OQSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUlBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FQ0hPM0cgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPSU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU5TMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE5NjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0ZNODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9ISUZJRVIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAorQ09ORklHX1NORF9JTlRFTDhYMD15CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9LT1JHMTIxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTUFFU1RSTzMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9SSVBUSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJUlRVT1NPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfUFBDPXkKK0NPTkZJR19TTkRfVVNCPXkKKyMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9VU1gyWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorQ09ORklHX0FDOTdfQlVTPXkKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CitDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD15CisjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9GU0wgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRF9QUENfT0Y9eQorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0JFPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GX0xFPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0RfUENJPXkKK0NPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0M9eQorQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fTU1JTz15CitDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CisjIENPTkZJR19VU0JfVUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0lFUlJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQ01PUz15CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9QUEMgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCitDT05GSUdfTlRGU19GUz15CisjIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworQ09ORklHX0FERlNfRlM9bQorIyBDT05GSUdfQURGU19GU19SVyBpcyBub3Qgc2V0CitDT05GSUdfQUZGU19GUz1tCitDT05GSUdfSEZTX0ZTPW0KK0NPTkZJR19IRlNQTFVTX0ZTPW0KK0NPTkZJR19CRUZTX0ZTPW0KKyMgQ09ORklHX0JFRlNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0JGU19GUz1tCitDT05GSUdfRUZTX0ZTPW0KK0NPTkZJR19DUkFNRlM9eQorQ09ORklHX1ZYRlNfRlM9bQorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSFBGU19GUz1tCitDT05GSUdfUU5YNEZTX0ZTPW0KKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWX0ZTPW0KK0NPTkZJR19VRlNfRlM9bQorIyBDT05GSUdfVUZTX0ZTX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkZTRD15CisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTUFDX1BBUlRJVElPTj15CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfQ1JDX0lUVV9UPW0KK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfSEFWRV9MTUI9eQorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0hBVkVfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfQ09ERV9QQVRDSElOR19TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJfRklYVVBfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfTVNJX0JJVE1BUF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRElfU1dJVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworQ09ORklHX0NSWVBUT19DQkM9eQorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVZfVEFMSVRPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfVklSVFVBTElaQVRJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHEyZmFkc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcTJmYWRzX2RlZmNvbmZpZwppbmRleCBiMzkwYjc0Li43ZTE3ODYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcTJmYWRzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcTJmYWRzX2RlZmNvbmZpZwpAQCAtMTUyLDExICsxNTIsMTEgQEAKICMKIENPTkZJR19QUENfTVVMVElQTEFURk9STT15CiBDT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15CisjIENPTkZJR19QUENfQ0hSUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKICMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiBDT05GSUdfUFBDXzgyeHg9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3Mvc2JjODY0MWRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3Mvc2JjODY0MWRfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ1NDIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3NiYzg2NDFkX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE0ODEgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNAotIyBUaHUgQXVnIDIxIDAwOjUyOjE1IDIwMDgKLSMKLSMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc3VwcG9ydAotIwotQ09ORklHXzZ4eD15Ci0jIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfOHh4IGlzIG5vdCBzZXQKLSMgQ09ORklHXzQweCBpcyBub3Qgc2V0Ci0jIENPTkZJR180NHggaXMgbm90IHNldAotIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0ZQVT15Ci1DT05GSUdfQUxUSVZFQz15Ci1DT05GSUdfUFBDX1NURF9NTVU9eQotQ09ORklHX1BQQ19TVERfTU1VXzMyPXkKLSMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAotQ09ORklHX1NNUD15Ci1DT05GSUdfTlJfQ1BVUz0yCi1DT05GSUdfUFBDMzI9eQotQ09ORklHX1dPUkRfU0laRT0zMgotQ09ORklHX1BQQ19NRVJHRT15Ci1DT05GSUdfTU1VPXkKLUNPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX0dFTkVSSUNfVElNRV9WU1lTQ0FMTD15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci0jIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSBpcyBub3Qgc2V0Ci1DT05GSUdfSVJRX1BFUl9DUFU9eQotQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15Ci1DT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQotQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0dFTkVSSUNfTE9DS0JSRUFLPXkKLUNPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQotQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci0jIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKLUNPTkZJR19QUEM9eQotQ09ORklHX0VBUkxZX1BSSU5USz15Ci1DT05GSUdfR0VORVJJQ19OVlJBTT15Ci1DT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15Ci1DT05GSUdfUFBDX09GPXkKLUNPTkZJR19PRj15Ci1DT05GSUdfUFBDX1VEQkdfMTY1NTA9eQotQ09ORklHX0dFTkVSSUNfVEJTWU5DPXkKLUNPTkZJR19BVURJVF9BUkNIPXkKLUNPTkZJR19HRU5FUklDX0JVRz15Ci1DT05GSUdfREVGQVVMVF9VSU1BR0U9eQotIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfTE9DS19LRVJORUw9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19TWVNWSVBDX1NZU0NUTD15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUtDT05GSUc9eQotQ09ORklHX0lLQ09ORklHX1BST0M9eQotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLSMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15Ci1DT05GSUdfUkVMQVk9eQotIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKLUNPTkZJR19DT01QQVRfQlJLPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19BTk9OX0lOT0RFUz15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NJR05BTEZEPXkKLUNPTkZJR19USU1FUkZEPXkKLUNPTkZJR19FVkVOVEZEPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQotQ09ORklHX1NMQUI9eQotIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX09QUk9GSUxFPXkKLSMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQotQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKLUNPTkZJR19IQVZFX0tQUk9CRVM9eQotQ09ORklHX0hBVkVfS1JFVFBST0JFUz15Ci1DT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15Ci0jIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQotIyBDT05GSUdfSEFWRV9DTEsgaXMgbm90IHNldAotQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKLSMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAotQ09ORklHX1NMQUJJTkZPPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotQ09ORklHX01PRFVMRVM9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotQ09ORklHX1NUT1BfTUFDSElORT15Ci1DT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci0jIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfQ0ZRPXkKLSMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotCi0jCi0jIFBsYXRmb3JtIHN1cHBvcnQKLSMKLUNPTkZJR19QUENfTVVMVElQTEFURk9STT15Ci1DT05GSUdfQ0xBU1NJQzMyPXkKLUNPTkZJR19QUENfQ0hSUD15Ci0jIENPTkZJR19NUEM1MTIxX0FEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUEM1MTIxX0dFTkVSSUMgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX01QQzUyeHggaXMgbm90IHNldAotQ09ORklHX1BQQ19QTUFDPXkKLSMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAotIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAotQ09ORklHX1BQQ184Nnh4PXkKLSMgQ09ORklHX01QQzg2NDFfSFBDTiBpcyBub3Qgc2V0Ci1DT05GSUdfU0JDODY0MUQ9eQotIyBDT05GSUdfTVBDODYxMF9IUENEIGlzIG5vdCBzZXQKLUNPTkZJR19NUEM4NjQxPXkKLUNPTkZJR19QUENfTkFUSVZFPXkKLSMgQ09ORklHX1VEQkdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQSUMgaXMgbm90IHNldAotQ09ORklHX01QSUM9eQotIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0k4MjU5PXkKLUNPTkZJR19QUENfUlRBUz15Ci0jIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcgaXMgbm90IHNldAotQ09ORklHX1JUQVNfUFJPQz15Ci0jIENPTkZJR19NTUlPX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfTVBDMTA2PXkKLSMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQzYwMV9TWU5DX0ZJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVUgaXMgbm90IHNldAotIyBDT05GSUdfRlNMX1VMSTE1NzUgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBvcHRpb25zCi0jCi0jIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19USUNLX09ORVNIT1Q9eQotIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotQ09ORklHX0haXzI1MD15Ci0jIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFo9MjUwCi1DT05GSUdfU0NIRURfSFJUSUNLPXkKLSMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVD15Ci0jIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9bQotIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15Ci1DT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQotQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQotIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotQ09ORklHX0lSUV9BTExfQ1BVUz15Ci1DT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQotQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAotQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX01JR1JBVElPTj15Ci0jIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0JPVU5DRT15Ci1DT05GSUdfVklSVF9UT19CVVM9eQotQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKLSMgQ09ORklHX1BST0NfREVWSUNFVFJFRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAotQ09ORklHX0VYVFJBX1RBUkdFVFM9IiIKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNDT01QPXkKLUNPTkZJR19JU0FfRE1BX0FQST15Ci0KLSMKLSMgQnVzIG9wdGlvbnMKLSMKLSMgQ09ORklHX0lTQSBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15Ci1DT05GSUdfUFBDX0lORElSRUNUX1BDST15Ci1DT05GSUdfRlNMX1NPQz15Ci1DT05GSUdfRlNMX1BDST15Ci1DT05GSUdfUFBDX1BDSV9DSE9JQ0U9eQotQ09ORklHX1BDST15Ci1DT05GSUdfUENJX0RPTUFJTlM9eQotQ09ORklHX1BDSV9TWVNDQUxMPXkKLUNPTkZJR19QQ0lFUE9SVEJVUz15Ci1DT05GSUdfUENJRUFFUj15Ci0jIENPTkZJR19QQ0lFQVNQTSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQotIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0Ci1DT05GSUdfUENJX0xFR0FDWT15Ci0jIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBU19SQVBJRElPIGlzIG5vdCBzZXQKLQotIwotIyBBZHZhbmNlZCBzZXR1cAotIwotIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCi0jCi1DT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAotQ09ORklHX1BBR0VfT0ZGU0VUPTB4YzAwMDAwMDAKLUNPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAotQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MDAwMDAwMDAKLUNPTkZJR19UQVNLX1NJWkU9MHhjMDAwMDAwMAotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QQUNLRVRfTU1BUD15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfWEZSTT15Ci1DT05GSUdfWEZSTV9VU0VSPW0KLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNX0lQQ09NUD1tCi1DT05GSUdfTkVUX0tFWT1tCi0jIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKLUNPTkZJR19BU0tfSVBfRklCX0hBU0g9eQotIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAotQ09ORklHX0lQX0ZJQl9IQVNIPXkKLUNPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci1DT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLUNPTkZJR19JUF9QTlBfUkFSUD15Ci1DT05GSUdfTkVUX0lQSVA9bQotQ09ORklHX05FVF9JUEdSRT1tCi1DT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15Ci1DT05GSUdfSVBfTVJPVVRFPXkKLUNPTkZJR19JUF9QSU1TTV9WMT15Ci1DT05GSUdfSVBfUElNU01fVjI9eQotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotQ09ORklHX0lORVRfQUg9bQotQ09ORklHX0lORVRfRVNQPW0KLUNPTkZJR19JTkVUX0lQQ09NUD1tCi1DT05GSUdfSU5FVF9YRlJNX1RVTk5FTD1tCi1DT05GSUdfSU5FVF9UVU5ORUw9bQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0NVQklDPXkKLUNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKLSMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAotQ09ORklHX0lQVjY9bQotIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVDZfQUg9bQotQ09ORklHX0lORVQ2X0VTUD1tCi1DT05GSUdfSU5FVDZfSVBDT01QPW0KLSMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVDZfWEZSTV9UVU5ORUw9bQotQ09ORklHX0lORVQ2X1RVTk5FTD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQotIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1NJVD1tCi1DT05GSUdfSVBWNl9ORElTQ19OT0RFVFlQRT15Ci1DT05GSUdfSVBWNl9UVU5ORUw9bQotIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQotQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQotCi0jCi0jIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0sgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPW0KLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1JBVEVFU1QgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1dORVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1MgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUIGlzIG5vdCBzZXQKLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUF9ORl9RVUVVRT1tCi1DT05GSUdfSVBfTkZfSVBUQUJMRVM9bQotQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KLSMgQ09ORklHX0lQX05GX01BVENIX0FIIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQotQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KLUNPTkZJR19JUF9ORl9GSUxURVI9bQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQotQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQotQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KLUNPTkZJR19JUF9ORl9NQU5HTEU9bQotQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQotIyBDT05GSUdfSVBfTkZfVEFSR0VUX1RUTCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfUkFXPW0KLSMgQ09ORklHX0lQX05GX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQotQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCi1DT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCi0KLSMKLSMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19JUDZfTkZfUVVFVUU9bQotQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCi1DT05GSUdfSVA2X05GX01BVENIX1JUPW0KLUNPTkZJR19JUDZfTkZfTUFUQ0hfT1BUUz1tCi1DT05GSUdfSVA2X05GX01BVENIX0ZSQUc9bQotQ09ORklHX0lQNl9ORl9NQVRDSF9ITD1tCi1DT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9bQotIyBDT05GSUdfSVA2X05GX01BVENIX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQNl9ORl9NQVRDSF9NSCBpcyBub3Qgc2V0Ci1DT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KLUNPTkZJR19JUDZfTkZfRklMVEVSPW0KLUNPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCi0jIENPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVCBpcyBub3Qgc2V0Ci1DT05GSUdfSVA2X05GX01BTkdMRT1tCi0jIENPTkZJR19JUDZfTkZfVEFSR0VUX0hMIGlzIG5vdCBzZXQKLUNPTkZJR19JUDZfTkZfUkFXPW0KLSMgQ09ORklHX0lQNl9ORl9TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQnJpZGdlOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotIyBDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1NDVFA9bQotIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0Ci1DT05GSUdfU0NUUF9ITUFDX01ENT15Ci1DT05GSUdfVElQQz1tCi0jIENPTkZJR19USVBDX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUENfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FUTT1tCi1DT05GSUdfQVRNX0NMSVA9bQotIyBDT05GSUdfQVRNX0NMSVBfTk9fSUNNUCBpcyBub3Qgc2V0Ci1DT05GSUdfQVRNX0xBTkU9bQotQ09ORklHX0FUTV9NUE9BPW0KLUNPTkZJR19BVE1fQlIyNjg0PW0KLSMgQ09ORklHX0FUTV9CUjI2ODRfSVBGSUxURVIgaXMgbm90IHNldAotQ09ORklHX1NUUD1tCi1DT05GSUdfQlJJREdFPW0KLUNPTkZJR19WTEFOXzgwMjFRPW0KLSMgQ09ORklHX1ZMQU5fODAyMVFfR1ZSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotQ09ORklHX0xMQz1tCi0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotQ09ORklHX1dBTl9ST1VURVI9bQotQ09ORklHX05FVF9TQ0hFRD15Ci0KLSMKLSMgUXVldWVpbmcvU2NoZWR1bGluZwotIwotQ09ORklHX05FVF9TQ0hfQ0JRPW0KLUNPTkZJR19ORVRfU0NIX0hUQj1tCi1DT05GSUdfTkVUX1NDSF9IRlNDPW0KLUNPTkZJR19ORVRfU0NIX0FUTT1tCi1DT05GSUdfTkVUX1NDSF9QUklPPW0KLUNPTkZJR19ORVRfU0NIX1JFRD1tCi1DT05GSUdfTkVUX1NDSF9TRlE9bQotQ09ORklHX05FVF9TQ0hfVEVRTD1tCi1DT05GSUdfTkVUX1NDSF9UQkY9bQotQ09ORklHX05FVF9TQ0hfR1JFRD1tCi1DT05GSUdfTkVUX1NDSF9EU01BUks9bQotQ09ORklHX05FVF9TQ0hfTkVURU09bQotCi0jCi0jIENsYXNzaWZpY2F0aW9uCi0jCi1DT05GSUdfTkVUX0NMUz15Ci0jIENPTkZJR19ORVRfQ0xTX0JBU0lDIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQotQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KLUNPTkZJR19ORVRfQ0xTX1JPVVRFPXkKLUNPTkZJR19ORVRfQ0xTX0ZXPW0KLUNPTkZJR19ORVRfQ0xTX1UzMj1tCi0jIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAotIyBDT05GSUdfQ0xTX1UzMl9NQVJLIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfQ0xTX1JTVlA9bQotQ09ORklHX05FVF9DTFNfUlNWUDY9bQotIyBDT05GSUdfTkVUX0NMU19GTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9FTUFUQ0ggaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19BQ1QgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAotQ09ORklHX05FVF9TQ0hfRklGTz15Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi1DT05GSUdfTkVUX1BLVEdFTj1tCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU4gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci1DT05GSUdfRklCX1JVTEVTPXkKLQotIwotIyBXaXJlbGVzcwotIwotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRktJTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLSMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PRl9QQVJUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9DSEFSPXkKLUNPTkZJR19NVERfQkxLREVWUz15Ci1DT05GSUdfTVREX0JMT0NLPXkKLSMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAotIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi1DT05GSUdfTVREX0NGST15Ci0jIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0dFTl9QUk9CRT15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci0jIENPTkZJR19NVERfQ0ZJX05PU1dBUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVA9eQotIyBDT05GSUdfTVREX0NGSV9HRU9NRVRSWSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0kxPXkKLUNPTkZJR19NVERfQ0ZJX0kyPXkKLSMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT1RQIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLSMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9VVElMPXkKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1BIWVNNQVBfT0Y9eQotIyBDT05GSUdfTVREX0lOVEVMX1ZSX05PUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfUE1DNTUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCi0jCi0jIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKLUNPTkZJR19PRl9ERVZJQ0U9eQotQ09ORklHX09GX0kyQz15Ci0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWPXkKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDX0ZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9bQotQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCi1DT05GSUdfQkxLX0RFVl9OQkQ9bQotIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0lERT15Ci0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19NRD15Ci1DT05GSUdfQkxLX0RFVl9NRD15Ci1DT05GSUdfTURfTElORUFSPXkKLUNPTkZJR19NRF9SQUlEMD15Ci1DT05GSUdfTURfUkFJRDE9eQotQ09ORklHX01EX1JBSUQxMD15Ci0jIENPTkZJR19NRF9SQUlENDU2IGlzIG5vdCBzZXQKLUNPTkZJR19NRF9NVUxUSVBBVEg9eQotQ09ORklHX01EX0ZBVUxUWT15Ci1DT05GSUdfQkxLX0RFVl9ETT15Ci0jIENPTkZJR19ETV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfRE1fQ1JZUFQ9eQotQ09ORklHX0RNX1NOQVBTSE9UPXkKLUNPTkZJR19ETV9NSVJST1I9eQotQ09ORklHX0RNX1pFUk89eQotIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNX1VFVkVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKLSMKLSMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfRFVNTVk9bQotQ09ORklHX0JPTkRJTkc9bQotIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotQ09ORklHX1RVTj1tCi0jIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEhZTElCPXkKLQotIwotIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKLUNPTkZJR19CUk9BRENPTV9QSFk9eQotIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci0jIENPTkZJR19NQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JNQUMgaXMgbm90IHNldAotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAotIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZfMTAwMD15Ci0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAotIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLWTIgaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLUNPTkZJR19HSUFORkFSPXkKLSMgQ09ORklHX01WNjQzWFhfRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTgotIwotIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU4gaXMgbm90IHNldAotQ09ORklHX0FUTV9EUklWRVJTPXkKLSMgQ09ORklHX0FUTV9EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fVENQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9MQU5BSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fRU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9GSVJFU1RSRUFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9aQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9OSUNTVEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9JRFQ3NzI1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fQU1CQVNTQURPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fSE9SSVpPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1fSUEgaXMgbm90IHNldAotIyBDT05GSUdfQVRNX0ZPUkUyMDBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTV9IRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9bQotQ09ORklHX1BQUF9NVUxUSUxJTks9eQotQ09ORklHX1BQUF9GSUxURVI9eQotQ09ORklHX1BQUF9BU1lOQz1tCi1DT05GSUdfUFBQX1NZTkNfVFRZPW0KLUNPTkZJR19QUFBfREVGTEFURT1tCi1DT05GSUdfUFBQX0JTRENPTVA9bQotIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAotQ09ORklHX1BQUE9FPW0KLUNPTkZJR19QUFBPQVRNPW0KLSMgQ09ORklHX1BQUE9MMlRQIGlzIG5vdCBzZXQKLUNPTkZJR19TTElQPW0KLUNPTkZJR19TTElQX0NPTVBSRVNTRUQ9eQotQ09ORklHX1NMSEM9bQotQ09ORklHX1NMSVBfU01BUlQ9eQotQ09ORklHX1NMSVBfTU9ERV9TTElQNj15Ci1DT05GSUdfTkVUQ09OU09MRT15Ci0jIENPTkZJR19ORVRDT05TT0xFX0RZTkFNSUMgaXMgbm90IHNldAotQ09ORklHX05FVFBPTEw9eQotQ09ORklHX05FVFBPTExfVFJBUD15Ci1DT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUj15Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWS01FTT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX1BDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotIyBDT05GSUdfQlJJUV9QQU5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVkNfUlRBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT1tCi0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUE9SVD15Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQk9BUkRJTkZPPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLQotIwotIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTWFjIFNNQnVzIGhvc3QgY29udHJvbGxlciBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfSFlEUkEgaXMgbm90IHNldAotQ09ORklHX0kyQ19QT1dFUk1BQz15Ci0KLSMKLSMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCi0jCi1DT05GSUdfSTJDX01QQz15Ci0jIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAotCi0jCi0jIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKLSMKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3MgYWRhcHRlciBJMkMvRERDIGNoYW5uZWwgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycwotIwotIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0Ci0jCi0jIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAotIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEkgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKLSMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAotIyBDT05GSUdfVzEgaXMgbm90IHNldAotIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FNUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19XQVRDSERPRz15Ci0jIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19TT0ZUX1dBVENIRE9HPW0KLSMgQ09ORklHX0FMSU03MTAxX1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR184eHh4X1dEVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQVRDSERPR19SVEFTIGlzIG5vdCBzZXQKLQotIwotIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKLQotIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi1DT05GSUdfREFCPXkKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19BR1AgaXMgbm90IHNldAotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi1DT05GSUdfVkdBX0NPTlNPTEU9eQotIyBDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDSyBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci1DT05GSUdfSElEX1NVUFBPUlQ9eQotQ09ORklHX0hJRD15Ci0jIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfU1VQUE9SVD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAotCi0jCi0jIEVuYWJsZSBIb3N0IG9yIEdhZGdldCBzdXBwb3J0IHRvIHNlZSBJbnZlbnRyYSBvcHRpb25zCi0jCi0KLSMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VEQUMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15Ci0jIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotQ09ORklHX1JFSVNFUkZTX0ZTPW0KLSMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0Ci1DT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQotQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15Ci0jIENPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0ZTX1BPU0lYX0FDTD15Ci0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotQ09ORklHX09DRlMyX0ZTPW0KLUNPTkZJR19PQ0ZTMl9GU19PMkNCPW0KLUNPTkZJR19PQ0ZTMl9GU19TVEFUUz15Ci1DT05GSUdfT0NGUzJfREVCVUdfTUFTS0xPRz15Ci0jIENPTkZJR19PQ0ZTMl9ERUJVR19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19BVVRPRlNfRlM9bQotQ09ORklHX0FVVE9GUzRfRlM9bQotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19DT05GSUdGU19GUz1tCi0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTUlOSVhfRlM9bQotIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfUk9NRlNfRlM9bQotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAotQ09ORklHX05GU19WND15Ci1DT05GSUdfUk9PVF9ORlM9eQotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX1NVTlJQQ19HU1M9eQotQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotQ09ORklHX1NNQl9OTFNfREVGQVVMVD15Ci1DT05GSUdfU01CX05MU19SRU1PVEU9ImNwNDM3IgotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0Ci1DT05GSUdfQ0lGU19YQVRUUj15Ci1DT05GSUdfQ0lGU19QT1NJWD15Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NQUNfUEFSVElUSU9OPXkKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotQ09ORklHX05MUz1tCi1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLUNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfNzM3PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfNzc1PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODUyPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODU1PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODU3PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODYwPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODYxPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODYyPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODYzPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODY0PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODY1PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODY2PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODY5PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfOTUwPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfOTMyPW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODc0PW0KLUNPTkZJR19OTFNfSVNPODg1OV84PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCi1DT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQotQ09ORklHX05MU19BU0NJST1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMj1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMz1tCi1DT05GSUdfTkxTX0lTTzg4NTlfND1tCi1DT05GSUdfTkxTX0lTTzg4NTlfNT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfNj1tCi1DT05GSUdfTkxTX0lTTzg4NTlfNz1tCi1DT05GSUdfTkxTX0lTTzg4NTlfOT1tCi1DT05GSUdfTkxTX0lTTzg4NTlfMTM9bQotQ09ORklHX05MU19JU084ODU5XzE0PW0KLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCi1DT05GSUdfTkxTX0tPSThfUj1tCi1DT05GSUdfTkxTX0tPSThfVT1tCi1DT05GSUdfTkxTX1VURjg9bQotIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci0jIENPTkZJR19HRU5FUklDX0ZJTkRfRklSU1RfQklUIGlzIG5vdCBzZXQKLUNPTkZJR19DUkNfQ0NJVFQ9bQotIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0NSQzcgaXMgbm90IHNldAotQ09ORklHX0xJQkNSQzMyQz1tCi1DT05GSUdfWkxJQl9JTkZMQVRFPW0KLUNPTkZJR19aTElCX0RFRkxBVEU9bQotQ09ORklHX1BMSVNUPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlQ9eQotQ09ORklHX0hBU19ETUE9eQotQ09ORklHX0hBVkVfTE1CPXkKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLUNPTkZJR19GUkFNRV9XQVJOPTEwMjQKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfRlM9eQotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAotQ09ORklHX1NDSEVEX0RFQlVHPXkKLSMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15Ci1DT05GSUdfSEFWRV9GVFJBQ0U9eQotQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQotIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9BUkNIX0tHREI9eQotIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RFX1BBVENISU5HX1NFTEZURVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZUUl9GSVhVUF9TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSUVNUQUNLUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSVJRX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAotIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotQ09ORklHX1NFQ1VSSVRZPXkKLUNPTkZJR19TRUNVUklUWV9ORVRXT1JLPXkKLSMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKLUNPTkZJR19DUllQVE89eQotCi0jCi0jIENyeXB0byBjb3JlIG9yIGhlbHBlcgotIwotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19BRUFEPW0KLUNPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKLUNPTkZJR19DUllQVE9fSEFTSD15Ci1DT05GSUdfQ1JZUFRPX01BTkFHRVI9eQotIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTlVMTD1tCi0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fQVVUSEVOQz1tCi1DT05GSUdfQ1JZUFRPX1RFU1Q9bQotCi0jCi0jIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQotIwotIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbW9kZXMKLSMKLUNPTkZJR19DUllQVE9fQ0JDPXkKLSMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0VDQj1tCi0jIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fUENCQz1tCi0jIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKLQotIwotIyBIYXNoIG1vZGVzCi0jCi1DT05GSUdfQ1JZUFRPX0hNQUM9eQotIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAotCi0jCi0jIERpZ2VzdAotIwotQ09ORklHX0NSWVBUT19DUkMzMkM9bQotQ09ORklHX0NSWVBUT19NRDQ9bQotQ09ORklHX0NSWVBUT19NRDU9eQotQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCi0jIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fU0hBMT1tCi1DT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCi1DT05GSUdfQ1JZUFRPX1NIQTUxMj1tCi0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fV1A1MTI9bQotCi0jCi0jIENpcGhlcnMKLSMKLUNPTkZJR19DUllQVE9fQUVTPW0KLUNPTkZJR19DUllQVE9fQU5VQklTPW0KLUNPTkZJR19DUllQVE9fQVJDND1tCi1DT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KLSMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0NBU1Q1PW0KLUNPTkZJR19DUllQVE9fQ0FTVDY9bQotQ09ORklHX0NSWVBUT19ERVM9eQotIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0tIQVpBRD1tCi0jIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1NFUlBFTlQ9bQotQ09ORklHX0NSWVBUT19URUE9bQotQ09ORklHX0NSWVBUT19UV09GSVNIPW0KLUNPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049bQotCi0jCi0jIENvbXByZXNzaW9uCi0jCi1DT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQotIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0hXPXkKLSMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVZfVEFMSVRPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfQ0xPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfVklSVFVBTElaQVRJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Eub3V0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYS5vdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljZWFkNi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QT1dFUlBDX0FfT1VUX0gKLSNkZWZpbmUgX0FTTV9QT1dFUlBDX0FfT1VUX0gKLQotc3RydWN0IGV4ZWMKLXsKLQl1bnNpZ25lZCBsb25nIGFfaW5mbzsJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLwotCXVuc2lnbmVkIGFfdGV4dDsJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0JdW5zaWduZWQgYV9kYXRhOwkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX3N5bXM7CS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYgLyogX0FTTV9QT1dFUlBDX0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKaW5kZXggZWY4YTI0OC4uMWU5NGIwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKQEAgLTYyLDYgKzYyLDcgQEAKIAlQUENfUE1DX0RFRkFVTFQgPSAwLAogCVBQQ19QTUNfSUJNID0gMSwKIAlQUENfUE1DX1BBNlQgPSAyLAorCVBQQ19QTUNfRzQgPSAzLAogfTsKIAogc3RydWN0IHB0X3JlZ3M7CkBAIC0xOTIsNiArMTkzLDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9OT19TTEJJRV9CCQlMT05HX0FTTV9DT05TVCgweDAwMDgwMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfVlNYCQkJTE9OR19BU01fQ09OU1QoMHgwMDEwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1NBTwkJCUxPTkdfQVNNX0NPTlNUKDB4MDAyMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9DUF9VU0VfRENCVFoJCUxPTkdfQVNNX0NPTlNUKDB4MDA0MDAwMDAwMDAwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtMzg3LDEwICszODksMTEgQEAKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCkKICNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI0CShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCi0JICAgIENQVV9GVFJfTU1DUkEpCisJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NQX1VTRV9EQ0JUWikKICNkZWZpbmUgQ1BVX0ZUUlNfUFBDOTcwCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCi0JICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9NTUNSQSkKKwkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX01NQ1JBIHwgXAorCSAgICBDUFVfRlRSX0NQX1VTRV9EQ0JUWikKICNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI1CShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKQEAgLTQxMSw3ICs0MTQsOCBAQAogI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAotCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBDUFVfRlRSX0NFTExfVEJfQlVHKQorCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBcCisJICAgIENQVV9GVFJfQ0VMTF9UQl9CVUcgfCBDUFVfRlRSX0NQX1VTRV9EQ0JUWikKICNkZWZpbmUgQ1BVX0ZUUlNfUEE2VCAoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kY3ItcmVncy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Rjci1yZWdzLmgKaW5kZXggMjliMGVjZS4uODI4ZTNhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Rjci1yZWdzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Rjci1yZWdzLmgKQEAgLTY4LDYgKzY4LDE3IEBACiAjZGVmaW5lIFNEUjBfVUFSVDMJCTB4MDEyMwogI2RlZmluZSBTRFIwX0NVU1QwCQkweDQwMDAKIAorLyogU0RSIGZvciA0MDVFWiAqLworI2RlZmluZSBEQ1JOX1NEUl9JQ0lOVFNUQVQJMHg0NTEwCisjZGVmaW5lIElDSU5UU1RBVF9JQ1JYCTB4ODAwMDAwMDAKKyNkZWZpbmUgSUNJTlRTVEFUX0lDVFgwCTB4NDAwMDAwMDAKKyNkZWZpbmUgSUNJTlRTVEFUX0lDVFgxIDB4MjAwMDAwMDAKKyNkZWZpbmUgSUNJTlRTVEFUX0lDVFgJMHg2MDAwMDAwMAorCisvKiBTRFJzICg0NjBFWC80NjBHVCkgKi8KKyNkZWZpbmUgU0RSMF9FVEhfQ0ZHCQkweDQxMDMKKyNkZWZpbmUgU0RSMF9FVEhfQ0ZHX0VDUwkweDAwMDAwMTAwCS8qIEVNQUMgaW50IGNsayBzb3VyY2UgKi8KKwogLyoKICAqIEFsbCB0aG9zZSBEQ1IgcmVnaXN0ZXIgYWRkcmVzc2VzIGFyZSBvZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcwogICogZm9yIHRoZSBTUkFNMCBjb250cm9sbGVyIChlLmcuIDB4MjAgb24gNDQwR1gpLiBUaGUgYmFzZSBhZGRyZXNzIGlzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKaW5kZXggMjI4YWIyYS4uZGZkNTA0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaApAQCAtMTYsOSArMTYsNiBAQAogCS8qIERNQSBvcGVyYXRpb25zIG9uIHRoYXQgZGV2aWNlICovCiAJc3RydWN0IGRtYV9tYXBwaW5nX29wcwkqZG1hX29wczsKIAl2b2lkCQkJKmRtYV9kYXRhOwotCi0JLyogTlVNQSBub2RlIGlmIGFwcGxpY2FibGUgKi8KLQlpbnQJCQludW1hX25vZGU7CiB9OwogCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCmluZGV4IGM3Y2E0NWYuLmZkZGIyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCkBAIC00NCw4ICs0NCw2IEBACiAKICNlbmRpZiAvKiAhIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUgKi8KIAotI2lmZGVmIENPTkZJR19QUEM2NAotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGV2aWNlX3RvX21hc2soc3RydWN0IGRldmljZSAqZGV2KQogewogCWlmIChkZXYtPmRtYV9tYXNrICYmICpkZXYtPmRtYV9tYXNrKQpAQCAtNzYsOCArNzQsMjQgQEAKIAkJCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycyk7CiAJaW50CQkoKmRtYV9zdXBwb3J0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOwogCWludAkJKCpzZXRfZG1hX21hc2spKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKTsKKwlkbWFfYWRkcl90IAkoKm1hcF9wYWdlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpOworCXZvaWQJCSgqdW5tYXBfcGFnZSkoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsIHNpemVfdCBzaXplLAorCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycyk7CiB9OwogCisvKgorICogQXZhaWxhYmxlIGdlbmVyaWMgc2V0cyBvZiBvcGVyYXRpb25zCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDNjQKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9pb21tdV9vcHM7CisjZW5kaWYKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9kaXJlY3Rfb3BzOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmdldF9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKiBXZSBkb24ndCBoYW5kbGUgdGhlIE5VTEwgZGV2IGNhc2UgZm9yIElTQSBmb3Igbm93LiBXZSBjb3VsZApAQCAtODUsOCArOTksMTkgQEAKIAkgKiBvbmx5IElTQSBETUEgZGV2aWNlIHdlIHN1cHBvcnQgaXMgdGhlIGZsb3BweSBhbmQgd2UgaGF2ZSBhIGhhY2sKIAkgKiBpbiB0aGUgZmxvcHB5IGRyaXZlciBkaXJlY3RseSB0byBnZXQgYSBkZXZpY2UgZm9yIHVzLgogCSAqLwotCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCB8fCBkZXYtPmFyY2hkYXRhLmRtYV9vcHMgPT0gTlVMTCkpCisKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpIHx8IGRldi0+YXJjaGRhdGEuZG1hX29wcyA9PSBOVUxMKSB7CisjaWZkZWYgQ09ORklHX1BQQzY0CiAJCXJldHVybiBOVUxMOworI2Vsc2UKKwkJLyogVXNlIGRlZmF1bHQgb24gMzItYml0IGlmIGRtYV9vcHMgaXMgbm90IHNldCB1cCAqLworCQkvKiBUT0RPOiBMb25nIHRlcm0sIHdlIHNob3VsZCBmaXggZHJpdmVycyBzbyB0aGF0IGRldiBhbmQKKwkJICogYXJjaGRhdGEgZG1hX29wcyBhcmUgc2V0IHVwIGZvciBhbGwgYnVzZXMuCisJCSAqLworCQlyZXR1cm4gJmRtYV9kaXJlY3Rfb3BzOworI2VuZGlmCisJfQorCiAJcmV0dXJuIGRldi0+YXJjaGRhdGEuZG1hX29wczsKIH0KIApAQCAtMTIzLDYgKzE0OCwxMiBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVE9ETzogbWFwXy91bm1hcF9zaW5nbGUgd2lsbCBpZGVhbGx5IGdvIGF3YXksIHRvIGJlIGNvbXBsZXRlbHkKKyAqIHJlcGxhY2VkIGJ5IG1hcC91bm1hcF9wYWdlLiAgIFVudGlsIHRoZW4sIHdlIGFsbG93IGRtYV9vcHMgdG8gaGF2ZQorICogb25lIG9yIHRoZSBvdGhlciwgb3IgYm90aCBieSBjaGVja2luZyB0byBzZWUgaWYgdGhlIHNwZWNpZmljCisgKiBmdW5jdGlvbiByZXF1ZXN0ZWQgZXhpc3RzOyBhbmQgaWYgbm90LCBmYWxsaW5nIGJhY2sgb24gdGhlIG90aGVyIHNldC4KKyAqLwogc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICAgdm9pZCAqY3B1X2FkZHIsCiAJCQkJCSAgICAgIHNpemVfdCBzaXplLApAQCAtMTMyLDcgKzE2MywxNCBAQAogCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwogCiAJQlVHX09OKCFkbWFfb3BzKTsKLQlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24sIGF0dHJzKTsKKworCWlmIChkbWFfb3BzLT5tYXBfc2luZ2xlKQorCQlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24sCisJCQkJCSAgIGF0dHJzKTsKKworCXJldHVybiBkbWFfb3BzLT5tYXBfcGFnZShkZXYsIHZpcnRfdG9fcGFnZShjcHVfYWRkciksCisJCQkJICh1bnNpZ25lZCBsb25nKWNwdV9hZGRyICUgUEFHRV9TSVpFLCBzaXplLAorCQkJCSBkaXJlY3Rpb24sIGF0dHJzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTQ0LDcgKzE4MiwxMyBAQAogCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwogCiAJQlVHX09OKCFkbWFfb3BzKTsKLQlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uLCBhdHRycyk7CisKKwlpZiAoZG1hX29wcy0+dW5tYXBfc2luZ2xlKSB7CisJCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24sIGF0dHJzKTsKKwkJcmV0dXJuOworCX0KKworCWRtYV9vcHMtPnVubWFwX3BhZ2UoZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uLCBhdHRycyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2VfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTU2LDggKzIwMCwxMyBAQAogCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwogCiAJQlVHX09OKCFkbWFfb3BzKTsKKworCWlmIChkbWFfb3BzLT5tYXBfcGFnZSkKKwkJcmV0dXJuIGRtYV9vcHMtPm1hcF9wYWdlKGRldiwgcGFnZSwgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24sCisJCQkJCSBhdHRycyk7CisKIAlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgc2l6ZSwKLQkJCWRpcmVjdGlvbiwgYXR0cnMpOworCQkJCSAgIGRpcmVjdGlvbiwgYXR0cnMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3BhZ2VfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTY5LDYgKzIxOCwxMiBAQAogCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwogCiAJQlVHX09OKCFkbWFfb3BzKTsKKworCWlmIChkbWFfb3BzLT51bm1hcF9wYWdlKSB7CisJCWRtYV9vcHMtPnVubWFwX3BhZ2UoZGV2LCBkbWFfYWRkcmVzcywgc2l6ZSwgZGlyZWN0aW9uLCBhdHRycyk7CisJCXJldHVybjsKKwl9CisKIAlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkcmVzcywgc2l6ZSwgZGlyZWN0aW9uLCBhdHRycyk7CiB9CiAKQEAgLTI1MywxMjYgKzMwOCw2IEBACiAJZG1hX3VubWFwX3NnX2F0dHJzKGRldiwgc2csIG5od2VudHJpZXMsIGRpcmVjdGlvbiwgTlVMTCk7CiB9CiAKLS8qCi0gKiBBdmFpbGFibGUgZ2VuZXJpYyBzZXRzIG9mIG9wZXJhdGlvbnMKLSAqLwotZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgZG1hX2lvbW11X29wczsKLWV4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9kaXJlY3Rfb3BzOwotCi0jZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KLQotI2RlZmluZSBkbWFfc3VwcG9ydGVkKGRldiwgbWFzaykJKDEpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBkbWFfbWFzaykKLXsKLQlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkqZGV2LT5kbWFfbWFzayA9IGRtYV9tYXNrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgIGRtYV9hZGRyX3QgKiBkbWFfaGFuZGxlLAotCQkJCSAgICAgICBnZnBfdCBnZnApCi17Ci0jaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQotCXJldHVybiBfX2RtYV9hbGxvY19jb2hlcmVudChzaXplLCBkbWFfaGFuZGxlLCBnZnApOwotI2Vsc2UKLQl2b2lkICpyZXQ7Ci0JLyogaWdub3JlIHJlZ2lvbiBzcGVjaWZpZXJzICovCi0JZ2ZwICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSk7Ci0KLQlpZiAoZGV2ID09IE5VTEwgfHwgZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8IDB4ZmZmZmZmZmYpCi0JCWdmcCB8PSBHRlBfRE1BOwotCi0JcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKLQotCWlmIChyZXQgIT0gTlVMTCkgewotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyhyZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKLQkJICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0jaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQotCV9fZG1hX2ZyZWVfY29oZXJlbnQoc2l6ZSwgdmFkZHIpOwotI2Vsc2UKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAotZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAotCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7Ci0KLQlfX2RtYV9zeW5jKHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKLQotCXJldHVybiB2aXJ0X3RvX2J1cyhwdHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCQkJICAgIHNpemVfdCBzaXplLAotCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JLyogV2UgZG8gbm90aGluZy4gKi8KLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90Ci1kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKLQotCV9fZG1hX3N5bmNfcGFnZShwYWdlLCBvZmZzZXQsIHNpemUsIGRpcmVjdGlvbik7Ci0KLQlyZXR1cm4gcGFnZV90b19idXMocGFnZSkgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCi0JCQkJICBzaXplX3Qgc2l6ZSwKLQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQkvKiBXZSBkbyBub3RoaW5nLiAqLwotfQotCi1zdGF0aWMgaW5saW5lIGludAotZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsCi0JICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JaW50IGk7Ci0KLQlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKLQotCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKSB7Ci0JCUJVR19PTighc2dfcGFnZShzZykpOwotCQlfX2RtYV9zeW5jX3BhZ2Uoc2dfcGFnZShzZyksIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsIGRpcmVjdGlvbik7Ci0JCXNnLT5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fYnVzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQ7Ci0JfQotCi0JcmV0dXJuIG5lbnRzOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQlpbnQgbmh3ZW50cmllcywKLQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4gKi8KLX0KLQotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAogCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggODBkMWYzOS4uZDgxMjkyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMjMyLDcgKzIzMiw3IEBACiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwotIyBkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikJCQkJXAorIyBkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KQkJCQkJXAogZG8gewkJCQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgbmV3X2ZsYWdzID0gMDsJCQkJXAogCWlmICgoZXgpLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpCQlcCkBAIC0yNTYsNyArMjU2LDcgQEAKICMgZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgZXhlY19zdGspICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgPyBcCiAJCShleGVjX3N0ayAhPSBFWFNUQUNLX0RJU0FCTEVfWCkgOiAwKQogI2Vsc2UgCi0jIGRlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCisjIGRlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiBleHRlcm4gaW50IGRjYWNoZV9ic2l6ZTsKQEAgLTQwOSw2ICs0MDksMTMgQEAKIC8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCiAjZGVmaW5lIFJfUFBDNjRfTlVNCQkxMDcKIAorLyogVGhlcmUncyBhY3R1YWxseSBhIHRoaXJkIGVudHJ5IGhlcmUsIGJ1dCBpdCdzIHVudXNlZCAqLworc3RydWN0IHBwYzY0X29wZF9lbnRyeQoreworCXVuc2lnbmVkIGxvbmcgZnVuY2FkZHI7CisJdW5zaWduZWQgbG9uZyByMjsKK307CisKICNpZmRlZiAgX19LRVJORUxfXwogCiAjaWZkZWYgQ09ORklHX1NQVV9CQVNFCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLmgKaW5kZXggMzI5MTQ4Yi4uZDNkNDUzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24uaApAQCAtNTMsMTQgKzUzLDggQEAKICAqIGxvdyBoYWxmd29yZCBvZiB0aGUgYWRkcmVzcywgYnV0IGZvciBLZHVtcCB3ZSBuZWVkIHRoZSB3aG9sZSBsb3cKICAqIHdvcmQuCiAgKi8KLSNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAogI2RlZmluZSBMT0FEX0hBTkRMRVIocmVnLCBsYWJlbCkJCQkJCVwKLQlvcmlzCXJlZyxyZWcsKGxhYmVsKUBoOwkvKiB2aXJ0IGFkZHIgb2YgaGFuZGxlciAuLi4gKi8JXAotCW9yaQlyZWcscmVnLChsYWJlbClAbDsJLyogLi4gYW5kIHRoZSByZXN0ICovCi0jZWxzZQotI2RlZmluZSBMT0FEX0hBTkRMRVIocmVnLCBsYWJlbCkJCQkJCVwKLQlvcmkJcmVnLHJlZywobGFiZWwpQGw7CS8qIHZpcnQgYWRkciBvZiBoYW5kbGVyIC4uLiAqLwotI2VuZGlmCisJYWRkaQlyZWcscmVnLChsYWJlbCktX3N0ZXh0OwkvKiB2aXJ0IGFkZHIgb2YgaGFuZGxlciAuLi4gKi8KIAogI2RlZmluZSBFWENFUFRJT05fUFJPTE9HXzEoYXJlYSkJCQkJXAogCW1mc3ByCXIxMyxTUFJOX1NQUkczOwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwlcCkBAIC03MiwzNyArNjYsMTIgQEAKIAlzdGQJcjksYXJlYStFWF9SMTMocjEzKTsJCQkJCVwKIAltZmNyCXI5CiAKLS8qCi0gKiBFcXVhbCB0byBFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMsIGV4Y2VwdCB0aGF0IGl0IGZvcmNlcyA2NGJpdCBtb2RlLgotICogVGhlIGZpcm13YXJlIGNhbGxzIHRoZSByZWdpc3RlcmVkIHN5c3RlbV9yZXNldF9md25taSBhbmQKLSAqIG1hY2hpbmVfY2hlY2tfZndubWkgaGFuZGxlcnMgaW4gMzJiaXQgbW9kZSBpZiB0aGUgY3B1IGhhcHBlbnMgdG8gcnVuCi0gKiBhIDMyYml0IGFwcGxpY2F0aW9uIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudC4KLSAqIFRoaXMgZmlybXdhcmUgYnVnIGlzIHByZXNlbnQgb24gUE9XRVI0IGFuZCBKUzIwLgotICovCi0jZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU19GT1JDRV82NEJJVChhcmVhLCBsYWJlbCkJCVwKLQlFWENFUFRJT05fUFJPTE9HXzEoYXJlYSk7CQkJCQlcCi0JY2xycmRpCXIxMixyMTMsMzI7CQkvKiBnZXQgaGlnaCBwYXJ0IG9mICZsYWJlbCAqLwlcCi0JbWZtc3IJcjEwOwkJCQkJCQlcCi0JLyogZm9yY2UgNjRiaXQgbW9kZSAqLwkJCQkJCVwKLQlsaQlyMTEsNTsJCQkvKiBNU1JfU0ZfTEd8TVNSX0lTRl9MRyAqLwlcCi0JcmxkaW1pCXIxMCxyMTEsNjEsMDsJCS8qIGluc2VydCBpbnRvIHRvcCAzIGJpdHMgKi8JXAotCS8qIGRvbmUgNjRiaXQgbW9kZSAqLwkJCQkJCVwKLQltZnNwcglyMTEsU1BSTl9TUlIwOwkJLyogc2F2ZSBTUlIwICovCQkJXAotCUxPQURfSEFORExFUihyMTIsbGFiZWwpCQkJCQkJXAotCW9yaQlyMTAscjEwLE1TUl9JUnxNU1JfRFJ8TVNSX1JJOwkJCQlcCi0JbXRzcHIJU1BSTl9TUlIwLHIxMjsJCQkJCQlcCi0JbWZzcHIJcjEyLFNQUk5fU1JSMTsJCS8qIGFuZCBTUlIxICovCQkJXAotCW10c3ByCVNQUk5fU1JSMSxyMTA7CQkJCQkJXAotCXJmaWQ7CQkJCQkJCQlcCi0JYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCi0KICNkZWZpbmUgRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKGFyZWEsIGxhYmVsKQkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR18xKGFyZWEpOwkJCQkJXAotCWNscnJkaQlyMTIscjEzLDMyOwkJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAotCW1mbXNyCXIxMDsJCQkJCQkJXAorCWxkCXIxMixQQUNBS0JBU0UocjEzKTsJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAorCWxkCXIxMCxQQUNBS01TUihyMTMpOwkvKiBnZXQgTVNSIHZhbHVlIGZvciBrZXJuZWwgKi8JXAogCW1mc3ByCXIxMSxTUFJOX1NSUjA7CQkvKiBzYXZlIFNSUjAgKi8JCQlcCiAJTE9BRF9IQU5ETEVSKHIxMixsYWJlbCkJCQkJCQlcCi0Jb3JpCXIxMCxyMTAsTVNSX0lSfE1TUl9EUnxNU1JfUkk7CQkJCVwKIAltdHNwcglTUFJOX1NSUjAscjEyOwkJCQkJCVwKIAltZnNwcglyMTIsU1BSTl9TUlIxOwkJLyogYW5kIFNSUjEgKi8JCQlcCiAJbXRzcHIJU1BSTl9TUlIxLHIxMDsJCQkJCQlcCkBAIC0yMTAsMTEgKzE3OSwxMCBAQAogCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9SMTMocjEzKTsJCQkJXAogCXN0ZAlyMTEsUEFDQV9FWEdFTitFWF9SMTEocjEzKTsJCQkJXAogCXN0ZAlyMTIsUEFDQV9FWEdFTitFWF9SMTIocjEzKTsJCQkJXAotCWNscnJkaQlyMTIscjEzLDMyOwkJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAotCW1mbXNyCXIxMDsJCQkJCQkJXAorCWxkCXIxMixQQUNBS0JBU0UocjEzKTsJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAorCWxkCXIxMCxQQUNBS01TUihyMTMpOwkvKiBnZXQgTVNSIHZhbHVlIGZvciBrZXJuZWwgKi8JXAogCW1mc3ByCXIxMSxTUFJOX1NSUjA7CQkvKiBzYXZlIFNSUjAgKi8JCQlcCiAJTE9BRF9IQU5ETEVSKHIxMixsYWJlbCMjX2NvbW1vbikJCQkJXAotCW9yaQlyMTAscjEwLE1TUl9JUnxNU1JfRFJ8TVNSX1JJOwkJCQlcCiAJbXRzcHIJU1BSTl9TUlIwLHIxMjsJCQkJCQlcCiAJbWZzcHIJcjEyLFNQUk5fU1JSMTsJCS8qIGFuZCBTUlIxICovCQkJXAogCW10c3ByCVNQUk5fU1JSMSxyMTA7CQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9sYmMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mc2xfbGJjLmgKaW5kZXggMzAzZjU0OC4uNjNhNGY3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9sYmMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2xiYy5oCkBAIC0yMyw5ICsyMyw5IEBACiAjaWZuZGVmIF9fQVNNX0ZTTF9MQkNfSAogI2RlZmluZSBfX0FTTV9GU0xfTEJDX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0cnVjdCBmc2xfbGJjX2JhbmsgewogCV9fYmUzMiBicjsgICAgICAgICAgICAgLyoqPCBCYXNlIFJlZ2lzdGVyICAqLwpAQCAtMjI3LDkgKzIyNyw2IEBACiAJdTggcmVzOFsweEYwMF07CiB9OwogCi1leHRlcm4gc3RydWN0IGZzbF9sYmNfcmVncyBfX2lvbWVtICpmc2xfbGJjX3JlZ3M7Ci1leHRlcm4gc3BpbmxvY2tfdCBmc2xfbGJjX2xvY2s7Ci0KIC8qCiAgKiBGU0wgVVBNIHJvdXRpbmVzCiAgKi8KQEAgLTI2OCw0NCArMjY1LDcgQEAKIAkJY3B1X3JlbGF4KCk7CiB9CiAKLS8qKgotICogZnNsX3VwbV9ydW5fcGF0dGVybiAtIGFjdHVhbGx5IHJ1biBhbiBVUE0gcGF0dGVybgotICogQHVwbToJcG9pbnRlciB0byB0aGUgZnNsX3VwbSBzdHJ1Y3R1cmUgb2J0YWluZWQgdmlhIGZzbF91cG1fZmluZAotICogQGlvX2Jhc2U6CXJlbWFwcGVkIHBvaW50ZXIgdG8gd2hlcmUgbWVtb3J5IGFjY2VzcyBzaG91bGQgaGFwcGVuCi0gKiBAbWFyOglNQVIgcmVnaXN0ZXIgY29udGVudCBkdXJpbmcgcGF0dGVybiBleGVjdXRpb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGR1bW15IHdyaXRlIHRvIHRoZSBtZW1vcnkgc3BlY2lmaWVkIGJ5IHRoZSBpb19iYXNlLAotICogdGh1cyBVUE0gcGF0dGVybiBhY3R1YWxseSBleGVjdXRlZC4gTm90ZSB0aGF0IG1hciB1c2FnZSBkZXBlbmRzIG9uIHRoZQotICogcHJlLXByb2dyYW1tZWQgQU1YIGJpdHMgaW4gdGhlIFVQTSBSQU0uCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZzbF91cG1fcnVuX3BhdHRlcm4oc3RydWN0IGZzbF91cG0gKnVwbSwKLQkJCQkgICAgICB2b2lkIF9faW9tZW0gKmlvX2Jhc2UsIHUzMiBtYXIpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfbGJjX2xvY2ssIGZsYWdzKTsKLQotCW91dF9iZTMyKCZmc2xfbGJjX3JlZ3MtPm1hciwgbWFyIDw8ICgzMiAtIHVwbS0+d2lkdGgpKTsKLQotCXN3aXRjaCAodXBtLT53aWR0aCkgewotCWNhc2UgODoKLQkJb3V0XzgoaW9fYmFzZSwgMHgwKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJb3V0X2JlMTYoaW9fYmFzZSwgMHgwKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJb3V0X2JlMzIoaW9fYmFzZSwgMHgwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX2xiY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQorZXh0ZXJuIGludCBmc2xfdXBtX3J1bl9wYXR0ZXJuKHN0cnVjdCBmc2xfdXBtICp1cG0sIHZvaWQgX19pb21lbSAqaW9fYmFzZSwKKwkJCSAgICAgICB1MzIgbWFyKTsKIAogI2VuZGlmIC8qIF9fQVNNX0ZTTF9MQkNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2hpZ2htZW0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9oaWdobWVtLmgKaW5kZXggNWQ5OWI2NDguLjkxYzU4OTUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaGlnaG1lbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9oaWdobWVtLmgKQEAgLTg0LDcgKzg0LDcgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQogCUJVR19PTighcHRlX25vbmUoKihrbWFwX3B0ZS1pZHgpKSk7CiAjZW5kaWYKLQlzZXRfcHRlX2F0KCZpbml0X21tLCB2YWRkciwga21hcF9wdGUtaWR4LCBta19wdGUocGFnZSwgcHJvdCkpOworCV9fc2V0X3B0ZV9hdCgmaW5pdF9tbSwgdmFkZHIsIGttYXBfcHRlLWlkeCwgbWtfcHRlKHBhZ2UsIHByb3QpKTsKIAlmbHVzaF90bGJfcGFnZShOVUxMLCB2YWRkcik7CiAKIAlyZXR1cm4gKHZvaWQqKSB2YWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggNzdjN2ZhMC4uMDgyNjZkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTcxMSw3ICs3MTEsNyBAQAogLyoKICAqIENoYW5nZSAic3RydWN0IHBhZ2UiIHRvIHBoeXNpY2FsIGFkZHJlc3MuCiAgKi8KLSNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCShwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKChwaHlzX2FkZHJfdClwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKQogCiAvKiBXZSBkbyBOT1Qgd2FudCB2aXJ0dWFsIG1lcmdpbmcsIGl0IHdvdWxkIHB1dCB0b28gbXVjaCBwcmVzc3VyZSBvbgogICogb3VyIGlvbW11IGFsbG9jYXRvci4gSW5zdGVhZCwgd2Ugd2FudCBkcml2ZXJzIHRvIGJlIHNtYXJ0IGVub3VnaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IGEzNzJmNzYuLjBhNTEzNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTIzNiwxNSArMjM2LDI3IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGlycV9jcmVhdGVfZGlyZWN0X21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0KTsKIAogLyoqCi0gKiBpcnFfcmFkaXhfcmV2bWFwIC0gRmluZCBhIGxpbnV4IHZpcnEgZnJvbSBhIGh3IGlycSBudW1iZXIuCisgKiBpcnFfcmFkaXhfcmV2bWFwX2luc2VydCAtIEluc2VydCBhIGh3IGlycSB0byBsaW51eCB2aXJxIG51bWJlciBtYXBwaW5nLgorICogQGhvc3Q6IGhvc3Qgb3duaW5nIHRoaXMgaGFyZHdhcmUgaW50ZXJydXB0CisgKiBAdmlycTogbGludXggaXJxIG51bWJlcgorICogQGh3aXJxOiBoYXJkd2FyZSBpcnEgbnVtYmVyIGluIHRoYXQgaG9zdCBzcGFjZQorICoKKyAqIFRoaXMgaXMgZm9yIHVzZSBieSBpcnEgY29udHJvbGxlcnMgdGhhdCB1c2UgYSByYWRpeCB0cmVlIHJldmVyc2UKKyAqIG1hcHBpbmcgZm9yIGZhc3QgbG9va3VwLgorICovCitleHRlcm4gdm9pZCBpcnFfcmFkaXhfcmV2bWFwX2luc2VydChzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpOworCisvKioKKyAqIGlycV9yYWRpeF9yZXZtYXBfbG9va3VwIC0gRmluZCBhIGxpbnV4IHZpcnEgZnJvbSBhIGh3IGlycSBudW1iZXIuCiAgKiBAaG9zdDogaG9zdCBvd25pbmcgdGhpcyBoYXJkd2FyZSBpbnRlcnJ1cHQKICAqIEBod2lycTogaGFyZHdhcmUgaXJxIG51bWJlciBpbiB0aGF0IGhvc3Qgc3BhY2UKICAqCiAgKiBUaGlzIGlzIGEgZmFzdCBwYXRoLCBmb3IgdXNlIGJ5IGlycSBjb250cm9sbGVyIGNvZGUgdGhhdCB1c2VzIHJhZGl4IHRyZWUKICAqIHJldm1hcHMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfcmFkaXhfcmV2bWFwKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKLQkJCQkgICAgIGlycV9od19udW1iZXJfdCBod2lycSk7CitleHRlcm4gdW5zaWduZWQgaW50IGlycV9yYWRpeF9yZXZtYXBfbG9va3VwKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKKwkJCQkJICAgIGlycV9od19udW1iZXJfdCBod2lycSk7CiAKIC8qKgogICogaXJxX2xpbmVhcl9yZXZtYXAgLSBGaW5kIGEgbGludXggdmlycSBmcm9tIGEgaHcgaXJxIG51bWJlci4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggMjY1NWUyYS4uMzRiNTJiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTgxLDExICs4MSwxNyBAQAogCXN0cnVjdCB0bGJlIHNoYWRvd190bGJbUFBDNDR4X1RMQl9TSVpFXTsKIAkvKiBQYWdlcyB3aGljaCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgc2hhZG93IFRMQi4gKi8KIAlzdHJ1Y3QgcGFnZSAqc2hhZG93X3BhZ2VzW1BQQzQ0eF9UTEJfU0laRV07Ci0JLyogQ29weSBvZiB0aGUgaG9zdCdzIFRMQi4gKi8KLQlzdHJ1Y3QgdGxiZSBob3N0X3RsYltQUEM0NHhfVExCX1NJWkVdOworCisJLyogVHJhY2sgd2hpY2ggVExCIGVudHJpZXMgd2UndmUgbW9kaWZpZWQgaW4gdGhlIGN1cnJlbnQgZXhpdC4gKi8KKwl1OCBzaGFkb3dfdGxiX21vZFtQUEM0NHhfVExCX1NJWkVdOwogCiAJdTMyIGhvc3Rfc3RhY2s7CiAJdTMyIGhvc3RfcGlkOworCXUzMiBob3N0X2RiY3IwOworCXUzMiBob3N0X2RiY3IxOworCXUzMiBob3N0X2RiY3IyOworCXUzMiBob3N0X2lhY1s0XTsKKwl1MzIgaG9zdF9tc3I7CiAKIAl1NjQgZnByWzMyXTsKIAl1MzIgZ3ByWzMyXTsKQEAgLTEyMyw3ICsxMjksMTEgQEAKIAl1MzIgaXZvclsxNl07CiAJdTMyIGl2cHI7CiAJdTMyIHBpcjsKKworCXUzMiBzaGFkb3dfcGlkOwogCXUzMiBwaWQ7CisJdTMyIHN3YXBfcGlkOworCiAJdTMyIHB2cjsKIAl1MzIgY2NyMDsKIAl1MzIgY2NyMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCmluZGV4IGE4YjA2ODcuLjg5MzFiYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaApAQCAtNjQsNiArNjQsMTAgQEAKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfaW52YWxpZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGVhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2YV90IGVlbmQsIHUzMiBhc2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19tbXVfcHJpdl9zd2l0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgdXNlcm1vZGUpOworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9zd2l0Y2hfcGlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHBpZCk7CisKKy8qIFhYWCBCb29rIEUgc3BlY2lmaWMgKi8KK2V4dGVybiB2b2lkIGt2bXBwY190bGJlX3NldF9tb2RpZmllZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBpKTsKIAogZXh0ZXJuIHZvaWQga3ZtcHBjX2NoZWNrX2FuZF9kZWxpdmVyX2ludGVycnVwdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIApAQCAtOTIsNCArOTYsMTIgQEAKIAkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfc2V0X3BpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBuZXdfcGlkKQoreworCWlmICh2Y3B1LT5hcmNoLnBpZCAhPSBuZXdfcGlkKSB7CisJCXZjcHUtPmFyY2gucGlkID0gbmV3X3BpZDsKKwkJdmNwdS0+YXJjaC5zd2FwX3BpZCA9IDE7CisJfQorfQorCiAjZW5kaWYgLyogX19QT1dFUlBDX0tWTV9QUENfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaAppbmRleCA4OTNhYWZkLi4yNzQwYzQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKQEAgLTg4LDggKzg4LDYgQEAKIAl1bnNpZ25lZCBsb25nCSgqdGNlX2dldCkoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCiAJCQkJICAgIGxvbmcgaW5kZXgpOwogCXZvaWQJCSgqdGNlX2ZsdXNoKShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCk7Ci0Jdm9pZAkJKCpwY2lfZG1hX2Rldl9zZXR1cCkoc3RydWN0IHBjaV9kZXYgKmRldik7Ci0Jdm9pZAkJKCpwY2lfZG1hX2J1c19zZXR1cCkoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIAl2b2lkIF9faW9tZW0gKgkoKmlvcmVtYXApKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKQEAgLTEwMSw2ICs5OSw5IEBACiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAorCXZvaWQJCSgqcGNpX2RtYV9kZXZfc2V0dXApKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCXZvaWQJCSgqcGNpX2RtYV9idXNfc2V0dXApKHN0cnVjdCBwY2lfYnVzICpidXMpOworCiAJaW50CQkoKnByb2JlKSh2b2lkKTsKIAl2b2lkCQkoKnNldHVwX2FyY2gpKHZvaWQpOyAvKiBPcHRpb25hbCwgbWF5IGJlIE5VTEwgKi8KIAl2b2lkCQkoKmluaXRfZWFybHkpKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbWFuLmgKaW5kZXggOTIwOWY3NS4uZTdiOTliYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tYW4uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW1hbi5oCkBAIC00NCw3ICs0NCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgYXJjaF92bV9nZXRfcGFnZV9wcm90KHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MpCiB7Ci0JcmV0dXJuICh2bV9mbGFncyAmIFZNX1NBTykgPyBfX3BncHJvdChfUEFHRV9TQU8pIDogMDsKKwlyZXR1cm4gKHZtX2ZsYWdzICYgVk1fU0FPKSA/IF9fcGdwcm90KF9QQUdFX1NBTykgOiBfX3BncHJvdCgwKTsKIH0KICNkZWZpbmUgYXJjaF92bV9nZXRfcGFnZV9wcm90KHZtX2ZsYWdzKSBhcmNoX3ZtX2dldF9wYWdlX3Byb3Qodm1fZmxhZ3MpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCmluZGV4IGMyZGY1M2MuLjVhNDQxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaApAQCAtNDM3LDcgKzQzNyw3IEBACiAJfSkKICNlbmRpZiAvKiAxICovCiAKLS8qIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgYWRkcmVzc2VzID49IEtFUk5FTEJBU0UgKi8KKy8qIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgYWRkcmVzc2VzID49IFBBR0VfT0ZGU0VUICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2tlcm5lbF92c2lkKHVuc2lnbmVkIGxvbmcgZWEsIGludCBzc2l6ZSkKIHsKIAlpZiAoc3NpemUgPT0gTU1VX1NFR1NJWkVfMjU2TSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oCmluZGV4IGZlNTY2YTMuLjM0ZDlhYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxhc20vZGNyLmg+CisjaW5jbHVkZSA8YXNtL21zaV9iaXRtYXAuaD4KIAogLyoKICAqIEdsb2JhbCByZWdpc3RlcnMKQEAgLTMwMSw4ICszMDIsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJX01TSQotCXNwaW5sb2NrX3QJCWJpdG1hcF9sb2NrOwotCXVuc2lnbmVkIGxvbmcJCSpod2lycV9iaXRtYXA7CisJc3RydWN0IG1zaV9iaXRtYXAJbXNpX2JpdG1hcDsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01QSUNfQlJPS0VOX1JFR1JFQUQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tc2lfYml0bWFwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXNpX2JpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YWMzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXNpX2JpdG1hcC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX1BPV0VSUENfU1lTREVWX01TSV9CSVRNQVBfSAorI2RlZmluZSBfUE9XRVJQQ19TWVNERVZfTVNJX0JJVE1BUF9ICisKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdHJ1Y3QgbXNpX2JpdG1hcCB7CisJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOworCXVuc2lnbmVkIGxvbmcJCSpiaXRtYXA7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBpbnQJCWlycV9jb3VudDsKK307CisKK2ludCBtc2lfYml0bWFwX2FsbG9jX2h3aXJxcyhzdHJ1Y3QgbXNpX2JpdG1hcCAqYm1wLCBpbnQgbnVtKTsKK3ZvaWQgbXNpX2JpdG1hcF9mcmVlX2h3aXJxcyhzdHJ1Y3QgbXNpX2JpdG1hcCAqYm1wLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIHVuc2lnbmVkIGludCBudW0pOwordm9pZCBtc2lfYml0bWFwX3Jlc2VydmVfaHdpcnEoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCwgdW5zaWduZWQgaW50IGh3aXJxKTsKKworaW50IG1zaV9iaXRtYXBfcmVzZXJ2ZV9kdF9od2lycXMoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCk7CisKK2ludCBtc2lfYml0bWFwX2FsbG9jKHN0cnVjdCBtc2lfYml0bWFwICpibXAsIHVuc2lnbmVkIGludCBpcnFfY291bnQsCisJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKTsKK3ZvaWQgbXNpX2JpdG1hcF9mcmVlKHN0cnVjdCBtc2lfYml0bWFwICpibXApOworCisjZW5kaWYgLyogX1BPV0VSUENfU1lTREVWX01TSV9CSVRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oCmluZGV4IDNjMTIzOTkuLmE2NGRlYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9kZXZpY2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb2ZfZGV2aWNlLmgKQEAgLTI0LDggKzI0LDUgQEAKIGV4dGVybiBpbnQgb2ZfZGV2aWNlX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KTsKIAotLyogVGhpcyBpcyBqdXN0IGhlcmUgZHVyaW5nIHRoZSB0cmFuc2l0aW9uICovCi0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX09GX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb2ZfcGxhdGZvcm0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oCmluZGV4IDE4NjU5ZWYuLjUzYjQ2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oCkBAIC0xMSw5ICsxMSw2IEBACiAgKgogICovCiAKLS8qIFRoaXMgaXMganVzdCBoZXJlIGR1cmluZyB0aGUgdHJhbnNpdGlvbiAqLwotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0KIC8qIFBsYXRmb3JtIGRyaXZlcnMgcmVnaXN0ZXIvdW5yZWdpc3RlciAqLwogc3RhdGljIGlubGluZSBpbnQgb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCmluZGV4IDY0OTNhMzkuLjA4MmIzYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaApAQCAtNjIsNiArNjIsOCBAQAogCXUxNiBwYWNhX2luZGV4OwkJCS8qIExvZ2ljYWwgcHJvY2Vzc29yIG51bWJlciAqLwogCiAJdTY0IGtlcm5lbF90b2M7CQkJLyogS2VybmVsIFRPQyBhZGRyZXNzICovCisJdTY0IGtlcm5lbGJhc2U7CQkJLyogQmFzZSBhZGRyZXNzIG9mIGtlcm5lbCAqLworCXU2NCBrZXJuZWxfbXNyOwkJCS8qIE1TUiB3aGlsZSBydW5uaW5nIGluIGtlcm5lbCAqLwogCXU2NCBzdGFiX3JlYWw7CQkJLyogQWJzb2x1dGUgYWRkcmVzcyBvZiBzZWdtZW50IHRhYmxlICovCiAJdTY0IHN0YWJfYWRkcjsJCQkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2Ygc2VnbWVudCB0YWJsZSAqLwogCXZvaWQgKmVtZXJnZW5jeV9zcDsJCS8qIHBvaW50ZXIgdG8gZW1lcmdlbmN5IHN0YWNrICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCBlMDg4NTQ1Li42NGUxNDQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTcxLDE1ICs3MSwyMSBAQAogI2RlZmluZSBQQUdFX09GRlNFVAlBU01fQ09OU1QoQ09ORklHX1BBR0VfT0ZGU0VUKQogI2RlZmluZSBMT0FEX09GRlNFVAlBU01fQ09OU1QoKENPTkZJR19LRVJORUxfU1RBUlQtQ09ORklHX1BIWVNJQ0FMX1NUQVJUKSkKIAotI2lmIGRlZmluZWQoQ09ORklHX1JFTE9DQVRBQkxFKSAmJiBkZWZpbmVkKENPTkZJR19GTEFUTUVNKQorI2lmIGRlZmluZWQoQ09ORklHX1JFTE9DQVRBQkxFKQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIGV4dGVybiBwaHlzX2FkZHJfdCBtZW1zdGFydF9hZGRyOwogZXh0ZXJuIHBoeXNfYWRkcl90IGtlcm5zdGFydF9hZGRyOwogI2VuZGlmCiAjZGVmaW5lIFBIWVNJQ0FMX1NUQVJUCWtlcm5zdGFydF9hZGRyCi0jZGVmaW5lIE1FTU9SWV9TVEFSVAltZW1zdGFydF9hZGRyCiAjZWxzZQogI2RlZmluZSBQSFlTSUNBTF9TVEFSVAlBU01fQ09OU1QoQ09ORklHX1BIWVNJQ0FMX1NUQVJUKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNkZWZpbmUgTUVNT1JZX1NUQVJUCTBVTAorI2VsaWYgZGVmaW5lZChDT05GSUdfUkVMT0NBVEFCTEUpCisjZGVmaW5lIE1FTU9SWV9TVEFSVAltZW1zdGFydF9hZGRyCisjZWxzZQogI2RlZmluZSBNRU1PUllfU1RBUlQJKFBIWVNJQ0FMX1NUQVJUICsgUEFHRV9PRkZTRVQgLSBLRVJORUxCQVNFKQogI2VuZGlmCiAKQEAgLTkyLDggKzk4LDggQEAKICNkZWZpbmUgcGZuX3RvX2thZGRyKHBmbikJX192YSgocGZuKSA8PCBQQUdFX1NISUZUKQogI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogCi0jZGVmaW5lIF9fdmEoeCkgKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh4KSAtIFBIWVNJQ0FMX1NUQVJUICsgS0VSTkVMQkFTRSkpCi0jZGVmaW5lIF9fcGEoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSArIFBIWVNJQ0FMX1NUQVJUIC0gS0VSTkVMQkFTRSkKKyNkZWZpbmUgX192YSh4KSAoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHgpICsgUEFHRV9PRkZTRVQgLSBNRU1PUllfU1RBUlQpKQorI2RlZmluZSBfX3BhKHgpICgodW5zaWduZWQgbG9uZykoeCkgLSBQQUdFX09GRlNFVCArIE1FTU9SWV9TVEFSVCkKIAogLyoKICAqIFVuZm9ydHVuYXRlbHkgdGhlIFBMVCBpcyBpbiB0aGUgQlNTIGluIHRoZSBQUEMzMiBFTEYgQUJJLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfMzIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzMyLmgKaW5kZXggZWJmYWU1My4uZDc3MDcyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfMzIuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV8zMi5oCkBAIC0xMywxMCArMTMsMTYgQEAKICNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOCUwxX0NBQ0hFX0JZVEVTCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKKyNkZWZpbmUgUFRFX0ZMQUdTX09GRlNFVAk0CS8qIG9mZnNldCBvZiBQVEUgZmxhZ3MsIGluIGJ5dGVzICovCisjZWxzZQorI2RlZmluZSBQVEVfRkxBR1NfT0ZGU0VUCTAKKyNlbmRpZgorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKICAqIFRoZSBiYXNpYyB0eXBlIG9mIGEgUFRFIC0gNjQgYml0cyBmb3IgdGhvc2UgQ1BVcyB3aXRoID4gMzIgYml0Ci0gKiBwaHlzaWNhbCBhZGRyZXNzaW5nLiAgRm9yIG5vdyB0aGlzIGp1c3QgdGhlIElCTSBQUEM0NDAuCisgKiBwaHlzaWNhbCBhZGRyZXNzaW5nLgogICovCiAjaWZkZWYgQ09ORklHX1BURV82NEJJVAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgcHRlX2Jhc2ljX3Q7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggYTA1YTk0Mi4uMGU1MmM3OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2kuaApAQCAtNjAsNiArNjAsMTQgQEAKIAlyZXR1cm4gY2hhbm5lbCA/IDE1IDogMTQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gdm9pZCBzZXRfcGNpX2RtYV9vcHMoc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyk7CitleHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZ2V0X3BjaV9kbWFfb3BzKHZvaWQpOworI2Vsc2UJLyogQ09ORklHX1BDSSAqLworI2RlZmluZSBzZXRfcGNpX2RtYV9vcHMoZCkKKyNkZWZpbmUgZ2V0X3BjaV9kbWFfb3BzKCkJTlVMTAorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfUFBDNjQKIAogLyoKQEAgLTcwLDkgKzc4LDYgQEAKICNkZWZpbmUgUENJX0RJU0FCTEVfTVdJCiAKICNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gdm9pZCBzZXRfcGNpX2RtYV9vcHMoc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyk7Ci1leHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZ2V0X3BjaV9kbWFfb3BzKHZvaWQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKQEAgLTg5LDkgKzk0LDYgQEAKIAkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX01VTFRJUExFOwogCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKIH0KLSNlbHNlCS8qIENPTkZJR19QQ0kgKi8KLSNkZWZpbmUgc2V0X3BjaV9kbWFfb3BzKGQpCi0jZGVmaW5lIGdldF9wY2lfZG1hX29wcygpCU5VTEwKICNlbmRpZgogCiAjZWxzZSAvKiAzMi1iaXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzMyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1wcGMzMi5oCmluZGV4IDZmZTM5ZTMuLjZhYjdjNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzMyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjMzIuaApAQCAtMjYxLDYgKzI2MSw3IEBACiAjZGVmaW5lIF9QQUdFX0hXRVhFQwkweDAwMDAwMDA0CQkvKiBIOiBFeGVjdXRlIHBlcm1pc3Npb24gKi8KICNkZWZpbmUgX1BBR0VfQUNDRVNTRUQJMHgwMDAwMDAwOAkJLyogUzogUGFnZSByZWZlcmVuY2VkICovCiAjZGVmaW5lIF9QQUdFX0RJUlRZCTB4MDAwMDAwMTAJCS8qIFM6IFBhZ2UgZGlydHkgKi8KKyNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkweDAwMDAwMDIwCQkvKiBTOiBTcGVjaWFsIHBhZ2UgKi8KICNkZWZpbmUgX1BBR0VfVVNFUgkweDAwMDAwMDQwCQkvKiBTOiBVc2VyIHBhZ2UgKi8KICNkZWZpbmUgX1BBR0VfRU5ESUFOCTB4MDAwMDAwODAJCS8qIEg6IEUgYml0ICovCiAjZGVmaW5lIF9QQUdFX0dVQVJERUQJMHgwMDAwMDEwMAkJLyogSDogRyBiaXQgKi8KQEAgLTI3Niw2ICsyNzcsNyBAQAogLyogRVJQTiBpbiBhIFBURSBuZXZlciBnZXRzIGNsZWFyZWQsIGlnbm9yZSBpdCAqLwogI2RlZmluZSBfUFRFX05PTkVfTUFTSwkweGZmZmZmZmZmMDAwMDAwMDBVTEwKIAorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpCiAvKgpAQCAtMzA1LDYgKzMwNyw3IEBACiAjZGVmaW5lIF9QQUdFX0NPSEVSRU5UCTB4MDAxMDAJLyogSDogTSBiaXQgKi8KICNkZWZpbmUgX1BBR0VfTk9fQ0FDSEUJMHgwMDIwMAkvKiBIOiBJIGJpdCAqLwogI2RlZmluZSBfUEFHRV9XUklURVRIUlUJMHgwMDQwMAkvKiBIOiBXIGJpdCAqLworI2RlZmluZSBfUEFHRV9TUEVDSUFMCTB4MDA4MDAgLyogUzogU3BlY2lhbCBwYWdlICovCiAKICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCiAvKiBFUlBOIGluIGEgUFRFIG5ldmVyIGdldHMgY2xlYXJlZCwgaWdub3JlIGl0ICovCkBAIC0zMTUsNiArMzE4LDggQEAKICNkZWZpbmUgX1BNRF9QUkVTRU5UX01BU0sgKFBBR0VfTUFTSykKICNkZWZpbmUgX1BNRF9CQUQJKH5QQUdFX01BU0spCiAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NQRUNJQUwKKwogI2VsaWYgZGVmaW5lZChDT05GSUdfOHh4KQogLyogRGVmaW5pdGlvbnMgZm9yIDh4eCBlbWJlZGRlZCBjaGlwcy4gKi8KICNkZWZpbmUgX1BBR0VfUFJFU0VOVAkweDAwMDEJLyogUGFnZSBpcyB2YWxpZCAqLwpAQCAtMzYyLDggKzM2NywxNCBAQAogI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDEwMAkvKiBSOiBwYWdlIHJlZmVyZW5jZWQgKi8KICNkZWZpbmUgX1BBR0VfRVhFQwkweDIwMAkvKiBzb2Z0d2FyZTogaS1jYWNoZSBjb2hlcmVuY3kgcmVxdWlyZWQgKi8KICNkZWZpbmUgX1BBR0VfUlcJMHg0MDAJLyogc29mdHdhcmU6IHVzZXIgd3JpdGUgYWNjZXNzIGFsbG93ZWQgKi8KKyNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkweDgwMAkvKiBzb2Z0d2FyZTogU3BlY2lhbCBwYWdlICovCiAKKyNpZmRlZiBDT05GSUdfUFRFXzY0QklUCisvKiBXZSBuZXZlciBjbGVhciB0aGUgaGlnaCB3b3JkIG9mIHRoZSBwdGUgKi8KKyNkZWZpbmUgX1BURV9OT05FX01BU0sJKDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCB8IF9QQUdFX0hBU0hQVEUpCisjZWxzZQogI2RlZmluZSBfUFRFX05PTkVfTUFTSwlfUEFHRV9IQVNIUFRFCisjZW5kaWYKIAogI2RlZmluZSBfUE1EX1BSRVNFTlQJMAogI2RlZmluZSBfUE1EX1BSRVNFTlRfTUFTSyAoUEFHRV9NQVNLKQpAQCAtMzcyLDYgKzM4Myw4IEBACiAvKiBIYXNoIHRhYmxlIGJhc2VkIHBsYXRmb3JtcyBuZWVkIGF0b21pYyB1cGRhdGVzIG9mIHRoZSBsaW51eCBQVEUgKi8KICNkZWZpbmUgUFRFX0FUT01JQ19VUERBVEVTCTEKIAorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAorCiAjZW5kaWYKIAogLyoKQEAgLTQwNCw2ICs0MTcsOSBAQAogI2lmbmRlZiBfUEFHRV9XUklURVRIUlUKICNkZWZpbmUgX1BBR0VfV1JJVEVUSFJVCTAKICNlbmRpZgorI2lmbmRlZiBfUEFHRV9TUEVDSUFMCisjZGVmaW5lIF9QQUdFX1NQRUNJQUwJMAorI2VuZGlmCiAjaWZuZGVmIF9QTURfUFJFU0VOVF9NQVNLCiAjZGVmaW5lIF9QTURfUFJFU0VOVF9NQVNLCV9QTURfUFJFU0VOVAogI2VuZGlmCkBAIC00MTUsMTEgKzQzMSwxMSBAQAogI2RlZmluZSBfUEFHRV9DSEdfTUFTSwkoUEFHRV9NQVNLIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSkKIAogCi0jZGVmaW5lIFBBR0VfUFJPVF9CSVRTCV9fcGdwcm90KF9QQUdFX0dVQVJERUQgfCBfUEFHRV9DT0hFUkVOVCB8IF9QQUdFX05PX0NBQ0hFIHwgXAotCQkJCSBfUEFHRV9XUklURVRIUlUgfCBfUEFHRV9FTkRJQU4gfCBcCi0JCQkJIF9QQUdFX1VTRVIgfCBfUEFHRV9BQ0NFU1NFRCB8IFwKLQkJCQkgX1BBR0VfUlcgfCBfUEFHRV9IV1dSSVRFIHwgX1BBR0VfRElSVFkgfCBcCi0JCQkJIF9QQUdFX0VYRUMgfCBfUEFHRV9IV0VYRUMpCisjZGVmaW5lIFBBR0VfUFJPVF9CSVRTCShfUEFHRV9HVUFSREVEIHwgX1BBR0VfQ09IRVJFTlQgfCBfUEFHRV9OT19DQUNIRSB8IFwKKwkJCSBfUEFHRV9XUklURVRIUlUgfCBfUEFHRV9FTkRJQU4gfCBcCisJCQkgX1BBR0VfVVNFUiB8IF9QQUdFX0FDQ0VTU0VEIHwgXAorCQkJIF9QQUdFX1JXIHwgX1BBR0VfSFdXUklURSB8IF9QQUdFX0RJUlRZIHwgXAorCQkJIF9QQUdFX0VYRUMgfCBfUEFHRV9IV0VYRUMpCiAvKgogICogTm90ZTogdGhlIF9QQUdFX0NPSEVSRU5UIGJpdCBhdXRvbWF0aWNhbGx5IGdldHMgc2V0IGluIHRoZSBoYXJkd2FyZQogICogUFRFIGlmIENPTkZJR19TTVAgaXMgZGVmaW5lZCAoaGFzaF9wYWdlIGRvZXMgdGhpcyk7IHRoZXJlIGlzIG5vIG5lZWQKQEAgLTUxNyw3ICs1MzMsOCBAQAogCiAjZGVmaW5lIHB0ZV9ub25lKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgfl9QVEVfTk9ORV9NQVNLKSA9PSAwKQogI2RlZmluZSBwdGVfcHJlc2VudChwdGUpCShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9QUkVTRU5UKQotI2RlZmluZSBwdGVfY2xlYXIobW0sYWRkcixwdGVwKQlkbyB7IHNldF9wdGVfYXQoKG1tKSwgKGFkZHIpLCAocHRlcCksIF9fcHRlKDApKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHRlX2NsZWFyKG1tLCBhZGRyLCBwdGVwKSBcCisJZG8geyBwdGVfdXBkYXRlKHB0ZXAsIH5fUEFHRV9IQVNIUFRFLCAwKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBwbWRfbm9uZShwbWQpCQkoIXBtZF92YWwocG1kKSkKICNkZWZpbmUJcG1kX2JhZChwbWQpCQkocG1kX3ZhbChwbWQpICYgX1BNRF9CQUQpCkBAIC01MzMsNyArNTUwLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfc3BlY2lhbChwdGVfdCBwdGUpCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9zcGVjaWFsKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfU1BFQ0lBTDsgfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSAgICAgICB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgICAgICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CkBAIC01NTIsMTAgKzU2OSwxMCBAQAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rc3BlY2lhbChwdGVfdCBwdGUpIHsKLQlyZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3BncHJvdChwdGVfdCBwdGUpCisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1NQRUNJQUw7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcGdwcm90X3QgcHRlX3BncHJvdChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIF9fcGdwcm90KHB0ZV92YWwocHRlKSkgJiBQQUdFX1BST1RfQklUUzsKKwlyZXR1cm4gX19wZ3Byb3QocHRlX3ZhbChwdGUpICYgUEFHRV9QUk9UX0JJVFMpOwogfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBuZXdwcm90KQpAQCAtNTc1LDYgKzU5MiwxMCBAQAogZXh0ZXJuIHZvaWQgYWRkX2hhc2hfcGFnZSh1bnNpZ25lZCBjb250ZXh0LCB1bnNpZ25lZCBsb25nIHZhLAogCQkJICB1bnNpZ25lZCBsb25nIHBtZHZhbCk7CiAKKy8qIEZsdXNoIGFuIGVudHJ5IGZyb20gdGhlIFRMQi9oYXNoIHRhYmxlICovCitleHRlcm4gdm9pZCBmbHVzaF9oYXNoX2VudHJ5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlcCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKKwogLyoKICAqIEF0b21pYyBQVEUgdXBkYXRlcy4KICAqCkBAIC02MTIsOSArNjMzLDYgQEAKIAlyZXR1cm4gb2xkOwogfQogI2Vsc2UgLyogQ09ORklHX1BURV82NEJJVCAqLwotLyogVE9ETzogQ2hhbmdlIHRoYXQgdG8gb25seSBtb2RpZnkgdGhlIGxvdyB3b3JkIGFuZCBtb3ZlIHNldF9wdGVfYXQoKQotICogb3V0IG9mIGxpbmUKLSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgcHRlX3VwZGF0ZShwdGVfdCAqcCwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgY2xyLAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzZXQpCkBAIC02NTIsMTQgKzY3MCwzNiBAQAogICogT24gbWFjaGluZXMgd2hpY2ggdXNlIGFuIE1NVSBoYXNoIHRhYmxlIHdlIGF2b2lkIGNoYW5naW5nIHRoZQogICogX1BBR0VfSEFTSFBURSBiaXQuCiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKK3sKKyNpZiAoX1BBR0VfSEFTSFBURSAhPSAwKSAmJiBkZWZpbmVkKENPTkZJR19TTVApICYmICFkZWZpbmVkKENPTkZJR19QVEVfNjRCSVQpCisJcHRlX3VwZGF0ZShwdGVwLCB+X1BBR0VfSEFTSFBURSwgcHRlX3ZhbChwdGUpICYgfl9QQUdFX0hBU0hQVEUpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFRFXzY0QklUKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisjaWYgX1BBR0VfSEFTSFBURSAhPSAwCisJaWYgKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfSEFTSFBURSkKKwkJZmx1c2hfaGFzaF9lbnRyeShtbSwgcHRlcCwgYWRkcik7CisjZW5kaWYKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiXAorCQlzdHclVTAlWDAgJTIsJTBcblwKKwkJZWllaW9cblwKKwkJc3R3JVUwJVgwICVMMiwlMSIKKwk6ICI9bSIgKCpwdGVwKSwgIj1tIiAoKigodW5zaWduZWQgY2hhciAqKXB0ZXArNCkpCisJOiAiciIgKHB0ZSkgOiAibWVtb3J5Iik7CisjZWxzZQorCSpwdGVwID0gX19wdGUoKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfSEFTSFBURSkKKwkJICAgICAgfCAocHRlX3ZhbChwdGUpICYgfl9QQUdFX0hBU0hQVEUpKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKLSNpZiBfUEFHRV9IQVNIUFRFICE9IDAKLQlwdGVfdXBkYXRlKHB0ZXAsIH5fUEFHRV9IQVNIUFRFLCBwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfSEFTSFBURSk7Ci0jZWxzZQotCSpwdGVwID0gcHRlOworI2lmIGRlZmluZWQoQ09ORklHX1BURV82NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCVdBUk5fT04ocHRlX3ByZXNlbnQoKnB0ZXApKTsKICNlbmRpZgorCV9fc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1wcGM2NC5oCmluZGV4IDQ1OTdjNDkuLjRjMGE4YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaApAQCAtMTE3LDEwICsxMTcsMTAgQEAKICNkZWZpbmUgUEFHRV9BR1AJX19wZ3Byb3QoX1BBR0VfQkFTRSB8IF9QQUdFX1dSRU5BQkxFIHwgX1BBR0VfTk9fQ0FDSEUpCiAjZGVmaW5lIEhBVkVfUEFHRV9BR1AKIAotI2RlZmluZSBQQUdFX1BST1RfQklUUwlfX3BncHJvdChfUEFHRV9HVUFSREVEIHwgX1BBR0VfQ09IRVJFTlQgfCBcCi0JCQkJIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfV1JJVEVUSFJVIHwgXAotCQkJCSBfUEFHRV80S19QRk4gfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIgfCBcCi0gCQkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwgX1BBR0VfRVhFQykKKyNkZWZpbmUgUEFHRV9QUk9UX0JJVFMJKF9QQUdFX0dVQVJERUQgfCBfUEFHRV9DT0hFUkVOVCB8IFwKKwkJCSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX1dSSVRFVEhSVSB8CQlcCisJCQkgX1BBR0VfNEtfUEZOIHwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwJCVwKKwkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwgX1BBR0VfRVhFQykKIC8qIFBURUlEWCBuaWJibGUgKi8KICNkZWZpbmUgX1BURUlEWF9TRUNPTkRBUlkJMHg4CiAjZGVmaW5lIF9QVEVJRFhfR1JPVVBfSVgJMHg3CkBAIC0yNjQsOSArMjY0LDkgQEAKIAlyZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3NwZWNpYWwocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1NQRUNJQUw7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfcGdwcm90KHB0ZV90IHB0ZSkKK3N0YXRpYyBpbmxpbmUgcGdwcm90X3QgcHRlX3BncHJvdChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIF9fcGdwcm90KHB0ZV92YWwocHRlKSkgJiBQQUdFX1BST1RfQklUUzsKKwlyZXR1cm4gX19wZ3Byb3QocHRlX3ZhbChwdGUpICYgUEFHRV9QUk9UX0JJVFMpOwogfQogCiAvKiBBdG9taWMgUFRFIHVwZGF0ZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGNfYXNtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjX2FzbS5oCmluZGV4IDA5NjY4OTkuLmM0YTAyOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGNfYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwY19hc20uaApAQCAtMjY4LDcgKzI2OCw3IEBACiAgKiAgIExvYWRzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgZXhwcmVzc2lvbiAnZXhwcicgaW50byByZWdpc3RlciAncm4nCiAgKiAgIHVzaW5nIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgb25seS4gIFVzZSB0aGlzIHdoZW4gaXQncyBpbXBvcnRhbnQgbm90CiAgKiAgIHRvIHJlZmVyZW5jZSBvdGhlciBkYXRhIChpLmUuIG9uIHBwYzY0IHdoZW4gdGhlIFRPQyBwb2ludGVyIGlzIG5vdAotICogICB2YWxpZCkuCisgKiAgIHZhbGlkKSBhbmQgd2hlbiAnZXhwcicgaXMgYSBjb25zdGFudCBvciBhYnNvbHV0ZSBhZGRyZXNzLgogICoKICAqIExPQURfUkVHX0FERFIocm4sIG5hbWUpCiAgKiAgIExvYWRzIHRoZSBhZGRyZXNzIG9mIGxhYmVsICduYW1lJyBpbnRvIHJlZ2lzdGVyICdybicuICBVc2UgdGhpcyB3aGVuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKaW5kZXggYmU5ODBmNC4uNjc0NTM3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaApAQCAtMTA5LDYgKzEwOSw3IEBACiAjZGVmaW5lIFNQUk5fRVZQUgkweDNENgkvKiBFeGNlcHRpb24gVmVjdG9yIFByZWZpeCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0wxQ1NSMAkweDNGMgkvKiBMMSBDYWNoZSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBTUFJOX0wxQ1NSMQkweDNGMwkvKiBMMSBDYWNoZSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBTUFJOX01NVUNTUjAJMHgzRjQJLyogTU1VIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwICovCiAjZGVmaW5lIFNQUk5fUElUCTB4M0RCCS8qIFByb2dyYW1tYWJsZSBJbnRlcnZhbCBUaW1lciAqLwogI2RlZmluZSBTUFJOX0JVQ1NSCTB4M0Y1CS8qIEJyYW5jaCBVbml0IENvbnRyb2wgYW5kIFN0YXR1cyAqLwogI2RlZmluZSBTUFJOX0wyQ1NSMAkweDNGOQkvKiBMMiBEYXRhIENhY2hlIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwICovCkBAIC00MTAsNiArNDExLDEyIEBACiAjZGVmaW5lIEwyQ1NSMF9MMkxPQQkweDAwMDAwMDgwCS8qIEwyIENhY2hlIExvY2sgT3ZlcmZsb3cgQWxsb2NhdGUgKi8KICNkZWZpbmUgTDJDU1IwX0wyTE8JMHgwMDAwMDAyMAkvKiBMMiBDYWNoZSBMb2NrIE92ZXJmbG93ICovCiAKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgTU1VQ1NSMCAqLworI2RlZmluZSBNTVVDU1IwX1RMQjFGSQkweDAwMDAwMDAyCS8qIFRMQjEgRmxhc2ggaW52YWxpZGF0ZSAqLworI2RlZmluZSBNTVVDU1IwX1RMQjBGSQkweDAwMDAwMDA0CS8qIFRMQjAgRmxhc2ggaW52YWxpZGF0ZSAqLworI2RlZmluZSBNTVVDU1IwX1RMQjJGSQkweDAwMDAwMDQwCS8qIFRMQjIgRmxhc2ggaW52YWxpZGF0ZSAqLworI2RlZmluZSBNTVVDU1IwX1RMQjNGSQkweDAwMDAwMDIwCS8qIFRMQjMgRmxhc2ggaW52YWxpZGF0ZSAqLworCiAvKiBCaXQgZGVmaW5pdGlvbnMgZm9yIFNHUi4gKi8KICNkZWZpbmUgU0dSX05PUk1BTAkwCQkvKiBTcGVjdWxhdGl2ZSBmZXRjaGluZyBhbGxvd2VkLiAqLwogI2RlZmluZSBTR1JfR1VBUkRFRAkxCQkvKiBTcGVjdWxhdGl2ZSBmZXRjaGluZyBkaXNhbGxvd2VkLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2VjdGlvbnMuaAppbmRleCA5MTYwMThlLi42ZmJjZTcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2VjdGlvbnMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2VjdGlvbnMuaApAQCAtMiw2ICsyLDggQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NFQ1RJT05TX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KQEAgLTE2LDYgKzE4LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXBzX2tlcm5lbF90ZXh0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXJldHVybiBzdGFydCA8ICh1bnNpZ25lZCBsb25nKV9faW5pdF9lbmQgJiYKKwkJKHVuc2lnbmVkIGxvbmcpX3N0ZXh0IDwgZW5kOworfQorCisjdW5kZWYgZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcgorc3RhdGljIGlubGluZSB2b2lkICpkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgcHBjNjRfb3BkX2VudHJ5ICpkZXNjID0gcHRyOworCXZvaWQgKnA7CisKKwlpZiAoIXByb2JlX2tlcm5lbF9hZGRyZXNzKCZkZXNjLT5mdW5jYWRkciwgcCkpCisJCXB0ciA9IHA7CisJcmV0dXJuIHB0cjsKK30KKwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2ZwLW1hY2hpbmUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zZnAtbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDM0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2ZwLW1hY2hpbmUuaApAQCAtMCwwICsxLDM1MyBAQAorLyogTWFjaGluZS1kZXBlbmRlbnQgc29mdHdhcmUgZmxvYXRpbmctcG9pbnQgZGVmaW5pdGlvbnMuICBQUEMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCisgICBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICBBY3R1YWxseSwgdGhpcyBpcyBhIFBQQyAoMzJiaXQpIHZlcnNpb24sIHdyaXR0ZW4gYmFzZWQgb24gdGhlCisgICBpMzg2LCBzcGFyYywgYW5kIHNwYXJjNjQgdmVyc2lvbnMsIGJ5IG1lLAorICAgUGV0ZXIgTWF5ZGVsbCAocG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51aykuCisgICBDb21tZW50cyBhcmUgYnkgYW5kIGxhcmdlIGFsc28gbWluZSwgYWx0aG91Z2ggdGhleSBtYXkgYmUgaW5hY2N1cmF0ZS4KKworICAgSW4gcGlja2luZyBvdXQgYXNtIGZyYWdtZW50cyBJJ3ZlIGdvbmUgd2l0aCB0aGUgbG93ZXN0IGNvbW1vbgorICAgZGVub21pbmF0b3IsIHdoaWNoIGFsc28gaGFwcGVucyB0byBiZSB0aGUgaGFyZHdhcmUgSSBoYXZlIDotPgorICAgVGhhdCBpcywgYSBTUEFSQyB3aXRob3V0IGhhcmR3YXJlIG11bHRpcGx5IGFuZCBkaXZpZGUuCisgKi8KKworLyogYmFzaWMgd29yZCBzaXplIGRlZmluaXRpb25zICovCisjZGVmaW5lIF9GUF9XX1RZUEVfU0laRQkJMzIKKyNkZWZpbmUgX0ZQX1dfVFlQRQkJdW5zaWduZWQgbG9uZworI2RlZmluZSBfRlBfV1NfVFlQRQkJc2lnbmVkIGxvbmcKKyNkZWZpbmUgX0ZQX0lfVFlQRQkJbG9uZworCisjZGVmaW5lIF9fbGxfQgkJCSgoVVd0eXBlKSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQorI2RlZmluZSBfX2xsX2xvd3BhcnQodCkJCSgoVVd0eXBlKSAodCkgJiAoX19sbF9CIC0gMSkpCisjZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkJKChVV3R5cGUpICh0KSA+PiAoV19UWVBFX1NJWkUgLyAyKSkKKworLyogWW91IGNhbiBvcHRpb25hbGx5IGNvZGUgc29tZSB0aGluZ3MgbGlrZSBhZGRpdGlvbiBpbiBhc20uIEZvcgorICogZXhhbXBsZSwgaTM4NiBkZWZpbmVzIF9fRlBfRlJBQ19BRERfMiBhcyBhc20uIElmIHlvdSBkb24ndAorICogdGhlbiB5b3UgZ2V0IGEgZnJhZ21lbnQgb2YgQyBjb2RlIFtpZiB5b3UgY2hhbmdlIGFuICNpZmRlZiAwCisgKiBpbiBvcC0yLmhdIG9yIGEgY2FsbCB0byBhZGRfc3NhYWFhIChzZWUgYmVsb3cpLgorICogR29vZCBwbGFjZXMgdG8gbG9vayBmb3IgYXNtIGZyYWdtZW50cyB0byB1c2UgYXJlIGdjYyBhbmQgZ2xpYmMuCisgKiBnY2MncyBsb25nbG9uZy5oIGlzIHVzZWZ1bC4KKyAqLworCisvKiBXZSBuZWVkIHRvIGtub3cgaG93IHRvIG11bHRpcGx5IGFuZCBkaXZpZGUuIElmIHRoZSBob3N0IHdvcmQgc2l6ZQorICogaXMgPj0gMipmcmFjYml0cyB5b3UgY2FuIHVzZSBGUF9NVUxfTUVBVF9uX2ltbSh0LFIsWCxZKSB3aGljaAorICogY29kZXMgdGhlIG11bHRpcGx5IHdpdGggd2hhdGV2ZXIgZ2NjIGRvZXMgdG8gJ2EgKiBiJy4KKyAqIF9GUF9NVUxfTUVBVF9uX3dpZGUodCxSLFgsWSxmKSBpcyB1c2VkIHdoZW4geW91IGhhdmUgYW4gYXNtCisgKiBmdW5jdGlvbiB0aGF0IGNhbiBtdWx0aXBseSB0d28gMVcgdmFsdWVzIGFuZCBnZXQgYSAyVyByZXN1bHQuCisgKiBPdGhlcndpc2UgeW91J3JlIHN0dWNrIHdpdGggX0ZQX01VTF9NRUFUX25faGFyZCh0LFIsWCxZKSB3aGljaAorICogZG9lcyBiaXRzaGlmdGluZyB0byBhdm9pZCBvdmVyZmxvdy4KKyAqIEZvciBkaXZpc2lvbiB0aGVyZSBpcyBGUF9ESVZfTUVBVF9uX2ltbSh0LFIsWCxZLGYpIGZvciB3b3JkIHNpemUKKyAqID49IDIqZnJhY2JpdHMsIHdoZXJlIGYgaXMgZWl0aGVyIF9GUF9ESVZfSEVMUF9pbW0gb3IKKyAqIF9GUF9ESVZfSEVMUF9sZGl2IChzZWUgb3AtMS5oKS4KKyAqIF9GUF9ESVZfTUVBVF91ZGl2KCkgaXMgaWYgeW91IGhhdmUgYXNtIHRvIGRvIDJXLzFXID0+ICgxVywgMVcpLgorICogW0dDQyBhbmQgZ2xpYmMgaGF2ZSBsb25nbG9uZy5oIHdoaWNoIGhhcyB0aGUgYXNtIG1hY3JvIHVkaXZfcXJubmQKKyAqIHRvIGRvIHRoaXMuXQorICogSW4gZ2VuZXJhbCwgJ24nIGlzIHRoZSBudW1iZXIgb2Ygd29yZHMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgdHlwZSwKKyAqIGFuZCAndCcgaXMgZWl0aGVyIFMsIEQgb3IgUSBmb3Igc2luZ2xlL2RvdWJsZS9xdWFkLgorICogICAgICAgICAgIC0tIFBNTQorICovCisvKiBFeGFtcGxlOiBTUEFSQzY0OgorICogI2RlZmluZSBfRlBfTVVMX01FQVRfUyhSLFgsWSkJX0ZQX01VTF9NRUFUXzFfaW1tKFMsUixYLFkpCisgKiAjZGVmaW5lIF9GUF9NVUxfTUVBVF9EKFIsWCxZKQlfRlBfTVVMX01FQVRfMV93aWRlKEQsUixYLFksdW11bF9wcG1tKQorICogI2RlZmluZSBfRlBfTVVMX01FQVRfUShSLFgsWSkJX0ZQX01VTF9NRUFUXzJfd2lkZShRLFIsWCxZLHVtdWxfcHBtbSkKKyAqCisgKiAjZGVmaW5lIF9GUF9ESVZfTUVBVF9TKFIsWCxZKQlfRlBfRElWX01FQVRfMV9pbW0oUyxSLFgsWSxfRlBfRElWX0hFTFBfaW1tKQorICogI2RlZmluZSBfRlBfRElWX01FQVRfRChSLFgsWSkJX0ZQX0RJVl9NRUFUXzFfdWRpdihELFIsWCxZKQorICogI2RlZmluZSBfRlBfRElWX01FQVRfUShSLFgsWSkJX0ZQX0RJVl9NRUFUXzJfdWRpdl82NChRLFIsWCxZKQorICoKKyAqIEV4YW1wbGU6IGkzODY6CisgKiAjZGVmaW5lIF9GUF9NVUxfTUVBVF9TKFIsWCxZKSAgIF9GUF9NVUxfTUVBVF8xX3dpZGUoUyxSLFgsWSxfaTM4Nl9tdWxfMzJfNjQpCisgKiAjZGVmaW5lIF9GUF9NVUxfTUVBVF9EKFIsWCxZKSAgIF9GUF9NVUxfTUVBVF8yX3dpZGUoRCxSLFgsWSxfaTM4Nl9tdWxfMzJfNjQpCisgKgorICogI2RlZmluZSBfRlBfRElWX01FQVRfUyhSLFgsWSkgICBfRlBfRElWX01FQVRfMV91ZGl2KFMsUixYLFksX2kzODZfZGl2XzY0XzMyKQorICogI2RlZmluZSBfRlBfRElWX01FQVRfRChSLFgsWSkgICBfRlBfRElWX01FQVRfMl91ZGl2XzY0KEQsUixYLFkpCisgKi8KKworI2RlZmluZSBfRlBfTVVMX01FQVRfUyhSLFgsWSkgICBfRlBfTVVMX01FQVRfMV93aWRlKF9GUF9XRlJBQ0JJVFNfUyxSLFgsWSx1bXVsX3BwbW0pCisjZGVmaW5lIF9GUF9NVUxfTUVBVF9EKFIsWCxZKSAgIF9GUF9NVUxfTUVBVF8yX3dpZGUoX0ZQX1dGUkFDQklUU19ELFIsWCxZLHVtdWxfcHBtbSkKKworI2RlZmluZSBfRlBfRElWX01FQVRfUyhSLFgsWSkJX0ZQX0RJVl9NRUFUXzFfdWRpdihTLFIsWCxZKQorI2RlZmluZSBfRlBfRElWX01FQVRfRChSLFgsWSkJX0ZQX0RJVl9NRUFUXzJfdWRpdihELFIsWCxZKQorCisvKiBUaGVzZSBtYWNyb3MgZGVmaW5lIHdoYXQgTmFOIGxvb2tzIGxpa2UuIFRoZXkncmUgc3VwcG9zZWQgdG8gZXhwYW5kIHRvCisgKiBhIGNvbW1hLXNlcGFyYXRlZCBzZXQgb2YgMzJiaXQgdW5zaWduZWQgaW50cyB0aGF0IGVuY29kZSBOYU4uCisgKi8KKyNkZWZpbmUgX0ZQX05BTkZSQUNfUwkJKChfRlBfUU5BTkJJVF9TIDw8IDEpIC0gMSkKKyNkZWZpbmUgX0ZQX05BTkZSQUNfRAkJKChfRlBfUU5BTkJJVF9EIDw8IDEpIC0gMSksIC0xCisjZGVmaW5lIF9GUF9OQU5GUkFDX1EJCSgoX0ZQX1FOQU5CSVRfUSA8PCAxKSAtIDEpLCAtMSwgLTEsIC0xCisjZGVmaW5lIF9GUF9OQU5TSUdOX1MJCTAKKyNkZWZpbmUgX0ZQX05BTlNJR05fRAkJMAorI2RlZmluZSBfRlBfTkFOU0lHTl9RCQkwCisKKyNkZWZpbmUgX0ZQX0tFRVBOQU5GUkFDUCAxCisKKy8qIEV4Y2VwdGlvbiBmbGFncy4gIFdlIHVzZSB0aGUgYml0IHBvc2l0aW9ucyBvZiB0aGUgYXBwcm9wcmlhdGUgYml0cworICAgaW4gdGhlIEZQU0NSLCB3aGljaCBhbHNvIGNvcnJlc3BvbmQgdG8gdGhlIEZFXyogYml0cy4gIFRoaXMgbWFrZXMKKyAgIGV2ZXJ5dGhpbmcgZWFzaWVyIDstKS4gICovCisjZGVmaW5lIEZQX0VYX0lOVkFMSUQgICAgICAgICAoMSA8PCAoMzEgLSAyKSkKKyNkZWZpbmUgRlBfRVhfSU5WQUxJRF9TTkFOCUVGTEFHX1ZYU05BTgorI2RlZmluZSBGUF9FWF9JTlZBTElEX0lTSQlFRkxBR19WWElTSQorI2RlZmluZSBGUF9FWF9JTlZBTElEX0lESQlFRkxBR19WWElESQorI2RlZmluZSBGUF9FWF9JTlZBTElEX1pEWglFRkxBR19WWFpEWgorI2RlZmluZSBGUF9FWF9JTlZBTElEX0lNWglFRkxBR19WWElNWgorI2RlZmluZSBGUF9FWF9PVkVSRkxPVyAgICAgICAgKDEgPDwgKDMxIC0gMykpCisjZGVmaW5lIEZQX0VYX1VOREVSRkxPVyAgICAgICAoMSA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgRlBfRVhfRElWWkVSTyAgICAgICAgICgxIDw8ICgzMSAtIDUpKQorI2RlZmluZSBGUF9FWF9JTkVYQUNUICAgICAgICAgKDEgPDwgKDMxIC0gNikpCisKKy8qIFRoaXMgbWFjcm8gYXBwZWFycyB0byBiZSBjYWxsZWQgd2hlbiBib3RoIFggYW5kIFkgYXJlIE5hTnMsIGFuZAorICogaGFzIHRvIGNob29zZSBvbmUgYW5kIGNvcHkgaXQgdG8gUi4gaTM4NiBnb2VzIGZvciB0aGUgbGFyZ2VyIG9mIHRoZQorICogdHdvLCBzcGFyYzY0IGp1c3QgcGlja3MgWS4gSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgYXQgYWxsIHNvIEknbGwKKyAqIGdvIHdpdGggc3BhcmM2NCBiZWNhdXNlIGl0J3Mgc2hvcnRlciA6LT4gICAtLSBQTU0KKyAqLworI2RlZmluZSBfRlBfQ0hPT1NFTkFOKGZzLCB3YywgUiwgWCwgWSwgT1ApCQlcCisgIGRvIHsJCQkJCQkJXAorICAgIFIjI19zID0gWSMjX3M7CQkJCQlcCisgICAgX0ZQX0ZSQUNfQ09QWV8jI3djKFIsWSk7CQkJCVwKKyAgICBSIyNfYyA9IEZQX0NMU19OQU47CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNkZWZpbmUgX19GUFVfRlBTQ1IJKGN1cnJlbnQtPnRocmVhZC5mcHNjci52YWwpCisKKy8qIFdlIG9ubHkgYWN0dWFsbHkgd3JpdGUgdG8gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgKiBpZiBleGNlcHRpb25zIHNpZ25hbGxlZCAoaWYgYW55KSB3aWxsIG5vdCB0cmFwLgorICovCisjZGVmaW5lIF9fRlBVX0VOQUJMRURfRVhDIFwKKyh7CQkJCQkJXAorCShfX0ZQVV9GUFNDUiA+PiAzKSAmIDB4MWY7CVwKK30pCisKKyNkZWZpbmUgX19GUFVfVFJBUF9QKGJpdHMpIFwKKwkoKF9fRlBVX0VOQUJMRURfRVhDICYgKGJpdHMpKSAhPSAwKQorCisjZGVmaW5lIF9fRlBfUEFDS19TKHZhbCxYKQkJCVwKKyh7ICBpbnQgX19leGMgPSBfRlBfUEFDS19DQU5PTklDQUwoUywxLFgpOwlcCisgICAgaWYoIV9fZXhjIHx8ICFfX0ZQVV9UUkFQX1AoX19leGMpKQkJXAorICAgICAgICBfRlBfUEFDS19SQVdfMV9QKFMsdmFsLFgpOwkJXAorICAgIF9fZXhjOwkJCQkJXAorfSkKKworI2RlZmluZSBfX0ZQX1BBQ0tfRCh2YWwsWCkJCQlcCisgICBkbyB7CQkJCQkJCQkJXAorCV9GUF9QQUNLX0NBTk9OSUNBTChELCAyLCBYKTsJCQkJCVwKKwlpZiAoIUZQX0NVUl9FWENFUFRJT05TIHx8ICFfX0ZQVV9UUkFQX1AoRlBfQ1VSX0VYQ0VQVElPTlMpKQlcCisJCV9GUF9QQUNLX1JBV18yX1AoRCwgdmFsLCBYKTsJCQkJXAorICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX0ZQX1BBQ0tfRFModmFsLFgpCQkJCQkJCVwKKyAgIGRvIHsJCQkJCQkJCQkJXAorCSAgIEZQX0RFQ0xfUyhfX1gpOwkJCQkJCQlcCisJICAgRlBfQ09OVihTLCBELCAxLCAyLCBfX1gsIFgpOwkJCQkJCVwKKwkgICBfRlBfUEFDS19DQU5PTklDQUwoUywgMSwgX19YKTsJCQkJCVwKKwkgICBpZiAoIUZQX0NVUl9FWENFUFRJT05TIHx8ICFfX0ZQVV9UUkFQX1AoRlBfQ1VSX0VYQ0VQVElPTlMpKSB7CVwKKwkJICAgX0ZQX1VOUEFDS19DQU5PTklDQUwoUywgMSwgX19YKTsJCQkJXAorCQkgICBGUF9DT05WKEQsIFMsIDIsIDEsIFgsIF9fWCk7CQkJCQlcCisJCSAgIF9GUF9QQUNLX0NBTk9OSUNBTChELCAyLCBYKTsJCQkJCVwKKwkJICAgaWYgKCFGUF9DVVJfRVhDRVBUSU9OUyB8fCAhX19GUFVfVFJBUF9QKEZQX0NVUl9FWENFUFRJT05TKSkJXAorCQkgICBfRlBfUEFDS19SQVdfMl9QKEQsIHZhbCwgWCk7CQkJCQlcCisJICAgfQkJCQkJCQkJCVwKKyAgIH0gd2hpbGUgKDApCisKKy8qIE9idGFpbiB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLiAqLworI2RlZmluZSBGUF9ST1VORE1PREUJCQlcCisoewkJCQkJXAorCV9fRlBVX0ZQU0NSICYgMHgzOwkJXAorfSkKKworLyogdGhlIGFzbSBmcmFnbWVudHMgZ28gaGVyZTogYWxsIHRoZXNlIGFyZSB0YWtlbiBmcm9tIGdsaWJjLTIuMC41J3MKKyAqIHN0ZGxpYi9sb25nbG9uZy5oCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBhZGRfc3NhYWFhIGlzIHVzZWQgaW4gb3AtMi5oIGFuZCBzaG91bGQgYmUgZXF1aXZhbGVudCB0bworICogI2RlZmluZSBhZGRfc3NhYWFhKHNoLHNsLGFoLGFsLGJoLGJsKSAoc2ggPSBhaCtiaCsgKCggc2wgPSBhbCtibCkgPCBhbCkpCisgKiBhZGRfc3NhYWFhKGhpZ2hfc3VtLCBsb3dfc3VtLCBoaWdoX2FkZGVuZF8xLCBsb3dfYWRkZW5kXzEsCisgKiBoaWdoX2FkZGVuZF8yLCBsb3dfYWRkZW5kXzIpIGFkZHMgdHdvIFVXdHlwZSBpbnRlZ2VycywgY29tcG9zZWQgYnkKKyAqIEhJR0hfQURERU5EXzEgYW5kIExPV19BRERFTkRfMSwgYW5kIEhJR0hfQURERU5EXzIgYW5kIExPV19BRERFTkRfMgorICogcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9TVU0gYW5kIExPV19TVU0uICBPdmVyZmxvdworICogKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgaXMgbG9zdC4KKyAqLworI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09IDApCQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7YSVJNHxhZGQlSTRjfSAlMSwlMywlNFxuXHR7YXplfGFkZHplfSAlMCwlMiIJCVwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksCQkJCQlcCisJICAgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAorCSAgICAgOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwJCQkJCVwKKwkgICAgICAgIiVyIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCisJICAgICAgICJySSIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKKyAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT1+KFVTSXR5cGUpIDApCQlcCisgICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2FtZXxhZGRtZX0gJTAsJTIiCQlcCisJICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAorCSAgICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKKwkgICAgIDogIiVyIiAoKFVTSXR5cGUpKGFoKSksCQkJCQlcCisJICAgICAgICIlciIgKChVU0l0eXBlKShhbCkpLAkJCQkJXAorCSAgICAgICAickkiICgoVVNJdHlwZSkoYmwpKSk7CQkJCQlcCisgICAgZWxzZQkJCQkJCQkJXAorICAgICAgX19hc21fXyAoInthJUk1fGFkZCVJNWN9ICUxLCU0LCU1XG5cdHthZXxhZGRlfSAlMCwlMiwlMyIJCVwKKwkgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksCQkJCQlcCisJICAgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAorCSAgICAgOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwJCQkJCVwKKwkgICAgICAgInIiICgoVVNJdHlwZSkoYmgpKSwJCQkJCVwKKwkgICAgICAgIiVyIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCisJICAgICAgICJySSIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogc3ViX2RkbW1zcyBpcyB1c2VkIGluIG9wLTIuaCBhbmQgdWRpdm1vZHRpNC5jIGFuZCBzaG91bGQgYmUgZXF1aXZhbGVudCB0bworICogI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIChzaCA9IGFoLWJoIC0gKChzbCA9IGFsLWJsKSA+IGFsKSkKKyAqIHN1Yl9kZG1tc3MoaGlnaF9kaWZmZXJlbmNlLCBsb3dfZGlmZmVyZW5jZSwgaGlnaF9taW51ZW5kLCBsb3dfbWludWVuZCwKKyAqIGhpZ2hfc3VidHJhaGVuZCwgbG93X3N1YnRyYWhlbmQpIHN1YnRyYWN0cyB0d28gdHdvLXdvcmQgVVd0eXBlIGludGVnZXJzLAorICogY29tcG9zZWQgYnkgSElHSF9NSU5VRU5EXzEgYW5kIExPV19NSU5VRU5EXzEsIGFuZCBISUdIX1NVQlRSQUhFTkRfMiBhbmQKKyAqIExPV19TVUJUUkFIRU5EXzIgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9ESUZGRVJFTkNFCisgKiBhbmQgTE9XX0RJRkZFUkVOQ0UuICBPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCisgKiBhbmQgaXMgbG9zdC4KKyAqLworI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGFoKSAmJiAoYWgpID09IDApCQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHtzZnplfHN1YmZ6ZX0gJTAsJTIiCVwKKwkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwJCQkJCVwKKwkJICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAorCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGJoKSksCQkJCQlcCisJCSAickkiICgoVVNJdHlwZSkoYWwpKSwJCQkJCVwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOwkJCQkJXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkgJiYgKGFoKSA9PX4oVVNJdHlwZSkgMCkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHtzZm1lfHN1YmZtZX0gJTAsJTIiCVwKKwkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwJCQkJCVwKKwkJICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAorCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGJoKSksCQkJCQlcCisJCSAickkiICgoVVNJdHlwZSkoYWwpKSwJCQkJCVwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOwkJCQkJXAorICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKQkJCVwKKyAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthbWV8YWRkbWV9ICUwLCUyIgkJXAorCSAgICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAorCQkgIj0mciIgKChVU0l0eXBlKShzbCkpCQkJCQlcCisJICAgICAgIDogInIiICgoVVNJdHlwZSkoYWgpKSwJCQkJCVwKKwkJICJySSIgKChVU0l0eXBlKShhbCkpLAkJCQkJXAorCQkgInIiICgoVVNJdHlwZSkoYmwpKSk7CQkJCQlcCisgICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09fihVU0l0eXBlKSAwKQkJXAorICAgICAgX19hc21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiCQlcCisJICAgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksCQkJCQlcCisJCSAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKKwkgICAgICAgOiAiciIgKChVU0l0eXBlKShhaCkpLAkJCQkJXAorCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCisJCSAiciIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICBfX2FzbV9fICgie3NmJUk0fHN1YmYlSTRjfSAlMSwlNSwlNFxuXHR7c2ZlfHN1YmZlfSAlMCwlMywlMiIJXAorCSAgICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAorCQkgIj0mciIgKChVU0l0eXBlKShzbCkpCQkJCQlcCisJICAgICAgIDogInIiICgoVVNJdHlwZSkoYWgpKSwJCQkJCVwKKwkJICJyIiAoKFVTSXR5cGUpKGJoKSksCQkJCQlcCisJCSAickkiICgoVVNJdHlwZSkoYWwpKSwJCQkJCVwKKwkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOwkJCQkJXAorICB9IHdoaWxlICgwKQorCisvKiBhc20gZnJhZ21lbnRzIGZvciBtdWwgYW5kIGRpdiAqLworCisvKiB1bXVsX3BwbW0oaGlnaF9wcm9kLCBsb3dfcHJvZCwgbXVsdGlwbGVyLCBtdWx0aXBsaWNhbmQpIG11bHRpcGxpZXMgdHdvCisgKiBVV3R5cGUgaW50ZWdlcnMgTVVMVElQTEVSIGFuZCBNVUxUSVBMSUNBTkQsIGFuZCBnZW5lcmF0ZXMgYSB0d28gVVd0eXBlCisgKiB3b3JkIHByb2R1Y3QgaW4gSElHSF9QUk9EIGFuZCBMT1dfUFJPRC4KKyAqLworI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7CQkJCQlcCisgICAgX19hc21fXyAoIm11bGh3dSAlMCwlMSwlMiIJCQkJCQlcCisJICAgICA6ICI9ciIgKChVU0l0eXBlKShwaCkpCQkJCQlcCisJICAgICA6ICIlciIgKF9fbTApLAkJCQkJCVwKKyAgICAgICAgICAgICAgICJyIiAoX19tMSkpOwkJCQkJCVwKKyAgICAocGwpID0gX19tMCAqIF9fbTE7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogdWRpdl9xcm5uZChxdW90aWVudCwgcmVtYWluZGVyLCBoaWdoX251bWVyYXRvciwgbG93X251bWVyYXRvciwKKyAqIGRlbm9taW5hdG9yKSBkaXZpZGVzIGEgVURXdHlwZSwgY29tcG9zZWQgYnkgdGhlIFVXdHlwZSBpbnRlZ2VycworICogSElHSF9OVU1FUkFUT1IgYW5kIExPV19OVU1FUkFUT1IsIGJ5IERFTk9NSU5BVE9SIGFuZCBwbGFjZXMgdGhlIHF1b3RpZW50CisgKiBpbiBRVU9USUVOVCBhbmQgdGhlIHJlbWFpbmRlciBpbiBSRU1BSU5ERVIuICBISUdIX05VTUVSQVRPUiBtdXN0IGJlIGxlc3MKKyAqIHRoYW4gREVOT01JTkFUT1IgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLiAgSWYsIGluIGFkZGl0aW9uLCB0aGUgbW9zdAorICogc2lnbmlmaWNhbnQgYml0IG9mIERFTk9NSU5BVE9SIG11c3QgYmUgMSwgdGhlbiB0aGUgcHJlLXByb2Nlc3NvciBzeW1ib2wKKyAqIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiBpcyBkZWZpbmVkIHRvIDEuCisgKi8KKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgVVd0eXBlIF9fZDEsIF9fZDAsIF9fcTEsIF9fcTAsIF9fcjEsIF9fcjAsIF9fbTsJCQlcCisgICAgX19kMSA9IF9fbGxfaGlnaHBhcnQgKGQpOwkJCQkJCVwKKyAgICBfX2QwID0gX19sbF9sb3dwYXJ0IChkKTsJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19yMSA9IChuMSkgJSBfX2QxOwkJCQkJCQlcCisgICAgX19xMSA9IChuMSkgLyBfX2QxOwkJCQkJCQlcCisgICAgX19tID0gKFVXdHlwZSkgX19xMSAqIF9fZDA7CQkJCQkJXAorICAgIF9fcjEgPSBfX3IxICogX19sbF9CIHwgX19sbF9oaWdocGFydCAobjApOwkJCQlcCisgICAgaWYgKF9fcjEgPCBfX20pCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCQlcCisJaWYgKF9fcjEgPj0gKGQpKSAvKiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi8JXAorCSAgaWYgKF9fcjEgPCBfX20pCQkJCQkJXAorCSAgICBfX3ExLS0sIF9fcjEgKz0gKGQpOwkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBfX3IxIC09IF9fbTsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIF9fcjAgPSBfX3IxICUgX19kMTsJCQkJCQkJXAorICAgIF9fcTAgPSBfX3IxIC8gX19kMTsJCQkJCQkJXAorICAgIF9fbSA9IChVV3R5cGUpIF9fcTAgKiBfX2QwOwkJCQkJCVwKKyAgICBfX3IwID0gX19yMCAqIF9fbGxfQiB8IF9fbGxfbG93cGFydCAobjApOwkJCQlcCisgICAgaWYgKF9fcjAgPCBfX20pCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCQlcCisJaWYgKF9fcjAgPj0gKGQpKQkJCQkJCVwKKwkgIGlmIChfX3IwIDwgX19tKQkJCQkJCVwKKwkgICAgX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgX19yMCAtPSBfX207CQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgICAocSkgPSAoVVd0eXBlKSBfX3ExICogX19sbF9CIHwgX19xMDsJCQkJXAorICAgIChyKSA9IF9fcjA7CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDEKKworI2RlZmluZSBhYm9ydCgpCQkJCQkJCQlcCisJcmV0dXJuIDAKKworI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBfX0JZVEVfT1JERVIgX19CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZW5kaWYKKworLyogRXhjZXB0aW9uIGZsYWdzLiAqLworI2RlZmluZSBFRkxBR19JTlZBTElECQkoMSA8PCAoMzEgLSAyKSkKKyNkZWZpbmUgRUZMQUdfT1ZFUkZMT1cJCSgxIDw8ICgzMSAtIDMpKQorI2RlZmluZSBFRkxBR19VTkRFUkZMT1cJCSgxIDw8ICgzMSAtIDQpKQorI2RlZmluZSBFRkxBR19ESVZaRVJPCQkoMSA8PCAoMzEgLSA1KSkKKyNkZWZpbmUgRUZMQUdfSU5FWEFDVAkJKDEgPDwgKDMxIC0gNikpCisKKyNkZWZpbmUgRUZMQUdfVlhTTkFOCQkoMSA8PCAoMzEgLSA3KSkKKyNkZWZpbmUgRUZMQUdfVlhJU0kJCSgxIDw8ICgzMSAtIDgpKQorI2RlZmluZSBFRkxBR19WWElESQkJKDEgPDwgKDMxIC0gOSkpCisjZGVmaW5lIEVGTEFHX1ZYWkRaCQkoMSA8PCAoMzEgLSAxMCkpCisjZGVmaW5lIEVGTEFHX1ZYSU1aCQkoMSA8PCAoMzEgLSAxMSkpCisjZGVmaW5lIEVGTEFHX1ZYVkMJCSgxIDw8ICgzMSAtIDEyKSkKKyNkZWZpbmUgRUZMQUdfVlhTT0ZUCQkoMSA8PCAoMzEgLSAyMSkpCisjZGVmaW5lIEVGTEFHX1ZYU1FSVAkJKDEgPDwgKDMxIC0gMjIpKQorI2RlZmluZSBFRkxBR19WWENWSQkJKDEgPDwgKDMxIC0gMjMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NpZ2luZm8uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKaW5kZXggMTJmMWJjZS4uNDk0OTViMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NpZ2luZm8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2lnaW5mby5oCkBAIC0xNSwxMSArMTUsNiBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgogCi0vKgotICogU0lHVFJBUCBzaV9jb2RlcwotICovCi0jZGVmaW5lIFRSQVBfQlJBTkNICShfX1NJX0ZBVUxUfDMpCS8qIHByb2Nlc3MgdGFrZW4gYnJhbmNoIHRyYXAgKi8KLSNkZWZpbmUgVFJBUF9IV0JLUFQJKF9fU0lfRkFVTFR8NCkJLyogaGFyZHdhcmUgYnJlYWtwb2ludCBvciB3YXRjaHBvaW50ICovCiAjdW5kZWYgTlNJR1RSQVAKICNkZWZpbmUgTlNJR1RSQVAJNAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggNGQyOGUxZS4uMTg2NmNlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtNTYsOSArNTYsMTYgQEAKIAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpCShjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKICNkZWZpbmUgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgCShzbXBfaHdfaW5kZXhbc21wX3Byb2Nlc3Nvcl9pZCgpXSkKLSNkZWZpbmUgZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpCShzbXBfaHdfaW5kZXhbKGNwdSldKQotI2RlZmluZSBzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSwgcGh5cylcCi0JCQkJCShzbXBfaHdfaW5kZXhbKGNwdSldID0gKHBoeXMpKQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGludCBjcHUpCit7CisJcmV0dXJuIHNtcF9od19pbmRleFtjcHVdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChpbnQgY3B1LCBpbnQgcGh5cykKK3sKKwlzbXBfaHdfaW5kZXhbY3B1XSA9IHBoeXM7Cit9CiAjZW5kaWYKIAogREVDTEFSRV9QRVJfQ1BVKGNwdW1hc2tfdCwgY3B1X3NpYmxpbmdfbWFwKTsKQEAgLTg2LDE1ICs5MywyMSBAQAogCiAjZWxzZQogLyogZm9yIFVQICovCi0jZGVmaW5lIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpCQkwCisjZGVmaW5lIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpCQlnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKDApCiAjZGVmaW5lIHNtcF9zZXR1cF9jcHVfbWFwcygpCiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKLSNkZWZpbmUgZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChDUFUpIChwYWNhWyhDUFUpXS5od19jcHVfaWQpCi0jZGVmaW5lIHNldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoQ1BVLCBWQUwpIFwKLQlkbyB7IChwYWNhWyhDUFUpXS5od19jcHVfaWQgPSAoVkFMKSk7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGludCBjcHUpCit7CisJcmV0dXJuIHBhY2FbY3B1XS5od19jcHVfaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGludCBjcHUsIGludCBwaHlzKQoreworCXBhY2FbY3B1XS5od19jcHVfaWQgPSBwaHlzOworfQogCiBleHRlcm4gdm9pZCBzbXBfcmVsZWFzZV9jcHVzKHZvaWQpOwogCkBAIC0xMDIsMTAgKzExNSwxNyBAQAogLyogMzItYml0ICovCiAjaWZuZGVmIENPTkZJR19TTVAKIGV4dGVybiBpbnQgYm9vdF9jcHVpZF9waHlzOwotI2RlZmluZSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSkgCWJvb3RfY3B1aWRfcGh5cwotI2RlZmluZSBzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSwgcGh5cykKLSNlbmRpZgotI2VuZGlmCitzdGF0aWMgaW5saW5lIGludCBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGludCBjcHUpCit7CisJcmV0dXJuIGJvb3RfY3B1aWRfcGh5czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoaW50IGNwdSwgaW50IHBoeXMpCit7CisJYm9vdF9jcHVpZF9waHlzID0gcGh5czsKK30KKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLworI2VuZGlmIC8qICFDT05GSUdfUFBDNjQgKi8KIAogZXh0ZXJuIGludCBzbXRfZW5hYmxlZF9hdF9ib290OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3RhdGZzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3RhdGZzLmgKaW5kZXggNjcwMjQwMi4uNTI0NDgzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N0YXRmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zdGF0ZnMuaApAQCAtMSw2MCArMSw2IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19TVEFURlNfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfU1RBVEZTX0gKIAotLyogRm9yIHBwYzMyIHdlIGp1c3QgdXNlIHRoZSBnZW5lcmljIGRlZmluaXRpb25zLCBub3Qgc28gc2ltcGxlIG9uIHBwYzY0ICovCi0KLSNpZm5kZWYgX19wb3dlcnBjNjRfXwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgotI2Vsc2UKIAotI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotdHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QJZnNpZF90OwotI2VuZGlmCi0KLS8qCi0gKiBXZSdyZSBhbHJlYWR5IDY0LWJpdCwgc28gZHVwbGljYXRlIHRoZSBkZWZpbml0aW9uCi0gKi8KLXN0cnVjdCBzdGF0ZnMgewotCWxvbmcgZl90eXBlOwotCWxvbmcgZl9ic2l6ZTsKLQlsb25nIGZfYmxvY2tzOwotCWxvbmcgZl9iZnJlZTsKLQlsb25nIGZfYmF2YWlsOwotCWxvbmcgZl9maWxlczsKLQlsb25nIGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlsb25nIGZfbmFtZWxlbjsKLQlsb25nIGZfZnJzaXplOwotCWxvbmcgZl9zcGFyZVs1XTsKLX07Ci0KLXN0cnVjdCBzdGF0ZnM2NCB7Ci0JbG9uZyBmX3R5cGU7Ci0JbG9uZyBmX2JzaXplOwotCWxvbmcgZl9ibG9ja3M7Ci0JbG9uZyBmX2JmcmVlOwotCWxvbmcgZl9iYXZhaWw7Ci0JbG9uZyBmX2ZpbGVzOwotCWxvbmcgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCWxvbmcgZl9uYW1lbGVuOwotCWxvbmcgZl9mcnNpemU7Ci0JbG9uZyBmX3NwYXJlWzVdOwotfTsKLQotc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCB7Ci0JX191MzIgZl90eXBlOwotCV9fdTMyIGZfYnNpemU7Ci0JX191NjQgZl9ibG9ja3M7Ci0JX191NjQgZl9iZnJlZTsKLQlfX3U2NCBmX2JhdmFpbDsKLQlfX3U2NCBmX2ZpbGVzOwotCV9fdTY0IGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlfX3UzMiBmX25hbWVsZW47Ci0JX191MzIgZl9mcnNpemU7Ci0JX191MzIgZl9zcGFyZVs1XTsKLX07Ci0jZW5kaWYgLyogISBfX3Bvd2VycGM2NF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaAppbmRleCBmNmNjN2E0Li44MDNkZWYyMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaApAQCAtMzIsNyArMzIsNyBAQAogQ09NUEFUX1NZUyhwdHJhY2UpCiBTWVNDQUxMX1NQVShhbGFybSkKIE9MRFNZUyhmc3RhdCkKLUNPTVBBVF9TWVMocGF1c2UpCitTWVNDQUxMKHBhdXNlKQogQ09NUEFUX1NZUyh1dGltZSkKIFNZU0NBTEwobmlfc3lzY2FsbCkKIFNZU0NBTEwobmlfc3lzY2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMzYxY2Q1Yy4uYTJjNmJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiBleHRlcm4gdm9pZCBfdGxiaWUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgcGlkKTsKK2V4dGVybiB2b2lkIF90bGJpbF9hbGwodm9pZCk7CitleHRlcm4gdm9pZCBfdGxiaWxfcGlkKHVuc2lnbmVkIGludCBwaWQpOworZXh0ZXJuIHZvaWQgX3RsYmlsX3ZhKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IHBpZCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR180MHgpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkKICNkZWZpbmUgX3RsYmlhKCkJYXNtIHZvbGF0aWxlICgidGxiaWE7IHN5bmMiIDogOiA6ICJtZW1vcnkiKQpAQCAtMzgsMzEgKzQxLDMxIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JX3RsYmlhKCk7CisJX3RsYmlsX3BpZChtbS0+Y29udGV4dC5pZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQogewotCV90bGJpZSh2bWFkZHIsIHZtYSA/IHZtYS0+dm1fbW0tPmNvbnRleHQuaWQgOiAwKTsKKwlfdGxiaWxfdmEodm1hZGRyLCB2bWEgPyB2bWEtPnZtX21tLT5jb250ZXh0LmlkIDogMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGFnZV9ub2hhc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSB1bnNpZ25lZCBsb25nIHZtYWRkcikKIHsKLQlfdGxiaWUodm1hZGRyLCB2bWEgPyB2bWEtPnZtX21tLT5jb250ZXh0LmlkIDogMCk7CisJZmx1c2hfdGxiX3BhZ2Uodm1hLCB2bWFkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCV90bGJpYSgpOworCV90bGJpbF9waWQodm1hLT52bV9tbS0+Y29udGV4dC5pZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0JX3RsYmlhKCk7CisJX3RsYmlsX3BpZCgwKTsKIH0KIAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90eXBlcy5oCmluZGV4IGQzMzc0YmMuLmMwMDRjMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90eXBlcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC00OCwxNCArNDgsNyBAQAogCiB0eXBlZGVmIF9fdmVjdG9yMTI4IHZlY3RvcjEyODsKIAotLyogUGh5c2ljYWwgYWRkcmVzcyB1c2VkIGJ5IHNvbWUgSU8gZnVuY3Rpb25zICovCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHX1BIWVNfNjRCSVQpCi10eXBlZGVmIHU2NCBwaHlzX2FkZHJfdDsKLSNlbHNlCi10eXBlZGVmIHUzMiBwaHlzX2FkZHJfdDsKLSNlbmRpZgotCi0jaWZkZWYgX19wb3dlcnBjNjRfXworI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykgfHwgZGVmaW5lZChDT05GSUdfUEhZU182NEJJVCkKIHR5cGVkZWYgdTY0IGRtYV9hZGRyX3Q7CiAjZWxzZQogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY2NzZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3ZtbGludXgubGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA5NDZkYWVhLi5mZGI1ODI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTI4LDEzICsyOCwxNCBAQAogb2JqLXkJCQkJOj0gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCiAJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCi0JCQkJICAgc2lnbmFsLm8KKwkJCQkgICBzaWduYWwubyBzeXNmcy5vCiBvYmoteQkJCQkrPSB2ZHNvMzIvCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBzZXR1cF82NC5vIHN5c19wcGMzMi5vIFwKIAkJCQkgICBzaWduYWxfNjQubyBwdHJhY2UzMi5vIFwKIAkJCQkgICBwYWNhLm8gY3B1X3NldHVwX3BwYzk3MC5vIFwKIAkJCQkgICBjcHVfc2V0dXBfcGE2dC5vIFwKLQkJCQkgICBmaXJtd2FyZS5vIHN5c2ZzLm8gbnZyYW1fNjQubworCQkJCSAgIGZpcm13YXJlLm8gbnZyYW1fNjQubworb2JqNjQtJChDT05GSUdfUkVMT0NBVEFCTEUpCSs9IHJlbG9jXzY0Lm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHZkc282NC8KIG9iai0kKENPTkZJR19BTFRJVkVDKQkJKz0gdmVjZW11Lm8gdmVjdG9yLm8KIG9iai0kKENPTkZJR19QUENfOTcwX05BUCkJKz0gaWRsZV9wb3dlcjQubwpAQCAtNjksMTAgKzcwLDEwIEBACiBleHRyYS15CQkJCSs9IHZtbGludXgubGRzCiAKIG9iai15CQkJCSs9IHRpbWUubyBwcm9tLm8gdHJhcHMubyBzZXR1cC1jb21tb24ubyBcCi0JCQkJICAgdWRiZy5vIG1pc2MubyBpby5vIFwKKwkJCQkgICB1ZGJnLm8gbWlzYy5vIGlvLm8gZG1hLm8gXAogCQkJCSAgIG1pc2NfJChDT05GSUdfV09SRF9TSVpFKS5vCiBvYmotJChDT05GSUdfUFBDMzIpCQkrPSBlbnRyeV8zMi5vIHNldHVwXzMyLm8KLW9iai0kKENPTkZJR19QUEM2NCkJCSs9IGRtYV82NC5vIGlvbW11Lm8KK29iai0kKENPTkZJR19QUEM2NCkJCSs9IGRtYS1pb21tdS5vIGlvbW11Lm8KIG9iai0kKENPTkZJR19LR0RCKQkJKz0ga2dkYi5vCiBvYmotJChDT05GSUdfUFBDX01VTFRJUExBVEZPUk0pCSs9IHByb21faW5pdC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IHBwY19rc3ltcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOTI3NjhkMy4uNzVjNWRkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTIyLDYgKzEyMiw4IEBACiAJREVGSU5FKFBBQ0FTVEFCUlIsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc3RhYl9ycikpOwogCURFRklORShQQUNBUjEsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc2F2ZWRfcjEpKTsKIAlERUZJTkUoUEFDQVRPQywgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBrZXJuZWxfdG9jKSk7CisJREVGSU5FKFBBQ0FLQkFTRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBrZXJuZWxiYXNlKSk7CisJREVGSU5FKFBBQ0FLTVNSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGtlcm5lbF9tc3IpKTsKIAlERUZJTkUoUEFDQVNPRlRJUlFFTiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzb2Z0X2VuYWJsZWQpKTsKIAlERUZJTkUoUEFDQUhBUkRJUlFFTiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBoYXJkX2VuYWJsZWQpKTsKIAlERUZJTkUoUEFDQVNMQkNBQ0hFLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9jYWNoZSkpOwpAQCAtMzUwLDE0ICszNTIsMTUgQEAKICNlbmRpZgogCiAJREVGSU5FKFBHRF9UQUJMRV9TSVpFLCBQR0RfVEFCTEVfU0laRSk7CisJREVGSU5FKFBURV9TSVpFLCBzaXplb2YocHRlX3QpKTsKIAogI2lmZGVmIENPTkZJR19LVk0KIAlERUZJTkUoVExCRV9CWVRFUywgc2l6ZW9mKHN0cnVjdCB0bGJlKSk7CiAKIAlERUZJTkUoVkNQVV9IT1NUX1NUQUNLLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaG9zdF9zdGFjaykpOwogCURFRklORShWQ1BVX0hPU1RfUElELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaG9zdF9waWQpKTsKLQlERUZJTkUoVkNQVV9IT1NUX1RMQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmhvc3RfdGxiKSk7CiAJREVGSU5FKFZDUFVfU0hBRE9XX1RMQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNoYWRvd190bGIpKTsKKwlERUZJTkUoVkNQVV9TSEFET1dfTU9ELCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc2hhZG93X3RsYl9tb2QpKTsKIAlERUZJTkUoVkNQVV9HUFJTLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZ3ByKSk7CiAJREVGSU5FKFZDUFVfTFIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5scikpOwogCURFRklORShWQ1BVX0NSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3IpKTsKQEAgLTM2OSw3ICszNzIsNyBAQAogCURFRklORShWQ1BVX1NQUkc1LCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc3ByZzUpKTsKIAlERUZJTkUoVkNQVV9TUFJHNiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNwcmc2KSk7CiAJREVGSU5FKFZDUFVfU1BSRzcsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zcHJnNykpOwotCURFRklORShWQ1BVX1BJRCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnBpZCkpOworCURFRklORShWQ1BVX1NIQURPV19QSUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaGFkb3dfcGlkKSk7CiAKIAlERUZJTkUoVkNQVV9MQVNUX0lOU1QsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5sYXN0X2luc3QpKTsKIAlERUZJTkUoVkNQVV9GQVVMVF9ERUFSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHRfZGVhcikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCmluZGV4IGQ4ZjAzMjkuLjI2ZTU4NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKQEAgLTQ0MiwyOCArNDQyLDI2IEBACiAKIHZvaWQgYnRleHRfZHJhd2hleCh1bnNpZ25lZCBsb25nIHYpCiB7Ci0JY2hhciAqaGV4X3RhYmxlID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCiAJaWYgKCFib290X3RleHRfbWFwcGVkKQogCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0JYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+IDYwKSAmIDB4MDAwMDAwMEZVTF0pOwotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiA1NikgJiAweDAwMDAwMDBGVUxdKTsKLQlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gNTIpICYgMHgwMDAwMDAwRlVMXSk7Ci0JYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+IDQ4KSAmIDB4MDAwMDAwMEZVTF0pOwotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiA0NCkgJiAweDAwMDAwMDBGVUxdKTsKLQlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gNDApICYgMHgwMDAwMDAwRlVMXSk7Ci0JYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+IDM2KSAmIDB4MDAwMDAwMEZVTF0pOwotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAzMikgJiAweDAwMDAwMDBGVUxdKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2hpKHYgPj4gNTYpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2xvKHYgPj4gNTYpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2hpKHYgPj4gNDgpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2xvKHYgPj4gNDgpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2hpKHYgPj4gNDApKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2xvKHYgPj4gNDApKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2hpKHYgPj4gMzIpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2xvKHYgPj4gMzIpKTsKICNlbmRpZgotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAyOCkgJiAweDAwMDAwMDBGVUxdKTsKLQlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gMjQpICYgMHgwMDAwMDAwRlVMXSk7Ci0JYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+IDIwKSAmIDB4MDAwMDAwMEZVTF0pOwotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAxNikgJiAweDAwMDAwMDBGVUxdKTsKLQlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gMTIpICYgMHgwMDAwMDAwRlVMXSk7Ci0JYnRleHRfZHJhd2NoYXIoaGV4X3RhYmxlWyh2ID4+ICA4KSAmIDB4MDAwMDAwMEZVTF0pOwotCWJ0ZXh0X2RyYXdjaGFyKGhleF90YWJsZVsodiA+PiAgNCkgJiAweDAwMDAwMDBGVUxdKTsKLQlidGV4dF9kcmF3Y2hhcihoZXhfdGFibGVbKHYgPj4gIDApICYgMHgwMDAwMDAwRlVMXSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X2FzY19oaSh2ID4+IDI0KSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X2FzY19sbyh2ID4+IDI0KSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X2FzY19oaSh2ID4+IDE2KSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X2FzY19sbyh2ID4+IDE2KSk7CisJYnRleHRfZHJhd2NoYXIoaGV4X2FzY19oaSh2ID4+IDgpKTsKKwlidGV4dF9kcmF3Y2hhcihoZXhfYXNjX2xvKHYgPj4gOCkpOworCWJ0ZXh0X2RyYXdjaGFyKGhleF9hc2NfaGkodikpOworCWJ0ZXh0X2RyYXdjaGFyKGhleF9hc2NfbG8odikpOwogCWJ0ZXh0X2RyYXdjaGFyKCcgJyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BwYzk3MC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcHBjOTcwLlMKaW5kZXggYmYxMThjMy4uMjdmMjUwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcHBjOTcwLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcHBjOTcwLlMKQEAgLTExMCw3ICsxMTAsNyBAQAogCWlzeW5jCiAKIAkvKiBTYXZlIGF3YXkgY3B1IHN0YXRlICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQorCUxPQURfUkVHX0FERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCiAKIAkvKiBTYXZlIEhJRDAsMSw0IGFuZCA1ICovCiAJbWZzcHIJcjMsU1BSTl9ISUQwCkBAIC0xMzQsNyArMTM0LDcgQEAKIAlybGRpY2wuCXIwLHIwLDQsNjMKIAliZXFscgogCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI1LGNwdV9zdGF0ZV9zdG9yYWdlKQorCUxPQURfUkVHX0FERFIocjUsY3B1X3N0YXRlX3N0b3JhZ2UpCiAJLyogQmVmb3JlIGFjY2Vzc2luZyBtZW1vcnksIHdlIG1ha2Ugc3VyZSBybV9jaSBpcyBjbGVhciAqLwogCWxpCXIwLDAKIAltZnNwcglyMyxTUFJOX0hJRDQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCAyNWMyNzNjLi5lNzBkMDQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC02MTAsNiArNjEwLDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19nZW5lcmljLAogCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCkBAIC02MjMsNiArNjI0LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19nZW5lcmljLAogCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCkBAIC02MzYsNiArNjM4LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19nZW5lcmljLAogCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCkBAIC02NDksNiArNjUyLDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLApAQCAtNjYyLDYgKzY2Niw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKQEAgLTY3NSw2ICs2ODAsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfSUJNLAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19nZW5lcmljLAogCQkucGxhdGZvcm0JCT0gInBwYzc1MCIsCkBAIC02ODgsNiArNjk0LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTAsCiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLApAQCAtNzAxLDYgKzcwOCw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngsCiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLApAQCAtNzE0LDYgKzcyMiw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwZngsCiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLApAQCAtNzI3LDYgKzczNiw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzUwLAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNzUwIiwKQEAgLTc0MSw2ICs3NTEsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfRzQsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQwMCwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19nZW5lcmljLAogCQkucGxhdGZvcm0JCT0gInBwYzc0MDAiLApAQCAtNzU1LDYgKzc2Niw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19HNCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDAwLAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNzQwMCIsCkBAIC03NjksNiArNzgxLDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0c0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0MTAsCiAJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfZ2VuZXJpYywKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NDAwIiwKQEAgLTc4Myw2ICs3OTYsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfRzQsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCkBAIC03OTksNiArODEzLDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0c0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LApAQCAtODE1LDYgKzgzMCw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19HNCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKQEAgLTgzMSw2ICs4NDcsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfRzQsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCkBAIC04NDcsNiArODY0LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0c0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LApAQCAtODYzLDYgKzg4MSw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19HNCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKQEAgLTg3OSw2ICs4OTgsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfRzQsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCkBAIC04OTUsNiArOTE1LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0c0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LApAQCAtOTEwLDYgKzkzMSw3IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19HNCwKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NDV4LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUgICAgICA9ICJwcGMvNzQ1MCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9HNCwKQEAgLTkyNiw2ICs5NDgsNyBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfRzQsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNzQ1eCwKIAkJLm9wcm9maWxlX2NwdV90eXBlICAgICAgPSAicHBjLzc0NTAiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCkBAIC05NDIsNiArOTY1LDcgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0c0LAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc0NXgsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZSAgICAgID0gInBwYy83NDUwIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0c0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyNDhmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCisgKgorICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRE1BIG1hcHBpbmcgY2FsbGJhY2tzIGZvcgorICogYnVzc2VzIHVzaW5nIHRoZSBpb21tdSBpbmZyYXN0cnVjdHVyZQorICovCisKKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKworLyoKKyAqIEdlbmVyaWMgaW9tbXUgaW1wbGVtZW50YXRpb24KKyAqLworCisvKiBBbGxvY2F0ZXMgYSBjb250aWd1b3VzIHJlYWwgYnVmZmVyIGFuZCBjcmVhdGVzIG1hcHBpbmdzIG92ZXIgaXQuCisgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQgc2V0cyBkbWFfaGFuZGxlCisgKiB0byB0aGUgZG1hIGFkZHJlc3MgKG1hcHBpbmcpIG9mIHRoZSBmaXJzdCBwYWdlLgorICovCitzdGF0aWMgdm9pZCAqZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKK3sKKwlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2LCBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLAorCQkJCSAgICBkbWFfaGFuZGxlLCBkZXZpY2VfdG9fbWFzayhkZXYpLCBmbGFnLAorCQkJCSAgICBkZXZfdG9fbm9kZShkZXYpKTsKK30KKworc3RhdGljIHZvaWQgZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlpb21tdV9mcmVlX2NvaGVyZW50KGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKK30KKworLyogQ3JlYXRlcyBUQ0VzIGZvciBhIHVzZXIgcHJvdmlkZWQgYnVmZmVyLiAgVGhlIHVzZXIgYnVmZmVyIG11c3QgYmUKKyAqIGNvbnRpZ3VvdXMgcmVhbCBrZXJuZWwgc3RvcmFnZSAobm90IHZtYWxsb2MpLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogcGFzc2VkIGhlcmUgaXMgdGhlIGtlcm5lbCAodmlydHVhbCkgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLiAgVGhlIGJ1ZmZlcgorICogbmVlZCBub3QgYmUgcGFnZSBhbGlnbmVkLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCB3aWxsIHBvaW50IHRvIHRoZSBzYW1lCisgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KKyAqLworc3RhdGljIGRtYV9hZGRyX3QgZG1hX2lvbW11X21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCQkgICAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJcmV0dXJuIGlvbW11X21hcF9zaW5nbGUoZGV2LCBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCB2YWRkciwgc2l6ZSwKKwkJCQlkZXZpY2VfdG9fbWFzayhkZXYpLCBkaXJlY3Rpb24sIGF0dHJzKTsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSAgIHNpemVfdCBzaXplLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCQkgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlpb21tdV91bm1hcF9zaW5nbGUoZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uLAorCQkJICAgYXR0cnMpOworfQorCisKK3N0YXRpYyBpbnQgZG1hX2lvbW11X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJICAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlyZXR1cm4gaW9tbXVfbWFwX3NnKGRldiwgZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgc2dsaXN0LCBuZWxlbXMsCisJCQkgICAgZGV2aWNlX3RvX21hc2soZGV2KSwgZGlyZWN0aW9uLCBhdHRycyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9pb21tdV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCisJCXN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCWlvbW11X3VubWFwX3NnKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNnbGlzdCwgbmVsZW1zLCBkaXJlY3Rpb24sCisJCSAgICAgICBhdHRycyk7Cit9CisKKy8qIFdlIHN1cHBvcnQgRE1BIHRvL2Zyb20gYW55IG1lbW9yeSBwYWdlIHZpYSB0aGUgaW9tbXUgKi8KK3N0YXRpYyBpbnQgZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldi0+YXJjaGRhdGEuZG1hX2RhdGE7CisKKwlpZiAoIXRibCB8fCB0YmwtPml0X29mZnNldCA+IG1hc2spIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIldhcm5pbmc6IElPTU1VIG9mZnNldCB0b28gYmlnIGZvciBkZXZpY2UgbWFza1xuIik7CisJCWlmICh0YmwpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIm1hc2s6IDB4JTA4bHgsIHRhYmxlIG9mZnNldDogMHglMDhseFxuIiwKKwkJCQltYXNrLCB0YmwtPml0X29mZnNldCk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIm1hc2s6IDB4JTA4bHgsIHRhYmxlIHVuYXZhaWxhYmxlXG4iLAorCQkJCW1hc2spOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgZG1hX2lvbW11X29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQJPSBkbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQJPSBkbWFfaW9tbXVfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZQk9IGRtYV9pb21tdV9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUJPSBkbWFfaW9tbXVfdW5tYXBfc2luZ2xlLAorCS5tYXBfc2cJCT0gZG1hX2lvbW11X21hcF9zZywKKwkudW5tYXBfc2cJPSBkbWFfaW9tbXVfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQJPSBkbWFfaW9tbXVfZG1hX3N1cHBvcnRlZCwKK307CitFWFBPUlRfU1lNQk9MKGRtYV9pb21tdV9vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MmRhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCisgKgorICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRE1BIG1hcHBpbmcgY2FsbGJhY2tzIGZvcgorICogZGlyZWN0bHkgbWFwcGVkIGJ1c3Nlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CisKKy8qCisgKiBHZW5lcmljIGRpcmVjdCBETUEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGEgcGVyLWRldmljZSBvZmZzZXQgdGhhdCBjYW4gYmUgYXBwbGllZCBpZgorICogdGhlIGFkZHJlc3MgYXQgd2hpY2ggbWVtb3J5IGlzIHZpc2libGUgdG8gZGV2aWNlcyBpcyBub3QgMC4gUGxhdGZvcm0gY29kZQorICogY2FuIHNldCBhcmNoZGF0YS5kbWFfZGF0YSB0byBhbiB1bnNpZ25lZCBsb25nIGhvbGRpbmcgdGhlIG9mZnNldC4gQnkKKyAqIGRlZmF1bHQgdGhlIG9mZnNldCBpcyBQQ0lfRFJBTV9PRkZTRVQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2KQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZGV2LT5hcmNoZGF0YS5kbWFfZGF0YTsKKworCXJldHVybiBQQ0lfRFJBTV9PRkZTRVQ7Cit9CisKK3ZvaWQgKmRtYV9kaXJlY3RfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQoreworCXZvaWQgKnJldDsKKyNpZmRlZiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFCisJcmV0ID0gX19kbWFfYWxsb2NfY29oZXJlbnQoc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZyk7CisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkqZG1hX2hhbmRsZSArPSBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKKwlyZXR1cm4gcmV0OworI2Vsc2UKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgbm9kZSA9IGRldl90b19ub2RlKGRldik7CisKKwkvKiBpZ25vcmUgcmVnaW9uIHNwZWNpZmllcnMgKi8KKwlmbGFnICAmPSB+KF9fR0ZQX0hJR0hNRU0pOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAocGFnZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2FicyhyZXQpICsgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KGRldik7CisKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisKK3ZvaWQgZG1hX2RpcmVjdF9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgICAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKwlfX2RtYV9mcmVlX2NvaGVyZW50KHNpemUsIHZhZGRyKTsKKyNlbHNlCisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRtYV9kaXJlY3RfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCQkgICAgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAorCQkJICAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVudHMsIGkpIHsKKwkJc2ctPmRtYV9hZGRyZXNzID0gc2dfcGh5cyhzZykgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKKwkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOworCX0KKworCXJldHVybiBuZW50czsKK30KKworc3RhdGljIHZvaWQgZG1hX2RpcmVjdF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2RpcmVjdF9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJLyogQ291bGQgYmUgaW1wcm92ZWQgdG8gY2hlY2sgZm9yIG1lbW9yeSB0aG91Z2ggaXQgYmV0dGVyIGJlCisJICogZG9uZSB2aWEgc29tZSBnbG9iYWwgc28gcGxhdGZvcm1zIGNhbiBzZXQgdGhlIGxpbWl0IGluIGNhc2UKKwkgKiB0aGV5IGhhdmUgbGltaXRlZCBETUEgd2luZG93cworCSAqLworCXJldHVybiBtYXNrID49IERNQV8zMkJJVF9NQVNLOworI2Vsc2UKKwlyZXR1cm4gMTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX2RpcmVjdF9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgICAgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCQkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCV9fZG1hX3N5bmNfcGFnZShwYWdlLCBvZmZzZXQsIHNpemUsIGRpcik7CisJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldCArIGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2RpcmVjdF91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCisJCQkJCSBzaXplX3Qgc2l6ZSwKKwkJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCQkJIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworfQorCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9kaXJlY3Rfb3BzID0geworCS5hbGxvY19jb2hlcmVudAk9IGRtYV9kaXJlY3RfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQJPSBkbWFfZGlyZWN0X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZwkJPSBkbWFfZGlyZWN0X21hcF9zZywKKwkudW5tYXBfc2cJPSBkbWFfZGlyZWN0X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2RpcmVjdF9kbWFfc3VwcG9ydGVkLAorCS5tYXBfcGFnZQk9IGRtYV9kaXJlY3RfbWFwX3BhZ2UsCisJLnVubWFwX3BhZ2UJPSBkbWFfZGlyZWN0X3VubWFwX3BhZ2UsCit9OworRVhQT1JUX1NZTUJPTChkbWFfZGlyZWN0X29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWFfNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1NzA4ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCi0gKgotICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRE1BIG1hcHBpbmcgY2FsbGJhY2tzIGZvcgotICogZGlyZWN0bHkgbWFwcGVkIGJ1c3NlcyBhbmQgYnVzc2VzIHVzaW5nIHRoZSBpb21tdSBpbmZyYXN0cnVjdHVyZQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGFzbS9idWcuaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KLSNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLQotLyoKLSAqIEdlbmVyaWMgaW9tbXUgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKiBBbGxvY2F0ZXMgYSBjb250aWd1b3VzIHJlYWwgYnVmZmVyIGFuZCBjcmVhdGVzIG1hcHBpbmdzIG92ZXIgaXQuCi0gKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQgc2V0cyBkbWFfaGFuZGxlCi0gKiB0byB0aGUgZG1hIGFkZHJlc3MgKG1hcHBpbmcpIG9mIHRoZSBmaXJzdCBwYWdlLgotICovCi1zdGF0aWMgdm9pZCAqZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKLXsKLQlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2LCBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLAotCQkJCSAgICBkbWFfaGFuZGxlLCBkZXZpY2VfdG9fbWFzayhkZXYpLCBmbGFnLAotCQkJCSAgICBkZXYtPmFyY2hkYXRhLm51bWFfbm9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JaW9tbXVfZnJlZV9jb2hlcmVudChkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7Ci19Ci0KLS8qIENyZWF0ZXMgVENFcyBmb3IgYSB1c2VyIHByb3ZpZGVkIGJ1ZmZlci4gIFRoZSB1c2VyIGJ1ZmZlciBtdXN0IGJlCi0gKiBjb250aWd1b3VzIHJlYWwga2VybmVsIHN0b3JhZ2UgKG5vdCB2bWFsbG9jKS4gIFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIKLSAqIHBhc3NlZCBoZXJlIGlzIHRoZSBrZXJuZWwgKHZpcnR1YWwpIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlci4gIFRoZSBidWZmZXIKLSAqIG5lZWQgbm90IGJlIHBhZ2UgYWxpZ25lZCwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgd2lsbCBwb2ludCB0byB0aGUgc2FtZQotICogYnl0ZSB3aXRoaW4gdGhlIHBhZ2UgYXMgdmFkZHIuCi0gKi8KLXN0YXRpYyBkbWFfYWRkcl90IGRtYV9pb21tdV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsCi0JCQkJICAgICAgIHNpemVfdCBzaXplLAotCQkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCQkJICAgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQotewotCXJldHVybiBpb21tdV9tYXBfc2luZ2xlKGRldiwgZGV2LT5hcmNoZGF0YS5kbWFfZGF0YSwgdmFkZHIsIHNpemUsCi0JCQkJZGV2aWNlX3RvX21hc2soZGV2KSwgZGlyZWN0aW9uLCBhdHRycyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1hX2lvbW11X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkgICBzaXplX3Qgc2l6ZSwKLQkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCQkJICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JaW9tbXVfdW5tYXBfc2luZ2xlKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIGRtYV9oYW5kbGUsIHNpemUsIGRpcmVjdGlvbiwKLQkJCSAgIGF0dHJzKTsKLX0KLQotCi1zdGF0aWMgaW50IGRtYV9pb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJCSAgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCi0JCQkgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JcmV0dXJuIGlvbW11X21hcF9zZyhkZXYsIGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNnbGlzdCwgbmVsZW1zLAotCQkJICAgIGRldmljZV90b19tYXNrKGRldiksIGRpcmVjdGlvbiwgYXR0cnMpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW9tbXVfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAotCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKLXsKLQlpb21tdV91bm1hcF9zZyhkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzZ2xpc3QsIG5lbGVtcywgZGlyZWN0aW9uLAotCQkgICAgICAgYXR0cnMpOwotfQotCi0vKiBXZSBzdXBwb3J0IERNQSB0by9mcm9tIGFueSBtZW1vcnkgcGFnZSB2aWEgdGhlIGlvbW11ICovCi1zdGF0aWMgaW50IGRtYV9pb21tdV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0Jc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhOwotCi0JaWYgKCF0YmwgfHwgdGJsLT5pdF9vZmZzZXQgPiBtYXNrKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJXYXJuaW5nOiBJT01NVSBvZmZzZXQgdG9vIGJpZyBmb3IgZGV2aWNlIG1hc2tcbiIpOwotCQlpZiAodGJsKQotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJtYXNrOiAweCUwOGx4LCB0YWJsZSBvZmZzZXQ6IDB4JTA4bHhcbiIsCi0JCQkJbWFzaywgdGJsLT5pdF9vZmZzZXQpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJtYXNrOiAweCUwOGx4LCB0YWJsZSB1bmF2YWlsYWJsZVxuIiwKLQkJCQltYXNrKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9pb21tdV9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50CT0gZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50CT0gZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUJPSBkbWFfaW9tbXVfbWFwX3NpbmdsZSwKLQkudW5tYXBfc2luZ2xlCT0gZG1hX2lvbW11X3VubWFwX3NpbmdsZSwKLQkubWFwX3NnCQk9IGRtYV9pb21tdV9tYXBfc2csCi0JLnVubWFwX3NnCT0gZG1hX2lvbW11X3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCi19OwotRVhQT1JUX1NZTUJPTChkbWFfaW9tbXVfb3BzKTsKLQotLyoKLSAqIEdlbmVyaWMgZGlyZWN0IERNQSBpbXBsZW1lbnRhdGlvbgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYSBwZXItZGV2aWNlIG9mZnNldCB0aGF0IGNhbiBiZSBhcHBsaWVkIGlmCi0gKiB0aGUgYWRkcmVzcyBhdCB3aGljaCBtZW1vcnkgaXMgdmlzaWJsZSB0byBkZXZpY2VzIGlzIG5vdCAwLiBQbGF0Zm9ybSBjb2RlCi0gKiBjYW4gc2V0IGFyY2hkYXRhLmRtYV9kYXRhIHRvIGFuIHVuc2lnbmVkIGxvbmcgaG9sZGluZyB0aGUgb2Zmc2V0LiBCeQotICogZGVmYXVsdCB0aGUgb2Zmc2V0IGlzIHplcm8uCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZGV2LT5hcmNoZGF0YS5kbWFfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgKmRtYV9kaXJlY3RfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICpyZXQ7Ci0JaW50IG5vZGUgPSBkZXYtPmFyY2hkYXRhLm51bWFfbm9kZTsKLQotCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIGZsYWcsIGdldF9vcmRlcihzaXplKSk7Ci0JaWYgKHBhZ2UgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCW1lbXNldChyZXQsIDAsIHNpemUpOwotCSpkbWFfaGFuZGxlID0gdmlydF90b19hYnMocmV0KSArIGdldF9kbWFfZGlyZWN0X29mZnNldChkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2RpcmVjdF9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQotewotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Ci19Ci0KLXN0YXRpYyBkbWFfYWRkcl90IGRtYV9kaXJlY3RfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwKLQkJCQkJc2l6ZV90IHNpemUsCi0JCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKLQkJCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0JcmV0dXJuIHZpcnRfdG9fYWJzKHB0cikgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2RpcmVjdF91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAotCQkJCSAgICBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAotCQkJCSAgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKLXsKLX0KLQotc3RhdGljIGludCBkbWFfZGlyZWN0X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAotCQkJICAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKLQkJCSAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKSB7Ci0JCXNnLT5kbWFfYWRkcmVzcyA9IHNnX3BoeXMoc2cpICsgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KGRldik7Ci0JCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKLQl9Ci0KLQlyZXR1cm4gbmVudHM7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9kaXJlY3RfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAotCQkJCXN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQotewotfQotCi1zdGF0aWMgaW50IGRtYV9kaXJlY3RfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCS8qIENvdWxkIGJlIGltcHJvdmVkIHRvIGNoZWNrIGZvciBtZW1vcnkgdGhvdWdoIGl0IGJldHRlciBiZQotCSAqIGRvbmUgdmlhIHNvbWUgZ2xvYmFsIHNvIHBsYXRmb3JtcyBjYW4gc2V0IHRoZSBsaW1pdCBpbiBjYXNlCi0JICogdGhleSBoYXZlIGxpbWl0ZWQgRE1BIHdpbmRvd3MKLQkgKi8KLQlyZXR1cm4gbWFzayA+PSBETUFfMzJCSVRfTUFTSzsKLX0KLQotc3RydWN0IGRtYV9tYXBwaW5nX29wcyBkbWFfZGlyZWN0X29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQJPSBkbWFfZGlyZWN0X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50CT0gZG1hX2RpcmVjdF9mcmVlX2NvaGVyZW50LAotCS5tYXBfc2luZ2xlCT0gZG1hX2RpcmVjdF9tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUJPSBkbWFfZGlyZWN0X3VubWFwX3NpbmdsZSwKLQkubWFwX3NnCQk9IGRtYV9kaXJlY3RfbWFwX3NnLAotCS51bm1hcF9zZwk9IGRtYV9kaXJlY3RfdW5tYXBfc2csCi0JLmRtYV9zdXBwb3J0ZWQJPSBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCi19OwotRVhQT1JUX1NZTUJPTChkbWFfZGlyZWN0X29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggMmQ4MDJlOS4uZmQ4YjRiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtNTEyLDMxICs1MTIsMTIgQEAKICNlbmRpZgogCiByZXN0b3JlOgotCWxkCXI1LFNPRlRFKHIxKQotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogQkVHSU5fRldfRlRSX1NFQ1RJT04KLQljbXBkaQkwLHI1LDAKLQliZXEJNGYKLQkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzIChpU2VyaWVzKSAqLwotCWxkCXIzLFBBQ0FMUFBBQ0FQVFIocjEzKQotCWxkCXIzLExQUEFDQUFOWUlOVChyMykKLQljbXBkaQlyMywwCi0JYmVxKwk0ZgkJCS8qIHNraXAgZG9fSVJRIGlmIG5vIGludGVycnVwdHMgKi8KLQotCWxpCXIzLDAKLQlzdGIJcjMsUEFDQVNPRlRJUlFFTihyMTMpCS8qIGVuc3VyZSB3ZSBhcmUgc29mdC1kaXNhYmxlZCAqLwotI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCWJsCS50cmFjZV9oYXJkaXJxc19vZmYKLQltZm1zcglyMTAKLSNlbmRpZgotCW9yaQlyMTAscjEwLE1TUl9FRQotCW10bXNyZAlyMTAJCQkvKiBoYXJkLWVuYWJsZSBhZ2FpbiAqLwotCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlibAkuZG9fSVJRCi0JYgkucmV0X2Zyb21fZXhjZXB0X2xpdGUJCS8qIGxvb3AgYmFjayBhbmQgaGFuZGxlIG1vcmUgKi8KLTQ6Ci1FTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQotI2VuZGlmCisJbGQJcjUsU09GVEUocjEpCitGV19GVFJfU0VDVElPTl9FTFNFCisJYglpc2VyaWVzX2NoZWNrX3BlbmRpbmdfaXJxcworQUxUX0ZXX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCisyOgogCVRSQUNFX0FORF9SRVNUT1JFX0lSUShyNSk7CiAKIAkvKiBleHRyYWN0IEVFIGJpdCBhbmQgdXNlIGl0IHRvIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCkBAIC01OTIsNiArNTczLDMwIEBACiAJcmZpZAogCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwogCitpc2VyaWVzX2NoZWNrX3BlbmRpbmdfaXJxczoKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKKwlsZAlyNSxTT0ZURShyMSkKKwljbXBkaQkwLHI1LDAKKwliZXEJMmIKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzIChpU2VyaWVzKSAqLworCWxkCXIzLFBBQ0FMUFBBQ0FQVFIocjEzKQorCWxkCXIzLExQUEFDQUFOWUlOVChyMykKKwljbXBkaQlyMywwCisJYmVxKwkyYgkJCS8qIHNraXAgZG9fSVJRIGlmIG5vIGludGVycnVwdHMgKi8KKworCWxpCXIzLDAKKwlzdGIJcjMsUEFDQVNPRlRJUlFFTihyMTMpCS8qIGVuc3VyZSB3ZSBhcmUgc29mdC1kaXNhYmxlZCAqLworI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWJsCS50cmFjZV9oYXJkaXJxc19vZmYKKwltZm1zcglyMTAKKyNlbmRpZgorCW9yaQlyMTAscjEwLE1TUl9FRQorCW10bXNyZAlyMTAJCQkvKiBoYXJkLWVuYWJsZSBhZ2FpbiAqLworCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAkuZG9fSVJRCisJYgkucmV0X2Zyb21fZXhjZXB0X2xpdGUJCS8qIGxvb3AgYmFjayBhbmQgaGFuZGxlIG1vcmUgKi8KKyNlbmRpZgorCiBkb193b3JrOgogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJYW5kaS4JcjAscjMsTVNSX1BSCS8qIFJldHVybmluZyB0byB1c2VyIG1vZGU/ICovCkBAIC02ODUsMTAgKzY5MCw2IEBACiAJc3RkCXI3LF9EQVIocjEpCiAJbWZkc2lzcglyOAogCXN0ZAlyOCxfRFNJU1IocjEpCi0JbWZzcnIwCXI5Ci0Jc3RkCXI5LF9TUlIwKHIxKQotCW1mc3JyMQlyMTAKLQlzdGQJcjEwLF9TUlIxKHIxKQogCiAJLyogVGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gY2xlYXIgQ1IgdW50aWwgUlRBUyBjYW4gYmUgbW9kaWZpZWQgdG8KIAkgKiBpZ25vcmUgYWxsIGJpdHMuCkBAIC03NDksNiArNzUwLDEwIEBACiAJbWZzcHIJcjQsU1BSTl9TUFJHMwkgICAgICAgIC8qIEdldCBQQUNBICovCiAJY2xybGRpCXI0LHI0LDIJCQkvKiBjb252ZXJ0IHRvIHJlYWxtb2RlIGFkZHJlc3MgKi8KIAorCWJjbAkyMCwzMSwkKzQKKzA6CW1mbHIJcjMKKwlsZAlyMywoMWYtMGIpKHIzKQkJLyogZ2V0ICYucnRhc19yZXN0b3JlX3JlZ3MgKi8KKwogCW1mbXNyICAgcjYKIAlsaQlyMCxNU1JfUkkKIAlhbmRjCXI2LHI2LHIwCkBAIC03NTYsNyArNzYxLDYgQEAKIAltdG1zcmQgIHI2CiAgICAgICAgIAogICAgICAgICBsZAlyMSxQQUNBUjEocjQpICAgICAgICAgICAvKiBSZXN0b3JlIG91ciBTUCAqLwotCUxPQURfUkVHX0lNTUVESUFURShyMywucnRhc19yZXN0b3JlX3JlZ3MpCiAgICAgICAgIGxkCXI0LFBBQ0FTQVZFRE1TUihyNCkgICAgIC8qIFJlc3RvcmUgb3VyIE1TUiAqLwogCiAJbXRzcHIJU1BSTl9TUlIwLHIzCkBAIC03NjQsNiArNzY4LDkgQEAKIAlyZmlkCiAJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCiAKKwkuYWxpZ24JMworMToJLmxsb25nCS5ydGFzX3Jlc3RvcmVfcmVncworCiBfU1RBVElDKHJ0YXNfcmVzdG9yZV9yZWdzKQogCS8qIHJlbG9jYXRpb24gaXMgb24gYXQgdGhpcyBwb2ludCAqLwogCVJFU1RfR1BSKDIsIHIxKQkJCS8qIFJlc3RvcmUgdGhlIFRPQyAqLwpAQCAtNzgzLDEwICs3OTAsNiBAQAogCW10ZGFyCXI3CiAJbGQJcjgsX0RTSVNSKHIxKQogCW10ZHNpc3IJcjgKLQlsZAlyOSxfU1JSMChyMSkKLQltdHNycjAJcjkKLQlsZAlyMTAsX1NSUjEocjEpCi0JbXRzcnIxCXIxMAogCiAgICAgICAgIGFkZGkJcjEscjEsUlRBU19GUkFNRV9TSVpFCS8qIFVuc3RhY2sgb3VyIGZyYW1lICovCiAJbGQJcjAsMTYocjEpCQkvKiBnZXQgcmV0dXJuIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggOGJiNjU3NS4uMGMzMjY4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTExMCw2ICsxMTAsMTIgQEAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIAljbXB3aQkwLHI1LDAKIAliZXEJMWYKKworCS8qIGZpbmQgb3V0IHdoZXJlIHdlIGFyZSBub3cgKi8KKwliY2wJMjAsMzEsJCs0CiswOgltZmxyCXI4CQkJLyogcjggPSBydW50aW1lIGFkZHIgaGVyZSAqLworCWFkZGlzCXI4LHI4LChfc3RleHQgLSAwYilAaGEKKwlhZGRpCXI4LHI4LChfc3RleHQgLSAwYilAbAkvKiBjdXJyZW50IHJ1bnRpbWUgYmFzZSBhZGRyICovCiAJYmwJcHJvbV9pbml0CiAJdHJhcAogI2VuZGlmCkBAIC0zNjksMTMgKzM3NSwxMyBAQAogRGF0YUFjY2VzczoKIAlFWENFUFRJT05fUFJPTE9HCiAJbWZzcHIJcjEwLFNQUk5fRFNJU1IKKwlzdHcJcjEwLF9EU0lTUihyMTEpCiAJYW5kaXMuCXIwLHIxMCwweGE0NzAJCS8qIHdlaXJkIGVycm9yPyAqLwogCWJuZQkxZgkJCS8qIGlmIG5vdCwgdHJ5IHRvIHB1dCBhIFBURSAqLwogCW1mc3ByCXI0LFNQUk5fREFSCQkvKiBpbnRvIHRoZSBoYXNoIHRhYmxlICovCiAJcmx3aW5tCXIzLHIxMCwzMi0xNSwyMSwyMQkvKiBEU0lTUl9TVE9SRSAtPiBfUEFHRV9SVyAqLwogCWJsCWhhc2hfcGFnZQotMToJc3R3CXIxMCxfRFNJU1IocjExKQotCW1yCXI1LHIxMAorMToJbHd6CXI1LF9EU0lTUihyMTEpCQkvKiBnZXQgRFNJU1IgdmFsdWUgKi8KIAltZnNwcglyNCxTUFJOX0RBUgogCUVYQ19YRkVSX0VFX0xJVEUoMHgzMDAsIGhhbmRsZV9wYWdlX2ZhdWx0KQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IGNjOGZiNDcuLjg0ODU2YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC04Miw3ICs4MiwxMSBAQAogCS8qIENhdGNoIGJyYW5jaCB0byAwIGluIHJlYWwgbW9kZSAqLwogCXRyYXAKIAotCS8qIFNlY29uZGFyeSBwcm9jZXNzb3JzIHNwaW4gb24gdGhpcyB2YWx1ZSB1bnRpbCBpdCBnb2VzIHRvIDEuICovCisJLyogU2Vjb25kYXJ5IHByb2Nlc3NvcnMgc3BpbiBvbiB0aGlzIHZhbHVlIHVudGlsIGl0IGJlY29tZXMgbm9uemVyby4KKwkgKiBXaGVuIGl0IGRvZXMgaXQgY29udGFpbnMgdGhlIHJlYWwgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcgorCSAqIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHRoZSBjcHUgc2hvdWxkIGp1bXAgdG8gdG8gY29udGludWUKKwkgKiBpbml0aWFsaXphdGlvbi4KKwkgKi8KIAkuZ2xvYmwgIF9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3AKIF9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3A6CiAJLmxsb25nCTB4MApAQCAtMTA5LDggKzExMywxMSBAQAogICogYmVmb3JlIHRoZSBidWxrIG9mIHRoZSBrZXJuZWwgaGFzIGJlZW4gcmVsb2NhdGVkLiAgVGhpcyBjb2RlCiAgKiBpcyByZWxvY2F0ZWQgdG8gcGh5c2ljYWwgYWRkcmVzcyAweDYwIGJlZm9yZSBwcm9tX2luaXQgaXMgcnVuLgogICogQWxsIG9mIGl0IG11c3QgZml0IGJlbG93IHRoZSBmaXJzdCBleGNlcHRpb24gdmVjdG9yIGF0IDB4MTAwLgorICogVXNlIC5nbG9ibCBoZXJlIG5vdCBfR0xPQkFMIGJlY2F1c2Ugd2Ugd2FudCBfX3NlY29uZGFyeV9ob2xkCisgKiB0byBiZSB0aGUgYWN0dWFsIHRleHQgYWRkcmVzcywgbm90IGEgZGVzY3JpcHRvci4KICAqLwotX0dMT0JBTChfX3NlY29uZGFyeV9ob2xkKQorCS5nbG9ibAlfX3NlY29uZGFyeV9ob2xkCitfX3NlY29uZGFyeV9ob2xkOgogCW1mbXNyCXIyNAogCW9yaQlyMjQscjI0LE1TUl9SSQogCW10bXNyZAlyMjQJCQkvKiBSSSBvbiAqLwpAQCAtMTIxLDE2ICsxMjgsMTYgQEAKIAkvKiBUZWxsIHRoZSBtYXN0ZXIgY3B1IHdlJ3JlIGhlcmUgKi8KIAkvKiBSZWxvY2F0aW9uIGlzIG9mZiAmIHdlIGFyZSBsb2NhdGVkIGF0IGFuIGFkZHJlc3MgbGVzcyAqLwogCS8qIHRoYW4gMHgxMDAsIHNvIG9ubHkgbmVlZCB0byBncmFiIGxvdyBvcmRlciBvZmZzZXQuICAgICovCi0Jc3RkCXIyNCxfX3NlY29uZGFyeV9ob2xkX2Fja25vd2xlZGdlQGwoMCkKKwlzdGQJcjI0LF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UtX3N0ZXh0KDApCiAJc3luYwogCiAJLyogQWxsIHNlY29uZGFyeSBjcHVzIHdhaXQgaGVyZSB1bnRpbCB0b2xkIHRvIHN0YXJ0LiAqLwotMTAwOglsZAlyNCxfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wQGwoMCkKLQljbXBkaQkwLHI0LDEKLQlibmUJMTAwYgorMTAwOglsZAlyNCxfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wLV9zdGV4dCgwKQorCWNtcGRpCTAscjQsMAorCWJlcQkxMDBiCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0tFWEVDKQotCUxPQURfUkVHX0lNTUVESUFURShyNCwgLmdlbmVyaWNfc2Vjb25kYXJ5X3NtcF9pbml0KQorCWxkCXI0LDAocjQpCQkvKiBkZXJlZiBmdW5jdGlvbiBkZXNjcmlwdG9yICovCiAJbXRjdHIJcjQKIAltcglyMyxyMjQKIAliY3RyCkBAIC0xNDcsNiArMTU0LDEwIEBACiAvKgogICogVGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVycyBmb3IgcFNlcmllcwogICogVGhpcyBjb2RlIHJ1bnMgd2l0aCByZWxvY2F0aW9uIG9mZi4KKyAqIENvZGUgZnJvbSBoZXJlIHRvIF9fZW5kX2ludGVycnVwdHMgZ2V0cyBjb3BpZWQgZG93biB0byByZWFsCisgKiBhZGRyZXNzIDB4MTAwIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYSByZWxvY2F0YWJsZSBrZXJuZWwuCisgKiBUaGVyZWZvcmUgYW55IHJlbGF0aXZlIGJyYW5jaGVzIGluIHRoaXMgc2VjdGlvbiBtdXN0IG9ubHkKKyAqIGJyYW5jaCB0byBsYWJlbHMgaW4gdGhpcyBzZWN0aW9uLgogICovCiAJLiA9IDB4MTAwCiAJLmdsb2JsIF9fc3RhcnRfaW50ZXJydXB0cwpAQCAtMjAwLDcgKzIxMSwyMCBAQAogCW1mc3ByCXIxMCxTUFJOX1NQUkcxCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMyhyMTMpCiAJbWZzcHIJcjEyLFNQUk5fU1JSMQkJLyogYW5kIFNSUjEgKi8KLQliCS5zbGJfbWlzc19yZWFsbW9kZQkvKiBSZWwuIGJyYW5jaCB3b3JrcyBpbiByZWFsIG1vZGUgKi8KKyNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYgkuc2xiX21pc3NfcmVhbG1vZGUKKyNlbHNlCisJLyoKKwkgKiBXZSBjYW4ndCBqdXN0IHVzZSBhIGRpcmVjdCBicmFuY2ggdG8gLnNsYl9taXNzX3JlYWxtb2RlCisJICogYmVjYXVzZSB0aGUgZGlzdGFuY2UgZnJvbSBoZXJlIHRvIHRoZXJlIGRlcGVuZHMgb24gd2hlcmUKKwkgKiB0aGUga2VybmVsIGVuZHMgdXAgYmVpbmcgcHV0LgorCSAqLworCW1mY3RyCXIxMQorCWxkCXIxMCxQQUNBS0JBU0UocjEzKQorCUxPQURfSEFORExFUihyMTAsIC5zbGJfbWlzc19yZWFsbW9kZSkKKwltdGN0cglyMTAKKwliY3RyCisjZW5kaWYKIAogCVNURF9FWENFUFRJT05fUFNFUklFUygweDQwMCwgaW5zdHJ1Y3Rpb25fYWNjZXNzKQogCkBAIC0yMjUsNyArMjQ5LDE1IEBACiAJbWZzcHIJcjEwLFNQUk5fU1BSRzEKIAlzdGQJcjEwLFBBQ0FfRVhTTEIrRVhfUjEzKHIxMykKIAltZnNwcglyMTIsU1BSTl9TUlIxCQkvKiBhbmQgU1JSMSAqLwotCWIJLnNsYl9taXNzX3JlYWxtb2RlCS8qIFJlbC4gYnJhbmNoIHdvcmtzIGluIHJlYWwgbW9kZSAqLworI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwliCS5zbGJfbWlzc19yZWFsbW9kZQorI2Vsc2UKKwltZmN0cglyMTEKKwlsZAlyMTAsUEFDQUtCQVNFKHIxMykKKwlMT0FEX0hBTkRMRVIocjEwLCAuc2xiX21pc3NfcmVhbG1vZGUpCisJbXRjdHIJcjEwCisJYmN0cgorI2VuZGlmCiAKIAlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMCwgaGFyZHdhcmVfaW50ZXJydXB0KQogCVNURF9FWENFUFRJT05fUFNFUklFUygweDYwMCwgYWxpZ25tZW50KQpAQCAtMjQ0LDE0ICsyNzYsMTIgQEAKIAliZXEtCTFmCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9SRUFMX0xFKQogCW1yCXI5LHIxMwotCW1mbXNyCXIxMAogCW1mc3ByCXIxMyxTUFJOX1NQUkczCiAJbWZzcHIJcjExLFNQUk5fU1JSMAotCWNscnJkaQlyMTIscjEzLDMyCi0Jb3JpcwlyMTIscjEyLHN5c3RlbV9jYWxsX2NvbW1vbkBoCi0Jb3JpCXIxMixyMTIsc3lzdGVtX2NhbGxfY29tbW9uQGwKKwlsZAlyMTIsUEFDQUtCQVNFKHIxMykKKwlsZAlyMTAsUEFDQUtNU1IocjEzKQorCUxPQURfSEFORExFUihyMTIsIHN5c3RlbV9jYWxsX2VudHJ5KQogCW10c3ByCVNQUk5fU1JSMCxyMTIKLQlvcmkJcjEwLHIxMCxNU1JfSVJ8TVNSX0RSfE1TUl9SSQogCW1mc3ByCXIxMixTUFJOX1NSUjEKIAltdHNwcglTUFJOX1NSUjEscjEwCiAJcmZpZApAQCAtMzI1LDE2ICszNTUsMzIgQEAKIAltZnNwcglyMTIsU1BSTl9TUFJHMgogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYU0xCLCAuZG9fc3RhYl9ib2x0ZWQpCiAKKyNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIC8qCi0gKiBXZSBoYXZlIHNvbWUgcm9vbSBoZXJlICB3ZSB1c2UgdGhhdCB0byBwdXQKLSAqIHRoZSBwZXJpZXMgc2xiIG1pc3MgdXNlciB0cmFtcG9saW5lIGNvZGUgc28gaXQncyByZWFzb25hYmx5Ci0gKiBhd2F5IGZyb20gc2xiX21pc3NfdXNlcl9jb21tb24gdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCByZmlkCi0gKgorICogVmVjdG9ycyBmb3IgdGhlIEZXTk1JIG9wdGlvbi4gIFNoYXJlIGNvbW1vbiBjb2RlLgorICovCisJLmdsb2JsIHN5c3RlbV9yZXNldF9md25taQorICAgICAgLmFsaWduIDcKK3N5c3RlbV9yZXNldF9md25taToKKwlITVRfTUVESVVNCisJbXRzcHIJU1BSTl9TUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIHN5c3RlbV9yZXNldF9jb21tb24pCisKKwkuZ2xvYmwgbWFjaGluZV9jaGVja19md25taQorICAgICAgLmFsaWduIDcKK21hY2hpbmVfY2hlY2tfZndubWk6CisJSE1UX01FRElVTQorCW10c3ByCVNQUk5fU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uKQorCisjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCisKKyNpZmRlZiBfX0RJU0FCTEVEX18KKy8qCiAgKiBUaGlzIGlzIHVzZWQgZm9yIHdoZW4gdGhlIFNMQiBtaXNzIGhhbmRsZXIgaGFzIHRvIGdvIHZpcnR1YWwsCiAgKiB3aGljaCBkb2Vzbid0IGhhcHBlbiBmb3Igbm93IGFueW1vcmUgYnV0IHdpbGwgb25jZSB3ZSByZS1pbXBsZW1lbnQKICAqIGR5bmFtaWMgVlNJRHMgZm9yIHNoYXJlZCBwYWdlIHRhYmxlcwogICovCi0jaWZkZWYgX19ESVNBQkxFRF9fCiBzbGJfbWlzc191c2VyX3BzZXJpZXM6CiAJc3RkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpCiAJc3RkCXIxMSxQQUNBX0VYR0VOK0VYX1IxMShyMTMpCkBAIC0zNTcsMjUgKzQwMywxNyBAQAogCWIJLgkJCQkvKiBwcmV2ZW50IHNwZWMuIGV4ZWN1dGlvbiAqLwogI2VuZGlmIC8qIF9fRElTQUJMRURfXyAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisJLmFsaWduCTcKKwkuZ2xvYmwJX19lbmRfaW50ZXJydXB0cworX19lbmRfaW50ZXJydXB0czoKKwogLyoKLSAqIFZlY3RvcnMgZm9yIHRoZSBGV05NSSBvcHRpb24uICBTaGFyZSBjb21tb24gY29kZS4KKyAqIENvZGUgZnJvbSBoZXJlIGRvd24gdG8gX19lbmRfaGFuZGxlcnMgaXMgaW52b2tlZCBmcm9tIHRoZQorICogZXhjZXB0aW9uIHByb2xvZ3MgYWJvdmUuICBCZWNhdXNlIHRoZSBwcm9sb2dzIGFzc2VtYmxlIHRoZQorICogYWRkcmVzc2VzIG9mIHRoZXNlIGhhbmRsZXJzIHVzaW5nIHRoZSBMT0FEX0hBTkRMRVIgbWFjcm8sCisgKiB3aGljaCB1c2VzIGFuIGFkZGkgaW5zdHJ1Y3Rpb24sIHRoZXNlIGhhbmRsZXJzIG11c3QgYmUgaW4KKyAqIHRoZSBmaXJzdCAzMmsgb2YgdGhlIGtlcm5lbCBpbWFnZS4KICAqLwotCS5nbG9ibCBzeXN0ZW1fcmVzZXRfZndubWkKLSAgICAgIC5hbGlnbiA3Ci1zeXN0ZW1fcmVzZXRfZndubWk6Ci0JSE1UX01FRElVTQotCW10c3ByCVNQUk5fU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLwotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU19GT1JDRV82NEJJVChQQUNBX0VYR0VOLCBzeXN0ZW1fcmVzZXRfY29tbW9uKQotCi0JLmdsb2JsIG1hY2hpbmVfY2hlY2tfZndubWkKLSAgICAgIC5hbGlnbiA3Ci1tYWNoaW5lX2NoZWNrX2Z3bm1pOgotCUhNVF9NRURJVU0KLQltdHNwcglTUFJOX1NQUkcxLHIxMwkJLyogc2F2ZSByMTMgKi8KLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfRk9SQ0VfNjRCSVQoUEFDQV9FWE1DLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKLQotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogCiAvKioqIENvbW1vbiBpbnRlcnJ1cHQgaGFuZGxlcnMgKioqLwogCkBAIC00MTQsNiArNDUyLDEwIEBACiAJU1REX0VYQ0VQVElPTl9DT01NT04oMHgxODAwLCBjYmVfdGhlcm1hbCwgLmNiZV90aGVybWFsX2V4Y2VwdGlvbikKICNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwogCisJLmFsaWduCTcKK3N5c3RlbV9jYWxsX2VudHJ5OgorCWIJc3lzdGVtX2NhbGxfY29tbW9uCisKIC8qCiAgKiBIZXJlIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGUga2VybmVsIHN0YWNrIHBvaW50ZXIgaXMgYmFkLgogICogUjkgY29udGFpbnMgdGhlIHNhdmVkIENSLCByMTMgcG9pbnRzIHRvIHRoZSBwYWNhLApAQCAtNDU3LDY1ICs0OTksNiBAQAogCWIJMWIKIAogLyoKLSAqIFJldHVybiBmcm9tIGFuIGV4Y2VwdGlvbiB3aXRoIG1pbmltYWwgY2hlY2tzLgotICogVGhlIGNhbGxlciBpcyBhc3N1bWVkIHRvIGhhdmUgZG9uZSBFWENFUFRJT05fUFJPTE9HX0NPTU1PTi4KLSAqIElmIGludGVycnVwdHMgaGF2ZSBiZWVuIGVuYWJsZWQsIG9yIGFueXRoaW5nIGhhcyBiZWVuCi0gKiBkb25lIHRoYXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZSBzY2hlZHVsaW5nIHN0YXR1cyBvZgotICogYW55IHRhc2sgb3Igc2VudCBhbnkgdGFzayBhIHNpZ25hbCwgeW91IHNob3VsZCB1c2UKLSAqIHJldF9mcm9tX2V4Y2VwdCBvciByZXRfZnJvbV9leGNlcHRfbGl0ZSBpbnN0ZWFkIG9mIHRoaXMuCi0gKi8KLWZhc3RfZXhjX3JldHVybl9pcnE6CQkJLyogcmVzdG9yZXMgaXJxIHN0YXRlIHRvbyAqLwotCWxkCXIzLFNPRlRFKHIxKQotCVRSQUNFX0FORF9SRVNUT1JFX0lSUShyMyk7Ci0JbGQJcjEyLF9NU1IocjEpCi0JcmxkaWNsCXI0LHIxMiw0OSw2MwkJLyogZ2V0IE1TUl9FRSB0byBMU0IgKi8KLQlzdGIJcjQsUEFDQUhBUkRJUlFFTihyMTMpCS8qIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCi0JYgkxZgotCi0JLmdsb2JsCWZhc3RfZXhjZXB0aW9uX3JldHVybgotZmFzdF9leGNlcHRpb25fcmV0dXJuOgotCWxkCXIxMixfTVNSKHIxKQotMToJbGQJcjExLF9OSVAocjEpCi0JYW5kaS4JcjMscjEyLE1TUl9SSQkJLyogY2hlY2sgaWYgUkkgaXMgc2V0ICovCi0JYmVxLQl1bnJlY292X2ZlcgotCi0jaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKLQlhbmRpLglyMyxyMTIsTVNSX1BSCi0JYmVxCTJmCi0JQUNDT1VOVF9DUFVfVVNFUl9FWElUKHIzLCByNCkKLTI6Ci0jZW5kaWYKLQotCWxkCXIzLF9DQ1IocjEpCi0JbGQJcjQsX0xJTksocjEpCi0JbGQJcjUsX0NUUihyMSkKLQlsZAlyNixfWEVSKHIxKQotCW10Y3IJcjMKLQltdGxyCXI0Ci0JbXRjdHIJcjUKLQltdHhlcglyNgotCVJFU1RfR1BSKDAsIHIxKQotCVJFU1RfOEdQUlMoMiwgcjEpCi0KLQltZm1zcglyMTAKLQlybGRpY2wJcjEwLHIxMCw0OCwxCQkvKiBjbGVhciBFRSAqLwotCXJsZGljcglyMTAscjEwLDE2LDYxCQkvKiBjbGVhciBSSSAoTEUgaXMgMCBhbHJlYWR5KSAqLwotCW10bXNyZAlyMTAsMQotCi0JbXRzcHIJU1BSTl9TUlIxLHIxMgotCW10c3ByCVNQUk5fU1JSMCxyMTEKLQlSRVNUXzRHUFJTKDEwLCByMSkKLQlsZAlyMSxHUFIxKHIxKQotCXJmaWQKLQliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KLQotdW5yZWNvdl9mZXI6Ci0JYmwJLnNhdmVfbnZncHJzCi0xOglhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0JYmwJLnVucmVjb3ZlcmFibGVfZXhjZXB0aW9uCi0JYgkxYgotCi0vKgogICogSGVyZSByMTMgcG9pbnRzIHRvIHRoZSBwYWNhLCByOSBjb250YWlucyB0aGUgc2F2ZWQgQ1IsCiAgKiBTUlIwIGFuZCBTUlIxIGFyZSBzYXZlZCBpbiByMTEgYW5kIHIxMiwKICAqIHI5IC0gcjEzIGFyZSBzYXZlZCBpbiBwYWNhLT5leGdlbi4KQEAgLTYxNiw2ICs1OTksOSBAQAogICovCiBfR0xPQkFMKHNsYl9taXNzX3JlYWxtb2RlKQogCW1mbHIJcjEwCisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJbXRjdHIJcjExCisjZW5kaWYKIAogCXN0dwlyOSxQQUNBX0VYU0xCK0VYX0NDUihyMTMpCS8qIHNhdmUgQ1IgaW4gZXhjLiBmcmFtZSAqLwogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9MUihyMTMpCS8qIHNhdmUgTFIgKi8KQEAgLTY2NiwxMSArNjUyLDEwIEBACiBFTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQogI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCW1mc3ByCXIxMSxTUFJOX1NSUjAKLQljbHJyZGkJcjEwLHIxMywzMgorCWxkCXIxMCxQQUNBS0JBU0UocjEzKQogCUxPQURfSEFORExFUihyMTAsdW5yZWNvdl9zbGIpCiAJbXRzcHIJU1BSTl9TUlIwLHIxMAotCW1mbXNyCXIxMAotCW9yaQlyMTAscjEwLE1TUl9JUnxNU1JfRFJ8TVNSX1JJCisJbGQJcjEwLFBBQ0FLTVNSKHIxMykKIAltdHNwcglTUFJOX1NSUjEscjEwCiAJcmZpZAogCWIJLgpAQCAtNzY2LDYgKzc1MSw4NSBAQAogCWJsCS5hbHRpdmVjX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbgogCWIJLnJldF9mcm9tX2V4Y2VwdAogCisJLmFsaWduCTcKKwkuZ2xvYmwgdnN4X3VuYXZhaWxhYmxlX2NvbW1vbgordnN4X3VuYXZhaWxhYmxlX2NvbW1vbjoKKwlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweGY0MCwgUEFDQV9FWEdFTikKKyNpZmRlZiBDT05GSUdfVlNYCitCRUdJTl9GVFJfU0VDVElPTgorCWJuZQkubG9hZF91cF92c3gKKzE6CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9WU1gpCisjZW5kaWYKKwlibAkuc2F2ZV9udmdwcnMKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRU5BQkxFX0lOVFMKKwlibAkudnN4X3VuYXZhaWxhYmxlX2V4Y2VwdGlvbgorCWIJLnJldF9mcm9tX2V4Y2VwdAorCisJLmFsaWduCTcKKwkuZ2xvYmwJX19lbmRfaGFuZGxlcnMKK19fZW5kX2hhbmRsZXJzOgorCisvKgorICogUmV0dXJuIGZyb20gYW4gZXhjZXB0aW9uIHdpdGggbWluaW1hbCBjaGVja3MuCisgKiBUaGUgY2FsbGVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBkb25lIEVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OLgorICogSWYgaW50ZXJydXB0cyBoYXZlIGJlZW4gZW5hYmxlZCwgb3IgYW55dGhpbmcgaGFzIGJlZW4KKyAqIGRvbmUgdGhhdCBtaWdodCBoYXZlIGNoYW5nZWQgdGhlIHNjaGVkdWxpbmcgc3RhdHVzIG9mCisgKiBhbnkgdGFzayBvciBzZW50IGFueSB0YXNrIGEgc2lnbmFsLCB5b3Ugc2hvdWxkIHVzZQorICogcmV0X2Zyb21fZXhjZXB0IG9yIHJldF9mcm9tX2V4Y2VwdF9saXRlIGluc3RlYWQgb2YgdGhpcy4KKyAqLworZmFzdF9leGNfcmV0dXJuX2lycToJCQkvKiByZXN0b3JlcyBpcnEgc3RhdGUgdG9vICovCisJbGQJcjMsU09GVEUocjEpCisJVFJBQ0VfQU5EX1JFU1RPUkVfSVJRKHIzKTsKKwlsZAlyMTIsX01TUihyMSkKKwlybGRpY2wJcjQscjEyLDQ5LDYzCQkvKiBnZXQgTVNSX0VFIHRvIExTQiAqLworCXN0YglyNCxQQUNBSEFSRElSUUVOKHIxMykJLyogcmVzdG9yZSBwYWNhLT5oYXJkX2VuYWJsZWQgKi8KKwliCTFmCisKKwkuZ2xvYmwJZmFzdF9leGNlcHRpb25fcmV0dXJuCitmYXN0X2V4Y2VwdGlvbl9yZXR1cm46CisJbGQJcjEyLF9NU1IocjEpCisxOglsZAlyMTEsX05JUChyMSkKKwlhbmRpLglyMyxyMTIsTVNSX1JJCQkvKiBjaGVjayBpZiBSSSBpcyBzZXQgKi8KKwliZXEtCXVucmVjb3ZfZmVyCisKKyNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCWFuZGkuCXIzLHIxMixNU1JfUFIKKwliZXEJMmYKKwlBQ0NPVU5UX0NQVV9VU0VSX0VYSVQocjMsIHI0KQorMjoKKyNlbmRpZgorCisJbGQJcjMsX0NDUihyMSkKKwlsZAlyNCxfTElOSyhyMSkKKwlsZAlyNSxfQ1RSKHIxKQorCWxkCXI2LF9YRVIocjEpCisJbXRjcglyMworCW10bHIJcjQKKwltdGN0cglyNQorCW10eGVyCXI2CisJUkVTVF9HUFIoMCwgcjEpCisJUkVTVF84R1BSUygyLCByMSkKKworCW1mbXNyCXIxMAorCXJsZGljbAlyMTAscjEwLDQ4LDEJCS8qIGNsZWFyIEVFICovCisJcmxkaWNyCXIxMCxyMTAsMTYsNjEJCS8qIGNsZWFyIFJJIChMRSBpcyAwIGFscmVhZHkpICovCisJbXRtc3JkCXIxMCwxCisKKwltdHNwcglTUFJOX1NSUjEscjEyCisJbXRzcHIJU1BSTl9TUlIwLHIxMQorCVJFU1RfNEdQUlMoMTAsIHIxKQorCWxkCXIxLEdQUjEocjEpCisJcmZpZAorCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLworCit1bnJlY292X2ZlcjoKKwlibAkuc2F2ZV9udmdwcnMKKzE6CWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAkudW5yZWNvdmVyYWJsZV9leGNlcHRpb24KKwliCTFiCisKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogLyoKICAqIGxvYWRfdXBfYWx0aXZlYyh1bnVzZWQsIHVudXNlZCwgdHNrKQpAQCAtODQwLDIyICs5MDQsNiBAQAogCWJscgogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKLQkuYWxpZ24JNwotCS5nbG9ibCB2c3hfdW5hdmFpbGFibGVfY29tbW9uCi12c3hfdW5hdmFpbGFibGVfY29tbW9uOgotCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4ZjQwLCBQQUNBX0VYR0VOKQotI2lmZGVmIENPTkZJR19WU1gKLUJFR0lOX0ZUUl9TRUNUSU9OCi0JYm5lCS5sb2FkX3VwX3ZzeAotMToKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1ZTWCkKLSNlbmRpZgotCWJsCS5zYXZlX252Z3BycwotCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlFTkFCTEVfSU5UUwotCWJsCS52c3hfdW5hdmFpbGFibGVfZXhjZXB0aW9uCi0JYgkucmV0X2Zyb21fZXhjZXB0Ci0KICNpZmRlZiBDT05GSUdfVlNYCiAvKgogICogbG9hZF91cF92c3godW51c2VkLCB1bnVzZWQsIHRzaykKQEAgLTExNzUsMTEgKzEyMjMsMTQgQEAKIAkvKiB0dXJuIG9uIDY0LWJpdCBtb2RlICovCiAJYmwJLmVuYWJsZV82NGJfbW9kZQogCisJLyogZ2V0IHRoZSBUT0MgcG9pbnRlciAocmVhbCBhZGRyZXNzKSAqLworCWJsCS5yZWxhdGl2ZV90b2MKKwogCS8qIFNldCB1cCBhIHBhY2EgdmFsdWUgZm9yIHRoaXMgcHJvY2Vzc29yLiBTaW5jZSB3ZSBoYXZlIHRoZQogCSAqIHBoeXNpY2FsIGNwdSBpZCBpbiByMjQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBwYWNhcyB0byBmaW5kCiAJICogd2hpY2ggbG9naWNhbCBpZCBtYXBzIHRvIG91ciBwaHlzaWNhbCBvbmUuCiAJICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIxMywgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkgKi8KKwlMT0FEX1JFR19BRERSKHIxMywgcGFjYSkJLyogR2V0IGJhc2UgdmFkZHIgb2YgcGFjYSBhcnJheQkgKi8KIAlsaQlyNSwwCQkJLyogbG9naWNhbCBjcHUgaWQgICAgICAgICAgICAgICAgKi8KIDE6CWxoeglyNixQQUNBSFdDUFVJRChyMTMpCS8qIExvYWQgSFcgcHJvY2lkIGZyb20gcGFjYSAgICAgICovCiAJY21wdwlyNixyMjQJCQkvKiBDb21wYXJlIHRvIG91ciBpZCAgICAgICAgICAgICAqLwpAQCAtMTIwOCw3ICsxMjU5LDcgQEAKIAlzeW5jCQkJCS8qIG9yZGVyIHBhY2EucnVuIGFuZCBjdXJfY3B1X3NwZWMgKi8KIAogCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIGNhbGwgYSBjcHUgc3RhdGUgcmVzdG9yZSBoYW5kbGVyICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyMywgY3VyX2NwdV9zcGVjKQorCUxPQURfUkVHX0FERFIocjIzLCBjdXJfY3B1X3NwZWMpCiAJbGQJcjIzLDAocjIzKQogCWxkCXIyMyxDUFVfU1BFQ19SRVNUT1JFKHIyMykKIAljbXBkaQkwLHIyMywwCkBAIC0xMjI0LDEwICsxMjc1LDE1IEBACiAJYglfX3NlY29uZGFyeV9zdGFydAogI2VuZGlmCiAKKy8qCisgKiBUdXJuIHRoZSBNTVUgb2ZmLgorICogQXNzdW1lcyB3ZSdyZSBtYXBwZWQgRUEgPT0gUkEgaWYgdGhlIE1NVSBpcyBvbi4KKyAqLwogX1NUQVRJQyhfX21tdV9vZmYpCiAJbWZtc3IJcjMKIAlhbmRpLglyMCxyMyxNU1JfSVJ8TVNSX0RSCiAJYmVxbHIKKwltZmxyCXI0CiAJYW5kYwlyMyxyMyxyMAogCW10c3ByCVNQUk5fU1JSMCxyNAogCW10c3ByCVNQUk5fU1JSMSxyMwpAQCAtMTI0OCw2ICsxMzA0LDE4IEBACiAgKgogICovCiBfR0xPQkFMKF9fc3RhcnRfaW5pdGlhbGl6YXRpb25fbXVsdGlwbGF0Zm9ybSkKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgaW4gNjQgYml0cyBtb2RlICovCisJYmwJLmVuYWJsZV82NGJfbW9kZQorCisJLyogR2V0IFRPQyBwb2ludGVyIChjdXJyZW50IHJ1bnRpbWUgYWRkcmVzcykgKi8KKwlibAkucmVsYXRpdmVfdG9jCisKKwkvKiBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgbm93ICovCisJYmNsCTIwLDMxLCQrNAorMDoJbWZscglyMjYJCQkvKiByMjYgPSBydW50aW1lIGFkZHIgaGVyZSAqLworCWFkZGlzCXIyNixyMjYsKF9zdGV4dCAtIDBiKUBoYQorCWFkZGkJcjI2LHIyNiwoX3N0ZXh0IC0gMGIpQGwJLyogY3VycmVudCBydW50aW1lIGJhc2UgYWRkciAqLworCiAJLyoKIAkgKiBBcmUgd2UgYm9vdGVkIGZyb20gYSBQUk9NIE9mLXR5cGUgY2xpZW50LWludGVyZmFjZSA/CiAJICovCkBAIC0xMjU5LDkgKzEzMjcsNiBAQAogCW1yCXIzMSxyMwogCW1yCXIzMCxyNAogCi0JLyogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIGluIDY0IGJpdHMgbW9kZSAqLwotCWJsCS5lbmFibGVfNjRiX21vZGUKLQogCS8qIFNldHVwIHNvbWUgY3JpdGljYWwgOTcwIFNQUnMgYmVmb3JlIHN3aXRjaGluZyBNTVUgb2ZmICovCiAJbWZzcHIJcjAsU1BSTl9QVlIKIAlzcndpCXIwLHIwLDE2CkBAIC0xMjc2LDkgKzEzNDEsNyBAQAogMToJYmwJLl9fY3B1X3ByZWluaXRfcHBjOTcwCiAyOgogCi0JLyogU3dpdGNoIG9mZiBNTVUgaWYgbm90IGFscmVhZHkgKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjQsIC5fX2FmdGVyX3Byb21fc3RhcnQgLSBLRVJORUxCQVNFKQotCWFkZAlyNCxyNCxyMzAKKwkvKiBTd2l0Y2ggb2ZmIE1NVSBpZiBub3QgYWxyZWFkeSBvZmYgKi8KIAlibAkuX19tbXVfb2ZmCiAJYgkuX19hZnRlcl9wcm9tX3N0YXJ0CiAKQEAgLTEyOTMsMjIgKzEzNTYsMTUgQEAKIAkvKgogCSAqIEFsaWduIHRoZSBzdGFjayB0byAxNi1ieXRlIGJvdW5kYXJ5CiAJICogRGVwZW5kaW5nIG9uIHRoZSBzaXplIGFuZCBsYXlvdXQgb2YgdGhlIEVMRiBzZWN0aW9ucyBpbiB0aGUgaW5pdGlhbAotCSAqIGJvb3QgYmluYXJ5LCB0aGUgc3RhY2sgcG9pbnRlciB3aWxsIGJlIHVuYWxpZ25ldCBvbiBQb3dlck1hYworCSAqIGJvb3QgYmluYXJ5LCB0aGUgc3RhY2sgcG9pbnRlciBtYXkgYmUgdW5hbGlnbmVkIG9uIFBvd2VyTWFjCiAJICovCiAJcmxkaWNyCXIxLHIxLDAsNTkKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBpbiA2NCBiaXRzIG1vZGUgKi8KLQlibAkuZW5hYmxlXzY0Yl9tb2RlCi0KLQkvKiBwdXQgYSByZWxvY2F0aW9uIG9mZnNldCBpbnRvIHIzICovCi0JYmwJLnJlbG9jX29mZnNldAotCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQotCWFkZGkJcjIscjIsMHg0MDAwCi0JYWRkaQlyMixyMiwweDQwMDAKLQotCS8qIFJlbG9jYXRlIHRoZSBUT0MgZnJvbSBhIHZpcnQgYWRkciB0byBhIHJlYWwgYWRkciAqLwotCWFkZAlyMixyMixyMworI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQorCS8qIFJlbG9jYXRlIGNvZGUgZm9yIHdoZXJlIHdlIGFyZSBub3cgKi8KKwltcglyMyxyMjYKKwlibAkucmVsb2NhdGUKKyNlbmRpZgogCiAJLyogUmVzdG9yZSBwYXJhbWV0ZXJzICovCiAJbXIJcjMscjMxCkBAIC0xMzE4LDYwICsxMzc0LDUxIEBACiAJbXIJcjcscjI3CiAKIAkvKiBEbyBhbGwgb2YgdGhlIGludGVyYWN0aW9uIHdpdGggT0YgY2xpZW50IGludGVyZmFjZSAqLworCW1yCXI4LHIyNgogCWJsCS5wcm9tX2luaXQKIAkvKiBXZSBuZXZlciByZXR1cm4gKi8KIAl0cmFwCiAKIF9TVEFUSUMoX19hZnRlcl9wcm9tX3N0YXJ0KQorI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQorCS8qIHByb2Nlc3MgcmVsb2NhdGlvbnMgZm9yIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgKi8KKwlsaXMJcjI1LFBBR0VfT0ZGU0VUQGhpZ2hlc3QJLyogY29tcHV0ZSB2aXJ0dWFsIGJhc2Ugb2Yga2VybmVsICovCisJc2xkaQlyMjUscjI1LDMyCisJbXIJcjMscjI1CisJYmwJLnJlbG9jYXRlCisjZW5kaWYKIAogLyoKLSAqIFdlIG5lZWQgdG8gcnVuIHdpdGggX19zdGFydCBhdCBwaHlzaWNhbCBhZGRyZXNzIFBIWVNJQ0FMX1NUQVJULgorICogV2UgbmVlZCB0byBydW4gd2l0aCBfc3RleHQgYXQgcGh5c2ljYWwgYWRkcmVzcyBQSFlTSUNBTF9TVEFSVC4KICAqIFRoaXMgd2lsbCBsZWF2ZSBzb21lIGNvZGUgaW4gdGhlIGZpcnN0IDI1NkIgb2YKICAqIHJlYWwgbWVtb3J5LCB3aGljaCBhcmUgcmVzZXJ2ZWQgZm9yIHNvZnR3YXJlIHVzZS4KLSAqIFRoZSByZW1haW5kZXIgb2YgdGhlIGZpcnN0IHBhZ2UgaXMgbG9hZGVkIHdpdGggdGhlIGZpeGVkCi0gKiBpbnRlcnJ1cHQgdmVjdG9ycy4gIFRoZSBuZXh0IHR3byBwYWdlcyBhcmUgZmlsbGVkIHdpdGgKLSAqIHVua25vd24gZXhjZXB0aW9uIHBsYWNlaG9sZGVycy4KICAqCiAgKiBOb3RlOiBUaGlzIHByb2Nlc3Mgb3ZlcndyaXRlcyB0aGUgT0YgZXhjZXB0aW9uIHZlY3RvcnMuCi0gKglyMjYgPT0gcmVsb2NhdGlvbiBvZmZzZXQKLSAqCXIyNyA9PSBLRVJORUxCQVNFCiAgKi8KLQlibAkucmVsb2Nfb2Zmc2V0Ci0JbXIJcjI2LHIzCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyNywgS0VSTkVMQkFTRSkKLQotCUxPQURfUkVHX0lNTUVESUFURShyMywgUEhZU0lDQUxfU1RBUlQpCS8qIHRhcmdldCBhZGRyICovCi0KLQkvLyBYWFggRklYTUU6IFVzZSBwaHlzIHJldHVybmVkIGJ5IE9GIChyMzApCi0JYWRkCXI0LHIyNyxyMjYgCQkvKiBzb3VyY2UgYWRkcgkJCSAqLwotCQkJCQkvKiBjdXJyZW50IGFkZHJlc3Mgb2YgX3N0YXJ0CSAqLwotCQkJCQkvKiAgIGkuZS4gd2hlcmUgd2UgYXJlIHJ1bm5pbmcJICovCi0JCQkJCS8qCXRoZSBzb3VyY2UgYWRkcgkJICovCi0KLQljbXBkaQlyNCwwCQkJLyogSW4gc29tZSBjYXNlcyB0aGUgbG9hZGVyIG1heSAgKi8KLQlibmUJMWYKLQliCS5zdGFydF9oZXJlX211bHRpcGxhdGZvcm0gLyogaGF2ZSBhbHJlYWR5IHB1dCB1cyBhdCB6ZXJvICovCi0JCQkJCS8qIHNvIHdlIGNhbiBza2lwIHRoZSBjb3B5LiAgICAgICovCi0xOglMT0FEX1JFR19JTU1FRElBVEUocjUsY29weV90b19oZXJlKSAvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCi0Jc3ViCXI1LHI1LHIyNwotCisJbGkJcjMsMAkJCS8qIHRhcmdldCBhZGRyICovCisJbXIuCXI0LHIyNgkJCS8qIEluIHNvbWUgY2FzZXMgdGhlIGxvYWRlciBtYXkgICovCisJYmVxCTlmCQkJLyogaGF2ZSBhbHJlYWR5IHB1dCB1cyBhdCB6ZXJvICovCisJbGlzCXI1LChjb3B5X3RvX2hlcmUgLSBfc3RleHQpQGhhCisJYWRkaQlyNSxyNSwoY29weV90b19oZXJlIC0gX3N0ZXh0KUBsIC8qICMgYnl0ZXMgb2YgbWVtb3J5IHRvIGNvcHkgKi8KIAlsaQlyNiwweDEwMAkJLyogU3RhcnQgb2Zmc2V0LCB0aGUgZmlyc3QgMHgxMDAgKi8KIAkJCQkJLyogYnl0ZXMgd2VyZSBjb3BpZWQgZWFybGllci4JICovCiAKIAlibAkuY29weV9hbmRfZmx1c2gJCS8qIGNvcHkgdGhlIGZpcnN0IG4gYnl0ZXMJICovCiAJCQkJCS8qIHRoaXMgaW5jbHVkZXMgdGhlIGNvZGUgYmVpbmcJICovCiAJCQkJCS8qIGV4ZWN1dGVkIGhlcmUuCQkgKi8KLQotCUxPQURfUkVHX0lNTUVESUFURShyMCwgNGYpCS8qIEp1bXAgdG8gdGhlIGNvcHkgb2YgdGhpcyBjb2RlICovCi0JbXRjdHIJcjAJCQkvKiB0aGF0IHdlIGp1c3QgbWFkZS9yZWxvY2F0ZWQJICovCisJYWRkaXMJcjgscjMsKDRmIC0gX3N0ZXh0KUBoYQkvKiBKdW1wIHRvIHRoZSBjb3B5IG9mIHRoaXMgY29kZSAqLworCWFkZGkJcjgscjgsKDRmIC0gX3N0ZXh0KUBsCS8qIHRoYXQgd2UganVzdCBtYWRlICovCisJbXRjdHIJcjgKIAliY3RyCiAKLTQ6CUxPQURfUkVHX0lNTUVESUFURShyNSxrbGltaXQpCi0JYWRkCXI1LHI1LHIyNgotCWxkCXI1LDAocjUpCQkvKiBnZXQgdGhlIHZhbHVlIG9mIGtsaW1pdCAqLwotCXN1YglyNSxyNSxyMjcKKzQ6CS8qIE5vdyBjb3B5IHRoZSByZXN0IG9mIHRoZSBrZXJuZWwgdXAgdG8gX2VuZCAqLworCWFkZGlzCXI1LHIyNiwocF9lbmQgLSBfc3RleHQpQGhhCisJbGQJcjUsKHBfZW5kIC0gX3N0ZXh0KUBsKHI1KQkvKiBnZXQgX2VuZCAqLwogCWJsCS5jb3B5X2FuZF9mbHVzaAkJLyogY29weSB0aGUgcmVzdCAqLwotCWIJLnN0YXJ0X2hlcmVfbXVsdGlwbGF0Zm9ybQorCis5OgliCS5zdGFydF9oZXJlX211bHRpcGxhdGZvcm0KKworcF9lbmQ6CS5sbG9uZwlfZW5kIC0gX3N0ZXh0CiAKIC8qCiAgKiBDb3B5IHJvdXRpbmUgdXNlZCB0byBjb3B5IHRoZSBrZXJuZWwgdG8gc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwCkBAIC0xNDM2LDYgKzE0ODMsOSBAQAogCS8qIHR1cm4gb24gNjQtYml0IG1vZGUgKi8KIAlibAkuZW5hYmxlXzY0Yl9tb2RlCiAKKwkvKiBnZXQgVE9DIHBvaW50ZXIgKHJlYWwgYWRkcmVzcykgKi8KKwlibAkucmVsYXRpdmVfdG9jCisKIAkvKiBDb3B5IHNvbWUgQ1BVIHNldHRpbmdzIGZyb20gQ1BVIDAgKi8KIAlibAkuX19yZXN0b3JlX2NwdV9wcGM5NzAKIApAQCAtMTQ0NSwxMCArMTQ5NSwxMCBAQAogCW10bXNyZAlyMwkJCS8qIFJJIG9uICovCiAKIAkvKiBTZXQgdXAgYSBwYWNhIHZhbHVlIGZvciB0aGlzIHByb2Nlc3Nvci4gKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjQsIHBhY2EpCS8qIEdldCBiYXNlIHZhZGRyIG9mIHBhY2EgYXJyYXkJKi8KLQltdWxsaQlyMTMscjI0LFBBQ0FfU0laRQkgLyogQ2FsY3VsYXRlIHZhZGRyIG9mIHJpZ2h0IHBhY2EgKi8KKwlMT0FEX1JFR19BRERSKHI0LHBhY2EpCQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSovCisJbXVsbGkJcjEzLHIyNCxQQUNBX1NJWkUJLyogQ2FsY3VsYXRlIHZhZGRyIG9mIHJpZ2h0IHBhY2EgKi8KIAlhZGQJcjEzLHIxMyxyNAkJLyogZm9yIHRoaXMgcHJvY2Vzc29yLgkJKi8KLQltdHNwcglTUFJOX1NQUkczLHIxMwkJIC8qIFNhdmUgdmFkZHIgb2YgcGFjYSBpbiBTUFJHMwkqLworCW10c3ByCVNQUk5fU1BSRzMscjEzCQkvKiBTYXZlIHZhZGRyIG9mIHBhY2EgaW4gU1BSRzMJKi8KIAogCS8qIENyZWF0ZSBhIHRlbXAga2VybmVsIHN0YWNrIGZvciB1c2UgYmVmb3JlIHJlbG9jYXRpb24gaXMgb24uCSovCiAJbGQJcjEsUEFDQUVNRVJHU1AocjEzKQpAQCAtMTQ3Niw5ICsxNTI2LDYgQEAKIAkvKiBTZXQgdGhyZWFkIHByaW9yaXR5IHRvIE1FRElVTSAqLwogCUhNVF9NRURJVU0KIAotCS8qIExvYWQgVE9DICovCi0JbGQJcjIsUEFDQVRPQyhyMTMpCi0KIAkvKiBEbyBlYXJseSBzZXR1cCBmb3IgdGhhdCBDUFUgKHN0YWIsIHNsYiwgaGFzaCB0YWJsZSBwb2ludGVyKSAqLwogCWJsCS5lYXJseV9zZXR1cF9zZWNvbmRhcnkKIApAQCAtMTUxNSw5ICsxNTYyLDExIEBACiAKIC8qIAogICogUnVubmluZyB3aXRoIHJlbG9jYXRpb24gb24gYXQgdGhpcyBwb2ludC4gIEFsbCB3ZSB3YW50IHRvIGRvIGlzCi0gKiB6ZXJvIHRoZSBzdGFjayBiYWNrLWNoYWluIHBvaW50ZXIgYmVmb3JlIGdvaW5nIGludG8gQyBjb2RlLgorICogemVybyB0aGUgc3RhY2sgYmFjay1jaGFpbiBwb2ludGVyIGFuZCBnZXQgdGhlIFRPQyB2aXJ0dWFsIGFkZHJlc3MKKyAqIGJlZm9yZSBnb2luZyBpbnRvIEMgY29kZS4KICAqLwogX0dMT0JBTChzdGFydF9zZWNvbmRhcnlfcHJvbG9nKQorCWxkCXIyLFBBQ0FUT0MocjEzKQogCWxpCXIzLDAKIAlzdGQJcjMsMChyMSkJCS8qIFplcm8gdGhlIHN0YWNrIGZyYW1lIHBvaW50ZXIJKi8KIAlibAkuc3RhcnRfc2Vjb25kYXJ5CkBAIC0xNTI5LDM0ICsxNTc4LDQ2IEBACiAgKi8KIF9HTE9CQUwoZW5hYmxlXzY0Yl9tb2RlKQogCW1mbXNyCXIxMQkJCS8qIGdyYWIgdGhlIGN1cnJlbnQgTVNSICovCi0JbGkJcjEyLDEKLQlybGRpY3IJcjEyLHIxMixNU1JfU0ZfTEcsKDYzLU1TUl9TRl9MRykKLQlvcglyMTEscjExLHIxMgotCWxpCXIxMiwxCi0JcmxkaWNyCXIxMixyMTIsTVNSX0lTRl9MRywoNjMtTVNSX0lTRl9MRykKKwlsaQlyMTIsKE1TUl9TRiB8IE1TUl9JU0YpQGhpZ2hlc3QKKwlzbGRpCXIxMixyMTIsNDgKIAlvcglyMTEscjExLHIxMgogCW10bXNyZAlyMTEKIAlpc3luYwogCWJscgogCiAvKgorICogVGhpcyBwdXRzIHRoZSBUT0MgcG9pbnRlciBpbnRvIHIyLCBvZmZzZXQgYnkgMHg4MDAwIChhcyBleHBlY3RlZAorICogYnkgdGhlIHRvb2xjaGFpbikuICBJdCBjb21wdXRlcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3Igd2hlcmV2ZXIgd2UKKyAqIGFyZSBydW5uaW5nIGF0IHRoZSBtb21lbnQsIHVzaW5nIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUuCisgKi8KK19HTE9CQUwocmVsYXRpdmVfdG9jKQorCW1mbHIJcjAKKwliY2wJMjAsMzEsJCs0CiswOgltZmxyCXI5CisJbGQJcjIsKHBfdG9jIC0gMGIpKHI5KQorCWFkZAlyMixyMixyOQorCW10bHIJcjAKKwlibHIKKworcF90b2M6CS5sbG9uZwlfX3RvY19zdGFydCArIDB4ODAwMCAtIDBiCisKKy8qCiAgKiBUaGlzIGlzIHdoZXJlIHRoZSBtYWluIGtlcm5lbCBjb2RlIHN0YXJ0cy4KICAqLwogX0lOSVRfU1RBVElDKHN0YXJ0X2hlcmVfbXVsdGlwbGF0Zm9ybSkKLQkvKiBnZXQgYSBuZXcgb2Zmc2V0LCBub3cgdGhhdCB0aGUga2VybmVsIGhhcyBtb3ZlZC4gKi8KLQlibAkucmVsb2Nfb2Zmc2V0Ci0JbXIJcjI2LHIzCisJLyogc2V0IHVwIHRoZSBUT0MgKHJlYWwgYWRkcmVzcykgKi8KKwlibAkucmVsYXRpdmVfdG9jCiAKIAkvKiBDbGVhciBvdXQgdGhlIEJTUy4gSXQgbWF5IGhhdmUgYmVlbiBkb25lIGluIHByb21faW5pdCwKIAkgKiBhbHJlYWR5IGJ1dCB0aGF0J3MgaXJyZWxldmFudCBzaW5jZSBwcm9tX2luaXQgd2lsbCBzb29uCiAJICogYmUgZGV0YWNoZWQgZnJvbSB0aGUga2VybmVsIGNvbXBsZXRlbHkuIEJlc2lkZXMsIHdlIG5lZWQKIAkgKiB0byBjbGVhciBpdCBub3cgZm9yIGtleGVjLXN0eWxlIGVudHJ5LgogCSAqLwotCUxPQURfUkVHX0lNTUVESUFURShyMTEsX19ic3Nfc3RvcCkKLQlMT0FEX1JFR19JTU1FRElBVEUocjgsX19ic3Nfc3RhcnQpCisJTE9BRF9SRUdfQUREUihyMTEsX19ic3Nfc3RvcCkKKwlMT0FEX1JFR19BRERSKHI4LF9fYnNzX3N0YXJ0KQogCXN1YglyMTEscjExLHI4CQkvKiBic3Mgc2l6ZQkJCSovCiAJYWRkaQlyMTEscjExLDcJCS8qIHJvdW5kIHVwIHRvIGFuIGV2ZW4gZG91YmxlIHdvcmQgKi8KLQlybGRpY2wuIHIxMSxyMTEsNjEsMwkJLyogc2hpZnQgcmlnaHQgYnkgMwkJKi8KKwlzcmRpLglyMTEscjExLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCiAJYmVxCTRmCiAJYWRkaQlyOCxyOCwtOAogCWxpCXIwLDAKQEAgLTE1NjksMzUgKzE2MzAsMzUgQEAKIAlvcmkJcjYscjYsTVNSX1JJCiAJbXRtc3JkCXI2CQkJLyogUkkgb24gKi8KIAotCS8qIFRoZSBmb2xsb3dpbmcgZ2V0cyB0aGUgc3RhY2sgYW5kIFRPQyBzZXQgdXAgd2l0aCB0aGUgcmVncyAqLworI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQorCS8qIFNhdmUgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2UncmUgcnVubmluZyBhdCBpbiBrZXJuc3RhcnRfYWRkciAqLworCUxPQURfUkVHX0FERFIocjQsIGtlcm5zdGFydF9hZGRyKQorCWNscmxkaQlyMCxyMjUsMgorCXN0ZAlyMCwwKHI0KQorI2VuZGlmCisKKwkvKiBUaGUgZm9sbG93aW5nIGdldHMgdGhlIHN0YWNrIHNldCB1cCB3aXRoIHRoZSByZWdzICovCiAJLyogcG9pbnRpbmcgdG8gdGhlIHJlYWwgYWRkciBvZiB0aGUga2VybmVsIHN0YWNrLiAgVGhpcyBpcyAgICovCiAJLyogYWxsIGRvbmUgdG8gc3VwcG9ydCB0aGUgQyBmdW5jdGlvbiBjYWxsIGJlbG93IHdoaWNoIHNldHMgICovCiAJLyogdXAgdGhlIGh0YWIuICBUaGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSBoYXZlIHJlbG9jYXRlZCB0aGUgICovCiAJLyoga2VybmVsIGJ1dCBhcmUgc3RpbGwgcnVubmluZyBpbiByZWFsIG1vZGUuICovCiAKLQlMT0FEX1JFR19JTU1FRElBVEUocjMsaW5pdF90aHJlYWRfdW5pb24pCi0JYWRkCXIzLHIzLHIyNgorCUxPQURfUkVHX0FERFIocjMsaW5pdF90aHJlYWRfdW5pb24pCiAKLQkvKiBzZXQgdXAgYSBzdGFjayBwb2ludGVyIChwaHlzaWNhbCBhZGRyZXNzKSAqLworCS8qIHNldCB1cCBhIHN0YWNrIHBvaW50ZXIgKi8KIAlhZGRpCXIxLHIzLFRIUkVBRF9TSVpFCiAJbGkJcjAsMAogCXN0ZHUJcjAsLVNUQUNLX0ZSQU1FX09WRVJIRUFEKHIxKQogCi0JLyogc2V0IHVwIHRoZSBUT0MgKHBoeXNpY2FsIGFkZHJlc3MpICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQotCWFkZGkJcjIscjIsMHg0MDAwCi0JYWRkaQlyMixyMiwweDQwMDAKLQlhZGQJcjIscjIscjI2Ci0KIAkvKiBEbyB2ZXJ5IGVhcmx5IGtlcm5lbCBpbml0aWFsaXphdGlvbnMsIGluY2x1ZGluZyBpbml0aWFsIGhhc2ggdGFibGUsCiAJICogc3RhYiBhbmQgc2xiIHNldHVwIGJlZm9yZSB3ZSB0dXJuIG9uIHJlbG9jYXRpb24uCSovCiAKIAkvKiBSZXN0b3JlIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gcHJvbV9pbml0L2tleGVjICovCiAJbXIJcjMscjMxCi0gCWJsCS5lYXJseV9zZXR1cAorCWJsCS5lYXJseV9zZXR1cAkJLyogYWxzbyBzZXRzIHIxMyBhbmQgU1BSRzMgKi8KIAotCUxPQURfUkVHX0lNTUVESUFURShyMywgLnN0YXJ0X2hlcmVfY29tbW9uKQotCUxPQURfUkVHX0lNTUVESUFURShyNCwgTVNSX0tFUk5FTCkKKwlMT0FEX1JFR19BRERSKHIzLCAuc3RhcnRfaGVyZV9jb21tb24pCisJbGQJcjQsUEFDQUtNU1IocjEzKQogCW10c3ByCVNQUk5fU1JSMCxyMwogCW10c3ByCVNQUk5fU1JSMSxyNAogCXJmaWQKQEAgLTE2MDYsMjEgKzE2NjcsMTEgQEAKIAkvKiBUaGlzIGlzIHdoZXJlIGFsbCBwbGF0Zm9ybXMgY29udmVyZ2UgZXhlY3V0aW9uICovCiBfSU5JVF9HTE9CQUwoc3RhcnRfaGVyZV9jb21tb24pCiAJLyogcmVsb2NhdGlvbiBpcyBvbiBhdCB0aGlzIHBvaW50ICovCi0KLQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgc2V0cyB1cCB0aGUgU1AgYW5kIFRPQyBub3cgdGhhdCB3ZSBhcmUgKi8KLQkvKiBydW5uaW5nIHdpdGggdHJhbnNsYXRpb24gZW5hYmxlZC4gKi8KLQotCUxPQURfUkVHX0lNTUVESUFURShyMyxpbml0X3RocmVhZF91bmlvbikKLQotCS8qIHNldCB1cCB0aGUgc3RhY2sgKi8KLQlhZGRpCXIxLHIzLFRIUkVBRF9TSVpFCi0JbGkJcjAsMAotCXN0ZHUJcjAsLVNUQUNLX0ZSQU1FX09WRVJIRUFEKHIxKQotCi0JLyogTG9hZCB0aGUgVE9DICovCi0JbGQJcjIsUEFDQVRPQyhyMTMpCiAJc3RkCXIxLFBBQ0FLU0FWRShyMTMpCiAKKwkvKiBMb2FkIHRoZSBUT0MgKHZpcnR1YWwgYWRkcmVzcykgKi8KKwlsZAlyMixQQUNBVE9DKHIxMykKKwogCWJsCS5zZXR1cF9zeXN0ZW0KIAogCS8qIExvYWQgdXAgdGhlIGtlcm5lbCBjb250ZXh0ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKaW5kZXggM2NiNTJmYS4uNTkwMzA0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtNDIyLDcgKzQyMiw2IEBACiAgKiAgIHIxMiBpcyBwb2ludGVyIHRvIHRoZSBwdGUKICAqLwogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKLSNkZWZpbmUgUFRFX0ZMQUdTX09GRlNFVAk0CiAjZGVmaW5lIEZJTkRfUFRFCVwKIAlybHdpbm0JcjEyLCByMTAsIDEzLCAxOSwgMjk7CS8qIENvbXB1dGUgcGdkaXIvcG1kIG9mZnNldCAqLwlcCiAJbHd6eAlyMTEsIHIxMiwgcjExOwkJLyogR2V0IHBnZC9wbWQgZW50cnkgKi8JCVwKQEAgLTQzMSw3ICs0MzAsNiBAQAogCXJsd2ltaQlyMTIsIHIxMCwgMjMsIDIwLCAyODsJLyogQ29tcHV0ZSBwdGUgYWRkcmVzcyAqLwlcCiAJbHd6CXIxMSwgNChyMTIpOwkJLyogR2V0IHB0ZSBlbnRyeSAqLwogI2Vsc2UKLSNkZWZpbmUgUFRFX0ZMQUdTX09GRlNFVAkwCiAjZGVmaW5lIEZJTkRfUFRFCVwKIAlybHdpbWkJcjExLCByMTAsIDEyLCAyMCwgMjk7CS8qIENyZWF0ZSBMMSAocGdkaXIvcG1kKSBhZGRyZXNzICovCVwKIAlsd3oJcjExLCAwKHIxMSk7CQkvKiBHZXQgTDEgZW50cnkgKi8JCQlcCkBAIC01NzksMTMgKzU3NywxOSBAQAogCiAJRklORF9QVEUKIAlhbmRjLglyMTMscjEzLHIxMQkJLyogQ2hlY2sgcGVybWlzc2lvbiAqLwotCWJuZQkyZgkJCS8qIEJhaWwgaWYgcGVybWlzc2lvbiBtaXNtYWNoICovCiAKICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCi0JbHd6CXIxMywgMChyMTIpCisjaWZkZWYgQ09ORklHX1NNUAorCXN1YmYJcjEwLHIxMSxyMTIJCS8qIGNyZWF0ZSBmYWxzZSBkYXRhIGRlcCAqLworCWx3engJcjEzLHIxMSxyMTAJCS8qIEdldCB1cHBlciBwdGUgYml0cyAqLworI2Vsc2UKKwlsd3oJcjEzLDAocjEyKQkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCisjZW5kaWYKICNlbmRpZgogCi0JIC8qIEp1bXAgdG8gY29tbW9uIHRsYiBsb2FkICovCisJYm5lCTJmCQkJLyogQmFpbCBpZiBwZXJtaXNzaW9uL3ZhbGlkIG1pc21hY2ggKi8KKworCS8qIEp1bXAgdG8gY29tbW9uIHRsYiBsb2FkICovCiAJYglmaW5pc2hfdGxiX2xvYWQKIDI6CiAJLyogVGhlIGJhaWxvdXQuICBSZXN0b3JlIHJlZ2lzdGVycyB0byBwcmUtZXhjZXB0aW9uIGNvbmRpdGlvbnMKQEAgLTY0MCwxMSArNjQ0LDE3IEBACiAKIAlGSU5EX1BURQogCWFuZGMuCXIxMyxyMTMscjExCQkvKiBDaGVjayBwZXJtaXNzaW9uICovCi0JYm5lCTJmCQkJLyogQmFpbCBpZiBwZXJtaXNzaW9uIG1pc21hY2ggKi8KIAogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKLQlsd3oJcjEzLCAwKHIxMikKKyNpZmRlZiBDT05GSUdfU01QCisJc3ViZglyMTAscjExLHIxMgkJLyogY3JlYXRlIGZhbHNlIGRhdGEgZGVwICovCisJbHd6eAlyMTMscjExLHIxMAkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCisjZWxzZQorCWx3eglyMTMsMChyMTIpCQkvKiBHZXQgdXBwZXIgcHRlIGJpdHMgKi8KICNlbmRpZgorI2VuZGlmCisKKwlibmUJMmYJCQkvKiBCYWlsIGlmIHBlcm1pc3Npb24gbWlzbWFjaCAqLwogCiAJLyogSnVtcCB0byBjb21tb24gVExCIGxvYWQgcG9pbnQgKi8KIAliCWZpbmlzaF90bGJfbG9hZApAQCAtNzAyLDcgKzcxMiw3IEBACiAvKgogICogQm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgVExCIG1pc3MgZ2V0IHRvIHRoaXMKICAqIHBvaW50IHRvIGxvYWQgdGhlIFRMQi4KLSAqCXIxMCAtIEVBIG9mIGZhdWx0CisgKglyMTAgLSBhdmFpbGFibGUgdG8gdXNlCiAgKglyMTEgLSBUTEIgKGluZm8gZnJvbSBMaW51eCBQVEUpCiAgKglyMTIgLSBhdmFpbGFibGUgdG8gdXNlCiAgKglyMTMgLSB1cHBlciBiaXRzIG9mIFBURSAoaWYgUFRFXzY0QklUKSBvciBhdmFpbGFibGUgdG8gdXNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCmluZGV4IGQzMDhhOWYuLjMxOTgyZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCkBAIC0zNCwxMSArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotLyogdGhpcyBpcyB1c2VkIGZvciBzb2Z0d2FyZSBzdXNwZW5kLCBhbmQgdGhhdCBzaHV0cyBkb3duCi0gKiBDUFVzIGV2ZW4gd2hpbGUgdGhlIHN5c3RlbSBpcyBzdGlsbCBib290aW5nLi4uICovCi0jZGVmaW5lIGNwdV9zaG91bGRfZGllKCkJKGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkgJiYgXAotCQkJCSAgIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcgICAgIFwKLQkJCQkgfHwgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSkKKyNkZWZpbmUgY3B1X3Nob3VsZF9kaWUoKQljcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpCiAjZWxzZQogI2RlZmluZSBjcHVfc2hvdWxkX2RpZSgpCTAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCmluZGV4IDU1MGExOTMuLmVhMWJhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKQEAgLTUxLDE3ICs1MSw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW9tbXVfZnJlZShzdHJ1Y3QgaW9tbXVfdGFibGUgKiwgZG1hX2FkZHJfdCwgdW5zaWduZWQgaW50KTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlvbW11X251bV9wYWdlcyh1bnNpZ25lZCBsb25nIHZhZGRyLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzbGVuKQotewotCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOwotCi0JbnBhZ2VzID0gSU9NTVVfUEFHRV9BTElHTih2YWRkciArIHNsZW4pIC0gKHZhZGRyICYgSU9NTVVfUEFHRV9NQVNLKTsKLQlucGFnZXMgPj49IElPTU1VX1BBR0VfU0hJRlQ7Ci0KLQlyZXR1cm4gbnBhZ2VzOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9wcm90ZWN0NGdiKGNoYXIgKnN0cikKIHsKIAlpZiAoc3RyY21wKHN0ciwgIm9uIikgPT0gMCkKQEAgLTMyNSw3ICszMTQsNyBAQAogCQl9CiAJCS8qIEFsbG9jYXRlIGlvbW11IGVudHJpZXMgZm9yIHRoYXQgc2VnbWVudCAqLwogCQl2YWRkciA9ICh1bnNpZ25lZCBsb25nKSBzZ192aXJ0KHMpOwotCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXModmFkZHIsIHNsZW4pOworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXModmFkZHIsIHNsZW4sIElPTU1VX1BBR0VfU0laRSk7CiAJCWFsaWduID0gMDsKIAkJaWYgKElPTU1VX1BBR0VfU0hJRlQgPCBQQUdFX1NISUZUICYmIHNsZW4gPj0gUEFHRV9TSVpFICYmCiAJCSAgICAodmFkZHIgJiB+UEFHRV9NQVNLKSA9PSAwKQpAQCAtNDE4LDcgKzQwNyw4IEBACiAJCQl1bnNpZ25lZCBsb25nIHZhZGRyLCBucGFnZXM7CiAKIAkJCXZhZGRyID0gcy0+ZG1hX2FkZHJlc3MgJiBJT01NVV9QQUdFX01BU0s7Ci0JCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMocy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgpOworCQkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoLAorCQkJCQkJIElPTU1VX1BBR0VfU0laRSk7CiAJCQlfX2lvbW11X2ZyZWUodGJsLCB2YWRkciwgbnBhZ2VzKTsKIAkJCXMtPmRtYV9hZGRyZXNzID0gRE1BX0VSUk9SX0NPREU7CiAJCQlzLT5kbWFfbGVuZ3RoID0gMDsKQEAgLTQ1Miw3ICs0NDIsOCBAQAogCiAJCWlmIChzZy0+ZG1hX2xlbmd0aCA9PSAwKQogCQkJYnJlYWs7Ci0JCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfaGFuZGxlLCBzZy0+ZG1hX2xlbmd0aCk7CisJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfaGFuZGxlLCBzZy0+ZG1hX2xlbmd0aCwKKwkJCQkJIElPTU1VX1BBR0VfU0laRSk7CiAJCV9faW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5wYWdlcyk7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQpAQCAtNTg0LDcgKzU3NSw3IEBACiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CiAKIAl1YWRkciA9ICh1bnNpZ25lZCBsb25nKXZhZGRyOwotCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyh1YWRkciwgc2l6ZSk7CisJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHVhZGRyLCBzaXplLCBJT01NVV9QQUdFX1NJWkUpOwogCiAJaWYgKHRibCkgewogCQlhbGlnbiA9IDA7CkBAIC02MTcsNyArNjA4LDcgQEAKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAogCWlmICh0YmwpIHsKLQkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9oYW5kbGUsIHNpemUpOworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgc2l6ZSwgSU9NTVVfUEFHRV9TSVpFKTsKIAkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5wYWdlcyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggZDk3MmRlYy4uYWMyMjJkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC00MzksOCArNDM5LDggQEAKIAogc3RhdGljIExJU1RfSEVBRChpcnFfaG9zdHMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpcnFfYmlnX2xvY2spOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgaXJxX3JhZGl4X3JlYWRlcik7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlycV9yYWRpeF93cml0ZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IHJldm1hcF90cmVlc19hbGxvY2F0ZWQ7CitzdGF0aWMgREVGSU5FX01VVEVYKHJldm1hcF90cmVlc19tdXRleCk7CiBzdHJ1Y3QgaXJxX21hcF9lbnRyeSBpcnFfbWFwW05SX0lSUVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBpcnFfdmlycV9jb3VudCA9IE5SX0lSUVM7CiBzdGF0aWMgc3RydWN0IGlycV9ob3N0ICppcnFfZGVmYXVsdF9ob3N0OwpAQCAtNTgzLDU3ICs1ODMsNiBAQAogCQlpcnFfdmlycV9jb3VudCA9IGNvdW50OwogfQogCi0vKiByYWRpeCB0cmVlIG5vdCBsb2NrbGVzcyBzYWZlICEgd2UgdXNlIGEgYnJsb2NrLXR5cGUgbWVjYW5pc20KLSAqIGZvciBub3csIHVudGlsIHdlIGNhbiB1c2UgYSBsb2NrbGVzcyByYWRpeCB0cmVlCi0gKi8KLXN0YXRpYyB2b2lkIGlycV9yYWRpeF93cmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCi17Ci0JdW5zaWduZWQgaW50IGNwdSwgb2s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2JpZ19sb2NrLCAqZmxhZ3MpOwotCWlycV9yYWRpeF93cml0ZXIgPSAxOwotCXNtcF9tYigpOwotCWRvIHsKLQkJYmFycmllcigpOwotCQlvayA9IDE7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJCWlmIChwZXJfY3B1KGlycV9yYWRpeF9yZWFkZXIsIGNwdSkpIHsKLQkJCQlvayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFvaykKLQkJCWNwdV9yZWxheCgpOwotCX0gd2hpbGUoIW9rKTsKLX0KLQotc3RhdGljIHZvaWQgaXJxX3JhZGl4X3dydW5sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc21wX3dtYigpOwotCWlycV9yYWRpeF93cml0ZXIgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9iaWdfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpcnFfcmFkaXhfcmRsb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCWxvY2FsX2lycV9zYXZlKCpmbGFncyk7Ci0JX19nZXRfY3B1X3ZhcihpcnFfcmFkaXhfcmVhZGVyKSA9IDE7Ci0Jc21wX21iKCk7Ci0JaWYgKGxpa2VseShpcnFfcmFkaXhfd3JpdGVyID09IDApKQotCQlyZXR1cm47Ci0JX19nZXRfY3B1X3ZhcihpcnFfcmFkaXhfcmVhZGVyKSA9IDA7Ci0Jc21wX3dtYigpOwotCXNwaW5fbG9jaygmaXJxX2JpZ19sb2NrKTsKLQlfX2dldF9jcHVfdmFyKGlycV9yYWRpeF9yZWFkZXIpID0gMTsKLQlzcGluX3VubG9jaygmaXJxX2JpZ19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgaXJxX3JhZGl4X3JkdW5sb2NrKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JX19nZXRfY3B1X3ZhcihpcnFfcmFkaXhfcmVhZGVyKSA9IDA7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCiBzdGF0aWMgaW50IGlycV9zZXR1cF92aXJxKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkgICAgaXJxX2h3X251bWJlcl90IGh3aXJxKQogewpAQCAtNzg4LDcgKzczNyw2IEBACiB7CiAJc3RydWN0IGlycV9ob3N0ICpob3N0OwogCWlycV9od19udW1iZXJfdCBod2lycTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHZpcnEgPT0gTk9fSVJRKQogCQlyZXR1cm47CkBAIC04MjEsMTIgKzc2OSwxNiBAQAogCQkJaG9zdC0+cmV2bWFwX2RhdGEubGluZWFyLnJldm1hcFtod2lycV0gPSBOT19JUlE7CiAJCWJyZWFrOwogCWNhc2UgSVJRX0hPU1RfTUFQX1RSRUU6Ci0JCS8qIENoZWNrIGlmIHJhZGl4IHRyZWUgYWxsb2NhdGVkIHlldCAqLwotCQlpZiAoaG9zdC0+cmV2bWFwX2RhdGEudHJlZS5nZnBfbWFzayA9PSAwKQorCQkvKgorCQkgKiBDaGVjayBpZiByYWRpeCB0cmVlIGFsbG9jYXRlZCB5ZXQsIGlmIG5vdCB0aGVuIG5vdGhpbmcgdG8KKwkJICogcmVtb3ZlLgorCQkgKi8KKwkJc21wX3JtYigpOworCQlpZiAocmV2bWFwX3RyZWVzX2FsbG9jYXRlZCA8IDEpCiAJCQlicmVhazsKLQkJaXJxX3JhZGl4X3dybG9jaygmZmxhZ3MpOworCQltdXRleF9sb2NrKCZyZXZtYXBfdHJlZXNfbXV0ZXgpOwogCQlyYWRpeF90cmVlX2RlbGV0ZSgmaG9zdC0+cmV2bWFwX2RhdGEudHJlZSwgaHdpcnEpOwotCQlpcnFfcmFkaXhfd3J1bmxvY2soZmxhZ3MpOworCQltdXRleF91bmxvY2soJnJldm1hcF90cmVlc19tdXRleCk7CiAJCWJyZWFrOwogCX0KIApAQCAtODc1LDQ1ICs4MjcsNjQgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9maW5kX21hcHBpbmcpOwogCiAKLXVuc2lnbmVkIGludCBpcnFfcmFkaXhfcmV2bWFwKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKLQkJCSAgICAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3Vuc2lnbmVkIGludCBpcnFfcmFkaXhfcmV2bWFwX2xvb2t1cChzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsCisJCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCiB7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqdHJlZTsKIAlzdHJ1Y3QgaXJxX21hcF9lbnRyeSAqcHRyOwogCXVuc2lnbmVkIGludCB2aXJxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlXQVJOX09OKGhvc3QtPnJldm1hcF90eXBlICE9IElSUV9IT1NUX01BUF9UUkVFKTsKIAotCS8qIENoZWNrIGlmIHRoZSByYWRpeCB0cmVlIGV4aXN0IHlldC4gV2UgdGVzdCB0aGUgdmFsdWUgb2YKLQkgKiB0aGUgZ2ZwX21hc2sgZm9yIHRoYXQuIFNuZWFreSBidXQgc2F2ZXMgYW5vdGhlciBpbnQgaW4gdGhlCi0JICogc3RydWN0dXJlLiBJZiBub3QsIHdlIGZhbGxiYWNrIHRvIHNsb3cgbW9kZQorCS8qCisJICogQ2hlY2sgaWYgdGhlIHJhZGl4IHRyZWUgZXhpc3RzIGFuZCBoYXMgYmVlIGluaXRpYWxpemVkLgorCSAqIElmIG5vdCwgd2UgZmFsbGJhY2sgdG8gc2xvdyBtb2RlCiAJICovCi0JdHJlZSA9ICZob3N0LT5yZXZtYXBfZGF0YS50cmVlOwotCWlmICh0cmVlLT5nZnBfbWFzayA9PSAwKQorCWlmIChyZXZtYXBfdHJlZXNfYWxsb2NhdGVkIDwgMikKIAkJcmV0dXJuIGlycV9maW5kX21hcHBpbmcoaG9zdCwgaHdpcnEpOwogCiAJLyogTm93IHRyeSB0byByZXNvbHZlICovCi0JaXJxX3JhZGl4X3JkbG9jaygmZmxhZ3MpOwotCXB0ciA9IHJhZGl4X3RyZWVfbG9va3VwKHRyZWUsIGh3aXJxKTsKLQlpcnFfcmFkaXhfcmR1bmxvY2soZmxhZ3MpOworCS8qCisJICogTm8gcmN1X3JlYWRfbG9jayhpbmcpIG5lZWRlZCwgdGhlIHB0ciByZXR1cm5lZCBjYW4ndCBnbyB1bmRlciB1cworCSAqIGFzIGl0J3MgcmVmZXJlbmNpbmcgYW4gZW50cnkgaW4gdGhlIHN0YXRpYyBpcnFfbWFwIHRhYmxlLgorCSAqLworCXB0ciA9IHJhZGl4X3RyZWVfbG9va3VwKCZob3N0LT5yZXZtYXBfZGF0YS50cmVlLCBod2lycSk7CiAKLQkvKiBGb3VuZCBpdCwgcmV0dXJuICovCi0JaWYgKHB0cikgeworCS8qCisJICogSWYgZm91bmQgaW4gcmFkaXggdHJlZSwgdGhlbiBmaW5lLgorCSAqIEVsc2UgZmFsbGJhY2sgdG8gbGluZWFyIGxvb2t1cCAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gcHJhY3RpY2UKKwkgKiBhcyBpdCBtZWFucyB0aGF0IHdlIGZhaWxlZCB0byBpbnNlcnQgdGhlIG5vZGUgaW4gdGhlIHJhZGl4IHRyZWUuCisJICovCisJaWYgKHB0cikKIAkJdmlycSA9IHB0ciAtIGlycV9tYXA7Ci0JCXJldHVybiB2aXJxOwotCX0KKwllbHNlCisJCXZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGhvc3QsIGh3aXJxKTsKIAotCS8qIElmIG5vdCB0aGVyZSwgdHJ5IHRvIGluc2VydCBpdCAqLwotCXZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGhvc3QsIGh3aXJxKTsKLQlpZiAodmlycSAhPSBOT19JUlEpIHsKLQkJaXJxX3JhZGl4X3dybG9jaygmZmxhZ3MpOwotCQlyYWRpeF90cmVlX2luc2VydCh0cmVlLCBod2lycSwgJmlycV9tYXBbdmlycV0pOwotCQlpcnFfcmFkaXhfd3J1bmxvY2soZmxhZ3MpOwotCX0KIAlyZXR1cm4gdmlycTsKIH0KIAordm9pZCBpcnFfcmFkaXhfcmV2bWFwX2luc2VydChzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisKKwlXQVJOX09OKGhvc3QtPnJldm1hcF90eXBlICE9IElSUV9IT1NUX01BUF9UUkVFKTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHJhZGl4IHRyZWUgZXhpc3RzIHlldC4KKwkgKiBJZiBub3QsIHRoZW4gdGhlIGlycSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIHRyZWUgd2hlbiBpdCBnZXRzCisJICogaW5pdGlhbGl6ZWQuCisJICovCisJc21wX3JtYigpOworCWlmIChyZXZtYXBfdHJlZXNfYWxsb2NhdGVkIDwgMSkKKwkJcmV0dXJuOworCisJaWYgKHZpcnEgIT0gTk9fSVJRKSB7CisJCW11dGV4X2xvY2soJnJldm1hcF90cmVlc19tdXRleCk7CisJCXJhZGl4X3RyZWVfaW5zZXJ0KCZob3N0LT5yZXZtYXBfZGF0YS50cmVlLCBod2lycSwKKwkJCQkgICZpcnFfbWFwW3ZpcnFdKTsKKwkJbXV0ZXhfdW5sb2NrKCZyZXZtYXBfdHJlZXNfbXV0ZXgpOworCX0KK30KKwogdW5zaWduZWQgaW50IGlycV9saW5lYXJfcmV2bWFwKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKIAkJCSAgICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCiB7CkBAIC0xMDIwLDE0ICs5OTEsNDQgQEAKIHN0YXRpYyBpbnQgaXJxX2xhdGVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBpcnFfaG9zdCAqaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOwogCi0JaXJxX3JhZGl4X3dybG9jaygmZmxhZ3MpOworCS8qCisJICogTm8gbXV0dWFsIGV4Y2x1c2lvbiB3aXRoIHJlc3BlY3QgdG8gYWNjZXNzb3JzIG9mIHRoZSB0cmVlIGlzIG5lZWRlZAorCSAqIGhlcmUgYXMgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBkb25lIHZpYSB0aGUgc3RhdGUgdmFyaWFibGUKKwkgKiByZXZtYXBfdHJlZXNfYWxsb2NhdGVkLgorCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlycV9ob3N0cywgbGluaykgewogCQlpZiAoaC0+cmV2bWFwX3R5cGUgPT0gSVJRX0hPU1RfTUFQX1RSRUUpCi0JCQlJTklUX1JBRElYX1RSRUUoJmgtPnJldm1hcF9kYXRhLnRyZWUsIEdGUF9BVE9NSUMpOworCQkJSU5JVF9SQURJWF9UUkVFKCZoLT5yZXZtYXBfZGF0YS50cmVlLCBHRlBfS0VSTkVMKTsKIAl9Ci0JaXJxX3JhZGl4X3dydW5sb2NrKGZsYWdzKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSByYWRpeCB0cmVlcyBpbml0cyBhcmUgdmlzaWJsZSBiZWZvcmUgc2V0dGluZworCSAqIHRoZSBmbGFnCisJICovCisJc21wX3dtYigpOworCXJldm1hcF90cmVlc19hbGxvY2F0ZWQgPSAxOworCisJLyoKKwkgKiBJbnNlcnQgdGhlIHJldmVyc2UgbWFwcGluZyBmb3IgdGhvc2UgaW50ZXJydXB0cyBhbHJlYWR5IHByZXNlbnQKKwkgKiBpbiBpcnFfbWFwW10uCisJICovCisJbXV0ZXhfbG9jaygmcmV2bWFwX3RyZWVzX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgaXJxX3ZpcnFfY291bnQ7IGkrKykgeworCQlpZiAoaXJxX21hcFtpXS5ob3N0ICYmCisJCSAgICAoaXJxX21hcFtpXS5ob3N0LT5yZXZtYXBfdHlwZSA9PSBJUlFfSE9TVF9NQVBfVFJFRSkpCisJCQlyYWRpeF90cmVlX2luc2VydCgmaXJxX21hcFtpXS5ob3N0LT5yZXZtYXBfZGF0YS50cmVlLAorCQkJCQkgIGlycV9tYXBbaV0uaHdpcnEsICZpcnFfbWFwW2ldKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZyZXZtYXBfdHJlZXNfbXV0ZXgpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHJhZGl4IHRyZWVzIGluc2VydGlvbnMgYXJlIHZpc2libGUgYmVmb3JlIHNldHRpbmcKKwkgKiB0aGUgZmxhZworCSAqLworCXNtcF93bWIoKTsKKwlyZXZtYXBfdHJlZXNfYWxsb2NhdGVkID0gMjsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2tnZGIuYwppbmRleCBiNGZkZjJmLi5mZThmNzFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2tnZGIuYwpAQCAtMzQ3LDkgKzM0Nyw4IEBACiAJCQlsaW51eF9yZWdzLT5tc3IgfD0gTVNSX1NFOwogI2VuZGlmCiAJCQlrZ2RiX3NpbmdsZV9zdGVwID0gMTsKLQkJCWlmIChrZ2RiX2NvbnR0aHJlYWQpCi0JCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCi0JCQkJCSAgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCisJCQkJICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwppbmRleCBiM2VlZjMwLi5kMDUxZThjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwpAQCAtNTEwLDEwICs1MTAsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiJXM6IGN1cnJlbnRfZW50aXRsZWQgPSAlbHUsIGN1cnJlbnRfd2VpZ2h0ID0gJXVcbiIsCi0JICAgICAgICAgX19GVU5DVElPTl9fLCBwcHBfZGF0YS5lbnRpdGxlbWVudCwgcHBwX2RhdGEud2VpZ2h0KTsKKwkJIF9fZnVuY19fLCBwcHBfZGF0YS5lbnRpdGxlbWVudCwgcHBwX2RhdGEud2VpZ2h0KTsKIAogCXByX2RlYnVnKCIlczogbmV3X2VudGl0bGVkID0gJWx1LCBuZXdfd2VpZ2h0ID0gJXVcbiIsCi0JCSBfX0ZVTkNUSU9OX18sIG5ld19lbnRpdGxlZCwgbmV3X3dlaWdodCk7CisJCSBfX2Z1bmNfXywgbmV3X2VudGl0bGVkLCBuZXdfd2VpZ2h0KTsKIAogCXJldHZhbCA9IHBscGFyX2hjYWxsX25vcmV0cyhIX1NFVF9QUFAsIG5ld19lbnRpdGxlZCwgbmV3X3dlaWdodCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTU1NiwxMCArNTU2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoIiVzOiBjdXJyZW50X2VudGl0bGVkID0gJWx1LCBjdXJyZW50X3dlaWdodCA9ICV1XG4iLAotCSAgICAgICAgIF9fRlVOQ1RJT05fXywgbXBwX2RhdGEuZW50aXRsZWRfbWVtLCBtcHBfZGF0YS5tZW1fd2VpZ2h0KTsKKwkgICAgICAgICBfX2Z1bmNfXywgbXBwX2RhdGEuZW50aXRsZWRfbWVtLCBtcHBfZGF0YS5tZW1fd2VpZ2h0KTsKIAogCXByX2RlYnVnKCIlczogbmV3X2VudGl0bGVkID0gJWx1LCBuZXdfd2VpZ2h0ID0gJXVcbiIsCi0JICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdfZW50aXRsZWQsIG5ld193ZWlnaHQpOworCQkgX19mdW5jX18sIG5ld19lbnRpdGxlZCwgbmV3X3dlaWdodCk7CiAKIAlyYyA9IHBscGFyX2hjYWxsX25vcmV0cyhIX1NFVF9NUFAsIG5ld19lbnRpdGxlZCwgbmV3X3dlaWdodCk7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwppbmRleCA4NWNiNmYzLi4yZDI5NzUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwpAQCAtMzEsMTEgKzMxLDE0IEBACiAJbWZscglyMAogCWJsCTFmCiAxOgltZmxyCXIzCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI0LDFiKQorCVBQQ19MTAlyNCwoMmYtMWIpKHIzKQogCXN1YmYJcjMscjQscjMKIAltdGxyCXIwCiAJYmxyCiAKKwkuYWxpZ24JMworMjoJUFBDX0xPTkcgMWIKKwogLyoKICAqIGFkZF9yZWxvY19vZmZzZXQoeCkgcmV0dXJucyB4ICsgcmVsb2Nfb2Zmc2V0KCkuCiAgKi8KQEAgLTQzLDEyICs0NiwxNSBAQAogCW1mbHIJcjAKIAlibAkxZgogMToJbWZscglyNQotCUxPQURfUkVHX0lNTUVESUFURShyNCwxYikKKwlQUENfTEwJcjQsKDJmLTFiKShyNSkKIAlzdWJmCXI1LHI0LHI1CiAJYWRkCXIzLHIzLHI1CiAJbXRscglyMAogCWJscgogCisJLmFsaWduCTMKKzI6CVBQQ19MT05HIDFiCisKIF9HTE9CQUwoa2VybmVsX2V4ZWN2ZSkKIAlsaQlyMCxfX05SX2V4ZWN2ZQogCXNjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCmluZGV4IDdhNmRmYmMuLjZhOWI0YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCkBAIC0yNzQsNiArMjc0LDEwIEBACiAvKgogICogRmx1c2ggTU1VIFRMQgogICovCisjaWZuZGVmIENPTkZJR19GU0xfQk9PS0UKK19HTE9CQUwoX3RsYmlsX2FsbCkKK19HTE9CQUwoX3RsYmlsX3BpZCkKKyNlbmRpZgogX0dMT0JBTChfdGxiaWEpCiAjaWYgZGVmaW5lZChDT05GSUdfNDB4KQogCXN5bmMJCQkvKiBGbHVzaCB0byBtZW1vcnkgYmVmb3JlIGNoYW5naW5nIG1hcHBpbmcgKi8KQEAgLTM0NCw2ICszNDgsOSBAQAogLyoKICAqIEZsdXNoIE1NVSBUTEIgZm9yIGEgcGFydGljdWxhciBhZGRyZXNzCiAgKi8KKyNpZm5kZWYgQ09ORklHX0ZTTF9CT09LRQorX0dMT0JBTChfdGxiaWxfdmEpCisjZW5kaWYKIF9HTE9CQUwoX3RsYmllKQogI2lmIGRlZmluZWQoQ09ORklHXzQweCkKIAkvKiBXZSBydW4gdGhlIHNlYXJjaCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgYmVjYXVzZSB3ZSBoYXZlIHRvIGNoYW5nZQpAQCAtNDM2LDYgKzQ0Myw1MyBAQAogI2VuZGlmIC8qICEgQ09ORklHXzQweCAqLwogCWJscgogCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0JPT0tFKQorLyoKKyAqIEZsdXNoIE1NVSBUTEIsIGJ1dCBvbmx5IG9uIHRoZSBsb2NhbCBwcm9jZXNzb3IgKG5vIGJyb2FkY2FzdCkKKyAqLworX0dMT0JBTChfdGxiaWxfYWxsKQorI2RlZmluZSBNTVVDU1IwX1RMQkZJCShNTVVDU1IwX1RMQjBGSSB8IE1NVUNTUjBfVExCMUZJIHwgXAorCQkJIE1NVUNTUjBfVExCMkZJIHwgTU1VQ1NSMF9UTEIzRkkpCisJbGkJcjMsKE1NVUNTUjBfVExCRkkpQGwKKwltdHNwcglTUFJOX01NVUNTUjAsIHIzCisxOgorCW1mc3ByCXIzLFNQUk5fTU1VQ1NSMAorCWFuZGkuCXIzLHIzLE1NVUNTUjBfVExCRklAbAorCWJuZQkxYgorCWJscgorCisvKgorICogRmx1c2ggTU1VIFRMQiBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3MgaWQsIGJ1dCBvbmx5IG9uIHRoZSBsb2NhbCBwcm9jZXNzb3IKKyAqIChubyBicm9hZGNhc3QpCisgKi8KK19HTE9CQUwoX3RsYmlsX3BpZCkKKy8qIHdlIGN1cnJlbnRseSBkbyBhbiBpbnZhbGlkYXRlIGFsbCBzaW5jZSB3ZSBkb24ndCBoYXZlIHBlciBwaWQgaW52YWxpZGF0ZSAqLworCWxpCXIzLChNTVVDU1IwX1RMQkZJKUBsCisJbXRzcHIJU1BSTl9NTVVDU1IwLCByMworMToKKwltZnNwcglyMyxTUFJOX01NVUNTUjAKKwlhbmRpLglyMyxyMyxNTVVDU1IwX1RMQkZJQGwKKwlibmUJMWIKKwlibHIKKworLyoKKyAqIEZsdXNoIE1NVSBUTEIgZm9yIGEgcGFydGljdWxhciBhZGRyZXNzLCBidXQgb25seSBvbiB0aGUgbG9jYWwgcHJvY2Vzc29yCisgKiAobm8gYnJvYWRjYXN0KQorICovCitfR0xPQkFMKF90bGJpbF92YSkKKwlzbHdpCXI0LHI0LDE2CisJbXRzcHIJU1BSTl9NQVM2LHI0CQkvKiBhc3N1bWUgQVM9MCBmb3Igbm93ICovCisJdGxic3gJMCxyMworCW1mc3ByCXI0LFNQUk5fTUFTMQkJLyogY2hlY2sgdmFsaWQgKi8KKwlhbmRpcy4JcjMscjQsTUFTMV9WQUxJREBoCisJYmVxbHIKKwlybHdpbm0JcjQscjQsMCwxLDMxCisJbXRzcHIJU1BSTl9NQVMxLHI0CisJdGxid2UKKwlibHIKKyNlbmRpZiAvKiBDT05GSUdfRlNMX0JPT0tFICovCisKKwogLyoKICAqIEZsdXNoIGluc3RydWN0aW9uIGNhY2hlLgogICogVGhpcyBpcyBhIG5vLW9wIG9uIHRoZSA2MDEuCkBAIC04NDYsOCArOTAwLDEwIEBACiAJbGkJcjQsMAkJLyogbmV3IHNwICh1bnVzZWQpICovCiAJbGkJcjAsX19OUl9jbG9uZQogCXNjCi0JY21wd2kJMCxyMywwCQkvKiBwYXJlbnQgb3IgY2hpbGQ/ICovCi0JYm5lCTFmCQkvKiByZXR1cm4gaWYgcGFyZW50ICovCisJYm5zKwkxZgkJLyogZGlkIHN5c3RlbSBjYWxsIGluZGljYXRlIGVycm9yPyAqLworCW5lZwlyMyxyMwkJLyogaWYgc28sIG1ha2UgcmV0dXJuIGNvZGUgbmVnYXRpdmUgKi8KKzE6CWNtcHdpCTAscjMsMAkJLyogcGFyZW50IG9yIGNoaWxkPyAqLworCWJuZQkyZgkJLyogcmV0dXJuIGlmIHBhcmVudCAqLwogCWxpCXIwLDAJCS8qIG1ha2UgdG9wLWxldmVsIHN0YWNrIGZyYW1lICovCiAJc3R3dQlyMCwtMTYocjEpCiAJbXRscglyMzAJCS8qIGZuIGFkZHIgaW4gbHIgKi8KQEAgLTg1Nyw3ICs5MTMsNyBAQAogCWxpCXIwLF9fTlJfZXhpdAkvKiBleGl0IGlmIGZ1bmN0aW9uIHJldHVybnMgKi8KIAlsaQlyMywwCiAJc2MKLTE6CWx3eglyMzAsOChyMSkKKzI6CWx3eglyMzAsOChyMSkKIAlsd3oJcjMxLDEyKHIxKQogCWFkZGkJcjEscjEsMTYKIAlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggNGRkNzBjZi4uMzA1M2ZlNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTQyNiw4ICs0MjYsMTAgQEAKIAlsaQlyNCwwCQkvKiBuZXcgc3AgKHVudXNlZCkgKi8KIAlsaQlyMCxfX05SX2Nsb25lCiAJc2MKLQljbXBkaQkwLHIzLDAJCS8qIHBhcmVudCBvciBjaGlsZD8gKi8KLQlibmUJMWYJCS8qIHJldHVybiBpZiBwYXJlbnQgKi8KKwlibnMrCTFmCQkvKiBkaWQgc3lzdGVtIGNhbGwgaW5kaWNhdGUgZXJyb3I/ICovCisJbmVnCXIzLHIzCQkvKiBpZiBzbywgbWFrZSByZXR1cm4gY29kZSBuZWdhdGl2ZSAqLworMToJY21wZGkJMCxyMywwCQkvKiBwYXJlbnQgb3IgY2hpbGQ/ICovCisJYm5lCTJmCQkvKiByZXR1cm4gaWYgcGFyZW50ICovCiAJbGkJcjAsMAogCXN0ZHUJcjAsLVNUQUNLX0ZSQU1FX09WRVJIRUFEKHIxKQogCWxkCXIyLDgocjI5KQpAQCAtNDM4LDcgKzQ0MCw3IEBACiAJbGkJcjAsX19OUl9leGl0CS8qIGV4aXQgYWZ0ZXIgY2hpbGQgZXhpdHMgKi8KICAgICAgICAgbGkJcjMsMAogCXNjCi0xOglhZGRpCXIxLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECQorMjoJYWRkaQlyMSxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxkCXIyOSwtMjQocjEpCiAJbGQJcjMwLC0xNihyMSkKIAlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV82NC5jCmluZGV4IGVlNmEyOTguLjFhZjIzNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfNjQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxhc20vbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KQEAgLTQyLDEzICs0MSw2IEBACiAjZGVmaW5lIERFQlVHUChmbXQgLCAuLi4pCiAjZW5kaWYKIAotLyogVGhlcmUncyBhY3R1YWxseSBhIHRoaXJkIGVudHJ5IGhlcmUsIGJ1dCBpdCdzIHVudXNlZCAqLwotc3RydWN0IHBwYzY0X29wZF9lbnRyeQotewotCXVuc2lnbmVkIGxvbmcgZnVuY2FkZHI7Ci0JdW5zaWduZWQgbG9uZyByMjsKLX07Ci0KIC8qIExpa2UgUFBDMzIsIHdlIG5lZWQgbGl0dGxlIHRyYW1wb2xpbmVzIHRvIGRvID4gMjQtYml0IGp1bXBzIChpbnRvCiAgICB0aGUga2VybmVsIGl0c2VsZikuICBCdXQgb24gUFBDNjQsIHRoZXNlIG5lZWQgdG8gYmUgdXNlZCBmb3IgZXZlcnkKICAgIGp1bXAsIGFjdHVhbGx5LCB0byByZXNldCByMiAoVE9DKzB4ODAwMCkuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCBlOWJlOTA4Li45M2FlNWIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CiAJZGV2LT5kZXYucmVsZWFzZSA9IG9mX3JlbGVhc2VfZGV2OwogCWRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUgPSBucDsKLQlkZXYtPmRldi5hcmNoZGF0YS5udW1hX25vZGUgPSBvZl9ub2RlX3RvX25pZChucCk7CisJc2V0X2Rldl9ub2RlKCZkZXYtPmRldiwgb2Zfbm9kZV90b19uaWQobnApKTsKIAogCWlmIChidXNfaWQpCiAJCXN0cmxjcHkoZGV2LT5kZXYuYnVzX2lkLCBidXNfaWQsIEJVU19JRF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKaW5kZXggYzliZjE3ZS4uNDhhMzQ3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wYWNhLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9scHBhY2EuaD4KICNpbmNsdWRlIDxhc20vcGFjYS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAvKiBUaGlzIHN5bWJvbCBpcyBwcm92aWRlZCBieSB0aGUgbGlua2VyIC0gbGV0IGl0IGZpbGwgaW4gdGhlIHBhY2EKICAqIGZpZWxkIGNvcnJlY3RseSAqLwpAQCAtNzksNiArODAsOCBAQAogCQluZXdfcGFjYS0+bG9ja190b2tlbiA9IDB4ODAwMDsKIAkJbmV3X3BhY2EtPnBhY2FfaW5kZXggPSBjcHU7CiAJCW5ld19wYWNhLT5rZXJuZWxfdG9jID0ga2VybmVsX3RvYzsKKwkJbmV3X3BhY2EtPmtlcm5lbGJhc2UgPSAodW5zaWduZWQgbG9uZykgX3N0ZXh0OworCQluZXdfcGFjYS0+a2VybmVsX21zciA9IE1TUl9LRVJORUw7CiAJCW5ld19wYWNhLT5od19jcHVfaWQgPSAweGZmZmY7CiAJCW5ld19wYWNhLT5zbGJfc2hhZG93X3B0ciA9ICZzbGJfc2hhZG93W2NwdV07CiAJCW5ld19wYWNhLT5fX2N1cnJlbnQgPSAmaW5pdF90YXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCBlYTBjNjFlLi4wMWNlOGMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwpAQCAtNTYsNiArNTYsMzQgQEAKIC8qIERlZmF1bHQgUENJIGZsYWdzIGlzIDAgKi8KIHVuc2lnbmVkIGludCBwcGNfcGNpX2ZsYWdzOwogCitzdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7CisKK3ZvaWQgc2V0X3BjaV9kbWFfb3BzKHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMpCit7CisJcGNpX2RtYV9vcHMgPSBkbWFfb3BzOworfQorCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpnZXRfcGNpX2RtYV9vcHModm9pZCkKK3sKKwlyZXR1cm4gcGNpX2RtYV9vcHM7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9wY2lfZG1hX29wcyk7CisKK2ludCBwY2lfc2V0X2RtYV9tYXNrKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU2NCBtYXNrKQoreworCXJldHVybiBkbWFfc2V0X21hc2soJmRldi0+ZGV2LCBtYXNrKTsKK30KKworaW50IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzaykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGRtYV9zZXRfbWFzaygmZGV2LT5kZXYsIG1hc2spOworCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKKworCXJldHVybiByYzsKK30KKwogc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CkBAIC0xODAsNiArMjA4LDI2IEBACiAJcmV0dXJuIHN0cjsKIH0KIAordm9pZCBfX2RldmluaXQgcGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldl9hcmNoZGF0YSAqc2QgPSAmZGV2LT5kZXYuYXJjaGRhdGE7CisKKwlzZC0+b2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCisJREJHKCJQQ0k6IGRldmljZSAlcyBPRiBub2RlOiAlc1xuIiwgcGNpX25hbWUoZGV2KSwKKwkgICAgc2QtPm9mX25vZGUgPyBzZC0+b2Zfbm9kZS0+ZnVsbF9uYW1lIDogIjxub25lPiIpOworCisJc2QtPmRtYV9vcHMgPSBwY2lfZG1hX29wczsKKyNpZmRlZiBDT05GSUdfUFBDMzIKKwlzZC0+ZG1hX2RhdGEgPSAodm9pZCAqKVBDSV9EUkFNX09GRlNFVDsKKyNlbmRpZgorCXNldF9kZXZfbm9kZSgmZGV2LT5kZXYsIHBjaWJ1c190b19ub2RlKGRldi0+YnVzKSk7CisKKwlpZiAocHBjX21kLnBjaV9kbWFfZGV2X3NldHVwKQorCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKTsKKwogLyoKICAqIFJlYWRzIHRoZSBpbnRlcnJ1cHQgcGluIHRvIGRldGVybWluZSBpZiBpbnRlcnJ1cHQgaXMgdXNlIGJ5IGNhcmQuCiAgKiBJZiB0aGUgaW50ZXJydXB0IGlzIHVzZWQsIHRoZW4gZ2V0cyB0aGUgaW50ZXJydXB0IGxpbmUgZnJvbSB0aGUKQEAgLTM3MSw3ICs0MTksNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7CisJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9ICgocmVzb3VyY2Vfc2l6ZV90KXBmbikgPDwgUEFHRV9TSElGVDsKIAlpbnQgaTsKIAogCWlmIChwYWdlX2lzX3JhbShwZm4pKQpAQCAtNDIyLDcgKzQ3MCw4IEBACiBpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCiB7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0KKwkJKChyZXNvdXJjZV9zaXplX3Qpdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwogCWludCByZXQ7CiAKQEAgLTczMSwxMSArNzgwLDYgQEAKIAogCXJlcy0+c3RhcnQgPSAocmVzLT5zdGFydCArIG9mZnNldCkgJiBtYXNrOwogCXJlcy0+ZW5kID0gKHJlcy0+ZW5kICsgb2Zmc2V0KSAmIG1hc2s7Ci0KLQlwcl9kZWJ1ZygiUENJOiVzICAgICAgICAgICAgJTAxNmxseC0lMDE2bGx4XG4iLAotCQkgcGNpX25hbWUoZGV2KSwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQpOwogfQogCiAKQEAgLTc4MSw2ICs4MjUsMTEgQEAKIAkJCSAodW5zaWduZWQgaW50KXJlcy0+ZmxhZ3MpOwogCiAJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKKworCQlwcl9kZWJ1ZygiUENJOiVzICAgICAgICAgICAgJTAxNmxseC0lMDE2bGx4XG4iLAorCQkJIHBjaV9uYW1lKGRldiksCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQpOwogCX0KIAogCS8qIENhbGwgbWFjaGluZSBzcGVjaWZpYyByZXNvdXJjZSBmaXh1cCAqLwpAQCAtNzg5LDU4ICs4MzgsMTI3IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpYmlvc19maXh1cF9yZXNvdXJjZXMpOwogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgX19wY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorLyogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaWd1cmUgb3V0IGlmIGEgYnJpZGdlIHJlc291cmNlIGhhcyBiZWVuIGluaXRpYWxpemVkCisgKiBieSB0aGUgZmlybXdhcmUgb3Igbm90LiBJdCBkb2Vzbid0IGhhdmUgdG8gYmUgYWJzb2x1dGVseSBidWxsZXQgcHJvb2YsIGJ1dAorICogdGhpbmdzIGdvIG1vcmUgc21vb3RobHkgd2hlbiBpdCBnZXRzIGl0IHJpZ2h0LiBJdCBzaG91bGQgY292ZXJzIGNhc2VzIHN1Y2gKKyAqIGFzIEFwcGxlICJjbG9zZWQiIGJyaWRnZSByZXNvdXJjZXMgYW5kIGJhcmUtbWV0YWwgcFNlcmllcyB1bmFzc2lnbmVkIGJyaWRnZXMKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcGNpYmlvc191bmluaXRpYWxpemVkX2JyaWRnZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBidXMtPnNlbGY7CisJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldDsKKwl1MTYgY29tbWFuZDsKKwlpbnQgaTsKKworCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGlmIFBDSV9QUk9CRV9PTkxZIGlzIHNldCAqLworCWlmIChwcGNfcGNpX2ZsYWdzICYgUFBDX1BDSV9QUk9CRV9PTkxZKQorCQlyZXR1cm4gMDsKKworCS8qIEpvYiBpcyBhIGJpdCBkaWZmZXJlbnQgYmV0d2VlbiBtZW1vcnkgYW5kIElPICovCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQkvKiBJZiB0aGUgQkFSIGlzIG5vbi0wIChyZXMgIT0gcGNpX21lbV9vZmZzZXQpIHRoZW4gaXQncyBwcm9iYWJseSBiZWVuCisJCSAqIGluaXRpYWxpemVkIGJ5IHNvbWVib2R5CisJCSAqLworCQlpZiAocmVzLT5zdGFydCAhPSBob3NlLT5wY2lfbWVtX29mZnNldCkKKwkJCXJldHVybiAwOworCisJCS8qIFRoZSBCQVIgaXMgMCwgbGV0J3MgY2hlY2sgaWYgbWVtb3J5IGRlY29kaW5nIGlzIGVuYWJsZWQgb24KKwkJICogdGhlIGJyaWRnZS4gSWYgbm90LCB3ZSBjb25zaWRlciBpdCB1bmFzc2lnbmVkCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJCWlmICgoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSkgPT0gMCkKKwkJCXJldHVybiAxOworCisJCS8qIE1lbW9yeSBkZWNvZGluZyBpcyBlbmFibGVkIGFuZCB0aGUgQkFSIGlzIDAuIElmIGFueSBvZiB0aGUgYnJpZGdlCisJCSAqIHJlc291cmNlcyBjb3ZlcnMgdGhhdCBzdGFydGluZyBhZGRyZXNzICgwIHRoZW4gaXQncyBnb29kIGVub3VnaCBmb3IKKwkJICogdXMgZm9yIG1lbW9yeQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJaWYgKChob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICYmCisJCQkgICAgaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCA9PSBob3NlLT5wY2lfbWVtX29mZnNldCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFdlbGwsIGl0IHN0YXJ0cyBhdCAwIGFuZCB3ZSBrbm93IGl0IHdpbGwgY29sbGlkZSBzbyB3ZSBtYXkgYXMKKwkJICogd2VsbCBjb25zaWRlciBpdCBhcyB1bmFzc2lnbmVkLiBUaGF0IGNvdmVycyB0aGUgQXBwbGUgY2FzZS4KKwkJICovCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBCQVIgaXMgbm9uLTAsIHRoZW4gd2UgY29uc2lkZXIgaXQgYXNzaWduZWQgKi8KKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJCWlmICgoKHJlcy0+c3RhcnQgLSBvZmZzZXQpICYgMHhmZmZmZmZmZnVsKSAhPSAwKQorCQkJcmV0dXJuIDA7CisKKwkJLyogSGVyZSwgd2UgYXJlIGEgYml0IGRpZmZlcmVudCB0aGFuIG1lbW9yeSBhcyB0eXBpY2FsbHkgSU8gc3BhY2UKKwkJICogc3RhcnRpbmcgYXQgbG93IGFkZHJlc3NlcyAtaXMtIHZhbGlkLiBXaGF0IHdlIGRvIGluc3RlYWQgaWYgdGhhdAorCQkgKiB3ZSBjb25zaWRlciBhcyB1bmFzc2lnbmVkIGFueXRoaW5nIHRoYXQgZG9lc24ndCBoYXZlIElPIGVuYWJsZWQKKwkJICogaW4gdGhlIFBDSSBjb21tYW5kIHJlZ2lzdGVyLCBhbmQgdGhhdCdzIGl0LgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQlpZiAoY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKQorCQkJcmV0dXJuIDA7CisKKwkJLyogSXQncyBzdGFydGluZyBhdCAwIGFuZCBJTyBpcyBkaXNhYmxlZCBpbiB0aGUgYnJpZGdlLCBjb25zaWRlcgorCQkgKiBpdCB1bmFzc2lnbmVkCisJCSAqLworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIEZpeHVwIHJlc291cmNlcyBvZiBhIFBDSTwtPlBDSSBicmlkZ2UgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpOworCisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGJ1cy0+c2VsZjsKKworCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7ICsraSkgeworCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKCFyZXMtPmZsYWdzKQorCQkJY29udGludWU7CisJCWlmIChpID49IDMgJiYgYnVzLT5zZWxmLT50cmFuc3BhcmVudCkKKwkJCWNvbnRpbnVlOworCisJCXByX2RlYnVnKCJQQ0k6JXMgQnVzIHJzcmMgJWQgJTAxNmxseC0lMDE2bGx4IFsleF0gZml4dXAuLi5cbiIsCisJCQkgcGNpX25hbWUoZGV2KSwgaSwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsXAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQsCisJCQkgKHVuc2lnbmVkIGludClyZXMtPmZsYWdzKTsKKworCQkvKiBQZXJmb3JtIGZpeHVwICovCisJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKKworCQkvKiBUcnkgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgUDJQIGJyaWRnZSByZXNvdXJjZXMsCisJCSAqIGFuZCBjbGVhciB0aGVtIG91dCBzbyB0aGV5IGdldCByZS1hc3NpZ25lZCBsYXRlcgorCQkgKi8KKwkJaWYgKHBjaWJpb3NfdW5pbml0aWFsaXplZF9icmlkZ2VfcmVzb3VyY2UoYnVzLCByZXMpKSB7CisJCQlyZXMtPmZsYWdzID0gMDsKKwkJCXByX2RlYnVnKCJQQ0k6JXMgICAgICAgICAgICAodW5hc3NpZ25lZClcbiIsIHBjaV9uYW1lKGRldikpOworCQl9IGVsc2UgeworCisJCQlwcl9kZWJ1ZygiUENJOiVzICAgICAgICAgICAgJTAxNmxseC0lMDE2bGx4XG4iLAorCQkJCSBwY2lfbmFtZShkZXYpLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCisJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgX19wY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBidXMtPnNlbGY7CiAKIAlwcl9kZWJ1ZygiUENJOiBGaXh1cCBidXMgJWQgKCVzKVxuIiwgYnVzLT5udW1iZXIsIGRldiA/IHBjaV9uYW1lKGRldikgOiAiUEhCIik7CiAKIAkvKiBGaXh1cCBQQ0k8LT5QQ0kgYnJpZGdlcy4gSG9zdCBicmlkZ2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHksIGZvcgogCSAqIG5vdyBkaWZmZXJlbnRseSBiZXR3ZWVuIDMyIGFuZCA2NCBiaXRzLgogCSAqLwotCWlmIChkZXYgIT0gTlVMTCkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgKytpKSB7Ci0JCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIXJlcy0+ZmxhZ3MpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaSA+PSAzICYmIGJ1cy0+c2VsZi0+dHJhbnNwYXJlbnQpCi0JCQkJY29udGludWU7Ci0JCQkvKiBPbiBQb3dlck1hYywgQXBwbGUgbGVhdmVzIGJyaWRnZSB3aW5kb3dzIG9wZW4gb3ZlcgotCQkJICogYW4gaW5hY2Nlc3NpYmxlIHJlZ2lvbiBvZiBtZW1vcnkgc3BhY2UgKDAuLi5mZmZmZikKLQkJCSAqIHdoaWNoIGlzIHNvbWV3aGF0IGJvZ3VzLCBidXQgdGhhdCdzIHdoYXQgdGhleSB0aGluawotCQkJICogbWVhbnMgZGlzYWJsZWQuLi4KLQkJCSAqCi0JCQkgKiBXZSBjbGVhciB0aG9zZSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlYWxsb2NhdGVkIGxhdGVyCi0JCQkgKgotCQkJICogV2UgZGV0ZWN0IHN1Y2ggcmVnaW9ucyBieSB0aGUgZmFjdCB0aGF0IHRoZSBiYXNlIGlzCi0JCQkgKiBlcXVhbCB0byB0aGUgcGNpX21lbV9vZmZzZXQgb2YgdGhlIGhvc3QgYnJpZGdlIGFuZAotCQkJICogdGhlaXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gMU0uCi0JCQkgKi8KLQkJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0gJiYKLQkJCSAgICByZXMtPnN0YXJ0ID09IGhvc2UtPnBjaV9tZW1fb2Zmc2V0ICYmCi0JCQkgICAgcmVzLT5lbmQgPCAweDEwMDAwMCkgewotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIlBDSTogQ2xvc2luZyBib2d1cyBBcHBsZSBGaXJtd2FyZSIKLQkJCQkgICAgICAgIiByZWdpb24gJWQgb24gYnVzIDB4JTAyeFxuIiwKLQkJCQkgICAgICAgaSwgYnVzLT5udW1iZXIpOwotCQkJCXJlcy0+ZmxhZ3MgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlwcl9kZWJ1ZygiUENJOiVzIEJ1cyByc3JjICVkICUwMTZsbHgtJTAxNmxseCBbJXhdIGZpeHVwLi4uXG4iLAotCQkJCSBwY2lfbmFtZShkZXYpLCBpLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsXAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZW5kLAotCQkJCSAodW5zaWduZWQgaW50KXJlcy0+ZmxhZ3MpOwotCi0JCQlmaXh1cF9yZXNvdXJjZShyZXMsIGRldik7Ci0JCX0KLQl9CisJaWYgKGRldiAhPSBOVUxMKQorCQlwY2liaW9zX2ZpeHVwX2JyaWRnZShidXMpOwogCiAJLyogQWRkaXRpb25hbCBzZXR1cCB0aGF0IGlzIGRpZmZlcmVudCBiZXR3ZWVuIDMyIGFuZCA2NCBiaXRzIGZvciBub3cgKi8KIAlwY2liaW9zX2RvX2J1c19zZXR1cChidXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggODhkYjRmZi4uMTMxYjFkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC01MywxMiArNTMsMTkgQEAKIAogc3RhdGljIGludCBwY2lfYnVzX2NvdW50OwogCisvKiBUaGlzIHdpbGwgcmVtYWluIE5VTEwgZm9yIG5vdywgdW50aWwgaXNhLWJyaWRnZS5jIGlzIG1hZGUgY29tbW9uCisgKiB0byBib3RoIDMyLWJpdCBhbmQgNjQtYml0LgorICovCitzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZV9wY2lkZXY7CitFWFBPUlRfU1lNQk9MX0dQTChpc2FfYnJpZGdlX3BjaWRldik7CisKIHN0YXRpYyB2b2lkCi1maXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKHN0cnVjdCBwY2lfZGV2KiBkZXYpCitmaXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IGksIGNsYXNzID0gZGV2LT5jbGFzcyA+PiA4OwogCi0JaWYgKChjbGFzcyA9PSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMpICYmCisJaWYgKChjbGFzcyA9PSBQQ0lfQ0xBU1NfUFJPQ0VTU09SX1BPV0VSUEMgfHwKKwkgICAgIGNsYXNzID09IFBDSV9DTEFTU19CUklER0VfT1RIRVIpICYmCiAJCShkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpICYmCiAJCShkZXYtPmJ1cy0+cGFyZW50ID09IE5VTEwpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewpAQCAtNDI0LDYgKzQzMSw3IEBACiAJdW5zaWduZWQgbG9uZyBpb19vZmZzZXQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGk7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKIAogCS8qIEhvb2t1cCBQSEIgcmVzb3VyY2VzICovCiAJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2U7CkBAIC00NTcsNiArNDY1LDEyIEBACiAJCQlidXMtPnJlc291cmNlW2krMV0gPSByZXM7CiAJCX0KIAl9CisKKwlpZiAocHBjX21kLnBjaV9kbWFfYnVzX3NldHVwKQorCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAoYnVzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJcGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKGRldik7CiB9CiAKIC8qIHRoZSBuZXh0IG9uZSBpcyBzdG9sZW4gZnJvbSB0aGUgYWxwaGEgcG9ydC4uLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggMzBlZWRmYy4uODI0N2NmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC01MiwzNSArNTIsNiBAQAogCiBMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAotc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKnBjaV9kbWFfb3BzOwotCi12b2lkIHNldF9wY2lfZG1hX29wcyhzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzKQotewotCXBjaV9kbWFfb3BzID0gZG1hX29wczsKLX0KLQotc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZ2V0X3BjaV9kbWFfb3BzKHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9kbWFfb3BzOwotfQotRVhQT1JUX1NZTUJPTChnZXRfcGNpX2RtYV9vcHMpOwotCi0KLWludCBwY2lfc2V0X2RtYV9tYXNrKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU2NCBtYXNrKQotewotCXJldHVybiBkbWFfc2V0X21hc2soJmRldi0+ZGV2LCBtYXNrKTsKLX0KLQotaW50IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzaykKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IGRtYV9zZXRfbWFzaygmZGV2LT5kZXYsIG1hc2spOwotCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIHZvaWQgZml4dXBfYnJva2VuX3BjbmV0MzIoc3RydWN0IHBjaV9kZXYqIGRldikKIHsKIAlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CkBAIC01NDgsMjYgKzUxOSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX21hcF9pb19zcGFjZSk7CiAKLXZvaWQgX19kZXZpbml0IHBjaWJpb3Nfc2V0dXBfbmV3X2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkID0gJmRldi0+ZGV2LmFyY2hkYXRhOwotCi0Jc2QtPm9mX25vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQotCURCRygiUENJOiBkZXZpY2UgJXMgT0Ygbm9kZTogJXNcbiIsIHBjaV9uYW1lKGRldiksCi0JICAgIHNkLT5vZl9ub2RlID8gc2QtPm9mX25vZGUtPmZ1bGxfbmFtZSA6ICI8bm9uZT4iKTsKLQotCXNkLT5kbWFfb3BzID0gcGNpX2RtYV9vcHM7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlzZC0+bnVtYV9ub2RlID0gcGNpYnVzX3RvX25vZGUoZGV2LT5idXMpOwotI2Vsc2UKLQlzZC0+bnVtYV9ub2RlID0gLTE7Ci0jZW5kaWYKLQlpZiAocHBjX21kLnBjaV9kbWFfZGV2X3NldHVwKQotCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAoZGV2KTsKLX0KLUVYUE9SVF9TWU1CT0wocGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKTsKLQogdm9pZCBfX2RldmluaXQgcGNpYmlvc19kb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggZTFlYTRmZS4uOGVkYzIzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC0xMTksNiArMTE5LDkgQEAKIEVYUE9SVF9TWU1CT0woZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSk7CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKIEVYUE9SVF9TWU1CT0woX3RsYmllKTsKKyNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfRlNMX0JPT0tFKQorRVhQT1JUX1NZTUJPTChfdGxiaWxfdmEpOworI2VuZGlmCiAjZW5kaWYKIEVYUE9SVF9TWU1CT0woX19mbHVzaF9pY2FjaGVfcmFuZ2UpOwogRVhQT1JUX1NZTUJPTChmbHVzaF9kY2FjaGVfcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCA4N2Q4M2M1Li4zYTJkYzdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtODg4LDkgKzg4OCwxMCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9pbml0X2R0X3NjYW5fZHJjb25mX21lbW9yeSh1bnNpZ25lZCBsb25nIG5vZGUpCiB7Ci0JY2VsbF90ICpkbSwgKmxzOworCWNlbGxfdCAqZG0sICpscywgKnVzbTsKIAl1bnNpZ25lZCBsb25nIGwsIG4sIGZsYWdzOwogCXU2NCBiYXNlLCBzaXplLCBsbWJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaXNfa2V4ZWNfa2R1bXAgPSAwLCBybmdzOwogCiAJbHMgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOwogCWlmIChscyA9PSBOVUxMIHx8IGwgPCBkdF9yb290X3NpemVfY2VsbHMgKiBzaXplb2YoY2VsbF90KSkKQEAgLTkwNSw2ICs5MDYsMTIgQEAKIAlpZiAobCA8IChuICogKGR0X3Jvb3RfYWRkcl9jZWxscyArIDQpICsgMSkgKiBzaXplb2YoY2VsbF90KSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBjaGVjayBpZiB0aGlzIGlzIGEga2V4ZWMva2R1bXAga2VybmVsLiAqLworCXVzbSA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSIsCisJCQkJCQkgJmwpOworCWlmICh1c20gIT0gTlVMTCkKKwkJaXNfa2V4ZWNfa2R1bXAgPSAxOworCiAJZm9yICg7IG4gIT0gMDsgLS1uKSB7CiAJCWJhc2UgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3RfYWRkcl9jZWxscywgJmRtKTsKIAkJZmxhZ3MgPSBkbVszXTsKQEAgLTkxNSwxMyArOTIyLDM0IEBACiAJCWlmICgoZmxhZ3MgJiAweDgwKSB8fCAhKGZsYWdzICYgMHg4KSkKIAkJCWNvbnRpbnVlOwogCQlzaXplID0gbG1iX3NpemU7Ci0JCWlmIChpb21tdV9pc19vZmYpIHsKLQkJCWlmIChiYXNlID49IDB4ODAwMDAwMDB1bCkKKwkJcm5ncyA9IDE7CisJCWlmIChpc19rZXhlY19rZHVtcCkgeworCQkJLyoKKwkJCSAqIEZvciBlYWNoIGxtYiBpbiBpYm0sZHluYW1pYy1tZW1vcnksIGEgY29ycmVzcG9uZGluZworCQkJICogZW50cnkgaW4gbGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkgcHJvcGVydHkgY29udGFpbnMKKwkJCSAqIGEgY291bnRlciAncCcgZm9sbG93ZWQgYnkgJ3AnIChiYXNlLCBzaXplKSBkdXBsZS4KKwkJCSAqIE5vdyByZWFkIHRoZSBjb3VudGVyIGZyb20KKwkJCSAqIGxpbnV4LGRyY29uZi11c2FibGUtbWVtb3J5IHByb3BlcnR5CisJCQkgKi8KKwkJCXJuZ3MgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3Rfc2l6ZV9jZWxscywgJnVzbSk7CisJCQlpZiAoIXJuZ3MpIC8qIHRoZXJlIGFyZSBubyAoYmFzZSwgc2l6ZSkgZHVwbGUgKi8KIAkJCQljb250aW51ZTsKLQkJCWlmICgoYmFzZSArIHNpemUpID4gMHg4MDAwMDAwMHVsKQotCQkJCXNpemUgPSAweDgwMDAwMDAwdWwgLSBiYXNlOwogCQl9Ci0JCWxtYl9hZGQoYmFzZSwgc2l6ZSk7CisJCWRvIHsKKwkJCWlmIChpc19rZXhlY19rZHVtcCkgeworCQkJCWJhc2UgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3RfYWRkcl9jZWxscywKKwkJCQkJCQkgJnVzbSk7CisJCQkJc2l6ZSA9IGR0X21lbV9uZXh0X2NlbGwoZHRfcm9vdF9zaXplX2NlbGxzLAorCQkJCQkJCSAmdXNtKTsKKwkJCX0KKwkJCWlmIChpb21tdV9pc19vZmYpIHsKKwkJCQlpZiAoYmFzZSA+PSAweDgwMDAwMDAwdWwpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoYmFzZSArIHNpemUpID4gMHg4MDAwMDAwMHVsKQorCQkJCQlzaXplID0gMHg4MDAwMDAwMHVsIC0gYmFzZTsKKwkJCX0KKwkJCWxtYl9hZGQoYmFzZSwgc2l6ZSk7CisJCX0gd2hpbGUgKC0tcm5ncyk7CiAJfQogCWxtYl9kdW1wX2FsbCgpOwogCXJldHVybiAwOwpAQCAtMTE2NCw2ICsxMTkyLDkgQEAKIAogCS8qIFJlc2VydmUgTE1CIHJlZ2lvbnMgdXNlZCBieSBrZXJuZWwsIGluaXRyZCwgZHQsIGV0Yy4uLiAqLwogCWxtYl9yZXNlcnZlKFBIWVNJQ0FMX1NUQVJULCBfX3BhKGtsaW1pdCkgLSBQSFlTSUNBTF9TVEFSVCk7CisJLyogSWYgcmVsb2NhdGFibGUsIHJlc2VydmUgZmlyc3QgMzJrIGZvciBpbnRlcnJ1cHQgdmVjdG9ycyBldGMuICovCisJaWYgKFBIWVNJQ0FMX1NUQVJUID4gTUVNT1JZX1NUQVJUKQorCQlsbWJfcmVzZXJ2ZShNRU1PUllfU1RBUlQsIDB4ODAwMCk7CiAJcmVzZXJ2ZV9rZHVtcF90cmFtcG9saW5lKCk7CiAJcmVzZXJ2ZV9jcmFzaGtlcm5lbCgpOwogCWVhcmx5X3Jlc2VydmVfbWVtKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwppbmRleCBiNzI4NDlhLi4yZmRiYzE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTczMiw3ICs3MzIsNyBAQAogCQkJdTMyCWlnbm9yZV9tZTsKIAkJfSBycGFkZXNjOwogCX0gcnBhbm90ZTsKLX0gZmFrZV9lbGYgPSB7Cit9IGZha2VfZWxmIF9fc2VjdGlvbiguZmFrZWVsZikgPSB7CiAJLmVsZmhkciA9IHsKIAkJLmVfaWRlbnQgPSB7IDB4N2YsICdFJywgJ0wnLCAnRicsCiAJCQkgICAgIEVMRkNMQVNTMzIsIEVMRkRBVEEyTVNCLCBFVl9DVVJSRU5UIH0sCkBAIC03NzQsMTMgKzc3NCwxMyBAQAogCQkudHlwZSA9IDB4MTI3NTk5OTksCiAJCS5uYW1lID0gIklCTSxSUEEtQ2xpZW50LUNvbmZpZyIsCiAJCS5ycGFkZXNjID0gewotCQkJLmxwYXJfYWZmaW5pdHkgPSAwLAotCQkJLm1pbl9ybW9fc2l6ZSA9IDY0LAkvKiBpbiBtZWdhYnl0ZXMgKi8KKwkJCS5scGFyX2FmZmluaXR5ID0gMSwKKwkJCS5taW5fcm1vX3NpemUgPSAxMjgsCS8qIGluIG1lZ2FieXRlcyAqLwogCQkJLm1pbl9ybW9fcGVyY2VudCA9IDAsCi0JCQkubWF4X3BmdF9zaXplID0gNDgsCS8qIDJeNDggYnl0ZXMgbWF4IFBGVCBzaXplICovCisJCQkubWF4X3BmdF9zaXplID0gNDYsCS8qIDJeNDYgYnl0ZXMgbWF4IFBGVCBzaXplICovCiAJCQkuc3BscGFyID0gMSwKIAkJCS5taW5fbG9hZCA9IH4wVSwKLQkJCS5uZXdfbWVtX2RlZiA9IDAKKwkJCS5uZXdfbWVtX2RlZiA9IDEKIAkJfQogCX0KIH07CkBAIC0xMzIxLDcgKzEzMjEsNyBAQAogICoKICAqIC0tIENvcnQKICAqLwotZXh0ZXJuIHZvaWQgX19zZWNvbmRhcnlfaG9sZCh2b2lkKTsKK2V4dGVybiBjaGFyIF9fc2Vjb25kYXJ5X2hvbGQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zZWNvbmRhcnlfaG9sZF9hY2tub3dsZWRnZTsKIApAQCAtMTM0MiwxMyArMTM0Miw3IEBACiAJCT0gKHZvaWQgKikgTE9XX0FERFIoX19zZWNvbmRhcnlfaG9sZF9zcGlubG9vcCk7CiAJdW5zaWduZWQgbG9uZyAqYWNrbm93bGVkZ2UKIAkJPSAodm9pZCAqKSBMT1dfQUREUihfX3NlY29uZGFyeV9ob2xkX2Fja25vd2xlZGdlKTsKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQkvKiBfX3NlY29uZGFyeV9ob2xkIGlzIGFjdHVhbGx5IGEgZGVzY3JpcHRvciwgbm90IHRoZSB0ZXh0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nIHNlY29uZGFyeV9ob2xkCi0JCT0gX19wYSgqUFRSUkVMT0MoKHVuc2lnbmVkIGxvbmcgKilfX3NlY29uZGFyeV9ob2xkKSk7Ci0jZWxzZQogCXVuc2lnbmVkIGxvbmcgc2Vjb25kYXJ5X2hvbGQgPSBMT1dfQUREUihfX3NlY29uZGFyeV9ob2xkKTsKLSNlbmRpZgogCiAJcHJvbV9kZWJ1ZygicHJvbV9ob2xkX2NwdXM6IHN0YXJ0Li4uXG4iKTsKIAlwcm9tX2RlYnVnKCIgICAgMSkgc3Bpbmxvb3AgICAgICAgPSAweCV4XG4iLCAodW5zaWduZWQgbG9uZylzcGlubG9vcCk7CkBAIC0yMzE1LDEzICsyMzA5LDE0IEBACiAKIHVuc2lnbmVkIGxvbmcgX19pbml0IHByb21faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHAsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcga2Jhc2UpCiB7CQogCXN0cnVjdCBwcm9tX3QgKl9wcm9tOwogCXVuc2lnbmVkIGxvbmcgaGRyOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVsb2Nfb2Zmc2V0KCk7CiAKICNpZmRlZiBDT05GSUdfUFBDMzIKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlbG9jX29mZnNldCgpOwogCXJlbG9jX2dvdDIob2Zmc2V0KTsKICNlbmRpZgogCkBAIC0yMzU1LDkgKzIzNTAsMTEgQEAKIAkgKi8KIAlSRUxPQyhvZl9wbGF0Zm9ybSkgPSBwcm9tX2ZpbmRfbWFjaGluZV90eXBlKCk7CiAKKyNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJLyogQmFpbCBpZiB0aGlzIGlzIGEga2R1bXAga2VybmVsLiAqLwogCWlmIChQSFlTSUNBTF9TVEFSVCA+IDApCiAJCXByb21fcGFuaWMoIkVycm9yOiBZb3UgY2FuJ3QgYm9vdCBhIGtkdW1wIGtlcm5lbCBmcm9tIE9GIVxuIik7CisjZW5kaWYKIAogCS8qCiAJICogQ2hlY2sgZm9yIGFuIGluaXRyZApAQCAtMjM3Nyw3ICsyMzc0LDcgQEAKIAkgKiBDb3B5IHRoZSBDUFUgaG9sZCBjb2RlCiAJICovCiAJaWYgKFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9QT1dFUk1BQykKLQkJY29weV9hbmRfZmx1c2goMCwgS0VSTkVMQkFTRSArIG9mZnNldCwgMHgxMDAsIDApOworCQljb3B5X2FuZF9mbHVzaCgwLCBrYmFzZSwgMHgxMDAsIDApOwogCiAJLyoKIAkgKiBEbyBlYXJseSBwYXJzaW5nIG9mIGNvbW1hbmQgbGluZQpAQCAtMjQ4MCw3ICsyNDc3LDcgQEAKIAlyZWxvY19nb3QyKC1vZmZzZXQpOwogI2VuZGlmCiAKLQlfX3N0YXJ0KGhkciwgS0VSTkVMQkFTRSArIG9mZnNldCwgMCk7CisJX19zdGFydChoZHIsIGtiYXNlLCAwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9yZWxvY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9yZWxvY182NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2EwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3JlbG9jXzY0LlMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvZGUgdG8gcHJvY2VzcyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoZSBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IDIwMDggUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorCitSRUxBID0gNworUkVMQUNPVU5UID0gMHg2ZmZmZmZmOQorUl9QUEM2NF9SRUxBVElWRSA9IDIyCisKKy8qCisgKiByMyA9IGRlc2lyZWQgZmluYWwgYWRkcmVzcyBvZiBrZXJuZWwKKyAqLworX0dMT0JBTChyZWxvY2F0ZSkKKwltZmxyCXIwCisJYmNsCTIwLDMxLCQrNAorMDoJbWZscglyMTIJCS8qIHIxMiBoYXMgcnVudGltZSBhZGRyIG9mIGxhYmVsIDAgKi8KKwltdGxyCXIwCisJbGQJcjExLChwX2R5biAtIDBiKShyMTIpCisJYWRkCXIxMSxyMTEscjEyCS8qIHIxMSBoYXMgcnVudGltZSBhZGRyIG9mIC5keW5hbWljIHNlY3Rpb24gKi8KKwlsZAlyOSwocF9yZWxhIC0gMGIpKHIxMikKKwlhZGQJcjkscjkscjEyCS8qIHI5IGhhcyBydW50aW1lIGFkZHIgb2YgLnJlbGEuZHluIHNlY3Rpb24gKi8KKwlsZAlyMTAsKHBfc3QgLSAwYikocjEyKQorCWFkZAlyMTAscjEwLHIxMgkvKiByMTAgaGFzIHJ1bnRpbWUgYWRkciBvZiBfc3RleHQgKi8KKworCS8qCisJICogU2NhbiB0aGUgZHluYW1pYyBzZWN0aW9uIGZvciB0aGUgUkVMQSBhbmQgUkVMQUNPVU5UIGVudHJpZXMuCisJICovCisJbGkJcjcsMAorCWxpCXI4LDAKKzE6CWxkCXI2LDAocjExKQkvKiBnZXQgdGFnICovCisJY21wZGkJcjYsMAorCWJlcQk0ZgkJLyogZW5kIG9mIGxpc3QgKi8KKwljbXBkaQlyNixSRUxBCisJYm5lCTJmCisJbGQJcjcsOChyMTEpCS8qIGdldCBSRUxBIHBvaW50ZXIgaW4gcjcgKi8KKwliCTNmCisyOglhZGRpcwlyNixyNiwoLVJFTEFDT1VOVClAaGEKKwljbXBkaQlyNixSRUxBQ09VTlRAbAorCWJuZQkzZgorCWxkCXI4LDgocjExKQkvKiBnZXQgUkVMQUNPVU5UIHZhbHVlIGluIHI4ICovCiszOglhZGRpCXIxMSxyMTEsMTYKKwliCTFiCis0OgljbXBkaQlyNywwCQkvKiBjaGVjayB3ZSBoYXZlIGJvdGggUkVMQSBhbmQgUkVMQUNPVU5UICovCisJY21wZGkJY3IxLHI4LDAKKwliZXEJNmYKKwliZXEJY3IxLDZmCisKKwkvKgorCSAqIFdvcmsgb3V0IGxpbmt0aW1lIGFkZHJlc3Mgb2YgX3N0ZXh0IGFuZCBoZW5jZSB0aGUKKwkgKiByZWxvY2F0aW9uIG9mZnNldCB0byBiZSBhcHBsaWVkLgorCSAqIGN1cl9vZmZzZXQgW3I3XSA9IHJlbGEucnVuIFtyOV0gLSByZWxhLmxpbmsgW3I3XQorCSAqIF9zdGV4dC5saW5rIFtyMTBdID0gX3N0ZXh0LnJ1biBbcjEwXSAtIGN1cl9vZmZzZXQgW3I3XQorCSAqIGZpbmFsX29mZnNldCBbcjNdID0gX3N0ZXh0LmZpbmFsIFtyM10gLSBfc3RleHQubGluayBbcjEwXQorCSAqLworCXN1YmYJcjcscjcscjkJLyogY3VyX29mZnNldCAqLworCXN1YmYJcjEwLHI3LHIxMAorCXN1YmYJcjMscjEwLHIzCS8qIGZpbmFsX29mZnNldCAqLworCisJLyoKKwkgKiBSdW4gdGhyb3VnaCB0aGUgbGlzdCBvZiByZWxvY2F0aW9ucyBhbmQgcHJvY2VzcyB0aGUKKwkgKiBSX1BQQzY0X1JFTEFUSVZFIG9uZXMuCisJICovCisJbXRjdHIJcjgKKzU6CWx3eglyMCwxMig5KQkvKiBFTEY2NF9SX1RZUEUocmVsb2MtPnJfaW5mbykgKi8KKwljbXB3aQlyMCxSX1BQQzY0X1JFTEFUSVZFCisJYm5lCTZmCisJbGQJcjYsMChyOSkJLyogcmVsb2MtPnJfb2Zmc2V0ICovCisJbGQJcjAsMTYocjkpCS8qIHJlbG9jLT5yX2FkZGVuZCAqLworCWFkZAlyMCxyMCxyMworCXN0ZHgJcjAscjcscjYKKwlhZGRpCXI5LHI5LDI0CisJYmRuegk1YgorCis2OglibHIKKworcF9keW46CS5sbG9uZwlfX2R5bmFtaWNfc3RhcnQgLSAwYgorcF9yZWxhOgkubGxvbmcJX19yZWxhX2R5bl9zdGFydCAtIDBiCitwX3N0OgkubGxvbmcJX3N0ZXh0IC0gMGIKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggOWNjNWE1Mi4uNWVjNTZmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC0yNTQsOCArMjU0LDIxIEBACiAJLyogSWYgd2UgYXJlIGEgRnJlZXNjYWxlIGNvcmUgZG8gYSBzaW1wbGUgY2hlY2sgc28KIAkgKiB3ZSBkb250IGhhdmUgdG8ga2VlcCBhZGRpbmcgY2FzZXMgaW4gdGhlIGZ1dHVyZSAqLwogCWlmIChQVlJfVkVSKHB2cikgJiAweDgwMDApIHsKLQkJbWFqID0gUFZSX01BSihwdnIpOwotCQltaW4gPSBQVlJfTUlOKHB2cik7CisJCXN3aXRjaCAoUFZSX1ZFUihwdnIpKSB7CisJCWNhc2UgMHg4MDAwOgkvKiA3NDQxLzc0NTAvNzQ1MSwgVm95YWdlciAqLworCQljYXNlIDB4ODAwMToJLyogNzQ0NS83NDU1LCBBcG9sbG8gNiAqLworCQljYXNlIDB4ODAwMjoJLyogNzQ0Ny83NDU3LCBBcG9sbG8gNyAqLworCQljYXNlIDB4ODAwMzoJLyogNzQ0N0EsIEFwb2xsbyA3IFBNICovCisJCWNhc2UgMHg4MDA0OgkvKiA3NDQ4LCBBcG9sbG8gOCAqLworCQljYXNlIDB4ODAwYzoJLyogNzQxMCwgTml0cm8gKi8KKwkJCW1haiA9ICgocHZyID4+IDgpICYgMHhGKTsKKwkJCW1pbiA9IFBWUl9NSU4ocHZyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBlNTAwL2Jvb2stZSAqLworCQkJbWFqID0gUFZSX01BSihwdnIpOworCQkJbWluID0gUFZSX01JTihwdnIpOworCQkJYnJlYWs7CisJCX0KIAl9IGVsc2UgewogCQlzd2l0Y2ggKFBWUl9WRVIocHZyKSkgewogCQkJY2FzZSAweDAwMjA6CS8qIDQwMyBmYW1pbHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwppbmRleCAwNjZlNjVjLi5jMWEyNzYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCkBAIC0xMTEsNyArMTExLDcgQEAKICAqIFRoaXMgaXMgY2FsbGVkIHZlcnkgZWFybHkgb24gdGhlIGJvb3QgcHJvY2VzcywgYWZ0ZXIgYSBtaW5pbWFsCiAgKiBNTVUgZW52aXJvbm1lbnQgaGFzIGJlZW4gc2V0IHVwIGJ1dCBiZWZvcmUgTU1VX2luaXQgaXMgY2FsbGVkLgogICovCi1ub3RyYWNlIHZvaWQgX19pbml0IG1hY2hpbmVfaW5pdCh1bnNpZ25lZCBsb25nIGR0X3B0ciwgdW5zaWduZWQgbG9uZyBwaHlzKQorbm90cmFjZSB2b2lkIF9faW5pdCBtYWNoaW5lX2luaXQodW5zaWduZWQgbG9uZyBkdF9wdHIpCiB7CiAJLyogRW5hYmxlIGVhcmx5IGRlYnVnZ2luZyBpZiBhbnkgc3BlY2lmaWVkIChzZWUgdWRiZy5oKSAqLwogCXVkYmdfZWFybHlfaW5pdCgpOwpAQCAtMjA5LDIzICsyMDksMTIgQEAKIAogI2VuZGlmIC8qIENPTkZJR19OVlJBTSAqLwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOwotCiBpbnQgX19pbml0IHBwY19pbml0KHZvaWQpCiB7Ci0JaW50IGNwdTsKLQogCS8qIGNsZWFyIHRoZSBwcm9ncmVzcyBsaW5lICovCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCIgICAgICAgICAgICAgIiwgMHhmZmZmKTsKIAotCS8qIHJlZ2lzdGVyIENQVSBkZXZpY2VzICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7Ci0JCWMtPmhvdHBsdWdnYWJsZSA9IDE7Ci0JCXJlZ2lzdGVyX2NwdShjLCBjcHUpOwotCX0KLQogCS8qIGNhbGwgcGxhdGZvcm0gaW5pdCAqLwogCWlmIChwcGNfbWQuaW5pdCAhPSBOVUxMKSB7CiAJCXBwY19tZC5pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggOGIyNWY1MS4uODQzYzBhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMjU1LDkgKzI1NSwxMSBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgfHwgZGVmaW5lZChDT05GSUdfS0VYRUMpCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wOworZXh0ZXJuIHZvaWQgZ2VuZXJpY19zZWNvbmRhcnlfc21wX2luaXQodm9pZCk7CisKIHZvaWQgc21wX3JlbGVhc2VfY3B1cyh2b2lkKQogewotCWV4dGVybiB1bnNpZ25lZCBsb25nIF9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3A7CiAJdW5zaWduZWQgbG9uZyAqcHRyOwogCiAJREJHKCIgLT4gc21wX3JlbGVhc2VfY3B1cygpXG4iKTsKQEAgLTI2NiwxMiArMjY4LDExIEBACiAJICogYWxsIG5vdyBzbyB0aGV5IGNhbiBzdGFydCB0byBzcGluIG9uIHRoZWlyIGluZGl2aWR1YWwgcGFjYQogCSAqIHNwaW5sb29wcy4gRm9yIG5vbiBTTVAga2VybmVscywgdGhlIHNlY29uZGFyeSBjcHVzIG5ldmVyIGdldCBvdXQKIAkgKiBvZiB0aGUgY29tbW9uIHNwaW5sb29wLgotCSAqIFRoaXMgaXMgdXNlbGVzcyBidXQgaGFybWxlc3Mgb24gaVNlcmllcywgc2Vjb25kYXJpZXMgYXJlIGFscmVhZHkKLQkgKiB3YWl0aW5nIG9uIHRoZWlyIHBhY2Egc3Bpbmxvb3BzLiAqLworCSAqLwogCiAJcHRyICA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKSZfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wCiAJCQktIFBIWVNJQ0FMX1NUQVJUKTsKLQkqcHRyID0gMTsKKwkqcHRyID0gX19wYShnZW5lcmljX3NlY29uZGFyeV9zbXBfaW5pdCk7CiAJbWIoKTsKIAogCURCRygiIDwtIHNtcF9yZWxlYXNlX2NwdXMoKVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCA1MzM3Y2E3Li5mZjlmNzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTEwMSw4ICsxMDEsNyBAQAogCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOwogCQlicmVhazsKIAljYXNlIFBQQ19NU0dfUkVTQ0hFRFVMRToKLQkJLyogWFhYIERvIHdlIGhhdmUgdG8gZG8gdGhpcz8gKi8KLQkJc2V0X25lZWRfcmVzY2hlZCgpOworCQkvKiB3ZSBub3RpY2UgbmVlZF9yZXNjaGVkIG9uIGV4aXQgKi8KIAkJYnJlYWs7CiAJY2FzZSBQUENfTVNHX0NBTExfRlVOQ19TSU5HTEU6CiAJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCgpOwpAQCAtNDUzLDYgKzQ1Miw3IEBACiAJc2Vjb25kYXJ5X2NwdV90aW1lX2luaXQoKTsKIAogCWlwaV9jYWxsX2xvY2soKTsKKwlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKIAkvKiBVcGRhdGUgc2libGluZyBtYXBzICovCiAJYmFzZSA9IGNwdV9maXJzdF90aHJlYWRfaW5fY29yZShjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zb2Z0ZW11OHh4LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NvZnRlbXU4eHguYwppbmRleCBjOTA2YzRiLi4yM2M4YzVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NvZnRlbXU4eHguYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NvZnRlbXU4eHguYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcF9hc202NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3BfYXNtNjQuUwppbmRleCBlMDkyYzNjLi44NmFjMWQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcF9hc202NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwX2FzbTY0LlMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAJY21wZGkJcjEyLDAKIAliZXEtCW5vdGhpbmdfdG9fY29weQotCWxpCXIxNSw1MTIKKwlsaQlyMTUsUEFHRV9TSVpFPj4zCiBjb3B5bG9vcDoKIAlsZAlyMTMscGJlX2FkZHJlc3MocjEyKQogCWxkCXIxNCxwYmVfb3JpZ19hZGRyZXNzKHIxMikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCmluZGV4IGQ5ODYzNGMuLmJiMWNmY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYwpAQCAtNjEsNDIgKzYxLDYgQEAKIAlyZXR1cm4gY29tcGF0X3N5c19zZWxlY3QoKGludCluLCBpbnAsIG91dHAsIGV4cCwgY29tcGF0X3B0cih0dnBfeCkpOwogfQogCi1pbnQgY3BfY29tcGF0X3N0YXQoc3RydWN0IGtzdGF0ICpzdGF0LCBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQotewotCWNvbXBhdF9pbm9fdCBpbm87Ci0JbG9uZyBlcnI7Ci0KLQlpZiAoc3RhdC0+c2l6ZSA+IE1BWF9OT05fTEZTIHx8ICFuZXdfdmFsaWRfZGV2KHN0YXQtPmRldikgfHwKLQkgICAgIW5ld192YWxpZF9kZXYoc3RhdC0+cmRldikpCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCi0JaW5vID0gc3RhdC0+aW5vOwotCWlmIChzaXplb2YoaW5vKSA8IHNpemVvZihzdGF0LT5pbm8pICYmIGlubyAhPSBzdGF0LT5pbm8pCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCi0JZXJyICA9IGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHN0YXRidWYsIHNpemVvZigqc3RhdGJ1ZikpID8gMCA6IC1FRkFVTFQ7Ci0JZXJyIHw9IF9fcHV0X3VzZXIobmV3X2VuY29kZV9kZXYoc3RhdC0+ZGV2KSwgJnN0YXRidWYtPnN0X2Rldik7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoaW5vLCAmc3RhdGJ1Zi0+c3RfaW5vKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5tb2RlLCAmc3RhdGJ1Zi0+c3RfbW9kZSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+bmxpbmssICZzdGF0YnVmLT5zdF9ubGluayk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+dWlkLCAmc3RhdGJ1Zi0+c3RfdWlkKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5naWQsICZzdGF0YnVmLT5zdF9naWQpOwotCWVyciB8PSBfX3B1dF91c2VyKG5ld19lbmNvZGVfZGV2KHN0YXQtPnJkZXYpLCAmc3RhdGJ1Zi0+c3RfcmRldik7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+c2l6ZSwgJnN0YXRidWYtPnN0X3NpemUpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmF0aW1lLnR2X3NlYywgJnN0YXRidWYtPnN0X2F0aW1lKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5hdGltZS50dl9uc2VjLCAmc3RhdGJ1Zi0+c3RfYXRpbWVfbnNlYyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+bXRpbWUudHZfc2VjLCAmc3RhdGJ1Zi0+c3RfbXRpbWUpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPm10aW1lLnR2X25zZWMsICZzdGF0YnVmLT5zdF9tdGltZV9uc2VjKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5jdGltZS50dl9zZWMsICZzdGF0YnVmLT5zdF9jdGltZSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+Y3RpbWUudHZfbnNlYywgJnN0YXRidWYtPnN0X2N0aW1lX25zZWMpOwotCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmJsa3NpemUsICZzdGF0YnVmLT5zdF9ibGtzaXplKTsKLQllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5ibG9ja3MsICZzdGF0YnVmLT5zdF9ibG9ja3MpOwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDRbMF0pOwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDRbMV0pOwotCi0JcmV0dXJuIGVycjsKLX0KLQogLyogTm90ZTogaXQgaXMgbmVjZXNzYXJ5IHRvIHRyZWF0IG9wdGlvbiBhcyBhbiB1bnNpZ25lZCBpbnQsCiAgKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNhc3QgdG8gYSBzaWduZWQgaW50IHRvIGluc3VyZSB0aGF0IHRoZSAKICAqIHByb3BlciBjb252ZXJzaW9uIChzaWduIGV4dGVuc2lvbikgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduZWQgaW50IChtc3IgaW4gMzItYml0IG1vZGUpCkBAIC0xMDcsNzcgKzcxLDYgQEAKIAlyZXR1cm4gc3lzX3N5c2ZzKChpbnQpb3B0aW9uLCBhcmcxLCBhcmcyKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcGF1c2Uodm9pZCkKLXsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZSgpOwotCQotCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfdHMzMihzdHJ1Y3QgdGltZXNwZWMgKm8sIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCi17Ci0JbG9uZyB1c2VjOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGksIHNpemVvZigqaSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoX19nZXRfdXNlcihvLT50dl9zZWMsICZpLT50dl9zZWMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoX19nZXRfdXNlcih1c2VjLCAmaS0+dHZfdXNlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCW8tPnR2X25zZWMgPSB1c2VjICogMTAwMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIHB1dF90djMyKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKm8sIHN0cnVjdCB0aW1ldmFsICppKQotewotCXJldHVybiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG8sIHNpemVvZigqbykpIHx8Ci0JCShfX3B1dF91c2VyKGktPnR2X3NlYywgJm8tPnR2X3NlYykgfAotCQkgX19wdXRfdXNlcihpLT50dl91c2VjLCAmby0+dHZfdXNlYykpKTsKLX0KLQotCi0KLQotLyogVHJhbnNsYXRpb25zIGR1ZSB0byB0aW1lX3Qgc2l6ZSBkaWZmZXJlbmNlcy4gIFdoaWNoIGFmZmVjdHMgYWxsCi0gICBzb3J0cyBvZiB0aGluZ3MsIGxpa2UgdGltZXZhbCBhbmQgaXRpbWVydmFsLiAgKi8KLWV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotCi1hc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQotewotCWlmICh0dikgewotCQlzdHJ1Y3QgdGltZXZhbCBrdHY7Ci0JCWRvX2dldHRpbWVvZmRheSgma3R2KTsKLQkJaWYgKHB1dF90djMyKHR2LCAma3R2KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAodHopIHsKLQkJaWYgKGNvcHlfdG9fdXNlcih0eiwgJnN5c190eiwgc2l6ZW9mKHN5c190eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCQotCXJldHVybiAwOwotfQotCi0KLQotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlzdHJ1Y3QgdGltZXNwZWMga3RzOwotCXN0cnVjdCB0aW1lem9uZSBrdHo7Ci0JCi0gCWlmICh0dikgewotCQlpZiAoZ2V0X3RzMzIoJmt0cywgdHYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWlmICh0eikgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt0eiwgdHosIHNpemVvZihrdHopKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiBkb19zeXNfc2V0dGltZW9mZGF5KHR2ID8gJmt0cyA6IE5VTEwsIHR6ID8gJmt0eiA6IE5VTEwpOwotfQotCiAjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIGxvbmcgY29tcGF0X3N5c19pcGModTMyIGNhbGwsIHUzMiBmaXJzdCwgdTMyIHNlY29uZCwgdTMyIHRoaXJkLCBjb21wYXRfdXB0cl90IHB0ciwKIAkgICAgICAgdTMyIGZpZnRoKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCmluZGV4IDU2ZDE3MmQuLjg2YTJmZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKQEAgLTE1LDE4ICsxNSwyNCBAQAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9wYWNhLmg+Ci0jaW5jbHVkZSA8YXNtL2xwcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCisjaWZkZWYgQ09ORklHX1BQQzY0CisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vbHBwYWNhLmg+CisjZW5kaWYKKwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrb2JqZWN0ICosIGNhY2hlX3RvcGxldmVsKTsKIAotLyogU01UIHN0dWZmICovCisvKgorICogU01UIHNub296ZSBkZWxheSBzdHVmZiwgNjQtYml0IG9ubHkgZm9yIG5vdworICovCiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKyNpZmRlZiBDT05GSUdfUFBDNjQKKwogLyogVGltZSBpbiBtaWNyb3NlY29uZHMgd2UgZGVsYXkgYmVmb3JlIHNsZWVwaW5nIGluIHRoZSBpZGxlIGxvb3AgKi8KIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHNtdF9zbm9vemVfZGVsYXkpID0geyAxMDAgfTsKIApAQCAtMTA2LDcgKzExMiw3IEBACiB9CiBfX3NldHVwKCJzbXQtc25vb3plLWRlbGF5PSIsIHNldHVwX3NtdF9zbm9vemVfZGVsYXkpOwogCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIC8qCiAgKiBFbmFibGluZyBQTUNzIHdpbGwgc2xvdyBwYXJ0aXRpb24gY29udGV4dCBzd2l0Y2ggdGltZXMgc28gd2Ugb25seSBkbwpAQCAtMTE1LDcgKzEyMSw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyLCBwbWNzX2VuYWJsZWQpOwogCi12b2lkIHBwYzY0X2VuYWJsZV9wbWNzKHZvaWQpCit2b2lkIHBwY19lbmFibGVfcG1jcyh2b2lkKQogewogCS8qIE9ubHkgbmVlZCB0byBlbmFibGUgdGhlbSBvbmNlICovCiAJaWYgKF9fZ2V0X2NwdV92YXIocG1jc19lbmFibGVkKSkKQEAgLTEyNiw4ICsxMzIsOSBAQAogCWlmIChwcGNfbWQuZW5hYmxlX3BtY3MpCiAJCXBwY19tZC5lbmFibGVfcG1jcygpOwogfQotRVhQT1JUX1NZTUJPTChwcGM2NF9lbmFibGVfcG1jcyk7CitFWFBPUlRfU1lNQk9MKHBwY19lbmFibGVfcG1jcyk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR182eHgpIHx8IGRlZmluZWQoQ09ORklHX1BQQzY0KQogLyogWFhYIGNvbnZlcnQgdG8gcnVzdHkncyBvbl9vbmVfY3B1ICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBydW5fb25fY3B1KHVuc2lnbmVkIGxvbmcgY3B1LAogCQkJICAgICAgICB1bnNpZ25lZCBsb25nICgqZnVuYykodW5zaWduZWQgbG9uZyksCkBAIC0xNDYsNiArMTUzLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CisjZW5kaWYKIAogI2RlZmluZSBTWVNGU19QTUNTRVRVUChOQU1FLCBBRERSRVNTKSBcCiBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkXyMjTkFNRSh1bnNpZ25lZCBsb25nIGp1bmspIFwKQEAgLTE1NCw3ICsxNjIsNyBAQAogfSBcCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV8jI05BTUUodW5zaWduZWQgbG9uZyB2YWwpIFwKIHsgXAotCXBwYzY0X2VuYWJsZV9wbWNzKCk7IFwKKwlwcGNfZW5hYmxlX3BtY3MoKTsgXAogCW10c3ByKEFERFJFU1MsIHZhbCk7IFwKIAlyZXR1cm4gMDsgXAogfSBcCkBAIC0xODQsMjggKzE5Miw1MyBAQAogICogdGhhdCBhcmUgaW1wbGVtZW50ZWQgb24gdGhlIGN1cnJlbnQgcHJvY2Vzc29yCiAgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KQorI2RlZmluZSBIQVNfUFBDX1BNQ19DTEFTU0lDCTEKKyNkZWZpbmUgSEFTX1BQQ19QTUNfSUJNCQkxCisjZGVmaW5lIEhBU19QUENfUE1DX1BBNlQJMQorI2VsaWYgZGVmaW5lZChDT05GSUdfNnh4KQorI2RlZmluZSBIQVNfUFBDX1BNQ19DTEFTU0lDCTEKKyNkZWZpbmUgSEFTX1BQQ19QTUNfSUJNCQkxCisjZGVmaW5lIEhBU19QUENfUE1DX0c0CQkxCisjZW5kaWYKKworCisjaWZkZWYgSEFTX1BQQ19QTUNfQ0xBU1NJQwogU1lTRlNfUE1DU0VUVVAobW1jcjAsIFNQUk5fTU1DUjApOwogU1lTRlNfUE1DU0VUVVAobW1jcjEsIFNQUk5fTU1DUjEpOwotU1lTRlNfUE1DU0VUVVAobW1jcmEsIFNQUk5fTU1DUkEpOwogU1lTRlNfUE1DU0VUVVAocG1jMSwgU1BSTl9QTUMxKTsKIFNZU0ZTX1BNQ1NFVFVQKHBtYzIsIFNQUk5fUE1DMik7CiBTWVNGU19QTUNTRVRVUChwbWMzLCBTUFJOX1BNQzMpOwogU1lTRlNfUE1DU0VUVVAocG1jNCwgU1BSTl9QTUM0KTsKIFNZU0ZTX1BNQ1NFVFVQKHBtYzUsIFNQUk5fUE1DNSk7CiBTWVNGU19QTUNTRVRVUChwbWM2LCBTUFJOX1BNQzYpOworCisjaWZkZWYgSEFTX1BQQ19QTUNfRzQKK1NZU0ZTX1BNQ1NFVFVQKG1tY3IyLCBTUFJOX01NQ1IyKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BQQzY0CiBTWVNGU19QTUNTRVRVUChwbWM3LCBTUFJOX1BNQzcpOwogU1lTRlNfUE1DU0VUVVAocG1jOCwgU1BSTl9QTUM4KTsKKworU1lTRlNfUE1DU0VUVVAobW1jcmEsIFNQUk5fTU1DUkEpOwogU1lTRlNfUE1DU0VUVVAocHVyciwgU1BSTl9QVVJSKTsKIFNZU0ZTX1BNQ1NFVFVQKHNwdXJyLCBTUFJOX1NQVVJSKTsKIFNZU0ZTX1BNQ1NFVFVQKGRzY3IsIFNQUk5fRFNDUik7CiAKK3N0YXRpYyBTWVNERVZfQVRUUihtbWNyYSwgMDYwMCwgc2hvd19tbWNyYSwgc3RvcmVfbW1jcmEpOworc3RhdGljIFNZU0RFVl9BVFRSKHNwdXJyLCAwNjAwLCBzaG93X3NwdXJyLCBOVUxMKTsKK3N0YXRpYyBTWVNERVZfQVRUUihkc2NyLCAwNjAwLCBzaG93X2RzY3IsIHN0b3JlX2RzY3IpOworc3RhdGljIFNZU0RFVl9BVFRSKHB1cnIsIDA2MDAsIHNob3dfcHVyciwgc3RvcmVfcHVycik7CisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKyNpZmRlZiBIQVNfUFBDX1BNQ19QQTZUCiBTWVNGU19QTUNTRVRVUChwYTZ0X3BtYzAsIFNQUk5fUEE2VF9QTUMwKTsKIFNZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jMSwgU1BSTl9QQTZUX1BNQzEpOwogU1lTRlNfUE1DU0VUVVAocGE2dF9wbWMyLCBTUFJOX1BBNlRfUE1DMik7CiBTWVNGU19QTUNTRVRVUChwYTZ0X3BtYzMsIFNQUk5fUEE2VF9QTUMzKTsKIFNZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jNCwgU1BSTl9QQTZUX1BNQzQpOwogU1lTRlNfUE1DU0VUVVAocGE2dF9wbWM1LCBTUFJOX1BBNlRfUE1DNSk7Ci0KICNpZmRlZiBDT05GSUdfREVCVUdfS0VSTkVMCiBTWVNGU19QTUNTRVRVUChoaWQwLCBTUFJOX0hJRDApOwogU1lTRlNfUE1DU0VUVVAoaGlkMSwgU1BSTl9ISUQxKTsKQEAgLTIzNiwyOCArMjY5LDM3IEBACiBTWVNGU19QTUNTRVRVUCh0c3IyLCBTUFJOX1BBNlRfVFNSMik7CiBTWVNGU19QTUNTRVRVUCh0c3IzLCBTUFJOX1BBNlRfVFNSMyk7CiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX0tFUk5FTCAqLworI2VuZGlmIC8qIEhBU19QUENfUE1DX1BBNlQgKi8KIAotc3RhdGljIFNZU0RFVl9BVFRSKG1tY3JhLCAwNjAwLCBzaG93X21tY3JhLCBzdG9yZV9tbWNyYSk7Ci1zdGF0aWMgU1lTREVWX0FUVFIoc3B1cnIsIDA2MDAsIHNob3dfc3B1cnIsIE5VTEwpOwotc3RhdGljIFNZU0RFVl9BVFRSKGRzY3IsIDA2MDAsIHNob3dfZHNjciwgc3RvcmVfZHNjcik7Ci1zdGF0aWMgU1lTREVWX0FUVFIocHVyciwgMDYwMCwgc2hvd19wdXJyLCBzdG9yZV9wdXJyKTsKLQorI2lmZGVmIEhBU19QUENfUE1DX0lCTQogc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGlibV9jb21tb25fYXR0cnNbXSA9IHsKIAlfU1lTREVWX0FUVFIobW1jcjAsIDA2MDAsIHNob3dfbW1jcjAsIHN0b3JlX21tY3IwKSwKIAlfU1lTREVWX0FUVFIobW1jcjEsIDA2MDAsIHNob3dfbW1jcjEsIHN0b3JlX21tY3IxKSwKIH07CisjZW5kaWYgLyogSEFTX1BQQ19QTUNfRzQgKi8KIAotc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGlibV9wbWNfYXR0cnNbXSA9IHsKKyNpZmRlZiBIQVNfUFBDX1BNQ19HNAorc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGc0X2NvbW1vbl9hdHRyc1tdID0geworCV9TWVNERVZfQVRUUihtbWNyMCwgMDYwMCwgc2hvd19tbWNyMCwgc3RvcmVfbW1jcjApLAorCV9TWVNERVZfQVRUUihtbWNyMSwgMDYwMCwgc2hvd19tbWNyMSwgc3RvcmVfbW1jcjEpLAorCV9TWVNERVZfQVRUUihtbWNyMiwgMDYwMCwgc2hvd19tbWNyMiwgc3RvcmVfbW1jcjIpLAorfTsKKyNlbmRpZiAvKiBIQVNfUFBDX1BNQ19HNCAqLworCitzdGF0aWMgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgY2xhc3NpY19wbWNfYXR0cnNbXSA9IHsKIAlfU1lTREVWX0FUVFIocG1jMSwgMDYwMCwgc2hvd19wbWMxLCBzdG9yZV9wbWMxKSwKIAlfU1lTREVWX0FUVFIocG1jMiwgMDYwMCwgc2hvd19wbWMyLCBzdG9yZV9wbWMyKSwKIAlfU1lTREVWX0FUVFIocG1jMywgMDYwMCwgc2hvd19wbWMzLCBzdG9yZV9wbWMzKSwKIAlfU1lTREVWX0FUVFIocG1jNCwgMDYwMCwgc2hvd19wbWM0LCBzdG9yZV9wbWM0KSwKIAlfU1lTREVWX0FUVFIocG1jNSwgMDYwMCwgc2hvd19wbWM1LCBzdG9yZV9wbWM1KSwKIAlfU1lTREVWX0FUVFIocG1jNiwgMDYwMCwgc2hvd19wbWM2LCBzdG9yZV9wbWM2KSwKKyNpZmRlZiBDT05GSUdfUFBDNjQKIAlfU1lTREVWX0FUVFIocG1jNywgMDYwMCwgc2hvd19wbWM3LCBzdG9yZV9wbWM3KSwKIAlfU1lTREVWX0FUVFIocG1jOCwgMDYwMCwgc2hvd19wbWM4LCBzdG9yZV9wbWM4KSwKKyNlbmRpZgogfTsKIAorI2lmZGVmIEhBU19QUENfUE1DX1BBNlQKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBwYTZ0X2F0dHJzW10gPSB7CiAJX1NZU0RFVl9BVFRSKG1tY3IwLCAwNjAwLCBzaG93X21tY3IwLCBzdG9yZV9tbWNyMCksCiAJX1NZU0RFVl9BVFRSKG1tY3IxLCAwNjAwLCBzaG93X21tY3IxLCBzdG9yZV9tbWNyMSksCkBAIC0yOTgsNiArMzQwLDggQEAKIAlfU1lTREVWX0FUVFIodHNyMywgMDYwMCwgc2hvd190c3IzLCBzdG9yZV90c3IzKSwKICNlbmRpZiAvKiBDT05GSUdfREVCVUdfS0VSTkVMICovCiB9OworI2VuZGlmIC8qIEhBU19QUENfUE1DX1BBNlQgKi8KKyNlbmRpZiAvKiBIQVNfUFBDX1BNQ19DTEFTU0lDICovCiAKIHN0cnVjdCBjYWNoZV9kZXNjIHsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwpAQCAtNTg4LDIzICs2MzIsMzYgQEAKIAlzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cnMsICpwbWNfYXR0cnM7CiAJaW50IGksIG5hdHRyczsKIAorI2lmZGVmIENPTkZJR19QUEM2NAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSAmJgogCQkJY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKIAkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3NtdF9zbm9vemVfZGVsYXkpOworI2VuZGlmCiAKIAkvKiBQTUMgc3R1ZmYgKi8KIAlzd2l0Y2ggKGN1cl9jcHVfc3BlYy0+cG1jX3R5cGUpIHsKKyNpZmRlZiBIQVNfUFBDX1BNQ19JQk0KIAljYXNlIFBQQ19QTUNfSUJNOgogCQlhdHRycyA9IGlibV9jb21tb25fYXR0cnM7CiAJCW5hdHRycyA9IHNpemVvZihpYm1fY29tbW9uX2F0dHJzKSAvIHNpemVvZihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSk7Ci0JCXBtY19hdHRycyA9IGlibV9wbWNfYXR0cnM7CisJCXBtY19hdHRycyA9IGNsYXNzaWNfcG1jX2F0dHJzOwogCQlicmVhazsKKyNlbmRpZiAvKiBIQVNfUFBDX1BNQ19JQk0gKi8KKyNpZmRlZiBIQVNfUFBDX1BNQ19HNAorCWNhc2UgUFBDX1BNQ19HNDoKKwkJYXR0cnMgPSBnNF9jb21tb25fYXR0cnM7CisJCW5hdHRycyA9IHNpemVvZihnNF9jb21tb25fYXR0cnMpIC8gc2l6ZW9mKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlKTsKKwkJcG1jX2F0dHJzID0gY2xhc3NpY19wbWNfYXR0cnM7CisJCWJyZWFrOworI2VuZGlmIC8qIEhBU19QUENfUE1DX0c0ICovCisjaWZkZWYgSEFTX1BQQ19QTUNfUEE2VAogCWNhc2UgUFBDX1BNQ19QQTZUOgogCQkvKiBQQSBTZW1pIHN0YXJ0cyBjb3VudGluZyBhdCBQTUMwICovCiAJCWF0dHJzID0gcGE2dF9hdHRyczsKIAkJbmF0dHJzID0gc2l6ZW9mKHBhNnRfYXR0cnMpIC8gc2l6ZW9mKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlKTsKIAkJcG1jX2F0dHJzID0gTlVMTDsKIAkJYnJlYWs7CisjZW5kaWYgLyogSEFTX1BQQ19QTUNfUEE2VCAqLwogCWRlZmF1bHQ6CiAJCWF0dHJzID0gTlVMTDsKIAkJbmF0dHJzID0gMDsKQEAgLTYxOCw2ICs2NzUsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgaSsrKQogCQkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZwbWNfYXR0cnNbaV0pOwogCisjaWZkZWYgQ09ORklHX1BQQzY0CiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX01NQ1JBKSkKIAkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX21tY3JhKTsKIApAQCAtNjI5LDYgKzY4Nyw3IEBACiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfRFNDUikpCiAJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9kc2NyKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCWNyZWF0ZV9jYWNoZV9pbmZvKHMpOwogfQpAQCAtNjQxLDE2ICs3MDAsOSBAQAogCWludCBjcHUgPSBzeXNkZXYtPmlkOwogCiAJY2FjaGVfZGVzYyA9IHBlcl9jcHUoY2FjaGVfZGVzYywgY3B1KTsKLQlpZiAoY2FjaGVfZGVzYyAhPSBOVUxMKSB7Ci0JCXN5c2ZzX3JlbW92ZV9maWxlKCZjYWNoZV9kZXNjLT5rb2JqLCAmY2FjaGVfc2l6ZV9hdHRyLmF0dHIpOwotCQlzeXNmc19yZW1vdmVfZmlsZSgmY2FjaGVfZGVzYy0+a29iaiwgJmNhY2hlX2xpbmVfc2l6ZV9hdHRyLmF0dHIpOwotCQlzeXNmc19yZW1vdmVfZmlsZSgmY2FjaGVfZGVzYy0+a29iaiwgJmNhY2hlX3R5cGVfYXR0ci5hdHRyKTsKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNhY2hlX2Rlc2MtPmtvYmosICZjYWNoZV9sZXZlbF9hdHRyLmF0dHIpOwotCQlzeXNmc19yZW1vdmVfZmlsZSgmY2FjaGVfZGVzYy0+a29iaiwgJmNhY2hlX25yX3NldHNfYXR0ci5hdHRyKTsKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNhY2hlX2Rlc2MtPmtvYmosICZjYWNoZV9hc3NvY19hdHRyLmF0dHIpOwotCisJaWYgKGNhY2hlX2Rlc2MgIT0gTlVMTCkKIAkJa29iamVjdF9wdXQoJmNhY2hlX2Rlc2MtPmtvYmopOwotCX0KKwogCWNhY2hlX3RvcGxldmVsID0gcGVyX2NwdShjYWNoZV90b3BsZXZlbCwgY3B1KTsKIAlpZiAoY2FjaGVfdG9wbGV2ZWwgIT0gTlVMTCkKIAkJa29iamVjdF9wdXQoY2FjaGVfdG9wbGV2ZWwpOwpAQCAtNjcxLDE3ICs3MjMsMjggQEAKIAogCS8qIFBNQyBzdHVmZiAqLwogCXN3aXRjaCAoY3VyX2NwdV9zcGVjLT5wbWNfdHlwZSkgeworI2lmZGVmIEhBU19QUENfUE1DX0lCTQogCWNhc2UgUFBDX1BNQ19JQk06CiAJCWF0dHJzID0gaWJtX2NvbW1vbl9hdHRyczsKIAkJbmF0dHJzID0gc2l6ZW9mKGlibV9jb21tb25fYXR0cnMpIC8gc2l6ZW9mKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlKTsKLQkJcG1jX2F0dHJzID0gaWJtX3BtY19hdHRyczsKKwkJcG1jX2F0dHJzID0gY2xhc3NpY19wbWNfYXR0cnM7CiAJCWJyZWFrOworI2VuZGlmIC8qIEhBU19QUENfUE1DX0lCTSAqLworI2lmZGVmIEhBU19QUENfUE1DX0c0CisJY2FzZSBQUENfUE1DX0c0OgorCQlhdHRycyA9IGc0X2NvbW1vbl9hdHRyczsKKwkJbmF0dHJzID0gc2l6ZW9mKGc0X2NvbW1vbl9hdHRycykgLyBzaXplb2Yoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUpOworCQlwbWNfYXR0cnMgPSBjbGFzc2ljX3BtY19hdHRyczsKKwkJYnJlYWs7CisjZW5kaWYgLyogSEFTX1BQQ19QTUNfRzQgKi8KKyNpZmRlZiBIQVNfUFBDX1BNQ19QQTZUCiAJY2FzZSBQUENfUE1DX1BBNlQ6CiAJCS8qIFBBIFNlbWkgc3RhcnRzIGNvdW50aW5nIGF0IFBNQzAgKi8KIAkJYXR0cnMgPSBwYTZ0X2F0dHJzOwogCQluYXR0cnMgPSBzaXplb2YocGE2dF9hdHRycykgLyBzaXplb2Yoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUpOwogCQlwbWNfYXR0cnMgPSBOVUxMOwogCQlicmVhazsKKyNlbmRpZiAvKiBIQVNfUFBDX1BNQ19QQTZUICovCiAJZGVmYXVsdDoKIAkJYXR0cnMgPSBOVUxMOwogCQluYXR0cnMgPSAwOwpAQCAtNjk1LDYgKzc1OCw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBjdXJfY3B1X3NwZWMtPm51bV9wbWNzOyBpKyspCiAJCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJnBtY19hdHRyc1tpXSk7CiAKKyNpZmRlZiBDT05GSUdfUFBDNjQKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTU1DUkEpKQogCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfbW1jcmEpOwogCkBAIC03MDYsNiArNzcwLDcgQEAKIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EU0NSKSkKIAkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX2RzY3IpOworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJcmVtb3ZlX2NhY2hlX2luZm8ocyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggODFjY2I4ZGQuLmY1ZGVmNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKaW5kZXggMjc1MGZiYS4uNDM0YzkyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC0xMjMyLDcgKzEyMzIsNyBAQAogCWVsc2UKIAkJdmlvZGV2LT5kZXYuYXJjaGRhdGEuZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwogCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gdmlvX2J1aWxkX2lvbW11X3RhYmxlKHZpb2Rldik7Ci0JdmlvZGV2LT5kZXYuYXJjaGRhdGEubnVtYV9ub2RlID0gb2Zfbm9kZV90b19uaWQob2Zfbm9kZSk7CisJc2V0X2Rldl9ub2RlKCZ2aW9kZXYtPmRldiwgb2Zfbm9kZV90b19uaWQob2Zfbm9kZSkpOwogCiAJLyogaW5pdCBnZW5lcmljICdzdHJ1Y3QgZGV2aWNlJyBmaWVsZHM6ICovCiAJdmlvZGV2LT5kZXYucGFyZW50ID0gJnZpb19idXNfZGV2aWNlLmRldjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA5ZjZjMWNhLi5iMzljMjdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xODcsNiArMTg3LDI0IEBACiAJCSooLm1hY2hpbmUuZGVzYykKIAkJX19tYWNoaW5lX2Rlc2NfZW5kID0gLiA7CiAJfQorCS4gPSBBTElHTig4KTsKKwkuZHluc3ltIDogQVQoQUREUiguZHluc3ltKSAtIExPQURfT0ZGU0VUKSB7ICooLmR5bnN5bSkgfQorCS5keW5zdHIgOiBBVChBRERSKC5keW5zdHIpIC0gTE9BRF9PRkZTRVQpIHsgKiguZHluc3RyKSB9CisJLmR5bmFtaWMgOiBBVChBRERSKC5keW5hbWljKSAtIExPQURfT0ZGU0VUKQorCXsKKwkJX19keW5hbWljX3N0YXJ0ID0gLjsKKwkJKiguZHluYW1pYykKKwl9CisJLmhhc2ggOiBBVChBRERSKC5oYXNoKSAtIExPQURfT0ZGU0VUKSB7ICooLmhhc2gpIH0KKwkuaW50ZXJwIDogQVQoQUREUiguaW50ZXJwKSAtIExPQURfT0ZGU0VUKSB7ICooLmludGVycCkgfQorCS5yZWxhLmR5biA6IEFUKEFERFIoLnJlbGEuZHluKSAtIExPQURfT0ZGU0VUKQorCXsKKwkJX19yZWxhX2R5bl9zdGFydCA9IC47CisJCSooLnJlbGEqKQorCX0KKworCS8qIEZha2UgRUxGIGhlYWRlciBjb250YWluaW5nIFJQQSBub3RlOyBmb3IgYWRkbm90ZSAqLworCS5mYWtlZWxmIDogQVQoQUREUiguZmFrZWVsZikgLSBMT0FEX09GRlNFVCkgeyAqKC5mYWtlZWxmKSB9CiAKIAkvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS80NHhfdGxiLmMgYi9hcmNoL3Bvd2VycGMva3ZtLzQ0eF90bGIuYwppbmRleCA1YTU2MDJkLi4yZTIyN2E0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtLzQ0eF90bGIuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtLzQ0eF90bGIuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rdm0uaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxhc20vbW11LTQ0eC5oPgpAQCAtMTA5LDcgKzExMCw2IEBACiAJcmV0dXJuIHRsYmUtPndvcmQyICYgKFBQQzQ0eF9UTEJfU1d8UFBDNDR4X1RMQl9VVyk7CiB9CiAKLS8qIE11c3QgYmUgY2FsbGVkIHdpdGggbW1hcF9zZW0gbG9ja2VkIGZvciB3cml0aW5nLiAqLwogc3RhdGljIHZvaWQga3ZtcHBjXzQ0eF9zaGFkb3dfcmVsZWFzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCkKIHsKQEAgLTEyNCw2ICsxMjQsMTEgQEAKIAl9CiB9CiAKK3ZvaWQga3ZtcHBjX3RsYmVfc2V0X21vZGlmaWVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IGkpCit7CisgICAgdmNwdS0+YXJjaC5zaGFkb3dfdGxiX21vZFtpXSA9IDE7Cit9CisKIC8qIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzcGVjaWZpZWQgZ3Vlc3QgVExCIGVudHJ5IGlzIHNhZmUgdG8gaW5zZXJ0IGludG8KICAqIHRoZSBzaGFkb3cgVExCLiAqLwogdm9pZCBrdm1wcGNfbW11X21hcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndmFkZHIsIGdmbl90IGdmbiwgdTY0IGFzaWQsCkBAIC0xNDIsMTkgKzE0NywxNiBAQAogCXN0bGJlID0gJnZjcHUtPmFyY2guc2hhZG93X3RsYlt2aWN0aW1dOwogCiAJLyogR2V0IHJlZmVyZW5jZSB0byBuZXcgcGFnZS4gKi8KLQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJbmV3X3BhZ2UgPSBnZm5fdG9fcGFnZSh2Y3B1LT5rdm0sIGdmbik7CiAJaWYgKGlzX2Vycm9yX3BhZ2UobmV3X3BhZ2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgZ2V0IGd1ZXN0IHBhZ2UgZm9yIGdmbiAlbHghXG4iLCBnZm4pOwogCQlrdm1fcmVsZWFzZV9wYWdlX2NsZWFuKG5ld19wYWdlKTsKLQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkJcmV0dXJuOwogCX0KIAlocGFkZHIgPSBwYWdlX3RvX3BoeXMobmV3X3BhZ2UpOwogCiAJLyogRHJvcCByZWZlcmVuY2UgdG8gb2xkIHBhZ2UuICovCiAJa3ZtcHBjXzQ0eF9zaGFkb3dfcmVsZWFzZSh2Y3B1LCB2aWN0aW0pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAl2Y3B1LT5hcmNoLnNoYWRvd19wYWdlc1t2aWN0aW1dID0gbmV3X3BhZ2U7CiAKQEAgLTE2NCwyNyArMTY2LDMwIEBACiAKIAkvKiBYWFggd2hhdCBhYm91dCBBUz8gKi8KIAotCXN0bGJlLT50aWQgPSBhc2lkICYgMHhmZjsKKwlzdGxiZS0+dGlkID0gIShhc2lkICYgMHhmZik7CiAKIAkvKiBGb3JjZSBUUz0xIGZvciBhbGwgZ3Vlc3QgbWFwcGluZ3MuICovCiAJLyogRm9yIG5vdyB3ZSBoYXJkY29kZSA0S0IgbWFwcGluZ3MsIGJ1dCBpdCB3aWxsIGJlIGltcG9ydGFudCB0bwogCSAqIHVzZSBob3N0IGxhcmdlIHBhZ2VzIGluIHRoZSBmdXR1cmUuICovCiAJc3RsYmUtPndvcmQwID0gKGd2YWRkciAmIFBBR0VfTUFTSykgfCBQUEM0NHhfVExCX1ZBTElEIHwgUFBDNDR4X1RMQl9UUwogCSAgICAgICAgICAgICAgIHwgUFBDNDR4X1RMQl80SzsKLQogCXN0bGJlLT53b3JkMSA9IChocGFkZHIgJiAweGZmZmZmYzAwKSB8ICgoaHBhZGRyID4+IDMyKSAmIDB4Zik7CiAJc3RsYmUtPndvcmQyID0ga3ZtcHBjXzQ0eF90bGJfc2hhZG93X2F0dHJpYihmbGFncywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjcHUtPmFyY2gubXNyICYgTVNSX1BSKTsKKwlrdm1wcGNfdGxiZV9zZXRfbW9kaWZpZWQodmNwdSwgdmljdGltKTsKKworCUtWTVRSQUNFXzVEKFNUTEJfV1JJVEUsIHZjcHUsIHZpY3RpbSwKKwkJCXN0bGJlLT50aWQsIHN0bGJlLT53b3JkMCwgc3RsYmUtPndvcmQxLCBzdGxiZS0+d29yZDIsCisJCQloYW5kbGVyKTsKIH0KIAogdm9pZCBrdm1wcGNfbW11X2ludmFsaWRhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2YV90IGVlbmQsIHUzMiBhc2lkKQogewotCXVuc2lnbmVkIGludCBwaWQgPSBhc2lkICYgMHhmZjsKKwl1bnNpZ25lZCBpbnQgcGlkID0gIShhc2lkICYgMHhmZik7CiAJaW50IGk7CiAKIAkvKiBYWFggUmVwbGFjZSBsb29wIHdpdGggZmFuY3kgZGF0YSBzdHJ1Y3R1cmVzLiAqLwotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZm9yIChpID0gMDsgaSA8PSB0bGJfNDR4X2h3YXRlcjsgaSsrKSB7CiAJCXN0cnVjdCB0bGJlICpzdGxiZSA9ICZ2Y3B1LT5hcmNoLnNoYWRvd190bGJbaV07CiAJCXVuc2lnbmVkIGludCB0aWQ7CkBAIC0yMDQsMjEgKzIwOSwzNSBAQAogCiAJCWt2bXBwY180NHhfc2hhZG93X3JlbGVhc2UodmNwdSwgaSk7CiAJCXN0bGJlLT53b3JkMCA9IDA7CisJCWt2bXBwY190bGJlX3NldF9tb2RpZmllZCh2Y3B1LCBpKTsKKwkJS1ZNVFJBQ0VfNUQoU1RMQl9JTlZBTCwgdmNwdSwgaSwKKwkJCQlzdGxiZS0+dGlkLCBzdGxiZS0+d29yZDAsIHN0bGJlLT53b3JkMSwKKwkJCQlzdGxiZS0+d29yZDIsIGhhbmRsZXIpOwogCX0KLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIH0KIAotLyogSW52YWxpZGF0ZSBhbGwgbWFwcGluZ3MsIHNvIHRoYXQgd2hlbiB0aGV5IGZhdWx0IGJhY2sgaW4gdGhleSB3aWxsIGdldCB0aGUKLSAqIHByb3BlciBwZXJtaXNzaW9uIGJpdHMuICovCisvKiBJbnZhbGlkYXRlIGFsbCBtYXBwaW5ncyBvbiB0aGUgcHJpdmlsZWdlIHN3aXRjaCBhZnRlciBQSUQgaGFzIGJlZW4gY2hhbmdlZC4KKyAqIFRoZSBndWVzdCBhbHdheXMgcnVucyB3aXRoIFBJRD0xLCBzbyB3ZSBtdXN0IGNsZWFyIHRoZSBlbnRpcmUgVExCIHdoZW4KKyAqIHN3aXRjaGluZyBhZGRyZXNzIHNwYWNlcy4gKi8KIHZvaWQga3ZtcHBjX21tdV9wcml2X3N3aXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB1c2VybW9kZSkKIHsKIAlpbnQgaTsKIAotCS8qIFhYWCBSZXBsYWNlIGxvb3Agd2l0aCBmYW5jeSBkYXRhIHN0cnVjdHVyZXMuICovCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlmb3IgKGkgPSAwOyBpIDw9IHRsYl80NHhfaHdhdGVyOyBpKyspIHsKLQkJa3ZtcHBjXzQ0eF9zaGFkb3dfcmVsZWFzZSh2Y3B1LCBpKTsKLQkJdmNwdS0+YXJjaC5zaGFkb3dfdGxiW2ldLndvcmQwID0gMDsKKwlpZiAodmNwdS0+YXJjaC5zd2FwX3BpZCkgeworCQkvKiBYWFggUmVwbGFjZSBsb29wIHdpdGggZmFuY3kgZGF0YSBzdHJ1Y3R1cmVzLiAqLworCQlmb3IgKGkgPSAwOyBpIDw9IHRsYl80NHhfaHdhdGVyOyBpKyspIHsKKwkJCXN0cnVjdCB0bGJlICpzdGxiZSA9ICZ2Y3B1LT5hcmNoLnNoYWRvd190bGJbaV07CisKKwkJCS8qIEZ1dHVyZSBvcHRpbWl6YXRpb246IGNsZWFyIG9ubHkgdXNlcnNwYWNlIG1hcHBpbmdzLiAqLworCQkJa3ZtcHBjXzQ0eF9zaGFkb3dfcmVsZWFzZSh2Y3B1LCBpKTsKKwkJCXN0bGJlLT53b3JkMCA9IDA7CisJCQlrdm1wcGNfdGxiZV9zZXRfbW9kaWZpZWQodmNwdSwgaSk7CisJCQlLVk1UUkFDRV81RChTVExCX0lOVkFMLCB2Y3B1LCBpLAorCQkJICAgICAgICAgICAgc3RsYmUtPnRpZCwgc3RsYmUtPndvcmQwLCBzdGxiZS0+d29yZDEsCisJCQkgICAgICAgICAgICBzdGxiZS0+d29yZDIsIGhhbmRsZXIpOworCQl9CisJCXZjcHUtPmFyY2guc3dhcF9waWQgPSAwOwogCX0KLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCXZjcHUtPmFyY2guc2hhZG93X3BpZCA9ICF1c2VybW9kZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZwppbmRleCA2YjA3NjAxLi41M2FhYTY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9LY29uZmlnCkBAIC0zNyw2ICszNywxNyBAQAogCSAgUHJvdmlkZXMgaG9zdCBzdXBwb3J0IGZvciBLVk0gb24gQm9vayBFIFBvd2VyUEMgcHJvY2Vzc29ycy4gQ3VycmVudGx5CiAJICB0aGlzIHdvcmtzIG9uIDQ0MCBwcm9jZXNzb3JzIG9ubHkuCiAKK2NvbmZpZyBLVk1fVFJBQ0UKKwlib29sICJLVk0gdHJhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEtWTSAmJiBNQVJLRVJTICYmIFNZU0ZTCisJc2VsZWN0IFJFTEFZCisJc2VsZWN0IERFQlVHX0ZTCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHJlYWRpbmcgYSB0cmFjZSBvZiBrdm0tcmVsYXRlZCBldmVudHMgdGhyb3VnaAorCSAgcmVsYXlmcy4gIE5vdGUgdGhlIEFCSSBpcyBub3QgY29uc2lkZXJlZCBzdGFibGUgYW5kIHdpbGwgYmUKKwkgIG1vZGlmaWVkIGluIGZ1dHVyZSB1cGRhdGVzLgorCiBzb3VyY2UgZHJpdmVycy92aXJ0aW8vS2NvbmZpZwogCiBlbmRpZiAjIFZJUlRVQUxJWkFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQppbmRleCAwNGUzNDQ5Li4yYTVkNDM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKQEAgLTQsOSArNCwxMSBAQAogCiBFWFRSQV9DRkxBR1MgKz0gLUl2aXJ0L2t2bSAtSWFyY2gvcG93ZXJwYy9rdm0KIAotY29tbW9uLW9ianMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIGt2bV9tYWluLm8gY29hbGVzY2VkX21taW8ubykKK2NvbW1vbi1vYmpzLXkgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIGt2bV9tYWluLm8gY29hbGVzY2VkX21taW8ubykKIAota3ZtLW9ianMgOj0gJChjb21tb24tb2JqcykgcG93ZXJwYy5vIGVtdWxhdGUubyBib29rZV9ndWVzdC5vCitjb21tb24tb2Jqcy0kKENPTkZJR19LVk1fVFJBQ0UpICArPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIGt2bV90cmFjZS5vKQorCitrdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzLXkpIHBvd2VycGMubyBlbXVsYXRlLm8gYm9va2VfZ3Vlc3Qubwogb2JqLSQoQ09ORklHX0tWTSkgKz0ga3ZtLm8KIAogQUZMQUdTX2Jvb2tlX2ludGVycnVwdHMubyA6PSAtSSQob2JqKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9ndWVzdC5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9ndWVzdC5jCmluZGV4IDljOGFkODUuLjdiMjU5MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2VfZ3Vlc3QuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlX2d1ZXN0LmMKQEAgLTQxMCw2ICs0MTAsMjEgQEAKIAkJYnJlYWs7CiAJfQogCisJY2FzZSBCT09LRV9JTlRFUlJVUFRfREVCVUc6IHsKKwkJdTMyIGRic3I7CisKKwkJdmNwdS0+YXJjaC5wYyA9IG1mc3ByKFNQUk5fQ1NSUjApOworCisJCS8qIGNsZWFyIElBQyBldmVudHMgaW4gREJTUiByZWdpc3RlciAqLworCQlkYnNyID0gbWZzcHIoU1BSTl9EQlNSKTsKKwkJZGJzciAmPSBEQlNSX0lBQzEgfCBEQlNSX0lBQzIgfCBEQlNSX0lBQzMgfCBEQlNSX0lBQzQ7CisJCW10c3ByKFNQUk5fREJTUiwgZGJzcik7CisKKwkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0RFQlVHOworCQlyID0gUkVTVU1FX0hPU1Q7CisJCWJyZWFrOworCX0KKwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VNRVJHICJleGl0X25yICVkXG4iLCBleGl0X25yKTsKIAkJQlVHKCk7CkBAIC00NzEsNiArNDg2LDggQEAKIAl2Y3B1LT5hcmNoLm1zciA9IDA7CiAJdmNwdS0+YXJjaC5ncHJbMV0gPSAoMTY8PDIwKSAtIDg7IC8qIC04IGZvciB0aGUgY2FsbGVlLXNhdmUgTFIgc2xvdCAqLwogCisJdmNwdS0+YXJjaC5zaGFkb3dfcGlkID0gMTsKKwogCS8qIEV5ZS1jYXRjaGluZyBudW1iZXIgc28gd2Uga25vdyBpZiB0aGUgZ3Vlc3QgdGFrZXMgYW4gaW50ZXJydXB0CiAJICogYmVmb3JlIGl0J3MgcHJvZ3JhbW1lZCBpdHMgb3duIElWUFIuICovCiAJdmNwdS0+YXJjaC5pdnByID0gMHg1NTU1MDAwMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2VfaW50ZXJydXB0cy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKaW5kZXggM2I2NTNiNS4uOTVlMTY1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZV9pbnRlcnJ1cHRzLlMKQEAgLTQyLDcgKzQyLDggQEAKICNkZWZpbmUgSE9TVF9TVEFDS19MUiAgIChIT1NUX1NUQUNLX1NJWkUgKyA0KSAvKiBJbiBjYWxsZXIgc3RhY2sgZnJhbWUuICovCiAKICNkZWZpbmUgTkVFRF9JTlNUX01BU0sgKCgxPDxCT09LRV9JTlRFUlJVUFRfUFJPR1JBTSkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoMTw8Qk9PS0VfSU5URVJSVVBUX0RUTEJfTUlTUykpCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8Qk9PS0VfSU5URVJSVVBUX0RUTEJfTUlTUykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8Qk9PS0VfSU5URVJSVVBUX0RFQlVHKSkKIAogI2RlZmluZSBORUVEX0RFQVJfTUFTSyAoKDE8PEJPT0tFX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0UpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgKDE8PEJPT0tFX0lOVEVSUlVQVF9EVExCX01JU1MpKQpAQCAtMzMxLDUwICszMzIsNTYgQEAKIAogCW1mc3ByCXIzLCBTUFJOX1BJRAogCXN0dwlyMywgVkNQVV9IT1NUX1BJRChyNCkKLQlsd3oJcjMsIFZDUFVfUElEKHI0KQorCWx3eglyMywgVkNQVV9TSEFET1dfUElEKHI0KQogCW10c3ByCVNQUk5fUElELCByMwogCi0JLyogUHJldmVudCBhbGwgVExCIHVwZGF0ZXMuICovCisJLyogUHJldmVudCBhbGwgYXN5bmNocm9ub3VzIFRMQiB1cGRhdGVzLiAqLwogCW1mbXNyCXI1CiAJbGlzCXI2LCAoTVNSX0VFfE1TUl9DRXxNU1JfTUV8TVNSX0RFKUBoCiAJb3JpCXI2LCByNiwgKE1TUl9FRXxNU1JfQ0V8TVNSX01FfE1TUl9ERSlAbAogCWFuZGMJcjYsIHI1LCByNgogCW10bXNyCXI2CiAKLQkvKiBTYXZlIHRoZSBob3N0J3Mgbm9uLXBpbm5lZCBUTEIgbWFwcGluZ3MsIGFuZCBsb2FkIHRoZSBndWVzdCBtYXBwaW5ncwotCSAqIG92ZXIgdGhlbS4gTGVhdmUgdGhlIGhvc3QncyAicGlubmVkIiBrZXJuZWwgbWFwcGluZ3MgaW4gcGxhY2UuICovCi0JLyogWFhYIG9wdGltaXphdGlvbjogdXNlIGdlbmVyYXRpb24gY291bnQgdG8gYXZvaWQgc3dhcHBpbmcgdW5tb2RpZmllZAotCSAqIGVudHJpZXMuICovCisJLyogTG9hZCB0aGUgZ3Vlc3QgbWFwcGluZ3MsIGxlYXZpbmcgdGhlIGhvc3QncyAicGlubmVkIiBrZXJuZWwgbWFwcGluZ3MKKwkgKiBpbiBwbGFjZS4gKi8KIAltZnNwcglyMTAsIFNQUk5fTU1VQ1IJCQkvKiBTYXZlIGhvc3QgTU1VQ1IuICovCi0JbGlzCXI4LCB0bGJfNDR4X2h3YXRlckBoYQotCWx3eglyOCwgdGxiXzQ0eF9od2F0ZXJAbChyOCkKLQlhZGRpCXIzLCByNCwgVkNQVV9IT1NUX1RMQiAtIDQKLQlhZGRpCXI5LCByNCwgVkNQVV9TSEFET1dfVExCIC0gNAorCWxpCXI1LCBQUEM0NHhfVExCX1NJWkUKKwlsaXMJcjUsIHRsYl80NHhfaHdhdGVyQGhhCisJbHd6CXI1LCB0bGJfNDR4X2h3YXRlckBsKHI1KQorCW10Y3RyCXI1CisJYWRkaQlyOSwgcjQsIFZDUFVfU0hBRE9XX1RMQgorCWFkZGkJcjUsIHI0LCBWQ1BVX1NIQURPV19NT0QKKwlsaQlyMywgMAorMToKKwlsYnp4CXI3LCByMywgcjUKKwljbXB3aQlyNywgMAorCWJlcQkzZgorCisJLyogTG9hZCBndWVzdCBlbnRyeS4gKi8KKwltdWxsaQlyMTEsIHIzLCBUTEJFX0JZVEVTCisJYWRkCXIxMSwgcjExLCByOQorCWx3eglyNywgMChyMTEpCisJbXRzcHIJU1BSTl9NTVVDUiwgcjcKKwlsd3oJcjcsIDQocjExKQorCXRsYndlCXI3LCByMywgUFBDNDR4X1RMQl9QQUdFSUQKKwlsd3oJcjcsIDgocjExKQorCXRsYndlCXI3LCByMywgUFBDNDR4X1RMQl9YTEFUCisJbHd6CXI3LCAxMihyMTEpCisJdGxid2UJcjcsIHIzLCBQUEM0NHhfVExCX0FUVFJJQgorMzoKKwlhZGRpCXIzLCByMywgMSAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGluZGV4LiAqLworCWJkbnoJMWIKKworCW10c3ByCVNQUk5fTU1VQ1IsIHIxMAkJCS8qIFJlc3RvcmUgaG9zdCBNTVVDUi4gKi8KKworCS8qIENsZWFyIGJpdG1hcCBvZiBtb2RpZmllZCBUTEIgZW50cmllcyAqLworCWxpCXI1LCBQUEM0NHhfVExCX1NJWkU+PjIKKwltdGN0cglyNQorCWFkZGkJcjUsIHI0LCBWQ1BVX1NIQURPV19NT0QgLSA0CiAJbGkJcjYsIDAKIDE6Ci0JLyogU2F2ZSBob3N0IGVudHJ5LiAqLwotCXRsYnJlCXI3LCByNiwgUFBDNDR4X1RMQl9QQUdFSUQKLQltZnNwcglyNSwgU1BSTl9NTVVDUgotCXN0d3UJcjUsIDQocjMpCi0Jc3R3dQlyNywgNChyMykKLQl0bGJyZQlyNywgcjYsIFBQQzQ0eF9UTEJfWExBVAotCXN0d3UJcjcsIDQocjMpCi0JdGxicmUJcjcsIHI2LCBQUEM0NHhfVExCX0FUVFJJQgotCXN0d3UJcjcsIDQocjMpCi0JLyogTG9hZCBndWVzdCBlbnRyeS4gKi8KLQlsd3p1CXI3LCA0KHI5KQotCW10c3ByCVNQUk5fTU1VQ1IsIHI3Ci0JbHd6dQlyNywgNChyOSkKLQl0bGJ3ZQlyNywgcjYsIFBQQzQ0eF9UTEJfUEFHRUlECi0JbHd6dQlyNywgNChyOSkKLQl0bGJ3ZQlyNywgcjYsIFBQQzQ0eF9UTEJfWExBVAotCWx3enUJcjcsIDQocjkpCi0JdGxid2UJcjcsIHI2LCBQUEM0NHhfVExCX0FUVFJJQgotCS8qIEluY3JlbWVudCBpbmRleC4gKi8KLQlhZGRpCXI2LCByNiwgMQotCWNtcHcJcjYsIHI4Ci0JYmx0CTFiCi0JbXRzcHIJU1BSTl9NTVVDUiwgcjEwCQkJLyogUmVzdG9yZSBob3N0IE1NVUNSLiAqLworCXN0d3UJcjYsIDQocjUpCisJYmRuegkxYgogCiAJaWNjY2kJMCwgMCAvKiBYWFggaGFjayAqLwogCkBAIC00MzEsNiArNDM4LDE0IEBACiAJb3JpcwlyMywgcjMsIEtWTVBQQ19NU1JfTUFTS0BoCiAJb3JpCXIzLCByMywgS1ZNUFBDX01TUl9NQVNLQGwKIAltdHNycjEJcjMKKworCS8qIENsZWFyIGFueSBkZWJ1ZyBldmVudHMgd2hpY2ggb2NjdXJyZWQgc2luY2Ugd2UgZGlzYWJsZWQgTVNSW0RFXS4KKwkgKiBYWFggVGhpcyBnaXZlcyB1cyBhIDMtaW5zdHJ1Y3Rpb24gd2luZG93IGluIHdoaWNoIGEgYnJlYWtwb2ludAorCSAqIGludGVuZGVkIGZvciBndWVzdCBjb250ZXh0IGNvdWxkIGZpcmUgaW4gdGhlIGhvc3QgaW5zdGVhZC4gKi8KKwlsaXMJcjMsIDB4ZmZmZgorCW9yaQlyMywgcjMsIDB4ZmZmZgorCW10c3ByCVNQUk5fREJTUiwgcjMKKwogCWx3eglyMywgVkNQVV9HUFIocjMpKHI0KQogCWx3eglyNCwgVkNQVV9HUFIocjQpKHI0KQogCXJmaQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lbXVsYXRlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwppbmRleCA4YzYwNWQwLi4wZmNlNGZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwpAQCAtMTcwLDYgKzE3MCwxMCBAQAogCQlrdm1wcGNfbW11X21hcCh2Y3B1LCBlYWRkciwgcmFkZHIgPj4gUEFHRV9TSElGVCwgYXNpZCwgZmxhZ3MpOwogCX0KIAorCUtWTVRSQUNFXzVEKEdUTEJfV1JJVEUsIHZjcHUsIGluZGV4LAorCQkJdGxiZS0+dGlkLCB0bGJlLT53b3JkMCwgdGxiZS0+d29yZDEsIHRsYmUtPndvcmQyLAorCQkJaGFuZGxlcik7CisKIAlyZXR1cm4gRU1VTEFURV9ET05FOwogfQogCkBAIC01MDQsNyArNTA4LDcgQEAKIAkJCWNhc2UgU1BSTl9NTVVDUjoKIAkJCQl2Y3B1LT5hcmNoLm1tdWNyID0gdmNwdS0+YXJjaC5ncHJbcnNdOyBicmVhazsKIAkJCWNhc2UgU1BSTl9QSUQ6Ci0JCQkJdmNwdS0+YXJjaC5waWQgPSB2Y3B1LT5hcmNoLmdwcltyc107IGJyZWFrOworCQkJCWt2bXBwY19zZXRfcGlkKHZjcHUsIHZjcHUtPmFyY2guZ3ByW3JzXSk7IGJyZWFrOwogCQkJY2FzZSBTUFJOX0NDUjA6CiAJCQkJdmNwdS0+YXJjaC5jY3IwID0gdmNwdS0+YXJjaC5ncHJbcnNdOyBicmVhazsKIAkJCWNhc2UgU1BSTl9DQ1IxOgpAQCAtNzY1LDYgKzc2OSw4IEBACiAJCWJyZWFrOwogCX0KIAorCUtWTVRSQUNFXzNEKFBQQ19JTlNUUiwgdmNwdSwgaW5zdCwgdmNwdS0+YXJjaC5wYywgZW11bGF0ZWQsIGVudHJ5ZXhpdCk7CisKIAlpZiAoYWR2YW5jZSkKIAkJdmNwdS0+YXJjaC5wYyArPSA0OyAvKiBBZHZhbmNlIHBhc3QgZW11bGF0ZWQgaW5zdHJ1Y3Rpb24uICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggNTM4MjZhNS4uOTBhNmZjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKIAogZ2ZuX3QgdW5hbGlhc19nZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCkBAIC0yMzksMTggKzI0MCwxMTQgQEAKIHsKIH0KIAorLyogTm90ZTogY2xlYXJpbmcgTVNSW0RFXSBqdXN0IG1lYW5zIHRoYXQgdGhlIGRlYnVnIGludGVycnVwdCB3aWxsIG5vdCBiZQorICogZGVsaXZlcmVkICppbW1lZGlhdGVseSouIEluc3RlYWQsIGl0IHNpbXBseSBzZXRzIHRoZSBhcHByb3ByaWF0ZSBEQlNSIGJpdHMuCisgKiBJZiB0aG9zZSBEQlNSIGJpdHMgYXJlIHN0aWxsIHNldCB3aGVuIE1TUltERV0gaXMgcmUtZW5hYmxlZCwgdGhlIGludGVycnVwdAorICogd2lsbCBiZSBkZWxpdmVyZWQgYXMgYW4gImltcHJlY2lzZSBkZWJ1ZyBldmVudCIgKHdoaWNoIGlzIGluZGljYXRlZCBieQorICogREJTUltJREVdLgorICovCitzdGF0aWMgdm9pZCBrdm1wcGNfZGlzYWJsZV9kZWJ1Z19pbnRlcnJ1cHRzKHZvaWQpCit7CisJbXRtc3IobWZtc3IoKSAmIH5NU1JfREUpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfcmVzdG9yZV9ob3N0X2RlYnVnX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1wcGNfZGlzYWJsZV9kZWJ1Z19pbnRlcnJ1cHRzKCk7CisKKwltdHNwcihTUFJOX0lBQzEsIHZjcHUtPmFyY2guaG9zdF9pYWNbMF0pOworCW10c3ByKFNQUk5fSUFDMiwgdmNwdS0+YXJjaC5ob3N0X2lhY1sxXSk7CisJbXRzcHIoU1BSTl9JQUMzLCB2Y3B1LT5hcmNoLmhvc3RfaWFjWzJdKTsKKwltdHNwcihTUFJOX0lBQzQsIHZjcHUtPmFyY2guaG9zdF9pYWNbM10pOworCW10c3ByKFNQUk5fREJDUjEsIHZjcHUtPmFyY2guaG9zdF9kYmNyMSk7CisJbXRzcHIoU1BSTl9EQkNSMiwgdmNwdS0+YXJjaC5ob3N0X2RiY3IyKTsKKwltdHNwcihTUFJOX0RCQ1IwLCB2Y3B1LT5hcmNoLmhvc3RfZGJjcjApOworCW10bXNyKHZjcHUtPmFyY2guaG9zdF9tc3IpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfbG9hZF9ndWVzdF9kZWJ1Z19yZWdpc3RlcnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fZ3Vlc3RfZGVidWcgKmRiZyA9ICZ2Y3B1LT5ndWVzdF9kZWJ1ZzsKKwl1MzIgZGJjcjAgPSAwOworCisJdmNwdS0+YXJjaC5ob3N0X21zciA9IG1mbXNyKCk7CisJa3ZtcHBjX2Rpc2FibGVfZGVidWdfaW50ZXJydXB0cygpOworCisJLyogU2F2ZSBob3N0IGRlYnVnIHJlZ2lzdGVyIHN0YXRlLiAqLworCXZjcHUtPmFyY2guaG9zdF9pYWNbMF0gPSBtZnNwcihTUFJOX0lBQzEpOworCXZjcHUtPmFyY2guaG9zdF9pYWNbMV0gPSBtZnNwcihTUFJOX0lBQzIpOworCXZjcHUtPmFyY2guaG9zdF9pYWNbMl0gPSBtZnNwcihTUFJOX0lBQzMpOworCXZjcHUtPmFyY2guaG9zdF9pYWNbM10gPSBtZnNwcihTUFJOX0lBQzQpOworCXZjcHUtPmFyY2guaG9zdF9kYmNyMCA9IG1mc3ByKFNQUk5fREJDUjApOworCXZjcHUtPmFyY2guaG9zdF9kYmNyMSA9IG1mc3ByKFNQUk5fREJDUjEpOworCXZjcHUtPmFyY2guaG9zdF9kYmNyMiA9IG1mc3ByKFNQUk5fREJDUjIpOworCisJLyogc2V0IHJlZ2lzdGVycyB1cCBmb3IgZ3Vlc3QgKi8KKworCWlmIChkYmctPmJwWzBdKSB7CisJCW10c3ByKFNQUk5fSUFDMSwgZGJnLT5icFswXSk7CisJCWRiY3IwIHw9IERCQ1IwX0lBQzEgfCBEQkNSMF9JRE07CisJfQorCWlmIChkYmctPmJwWzFdKSB7CisJCW10c3ByKFNQUk5fSUFDMiwgZGJnLT5icFsxXSk7CisJCWRiY3IwIHw9IERCQ1IwX0lBQzIgfCBEQkNSMF9JRE07CisJfQorCWlmIChkYmctPmJwWzJdKSB7CisJCW10c3ByKFNQUk5fSUFDMywgZGJnLT5icFsyXSk7CisJCWRiY3IwIHw9IERCQ1IwX0lBQzMgfCBEQkNSMF9JRE07CisJfQorCWlmIChkYmctPmJwWzNdKSB7CisJCW10c3ByKFNQUk5fSUFDNCwgZGJnLT5icFszXSk7CisJCWRiY3IwIHw9IERCQ1IwX0lBQzQgfCBEQkNSMF9JRE07CisJfQorCisJbXRzcHIoU1BSTl9EQkNSMCwgZGJjcjApOworCW10c3ByKFNQUk5fREJDUjEsIDApOworCW10c3ByKFNQUk5fREJDUjIsIDApOworfQorCiB2b2lkIGt2bV9hcmNoX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCiB7CisJaW50IGk7CisKKwlpZiAodmNwdS0+Z3Vlc3RfZGVidWcuZW5hYmxlZCkKKwkJa3ZtcHBjX2xvYWRfZ3Vlc3RfZGVidWdfcmVnaXN0ZXJzKHZjcHUpOworCisJLyogTWFyayBldmVyeSBndWVzdCBlbnRyeSBpbiB0aGUgc2hhZG93IFRMQiBlbnRyeSBtb2RpZmllZCwgc28gdGhhdCB0aGV5CisJICogd2lsbCBhbGwgYmUgcmVsb2FkZWQgb24gdGhlIG5leHQgdmNwdSBydW4gKGluc3RlYWQgb2YgYmVpbmcKKwkgKiBkZW1hbmQtZmF1bHRlZCkuICovCisJZm9yIChpID0gMDsgaSA8PSB0bGJfNDR4X2h3YXRlcjsgaSsrKQorCQlrdm1wcGNfdGxiZV9zZXRfbW9kaWZpZWQodmNwdSwgaSk7CiB9CiAKIHZvaWQga3ZtX2FyY2hfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkKQorCQlrdm1wcGNfcmVzdG9yZV9ob3N0X2RlYnVnX3N0YXRlKHZjcHUpOworCisJLyogRG9uJ3QgbGVhdmUgZ3Vlc3QgVExCIGVudHJpZXMgcmVzaWRlbnQgd2hlbiBiZWluZyBkZS1zY2hlZHVsZWQuICovCisJLyogWFhYIEl0IHdvdWxkIGJlIG5pY2UgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGhlYXZ5d2VpZ2h0IGV4aXQgYW5kCisJICogc2NoZWRfb3V0IGhlcmUsIHNpbmNlIHdlIGNvdWxkIGF2b2lkIHRoZSBUTEIgZmx1c2ggZm9yIGhlYXZ5d2VpZ2h0CisJICogZXhpdHMuICovCisJX3RsYmlhKCk7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2RlYnVnX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgKmRiZykKIHsKLQlyZXR1cm4gLUVOT1RTVVBQOworCWludCBpOworCisJdmNwdS0+Z3Vlc3RfZGVidWcuZW5hYmxlZCA9IGRiZy0+ZW5hYmxlZDsKKwlpZiAodmNwdS0+Z3Vlc3RfZGVidWcuZW5hYmxlZCkgeworCQlmb3IgKGk9MDsgaSA8IEFSUkFZX1NJWkUodmNwdS0+Z3Vlc3RfZGVidWcuYnApOyBpKyspIHsKKwkJCWlmIChkYmctPmJyZWFrcG9pbnRzW2ldLmVuYWJsZWQpCisJCQkJdmNwdS0+Z3Vlc3RfZGVidWcuYnBbaV0gPSBkYmctPmJyZWFrcG9pbnRzW2ldLmFkZHJlc3M7CisJCQllbHNlCisJCQkJdmNwdS0+Z3Vlc3RfZGVidWcuYnBbaV0gPSAwOworCQl9CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bXBwY19jb21wbGV0ZV9kY3JfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2NvcHlwYWdlXzY0LlMgYi9hcmNoL3Bvd2VycGMvbGliL2NvcHlwYWdlXzY0LlMKaW5kZXggZjk4MzdmNC4uNzVmMzI2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9jb3B5cGFnZV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvY29weXBhZ2VfNjQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcmsgTmVsc29uLCBJQk0gQ29ycC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtOCwxMTIgKzgsMTAwIEBACiAgKi8KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworICAgICAgICAuc2VjdGlvbiAgICAgICAgIi50b2MiLCJhdyIKK1BQQzY0X0NBQ0hFUzoKKyAgICAgICAgLnRjICAgICAgICAgICAgIHBwYzY0X2NhY2hlc1tUQ10scHBjNjRfY2FjaGVzCisgICAgICAgIC5zZWN0aW9uICAgICAgICAiLnRleHQiCisKIAogX0dMT0JBTChjb3B5XzRLX3BhZ2UpCi0Jc3RkCXIzMSwtOCgxKQotCXN0ZAlyMzAsLTE2KDEpCi0Jc3RkCXIyOSwtMjQoMSkKLQlzdGQJcjI4LC0zMigxKQotCXN0ZAlyMjcsLTQwKDEpCi0Jc3RkCXIyNiwtNDgoMSkKLQlzdGQJcjI1LC01NigxKQotCXN0ZAlyMjQsLTY0KDEpCi0Jc3RkCXIyMywtNzIoMSkKLQlzdGQJcjIyLC04MCgxKQotCXN0ZAlyMjEsLTg4KDEpCi0Jc3RkCXIyMCwtOTYoMSkKLQlsaQlyNSw0MDk2LzMyIC0gMQorCWxpCXI1LDQwOTYJCS8qIDRLIHBhZ2Ugc2l6ZSAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwlsZCAgICAgIHIxMCxQUEM2NF9DQUNIRVNAdG9jKHIyKQorCWx3eglyMTEsRENBQ0hFTDFMT0dMSU5FU0laRShyMTApCS8qIGxvZzIgb2YgY2FjaGUgbGluZSBzaXplICovCisJbHd6ICAgICByMTIsRENBQ0hFTDFMSU5FU0laRShyMTApCS8qIGdldCBjYWNoZSBsaW5lIHNpemUgKi8KKwlsaQlyOSwwCisJc3JkCXI4LHI1LHIxMQorCisJbXRjdHIJcjgKK3NldHVwOgorCWRjYnQJcjkscjQKKwlkY2J6CXI5LHIzCisJYWRkCXI5LHI5LHIxMgorCWJkbnoJc2V0dXAKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NQX1VTRV9EQ0JUWikKIAlhZGRpCXIzLHIzLC04Ci0JbGkJcjEyLDUKLTA6CWFkZGkJcjUscjUsLTI0Ci0JbXRjdHIJcjEyCi0JbGQJcjIyLDY0MCg0KQotCWxkCXIyMSw1MTIoNCkKLQlsZAlyMjAsMzg0KDQpCi0JbGQJcjExLDI1Nig0KQotCWxkCXI5LDEyOCg0KQotCWxkCXI3LDAoNCkKLQlsZAlyMjUsNjQ4KDQpCi0JbGQJcjI0LDUyMCg0KQotCWxkCXIyMywzOTIoNCkKLQlsZAlyMTAsMjY0KDQpCi0JbGQJcjgsMTM2KDQpCi0JbGR1CXI2LDgoNCkKLQljbXB3aQlyNSwyNAotMToJc3RkCXIyMiw2NDgoMykKLQlzdGQJcjIxLDUyMCgzKQotCXN0ZAlyMjAsMzkyKDMpCi0Jc3RkCXIxMSwyNjQoMykKLQlzdGQJcjksMTM2KDMpCi0Jc3RkCXI3LDgoMykKLQlsZAlyMjgsNjQ4KDQpCi0JbGQJcjI3LDUyMCg0KQotCWxkCXIyNiwzOTIoNCkKLQlsZAlyMzEsMjY0KDQpCi0JbGQJcjMwLDEzNig0KQotCWxkCXIyOSw4KDQpCi0Jc3RkCXIyNSw2NTYoMykKLQlzdGQJcjI0LDUyOCgzKQotCXN0ZAlyMjMsNDAwKDMpCi0Jc3RkCXIxMCwyNzIoMykKLQlzdGQJcjgsMTQ0KDMpCi0Jc3RkCXI2LDE2KDMpCi0JbGQJcjIyLDY1Nig0KQotCWxkCXIyMSw1MjgoNCkKLQlsZAlyMjAsNDAwKDQpCi0JbGQJcjExLDI3Mig0KQotCWxkCXI5LDE0NCg0KQotCWxkCXI3LDE2KDQpCi0Jc3RkCXIyOCw2NjQoMykKLQlzdGQJcjI3LDUzNigzKQotCXN0ZAlyMjYsNDA4KDMpCi0Jc3RkCXIzMSwyODAoMykKLQlzdGQJcjMwLDE1MigzKQotCXN0ZHUJcjI5LDI0KDMpCi0JbGQJcjI1LDY2NCg0KQotCWxkCXIyNCw1MzYoNCkKLQlsZAlyMjMsNDA4KDQpCi0JbGQJcjEwLDI4MCg0KQotCWxkCXI4LDE1Mig0KQotCWxkdQlyNiwyNCg0KQorCXNyZGkgICAgcjgscjUsNwkJLyogcGFnZSBpcyBjb3BpZWQgaW4gMTI4IGJ5dGUgc3RyaWRlcyAqLworCWFkZGkJcjgscjgsLTEJLyogb25lIHN0cmlkZSBjb3BpZWQgb3V0c2lkZSBsb29wICovCisKKwltdGN0cglyOAorCisJbGQJcjUsMChyNCkKKwlsZAlyNiw4KHI0KQorCWxkCXI3LDE2KHI0KQorCWxkdQlyOCwyNChyNCkKKzE6CXN0ZAlyNSw4KHIzKQorCWxkCXI5LDgocjQpCisJc3RkCXI2LDE2KHIzKQorCWxkCXIxMCwxNihyNCkKKwlzdGQJcjcsMjQocjMpCisJbGQJcjExLDI0KHI0KQorCXN0ZAlyOCwzMihyMykKKwlsZAlyMTIsMzIocjQpCisJc3RkCXI5LDQwKHIzKQorCWxkCXI1LDQwKHI0KQorCXN0ZAlyMTAsNDgocjMpCisJbGQJcjYsNDgocjQpCisJc3RkCXIxMSw1NihyMykKKwlsZAlyNyw1NihyNCkKKwlzdGQJcjEyLDY0KHIzKQorCWxkCXI4LDY0KHI0KQorCXN0ZAlyNSw3MihyMykKKwlsZAlyOSw3MihyNCkKKwlzdGQJcjYsODAocjMpCisJbGQJcjEwLDgwKHI0KQorCXN0ZAlyNyw4OChyMykKKwlsZAlyMTEsODgocjQpCisJc3RkCXI4LDk2KHIzKQorCWxkCXIxMiw5NihyNCkKKwlzdGQJcjksMTA0KHIzKQorCWxkCXI1LDEwNChyNCkKKwlzdGQJcjEwLDExMihyMykKKwlsZAlyNiwxMTIocjQpCisJc3RkCXIxMSwxMjAocjMpCisJbGQJcjcsMTIwKHI0KQorCXN0ZHUJcjEyLDEyOChyMykKKwlsZHUJcjgsMTI4KHI0KQogCWJkbnoJMWIKLQlzdGQJcjIyLDY0OCgzKQotCXN0ZAlyMjEsNTIwKDMpCi0Jc3RkCXIyMCwzOTIoMykKLQlzdGQJcjExLDI2NCgzKQotCXN0ZAlyOSwxMzYoMykKLQlzdGQJcjcsOCgzKQotCWFkZGkJcjQscjQsNjQwCi0JYWRkaQlyMyxyMyw2NDgKLQliZ2UJMGIKLQltdGN0cglyNQotCWxkCXI3LDAoNCkKLQlsZAlyOCw4KDQpCi0JbGR1CXI5LDE2KDQpCi0zOglsZAlyMTAsOCg0KQotCXN0ZAlyNyw4KDMpCi0JbGQJcjcsMTYoNCkKLQlzdGQJcjgsMTYoMykKLQlsZAlyOCwyNCg0KQotCXN0ZAlyOSwyNCgzKQotCWxkdQlyOSwzMig0KQotCXN0ZHUJcjEwLDMyKDMpCi0JYmRuegkzYgotNDoJbGQJcjEwLDgoNCkKLQlzdGQJcjcsOCgzKQotCXN0ZAlyOCwxNigzKQotCXN0ZAlyOSwyNCgzKQotCXN0ZAlyMTAsMzIoMykKLTk6CWxkCXIyMCwtOTYoMSkKLQlsZAlyMjEsLTg4KDEpCi0JbGQJcjIyLC04MCgxKQotCWxkCXIyMywtNzIoMSkKLQlsZAlyMjQsLTY0KDEpCi0JbGQJcjI1LC01NigxKQotCWxkCXIyNiwtNDgoMSkKLQlsZAlyMjcsLTQwKDEpCi0JbGQJcjI4LC0zMigxKQotCWxkCXIyOSwtMjQoMSkKLQlsZAlyMzAsLTE2KDEpCi0JbGQJcjMxLC04KDEpCisKKwlzdGQJcjUsOChyMykKKwlsZAlyOSw4KHI0KQorCXN0ZAlyNiwxNihyMykKKwlsZAlyMTAsMTYocjQpCisJc3RkCXI3LDI0KHIzKQorCWxkCXIxMSwyNChyNCkKKwlzdGQJcjgsMzIocjMpCisJbGQJcjEyLDMyKHI0KQorCXN0ZAlyOSw0MChyMykKKwlsZAlyNSw0MChyNCkKKwlzdGQJcjEwLDQ4KHIzKQorCWxkCXI2LDQ4KHI0KQorCXN0ZAlyMTEsNTYocjMpCisJbGQJcjcsNTYocjQpCisJc3RkCXIxMiw2NChyMykKKwlsZAlyOCw2NChyNCkKKwlzdGQJcjUsNzIocjMpCisJbGQJcjksNzIocjQpCisJc3RkCXI2LDgwKHIzKQorCWxkCXIxMCw4MChyNCkKKwlzdGQJcjcsODgocjMpCisJbGQJcjExLDg4KHI0KQorCXN0ZAlyOCw5NihyMykKKwlsZAlyMTIsOTYocjQpCisJc3RkCXI5LDEwNChyMykKKwlzdGQJcjEwLDExMihyMykKKwlzdGQJcjExLDEyMChyMykKKwlzdGQJcjEyLDEyOChyMykKIAlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvZG1hLW5vbmNvaGVyZW50LmMgYi9hcmNoL3Bvd2VycGMvbGliL2RtYS1ub25jb2hlcmVudC5jCmluZGV4IDVkODM5MDcuLjMxNzM0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvZG1hLW5vbmNvaGVyZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9kbWEtbm9uY29oZXJlbnQuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJCS8qCiAJCSAqIFNldCB0aGUgImRtYSBoYW5kbGUiCiAJCSAqLwotCQkqaGFuZGxlID0gcGFnZV90b19idXMocGFnZSk7CisJCSpoYW5kbGUgPSBwYWdlX3RvX3BoeXMocGFnZSk7CiAKIAkJZG8gewogCQkJQlVHX09OKCFwdGVfbm9uZSgqcHRlKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvTWFrZWZpbGUKaW5kZXggMjliYzkxMi4uMDNhYTk4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9NYWtlZmlsZQpAQCAtNCwxMyArNCwxNCBAQAogb2JqLSQoQ09ORklHX01BVEhfRU1VTEFUSU9OKQkrPSBmYWJzLm8gZmFkZC5vIGZhZGRzLm8gZmNtcG8ubyBmY21wdS5vIFwKIAkJCQkJZmN0aXcubyBmY3Rpd3oubyBmZGl2Lm8gZmRpdnMubyBcCiAJCQkJCWZtYWRkLm8gZm1hZGRzLm8gZm1zdWIubyBmbXN1YnMubyBcCi0JCQkJCWZtdWwubyBmbXVscy5vIGZuYWJzLm8gZm5lZy5vIHR5cGVzLm8gXAorCQkJCQlmbXVsLm8gZm11bHMubyBmbmFicy5vIGZuZWcubyBcCiAJCQkJCWZubWFkZC5vIGZubWFkZHMubyBmbm1zdWIubyBmbm1zdWJzLm8gXAogCQkJCQlmcmVzLm8gZnJzcC5vIGZyc3FydGUubyBmc2VsLm8gbGZzLm8gXAogCQkJCQlmc3FydC5vCWZzcXJ0cy5vIGZzdWIubyBmc3Vicy5vIFwKIAkJCQkJbWNyZnMubyBtZmZzLm8gbXRmc2IwLm8gbXRmc2IxLm8gXAotCQkJCQltdGZzZi5vIG10ZnNmaS5vIHN0Zml3eC5vIHN0ZnMubyBcCi0JCQkJCXVkaXZtb2R0aTQubworCQkJCQltdGZzZi5vIG10ZnNmaS5vIHN0Zml3eC5vIHN0ZnMubwogCiBDRkxBR1NfZmFicy5vID0gLWZuby1idWlsdGluLWZhYnMKIENGTEFHU19tYXRoLm8gPSAtZm5vLWJ1aWx0aW4tZmFicworCitFWFRSQV9DRkxBR1MgPSAtSS4gLUlpbmNsdWRlL21hdGgtZW11IC13CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZG91YmxlLmggYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZG91YmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmE4YjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2RvdWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgSUVFRSBEb3VibGUgUHJlY2lzaW9uCi0gKi8KLQotI2lmIF9GUF9XX1RZUEVfU0laRSA8IDMyCi0jZXJyb3IgIkhlcmUncyBhIG5pY2tlbCBraWQuICBHbyBidXkgeW91cnNlbGYgYSByZWFsIGNvbXB1dGVyLiIKLSNlbmRpZgotCi0jaWYgX0ZQX1dfVFlQRV9TSVpFIDwgNjQKLSNkZWZpbmUgX0ZQX0ZSQUNUQklUU19ECQkoMiAqIF9GUF9XX1RZUEVfU0laRSkKLSNlbHNlCi0jZGVmaW5lIF9GUF9GUkFDVEJJVFNfRAkJX0ZQX1dfVFlQRV9TSVpFCi0jZW5kaWYKLQotI2RlZmluZSBfRlBfRlJBQ0JJVFNfRAkJNTMKLSNkZWZpbmUgX0ZQX0ZSQUNYQklUU19ECQkoX0ZQX0ZSQUNUQklUU19EIC0gX0ZQX0ZSQUNCSVRTX0QpCi0jZGVmaW5lIF9GUF9XRlJBQ0JJVFNfRAkJKF9GUF9XT1JLQklUUyArIF9GUF9GUkFDQklUU19EKQotI2RlZmluZSBfRlBfV0ZSQUNYQklUU19ECShfRlBfRlJBQ1RCSVRTX0QgLSBfRlBfV0ZSQUNCSVRTX0QpCi0jZGVmaW5lIF9GUF9FWFBCSVRTX0QJCTExCi0jZGVmaW5lIF9GUF9FWFBCSUFTX0QJCTEwMjMKLSNkZWZpbmUgX0ZQX0VYUE1BWF9ECQkyMDQ3Ci0KLSNkZWZpbmUgX0ZQX1FOQU5CSVRfRAkJXAotCSgoX0ZQX1dfVFlQRSkxIDw8ICgoX0ZQX0ZSQUNCSVRTX0QtMikgJSBfRlBfV19UWVBFX1NJWkUpKQotI2RlZmluZSBfRlBfSU1QTEJJVF9ECQlcCi0JKChfRlBfV19UWVBFKTEgPDwgKChfRlBfRlJBQ0JJVFNfRC0xKSAlIF9GUF9XX1RZUEVfU0laRSkpCi0jZGVmaW5lIF9GUF9PVkVSRkxPV19ECQlcCi0JKChfRlBfV19UWVBFKTEgPDwgKF9GUF9XRlJBQ0JJVFNfRCAlIF9GUF9XX1RZUEVfU0laRSkpCi0KLSNpZiBfRlBfV19UWVBFX1NJWkUgPCA2NAotCi11bmlvbiBfRlBfVU5JT05fRAotewotICBkb3VibGUgZmx0OwotICBzdHJ1Y3QgewotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICB1bnNpZ25lZCBzaWduICA6IDE7Ci0gICAgdW5zaWduZWQgZXhwICAgOiBfRlBfRVhQQklUU19EOwotICAgIHVuc2lnbmVkIGZyYWMxIDogX0ZQX0ZSQUNCSVRTX0QgLSAoX0ZQX0lNUExCSVRfRCAhPSAwKSAtIF9GUF9XX1RZUEVfU0laRTsKLSAgICB1bnNpZ25lZCBmcmFjMCA6IF9GUF9XX1RZUEVfU0laRTsKLSNlbHNlCi0gICAgdW5zaWduZWQgZnJhYzAgOiBfRlBfV19UWVBFX1NJWkU7Ci0gICAgdW5zaWduZWQgZnJhYzEgOiBfRlBfRlJBQ0JJVFNfRCAtIChfRlBfSU1QTEJJVF9EICE9IDApIC0gX0ZQX1dfVFlQRV9TSVpFOwotICAgIHVuc2lnbmVkIGV4cCAgIDogX0ZQX0VYUEJJVFNfRDsKLSAgICB1bnNpZ25lZCBzaWduICA6IDE7Ci0jZW5kaWYKLSAgfSBiaXRzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKLQotI2RlZmluZSBGUF9ERUNMX0QoWCkJCV9GUF9ERUNMKDIsWCkKLSNkZWZpbmUgRlBfVU5QQUNLX1JBV19EKFgsdmFsKQlfRlBfVU5QQUNLX1JBV18yKEQsWCx2YWwpCi0jZGVmaW5lIEZQX1BBQ0tfUkFXX0QodmFsLFgpCV9GUF9QQUNLX1JBV18yKEQsdmFsLFgpCi0KLSNkZWZpbmUgRlBfVU5QQUNLX0QoWCx2YWwpCQlcCi0gIGRvIHsJCQkJCVwKLSAgICBfRlBfVU5QQUNLX1JBV18yKEQsWCx2YWwpOwkJXAotICAgIF9GUF9VTlBBQ0tfQ0FOT05JQ0FMKEQsMixYKTsJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQX1BBQ0tfRCh2YWwsWCkJCVwKLSAgZG8gewkJCQkJXAotICAgIF9GUF9QQUNLX0NBTk9OSUNBTChELDIsWCk7CQlcCi0gICAgX0ZQX1BBQ0tfUkFXXzIoRCx2YWwsWCk7CQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRlBfTkVHX0QoUixYKQkJX0ZQX05FRyhELDIsUixYKQotI2RlZmluZSBGUF9BRERfRChSLFgsWSkJCV9GUF9BREQoRCwyLFIsWCxZKQotI2RlZmluZSBGUF9TVUJfRChSLFgsWSkJCV9GUF9TVUIoRCwyLFIsWCxZKQotI2RlZmluZSBGUF9NVUxfRChSLFgsWSkJCV9GUF9NVUwoRCwyLFIsWCxZKQotI2RlZmluZSBGUF9ESVZfRChSLFgsWSkJCV9GUF9ESVYoRCwyLFIsWCxZKQotI2RlZmluZSBGUF9TUVJUX0QoUixYKQkJX0ZQX1NRUlQoRCwyLFIsWCkKLQotI2RlZmluZSBGUF9DTVBfRChyLFgsWSx1bikJX0ZQX0NNUChELDIscixYLFksdW4pCi0jZGVmaW5lIEZQX0NNUF9FUV9EKHIsWCxZKQlfRlBfQ01QX0VRKEQsMixyLFgsWSkKLQotI2RlZmluZSBGUF9UT19JTlRfRChyLFgscnN6LHJzZykgIF9GUF9UT19JTlQoRCwyLHIsWCxyc3oscnNnKQotI2RlZmluZSBGUF9GUk9NX0lOVF9EKFgscixycyxydCkgIF9GUF9GUk9NX0lOVChELDIsWCxyLHJzLHJ0KQotCi0jZWxzZQotCi11bmlvbiBfRlBfVU5JT05fRAotewotICBkb3VibGUgZmx0OwotICBzdHJ1Y3QgewotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICB1bnNpZ25lZCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBleHAgIDogX0ZQX0VYUEJJVFNfRDsKLSAgICB1bnNpZ25lZCBsb25nIGZyYWMgOiBfRlBfRlJBQ0JJVFNfRCAtIChfRlBfSU1QTEJJVF9EICE9IDApOwotI2Vsc2UKLSAgICB1bnNpZ25lZCBsb25nIGZyYWMgOiBfRlBfRlJBQ0JJVFNfRCAtIChfRlBfSU1QTEJJVF9EICE9IDApOwotICAgIHVuc2lnbmVkIGV4cCAgOiBfRlBfRVhQQklUU19EOwotICAgIHVuc2lnbmVkIHNpZ24gOiAxOwotI2VuZGlmCi0gIH0gYml0cyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLX07Ci0KLSNkZWZpbmUgRlBfREVDTF9EKFgpCQlfRlBfREVDTCgxLFgpCi0jZGVmaW5lIEZQX1VOUEFDS19SQVdfRChYLHZhbCkJX0ZQX1VOUEFDS19SQVdfMShELFgsdmFsKQotI2RlZmluZSBGUF9QQUNLX1JBV19EKHZhbCxYKQlfRlBfUEFDS19SQVdfMShELHZhbCxYKQotCi0jZGVmaW5lIEZQX1VOUEFDS19EKFgsdmFsKQkJXAotICBkbyB7CQkJCQlcCi0gICAgX0ZQX1VOUEFDS19SQVdfMShELFgsdmFsKTsJCVwKLSAgICBfRlBfVU5QQUNLX0NBTk9OSUNBTChELDEsWCk7CVwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBGUF9QQUNLX0QodmFsLFgpCQlcCi0gIGRvIHsJCQkJCVwKLSAgICBfRlBfUEFDS19DQU5PTklDQUwoRCwxLFgpOwkJXAotICAgIF9GUF9QQUNLX1JBV18xKEQsdmFsLFgpOwkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQX05FR19EKFIsWCkJCV9GUF9ORUcoRCwxLFIsWCkKLSNkZWZpbmUgRlBfQUREX0QoUixYLFkpCQlfRlBfQUREKEQsMSxSLFgsWSkKLSNkZWZpbmUgRlBfU1VCX0QoUixYLFkpCQlfRlBfU1VCKEQsMSxSLFgsWSkKLSNkZWZpbmUgRlBfTVVMX0QoUixYLFkpCQlfRlBfTVVMKEQsMSxSLFgsWSkKLSNkZWZpbmUgRlBfRElWX0QoUixYLFkpCQlfRlBfRElWKEQsMSxSLFgsWSkKLSNkZWZpbmUgRlBfU1FSVF9EKFIsWCkJCV9GUF9TUVJUKEQsMSxSLFgpCi0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBfRlBfTVVMX0QgYW5kIF9GUF9ESVZfRCBzaG91bGQgYmUgY2hvc2VuIGJ5Ci0gICB0aGUgdGFyZ2V0IG1hY2hpbmUuICAqLwotCi0jZGVmaW5lIEZQX0NNUF9EKHIsWCxZLHVuKQlfRlBfQ01QKEQsMSxyLFgsWSx1bikKLSNkZWZpbmUgRlBfQ01QX0VRX0QocixYLFkpCV9GUF9DTVBfRVEoRCwxLHIsWCxZKQotCi0jZGVmaW5lIEZQX1RPX0lOVF9EKHIsWCxyc3oscnNnKSAgX0ZQX1RPX0lOVChELDEscixYLHJzeixyc2cpCi0jZGVmaW5lIEZQX0ZST01fSU5UX0QoWCxyLHJzLHJ0KSAgX0ZQX0ZST01fSU5UKEQsMSxYLHIscnMscnQpCi0KLSNlbmRpZiAvKiBXX1RZUEVfU0laRSA8IDY0ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmFkZC5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZhZGQuYwppbmRleCA3YmVmYmJmLi4wNGQzYjRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmFkZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mYWRkLmMKQEAgLTIsOCArMiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmYWRkKHZvaWQgKmZyRCwgdm9pZCAqZnJBLCB2b2lkICpmckIpCkBAIC0xMSwyOCArMTIsMjggQEAKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChSKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CiAJcHJpbnRrKCJCOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEJfcywgQl9mMSwgQl9mMCwgQl9lLCBCX2MpOwogI2VuZGlmCiAKLQlpZiAoQV9zICE9IEJfcyAmJiBBX2MgPT0gRlBfQ0xTX0lORiAmJiBCX2MgPT0gRlBfQ0xTX0lORikKLQkJcmV0IHw9IEVGTEFHX1ZYSVNJOwotCiAJRlBfQUREX0QoUiwgQSwgQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiRDogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBSX3MsIFJfZjEsIFJfZjAsIFJfZSwgUl9jKTsKICNlbmRpZgogCi0JcmV0dXJuIChyZXQgfCBfX0ZQX1BBQ0tfRChmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRChmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZhZGRzLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmFkZHMuYwppbmRleCAyYjM0NmIzLi41OTMwZjQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmFkZHMuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmFkZHMuYwpAQCAtMiw5ICsyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgotI2luY2x1ZGUgInNpbmdsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zaW5nbGUuaD4KIAogaW50CiBmYWRkcyh2b2lkICpmckQsIHZvaWQgKmZyQSwgdm9pZCAqZnJCKQpAQCAtMTIsMjggKzEzLDI3IEBACiAJRlBfREVDTF9EKEEpOwogCUZQX0RFQ0xfRChCKTsKIAlGUF9ERUNMX0QoUik7Ci0JaW50IHJldCA9IDA7CisJRlBfREVDTF9FWDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChBLCBmckEpOwotCV9fRlBfVU5QQUNLX0QoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEFfcywgQV9mMSwgQV9mMCwgQV9lLCBBX2MpOwogCXByaW50aygiQjogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBCX3MsIEJfZjEsIEJfZjAsIEJfZSwgQl9jKTsKICNlbmRpZgogCi0JaWYgKEFfcyAhPSBCX3MgJiYgQV9jID09IEZQX0NMU19JTkYgJiYgQl9jID09IEZQX0NMU19JTkYpCi0JCXJldCB8PSBFRkxBR19WWElTSTsKLQogCUZQX0FERF9EKFIsIEEsIEIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkQ6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0RTKGZyRCwgUikpOworCV9fRlBfUEFDS19EUyhmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjbXBvLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmNtcG8uYwppbmRleCAzNmQ2ODkwLi5iNWRjNDQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmNtcG8uYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmNtcG8uYwpAQCAtMiwxNCArMiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CiAKIGludAogZmNtcG8odTMyICpjY3IsIGludCBjcmZELCB2b2lkICpmckEsIHZvaWQgKmZyQikKIHsKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9EKEIpOworCUZQX0RFQ0xfRVg7CiAJaW50IGNvZGVbNF0gPSB7ICgxIDw8IDMpLCAoMSA8PCAxKSwgKDEgPDwgMiksICgxIDw8IDApIH07CiAJbG9uZyBjbXA7CiAJaW50IHJldCA9IDA7CkBAIC0xOCw4ICsyMCw4IEBACiAJcHJpbnRrKCIlczogJXAgKCUwOHgpICVkICVwICVwXG4iLCBfX2Z1bmNfXywgY2NyLCAqY2NyLCBjcmZELCBmckEsIGZyQik7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEEsIGZyQSk7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mY21wdS5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjbXB1LmMKaW5kZXggNTNkOTM4OS4uZDRmYjFiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjbXB1LmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjbXB1LmMKQEAgLTIsMTQgKzIsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgogCiBpbnQKIGZjbXB1KHUzMiAqY2NyLCBpbnQgY3JmRCwgdm9pZCAqZnJBLCB2b2lkICpmckIpCiB7CiAJRlBfREVDTF9EKEEpOwogCUZQX0RFQ0xfRChCKTsKKwlGUF9ERUNMX0VYOwogCWludCBjb2RlWzRdID0geyAoMSA8PCAzKSwgKDEgPDwgMSksICgxIDw8IDIpLCAoMSA8PCAwKSB9OwogCWxvbmcgY21wOwogCkBAIC0xNyw4ICsxOSw4IEBACiAJcHJpbnRrKCIlczogJXAgKCUwOHgpICVkICVwICVwXG4iLCBfX2Z1bmNfXywgY2NyLCAqY2NyLCBjcmZELCBmckEsIGZyQik7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEEsIGZyQSk7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mY3Rpdy5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjdGl3LmMKaW5kZXggZmNkN2E5NS4uZjY5NDQ0MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjdGl3LmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjdGl3LmMKQEAgLTIsMTYgKzIsMTggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgogCiBpbnQKIGZjdGl3KHUzMiAqZnJELCB2b2lkICpmckIpCiB7CiAJRlBfREVDTF9EKEIpOworCUZQX0RFQ0xfRVg7CiAJdW5zaWduZWQgaW50IHI7CiAKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAJRlBfVE9fSU5UX0QociwgQiwgMzIsIDEpOwogCWZyRFsxXSA9IHI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mY3Rpd3ouYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mY3Rpd3ouYwppbmRleCAxNTE0ZDU5Li43MWU3ODJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmN0aXd6LmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZjdGl3ei5jCkBAIC0yLDEzICsyLDE1IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmY3Rpd3oodTMyICpmckQsIHZvaWQgKmZyQikKIHsKIAlGUF9ERUNMX0QoQik7CisJRlBfREVDTF9FWDsKIAl1MzIgZnBzY3I7CiAJdW5zaWduZWQgaW50IHI7CiAKQEAgLTE2LDcgKzE4LDcgQEAKIAlfX0ZQVV9GUFNDUiAmPSB+KDMpOwogCV9fRlBVX0ZQU0NSIHw9IEZQX1JORF9aRVJPOwogCi0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCUZQX1RPX0lOVF9EKHIsIEIsIDMyLCAxKTsKIAlmckRbMV0gPSByOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmRpdi5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZkaXYuYwppbmRleCAxOGEyMGZlLi4yZGIxNTA5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmRpdi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mZGl2LmMKQEAgLTIsOCArMiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmZGl2KHZvaWQgKmZyRCwgdm9pZCAqZnJBLCB2b2lkICpmckIpCkBAIC0xMSwxNCArMTIsMTUgQEAKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChSKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CkBAIC00OSw1ICs1MSw3IEBACiAJcHJpbnRrKCJEOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EKGZyRCwgUikpOworCV9fRlBfUEFDS19EKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZmRpdnMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mZGl2cy5jCmluZGV4IDI0ZmVlZDYuLjc5N2Y2YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mZGl2cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mZGl2cy5jCkBAIC0yLDkgKzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCi0jaW5jbHVkZSAic2luZ2xlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NpbmdsZS5oPgogCiBpbnQKIGZkaXZzKHZvaWQgKmZyRCwgdm9pZCAqZnJBLCB2b2lkICpmckIpCkBAIC0xMiwxNCArMTMsMTUgQEAKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChSKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CkBAIC01MSw1ICs1Myw3IEBACiAJcHJpbnRrKCJEOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EUyhmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRFMoZnJELCBSKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbWFkZC5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtYWRkLmMKaW5kZXggZGVkYjQ2NS4uOTI1MzEzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtYWRkLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtYWRkLmMKQEAgLTIsOCArMiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmbWFkZCh2b2lkICpmckQsIHZvaWQgKmZyQSwgdm9pZCAqZnJCLCB2b2lkICpmckMpCkBAIC0xMywxNSArMTQsMTYgQEAKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKEMpOwogCUZQX0RFQ0xfRChUKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIsIGZyQyk7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7Ci0JX19GUF9VTlBBQ0tfRChDLCBmckMpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOworCUZQX1VOUEFDS19EUChDLCBmckMpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CkBAIC00NCw1ICs0Niw3IEBACiAJcHJpbnRrKCJEOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EKGZyRCwgUikpOworCV9fRlBfUEFDS19EKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm1hZGRzLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm1hZGRzLmMKaW5kZXggNmJiYjU2ZC4uYWVhODBlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtYWRkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbWFkZHMuYwpAQCAtMiw5ICsyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgotI2luY2x1ZGUgInNpbmdsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zaW5nbGUuaD4KIAogaW50CiBmbWFkZHModm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQiwgdm9pZCAqZnJDKQpAQCAtMTQsMTUgKzE1LDE2IEBACiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChDKTsKIAlGUF9ERUNMX0QoVCk7CisJRlBfREVDTF9FWDsKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCLCBmckMpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOwotCV9fRlBfVU5QQUNLX0QoQywgZnJDKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQywgZnJDKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEFfcywgQV9mMSwgQV9mMCwgQV9lLCBBX2MpOwpAQCAtNDUsNSArNDcsNyBAQAogCXByaW50aygiRDogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBSX3MsIFJfZjEsIFJfZjAsIFJfZSwgUl9jKTsKICNlbmRpZgogCi0JcmV0dXJuIChyZXQgfCBfX0ZQX1BBQ0tfRFMoZnJELCBSKSk7CisJX19GUF9QQUNLX0RTKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm1zdWIuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXN1Yi5jCmluZGV4IGYzMTFlMmMuLmE2NDRkNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXN1Yi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXN1Yi5jCkBAIC0yLDggKzIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CiAKIGludAogZm1zdWIodm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQiwgdm9pZCAqZnJDKQpAQCAtMTMsMTUgKzE0LDE2IEBACiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChDKTsKIAlGUF9ERUNMX0QoVCk7CisJRlBfREVDTF9FWDsKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCLCBmckMpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOwotCV9fRlBfVU5QQUNLX0QoQywgZnJDKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQywgZnJDKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEFfcywgQV9mMSwgQV9mMCwgQV9lLCBBX2MpOwpAQCAtNDcsNSArNDksNyBAQAogCXByaW50aygiRDogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBSX3MsIFJfZjEsIFJfZjAsIFJfZSwgUl9jKTsKICNlbmRpZgogCi0JcmV0dXJuIChyZXQgfCBfX0ZQX1BBQ0tfRChmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRChmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2Ztc3Vicy5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2Ztc3Vicy5jCmluZGV4IDgxYTcxNmQuLjJmZGVlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXN1YnMuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm1zdWJzLmMKQEAgLTIsOSArMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKLSNpbmNsdWRlICJzaW5nbGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CiAKIGludAogZm1zdWJzKHZvaWQgKmZyRCwgdm9pZCAqZnJBLCB2b2lkICpmckIsIHZvaWQgKmZyQykKQEAgLTE0LDE1ICsxNSwxNiBAQAogCUZQX0RFQ0xfRChCKTsKIAlGUF9ERUNMX0QoQyk7CiAJRlBfREVDTF9EKFQpOworCUZQX0RFQ0xfRVg7CiAJaW50IHJldCA9IDA7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6ICVwICVwICVwICVwXG4iLCBfX2Z1bmNfXywgZnJELCBmckEsIGZyQiwgZnJDKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChBLCBmckEpOwotCV9fRlBfVU5QQUNLX0QoQiwgZnJCKTsKLQlfX0ZQX1VOUEFDS19EKEMsIGZyQyk7CisJRlBfVU5QQUNLX0RQKEEsIGZyQSk7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEMsIGZyQyk7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKQEAgLTQ4LDUgKzUwLDcgQEAKIAlwcmludGsoIkQ6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0RTKGZyRCwgUikpOworCV9fRlBfUEFDS19EUyhmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtdWwuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXVsLmMKaW5kZXggMmYzZDMyNy4uMzkxZmQxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZtdWwuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm11bC5jCkBAIC0yLDggKzIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CiAKIGludAogZm11bCh2b2lkICpmckQsIHZvaWQgKmZyQSwgdm9pZCAqZnJCKQpAQCAtMTEsMTQgKzEyLDE1IEBACiAJRlBfREVDTF9EKEEpOwogCUZQX0RFQ0xfRChCKTsKIAlGUF9ERUNMX0QoUik7CisJRlBfREVDTF9FWDsKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChBLCBmckEpOwotCV9fRlBfVU5QQUNLX0QoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZCkgWyUwOGx4LiUwOGx4ICVseF1cbiIsCkBAIC0zOCw1ICs0MCw3IEBACiAJICAgICAgIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MsIFJfZjEsIFJfZjAsIFJfZSArIDEwMjMpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EKGZyRCwgUikpOworCV9fRlBfUEFDS19EKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm11bHMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXVscy5jCmluZGV4IDk2MmI1ODguLjJkM2VjNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXVscy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbXVscy5jCkBAIC0yLDkgKzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCi0jaW5jbHVkZSAic2luZ2xlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NpbmdsZS5oPgogCiBpbnQKIGZtdWxzKHZvaWQgKmZyRCwgdm9pZCAqZnJBLCB2b2lkICpmckIpCkBAIC0xMiwxNCArMTMsMTUgQEAKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChSKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKSBbJTA4bHguJTA4bHggJWx4XVxuIiwKQEAgLTM5LDUgKzQxLDcgQEAKIAkgICAgICAgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYywgUl9mMSwgUl9mMCwgUl9lICsgMTAyMyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0RTKGZyRCwgUikpOworCV9fRlBfUEFDS19EUyhmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubWFkZC5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubWFkZC5jCmluZGV4IDhjZjc4MjcuLjI0OTdiODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbm1hZGQuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tYWRkLmMKQEAgLTIsOCArMiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmbm1hZGQodm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQiwgdm9pZCAqZnJDKQpAQCAtMTMsMTUgKzE0LDE2IEBACiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChDKTsKIAlGUF9ERUNMX0QoVCk7CisJRlBfREVDTF9FWDsKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCLCBmckMpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOwotCV9fRlBfVU5QQUNLX0QoQywgZnJDKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQywgZnJDKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEFfcywgQV9mMSwgQV9mMCwgQV9lLCBBX2MpOwpAQCAtNDcsNSArNDksNyBAQAogCXByaW50aygiRDogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBSX3MsIFJfZjEsIFJfZjAsIFJfZSwgUl9jKTsKICNlbmRpZgogCi0JcmV0dXJuIChyZXQgfCBfX0ZQX1BBQ0tfRChmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRChmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubWFkZHMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbm1hZGRzLmMKaW5kZXggZjFjNGYwZi4uZWU5ZDcxZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubWFkZHMuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tYWRkcy5jCkBAIC0yLDkgKzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCi0jaW5jbHVkZSAic2luZ2xlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NpbmdsZS5oPgogCiBpbnQKIGZubWFkZHModm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQiwgdm9pZCAqZnJDKQpAQCAtMTQsMTUgKzE1LDE2IEBACiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChDKTsKIAlGUF9ERUNMX0QoVCk7CisJRlBfREVDTF9FWDsKIAlpbnQgcmV0ID0gMDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogJXAgJXAgJXAgJXBcbiIsIF9fZnVuY19fLCBmckQsIGZyQSwgZnJCLCBmckMpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyQSk7Ci0JX19GUF9VTlBBQ0tfRChCLCBmckIpOwotCV9fRlBfVU5QQUNLX0QoQywgZnJDKTsKKwlGUF9VTlBBQ0tfRFAoQSwgZnJBKTsKKwlGUF9VTlBBQ0tfRFAoQiwgZnJCKTsKKwlGUF9VTlBBQ0tfRFAoQywgZnJDKTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJBOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIEFfcywgQV9mMSwgQV9mMCwgQV9lLCBBX2MpOwpAQCAtNDgsNSArNTAsNyBAQAogCXByaW50aygiRDogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBSX3MsIFJfZjEsIFJfZjAsIFJfZSwgUl9jKTsKICNlbmRpZgogCi0JcmV0dXJuIChyZXQgfCBfX0ZQX1BBQ0tfRFMoZnJELCBSKSk7CisJX19GUF9QQUNLX0RTKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tc3ViLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tc3ViLmMKaW5kZXggOTg5NDRlNi4uMzg4NWE3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubXN1Yi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbm1zdWIuYwpAQCAtMiw4ICsyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgogCiBpbnQKIGZubXN1Yih2b2lkICpmckQsIHZvaWQgKmZyQSwgdm9pZCAqZnJCLCB2b2lkICpmckMpCkBAIC0xMywxNSArMTQsMTYgQEAKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKEMpOwogCUZQX0RFQ0xfRChUKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIsIGZyQyk7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7Ci0JX19GUF9VTlBBQ0tfRChDLCBmckMpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOworCUZQX1VOUEFDS19EUChDLCBmckMpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CkBAIC01MCw1ICs1Miw3IEBACiAJcHJpbnRrKCJEOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EKGZyRCwgUikpOworCV9fRlBfUEFDS19EKGZyRCwgUik7CisKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tc3Vicy5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZubXN1YnMuYwppbmRleCBiMjBmNGViLi5mODM1ZGZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZm5tc3Vicy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mbm1zdWJzLmMKQEAgLTIsOSArMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKLSNpbmNsdWRlICJzaW5nbGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CiAKIGludAogZm5tc3Vicyh2b2lkICpmckQsIHZvaWQgKmZyQSwgdm9pZCAqZnJCLCB2b2lkICpmckMpCkBAIC0xNCwxNSArMTUsMTYgQEAKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKEMpOwogCUZQX0RFQ0xfRChUKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJBLCBmckIsIGZyQyk7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7Ci0JX19GUF9VTlBBQ0tfRChDLCBmckMpOworCUZQX1VOUEFDS19EUChBLCBmckEpOworCUZQX1VOUEFDS19EUChCLCBmckIpOworCUZQX1VOUEFDS19EUChDLCBmckMpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CkBAIC01MSw1ICs1Myw3IEBACiAJcHJpbnRrKCJEOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EUyhmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRFMoZnJELCBSKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mcnNwLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZnJzcC5jCmluZGV4IDcyNGNjYmMuLmRkY2MxNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mcnNwLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2Zyc3AuYwpAQCAtMiwyNCArMiwyOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKLSNpbmNsdWRlICJzaW5nbGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CiAKIGludAogZnJzcCh2b2lkICpmckQsIHZvaWQgKmZyQikKIHsKIAlGUF9ERUNMX0QoQik7CisJRlBfREVDTF9FWDsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogRCAlcCwgQiAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJCKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkI6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQl9zLCBCX2YxLCBCX2YwLCBCX2UsIEJfYyk7CiAjZW5kaWYKIAotCXJldHVybiBfX0ZQX1BBQ0tfRFMoZnJELCBCKTsKKwlfX0ZQX1BBQ0tfRFMoZnJELCBCKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc2VsLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZnNlbC5jCmluZGV4IGVjYjVmMjguLjFiMGMxNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc2VsLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzZWwuYwpAQCAtMiwxOSArMiwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CiAKIGludAogZnNlbCh1MzIgKmZyRCwgdm9pZCAqZnJBLCB1MzIgKmZyQiwgdTMyICpmckMpCiB7CiAJRlBfREVDTF9EKEEpOworCUZQX0RFQ0xfRVg7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6ICVwICVwICVwICVwXG4iLCBfX2Z1bmNfXywgZnJELCBmckEsIGZyQiwgZnJDKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChBLCBmckEpOworCUZQX1VOUEFDS19EUChBLCBmckEpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkE6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQV9zLCBBX2YxLCBBX2YwLCBBX2UsIEFfYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZnNxcnQuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3FydC5jCmluZGV4IDM4ZWMyYjcuLjNlOTAwNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3FydC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3FydC5jCkBAIC0yLDIxICsyLDIzIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBmc3FydCh2b2lkICpmckQsIHZvaWQgKmZyQikKIHsKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKFIpOworCUZQX0RFQ0xfRVg7CiAJaW50IHJldCA9IDA7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6ICVwICVwICVwICVwXG4iLCBfX2Z1bmNfXywgZnJELCBmckIpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQjogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBCX3MsIEJfZjEsIEJfZjAsIEJfZSwgQl9jKTsKQEAgLTMzLDUgKzM1LDcgQEAKIAlwcmludGsoIlI6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0QoZnJELCBSKSk7CisJX19GUF9QQUNLX0QoZnJELCBSKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3FydHMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3FydHMuYwppbmRleCAzMzUyNjNlLi4yODQzYmU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZnNxcnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzcXJ0cy5jCkBAIC0yLDIyICsyLDI0IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgotI2luY2x1ZGUgInNpbmdsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zaW5nbGUuaD4KIAogaW50CiBmc3FydHModm9pZCAqZnJELCB2b2lkICpmckIpCiB7CiAJRlBfREVDTF9EKEIpOwogCUZQX0RFQ0xfRChSKTsKKwlGUF9ERUNMX0VYOwogCWludCByZXQgPSAwOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlcCAlcCAlcCAlcFxuIiwgX19mdW5jX18sIGZyRCwgZnJCKTsKICNlbmRpZgogCi0JX19GUF9VTlBBQ0tfRChCLCBmckIpOworCUZQX1VOUEFDS19EUChCLCBmckIpOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIkI6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgQl9zLCBCX2YxLCBCX2YwLCBCX2UsIEJfYyk7CkBAIC0zNCw1ICszNiw3IEBACiAJcHJpbnRrKCJSOiAlbGQgJWx1ICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mMSwgUl9mMCwgUl9lLCBSX2MpOwogI2VuZGlmCiAKLQlyZXR1cm4gKHJldCB8IF9fRlBfUEFDS19EUyhmckQsIFIpKTsKKwlfX0ZQX1BBQ0tfRFMoZnJELCBSKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3ViLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvZnN1Yi5jCmluZGV4IDIwOGQyMGYuLjc4YjA5NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3ViLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzdWIuYwpAQCAtMiw4ICsyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgogCiBpbnQKIGZzdWIodm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQikKQEAgLTExLDE0ICsxMiwxNSBAQAogCUZQX0RFQ0xfRChBKTsKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKFIpOworCUZQX0RFQ0xfRVg7CiAJaW50IHJldCA9IDA7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6ICVwICVwICVwXG4iLCBfX2Z1bmNfXywgZnJELCBmckEsIGZyQik7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEEsIGZyQSk7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKQEAgLTM3LDUgKzM5LDcgQEAKIAlwcmludGsoIkQ6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0QoZnJELCBSKSk7CisJX19GUF9QQUNLX0QoZnJELCBSKTsKKworCXJldHVybiBGUF9DVVJfRVhDRVBUSU9OUzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9mc3Vicy5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzdWJzLmMKaW5kZXggMGU2MWI4MC4uZDNiZjkwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzdWJzLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2ZzdWJzLmMKQEAgLTIsOSArMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKLSNpbmNsdWRlICJzaW5nbGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CiAKIGludAogZnN1YnModm9pZCAqZnJELCB2b2lkICpmckEsIHZvaWQgKmZyQikKQEAgLTEyLDE0ICsxMywxNSBAQAogCUZQX0RFQ0xfRChBKTsKIAlGUF9ERUNMX0QoQik7CiAJRlBfREVDTF9EKFIpOworCUZQX0RFQ0xfRVg7CiAJaW50IHJldCA9IDA7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6ICVwICVwICVwXG4iLCBfX2Z1bmNfXywgZnJELCBmckEsIGZyQik7CiAjZW5kaWYKIAotCV9fRlBfVU5QQUNLX0QoQSwgZnJBKTsKLQlfX0ZQX1VOUEFDS19EKEIsIGZyQik7CisJRlBfVU5QQUNLX0RQKEEsIGZyQSk7CisJRlBfVU5QQUNLX0RQKEIsIGZyQik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKQEAgLTM4LDUgKzQwLDcgQEAKIAlwcmludGsoIkQ6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiAocmV0IHwgX19GUF9QQUNLX0RTKGZyRCwgUikpOworCV9fRlBfUEFDS19EUyhmckQsIFIpOworCisJcmV0dXJuIEZQX0NVUl9FWENFUFRJT05TOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L2xmZC5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2xmZC5jCmluZGV4IDZlYzkwYjUuLjc5YWM3NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9sZmQuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbGZkLmMKQEAgLTIsOCArMiw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic2ZwLW1hY2hpbmUuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogaW50CiBsZmQodm9pZCAqZnJELCB2b2lkICplYSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9sZnMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9sZnMuYwppbmRleCA2ZjE4ZWJlLi40MzRlZDI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbGZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L2xmcy5jCkBAIC0yLDE1ICsyLDE3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgotI2luY2x1ZGUgImRvdWJsZS5oIgotI2luY2x1ZGUgInNpbmdsZS5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zaW5nbGUuaD4KIAogaW50CiBsZnModm9pZCAqZnJELCB2b2lkICplYSkKIHsKIAlGUF9ERUNMX0QoUik7CiAJRlBfREVDTF9TKEEpOworCUZQX0RFQ0xfRVg7CiAJZmxvYXQgZjsKIAogI2lmZGVmIERFQlVHCkBAIC0yMCw3ICsyMiw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZmLCBlYSwgc2l6ZW9mKGZsb2F0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JX19GUF9VTlBBQ0tfUyhBLCAmZik7CisJRlBfVU5QQUNLX1MoQSwgZik7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbGQgKCVsZCkgWyUwOGx4XVxuIiwgQV9zLCBBX2YsIEFfZSwgQV9jLApAQCAtMzMsNSArMzUsMTIgQEAKIAlwcmludGsoIlI6ICVsZCAlbHUgJWx1ICVsZCAoJWxkKVxuIiwgUl9zLCBSX2YxLCBSX2YwLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCXJldHVybiBfX0ZQX1BBQ0tfRChmckQsIFIpOworCWlmIChSX2MgPT0gRlBfQ0xTX05BTikgeworCQlSX2UgPSBfRlBfRVhQTUFYX0Q7CisJCV9GUF9QQUNLX1JBV18yX1AoRCwgZnJELCBSKTsKKwl9IGVsc2UgeworCQlfX0ZQX1BBQ0tfRChmckQsIFIpOworCX0KKworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L21hdGguYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tYXRoLmMKaW5kZXggMjllNTQ1ZS4uMTY0ZDU1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L21hdGguYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWF0aC5jCkBAIC04LDggKzgsOCBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogCi0jaW5jbHVkZSAic2ZwLW1hY2hpbmUuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KIAogI2RlZmluZSBGTE9BVEZVTkMoeCkJZXh0ZXJuIGludCB4KHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHZvaWQgKikKIApAQCAtMTY4LDYgKzE2OCw4IEBACiAJCQlmcHNjciB8PSBGUFNDUl9aWDsKIAkJaWYgKGVmbGFnICYgRUZMQUdfSU5FWEFDVCkKIAkJCWZwc2NyIHw9IEZQU0NSX1hYOworCQlpZiAoZWZsYWcgJiBFRkxBR19JTlZBTElEKQorCQkJZnBzY3IgfD0gRlBTQ1JfVlg7CiAJCWlmIChlZmxhZyAmIEVGTEFHX1ZYU05BTikKIAkJCWZwc2NyIHw9IEZQU0NSX1ZYU05BTjsKIAkJaWYgKGVmbGFnICYgRUZMQUdfVlhJU0kpCkBAIC0xODgsNyArMTkwLDcgQEAKIAkJCWZwc2NyIHw9IEZQU0NSX1ZYQ1ZJOwogCX0KIAotCWZwc2NyICY9IH4oRlBTQ1JfVlgpOworLy8JZnBzY3IgJj0gfihGUFNDUl9WWCk7CiAJaWYgKGZwc2NyICYgKEZQU0NSX1ZYU05BTiB8IEZQU0NSX1ZYSVNJIHwgRlBTQ1JfVlhJREkgfAogCQkgICAgIEZQU0NSX1ZYWkRaIHwgRlBTQ1JfVlhJTVogfCBGUFNDUl9WWFZDIHwKIAkJICAgICBGUFNDUl9WWFNPRlQgfCBGUFNDUl9WWFNRUlQgfCBGUFNDUl9WWENWSSkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWNyZnMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tY3Jmcy5jCmluZGV4IDQxYmEyNDcuLmU5NDhkNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tY3Jmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tY3Jmcy5jCkBAIC0yLDcgKzIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CiAKIGludAogbWNyZnModTMyICpjY3IsIHUzMiBjcmZELCB1MzIgY3JmUykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tZmZzLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWZmcy5jCmluZGV4IGIwZTIxMDYuLjU1MjZjZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tZmZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L21mZnMuYwpAQCAtMiw3ICsyLDggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgogCiBpbnQKIG1mZnModTMyICpmckQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2IwLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2IwLmMKaW5kZXggZDMwNjIzNS4uYmM5ODU1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L210ZnNiMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tdGZzYjAuYwpAQCAtMiw3ICsyLDggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgogCiBpbnQKIG10ZnNiMChpbnQgY3JiRCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tdGZzYjEuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tdGZzYjEuYwppbmRleCAyZTk0ODcwLi5mZTZlZDVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2IxLmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L210ZnNiMS5jCkBAIC0yLDcgKzIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CiAKIGludAogbXRmc2IxKGludCBjcmJEKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L210ZnNmLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2YuYwppbmRleCA0ODAxNGQ4Li5kYmNlOTJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2YuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2YuYwpAQCAtMiwxMiArMiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKKyNpbmNsdWRlIDxhc20vc2ZwLW1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CiAKIGludAogbXRmc2YodW5zaWduZWQgaW50IEZNLCB1MzIgKmZyQikKIHsKIAl1MzIgbWFzazsKKwl1MzIgZnBzY3I7CiAKIAlpZiAoRk0gPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC0zNyw2ICszOSwyMiBAQAogCV9fRlBVX0ZQU0NSICY9IH4obWFzayk7CiAJX19GUFVfRlBTQ1IgfD0gKGZyQlsxXSAmIG1hc2spOwogCisJX19GUFVfRlBTQ1IgJj0gfihGUFNDUl9WWCk7CisJaWYgKF9fRlBVX0ZQU0NSICYgKEZQU0NSX1ZYU05BTiB8IEZQU0NSX1ZYSVNJIHwgRlBTQ1JfVlhJREkgfAorCQkgICAgIEZQU0NSX1ZYWkRaIHwgRlBTQ1JfVlhJTVogfCBGUFNDUl9WWFZDIHwKKwkJICAgICBGUFNDUl9WWFNPRlQgfCBGUFNDUl9WWFNRUlQgfCBGUFNDUl9WWENWSSkpCisJCV9fRlBVX0ZQU0NSIHw9IEZQU0NSX1ZYOworCisJZnBzY3IgPSBfX0ZQVV9GUFNDUjsKKwlmcHNjciAmPSB+KEZQU0NSX0ZFWCk7CisJaWYgKCgoZnBzY3IgJiBGUFNDUl9WWCkgJiYgKGZwc2NyICYgRlBTQ1JfVkUpKSB8fAorCSAgICAoKGZwc2NyICYgRlBTQ1JfT1gpICYmIChmcHNjciAmIEZQU0NSX09FKSkgfHwKKwkgICAgKChmcHNjciAmIEZQU0NSX1VYKSAmJiAoZnBzY3IgJiBGUFNDUl9VRSkpIHx8CisJICAgICgoZnBzY3IgJiBGUFNDUl9aWCkgJiYgKGZwc2NyICYgRlBTQ1JfWkUpKSB8fAorCSAgICAoKGZwc2NyICYgRlBTQ1JfWFgpICYmIChmcHNjciAmIEZQU0NSX1hFKSkpCisJCWZwc2NyIHw9IEZQU0NSX0ZFWDsKKwlfX0ZQVV9GUFNDUiA9IGZwc2NyOworCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiAlMDJ4ICVwOiAlMDhseFxuIiwgX19mdW5jX18sIEZNLCBmckIsIF9fRlBVX0ZQU0NSKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L210ZnNmaS5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L210ZnNmaS5jCmluZGV4IDAzMWUyMDAuLmZkMmFjYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9tdGZzZmkuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbXRmc2ZpLmMKQEAgLTIsNyArMiw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAic29mdC1mcC5oIgorI2luY2x1ZGUgPGFzbS9zZnAtbWFjaGluZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KIAogaW50CiBtdGZzZmkodW5zaWduZWQgaW50IGNyZkQsIHVuc2lnbmVkIGludCBJTU0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvb3AtMS5oIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L29wLTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyZmE5NS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvb3AtMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qCi0gKiBCYXNpYyBvbmUtd29yZCBmcmFjdGlvbiBkZWNsYXJhdGlvbiBhbmQgbWFuaXB1bGF0aW9uLgotICovCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfREVDTF8xKFgpCV9GUF9XX1RZUEUgWCMjX2YKLSNkZWZpbmUgX0ZQX0ZSQUNfQ09QWV8xKEQsUykJKEQjI19mID0gUyMjX2YpCi0jZGVmaW5lIF9GUF9GUkFDX1NFVF8xKFgsSSkJKFgjI19mID0gSSkKLSNkZWZpbmUgX0ZQX0ZSQUNfSElHSF8xKFgpCShYIyNfZikKLSNkZWZpbmUgX0ZQX0ZSQUNfTE9XXzEoWCkJKFgjI19mKQotI2RlZmluZSBfRlBfRlJBQ19XT1JEXzEoWCx3KQkoWCMjX2YpCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfQURESV8xKFgsSSkJKFgjI19mICs9IEkpCi0jZGVmaW5lIF9GUF9GUkFDX1NMTF8xKFgsTikJCQlcCi0gIGRvIHsJCQkJCQlcCi0gICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKE4pICYmIChOKSA9PSAxKQlcCi0gICAgICBYIyNfZiArPSBYIyNfZjsJCQkJXAotICAgIGVsc2UJCQkJCVwKLSAgICAgIFgjI19mIDw8PSAoTik7CQkJCVwKLSAgfSB3aGlsZSAoMCkKLSNkZWZpbmUgX0ZQX0ZSQUNfU1JMXzEoWCxOKQkoWCMjX2YgPj49IE4pCi0KLS8qIFJpZ2h0IHNoaWZ0IHdpdGggc3RpY2t5LWxzYi4gICovCi0jZGVmaW5lIF9GUF9GUkFDX1NSU18xKFgsTixzeikJX19GUF9GUkFDX1NSU18xKFgjI19mLCBOLCBzeikKLQotI2RlZmluZSBfX0ZQX0ZSQUNfU1JTXzEoWCxOLHN6KQkJCQkJCVwKLSAgIChYID0gKFggPj4gKE4pIHwgKF9fYnVpbHRpbl9jb25zdGFudF9wKE4pICYmIChOKSA9PSAxCQlcCi0JCSAgICAgPyBYICYgMSA6IChYIDw8IChfRlBfV19UWVBFX1NJWkUgLSAoTikpKSAhPSAwKSkpCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfQUREXzEoUixYLFkpCShSIyNfZiA9IFgjI19mICsgWSMjX2YpCi0jZGVmaW5lIF9GUF9GUkFDX1NVQl8xKFIsWCxZKQkoUiMjX2YgPSBYIyNfZiAtIFkjI19mKQotI2RlZmluZSBfRlBfRlJBQ19DTFpfMSh6LCBYKQlfX0ZQX0NMWih6LCBYIyNfZikKLQotLyogUHJlZGljYXRlcyAqLwotI2RlZmluZSBfRlBfRlJBQ19ORUdQXzEoWCkJKChfRlBfV1NfVFlQRSlYIyNfZiA8IDApCi0jZGVmaW5lIF9GUF9GUkFDX1pFUk9QXzEoWCkJKFgjI19mID09IDApCi0jZGVmaW5lIF9GUF9GUkFDX09WRVJQXzEoZnMsWCkJKFgjI19mICYgX0ZQX09WRVJGTE9XXyMjZnMpCi0jZGVmaW5lIF9GUF9GUkFDX0VRXzEoWCwgWSkJKFgjI19mID09IFkjI19mKQotI2RlZmluZSBfRlBfRlJBQ19HRV8xKFgsIFkpCShYIyNfZiA+PSBZIyNfZikKLSNkZWZpbmUgX0ZQX0ZSQUNfR1RfMShYLCBZKQkoWCMjX2YgPiBZIyNfZikKLQotI2RlZmluZSBfRlBfWkVST0ZSQUNfMQkJMAotI2RlZmluZSBfRlBfTUlORlJBQ18xCQkxCi0KLS8qCi0gKiBVbnBhY2sgdGhlIHJhdyBiaXRzIG9mIGEgbmF0aXZlIGZwIHZhbHVlLiAgRG8gbm90IGNsYXNzaWZ5IG9yCi0gKiBub3JtYWxpemUgdGhlIGRhdGEuCi0gKi8KLQotI2RlZmluZSBfRlBfVU5QQUNLX1JBV18xKGZzLCBYLCB2YWwpCQkJCVwKLSAgZG8gewkJCQkJCQkJXAotICAgIHVuaW9uIF9GUF9VTklPTl8jI2ZzIF9mbG87IF9mbG8uZmx0ID0gKHZhbCk7CQlcCi0JCQkJCQkJCVwKLSAgICBYIyNfZiA9IF9mbG8uYml0cy5mcmFjOwkJCQkJXAotICAgIFgjI19lID0gX2Zsby5iaXRzLmV4cDsJCQkJCVwKLSAgICBYIyNfcyA9IF9mbG8uYml0cy5zaWduOwkJCQkJXAotICB9IHdoaWxlICgwKQotCi0KLS8qCi0gKiBSZXBhY2sgdGhlIHJhdyBiaXRzIG9mIGEgbmF0aXZlIGZwIHZhbHVlLgotICovCi0KLSNkZWZpbmUgX0ZQX1BBQ0tfUkFXXzEoZnMsIHZhbCwgWCkJCQkJXAotICBkbyB7CQkJCQkJCQlcCi0gICAgdW5pb24gX0ZQX1VOSU9OXyMjZnMgX2ZsbzsJCQkJCVwKLQkJCQkJCQkJXAotICAgIF9mbG8uYml0cy5mcmFjID0gWCMjX2Y7CQkJCQlcCi0gICAgX2Zsby5iaXRzLmV4cCAgPSBYIyNfZTsJCQkJCVwKLSAgICBfZmxvLmJpdHMuc2lnbiA9IFgjI19zOwkJCQkJXAotCQkJCQkJCQlcCi0gICAgKHZhbCkgPSBfZmxvLmZsdDsJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIE11bHRpcGxpY2F0aW9uIGFsZ29yaXRobXM6Ci0gKi8KLQotLyogQmFzaWMuICBBc3N1bWluZyB0aGUgaG9zdCB3b3JkIHNpemUgaXMgPj0gMipGUkFDQklUUywgd2UgY2FuIGRvIHRoZQotICAgbXVsdGlwbGljYXRpb24gaW1tZWRpYXRlbHkuICAqLwotCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF8xX2ltbShmcywgUiwgWCwgWSkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBSIyNfZiA9IFgjI19mICogWSMjX2Y7CQkJCQkJXAotICAgIC8qIE5vcm1hbGl6ZSBzaW5jZSB3ZSBrbm93IHdoZXJlIHRoZSBtc2Igb2YgdGhlIG11bHRpcGxpY2FuZHMJXAotICAgICAgIHdlcmUgKGJpdCBCKSwgd2Uga25vdyB0aGF0IHRoZSBtc2Igb2YgdGhlIG9mIHRoZSBwcm9kdWN0IGlzCVwKLSAgICAgICBhdCBlaXRoZXIgMkIgb3IgMkItMS4gICovCQkJCQlcCi0gICAgX0ZQX0ZSQUNfU1JTXzEoUiwgX0ZQX1dGUkFDQklUU18jI2ZzLTEsIDIqX0ZQX1dGUkFDQklUU18jI2ZzKTsJXAotICB9IHdoaWxlICgwKQotCi0vKiBHaXZlbiBhIDFXICogMVcgPT4gMlcgcHJpbWl0aXZlLCBkbyB0aGUgZXh0ZW5kZWQgbXVsdGlwbGljYXRpb24uICAqLwotCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF8xX3dpZGUoZnMsIFIsIFgsIFksIGRvaXQpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF9aX2YwLCBfWl9mMTsJCQkJCQlcCi0gICAgZG9pdChfWl9mMSwgX1pfZjAsIFgjI19mLCBZIyNfZik7CQkJCQlcCi0gICAgLyogTm9ybWFsaXplIHNpbmNlIHdlIGtub3cgd2hlcmUgdGhlIG1zYiBvZiB0aGUgbXVsdGlwbGljYW5kcwlcCi0gICAgICAgd2VyZSAoYml0IEIpLCB3ZSBrbm93IHRoYXQgdGhlIG1zYiBvZiB0aGUgb2YgdGhlIHByb2R1Y3QgaXMJXAotICAgICAgIGF0IGVpdGhlciAyQiBvciAyQi0xLiAgKi8JCQkJCVwKLSAgICBfRlBfRlJBQ19TUlNfMihfWiwgX0ZQX1dGUkFDQklUU18jI2ZzLTEsIDIqX0ZQX1dGUkFDQklUU18jI2ZzKTsJXAotICAgIFIjI19mID0gX1pfZjA7CQkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotLyogRmluYWxseSwgYSBzaW1wbGUgd2lkZW5pbmcgbXVsdGlwbHkgYWxnb3JpdGhtLiAgV2hhdCBmdW4hICAqLwotCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF8xX2hhcmQoZnMsIFIsIFgsIFkpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF94aCwgX3hsLCBfeWgsIF95bCwgX3pfZjAsIF96X2YxLCBfYV9mMCwgX2FfZjE7CQlcCi0JCQkJCQkJCQlcCi0gICAgLyogc3BsaXQgdGhlIHdvcmRzIGluIGhhbGYgKi8JCQkJCVwKLSAgICBfeGggPSBYIyNfZiA+PiAoX0ZQX1dfVFlQRV9TSVpFLzIpOwkJCQkJXAotICAgIF94bCA9IFgjI19mICYgKCgoX0ZQX1dfVFlQRSkxIDw8IChfRlBfV19UWVBFX1NJWkUvMikpIC0gMSk7CQlcCi0gICAgX3loID0gWSMjX2YgPj4gKF9GUF9XX1RZUEVfU0laRS8yKTsJCQkJCVwKLSAgICBfeWwgPSBZIyNfZiAmICgoKF9GUF9XX1RZUEUpMSA8PCAoX0ZQX1dfVFlQRV9TSVpFLzIpKSAtIDEpOwkJXAotCQkJCQkJCQkJXAotICAgIC8qIG11bHRpcGx5IHRoZSBwaWVjZXMgKi8JCQkJCQlcCi0gICAgX3pfZjAgPSBfeGwgKiBfeWw7CQkJCQkJCVwKLSAgICBfYV9mMCA9IF94aCAqIF95bDsJCQkJCQkJXAotICAgIF9hX2YxID0gX3hsICogX3loOwkJCQkJCQlcCi0gICAgX3pfZjEgPSBfeGggKiBfeWg7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAvKiByZWFzc2VtYmxlIGludG8gdHdvIGZ1bGwgd29yZHMgKi8JCQkJXAotICAgIGlmICgoX2FfZjAgKz0gX2FfZjEpIDwgX2FfZjEpCQkJCQlcCi0gICAgICBfel9mMSArPSAoX0ZQX1dfVFlQRSkxIDw8IChfRlBfV19UWVBFX1NJWkUvMik7CQkJXAotICAgIF9hX2YxID0gX2FfZjAgPj4gKF9GUF9XX1RZUEVfU0laRS8yKTsJCQkJXAotICAgIF9hX2YwID0gX2FfZjAgPDwgKF9GUF9XX1RZUEVfU0laRS8yKTsJCQkJXAotICAgIF9GUF9GUkFDX0FERF8yKF96LCBfeiwgX2EpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAvKiBub3JtYWxpemUgKi8JCQkJCQkJXAotICAgIF9GUF9GUkFDX1NSU18yKF96LCBfRlBfV0ZSQUNCSVRTXyMjZnMgLSAxLCAyKl9GUF9XRlJBQ0JJVFNfIyNmcyk7CVwKLSAgICBSIyNfZiA9IF96X2YwOwkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIERpdmlzaW9uIGFsZ29yaXRobXM6Ci0gKi8KLQotLyogQmFzaWMuICBBc3N1bWluZyB0aGUgaG9zdCB3b3JkIHNpemUgaXMgPj0gMipGUkFDQklUUywgd2UgY2FuIGRvIHRoZQotICAgZGl2aXNpb24gaW1tZWRpYXRlbHkuICBHaXZlIHRoaXMgbWFjcm8gZWl0aGVyIF9GUF9ESVZfSEVMUF9pbW0gZm9yCi0gICBDIHByaW1pdGl2ZXMgb3IgX0ZQX0RJVl9IRUxQX2xkaXYgZm9yIHRoZSBJU08gZnVuY3Rpb24uICBXaGljaCB5b3UKLSAgIGNob29zZSB3aWxsIGRlcGVuZCBvbiB3aGF0IHRoZSBjb21waWxlciBkb2VzIHdpdGggZGl2cmVtNC4gICovCi0KLSNkZWZpbmUgX0ZQX0RJVl9NRUFUXzFfaW1tKGZzLCBSLCBYLCBZLCBkb2l0KQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF9xLCBfcjsJCQkJCVwKLSAgICBYIyNfZiA8PD0gKFgjI19mIDwgWSMjX2YJCQkJXAotCSAgICAgICA/IFIjI19lLS0sIF9GUF9XRlJBQ0JJVFNfIyNmcwkJXAotCSAgICAgICA6IF9GUF9XRlJBQ0JJVFNfIyNmcyAtIDEpOwkJXAotICAgIGRvaXQoX3EsIF9yLCBYIyNfZiwgWSMjX2YpOwkJCQlcCi0gICAgUiMjX2YgPSBfcSB8IChfciAhPSAwKTsJCQkJXAotICB9IHdoaWxlICgwKQotCi0vKiBHQ0MncyBsb25nbG9uZy5oIGRlZmluZXMgYSAyVyAvIDFXID0+ICgxVywxVykgcHJpbWl0aXZlIHVkaXZfcXJubmQKLSAgIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiB0aGlzIHNpdHVhdGlvbi4gIFRoaXMgZmlyc3QgaXMgZm9yIGEgcHJpbWl0aXZlCi0gICB0aGF0IHJlcXVpcmVzIG5vcm1hbGl6YXRpb24sIHRoZSBzZWNvbmQgZm9yIG9uZSB0aGF0IGRvZXMgbm90LiAgTG9vawotICAgZm9yIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiB0byB0ZWxsIHdoaWNoIHlvdXIgbWFjaGluZSBuZWVkcy4gICovCi0KLSNkZWZpbmUgX0ZQX0RJVl9NRUFUXzFfdWRpdl9ub3JtKGZzLCBSLCBYLCBZKQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgX0ZQX1dfVFlQRSBfbmgsIF9ubCwgX3EsIF9yOwkJCQkJXAotCQkJCQkJCQkJXAotICAgIC8qIE5vcm1hbGl6ZSBZIC0tIGkuZS4gbWFrZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0LiAgKi8JXAotICAgIFkjI19mIDw8PSBfRlBfV0ZSQUNYQklUU18jI2ZzIC0gMTsJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAvKiBTaGlmdCBYIG9wIGNvcnJlc3BvbmRpbmdseSBoaWdoLCB0aGF0IGlzLCB1cCBvbmUgZnVsbCB3b3JkLiAgKi8JXAotICAgIGlmIChYIyNfZiA8PSBZIyNfZikJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlfbmwgPSAwOwkJCQkJCQlcCi0JX25oID0gWCMjX2Y7CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlSIyNfZSsrOwkJCQkJCQlcCi0JX25sID0gWCMjX2YgPDwgKF9GUF9XX1RZUEVfU0laRS0xKTsJCQkJXAotCV9uaCA9IFgjI19mID4+IDE7CQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICAJCQkJCQkJCQlcCi0gICAgdWRpdl9xcm5uZChfcSwgX3IsIF9uaCwgX25sLCBZIyNfZik7CQkJCVwKLSAgICBSIyNfZiA9IF9xIHwgKF9yICE9IDApOwkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfRlBfRElWX01FQVRfMV91ZGl2KGZzLCBSLCBYLCBZKQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF9uaCwgX25sLCBfcSwgX3I7CQkJXAotICAgIGlmIChYIyNfZiA8IFkjI19mKQkJCQkJXAotICAgICAgewkJCQkJCQlcCi0JUiMjX2UtLTsJCQkJCVwKLQlfbmwgPSBYIyNfZiA8PCBfRlBfV0ZSQUNCSVRTXyMjZnM7CQlcCi0JX25oID0gWCMjX2YgPj4gX0ZQX1dGUkFDWEJJVFNfIyNmczsJCVwKLSAgICAgIH0JCQkJCQkJXAotICAgIGVsc2UJCQkJCQlcCi0gICAgICB7CQkJCQkJCVwKLQlfbmwgPSBYIyNfZiA8PCAoX0ZQX1dGUkFDQklUU18jI2ZzIC0gMSk7CVwKLQlfbmggPSBYIyNfZiA+PiAoX0ZQX1dGUkFDWEJJVFNfIyNmcyArIDEpOwlcCi0gICAgICB9CQkJCQkJCVwKLSAgICB1ZGl2X3Fybm5kKF9xLCBfciwgX25oLCBfbmwsIFkjI19mKTsJCVwKLSAgICBSIyNfZiA9IF9xIHwgKF9yICE9IDApOwkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIFNxdWFyZSByb290IGFsZ29yaXRobXM6Ci0gKiBXZSBoYXZlIGp1c3Qgb25lIHJpZ2h0IG5vdywgbWF5YmUgTmV3dG9uIGFwcHJveGltYXRpb24KLSAqIHNob3VsZCBiZSBhZGRlZCBmb3IgdGhvc2UgbWFjaGluZXMgd2hlcmUgZGl2aXNpb24gaXMgZmFzdC4KLSAqLwotCi0jZGVmaW5lIF9GUF9TUVJUX01FQVRfMShSLCBTLCBULCBYLCBxKQkJCVwKLSAgZG8gewkJCQkJCQlcCi0gICAgd2hpbGUgKHEpCQkJCQkJXAotICAgICAgewkJCQkJCQlcCi0gICAgICAgIFQjI19mID0gUyMjX2YgKyBxOwkJCQlcCi0gICAgICAgIGlmIChUIyNfZiA8PSBYIyNfZikJCQkJXAotICAgICAgICAgIHsJCQkJCQlcCi0gICAgICAgICAgICBTIyNfZiA9IFQjI19mICsgcTsJCQkJXAotICAgICAgICAgICAgWCMjX2YgLT0gVCMjX2Y7CQkJCVwKLSAgICAgICAgICAgIFIjI19mICs9IHE7CQkJCQlcCi0gICAgICAgICAgfQkJCQkJCVwKLSAgICAgICAgX0ZQX0ZSQUNfU0xMXzEoWCwgMSk7CQkJCVwKLSAgICAgICAgcSA+Pj0gMTsJCQkJCVwKLSAgICAgIH0JCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0vKgotICogQXNzZW1ibHkvZGlzYXNzZW1ibHkgZm9yIGNvbnZlcnRpbmcgdG8vZnJvbSBpbnRlZ3JhbCB0eXBlcy4KLSAqIE5vIHNoaWZ0aW5nIG9yIG92ZXJmbG93IGhhbmRsZWQgaGVyZS4KLSAqLwotCi0jZGVmaW5lIF9GUF9GUkFDX0FTU0VNQkxFXzEociwgWCwgcnNpemUpCShyID0gWCMjX2YpCi0jZGVmaW5lIF9GUF9GUkFDX0RJU0FTU0VNQkxFXzEoWCwgciwgcnNpemUpCShYIyNfZiA9IHIpCi0KLQotLyoKLSAqIENvbnZlcnQgRlAgdmFsdWVzIGJldHdlZW4gd29yZCBzaXplcwotICovCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfQ09OVl8xXzEoZGZzLCBzZnMsIEQsIFMpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBEIyNfZiA9IFMjI19mOwkJCQkJCQlcCi0gICAgaWYgKF9GUF9XRlJBQ0JJVFNfIyNzZnMgPiBfRlBfV0ZSQUNCSVRTXyMjZGZzKQkJCVwKLSAgICAgIF9GUF9GUkFDX1NSU18xKEQsIChfRlBfV0ZSQUNCSVRTXyMjc2ZzLV9GUF9XRlJBQ0JJVFNfIyNkZnMpLAlcCi0JCSAgICAgX0ZQX1dGUkFDQklUU18jI3Nmcyk7CQkJCVwKLSAgICBlbHNlCQkJCQkJCQlcCi0gICAgICBEIyNfZiA8PD0gX0ZQX1dGUkFDQklUU18jI2RmcyAtIF9GUF9XRlJBQ0JJVFNfIyNzZnM7CQlcCi0gIH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvb3AtMi5oIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L29wLTIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2ZjE3Yy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvb3AtMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBCYXNpYyB0d28td29yZCBmcmFjdGlvbiBkZWNsYXJhdGlvbiBhbmQgbWFuaXB1bGF0aW9uLgotICovCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfREVDTF8yKFgpCV9GUF9XX1RZUEUgWCMjX2YwLCBYIyNfZjEKLSNkZWZpbmUgX0ZQX0ZSQUNfQ09QWV8yKEQsUykJKEQjI19mMCA9IFMjI19mMCwgRCMjX2YxID0gUyMjX2YxKQotI2RlZmluZSBfRlBfRlJBQ19TRVRfMihYLEkpCV9fRlBfRlJBQ19TRVRfMihYLCBJKQotI2RlZmluZSBfRlBfRlJBQ19ISUdIXzIoWCkJKFgjI19mMSkKLSNkZWZpbmUgX0ZQX0ZSQUNfTE9XXzIoWCkJKFgjI19mMCkKLSNkZWZpbmUgX0ZQX0ZSQUNfV09SRF8yKFgsdykJKFgjI19mIyN3KQotCi0jZGVmaW5lIF9GUF9GUkFDX1NMTF8yKFgsTikJCQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgaWYgKChOKSA8IF9GUF9XX1RZUEVfU0laRSkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotICAgICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AoTikgJiYgKE4pID09IDEpIAkJCVwKLSAgICAgICAgICB7CQkJCQkJCQlcCi0gICAgICAgICAgICBYIyNfZjEgPSBYIyNfZjEgKyBYIyNfZjEgKyAoKChfRlBfV1NfVFlQRSkoWCMjX2YwKSkgPCAwKTsJXAotICAgICAgICAgICAgWCMjX2YwICs9IFgjI19mMDsJCQkJCQlcCi0gICAgICAgICAgfQkJCQkJCQkJXAotICAgICAgICBlbHNlCQkJCQkJCQlcCi0gICAgICAgICAgewkJCQkJCQkJXAotCSAgICBYIyNfZjEgPSBYIyNfZjEgPDwgKE4pIHwgWCMjX2YwID4+IChfRlBfV19UWVBFX1NJWkUgLSAoTikpOwlcCi0JICAgIFgjI19mMCA8PD0gKE4pOwkJCQkJCVwKLQkgIH0JCQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlYIyNfZjEgPSBYIyNfZjAgPDwgKChOKSAtIF9GUF9XX1RZUEVfU0laRSk7CQkJXAotCVgjI19mMCA9IDA7CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfU1JMXzIoWCxOKQkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBpZiAoKE4pIDwgX0ZQX1dfVFlQRV9TSVpFKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWCMjX2YwID0gWCMjX2YwID4+IChOKSB8IFgjI19mMSA8PCAoX0ZQX1dfVFlQRV9TSVpFIC0gKE4pKTsJXAotCVgjI19mMSA+Pj0gKE4pOwkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWCMjX2YwID0gWCMjX2YxID4+ICgoTikgLSBfRlBfV19UWVBFX1NJWkUpOwkJCVwKLQlYIyNfZjEgPSAwOwkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0vKiBSaWdodCBzaGlmdCB3aXRoIHN0aWNreS1sc2IuICAqLwotI2RlZmluZSBfRlBfRlJBQ19TUlNfMihYLE4sc3opCQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIGlmICgoTikgPCBfRlBfV19UWVBFX1NJWkUpCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlYIyNfZjAgPSAoWCMjX2YxIDw8IChfRlBfV19UWVBFX1NJWkUgLSAoTikpIHwgWCMjX2YwID4+IChOKSB8CVwKLQkJICAoX19idWlsdGluX2NvbnN0YW50X3AoTikgJiYgKE4pID09IDEJCQlcCi0JCSAgID8gWCMjX2YwICYgMQkJCQkJCVwKLQkJICAgOiAoWCMjX2YwIDw8IChfRlBfV19UWVBFX1NJWkUgLSAoTikpKSAhPSAwKSk7CVwKLQlYIyNfZjEgPj49IChOKTsJCQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBlbHNlCQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCVgjI19mMCA9IChYIyNfZjEgPj4gKChOKSAtIF9GUF9XX1RZUEVfU0laRSkgfAkJCVwKLQkgICAgICAgICAgKCgoWCMjX2YxIDw8ICgyICogX0ZQX1dfVFlQRV9TSVpFIC0gKE4pKSkgfAkJXAotCQkgICBYIyNfZjApICE9IDApKTsJCQkJCVwKLQlYIyNfZjEgPSAwOwkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9GUF9GUkFDX0FERElfMihYLEkpIFwKLSAgX19GUF9GUkFDX0FERElfMihYIyNfZjEsIFgjI19mMCwgSSkKLQotI2RlZmluZSBfRlBfRlJBQ19BRERfMihSLFgsWSkgXAotICBfX0ZQX0ZSQUNfQUREXzIoUiMjX2YxLCBSIyNfZjAsIFgjI19mMSwgWCMjX2YwLCBZIyNfZjEsIFkjI19mMCkKLQotI2RlZmluZSBfRlBfRlJBQ19TVUJfMihSLFgsWSkgXAotICBfX0ZQX0ZSQUNfU1VCXzIoUiMjX2YxLCBSIyNfZjAsIFgjI19mMSwgWCMjX2YwLCBZIyNfZjEsIFkjI19mMCkKLQotI2RlZmluZSBfRlBfRlJBQ19DTFpfMihSLFgpCVwKLSAgZG8gewkJCQlcCi0gICAgaWYgKFgjI19mMSkJCQlcCi0gICAgICBfX0ZQX0NMWihSLFgjI19mMSk7CVwKLSAgICBlbHNlIAkJCVwKLSAgICB7CQkJCVwKLSAgICAgIF9fRlBfQ0xaKFIsWCMjX2YwKTsJXAotICAgICAgUiArPSBfRlBfV19UWVBFX1NJWkU7CVwKLSAgICB9CQkJCVwKLSAgfSB3aGlsZSgwKQotCi0vKiBQcmVkaWNhdGVzICovCi0jZGVmaW5lIF9GUF9GUkFDX05FR1BfMihYKQkoKF9GUF9XU19UWVBFKVgjI19mMSA8IDApCi0jZGVmaW5lIF9GUF9GUkFDX1pFUk9QXzIoWCkJKChYIyNfZjEgfCBYIyNfZjApID09IDApCi0jZGVmaW5lIF9GUF9GUkFDX09WRVJQXzIoZnMsWCkJKFgjI19mMSAmIF9GUF9PVkVSRkxPV18jI2ZzKQotI2RlZmluZSBfRlBfRlJBQ19FUV8yKFgsIFkpCShYIyNfZjEgPT0gWSMjX2YxICYmIFgjI19mMCA9PSBZIyNfZjApCi0jZGVmaW5lIF9GUF9GUkFDX0dUXzIoWCwgWSkJXAotICAoKFgjI19mMSA+IFkjI19mMSkgfHwgKFgjI19mMSA9PSBZIyNfZjEgJiYgWCMjX2YwID4gWSMjX2YwKSkKLSNkZWZpbmUgX0ZQX0ZSQUNfR0VfMihYLCBZKQlcCi0gICgoWCMjX2YxID4gWSMjX2YxKSB8fCAoWCMjX2YxID09IFkjI19mMSAmJiBYIyNfZjAgPj0gWSMjX2YwKSkKLQotI2RlZmluZSBfRlBfWkVST0ZSQUNfMgkJMCwgMAotI2RlZmluZSBfRlBfTUlORlJBQ18yCQkwLCAxCi0KLS8qCi0gKiBJbnRlcm5hbHMKLSAqLwotCi0jZGVmaW5lIF9fRlBfRlJBQ19TRVRfMihYLEkxLEkwKQkoWCMjX2YwID0gSTAsIFgjI19mMSA9IEkxKQotCi0jZGVmaW5lIF9fRlBfQ0xaXzIoUiwgeGgsIHhsKQlcCi0gIGRvIHsJCQkJXAotICAgIGlmICh4aCkJCQlcCi0gICAgICBfX0ZQX0NMWihSLHhsKTsJCVwKLSAgICBlbHNlIAkJCVwKLSAgICB7CQkJCVwKLSAgICAgIF9fRlBfQ0xaKFIseGwpOwkJXAotICAgICAgUiArPSBfRlBfV19UWVBFX1NJWkU7CVwKLSAgICB9CQkJCVwKLSAgfSB3aGlsZSgwKQotCi0jaWYgMAotCi0jaWZuZGVmIF9fRlBfRlJBQ19BRERJXzIKLSNkZWZpbmUgX19GUF9GUkFDX0FERElfMih4aCwgeGwsIGkpIFwKLSAgKHhoICs9ICgoeGwgKz0gaSkgPCBpKSkKLSNlbmRpZgotI2lmbmRlZiBfX0ZQX0ZSQUNfQUREXzIKLSNkZWZpbmUgX19GUF9GUkFDX0FERF8yKHJoLCBybCwgeGgsIHhsLCB5aCwgeWwpIFwKLSAgKHJoID0geGggKyB5aCArICgocmwgPSB4bCArIHlsKSA8IHhsKSkKLSNlbmRpZgotI2lmbmRlZiBfX0ZQX0ZSQUNfU1VCXzIKLSNkZWZpbmUgX19GUF9GUkFDX1NVQl8yKHJoLCBybCwgeGgsIHhsLCB5aCwgeWwpIFwKLSAgKHJoID0geGggLSB5aCAtICgocmwgPSB4bCAtIHlsKSA+IHhsKSkKLSNlbmRpZgotCi0jZWxzZQotCi0jdW5kZWYgX19GUF9GUkFDX0FERElfMgotI2RlZmluZSBfX0ZQX0ZSQUNfQURESV8yKHhoLCB4bCwgaSkJYWRkX3NzYWFhYSh4aCwgeGwsIHhoLCB4bCwgMCwgaSkKLSN1bmRlZiBfX0ZQX0ZSQUNfQUREXzIKLSNkZWZpbmUgX19GUF9GUkFDX0FERF8yCQkJYWRkX3NzYWFhYQotI3VuZGVmIF9fRlBfRlJBQ19TVUJfMgotI2RlZmluZSBfX0ZQX0ZSQUNfU1VCXzIJCQlzdWJfZGRtbXNzCi0KLSNlbmRpZgotCi0vKgotICogVW5wYWNrIHRoZSByYXcgYml0cyBvZiBhIG5hdGl2ZSBmcCB2YWx1ZS4gIERvIG5vdCBjbGFzc2lmeSBvcgotICogbm9ybWFsaXplIHRoZSBkYXRhLgotICovCi0KLSNkZWZpbmUgX0ZQX1VOUEFDS19SQVdfMihmcywgWCwgdmFsKQkJCVwKLSAgZG8gewkJCQkJCQlcCi0gICAgdW5pb24gX0ZQX1VOSU9OXyMjZnMgX2ZsbzsgX2Zsby5mbHQgPSAodmFsKTsJXAotCQkJCQkJCVwKLSAgICBYIyNfZjAgPSBfZmxvLmJpdHMuZnJhYzA7CQkJCVwKLSAgICBYIyNfZjEgPSBfZmxvLmJpdHMuZnJhYzE7CQkJCVwKLSAgICBYIyNfZSAgPSBfZmxvLmJpdHMuZXhwOwkJCQlcCi0gICAgWCMjX3MgID0gX2Zsby5iaXRzLnNpZ247CQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKgotICogUmVwYWNrIHRoZSByYXcgYml0cyBvZiBhIG5hdGl2ZSBmcCB2YWx1ZS4KLSAqLwotCi0jZGVmaW5lIF9GUF9QQUNLX1JBV18yKGZzLCB2YWwsIFgpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICB1bmlvbiBfRlBfVU5JT05fIyNmcyBfZmxvOwkJCQlcCi0JCQkJCQkJXAotICAgIF9mbG8uYml0cy5mcmFjMCA9IFgjI19mMDsJCQkJXAotICAgIF9mbG8uYml0cy5mcmFjMSA9IFgjI19mMTsJCQkJXAotICAgIF9mbG8uYml0cy5leHAgICA9IFgjI19lOwkJCQlcCi0gICAgX2Zsby5iaXRzLnNpZ24gID0gWCMjX3M7CQkJCVwKLQkJCQkJCQlcCi0gICAgKHZhbCkgPSBfZmxvLmZsdDsJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKgotICogTXVsdGlwbGljYXRpb24gYWxnb3JpdGhtczoKLSAqLwotCi0vKiBHaXZlbiBhIDFXICogMVcgPT4gMlcgcHJpbWl0aXZlLCBkbyB0aGUgZXh0ZW5kZWQgbXVsdGlwbGljYXRpb24uICAqLwotCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF8yX3dpZGUoZnMsIFIsIFgsIFksIGRvaXQpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfRlJBQ19ERUNMXzQoX3opOyBfRlBfRlJBQ19ERUNMXzIoX2IpOyBfRlBfRlJBQ19ERUNMXzIoX2MpOwlcCi0JCQkJCQkJCQlcCi0gICAgZG9pdChfRlBfRlJBQ19XT1JEXzQoX3osMSksIF9GUF9GUkFDX1dPUkRfNChfeiwwKSwgWCMjX2YwLCBZIyNfZjApOyBcCi0gICAgZG9pdChfYl9mMSwgX2JfZjAsIFgjI19mMCwgWSMjX2YxKTsJCQkJCVwKLSAgICBkb2l0KF9jX2YxLCBfY19mMCwgWCMjX2YxLCBZIyNfZjApOwkJCQkJXAotICAgIGRvaXQoX0ZQX0ZSQUNfV09SRF80KF96LDMpLCBfRlBfRlJBQ19XT1JEXzQoX3osMiksIFgjI19mMSwgWSMjX2YxKTsgXAotCQkJCQkJCQkJXAotICAgIF9fRlBfRlJBQ19BRERfNChfRlBfRlJBQ19XT1JEXzQoX3osMyksX0ZQX0ZSQUNfV09SRF80KF96LDIpLAlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMSksX0ZQX0ZSQUNfV09SRF80KF96LDApLAlcCi0JCSAgICAwLCBfYl9mMSwgX2JfZjAsIDAsCQkJCQlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMyksX0ZQX0ZSQUNfV09SRF80KF96LDIpLAlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMSksX0ZQX0ZSQUNfV09SRF80KF96LDApKTsJXAotICAgIF9fRlBfRlJBQ19BRERfNChfRlBfRlJBQ19XT1JEXzQoX3osMyksX0ZQX0ZSQUNfV09SRF80KF96LDIpLAlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMSksX0ZQX0ZSQUNfV09SRF80KF96LDApLAlcCi0JCSAgICAwLCBfY19mMSwgX2NfZjAsIDAsCQkJCQlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMyksX0ZQX0ZSQUNfV09SRF80KF96LDIpLAlcCi0JCSAgICBfRlBfRlJBQ19XT1JEXzQoX3osMSksX0ZQX0ZSQUNfV09SRF80KF96LDApKTsJXAotCQkJCQkJCQkJXAotICAgIC8qIE5vcm1hbGl6ZSBzaW5jZSB3ZSBrbm93IHdoZXJlIHRoZSBtc2Igb2YgdGhlIG11bHRpcGxpY2FuZHMJXAotICAgICAgIHdlcmUgKGJpdCBCKSwgd2Uga25vdyB0aGF0IHRoZSBtc2Igb2YgdGhlIG9mIHRoZSBwcm9kdWN0IGlzCVwKLSAgICAgICBhdCBlaXRoZXIgMkIgb3IgMkItMS4gICovCQkJCQlcCi0gICAgX0ZQX0ZSQUNfU1JTXzQoX3osIF9GUF9XRlJBQ0JJVFNfIyNmcy0xLCAyKl9GUF9XRlJBQ0JJVFNfIyNmcyk7CVwKLSAgICBSIyNfZjAgPSBfRlBfRlJBQ19XT1JEXzQoX3osMCk7CQkJCQlcCi0gICAgUiMjX2YxID0gX0ZQX0ZSQUNfV09SRF80KF96LDEpOwkJCQkJXAotICB9IHdoaWxlICgwKQotCi0vKiBUaGlzIG5leHQgbWFjcm8gYXBwZWFycyB0byBiZSB0b3RhbGx5IGJyb2tlbi4gRm9ydHVuYXRlbHkgbm93aGVyZQotICogc2VlbXMgdG8gdXNlIGl0IDotPiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGRlZmluZSBfels0XSBidXQKLSAqIHRoZW4gdXNlIGl0IGluIF9GUF9GUkFDX1NSU180LCB3aGljaCB3aWxsIGF0dGVtcHQgdG8gYWNjZXNzCi0gKiBfel9mW25dIHdoaWNoIHdpbGwgY2F1c2UgYW4gZXJyb3IuIFRoZSBmaXggcHJvYmFibHkgaW52b2x2ZXMKLSAqIGRlY2xhcmluZyBpdCB3aXRoIF9GUF9GUkFDX0RFQ0xfNCwgc2VlIHByZXZpb3VzIG1hY3JvLiAtLSBQTU0gMDIvMTk5OAotICovCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF8yX2dtcChmcywgUiwgWCwgWSkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF94WzJdLCBfeVsyXSwgX3pbNF07CQkJCQlcCi0gICAgX3hbMF0gPSBYIyNfZjA7IF94WzFdID0gWCMjX2YxOwkJCQkJXAotICAgIF95WzBdID0gWSMjX2YwOyBfeVsxXSA9IFkjI19mMTsJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBtcG5fbXVsX24oX3osIF94LCBfeSwgMik7CQkJCQkJXAotCQkJCQkJCQkJXAotICAgIC8qIE5vcm1hbGl6ZSBzaW5jZSB3ZSBrbm93IHdoZXJlIHRoZSBtc2Igb2YgdGhlIG11bHRpcGxpY2FuZHMJXAotICAgICAgIHdlcmUgKGJpdCBCKSwgd2Uga25vdyB0aGF0IHRoZSBtc2Igb2YgdGhlIG9mIHRoZSBwcm9kdWN0IGlzCVwKLSAgICAgICBhdCBlaXRoZXIgMkIgb3IgMkItMS4gICovCQkJCQlcCi0gICAgX0ZQX0ZSQUNfU1JTXzQoX3osIF9GUF9XRlJBQ0JJVFMjI19mcy0xLCAyKl9GUF9XRlJBQ0JJVFNfIyNmcyk7CVwKLSAgICBSIyNfZjAgPSBfelswXTsJCQkJCQkJXAotICAgIFIjI19mMSA9IF96WzFdOwkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIERpdmlzaW9uIGFsZ29yaXRobXM6Ci0gKiBUaGlzIHNlZW1zIHRvIGJlIGdpdmluZyBtZSBkaWZmaWN1bHRpZXMgLS0gUE1NCi0gKiBMb29rLCBOZXRCU0Qgc2VlbXMgdG8gYmUgYWJsZSB0byBjb21tZW50IGFsZ29yaXRobXMuIENhbid0IHlvdT8KLSAqIEkndmUgdGhyb3duIHByaW50a3MgYXQgdGhlIHByb2JsZW0uCi0gKiBUaGlzIG5vdyBhcHBlYXJzIHRvIHdvcmssIGJ1dCBJIHN0aWxsIGRvbid0IHJlYWxseSBrbm93IHdoeS4KLSAqIEFsc28sIEkgZG9uJ3QgdGhpbmsgdGhlIHJlc3VsdCBpcyBwcm9wZXJseSBub3JtYWxpc2VkLi4uCi0gKi8KLQotI2RlZmluZSBfRlBfRElWX01FQVRfMl91ZGl2XzY0KGZzLCBSLCBYLCBZKQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgZXh0ZXJuIHZvaWQgX2ZwX3VkaXZtb2R0aTQoX0ZQX1dfVFlQRSBxWzJdLCBfRlBfV19UWVBFIHJbMl0sCVwKLQkJCSAgICAgICBfRlBfV19UWVBFIG4xLCBfRlBfV19UWVBFIG4wLAkJXAotCQkJICAgICAgIF9GUF9XX1RZUEUgZDEsIF9GUF9XX1RZUEUgZDApOwkJXAotICAgIF9GUF9XX1RZUEUgX25fZjMsIF9uX2YyLCBfbl9mMSwgX25fZjAsIF9yX2YxLCBfcl9mMDsJCVwKLSAgICBfRlBfV19UWVBFIF9xX2YxLCBfcV9mMCwgX21fZjEsIF9tX2YwOwkJCQlcCi0gICAgX0ZQX1dfVFlQRSBfcm1lbVsyXSwgX3FtZW1bMl07CQkJCQlcCi0gICAgLyogSSB0aGluayB0aGlzIGNoZWNrIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgbm9ybWFsaXNlZC4gICBcCi0gICAgICogQXNzdW1pbmcgWCxZIG5vcm1hbGlzZWQgKGllIGluIFsxLjAsMi4wKSkgWC9ZIHdpbGwgYmUgaW4gICAgICAgICBcCi0gICAgICogWzAuNSwyLjApLiBGdXJ0aGVybW9yZSwgaXQgd2lsbCBiZSBsZXNzIHRoYW4gMS4wIGlmZiBYIDwgWS4gICAgICBcCi0gICAgICogSW4gdGhpcyBjYXNlIHdlIHR3ZWFrIHRoaW5ncy4gKHRoaXMgaXMgYmFzZWQgb24gY29tbWVudHMgaW4gICAgICBcCi0gICAgICogdGhlIE5ldEJTRCBGUFUgZW11bGF0aW9uIGNvZGUuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICogV2Uga25vdyBYLFkgYXJlIG5vcm1hbGlzZWQgYmVjYXVzZSB3ZSBlbnN1cmUgdGhpcyBhcyBwYXJ0IG9mICAgICBcCi0gICAgICogdGhlIHVucGFja2luZyBwcm9jZXNzLiAtLSBQTU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICovCQkJCQkJCQkJXAotICAgIGlmIChfRlBfRlJBQ19HVF8yKFgsIFkpKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0vKglSIyNfZSsrOyAqLwkJCQkJCQlcCi0JX25fZjMgPSBYIyNfZjEgPj4gMTsJCQkJCQlcCi0JX25fZjIgPSBYIyNfZjEgPDwgKF9GUF9XX1RZUEVfU0laRSAtIDEpIHwgWCMjX2YwID4+IDE7CQlcCi0JX25fZjEgPSBYIyNfZjAgPDwgKF9GUF9XX1RZUEVfU0laRSAtIDEpOwkJCVwKLQlfbl9mMCA9IDA7CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlSIyNfZS0tOwkJCQkJCQlcCi0JX25fZjMgPSBYIyNfZjE7CQkJCQkJCVwKLQlfbl9mMiA9IFgjI19mMDsJCQkJCQkJXAotCV9uX2YxID0gX25fZjAgPSAwOwkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgLyogTm9ybWFsaXplLCBpLmUuIG1ha2UgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSAJCVwKLSAgICAgICBkZW5vbWluYXRvciBzZXQuICBDSEFOR0VEOiAtIDEgdG8gbm90aGluZyAtLSBQTU0gKi8JCVwKLSAgICBfRlBfRlJBQ19TTExfMihZLCBfRlBfV0ZSQUNYQklUU18jI2ZzIC8qIC0xICovKTsJCQlcCi0JCQkJCQkJCQlcCi0gICAgLyogRG8gdGhlIDI1Ni8xMjggYml0IGRpdmlzaW9uIGdpdmVuIHRoZSAxMjgtYml0IF9mcF91ZGl2bW9kdGY0IAlcCi0gICAgICAgcHJpbWl0aXZlIHNuYWdnZWQgZnJvbSBsaWJnY2MyLmMuICAqLwkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX2ZwX3VkaXZtb2R0aTQoX3FtZW0sIF9ybWVtLCBfbl9mMywgX25fZjIsIDAsIFkjI19mMSk7CQlcCi0gICAgX3FfZjEgPSBfcW1lbVswXTsJCQkJCQkJXAotICAgIHVtdWxfcHBtbShfbV9mMSwgX21fZjAsIF9xX2YxLCBZIyNfZjApOwkJCQlcCi0gICAgX3JfZjEgPSBfcm1lbVswXTsJCQkJCQkJXAotICAgIF9yX2YwID0gX25fZjE7CQkJCQkJCVwKLSAgICBpZiAoX0ZQX0ZSQUNfR1RfMihfbSwgX3IpKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JX3FfZjEtLTsJCQkJCQkJXAotCV9GUF9GUkFDX0FERF8yKF9yLCBfciwgWSk7CQkJCQlcCi0JaWYgKF9GUF9GUkFDX0dFXzIoX3IsIFkpICYmIF9GUF9GUkFDX0dUXzIoX20sIF9yKSkJCVwKLQkgIHsJCQkJCQkJCVwKLQkgICAgX3FfZjEtLTsJCQkJCQkJXAotCSAgICBfRlBfRlJBQ19BRERfMihfciwgX3IsIFkpOwkJCQkJXAotCSAgfQkJCQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBfRlBfRlJBQ19TVUJfMihfciwgX3IsIF9tKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX2ZwX3VkaXZtb2R0aTQoX3FtZW0sIF9ybWVtLCBfcl9mMSwgX3JfZjAsIDAsIFkjI19mMSk7CQlcCi0gICAgX3FfZjAgPSBfcW1lbVswXTsJCQkJCQkJXAotICAgIHVtdWxfcHBtbShfbV9mMSwgX21fZjAsIF9xX2YwLCBZIyNfZjApOwkJCQlcCi0gICAgX3JfZjEgPSBfcm1lbVswXTsJCQkJCQkJXAotICAgIF9yX2YwID0gX25fZjA7CQkJCQkJCVwKLSAgICBpZiAoX0ZQX0ZSQUNfR1RfMihfbSwgX3IpKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JX3FfZjAtLTsJCQkJCQkJXAotCV9GUF9GUkFDX0FERF8yKF9yLCBfciwgWSk7CQkJCQlcCi0JaWYgKF9GUF9GUkFDX0dFXzIoX3IsIFkpICYmIF9GUF9GUkFDX0dUXzIoX20sIF9yKSkJCVwKLQkgIHsJCQkJCQkJCVwKLQkgICAgX3FfZjAtLTsJCQkJCQkJXAotCSAgICBfRlBfRlJBQ19BRERfMihfciwgX3IsIFkpOwkJCQkJXAotCSAgfQkJCQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBfRlBfRlJBQ19TVUJfMihfciwgX3IsIF9tKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgUiMjX2YxID0gX3FfZjE7CQkJCQkJCVwKLSAgICBSIyNfZjAgPSBfcV9mMCB8ICgoX3JfZjEgfCBfcl9mMCkgIT0gMCk7CQkJCVwKLSAgICAvKiBhZGp1c3Qgc28gYW5zd2VyIGlzIG5vcm1hbGl6ZWQgYWdhaW4uIEknbSBub3Qgc3VyZSB3aGF0IHRoZSAJXAotICAgICAqIGZpbmFsIHN6IHBhcmFtIHNob3VsZCBiZS4gSW4gcHJhY3RpY2UgaXQncyBuZXZlciB1c2VkIHNpbmNlICAgICAgXAotICAgICAqIE4gaXMgMSB3aGljaCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgPCBfRlBfV19UWVBFX1NJWkUuLi4JCVwKLSAgICAgKi8JCQkJCQkJCQlcCi0gICAgLyogX0ZQX0ZSQUNfU1JTXzIoUiwxLF9GUF9XRlJBQ0JJVFNfIyNmcyk7CSovCQkJXAotICB9IHdoaWxlICgwKQotCi0KLSNkZWZpbmUgX0ZQX0RJVl9NRUFUXzJfZ21wKGZzLCBSLCBYLCBZKQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIF9GUF9XX1RZUEUgX3hbNF0sIF95WzJdLCBfels0XTsJCQkJCVwKLSAgICBfeVswXSA9IFkjI19mMDsgX3lbMV0gPSBZIyNfZjE7CQkJCQlcCi0gICAgX3hbMF0gPSBfeFszXSA9IDA7CQkJCQkJCVwKLSAgICBpZiAoX0ZQX0ZSQUNfR1RfMihYLCBZKSkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCVIjI19lKys7CQkJCQkJCVwKLQlfeFsxXSA9IChYIyNfZjAgPDwgKF9GUF9XRlJBQ0JJVFMtMSAtIF9GUF9XX1RZUEVfU0laRSkgfAlcCi0JCSBYIyNfZjEgPj4gKF9GUF9XX1RZUEVfU0laRSAtCQkJCVwKLQkJCSAgICAoX0ZQX1dGUkFDQklUUy0xIC0gX0ZQX1dfVFlQRV9TSVpFKSkpOwlcCi0JX3hbMl0gPSBYIyNfZjEgPDwgKF9GUF9XRlJBQ0JJVFMtMSAtIF9GUF9XX1RZUEVfU0laRSk7CQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JX3hbMV0gPSAoWCMjX2YwIDw8IChfRlBfV0ZSQUNCSVRTIC0gX0ZQX1dfVFlQRV9TSVpFKSB8CQlcCi0JCSBYIyNfZjEgPj4gKF9GUF9XX1RZUEVfU0laRSAtCQkJCVwKLQkJCSAgICAoX0ZQX1dGUkFDQklUUyAtIF9GUF9XX1RZUEVfU0laRSkpKTsJXAotCV94WzJdID0gWCMjX2YxIDw8IChfRlBfV0ZSQUNCSVRTIC0gX0ZQX1dfVFlQRV9TSVpFKTsJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgKHZvaWQpIG1wbl9kaXZyZW0gKF96LCAwLCBfeCwgNCwgX3ksIDIpOwkJCQlcCi0gICAgUiMjX2YxID0gX3pbMV07CQkJCQkJCVwKLSAgICBSIyNfZjAgPSBfelswXSB8ICgoX3hbMF0gfCBfeFsxXSkgIT0gMCk7CQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKgotICogU3F1YXJlIHJvb3QgYWxnb3JpdGhtczoKLSAqIFdlIGhhdmUganVzdCBvbmUgcmlnaHQgbm93LCBtYXliZSBOZXd0b24gYXBwcm94aW1hdGlvbgotICogc2hvdWxkIGJlIGFkZGVkIGZvciB0aG9zZSBtYWNoaW5lcyB3aGVyZSBkaXZpc2lvbiBpcyBmYXN0LgotICovCi0KLSNkZWZpbmUgX0ZQX1NRUlRfTUVBVF8yKFIsIFMsIFQsIFgsIHEpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICB3aGlsZSAocSkJCQkJCQlcCi0gICAgICB7CQkJCQkJCVwKLSAgICAgICAgVCMjX2YxID0gUyMjX2YxICsgcTsJCQkJXAotICAgICAgICBpZiAoVCMjX2YxIDw9IFgjI19mMSkJCQkJXAotICAgICAgICAgIHsJCQkJCQlcCi0gICAgICAgICAgICBTIyNfZjEgPSBUIyNfZjEgKyBxOwkJCVwKLSAgICAgICAgICAgIFgjI19mMSAtPSBUIyNfZjE7CQkJCVwKLSAgICAgICAgICAgIFIjI19mMSArPSBxOwkJCQlcCi0gICAgICAgICAgfQkJCQkJCVwKLSAgICAgICAgX0ZQX0ZSQUNfU0xMXzIoWCwgMSk7CQkJCVwKLSAgICAgICAgcSA+Pj0gMTsJCQkJCVwKLSAgICAgIH0JCQkJCQkJXAotICAgIHEgPSAoX0ZQX1dfVFlQRSkxIDw8IChfRlBfV19UWVBFX1NJWkUgLSAxKTsJCVwKLSAgICB3aGlsZSAocSkJCQkJCQlcCi0gICAgICB7CQkJCQkJCVwKLSAgICAgICAgVCMjX2YwID0gUyMjX2YwICsgcTsJCQkJXAotICAgICAgICBUIyNfZjEgPSBTIyNfZjE7CQkJCVwKLSAgICAgICAgaWYgKFQjI19mMSA8IFgjI19mMSB8fCAJCQkJXAotICAgICAgICAgICAgKFQjI19mMSA9PSBYIyNfZjEgJiYgVCMjX2YwIDwgWCMjX2YwKSkJXAotICAgICAgICAgIHsJCQkJCQlcCi0gICAgICAgICAgICBTIyNfZjAgPSBUIyNfZjAgKyBxOwkJCVwKLSAgICAgICAgICAgIGlmICgoKF9GUF9XU19UWVBFKVQjI19mMCkgPCAwICYmCQlcCi0gICAgICAgICAgICAgICAgKChfRlBfV1NfVFlQRSlTIyNfZjApID49IDApCQlcCi0gICAgICAgICAgICAgIFMjI19mMSsrOwkJCQkJXAotICAgICAgICAgICAgX0ZQX0ZSQUNfU1VCXzIoWCwgWCwgVCk7CQkJXAotICAgICAgICAgICAgUiMjX2YwICs9IHE7CQkJCVwKLSAgICAgICAgICB9CQkJCQkJXAotICAgICAgICBfRlBfRlJBQ19TTExfMihYLCAxKTsJCQkJXAotICAgICAgICBxID4+PSAxOwkJCQkJXAotICAgICAgfQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIEFzc2VtYmx5L2Rpc2Fzc2VtYmx5IGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gaW50ZWdyYWwgdHlwZXMuCi0gKiBObyBzaGlmdGluZyBvciBvdmVyZmxvdyBoYW5kbGVkIGhlcmUuCi0gKi8KLQotI2RlZmluZSBfRlBfRlJBQ19BU1NFTUJMRV8yKHIsIFgsIHJzaXplKQlcCi0gIGRvIHsJCQkJCQlcCi0gICAgaWYgKHJzaXplIDw9IF9GUF9XX1RZUEVfU0laRSkJCVwKLSAgICAgIHIgPSBYIyNfZjA7CQkJCVwKLSAgICBlbHNlCQkJCQlcCi0gICAgICB7CQkJCQkJXAotCXIgPSBYIyNfZjE7CQkJCVwKLQlyIDw8PSBfRlBfV19UWVBFX1NJWkU7CQkJXAotCXIgKz0gWCMjX2YwOwkJCQlcCi0gICAgICB9CQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9GUF9GUkFDX0RJU0FTU0VNQkxFXzIoWCwgciwgcnNpemUpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBYIyNfZjAgPSByOwkJCQkJCQkJXAotICAgIFgjI19mMSA9IChyc2l6ZSA8PSBfRlBfV19UWVBFX1NJWkUgPyAwIDogciA+PiBfRlBfV19UWVBFX1NJWkUpOwlcCi0gIH0gd2hpbGUgKDApCi0KLS8qCi0gKiBDb252ZXJ0IEZQIHZhbHVlcyBiZXR3ZWVuIHdvcmQgc2l6ZXMKLSAqLwotCi0jZGVmaW5lIF9GUF9GUkFDX0NPTlZfMV8yKGRmcywgc2ZzLCBELCBTKQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgX0ZQX0ZSQUNfU1JTXzIoUywgKF9GUF9XRlJBQ0JJVFNfIyNzZnMgLSBfRlBfV0ZSQUNCSVRTXyMjZGZzKSwJXAotCQkgICBfRlBfV0ZSQUNCSVRTXyMjc2ZzKTsJCQkJXAotICAgIEQjI19mID0gUyMjX2YwOwkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfQ09OVl8yXzEoZGZzLCBzZnMsIEQsIFMpCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBEIyNfZjAgPSBTIyNfZjsJCQkJCQkJXAotICAgIEQjI19mMSA9IDA7CQkJCQkJCQlcCi0gICAgX0ZQX0ZSQUNfU0xMXzIoRCwgKF9GUF9XRlJBQ0JJVFNfIyNkZnMgLSBfRlBfV0ZSQUNCSVRTXyMjc2ZzKSk7CVwKLSAgfSB3aGlsZSAoMCkKLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L29wLTQuaCBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9vcC00LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YWU2MjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L29wLTQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKgotICogQmFzaWMgZm91ci13b3JkIGZyYWN0aW9uIGRlY2xhcmF0aW9uIGFuZCBtYW5pcHVsYXRpb24uCi0gKgotICogV2hlbiBhZGRpbmcgcXVhZHdvcmQgc3VwcG9ydCBmb3IgMzIgYml0IG1hY2hpbmVzLCB3ZSBuZWVkCi0gKiB0byBiZSBhIGxpdHRsZSBjYXJlZnVsIGFzIGRvdWJsZSBtdWx0aXBseSB1c2VzIHNvbWUgb2YgdGhlc2UKLSAqIG1hY3JvczogKGluIG9wLTIuaCkKLSAqIF9GUF9NVUxfTUVBVF8yX3dpZGUoKSB1c2VzIF9GUF9GUkFDX0RFQ0xfNCwgX0ZQX0ZSQUNfV09SRF80LAotICogX0ZQX0ZSQUNfQUREXzQsIF9GUF9GUkFDX1NSU180Ci0gKiBfRlBfTVVMX01FQVRfMl9nbXAoKSB1c2VzIF9GUF9GUkFDX1NSU180IChhbmQgc2hvdWxkIHVzZQotICogX0ZQX0ZSQUNfREVDTF80OiBpdCBhcHBlYXJzIHRvIGJlIGJyb2tlbiBhbmQgaXMgbm90IHVzZWQKLSAqIGFueXdoZXJlIGFueXdheS4gKQotICoKLSAqIEkndmUgbm93IGZpeGVkIGFsbCB0aGUgbWFjcm9zIHRoYXQgd2VyZSBoZXJlIGZyb20gdGhlIHNwYXJjNjQgY29kZS4KLSAqIFsqbm9uZSogb2YgdGhlIHNoaWZ0IG1hY3JvcyB3ZXJlIGNvcnJlY3QhXSAtLSBQTU0gMDIvMTk5OAotICoKLSAqIFRoZSBvbmx5IHF1YWR3b3JkIHN0dWZmIHRoYXQgcmVtYWlucyB0byBiZSBjb2RlZCBpczoKLSAqIDEpIHRoZSBjb252ZXJzaW9uIHRvL2Zyb20gaW50cywgd2hpY2ggcmVxdWlyZXMKLSAqIHRoYXQgd2UgY2hlY2sgKGluIG9wLWNvbW1vbi5oKSB0aGF0IHRoZSBmb2xsb3dpbmcgZG8gdGhlIHJpZ2h0IHRoaW5nCi0gKiBmb3IgcXVhZHdvcmRzOiBfRlBfVE9fSU5UKFEsNCxyLFgscnN6LHJzZyksIF9GUF9GUk9NX0lOVChRLDQsWCxyLHJzLHJ0KQotICogMikgbXVsdGlwbHksIGRpdmlkZSBhbmQgc3FydCwgd2hpY2ggcmVxdWlyZToKLSAqIF9GUF9NVUxfTUVBVF80XyooUixYLFkpLCBfRlBfRElWX01FQVRfNF8qKFIsWCxZKSwgX0ZQX1NRUlRfTUVBVF80KFIsUyxULFgscSksCi0gKiBUaGlzIGFsc28gbmVlZHMgX0ZQX01VTF9NRUFUX1EgYW5kIF9GUF9ESVZfTUVBVF9RIHRvIGJlIGRlZmluZWQgdG8KLSAqIHNvbWUgc3VpdGFibGUgX0ZQX01VTF9NRUFUXzRfKiBtYWNyb3MgaW4gc2ZwLW1hY2hpbmUuaC4KLSAqIFt3ZSdyZSBmcmVlIHRvIGNob29zZSB3aGF0ZXZlciBGUF9NVUxfTUVBVF80XyogbWFjcm9zIHdlIG5lZWQgZm9yCi0gKiB0aGVzZTsgdGhleSBhcmUgdXNlZCBub3doZXJlIGVsc2UuIF0KLSAqLwotCi0jZGVmaW5lIF9GUF9GUkFDX0RFQ0xfNChYKQlfRlBfV19UWVBFIFgjI19mWzRdCi0jZGVmaW5lIF9GUF9GUkFDX0NPUFlfNChELFMpCQkJXAotICAoRCMjX2ZbMF0gPSBTIyNfZlswXSwgRCMjX2ZbMV0gPSBTIyNfZlsxXSwJXAotICAgRCMjX2ZbMl0gPSBTIyNfZlsyXSwgRCMjX2ZbM10gPSBTIyNfZlszXSkKLS8qIFRoZSBfRlBfRlJBQ19TRVRfbihYLEkpIG1hY3JvIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBhbm90aGVyCi0gKiBtYWNybyBzdWNoIGFzIF9GUF9aRVJPRlJBQ19uIHdoaWNoIHJldHVybnMgbiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLgotICogVGhlIHJlc3VsdCBpcyB0aGF0IHdlIGdldCBhbiBleHBhbnNpb24gb2YgX19GUF9GUkFDX1NFVF9uKFgsSTAsSTEsSTIsSTMpCi0gKiB3aGljaCBqdXN0IGFzc2lnbnMgdGhlIEluIHZhbHVlcyB0byB0aGUgYXJyYXkgWCMjX2ZbXS4KLSAqIFRoaXMgaXMgd2h5IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkb2Vzbid0IGFwcGVhciB0byBtYXRjaAotICogYXQgZmlyc3QgZ2xhbmNlLi4uICAgICAgLS0gUE1NCi0gKi8KLSNkZWZpbmUgX0ZQX0ZSQUNfU0VUXzQoWCxJKQlfX0ZQX0ZSQUNfU0VUXzQoWCwgSSkKLSNkZWZpbmUgX0ZQX0ZSQUNfSElHSF80KFgpCShYIyNfZlszXSkKLSNkZWZpbmUgX0ZQX0ZSQUNfTE9XXzQoWCkJKFgjI19mWzBdKQotI2RlZmluZSBfRlBfRlJBQ19XT1JEXzQoWCx3KQkoWCMjX2Zbd10pCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfU0xMXzQoWCxOKQkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfSV9UWVBFIF91cCwgX2Rvd24sIF9za2lwLCBfaTsJCQkJCVwKLSAgICBfc2tpcCA9IChOKSAvIF9GUF9XX1RZUEVfU0laRTsJCQkJCVwKLSAgICBfdXAgPSAoTikgJSBfRlBfV19UWVBFX1NJWkU7CQkJCQlcCi0gICAgX2Rvd24gPSBfRlBfV19UWVBFX1NJWkUgLSBfdXA7CQkJCQlcCi0gICAgZm9yIChfaSA9IDM7IF9pID4gX3NraXA7IC0tX2kpCQkJCQlcCi0gICAgICBYIyNfZltfaV0gPSBYIyNfZltfaS1fc2tpcF0gPDwgX3VwIHwgWCMjX2ZbX2ktX3NraXAtMV0gPj4gX2Rvd247CVwKLS8qIGJ1Z2ZpeGVkOiB3YXMgWCMjX2ZbX2ldIDw8PSBfdXA7ICAtLSBQTU0gMDIvMTk5OCAqLyAgICAgICAgICAgICAgICAgIFwKLSAgICBYIyNfZltfaV0gPSBYIyNfZlswXSA8PCBfdXA7IAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKC0tX2k7IF9pID49IDA7IC0tX2kpCQkJCQkJXAotICAgICAgWCMjX2ZbX2ldID0gMDsJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0vKiBUaGlzIG9uZSB3YXMgYnJva2VuIHRvbyAqLwotI2RlZmluZSBfRlBfRlJBQ19TUkxfNChYLE4pCQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIF9GUF9JX1RZUEUgX3VwLCBfZG93biwgX3NraXAsIF9pOwkJCQkJXAotICAgIF9za2lwID0gKE4pIC8gX0ZQX1dfVFlQRV9TSVpFOwkJCQkJXAotICAgIF9kb3duID0gKE4pICUgX0ZQX1dfVFlQRV9TSVpFOwkJCQkJXAotICAgIF91cCA9IF9GUF9XX1RZUEVfU0laRSAtIF9kb3duOwkJCQkJXAotICAgIGZvciAoX2kgPSAwOyBfaSA8IDMtX3NraXA7ICsrX2kpCQkJCQlcCi0gICAgICBYIyNfZltfaV0gPSBYIyNfZltfaStfc2tpcF0gPj4gX2Rvd24gfCBYIyNfZltfaStfc2tpcCsxXSA8PCBfdXA7CVwKLSAgICBYIyNfZltfaV0gPSBYIyNfZlszXSA+PiBfZG93bjsJCQkgICAgICAgICAJXAotICAgIGZvciAoKytfaTsgX2kgPCA0OyArK19pKQkJCQkJCVwKLSAgICAgIFgjI19mW19pXSA9IDA7CQkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKiBSaWdodCBzaGlmdCB3aXRoIHN0aWNreS1sc2IuCi0gKiBXaGF0IHRoaXMgYWN0dWFsbHkgbWVhbnMgaXMgdGhhdCB3ZSBkbyBhIHN0YW5kYXJkIHJpZ2h0LXNoaWZ0LAotICogYnV0IHRoYXQgaWYgYW55IG9mIHRoZSBiaXRzIHRoYXQgZmFsbCBvZmYgdGhlIHJpZ2h0IGhhbmQgc2lkZQotICogd2VyZSBvbmUgdGhlbiB3ZSBhbHdheXMgc2V0IHRoZSBMU2JpdC4KLSAqLwotI2RlZmluZSBfRlBfRlJBQ19TUlNfNChYLE4sc2l6ZSkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfSV9UWVBFIF91cCwgX2Rvd24sIF9za2lwLCBfaTsJCQkJCVwKLSAgICBfRlBfV19UWVBFIF9zOwkJCQkJCQlcCi0gICAgX3NraXAgPSAoTikgLyBfRlBfV19UWVBFX1NJWkU7CQkJCQlcCi0gICAgX2Rvd24gPSAoTikgJSBfRlBfV19UWVBFX1NJWkU7CQkJCQlcCi0gICAgX3VwID0gX0ZQX1dfVFlQRV9TSVpFIC0gX2Rvd247CQkJCQlcCi0gICAgZm9yIChfcyA9IF9pID0gMDsgX2kgPCBfc2tpcDsgKytfaSkJCQkJCVwKLSAgICAgIF9zIHw9IFgjI19mW19pXTsJCQkJCQkJXAotICAgIF9zIHw9IFgjI19mW19pXSA8PCBfdXA7CQkJCQkJXAotLyogcyBpcyBub3cgIT0gMCBpZiB3ZSB3YW50IHRvIHNldCB0aGUgTFNiaXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoX2kgPSAwOyBfaSA8IDMtX3NraXA7ICsrX2kpCQkJCQlcCi0gICAgICBYIyNfZltfaV0gPSBYIyNfZltfaStfc2tpcF0gPj4gX2Rvd24gfCBYIyNfZltfaStfc2tpcCsxXSA8PCBfdXA7CVwKLSAgICBYIyNfZltfaV0gPSBYIyNfZlszXSA+PiBfZG93bjsJCQkJCVwKLSAgICBmb3IgKCsrX2k7IF9pIDwgNDsgKytfaSkJCQkJCQlcCi0gICAgICBYIyNfZltfaV0gPSAwOwkJCQkJCQlcCi0gICAgLyogZG9uJ3QgZml4IHRoZSBMU0IgdW50aWwgdGhlIHZlcnkgZW5kIHdoZW4gd2UncmUgc3VyZSBmWzBdIGlzIHN0YWJsZSAqLyBcCi0gICAgWCMjX2ZbMF0gfD0gKF9zICE9IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfQUREXzQoUixYLFkpCQkJCQkJXAotICBfX0ZQX0ZSQUNfQUREXzQoUiMjX2ZbM10sIFIjI19mWzJdLCBSIyNfZlsxXSwgUiMjX2ZbMF0sCQlcCi0JCSAgWCMjX2ZbM10sIFgjI19mWzJdLCBYIyNfZlsxXSwgWCMjX2ZbMF0sCQlcCi0JCSAgWSMjX2ZbM10sIFkjI19mWzJdLCBZIyNfZlsxXSwgWSMjX2ZbMF0pCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfU1VCXzQoUixYLFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19GUF9GUkFDX1NVQl80KFIjI19mWzNdLCBSIyNfZlsyXSwgUiMjX2ZbMV0sIFIjI19mWzBdLAkJXAotCQkgIFgjI19mWzNdLCBYIyNfZlsyXSwgWCMjX2ZbMV0sIFgjI19mWzBdLAkJXAotCQkgIFkjI19mWzNdLCBZIyNfZlsyXSwgWSMjX2ZbMV0sIFkjI19mWzBdKQotCi0jZGVmaW5lIF9GUF9GUkFDX0FERElfNChYLEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fRlBfRlJBQ19BRERJXzQoWCMjX2ZbM10sIFgjI19mWzJdLCBYIyNfZlsxXSwgWCMjX2ZbMF0sIEkpCi0KLSNkZWZpbmUgX0ZQX1pFUk9GUkFDXzQgIDAsMCwwLDAKLSNkZWZpbmUgX0ZQX01JTkZSQUNfNCAgIDAsMCwwLDEKLQotI2RlZmluZSBfRlBfRlJBQ19aRVJPUF80KFgpICAgICAoKFgjI19mWzBdIHwgWCMjX2ZbMV0gfCBYIyNfZlsyXSB8IFgjI19mWzNdKSA9PSAwKQotI2RlZmluZSBfRlBfRlJBQ19ORUdQXzQoWCkgICAgICAoKF9GUF9XU19UWVBFKVgjI19mWzNdIDwgMCkKLSNkZWZpbmUgX0ZQX0ZSQUNfT1ZFUlBfNChmcyxYKSAgKFgjI19mWzBdICYgX0ZQX09WRVJGTE9XXyMjZnMpCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfRVFfNChYLFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotIChYIyNfZlswXSA9PSBZIyNfZlswXSAmJiBYIyNfZlsxXSA9PSBZIyNfZlsxXSAgICAgICAgICBcCi0gICYmIFgjI19mWzJdID09IFkjI19mWzJdICYmIFgjI19mWzNdID09IFkjI19mWzNdKQotCi0jZGVmaW5lIF9GUF9GUkFDX0dUXzQoWCxZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAoWCMjX2ZbM10gPiBZIyNfZlszXSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoWCMjX2ZbM10gPT0gWSMjX2ZbM10gJiYgKFgjI19mWzJdID4gWSMjX2ZbMl0gfHwgICAgICBcCi0gICAoWCMjX2ZbMl0gPT0gWSMjX2ZbMl0gJiYgKFgjI19mWzFdID4gWSMjX2ZbMV0gfHwgICAgIFwKLSAgICAoWCMjX2ZbMV0gPT0gWSMjX2ZbMV0gJiYgWCMjX2ZbMF0gPiBZIyNfZlswXSkgICAgICAgXAotICAgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSApCi0KLSNkZWZpbmUgX0ZQX0ZSQUNfR0VfNChYLFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotIChYIyNfZlszXSA+IFkjI19mWzNdIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChYIyNfZlszXSA9PSBZIyNfZlszXSAmJiAoWCMjX2ZbMl0gPiBZIyNfZlsyXSB8fCAgICAgIFwKLSAgIChYIyNfZlsyXSA9PSBZIyNfZlsyXSAmJiAoWCMjX2ZbMV0gPiBZIyNfZlsxXSB8fCAgICAgXAotICAgIChYIyNfZlsxXSA9PSBZIyNfZlsxXSAmJiBYIyNfZlswXSA+PSBZIyNfZlswXSkgICAgICBcCi0gICApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICkKLQotCi0jZGVmaW5lIF9GUF9GUkFDX0NMWl80KFIsWCkgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoWCMjX2ZbM10pICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX0ZQX0NMWihSLFgjI19mWzNdKTsgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoWCMjX2ZbMl0pICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19GUF9DTFooUixYIyNfZlsyXSk7ICAgICAgICAgICBcCi0gICAgICAgIFIgKz0gX0ZQX1dfVFlQRV9TSVpFOyAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChYIyNfZlsxXSkgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX0ZQX0NMWihSLFgjI19mWzJdKTsgICAgICAgICAgIFwKLSAgICAgICAgUiArPSBfRlBfV19UWVBFX1NJWkUqMjsgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fRlBfQ0xaKFIsWCMjX2ZbMF0pOyAgICAgICAgICAgXAotICAgICAgICBSICs9IF9GUF9XX1RZUEVfU0laRSozOyAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUoMCkKLQotCi0jZGVmaW5lIF9GUF9VTlBBQ0tfUkFXXzQoZnMsIFgsIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bmlvbiBfRlBfVU5JT05fIyNmcyBfZmxvOyBfZmxvLmZsdCA9ICh2YWwpOyAgICAgICAgCVwKLSAgICBYIyNfZlswXSA9IF9mbG8uYml0cy5mcmFjMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgWCMjX2ZbMV0gPSBfZmxvLmJpdHMuZnJhYzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFgjI19mWzJdID0gX2Zsby5iaXRzLmZyYWMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBYIyNfZlszXSA9IF9mbG8uYml0cy5mcmFjMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgWCMjX2UgID0gX2Zsby5iaXRzLmV4cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFgjI19zICA9IF9mbG8uYml0cy5zaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfRlBfUEFDS19SQVdfNChmcywgdmFsLCBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5pb24gX0ZQX1VOSU9OXyMjZnMgX2ZsbzsJCQkJCVwKLSAgICBfZmxvLmJpdHMuZnJhYzAgPSBYIyNfZlswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX2Zsby5iaXRzLmZyYWMxID0gWCMjX2ZbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9mbG8uYml0cy5mcmFjMiA9IFgjI19mWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfZmxvLmJpdHMuZnJhYzMgPSBYIyNfZlszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX2Zsby5iaXRzLmV4cCAgID0gWCMjX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9mbG8uYml0cy5zaWduICA9IFgjI19zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodmFsKSA9IF9mbG8uZmx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKgotICogSW50ZXJuYWxzCi0gKi8KLQotI2RlZmluZSBfX0ZQX0ZSQUNfU0VUXzQoWCxJMyxJMixJMSxJMCkJCQkJCVwKLSAgKFgjI19mWzNdID0gSTMsIFgjI19mWzJdID0gSTIsIFgjI19mWzFdID0gSTEsIFgjI19mWzBdID0gSTApCi0KLSNpZm5kZWYgX19GUF9GUkFDX0FERF80Ci0jZGVmaW5lIF9fRlBfRlJBQ19BRERfNChyMyxyMixyMSxyMCx4Myx4Mix4MSx4MCx5Myx5Mix5MSx5MCkJXAotICBkbyB7CQkJCQkJCQlcCi0gICAgaW50IF9jMSwgX2MyLCBfYzM7CQkJCQkJXAotICAgIHIwID0geDAgKyB5MDsJCQkJCQlcCi0gICAgX2MxID0gcjAgPCB4MDsJCQkJCQlcCi0gICAgcjEgPSB4MSArIHkxOwkJCQkJCVwKLSAgICBfYzIgPSByMSA8IHgxOwkJCQkJCVwKLSAgICByMSArPSBfYzE7CQkJCQkJCVwKLSAgICBfYzIgfD0gcjEgPCBfYzE7CQkJCQkJXAotICAgIHIyID0geDIgKyB5MjsJCQkJCQlcCi0gICAgX2MzID0gcjIgPCB4MjsJCQkJCQlcCi0gICAgcjIgKz0gX2MyOwkJCQkJCQlcCi0gICAgX2MzIHw9IHIyIDwgX2MyOwkJCQkJCVwKLSAgICByMyA9IHgzICsgeTMgKyBfYzM7CQkJCQkJXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZm5kZWYgX19GUF9GUkFDX1NVQl80Ci0jZGVmaW5lIF9fRlBfRlJBQ19TVUJfNChyMyxyMixyMSxyMCx4Myx4Mix4MSx4MCx5Myx5Mix5MSx5MCkJXAotICBkbyB7CQkJCQkJCQlcCi0gICAgaW50IF9jMSwgX2MyLCBfYzM7CQkJCQkJXAotICAgIHIwID0geDAgLSB5MDsJCQkJCQlcCi0gICAgX2MxID0gcjAgPiB4MDsJCQkJCQlcCi0gICAgcjEgPSB4MSAtIHkxOwkJCQkJCVwKLSAgICBfYzIgPSByMSA+IHgxOwkJCQkJCVwKLSAgICByMSAtPSBfYzE7CQkJCQkJCVwKLSAgICBfYzIgfD0gcjEgPiBfYzE7CQkJCQkJXAotICAgIHIyID0geDIgLSB5MjsJCQkJCQlcCi0gICAgX2MzID0gcjIgPiB4MjsJCQkJCQlcCi0gICAgcjIgLT0gX2MyOwkJCQkJCQlcCi0gICAgX2MzIHw9IHIyID4gX2MyOwkJCQkJCVwKLSAgICByMyA9IHgzIC0geTMgLSBfYzM7CQkJCQkJXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZm5kZWYgX19GUF9GUkFDX0FERElfNAotLyogSSBhbHdheXMgd2FudGVkIHRvIGJlIGEgbGlzcCBwcm9ncmFtbWVyIDotPiAqLwotI2RlZmluZSBfX0ZQX0ZSQUNfQURESV80KHgzLHgyLHgxLHgwLGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoeDMgKz0gKCh4MiArPSAoKHgxICs9ICgoeDAgKz0gaSkgPCB4MCkpIDwgeDEpIDwgeDIpKSkKLSNlbmRpZgotCi0vKiBDb252ZXJ0IEZQIHZhbHVlcyBiZXR3ZWVuIHdvcmQgc2l6ZXMuIFRoaXMgYXBwZWFycyB0byBiZSBtb3JlCi0gKiBjb21wbGljYXRlZCB0aGFuIEknZCBoYXZlIGV4cGVjdGVkIGl0IHRvIGJlLCBzbyB0aGVzZSBtaWdodCBiZQotICogd3JvbmcuLi4gVGhlc2UgbWFjcm9zIGFyZSBpbiBhbnkgY2FzZSBzb21ld2hhdCBib2d1cyBiZWNhdXNlIHRoZXkKLSAqIHVzZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhcmlvdXMgRlJBQ19uIHZhcmlhYmxlcyBsb29rIGxpa2UKLSAqIGludGVybmFsbHkgW2VnLCB0aGF0IDIgd29yZCB2YXJzIGFyZSBYX2YwIGFuZCB4X2YxXS4gQnV0IHNvIGRvCi0gKiB0aGUgb25lcyBpbiBvcC0yLmggYW5kIG9wLTEuaC4KLSAqLwotI2RlZmluZSBfRlBfRlJBQ19DT05WXzFfNChkZnMsIHNmcywgRCwgUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBfRlBfRlJBQ19TUlNfNChTLCAoX0ZQX1dGUkFDQklUU18jI3NmcyAtIF9GUF9XRlJBQ0JJVFNfIyNkZnMpLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgX0ZQX1dGUkFDQklUU18jI3Nmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBEIyNfZiA9IFMjI19mWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfRlBfRlJBQ19DT05WXzJfNChkZnMsIHNmcywgRCwgUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBfRlBfRlJBQ19TUlNfNChTLCAoX0ZQX1dGUkFDQklUU18jI3NmcyAtIF9GUF9XRlJBQ0JJVFNfIyNkZnMpLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgX0ZQX1dGUkFDQklUU18jI3Nmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBEIyNfZjAgPSBTIyNfZlswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgRCMjX2YxID0gUyMjX2ZbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8qIEFzc2VtYmx5L2Rpc2Fzc2VtYmx5IGZvciBjb252ZXJ0aW5nIHRvL2Zyb20gaW50ZWdyYWwgdHlwZXMuCi0gKiBObyBzaGlmdGluZyBvciBvdmVyZmxvdyBoYW5kbGVkIGhlcmUuCi0gKi8KLS8qIFB1dCB0aGUgRlAgdmFsdWUgWCBpbnRvIHIsIHdoaWNoIGlzIGFuIGludGVnZXIgb2Ygc2l6ZSByc2l6ZS4gKi8KLSNkZWZpbmUgX0ZQX0ZSQUNfQVNTRU1CTEVfNChyLCBYLCByc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocnNpemUgPD0gX0ZQX1dfVFlQRV9TSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPSBYIyNfZlswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChyc2l6ZSA8PSAyKl9GUF9XX1RZUEVfU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPSBYIyNfZlsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPDw9IF9GUF9XX1RZUEVfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgKz0gWCMjX2ZbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIC8qIEknbSBmZWVsaW5nIGxhenkgc28gd2UgZGVhbCB3aXRoIGludCA9PSAzd29yZHMgKGltcGxhdXNpYmxlKSovIFwKLSAgICAgIC8qIGFuZCBpbnQgPT0gNHdvcmRzIGFzIGEgc2luZ2xlIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICovIFwKLSAgICAgIHIgPSBYIyNfZlszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPDw9IF9GUF9XX1RZUEVfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgKz0gWCMjX2ZbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPDw9IF9GUF9XX1RZUEVfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgKz0gWCMjX2ZbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgPDw9IF9GUF9XX1RZUEVfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHIgKz0gWCMjX2ZbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotLyogIk5vIGRpc2Fzc2VtYmxlIE51bWJlciBGaXZlISIgKi8KLS8qIG1vdmUgYW4gaW50ZWdlciBvZiBzaXplIHJzaXplIGludG8gWCdzIGZyYWN0aW9uYWwgcGFydC4gV2UgcmVseSBvbgotICogdGhlIF9mW10gYXJyYXkgY29uc2lzdGluZyBvZiB3b3JkcyBvZiBzaXplIF9GUF9XX1RZUEVfU0laRSB0byBhdm9pZAotICogaGF2aW5nIHRvIG1hc2sgdGhlIHZhbHVlcyB3ZSBzdG9yZSBpbnRvIGl0LgotICovCi0jZGVmaW5lIF9GUF9GUkFDX0RJU0FTU0VNQkxFXzQoWCwgciwgcnNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgWCMjX2ZbMF0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgWCMjX2ZbMV0gPSAocnNpemUgPD0gX0ZQX1dfVFlQRV9TSVpFID8gMCA6IHIgPj4gX0ZQX1dfVFlQRV9TSVpFKTsgICBcCi0gICAgWCMjX2ZbMl0gPSAocnNpemUgPD0gMipfRlBfV19UWVBFX1NJWkUgPyAwIDogciA+PiAyKl9GUF9XX1RZUEVfU0laRSk7IFwKLSAgICBYIyNfZlszXSA9IChyc2l6ZSA8PSAzKl9GUF9XX1RZUEVfU0laRSA/IDAgOiByID4+IDMqX0ZQX1dfVFlQRV9TSVpFKTsgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9GUF9GUkFDX0NPTlZfNF8xKGRmcywgc2ZzLCBELCBTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEQjI19mWzBdID0gUyMjX2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEQjI19mWzFdID0gRCMjX2ZbMl0gPSBEIyNfZlszXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIF9GUF9GUkFDX1NMTF80KEQsIChfRlBfV0ZSQUNCSVRTXyMjZGZzIC0gX0ZQX1dGUkFDQklUU18jI3NmcykpOyAgICBcCi0gICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9GUF9GUkFDX0NPTlZfNF8yKGRmcywgc2ZzLCBELCBTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEQjI19mWzBdID0gUyMjX2YwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEQjI19mWzFdID0gUyMjX2YxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEQjI19mWzJdID0gRCMjX2ZbM10gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIF9GUF9GUkFDX1NMTF80KEQsIChfRlBfV0ZSQUNCSVRTXyMjZGZzIC0gX0ZQX1dGUkFDQklUU18jI3NmcykpOyAgICBcCi0gICB9IHdoaWxlICgwKQotCi0vKiBGSVhNRSEgVGhpcyBoYXMgdG8gYmUgd3JpdHRlbiAqLwotI2RlZmluZSBfRlBfU1FSVF9NRUFUXzQoUiwgUywgVCwgWCwgcSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9vcC1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9vcC1jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiODJiNi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvb3AtY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotI2RlZmluZSBfRlBfREVDTCh3YywgWCkJCQlcCi0gIF9GUF9JX1RZUEUgWCMjX2MsIFgjI19zLCBYIyNfZTsJXAotICBfRlBfRlJBQ19ERUNMXyMjd2MoWCkKLQotLyoKLSAqIEZpbmlzaCB0cnVlbHkgdW5wYWNraW5nIGEgbmF0aXZlIGZwIHZhbHVlIGJ5IGNsYXNzaWZ5aW5nIHRoZSBraW5kCi0gKiBvZiBmcCB2YWx1ZSBhbmQgbm9ybWFsaXppbmcgYm90aCB0aGUgZXhwb25lbnQgYW5kIHRoZSBmcmFjdGlvbi4KLSAqLwotCi0jZGVmaW5lIF9GUF9VTlBBQ0tfQ0FOT05JQ0FMKGZzLCB3YywgWCkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0gIHN3aXRjaCAoWCMjX2UpCQkJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgZGVmYXVsdDoJCQkJCQkJCVwKLSAgICBfRlBfRlJBQ19ISUdIXyMjd2MoWCkgfD0gX0ZQX0lNUExCSVRfIyNmczsJCQkJXAotICAgIF9GUF9GUkFDX1NMTF8jI3djKFgsIF9GUF9XT1JLQklUUyk7CQkJCQlcCi0gICAgWCMjX2UgLT0gX0ZQX0VYUEJJQVNfIyNmczsJCQkJCQlcCi0gICAgWCMjX2MgPSBGUF9DTFNfTk9STUFMOwkJCQkJCVwKLSAgICBicmVhazsJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgY2FzZSAwOgkJCQkJCQkJXAotICAgIGlmIChfRlBfRlJBQ19aRVJPUF8jI3djKFgpKQkJCQkJCVwKLSAgICAgIFgjI19jID0gRlBfQ0xTX1pFUk87CQkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JLyogYSBkZW5vcm1hbGl6ZWQgbnVtYmVyICovCQkJCQlcCi0JX0ZQX0lfVFlQRSBfc2hpZnQ7CQkJCQkJXAotCV9GUF9GUkFDX0NMWl8jI3djKF9zaGlmdCwgWCk7CQkJCQlcCi0JX3NoaWZ0IC09IF9GUF9GUkFDWEJJVFNfIyNmczsJCQkJCVwKLQlfRlBfRlJBQ19TTExfIyN3YyhYLCAoX3NoaWZ0K19GUF9XT1JLQklUUykpOwkJCVwKLQlYIyNfZSAtPSBfRlBfRVhQQklBU18jI2ZzIC0gMSArIF9zaGlmdDsJCQkJXAotCVgjI19jID0gRlBfQ0xTX05PUk1BTDsJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIGJyZWFrOwkJCQkJCQkJXAotCQkJCQkJCQkJXAotICBjYXNlIF9GUF9FWFBNQVhfIyNmczoJCQkJCQkJXAotICAgIGlmIChfRlBfRlJBQ19aRVJPUF8jI3djKFgpKQkJCQkJCVwKLSAgICAgIFgjI19jID0gRlBfQ0xTX0lORjsJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgLyogd2UgZG9uJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHNpZ25hbGluZyBhbmQgcXVpZXQgbmFucyAqLwlcCi0gICAgICBYIyNfYyA9IEZQX0NMU19OQU47CQkJCQkJXAotICAgIGJyZWFrOwkJCQkJCQkJXAotICB9CQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotCi0vKgotICogQmVmb3JlIHBhY2tpbmcgdGhlIGJpdHMgYmFjayBpbnRvIHRoZSBuYXRpdmUgZnAgcmVzdWx0LCB0YWtlIGNhcmUKLSAqIG9mIHN1Y2ggbXVuZGFuZSB0aGluZ3MgYXMgcm91bmRpbmcgYW5kIG92ZXJmbG93LiAgQWxzbywgZm9yIHNvbWUKLSAqIGtpbmRzIG9mIGZwIHZhbHVlcywgdGhlIG9yaWdpbmFsIHBhcnRzIG1heSBub3QgaGF2ZSBiZWVuIGZ1bGx5Ci0gKiBleHRyYWN0ZWQgLS0gYnV0IHRoYXQgaXMgb2ssIHdlIGNhbiByZWdlbmVyYXRlIHRoZW0gbm93LgotICovCi0KLSNkZWZpbmUgX0ZQX1BBQ0tfQ0FOT05JQ0FMKGZzLCB3YywgWCkJCQkJXAotKHtpbnQgX19yZXQgPSAwOwkJCQkJCVwKLSAgc3dpdGNoIChYIyNfYykJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgY2FzZSBGUF9DTFNfTk9STUFMOgkJCQkJCVwKLSAgICBYIyNfZSArPSBfRlBfRVhQQklBU18jI2ZzOwkJCQkJXAotICAgIGlmIChYIyNfZSA+IDApCQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCV9fcmV0IHw9IF9GUF9ST1VORCh3YywgWCk7CQkJCVwKLQlpZiAoX0ZQX0ZSQUNfT1ZFUlBfIyN3YyhmcywgWCkpCQkJCVwKLQkgIHsJCQkJCQkJXAotCSAgICBfRlBfRlJBQ19TUkxfIyN3YyhYLCAoX0ZQX1dPUktCSVRTKzEpKTsJCVwKLQkgICAgWCMjX2UrKzsJCQkJCQlcCi0JICB9CQkJCQkJCVwKLQllbHNlCQkJCQkJCVwKLQkgIF9GUF9GUkFDX1NSTF8jI3djKFgsIF9GUF9XT1JLQklUUyk7CQkJXAotCWlmIChYIyNfZSA+PSBfRlBfRVhQTUFYXyMjZnMpCQkJCVwKLQkgIHsJCQkJCQkJXAotCSAgICAvKiBvdmVyZmxvdyB0byBpbmZpbml0eSAqLwkJCQlcCi0JICAgIFgjI19lID0gX0ZQX0VYUE1BWF8jI2ZzOwkJCQlcCi0JICAgIF9GUF9GUkFDX1NFVF8jI3djKFgsIF9GUF9aRVJPRlJBQ18jI3djKTsJCVwKLSAgICAgICAgICAgIF9fcmV0IHw9IEVGTEFHX09WRVJGTE9XOwkJCQlcCi0JICB9CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCVwKLQkvKiB3ZSd2ZSBnb3QgYSBkZW5vcm1hbGl6ZWQgbnVtYmVyICovCQkJXAotCVgjI19lID0gLVgjI19lICsgMTsJCQkJCVwKLQlpZiAoWCMjX2UgPD0gX0ZQX1dGUkFDQklUU18jI2ZzKQkJCVwKLQkgIHsJCQkJCQkJXAotCSAgICBfRlBfRlJBQ19TUlNfIyN3YyhYLCBYIyNfZSwgX0ZQX1dGUkFDQklUU18jI2ZzKTsJXAotCSAgICBfRlBfRlJBQ19TTExfIyN3YyhYLCAxKTsJCQkJXAotCSAgICBpZiAoX0ZQX0ZSQUNfT1ZFUlBfIyN3YyhmcywgWCkpCQkJXAotCSAgICAgIHsJCQkJCQkJXAotCSAgICAgICAgWCMjX2UgPSAxOwkJCQkJXAotCSAgICAgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoWCwgX0ZQX1pFUk9GUkFDXyMjd2MpOwlcCi0JICAgICAgfQkJCQkJCQlcCi0JICAgIGVsc2UJCQkJCQlcCi0JICAgICAgewkJCQkJCQlcCi0JCVgjI19lID0gMDsJCQkJCVwKLQkJX0ZQX0ZSQUNfU1JMXyMjd2MoWCwgX0ZQX1dPUktCSVRTKzEpOwkJXAotICAgICAgICAgICAgICAgIF9fcmV0IHw9IEVGTEFHX1VOREVSRkxPVzsJCQlcCi0JICAgICAgfQkJCQkJCQlcCi0JICB9CQkJCQkJCVwKLQllbHNlCQkJCQkJCVwKLQkgIHsJCQkJCQkJXAotCSAgICAvKiB1bmRlcmZsb3cgdG8gemVybyAqLwkJCQlcCi0JICAgIFgjI19lID0gMDsJCQkJCQlcCi0JICAgIF9GUF9GUkFDX1NFVF8jI3djKFgsIF9GUF9aRVJPRlJBQ18jI3djKTsJCVwKLSAgICAgICAgICAgIF9fcmV0IHw9IEVGTEFHX1VOREVSRkxPVzsJCQkJXAotCSAgfQkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgYnJlYWs7CQkJCQkJCVwKLQkJCQkJCQkJXAotICBjYXNlIEZQX0NMU19aRVJPOgkJCQkJCVwKLSAgICBYIyNfZSA9IDA7CQkJCQkJCVwKLSAgICBfRlBfRlJBQ19TRVRfIyN3YyhYLCBfRlBfWkVST0ZSQUNfIyN3Yyk7CQkJXAotICAgIGJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCVwKLSAgY2FzZSBGUF9DTFNfSU5GOgkJCQkJCVwKLSAgICBYIyNfZSA9IF9GUF9FWFBNQVhfIyNmczsJCQkJCVwKLSAgICBfRlBfRlJBQ19TRVRfIyN3YyhYLCBfRlBfWkVST0ZSQUNfIyN3Yyk7CQkJXAotICAgIGJyZWFrOwkJCQkJCQlcCi0JCQkJCQkJCVwKLSAgY2FzZSBGUF9DTFNfTkFOOgkJCQkJCVwKLSAgICBYIyNfZSA9IF9GUF9FWFBNQVhfIyNmczsJCQkJCVwKLSAgICBpZiAoIV9GUF9LRUVQTkFORlJBQ1ApCQkJCQlcCi0gICAgICB7CQkJCQkJCQlcCi0JX0ZQX0ZSQUNfU0VUXyMjd2MoWCwgX0ZQX05BTkZSQUNfIyNmcyk7CQkJXAotCVgjI19zID0gMDsJCQkJCQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgZWxzZQkJCQkJCQlcCi0gICAgICBfRlBfRlJBQ19ISUdIXyMjd2MoWCkgfD0gX0ZQX1FOQU5CSVRfIyNmczsJCVwKLSAgICBicmVhazsJCQkJCQkJXAotICB9CQkJCQkJCQlcCi0gIF9fcmV0OwkJCQkJCQlcCi19KQotCi0KLS8qCi0gKiBNYWluIGFkZGl0aW9uIHJvdXRpbmUuICBUaGUgaW5wdXQgdmFsdWVzIHNob3VsZCBiZSBjb29rZWQuCi0gKi8KLQotI2RlZmluZSBfRlBfQUREKGZzLCB3YywgUiwgWCwgWSkJCQkJCSAgICAgXAotZG8gewkJCQkJCQkJCSAgICAgXAotICBzd2l0Y2ggKF9GUF9DTFNfQ09NQklORShYIyNfYywgWSMjX2MpKQkJCQkgICAgIFwKLSAgewkJCQkJCQkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19OT1JNQUwpOgkJCSAgICAgXAotICAgIHsJCQkJCQkJCQkgICAgIFwKLSAgICAgIC8qIHNoaWZ0IHRoZSBzbWFsbGVyIG51bWJlciBzbyB0aGF0IGl0cyBleHBvbmVudCBtYXRjaGVzIHRoZSBsYXJnZXIgKi8gXAotICAgICAgX0ZQX0lfVFlQRSBkaWZmID0gWCMjX2UgLSBZIyNfZTsJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0gICAgICBpZiAoZGlmZiA8IDApCQkJCQkJCSAgICAgXAotCXsJCQkJCQkJCSAgICAgXAotCSAgZGlmZiA9IC1kaWZmOwkJCQkJCQkgICAgIFwKLQkgIGlmIChkaWZmIDw9IF9GUF9XRlJBQ0JJVFNfIyNmcykJCQkJICAgICBcCi0JICAgIF9GUF9GUkFDX1NSU18jI3djKFgsIGRpZmYsIF9GUF9XRlJBQ0JJVFNfIyNmcyk7CQkgICAgIFwKLQkgIGVsc2UgaWYgKCFfRlBfRlJBQ19aRVJPUF8jI3djKFgpKQkJCQkgICAgIFwKLQkgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoWCwgX0ZQX01JTkZSQUNfIyN3Yyk7CQkJICAgICBcCi0JICBlbHNlCQkJCQkJCQkgICAgIFwKLQkgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoWCwgX0ZQX1pFUk9GUkFDXyMjd2MpOwkJCSAgICAgXAotCSAgUiMjX2UgPSBZIyNfZTsJCQkJCQkgICAgIFwKLQl9CQkJCQkJCQkgICAgIFwKLSAgICAgIGVsc2UJCQkJCQkJCSAgICAgXAotCXsJCQkJCQkJCSAgICAgXAotCSAgaWYgKGRpZmYgPiAwKQkJCQkJCQkgICAgIFwKLQkgICAgewkJCQkJCQkJICAgICBcCi0JICAgICAgaWYgKGRpZmYgPD0gX0ZQX1dGUkFDQklUU18jI2ZzKQkJCQkgICAgIFwKLQkgICAgICAgIF9GUF9GUkFDX1NSU18jI3djKFksIGRpZmYsIF9GUF9XRlJBQ0JJVFNfIyNmcyk7CQkgICAgIFwKLQkgICAgICBlbHNlIGlmICghX0ZQX0ZSQUNfWkVST1BfIyN3YyhZKSkJCQkJICAgICBcCi0JICAgICAgICBfRlBfRlJBQ19TRVRfIyN3YyhZLCBfRlBfTUlORlJBQ18jI3djKTsJCQkgICAgIFwKLQkgICAgICBlbHNlCQkJCQkJCSAgICAgXAotCSAgICAgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoWSwgX0ZQX1pFUk9GUkFDXyMjd2MpOwkJICAgICBcCi0JICAgIH0JCQkJCQkJCSAgICAgXAotCSAgUiMjX2UgPSBYIyNfZTsJCQkJCQkgICAgIFwKLQl9CQkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotICAgICAgUiMjX2MgPSBGUF9DTFNfTk9STUFMOwkJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0gICAgICBpZiAoWCMjX3MgPT0gWSMjX3MpCQkJCQkJICAgICBcCi0JewkJCQkJCQkJICAgICBcCi0JICBSIyNfcyA9IFgjI19zOwkJCQkJCSAgICAgXAotCSAgX0ZQX0ZSQUNfQUREXyMjd2MoUiwgWCwgWSk7CQkJCQkgICAgIFwKLQkgIGlmIChfRlBfRlJBQ19PVkVSUF8jI3djKGZzLCBSKSkJCQkJICAgICBcCi0JICAgIHsJCQkJCQkJCSAgICAgXAotCSAgICAgIF9GUF9GUkFDX1NSU18jI3djKFIsIDEsIF9GUF9XRlJBQ0JJVFNfIyNmcyk7CQkgICAgIFwKLQkgICAgICBSIyNfZSsrOwkJCQkJCQkgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICBcCi0JfQkJCQkJCQkJICAgICBcCi0gICAgICBlbHNlCQkJCQkJCQkgICAgIFwKLQl7CQkJCQkJCQkgICAgIFwKLQkgIFIjI19zID0gWCMjX3M7CQkJCQkJICAgICBcCi0JICBfRlBfRlJBQ19TVUJfIyN3YyhSLCBYLCBZKTsJCQkJCSAgICAgXAotCSAgaWYgKF9GUF9GUkFDX1pFUk9QXyMjd2MoUikpCQkJCQkgICAgIFwKLQkgICAgewkJCQkJCQkJICAgICBcCi0JICAgICAgLyogcmV0dXJuIGFuIGV4YWN0IHplcm8gKi8JCQkJICAgICBcCi0JICAgICAgaWYgKEZQX1JPVU5ETU9ERSA9PSBGUF9STkRfTUlORikJCQkJICAgICBcCi0JCVIjI19zIHw9IFkjI19zOwkJCQkJCSAgICAgXAotCSAgICAgIGVsc2UJCQkJCQkJICAgICBcCi0JCVIjI19zICY9IFkjI19zOwkJCQkJCSAgICAgXAotCSAgICAgIFIjI19jID0gRlBfQ0xTX1pFUk87CQkJCQkgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICBcCi0JICBlbHNlCQkJCQkJCQkgICAgIFwKLQkgICAgewkJCQkJCQkJICAgICBcCi0JICAgICAgaWYgKF9GUF9GUkFDX05FR1BfIyN3YyhSKSkJCQkJICAgICBcCi0JCXsJCQkJCQkJICAgICBcCi0JCSAgX0ZQX0ZSQUNfU1VCXyMjd2MoUiwgWSwgWCk7CQkJCSAgICAgXAotCQkgIFIjI19zID0gWSMjX3M7CQkJCQkgICAgIFwKLQkJfQkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotCSAgICAgIC8qIHJlbm9ybWFsaXplIGFmdGVyIHN1YnRyYWN0aW9uICovCQkJICAgICBcCi0JICAgICAgX0ZQX0ZSQUNfQ0xaXyMjd2MoZGlmZiwgUik7CQkJCSAgICAgXAotCSAgICAgIGRpZmYgLT0gX0ZQX1dGUkFDWEJJVFNfIyNmczsJCQkJICAgICBcCi0JICAgICAgaWYgKGRpZmYpCQkJCQkJCSAgICAgXAotCQl7CQkJCQkJCSAgICAgXAotCQkgIFIjI19lIC09IGRpZmY7CQkJCQkgICAgIFwKLQkJICBfRlBfRlJBQ19TTExfIyN3YyhSLCBkaWZmKTsJCQkJICAgICBcCi0JCX0JCQkJCQkJICAgICBcCi0JICAgIH0JCQkJCQkJCSAgICAgXAotCX0JCQkJCQkJCSAgICAgXAotICAgICAgYnJlYWs7CQkJCQkJCQkgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICBcCi0JCQkJCQkJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05BTixGUF9DTFNfTkFOKToJCQkJICAgICBcCi0gICAgX0ZQX0NIT09TRU5BTihmcywgd2MsIFIsIFgsIFkpOwkJCQkJICAgICBcCi0gICAgYnJlYWs7CQkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19aRVJPKToJCQkgICAgIFwKLSAgICBSIyNfZSA9IFgjI19lOwkJCQkJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05BTixGUF9DTFNfTk9STUFMKToJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05BTixGUF9DTFNfSU5GKToJCQkJICAgICBcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX1pFUk8pOgkJCQkgICAgIFwKLSAgICBfRlBfRlJBQ19DT1BZXyMjd2MoUiwgWCk7CQkJCQkJICAgICBcCi0gICAgUiMjX3MgPSBYIyNfczsJCQkJCQkJICAgICBcCi0gICAgUiMjX2MgPSBYIyNfYzsJCQkJCQkJICAgICBcCi0gICAgYnJlYWs7CQkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfWkVSTyxGUF9DTFNfTk9STUFMKToJCQkgICAgIFwKLSAgICBSIyNfZSA9IFkjI19lOwkJCQkJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05PUk1BTCxGUF9DTFNfTkFOKToJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX0lORixGUF9DTFNfTkFOKToJCQkJICAgICBcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19OQU4pOgkJCQkgICAgIFwKLSAgICBfRlBfRlJBQ19DT1BZXyMjd2MoUiwgWSk7CQkJCQkJICAgICBcCi0gICAgUiMjX3MgPSBZIyNfczsJCQkJCQkJICAgICBcCi0gICAgUiMjX2MgPSBZIyNfYzsJCQkJCQkJICAgICBcCi0gICAgYnJlYWs7CQkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19JTkYpOgkJCQkgICAgIFwKLSAgICBpZiAoWCMjX3MgIT0gWSMjX3MpCQkJCQkJCSAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgXAotCS8qICtJTkYgKyAtSU5GID0+IE5BTiAqLwkJCQkJICAgICBcCi0JX0ZQX0ZSQUNfU0VUXyMjd2MoUiwgX0ZQX05BTkZSQUNfIyNmcyk7CQkJCSAgICAgXAotCVIjI19zID0gWCMjX3MgXiBZIyNfczsJCQkJCQkgICAgIFwKLQlSIyNfYyA9IEZQX0NMU19OQU47CQkJCQkJICAgICBcCi0JYnJlYWs7CQkJCQkJCQkgICAgIFwKLSAgICAgIH0JCQkJCQkJCQkgICAgIFwKLSAgICAvKiBGQUxMVEhSVSAqLwkJCQkJCQkgICAgIFwKLQkJCQkJCQkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19OT1JNQUwpOgkJCSAgICAgXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19aRVJPKToJCQkJICAgICBcCi0gICAgUiMjX3MgPSBYIyNfczsJCQkJCQkJICAgICBcCi0gICAgUiMjX2MgPSBGUF9DTFNfSU5GOwkJCQkJCQkgICAgIFwKLSAgICBicmVhazsJCQkJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OT1JNQUwsRlBfQ0xTX0lORik6CQkJICAgICBcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19JTkYpOgkJCQkgICAgIFwKLSAgICBSIyNfcyA9IFkjI19zOwkJCQkJCQkgICAgIFwKLSAgICBSIyNfYyA9IEZQX0NMU19JTkY7CQkJCQkJCSAgICAgXAotICAgIGJyZWFrOwkJCQkJCQkJICAgICBcCi0JCQkJCQkJCQkgICAgIFwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX1pFUk8sRlBfQ0xTX1pFUk8pOgkJCSAgICAgXAotICAgIC8qIG1ha2Ugc3VyZSB0aGUgc2lnbiBpcyBjb3JyZWN0ICovCQkJCQkgICAgIFwKLSAgICBpZiAoRlBfUk9VTkRNT0RFID09IEZQX1JORF9NSU5GKQkJCQkJICAgICBcCi0gICAgICBSIyNfcyA9IFgjI19zIHwgWSMjX3M7CQkJCQkJICAgICBcCi0gICAgZWxzZQkJCQkJCQkJICAgICBcCi0gICAgICBSIyNfcyA9IFgjI19zICYgWSMjX3M7CQkJCQkJICAgICBcCi0gICAgUiMjX2MgPSBGUF9DTFNfWkVSTzsJCQkJCQkgICAgIFwKLSAgICBicmVhazsJCQkJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0gIGRlZmF1bHQ6CQkJCQkJCQkgICAgIFwKLSAgICBhYm9ydCgpOwkJCQkJCQkJICAgICBcCi0gIH0JCQkJCQkJCQkgICAgIFwKLX0gd2hpbGUgKDApCi0KLQotLyoKLSAqIE1haW4gbmVnYXRpb24gcm91dGluZS4gIEZJWE1FIC0tIHdoZW4gd2UgY2FyZSBhYm91dCBzZXR0aW5nIGV4Y2VwdGlvbgotICogYml0cyByZWxpYWJseSwgdGhpcyB3aWxsIG5vdCBkby4gIFdlIHNob3VsZCBleGFtaW5lIGFsbCBvZiB0aGUgZnAgY2xhc3Nlcy4KLSAqLwotCi0jZGVmaW5lIF9GUF9ORUcoZnMsIHdjLCBSLCBYKQkJXAotICBkbyB7CQkJCQlcCi0gICAgX0ZQX0ZSQUNfQ09QWV8jI3djKFIsIFgpOwkJXAotICAgIFIjI19jID0gWCMjX2M7CQkJXAotICAgIFIjI19lID0gWCMjX2U7CQkJXAotICAgIFIjI19zID0gMSBeIFgjI19zOwkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0vKgotICogTWFpbiBtdWx0aXBsaWNhdGlvbiByb3V0aW5lLiAgVGhlIGlucHV0IHZhbHVlcyBzaG91bGQgYmUgY29va2VkLgotICovCi0KLSNkZWZpbmUgX0ZQX01VTChmcywgd2MsIFIsIFgsIFkpCQkJXAotZG8gewkJCQkJCQlcCi0gIFIjI19zID0gWCMjX3MgXiBZIyNfczsJCQkJXAotICBzd2l0Y2ggKF9GUF9DTFNfQ09NQklORShYIyNfYywgWSMjX2MpKQkJXAotICB7CQkJCQkJCVwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05PUk1BTCxGUF9DTFNfTk9STUFMKToJXAotICAgIFIjI19jID0gRlBfQ0xTX05PUk1BTDsJCQkJXAotICAgIFIjI19lID0gWCMjX2UgKyBZIyNfZSArIDE7CQkJCVwKLQkJCQkJCQlcCi0gICAgX0ZQX01VTF9NRUFUXyMjZnMoUixYLFkpOwkJCQlcCi0JCQkJCQkJXAotICAgIGlmIChfRlBfRlJBQ19PVkVSUF8jI3djKGZzLCBSKSkJCQlcCi0gICAgICBfRlBfRlJBQ19TUlNfIyN3YyhSLCAxLCBfRlBfV0ZSQUNCSVRTXyMjZnMpOwlcCi0gICAgZWxzZQkJCQkJCVwKLSAgICAgIFIjI19lLS07CQkJCQkJXAotICAgIGJyZWFrOwkJCQkJCVwKLQkJCQkJCQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX05BTik6CQlcCi0gICAgX0ZQX0NIT09TRU5BTihmcywgd2MsIFIsIFgsIFkpOwkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTkFOLEZQX0NMU19OT1JNQUwpOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX0lORik6CQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX1pFUk8pOgkJXAotICAgIFIjI19zID0gWCMjX3M7CQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19JTkYpOgkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19OT1JNQUwpOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19OT1JNQUwpOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19aRVJPKToJXAotICAgIF9GUF9GUkFDX0NPUFlfIyN3YyhSLCBYKTsJCQkJXAotICAgIFIjI19jID0gWCMjX2M7CQkJCQlcCi0gICAgYnJlYWs7CQkJCQkJXAotCQkJCQkJCVwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05PUk1BTCxGUF9DTFNfTkFOKToJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19OQU4pOgkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfWkVSTyxGUF9DTFNfTkFOKToJCVwKLSAgICBSIyNfcyA9IFkjI19zOwkJCQkJXAotCQkJCQkJCVwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX05PUk1BTCxGUF9DTFNfSU5GKToJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19aRVJPKToJXAotICAgIF9GUF9GUkFDX0NPUFlfIyN3YyhSLCBZKTsJCQkJXAotICAgIFIjI19jID0gWSMjX2M7CQkJCQlcCi0gICAgYnJlYWs7CQkJCQkJXAotCQkJCQkJCVwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX0lORixGUF9DTFNfWkVSTyk6CQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19JTkYpOgkJXAotICAgIFIjI19jID0gRlBfQ0xTX05BTjsJCQkJCVwKLSAgICBfRlBfRlJBQ19TRVRfIyN3YyhSLCBfRlBfTkFORlJBQ18jI2ZzKTsJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBkZWZhdWx0OgkJCQkJCVwKLSAgICBhYm9ydCgpOwkJCQkJCVwKLSAgfQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0KLS8qCi0gKiBNYWluIGRpdmlzaW9uIHJvdXRpbmUuICBUaGUgaW5wdXQgdmFsdWVzIHNob3VsZCBiZSBjb29rZWQuCi0gKi8KLQotI2RlZmluZSBfRlBfRElWKGZzLCB3YywgUiwgWCwgWSkJCQlcCi1kbyB7CQkJCQkJCVwKLSAgUiMjX3MgPSBYIyNfcyBeIFkjI19zOwkJCQlcCi0gIHN3aXRjaCAoX0ZQX0NMU19DT01CSU5FKFgjI19jLCBZIyNfYykpCQlcCi0gIHsJCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19OT1JNQUwpOglcCi0gICAgUiMjX2MgPSBGUF9DTFNfTk9STUFMOwkJCQlcCi0gICAgUiMjX2UgPSBYIyNfZSAtIFkjI19lOwkJCQlcCi0JCQkJCQkJXAotICAgIF9GUF9ESVZfTUVBVF8jI2ZzKFIsWCxZKTsJCQkJXAotICAgIGJyZWFrOwkJCQkJCVwKLQkJCQkJCQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX05BTik6CQlcCi0gICAgX0ZQX0NIT09TRU5BTihmcywgd2MsIFIsIFgsIFkpOwkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTkFOLEZQX0NMU19OT1JNQUwpOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX0lORik6CQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19OQU4sRlBfQ0xTX1pFUk8pOgkJXAotICAgIFIjI19zID0gWCMjX3M7CQkJCQlcCi0gICAgX0ZQX0ZSQUNfQ09QWV8jI3djKFIsIFgpOwkJCQlcCi0gICAgUiMjX2MgPSBYIyNfYzsJCQkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19OQU4pOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19JTkYsRlBfQ0xTX05BTik6CQlcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19OQU4pOgkJXAotICAgIFIjI19zID0gWSMjX3M7CQkJCQlcCi0gICAgX0ZQX0ZSQUNfQ09QWV8jI3djKFIsIFkpOwkJCQlcCi0gICAgUiMjX2MgPSBZIyNfYzsJCQkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19JTkYpOglcCi0gIGNhc2UgX0ZQX0NMU19DT01CSU5FKEZQX0NMU19aRVJPLEZQX0NMU19JTkYpOgkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfWkVSTyxGUF9DTFNfTk9STUFMKToJXAotICAgIFIjI19jID0gRlBfQ0xTX1pFUk87CQkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfTk9STUFMLEZQX0NMU19aRVJPKToJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19aRVJPKToJCVwKLSAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX0lORixGUF9DTFNfTk9STUFMKToJXAotICAgIFIjI19jID0gRlBfQ0xTX0lORjsJCQkJCVwKLSAgICBicmVhazsJCQkJCQlcCi0JCQkJCQkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfSU5GLEZQX0NMU19JTkYpOgkJXAotICBjYXNlIF9GUF9DTFNfQ09NQklORShGUF9DTFNfWkVSTyxGUF9DTFNfWkVSTyk6CVwKLSAgICBSIyNfYyA9IEZQX0NMU19OQU47CQkJCQlcCi0gICAgX0ZQX0ZSQUNfU0VUXyMjd2MoUiwgX0ZQX05BTkZSQUNfIyNmcyk7CQlcCi0gICAgYnJlYWs7CQkJCQkJXAotCQkJCQkJCVwKLSAgZGVmYXVsdDoJCQkJCQlcCi0gICAgYWJvcnQoKTsJCQkJCQlcCi0gIH0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotCi0vKgotICogTWFpbiBkaWZmZXJlbnRpYWwgY29tcGFyaXNvbiByb3V0aW5lLiAgVGhlIGlucHV0cyBzaG91bGQgYmUgcmF3IG5vdAotICogY29va2VkLiAgVGhlIHJldHVybiBpcyAtMSwwLDEgZm9yIG5vcm1hbCB2YWx1ZXMsIDIgb3RoZXJ3aXNlLgotICovCi0KLSNkZWZpbmUgX0ZQX0NNUChmcywgd2MsIHJldCwgWCwgWSwgdW4pCQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgLyogTkFOcyBhcmUgdW5vcmRlcmVkICovCQkJCQkJXAotICAgIGlmICgoWCMjX2UgPT0gX0ZQX0VYUE1BWF8jI2ZzICYmICFfRlBfRlJBQ19aRVJPUF8jI3djKFgpKQkJXAotCXx8IChZIyNfZSA9PSBfRlBfRVhQTUFYXyMjZnMgJiYgIV9GUF9GUkFDX1pFUk9QXyMjd2MoWSkpKQlcCi0gICAgICB7CQkJCQkJCQkJXAotCXJldCA9IHVuOwkJCQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0gICAgICAgIGludCBfX3hfemVybyA9ICghWCMjX2UgJiYgX0ZQX0ZSQUNfWkVST1BfIyN3YyhYKSkgPyAxIDogMDsJXAotICAgICAgICBpbnQgX195X3plcm8gPSAoIVkjI19lICYmIF9GUF9GUkFDX1pFUk9QXyMjd2MoWSkpID8gMSA6IDA7CVwKLQkJCQkJCQkJCVwKLQlpZiAoX194X3plcm8gJiYgX195X3plcm8pCQkJCQlcCi0JICByZXQgPSAwOwkJCQkJCQlcCi0JZWxzZSBpZiAoX194X3plcm8pCQkJCQkJXAotCSAgcmV0ID0gWSMjX3MgPyAxIDogLTE7CQkJCQkJXAotCWVsc2UgaWYgKF9feV96ZXJvKQkJCQkJCVwKLQkgIHJldCA9IFgjI19zID8gLTEgOiAxOwkJCQkJCVwKLQllbHNlIGlmIChYIyNfcyAhPSBZIyNfcykJCQkJCVwKLQkgIHJldCA9IFgjI19zID8gLTEgOiAxOwkJCQkJCVwKLQllbHNlIGlmIChYIyNfZSA+IFkjI19lKQkJCQkJCVwKLQkgIHJldCA9IFgjI19zID8gLTEgOiAxOwkJCQkJCVwKLQllbHNlIGlmIChYIyNfZSA8IFkjI19lKQkJCQkJCVwKLQkgIHJldCA9IFgjI19zID8gMSA6IC0xOwkJCQkJCVwKLQllbHNlIGlmIChfRlBfRlJBQ19HVF8jI3djKFgsIFkpKQkJCQlcCi0JICByZXQgPSBYIyNfcyA/IC0xIDogMTsJCQkJCQlcCi0JZWxzZSBpZiAoX0ZQX0ZSQUNfR1RfIyN3YyhZLCBYKSkJCQkJXAotCSAgcmV0ID0gWCMjX3MgPyAxIDogLTE7CQkJCQkJXAotCWVsc2UJCQkJCQkJCVwKLQkgIHJldCA9IDA7CQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLQotLyogU2ltcGxpZmljYXRpb24gZm9yIHN0cmljdCBlcXVhbGl0eS4gICovCi0KLSNkZWZpbmUgX0ZQX0NNUF9FUShmcywgd2MsIHJldCwgWCwgWSkJCQkJCSAgXAotICBkbyB7CQkJCQkJCQkJICBcCi0gICAgLyogTkFOcyBhcmUgdW5vcmRlcmVkICovCQkJCQkJICBcCi0gICAgaWYgKChYIyNfZSA9PSBfRlBfRVhQTUFYXyMjZnMgJiYgIV9GUF9GUkFDX1pFUk9QXyMjd2MoWCkpCQkgIFwKLQl8fCAoWSMjX2UgPT0gX0ZQX0VYUE1BWF8jI2ZzICYmICFfRlBfRlJBQ19aRVJPUF8jI3djKFkpKSkJICBcCi0gICAgICB7CQkJCQkJCQkJICBcCi0JcmV0ID0gMTsJCQkJCQkJICBcCi0gICAgICB9CQkJCQkJCQkJICBcCi0gICAgZWxzZQkJCQkJCQkJICBcCi0gICAgICB7CQkJCQkJCQkJICBcCi0JcmV0ID0gIShYIyNfZSA9PSBZIyNfZQkJCQkJCSAgXAotCQkmJiBfRlBfRlJBQ19FUV8jI3djKFgsIFkpCQkJCSAgXAotCQkmJiAoWCMjX3MgPT0gWSMjX3MgfHwgIVgjI19lICYmIF9GUF9GUkFDX1pFUk9QXyMjd2MoWCkpKTsgXAotICAgICAgfQkJCQkJCQkJCSAgXAotICB9IHdoaWxlICgwKQotCi0vKgotICogTWFpbiBzcXVhcmUgcm9vdCByb3V0aW5lLiAgVGhlIGlucHV0IHZhbHVlIHNob3VsZCBiZSBjb29rZWQuCi0gKi8KLQotI2RlZmluZSBfRlBfU1FSVChmcywgd2MsIFIsIFgpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgICBfRlBfRlJBQ19ERUNMXyMjd2MoVCk7IF9GUF9GUkFDX0RFQ0xfIyN3YyhTKTsJCQlcCi0gICAgX0ZQX1dfVFlQRSBxOwkJCQkJCQlcCi0gICAgc3dpdGNoIChYIyNfYykJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgY2FzZSBGUF9DTFNfTkFOOgkJCQkJCQlcCi0gICAgCVIjI19zID0gMDsJCQkJCQkJXAotICAgIAlSIyNfYyA9IEZQX0NMU19OQU47CQkJCQkJXAotICAgIAlfRlBfRlJBQ19TRVRfIyN3YyhYLCBfRlBfWkVST0ZSQUNfIyN3Yyk7CQkJXAotICAgIAlicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIEZQX0NMU19JTkY6CQkJCQkJCVwKLSAgICAJaWYgKFgjI19zKQkJCQkJCQlcCi0gICAgCSAgewkJCQkJCQkJXAotICAgIAkgICAgUiMjX3MgPSAwOwkJCQkJCQlcCi0JICAgIFIjI19jID0gRlBfQ0xTX05BTjsgLyogc05BTiAqLwkJCQlcCi0gICAgCSAgfQkJCQkJCQkJXAotICAgIAllbHNlCQkJCQkJCQlcCi0gICAgCSAgewkJCQkJCQkJXAotICAgIAkgICAgUiMjX3MgPSAwOwkJCQkJCQlcCi0gICAgCSAgICBSIyNfYyA9IEZQX0NMU19JTkY7IC8qIHNxcnQoK2luZikgPSAraW5mICovCQkJXAotICAgIAkgIH0JCQkJCQkJCVwKLSAgICAJYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBGUF9DTFNfWkVSTzoJCQkJCQkJXAotCVIjI19zID0gWCMjX3M7CQkJCQkJCVwKLSAgICAJUiMjX2MgPSBGUF9DTFNfWkVSTzsgLyogc3FydCgrLTApID0gKy0wICovCQkJXAotCWJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgRlBfQ0xTX05PUk1BTDoJCQkJCQkJXAotICAgIAlSIyNfcyA9IDA7CQkJCQkJCVwKLSAgICAgICAgaWYgKFgjI19zKQkJCQkJCQlcCi0gICAgICAgICAgewkJCQkJCQkJXAotCSAgICBSIyNfYyA9IEZQX0NMU19OQU47IC8qIHNOQU4gKi8JCQkJXAotCSAgICBicmVhazsJCQkJCQkJXAotICAgICAgICAgIH0JCQkJCQkJCVwKLSAgICAJUiMjX2MgPSBGUF9DTFNfTk9STUFMOwkJCQkJCVwKLSAgICAgICAgaWYgKFgjI19lICYgMSkJCQkJCQkJXAotICAgICAgICAgIF9GUF9GUkFDX1NMTF8jI3djKFgsIDEpOwkJCQkJXAotICAgICAgICBSIyNfZSA9IFgjI19lID4+IDE7CQkJCQkJXAotICAgICAgICBfRlBfRlJBQ19TRVRfIyN3YyhTLCBfRlBfWkVST0ZSQUNfIyN3Yyk7CQkJXAotICAgICAgICBfRlBfRlJBQ19TRVRfIyN3YyhSLCBfRlBfWkVST0ZSQUNfIyN3Yyk7CQkJXAotICAgICAgICBxID0gX0ZQX09WRVJGTE9XXyMjZnM7CQkJCQkJXAotICAgICAgICBfRlBfRlJBQ19TTExfIyN3YyhYLCAxKTsJCQkJCVwKLSAgICAgICAgX0ZQX1NRUlRfTUVBVF8jI3djKFIsIFMsIFQsIFgsIHEpOwkJCQlcCi0gICAgICAgIF9GUF9GUkFDX1NSTF8jI3djKFIsIDEpOwkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLS8qCi0gKiBDb252ZXJ0IGZyb20gRlAgdG8gaW50ZWdlcgotICovCi0KLS8qICJXaGVuIGEgTmFOLCBpbmZpbml0eSwgbGFyZ2UgcG9zaXRpdmUgYXJndW1lbnQgPj0gMjE0NzQ4MzY0OC4wLCBvcgotICogbGFyZ2UgbmVnYXRpdmUgYXJndW1lbnQgPD0gLTIxNDc0ODM2NDkuMCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciwKLSAqIHRoZSBpbnZhbGlkX2N1cnJlbnQgYml0Li4uc2hvdWxkIGJlIHNldCBhbmQgZnBfZXhjZXB0aW9uX0lFRUVfNzU0IHNob3VsZAotICogYmUgcmFpc2VkLiBJZiB0aGUgZmxvYXRpbmcgcG9pbnQgaW52YWxpZCB0cmFwIGlzIGRpc2FibGVkLCBubyB0cmFwIG9jY3VycwotICogYW5kIGEgbnVtZXJpY2FsIHJlc3VsdCBpcyBnZW5lcmF0ZWQ6IGlmIHRoZSBzaWduIGJpdCBvZiB0aGUgb3BlcmFuZAotICogaXMgMCwgdGhlIHJlc3VsdCBpcyAyMTQ3NDgzNjQ3OyBpZiB0aGUgc2lnbiBiaXQgb2YgdGhlIG9wZXJhbmQgaXMgMSwKLSAqIHRoZSByZXN1bHQgaXMgLTIxNDc0ODM2NDguIgotICogU2ltaWxhcmx5IGZvciBjb252ZXJzaW9uIHRvIGV4dGVuZGVkIGludHMsIGV4Y2VwdCB0aGF0IHRoZSBib3VuZGFyaWVzCi0gKiBhcmUgPj0gMl42MywgPD0gLSgyXjYzICsgMSksIGFuZCB0aGUgcmVzdWx0cyBhcmUgMl42MyArIDEgZm9yIHM9MCBhbmQKLSAqIC0yXjYzIGZvciBzPTEuCi0gKiAtLSBTUEFSQyBBcmNoaXRlY3R1cmUgTWFudWFsIFY5LCBBcHBlbmRpeCBCLCB3aGljaCBzcGVjaWZpZXMgaG93Ci0gKiBTUEFSQ3MgcmVzb2x2ZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgaW4gdGhlIElFRUUtNzU0IHNwZWMuCi0gKiBJIGRvbid0IGJlbGlldmUgdGhhdCB0aGUgY29kZSBiZWxvdyBmb2xsb3dzIHRoaXMuIEknbSBub3QgZXZlbiBzdXJlCi0gKiBpdCdzIHJpZ2h0IQotICogSXQgZG9lc24ndCBjb3BlIHdpdGggbmVlZGluZyB0byBjb252ZXJ0IHRvIGFuIG4gYml0IGludGVnZXIgd2hlbiB0aGVyZQotICogaXMgbm8gbiBiaXQgaW50ZWdlciB0eXBlLiBGb3J0dW5hdGVseSBnY2MgcHJvdmlkZXMgbG9uZyBsb25nIHNvIHRoaXMKLSAqIGlzbid0IGEgcHJvYmxlbSBmb3Igc3BhcmMzMi4KLSAqIEkgaGF2ZSwgaG93ZXZlciwgZml4ZWQgaXRzIE5hTiBoYW5kbGluZyB0byBjb25mb3JtIGFzIGFib3ZlLgotICogICAgICAgICAtLSBQTU0gMDIvMTk5OAotICogTkI6IHJzaWduZWQgaXMgbm90ICdpcyByIGRlY2xhcmVkIHNpZ25lZD8nIGJ1dCAnc2hvdWxkIHRoZSB2YWx1ZSBzdG9yZWQKLSAqIGluIHIgYmUgc2lnbmVkIG9yIHVuc2lnbmVkPycuIHIgaXMgYWx3YXlzKD8pIGRlY2xhcmVkIHVuc2lnbmVkLgotICogQ29tbWVudHMgYmVsb3cgYXJlIG1pbmUsIEJUVyAtLSBQTU0KLSAqLwotI2RlZmluZSBfRlBfVE9fSU5UKGZzLCB3YywgciwgWCwgcnNpemUsIHJzaWduZWQpCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIHN3aXRjaCAoWCMjX2MpCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0gICAgICBjYXNlIEZQX0NMU19OT1JNQUw6CQkJCQkJXAotCWlmIChYIyNfZSA8IDApCQkJCQkJCVwKLQkgIHsJCQkJCQkJCVwKLQkgIC8qIGNhc2UgRlBfQ0xTX05BTjogc2VlIGFib3ZlISAqLwkJCQlcCi0JICBjYXNlIEZQX0NMU19aRVJPOgkJCQkJCVwKLQkgICAgciA9IDA7CQkJCQkJCVwKLQkgIH0JCQkJCQkJCVwKLQllbHNlIGlmIChYIyNfZSA+PSByc2l6ZSAtIChyc2lnbmVkICE9IDApKQkJCVwKLQkgIHsJLyogb3ZlcmZsb3cgKi8JCQkJCQlcCi0JICBjYXNlIEZQX0NMU19OQU46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjYXNlIEZQX0NMU19JTkY6CQkJCQkJXAotCSAgICBpZiAocnNpZ25lZCkJCQkJCQlcCi0JICAgICAgewkJCQkJCQkJXAotCQlyID0gMTsJCQkJCQkJXAotCQlyIDw8PSByc2l6ZSAtIDE7CQkJCQlcCi0JCXIgLT0gMSAtIFgjI19zOwkJCQkJCVwKLQkgICAgICB9CQkJCQkJCQlcCi0JICAgIGVsc2UJCQkJCQkJXAotCSAgICAgIHsJCQkJCQkJCVwKLQkJciA9IDA7CQkJCQkJCVwKLQkJaWYgKCFYIyNfcykJCQkJCQlcCi0JCSAgciA9IH5yOwkJCQkJCVwKLQkgICAgICB9CQkJCQkJCQlcCi0JICB9CQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCSAgewkJCQkJCQkJXAotCSAgICBpZiAoX0ZQX1dfVFlQRV9TSVpFKndjIDwgcnNpemUpCQkJCVwKLQkgICAgICB7CQkJCQkJCQlcCi0JCV9GUF9GUkFDX0FTU0VNQkxFXyMjd2MociwgWCwgcnNpemUpOwkJCVwKLQkJciA8PD0gWCMjX2UgLSBfRlBfV0ZSQUNCSVRTXyMjZnM7CQkJXAotCSAgICAgIH0JCQkJCQkJCVwKLQkgICAgZWxzZQkJCQkJCQlcCi0JICAgICAgewkJCQkJCQkJXAotCQlpZiAoWCMjX2UgPj0gX0ZQX1dGUkFDQklUU18jI2ZzKQkJCVwKLQkJICBfRlBfRlJBQ19TTExfIyN3YyhYLCAoWCMjX2UgLSBfRlBfV0ZSQUNCSVRTXyMjZnMgKyAxKSk7XAotCQllbHNlCQkJCQkJCVwKLQkJICBfRlBfRlJBQ19TUkxfIyN3YyhYLCAoX0ZQX1dGUkFDQklUU18jI2ZzIC0gWCMjX2UgLSAxKSk7XAotCQlfRlBfRlJBQ19BU1NFTUJMRV8jI3djKHIsIFgsIHJzaXplKTsJCQlcCi0JICAgICAgfQkJCQkJCQkJXAotCSAgICBpZiAocnNpZ25lZCAmJiBYIyNfcykJCQkJCVwKLQkgICAgICByID0gLXI7CQkJCQkJCVwKLQkgIH0JCQkJCQkJCVwKLQlicmVhazsJCQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX0ZQX0ZST01fSU5UKGZzLCB3YywgWCwgciwgcnNpemUsIHJ0eXBlKQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBpZiAocikJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWCMjX2MgPSBGUF9DTFNfTk9STUFMOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoKFgjI19zID0gKHIgPCAwKSkpCQkJCQkJXAotCSAgciA9IC1yOwkJCQkJCQlcCi0JLyogTm90ZSB0aGF0IGByJyBpcyBub3cgY29uc2lkZXJlZCB1bnNpZ25lZCwgc28gd2UgZG9uJ3QgaGF2ZQlcCi0JICAgdG8gd29ycnkgYWJvdXQgdGhlIHNpbmdsZSBzaWduZWQgb3ZlcmZsb3cgY2FzZS4gICovCQlcCi0JCQkJCQkJCQlcCi0JaWYgKHJzaXplIDw9IF9GUF9XX1RZUEVfU0laRSkJCQkJCVwKLQkgIF9fRlBfQ0xaKFgjI19lLCByKTsJCQkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCSAgX19GUF9DTFpfMihYIyNfZSwgKF9GUF9XX1RZUEUpKHIgPj4gX0ZQX1dfVFlQRV9TSVpFKSwgCVwKLQkJICAgICAoX0ZQX1dfVFlQRSlyKTsJCQkJCVwKLQlpZiAocnNpemUgPCBfRlBfV19UWVBFX1NJWkUpCQkJCQlcCi0JCVgjI19lIC09IChfRlBfV19UWVBFX1NJWkUgLSByc2l6ZSk7CQkJXAotCVgjI19lID0gcnNpemUgLSBYIyNfZSAtIDE7CQkJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKF9GUF9GUkFDQklUU18jI2ZzIDwgcnNpemUgJiYgX0ZQX1dGUkFDQklUU18jI2ZzIDwgWCMjX2UpCVwKLQkgIF9fRlBfRlJBQ19TUlNfMShyLCAoWCMjX2UgLSBfRlBfV0ZSQUNCSVRTXyMjZnMpLCByc2l6ZSk7CVwKLQlyICY9IH4oKF9GUF9XX1RZUEUpMSA8PCBYIyNfZSk7CQkJCQlcCi0JX0ZQX0ZSQUNfRElTQVNTRU1CTEVfIyN3YyhYLCAoKHVuc2lnbmVkIHJ0eXBlKXIpLCByc2l6ZSk7CVwKLQlfRlBfRlJBQ19TTExfIyN3YyhYLCAoX0ZQX1dGUkFDQklUU18jI2ZzIC0gWCMjX2UgLSAxKSk7CQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JWCMjX2MgPSBGUF9DTFNfWkVSTywgWCMjX3MgPSAwOwkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotCi0jZGVmaW5lIEZQX0NPTlYoZGZzLHNmcyxkd2Msc3djLEQsUykJCQlcCi0gIGRvIHsJCQkJCQkJXAotICAgIF9GUF9GUkFDX0NPTlZfIyNkd2MjI18jI3N3YyhkZnMsIHNmcywgRCwgUyk7CVwKLSAgICBEIyNfZSA9IFMjI19lOwkJCQkJXAotICAgIEQjI19jID0gUyMjX2M7CQkJCQlcCi0gICAgRCMjX3MgPSBTIyNfczsJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotLyoKLSAqIEhlbHBlciBwcmltaXRpdmVzLgotICovCi0KLS8qIENvdW50IGxlYWRpbmcgemVyb3MgaW4gYSB3b3JkLiAgKi8KLQotI2lmbmRlZiBfX0ZQX0NMWgotI2lmIF9GUF9XX1RZUEVfU0laRSA8IDY0Ci0vKiB0aGlzIGlzIGp1c3QgdG8gc2h1dCB0aGUgY29tcGlsZXIgdXAgYWJvdXQgc2hpZnRzID4gd29yZCBsZW5ndGggLS0gUE1NIDAyLzE5OTggKi8KLSNkZWZpbmUgX19GUF9DTFoociwgeCkJCQkJXAotICBkbyB7CQkJCQkJXAotICAgIF9GUF9XX1RZUEUgX3QgPSAoeCk7CQkJXAotICAgIHIgPSBfRlBfV19UWVBFX1NJWkUgLSAxOwkJCVwKLSAgICBpZiAoX3QgPiAweGZmZmYpIHIgLT0gMTY7CQkJXAotICAgIGlmIChfdCA+IDB4ZmZmZikgX3QgPj49IDE2OwkJCVwKLSAgICBpZiAoX3QgPiAweGZmKSByIC09IDg7CQkJXAotICAgIGlmIChfdCA+IDB4ZmYpIF90ID4+PSA4OwkJCVwKLSAgICBpZiAoX3QgJiAweGYwKSByIC09IDQ7CQkJXAotICAgIGlmIChfdCAmIDB4ZjApIF90ID4+PSA0OwkJCVwKLSAgICBpZiAoX3QgJiAweGMpIHIgLT0gMjsJCQlcCi0gICAgaWYgKF90ICYgMHhjKSBfdCA+Pj0gMjsJCQlcCi0gICAgaWYgKF90ICYgMHgyKSByIC09IDE7CQkJXAotICB9IHdoaWxlICgwKQotI2Vsc2UgLyogbm90IF9GUF9XX1RZUEVfU0laRSA8IDY0ICovCi0jZGVmaW5lIF9fRlBfQ0xaKHIsIHgpCQkJCVwKLSAgZG8gewkJCQkJCVwKLSAgICBfRlBfV19UWVBFIF90ID0gKHgpOwkJCVwKLSAgICByID0gX0ZQX1dfVFlQRV9TSVpFIC0gMTsJCQlcCi0gICAgaWYgKF90ID4gMHhmZmZmZmZmZikgciAtPSAzMjsJCVwKLSAgICBpZiAoX3QgPiAweGZmZmZmZmZmKSBfdCA+Pj0gMzI7CQlcCi0gICAgaWYgKF90ID4gMHhmZmZmKSByIC09IDE2OwkJCVwKLSAgICBpZiAoX3QgPiAweGZmZmYpIF90ID4+PSAxNjsJCQlcCi0gICAgaWYgKF90ID4gMHhmZikgciAtPSA4OwkJCVwKLSAgICBpZiAoX3QgPiAweGZmKSBfdCA+Pj0gODsJCQlcCi0gICAgaWYgKF90ICYgMHhmMCkgciAtPSA0OwkJCVwKLSAgICBpZiAoX3QgJiAweGYwKSBfdCA+Pj0gNDsJCQlcCi0gICAgaWYgKF90ICYgMHhjKSByIC09IDI7CQkJXAotICAgIGlmIChfdCAmIDB4YykgX3QgPj49IDI7CQkJXAotICAgIGlmIChfdCAmIDB4MikgciAtPSAxOwkJCVwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBub3QgX0ZQX1dfVFlQRV9TSVpFIDwgNjQgKi8KLSNlbmRpZiAvKiBuZGVmIF9fRlBfQ0xaICovCi0KLSNkZWZpbmUgX0ZQX0RJVl9IRUxQX2ltbShxLCByLCBuLCBkKQkJXAotICBkbyB7CQkJCQkJXAotICAgIHEgPSBuIC8gZCwgciA9IG4gJSBkOwkJCVwKLSAgfSB3aGlsZSAoMCkKLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L3NmcC1tYWNoaW5lLmggYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvc2ZwLW1hY2hpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxN2Q4My4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvc2ZwLW1hY2hpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKiBNYWNoaW5lLWRlcGVuZGVudCBzb2Z0d2FyZSBmbG9hdGluZy1wb2ludCBkZWZpbml0aW9ucy4gIFBQQyB2ZXJzaW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi0gICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLSAgIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIEFjdHVhbGx5LCB0aGlzIGlzIGEgUFBDICgzMmJpdCkgdmVyc2lvbiwgd3JpdHRlbiBiYXNlZCBvbiB0aGUKLSAgIGkzODYsIHNwYXJjLCBhbmQgc3BhcmM2NCB2ZXJzaW9ucywgYnkgbWUsCi0gICBQZXRlciBNYXlkZWxsIChwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrKS4KLSAgIENvbW1lbnRzIGFyZSBieSBhbmQgbGFyZ2UgYWxzbyBtaW5lLCBhbHRob3VnaCB0aGV5IG1heSBiZSBpbmFjY3VyYXRlLgotCi0gICBJbiBwaWNraW5nIG91dCBhc20gZnJhZ21lbnRzIEkndmUgZ29uZSB3aXRoIHRoZSBsb3dlc3QgY29tbW9uCi0gICBkZW5vbWluYXRvciwgd2hpY2ggYWxzbyBoYXBwZW5zIHRvIGJlIHRoZSBoYXJkd2FyZSBJIGhhdmUgOi0+Ci0gICBUaGF0IGlzLCBhIFNQQVJDIHdpdGhvdXQgaGFyZHdhcmUgbXVsdGlwbHkgYW5kIGRpdmlkZS4KLSAqLwotCi0vKiBiYXNpYyB3b3JkIHNpemUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgX0ZQX1dfVFlQRV9TSVpFCQkzMgotI2RlZmluZSBfRlBfV19UWVBFCQl1bnNpZ25lZCBsb25nCi0jZGVmaW5lIF9GUF9XU19UWVBFCQlzaWduZWQgbG9uZwotI2RlZmluZSBfRlBfSV9UWVBFCQlsb25nCi0KLSNkZWZpbmUgX19sbF9CCQkJKChVV3R5cGUpIDEgPDwgKFdfVFlQRV9TSVpFIC8gMikpCi0jZGVmaW5lIF9fbGxfbG93cGFydCh0KQkJKChVV3R5cGUpICh0KSAmIChfX2xsX0IgLSAxKSkKLSNkZWZpbmUgX19sbF9oaWdocGFydCh0KQkoKFVXdHlwZSkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQotCi0vKiBZb3UgY2FuIG9wdGlvbmFsbHkgY29kZSBzb21lIHRoaW5ncyBsaWtlIGFkZGl0aW9uIGluIGFzbS4gRm9yCi0gKiBleGFtcGxlLCBpMzg2IGRlZmluZXMgX19GUF9GUkFDX0FERF8yIGFzIGFzbS4gSWYgeW91IGRvbid0Ci0gKiB0aGVuIHlvdSBnZXQgYSBmcmFnbWVudCBvZiBDIGNvZGUgW2lmIHlvdSBjaGFuZ2UgYW4gI2lmZGVmIDAKLSAqIGluIG9wLTIuaF0gb3IgYSBjYWxsIHRvIGFkZF9zc2FhYWEgKHNlZSBiZWxvdykuCi0gKiBHb29kIHBsYWNlcyB0byBsb29rIGZvciBhc20gZnJhZ21lbnRzIHRvIHVzZSBhcmUgZ2NjIGFuZCBnbGliYy4KLSAqIGdjYydzIGxvbmdsb25nLmggaXMgdXNlZnVsLgotICovCi0KLS8qIFdlIG5lZWQgdG8ga25vdyBob3cgdG8gbXVsdGlwbHkgYW5kIGRpdmlkZS4gSWYgdGhlIGhvc3Qgd29yZCBzaXplCi0gKiBpcyA+PSAyKmZyYWNiaXRzIHlvdSBjYW4gdXNlIEZQX01VTF9NRUFUX25faW1tKHQsUixYLFkpIHdoaWNoCi0gKiBjb2RlcyB0aGUgbXVsdGlwbHkgd2l0aCB3aGF0ZXZlciBnY2MgZG9lcyB0byAnYSAqIGInLgotICogX0ZQX01VTF9NRUFUX25fd2lkZSh0LFIsWCxZLGYpIGlzIHVzZWQgd2hlbiB5b3UgaGF2ZSBhbiBhc20KLSAqIGZ1bmN0aW9uIHRoYXQgY2FuIG11bHRpcGx5IHR3byAxVyB2YWx1ZXMgYW5kIGdldCBhIDJXIHJlc3VsdC4KLSAqIE90aGVyd2lzZSB5b3UncmUgc3R1Y2sgd2l0aCBfRlBfTVVMX01FQVRfbl9oYXJkKHQsUixYLFkpIHdoaWNoCi0gKiBkb2VzIGJpdHNoaWZ0aW5nIHRvIGF2b2lkIG92ZXJmbG93LgotICogRm9yIGRpdmlzaW9uIHRoZXJlIGlzIEZQX0RJVl9NRUFUX25faW1tKHQsUixYLFksZikgZm9yIHdvcmQgc2l6ZQotICogPj0gMipmcmFjYml0cywgd2hlcmUgZiBpcyBlaXRoZXIgX0ZQX0RJVl9IRUxQX2ltbSBvcgotICogX0ZQX0RJVl9IRUxQX2xkaXYgKHNlZSBvcC0xLmgpLgotICogX0ZQX0RJVl9NRUFUX3VkaXYoKSBpcyBpZiB5b3UgaGF2ZSBhc20gdG8gZG8gMlcvMVcgPT4gKDFXLCAxVykuCi0gKiBbR0NDIGFuZCBnbGliYyBoYXZlIGxvbmdsb25nLmggd2hpY2ggaGFzIHRoZSBhc20gbWFjcm8gdWRpdl9xcm5uZAotICogdG8gZG8gdGhpcy5dCi0gKiBJbiBnZW5lcmFsLCAnbicgaXMgdGhlIG51bWJlciBvZiB3b3JkcyByZXF1aXJlZCB0byBob2xkIHRoZSB0eXBlLAotICogYW5kICd0JyBpcyBlaXRoZXIgUywgRCBvciBRIGZvciBzaW5nbGUvZG91YmxlL3F1YWQuCi0gKiAgICAgICAgICAgLS0gUE1NCi0gKi8KLS8qIEV4YW1wbGU6IFNQQVJDNjQ6Ci0gKiAjZGVmaW5lIF9GUF9NVUxfTUVBVF9TKFIsWCxZKQlfRlBfTVVMX01FQVRfMV9pbW0oUyxSLFgsWSkKLSAqICNkZWZpbmUgX0ZQX01VTF9NRUFUX0QoUixYLFkpCV9GUF9NVUxfTUVBVF8xX3dpZGUoRCxSLFgsWSx1bXVsX3BwbW0pCi0gKiAjZGVmaW5lIF9GUF9NVUxfTUVBVF9RKFIsWCxZKQlfRlBfTVVMX01FQVRfMl93aWRlKFEsUixYLFksdW11bF9wcG1tKQotICoKLSAqICNkZWZpbmUgX0ZQX0RJVl9NRUFUX1MoUixYLFkpCV9GUF9ESVZfTUVBVF8xX2ltbShTLFIsWCxZLF9GUF9ESVZfSEVMUF9pbW0pCi0gKiAjZGVmaW5lIF9GUF9ESVZfTUVBVF9EKFIsWCxZKQlfRlBfRElWX01FQVRfMV91ZGl2KEQsUixYLFkpCi0gKiAjZGVmaW5lIF9GUF9ESVZfTUVBVF9RKFIsWCxZKQlfRlBfRElWX01FQVRfMl91ZGl2XzY0KFEsUixYLFkpCi0gKgotICogRXhhbXBsZTogaTM4NjoKLSAqICNkZWZpbmUgX0ZQX01VTF9NRUFUX1MoUixYLFkpICAgX0ZQX01VTF9NRUFUXzFfd2lkZShTLFIsWCxZLF9pMzg2X211bF8zMl82NCkKLSAqICNkZWZpbmUgX0ZQX01VTF9NRUFUX0QoUixYLFkpICAgX0ZQX01VTF9NRUFUXzJfd2lkZShELFIsWCxZLF9pMzg2X211bF8zMl82NCkKLSAqCi0gKiAjZGVmaW5lIF9GUF9ESVZfTUVBVF9TKFIsWCxZKSAgIF9GUF9ESVZfTUVBVF8xX3VkaXYoUyxSLFgsWSxfaTM4Nl9kaXZfNjRfMzIpCi0gKiAjZGVmaW5lIF9GUF9ESVZfTUVBVF9EKFIsWCxZKSAgIF9GUF9ESVZfTUVBVF8yX3VkaXZfNjQoRCxSLFgsWSkKLSAqLwotCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF9TKFIsWCxZKSAgIF9GUF9NVUxfTUVBVF8xX3dpZGUoUyxSLFgsWSx1bXVsX3BwbW0pCi0jZGVmaW5lIF9GUF9NVUxfTUVBVF9EKFIsWCxZKSAgIF9GUF9NVUxfTUVBVF8yX3dpZGUoRCxSLFgsWSx1bXVsX3BwbW0pCi0KLSNkZWZpbmUgX0ZQX0RJVl9NRUFUX1MoUixYLFkpICAgX0ZQX0RJVl9NRUFUXzFfdWRpdihTLFIsWCxZKQotI2RlZmluZSBfRlBfRElWX01FQVRfRChSLFgsWSkgICBfRlBfRElWX01FQVRfMl91ZGl2XzY0KEQsUixYLFkpCi0KLS8qIFRoZXNlIG1hY3JvcyBkZWZpbmUgd2hhdCBOYU4gbG9va3MgbGlrZS4gVGhleSdyZSBzdXBwb3NlZCB0byBleHBhbmQgdG8KLSAqIGEgY29tbWEtc2VwYXJhdGVkIHNldCBvZiAzMmJpdCB1bnNpZ25lZCBpbnRzIHRoYXQgZW5jb2RlIE5hTi4KLSAqLwotI2RlZmluZSBfRlBfTkFORlJBQ19TCQlfRlBfUU5BTkJJVF9TCi0jZGVmaW5lIF9GUF9OQU5GUkFDX0QJCV9GUF9RTkFOQklUX0QsIDAKLSNkZWZpbmUgX0ZQX05BTkZSQUNfUSAgICAgICAgICAgX0ZQX1FOQU5CSVRfUSwgMCwgMCwgMAotCi0jZGVmaW5lIF9GUF9LRUVQTkFORlJBQ1AgMQotCi0vKiBUaGlzIG1hY3JvIGFwcGVhcnMgdG8gYmUgY2FsbGVkIHdoZW4gYm90aCBYIGFuZCBZIGFyZSBOYU5zLCBhbmQKLSAqIGhhcyB0byBjaG9vc2Ugb25lIGFuZCBjb3B5IGl0IHRvIFIuIGkzODYgZ29lcyBmb3IgdGhlIGxhcmdlciBvZiB0aGUKLSAqIHR3bywgc3BhcmM2NCBqdXN0IHBpY2tzIFkuIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIGF0IGFsbCBzbyBJJ2xsCi0gKiBnbyB3aXRoIHNwYXJjNjQgYmVjYXVzZSBpdCdzIHNob3J0ZXIgOi0+ICAgLS0gUE1NCi0gKi8KLSNkZWZpbmUgX0ZQX0NIT09TRU5BTihmcywgd2MsIFIsIFgsIFkpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICBSIyNfcyA9IFkjI19zOwkJCQkJXAotICAgIF9GUF9GUkFDX0NPUFlfIyN3YyhSLFkpOwkJCQlcCi0gICAgUiMjX2MgPSBGUF9DTFNfTkFOOwkJCQkJXAotICB9IHdoaWxlICgwKQotCi0KLWV4dGVybiB2b2lkIGZwX3VucGFja19kKGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCi0JCQlsb25nICosIGxvbmcgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgIGZwX3BhY2tfZCh2b2lkICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcsIGxvbmcpOwotZXh0ZXJuIGludCAgZnBfcGFja19kcyh2b2lkICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcsIGxvbmcpOwotCi0jZGVmaW5lIF9fRlBfVU5QQUNLX1JBV18xKGZzLCBYLCB2YWwpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICB1bmlvbiBfRlBfVU5JT05fIyNmcyAqX2ZsbyA9CQkJXAotICAgIAkodW5pb24gX0ZQX1VOSU9OXyMjZnMgKil2YWw7CQkJXAotCQkJCQkJCVwKLSAgICBYIyNfZiA9IF9mbG8tPmJpdHMuZnJhYzsJCQkJXAotICAgIFgjI19lID0gX2Zsby0+Yml0cy5leHA7CQkJCVwKLSAgICBYIyNfcyA9IF9mbG8tPmJpdHMuc2lnbjsJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fRlBfVU5QQUNLX1JBV18yKGZzLCBYLCB2YWwpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICB1bmlvbiBfRlBfVU5JT05fIyNmcyAqX2ZsbyA9CQkJXAotICAgIAkodW5pb24gX0ZQX1VOSU9OXyMjZnMgKil2YWw7CQkJXAotCQkJCQkJCVwKLSAgICBYIyNfZjAgPSBfZmxvLT5iaXRzLmZyYWMwOwkJCQlcCi0gICAgWCMjX2YxID0gX2Zsby0+Yml0cy5mcmFjMTsJCQkJXAotICAgIFgjI19lICA9IF9mbG8tPmJpdHMuZXhwOwkJCQlcCi0gICAgWCMjX3MgID0gX2Zsby0+Yml0cy5zaWduOwkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19GUF9VTlBBQ0tfUyhYLHZhbCkJCVwKLSAgZG8gewkJCQkJXAotICAgIF9fRlBfVU5QQUNLX1JBV18xKFMsWCx2YWwpOwkJXAotICAgIF9GUF9VTlBBQ0tfQ0FOT05JQ0FMKFMsMSxYKTsJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fRlBfVU5QQUNLX0QoWCx2YWwpCQlcCi0JZnBfdW5wYWNrX2QoJlgjI19zLCAmWCMjX2YxLCAmWCMjX2YwLCAmWCMjX2UsICZYIyNfYywgdmFsKQotCi0jZGVmaW5lIF9fRlBfUEFDS19SQVdfMShmcywgdmFsLCBYKQkJCVwKLSAgZG8gewkJCQkJCQlcCi0gICAgdW5pb24gX0ZQX1VOSU9OXyMjZnMgKl9mbG8gPQkJCVwKLSAgICAJKHVuaW9uIF9GUF9VTklPTl8jI2ZzICopdmFsOwkJCVwKLQkJCQkJCQlcCi0gICAgX2Zsby0+Yml0cy5mcmFjID0gWCMjX2Y7CQkJCVwKLSAgICBfZmxvLT5iaXRzLmV4cCAgPSBYIyNfZTsJCQkJXAotICAgIF9mbG8tPmJpdHMuc2lnbiA9IFgjI19zOwkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19GUF9QQUNLX1JBV18yKGZzLCB2YWwsIFgpCQkJXAotICBkbyB7CQkJCQkJCVwKLSAgICB1bmlvbiBfRlBfVU5JT05fIyNmcyAqX2ZsbyA9CQkJXAotICAgIAkodW5pb24gX0ZQX1VOSU9OXyMjZnMgKil2YWw7CQkJXAotCQkJCQkJCVwKLSAgICBfZmxvLT5iaXRzLmZyYWMwID0gWCMjX2YwOwkJCQlcCi0gICAgX2Zsby0+Yml0cy5mcmFjMSA9IFgjI19mMTsJCQkJXAotICAgIF9mbG8tPmJpdHMuZXhwICAgPSBYIyNfZTsJCQkJXAotICAgIF9mbG8tPmJpdHMuc2lnbiAgPSBYIyNfczsJCQkJXAotICB9IHdoaWxlICgwKQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2RlZmluZSBfX0ZQVV9GUFNDUgkoY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCkKLQotLyogV2Ugb25seSBhY3R1YWxseSB3cml0ZSB0byB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAqIGlmIGV4Y2VwdGlvbnMgc2lnbmFsbGVkIChpZiBhbnkpIHdpbGwgbm90IHRyYXAuCi0gKi8KLSNkZWZpbmUgX19GUFVfRU5BQkxFRF9FWEMgXAotKHsJCQkJCQlcCi0JKF9fRlBVX0ZQU0NSID4+IDMpICYgMHgxZjsJXAotfSkKLQotI2RlZmluZSBfX0ZQVV9UUkFQX1AoYml0cykgXAotCSgoX19GUFVfRU5BQkxFRF9FWEMgJiAoYml0cykpICE9IDApCi0KLSNkZWZpbmUgX19GUF9QQUNLX1ModmFsLFgpCQkJXAotKHsgIGludCBfX2V4YyA9IF9GUF9QQUNLX0NBTk9OSUNBTChTLDEsWCk7CVwKLSAgICBpZighX19leGMgfHwgIV9fRlBVX1RSQVBfUChfX2V4YykpCQlcCi0gICAgICAgIF9fRlBfUEFDS19SQVdfMShTLHZhbCxYKTsJCVwKLSAgICBfX2V4YzsJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19GUF9QQUNLX0QodmFsLFgpCQkJXAotCWZwX3BhY2tfZCh2YWwsIFgjI19zLCBYIyNfZjEsIFgjI19mMCwgWCMjX2UsIFgjI19jKQotCi0jZGVmaW5lIF9fRlBfUEFDS19EUyh2YWwsWCkJCQlcCi0JZnBfcGFja19kcyh2YWwsIFgjI19zLCBYIyNfZjEsIFgjI19mMCwgWCMjX2UsIFgjI19jKQotCi0vKiBPYnRhaW4gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gKi8KLSNkZWZpbmUgRlBfUk9VTkRNT0RFCQkJXAotKHsJCQkJCVwKLQlfX0ZQVV9GUFNDUiAmIDB4MzsJCVwKLX0pCi0KLS8qIHRoZSBhc20gZnJhZ21lbnRzIGdvIGhlcmU6IGFsbCB0aGVzZSBhcmUgdGFrZW4gZnJvbSBnbGliYy0yLjAuNSdzCi0gKiBzdGRsaWIvbG9uZ2xvbmcuaAotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotLyogYWRkX3NzYWFhYSBpcyB1c2VkIGluIG9wLTIuaCBhbmQgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8KLSAqICNkZWZpbmUgYWRkX3NzYWFhYShzaCxzbCxhaCxhbCxiaCxibCkgKHNoID0gYWgrYmgrICgoIHNsID0gYWwrYmwpIDwgYWwpKQotICogYWRkX3NzYWFhYShoaWdoX3N1bSwgbG93X3N1bSwgaGlnaF9hZGRlbmRfMSwgbG93X2FkZGVuZF8xLAotICogaGlnaF9hZGRlbmRfMiwgbG93X2FkZGVuZF8yKSBhZGRzIHR3byBVV3R5cGUgaW50ZWdlcnMsIGNvbXBvc2VkIGJ5Ci0gKiBISUdIX0FEREVORF8xIGFuZCBMT1dfQURERU5EXzEsIGFuZCBISUdIX0FEREVORF8yIGFuZCBMT1dfQURERU5EXzIKLSAqIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfU1VNIGFuZCBMT1dfU1VNLiAgT3ZlcmZsb3cKLSAqIChpLmUuIGNhcnJ5IG91dCkgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSwgYW5kIGlzIGxvc3QuCi0gKi8KLSNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PSAwKQkJCQlcCi0gICAgICBfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiCQlcCi0JICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAotCSAgICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKLQkgICAgIDogIiVyIiAoKFVTSXR5cGUpKGFoKSksCQkJCQlcCi0JICAgICAgICIlciIgKChVU0l0eXBlKShhbCkpLAkJCQkJXAotCSAgICAgICAickkiICgoVVNJdHlwZSkoYmwpKSk7CQkJCQlcCi0gICAgZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKGJoKSAmJiAoYmgpID09fihVU0l0eXBlKSAwKQkJXAotICAgICAgX19hc21fXyAoInthJUk0fGFkZCVJNGN9ICUxLCUzLCU0XG5cdHthbWV8YWRkbWV9ICUwLCUyIgkJXAotCSAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwJCQkJCVwKLQkgICAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpCQkJCQlcCi0JICAgICA6ICIlciIgKChVU0l0eXBlKShhaCkpLAkJCQkJXAotCSAgICAgICAiJXIiICgoVVNJdHlwZSkoYWwpKSwJCQkJCVwKLQkgICAgICAgInJJIiAoKFVTSXR5cGUpKGJsKSkpOwkJCQkJXAotICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgIF9fYXNtX18gKCJ7YSVJNXxhZGQlSTVjfSAlMSwlNCwlNVxuXHR7YWV8YWRkZX0gJTAsJTIsJTMiCQlcCi0JICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAotCSAgICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKLQkgICAgIDogIiVyIiAoKFVTSXR5cGUpKGFoKSksCQkJCQlcCi0JICAgICAgICJyIiAoKFVTSXR5cGUpKGJoKSksCQkJCQlcCi0JICAgICAgICIlciIgKChVU0l0eXBlKShhbCkpLAkJCQkJXAotCSAgICAgICAickkiICgoVVNJdHlwZSkoYmwpKSk7CQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLS8qIHN1Yl9kZG1tc3MgaXMgdXNlZCBpbiBvcC0yLmggYW5kIHVkaXZtb2R0aTQuYyBhbmQgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8KLSAqICNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSAoc2ggPSBhaC1iaCAtICgoc2wgPSBhbC1ibCkgPiBhbCkpCi0gKiBzdWJfZGRtbXNzKGhpZ2hfZGlmZmVyZW5jZSwgbG93X2RpZmZlcmVuY2UsIGhpZ2hfbWludWVuZCwgbG93X21pbnVlbmQsCi0gKiBoaWdoX3N1YnRyYWhlbmQsIGxvd19zdWJ0cmFoZW5kKSBzdWJ0cmFjdHMgdHdvIHR3by13b3JkIFVXdHlwZSBpbnRlZ2VycywKLSAqIGNvbXBvc2VkIGJ5IEhJR0hfTUlOVUVORF8xIGFuZCBMT1dfTUlOVUVORF8xLCBhbmQgSElHSF9TVUJUUkFIRU5EXzIgYW5kCi0gKiBMT1dfU1VCVFJBSEVORF8yIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfRElGRkVSRU5DRQotICogYW5kIExPV19ESUZGRVJFTkNFLiAgT3ZlcmZsb3cgKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLAotICogYW5kIGlzIGxvc3QuCi0gKi8KLSNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhaCkgJiYgKGFoKSA9PSAwKQkJCQlcCi0gICAgICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7c2Z6ZXxzdWJmemV9ICUwLCUyIglcCi0JICAgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksCQkJCQlcCi0JCSAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKLQkgICAgICAgOiAiciIgKChVU0l0eXBlKShiaCkpLAkJCQkJXAotCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCi0JCSAiciIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKLSAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWgpICYmIChhaCkgPT1+KFVTSXR5cGUpIDApCQlcCi0gICAgICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7c2ZtZXxzdWJmbWV9ICUwLCUyIglcCi0JICAgICAgIDogIj1yIiAoKFVTSXR5cGUpKHNoKSksCQkJCQlcCi0JCSAiPSZyIiAoKFVTSXR5cGUpKHNsKSkJCQkJCVwKLQkgICAgICAgOiAiciIgKChVU0l0eXBlKShiaCkpLAkJCQkJXAotCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCi0JCSAiciIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKLSAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYmgpICYmIChiaCkgPT0gMCkJCQlcCi0gICAgICBfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7YW1lfGFkZG1lfSAlMCwlMiIJCVwKLQkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwJCQkJCVwKLQkJICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAotCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGFoKSksCQkJCQlcCi0JCSAickkiICgoVVNJdHlwZSkoYWwpKSwJCQkJCVwKLQkJICJyIiAoKFVTSXR5cGUpKGJsKSkpOwkJCQkJXAotICAgIGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChiaCkgJiYgKGJoKSA9PX4oVVNJdHlwZSkgMCkJCVwKLSAgICAgIF9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthemV8YWRkemV9ICUwLCUyIgkJXAotCSAgICAgICA6ICI9ciIgKChVU0l0eXBlKShzaCkpLAkJCQkJXAotCQkgIj0mciIgKChVU0l0eXBlKShzbCkpCQkJCQlcCi0JICAgICAgIDogInIiICgoVVNJdHlwZSkoYWgpKSwJCQkJCVwKLQkJICJySSIgKChVU0l0eXBlKShhbCkpLAkJCQkJXAotCQkgInIiICgoVVNJdHlwZSkoYmwpKSk7CQkJCQlcCi0gICAgZWxzZQkJCQkJCQkJXAotICAgICAgX19hc21fXyAoIntzZiVJNHxzdWJmJUk0Y30gJTEsJTUsJTRcblx0e3NmZXxzdWJmZX0gJTAsJTMsJTIiCVwKLQkgICAgICAgOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwJCQkJCVwKLQkJICI9JnIiICgoVVNJdHlwZSkoc2wpKQkJCQkJXAotCSAgICAgICA6ICJyIiAoKFVTSXR5cGUpKGFoKSksCQkJCQlcCi0JCSAiciIgKChVU0l0eXBlKShiaCkpLAkJCQkJXAotCQkgInJJIiAoKFVTSXR5cGUpKGFsKSksCQkJCQlcCi0JCSAiciIgKChVU0l0eXBlKShibCkpKTsJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotLyogYXNtIGZyYWdtZW50cyBmb3IgbXVsIGFuZCBkaXYgKi8KLQotLyogdW11bF9wcG1tKGhpZ2hfcHJvZCwgbG93X3Byb2QsIG11bHRpcGxlciwgbXVsdGlwbGljYW5kKSBtdWx0aXBsaWVzIHR3bwotICogVVd0eXBlIGludGVnZXJzIE1VTFRJUExFUiBhbmQgTVVMVElQTElDQU5ELCBhbmQgZ2VuZXJhdGVzIGEgdHdvIFVXdHlwZQotICogd29yZCBwcm9kdWN0IGluIEhJR0hfUFJPRCBhbmQgTE9XX1BST0QuCi0gKi8KLSNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIFVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOwkJCQkJXAotICAgIF9fYXNtX18gKCJtdWxod3UgJTAsJTEsJTIiCQkJCQkJXAotCSAgICAgOiAiPXIiICgoVVNJdHlwZSkocGgpKQkJCQkJXAotCSAgICAgOiAiJXIiIChfX20wKSwJCQkJCQlcCi0gICAgICAgICAgICAgICAiciIgKF9fbTEpKTsJCQkJCQlcCi0gICAgKHBsKSA9IF9fbTAgKiBfX20xOwkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLS8qIHVkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0b3IsIGxvd19udW1lcmF0b3IsCi0gKiBkZW5vbWluYXRvcikgZGl2aWRlcyBhIFVEV3R5cGUsIGNvbXBvc2VkIGJ5IHRoZSBVV3R5cGUgaW50ZWdlcnMKLSAqIEhJR0hfTlVNRVJBVE9SIGFuZCBMT1dfTlVNRVJBVE9SLCBieSBERU5PTUlOQVRPUiBhbmQgcGxhY2VzIHRoZSBxdW90aWVudAotICogaW4gUVVPVElFTlQgYW5kIHRoZSByZW1haW5kZXIgaW4gUkVNQUlOREVSLiAgSElHSF9OVU1FUkFUT1IgbXVzdCBiZSBsZXNzCi0gKiB0aGFuIERFTk9NSU5BVE9SIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4gIElmLCBpbiBhZGRpdGlvbiwgdGhlIG1vc3QKLSAqIHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsIHRoZW4gdGhlIHByZS1wcm9jZXNzb3Igc3ltYm9sCi0gKiBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgotICovCi0jZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIFVXdHlwZSBfX2QxLCBfX2QwLCBfX3ExLCBfX3EwLCBfX3IxLCBfX3IwLCBfX207CQkJXAotICAgIF9fZDEgPSBfX2xsX2hpZ2hwYXJ0IChkKTsJCQkJCQlcCi0gICAgX19kMCA9IF9fbGxfbG93cGFydCAoZCk7CQkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9fcjEgPSAobjEpICUgX19kMTsJCQkJCQkJXAotICAgIF9fcTEgPSAobjEpIC8gX19kMTsJCQkJCQkJXAotICAgIF9fbSA9IChVV3R5cGUpIF9fcTEgKiBfX2QwOwkJCQkJCVwKLSAgICBfX3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IxIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IxID49IChkKSkgLyogd2UgZGlkbid0IGdldCBjYXJyeSB3aGVuIGFkZGluZyB0byBfX3IxICovCVwKLQkgIGlmIChfX3IxIDwgX19tKQkJCQkJCVwKLQkgICAgX19xMS0tLCBfX3IxICs9IChkKTsJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgX19yMSAtPSBfX207CQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3IwID0gX19yMSAlIF9fZDE7CQkJCQkJCVwKLSAgICBfX3EwID0gX19yMSAvIF9fZDE7CQkJCQkJCVwKLSAgICBfX20gPSAoVVd0eXBlKSBfX3EwICogX19kMDsJCQkJCQlcCi0gICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IwID49IChkKSkJCQkJCQlcCi0JICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCi0JICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgKHEpID0gKFVXdHlwZSkgX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCVwKLSAgICAocikgPSBfX3IwOwkJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCi0KLSNkZWZpbmUgYWJvcnQoKQkJCQkJCQkJXAotCXJldHVybiAwCi0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSNkZWZpbmUgX19CWVRFX09SREVSIF9fQklHX0VORElBTgotI2Vsc2UKLSNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgotI2VuZGlmCi0KLS8qIEV4Y2VwdGlvbiBmbGFncy4gKi8KLSNkZWZpbmUgRUZMQUdfSU5WQUxJRAkJKDEgPDwgKDMxIC0gMikpCi0jZGVmaW5lIEVGTEFHX09WRVJGTE9XCQkoMSA8PCAoMzEgLSAzKSkKLSNkZWZpbmUgRUZMQUdfVU5ERVJGTE9XCQkoMSA8PCAoMzEgLSA0KSkKLSNkZWZpbmUgRUZMQUdfRElWWkVSTwkJKDEgPDwgKDMxIC0gNSkpCi0jZGVmaW5lIEVGTEFHX0lORVhBQ1QJCSgxIDw8ICgzMSAtIDYpKQotCi0jZGVmaW5lIEVGTEFHX1ZYU05BTgkJKDEgPDwgKDMxIC0gNykpCi0jZGVmaW5lIEVGTEFHX1ZYSVNJCQkoMSA8PCAoMzEgLSA4KSkKLSNkZWZpbmUgRUZMQUdfVlhJREkJCSgxIDw8ICgzMSAtIDkpKQotI2RlZmluZSBFRkxBR19WWFpEWgkJKDEgPDwgKDMxIC0gMTApKQotI2RlZmluZSBFRkxBR19WWElNWgkJKDEgPDwgKDMxIC0gMTEpKQotI2RlZmluZSBFRkxBR19WWFZDCQkoMSA8PCAoMzEgLSAxMikpCi0jZGVmaW5lIEVGTEFHX1ZYU09GVAkJKDEgPDwgKDMxIC0gMjEpKQotI2RlZmluZSBFRkxBR19WWFNRUlQJCSgxIDw8ICgzMSAtIDIyKSkKLSNkZWZpbmUgRUZMQUdfVlhDVkkJCSgxIDw8ICgzMSAtIDIzKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9zaW5nbGUuaCBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9zaW5nbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5ZDk5NC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvc2luZ2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogRGVmaW5pdGlvbnMgZm9yIElFRUUgU2luZ2xlIFByZWNpc2lvbgotICovCi0KLSNpZiBfRlBfV19UWVBFX1NJWkUgPCAzMgotI2Vycm9yICJIZXJlJ3MgYSBuaWNrZWwga2lkLiAgR28gYnV5IHlvdXJzZWxmIGEgcmVhbCBjb21wdXRlci4iCi0jZW5kaWYKLQotI2RlZmluZSBfRlBfRlJBQ0JJVFNfUwkJMjQKLSNkZWZpbmUgX0ZQX0ZSQUNYQklUU19TCQkoX0ZQX1dfVFlQRV9TSVpFIC0gX0ZQX0ZSQUNCSVRTX1MpCi0jZGVmaW5lIF9GUF9XRlJBQ0JJVFNfUwkJKF9GUF9XT1JLQklUUyArIF9GUF9GUkFDQklUU19TKQotI2RlZmluZSBfRlBfV0ZSQUNYQklUU19TCShfRlBfV19UWVBFX1NJWkUgLSBfRlBfV0ZSQUNCSVRTX1MpCi0jZGVmaW5lIF9GUF9FWFBCSVRTX1MJCTgKLSNkZWZpbmUgX0ZQX0VYUEJJQVNfUwkJMTI3Ci0jZGVmaW5lIF9GUF9FWFBNQVhfUwkJMjU1Ci0jZGVmaW5lIF9GUF9RTkFOQklUX1MJCSgoX0ZQX1dfVFlQRSkxIDw8IChfRlBfRlJBQ0JJVFNfUy0yKSkKLSNkZWZpbmUgX0ZQX0lNUExCSVRfUwkJKChfRlBfV19UWVBFKTEgPDwgKF9GUF9GUkFDQklUU19TLTEpKQotI2RlZmluZSBfRlBfT1ZFUkZMT1dfUwkJKChfRlBfV19UWVBFKTEgPDwgKF9GUF9XRlJBQ0JJVFNfUykpCi0KLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBfRlBfTVVMX01FQVRfUyBhbmQgX0ZQX0RJVl9NRUFUX1Mgc2hvdWxkIGJlCi0gICBjaG9zZW4gYnkgdGhlIHRhcmdldCBtYWNoaW5lLiAgKi8KLQotdW5pb24gX0ZQX1VOSU9OX1MKLXsKLSAgZmxvYXQgZmx0OwotICBzdHJ1Y3QgewotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICB1bnNpZ25lZCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBleHAgIDogX0ZQX0VYUEJJVFNfUzsKLSAgICB1bnNpZ25lZCBmcmFjIDogX0ZQX0ZSQUNCSVRTX1MgLSAoX0ZQX0lNUExCSVRfUyAhPSAwKTsKLSNlbHNlCi0gICAgdW5zaWduZWQgZnJhYyA6IF9GUF9GUkFDQklUU19TIC0gKF9GUF9JTVBMQklUX1MgIT0gMCk7Ci0gICAgdW5zaWduZWQgZXhwICA6IF9GUF9FWFBCSVRTX1M7Ci0gICAgdW5zaWduZWQgc2lnbiA6IDE7Ci0jZW5kaWYKLSAgfSBiaXRzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotfTsKLQotI2RlZmluZSBGUF9ERUNMX1MoWCkJCV9GUF9ERUNMKDEsWCkKLSNkZWZpbmUgRlBfVU5QQUNLX1JBV19TKFgsdmFsKQlfRlBfVU5QQUNLX1JBV18xKFMsWCx2YWwpCi0jZGVmaW5lIEZQX1BBQ0tfUkFXX1ModmFsLFgpCV9GUF9QQUNLX1JBV18xKFMsdmFsLFgpCi0KLSNkZWZpbmUgRlBfVU5QQUNLX1MoWCx2YWwpCQlcCi0gIGRvIHsJCQkJCVwKLSAgICBfRlBfVU5QQUNLX1JBV18xKFMsWCx2YWwpOwkJXAotICAgIF9GUF9VTlBBQ0tfQ0FOT05JQ0FMKFMsMSxYKTsJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEZQX1BBQ0tfUyh2YWwsWCkJCVwKLSAgZG8gewkJCQkJXAotICAgIF9GUF9QQUNLX0NBTk9OSUNBTChTLDEsWCk7CQlcCi0gICAgX0ZQX1BBQ0tfUkFXXzEoUyx2YWwsWCk7CQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRlBfTkVHX1MoUixYKQkJX0ZQX05FRyhTLDEsUixYKQotI2RlZmluZSBGUF9BRERfUyhSLFgsWSkJCV9GUF9BREQoUywxLFIsWCxZKQotI2RlZmluZSBGUF9TVUJfUyhSLFgsWSkJCV9GUF9TVUIoUywxLFIsWCxZKQotI2RlZmluZSBGUF9NVUxfUyhSLFgsWSkJCV9GUF9NVUwoUywxLFIsWCxZKQotI2RlZmluZSBGUF9ESVZfUyhSLFgsWSkJCV9GUF9ESVYoUywxLFIsWCxZKQotI2RlZmluZSBGUF9TUVJUX1MoUixYKQkJX0ZQX1NRUlQoUywxLFIsWCkKLQotI2RlZmluZSBGUF9DTVBfUyhyLFgsWSx1bikJX0ZQX0NNUChTLDEscixYLFksdW4pCi0jZGVmaW5lIEZQX0NNUF9FUV9TKHIsWCxZKQlfRlBfQ01QX0VRKFMsMSxyLFgsWSkKLQotI2RlZmluZSBGUF9UT19JTlRfUyhyLFgscnN6LHJzZykgIF9GUF9UT19JTlQoUywxLHIsWCxyc3oscnNnKQotI2RlZmluZSBGUF9GUk9NX0lOVF9TKFgscixycyxydCkgIF9GUF9GUk9NX0lOVChTLDEsWCxyLHJzLHJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L3NvZnQtZnAuaCBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9zb2Z0LWZwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTM5NTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L3NvZnQtZnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jaWZuZGVmIFNPRlRfRlBfSAotI2RlZmluZSBTT0ZUX0ZQX0gKLQotI2luY2x1ZGUgInNmcC1tYWNoaW5lLmgiCi0KLSNkZWZpbmUgX0ZQX1dPUktCSVRTCQkzCi0jZGVmaW5lIF9GUF9XT1JLX0xTQgkJKChfRlBfV19UWVBFKTEgPDwgMykKLSNkZWZpbmUgX0ZQX1dPUktfUk9VTkQJCSgoX0ZQX1dfVFlQRSkxIDw8IDIpCi0jZGVmaW5lIF9GUF9XT1JLX0dVQVJECQkoKF9GUF9XX1RZUEUpMSA8PCAxKQotI2RlZmluZSBfRlBfV09SS19TVElDS1kJCSgoX0ZQX1dfVFlQRSkxIDw8IDApCi0KLSNpZm5kZWYgRlBfUk5EX05FQVJFU1QKLSMgZGVmaW5lIEZQX1JORF9ORUFSRVNUCQkwCi0jIGRlZmluZSBGUF9STkRfWkVSTwkJMQotIyBkZWZpbmUgRlBfUk5EX1BJTkYJCTIKLSMgZGVmaW5lIEZQX1JORF9NSU5GCQkzCi0jaWZuZGVmIEZQX1JPVU5ETU9ERQotIyBkZWZpbmUgRlBfUk9VTkRNT0RFCQlGUF9STkRfTkVBUkVTVAotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBfRlBfUk9VTkRfTkVBUkVTVCh3YywgWCkJCQlcCi0oeyAgaW50IF9fcmV0ID0gMDsJCQkJCVwKLSAgICBpbnQgX19mcmFjID0gX0ZQX0ZSQUNfTE9XXyMjd2MoWCkgJiAxNTsJCVwKLSAgICBpZiAoX19mcmFjICYgNykgewkJCQkJXAotICAgICAgX19yZXQgPSBFRkxBR19JTkVYQUNUOwkJCQlcCi0gICAgICBpZiAoKF9fZnJhYyAmIDcpICE9IF9GUF9XT1JLX1JPVU5EKQkJXAotICAgICAgICBfRlBfRlJBQ19BRERJXyMjd2MoWCwgX0ZQX1dPUktfUk9VTkQpOwkJXAotICAgICAgZWxzZSBpZiAoX19mcmFjICYgX0ZQX1dPUktfTFNCKQkJCVwKLSAgICAgICAgX0ZQX0ZSQUNfQURESV8jI3djKFgsIF9GUF9XT1JLX1JPVU5EKTsJCVwKLSAgICB9CQkJCQkJCVwKLSAgICBfX3JldDsJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9GUF9ST1VORF9aRVJPKHdjLCBYKQkJCQlcCi0oeyAgaW50IF9fcmV0ID0gMDsJCQkJCVwKLSAgICBpZiAoX0ZQX0ZSQUNfTE9XXyMjd2MoWCkgJiA3KQkJCVwKLSAgICAgIF9fcmV0ID0gRUZMQUdfSU5FWEFDVDsJCQkJXAotICAgIF9fcmV0OwkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX0ZQX1JPVU5EX1BJTkYod2MsIFgpCQkJCVwKLSh7ICBpbnQgX19yZXQgPSBFRkxBR19JTkVYQUNUOwkJCQlcCi0gICAgaWYgKCFYIyNfcyAmJiAoX0ZQX0ZSQUNfTE9XXyMjd2MoWCkgJiA3KSkJCVwKLSAgICAgIF9GUF9GUkFDX0FERElfIyN3YyhYLCBfRlBfV09SS19MU0IpOwkJXAotICAgIGVsc2UgX19yZXQgPSAwOwkJCQkJXAotICAgIF9fcmV0OwkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX0ZQX1JPVU5EX01JTkYod2MsIFgpCQkJCVwKLSh7ICBpbnQgX19yZXQgPSBFRkxBR19JTkVYQUNUOwkJCQlcCi0gICAgaWYgKFgjI19zICYmIChfRlBfRlJBQ19MT1dfIyN3YyhYKSAmIDcpKQkJXAotICAgICAgX0ZQX0ZSQUNfQURESV8jI3djKFgsIF9GUF9XT1JLX0xTQik7CQlcCi0gICAgZWxzZSBfX3JldCA9IDA7CQkJCQlcCi0gICAgX19yZXQ7CQkJCQkJXAotfSkKLQotI2RlZmluZSBfRlBfUk9VTkQod2MsIFgpCQkJXAotKHsJaW50IF9fcmV0ID0gMDsJCQkJXAotCXN3aXRjaCAoRlBfUk9VTkRNT0RFKQkJCVwKLQl7CQkJCQlcCi0JICBjYXNlIEZQX1JORF9ORUFSRVNUOgkJCVwKLQkgICAgX19yZXQgfD0gX0ZQX1JPVU5EX05FQVJFU1Qod2MsWCk7CVwKLQkgICAgYnJlYWs7CQkJCVwKLQkgIGNhc2UgRlBfUk5EX1pFUk86CQkJXAotCSAgICBfX3JldCB8PSBfRlBfUk9VTkRfWkVSTyh3YyxYKTsJXAotCSAgICBicmVhazsJCQkJXAotCSAgY2FzZSBGUF9STkRfUElORjoJCQlcCi0JICAgIF9fcmV0IHw9IF9GUF9ST1VORF9QSU5GKHdjLFgpOwlcCi0JICAgIGJyZWFrOwkJCQlcCi0JICBjYXNlIEZQX1JORF9NSU5GOgkJCVwKLQkgICAgX19yZXQgfD0gX0ZQX1JPVU5EX01JTkYod2MsWCk7CVwKLQkgICAgYnJlYWs7CQkJCVwKLQl9OwkJCQkJXAotCV9fcmV0OwkJCQkJXAotfSkKLQotI2RlZmluZSBGUF9DTFNfTk9STUFMCQkwCi0jZGVmaW5lIEZQX0NMU19aRVJPCQkxCi0jZGVmaW5lIEZQX0NMU19JTkYJCTIKLSNkZWZpbmUgRlBfQ0xTX05BTgkJMwotCi0jZGVmaW5lIF9GUF9DTFNfQ09NQklORSh4LHkpCSgoKHgpIDw8IDIpIHwgKHkpKQotCi0jaW5jbHVkZSAib3AtMS5oIgotI2luY2x1ZGUgIm9wLTIuaCIKLSNpbmNsdWRlICJvcC00LmgiCi0jaW5jbHVkZSAib3AtY29tbW9uLmgiCi0KLS8qIFNpZ2guICBTaWxseSB0aGluZ3MgbG9uZ2xvbmcuaCBuZWVkcy4gICovCi0jZGVmaW5lIFVXdHlwZQkJX0ZQX1dfVFlQRQotI2RlZmluZSBXX1RZUEVfU0laRQlfRlBfV19UWVBFX1NJWkUKLQotdHlwZWRlZiBpbnQgU0l0eXBlIF9fYXR0cmlidXRlX18oKG1vZGUoU0kpKSk7Ci10eXBlZGVmIGludCBESXR5cGUgX19hdHRyaWJ1dGVfXygobW9kZShESSkpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUgX19hdHRyaWJ1dGVfXygobW9kZShTSSkpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVESXR5cGUgX19hdHRyaWJ1dGVfXygobW9kZShESSkpKTsKLSNpZiBfRlBfV19UWVBFX1NJWkUgPT0gMzIKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVIV3R5cGUgX19hdHRyaWJ1dGVfXygobW9kZShISSkpKTsKLSNlbGlmIF9GUF9XX1RZUEVfU0laRSA9PSA2NAotdHlwZWRlZiBVU0l0eXBlIFVIV3R5cGU7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvc3Rmcy5jIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L3N0ZnMuYwppbmRleCA4Njg5YWE0Li42MTIyMTQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvc3Rmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS9zdGZzLmMKQEAgLTIsMjMgKzIsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpbmNsdWRlICJzb2Z0LWZwLmgiCi0jaW5jbHVkZSAiZG91YmxlLmgiCi0jaW5jbHVkZSAic2luZ2xlLmgiCisjaW5jbHVkZSA8YXNtL3NmcC1tYWNoaW5lLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc29mdC1mcC5oPgorI2luY2x1ZGUgPG1hdGgtZW11L2RvdWJsZS5oPgorI2luY2x1ZGUgPG1hdGgtZW11L3NpbmdsZS5oPgogCiBpbnQKIHN0ZnModm9pZCAqZnJTLCB2b2lkICplYSkKIHsKIAlGUF9ERUNMX0QoQSk7CiAJRlBfREVDTF9TKFIpOworCUZQX0RFQ0xfRVg7CiAJZmxvYXQgZjsKLQlpbnQgZXJyOwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiBTICVwLCBlYSAlcFxuIiwgX19mdW5jX18sIGZyUywgZWEpOwogI2VuZGlmCiAKLQlfX0ZQX1VOUEFDS19EKEEsIGZyUyk7CisJRlBfVU5QQUNLX0RQKEEsIGZyUyk7CiAKICNpZmRlZiBERUJVRwogCXByaW50aygiQTogJWxkICVsdSAlbHUgJWxkICglbGQpXG4iLCBBX3MsIEFfZjEsIEFfZjAsIEFfZSwgQV9jKTsKQEAgLTMwLDEyICszMSwxMiBAQAogCXByaW50aygiUjogJWxkICVsdSAlbGQgKCVsZClcbiIsIFJfcywgUl9mLCBSX2UsIFJfYyk7CiAjZW5kaWYKIAotCWVyciA9IF9GUF9QQUNLX0NBTk9OSUNBTChTLCAxLCBSKTsKLQlpZiAoIWVyciB8fCAhX19GUFVfVFJBUF9QKGVycikpIHsKLQkJX19GUF9QQUNLX1JBV18xKFMsICZmLCBSKTsKKwlfRlBfUEFDS19DQU5PTklDQUwoUywgMSwgUik7CisJaWYgKCFGUF9DVVJfRVhDRVBUSU9OUyB8fCAhX19GUFVfVFJBUF9QKEZQX0NVUl9FWENFUFRJT05TKSkgeworCQlfRlBfUEFDS19SQVdfMV9QKFMsICZmLCBSKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihlYSwgJmYsIHNpemVvZihmbG9hdCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gRlBfQ1VSX0VYQ0VQVElPTlM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvdHlwZXMuYyBiL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS90eXBlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWVkMTVkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS90eXBlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI2luY2x1ZGUgInNvZnQtZnAuaCIKLSNpbmNsdWRlICJkb3VibGUuaCIKLSNpbmNsdWRlICJzaW5nbGUuaCIKLQotdm9pZAotZnBfdW5wYWNrX2QobG9uZyAqX3MsIHVuc2lnbmVkIGxvbmcgKl9mMSwgdW5zaWduZWQgbG9uZyAqX2YwLAotCSAgICBsb25nICpfZSwgbG9uZyAqX2MsIHZvaWQgKnZhbCkKLXsKLQlGUF9ERUNMX0QoWCk7Ci0KLQlfX0ZQX1VOUEFDS19SQVdfMihELCBYLCB2YWwpOwotCi0JX0ZQX1VOUEFDS19DQU5PTklDQUwoRCwgMiwgWCk7Ci0KLQkqX3MgPSBYX3M7Ci0JKl9mMSA9IFhfZjE7Ci0JKl9mMCA9IFhfZjA7Ci0JKl9lID0gWF9lOwotCSpfYyA9IFhfYzsKLX0KLQotaW50Ci1mcF9wYWNrX2Qodm9pZCAqdmFsLCBsb25nIFhfcywgdW5zaWduZWQgbG9uZyBYX2YxLAotCSAgdW5zaWduZWQgbG9uZyBYX2YwLCBsb25nIFhfZSwgbG9uZyBYX2MpCi17Ci0JaW50IGV4YzsKLQotCWV4YyA9IF9GUF9QQUNLX0NBTk9OSUNBTChELCAyLCBYKTsKLQlpZiAoIWV4YyB8fCAhX19GUFVfVFJBUF9QKGV4YykpCi0JCV9fRlBfUEFDS19SQVdfMihELCB2YWwsIFgpOwotCXJldHVybiBleGM7Ci19Ci0KLWludAotZnBfcGFja19kcyh2b2lkICp2YWwsIGxvbmcgWF9zLCB1bnNpZ25lZCBsb25nIFhfZjEsCi0JICAgdW5zaWduZWQgbG9uZyBYX2YwLCBsb25nIFhfZSwgbG9uZyBYX2MpCi17Ci0JRlBfREVDTF9TKF9fWCk7Ci0JaW50IGV4YzsKLQotCUZQX0NPTlYoUywgRCwgMSwgMiwgX19YLCBYKTsKLQlleGMgPSBfRlBfUEFDS19DQU5PTklDQUwoUywgMSwgX19YKTsKLQlpZiAoIWV4YyB8fCAhX19GUFVfVFJBUF9QKGV4YykpIHsKLQkJX0ZQX1VOUEFDS19DQU5PTklDQUwoUywgMSwgX19YKTsKLQkJRlBfQ09OVihELCBTLCAyLCAxLCBYLCBfX1gpOwotCQlleGMgfD0gX0ZQX1BBQ0tfQ0FOT05JQ0FMKEQsIDIsIFgpOwotCQlpZiAoIWV4YyB8fCAhX19GUFVfVFJBUF9QKGV4YykpCi0JCQlfX0ZQX1BBQ0tfUkFXXzIoRCwgdmFsLCBYKTsKLQl9Ci0JcmV0dXJuIGV4YzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS91ZGl2bW9kdGk0LmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvdWRpdm1vZHRpNC5jCmluZGV4IDdlMTEyZGMuLjYxNzIwNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tYXRoLWVtdS91ZGl2bW9kdGk0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21hdGgtZW11L3VkaXZtb2R0aTQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIFRoaXMgaGFzIHNvIHZlcnkgZmV3IGNoYW5nZXMgb3ZlciBsaWJnY2MyJ3MgX191ZGl2bW9kZGk0IGl0IGlzbid0IGZ1bm55LiAgKi8KIAotI2luY2x1ZGUgInNvZnQtZnAuaCIKKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CiAKICN1bmRlZiBjb3VudF9sZWFkaW5nX3plcm9zCiAjZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MgIF9fRlBfQ0xaCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwppbmRleCBjZTEwZTJiLi4yM2NlZTM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQljYW1fbWF4X3NpemUgPSBtYXhfbG93bWVtX3NpemU7CiAKIAkvKiBhZGp1c3QgbG93bWVtIHNpemUgdG8gbWF4X2xvd21lbV9zaXplICovCi0JcmFtID0gbWluKG1heF9sb3dtZW1fc2l6ZSwgKHBoeXNfYWRkcl90KXRvdGFsX2xvd21lbSk7CisJcmFtID0gbWluKG1heF9sb3dtZW1fc2l6ZSwgdG90YWxfbG93bWVtKTsKIAogCS8qIENhbGN1bGF0ZSBDQU0gdmFsdWVzICovCiAJX19jYW0wID0gMVVMIDw8IDIgKiAoX19pbG9nMihyYW0pIC8gMik7CkBAIC0yMjUsNyArMjI1LDggQEAKIAlwcmludGsoS0VSTl9JTkZPICJNZW1vcnkgQ0FNIG1hcHBpbmc6IENBTTA9JWxkTWIsIENBTTE9JWxkTWIsIgogCQkJIiBDQU0yPSVsZE1iIHJlc2lkdWFsOiAlbGRNYlxuIiwKIAkJCV9fY2FtMCA+PiAyMCwgX19jYW0xID4+IDIwLCBfX2NhbTIgPj4gMjAsCi0JCQkodG90YWxfbG93bWVtIC0gX19jYW0wIC0gX19jYW0xIC0gX19jYW0yKSA+PiAyMCk7CisJCQkobG9uZyBpbnQpKCh0b3RhbF9sb3dtZW0gLSBfX2NhbTAgLSBfX2NhbTEgLSBfX2NhbTIpCisJCQkJICAgPj4gMjApKTsKIAlfX21heF9sb3dfbWVtb3J5ID0gX19jYW0wICsgX19jYW0xICsgX19jYW0yOwogCV9faW5pdGlhbF9tZW1vcnlfbGltaXRfYWRkciA9IG1lbXN0YXJ0X2FkZHIgKyBfX21heF9sb3dfbWVtb3J5OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2d1cC5jIGIvYXJjaC9wb3dlcnBjL21tL2d1cC5jCmluZGV4IDlmZGY0ZDYuLjI4YTExNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9ndXAuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7CiAJCWlmICghcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUocGFnZSkpCiAJCQlyZXR1cm4gMDsKLQkJaWYgKHVubGlrZWx5KHB0ZSAhPSAqcHRlcCkpIHsKKwkJaWYgKHVubGlrZWx5KHB0ZV92YWwocHRlKSAhPSBwdGVfdmFsKCpwdGVwKSkpIHsKIAkJCXB1dF9wYWdlKHBhZ2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTkyLDcgKzkyLDcgQEAKIAkJKm5yIC09IHJlZnM7CiAJCXJldHVybiAwOwogCX0KLQlpZiAodW5saWtlbHkocHRlICE9ICpwdGVwKSkgeworCWlmICh1bmxpa2VseShwdGVfdmFsKHB0ZSkgIT0gcHRlX3ZhbCgqcHRlcCkpKSB7CiAJCS8qIENvdWxkIGJlIG9wdGltaXplZCBiZXR0ZXIgKi8KIAkJd2hpbGUgKCpucikgewogCQkJcHV0X3BhZ2UocGFnZSk7CkBAIC0yMzcsNyArMjM3LDggQEAKIAkJCXBnZF90IHBnZCA9ICpwZ2RwOwogCiAJCQlWTV9CVUdfT04oc2hpZnQgIT0gbW11X3BzaXplX2RlZnNbZ2V0X3NsaWNlX3BzaXplKG1tLCBhZGRyKV0uc2hpZnQpOwotCQkJcHJfZGVidWcoIiAgJTAxNmx4OiBub3JtYWwgcGdkICVwXG4iLCBhZGRyLCAodm9pZCAqKXBnZCk7CisJCQlwcl9kZWJ1ZygiICAlMDE2bHg6IG5vcm1hbCBwZ2QgJXBcbiIsIGFkZHIsCisJCQkJICh2b2lkICopcGdkX3ZhbChwZ2QpKTsKIAkJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKIAkJCWlmIChwZ2Rfbm9uZShwZ2QpKQogCQkJCWdvdG8gc2xvdzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd18zMi5TIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKaW5kZXggYjliYTdkOS4uN2JmZmI3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKQEAgLTc1LDcgKzc1LDcgQEAKICAqIFJldHVybnMgdG8gdGhlIGNhbGxlciBpZiB0aGUgYWNjZXNzIGlzIGlsbGVnYWwgb3IgdGhlcmUgaXMgbm8KICAqIG1hcHBpbmcgZm9yIHRoZSBhZGRyZXNzLiAgT3RoZXJ3aXNlIGl0IHBsYWNlcyBhbiBhcHByb3ByaWF0ZSBQVEUKICAqIGluIHRoZSBoYXNoIHRhYmxlIGFuZCByZXR1cm5zIGZyb20gdGhlIGV4Y2VwdGlvbi4KLSAqIFVzZXMgcjAsIHIzIC0gcjgsIGN0ciwgbHIuCisgKiBVc2VzIHIwLCByMyAtIHI4LCByMTAsIGN0ciwgbHIuCiAgKi8KIAkudGV4dAogX0dMT0JBTChoYXNoX3BhZ2UpCkBAIC0xMDYsOSArMTA2LDE1IEBACiAJYWRkaQlyNSxyNSxzd2FwcGVyX3BnX2RpckBsCS8qIGtlcm5lbCBwYWdlIHRhYmxlICovCiAJcmx3aW1pCXIzLHI5LDMyLTEyLDI5LDI5CS8qIE1TUl9QUiAtPiBfUEFHRV9VU0VSICovCiAxMTI6CWFkZAlyNSxyNSxyNwkJLyogY29udmVydCB0byBwaHlzIGFkZHIgKi8KKyNpZm5kZWYgQ09ORklHX1BURV82NEJJVAogCXJsd2ltaQlyNSxyNCwxMiwyMCwyOQkJLyogaW5zZXJ0IHRvcCAxMCBiaXRzIG9mIGFkZHJlc3MgKi8KIAlsd3oJcjgsMChyNSkJCS8qIGdldCBwbWQgZW50cnkgKi8KIAlybHdpbm0uCXI4LHI4LDAsMCwxOQkJLyogZXh0cmFjdCBhZGRyZXNzIG9mIHB0ZSBwYWdlICovCisjZWxzZQorCXJsd2lubQlyOCxyNCwxMywxOSwyOQkJLyogQ29tcHV0ZSBwZ2Rpci9wbWQgb2Zmc2V0ICovCisJbHd6eAlyOCxyOCxyNQkJLyogR2V0IEwxIGVudHJ5ICovCisJcmx3aW5tLglyOCxyOCwwLDAsMjAJCS8qIGV4dHJhY3QgcHQgYmFzZSBhZGRyZXNzICovCisjZW5kaWYKICNpZmRlZiBDT05GSUdfU01QCiAJYmVxLQloYXNoX3BhZ2Vfb3V0CQkvKiByZXR1cm4gaWYgbm8gbWFwcGluZyAqLwogI2Vsc2UKQEAgLTExOCw3ICsxMjQsMTEgQEAKIAkgICB0byB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIHJmaS4gKi8KIAliZXFsci0KICNlbmRpZgorI2lmbmRlZiBDT05GSUdfUFRFXzY0QklUCiAJcmx3aW1pCXI4LHI0LDIyLDIwLDI5CQkvKiBpbnNlcnQgbmV4dCAxMCBiaXRzIG9mIGFkZHJlc3MgKi8KKyNlbHNlCisJcmx3aW1pCXI4LHI0LDIzLDIwLDI4CQkvKiBjb21wdXRlIHB0ZSBhZGRyZXNzICovCisjZW5kaWYKIAlybHdpbm0JcjAscjMsMzItMywyNCwyNAkvKiBfUEFHRV9SVyBhY2Nlc3MgLT4gX1BBR0VfRElSVFkgKi8KIAlvcmkJcjAscjAsX1BBR0VfQUNDRVNTRUR8X1BBR0VfSEFTSFBURQogCkBAIC0xMjcsOSArMTM3LDE1IEBACiAJICogYmVjYXVzZSBhbG1vc3QgYWx3YXlzLCB0aGVyZSB3b24ndCBiZSBhIHBlcm1pc3Npb24gdmlvbGF0aW9uCiAJICogYW5kIHRoZXJlIHdvbid0IGFscmVhZHkgYmUgYW4gSFBURSwgYW5kIHRodXMgd2Ugd2lsbCBoYXZlCiAJICogdG8gdXBkYXRlIHRoZSBQVEUgdG8gc2V0IF9QQUdFX0hBU0hQVEUuICAtLSBwYXVsdXMuCisJICoKKwkgKiBJZiBQVEVfNjRCSVQgaXMgc2V0LCB0aGUgbG93IHdvcmQgaXMgdGhlIGZsYWdzIHdvcmQ7IHVzZSB0aGF0CisJICogd29yZCBmb3IgbG9ja2luZyBzaW5jZSBpdCBjb250YWlucyBhbGwgdGhlIGludGVyZXN0aW5nIGJpdHMuCiAJICovCisjaWYgKFBURV9GTEFHU19PRkZTRVQgIT0gMCkKKwlhZGRpCXI4LHI4LFBURV9GTEFHU19PRkZTRVQKKyNlbmRpZgogcmV0cnk6Ci0JbHdhcngJcjYsMCxyOAkJCS8qIGdldCBsaW51eC1zdHlsZSBwdGUgKi8KKwlsd2FyeAlyNiwwLHI4CQkJLyogZ2V0IGxpbnV4LXN0eWxlIHB0ZSwgZmxhZyB3b3JkICovCiAJYW5kYy4JcjUscjMscjYJCS8qIGNoZWNrIGFjY2VzcyAmIH5wZXJtaXNzaW9uICovCiAjaWZkZWYgQ09ORklHX1NNUAogCWJuZS0JaGFzaF9wYWdlX291dAkJLyogcmV0dXJuIGlmIGFjY2VzcyBub3QgcGVybWl0dGVkICovCkBAIC0xMzcsNiArMTUzLDE1IEBACiAJYm5lbHItCiAjZW5kaWYKIAlvcglyNSxyMCxyNgkJLyogc2V0IGFjY2Vzc2VkL2RpcnR5IGJpdHMgKi8KKyNpZmRlZiBDT05GSUdfUFRFXzY0QklUCisjaWZkZWYgQ09ORklHX1NNUAorCXN1YmYJcjEwLHI2LHI4CQkvKiBjcmVhdGUgZmFsc2UgZGF0YSBkZXBlbmRlbmN5ICovCisJc3ViaQlyMTAscjEwLFBURV9GTEFHU19PRkZTRVQKKwlsd3p4CXIxMCxyNixyMTAJCS8qIEdldCB1cHBlciBQVEUgd29yZCAqLworI2Vsc2UKKwlsd3oJcjEwLC1QVEVfRkxBR1NfT0ZGU0VUKHI4KQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFRFXzY0QklUICovCiAJc3R3Y3guCXI1LDAscjgJCQkvKiBhdHRlbXB0IHRvIHVwZGF0ZSBQVEUgKi8KIAlibmUtCXJldHJ5CQkJLyogcmV0cnkgaWYgc29tZW9uZSBnb3QgdGhlcmUgZmlyc3QgKi8KIApAQCAtMjAzLDkgKzIyOCw5IEBACiAJICogd2UgY2FuJ3QgdGFrZSBhIGhhc2ggdGFibGUgbWlzcyAoYXNzdW1pbmcgdGhlIGNvZGUgaXMKIAkgKiBjb3ZlcmVkIGJ5IGEgQkFUKS4gIC0tIHBhdWx1cwogCSAqLwotCW1mbXNyCXIxMAorCW1mbXNyCXI5CiAJU1lOQwotCXJsd2lubQlyMCxyMTAsMCwxNywxNQkJLyogY2xlYXIgYml0IDE2IChNU1JfRUUpICovCisJcmx3aW5tCXIwLHI5LDAsMTcsMTUJCS8qIGNsZWFyIGJpdCAxNiAoTVNSX0VFKSAqLwogCXJsd2lubQlyMCxyMCwwLDI4LDI2CQkvKiBjbGVhciBNU1JfRFIgKi8KIAltdG1zcglyMAogCVNZTkNfNjAxCkBAIC0yMTQsMTQgKzIzOSwxNCBAQAogCXRvcGh5cyhyNywwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotCWFkZGlzCXI5LHI3LG1tdV9oYXNoX2xvY2tAaGEKLQlhZGRpCXI5LHI5LG1tdV9oYXNoX2xvY2tAbAotMTA6CWx3YXJ4CXIwLDAscjkJCQkvKiB0YWtlIHRoZSBtbXVfaGFzaF9sb2NrICovCisJYWRkaXMJcjYscjcsbW11X2hhc2hfbG9ja0BoYQorCWFkZGkJcjYscjYsbW11X2hhc2hfbG9ja0BsCisxMDoJbHdhcngJcjAsMCxyNgkJCS8qIHRha2UgdGhlIG1tdV9oYXNoX2xvY2sgKi8KIAljbXBpCTAscjAsMAogCWJuZS0JMTFmCi0Jc3R3Y3guCXI4LDAscjkKKwlzdHdjeC4JcjgsMCxyNgogCWJlcSsJMTJmCi0xMToJbHd6CXIwLDAocjkpCisxMToJbHd6CXIwLDAocjYpCiAJY21waQkwLHIwLDAKIAliZXEJMTBiCiAJYgkxMWIKQEAgLTIzNCwxMCArMjU5LDI0IEBACiAJICogSFBURSwgc28gd2UganVzdCB1bmxvY2sgYW5kIHJldHVybi4KIAkgKi8KIAltcglyOCxyNQorI2lmbmRlZiBDT05GSUdfUFRFXzY0QklUCiAJcmx3aW1pCXI4LHI0LDIyLDIwLDI5CisjZWxzZQorCXJsd2ltaQlyOCxyNCwyMywyMCwyOAorCWFkZGkJcjgscjgsUFRFX0ZMQUdTX09GRlNFVAorI2VuZGlmCiAxOglsd2FyeAlyNiwwLHI4CiAJYW5kaS4JcjAscjYsX1BBR0VfSEFTSFBURQogCWJuZQk5ZgkJCS8qIGlmIEhBU0hQVEUgYWxyZWFkeSBzZXQsIGRvbmUgKi8KKyNpZmRlZiBDT05GSUdfUFRFXzY0QklUCisjaWZkZWYgQ09ORklHX1NNUAorCXN1YmYJcjEwLHI2LHI4CQkvKiBjcmVhdGUgZmFsc2UgZGF0YSBkZXBlbmRlbmN5ICovCisJc3ViaQlyMTAscjEwLFBURV9GTEFHU19PRkZTRVQKKwlsd3p4CXIxMCxyNixyMTAJCS8qIEdldCB1cHBlciBQVEUgd29yZCAqLworI2Vsc2UKKwlsd3oJcjEwLC1QVEVfRkxBR1NfT0ZGU0VUKHI4KQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFRFXzY0QklUICovCiAJb3JpCXI1LHI2LF9QQUdFX0hBU0hQVEUKIAlzdHdjeC4JcjUsMCxyOAogCWJuZS0JMWIKQEAgLTI0NiwxMyArMjg1LDE1IEBACiAKIDk6CiAjaWZkZWYgQ09ORklHX1NNUAorCWFkZGlzCXI2LHI3LG1tdV9oYXNoX2xvY2tAaGEKKwlhZGRpCXI2LHI2LG1tdV9oYXNoX2xvY2tAbAogCWVpZWlvCiAJbGkJcjAsMAotCXN0dwlyMCwwKHI5KQkJLyogY2xlYXIgbW11X2hhc2hfbG9jayAqLworCXN0dwlyMCwwKHI2KQkJLyogY2xlYXIgbW11X2hhc2hfbG9jayAqLwogI2VuZGlmCiAKIAkvKiByZWVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBEUiAqLwotCW10bXNyCXIxMAorCW10bXNyCXI5CiAJU1lOQ182MDEKIAlpc3luYwogCkBAIC0yNjcsNyArMzA4LDggQEAKICAqIHI1IGNvbnRhaW5zIHRoZSBsaW51eCBQVEUsIHI2IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlCiAgKiBsaW51eCBQVEUgKGJlZm9yZSBzZXR0aW5nIF9QQUdFX0hBU0hQVEUpIGFuZCByNyBjb250YWlucyB0aGUKICAqIG9mZnNldCB0byBiZSBhZGRlZCB0byBhZGRyZXNzZXMgKDAgaWYgdGhlIE1NVSBpcyBvbiwKLSAqIC1LRVJORUxCQVNFIGlmIGl0IGlzIG9mZikuCisgKiAtS0VSTkVMQkFTRSBpZiBpdCBpcyBvZmYpLiAgcjEwIGNvbnRhaW5zIHRoZSB1cHBlciBoYWxmIG9mCisgKiB0aGUgUFRFIGlmIENPTkZJR19QVEVfNjRCSVQuCiAgKiBPbiBTTVAsIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgdGhlIG1tdV9oYXNoX2xvY2sgaGVsZC4KICAqIFdlIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgaGFzIChvciB3aWxsKSBzZXQgdGhlIF9QQUdFX0hBU0hQVEUKICAqIGJpdCBpbiB0aGUgbGludXggUFRFIGluIG1lbW9yeS4gIFRoZSB2YWx1ZSBwYXNzZWQgaW4gcjYgc2hvdWxkCkBAIC0yODUsNyArMzI3LDcgQEAKIEhhc2hfbXNrID0gKCgoMSA8PCBIYXNoX2JpdHMpIC0gMSkgKiA2NCkKIAogLyogZGVmaW5lcyBmb3IgdGhlIFBURSBmb3JtYXQgZm9yIDMyLWJpdCBQUENzICovCi0jZGVmaW5lIFBURV9TSVpFCTgKKyNkZWZpbmUgSFBURV9TSVpFCTgKICNkZWZpbmUgUFRFR19TSVpFCTY0CiAjZGVmaW5lIExHX1BURUdfU0laRQk2CiAjZGVmaW5lIExEUFRFdQkJbHd6dQpAQCAtMzEzLDYgKzM1NSwxMSBAQAogQkVHSU5fRlRSX1NFQ1RJT04KIAlvcmkJcjgscjgsX1BBR0VfQ09IRVJFTlQJLyogc2V0IE0gKGNvaGVyZW5jZSByZXF1aXJlZCkgKi8KIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX05FRURfQ09IRVJFTlQpCisjaWZkZWYgQ09ORklHX1BURV82NEJJVAorCS8qIFB1dCB0aGUgWFBOIGJpdHMgaW50byB0aGUgUFRFICovCisJcmx3aW1pCXI4LHIxMCw4LDIwLDIyCisJcmx3aW1pCXI4LHIxMCwyLDI5LDI5CisjZW5kaWYKIAogCS8qIENvbnN0cnVjdCB0aGUgaGlnaCB3b3JkIG9mIHRoZSBQUEMtc3R5bGUgUFRFIChyNSkgKi8KIAlybHdpbm0JcjUscjMsNywxLDI0CQkvKiBwdXQgVlNJRCBpbiAweDdmZmZmZjgwIGJpdHMgKi8KQEAgLTM0Miw4ICszODksOCBAQAogCiAJLyogU2VhcmNoIHRoZSBwcmltYXJ5IFBURUcgZm9yIGEgUFRFIHdob3NlIDFzdCAoZCl3b3JkIG1hdGNoZXMgcjUgKi8KIAltdGN0cglyMAotCWFkZGkJcjQscjMsLVBURV9TSVpFCi0xOglMRFBURXUJcjYsUFRFX1NJWkUocjQpCQkvKiBnZXQgbmV4dCBQVEUgKi8KKwlhZGRpCXI0LHIzLC1IUFRFX1NJWkUKKzE6CUxEUFRFdQlyNixIUFRFX1NJWkUocjQpCS8qIGdldCBuZXh0IFBURSAqLwogCUNNUFBURQkwLHI2LHI1CiAJYmRuemYJMiwxYgkJCS8qIGxvb3Agd2hpbGUgY3RyICE9IDAgJiYgIWNyMC5lcSAqLwogCWJlcSsJZm91bmRfc2xvdApAQCAtMzUzLDkgKzQwMCw5IEBACiBfR0xPQkFMKGhhc2hfcGFnZV9wYXRjaF9CKQogCXhvcmlzCXI0LHIzLEhhc2hfbXNrPj4xNgkvKiBjb21wdXRlIHNlY29uZGFyeSBoYXNoICovCiAJeG9yaQlyNCxyNCwoLVBURUdfU0laRSAmIDB4ZmZmZikKLQlhZGRpCXI0LHI0LC1QVEVfU0laRQorCWFkZGkJcjQscjQsLUhQVEVfU0laRQogCW10Y3RyCXIwCi0yOglMRFBURXUJcjYsUFRFX1NJWkUocjQpCisyOglMRFBURXUJcjYsSFBURV9TSVpFKHI0KQogCUNNUFBURQkwLHI2LHI1CiAJYmRuemYJMiwyYgogCWJlcSsJZm91bmRfc2xvdApAQCAtMzYzLDggKzQxMCw4IEBACiAKIAkvKiBTZWFyY2ggdGhlIHByaW1hcnkgUFRFRyBmb3IgYW4gZW1wdHkgc2xvdCAqLwogMTA6CW10Y3RyCXIwCi0JYWRkaQlyNCxyMywtUFRFX1NJWkUJCS8qIHNlYXJjaCBwcmltYXJ5IFBURUcgKi8KLTE6CUxEUFRFdQlyNixQVEVfU0laRShyNCkJCS8qIGdldCBuZXh0IFBURSAqLworCWFkZGkJcjQscjMsLUhQVEVfU0laRQkvKiBzZWFyY2ggcHJpbWFyeSBQVEVHICovCisxOglMRFBURXUJcjYsSFBURV9TSVpFKHI0KQkvKiBnZXQgbmV4dCBQVEUgKi8KIAlUU1RfVihyNikJCQkvKiB0ZXN0IHZhbGlkIGJpdCAqLwogCWJkbnpmCTIsMWIJCQkvKiBsb29wIHdoaWxlIGN0ciAhPSAwICYmICFjcjAuZXEgKi8KIAliZXErCWZvdW5kX2VtcHR5CkBAIC0zODAsOSArNDI3LDkgQEAKIF9HTE9CQUwoaGFzaF9wYWdlX3BhdGNoX0MpCiAJeG9yaXMJcjQscjMsSGFzaF9tc2s+PjE2CS8qIGNvbXB1dGUgc2Vjb25kYXJ5IGhhc2ggKi8KIAl4b3JpCXI0LHI0LCgtUFRFR19TSVpFICYgMHhmZmZmKQotCWFkZGkJcjQscjQsLVBURV9TSVpFCisJYWRkaQlyNCxyNCwtSFBURV9TSVpFCiAJbXRjdHIJcjAKLTI6CUxEUFRFdQlyNixQVEVfU0laRShyNCkKKzI6CUxEUFRFdQlyNixIUFRFX1NJWkUocjQpCiAJVFNUX1YocjYpCiAJYmRuemYJMiwyYgogCWJlcSsJZm91bmRfZW1wdHkKQEAgLTQwOSwxMSArNDU2LDExIEBACiAKIDE6CWFkZGlzCXI0LHI3LG5leHRfc2xvdEBoYQkJLyogZ2V0IG5leHQgZXZpY3Qgc2xvdCAqLwogCWx3eglyNixuZXh0X3Nsb3RAbChyNCkKLQlhZGRpCXI2LHI2LFBURV9TSVpFCQkJLyogc2VhcmNoIGZvciBjYW5kaWRhdGUgKi8KLQlhbmRpLglyNixyNiw3KlBURV9TSVpFCisJYWRkaQlyNixyNixIUFRFX1NJWkUJCQkvKiBzZWFyY2ggZm9yIGNhbmRpZGF0ZSAqLworCWFuZGkuCXI2LHI2LDcqSFBURV9TSVpFCiAJc3R3CXI2LG5leHRfc2xvdEBsKHI0KQogCWFkZAlyNCxyMyxyNgotCUxEUFRFCXIwLFBURV9TSVpFLzIocjQpCQkvKiBnZXQgUFRFIHNlY29uZCB3b3JkICovCisJTERQVEUJcjAsSFBURV9TSVpFLzIocjQpCQkvKiBnZXQgUFRFIHNlY29uZCB3b3JkICovCiAJY2xycndpCXIwLHIwLDEyCiAJbGlzCXI2LGV0ZXh0QGgKIAlvcmkJcjYscjYsZXRleHRAbAkJCS8qIGdldCBldGV4dCAqLwpAQCAtNDI2LDcgKzQ3Myw3IEBACiBmb3VuZF9lbXB0eToKIAlTVFBURQlyNSwwKHI0KQogZm91bmRfc2xvdDoKLQlTVFBURQlyOCxQVEVfU0laRS8yKHI0KQorCVNUUFRFCXI4LEhQVEVfU0laRS8yKHI0KQogCiAjZWxzZSAvKiBDT05GSUdfU01QICovCiAvKgpAQCAtNDUyLDcgKzQ5OSw3IEBACiAJU1RQVEUJcjUsMChyNCkKIAlzeW5jCiAJVExCU1lOQwotCVNUUFRFCXI4LFBURV9TSVpFLzIocjQpIC8qIHB1dCBpbiBjb3JyZWN0IFJQTiwgV0lNRywgUFAgYml0cyAqLworCVNUUFRFCXI4LEhQVEVfU0laRS8yKHI0KSAvKiBwdXQgaW4gY29ycmVjdCBSUE4sIFdJTUcsIFBQIGJpdHMgKi8KIAlzeW5jCiAJU0VUX1YocjUpCiAJU1RQVEUJcjUsMChyNCkJLyogZmluYWxseSBzZXQgViBiaXQgaW4gUFRFICovCkBAIC00OTksMTQgKzU0NiwxOCBAQAogCWlzeW5jCiAKIAkvKiBGaXJzdCBmaW5kIGEgUFRFIGluIHRoZSByYW5nZSB0aGF0IGhhcyBfUEFHRV9IQVNIUFRFIHNldCAqLworI2lmbmRlZiBDT05GSUdfUFRFXzY0QklUCiAJcmx3aW1pCXI1LHI0LDIyLDIwLDI5Ci0xOglsd3oJcjAsMChyNSkKKyNlbHNlCisJcmx3aW1pCXI1LHI0LDIzLDIwLDI4CisjZW5kaWYKKzE6CWx3eglyMCxQVEVfRkxBR1NfT0ZGU0VUKHI1KQogCWNtcHdpCWNyMSxyNiwxCiAJYW5kaS4JcjAscjAsX1BBR0VfSEFTSFBURQogCWJuZQkyZgogCWJsZQljcjEsMTlmCiAJYWRkaQlyNCxyNCwweDEwMDAKLQlhZGRpCXI1LHI1LDQKKwlhZGRpCXI1LHI1LFBURV9TSVpFCiAJYWRkaQlyNixyNiwtMQogCWIJMWIKIApAQCAtNTQ1LDcgKzU5NiwxMCBAQAogCSAqIGFscmVhZHkgY2xlYXIsIHdlJ3JlIGRvbmUgKGZvciB0aGlzIHB0ZSkuICBJZiBub3QsCiAJICogY2xlYXIgaXQgKGF0b21pY2FsbHkpIGFuZCBwcm9jZWVkLiAgLS0gcGF1bHVzLgogCSAqLwotMzM6CWx3YXJ4CXI4LDAscjUJCQkvKiBmZXRjaCB0aGUgcHRlICovCisjaWYgKFBURV9GTEFHU19PRkZTRVQgIT0gMCkKKwlhZGRpCXI1LHI1LFBURV9GTEFHU19PRkZTRVQKKyNlbmRpZgorMzM6CWx3YXJ4CXI4LDAscjUJCQkvKiBmZXRjaCB0aGUgcHRlIGZsYWdzIHdvcmQgKi8KIAlhbmRpLglyMCxyOCxfUEFHRV9IQVNIUFRFCiAJYmVxCThmCQkJLyogZG9uZSBpZiBIQVNIUFRFIGlzIGFscmVhZHkgY2xlYXIgKi8KIAlybHdpbm0JcjgscjgsMCwzMSwyOQkJLyogY2xlYXIgSEFTSFBURSBiaXQgKi8KQEAgLTU2Miw4ICs2MTYsOCBAQAogCS8qIFNlYXJjaCB0aGUgcHJpbWFyeSBQVEVHIGZvciBhIFBURSB3aG9zZSAxc3QgKGQpd29yZCBtYXRjaGVzIHI1ICovCiAJbGkJcjAsOAkJCS8qIFBURXMvZ3JvdXAgKi8KIAltdGN0cglyMAotCWFkZGkJcjEyLHI4LC1QVEVfU0laRQotMToJTERQVEV1CXIwLFBURV9TSVpFKHIxMikJLyogZ2V0IG5leHQgUFRFICovCisJYWRkaQlyMTIscjgsLUhQVEVfU0laRQorMToJTERQVEV1CXIwLEhQVEVfU0laRShyMTIpCS8qIGdldCBuZXh0IFBURSAqLwogCUNNUFBURQkwLHIwLHIxMQogCWJkbnpmCTIsMWIJCQkvKiBsb29wIHdoaWxlIGN0ciAhPSAwICYmICFjcjAuZXEgKi8KIAliZXErCTNmCkBAIC01NzQsOSArNjI4LDkgQEAKIF9HTE9CQUwoZmx1c2hfaGFzaF9wYXRjaF9CKQogCXhvcmlzCXIxMixyOCxIYXNoX21zaz4+MTYJLyogY29tcHV0ZSBzZWNvbmRhcnkgaGFzaCAqLwogCXhvcmkJcjEyLHIxMiwoLVBURUdfU0laRSAmIDB4ZmZmZikKLQlhZGRpCXIxMixyMTIsLVBURV9TSVpFCisJYWRkaQlyMTIscjEyLC1IUFRFX1NJWkUKIAltdGN0cglyMAotMjoJTERQVEV1CXIwLFBURV9TSVpFKHIxMikKKzI6CUxEUFRFdQlyMCxIUFRFX1NJWkUocjEyKQogCUNNUFBURQkwLHIwLHIxMQogCWJkbnpmCTIsMmIKIAl4b3JpCXIxMSxyMTEsUFRFX0gJCS8qIGNsZWFyIEggYWdhaW4gKi8KQEAgLTU5MCw3ICs2NDQsNyBAQAogCiA4OglibGUJY3IxLDlmCQkJLyogaWYgYWxsIHB0ZXMgY2hlY2tlZCAqLwogODE6CWFkZGkJcjYscjYsLTEKLQlhZGRpCXI1LHI1LDQJCQkvKiBhZHZhbmNlIHRvIG5leHQgcHRlICovCisJYWRkaQlyNSxyNSxQVEVfU0laRQogCWFkZGkJcjQscjQsMHgxMDAwCiAJbHd6CXIwLDAocjUpCQkvKiBjaGVjayBuZXh0IHB0ZSAqLwogCWNtcHdpCWNyMSxyNiwxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCA4OTIwZWVhLi41YzY0YWYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCQl1bnNpZ25lZCBsb25nIHRwcm90ID0gcHJvdDsKIAogCQkvKiBNYWtlIGtlcm5lbCB0ZXh0IGV4ZWN1dGFibGUgKi8KLQkJaWYgKGluX2tlcm5lbF90ZXh0KHZhZGRyKSkKKwkJaWYgKG92ZXJsYXBzX2tlcm5lbF90ZXh0KHZhZGRyLCB2YWRkciArIHN0ZXApKQogCQkJdHByb3QgJj0gfkhQVEVfUl9OOwogCiAJCWhhc2ggPSBocHRfaGFzaCh2YSwgc2hpZnQsIHNzaXplKTsKQEAgLTM0OCw2ICszNDgsNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogLyogU2NhbiBmb3IgMTZHIG1lbW9yeSBibG9ja3MgdGhhdCBoYXZlIGJlZW4gc2V0IGFzaWRlIGZvciBodWdlIHBhZ2VzCiAgKiBhbmQgcmVzZXJ2ZSB0aG9zZSBibG9ja3MgZm9yIDE2RyBodWdlIHBhZ2VzLgogICovCkBAIC0zODUsNiArMzg2LDcgQEAKIAlhZGRfZ3BhZ2UocGh5c19hZGRyLCBibG9ja19zaXplLCBleHBlY3RlZF9wYWdlcyk7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaHRhYl9pbml0X3BhZ2Vfc2l6ZXModm9pZCkKIHsKQEAgLTUzOSw3ICs1NDEsNyBAQAogdm9pZCBjcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCUJVR19PTihodGFiX2JvbHRfbWFwcGluZyhzdGFydCwgZW5kLCBfX3BhKHN0YXJ0KSwKLQkJCQkgUEFHRV9LRVJORUwsIG1tdV9saW5lYXJfcHNpemUsCisJCQkJIHBncHJvdF92YWwoUEFHRV9LRVJORUwpLCBtbXVfbGluZWFyX3BzaXplLAogCQkJCSBtbXVfa2VybmVsX3NzaXplKSk7CiB9CiAKQEAgLTY0Nyw3ICs2NDksNyBAQAogCQltdHNwcihTUFJOX1NEUjEsIF9TRFIxKTsKIAl9CiAKLQlwcm90ID0gUEFHRV9LRVJORUw7CisJcHJvdCA9IHBncHJvdF92YWwoUEFHRV9LRVJORUwpOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCWxpbmVhcl9tYXBfaGFzaF9jb3VudCA9IGxtYl9lbmRfb2ZfRFJBTSgpID4+IFBBR0VfU0hJRlQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IGYxYzJkNTUuLmExMTcwMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC0xMjgsMjkgKzEyOCwzNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBCYXNlIHBhZ2Ugc2l6ZSBhZmZlY3RzIGhvdyB3ZSB3YWxrIGh1Z2V0bGIgcGFnZSB0YWJsZXMgKi8KLSNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwotI2RlZmluZSBocG1kX29mZnNldChwdWQsIGFkZHIsIGgpCXBtZF9vZmZzZXQocHVkLCBhZGRyKQotI2RlZmluZSBocG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIsIGgpCXBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUKLXBtZF90ICpocG1kX29mZnNldChwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBoc3RhdGUgKmhzdGF0ZSkKKworc3RhdGljIHB1ZF90ICpocHVkX29mZnNldChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBoc3RhdGUgKmhzdGF0ZSkKIHsKLQlpZiAoaHVnZV9wYWdlX3NoaWZ0KGhzdGF0ZSkgPT0gUEFHRV9TSElGVF82NEspCisJaWYgKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpIDwgUFVEX1NISUZUKQorCQlyZXR1cm4gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIChwdWRfdCAqKSBwZ2Q7Cit9CitzdGF0aWMgcHVkX3QgKmhwdWRfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSBzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCit7CisJaWYgKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpIDwgUFVEX1NISUZUKQorCQlyZXR1cm4gcHVkX2FsbG9jKG1tLCBwZ2QsIGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIChwdWRfdCAqKSBwZ2Q7Cit9CitzdGF0aWMgcG1kX3QgKmhwbWRfb2Zmc2V0KHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGhzdGF0ZSAqaHN0YXRlKQoreworCWlmIChodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKSA8IFBNRF9TSElGVCkKIAkJcmV0dXJuIHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAllbHNlCiAJCXJldHVybiAocG1kX3QgKikgcHVkOwogfQotc3RhdGljIGlubGluZQotcG1kX3QgKmhwbWRfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJICBzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCitzdGF0aWMgcG1kX3QgKmhwbWRfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSBzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCiB7Ci0JaWYgKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpID09IFBBR0VfU0hJRlRfNjRLKQorCWlmIChodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKSA8IFBNRF9TSElGVCkKIAkJcmV0dXJuIHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKIAllbHNlCiAJCXJldHVybiAocG1kX3QgKikgcHVkOwogfQotI2VuZGlmCiAKIC8qIEJ1aWxkIGxpc3Qgb2YgYWRkcmVzc2VzIG9mIGdpZ2FudGljIHBhZ2VzLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGVhcmx5CiAgKiBib290IGJlZm9yZSB0aGUgYnVkZHkgb3IgYm9vdG1lbSBhbGxvY2F0b3IgaXMgc2V0dXAuCkBAIC0yMDQsNyArMjEyLDcgQEAKIAogCXBnID0gcGdkX29mZnNldChtbSwgYWRkcik7CiAJaWYgKCFwZ2Rfbm9uZSgqcGcpKSB7Ci0JCXB1ID0gcHVkX29mZnNldChwZywgYWRkcik7CisJCXB1ID0gaHB1ZF9vZmZzZXQocGcsIGFkZHIsIGhzdGF0ZSk7CiAJCWlmICghcHVkX25vbmUoKnB1KSkgewogCQkJcG0gPSBocG1kX29mZnNldChwdSwgYWRkciwgaHN0YXRlKTsKIAkJCWlmICghcG1kX25vbmUoKnBtKSkKQEAgLTIzMyw3ICsyNDEsNyBAQAogCWFkZHIgJj0gaHN0YXRlLT5tYXNrOwogCiAJcGcgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKLQlwdSA9IHB1ZF9hbGxvYyhtbSwgcGcsIGFkZHIpOworCXB1ID0gaHB1ZF9hbGxvYyhtbSwgcGcsIGFkZHIsIGhzdGF0ZSk7CiAKIAlpZiAocHUpIHsKIAkJcG0gPSBocG1kX2FsbG9jKG1tLCBwdSwgYWRkciwgaHN0YXRlKTsKQEAgLTMxNiwxMyArMzI0LDcgQEAKIAlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0jaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQkJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQotCQkJY29udGludWU7Ci0JCWh1Z2V0bGJfZnJlZV9wbWRfcmFuZ2UodGxiLCBwdWQsIGFkZHIsIG5leHQsIGZsb29yLCBjZWlsaW5nLAotCQkJCSAgICAgICBwc2l6ZSk7Ci0jZWxzZQotCQlpZiAoc2hpZnQgPT0gUEFHRV9TSElGVF82NEspIHsKKwkJaWYgKHNoaWZ0IDwgUE1EX1NISUZUKSB7CiAJCQlpZiAocHVkX25vbmVfb3JfY2xlYXJfYmFkKHB1ZCkpCiAJCQkJY29udGludWU7CiAJCQlodWdldGxiX2ZyZWVfcG1kX3JhbmdlKHRsYiwgcHVkLCBhZGRyLCBuZXh0LCBmbG9vciwKQEAgLTMzMiw3ICszMzQsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJZnJlZV9odWdlcHRlX3JhbmdlKHRsYiwgKGh1Z2VwZF90ICopcHVkLCBwc2l6ZSk7CiAJCX0KLSNlbmRpZgogCX0gd2hpbGUgKHB1ZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogCiAJc3RhcnQgJj0gUEdESVJfTUFTSzsKQEAgLTQyMiw5ICs0MjMsMTUgQEAKIAkJcHNpemUgPSBnZXRfc2xpY2VfcHNpemUodGxiLT5tbSwgYWRkcik7CiAJCUJVR19PTighbW11X2h1Z2VfcHNpemVzW3BzaXplXSk7CiAJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKLQkJaWYgKHBnZF9ub25lX29yX2NsZWFyX2JhZChwZ2QpKQotCQkJY29udGludWU7Ci0JCWh1Z2V0bGJfZnJlZV9wdWRfcmFuZ2UodGxiLCBwZ2QsIGFkZHIsIG5leHQsIGZsb29yLCBjZWlsaW5nKTsKKwkJaWYgKG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSkgPCBQVURfU0hJRlQpIHsKKwkJCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKKwkJCQljb250aW51ZTsKKwkJCWh1Z2V0bGJfZnJlZV9wdWRfcmFuZ2UodGxiLCBwZ2QsIGFkZHIsIG5leHQsIGZsb29yLCBjZWlsaW5nKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwZ2Rfbm9uZSgqcGdkKSkKKwkJCQljb250aW51ZTsKKwkJCWZyZWVfaHVnZXB0ZV9yYW5nZSh0bGIsIChodWdlcGRfdCAqKXBnZCwgcHNpemUpOworCQl9CiAJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDAzNmZlMmYuLjNlNmE2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtMjI4LDggKzIyOCw4IEBACiAJCQlzdGFydCwgcCwgX19wYShwKSk7CiAKIAkJbWFwcGVkID0gaHRhYl9ib2x0X21hcHBpbmcoc3RhcnQsIHN0YXJ0ICsgcGFnZV9zaXplLCBfX3BhKHApLAotCQkJCQkgICBQQUdFX0tFUk5FTCwgbW11X3ZtZW1tYXBfcHNpemUsCi0JCQkJCSAgIG1tdV9rZXJuZWxfc3NpemUpOworCQkJCQkgICBwZ3Byb3RfdmFsKFBBR0VfS0VSTkVMKSwKKwkJCQkJICAgbW11X3ZtZW1tYXBfcHNpemUsIG1tdV9rZXJuZWxfc3NpemUpOwogCQlCVUdfT04obWFwcGVkIDwgMCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggMWM5M2MyNS4uOThkN2JmOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtNzUsMTEgKzc1LDEwIEBACiAKIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gKHBmbiA8PCBQQUdFX1NISUZUKTsKLQogI2lmbmRlZiBDT05GSUdfUFBDNjQJLyogWFhYIGZvciBub3cgKi8KLQlyZXR1cm4gcGFkZHIgPCBfX3BhKGhpZ2hfbWVtb3J5KTsKKwlyZXR1cm4gcGZuIDwgbWF4X3BmbjsKICNlbHNlCisJdW5zaWduZWQgbG9uZyBwYWRkciA9IChwZm4gPDwgUEFHRV9TSElGVCk7CiAJaW50IGk7CiAJZm9yIChpPTA7IGkgPCBsbWIubWVtb3J5LmNudDsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IGQ5YTE4MTMuLjZjZjVjNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtODksNiArODksNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIGdldF9hY3RpdmVfcmVnaW9uX3dvcmtfZm4gLSBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbgorICoJUmV0dXJucyBkYXRheCBzZXQgdG8gdGhlIHN0YXJ0X3BmbiBhbmQgZW5kX3BmbiBpZiB0aGV5IGNvbnRhaW4KKyAqCXRoZSBpbml0aWFsIHZhbHVlIG9mIGRhdGF4LT5zdGFydF9wZm4gYmV0d2VlbiB0aGVtCisgKiBAc3RhcnRfcGZuOiBzdGFydCBwYWdlKGluY2x1c2l2ZSkgb2YgcmVnaW9uIHRvIGNoZWNrCisgKiBAZW5kX3BmbjogZW5kIHBhZ2UoZXhjbHVzaXZlKSBvZiByZWdpb24gdG8gY2hlY2sKKyAqIEBkYXRheDogY29tZXMgaW4gd2l0aCAtPnN0YXJ0X3BmbiBzZXQgdG8gdmFsdWUgdG8gc2VhcmNoIGZvciBhbmQKKyAqCWdvZXMgb3V0IHdpdGggYWN0aXZlIHJhbmdlIGlmIGl0IGNvbnRhaW5zIGl0CisgKiBSZXR1cm5zIDEgaWYgc2VhcmNoIHZhbHVlIGlzIGluIHJhbmdlIGVsc2UgMAorICovCitzdGF0aWMgaW50IF9faW5pdCBnZXRfYWN0aXZlX3JlZ2lvbl93b3JrX2ZuKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHZvaWQgKmRhdGF4KQoreworCXN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKmRhdGE7CisJZGF0YSA9IChzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICopZGF0YXg7CisKKwlpZiAoc3RhcnRfcGZuIDw9IGRhdGEtPnN0YXJ0X3BmbiAmJiBlbmRfcGZuID4gZGF0YS0+c3RhcnRfcGZuKSB7CisJCWRhdGEtPnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwkJZGF0YS0+ZW5kX3BmbiA9IGVuZF9wZm47CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworfQorCisvKgorICogZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbiAtIFJldHVybiBhY3RpdmUgcmVnaW9uIGNvbnRhaW5pbmcgc3RhcnRfcGZuCisgKiBAc3RhcnRfcGZuOiBUaGUgcGFnZSB0byByZXR1cm4gdGhlIHJlZ2lvbiBmb3IuCisgKiBAbm9kZV9hcjogUmV0dXJuZWQgc2V0IHRvIHRoZSBhY3RpdmUgcmVnaW9uIGNvbnRhaW5pbmcgc3RhcnRfcGZuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRfbm9kZV9hY3RpdmVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkgICAgICAgc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiAqbm9kZV9hcikKK3sKKwlpbnQgbmlkID0gZWFybHlfcGZuX3RvX25pZChzdGFydF9wZm4pOworCisJbm9kZV9hci0+bmlkID0gbmlkOworCW5vZGVfYXItPnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwl3b3JrX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBnZXRfYWN0aXZlX3JlZ2lvbl93b3JrX2ZuLCBub2RlX2FyKTsKK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKIHsKIAludW1hX2NwdV9sb29rdXBfdGFibGVbY3B1XSA9IG5vZGU7CkBAIC0xNTAsNiArMTkwLDIxIEBACiAJcmV0dXJuIG9mX2dldF9wcm9wZXJ0eShkZXYsICJpYm0sYXNzb2NpYXRpdml0eSIsIE5VTEwpOwogfQogCisvKgorICogUmV0dXJucyB0aGUgcHJvcGVydHkgbGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkgaWYKKyAqIGl0IGV4aXN0cyAodGhlIHByb3BlcnR5IGV4aXN0cyBvbmx5IGluIGtleGVjL2tkdW1wIGtlcm5lbHMsCisgKiBhZGRlZCBieSBrZXhlYy10b29scykKKyAqLworc3RhdGljIGNvbnN0IHUzMiAqb2ZfZ2V0X3VzYWJsZV9tZW1vcnkoc3RydWN0IGRldmljZV9ub2RlICptZW1vcnkpCit7CisJY29uc3QgdTMyICpwcm9wOworCXUzMiBsZW47CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShtZW1vcnksICJsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSIsICZsZW4pOworCWlmICghcHJvcCB8fCBsZW4gPCBzaXplb2YodW5zaWduZWQgaW50KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHByb3A7Cit9CisKIC8qIFJldHVybnMgbmlkIGluIHRoZSByYW5nZSBbMC4uTUFYX05VTU5PREVTLTFdLCBvciAtMSBpZiBubyB1c2VmdWwgbnVtYQogICogaW5mbyBpcyBmb3VuZC4KICAqLwpAQCAtNDg3LDE0ICs1NDIsMjkgQEAKIH0KIAogLyoKKyAqIFJlYWRzIHRoZSBjb3VudGVyIGZvciBhIGdpdmVuIGVudHJ5IGluCisgKiBsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSBwcm9wZXJ0eQorICovCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgcmVhZF91c21fcmFuZ2VzKGNvbnN0IHUzMiAqKnVzbSkKK3sKKwkvKgorCSAqIEZvciBlYWNoIGxtYiBpbiBpYm0sZHluYW1pYy1tZW1vcnkgYSBjb3JyZXNwb25kaW5nCisJICogZW50cnkgaW4gbGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkgcHJvcGVydHkgY29udGFpbnMKKwkgKiBhIGNvdW50ZXIgZm9sbG93ZWQgYnkgdGhhdCBtYW55IChiYXNlLCBzaXplKSBkdXBsZS4KKwkgKiByZWFkIHRoZSBjb3VudGVyIGZyb20gbGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkKKwkgKi8KKwlyZXR1cm4gcmVhZF9uX2NlbGxzKG5fbWVtX3NpemVfY2VsbHMsIHVzbSk7Cit9CisKKy8qCiAgKiBFeHRyYWN0IE5VTUEgaW5mb3JtYXRpb24gZnJvbSB0aGUgaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeQogICogbm9kZS4gIFRoaXMgYXNzdW1lcyBuX21lbV97YWRkcixzaXplfV9jZWxscyBoYXZlIGJlZW4gc2V0LgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfZHJjb25mX21lbW9yeShzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSkKIHsKLQljb25zdCB1MzIgKmRtOwotCXVuc2lnbmVkIGludCBuLCByYzsKLQl1bnNpZ25lZCBsb25nIGxtYl9zaXplLCBzaXplOworCWNvbnN0IHUzMiAqZG0sICp1c207CisJdW5zaWduZWQgaW50IG4sIHJjLCByYW5nZXMsIGlzX2tleGVjX2tkdW1wID0gMDsKKwl1bnNpZ25lZCBsb25nIGxtYl9zaXplLCBiYXNlLCBzaXplLCBzejsKIAlpbnQgbmlkOwogCXN0cnVjdCBhc3NvY19hcnJheXMgYWE7CiAKQEAgLTUxMCw2ICs1ODAsMTEgQEAKIAlpZiAocmMpCiAJCXJldHVybjsKIAorCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSBrZXhlYy9rZHVtcCBrZXJuZWwgKi8KKwl1c20gPSBvZl9nZXRfdXNhYmxlX21lbW9yeShtZW1vcnkpOworCWlmICh1c20gIT0gTlVMTCkKKwkJaXNfa2V4ZWNfa2R1bXAgPSAxOworCiAJZm9yICg7IG4gIT0gMDsgLS1uKSB7CiAJCXN0cnVjdCBvZl9kcmNvbmZfY2VsbCBkcm1lbTsKIApAQCAtNTIxLDIxICs1OTYsMzEgQEAKIAkJICAgIHx8ICEoZHJtZW0uZmxhZ3MgJiBEUkNPTkZfTUVNX0FTU0lHTkVEKSkKIAkJCWNvbnRpbnVlOwogCi0JCW5pZCA9IG9mX2RyY29uZl90b19uaWRfc2luZ2xlKCZkcm1lbSwgJmFhKTsKKwkJYmFzZSA9IGRybWVtLmJhc2VfYWRkcjsKKwkJc2l6ZSA9IGxtYl9zaXplOworCQlyYW5nZXMgPSAxOwogCi0JCWZha2VfbnVtYV9jcmVhdGVfbmV3X25vZGUoCi0JCQkJKChkcm1lbS5iYXNlX2FkZHIgKyBsbWJfc2l6ZSkgPj4gUEFHRV9TSElGVCksCisJCWlmIChpc19rZXhlY19rZHVtcCkgeworCQkJcmFuZ2VzID0gcmVhZF91c21fcmFuZ2VzKCZ1c20pOworCQkJaWYgKCFyYW5nZXMpIC8qIHRoZXJlIGFyZSBubyAoYmFzZSwgc2l6ZSkgZHVwbGUgKi8KKwkJCQljb250aW51ZTsKKwkJfQorCQlkbyB7CisJCQlpZiAoaXNfa2V4ZWNfa2R1bXApIHsKKwkJCQliYXNlID0gcmVhZF9uX2NlbGxzKG5fbWVtX2FkZHJfY2VsbHMsICZ1c20pOworCQkJCXNpemUgPSByZWFkX25fY2VsbHMobl9tZW1fc2l6ZV9jZWxscywgJnVzbSk7CisJCQl9CisJCQluaWQgPSBvZl9kcmNvbmZfdG9fbmlkX3NpbmdsZSgmZHJtZW0sICZhYSk7CisJCQlmYWtlX251bWFfY3JlYXRlX25ld19ub2RlKAorCQkJCSgoYmFzZSArIHNpemUpID4+IFBBR0VfU0hJRlQpLAogCQkJCQkgICAmbmlkKTsKLQotCQlub2RlX3NldF9vbmxpbmUobmlkKTsKLQotCQlzaXplID0gbnVtYV9lbmZvcmNlX21lbW9yeV9saW1pdChkcm1lbS5iYXNlX2FkZHIsIGxtYl9zaXplKTsKLQkJaWYgKCFzaXplKQotCQkJY29udGludWU7Ci0KLQkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIGRybWVtLmJhc2VfYWRkciA+PiBQQUdFX1NISUZULAotCQkJCSAoZHJtZW0uYmFzZV9hZGRyID4+IFBBR0VfU0hJRlQpCi0JCQkJICsgKHNpemUgPj4gUEFHRV9TSElGVCkpOworCQkJbm9kZV9zZXRfb25saW5lKG5pZCk7CisJCQlzeiA9IG51bWFfZW5mb3JjZV9tZW1vcnlfbGltaXQoYmFzZSwgc2l6ZSk7CisJCQlpZiAoc3opCisJCQkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIGJhc2UgPj4gUEFHRV9TSElGVCwKKwkJCQkJCSAoYmFzZSA+PiBQQUdFX1NISUZUKQorCQkJCQkJICsgKHN6ID4+IFBBR0VfU0hJRlQpKTsKKwkJfSB3aGlsZSAoLS1yYW5nZXMpOwogCX0KIH0KIApAQCAtODM3LDM4ICs5MjIsNTAgQEAKIAkJCQkgIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiAKIAkJZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBlbmRfcGZuKTsKKwl9CiAKLQkJLyogTWFyayByZXNlcnZlZCByZWdpb25zIG9uIHRoaXMgbm9kZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbG1iLnJlc2VydmVkLmNudDsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHBoeXNiYXNlID0gbG1iLnJlc2VydmVkLnJlZ2lvbltpXS5iYXNlOwotCQkJdW5zaWduZWQgbG9uZyBzaXplID0gbG1iLnJlc2VydmVkLnJlZ2lvbltpXS5zaXplOwotCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wYWRkciA9IHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUOwotCQkJdW5zaWduZWQgbG9uZyBlbmRfcGFkZHIgPSBlbmRfcGZuIDw8IFBBR0VfU0hJRlQ7CisJLyogTWFyayByZXNlcnZlZCByZWdpb25zICovCisJZm9yIChpID0gMDsgaSA8IGxtYi5yZXNlcnZlZC5jbnQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHBoeXNiYXNlID0gbG1iLnJlc2VydmVkLnJlZ2lvbltpXS5iYXNlOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBsbWIucmVzZXJ2ZWQucmVnaW9uW2ldLnNpemU7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gcGh5c2Jhc2UgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gKChwaHlzYmFzZSArIHNpemUpID4+IFBBR0VfU0hJRlQpOworCQlzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIG5vZGVfYXI7CiAKLQkJCWlmIChlYXJseV9wZm5fdG9fbmlkKHBoeXNiYXNlID4+IFBBR0VfU0hJRlQpICE9IG5pZCAmJgotCQkJICAgIGVhcmx5X3Bmbl90b19uaWQoKHBoeXNiYXNlK3NpemUtMSkgPj4gUEFHRV9TSElGVCkgIT0gbmlkKQotCQkJCWNvbnRpbnVlOworCQlnZXRfbm9kZV9hY3RpdmVfcmVnaW9uKHN0YXJ0X3BmbiwgJm5vZGVfYXIpOworCQl3aGlsZSAoc3RhcnRfcGZuIDwgZW5kX3BmbikgeworCQkJLyoKKwkJCSAqIGlmIHJlc2VydmVkIHJlZ2lvbiBleHRlbmRzIHBhc3QgYWN0aXZlIHJlZ2lvbgorCQkJICogdGhlbiB0cmltIHNpemUgdG8gYWN0aXZlIHJlZ2lvbgorCQkJICovCisJCQlpZiAoZW5kX3BmbiA+IG5vZGVfYXIuZW5kX3BmbikKKwkJCQlzaXplID0gKG5vZGVfYXIuZW5kX3BmbiA8PCBQQUdFX1NISUZUKQorCQkJCQktIChzdGFydF9wZm4gPDwgUEFHRV9TSElGVCk7CisJCQlkYmcoInJlc2VydmVfYm9vdG1lbSAlbHggJWx4IG5pZD0lZFxuIiwgcGh5c2Jhc2UsIHNpemUsCisJCQkJbm9kZV9hci5uaWQpOworCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGVfYXIubmlkKSwgcGh5c2Jhc2UsCisJCQkJCQlzaXplLCBCT09UTUVNX0RFRkFVTFQpOworCQkJLyoKKwkJCSAqIGlmIHJlc2VydmVkIHJlZ2lvbiBpcyBjb250YWluZWQgaW4gdGhlIGFjdGl2ZSByZWdpb24KKwkJCSAqIHRoZW4gZG9uZS4KKwkJCSAqLworCQkJaWYgKGVuZF9wZm4gPD0gbm9kZV9hci5lbmRfcGZuKQorCQkJCWJyZWFrOwogCi0JCQlpZiAocGh5c2Jhc2UgPCBlbmRfcGFkZHIgJiYKLQkJCSAgICAocGh5c2Jhc2Urc2l6ZSkgPiBzdGFydF9wYWRkcikgewotCQkJCS8qIG92ZXJsYXBzICovCi0JCQkJaWYgKHBoeXNiYXNlIDwgc3RhcnRfcGFkZHIpIHsKLQkJCQkJc2l6ZSAtPSBzdGFydF9wYWRkciAtIHBoeXNiYXNlOwotCQkJCQlwaHlzYmFzZSA9IHN0YXJ0X3BhZGRyOwotCQkJCX0KLQotCQkJCWlmIChzaXplID4gZW5kX3BhZGRyIC0gcGh5c2Jhc2UpCi0JCQkJCXNpemUgPSBlbmRfcGFkZHIgLSBwaHlzYmFzZTsKLQotCQkJCWRiZygicmVzZXJ2ZV9ib290bWVtICVseCAlbHhcbiIsIHBoeXNiYXNlLAotCQkJCSAgICBzaXplKTsKLQkJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgcGh5c2Jhc2UsCi0JCQkJCQkgICAgIHNpemUsIEJPT1RNRU1fREVGQVVMVCk7Ci0JCQl9CisJCQkvKgorCQkJICogcmVzZXJ2ZWQgcmVnaW9uIGV4dGVuZHMgcGFzdCB0aGUgYWN0aXZlIHJlZ2lvbgorCQkJICogICBnZXQgbmV4dCBhY3RpdmUgcmVnaW9uIHRoYXQgY29udGFpbnMgdGhpcworCQkJICogICByZXNlcnZlZCByZWdpb24KKwkJCSAqLworCQkJc3RhcnRfcGZuID0gbm9kZV9hci5lbmRfcGZuOworCQkJcGh5c2Jhc2UgPSBzdGFydF9wZm4gPDwgUEFHRV9TSElGVDsKKwkJCWdldF9ub2RlX2FjdGl2ZV9yZWdpb24oc3RhcnRfcGZuLCAmbm9kZV9hcik7CiAJCX0KIAotCQlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQpOwogCX0KKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKKwkJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKIH0KIAogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IDIwMDFhYmQuLmMzMWQ2ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtNzMsNyArNzMsNyBAQAogI2VuZGlmIC8qIEhBVkVfVExCQ0FNICovCiAKICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCi0vKiA0NHggdXNlcyBhbiA4a0IgcGdkaXIgYmVjYXVzZSBpdCBoYXMgOC1ieXRlIExpbnV4IFBURXMuICovCisvKiBTb21lIHByb2Nlc3NvcnMgdXNlIGFuIDhrQiBwZ2RpciBiZWNhdXNlIHRoZXkgaGF2ZSA4LWJ5dGUgTGludXggUFRFcy4gKi8KICNkZWZpbmUgUEdESVJfT1JERVIJMQogI2Vsc2UKICNkZWZpbmUgUEdESVJfT1JERVIJMApAQCAtMjg4LDcgKzI4OCw3IEBACiB9CiAKIC8qCi0gKiBNYXAgaW4gYWxsIG9mIHBoeXNpY2FsIG1lbW9yeSBzdGFydGluZyBhdCBLRVJORUxCQVNFLgorICogTWFwIGluIGEgYmlnIGNodW5rIG9mIHBoeXNpY2FsIG1lbW9yeSBzdGFydGluZyBhdCBLRVJORUxCQVNFLgogICovCiB2b2lkIF9faW5pdCBtYXBpbl9yYW0odm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwppbmRleCBlYjRiNTEyLi5mOWE0N2ZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCkBAIC00NSw2ICs0NSw3IEBACiAJCWZsdXNoX2hhc2hfcGFnZXMobW0tPmNvbnRleHQuaWQsIGFkZHIsIHB0ZXBoeXMsIDEpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woZmx1c2hfaGFzaF9lbnRyeSk7CiAKIC8qCiAgKiBDYWxsZWQgYnkgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzLCBtdXN0IGZsdXNoIG9uIENQVXMgZm9yIHdoaWNoIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvdm1hX21hcC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvdm1hX21hcC5jCmluZGV4IGZmZjY2NjYuLjI1OGZhNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3ZtYV9tYXAuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC92bWFfbWFwLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCSAqLwogCW92ZXJsYXlfdGJsX29mZnNldCA9IHZtYV9tYXBfbG9va3VwKG1hcCwgb3ZseV90YWJsZV9zeW0sCiAJCQkJCSAgICBhU3B1LCAmZ3JkX3ZhbCk7Ci0JaWYgKG92ZXJsYXlfdGJsX29mZnNldCA8IDApIHsKKwlpZiAob3ZlcmxheV90Ymxfb2Zmc2V0ID4gMHgxMDAwMDAwMCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNQVV9QUk9GOiAiCiAJCSAgICAgICAiJXMsIGxpbmUgJWQ6IEVycm9yIGZpbmRpbmcgU1BVIG92ZXJsYXkgdGFibGVcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IDQ0NmE4YmIuLjNlM2Q5MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTY0LDcgKzY0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIHZvaWQgcHBjNjRfZW5hYmxlX3BtY3Modm9pZCk7CitleHRlcm4gdm9pZCBwcGNfZW5hYmxlX3BtY3Modm9pZCk7CiAKIC8qCiAgKiBPbGRlciBDUFVzIHJlcXVpcmUgdGhlIE1NQ1JBIHNhbXBsZSBiaXQgdG8gYmUgYWx3YXlzIHNldCwgYnV0IG5ld2VyIApAQCAtOTEsNyArOTEsNyBAQAogCXVuc2lnbmVkIGludCBtbWNyMCA9IG1tY3IwX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG1tY3JhID0gbW1jcmFfdmFsOwogCi0JcHBjNjRfZW5hYmxlX3BtY3MoKTsKKwlwcGNfZW5hYmxlX3BtY3MoKTsKIAogCS8qIHNldCB0aGUgZnJlZXplIGJpdCAqLwogCW1tY3IwIHw9IE1NQ1IwX0ZDOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcKaW5kZXggMjQ5YmEwMS4uNzljMTE1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCWJvb2wgIkJhbWJvbyIKIAlkZXBlbmRzIG9uIDQ0eAogCWRlZmF1bHQgbgorCXNlbGVjdCBQUEM0NHhfU0lNUExFCiAJc2VsZWN0IDQ0MEVQCiAJc2VsZWN0IFBDSQogCWhlbHAKQEAgLTMwLDYgKzMxLDcgQEAKIAlib29sICJTZXF1b2lhIgogCWRlcGVuZHMgb24gNDR4CiAJZGVmYXVsdCBuCisJc2VsZWN0IFBQQzQ0eF9TSU1QTEUKIAlzZWxlY3QgNDQwRVBYCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQU1DQyBQUEM0NDBFUFggZXZhbHVhdGlvbiBib2FyZC4KQEAgLTM4LDYgKzQwLDcgQEAKIAlib29sICJUYWlzaGFuIgogCWRlcGVuZHMgb24gNDR4CiAJZGVmYXVsdCBuCisJc2VsZWN0IFBQQzQ0eF9TSU1QTEUKIAlzZWxlY3QgNDQwR1gKIAlzZWxlY3QgUENJCiAJaGVscApAQCAtNDgsNiArNTEsNyBAQAogCWJvb2wgIkthdG1haSIKIAlkZXBlbmRzIG9uIDQ0eAogCWRlZmF1bHQgbgorCXNlbGVjdCBQUEM0NHhfU0lNUExFCiAJc2VsZWN0IDQ0MFNQZQogCXNlbGVjdCBQQ0kKIAlzZWxlY3QgUFBDNHh4X1BDSV9FWFBSRVNTCkBAIC01OCw2ICs2Miw3IEBACiAJYm9vbCAiUmFpbmllciIKIAlkZXBlbmRzIG9uIDQ0eAogCWRlZmF1bHQgbgorCXNlbGVjdCBQUEM0NHhfU0lNUExFCiAJc2VsZWN0IDQ0MEdSWAogCXNlbGVjdCBQQ0kKIAloZWxwCkBAIC03NiwyMCArODEsNDggQEAKIAkgIFNlZSBodHRwOi8vd3d3LnBpa2F0ZWNobm9sb2dpZXMuY29tLyBhbmQgZm9sbG93IHRoZSAiUElLQSBmb3IgQ29tcHV0ZXIKIAkgIFRlbGVwaG9ueSBEZXZlbG9wZXJzIiBsaW5rIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCitjb25maWcgQVJDSEVTCisJYm9vbCAiQXJjaGVzIgorCWRlcGVuZHMgb24gNDR4CisJZGVmYXVsdCBuCisJc2VsZWN0IFBQQzQ0eF9TSU1QTEUKKwlzZWxlY3QgNDYwRVggIyBPZGQgc2luY2UgaXQgdXNlcyA0NjBHVCBidXQgdGhlIGVmZmVjdHMgYXJlIHRoZSBzYW1lCisJc2VsZWN0IFBDSQorCXNlbGVjdCBQUEM0eHhfUENJX0VYUFJFU1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBTUNDIER1YWwgUFBDNDYwR1QgZXZhbHVhdGlvbiBib2FyZC4KKwogY29uZmlnIENBTllPTkxBTkRTCiAJYm9vbCAiQ2FueW9ubGFuZHMiCiAJZGVwZW5kcyBvbiA0NHgKIAlkZWZhdWx0IG4KKwlzZWxlY3QgUFBDNDR4X1NJTVBMRQogCXNlbGVjdCA0NjBFWAogCXNlbGVjdCBQQ0kKIAlzZWxlY3QgUFBDNHh4X1BDSV9FWFBSRVNTCisJc2VsZWN0IElCTV9ORVdfRU1BQ19SR01JSQorCXNlbGVjdCBJQk1fTkVXX0VNQUNfWk1JSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFNQ0MgUFBDNDYwRVggZXZhbHVhdGlvbiBib2FyZC4KIAorY29uZmlnIEdMQUNJRVIKKwlib29sICJHbGFjaWVyIgorCWRlcGVuZHMgb24gNDR4CisJZGVmYXVsdCBuCisJc2VsZWN0IFBQQzQ0eF9TSU1QTEUKKwlzZWxlY3QgNDYwRVggIyBPZGQgc2luY2UgaXQgdXNlcyA0NjBHVCBidXQgdGhlIGVmZmVjdHMgYXJlIHRoZSBzYW1lCisJc2VsZWN0IFBDSQorCXNlbGVjdCBQUEM0eHhfUENJX0VYUFJFU1MKKwlzZWxlY3QgSUJNX05FV19FTUFDX1JHTUlJCisJc2VsZWN0IElCTV9ORVdfRU1BQ19aTUlJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQU1DQyBQUEM0NjBHVCBldmFsdWF0aW9uIGJvYXJkLgorCiBjb25maWcgWU9TRU1JVEUKIAlib29sICJZb3NlbWl0ZSIKIAlkZXBlbmRzIG9uIDQ0eAogCWRlZmF1bHQgbgorCXNlbGVjdCBQUEM0NHhfU0lNUExFCiAJc2VsZWN0IDQ0MEVQCiAJc2VsZWN0IFBDSQogCWhlbHAKQEAgLTEyNyw2ICsxNjAsMTMgQEAKIAkgIE1vc3QgVmlydGV4IDUgZGVzaWducyBzaG91bGQgdXNlIHRoaXMgdW5sZXNzIGl0IG5lZWRzIHRvIGRvIHNvbWUKIAkgIHNwZWNpYWwgY29uZmlndXJhdGlvbiBhdCBib2FyZCBwcm9iZSB0aW1lLgogCitjb25maWcgUFBDNDR4X1NJTVBMRQorCWJvb2wgIlNpbXBsZSBQb3dlclBDIDQ0eCBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gNDR4CisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgc2ltcGxlIFBvd2VyUEMgNDR4IHBsYXRmb3JtIHN1cHBvcnQuCisKICMgNDR4IHNwZWNpZmljIENQVSBtb2R1bGVzLCBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgYm9hcmQgYWJvdmUuCiBjb25maWcgNDQwRVAKIAlib29sCkBAIC0xNzAsOCArMjEwLDYgQEAKIAlib29sCiAJc2VsZWN0IFBQQ19GUFUKIAlzZWxlY3QgSUJNX05FV19FTUFDX0VNQUM0Ci0Jc2VsZWN0IElCTV9ORVdfRU1BQ19SR01JSQotCXNlbGVjdCBJQk1fTkVXX0VNQUNfWk1JSQogCXNlbGVjdCBJQk1fTkVXX0VNQUNfVEFICiAKICMgNDR4IGVycmF0YS93b3JrYXJvdW5kIGNvbmZpZyBzeW1ib2xzLCBzZWxlY3RlZCBieSB0aGUgQ1BVIG1vZGVscyBhYm92ZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQppbmRleCA4ZDBiMWExLi42OTgxMzMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQpAQCAtMSwxMyArMSw3IEBACiBvYmotJChDT05GSUdfNDR4KQk6PSBtaXNjXzQ0eC5vIGlkbGUubworb2JqLSQoQ09ORklHX1BQQzQ0eF9TSU1QTEUpICs9IHBwYzQ0eF9zaW1wbGUubwogb2JqLSQoQ09ORklHX0VCT05ZKQkrPSBlYm9ueS5vCi1vYmotJChDT05GSUdfVEFJU0hBTikJKz0gdGFpc2hhbi5vCi1vYmotJChDT05GSUdfQkFNQk9PKQkrPSBiYW1ib28ubwotb2JqLSQoQ09ORklHX1lPU0VNSVRFKQkrPSBiYW1ib28ubwogb2JqLSQoQ09ORklHX1NBTTQ0MEVQKSAJKz0gc2FtNDQwZXAubwotb2JqLSQoQ09ORklHX1NFUVVPSUEpCSs9IHNlcXVvaWEubwotb2JqLSQoQ09ORklHX0tBVE1BSSkJKz0ga2F0bWFpLm8KLW9iai0kKENPTkZJR19SQUlOSUVSKQkrPSByYWluaWVyLm8KIG9iai0kKENPTkZJR19XQVJQKQkrPSB3YXJwLm8KIG9iai0kKENPTkZJR19XQVJQKQkrPSB3YXJwLW5hbmQubwotb2JqLSQoQ09ORklHX0NBTllPTkxBTkRTKSArPSBjYW55b25sYW5kcy5vCiBvYmotJChDT05GSUdfWElMSU5YX1ZJUlRFWF81X0ZYVCkgKz0gdmlydGV4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2JhbWJvby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvYmFtYm9vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjE2OWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvYmFtYm9vLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQmFtYm9vIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzCi0gKgotICogV2FkZSBGYXJuc3dvcnRoIDx3ZmFybnN3b3J0aEBtdmlzdGEuY29tPgotICogQ29weXJpZ2h0IDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKgotICogUmV3cml0dGVuIGFuZCBwb3J0ZWQgdG8gdGhlIG1lcmdlZCBwb3dlcnBjIHRyZWU6Ci0gKiBKb3NoIEJveWVyIDxqd2JveWVyQGxpbnV4LnZuZXQuaWJtLmNvbT4KLSAqIENvcHlyaWdodCAyMDA3IElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL3VpYy5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYzR4eC5oPgotCi1zdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJhbWJvb19vZl9idXNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImlibSxwbGI0IiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxvcGIiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiaWJtLGViYyIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBiYW1ib29fZGV2aWNlX3Byb2JlKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIGJhbWJvb19vZl9idXMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChiYW1ib28sIGJhbWJvb19kZXZpY2VfcHJvYmUpOwotCi1zdGF0aWMgaW50IF9faW5pdCBiYW1ib29fcHJvYmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiYW1jYyxiYW1ib28iKSkKLQkJcmV0dXJuIDA7Ci0KLQlwcGNfcGNpX2ZsYWdzID0gUFBDX1BDSV9SRUFTU0lHTl9BTExfUlNSQzsKLQotCXJldHVybiAxOwotfQotCi1kZWZpbmVfbWFjaGluZShiYW1ib28pIHsKLQkubmFtZSAJCQk9ICJCYW1ib28iLAotCS5wcm9iZSAJCQk9IGJhbWJvb19wcm9iZSwKLQkucHJvZ3Jlc3MgCQk9IHVkYmdfcHJvZ3Jlc3MsCi0JLmluaXRfSVJRIAkJPSB1aWNfaW5pdF90cmVlLAotCS5nZXRfaXJxIAkJPSB1aWNfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBwcGM0eHhfcmVzZXRfc3lzdGVtLAotCS5jYWxpYnJhdGVfZGVjciAJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2NhbnlvbmxhbmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9jYW55b25sYW5kcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQ5Mjg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2NhbnlvbmxhbmRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ2FueW9ubGFuZHMgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+Ci0gKgotICogQmFzZWQgb24gdGhlIEthdG1haSBjb2RlIGJ5Ci0gKiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKiBDb3B5cmlnaHQgMjAwNyBJQk0gQ29ycC4KLSAqIEpvc2ggQm95ZXIgPGp3Ym95ZXJAbGludXgudm5ldC5pYm0uY29tPgotICogQ29weXJpZ2h0IDIwMDcgSUJNIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vdWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vcHBjNHh4Lmg+Ci0KLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgY2FueW9ubGFuZHNfb2ZfYnVzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiNCIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxlYmMiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgY2FueW9ubGFuZHNfZGV2aWNlX3Byb2JlKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIGNhbnlvbmxhbmRzX29mX2J1cywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKGNhbnlvbmxhbmRzLCBjYW55b25sYW5kc19kZXZpY2VfcHJvYmUpOwotCi1zdGF0aWMgaW50IF9faW5pdCBjYW55b25sYW5kc19wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJhbWNjLGNhbnlvbmxhbmRzIikpCi0JCXJldHVybiAwOwotCi0JcHBjX3BjaV9mbGFncyA9IFBQQ19QQ0lfUkVBU1NJR05fQUxMX1JTUkM7Ci0KLQlyZXR1cm4gMTsKLX0KLQotZGVmaW5lX21hY2hpbmUoY2FueW9ubGFuZHMpIHsKLQkubmFtZSAJCQkJPSAiQ2FueW9ubGFuZHMiLAotCS5wcm9iZSAJCQkJPSBjYW55b25sYW5kc19wcm9iZSwKLQkucHJvZ3Jlc3MgCQkJPSB1ZGJnX3Byb2dyZXNzLAotCS5pbml0X0lSUSAJCQk9IHVpY19pbml0X3RyZWUsCi0JLmdldF9pcnEgCQkJPSB1aWNfZ2V0X2lycSwKLQkucmVzdGFydAkJCT0gcHBjNHh4X3Jlc2V0X3N5c3RlbSwKLQkuY2FsaWJyYXRlX2RlY3IJCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgva2F0bWFpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9rYXRtYWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNGIzYS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9rYXRtYWkuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBLYXRtYWkgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMKLSAqCi0gKiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKiBDb3B5cmlnaHQgMjAwNyBJQk0gQ29ycC4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgQmFtYm9vIGNvZGUgYnkKLSAqIEpvc2ggQm95ZXIgPGp3Ym95ZXJAbGludXgudm5ldC5pYm0uY29tPgotICogQ29weXJpZ2h0IDIwMDcgSUJNIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vdWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxhc20vcHBjNHh4Lmg+Ci0KLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQga2F0bWFpX29mX2J1c1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiaWJtLHBsYjQiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiaWJtLG9wYiIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJpYm0sZWJjIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGthdG1haV9kZXZpY2VfcHJvYmUodm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwga2F0bWFpX29mX2J1cywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKGthdG1haSwga2F0bWFpX2RldmljZV9wcm9iZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGthdG1haV9wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJhbWNjLGthdG1haSIpKQotCQlyZXR1cm4gMDsKLQotCXBwY19wY2lfZmxhZ3MgPSBQUENfUENJX1JFQVNTSUdOX0FMTF9SU1JDOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWRlZmluZV9tYWNoaW5lKGthdG1haSkgewotCS5uYW1lIAkJCQk9ICJLYXRtYWkiLAotCS5wcm9iZSAJCQkJPSBrYXRtYWlfcHJvYmUsCi0JLnByb2dyZXNzIAkJCT0gdWRiZ19wcm9ncmVzcywKLQkuaW5pdF9JUlEgCQkJPSB1aWNfaW5pdF90cmVlLAotCS5nZXRfaXJxIAkJCT0gdWljX2dldF9pcnEsCi0JLnJlc3RhcnQJCQk9IHBwYzR4eF9yZXNldF9zeXN0ZW0sCi0JLmNhbGlicmF0ZV9kZWNyCQkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3BwYzQ0eF9zaW1wbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3BwYzQ0eF9zaW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY3MTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvcHBjNDR4X3NpbXBsZS5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBHZW5lcmljIFBvd2VyUEMgNDR4IHBsYXRmb3JtIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudHMgc2ltcGxlIHBsYXRmb3JtIHN1cHBvcnQgZm9yIFBvd2VyUEMgNDR4IGNoaXBzLiAgVGhpcyBpcworICogbW9zdGx5IHVzZWQgZm9yIGV2YWwgYm9hcmRzIG9yIG90aGVyIHNpbXBsZSBhbmQgImdlbmVyaWMiIDQ0eCBib2FyZHMuICBJZgorICogeW91ciBib2FyZCBoYXMgY3VzdG9tIGZ1bmN0aW9ucyBvciBoYXJkd2FyZSwgdGhlbiB5b3Ugd2lsbCBsaWtlbHkgd2FudCB0bworICogaW1wbGVtZW50IHlvdXIgb3duIGJvYXJkLmMgZmlsZSB0byBhY2NvbW1vZGF0ZSBpdC4KKyAqLworCisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9wcGM0eHguaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vdWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9mX2RldmljZV9pZCBwcGM0NHhfb2ZfYnVzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiNCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlibSxlYmMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGM0NHhfZGV2aWNlX3Byb2JlKHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHBwYzQ0eF9vZl9idXMsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwcGM0NHhfc2ltcGxlLCBwcGM0NHhfZGV2aWNlX3Byb2JlKTsKKworLyogVGhpcyBpcyB0aGUgbGlzdCBvZiBib2FyZHMgdGhhdCBjYW4gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgc2ltcGxlCisgKiBwbGF0Zm9ybSBjb2RlLiAgVGhpcyBkb2VzIF9ub3RfIG1lYW4gdGhlIGJvYXJkcyBhcmUgY29tcGF0aWJsZSwKKyAqIGFzIHRoZXkgbW9zdCBjZXJ0YWlubHkgYXJlIG5vdCBmcm9tIGEgZGV2aWNlIHRyZWUgcGVyc3BlY3RpdmUuCisgKiBIb3dldmVyLCB0aGVpciBkaWZmZXJlbmNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGV2aWNlIHRyZWUgYW5kIHRoZQorICogZHJpdmVycyBhbmQgdGhlcmVmb3JlIHRoZXkgZG9uJ3QgbmVlZCBjdXN0b20gYm9hcmQgc3VwcG9ydCBmaWxlcy4KKyAqCisgKiBBZ2FpbiwgaWYgeW91ciBib2FyZCBuZWVkcyB0byBkbyB0aGluZ3MgZGlmZmVyZW50bHkgdGhlbiBjcmVhdGUgYQorICogYm9hcmQuYyBmaWxlIGZvciBpdCByYXRoZXIgdGhhbiBhZGRpbmcgaXQgdG8gdGhpcyBsaXN0LgorICovCitzdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJhbWNjLGFyY2hlcyIsCisJImFtY2MsYmFtYm9vIiwKKwkiYW1jYyxjYW55b25sYW5kcyIsCisJImFtY2MsZ2xhY2llciIsCisJImlibSxlYm9ueSIsCisJImFtY2Msa2F0bWFpIiwKKwkiYW1jYyxyYWluaWVyIiwKKwkiYW1jYyxzZXF1b2lhIiwKKwkiYW1jYyx0YWlzaGFuIiwKKwkiYW1jYyx5b3NlbWl0ZSIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ0eF9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZCk7IGkrKykgeworCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsIGJvYXJkW2ldKSkgeworCQkJcHBjX3BjaV9mbGFncyA9IFBQQ19QQ0lfUkVBU1NJR05fQUxMX1JTUkM7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitkZWZpbmVfbWFjaGluZShwcGM0NHhfc2ltcGxlKSB7CisJLm5hbWUgPSAiUG93ZXJQQyA0NHggUGxhdGZvcm0iLAorCS5wcm9iZSA9IHBwYzQ0eF9wcm9iZSwKKwkucHJvZ3Jlc3MgPSB1ZGJnX3Byb2dyZXNzLAorCS5pbml0X0lSUSA9IHVpY19pbml0X3RyZWUsCisJLmdldF9pcnEgPSB1aWNfZ2V0X2lycSwKKwkucmVzdGFydCA9IHBwYzR4eF9yZXNldF9zeXN0ZW0sCisJLmNhbGlicmF0ZV9kZWNyID0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9yYWluaWVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9yYWluaWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWZmODQuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvcmFpbmllci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIFJhaW5pZXIgYm9hcmQgc3BlY2lmaWMgcm91dGluZXMKLSAqCi0gKiBWYWxlbnRpbmUgQmFyc2hhayA8dmJhcnNoYWtAcnUubXZpc3RhLmNvbT4KLSAqIENvcHlyaWdodCAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICoKLSAqIEJhc2VkIG9uIHRoZSBCYW1ib28gY29kZSBieQotICogSm9zaCBCb3llciA8andib3llckBsaW51eC52bmV0LmlibS5jb20+Ci0gKiBDb3B5cmlnaHQgMjAwNyBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3VkYmcuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS91aWMuaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9wcGM0eHguaD4KLQotc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9mX2RldmljZV9pZCByYWluaWVyX29mX2J1c1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiaWJtLHBsYjQiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiaWJtLG9wYiIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJpYm0sZWJjIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhaW5pZXJfZGV2aWNlX3Byb2JlKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHJhaW5pZXJfb2ZfYnVzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocmFpbmllciwgcmFpbmllcl9kZXZpY2VfcHJvYmUpOwotCi1zdGF0aWMgaW50IF9faW5pdCByYWluaWVyX3Byb2JlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImFtY2MscmFpbmllciIpKQotCQlyZXR1cm4gMDsKLQotCXBwY19wY2lfZmxhZ3MgPSBQUENfUENJX1JFQVNTSUdOX0FMTF9SU1JDOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWRlZmluZV9tYWNoaW5lKHJhaW5pZXIpIHsKLQkubmFtZSAJCQkJPSAiUmFpbmllciIsCi0JLnByb2JlIAkJCQk9IHJhaW5pZXJfcHJvYmUsCi0JLnByb2dyZXNzIAkJCT0gdWRiZ19wcm9ncmVzcywKLQkuaW5pdF9JUlEgCQkJPSB1aWNfaW5pdF90cmVlLAotCS5nZXRfaXJxIAkJCT0gdWljX2dldF9pcnEsCi0JLnJlc3RhcnQJCQk9IHBwYzR4eF9yZXNldF9zeXN0ZW0sCi0JLmNhbGlicmF0ZV9kZWNyCQkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3NlcXVvaWEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3NlcXVvaWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYjczZC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9zZXF1b2lhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogU2VxdW9pYSBib2FyZCBzcGVjaWZpYyByb3V0aW5lcwotICoKLSAqIFZhbGVudGluZSBCYXJzaGFrIDx2YmFyc2hha0BydS5tdmlzdGEuY29tPgotICogQ29weXJpZ2h0IDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKgotICogQmFzZWQgb24gdGhlIEJhbWJvbyBjb2RlIGJ5Ci0gKiBKb3NoIEJveWVyIDxqd2JveWVyQGxpbnV4LnZuZXQuaWJtLmNvbT4KLSAqIENvcHlyaWdodCAyMDA3IElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL3VpYy5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHBjNHh4Lmg+Ci0KLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgc2VxdW9pYV9vZl9idXNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImlibSxwbGI0IiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxvcGIiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiaWJtLGViYyIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzZXF1b2lhX2RldmljZV9wcm9iZSh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBzZXF1b2lhX29mX2J1cywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHNlcXVvaWEsIHNlcXVvaWFfZGV2aWNlX3Byb2JlKTsKLQotc3RhdGljIGludCBfX2luaXQgc2VxdW9pYV9wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJhbWNjLHNlcXVvaWEiKSkKLQkJcmV0dXJuIDA7Ci0KLQlwcGNfcGNpX2ZsYWdzID0gUFBDX1BDSV9SRUFTU0lHTl9BTExfUlNSQzsKLQotCXJldHVybiAxOwotfQotCi1kZWZpbmVfbWFjaGluZShzZXF1b2lhKSB7Ci0JLm5hbWUgCQkJCT0gIlNlcXVvaWEiLAotCS5wcm9iZSAJCQkJPSBzZXF1b2lhX3Byb2JlLAotCS5wcm9ncmVzcyAJCQk9IHVkYmdfcHJvZ3Jlc3MsCi0JLmluaXRfSVJRIAkJCT0gdWljX2luaXRfdHJlZSwKLQkuZ2V0X2lycSAJCQk9IHVpY19nZXRfaXJxLAotCS5yZXN0YXJ0CQkJPSBwcGM0eHhfcmVzZXRfc3lzdGVtLAotCS5jYWxpYnJhdGVfZGVjcgkJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC90YWlzaGFuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC90YWlzaGFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yzc4YjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvdGFpc2hhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIFRhaXNoYW4gYm9hcmQgc3BlY2lmaWMgcm91dGluZXMgYmFzZWQgb2ZmIGVib255LmMgY29kZQotICogb3JpZ2luYWwgY29weXJpZ2h0cyBiZWxvdwotICoKLSAqIE1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKiBDb3B5cmlnaHQgMjAwMi0yMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICoKLSAqIEV1Z2VuZSBTdXJvdmVnaW4gPGV1Z2VuZS5zdXJvdmVnaW5AenVsdHlzLmNvbT4gb3IgPGVic0BlYnNob21lLm5ldD4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IFp1bHR5cyBUZWNobm9sb2dpZXMKLSAqCi0gKiBSZXdyaXR0ZW4gYW5kIHBvcnRlZCB0byB0aGUgbWVyZ2VkIHBvd2VycGMgdHJlZToKLSAqIENvcHlyaWdodCAyMDA3IERhdmlkIEdpYnNvbiA8ZHdnQGF1MS5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uLgotICoKLSAqIE1vZGlmaWVkIGZyb20gZWJvbnkuYyBmb3IgdGFpc2hhbjoKLSAqIENvcHlyaWdodCAyMDA3IEh1Z2ggQmxlbWluZ3MgPGh1Z2hAYXUuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL3VpYy5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYzR4eC5oPgotCi1zdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRhaXNoYW5fb2ZfYnVzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiNCIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxlYmMiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdGFpc2hhbl9kZXZpY2VfcHJvYmUodm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgdGFpc2hhbl9vZl9idXMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbCh0YWlzaGFuLCB0YWlzaGFuX2RldmljZV9wcm9iZSk7Ci0KLS8qCi0gKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKLSAqLwotc3RhdGljIGludCBfX2luaXQgdGFpc2hhbl9wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJhbWNjLHRhaXNoYW4iKSkKLQkJcmV0dXJuIDA7Ci0KLQlwcGNfcGNpX2ZsYWdzID0gUFBDX1BDSV9SRUFTU0lHTl9BTExfUlNSQzsKLQotCXJldHVybiAxOwotfQotCi1kZWZpbmVfbWFjaGluZSh0YWlzaGFuKSB7Ci0JLm5hbWUJCQk9ICJUYWlzaGFuIiwKLQkucHJvYmUJCQk9IHRhaXNoYW5fcHJvYmUsCi0JLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCi0JLmluaXRfSVJRCQk9IHVpY19pbml0X3RyZWUsCi0JLmdldF9pcnEJCT0gdWljX2dldF9pcnEsCi0JLnJlc3RhcnQJCT0gcHBjNHh4X3Jlc2V0X3N5c3RlbSwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCmluZGV4IGM2MmY4OTMuLjMyNjg1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCkBAIC0zLDYgKzMsOCBAQAogCXNlbGVjdCBGU0xfU09DCiAJc2VsZWN0IElQSUMKIAlzZWxlY3QgUFBDX0NMT0NLCisJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFCisJc2VsZWN0IEZTTF9QQ0kgaWYgUENJCiAKIGNvbmZpZyBQUENfTVBDNTEyMQogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMKaW5kZXggNWViZjY5My4uNDQxYWJjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMKQEAgLTIyLDE2ICsyMiwyNiBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KIAorI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CisKICNpbmNsdWRlICJtcGM1MTJ4LmgiCiAjaW5jbHVkZSAibXBjNTEyMV9hZHMuaCIKIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzUxMjFfYWRzX3NldHVwX2FyY2godm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKyNlbmRpZgogCXByaW50ayhLRVJOX0lORk8gIk1QQzUxMjEgQURTIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogCS8qCiAJICogY3BsZCByZWdzIGFyZSBuZWVkZWQgZWFybHkKIAkgKi8KIAltcGM1MTIxX2Fkc19jcGxkX21hcCgpOworCisjaWZkZWYgQ09ORklHX1BDSQorCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjNTEyMS1wY2kiKQorCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM1MTIxX2Fkc19pbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwppbmRleCA0ZDVmZDFkLi4wNDRiNGU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwpAQCAtOTAsNyArOTAsNyBAQAogCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAoIXhsYikgewogCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogIgotCQkJIkVycm9yIG1hcHBpbmcgWExCIGluIG1wYzUyeHhfc2V0dXBfY3B1KCkuICAiCisJCQkiRXJyb3IgbWFwcGluZyBYTEIgaW4gbXBjNTJ4eF9zZXR1cF9jcHUoKS4gIgogCQkJIkV4cGVjdCBzb21lIGFibm9ybWFsIGJlaGF2aW9yXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTIxNiw3ICsyMTYsOCBAQAogCQlvdXRfYmUzMigmbXBjNTJ4eF93ZHQtPmNvdW50LCAweDAwMDAwMGZmKTsKIAkJb3V0X2JlMzIoJm1wYzUyeHhfd2R0LT5tb2RlLCAweDAwMDA5MDA0KTsKIAl9IGVsc2UKLQkJcHJpbnRrKCJtcGM1Mnh4X3Jlc3RhcnQ6IENhbid0IGFjY2VzcyB3ZHQuICIKKwkJcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fICI6ICIKKwkJCSJtcGM1Mnh4X3Jlc3RhcnQ6IENhbid0IGFjY2VzcyB3ZHQuICIKIAkJCSJSZXN0YXJ0IGltcG9zc2libGUsIHN5c3RlbSBoYWx0ZWQuXG4iKTsKIAogCXdoaWxlICgxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggNWEzODJiYi4uYjQ5YTE4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCkBAIC0yNjUsOCArMjY1LDExIEBACiAJLyogTWVtb3J5IHdpbmRvd3MgKi8KIAlyZXMgPSAmaG9zZS0+bWVtX3Jlc291cmNlc1swXTsKIAlpZiAocmVzLT5mbGFncykgewotCQlwcl9kZWJ1ZygibWVtX3Jlc291cmNlWzBdID0gey5zdGFydD0leCwgLmVuZD0leCwgLmZsYWdzPSVseH1cbiIsCi0JCSAgICAgICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzKTsKKwkJcHJfZGVidWcoIm1lbV9yZXNvdXJjZVswXSA9ICIKKwkJICAgICAgICAgInsuc3RhcnQ9JWxseCwgLmVuZD0lbGx4LCAuZmxhZ3M9JWxseH1cbiIsCisJCSAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZW5kLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5mbGFncyk7CiAJCW91dF9iZTMyKCZwY2lfcmVncy0+aXcwYnRhciwKIAkJICAgICAgICAgTVBDNTJ4eF9QQ0lfSVdCVEFSX1RSQU5TTEFUSU9OKHJlcy0+c3RhcnQsIHJlcy0+c3RhcnQsCiAJCSAgICAgICAgICAgICAgICAgIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpKTsKQEAgLTI5Nyw5ICszMDAsMTEgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRGlkbid0IGZpbmQgSU8gcmVzb3VyY2VzXG4iLCBfX0ZJTEVfXyk7CiAJCXJldHVybjsKIAl9Ci0JcHJfZGVidWcoIi5pb19yZXNvdXJjZT17LnN0YXJ0PSV4LC5lbmQ9JXgsLmZsYWdzPSVseH0gIgorCXByX2RlYnVnKCIuaW9fcmVzb3VyY2U9ey5zdGFydD0lbGx4LC5lbmQ9JWxseCwuZmxhZ3M9JWxseH0gIgogCSAgICAgICAgICIuaW9fYmFzZV9waHlzPTB4JXBcbiIsCi0JICAgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsIHJlcy0+ZmxhZ3MsICh2b2lkKilob3NlLT5pb19iYXNlX3BoeXMpOworCSAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZmxhZ3MsICh2b2lkKilob3NlLT5pb19iYXNlX3BoeXMpOwogCW91dF9iZTMyKCZwY2lfcmVncy0+aXcyYnRhciwKIAkgICAgICAgICBNUEM1Mnh4X1BDSV9JV0JUQVJfVFJBTlNMQVRJT04oaG9zZS0+aW9fYmFzZV9waHlzLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPnN0YXJ0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwppbmRleCA3NWViMWVkLi4zMGYwMDhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwpAQCAtMzgsNiArMzgsMTQgQEAKIAkgIFRoaXMgYm9hcmQgaXMgYWxzbyByZXNvbGQgYnkgRnJlZXNjYWxlIGFzIHRoZSBRVUlDQ1N0YXJ0CiAJICBNUEM4MjQ4IEV2YWx1YXRpb24gU3lzdGVtIGFuZC9vciB0aGUgQ1dILVBQQy04MjQ4Ti1WRS4KIAorY29uZmlnIE1HQ09HRQorCWJvb2wgIktleW1pbGUgTUdDT0dFIgorCXNlbGVjdCA4MjcyCisJc2VsZWN0IDgyNjAKKwlzZWxlY3QgRlNMX1NPQworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgS2V5bWlsZSBNR0NPR0UgYm9hcmQuCisKIGVuZGlmCiAKIGNvbmZpZyBQUTJBRFMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9NYWtlZmlsZQppbmRleCA2Y2Q1Y2Q1Li5kOTgyNzkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L01ha2VmaWxlCkBAIC02LDMgKzYsNCBAQAogb2JqLSQoQ09ORklHX1BRMl9BRFNfUENJX1BJQykgKz0gcHEyYWRzLXBjaS1waWMubwogb2JqLSQoQ09ORklHX1BRMkZBRFMpICs9IHBxMmZhZHMubwogb2JqLSQoQ09ORklHX0VQODI0OEUpICs9IGVwODI0OGUubworb2JqLSQoQ09ORklHX01HQ09HRSkgKz0gbWdjb2dlLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9lcDgyNDhlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvZXA4MjQ4ZS5jCmluZGV4IGQ1NzcwZmQuLjBlYjZkN2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvZXA4MjQ4ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9lcDgyNDhlLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQlidXMtPmlycVtpXSA9IC0xOwogCiAJYnVzLT5uYW1lID0gImVwODI0OGUtbWRpby1iaXRiYW5nIjsKLQlidXMtPmRldiA9ICZvZmRldi0+ZGV2OworCWJ1cy0+cGFyZW50ID0gJm9mZGV2LT5kZXY7CiAJc25wcmludGYoYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCByZXMuc3RhcnQpOwogCiAJcmV0dXJuIG1kaW9idXNfcmVnaXN0ZXIoYnVzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tZ2NvZ2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tZ2NvZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFmMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21nY29nZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogS2V5bWlsZSBtZ2NvZ2Ugc3VwcG9ydAorICogQ29weXJpZ2h0IDIwMDggREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyBHbWJICisgKiBBdXRob3I6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorICoKKyAqIGJhc2VkIG9uIGNvZGUgZnJvbToKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY3BtMi5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4MjYwLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+CisKKyNpbmNsdWRlICJwcTIuaCIKKworc3RhdGljIHZvaWQgX19pbml0IG1nY29nZV9waWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHBxMi1waWMiKTsKKwlpZiAoIW5wKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUElDIGluaXQ6IGNhbiBub3QgZmluZCBjcG0tcGljIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJY3BtMl9waWNfaW5pdChucCk7CisJb2Zfbm9kZV9wdXQobnApOworfQorCitzdHJ1Y3QgY3BtX3BpbiB7CisJaW50IHBvcnQsIHBpbiwgZmxhZ3M7Cit9OworCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgY3BtX3BpbiBtZ2NvZ2VfcGluc1tdID0geworCisJLyogU01DMiAqLworCXsxLCA4LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKKwl7MSwgOSwgQ1BNX1BJTl9PVVRQVVQgfCBDUE1fUElOX1BSSU1BUll9LAorCisJLyogU0NDNCAqLworCXszLCAyNSwgQ1BNX1BJTl9JTlBVVCB8IENQTV9QSU5fUFJJTUFSWX0sCisJezMsIDI0LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKKwl7MywgIDksIENQTV9QSU5fSU5QVVQgfCBDUE1fUElOX1BSSU1BUll9LAorCXszLCAgOCwgQ1BNX1BJTl9JTlBVVCB8IENQTV9QSU5fUFJJTUFSWX0sCisJezQsIDIyLCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKKwl7NCwgMjEsIENQTV9QSU5fT1VUUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lvcG9ydHModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1nY29nZV9waW5zKTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBjcG1fcGluICpwaW4gPSAmbWdjb2dlX3BpbnNbaV07CisJCWNwbTJfc2V0X3BpbihwaW4tPnBvcnQgLSAxLCBwaW4tPnBpbiwgcGluLT5mbGFncyk7CisJfQorCisJY3BtMl9zbWNfY2xrX3NldHVwKENQTV9DTEtfU01DMiwgQ1BNX0JSRzgpOworCWNwbTJfY2xrX3NldHVwKENQTV9DTEtfU0NDNCwgQ1BNX0NMSzcsIENQTV9DTEtfUlgpOworCWNwbTJfY2xrX3NldHVwKENQTV9DTEtfU0NDNCwgQ1BNX0NMSzgsIENQTV9DTEtfVFgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbWdjb2dlX3NldHVwX2FyY2godm9pZCkKK3sKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1nY29nZV9zZXR1cF9hcmNoKCkiLCAwKTsKKworCWNwbTJfcmVzZXQoKTsKKworCS8qIFdoZW4gdGhpcyBpcyBzZXQsIHNub29waW5nIENQTSBETUEgZnJvbSBSQU0gY2F1c2VzCisJICogbWFjaGluZSBjaGVja3MuICBTZWUgZXJyYXR1bSBTSVUxOC4KKwkgKi8KKwljbHJiaXRzMzIoJmNwbTJfaW1tci0+aW1fc2l1X2NvbmYuc2l1XzgyeHguc2NfYmNyLCBNUEM4MlhYX0JDUl9QTERQKTsKKworCWluaXRfaW9wb3J0cygpOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJtZ2NvZ2Vfc2V0dXBfYXJjaCgpLCBmaW5pc2giLCAwKTsKK30KKworc3RhdGljICBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfYnVzX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1nY29nZSwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBtZ2NvZ2VfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisJcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAia2V5bWlsZSxtZ2NvZ2UiKTsKK30KKworZGVmaW5lX21hY2hpbmUobWdjb2dlKQoreworCS5uYW1lID0gIktleW1pbGUgTUdDT0dFIiwKKwkucHJvYmUgPSBtZ2NvZ2VfcHJvYmUsCisJLnNldHVwX2FyY2ggPSBtZ2NvZ2Vfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEgPSBtZ2NvZ2VfcGljX2luaXQsCisJLmdldF9pcnEgPSBjcG0yX2dldF9pcnEsCisJLmNhbGlicmF0ZV9kZWNyID0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucmVzdGFydCA9IHBxMl9yZXN0YXJ0LAorCS5wcm9ncmVzcyA9IHVkYmdfcHJvZ3Jlc3MsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwppbmRleCA2MTU5YzVkLi44M2M2NjRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpAQCAtMTksNyArMTksNiBAQAogY29uZmlnIE1QQzgzMnhfTURTCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzgzMnggTURTIgogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQotCXNlbGVjdCBRVUlDQ19FTkdJTkUKIAlzZWxlY3QgUFBDX01QQzgzMngKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzJ4IE1EUyBldmFsdWF0aW9uIGJvYXJkLgpAQCAtMjcsNyArMjYsNiBAQAogY29uZmlnIE1QQzgzMnhfUkRCCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzgzMnggUkRCIgogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQotCXNlbGVjdCBRVUlDQ19FTkdJTkUKIAlzZWxlY3QgUFBDX01QQzgzMngKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzIzIFJEQiBib2FyZC4KQEAgLTU3LDE1ICs1NSwxMiBAQAogY29uZmlnIE1QQzgzNnhfTURTCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzgzNnggTURTIgogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQotCXNlbGVjdCBRVUlDQ19FTkdJTkUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzZ4IE1EUyBQcm9jZXNzb3IgQm9hcmQuCiAKIGNvbmZpZyBNUEM4MzZ4X1JESwogCWJvb2wgIkZyZWVzY2FsZS9Mb2dpYyBNUEM4MzZ4IFJESyIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKLQlzZWxlY3QgUVVJQ0NfRU5HSU5FCi0Jc2VsZWN0IFFFX0dQSU8KIAlzZWxlY3QgRlNMX0dUTQogCXNlbGVjdCBGU0xfTEJDCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9tZHMuYwppbmRleCBiZTYyZGUyLi44YmIxM2M4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9tZHMuYwpAQCAtODUsOCArODUsMTQgQEAKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4Mzd4X21kc19zZXR1cF9hcmNoKCkiLCAwKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikgeworCQlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7CisJCQlwcl93YXJuaW5nKCIlczogZGlzYWJsZWQgYnkgdGhlIGZpcm13YXJlLlxuIiwKKwkJCQkgICBucC0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CisJfQogI2VuZGlmCiAJbXBjODM3eG1kc191c2JfY2ZnKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCmluZGV4IDI5MTY3NWIuLmI3OWRjNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCkBAIC0zMyw3ICszMyw2IEBACiBjb25maWcgTVBDODV4eF9NRFMKIAlib29sICJGcmVlc2NhbGUgTVBDODV4eCBNRFMiCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCi0Jc2VsZWN0IFFVSUNDX0VOR0lORQogCXNlbGVjdCBQSFlMSUIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4NXh4IE1EUyBib2FyZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwppbmRleCBkMTc4MDdhLi4wMjkzZTNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwpAQCAtMjEzLDcgKzIxMyw2IEBACiAJc3ZpZCA9IG1mc3ByKFNQUk5fU1ZSKTsKIAogCXNlcV9wcmludGYobSwgIlZlbmRvclx0XHQ6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKLQlzZXFfcHJpbnRmKG0sICJNYWNoaW5lXHRcdDogbXBjODV4eFxuIik7CiAJc2VxX3ByaW50ZihtLCAiUFZSXHRcdDogMHgleFxuIiwgcHZpZCk7CiAJc2VxX3ByaW50ZihtLCAiU1ZSXHRcdDogMHgleFxuIiwgc3ZpZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCmluZGV4IDY1MDlhZGUuLjBjOWE4NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzYmM4NTYwX3BpbnMpOyBpKyspIHsKLQkJc3RydWN0IGNwbV9waW4gKnBpbiA9ICZzYmM4NTYwX3BpbnNbaV07CisJCWNvbnN0IHN0cnVjdCBjcG1fcGluICpwaW4gPSAmc2JjODU2MF9waW5zW2ldOwogCQljcG0yX3NldF9waW4ocGluLT5wb3J0LCBwaW4tPnBpbiwgcGluLT5mbGFncyk7CiAJfQogCkBAIC0yMDAsNyArMjAwLDYgQEAKIAlzdmlkID0gbWZzcHIoU1BSTl9TVlIpOwogCiAJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogV2luZCBSaXZlclxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiTWFjaGluZVx0XHQ6IFNCQzg1NjBcbiIpOwogCXNlcV9wcmludGYobSwgIlBWUlx0XHQ6IDB4JXhcbiIsIHB2aWQpOwogCXNlcV9wcmludGYobSwgIlNWUlx0XHQ6IDB4JXhcbiIsIHN2aWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCmluZGV4IDkzNTVhNTIuLjc3ZGQ3OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCkBAIC0zMSw2ICszMSwxMyBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQzg2MTAgSFBDRCBib2FyZC4KIAorY29uZmlnIEdFRl9TQkM2MTAKKwlib29sICJHRSBGYW51YyBTQkM2MTAiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IEhBU19SQVBJRElPCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBHRSBGYW51YydzIFNCQzYxMC4KKwogZW5kaWYKIAogY29uZmlnIE1QQzg2NDEKQEAgLTM5LDcgKzQ2LDcgQEAKIAlzZWxlY3QgRlNMX1BDSSBpZiBQQ0kKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKIAlzZWxlY3QgTVBJQwotCWRlZmF1bHQgeSBpZiBNUEM4NjQxX0hQQ04gfHwgU0JDODY0MUQKKwlkZWZhdWx0IHkgaWYgTVBDODY0MV9IUENOIHx8IFNCQzg2NDFEIHx8IEdFRl9TQkM2MTAKIAogY29uZmlnIE1QQzg2MTAKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvTWFrZWZpbGUKaW5kZXggOGZlZTM3ZC4uNGE1NmZmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZQpAQCAtNywzICs3LDQgQEAKIG9iai0kKENPTkZJR19NUEM4NjQxX0hQQ04pCSs9IG1wYzg2eHhfaHBjbi5vCiBvYmotJChDT05GSUdfU0JDODY0MUQpCQkrPSBzYmM4NjQxZC5vCiBvYmotJChDT05GSUdfTVBDODYxMF9IUENEKQkrPSBtcGM4NjEwX2hwY2Qubworb2JqLSQoQ09ORklHX0dFRl9TQkM2MTApCSs9IGdlZl9zYmM2MTAubyBnZWZfcGljLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3BpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDBhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3BpYy5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogSW50ZXJydXB0IGhhbmRsaW5nIGZvciBHRSBGYW51YydzIEZQR0EgYmFzZWQgUElDCisgKgorICogQXV0aG9yOiBNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZWZhbnVjLmNvbT4KKyAqCisgKiAyMDA4IChjKSBHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImdlZl9waWMuaCIKKworI2RlZmluZSBERUJVRworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IHByaW50ayhLRVJOX0RFQlVHICJnZWZfcGljOiAiIGZtdCk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBHRUZfUElDX05VTV9JUlFTCTMyCisKKy8qIEludGVycnVwdCBDb250cm9sbGVyIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0VGX1BJQ19JTlRSX1NUQVRVUwkweDAwMDAKKworI2RlZmluZSBHRUZfUElDX0lOVFJfTUFTSyhjcHUpCSgweDAwMTAgKyAoMHg0ICogY3B1KSkKKyNkZWZpbmUgR0VGX1BJQ19DUFUwX0lOVFJfTUFTSwlHRUZfUElDX0lOVFJfTUFTSygwKQorI2RlZmluZSBHRUZfUElDX0NQVTFfSU5UUl9NQVNLCUdFRl9QSUNfSU5UUl9NQVNLKDEpCisKKyNkZWZpbmUgR0VGX1BJQ19NQ1BfTUFTSyhjcHUpCSgweDAwMTggKyAoMHg0ICogY3B1KSkKKyNkZWZpbmUgR0VGX1BJQ19DUFUwX01DUF9NQVNLCUdFRl9QSUNfTUNQX01BU0soMCkKKyNkZWZpbmUgR0VGX1BJQ19DUFUxX01DUF9NQVNLCUdFRl9QSUNfTUNQX01BU0soMSkKKworI2RlZmluZSBnZWZfaXJxX3RvX2h3KHZpcnEpICAgICgodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnEpCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyhnZWZfcGljX2xvY2spOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnZWZfcGljX2lycV9yZWdfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3QgKmdlZl9waWNfaXJxX2hvc3Q7CitzdGF0aWMgaW50IGdlZl9waWNfY2FzY2FkZV9pcnE7CisKKy8qCisgKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBIYW5kbGluZworICoKKyAqIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBoYW5kbGVzIGludGVycnVwdHMgZm9yIG1vc3Qgb24gYm9hcmQgaW50ZXJydXB0cywKKyAqIGFwYXJ0IGZyb20gUENJIGludGVycnVwdHMuIEZvciBleGFtcGxlIG9uIFNCQzYxMDoKKyAqCisgKiAxNzozMSBSTyBSZXNlcnZlZAorICogMTYgICAgUk8gUENJIEV4cHJlc3MgRG9vcmJlbGwgMyBTdGF0dXMKKyAqIDE1ICAgIFJPIFBDSSBFeHByZXNzIERvb3JiZWxsIDIgU3RhdHVzCisgKiAxNCAgICBSTyBQQ0kgRXhwcmVzcyBEb29yYmVsbCAxIFN0YXR1cworICogMTMgICAgUk8gUENJIEV4cHJlc3MgRG9vcmJlbGwgMCBTdGF0dXMKKyAqIDEyICAgIFJPIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgU3RhdHVzCisgKiAxMSAgICBSTyBUZW1wZXJhdHVyZSBJbnRlcnJ1cHQgU3RhdHVzCisgKiAxMCAgICBSTyBUZW1wZXJhdHVyZSBDcml0aWNhbCBJbnRlcnJ1cHQgU3RhdHVzCisgKiA5ICAgICBSTyBFdGhlcm5ldCBQSFkxIEludGVycnVwdCBTdGF0dXMKKyAqIDggICAgIFJPIEV0aGVybmV0IFBIWTMgSW50ZXJydXB0IFN0YXR1cworICogNyAgICAgUk8gUEVYODU0OCBJbnRlcnJ1cHQgU3RhdHVzCisgKiA2ICAgICBSTyBSZXNlcnZlZAorICogNSAgICAgUk8gV2F0Y2hkb2cgMCBJbnRlcnJ1cHQgU3RhdHVzCisgKiA0ICAgICBSTyBXYXRjaGRvZyAxIEludGVycnVwdCBTdGF0dXMKKyAqIDMgICAgIFJPIEFYSVMgTWVzc2FnZSBGSUZPIEEgSW50ZXJydXB0IFN0YXR1cworICogMiAgICAgUk8gQVhJUyBNZXNzYWdlIEZJRk8gQiBJbnRlcnJ1cHQgU3RhdHVzCisgKiAxICAgICBSTyBBWElTIE1lc3NhZ2UgRklGTyBDIEludGVycnVwdCBTdGF0dXMKKyAqIDAgICAgIFJPIEFYSVMgTWVzc2FnZSBGSUZPIEQgSW50ZXJydXB0IFN0YXR1cworICoKKyAqIEludGVycnVwdHMgY2FuIGJlIGZvcndhcmRlZCB0byBvbmUgb2YgdHdvIG91dHB1dCBsaW5lcy4gTm90aGluZworICogY2xldmVyIGlzIGRvbmUsIHNvIGlmIHRoZSBtYXNrcyBhcmUgaW5jb3JyZWN0bHkgc2V0LCBhIHNpbmdsZSBpbnB1dAorICogaW50ZXJydXB0IGNvdWxkIGdlbmVyYXRlIGludGVycnVwdHMgb24gYm90aCBvdXRwdXQgbGluZXMhCisgKgorICogVGhlIGR1YWwgbGluZXMgYXJlIHRoZXJlIHRvIGFsbG93IHRoZSBjaGFpbmVkIGludGVycnVwdHMgdG8gYmUgZWFzaWx5CisgKiBwYXNzZWQgaW50byB0d28gZGlmZmVyZW50IGNvcmVzLiBXZSBjdXJyZW50bHkgZG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uYWxpdHkKKyAqIGluIHRoaXMgZHJpdmVyLgorICoKKyAqIENvbnRyb2xsZXIgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBNYWNoaW5lIGNoZWNrcyAoTUNQKSwgYWdhaW4gb24KKyAqIHR3byBsaW5lcywgdG8gYmUgYXR0YWNoZWQgdG8gdHdvIGRpZmZlcmVudCBjb3Jlcy4gSXQgaXMgc3VnZ2VzdGVkIHRoYXQgdGhlc2UKKyAqIHNob3VsZCBiZSBtYXNrZWQgb3V0LgorICovCisKK3ZvaWQgZ2VmX3BpY19jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnE7CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBhY3R1YWxseSBoYXZlIGFuIGludGVycnVwdCwgY2FsbCBnZW5lcmljIGhhbmRsaW5nIGNvZGUgaWYKKwkgKiB3ZSBkby4KKwkgKi8KKwljYXNjYWRlX2lycSA9IGdlZl9waWNfZ2V0X2lycSgpOworCisJaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKKworCWRlc2MtPmNoaXAtPmVvaShpcnEpOworCit9CisKK3N0YXRpYyB2b2lkIGdlZl9waWNfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBod2lycTsKKwl1MzIgbWFzazsKKworCWh3aXJxID0gZ2VmX2lycV90b19odyh2aXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnZWZfcGljX2xvY2ssIGZsYWdzKTsKKwltYXNrID0gaW5fYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfSU5UUl9NQVNLKDApKTsKKwltYXNrICY9IH4oMSA8PCBod2lycSk7CisJb3V0X2JlMzIoZ2VmX3BpY19pcnFfcmVnX2Jhc2UgKyBHRUZfUElDX0lOVFJfTUFTSygwKSwgbWFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2VmX3BpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGdlZl9waWNfbWFza19hY2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJLyogRG9uJ3QgdGhpbmsgd2UgYWN0dWFsbHkgaGF2ZSB0byBkbyBhbnl0aGluZyB0byBhY2sgYW4gaW50ZXJydXB0LAorCSAqIHdlIGp1c3QgbmVlZCB0byBjbGVhciBkb3duIHRoZSBkZXZpY2VzIGludGVycnVwdCBhbmQgaXQgd2lsbCBnbyBhd2F5CisJICovCisJZ2VmX3BpY19tYXNrKHZpcnEpOworfQorCitzdGF0aWMgdm9pZCBnZWZfcGljX3VubWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBod2lycTsKKwl1MzIgbWFzazsKKworCWh3aXJxID0gZ2VmX2lycV90b19odyh2aXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnZWZfcGljX2xvY2ssIGZsYWdzKTsKKwltYXNrID0gaW5fYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfSU5UUl9NQVNLKDApKTsKKwltYXNrIHw9ICgxIDw8IGh3aXJxKTsKKwlvdXRfYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfSU5UUl9NQVNLKDApLCBtYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnZWZfcGljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBnZWZfcGljX2NoaXAgPSB7CisJLnR5cGVuYW1lCT0gImdlZnAiLAorCS5tYXNrCQk9IGdlZl9waWNfbWFzaywKKwkubWFza19hY2sJPSBnZWZfcGljX21hc2tfYWNrLAorCS51bm1hc2sJCT0gZ2VmX3BpY191bm1hc2ssCit9OworCisKKy8qIFdoZW4gYW4gaW50ZXJydXB0IGlzIGJlaW5nIGNvbmZpZ3VyZWQsIHRoaXMgY2FsbCBhbGxvd3Mgc29tZSBmbGV4aWJpbHR5CisgKiBpbiBkZWNpZGluZyB3aGljaCBpcnFfY2hpcCBzdHJ1Y3R1cmUgaXMgdXNlZAorICovCitzdGF0aWMgaW50IGdlZl9waWNfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCS8qIEFsbCBpbnRlcnJ1cHRzIGFyZSBMRVZFTCBzZW5zaXRpdmUgKi8KKwlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZnZWZfcGljX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VmX3BpY19ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKKwkJCSAgICB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKK3sKKworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOworCWlmIChpbnRzaXplID4gMSkKKwkJKm91dF9mbGFncyA9IGludHNwZWNbMV07CisJZWxzZQorCQkqb3V0X2ZsYWdzID0gSVJRX1RZUEVfTEVWRUxfSElHSDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9ob3N0X29wcyBnZWZfcGljX2hvc3Rfb3BzID0geworCS5tYXAJPSBnZWZfcGljX2hvc3RfbWFwLAorCS54bGF0ZQk9IGdlZl9waWNfaG9zdF94bGF0ZSwKK307CisKKworLyoKKyAqIEluaXRpYWxpc2F0aW9uIG9mIFBJQywgdGhpcyBzaG91bGQgYmUgY2FsbGVkIGluIEJTUAorICovCit2b2lkIF9faW5pdCBnZWZfcGljX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTWFwIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyBpbnRvIG1lbW9yeSAqLworCWdlZl9waWNfaXJxX3JlZ19iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdlZl9waWNfbG9jaywgZmxhZ3MpOworCisJLyogSW5pdGlhbGlzZSBldmVyeXRoaW5nIGFzIG1hc2tlZC4gKi8KKwlvdXRfYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfQ1BVMF9JTlRSX01BU0ssIDApOworCW91dF9iZTMyKGdlZl9waWNfaXJxX3JlZ19iYXNlICsgR0VGX1BJQ19DUFUxX0lOVFJfTUFTSywgMCk7CisKKwlvdXRfYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfQ1BVMF9NQ1BfTUFTSywgMCk7CisJb3V0X2JlMzIoZ2VmX3BpY19pcnFfcmVnX2Jhc2UgKyBHRUZfUElDX0NQVTFfTUNQX01BU0ssIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2VmX3BpY19sb2NrLCBmbGFncyk7CisKKwkvKiBNYXAgY29udHJvbGxlciAqLworCWdlZl9waWNfY2FzY2FkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJaWYgKGdlZl9waWNfY2FzY2FkZV9pcnEgPT0gTk9fSVJRKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0JDNjEwOiBmYWlsZWQgdG8gbWFwIGNhc2NhZGUgaW50ZXJydXB0Iik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTZXR1cCBhbiBpcnFfaG9zdCBzdHJ1Y3R1cmUgKi8KKwlnZWZfcGljX2lycV9ob3N0ID0gaXJxX2FsbG9jX2hvc3QobnAsIElSUV9IT1NUX01BUF9MSU5FQVIsCisJCQkJCSAgR0VGX1BJQ19OVU1fSVJRUywKKwkJCQkJICAmZ2VmX3BpY19ob3N0X29wcywgTk9fSVJRKTsKKwlpZiAoZ2VmX3BpY19pcnFfaG9zdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBDaGFpbiB3aXRoIHBhcmVudCBjb250cm9sbGVyICovCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoZ2VmX3BpY19jYXNjYWRlX2lycSwgZ2VmX3BpY19jYXNjYWRlKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhbiBpbnRlcnJ1cHQgd2l0aCBhcHBhcmVudGx5IGNvbWVzIGZyb20gdGhpcworICogY2hpcCAtIGNoZWNrLCByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgaW50ZXJydXB0IGdlbmVyYXRlZCBvciByZXR1cm4gTk9fSVJRCisgKi8KK3Vuc2lnbmVkIGludCBnZWZfcGljX2dldF9pcnEodm9pZCkKK3sKKwl1MzIgY2F1c2UsIG1hc2ssIGFjdGl2ZTsKKwl1bnNpZ25lZCBpbnQgdmlycSA9IE5PX0lSUTsKKwlpbnQgaHdpcnE7CisKKwljYXVzZSA9IGluX2JlMzIoZ2VmX3BpY19pcnFfcmVnX2Jhc2UgKyBHRUZfUElDX0lOVFJfU1RBVFVTKTsKKworCW1hc2sgPSBpbl9iZTMyKGdlZl9waWNfaXJxX3JlZ19iYXNlICsgR0VGX1BJQ19JTlRSX01BU0soMCkpOworCisJYWN0aXZlID0gY2F1c2UgJiBtYXNrOworCisJaWYgKGFjdGl2ZSkgeworCQlmb3IgKGh3aXJxID0gR0VGX1BJQ19OVU1fSVJRUyAtIDE7IGh3aXJxID4gLTE7IGh3aXJxLS0pIHsKKwkJCWlmIChhY3RpdmUgJiAoMHgxIDw8IGh3aXJxKSkKKwkJCQlicmVhazsKKwkJfQorCQl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoZ2VmX3BpY19pcnFfaG9zdCwKKwkJCShpcnFfaHdfbnVtYmVyX3QpaHdpcnEpOworCX0KKworCXJldHVybiB2aXJxOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3BpYy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9waWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ5OTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9waWMuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fR0VGX1BJQ19IX18KKyNkZWZpbmUgX19HRUZfUElDX0hfXworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit2b2lkIGdlZl9waWNfY2FzY2FkZSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBpcnFfZGVzYyAqKTsKK3Vuc2lnbmVkIGludCBnZWZfcGljX2dldF9pcnEodm9pZCk7Cit2b2lkIGdlZl9waWNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CisKKyNlbmRpZiAvKiBfX0dFRl9QSUNfSF9fICovCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfc2JjNjEwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3NiYzYxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMWM0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3NiYzYxMC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogR0UgRmFudWMgU0JDNjEwIGJvYXJkIHN1cHBvcnQKKyAqCisgKiBBdXRob3I6IE1hcnR5biBXZWxjaCA8bWFydHluLndlbGNoQGdlZmFudWMuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA4IEdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBCYXNlZCBvbjogbXBjODZ4eF9ocGNuLmMgKE1QQzg2eHggSFBDTiBib2FyZCBzcGVjaWZpYyByb3V0aW5lcykKKyAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBORUMgZml4dXAgYWRhcHRlZCBmcm9tIGFyY2gvbWlwcy9wY2kvZml4dXAtbG0yZS5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisKKyNpbmNsdWRlIDxhc20vbXBpYy5oPgorCisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODZ4eC5oIgorI2luY2x1ZGUgImdlZl9waWMuaCIKKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcgKGZtdC4uLikgZG8geyBwcmludGsoS0VSTl9FUlIgIlNCQzYxMDogIiBmbXQpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgREJHIChmbXQuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCit2b2lkIF9faW9tZW0gKnNiYzYxMF9yZWdzOworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2VmX3NiYzYxMF9pbml0X2lycSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2FzY2FkZV9ub2RlID0gTlVMTDsKKworCW1wYzg2eHhfaW5pdF9pcnEoKTsKKworCS8qCisJICogVGhlcmUgaXMgYSBzaW1wbGUgaW50ZXJydXB0IGhhbmRsZXIgaW4gdGhlIG1haW4gRlBHQSwgdGhpcyBuZWVkcworCSAqIHRvIGJlIGNhc2NhZGVkIGludG8gdGhlIE1QSUMKKwkgKi8KKwljYXNjYWRlX25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZ2VmLGZwZ2EtcGljIik7CisJaWYgKCFjYXNjYWRlX25vZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0JDNjEwOiBObyBGUEdBIFBJQ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlnZWZfcGljX2luaXQoY2FzY2FkZV9ub2RlKTsKKwlvZl9ub2RlX3B1dChjYXNjYWRlX25vZGUpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZ2VmX3NiYzYxMF9zZXR1cF9hcmNoKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpyZWdzOworI2lmZGVmIENPTkZJR19QQ0kKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4NjQxLXBjaWUiKSB7CisJCWZzbF9hZGRfYnJpZGdlKG5wLCAxKTsKKwl9CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIkdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBTQkM2MTAgNlUgVlBYIFNCQ1xuIik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJbXBjODZ4eF9zbXBfaW5pdCgpOworI2VuZGlmCisKKwkvKiBSZW1hcCBiYXNpYyBib2FyZCByZWdpc3RlcnMgKi8KKwlyZWdzID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImdlZixmcGdhLXJlZ3MiKTsKKwlpZiAocmVncykgeworCQlzYmM2MTBfcmVncyA9IG9mX2lvbWFwKHJlZ3MsIDApOworCQlpZiAoc2JjNjEwX3JlZ3MgPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBtYXAgYm9hcmQgcmVnaXN0ZXJzXG4iKTsKKwkJb2Zfbm9kZV9wdXQocmVncyk7CisJfQorfQorCisvKiBSZXR1cm4gdGhlIFBDQiByZXZpc2lvbiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZWZfc2JjNjEwX2dldF9wY2JfcmV2KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IGlvcmVhZDMyKHNiYzYxMF9yZWdzKTsKKwlyZXR1cm4gKHJlZyA+PiA4KSAmIDB4ZmY7Cit9CisKKy8qIFJldHVybiB0aGUgYm9hcmQgKHNvZnR3YXJlKSByZXZpc2lvbiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZWZfc2JjNjEwX2dldF9ib2FyZF9yZXYodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gaW9yZWFkMzIoc2JjNjEwX3JlZ3MpOworCXJldHVybiAocmVnID4+IDE2KSAmIDB4ZmY7Cit9CisKKy8qIFJldHVybiB0aGUgRlBHQSByZXZpc2lvbiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZWZfc2JjNjEwX2dldF9mcGdhX3Jldih2b2lkKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBpb3JlYWQzMihzYmM2MTBfcmVncyk7CisJcmV0dXJuIChyZWcgPj4gMjQpICYgMHhmOworfQorCitzdGF0aWMgdm9pZCBnZWZfc2JjNjEwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OworCXVpbnQgc3ZpZCA9IG1mc3ByKFNQUk5fU1ZSKTsKKworCXNlcV9wcmludGYobSwgIlZlbmRvclx0XHQ6IEdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3Jtc1xuIik7CisKKwlzZXFfcHJpbnRmKG0sICJSZXZpc2lvblx0OiAldSVjXG4iLCBnZWZfc2JjNjEwX2dldF9wY2JfcmV2KCksCisJCSgnQScgKyBnZWZfc2JjNjEwX2dldF9ib2FyZF9yZXYoKSAtIDEpKTsKKwlzZXFfcHJpbnRmKG0sICJGUEdBIFJldmlzaW9uXHQ6ICV1XG4iLCBnZWZfc2JjNjEwX2dldF9mcGdhX3JldigpKTsKKworCXNlcV9wcmludGYobSwgIlNWUlx0XHQ6IDB4JXhcbiIsIHN2aWQpOworCXNlcV9wcmludGYobSwgIk1lbW9yeVx0XHQ6ICVkIE1CXG4iLCBtZW1zaXplIC8gKDEwMjQgKiAxMDI0KSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZWZfc2JjNjEwX25lY19maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUnVubmluZyBORUMgdVBENzIwMTAxIEZpeHVwXG4iKTsKKworCS8qIEVuc3VyZSBwb3J0cyAxLCAyLCAzLCA0ICYgNSBhcmUgZW5hYmxlZCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweGUwLCAmdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4ZTAsICh2YWwgJiB+NykgfCAweDUpOworCisJLyogU3lzdGVtIGNsb2NrIGlzIDQ4LU1IeiBPc2NpbGxhdG9yIGFuZCBFSENJIEVuYWJsZWQuICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweGU0LCAxIDw8IDUpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfTkVDLCBQQ0lfREVWSUNFX0lEX05FQ19VU0IsCisJZ2VmX3NiYzYxMF9uZWNfZml4dXApOworCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEJTUCBpcyBjb21wYXRpYmxlIHdpdGggdGhlCisgKiBzdXBwbGllZCBkZXZpY2UtdHJlZSwgd2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0aGUgY29ycmVjdCBvbmUgZm9yIHRoZSBhY3R1YWwKKyAqIGJvYXJkLiBJdCBpcyBleHBlY3RlZCB0aGF0aSwgaW4gdGhlIGZ1dHVyZSwgYSBrZXJuZWwgbWF5IHN1cHBvcnQgbXVsdGlwbGUKKyAqIGJvYXJkcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgZ2VmX3NiYzYxMF9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImdlZixzYmM2MTAiKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgX19pbml0IG1wYzg2eHhfdGltZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwkvKiBTZXQgdGhlIHRpbWUgYmFzZSB0byB6ZXJvICovCisJbXRzcHIoU1BSTl9UQldMLCAwKTsKKwltdHNwcihTUFJOX1RCV1UsIDApOworCisJdGVtcCA9IG1mc3ByKFNQUk5fSElEMCk7CisJdGVtcCB8PSBISUQwX1RCRU47CisJbXRzcHIoU1BSTl9ISUQwLCB0ZW1wKTsKKwlhc20gdm9sYXRpbGUoImlzeW5jIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9mX2RldmljZV9pZCBvZl9idXNfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICJQcm9iZSBwbGF0Zm9ybSBkZXZpY2VzXG4iKTsKKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKGdlZl9zYmM2MTAsIGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CisKK2RlZmluZV9tYWNoaW5lKGdlZl9zYmM2MTApIHsKKwkubmFtZQkJCT0gIkdFIEZhbnVjIFNCQzYxMCIsCisJLnByb2JlCQkJPSBnZWZfc2JjNjEwX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IGdlZl9zYmM2MTBfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gZ2VmX3NiYzYxMF9pbml0X2lycSwKKwkuc2hvd19jcHVpbmZvCQk9IGdlZl9zYmM2MTBfc2hvd19jcHVpbmZvLAorCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKKwkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKKwkudGltZV9pbml0CQk9IG1wYzg2eHhfdGltZV9pbml0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorI2lmZGVmIENPTkZJR19QQ0kKKwkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMKaW5kZXggNWVlZGI3MS4uZThkNTRhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYwpAQCAtMjM4LDcgKzIzOCw2IEBACiAgICAgICAgIH0KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVUpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVVfTU9EVUxFKQotCXByZWFsbG9jYXRlX2RpdV92aWRlb21lbW9yeSgpOwogCWRpdV9vcHMuZ2V0X3BpeGVsX2Zvcm1hdAk9IG1wYzg2MTBocGNkX2dldF9waXhlbF9mb3JtYXQ7CiAJZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUJCT0gbXBjODYxMGhwY2Rfc2V0X2dhbW1hX3RhYmxlOwogCWRpdV9vcHMuc2V0X21vbml0b3JfcG9ydAk9IG1wYzg2MTBocGNkX3NldF9tb25pdG9yX3BvcnQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKaW5kZXggZjcxMmQ5Yy4uMjY3MjgyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpAQCAtMTAxLDE5ICsxMDEsMTEgQEAKIHN0YXRpYyB2b2lkCiBtcGM4Nnh4X2hwY25fc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OwotCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CiAJdWludCBzdmlkID0gbWZzcHIoU1BSTl9TVlIpOwogCiAJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogCi0Jcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JaWYgKHJvb3QpCi0JCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOwotCXNlcV9wcmludGYobSwgIk1hY2hpbmVcdFx0OiAlc1xuIiwgbW9kZWwpOwotCW9mX25vZGVfcHV0KHJvb3QpOwotCiAJc2VxX3ByaW50ZihtLCAiU1ZSXHRcdDogMHgleFxuIiwgc3ZpZCk7CiAJc2VxX3ByaW50ZihtLCAiTWVtb3J5XHRcdDogJWQgTUJcbiIsIG1lbXNpemUgLyAoMTAyNCAqIDEwMjQpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9zYmM4NjQxZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3NiYzg2NDFkLmMKaW5kZXggMDBlNmZhZC4uZGE2NzdhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3NiYzg2NDFkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3NiYzg2NDFkLmMKQEAgLTYzLDE5ICs2MywxMSBAQAogc3RhdGljIHZvaWQKIHNiYzg2NDFfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OwotCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CiAJdWludCBzdmlkID0gbWZzcHIoU1BSTl9TVlIpOwogCiAJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogV2luZCBSaXZlciBTeXN0ZW1zXG4iKTsKIAotCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwotCWlmIChyb290KQotCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKLQlzZXFfcHJpbnRmKG0sICJNYWNoaW5lXHRcdDogJXNcbiIsIG1vZGVsKTsKLQlvZl9ub2RlX3B1dChyb290KTsKLQogCXNlcV9wcmludGYobSwgIlNWUlx0XHQ6IDB4JXhcbiIsIHN2aWQpOwogCXNlcV9wcmludGYobSwgIk1lbW9yeVx0XHQ6ICVkIE1CXG4iLCBtZW1zaXplIC8gKDEwMjQgKiAxMDI0KSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvS2NvbmZpZwppbmRleCA3MWQ3NTYyLi40OGE5MjBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L0tjb25maWcKQEAgLTQ5LDYgKzQ5LDEyIEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZ3VlICYgTWljcm8gQWRkZXIgODc1CiAJICBib2FyZC4KIAorY29uZmlnIFBQQ19NR1NVVkQKKwlib29sICJNR1NVVkQiCisJc2VsZWN0IENQTTEKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEtleW1pbGUgTUdTVVZEIGJvYXJkLgorCiBlbmRjaG9pY2UKIAogbWVudSAiRnJlZXNjYWxlIEV0aGVybmV0IGRyaXZlciBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpb25zIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9NYWtlZmlsZQppbmRleCA3YjcxZDljLi5iZGJmZDc0OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvTWFrZWZpbGUKQEAgLTYsMyArNiw0IEBACiBvYmotJChDT05GSUdfTVBDODZYQURTKSAgICs9IG1wYzg2eGFkc19zZXR1cC5vCiBvYmotJChDT05GSUdfUFBDX0VQODhYQykgICs9IGVwODh4Yy5vCiBvYmotJChDT05GSUdfUFBDX0FEREVSODc1KSArPSBhZGRlcjg3NS5vCitvYmotJChDT05GSUdfUFBDX01HU1VWRCkgKz0gbWdzdXZkLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21nc3V2ZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbWdzdXZkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzY2IwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21nc3V2ZC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKgorICogUGxhdGZvcm0gc2V0dXAgZm9yIHRoZSBLZXltaWxlIG1nc3V2ZCBib2FyZAorICoKKyAqIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorICoKKyAqIENvcHlyaWdodCAyMDA4IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgR21iSAorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3BtMS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2ZzX3BkLmg+CisKKyNpbmNsdWRlICJtcGM4eHguaCIKKworc3RydWN0IGNwbV9waW4geworCWludCBwb3J0LCBwaW4sIGZsYWdzOworfTsKKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGNwbV9waW4gbWdzdXZkX3BpbnNbXSA9IHsKKwkvKiBTTUMxICovCisJe0NQTV9QT1JUQiwgMjQsIENQTV9QSU5fSU5QVVR9LCAvKiBSWCAqLworCXtDUE1fUE9SVEIsIDI1LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9TRUNPTkRBUll9LCAvKiBUWCAqLworCisJLyogU0NDMyAqLworCXtDUE1fUE9SVEEsIDEwLCBDUE1fUElOX0lOUFVUfSwKKwl7Q1BNX1BPUlRBLCAxMSwgQ1BNX1BJTl9JTlBVVH0sCisJe0NQTV9QT1JUQSwgMywgQ1BNX1BJTl9JTlBVVH0sCisJe0NQTV9QT1JUQSwgMiwgQ1BNX1BJTl9JTlBVVH0sCisJe0NQTV9QT1JUQywgMTMsIENQTV9QSU5fSU5QVVR9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW9wb3J0cyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWdzdXZkX3BpbnMpOyBpKyspIHsKKwkJc3RydWN0IGNwbV9waW4gKnBpbiA9ICZtZ3N1dmRfcGluc1tpXTsKKwkJY3BtMV9zZXRfcGluKHBpbi0+cG9ydCwgcGluLT5waW4sIHBpbi0+ZmxhZ3MpOworCX0KKworCXNldGJpdHMxNigmbXBjOHh4X2ltbXItPmltX2lvcG9ydC5pb3BfcGNzbywgMHgzMDApOworCWNwbTFfY2xrX3NldHVwKENQTV9DTEtfU0NDMywgQ1BNX0NMSzUsIENQTV9DTEtfUlgpOworCWNwbTFfY2xrX3NldHVwKENQTV9DTEtfU0NDMywgQ1BNX0NMSzYsIENQTV9DTEtfVFgpOworCWNwbTFfY2xrX3NldHVwKENQTV9DTEtfU01DMSwgQ1BNX0JSRzEsIENQTV9DTEtfUlRYKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1nc3V2ZF9zZXR1cF9hcmNoKHZvaWQpCit7CisJY3BtX3Jlc2V0KCk7CisJaW5pdF9pb3BvcnRzKCk7Cit9CisKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfYnVzX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQoreworCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBvZl9idXNfaWRzLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1nc3V2ZCwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKworc3RhdGljIGludCBfX2luaXQgbWdzdXZkX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImtleW1pbGUsbWdzdXZkIik7Cit9CisKK2RlZmluZV9tYWNoaW5lKG1nc3V2ZCkgeworCS5uYW1lICAgICAgICAgICA9ICJNR1NVVkQiLAorCS5wcm9iZSAgICAgICAgICA9IG1nc3V2ZF9wcm9iZSwKKwkuc2V0dXBfYXJjaCAgICAgPSBtZ3N1dmRfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEgICAgICAgPSBtcGM4eHhfcGljc19pbml0LAorCS5nZXRfaXJxICAgICAgICA9IG1wYzh4eF9nZXRfaXJxLAorCS5yZXN0YXJ0ICAgICAgICA9IG1wYzh4eF9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjciA9IG1wYzh4eF9jYWxpYnJhdGVfZGVjciwKKwkuc2V0X3J0Y190aW1lICAgPSBtcGM4eHhfc2V0X3J0Y190aW1lLAorCS5nZXRfcnRjX3RpbWUgICA9IG1wYzh4eF9nZXRfcnRjX3RpbWUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDRjOTAwZWYuLjQ3ZTk1NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTIzOSw3ICsyMzksOCBAQAogCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCiAKIGNvbmZpZyBRVUlDQ19FTkdJTkUKLQlib29sCisJYm9vbCAiRnJlZXNjYWxlIFFVSUNDIEVuZ2luZSAoUUUpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBGU0xfU09DCiAJc2VsZWN0IFBQQ19MSUJfUkhFQVAKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCkBAIC0yNDgsNiArMjQ5LDE1IEBACiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gbWVhbnMgdGhhdCB5b3Ugd2lzaCB0byBidWlsZCBhIGtlcm5lbAogCSAgZm9yIGEgbWFjaGluZSB3aXRoIGEgUUUgY29wcm9jZXNzb3IuCiAKK2NvbmZpZyBRRV9HUElPCisJYm9vbCAiUUUgR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUVVJQ0NfRU5HSU5FCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91J3JlIGdvaW5nIHRvIHVzZSBoYXJkd2FyZSB0aGF0IGNvbm5lY3RzIHRvIHRoZQorCSAgUUUgR1BJT3MuCisKIGNvbmZpZyBDUE0yCiAJYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBDUE0yIChDb21tdW5pY2F0aW9ucyBQcm9jZXNzb3IgTW9kdWxlKSIKIAlkZXBlbmRzIG9uIE1QQzg1eHggfHwgODI2MApAQCAtMjkzLDQgKzMwMywxMyBAQAogCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vS2NvbmZpZyIKIAorY29uZmlnIE1QQzh4eHhfR1BJTworCWJvb2wgIk1QQzh4eHggR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX01QQzgzMXggfHwgUFBDX01QQzgzNHggfHwgUFBDX01QQzgzN3ggfHwgUFBDXzg1eHggfHwgUFBDXzg2eHgKKwlzZWxlY3QgR0VORVJJQ19HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UncmUgZ29pbmcgdG8gdXNlIGhhcmR3YXJlIHRoYXQgY29ubmVjdHMgdG8gdGhlCisJICBNUEM4MzF4LzgzNHgvODM3eC84NTcyLzg2MTAgR1BJT3MuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKaW5kZXggN2Y2NTEyNy4uNTQ4ZWZhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKQEAgLTUwLDYgKzUwLDcgQEAKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKIAlzZWxlY3QgNHh4X1NPQwogCXNlbGVjdCBQUENfUENJX0NIT0lDRQorCXNlbGVjdCBQSFlTXzY0QklUCiAKIGNvbmZpZyBFMjAwCiAJYm9vbCAiRnJlZXNjYWxlIGUyMDAiCkBAIC0xMjgsMTggKzEyOSwxOSBAQAogCiBjb25maWcgUFRFXzY0QklUCiAJYm9vbAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlkZWZhdWx0IHkgaWYgNDR4Ci0JZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAorCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAgfHwgUFBDXzg2eHgKKwlkZWZhdWx0IHkgaWYgUEhZU182NEJJVAogCiBjb25maWcgUEhZU182NEJJVAotCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCi0JZGVmYXVsdCB5IGlmIDQ0eAorCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMCB8fCBQUENfODZ4eAorCWRlcGVuZHMgb24gKDQ0eCB8fCBFNTAwIHx8IFBQQ184Nnh4KSAmJiAhUFBDXzgzeHggJiYgIVBQQ184Mnh4CiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgbGFyZ2VyIHRoYW4gMzItYml0IHBoeXNpY2FsCi0JICBhZGRyZXNzZXMuICBUaGlzIGZlYXR1cmVzIGlzIG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGU1MDAgY29yZXMuCisJICBhZGRyZXNzZXMuICBUaGlzIGZlYXR1cmUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGNvcmVzLgorCisJICBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gMy41R0Igb2YgUkFNIG9yIHNvLCB5b3UgYWxzbyBuZWVkIHRvIGVuYWJsZQorCSAgU1dJT1RMQiB1bmRlciBLZXJuZWwgT3B0aW9ucyBmb3IgdGhpcyB0byB3b3JrLiAgVGhlIGFjdHVhbCBudW1iZXIKKwkgIGlzIHBsYXRmb3JtLWRlcGVuZGVudC4KIAogCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKaW5kZXggZTA2NDIwYS4uZWY5MmU3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKQEAgLTU1NiwxMSArNTU2LDExIEBACiAJICogbm9kZSdzIGlvbW11LiBXZSAtbWlnaHQtIGRvIHNvbWV0aGluZyBzbWFydGVyIGxhdGVyIHRob3VnaCBpdCBtYXkKIAkgKiBuZXZlciBiZSBuZWNlc3NhcnkKIAkgKi8KLQlpb21tdSA9IGNlbGxfaW9tbXVfZm9yX25vZGUoYXJjaGRhdGEtPm51bWFfbm9kZSk7CisJaW9tbXUgPSBjZWxsX2lvbW11X2Zvcl9ub2RlKGRldl90b19ub2RlKGRldikpOwogCWlmIChpb21tdSA9PSBOVUxMIHx8IGxpc3RfZW1wdHkoJmlvbW11LT53aW5kb3dzKSkgewogCQlwcmludGsoS0VSTl9FUlIgImlvbW11OiBtaXNzaW5nIGlvbW11IGZvciAlcyAobm9kZSAlZClcbiIsCiAJCSAgICAgICBhcmNoZGF0YS0+b2Zfbm9kZSA/IGFyY2hkYXRhLT5vZl9ub2RlLT5mdWxsX25hbWUgOiAiPyIsCi0JCSAgICAgICBhcmNoZGF0YS0+bnVtYV9ub2RlKTsKKwkJICAgICAgIGRldl90b19ub2RlKGRldikpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJd2luZG93ID0gbGlzdF9lbnRyeShpb21tdS0+d2luZG93cy5uZXh0LCBzdHJ1Y3QgaW9tbXVfd2luZG93LCBsaXN0KTsKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCQlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2LCBjZWxsX2dldF9pb21tdV90YWJsZShkZXYpLAogCQkJCQkgICAgc2l6ZSwgZG1hX2hhbmRsZSwKIAkJCQkJICAgIGRldmljZV90b19tYXNrKGRldiksIGZsYWcsCi0JCQkJCSAgICBkZXYtPmFyY2hkYXRhLm51bWFfbm9kZSk7CisJCQkJCSAgICBkZXZfdG9fbm9kZShkZXYpKTsKIAllbHNlCiAJCXJldHVybiBkbWFfZGlyZWN0X29wcy5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsCiAJCQkJCQkgICAgIGZsYWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwppbmRleCA2OTBjYTdiLi5jYjg1ZDIzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwpAQCAtMjk4LDggKzI5OCw4IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCWRnZXQoZGVudHJ5KTsKLQlkaXItPmlfbmxpbmsrKzsKLQlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwlpbmNfbmxpbmsoZGlyKTsKKwlpbmNfbmxpbmsoZGVudHJ5LT5kX2lub2RlKTsKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfY3R4OgpAQCAtNDk2LDYgKzQ5Niw4IEBACiAJcmV0ID0gc3B1ZnNfY29udGV4dF9vcGVuKGRnZXQoZGVudHJ5KSwgbW50Z2V0KG1udCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCVdBUk5fT04oc3B1ZnNfcm1kaXIoaW5vZGUsIGRlbnRyeSkpOworCQlpZiAoYWZmaW5pdHkpCisJCQltdXRleF91bmxvY2soJmdhbmctPmFmZl9tdXRleCk7CiAJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlzcHVfZm9yZ2V0KFNQVUZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9jdHgpOwogCQlnb3RvIG91dDsKQEAgLTUzOCw4ICs1NDAsOCBAQAogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCWRpci0+aV9ubGluaysrOwotCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluaysrOworCWluY19ubGluayhkaXIpOworCWluY19ubGluayhkZW50cnktPmRfaW5vZGUpOwogCXJldHVybiByZXQ7CiAKIG91dF9pcHV0OgpAQCAtNjU5LDcgKzY2MSw3IEBACiAJT3B0X3VpZCwgT3B0X2dpZCwgT3B0X21vZGUsIE9wdF9kZWJ1ZywgT3B0X2VyciwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHNwdWZzX3Rva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHNwdWZzX3Rva2VucyA9IHsKIAl7IE9wdF91aWQsICAgInVpZD0lZCIgfSwKIAl7IE9wdF9naWQsICAgImdpZD0lZCIgfSwKIAl7IE9wdF9tb2RlLCAgIm1vZGU9JW8iIH0sCkBAIC03NTUsNiArNzU3LDcgQEAKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlTUFVGU19JKGlub2RlKS0+aV9jdHggPSBOVUxMOworCWluY19ubGluayhpbm9kZSk7CiAKIAlyZXQgPSAtRUlOVkFMOwogCWlmICghc3B1ZnNfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgaW5vZGUpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAxYzFiNjI3Li42NzU5NWJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtNjQzLDkgKzY0MywxMCBAQAogCQkJICAgICEodG1wLT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkgJiYKIAkJCSAgICAoIXZpY3RpbSB8fCB0bXAtPnByaW8gPiB2aWN0aW0tPnByaW8pKSB7CiAJCQkJdmljdGltID0gc3B1LT5jdHg7Ci0JCQkJZ2V0X3NwdV9jb250ZXh0KHZpY3RpbSk7CiAJCQl9CiAJCX0KKwkJaWYgKHZpY3RpbSkKKwkJCWdldF9zcHVfY29udGV4dCh2aWN0aW0pOwogCQltdXRleF91bmxvY2soJmNiZV9zcHVfaW5mb1tub2RlXS5saXN0X211dGV4KTsKIAogCQlpZiAodmljdGltKSB7CkBAIC03MjcsMTcgKzcyOCwzMyBAQAogCS8qIG5vdCBhIGNhbmRpZGF0ZSBmb3IgaW50ZXJydXB0aWJsZSBiZWNhdXNlIGl0J3MgY2FsbGVkIGVpdGhlcgogCSAgIGZyb20gdGhlIHNjaGVkdWxlciB0aHJlYWQgb3IgZnJvbSBzcHVfZGVhY3RpdmF0ZSAqLwogCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCV9fc3B1X3NjaGVkdWxlKHNwdSwgY3R4KTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpCisJCV9fc3B1X3NjaGVkdWxlKHNwdSwgY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwogfQogCi1zdGF0aWMgdm9pZCBzcHVfdW5zY2hlZHVsZShzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQorLyoqCisgKiBzcHVfdW5zY2hlZHVsZSAtIHJlbW92ZSBhIGNvbnRleHQgZnJvbSBhIHNwdSwgYW5kIHBvc3NpYmx5IHJlbGVhc2UgaXQuCisgKiBAc3B1OglUaGUgU1BVIHRvIHVuc2NoZWR1bGUgZnJvbQorICogQGN0eDoJVGhlIGNvbnRleHQgY3VycmVudGx5IHNjaGVkdWxlZCBvbiB0aGUgU1BVCisgKiBAZnJlZV9zcHUJV2hldGhlciB0byBmcmVlIHRoZSBTUFUgZm9yIG90aGVyIGNvbnRleHRzCisgKgorICogVW5iaW5kcyB0aGUgY29udGV4dCBAY3R4IGZyb20gdGhlIFNQVSBAc3B1LiBJZiBAZnJlZV9zcHUgaXMgbm9uLXplcm8sIHRoZQorICogU1BVIGlzIG1hZGUgYXZhaWxhYmxlIGZvciBvdGhlciBjb250ZXh0cyAoaWUsIG1heSBiZSByZXR1cm5lZCBieQorICogc3B1X2dldF9pZGxlKS4gSWYgdGhpcyBpcyB6ZXJvLCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHNjaGVkdWxlIGFub3RoZXIKKyAqIGNvbnRleHQgdG8gdGhpcyBzcHUuCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGN0eC0+c3RhdGVfbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQgc3B1X3Vuc2NoZWR1bGUoc3RydWN0IHNwdSAqc3B1LCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJaW50IGZyZWVfc3B1KQogewogCWludCBub2RlID0gc3B1LT5ub2RlOwogCiAJbXV0ZXhfbG9jaygmY2JlX3NwdV9pbmZvW25vZGVdLmxpc3RfbXV0ZXgpOwogCWNiZV9zcHVfaW5mb1tub2RlXS5ucl9hY3RpdmUtLTsKLQlzcHUtPmFsbG9jX3N0YXRlID0gU1BVX0ZSRUU7CisJaWYgKGZyZWVfc3B1KQorCQlzcHUtPmFsbG9jX3N0YXRlID0gU1BVX0ZSRUU7CiAJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKIAljdHgtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKIAlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKQEAgLTgzNyw3ICs4NTQsNyBAQAogCWlmIChzcHUpIHsKIAkJbmV3ID0gZ3JhYl9ydW5uYWJsZV9jb250ZXh0KG1heF9wcmlvLCBzcHUtPm5vZGUpOwogCQlpZiAobmV3IHx8IGZvcmNlKSB7Ci0JCQlzcHVfdW5zY2hlZHVsZShzcHUsIGN0eCk7CisJCQlzcHVfdW5zY2hlZHVsZShzcHUsIGN0eCwgbmV3ID09IE5VTEwpOwogCQkJaWYgKG5ldykgewogCQkJCWlmIChuZXctPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQogCQkJCQl3YWtlX3VwKCZuZXctPnN0b3Bfd3EpOwpAQCAtOTEwLDcgKzkyNyw3IEBACiAKIAluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQoY3R4LT5wcmlvICsgMSwgc3B1LT5ub2RlKTsKIAlpZiAobmV3KSB7Ci0JCXNwdV91bnNjaGVkdWxlKHNwdSwgY3R4KTsKKwkJc3B1X3Vuc2NoZWR1bGUoc3B1LCBjdHgsIDApOwogCQlpZiAodGVzdF9iaXQoU1BVX1NDSEVEX1NQVV9SVU4sICZjdHgtPnNjaGVkX2ZsYWdzKSkKIAkJCXNwdV9hZGRfdG9fcnEoY3R4KTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IDc2OGMyNjIuLmQzY2RlNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTI2MCwxMyArMjYwLDEzIEBACiAJCQkJZGV2LT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KLQkJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2VbMF07CisJCWhvc2UtPmZpcnN0X2J1c25vID0gaG9zZS0+c2VsZl9idXNubyA9IGJ1c19yYW5nZVswXTsKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZVsxXTsKIAogCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJtb2RlbCIsIE5VTEwpOwogCQlpZiAobW9kZWwgPT0gTlVMTCkKIAkJCW1vZGVsID0gIjxub25lPiI7Ci0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYsICJJQk0scHl0aG9uIikpIHsKKwkJaWYgKHN0cm5jbXAobW9kZWwsICJJQk0sIFB5dGhvbiIsIDExKSA9PSAwKSB7CiAJCQlzZXR1cF9weXRob24oaG9zZSwgZGV2KTsKIAkJfSBlbHNlIGlmIChpc19tb3QKIAkJCSAgIHx8IHN0cm5jbXAobW9kZWwsICJNb3Rvcm9sYSwgR3JhY2tsZSIsIDE3KSA9PSAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCmluZGV4IDFiYTdjZTUuLjI3MmQ3OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYwppbmRleCA5NmQxZTRiLi4wNTRkZmU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKQEAgLTk0LDEyICs5NCwxMiBAQAogCWNocnBfY21vc19jbG9ja193cml0ZSgoc2F2ZV9mcmVxX3NlbGVjdHxSVENfRElWX1JFU0VUMiksIFJUQ19GUkVRX1NFTEVDVCk7CiAKIAlpZiAoIShzYXZlX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgewotCQlCSU5fVE9fQkNEKHRtLnRtX3NlYyk7Ci0JCUJJTl9UT19CQ0QodG0udG1fbWluKTsKLQkJQklOX1RPX0JDRCh0bS50bV9ob3VyKTsKLQkJQklOX1RPX0JDRCh0bS50bV9tb24pOwotCQlCSU5fVE9fQkNEKHRtLnRtX21kYXkpOwotCQlCSU5fVE9fQkNEKHRtLnRtX3llYXIpOworCQl0bS50bV9zZWMgPSBiaW4yYmNkKHRtLnRtX3NlYyk7CisJCXRtLnRtX21pbiA9IGJpbjJiY2QodG0udG1fbWluKTsKKwkJdG0udG1faG91ciA9IGJpbjJiY2QodG0udG1faG91cik7CisJCXRtLnRtX21vbiA9IGJpbjJiY2QodG0udG1fbW9uKTsKKwkJdG0udG1fbWRheSA9IGJpbjJiY2QodG0udG1fbWRheSk7CisJCXRtLnRtX3llYXIgPSBiaW4yYmNkKHRtLnRtX3llYXIpOwogCX0KIAljaHJwX2Ntb3NfY2xvY2tfd3JpdGUodG0udG1fc2VjLFJUQ19TRUNPTkRTKTsKIAljaHJwX2Ntb3NfY2xvY2tfd3JpdGUodG0udG1fbWluLFJUQ19NSU5VVEVTKTsKQEAgLTEzNiwxMiArMTM2LDEyIEBACiAJfSB3aGlsZSAoc2VjICE9IGNocnBfY21vc19jbG9ja19yZWFkKFJUQ19TRUNPTkRTKSk7CiAKIAlpZiAoIShjaHJwX2Ntb3NfY2xvY2tfcmVhZChSVENfQ09OVFJPTCkgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgewotCQlCQ0RfVE9fQklOKHNlYyk7Ci0JCUJDRF9UT19CSU4obWluKTsKLQkJQkNEX1RPX0JJTihob3VyKTsKLQkJQkNEX1RPX0JJTihkYXkpOwotCQlCQ0RfVE9fQklOKG1vbik7Ci0JCUJDRF9UT19CSU4oeWVhcik7CisJCXNlYyA9IGJjZDJiaW4oc2VjKTsKKwkJbWluID0gYmNkMmJpbihtaW4pOworCQlob3VyID0gYmNkMmJpbihob3VyKTsKKwkJZGF5ID0gYmNkMmJpbihkYXkpOworCQltb24gPSBiY2QyYmluKG1vbik7CisJCXllYXIgPSBiY2QyYmluKHllYXIpOwogCX0KIAlpZiAoeWVhciA8IDcwKQogCQl5ZWFyICs9IDEwMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCmluZGV4IDg0ZTJkNzguLjdhMmJhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtMTY0LDcgKzE2NCw2IEBACiB2b2lkIG1wYzc0NDhfaHBjMl9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQogewogCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKLQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogTVBDNzQ0OGhwYzJcbiIpOwogfQogCiB2b2lkIG1wYzc0NDhfaHBjMl9yZXN0YXJ0KGNoYXIgKmNtZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZnNsX3VsaTE1NzUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZnNsX3VsaTE1NzUuYwppbmRleCBlZjc0YTA3Li44YzYxOTk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2ZzbF91bGkxNTc1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9mc2xfdWxpMTU3NS5jCkBAIC0yMTksMTEgKzIxOSwyMSBAQAogCWludCBpOwogCXU4ICpkdW1teTsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gZGV2LT5idXM7CisJcmVzb3VyY2Vfc2l6ZV90IGVuZCA9IDA7CisKKwlmb3IgKGkgPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKzM7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgaSk7CisJCWlmICgoZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU18SU9SRVNPVVJDRV9QUkVGRVRDSCkpID09IElPUkVTT1VSQ0VfTUVNKQorCQkJZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsIGkpOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykgewogCQlpZiAoKGJ1cy0+cmVzb3VyY2VbaV0pICYmCiAJCQkoYnVzLT5yZXNvdXJjZVtpXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJCWR1bW15ID0gaW9yZW1hcChidXMtPnJlc291cmNlW2ldLT5lbmQgLSAzLCAweDQpOworCQkJaWYgKGJ1cy0+cmVzb3VyY2VbaV0tPmVuZCA9PSBlbmQpCisJCQkJZHVtbXkgPSBpb3JlbWFwKGJ1cy0+cmVzb3VyY2VbaV0tPnN0YXJ0LCAweDQpOworCQkJZWxzZQorCQkJCWR1bW15ID0gaW9yZW1hcChidXMtPnJlc291cmNlW2ldLT5lbmQgLSAzLCAweDQpOwogCQkJaWYgKGR1bW15KSB7CiAJCQkJaW5fOChkdW1teSk7CiAJCQkJaW91bm1hcChkdW1teSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZXhjZXB0aW9uLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZXhjZXB0aW9uLlMKaW5kZXggOGZmMzMwZC4uMmY1ODE1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2V4Y2VwdGlvbi5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9leGNlcHRpb24uUwpAQCAtMzgsMTIgKzM4LDEzIEBACiAKIAkuZ2xvYmwgc3lzdGVtX3Jlc2V0X2lTZXJpZXMKIHN5c3RlbV9yZXNldF9pU2VyaWVzOgorCWJsCS5yZWxhdGl2ZV90b2MKIAltZnNwcglyMTMsU1BSTl9TUFJHMwkJLyogR2V0IGFscGFjYSBhZGRyZXNzICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyMywgYWxwYWNhKQorCUxPQURfUkVHX0FERFIocjIzLCBhbHBhY2EpCiAJbGkJcjAsQUxQQUNBX1NJWkUKIAlzdWIJcjIzLHIxMyxyMjMKIAlkaXZkdQlyMjMscjIzLHIwCQkvKiByMjMgaGFzIGNwdSBudW1iZXIgKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjEzLCBwYWNhKQorCUxPQURfUkVHX0FERFIocjEzLCBwYWNhKQogCW11bGxpCXIwLHIyMyxQQUNBX1NJWkUKIAlhZGQJcjEzLHIxMyxyMAogCW10c3ByCVNQUk5fU1BSRzMscjEzCQkvKiBTYXZlIGl0IGF3YXkgZm9yIHRoZSBmdXR1cmUgKi8KQEAgLTYwLDE0ICs2MSwxNCBAQAogCW10c3ByCVNQUk5fQ1RSTFQscjQKIAogLyogU3BpbiBvbiBfX3NlY29uZGFyeV9ob2xkX3NwaW5sb29wIHVudGlsIGl0IGlzIHVwZGF0ZWQgYnkgdGhlIGJvb3QgY3B1LiAqLwotLyogSW4gdGhlIFVQIGNhc2Ugd2UnbGwgeWVpbGQoKSBsYXRlciwgYW5kIHdlIHdpbGwgbm90IGFjY2VzcyB0aGUgcGFjYSBhbnl3YXkgKi8KKy8qIEluIHRoZSBVUCBjYXNlIHdlJ2xsIHlpZWxkKCkgbGF0ZXIsIGFuZCB3ZSB3aWxsIG5vdCBhY2Nlc3MgdGhlIHBhY2EgYW55d2F5ICovCiAjaWZkZWYgQ09ORklHX1NNUAogMToKIAlITVRfTE9XCi0JTE9BRF9SRUdfSU1NRURJQVRFKHIyMywgX19zZWNvbmRhcnlfaG9sZF9zcGlubG9vcCkKKwlMT0FEX1JFR19BRERSKHIyMywgX19zZWNvbmRhcnlfaG9sZF9zcGlubG9vcCkKIAlsZAlyMjMsMChyMjMpCiAJc3luYwotCUxPQURfUkVHX0lNTUVESUFURShyMyxjdXJyZW50X3NldCkKKwlMT0FEX1JFR19BRERSKHIzLGN1cnJlbnRfc2V0KQogCXNsZGkJcjI4LHIyNCwzCQkvKiBnZXQgY3VycmVudF9zZXRbY3B1I10gKi8KIAlsZHgJcjMscjMscjI4CiAJYWRkaQlyMSxyMyxUSFJFQURfU0laRQpAQCAtOTAsNyArOTEsNyBAQAogCWxieglyMjMsUEFDQVBST0NTVEFSVChyMTMpCS8qIFRlc3QgaWYgdGhpcyBwcm9jZXNzb3IKIAkJCQkJICogc2hvdWxkIHN0YXJ0ICovCiAJc3luYwotCUxPQURfUkVHX0lNTUVESUFURShyMyxjdXJyZW50X3NldCkKKwlMT0FEX1JFR19BRERSKHIzLGN1cnJlbnRfc2V0KQogCXNsZGkJcjI4LHIyNCwzCQkvKiBnZXQgY3VycmVudF9zZXRbY3B1I10gKi8KIAlsZHgJcjMscjMscjI4CiAJYWRkaQlyMSxyMyxUSFJFQURfU0laRQpAQCAtMjU1LDggKzI1Niw4IEBACiAKIF9JTklUX1NUQVRJQyhfX3N0YXJ0X2luaXRpYWxpemF0aW9uX2lTZXJpZXMpCiAJLyogQ2xlYXIgb3V0IHRoZSBCU1MgKi8KLQlMT0FEX1JFR19JTU1FRElBVEUocjExLF9fYnNzX3N0b3ApCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI4LF9fYnNzX3N0YXJ0KQorCUxPQURfUkVHX0FERFIocjExLF9fYnNzX3N0b3ApCisJTE9BRF9SRUdfQUREUihyOCxfX2Jzc19zdGFydCkKIAlzdWIJcjExLHIxMSxyOAkJLyogYnNzIHNpemUJCQkqLwogCWFkZGkJcjExLHIxMSw3CQkvKiByb3VuZCB1cCB0byBhbiBldmVuIGRvdWJsZSB3b3JkICovCiAJcmxkaWNsLiByMTEscjExLDYxLDMJCS8qIHNoaWZ0IHJpZ2h0IGJ5IDMJCSovCkBAIC0yNjcsMTUgKzI2OCwxMSBAQAogMzoJc3RkdQlyMCw4KHI4KQogCWJkbnoJM2IKIDQ6Ci0JTE9BRF9SRUdfSU1NRURJQVRFKHIxLGluaXRfdGhyZWFkX3VuaW9uKQorCUxPQURfUkVHX0FERFIocjEsaW5pdF90aHJlYWRfdW5pb24pCiAJYWRkaQlyMSxyMSxUSFJFQURfU0laRQogCWxpCXIwLDAKIAlzdGR1CXIwLC1TVEFDS19GUkFNRV9PVkVSSEVBRChyMSkKIAotCUxPQURfUkVHX0lNTUVESUFURShyMixfX3RvY19zdGFydCkKLQlhZGRpCXIyLHIyLDB4NDAwMAotCWFkZGkJcjIscjIsMHg0MDAwCi0KIAlibAkuaVNlcmllc19lYXJseV9zZXR1cAogCWJsCS5lYXJseV9zZXR1cAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCmluZGV4IDczMWQ3YjEuLjM2ODljMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCkBAIC03MjIsMTMgKzcyMiwxMyBAQAogCWRheSA9IHRtLT50bV9tZGF5OwogCW1vbiA9IHRtLT50bV9tb24gKyAxOwogCi0JQklOX1RPX0JDRChzZWMpOwotCUJJTl9UT19CQ0QobWluKTsKLQlCSU5fVE9fQkNEKGhvdXIpOwotCUJJTl9UT19CQ0QobW9uKTsKLQlCSU5fVE9fQkNEKGRheSk7Ci0JQklOX1RPX0JDRCh5MSk7Ci0JQklOX1RPX0JDRCh5Mik7CisJc2VjID0gYmluMmJjZChzZWMpOworCW1pbiA9IGJpbjJiY2QobWluKTsKKwlob3VyID0gYmluMmJjZChob3VyKTsKKwltb24gPSBiaW4yYmNkKG1vbik7CisJZGF5ID0gYmluMmJjZChkYXkpOworCXkxID0gYmluMmJjZCh5MSk7CisJeTIgPSBiaW4yYmNkKHkyKTsKIAogCW1lbXNldChjZV90aW1lLCAwLCBzaXplb2YoY2VfdGltZSkpOwogCWNlX3RpbWVbM10gPSAweDQxOwpAQCAtNzc3LDEyICs3NzcsMTIgQEAKIAkJdTggZGF5ID0gY2VfbXNnWzEwXTsKIAkJdTggbW9uID0gY2VfbXNnWzExXTsKIAotCQlCQ0RfVE9fQklOKHNlYyk7Ci0JCUJDRF9UT19CSU4obWluKTsKLQkJQkNEX1RPX0JJTihob3VyKTsKLQkJQkNEX1RPX0JJTihkYXkpOwotCQlCQ0RfVE9fQklOKG1vbik7Ci0JCUJDRF9UT19CSU4oeWVhcik7CisJCXNlYyA9IGJjZDJiaW4oc2VjKTsKKwkJbWluID0gYmNkMmJpbihtaW4pOworCQlob3VyID0gYmNkMmJpbihob3VyKTsKKwkJZGF5ID0gYmNkMmJpbihkYXkpOworCQltb24gPSBiY2QyYmluKG1vbik7CisJCXllYXIgPSBiY2QyYmluKHllYXIpOwogCiAJCWlmICh5ZWFyIDw9IDY5KQogCQkJeWVhciArPSAxMDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggMzY0NzE0Ny4uZDRjNjFjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYwppbmRleCA1M2JjYTEzLi5lYWM1NjlkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3RpbWUuYwpAQCAtNjgsMTIgKzY4LDEyIEBACiAKIAlpZiAoIShtYXBsZV9jbG9ja19yZWFkKFJUQ19DT05UUk9MKSAmIFJUQ19ETV9CSU5BUlkpCiAJICAgIHx8IFJUQ19BTFdBWVNfQkNEKSB7Ci0JCUJDRF9UT19CSU4odG0tPnRtX3NlYyk7Ci0JCUJDRF9UT19CSU4odG0tPnRtX21pbik7Ci0JCUJDRF9UT19CSU4odG0tPnRtX2hvdXIpOwotCQlCQ0RfVE9fQklOKHRtLT50bV9tZGF5KTsKLQkJQkNEX1RPX0JJTih0bS0+dG1fbW9uKTsKLQkJQkNEX1RPX0JJTih0bS0+dG1feWVhcik7CisJCXRtLT50bV9zZWMgPSBiY2QyYmluKHRtLT50bV9zZWMpOworCQl0bS0+dG1fbWluID0gYmNkMmJpbih0bS0+dG1fbWluKTsKKwkJdG0tPnRtX2hvdXIgPSBiY2QyYmluKHRtLT50bV9ob3VyKTsKKwkJdG0tPnRtX21kYXkgPSBiY2QyYmluKHRtLT50bV9tZGF5KTsKKwkJdG0tPnRtX21vbiA9IGJjZDJiaW4odG0tPnRtX21vbik7CisJCXRtLT50bV95ZWFyID0gYmNkMmJpbih0bS0+dG1feWVhcik7CiAJICB9CiAJaWYgKCh0bS0+dG1feWVhciArIDE5MDApIDwgMTk3MCkKIAkJdG0tPnRtX3llYXIgKz0gMTAwOwpAQCAtMTA0LDEyICsxMDQsMTIgQEAKIAl5ZWFyID0gdG0tPnRtX3llYXI7CiAKIAlpZiAoIShzYXZlX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgewotCQlCSU5fVE9fQkNEKHNlYyk7Ci0JCUJJTl9UT19CQ0QobWluKTsKLQkJQklOX1RPX0JDRChob3VyKTsKLQkJQklOX1RPX0JDRChtb24pOwotCQlCSU5fVE9fQkNEKG1kYXkpOwotCQlCSU5fVE9fQkNEKHllYXIpOworCQlzZWMgPSBiaW4yYmNkKHNlYyk7CisJCW1pbiA9IGJpbjJiY2QobWluKTsKKwkJaG91ciA9IGJpbjJiY2QoaG91cik7CisJCW1vbiA9IGJpbjJiY2QobW9uKTsKKwkJbWRheSA9IGJpbjJiY2QobWRheSk7CisJCXllYXIgPSBiaW4yYmNkKHllYXIpOwogCX0KIAltYXBsZV9jbG9ja193cml0ZShzZWMsIFJUQ19TRUNPTkRTKTsKIAltYXBsZV9jbG9ja193cml0ZShtaW4sIFJUQ19NSU5VVEVTKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2dwaW9fbWRpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKaW5kZXggYWI2OTU1NC4uNzVjYzE2NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCWlmICghcHJpdikKIAkJZ290byBvdXQ7CiAKLQluZXdfYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1paV9idXMpLCBHRlBfS0VSTkVMKTsKKwluZXdfYnVzID0gbWRpb2J1c19hbGxvYygpOwogCiAJaWYgKCFuZXdfYnVzKQogCQlnb3RvIG91dF9mcmVlX3ByaXY7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibWRpby1waW4iLCBOVUxMKTsKIAlwcml2LT5tZGlvX3BpbiA9ICpwcm9wOwogCi0JbmV3X2J1cy0+ZGV2ID0gZGV2OworCW5ld19idXMtPnBhcmVudCA9IGRldjsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBuZXdfYnVzKTsKIAogCWVyciA9IG1kaW9idXNfcmVnaXN0ZXIobmV3X2J1cyk7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAogCWtmcmVlKGJ1cy0+cHJpdik7CiAJYnVzLT5wcml2ID0gTlVMTDsKLQlrZnJlZShidXMpOworCW1kaW9idXNfZnJlZShidXMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCmluZGV4IDUxNjllY2MuLmU2YzAwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jCkBAIC0yNjc3LDcgKzI2NzcsNyBAQAogCW1hY2lvX2NoaXBzW2ldLm9mX25vZGUJPSBub2RlOwogCW1hY2lvX2NoaXBzW2ldLnR5cGUJPSB0eXBlOwogCW1hY2lvX2NoaXBzW2ldLmJhc2UJPSBiYXNlOwotCW1hY2lvX2NoaXBzW2ldLmZsYWdzCT0gTUFDSU9fRkxBR19TQ0NCX09OIHwgTUFDSU9fRkxBR19TQ0NCX09OOworCW1hY2lvX2NoaXBzW2ldLmZsYWdzCT0gTUFDSU9fRkxBR19TQ0NBX09OIHwgTUFDSU9fRkxBR19TQ0NCX09OOwogCW1hY2lvX2NoaXBzW2ldLm5hbWUJPSBtYWNpb19uYW1lc1t0eXBlXTsKIAlyZXZwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZXZpc2lvbi1pZCIsIE5VTEwpOwogCWlmIChyZXZwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IDg4Y2NmM2EuLjgyYzE0ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCmluZGV4IDRhZTNkMDAuLjQwZjcyYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwpAQCAtNzg3LDcgKzc4Nyw3IEBACiB7CiAJdW5zaWduZWQgaW50IHNhdmVfdmVjdG9yOwogCXVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBmbGFnczsKLQl1bnNpZ25lZCBpbnQgKnZlY3RvciA9ICh1bnNpZ25lZCBpbnQgKikoS0VSTkVMQkFTRSsweDEwMCk7CisJdW5zaWduZWQgaW50ICp2ZWN0b3IgPSAodW5zaWduZWQgaW50ICopKFBBR0VfT0ZGU0VUKzB4MTAwKTsKIAogCWlmIChuciA8IDAgfHwgbnIgPiAzKQogCQlyZXR1cm47CkBAIC04MDEsNyArODAxLDcgQEAKIAlzYXZlX3ZlY3RvciA9ICp2ZWN0b3I7CiAKIAkvKiBTZXR1cCBmYWtlIHJlc2V0IHZlY3RvciB0aGF0IGRvZXMKLQkgKiAgIGIgX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wICsgbnIqOCAtIEtFUk5FTEJBU0UKKwkgKiAgIGIgX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wICsgbnIqOAogCSAqLwogCXRhcmdldCA9ICh1bnNpZ25lZCBsb25nKSBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzAgKyBuciAqIDg7CiAJcGF0Y2hfYnJhbmNoKHZlY3RvciwgdGFyZ2V0LCBCUkFOQ0hfU0VUX0xJTkspOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYwppbmRleCBiYmJlZmQ2Li41OWViODQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYwpAQCAtOTMsMTEgKzkzLDE0IEBACiB9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0FEQl9DVURBKSB8fCBkZWZpbmVkKENPTkZJR19BREJfUE1VKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUE1BQ19TTVUpCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBmcm9tX3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CiAJcmV0dXJuIG1rdGltZSh0bS0+dG1feWVhcisxOTAwLCB0bS0+dG1fbW9uKzEsIHRtLT50bV9tZGF5LAogCQkgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CiB9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BREJfQ1VEQQogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VkYV9nZXRfdGltZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCmluZGV4IDI4MGVlODguLmE3ODliZjU4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwpAQCAtNzYyLDcgKzc2Miw3IEBACiAJfTsKIAogCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKLQlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKKwlzZXRfZGV2X25vZGUoJmRldi0+Y29yZSwgMCk7CiAKIAlwcl9kZWJ1ZygiJXM6JWQgYWRkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvY21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvY21tLmMKaW5kZXggMzhmZTMyYS4uNWNkNGQyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2NtbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9jbW0uYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQlucGEgPSAoc3RydWN0IGNtbV9wYWdlX2FycmF5ICopX19nZXRfZnJlZV9wYWdlKEdGUF9OT0lPIHwgX19HRlBfTk9XQVJOIHwKIAkJCQkJCQkJICAgICAgIF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT01FTUFMTE9DKTsKIAkJCWlmICghbnBhKSB7Ci0JCQkJcHJfaW5mbygiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV3IHBhZ2UgbGlzdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlwcl9pbmZvKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBuZXcgcGFnZSBsaXN0XG4iLCBfX2Z1bmNfXyk7CiAJCQkJZnJlZV9wYWdlKGFkZHIpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCX0KIAogCQlpZiAoKHJjID0gcGxwYXJfcGFnZV9zZXRfbG9hbmVkKF9fcGEoYWRkcikpKSkgewotCQkJcHJfZXJyKCIlczogQ2FuIG5vdCBzZXQgcGFnZSB0byBsb2FuZWQuIHJjPSVsZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisJCQlwcl9lcnIoIiVzOiBDYW4gbm90IHNldCBwYWdlIHRvIGxvYW5lZC4gcmM9JWxkXG4iLCBfX2Z1bmNfXywgcmMpOwogCQkJc3Bpbl91bmxvY2soJmNtbV9sb2NrKTsKIAkJCWZyZWVfcGFnZShhZGRyKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKaW5kZXggOGMxY2E0Ny4uMGFkNTZmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCkBAIC00MSw3ICs0MSw3IEBACiAJcmV0dXJuICIiOwogfQogCi0jaWZkZWYgREVCVUcKKyNpZiAwCiBzdGF0aWMgdm9pZCBwcmludF9kZXZpY2Vfbm9kZV90cmVlKHN0cnVjdCBwY2lfZG4gKnBkbiwgaW50IGRlbnQpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1tZW1vcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCmluZGV4IGExYTM2OGQuLjE0MGQwMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLW1lbW9yeS5jCkBAIC0yMSw3ICsyMSw3IEBACiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJaW50IHJldDsKIAotCXN0YXJ0X3BmbiA9IGJhc2UgPj4gUEZOX1NFQ1RJT05fU0hJRlQ7CisJc3RhcnRfcGZuID0gYmFzZSA+PiBQQUdFX1NISUZUOwogCXpvbmUgPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCA3NjM3YmQzLi5jNTkxYTI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtNDY2LDExICs0NjYsMTEgQEAKIAkJZWxzZQogCQkJYWN0aW9uID0gUFNFUklFU19EUkNPTkZfTUVNX1JFTU9WRTsKIAotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwU2VyaWVzX3JlY29uZmlnX2NoYWluLAotCQkJCQkgICAgIGFjdGlvbiwgdmFsdWUpOworCQlyYyA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCisJCQkJCQkgIGFjdGlvbiwgdmFsdWUpOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCmluZGV4IGM5ZmZkOGMuLmY0ZTU1YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCkBAIC0yOTUsMTkgKzI5NSwyOSBAQAogCWlmICghdG1wKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKIAkvKiBpZiBpdCdzIDAsIHRoZW4gd2Uga25vdyB3ZSBnb3QgdGhlIGxhc3Qgb25lICh0aGUgb25lIGluIE5WUkFNKSAqLwotCWlmIChydGFzX2xvZ19zaXplID09IDAgJiYgbG9nZ2luZ19lbmFibGVkKQorCXdoaWxlIChydGFzX2xvZ19zaXplID09IDApIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzZF9sb2dfbG9jaywgcyk7CisJCQllcnJvciA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghbG9nZ2luZ19lbmFibGVkKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzZF9sb2dfbG9jaywgcyk7CisJCQllcnJvciA9IC1FTk9EQVRBOworCQkJZ290byBvdXQ7CisJCX0KIAkJbnZyYW1fY2xlYXJfZXJyb3JfbG9nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOwogCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocnRhc19sb2dfd2FpdCwgcnRhc19sb2dfc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCX0KIAotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJ0YXNfbG9nX3dhaXQsIHJ0YXNfbG9nX3NpemUpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhc2RfbG9nX2xvY2ssIHMpOwogCW9mZnNldCA9IHJ0YXNfZXJyb3JfbG9nX2J1ZmZlcl9tYXggKiAocnRhc19sb2dfc3RhcnQgJiBMT0dfTlVNQkVSX01BU0spOwogCW1lbWNweSh0bXAsICZydGFzX2xvZ19idWZbb2Zmc2V0XSwgY291bnQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IDdiMDFkNjcuLmVjMzQxNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKaW5kZXggOWQ4ZjhjOC4uZTAwZjk2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgInhpY3MuaCIKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC00OSw2ICs0OCw3IEBACiAKICNpbmNsdWRlICJwbHBhcl93cmFwcGVycy5oIgogI2luY2x1ZGUgInBzZXJpZXMuaCIKKyNpbmNsdWRlICJ4aWNzLmgiCiAKIAogLyoKQEAgLTEwNSwzNiArMTA1LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YSUNTCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wX3hpY3NfZG9fbWVzc2FnZShpbnQgY3B1LCBpbnQgbXNnKQotewotCXNldF9iaXQobXNnLCAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKTsKLQltYigpOwotCXhpY3NfY2F1c2VfSVBJKGNwdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNtcF94aWNzX21lc3NhZ2VfcGFzcyhpbnQgdGFyZ2V0LCBpbnQgbXNnKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKHRhcmdldCA8IE5SX0NQVVMpIHsKLQkJc21wX3hpY3NfZG9fbWVzc2FnZSh0YXJnZXQsIG1zZyk7Ci0JfSBlbHNlIHsKLQkJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCQlpZiAodGFyZ2V0ID09IE1TR19BTExfQlVUX1NFTEYKLQkJCSAgICAmJiBpID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCQljb250aW51ZTsKLQkJCXNtcF94aWNzX2RvX21lc3NhZ2UoaSwgbXNnKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgc21wX3hpY3NfcHJvYmUodm9pZCkKLXsKLQl4aWNzX3JlcXVlc3RfSVBJcygpOwotCi0JcmV0dXJuIGNwdXNfd2VpZ2h0KGNwdV9wb3NzaWJsZV9tYXApOwotfQotCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc21wX3hpY3Nfc2V0dXBfY3B1KGludCBjcHUpCiB7CiAJaWYgKGNwdSAhPSBib290X2NwdWlkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggMGZjODMwZi4uZTE5MDQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC05LDMyICs5LDMwIEBACiAgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAKICNpbmNsdWRlICJ4aWNzLmgiCiAjaW5jbHVkZSAicGxwYXJfd3JhcHBlcnMuaCIKIAorc3RhdGljIHN0cnVjdCBpcnFfaG9zdCAqeGljc19ob3N0OworCiAjZGVmaW5lIFhJQ1NfSVBJCQkyCiAjZGVmaW5lIFhJQ1NfSVJRX1NQVVJJT1VTCTAKIApAQCAtNDcsNiArNDUsMjAgQEAKICAqLwogI2RlZmluZSBJUElfUFJJT1JJVFkJCTQKIAorc3RhdGljIHVuc2lnbmVkIGludCBkZWZhdWx0X3NlcnZlciA9IDB4RkY7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXIgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfc2VydmVyX3NpemUgPSA4OworCisvKiBSVEFTIHNlcnZpY2UgdG9rZW5zICovCitzdGF0aWMgaW50IGlibV9nZXRfeGl2ZTsKK3N0YXRpYyBpbnQgaWJtX3NldF94aXZlOworc3RhdGljIGludCBpYm1faW50X29uOworc3RhdGljIGludCBpYm1faW50X29mZjsKKworCisvKiBEaXJlY3QgaGFyZHdhcmUgbG93IGxldmVsIGFjY2Vzc29ycyAqLworCisvKiBUaGUgcGFydCBvZiB0aGUgaW50ZXJydXB0IHByZXNlbnRhdGlvbiBsYXllciB0aGF0IHdlIGNhcmUgYWJvdXQgKi8KIHN0cnVjdCB4aWNzX2lwbCB7CiAJdW5pb24gewogCQl1MzIgd29yZDsKQEAgLTY1LDI3ICs3Nyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeGljc19pcGwgX19pb21lbSAqeGljc19wZXJfY3B1W05SX0NQVVNdOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfc2VydmVyID0gMHhGRjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF9kaXN0cmliX3NlcnZlciA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGludGVycnVwdF9zZXJ2ZXJfc2l6ZSA9IDg7Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2hvc3QgKnhpY3NfaG9zdDsKLQotLyoKLSAqIFhJQ1Mgb25seSBoYXMgYSBzaW5nbGUgSVBJLCBzbyBlbmNvZGUgdGhlIG1lc3NhZ2VzIHBlciBDUFUKLSAqLwotc3RydWN0IHhpY3NfaXBpX3N0cnVjdCB4aWNzX2lwaV9tZXNzYWdlW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7Ci0KLS8qIFJUQVMgc2VydmljZSB0b2tlbnMgKi8KLXN0YXRpYyBpbnQgaWJtX2dldF94aXZlOwotc3RhdGljIGludCBpYm1fc2V0X3hpdmU7Ci1zdGF0aWMgaW50IGlibV9pbnRfb247Ci1zdGF0aWMgaW50IGlibV9pbnRfb2ZmOwotCi0KLS8qIERpcmVjdCBIVyBsb3cgbGV2ZWwgYWNjZXNzb3JzICovCi0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZGlyZWN0X3hpcnJfaW5mb19nZXQodm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtOTMsNyArODQsNyBAQAogCXJldHVybiBpbl9iZTMyKCZ4aWNzX3Blcl9jcHVbY3B1XS0+eGlyci53b3JkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRpcmVjdF94aXJyX2luZm9fc2V0KGludCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXJlY3RfeGlycl9pbmZvX3NldCh1bnNpZ25lZCBpbnQgdmFsdWUpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMTE1LDcgKzEwNiw2IEBACiAKIC8qIExQQVIgbG93IGxldmVsIGFjY2Vzc29ycyAqLwogCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGxwYXJfeGlycl9pbmZvX2dldCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKQEAgLTEyNywxNSArMTE3LDE0IEBACiAJcmV0dXJuICh1bnNpZ25lZCBpbnQpcmV0dXJuX3ZhbHVlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHBhcl94aXJyX2luZm9fc2V0KGludCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBscGFyX3hpcnJfaW5mb19zZXQodW5zaWduZWQgaW50IHZhbHVlKQogewogCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKLQl1bnNpZ25lZCBsb25nIHZhbDY0ID0gdmFsdWUgJiAweGZmZmZmZmZmOwogCi0JbHBhcl9yYyA9IHBscGFyX2VvaSh2YWw2NCk7CisJbHBhcl9yYyA9IHBscGFyX2VvaSh2YWx1ZSk7CiAJaWYgKGxwYXJfcmMgIT0gSF9TVUNDRVNTKQotCQlwYW5pYygiYmFkIHJldHVybiBjb2RlIEVPSSAtIHJjID0gJWxkLCB2YWx1ZT0lbHhcbiIsIGxwYXJfcmMsCi0JCSAgICAgIHZhbDY0KTsKKwkJcGFuaWMoImJhZCByZXR1cm4gY29kZSBFT0kgLSByYyA9ICVsZCwgdmFsdWU9JXhcbiIsIGxwYXJfcmMsCisJCSAgICAgIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxwYXJfY3Bwcl9pbmZvKHU4IHZhbHVlKQpAQCAtMTU3LDQ4ICsxNDYsNyBAQAogfQogCiAKLS8qIEhpZ2ggbGV2ZWwgaGFuZGxlcnMgYW5kIGluaXQgY29kZSAqLwotCi1zdGF0aWMgdm9pZCB4aWNzX3VwZGF0ZV9pcnFfc2VydmVycyh2b2lkKQotewotCWludCBpLCBqOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdTMyIGlsZW47Ci0JY29uc3QgdTMyICppcmVnLCAqaXNpemU7Ci0JdTMyIGhjcHVpZDsKLQotCS8qIEZpbmQgdGhlIHNlcnZlciBudW1iZXJzIGZvciB0aGUgYm9vdCBjcHUuICovCi0JbnAgPSBvZl9nZXRfY3B1X25vZGUoYm9vdF9jcHVpZCwgTlVMTCk7Ci0JQlVHX09OKCFucCk7Ci0KLQlpcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiwgJmlsZW4pOwotCWlmICghaXJlZykgewotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpID0gaWxlbiAvIHNpemVvZihpbnQpOwotCWhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCk7Ci0KLQkvKiBHbG9iYWwgaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0Ci0JICogZW50cnkgb2YgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIgcHJvcGVydHkuIEdldCB0aGUgbGFzdAotCSAqIGVudHJ5IGZvbSB0aGlzIHByb3BlcnR5IGZvciBjdXJyZW50IGJvb3QgY3B1IGlkIGFuZCB1c2UgaXQgYXMKLQkgKiBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIKLQkgKi8KLQlmb3IgKGogPSAwOyBqIDwgaTsgaiArPSAyKSB7Ci0JCWlmIChpcmVnW2pdID09IGhjcHVpZCkgewotCQkJZGVmYXVsdF9zZXJ2ZXIgPSBoY3B1aWQ7Ci0JCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tqKzFdOwotCi0JCQlpc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShucCwKLQkJCQkJImlibSxpbnRlcnJ1cHQtc2VydmVyIy1zaXplIiwgTlVMTCk7Ci0JCQlpZiAoaXNpemUpCi0JCQkJaW50ZXJydXB0X3NlcnZlcl9zaXplID0gKmlzaXplOwotCQl9Ci0JfQotCi0Jb2Zfbm9kZV9wdXQobnApOwotfQorLyogSW50ZXJmYWNlIHRvIGdlbmVyaWMgaXJxIHN1YnN5c3RlbSAqLwogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKQEAgLTIwOCw5ICsxNTYsNiBAQAogCWNwdW1hc2tfdCBjcHVtYXNrID0gaXJxX2Rlc2NbdmlycV0uYWZmaW5pdHk7CiAJY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CiAKLQlpZiAoISBjcHVfaXNzZXQoZGVmYXVsdF9zZXJ2ZXIsIGNwdV9vbmxpbmVfbWFwKSkKLQkJeGljc191cGRhdGVfaXJxX3NlcnZlcnMoKTsKLQogCWlmICghZGlzdHJpYnV0ZV9pcnFzKQogCQlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiAKQEAgLTIzOCw3ICsxODMsNiBAQAogfQogI2VuZGlmCiAKLQogc3RhdGljIHZvaWQgeGljc191bm1hc2tfaXJxKHVuc2lnbmVkIGludCB2aXJxKQogewogCXVuc2lnbmVkIGludCBpcnE7CkBAIC0yNTcsMjEgKzIwMSwyOCBAQAogCWNhbGxfc3RhdHVzID0gcnRhc19jYWxsKGlibV9zZXRfeGl2ZSwgMywgMSwgTlVMTCwgaXJxLCBzZXJ2ZXIsCiAJCQkJREVGQVVMVF9QUklPUklUWSk7CiAJaWYgKGNhbGxfc3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ4aWNzX2VuYWJsZV9pcnE6IGlycT0ldTogaWJtX3NldF94aXZlICIKLQkJICAgICAgICJyZXR1cm5lZCAlZFxuIiwgaXJxLCBjYWxsX3N0YXR1cyk7Ci0JCXByaW50aygic2V0X3hpdmUgJXgsIHNlcnZlciAleFxuIiwgaWJtX3NldF94aXZlLCBzZXJ2ZXIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogaWJtX3NldF94aXZlIGlycSAldSBzZXJ2ZXIgJXggcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgaXJxLCBzZXJ2ZXIsIGNhbGxfc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIE5vdyB1bm1hc2sgdGhlIGludGVycnVwdCAob2Z0ZW4gYSBuby1vcCkgKi8KIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1faW50X29uLCAxLCAxLCBOVUxMLCBpcnEpOwogCWlmIChjYWxsX3N0YXR1cyAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAieGljc19lbmFibGVfaXJxOiBpcnE9JXU6IGlibV9pbnRfb24gIgotCQkgICAgICAgInJldHVybmVkICVkXG4iLCBpcnEsIGNhbGxfc3RhdHVzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaWJtX2ludF9vbiBpcnE9JXUgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgaXJxLCBjYWxsX3N0YXR1cyk7CiAJCXJldHVybjsKIAl9CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGljc19zdGFydHVwKHVuc2lnbmVkIGludCB2aXJxKQoreworCS8qIHVubWFzayBpdCAqLworCXhpY3NfdW5tYXNrX2lycSh2aXJxKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgeGljc19tYXNrX3JlYWxfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaW50IGNhbGxfc3RhdHVzOwpAQCAtMjgxLDggKzIzMiw4IEBACiAKIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1faW50X29mZiwgMSwgMSwgTlVMTCwgaXJxKTsKIAlpZiAoY2FsbF9zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgInhpY3NfZGlzYWJsZV9yZWFsX2lycTogaXJxPSV1OiAiCi0JCSAgICAgICAiaWJtX2ludF9vZmYgcmV0dXJuZWQgJWRcbiIsIGlycSwgY2FsbF9zdGF0dXMpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpYm1faW50X29mZiBpcnE9JXUgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgaXJxLCBjYWxsX3N0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI5MCw4ICsyNDEsOCBAQAogCWNhbGxfc3RhdHVzID0gcnRhc19jYWxsKGlibV9zZXRfeGl2ZSwgMywgMSwgTlVMTCwgaXJxLAogCQkJCWRlZmF1bHRfc2VydmVyLCAweGZmKTsKIAlpZiAoY2FsbF9zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgInhpY3NfZGlzYWJsZV9pcnE6IGlycT0ldTogaWJtX3NldF94aXZlKDB4ZmYpIgotCQkgICAgICAgIiByZXR1cm5lZCAlZFxuIiwgaXJxLCBjYWxsX3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibV9zZXRfeGl2ZSgweGZmKSBpcnE9JXUgcmV0dXJuZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgaXJxLCBjYWxsX3N0YXR1cyk7CiAJCXJldHVybjsKIAl9CiB9CkBAIC0zMDgsMTcgKzI1OSw2MSBAQAogCXhpY3NfbWFza19yZWFsX2lycShpcnEpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHhpY3Nfc3RhcnR1cCh1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyB2b2lkIHhpY3NfbWFza191bmtub3duX3ZlYyh1bnNpZ25lZCBpbnQgdmVjKQogeworCXByaW50ayhLRVJOX0VSUiAiSW50ZXJydXB0ICV1IChyZWFsKSBpcyBpbnZhbGlkLCBkaXNhYmxpbmcgaXQuXG4iLCB2ZWMpOworCXhpY3NfbWFza19yZWFsX2lycSh2ZWMpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4aWNzX3hpcnJfdmVjdG9yKHVuc2lnbmVkIGludCB4aXJyKQoreworCS8qCisJICogVGhlIHRvcCBieXRlIGlzIHRoZSBvbGQgY3BwciwgdG8gYmUgcmVzdG9yZWQgb24gRU9JLgorCSAqIFRoZSByZW1haW5pbmcgMjQgYml0cyBhcmUgdGhlIHZlY3Rvci4KKwkgKi8KKwlyZXR1cm4geGlyciAmIDB4MDBmZmZmZmY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGljc19nZXRfaXJxX2RpcmVjdCh2b2lkKQoreworCXVuc2lnbmVkIGludCB4aXJyID0gZGlyZWN0X3hpcnJfaW5mb19nZXQoKTsKKwl1bnNpZ25lZCBpbnQgdmVjID0geGljc194aXJyX3ZlY3Rvcih4aXJyKTsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCi0JLyogZm9yY2UgYSByZXZlcnNlIG1hcHBpbmcgb2YgdGhlIGludGVycnVwdCBzbyBpdCBnZXRzIGluIHRoZSBjYWNoZSAqLwotCWlycSA9ICh1bnNpZ25lZCBpbnQpaXJxX21hcFt2aXJxXS5od2lycTsKLQlpcnFfcmFkaXhfcmV2bWFwKHhpY3NfaG9zdCwgaXJxKTsKKwlpZiAodmVjID09IFhJQ1NfSVJRX1NQVVJJT1VTKQorCQlyZXR1cm4gTk9fSVJROwogCi0JLyogdW5tYXNrIGl0ICovCi0JeGljc191bm1hc2tfaXJxKHZpcnEpOwotCXJldHVybiAwOworCWlycSA9IGlycV9yYWRpeF9yZXZtYXBfbG9va3VwKHhpY3NfaG9zdCwgdmVjKTsKKwlpZiAobGlrZWx5KGlycSAhPSBOT19JUlEpKQorCQlyZXR1cm4gaXJxOworCisJLyogV2UgZG9uJ3QgaGF2ZSBhIGxpbnV4IG1hcHBpbmcsIHNvIGhhdmUgcnRhcyBtYXNrIGl0LiAqLworCXhpY3NfbWFza191bmtub3duX3ZlYyh2ZWMpOworCisJLyogV2UgbWlnaHQgbGVhcm4gYWJvdXQgaXQgbGF0ZXIsIHNvIEVPSSBpdCAqLworCWRpcmVjdF94aXJyX2luZm9fc2V0KHhpcnIpOworCXJldHVybiBOT19JUlE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGljc19nZXRfaXJxX2xwYXIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgeGlyciA9IGxwYXJfeGlycl9pbmZvX2dldCgpOworCXVuc2lnbmVkIGludCB2ZWMgPSB4aWNzX3hpcnJfdmVjdG9yKHhpcnIpOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlpZiAodmVjID09IFhJQ1NfSVJRX1NQVVJJT1VTKQorCQlyZXR1cm4gTk9fSVJROworCisJaXJxID0gaXJxX3JhZGl4X3Jldm1hcF9sb29rdXAoeGljc19ob3N0LCB2ZWMpOworCWlmIChsaWtlbHkoaXJxICE9IE5PX0lSUSkpCisJCXJldHVybiBpcnE7CisKKwkvKiBXZSBkb24ndCBoYXZlIGEgbGludXggbWFwcGluZywgc28gaGF2ZSBSVEFTIG1hc2sgaXQuICovCisJeGljc19tYXNrX3Vua25vd25fdmVjKHZlYyk7CisKKwkvKiBXZSBtaWdodCBsZWFybiBhYm91dCBpdCBsYXRlciwgc28gRU9JIGl0ICovCisJbHBhcl94aXJyX2luZm9fc2V0KHhpcnIpOworCXJldHVybiBOT19JUlE7CiB9CiAKIHN0YXRpYyB2b2lkIHhpY3NfZW9pX2RpcmVjdCh1bnNpZ25lZCBpbnQgdmlycSkKQEAgLTMyOSw3ICszMjQsNiBAQAogCWRpcmVjdF94aXJyX2luZm9fc2V0KCgweGZmIDw8IDI0KSB8IGlycSk7CiB9CiAKLQogc3RhdGljIHZvaWQgeGljc19lb2lfbHBhcih1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxID0gKHVuc2lnbmVkIGludClpcnFfbWFwW3ZpcnFdLmh3aXJxOwpAQCAtMzM4LDEwNCArMzMyLDYgQEAKIAlscGFyX3hpcnJfaW5mb19zZXQoKDB4ZmYgPDwgMjQpIHwgaXJxKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgeGljc19yZW1hcF9pcnEodW5zaWduZWQgaW50IHZlYykKLXsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCi0JdmVjICY9IDB4MDBmZmZmZmY7Ci0KLQlpZiAodmVjID09IFhJQ1NfSVJRX1NQVVJJT1VTKQotCQlyZXR1cm4gTk9fSVJROwotCWlycSA9IGlycV9yYWRpeF9yZXZtYXAoeGljc19ob3N0LCB2ZWMpOwotCWlmIChsaWtlbHkoaXJxICE9IE5PX0lSUSkpCi0JCXJldHVybiBpcnE7Ci0KLQlwcmludGsoS0VSTl9FUlIgIkludGVycnVwdCAldSAocmVhbCkgaXMgaW52YWxpZCwiCi0JICAgICAgICIgZGlzYWJsaW5nIGl0LlxuIiwgdmVjKTsKLQl4aWNzX21hc2tfcmVhbF9pcnEodmVjKTsKLQlyZXR1cm4gTk9fSVJROwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHhpY3NfZ2V0X2lycV9kaXJlY3Qodm9pZCkKLXsKLQlyZXR1cm4geGljc19yZW1hcF9pcnEoZGlyZWN0X3hpcnJfaW5mb19nZXQoKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgeGljc19nZXRfaXJxX2xwYXIodm9pZCkKLXsKLQlyZXR1cm4geGljc19yZW1hcF9pcnEobHBhcl94aXJyX2luZm9fZ2V0KCkpOwotfQotCi0jaWZkZWYgQ09ORklHX1NNUAotCi1zdGF0aWMgaXJxcmV0dXJuX3QgeGljc19pcGlfZGlzcGF0Y2goaW50IGNwdSkKLXsKLQlXQVJOX09OKGNwdV9pc19vZmZsaW5lKGNwdSkpOwotCi0Jd2hpbGUgKHhpY3NfaXBpX21lc3NhZ2VbY3B1XS52YWx1ZSkgewotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBQQ19NU0dfQ0FMTF9GVU5DVElPTiwKLQkJCQkgICAgICAgJnhpY3NfaXBpX21lc3NhZ2VbY3B1XS52YWx1ZSkpIHsKLQkJCW1iKCk7Ci0JCQlzbXBfbWVzc2FnZV9yZWN2KFBQQ19NU0dfQ0FMTF9GVU5DVElPTik7Ci0JCX0KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQUENfTVNHX1JFU0NIRURVTEUsCi0JCQkJICAgICAgICZ4aWNzX2lwaV9tZXNzYWdlW2NwdV0udmFsdWUpKSB7Ci0JCQltYigpOwotCQkJc21wX21lc3NhZ2VfcmVjdihQUENfTVNHX1JFU0NIRURVTEUpOwotCQl9Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFLAotCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgewotCQkJbWIoKTsKLQkJCXNtcF9tZXNzYWdlX3JlY3YoUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFKTsKLQkJfQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHR0VSKSB8fCBkZWZpbmVkKENPTkZJR19LRVhFQykKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChQUENfTVNHX0RFQlVHR0VSX0JSRUFLLAotCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgewotCQkJbWIoKTsKLQkJCXNtcF9tZXNzYWdlX3JlY3YoUFBDX01TR19ERUJVR0dFUl9CUkVBSyk7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB4aWNzX2lwaV9hY3Rpb25fZGlyZWN0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JZGlyZWN0X3FpcnJfaW5mbyhjcHUsIDB4ZmYpOwotCi0JcmV0dXJuIHhpY3NfaXBpX2Rpc3BhdGNoKGNwdSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB4aWNzX2lwaV9hY3Rpb25fbHBhcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWxwYXJfcWlycl9pbmZvKGNwdSwgMHhmZik7Ci0KLQlyZXR1cm4geGljc19pcGlfZGlzcGF0Y2goY3B1KTsKLX0KLQotdm9pZCB4aWNzX2NhdXNlX0lQSShpbnQgY3B1KQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQotCQlscGFyX3FpcnJfaW5mbyhjcHUsIElQSV9QUklPUklUWSk7Ci0JZWxzZQotCQlkaXJlY3RfcWlycl9pbmZvKGNwdSwgSVBJX1BSSU9SSVRZKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQotc3RhdGljIHZvaWQgeGljc19zZXRfY3B1X3ByaW9yaXR5KHVuc2lnbmVkIGNoYXIgY3BwcikKLXsKLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkKLQkJbHBhcl9jcHByX2luZm8oY3Bwcik7Ci0JZWxzZQotCQlkaXJlY3RfY3Bwcl9pbmZvKGNwcHIpOwotCWlvc3luYygpOwotfQotCiBzdGF0aWMgdm9pZCB4aWNzX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlycSwgY3B1bWFza190IGNwdW1hc2spCiB7CiAJdW5zaWduZWQgaW50IGlycTsKQEAgLTQ1MCw4ICszNDYsOCBAQAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fZ2V0X3hpdmUsIDEsIDMsIHhpY3Nfc3RhdHVzLCBpcnEpOwogCiAJaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIgInhpY3Nfc2V0X2FmZmluaXR5OiBpcnE9JXUgaWJtLGdldC14aXZlICIKLQkJICAgICAgICJyZXR1cm5zICVkXG4iLCBpcnEsIHN0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibSxnZXQteGl2ZSBpcnE9JXUgcmV0dXJucyAlZFxuIiwKKwkJCV9fZnVuY19fLCBpcnEsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ2Myw4ICszNTksOSBAQAogCWlmIChpcnFfc2VydmVyID09IC0xKSB7CiAJCWNoYXIgY3B1bGlzdFsxMjhdOwogCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4aWNzX3NldF9hZmZpbml0eTogTm8gb25saW5lIGNwdXMgaW4gIgotCQkJCSJ0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLCBjcHVsaXN0LCB2aXJxKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBObyBvbmxpbmUgY3B1cyBpbiB0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLAorCQkJX19mdW5jX18sIGNwdWxpc3QsIHZpcnEpOwogCQlyZXR1cm47CiAJfQogCkBAIC00NzIsMjggKzM2OSwxMiBAQAogCQkJCWlycSwgaXJxX3NlcnZlciwgeGljc19zdGF0dXNbMV0pOwogCiAJaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIgInhpY3Nfc2V0X2FmZmluaXR5OiBpcnE9JXUgaWJtLHNldC14aXZlICIKLQkJICAgICAgICJyZXR1cm5zICVkXG4iLCBpcnEsIHN0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibSxzZXQteGl2ZSBpcnE9JXUgcmV0dXJucyAlZFxuIiwKKwkJCV9fZnVuY19fLCBpcnEsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiB9CiAKLXZvaWQgeGljc19zZXR1cF9jcHUodm9pZCkKLXsKLQl4aWNzX3NldF9jcHVfcHJpb3JpdHkoMHhmZik7Ci0KLQkvKgotCSAqIFB1dCB0aGUgY2FsbGluZyBwcm9jZXNzb3IgaW50byB0aGUgR0lRLiAgVGhpcyBpcyByZWFsbHkgb25seQotCSAqIG5lY2Vzc2FyeSBmcm9tIGEgc2Vjb25kYXJ5IHRocmVhZCBhcyB0aGUgT0Ygc3RhcnQtY3B1IGludGVyZmFjZQotCSAqIHBlcmZvcm1zIHRoaXMgZnVuY3Rpb24gZm9yIHVzIG9uIHByaW1hcnkgdGhyZWFkcy4KLQkgKgotCSAqIFhYWDogdW5kbyBvZiB0ZWFyZG93biBvbiBrZXhlYyBuZWVkcyB0aGlzIHRvbywgYXMgbWF5IGhvdHBsdWcKLQkgKi8KLQlydGFzX3NldF9pbmRpY2F0b3JfZmFzdChHTE9CQUxfSU5URVJSVVBUX1FVRVVFLAotCQkoMVVMIDw8IGludGVycnVwdF9zZXJ2ZXJfc2l6ZSkgLSAxIC0gZGVmYXVsdF9kaXN0cmliX3NlcnZlciwgMSk7Ci19Ci0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB4aWNzX3BpY19kaXJlY3QgPSB7CiAJLnR5cGVuYW1lID0gIiBYSUNTICAgICAiLAogCS5zdGFydHVwID0geGljc19zdGFydHVwLApAQCAtNTAzLDcgKzM4NCw2IEBACiAJLnNldF9hZmZpbml0eSA9IHhpY3Nfc2V0X2FmZmluaXR5CiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGljc19waWNfbHBhciA9IHsKIAkudHlwZW5hbWUgPSAiIFhJQ1MgICAgICIsCiAJLnN0YXJ0dXAgPSB4aWNzX3N0YXJ0dXAsCkBAIC01MTMsNiArMzkzLDkgQEAKIAkuc2V0X2FmZmluaXR5ID0geGljc19zZXRfYWZmaW5pdHkKIH07CiAKKworLyogSW50ZXJmYWNlIHRvIGFyY2ggaXJxIGNvbnRyb2xsZXIgc3Vic3lzdGVtIGxheWVyICovCisKIC8qIFBvaW50cyB0byB0aGUgaXJxX2NoaXAgd2UncmUgYWN0dWFsbHkgdXNpbmcgKi8KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgKnhpY3NfaXJxX2NoaXA7CiAKQEAgLTUzMCw2ICs0MTMsOSBAQAogewogCXByX2RlYnVnKCJ4aWNzOiBtYXAgdmlycSAlZCwgaHdpcnEgMHglbHhcbiIsIHZpcnEsIGh3KTsKIAorCS8qIEluc2VydCB0aGUgaW50ZXJydXB0IG1hcHBpbmcgaW50byB0aGUgcmFkaXggdHJlZSBmb3IgZmFzdCBsb29rdXAgKi8KKwlpcnFfcmFkaXhfcmV2bWFwX2luc2VydCh4aWNzX2hvc3QsIHZpcnEsIGh3KTsKKwogCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgeGljc19pcnFfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKIAlyZXR1cm4gMDsKQEAgLTU2OSwxMCArNDU1LDE2OSBAQAogCWlycV9zZXRfZGVmYXVsdF9ob3N0KHhpY3NfaG9zdCk7CiB9CiAKKworLyogSW50ZXItcHJvY2Vzc29yIGludGVycnVwdCBzdXBwb3J0ICovCisKKyNpZmRlZiBDT05GSUdfU01QCisvKgorICogWElDUyBvbmx5IGhhcyBhIHNpbmdsZSBJUEksIHNvIGVuY29kZSB0aGUgbWVzc2FnZXMgcGVyIENQVQorICovCitzdHJ1Y3QgeGljc19pcGlfc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RhdGljIHN0cnVjdCB4aWNzX2lwaV9zdHJ1Y3QgeGljc19pcGlfbWVzc2FnZVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCitzdGF0aWMgaW5saW5lIHZvaWQgc21wX3hpY3NfZG9fbWVzc2FnZShpbnQgY3B1LCBpbnQgbXNnKQoreworCXNldF9iaXQobXNnLCAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKTsKKwltYigpOworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQlscGFyX3FpcnJfaW5mbyhjcHUsIElQSV9QUklPUklUWSk7CisJZWxzZQorCQlkaXJlY3RfcWlycl9pbmZvKGNwdSwgSVBJX1BSSU9SSVRZKTsKK30KKwordm9pZCBzbXBfeGljc19tZXNzYWdlX3Bhc3MoaW50IHRhcmdldCwgaW50IG1zZykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh0YXJnZXQgPCBOUl9DUFVTKSB7CisJCXNtcF94aWNzX2RvX21lc3NhZ2UodGFyZ2V0LCBtc2cpOworCX0gZWxzZSB7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQkJaWYgKHRhcmdldCA9PSBNU0dfQUxMX0JVVF9TRUxGCisJCQkgICAgJiYgaSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQkJY29udGludWU7CisJCQlzbXBfeGljc19kb19tZXNzYWdlKGksIG1zZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4aWNzX2lwaV9kaXNwYXRjaChpbnQgY3B1KQoreworCVdBUk5fT04oY3B1X2lzX29mZmxpbmUoY3B1KSk7CisKKwltYigpOwkvKiBvcmRlciBtbWlvIGNsZWFyaW5nIHFpcnIgKi8KKwl3aGlsZSAoeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUFBDX01TR19DQUxMX0ZVTkNUSU9OLAorCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgeworCQkJc21wX21lc3NhZ2VfcmVjdihQUENfTVNHX0NBTExfRlVOQ1RJT04pOworCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUFBDX01TR19SRVNDSEVEVUxFLAorCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgeworCQkJc21wX21lc3NhZ2VfcmVjdihQUENfTVNHX1JFU0NIRURVTEUpOworCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUFBDX01TR19DQUxMX0ZVTkNfU0lOR0xFLAorCQkJCSAgICAgICAmeGljc19pcGlfbWVzc2FnZVtjcHVdLnZhbHVlKSkgeworCQkJc21wX21lc3NhZ2VfcmVjdihQUENfTVNHX0NBTExfRlVOQ19TSU5HTEUpOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdHRVIpIHx8IGRlZmluZWQoQ09ORklHX0tFWEVDKQorCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBQQ19NU0dfREVCVUdHRVJfQlJFQUssCisJCQkJICAgICAgICZ4aWNzX2lwaV9tZXNzYWdlW2NwdV0udmFsdWUpKSB7CisJCQlzbXBfbWVzc2FnZV9yZWN2KFBQQ19NU0dfREVCVUdHRVJfQlJFQUspOworCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGljc19pcGlfYWN0aW9uX2RpcmVjdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWRpcmVjdF9xaXJyX2luZm8oY3B1LCAweGZmKTsKKworCXJldHVybiB4aWNzX2lwaV9kaXNwYXRjaChjcHUpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGljc19pcGlfYWN0aW9uX2xwYXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlscGFyX3FpcnJfaW5mbyhjcHUsIDB4ZmYpOworCisJcmV0dXJuIHhpY3NfaXBpX2Rpc3BhdGNoKGNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIHhpY3NfcmVxdWVzdF9pcGkodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXBpOworCWludCByYzsKKworCWlwaSA9IGlycV9jcmVhdGVfbWFwcGluZyh4aWNzX2hvc3QsIFhJQ1NfSVBJKTsKKwlCVUdfT04oaXBpID09IE5PX0lSUSk7CisKKwkvKgorCSAqIElQSXMgYXJlIG1hcmtlZCBJUlFGX0RJU0FCTEVEIGFzIHRoZXkgbXVzdCBydW4gd2l0aCBpcnFzCisJICogZGlzYWJsZWQKKwkgKi8KKwlzZXRfaXJxX2hhbmRsZXIoaXBpLCBoYW5kbGVfcGVyY3B1X2lycSk7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCisJCXJjID0gcmVxdWVzdF9pcnEoaXBpLCB4aWNzX2lwaV9hY3Rpb25fbHBhciwKKwkJCQlJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVLCAiSVBJIiwgTlVMTCk7CisJZWxzZQorCQlyYyA9IHJlcXVlc3RfaXJxKGlwaSwgeGljc19pcGlfYWN0aW9uX2RpcmVjdCwKKwkJCQlJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVLCAiSVBJIiwgTlVMTCk7CisJQlVHX09OKHJjKTsKK30KKworaW50IF9faW5pdCBzbXBfeGljc19wcm9iZSh2b2lkKQoreworCXhpY3NfcmVxdWVzdF9pcGkoKTsKKworCXJldHVybiBjcHVzX3dlaWdodChjcHVfcG9zc2libGVfbWFwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworCisvKiBJbml0aWFsaXphdGlvbiAqLworCitzdGF0aWMgdm9pZCB4aWNzX3VwZGF0ZV9pcnFfc2VydmVycyh2b2lkKQoreworCWludCBpLCBqOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyIGlsZW47CisJY29uc3QgdTMyICppcmVnLCAqaXNpemU7CisJdTMyIGhjcHVpZDsKKworCS8qIEZpbmQgdGhlIHNlcnZlciBudW1iZXJzIGZvciB0aGUgYm9vdCBjcHUuICovCisJbnAgPSBvZl9nZXRfY3B1X25vZGUoYm9vdF9jcHVpZCwgTlVMTCk7CisJQlVHX09OKCFucCk7CisKKwlpcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiwgJmlsZW4pOworCWlmICghaXJlZykgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwlpID0gaWxlbiAvIHNpemVvZihpbnQpOworCWhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCk7CisKKwkvKiBHbG9iYWwgaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0CisJICogZW50cnkgb2YgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIgcHJvcGVydHkuIEdldCB0aGUgbGFzdAorCSAqIGVudHJ5IGZvbSB0aGlzIHByb3BlcnR5IGZvciBjdXJyZW50IGJvb3QgY3B1IGlkIGFuZCB1c2UgaXQgYXMKKwkgKiBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIKKwkgKi8KKwlmb3IgKGogPSAwOyBqIDwgaTsgaiArPSAyKSB7CisJCWlmIChpcmVnW2pdID09IGhjcHVpZCkgeworCQkJZGVmYXVsdF9zZXJ2ZXIgPSBoY3B1aWQ7CisJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tqKzFdOworCQl9CisJfQorCisJLyogZ2V0IHRoZSBiaXQgc2l6ZSBvZiBzZXJ2ZXIgbnVtYmVycyAqLworCWlzaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGludGVycnVwdC1zZXJ2ZXIjLXNpemUiLCBOVUxMKTsKKwlpZiAoaXNpemUpCisJCWludGVycnVwdF9zZXJ2ZXJfc2l6ZSA9ICppc2l6ZTsKKworCW9mX25vZGVfcHV0KG5wKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IHhpY3NfbWFwX29uZV9jcHUoaW50IGh3X2lkLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAogCWludCBpOwogCiAJLyogVGhpcyBtYXkgbG9vayBncm9zcyBidXQgaXQncyBnb29kIGVub3VnaCBmb3Igbm93LCB3ZSBkb24ndCBxdWl0ZQpAQCAtNTg2LDExICs2MzEsNiBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotI2Vsc2UKLQlpZiAoaHdfaWQgIT0gMCkKLQkJcmV0dXJuOwotCXhpY3NfcGVyX2NwdVswXSA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgeGljc19pbml0X29uZV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCkBAIC02NTIsMTUgKzY5MiwxNyBAQAogCiAJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiUG93ZXJQQy1FeHRlcm5hbC1JbnRlcnJ1cHQtUHJlc2VudGF0aW9uIikgewogCQlmb3VuZCA9IDE7Ci0JCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkgeworCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJYnJlYWs7CisJCQl9CiAJCXhpY3NfaW5pdF9vbmVfbm9kZShucCwgJmluZHgpOwogCX0KIAlpZiAoZm91bmQgPT0gMCkKIAkJcmV0dXJuOwogCi0JeGljc19pbml0X2hvc3QoKTsKIAl4aWNzX3VwZGF0ZV9pcnFfc2VydmVycygpOworCXhpY3NfaW5pdF9ob3N0KCk7CiAKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkKIAkJcHBjX21kLmdldF9pcnEgPSB4aWNzX2dldF9pcnFfbHBhcjsKQEAgLTY3MiwzMCArNzE0LDMxIEBACiAJcHBjNjRfYm9vdF9tc2coMHgyMSwgIlhJQ1MgRG9uZSIpOwogfQogCisvKiBDcHUgc3RhcnR1cCwgc2h1dGRvd24sIGFuZCBob3RwbHVnICovCiAKLSNpZmRlZiBDT05GSUdfU01QCi12b2lkIHhpY3NfcmVxdWVzdF9JUElzKHZvaWQpCitzdGF0aWMgdm9pZCB4aWNzX3NldF9jcHVfcHJpb3JpdHkodW5zaWduZWQgY2hhciBjcHByKQogewotCXVuc2lnbmVkIGludCBpcGk7Ci0JaW50IHJjOwotCi0JaXBpID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHhpY3NfaG9zdCwgWElDU19JUEkpOwotCUJVR19PTihpcGkgPT0gTk9fSVJRKTsKLQotCS8qCi0JICogSVBJcyBhcmUgbWFya2VkIElSUUZfRElTQUJMRUQgYXMgdGhleSBtdXN0IHJ1biB3aXRoIGlycXMKLQkgKiBkaXNhYmxlZAotCSAqLwotCXNldF9pcnFfaGFuZGxlcihpcGksIGhhbmRsZV9wZXJjcHVfaXJxKTsKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkKLQkJcmMgPSByZXF1ZXN0X2lycShpcGksIHhpY3NfaXBpX2FjdGlvbl9scGFyLCBJUlFGX0RJU0FCTEVELAotCQkJCSJJUEkiLCBOVUxMKTsKKwkJbHBhcl9jcHByX2luZm8oY3Bwcik7CiAJZWxzZQotCQlyYyA9IHJlcXVlc3RfaXJxKGlwaSwgeGljc19pcGlfYWN0aW9uX2RpcmVjdCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkiSVBJIiwgTlVMTCk7Ci0JQlVHX09OKHJjKTsKKwkJZGlyZWN0X2NwcHJfaW5mbyhjcHByKTsKKwlpb3N5bmMoKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qIEhhdmUgdGhlIGNhbGxpbmcgcHJvY2Vzc29yIGpvaW4gb3IgbGVhdmUgdGhlIHNwZWNpZmllZCBnbG9iYWwgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHhpY3Nfc2V0X2NwdV9naXEodW5zaWduZWQgaW50IGdzZXJ2ZXIsIHVuc2lnbmVkIGludCBqb2luKQoreworCWludCBzdGF0dXMgPSBydGFzX3NldF9pbmRpY2F0b3JfZmFzdChHTE9CQUxfSU5URVJSVVBUX1FVRVVFLAorCQkoMVVMIDw8IGludGVycnVwdF9zZXJ2ZXJfc2l6ZSkgLSAxIC0gZ3NlcnZlciwgam9pbik7CisJV0FSTl9PTihzdGF0dXMgPCAwKTsKK30KKwordm9pZCB4aWNzX3NldHVwX2NwdSh2b2lkKQoreworCXhpY3Nfc2V0X2NwdV9wcmlvcml0eSgweGZmKTsKKworCXhpY3Nfc2V0X2NwdV9naXEoZGVmYXVsdF9kaXN0cmliX3NlcnZlciwgMSk7Cit9CiAKIHZvaWQgeGljc190ZWFyZG93bl9jcHUodm9pZCkKIHsKQEAgLTcwMyw5ICs3NDYsNyBAQAogCiAJeGljc19zZXRfY3B1X3ByaW9yaXR5KDApOwogCi0JLyoKLQkgKiBDbGVhciBJUEkKLQkgKi8KKwkvKiBDbGVhciBhbnkgcGVuZGluZyBJUEkgcmVxdWVzdCAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQogCQlscGFyX3FpcnJfaW5mbyhjcHUsIDB4ZmYpOwogCWVsc2UKQEAgLTcxNCwzNCArNzU1LDI4IEBACiAKIHZvaWQgeGljc19rZXhlY190ZWFyZG93bl9jcHUoaW50IHNlY29uZGFyeSkKIHsKLQl1bnNpZ25lZCBpbnQgaXBpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQogCXhpY3NfdGVhcmRvd25fY3B1KCk7CiAKIAkvKgotCSAqIHdlIG5lZWQgdG8gRU9JIHRoZSBJUEkKKwkgKiB3ZSB0YWtlIHRoZSBpcGkgaXJxIGJ1dCBhbmQgbmV2ZXIgcmV0dXJuIHNvIHdlCisJICogbmVlZCB0byBFT0kgdGhlIElQSSwgYnV0IHdhbnQgdG8gbGVhdmUgb3VyIHByaW9yaXR5IDAKIAkgKgotCSAqIHByb2JhYmx5IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBvdGhlciBpbnRlcnJ1cHRzIHRvbworCSAqIHNob3VsZCB3ZSBjaGVjayBhbGwgdGhlIG90aGVyIGludGVycnVwdHMgdG9vPwogCSAqIHNob3VsZCB3ZSBiZSBmbGFnZ2luZyBpZGxlIGxvb3AgaW5zdGVhZD8KIAkgKiBvciBjcmVhdGluZyBzb21lIHRhc2sgdG8gYmUgc2NoZWR1bGVkPwogCSAqLwogCi0JaXBpID0gaXJxX2ZpbmRfbWFwcGluZyh4aWNzX2hvc3QsIFhJQ1NfSVBJKTsKLQlpZiAoaXBpID09IFhJQ1NfSVJRX1NQVVJJT1VTKQotCQlyZXR1cm47Ci0JZGVzYyA9IGdldF9pcnFfZGVzYyhpcGkpOwotCWlmIChkZXNjLT5jaGlwICYmIGRlc2MtPmNoaXAtPmVvaSkKLQkJZGVzYy0+Y2hpcC0+ZW9pKGlwaSk7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCisJCWxwYXJfeGlycl9pbmZvX3NldCgoMHgwMCA8PCAyNCkgfCBYSUNTX0lQSSk7CisJZWxzZQorCQlkaXJlY3RfeGlycl9pbmZvX3NldCgoMHgwMCA8PCAyNCkgfCBYSUNTX0lQSSk7CiAKIAkvKgogCSAqIFNvbWUgbWFjaGluZXMgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBjcHUgaW4gdGhlIEdJUSwKIAkgKiBzbyBsZWF2ZSB0aGUgbWFzdGVyIGNwdSBpbiB0aGUgZ3JvdXAuCiAJICovCiAJaWYgKHNlY29uZGFyeSkKLQkJcnRhc19zZXRfaW5kaWNhdG9yX2Zhc3QoR0xPQkFMX0lOVEVSUlVQVF9RVUVVRSwKLQkJCQkgICAoMVVMIDw8IGludGVycnVwdF9zZXJ2ZXJfc2l6ZSkgLSAxIC0KLQkJCQkgICBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAwKTsKKwkJeGljc19zZXRfY3B1X2dpcShkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAwKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtNzQ5LDE3ICs3ODQsMTggQEAKIC8qIEludGVycnVwdHMgYXJlIGRpc2FibGVkLiAqLwogdm9pZCB4aWNzX21pZ3JhdGVfaXJxc19hd2F5KHZvaWQpCiB7Ci0JaW50IHN0YXR1czsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpLCBod19jcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBpbnQgaXJxLCB2aXJxOwogCisJLyogSWYgd2UgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBzZXJ2ZXIsIG1vdmUgdG8gdGhlIG5ldyAiYm9vdF9jcHVpZCIgKi8KKwlpZiAoaHdfY3B1ID09IGRlZmF1bHRfc2VydmVyKQorCQl4aWNzX3VwZGF0ZV9pcnFfc2VydmVycygpOworCiAJLyogUmVqZWN0IGFueSBpbnRlcnJ1cHQgdGhhdCB3YXMgcXVldWVkIHRvIHVzLi4uICovCiAJeGljc19zZXRfY3B1X3ByaW9yaXR5KDApOwogCi0JLyogcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBnbG9iYWwgaW50ZXJydXB0IHF1ZXVlICovCi0Jc3RhdHVzID0gcnRhc19zZXRfaW5kaWNhdG9yX2Zhc3QoR0xPQkFMX0lOVEVSUlVQVF9RVUVVRSwKLQkJKDFVTCA8PCBpbnRlcnJ1cHRfc2VydmVyX3NpemUpIC0gMSAtIGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXIsIDApOwotCVdBUk5fT04oc3RhdHVzIDwgMCk7CisJLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBnbG9iYWwgaW50ZXJydXB0IHF1ZXVlICovCisJeGljc19zZXRfY3B1X2dpcShkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAwKTsKIAogCS8qIEFsbG93IElQSXMgYWdhaW4uLi4gKi8KIAl4aWNzX3NldF9jcHVfcHJpb3JpdHkoREVGQVVMVF9QUklPUklUWSk7CkBAIC03NjcsNiArODAzLDcgQEAKIAlmb3JfZWFjaF9pcnEodmlycSkgewogCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJCWludCB4aWNzX3N0YXR1c1syXTsKKwkJaW50IHN0YXR1czsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkvKiBXZSBjYW50IHNldCBhZmZpbml0eSBvbiBJU0EgaW50ZXJydXB0cyAqLwpAQCAtNzkwLDkgKzgyNyw4IEBACiAKIAkJc3RhdHVzID0gcnRhc19jYWxsKGlibV9nZXRfeGl2ZSwgMSwgMywgeGljc19zdGF0dXMsIGlycSk7CiAJCWlmIChzdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWlncmF0ZV9pcnFzX2F3YXk6IGlycT0ldSAiCi0JCQkJCSJpYm0sZ2V0LXhpdmUgcmV0dXJucyAlZFxuIiwKLQkJCQkJdmlycSwgc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibSxnZXQteGl2ZSBpcnE9JXUgcmV0dXJucyAlZFxuIiwKKwkJCQkJX19mdW5jX18sIGlycSwgc3RhdHVzKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5oCmluZGV4IDFjNTMyMWEuLmQxZDVhODMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuaApAQCAtMTIsMjAgKzEyLDEyIEBACiAjaWZuZGVmIF9QT1dFUlBDX0tFUk5FTF9YSUNTX0gKICNkZWZpbmUgX1BPV0VSUENfS0VSTkVMX1hJQ1NfSAogCi0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLQogZXh0ZXJuIHZvaWQgeGljc19pbml0X0lSUSh2b2lkKTsKIGV4dGVybiB2b2lkIHhpY3Nfc2V0dXBfY3B1KHZvaWQpOwogZXh0ZXJuIHZvaWQgeGljc190ZWFyZG93bl9jcHUodm9pZCk7CiBleHRlcm4gdm9pZCB4aWNzX2tleGVjX3RlYXJkb3duX2NwdShpbnQgc2Vjb25kYXJ5KTsKLWV4dGVybiB2b2lkIHhpY3NfY2F1c2VfSVBJKGludCBjcHUpOwotZXh0ZXJuICB2b2lkIHhpY3NfcmVxdWVzdF9JUElzKHZvaWQpOwogZXh0ZXJuIHZvaWQgeGljc19taWdyYXRlX2lycXNfYXdheSh2b2lkKTsKLQotc3RydWN0IHhpY3NfaXBpX3N0cnVjdCB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCi1leHRlcm4gc3RydWN0IHhpY3NfaXBpX3N0cnVjdCB4aWNzX2lwaV9tZXNzYWdlW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CitleHRlcm4gaW50IHNtcF94aWNzX3Byb2JlKHZvaWQpOworZXh0ZXJuIHZvaWQgc21wX3hpY3NfbWVzc2FnZV9wYXNzKGludCB0YXJnZXQsIGludCBtc2cpOwogCiAjZW5kaWYgLyogX1BPV0VSUENfS0VSTkVMX1hJQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9LY29uZmlnCmluZGV4IDcyZmIzNWIuLjM5NjU4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L0tjb25maWcKQEAgLTYsMyArNiw5IEBACiAJYm9vbAogCWRlcGVuZHMgb24gUENJICYmIDR4eAogCWRlZmF1bHQgbgorCitjb25maWcgUFBDX01TSV9CSVRNQVAKKwlib29sCisJZGVwZW5kcyBvbiBQQ0lfTVNJCisJZGVmYXVsdCB5IGlmIE1QSUMKKwlkZWZhdWx0IHkgaWYgRlNMX1BDSQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggYTkwMDU0Yi4uYTQ0NzA5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogbXBpYy1tc2ktb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1waWNfbXNpLm8gbXBpY191M21zaS5vIG1waWNfcGFzZW1pX21zaS5vCiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubyAkKG1waWMtbXNpLW9iai15KQogZnNsLW1zaS1vYmotJChDT05GSUdfUENJX01TSSkJKz0gZnNsX21zaS5vCitvYmotJChDT05GSUdfUFBDX01TSV9CSVRNQVApCSs9IG1zaV9iaXRtYXAubwogCiBvYmotJChDT05GSUdfUFBDX01QQzEwNikJKz0gZ3JhY2tsZS5vCiBvYmotJChDT05GSUdfUFBDX0RDUl9OQVRJVkUpCSs9IGRjci1sb3cubwpAQCAtMTUsNiArMTYsNyBAQAogb2JqLSQoQ09ORklHX0ZTTF9QQ0kpCQkrPSBmc2xfcGNpLm8gJChmc2wtbXNpLW9iai15KQogb2JqLSQoQ09ORklHX0ZTTF9MQkMpCQkrPSBmc2xfbGJjLm8KIG9iai0kKENPTkZJR19GU0xfR1RNKQkJKz0gZnNsX2d0bS5vCitvYmotJChDT05GSUdfTVBDOHh4eF9HUElPKQkrPSBtcGM4eHh4X2dwaW8ubwogb2JqLSQoQ09ORklHX1JBUElESU8pCQkrPSBmc2xfcmlvLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCkBAIC0zNiwxNSArMzgsMTIgQEAKIG9iai0kKENPTkZJR180eHgpCQkrPSBwcGM0eHhfcGNpLm8KIGVuZGlmCiAKLSMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYwotaWZlcSAoJChBUkNIKSxwb3dlcnBjKQogb2JqLSQoQ09ORklHX0NQTSkJCSs9IGNwbV9jb21tb24ubwogb2JqLSQoQ09ORklHX0NQTTIpCQkrPSBjcG0yLm8gY3BtMl9waWMubwogb2JqLSQoQ09ORklHX1FVSUNDX0VOR0lORSkJKz0gY3BtX2NvbW1vbi5vCiBvYmotJChDT05GSUdfUFBDX0RDUikJCSs9IGRjci5vCiBvYmotJChDT05GSUdfOHh4KQkJKz0gbXBjOHh4X3BpYy5vIGNwbTEubwogb2JqLSQoQ09ORklHX1VDT0RFX1BBVENIKQkrPSBtaWNyb3BhdGNoLm8KLWVuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1NVU1BFTkQpLHkpCiBvYmotJChDT05GSUdfNnh4KQkJKz0gNnh4LXN1c3BlbmQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwppbmRleCA0YTA0ODIzLi40OTA0NzNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwpAQCAtNTQ2LDM3ICs1NDYsNDggQEAKIAlyZXR1cm4gISEoaW5fYmUxNigmaW9wLT5kYXQpICYgcGluX21hc2spOwogfQogCitzdGF0aWMgdm9pZCBfX2NwbTFfZ3BpbzE2X3NldChzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYywgdTE2IHBpbl9tYXNrLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCAqY3BtMV9nYyA9IHRvX2NwbTFfZ3BpbzE2X2NoaXAobW1fZ2MpOworCXN0cnVjdCBjcG1faW9wb3J0MTYgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CisKKwlpZiAodmFsdWUpCisJCWNwbTFfZ2MtPmNwZGF0YSB8PSBwaW5fbWFzazsKKwllbHNlCisJCWNwbTFfZ2MtPmNwZGF0YSAmPSB+cGluX21hc2s7CisKKwlvdXRfYmUxNigmaW9wLT5kYXQsIGNwbTFfZ2MtPmNwZGF0YSk7Cit9CisKIHN0YXRpYyB2b2lkIGNwbTFfZ3BpbzE2X3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CiAJc3RydWN0IGNwbTFfZ3BpbzE2X2NoaXAgKmNwbTFfZ2MgPSB0b19jcG0xX2dwaW8xNl9jaGlwKG1tX2djKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBwaW5fbWFzayA9IDEgPDwgKDE1IC0gZ3Bpbyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3BtMV9nYy0+bG9jaywgZmxhZ3MpOworCisJX19jcG0xX2dwaW8xNl9zZXQobW1fZ2MsIHBpbl9tYXNrLCB2YWx1ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY3BtMV9ncGlvMTZfZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBjcG0xX2dwaW8xNl9jaGlwICpjcG0xX2djID0gdG9fY3BtMV9ncGlvMTZfY2hpcChtbV9nYyk7CiAJc3RydWN0IGNwbV9pb3BvcnQxNiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBwaW5fbWFzayA9IDEgPDwgKDE1IC0gZ3Bpbyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3BtMV9nYy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHZhbHVlKQotCQljcG0xX2djLT5jcGRhdGEgfD0gcGluX21hc2s7Ci0JZWxzZQotCQljcG0xX2djLT5jcGRhdGEgJj0gfnBpbl9tYXNrOwotCi0Jb3V0X2JlMTYoJmlvcC0+ZGF0LCBjcG0xX2djLT5jcGRhdGEpOworCXNldGJpdHMxNigmaW9wLT5kaXIsIHBpbl9tYXNrKTsKKwlfX2NwbTFfZ3BpbzE2X3NldChtbV9nYywgcGluX21hc2ssIHZhbCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3BtMV9ncGlvMTZfZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBjcG1faW9wb3J0MTYgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7Ci0JdTE2IHBpbl9tYXNrOwotCi0JcGluX21hc2sgPSAxIDw8ICgxNSAtIGdwaW8pOwotCi0Jc2V0Yml0czE2KCZpb3AtPmRpciwgcGluX21hc2spOwotCi0JY3BtMV9ncGlvMTZfc2V0KGdjLCBncGlvLCB2YWwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01ODQsMTMgKzU5NSwxNyBAQAogc3RhdGljIGludCBjcG0xX2dwaW8xNl9kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQogewogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCAqY3BtMV9nYyA9IHRvX2NwbTFfZ3BpbzE2X2NoaXAobW1fZ2MpOwogCXN0cnVjdCBjcG1faW9wb3J0MTYgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7Ci0JdTE2IHBpbl9tYXNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHBpbl9tYXNrID0gMSA8PCAoMTUgLSBncGlvKTsKIAotCXBpbl9tYXNrID0gMSA8PCAoMTUgLSBncGlvKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3BtMV9nYy0+bG9jaywgZmxhZ3MpOwogCiAJY2xyYml0czE2KCZpb3AtPmRpciwgcGluX21hc2spOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3BtMV9nYy0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1NSwzNyArNjcwLDQ4IEBACiAJcmV0dXJuICEhKGluX2JlMzIoJmlvcC0+ZGF0KSAmIHBpbl9tYXNrKTsKIH0KIAorc3RhdGljIHZvaWQgX19jcG0xX2dwaW8zMl9zZXQoc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MsIHUzMiBwaW5fbWFzaywKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPSB0b19jcG0xX2dwaW8zMl9jaGlwKG1tX2djKTsKKwlzdHJ1Y3QgY3BtX2lvcG9ydDMyYiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKKworCWlmICh2YWx1ZSkKKwkJY3BtMV9nYy0+Y3BkYXRhIHw9IHBpbl9tYXNrOworCWVsc2UKKwkJY3BtMV9nYy0+Y3BkYXRhICY9IH5waW5fbWFzazsKKworCW91dF9iZTMyKCZpb3AtPmRhdCwgY3BtMV9nYy0+Y3BkYXRhKTsKK30KKwogc3RhdGljIHZvaWQgY3BtMV9ncGlvMzJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbHVlKQogewogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKIAlzdHJ1Y3QgY3BtMV9ncGlvMzJfY2hpcCAqY3BtMV9nYyA9IHRvX2NwbTFfZ3BpbzMyX2NoaXAobW1fZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHBpbl9tYXNrID0gMSA8PCAoMzEgLSBncGlvKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7CisKKwlfX2NwbTFfZ3BpbzMyX3NldChtbV9nYywgcGluX21hc2ssIHZhbHVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwbTFfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBjcG0xX2dwaW8zMl9kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPSB0b19jcG0xX2dwaW8zMl9jaGlwKG1tX2djKTsKIAlzdHJ1Y3QgY3BtX2lvcG9ydDMyYiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBwaW5fbWFzayA9IDEgPDwgKDMxIC0gZ3Bpbyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3BtMV9nYy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHZhbHVlKQotCQljcG0xX2djLT5jcGRhdGEgfD0gcGluX21hc2s7Ci0JZWxzZQotCQljcG0xX2djLT5jcGRhdGEgJj0gfnBpbl9tYXNrOwotCi0Jb3V0X2JlMzIoJmlvcC0+ZGF0LCBjcG0xX2djLT5jcGRhdGEpOworCXNldGJpdHMzMigmaW9wLT5kaXIsIHBpbl9tYXNrKTsKKwlfX2NwbTFfZ3BpbzMyX3NldChtbV9nYywgcGluX21hc2ssIHZhbCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3BtMV9ncGlvMzJfZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBjcG1faW9wb3J0MzJiIF9faW9tZW0gKmlvcCA9IG1tX2djLT5yZWdzOwotCXUzMiBwaW5fbWFzazsKLQotCXBpbl9tYXNrID0gMSA8PCAoMzEgLSBncGlvKTsKLQotCXNldGJpdHMzMigmaW9wLT5kaXIsIHBpbl9tYXNrKTsKLQotCWNwbTFfZ3BpbzMyX3NldChnYywgZ3BpbywgdmFsKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjkzLDEzICs3MTksMTcgQEAKIHN0YXRpYyBpbnQgY3BtMV9ncGlvMzJfZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKIHsKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPSB0b19jcG0xX2dwaW8zMl9jaGlwKG1tX2djKTsKIAlzdHJ1Y3QgY3BtX2lvcG9ydDMyYiBfX2lvbWVtICppb3AgPSBtbV9nYy0+cmVnczsKLQl1MzIgcGluX21hc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGluX21hc2sgPSAxIDw8ICgzMSAtIGdwaW8pOwogCi0JcGluX21hc2sgPSAxIDw8ICgzMSAtIGdwaW8pOworCXNwaW5fbG9ja19pcnFzYXZlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7CiAKIAljbHJiaXRzMzIoJmlvcC0+ZGlyLCBwaW5fbWFzayk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcG0xX2djLT5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYwppbmRleCA0MjJjOGZhLi4wNDk0ZWU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYwpAQCAtMTEsMTQgKzExLDE5IEBACiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2ZzbF9sYmMuaD4KIAotc3BpbmxvY2tfdCBmc2xfbGJjX2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChmc2xfbGJjX2xvY2spOwotCi1zdHJ1Y3QgZnNsX2xiY19yZWdzIF9faW9tZW0gKmZzbF9sYmNfcmVnczsKLUVYUE9SVF9TWU1CT0woZnNsX2xiY19yZWdzKTsKK3N0YXRpYyBzcGlubG9ja190IGZzbF9sYmNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGZzbF9sYmNfbG9jayk7CitzdGF0aWMgc3RydWN0IGZzbF9sYmNfcmVncyBfX2lvbWVtICpmc2xfbGJjX3JlZ3M7CiAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgKmNvbXBhdF9sYmNbXSA9IHsKIAkiZnNsLHBxMi1sb2NhbGJ1cyIsCkBAIC0xMjcsMyArMTMyLDQzIEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGZzbF91cG1fZmluZCk7CisKKy8qKgorICogZnNsX3VwbV9ydW5fcGF0dGVybiAtIGFjdHVhbGx5IHJ1biBhbiBVUE0gcGF0dGVybgorICogQHVwbToJcG9pbnRlciB0byB0aGUgZnNsX3VwbSBzdHJ1Y3R1cmUgb2J0YWluZWQgdmlhIGZzbF91cG1fZmluZAorICogQGlvX2Jhc2U6CXJlbWFwcGVkIHBvaW50ZXIgdG8gd2hlcmUgbWVtb3J5IGFjY2VzcyBzaG91bGQgaGFwcGVuCisgKiBAbWFyOglNQVIgcmVnaXN0ZXIgY29udGVudCBkdXJpbmcgcGF0dGVybiBleGVjdXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGR1bW15IHdyaXRlIHRvIHRoZSBtZW1vcnkgc3BlY2lmaWVkIGJ5IHRoZSBpb19iYXNlLAorICogdGh1cyBVUE0gcGF0dGVybiBhY3R1YWxseSBleGVjdXRlZC4gTm90ZSB0aGF0IG1hciB1c2FnZSBkZXBlbmRzIG9uIHRoZQorICogcHJlLXByb2dyYW1tZWQgQU1YIGJpdHMgaW4gdGhlIFVQTSBSQU0uCisgKi8KK2ludCBmc2xfdXBtX3J1bl9wYXR0ZXJuKHN0cnVjdCBmc2xfdXBtICp1cG0sIHZvaWQgX19pb21lbSAqaW9fYmFzZSwgdTMyIG1hcikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9sYmNfbG9jaywgZmxhZ3MpOworCisJb3V0X2JlMzIoJmZzbF9sYmNfcmVncy0+bWFyLCBtYXIgPDwgKDMyIC0gdXBtLT53aWR0aCkpOworCisJc3dpdGNoICh1cG0tPndpZHRoKSB7CisJY2FzZSA4OgorCQlvdXRfOChpb19iYXNlLCAweDApOworCQlicmVhazsKKwljYXNlIDE2OgorCQlvdXRfYmUxNihpb19iYXNlLCAweDApOworCQlicmVhazsKKwljYXNlIDMyOgorCQlvdXRfYmUzMihpb19iYXNlLCAweDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc2xfbGJjX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGZzbF91cG1fcnVuX3BhdHRlcm4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwppbmRleCAyYzUxODdjLi5mMjVjZTgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwpAQCAtMTQsNyArMTQsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CkBAIC02Nyw5NSArNjYsMjIgQEAKIAkubWFwID0gZnNsX21zaV9ob3N0X21hcCwKIH07CiAKLXN0YXRpYyBpcnFfaHdfbnVtYmVyX3QgZnNsX21zaV9hbGxvY19od2lycXMoc3RydWN0IGZzbF9tc2kgKm1zaSwgaW50IG51bSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBvcmRlciA9IGdldF9jb3VudF9vcmRlcihudW0pOwotCWludCBvZmZzZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNpLT5iaXRtYXBfbG9jaywgZmxhZ3MpOwotCi0Jb2Zmc2V0ID0gYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24obXNpLT5mc2xfbXNpX2JpdG1hcCwKLQkJCQkJTlJfTVNJX0lSUVMsIG9yZGVyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zaS0+Yml0bWFwX2xvY2ssIGZsYWdzKTsKLQotCXByX2RlYnVnKCIlczogYWxsb2NhdGVkIDB4JXggKDJeJWQpIGF0IG9mZnNldCAweCV4XG4iLAotCQlfX2Z1bmNfXywgbnVtLCBvcmRlciwgb2Zmc2V0KTsKLQotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9tc2lfZnJlZV9od2lycXMoc3RydWN0IGZzbF9tc2kgKm1zaSwgaW50IG9mZnNldCwgaW50IG51bSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBvcmRlciA9IGdldF9jb3VudF9vcmRlcihudW0pOwotCi0JcHJfZGVidWcoIiVzOiBmcmVlaW5nIDB4JXggKDJeJWQpIGF0IG9mZnNldCAweCV4XG4iLAotCQlfX2Z1bmNfXywgbnVtLCBvcmRlciwgb2Zmc2V0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtc2ktPmJpdG1hcF9sb2NrLCBmbGFncyk7Ci0JYml0bWFwX3JlbGVhc2VfcmVnaW9uKG1zaS0+ZnNsX21zaV9iaXRtYXAsIG9mZnNldCwgb3JkZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zaS0+Yml0bWFwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBmc2xfbXNpX2ZyZWVfZHRfaHdpcnFzKHN0cnVjdCBmc2xfbXNpICptc2kpCi17Ci0JaW50IGk7Ci0JaW50IGxlbjsKLQljb25zdCB1MzIgKnA7Ci0KLQliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKG1zaS0+ZnNsX21zaV9iaXRtYXAsIDAsCi0JCSAgICAgICBnZXRfY291bnRfb3JkZXIoTlJfTVNJX0lSUVMpKTsKLQotCXAgPSBvZl9nZXRfcHJvcGVydHkobXNpLT5vZl9ub2RlLCAibXNpLWF2YWlsYWJsZS1yYW5nZXMiLCAmbGVuKTsKLQotCWlmICghcCkgewotCQkvKiBObyBtc2ktYXZhaWxhYmxlLXJhbmdlcyBwcm9wZXJ0eSwKLQkJICogQWxsIHRoZSAyNTYgTVNJIGludGVycnVwdHMgY2FuIGJlIHVzZWQKLQkJICovCi0JCWZzbF9tc2lfZnJlZV9od2lycXMobXNpLCAwLCAweDEwMCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICgobGVuICUgKDIgKiBzaXplb2YodTMyKSkpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZnNsX21zaTogTWFsZm9ybWVkIG1zaS1hdmFpbGFibGUtcmFuZ2VzICIKLQkJICAgICAgICJwcm9wZXJ0eSBvbiAlc1xuIiwgbXNpLT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBGb3JtYXQgaXM6ICg8dTMyIHN0YXJ0PiA8dTMyIGNvdW50PikrICovCi0JbGVuIC89IDIgKiBzaXplb2YodTMyKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIHAgKz0gMikKLQkJZnNsX21zaV9mcmVlX2h3aXJxcyhtc2ksICpwLCAqKHAgKyAxKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmc2xfbXNpX2luaXRfYWxsb2NhdG9yKHN0cnVjdCBmc2xfbXNpICptc2lfZGF0YSkKIHsKIAlpbnQgcmM7Ci0JaW50IHNpemUgPSBCSVRTX1RPX0xPTkdTKE5SX01TSV9JUlFTKSAqIHNpemVvZih1MzIpOwogCi0JbXNpX2RhdGEtPmZzbF9tc2lfYml0bWFwID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlyYyA9IG1zaV9iaXRtYXBfYWxsb2MoJm1zaV9kYXRhLT5iaXRtYXAsIE5SX01TSV9JUlFTLAorCQkJICAgICAgbXNpX2RhdGEtPmlycWhvc3QtPm9mX25vZGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCi0JaWYgKG1zaV9kYXRhLT5mc2xfbXNpX2JpdG1hcCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCIlczogRU5PTUVNIGFsbG9jYXRpbmcgYWxsb2NhdG9yIGJpdG1hcCFcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKKwlyYyA9IG1zaV9iaXRtYXBfcmVzZXJ2ZV9kdF9od2lycXMoJm1zaV9kYXRhLT5iaXRtYXApOworCWlmIChyYyA8IDApIHsKKwkJbXNpX2JpdG1hcF9mcmVlKCZtc2lfZGF0YS0+Yml0bWFwKTsKKwkJcmV0dXJuIHJjOwogCX0KIAotCXJjID0gZnNsX21zaV9mcmVlX2R0X2h3aXJxcyhtc2lfZGF0YSk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dF9mcmVlOwotCiAJcmV0dXJuIDA7Ci1vdXRfZnJlZToKLQlrZnJlZShtc2lfZGF0YS0+ZnNsX21zaV9iaXRtYXApOwotCi0JbXNpX2RhdGEtPmZzbF9tc2lfYml0bWFwID0gTlVMTDsKLQlyZXR1cm4gcmM7Ci0KIH0KIAogc3RhdGljIGludCBmc2xfbXNpX2NoZWNrX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG52ZWMsIGludCB0eXBlKQpAQCAtMTc1LDcgKzEwMSw4IEBACiAJCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKIAkJCWNvbnRpbnVlOwogCQlzZXRfaXJxX21zaShlbnRyeS0+aXJxLCBOVUxMKTsKLQkJZnNsX21zaV9mcmVlX2h3aXJxcyhtc2lfZGF0YSwgdmlycV90b19odyhlbnRyeS0+aXJxKSwgMSk7CisJCW1zaV9iaXRtYXBfZnJlZV9od2lycXMoJm1zaV9kYXRhLT5iaXRtYXAsCisJCQkJICAgICAgIHZpcnFfdG9faHcoZW50cnktPmlycSksIDEpOwogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGVudHJ5LT5pcnEpOwogCX0KIApAQCAtMTk3LDE1ICsxMjQsMTQgQEAKIAogc3RhdGljIGludCBmc2xfc2V0dXBfbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKIHsKLQlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7Ci0JaW50IHJjOworCWludCByYywgaHdpcnE7CiAJdW5zaWduZWQgaW50IHZpcnE7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJc3RydWN0IGZzbF9tc2kgKm1zaV9kYXRhID0gZnNsX21zaTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZwZGV2LT5tc2lfbGlzdCwgbGlzdCkgewotCQlod2lycSA9IGZzbF9tc2lfYWxsb2NfaHdpcnFzKG1zaV9kYXRhLCAxKTsKKwkJaHdpcnEgPSBtc2lfYml0bWFwX2FsbG9jX2h3aXJxcygmbXNpX2RhdGEtPmJpdG1hcCwgMSk7CiAJCWlmIChod2lycSA8IDApIHsKIAkJCXJjID0gaHdpcnE7CiAJCQlwcl9kZWJ1ZygiJXM6IGZhaWwgYWxsb2NhdGluZyBtc2kgaW50ZXJydXB0XG4iLApAQCAtMjE2LDkgKzE0Miw5IEBACiAJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcobXNpX2RhdGEtPmlycWhvc3QsIGh3aXJxKTsKIAogCQlpZiAodmlycSA9PSBOT19JUlEpIHsKLQkJCXByX2RlYnVnKCIlczogZmFpbCBtYXBwaW5nIGh3aXJxIDB4JWx4XG4iLAorCQkJcHJfZGVidWcoIiVzOiBmYWlsIG1hcHBpbmcgaHdpcnEgMHgleFxuIiwKIAkJCQkJX19mdW5jX18sIGh3aXJxKTsKLQkJCWZzbF9tc2lfZnJlZV9od2lycXMobXNpX2RhdGEsIGh3aXJxLCAxKTsKKwkJCW1zaV9iaXRtYXBfZnJlZV9od2lycXMoJm1zaV9kYXRhLT5iaXRtYXAsIGh3aXJxLCAxKTsKIAkJCXJjID0gLUVOT1NQQzsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KQEAgLTMxNywxNCArMjQzLDExIEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCW1zaS0+b2Zfbm9kZSA9IG9mX25vZGVfZ2V0KGRldi0+bm9kZSk7CisJbXNpLT5pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3QoZGV2LT5ub2RlLCBJUlFfSE9TVF9NQVBfTElORUFSLAorCQkJCSAgICAgIE5SX01TSV9JUlFTLCAmZnNsX21zaV9ob3N0X29wcywgMCk7CiAKLQltc2ktPmlycWhvc3QgPSBpcnFfYWxsb2NfaG9zdChvZl9ub2RlX2dldChkZXYtPm5vZGUpLAotCQkJCUlSUV9IT1NUX01BUF9MSU5FQVIsCi0JCQkJTlJfTVNJX0lSUVMsICZmc2xfbXNpX2hvc3Rfb3BzLCAwKTsKIAlpZiAobXNpLT5pcnFob3N0ID09IE5VTEwpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJObyBtZW1vcnkgZm9yIE1TSSBpcnFob3N0XG4iKTsKLQkJb2Zfbm9kZV9wdXQoZGV2LT5ub2RlKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaAppbmRleCBhNjUzNDY4Li4zMzFjN2U3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaApAQCAtMTMsNiArMTMsOCBAQAogI2lmbmRlZiBfUE9XRVJQQ19TWVNERVZfRlNMX01TSV9ICiAjZGVmaW5lIF9QT1dFUlBDX1NZU0RFVl9GU0xfTVNJX0gKIAorI2luY2x1ZGUgPGFzbS9tc2lfYml0bWFwLmg+CisKICNkZWZpbmUgTlJfTVNJX1JFRwkJOAogI2RlZmluZSBJUlFTX1BFUl9NU0lfUkVHCTMyCiAjZGVmaW5lIE5SX01TSV9JUlFTCShOUl9NU0lfUkVHICogSVJRU19QRVJfTVNJX1JFRykKQEAgLTIyLDkgKzI0LDYgQEAKICNkZWZpbmUgRlNMX1BJQ19JUF9JUElDCTB4MDAwMDAwMDIKIAogc3RydWN0IGZzbF9tc2kgewotCS8qIERldmljZSBub2RlIG9mIHRoZSBNU0kgaW50ZXJydXB0Ki8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci0KIAlzdHJ1Y3QgaXJxX2hvc3QgKmlycWhvc3Q7CiAKIAl1bnNpZ25lZCBsb25nIGNhc2NhZGVfaXJxOwpAQCAtMzQsOCArMzMsNyBAQAogCXZvaWQgX19pb21lbSAqbXNpX3JlZ3M7CiAJdTMyIGZlYXR1cmU7CiAKLQl1bnNpZ25lZCBsb25nICpmc2xfbXNpX2JpdG1hcDsKLQlzcGlubG9ja190IGJpdG1hcF9sb2NrOworCXN0cnVjdCBtc2lfYml0bWFwIGJpdG1hcDsKIH07CiAKICNlbmRpZiAvKiBfUE9XRVJQQ19TWVNERVZfRlNMX01TSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IDYxZTZkNzcuLjViMjY0ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIE1QQzg1eHgvODZ4eCBQQ0kvUENJRSBzdXBwb3J0IHJvdXRpbmcuCisgKiBNUEM4M3h4Lzg1eHgvODZ4eCBQQ0kvUENJRSBzdXBwb3J0IHJvdXRpbmcuCiAgKgotICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICogQ29weXJpZ2h0IDIwMDcsMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCiAgKgogICogSW5pdGlhbCBhdXRob3I6IFhpYW5naHVhIFhpYW8gPHgueGlhb0BmcmVlc2NhbGUuY29tPgogICogUmVjb2RlOiBaSEFORyBXRUkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgpAQCAtMjUxLDIwICsyNTEsNDcgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODYxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDXzg1eHggfHwgQ09ORklHX1BQQ184Nnh4ICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfODN4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfODN4eCkgfHwgZGVmaW5lZChDT05GSUdfUFBDX01QQzUxMngpCiBpbnQgX19pbml0IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgcnNyY19yZWc7CisJc3RydWN0IHJlc291cmNlIHJzcmNfY2ZnOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOwotCWludCBwcmltYXJ5ID0gMSwgaGFzX2FkZHJlc3MgPSAwOwotCXBoeXNfYWRkcl90IGltbXIgPSBnZXRfaW1tcmJhc2UoKTsKKwlpbnQgcHJpbWFyeTsKIAogCXByX2RlYnVnKCJBZGRpbmcgUENJIGhvc3QgYnJpZGdlICVzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAKIAkvKiBGZXRjaCBob3N0IGJyaWRnZSByZWdpc3RlcnMgYWRkcmVzcyAqLwotCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyY19yZWcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBwY2kgcmVnaXN0ZXIgYmFzZSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoJnJzcmNfY2ZnLCAwLCBzaXplb2YocnNyY19jZmcpKTsKKworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMSwgJnJzcmNfY2ZnKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiTm8gcGNpIGNvbmZpZyByZWdpc3RlciBiYXNlIGluIGRldiB0cmVlLCAiCisJCQkidXNpbmcgZGVmYXVsdFxuIik7CisJCS8qCisJCSAqIE1QQzgzeHggc3VwcG9ydHMgdXAgdG8gdHdvIGhvc3QgY29udHJvbGxlcnMKKwkJICogCW9uZSBhdCAweDg1MDAgaGFzIGNvbmZpZyBzcGFjZSByZWdpc3RlcnMgYXQgMHg4MzAwCisJCSAqIAlvbmUgYXQgMHg4NjAwIGhhcyBjb25maWcgc3BhY2UgcmVnaXN0ZXJzIGF0IDB4ODM4MAorCQkgKi8KKwkJaWYgKChyc3JjX3JlZy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODUwMCkKKwkJCXJzcmNfY2ZnLnN0YXJ0ID0gKHJzcmNfcmVnLnN0YXJ0ICYgMHhmZmYwMDAwMCkgKyAweDgzMDA7CisJCWVsc2UgaWYgKChyc3JjX3JlZy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODYwMCkKKwkJCXJzcmNfY2ZnLnN0YXJ0ID0gKHJzcmNfcmVnLnN0YXJ0ICYgMHhmZmYwMDAwMCkgKyAweDgzODA7CisJfQorCS8qCisJICogQ29udHJvbGxlciBhdCBvZmZzZXQgMHg4NTAwIGlzIHByaW1hcnkKKwkgKi8KKwlpZiAoKHJzcmNfcmVnLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NTAwKQorCQlwcmltYXJ5ID0gMTsKKwllbHNlCisJCXByaW1hcnkgPSAwOwogCiAJLyogR2V0IGJ1cyByYW5nZSBpZiBhbnkgKi8KIAlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CkBAIC0yODEsMjIgKzMwOCwxMSBAQAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAotCS8qIE1QQzgzeHggc3VwcG9ydHMgdXAgdG8gdHdvIGhvc3QgY29udHJvbGxlcnMgb25lIGF0IDB4ODUwMCBmcm9tIGltbXJiYXIKLQkgKiB0aGUgb3RoZXIgYXQgMHg4NjAwLCB3ZSBjb25zaWRlciB0aGUgMHg4NTAwIHRoZSBwcmltYXJ5IGNvbnRyb2xsZXIKLQkgKi8KLQkvKiBQQ0kgMSAqLwotCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODUwMCkgewotCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODMwMCwgaW1tciArIDB4ODMwNCwgMCk7Ci0JfQotCS8qIFBDSSAyICovCi0JaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7Ci0JCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0LCAwKTsKLQkJcHJpbWFyeSA9IDA7Ci0JfQorCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjX2NmZy5zdGFydCwgcnNyY19jZmcuc3RhcnQgKyA0LCAwKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1QQzgzeHggUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgorCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIEZTTCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCiAJICAgICAgICJGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcnNyY19yZWcuc3RhcnQsIGhvc2UtPmZpcnN0X2J1c25vLAogCSAgICAgICBob3NlLT5sYXN0X2J1c25vKTsKIAogCXByX2RlYnVnKCIgLT5Ib3NlIGF0IDB4JXAsIGNmZ19hZGRyPTB4JXAsY2ZnX2RhdGE9MHglcFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKaW5kZXggMjE0Mzg4ZS4uMDFiODg0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKQEAgLTQxMiw1MyArNDEyLDYgQEAKIAogYXJjaF9pbml0Y2FsbChnZmFyX29mX2luaXQpOwogCi0KLSNpZmRlZiBDT05GSUdfUFBDXzgzeHgKLXN0YXRpYyBpbnQgX19pbml0IG1wYzgzeHhfd2R0X2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKLQl1MzIgZnJlcSA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQlpbnQgcmV0OwotCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAid2F0Y2hkb2ciLCAibXBjODN4eF93ZHQiKTsKLQotCWlmICghbnApIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBub2RldjsKLQl9Ci0KLQltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7Ci0KLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJtcGM4M3h4X3dkdCIsIDAsICZyLCAxKTsKLQlpZiAoSVNfRVJSKGRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihkZXYpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZGV2LCAmZnJlcSwgc2l6ZW9mKGZyZXEpKTsKLQlpZiAocmV0KQotCQlnb3RvIHVucmVnOwotCi0Jb2Zfbm9kZV9wdXQobnApOwotCXJldHVybiAwOwotCi11bnJlZzoKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotZXJyOgotCW9mX25vZGVfcHV0KG5wKTsKLW5vZGV2OgotCXJldHVybiByZXQ7Ci19Ci0KLWFyY2hfaW5pdGNhbGwobXBjODN4eF93ZHRfaW5pdCk7Ci0jZW5kaWYKLQogc3RhdGljIGVudW0gZnNsX3VzYjJfcGh5X21vZGVzIGRldGVybWluZV91c2JfcGh5KGNvbnN0IGNoYXIgKnBoeV90eXBlKQogewogCWlmICghcGh5X3R5cGUpCkBAIC03NjcsNDIgKzcyMCw2IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVUpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVVfTU9EVUxFKQotc3RydWN0IHBsYXRmb3JtX2RpdV9kYXRhX29wcyBkaXVfb3BzID0gewotCS5kaXVfc2l6ZSA9IDEyODAgKiAxMDI0ICogNCwJLyogZGVmYXVsdCBvbmUgMTI4MHgxMDI0IGJ1ZmZlciAqLwotfTsKK3N0cnVjdCBwbGF0Zm9ybV9kaXVfZGF0YV9vcHMgZGl1X29wczsKIEVYUE9SVF9TWU1CT0woZGl1X29wcyk7Ci0KLWludCBfX2luaXQgcHJlYWxsb2NhdGVfZGl1X3ZpZGVvbWVtb3J5KHZvaWQpCi17Ci0JcHJfZGVidWcoImRpdV9zaXplPSVsdVxuIiwgZGl1X29wcy5kaXVfc2l6ZSk7Ci0KLQlkaXVfb3BzLmRpdV9tZW0gPSBfX2FsbG9jX2Jvb3RtZW0oZGl1X29wcy5kaXVfc2l6ZSwgOCwgMCk7Ci0JaWYgKCFkaXVfb3BzLmRpdV9tZW0pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmc2wtZGl1OiBjYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotCQkJZGl1X29wcy5kaXVfc2l6ZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXByX2RlYnVnKCJkaXVfbWVtPSVwXG4iLCBkaXVfb3BzLmRpdV9tZW0pOwotCi0JcmhfaW5pdCgmZGl1X29wcy5kaXVfcmhfaW5mbywgNDA5NiwgQVJSQVlfU0laRShkaXVfb3BzLmRpdV9yaF9ibG9jayksCi0JCWRpdV9vcHMuZGl1X3JoX2Jsb2NrKTsKLQlyZXR1cm4gcmhfYXR0YWNoX3JlZ2lvbigmZGl1X29wcy5kaXVfcmhfaW5mbywKLQkJCQkodW5zaWduZWQgbG9uZykgZGl1X29wcy5kaXVfbWVtLAotCQkJCWRpdV9vcHMuZGl1X3NpemUpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9kaXVmYihjaGFyICpwKQotewotCWlmICghcCkKLQkJcmV0dXJuIDE7Ci0KLQlkaXVfb3BzLmRpdV9zaXplID0gX0FMSUdOX1VQKG1lbXBhcnNlKHAsICZwKSwgOCk7Ci0KLQlwcl9kZWJ1ZygiZGl1X3NpemU9JWx1XG4iLCBkaXVfb3BzLmRpdV9zaXplKTsKLQotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oImRpdWZiIiwgZWFybHlfcGFyc2VfZGl1ZmIpOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKaW5kZXggMDI0Mjk5OC4uNjBmN2YyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKQEAgLTIwLDE0ICsyMCw3IEBACiBleHRlcm4gdm9pZCBmc2xfcnN0Y3JfcmVzdGFydChjaGFyICpjbWQpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfRlNMX0RJVSkgfHwgZGVmaW5lZChDT05GSUdfRkJfRlNMX0RJVV9NT0RVTEUpCi0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGFzbS9yaGVhcC5oPgogc3RydWN0IHBsYXRmb3JtX2RpdV9kYXRhX29wcyB7Ci0JcmhfYmxvY2tfdCBkaXVfcmhfYmxvY2tbMTZdOwotCXJoX2luZm9fdCBkaXVfcmhfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGRpdV9zaXplOwotCXZvaWQgKmRpdV9tZW07Ci0KIAl1bnNpZ25lZCBpbnQgKCpnZXRfcGl4ZWxfZm9ybWF0KSAodW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsLAogCQlpbnQgbW9uaXRvcl9wb3J0KTsKIAl2b2lkICgqc2V0X2dhbW1hX3RhYmxlKSAoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqZ2FtbWFfdGFibGVfYmFzZSk7CkBAIC0zOCw3ICszMSw2IEBACiB9OwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RpdV9kYXRhX29wcyBkaXVfb3BzOwotaW50IF9faW5pdCBwcmVhbGxvY2F0ZV9kaXVfdmlkZW9tZW1vcnkodm9pZCk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDNlYWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIEdQSU9zIG9uIE1QQzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjZGVmaW5lIE1QQzhYWFhfR1BJT19QSU5TCTMyCisKKyNkZWZpbmUgR1BJT19ESVIJCTB4MDAKKyNkZWZpbmUgR1BJT19PRFIJCTB4MDQKKyNkZWZpbmUgR1BJT19EQVQJCTB4MDgKKyNkZWZpbmUgR1BJT19JRVIJCTB4MGMKKyNkZWZpbmUgR1BJT19JTVIJCTB4MTAKKyNkZWZpbmUgR1BJT19JQ1IJCTB4MTQKKworc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qCisJICogc2hhZG93ZWQgZGF0YSByZWdpc3RlciB0byBiZSBhYmxlIHRvIGNsZWFyL3NldCBvdXRwdXQgcGlucyBpbgorCSAqIG9wZW4gZHJhaW4gbW9kZSBzYWZlbHkKKwkgKi8KKwl1MzIgZGF0YTsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1wYzh4eHhfZ3BpbzJtYXNrKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiAxdSA8PCAoTVBDOFhYWF9HUElPX1BJTlMgLSAxIC0gZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICoKK3RvX21wYzh4eHhfZ3Bpb19jaGlwKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tKQoreworCXJldHVybiBjb250YWluZXJfb2YobW0sIHN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCwgbW1fZ2MpOworfQorCitzdGF0aWMgdm9pZCBtcGM4eHh4X2dwaW9fc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKKworCW1wYzh4eHhfZ2MtPmRhdGEgPSBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKworCXJldHVybiBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpICYgbXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQltcGM4eHh4X2djLT5kYXRhIHw9IG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOworCWVsc2UKKwkJbXBjOHh4eF9nYy0+ZGF0YSAmPSB+bXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7CisKKwlvdXRfYmUzMihtbS0+cmVncyArIEdQSU9fREFULCBtcGM4eHh4X2djLT5kYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBtcGM4eHh4X2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19ESVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltcGM4eHh4X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fRElSLCBtcGM4eHh4X2dwaW8ybWFzayhncGlvKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1wYzh4eHhfYWRkX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2M7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7CisJc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2M7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisJaW50IHJldDsKKworCW1wYzh4eHhfZ2MgPSBremFsbG9jKHNpemVvZigqbXBjOHh4eF9nYyksIEdGUF9LRVJORUwpOworCWlmICghbXBjOHh4eF9nYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbXBjOHh4eF9nYy0+bG9jayk7CisKKwltbV9nYyA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKwlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7CisJZ2MgPSAmb2ZfZ2MtPmdjOworCisJbW1fZ2MtPnNhdmVfcmVncyA9IG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3M7CisJb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOworCWdjLT5uZ3BpbyA9IE1QQzhYWFhfR1BJT19QSU5TOworCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBtcGM4eHh4X2dwaW9fZGlyX2luOworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjOHh4eF9ncGlvX2Rpcl9vdXQ7CisJZ2MtPmdldCA9IG1wYzh4eHhfZ3Bpb19nZXQ7CisJZ2MtPnNldCA9IG1wYzh4eHhfZ3Bpb19zZXQ7CisKKwlyZXQgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIG1tX2djKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldHVybjsKKworZXJyOgorCXByX2VycigiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJICAgICAgIG5wLT5mdWxsX25hbWUsIHJldCk7CisJa2ZyZWUobXBjOHh4eF9nYyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzh4eHhfYWRkX2dwaW9jaGlwcyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJmc2wsbXBjODM0OS1ncGlvIikKKwkJbXBjOHh4eF9hZGRfY29udHJvbGxlcihucCk7CisKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJmc2wsbXBjODU3Mi1ncGlvIikKKwkJbXBjOHh4eF9hZGRfY29udHJvbGxlcihucCk7CisKKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJmc2wsbXBjODYxMC1ncGlvIikKKwkJbXBjOHh4eF9hZGRfY29udHJvbGxlcihucCk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXBjOHh4eF9hZGRfZ3Bpb2NoaXBzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmgKaW5kZXggZmJmOGEyNi4uNjIwOWM2MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmgKQEAgLTE0LDggKzE0LDYgQEAKICNpZmRlZiBDT05GSUdfUENJX01TSQogZXh0ZXJuIHZvaWQgbXBpY19tc2lfcmVzZXJ2ZV9od2lycShzdHJ1Y3QgbXBpYyAqbXBpYywgaXJxX2h3X251bWJlcl90IGh3aXJxKTsKIGV4dGVybiBpbnQgbXBpY19tc2lfaW5pdF9hbGxvY2F0b3Ioc3RydWN0IG1waWMgKm1waWMpOwotZXh0ZXJuIGlycV9od19udW1iZXJfdCBtcGljX21zaV9hbGxvY19od2lycXMoc3RydWN0IG1waWMgKm1waWMsIGludCBudW0pOwotZXh0ZXJuIHZvaWQgbXBpY19tc2lfZnJlZV9od2lycXMoc3RydWN0IG1waWMgKm1waWMsIGludCBvZmZzZXQsIGludCBudW0pOwogZXh0ZXJuIGludCBtcGljX3UzbXNpX2luaXQoc3RydWN0IG1waWMgKm1waWMpOwogZXh0ZXJuIGludCBtcGljX3Bhc2VtaV9tc2lfaW5pdChzdHJ1Y3QgbXBpYyAqbXBpYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX21zaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX21zaS5jCmluZGV4IGRlM2U1ZTguLjFkNDRlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfbXNpLmMKQEAgLTE1LDU5ICsxNSwxNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL21zaV9iaXRtYXAuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9tcGljLmg+CiAKLXN0YXRpYyB2b2lkIF9fbXBpY19tc2lfcmVzZXJ2ZV9od2lycShzdHJ1Y3QgbXBpYyAqbXBpYywgaXJxX2h3X251bWJlcl90IGh3aXJxKQotewotCXByX2RlYnVnKCJtcGljOiByZXNlcnZpbmcgaHdpcnEgMHglbHhcbiIsIGh3aXJxKTsKLQliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKG1waWMtPmh3aXJxX2JpdG1hcCwgaHdpcnEsIDApOwotfQotCiB2b2lkIG1waWNfbXNpX3Jlc2VydmVfaHdpcnEoc3RydWN0IG1waWMgKm1waWMsIGlycV9od19udW1iZXJfdCBod2lycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJLyogVGhlIG1waWMgY2FsbHMgdGhpcyBldmVuIHdoZW4gdGhlcmUgaXMgbm8gYWxsb2NhdG9yIHNldHVwICovCi0JaWYgKCFtcGljLT5od2lycV9iaXRtYXApCisJaWYgKCFtcGljLT5tc2lfYml0bWFwLmJpdG1hcCkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1waWMtPmJpdG1hcF9sb2NrLCBmbGFncyk7Ci0JX19tcGljX21zaV9yZXNlcnZlX2h3aXJxKG1waWMsIGh3aXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGljLT5iaXRtYXBfbG9jaywgZmxhZ3MpOwotfQotCi1pcnFfaHdfbnVtYmVyX3QgbXBpY19tc2lfYWxsb2NfaHdpcnFzKHN0cnVjdCBtcGljICptcGljLCBpbnQgbnVtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG9mZnNldCwgb3JkZXIgPSBnZXRfY291bnRfb3JkZXIobnVtKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcGljLT5iaXRtYXBfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogVGhpcyBpcyBmYXN0LCBidXQgc3RyaWN0ZXIgdGhhbiB3ZSBuZWVkLiBXZSBtaWdodCB3YW50IHRvIGFkZAotCSAqIGEgZmFsbGJhY2sgcm91dGluZSB3aGljaCBkb2VzIGEgbGluZWFyIHNlYXJjaCB3aXRoIG5vIGFsaWdubWVudC4KLQkgKi8KLQlvZmZzZXQgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtcGljLT5od2lycV9iaXRtYXAsIG1waWMtPmlycV9jb3VudCwKLQkJCQkJIG9yZGVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGljLT5iaXRtYXBfbG9jaywgZmxhZ3MpOwotCi0JcHJfZGVidWcoIm1waWM6IGFsbG9jYXRlZCAweCV4ICgyXiVkKSBhdCBvZmZzZXQgMHgleFxuIiwKLQkJIG51bSwgb3JkZXIsIG9mZnNldCk7Ci0KLQlyZXR1cm4gb2Zmc2V0OwotfQotCi12b2lkIG1waWNfbXNpX2ZyZWVfaHdpcnFzKHN0cnVjdCBtcGljICptcGljLCBpbnQgb2Zmc2V0LCBpbnQgbnVtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG9yZGVyID0gZ2V0X2NvdW50X29yZGVyKG51bSk7Ci0KLQlwcl9kZWJ1ZygibXBpYzogZnJlZWluZyAweCV4ICgyXiVkKSBhdCBvZmZzZXQgMHgleFxuIiwKLQkJIG51bSwgb3JkZXIsIG9mZnNldCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBpYy0+Yml0bWFwX2xvY2ssIGZsYWdzKTsKLQliaXRtYXBfcmVsZWFzZV9yZWdpb24obXBpYy0+aHdpcnFfYml0bWFwLCBvZmZzZXQsIG9yZGVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGljLT5iaXRtYXBfbG9jaywgZmxhZ3MpOworCW1zaV9iaXRtYXBfcmVzZXJ2ZV9od2lycSgmbXBpYy0+bXNpX2JpdG1hcCwgaHdpcnEpOwogfQogCiAjaWZkZWYgQ09ORklHX01QSUNfVTNfSFRfSVJRUwpAQCAtODMsMTMgKzQxLDEzIEBACiAKIAkvKiBSZXNlcnZlIHNvdXJjZSBudW1iZXJzIHdlIGtub3cgYXJlIHJlc2VydmVkIGluIHRoZSBIVyAqLwogCWZvciAoaSA9IDA7ICAgaSA8IDg7ICAgaSsrKQotCQlfX21waWNfbXNpX3Jlc2VydmVfaHdpcnEobXBpYywgaSk7CisJCW1zaV9iaXRtYXBfcmVzZXJ2ZV9od2lycSgmbXBpYy0+bXNpX2JpdG1hcCwgaSk7CiAKIAlmb3IgKGkgPSA0MjsgIGkgPCA0NjsgIGkrKykKLQkJX19tcGljX21zaV9yZXNlcnZlX2h3aXJxKG1waWMsIGkpOworCQltc2lfYml0bWFwX3Jlc2VydmVfaHdpcnEoJm1waWMtPm1zaV9iaXRtYXAsIGkpOwogCiAJZm9yIChpID0gMTAwOyBpIDwgMTA1OyBpKyspCi0JCV9fbXBpY19tc2lfcmVzZXJ2ZV9od2lycShtcGljLCBpKTsKKwkJbXNpX2JpdG1hcF9yZXNlcnZlX2h3aXJxKCZtcGljLT5tc2lfYml0bWFwLCBpKTsKIAogCW5wID0gTlVMTDsKIAl3aGlsZSAoKG5wID0gb2ZfZmluZF9hbGxfbm9kZXMobnApKSkgewpAQCAtOTksNyArNTcsNyBAQAogCQl3aGlsZSAob2ZfaXJxX21hcF9vbmUobnAsIGluZGV4KyssICZvaXJxKSA9PSAwKSB7CiAJCQlvcHMtPnhsYXRlKG1waWMtPmlycWhvc3QsIE5VTEwsIG9pcnEuc3BlY2lmaWVyLAogCQkJCQkJb2lycS5zaXplLCAmaHdpcnEsICZmbGFncyk7Ci0JCQlfX21waWNfbXNpX3Jlc2VydmVfaHdpcnEobXBpYywgaHdpcnEpOworCQkJbXNpX2JpdG1hcF9yZXNlcnZlX2h3aXJxKCZtcGljLT5tc2lfYml0bWFwLCBod2lycSk7CiAJCX0KIAl9CiAKQEAgLTExMiw3MCArNzAsMjUgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG1waWNfbXNpX3Jlc2VydmVfZHRfaHdpcnFzKHN0cnVjdCBtcGljICptcGljKQotewotCWludCBpLCBsZW47Ci0JY29uc3QgdTMyICpwOwotCi0JcCA9IG9mX2dldF9wcm9wZXJ0eShtcGljLT5pcnFob3N0LT5vZl9ub2RlLAotCQkJICAgICJtc2ktYXZhaWxhYmxlLXJhbmdlcyIsICZsZW4pOwotCWlmICghcCkgewotCQlwcl9kZWJ1ZygibXBpYzogbm8gbXNpLWF2YWlsYWJsZS1yYW5nZXMgcHJvcGVydHkgZm91bmQgb24gJXNcbiIsCi0JCQkgIG1waWMtPmlycWhvc3QtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChsZW4gJSA4ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXBpYzogTWFsZm9ybWVkIG1zaS1hdmFpbGFibGUtcmFuZ2VzICIKLQkJICAgICAgICJwcm9wZXJ0eSBvbiAlc1xuIiwgbXBpYy0+aXJxaG9zdC0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYml0bWFwX2FsbG9jYXRlX3JlZ2lvbihtcGljLT5od2lycV9iaXRtYXAsIDAsCi0JCQkgICAgICAgZ2V0X2NvdW50X29yZGVyKG1waWMtPmlycV9jb3VudCkpOwotCi0JLyogRm9ybWF0IGlzOiAoPHUzMiBzdGFydD4gPHUzMiBjb3VudD4pKyAqLwotCWxlbiAvPSBzaXplb2YodTMyKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrLCBwICs9IDIpCi0JCW1waWNfbXNpX2ZyZWVfaHdpcnFzKG1waWMsICpwLCAqKHAgKyAxKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50IG1waWNfbXNpX2luaXRfYWxsb2NhdG9yKHN0cnVjdCBtcGljICptcGljKQogewotCWludCByYywgc2l6ZTsKKwlpbnQgcmM7CiAKLQlCVUdfT04obXBpYy0+aHdpcnFfYml0bWFwKTsKLQlzcGluX2xvY2tfaW5pdCgmbXBpYy0+Yml0bWFwX2xvY2spOworCXJjID0gbXNpX2JpdG1hcF9hbGxvYygmbXBpYy0+bXNpX2JpdG1hcCwgbXBpYy0+aXJxX2NvdW50LAorCQkJICAgICAgbXBpYy0+aXJxaG9zdC0+b2Zfbm9kZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKLQlzaXplID0gQklUU19UT19MT05HUyhtcGljLT5pcnFfY291bnQpICogc2l6ZW9mKGxvbmcpOwotCXByX2RlYnVnKCJtcGljOiBhbGxvY2F0b3IgYml0bWFwIHNpemUgaXMgMHgleCBieXRlc1xuIiwgc2l6ZSk7Ci0KLQltcGljLT5od2lycV9iaXRtYXAgPSBhbGxvY19tYXliZV9ib290bWVtKHNpemUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFtcGljLT5od2lycV9iaXRtYXApIHsKLQkJcHJfZGVidWcoIm1waWM6IEVOT01FTSBhbGxvY2F0aW5nIGFsbG9jYXRvciBiaXRtYXAhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtc2V0KG1waWMtPmh3aXJxX2JpdG1hcCwgMCwgc2l6ZSk7Ci0KLQlyYyA9IG1waWNfbXNpX3Jlc2VydmVfZHRfaHdpcnFzKG1waWMpOwotCWlmIChyYykgeworCXJjID0gbXNpX2JpdG1hcF9yZXNlcnZlX2R0X2h3aXJxcygmbXBpYy0+bXNpX2JpdG1hcCk7CisJaWYgKHJjID4gMCkgewogCQlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1UzX0hUX0lSUVMpCiAJCQlyYyA9IG1waWNfbXNpX3Jlc2VydmVfdTNfaHdpcnFzKG1waWMpOwogCi0JCWlmIChyYykKLQkJCWdvdG8gb3V0X2ZyZWU7CisJCWlmIChyYykgeworCQkJbXNpX2JpdG1hcF9mcmVlKCZtcGljLT5tc2lfYml0bWFwKTsKKwkJCXJldHVybiByYzsKKwkJfQogCX0KIAogCXJldHVybiAwOwotCi0gb3V0X2ZyZWU6Ci0JaWYgKG1lbV9pbml0X2RvbmUpCi0JCWtmcmVlKG1waWMtPmh3aXJxX2JpdG1hcCk7Ci0KLQltcGljLT5od2lycV9iaXRtYXAgPSBOVUxMOwotCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19wYXNlbWlfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfcGFzZW1pX21zaS5jCmluZGV4IDY4YWZmNjAuLjY1NmNiNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19wYXNlbWlfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX3Bhc2VtaV9tc2kuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL21zaV9iaXRtYXAuaD4KIAogI2luY2x1ZGUgIm1waWMuaCIKIApAQCAtODEsOCArODIsOCBAQAogCQkJY29udGludWU7CiAKIAkJc2V0X2lycV9tc2koZW50cnktPmlycSwgTlVMTCk7Ci0JCW1waWNfbXNpX2ZyZWVfaHdpcnFzKG1zaV9tcGljLCB2aXJxX3RvX2h3KGVudHJ5LT5pcnEpLAotCQkJCSAgICAgQUxMT0NfQ0hVTkspOworCQltc2lfYml0bWFwX2ZyZWVfaHdpcnFzKCZtc2lfbXBpYy0+bXNpX2JpdG1hcCwKKwkJCQkgICAgICAgdmlycV90b19odyhlbnRyeS0+aXJxKSwgQUxMT0NfQ0hVTkspOwogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGVudHJ5LT5pcnEpOwogCX0KIApAQCAtOTEsMTEgKzkyLDEwIEBACiAKIHN0YXRpYyBpbnQgcGFzZW1pX21zaV9zZXR1cF9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG52ZWMsIGludCB0eXBlKQogewotCWlycV9od19udW1iZXJfdCBod2lycTsKIAl1bnNpZ25lZCBpbnQgdmlycTsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCXN0cnVjdCBtc2lfbXNnIG1zZzsKLQlpbnQgcmV0OworCWludCBod2lycTsKIAogCXByX2RlYnVnKCJwYXNlbWlfbXNpX3NldHVwX21zaV9pcnFzLCBwZGV2ICVwIG52ZWMgJWQgdHlwZSAlZFxuIiwKIAkJIHBkZXYsIG52ZWMsIHR5cGUpOwpAQCAtMTA5LDE3ICsxMDksMTkgQEAKIAkJICogZmV3IE1TSXMgZm9yIHNvbWVvbmUsIGJ1dCByZXN0cmljdGlvbnMgd2lsbCBhcHBseSB0byBob3cgdGhlCiAJCSAqIHNvdXJjZXMgY2FuIGJlIGNoYW5nZWQgaW5kZXBlbmRlbnRseS4KIAkJICovCi0JCXJldCA9IG1waWNfbXNpX2FsbG9jX2h3aXJxcyhtc2lfbXBpYywgQUxMT0NfQ0hVTkspOwotCQlod2lycSA9IHJldDsKLQkJaWYgKHJldCA8IDApIHsKKwkJaHdpcnEgPSBtc2lfYml0bWFwX2FsbG9jX2h3aXJxcygmbXNpX21waWMtPm1zaV9iaXRtYXAsCisJCQkJCQlBTExPQ19DSFVOSyk7CisJCWlmIChod2lycSA8IDApIHsKIAkJCXByX2RlYnVnKCJwYXNlbWlfbXNpOiBmYWlsZWQgYWxsb2NhdGluZyBod2lycVxuIik7CiAJCQlyZXR1cm4gaHdpcnE7CiAJCX0KIAogCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKG1zaV9tcGljLT5pcnFob3N0LCBod2lycSk7CiAJCWlmICh2aXJxID09IE5PX0lSUSkgewotCQkJcHJfZGVidWcoInBhc2VtaV9tc2k6IGZhaWxlZCBtYXBwaW5nIGh3aXJxIDB4JWx4XG4iLCBod2lycSk7Ci0JCQltcGljX21zaV9mcmVlX2h3aXJxcyhtc2lfbXBpYywgaHdpcnEsIEFMTE9DX0NIVU5LKTsKKwkJCXByX2RlYnVnKCJwYXNlbWlfbXNpOiBmYWlsZWQgbWFwcGluZyBod2lycSAweCV4XG4iLAorCQkJCSAgaHdpcnEpOworCQkJbXNpX2JpdG1hcF9mcmVlX2h3aXJxcygmbXNpX21waWMtPm1zaV9iaXRtYXAsIGh3aXJxLAorCQkJCQkgICAgICAgQUxMT0NfQ0hVTkspOwogCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KIApAQCAtMTMzLDggKzEzNSw4IEBACiAJCXNldF9pcnFfY2hpcCh2aXJxLCAmbXBpY19wYXNlbWlfbXNpX2NoaXApOwogCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOwogCi0JCXByX2RlYnVnKCJwYXNlbWlfbXNpOiBhbGxvY2F0ZWQgdmlycSAweCV4IChodyAweCVseCkgYWRkciAweCV4XG4iLAotCQkJICB2aXJxLCBod2lycSwgbXNnLmFkZHJlc3NfbG8pOworCQlwcl9kZWJ1ZygicGFzZW1pX21zaTogYWxsb2NhdGVkIHZpcnEgMHgleCAoaHcgMHgleCkgIiBcCisJCQkgImFkZHIgMHgleFxuIiwgdmlycSwgaHdpcnEsIG1zZy5hZGRyZXNzX2xvKTsKIAogCQkvKiBMaWtld2lzZSwgdGhlIGRldmljZSB3cml0ZXMgWzAuLi41MTFdIGludG8gdGhlIHRhcmdldAogCQkgKiByZWdpc3RlciB0byBnZW5lcmF0ZSBNU0kgWzUxMi4uLjEwMjNdCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfdTNtc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCmluZGV4IDZlMmY4NjguLjBhOGY1YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vbXNpX2JpdG1hcC5oPgogCiAjaW5jbHVkZSAibXBpYy5oIgogCkBAIC0xMDEsNyArMTAyLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCXNldF9pcnFfbXNpKGVudHJ5LT5pcnEsIE5VTEwpOwotCQltcGljX21zaV9mcmVlX2h3aXJxcyhtc2lfbXBpYywgdmlycV90b19odyhlbnRyeS0+aXJxKSwgMSk7CisJCW1zaV9iaXRtYXBfZnJlZV9od2lycXMoJm1zaV9tcGljLT5tc2lfYml0bWFwLAorCQkJCSAgICAgICB2aXJxX3RvX2h3KGVudHJ5LT5pcnEpLCAxKTsKIAkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhlbnRyeS0+aXJxKTsKIAl9CiAKQEAgLTExMCwyOSArMTEyLDI3IEBACiAKIHN0YXRpYyBpbnQgdTNtc2lfc2V0dXBfbXNpX2lycXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKIHsKLQlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7CiAJdW5zaWduZWQgaW50IHZpcnE7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJdTY0IGFkZHI7Ci0JaW50IHJldDsKKwlpbnQgaHdpcnE7CiAKIAlhZGRyID0gZmluZF9odF9tYWdpY19hZGRyKHBkZXYpOwogCW1zZy5hZGRyZXNzX2xvID0gYWRkciAmIDB4RkZGRkZGRkY7CiAJbXNnLmFkZHJlc3NfaGkgPSBhZGRyID4+IDMyOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnBkZXYtPm1zaV9saXN0LCBsaXN0KSB7Ci0JCXJldCA9IG1waWNfbXNpX2FsbG9jX2h3aXJxcyhtc2lfbXBpYywgMSk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWh3aXJxID0gbXNpX2JpdG1hcF9hbGxvY19od2lycXMoJm1zaV9tcGljLT5tc2lfYml0bWFwLCAxKTsKKwkJaWYgKGh3aXJxIDwgMCkgewogCQkJcHJfZGVidWcoInUzbXNpOiBmYWlsZWQgYWxsb2NhdGluZyBod2lycVxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIGh3aXJxOwogCQl9Ci0JCWh3aXJxID0gcmV0OwogCiAJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcobXNpX21waWMtPmlycWhvc3QsIGh3aXJxKTsKIAkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7Ci0JCQlwcl9kZWJ1ZygidTNtc2k6IGZhaWxlZCBtYXBwaW5nIGh3aXJxIDB4JWx4XG4iLCBod2lycSk7Ci0JCQltcGljX21zaV9mcmVlX2h3aXJxcyhtc2lfbXBpYywgaHdpcnEsIDEpOworCQkJcHJfZGVidWcoInUzbXNpOiBmYWlsZWQgbWFwcGluZyBod2lycSAweCV4XG4iLCBod2lycSk7CisJCQltc2lfYml0bWFwX2ZyZWVfaHdpcnFzKCZtc2lfbXBpYy0+bXNpX2JpdG1hcCwgaHdpcnEsIDEpOwogCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KIApAQCAtMTQwLDggKzE0MCw4IEBACiAJCXNldF9pcnFfY2hpcCh2aXJxLCAmbXBpY191M21zaV9jaGlwKTsKIAkJc2V0X2lycV90eXBlKHZpcnEsIElSUV9UWVBFX0VER0VfUklTSU5HKTsKIAotCQlwcl9kZWJ1ZygidTNtc2k6IGFsbG9jYXRlZCB2aXJxIDB4JXggKGh3IDB4JWx4KSBhZGRyIDB4JWx4XG4iLAotCQkJICB2aXJxLCBod2lycSwgYWRkcik7CisJCXByX2RlYnVnKCJ1M21zaTogYWxsb2NhdGVkIHZpcnEgMHgleCAoaHcgMHgleCkgYWRkciAweCVseFxuIiwKKwkJCSAgdmlycSwgaHdpcnEsICh1bnNpZ25lZCBsb25nKWFkZHIpOwogCiAJCW1zZy5kYXRhID0gaHdpcnE7CiAJCXdyaXRlX21zaV9tc2codmlycSwgJm1zZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21zaV9iaXRtYXAuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXNpX2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21zaV9iaXRtYXAuYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDgsIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxhc20vbXNpX2JpdG1hcC5oPgorCitpbnQgbXNpX2JpdG1hcF9hbGxvY19od2lycXMoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCwgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzZXQsIG9yZGVyID0gZ2V0X2NvdW50X29yZGVyKG51bSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm1wLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBUaGlzIGlzIGZhc3QsIGJ1dCBzdHJpY3RlciB0aGFuIHdlIG5lZWQuIFdlIG1pZ2h0IHdhbnQgdG8gYWRkCisJICogYSBmYWxsYmFjayByb3V0aW5lIHdoaWNoIGRvZXMgYSBsaW5lYXIgc2VhcmNoIHdpdGggbm8gYWxpZ25tZW50LgorCSAqLworCW9mZnNldCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKGJtcC0+Yml0bWFwLCBibXAtPmlycV9jb3VudCwgb3JkZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJtcC0+bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIm1zaV9iaXRtYXA6IGFsbG9jYXRlZCAweCV4ICgyXiVkKSBhdCBvZmZzZXQgMHgleFxuIiwKKwkJIG51bSwgb3JkZXIsIG9mZnNldCk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCit2b2lkIG1zaV9iaXRtYXBfZnJlZV9od2lycXMoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9yZGVyID0gZ2V0X2NvdW50X29yZGVyKG51bSk7CisKKwlwcl9kZWJ1ZygibXNpX2JpdG1hcDogZnJlZWluZyAweCV4ICgyXiVkKSBhdCBvZmZzZXQgMHgleFxuIiwKKwkJIG51bSwgb3JkZXIsIG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm1wLT5sb2NrLCBmbGFncyk7CisJYml0bWFwX3JlbGVhc2VfcmVnaW9uKGJtcC0+Yml0bWFwLCBvZmZzZXQsIG9yZGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibXAtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtc2lfYml0bWFwX3Jlc2VydmVfaHdpcnEoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCwgdW5zaWduZWQgaW50IGh3aXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygibXNpX2JpdG1hcDogcmVzZXJ2aW5nIGh3aXJxIDB4JXhcbiIsIGh3aXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibXAtPmxvY2ssIGZsYWdzKTsKKwliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKGJtcC0+Yml0bWFwLCBod2lycSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm1wLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogbXNpX2JpdG1hcF9yZXNlcnZlX2R0X2h3aXJxcyAtIFJlc2VydmUgaXJxcyBzcGVjaWZpZWQgaW4gdGhlIGRldmljZSB0cmVlLgorICogQGJtcDogcG9pbnRlciB0byB0aGUgTVNJIGJpdG1hcC4KKyAqCisgKiBMb29rcyBpbiB0aGUgZGV2aWNlIHRyZWUgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcHJvcGVydHkgc3BlY2lmeWluZyB3aGljaAorICogaXJxcyBjYW4gYmUgdXNlZCBmb3IgTVNJLiBJZiBmb3VuZCB0aG9zZSBpcnFzIHJlc2VydmVkIGluIHRoZSBkZXZpY2UgdHJlZQorICogYXJlIHJlc2VydmVkIGluIHRoZSBiaXRtYXAuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCA8IDAgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCBhbmQgPiAwIGlmIG5vIHByb3BlcnR5CisgKiB3YXMgZm91bmQgaW4gdGhlIGRldmljZSB0cmVlLgorICoqLworaW50IG1zaV9iaXRtYXBfcmVzZXJ2ZV9kdF9od2lycXMoc3RydWN0IG1zaV9iaXRtYXAgKmJtcCkKK3sKKwlpbnQgaSwgaiwgbGVuOworCWNvbnN0IHUzMiAqcDsKKworCWlmICghYm1wLT5vZl9ub2RlKQorCQlyZXR1cm4gMTsKKworCXAgPSBvZl9nZXRfcHJvcGVydHkoYm1wLT5vZl9ub2RlLCAibXNpLWF2YWlsYWJsZS1yYW5nZXMiLCAmbGVuKTsKKwlpZiAoIXApIHsKKwkJcHJfZGVidWcoIm1zaV9iaXRtYXA6IG5vIG1zaS1hdmFpbGFibGUtcmFuZ2VzIHByb3BlcnR5ICIgXAorCQkJICJmb3VuZCBvbiAlc1xuIiwgYm1wLT5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobGVuICUgKDIgKiBzaXplb2YodTMyKSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtc2lfYml0bWFwOiBNYWxmb3JtZWQgbXNpLWF2YWlsYWJsZS1yYW5nZXMiCisJCSAgICAgICAiIHByb3BlcnR5IG9uICVzXG4iLCBibXAtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJpdG1hcF9hbGxvY2F0ZV9yZWdpb24oYm1wLT5iaXRtYXAsIDAsIGdldF9jb3VudF9vcmRlcihibXAtPmlycV9jb3VudCkpOworCisJc3Bpbl9sb2NrKCZibXAtPmxvY2spOworCisJLyogRm9ybWF0IGlzOiAoPHUzMiBzdGFydD4gPHUzMiBjb3VudD4pKyAqLworCWxlbiAvPSAyICogc2l6ZW9mKHUzMik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBwICs9IDIpIHsKKwkJZm9yIChqID0gMDsgaiA8ICoocCArIDEpOyBqKyspCisJCQliaXRtYXBfcmVsZWFzZV9yZWdpb24oYm1wLT5iaXRtYXAsICpwICsgaiwgMCk7CisJfQorCisJc3Bpbl91bmxvY2soJmJtcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1zaV9iaXRtYXBfYWxsb2Moc3RydWN0IG1zaV9iaXRtYXAgKmJtcCwgdW5zaWduZWQgaW50IGlycV9jb3VudCwKKwkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUpCit7CisJaW50IHNpemU7CisKKwlpZiAoIWlycV9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gQklUU19UT19MT05HUyhpcnFfY291bnQpICogc2l6ZW9mKGxvbmcpOworCXByX2RlYnVnKCJtc2lfYml0bWFwOiBhbGxvY2F0b3IgYml0bWFwIHNpemUgaXMgMHgleCBieXRlc1xuIiwgc2l6ZSk7CisKKwlibXAtPmJpdG1hcCA9IHphbGxvY19tYXliZV9ib290bWVtKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYm1wLT5iaXRtYXApIHsKKwkJcHJfZGVidWcoIm1zaV9iaXRtYXA6IEVOT01FTSBhbGxvY2F0aW5nIGFsbG9jYXRvciBiaXRtYXAhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2UgemFsbG9jJ2VkIHRoZSBiaXRtYXAsIHNvIGFsbCBpcnFzIGFyZSBmcmVlIGJ5IGRlZmF1bHQgKi8KKwlzcGluX2xvY2tfaW5pdCgmYm1wLT5sb2NrKTsKKwlibXAtPm9mX25vZGUgPSBvZl9ub2RlX2dldChvZl9ub2RlKTsKKwlibXAtPmlycV9jb3VudCA9IGlycV9jb3VudDsKKworCXJldHVybiAwOworfQorCit2b2lkIG1zaV9iaXRtYXBfZnJlZShzdHJ1Y3QgbXNpX2JpdG1hcCAqYm1wKQoreworCS8qIHdlIGNhbid0IGZyZWUgdGhlIGJpdG1hcCB3ZSBkb24ndCBrbm93IGlmIGl0J3MgYm9vdG1lbSBldGMuICovCisJb2Zfbm9kZV9wdXQoYm1wLT5vZl9ub2RlKTsKKwlibXAtPmJpdG1hcCA9IE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfTVNJX0JJVE1BUF9TRUxGVEVTVAorCisjZGVmaW5lIGNoZWNrKHgpCVwKKwlpZiAoISh4KSkgcHJpbnRrKCJtc2lfYml0bWFwOiB0ZXN0IGZhaWxlZCBhdCBsaW5lICVkXG4iLCBfX0xJTkVfXyk7CisKK3ZvaWQgdGVzdF9iYXNpY3Modm9pZCkKK3sKKwlzdHJ1Y3QgbXNpX2JpdG1hcCBibXA7CisJaW50IGksIHNpemUgPSA1MTI7CisKKwkvKiBDYW4ndCBhbGxvY2F0ZSBhIGJpdG1hcCBvZiAwIGlycXMgKi8KKwljaGVjayhtc2lfYml0bWFwX2FsbG9jKCZibXAsIDAsIE5VTEwpICE9IDApOworCisJLyogb2Zfbm9kZSBtYXkgYmUgTlVMTCAqLworCWNoZWNrKDAgPT0gbXNpX2JpdG1hcF9hbGxvYygmYm1wLCBzaXplLCBOVUxMKSk7CisKKwkvKiBTaG91bGQgYWxsIGJlIGZyZWUgYnkgZGVmYXVsdCAqLworCWNoZWNrKDAgPT0gYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24oYm1wLmJpdG1hcCwgc2l6ZSwKKwkJCQkJICAgZ2V0X2NvdW50X29yZGVyKHNpemUpKSk7CisJYml0bWFwX3JlbGVhc2VfcmVnaW9uKGJtcC5iaXRtYXAsIDAsIGdldF9jb3VudF9vcmRlcihzaXplKSk7CisKKwkvKiBXaXRoIG5vIG5vZGUsIHRoZXJlJ3Mgbm8gbXNpLWF2YWlsYWJsZS1yYW5nZXMsIHNvIGV4cGVjdCA+IDAgKi8KKwljaGVjayhtc2lfYml0bWFwX3Jlc2VydmVfZHRfaHdpcnFzKCZibXApID4gMCk7CisKKwkvKiBTaG91bGQgYWxsIHN0aWxsIGJlIGZyZWUgKi8KKwljaGVjaygwID09IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKGJtcC5iaXRtYXAsIHNpemUsCisJCQkJCSAgIGdldF9jb3VudF9vcmRlcihzaXplKSkpOworCWJpdG1hcF9yZWxlYXNlX3JlZ2lvbihibXAuYml0bWFwLCAwLCBnZXRfY291bnRfb3JkZXIoc2l6ZSkpOworCisJLyogQ2hlY2sgd2UgY2FuIGZpbGwgaXQgdXAgYW5kIHRoZW4gbm8gbW9yZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWNoZWNrKG1zaV9iaXRtYXBfYWxsb2NfaHdpcnFzKCZibXAsIDEpID49IDApOworCisJY2hlY2sobXNpX2JpdG1hcF9hbGxvY19od2lycXMoJmJtcCwgMSkgPCAwKTsKKworCS8qIFNob3VsZCBhbGwgYmUgYWxsb2NhdGVkICovCisJY2hlY2soYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24oYm1wLmJpdG1hcCwgc2l6ZSwgMCkgPCAwKTsKKworCS8qIEFuZCBpZiB3ZSBmcmVlIG9uZSB3ZSBjYW4gdGhlbiBhbGxvY2F0ZSBhbm90aGVyICovCisJbXNpX2JpdG1hcF9mcmVlX2h3aXJxcygmYm1wLCBzaXplIC8gMiwgMSk7CisJY2hlY2sobXNpX2JpdG1hcF9hbGxvY19od2lycXMoJmJtcCwgMSkgPT0gc2l6ZSAvIDIpOworCisJbXNpX2JpdG1hcF9mcmVlKCZibXApOworCisJLyogQ2xpZW50cyBtYXkgY2hlY2sgYml0bWFwID09IE5VTEwgZm9yICJub3QtYWxsb2NhdGVkIiAqLworCWNoZWNrKGJtcC5iaXRtYXAgPT0gTlVMTCk7CisKKwlrZnJlZShibXAuYml0bWFwKTsKK30KKwordm9pZCB0ZXN0X29mX25vZGUodm9pZCkKK3sKKwl1MzIgcHJvcF9kYXRhW10gPSB7IDEwLCAxMCwgMjUsIDMsIDQwLCAxLCAxMDAsIDEwMCwgMjAwLCAyMCB9OworCWNvbnN0IGNoYXIgKmV4cGVjdGVkX3N0ciA9ICIwLTksMjAtMjQsMjgtMzksNDEtOTksMjIwLTI1NSI7CisJY2hhciAqcHJvcF9uYW1lID0gIm1zaS1hdmFpbGFibGUtcmFuZ2VzIjsKKwljaGFyICpub2RlX25hbWUgPSAiL2Zha2Vub2RlIjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgb2Zfbm9kZTsKKwlzdHJ1Y3QgcHJvcGVydHkgcHJvcDsKKwlzdHJ1Y3QgbXNpX2JpdG1hcCBibXA7CisJaW50IHNpemUgPSAyNTY7CisJREVDTEFSRV9CSVRNQVAoZXhwZWN0ZWQsIHNpemUpOworCisJLyogVGhlcmUgc2hvdWxkIHJlYWxseSBiZSBhIHN0cnVjdCBkZXZpY2Vfbm9kZSBhbGxvY2F0b3IgKi8KKwltZW1zZXQoJm9mX25vZGUsIDAsIHNpemVvZihvZl9ub2RlKSk7CisJa3JlZl9pbml0KCZvZl9ub2RlLmtyZWYpOworCW9mX25vZGUuZnVsbF9uYW1lID0gbm9kZV9uYW1lOworCisJY2hlY2soMCA9PSBtc2lfYml0bWFwX2FsbG9jKCZibXAsIHNpemUsICZvZl9ub2RlKSk7CisKKwkvKiBObyBtc2ktYXZhaWxhYmxlLXJhbmdlcywgc28gZXhwZWN0ID4gMCAqLworCWNoZWNrKG1zaV9iaXRtYXBfcmVzZXJ2ZV9kdF9od2lycXMoJmJtcCkgPiAwKTsKKworCS8qIFNob3VsZCBhbGwgc3RpbGwgYmUgZnJlZSAqLworCWNoZWNrKDAgPT0gYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24oYm1wLmJpdG1hcCwgc2l6ZSwKKwkJCQkJICAgZ2V0X2NvdW50X29yZGVyKHNpemUpKSk7CisJYml0bWFwX3JlbGVhc2VfcmVnaW9uKGJtcC5iaXRtYXAsIDAsIGdldF9jb3VudF9vcmRlcihzaXplKSk7CisKKwkvKiBOb3cgY3JlYXRlIGEgZmFrZSBtc2ktYXZhaWxhYmxlLXJhbmdlcyBwcm9wZXJ0eSAqLworCisJLyogVGhlcmUgc2hvdWxkIHJlYWxseSAuLiBvaCB3aGF0ZXZlciAqLworCW1lbXNldCgmcHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKwlwcm9wLm5hbWUgPSBwcm9wX25hbWU7CisJcHJvcC52YWx1ZSA9ICZwcm9wX2RhdGE7CisJcHJvcC5sZW5ndGggPSBzaXplb2YocHJvcF9kYXRhKTsKKworCW9mX25vZGUucHJvcGVydGllcyA9ICZwcm9wOworCisJLyogbXNpLWF2YWlsYWJsZS1yYW5nZXMsIHNvIGV4cGVjdCA9PSAwICovCisJY2hlY2sobXNpX2JpdG1hcF9yZXNlcnZlX2R0X2h3aXJxcygmYm1wKSA9PSAwKTsKKworCS8qIENoZWNrIHdlIGdvdCB0aGUgZXhwZWN0ZWQgcmVzdWx0ICovCisJY2hlY2soMCA9PSBiaXRtYXBfcGFyc2VsaXN0KGV4cGVjdGVkX3N0ciwgZXhwZWN0ZWQsIHNpemUpKTsKKwljaGVjayhiaXRtYXBfZXF1YWwoZXhwZWN0ZWQsIGJtcC5iaXRtYXAsIHNpemUpKTsKKworCW1zaV9iaXRtYXBfZnJlZSgmYm1wKTsKKwlrZnJlZShibXAuYml0bWFwKTsKK30KKworaW50IG1zaV9iaXRtYXBfc2VsZnRlc3Qodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUnVubmluZyBNU0kgYml0bWFwIHNlbGYtdGVzdHMgLi4uXG4iKTsKKworCXRlc3RfYmFzaWNzKCk7CisJdGVzdF9vZl9ub2RlKCk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwobXNpX2JpdG1hcF9zZWxmdGVzdCk7CisjZW5kaWYgLyogQ09ORklHX01TSV9CSVRNQVBfU0VMRlRFU1QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYwppbmRleCAzMmUwYWQwLi5iNmJkNzc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCkBAIC0yOTMsMTAgKzI5Myw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJyZWciLCBOVUxMKTsKLQlpZiAocHJvcCkgewotCQlwZGF0YS5mb3JjZV9waHlfYWRkciA9IDE7Ci0JCXBkYXRhLnBoeV9hZGRyID0gKnByb3A7Ci0JfQorCWlmIChwcm9wKQorCQlwZGF0YS5waHlfYWRkciA9IE1WNjQzWFhfRVRIX1BIWV9BRERSKCpwcm9wKTsKIAogCW9mX25vZGVfcHV0KHBoeSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKaW5kZXggZmIzNjhkZi4uZDNlNGQ2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMKQEAgLTMwLDI0ICszMCwxOSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2Rjci5oPgogI2luY2x1ZGUgPGFzbS9kY3ItcmVncy5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CiAKICNpbmNsdWRlICJwcGM0eHhfcGNpLmgiCiAKIHN0YXRpYyBpbnQgZG1hX29mZnNldF9zZXQ7CiAKLS8qIE1vdmUgdGhhdCB0byBhIHVzZWFibGUgaGVhZGVyICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbF9tZW1vcnk7Ci0KICNkZWZpbmUgVTY0X1RPX1UzMl9MT1codmFsKQkoKHUzMikoKHZhbCkgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpKQogI2RlZmluZSBVNjRfVE9fVTMyX0hJR0godmFsKQkoKHUzMikoKHZhbCkgPj4gMzIpKQogCi0jaWZkZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAotI2RlZmluZSBSRVNfVE9fVTMyX0xPVyh2YWwpCVU2NF9UT19VMzJfTE9XKHZhbCkKLSNkZWZpbmUgUkVTX1RPX1UzMl9ISUdIKHZhbCkJVTY0X1RPX1UzMl9ISUdIKHZhbCkKLSNlbHNlCi0jZGVmaW5lIFJFU19UT19VMzJfTE9XKHZhbCkJKHZhbCkKLSNkZWZpbmUgUkVTX1RPX1UzMl9ISUdIKHZhbCkJKDApCi0jZW5kaWYKKyNkZWZpbmUgUkVTX1RPX1UzMl9MT1codmFsKQlcCisJKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA+IHNpemVvZih1MzIpKSA/IFU2NF9UT19VMzJfTE9XKHZhbCkgOiAodmFsKSkKKyNkZWZpbmUgUkVTX1RPX1UzMl9ISUdIKHZhbCkJXAorCSgoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPiBzaXplb2YodTMyKSkgPyBVNjRfVE9fVTMyX0hJR0godmFsKSA6ICgwKSkKIAogc3RhdGljIGlubGluZSBpbnQgcHBjNDQwc3BlX3JldkEodm9pZCkKIHsKQEAgLTEwNSw3ICsxMDAsOCBAQAogCiAJLyogRGVmYXVsdCAqLwogCXJlcy0+c3RhcnQgPSAwOwotCXJlcy0+ZW5kID0gc2l6ZSA9IDB4ODAwMDAwMDA7CisJc2l6ZSA9IDB4ODAwMDAwMDA7CisJcmVzLT5lbmQgPSBzaXplIC0gMTsKIAlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIOwogCiAJLyogR2V0IGRtYS1yYW5nZXMgcHJvcGVydHkgKi8KQEAgLTE0NSwxMiArMTQxLDExIEBACiAKIAkJLyogVXNlIHRoYXQgKi8KIAkJcmVzLT5zdGFydCA9IHBjaV9hZGRyOwotI2lmbmRlZiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUCiAJCS8qIEJld2FyZSBvZiAzMiBiaXRzIHJlc291cmNlcyAqLwotCQlpZiAoKHBjaV9hZGRyICsgc2l6ZSkgPiAweDEwMDAwMDAwMHVsbCkKKwkJaWYgKHNpemVvZihyZXNvdXJjZV9zaXplX3QpID09IHNpemVvZih1MzIpICYmCisJCSAgICAocGNpX2FkZHIgKyBzaXplKSA+IDB4MTAwMDAwMDAwdWxsKQogCQkJcmVzLT5lbmQgPSAweGZmZmZmZmZmOwogCQllbHNlCi0jZW5kaWYKIAkJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHNpemUgLSAxOwogCQlicmVhazsKIAl9CkBAIC0xNjcsMTMgKzE2MiwxMyBAQAogCSAqLwogCWlmIChzaXplIDwgdG90YWxfbWVtb3J5KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRtYS1yYW5nZXMgdG9vIHNtYWxsICIKLQkJICAgICAgICIoc2l6ZT0lbGx4IHRvdGFsX21lbW9yeT0lbHgpXG4iLAotCQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSwgc2l6ZSwgdG90YWxfbWVtb3J5KTsKKwkJICAgICAgICIoc2l6ZT0lbGx4IHRvdGFsX21lbW9yeT0lbGx4KVxuIiwKKwkJICAgICAgIGhvc2UtPmRuLT5mdWxsX25hbWUsIHNpemUsICh1NjQpdG90YWxfbWVtb3J5KTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIAkvKiBDaGVjayB3ZSBhcmUgYSBwb3dlciBvZiAyIHNpemUgYW5kIHRoYXQgYmFzZSBpcyBhIG11bHRpcGxlIG9mIHNpemUqLwotCWlmICghaXNfcG93ZXJfb2ZfMihzaXplKSB8fAorCWlmICgoc2l6ZSAmIChzaXplIC0gMSkpICE9IDAgIHx8CiAJICAgIChyZXMtPnN0YXJ0ICYgKHNpemUgLSAxKSkgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEtcmFuZ2VzIHVuYWxpZ25lZFxuIiwKIAkJICAgICAgIGhvc2UtPmRuLT5mdWxsX25hbWUpOwpAQCAtMjc3LDkgKzI3MiwxNiBAQAogCWNvbnN0IGludCAqYnVzX3JhbmdlOwogCWludCBwcmltYXJ5ID0gMDsKIAorCS8qIENoZWNrIGlmIGRldmljZSBpcyBlbmFibGVkICovCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUG9ydCBkaXNhYmxlZCB2aWEgZGV2aWNlLXRyZWVcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIEZldGNoIGNvbmZpZyBzcGFjZSByZWdpc3RlcnMgYWRkcmVzcyAqLwogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyY19jZmcpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6Q2FuJ3QgZ2V0IFBDSSBjb25maWcgcmVnaXN0ZXIgYmFzZSAhIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IFBDSSBjb25maWcgcmVnaXN0ZXIgYmFzZSAhIiwKIAkJICAgICAgIG5wLT5mdWxsX25hbWUpOwogCQlyZXR1cm47CiAJfQpAQCAtODEwLDcgKzgxMiw3IEBACiAJc3dpdGNoIChwb3J0LT5pbmRleCkgewogCWNhc2UgMDoKIAkJbXRkY3JpKFNEUjAsIFBFU0RSMF80NjBFWF9MMENEUkNUTCwgMHgwMDAwMzIzMCk7Ci0JCW10ZGNyaShTRFIwLCBQRVNEUjBfNDYwRVhfTDBEUlYsIDB4MDAwMDAxMzYpOworCQltdGRjcmkoU0RSMCwgUEVTRFIwXzQ2MEVYX0wwRFJWLCAweDAwMDAwMTMwKTsKIAkJbXRkY3JpKFNEUjAsIFBFU0RSMF80NjBFWF9MMENMSywgMHgwMDAwMDAwNik7CiAKIAkJbXRkY3JpKFNEUjAsIFBFU0RSMF80NjBFWF9QSFlfQ1RMX1JTVCwweDEwMDAwMDAwKTsKQEAgLTgyMSwxMCArODIzLDEwIEBACiAJCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwRVhfTDFDRFJDVEwsIDB4MDAwMDMyMzApOwogCQltdGRjcmkoU0RSMCwgUEVTRFIxXzQ2MEVYX0wyQ0RSQ1RMLCAweDAwMDAzMjMwKTsKIAkJbXRkY3JpKFNEUjAsIFBFU0RSMV80NjBFWF9MM0NEUkNUTCwgMHgwMDAwMzIzMCk7Ci0JCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwRVhfTDBEUlYsIDB4MDAwMDAxMzYpOwotCQltdGRjcmkoU0RSMCwgUEVTRFIxXzQ2MEVYX0wxRFJWLCAweDAwMDAwMTM2KTsKLQkJbXRkY3JpKFNEUjAsIFBFU0RSMV80NjBFWF9MMkRSViwgMHgwMDAwMDEzNik7Ci0JCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwRVhfTDNEUlYsIDB4MDAwMDAxMzYpOworCQltdGRjcmkoU0RSMCwgUEVTRFIxXzQ2MEVYX0wwRFJWLCAweDAwMDAwMTMwKTsKKwkJbXRkY3JpKFNEUjAsIFBFU0RSMV80NjBFWF9MMURSViwgMHgwMDAwMDEzMCk7CisJCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwRVhfTDJEUlYsIDB4MDAwMDAxMzApOworCQltdGRjcmkoU0RSMCwgUEVTRFIxXzQ2MEVYX0wzRFJWLCAweDAwMDAwMTMwKTsKIAkJbXRkY3JpKFNEUjAsIFBFU0RSMV80NjBFWF9MMENMSywgMHgwMDAwMDAwNik7CiAJCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwRVhfTDFDTEssIDB4MDAwMDAwMDYpOwogCQltdGRjcmkoU0RSMCwgUEVTRFIxXzQ2MEVYX0wyQ0xLLCAweDAwMDAwMDA2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnCmluZGV4IDFjZTU0NjQuLjc2ZmZiYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZwpAQCAtMjQsMTIgKzI0LDMgQEAKIAlib29sCiAJaGVscAogCSAgUUUgVVNCIEhvc3QgQ29udHJvbGxlciBzdXBwb3J0Ci0KLWNvbmZpZyBRRV9HUElPCi0JYm9vbCAiUUUgR1BJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUVVJQ0NfRU5HSU5FCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91J3JlIGdvaW5nIHRvIHVzZSBoYXJkd2FyZSB0aGF0IGNvbm5lY3RzIHRvIHRoZQotCSAgUUUgR1BJT3MuCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDhkNDE5MDguLmJjNTgxZDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC03NCw2ICs3NCw3IEBACiAJc2VsZWN0IEhBVkVfS1BST0JFUwogCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKIAlzZWxlY3QgSEFWRV9LVk0gaWYgNjRCSVQKKwlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIApAQCAtNTY0LDEzICs1NjUsMTYgQEAKIAkgIFJlZmVyIHRvIDxmaWxlOkRvY3VtZW50YXRpb24vczM5MC96ZmNwZHVtcC50eHQ+IGZvciBtb3JlIGRldGFpbHMgb24gdGhpcy4KIAogY29uZmlnIFMzOTBfR1VFU1QKLWJvb2wgInMzOTAgZ3Vlc3Qgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKK2Jvb2wgInMzOTAgZ3Vlc3Qgc3VwcG9ydCBmb3IgS1ZNIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gNjRCSVQgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IFZJUlRJTwogCXNlbGVjdCBWSVJUSU9fUklORwogCXNlbGVjdCBWSVJUSU9fQ09OU09MRQogCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBydW4gdGhlIGtlcm5lbCB1bmRlciBzMzkwIGxpbnV4CisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gcnVuIHRoZSBrZXJuZWwgYXMgYSBndWVzdCB1bmRlcgorCSAgdGhlIEtWTSBoeXBlcnZpc29yLiBUaGlzIHdpbGwgYWRkIGRldGVjdGlvbiBmb3IgS1ZNIGFzIHdlbGwgIGFzIGEKKwkgIHZpcnRpbyB0cmFuc3BvcnQuIElmIEtWTSBpcyBkZXRlY3RlZCwgdGhlIHZpcnRpbyBjb25zb2xlIHdpbGwgYmUKKwkgIHRoZSBkZWZhdWx0IGNvbnNvbGUuCiBlbmRtZW51CiAKIHNvdXJjZSAibmV0L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCmluZGV4IDczODM3ODEuLjM2MzEzODAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCkBAIC0yMTksNyArMjE5LDcgQEAKIAogZW51bSB7IG9wdF91aWQsIG9wdF9naWQsIG9wdF9lcnIgfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgaHlwZnNfdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgaHlwZnNfdG9rZW5zID0gewogCXtvcHRfdWlkLCAidWlkPSV1In0sCiAJe29wdF9naWQsICJnaWQ9JXUifSwKIAl7b3B0X2VyciwgTlVMTH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZGFzZC5oCmluZGV4IDNmMDAyZTEuLjU1YjJiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Rhc2QuaApAQCAtMyw2ICszLDggQEAKICAqIEF1dGhvcihzKS4uLi4uLjogSG9sZ2VyIFNtb2xpbnNraSA8SG9sZ2VyLlNtb2xpbnNraUBkZS5pYm0uY29tPgogICogQnVncmVwb3J0cy50by4uOiA8TGludXgzOTBAZGUuaWJtLmNvbT4KICAqIChDKSBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCAxOTk5LDIwMDAKKyAqIEVNQyBTeW1tZXRyaXggaW9jdGwgQ29weXJpZ2h0IEVNQyBDb3Jwb3JhdGlvbiwgMjAwOAorICogQXV0aG9yLi4uLi4uLi4uOiBOaWdlbCBIaXNsb3AgPGhpc2xvcF9uaWdlbEBlbWMuY29tPgogICoKICAqIFRoaXMgZmlsZSBpcyB0aGUgaW50ZXJmYWNlIG9mIHRoZSBEQVNEIGRldmljZSBkcml2ZXIsIHdoaWNoIGlzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UKICAqIGFueSBmdXR1cmUgY2hhbmdlcyB3cnQgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBhIGNoYW5nZSBvZiB0aGUgQVBJVkVSU0lPTiByZXBvcnRlZApAQCAtMjAyLDYgKzIwNCwxNiBAQAogI2RlZmluZSBEQVNEX1NFUV9QUkVTVEFHRSAgMHg0CiAjZGVmaW5lIERBU0RfUkVDX0FDQ0VTUyAgICAweDUKIAorLyoKKyAqIFBlcmZvcm0gRU1DIFN5bW1ldHJpeCBJL08KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGFzZF9zeW1taW9fcGFybXMgeworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbOF07CS8qIGNvbXBhdCB3aXRoIG9sZGVyIHJlbGVhc2VzICovCisJdW5zaWduZWQgbG9uZyBsb25nIHBzZl9kYXRhOwkvKiBjaGFyICogY2FzdCB0byB1NjQgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgcnNzZF9yZXN1bHQ7IC8qIGNoYXIgKiBjYXN0IHRvIHU2NCAqLworCWludCBwc2ZfZGF0YV9sZW47CisJaW50IHJzc2RfcmVzdWx0X2xlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRhc2Rfc3ltbWlvX3Bhcm1zX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0VDVElPTjogRGVmaW5pdGlvbiBvZiBJT0NUTHMKQEAgLTI0Nyw2ICsyNTksNyBAQAogLyogU2V0IEF0dHJpYnV0ZXMgKGNhY2hlIG9wZXJhdGlvbnMpICovCiAjZGVmaW5lIEJJT0RBU0RTQVRUUiAgIF9JT1coREFTRF9JT0NUTF9MRVRURVIsMixhdHRyaWJfZGF0YV90KSAKIAorI2RlZmluZSBCSU9EQVNEU1lNTUlPICBfSU9XUihEQVNEX0lPQ1RMX0xFVFRFUiwgMjQwLCBkYXNkX3N5bW1pb19wYXJtc190KQogCiAjZW5kaWYJCQkJLyogREFTRF9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWxheS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2RlbGF5LmgKaW5kZXggNzgzNTczMS4uYTM1NmM5NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2RlbGF5LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2RlbGF5LmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgX1MzOTBfREVMQVlfSAogCiBleHRlcm4gdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKK2V4dGVybiB2b2lkIHVkZWxheV9zaW1wbGUodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogCiAjZGVmaW5lIHVkZWxheShuKSBfX3VkZWxheShuKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDNjYWQ1NjkuLjI2MTc4NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTE2NiwxMyArMTY2LDExIEBACiAjZGVmaW5lIEVMRl9QTEFURk9STSAoZWxmX3BsYXRmb3JtKQogCiAjaWZuZGVmIF9fczM5MHhfXwotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKICNlbHNlIC8qIF9fczM5MHhfXyAqLwotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQkJCVwKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KQkJCQlcCiBkbyB7CQkJCQkJCVwKLQlpZiAoaWJjczIpCQkJCQlcCi0JCXNldF9wZXJzb25hbGl0eShQRVJfU1ZSNCk7CQlcCi0JZWxzZSBpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgIT0gUEVSX0xJTlVYMzIpCVwKKwlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgIT0gUEVSX0xJTlVYMzIpCVwKIAkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQlcCiAJaWYgKChleCkuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikJXAogCQlzZXRfdGhyZWFkX2ZsYWcoVElGXzMxQklUKTsJCVwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDBiZGI3MDQuLjFhOTI4ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMjgxLDYgKzI4MSw5IEBACiAjZGVmaW5lIFJDUF9HUl9CSVQJNTAKICNkZWZpbmUgUkNQX0dDX0JJVAk0OQogCisvKiBVc2VyIGRpcnR5IGJpdCBmb3IgS1ZNJ3MgbWlncmF0aW9uIGZlYXR1cmUgKi8KKyNkZWZpbmUgS1ZNX1VEX0JJVAk0NworCiAjaWZuZGVmIF9fczM5MHhfXwogCiAvKiBCaXRzIGluIHRoZSBzZWdtZW50IHRhYmxlIGFkZHJlc3Mtc3BhY2UtY29udHJvbC1lbGVtZW50ICovCkBAIC01NzUsMTIgKzU3OCwxNiBAQAogCXVuc2lnbmVkIGxvbmcgKnBnc3RlID0gKHVuc2lnbmVkIGxvbmcgKikgKHB0ZXAgKyBQVFJTX1BFUl9QVEUpOwogCiAJc2tleSA9IHBhZ2VfZ2V0X3N0b3JhZ2Vfa2V5KHBhZ2VfdG9fcGh5cyhwYWdlKSk7Ci0JaWYgKHNrZXkgJiBfUEFHRV9DSEFOR0VEKQorCWlmIChza2V5ICYgX1BBR0VfQ0hBTkdFRCkgewogCQlzZXRfYml0X3NpbXBsZShSQ1BfR0NfQklULCBwZ3N0ZSk7CisJCXNldF9iaXRfc2ltcGxlKEtWTV9VRF9CSVQsIHBnc3RlKTsKKwl9CiAJaWYgKHNrZXkgJiBfUEFHRV9SRUZFUkVOQ0VEKQogCQlzZXRfYml0X3NpbXBsZShSQ1BfR1JfQklULCBwZ3N0ZSk7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdF9zaW1wbGUoUkNQX0hDX0JJVCwgcGdzdGUpKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXRfc2ltcGxlKFJDUF9IQ19CSVQsIHBnc3RlKSkgewogCQlTZXRQYWdlRGlydHkocGFnZSk7CisJCXNldF9iaXRfc2ltcGxlKEtWTV9VRF9CSVQsIHBnc3RlKTsKKwl9CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdF9zaW1wbGUoUkNQX0hSX0JJVCwgcGdzdGUpKQogCQlTZXRQYWdlUmVmZXJlbmNlZChwYWdlKTsKICNlbmRpZgpAQCAtNzQ0LDYgKzc1MSw0MCBAQAogCXJldHVybiBwdGU7CiB9CiAKKyNpZmRlZiBDT05GSUdfUEdTVEUKKy8qCisgKiBHZXQgKGFuZCBjbGVhcikgdGhlIHVzZXIgZGlydHkgYml0IGZvciBhIFBURS4KKyAqLworc3RhdGljIGlubGluZSBpbnQga3ZtX3MzOTBfdGVzdF9hbmRfY2xlYXJfcGFnZV9kaXJ0eShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJCSAgICAgcHRlX3QgKnB0ZXApCit7CisJaW50IGRpcnR5OworCXVuc2lnbmVkIGxvbmcgKnBnc3RlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBza2V5OworCisJaWYgKCFtbS0+Y29udGV4dC5wZ3N0ZXMpCisJCXJldHVybiAtRUlOVkFMOworCXJjcF9sb2NrKHB0ZXApOworCXBnc3RlID0gKHVuc2lnbmVkIGxvbmcgKikgKHB0ZXAgKyBQVFJTX1BFUl9QVEUpOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRlX3ZhbCgqcHRlcCkpOworCXNrZXkgPSBwYWdlX2dldF9zdG9yYWdlX2tleShwYWdlX3RvX3BoeXMocGFnZSkpOworCWlmIChza2V5ICYgX1BBR0VfQ0hBTkdFRCkgeworCQlzZXRfYml0X3NpbXBsZShSQ1BfR0NfQklULCBwZ3N0ZSk7CisJCXNldF9iaXRfc2ltcGxlKEtWTV9VRF9CSVQsIHBnc3RlKTsKKwl9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdF9zaW1wbGUoUkNQX0hDX0JJVCwgcGdzdGUpKSB7CisJCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwkJc2V0X2JpdF9zaW1wbGUoS1ZNX1VEX0JJVCwgcGdzdGUpOworCX0KKwlkaXJ0eSA9IHRlc3RfYW5kX2NsZWFyX2JpdF9zaW1wbGUoS1ZNX1VEX0JJVCwgcGdzdGUpOworCWlmIChza2V5ICYgX1BBR0VfQ0hBTkdFRCkKKwkJcGFnZV9jbGVhcl9kaXJ0eShwYWdlKTsKKwlyY3BfdW5sb2NrKHB0ZXApOworCXJldHVybiBkaXJ0eTsKK30KKyNlbmRpZgorCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKIHN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IGFmMmM5YWMuLmE3MjI2ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTQ5MCw2ICs0OTAsNyBAQAogCiAjZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoKChyZWdzKS0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpICE9IDApCiAjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKQorI2RlZmluZSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncykoKHJlZ3MpLT5ncHJzWzE1XSkKICNkZWZpbmUgcmVnc19yZXR1cm5fdmFsdWUocmVncykoKHJlZ3MpLT5ncHJzWzJdKQogI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKaW5kZXggNjgxMzc3Mi4uNDczNGMzZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCkBAIC0yOTksNyArMjk5LDEzIEBACiAJdTggbWJjY250OwogCXUxNiBxZGlvYWMyOwogCXU2NCBzY2hfdG9rZW47Ci0JdTY0OjY0OworCXU4IG1ybzsKKwl1OCBtcmk7CisJdTg6ODsKKwl1OCBzYmFsaWM7CisJdTE2OjE2OworCXU4Ojg7CisJdTggbW13YzsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBwYXJhbXMgYXJlOiBjY3dfZGV2aWNlLCBxZGlvX2Vycm9yLCBxdWV1ZV9udW1iZXIsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3RhdGZzLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3RhdGZzLmgKaW5kZXggMDk5YTQ1NS4uMDZjYzcwMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N0YXRmcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zdGF0ZnMuaApAQCAtMTIsMTkgKzEyLDE2IEBACiAjaWZuZGVmIF9fczM5MHhfXwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgogI2Vsc2UKKy8qCisgKiBXZSBjYW4ndCB1c2UgPGFzbS1nZW5lcmljL3N0YXRmcy5oPiBiZWNhdXNlIGluIDY0LWJpdCBtb2RlCisgKiB3ZSBtaXggaW50cyBvZiBkaWZmZXJlbnQgc2l6ZXMgaW4gb3VyIHN0cnVjdCBzdGF0ZnMuCisgKi8KIAogI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KIHR5cGVkZWYgX19rZXJuZWxfZnNpZF90CWZzaWRfdDsKLQogI2VuZGlmCiAKLS8qCi0gKiBUaGlzIGlzIHVnbHkgLS0gd2UncmUgYWxyZWFkeSA2NC1iaXQgY2xlYW4sIHNvIGp1c3QgZHVwbGljYXRlIHRoZSAKLSAqIGRlZmluaXRpb25zLgotICovCiBzdHJ1Y3Qgc3RhdGZzIHsKIAlpbnQgIGZfdHlwZTsKIAlpbnQgIGZfYnNpemU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTYyMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQWNjZXNzIHRvIHVzZXIgc3lzdGVtIGNhbGwgcGFyYW1ldGVycyBhbmQgcmVzdWx0cworICoKKyAqICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDgKKyAqICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyIG9ubHkpCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9BU01fU1lTQ0FMTF9ICisjZGVmaW5lIF9BU01fU1lTQ0FMTF9ICTEKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdzLT50cmFwICE9IF9fTENfU1ZDX09MRF9QU1cpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcmVncy0+Z3Byc1syXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfcm9sbGJhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdzLT5ncHJzWzJdID0gcmVncy0+b3JpZ19ncHIyOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfZXJyb3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIChyZWdzLT5ncHJzWzJdID49IC00MDk2VUwpID8gLXJlZ3MtPmdwcnNbMl0gOiAwOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiByZWdzLT5ncHJzWzJdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgaW50IGVycm9yLCBsb25nIHZhbCkKK3sKKwlyZWdzLT5ncHJzWzJdID0gZXJyb3IgPyAtZXJyb3IgOiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX2dldF9hcmd1bWVudHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSB1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IG4sCisJCQkJCSB1bnNpZ25lZCBsb25nICphcmdzKQoreworCUJVR19PTihpICsgbiA+IDYpOworI2lmZGVmIENPTkZJR19DT01QQVQKKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGXzMxQklUKSkgeworCQlpZiAoaSArIG4gPT0gNikKKwkJCWFyZ3NbLS1uXSA9ICh1MzIpIHJlZ3MtPmFyZ3NbMF07CisJCXdoaWxlIChuLS0gPiAwKQorCQkJYXJnc1tuXSA9ICh1MzIpIHJlZ3MtPmdwcnNbMiArIGkgKyBuXTsKKwl9CisjZW5kaWYKKwlpZiAoaSArIG4gPT0gNikKKwkJYXJnc1stLW5dID0gcmVncy0+YXJnc1swXTsKKwltZW1jcHkoYXJncywgJnJlZ3MtPmdwcnNbMiArIGldLCBuICogc2l6ZW9mKGFyZ3NbMF0pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfc2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFyZ3MpCit7CisJQlVHX09OKGkgKyBuID4gNik7CisJaWYgKGkgKyBuID09IDYpCisJCXJlZ3MtPmFyZ3NbMF0gPSBhcmdzWy0tbl07CisJbWVtY3B5KCZyZWdzLT5ncHJzWzIgKyBpXSwgYXJncywgbiAqIHNpemVvZihhcmdzWzBdKSk7Cit9CisKKyNlbmRpZgkvKiBfQVNNX1NZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA5MWE4ZjkzLi5lYTQwYTlkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtODYsNiArODYsNyBAQAogICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzIGJpdCBudW1iZXJzCiAgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMAkvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLworI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRQkxCS8qIGNhbGxiYWNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlciAqLwogI2RlZmluZSBUSUZfU0lHUEVORElORwkJMgkvKiBzaWduYWwgcGVuZGluZyAqLwogI2RlZmluZSBUSUZfTkVFRF9SRVNDSEVECTMJLyogcmVzY2hlZHVsaW5nIG5lY2Vzc2FyeSAqLwogI2RlZmluZSBUSUZfUkVTVEFSVF9TVkMJCTQJLyogcmVzdGFydCBzdmMgd2l0aCBuZXcgc3ZjIG51bWJlciAqLwpAQCAtMTAwLDYgKzEwMSw3IEBACiAjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMjAJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwoKSAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCisjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxPDxUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwppbmRleCBkN2YyMjIyLi40NjQ2MzgyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKQEAgLTI3OSwyMiArMjc5LDYgQEAKIAlyZXR1cm4gaGlnaDJsb3dnaWQoY3VycmVudC0+ZWdpZCk7CiB9CiAKLS8qIDMyLWJpdCB0aW1ldmFsIGFuZCByZWxhdGVkIGZsb3RzYW0uICAqLwotCi1zdGF0aWMgaW5saW5lIGxvbmcgZ2V0X3R2MzIoc3RydWN0IHRpbWV2YWwgKm8sIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCi17Ci0JcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBvLCBzaXplb2YoKm8pKSB8fAotCQkoX19nZXRfdXNlcihvLT50dl9zZWMsICZpLT50dl9zZWMpIHx8Ci0JCSBfX2dldF91c2VyKG8tPnR2X3VzZWMsICZpLT50dl91c2VjKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgcHV0X3R2MzIoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqbywgc3RydWN0IHRpbWV2YWwgKmkpCi17Ci0JcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgbywgc2l6ZW9mKCpvKSkgfHwKLQkJKF9fcHV0X3VzZXIoaS0+dHZfc2VjLCAmby0+dHZfc2VjKSB8fAotCQkgX19wdXRfdXNlcihpLT50dl91c2VjLCAmby0+dHZfdXNlYykpKTsKLX0KLQogLyoKICAqIHN5czMyX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzIGluIDMyYml0IGVtdWxhdGlvbi4KICAqCkBAIC0zNjIsNDEgKzM0Niw2IEBACiAJCXJldHVybiBzeXNfZnRydW5jYXRlKGZkLCAoaGlnaCA8PCAzMikgfCBsb3cpOwogfQogCi1pbnQgY3BfY29tcGF0X3N0YXQoc3RydWN0IGtzdGF0ICpzdGF0LCBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQotewotCWNvbXBhdF9pbm9fdCBpbm87Ci0JaW50IGVycjsKLQotCWlmICghb2xkX3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8ICFvbGRfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWlubyA9IHN0YXQtPmlubzsKLQlpZiAoc2l6ZW9mKGlubykgPCBzaXplb2Yoc3RhdC0+aW5vKSAmJiBpbm8gIT0gc3RhdC0+aW5vKQotCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQotCWVyciA9IHB1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPmRldiksICZzdGF0YnVmLT5zdF9kZXYpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5pbm8sICZzdGF0YnVmLT5zdF9pbm8pOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5tb2RlLCAmc3RhdGJ1Zi0+c3RfbW9kZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPm5saW5rLCAmc3RhdGJ1Zi0+c3RfbmxpbmspOwotCWVyciB8PSBwdXRfdXNlcihoaWdoMmxvd3VpZChzdGF0LT51aWQpLCAmc3RhdGJ1Zi0+c3RfdWlkKTsKLQllcnIgfD0gcHV0X3VzZXIoaGlnaDJsb3dnaWQoc3RhdC0+Z2lkKSwgJnN0YXRidWYtPnN0X2dpZCk7Ci0JZXJyIHw9IHB1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPnJkZXYpLCAmc3RhdGJ1Zi0+c3RfcmRldik7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPnNpemUsICZzdGF0YnVmLT5zdF9zaXplKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YXRpbWUudHZfc2VjLCAmc3RhdGJ1Zi0+c3RfYXRpbWUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5hdGltZS50dl9uc2VjLCAmc3RhdGJ1Zi0+c3RfYXRpbWVfbnNlYyk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPm10aW1lLnR2X3NlYywgJnN0YXRidWYtPnN0X210aW1lKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+bXRpbWUudHZfbnNlYywgJnN0YXRidWYtPnN0X210aW1lX25zZWMpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5jdGltZS50dl9zZWMsICZzdGF0YnVmLT5zdF9jdGltZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPmN0aW1lLnR2X25zZWMsICZzdGF0YnVmLT5zdF9jdGltZV9uc2VjKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+Ymxrc2l6ZSwgJnN0YXRidWYtPnN0X2Jsa3NpemUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5ibG9ja3MsICZzdGF0YnVmLT5zdF9ibG9ja3MpOwotLyogZml4bWUKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPl9fdW51c2VkNFswXSk7Ci0JZXJyIHw9IHB1dF91c2VyKDAsICZzdGF0YnVmLT5fX3VudXNlZDRbMV0pOwotKi8KLQlyZXR1cm4gZXJyOwotfQotCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfc2NoZWRfcnJfZ2V0X2ludGVydmFsKGNvbXBhdF9waWRfdCBwaWQsCiAJCQkJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKmludGVydmFsKQogewpAQCAtNTU3LDY1ICs1MDYsNiBAQAogCiAjZW5kaWYgIC8qIENPTkZJR19NT0RVTEVTICovCiAKLS8qIFRyYW5zbGF0aW9ucyBkdWUgdG8gdGltZV90IHNpemUgZGlmZmVyZW5jZXMuICBXaGljaCBhZmZlY3RzIGFsbAotICAgc29ydHMgb2YgdGhpbmdzLCBsaWtlIHRpbWV2YWwgYW5kIGl0aW1lcnZhbC4gICovCi0KLWV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlpZiAodHYpIHsKLQkJc3RydWN0IHRpbWV2YWwga3R2OwotCQlkb19nZXR0aW1lb2ZkYXkoJmt0dik7Ci0JCWlmIChwdXRfdHYzMih0diwgJmt0dikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIodHosICZzeXNfdHosIHNpemVvZihzeXNfdHopKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGdldF90czMyKHN0cnVjdCB0aW1lc3BlYyAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKLXsKLQlsb25nIHVzZWM7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaSwgc2l6ZW9mKCppKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChfX2dldF91c2VyKHVzZWMsICZpLT50dl91c2VjKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jby0+dHZfbnNlYyA9IHVzZWMgKiAxMDAwOwotCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlzdHJ1Y3QgdGltZXNwZWMga3RzOwotCXN0cnVjdCB0aW1lem9uZSBrdHo7Ci0KLSAJaWYgKHR2KSB7Ci0JCWlmIChnZXRfdHMzMigma3RzLCB0dikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Ci19Ci0KLS8qIFRoZXNlIGFyZSBoZXJlIGp1c3QgaW4gY2FzZSBzb21lIG9sZCBzcGFyYzMyIGJpbmFyeSBjYWxscyBpdC4gKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9wYXVzZSh2b2lkKQotewotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlKCk7Ci0JcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKLX0KLQogYXNtbGlua2FnZSBsb25nIHN5czMyX3ByZWFkNjQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqdWJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIHUzMiBwb3NoaSwgdTMyIHBvc2xvKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaCBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmgKaW5kZXggMjA3MjNhMC4uODM2YTI4OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5oCkBAIC0yMDIsMTEgKzIwMiw2IEBACiBsb25nIHN5czMyX2luaXRfbW9kdWxlKHZvaWQgX191c2VyICp1bW9kLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1YXJncyk7CiBsb25nIHN5czMyX2RlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciBfX3VzZXIgKm5hbWVfdXNlciwgdW5zaWduZWQgaW50IGZsYWdzKTsKLWxvbmcgc3lzMzJfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAotCQkJc3RydWN0IHRpbWV6b25lIF9fdXNlciAqdHopOwotbG9uZyBzeXMzMl9zZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCQlzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eik7Ci1sb25nIHN5czMyX3BhdXNlKHZvaWQpOwogbG9uZyBzeXMzMl9wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjb3VudCwKIAkJICAgdTMyIHBvc2hpLCB1MzIgcG9zbG8pOwogbG9uZyBzeXMzMl9wd3JpdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfcHRyYWNlLmggYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9wdHJhY2UuaAppbmRleCBjZGU4MWZhLi5hMmJlM2E5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9wdHJhY2UuaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9wdHJhY2UuaApAQCAtNDIsNiArNDIsNyBAQAogCXUzMiBncHJzW05VTV9HUFJTXTsKIAl1MzIgYWNyc1tOVU1fQUNSU107CiAJdTMyIG9yaWdfZ3ByMjsKKwkvKiBuYjogdGhlcmUncyBhIDQtYnl0ZSBob2xlIGhlcmUgKi8KIAlzMzkwX2ZwX3JlZ3MgZnBfcmVnczsKIAkvKgogCSAqIFRoZXNlIHBlciByZWdpc3RlcnMgYXJlIGluIGhlcmUgc28gdGhhdCBnZGIgY2FuIG1vZGlmeSB0aGVtCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggMzI4YTIwZS4uZmMyYzk3MSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMTI4LDggKzEyOCw2IEBACiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2FsYXJtCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0jc3lzMzJfcGF1c2Vfd3JhcHBlcgkJCSMgdm9pZAotCiAJLmdsb2JsCWNvbXBhdF9zeXNfdXRpbWVfd3JhcHBlcgogY29tcGF0X3N5c191dGltZV93cmFwcGVyOgogCWxsZ3RyCSVyMiwlcjIJCQkjIGNoYXIgKgpAQCAtMzM0LDE3ICszMzIsMTcgQEAKIAlsbGd0cgklcjMsJXIzCQkJIyBzdHJ1Y3QgcnVzYWdlX2VtdTMxICoKIAlqZwljb21wYXRfc3lzX2dldHJ1c2FnZQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX2dldHRpbWVvZmRheV93cmFwcGVyCi1zeXMzMl9nZXR0aW1lb2ZkYXlfd3JhcHBlcjoKKwkuZ2xvYmwJY29tcGF0X3N5c19nZXR0aW1lb2ZkYXlfd3JhcHBlcgorY29tcGF0X3N5c19nZXR0aW1lb2ZkYXlfd3JhcHBlcjoKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgdGltZXZhbF9lbXUzMSAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHRpbWV6b25lICoKLQlqZwlzeXMzMl9nZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKwlqZwljb21wYXRfc3lzX2dldHRpbWVvZmRheQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCi0JLmdsb2JsCXN5czMyX3NldHRpbWVvZmRheV93cmFwcGVyCi1zeXMzMl9zZXR0aW1lb2ZkYXlfd3JhcHBlcjoKKwkuZ2xvYmwJY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcgorY29tcGF0X3N5c19zZXR0aW1lb2ZkYXlfd3JhcHBlcjoKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgdGltZXZhbF9lbXUzMSAqCiAJbGxndHIJJXIzLCVyMwkJCSMgc3RydWN0IHRpbWV6b25lICoKLQlqZwlzeXMzMl9zZXR0aW1lb2ZkYXkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKwlqZwljb21wYXRfc3lzX3NldHRpbWVvZmRheQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCiAJLmdsb2JsCXN5czMyX2dldGdyb3VwczE2X3dyYXBwZXIKIHN5czMyX2dldGdyb3VwczE2X3dyYXBwZXI6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggNzA4Y2Y5Yy4uZWQ1MDBlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtNDksOSArNDksOSBAQAogU1BfVFJBUCAgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1RSQVAKIFNQX1NJWkUgICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFCiAKLV9USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCitfVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcgfCBfVElGX1JFU1RBUlRfU1ZDIHwgX1RJRl9TSU5HTEVfU1RFUCApCi1fVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAorX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX05FRURfUkVTQ0hFRCB8IFwKIAkJIF9USUZfTUNDS19QRU5ESU5HKQogCiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKQEAgLTMxOCw2ICszMTgsOCBAQAogCWJvCUJBU0VEKHN5c2NfcmVzY2hlZHVsZSkKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJR1BFTkRJTkcKIAlibnoJQkFTRUQoc3lzY19zaWdwZW5kaW5nKQorCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfTk9USUZZX1JFU1VNRQorCWJueglCQVNFRChzeXNjX25vdGlmeV9yZXN1bWUpCiAJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9SRVNUQVJUX1NWQwogCWJvCUJBU0VEKHN5c2NfcmVzdGFydCkKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJTkdMRV9TVEVQCkBAIC0zNTYsNiArMzU4LDE2IEBACiAJYglCQVNFRChzeXNjX3dvcmtfbG9vcCkKIAogIworIyBfVElGX05PVElGWV9SRVNVTUUgaXMgc2V0LCBjYWxsIGRvX25vdGlmeV9yZXN1bWUKKyMKK3N5c2Nfbm90aWZ5X3Jlc3VtZToKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJbAklcjEsQkFTRUQoLkxkb19ub3RpZnlfcmVzdW1lKQorCWxhCSVyMTQsQkFTRUQoc3lzY193b3JrX2xvb3ApCisJYnIJJXIxCQkJIyBjYWxsIGRvX25vdGlmeV9yZXN1bWUKKworCisjCiAjIF9USUZfUkVTVEFSVF9TVkMgaXMgc2V0LCBzZXQgdXAgcmVnaXN0ZXJzIGFuZCByZXN0YXJ0IHN2YwogIwogc3lzY19yZXN0YXJ0OgpAQCAtMzc4LDIwICszOTAsMjEgQEAKIAlicgklcjEJCQkjIGJyYW5jaCB0byBkb19zaW5nbGVfc3RlcAogCiAjCi0jIGNhbGwgdHJhY2UgYmVmb3JlIGFuZCBhZnRlciBzeXNfY2FsbAorIyBjYWxsIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeS90cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdCBiZWZvcmUKKyMgYW5kIGFmdGVyIHRoZSBzeXN0ZW0gY2FsbAogIwogc3lzY190cmFjZXN5czoKLQlsCSVyMSxCQVNFRCguTHRyYWNlKQorCWwJJXIxLEJBU0VEKC5MdHJhY2VfZW50cnkpCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWxhCSVyMywwCiAJc3JsCSVyNywyCiAJc3QJJXI3LFNQX1IyKCVyMTUpCiAJYmFzcgklcjE0LCVyMQotCWNsYwlTUF9SMig0LCVyMTUpLEJBU0VEKC5MbnJfc3lzY2FsbHMpCisJY2wJJXIyLEJBU0VEKC5MbnJfc3lzY2FsbHMpCiAJYm5sCUJBU0VEKHN5c2NfdHJhY2Vub2dvKQogCWwJJXI4LEJBU0VEKC5Mc3lzY190YWJsZSkKLQlsCSVyNyxTUF9SMiglcjE1KSAJIyBzdHJhY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZQotCXNsbAklcjcsMgkJCSMgIHN5c3RlbSBjYWxsCisJbHIJJXI3LCVyMgorCXNsbAklcjcsMgkJCSMgKjQKIAlsCSVyOCwwKCVyNywlcjgpCiBzeXNjX3RyYWNlZ286CiAJbG0JJXIzLCVyNixTUF9SMyglcjE1KQpAQCAtNDAxLDkgKzQxNCw4IEBACiBzeXNjX3RyYWNlbm9nbzoKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSwoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVCkKIAlieglCQVNFRChzeXNjX3JldHVybikKLQlsCSVyMSxCQVNFRCguTHRyYWNlKQorCWwJJXIxLEJBU0VEKC5MdHJhY2VfZXhpdCkKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JbGEJJXIzLDEKIAlsYQklcjE0LEJBU0VEKHN5c2NfcmV0dXJuKQogCWJyCSVyMQogCkBAIC02NjYsNiArNjc4LDggQEAKIAlibwlCQVNFRChpb19yZXNjaGVkdWxlKQogCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfU0lHUEVORElORwogCWJueglCQVNFRChpb19zaWdwZW5kaW5nKQorCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfTk9USUZZX1JFU1VNRQorCWJueglCQVNFRChpb19ub3RpZnlfcmVzdW1lKQogCWIJQkFTRUQoaW9fcmVzdG9yZSkKIGlvX3dvcmtfZG9uZToKIApAQCAtNzA0LDYgKzcxOCwxOSBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJYglCQVNFRChpb193b3JrX2xvb3ApCiAKKyMKKyMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKKyMKK2lvX25vdGlmeV9yZXN1bWU6CisJVFJBQ0VfSVJRU19PTgorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJbAklcjEsQkFTRUQoLkxkb19ub3RpZnlfcmVzdW1lKQorCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19zaWduYWwKKwlzdG5zbQlfX1NGX0VNUFRZKCVyMTUpLDB4ZmMJIyBkaXNhYmxlIEkvTyBhbmQgZXh0LiBpbnRlcnJ1cHRzCisJVFJBQ0VfSVJRU19PRkYKKwliCUJBU0VEKGlvX3dvcmtfbG9vcCkKKwogLyoKICAqIEV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwpAQCAtMTA3MCw2ICsxMDk3LDggQEAKIC5MZG9fSVJROgkubG9uZwlkb19JUlEKIC5MZG9fZXh0aW50OgkubG9uZwlkb19leHRpbnQKIC5MZG9fc2lnbmFsOgkubG9uZwlkb19zaWduYWwKKy5MZG9fbm90aWZ5X3Jlc3VtZToKKwkJLmxvbmcJZG9fbm90aWZ5X3Jlc3VtZQogLkxoYW5kbGVfcGVyOgkubG9uZwlkb19zaW5nbGVfc3RlcAogLkxkb19leGVjdmU6CS5sb25nCWRvX2V4ZWN2ZQogLkxleGVjdmVfdGFpbDoJLmxvbmcJZXhlY3ZlX3RhaWwKQEAgLTEwNzksNyArMTEwOCw4IEBACiAuTHByZWVtcHRfc2NoZWR1bGVfaXJxOgogCQkubG9uZwlwcmVlbXB0X3NjaGVkdWxlX2lycQogI2VuZGlmCi0uTHRyYWNlOgkubG9uZwlzeXNjYWxsX3RyYWNlCisuTHRyYWNlX2VudHJ5OgkubG9uZwlkb19zeXNjYWxsX3RyYWNlX2VudGVyCisuTHRyYWNlX2V4aXQ6CS5sb25nCWRvX3N5c2NhbGxfdHJhY2VfZXhpdAogLkxzY2hlZHRhaWw6CS5sb25nCXNjaGVkdWxlX3RhaWwKIC5Mc3lzY190YWJsZToJLmxvbmcJc3lzX2NhbGxfdGFibGUKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKaW5kZXggZmVlMTAxNy4uZDdjZTE1MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTUyLDkgKzUyLDkgQEAKIFNUQUNLX1NISUZUID0gUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUgogU1RBQ0tfU0laRSAgPSAxIDw8IFNUQUNLX1NISUZUCiAKLV9USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCitfVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcgfCBfVElGX1JFU1RBUlRfU1ZDIHwgX1RJRl9TSU5HTEVfU1RFUCApCi1fVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAorX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX05FRURfUkVTQ0hFRCB8IFwKIAkJIF9USUZfTUNDS19QRU5ESU5HKQogCiAjZGVmaW5lIEJBU0VEKG5hbWUpIG5hbWUtc3lzdGVtX2NhbGwoJXIxMykKQEAgLTMxMCw2ICszMTAsOCBAQAogCWpvCXN5c2NfcmVzY2hlZHVsZQogCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfU0lHUEVORElORwogCWpueglzeXNjX3NpZ3BlbmRpbmcKKwl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX05PVElGWV9SRVNVTUUKKwlqbnoJc3lzY19ub3RpZnlfcmVzdW1lCiAJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9SRVNUQVJUX1NWQwogCWpvCXN5c2NfcmVzdGFydAogCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfU0lOR0xFX1NURVAKQEAgLTM0NSw2ICszNDcsMTQgQEAKIAlqCXN5c2Nfd29ya19sb29wCiAKICMKKyMgX1RJRl9OT1RJRllfUkVTVU1FIGlzIHNldCwgY2FsbCBkb19ub3RpZnlfcmVzdW1lCisjCitzeXNjX25vdGlmeV9yZXN1bWU6CisJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncworCWxhcmwJJXIxNCxzeXNjX3dvcmtfbG9vcAorCWpnCWRvX25vdGlmeV9yZXN1bWUJIyBjYWxsIGRvX25vdGlmeV9yZXN1bWUKKworIwogIyBfVElGX1JFU1RBUlRfU1ZDIGlzIHNldCwgc2V0IHVwIHJlZ2lzdGVycyBhbmQgcmVzdGFydCBzdmMKICMKIHN5c2NfcmVzdGFydDoKQEAgLTM2NywyMCArMzc3LDE5IEBACiAJamcJZG9fc2luZ2xlX3N0ZXAJCSMgYnJhbmNoIHRvIGRvX3NpZ3RyYXAKIAogIwotIyBjYWxsIHN5c2NhbGxfdHJhY2UgYmVmb3JlIGFuZCBhZnRlciBzeXN0ZW0gY2FsbAotIyBzcGVjaWFsIGxpbmthZ2U6ICVyMTIgY29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzIGZvciB0cmFjZV9zdmMKKyMgY2FsbCB0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZW50cnkvdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQgYmVmb3JlCisjIGFuZCBhZnRlciB0aGUgc3lzdGVtIGNhbGwKICMKIHN5c2NfdHJhY2VzeXM6CiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWxhCSVyMywwCiAJc3JsCSVyNywyCiAJc3RnCSVyNyxTUF9SMiglcjE1KQotCWJyYXNsCSVyMTQsc3lzY2FsbF90cmFjZQorCWJyYXNsCSVyMTQsZG9fc3lzY2FsbF90cmFjZV9lbnRlcgogCWxnaGkJJXIwLE5SX3N5c2NhbGxzCi0JY2xnCSVyMCxTUF9SMiglcjE1KQorCWNsZ3IJJXIwLCVyMgogCWpuaAlzeXNjX3RyYWNlbm9nbwotCWxnCSVyNyxTUF9SMiglcjE1KQkJIyBzdHJhY2UgbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZQotCXNsbAklcjcsMgkJCSMgc3lzdGVtIGNhbGwKKwlzbGFnCSVyNywlcjIsMgkJIyAqNAogCWxnZgklcjgsMCglcjcsJXIxMCkKIHN5c2NfdHJhY2VnbzoKIAlsbWcJJXIzLCVyNixTUF9SMyglcjE1KQpAQCAtMzkxLDkgKzQwMCw4IEBACiAJdG0JX19USV9mbGFncys3KCVyOSksKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVQpCiAJanoJc3lzY19yZXR1cm4KIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JbGEJJXIzLDEKIAlsYXJsCSVyMTQsc3lzY19yZXR1cm4JIyByZXR1cm4gcG9pbnQgaXMgc3lzY19yZXR1cm4KLQlqZwlzeXNjYWxsX3RyYWNlCisJamcJZG9fc3lzY2FsbF90cmFjZV9leGl0CiAKICMKICMgYSBuZXcgcHJvY2VzcyBleGl0cyB0aGUga2VybmVsIHdpdGggcmV0X2Zyb21fZm9yawpAQCAtNjcyLDYgKzY4MCw4IEBACiAJam8JaW9fcmVzY2hlZHVsZQogCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfU0lHUEVORElORwogCWpueglpb19zaWdwZW5kaW5nCisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9OT1RJRllfUkVTVU1FCisJam56CWlvX25vdGlmeV9yZXN1bWUKIAlqCWlvX3Jlc3RvcmUKIGlvX3dvcmtfZG9uZToKIApAQCAtNzEyLDYgKzcyMiwxOCBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJaglpb193b3JrX2xvb3AKIAorIworIyBfVElGX05PVElGWV9SRVNVTUUgb3IgaXMgc2V0LCBjYWxsIGRvX25vdGlmeV9yZXN1bWUKKyMKK2lvX25vdGlmeV9yZXN1bWU6CisJVFJBQ0VfSVJRU19PTgorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJYnJhc2wJJXIxNCxkb19ub3RpZnlfcmVzdW1lCSMgY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJc3Ruc20JX19TRl9FTVBUWSglcjE1KSwweGZjCSMgZGlzYWJsZSBJL08gYW5kIGV4dC4gaW50ZXJydXB0cworCVRSQUNFX0lSUVNfT0ZGCisJaglpb193b3JrX2xvb3AKKwogLyoKICAqIEV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMjgxNWJmZS4uMWYzMWJlMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAKICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNzAsNiArMTcxLDEzIEBACiAJCSAqLwogCQl0bXAgPSAoYWRkcl90KSB0YXNrX3B0X3JlZ3MoY2hpbGQpLT5vcmlnX2dwcjI7CiAKKwl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXktPnJlZ3MuZnBfcmVncykgeworCQkvKgorCQkgKiBwcmV2ZW50IHJlYWRzIG9mIHBhZGRpbmcgaG9sZSBiZXR3ZWVuCisJCSAqIG9yaWdfZ3ByMiBhbmQgZnBfcmVncyBvbiBzMzkwLgorCQkgKi8KKwkJdG1wID0gMDsKKwogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qIAogCQkgKiBmbG9hdGluZyBwb2ludCByZWdzLiBhcmUgc3RvcmVkIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlCkBAIC0yNzAsNiArMjc4LDEzIEBACiAJCSAqLwogCQl0YXNrX3B0X3JlZ3MoY2hpbGQpLT5vcmlnX2dwcjIgPSBkYXRhOwogCisJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgJmR1bW15LT5yZWdzLmZwX3JlZ3MpIHsKKwkJLyoKKwkJICogcHJldmVudCB3cml0ZXMgb2YgcGFkZGluZyBob2xlIGJldHdlZW4KKwkJICogb3JpZ19ncHIyIGFuZCBmcF9yZWdzIG9uIHMzOTAuCisJCSAqLworCQlyZXR1cm4gMDsKKwogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qCiAJCSAqIGZsb2F0aW5nIHBvaW50IHJlZ3MuIGFyZSBzdG9yZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKQEAgLTQyOCw2ICs0NDMsMTMgQEAKIAkJICovCiAJCXRtcCA9ICooX191MzIqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+b3JpZ19ncHIyICsgNCk7CiAKKwl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5mcF9yZWdzKSB7CisJCS8qCisJCSAqIHByZXZlbnQgcmVhZHMgb2YgcGFkZGluZyBob2xlIGJldHdlZW4KKwkJICogb3JpZ19ncHIyIGFuZCBmcF9yZWdzIG9uIHMzOTAuCisJCSAqLworCQl0bXAgPSAwOworCiAJfSBlbHNlIGlmIChhZGRyIDwgKGFkZHJfdCkgKCZkdW1teTMyLT5yZWdzLmZwX3JlZ3MgKyAxKSkgewogCQkvKgogCQkgKiBmbG9hdGluZyBwb2ludCByZWdzLiBhcmUgc3RvcmVkIGluIHRoZSB0aHJlYWQgc3RydWN0dXJlIApAQCAtNTE0LDYgKzUzNiwxMyBAQAogCQkgKi8KIAkJKihfX3UzMiopKChhZGRyX3QpICZ0YXNrX3B0X3JlZ3MoY2hpbGQpLT5vcmlnX2dwcjIgKyA0KSA9IHRtcDsKIAorCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLmZwX3JlZ3MpIHsKKwkJLyoKKwkJICogcHJldmVudCB3cml0ZXNzIG9mIHBhZGRpbmcgaG9sZSBiZXR3ZWVuCisJCSAqIG9yaWdfZ3ByMiBhbmQgZnBfcmVncyBvbiBzMzkwLgorCQkgKi8KKwkJcmV0dXJuIDA7CisKIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3MuZnBfcmVncyArIDEpKSB7CiAJCS8qCiAJCSAqIGZsb2F0aW5nIHBvaW50IHJlZ3MuIGFyZSBzdG9yZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUgCkBAIC02MTEsNDAgKzY0MCw0NCBAQAogfQogI2VuZGlmCiAKLWFzbWxpbmthZ2Ugdm9pZAotc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCkKK2FzbWxpbmthZ2UgbG9uZyBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiBlbnRyeWV4aXQpCi0JCWF1ZGl0X3N5c2NhbGxfZXhpdChBVURJVFNDX1JFU1VMVChyZWdzLT5ncHJzWzJdKSwgcmVncy0+Z3Byc1syXSk7Ci0KLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlnb3RvIG91dDsKLQlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKLQkJZ290byBvdXQ7Ci0JcHRyYWNlX25vdGlmeShTSUdUUkFQIHwgKChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRVNZU0dPT0QpCi0JCQkJID8gMHg4MCA6IDApKTsKKwlsb25nIHJldDsKIAogCS8qCi0JICogSWYgdGhlIGRlYnVmZmVyIGhhcyBzZXQgYW4gaW52YWxpZCBzeXN0ZW0gY2FsbCBudW1iZXIsCi0JICogd2UgcHJlcGFyZSB0byBza2lwIHRoZSBzeXN0ZW0gY2FsbCByZXN0YXJ0IGhhbmRsaW5nLgorCSAqIFRoZSBzeXNjX3RyYWNlc3lzIGNvZGUgaW4gZW50cnkuUyBzdG9yZWQgdGhlIHN5c3RlbQorCSAqIGNhbGwgbnVtYmVyIHRvIGdwcnNbMl0uCiAJICovCi0JaWYgKCFlbnRyeWV4aXQgJiYgcmVncy0+Z3Byc1syXSA+PSBOUl9zeXNjYWxscykKKwlyZXQgPSByZWdzLT5ncHJzWzJdOworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSAmJgorCSAgICAodHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KHJlZ3MpIHx8CisJICAgICByZWdzLT5ncHJzWzJdID49IE5SX3N5c2NhbGxzKSkgeworCQkvKgorCQkgKiBUcmFjaW5nIGRlY2lkZWQgdGhpcyBzeXNjYWxsIHNob3VsZCBub3QgaGFwcGVuIG9yIHRoZQorCQkgKiBkZWJ1Z2dlciBzdG9yZWQgYW4gaW52YWxpZCBzeXN0ZW0gY2FsbCBudW1iZXIuIFNraXAKKwkJICogdGhlIHN5c3RlbSBjYWxsIGFuZCB0aGUgc3lzdGVtIGNhbGwgcmVzdGFydCBoYW5kbGluZy4KKwkJICovCiAJCXJlZ3MtPnRyYXAgPSAtMTsKLQotCS8qCi0JICogdGhpcyBpc24ndCB0aGUgc2FtZSBhcyBjb250aW51aW5nIHdpdGggYSBzaWduYWwsIGJ1dCBpdCB3aWxsIGRvCi0JICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKLQkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCi0JICovCi0JaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgewotCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOwotCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOworCQlyZXQgPSAtMTsKIAl9Ci0gb3V0OgotCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiAhZW50cnlleGl0KQotCQlhdWRpdF9zeXNjYWxsX2VudHJ5KHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKT9BVURJVF9BUkNIX1MzOTA6QVVESVRfQVJDSF9TMzkwWCwKLQkJCQkgICAgcmVncy0+Z3Byc1syXSwgcmVncy0+b3JpZ19ncHIyLCByZWdzLT5ncHJzWzNdLAotCQkJCSAgICByZWdzLT5ncHJzWzRdLCByZWdzLT5ncHJzWzVdKTsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkKKwkJYXVkaXRfc3lzY2FsbF9lbnRyeSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkgPworCQkJCQlBVURJVF9BUkNIX1MzOTAgOiBBVURJVF9BUkNIX1MzOTBYLAorCQkJCSAgICByZWdzLT5ncHJzWzJdLCByZWdzLT5vcmlnX2dwcjIsCisJCQkJICAgIHJlZ3MtPmdwcnNbM10sIHJlZ3MtPmdwcnNbNF0sCisJCQkJICAgIHJlZ3MtPmdwcnNbNV0pOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlX2V4aXQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQorCQlhdWRpdF9zeXNjYWxsX2V4aXQoQVVESVRTQ19SRVNVTFQocmVncy0+Z3Byc1syXSksCisJCQkJICAgcmVncy0+Z3Byc1syXSk7CisKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCisJCXRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9leGl0KHJlZ3MsIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYjk3NjgyMC4uNGY3ZmMzMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgpAQCAtNTA3LDYgKzUwOCwxMiBAQAogCQkJICovCiAJCQlpZiAoY3VycmVudC0+dGhyZWFkLnBlcl9pbmZvLnNpbmdsZV9zdGVwKQogCQkJCXNldF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFX1NURVApOworCisJCQkvKgorCQkJICogTGV0IHRyYWNpbmcga25vdyB0aGF0IHdlJ3ZlIGRvbmUgdGhlIGhhbmRsZXIgc2V0dXAuCisJCQkgKi8KKwkJCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWduciwgJmluZm8sICZrYSwgcmVncywKKwkJCQkJIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRV9TVEVQKSk7CiAJCX0KIAkJcmV0dXJuOwogCX0KQEAgLTUyNiwzICs1MzMsOSBAQAogCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RBUlRfU1ZDKTsKIAl9CiB9CisKK3ZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfTk9USUZZX1JFU1VNRSk7CisJdHJhY2Vob29rX25vdGlmeV9yZXN1bWUocmVncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCAwMGI5YjRkLi45ZThiMWY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTU4NSw2ICs1ODUsOCBAQAogCS8qIEVuYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwogCXBmYXVsdF9pbml0KCk7CiAKKwkvKiBjYWxsIGNwdSBub3RpZmllcnMgKi8KKwlub3RpZnlfY3B1X3N0YXJ0aW5nKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJLyogTWFyayB0aGlzIGNwdSBhcyBvbmxpbmUgKi8KIAlzcGluX2xvY2soJmNhbGxfbG9jayk7CiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBjNjZkMzVlLi4yZDYxNzg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0zNyw3ICszNyw3IEBACiBTWVNDQUxMKHN5c19wdHJhY2Usc3lzX3B0cmFjZSxzeXMzMl9wdHJhY2Vfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2FsYXJtLHN5c19hbGFybSxzeXMzMl9hbGFybV93cmFwcGVyKQogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgZnN0YXQgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfcGF1c2Usc3lzX3BhdXNlLHN5czMyX3BhdXNlKQorU1lTQ0FMTChzeXNfcGF1c2Usc3lzX3BhdXNlLHN5c19wYXVzZSkKIFNZU0NBTEwoc3lzX3V0aW1lLHN5c191dGltZSxjb21wYXRfc3lzX3V0aW1lX3dyYXBwZXIpCQkvKiAzMCAqLwogTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3R0eSBzeXNjYWxsICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBndHR5IHN5c2NhbGwgKi8KQEAgLTg2LDggKzg2LDggQEAKIFNZU0NBTEwoc3lzX3NldHJsaW1pdCxzeXNfc2V0cmxpbWl0LGNvbXBhdF9zeXNfc2V0cmxpbWl0X3dyYXBwZXIpCS8qIDc1ICovCiBTWVNDQUxMKHN5c19vbGRfZ2V0cmxpbWl0LHN5c19nZXRybGltaXQsY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19nZXRydXNhZ2Usc3lzX2dldHJ1c2FnZSxjb21wYXRfc3lzX2dldHJ1c2FnZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfZ2V0dGltZW9mZGF5LHN5c19nZXR0aW1lb2ZkYXksc3lzMzJfZ2V0dGltZW9mZGF5X3dyYXBwZXIpCi1TWVNDQUxMKHN5c19zZXR0aW1lb2ZkYXksc3lzX3NldHRpbWVvZmRheSxzeXMzMl9zZXR0aW1lb2ZkYXlfd3JhcHBlcikKK1NZU0NBTEwoc3lzX2dldHRpbWVvZmRheSxzeXNfZ2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5X3dyYXBwZXIpCitTWVNDQUxMKHN5c19zZXR0aW1lb2ZkYXksc3lzX3NldHRpbWVvZmRheSxjb21wYXRfc3lzX3NldHRpbWVvZmRheV93cmFwcGVyKQogU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfZ2V0Z3JvdXBzMTZfd3JhcHBlcikJLyogODAgb2xkIGdldGdyb3VwczE2IHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX3NldGdyb3VwczE2LHN5c19uaV9zeXNjYWxsLHN5czMyX3NldGdyb3VwczE2X3dyYXBwZXIpCS8qIG9sZCBzZXRncm91cHMxNiBzeXNjYWxsICovCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzZWxlY3Qgc3lzY2FsbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCBjYTExNGZlLi5iOTRlOWUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtMTY5LDYgKzE2OSw4IEBACiAKIHN0YXRpYyB2b2lkIGNsb2NrX2NvbXBhcmF0b3JfaW50ZXJydXB0KF9fdTE2IGNvZGUpCiB7CisJaWYgKFMzOTBfbG93Y29yZS5jbG9ja19jb21wYXJhdG9yID09IC0xVUxMKQorCQlzZXRfY2xvY2tfY29tcGFyYXRvcihTMzkwX2xvd2NvcmUuY2xvY2tfY29tcGFyYXRvcik7CiB9CiAKIHN0YXRpYyB2b2lkIGV0cl90aW1pbmdfYWxlcnQoc3RydWN0IGV0cl9pcnFfcGFybSAqKTsKQEAgLTEzNTQsNyArMTM1Niw3IEBACiAKIAlzdHBfcGFnZSA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKIAlyYyA9IGNoc2Nfc3N0cGMoc3RwX3BhZ2UsIFNUUF9PUF9DVFJMLCAweDAwMDApOwotCWlmIChyYyA9PSAxKQorCWlmIChyYyA9PSAwKQogCQlzZXRfYml0KENMT0NLX1NZTkNfSEFTX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpOwogCWVsc2UgaWYgKHN0cF9vbmxpbmUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUnVubmluZyBvbiBub24gU1RQIGNhcGFibGUgbWFjaGluZS5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9wcml2LmMgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwppbmRleCBkMWZhZjVjLi5jY2U0MGZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3ByaXYuYworKysgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwpAQCAtMTU3LDggKzE1Nyw4IEBACiAJaW50IHJjOwogCiAJdmNwdS0+c3RhdC5pbnN0cnVjdGlvbl9zdGZsKys7Ci0JZmFjaWxpdHlfbGlzdCAmPSB+KDFVTDw8MjQpOyAvKiBubyBzdGZsZSAqLwotCWZhY2lsaXR5X2xpc3QgJj0gfigxVUw8PDIzKTsgLyogbm8gbGFyZ2UgcGFnZXMgKi8KKwkvKiBvbmx5IHBhc3MgdGhlIGZhY2lsaXR5IGJpdHMsIHdoaWNoIHdlIGNhbiBoYW5kbGUgKi8KKwlmYWNpbGl0eV9saXN0ICY9IDB4ZmUwMGZmZjM7CiAKIAlyYyA9IGNvcHlfdG9fZ3Vlc3QodmNwdSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBzdGZsX2ZhY19saXN0KSwKIAkJCSAgICZmYWNpbGl0eV9saXN0LCBzaXplb2YoZmFjaWxpdHlfbGlzdCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9kZWxheS5jIGIvYXJjaC9zMzkwL2xpYi9kZWxheS5jCmluZGV4IGZjNmFiNjAuLjZjY2I5ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvZGVsYXkuYworKysgYi9hcmNoL3MzOTAvbGliL2RlbGF5LmMKQEAgLTEsMTQgKzEsOSBAQAogLyoKLSAqICBhcmNoL3MzOTAvbGliL2RlbGF5LmMKICAqICAgIFByZWNpc2UgRGVsYXkgTG9vcHMgZm9yIFMzOTAKICAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAotICoKLSAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9saWIvZGVsYXkuYyIKLSAqICAgIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwotICogICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk5LDIwMDgKKyAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPiwKKyAqCQkgSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+LAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMjksMzAgKzI0LDMxIEBACiAJYXNtIHZvbGF0aWxlKCIwOiBicmN0ICUwLDBiIiA6IDogImQiICgobG9vcHMvMikgKyAxKSk7CiB9CiAKLS8qCi0gKiBXYWl0cyBmb3IgJ3VzZWNzJyBtaWNyb3NlY29uZHMgdXNpbmcgdGhlIFRPRCBjbG9jayBjb21wYXJhdG9yLgotICovCi12b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCitzdGF0aWMgdm9pZCBfX3VkZWxheV9kaXNhYmxlZCh1bnNpZ25lZCBsb25nIHVzZWNzKQogewotCXU2NCBlbmQsIHRpbWUsIG9sZF9jYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgY3IwLCBtYXNrLCBkdW1teTsKLQlpbnQgaXJxX2NvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBjcjAsIGNyMF9zYXZlZDsKKwl1NjQgY2xvY2tfc2F2ZWQ7CiAKLQlpcnFfY29udGV4dCA9IGluX2ludGVycnVwdCgpOwotCWlmICghaXJxX2NvbnRleHQpCi0JCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkgewotCQlvbGRfY2MgPSBsb2NhbF90aWNrX2Rpc2FibGUoKTsKLQkJUzM5MF9sb3djb3JlLmNsb2NrX2NvbXBhcmF0b3IgPSAtMVVMTDsKLQkJX19jdGxfc3RvcmUoY3IwLCAwLCAwKTsKLQkJZHVtbXkgPSAoY3IwICYgMHhmZmZmMDBlMCkgfCAweDAwMDAwODAwOwotCQlfX2N0bF9sb2FkKGR1bW15ICwgMCwgMCk7Ci0JCW1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19XQUlUIHwgUFNXX01BU0tfRVhUOwotCX0gZWxzZQotCQltYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfV0FJVCB8Ci0JCQlQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19JTzsKKwljbG9ja19zYXZlZCA9IGxvY2FsX3RpY2tfZGlzYWJsZSgpOworCXNldF9jbG9ja19jb21wYXJhdG9yKGdldF9jbG9jaygpICsgKCh1NjQpIHVzZWNzIDw8IDEyKSk7CisJX19jdGxfc3RvcmUoY3IwX3NhdmVkLCAwLCAwKTsKKwljcjAgPSAoY3IwX3NhdmVkICYgMHhmZmZmMDBlMCkgfCAweDAwMDAwODAwOworCV9fY3RsX2xvYWQoY3IwICwgMCwgMCk7CisJbWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfCBQU1dfTUFTS19FWFQ7CisJdHJhY2VfaGFyZGlycXNfb24oKTsKKwlfX2xvYWRfcHN3X21hc2sobWFzayk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlfX2N0bF9sb2FkKGNyMF9zYXZlZCwgMCwgMCk7CisJbG9jYWxfdGlja19lbmFibGUoY2xvY2tfc2F2ZWQpOworCXNldF9jbG9ja19jb21wYXJhdG9yKFMzOTBfbG93Y29yZS5jbG9ja19jb21wYXJhdG9yKTsKK30KIAorc3RhdGljIHZvaWQgX191ZGVsYXlfZW5hYmxlZCh1bnNpZ25lZCBsb25nIHVzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1NjQgZW5kLCB0aW1lOworCisJbWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19JTzsKIAllbmQgPSBnZXRfY2xvY2soKSArICgodTY0KSB1c2VjcyA8PCAxMik7CiAJZG8gewogCQl0aW1lID0gZW5kIDwgUzM5MF9sb3djb3JlLmNsb2NrX2NvbXBhcmF0b3IgPwpAQCAtNjIsMTMgKzU4LDUwIEBACiAJCV9fbG9hZF9wc3dfbWFzayhtYXNrKTsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAl9IHdoaWxlIChnZXRfY2xvY2soKSA8IGVuZCk7Ci0KLQlpZiAocmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpKSB7Ci0JCV9fY3RsX2xvYWQoY3IwLCAwLCAwKTsKLQkJbG9jYWxfdGlja19lbmFibGUob2xkX2NjKTsKLQl9Ci0JaWYgKCFpcnFfY29udGV4dCkKLQkJX2xvY2FsX2JoX2VuYWJsZSgpOwogCXNldF9jbG9ja19jb21wYXJhdG9yKFMzOTBfbG93Y29yZS5jbG9ja19jb21wYXJhdG9yKTsKK30KKworLyoKKyAqIFdhaXRzIGZvciAndXNlY3MnIG1pY3Jvc2Vjb25kcyB1c2luZyB0aGUgVE9EIGNsb2NrIGNvbXBhcmF0b3IuCisgKi8KK3ZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChpbl9pcnEoKSkgeworCQlfX3VkZWxheV9kaXNhYmxlZCh1c2Vjcyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaW5fc29mdGlycSgpKSB7CisJCWlmIChyYXdfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncykpCisJCQlfX3VkZWxheV9kaXNhYmxlZCh1c2Vjcyk7CisJCWVsc2UKKwkJCV9fdWRlbGF5X2VuYWJsZWQodXNlY3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkgeworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCV9fdWRlbGF5X2Rpc2FibGVkKHVzZWNzKTsKKwkJX2xvY2FsX2JoX2VuYWJsZSgpOworCQlnb3RvIG91dDsKKwl9CisJX191ZGVsYXlfZW5hYmxlZCh1c2Vjcyk7CitvdXQ6CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBTaW1wbGUgdWRlbGF5IHZhcmlhbnQuIFRvIGJlIHVzZWQgb24gc3RhcnR1cCBhbmQgcmVib290CisgKiB3aGVuIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpc24ndCB3b3JraW5nLgorICovCit2b2lkIHVkZWxheV9zaW1wbGUodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwl1NjQgZW5kOworCisJZW5kID0gZ2V0X2Nsb2NrKCkgKyAoKHU2NCkgdXNlY3MgPDwgMTIpOworCXdoaWxlIChnZXRfY2xvY2soKSA8IGVuZCkKKwkJY3B1X3JlbGF4KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZXh0bWVtLmMgYi9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKaW5kZXggZjIzMWY1ZS4uNTgwZmM2NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2V4dG1lbS5jCisrKyBiL2FyY2gvczM5MC9tbS9leHRtZW0uYwpAQCAtNDMsMjEgKzQzLDQxIEBACiAjZGVmaW5lIERDU1NfRklORFNFRyAgICAweDBjCiAjZGVmaW5lIERDU1NfTE9BRE5PTFkgICAweDEwCiAjZGVmaW5lIERDU1NfU0VHRVhUICAgICAweDE4CisjZGVmaW5lIERDU1NfTE9BRFNIUlgJMHgyMAorI2RlZmluZSBEQ1NTX0xPQUROU1JYCTB4MjQKKyNkZWZpbmUgRENTU19GSU5EU0VHWAkweDJjCisjZGVmaW5lIERDU1NfU0VHRVhUWAkweDM4CiAjZGVmaW5lIERDU1NfRklORFNFR0EgICAweDBjCiAKIHN0cnVjdCBxcmFuZ2UgewotCXVuc2lnbmVkIGludCAgc3RhcnQ7IC8vIDNieXRlIHN0YXJ0IGFkZHJlc3MsIDEgYnl0ZSB0eXBlCi0JdW5zaWduZWQgaW50ICBlbmQ7ICAgLy8gM2J5dGUgZW5kIGFkZHJlc3MsIDEgYnl0ZSByZXNlcnZlZAorCXVuc2lnbmVkIGxvbmcgIHN0YXJ0OyAvKiBsYXN0IGJ5dGUgdHlwZSAqLworCXVuc2lnbmVkIGxvbmcgIGVuZDsgICAvKiBsYXN0IGJ5dGUgcmVzZXJ2ZWQgKi8KIH07CiAKIHN0cnVjdCBxb3V0NjQgewotCWludCBzZWdzdGFydDsKLQlpbnQgc2VnZW5kOworCXVuc2lnbmVkIGxvbmcgc2Vnc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzZWdlbmQ7CiAJaW50IHNlZ2NudDsKIAlpbnQgc2VncmNudDsKIAlzdHJ1Y3QgcXJhbmdlIHJhbmdlWzZdOwogfTsKIAorI2lmZGVmIENPTkZJR182NEJJVAorc3RydWN0IHFyYW5nZV9vbGQgeworCXVuc2lnbmVkIGludCBzdGFydDsgLyogbGFzdCBieXRlIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgZW5kOyAgIC8qIGxhc3QgYnl0ZSByZXNlcnZlZCAqLworfTsKKworLyogb3V0cHV0IGFyZWEgZm9ybWF0IGZvciB0aGUgRGlhZyB4JzY0JyBvbGQgc3ViY29kZSB4JzE4JyAqLworc3RydWN0IHFvdXQ2NF9vbGQgeworCWludCBzZWdzdGFydDsKKwlpbnQgc2VnZW5kOworCWludCBzZWdjbnQ7CisJaW50IHNlZ3JjbnQ7CisJc3RydWN0IHFyYW5nZV9vbGQgcmFuZ2VbNl07Cit9OworI2VuZGlmCisKIHN0cnVjdCBxaW42NCB7CiAJY2hhciBxb3Bjb2RlOwogCWNoYXIgcnNydjFbM107CkBAIC04Niw2ICsxMDYsNTUgQEAKIHN0YXRpYyBMSVNUX0hFQUQoZGNzc19saXN0KTsKIHN0YXRpYyBjaGFyICpzZWd0eXBlX3N0cmluZ1tdID0geyAiU1ciLCAiRVciLCAiU1IiLCAiRVIiLCAiU04iLCAiRU4iLCAiU0MiLAogCQkJCQkiRVcvRU4tTUlYRUQiIH07CitzdGF0aWMgaW50IGxvYWRzaHJfc2NvZGUsIGxvYWRuc3Jfc2NvZGUsIGZpbmRzZWdfc2NvZGU7CitzdGF0aWMgaW50IHNlZ2V4dF9zY29kZSwgcHVyZ2VzZWdfc2NvZGU7CitzdGF0aWMgaW50IHNjb2RlX3NldDsKKworLyogc2V0IGNvcnJlY3QgRGlhZyB4JzY0JyBzdWJjb2Rlcy4gKi8KK3N0YXRpYyBpbnQKK2Rjc3Nfc2V0X3N1YmNvZGVzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHXzY0QklUCisJY2hhciAqbmFtZSA9IGttYWxsb2MoOCAqIHNpemVvZihjaGFyKSwgR0ZQX0RNQSk7CisJdW5zaWduZWQgbG9uZyByeCwgcnk7CisJaW50IHJjOworCisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyeCA9ICh1bnNpZ25lZCBsb25nKSBuYW1lOworCXJ5ID0gRENTU19GSU5EU0VHWDsKKworCXN0cmNweShuYW1lLCAiZHVtbXkiKTsKKwlhc20gdm9sYXRpbGUoCisJCSIJZGlhZwklMCwlMSwweDY0XG4iCisJCSIwOglpcG0JJTJcbiIKKwkJIglzcmwJJTIsMjhcbiIKKwkJIglqCTJmXG4iCisJCSIxOglsYQklMiwzXG4iCisJCSIyOlxuIgorCQlFWF9UQUJMRSgwYiwgMWIpCisJCTogIitkIiAocngpLCAiK2QiIChyeSksICI9ZCIgKHJjKSA6IDogImNjIik7CisKKwlrZnJlZShuYW1lKTsKKwkvKiBEaWFnIHgnNjQnIG5ldyBzdWJjb2RlcyBhcmUgc3VwcG9ydGVkLCBzZXQgdG8gbmV3IHN1YmNvZGVzICovCisJaWYgKHJjICE9IDMpIHsKKwkJbG9hZHNocl9zY29kZSA9IERDU1NfTE9BRFNIUlg7CisJCWxvYWRuc3Jfc2NvZGUgPSBEQ1NTX0xPQUROU1JYOworCQlwdXJnZXNlZ19zY29kZSA9IERDU1NfUFVSR0VTRUc7CisJCWZpbmRzZWdfc2NvZGUgPSBEQ1NTX0ZJTkRTRUdYOworCQlzZWdleHRfc2NvZGUgPSBEQ1NTX1NFR0VYVFg7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCS8qIERpYWcgeCc2NCcgbmV3IHN1YmNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gb2xkIHN1YmNvZGVzICovCisJbG9hZHNocl9zY29kZSA9IERDU1NfTE9BRE5PTFk7CisJbG9hZG5zcl9zY29kZSA9IERDU1NfTE9BRE5TUjsKKwlwdXJnZXNlZ19zY29kZSA9IERDU1NfUFVSR0VTRUc7CisJZmluZHNlZ19zY29kZSA9IERDU1NfRklORFNFRzsKKwlzZWdleHRfc2NvZGUgPSBEQ1NTX1NFR0VYVDsKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIENyZWF0ZSB0aGUgOCBieXRlcywgZWJjZGljIFZNIHNlZ21lbnQgbmFtZSBmcm9tCkBAIC0xMzUsMjUgKzIwNCw0NSBAQAogICogUGVyZm9ybSBhIGZ1bmN0aW9uIG9uIGEgZGNzcyBzZWdtZW50LgogICovCiBzdGF0aWMgaW5saW5lIGludAotZGNzc19kaWFnIChfX3U4IGZ1bmMsIHZvaWQgKnBhcmFtZXRlciwKK2Rjc3NfZGlhZyhpbnQgKmZ1bmMsIHZvaWQgKnBhcmFtZXRlciwKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqcmV0MSwgdW5zaWduZWQgbG9uZyAqcmV0MikKIHsKIAl1bnNpZ25lZCBsb25nIHJ4LCByeTsKIAlpbnQgcmM7CiAKKwlpZiAoc2NvZGVfc2V0ID09IDApIHsKKwkJcmMgPSBkY3NzX3NldF9zdWJjb2RlcygpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlzY29kZV9zZXQgPSAxOworCX0KIAlyeCA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbWV0ZXI7Ci0JcnkgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKLQlhc20gdm9sYXRpbGUoCisJcnkgPSAodW5zaWduZWQgbG9uZykgKmZ1bmM7CisKICNpZmRlZiBDT05GSUdfNjRCSVQKLQkJIglzYW0zMVxuIgotCQkiCWRpYWcJJTAsJTEsMHg2NFxuIgotCQkiCXNhbTY0XG4iCisJLyogNjQtYml0IERpYWcgeCc2NCcgbmV3IHN1YmNvZGUsIGtlZXAgaW4gNjQtYml0IGFkZHJlc3NpbmcgbW9kZSAqLworCWlmICgqZnVuYyA+IERDU1NfU0VHRVhUKQorCQlhc20gdm9sYXRpbGUoCisJCQkiCWRpYWcJJTAsJTEsMHg2NFxuIgorCQkJIglpcG0JJTJcbiIKKwkJCSIJc3JsCSUyLDI4XG4iCisJCQk6ICIrZCIgKHJ4KSwgIitkIiAocnkpLCAiPWQiIChyYykgOiA6ICJjYyIpOworCS8qIDMxLWJpdCBEaWFnIHgnNjQnIG9sZCBzdWJjb2RlLCBzd2l0Y2ggdG8gMzEtYml0IGFkZHJlc3NpbmcgbW9kZSAqLworCWVsc2UKKwkJYXNtIHZvbGF0aWxlKAorCQkJIglzYW0zMVxuIgorCQkJIglkaWFnCSUwLCUxLDB4NjRcbiIKKwkJCSIJc2FtNjRcbiIKKwkJCSIJaXBtCSUyXG4iCisJCQkiCXNybAklMiwyOFxuIgorCQkJOiAiK2QiIChyeCksICIrZCIgKHJ5KSwgIj1kIiAocmMpIDogOiAiY2MiKTsKICNlbHNlCisJYXNtIHZvbGF0aWxlKAogCQkiCWRpYWcJJTAsJTEsMHg2NFxuIgotI2VuZGlmCiAJCSIJaXBtCSUyXG4iCiAJCSIJc3JsCSUyLDI4XG4iCiAJCTogIitkIiAocngpLCAiK2QiIChyeSksICI9ZCIgKHJjKSA6IDogImNjIik7CisjZW5kaWYKIAkqcmV0MSA9IHJ4OwogCSpyZXQyID0gcnk7CiAJcmV0dXJuIHJjOwpAQCAtMTkwLDE0ICsyNzksNDUgQEAKIAlxaW4tPnFvdXRsZW4gPSBzaXplb2Yoc3RydWN0IHFvdXQ2NCk7CiAJbWVtY3B5IChxaW4tPnFuYW1lLCBzZWctPmRjc3NfbmFtZSwgOCk7CiAKLQlkaWFnX2NjID0gZGNzc19kaWFnIChEQ1NTX1NFR0VYVCwgcWluLCAmZHVtbXksICZ2bXJjKTsKKwlkaWFnX2NjID0gZGNzc19kaWFnKCZzZWdleHRfc2NvZGUsIHFpbiwgJmR1bW15LCAmdm1yYyk7CiAKKwlpZiAoZGlhZ19jYyA8IDApIHsKKwkJcmMgPSBkaWFnX2NjOworCQlnb3RvIG91dF9mcmVlOworCX0KIAlpZiAoZGlhZ19jYyA+IDEpIHsKIAkJUFJJTlRfV0FSTiAoInNlZ21lbnRfdHlwZTogZGlhZyByZXR1cm5lZCBlcnJvciAlbGRcbiIsIHZtcmMpOwogCQlyYyA9IGRjc3NfZGlhZ190cmFuc2xhdGVfcmMgKHZtcmMpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorI2lmZGVmIENPTkZJR182NEJJVAorCS8qIE9ubHkgb2xkIGZvcm1hdCBvZiBvdXRwdXQgYXJlYSBvZiBEaWFnbm9zZSB4JzY0JyBpcyBzdXBwb3J0ZWQsCisJICAgY29weSBkYXRhIGZvciB0aGUgbmV3IGZvcm1hdC4gKi8KKwlpZiAoc2VnZXh0X3Njb2RlID09IERDU1NfU0VHRVhUKSB7CisJCXN0cnVjdCBxb3V0NjRfb2xkICpxb3V0X29sZDsKKwkJcW91dF9vbGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcW91dDY0X29sZCksIEdGUF9ETUEpOworCQlpZiAocW91dF9vbGQgPT0gTlVMTCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQltZW1jcHkocW91dF9vbGQsIHFvdXQsIHNpemVvZihzdHJ1Y3QgcW91dDY0X29sZCkpOworCQlxb3V0LT5zZWdzdGFydCA9ICh1bnNpZ25lZCBsb25nKSBxb3V0X29sZC0+c2Vnc3RhcnQ7CisJCXFvdXQtPnNlZ2VuZCA9ICh1bnNpZ25lZCBsb25nKSBxb3V0X29sZC0+c2VnZW5kOworCQlxb3V0LT5zZWdjbnQgPSBxb3V0X29sZC0+c2VnY250OworCQlxb3V0LT5zZWdyY250ID0gcW91dF9vbGQtPnNlZ3JjbnQ7CisKKwkJaWYgKHFvdXQtPnNlZ2NudCA+IDYpCisJCQlxb3V0LT5zZWdyY250ID0gNjsKKwkJZm9yIChpID0gMDsgaSA8IHFvdXQtPnNlZ3JjbnQ7IGkrKykgeworCQkJcW91dC0+cmFuZ2VbaV0uc3RhcnQgPQorCQkJCSh1bnNpZ25lZCBsb25nKSBxb3V0X29sZC0+cmFuZ2VbaV0uc3RhcnQ7CisJCQlxb3V0LT5yYW5nZVtpXS5lbmQgPQorCQkJCSh1bnNpZ25lZCBsb25nKSBxb3V0X29sZC0+cmFuZ2VbaV0uZW5kOworCQl9CisJCWtmcmVlKHFvdXRfb2xkKTsKKwl9CisjZW5kaWYKIAlpZiAocW91dC0+c2VnY250ID4gNikgewogCQlyYyA9IC1FTk9UU1VQUDsKIAkJZ290byBvdXRfZnJlZTsKQEAgLTI2OSw2ICszODksMzAgQEAKIH0KIAogLyoKKyAqIGNoZWNrIGlmIHNlZ21lbnQgY29sbGlkZXMgd2l0aCBvdGhlciBzZWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkCisgKiByZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgY2FzZSwgMCBpZiBubyBjb2xsaXNpb24gd2FzIGZvdW5kCisgKi8KK3N0YXRpYyBpbnQKK3NlZ21lbnRfb3ZlcmxhcHNfb3RoZXJzIChzdHJ1Y3QgZGNzc19zZWdtZW50ICpzZWcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgZGNzc19zZWdtZW50ICp0bXA7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGNzc19sb2NrKSk7CisJbGlzdF9mb3JfZWFjaChsLCAmZGNzc19saXN0KSB7CisJCXRtcCA9IGxpc3RfZW50cnkobCwgc3RydWN0IGRjc3Nfc2VnbWVudCwgbGlzdCk7CisJCWlmICgodG1wLT5zdGFydF9hZGRyID4+IDIwKSA+IChzZWctPmVuZCA+PiAyMCkpCisJCQljb250aW51ZTsKKwkJaWYgKCh0bXAtPmVuZCA+PiAyMCkgPCAoc2VnLT5zdGFydF9hZGRyID4+IDIwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2VnID09IHRtcCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiByZWFsIHNlZ21lbnQgbG9hZGluZyBmdW5jdGlvbiwgY2FsbGVkIGZyb20gc2VnbWVudF9sb2FkCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTI3Niw3ICs0MjAsOCBAQAogewogCXN0cnVjdCBkY3NzX3NlZ21lbnQgKnNlZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkY3NzX3NlZ21lbnQpLAogCQkJR0ZQX0RNQSk7Ci0JaW50IGRjc3NfY29tbWFuZCwgcmMsIGRpYWdfY2M7CisJaW50IHJjLCBkaWFnX2NjOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGR1bW15OwogCiAJaWYgKHNlZyA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKQEAgLTI4Nyw2ICs0MzIsMTMgQEAKIAlpZiAocmMgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCisJaWYgKGxvYWRzaHJfc2NvZGUgPT0gRENTU19MT0FEU0hSWCkgeworCQlpZiAoc2VnbWVudF9vdmVybGFwc19vdGhlcnMoc2VnKSkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCiAJcmMgPSB2bWVtX2FkZF9tYXBwaW5nKHNlZy0+c3RhcnRfYWRkciwgc2VnLT5lbmQgLSBzZWctPnN0YXJ0X2FkZHIgKyAxKTsKIAogCWlmIChyYykKQEAgLTMxNiwyMCArNDY4LDI4IEBACiAJfQogCiAJaWYgKGRvX25vbnNoYXJlZCkKLQkJZGNzc19jb21tYW5kID0gRENTU19MT0FETlNSOworCQlkaWFnX2NjID0gZGNzc19kaWFnKCZsb2FkbnNyX3Njb2RlLCBzZWctPmRjc3NfbmFtZSwKKwkJCQkmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKIAllbHNlCi0JCWRjc3NfY29tbWFuZCA9IERDU1NfTE9BRE5PTFk7Ci0KLQlkaWFnX2NjID0gZGNzc19kaWFnKGRjc3NfY29tbWFuZCwgc2VnLT5kY3NzX25hbWUsCi0JCQkmc2VnLT5zdGFydF9hZGRyLCAmc2VnLT5lbmQpOwotCWlmIChkaWFnX2NjID4gMSkgewotCQlQUklOVF9XQVJOICgic2VnbWVudF9sb2FkOiBjb3VsZCBub3QgbG9hZCBzZWdtZW50ICVzIC0gIgotCQkJCSJkaWFnIHJldHVybmVkIGVycm9yICglbGQpXG4iLG5hbWUsc2VnLT5lbmQpOwotCQlyYyA9IGRjc3NfZGlhZ190cmFuc2xhdGVfcmMgKHNlZy0+ZW5kKTsKLQkJZGNzc19kaWFnKERDU1NfUFVSR0VTRUcsIHNlZy0+ZGNzc19uYW1lLAotCQkJCSZzZWctPnN0YXJ0X2FkZHIsICZzZWctPmVuZCk7CisJCWRpYWdfY2MgPSBkY3NzX2RpYWcoJmxvYWRzaHJfc2NvZGUsIHNlZy0+ZGNzc19uYW1lLAorCQkJCSZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOworCWlmIChkaWFnX2NjIDwgMCkgeworCQlkY3NzX2RpYWcoJnB1cmdlc2VnX3Njb2RlLCBzZWctPmRjc3NfbmFtZSwKKwkJCQkmZHVtbXksICZkdW1teSk7CisJCXJjID0gZGlhZ19jYzsKIAkJZ290byBvdXRfcmVzb3VyY2U7CiAJfQorCWlmIChkaWFnX2NjID4gMSkgeworCQlQUklOVF9XQVJOICgic2VnbWVudF9sb2FkOiBjb3VsZCBub3QgbG9hZCBzZWdtZW50ICVzIC0gIgorCQkJCSJkaWFnIHJldHVybmVkIGVycm9yICglbGQpXG4iLAorCQkJCW5hbWUsIGVuZF9hZGRyKTsKKwkJcmMgPSBkY3NzX2RpYWdfdHJhbnNsYXRlX3JjKGVuZF9hZGRyKTsKKwkJZGNzc19kaWFnKCZwdXJnZXNlZ19zY29kZSwgc2VnLT5kY3NzX25hbWUsCisJCQkJJmR1bW15LCAmZHVtbXkpOworCQlnb3RvIG91dF9yZXNvdXJjZTsKKwl9CisJc2VnLT5zdGFydF9hZGRyID0gc3RhcnRfYWRkcjsKKwlzZWctPmVuZCA9IGVuZF9hZGRyOwogCXNlZy0+ZG9fbm9uc2hhcmVkID0gZG9fbm9uc2hhcmVkOwogCWF0b21pY19zZXQoJnNlZy0+cmVmX2NvdW50LCAxKTsKIAlsaXN0X2FkZCgmc2VnLT5saXN0LCAmZGNzc19saXN0KTsKQEAgLTQyMyw4ICs1ODMsOCBAQAogc2VnbWVudF9tb2RpZnlfc2hhcmVkIChjaGFyICpuYW1lLCBpbnQgZG9fbm9uc2hhcmVkKQogewogCXN0cnVjdCBkY3NzX3NlZ21lbnQgKnNlZzsKLQl1bnNpZ25lZCBsb25nIGR1bW15OwotCWludCBkY3NzX2NvbW1hbmQsIHJjLCBkaWFnX2NjOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGR1bW15OworCWludCByYywgZGlhZ19jYzsKIAogCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKQEAgLTQ0NSwzOCArNjA1LDUxIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJcmVsZWFzZV9yZXNvdXJjZShzZWctPnJlcyk7Ci0JaWYgKGRvX25vbnNoYXJlZCkgewotCQlkY3NzX2NvbW1hbmQgPSBEQ1NTX0xPQUROU1I7CisJaWYgKGRvX25vbnNoYXJlZCkKIAkJc2VnLT5yZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1JFQURPTkxZOwotCX0gZWxzZSB7Ci0JCWRjc3NfY29tbWFuZCA9IERDU1NfTE9BRE5PTFk7CisJZWxzZQogCQlpZiAoc2VnLT52bV9zZWd0eXBlID09IFNFR19UWVBFX1NSIHx8CiAJCSAgICBzZWctPnZtX3NlZ3R5cGUgPT0gU0VHX1RZUEVfRVIpCiAJCQlzZWctPnJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9SRUFET05MWTsKLQl9CisKIAlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHNlZy0+cmVzKSkgewogCQlQUklOVF9XQVJOKCJzZWdtZW50X21vZGlmeV9zaGFyZWQ6IGNvdWxkIG5vdCByZWxvYWQgc2VnbWVudCAlcyIKIAkJCSAgICIgLSBvdmVybGFwcGluZyByZXNvdXJjZXNcbiIsIG5hbWUpOwogCQlyYyA9IC1FQlVTWTsKIAkJa2ZyZWUoc2VnLT5yZXMpOwotCQlnb3RvIG91dF9kZWw7CisJCWdvdG8gb3V0X2RlbF9tZW07CiAJfQotCWRjc3NfZGlhZyhEQ1NTX1BVUkdFU0VHLCBzZWctPmRjc3NfbmFtZSwgJmR1bW15LCAmZHVtbXkpOwotCWRpYWdfY2MgPSBkY3NzX2RpYWcoZGNzc19jb21tYW5kLCBzZWctPmRjc3NfbmFtZSwKLQkJCSZzZWctPnN0YXJ0X2FkZHIsICZzZWctPmVuZCk7CisKKwlkY3NzX2RpYWcoJnB1cmdlc2VnX3Njb2RlLCBzZWctPmRjc3NfbmFtZSwgJmR1bW15LCAmZHVtbXkpOworCWlmIChkb19ub25zaGFyZWQpCisJCWRpYWdfY2MgPSBkY3NzX2RpYWcoJmxvYWRuc3Jfc2NvZGUsIHNlZy0+ZGNzc19uYW1lLAorCQkJCSZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOworCWVsc2UKKwkJZGlhZ19jYyA9IGRjc3NfZGlhZygmbG9hZHNocl9zY29kZSwgc2VnLT5kY3NzX25hbWUsCisJCQkJJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CisJaWYgKGRpYWdfY2MgPCAwKSB7CisJCXJjID0gZGlhZ19jYzsKKwkJZ290byBvdXRfZGVsX3JlczsKKwl9CiAJaWYgKGRpYWdfY2MgPiAxKSB7CiAJCVBSSU5UX1dBUk4gKCJzZWdtZW50X21vZGlmeV9zaGFyZWQ6IGNvdWxkIG5vdCByZWxvYWQgc2VnbWVudCAlcyIKLQkJCQkiIC0gZGlhZyByZXR1cm5lZCBlcnJvciAoJWxkKVxuIixuYW1lLHNlZy0+ZW5kKTsKLQkJcmMgPSBkY3NzX2RpYWdfdHJhbnNsYXRlX3JjIChzZWctPmVuZCk7Ci0JCWdvdG8gb3V0X2RlbDsKKwkJCQkiIC0gZGlhZyByZXR1cm5lZCBlcnJvciAoJWxkKVxuIiwKKwkJCQluYW1lLCBlbmRfYWRkcik7CisJCXJjID0gZGNzc19kaWFnX3RyYW5zbGF0ZV9yYyhlbmRfYWRkcik7CisJCWdvdG8gb3V0X2RlbF9yZXM7CiAJfQorCXNlZy0+c3RhcnRfYWRkciA9IHN0YXJ0X2FkZHI7CisJc2VnLT5lbmQgPSBlbmRfYWRkcjsKIAlzZWctPmRvX25vbnNoYXJlZCA9IGRvX25vbnNoYXJlZDsKIAlyYyA9IDA7CiAJZ290byBvdXRfdW5sb2NrOwotIG91dF9kZWw6Cisgb3V0X2RlbF9yZXM6CisJcmVsZWFzZV9yZXNvdXJjZShzZWctPnJlcyk7CisJa2ZyZWUoc2VnLT5yZXMpOworIG91dF9kZWxfbWVtOgogCXZtZW1fcmVtb3ZlX21hcHBpbmcoc2VnLT5zdGFydF9hZGRyLCBzZWctPmVuZCAtIHNlZy0+c3RhcnRfYWRkciArIDEpOwogCWxpc3RfZGVsKCZzZWctPmxpc3QpOwotCWRjc3NfZGlhZyhEQ1NTX1BVUkdFU0VHLCBzZWctPmRjc3NfbmFtZSwgJmR1bW15LCAmZHVtbXkpOworCWRjc3NfZGlhZygmcHVyZ2VzZWdfc2NvZGUsIHNlZy0+ZGNzc19uYW1lLCAmZHVtbXksICZkdW1teSk7CiAJa2ZyZWUoc2VnKTsKICBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGNzc19sb2NrKTsKQEAgLTUxMCw3ICs2ODMsNyBAQAogCWtmcmVlKHNlZy0+cmVzKTsKIAl2bWVtX3JlbW92ZV9tYXBwaW5nKHNlZy0+c3RhcnRfYWRkciwgc2VnLT5lbmQgLSBzZWctPnN0YXJ0X2FkZHIgKyAxKTsKIAlsaXN0X2RlbCgmc2VnLT5saXN0KTsKLQlkY3NzX2RpYWcoRENTU19QVVJHRVNFRywgc2VnLT5kY3NzX25hbWUsICZkdW1teSwgJmR1bW15KTsKKwlkY3NzX2RpYWcoJnB1cmdlc2VnX3Njb2RlLCBzZWctPmRjc3NfbmFtZSwgJmR1bW15LCAmZHVtbXkpOwogCWtmcmVlKHNlZyk7CiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGNzc19sb2NrKTsKQEAgLTU0NSw3ICs3MTgsNyBAQAogCWVuZHBmbiA9IChzZWctPmVuZCkgPj4gUEFHRV9TSElGVDsKIAlzcHJpbnRmKGNtZDEsICJERUZTRUcgJXMiLCBuYW1lKTsKIAlmb3IgKGk9MDsgaTxzZWctPnNlZ2NudDsgaSsrKSB7Ci0JCXNwcmludGYoY21kMStzdHJsZW4oY21kMSksICIgJVgtJVggJXMiLAorCQlzcHJpbnRmKGNtZDErc3RybGVuKGNtZDEpLCAiICVsWC0lbFggJXMiLAogCQkJc2VnLT5yYW5nZVtpXS5zdGFydCA+PiBQQUdFX1NISUZULAogCQkJc2VnLT5yYW5nZVtpXS5lbmQgPj4gUEFHRV9TSElGVCwKIAkJCXNlZ3R5cGVfc3RyaW5nW3NlZy0+cmFuZ2VbaV0uc3RhcnQgJiAweGZmXSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCBmMDE0NDlhLi5lZTAyZGIxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTE4OSw3ICsxODksNyBAQAogfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWF8zMkJJVCkKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIGV4dGVybiBpbnQgZHVtcF90YXNrX3JlZ3MgKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBlbGZfZ3JlZ3NldF90ICopOwogZXh0ZXJuIGludCBkdW1wX3Rhc2tfZnB1IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zbXAuYyBiL2FyY2gvc2gva2VybmVsL3NtcC5jCmluZGV4IDYwYzUwODQuLjAwMTc3OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NtcC5jCkBAIC04Miw2ICs4Miw4IEBACiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAorCW5vdGlmeV9jcHVfc3RhcnRpbmcoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCWNhbGlicmF0ZV9kZWxheSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IGEyMTQwMDIuLjk3NjcxZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTIwLDYgKzIwLDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19HUElPCisJYm9vbAorCWhlbHAKKwkgIEdlbmVyaWMgR1BJTyBBUEkgc3VwcG9ydAorCiBjb25maWcgQVJDSF9OT19WSVJUX1RPX0JVUwogCWRlZl9ib29sIHkKIApAQCAtNjksNiArNzQsOSBAQAogCXNlbGVjdCBIQVZFX09QUk9GSUxFCiAJc2VsZWN0IEhBVkVfQVJDSF9LR0RCIGlmICFTTVAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSworCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBSVENfQ0xBU1MKKwlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKIAogIyBJZGVudGlmeSB0aGlzIGFzIGEgU3BhcmMzMiBidWlsZAogY29uZmlnIFNQQVJDMzIKQEAgLTIwNCwxNyArMjEyLDYgQEAKIAkgIEVuYWJsZSBwb3dlciBtYW5hZ2VtZW50IGFuZCBDUFUgc3RhbmRieSBmZWF0dXJlcyBvbiBzdXBwb3J0ZWQKIAkgIFNQQVJDIHBsYXRmb3Jtcy4KIAotY29uZmlnIFNVTjQKLQlib29sICJTdXBwb3J0IGZvciBTVU40IG1hY2hpbmVzIChkaXNhYmxlcyBTVU40W0NETV0gc3VwcG9ydCkiCi0JZGVwZW5kcyBvbiAhU01QCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiwgYW5kIG9ubHkgaWYsIHlvdXIgbWFjaGluZSBpcyBhIHN1bjQuIE5vdGUgdGhhdAotCSAgYSBrZXJuZWwgY29tcGlsZWQgd2l0aCB0aGlzIG9wdGlvbiB3aWxsIHJ1biBvbmx5IG9uIHN1bjQuCi0JICAoQW5kIHRoZSBjdXJyZW50IHZlcnNpb24gd2lsbCBwcm9iYWJseSB3b3JrIG9ubHkgb24gc3VuNC8zMzAuKQotCi1pZiAhU1VONAotCiBjb25maWcgUENJCiAJYm9vbCAiU3VwcG9ydCBmb3IgUENJIGFuZCBQUy8yIGtleWJvYXJkL21vdXNlIgogCWhlbHAKQEAgLTIyNywxMSArMjI0LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogCi1lbmRpZgotCi1jb25maWcgTk9fRE1BCi0JZGVmX2Jvb2wgIVBDSQotCiBjb25maWcgU1VOX09QRU5QUk9NRlMKIAl0cmlzdGF0ZSAiT3BlbnByb20gdHJlZSBhcHBlYXJzIGluIC9wcm9jL29wZW5wcm9tIgogCWhlbHAKQEAgLTI2Myw5ICsyNTUsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAotaWYgIVNVTjQKIHNvdXJjZSAiZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZyIKLWVuZGlmCiAKICMgVGhpcyBvbmUgbXVzdCBiZSBiZWZvcmUgdGhlIGZpbGVzeXN0ZW0gY29uZmlncy4gLURhdmVNCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYTVmMGNlNy4uMmQyNzY5ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTE1LDE0ICsxNSwxMSBAQAogaGVhZGVyLXkgKz0gc2lnbmFsXzY0LmgKIGhlYWRlci15ICs9IHN0YXRfMzIuaAogaGVhZGVyLXkgKz0gc3RhdF82NC5oCi1oZWFkZXIteSArPSBzdGF0ZnNfMzIuaAotaGVhZGVyLXkgKz0gc3RhdGZzXzY0LmgKIGhlYWRlci15ICs9IHVuaXN0ZF8zMi5oCiBoZWFkZXIteSArPSB1bmlzdGRfNjQuaAogCiBoZWFkZXIteSArPSBhcGMuaAogaGVhZGVyLXkgKz0gYXNpLmgKLWhlYWRlci15ICs9IGJwcC5oCiBoZWFkZXIteSArPSBkaXNwbGF5N3NlZy5oCiBoZWFkZXIteSArPSBlbnZjdHJsLmgKIGhlYWRlci15ICs9IGZiaW8uaApAQCAtNDEsNSArMzgsNCBAQAogaGVhZGVyLXkgKz0gdHJhcHMuaAogaGVhZGVyLXkgKz0gdWN0eC5oCiBoZWFkZXIteSArPSB1dHJhcC5oCi1oZWFkZXIteSArPSB2ZmNfaW9jdGxzLmgKIGhlYWRlci15ICs9IHdhdGNoZG9nLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAppbmRleCBhNjE5YTRkLi5hOTk1YmY4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hc21tYWNyby5oCkBAIC0zNCwxMiArMzQsNyBAQAogLyogc3VuNCBwcm9iYWJseSB3YW50cyBoYWxmIHdvcmQgYWNjZXNzZXMgdG8gQVNJX1NFR01BUCwgd2hpbGUgc3VuNGMrCiAgICBsaWtlcyBieXRlIGFjY2Vzc2VzLiBUaGVzZSBhcmUgdG8gYXZvaWQgaWZkZWYgbWFuaWEuICovCiAKLSNpZmRlZiBDT05GSUdfU1VONAotI2RlZmluZSBsZHVYYQlsZHVoYQotI2RlZmluZSBzdFhhCXN0aGEKLSNlbHNlCiAjZGVmaW5lIGxkdVhhCWxkdWJhCiAjZGVmaW5lIHN0WGEJc3RiYQotI2VuZGlmCiAKICNlbmRpZiAvKiAhKF9TUEFSQ19BU01NQUNST19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9icHAuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjUxNWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9icHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDX0JQUF9ICi0jZGVmaW5lIF9TUEFSQ19CUFBfSAotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1IFBpY3R1cmUgRWxlbWVudHMKLSAqCVN0ZXBoZW4gV2lsbGlhbXMKLSAqCUd1cyBCYWxkYXVmCi0gKgotICogTGludXgvU1BBUkMgcG9ydCBieSBQZXRlciBaYWl0Y2V2LgotICogSW50ZWdyYXRpb24gaW50byBTUEFSQyB0cmVlIGJ5IFRvbSBEeWFzLgotICovCi0KLSNpbmNsdWRlICA8bGludXgvaW9jdGwuaD4KLQotLyoKLSAqIFRoaXMgaXMgYSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBJRUVFIFN0ZCAxMjg0LTE5OTQgY29tbXVuaWNhdGlvbnMKLSAqIHdpdGggY29tcGxpYW50IG9yIGNvbXBhdGlibGUgZGV2aWNlcy4gSXQgd2lsbCB1c2Ugd2hhdGV2ZXIgZmVhdHVyZXMKLSAqIHRoZSBkZXZpY2Ugc3VwcG9ydHMsIHByZWZlcmluZyB0aG9zZSB0aGF0IGFyZSB0eXBpY2FsbHkgZmFzdGVyLgotICoKLSAqIFdoZW4gdGhlIGRldmljZSBpcyBvcGVuZWQsIGl0IGlzIGxlZnQgaW4gQ09NUEFUSUJJTElUWSBtb2RlLCBhbmQKLSAqIHdyaXRlcyB3b3JrIGxpa2UgYW55IHByaW50ZXIgZGV2aWNlLiBUaGUgZHJpdmVyIG9ubHkgYXR0ZW1wdCB0bwotICogbmVnb3RpYXRlIDEyODQgbW9kZXMgd2hlbiBuZWVkZWQgc28gdGhhdCBwbHVncyBjYW4gYmUgcHVsbGVkLAotICogc3dpdGNoIGJveGVzIHN3aXRjaGVkLCBldGMuLCB3aXRob3V0IGRpc3J1cHRpbmcgdGhpbmdzLiBJdCB3aWxsCi0gKiBhbHNvIGxlYXZlIHRoZSBkZXZpY2UgaW4gY29tcGF0aWJpbGl0eSBtb2RlIHdoZW4gY2xvc2VkLgotICovCi0KLQotCi0vKgotICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwbGllcyBpb2N0bHMgdG8gbWFudWFsbHkgbWFuaXB1bGF0ZSB0aGUKLSAqIHBpbnMuIFRoaXMgaXMgZ3JlYXQgZm9yIHRlc3RpbmcgZGV2aWNlcywgb3Igd3JpdGluZyBjb2RlIHRvIGRlYWwKLSAqIHdpdGggYml6emFycm8tbW9kZSBvZiB0aGUgQUNNRSBTcGVjaWFsIFR1cmJvVGhpbmd5IFBsdXMuCi0gKgotICogTk9URTogVGhlc2UgaW9jdGwgY3VycmVudGx5IGRvIG5vdCBpbnRlcmFjdCB3ZWxsIHdpdGgKLSAqIHJlYWQvd3JpdGUuIENhdmVhdCBlbXB0b3IuCi0gKgotICogUFVUX1BJTlMgYWxsb3dzIHVzIHRvIGFzc2lnbiB0aGUgc2Vuc2Ugb2YgYWxsIHRoZSBwaW5zLCBpbmNsdWRpbmcKLSAqIHRoZSBkYXRhIHBpbnMgaWYgYmVpbmcgZHJpdmVuIGJ5IHRoZSBob3N0LiBUaGUgR0VUX1BJTlMgcmV0dXJucyB0aGUKLSAqIHBpbnMgdGhhdCB0aGUgcGVyaXBoZXJhbCBkcml2ZXMsIGluY2x1ZGluZyBkYXRhIGlmIGFwcHJvcHJpYXRlLgotICovCi0KLSMgZGVmaW5lIEJQUF9QVVRfUElOUyBfSU9XKCdCJywgMSwgaW50KQotIyBkZWZpbmUgQlBQX0dFVF9QSU5TIF9JT1IoJ0InLCAyLCBjaGFyKSAvKiB0aGF0J3MgYm9ndXMgLSBzaG91bGQndmUgYmVlbiBfSU8gKi8KLSMgZGVmaW5lIEJQUF9QVVRfREFUQSBfSU9XKCdCJywgMywgaW50KQotIyBkZWZpbmUgQlBQX0dFVF9EQVRBIF9JT1IoJ0InLCA0LCBjaGFyKSAvKiBkaXR0byAqLwotCi0vKgotICogU2V0IHRoZSBkYXRhIGJ1cyB0byBpbnB1dCBtb2RlLiBEaXNlbmdhZ2UgdGhlIGRhdGEgYmluIGRyaXZlciBhbmQKLSAqIGJlIHByZXBhcmVkIHRvIHJlYWQgdmFsdWVzIGZyb20gdGhlIHBlcmlwaGVyYWwuIElmIHRoZSBhcmcgaXMgMCwKLSAqIHRoZW4gcmV2ZXJ0IHRoZSBidXMgdG8gb3V0cHV0IG1vZGUuCi0gKi8KLSMgZGVmaW5lIEJQUF9TRVRfSU5QVVQgX0lPVygnQicsIDUsIGludCkKLQotLyoKLSAqIFRoZXNlIGJpdHMgYXBwbHkgdG8gdGhlIFBVVCBvcGVyYXRpb24uLi4KLSAqLwotIyBkZWZpbmUgQlBQX1BQX25TdHJvYmUgICAweDAwMDEKLSMgZGVmaW5lIEJQUF9QUF9uQXV0b0ZkICAgMHgwMDAyCi0jIGRlZmluZSBCUFBfUFBfbkluaXQgICAgIDB4MDAwNAotIyBkZWZpbmUgQlBQX1BQX25TZWxlY3RJbiAweDAwMDgKLQotLyoKLSAqIFRoZXNlIGFwcGx5IHRvIHRoZSBHRVQgb3BlcmF0aW9uLCB3aGljaCBhbHNvIHJlYWRzIHRoZSBjdXJyZW50IHZhbHVlCi0gKiBvZiB0aGUgcHJldmlvdXNseSBwdXQgdmFsdWVzLiBBIGJpdCBtYXNrIG9mIHRoZXNlIHdpbGwgYmUgcmV0dXJuZWQKLSAqIGFzIGEgYml0IG1hc2sgaW4gdGhlIHJldHVybiBjb2RlIG9mIHRoZSBpb2N0bCgpLgotICovCi0jIGRlZmluZSBCUFBfR1BfbkFjayAgIDB4MDEwMAotIyBkZWZpbmUgQlBQX0dQX0J1c3kgICAweDAyMDAKLSMgZGVmaW5lIEJQUF9HUF9QRXJyb3IgMHgwNDAwCi0jIGRlZmluZSBCUFBfR1BfU2VsZWN0IDB4MDgwMAotIyBkZWZpbmUgQlBQX0dQX25GYXVsdCAweDEwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J1Z3MuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnVncy5oCmluZGV4IGUxNzliYzEuLjYxZDg2YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnVncy5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnVncy5oCkBAIC03LDEwICs3LDYgQEAKICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU1BBUkM2NAotI2luY2x1ZGUgPGFzbS9zc3RhdGUuaD4KLSNlbmRpZgotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19idWdzKHZvaWQpCkBAIC0xOCw3ICsxNCw0IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMzMikgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAljcHVfZGF0YSgwKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQlzc3RhdGVfcnVubmluZygpOwotI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2NwdWRhdGFfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY3B1ZGF0YV82NC5oCmluZGV4IDUzMjk3NWUuLjdkYTdjMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY3B1ZGF0YV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY3B1ZGF0YV82NC5oCkBAIC04Niw3ICs4Niw2IEBACiBleHRlcm4gdm9pZCBpbml0X2N1cl9jcHVfdHJhcChzdHJ1Y3QgdGhyZWFkX2luZm8gKik7CiBleHRlcm4gdm9pZCBzZXR1cF90YmEodm9pZCk7CiBleHRlcm4gaW50IG5jcHVzX3Byb2JlZDsKLWV4dGVybiB2b2lkIF9faW5pdCBjcHVfcHJvYmUodm9pZCk7CiBleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3A7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJlYWxfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZ18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZ18zMi5oCmluZGV4IGYzYTY0MWUuLjhhNTdlYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmdfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nXzMyLmgKQEAgLTEsMTEgKzEsNjAgQEAKICNpZm5kZWYgX0FTTV9TUEFSQ19ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9BU01fU1BBUkNfRE1BX01BUFBJTkdfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2lmZGVmIENPTkZJR19QQ0kKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLSNlbmRpZiAvKiBQQ0kgKi8KK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CitzdHJ1Y3QgcGFnZTsKKworI2RlZmluZSBETUFfRVJST1JfQ09ERQkofihkbWFfYWRkcl90KTB4MCkKKworZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworZXh0ZXJuIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spOworZXh0ZXJuIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpOworZXh0ZXJuIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOworZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwKKwkJCQkgc2l6ZV90IHNpemUsCisJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCSAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKKwkJCSAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJICAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgICAgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCQkgIHNpemVfdCBzaXplLAorCQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKK2V4dGVybiBpbnQgZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKK2V4dGVybiBpbnQgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCk7CisKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50CWRtYV9hbGxvY19jb2hlcmVudAorI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudAlkbWFfZnJlZV9jb2hlcmVudAogCiAjZW5kaWYgLyogX0FTTV9TUEFSQ19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9kbWEuaAppbmRleCBhYTFkOTBhLi5iNTU0OTI3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZG1hLmgKQEAgLTEsOCArMSwxMzkgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX0RNQV9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19ETUFfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL2RtYV82NC5oPgorI2lmbmRlZiBfQVNNX1NQQVJDX0RNQV9ICisjZGVmaW5lIF9BU01fU1BBUkNfRE1BX0gKKworLyogVGhlc2UgYXJlIGlycmVsZXZhbnQgZm9yIFNwYXJjIERNQSwgYnV0IHdlIGxlYXZlIGl0IGluIHNvIHRoYXQKKyAqIHRoaW5ncyBjYW4gY29tcGlsZS4KKyAqLworI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDgKKyNkZWZpbmUgRE1BX01PREVfUkVBRCAgICAxCisjZGVmaW5lIERNQV9NT0RFX1dSSVRFICAgMgorI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgICh+MFVMKQorCisvKiBVc2VmdWwgY29uc3RhbnRzICovCisjZGVmaW5lIFNJWkVfMTZNQiAgICAgICgxNioxMDI0KjEwMjQpCisjZGVmaW5lIFNJWkVfNjRLICAgICAgICg2NCoxMDI0KQorCisvKiBTQlVTIERNQSBjb250cm9sbGVyIHJlZyBvZmZzZXRzICovCisjZGVmaW5lIERNQV9DU1IJCTB4MDBVTAkJLyogcncgIERNQSBjb250cm9sL3N0YXR1cyByZWdpc3RlciAgICAweDAwICAgKi8KKyNkZWZpbmUgRE1BX0FERFIJMHgwNFVMCQkvKiBydyAgRE1BIHRyYW5zZmVyIGFkZHJlc3MgcmVnaXN0ZXIgIDB4MDQgICAqLworI2RlZmluZSBETUFfQ09VTlQJMHgwOFVMCQkvKiBydyAgRE1BIHRyYW5zZmVyIGNvdW50IHJlZ2lzdGVyICAgIDB4MDggICAqLworI2RlZmluZSBETUFfVEVTVAkweDBjVUwJCS8qIHJ3ICBETUEgdGVzdC9kZWJ1ZyByZWdpc3RlciAgICAgICAgMHgwYyAgICovCisKKy8qIEZpZWxkcyBpbiB0aGUgY29uZF9yZWcgcmVnaXN0ZXIgKi8KKy8qIEZpcnN0LCB0aGUgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBiaXRzICovCisjZGVmaW5lIERNQV9ERVZJQ0VfSUQgICAgMHhmMDAwMDAwMCAgICAgICAgLyogRGV2aWNlIGlkZW50aWZpY2F0aW9uIGJpdHMgKi8KKyNkZWZpbmUgRE1BX1ZFUlMwICAgICAgICAweDAwMDAwMDAwICAgICAgICAvKiBTdW5yYXkgRE1BIHZlcnNpb24gKi8KKyNkZWZpbmUgRE1BX0VTQ1YxICAgICAgICAweDQwMDAwMDAwICAgICAgICAvKiBETUEgRVNDIFZlcnNpb24gMSAqLworI2RlZmluZSBETUFfVkVSUzEgICAgICAgIDB4ODAwMDAwMDAgICAgICAgIC8qIERNQSByZXYgMSAqLworI2RlZmluZSBETUFfVkVSUzIgICAgICAgIDB4YTAwMDAwMDAgICAgICAgIC8qIERNQSByZXYgMiAqLworI2RlZmluZSBETUFfVkVSSE1FICAgICAgIDB4YjAwMDAwMDAgICAgICAgIC8qIERNQSBobWUgZ2F0ZSBhcnJheSAqLworI2RlZmluZSBETUFfVkVSU1BMVVMgICAgIDB4OTAwMDAwMDAgICAgICAgIC8qIERNQSByZXYgMSBQTFVTICovCisKKyNkZWZpbmUgRE1BX0hORExfSU5UUiAgICAweDAwMDAwMDAxICAgICAgICAvKiBBbiBJUlEgbmVlZHMgdG8gYmUgaGFuZGxlZCAqLworI2RlZmluZSBETUFfSE5ETF9FUlJPUiAgIDB4MDAwMDAwMDIgICAgICAgIC8qIFdlIG5lZWQgdG8gdGFrZSBhbiBlcnJvciAqLworI2RlZmluZSBETUFfRklGT19JU0RSQUlOIDB4MDAwMDAwMGMgICAgICAgIC8qIFRoZSBETUEgRklGTyBpcyBkcmFpbmluZyAqLworI2RlZmluZSBETUFfSU5UX0VOQUIgICAgIDB4MDAwMDAwMTAgICAgICAgIC8qIFR1cm4gb24gaW50ZXJydXB0cyAqLworI2RlZmluZSBETUFfRklGT19JTlYgICAgIDB4MDAwMDAwMjAgICAgICAgIC8qIEludmFsaWRhdGUgdGhlIEZJRk8gKi8KKyNkZWZpbmUgRE1BX0FDQ19TWl9FUlIgICAweDAwMDAwMDQwICAgICAgICAvKiBUaGUgYWNjZXNzIHNpemUgd2FzIGJhZCAqLworI2RlZmluZSBETUFfRklGT19TVERSQUlOIDB4MDAwMDAwNDAgICAgICAgIC8qIERNQV9WRVJTMSBEcmFpbiB0aGUgRklGTyAqLworI2RlZmluZSBETUFfUlNUX1NDU0kgICAgIDB4MDAwMDAwODAgICAgICAgIC8qIFJlc2V0IHRoZSBTQ1NJIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRE1BX1JTVF9FTkVUICAgICBETUFfUlNUX1NDU0kgICAgICAvKiBSZXNldCB0aGUgRU5FVCBjb250cm9sbGVyICovCisjZGVmaW5lIERNQV9TVF9XUklURSAgICAgMHgwMDAwMDEwMCAgICAgICAgLyogd3JpdGUgZnJvbSBkZXZpY2UgdG8gbWVtb3J5ICovCisjZGVmaW5lIERNQV9FTkFCTEUgICAgICAgMHgwMDAwMDIwMCAgICAgICAgLyogRmlyZSB1cCBETUEsIGhhbmRsZSByZXF1ZXN0cyAqLworI2RlZmluZSBETUFfUEVORF9SRUFEICAgIDB4MDAwMDA0MDAgICAgICAgIC8qIERNQV9WRVJTMS8wL1BMVVMgUGVuZGluZyBSZWFkICovCisjZGVmaW5lIERNQV9FU0NfQlVSU1QgICAgMHgwMDAwMDgwMCAgICAgICAgLyogMT0xNmJ5dGUgMD0zMmJ5dGUgKi8KKyNkZWZpbmUgRE1BX1JFQURfQUhFQUQgICAweDAwMDAxODAwICAgICAgICAvKiBETUEgcmVhZCBhaGVhZCBwYXJ0aWFsIGxvbmd3b3JkICovCisjZGVmaW5lIERNQV9EU0JMX1JEX0RSTiAgMHgwMDAwMTAwMCAgICAgICAgLyogTm8gRUMgZHJhaW4gb24gc2xhdmUgcmVhZHMgKi8KKyNkZWZpbmUgRE1BX0JDTlRfRU5BQiAgICAweDAwMDAyMDAwICAgICAgICAvKiBJZiBvbiwgdXNlIHRoZSBieXRlIGNvdW50ZXIgKi8KKyNkZWZpbmUgRE1BX1RFUk1fQ05UUiAgICAweDAwMDA0MDAwICAgICAgICAvKiBUZXJtaW5hbCBjb3VudGVyICovCisjZGVmaW5lIERNQV9TQ1NJX1NCVVM2NCAgMHgwMDAwODAwMCAgICAgICAgLyogSE1FOiBFbmFibGUgNjQtYml0IFNCVVMgbW9kZS4gKi8KKyNkZWZpbmUgRE1BX0NTUl9ESVNBQiAgICAweDAwMDEwMDAwICAgICAgICAvKiBObyBGSUZPIGRyYWlucyBkdXJpbmcgY3NyICovCisjZGVmaW5lIERNQV9TQ1NJX0RJU0FCICAgMHgwMDAyMDAwMCAgICAgICAgLyogTm8gRklGTyBkcmFpbnMgZHVyaW5nIHJlZyAqLworI2RlZmluZSBETUFfRFNCTF9XUl9JTlYgIDB4MDAwMjAwMDAgICAgICAgIC8qIE5vIEVDIGludmFsLiBvbiBzbGF2ZSB3cml0ZXMgKi8KKyNkZWZpbmUgRE1BX0FERF9FTkFCTEUgICAweDAwMDQwMDAwICAgICAgICAvKiBTcGVjaWFsIEVTQyBEVk1BIG9wdGltaXphdGlvbiAqLworI2RlZmluZSBETUFfRV9CVVJTVFMJIDB4MDAwYzAwMDAJICAgLyogRU5FVDogU0JVUyByL3cgYnVyc3QgbWFzayAqLworI2RlZmluZSBETUFfRV9CVVJTVDMyCSAweDAwMDQwMDAwCSAgIC8qIEVORVQ6IFNCVVMgMzIgYnl0ZSByL3cgYnVyc3QgKi8KKyNkZWZpbmUgRE1BX0VfQlVSU1QxNgkgMHgwMDAwMDAwMAkgICAvKiBFTkVUOiBTQlVTIDE2IGJ5dGUgci93IGJ1cnN0ICovCisjZGVmaW5lIERNQV9CUlNUX1NaICAgICAgMHgwMDBjMDAwMCAgICAgICAgLyogU0NTSTogU0JVUyByL3cgYnVyc3Qgc2l6ZSAqLworI2RlZmluZSBETUFfQlJTVDY0ICAgICAgIDB4MDAwYzAwMDAgICAgICAgIC8qIFNDU0k6IDY0Ynl0ZSBidXJzdHMgKEhNRSBvbiBVbHRyYVNwYXJjIG9ubHkpICovCisjZGVmaW5lIERNQV9CUlNUMzIgICAgICAgMHgwMDA0MDAwMCAgICAgICAgLyogU0NTSTogMzJieXRlIGJ1cnN0cyAqLworI2RlZmluZSBETUFfQlJTVDE2ICAgICAgIDB4MDAwMDAwMDAgICAgICAgIC8qIFNDU0k6IDE2Ynl0ZSBidXJzdHMgKi8KKyNkZWZpbmUgRE1BX0JSU1QwICAgICAgICAweDAwMDgwMDAwICAgICAgICAvKiBTQ1NJOiBubyBidXJzdHMgKG5vbi1ITUUgZ2F0ZSBhcnJheXMpICovCisjZGVmaW5lIERNQV9BRERSX0RJU0FCICAgMHgwMDEwMDAwMCAgICAgICAgLyogTm8gRklGTyBkcmFpbnMgZHVyaW5nIGFkZHIgKi8KKyNkZWZpbmUgRE1BXzJDTEtTICAgICAgICAweDAwMjAwMDAwICAgICAgICAvKiBFYWNoIHRyYW5zZmVyID0gMiBjbG9jayB0aWNrcyAqLworI2RlZmluZSBETUFfM0NMS1MgICAgICAgIDB4MDA0MDAwMDAgICAgICAgIC8qIEVhY2ggdHJhbnNmZXIgPSAzIGNsb2NrIHRpY2tzICovCisjZGVmaW5lIERNQV9FTl9FTkVUQVVJICAgRE1BXzNDTEtTICAgICAgICAgLyogUHV0IGxhbmNlIGludG8gQVVJLWNhYmxlIG1vZGUgKi8KKyNkZWZpbmUgRE1BX0NOVFJfRElTQUIgICAweDAwODAwMDAwICAgICAgICAvKiBObyBJUlEgd2hlbiBETUFfVEVSTV9DTlRSIHNldCAqLworI2RlZmluZSBETUFfQVVUT19OQUREUiAgIDB4MDEwMDAwMDAgICAgICAgIC8qIFVzZSAiYXV0byBueHQgYWRkciIgZmVhdHVyZSAqLworI2RlZmluZSBETUFfU0NTSV9PTiAgICAgIDB4MDIwMDAwMDAgICAgICAgIC8qIEVuYWJsZSBTQ1NJIGRtYSAqLworI2RlZmluZSBETUFfUEFSSVRZX09GRiAgIDB4MDIwMDAwMDAgICAgICAgIC8qIEhNRTogZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKyNkZWZpbmUgRE1BX0xPQURFRF9BRERSICAweDA0MDAwMDAwICAgICAgICAvKiBBZGRyZXNzIGhhcyBiZWVuIGxvYWRlZCAqLworI2RlZmluZSBETUFfTE9BREVEX05BRERSIDB4MDgwMDAwMDAgICAgICAgIC8qIE5leHQgYWRkcmVzcyBoYXMgYmVlbiBsb2FkZWQgKi8KKyNkZWZpbmUgRE1BX1JFU0VUX0ZBUzM2NiAweDA4MDAwMDAwICAgICAgICAvKiBITUU6IEFzc2VydCBSRVNFVCB0byBGQVMzNjYgKi8KKworLyogVmFsdWVzIGRlc2NyaWJpbmcgdGhlIGJ1cnN0LXNpemUgcHJvcGVydHkgZnJvbSB0aGUgUFJPTSAqLworI2RlZmluZSBETUFfQlVSU1QxICAgICAgIDB4MDEKKyNkZWZpbmUgRE1BX0JVUlNUMiAgICAgICAweDAyCisjZGVmaW5lIERNQV9CVVJTVDQgICAgICAgMHgwNAorI2RlZmluZSBETUFfQlVSU1Q4ICAgICAgIDB4MDgKKyNkZWZpbmUgRE1BX0JVUlNUMTYgICAgICAweDEwCisjZGVmaW5lIERNQV9CVVJTVDMyICAgICAgMHgyMAorI2RlZmluZSBETUFfQlVSU1Q2NCAgICAgIDB4NDAKKyNkZWZpbmUgRE1BX0JVUlNUQklUUyAgICAweDdmCisKKy8qIEZyb20gUENJICovCisKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gaW50IGlzYV9kbWFfYnJpZGdlX2J1Z2d5OwogI2Vsc2UKLSNpbmNsdWRlIDxhc20vZG1hXzMyLmg+CisjZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMCkKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NQQVJDMzIKKworLyogUm91dGluZXMgZm9yIGRhdGEgdHJhbnNmZXIgYnVmZmVycy4gKi8KK0JURklYVVBERUZfQ0FMTChjaGFyICosIG1tdV9sb2NrYXJlYSwgY2hhciAqLCB1bnNpZ25lZCBsb25nKQorQlRGSVhVUERFRl9DQUxMKHZvaWQsICAgbW11X3VubG9ja2FyZWEsIGNoYXIgKiwgdW5zaWduZWQgbG9uZykKKworI2RlZmluZSBtbXVfbG9ja2FyZWEodmFkZHIsbGVuKSBCVEZJWFVQX0NBTEwobW11X2xvY2thcmVhKSh2YWRkcixsZW4pCisjZGVmaW5lIG1tdV91bmxvY2thcmVhKHZhZGRyLGxlbikgQlRGSVhVUF9DQUxMKG1tdV91bmxvY2thcmVhKSh2YWRkcixsZW4pCisKK3N0cnVjdCBwYWdlOworc3RydWN0IGRldmljZTsKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworLyogVGhlc2UgYXJlIGltcGxlbWVudGF0aW9ucyBmb3Igc2J1c19tYXBfc2cvc2J1c191bm1hcF9zZy4uLiBjb2xsYXBzZSBsYXRlciAqLworQlRGSVhVUERFRl9DQUxMKF9fdTMyLCBtbXVfZ2V0X3Njc2lfb25lLCBzdHJ1Y3QgZGV2aWNlICosIGNoYXIgKiwgdW5zaWduZWQgbG9uZykKK0JURklYVVBERUZfQ0FMTCh2b2lkLCAgbW11X2dldF9zY3NpX3NnbCwgc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50KQorQlRGSVhVUERFRl9DQUxMKHZvaWQsICBtbXVfcmVsZWFzZV9zY3NpX29uZSwgc3RydWN0IGRldmljZSAqLCBfX3UzMiwgdW5zaWduZWQgbG9uZykKK0JURklYVVBERUZfQ0FMTCh2b2lkLCAgbW11X3JlbGVhc2Vfc2NzaV9zZ2wsIHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCkKKworI2RlZmluZSBtbXVfZ2V0X3Njc2lfb25lKGRldix2YWRkcixsZW4pIEJURklYVVBfQ0FMTChtbXVfZ2V0X3Njc2lfb25lKShkZXYsdmFkZHIsbGVuKQorI2RlZmluZSBtbXVfZ2V0X3Njc2lfc2dsKGRldixzZyxzeikgQlRGSVhVUF9DQUxMKG1tdV9nZXRfc2NzaV9zZ2wpKGRldixzZyxzeikKKyNkZWZpbmUgbW11X3JlbGVhc2Vfc2NzaV9vbmUoZGV2LHZhZGRyLGxlbikgQlRGSVhVUF9DQUxMKG1tdV9yZWxlYXNlX3Njc2lfb25lKShkZXYsdmFkZHIsbGVuKQorI2RlZmluZSBtbXVfcmVsZWFzZV9zY3NpX3NnbChkZXYsc2csc3opIEJURklYVVBfQ0FMTChtbXVfcmVsZWFzZV9zY3NpX3NnbCkoZGV2LHNnLHN6KQorCisvKgorICogbW11X21hcC91bm1hcCBhcmUgcHJvdmlkZWQgYnkgaW9tbXUvaW91bml0OyBJbnZhbGlkIHRvIGNhbGwgb24gSUllcC4KKyAqCisgKiBUaGUgbW11X21hcF9kbWFfYXJlYSBlc3RhYmxpc2hlcyB0d28gbWFwcGluZ3MgaW4gb25lIGdvLgorICogVGhlc2UgbWFwcGluZ3MgcG9pbnQgdG8gcGFnZXMgbm9ybWFsbHkgbWFwcGVkIGF0ICd2YScgKGxpbmVhciBhZGRyZXNzKS4KKyAqIEZpcnN0IG1hcHBpbmcgaXMgZm9yIENQVSB2aXNpYmxlIGFkZHJlc3MgYXQgJ2EnLCB1bmNhY2hlZC4KKyAqIFRoaXMgaXMgYW4gYWxpYXMsIGJ1dCBpdCB3b3JrcyBiZWNhdXNlIGl0IGlzIGFuIHVuY2FjaGVkIG1hcHBpbmcuCisgKiBTZWNvbmQgbWFwcGluZyBpcyBmb3IgZGV2aWNlIHZpc2libGUgYWRkcmVzcywgb3IgImJ1cyIgYWRkcmVzcy4KKyAqIFRoZSBidXMgYWRkcmVzcyBpcyByZXR1cm5lZCBhdCAnKnBiYScuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHNlZW0gZGlzdGluY3QsIGJ1dCBhcmUgaGFyZCB0byBzcGxpdC4gT24gc3VuNGMsCisgKiBhdCBsZWFzdCBmb3Igbm93LCAnYScgaXMgZXF1YWwgdG8gYnVzIGFkZHJlc3MsIGFuZCByZXR1cmVkIGluICpwYmEuCisgKiBPbiBzdW40bSwgcGFnZSBhdHRyaWJ1dGVzIGRlcGVuZCBvbiB0aGUgQ1BVIHR5cGUsIHNvIHdlIGhhdmUgdG8KKyAqIGtub3cgaWYgd2UgYXJlIG1hcHBpbmcgUkFNIG9yIEkvTywgc28gaXQgaGFzIHRvIGJlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQKKyAqIHRvIGEgc2VwYXJhdGUgbWFwcGluZyBmdW5jdGlvbiBmb3IgQ1BVIHZpc2libGUgbWFwcGluZ3MuCisgKi8KK0JURklYVVBERUZfQ0FMTChpbnQsIG1tdV9tYXBfZG1hX2FyZWEsIHN0cnVjdCBkZXZpY2UgKiwgZG1hX2FkZHJfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQgbGVuKQorQlRGSVhVUERFRl9DQUxMKHZvaWQsIG1tdV91bm1hcF9kbWFfYXJlYSwgc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBsb25nIGJ1c2EsIGludCBsZW4pCisKKyNkZWZpbmUgbW11X21hcF9kbWFfYXJlYShkZXYscGJhLHZhLGEsbGVuKSBCVEZJWFVQX0NBTEwobW11X21hcF9kbWFfYXJlYSkoZGV2LHBiYSx2YSxhLGxlbikKKyNkZWZpbmUgbW11X3VubWFwX2RtYV9hcmVhKGRldixiYSxsZW4pIEJURklYVVBfQ0FMTChtbXVfdW5tYXBfZG1hX2FyZWEpKGRldixiYSxsZW4pCiAjZW5kaWYKKworI2VuZGlmIC8qICEoX0FTTV9TUEFSQ19ETUFfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZG1hXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYV8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjcxODljLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZG1hXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyogaW5jbHVkZS9hc20vZG1hLmgKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NSAoQykgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQotICovCi0KLSNpZm5kZWYgX0FTTV9TUEFSQ19ETUFfSAotI2RlZmluZSBfQVNNX1NQQVJDX0RNQV9ICi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jaW5jbHVkZSA8YXNtL3ZhYy1vcHMuaD4gIC8qIGZvciBpbnZhbGlkYXRlJ3MsIGV0Yy4gKi8KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi1zdHJ1Y3QgcGFnZTsKLWV4dGVybiBzcGlubG9ja190ICBkbWFfc3Bpbl9sb2NrOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2xhaW1fZG1hX2xvY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfc3Bpbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9kbWFfbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9zcGluX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogVGhlc2UgYXJlIGlycmVsZXZhbnQgZm9yIFNwYXJjIERNQSwgYnV0IHdlIGxlYXZlIGl0IGluIHNvIHRoYXQKLSAqIHRoaW5ncyBjYW4gY29tcGlsZS4KLSAqLwotI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDgKLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTICAofjBVTCkKLSNkZWZpbmUgRE1BX01PREVfUkVBRCAgICAxCi0jZGVmaW5lIERNQV9NT0RFX1dSSVRFICAgMgotCi0vKiBVc2VmdWwgY29uc3RhbnRzICovCi0jZGVmaW5lIFNJWkVfMTZNQiAgICAgICgxNioxMDI0KjEwMjQpCi0jZGVmaW5lIFNJWkVfNjRLICAgICAgICg2NCoxMDI0KQotCi0vKiBTQlVTIERNQSBjb250cm9sbGVyIHJlZyBvZmZzZXRzICovCi0jZGVmaW5lIERNQV9DU1IJCTB4MDBVTAkJLyogcncgIERNQSBjb250cm9sL3N0YXR1cyByZWdpc3RlciAgICAweDAwICAgKi8KLSNkZWZpbmUgRE1BX0FERFIJMHgwNFVMCQkvKiBydyAgRE1BIHRyYW5zZmVyIGFkZHJlc3MgcmVnaXN0ZXIgIDB4MDQgICAqLwotI2RlZmluZSBETUFfQ09VTlQJMHgwOFVMCQkvKiBydyAgRE1BIHRyYW5zZmVyIGNvdW50IHJlZ2lzdGVyICAgIDB4MDggICAqLwotI2RlZmluZSBETUFfVEVTVAkweDBjVUwJCS8qIHJ3ICBETUEgdGVzdC9kZWJ1ZyByZWdpc3RlciAgICAgICAgMHgwYyAgICovCi0KLS8qIERWTUEgY2hpcCByZXZpc2lvbnMgKi8KLWVudW0gZHZtYV9yZXYgewotCWR2bWFyZXYwLAotCWR2bWFlc2MxLAotCWR2bWFyZXYxLAotCWR2bWFyZXYyLAotCWR2bWFyZXYzLAotCWR2bWFyZXZwbHVzLAotCWR2bWFobWUKLX07Ci0KLSNkZWZpbmUgRE1BX0hBU0NPVU5UKHJldikgICgocmV2KT09ZHZtYWVzYzEpCi0KLS8qIExpbnV4IERNQSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUsIGZpbGxlZCBkdXJpbmcgcHJvYmUuICovCi1zdHJ1Y3Qgc2J1c19kbWEgewotCXN0cnVjdCBzYnVzX2RtYSAqbmV4dDsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzOwotCi0JLyogU3RhdHVzLCBtaXNjIGluZm8gKi8KLQlpbnQgbm9kZTsgICAgICAgICAgICAgICAgLyogUHJvbSBub2RlIGZvciB0aGlzIERNQSBkZXZpY2UgKi8KLQlpbnQgcnVubmluZzsgICAgICAgICAgICAgLyogQXJlIHdlIGRvaW5nIERNQSBub3c/ICovCi0JaW50IGFsbG9jYXRlZDsgICAgICAgICAgIC8qIEFyZSB3ZSAib3duZWQiIGJ5IGFueW9uZSB5ZXQ/ICovCi0KLQkvKiBUcmFuc2ZlciBpbmZvcm1hdGlvbi4gKi8KLQl1bnNpZ25lZCBsb25nIGFkZHI7ICAgICAgLyogU3RhcnQgYWRkcmVzcyBvZiBjdXJyZW50IHRyYW5zZmVyICovCi0JaW50IG5ieXRlczsgICAgICAgICAgICAgIC8qIFNpemUgb2YgY3VycmVudCB0cmFuc2ZlciAqLwotCWludCByZWFsYnl0ZXM7ICAgICAgICAgICAvKiBGb3Igc3BsaXR0aW5nIHVwIGxhcmdlIHRyYW5zZmVycywgZXRjLiAqLwotCi0JLyogRE1BIHJldmlzaW9uICovCi0JZW51bSBkdm1hX3JldiByZXZpc2lvbjsKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgc2J1c19kbWEgKmRtYV9jaGFpbjsKLQotLyogQnJva2VuIGhhcmR3YXJlLi4uICovCi0jaWZkZWYgQ09ORklHX1NVTjQKLS8qIEhhdmUgdG8gc29ydCB0aGlzIG91dC4gRG9lcyByZXYwIHdvcmsgZmluZSBvbiBzdW40W2NtZF0gd2l0aG91dCBpc2Jyb2tlbj8KLSAqIE9yIGlzIHJldjAgcHJlc2VudCBvbmx5IG9uIHN1bjQgYm94ZXM/IC1qaiAqLwotI2RlZmluZSBETUFfSVNCUk9LRU4oZG1hKSAgICAoKGRtYSktPnJldmlzaW9uID09IGR2bWFyZXYwIHx8IChkbWEpLT5yZXZpc2lvbiA9PSBkdm1hcmV2MSkKLSNlbHNlCi0jZGVmaW5lIERNQV9JU0JST0tFTihkbWEpICAgICgoZG1hKS0+cmV2aXNpb24gPT0gZHZtYXJldjEpCi0jZW5kaWYKLSNkZWZpbmUgRE1BX0lTRVNDMShkbWEpICAgICAgKChkbWEpLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkKLQotLyogTWFpbiByb3V0aW5lcyBpbiBkbWEuYyAqLwotZXh0ZXJuIHZvaWQgZHZtYV9pbml0KHN0cnVjdCBzYnVzX2J1cyAqKTsKLQotLyogRmllbGRzIGluIHRoZSBjb25kX3JlZyByZWdpc3RlciAqLwotLyogRmlyc3QsIHRoZSB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIGJpdHMgKi8KLSNkZWZpbmUgRE1BX0RFVklDRV9JRCAgICAweGYwMDAwMDAwICAgICAgICAvKiBEZXZpY2UgaWRlbnRpZmljYXRpb24gYml0cyAqLwotI2RlZmluZSBETUFfVkVSUzAgICAgICAgIDB4MDAwMDAwMDAgICAgICAgIC8qIFN1bnJheSBETUEgdmVyc2lvbiAqLwotI2RlZmluZSBETUFfRVNDVjEgICAgICAgIDB4NDAwMDAwMDAgICAgICAgIC8qIERNQSBFU0MgVmVyc2lvbiAxICovCi0jZGVmaW5lIERNQV9WRVJTMSAgICAgICAgMHg4MDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAxICovCi0jZGVmaW5lIERNQV9WRVJTMiAgICAgICAgMHhhMDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAyICovCi0jZGVmaW5lIERNQV9WRVJITUUgICAgICAgMHhiMDAwMDAwMCAgICAgICAgLyogRE1BIGhtZSBnYXRlIGFycmF5ICovCi0jZGVmaW5lIERNQV9WRVJTUExVUyAgICAgMHg5MDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAxIFBMVVMgKi8KLQotI2RlZmluZSBETUFfSE5ETF9JTlRSICAgIDB4MDAwMDAwMDEgICAgICAgIC8qIEFuIElSUSBuZWVkcyB0byBiZSBoYW5kbGVkICovCi0jZGVmaW5lIERNQV9ITkRMX0VSUk9SICAgMHgwMDAwMDAwMiAgICAgICAgLyogV2UgbmVlZCB0byB0YWtlIGFuIGVycm9yICovCi0jZGVmaW5lIERNQV9GSUZPX0lTRFJBSU4gMHgwMDAwMDAwYyAgICAgICAgLyogVGhlIERNQSBGSUZPIGlzIGRyYWluaW5nICovCi0jZGVmaW5lIERNQV9JTlRfRU5BQiAgICAgMHgwMDAwMDAxMCAgICAgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIERNQV9GSUZPX0lOViAgICAgMHgwMDAwMDAyMCAgICAgICAgLyogSW52YWxpZGF0ZSB0aGUgRklGTyAqLwotI2RlZmluZSBETUFfQUNDX1NaX0VSUiAgIDB4MDAwMDAwNDAgICAgICAgIC8qIFRoZSBhY2Nlc3Mgc2l6ZSB3YXMgYmFkICovCi0jZGVmaW5lIERNQV9GSUZPX1NURFJBSU4gMHgwMDAwMDA0MCAgICAgICAgLyogRE1BX1ZFUlMxIERyYWluIHRoZSBGSUZPICovCi0jZGVmaW5lIERNQV9SU1RfU0NTSSAgICAgMHgwMDAwMDA4MCAgICAgICAgLyogUmVzZXQgdGhlIFNDU0kgY29udHJvbGxlciAqLwotI2RlZmluZSBETUFfUlNUX0VORVQgICAgIERNQV9SU1RfU0NTSSAgICAgIC8qIFJlc2V0IHRoZSBFTkVUIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRE1BX1JTVF9CUFAgICAgICBETUFfUlNUX1NDU0kgICAgICAvKiBSZXNldCB0aGUgQlBQIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRE1BX1NUX1dSSVRFICAgICAweDAwMDAwMTAwICAgICAgICAvKiB3cml0ZSBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KLSNkZWZpbmUgRE1BX0VOQUJMRSAgICAgICAweDAwMDAwMjAwICAgICAgICAvKiBGaXJlIHVwIERNQSwgaGFuZGxlIHJlcXVlc3RzICovCi0jZGVmaW5lIERNQV9QRU5EX1JFQUQgICAgMHgwMDAwMDQwMCAgICAgICAgLyogRE1BX1ZFUlMxLzAvUExVUyBQZW5kaW5nIFJlYWQgKi8KLSNkZWZpbmUgRE1BX0VTQ19CVVJTVCAgICAweDAwMDAwODAwICAgICAgICAvKiAxPTE2Ynl0ZSAwPTMyYnl0ZSAqLwotI2RlZmluZSBETUFfUkVBRF9BSEVBRCAgIDB4MDAwMDE4MDAgICAgICAgIC8qIERNQSByZWFkIGFoZWFkIHBhcnRpYWwgbG9uZ3dvcmQgKi8KLSNkZWZpbmUgRE1BX0RTQkxfUkRfRFJOICAweDAwMDAxMDAwICAgICAgICAvKiBObyBFQyBkcmFpbiBvbiBzbGF2ZSByZWFkcyAqLwotI2RlZmluZSBETUFfQkNOVF9FTkFCICAgIDB4MDAwMDIwMDAgICAgICAgIC8qIElmIG9uLCB1c2UgdGhlIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBETUFfVEVSTV9DTlRSICAgIDB4MDAwMDQwMDAgICAgICAgIC8qIFRlcm1pbmFsIGNvdW50ZXIgKi8KLSNkZWZpbmUgRE1BX1NDU0lfU0JVUzY0ICAweDAwMDA4MDAwICAgICAgICAvKiBITUU6IEVuYWJsZSA2NC1iaXQgU0JVUyBtb2RlLiAqLwotI2RlZmluZSBETUFfQ1NSX0RJU0FCICAgIDB4MDAwMTAwMDAgICAgICAgIC8qIE5vIEZJRk8gZHJhaW5zIGR1cmluZyBjc3IgKi8KLSNkZWZpbmUgRE1BX1NDU0lfRElTQUIgICAweDAwMDIwMDAwICAgICAgICAvKiBObyBGSUZPIGRyYWlucyBkdXJpbmcgcmVnICovCi0jZGVmaW5lIERNQV9EU0JMX1dSX0lOViAgMHgwMDAyMDAwMCAgICAgICAgLyogTm8gRUMgaW52YWwuIG9uIHNsYXZlIHdyaXRlcyAqLwotI2RlZmluZSBETUFfQUREX0VOQUJMRSAgIDB4MDAwNDAwMDAgICAgICAgIC8qIFNwZWNpYWwgRVNDIERWTUEgb3B0aW1pemF0aW9uICovCi0jZGVmaW5lIERNQV9FX0JVUlNUUwkgMHgwMDBjMDAwMAkgICAvKiBFTkVUOiBTQlVTIHIvdyBidXJzdCBtYXNrICovCi0jZGVmaW5lIERNQV9FX0JVUlNUMzIJIDB4MDAwNDAwMDAJICAgLyogRU5FVDogU0JVUyAzMiBieXRlIHIvdyBidXJzdCAqLwotI2RlZmluZSBETUFfRV9CVVJTVDE2CSAweDAwMDAwMDAwCSAgIC8qIEVORVQ6IFNCVVMgMTYgYnl0ZSByL3cgYnVyc3QgKi8KLSNkZWZpbmUgRE1BX0JSU1RfU1ogICAgICAweDAwMGMwMDAwICAgICAgICAvKiBTQ1NJOiBTQlVTIHIvdyBidXJzdCBzaXplICovCi0jZGVmaW5lIERNQV9CUlNUNjQgICAgICAgMHgwMDA4MDAwMCAgICAgICAgLyogU0NTSTogNjRieXRlIGJ1cnN0cyAoSE1FIG9uIFVsdHJhU3BhcmMgb25seSkgKi8KLSNkZWZpbmUgRE1BX0JSU1QzMiAgICAgICAweDAwMDQwMDAwICAgICAgICAvKiBTQ1NJL0JQUDogMzJieXRlIGJ1cnN0cyAqLwotI2RlZmluZSBETUFfQlJTVDE2ICAgICAgIDB4MDAwMDAwMDAgICAgICAgIC8qIFNDU0kvQlBQOiAxNmJ5dGUgYnVyc3RzICovCi0jZGVmaW5lIERNQV9CUlNUMCAgICAgICAgMHgwMDA4MDAwMCAgICAgICAgLyogU0NTSTogbm8gYnVyc3RzIChub24tSE1FIGdhdGUgYXJyYXlzKSAqLwotI2RlZmluZSBETUFfQUREUl9ESVNBQiAgIDB4MDAxMDAwMDAgICAgICAgIC8qIE5vIEZJRk8gZHJhaW5zIGR1cmluZyBhZGRyICovCi0jZGVmaW5lIERNQV8yQ0xLUyAgICAgICAgMHgwMDIwMDAwMCAgICAgICAgLyogRWFjaCB0cmFuc2ZlciA9IDIgY2xvY2sgdGlja3MgKi8KLSNkZWZpbmUgRE1BXzNDTEtTICAgICAgICAweDAwNDAwMDAwICAgICAgICAvKiBFYWNoIHRyYW5zZmVyID0gMyBjbG9jayB0aWNrcyAqLwotI2RlZmluZSBETUFfRU5fRU5FVEFVSSAgIERNQV8zQ0xLUyAgICAgICAgIC8qIFB1dCBsYW5jZSBpbnRvIEFVSS1jYWJsZSBtb2RlICovCi0jZGVmaW5lIERNQV9DTlRSX0RJU0FCICAgMHgwMDgwMDAwMCAgICAgICAgLyogTm8gSVJRIHdoZW4gRE1BX1RFUk1fQ05UUiBzZXQgKi8KLSNkZWZpbmUgRE1BX0FVVE9fTkFERFIgICAweDAxMDAwMDAwICAgICAgICAvKiBVc2UgImF1dG8gbnh0IGFkZHIiIGZlYXR1cmUgKi8KLSNkZWZpbmUgRE1BX1NDU0lfT04gICAgICAweDAyMDAwMDAwICAgICAgICAvKiBFbmFibGUgU0NTSSBkbWEgKi8KLSNkZWZpbmUgRE1BX0JQUF9PTiAgICAgICBETUFfU0NTSV9PTiAgICAgICAvKiBFbmFibGUgQlBQIGRtYSAqLwotI2RlZmluZSBETUFfUEFSSVRZX09GRiAgIDB4MDIwMDAwMDAgICAgICAgIC8qIEhNRTogZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KLSNkZWZpbmUgRE1BX0xPQURFRF9BRERSICAweDA0MDAwMDAwICAgICAgICAvKiBBZGRyZXNzIGhhcyBiZWVuIGxvYWRlZCAqLwotI2RlZmluZSBETUFfTE9BREVEX05BRERSIDB4MDgwMDAwMDAgICAgICAgIC8qIE5leHQgYWRkcmVzcyBoYXMgYmVlbiBsb2FkZWQgKi8KLSNkZWZpbmUgRE1BX1JFU0VUX0ZBUzM2NiAweDA4MDAwMDAwICAgICAgICAvKiBITUU6IEFzc2VydCBSRVNFVCB0byBGQVMzNjYgKi8KLQotLyogVmFsdWVzIGRlc2NyaWJpbmcgdGhlIGJ1cnN0LXNpemUgcHJvcGVydHkgZnJvbSB0aGUgUFJPTSAqLwotI2RlZmluZSBETUFfQlVSU1QxICAgICAgIDB4MDEKLSNkZWZpbmUgRE1BX0JVUlNUMiAgICAgICAweDAyCi0jZGVmaW5lIERNQV9CVVJTVDQgICAgICAgMHgwNAotI2RlZmluZSBETUFfQlVSU1Q4ICAgICAgIDB4MDgKLSNkZWZpbmUgRE1BX0JVUlNUMTYgICAgICAweDEwCi0jZGVmaW5lIERNQV9CVVJTVDMyICAgICAgMHgyMAotI2RlZmluZSBETUFfQlVSU1Q2NCAgICAgIDB4NDAKLSNkZWZpbmUgRE1BX0JVUlNUQklUUyAgICAweDdmCi0KLS8qIERldGVybWluZSBoaWdoZXN0IHBvc3NpYmxlIGZpbmFsIHRyYW5zZmVyIGFkZHJlc3MgZ2l2ZW4gYSBiYXNlICovCi0jZGVmaW5lIERNQV9NQVhFTkQoYWRkcikgKDB4MDEwMDAwMDBVTC0oKCh1bnNpZ25lZCBsb25nKShhZGRyKSkmMHgwMGZmZmZmZlVMKSkKLQotLyogWWVzLCBJIGhhY2sgYSBsb3Qgb2YgZWxpc3AgaW4gbXkgc3BhcmUgdGltZS4uLiAqLwotI2RlZmluZSBETUFfRVJST1JfUChyZWdzKSAgKCgoKHJlZ3MpLT5jb25kX3JlZykgJiBETUFfSE5ETF9FUlJPUikpCi0jZGVmaW5lIERNQV9JUlFfUChyZWdzKSAgICAoKCgocmVncyktPmNvbmRfcmVnKSAmIChETUFfSE5ETF9JTlRSIHwgRE1BX0hORExfRVJST1IpKSkKLSNkZWZpbmUgRE1BX1dSSVRFX1AocmVncykgICgoKChyZWdzKS0+Y29uZF9yZWcpICYgRE1BX1NUX1dSSVRFKSkKLSNkZWZpbmUgRE1BX09GRihyZWdzKSAgICAgICgoKChyZWdzKS0+Y29uZF9yZWcpICY9ICh+RE1BX0VOQUJMRSkpKQotI2RlZmluZSBETUFfSU5UU09GRihyZWdzKSAgKCgoKHJlZ3MpLT5jb25kX3JlZykgJj0gKH5ETUFfSU5UX0VOQUIpKSkKLSNkZWZpbmUgRE1BX0lOVFNPTihyZWdzKSAgICgoKChyZWdzKS0+Y29uZF9yZWcpIHw9IChETUFfSU5UX0VOQUIpKSkKLSNkZWZpbmUgRE1BX1BVTlRGSUZPKHJlZ3MpICgoKChyZWdzKS0+Y29uZF9yZWcpIHw9IERNQV9GSUZPX0lOVikpCi0jZGVmaW5lIERNQV9TRVRTVEFSVChyZWdzLCBhZGRyKSAgKCgoKHJlZ3MpLT5zdF9hZGRyKSA9IChjaGFyICopIGFkZHIpKQotI2RlZmluZSBETUFfQkVHSU5ETUFfVyhyZWdzKSBcCi0gICAgICAgICgoKChyZWdzKS0+Y29uZF9yZWcgfD0gKERNQV9TVF9XUklURXxETUFfRU5BQkxFfERNQV9JTlRfRU5BQikpKSkKLSNkZWZpbmUgRE1BX0JFR0lORE1BX1IocmVncykgXAotICAgICAgICAoKCgocmVncyktPmNvbmRfcmVnIHw9ICgoRE1BX0VOQUJMRXxETUFfSU5UX0VOQUIpJih+RE1BX1NUX1dSSVRFKSkpKSkKLQotLyogRm9yIGNlcnRhaW4gRE1BIGNoaXBzLCB3ZSBuZWVkIHRvIGRpc2FibGUgaW50cyB1cG9uIGlycSBlbnRyeQotICogYW5kIHR1cm4gdGhlbSBiYWNrIG9uIHdoZW4gd2UgYXJlIGRvbmUuICBTbyBpbiBhbnkgRVNQIGludGVycnVwdAotICogaGFuZGxlciB5b3UgKm11c3QqIGNhbGwgRE1BX0lSUV9FTlRSWSB1cG9uIGVudHJ5IGFuZCBETUFfSVJRX0VYSVQKLSAqIHdoZW4gbGVhdmluZyB0aGUgaGFuZGxlci4gIFlvdSBoYXZlIGJlZW4gd2FybmVkLi4uCi0gKi8KLSNkZWZpbmUgRE1BX0lSUV9FTlRSWShkbWEsIGRyZWdzKSBkbyB7IFwKLSAgICAgICAgaWYoRE1BX0lTQlJPS0VOKGRtYSkpIERNQV9JTlRTT0ZGKGRyZWdzKTsgXAotICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBETUFfSVJRX0VYSVQoZG1hLCBkcmVncykgZG8geyBcCi0JaWYoRE1BX0lTQlJPS0VOKGRtYSkpIERNQV9JTlRTT04oZHJlZ3MpOyBcCi0gICB9IHdoaWxlKDApCi0KLSNpZiAwCS8qIFAzIHRoaXMgc3R1ZmYgaXMgaW5saW5lIGluIGxlZG1hLmM6aW5pdF9yZXN0YXJ0X2xlZG1hKCkgKi8KLS8qIFBhdXNlIHVudGlsIGNvdW50ZXIgcnVucyBvdXQgb3IgQklUIGlzbid0IHNldCBpbiB0aGUgRE1BIGNvbmRpdGlvbgotICogcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGFyY19kbWFfcGF1c2Uoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKnJlZ3MsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0KQotewotCWludCBjdHIgPSA1MDAwMDsgICAvKiBMZXQncyBmaW5kIHNvbWUgYnVncyA7KSAqLwotCi0JLyogQnVzeSB3YWl0IHVudGlsIHRoZSBiaXQgaXMgbm90IHNldCBhbnkgbW9yZSAqLwotCXdoaWxlKChyZWdzLT5jb25kX3JlZyZiaXQpICYmIChjdHI+MCkpIHsKLQkJY3RyLS07Ci0JCV9fZGVsYXkoNSk7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIGJvZ3VzIG91dGNvbWUuICovCi0JaWYoIWN0cikKLQkJcGFuaWMoIkRNQSB0aW1lb3V0Iik7Ci19Ci0KLS8qIFJlc2V0IHRoZSBmcmlnZ2luJyB0aGluZy4uLiAqLwotI2RlZmluZSBETUFfUkVTRVQoZG1hKSBkbyB7IFwKLQlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqcmVncyA9IGRtYS0+cmVnczsgICAgICAgICAgICAgICAgICAgICAgXAotCS8qIExldCB0aGUgY3VycmVudCBGSUZPIGRyYWluIGl0c2VsZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3BhcmNfZG1hX3BhdXNlKHJlZ3MsIChETUFfRklGT19JU0RSQUlOKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkvKiBSZXNldCB0aGUgbG9naWMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXJlZ3MtPmNvbmRfcmVnIHw9IChETUFfUlNUX1NDU0kpOyAgICAgLyogYXNzZXJ0ICovICAgICAgICAgICAgICAgICBcCi0JX19kZWxheSg0MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQgdGhlIGJpdHMgc2V0IDspICovICAgIFwKLQlyZWdzLT5jb25kX3JlZyAmPSB+KERNQV9SU1RfU0NTSSk7ICAgIC8qIGRlLWFzc2VydCAqLyAgICAgICAgICAgICAgXAotCXNwYXJjX2RtYV9lbmFibGVfaW50ZXJydXB0cyhyZWdzKTsgICAgLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8gICBcCi0JLyogRW5hYmxlIEZBU1QgdHJhbnNmZXJzIGlmIGF2YWlsYWJsZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZihkbWEtPnJldmlzaW9uPmR2bWFyZXYxKSByZWdzLT5jb25kX3JlZyB8PSBETUFfM0NMS1M7ICAgICAgICAgICAgXAotCWRtYS0+cnVubmluZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBmb3JfZWFjaF9kdm1hKGRtYSkgXAotICAgICAgICBmb3IoKGRtYSkgPSBkbWFfY2hhaW47IChkbWEpOyAoZG1hKSA9IChkbWEpLT5uZXh0KQotCi1leHRlcm4gaW50IGdldF9kbWFfbGlzdChjaGFyICopOwotZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQsIF9fY29uc3RfXyBjaGFyICopOwotZXh0ZXJuIHZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50KTsKLQotLyogRnJvbSBQQ0kgKi8KLQotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiBpbnQgaXNhX2RtYV9icmlkZ2VfYnVnZ3k7Ci0jZWxzZQotI2RlZmluZSBpc2FfZG1hX2JyaWRnZV9idWdneQkoMCkKLSNlbmRpZgotCi0vKiBSb3V0aW5lcyBmb3IgZGF0YSB0cmFuc2ZlciBidWZmZXJzLiAqLwotQlRGSVhVUERFRl9DQUxMKGNoYXIgKiwgbW11X2xvY2thcmVhLCBjaGFyICosIHVuc2lnbmVkIGxvbmcpCi1CVEZJWFVQREVGX0NBTEwodm9pZCwgICBtbXVfdW5sb2NrYXJlYSwgY2hhciAqLCB1bnNpZ25lZCBsb25nKQotCi0jZGVmaW5lIG1tdV9sb2NrYXJlYSh2YWRkcixsZW4pIEJURklYVVBfQ0FMTChtbXVfbG9ja2FyZWEpKHZhZGRyLGxlbikKLSNkZWZpbmUgbW11X3VubG9ja2FyZWEodmFkZHIsbGVuKSBCVEZJWFVQX0NBTEwobW11X3VubG9ja2FyZWEpKHZhZGRyLGxlbikKLQotLyogVGhlc2UgYXJlIGltcGxlbWVudGF0aW9ucyBmb3Igc2J1c19tYXBfc2cvc2J1c191bm1hcF9zZy4uLiBjb2xsYXBzZSBsYXRlciAqLwotQlRGSVhVUERFRl9DQUxMKF9fdTMyLCBtbXVfZ2V0X3Njc2lfb25lLCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLUJURklYVVBERUZfQ0FMTCh2b2lkLCAgbW11X2dldF9zY3NpX3NnbCwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwgc3RydWN0IHNidXNfYnVzICpzYnVzKQotQlRGSVhVUERFRl9DQUxMKHZvaWQsICBtbXVfcmVsZWFzZV9zY3NpX29uZSwgX191MzIsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLUJURklYVVBERUZfQ0FMTCh2b2lkLCAgbW11X3JlbGVhc2Vfc2NzaV9zZ2wsIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLQotI2RlZmluZSBtbXVfZ2V0X3Njc2lfb25lKHZhZGRyLGxlbixzYnVzKSBCVEZJWFVQX0NBTEwobW11X2dldF9zY3NpX29uZSkodmFkZHIsbGVuLHNidXMpCi0jZGVmaW5lIG1tdV9nZXRfc2NzaV9zZ2woc2csc3osc2J1cykgQlRGSVhVUF9DQUxMKG1tdV9nZXRfc2NzaV9zZ2wpKHNnLHN6LHNidXMpCi0jZGVmaW5lIG1tdV9yZWxlYXNlX3Njc2lfb25lKHZhZGRyLGxlbixzYnVzKSBCVEZJWFVQX0NBTEwobW11X3JlbGVhc2Vfc2NzaV9vbmUpKHZhZGRyLGxlbixzYnVzKQotI2RlZmluZSBtbXVfcmVsZWFzZV9zY3NpX3NnbChzZyxzeixzYnVzKSBCVEZJWFVQX0NBTEwobW11X3JlbGVhc2Vfc2NzaV9zZ2wpKHNnLHN6LHNidXMpCi0KLS8qCi0gKiBtbXVfbWFwL3VubWFwIGFyZSBwcm92aWRlZCBieSBpb21tdS9pb3VuaXQ7IEludmFsaWQgdG8gY2FsbCBvbiBJSWVwLgotICoKLSAqIFRoZSBtbXVfbWFwX2RtYV9hcmVhIGVzdGFibGlzaGVzIHR3byBtYXBwaW5ncyBpbiBvbmUgZ28uCi0gKiBUaGVzZSBtYXBwaW5ncyBwb2ludCB0byBwYWdlcyBub3JtYWxseSBtYXBwZWQgYXQgJ3ZhJyAobGluZWFyIGFkZHJlc3MpLgotICogRmlyc3QgbWFwcGluZyBpcyBmb3IgQ1BVIHZpc2libGUgYWRkcmVzcyBhdCAnYScsIHVuY2FjaGVkLgotICogVGhpcyBpcyBhbiBhbGlhcywgYnV0IGl0IHdvcmtzIGJlY2F1c2UgaXQgaXMgYW4gdW5jYWNoZWQgbWFwcGluZy4KLSAqIFNlY29uZCBtYXBwaW5nIGlzIGZvciBkZXZpY2UgdmlzaWJsZSBhZGRyZXNzLCBvciAiYnVzIiBhZGRyZXNzLgotICogVGhlIGJ1cyBhZGRyZXNzIGlzIHJldHVybmVkIGF0ICcqcGJhJy4KLSAqCi0gKiBUaGVzZSBmdW5jdGlvbnMgc2VlbSBkaXN0aW5jdCwgYnV0IGFyZSBoYXJkIHRvIHNwbGl0LiBPbiBzdW40YywKLSAqIGF0IGxlYXN0IGZvciBub3csICdhJyBpcyBlcXVhbCB0byBidXMgYWRkcmVzcywgYW5kIHJldHVyZWQgaW4gKnBiYS4KLSAqIE9uIHN1bjRtLCBwYWdlIGF0dHJpYnV0ZXMgZGVwZW5kIG9uIHRoZSBDUFUgdHlwZSwgc28gd2UgaGF2ZSB0bwotICoga25vdyBpZiB3ZSBhcmUgbWFwcGluZyBSQU0gb3IgSS9PLCBzbyBpdCBoYXMgdG8gYmUgYW4gYWRkaXRpb25hbCBhcmd1bWVudAotICogdG8gYSBzZXBhcmF0ZSBtYXBwaW5nIGZ1bmN0aW9uIGZvciBDUFUgdmlzaWJsZSBtYXBwaW5ncy4KLSAqLwotQlRGSVhVUERFRl9DQUxMKGludCwgIG1tdV9tYXBfZG1hX2FyZWEsIGRtYV9hZGRyX3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50IGxlbikKLUJURklYVVBERUZfQ0FMTChzdHJ1Y3QgcGFnZSAqLCBtbXVfdHJhbnNsYXRlX2R2bWEsIHVuc2lnbmVkIGxvbmcgYnVzYSkKLUJURklYVVBERUZfQ0FMTCh2b2lkLCAgbW11X3VubWFwX2RtYV9hcmVhLCB1bnNpZ25lZCBsb25nIGJ1c2EsIGludCBsZW4pCi0KLSNkZWZpbmUgbW11X21hcF9kbWFfYXJlYShwYmEsdmEsYSxsZW4pIEJURklYVVBfQ0FMTChtbXVfbWFwX2RtYV9hcmVhKShwYmEsdmEsYSxsZW4pCi0jZGVmaW5lIG1tdV91bm1hcF9kbWFfYXJlYShiYSxsZW4pIEJURklYVVBfQ0FMTChtbXVfdW5tYXBfZG1hX2FyZWEpKGJhLGxlbikKLSNkZWZpbmUgbW11X3RyYW5zbGF0ZV9kdm1hKGJhKSAgICAgQlRGSVhVUF9DQUxMKG1tdV90cmFuc2xhdGVfZHZtYSkoYmEpCi0KLSNlbmRpZiAvKiAhKF9BU01fU1BBUkNfRE1BX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9kbWFfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhOGFlYy4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2RtYV82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS9kbWEuaAotICoKLSAqIENvcHlyaWdodCAxOTk2IChDKSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKi8KLQotI2lmbmRlZiBfQVNNX1NQQVJDNjRfRE1BX0gKLSNkZWZpbmUgX0FTTV9TUEFSQzY0X0RNQV9ICi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotCi0vKiBUaGVzZSBhcmUgaXJyZWxldmFudCBmb3IgU3BhcmMgRE1BLCBidXQgd2UgbGVhdmUgaXQgaW4gc28gdGhhdAotICogdGhpbmdzIGNhbiBjb21waWxlLgotICovCi0jZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgOAotI2RlZmluZSBETUFfTU9ERV9SRUFEICAgIDEKLSNkZWZpbmUgRE1BX01PREVfV1JJVEUgICAyCi0jZGVmaW5lIE1BWF9ETUFfQUREUkVTUyAgKH4wVUwpCi0KLS8qIFVzZWZ1bCBjb25zdGFudHMgKi8KLSNkZWZpbmUgU0laRV8xNk1CICAgICAgKDE2KjEwMjQqMTAyNCkKLSNkZWZpbmUgU0laRV82NEsgICAgICAgKDY0KjEwMjQpCi0KLS8qIFNCVVMgRE1BIGNvbnRyb2xsZXIgcmVnIG9mZnNldHMgKi8KLSNkZWZpbmUgRE1BX0NTUgkJMHgwMFVMCQkvKiBydyAgRE1BIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICAgIDB4MDAgICAqLwotI2RlZmluZSBETUFfQUREUgkweDA0VUwJCS8qIHJ3ICBETUEgdHJhbnNmZXIgYWRkcmVzcyByZWdpc3RlciAgMHgwNCAgICovCi0jZGVmaW5lIERNQV9DT1VOVAkweDA4VUwJCS8qIHJ3ICBETUEgdHJhbnNmZXIgY291bnQgcmVnaXN0ZXIgICAgMHgwOCAgICovCi0jZGVmaW5lIERNQV9URVNUCTB4MGNVTAkJLyogcncgIERNQSB0ZXN0L2RlYnVnIHJlZ2lzdGVyICAgICAgICAweDBjICAgKi8KLQotLyogRFZNQSBjaGlwIHJldmlzaW9ucyAqLwotZW51bSBkdm1hX3JldiB7Ci0JZHZtYXJldjAsCi0JZHZtYWVzYzEsCi0JZHZtYXJldjEsCi0JZHZtYXJldjIsCi0JZHZtYXJldjMsCi0JZHZtYXJldnBsdXMsCi0JZHZtYWhtZQotfTsKLQotI2RlZmluZSBETUFfSEFTQ09VTlQocmV2KSAgKChyZXYpPT1kdm1hZXNjMSkKLQotLyogTGludXggRE1BIGluZm9ybWF0aW9uIHN0cnVjdHVyZSwgZmlsbGVkIGR1cmluZyBwcm9iZS4gKi8KLXN0cnVjdCBzYnVzX2RtYSB7Ci0Jc3RydWN0IHNidXNfZG1hICpuZXh0OwotCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKLQl2b2lkIF9faW9tZW0gKnJlZ3M7Ci0KLQkvKiBTdGF0dXMsIG1pc2MgaW5mbyAqLwotCWludCBub2RlOyAgICAgICAgICAgICAgICAvKiBQcm9tIG5vZGUgZm9yIHRoaXMgRE1BIGRldmljZSAqLwotCWludCBydW5uaW5nOyAgICAgICAgICAgICAvKiBBcmUgd2UgZG9pbmcgRE1BIG5vdz8gKi8KLQlpbnQgYWxsb2NhdGVkOyAgICAgICAgICAgLyogQXJlIHdlICJvd25lZCIgYnkgYW55b25lIHlldD8gKi8KLQotCS8qIFRyYW5zZmVyIGluZm9ybWF0aW9uLiAqLwotCXUzMiBhZGRyOyAgICAgICAgICAgICAgICAvKiBTdGFydCBhZGRyZXNzIG9mIGN1cnJlbnQgdHJhbnNmZXIgKi8KLQlpbnQgbmJ5dGVzOyAgICAgICAgICAgICAgLyogU2l6ZSBvZiBjdXJyZW50IHRyYW5zZmVyICovCi0JaW50IHJlYWxieXRlczsgICAgICAgICAgIC8qIEZvciBzcGxpdHRpbmcgdXAgbGFyZ2UgdHJhbnNmZXJzLCBldGMuICovCi0KLQkvKiBETUEgcmV2aXNpb24gKi8KLQllbnVtIGR2bWFfcmV2IHJldmlzaW9uOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBzYnVzX2RtYSAqZG1hX2NoYWluOwotCi0vKiBCcm9rZW4gaGFyZHdhcmUuLi4gKi8KLSNkZWZpbmUgRE1BX0lTQlJPS0VOKGRtYSkgICAgKChkbWEpLT5yZXZpc2lvbiA9PSBkdm1hcmV2MSkKLSNkZWZpbmUgRE1BX0lTRVNDMShkbWEpICAgICAgKChkbWEpLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkKLQotLyogTWFpbiByb3V0aW5lcyBpbiBkbWEuYyAqLwotZXh0ZXJuIHZvaWQgZHZtYV9pbml0KHN0cnVjdCBzYnVzX2J1cyAqKTsKLQotLyogRmllbGRzIGluIHRoZSBjb25kX3JlZyByZWdpc3RlciAqLwotLyogRmlyc3QsIHRoZSB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIGJpdHMgKi8KLSNkZWZpbmUgRE1BX0RFVklDRV9JRCAgICAweGYwMDAwMDAwICAgICAgICAvKiBEZXZpY2UgaWRlbnRpZmljYXRpb24gYml0cyAqLwotI2RlZmluZSBETUFfVkVSUzAgICAgICAgIDB4MDAwMDAwMDAgICAgICAgIC8qIFN1bnJheSBETUEgdmVyc2lvbiAqLwotI2RlZmluZSBETUFfRVNDVjEgICAgICAgIDB4NDAwMDAwMDAgICAgICAgIC8qIERNQSBFU0MgVmVyc2lvbiAxICovCi0jZGVmaW5lIERNQV9WRVJTMSAgICAgICAgMHg4MDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAxICovCi0jZGVmaW5lIERNQV9WRVJTMiAgICAgICAgMHhhMDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAyICovCi0jZGVmaW5lIERNQV9WRVJITUUgICAgICAgMHhiMDAwMDAwMCAgICAgICAgLyogRE1BIGhtZSBnYXRlIGFycmF5ICovCi0jZGVmaW5lIERNQV9WRVJTUExVUyAgICAgMHg5MDAwMDAwMCAgICAgICAgLyogRE1BIHJldiAxIFBMVVMgKi8KLQotI2RlZmluZSBETUFfSE5ETF9JTlRSICAgIDB4MDAwMDAwMDEgICAgICAgIC8qIEFuIElSUSBuZWVkcyB0byBiZSBoYW5kbGVkICovCi0jZGVmaW5lIERNQV9ITkRMX0VSUk9SICAgMHgwMDAwMDAwMiAgICAgICAgLyogV2UgbmVlZCB0byB0YWtlIGFuIGVycm9yICovCi0jZGVmaW5lIERNQV9GSUZPX0lTRFJBSU4gMHgwMDAwMDAwYyAgICAgICAgLyogVGhlIERNQSBGSUZPIGlzIGRyYWluaW5nICovCi0jZGVmaW5lIERNQV9JTlRfRU5BQiAgICAgMHgwMDAwMDAxMCAgICAgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIERNQV9GSUZPX0lOViAgICAgMHgwMDAwMDAyMCAgICAgICAgLyogSW52YWxpZGF0ZSB0aGUgRklGTyAqLwotI2RlZmluZSBETUFfQUNDX1NaX0VSUiAgIDB4MDAwMDAwNDAgICAgICAgIC8qIFRoZSBhY2Nlc3Mgc2l6ZSB3YXMgYmFkICovCi0jZGVmaW5lIERNQV9GSUZPX1NURFJBSU4gMHgwMDAwMDA0MCAgICAgICAgLyogRE1BX1ZFUlMxIERyYWluIHRoZSBGSUZPICovCi0jZGVmaW5lIERNQV9SU1RfU0NTSSAgICAgMHgwMDAwMDA4MCAgICAgICAgLyogUmVzZXQgdGhlIFNDU0kgY29udHJvbGxlciAqLwotI2RlZmluZSBETUFfUlNUX0VORVQgICAgIERNQV9SU1RfU0NTSSAgICAgIC8qIFJlc2V0IHRoZSBFTkVUIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgRE1BX1NUX1dSSVRFICAgICAweDAwMDAwMTAwICAgICAgICAvKiB3cml0ZSBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KLSNkZWZpbmUgRE1BX0VOQUJMRSAgICAgICAweDAwMDAwMjAwICAgICAgICAvKiBGaXJlIHVwIERNQSwgaGFuZGxlIHJlcXVlc3RzICovCi0jZGVmaW5lIERNQV9QRU5EX1JFQUQgICAgMHgwMDAwMDQwMCAgICAgICAgLyogRE1BX1ZFUlMxLzAvUExVUyBQZW5kaW5nIFJlYWQgKi8KLSNkZWZpbmUgRE1BX0VTQ19CVVJTVCAgICAweDAwMDAwODAwICAgICAgICAvKiAxPTE2Ynl0ZSAwPTMyYnl0ZSAqLwotI2RlZmluZSBETUFfUkVBRF9BSEVBRCAgIDB4MDAwMDE4MDAgICAgICAgIC8qIERNQSByZWFkIGFoZWFkIHBhcnRpYWwgbG9uZ3dvcmQgKi8KLSNkZWZpbmUgRE1BX0RTQkxfUkRfRFJOICAweDAwMDAxMDAwICAgICAgICAvKiBObyBFQyBkcmFpbiBvbiBzbGF2ZSByZWFkcyAqLwotI2RlZmluZSBETUFfQkNOVF9FTkFCICAgIDB4MDAwMDIwMDAgICAgICAgIC8qIElmIG9uLCB1c2UgdGhlIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBETUFfVEVSTV9DTlRSICAgIDB4MDAwMDQwMDAgICAgICAgIC8qIFRlcm1pbmFsIGNvdW50ZXIgKi8KLSNkZWZpbmUgRE1BX1NDU0lfU0JVUzY0ICAweDAwMDA4MDAwICAgICAgICAvKiBITUU6IEVuYWJsZSA2NC1iaXQgU0JVUyBtb2RlLiAqLwotI2RlZmluZSBETUFfQ1NSX0RJU0FCICAgIDB4MDAwMTAwMDAgICAgICAgIC8qIE5vIEZJRk8gZHJhaW5zIGR1cmluZyBjc3IgKi8KLSNkZWZpbmUgRE1BX1NDU0lfRElTQUIgICAweDAwMDIwMDAwICAgICAgICAvKiBObyBGSUZPIGRyYWlucyBkdXJpbmcgcmVnICovCi0jZGVmaW5lIERNQV9EU0JMX1dSX0lOViAgMHgwMDAyMDAwMCAgICAgICAgLyogTm8gRUMgaW52YWwuIG9uIHNsYXZlIHdyaXRlcyAqLwotI2RlZmluZSBETUFfQUREX0VOQUJMRSAgIDB4MDAwNDAwMDAgICAgICAgIC8qIFNwZWNpYWwgRVNDIERWTUEgb3B0aW1pemF0aW9uICovCi0jZGVmaW5lIERNQV9FX0JVUlNUUwkgMHgwMDBjMDAwMAkgICAvKiBFTkVUOiBTQlVTIHIvdyBidXJzdCBtYXNrICovCi0jZGVmaW5lIERNQV9FX0JVUlNUMzIJIDB4MDAwNDAwMDAJICAgLyogRU5FVDogU0JVUyAzMiBieXRlIHIvdyBidXJzdCAqLwotI2RlZmluZSBETUFfRV9CVVJTVDE2CSAweDAwMDAwMDAwCSAgIC8qIEVORVQ6IFNCVVMgMTYgYnl0ZSByL3cgYnVyc3QgKi8KLSNkZWZpbmUgRE1BX0JSU1RfU1ogICAgICAweDAwMGMwMDAwICAgICAgICAvKiBTQ1NJOiBTQlVTIHIvdyBidXJzdCBzaXplICovCi0jZGVmaW5lIERNQV9CUlNUNjQgICAgICAgMHgwMDBjMDAwMCAgICAgICAgLyogU0NTSTogNjRieXRlIGJ1cnN0cyAoSE1FIG9uIFVsdHJhU3BhcmMgb25seSkgKi8KLSNkZWZpbmUgRE1BX0JSU1QzMiAgICAgICAweDAwMDQwMDAwICAgICAgICAvKiBTQ1NJOiAzMmJ5dGUgYnVyc3RzICovCi0jZGVmaW5lIERNQV9CUlNUMTYgICAgICAgMHgwMDAwMDAwMCAgICAgICAgLyogU0NTSTogMTZieXRlIGJ1cnN0cyAqLwotI2RlZmluZSBETUFfQlJTVDAgICAgICAgIDB4MDAwODAwMDAgICAgICAgIC8qIFNDU0k6IG5vIGJ1cnN0cyAobm9uLUhNRSBnYXRlIGFycmF5cykgKi8KLSNkZWZpbmUgRE1BX0FERFJfRElTQUIgICAweDAwMTAwMDAwICAgICAgICAvKiBObyBGSUZPIGRyYWlucyBkdXJpbmcgYWRkciAqLwotI2RlZmluZSBETUFfMkNMS1MgICAgICAgIDB4MDAyMDAwMDAgICAgICAgIC8qIEVhY2ggdHJhbnNmZXIgPSAyIGNsb2NrIHRpY2tzICovCi0jZGVmaW5lIERNQV8zQ0xLUyAgICAgICAgMHgwMDQwMDAwMCAgICAgICAgLyogRWFjaCB0cmFuc2ZlciA9IDMgY2xvY2sgdGlja3MgKi8KLSNkZWZpbmUgRE1BX0VOX0VORVRBVUkgICBETUFfM0NMS1MgICAgICAgICAvKiBQdXQgbGFuY2UgaW50byBBVUktY2FibGUgbW9kZSAqLwotI2RlZmluZSBETUFfQ05UUl9ESVNBQiAgIDB4MDA4MDAwMDAgICAgICAgIC8qIE5vIElSUSB3aGVuIERNQV9URVJNX0NOVFIgc2V0ICovCi0jZGVmaW5lIERNQV9BVVRPX05BRERSICAgMHgwMTAwMDAwMCAgICAgICAgLyogVXNlICJhdXRvIG54dCBhZGRyIiBmZWF0dXJlICovCi0jZGVmaW5lIERNQV9TQ1NJX09OICAgICAgMHgwMjAwMDAwMCAgICAgICAgLyogRW5hYmxlIFNDU0kgZG1hICovCi0jZGVmaW5lIERNQV9QQVJJVFlfT0ZGICAgMHgwMjAwMDAwMCAgICAgICAgLyogSE1FOiBkaXNhYmxlIHBhcml0eSBjaGVja2luZyAqLwotI2RlZmluZSBETUFfTE9BREVEX0FERFIgIDB4MDQwMDAwMDAgICAgICAgIC8qIEFkZHJlc3MgaGFzIGJlZW4gbG9hZGVkICovCi0jZGVmaW5lIERNQV9MT0FERURfTkFERFIgMHgwODAwMDAwMCAgICAgICAgLyogTmV4dCBhZGRyZXNzIGhhcyBiZWVuIGxvYWRlZCAqLwotI2RlZmluZSBETUFfUkVTRVRfRkFTMzY2IDB4MDgwMDAwMDAgICAgICAgIC8qIEhNRTogQXNzZXJ0IFJFU0VUIHRvIEZBUzM2NiAqLwotCi0vKiBWYWx1ZXMgZGVzY3JpYmluZyB0aGUgYnVyc3Qtc2l6ZSBwcm9wZXJ0eSBmcm9tIHRoZSBQUk9NICovCi0jZGVmaW5lIERNQV9CVVJTVDEgICAgICAgMHgwMQotI2RlZmluZSBETUFfQlVSU1QyICAgICAgIDB4MDIKLSNkZWZpbmUgRE1BX0JVUlNUNCAgICAgICAweDA0Ci0jZGVmaW5lIERNQV9CVVJTVDggICAgICAgMHgwOAotI2RlZmluZSBETUFfQlVSU1QxNiAgICAgIDB4MTAKLSNkZWZpbmUgRE1BX0JVUlNUMzIgICAgICAweDIwCi0jZGVmaW5lIERNQV9CVVJTVDY0ICAgICAgMHg0MAotI2RlZmluZSBETUFfQlVSU1RCSVRTICAgIDB4N2YKLQotLyogRGV0ZXJtaW5lIGhpZ2hlc3QgcG9zc2libGUgZmluYWwgdHJhbnNmZXIgYWRkcmVzcyBnaXZlbiBhIGJhc2UgKi8KLSNkZWZpbmUgRE1BX01BWEVORChhZGRyKSAoMHgwMTAwMDAwMFVMLSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSYweDAwZmZmZmZmVUwpKQotCi0vKiBZZXMsIEkgaGFjayBhIGxvdCBvZiBlbGlzcCBpbiBteSBzcGFyZSB0aW1lLi4uICovCi0jZGVmaW5lIERNQV9FUlJPUl9QKHJlZ3MpICAoKHNidXNfcmVhZGwoKHJlZ3MpICsgRE1BX0NTUikgJiBETUFfSE5ETF9FUlJPUikpCi0jZGVmaW5lIERNQV9JUlFfUChyZWdzKSAgICAoKHNidXNfcmVhZGwoKHJlZ3MpICsgRE1BX0NTUikpICYgKERNQV9ITkRMX0lOVFIgfCBETUFfSE5ETF9FUlJPUikpCi0jZGVmaW5lIERNQV9XUklURV9QKHJlZ3MpICAoKHNidXNfcmVhZGwoKHJlZ3MpICsgRE1BX0NTUikgJiBETUFfU1RfV1JJVEUpKQotI2RlZmluZSBETUFfT0ZGKF9fcmVncykJCVwKLWRvIHsJdTMyIHRtcCA9IHNidXNfcmVhZGwoKF9fcmVncykgKyBETUFfQ1NSKTsgXAotCXRtcCAmPSB+RE1BX0VOQUJMRTsgXAotCXNidXNfd3JpdGVsKHRtcCwgKF9fcmVncykgKyBETUFfQ1NSKTsgXAotfSB3aGlsZSgwKQotI2RlZmluZSBETUFfSU5UU09GRihfX3JlZ3MpCVwKLWRvIHsJdTMyIHRtcCA9IHNidXNfcmVhZGwoKF9fcmVncykgKyBETUFfQ1NSKTsgXAotCXRtcCAmPSB+RE1BX0lOVF9FTkFCOyBcCi0Jc2J1c193cml0ZWwodG1wLCAoX19yZWdzKSArIERNQV9DU1IpOyBcCi19IHdoaWxlKDApCi0jZGVmaW5lIERNQV9JTlRTT04oX19yZWdzKQlcCi1kbyB7CXUzMiB0bXAgPSBzYnVzX3JlYWRsKChfX3JlZ3MpICsgRE1BX0NTUik7IFwKLQl0bXAgfD0gRE1BX0lOVF9FTkFCOyBcCi0Jc2J1c193cml0ZWwodG1wLCAoX19yZWdzKSArIERNQV9DU1IpOyBcCi19IHdoaWxlKDApCi0jZGVmaW5lIERNQV9QVU5URklGTyhfX3JlZ3MpCVwKLWRvIHsJdTMyIHRtcCA9IHNidXNfcmVhZGwoKF9fcmVncykgKyBETUFfQ1NSKTsgXAotCXRtcCB8PSBETUFfRklGT19JTlY7IFwKLQlzYnVzX3dyaXRlbCh0bXAsIChfX3JlZ3MpICsgRE1BX0NTUik7IFwKLX0gd2hpbGUoMCkKLSNkZWZpbmUgRE1BX1NFVFNUQVJUKF9fcmVncywgX19hZGRyKQlcCi0Jc2J1c193cml0ZWwoKHUzMikoX19hZGRyKSwgKF9fcmVncykgKyBETUFfQUREUik7Ci0jZGVmaW5lIERNQV9CRUdJTkRNQV9XKF9fcmVncykJXAotZG8gewl1MzIgdG1wID0gc2J1c19yZWFkbCgoX19yZWdzKSArIERNQV9DU1IpOyBcCi0JdG1wIHw9IChETUFfU1RfV1JJVEV8RE1BX0VOQUJMRXxETUFfSU5UX0VOQUIpOyBcCi0Jc2J1c193cml0ZWwodG1wLCAoX19yZWdzKSArIERNQV9DU1IpOyBcCi19IHdoaWxlKDApCi0jZGVmaW5lIERNQV9CRUdJTkRNQV9SKF9fcmVncykJXAotZG8gewl1MzIgdG1wID0gc2J1c19yZWFkbCgoX19yZWdzKSArIERNQV9DU1IpOyBcCi0JdG1wIHw9IChETUFfRU5BQkxFfERNQV9JTlRfRU5BQik7IFwKLQl0bXAgJj0gfkRNQV9TVF9XUklURTsgXAotCXNidXNfd3JpdGVsKHRtcCwgKF9fcmVncykgKyBETUFfQ1NSKTsgXAotfSB3aGlsZSgwKQotCi0vKiBGb3IgY2VydGFpbiBETUEgY2hpcHMsIHdlIG5lZWQgdG8gZGlzYWJsZSBpbnRzIHVwb24gaXJxIGVudHJ5Ci0gKiBhbmQgdHVybiB0aGVtIGJhY2sgb24gd2hlbiB3ZSBhcmUgZG9uZS4gIFNvIGluIGFueSBFU1AgaW50ZXJydXB0Ci0gKiBoYW5kbGVyIHlvdSAqbXVzdCogY2FsbCBETUFfSVJRX0VOVFJZIHVwb24gZW50cnkgYW5kIERNQV9JUlFfRVhJVAotICogd2hlbiBsZWF2aW5nIHRoZSBoYW5kbGVyLiAgWW91IGhhdmUgYmVlbiB3YXJuZWQuLi4KLSAqLwotI2RlZmluZSBETUFfSVJRX0VOVFJZKGRtYSwgZHJlZ3MpIGRvIHsgXAotICAgICAgICBpZihETUFfSVNCUk9LRU4oZG1hKSkgRE1BX0lOVFNPRkYoZHJlZ3MpOyBcCi0gICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIERNQV9JUlFfRVhJVChkbWEsIGRyZWdzKSBkbyB7IFwKLQlpZihETUFfSVNCUk9LRU4oZG1hKSkgRE1BX0lOVFNPTihkcmVncyk7IFwKLSAgIH0gd2hpbGUoMCkKLQotI2RlZmluZSBmb3JfZWFjaF9kdm1hKGRtYSkgXAotICAgICAgICBmb3IoKGRtYSkgPSBkbWFfY2hhaW47IChkbWEpOyAoZG1hKSA9IChkbWEpLT5uZXh0KQotCi0vKiBGcm9tIFBDSSAqLwotCi0jaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIGludCBpc2FfZG1hX2JyaWRnZV9idWdneTsKLSNlbHNlCi0jZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMCkKLSNlbmRpZgotCi0jZW5kaWYgLyogIShfQVNNX1NQQVJDNjRfRE1BX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VidXMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E2ZDE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19FQlVTX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX0VCVVNfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL2VidXNfNjQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtL2VidXNfMzIuaD4KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VidXNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1c18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTFmMGIyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1c18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIGVidXMuaDogUENJIHRvIEVidXMgcHNldWRvIGRyaXZlciBzb2Z0d2FyZSBzdGF0ZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRWRkaWUgQy4gRG9zdCAoZWNkQHNreW5ldC5iZSkKLSAqCi0gKiBBZG9wdGVkIGZvciBzcGFyYyBieSBWLiBSb2dhbm92IGFuZCBHLiBSYWlrby4KLSAqLwotCi0jaWZuZGVmIF9fU1BBUkNfRUJVU19ICi0jZGVmaW5lIF9fU1BBUkNfRUJVU19ICi0KLSNpZm5kZWYgX0xJTlVYX0lPUE9SVF9ICi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotCi1zdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCB7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQJCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqcGFyZW50OwotCXN0cnVjdCBsaW51eF9lYnVzCQkqYnVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKLQlzdHJ1Y3QgcmVzb3VyY2UJCQkgcmVzb3VyY2VbUFJPTVJFR19NQVhdOwotCWludAkJCQkgbnVtX2FkZHJzOwotCXVuc2lnbmVkIGludAkJCSBpcnFzW1BST01JTlRSX01BWF07Ci0JaW50CQkJCSBudW1faXJxczsKLX07Ci0KLXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSB7Ci0Jc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkCQkqY2hpbGRyZW47Ci0Jc3RydWN0IGxpbnV4X2VidXMJCSpidXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotCXN0cnVjdCByZXNvdXJjZQkJCSByZXNvdXJjZVtQUk9NUkVHX01BWF07Ci0JaW50CQkJCSBudW1fYWRkcnM7Ci0JdW5zaWduZWQgaW50CQkJIGlycXNbUFJPTUlOVFJfTUFYXTsKLQlpbnQJCQkJIG51bV9pcnFzOwotfTsKLSNkZWZpbmUgdG9fZWJ1c19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSwgb2ZkZXYuZGV2KQotCi1zdHJ1Y3QgbGludXhfZWJ1cyB7Ci0Jc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7Ci0Jc3RydWN0IGxpbnV4X2VidXMJCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqZGV2aWNlczsKLQlzdHJ1Y3QgbGludXhfcGJtX2luZm8JCSpwYXJlbnQ7Ci0Jc3RydWN0IHBjaV9kZXYJCQkqc2VsZjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpwcm9tX25vZGU7Ci19OwotI2RlZmluZSB0b19lYnVzKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbGludXhfZWJ1cywgb2ZkZXYuZGV2KQotCi1zdHJ1Y3QgbGludXhfZWJ1c19kbWEgewotCXVuc2lnbmVkIGludCBkY3NyOwotCXVuc2lnbmVkIGludCBkYWNyOwotCXVuc2lnbmVkIGludCBkYmNyOwotfTsKLQotI2RlZmluZSBFQlVTX0RDU1JfSU5UX1BFTkQJMHgwMDAwMDAwMQotI2RlZmluZSBFQlVTX0RDU1JfRVJSX1BFTkQJMHgwMDAwMDAwMgotI2RlZmluZSBFQlVTX0RDU1JfRFJBSU4JCTB4MDAwMDAwMDQKLSNkZWZpbmUgRUJVU19EQ1NSX0lOVF9FTgkweDAwMDAwMDEwCi0jZGVmaW5lIEVCVVNfRENTUl9SRVNFVAkJMHgwMDAwMDA4MAotI2RlZmluZSBFQlVTX0RDU1JfV1JJVEUJCTB4MDAwMDAxMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0VOX0RNQQkweDAwMDAwMjAwCi0jZGVmaW5lIEVCVVNfRENTUl9DWUNfUEVORAkweDAwMDAwNDAwCi0jZGVmaW5lIEVCVVNfRENTUl9ESUFHX1JEX0RPTkUJMHgwMDAwMDgwMAotI2RlZmluZSBFQlVTX0RDU1JfRElBR19XUl9ET05FCTB4MDAwMDEwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0VOX0NOVAkweDAwMDAyMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9UQwkJMHgwMDAwNDAwMAotI2RlZmluZSBFQlVTX0RDU1JfRElTX0NTUl9EUk4JMHgwMDAxMDAwMAotI2RlZmluZSBFQlVTX0RDU1JfQlVSU1RfU1pfTUFTSwkweDAwMGMwMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9CVVJTVF9TWl8xCTB4MDAwODAwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0JVUlNUX1NaXzQJMHgwMDAwMDAwMAotI2RlZmluZSBFQlVTX0RDU1JfQlVSU1RfU1pfOAkweDAwMDQwMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9CVVJTVF9TWl8xNgkweDAwMGMwMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9ESUFHX0VOCTB4MDAxMDAwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0RJU19FUlJfUEVORAkweDAwNDAwMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9UQ0lfRElTCTB4MDA4MDAwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0VOX05FWFQJMHgwMTAwMDAwMAotI2RlZmluZSBFQlVTX0RDU1JfRE1BX09OCTB4MDIwMDAwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX0FfTE9BREVECTB4MDQwMDAwMDAKLSNkZWZpbmUgRUJVU19EQ1NSX05BX0xPQURFRAkweDA4MDAwMDAwCi0jZGVmaW5lIEVCVVNfRENTUl9ERVZfSURfTUFTSwkweGYwMDAwMDAwCi0KLWV4dGVybiBzdHJ1Y3QgbGludXhfZWJ1cwkJKmVidXNfY2hhaW47Ci0KLWV4dGVybiB2b2lkIGVidXNfaW5pdCh2b2lkKTsKLQotI2RlZmluZSBmb3JfZWFjaF9lYnVzKGJ1cykJCQkJCQlcCi0gICAgICAgIGZvcigoYnVzKSA9IGVidXNfY2hhaW47IChidXMpOyAoYnVzKSA9IChidXMpLT5uZXh0KQotCi0jZGVmaW5lIGZvcl9lYWNoX2VidXNkZXYoZGV2LCBidXMpCQkJCQlcCi0gICAgICAgIGZvcigoZGV2KSA9IChidXMpLT5kZXZpY2VzOyAoZGV2KTsgKGRldikgPSAoZGV2KS0+bmV4dCkKLQotI2RlZmluZSBmb3JfZWFjaF9lZGV2Y2hpbGQoZGV2LCBjaGlsZCkJCQkJCVwKLSAgICAgICAgZm9yKChjaGlsZCkgPSAoZGV2KS0+Y2hpbGRyZW47IChjaGlsZCk7IChjaGlsZCkgPSAoY2hpbGQpLT5uZXh0KQotCi0jZW5kaWYgLyogIShfX1NQQVJDX0VCVVNfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1c182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lYnVzXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzZhMTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lYnVzXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogZWJ1cy5oOiBQQ0kgdG8gRWJ1cyBwc2V1ZG8gZHJpdmVyIHNvZnR3YXJlIHN0YXRlLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBFZGRpZSBDLiBEb3N0IChlY2RAc2t5bmV0LmJlKQotICogQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKLSAqLwotCi0jaWZuZGVmIF9fU1BBUkM2NF9FQlVTX0gKLSNkZWZpbmUgX19TUEFSQzY0X0VCVVNfSAotCi0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotCi1zdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCB7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQJCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqcGFyZW50OwotCXN0cnVjdCBsaW51eF9lYnVzCQkqYnVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKLQlzdHJ1Y3QgcmVzb3VyY2UJCQkgcmVzb3VyY2VbUFJPTVJFR19NQVhdOwotCWludAkJCQkgbnVtX2FkZHJzOwotCXVuc2lnbmVkIGludAkJCSBpcnFzW1BST01JTlRSX01BWF07Ci0JaW50CQkJCSBudW1faXJxczsKLX07Ci0KLXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSB7Ci0Jc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkCQkqY2hpbGRyZW47Ci0Jc3RydWN0IGxpbnV4X2VidXMJCSpidXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotCXN0cnVjdCByZXNvdXJjZQkJCSByZXNvdXJjZVtQUk9NUkVHX01BWF07Ci0JaW50CQkJCSBudW1fYWRkcnM7Ci0JdW5zaWduZWQgaW50CQkJIGlycXNbUFJPTUlOVFJfTUFYXTsKLQlpbnQJCQkJIG51bV9pcnFzOwotfTsKLSNkZWZpbmUgdG9fZWJ1c19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSwgb2ZkZXYuZGV2KQotCi1zdHJ1Y3QgbGludXhfZWJ1cyB7Ci0Jc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7Ci0Jc3RydWN0IGxpbnV4X2VidXMJCSpuZXh0OwotCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqZGV2aWNlczsKLQlzdHJ1Y3QgcGNpX2RldgkJCSpzZWxmOwotCWludAkJCQkgaW5kZXg7Ci0JaW50CQkJCSBpc19yaW87Ci0Jc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotfTsKLSNkZWZpbmUgdG9fZWJ1cyhkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGxpbnV4X2VidXMsIG9mZGV2LmRldikKLQotc3RydWN0IGVidXNfZG1hX2luZm8gewotCXNwaW5sb2NrX3QJbG9jazsKLQl2b2lkIF9faW9tZW0JKnJlZ3M7Ci0KLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0jZGVmaW5lIEVCVVNfRE1BX0ZMQUdfVVNFX0VCRE1BX0hBTkRMRVIJCTB4MDAwMDAwMDEKLSNkZWZpbmUgRUJVU19ETUFfRkxBR19UQ0lfRElTQUJMRQkJMHgwMDAwMDAwMgotCi0JLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgaXMgRUJVU19ETUFfRkxBR19VU0VfRUJETUFfSEFORExFUiBpcwotCSAqIHNldC4KLQkgKi8KLQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwLCBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSk7Ci0Jdm9pZCAqY2xpZW50X2Nvb2tpZTsKLQl1bnNpZ25lZCBpbnQJaXJxOwotI2RlZmluZSBFQlVTX0RNQV9FVkVOVF9FUlJPUgkxCi0jZGVmaW5lIEVCVVNfRE1BX0VWRU5UX0RNQQkyCi0jZGVmaW5lIEVCVVNfRE1BX0VWRU5UX0RFVklDRQk0Ci0KLQl1bnNpZ25lZCBjaGFyCW5hbWVbNjRdOwotfTsKLQotZXh0ZXJuIGludCBlYnVzX2RtYV9yZWdpc3RlcihzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCk7Ci1leHRlcm4gaW50IGVidXNfZG1hX2lycV9lbmFibGUoc3RydWN0IGVidXNfZG1hX2luZm8gKnAsIGludCBvbik7Ci1leHRlcm4gdm9pZCBlYnVzX2RtYV91bnJlZ2lzdGVyKHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwKTsKLWV4dGVybiBpbnQgZWJ1c19kbWFfcmVxdWVzdChzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCwgZG1hX2FkZHJfdCBidXNfYWRkciwKLQkJCSAgICBzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIGVidXNfZG1hX3ByZXBhcmUoc3RydWN0IGVidXNfZG1hX2luZm8gKnAsIGludCB3cml0ZSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGVidXNfZG1hX3Jlc2lkdWUoc3RydWN0IGVidXNfZG1hX2luZm8gKnApOwotZXh0ZXJuIHVuc2lnbmVkIGludCBlYnVzX2RtYV9hZGRyKHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwKTsKLWV4dGVybiB2b2lkIGVidXNfZG1hX2VuYWJsZShzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCwgaW50IG9uKTsKLQotZXh0ZXJuIHN0cnVjdCBsaW51eF9lYnVzCQkqZWJ1c19jaGFpbjsKLQotZXh0ZXJuIHZvaWQgZWJ1c19pbml0KHZvaWQpOwotCi0jZGVmaW5lIGZvcl9lYWNoX2VidXMoYnVzKQkJCQkJCVwKLSAgICAgICAgZm9yKChidXMpID0gZWJ1c19jaGFpbjsgKGJ1cyk7IChidXMpID0gKGJ1cyktPm5leHQpCi0KLSNkZWZpbmUgZm9yX2VhY2hfZWJ1c2RldihkZXYsIGJ1cykJCQkJCVwKLSAgICAgICAgZm9yKChkZXYpID0gKGJ1cyktPmRldmljZXM7IChkZXYpOyAoZGV2KSA9IChkZXYpLT5uZXh0KQotCi0jZGVmaW5lIGZvcl9lYWNoX2VkZXZjaGlsZChkZXYsIGNoaWxkKQkJCQkJXAotICAgICAgICBmb3IoKGNoaWxkKSA9IChkZXYpLT5jaGlsZHJlbjsgKGNoaWxkKTsgKGNoaWxkKSA9IChjaGlsZCktPm5leHQpCi0KLSNlbmRpZiAvKiAhKF9fU1BBUkM2NF9FQlVTX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VidXNfZG1hLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VidXNfZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3YTViNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWJ1c19kbWEuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIF9fQVNNX1NQQVJDX0VCVVNfRE1BX0gKKyNkZWZpbmUgX19BU01fU1BBUkNfRUJVU19ETUFfSAorCitzdHJ1Y3QgZWJ1c19kbWFfaW5mbyB7CisJc3BpbmxvY2tfdAlsb2NrOworCXZvaWQgX19pb21lbQkqcmVnczsKKworCXVuc2lnbmVkIGludAlmbGFnczsKKyNkZWZpbmUgRUJVU19ETUFfRkxBR19VU0VfRUJETUFfSEFORExFUgkJMHgwMDAwMDAwMQorI2RlZmluZSBFQlVTX0RNQV9GTEFHX1RDSV9ESVNBQkxFCQkweDAwMDAwMDAyCisKKwkvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBpcyBFQlVTX0RNQV9GTEFHX1VTRV9FQkRNQV9IQU5ETEVSIGlzCisJICogc2V0LgorCSAqLworCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGVidXNfZG1hX2luZm8gKnAsIGludCBldmVudCwgdm9pZCAqY29va2llKTsKKwl2b2lkICpjbGllbnRfY29va2llOworCXVuc2lnbmVkIGludAlpcnE7CisjZGVmaW5lIEVCVVNfRE1BX0VWRU5UX0VSUk9SCTEKKyNkZWZpbmUgRUJVU19ETUFfRVZFTlRfRE1BCTIKKyNkZWZpbmUgRUJVU19ETUFfRVZFTlRfREVWSUNFCTQKKworCXVuc2lnbmVkIGNoYXIJbmFtZVs2NF07Cit9OworCitleHRlcm4gaW50IGVidXNfZG1hX3JlZ2lzdGVyKHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwKTsKK2V4dGVybiBpbnQgZWJ1c19kbWFfaXJxX2VuYWJsZShzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCwgaW50IG9uKTsKK2V4dGVybiB2b2lkIGVidXNfZG1hX3VucmVnaXN0ZXIoc3RydWN0IGVidXNfZG1hX2luZm8gKnApOworZXh0ZXJuIGludCBlYnVzX2RtYV9yZXF1ZXN0KHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwLCBkbWFfYWRkcl90IGJ1c19hZGRyLAorCQkJICAgIHNpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgZWJ1c19kbWFfcHJlcGFyZShzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCwgaW50IHdyaXRlKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZWJ1c19kbWFfcmVzaWR1ZShzdHJ1Y3QgZWJ1c19kbWFfaW5mbyAqcCk7CitleHRlcm4gdW5zaWduZWQgaW50IGVidXNfZG1hX2FkZHIoc3RydWN0IGVidXNfZG1hX2luZm8gKnApOworZXh0ZXJuIHZvaWQgZWJ1c19kbWFfZW5hYmxlKHN0cnVjdCBlYnVzX2RtYV9pbmZvICpwLCBpbnQgb24pOworCisjZW5kaWYgLyogX19BU01fU1BBUkNfRUJVU19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lbGZfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWxmXzMyLmgKaW5kZXggZDA0M2Y4MC4uMzgxYTFiNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lbGZfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VsZl8zMi5oCkBAIC0xMDUsMTEgKzEwNSw4IEBACiAjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCiAKICNkZWZpbmUgVVNFX0VMRl9DT1JFX0RVTVAKLSNpZm5kZWYgQ09ORklHX1NVTjQKKwogI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQk0MDk2Ci0jZWxzZQotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQk4MTkyCi0jZW5kaWYKIAogCiAvKiBUaGlzIGlzIHRoZSBsb2NhdGlvbiB0aGF0IGFuIEVUX0RZTiBwcm9ncmFtIGlzIGxvYWRlZCBpZiBleGVjJ2VkLiAgVHlwaWNhbApAQCAtMTI2LDcgKzEyMyw3IEBACiAvKiBTdW40YyBoYXMgbm9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzLCBtb3N0IHN1bjRtJ3MgaGF2ZSB0aGVtIGFsbC4KICAqIFhYWCBUaGlzIGlzIGdyb3NzLCBzZXQgc29tZSBnbG9iYWwgdmFyaWFibGUgYXQgYm9vdCB0aW1lLiAtRGF2ZU0KICAqLwotI2RlZmluZSBFTEZfSFdDQVAJKChBUkNIX1NVTjRDX1NVTjQpID8gMCA6IFwKKyNkZWZpbmUgRUxGX0hXQ0FQCSgoQVJDSF9TVU40QykgPyAwIDogXAogCQkJIChIV0NBUF9TUEFSQ19GTFVTSCB8IEhXQ0FQX1NQQVJDX1NUQkFSIHwgXAogCQkJICBIV0NBUF9TUEFSQ19TV0FQIHwgXAogCQkJICAoKHNybW11X21vZHR5cGUgIT0gQ3lwcmVzcyAmJiBcCkBAIC0xNDAsNiArMTM3LDYgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0JKE5VTEwpCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KChpYmNzMik/UEVSX1NWUjQ6UEVSX0xJTlVYKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAKICNlbmRpZiAvKiAhKF9fQVNNU1BBUkNfRUxGX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VsZl82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9lbGZfNjQuaAppbmRleCAwODE4YTEzLi40MjVjMmY5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2VsZl82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZWxmXzY0LmgKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STQkoTlVMTCkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQkJCVwKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KQkJCQlcCiBkbyB7CXVuc2lnbmVkIGxvbmcgbmV3X2ZsYWdzID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFnczsgXAogCW5ld19mbGFncyAmPSBfVElGXzMyQklUOwkJCVwKIAlpZiAoKGV4KS5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQlcCkBAIC0yMDgsOSArMjA4LDcgQEAKIAllbHNlCQkJCQkJXAogCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfQUJJX1BFTkRJTkcpOwlcCiAJLyogZmx1c2hfdGhyZWFkIHdpbGwgdXBkYXRlIHBnZCBjYWNoZSAqLwlcCi0JaWYgKGliY3MyKQkJCQkJXAotCQlzZXRfcGVyc29uYWxpdHkoUEVSX1NWUjQpOwkJXAotCWVsc2UgaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWDMyKQlcCisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWDMyKQlcCiAJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOwkJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9maGMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmhjLmgKaW5kZXggNzg4Y2JjNC4uNTdmMWIzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9maGMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2ZoYy5oCkBAIC0xLDUgKzEsNCBAQAotLyoKLSAqIGZoYy5oOiBTdHJ1Y3R1cmVzIGZvciBjZW50cmFsL2ZoYyBwc2V1ZG8gZHJpdmVyIG9uIFN1bmZpcmUvU3RhcmZpcmUvV2lsZGZpcmUuCisvKiBmaGMuaDogRkhDIGFuZCBDbG9jayBib2FyZCByZWdpc3RlciBkZWZpbml0aW9ucy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCkBAIC03LDE0ICs2LDYgQEAKICNpZm5kZWYgX1NQQVJDNjRfRkhDX0gKICNkZWZpbmUgX1NQQVJDNjRfRkhDX0gKIAotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS91cGEuaD4KLQotc3RydWN0IGxpbnV4X2ZoYzsKLQogLyogQ2xvY2sgYm9hcmQgcmVnaXN0ZXIgb2Zmc2V0cy4gKi8KICNkZWZpbmUgQ0xPQ0tfQ1RSTAkweDAwVUwJLyogTWFpbiBjb250cm9sICovCiAjZGVmaW5lIENMT0NLX1NUQVQxCTB4MTBVTAkvKiBTdGF0dXMgb25lICovCkBAIC0yOSwyMSArMjAsNyBAQAogI2RlZmluZSBDTE9DS19DVFJMX01MRUQJCTB4MDIJLyogTWlkIExFRCwgMSA9PSBvbiAqLwogI2RlZmluZSBDTE9DS19DVFJMX1JMRUQJCTB4MDEJLyogUklnaHQgTEVELCAxID09IG9uICovCiAKLXN0cnVjdCBsaW51eF9jZW50cmFsIHsKLQlzdHJ1Y3QgbGludXhfZmhjCQkqY2hpbGQ7Ci0JdW5zaWduZWQgbG9uZwkJCWNmcmVnOwotCXVuc2lnbmVkIGxvbmcJCQljbGtyZWdzOwotCXVuc2lnbmVkIGxvbmcJCQljbGt2ZXI7Ci0JaW50CQkJCXNsb3RzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKLQotCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcwljZW50cmFsX3Jhbmdlc1tQUk9NUkVHX01BWF07Ci0JaW50CQkJCW51bV9jZW50cmFsX3JhbmdlczsKLX07Ci0KIC8qIEZpcmVob3NlIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLwotc3RydWN0IGZoY19yZWdzIHsKLQl1bnNpZ25lZCBsb25nCQkJcHJlZ3M7CS8qIEZIQyBpbnRlcm5hbCByZWdzICovCiAjZGVmaW5lIEZIQ19QUkVHU19JRAkweDAwVUwJLyogRkhDIElEICovCiAjZGVmaW5lICBGSENfSURfVkVSUwkJMHhmMDAwMDAwMCAvKiBWZXJzaW9uIG9mIHRoaXMgRkhDCQkqLwogI2RlZmluZSAgRkhDX0lEX1BBUlRJRAkJMHgwZmZmZjAwMCAvKiBQYXJ0IElEIGNvZGUgKDB4MGY5ZiA9PSBGSEMpCSovCkBAIC05MCwzMiArNjcsMTQgQEAKICNkZWZpbmUgIEZIQ19KVEFHX0NUUkxfTUVOQUIJMHg4MDAwMDAwMCAvKiBJbmRpY2F0ZXMgdGhpcyBpcyBKVEFHIE1hc3RlcgkgKi8KICNkZWZpbmUgIEZIQ19KVEFHX0NUUkxfTU5PTkUJMHg0MDAwMDAwMCAvKiBJbmRpY2F0ZXMgbm8gSlRBRyBNYXN0ZXIgcHJlc2VudAkgKi8KICNkZWZpbmUgRkhDX1BSRUdTX0pDTUQJMHgxMDBVTAkvKiBGSEMgSlRBRyBDb21tYW5kIFJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZwkJCWlyZWc7CS8qIEZIQyBJR04gcmVnICovCiAjZGVmaW5lIEZIQ19JUkVHX0lHTgkweDAwVUwJLyogVGhpcyBGSEMncyBJR04gKi8KLQl1bnNpZ25lZCBsb25nCQkJZmZyZWdzOwkvKiBGSEMgZmFuZmFpbCByZWdzICovCiAjZGVmaW5lIEZIQ19GRlJFR1NfSU1BUAkweDAwVUwJLyogRkhDIEZhbmZhaWwgSU1BUCAqLwogI2RlZmluZSBGSENfRkZSRUdTX0lDTFIJMHgxMFVMCS8qIEZIQyBGYW5mYWlsIElDTFIgKi8KLQl1bnNpZ25lZCBsb25nCQkJc3JlZ3M7CS8qIEZIQyBzeXN0ZW0gcmVncyAqLwogI2RlZmluZSBGSENfU1JFR1NfSU1BUAkweDAwVUwJLyogRkhDIFN5c3RlbSBJTUFQICovCiAjZGVmaW5lIEZIQ19TUkVHU19JQ0xSCTB4MTBVTAkvKiBGSEMgU3lzdGVtIElDTFIgKi8KLQl1bnNpZ25lZCBsb25nCQkJdXJlZ3M7CS8qIEZIQyB1YXJ0IHJlZ3MgKi8KICNkZWZpbmUgRkhDX1VSRUdTX0lNQVAJMHgwMFVMCS8qIEZIQyBVYXJ0IElNQVAgKi8KICNkZWZpbmUgRkhDX1VSRUdTX0lDTFIJMHgxMFVMCS8qIEZIQyBVYXJ0IElDTFIgKi8KLQl1bnNpZ25lZCBsb25nCQkJdHJlZ3M7CS8qIEZIQyBUT0QgcmVncyAqLwogI2RlZmluZSBGSENfVFJFR1NfSU1BUAkweDAwVUwJLyogRkhDIFRPRCBJTUFQICovCiAjZGVmaW5lIEZIQ19UUkVHU19JQ0xSCTB4MTBVTAkvKiBGSEMgVE9EIElDTFIgKi8KLX07Ci0KLXN0cnVjdCBsaW51eF9maGMgewotCXN0cnVjdCBsaW51eF9maGMJCSpuZXh0OwotCXN0cnVjdCBsaW51eF9jZW50cmFsCQkqcGFyZW50OwkvKiBOVUxMIGlmIG5vdCBjZW50cmFsIEZIQyAqLwotCXN0cnVjdCBmaGNfcmVncwkJCWZoY19yZWdzOwotCWludAkJCQlib2FyZDsKLQlpbnQJCQkJanRhZ19tYXN0ZXI7Ci0Jc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotCi0Jc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzCWZoY19yYW5nZXNbUFJPTVJFR19NQVhdOwotCWludAkJCQludW1fZmhjX3JhbmdlczsKLX07CiAKICNlbmRpZiAvKiAhKF9TUEFSQzY0X0ZIQ19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzMyLmgKaW5kZXggYWUzZjAwYi4uYzc5MjgzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV8zMi5oCkBAIC02LDYgKzYsOSBAQAogI2lmbmRlZiBfX0FTTV9TUEFSQ19GTE9QUFlfSAogI2RlZmluZSBfX0FTTV9TUEFSQ19GTE9QUFlfSAogCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zNDMsNyArMzQ2LDcgQEAKIAlyLmZsYWdzID0gZmRfcmVnc1swXS53aGljaF9pbzsKIAlyLnN0YXJ0ID0gZmRfcmVnc1swXS5waHlzX2FkZHI7CiAJc3VuX2ZkYyA9IChzdHJ1Y3Qgc3VuX2ZscHlfY29udHJvbGxlciAqKQotCSAgICBzYnVzX2lvcmVtYXAoJnIsIDAsIGZkX3JlZ3NbMF0ucmVnX3NpemUsICJmbG9wcHkiKTsKKwkgICAgb2ZfaW9yZW1hcCgmciwgMCwgZmRfcmVnc1swXS5yZWdfc2l6ZSwgImZsb3BweSIpOwogCiAJLyogTGFzdCBtaW51dGUgc2FuaXR5IGNoZWNrLi4uICovCiAJaWYoc3VuX2ZkYy0+c3RhdHVzXzgyMDcyID09IDB4ZmYpIHsKQEAgLTM4NSw0ICszODgsMTUgQEAKIAogI2RlZmluZSBFWFRSQV9GTE9QUFlfUEFSQU1TCiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZG1hX3NwaW5fbG9jayk7CisKKyNkZWZpbmUgY2xhaW1fZG1hX2xvY2soKSBcCisoewl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9zcGluX2xvY2ssIGZsYWdzKTsgXAorCWZsYWdzOyBcCit9KQorCisjZGVmaW5lIHJlbGVhc2VfZG1hX2xvY2soX19mbGFncykgXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9zcGluX2xvY2ssIF9fZmxhZ3MpOworCiAjZW5kaWYgLyogIShfX0FTTV9TUEFSQ19GTE9QUFlfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Zsb3BweV82NC5oCmluZGV4IGMzOWRiMTAuLjM2NDM5ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmxvcHB5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mbG9wcHlfNjQuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGZsb3BweS5oOiBTcGFyYyBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgRmxvcHB5IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqIENvcHlyaWdodCAoQykgMTk5NyBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICoKICAqIFVsdHJhL1BDSSBzdXBwb3J0IGFkZGVkOiBTZXAgMTk5NyAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCkBAIC05LDE4ICs5LDExIEBACiAjaWZuZGVmIF9fQVNNX1NQQVJDNjRfRkxPUFBZX0gKICNkZWZpbmUgX19BU01fU1BBUkM2NF9GTE9QUFlfSAogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCiAKIC8qCiAgKiBEZWZpbmUgdGhpcyB0byBlbmFibGUgZXhjaGFuZ2luZyBkcml2ZSAwIGFuZCAxIGlmIG9ubHkgZHJpdmUgMSBpcwpAQCAtNTAsNyArNDMsNyBAQAogLyogWW91J2xsIG9ubHkgZXZlciBmaW5kIG9uZSBjb250cm9sbGVyIG9uIGFuIFVsdHJhIGFueXdheXMuICovCiBzdGF0aWMgc3RydWN0IHN1bl9mbHB5X2NvbnRyb2xsZXIgKnN1bl9mZGMgPSAoc3RydWN0IHN1bl9mbHB5X2NvbnRyb2xsZXIgKiktMTsKIHVuc2lnbmVkIGxvbmcgZmRjX3N0YXR1czsKLXN0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgKmZsb3BweV9zZGV2ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlICpmbG9wcHlfb3AgPSBOVUxMOwogCiBzdHJ1Y3Qgc3VuX2Zsb3BweV9vcHMgewogCXVuc2lnbmVkIGNoYXIJKCpmZF9pbmIpICh1bnNpZ25lZCBsb25nIHBvcnQpOwpAQCAtMjkxLDEyICsyODQsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QQ0kKLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9lYnVzX2RtYS5oPgogI2luY2x1ZGUgPGFzbS9uczg3MzAzLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgZWJ1c19kbWFfaW5mbyBzdW5fcGNpX2ZkX2VidXNfZG1hOwotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzdW5fcGNpX2VidXNfZGV2Oworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnN1bl9mbG9wcHlfZGV2Owogc3RhdGljIGludCBzdW5fcGNpX2Jyb2tlbl9kcml2ZSA9IC0xOwogCiBzdHJ1Y3Qgc3VuX3BjaV9kbWFfb3AgewpAQCAtMzc3LDcgKzM2OSw3IEBACiAJc3VuX3BjaV9kbWFfcGVuZGluZy5hZGRyID0gLTFVOwogCiAJc3VuX3BjaV9kbWFfY3VycmVudC5hZGRyID0KLQkJcGNpX21hcF9zaW5nbGUoc3VuX3BjaV9lYnVzX2RldiwKKwkJZG1hX21hcF9zaW5nbGUoc3VuX2Zsb3BweV9kZXYsCiAJCQkgICAgICAgc3VuX3BjaV9kbWFfY3VycmVudC5idWYsCiAJCQkgICAgICAgc3VuX3BjaV9kbWFfY3VycmVudC5sZW4sCiAJCQkgICAgICAgc3VuX3BjaV9kbWFfY3VycmVudC5kaXJlY3Rpb24pOwpAQCAtMzk0LDcgKzM4Niw3IEBACiB7CiAJZWJ1c19kbWFfZW5hYmxlKCZzdW5fcGNpX2ZkX2VidXNfZG1hLCAwKTsKIAlpZiAoc3VuX3BjaV9kbWFfY3VycmVudC5hZGRyICE9IC0xVSkKLQkJcGNpX3VubWFwX3NpbmdsZShzdW5fcGNpX2VidXNfZGV2LAorCQlkbWFfdW5tYXBfc2luZ2xlKHN1bl9mbG9wcHlfZGV2LAogCQkJCSBzdW5fcGNpX2RtYV9jdXJyZW50LmFkZHIsCiAJCQkJIHN1bl9wY2lfZG1hX2N1cnJlbnQubGVuLAogCQkJCSBzdW5fcGNpX2RtYV9jdXJyZW50LmRpcmVjdGlvbik7CkBAIC00MDQsOSArMzk2LDkgQEAKIHN0YXRpYyB2b2lkIHN1bl9wY2lfZmRfc2V0X2RtYV9tb2RlKGludCBtb2RlKQogewogCWlmIChtb2RlID09IERNQV9NT0RFX1dSSVRFKQotCQlzdW5fcGNpX2RtYV9wZW5kaW5nLmRpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJCXN1bl9wY2lfZG1hX3BlbmRpbmcuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAllbHNlCi0JCXN1bl9wY2lfZG1hX3BlbmRpbmcuZGlyZWN0aW9uID0gUENJX0RNQV9GUk9NREVWSUNFOworCQlzdW5fcGNpX2RtYV9wZW5kaW5nLmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAogCWVidXNfZG1hX3ByZXBhcmUoJnN1bl9wY2lfZmRfZWJ1c19kbWEsIG1vZGUgIT0gRE1BX01PREVfV1JJVEUpOwogfQpAQCAtNTM4LDgwICs1MzAsODQgQEAKICN1bmRlZiBNU1IKICN1bmRlZiBET1IKIAotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBpbnQgX19pbml0IGVidXNfZmR0aHJlZV9wKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikKK3N0YXRpYyBpbnQgX19pbml0IGVidXNfZmR0aHJlZV9wKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0JaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiZmR0aHJlZSIpKQorCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZmR0aHJlZSIpKQogCQlyZXR1cm4gMTsKLQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJmbG9wcHkiKSkgeworCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZmxvcHB5IikpIHsKIAkJY29uc3QgY2hhciAqY29tcGF0OwogCi0JCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCi0JCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOworCQljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJjb21wYXRpYmxlIiwgTlVMTCk7CiAJCWlmIChjb21wYXQgJiYgIXN0cmNtcChjb21wYXQsICJmZHRocmVlIikpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHN1bl9mbG9wcHlfaW5pdCh2b2lkKQogewotCWNoYXIgc3RhdGVbMTI4XTsKLQlzdHJ1Y3Qgc2J1c19idXMgKmJ1czsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOwogCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IG9mX2RldmljZSAqb3A7CisJY29uc3QgY2hhciAqcHJvcDsKKwljaGFyIHN0YXRlWzEyOF07CiAKIAlpZiAoaW5pdGlhbGl6ZWQpCiAJCXJldHVybiBzdW5fZmxvcHB5X3R5cGVzWzBdOwogCWluaXRpYWxpemVkID0gMTsKIAotCWZvcl9hbGxfc2J1c2RldiAoc2RldiwgYnVzKSB7Ci0JCWlmICghc3RyY21wKHNkZXYtPnByb21fbmFtZSwgIlNVTlcsZmR0d28iKSkKKwlvcCA9IE5VTEw7CisKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJTVU5XLGZkdHdvIikgeworCQlpZiAoc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJzYnVzIikpCisJCQljb250aW51ZTsKKwkJb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKKwkJaWYgKG9wKQogCQkJYnJlYWs7CiAJfQotCWlmKHNkZXYpIHsKLQkJZmxvcHB5X3NkZXYgPSBzZGV2OwotCQlGTE9QUFlfSVJRID0gc2Rldi0+aXJxc1swXTsKKwlpZiAob3ApIHsKKwkJZmxvcHB5X29wID0gb3A7CisJCUZMT1BQWV9JUlEgPSBvcC0+aXJxc1swXTsKIAl9IGVsc2UgewotI2lmZGVmIENPTkZJR19QQ0kKLQkJc3RydWN0IGxpbnV4X2VidXMgKmVidXM7Ci0JCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IE5VTEw7Ci0JCXVuc2lnbmVkIGxvbmcgY29uZmlnID0gMDsKKwkJc3RydWN0IGRldmljZV9ub2RlICplYnVzX2RwOwogCQl2b2lkIF9faW9tZW0gKmF1eGlvX3JlZzsKIAkJY29uc3QgY2hhciAqc3RhdGVfcHJvcDsKKwkJdW5zaWduZWQgbG9uZyBjb25maWc7CiAKLQkJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7Ci0JCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCQlpZiAoZWJ1c19mZHRocmVlX3AoZWRldikpCi0JCQkJCWdvdG8gZWJ1c19kb25lOworCQlkcCA9IE5VTEw7CisJCWZvcl9lYWNoX25vZGVfYnlfbmFtZShlYnVzX2RwLCAiZWJ1cyIpIHsKKwkJCWZvciAoZHAgPSBlYnVzX2RwLT5jaGlsZDsgZHA7IGRwID0gZHAtPnNpYmxpbmcpIHsKKwkJCQlpZiAoZWJ1c19mZHRocmVlX3AoZHApKQorCQkJCQlnb3RvIGZvdW5kX2ZkdGhyZWU7CiAJCQl9CiAJCX0KLQllYnVzX2RvbmU6Ci0JCWlmICghZWRldikKKwlmb3VuZF9mZHRocmVlOgorCQlpZiAoIWRwKQogCQkJcmV0dXJuIDA7CiAKLQkJc3RhdGVfcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsICJzdGF0dXMiLCBOVUxMKTsKKwkJb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKKwkJaWYgKCFvcCkKKwkJCXJldHVybiAwOworCisJCXN0YXRlX3Byb3AgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJzdGF0dXMiLCBOVUxMKTsKIAkJaWYgKHN0YXRlX3Byb3AgJiYgIXN0cm5jbXAoc3RhdGVfcHJvcCwgImRpc2FibGVkIiwgOCkpCiAJCQlyZXR1cm4gMDsKIAotCQlGTE9QUFlfSVJRID0gZWRldi0+aXJxc1swXTsKKwkJRkxPUFBZX0lSUSA9IG9wLT5pcnFzWzBdOwogCiAJCS8qIE1ha2Ugc3VyZSB0aGUgaGlnaCBkZW5zaXR5IGJpdCBpcyBzZXQsIHNvbWUgc3lzdGVtcwogCQkgKiAobW9zdCBub3RhYmx5IFVsdHJhNS9VbHRyYTEwKSBjb21lIHVwIHdpdGggaXQgY2xlYXIuCiAJCSAqLwotCQlhdXhpb19yZWcgPSAodm9pZCBfX2lvbWVtICopIGVkZXYtPnJlc291cmNlWzJdLnN0YXJ0OworCQlhdXhpb19yZWcgPSAodm9pZCBfX2lvbWVtICopIG9wLT5yZXNvdXJjZVsyXS5zdGFydDsKIAkJd3JpdGVsKHJlYWRsKGF1eGlvX3JlZyl8MHgyLCBhdXhpb19yZWcpOwogCi0JCXN1bl9wY2lfZWJ1c19kZXYgPSBlYnVzLT5zZWxmOworCQlzdW5fZmxvcHB5X2RldiA9ICZvcC0+ZGV2OwogCiAJCXNwaW5fbG9ja19pbml0KCZzdW5fcGNpX2ZkX2VidXNfZG1hLmxvY2spOwogCiAJCS8qIFhYWCBpb3JlbWFwICovCiAJCXN1bl9wY2lfZmRfZWJ1c19kbWEucmVncyA9ICh2b2lkIF9faW9tZW0gKikKLQkJCWVkZXYtPnJlc291cmNlWzFdLnN0YXJ0OworCQkJb3AtPnJlc291cmNlWzFdLnN0YXJ0OwogCQlpZiAoIXN1bl9wY2lfZmRfZWJ1c19kbWEucmVncykKIAkJCXJldHVybiAwOwogCkBAIC02MjUsNyArNjIxLDcgQEAKIAkJCXJldHVybiAwOwogCiAJCS8qIFhYWCBpb3JlbWFwICovCi0JCXN1bl9mZGMgPSAoc3RydWN0IHN1bl9mbHB5X2NvbnRyb2xsZXIgKillZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwkJc3VuX2ZkYyA9IChzdHJ1Y3Qgc3VuX2ZscHlfY29udHJvbGxlciAqKSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7CiAKIAkJc3VuX2Zkb3BzLmZkX2luYiA9IHN1bl9wY2lfZmRfaW5iOwogCQlzdW5fZmRvcHMuZmRfb3V0YiA9IHN1bl9wY2lfZmRfb3V0YjsKQEAgLTY2MiwxMiArNjU4LDE1IEBACiAJCS8qCiAJCSAqIEZpbmQgTlM4NzMwMyBTdXBlcklPIGNvbmZpZyByZWdpc3RlcnMgKHRocm91Z2ggZWNwcCkuCiAJCSAqLwotCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImVjcHAiKSkgewotCQkJCQljb25maWcgPSBlZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKLQkJCQkJZ290byBjb25maWdfZG9uZTsKLQkJCQl9CisJCWNvbmZpZyA9IDA7CisJCWZvciAoZHAgPSBlYnVzX2RwLT5jaGlsZDsgZHA7IGRwID0gZHAtPnNpYmxpbmcpIHsKKwkJCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZWNwcCIpKSB7CisJCQkJc3RydWN0IG9mX2RldmljZSAqZWNwcF9vcDsKKworCQkJCWVjcHBfb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKKwkJCQlpZiAoZWNwcF9vcCkKKwkJCQkJY29uZmlnID0gZWNwcF9vcC0+cmVzb3VyY2VbMV0uc3RhcnQ7CisJCQkJZ290byBjb25maWdfZG9uZTsKIAkJCX0KIAkJfQogCWNvbmZpZ19kb25lOgpAQCAtNzE2LDI2ICs3MTUsMjMgQEAKICNlbmRpZiAvKiBQQ0lfRkRDX1NXQVBfRFJJVkVTICovCiAKIAkJcmV0dXJuIHN1bl9mbG9wcHlfdHlwZXNbMF07Ci0jZWxzZQotCQlyZXR1cm4gMDsKLSNlbmRpZgogCX0KLQlwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgInN0YXR1cyIsIHN0YXRlLCBzaXplb2Yoc3RhdGUpKTsKLQlpZighc3RybmNtcChzdGF0ZSwgImRpc2FibGVkIiwgOCkpCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgInN0YXR1cyIsIE5VTEwpOworCWlmIChwcm9wICYmICFzdHJuY21wKHN0YXRlLCAiZGlzYWJsZWQiLCA4KSkKIAkJcmV0dXJuIDA7CiAKIAkvKgotCSAqIFdlIGNhbm5vdCBkbyBzYnVzX2lvcmVtYXAgaGVyZTogaXQgZG9lcyByZXF1ZXN0X3JlZ2lvbiwKKwkgKiBXZSBjYW5ub3QgZG8gb2ZfaW9yZW1hcCBoZXJlOiBpdCBkb2VzIHJlcXVlc3RfcmVnaW9uLAogCSAqIHdoaWNoIHRoZSBnZW5lcmljIGZsb3BweSBkcml2ZXIgdHJpZXMgdG8gZG8gb25jZSBhZ2Fpbi4KIAkgKiBCdXQgd2UgbXVzdCB1c2UgdGhlIHNkZXYgcmVzb3VyY2UgdmFsdWVzIGFzIHRoZXkgaGF2ZQogCSAqIGhhZCBwYXJlbnQgcmFuZ2VzIGFwcGxpZWQuCiAJICovCiAJc3VuX2ZkYyA9IChzdHJ1Y3Qgc3VuX2ZscHlfY29udHJvbGxlciAqKQotCQkoc2Rldi0+cmVzb3VyY2VbMF0uc3RhcnQgKwotCQkgKChzZGV2LT5yZXNvdXJjZVswXS5mbGFncyAmIDB4MWZmVUwpIDw8IDMyVUwpKTsKKwkJKG9wLT5yZXNvdXJjZVswXS5zdGFydCArCisJCSAoKG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIDB4MWZmVUwpIDw8IDMyVUwpKTsKIAogCS8qIExhc3QgbWludXRlIHNhbml0eSBjaGVjay4uLiAqLwotCWlmKHNidXNfcmVhZGIoJnN1bl9mZGMtPnN0YXR1czFfODIwNzcpID09IDB4ZmYpIHsKKwlpZiAoc2J1c19yZWFkYigmc3VuX2ZkYy0+c3RhdHVzMV84MjA3NykgPT0gMHhmZikgewogCQlzdW5fZmRjID0gKHN0cnVjdCBzdW5fZmxweV9jb250cm9sbGVyICopLTE7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlM2FjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZ3Bpby5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX19BU01fU1BBUkNfR1BJT19ICisjZGVmaW5lIF9fQVNNX1NQQVJDX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQiAqLworCisjZW5kaWYgLyogX19BU01fU1BBUkNfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lvLXVuaXQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW8tdW5pdC5oCmluZGV4IDk2ODIzYjQuLjAxYWIyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW8tdW5pdC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW8tdW5pdC5oCkBAIC01NSw4ICs1NSw0IEBACiAjZGVmaW5lIElPVU5JVF9CTUFQTV9TVEFSVAlJT1VOSVRfQk1BUDJfRU5ECiAjZGVmaW5lIElPVU5JVF9CTUFQTV9FTkQJKChJT1VOSVRfRE1BX1NJWkUgLSBJT1VOSVRfRFZNQV9TSVpFKSA+PiBQQUdFX1NISUZUKQogCi1leHRlcm4gX191MzIgaW91bml0X21hcF9kbWFfaW5pdChzdHJ1Y3Qgc2J1c19idXMgKiwgaW50KTsKLSNkZWZpbmUgaW91bml0X21hcF9kbWFfZmluaXNoKHNidXMsIGFkZHIsIGxlbikgbW11X3JlbGVhc2Vfc2NzaV9vbmUoYWRkciwgbGVuLCBzYnVzKQotZXh0ZXJuIF9fdTMyIGlvdW5pdF9tYXBfZG1hX3BhZ2UoX191MzIsIHZvaWQgKiwgc3RydWN0IHNidXNfYnVzICopOwotCiAjZW5kaWYgLyogIShfU1BBUkNfSU9fVU5JVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb18zMi5oCmluZGV4IDEwZDdkYTQuLjkzZmUyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9fMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lvXzMyLmgKQEAgLTI5MywxNCArMjkzLDYgQEAKIGV4dGVybiB2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqKTsKIAogLyoKLSAqIEJ1cyBudW1iZXIgbWF5IGJlIGluIHJlcy0+ZmxhZ3MuLi4gc29tZXdoZXJlLgotICovCi1leHRlcm4gdm9pZCBfX2lvbWVtICpzYnVzX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBzYnVzX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp2YWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotCi0vKgogICogQXQgdGhlIG1vbWVudCwgd2UgZG8gbm90IHVzZSBDTU9TX1JFQUQgYW55d2hlcmUgb3V0c2lkZSBvZiBydGMuYywKICAqIHNvIHJ0Y19wb3J0IGlzIHN0YXRpYyBpbiBpdC4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSB1bmxlc3MgYSBuZXcKICAqIGhhcmR3YXJlIHBvcHMgdXAuCkBAIC0zMDgsNiArMzAwLDE3IEBACiAjZGVmaW5lIFJUQ19QT1JUKHgpICAgKHJ0Y19wb3J0ICsgKHgpKQogI2RlZmluZSBSVENfQUxXQVlTX0JDRCAgMAogCitzdGF0aWMgaW5saW5lIGludCBzYnVzX2Nhbl9kbWFfNjRiaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsgLyogYWN0dWFsbHksIHNwYXJjX2NwdV9tb2RlbD09c3VuNGQgKi8KK30KK3N0YXRpYyBpbmxpbmUgaW50IHNidXNfY2FuX2J1cnN0NjQodm9pZCkKK3sKKwlyZXR1cm4gMDsgLyogYWN0dWFsbHksIHNwYXJjX2NwdV9tb2RlbD09c3VuNGQgKi8KK30KK3N0cnVjdCBkZXZpY2U7CitleHRlcm4gdm9pZCBzYnVzX3NldF9zYnVzNjQoc3RydWN0IGRldmljZSAqLCBpbnQpOworCiAjZW5kaWYKIAogI2RlZmluZSBfX0FSQ0hfSEFTX05PX1BBR0VfWkVST19NQVBQRUQJCTEKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9fNjQuaAppbmRleCAwYmZmMDc4Li40YWVlMjFkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lvXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb182NC5oCkBAIC00ODIsMTggKzQ4MiwxNiBAQAogZXh0ZXJuIHZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4KTsKIGV4dGVybiB2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqKTsKIAotLyogU2ltaWxhcmx5IGZvciBTQlVTLiAqLwotI2RlZmluZSBzYnVzX2lvcmVtYXAoX19yZXMsIF9fb2Zmc2V0LCBfX3NpemUsIF9fbmFtZSkgXAotKHsJdW5zaWduZWQgbG9uZyBfX3JldDsgXAotCV9fcmV0ICA9IChfX3JlcyktPnN0YXJ0ICsgKCgoX19yZXMpLT5mbGFncyAmIDB4MWZmVUwpIDw8IDMyVUwpOyBcCi0JX19yZXQgKz0gKHVuc2lnbmVkIGxvbmcpIChfX29mZnNldCk7IFwKLQlpZiAoISByZXF1ZXN0X3JlZ2lvbigoX19yZXQpLCAoX19zaXplKSwgKF9fbmFtZSkpKSBcCi0JCV9fcmV0ID0gMFVMOyBcCi0JKHZvaWQgX19pb21lbSAqKSBfX3JldDsgXAotfSkKLQotI2RlZmluZSBzYnVzX2lvdW5tYXAoX19hZGRyLCBfX3NpemUpCVwKLQlyZWxlYXNlX3JlZ2lvbigodW5zaWduZWQgbG9uZykoX19hZGRyKSwgKF9fc2l6ZSkpCitzdGF0aWMgaW5saW5lIGludCBzYnVzX2Nhbl9kbWFfNjRiaXQodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHNidXNfY2FuX2J1cnN0NjQodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KK3N0cnVjdCBkZXZpY2U7CitleHRlcm4gdm9pZCBzYnVzX3NldF9zYnVzNjQoc3RydWN0IGRldmljZSAqLCBpbnQpOwogCiAvKgogICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb21tdV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb21tdV82NC5oCmluZGV4IGQ3YjlhZmMuLmNhZjc5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9tbXVfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lvbW11XzY0LmgKQEAgLTQ4LDYgKzQ4LDkgQEAKIAl1bnNpZ25lZCBsb25nCQlzdHJidWZfY29udHJvbDsKIAl1bnNpZ25lZCBsb25nCQlzdHJidWZfcGZsdXNoOwogCXVuc2lnbmVkIGxvbmcJCXN0cmJ1Zl9mc3luYzsKKwl1bnNpZ25lZCBsb25nCQlzdHJidWZfZXJyX3N0YXQ7CisJdW5zaWduZWQgbG9uZwkJc3RyYnVmX3RhZ19kaWFnOworCXVuc2lnbmVkIGxvbmcJCXN0cmJ1Zl9saW5lX2RpYWc7CiAJdW5zaWduZWQgbG9uZwkJc3RyYnVmX2N0eGZsdXNoOwogCXVuc2lnbmVkIGxvbmcJCXN0cmJ1Zl9jdHhtYXRjaF9iYXNlOwogCXVuc2lnbmVkIGxvbmcJCXN0cmJ1Zl9mbHVzaGZsYWdfcGE7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcnFfNjQuaAppbmRleCBlM2RkOTMwLi43MTY3M2VjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lycV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXJxXzY0LmgKQEAgLTU2LDcgKzU2LDYgQEAKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBpbWFwX2Jhc2UsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgaWNscl9iYXNlKTsKIGV4dGVybiB2b2lkIHN1bjR1X2Rlc3Ryb3lfbXNpKHVuc2lnbmVkIGludCB2aXJ0X2lycSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNidXNfYnVpbGRfaXJxKHZvaWQgKnNidXMsIHVuc2lnbmVkIGludCBpbm8pOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciB2aXJ0X2lycV9hbGxvYyh1bnNpZ25lZCBpbnQgZGV2X2hhbmRsZSwKIAkJCQkgICAgdW5zaWduZWQgaW50IGRldl9pbm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tYzE0NjgxOHJ0Y182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tYzE0NjgxOHJ0Y182NC5oCmluZGV4IGU5YzBmY2MuLjcyMzhkMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbWMxNDY4MThydGNfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjXzY0LmgKQEAgLTcsMTIgKzcsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaWZuZGVmIFJUQ19QT1JUCi0jaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHMxMjg3X3JlZ3M7Ci0jZWxzZQotI2RlZmluZSBkczEyODdfcmVncyAoMFVMKQotI2VuZGlmCi0jZGVmaW5lIFJUQ19QT1JUKHgpCShkczEyODdfcmVncyArICh4KSkKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNtb3NfcmVnczsKKyNkZWZpbmUgUlRDX1BPUlQoeCkJKGNtb3NfcmVncyArICh4KSkKICNkZWZpbmUgUlRDX0FMV0FZU19CQ0QJMAogI2VuZGlmCiAKQEAgLTI5LDYgKzI1LDQgQEAKIG91dGJfcCgodmFsKSxSVENfUE9SVCgxKSk7IFwKIH0pCiAKLSNkZWZpbmUgUlRDX0lSUSA4Ci0KICNlbmRpZiAvKiBfX0FTTV9TUEFSQzY0X01DMTQ2ODE4UlRDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbWVtY3RybC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tZW1jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2NWM1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbWVtY3RybC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfU1BBUkNfTUVNQ1RSTF9ICisjZGVmaW5lIF9TUEFSQ19NRU1DVFJMX0gKKwordHlwZWRlZiBpbnQgKCpkaW1tX3ByaW50ZXJfdCkoaW50IHN5bmRfY29kZSwgdW5zaWduZWQgbG9uZyBwYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKworaW50IHJlZ2lzdGVyX2RpbW1fcHJpbnRlcihkaW1tX3ByaW50ZXJfdCBmdW5jKTsKK3ZvaWQgdW5yZWdpc3Rlcl9kaW1tX3ByaW50ZXIoZGltbV9wcmludGVyX3QgZnVuYyk7CisKKyNlbmRpZiAvKiBfU1BBUkNfTUVNQ1RSTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vc3Rlay5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb3N0ZWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzYmUzZS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vc3Rlay5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19NT1NURUtfSAotI2RlZmluZSBfX19BU01fU1BBUkNfTU9TVEVLX0gKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9tb3N0ZWtfNjQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtL21vc3Rla18zMi5oPgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW9zdGVrXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21vc3Rla18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk1OTBjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW9zdGVrXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIG1vc3Rlay5oOiAgRGVzY3JpYmVzIHRoZSB2YXJpb3VzIE1vc3RlayB0aW1lIG9mIGRheSBjbG9jayByZWdpc3RlcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqIENvcHlyaWdodCAoQykgMTk5NiBUaG9tYXMgSy4gRHlhcyAodGR5YXNAZWRlbi5ydXRnZXJzLmVkdSkKLSAqIEFkZGVkIGludGVyc2lsIGNvZGUgMDUvMjUvOTggQ2hyaXMgRGF2aXMgKGNkYXZpc0Bjb2lzLm9uLmNhKQotICovCi0KLSNpZm5kZWYgX1NQQVJDX01PU1RFS19ICi0jZGVmaW5lIF9TUEFSQ19NT1NURUtfSAotCi0jaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKiAgICAgICBNNDhUMDIgUmVnaXN0ZXIgTWFwIChhZGFwdGVkIGZyb20gU3VuIE5WUkFNL0hvc3RpZCBGQVEpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEKLSAqIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24KLSAqICAgICAgICBCaXQgNyBCaXQgNiBCaXQgNSBCaXQgNEJpdCAzIEJpdCAyIEJpdCAxIEJpdCAwCi0gKiAgIDdmZiAgLSAgICAgLSAgICAgLSAgICAgLSAgICAtICAgICAtICAgICAtICAgICAtICAgICAgIFllYXIgMDAtOTkKLSAqICAgN2ZlICAwICAgICAwICAgICAwICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgICBNb250aCAwMS0xMgotICogICA3ZmQgIDAgICAgIDAgICAgIC0gICAgIC0gICAgLSAgICAgLSAgICAgLSAgICAgLSAgICAgICBEYXRlIDAxLTMxCi0gKiAgIDdmYyAgMCAgICAgRlQgICAgMCAgICAgMCAgICAwICAgICAtICAgICAtICAgICAtICAgICAgICBEYXkgMDEtMDcKLSAqICAgN2ZiICBLUyAgICAwICAgICAtICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgICBIb3VycyAwMC0yMwotICogICA3ZmEgIDAgICAgIC0gICAgIC0gICAgIC0gICAgLSAgICAgLSAgICAgLSAgICAgLSAgICBNaW51dGVzIDAwLTU5Ci0gKiAgIDdmOSAgU1QgICAgLSAgICAgLSAgICAgLSAgICAtICAgICAtICAgICAtICAgICAtICAgIFNlY29uZHMgMDAtNTkKLSAqICAgN2Y4ICBXICAgICBSICAgICBTICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgQ29udHJvbAotICoKLSAqICAgKiBTVCBpcyBTVE9QIEJJVAotICogICAqIFcgaXMgV1JJVEUgQklUCi0gKiAgICogUiBpcyBSRUFEIEJJVAotICogICAqIFMgaXMgU0lHTiBCSVQKLSAqICAgKiBGVCBpcyBGUkVRIFRFU1QgQklUCi0gKiAgICogS1MgaXMgS0lDSyBTVEFSVCBCSVQKLSAqLwotCi0vKiBUaGUgTW9zdGVrIDQ4dDAyIHJlYWwgdGltZSBjbG9jayBhbmQgTlZSQU0gY2hpcC4gVGhlIHJlZ2lzdGVycwotICogb3RoZXIgdGhhbiB0aGUgY29udHJvbCByZWdpc3RlciBhcmUgaW4gYmluYXJ5IGNvZGVkIGRlY2ltYWwuIFNvbWUKLSAqIGNvbnRyb2wgYml0cyBhbHNvIGxpdmUgb3V0c2lkZSB0aGUgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBtb3N0ZWtfcmVhZChfYWRkcikJCXJlYWRiKF9hZGRyKQotI2RlZmluZSBtb3N0ZWtfd3JpdGUoX2FkZHIsX3ZhbCkJd3JpdGViKF92YWwsIF9hZGRyKQotI2RlZmluZSBNT1NURUtfRUVQUk9NCQkweDAwMDBVTAotI2RlZmluZSBNT1NURUtfSURQUk9NCQkweDA3ZDhVTAotI2RlZmluZSBNT1NURUtfQ1JFRwkJMHgwN2Y4VUwKLSNkZWZpbmUgTU9TVEVLX1NFQwkJMHgwN2Y5VUwKLSNkZWZpbmUgTU9TVEVLX01JTgkJMHgwN2ZhVUwKLSNkZWZpbmUgTU9TVEVLX0hPVVIJCTB4MDdmYlVMCi0jZGVmaW5lIE1PU1RFS19ET1cJCTB4MDdmY1VMCi0jZGVmaW5lIE1PU1RFS19ET00JCTB4MDdmZFVMCi0jZGVmaW5lIE1PU1RFS19NT05USAkJMHgwN2ZlVUwKLSNkZWZpbmUgTU9TVEVLX1lFQVIJCTB4MDdmZlVMCi0KLXN0cnVjdCBtb3N0ZWs0OHQwMiB7Ci0Jdm9sYXRpbGUgY2hhciBlZXByb21bMjAwOF07CS8qIFRoaXMgaXMgdGhlIGVlcHJvbSwgZG9uJ3QgdG91Y2ghICovCi0Jc3RydWN0IGlkcHJvbSBpZHByb207CQkvKiBUaGUgaWRwcm9tIGxpdmVzIGhlcmUuICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjcmVnOwkvKiBDb250cm9sIHJlZ2lzdGVyICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzZWM7CS8qIFNlY29uZHMgKDAtNTkpICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBtaW47CS8qIE1pbnV0ZXMgKDAtNTkpICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBob3VyOwkvKiBIb3VyICgwLTIzKSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG93OwkvKiBEYXkgb2YgdGhlIHdlZWsgKDEtNykgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRvbTsJLyogRGF5IG9mIHRoZSBtb250aCAoMS0zMSkgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIG1vbnRoOwkvKiBNb250aCBvZiB5ZWFyICgxLTEyKSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgeWVhcjsJLyogWWVhciAoMC05OSkgKi8KLX07Ci0KLWV4dGVybiBzcGlubG9ja190IG1vc3Rla19sb2NrOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqbXN0azQ4dDAyX3JlZ3M7Ci0KLS8qIENvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzLiAqLwotI2RlZmluZQlNU1RLX0NSRUdfV1JJVEUJMHg4MAkvKiBNdXN0IHNldCB0aGlzIGJlZm9yZSBwbGFjaW5nIHZhbHVlcy4gKi8KLSNkZWZpbmUJTVNUS19DUkVHX1JFQUQJMHg0MAkvKiBTdG9wIHVwZGF0ZXMgdG8gYWxsb3cgYSBjbGVhbiByZWFkLiAqLwotI2RlZmluZQlNU1RLX0NSRUdfU0lHTgkweDIwCS8qIFNsb3cvc3BlZWQgY2xvY2sgaW4gY2FsaWJyYXRpb24gbW9kZS4gKi8KLQotLyogQ29udHJvbCBiaXRzIHRoYXQgbGl2ZSBpbiB0aGUgb3RoZXIgcmVnaXN0ZXJzLiAqLwotI2RlZmluZQlNU1RLX1NUT1AJMHg4MAkvKiBTdG9wIHRoZSBjbG9jayBvc2NpbGxhdG9yLiAoc2VjKSAqLwotI2RlZmluZQlNU1RLX0tJQ0tfU1RBUlQJMHg4MAkvKiBLaWNrIHN0YXJ0IHRoZSBjbG9jayBjaGlwLiAoaG91cikgKi8KLSNkZWZpbmUgTVNUS19GUkVRX1RFU1QJMHg0MAkvKiBGcmVxdWVuY3kgdGVzdCBtb2RlLiAoZGF5KSAqLwotCi0jZGVmaW5lIE1TVEtfWUVBUl9aRVJPICAgICAgIDE5NjggICAvKiBJZiB5ZWFyIHJlZyBoYXMgemVybywgaXQgaXMgMTk2OC4gKi8KLSNkZWZpbmUgTVNUS19DVlRfWUVBUih5cikgICgoeXIpICsgTVNUS19ZRUFSX1pFUk8pCi0KLS8qIE1hc2tzIHRoYXQgZGVmaW5lIGhvdyBtdWNoIHNwYWNlIGVhY2ggdmFsdWUgdGFrZXMgdXAuICovCi0jZGVmaW5lCU1TVEtfU0VDX01BU0sJMHg3ZgotI2RlZmluZQlNU1RLX01JTl9NQVNLCTB4N2YKLSNkZWZpbmUJTVNUS19IT1VSX01BU0sJMHgzZgotI2RlZmluZQlNU1RLX0RPV19NQVNLCTB4MDcKLSNkZWZpbmUJTVNUS19ET01fTUFTSwkweDNmCi0jZGVmaW5lCU1TVEtfTU9OVEhfTUFTSwkweDFmCi0jZGVmaW5lCU1TVEtfWUVBUl9NQVNLCTB4ZmZVCi0KLS8qIEJpbmFyeSBjb2RlZCBkZWNpbWFsIGNvbnZlcnNpb24gbWFjcm9zLiAqLwotI2RlZmluZSBNU1RLX1JFR1ZBTF9UT19ERUNJTUFMKHgpICAoKCh4KSAmIDB4MEYpICsgMHgwQSAqICgoeCkgPj4gMHgwNCkpCi0jZGVmaW5lIE1TVEtfREVDSU1BTF9UT19SRUdWQUwoeCkgICgoKCh4KSAvIDB4MEEpIDw8IDB4MDQpICsgKCh4KSAlIDB4MEEpKQotCi0vKiBHZW5lcmljIHJlZ2lzdGVyIHNldCBhbmQgZ2V0IG1hY3JvcyBmb3IgaW50ZXJuYWwgdXNlLiAqLwotI2RlZmluZSBNU1RLX0dFVChyZWdzLHZhcixtYXNrKSAoTVNUS19SRUdWQUxfVE9fREVDSU1BTCgoKHN0cnVjdCBtb3N0ZWs0OHQwMiAqKXJlZ3MpLT52YXIgJiBNU1RLXyAjIyBtYXNrICMjIF9NQVNLKSkKLSNkZWZpbmUgTVNUS19TRVQocmVncyx2YXIsdmFsdWUsbWFzaykgZG8geyAoKHN0cnVjdCBtb3N0ZWs0OHQwMiAqKXJlZ3MpLT52YXIgJj0gfihNU1RLXyAjIyBtYXNrICMjIF9NQVNLKTsgKChzdHJ1Y3QgbW9zdGVrNDh0MDIgKilyZWdzKS0+dmFyIHw9IE1TVEtfREVDSU1BTF9UT19SRUdWQUwodmFsdWUpICYgKE1TVEtfICMjIG1hc2sgIyMgX01BU0spOyB9IHdoaWxlICgwKQotCi0vKiBNYWNyb3MgdG8gbWFrZSByZWdpc3RlciBhY2Nlc3MgZWFzaWVyIG9uIG91ciBmaW5nZXJzLiBUaGVzZSBnaXZlIHlvdQotICogdGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIHJlcXVlc3RlZCBpZiBhcHBsaWNhYmxlLiBZb3UgcGFzcwotICogdGhlIGEgcG9pbnRlciB0byBhICdzdHJ1Y3QgbW9zdGVrNDh0MDInLgotICovCi0jZGVmaW5lCU1TVEtfUkVHX0NSRUcocmVncykJKCgoc3RydWN0IG1vc3RlazQ4dDAyICopcmVncyktPmNyZWcpCi0jZGVmaW5lCU1TVEtfUkVHX1NFQyhyZWdzKQlNU1RLX0dFVChyZWdzLHNlYyxTRUMpCi0jZGVmaW5lCU1TVEtfUkVHX01JTihyZWdzKQlNU1RLX0dFVChyZWdzLG1pbixNSU4pCi0jZGVmaW5lCU1TVEtfUkVHX0hPVVIocmVncykJTVNUS19HRVQocmVncyxob3VyLEhPVVIpCi0jZGVmaW5lCU1TVEtfUkVHX0RPVyhyZWdzKQlNU1RLX0dFVChyZWdzLGRvdyxET1cpCi0jZGVmaW5lCU1TVEtfUkVHX0RPTShyZWdzKQlNU1RLX0dFVChyZWdzLGRvbSxET00pCi0jZGVmaW5lCU1TVEtfUkVHX01PTlRIKHJlZ3MpCU1TVEtfR0VUKHJlZ3MsbW9udGgsTU9OVEgpCi0jZGVmaW5lCU1TVEtfUkVHX1lFQVIocmVncykJTVNUS19HRVQocmVncyx5ZWFyLFlFQVIpCi0KLSNkZWZpbmUJTVNUS19TRVRfUkVHX1NFQyhyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLHNlYyx2YWx1ZSxTRUMpCi0jZGVmaW5lCU1TVEtfU0VUX1JFR19NSU4ocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyxtaW4sdmFsdWUsTUlOKQotI2RlZmluZQlNU1RLX1NFVF9SRUdfSE9VUihyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLGhvdXIsdmFsdWUsSE9VUikKLSNkZWZpbmUJTVNUS19TRVRfUkVHX0RPVyhyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLGRvdyx2YWx1ZSxET1cpCi0jZGVmaW5lCU1TVEtfU0VUX1JFR19ET00ocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyxkb20sdmFsdWUsRE9NKQotI2RlZmluZQlNU1RLX1NFVF9SRUdfTU9OVEgocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyxtb250aCx2YWx1ZSxNT05USCkKLSNkZWZpbmUJTVNUS19TRVRfUkVHX1lFQVIocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyx5ZWFyLHZhbHVlLFlFQVIpCi0KLQotLyogVGhlIE1vc3RlayA0OHQwOCBjbG9jayBjaGlwLiBGb3VuZCBvbiBTdW40bSdzIEkgdGhpbmsuIEl0IGhhcyB0aGUKLSAqIHNhbWUgKGJhc2ljYWxseSkgbGF5b3V0IG9mIHRoZSA0OHQwMiBjaGlwIGV4Y2VwdCBmb3IgdGhlIGV4dHJhCi0gKiBOVlJBTSBvbiBib2FyZCAoOCBLQiBhZ2FpbnN0IHRoZSA0OHQwMidzIDIgS0IpLgotICovCi1zdHJ1Y3QgbW9zdGVrNDh0MDggewotCWNoYXIgb2Zmc2V0WzYqMTAyNF07ICAgICAgICAgLyogTWFnaWMgdGhpbmdzIG1heSBiZSBoZXJlLCB3aG8ga25vd3M/ICovCi0Jc3RydWN0IG1vc3RlazQ4dDAyIHJlZ3M7ICAgICAvKiBIZXJlIGlzIHdoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfU1VONAotZW51bSBzcGFyY19jbG9ja190eXBlIHsJTVNUSzQ4VDAyLCBNU1RLNDhUMDgsIFwKLUlOVEVSU0lMLCBNU1RLX0lOVkFMSUQgfTsKLSNlbHNlCi1lbnVtIHNwYXJjX2Nsb2NrX3R5cGUgewlNU1RLNDhUMDIsIE1TVEs0OFQwOCwgXAotTVNUS19JTlZBTElEIH07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TVU40Ci0vKiBpbnRlcnNpbCBvbiBhIHN1biA0LzI2MCBjb2RlICBkYXRhIGZyb20gaGFycmlzIGRvYyAqLwotc3RydWN0IGludGVyc2lsX2R0IHsKLSAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBpbnRfY3NlYzsKLSAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBpbnRfaG91cjsKLSAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBpbnRfbWluOwotICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGludF9zZWM7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaW50X21vbnRoOwotICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGludF9kYXk7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaW50X3llYXI7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaW50X2RvdzsKLX07Ci0KLXN0cnVjdCBpbnRlcnNpbCB7Ci0Jc3RydWN0IGludGVyc2lsX2R0IGNsazsKLQlzdHJ1Y3QgaW50ZXJzaWxfZHQgY21wOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaW50X2ludHJfcmVnOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaW50X2NtZF9yZWc7Ci19OwotCi0jZGVmaW5lIElOVEVSU0lMX1NUT1AgICAgICAgIDB4MAotI2RlZmluZSBJTlRFUlNJTF9TVEFSVCAgICAgICAweDgKLSNkZWZpbmUgSU5URVJTSUxfSU5UUl9ESVNBQkxFICAgMHgwCi0jZGVmaW5lIElOVEVSU0lMX0lOVFJfRU5BQkxFICAgMHgxMAotI2RlZmluZSBJTlRFUlNJTF8zMksJCTB4MAotI2RlZmluZSBJTlRFUlNJTF9OT1JNQUwJCTB4MAotI2RlZmluZSBJTlRFUlNJTF8yNEgJCTB4NAotI2RlZmluZSBJTlRFUlNJTF9JTlRfMTAwSFoJMHgyCi0KLS8qIGVuZCBvZiBpbnRlcnNpbCBpbmZvICovCi0jZW5kaWYKLQotI2VuZGlmIC8qICEoX1NQQVJDX01PU1RFS19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb3N0ZWtfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW9zdGVrXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjUyZGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tb3N0ZWtfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBtb3N0ZWsuaDogIERlc2NyaWJlcyB0aGUgdmFyaW91cyBNb3N0ZWsgdGltZSBvZiBkYXkgY2xvY2sgcmVnaXN0ZXJzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgVGhvbWFzIEsuIER5YXMgKHRkeWFzQGVkZW4ucnV0Z2Vycy5lZHUpCi0gKi8KLQotI2lmbmRlZiBfU1BBUkM2NF9NT1NURUtfSAotI2RlZmluZSBfU1BBUkM2NF9NT1NURUtfSAotCi0jaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotCi0vKiAgICAgICBNNDhUMDIgUmVnaXN0ZXIgTWFwIChhZGFwdGVkIGZyb20gU3VuIE5WUkFNL0hvc3RpZCBGQVEpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEKLSAqIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24KLSAqICAgICAgICBCaXQgNyBCaXQgNiBCaXQgNSBCaXQgNEJpdCAzIEJpdCAyIEJpdCAxIEJpdCAwCi0gKiAgIDdmZiAgLSAgICAgLSAgICAgLSAgICAgLSAgICAtICAgICAtICAgICAtICAgICAtICAgICAgIFllYXIgMDAtOTkKLSAqICAgN2ZlICAwICAgICAwICAgICAwICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgICBNb250aCAwMS0xMgotICogICA3ZmQgIDAgICAgIDAgICAgIC0gICAgIC0gICAgLSAgICAgLSAgICAgLSAgICAgLSAgICAgICBEYXRlIDAxLTMxCi0gKiAgIDdmYyAgMCAgICAgRlQgICAgMCAgICAgMCAgICAwICAgICAtICAgICAtICAgICAtICAgICAgICBEYXkgMDEtMDcKLSAqICAgN2ZiICBLUyAgICAwICAgICAtICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgICBIb3VycyAwMC0yMwotICogICA3ZmEgIDAgICAgIC0gICAgIC0gICAgIC0gICAgLSAgICAgLSAgICAgLSAgICAgLSAgICBNaW51dGVzIDAwLTU5Ci0gKiAgIDdmOSAgU1QgICAgLSAgICAgLSAgICAgLSAgICAtICAgICAtICAgICAtICAgICAtICAgIFNlY29uZHMgMDAtNTkKLSAqICAgN2Y4ICBXICAgICBSICAgICBTICAgICAtICAgIC0gICAgIC0gICAgIC0gICAgIC0gICAgQ29udHJvbAotICoKLSAqICAgKiBTVCBpcyBTVE9QIEJJVAotICogICAqIFcgaXMgV1JJVEUgQklUCi0gKiAgICogUiBpcyBSRUFEIEJJVAotICogICAqIFMgaXMgU0lHTiBCSVQKLSAqICAgKiBGVCBpcyBGUkVRIFRFU1QgQklUCi0gKiAgICogS1MgaXMgS0lDSyBTVEFSVCBCSVQKLSAqLwotCi0vKiBUaGUgTW9zdGVrIDQ4dDAyIHJlYWwgdGltZSBjbG9jayBhbmQgTlZSQU0gY2hpcC4gVGhlIHJlZ2lzdGVycwotICogb3RoZXIgdGhhbiB0aGUgY29udHJvbCByZWdpc3RlciBhcmUgaW4gYmluYXJ5IGNvZGVkIGRlY2ltYWwuIFNvbWUKLSAqIGNvbnRyb2wgYml0cyBhbHNvIGxpdmUgb3V0c2lkZSB0aGUgY29udHJvbCByZWdpc3Rlci4KLSAqCi0gKiBXZSBub3cgZGVhbCB3aXRoIHBoeXNpY2FsIGFkZHJlc3NlcyBmb3IgSS9PIHRvIHRoZSBjaGlwLiAtRGF2ZU0KLSAqLwotc3RhdGljIGlubGluZSB1OCBtb3N0ZWtfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JdTggcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkdWJhCVslMV0gJTIsICUwIgotCQkJICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgOiAiciIgKGFkZHIpLCAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1vc3Rla193cml0ZSh2b2lkIF9faW9tZW0gKmFkZHIsIHU4IHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RiYQklMCwgWyUxXSAlMiIKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiICh2YWwpLCAiciIgKGFkZHIpLCAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSk7Ci19Ci0KLSNkZWZpbmUgTU9TVEVLX0VFUFJPTQkJMHgwMDAwVUwKLSNkZWZpbmUgTU9TVEVLX0lEUFJPTQkJMHgwN2Q4VUwKLSNkZWZpbmUgTU9TVEVLX0NSRUcJCTB4MDdmOFVMCi0jZGVmaW5lIE1PU1RFS19TRUMJCTB4MDdmOVVMCi0jZGVmaW5lIE1PU1RFS19NSU4JCTB4MDdmYVVMCi0jZGVmaW5lIE1PU1RFS19IT1VSCQkweDA3ZmJVTAotI2RlZmluZSBNT1NURUtfRE9XCQkweDA3ZmNVTAotI2RlZmluZSBNT1NURUtfRE9NCQkweDA3ZmRVTAotI2RlZmluZSBNT1NURUtfTU9OVEgJCTB4MDdmZVVMCi0jZGVmaW5lIE1PU1RFS19ZRUFSCQkweDA3ZmZVTAotCi1leHRlcm4gc3BpbmxvY2tfdCBtb3N0ZWtfbG9jazsKLWV4dGVybiB2b2lkIF9faW9tZW0gKm1zdGs0OHQwMl9yZWdzOwotCi0vKiBDb250cm9sIHJlZ2lzdGVyIHZhbHVlcy4gKi8KLSNkZWZpbmUJTVNUS19DUkVHX1dSSVRFCTB4ODAJLyogTXVzdCBzZXQgdGhpcyBiZWZvcmUgcGxhY2luZyB2YWx1ZXMuICovCi0jZGVmaW5lCU1TVEtfQ1JFR19SRUFECTB4NDAJLyogU3RvcCB1cGRhdGVzIHRvIGFsbG93IGEgY2xlYW4gcmVhZC4gKi8KLSNkZWZpbmUJTVNUS19DUkVHX1NJR04JMHgyMAkvKiBTbG93L3NwZWVkIGNsb2NrIGluIGNhbGlicmF0aW9uIG1vZGUuICovCi0KLS8qIENvbnRyb2wgYml0cyB0aGF0IGxpdmUgaW4gdGhlIG90aGVyIHJlZ2lzdGVycy4gKi8KLSNkZWZpbmUJTVNUS19TVE9QCTB4ODAJLyogU3RvcCB0aGUgY2xvY2sgb3NjaWxsYXRvci4gKHNlYykgKi8KLSNkZWZpbmUJTVNUS19LSUNLX1NUQVJUCTB4ODAJLyogS2ljayBzdGFydCB0aGUgY2xvY2sgY2hpcC4gKGhvdXIpICovCi0jZGVmaW5lIE1TVEtfRlJFUV9URVNUCTB4NDAJLyogRnJlcXVlbmN5IHRlc3QgbW9kZS4gKGRheSkgKi8KLQotI2RlZmluZSBNU1RLX1lFQVJfWkVSTyAgICAgICAxOTY4ICAgLyogSWYgeWVhciByZWcgaGFzIHplcm8sIGl0IGlzIDE5NjguICovCi0jZGVmaW5lIE1TVEtfQ1ZUX1lFQVIoeXIpICAoKHlyKSArIE1TVEtfWUVBUl9aRVJPKQotCi0vKiBNYXNrcyB0aGF0IGRlZmluZSBob3cgbXVjaCBzcGFjZSBlYWNoIHZhbHVlIHRha2VzIHVwLiAqLwotI2RlZmluZQlNU1RLX1NFQ19NQVNLCTB4N2YKLSNkZWZpbmUJTVNUS19NSU5fTUFTSwkweDdmCi0jZGVmaW5lCU1TVEtfSE9VUl9NQVNLCTB4M2YKLSNkZWZpbmUJTVNUS19ET1dfTUFTSwkweDA3Ci0jZGVmaW5lCU1TVEtfRE9NX01BU0sJMHgzZgotI2RlZmluZQlNU1RLX01PTlRIX01BU0sJMHgxZgotI2RlZmluZQlNU1RLX1lFQVJfTUFTSwkweGZmVQotCi0vKiBCaW5hcnkgY29kZWQgZGVjaW1hbCBjb252ZXJzaW9uIG1hY3Jvcy4gKi8KLSNkZWZpbmUgTVNUS19SRUdWQUxfVE9fREVDSU1BTCh4KSAgKCgoeCkgJiAweDBGKSArIDB4MEEgKiAoKHgpID4+IDB4MDQpKQotI2RlZmluZSBNU1RLX0RFQ0lNQUxfVE9fUkVHVkFMKHgpICAoKCgoeCkgLyAweDBBKSA8PCAweDA0KSArICgoeCkgJSAweDBBKSkKLQotLyogR2VuZXJpYyByZWdpc3RlciBzZXQgYW5kIGdldCBtYWNyb3MgZm9yIGludGVybmFsIHVzZS4gKi8KLSNkZWZpbmUgTVNUS19HRVQocmVncyxuYW1lKQlcCi0JKE1TVEtfUkVHVkFMX1RPX0RFQ0lNQUwobW9zdGVrX3JlYWQocmVncyArIE1PU1RFS18gIyMgbmFtZSkgJiBNU1RLXyAjIyBuYW1lICMjIF9NQVNLKSkKLSNkZWZpbmUgTVNUS19TRVQocmVncyxuYW1lLHZhbHVlKSBcCi1kbyB7CXU4IF9fdmFsID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS18gIyMgbmFtZSk7IFwKLQlfX3ZhbCAmPSB+KE1TVEtfICMjIG5hbWUgIyMgX01BU0spOyBcCi0JX192YWwgfD0gKE1TVEtfREVDSU1BTF9UT19SRUdWQUwodmFsdWUpICYgXAotCQkgIChNU1RLXyAjIyBuYW1lICMjIF9NQVNLKSk7IFwKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS18gIyMgbmFtZSwgX192YWwpOyBcCi19IHdoaWxlKDApCi0KLS8qIE1hY3JvcyB0byBtYWtlIHJlZ2lzdGVyIGFjY2VzcyBlYXNpZXIgb24gb3VyIGZpbmdlcnMuIFRoZXNlIGdpdmUgeW91Ci0gKiB0aGUgZGVjaW1hbCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgcmVxdWVzdGVkIGlmIGFwcGxpY2FibGUuIFlvdSBwYXNzCi0gKiB0aGUgYSBwb2ludGVyIHRvIGEgJ3N0cnVjdCBtb3N0ZWs0OHQwMicuCi0gKi8KLSNkZWZpbmUJTVNUS19SRUdfQ1JFRyhyZWdzKQkobW9zdGVrX3JlYWQoKHJlZ3MpICsgTU9TVEVLX0NSRUcpKQotI2RlZmluZQlNU1RLX1JFR19TRUMocmVncykJTVNUS19HRVQocmVncyxTRUMpCi0jZGVmaW5lCU1TVEtfUkVHX01JTihyZWdzKQlNU1RLX0dFVChyZWdzLE1JTikKLSNkZWZpbmUJTVNUS19SRUdfSE9VUihyZWdzKQlNU1RLX0dFVChyZWdzLEhPVVIpCi0jZGVmaW5lCU1TVEtfUkVHX0RPVyhyZWdzKQlNU1RLX0dFVChyZWdzLERPVykKLSNkZWZpbmUJTVNUS19SRUdfRE9NKHJlZ3MpCU1TVEtfR0VUKHJlZ3MsRE9NKQotI2RlZmluZQlNU1RLX1JFR19NT05USChyZWdzKQlNU1RLX0dFVChyZWdzLE1PTlRIKQotI2RlZmluZQlNU1RLX1JFR19ZRUFSKHJlZ3MpCU1TVEtfR0VUKHJlZ3MsWUVBUikKLQotI2RlZmluZQlNU1RLX1NFVF9SRUdfU0VDKHJlZ3MsdmFsdWUpCU1TVEtfU0VUKHJlZ3MsU0VDLHZhbHVlKQotI2RlZmluZQlNU1RLX1NFVF9SRUdfTUlOKHJlZ3MsdmFsdWUpCU1TVEtfU0VUKHJlZ3MsTUlOLHZhbHVlKQotI2RlZmluZQlNU1RLX1NFVF9SRUdfSE9VUihyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLEhPVVIsdmFsdWUpCi0jZGVmaW5lCU1TVEtfU0VUX1JFR19ET1cocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyxET1csdmFsdWUpCi0jZGVmaW5lCU1TVEtfU0VUX1JFR19ET00ocmVncyx2YWx1ZSkJTVNUS19TRVQocmVncyxET00sdmFsdWUpCi0jZGVmaW5lCU1TVEtfU0VUX1JFR19NT05USChyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLE1PTlRILHZhbHVlKQotI2RlZmluZQlNU1RLX1NFVF9SRUdfWUVBUihyZWdzLHZhbHVlKQlNU1RLX1NFVChyZWdzLFlFQVIsdmFsdWUpCi0KLQotLyogVGhlIE1vc3RlayA0OHQwOCBjbG9jayBjaGlwLiBGb3VuZCBvbiBTdW40bSdzIEkgdGhpbmsuIEl0IGhhcyB0aGUKLSAqIHNhbWUgKGJhc2ljYWxseSkgbGF5b3V0IG9mIHRoZSA0OHQwMiBjaGlwIGV4Y2VwdCBmb3IgdGhlIGV4dHJhCi0gKiBOVlJBTSBvbiBib2FyZCAoOCBLQiBhZ2FpbnN0IHRoZSA0OHQwMidzIDIgS0IpLgotICovCi0jZGVmaW5lIE1PU1RFS180OFQwOF9PRkZTRVQJMHgwMDAwVUwJLyogTG93ZXIgTlZSQU0gcG9ydGlvbnMgKi8KLSNkZWZpbmUgTU9TVEVLXzQ4VDA4XzQ4VDAyCTB4MTgwMFVMCS8qIE9mZnNldCB0byA0OFQwMiBjaGlwICovCi0KLS8qIFNVTjUgc3lzdGVtcyB1c3VhbGx5IGhhdmUgNDh0NTkgbW9kZWwgY2xvY2sgY2hpcHNldHMuICBCdXQgd2Uga2VlcCB0aGUgb2xkZXIKLSAqIGNsb2NrIGNoaXAgZGVmaW5pdGlvbnMgYXJvdW5kIGp1c3QgaW4gY2FzZS4KLSAqLwotI2RlZmluZSBNT1NURUtfNDhUNTlfT0ZGU0VUCTB4MDAwMFVMCS8qIExvd2VyIE5WUkFNIHBvcnRpb25zICovCi0jZGVmaW5lIE1PU1RFS180OFQ1OV80OFQwMgkweDE4MDBVTAkvKiBPZmZzZXQgdG8gNDhUMDIgY2hpcCAqLwotCi0jZW5kaWYgLyogIShfU1BBUkM2NF9NT1NURUtfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2Jpby5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vYmlvLmgKaW5kZXggMWE3NTQ0Yy4uNGFkZTBjOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vYmlvLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vYmlvLmgKQEAgLTE1NSwxNyArMTU1LDYgQEAKIAkJCSAgICAgICJpIiAoQVNJX01fQ1RMKSk7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGNwdV9sZWRzWzMyXTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNob3dfbGVkcyhpbnQgY3B1aWQpCi17Ci0JY3B1aWQgJj0gMHgxZTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YmEgJTAsIFslMV0gJTIiIDogOgotCQkJICAgICAgInIiICgoY3B1X2xlZHNbY3B1aWRdIDw8IDQpIHwgY3B1X2xlZHNbY3B1aWQrMV0pLAotCQkJICAgICAgInIiIChFQ1NSX0JBU0UoY3B1aWQpIHwgQkJfTEVEUyksCi0JCQkgICAgICAiaSIgKEFTSV9NX0NUTCkpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNjX2dldF9pcGVuKHZvaWQpCiB7CiAJdW5zaWduZWQgcGVuZGluZzsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2ZfZGV2aWNlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX2RldmljZS5oCmluZGV4IGJiYTc3N2EuLmE1ZDk4MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2ZfZGV2aWNlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vZl9kZXZpY2UuaApAQCAtMzAsNiArMzAsOCBAQAogZXh0ZXJuIHZvaWQgX19pb21lbSAqb2ZfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCBvZl9pb3VubWFwKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKK2V4dGVybiB2b2lkIG9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShzdHJ1Y3Qgb2ZfZGV2aWNlICpidXMpOworCiAvKiBUaGlzIGlzIGp1c3QgaGVyZSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gKi8KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29mX3BsYXRmb3JtLmgKaW5kZXggMjM0OGFiOS4uOTBkYTk5MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vZl9wbGF0Zm9ybS5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb2ZfcGxhdGZvcm0uaApAQCAtMTMsOSArMTMsNiBAQAogICoKICAqLwogCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIGVidXNfYnVzX3R5cGU7Ci1leHRlcm4gc3RydWN0IGJ1c190eXBlIHNidXNfYnVzX3R5cGU7Ci0KICNkZWZpbmUgb2ZfYnVzX3R5cGUJb2ZfcGxhdGZvcm1fYnVzX3R5cGUJLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzMyLmgKaW5kZXggYjI2MzFkYS4uNjk5ZGEwNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGxpYl8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BsaWJfMzIuaApAQCAtMjEsNyArMjEsNiBAQAogCVBST01fVjIsICAgICAgLyogc3VuNGMgYW5kIGVhcmx5IHN1bjRtIFYyIHByb20gKi8KIAlQUk9NX1YzLCAgICAgIC8qIHN1bjRtIGFuZCBsYXRlciwgdXAgdG8gc3VuNGQvc3VuNGUgbWFjaGluZXMgVjMgKi8KIAlQUk9NX1AxMjc1LCAgIC8qIElFRUUgY29tcGxpYW50IElTQSBiYXNlZCBTdW4gUFJPTSwgb25seSBzdW40dSAqLwotCVBST01fU1VONCwgICAgLyogT2xkIHN1bjQgcHJvbXMgYXJlIHRvdGFsbHkgZGlmZmVyZW50LCBidXQgd2UnbGwgc2hvZWhvcm4gaXQgdG8gbWFrZSBpdCBmaXQgKi8KIH07CiAKIGV4dGVybiBlbnVtIHByb21fbWFqb3JfdmVyc2lvbiBwcm9tX3ZlcnM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhZ2VfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV8zMi5oCmluZGV4IGNmNWZiNzAuLmQxODA2ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV8zMi5oCkBAIC04LDExICs4LDggQEAKICNpZm5kZWYgX1NQQVJDX1BBR0VfSAogI2RlZmluZSBfU1BBUkNfUEFHRV9ICiAKLSNpZmRlZiBDT05GSUdfU1VONAotI2RlZmluZSBQQUdFX1NISUZUICAgMTMKLSNlbHNlCiAjZGVmaW5lIFBBR0VfU0hJRlQgICAxMgotI2VuZGlmCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKiBJIGhhdmUgbXkgc3VzcGljaW9ucy4uLiAtRGF2ZU0gKi8KICNkZWZpbmUgUEFHRV9TSVpFICAgICgxVUwgPDwgUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKaW5kZXggYjU3OWI5MS4uNDI3NGVkMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKQEAgLTM4LDYgKzM4LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2RlZmluZSBXQU5UX1BBR0VfVklSVFVBTAorCiBleHRlcm4gdm9pZCBfY2xlYXJfcGFnZSh2b2lkICpwYWdlKTsKICNkZWZpbmUgY2xlYXJfcGFnZShYKQlfY2xlYXJfcGFnZSgodm9pZCAqKShYKSkKIHN0cnVjdCBwYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYXJwb3J0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhcnBvcnQuaAppbmRleCBkOTgzMDYyLi5kZmYzZjAyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhcnBvcnQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhcnBvcnQuaApAQCAtOCw3ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL2VidXMuaD4KKyNpbmNsdWRlIDxhc20vZWJ1c19kbWEuaD4KICNpbmNsdWRlIDxhc20vbnM4NzMwMy5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBlY3BwX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlY3BwX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJlY3BwIiwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzMyLmgKaW5kZXggMGVlOTQ5ZC4uYjQxYzRjMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV8zMi5oCkBAIC0zLDYgKzMsOCBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKwogLyogQ2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGxvZ2ljIGluIHBjaV9zY2FuX2J1cyBmb3Igc2tpcHBpbmcKICAqIGFscmVhZHktY29uZmlndXJlZCBidXMgbnVtYmVycyAtIHRvIGJlIHVzZWQgZm9yIGJ1Z2d5IEJJT1NlcwogICogb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluY29tcGxldGUgUENJIHNldHVwIGJ5IHRoZSBsb2FkZXIuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV8zMi5oCmluZGV4IDA4MjM3ZmQuLmUwY2FiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGd0YWJsZV8zMi5oCkBAIC0xNCwxMSArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2lmZGVmIENPTkZJR19TVU40Ci0jaW5jbHVkZSA8YXNtL3BndHN1bjQuaD4KLSNlbHNlCiAjaW5jbHVkZSA8YXNtL3BndHN1bjRjLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxhc20vcGd0c3JtbXUuaD4KICNpbmNsdWRlIDxhc20vdmFjLW9wcy5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaAppbmRleCBiYjllYzJjLi5iMDQ5YWJmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaApAQCAtNzcwLDYgKzc3MCw4IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNtZGxpbmVfbWVtb3J5X3NpemU7CiAKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZG9fc3BhcmM2NF9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIAogI2VuZGlmIC8qICEoX1NQQVJDNjRfUEdUQUJMRV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCBmZDU1NTIyLi45MDBkNDQ3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb20uaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMTgsNiArMTgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNkZWZpbmUgT0ZfUk9PVF9OT0RFX0FERFJfQ0VMTFNfREVGQVVMVAkyCkBAIC03Myw2ICs3NCw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9jcHVpZChpbnQgY3B1aWQpOwogZXh0ZXJuIGludCBvZl9zZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pOworZXh0ZXJuIHN0cnVjdCBtdXRleCBvZl9zZXRfcHJvcGVydHlfbXV0ZXg7CiBleHRlcm4gaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSBjb25zdCBjaGFyICpuYW1lLAogCQkJCSBpbnQgZGVmKTsKQEAgLTk0LDYgKzk2LDE2IEBACiB7CiB9CiAKKy8qIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIGhvdyBwb3dlcnBjCisgKiBoYW5kbGVzIElSUSBtYXBwaW5nIGZvciBPRiBkZXZpY2Ugbm9kZXMuICBXZSBwcmVjb21wdXRlIGFuZCBwZXJtYW5lbnRseQorICogcmVnaXN0ZXIgdGhlbSBpbiB0aGUgb2ZfZGV2aWNlIG9iamVjdHMsIHdoZXJlYXMgcG93ZXJwYyBjb21wdXRlcyB0aGVtCisgKiBvbiByZXF1ZXN0LgorICovCitleHRlcm4gdW5zaWduZWQgaW50IGlycV9vZl9wYXJzZV9hbmRfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGluZGV4KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCB2aXJxKQoreworfQorCiAvKgogICogTkI6ICBUaGlzIGlzIGhlcmUgd2hpbGUgd2UgdHJhbnNpdGlvbiBmcm9tIHVzaW5nIGFzbS9wcm9tLmgKICAqIHRvIGxpbnV4L29mLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV82NC5oCmluZGV4IDA2ZTQ5MTQuLjNkM2U5YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2VfNjQuaApAQCAtMTEzLDYgKzExMyw4IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisKIHN0YXRpYyBpbmxpbmUgaW50IHB0X3JlZ3NfdHJhcF90eXBlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJldHVybiByZWdzLT5tYWdpYyAmIDB4MWZmOwpAQCAtMTM4LDYgKzE0MCw3IEBACiAJc3RydWN0IHRocmVhZF9pbmZvCSp0aHJlYWQ7CiAJdW5zaWduZWQgbG9uZwkJcGFkMTsKIH07CitleHRlcm4gc3RydWN0IGdsb2JhbF9yZWdfc25hcHNob3QgZ2xvYmFsX3JlZ19zbmFwc2hvdFtOUl9DUFVTXTsKIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1BUUkFDRQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlYm9vdC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9yZWJvb3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzZjQzZi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlYm9vdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9TUEFSQzY0X1JFQk9PVF9ICi0jZGVmaW5lIF9TUEFSQzY0X1JFQk9PVF9ICi0KLWV4dGVybiB2b2lkIG1hY2hpbmVfYWx0X3Bvd2VyX29mZih2b2lkKTsKLQotI2VuZGlmIC8qIF9TUEFSQzY0X1JFQk9PVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3J0Yy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ydGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllY2IxZi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3J0Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIHJ0Yy5oOiBEZWZpbml0aW9ucyBmb3IgYWNjZXNzIHRvIHRoZSBNb3N0ZWsgcmVhbCB0aW1lIGNsb2NrCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IFRob21hcyBLLiBEeWFzICh0ZHlhc0BlZGVuLnJ1dGdlcnMuZWR1KQotICovCi0KLSNpZm5kZWYgX1JUQ19ICi0jZGVmaW5lIF9SVENfSAotCi0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotc3RydWN0IHJ0Y190aW1lCi17Ci0JaW50CXNlYzsJLyogU2Vjb25kcyAoMC01OSkgKi8KLQlpbnQJbWluOwkvKiBNaW51dGVzICgwLTU5KSAqLwotCWludAlob3VyOwkvKiBIb3VyICgwLTIzKSAqLwotCWludAlkb3c7CS8qIERheSBvZiB0aGUgd2VlayAoMS03KSAqLwotCWludAlkb207CS8qIERheSBvZiB0aGUgbW9udGggKDEtMzEpICovCi0JaW50CW1vbnRoOwkvKiBNb250aCBvZiB5ZWFyICgxLTEyKSAqLwotCWludAl5ZWFyOwkvKiBZZWFyICgwLTk5KSAqLwotfTsKLQotI2RlZmluZSBSVENHRVQgX0lPUigncCcsIDIwLCBzdHJ1Y3QgcnRjX3RpbWUpCi0jZGVmaW5lIFJUQ1NFVCBfSU9XKCdwJywgMjEsIHN0cnVjdCBydGNfdGltZSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NidXMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODI0ODFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19TQlVTX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1NCVVNfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3NidXNfNjQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8YXNtL3NidXNfMzIuaD4KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NidXNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1c18zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I0ZmEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1c18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBzYnVzLmg6ICBEZWZpbmVzIGZvciB0aGUgU3VuIFNCdXMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqLwotCi0jaWZuZGVmIF9TUEFSQ19TQlVTX0gKLSNkZWZpbmUgX1NQQVJDX1NCVVNfSAotCi0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0KLS8qIFdlIHNjYW4gd2hpY2ggZGV2aWNlcyBhcmUgb24gdGhlIFNCdXMgdXNpbmcgdGhlIFBST00gbm9kZSBkZXZpY2UKLSAqIHRyZWUuICBTQnVzIGRldmljZXMgYXJlIGRlc2NyaWJlZCBpbiB0d28gZGlmZmVyZW50IHdheXMuICBZb3UgY2FuCi0gKiBlaXRoZXIgZ2V0IGFuIGFic29sdXRlIGFkZHJlc3MgYXQgd2hpY2ggdG8gYWNjZXNzIHRoZSBkZXZpY2UsIG9yCi0gKiB5b3UgY2FuIGdldCBhIFNCdXMgJ3Nsb3QnIG51bWJlciBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGF0IHNsb3QuCi0gKi8KLQotLyogVGhlIGJhc2UgYWRkcmVzcyBhdCB3aGljaCB0byBjYWxjdWxhdGUgZGV2aWNlIE9CSU8gYWRkcmVzc2VzLiAqLwotI2RlZmluZSBTVU5fU0JVU19CVkFERFIgICAgICAgIDB4ZjgwMDAwMDAKLSNkZWZpbmUgU0JVU19PRkZfTUFTSyAgICAgICAgICAweDAxZmZmZmZmCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBkZXZpY2UgYWRkcmVzcyBmcm9tIHNsb3QKLSAqIG51bWJlcnMgKyBvZmZzZXRzLCBhbmQgdmljZSB2ZXJzYS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2J1c19kZXZhZGRyKGludCBzbG90bnVtLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSAoU1VOX1NCVVNfQlZBRERSKygoc2xvdG51bSk8PDI1KSsob2Zmc2V0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHNidXNfZGV2X3Nsb3QodW5zaWduZWQgbG9uZyBkZXZfYWRkcikKLXsKLSAgcmV0dXJuIChpbnQpICgoKGRldl9hZGRyKS1TVU5fU0JVU19CVkFERFIpPj4yNSk7Ci19Ci0KLXN0cnVjdCBzYnVzX2J1czsKLQotLyogTGludXggU0JVUyBkZXZpY2UgdGFibGVzICovCi1zdHJ1Y3Qgc2J1c19kZXYgewotCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7Ci0Jc3RydWN0IHNidXNfYnVzCQkqYnVzOwotCXN0cnVjdCBzYnVzX2RldgkJKm5leHQ7Ci0Jc3RydWN0IHNidXNfZGV2CQkqY2hpbGQ7Ci0Jc3RydWN0IHNidXNfZGV2CQkqcGFyZW50OwotCWludCBwcm9tX25vZGU7Ci0JY2hhciBwcm9tX25hbWVbNjRdOwotCWludCBzbG90OwotCi0Jc3RydWN0IHJlc291cmNlIHJlc291cmNlW1BST01SRUdfTUFYXTsKLQotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyByZWdfYWRkcnNbUFJPTVJFR19NQVhdOwotCWludCBudW1fcmVnaXN0ZXJzOwotCi0Jc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIGRldmljZV9yYW5nZXNbUFJPTVJFR19NQVhdOwotCWludCBudW1fZGV2aWNlX3JhbmdlczsKLQotCXVuc2lnbmVkIGludCBpcnFzWzRdOwotCWludCBudW1faXJxczsKLX07Ci0jZGVmaW5lIHRvX3NidXNfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc2J1c19kZXYsIG9mZGV2LmRldikKLQotLyogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHRoZSBTQnVzKHMpIGZvdW5kIG9uIHRoaXMgbWFjaGluZS4gKi8KLXN0cnVjdCBzYnVzX2J1cyB7Ci0Jc3RydWN0IG9mX2RldmljZQlvZmRldjsKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpkZXZpY2VzOwkvKiBMaW5rIHRvIGRldmljZXMgb24gdGhpcyBTQnVzICovCi0Jc3RydWN0IHNidXNfYnVzCQkqbmV4dDsJCS8qIG5leHQgU0J1cywgaWYgbW9yZSB0aGFuIG9uZSBTQnVzICovCi0JaW50CQkJcHJvbV9ub2RlOwkvKiBQUk9NIGRldmljZSB0cmVlIG5vZGUgZm9yIHRoaXMgU0J1cyAqLwotCWNoYXIJCQlwcm9tX25hbWVbNjRdOyAgLyogVXN1YWxseSAic2J1cyIgb3IgInNiaSIgKi8KLQlpbnQJCQljbG9ja19mcmVxOwotCi0Jc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHNidXNfcmFuZ2VzW1BST01SRUdfTUFYXTsKLQlpbnQgbnVtX3NidXNfcmFuZ2VzOwotCi0JaW50IGRldmlkOwotCWludCBib2FyZDsKLX07Ci0jZGVmaW5lIHRvX3NidXMoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzYnVzX2J1cywgb2ZkZXYuZGV2KQotCi1leHRlcm4gc3RydWN0IHNidXNfYnVzICpzYnVzX3Jvb3Q7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zYnVzX2lzX3NsYXZlKHN0cnVjdCBzYnVzX2RldiAqZGV2KQotewotCS8qIFhYWCBIYXZlIHRvIHdyaXRlIHRoaXMgZm9yIHN1bjRjJ3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyogRGV2aWNlIHByb2Jpbmcgcm91dGluZXMgY291bGQgZmluZCB0aGVzZSBoYW5keSAqLwotI2RlZmluZSBmb3JfZWFjaF9zYnVzKGJ1cykgXAotICAgICAgICBmb3IoKGJ1cykgPSBzYnVzX3Jvb3Q7IChidXMpOyAoYnVzKT0oYnVzKS0+bmV4dCkKLQotI2RlZmluZSBmb3JfZWFjaF9zYnVzZGV2KGRldmljZSwgYnVzKSBcCi0gICAgICAgIGZvcigoZGV2aWNlKSA9IChidXMpLT5kZXZpY2VzOyAoZGV2aWNlKTsgKGRldmljZSk9KGRldmljZSktPm5leHQpCi0KLSNkZWZpbmUgZm9yX2FsbF9zYnVzZGV2KGRldmljZSwgYnVzKSBcCi0JZm9yICgoYnVzKSA9IHNidXNfcm9vdDsgKGJ1cyk7IChidXMpID0gKGJ1cyktPm5leHQpIFwKLQkJZm9yICgoZGV2aWNlKSA9IChidXMpLT5kZXZpY2VzOyAoZGV2aWNlKTsgKGRldmljZSkgPSAoZGV2aWNlKS0+bmV4dCkKLQotLyogRHJpdmVyIERWTUEgaW50ZXJmYWNlcy4gKi8KLSNkZWZpbmUgc2J1c19jYW5fZG1hXzY0Yml0KHNkZXYpCSgwKSAvKiBhY3R1YWxseSwgc3BhcmNfY3B1X21vZGVsPT1zdW40ZCAqLwotI2RlZmluZSBzYnVzX2Nhbl9idXJzdDY0KHNkZXYpCQkoMCkgLyogYWN0dWFsbHksIHNwYXJjX2NwdV9tb2RlbD09c3VuNGQgKi8KLWV4dGVybiB2b2lkIHNidXNfc2V0X3NidXM2NChzdHJ1Y3Qgc2J1c19kZXYgKiwgaW50KTsKLWV4dGVybiB2b2lkIHNidXNfZmlsbF9kZXZpY2VfaXJxKHN0cnVjdCBzYnVzX2RldiAqKTsKLQotLyogVGhlc2UgeWllbGQgSU9NTVUgbWFwcGluZ3MgaW4gY29uc2lzdGVudCBtb2RlLiAqLwotZXh0ZXJuIHZvaWQgKnNidXNfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKiwgbG9uZywgdTMyICpkbWFfYWRkcnApOwotZXh0ZXJuIHZvaWQgc2J1c19mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHNidXNfZGV2ICosIGxvbmcsIHZvaWQgKiwgdTMyKTsKLXZvaWQgcHJvbV9hZGp1c3RfcmFuZ2VzKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqLCBpbnQsCi0JCQlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKiwgaW50KTsKLQotI2RlZmluZSBTQlVTX0RNQV9CSURJUkVDVElPTkFMCURNQV9CSURJUkVDVElPTkFMCi0jZGVmaW5lIFNCVVNfRE1BX1RPREVWSUNFCURNQV9UT19ERVZJQ0UKLSNkZWZpbmUgU0JVU19ETUFfRlJPTURFVklDRQlETUFfRlJPTV9ERVZJQ0UKLSNkZWZpbmUJU0JVU19ETUFfTk9ORQkJRE1BX05PTkUKLQotLyogQWxsIHRoZSByZXN0IHVzZSBzdHJlYW1pbmcgbW9kZSBtYXBwaW5ncy4gKi8KLWV4dGVybiBkbWFfYWRkcl90IHNidXNfbWFwX3NpbmdsZShzdHJ1Y3Qgc2J1c19kZXYgKiwgdm9pZCAqLCBzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZCBzYnVzX3VubWFwX3NpbmdsZShzdHJ1Y3Qgc2J1c19kZXYgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBpbnQpOwotZXh0ZXJuIGludCBzYnVzX21hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwgaW50KTsKLWV4dGVybiB2b2lkIHNidXNfdW5tYXBfc2coc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7Ci0KLS8qIEZpbmFsbHksIGFsbG93IGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbiBvZiBzdHJlYW1hYmxlIG1hcHBpbmdzLiAqLwotZXh0ZXJuIHZvaWQgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3Qgc2J1c19kZXYgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBpbnQpOwotI2RlZmluZSBzYnVzX2RtYV9zeW5jX3NpbmdsZSBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqLCBkbWFfYWRkcl90LCBzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7Ci0jZGVmaW5lIHNidXNfZG1hX3N5bmNfc2cgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7Ci0KLS8qIEVyaWMgQnJvd2VyIChlYnJvd2VyQHVzYS5uZXQpCi0gKiBUcmFuc2xhdGUgU0J1cyBpbnRlcnJ1cHQgbGV2ZWxzIHRvIGlubyB2YWx1ZXMtLQotICogdGhpcyBpcyB1c2VkIHdoZW4gY29udmVydGluZyBzYnVzICJpbnRlcnJ1cHRzIiBPQlAKLSAqIG5vZGUgdmFsdWVzIHRvICJpbnRyIiBub2RlIHZhbHVlcywgYW5kIGlzIHBsYXRmb3JtCi0gKiBkZXBlbmRlbnQuICBJZiBvbmx5IHdlIGNvdWxkIGNhbGwgT0JQIHdpdGgKLSAqICJzYnVzLWludHI+Y3B1IChzYmludCAtLSBpbm8pIiBmcm9tIGtlcm5lbC4uLgotICogU2VlIC4uLi9kcml2ZXJzL3NidXMvc2J1cy5jIGZvciBkZXRhaWxzLgotICovCi1CVEZJWFVQREVGX0NBTEwodW5zaWduZWQgaW50LCBzYmludF90b19pcnEsIHN0cnVjdCBzYnVzX2RldiAqc2RldiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBzYmludF90b19pcnEoc2Rldiwgc2JpbnQpIEJURklYVVBfQ0FMTChzYmludF90b19pcnEpKHNkZXYsIHNiaW50KQotCi1leHRlcm4gdm9pZCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3Qgc2J1c19idXMgKik7Ci1leHRlcm4gdm9pZCBzYnVzX3NldHVwX2lvbW11KHN0cnVjdCBzYnVzX2J1cyAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7Ci1leHRlcm4gdm9pZCBzYnVzX3NldHVwX2FyY2hfcHJvcHMoc3RydWN0IHNidXNfYnVzICosIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKLWV4dGVybiBpbnQgc2J1c19hcmNoX3ByZWluaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzYnVzX2FyY2hfcG9zdGluaXQodm9pZCk7Ci0KLSNlbmRpZiAvKiAhKF9TUEFSQ19TQlVTX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NidXNfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1c182NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA2YzE0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2J1c182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qIHNidXMuaDogRGVmaW5lcyBmb3IgdGhlIFN1biBTQnVzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCi0gKi8KLQotI2lmbmRlZiBfU1BBUkM2NF9TQlVTX0gKLSNkZWZpbmUgX1NQQVJDNjRfU0JVU19ICi0KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KLSNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KLQotLyogV2Ugc2NhbiB3aGljaCBkZXZpY2VzIGFyZSBvbiB0aGUgU0J1cyB1c2luZyB0aGUgUFJPTSBub2RlIGRldmljZQotICogdHJlZS4gIFNCdXMgZGV2aWNlcyBhcmUgZGVzY3JpYmVkIGluIHR3byBkaWZmZXJlbnQgd2F5cy4gIFlvdSBjYW4KLSAqIGVpdGhlciBnZXQgYW4gYWJzb2x1dGUgYWRkcmVzcyBhdCB3aGljaCB0byBhY2Nlc3MgdGhlIGRldmljZSwgb3IKLSAqIHlvdSBjYW4gZ2V0IGEgU0J1cyAnc2xvdCcgbnVtYmVyIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRoYXQgc2xvdC4KLSAqLwotCi0vKiBUaGUgYmFzZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNhbGN1bGF0ZSBkZXZpY2UgT0JJTyBhZGRyZXNzZXMuICovCi0jZGVmaW5lIFNVTl9TQlVTX0JWQUREUiAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTQlVTX09GRl9NQVNLICAgICAgICAgIDB4MGZmZmZmZmYKLQotLyogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgdG8gY2FsY3VsYXRlIGRldmljZSBhZGRyZXNzIGZyb20gc2xvdAotICogbnVtYmVycyArIG9mZnNldHMsIGFuZCB2aWNlIHZlcnNhLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYnVzX2RldmFkZHIoaW50IHNsb3RudW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIChTVU5fU0JVU19CVkFERFIrKChzbG90bnVtKTw8MjgpKyhvZmZzZXQpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2J1c19kZXZfc2xvdCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKQotewotICByZXR1cm4gKGludCkgKCgoZGV2X2FkZHIpLVNVTl9TQlVTX0JWQUREUik+PjI4KTsKLX0KLQotc3RydWN0IHNidXNfYnVzOwotCi0vKiBMaW51eCBTQlVTIGRldmljZSB0YWJsZXMgKi8KLXN0cnVjdCBzYnVzX2RldiB7Ci0Jc3RydWN0IG9mX2RldmljZQlvZmRldjsKLQlzdHJ1Y3Qgc2J1c19idXMJCSpidXM7Ci0Jc3RydWN0IHNidXNfZGV2CQkqbmV4dDsKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpjaGlsZDsKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpwYXJlbnQ7Ci0JaW50IHByb21fbm9kZTsKLQljaGFyIHByb21fbmFtZVs2NF07Ci0JaW50IHNsb3Q7Ci0KLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzb3VyY2VbUFJPTVJFR19NQVhdOwotCi0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHJlZ19hZGRyc1tQUk9NUkVHX01BWF07Ci0JaW50IG51bV9yZWdpc3RlcnM7Ci0KLQlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgZGV2aWNlX3Jhbmdlc1tQUk9NUkVHX01BWF07Ci0JaW50IG51bV9kZXZpY2VfcmFuZ2VzOwotCi0JdW5zaWduZWQgaW50IGlycXNbNF07Ci0JaW50IG51bV9pcnFzOwotfTsKLSNkZWZpbmUgdG9fc2J1c19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzYnVzX2Rldiwgb2ZkZXYuZGV2KQotCi0vKiBUaGlzIHN0cnVjdCBkZXNjcmliZXMgdGhlIFNCdXMocykgZm91bmQgb24gdGhpcyBtYWNoaW5lLiAqLwotc3RydWN0IHNidXNfYnVzIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlCW9mZGV2OwotCXN0cnVjdCBzYnVzX2RldgkJKmRldmljZXM7CS8qIFRyZWUgb2YgU0JVUyBkZXZpY2VzCSovCi0Jc3RydWN0IHNidXNfYnVzCQkqbmV4dDsJCS8qIE5leHQgU0JVUyBpbiBzeXN0ZW0JKi8KLQlpbnQJCQlwcm9tX25vZGU7ICAgICAgLyogT0JQIG5vZGUgb2YgU0JVUwkqLwotCWNoYXIJCQlwcm9tX25hbWVbNjRdOwkvKiBVc3VhbGx5ICJzYnVzIiBvciAic2JpIiAqLwotCWludAkJCWNsb2NrX2ZyZXE7Ci0KLQlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgc2J1c19yYW5nZXNbUFJPTVJFR19NQVhdOwotCWludCBudW1fc2J1c19yYW5nZXM7Ci0KLQlpbnQgcG9ydGlkOwotfTsKLSNkZWZpbmUgdG9fc2J1cyhkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHNidXNfYnVzLCBvZmRldi5kZXYpCi0KLWV4dGVybiBzdHJ1Y3Qgc2J1c19idXMgKnNidXNfcm9vdDsKLQotLyogRGV2aWNlIHByb2Jpbmcgcm91dGluZXMgY291bGQgZmluZCB0aGVzZSBoYW5keSAqLwotI2RlZmluZSBmb3JfZWFjaF9zYnVzKGJ1cykgXAotICAgICAgICBmb3IoKGJ1cykgPSBzYnVzX3Jvb3Q7IChidXMpOyAoYnVzKT0oYnVzKS0+bmV4dCkKLQotI2RlZmluZSBmb3JfZWFjaF9zYnVzZGV2KGRldmljZSwgYnVzKSBcCi0gICAgICAgIGZvcigoZGV2aWNlKSA9IChidXMpLT5kZXZpY2VzOyAoZGV2aWNlKTsgKGRldmljZSk9KGRldmljZSktPm5leHQpCi0KLSNkZWZpbmUgZm9yX2FsbF9zYnVzZGV2KGRldmljZSwgYnVzKSBcCi0JZm9yICgoYnVzKSA9IHNidXNfcm9vdDsgKGJ1cyk7IChidXMpID0gKGJ1cyktPm5leHQpIFwKLQkJZm9yICgoZGV2aWNlKSA9IChidXMpLT5kZXZpY2VzOyAoZGV2aWNlKTsgKGRldmljZSkgPSAoZGV2aWNlKS0+bmV4dCkKLQotLyogRHJpdmVyIERWTUEgaW50ZXJmYWNlcy4gKi8KLSNkZWZpbmUgc2J1c19jYW5fZG1hXzY0Yml0KHNkZXYpCSgxKQotI2RlZmluZSBzYnVzX2Nhbl9idXJzdDY0KHNkZXYpCQkoMSkKLWV4dGVybiB2b2lkIHNidXNfc2V0X3NidXM2NChzdHJ1Y3Qgc2J1c19kZXYgKiwgaW50KTsKLWV4dGVybiB2b2lkIHNidXNfZmlsbF9kZXZpY2VfaXJxKHN0cnVjdCBzYnVzX2RldiAqKTsKLQotc3RhdGljIGlubGluZSB2b2lkICpzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHNidXNfZGV2ICpzZGV2ICwgc2l6ZV90IHNpemUsCi0JCQkJCSAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSkKLXsKLQlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KCZzZGV2LT5vZmRldi5kZXYsIHNpemUsCi0JCQkJICBkbWFfaGFuZGxlLCBHRlBfQVRPTUlDKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNidXNfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JcmV0dXJuIGRtYV9mcmVlX2NvaGVyZW50KCZzZGV2LT5vZmRldi5kZXYsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKLX0KLQotI2RlZmluZSBTQlVTX0RNQV9CSURJUkVDVElPTkFMCURNQV9CSURJUkVDVElPTkFMCi0jZGVmaW5lIFNCVVNfRE1BX1RPREVWSUNFCURNQV9UT19ERVZJQ0UKLSNkZWZpbmUgU0JVU19ETUFfRlJPTURFVklDRQlETUFfRlJPTV9ERVZJQ0UKLSNkZWZpbmUJU0JVU19ETUFfTk9ORQkJRE1BX05PTkUKLQotLyogQWxsIHRoZSByZXN0IHVzZSBzdHJlYW1pbmcgbW9kZSBtYXBwaW5ncy4gKi8KLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBzYnVzX21hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCB2b2lkICpwdHIsCi0JCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKLXsKLQlyZXR1cm4gZG1hX21hcF9zaW5nbGUoJnNkZXYtPm9mZGV2LmRldiwgcHRyLCBzaXplLAotCQkJICAgICAgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2J1c191bm1hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LAotCQkJCSAgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCi0JCQkJICAgICBpbnQgZGlyZWN0aW9uKQotewotCWRtYV91bm1hcF9zaW5nbGUoJnNkZXYtPm9mZGV2LmRldiwgZG1hX2FkZHIsIHNpemUsCi0JCQkgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzYnVzX21hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgICAgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIGRtYV9tYXBfc2coJnNkZXYtPm9mZGV2LmRldiwgc2csIG5lbnRzLAotCQkJICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX3VubWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQotewotCWRtYV91bm1hcF9zZygmc2Rldi0+b2ZkZXYuZGV2LCBzZywgbmVudHMsCi0JCSAgICAgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOwotfQotCi0vKiBGaW5hbGx5LCBhbGxvdyBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gb2Ygc3RyZWFtYWJsZSBtYXBwaW5ncy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBzYnVzX2RldiAqc2RldiwKLQkJCQkJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZzZGV2LT5vZmRldi5kZXYsIGRtYV9oYW5kbGUsIHNpemUsCi0JCQkJKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOwotfQotI2RlZmluZSBzYnVzX2RtYV9zeW5jX3NpbmdsZSBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqc2RldiwKLQkJCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCS8qIE5vIGZsdXNoaW5nIG5lZWRlZCB0byBzeW5jIGNwdSB3cml0ZXMgdG8gdGhlIGRldmljZS4gICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICpzZGV2LAotCQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkJICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbikKLXsKLQlkbWFfc3luY19zZ19mb3JfY3B1KCZzZGV2LT5vZmRldi5kZXYsIHNnLCBuZW50cywKLQkJCSAgICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7Ci19Ci0jZGVmaW5lIHNidXNfZG1hX3N5bmNfc2cgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICpzZGV2LAotCQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkJICAgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbikKLXsKLQkvKiBObyBmbHVzaGluZyBuZWVkZWQgdG8gc3luYyBjcHUgd3JpdGVzIHRvIHRoZSBkZXZpY2UuICAqLwotfQotCi1leHRlcm4gdm9pZCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3Qgc2J1c19idXMgKik7Ci1leHRlcm4gdm9pZCBzYnVzX3NldHVwX2lvbW11KHN0cnVjdCBzYnVzX2J1cyAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7Ci1leHRlcm4gdm9pZCBzYnVzX3NldHVwX2FyY2hfcHJvcHMoc3RydWN0IHNidXNfYnVzICosIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKLWV4dGVybiBpbnQgc2J1c19hcmNoX3ByZWluaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzYnVzX2FyY2hfcG9zdGluaXQodm9pZCk7Ci0KLSNlbmRpZiAvKiAhKF9TUEFSQzY0X1NCVVNfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2VyaWFsLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MGQ2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NlcmlhbC5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX1NQQVJDX1NFUklBTF9ICisjZGVmaW5lIF9fU1BBUkNfU0VSSUFMX0gKKworI2RlZmluZSBCQVNFX0JBVUQgKCAxODQzMjAwIC8gMTYgKQorCisjZW5kaWYgLyogX19TUEFSQ19TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGlubG9ja18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGlubG9ja18zMi5oCmluZGV4IGRlMjI0OWIuLmJmMmQ1MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpbmxvY2tfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NwaW5sb2NrXzMyLmgKQEAgLTYsOCArNiw2IEBACiAjaWZuZGVmIF9fU1BBUkNfU1BJTkxPQ0tfSAogI2RlZmluZSBfX1NQQVJDX1NQSU5MT0NLX0gKIAotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4JLyogRm9yIE5SX0NQVVMgKi8KLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGFzbS9wc3IuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpbmxvY2tfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3BpbmxvY2tfNjQuaAppbmRleCAwMDA2ZmU5Li4xMjBjZmU0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NwaW5sb2NrXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zcGlubG9ja182NC5oCkBAIC02LDggKzYsNiBAQAogI2lmbmRlZiBfX1NQQVJDNjRfU1BJTkxPQ0tfSAogI2RlZmluZSBfX1NQQVJDNjRfU1BJTkxPQ0tfSAogCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgkvKiBGb3IgTlJfQ1BVUyAqLwotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKiBUbyBnZXQgZGVidWdnaW5nIHNwaW5sb2NrcyB3aGljaCBkZXRlY3QgYW5kIGNhdGNoCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NzdGF0ZS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zc3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjMzVkYi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NzdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9TU1RBVEVfSAotI2RlZmluZSBfU1BBUkM2NF9TU1RBVEVfSAotCi1leHRlcm4gdm9pZCBzc3RhdGVfYm9vdGluZyh2b2lkKTsKLWV4dGVybiB2b2lkIHNzdGF0ZV9ydW5uaW5nKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3N0YXRlX2hhbHQodm9pZCk7Ci1leHRlcm4gdm9pZCBzc3RhdGVfcG93ZXJvZmYodm9pZCk7Ci1leHRlcm4gdm9pZCBzc3RhdGVfcGFuaWModm9pZCk7Ci1leHRlcm4gdm9pZCBzc3RhdGVfcmVib290KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzdW40dl9zc3RhdGVfaW5pdCh2b2lkKTsKLQotI2VuZGlmIC8qIF9TUEFSQzY0X1NTVEFURV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXJmaXJlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXJmaXJlLmgKaW5kZXggMDdiYWZkMy4uZDU2Y2U2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhcmZpcmUuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXJmaXJlLmgKQEAgLTEyLDcgKzEyLDYgQEAKIGV4dGVybiBpbnQgdGhpc19pc19zdGFyZmlyZTsKIAogZXh0ZXJuIHZvaWQgY2hlY2tfaWZfc3RhcmZpcmUodm9pZCk7Ci1leHRlcm4gdm9pZCBzdGFyZmlyZV9jcHVfc2V0dXAodm9pZCk7CiBleHRlcm4gaW50IHN0YXJmaXJlX2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKIGV4dGVybiB2b2lkIHN0YXJmaXJlX2hvb2t1cChpbnQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzdGFyZmlyZV90cmFuc2xhdGUodW5zaWduZWQgbG9uZyBpbWFwLCB1bnNpZ25lZCBpbnQgdXBhaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0ZnMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdGZzLmgKaW5kZXggNWU5MzdhNy4uNTVlNjA3YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0ZnMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRmcy5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfX19BU01fU1BBUkNfU1RBVEZTX0gKICNkZWZpbmUgX19fQVNNX1NQQVJDX1NUQVRGU19ICi0jaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vc3RhdGZzXzY0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9zdGF0ZnNfMzIuaD4KLSNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3RhdGZzLmg+CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0ZnNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdGZzXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDUyMGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0ZnNfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkNfU1RBVEZTX0gKLSNkZWZpbmUgX1NQQVJDX1NUQVRGU19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zdGF0ZnMuaD4KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRmc182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0ZnNfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliM2M4OS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRmc182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9TVEFURlNfSAotI2RlZmluZSBfU1BBUkM2NF9TVEFURlNfSAotCi0jaWZuZGVmIF9fS0VSTkVMX1NUUklDVF9OQU1FUwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotdHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QJZnNpZF90OwotCi0jZW5kaWYKLQotc3RydWN0IHN0YXRmcyB7Ci0JbG9uZyBmX3R5cGU7Ci0JbG9uZyBmX2JzaXplOwotCWxvbmcgZl9ibG9ja3M7Ci0JbG9uZyBmX2JmcmVlOwotCWxvbmcgZl9iYXZhaWw7Ci0JbG9uZyBmX2ZpbGVzOwotCWxvbmcgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCWxvbmcgZl9uYW1lbGVuOwotCWxvbmcgZl9mcnNpemU7Ci0JbG9uZyBmX3NwYXJlWzVdOwotfTsKLQotc3RydWN0IHN0YXRmczY0IHsKLQlsb25nIGZfdHlwZTsKLQlsb25nIGZfYnNpemU7Ci0JbG9uZyBmX2Jsb2NrczsKLQlsb25nIGZfYmZyZWU7Ci0JbG9uZyBmX2JhdmFpbDsKLQlsb25nIGZfZmlsZXM7Ci0JbG9uZyBmX2ZmcmVlOwotCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7Ci0JbG9uZyBmX25hbWVsZW47Ci0JbG9uZyBmX2Zyc2l6ZTsKLQlsb25nIGZfc3BhcmVbNV07Ci19OwotCi1zdHJ1Y3QgY29tcGF0X3N0YXRmczY0IHsKLQlfX3UzMiBmX3R5cGU7Ci0JX191MzIgZl9ic2l6ZTsKLQlfX3U2NCBmX2Jsb2NrczsKLQlfX3U2NCBmX2JmcmVlOwotCV9fdTY0IGZfYmF2YWlsOwotCV9fdTY0IGZfZmlsZXM7Ci0JX191NjQgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCV9fdTMyIGZfbmFtZWxlbjsKLQlfX3UzMiBmX2Zyc2l6ZTsKLQlfX3UzMiBmX3NwYXJlWzVdOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N1bjRwYWRkci5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdW40cGFkZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyOTg1Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N1bjRwYWRkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIHN1bjRwYWRkci5oOiAgVmFyaW91cyBwaHlzaWNhbCBhZGRyZXNzZXMgb24gc3VuNCBtYWNoaW5lcwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyBBbnRvbiBCbGFuY2hhcmQgKGFudG9uQHByb2dzb2MudXRzLmVkdS5hdSkKLSAqIENvcHlyaWdodCAoQykgMTk5OCBDaHJpcyBEYXZpcyAoY2RhdmlzQGNvaXMub24uY2EpCi0gKiAKLSAqIE5vdyBzdXBwb3J0cyBtb3JlIHN1bjQncwotICovCi0KLSNpZm5kZWYgX1NQQVJDX1NVTjRQQUREUl9ICi0jZGVmaW5lIF9TUEFSQ19TVU40UEFERFJfSAotCi0jZGVmaW5lIFNVTjRfSUVfUEhZU0FERFIJCTB4ZjUwMDAwMDAKLSNkZWZpbmUgU1VONF9VTlVTRURfUEhZU0FERFIJCTAKLQotLyogdGhlc2Ugd29yayBmb3IgbWUgKi8KLSNkZWZpbmUgU1VONF8yMDBfTUVNUkVHX1BIWVNBRERSCTB4ZjQwMDAwMDAKLSNkZWZpbmUgU1VONF8yMDBfQ0xPQ0tfUEhZU0FERFIJCTB4ZjMwMDAwMDAKLSNkZWZpbmUgU1VONF8yMDBfQldUV09fUEhZU0FERFIJCTB4ZmQwMDAwMDAKLSNkZWZpbmUgU1VONF8yMDBfRVRIX1BIWVNBRERSCQkweGY2MDAwMDAwCi0jZGVmaW5lIFNVTjRfMjAwX1NJX1BIWVNBRERSCQkweGZmMjAwMDAwCi0KLS8qIHRoZXNlIHdlcmUgaGVyZSBiZWZvcmUgKi8KLSNkZWZpbmUgU1VONF8zMDBfTUVNUkVHX1BIWVNBRERSCTB4ZjQwMDAwMDAKLSNkZWZpbmUgU1VONF8zMDBfQ0xPQ0tfUEhZU0FERFIJCTB4ZjIwMDAwMDAKLSNkZWZpbmUgU1VONF8zMDBfVElNRVJfUEhZU0FERFIJCTB4ZWYwMDAwMDAKLSNkZWZpbmUgU1VONF8zMDBfRVRIX1BIWVNBRERSCQkweGY5MDAwMDAwCi0jZGVmaW5lIFNVTjRfMzAwX0JXVFdPX1BIWVNBRERSCQkweGZiNDAwMDAwCi0jZGVmaW5lIFNVTjRfMzAwX0RNQV9QSFlTQUREUgkJMHhmYTAwMTAwMAotI2RlZmluZSBTVU40XzMwMF9FU1BfUEhZU0FERFIJCTB4ZmEwMDAwMDAKLQotLyogQXJlIHRoZXNlIHJpZ2h0PyAqLwotI2RlZmluZSBTVU40XzQwMF9NRU1SRUdfUEhZU0FERFIJMHhmNDAwMDAwMAotI2RlZmluZSBTVU40XzQwMF9DTE9DS19QSFlTQUREUgkJMHhmMjAwMDAwMAotI2RlZmluZSBTVU40XzQwMF9USU1FUl9QSFlTQUREUgkJMHhlZjAwMDAwMAotI2RlZmluZSBTVU40XzQwMF9FVEhfUEhZU0FERFIJCTB4ZjkwMDAwMDAKLSNkZWZpbmUgU1VONF80MDBfQldUV09fUEhZU0FERFIJCTB4ZmI0MDAwMDAKLSNkZWZpbmUgU1VONF80MDBfRE1BX1BIWVNBRERSCQkweGZhMDAxMDAwCi0jZGVmaW5lIFNVTjRfNDAwX0VTUF9QSFlTQUREUgkJMHhmYTAwMDAwMAotCi0vKiAKLQl0aGVzZSBhcmUgdGhlIGFjdHVhbCB2YWx1ZXMgc2V0IGFuZCB1c2VkIGluIHRoZSBjb2RlLiBVbnVzZWQgaXRlbXMgc2V0IAotCXRvIFNVTl9VTlVTRURfUEhZU0FERFIgCi0gKi8KLQotZXh0ZXJuIGludCBzdW40X21lbXJlZ19waHlzYWRkcjsgLyogbWVtb3J5IHJlZ2lzdGVyIChlY2M/KSAqLwotZXh0ZXJuIGludCBzdW40X2Nsb2NrX3BoeXNhZGRyOyAgLyogc3lzdGVtIGNsb2NrICovCi1leHRlcm4gaW50IHN1bjRfdGltZXJfcGh5c2FkZHI7ICAvKiB0aW1lciwgd2hlcmUgYXBwbGljYWJsZSAqLwotZXh0ZXJuIGludCBzdW40X2V0aF9waHlzYWRkcjsgICAgLyogb25ib2FyZCBldGhlcm5ldCAoaWUvbGUpICovCi1leHRlcm4gaW50IHN1bjRfc2lfcGh5c2FkZHI7ICAgICAvKiBzdW4zIHNjc2kgYWRhcHRlciAqLwotZXh0ZXJuIGludCBzdW40X2J3dHdvX3BoeXNhZGRyOyAgLyogb25ib2FyZCBidzIgKi8KLWV4dGVybiBpbnQgc3VuNF9kbWFfcGh5c2FkZHI7ICAgIC8qIHNjc2kgZG1hICovCi1leHRlcm4gaW50IHN1bjRfZXNwX3BoeXNhZGRyOyAgICAvKiBlc3Agc2NzaSAqLwotZXh0ZXJuIGludCBzdW40X2llX3BoeXNhZGRyOyAgICAgLyogaW50ZXJydXB0IGVuYWJsZSAqLwotCi0jZW5kaWYgLyogIShfU1BBUkNfU1VONFBBRERSX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N1bjRwcm9tLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N1bjRwcm9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGI0Y2IuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdW40cHJvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIHN1bjRwcm9tLmggLS0gaW50ZXJmYWNlIHRvIHN1bjQgUFJPTSBtb25pdG9yLiAgV2UgZG9uJ3QgdXNlIG1vc3Qgb2YgdGhpcywKLSAqICAgICAgICAgICAgICAgc28gbW9zdCBvZiB0aGVzZSBhcmUganVzdCBwbGFjZWhvbGRlcnMuCi0gKi8KLQotI2lmbmRlZiBfU1VONFBST01fSF8KLSNkZWZpbmUgX1NVTjRQUk9NX0hfCi0KLS8qCi0gKiBBbHRob3VnaCB0aGlzIGxvb2tzIHNpbWlsYXIgdG8gYW4gcm9tdmVjIGZvciBhIE9wZW5Qcm9tIG1hY2hpbmUsIGl0IGlzIAotICogYWN0dWFsbHkgY2xvc2VyIHRvIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFN1bjIgYW5kIFN1bjMuCi0gKgotICogVjIgZW50cmllcyBleGlzdCBvbmx5IGluIHZlcnNpb24gMiBQUk9NcyBhbmQgbGF0ZXIsIFYzIGluIHZlcnNpb24gMyBhbmQgbGF0ZXIuCi0gKiAKLSAqIE1hbnkgb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgYXJlIGd1ZXNzZXMuICBTb21lIGFyZSBjZXJ0YWlubHkgd3JvbmcuCi0gKiBVc2Ugd2l0aCBjYXJlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyCQkqaW5pdFNQOwkJLyogSW5pdGlhbCBzeXN0ZW0gc3RhY2sgcHRyICovCi0Jdm9pZAkJKCpzdGFydG1vbikodm9pZCk7CS8qIEluaXRpYWwgUEMgZm9yIGhhcmR3YXJlICovCi0JaW50CQkqZGlhZ2JlcnI7CQkvKiBCdXMgZXJyIGhhbmRsZXIgZm9yIGRpYWdzICovCi0Jc3RydWN0IGxpbnV4X2FyZ3VtZW50c192MCAqKmJvb3RQYXJhbTsgLyogSW5mbyBmb3IgYm9vdHN0cmFwcGVkIHBnbSAqLwotIAl1bnNpZ25lZCBpbnQJKm1lbW9yeXNpemU7CQkvKiBVc2FibGUgbWVtb3J5IGluIGJ5dGVzICovCi0JdW5zaWduZWQgY2hhcgkoKmdldGNoYXIpKHZvaWQpOwkvKiBHZXQgY2hhciBmcm9tIGlucHV0IGRldmljZSAqLyAKLQl2b2lkCQkoKnB1dGNoYXIpKGNoYXIpOwkvKiBQdXQgY2hhciB0byBvdXRwdXQgZGV2aWNlICovCi0JaW50CQkoKm1heWdldCkodm9pZCk7CS8qIE1heWJlIGdldCBjaGFyLCBvciAtMSAqLwotCWludAkJKCptYXlwdXQpKGludCk7CQkvKiBNYXliZSBwdXQgY2hhciwgb3IgLTEgKi8KLQl1bnNpZ25lZCBjaGFyCSplY2hvOwkJCS8qIFNob3VsZCBnZXRjaGFyIGVjaG8/ICovCi0JdW5zaWduZWQgY2hhcgkqaW5zb3VyY2U7CQkvKiBJbnB1dCBzb3VyY2Ugc2VsZWN0b3IgKi8KLQl1bnNpZ25lZCBjaGFyCSpvdXRzaW5rOwkJLyogT3V0cHV0IHNpbmsgc2VsZWN0b3IgKi8KLQlpbnQJCSgqZ2V0a2V5KSh2b2lkKTsJLyogR2V0IG5leHQga2V5IGlmIG9uZSBleGlzdHMgKi8KLQl2b2lkCQkoKmluaXRnZXRrZXkpKHZvaWQpOwkvKiBJbml0aWFsaXplIGdldCBrZXkgKi8KLQl1bnNpZ25lZCBpbnQJKnRyYW5zbGF0aW9uOwkJLyogS2JkIHRyYW5zbGF0aW9uIHNlbGVjdG9yICovCi0JdW5zaWduZWQgY2hhcgkqa2V5YmlkOwkJLyogS2V5Ym9hcmQgSUQgYnl0ZSAqLwotCWludAkJKnNjcmVlbl94OwkJLyogVjI6IFNjcmVlbiB4IHBvcyAoci9vKSAqLwotCWludAkJKnNjcmVlbl95OwkJLyogVjI6IFNjcmVlbiB5IHBvcyAoci9vKSAqLwotCXN0cnVjdCBrZXlidWYJKmtleWJ1ZjsJCS8qIFVwL2Rvd24ga2V5Y29kZSBidWZmZXIgKi8KLQljaGFyCQkqbW9uaWQ7CQkJLyogTW9uaXRvciB2ZXJzaW9uIElEICovCi0Jdm9pZAkJKCpmYndyaXRlY2hhcikoY2hhcik7CS8qIFdyaXRlIGEgY2hhcmFjdGVyIHRvIEZCICovCi0JaW50CQkqZmJBZGRyOwkJLyogQWRkcmVzcyBvZiBmcmFtZSBidWZmZXIgKi8KLQljaGFyCQkqKmZvbnQ7CQkJLyogRm9udCB0YWJsZSBmb3IgRkIgKi8KLQl2b2lkCQkoKmZid3JpdGVzdHIpKGNoYXIgKik7CS8qIFdyaXRlIHN0cmluZyB0byBGQiAqLwotCXZvaWQJCSgqcmVib290KShjaGFyICopOwkvKiBlLmcuIHJlYm9vdCgic2QoKXZtbGludXgiKSAqLwotCXVuc2lnbmVkIGNoYXIJKmxpbmVidWY7CQkvKiBUaGUgbGluZSBpbnB1dCBidWZmZXIgKi8KLQl1bnNpZ25lZCBjaGFyCSoqbGluZXB0cjsJCS8qIEN1ciBwb2ludGVyIGludG8gbGluZWJ1ZiAqLwotCWludAkJKmxpbmVzaXplOwkJLyogbGVuZ3RoIG9mIGxpbmUgaW4gbGluZWJ1ZiAqLwotCXZvaWQJCSgqZ2V0bGluZSkoY2hhciAqKTsJLyogR2V0IGxpbmUgZnJvbSB1c2VyICovCi0JdW5zaWduZWQgY2hhcgkoKmdldG5leHRjaGFyKSh2b2lkKTsJLyogR2V0IG5leHQgY2hhciBmcm9tIGxpbmVidWYgKi8KLQl1bnNpZ25lZCBjaGFyCSgqcGVla25leHRjaGFyKSh2b2lkKTsJLyogUGVlayBhdCBuZXh0IGNoYXIgKi8KLQlpbnQJCSpmYnRoZXJlOwkJLyogPTEgaWYgZnJhbWUgYnVmZmVyIHRoZXJlICovCi0JaW50CQkoKmdldG51bSkodm9pZCk7CS8qIEdyYWIgaGV4IG51bSBmcm9tIGxpbmUgKi8KLQlpbnQJCSgqcHJpbnRmKShjaGFyICosIC4uLik7CS8qIFNlZSBwcm9tX3ByaW50ZigpIGluc3RlYWQgKi8gCi0Jdm9pZAkJKCpwcmludGhleCkoaW50KTsJLyogRm9ybWF0IE4gZGlnaXRzIGluIGhleCAqLwotCXVuc2lnbmVkIGNoYXIJKmxlZHM7CQkJLyogUkFNIGNvcHkgb2YgTEVEIHJlZ2lzdGVyICovCi0Jdm9pZAkJKCpzZXRMRURzKSh1bnNpZ25lZCBjaGFyICopOwkvKiBTZXRzIExFRCdzIGFuZCBSQU0gY29weSAqLwotCXZvaWQJCSgqTk1JYWRkcikodm9pZCAqKTsJLyogQWRkciBmb3IgbGV2ZWwgNyB2ZWN0b3IgKi8KLQl2b2lkCQkoKmFib3J0ZW50cnkpKHZvaWQpOwkvKiBFbnRyeSBmb3Iga2V5Ym9hcmQgYWJvcnQgKi8KLQlpbnQJCSpubWljbG9jazsJCS8qIENvdW50cyB1cCBpbiBtc2VjICovCi0JaW50CQkqRkJ0eXBlOwkJLyogRnJhbWUgYnVmZmVyIHR5cGUgKi8KLSAJdW5zaWduZWQgaW50CXJvbXZlY3ZlcnNpb247CQkvKiBWZXJzaW9uIG51bWJlciBmb3IgdGhpcyByb212ZWMgKi8KLQlzdHJ1Y3QgZ2xvYnJhbSAgKmdsb2JyYW07CQkvKiBtb25pdG9yIGdsb2JhbCB2YXJpYWJsZXMgPz8/ICovCi0Jdm9pZCAqCQlrYmRhZGRyOwkJLyogQWRkciBvZiBrZXlib2FyZCBpbiB1c2UgKi8KLQlpbnQJCSprZXlyaW5pdDsJCS8qIG1zIGJlZm9yZSBrYmQgcmVwZWF0ICovCi0JdW5zaWduZWQgY2hhcgkqa2V5cnRpY2s7IAkJLyogbXMgYmV0d2VlbiByZXBldGl0aW9ucyAqLwotCXVuc2lnbmVkIGludAkqbWVtb3J5YXZhaWw7CQkvKiBWMTogTWFpbiBtZW0gdXNhYmxlIHNpemUgKi8KLQlsb25nCQkqcmVzZXRhZGRyOwkJLyogd2hlcmUgdG8ganVtcCBvbiBhIHJlc2V0ICovCi0JbG9uZwkJKnJlc2V0bWFwOwkJLyogcGdtYXAgZW50cnkgZm9yIHJlc2V0YWRkciAqLwotCXZvaWQJCSgqZXhpdHRvbW9uKSh2b2lkKTsJLyogRXhpdCBmcm9tIHVzZXIgcHJvZ3JhbSAqLwotCXVuc2lnbmVkIGNoYXIJKiptZW1vcnliaXRtYXA7CQkvKiBWMTogJnswIG9yICZiaXRzfSAqLwotCXZvaWQJCSgqc2V0Y3hzZWdtYXApKGludCBjdHh0LCBjaGFyICp2YSwgaW50IHBtZWcpOwkvKiBTZXQgc2VnIGluIGFueSBjb250ZXh0ICovCi0Jdm9pZAkJKCoqdmVjdG9yX2NtZCkodm9pZCAqKTsJLyogVjI6IEhhbmRsZXIgZm9yICd2JyBjbWQgKi8KLQl1bnNpZ25lZCBsb25nCSpleHBlY3RlZHRyYXBzaWc7CS8qIFYzOiBMb2NhdGlvbiBvZiB0aGUgZXhwZWN0ZWQgdHJhcCBzaWduYWwgKi8KLQl1bnNpZ25lZCBsb25nCSp0cmFwdmVjdG9yYmFzZXRhYmxlOwkvKiBWMzogQWRkcmVzcyBvZiB0aGUgdHJhcCB2ZWN0b3IgdGFibGUgKi8KLQlpbnQJCXVudXNlZDE7Ci0JaW50CQl1bnVzZWQyOwotCWludAkJdW51c2VkMzsKLQlpbnQJCXVudXNlZDQ7Ci19IGxpbnV4X3N1bjRfcm9tdmVjOwotCi1leHRlcm4gbGludXhfc3VuNF9yb212ZWMgKnN1bjRfcm9tdmVjOwotCi0jZW5kaWYgLyogX1NVTjRQUk9NX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaAppbmRleCBiNGIwMjQ0Li44NjIzZmM0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKQEAgLTM0LDEzICszNCw3IEBACiAKIGV4dGVybiBlbnVtIHNwYXJjX2NwdSBzcGFyY19jcHVfbW9kZWw7CiAKLSNpZm5kZWYgQ09ORklHX1NVTjQKLSNkZWZpbmUgQVJDSF9TVU40Q19TVU40IChzcGFyY19jcHVfbW9kZWw9PXN1bjRjKQotI2RlZmluZSBBUkNIX1NVTjQgMAotI2Vsc2UKLSNkZWZpbmUgQVJDSF9TVU40Q19TVU40IDEKLSNkZWZpbmUgQVJDSF9TVU40IDEKLSNlbmRpZgorI2RlZmluZSBBUkNIX1NVTjRDIChzcGFyY19jcHVfbW9kZWw9PXN1bjRjKQogCiAjZGVmaW5lIFNVTjRNX05DUFVTICAgICAgICAgICAgNCAgICAgICAgICAgICAgLyogQXJjaGl0ZWN0dXJhbCBsaW1pdCBvZiBzdW40bS4gKi8KIApAQCAtNTUsNiArNDksNyBAQAogZXh0ZXJuIHZvaWQgc3VuX2RvX2JyZWFrKHZvaWQpOwogZXh0ZXJuIGludCBzZXJpYWxfY29uc29sZTsKIGV4dGVybiBpbnQgc3RvcF9hX2VuYWJsZWQ7CitleHRlcm4gaW50IHNjb25zX3B3cm9mZjsKIAogc3RhdGljIGlubGluZSBpbnQgY29uX2lzX3ByZXNlbnQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N5c3RlbV82NC5oCmluZGV4IGRiOWU3NDIuLjg3NTlmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3lzdGVtXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zeXN0ZW1fNjQuaApAQCAtMjYsOSArMjYsOCBAQAogCiAjZGVmaW5lIHNwYXJjX2NwdV9tb2RlbCBzdW40dQogCi0vKiBUaGlzIGNhbm5vdCBldmVyIGJlIGEgc3VuNGMgbm9yIHN1bjQgOikgVGhhdCdzIGp1c3QgaGlzdG9yeS4gKi8KLSNkZWZpbmUgQVJDSF9TVU40Q19TVU40IDAKLSNkZWZpbmUgQVJDSF9TVU40IDAKKy8qIFRoaXMgY2Fubm90IGV2ZXIgYmUgYSBzdW40YyA6KSBUaGF0J3MganVzdCBoaXN0b3J5LiAqLworI2RlZmluZSBBUkNIX1NVTjRDIDAKIAogZXh0ZXJuIGNoYXIgcmVib290X2NvbW1hbmRbXTsKIApAQCAtMTE4LDYgKzExNyw3IEBACiAKIGV4dGVybiB2b2lkIHN1bl9kb19icmVhayh2b2lkKTsKIGV4dGVybiBpbnQgc3RvcF9hX2VuYWJsZWQ7CitleHRlcm4gaW50IHNjb25zX3B3cm9mZjsKIAogZXh0ZXJuIHZvaWQgZmF1bHRfaW5fdXNlcl93aW5kb3dzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfdXNlcl9zdGFjayh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaAppbmRleCBjYmI4OTJkLi4yOTg5OWZkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb18zMi5oCkBAIC04MCwxMSArODAsNyBAQAogLyoKICAqIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uCiAgKi8KLSNpZiBQQUdFX1NISUZUID09IDEzCi0jZGVmaW5lIFRIUkVBRF9JTkZPX09SREVSICAwCi0jZWxzZSAvKiBQQUdFX1NISUZUICovCiAjZGVmaW5lIFRIUkVBRF9JTkZPX09SREVSICAxCi0jZW5kaWYKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9USFJFQURfSU5GT19BTExPQ0FUT1IKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl8zMi5oCmluZGV4IDM2MWU1MzguLjJlYzAzMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGltZXJfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RpbWVyXzMyLmgKQEAgLTksOTYgKzksOSBAQAogI2RlZmluZSBfU1BBUkNfVElNRVJfSAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPiAgLyogRm9yIFNVTjRNX05DUFVTICovCi0jaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgogI2luY2x1ZGUgPGFzbS9idGZpeHVwLmg+CiAKLS8qIFRpbWVyIHN0cnVjdHVyZXMuIFRoZSBpbnRlcnJ1cHQgdGltZXIgaGFzIHR3byBwcm9wZXJ0aWVzIHdoaWNoCi0gKiBhcmUgdGhlIGNvdW50ZXIgKHdoaWNoIGlzIGhhbmRsZWQgaW4gZG9fdGltZXIgaW4gc2NoZWQuYykgYW5kIHRoZSBsaW1pdC4KLSAqIFRoaXMgbGltaXQgaXMgd2hlcmUgdGhlIHRpbWVyJ3MgY291bnRlciAnd3JhcHMnIGFyb3VuZC4gT2RkbHkgZW5vdWdoLAotICogdGhlIHN1bjRjIHRpbWVyIHdoZW4gaXQgaGl0cyB0aGUgbGltaXQgd3JhcHMgYmFjayB0byAxIGFuZCBub3QgemVybwotICogdGh1cyB3aGVuIGNhbGN1bGF0aW5nIHRoZSB2YWx1ZSBhdCB3aGljaCBpdCB3aWxsIGZpcmUgYSBtaWNyb3NlY29uZCB5b3UKLSAqIG11c3QgYWRqdXN0IGJ5IG9uZS4gIFRoYW5rcyBTVU4gZm9yIGRlc2lnbmluZyBzdWNoIGdyZWF0IGhhcmR3YXJlIDsoCi0gKi8KLQotLyogTm90ZSB0aGF0IEkgYW0gb25seSBnb2luZyB0byB1c2UgdGhlIHRpbWVyIHRoYXQgaW50ZXJydXB0cyBhdAotICogU3BhcmMgSVJRIDEwLiAgVGhlcmUgaXMgYW5vdGhlciBvbmUgYXZhaWxhYmxlIHRoYXQgY2FuIGZpcmUgYXQKLSAqIElSUSAxNC4gQ3VycmVudGx5IGl0IGlzIGxlZnQgdW50b3VjaGVkLCB3ZSBrZWVwIHRoZSBQUk9NJ3MgbGltaXQKLSAqIHJlZ2lzdGVyIHZhbHVlIGFuZCBsZXQgdGhlIHByb20gdGFrZSB0aGVzZSBpbnRlcnJ1cHRzLiAgVGhpcyBhbGxvd3MKLSAqIEwxLUEgdG8gd29yay4KLSAqLwotCi1zdHJ1Y3Qgc3VuNGNfdGltZXJfaW5mbyB7Ci0gIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgY3VyX2NvdW50MTA7Ci0gIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgdGltZXJfbGltaXQxMDsKLSAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBjdXJfY291bnQxNDsKLSAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCB0aW1lcl9saW1pdDE0OwotfTsKLQotI2RlZmluZSBTVU40Q19USU1FUl9QSFlTQUREUiAgIDB4ZjMwMDAwMDAKLSNpZmRlZiBDT05GSUdfU1VONAotI2RlZmluZSBTVU5fVElNRVJfUEhZU0FERFIgU1VONF8zMDBfVElNRVJfUEhZU0FERFIKLSNlbHNlCi0jZGVmaW5lIFNVTl9USU1FUl9QSFlTQUREUiBTVU40Q19USU1FUl9QSFlTQUREUgotI2VuZGlmCi0KLS8qIEEgc3VuNG0gaGFzIHR3byBibG9ja3Mgb2YgcmVnaXN0ZXJzIHdoaWNoIGFyZSBwcm9iYWJseSBvZiB0aGUgc2FtZQotICogc3RydWN0dXJlLiBMU0kgTG9naWMncyBMNjQ4NTEgaXMgdG9sZCB0byBfZGVjcmVtZW50XyBmcm9tIHRoZSBsaW1pdAotICogdmFsdWUuIEF1cm9yYSBiZWhhdmVzIHNpbWlsYXJseSBidXQgaXRzIGxpbWl0IHZhbHVlIGlzIGNvbXBhY3RlZCBpbgotICogb3RoZXIgZmFzaGlvbiAoaXQncyB3aWRlcikuIERvY3VtZW50ZWQgZmllbGRzIGFyZSBkZWZpbmVkIGhlcmUuCi0gKi8KLQotLyogQXMgd2l0aCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyLCB3ZSBoYXZlIHR3byBjbGFzc2VzIG9mIHRpbWVyIHJlZ2lzdGVycwotICogd2hpY2ggYXJlIHBlci1jcHUgYW5kIG1hc3Rlci4gIFBlci1jcHUgdGltZXJzIG9ubHkgaGl0IHRoYXQgY3B1IGFuZCBhcmUKLSAqIG9ubHkgbGV2ZWwgMTQgdGlja3MsIG1hc3RlciB0aW1lciBoaXRzIGFsbCBjcHVzIGFuZCBpcyBsZXZlbCAxMC4KLSAqLwotCi0jZGVmaW5lIFNVTjRNX1BSTV9DTlRfTCAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIFNVTjRNX1BSTV9DTlRfTFZBTFVFICAweDdGRkZGQzAwCi0KLXN0cnVjdCBzdW40bV90aW1lcl9wZXJjcHVfaW5mbyB7Ci0gIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbDE0X3RpbWVyX2xpbWl0OyAgICAvKiBJbml0aWFsIHZhbHVlIGlzIDB4MDA5YzQwMDAgKi8KLSAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBsMTRfY3VyX2NvdW50OwotCi0gIC8qIFRoaXMgcmVnaXN0ZXIgYXBwZWFycyB0byBiZSB3cml0ZSBvbmx5IGFuZC9vciBpbmFjY2Vzc2libGUKLSAgICogb24gVW5pLVByb2Nlc3NvciBzdW40bSBtYWNoaW5lcy4KLSAgICovCi0gIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgbDE0X2xpbWl0X25vY2xlYXI7ICAvKiBEYXRhIGFjY2VzcyBlcnJvciBpcyBoZXJlICovCi0KLSAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCBjbnRybDsgICAgICAgICAgICAvKiA9MSBhZnRlciBQT1NUIG9uIEF1cm9yYSAqLwotICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgY2hhciBzcGFjZVtQQUdFX1NJWkUgLSAxNl07Ci19OwotCi1zdHJ1Y3Qgc3VuNG1fdGltZXJfcmVncyB7Ci0Jc3RydWN0IHN1bjRtX3RpbWVyX3BlcmNwdV9pbmZvIGNwdV90aW1lcnNbU1VONE1fTkNQVVNdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsMTBfdGltZXJfbGltaXQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGwxMF9jdXJfY291bnQ7Ci0KLQkvKiBBZ2FpbiwgdGhpcyBhcHBlYXJzIHRvIGJlIHdyaXRlIG9ubHkgYW5kL29yIGluYWNjZXNzaWJsZQotCSAqIG9uIHVuaS1wcm9jZXNzb3Igc3VuNG0gbWFjaGluZXMuCi0JICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGwxMF9saW1pdF9ub2NsZWFyOwotCi0JLyogVGhpcyByZWdpc3RlciB0b28sIGl0IG11c3QgYmUgbWFnaWMuICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGZvb2JhcjsKLQotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjZmc7ICAgICAvKiBlcXVhbHMgemVybyBhdCBib290IHRpbWUuLi4gKi8KLX07Ci0KLSNkZWZpbmUgU1VONERfUFJNX0NOVF9MICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgU1VONERfUFJNX0NOVF9MVkFMVUUgIDB4N0ZGRkZDMDAKLQotc3RydWN0IHN1bjRkX3RpbWVyX3JlZ3MgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsMTBfdGltZXJfbGltaXQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGwxMF9jdXJfY291bnR4OwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsMTBfbGltaXRfbm9jbGVhcjsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY3RybDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbDEwX2N1cl9jb3VudDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgc3VuNGRfdGltZXJfcmVncyAqc3VuNGRfdGltZXJzOwotCiBleHRlcm4gX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbWFzdGVyX2wxMF9jb3VudGVyOwotZXh0ZXJuIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKm1hc3Rlcl9sMTBfbGltaXQ7CiAKIC8qIEZJWE1FOiBNYWtlIGRvX1tnc11ldHRpbWVvZmRheSBidGZpeHVwIGNhbGxzICovCiBCVEZJWFVQREVGX0NBTEwoaW50LCBidXNfZG9fc2V0dGltZW9mZGF5LCBzdHJ1Y3QgdGltZXNwZWMgKnR2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS92YWMtb3BzLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3ZhYy1vcHMuaAppbmRleCBkMTA1Mjc2Li5hNjNlODhlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3ZhYy1vcHMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3ZhYy1vcHMuaApAQCAtNzYsMTEgKzc2LDcgQEAKICAqIGNhY2hlYWJsZSBiaXQgaW4gdGhlIHB0ZSdzIG9mIGFsbCBzdWNoIHBhZ2VzLgogICovCiAKLSNpZmRlZiBDT05GSUdfU1VONAotI2RlZmluZSBTNENWQUNfQkFEQklUUyAgICAgMHgwMDAxZTAwMAotI2Vsc2UKICNkZWZpbmUgUzRDVkFDX0JBREJJVFMgICAgMHgwMDAwZjAwMAotI2VuZGlmCiAKIC8qIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBpZiB2YWRkcjEgYW5kIHZhZGRyMiB3b3VsZCBjYXVzZQogICogYSAnYmFkIGFsaWFzJy4KQEAgLTk0LDEwICs5MCw3IEBACiAgKi8KIHN0cnVjdCBzdW40Y192YWNfcHJvcHMgewogCXVuc2lnbmVkIGludCBudW1fYnl0ZXM7ICAgICAvKiBTaXplIG9mIHRoZSBjYWNoZSAqLwotCXVuc2lnbmVkIGludCBudW1fbGluZXM7ICAgICAvKiBOdW1iZXIgb2YgY2FjaGUgbGluZXMgKi8KIAl1bnNpZ25lZCBpbnQgZG9faHdmbHVzaGVzOyAgLyogSGFyZHdhcmUgZmx1c2hpbmcgYXZhaWxhYmxlPyAqLwotCWVudW0geyBWQUNfTk9ORSwgVkFDX1dSSVRFX1RIUk9VR0gsCi0JICAgIFZBQ19XUklURV9CQUNLIH0gdHlwZTsgIC8qIFdoYXQgdHlwZSBvZiBWQUM/ICovCiAJdW5zaWduZWQgaW50IGxpbmVzaXplOyAgICAgIC8qIFNpemUgb2YgZWFjaCBsaW5lIGluIGJ5dGVzICovCiAJdW5zaWduZWQgaW50IGxvZzJsc2l6ZTsgICAgIC8qIGxvZzIobGluZXNpemUpICovCiAJdW5zaWduZWQgaW50IG9uOyAgICAgICAgICAgIC8qIFZBQyBpcyBlbmFibGVkICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3ZmY19pb2N0bHMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmZjX2lvY3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhiNjkwLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmZjX2lvY3Rscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAxOTk2IGJ5IE1hbmlzaCBWYWNoaGFyYWphbmkgKi8KLQotI2lmbmRlZiBfTElOVVhfVkZDX0lPQ1RMU19IXwotI2RlZmluZQlfTElOVVhfVkZDX0lPQ1RMU19IXwotCi0JLyogSU9DVExzICovCi0jZGVmaW5lIFZGQ19JT0NUTChhKSAgICAgICAgICAoKCdqJyA8PCA4KSB8IGEpCi0jZGVmaW5lIFZGQ0dDVFJMCShWRkNfSU9DVEwgKDApKQkgICAgICAgIC8qIGdldCB2ZmMgYXR0cmlidXRlcyAqLwotI2RlZmluZSBWRkNTQ1RSTAkoVkZDX0lPQ1RMICgxKSkgIAkvKiBzZXQgdmZjIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgVkZDR1ZJRAkJKFZGQ19JT0NUTCAoMikpIAkvKiBnZXQgdmlkZW8gZGVjb2RlciBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIFZGQ1NWSUQJCShWRkNfSU9DVEwgKDMpKQkgICAgICAgIC8qIHNldCB2aWRlbyBkZWNvZGVyIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgVkZDSFVFCQkoVkZDX0lPQ1RMICg0KSkgICAJLyogc2V0IGh1ZSAqLwotI2RlZmluZSBWRkNQT1JUQ0hHCShWRkNfSU9DVEwgKDUpKSAgCS8qIGNoYW5nZSBwb3J0ICovCi0jZGVmaW5lIFZGQ1JESU5GTwkoVkZDX0lPQ1RMICg2KSkgIAkvKiByZWFkIGluZm8gKi8KLQotCS8qIE9wdGlvbnMgZm9yIHNldHRpbmcgdGhlIHZmYyBhdHRyaWJ1dGVzIGFuZCBzdGF0dXMgKi8KLSNkZWZpbmUgTUVNUFJTVAkJMHgxCS8qIHJlc2V0IEZJRk8gcHRyLiAqLwotI2RlZmluZSBDQVBUUkNNRAkweDIJLyogc3RhcnQgY2FwdHVyZSBhbmQgd2FpdCAqLwotI2RlZmluZSBESUFHTU9ERQkweDMJLyogZGlhZyBtb2RlICovCi0jZGVmaW5lIE5PUk1NT0RFCTB4NAkvKiBub3JtYWwgbW9kZSAqLwotI2RlZmluZSBDQVBUUlNUUgkweDUJLyogc3RhcnQgY2FwdHVyZSAqLwotI2RlZmluZSBDQVBUUldBSVQJMHg2CS8qIHdhaXQgZm9yIGNhcHR1cmUgdG8gZmluaXNoICovCi0KLQotCS8qIE9wdGlvbnMgZm9yIHRoZSBkZWNvZGVyICovCi0jZGVmaW5lIFNURF9OVFNDCTB4MQkvKiBOVFNDIG1vZGUgKi8KLSNkZWZpbmUgU1REX1BBTAkJMHgyCS8qIFBBTCBtb2RlICovCi0jZGVmaW5lIENPTE9SX09OCTB4MwkvKiBmb3JjZSBjb2xvciBPTiAqLwotI2RlZmluZSBNT05PCQkweDQJLyogZm9yY2UgY29sb3IgT0ZGICovCi0KLQkvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgaW9jdGwgMiAqLwotCi0jZGVmaW5lIE5PX0xPQ0sJICAgICAgICAxCi0jZGVmaW5lIE5UU0NfQ09MT1IJMgotI2RlZmluZSBOVFNDX05PQ09MT1IgICAgMwotI2RlZmluZSBQQUxfQ09MT1IJNAotI2RlZmluZSBQQUxfTk9DT0xPUgk1Ci0KLS8qIE5vdCB0b28gc3VyZSB3aGF0IHRoaXMgZG9lcyB5ZXQgKi8KLQkvKiBPcHRpb25zIGZvciBzZXR0aW5nIEZpZWxkIG51bWJlciAqLwotI2RlZmluZSBPRERfRklFTEQJMHgxCi0jZGVmaW5lIEVWRU5fRklFTEQJMHgwCi0jZGVmaW5lIEFDVElWRV9PTkxZICAgICAweDIKLSNkZWZpbmUgTk9OX0FDVElWRQkweDAKLQotLyogRGVidWcgb3B0aW9ucyAqLwotI2RlZmluZSBWRkNfSTJDX1NFTkQgMAotI2RlZmluZSBWRkNfSTJDX1JFQ1YgMQotCi1zdHJ1Y3QgdmZjX2RlYnVnX2lub3V0Ci17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXVuc2lnbmVkIGxvbmcgcmV0OwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIGNoYXIgX191c2VyICpidWZmZXI7Ci19OwotCi0jZW5kaWYgLyogX0xJTlVYX1ZGQ19JT0NUTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmlzYXNtLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Zpc2FzbS5oCmluZGV4IGRlNzk3YjkuLjM5Y2EzMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdmlzYXNtLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS92aXNhc20uaApAQCAtNTcsNiArNTcsNyBAQAogIgkJIiA6IDogImkiIChGUFJTX0ZFRnxGUFJTX0RVKSA6CiAJCSJvNSIsICJnMSIsICJnMiIsICJnMyIsICJnNyIsICJjYyIpOwogfQorZXh0ZXJuIGludCB2aXNfZW11bChzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBpbnQpOwogI2VuZGlmCiAKICNlbmRpZiAvKiBfU1BBUkM2NF9BU0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA2ZTAzYTJhLi4yZDY1ODIwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTMsMTUgKzEzLDEzIEBACiAJICAgIHRpbWUubyB3aW5kb3dzLm8gY3B1Lm8gZGV2aWNlcy5vIFwKIAkgICAgdGFkcG9sZS5vIHRpY2sxNC5vIHB0cmFjZS5vIFwKIAkgICAgdW5hbGlnbmVkLm8gdW5hX2FzbS5vIG11bGRpdi5vIFwKLQkgICAgcHJvbS5vIG9mX2RldmljZS5vIGRldnJlcy5vCisJICAgIHByb20ubyBvZl9kZXZpY2UubyBkZXZyZXMubyBkbWEubwogCiBkZXZyZXMteSA9IC4uLy4uLy4uL2tlcm5lbC9pcnEvZGV2cmVzLm8KIAogb2JqLSQoQ09ORklHX1BDSSkgKz0gcGNpYy5vCi1vYmotJChDT05GSUdfU1VONCkgKz0gc3VuNHNldHVwLm8KIG9iai0kKENPTkZJR19TTVApICs9IHRyYW1wb2xpbmUubyBzbXAubyBzdW40bV9zbXAubyBzdW40ZF9zbXAubwogb2JqLSQoQ09ORklHX1NVTl9BVVhJTykgKz0gYXV4aW8ubwotb2JqLSQoQ09ORklHX1BDSSkgKz0gZWJ1cy5vCiBvYmotJChDT05GSUdfU1VOX1BNKSArPSBhcGMubyBwbWMubwogb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vIHNwYXJjX2tzeW1zLm8KIG9iai0kKENPTkZJR19TUEFSQ19MRUQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCmluZGV4IDUyNjdkNDguLjRkZDFiYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCkBAIC0xMiw5ICsxMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KQEAgLTI5LDExICszMCwxMCBAQAogI2RlZmluZSBBUENfT0JQTkFNRQkicG93ZXItbWFuYWdlbWVudCIKICNkZWZpbmUgQVBDX0RFVk5BTUUgImFwYyIKIAotdm9sYXRpbGUgc3RhdGljIHU4IF9faW9tZW0gKnJlZ3M7IAotc3RhdGljIGludCBhcGNfcmVnc2l6ZTsKK3N0YXRpYyB1OCBfX2lvbWVtICpyZWdzOwogc3RhdGljIGludCBhcGNfbm9faWRsZSBfX2luaXRkYXRhID0gMDsKIAotI2RlZmluZSBhcGNfcmVhZGIob2ZmcykJCQkoc2J1c19yZWFkYihyZWdzK29mZnMpKQorI2RlZmluZSBhcGNfcmVhZGIob2ZmcykJCShzYnVzX3JlYWRiKHJlZ3Mrb2ZmcykpCiAjZGVmaW5lIGFwY193cml0ZWIodmFsLCBvZmZzKSAJKHNidXNfd3JpdGViKHZhbCwgcmVncytvZmZzKSkKIAogLyogU3BlY2lmeSAiYXBjPW5vaWRsZSIgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgdG8gCkBAIC02OSw5ICs2OSw5IEBACiAjZW5kaWYKIH0gCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcGNfZnJlZSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGFwY19mcmVlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXNidXNfaW91bm1hcChyZWdzLCBhcGNfcmVnc2l6ZSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCByZWdzLCByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pKTsKIH0KIAogc3RhdGljIGludCBhcGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKQEAgLTE1Myw1MiArMTUzLDU2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhcGNfbWlzY2RldiA9IHsgQVBDX01JTk9SLCBBUENfREVWTkFNRSwgJmFwY19mb3BzIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGFwY19wcm9iZSh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgYXBjX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IE5VTEw7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKLQlpbnQgaVRtcCA9IDA7CisJaW50IGVycjsKIAotCWZvcl9lYWNoX3NidXMoc2J1cykgewotCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJCWlmICghc3RyY21wKHNkZXYtPnByb21fbmFtZSwgQVBDX09CUE5BTUUpKSB7Ci0JCQkJZ290byBzYnVzX2RvbmU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLXNidXNfZG9uZToKLQlpZiAoIXNkZXYpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXBjX3JlZ3NpemUgPSBzZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemU7Ci0JcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsIAotCQkJCSAgIGFwY19yZWdzaXplLCBBUENfT0JQTkFNRSk7Ci0JaWYoIXJlZ3MpIHsKKwlyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJICByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pLCBBUENfT0JQTkFNRSk7CisJaWYgKCFyZWdzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzXG4iLCBBUENfREVWTkFNRSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlUbXAgPSBtaXNjX3JlZ2lzdGVyKCZhcGNfbWlzY2Rldik7Ci0JaWYgKGlUbXAgIT0gMCkgeworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmFwY19taXNjZGV2KTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiIsIEFQQ19ERVZOQU1FKTsKLQkJYXBjX2ZyZWUoKTsKKwkJYXBjX2ZyZWUob3ApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBBc3NpZ24gcG93ZXIgbWFuYWdlbWVudCBJRExFIGhhbmRsZXIgKi8KLQlpZighYXBjX25vX2lkbGUpCisJaWYgKCFhcGNfbm9faWRsZSkKIAkJcG1faWRsZSA9IGFwY19zd2lmdF9pZGxlOwkKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBwb3dlciBtYW5hZ2VtZW50IGluaXRpYWxpemVkJXNcbiIsIAotCQlBUENfREVWTkFNRSwgYXBjX25vX2lkbGUgPyAiIChDUFUgaWRsZSBkaXNhYmxlZCkiIDogIiIpOworCSAgICAgICBBUENfREVWTkFNRSwgYXBjX25vX2lkbGUgPyAiIChDUFUgaWRsZSBkaXNhYmxlZCkiIDogIiIpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgYXBjX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9IEFQQ19PQlBOQU1FLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXBjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgYXBjX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYXBjIiwKKwkubWF0Y2hfdGFibGUJPSBhcGNfbWF0Y2gsCisJLnByb2JlCQk9IGFwY19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFwY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYXBjX2RyaXZlciwgJm9mX2J1c190eXBlKTsKK30KKwogLyogVGhpcyBkcml2ZXIgaXMgbm90IGNyaXRpY2FsIHRvIHRoZSBib290IHByb2Nlc3MKICAqIGFuZCBpcyBlYXNpZXN0IHRvIGlvcmVtYXAgd2hlbiBTQnVzIGlzIGFscmVhZHkKICAqIGluaXRpYWxpemVkLCBzbyB3ZSBpbnN0YWxsIG91cnNlbHZlcyB0aHVzbHk6CiAgKi8KLV9faW5pdGNhbGwoYXBjX3Byb2JlKTsKLQorX19pbml0Y2FsbChhcGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW8uYwppbmRleCBiYWY0ZWQzLi4wOWM4NTcyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpby5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvLmMKQEAgLTYsNiArNiw4IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KQEAgLTU5LDcgKzYxLDcgQEAKIAlyLmZsYWdzID0gYXV4cmVnc1swXS53aGljaF9pbyAmIDB4RjsKIAlyLnN0YXJ0ID0gYXV4cmVnc1swXS5waHlzX2FkZHI7CiAJci5lbmQgPSBhdXhyZWdzWzBdLnBoeXNfYWRkciArIGF1eHJlZ3NbMF0ucmVnX3NpemUgLSAxOwotCWF1eGlvX3JlZ2lzdGVyID0gc2J1c19pb3JlbWFwKCZyLCAwLCBhdXhyZWdzWzBdLnJlZ19zaXplLCAiYXV4aW8iKTsKKwlhdXhpb19yZWdpc3RlciA9IG9mX2lvcmVtYXAoJnIsIDAsIGF1eHJlZ3NbMF0ucmVnX3NpemUsICJhdXhpbyIpOwogCS8qIEZpeCB0aGUgYWRkcmVzcyBvbiBzdW40bSBhbmQgc3VuNGMuICovCiAJaWYoKCgodW5zaWduZWQgbG9uZykgYXV4cmVnc1swXS5waHlzX2FkZHIpICYgMykgPT0gMyB8fAogCSAgIHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40YykKQEAgLTEyOCw3ICsxMzAsNyBAQAogCXIuZmxhZ3MgPSByZWdzLndoaWNoX2lvICYgMHhGOwogCXIuc3RhcnQgPSByZWdzLnBoeXNfYWRkcjsKIAlyLmVuZCA9IHJlZ3MucGh5c19hZGRyICsgcmVncy5yZWdfc2l6ZSAtIDE7Ci0JYXV4aW9fcG93ZXJfcmVnaXN0ZXIgPSAodW5zaWduZWQgY2hhciAqKSBzYnVzX2lvcmVtYXAoJnIsIDAsCisJYXV4aW9fcG93ZXJfcmVnaXN0ZXIgPSAodW5zaWduZWQgY2hhciAqKSBvZl9pb3JlbWFwKCZyLCAwLAogCSAgICByZWdzLnJlZ19zaXplLCAiYXV4cG93ZXIiKTsKIAogCS8qIERpc3BsYXkgYSBxdWljayBtZXNzYWdlIG9uIHRoZSBjb25zb2xlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZGV2aWNlcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZGV2aWNlcy5jCmluZGV4IGIyNDBiODguLmFkNjU2YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RldmljZXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9kZXZpY2VzLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogI2VuZGlmCiAJY2xvY2tfc3RvcF9wcm9iZSgpOwogCi0JaWYgKEFSQ0hfU1VONENfU1VONCkKKwlpZiAoQVJDSF9TVU40QykKIAkJc3VuNGNfcHJvYmVfbWVtZXJyX3JlZygpOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZG1hLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM4NDAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZG1hLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIGRtYS5jOiBQQ0kgYW5kIFNCVVMgRE1BIGFjY2Vzc29ycyBmb3IgMzItYml0IHNwYXJjLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJkbWEuaCIKKworaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiBwY2lfZG1hX3N1cHBvcnRlZCh0b19wY2lfZGV2KGRldiksIG1hc2spOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOworCitpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKKwkJcmV0dXJuIHBjaV9zZXRfZG1hX21hc2sodG9fcGNpX2RldihkZXYpLCBkbWFfbWFzayk7CisjZW5kaWYKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7CisKK3ZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKQorCQlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQodG9fcGNpX2RldihkZXYpLCBzaXplLCBkbWFfaGFuZGxlKTsKKyNlbmRpZgorCXJldHVybiBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKKwordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkgICAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0b19wY2lfZGV2KGRldiksIHNpemUsCisJCQkJICAgIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCXNidXNfZnJlZV9jb25zaXN0ZW50KGRldiwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworfQorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CisKK2RtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwKKwkJCSAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiBwY2lfbWFwX3NpbmdsZSh0b19wY2lfZGV2KGRldiksIGNwdV9hZGRyLAorCQkJCSAgICAgIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKKyNlbmRpZgorCXJldHVybiBzYnVzX21hcF9zaW5nbGUoZGV2LCBjcHVfYWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NpbmdsZSk7CisKK3ZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCSAgICAgIHNpemVfdCBzaXplLAorCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCXBjaV91bm1hcF9zaW5nbGUodG9fcGNpX2RldihkZXYpLCBkbWFfYWRkciwKKwkJCQkgc2l6ZSwgKGludClkaXJlY3Rpb24pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJc2J1c191bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2luZ2xlKTsKKworZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiBwY2lfbWFwX3BhZ2UodG9fcGNpX2RldihkZXYpLCBwYWdlLCBvZmZzZXQsCisJCQkJICAgIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKKyNlbmRpZgorCXJldHVybiBzYnVzX21hcF9zaW5nbGUoZGV2LCBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQsCisJCQkgICAgICAgc2l6ZSwgKGludClkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3BhZ2UpOworCit2b2lkIGRtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKKwkJICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCXBjaV91bm1hcF9wYWdlKHRvX3BjaV9kZXYoZGV2KSwgZG1hX2FkZHJlc3MsCisJCQkgICAgICAgc2l6ZSwgKGludClkaXJlY3Rpb24pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJc2J1c191bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkcmVzcywgc2l6ZSwgKGludClkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfcGFnZSk7CisKK2ludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKQorCQlyZXR1cm4gcGNpX21hcF9zZyh0b19wY2lfZGV2KGRldiksIHNnLCBuZW50cywgKGludClkaXJlY3Rpb24pOworI2VuZGlmCisJcmV0dXJuIHNidXNfbWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NnKTsKKwordm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkgeworCQlwY2lfdW5tYXBfc2codG9fcGNpX2RldihkZXYpLCBzZywgbmVudHMsIChpbnQpZGlyZWN0aW9uKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCXNidXNfdW5tYXBfc2coZGV2LCBzZywgbmVudHMsIChpbnQpZGlyZWN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3VubWFwX3NnKTsKKwordm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRvX3BjaV9kZXYoZGV2KSwgZG1hX2hhbmRsZSwKKwkJCQkJICAgIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBkbWFfaGFuZGxlLCBzaXplLCAoaW50KSBkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGVfZm9yX2NwdSk7CisKK3ZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRvX3BjaV9kZXYoZGV2KSwgZG1hX2hhbmRsZSwKKwkJCQkJICAgICAgIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLCBzaXplLCAoaW50KSBkaXJlY3Rpb24pOworfQorRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSk7CisKK3ZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBkbWFfaGFuZGxlK29mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUpOworCit2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlK29mZnNldCwgc2l6ZSwgZGlyZWN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UpOworCit2b2lkIGRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpIHsKKwkJcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUodG9fcGNpX2RldihkZXYpLCBzZywKKwkJCQkJbmVsZW1zLCAoaW50KWRpcmVjdGlvbik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlCVUcoKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2dfZm9yX2NwdSk7CisKK3ZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisjaWZkZWYgQ09ORklHX1BDSQorCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCXBjaV9kbWFfc3luY19zZ19mb3JfZGV2aWNlKHRvX3BjaV9kZXYoZGV2KSwgc2csCisJCQkJCSAgIG5lbGVtcywgKGludClkaXJlY3Rpb24pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UpOworCitpbnQgZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAoZG1hX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwcGluZ19lcnJvcik7CisKK2ludCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQoreworCXJldHVybiAzMjsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZG1hLmggYi9hcmNoL3NwYXJjL2tlcm5lbC9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ4OTUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZG1hLmgKQEAgLTAsMCArMSwxNCBAQAordm9pZCAqc2J1c19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgbG9uZyBsZW4sIHUzMiAqZG1hX2FkZHJwKTsKK3ZvaWQgc2J1c19mcmVlX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBsb25nIG4sIHZvaWQgKnAsIHUzMiBiYSk7CitkbWFfYWRkcl90IHNidXNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhLAorCQkJICAgc2l6ZV90IGxlbiwgaW50IGRpcmVjdGlvbik7Cit2b2lkIHNidXNfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBiYSwKKwkJICAgICAgIHNpemVfdCBuLCBpbnQgZGlyZWN0aW9uKTsKK2ludCBzYnVzX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCWludCBuLCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgc2J1c191bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCSAgIGludCBuLCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYmEsCisJCQkJICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7Cit2b2lkIHNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGJhLAorCQkJCSAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI5NDIzLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKgotICogZWJ1cy5jOiBQQ0kgdG8gRUJ1cyBicmlkZ2UgZGV2aWNlLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NyAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCi0gKgotICogQWRvcHRlZCBmb3Igc3BhcmMgYnkgVi4gUm9nYW5vdiBhbmQgRy4gUmFpa28uCi0gKiBGaXhlcyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtcyBieSBQZXRlIFphaXRjZXYuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wYm0uaD4KLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2JwcC5oPgotCi1zdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1c19jaGFpbiA9IE5VTEw7Ci0KLS8qIFdlIGFyZSB0b2dldGhlciB3aXRoIHBjaWMuYyB1bmRlciBDT05GSUdfUENJLiAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBwY2ljX3Bpbl90b19pcnEodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICpuYW1lKTsKLQotLyoKLSAqIElSUSBCbGFja2xpc3QKLSAqIEhlcmUgd2UgbGlzdCBQUk9NcyBhbmQgc3lzdGVtcyB0aGF0IGFyZSBrbm93biB0byBzdXBwbHkgY3JhcCBhcyBJUlEgbnVtYmVycy4KLSAqLwotc3RydWN0IGVidXNfZGV2aWNlX2lycSB7Ci0JY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBpbnQgcGluOwotfTsKLQotc3RydWN0IGVidXNfc3lzdGVtX2VudHJ5IHsKLQljaGFyICplc25hbWU7Ci0Jc3RydWN0IGVidXNfZGV2aWNlX2lycSAqaXB0OwotfTsKLQotc3RhdGljIHN0cnVjdCBlYnVzX2RldmljZV9pcnEgamUxXzFbXSA9IHsKLQl7ICI4MDQyIiwJCSAzIH0sCi0JeyAiU1VOVyxDUzQyMzEiLAkgMCB9LAotCXsgInBhcmFsbGVsIiwJCSAwIH0sCi0JeyAic2UiLAkJCSAyIH0sCi0JeyBOVUxMLCAwIH0KLX07Ci0KLS8qCi0gKiBHbGViJ3MgSkUxIHN1cHBsaWVkIHJlYXNvbmFibGUgcGluIG51bWJlcnMsIGJ1dCBtaW5lIGRpZCBub3QgKE9CUCAyLjMyKS4KLSAqIEJsYWNrbGlzdCB0aGUgc3Vja2VyLi4uIE5vdGUgdGhhdCBHbGViJ3Mgc3lzdGVtIHdpbGwgd29yay4KLSAqLwotc3RhdGljIHN0cnVjdCBlYnVzX3N5c3RlbV9lbnRyeSBlYnVzX2JsYWNrbGlzdFtdID0gewotCXsgIlNVTlcsSmF2YUVuZ2luZTEiLCBqZTFfMSB9LAotCXsgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGVidXNfZGV2aWNlX2lycSAqZWJ1c19ibGFja3AgPSBOVUxMOwotCi0vKgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZWJ1c19hbGxvYyhzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpa21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLX0KLQotLyoKLSAqLwotc3RhdGljIGludCBfX2luaXQgZWJ1c19ibGFja2xpc3RfaXJxKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGVidXNfZGV2aWNlX2lycSAqZHA7Ci0KLQlpZiAoKGRwID0gZWJ1c19ibGFja3ApICE9IE5VTEwpIHsKLQkJZm9yICg7IGRwLT5uYW1lICE9IE5VTEw7IGRwKyspIHsKLQkJCWlmIChzdHJjbXAobmFtZSwgZHAtPm5hbWUpID09IDApIHsKLQkJCQlyZXR1cm4gcGNpY19waW5fdG9faXJxKGRwLT5waW4sIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9lYnVzX2NoaWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCi0JCQkJICAgc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmRldikKLXsKLQljb25zdCBpbnQgKnJlZ3M7Ci0JY29uc3QgaW50ICppcnFzOwotCWludCBpLCBsZW47Ci0KLQlkZXYtPnByb21fbm9kZSA9IGRwOwotCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCAmbGVuKTsKLQlpZiAoIXJlZ3MpCi0JCWxlbiA9IDA7Ci0JZGV2LT5udW1fYWRkcnMgPSBsZW4gLyBzaXplb2YocmVnc1swXSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWRkcnM7IGkrKykgewotCQlpZiAocmVnc1tpXSA+PSBkZXYtPnBhcmVudC0+bnVtX2FkZHJzKSB7Ci0JCQlwcm9tX3ByaW50ZigiVUdIOiBwcm9wZXJ0eSBmb3IgJXMgd2FzICVkLCBuZWVkIDwgJWRcbiIsCi0JCQkJICAgIGRldi0+cHJvbV9ub2RlLT5uYW1lLCBsZW4sCi0JCQkJICAgIGRldi0+cGFyZW50LT5udW1fYWRkcnMpOwotCQkJcGFuaWMoX19mdW5jX18pOwotCQl9Ci0KLQkJLyogWFhYIHJlc291cmNlICovCi0JCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPQotCQkJZGV2LT5wYXJlbnQtPnJlc291cmNlW3JlZ3NbaV1dLnN0YXJ0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBQUk9NSU5UUl9NQVg7IGkrKykKLQkJZGV2LT5pcnFzW2ldID0gUENJX0lSUV9OT05FOwotCi0JaWYgKChkZXYtPmlycXNbMF0gPSBlYnVzX2JsYWNrbGlzdF9pcnEoZGV2LT5wcm9tX25vZGUtPm5hbWUpKSAhPSAwKSB7Ci0JCWRldi0+bnVtX2lycXMgPSAxOwotCX0gZWxzZSB7Ci0JCWlycXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7Ci0JCWlmICghaXJxcykgewotCQkJZGV2LT5udW1faXJxcyA9IDA7Ci0JCQlkZXYtPmlycXNbMF0gPSAwOwotCQkJaWYgKGRldi0+cGFyZW50LT5udW1faXJxcyAhPSAwKSB7Ci0JCQkJZGV2LT5udW1faXJxcyA9IDE7Ci0JCQkJZGV2LT5pcnFzWzBdID0gZGV2LT5wYXJlbnQtPmlycXNbMF07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkZXYtPm51bV9pcnFzID0gbGVuIC8gc2l6ZW9mKGlycXNbMF0pOwotCQkJaWYgKGlycXNbMF0gPT0gMCB8fCBpcnFzWzBdID49IDgpIHsKLQkJCQkvKgotCQkJCSAqIFhYWCBaZXJvIGlzIGEgdmFsaWQgcGluIG51bWJlci4uLgotCQkJCSAqIFRoaXMgd29ya3MgYXMgbG9uZyBhcyBFYnVzIGlzIG5vdCB3aXJlZAotCQkJCSAqIHRvIElOVEEjLgotCQkJCSAqLwotCQkJCXByaW50aygiRUJVUzogJXMgZ290IGJhZCBpcnEgJWQgZnJvbSBQUk9NXG4iLAotCQkJCSAgICAgICBkZXYtPnByb21fbm9kZS0+bmFtZSwgaXJxc1swXSk7Ci0JCQkJZGV2LT5udW1faXJxcyA9IDA7Ci0JCQkJZGV2LT5pcnFzWzBdID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT5pcnFzWzBdID0KLQkJCQkJcGNpY19waW5fdG9faXJxKGlycXNbMF0sCi0JCQkJCQkJZGV2LT5wcm9tX25vZGUtPm5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9lYnVzX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAotCQkJCSAgICBzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmNoaWxkOwotCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkOwotCWNvbnN0IGludCAqaXJxczsKLQlpbnQgaSwgbiwgbGVuOwotCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7Ci0KLQlkZXYtPnByb21fbm9kZSA9IGRwOwotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOwotCWlmICghcmVncykKLQkJbGVuID0gMDsKLQlpZiAobGVuICUgc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykpIHsKLQkJcHJvbV9wcmludGYoIlVHSDogcHJvcGxlbiBmb3IgJXMgd2FzICVkLCBuZWVkIG11bHRpcGxlIG9mICVkXG4iLAotCQkJICAgIGRldi0+cHJvbV9ub2RlLT5uYW1lLCBsZW4sCi0JCQkgICAgKGludClzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKSk7Ci0JCXBhbmljKF9fZnVuY19fKTsKLQl9Ci0JZGV2LT5udW1fYWRkcnMgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9hZGRyczsgaSsrKSB7Ci0JCS8qCi0JCSAqIFhYWCBDb2xsZWN0IEpFLTEgUFJPTQotCQkgKiAKLQkJICogRXhhbXBsZSAtIEpTLUUgd2l0aCAzLjExOgotCQkgKiAgL2VidXMKLQkJICogICAgICByZWdzIAotCQkgKiAgICAgICAgMHgwMDAwMDAwMCwgMHgwLCAweDAwMDAwMDAwLCAweDAsIDB4MDAwMDAwMDAsCi0JCSAqICAgICAgICAweDgyMDAwMDEwLCAweDAsIDB4ZjAwMDAwMDAsIDB4MCwgMHgwMTAwMDAwMCwKLQkJICogICAgICAgIDB4ODIwMDAwMTQsIDB4MCwgMHgzODgwMDAwMCwgMHgwLCAweDAwODAwMDAwLAotCQkgKiAgICAgIHJhbmdlcwotCQkgKiAgICAgICAgMHgwMCwgMHgwMDAwMDAwMCwgMHgwMjAwMDAxMCwgMHgwLCAweDAsIDB4MDEwMDAwMDAsCi0JCSAqICAgICAgICAweDAxLCAweDAxMDAwMDAwLCAweDAyMDAwMDE0LCAweDAsIDB4MCwgMHgwMDgwMDAwMCwKLQkJICogIC9lYnVzLzgwNDIKLQkJICogICAgICByZWdzCi0JCSAqICAgICAgICAweDAwMDAwMDAxLCAweDAwMzAwMDYwLCAweDAwMDAwMDA4LAotCQkgKiAgICAgICAgMHgwMDAwMDAwMSwgMHgwMDMwMDA2MCwgMHgwMDAwMDAwOCwKLQkJICovCi0JCW4gPSByZWdzW2ldLndoaWNoX2lvOwotCQlpZiAobiA+PSA0KSB7Ci0JCQkvKiBYWFggVGhpcyBpcyBjb3BpZWQgZnJvbSBvbGQgSkUtMSBieSBHbGViLiAqLwotCQkJbiA9IChyZWdzW2ldLndoaWNoX2lvIC0gMHgxMCkgPj4gMjsKLQkJfSBlbHNlIHsKLQkJCTsKLQkJfQotCi0vKgotICogWFhYIE5vdyBhcyB3ZSBoYXZlIHJlZ2lvbnMsIHdoeSBkb24ndCB3ZSBtYWtlIGFuIG9uLWRlbWFuZCBhbGxvY2F0aW9uLi4uCi0gKi8KLQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCWlmICgoYmFzZWFkZHIgPSBkZXYtPmJ1cy0+c2VsZi0+cmVzb3VyY2Vbbl0uc3RhcnQgKwotCQkgICAgcmVnc1tpXS5waHlzX2FkZHIpICE9IDApIHsKLQkJCS8qIGRldi0+cmVzb3VyY2VbaV0ubmFtZSA9IGRldi0+cHJvbV9uYW1lOyAqLwotCQkJaWYgKChiYXNlYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKGJhc2VhZGRyLAotCQkJICAgIHJlZ3NbaV0ucmVnX3NpemUpKSA9PSAwKSB7Ci0JCQkJcGFuaWMoImVidXM6IHVuYWJsZSB0byByZW1hcCBkZXYgJXMiLAotCQkJCSAgICAgIGRldi0+cHJvbV9ub2RlLT5uYW1lKTsKLQkJCX0KLQkJfQotCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gYmFzZWFkZHI7CS8qIFhYWCBVbmFsaWduZWQgKi8KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFJPTUlOVFJfTUFYOyBpKyspCi0JCWRldi0+aXJxc1tpXSA9IFBDSV9JUlFfTk9ORTsKLQotCWlmICgoZGV2LT5pcnFzWzBdID0gZWJ1c19ibGFja2xpc3RfaXJxKGRldi0+cHJvbV9ub2RlLT5uYW1lKSkgIT0gMCkgewotCQlkZXYtPm51bV9pcnFzID0gMTsKLQl9IGVsc2UgewotCQlpcnFzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0cyIsICZsZW4pOwotCQlpZiAoIWlycXMpIHsKLQkJCWRldi0+bnVtX2lycXMgPSAwOwotCQkJaWYgKChkZXYtPmlycXNbMF0gPSBkZXYtPmJ1cy0+c2VsZi0+aXJxKSAhPSAwKSB7Ci0JCQkJZGV2LT5udW1faXJxcyA9IDE7Ci0vKiBQMyAqLyAvKiBwcmludGsoIkVCVVM6IGNoaWxkICVzIGlycSAlZCBmcm9tIHBhcmVudFxuIiwgZGV2LT5wcm9tX25hbWUsIGRldi0+aXJxc1swXSk7ICovCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkZXYtPm51bV9pcnFzID0gMTsgIC8qIGRldi0+bnVtX2lycXMgPSBsZW4gLyBzaXplb2YoaXJxc1swXSk7ICovCi0JCQlpZiAoaXJxc1swXSA9PSAwIHx8IGlycXNbMF0gPj0gOCkgewotCQkJCS8qIFNlZSBhYm92ZSBmb3IgdGhlIHBhcmVudC4gWFhYICovCi0JCQkJcHJpbnRrKCJFQlVTOiAlcyBnb3QgYmFkIGlycSAlZCBmcm9tIFBST01cbiIsCi0JCQkJICAgICAgIGRldi0+cHJvbV9ub2RlLT5uYW1lLCBpcnFzWzBdKTsKLQkJCQlkZXYtPm51bV9pcnFzID0gMDsKLQkJCQlkZXYtPmlycXNbMF0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlkZXYtPmlycXNbMF0gPQotCQkJCQlwY2ljX3Bpbl90b19pcnEoaXJxc1swXSwKLQkJCQkJCQlkZXYtPnByb21fbm9kZS0+bmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzZCA9ICZkZXYtPm9mZGV2LmRldi5hcmNoZGF0YTsKLQlzZC0+cHJvbV9ub2RlID0gZHA7Ci0Jc2QtPm9wID0gJmRldi0+b2ZkZXY7Ci0Jc2QtPmlvbW11ID0gZGV2LT5idXMtPm9mZGV2LmRldi5wYXJlbnQtPmFyY2hkYXRhLmlvbW11OwotCi0JZGV2LT5vZmRldi5ub2RlID0gZHA7Ci0JZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJmRldi0+YnVzLT5vZmRldi5kZXY7Ci0JZGV2LT5vZmRldi5kZXYuYnVzID0gJmVidXNfYnVzX3R5cGU7Ci0Jc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICJlYnVzWyUwOHhdIiwgZHAtPm5vZGUpOwotCi0JLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCi0JaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZGV2LT5vZmRldikgIT0gMCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQotCWlmICgoZHAgPSBkcC0+Y2hpbGQpICE9IE5VTEwpIHsKLQkJZGV2LT5jaGlsZHJlbiA9IChzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqKQotCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKLQotCQljaGlsZCA9IGRldi0+Y2hpbGRyZW47Ci0JCWNoaWxkLT5uZXh0ID0gTlVMTDsKLQkJY2hpbGQtPnBhcmVudCA9IGRldjsKLQkJY2hpbGQtPmJ1cyA9IGRldi0+YnVzOwotCQlmaWxsX2VidXNfY2hpbGQoZHAsIGNoaWxkKTsKLQotCQl3aGlsZSAoKGRwID0gZHAtPnNpYmxpbmcpICE9IE5VTEwpIHsKLQkJCWNoaWxkLT5uZXh0ID0gKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICopCi0JCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKLQotCQkJY2hpbGQgPSBjaGlsZC0+bmV4dDsKLQkJCWNoaWxkLT5uZXh0ID0gTlVMTDsKLQkJCWNoaWxkLT5wYXJlbnQgPSBkZXY7Ci0JCQljaGlsZC0+YnVzID0gZGV2LT5idXM7Ci0JCQlmaWxsX2VidXNfY2hpbGQoZHAsIGNoaWxkKTsKLQkJfQotCX0KLX0KLQotdm9pZCBfX2luaXQgZWJ1c19pbml0KHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3QgbGludXhfcGJtX2luZm8gKnBibTsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQlzdHJ1Y3QgZWJ1c19zeXN0ZW1fZW50cnkgKnNwOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnA7Ci0JdW5zaWduZWQgc2hvcnQgcGNpX2NvbW1hbmQ7Ci0JaW50IGxlbiwgcmVnLCBucmVnOwotCWludCBudW1fZWJ1cyA9IDA7Ci0KLQlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JZm9yIChzcCA9IGVidXNfYmxhY2tsaXN0OyBzcC0+ZXNuYW1lICE9IE5VTEw7IHNwKyspIHsKLQkJaWYgKHN0cmNtcChkcC0+bmFtZSwgc3AtPmVzbmFtZSkgPT0gMCkgewotCQkJZWJ1c19ibGFja3AgPSBzcC0+aXB0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVU4sIFBDSV9ERVZJQ0VfSURfU1VOX0VCVVMsIE5VTEwpOwotCWlmICghcGRldikKLQkJcmV0dXJuOwotCi0JY29va2llID0gcGRldi0+c3lzZGF0YTsKLQlkcCA9IGNvb2tpZS0+cHJvbV9ub2RlOwotCi0JZWJ1c19jaGFpbiA9IGVidXMgPSAoc3RydWN0IGxpbnV4X2VidXMgKikKLQkJCWVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzKSk7Ci0JZWJ1cy0+bmV4dCA9IE5VTEw7Ci0KLQl3aGlsZSAoZHApIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpuZDsKLQotCQllYnVzLT5wcm9tX25vZGUgPSBkcDsKLQkJZWJ1cy0+c2VsZiA9IHBkZXY7Ci0JCWVidXMtPnBhcmVudCA9IHBibSA9IGNvb2tpZS0+cGJtOwotCi0JCS8qIEVuYWJsZSBCVVMgTWFzdGVyLiAqLwotCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQkJcGNpX2NvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUFTVEVSOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLQotCQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7Ci0JCWlmICghcmVncykgewotCQkJcHJvbV9wcmludGYoIiVzOiBjYW4ndCBmaW5kIHJlZyBwcm9wZXJ0eVxuIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KLQkJbnJlZyA9IGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzKTsKLQotCQlwID0gJmVidXMtPnNlbGYtPnJlc291cmNlWzBdOwotCQlmb3IgKHJlZyA9IDA7IHJlZyA8IG5yZWc7IHJlZysrKSB7Ci0JCQlpZiAoIShyZWdzW3JlZ10ud2hpY2hfaW8gJiAweDAzMDAwMDAwKSkKLQkJCQljb250aW51ZTsKLQotCQkJKHArKyktPnN0YXJ0ID0gcmVnc1tyZWddLnBoeXNfbG87Ci0JCX0KLQotCQllYnVzLT5vZmRldi5ub2RlID0gZHA7Ci0JCWVidXMtPm9mZGV2LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCQllYnVzLT5vZmRldi5kZXYuYnVzID0gJmVidXNfYnVzX3R5cGU7Ci0JCXNwcmludGYoZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCwgImVidXMlZCIsIG51bV9lYnVzKTsKLQotCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KLQkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZWJ1cy0+b2ZkZXYpICE9IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQotCi0JCW5kID0gZHAtPmNoaWxkOwotCQlpZiAoIW5kKQotCQkJZ290byBuZXh0X2VidXM7Ci0KLQkJZWJ1cy0+ZGV2aWNlcyA9IChzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKikKLQkJCQllYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UpKTsKLQotCQlkZXYgPSBlYnVzLT5kZXZpY2VzOwotCQlkZXYtPm5leHQgPSBOVUxMOwotCQlkZXYtPmNoaWxkcmVuID0gTlVMTDsKLQkJZGV2LT5idXMgPSBlYnVzOwotCQlmaWxsX2VidXNfZGV2aWNlKG5kLCBkZXYpOwotCi0JCXdoaWxlICgobmQgPSBuZC0+c2libGluZykgIT0gTlVMTCkgewotCQkJZGV2LT5uZXh0ID0gKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqKQotCQkJCWVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSkpOwotCi0JCQlkZXYgPSBkZXYtPm5leHQ7Ci0JCQlkZXYtPm5leHQgPSBOVUxMOwotCQkJZGV2LT5jaGlsZHJlbiA9IE5VTEw7Ci0JCQlkZXYtPmJ1cyA9IGVidXM7Ci0JCQlmaWxsX2VidXNfZGV2aWNlKG5kLCBkZXYpOwotCQl9Ci0KLQluZXh0X2VidXM6Ci0JCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NVTiwKLQkJCQkgICAgICAgUENJX0RFVklDRV9JRF9TVU5fRUJVUywgcGRldik7Ci0JCWlmICghcGRldikKLQkJCWJyZWFrOwotCi0JCWNvb2tpZSA9IHBkZXYtPnN5c2RhdGE7Ci0JCWRwID0gY29va2llLT5wcm9tX25vZGU7Ci0KLQkJZWJ1cy0+bmV4dCA9IChzdHJ1Y3QgbGludXhfZWJ1cyAqKQotCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXMpKTsKLQkJZWJ1cyA9IGVidXMtPm5leHQ7Ci0JCWVidXMtPm5leHQgPSBOVUxMOwotCQkrK251bV9lYnVzOwotCX0KLQlpZiAocGRldikKLQkJcGNpX2Rldl9wdXQocGRldik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwppbmRleCBlOGNkZjcxLi5mYWY5Y2NkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKQEAgLTIwLDExICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL21lbXJlZy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpZmRlZiBDT05GSUdfU1VONAotI2luY2x1ZGUgPGFzbS9wZ3RzdW40Lmg+Ci0jZWxzZQogI2luY2x1ZGUgPGFzbS9wZ3RzdW40Yy5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YXNtL3dpbm1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS9vYmlvLmg+CkBAIC0yNzYsMTcgKzI3MiwxOCBAQAogCSAqLwogbWF5YmVfc21wNG1fbXNnOgogCUdFVF9QUk9DRVNTT1I0TV9JRChvMykKLQlzZXQJc3VuNG1faW50ZXJydXB0cywgJWw1Ci0JbGQJWyVsNV0sICVvNQorCXNldGhpCSVoaShzdW40bV9pcnFfcGVyY3B1KSwgJWw1CisJc2xsCSVvMywgMiwgJW8zCisJb3IJJWw1LCAlbG8oc3VuNG1faXJxX3BlcmNwdSksICVvNQogCXNldGhpCSVoaSgweDQwMDAwMDAwKSwgJW8yCi0Jc2xsCSVvMywgMTIsICVvMwogCWxkCVslbzUgKyAlbzNdLCAlbzEKLQlhbmRjYwklbzEsICVvMiwgJWcwCisJbGQJWyVvMSArIDB4MDBdLCAlbzMJISBzdW40bV9pcnFfcGVyY3B1W2NwdV0tPnBlbmRpbmcKKwlhbmRjYwklbzMsICVvMiwgJWcwCiAJYmUsYQlzbXA0bV90aWNrZXIKIAkgY21wCSVsNywgMTQKLQlzdAklbzIsIFslbzUgKyAweDRdCisJc3QJJW8yLCBbJW8xICsgMHgwNF0JISBzdW40bV9pcnFfcGVyY3B1W2NwdV0tPmNsZWFyPTB4NDAwMDAwMDAKIAlXUklURV9QQVVTRQotCWxkCVslbzVdLCAlZzAKKwlsZAlbJW8xICsgMHgwMF0sICVnMAkhIHN1bjRtX2lycV9wZXJjcHVbY3B1XS0+cGVuZGluZwogCVdSSVRFX1BBVVNFCiAJb3IJJWwwLCBQU1JfUElMLCAlbDQKIAl3cgklbDQsIDB4MCwgJXBzcgpAQCAtMzA0LDE2ICszMDEsMTYgQEAKIAlTQVZFX0FMTAogCXNldGhpCSVoaSgweDgwMDAwMDAwKSwgJW8yCiAJR0VUX1BST0NFU1NPUjRNX0lEKG8wKQotCXNldAlzdW40bV9pbnRlcnJ1cHRzLCAlbDUKLQlsZAlbJWw1XSwgJW81Ci0Jc2xsCSVvMCwgMTIsICVvMAotCWFkZAklbzUsICVvMCwgJW81Ci0JbGQJWyVvNV0sICVvMworCXNldGhpCSVoaShzdW40bV9pcnFfcGVyY3B1KSwgJWw1CisJb3IJJWw1LCAlbG8oc3VuNG1faXJxX3BlcmNwdSksICVvNQorCXNsbAklbzAsIDIsICVvMAorCWxkCVslbzUgKyAlbzBdLCAlbzUKKwlsZAlbJW81ICsgMHgwMF0sICVvMwkhIHN1bjRtX2lycV9wZXJjcHVbY3B1XS0+cGVuZGluZwogCWFuZGNjCSVvMywgJW8yLCAlZzAKIAliZQkxZgkJCSEgTXVzdCBiZSBhbiBOTUkgYXN5bmMgbWVtb3J5IGVycm9yCi0JIHN0CSVvMiwgWyVvNSArIDRdCisJIHN0CSVvMiwgWyVvNSArIDB4MDRdCSEgc3VuNG1faXJxX3BlcmNwdVtjcHVdLT5jbGVhcj0weDgwMDAwMDAwCiAJV1JJVEVfUEFVU0UKLQlsZAlbJW81XSwgJWcwCisJbGQJWyVvNSArIDB4MDBdLCAlZzAJISBzdW40bV9pcnFfcGVyY3B1W2NwdV0tPnBlbmRpbmcKIAlXUklURV9QQVVTRQogCW9yCSVsMCwgUFNSX1BJTCwgJWw0CiAJd3IJJWw0LCAweDAsICVwc3IKQEAgLTMyNywxMiArMzI0LDExIEBACiAxOgogCS8qIE5NSSBhc3luYyBtZW1vcnkgZXJyb3IgaGFuZGxpbmcuICovCiAJc2V0aGkJJWhpKDB4ODAwMDAwMDApLCAlbDQKLQlzZXRoaQklaGkoMHg0MDAwKSwgJW8zCi0Jc3ViCSVvNSwgJW8wLCAlbzUKLQlhZGQJJW81LCAlbzMsICVsNQotCXN0CSVsNCwgWyVsNSArIDB4Y10KKwlzZXRoaQklaGkoc3VuNG1faXJxX2dsb2JhbCksICVvNQorCWxkCVslbzUgKyAlbG8oc3VuNG1faXJxX2dsb2JhbCldLCAlbDUKKwlzdAklbDQsIFslbDUgKyAweDBjXQkhIHN1bjRtX2lycV9nbG9iYWwtPm1hc2tfc2V0PTB4ODAwMDAwMDAKIAlXUklURV9QQVVTRQotCWxkCVslbDVdLCAlZzAKKwlsZAlbJWw1ICsgMHgwMF0sICVnMAkhIHN1bjRtX2lycV9nbG9iYWwtPnBlbmRpbmcKIAlXUklURV9QQVVTRQogCW9yCSVsMCwgUFNSX1BJTCwgJWw0CiAJd3IJJWw0LCAweDAsICVwc3IKQEAgLTM0MSw5ICszMzcsOSBAQAogCVdSSVRFX1BBVVNFCiAJY2FsbAlzdW40bV9ubWkKIAkgbm9wCi0Jc3QJJWw0LCBbJWw1ICsgMHg4XQorCXN0CSVsNCwgWyVsNSArIDB4MDhdCSEgc3VuNG1faXJxX2dsb2JhbC0+bWFza19jbGVhcj0weDgwMDAwMDAwCiAJV1JJVEVfUEFVU0UKLQlsZAlbJWw1XSwgJWcwCisJbGQJWyVsNSArIDB4MDBdLCAlZzAJISBzdW40bV9pcnFfZ2xvYmFsLT5wZW5kaW5nCiAJV1JJVEVfUEFVU0UKIAlSRVNUT1JFX0FMTAogCkBAIC03NzUsMTEgKzc3MSw3IEBACiAgKiBVZ2x5LCBidXQgd2UgY2FudCB1c2UgaGFyZHdhcmUgZmx1c2hpbmcgb24gdGhlIHN1bjQgYW5kIHdlJ2QgcmVxdWlyZQogICogdHdvIGluc3RydWN0aW9ucyAoQW50b24pCiAgKi8KLSNpZmRlZiBDT05GSUdfU1VONAotdmFjX2h3Zmx1c2hfcGF0Y2gxX29uOgkJbm9wCi0jZWxzZQogdmFjX2h3Zmx1c2hfcGF0Y2gxX29uOgkJYWRkY2MJJWw3LCAtUEFHRV9TSVpFLCAlbDcKLSNlbmRpZgogCiB2YWNfaHdmbHVzaF9wYXRjaDJfb246CQlzdGEJJWcwLCBbJWwzICsgJWw3XSBBU0lfSFdGTFVTSFNFRwogCkBAIC03OTgsNDIgKzc5MCwxMCBAQAogISAlbDcgPSAxIGZvciB0ZXh0ZmF1bHQKICEgV2Ugd2FudCBlcnJvciBpbiAlbDUsIHZhZGRyIGluICVsNgogc3VuNGNfZmF1bHQ6Ci0jaWZkZWYgQ09ORklHX1NVTjQKLQlzZXRoaQklaGkoc3VuNGNfbWVtZXJyX3JlZyksICVsNAotCWxkCVslbDQrJWxvKHN1bjRjX21lbWVycl9yZWcpXSwgJWw0ICAhIG1lbWVyciBjdHJsIHJlZyBhZGRyCi0JbGQJWyVsNF0sICVsNgkJISBtZW1lcnIgY3RybCByZWcKLQlsZAlbJWw0ICsgNF0sICVsNQkJISBtZW1lcnIgdmFkZHIgcmVnCi0JYW5kY2MJJWw2LCAweDgwLCAlZzAJCSEgY2hlY2sgZm9yIGVycm9yIHR5cGUKLQlzdAklZzAsIFslbDQgKyA0XQkJISBjbGVhciB0aGUgZXJyb3IKLQliZQkwZgkJCSEgbm9ybWFsIGVycm9yCi0JIHNldGhpCSVoaShBQ19CVVNfRVJST1IpLCAlbDQJISBidXMgZXJyIHJlZyBhZGRyCi0KLQljYWxsCXByb21faGFsdAkhIHNvbWV0aGluZyB3ZWlyZCBoYXBwZW5lZAotCQkJCQkhIHdoYXQgZXhhY3RseSBkaWQgaGFwcGVuPwotCQkJCQkhIHdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/Ci0KLTA6CW9yCSVsNCwgJWxvKEFDX0JVU19FUlJPUiksICVsNAkhIGJ1cyBlcnIgcmVnIGFkZHIKLQlsZHViYQlbJWw0XSBBU0lfQ09OVFJPTCwgJWw2CSEgYnVzIGVyciByZWcKLQotCWNtcCAgICAlbDcsIDEJCQkhIHRleHQgZmF1bHQ/Ci0JYmUJMWYJCQkhIHllcwotCSBub3AKLQotCWxkICAgICBbJWwxXSwgJWw0CQkhIGxvYWQgaW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgZmF1bHQKLQlzcmwJJWw0LCAyMSwgJWw0Ci0JYW5kY2MJJWw0LCAxLCAlZzAJCSEgc3RvcmUgaW5zdHJ1Y3Rpb24/Ci0KLQliZQkxZgkJCSEgbm8KLQkgc2V0aGkJJWhpKFNVTjRDX1NZTkNfQkFEV1JJVEUpLCAlbDQgISB5ZXAKLQkJCQkJISAlbG8oU1VONENfU1lOQ19CQURXUklURSkgPSAwCi0Jb3IJJWw0LCAlbDYsICVsNgkJISBzZXQgd3JpdGUgYml0IHRvIGVtdWxhdGUgc3VuNGMKLTE6Ci0jZWxzZQogCXNldGhpCSVoaShBQ19TWU5DX0VSUiksICVsNAogCWFkZAklbDQsIDB4NCwgJWw2CQkJISBBQ19TWU5DX1ZBIGluICVsNgogCWxkYQlbJWw2XSBBU0lfQ09OVFJPTCwgJWw1CQkhIEFkZHJlc3MKIAlsZGEJWyVsNF0gQVNJX0NPTlRST0wsICVsNgkJISBFcnJvciwgcmV0YWluZWQgZm9yIGEgYml0Ci0jZW5kaWYKIAogCWFuZG4JJWw1LCAweGZmZiwgJWw1CQkJISBFbmNvZGUgYWxsIGluZm8gaW50byBsNwogCXNybAklbDYsIDE0LCAlbDQKQEAgLTg4MCwxMiArODQwLDcgQEAKIAlvciAgICAgICVsNCwgJWxvKHN3YXBwZXJfcGdfZGlyKSwgJWw0CiAJc2xsICAgICAlbDYsIDIsICVsNgogCWxkICAgICAgWyVsNCArICVsNl0sICVsNAotI2lmZGVmIENPTkZJR19TVU40Ci0Jc2V0aGkJJWhpKFBBR0VfTUFTSyksICVsNgotCWFuZGNjCSVsNCwgJWw2LCAlZzAKLSNlbHNlCiAJYW5kY2MgICAlbDQsIFBBR0VfTUFTSywgJWcwCi0jZW5kaWYKIAliZSAgICAgIHN1bjRjX2ZhdWx0X2Zyb211c2VyCiAJIGxkdVhhICBbJWw1XSBBU0lfU0VHTUFQLCAlbDQKIApAQCAtOTM3LDExICs4OTIsNyBAQAogCWxkCVslbDYgKyAweDA4XSwgJWwzCSEgdG1wID0gZW50cnktPnZhZGRyCiAKIAkhIEZsdXNoIHNlZ21lbnQgZnJvbSB0aGUgY2FjaGUuCi0jaWZkZWYgQ09ORklHX1NVTjQKLQlzZXRoaQklaGkoKDEyOCAqIDEwMjQpKSwgJWw3Ci0jZWxzZQogCXNldGhpCSVoaSgoNjQgKiAxMDI0KSksICVsNwotI2VuZGlmCiA5OgogdmFjX2h3Zmx1c2hfcGF0Y2gxOgogdmFjX2xpbmVzaXplX3BhdGNoOgpAQCAtMTAyOSwxMiArOTgwLDcgQEAKIAlvcgklbDQsICVsbyhzd2FwcGVyX3BnX2RpciksICVsNAogCXNsbAklbDMsIDIsICVsMwogCWxkCVslbDQgKyAlbDNdLCAlbDQKLSNpZm5kZWYgQ09ORklHX1NVTjQKIAlhbmQJJWw0LCBQQUdFX01BU0ssICVsNAotI2Vsc2UKLQlzZXRoaQklaGkoUEFHRV9NQVNLKSwgJWw2Ci0JYW5kCSVsNCwgJWw2LCAlbDQKLSNlbmRpZgogCiAJc3JsCSVsNSwgKFBBR0VfU0hJRlQgLSAyKSwgJWw2CiAJYW5kCSVsNiwgKChTVU40Q19QVFJTX1BFUl9QVEUgLSAxKSA8PCAyKSwgJWw2CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9oZWFkLlMKaW5kZXggNTBkOWExNi4uMmQzMjVmZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2hlYWQuUwpAQCAtNjMsMTUgKzYzLDkgQEAKIAogCS5hbGlnbiA0CiAKLSNpZm5kZWYgQ09ORklHX1NVTjQKIHN1bjRfbm90c3VwOgotCS5hc2NpegkiU3BhcmMtTGludXggc3VuNCBuZWVkcyBhIHNwZWNpYWxseSBjb21waWxlZCBrZXJuZWwsIHR1cm4gQ09ORklHX1NVTjQgb24uXG5cbiIKKwkuYXNjaXoJIlNwYXJjLUxpbnV4IHN1bjQgc3VwcG9ydCBkb2VzIG5vIGxvbmdlciBleGlzdC5cblxuIgogCS5hbGlnbiA0Ci0jZWxzZQotc3VuNGNkbV9ub3RzdXA6Ci0JLmFzY2l6CSJLZXJuZWwgY29tcGlsZWQgd2l0aCBDT05GSUdfU1VONCBjYW5ub3QgcnVuIG9uIFNVTjRDL1NVTjRNL1NVTjREXG5UdXJuIENPTkZJR19TVU40IG9mZi5cblxuIgotCS5hbGlnbiA0Ci0jZW5kaWYKIAogc3VuNGVfbm90c3VwOgogICAgICAgICAuYXNjaXogICJTcGFyYy1MaW51eCBzdW40ZSBzdXBwb3J0IGRvZXMgbm90IGV4aXN0XG5cbiIKQEAgLTc4MCwxNSArNzc0LDYgQEAKIAkJIG5vcAogCiBmb3VuZF92ZXJzaW9uOgotI2lmZGVmIENPTkZJR19TVU40Ci0vKiBGb3IgcGVvcGxlIHdobyB0cnkgc3VuNCBrZXJuZWxzLCBldmVuIGlmIENvbmZpZ3VyZS5oZWxwIGFkdmlzZXMgdGhlbS4gKi8KLQkJbGQJWyVnNyArIDB4NjhdLCAlbzEKLQkJc2V0CXN1bjRjZG1fbm90c3VwLCAlbzAKLQkJY2FsbAklbzEKLQkJIG5vcAotCQliCWhhbHRfbWUKLQkJIG5vcAotI2VuZGlmCiAvKiBHZXQgdGhlIG1hY2hpbmUgdHlwZSB2aWEgdGhlIG15c3RlcmlvdXMgcm9tdmVjIG5vZGUgb3BlcmF0aW9ucy4gKi8KIAogCQlhZGQJJWc3LCAweDFjLCAlbDEJCQpAQCAtMTE1MCwxNSArMTEzNSw2IEBACiAJCSBub3AKIAogc3VuNF9pbml0OgotI2lmZGVmIENPTkZJR19TVU40Ci0vKiBUaGVyZSwgaGFwcHkgbm93IEFkcmlhbj8gKi8KLQkJc2V0CWNwdXR5cHZhbCwgJW8yCQkhIExldCBldmVyeW9uZSBrbm93IHdlCi0JCXNldAknICcsICVvMAkJCSEgYXJlIGEgInN1bjQgIiBhcmNoaXRlY3R1cmUKLQkJc3RiCSVvMCwgWyVvMiArIDB4NF0JCQotCi0JCWIgZ290X3Byb3AgCi0JCSBub3AKLSNlbHNlCiAJCXNldGhpICAgJWhpKFNVTjRfUFJPTV9WRUNUT1IrMHg4NCksICVvMQogCQlsZCAgICAgIFslbzEgKyAlbG8oU1VONF9QUk9NX1ZFQ1RPUisweDg0KV0sICVvMQogCQlzZXQgICAgIHN1bjRfbm90c3VwLCAlbzAKQEAgLTExNzAsNyArMTE0Niw3IEBACiAJCSBub3AKIDE6CQliYSAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICEgQ2Fubm90IGV4aXQgaW50byBLTU9OCiAJCSBub3AKLSNlbmRpZgorCiBub19zdW40ZV9oZXJlOgogCQlsZAlbJWc3ICsgMHg2OF0sICVvMQogCQlzZXQJc3VuNGVfbm90c3VwLCAlbzAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lkcHJvbS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKaW5kZXggZmM1MTFmMy4uMjIzYTY1OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKQEAgLTEyLDEwICsxMiw2IEBACiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPiAgLyogRnVuIHdpdGggU3VuIHJlbGVhc2VkIGFyY2hpdGVjdHVyZXMuICovCi0jaWZkZWYgQ09ORklHX1NVTjQKLSNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+Ci1leHRlcm4gdm9pZCBzdW40c2V0dXAodm9pZCk7Ci0jZW5kaWYKIAogc3RydWN0IGlkcHJvbSAqaWRwcm9tOwogc3RhdGljIHN0cnVjdCBpZHByb20gaWRwcm9tX2J1ZmZlcjsKQEAgLTEwMSw3ICs5Nyw0IEBACiAJCSAgICBpZHByb20tPmlkX2V0aGFkZHJbMF0sIGlkcHJvbS0+aWRfZXRoYWRkclsxXSwKIAkJICAgIGlkcHJvbS0+aWRfZXRoYWRkclsyXSwgaWRwcm9tLT5pZF9ldGhhZGRyWzNdLAogCQkgICAgaWRwcm9tLT5pZF9ldGhhZGRyWzRdLCBpZHByb20tPmlkX2V0aGFkZHJbNV0pOwotI2lmZGVmIENPTkZJR19TVU40Ci0Jc3VuNHNldHVwKCk7Ci0jZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKaW5kZXggMmE4YTg0Ny4uNGYwMjViMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKQEAgLTQyLDEwICs0MiwxMyBAQAogI2luY2x1ZGUgPGFzbS92YWRkcnMuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vaW8tdW5pdC5oPgorCisjaW5jbHVkZSAiZG1hLmgiCiAKICNkZWZpbmUgbW11X2ludmFsX2RtYV9hcmVhKHAsIGwpCS8qIEFudG9uIHB1bGxlZCBpdCBvdXQgZm9yIDIuNC4wLXh4ICovCiAKQEAgLTEzOSwxNSArMTQyLDYgQEAKIAl9CiB9CiAKLS8qCi0gKi8KLXZvaWQgX19pb21lbSAqc2J1c19pb3JlbWFwKHN0cnVjdCByZXNvdXJjZSAqcGh5cmVzLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIF9zcGFyY19hbGxvY19pbyhwaHlyZXMtPmZsYWdzICYgMHhGLAotCSAgICBwaHlyZXMtPnN0YXJ0ICsgb2Zmc2V0LCBzaXplLCBuYW1lKTsKLX0KLQogdm9pZCBfX2lvbWVtICpvZl9pb3JlbWFwKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCSB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCiB7CkBAIC0xNjQsMTMgKzE1OCw2IEBACiBFWFBPUlRfU1lNQk9MKG9mX2lvdW5tYXApOwogCiAvKgotICovCi12b2lkIHNidXNfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpb3VubWFwKGFkZHIpOwotfQotCi0vKgogICogTWVhdCBvZiBtYXBwaW5nCiAgKi8KIHN0YXRpYyB2b2lkIF9faW9tZW0gKl9zcGFyY19hbGxvY19pbyh1bnNpZ25lZCBpbnQgYnVzbm8sIHVuc2lnbmVkIGxvbmcgcGh5cywKQEAgLTI0Niw2MyArMjMzLDE5IEBACiAKICNpZmRlZiBDT05GSUdfU0JVUwogCi12b2lkIHNidXNfc2V0X3NidXM2NChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCB4KQordm9pZCBzYnVzX3NldF9zYnVzNjQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgeCkKIHsKIAlwcmludGsoInNidXNfc2V0X3NidXM2NDogdW5zdXBwb3J0ZWRcbiIpOwogfQogCi1leHRlcm4gdW5zaWduZWQgaW50IHN1bjRkX2J1aWxkX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBpcnEpOwotdm9pZCBfX2luaXQgc2J1c19maWxsX2RldmljZV9pcnEoc3RydWN0IHNidXNfZGV2ICpzZGV2KQotewotCXN0cnVjdCBsaW51eF9wcm9tX2lycXMgaXJxc1tQUk9NSU5UUl9NQVhdOwotCWludCBsZW47Ci0KLQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImludHIiLAotCQkJICAgICAgIChjaGFyICopaXJxcywgc2l6ZW9mKGlycXMpKTsKLQlpZiAobGVuICE9IC0xKSB7Ci0JCXNkZXYtPm51bV9pcnFzID0gbGVuIC8gODsKLQkJaWYgKHNkZXYtPm51bV9pcnFzID09IDApIHsKLQkJCXNkZXYtPmlycXNbMF0gPSAwOwotCQl9IGVsc2UgaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgewotCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzZGV2LT5udW1faXJxczsgbGVuKyspCi0JCQkJc2Rldi0+aXJxc1tsZW5dID0KLQkJCQkJc3VuNGRfYnVpbGRfaXJxKHNkZXYsIGlycXNbbGVuXS5wcmkpOwotCQl9IGVsc2UgewotCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzZGV2LT5udW1faXJxczsgbGVuKyspCi0JCQkJc2Rldi0+aXJxc1tsZW5dID0gaXJxc1tsZW5dLnByaTsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBpbnRlcnJ1cHRzW1BST01JTlRSX01BWF07Ci0KLQkJLyogTm8gImludHIiIG5vZGUgZm91bmQtLSBjaGVjayBmb3IgImludGVycnVwdHMiIG5vZGUuCi0JCSAqIFRoaXMgbm9kZSBjb250YWlucyBTQnVzIGludGVycnVwdCBsZXZlbHMsIG5vdCBJUExzCi0JCSAqIGFzIGluICJpbnRyIiwgYW5kIG5vIHZlY3RvciB2YWx1ZXMuICBXZSBjb252ZXJ0Ci0JCSAqIFNCdXMgaW50ZXJydXB0IGxldmVscyB0byBQSUxzIChwbGF0Zm9ybSBzcGVjaWZpYykuCi0JCSAqLwotCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImludGVycnVwdHMiLAotCQkJCSAgICAgICAoY2hhciAqKWludGVycnVwdHMsIHNpemVvZihpbnRlcnJ1cHRzKSk7Ci0JCWlmIChsZW4gPT0gLTEpIHsKLQkJCXNkZXYtPmlycXNbMF0gPSAwOwotCQkJc2Rldi0+bnVtX2lycXMgPSAwOwotCQl9IGVsc2UgewotCQkJc2Rldi0+bnVtX2lycXMgPSBsZW4gLyBzaXplb2YoaW50KTsKLQkJCWZvciAobGVuID0gMDsgbGVuIDwgc2Rldi0+bnVtX2lycXM7IGxlbisrKSB7Ci0JCQkJc2Rldi0+aXJxc1tsZW5dID0KLQkJCQkJc2JpbnRfdG9faXJxKHNkZXYsIGludGVycnVwdHNbbGVuXSk7Ci0JCQl9Ci0JCX0KLQl9IAotfQotCiAvKgogICogQWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkgc3VpdGFibGUgZm9yIERNQS4KICAqIFR5cGljYWxseSBkZXZpY2VzIHVzZSB0aGVtIGZvciBjb250cm9sIGJsb2Nrcy4KICAqIENQVSBtYXkgYWNjZXNzIHRoZW0gd2l0aG91dCBhbnkgZXhwbGljaXQgZmx1c2hpbmcuCi0gKgotICogWFhYIFNvbWUgY2xldmVyIHBlb3BsZSBrbm93IHRoYXQgc2RldiBpcyBub3QgdXNlZCBhbmQgc3VwcGx5IE5VTEwuIFdhdGNoLgogICovCi12b2lkICpzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBsb25nIGxlbiwgdTMyICpkbWFfYWRkcnApCit2b2lkICpzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBsb25nIGxlbiwgdTMyICpkbWFfYWRkcnApCiB7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSB0b19vZl9kZXZpY2UoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGxlbl90b3RhbCA9IChsZW4gKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0s7CiAJdW5zaWduZWQgbG9uZyB2YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTMzNiwxMyArMjc5LDEwIEBACiAJICogWFhYIFRoYXQncyB3aGVyZSBzZGV2IHdvdWxkIGJlIHVzZWQuIEN1cnJlbnRseSB3ZSBsb2FkCiAJICogYWxsIGlvbW11IHRhYmxlcyB3aXRoIHRoZSBzYW1lIHRyYW5zbGF0aW9ucy4KIAkgKi8KLQlpZiAobW11X21hcF9kbWFfYXJlYShkbWFfYWRkcnAsIHZhLCByZXMtPnN0YXJ0LCBsZW5fdG90YWwpICE9IDApCisJaWYgKG1tdV9tYXBfZG1hX2FyZWEoZGV2LCBkbWFfYWRkcnAsIHZhLCByZXMtPnN0YXJ0LCBsZW5fdG90YWwpICE9IDApCiAJCWdvdG8gZXJyX25vaW9tbXU7CiAKLQkvKiBTZXQgdGhlIHJlc291cmNlIG5hbWUsIGlmIGtub3duLiAqLwotCWlmIChzZGV2KSB7Ci0JCXJlcy0+bmFtZSA9IHNkZXYtPnByb21fbmFtZTsKLQl9CisJcmVzLT5uYW1lID0gb3AtPm5vZGUtPm5hbWU7CiAKIAlyZXR1cm4gKHZvaWQgKikodW5zaWduZWQgbG9uZylyZXMtPnN0YXJ0OwogCkBAIC0zNTYsNyArMjk2LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBzYnVzX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGxvbmcgbiwgdm9pZCAqcCwgdTMyIGJhKQordm9pZCBzYnVzX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGxvbmcgbiwgdm9pZCAqcCwgdTMyIGJhKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwYWdlICpwZ3Y7CkBAIC0zODMsOCArMzIzLDggQEAKIAlrZnJlZShyZXMpOwogCiAJLyogbW11X2ludmFsX2RtYV9hcmVhKHZhLCBuKTsgKi8gLyogaXQncyBjb25zaXN0ZW50LCBpc24ndCBpdCAqLwotCXBndiA9IG1tdV90cmFuc2xhdGVfZHZtYShiYSk7Ci0JbW11X3VubWFwX2RtYV9hcmVhKGJhLCBuKTsKKwlwZ3YgPSB2aXJ0X3RvX3BhZ2UocCk7CisJbW11X3VubWFwX2RtYV9hcmVhKGRldiwgYmEsIG4pOwogCiAJX19mcmVlX3BhZ2VzKHBndiwgZ2V0X29yZGVyKG4pKTsKIH0KQEAgLTM5NCw3ICszMzQsNyBAQAogICogQ1BVIHZpZXcgb2YgdGhpcyBtZW1vcnkgbWF5IGJlIGluY29uc2lzdGVudCB3aXRoCiAgKiBhIGRldmljZSB2aWV3IGFuZCBleHBsaWNpdCBmbHVzaGluZyBpcyBuZWNlc3NhcnkuCiAgKi8KLWRtYV9hZGRyX3Qgc2J1c19tYXBfc2luZ2xlKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgdm9pZCAqdmEsIHNpemVfdCBsZW4sIGludCBkaXJlY3Rpb24pCitkbWFfYWRkcl90IHNidXNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhLCBzaXplX3QgbGVuLCBpbnQgZGlyZWN0aW9uKQogewogCS8qIFhYWCB3aHkgYXJlIHNvbWUgbGVuZ3RocyBzaWduZWQsIG90aGVycyB1bnNpZ25lZD8gKi8KIAlpZiAobGVuIDw9IDApIHsKQEAgLTQwNCwxNyArMzQ0LDE3IEBACiAJaWYgKGxlbiA+IDI1NioxMDI0KSB7CQkJLyogX19nZXRfZnJlZV9wYWdlcygpIGxpbWl0ICovCiAJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gbW11X2dldF9zY3NpX29uZSh2YSwgbGVuLCBzZGV2LT5idXMpOworCXJldHVybiBtbXVfZ2V0X3Njc2lfb25lKGRldiwgdmEsIGxlbik7CiB9CiAKLXZvaWQgc2J1c191bm1hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBkbWFfYWRkcl90IGJhLCBzaXplX3QgbiwgaW50IGRpcmVjdGlvbikKK3ZvaWQgc2J1c191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGJhLCBzaXplX3QgbiwgaW50IGRpcmVjdGlvbikKIHsKLQltbXVfcmVsZWFzZV9zY3NpX29uZShiYSwgbiwgc2Rldi0+YnVzKTsKKwltbXVfcmVsZWFzZV9zY3NpX29uZShkZXYsIGJhLCBuKTsKIH0KIAotaW50IHNidXNfbWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG4sIGludCBkaXJlY3Rpb24pCitpbnQgc2J1c19tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbiwgaW50IGRpcmVjdGlvbikKIHsKLQltbXVfZ2V0X3Njc2lfc2dsKHNnLCBuLCBzZGV2LT5idXMpOworCW1tdV9nZXRfc2NzaV9zZ2woZGV2LCBzZywgbik7CiAKIAkvKgogCSAqIFhYWCBzcGFyYzY0IGNhbiByZXR1cm4gYSBwYXJ0aWFsIGxlbmd0aCBoZXJlLiBzdW40YyBzaG91bGQgZG8gdGhpcwpAQCAtNDIzLDE0NSArMzYzLDI4IEBACiAJcmV0dXJuIG47CiB9CiAKLXZvaWQgc2J1c191bm1hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuLCBpbnQgZGlyZWN0aW9uKQordm9pZCBzYnVzX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG4sIGludCBkaXJlY3Rpb24pCiB7Ci0JbW11X3JlbGVhc2Vfc2NzaV9zZ2woc2csIG4sIHNkZXYtPmJ1cyk7CisJbW11X3JlbGVhc2Vfc2NzaV9zZ2woZGV2LCBzZywgbik7CiB9CiAKLS8qCi0gKi8KLXZvaWQgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGRtYV9hZGRyX3QgYmEsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQordm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBiYSwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7Ci0jaWYgMAotCXVuc2lnbmVkIGxvbmcgdmE7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgcmVzb3VyY2UsIGp1c3QgcHJpbnQgYSBtZXNzYWdlIGlmIGludmFsaWQuICovCi0JcmVzID0gX3NwYXJjX2ZpbmRfcmVzb3VyY2UoJl9zcGFyY19kdm1hLCBiYSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlwYW5pYygic2J1c19kbWFfc3luY19zaW5nbGU6IDB4JXhcbiIsIGJhKTsKLQotCXZhID0gcGFnZV9hZGRyZXNzKG1tdV90cmFuc2xhdGVfZHZtYShiYSkpOyAvKiBYWFggaGlnbWVtICovCi0JLyoKLQkgKiBYWFggVGhpcyBib2dvc2l0eSB3aWxsIGJlIGZpeGVkIHdpdGggdGhlIGlvbW11IHJld3JpdGUgY29taW5nIHNvb24KLQkgKiB0byBhIGtlcm5lbCBuZWFyIHlvdS4gLSBBbnRvbgotCSAqLwotCS8qIG1tdV9pbnZhbF9kbWFfYXJlYSh2YSwgKHNpemUgKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0spOyAqLwotI2VuZGlmCiB9CiAKLXZvaWQgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGRtYV9hZGRyX3QgYmEsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQordm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBiYSwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7Ci0jaWYgMAotCXVuc2lnbmVkIGxvbmcgdmE7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgcmVzb3VyY2UsIGp1c3QgcHJpbnQgYSBtZXNzYWdlIGlmIGludmFsaWQuICovCi0JcmVzID0gX3NwYXJjX2ZpbmRfcmVzb3VyY2UoJl9zcGFyY19kdm1hLCBiYSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlwYW5pYygic2J1c19kbWFfc3luY19zaW5nbGU6IDB4JXhcbiIsIGJhKTsKLQotCXZhID0gcGFnZV9hZGRyZXNzKG1tdV90cmFuc2xhdGVfZHZtYShiYSkpOyAvKiBYWFggaGlnbWVtICovCi0JLyoKLQkgKiBYWFggVGhpcyBib2dvc2l0eSB3aWxsIGJlIGZpeGVkIHdpdGggdGhlIGlvbW11IHJld3JpdGUgY29taW5nIHNvb24KLQkgKiB0byBhIGtlcm5lbCBuZWFyIHlvdS4gLSBBbnRvbgotCSAqLwotCS8qIG1tdV9pbnZhbF9kbWFfYXJlYSh2YSwgKHNpemUgKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0spOyAqLwotI2VuZGlmCiB9CiAKLXZvaWQgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG4sIGludCBkaXJlY3Rpb24pCi17Ci0JcHJpbnRrKCJzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHU6IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwotfQotCi12b2lkIHNidXNfZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuLCBpbnQgZGlyZWN0aW9uKQotewotCXByaW50aygic2J1c19kbWFfc3luY19zZ19mb3JfZGV2aWNlOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKLX0KLQotLyogU3VwcG9ydCBjb2RlIGZvciBzYnVzX2luaXQoKS4gICovCi0vKgotICogWFhYIFRoaXMgZnVuY3Rpb25zIGFwcGVhcnMgdG8gYmUgYSBkaXN0b3J0ZWQgdmVyc2lvbiBvZgotICogcHJvbV9zYnVzX3Jhbmdlc19pbml0KCksIHdpdGggYWxsIHN1bjRkIHN0dWZmIGN1dCBhd2F5LgotICogQXNrIERhdmVNIHdoYXQgaXMgZ29pbmcgb24gaGVyZSwgaG93IGlzIHN1bjRkIHN1cHBvc2VkIHRvIHdvcmsuLi4gWFhYCi0gKi8KLS8qIGFkZGVkIGJhY2sgc3VuNGQgcGF0Y2ggZnJvbSBUaG9tYXMgQm9nZW5kb2VyZmVyIC0gc2hvdWxkIGJlIE9LIChjcm4pICovCi12b2lkIF9faW5pdCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqcG4sIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLXsKLQlpbnQgcGFyZW50X25vZGUgPSBwbi0+bm9kZTsKLQotCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKLQkJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIGlvdW5pdF9yYW5nZXNbUFJPTVJFR19NQVhdOwotCQlpbnQgbnVtX2lvdW5pdF9yYW5nZXMsIGxlbjsKLQotCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHBhcmVudF9ub2RlLCAicmFuZ2VzIiwKLQkJCQkgICAgICAgKGNoYXIgKikgaW91bml0X3JhbmdlcywKLQkJCQkgICAgICAgc2l6ZW9mIChpb3VuaXRfcmFuZ2VzKSk7Ci0JCWlmIChsZW4gIT0gLTEpIHsKLQkJCW51bV9pb3VuaXRfcmFuZ2VzID0KLQkJCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwotCQkJcHJvbV9hZGp1c3RfcmFuZ2VzKHNidXMtPnNidXNfcmFuZ2VzLAotCQkJCQkgICBzYnVzLT5udW1fc2J1c19yYW5nZXMsCi0JCQkJCSAgIGlvdW5pdF9yYW5nZXMsIG51bV9pb3VuaXRfcmFuZ2VzKTsKLQkJfQotCX0KLX0KLQotdm9pZCBfX2luaXQgc2J1c19zZXR1cF9pb21tdShzdHJ1Y3Qgc2J1c19idXMgKnNidXMsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0jaWZuZGVmIENPTkZJR19TVU40Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OwotCi0JaWYgKHNwYXJjX2NwdV9tb2RlbCAhPSBzdW40ZCAmJgotCSAgICBwYXJlbnQgIT0gTlVMTCAmJgotCSAgICAhc3RyY21wKHBhcmVudC0+bmFtZSwgImlvbW11IikpIHsKLQkJZXh0ZXJuIHZvaWQgaW9tbXVfaW5pdChpbnQgaW9tbXVfbm9kZSwgc3RydWN0IHNidXNfYnVzICpzYnVzKTsKLQotCQlpb21tdV9pbml0KHBhcmVudC0+bm9kZSwgc2J1cyk7Ci0JfQotCi0JaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgewotCQlleHRlcm4gdm9pZCBpb3VuaXRfaW5pdChpbnQgc2JpX25vZGUsIGludCBpb3VuaXRfbm9kZSwKLQkJCQkJc3RydWN0IHNidXNfYnVzICpzYnVzKTsKLQotCQlpb3VuaXRfaW5pdChkcC0+bm9kZSwgcGFyZW50LT5ub2RlLCBzYnVzKTsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBfX2luaXQgc2J1c19zZXR1cF9hcmNoX3Byb3BzKHN0cnVjdCBzYnVzX2J1cyAqc2J1cywgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gZHAtPnBhcmVudDsKLQotCQlzYnVzLT5kZXZpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChwYXJlbnQsICJkZXZpY2UtaWQiLCAwKTsKLQkJc2J1cy0+Ym9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQocGFyZW50LCAiYm9hcmQjIiwgMCk7Ci0JfQotfQotCi1pbnQgX19pbml0IHNidXNfYXJjaF9wcmVpbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzcGFyY19yZWdpc3Rlcl9pb3BvcnQodm9pZCkKIHsKIAlyZWdpc3Rlcl9wcm9jX3NwYXJjX2lvcG9ydCgpOwogCi0jaWZkZWYgQ09ORklHX1NVTjQKLQl7Ci0JCWV4dGVybiB2b2lkIHN1bjRfZHZtYV9pbml0KHZvaWQpOwotCQlzdW40X2R2bWFfaW5pdCgpOwotCX0KLQlyZXR1cm4gMTsKLSNlbHNlCiAJcmV0dXJuIDA7Ci0jZW5kaWYKIH0KIAotdm9pZCBfX2luaXQgc2J1c19hcmNoX3Bvc3Rpbml0KHZvaWQpCi17Ci0JaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgewotCQlleHRlcm4gdm9pZCBzdW40ZF9pbml0X3NiaV9pcnEodm9pZCk7Ci0JCXN1bjRkX2luaXRfc2JpX2lycSgpOwotCX0KLX0KK2FyY2hfaW5pdGNhbGwoc3BhcmNfcmVnaXN0ZXJfaW9wb3J0KTsKKwogI2VuZGlmIC8qIENPTkZJR19TQlVTICovCiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuaCBiL2FyY2gvc3BhcmMva2VybmVsL2lycS5oCmluZGV4IDMyZWYzZWIuLmRiNzUxMzggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lycS5oCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lycS5oCkBAIC0xMyw3ICsxMyw2IEBACiBCVEZJWFVQREVGX0NBTEwodm9pZCwgZGlzYWJsZV9waWxfaXJxLCB1bnNpZ25lZCBpbnQpCiBCVEZJWFVQREVGX0NBTEwodm9pZCwgZW5hYmxlX3BpbF9pcnEsIHVuc2lnbmVkIGludCkKIEJURklYVVBERUZfQ0FMTCh2b2lkLCBjbGVhcl9jbG9ja19pcnEsIHZvaWQpCi1CVEZJWFVQREVGX0NBTEwodm9pZCwgY2xlYXJfcHJvZmlsZV9pcnEsIGludCkKIEJURklYVVBERUZfQ0FMTCh2b2lkLCBsb2FkX3Byb2ZpbGVfaXJxLCBpbnQsIHVuc2lnbmVkIGludCkKIAogc3RhdGljIGlubGluZSB2b2lkIF9fZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTQxLDExICs0MCw2IEBACiAJQlRGSVhVUF9DQUxMKGNsZWFyX2Nsb2NrX2lycSkoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3Byb2ZpbGVfaXJxKGludCBpcnEpCi17Ci0JQlRGSVhVUF9DQUxMKGNsZWFyX3Byb2ZpbGVfaXJxKShpcnEpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9wcm9maWxlX2lycShpbnQgY3B1LCBpbnQgbGltaXQpCiB7CiAJQlRGSVhVUF9DQUxMKGxvYWRfcHJvZmlsZV9pcnEpKGNwdSwgbGltaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCBjNDgxZDQ1Li4wODM3YmQ1MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCkBAIC0yOSwxNSArMjksMzggQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZmluZF9kZXZpY2VfYnlfbm9kZSk7CiAKLSNpZmRlZiBDT05GSUdfUENJCi1zdHJ1Y3QgYnVzX3R5cGUgZWJ1c19idXNfdHlwZTsKLUVYUE9SVF9TWU1CT0woZWJ1c19idXNfdHlwZSk7Ci0jZW5kaWYKK3Vuc2lnbmVkIGludCBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobm9kZSk7CiAKLSNpZmRlZiBDT05GSUdfU0JVUwotc3RydWN0IGJ1c190eXBlIHNidXNfYnVzX3R5cGU7Ci1FWFBPUlRfU1lNQk9MKHNidXNfYnVzX3R5cGUpOwotI2VuZGlmCisJaWYgKCFvcCB8fCBpbmRleCA+PSBvcC0+bnVtX2lycXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIG9wLT5pcnFzW2luZGV4XTsKK30KK0VYUE9SVF9TWU1CT0woaXJxX29mX3BhcnNlX2FuZF9tYXApOworCisvKiBUYWtlIHRoZSBhcmNoZGF0YSB2YWx1ZXMgZm9yIElPTU1VLCBTVEMsIGFuZCBIT1NUREFUQSBmb3VuZCBpbgorICogQlVTIGFuZCBwcm9wYWdhdGUgdG8gYWxsIGNoaWxkIG9mX2RldmljZSBvYmplY3RzLgorICovCit2b2lkIG9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShzdHJ1Y3Qgb2ZfZGV2aWNlICpidXMpCit7CisJc3RydWN0IGRldl9hcmNoZGF0YSAqYnVzX3NkID0gJmJ1cy0+ZGV2LmFyY2hkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzX2RwID0gYnVzLT5ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisKKwlmb3IgKGRwID0gYnVzX2RwLT5jaGlsZDsgZHA7IGRwID0gZHAtPnNpYmxpbmcpIHsKKwkJc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKKworCQlvcC0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gYnVzX3NkLT5pb21tdTsKKwkJb3AtPmRldi5hcmNoZGF0YS5zdGMgPSBidXNfc2QtPnN0YzsKKwkJb3AtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXIgPSBidXNfc2QtPmhvc3RfY29udHJvbGxlcjsKKwkJb3AtPmRldi5hcmNoZGF0YS5udW1hX25vZGUgPSBidXNfc2QtPm51bWFfbm9kZTsKKworCQlpZiAoZHAtPmNoaWxkKQorCQkJb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKG9wKTsKKwl9Cit9CiAKIHN0cnVjdCBidXNfdHlwZSBvZl9wbGF0Zm9ybV9idXNfdHlwZTsKIEVYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwpAQCAtMjQxLDcgKzI2NCw3IEBACiAJcmV0dXJuIG9mX2J1c19kZWZhdWx0X21hcChhZGRyLCByYW5nZSwgbmEsIG5zLCBwbmEpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19zYnVzX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZl9idXNfc2J1c19nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXJldHVybiBJT1JFU09VUkNFX01FTTsKIH0KQEAgLTMyNyw2ICszNTAsMjcgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgdXNlXzF0bzFfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwKQoreworCS8qIElmIHdlIGhhdmUgYSByYW5nZXMgcHJvcGVydHkgaW4gdGhlIHBhcmVudCwgdXNlIGl0LiAgKi8KKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShwcCwgInJhbmdlcyIsIE5VTEwpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJLyogU29tZSBTQlVTIGRldmljZXMgdXNlIGludGVybWVkaWF0ZSBub2RlcyB0byBleHByZXNzCisJICogaGllcmFyY2h5IHdpdGhpbiB0aGUgZGV2aWNlIGl0c2VsZi4gIFRoZXNlIGFyZW4ndAorCSAqIHJlYWwgYnVzIG5vZGVzLCBhbmQgZG9uJ3QgaGF2ZSBhICdyYW5nZXMnIHByb3BlcnR5LgorCSAqIEJ1dCwgd2Ugc2hvdWxkIHN0aWxsIHBhc3MgdGhlIHRyYW5zbGF0aW9uIHdvcmsgdXAKKwkgKiB0byB0aGUgU0JVUyBpdHNlbGYuCisJICovCisJaWYgKCFzdHJjbXAocHAtPm5hbWUsICJkbWEiKSB8fAorCSAgICAhc3RyY21wKHBwLT5uYW1lLCAiZXNwZG1hIikgfHwKKwkgICAgIXN0cmNtcChwcC0+bmFtZSwgImxlZG1hIikgfHwKKwkgICAgIXN0cmNtcChwcC0+bmFtZSwgImxlYnVmZmVyIikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgb2ZfcmVzb3VyY2VfdmVyYm9zZTsKIAogc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IG9mX2RldmljZSAqb3AsCkBAIC0zNzMsMTAgKzQxNyw3IEBACiAKIAkJZmxhZ3MgPSBidXMtPmdldF9mbGFncyhyZWcsIDApOwogCi0JCS8qIElmIHRoZSBpbW1lZGlhdGUgcGFyZW50IGhhcyBubyByYW5nZXMgcHJvcGVydHkgdG8gYXBwbHksCi0JCSAqIGp1c3QgdXNlIGEgMTwtPjEgbWFwcGluZy4KLQkJICovCi0JCWlmIChvZl9maW5kX3Byb3BlcnR5KHBwLCAicmFuZ2VzIiwgTlVMTCkgPT0gTlVMTCkgeworCQlpZiAodXNlXzF0bzFfbWFwcGluZyhwcCkpIHsKIAkJCXJlc3VsdCA9IG9mX3JlYWRfYWRkcihhZGRyLCBuYSk7CiAJCQlnb3RvIGJ1aWxkX3JlczsKIAkJfQpAQCAtNTY1LDE1ICs2MDYsNiBAQAogCWludCBlcnI7CiAKIAllcnIgPSBvZl9idXNfdHlwZV9pbml0KCZvZl9wbGF0Zm9ybV9idXNfdHlwZSwgIm9mIik7Ci0jaWZkZWYgQ09ORklHX1BDSQotCWlmICghZXJyKQotCQllcnIgPSBvZl9idXNfdHlwZV9pbml0KCZlYnVzX2J1c190eXBlLCAiZWJ1cyIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NCVVMKLQlpZiAoIWVycikKLQkJZXJyID0gb2ZfYnVzX3R5cGVfaW5pdCgmc2J1c19idXNfdHlwZSwgInNidXMiKTsKLSNlbmRpZgotCiAJaWYgKCFlcnIpCiAJCXNjYW5fb2ZfZGV2aWNlcygpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKaW5kZXggYTZhNmY5OC4uNDYyNTg0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtMTcsOCArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+IC8qIGZvciBzYW5pdHkgY2hlY2suLi4gKi8KICNpbmNsdWRlIDxhc20vc3dpZnQuaD4gLyogZm9yIGNhY2hlIGZsdXNoaW5nLiAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC00MzAsNyArNDI4LDYgQEAKIAogCXBjaWNfcGJtX3NjYW5fYnVzKHBjaWMpOwogCi0JZWJ1c19pbml0KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5MywxMCArNDkwLDYgQEAKIAkJCQkgKiBkbyBpb3JlbWFwKCkgYmVmb3JlIGFjY2Vzc2luZyBQQy1zdHlsZSBJL08sCiAJCQkJICogd2Ugc3VwcGx5IHZpcnR1YWwsIHJlYWR5IHRvIGFjY2VzcyBhZGRyZXNzLgogCQkJCSAqCi0JCQkJICogRWJ1cyBkZXZpY2VzIGRvIG5vdCBjb21lIGhlcmUgZXZlbiBpZgotCQkJCSAqIENoZWVySU8gbWFrZXMgYSBzaW1pbGFyIGNvbnZlcnNpb24uCi0JCQkJICogU2VlIGVidXMuYyBmb3IgZGV0YWlscy4KLQkJCQkgKgogCQkJCSAqIE5vdGUgdGhhdCByZXF1ZXN0X3JlZ2lvbigpCiAJCQkJICogd29ya3MgZm9yIHRoZXNlIGRldmljZXMuCiAJCQkJICoKQEAgLTY3Nyw3ICs2NzAsNyBAQAogfQogCiAvKgotICogcGNpY19waW5fdG9faXJxKCkgaXMgZXhwb3J0ZWQgdG8gZWJ1cy5jLgorICogcGNpY19waW5fdG9faXJxKCkgaXMgZXhwb3J0ZWQgdG8gYnVzIHByb2JpbmcgY29kZQogICovCiB1bnNpZ25lZCBpbnQKIHBjaWNfcGluX3RvX2lycSh1bnNpZ25lZCBpbnQgcGluLCBjb25zdCBjaGFyICpuYW1lKQpAQCAtOTA0LDExICs4OTcsNiBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpY19jbGVhcl9wcm9maWxlX2lycShpbnQgY3B1KQotewotCXByaW50aygiUENJQzogdW5pbXBsZW1lbnRlZCBjb2RlOiBGSUxFPSVzIExJTkU9JWQiLCBfX0ZJTEVfXywgX19MSU5FX18pOwotfQotCiBzdGF0aWMgdm9pZCBwY2ljX2xvYWRfcHJvZmlsZV9pcnEoaW50IGNwdSwgdW5zaWduZWQgaW50IGxpbWl0KQogewogCXByaW50aygiUENJQzogdW5pbXBsZW1lbnRlZCBjb2RlOiBGSUxFPSVzIExJTkU9JWQiLCBfX0ZJTEVfXywgX19MSU5FX18pOwpAQCAtOTM0LDcgKzkyMiw2IEBACiAJQlRGSVhVUFNFVF9DQUxMKGVuYWJsZV9waWxfaXJxLCBwY2ljX2VuYWJsZV9waWxfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZGlzYWJsZV9waWxfaXJxLCBwY2ljX2Rpc2FibGVfcGlsX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKGNsZWFyX2Nsb2NrX2lycSwgcGNpY19jbGVhcl9jbG9ja19pcnEsIEJURklYVVBDQUxMX05PUk0pOwotCUJURklYVVBTRVRfQ0FMTChjbGVhcl9wcm9maWxlX2lycSwgcGNpY19jbGVhcl9wcm9maWxlX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKGxvYWRfcHJvZmlsZV9pcnEsIHBjaWNfbG9hZF9wcm9maWxlX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKaW5kZXggN2VjYTg4Ny4uMmFmY2ZhYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG1jLmMKQEAgLTgsMTEgKzgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CkBAIC0yMywxNyArMjMsMTUgQEAKICAqICNkZWZpbmUgUE1DX05PX0lETEUKICAqLwogCi0jZGVmaW5lIFBNQ19NSU5PUglNSVNDX0RZTkFNSUNfTUlOT1IKICNkZWZpbmUgUE1DX09CUE5BTUUJIlNVTlcscG1jIgogI2RlZmluZSBQTUNfREVWTkFNRSAicG1jIgogCiAjZGVmaW5lIFBNQ19JRExFX1JFRwkweDAwCiAjZGVmaW5lIFBNQ19JRExFX09OCQkweDAxCiAKLXZvbGF0aWxlIHN0YXRpYyB1OCBfX2lvbWVtICpyZWdzOyAKLXN0YXRpYyBpbnQgcG1jX3JlZ3NpemU7CitzdGF0aWMgdTggX19pb21lbSAqcmVnczsKIAotI2RlZmluZSBwbWNfcmVhZGIob2ZmcykJCQkoc2J1c19yZWFkYihyZWdzK29mZnMpKQorI2RlZmluZSBwbWNfcmVhZGIob2ZmcykJCShzYnVzX3JlYWRiKHJlZ3Mrb2ZmcykpCiAjZGVmaW5lIHBtY193cml0ZWIodmFsLCBvZmZzKSAJKHNidXNfd3JpdGViKHZhbCwgcmVncytvZmZzKSkKIAogLyogCkBAIC01MywzMSArNTEsMTEgQEAKICNlbmRpZgogfSAKIAotc3RhdGljIGlubGluZSB2b2lkIHBtY19mcmVlKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbWNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc2J1c19pb3VubWFwKHJlZ3MsIHBtY19yZWdzaXplKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcG1jX3Byb2JlKHZvaWQpCi17Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzID0gTlVMTDsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOwotCWZvcl9lYWNoX3NidXMoc2J1cykgewotCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJCWlmICghc3RyY21wKHNkZXYtPnByb21fbmFtZSwgUE1DX09CUE5BTUUpKSB7Ci0JCQkJZ290byBzYnVzX2RvbmU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLXNidXNfZG9uZToKLQlpZiAoIXNkZXYpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcG1jX3JlZ3NpemUgPSBzZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemU7Ci0JcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsIAotCQkJCSAgIHBtY19yZWdzaXplLCBQTUNfT0JQTkFNRSk7CisJcmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSwgUE1DX09CUE5BTUUpOwogCWlmICghcmVncykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gbWFwIHJlZ2lzdGVyc1xuIiwgUE1DX0RFVk5BTUUpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTkyLDggKzcwLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgcG1jX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9IFBNQ19PQlBOQU1FLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcG1jX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgcG1jX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicG1jIiwKKwkubWF0Y2hfdGFibGUJPSBwbWNfbWF0Y2gsCisJLnByb2JlCQk9IHBtY19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBtY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmcG1jX2RyaXZlciwgJm9mX2J1c190eXBlKTsKK30KKwogLyogVGhpcyBkcml2ZXIgaXMgbm90IGNyaXRpY2FsIHRvIHRoZSBib290IHByb2Nlc3MKICAqIGFuZCBpcyBlYXNpZXN0IHRvIGlvcmVtYXAgd2hlbiBTQnVzIGlzIGFscmVhZHkKICAqIGluaXRpYWxpemVkLCBzbyB3ZSBpbnN0YWxsIG91cnNlbHZlcyB0aHVzbHk6CiAgKi8KLV9faW5pdGNhbGwocG1jX3Byb2JlKTsKK19faW5pdGNhbGwocG1jX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDRiYjQzMDkuLmU4YzQzZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTc1LDcgKzc1LDcgQEAKIHsKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwogCWZvciAoOzspIHsKLQkJaWYgKEFSQ0hfU1VONENfU1VONCkgeworCQlpZiAoQVJDSF9TVU40QykgewogCQkJc3RhdGljIGludCBjb3VudCA9IEhaOwogCQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOwogCQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9mYXVsdHM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKaW5kZXggY2Q0ZmI3OS4uZWVlNWVmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpAQCAtNTQsNiArNTQsOSBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRpbnRwcm9wX2RlZmF1bHQpOwogCitERUZJTkVfTVVURVgob2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKK0VYUE9SVF9TWU1CT0wob2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKKwogaW50IG9mX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pCiB7CiAJc3RydWN0IHByb3BlcnR5ICoqcHJldnA7CkBAIC03Nyw3ICs4MCwxMCBAQAogCQkJdm9pZCAqb2xkX3ZhbCA9IHByb3AtPnZhbHVlOwogCQkJaW50IHJldDsKIAorCQkJbXV0ZXhfbG9jaygmb2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKIAkJCXJldCA9IHByb21fc2V0cHJvcChkcC0+bm9kZSwgKGNoYXIgKikgbmFtZSwgdmFsLCBsZW4pOworCQkJbXV0ZXhfdW5sb2NrKCZvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOworCiAJCQllcnIgPSAtRUlOVkFMOwogCQkJaWYgKHJldCA+PSAwKSB7CiAJCQkJcHJvcC0+dmFsdWUgPSBuZXdfdmFsOwpAQCAtNDM2LDcgKzQ0Miw2IEBACiAKIAlzd2l0Y2ggKHByb21fdmVycykgewogCWNhc2UgUFJPTV9WMDoKLQljYXNlIFBST01fU1VONDoKIAkJc2tpcCA9IDA7CiAJCXN3aXRjaCAoKnJvbXZlYy0+cHZfc3Rkb3V0KSB7CiAJCWNhc2UgUFJPTURFVl9TQ1JFRU46CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCmluZGV4IDIwNjk5YzcuLjhjZTYyODUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCkBAIC0yODgsNyArMjg4LDcgQEAKIAkgKi8KIAlbUkVHU0VUX0dFTkVSQUxdID0gewogCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKLQkJLm4gPSAzOCAqIHNpemVvZih1MzIpLAorCQkubiA9IDM4LAogCQkuc2l6ZSA9IHNpemVvZih1MzIpLCAuYWxpZ24gPSBzaXplb2YodTMyKSwKIAkJLmdldCA9IGdlbnJlZ3MzMl9nZXQsIC5zZXQgPSBnZW5yZWdzMzJfc2V0CiAJfSwKQEAgLTMwNCw3ICszMDQsNyBAQAogCSAqLwogCVtSRUdTRVRfRlBdID0gewogCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUkZQUkVHLAotCQkubiA9IDk5ICogc2l6ZW9mKHUzMiksCisJCS5uID0gOTksCiAJCS5zaXplID0gc2l6ZW9mKHUzMiksIC5hbGlnbiA9IHNpemVvZih1MzIpLAogCQkuZ2V0ID0gZnByZWdzMzJfZ2V0LCAuc2V0ID0gZnByZWdzMzJfc2V0CiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCmluZGV4IDllNDUxYjIuLjI0ZmUzMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYwpAQCAtMjEzLDIzICsyMTMsMjUgQEAKIAkvKiBJbml0aWFsaXplIFBST00gY29uc29sZSBhbmQgY29tbWFuZCBsaW5lLiAqLwogCSpjbWRsaW5lX3AgPSBwcm9tX2dldGJvb3RhcmdzKCk7CiAJc3RyY3B5KGJvb3RfY29tbWFuZF9saW5lLCAqY21kbGluZV9wKTsKKwlwYXJzZV9lYXJseV9wYXJhbSgpOwogCiAJLyogU2V0IHNwYXJjX2NwdV9tb2RlbCAqLwogCXNwYXJjX2NwdV9tb2RlbCA9IHN1bl91bmtub3duOwotCWlmKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNCAiKSkgeyBzcGFyY19jcHVfbW9kZWw9c3VuNDsgfQotCWlmKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNGMiKSkgeyBzcGFyY19jcHVfbW9kZWw9c3VuNGM7IH0KLQlpZighc3RyY21wKCZjcHV0eXB2YWwsInN1bjRtIikpIHsgc3BhcmNfY3B1X21vZGVsPXN1bjRtOyB9Ci0JaWYoIXN0cmNtcCgmY3B1dHlwdmFsLCJzdW40cyIpKSB7IHNwYXJjX2NwdV9tb2RlbD1zdW40bTsgfSAgLyogQ1AtMTIwMCB3aXRoIFBST00gMi4zMCAtRSAqLwotCWlmKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNGQiKSkgeyBzcGFyY19jcHVfbW9kZWw9c3VuNGQ7IH0KLQlpZighc3RyY21wKCZjcHV0eXB2YWwsInN1bjRlIikpIHsgc3BhcmNfY3B1X21vZGVsPXN1bjRlOyB9Ci0JaWYoIXN0cmNtcCgmY3B1dHlwdmFsLCJzdW40dSIpKSB7IHNwYXJjX2NwdV9tb2RlbD1zdW40dTsgfQorCWlmICghc3RyY21wKCZjcHV0eXB2YWwsInN1bjQgIikpCisJCXNwYXJjX2NwdV9tb2RlbCA9IHN1bjQ7CisJaWYgKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNGMiKSkKKwkJc3BhcmNfY3B1X21vZGVsID0gc3VuNGM7CisJaWYgKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNG0iKSkKKwkJc3BhcmNfY3B1X21vZGVsID0gc3VuNG07CisJaWYgKCFzdHJjbXAoJmNwdXR5cHZhbCwic3VuNHMiKSkKKwkJc3BhcmNfY3B1X21vZGVsID0gc3VuNG07IC8qIENQLTEyMDAgd2l0aCBQUk9NIDIuMzAgLUUgKi8KKwlpZiAoIXN0cmNtcCgmY3B1dHlwdmFsLCJzdW40ZCIpKQorCQlzcGFyY19jcHVfbW9kZWwgPSBzdW40ZDsKKwlpZiAoIXN0cmNtcCgmY3B1dHlwdmFsLCJzdW40ZSIpKQorCQlzcGFyY19jcHVfbW9kZWwgPSBzdW40ZTsKKwlpZiAoIXN0cmNtcCgmY3B1dHlwdmFsLCJzdW40dSIpKQorCQlzcGFyY19jcHVfbW9kZWwgPSBzdW40dTsKIAotI2lmZGVmIENPTkZJR19TVU40Ci0JaWYgKHNwYXJjX2NwdV9tb2RlbCAhPSBzdW40KSB7Ci0JCXByb21fcHJpbnRmKCJUaGlzIGtlcm5lbCBpcyBmb3IgU3VuNCBhcmNoaXRlY3R1cmUgb25seS5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0jZW5kaWYKIAlwcmludGsoIkFSQ0g6ICIpOwogCXN3aXRjaChzcGFyY19jcHVfbW9kZWwpIHsKIAljYXNlIHN1bjQ6CkBAIC0yNjMsNyArMjY1LDcgQEAKIAlib290X2ZsYWdzX2luaXQoKmNtZGxpbmVfcCk7CiAKIAlpZHByb21faW5pdCgpOwotCWlmIChBUkNIX1NVTjRDX1NVTjQpCisJaWYgKEFSQ0hfU1VONEMpCiAJCXN1bjRjX3Byb2JlX3ZhYygpOwogCWxvYWRfbW11KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCmluZGV4IGIyM2NlYTUuLmIwZGZmZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYwpAQCAtMzgsMTcgKzM4LDEyIEBACiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9oZWFkLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9tb3N0ZWsuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpZmRlZiBDT05GSUdfU0JVUwotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGFzbS9lYnVzLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxhc20vaW8tdW5pdC5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KIApAQCAtMTI3LDE2ICsxMjIsMTEgQEAKIEVYUE9SVF9TWU1CT0woX191ZGVsYXkpOwogRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKLUVYUE9SVF9TWU1CT0wobW9zdGVrX2xvY2spOwotRVhQT1JUX1NZTUJPTChtc3RrNDh0MDJfcmVncyk7CiAjaWZkZWYgQ09ORklHX1NVTl9BVVhJTwogRVhQT1JUX1NZTUJPTChzZXRfYXV4aW8pOwogRVhQT1JUX1NZTUJPTChnZXRfYXV4aW8pOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKGlvX3JlbWFwX3Bmbl9yYW5nZSk7Ci0gIC8qIFAzOiBpb3VuaXRfeHh4IG1heSBiZSBuZWVkZWQsIHN1bjRkIHVzZXJzICovCi0vKiBFWFBPUlRfU1lNQk9MKGlvdW5pdF9tYXBfZG1hX2luaXQpOyAqLwotLyogRVhQT1JUX1NZTUJPTChpb3VuaXRfbWFwX2RtYV9wYWdlKTsgKi8KIAogI2lmbmRlZiBDT05GSUdfU01QCiBFWFBPUlRfU1lNQk9MKEJURklYVVBfQ0FMTChfX194Y2hnMzIpKTsKQEAgLTE1MywyNCArMTQzLDkgQEAKIEVYUE9SVF9TWU1CT0woQlRGSVhVUF9DQUxMKHBncHJvdF9ub25jYWNoZWQpKTsKIAogI2lmZGVmIENPTkZJR19TQlVTCi1FWFBPUlRfU1lNQk9MKHNidXNfcm9vdCk7Ci1FWFBPUlRfU1lNQk9MKGRtYV9jaGFpbik7CiBFWFBPUlRfU1lNQk9MKHNidXNfc2V0X3NidXM2NCk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfYWxsb2NfY29uc2lzdGVudCk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfZnJlZV9jb25zaXN0ZW50KTsKLUVYUE9SVF9TWU1CT0woc2J1c19tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0woc2J1c191bm1hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChzYnVzX21hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfdW5tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0woc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfZG1hX3N5bmNfc2dfZm9yX2NwdSk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfaW91bm1hcCk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfaW9yZW1hcCk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUENJCi1FWFBPUlRfU1lNQk9MKGVidXNfY2hhaW4pOwogRVhQT1JUX1NZTUJPTChpbnNiKTsKIEVYUE9SVF9TWU1CT0wob3V0c2IpOwogRVhQT1JUX1NZTUJPTChpbnN3KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRjX2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKaW5kZXggMzQwZmMzOS4uNWRjOGE1NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGNfaXJxLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSAiaXJxLmgiCiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0zMSwxNSArMzMsOCBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+CiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+Ci0KLSNpZiAwCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHN1bjRjX3RpbWVyX2ViID0geyAic3VuNGNfdGltZXIiIH07Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlIHN1bjRjX2ludHJfZWIgPSB7ICJzdW40Y19pbnRyIiB9OwotI2VuZGlmCiAKIC8qCiAgKiBCaXQgZmllbGQgZGVmaW5lcyBmb3IgdGhlIGludGVycnVwdCByZWdpc3RlcnMgb24gdmFyaW91cwpAQCAtNjQsMTkgKzU5LDcgQEAKICAqCiAgKiBzbyBkb24ndCBnbyBtYWtpbmcgaXQgc3RhdGljLCBsaWtlIEkgdHJpZWQuIHNpZ2guCiAgKi8KLXVuc2lnbmVkIGNoYXIgKmludGVycnVwdF9lbmFibGUgPSBOVUxMOwotCi1zdGF0aWMgaW50IHN1bjRjX3BpbF9tYXBbXSA9IHsgMCwgMSwgMiwgMywgNSwgNywgOCwgOSB9OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1bjRjX3NiaW50X3RvX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBzYmludCkKLXsKLQlpZiAoc2JpbnQgPj0gc2l6ZW9mKHN1bjRjX3BpbF9tYXApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGJvZ3VzIFNCSU5UICVkXG4iLCBzZGV2LT5wcm9tX25hbWUsIHNiaW50KTsKLQkJQlVHKCk7Ci0JfQotCXJldHVybiBzdW40Y19waWxfbWFwW3NiaW50XTsKLX0KK3Vuc2lnbmVkIGNoYXIgX19pb21lbSAqaW50ZXJydXB0X2VuYWJsZSA9IE5VTEw7CiAKIHN0YXRpYyB2b2lkIHN1bjRjX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7CkBAIC04NSw3ICs2OCw3IEBACiAgICAgCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlycV9uciAmPSAoTlJfSVJRUyAtIDEpOwotCWN1cnJlbnRfbWFzayA9ICppbnRlcnJ1cHRfZW5hYmxlOworCWN1cnJlbnRfbWFzayA9IHNidXNfcmVhZGIoaW50ZXJydXB0X2VuYWJsZSk7CiAJc3dpdGNoKGlycV9ucikgewogCWNhc2UgMToKIAkJbmV3X21hc2sgPSAoKGN1cnJlbnRfbWFzaykgJiAofihTVU40Q19JTlRfRTEpKSk7CkBAIC0xMDMsNyArODYsNyBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0JKmludGVycnVwdF9lbmFibGUgPSBuZXdfbWFzazsKKwlzYnVzX3dyaXRlYihuZXdfbWFzaywgaW50ZXJydXB0X2VuYWJsZSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCkBAIC0xMTQsNyArOTcsNyBAQAogICAgIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpcnFfbnIgJj0gKE5SX0lSUVMgLSAxKTsKLQljdXJyZW50X21hc2sgPSAqaW50ZXJydXB0X2VuYWJsZTsKKwljdXJyZW50X21hc2sgPSBzYnVzX3JlYWRiKGludGVycnVwdF9lbmFibGUpOwogCXN3aXRjaChpcnFfbnIpIHsKIAljYXNlIDE6CiAJCW5ld19tYXNrID0gKChjdXJyZW50X21hc2spIHwgU1VONENfSU5UX0UxKTsKQEAgLTEzMiwzNyArMTE1LDIyIEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQkqaW50ZXJydXB0X2VuYWJsZSA9IG5ld19tYXNrOworCXNidXNfd3JpdGViKG5ld19tYXNrLCBpbnRlcnJ1cHRfZW5hYmxlKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLSNkZWZpbmUgVElNRVJfSVJRICAJMTAgICAgLyogQWxzbyBhdCBsZXZlbCAxNCwgYnV0IHdlIGlnbm9yZSB0aGF0IG9uZS4gKi8KLSNkZWZpbmUgUFJPRklMRV9JUlEJMTQgICAgLyogTGV2ZWwxNCB0aWNrZXIuLiB1c2VkIGJ5IE9CUCBmb3IgcG9sbGluZyAqLworc3RydWN0IHN1bjRjX3RpbWVyX2luZm8geworCXUzMgkJbDEwX2NvdW50OworCXUzMgkJbDEwX2xpbWl0OworCXUzMgkJbDE0X2NvdW50OworCXUzMgkJbDE0X2xpbWl0OworfTsKIAotdm9sYXRpbGUgc3RydWN0IHN1bjRjX3RpbWVyX2luZm8gKnN1bjRjX3RpbWVyczsKLQotI2lmZGVmIENPTkZJR19TVU40Ci0vKiBUaGlzIGlzIGFuIHVnbHkgaGFjayB0byB3b3JrIGFyb3VuZCB0aGUKLSAgIGN1cnJlbnQgdGltZXIgY29kZSwgYW5kIG1ha2UgaXQgd29yayB3aXRoIAotICAgdGhlIHN1bjQvMjYwIGludGVyc2lsIAotICAgKi8KLXZvbGF0aWxlIHN0cnVjdCBzdW40Y190aW1lcl9pbmZvIHN1bjRfdGltZXI7Ci0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3Qgc3VuNGNfdGltZXJfaW5mbyBfX2lvbWVtICpzdW40Y190aW1lcnM7CiAKIHN0YXRpYyB2b2lkIHN1bjRjX2NsZWFyX2Nsb2NrX2lycSh2b2lkKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjbGVhcl9pbnRyOwotI2lmZGVmIENPTkZJR19TVU40Ci0JaWYgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjQgfCBTTV80XzI2MCkpIAotCSAgY2xlYXJfaW50ciA9IHN1bjRfdGltZXIudGltZXJfbGltaXQxMDsKLQllbHNlCi0jZW5kaWYKLQljbGVhcl9pbnRyID0gc3VuNGNfdGltZXJzLT50aW1lcl9saW1pdDEwOwotfQotCi1zdGF0aWMgdm9pZCBzdW40Y19jbGVhcl9wcm9maWxlX2lycShpbnQgY3B1KQotewotCS8qIEVycm0uLiBub3Qgc3VyZSBob3cgdG8gZG8gdGhpcy4uICovCisJc2J1c19yZWFkbCgmc3VuNGNfdGltZXJzLT5sMTBfbGltaXQpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40Y19sb2FkX3Byb2ZpbGVfaXJxKGludCBjcHUsIHVuc2lnbmVkIGludCBsaW1pdCkKQEAgLTE3Miw0MSArMTQwLDQ4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzdW40Y19pbml0X3RpbWVycyhpcnFfaGFuZGxlcl90IGNvdW50ZXJfZm4pCiB7Ci0JaW50IGlycTsKKwljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9pcnFzICppcnE7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwljb25zdCB1MzIgKmFkZHI7CisJaW50IGVycjsKIAotCS8qIE1hcCB0aGUgVGltZXIgY2hpcCwgdGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZSBpbnNpZGUKLQkgKiB0aGUgY2FjaGUgY2hpcCBvbiB0aGUgc3VuNGMuCi0JICovCi0jaWZkZWYgQ09ORklHX1NVTjQKLQlpZiAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONCB8IFNNXzRfMjYwKSkKLQkJc3VuNGNfdGltZXJzID0gJnN1bjRfdGltZXI7Ci0JZWxzZQotI2VuZGlmCi0Jc3VuNGNfdGltZXJzID0gaW9yZW1hcChTVU5fVElNRVJfUEhZU0FERFIsCi0JICAgIHNpemVvZihzdHJ1Y3Qgc3VuNGNfdGltZXJfaW5mbykpOworCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNvdW50ZXItdGltZXIiKTsKKwlpZiAoIWRwKSB7CisJCXByb21fcHJpbnRmKCJzdW40Y19pbml0X3RpbWVyczogVW5hYmxlIHRvIGZpbmQgY291bnRlci10aW1lclxuIik7CisJCXByb21faGFsdCgpOworCX0KKworCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJhZGRyZXNzIiwgTlVMTCk7CisJaWYgKCFhZGRyKSB7CisJCXByb21fcHJpbnRmKCJzdW40Y19pbml0X3RpbWVyczogTm8gYWRkcmVzcyBwcm9wZXJ0eVxuIik7CisJCXByb21faGFsdCgpOworCX0KKworCXN1bjRjX3RpbWVycyA9ICh2b2lkIF9faW9tZW0gKikgKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07CisKKwlpcnEgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRyIiwgTlVMTCk7CisJaWYgKCFpcnEpIHsKKwkJcHJvbV9wcmludGYoInN1bjRjX2luaXRfdGltZXJzOiBObyBpbnRyIHByb3BlcnR5XG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQogCiAJLyogSGF2ZSB0aGUgbGV2ZWwgMTAgdGltZXIgdGljayBhdCAxMDBIWi4gIFdlIGRvbid0IHRvdWNoIHRoZQogCSAqIGxldmVsIDE0IHRpbWVyIGxpbWl0IHNpbmNlIHdlIGFyZSBsZXR0aW5nIHRoZSBwcm9tIGhhbmRsZQogCSAqIHRoZW0gdW50aWwgd2UgaGF2ZSBhIHJlYWwgY29uc29sZSBkcml2ZXIgc28gTDEtQSB3b3Jrcy4KIAkgKi8KLQlzdW40Y190aW1lcnMtPnRpbWVyX2xpbWl0MTAgPSAoKCgxMDAwMDAwL0haKSArIDEpIDw8IDEwKTsKLQltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNGNfdGltZXJzLT5jdXJfY291bnQxMDsKLQltYXN0ZXJfbDEwX2xpbWl0ID0gJnN1bjRjX3RpbWVycy0+dGltZXJfbGltaXQxMDsKKwlzYnVzX3dyaXRlbCgoKCgxMDAwMDAwL0haKSArIDEpIDw8IDEwKSwgJnN1bjRjX3RpbWVycy0+bDEwX2xpbWl0KTsKIAotCWlycSA9IHJlcXVlc3RfaXJxKFRJTUVSX0lSUSwKLQkJCSAgY291bnRlcl9mbiwKKwltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNGNfdGltZXJzLT5sMTBfY291bnQ7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnFbMF0ucHJpLCBjb3VudGVyX2ZuLAogCQkJICAoSVJRRl9ESVNBQkxFRCB8IFNBX1NUQVRJQ19BTExPQyksCiAJCQkgICJ0aW1lciIsIE5VTEwpOwotCWlmIChpcnEpIHsKLQkJcHJvbV9wcmludGYoInRpbWVfaW5pdDogdW5hYmxlIHRvIGF0dGFjaCBJUlElZFxuIixUSU1FUl9JUlEpOworCWlmIChlcnIpIHsKKwkJcHJvbV9wcmludGYoInN1bjRjX2luaXRfdGltZXJzOiByZXF1ZXN0X2lycSgpIGZhaWxzIHdpdGggJWRcbiIsIGVycik7CiAJCXByb21faGFsdCgpOwogCX0KICAgICAKLSNpZiAwCi0JLyogVGhpcyBkb2VzIG5vdCB3b3JrIG9uIDQvMzMwICovCi0Jc3VuNGNfZW5hYmxlX2lycSgxMCk7Ci0jZW5kaWYKLQljbGFpbV90aWNrZXIxNChOVUxMLCBQUk9GSUxFX0lSUSwgMCk7CisJc3VuNGNfZGlzYWJsZV9pcnEoaXJxWzFdLnByaSk7CiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yMTUsNDEgKzE5MCwyOCBAQAogCiB2b2lkIF9faW5pdCBzdW40Y19pbml0X0lSUSh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBpbnRfcmVnc1syXTsKLQlpbnQgaWVfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCWNvbnN0IHUzMiAqYWRkcjsKIAotCWlmIChBUkNIX1NVTjQpIHsKLQkJaW50ZXJydXB0X2VuYWJsZSA9IChjaGFyICopCi0JCSAgICBpb3JlbWFwKHN1bjRfaWVfcGh5c2FkZHIsIFBBR0VfU0laRSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHJlc291cmNlIHBoeXJlczsKLQotCQlpZV9ub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyAocHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSksCi0JCQkJICAgICAgIAkiaW50ZXJydXB0LWVuYWJsZSIpOwotCQlpZihpZV9ub2RlID09IDApCi0JCQlwYW5pYygiQ2Fubm90IGZpbmQgL2ludGVycnVwdC1lbmFibGUgbm9kZSIpOwotCi0JCS8qIERlcGVuZGluZyBvbiB0aGUgImFkZHJlc3MiIHByb3BlcnR5IGlzIGJhZCBuZXdzLi4uICovCi0JCWludGVycnVwdF9lbmFibGUgPSBOVUxMOwotCQlpZiAocHJvbV9nZXRwcm9wZXJ0eShpZV9ub2RlLCAicmVnIiwgKGNoYXIgKikgaW50X3JlZ3MsCi0JCQkJICAgICBzaXplb2YoaW50X3JlZ3MpKSAhPSAtMSkgewotCQkJbWVtc2V0KCZwaHlyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKLQkJCXBoeXJlcy5mbGFncyA9IGludF9yZWdzWzBdLndoaWNoX2lvOwotCQkJcGh5cmVzLnN0YXJ0ID0gaW50X3JlZ3NbMF0ucGh5c19hZGRyOwotCQkJaW50ZXJydXB0X2VuYWJsZSA9IChjaGFyICopIHNidXNfaW9yZW1hcCgmcGh5cmVzLCAwLAotCQkJICAgIGludF9yZWdzWzBdLnJlZ19zaXplLCAic3VuNGNfaW50ciIpOwotCQl9CisJZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiaW50ZXJydXB0LWVuYWJsZSIpOworCWlmICghZHApIHsKKwkJcHJvbV9wcmludGYoInN1bjRjX2luaXRfSVJROiBVbmFibGUgdG8gZmluZCBpbnRlcnJ1cHQtZW5hYmxlXG4iKTsKKwkJcHJvbV9oYWx0KCk7CiAJfQotCWlmICghaW50ZXJydXB0X2VuYWJsZSkKLQkJcGFuaWMoIkNhbm5vdCBtYXAgaW50ZXJydXB0X2VuYWJsZSIpOwogCi0JQlRGSVhVUFNFVF9DQUxMKHNiaW50X3RvX2lycSwgc3VuNGNfc2JpbnRfdG9faXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKKwlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYWRkcmVzcyIsIE5VTEwpOworCWlmICghYWRkcikgeworCQlwcm9tX3ByaW50Zigic3VuNGNfaW5pdF9JUlE6IE5vIGFkZHJlc3MgcHJvcGVydHlcbiIpOworCQlwcm9tX2hhbHQoKTsKKwl9CisKKwlpbnRlcnJ1cHRfZW5hYmxlID0gKHZvaWQgX19pb21lbSAqKSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKKwogCUJURklYVVBTRVRfQ0FMTChlbmFibGVfaXJxLCBzdW40Y19lbmFibGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZGlzYWJsZV9pcnEsIHN1bjRjX2Rpc2FibGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZW5hYmxlX3BpbF9pcnEsIHN1bjRjX2VuYWJsZV9pcnEsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChkaXNhYmxlX3BpbF9pcnEsIHN1bjRjX2Rpc2FibGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoY2xlYXJfY2xvY2tfaXJxLCBzdW40Y19jbGVhcl9jbG9ja19pcnEsIEJURklYVVBDQUxMX05PUk0pOwotCUJURklYVVBTRVRfQ0FMTChjbGVhcl9wcm9maWxlX2lycSwgc3VuNGNfY2xlYXJfcHJvZmlsZV9pcnEsIEJURklYVVBDQUxMX05PUCk7CiAJQlRGSVhVUFNFVF9DQUxMKGxvYWRfcHJvZmlsZV9pcnEsIHN1bjRjX2xvYWRfcHJvZmlsZV9pcnEsIEJURklYVVBDQUxMX05PUCk7CiAJc3BhcmNfaW5pdF90aW1lcnMgPSBzdW40Y19pbml0X3RpbWVyczsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yNTcsNiArMjE5LDYgQEAKIAlCVEZJWFVQU0VUX0NBTEwoY2xlYXJfY3B1X2ludCwgc3VuNGNfbm9wLCBCVEZJWFVQQ0FMTF9OT1ApOwogCUJURklYVVBTRVRfQ0FMTChzZXRfaXJxX3VkdCwgc3VuNGNfbm9wLCBCVEZJWFVQQ0FMTF9OT1ApOwogI2VuZGlmCi0JKmludGVycnVwdF9lbmFibGUgPSAoU1VONENfSU5UX0VOQUJMRSk7CisJc2J1c193cml0ZWIoU1VONENfSU5UX0VOQUJMRSwgaW50ZXJydXB0X2VuYWJsZSk7CiAJLyogQ2Fubm90IGVuYWJsZSBpbnRlcnJ1cHRzIHVudGlsIE9CUCB0aWNrZXIgaXMgZGlzYWJsZWQuICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCmluZGV4IDEyOTBiNTkuLmQzY2I3NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMzQsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9zYmkuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtNDQsMTYgKzQ1LDIyIEBACiAvKiBJZiB5b3UgdHJ1c3QgY3VycmVudCBTQ1NJIGxheWVyIHRvIGhhbmRsZSBkaWZmZXJlbnQgU0NTSSBJUlFzLCBlbmFibGUgdGhpcy4gSSBkb24ndCB0cnVzdCBpdC4uLiAtamogKi8KIC8qICNkZWZpbmUgRElTVFJJQlVURV9JUlFTICovCiAKLXN0cnVjdCBzdW40ZF90aW1lcl9yZWdzICpzdW40ZF90aW1lcnM7CitzdHJ1Y3Qgc3VuNGRfdGltZXJfcmVncyB7CisJdTMyCWwxMF90aW1lcl9saW1pdDsKKwl1MzIJbDEwX2N1cl9jb3VudHg7CisJdTMyCWwxMF9saW1pdF9ub2NsZWFyOworCXUzMgljdHJsOworCXUzMglsMTBfY3VyX2NvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBzdW40ZF90aW1lcl9yZWdzIF9faW9tZW0gKnN1bjRkX3RpbWVyczsKKwogI2RlZmluZSBUSU1FUl9JUlEJMTAKIAogI2RlZmluZSBNQVhfU1RBVElDX0FMTE9DCTQKIGV4dGVybiBzdHJ1Y3QgaXJxYWN0aW9uIHN0YXRpY19pcnFhY3Rpb25bTUFYX1NUQVRJQ19BTExPQ107CiBleHRlcm4gaW50IHN0YXRpY19pcnFfY291bnQ7Ci11bnNpZ25lZCBjaGFyIGNwdV9sZWRzWzMyXTsKLSNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzYnVzX3RpZFszMl07Ci0jZW5kaWYKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKmlycV9hY3Rpb25bTlJfSVJRU107CiBleHRlcm4gc3BpbmxvY2tfdCBpcnFfYWN0aW9uX2xvY2s7CkBAIC03Miw5ICs3OSw5IEBACiB9OwogCiBzdGF0aWMgaW50IG5zYmk7Ci0jaWZkZWYgQ09ORklHX1NNUAorCisvKiBFeHBvcnRlZCBmb3Igc3VuNGRfc21wLmMgKi8KIERFRklORV9TUElOTE9DSyhzdW40ZF9pbXNrX2xvY2spOwotI2VuZGlmCiAKIGludCBzaG93X3N1bjRkX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewpAQCAtMjU3LDI2ICsyNjQsNiBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKLXVuc2lnbmVkIGludCBzdW40ZF9idWlsZF9pcnEoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBpbnQgaXJxKQotewotCWludCBzYnVzbCA9IHBpbF90b19zYnVzW2lycV07Ci0KLQlpZiAoc2J1c2wpCi0JCXJldHVybiAoKHNkZXYtPmJ1cy0+Ym9hcmQgKyAxKSA8PCA1KSArIChzYnVzbCA8PCAyKSArIHNkZXYtPnNsb3Q7Ci0JZWxzZQotCQlyZXR1cm4gaXJxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1bjRkX3NiaW50X3RvX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBzYmludCkKLXsKLQlpZiAoc2JpbnQgPj0gc2l6ZW9mKHNidXNfdG9fcGlsKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBTQklOVCAlZFxuIiwgc2Rldi0+cHJvbV9uYW1lLCBzYmludCk7Ci0JCUJVRygpOwotCX0KLQlyZXR1cm4gc3VuNGRfYnVpbGRfaXJxKHNkZXYsIHNidXNfdG9fcGlsW3NiaW50XSk7Ci19Ci0KIGludCBzdW40ZF9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAogCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsCiAJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGNvbnN0IGNoYXIgKiBkZXZuYW1lLCB2b2lkICpkZXZfaWQpCkBAIC0zNjAsMzYgKzM0NywyOCBAQAogCiBzdGF0aWMgdm9pZCBzdW40ZF9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19TTVAKIAlpbnQgdGlkID0gc2J1c190aWRbKGlycSA+PiA1KSAtIDFdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYJCiAJCi0JaWYgKGlycSA8IE5SX0lSUVMpIHJldHVybjsKLSNpZmRlZiBDT05GSUdfU01QCisJaWYgKGlycSA8IE5SX0lSUVMpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzdW40ZF9pbXNrX2xvY2ssIGZsYWdzKTsKIAljY19zZXRfaW1za19vdGhlcih0aWQsIGNjX2dldF9pbXNrX290aGVyKHRpZCkgfCAoMSA8PCBzYnVzX3RvX3BpbFsoaXJxID4+IDIpICYgN10pKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdW40ZF9pbXNrX2xvY2ssIGZsYWdzKTsKLSNlbHNlCQkKLQljY19zZXRfaW1zayhjY19nZXRfaW1zaygpIHwgKDEgPDwgc2J1c190b19waWxbKGlycSA+PiAyKSAmIDddKSk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgc3VuNGRfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19TTVAKIAlpbnQgdGlkID0gc2J1c190aWRbKGlycSA+PiA1KSAtIDFdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYJCiAJCi0JaWYgKGlycSA8IE5SX0lSUVMpIHJldHVybjsKLSNpZmRlZiBDT05GSUdfU01QCisJaWYgKGlycSA8IE5SX0lSUVMpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzdW40ZF9pbXNrX2xvY2ssIGZsYWdzKTsKIAljY19zZXRfaW1za19vdGhlcih0aWQsIGNjX2dldF9pbXNrX290aGVyKHRpZCkgJiB+KDEgPDwgc2J1c190b19waWxbKGlycSA+PiAyKSAmIDddKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VuNGRfaW1za19sb2NrLCBmbGFncyk7Ci0jZWxzZQkJCi0JY2Nfc2V0X2ltc2soY2NfZ2V0X2ltc2soKSAmIH4oMSA8PCBzYnVzX3RvX3BpbFsoaXJxID4+IDIpICYgN10pKTsKLSNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDA5LDQ3ICszODgsNTUgQEAKIC8qIFNldHVwIElSUSBkaXN0cmlidXRpb24gc2NoZW1lLiAqLwogdm9pZCBfX2luaXQgc3VuNGRfZGlzdHJpYnV0ZV9pcnFzKHZvaWQpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwogI2lmZGVmIERJU1RSSUJVVEVfSVJRUwotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQl1bnNpZ25lZCBsb25nIHNidXNfc2VydmluZ19tYXA7CisJY3B1bWFza190IHNidXNfc2VydmluZ19tYXA7CiAKIAlzYnVzX3NlcnZpbmdfbWFwID0gY3B1X3ByZXNlbnRfbWFwOwotCWZvcl9lYWNoX3NidXMoc2J1cykgewotCQlpZiAoKHNidXMtPmJvYXJkICogMikgPT0gYm9vdF9jcHVfaWQgJiYgKGNwdV9wcmVzZW50X21hcCAmICgxIDw8IChzYnVzLT5ib2FyZCAqIDIgKyAxKSkpKQotCQkJc2J1c190aWRbc2J1cy0+Ym9hcmRdID0gKHNidXMtPmJvYXJkICogMiArIDEpOwotCQllbHNlIGlmIChjcHVfcHJlc2VudF9tYXAgJiAoMSA8PCAoc2J1cy0+Ym9hcmQgKiAyKSkpCi0JCQlzYnVzX3RpZFtzYnVzLT5ib2FyZF0gPSAoc2J1cy0+Ym9hcmQgKiAyKTsKLQkJZWxzZSBpZiAoY3B1X3ByZXNlbnRfbWFwICYgKDEgPDwgKHNidXMtPmJvYXJkICogMiArIDEpKSkKLQkJCXNidXNfdGlkW3NidXMtPmJvYXJkXSA9IChzYnVzLT5ib2FyZCAqIDIgKyAxKTsKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJzYmkiKSB7CisJCWludCBib2FyZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImJvYXJkIyIsIDApOworCisJCWlmICgoYm9hcmQgKiAyKSA9PSBib290X2NwdV9pZCAmJiBjcHVfaXNzZXQoYm9hcmQgKiAyICsgMSwgY3B1X3ByZXNlbnRfbWFwKSkKKwkJCXNidXNfdGlkW2JvYXJkXSA9IChib2FyZCAqIDIgKyAxKTsKKwkJZWxzZSBpZiAoY3B1X2lzc2V0KGJvYXJkICogMiwgY3B1X3ByZXNlbnRfbWFwKSkKKwkJCXNidXNfdGlkW2JvYXJkXSA9IChib2FyZCAqIDIpOworCQllbHNlIGlmIChjcHVfaXNzZXQoYm9hcmQgKiAyICsgMSwgY3B1X3ByZXNlbnRfbWFwKSkKKwkJCXNidXNfdGlkW2JvYXJkXSA9IChib2FyZCAqIDIgKyAxKTsKIAkJZWxzZQotCQkJc2J1c190aWRbc2J1cy0+Ym9hcmRdID0gMHhmZjsKLQkJaWYgKHNidXNfdGlkW3NidXMtPmJvYXJkXSAhPSAweGZmKQotCQkJc2J1c19zZXJ2aW5nX21hcCAmPSB+KDEgPDwgc2J1c190aWRbc2J1cy0+Ym9hcmRdKTsKKwkJCXNidXNfdGlkW2JvYXJkXSA9IDB4ZmY7CisJCWlmIChzYnVzX3RpZFtib2FyZF0gIT0gMHhmZikKKwkJCWNwdV9jbGVhcihzYnVzX3RpZFtib2FyZF0sIHNidXNfc2VydmluZ19tYXApOwogCX0KLQlmb3JfZWFjaF9zYnVzKHNidXMpCi0JCWlmIChzYnVzX3RpZFtzYnVzLT5ib2FyZF0gPT0gMHhmZikgeworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgInNiaSIpIHsKKwkJaW50IGJvYXJkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiYm9hcmQjIiwgMCk7CisJCWlmIChzYnVzX3RpZFtib2FyZF0gPT0gMHhmZikgewogCQkJaW50IGkgPSAzMTsKIAkJCQkKLQkJCWlmICghc2J1c19zZXJ2aW5nX21hcCkKKwkJCWlmIChjcHVzX2VtcHR5KHNidXNfc2VydmluZ19tYXApKQogCQkJCXNidXNfc2VydmluZ19tYXAgPSBjcHVfcHJlc2VudF9tYXA7Ci0JCQl3aGlsZSAoIShzYnVzX3NlcnZpbmdfbWFwICYgKDEgPDwgaSkpKQorCQkJd2hpbGUgKGNwdV9pc3NldChpLCBzYnVzX3NlcnZpbmdfbWFwKSkKIAkJCQlpLS07Ci0JCQlzYnVzX3RpZFtzYnVzLT5ib2FyZF0gPSBpOwotCQkJc2J1c19zZXJ2aW5nX21hcCAmPSB+KDEgPDwgaSk7CisJCQlzYnVzX3RpZFtib2FyZF0gPSBpOworCQkJY3B1X2NsZWFyKGksIHNidXNfc2VydmluZ19tYXApOwogCQl9Ci0JZm9yX2VhY2hfc2J1cyhzYnVzKSB7Ci0JCXByaW50aygic2J1cyVkIElSUXMgZGlyZWN0ZWQgdG8gQ1BVJWRcbiIsIHNidXMtPmJvYXJkLCBzYnVzX3RpZFtzYnVzLT5ib2FyZF0pOwotCQlzZXRfc2JpX3RpZChzYnVzLT5kZXZpZCwgc2J1c190aWRbc2J1cy0+Ym9hcmRdIDw8IDMpOworCX0KKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJzYmkiKSB7CisJCWludCBkZXZpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRldmljZS1pZCIsIDApOworCQlpbnQgYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJib2FyZCMiLCAwKTsKKwkJcHJpbnRrKCJzYnVzJWQgSVJRcyBkaXJlY3RlZCB0byBDUFUlZFxuIiwgYm9hcmQsIHNidXNfdGlkW2JvYXJkXSk7CisJCXNldF9zYmlfdGlkKGRldmlkLCBzYnVzX3RpZFtib2FyZF0gPDwgMyk7CiAJfQogI2Vsc2UKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CiAJaW50IGNwdWlkID0gY3B1X2xvZ2ljYWxfbWFwKDEpOwogCiAJaWYgKGNwdWlkID09IC0xKQogCQljcHVpZCA9IGNwdV9sb2dpY2FsX21hcCgwKTsKLQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLQkJc2J1c190aWRbc2J1cy0+Ym9hcmRdID0gY3B1aWQ7Ci0JCXNldF9zYmlfdGlkKHNidXMtPmRldmlkLCBjcHVpZCA8PCAzKTsKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJzYmkiKSB7CisJCWludCBkZXZpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRldmljZS1pZCIsIDApOworCQlpbnQgYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJib2FyZCMiLCAwKTsKKwkJc2J1c190aWRbYm9hcmRdID0gY3B1aWQ7CisJCXNldF9zYmlfdGlkKGRldmlkLCBjcHVpZCA8PCAzKTsKIAl9CiAJcHJpbnRrKCJBbGwgc2J1cyBJUlFzIGRpcmVjdGVkIHRvIENQVSVkXG4iLCBjcHVpZCk7CiAjZW5kaWYKQEAgLTQ1OCwxMyArNDQ1LDcgQEAKICAKIHN0YXRpYyB2b2lkIHN1bjRkX2NsZWFyX2Nsb2NrX2lycSh2b2lkKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjbGVhcl9pbnRyOwotCWNsZWFyX2ludHIgPSBzdW40ZF90aW1lcnMtPmwxMF90aW1lcl9saW1pdDsKLX0KLQotc3RhdGljIHZvaWQgc3VuNGRfY2xlYXJfcHJvZmlsZV9pcnEoaW50IGNwdSkKLXsKLQlid19nZXRfcHJvZl9saW1pdChjcHUpOworCXNidXNfcmVhZGwoJnN1bjRkX3RpbWVycy0+bDEwX3RpbWVyX2xpbWl0KTsKIH0KIAogc3RhdGljIHZvaWQgc3VuNGRfbG9hZF9wcm9maWxlX2lycShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbGltaXQpCkBAIC00NzIsOTggKzQ1MywxMjEgQEAKIAlid19zZXRfcHJvZl9saW1pdChjcHUsIGxpbWl0KTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHN1bjRkX2luaXRfdGltZXJzKGlycV9oYW5kbGVyX3QgY291bnRlcl9mbikKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW40ZF9sb2FkX3Byb2ZpbGVfaXJxcyh2b2lkKQogewotCWludCBpcnE7Ci0JaW50IGNwdTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlpbnQgbWlkOworCWludCBjcHUgPSAwLCBtaWQ7CiAKLQkvKiBNYXAgdGhlIFVzZXIgVGltZXIgcmVnaXN0ZXJzLiAqLwotCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKLSNpZmRlZiBDT05GSUdfU01QCi0Jci5zdGFydCA9IENTUl9CQVNFKGJvb3RfY3B1X2lkKStCV19USU1FUl9MSU1JVDsKLSNlbHNlCi0Jci5zdGFydCA9IENTUl9CQVNFKDApK0JXX1RJTUVSX0xJTUlUOwotI2VuZGlmCi0Jci5mbGFncyA9IDB4ZjsKLQlzdW40ZF90aW1lcnMgPSAoc3RydWN0IHN1bjRkX3RpbWVyX3JlZ3MgKikgc2J1c19pb3JlbWFwKCZyLCAwLAotCSAgICBQQUdFX1NJWkUsICJ1c2VyIHRpbWVyIik7Ci0KLQlzdW40ZF90aW1lcnMtPmwxMF90aW1lcl9saW1pdCA9ICAoKCgxMDAwMDAwL0haKSArIDEpIDw8IDEwKTsKLQltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNGRfdGltZXJzLT5sMTBfY3VyX2NvdW50OwotCW1hc3Rlcl9sMTBfbGltaXQgPSAmc3VuNGRfdGltZXJzLT5sMTBfdGltZXJfbGltaXQ7Ci0KLQlpcnEgPSByZXF1ZXN0X2lycShUSU1FUl9JUlEsCi0JCQkgIGNvdW50ZXJfZm4sCi0JCQkgIChJUlFGX0RJU0FCTEVEIHwgU0FfU1RBVElDX0FMTE9DKSwKLQkJCSAgInRpbWVyIiwgTlVMTCk7Ci0JaWYgKGlycSkgewotCQlwcm9tX3ByaW50ZigidGltZV9pbml0OiB1bmFibGUgdG8gYXR0YWNoIElSUSVkXG4iLFRJTUVSX0lSUSk7Ci0JCXByb21faGFsdCgpOwotCX0KLQkKLQkvKiBFbmFibGUgdXNlciB0aW1lciBmcmVlIHJ1biBmb3IgQ1BVIDAgaW4gQlcgKi8KLQkvKiBid19zZXRfY3RybCgwLCBid19nZXRfY3RybCgwKSB8IEJXX0NUUkxfVVNFUl9USU1FUik7ICovCi0KLQljcHUgPSAwOwogCXdoaWxlICghY3B1X2ZpbmRfYnlfaW5zdGFuY2UoY3B1LCBOVUxMLCAmbWlkKSkgewogCQlzdW40ZF9sb2FkX3Byb2ZpbGVfaXJxKG1pZCA+PiAzLCAwKTsKIAkJY3B1Kys7CiAJfQotCQkKK30KKworc3RhdGljIHZvaWQgX19pbml0IHN1bjRkX2ZpeHVwX3RyYXBfdGFibGUodm9pZCkKK3sKICNpZmRlZiBDT05GSUdfU01QCi0JewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlleHRlcm4gdW5zaWduZWQgbG9uZyBsdmwxNF9zYXZlWzRdOwotCQlzdHJ1Y3QgdHRfZW50cnkgKnRyYXBfdGFibGUgPSAmc3BhcmNfdHRhYmxlW1NQX1RSQVBfSVJRMSArICgxNCAtIDEpXTsKLQkJZXh0ZXJuIHVuc2lnbmVkIGludCByZWFsX2lycV9lbnRyeVtdLCBzbXA0ZF90aWNrZXJbXTsKLQkJZXh0ZXJuIHVuc2lnbmVkIGludCBwYXRjaG1lX21heWJlX3NtcF9tc2dbXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWV4dGVybiB1bnNpZ25lZCBsb25nIGx2bDE0X3NhdmVbNF07CisJc3RydWN0IHR0X2VudHJ5ICp0cmFwX3RhYmxlID0gJnNwYXJjX3R0YWJsZVtTUF9UUkFQX0lSUTEgKyAoMTQgLSAxKV07CisJZXh0ZXJuIHVuc2lnbmVkIGludCByZWFsX2lycV9lbnRyeVtdLCBzbXA0ZF90aWNrZXJbXTsKKwlleHRlcm4gdW5zaWduZWQgaW50IHBhdGNobWVfbWF5YmVfc21wX21zZ1tdOwogCi0JCS8qIEFkanVzdCBzbyB0aGF0IHdlIGp1bXAgZGlyZWN0bHkgdG8gc21wNGRfdGlja2VyICovCi0JCWx2bDE0X3NhdmVbMl0gKz0gc21wNGRfdGlja2VyIC0gcmVhbF9pcnFfZW50cnk7CisJLyogQWRqdXN0IHNvIHRoYXQgd2UganVtcCBkaXJlY3RseSB0byBzbXA0ZF90aWNrZXIgKi8KKwlsdmwxNF9zYXZlWzJdICs9IHNtcDRkX3RpY2tlciAtIHJlYWxfaXJxX2VudHJ5OwogCi0JCS8qIEZvciBTTVAgd2UgdXNlIHRoZSBsZXZlbCAxNCB0aWNrZXIsIGhvd2V2ZXIgdGhlIGJvb3R1cCBjb2RlCi0JCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlJ3MgbGV2ZWwgMTQgdmVjdG9yIGludG8gdGhlIGJvb3QgY3B1J3MKLQkJICogdHJhcCB0YWJsZSwgd2UgbXVzdCBmaXggdGhpcyBub3cgb3Igd2UgZ2V0IHNxdWFzaGVkLgotCQkgKi8KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlwYXRjaG1lX21heWJlX3NtcF9tc2dbMF0gPSAweDAxMDAwMDAwOyAvKiBOT1Agb3V0IHRoZSBicmFuY2ggKi8KLQkJdHJhcF90YWJsZS0+aW5zdF9vbmUgPSBsdmwxNF9zYXZlWzBdOwotCQl0cmFwX3RhYmxlLT5pbnN0X3R3byA9IGx2bDE0X3NhdmVbMV07Ci0JCXRyYXBfdGFibGUtPmluc3RfdGhyZWUgPSBsdmwxNF9zYXZlWzJdOwotCQl0cmFwX3RhYmxlLT5pbnN0X2ZvdXIgPSBsdmwxNF9zYXZlWzNdOwotCQlsb2NhbF9mbHVzaF9jYWNoZV9hbGwoKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KKwkvKiBGb3IgU01QIHdlIHVzZSB0aGUgbGV2ZWwgMTQgdGlja2VyLCBob3dldmVyIHRoZSBib290dXAgY29kZQorCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlJ3MgbGV2ZWwgMTQgdmVjdG9yIGludG8gdGhlIGJvb3QgY3B1J3MKKwkgKiB0cmFwIHRhYmxlLCB3ZSBtdXN0IGZpeCB0aGlzIG5vdyBvciB3ZSBnZXQgc3F1YXNoZWQuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBhdGNobWVfbWF5YmVfc21wX21zZ1swXSA9IDB4MDEwMDAwMDA7IC8qIE5PUCBvdXQgdGhlIGJyYW5jaCAqLworCXRyYXBfdGFibGUtPmluc3Rfb25lID0gbHZsMTRfc2F2ZVswXTsKKwl0cmFwX3RhYmxlLT5pbnN0X3R3byA9IGx2bDE0X3NhdmVbMV07CisJdHJhcF90YWJsZS0+aW5zdF90aHJlZSA9IGx2bDE0X3NhdmVbMl07CisJdHJhcF90YWJsZS0+aW5zdF9mb3VyID0gbHZsMTRfc2F2ZVszXTsKKwlsb2NhbF9mbHVzaF9jYWNoZV9hbGwoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHN1bjRkX2luaXRfdGltZXJzKGlycV9oYW5kbGVyX3QgY291bnRlcl9mbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJY29uc3QgdTMyICpyZWc7CisJaW50IGVycjsKKworCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNwdS11bml0Iik7CisJaWYgKCFkcCkgeworCQlwcm9tX3ByaW50Zigic3VuNGRfaW5pdF90aW1lcnM6IFVuYWJsZSB0byBmaW5kIGNwdS11bml0XG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCisJLyogV2hpY2ggY3B1LXVuaXQgd2UgdXNlIGlzIGFyYml0cmFyeSwgd2UgY2FuIHZpZXcgdGhlIGJvb3RidXMgdGltZXIKKwkgKiByZWdpc3RlcnMgdmlhIGFueSBjcHUncyBtYXBwaW5nLiAgVGhlIGZpcnN0ICdyZWcnIHByb3BlcnR5IGlzIHRoZQorCSAqIGJvb3RidXMuCisJICovCisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFyZWcpIHsKKwkJcHJvbV9wcmludGYoInN1bjRkX2luaXRfdGltZXJzOiBObyByZWcgcHJvcGVydHlcbiIpOworCQlwcm9tX2hhbHQoKTsKKwl9CisKKwlyZXMuc3RhcnQgPSByZWdbMV07CisJcmVzLmVuZCA9IHJlZ1syXSAtIDE7CisJcmVzLmZsYWdzID0gcmVnWzBdICYgMHhmZjsKKwlzdW40ZF90aW1lcnMgPSBvZl9pb3JlbWFwKCZyZXMsIEJXX1RJTUVSX0xJTUlULAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBzdW40ZF90aW1lcl9yZWdzKSwgInVzZXIgdGltZXIiKTsKKwlpZiAoIXN1bjRkX3RpbWVycykgeworCQlwcm9tX3ByaW50Zigic3VuNGRfaW5pdF90aW1lcnM6IENhbid0IG1hcCB0aW1lciByZWdzXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQorCisJc2J1c193cml0ZWwoKCgoMTAwMDAwMC9IWikgKyAxKSA8PCAxMCksICZzdW40ZF90aW1lcnMtPmwxMF90aW1lcl9saW1pdCk7CisKKwltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNGRfdGltZXJzLT5sMTBfY3VyX2NvdW50OworCisJZXJyID0gcmVxdWVzdF9pcnEoVElNRVJfSVJRLCBjb3VudGVyX2ZuLAorCQkJICAoSVJRRl9ESVNBQkxFRCB8IFNBX1NUQVRJQ19BTExPQyksCisJCQkgICJ0aW1lciIsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJcHJvbV9wcmludGYoInN1bjRkX2luaXRfdGltZXJzOiByZXF1ZXN0X2lycSgpIGZhaWxlZCB3aXRoICVkXG4iLCBlcnIpOworCQlwcm9tX2hhbHQoKTsKKwl9CisJc3VuNGRfbG9hZF9wcm9maWxlX2lycXMoKTsKKwlzdW40ZF9maXh1cF90cmFwX3RhYmxlKCk7Cit9CisKIHZvaWQgX19pbml0IHN1bjRkX2luaXRfc2JpX2lycSh2b2lkKQogewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQl1bnNpZ25lZCBtYXNrOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaW50IHRhcmdldF9jcHUgPSAwOworCisjaWZkZWYgQ09ORklHX1NNUAorCXRhcmdldF9jcHUgPSBib290X2NwdV9pZDsKKyNlbmRpZgogCiAJbnNiaSA9IDA7Ci0JZm9yX2VhY2hfc2J1cyhzYnVzKQorCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgInNiaSIpCiAJCW5zYmkrKzsKIAlzYnVzX2FjdGlvbnMgPSBremFsbG9jIChuc2JpICogOCAqIDQgKiBzaXplb2Yoc3RydWN0IHNidXNfYWN0aW9uKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzYnVzX2FjdGlvbnMpIHsKIAkJcHJvbV9wcmludGYoIlNVTjREOiBDYW5ub3QgYWxsb2NhdGUgc2J1c19hY3Rpb25zLCBoYWx0aW5nLlxuIik7CiAJCXByb21faGFsdCgpOwogCX0KLQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLSNpZmRlZiBDT05GSUdfU01QCQotCQlleHRlcm4gdW5zaWduZWQgY2hhciBib290X2NwdV9pZDsKLQkJCi0JCXNldF9zYmlfdGlkKHNidXMtPmRldmlkLCBib290X2NwdV9pZCA8PCAzKTsKLQkJc2J1c190aWRbc2J1cy0+Ym9hcmRdID0gYm9vdF9jcHVfaWQ7Ci0jZW5kaWYKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJzYmkiKSB7CisJCWludCBkZXZpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRldmljZS1pZCIsIDApOworCQlpbnQgYm9hcmQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJib2FyZCMiLCAwKTsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisKKwkJc2V0X3NiaV90aWQoZGV2aWQsIHRhcmdldF9jcHUgPDwgMyk7CisJCXNidXNfdGlkW2JvYXJkXSA9IHRhcmdldF9jcHU7CisKIAkJLyogR2V0IHJpZCBvZiBwZW5kaW5nIGlycXMgZnJvbSBQUk9NICovCi0JCW1hc2sgPSBhY3F1aXJlX3NiaShzYnVzLT5kZXZpZCwgMHhmZmZmZmZmZik7CisJCW1hc2sgPSBhY3F1aXJlX3NiaShkZXZpZCwgMHhmZmZmZmZmZik7CiAJCWlmIChtYXNrKSB7Ci0JCQlwcmludGsgKCJDbGVhcmluZyBwZW5kaW5nIElSUXMgJTA4eCBvbiBTQkkgJWRcbiIsIG1hc2ssIHNidXMtPmJvYXJkKTsKLQkJCXJlbGVhc2Vfc2JpKHNidXMtPmRldmlkLCBtYXNrKTsKKwkJCXByaW50ayAoIkNsZWFyaW5nIHBlbmRpbmcgSVJRcyAlMDh4IG9uIFNCSSAlZFxuIiwgbWFzaywgYm9hcmQpOworCQkJcmVsZWFzZV9zYmkoZGV2aWQsIG1hc2spOwogCQl9CiAJfQogfQpAQCAtNTcyLDExICs1NzYsOSBAQAogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQlCVEZJWFVQU0VUX0NBTEwoc2JpbnRfdG9faXJxLCBzdW40ZF9zYmludF90b19pcnEsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChlbmFibGVfaXJxLCBzdW40ZF9lbmFibGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoZGlzYWJsZV9pcnEsIHN1bjRkX2Rpc2FibGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoY2xlYXJfY2xvY2tfaXJxLCBzdW40ZF9jbGVhcl9jbG9ja19pcnEsIEJURklYVVBDQUxMX05PUk0pOwotCUJURklYVVBTRVRfQ0FMTChjbGVhcl9wcm9maWxlX2lycSwgc3VuNGRfY2xlYXJfcHJvZmlsZV9pcnEsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChsb2FkX3Byb2ZpbGVfaXJxLCBzdW40ZF9sb2FkX3Byb2ZpbGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlzcGFyY19pbml0X3RpbWVycyA9IHN1bjRkX2luaXRfdGltZXJzOwogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX3NtcC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfc21wLmMKaW5kZXggNjk1OTY0MC4uN2E2YTVlNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfc21wLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfc21wLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMzAsNyArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9zYmkuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNzIsNiArNzIsMTcgQEAKIGV4dGVybiB2b2lkIGNwdV9wcm9iZSh2b2lkKTsKIGV4dGVybiB2b2lkIHN1bjRkX2Rpc3RyaWJ1dGVfaXJxcyh2b2lkKTsKIAorc3RhdGljIHVuc2lnbmVkIGNoYXIgY3B1X2xlZHNbMzJdOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19sZWRzKGludCBjcHVpZCkKK3sKKwljcHVpZCAmPSAweDFlOworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RiYSAlMCwgWyUxXSAlMiIgOiA6CisJCQkgICAgICAiciIgKChjcHVfbGVkc1tjcHVpZF0gPDwgNCkgfCBjcHVfbGVkc1tjcHVpZCsxXSksCisJCQkgICAgICAiciIgKEVDU1JfQkFTRShjcHVpZCkgfCBCQl9MRURTKSwKKwkJCSAgICAgICJpIiAoQVNJX01fQ1RMKSk7Cit9CisKIHZvaWQgX19pbml0IHNtcDRkX2NhbGxpbih2b2lkKQogewogCWludCBjcHVpZCA9IGhhcmRfc21wNGRfcHJvY2Vzc29yX2lkKCk7CkBAIC04OCw2ICs5OSw3IEBACiAJbG9jYWxfZmx1c2hfY2FjaGVfYWxsKCk7CiAJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCisJbm90aWZ5X2NwdV9zdGFydGluZyhjcHVpZCk7CiAJLyoKIAkgKiBVbmJsb2NrIHRoZSBtYXN0ZXIgQ1BVIF9vbmx5XyB3aGVuIHRoZSBzY2hlZHVsZXIgc3RhdGUKIAkgKiBvZiBhbGwgc2Vjb25kYXJ5IENQVXMgd2lsbCBiZSB1cC10by1kYXRlLCBzbyBhZnRlcgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1faXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYwppbmRleCA5NGUwMmRlLi5mMTAzMTcxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0zNSw1OSArMzcsMjcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2luY2x1ZGUgImlycS5oIgogCi0vKiBPbiB0aGUgc3VuNG0sIGp1c3QgbGlrZSB0aGUgdGltZXJzLCB3ZSBoYXZlIGJvdGggcGVyLWNwdSBhbmQgbWFzdGVyCi0gKiBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgotICovCi0KLS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgdXNlZCBmb3Igc2VuZGluZy9yZWNlaXZpbmcgaXJxcyBmcm9tL3RvCi0gKiBkaWZmZXJlbnQgY3B1J3MuCi0gKi8KLXN0cnVjdCBzdW40bV9pbnRyZWdfcGVyY3B1IHsKLQl1bnNpZ25lZCBpbnQgdGJ0OyAgICAgICAgLyogSW50ZXJydXB0cyBzdGlsbCBwZW5kaW5nIGZvciB0aGlzIGNwdS4gKi8KLQotCS8qIFRoZXNlIG5leHQgdHdvIHJlZ2lzdGVycyBhcmUgV1JJVEUtT05MWSBhbmQgYXJlIG9ubHkKLQkgKiAib24gYml0IiBzZW5zaXRpdmUsICJvZmYgYml0cyIgd3JpdHRlbiBoYXZlIE5PIGFmZmVjdC4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgY2xlYXI7ICAvKiBDbGVhciB0aGlzIGNwdXMgaXJxcyBoZXJlLiAqLwotCXVuc2lnbmVkIGludCBzZXQ7ICAgIC8qIFNldCB0aGlzIGNwdXMgaXJxcyBoZXJlLiAqLwotCXVuc2lnbmVkIGNoYXIgc3BhY2VbUEFHRV9TSVpFIC0gMTJdOworc3RydWN0IHN1bjRtX2lycV9wZXJjcHUgeworCXUzMgkJcGVuZGluZzsKKwl1MzIJCWNsZWFyOworCXUzMgkJc2V0OwogfTsKIAotLyoKLSAqIGRqaHIKLSAqIEFjdHVhbGx5IHRoZSBjbGVhciBhbmQgc2V0IGZpZWxkcyBpbiB0aGlzIHN0cnVjdCBhcmUgbWlzbGVhZGluZy4uCi0gKiBhY2NvcmRpbmcgdG8gdGhlIFNMQVZJTyBtYW51YWwgKGFuZCB0aGUgc2FtZSBhcHBsaWVzIGZvciB0aGUgU0VDKQotICogdGhlIGNsZWFyIGZpZWxkIGNsZWFycyBiaXRzIGluIHRoZSBtYXNrIHdoaWNoIHdpbGwgRU5BQkxFIHRoYXQgSVJRCi0gKiB0aGUgc2V0IGZpZWxkIHNldHMgYml0cyBpbiB0aGUgbWFzayB0byBESVNBQkxFIHRoZSBJUlEuCi0gKgotICogQWxzbyB0aGUgdW5kaXJlY3RlZF94eCBhZGRyZXNzIGluIHRoZSBTTEFWSU8gaXMgZGVmaW5lZCBhcwotICogUkVTRVJWRUQgYW5kIHdyaXRlIG9ubHkuLgotICoKLSAqIERBVkVNX05PVEU6IFRoZSBTTEFWSU8gb25seSBzcGVjaWZpZXMgYmVoYXZpb3Igb24gdW5pcHJvY2Vzc29yCi0gKiAgICAgICAgICAgICBzdW40bSBtYWNoaW5lcywgZm9yIE1QIHRoZSBsYXlvdXQgbWFrZXMgbW9yZSBzZW5zZS4KLSAqLwotc3RydWN0IHN1bjRtX2ludHJlZ3MgewotCXN0cnVjdCBzdW40bV9pbnRyZWdfcGVyY3B1IGNwdV9pbnRyZWdzW1NVTjRNX05DUFVTXTsKLQl1bnNpZ25lZCBpbnQgdGJ0OyAgICAgICAgICAgICAgICAvKiBJUlEncyB0aGF0IGFyZSBzdGlsbCBwZW5kaW5nLiAqLwotCXVuc2lnbmVkIGludCBpcnFzOyAgICAgICAgICAgICAgIC8qIE1hc3RlciBJUlEgYml0cy4gKi8KLQotCS8qIEFnYWluLCBsaWtlIHRoZSBhYm92ZSwgdHdvIHRoZXNlIHJlZ2lzdGVycyBhcmUgV1JJVEUtT05MWS4gKi8KLQl1bnNpZ25lZCBpbnQgY2xlYXI7ICAgICAgICAgICAgICAvKiBDbGVhciBtYXN0ZXIgSVJRJ3MgYnkgc2V0dGluZyBiaXRzIGhlcmUuICovCi0JdW5zaWduZWQgaW50IHNldDsgICAgICAgICAgICAgICAgLyogU2V0IG1hc3RlciBJUlEncyBieSBzZXR0aW5nIGJpdHMgaGVyZS4gKi8KLQotCS8qIFRoaXMgcmVnaXN0ZXIgaXMgYm90aCBSRUFEIGFuZCBXUklURS4gKi8KLQl1bnNpZ25lZCBpbnQgdW5kaXJlY3RlZF90YXJnZXQ7ICAvKiBXaGljaCBjcHUgZ2V0cyB1bmRpcmVjdGVkIGlycXMuICovCitzdHJ1Y3Qgc3VuNG1faXJxX2dsb2JhbCB7CisJdTMyCQlwZW5kaW5nOworCXUzMgkJbWFzazsKKwl1MzIJCW1hc2tfY2xlYXI7CisJdTMyCQltYXNrX3NldDsKKwl1MzIJCWludGVycnVwdF90YXJnZXQ7CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkdW1teTsKLQotc3RydWN0IHN1bjRtX2ludHJlZ3MgKnN1bjRtX2ludGVycnVwdHM7Ci11bnNpZ25lZCBsb25nICppcnFfcmN2cmVnID0gJmR1bW15OworLyogQ29kZSBpbiBlbnRyeS5TIG5lZWRzIHRvIGdldCBhdCB0aGVzZSByZWdpc3RlciBtYXBwaW5ncy4gICovCitzdHJ1Y3Qgc3VuNG1faXJxX3BlcmNwdSBfX2lvbWVtICpzdW40bV9pcnFfcGVyY3B1W1NVTjRNX05DUFVTXTsKK3N0cnVjdCBzdW40bV9pcnFfZ2xvYmFsIF9faW9tZW0gKnN1bjRtX2lycV9nbG9iYWw7CiAKIC8qIERhdmUgUmVkbWFuIChkamhyQHRhZHBvbGUuY28udWspCiAgKiBUaGUgc3VuNG0gaW50ZXJydXB0IHJlZ2lzdGVycy4KQEAgLTEwMSw4ICs3MSw5IEBACiAKICNkZWZpbmUJU1VONE1fSU5UX01BU0tBTEwJMHg4MDAwMDAwMAkgIC8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KICNkZWZpbmUJU1VONE1fSU5UX01PRFVMRV9FUlIJMHg0MDAwMDAwMAkgIC8qIG1vZHVsZSBlcnJvciAqLwotI2RlZmluZQlTVU40TV9JTlRfTTJTX1dSSVRFCTB4MjAwMDAwMDAJICAvKiB3cml0ZSBidWZmZXIgZXJyb3IgKi8KLSNkZWZpbmUJU1VONE1fSU5UX0VDQwkJMHgxMDAwMDAwMAkgIC8qIGVjYyBtZW1vcnkgZXJyb3IgKi8KKyNkZWZpbmUJU1VONE1fSU5UX00yU19XUklURV9FUlIJMHgyMDAwMDAwMAkgIC8qIHdyaXRlIGJ1ZmZlciBlcnJvciAqLworI2RlZmluZQlTVU40TV9JTlRfRUNDX0VSUgkweDEwMDAwMDAwCSAgLyogZWNjIG1lbW9yeSBlcnJvciAqLworI2RlZmluZQlTVU40TV9JTlRfVk1FX0VSUgkweDA4MDAwMDAwCSAgLyogdm1lIGFzeW5jIGVycm9yICovCiAjZGVmaW5lCVNVTjRNX0lOVF9GTE9QUFkJMHgwMDQwMDAwMAkgIC8qIGZsb3BweSBkaXNrICovCiAjZGVmaW5lCVNVTjRNX0lOVF9NT0RVTEUJMHgwMDIwMDAwMAkgIC8qIG1vZHVsZSBpbnRlcnJ1cHQgKi8KICNkZWZpbmUJU1VONE1fSU5UX1ZJREVPCQkweDAwMTAwMDAwCSAgLyogb25ib2FyZCB2aWRlbyAqLwpAQCAtMTEzLDc1ICs4NCwxMjYgQEAKICNkZWZpbmUJU1VONE1fSU5UX1NFUklBTAkweDAwMDA4MDAwCSAgLyogc2VyaWFsIHBvcnRzICovCiAjZGVmaW5lCVNVTjRNX0lOVF9LQkRNUwkJMHgwMDAwNDAwMAkgIC8qIGtleWJvYXJkL21vdXNlICovCiAjZGVmaW5lCVNVTjRNX0lOVF9TQlVTQklUUwkweDAwMDAzRjgwCSAgLyogc2J1cyBpbnQgYml0cyAqLworI2RlZmluZQlTVU40TV9JTlRfVk1FQklUUwkweDAwMDAwMDdGCSAgLyogdm1lIGludCBiaXRzICovCisKKyNkZWZpbmUJU1VONE1fSU5UX0VSUk9SCQkoU1VONE1fSU5UX01PRFVMRV9FUlIgfCAgICBcCisJCQkJIFNVTjRNX0lOVF9NMlNfV1JJVEVfRVJSIHwgXAorCQkJCSBTVU40TV9JTlRfRUNDX0VSUiB8ICAgICAgIFwKKwkJCQkgU1VONE1fSU5UX1ZNRV9FUlIpCiAKICNkZWZpbmUgU1VONE1fSU5UX1NCVVMoeCkJKDEgPDwgKHgrNykpCiAjZGVmaW5lIFNVTjRNX0lOVF9WTUUoeCkJKDEgPDwgKHgpKQogCi0vKiBUaGVzZSB0YWJsZXMgb25seSBhcHBseSBmb3IgaW50ZXJydXB0cyBncmVhdGVyIHRoYW4gMTUuLgotICogCi0gKiBhbnkgaW50ciB2YWx1ZSBiZWxvdyAweDEwIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzb2Z0LWludAotICogdGhpcyBtYXkgYmUgdXNlZnVsIG9yIGl0IG1heSBub3QuLiBidXQgdGhhdCdzIGhvdyBJJ3ZlIGRvbmUgaXQuCi0gKiBhbmQgaXQgd29uJ3QgY2xhc2ggd2l0aCB3aGF0IE9CUCBpcyB0ZWxsaW5nIHVzIGFib3V0IGRldmljZXMuCisvKiBJbnRlcnJ1cHQgbGV2ZWxzIHVzZWQgYnkgT0JQICovCisjZGVmaW5lCU9CUF9JTlRfTEVWRUxfU09GVAkweDEwCisjZGVmaW5lCU9CUF9JTlRfTEVWRUxfT05CT0FSRAkweDIwCisjZGVmaW5lCU9CUF9JTlRfTEVWRUxfU0JVUwkweDMwCisjZGVmaW5lCU9CUF9JTlRfTEVWRUxfVk1FCTB4NDAKKworLyogSW50ZXJydXB0IGxldmVsIGFzc2lnbm1lbnQgb24gc3VuNG06CiAgKgotICogdGFrZSBhbiBlbmNvZGVkIGludHIgdmFsdWUgYW5kIGxvb2t1cCBpZiBpdCdzIHZhbGlkCi0gKiB0aGVuIGdldCB0aGUgbWFzayBiaXRzIHRoYXQgbWF0Y2ggZnJvbSBpcnFfbWFzaworICoJbGV2ZWwJCXNvdXJjZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgMQkJc29mdGludC0xCisgKgkgIDIJCXNvZnRpbnQtMiwgVk1FL1NCVVMgbGV2ZWwgMQorICoJICAzCQlzb2Z0aW50LTMsIFZNRS9TQlVTIGxldmVsIDIKKyAqCSAgNAkJc29mdGludC00LCBvbmJvYXJkIFNDU0kKKyAqCSAgNQkJc29mdGludC01LCBWTUUvU0JVUyBsZXZlbCAzCisgKgkgIDYJCXNvZnRpbnQtNiwgb25ib2FyZCBFVEhFUk5FVAorICoJICA3CQlzb2Z0aW50LTcsIFZNRS9TQlVTIGxldmVsIDQKKyAqCSAgOAkJc29mdGludC04LCBvbmJvYXJkIFZJREVPCisgKgkgIDkJCXNvZnRpbnQtOSwgVk1FL1NCVVMgbGV2ZWwgNSwgTW9kdWxlIEludGVycnVwdAorICoJIDEwCQlzb2Z0aW50LTEwLCBzeXN0ZW0gY291bnRlci90aW1lcgorICoJIDExCQlzb2Z0aW50LTExLCBWTUUvU0JVUyBsZXZlbCA2LCBGbG9wcHkKKyAqCSAxMgkJc29mdGludC0xMiwgS2V5Ym9hcmQvTW91c2UsIFNlcmlhbAorICoJIDEzCQlzb2Z0aW50LTEzLCBWTUUvU0JVUyBsZXZlbCA3LCBJU0ROIEF1ZGlvCisgKgkgMTQJCXNvZnRpbnQtMTQsIHBlci1wcm9jZXNzb3IgY291bnRlci90aW1lcgorICoJIDE1CQlzb2Z0aW50LTE1LCBBc3luY2hyb25vdXMgRXJyb3JzIChicm9hZGNhc3QpCiAgKgotICogUDM6IFRyYW5zbGF0aW9uIGZyb20gaXJxIDB4MGQgdG8gbWFzayAweDIwMDAgaXMgZm9yIE1yQ29mZmVlLgorICogRWFjaCBpbnRlcnJ1cHQgc291cmNlIGlzIG1hc2tlZCBkaXN0aW5jdGx5IGluIHRoZSBzdW40bSBpbnRlcnJ1cHQKKyAqIHJlZ2lzdGVycy4gIFRoZSBQSUwgbGV2ZWwgYWxvbmUgaXMgdGhlcmVmb3JlIGFtYmlndW91cywgc2luY2UgbXVsdGlwbGUKKyAqIGludGVycnVwdCBzb3VyY2VzIG1hcCB0byBhIHNpbmdsZSBQSUwuCisgKgorICogVGhpcyBhbWJpZ3VpdHkgaXMgcmVzb2x2ZWQgaW4gdGhlICdpbnRyJyBwcm9wZXJ0eSBmb3IgZGV2aWNlIG5vZGVzCisgKiBpbiB0aGUgT0YgZGV2aWNlIHRyZWUuICBFYWNoICdpbnRyJyBwcm9wZXJ0eSBlbnRyeSBpcyBjb21wb3NlZCBvZgorICogdHdvIDMyLWJpdCB3b3Jkcy4gIFRoZSBmaXJzdCB3b3JkIGlzIHRoZSBJUlEgcHJpb3JpdHkgdmFsdWUsIHdoaWNoCisgKiBpcyB3aGF0IHdlJ3JlIGludGVyc3RlZCBpbi4gIFRoZSBzZWNvbmQgd29yZCBpcyB0aGUgSVJRIHZlY3Rvciwgd2hpY2gKKyAqIGlzIHVudXNlZC4KKyAqCisgKiBUaGUgbG93IDQgYml0cyBvZiB0aGUgSVJRIHByaW9yaXR5IGluZGljYXRlIHRoZSBQSUwsIGFuZCB0aGUgdXBwZXIKKyAqIDQgYml0cyBpbmRpY2F0ZSBvbmJvYXJkIHZzLiBTQlVTIGxldmVsZWQgdnMuIFZNRSBsZXZlbGVkLiAgMHgyMAorICogbWVhbnMgb25ib2FyZCwgMHgzMCBtZWFucyBTQlVTIGxldmVsZWQsIGFuZCAweDQwIG1lYW5zIFZNRSBsZXZlbGVkLgorICoKKyAqIEZvciBleGFtcGxlLCBhbiAnaW50cicgSVJRIHByaW9yaXR5IHZhbHVlIG9mIDB4MjQgaXMgb25ib2FyZCBTQ1NJCisgKiB3aGVyZWFzIGEgdmFsdWUgb2YgMHgzMyBpcyBTQlVTIGxldmVsIDIuICBIZXJlIGFyZSBzb21lIHNhbXBsZQorICogJ2ludHInIHByb3BlcnR5IElSUSBwcmlvcml0eSB2YWx1ZXMgZnJvbSBzczQsIHNzNSwgc3MxMCwgc3MyMCwgYW5kCisgKiBUYWRwb2xlIFMzIEdYIHN5c3RlbXMuCisgKgorICogZXNwOiAJMHgyNAlvbmJvYXJkIEVTUCBTQ1NJCisgKiBsZTogIAkweDI2CW9uYm9hcmQgTGFuY2UgRVRIRVJORVQKKyAqIHA5MTAwOgkweDMyCVNCVVMgbGV2ZWwgMSBQOTEwMCB2aWRlbworICogYnBwOiAgCTB4MzMJU0JVUyBsZXZlbCAyIEJQUCBwYXJhbGxlbCBwb3J0IGRldmljZQorICogREJSSToJMHgzOQlTQlVTIGxldmVsIDUgREJSSSBJU0ROIGF1ZGlvCisgKiBTVU5XLGxlbzoJMHgzOQlTQlVTIGxldmVsIDUgTEVPIHZpZGVvCisgKiBwY21jaWE6CTB4M2IJU0JVUyBsZXZlbCA2IFBDTUNJQSBjb250cm9sbGVyCisgKiB1Y3RybDoJMHgzYglTQlVTIGxldmVsIDYgVUNUUkwgZGV2aWNlCisgKiBtb2RlbToJMHgzZAlTQlVTIGxldmVsIDcgTU9ERU0KKyAqIHpzOgkJMHgyYwlvbmJvYXJkIGtleWJvYXJkL21vdXNlL3NlcmlhbAorICogZmxvcHB5OgkweDJiCW9uYm9hcmQgRmxvcHB5CisgKiBwb3dlcjoJMHgyMglvbmJvYXJkIHBvd2VyIGRldmljZSAoWFhYIHVua25vd24gbWFzayBiaXQgWFhYKQogICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBpcnFfeGxhdGVbMzJdID0gewotICAgIC8qICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgYSwgIGIsICBjLCAgZCwgIGUsICBmICovCi0JMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMiwgIDAsICAzLCAgMCwgIDQsICA1LCAgNiwgMTQsICAwLCAgNywKLQkwLCAgMCwgIDgsICA5LCAgMCwgMTAsICAwLCAxMSwgIDAsIDEyLCAgMCwgMTMsICAwLCAxNCwgIDAsICAwCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9tYXNrWzB4NTBdID0geworCS8qIFNNUCAqLworCTAsICBTVU40TV9TT0ZUX0lOVCgxKSwKKwlTVU40TV9TT0ZUX0lOVCgyKSwgIFNVTjRNX1NPRlRfSU5UKDMpLAorCVNVTjRNX1NPRlRfSU5UKDQpLCAgU1VONE1fU09GVF9JTlQoNSksCisJU1VONE1fU09GVF9JTlQoNiksICBTVU40TV9TT0ZUX0lOVCg3KSwKKwlTVU40TV9TT0ZUX0lOVCg4KSwgIFNVTjRNX1NPRlRfSU5UKDkpLAorCVNVTjRNX1NPRlRfSU5UKDEwKSwgU1VONE1fU09GVF9JTlQoMTEpLAorCVNVTjRNX1NPRlRfSU5UKDEyKSwgU1VONE1fU09GVF9JTlQoMTMpLAorCVNVTjRNX1NPRlRfSU5UKDE0KSwgU1VONE1fU09GVF9JTlQoMTUpLAorCS8qIHNvZnQgKi8KKwkwLCAgU1VONE1fU09GVF9JTlQoMSksCisJU1VONE1fU09GVF9JTlQoMiksICBTVU40TV9TT0ZUX0lOVCgzKSwKKwlTVU40TV9TT0ZUX0lOVCg0KSwgIFNVTjRNX1NPRlRfSU5UKDUpLAorCVNVTjRNX1NPRlRfSU5UKDYpLCAgU1VONE1fU09GVF9JTlQoNyksCisJU1VONE1fU09GVF9JTlQoOCksICBTVU40TV9TT0ZUX0lOVCg5KSwKKwlTVU40TV9TT0ZUX0lOVCgxMCksIFNVTjRNX1NPRlRfSU5UKDExKSwKKwlTVU40TV9TT0ZUX0lOVCgxMiksIFNVTjRNX1NPRlRfSU5UKDEzKSwKKwlTVU40TV9TT0ZUX0lOVCgxNCksIFNVTjRNX1NPRlRfSU5UKDE1KSwKKwkvKiBvbmJvYXJkICovCisJMCwgMCwgMCwgMCwKKwlTVU40TV9JTlRfU0NTSSwgIDAsIFNVTjRNX0lOVF9FVEhFUk5FVCwgMCwKKwlTVU40TV9JTlRfVklERU8sIFNVTjRNX0lOVF9NT0RVTEUsCisJU1VONE1fSU5UX1JFQUxUSU1FLCBTVU40TV9JTlRfRkxPUFBZLAorCShTVU40TV9JTlRfU0VSSUFMIHwgU1VONE1fSU5UX0tCRE1TKSwKKwlTVU40TV9JTlRfQVVESU8sIDAsIFNVTjRNX0lOVF9NT0RVTEVfRVJSLAorCS8qIHNidXMgKi8KKwkwLCAwLCBTVU40TV9JTlRfU0JVUygwKSwgU1VONE1fSU5UX1NCVVMoMSksCisJMCwgU1VONE1fSU5UX1NCVVMoMiksIDAsIFNVTjRNX0lOVF9TQlVTKDMpLAorCTAsIFNVTjRNX0lOVF9TQlVTKDQpLCAwLCBTVU40TV9JTlRfU0JVUyg1KSwKKwkwLCBTVU40TV9JTlRfU0JVUyg2KSwgMCwgMCwKKwkvKiB2bWUgKi8KKwkwLCAwLCBTVU40TV9JTlRfVk1FKDApLCBTVU40TV9JTlRfVk1FKDEpLAorCTAsIFNVTjRNX0lOVF9WTUUoMiksIDAsIFNVTjRNX0lOVF9WTUUoMyksCisJMCwgU1VONE1fSU5UX1ZNRSg0KSwgMCwgU1VONE1fSU5UX1ZNRSg1KSwKKwkwLCBTVU40TV9JTlRfVk1FKDYpLCAwLCAwCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfbWFza1tdID0gewotCTAsCQkJCQkJICAvKiBpbGxlZ2FsIGluZGV4ICovCi0JU1VONE1fSU5UX1NDU0ksCQkJCSAgCSAgLyogIDEgaXJxIDQgKi8KLQlTVU40TV9JTlRfRVRIRVJORVQsCQkJCSAgLyogIDIgaXJxIDYgKi8KLQlTVU40TV9JTlRfVklERU8sCQkJCSAgLyogIDMgaXJxIDggKi8KLQlTVU40TV9JTlRfUkVBTFRJTUUsCQkJCSAgLyogIDQgaXJxIDEwICovCi0JU1VONE1fSU5UX0ZMT1BQWSwJCQkJICAvKiAgNSBpcnEgMTEgKi8KLQkoU1VONE1fSU5UX1NFUklBTCB8IFNVTjRNX0lOVF9LQkRNUyksCSAgCSAgLyogIDYgaXJxIDEyICovCi0JU1VONE1fSU5UX01PRFVMRV9FUlIsCQkJICAJICAvKiAgNyBpcnEgMTUgKi8KLQlTVU40TV9JTlRfU0JVUygwKSwJCQkJICAvKiAgOCBpcnEgMiAqLwotCVNVTjRNX0lOVF9TQlVTKDEpLAkJCQkgIC8qICA5IGlycSAzICovCi0JU1VONE1fSU5UX1NCVVMoMiksCQkJCSAgLyogMTAgaXJxIDUgKi8KLQlTVU40TV9JTlRfU0JVUygzKSwJCQkJICAvKiAxMSBpcnEgNyAqLwotCVNVTjRNX0lOVF9TQlVTKDQpLAkJCQkgIC8qIDEyIGlycSA5ICovCi0JU1VONE1fSU5UX1NCVVMoNSksCQkJCSAgLyogMTMgaXJxIDExICovCi0JU1VONE1fSU5UX1NCVVMoNikJCQkJICAvKiAxNCBpcnEgMTMgKi8KLX07Ci0KLXN0YXRpYyBpbnQgc3VuNG1fcGlsX21hcFtdID0geyAwLCAyLCAzLCA1LCA3LCA5LCAxMSwgMTMgfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBzdW40bV9zYmludF90b19pcnEoc3RydWN0IHNidXNfZGV2ICpzZGV2LAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2JpbnQpCi17Ci0JaWYgKHNiaW50ID49IHNpemVvZihzdW40bV9waWxfbWFwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBTQklOVCAlZFxuIiwgc2Rldi0+cHJvbV9uYW1lLCBzYmludCk7Ci0JCUJVRygpOwotCX0KLQlyZXR1cm4gc3VuNG1fcGlsX21hcFtzYmludF0gfCAweDMwOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdW40bV9nZXRfaXJxbWFzayh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGxvbmcgbWFzazsKICAgICAKLQlpZiAoaXJxID4gMHgyMCkgewotCQkvKiBPQklPL1NCVVMgaW50ZXJydXB0cyAqLwotCQlpcnEgJj0gMHgxZjsKLQkJbWFzayA9IGlycV9tYXNrW2lycV94bGF0ZVtpcnFdXTsKLQkJaWYgKCFtYXNrKQotCQkJcHJpbnRrKCJzdW40bV9nZXRfaXJxbWFzazogSVJRJWQgaGFzIG5vIHZhbGlkIG1hc2shXG4iLGlycSk7Ci0JfSBlbHNlIHsKLQkJLyogU29mdCBJbnRlcnJ1cHRzIHdpbGwgY29tZSBoZXJlLgotCQkgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gd2F5IHRvIHRyaWdnZXIgdGhlbSBidXQgSSdtIHN1cmUKLQkJICogc29tZXRoaW5nIGNvdWxkIGJlIGNvb2tlZCB1cC4KLQkJICovCi0JCWlycSAmPSAweGY7Ci0JCW1hc2sgPSBTVU40TV9TT0ZUX0lOVChpcnEpOwotCX0KKwlpZiAoaXJxIDwgMHg1MCkKKwkJbWFzayA9IGlycV9tYXNrW2lycV07CisJZWxzZQorCQltYXNrID0gMDsKKworCWlmICghbWFzaykKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW40bV9nZXRfaXJxbWFzazogSVJRJWQgaGFzIG5vIHZhbGlkIG1hc2shXG4iLAorCQkgICAgICAgaXJxKTsKKwogCXJldHVybiBtYXNrOwogfQogCkBAIC0xOTMsOSArMjE1LDkgQEAKIAltYXNrID0gc3VuNG1fZ2V0X2lycW1hc2soaXJxX25yKTsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGlycV9uciA+IDE1KQotCQlzdW40bV9pbnRlcnJ1cHRzLT5zZXQgPSBtYXNrOworCQlzYnVzX3dyaXRlbChtYXNrLCAmc3VuNG1faXJxX2dsb2JhbC0+bWFza19zZXQpOwogCWVsc2UKLQkJc3VuNG1faW50ZXJydXB0cy0+Y3B1X2ludHJlZ3NbY3B1XS5zZXQgPSBtYXNrOworCQlzYnVzX3dyaXRlbChtYXNrLCAmc3VuNG1faXJxX3BlcmNwdVtjcHVdLT5zZXQpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgICAgCiB9CiAKQEAgLTIxMiwxMyArMjM0LDEzIEBACiAJCW1hc2sgPSBzdW40bV9nZXRfaXJxbWFzayhpcnFfbnIpOwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCWlmIChpcnFfbnIgPiAxNSkKLQkJCXN1bjRtX2ludGVycnVwdHMtPmNsZWFyID0gbWFzazsKKwkJCXNidXNfd3JpdGVsKG1hc2ssICZzdW40bV9pcnFfZ2xvYmFsLT5tYXNrX2NsZWFyKTsKIAkJZWxzZQotCQkJc3VuNG1faW50ZXJydXB0cy0+Y3B1X2ludHJlZ3NbY3B1XS5jbGVhciA9IG1hc2s7CisJCQlzYnVzX3dyaXRlbChtYXNrLCAmc3VuNG1faXJxX3BlcmNwdVtjcHVdLT5jbGVhcik7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgICAgCiAJfSBlbHNlIHsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlzdW40bV9pbnRlcnJ1cHRzLT5jbGVhciA9IFNVTjRNX0lOVF9GTE9QUFk7CisJCXNidXNfd3JpdGVsKFNVTjRNX0lOVF9GTE9QUFksICZzdW40bV9pcnFfZ2xvYmFsLT5tYXNrX2NsZWFyKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KQEAgLTIzNiwxMCArMjU4LDEwIEBACiAvKjkqLwlTVU40TV9JTlRfU0JVUyg0KSB8IFNVTjRNX0lOVF9WTUUoNCkgfCBTVU40TV9JTlRfTU9EVUxFX0VSUiwKIC8qMTAqLwlTVU40TV9JTlRfUkVBTFRJTUUsCiAvKjExKi8JU1VONE1fSU5UX1NCVVMoNSkgfCBTVU40TV9JTlRfVk1FKDUpIHwgU1VONE1fSU5UX0ZMT1BQWSwKLS8qMTIqLwlTVU40TV9JTlRfU0VSSUFMIHwgU1VONE1fSU5UX0tCRE1TLAotLyoxMyovCVNVTjRNX0lOVF9BVURJTywKKy8qMTIqLwlTVU40TV9JTlRfU0VSSUFMICB8IFNVTjRNX0lOVF9LQkRNUywKKy8qMTMqLwlTVU40TV9JTlRfU0JVUyg2KSB8IFNVTjRNX0lOVF9WTUUoNikgfCBTVU40TV9JTlRfQVVESU8sCiAvKjE0Ki8JU1VONE1fSU5UX0UxNCwKLS8qMTUqLwkweDAwMDAwMDAwCisvKjE1Ki8JU1VONE1fSU5UX0VSUk9SCiB9OwogCiAvKiBXZSBhc3N1bWUgdGhlIGNhbGxlciBoYXMgZGlzYWJsZWQgbG9jYWwgaW50ZXJydXB0cyB3aGVuIHRoZXNlIGFyZSBjYWxsZWQsCkBAIC0yNDcsMTI2ICsyNjksMTQxIEBACiAgKi8KIHN0YXRpYyB2b2lkIHN1bjRtX2Rpc2FibGVfcGlsX2lycSh1bnNpZ25lZCBpbnQgcGlsKQogewotCXN1bjRtX2ludGVycnVwdHMtPnNldCA9IGNwdV9waWxfdG9faW1hc2tbcGlsXTsKKwlzYnVzX3dyaXRlbChjcHVfcGlsX3RvX2ltYXNrW3BpbF0sICZzdW40bV9pcnFfZ2xvYmFsLT5tYXNrX3NldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjRtX2VuYWJsZV9waWxfaXJxKHVuc2lnbmVkIGludCBwaWwpCiB7Ci0Jc3VuNG1faW50ZXJydXB0cy0+Y2xlYXIgPSBjcHVfcGlsX3RvX2ltYXNrW3BpbF07CisJc2J1c193cml0ZWwoY3B1X3BpbF90b19pbWFza1twaWxdLCAmc3VuNG1faXJxX2dsb2JhbC0+bWFza19jbGVhcik7CiB9CiAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzdW40bV9zZW5kX2lwaShpbnQgY3B1LCBpbnQgbGV2ZWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCi0JbWFzayA9IHN1bjRtX2dldF9pcnFtYXNrKGxldmVsKTsKLQlzdW40bV9pbnRlcnJ1cHRzLT5jcHVfaW50cmVnc1tjcHVdLnNldCA9IG1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gc3VuNG1fZ2V0X2lycW1hc2sobGV2ZWwpOworCXNidXNfd3JpdGVsKG1hc2ssICZzdW40bV9pcnFfcGVyY3B1W2NwdV0tPnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjRtX2NsZWFyX2lwaShpbnQgY3B1LCBpbnQgbGV2ZWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCi0JbWFzayA9IHN1bjRtX2dldF9pcnFtYXNrKGxldmVsKTsKLQlzdW40bV9pbnRlcnJ1cHRzLT5jcHVfaW50cmVnc1tjcHVdLmNsZWFyID0gbWFzazsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBzdW40bV9nZXRfaXJxbWFzayhsZXZlbCk7CisJc2J1c193cml0ZWwobWFzaywgJnN1bjRtX2lycV9wZXJjcHVbY3B1XS0+Y2xlYXIpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40bV9zZXRfdWR0KGludCBjcHUpCiB7Ci0Jc3VuNG1faW50ZXJydXB0cy0+dW5kaXJlY3RlZF90YXJnZXQgPSBjcHU7CisJc2J1c193cml0ZWwoY3B1LCAmc3VuNG1faXJxX2dsb2JhbC0+aW50ZXJydXB0X3RhcmdldCk7CiB9CiAjZW5kaWYKIAotI2RlZmluZSBPQklPX0lOVFIJMHgyMAotI2RlZmluZSBUSU1FUl9JUlEgIAkoT0JJT19JTlRSIHwgMTApCi0jZGVmaW5lIFBST0ZJTEVfSVJRCShPQklPX0lOVFIgfCAxNCkKK3N0cnVjdCBzdW40bV90aW1lcl9wZXJjcHUgeworCXUzMgkJbDE0X2xpbWl0OworCXUzMgkJbDE0X2NvdW50OworCXUzMgkJbDE0X2xpbWl0X25vY2xlYXI7CisJdTMyCQl1c2VyX3RpbWVyX3N0YXJ0X3N0b3A7Cit9OwogCi1zdGF0aWMgc3RydWN0IHN1bjRtX3RpbWVyX3JlZ3MgKnN1bjRtX3RpbWVyczsKK3N0YXRpYyBzdHJ1Y3Qgc3VuNG1fdGltZXJfcGVyY3B1IF9faW9tZW0gKnRpbWVyc19wZXJjcHVbU1VONE1fTkNQVVNdOworCitzdHJ1Y3Qgc3VuNG1fdGltZXJfZ2xvYmFsIHsKKwl1MzIJCWwxMF9saW1pdDsKKwl1MzIJCWwxMF9jb3VudDsKKwl1MzIJCWwxMF9saW1pdF9ub2NsZWFyOworCXUzMgkJcmVzZXJ2ZWQ7CisJdTMyCQl0aW1lcl9jb25maWc7Cit9OworCitzdGF0aWMgc3RydWN0IHN1bjRtX3RpbWVyX2dsb2JhbCBfX2lvbWVtICp0aW1lcnNfZ2xvYmFsOworCisjZGVmaW5lIFRJTUVSX0lSUSAgCShPQlBfSU5UX0xFVkVMX09OQk9BUkQgfCAxMCkKKwogdW5zaWduZWQgaW50IGx2bDE0X3Jlc29sdXRpb24gPSAoKCgxMDAwMDAwL0haKSArIDEpIDw8IDEwKTsKIAogc3RhdGljIHZvaWQgc3VuNG1fY2xlYXJfY2xvY2tfaXJxKHZvaWQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IGNsZWFyX2ludHI7Ci0JY2xlYXJfaW50ciA9IHN1bjRtX3RpbWVycy0+bDEwX3RpbWVyX2xpbWl0OworCXNidXNfcmVhZGwoJnRpbWVyc19nbG9iYWwtPmwxMF9saW1pdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjRtX2NsZWFyX3Byb2ZpbGVfaXJxKGludCBjcHUpCit2b2lkIHN1bjRtX25taShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY2xlYXI7Ci0gICAgCi0JY2xlYXIgPSBzdW40bV90aW1lcnMtPmNwdV90aW1lcnNbY3B1XS5sMTRfdGltZXJfbGltaXQ7CisJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBzaTsKKworCXByaW50ayhLRVJOX0VSUiAiQWllZWU6IHN1bjRtIE5NSSByZWNlaXZlZCFcbiIpOworCS8qIFhYWCBIeXBlclNwYXJjIGhhY2sgWFhYICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAweDUwMCwgJSVnMVxuXHQiCisJCQkgICAgICJsZGEgWyUlZzFdIDB4NCwgJTBcblx0IgorCQkJICAgICAibW92IDB4NjAwLCAlJWcxXG5cdCIKKwkJCSAgICAgImxkYSBbJSVnMV0gMHg0LCAlMVxuXHQiIDoKKwkJCSAgICAgIj1yIiAoYWZzciksICI9ciIgKGFmYXIpKTsKKwlwcmludGsoS0VSTl9FUlIgImFmc3I9JTA4bHggYWZhcj0lMDhseFxuIiwgYWZzciwgYWZhcik7CisJc2kgPSBzYnVzX3JlYWRsKCZzdW40bV9pcnFfZ2xvYmFsLT5wZW5kaW5nKTsKKwlwcmludGsoS0VSTl9FUlIgInNpPSUwOGx4XG4iLCBzaSk7CisJaWYgKHNpICYgU1VONE1fSU5UX01PRFVMRV9FUlIpCisJCXByaW50ayhLRVJOX0VSUiAiTW9kdWxlIGFzeW5jIGVycm9yXG4iKTsKKwlpZiAoc2kgJiBTVU40TV9JTlRfTTJTX1dSSVRFX0VSUikKKwkJcHJpbnRrKEtFUk5fRVJSICJNQnVzL1NCdXMgYXN5bmMgZXJyb3JcbiIpOworCWlmIChzaSAmIFNVTjRNX0lOVF9FQ0NfRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIkVDQyBtZW1vcnkgZXJyb3JcbiIpOworCWlmIChzaSAmIFNVTjRNX0lOVF9WTUVfRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIlZNRSBhc3luYyBlcnJvclxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJ5b3UgbG9zZSBidWRkeSBib3kuLi5cbiIpOworCXNob3dfcmVncyhyZWdzKTsKKwlwcm9tX2hhbHQoKTsKK30KKworLyogRXhwb3J0ZWQgZm9yIHN1bjRtX3NtcC5jICovCit2b2lkIHN1bjRtX2NsZWFyX3Byb2ZpbGVfaXJxKGludCBjcHUpCit7CisJc2J1c19yZWFkbCgmdGltZXJzX3BlcmNwdVtjcHVdLT5sMTRfbGltaXQpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40bV9sb2FkX3Byb2ZpbGVfaXJxKGludCBjcHUsIHVuc2lnbmVkIGludCBsaW1pdCkKIHsKLQlzdW40bV90aW1lcnMtPmNwdV90aW1lcnNbY3B1XS5sMTRfdGltZXJfbGltaXQgPSBsaW1pdDsKKwlzYnVzX3dyaXRlbChsaW1pdCwgJnRpbWVyc19wZXJjcHVbY3B1XS0+bDE0X2xpbWl0KTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHN1bjRtX2luaXRfdGltZXJzKGlycV9oYW5kbGVyX3QgY291bnRlcl9mbikKIHsKLQlpbnQgcmVnX2NvdW50LCBpcnEsIGNwdTsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgY250X3JlZ3NbUFJPTVJFR19NQVhdOwotCWludCBvYmlvX25vZGUsIGNudF9ub2RlOwotCXN0cnVjdCByZXNvdXJjZSByOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY291bnRlciIpOworCWludCBpLCBlcnIsIGxlbiwgbnVtX2NwdV90aW1lcnM7CisJY29uc3QgdTMyICphZGRyOwogCi0JY250X25vZGUgPSAwOwotCWlmKChvYmlvX25vZGUgPQotCSAgICBwcm9tX3NlYXJjaHNpYmxpbmdzIChwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKSwgIm9iaW8iKSkgPT0gMCB8fAotCSAgIChvYmlvX25vZGUgPSBwcm9tX2dldGNoaWxkIChvYmlvX25vZGUpKSA9PSAwIHx8Ci0JICAgKGNudF9ub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyAob2Jpb19ub2RlLCAiY291bnRlciIpKSA9PSAwKSB7Ci0JCXByb21fcHJpbnRmKCJDYW5ub3QgZmluZCAvb2Jpby9jb3VudGVyIG5vZGVcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0JcmVnX2NvdW50ID0gcHJvbV9nZXRwcm9wZXJ0eShjbnRfbm9kZSwgInJlZyIsCi0JCQkJICAgICAodm9pZCAqKSBjbnRfcmVncywgc2l6ZW9mKGNudF9yZWdzKSk7Ci0JcmVnX2NvdW50ID0gKHJlZ19jb3VudC9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKSk7Ci0gICAgCi0JLyogQXBwbHkgdGhlIG9iaW8gcmFuZ2VzIHRvIHRoZSB0aW1lciByZWdpc3RlcnMuICovCi0JcHJvbV9hcHBseV9vYmlvX3JhbmdlcyhjbnRfcmVncywgcmVnX2NvdW50KTsKLSAgICAKLQljbnRfcmVnc1s0XS5waHlzX2FkZHIgPSBjbnRfcmVnc1tyZWdfY291bnQtMV0ucGh5c19hZGRyOwotCWNudF9yZWdzWzRdLnJlZ19zaXplID0gY250X3JlZ3NbcmVnX2NvdW50LTFdLnJlZ19zaXplOwotCWNudF9yZWdzWzRdLndoaWNoX2lvID0gY250X3JlZ3NbcmVnX2NvdW50LTFdLndoaWNoX2lvOwotCWZvcihvYmlvX25vZGUgPSAxOyBvYmlvX25vZGUgPCA0OyBvYmlvX25vZGUrKykgewotCQljbnRfcmVnc1tvYmlvX25vZGVdLnBoeXNfYWRkciA9Ci0JCQljbnRfcmVnc1tvYmlvX25vZGUtMV0ucGh5c19hZGRyICsgUEFHRV9TSVpFOwotCQljbnRfcmVnc1tvYmlvX25vZGVdLnJlZ19zaXplID0gY250X3JlZ3Nbb2Jpb19ub2RlLTFdLnJlZ19zaXplOwotCQljbnRfcmVnc1tvYmlvX25vZGVdLndoaWNoX2lvID0gY250X3JlZ3Nbb2Jpb19ub2RlLTFdLndoaWNoX2lvOworCWlmICghZHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW40bV9pbml0X3RpbWVyczogTm8gJ2NvdW50ZXInIG5vZGUuXG4iKTsKKwkJcmV0dXJuOwogCX0KIAotCW1lbXNldCgoY2hhciopJnIsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKLQkvKiBNYXAgdGhlIHBlci1jcHUgQ291bnRlciByZWdpc3RlcnMuICovCi0Jci5mbGFncyA9IGNudF9yZWdzWzBdLndoaWNoX2lvOwotCXIuc3RhcnQgPSBjbnRfcmVnc1swXS5waHlzX2FkZHI7Ci0Jc3VuNG1fdGltZXJzID0gKHN0cnVjdCBzdW40bV90aW1lcl9yZWdzICopIHNidXNfaW9yZW1hcCgmciwgMCwKLQkgICAgUEFHRV9TSVpFKlNVTjRNX05DUFVTLCAic3VuNG1fY3B1X2NudCIpOwotCS8qIE1hcCB0aGUgc3lzdGVtIENvdW50ZXIgcmVnaXN0ZXIuICovCi0JLyogWFhYIEhlcmUgd2UgZXhwZWN0IGNvbnNlcXVlbnQgY2FsbHMgdG8geWVsZCBhZGp1c2VudCBtYXBzLiAqLwotCXIuZmxhZ3MgPSBjbnRfcmVnc1s0XS53aGljaF9pbzsKLQlyLnN0YXJ0ID0gY250X3JlZ3NbNF0ucGh5c19hZGRyOwotCXNidXNfaW9yZW1hcCgmciwgMCwgY250X3JlZ3NbNF0ucmVnX3NpemUsICJzdW40bV9zeXNfY250Iik7Ci0KLQlzdW40bV90aW1lcnMtPmwxMF90aW1lcl9saW1pdCA9ICAoKCgxMDAwMDAwL0haKSArIDEpIDw8IDEwKTsKLQltYXN0ZXJfbDEwX2NvdW50ZXIgPSAmc3VuNG1fdGltZXJzLT5sMTBfY3VyX2NvdW50OwotCW1hc3Rlcl9sMTBfbGltaXQgPSAmc3VuNG1fdGltZXJzLT5sMTBfdGltZXJfbGltaXQ7Ci0KLQlpcnEgPSByZXF1ZXN0X2lycShUSU1FUl9JUlEsCi0JCQkgIGNvdW50ZXJfZm4sCi0JCQkgIChJUlFGX0RJU0FCTEVEIHwgU0FfU1RBVElDX0FMTE9DKSwKLQkJCSAgInRpbWVyIiwgTlVMTCk7Ci0JaWYgKGlycSkgewotCQlwcm9tX3ByaW50ZigidGltZV9pbml0OiB1bmFibGUgdG8gYXR0YWNoIElSUSVkXG4iLFRJTUVSX0lSUSk7Ci0JCXByb21faGFsdCgpOworCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJhZGRyZXNzIiwgJmxlbik7CisJaWYgKCFhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3VuNG1faW5pdF90aW1lcnM6IE5vICdhZGRyZXNzJyBwcm9wLlxuIik7CisJCXJldHVybjsKIAl9Ci0gICAKLQlpZiAoIWNwdV9maW5kX2J5X2luc3RhbmNlKDEsIE5VTEwsIE5VTEwpKSB7Ci0JCWZvcihjcHUgPSAwOyBjcHUgPCA0OyBjcHUrKykKLQkJCXN1bjRtX3RpbWVycy0+Y3B1X3RpbWVyc1tjcHVdLmwxNF90aW1lcl9saW1pdCA9IDA7Ci0JCXN1bjRtX2ludGVycnVwdHMtPnNldCA9IFNVTjRNX0lOVF9FMTQ7Ci0JfSBlbHNlIHsKLQkJc3VuNG1fdGltZXJzLT5jcHVfdGltZXJzWzBdLmwxNF90aW1lcl9saW1pdCA9IDA7CisKKwludW1fY3B1X3RpbWVycyA9IChsZW4gLyBzaXplb2YodTMyKSkgLSAxOworCWZvciAoaSA9IDA7IGkgPCBudW1fY3B1X3RpbWVyczsgaSsrKSB7CisJCXRpbWVyc19wZXJjcHVbaV0gPSAodm9pZCBfX2lvbWVtICopCisJCQkodW5zaWduZWQgbG9uZykgYWRkcltpXTsKIAl9CisJdGltZXJzX2dsb2JhbCA9ICh2b2lkIF9faW9tZW0gKikKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHJbbnVtX2NwdV90aW1lcnNdOworCisJc2J1c193cml0ZWwoKCgoMTAwMDAwMC9IWikgKyAxKSA8PCAxMCksICZ0aW1lcnNfZ2xvYmFsLT5sMTBfbGltaXQpOworCisJbWFzdGVyX2wxMF9jb3VudGVyID0gJnRpbWVyc19nbG9iYWwtPmwxMF9jb3VudDsKKworCWVyciA9IHJlcXVlc3RfaXJxKFRJTUVSX0lSUSwgY291bnRlcl9mbiwKKwkJCSAgKElSUUZfRElTQUJMRUQgfCBTQV9TVEFUSUNfQUxMT0MpLCAidGltZXIiLCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3VuNG1faW5pdF90aW1lcnM6IFJlZ2lzdGVyIElSUSBlcnJvciAlZC5cbiIsCisJCQllcnIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9jcHVfdGltZXJzOyBpKyspCisJCXNidXNfd3JpdGVsKDAsICZ0aW1lcnNfcGVyY3B1W2ldLT5sMTRfbGltaXQpOworCWlmIChudW1fY3B1X3RpbWVycyA9PSA0KQorCQlzYnVzX3dyaXRlbChTVU40TV9JTlRfRTE0LCAmc3VuNG1faXJxX2dsb2JhbC0+bWFza19zZXQpOworCiAjaWZkZWYgQ09ORklHX1NNUAogCXsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM5MCw3MCArNDI3LDQzIEBACiAKIHZvaWQgX19pbml0IHN1bjRtX2luaXRfSVJRKHZvaWQpCiB7Ci0JaW50IGllX25vZGUsaTsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgaW50X3JlZ3NbUFJPTVJFR19NQVhdOwotCWludCBudW1fcmVnczsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlpbnQgbWlkOwotICAgIAorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiaW50ZXJydXB0Iik7CisJaW50IGxlbiwgaSwgbWlkLCBudW1fY3B1X2lyZWdzOworCWNvbnN0IHUzMiAqYWRkcjsKKworCWlmICghZHApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW40bV9pbml0X0lSUTogTm8gJ2ludGVycnVwdCcgbm9kZS5cbiIpOworCQlyZXR1cm47CisJfQorCisJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImFkZHJlc3MiLCAmbGVuKTsKKwlpZiAoIWFkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdW40bV9pbml0X0lSUTogTm8gJ2FkZHJlc3MnIHByb3AuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW51bV9jcHVfaXJlZ3MgPSAobGVuIC8gc2l6ZW9mKHUzMikpIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NwdV9pcmVnczsgaSsrKSB7CisJCXN1bjRtX2lycV9wZXJjcHVbaV0gPSAodm9pZCBfX2lvbWVtICopCisJCQkodW5zaWduZWQgbG9uZykgYWRkcltpXTsKKwl9CisJc3VuNG1faXJxX2dsb2JhbCA9ICh2b2lkIF9faW9tZW0gKikKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHJbbnVtX2NwdV9pcmVnc107CisKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlmKChpZV9ub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKSwgIm9iaW8iKSkgPT0gMCB8fAotCSAgIChpZV9ub2RlID0gcHJvbV9nZXRjaGlsZCAoaWVfbm9kZSkpID09IDAgfHwKLQkgICAoaWVfbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3MgKGllX25vZGUsICJpbnRlcnJ1cHQiKSkgPT0gMCkgewotCQlwcm9tX3ByaW50ZigiQ2Fubm90IGZpbmQgL29iaW8vaW50ZXJydXB0IG5vZGVcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0JbnVtX3JlZ3MgPSBwcm9tX2dldHByb3BlcnR5KGllX25vZGUsICJyZWciLCAoY2hhciAqKSBpbnRfcmVncywKLQkJCQkgICAgc2l6ZW9mKGludF9yZWdzKSk7Ci0JbnVtX3JlZ3MgPSAobnVtX3JlZ3Mvc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykpOwotICAgIAotCS8qIEFwcGx5IHRoZSBvYmlvIHJhbmdlcyB0byB0aGVzZSByZWdpc3RlcnMuICovCi0JcHJvbV9hcHBseV9vYmlvX3JhbmdlcyhpbnRfcmVncywgbnVtX3JlZ3MpOwotICAgIAotCWludF9yZWdzWzRdLnBoeXNfYWRkciA9IGludF9yZWdzW251bV9yZWdzLTFdLnBoeXNfYWRkcjsKLQlpbnRfcmVnc1s0XS5yZWdfc2l6ZSA9IGludF9yZWdzW251bV9yZWdzLTFdLnJlZ19zaXplOwotCWludF9yZWdzWzRdLndoaWNoX2lvID0gaW50X3JlZ3NbbnVtX3JlZ3MtMV0ud2hpY2hfaW87Ci0JZm9yKGllX25vZGUgPSAxOyBpZV9ub2RlIDwgNDsgaWVfbm9kZSsrKSB7Ci0JCWludF9yZWdzW2llX25vZGVdLnBoeXNfYWRkciA9IGludF9yZWdzW2llX25vZGUtMV0ucGh5c19hZGRyICsgUEFHRV9TSVpFOwotCQlpbnRfcmVnc1tpZV9ub2RlXS5yZWdfc2l6ZSA9IGludF9yZWdzW2llX25vZGUtMV0ucmVnX3NpemU7Ci0JCWludF9yZWdzW2llX25vZGVdLndoaWNoX2lvID0gaW50X3JlZ3NbaWVfbm9kZS0xXS53aGljaF9pbzsKLQl9CiAKLQltZW1zZXQoKGNoYXIgKikmciwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwotCS8qIE1hcCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBmb3IgYWxsIHBvc3NpYmxlIGNwdXMuICovCi0Jci5mbGFncyA9IGludF9yZWdzWzBdLndoaWNoX2lvOwotCXIuc3RhcnQgPSBpbnRfcmVnc1swXS5waHlzX2FkZHI7Ci0Jc3VuNG1faW50ZXJydXB0cyA9IChzdHJ1Y3Qgc3VuNG1faW50cmVncyAqKSBzYnVzX2lvcmVtYXAoJnIsIDAsCi0JICAgIFBBR0VfU0laRSpTVU40TV9OQ1BVUywgImludGVycnVwdHNfcGVyY3B1Iik7Ci0KLQkvKiBNYXAgdGhlIHN5c3RlbSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcnMuICovCi0Jci5mbGFncyA9IGludF9yZWdzWzRdLndoaWNoX2lvOwotCXIuc3RhcnQgPSBpbnRfcmVnc1s0XS5waHlzX2FkZHI7Ci0Jc2J1c19pb3JlbWFwKCZyLCAwLCBpbnRfcmVnc1s0XS5yZWdfc2l6ZSwgImludGVycnVwdHNfc3lzdGVtIik7Ci0KLQlzdW40bV9pbnRlcnJ1cHRzLT5zZXQgPSB+U1VONE1fSU5UX01BU0tBTEw7CisJc2J1c193cml0ZWwoflNVTjRNX0lOVF9NQVNLQUxMLCAmc3VuNG1faXJxX2dsb2JhbC0+bWFza19zZXQpOwogCWZvciAoaSA9IDA7ICFjcHVfZmluZF9ieV9pbnN0YW5jZShpLCBOVUxMLCAmbWlkKTsgaSsrKQotCQlzdW40bV9pbnRlcnJ1cHRzLT5jcHVfaW50cmVnc1ttaWRdLmNsZWFyID0gfjB4MTdmZmY7CisJCXNidXNfd3JpdGVsKH4weDE3ZmZmLCAmc3VuNG1faXJxX3BlcmNwdVttaWRdLT5jbGVhcik7CiAKLQlpZiAoIWNwdV9maW5kX2J5X2luc3RhbmNlKDEsIE5VTEwsIE5VTEwpKSB7Ci0JCS8qIHN5c3RlbSB3aWRlIGludGVycnVwdHMgZ28gdG8gY3B1IDAsIHRoaXMgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBzYWZlIGJlY2F1c2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmaXR0ZWQgb3IgT0JQIGRvZXNuJ3QKLQkJICogY29tZSB1cAotCQkgKgotCQkgKiBOb3Qgc3VyZSwgYnV0IHdyaXRpbmcgaGVyZSBvbiBTTEFWSU8gc3lzdGVtcyBtYXkgcHVrZQotCQkgKiBzbyBJIGRvbid0IGRvIGl0IHVubGVzcyB0aGVyZSBpcyBtb3JlIHRoYW4gMSBjcHUuCi0JCSAqLwotCQlpcnFfcmN2cmVnID0gKHVuc2lnbmVkIGxvbmcgKikKLQkJCQkmc3VuNG1faW50ZXJydXB0cy0+dW5kaXJlY3RlZF90YXJnZXQ7Ci0JCXN1bjRtX2ludGVycnVwdHMtPnVuZGlyZWN0ZWRfdGFyZ2V0ID0gMDsKLQl9Ci0JQlRGSVhVUFNFVF9DQUxMKHNiaW50X3RvX2lycSwgc3VuNG1fc2JpbnRfdG9faXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKKwlpZiAobnVtX2NwdV9pcmVncyA9PSA0KQorCQlzYnVzX3dyaXRlbCgwLCAmc3VuNG1faXJxX2dsb2JhbC0+aW50ZXJydXB0X3RhcmdldCk7CisKIAlCVEZJWFVQU0VUX0NBTEwoZW5hYmxlX2lycSwgc3VuNG1fZW5hYmxlX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKGRpc2FibGVfaXJxLCBzdW40bV9kaXNhYmxlX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKGVuYWJsZV9waWxfaXJxLCBzdW40bV9lbmFibGVfcGlsX2lycSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKGRpc2FibGVfcGlsX2lycSwgc3VuNG1fZGlzYWJsZV9waWxfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoY2xlYXJfY2xvY2tfaXJxLCBzdW40bV9jbGVhcl9jbG9ja19pcnEsIEJURklYVVBDQUxMX05PUk0pOwotCUJURklYVVBTRVRfQ0FMTChjbGVhcl9wcm9maWxlX2lycSwgc3VuNG1fY2xlYXJfcHJvZmlsZV9pcnEsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChsb2FkX3Byb2ZpbGVfaXJxLCBzdW40bV9sb2FkX3Byb2ZpbGVfaXJxLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlzcGFyY19pbml0X3RpbWVycyA9IHN1bjRtX2luaXRfdGltZXJzOwogI2lmZGVmIENPTkZJR19TTVAKQEAgLTQ2MSw1ICs0NzEsNiBAQAogCUJURklYVVBTRVRfQ0FMTChjbGVhcl9jcHVfaW50LCBzdW40bV9jbGVhcl9pcGksIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChzZXRfaXJxX3VkdCwgc3VuNG1fc2V0X3VkdCwgQlRGSVhVUENBTExfTk9STSk7CiAjZW5kaWYKKwogCS8qIENhbm5vdCBlbmFibGUgaW50ZXJydXB0cyB1bnRpbCBPQlAgdGlja2VyIGlzIGRpc2FibGVkLiAqLwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYwppbmRleCBhMTRhNzZhLi41ZmMzODZkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC03MSw2ICs3Miw4IEBACiAJbG9jYWxfZmx1c2hfY2FjaGVfYWxsKCk7CiAJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCisJbm90aWZ5X2NwdV9zdGFydGluZyhjcHVpZCk7CisKIAkvKiBHZXQgb3VyIGxvY2FsIHRpY2tlciBnb2luZy4gKi8KIAlzbXBfc2V0dXBfcGVyY3B1X3RpbWVyKCk7CiAKQEAgLTMxMyw2ICszMTYsOCBAQAogCWNjYWxsX2luZm8ucHJvY2Vzc29yc19vdXRbaV0gPSAxOwogfQogCitleHRlcm4gdm9pZCBzdW40bV9jbGVhcl9wcm9maWxlX2lycShpbnQgY3B1KTsKKwogdm9pZCBzbXA0bV9wZXJjcHVfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKQEAgLTMyMCw3ICszMjUsNyBAQAogCiAJb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CiAKLQljbGVhcl9wcm9maWxlX2lycShjcHUpOworCXN1bjRtX2NsZWFyX3Byb2ZpbGVfaXJxKGNwdSk7CiAKIAlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRzZXR1cC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNHNldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWE1MmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNHNldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBzdW40c2V0dXAuYzogU2V0dXAgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgdmFyaW91cyBpdGVtcyBpbiB0aGUgc3VuNAotICogCQlhcmNoaXRlY3R1cmUuIENhbGxlZCBmcm9tIGlkcHJvbV9pbml0Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IENocmlzIEcuIERhdmlzIChjZGF2aXNAY29pcy5vbi5jYSkKLSAqLwotCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgotI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgotCi1pbnQgc3VuNF9tZW1yZWdfcGh5c2FkZHI7Ci1pbnQgc3VuNF9pZV9waHlzYWRkcjsKLWludCBzdW40X2Nsb2NrX3BoeXNhZGRyOwotaW50IHN1bjRfdGltZXJfcGh5c2FkZHI7Ci1pbnQgc3VuNF9ldGhfcGh5c2FkZHI7Ci1pbnQgc3VuNF9zaV9waHlzYWRkcjsKLWludCBzdW40X2J3dHdvX3BoeXNhZGRyOwotaW50IHN1bjRfenMwX3BoeXNhZGRyOwotaW50IHN1bjRfenMxX3BoeXNhZGRyOwotaW50IHN1bjRfZG1hX3BoeXNhZGRyOwotaW50IHN1bjRfZXNwX3BoeXNhZGRyOwotaW50IHN1bjRfaWVfcGh5c2FkZHI7IAotCi12b2lkIF9faW5pdCBzdW40c2V0dXAodm9pZCkKLXsKLQlwcmludGsoIlN1bjQgSGFyZHdhcmUgU2V0dXAgdjEuMCAxOC9NYXkvOTggQ2hyaXMgRGF2aXMgKGNkYXZpc0Bjb2lzLm9uLmNhKS4gIik7Ci0JLyoKLQkgIHNldHVwIHN0YW5kYXJkIHN1bjQgaW5mbwotCSAgKi8KLQlzdW40X2llX3BoeXNhZGRyPVNVTjRfSUVfUEhZU0FERFI7Ci0KLQkvKgotCSAgc2V0dXAgbW9kZWwgc3BlY2lmaWMgaW5mbwotCSAgKi8KLQlzd2l0Y2goaWRwcm9tLT5pZF9tYWNodHlwZSkgewotCQljYXNlIChTTV9TVU40IHwgU01fNF8yNjAgKToKLQkJCXByaW50aygiU2V0dXAgZm9yIGEgU1VONC8yNjBcbiIpOwotCQkJc3VuNF9tZW1yZWdfcGh5c2FkZHI9U1VONF8yMDBfTUVNUkVHX1BIWVNBRERSOwotCQkJc3VuNF9jbG9ja19waHlzYWRkcj1TVU40XzIwMF9DTE9DS19QSFlTQUREUjsKLQkJCXN1bjRfdGltZXJfcGh5c2FkZHI9U1VONF9VTlVTRURfUEhZU0FERFI7Ci0JCQlzdW40X2V0aF9waHlzYWRkcj1TVU40XzIwMF9FVEhfUEhZU0FERFI7Ci0JCQlzdW40X3NpX3BoeXNhZGRyPVNVTjRfMjAwX1NJX1BIWVNBRERSOwotCQkJc3VuNF9id3R3b19waHlzYWRkcj1TVU40XzIwMF9CV1RXT19QSFlTQUREUjsKLQkJCXN1bjRfZG1hX3BoeXNhZGRyPVNVTjRfVU5VU0VEX1BIWVNBRERSOwotCQkJc3VuNF9lc3BfcGh5c2FkZHI9U1VONF9VTlVTRURfUEhZU0FERFI7Ci0JCQlicmVhazsKLQkJY2FzZSAoU01fU1VONCB8IFNNXzRfMzMwICk6Ci0JCQlwcmludGsoIlNldHVwIGZvciBhIFNVTjQvMzMwXG4iKTsKLQkJCXN1bjRfbWVtcmVnX3BoeXNhZGRyPVNVTjRfMzAwX01FTVJFR19QSFlTQUREUjsKLQkJCXN1bjRfY2xvY2tfcGh5c2FkZHI9U1VONF8zMDBfQ0xPQ0tfUEhZU0FERFI7Ci0JCQlzdW40X3RpbWVyX3BoeXNhZGRyPVNVTjRfMzAwX1RJTUVSX1BIWVNBRERSOwotCQkJc3VuNF9ldGhfcGh5c2FkZHI9U1VONF8zMDBfRVRIX1BIWVNBRERSOwotCQkJc3VuNF9zaV9waHlzYWRkcj1TVU40X1VOVVNFRF9QSFlTQUREUjsKLQkJCXN1bjRfYnd0d29fcGh5c2FkZHI9U1VONF8zMDBfQldUV09fUEhZU0FERFI7Ci0JCQlzdW40X2RtYV9waHlzYWRkcj1TVU40XzMwMF9ETUFfUEhZU0FERFI7Ci0JCQlzdW40X2VzcF9waHlzYWRkcj1TVU40XzMwMF9FU1BfUEhZU0FERFI7Ci0JCQlicmVhazsKLQkJY2FzZSAoU01fU1VONCB8IFNNXzRfNDcwICk6Ci0JCQlwcmludGsoIlNldHVwIGZvciBhIFNVTjQvNDcwXG4iKTsKLQkJCXN1bjRfbWVtcmVnX3BoeXNhZGRyPVNVTjRfNDAwX01FTVJFR19QSFlTQUREUjsKLQkJCXN1bjRfY2xvY2tfcGh5c2FkZHI9U1VONF80MDBfQ0xPQ0tfUEhZU0FERFI7Ci0JCQlzdW40X3RpbWVyX3BoeXNhZGRyPVNVTjRfNDAwX1RJTUVSX1BIWVNBRERSOwotCQkJc3VuNF9ldGhfcGh5c2FkZHI9U1VONF80MDBfRVRIX1BIWVNBRERSOwotCQkJc3VuNF9zaV9waHlzYWRkcj1TVU40X1VOVVNFRF9QSFlTQUREUjsKLQkJCXN1bjRfYnd0d29fcGh5c2FkZHI9U1VONF80MDBfQldUV09fUEhZU0FERFI7Ci0JCQlzdW40X2RtYV9waHlzYWRkcj1TVU40XzQwMF9ETUFfUEhZU0FERFI7Ci0JCQlzdW40X2VzcF9waHlzYWRkcj1TVU40XzQwMF9FU1BfUEhZU0FERFI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjLmMKaW5kZXggNGQ3MzQyMS4uMDMwMzVjOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkvKiBTZWUgYXNtLXNwYXJjL3VhY2Nlc3MuaCAqLwogCWlmIChsZW4gPiBUQVNLX1NJWkUgLSBQQUdFX1NJWkUpCiAJCXJldHVybiAtRU5PTUVNOwotCWlmIChBUkNIX1NVTjRDX1NVTjQgJiYgbGVuID4gMHgyMDAwMDAwMCkKKwlpZiAoQVJDSF9TVU40QyAmJiBsZW4gPiAweDIwMDAwMDAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAoIWFkZHIpCiAJCWFkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CkBAIC02NSw3ICs2NSw3IEBACiAKIAlmb3IgKHZtbSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsgOyB2bW0gPSB2bW0tPnZtX25leHQpIHsKIAkJLyogQXQgdGhpcyBwb2ludDogICghdm1tIHx8IGFkZHIgPCB2bW0tPnZtX2VuZCkuICovCi0JCWlmIChBUkNIX1NVTjRDX1NVTjQgJiYgYWRkciA8IDB4ZTAwMDAwMDAgJiYgMHgyMDAwMDAwMCAtIGxlbiA8IGFkZHIpIHsKKwkJaWYgKEFSQ0hfU1VONEMgJiYgYWRkciA8IDB4ZTAwMDAwMDAgJiYgMHgyMDAwMDAwMCAtIGxlbiA8IGFkZHIpIHsKIAkJCWFkZHIgPSBQQUdFX09GRlNFVDsKIAkJCXZtbSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBQQUdFX09GRlNFVCk7CiAJCX0KQEAgLTgxLDcgKzgxLDcgQEAKIAogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHNwYXJjX2Jyayh1bnNpZ25lZCBsb25nIGJyaykKIHsKLQlpZihBUkNIX1NVTjRDX1NVTjQpIHsKKwlpZihBUkNIX1NVTjRDKSB7CiAJCWlmICgoYnJrICYgMHhlMDAwMDAwMCkgIT0gKGN1cnJlbnQtPm1tLT5icmsgJiAweGUwMDAwMDAwKSkKIAkJCXJldHVybiBjdXJyZW50LT5tbS0+YnJrOwogCX0KQEAgLTIyMSw3ICsyMjEsNyBAQAogCiBpbnQgc3BhcmNfbW1hcF9jaGVjayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCWlmIChBUkNIX1NVTjRDX1NVTjQgJiYKKwlpZiAoQVJDSF9TVU40QyAmJgogCSAgICAobGVuID4gMHgyMDAwMDAwMCB8fAogCSAgICAgKGFkZHIgPCAweGUwMDAwMDAwICYmIGFkZHIgKyBsZW4gPiAweDIwMDAwMDAwKSkpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGljazE0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aWNrMTQuYwppbmRleCA3MDdiZmRhLi4xMzhiYmY1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aWNrMTQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aWNrMTQuYwpAQCAtMSwzMSArMSwxMiBAQAogLyogdGljazE0LmMKLSAqIGxpbnV4L2FyY2gvc3BhcmMva2VybmVsL3RpY2sxNC5jCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFJlZG1hbiAoZGpockB0YWRwb2xlLmNvLnVrKQogICoKICAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBTcGFyYyBzcGVjaWZpYyBsZXZlbDE0IHRpY2tlcgogICogVGhpcyBpcyByZWFsbHkgdXNlZnVsIGZvciBwcm9maWxpbmcgT0JQIHVzZXMgaXQgZm9yIGtleWJvYXJkCiAgKiBhYm9ydHMgYW5kIG90aGVyIHN0dWZmLgotICoKLSAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vbW9zdGVrLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgImlycS5oIgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsdmwxNF9zYXZlWzVdOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmxpbnV4X2x2bDE0ID0gTlVMTDsKQEAgLTU2LDMxICszNywzIEBACiAJbGludXhfbHZsMTRbMl0gPSAgb2JwX2x2bDE0WzJdOwogCWxpbnV4X2x2bDE0WzNdID0gIG9icF9sdmwxNFszXTsgCiB9Ci0KLXZvaWQgY2xhaW1fdGlja2VyMTQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkgICAgaW50IGlycV9uciwgdW5zaWduZWQgaW50IHRpbWVvdXQgKQotewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKiBmaXJzdCB3ZSBjb3B5IHRoZSBvYnAgaGFuZGxlciBpbnN0cnVjdGlvbnMKLQkgKi8KLQlfX2Rpc2FibGVfaXJxKGlycV9ucik7Ci0JaWYgKCFoYW5kbGVyKQotCQlyZXR1cm47Ci0gICAgCi0JbGludXhfbHZsMTQgPSAodW5zaWduZWQgbG9uZyAqKWx2bDE0X3NhdmVbNF07Ci0Jb2JwX2x2bDE0WzBdID0gbGludXhfbHZsMTRbMF07Ci0Jb2JwX2x2bDE0WzFdID0gbGludXhfbHZsMTRbMV07Ci0Jb2JwX2x2bDE0WzJdID0gbGludXhfbHZsMTRbMl07Ci0Jb2JwX2x2bDE0WzNdID0gbGludXhfbHZsMTRbM107Ci0KLQlpZiAoIXJlcXVlc3RfaXJxKGlycV9uciwKLQkJCSBoYW5kbGVyLAotCQkJIChJUlFGX0RJU0FCTEVEIHwgU0FfU1RBVElDX0FMTE9DKSwKLQkJCSAiY291bnRlcjE0IiwKLQkJCSBOVUxMKSkgewotCQlpbnN0YWxsX2xpbnV4X3RpY2tlcigpOwotCQlsb2FkX3Byb2ZpbGVfaXJxKGNwdSwgdGltZW91dCk7Ci0JCV9fZW5hYmxlX2lycShpcnFfbnIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYwppbmRleCAwNzYyZjVkLi42MmMxZDk0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCkBAIC0yMywyMiArMjMsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMvbTQ4dDU5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vbW9zdGVrLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+Ci0jaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BjaWMuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KQEAgLTQ2LDM0ICs0OCw5IEBACiAjaW5jbHVkZSAiaXJxLmgiCiAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7Ci1zdGF0aWMgZW51bSBzcGFyY19jbG9ja190eXBlIHNwX2Nsb2NrX3R5cDsKLURFRklORV9TUElOTE9DSyhtb3N0ZWtfbG9jayk7Ci12b2lkIF9faW9tZW0gKm1zdGs0OHQwMl9yZWdzID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgbW9zdGVrNDh0MDggX19pb21lbSAqbXN0azQ4dDA4X3JlZ3MgPSBOVUxMOwogc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IHNidXNfZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpOwogCi0jaWZkZWYgQ09ORklHX1NVTjQKLXN0cnVjdCBpbnRlcnNpbCAqaW50ZXJzaWxfY2xvY2s7Ci0jZGVmaW5lIGludGVyc2lsX2NtZChpbnRlcnNpbF9yZWcsIGludHNpbF9jbWQpIGludGVyc2lsX3JlZy0+aW50X2NtZF9yZWcgPSBcCi0JKGludHNpbF9jbWQpCi0KLSNkZWZpbmUgaW50ZXJzaWxfaW50cihpbnRlcnNpbF9yZWcsIGludHNpbF9jbWQpIGludGVyc2lsX3JlZy0+aW50X2ludHJfcmVnID0gXAotCShpbnRzaWxfY21kKQotCi0jZGVmaW5lIGludGVyc2lsX3N0YXJ0KGludGVyc2lsX3JlZykgaW50ZXJzaWxfY21kKGludGVyc2lsX3JlZywgXAotCSggSU5URVJTSUxfU1RBUlQgfCBJTlRFUlNJTF8zMksgfCBJTlRFUlNJTF9OT1JNQUwgfCBJTlRFUlNJTF8yNEggfFwKLQkgIElOVEVSU0lMX0lOVFJfRU5BQkxFKSkKLQotI2RlZmluZSBpbnRlcnNpbF9zdG9wKGludGVyc2lsX3JlZykgaW50ZXJzaWxfY21kKGludGVyc2lsX3JlZywgXAotCSggSU5URVJTSUxfU1RPUCB8IElOVEVSU0lMXzMySyB8IElOVEVSU0lMX05PUk1BTCB8IElOVEVSU0lMXzI0SCB8XAotCSAgSU5URVJTSUxfSU5UUl9FTkFCTEUpKQotCi0jZGVmaW5lIGludGVyc2lsX3JlYWRfaW50cihpbnRlcnNpbF9yZWcsIHRvd2hlcmUpIHRvd2hlcmUgPSBcCi0JaW50ZXJzaWxfcmVnLT5pbnRfaW50cl9yZWcKLQotI2VuZGlmCi0KIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlleHRlcm4gY2hhciBfX2NvcHlfdXNlcl9iZWdpbltdLCBfX2NvcHlfdXNlcl9lbmRbXTsKQEAgLTk2LDcgKzczLDYgQEAKIEVYUE9SVF9TWU1CT0wocHJvZmlsZV9wYyk7CiAKIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKm1hc3Rlcl9sMTBfY291bnRlcjsKLV9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKm1hc3Rlcl9sMTBfbGltaXQ7CiAKIC8qCiAgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCkBAIC0xMTYsMTUgKzkyLDcgQEAKIAogCS8qIFByb3RlY3QgY291bnRlciBjbGVhciBzbyB0aGF0IGRvX2dldHRpbWVvZmZzZXQgd29ya3MgKi8KIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLSNpZmRlZiBDT05GSUdfU1VONAotCWlmKChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40IHwgU01fNF8yNjApKSB8fAotCSAgIChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40IHwgU01fNF8xMTApKSkgewotCQlpbnQgdGVtcDsKLSAgICAgICAgCWludGVyc2lsX3JlYWRfaW50cihpbnRlcnNpbF9jbG9jaywgdGVtcCk7Ci0JCS8qIHJlLWVuYWJsZSB0aGUgaXJxICovCi0JCWVuYWJsZV9waWxfaXJxKDEwKTsKLQl9Ci0jZW5kaWYKKwogCWNsZWFyX2Nsb2NrX2lycSgpOwogCiAJZG9fdGltZXIoMSk7CkBAIC0xNDcsMTU3ICsxMTUsNTYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIEtpY2sgc3RhcnQgYSBzdG9wcGVkIGNsb2NrIChwcm9jZWR1cmUgZnJvbSB0aGUgU3VuIE5WUkFNL2hvc3RpZCBGQVEpLiAqLwotc3RhdGljIHZvaWQgX19kZXZpbml0IGtpY2tfc3RhcnRfY2xvY2sodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1vc3Rla19yZWFkX2J5dGUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKQogewotCXN0cnVjdCBtb3N0ZWs0OHQwMiAqcmVncyA9IChzdHJ1Y3QgbW9zdGVrNDh0MDIgKiltc3RrNDh0MDJfcmVnczsKLQl1bnNpZ25lZCBjaGFyIHNlYzsKLQlpbnQgaSwgY291bnQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXZvaWQgX19pb21lbSAqcmVncyA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgY2hhciB2YWwgPSByZWFkYihyZWdzICsgb2ZzKTsKIAotCXByb21fcHJpbnRmKCJDTE9DSzogQ2xvY2sgd2FzIHN0b3BwZWQuIEtpY2sgc3RhcnQgIik7Ci0KLQlzcGluX2xvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0KLQkvKiBUdXJuIG9uIHRoZSBraWNrIHN0YXJ0IGJpdCB0byBzdGFydCB0aGUgb3NjaWxsYXRvci4gKi8KLQlyZWdzLT5jcmVnIHw9IE1TVEtfQ1JFR19XUklURTsKLQlyZWdzLT5zZWMgJj0gfk1TVEtfU1RPUDsKLQlyZWdzLT5ob3VyIHw9IE1TVEtfS0lDS19TVEFSVDsKLQlyZWdzLT5jcmVnICY9IH5NU1RLX0NSRUdfV1JJVEU7Ci0KLQlzcGluX3VubG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCS8qIERlbGF5IHRvIGFsbG93IHRoZSBjbG9jayBvc2NpbGxhdG9yIHRvIHN0YXJ0LiAqLwotCXNlYyA9IE1TVEtfUkVHX1NFQyhyZWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXdoaWxlIChzZWMgPT0gTVNUS19SRUdfU0VDKHJlZ3MpKQotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwMDAwOyBjb3VudCsrKQotCQkJCS8qIG5vdGhpbmcgKi8gOwotCQlwcm9tX3ByaW50ZigiLiIpOwotCQlzZWMgPSByZWdzLT5zZWM7CisJLyogdGhlIHllYXIgMCBpcyAxOTY4ICovCisJaWYgKG9mcyA9PSBwZGF0YS0+b2Zmc2V0ICsgTTQ4VDU5X1lFQVIpIHsKKwkJdmFsICs9IDB4Njg7CisJCWlmICgodmFsICYgMHhmKSA+IDkpCisJCQl2YWwgKz0gNjsKIAl9Ci0JcHJvbV9wcmludGYoIlxuIik7CisJcmV0dXJuIHZhbDsKK30KIAotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKK3N0YXRpYyB2b2lkIG1vc3Rla193cml0ZV9ieXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcywgdTggdmFsKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBwZGF0YS0+aW9hZGRyOwogCi0JLyogVHVybiBvZmYga2ljayBzdGFydCBhbmQgc2V0IGEgInZhbGlkIiB0aW1lIGFuZCBkYXRlLiAqLwotCXJlZ3MtPmNyZWcgfD0gTVNUS19DUkVHX1dSSVRFOwotCXJlZ3MtPmhvdXIgJj0gfk1TVEtfS0lDS19TVEFSVDsKLQlNU1RLX1NFVF9SRUdfU0VDKHJlZ3MsMCk7Ci0JTVNUS19TRVRfUkVHX01JTihyZWdzLDApOwotCU1TVEtfU0VUX1JFR19IT1VSKHJlZ3MsMCk7Ci0JTVNUS19TRVRfUkVHX0RPVyhyZWdzLDUpOwotCU1TVEtfU0VUX1JFR19ET00ocmVncywxKTsKLQlNU1RLX1NFVF9SRUdfTU9OVEgocmVncyw4KTsKLQlNU1RLX1NFVF9SRUdfWUVBUihyZWdzLDE5OTYgLSBNU1RLX1lFQVJfWkVSTyk7Ci0JcmVncy0+Y3JlZyAmPSB+TVNUS19DUkVHX1dSSVRFOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0KLQkvKiBFbnN1cmUgdGhlIGtpY2sgc3RhcnQgYml0IGlzIG9mZi4gSWYgaXQgaXNuJ3QsIHR1cm4gaXQgb2ZmLiAqLwotCXdoaWxlIChyZWdzLT5ob3VyICYgTVNUS19LSUNLX1NUQVJUKSB7Ci0JCXByb21fcHJpbnRmKCJDTE9DSzogS2ljayBzdGFydCBzdGlsbCBvbiFcbiIpOwotCi0JCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQkJcmVncy0+Y3JlZyB8PSBNU1RLX0NSRUdfV1JJVEU7Ci0JCXJlZ3MtPmhvdXIgJj0gfk1TVEtfS0lDS19TVEFSVDsKLQkJcmVncy0+Y3JlZyAmPSB+TVNUS19DUkVHX1dSSVRFOwotCQlzcGluX3VubG9ja19pcnEoJm1vc3Rla19sb2NrKTsKKwlpZiAob2ZzID09IHBkYXRhLT5vZmZzZXQgKyBNNDhUNTlfWUVBUikgeworCQlpZiAodmFsIDwgMHg2OCkKKwkJCXZhbCArPSAweDMyOworCQllbHNlCisJCQl2YWwgLT0gMHg2ODsKKwkJaWYgKCh2YWwgJiAweGYpID4gOSkKKwkJCXZhbCArPSA2OworCQlpZiAoKHZhbCAmIDB4ZjApID4gMHg5QSkKKwkJCXZhbCArPSAweDYwOwogCX0KLQotCXByb21fcHJpbnRmKCJDTE9DSzogS2ljayBzdGFydCBwcm9jZWR1cmUgc3VjY2Vzc2Z1bC5cbiIpOworCXdyaXRlYih2YWwsIHJlZ3MgKyBvZnMpOwogfQogCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgY2xvY2sgY2hpcCBiYXR0ZXJ5IGlzIGxvdy4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19sb3dfYmF0dGVyeSh2b2lkKQotewotCXN0cnVjdCBtb3N0ZWs0OHQwMiAqcmVncyA9IChzdHJ1Y3QgbW9zdGVrNDh0MDIgKiltc3RrNDh0MDJfcmVnczsKLQl1bnNpZ25lZCBjaGFyIGRhdGExLCBkYXRhMjsKK3N0YXRpYyBzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSBtNDh0NTlfZGF0YSA9IHsKKwkucmVhZF9ieXRlID0gbW9zdGVrX3JlYWRfYnl0ZSwKKwkud3JpdGVfYnl0ZSA9IG1vc3Rla193cml0ZV9ieXRlLAorfTsKIAotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQlkYXRhMSA9IHJlZ3MtPmVlcHJvbVswXTsJLyogUmVhZCBzb21lIGRhdGEuICovCi0JcmVncy0+ZWVwcm9tWzBdID0gfmRhdGExOwkvKiBXcml0ZSBiYWNrIHRoZSBjb21wbGVtZW50LiAqLwotCWRhdGEyID0gcmVncy0+ZWVwcm9tWzBdOwkvKiBSZWFkIGJhY2sgdGhlIGNvbXBsZW1lbnQuICovCi0JcmVncy0+ZWVwcm9tWzBdID0gZGF0YTE7CS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlLiAqLwotCXNwaW5fdW5sb2NrX2lycSgmbW9zdGVrX2xvY2spOworLyogcmVzb3VyY2UgaXMgc2V0IGF0IHJ1bnRpbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG00OHQ1OV9ydGMgPSB7CisJLm5hbWUJCT0gInJ0Yy1tNDh0NTkiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZtNDh0NTlfZGF0YSwKKwl9LAorfTsKIAotCXJldHVybiAoZGF0YTEgPT0gZGF0YTIpOwkvKiBXYXMgdGhlIHdyaXRlIGJsb2NrZWQ/ICovCi19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBtb3N0ZWtfc2V0X3N5c3RlbV90aW1lKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKLQlzdHJ1Y3QgbW9zdGVrNDh0MDIgKm1yZWdzOwotCi0JbXJlZ3MgPSAoc3RydWN0IG1vc3RlazQ4dDAyICopbXN0azQ4dDAyX3JlZ3M7Ci0JaWYoIW1yZWdzKSB7Ci0JCXByb21fcHJpbnRmKCJTb21ldGhpbmcgd3JvbmcsIGNsb2NrIHJlZ3Mgbm90IG1hcHBlZCB5ZXQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQkJCi0Jc3Bpbl9sb2NrX2lycSgmbW9zdGVrX2xvY2spOwotCW1yZWdzLT5jcmVnIHw9IE1TVEtfQ1JFR19SRUFEOwotCXNlYyA9IE1TVEtfUkVHX1NFQyhtcmVncyk7Ci0JbWluID0gTVNUS19SRUdfTUlOKG1yZWdzKTsKLQlob3VyID0gTVNUS19SRUdfSE9VUihtcmVncyk7Ci0JZGF5ID0gTVNUS19SRUdfRE9NKG1yZWdzKTsKLQltb24gPSBNU1RLX1JFR19NT05USChtcmVncyk7Ci0JeWVhciA9IE1TVEtfQ1ZUX1lFQVIoIE1TVEtfUkVHX1lFQVIobXJlZ3MpICk7Ci0JeHRpbWUudHZfc2VjID0gbWt0aW1lKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYyk7Ci0JeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOwotICAgICAgICBzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKLQltcmVncy0+Y3JlZyAmPSB+TVNUS19DUkVHX1JFQUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci19Ci0KLS8qIFByb2JlIGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrIGNoaXAgb24gU3VuNCAqLwotc3RhdGljIGlubGluZSB2b2lkIHN1bjRfY2xvY2tfcHJvYmUodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU1VONAotCWludCB0ZW1wOwotCXN0cnVjdCByZXNvdXJjZSByOwotCi0JbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOwotCWlmKCBpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40IHwgU01fNF8zMzApICkgewotCQlzcF9jbG9ja190eXAgPSBNU1RLNDhUMDI7Ci0JCXIuc3RhcnQgPSBzdW40X2Nsb2NrX3BoeXNhZGRyOwotCQltc3RrNDh0MDJfcmVncyA9IHNidXNfaW9yZW1hcCgmciwgMCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtb3N0ZWs0OHQwMiksIE5VTEwpOwotCQltc3RrNDh0MDhfcmVncyA9IE5VTEw7ICAvKiBUbyBjYXRjaCB3ZWlyZG5lc3MgKi8KLQkJaW50ZXJzaWxfY2xvY2sgPSBOVUxMOyAgLyoganVzdCBpbiBjYXNlICovCi0KLQkJLyogS2ljayBzdGFydCB0aGUgY2xvY2sgaWYgaXQgaXMgY29tcGxldGVseSBzdG9wcGVkLiAqLwotCQlpZiAobW9zdGVrX3JlYWQobXN0azQ4dDAyX3JlZ3MgKyBNT1NURUtfU0VDKSAmIE1TVEtfU1RPUCkKLQkJCWtpY2tfc3RhcnRfY2xvY2soKTsKLQl9IGVsc2UgaWYoIGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjQgfCBTTV80XzI2MCkpIHsKLQkJLyogaW50ZXJzaWwgc2V0dXAgY29kZSAqLwotCQlwcmludGsoIkNsb2NrOiBJTlRFUlNJTCBhdCAlOHggIixzdW40X2Nsb2NrX3BoeXNhZGRyKTsKLQkJc3BfY2xvY2tfdHlwID0gSU5URVJTSUw7Ci0JCXIuc3RhcnQgPSBzdW40X2Nsb2NrX3BoeXNhZGRyOwotCQlpbnRlcnNpbF9jbG9jayA9IChzdHJ1Y3QgaW50ZXJzaWwgKikgCi0JCSAgICBzYnVzX2lvcmVtYXAoJnIsIDAsIHNpemVvZigqaW50ZXJzaWxfY2xvY2spLCAiaW50ZXJzaWwiKTsKLQkJbXN0azQ4dDAyX3JlZ3MgPSAwOyAgLyoganVzdCBiZSBzdXJlICovCi0JCW1zdGs0OHQwOF9yZWdzID0gTlVMTDsgIC8qIGRpdHRvICovCi0JCS8qIGluaXRpYWxpc2UgdGhlIGNsb2NrICovCi0KLQkJaW50ZXJzaWxfaW50cihpbnRlcnNpbF9jbG9jayxJTlRFUlNJTF9JTlRfMTAwSFopOwotCi0JCWludGVyc2lsX3N0YXJ0KGludGVyc2lsX2Nsb2NrKTsKLQotCQlpbnRlcnNpbF9yZWFkX2ludHIoaW50ZXJzaWxfY2xvY2ssIHRlbXApOwotICAgICAgICAgICAgICAgIHdoaWxlICghKHRlbXAgJiAweDgwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2lsX3JlYWRfaW50cihpbnRlcnNpbF9jbG9jaywgdGVtcCk7Ci0KLSAgICAgICAgICAgICAgICBpbnRlcnNpbF9yZWFkX2ludHIoaW50ZXJzaWxfY2xvY2ssIHRlbXApOwotICAgICAgICAgICAgICAgIHdoaWxlICghKHRlbXAgJiAweDgwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2lsX3JlYWRfaW50cihpbnRlcnNpbF9jbG9jaywgdGVtcCk7Ci0KLQkJaW50ZXJzaWxfc3RvcChpbnRlcnNpbF9jbG9jayk7Ci0KLQl9Ci0jZW5kaWYKLX0KLQotI2lmbmRlZiBDT05GSUdfU1VONAogc3RhdGljIGludCBfX2RldmluaXQgY2xvY2tfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKQEAgLTMwNiwzOCArMTczLDI2IEBACiAJaWYgKCFtb2RlbCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwltNDh0NTlfcnRjLnJlc291cmNlID0gJm9wLT5yZXNvdXJjZVswXTsKIAlpZiAoIXN0cmNtcChtb2RlbCwgIm1rNDh0MDIiKSkgewotCQlzcF9jbG9ja190eXAgPSBNU1RLNDhUMDI7Ci0KIAkJLyogTWFwIHRoZSBjbG9jayByZWdpc3RlciBpbyBhcmVhIHJlYWQtb25seSAqLwotCQltc3RrNDh0MDJfcmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbW9zdGVrNDh0MDIpLAotCQkJCQkgICAgIm1rNDh0MDIiKTsKLQkJbXN0azQ4dDA4X3JlZ3MgPSBOVUxMOyAgLyogVG8gY2F0Y2ggd2VpcmRuZXNzICovCisJCW00OHQ1OV9kYXRhLmlvYWRkciA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkJCTIwNDgsICJydGMtbTQ4dDU5Iik7CisJCW00OHQ1OV9kYXRhLnR5cGUgPSBNNDhUNTlSVENfVFlQRV9NNDhUMDI7CiAJfSBlbHNlIGlmICghc3RyY21wKG1vZGVsLCAibWs0OHQwOCIpKSB7Ci0JCXNwX2Nsb2NrX3R5cCA9IE1TVEs0OFQwODsKLQkJbXN0azQ4dDA4X3JlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IG1vc3RlazQ4dDA4KSwKLQkJCQkJICAgICJtazQ4dDA4Iik7Ci0KLQkJbXN0azQ4dDAyX3JlZ3MgPSAmbXN0azQ4dDA4X3JlZ3MtPnJlZ3M7CisJCW00OHQ1OV9kYXRhLmlvYWRkciA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkJCTgxOTIsICJydGMtbTQ4dDU5Iik7CisJCW00OHQ1OV9kYXRhLnR5cGUgPSBNNDhUNTlSVENfVFlQRV9NNDhUMDg7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogUmVwb3J0IGEgbG93IGJhdHRlcnkgdm9sdGFnZSBjb25kaXRpb24uICovCi0JaWYgKGhhc19sb3dfYmF0dGVyeSgpKQotCQlwcmludGsoS0VSTl9DUklUICJOVlJBTTogTG93IGJhdHRlcnkgdm9sdGFnZSFcbiIpOwotCi0JLyogS2ljayBzdGFydCB0aGUgY2xvY2sgaWYgaXQgaXMgY29tcGxldGVseSBzdG9wcGVkLiAqLwotCWlmIChtb3N0ZWtfcmVhZChtc3RrNDh0MDJfcmVncyArIE1PU1RFS19TRUMpICYgTVNUS19TVE9QKQotCQlraWNrX3N0YXJ0X2Nsb2NrKCk7Ci0KLQltb3N0ZWtfc2V0X3N5c3RlbV90aW1lKCk7CisJaWYgKHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbTQ4dDU5X3J0YykgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIlJlZ2lzdGVyaW5nIFJUQyBkZXZpY2UgZmFpbGVkXG4iKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBjbG9ja19tYXRjaFtdID0geworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBjbG9ja19tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiZWVwcm9tIiwKIAl9LApAQCAtMzQ4LDcgKzIwMyw3IEBACiAJLm1hdGNoX3RhYmxlCT0gY2xvY2tfbWF0Y2gsCiAJLnByb2JlCQk9IGNsb2NrX3Byb2JlLAogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJjbG9jayIsCisJCS5uYW1lCT0gInJ0YyIsCiAJfSwKIH07CiAKQEAgLTM2NCw3ICsyMTksNiBAQAogICogbmVlZCB0byBzZWUgdGhlIGNsb2NrIHJlZ2lzdGVycy4KICAqLwogZnNfaW5pdGNhbGwoY2xvY2tfaW5pdCk7Ci0jZW5kaWYgLyogIUNPTkZJR19TVU40ICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX3RpbWVfaW5pdCh2b2lkKQogewpAQCAtMzcyLDUxICsyMjYsOCBAQAogCUJURklYVVBTRVRfQ0FMTChidXNfZG9fc2V0dGltZW9mZGF5LCBzYnVzX2RvX3NldHRpbWVvZmRheSwgQlRGSVhVUENBTExfTk9STSk7CiAJYnRmaXh1cCgpOwogCi0JaWYgKEFSQ0hfU1VONCkKLQkJc3VuNF9jbG9ja19wcm9iZSgpOwotCiAJc3BhcmNfaW5pdF90aW1lcnModGltZXJfaW50ZXJydXB0KTsKIAkKLSNpZmRlZiBDT05GSUdfU1VONAotCWlmKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjQgfCBTTV80XzMzMCkpIHsKLQkJbW9zdGVrX3NldF9zeXN0ZW1fdGltZSgpOwotCX0gZWxzZSBpZihpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40IHwgU01fNF8yNjApICkgewotCQkvKiBpbml0aWFsaXNlIHRoZSBpbnRlcnNpbCBvbiBzdW40ICovCi0JCXVuc2lnbmVkIGludCB5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWM7Ci0JCWludCB0ZW1wOwotCQlzdHJ1Y3QgaW50ZXJzaWwgKmlyZWdzOwotCi0JCWlyZWdzPWludGVyc2lsX2Nsb2NrOwotCQlpZighaXJlZ3MpIHsKLQkJCXByb21fcHJpbnRmKCJTb21ldGhpbmcgd3JvbmcsIGNsb2NrIHJlZ3Mgbm90IG1hcHBlZCB5ZXQuXG4iKTsKLQkJCXByb21faGFsdCgpOwotCQl9Ci0KLQkJaW50ZXJzaWxfaW50cihpbnRlcnNpbF9jbG9jayxJTlRFUlNJTF9JTlRfMTAwSFopOwotCQlkaXNhYmxlX3BpbF9pcnEoMTApOwotCQlpbnRlcnNpbF9zdG9wKGlyZWdzKTsKLQkJaW50ZXJzaWxfcmVhZF9pbnRyKGludGVyc2lsX2Nsb2NrLCB0ZW1wKTsKLQotCQl0ZW1wID0gaXJlZ3MtPmNsay5pbnRfY3NlYzsKLQotCQlzZWMgPSBpcmVncy0+Y2xrLmludF9zZWM7Ci0JCW1pbiA9IGlyZWdzLT5jbGsuaW50X21pbjsKLQkJaG91ciA9IGlyZWdzLT5jbGsuaW50X2hvdXI7Ci0JCWRheSA9IGlyZWdzLT5jbGsuaW50X2RheTsKLQkJbW9uID0gaXJlZ3MtPmNsay5pbnRfbW9udGg7Ci0JCXllYXIgPSBNU1RLX0NWVF9ZRUFSKGlyZWdzLT5jbGsuaW50X3llYXIpOwotCi0JCWVuYWJsZV9waWxfaXJxKDEwKTsKLQkJaW50ZXJzaWxfc3RhcnQoaXJlZ3MpOwotCi0JCXh0aW1lLnR2X3NlYyA9IG1rdGltZSh5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWMpOwotCQl4dGltZS50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0JICAgICAgICBzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCi0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7Ci0JCXByaW50aygiJXUvJXUvJXUgJXU6JXU6JXVcbiIsZGF5LG1vbix5ZWFyLGhvdXIsbWluLHNlYyk7Ci0JfQotI2VuZGlmCi0KIAkvKiBOb3cgdGhhdCBPQlAgdGlja2VyIGhhcyBiZWVuIHNpbGVuY2VkLCBpdCBpcyBzYWZlIHRvIGVuYWJsZSBJUlEuICovCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQpAQCAtNTIyLDgwICszMzMsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEJVRzogVGhpcyByb3V0aW5lIGRvZXMgbm90IGhhbmRsZSBob3VyIG92ZXJmbG93IHByb3Blcmx5OyBpdCBqdXN0Ci0gKiAgICAgIHNldHMgdGhlIG1pbnV0ZXMuIFVzdWFsbHkgeW91IHdvbid0IG5vdGljZSB1bnRpbCBhZnRlciByZWJvb3QhCi0gKi8KLXN0YXRpYyBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKK3N0YXRpYyBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgc2VjcykKIHsKLQlpbnQgcmVhbF9zZWNvbmRzLCByZWFsX21pbnV0ZXMsIG1vc3Rla19taW51dGVzOwotCXN0cnVjdCBtb3N0ZWs0OHQwMiAqcmVncyA9IChzdHJ1Y3QgbW9zdGVrNDh0MDIgKiltc3RrNDh0MDJfcmVnczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIENPTkZJR19TVU40Ci0Jc3RydWN0IGludGVyc2lsICppcmVncyA9IGludGVyc2lsX2Nsb2NrOwotCWludCB0ZW1wOwotI2VuZGlmCisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHJ0Y19jbGFzc19vcGVuKCJydGMwIik7CisJaW50IGVyciA9IC0xOwogCi0JLyogTm90IGhhdmluZyBhIHJlZ2lzdGVyIHNldCBjYW4gbGVhZCB0byB0cm91YmxlLiAqLwotCWlmICghcmVncykgewotI2lmZGVmIENPTkZJR19TVU40Ci0JCWlmKCFpcmVncykKLQkJcmV0dXJuIC0xOwotCSAJZWxzZSB7Ci0JCQl0ZW1wID0gaXJlZ3MtPmNsay5pbnRfY3NlYzsKLQotCQkJbW9zdGVrX21pbnV0ZXMgPSBpcmVncy0+Y2xrLmludF9taW47Ci0KLQkJCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKLQkJCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKLQkJCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBtb3N0ZWtfbWludXRlcykgKyAxNSkvMzApICYgMSkKLQkJCQlyZWFsX21pbnV0ZXMgKz0gMzA7CS8qIGNvcnJlY3QgZm9yIGhhbGYgaG91ciB0aW1lIHpvbmUgKi8KLQkJCXJlYWxfbWludXRlcyAlPSA2MDsKLQotCQkJaWYgKGFicyhyZWFsX21pbnV0ZXMgLSBtb3N0ZWtfbWludXRlcykgPCAzMCkgewotCQkJCWludGVyc2lsX3N0b3AoaXJlZ3MpOwotCQkJCWlyZWdzLT5jbGsuaW50X3NlYz1yZWFsX3NlY29uZHM7Ci0JCQkJaXJlZ3MtPmNsay5pbnRfbWluPXJlYWxfbWludXRlczsKLQkJCQlpbnRlcnNpbF9zdGFydChpcmVncyk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKLQkJCQkgICAgICAgbW9zdGVrX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gMDsKLQkJfQotI2VuZGlmCisJaWYgKHJ0YykgeworCQllcnIgPSBydGNfc2V0X21tc3MocnRjLCBzZWNzKTsKKwkJcnRjX2NsYXNzX2Nsb3NlKHJ0Yyk7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vc3Rla19sb2NrLCBmbGFncyk7Ci0JLyogUmVhZCB0aGUgY3VycmVudCBSVEMgbWludXRlcy4gKi8KLQlyZWdzLT5jcmVnIHw9IE1TVEtfQ1JFR19SRUFEOwotCW1vc3Rla19taW51dGVzID0gTVNUS19SRUdfTUlOKHJlZ3MpOwotCXJlZ3MtPmNyZWcgJj0gfk1TVEtfQ1JFR19SRUFEOwotCi0JLyoKLQkgKiBzaW5jZSB3ZSdyZSBvbmx5IGFkanVzdGluZyBtaW51dGVzIGFuZCBzZWNvbmRzLAotCSAqIGRvbid0IGludGVyZmVyZSB3aXRoIGhvdXIgb3ZlcmZsb3cuIFRoaXMgYXZvaWRzCi0JICogbWVzc2luZyB3aXRoIHVua25vd24gdGltZSB6b25lcyBidXQgcmVxdWlyZXMgeW91cgotCSAqIFJUQyBub3QgdG8gYmUgb2ZmIGJ5IG1vcmUgdGhhbiAxNSBtaW51dGVzCi0JICovCi0JcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwOwotCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKLQlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gbW9zdGVrX21pbnV0ZXMpICsgMTUpLzMwKSAmIDEpCi0JCXJlYWxfbWludXRlcyArPSAzMDsJLyogY29ycmVjdCBmb3IgaGFsZiBob3VyIHRpbWUgem9uZSAqLwotCXJlYWxfbWludXRlcyAlPSA2MDsKLQotCWlmIChhYnMocmVhbF9taW51dGVzIC0gbW9zdGVrX21pbnV0ZXMpIDwgMzApIHsKLQkJcmVncy0+Y3JlZyB8PSBNU1RLX0NSRUdfV1JJVEU7Ci0JCU1TVEtfU0VUX1JFR19TRUMocmVncyxyZWFsX3NlY29uZHMpOwotCQlNU1RLX1NFVF9SRUdfTUlOKHJlZ3MscmVhbF9taW51dGVzKTsKLQkJcmVncy0+Y3JlZyAmPSB+TVNUS19DUkVHX1dSSVRFOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3N0ZWtfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3N0ZWtfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwppbmRleCA1ZDQ1ZDVmLi4yYjdkNTA2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKQEAgLTQzLDIzICs0Myw2IEBACiB7CiB9CiAKLXZvaWQgc3VuNG1fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGxvbmcgYWZzciwgYWZhcjsKLQotCXByaW50aygiQWllZWU6IHN1bjRtIE5NSSByZWNlaXZlZCFcbiIpOwotCS8qIFhYWCBIeXBlclNwYXJjIGhhY2sgWFhYICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAweDUwMCwgJSVnMVxuXHQiCi0JCQkgICAgICJsZGEgWyUlZzFdIDB4NCwgJTBcblx0IgotCQkJICAgICAibW92IDB4NjAwLCAlJWcxXG5cdCIKLQkJCSAgICAgImxkYSBbJSVnMV0gMHg0LCAlMVxuXHQiIDoKLQkJCSAgICAgIj1yIiAoYWZzciksICI9ciIgKGFmYXIpKTsKLQlwcmludGsoImFmc3I9JTA4bHggYWZhcj0lMDhseFxuIiwgYWZzciwgYWZhcik7Ci0JcHJpbnRrKCJ5b3UgbG9zZSBidWRkeSBib3kuLi5cbiIpOwotCXNob3dfcmVncyhyZWdzKTsKLQlwcm9tX2hhbHQoKTsKLX0KLQogdm9pZCBzdW40ZF9ubWkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcHJpbnRrKCJBaWVlZTogc3VuNGQgTk1JIHJlY2VpdmVkIVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9tbS9NYWtlZmlsZQppbmRleCAxMDljOGIyLi5lYTg4OTU1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmMvbW0vTWFrZWZpbGUKQEAgLTMsMTMgKzMsOCBAQAogCiBFWFRSQV9BRkxBR1MgOj0gLWFuc2kKIAotb2JqLXkgICAgOj0gZmF1bHQubyBpbml0Lm8gbG9hZG1tdS5vIGdlbmVyaWMubyBleHRhYmxlLm8gYnRmaXh1cC5vCi0KLWlmZXEgKCQoQ09ORklHX1NVTjQpLHkpCi1vYmoteQkgKz0gbm9zcm1tdS5vCi1lbHNlCi1vYmoteQkgKz0gc3JtbXUubyBpb21tdS5vIGlvLXVuaXQubyBoeXBlcnNwYXJjLm8gdmlraW5nLm8gdHN1bmFtaS5vIHN3aWZ0Lm8KLWVuZGlmCitvYmoteQk6PSBmYXVsdC5vIGluaXQubyBsb2FkbW11Lm8gZ2VuZXJpYy5vIGV4dGFibGUubyBidGZpeHVwLm8gXAorCSAgICBzcm1tdS5vIGlvbW11Lm8gaW8tdW5pdC5vIGh5cGVyc3BhcmMubyB2aWtpbmcubyB0c3VuYW1pLm8gc3dpZnQubwogCiBpZmRlZiBDT05GSUdfSElHSE1FTQogb2JqLXkJKz0gaGlnaG1lbS5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2J0Zml4dXAuYyBiL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCmluZGV4IGEzMTJkMTIuLjUxNzVhYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCkBAIC0yMCwxMSArMjAsNyBAQAogCiBleHRlcm4gY2hhciAqc3JtbXVfbmFtZTsKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gIkJvb3QgdGltZSBmaXh1cCB2MS42LiA0L01hci85OCBKYWt1YiBKZWxpbmVrIChqakB1bHRyYS5saW51eC5jeikuIFBhdGNoaW5nIGtlcm5lbCBmb3IgIjsKLSNpZmRlZiBDT05GSUdfU1VONAotc3RhdGljIGNoYXIgc3RyX3N1bjRjW10gX19pbml0ZGF0YSA9ICJzdW40XG4iOwotI2Vsc2UKIHN0YXRpYyBjaGFyIHN0cl9zdW40Y1tdIF9faW5pdGRhdGEgPSAic3VuNGNcbiI7Ci0jZW5kaWYKIHN0YXRpYyBjaGFyIHN0cl9zcm1tdVtdIF9faW5pdGRhdGEgPSAic3JtbXVbJXNdLyI7CiBzdGF0aWMgY2hhciBzdHJfaW9tbXVbXSBfX2luaXRkYXRhID0gImlvbW11XG4iOwogc3RhdGljIGNoYXIgc3RyX2lvdW5pdFtdIF9faW5pdGRhdGEgPSAiaW8tdW5pdFxuIjsKQEAgLTg2LDcgKzgyLDcgQEAKIAlpZiAoIXZpc2l0ZWQpIHsKIAkJdmlzaXRlZCsrOwogCQlwcmludGsodmVyc2lvbik7Ci0JCWlmIChBUkNIX1NVTjRDX1NVTjQpCisJCWlmIChBUkNIX1NVTjRDKQogCQkJcHJpbnRrKHN0cl9zdW40Yyk7CiAJCWVsc2UgewogCQkJcHJpbnRrKHN0cl9zcm1tdSwgc3JtbXVfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2ZhdWx0LmMgYi9hcmNoL3NwYXJjL21tL2ZhdWx0LmMKaW5kZXggMzYwNGMyZS4uYTUwN2UxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZmF1bHQuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJICogb25seSBjb3B5IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtYXN0ZXIgcGFnZSB0YWJsZSwKIAkgKiBub3RoaW5nIG1vcmUuCiAJICovCi0JaWYgKCFBUkNIX1NVTjRDX1NVTjQgJiYgYWRkcmVzcyA+PSBUQVNLX1NJWkUpCisJaWYgKCFBUkNIX1NVTjRDICYmIGFkZHJlc3MgPj0gVEFTS19TSVpFKQogCQlnb3RvIHZtYWxsb2NfZmF1bHQ7CiAKIAlpbmZvLnNpX2NvZGUgPSBTRUdWX01BUEVSUjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYy9tbS9pbml0LmMKaW5kZXggZTEwM2YxYi4uNjc3YzFlMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pbml0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdmFjLW9wcy5oPgpAQCAtNDgwLDYgKzQ4MSw3IEBACiAJZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpOyBhZGRyICs9IFBBR0VfU0laRSkgewogCQlzdHJ1Y3QgcGFnZSAqcDsKIAorCQltZW1zZXQoKHZvaWQgKilhZGRyLCBQT0lTT05fRlJFRV9JTklUTUVNLCBQQUdFX1NJWkUpOwogCQlwID0gdmlydF90b19wYWdlKGFkZHIpOwogCiAJCUNsZWFyUGFnZVJlc2VydmVkKHApOwpAQCAtNDg4LDIwICs0OTAsMjYgQEAKIAkJdG90YWxyYW1fcGFnZXMrKzsKIAkJbnVtX3BoeXNwYWdlcysrOwogCX0KLQlwcmludGsgKEtFUk5fSU5GTyAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWRrIGZyZWVkXG4iLCAoJl9faW5pdF9lbmQgLSAmX19pbml0X2JlZ2luKSA+PiAxMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWRrIGZyZWVkXG4iLAorCQkoJl9faW5pdF9lbmQgLSAmX19pbml0X2JlZ2luKSA+PiAxMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIHZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCWlmIChzdGFydCA8IGVuZCkKLQkJcHJpbnRrIChLRVJOX0lORk8gIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkJCShlbmQgLSBzdGFydCkgPj4gMTApOwogCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7Ci0JCXN0cnVjdCBwYWdlICpwID0gdmlydF90b19wYWdlKHN0YXJ0KTsKKwkJc3RydWN0IHBhZ2UgKnA7CisKKwkJbWVtc2V0KCh2b2lkICopc3RhcnQsIFBPSVNPTl9GUkVFX0lOSVRNRU0sIFBBR0VfU0laRSk7CisJCXAgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnQpOwogCiAJCUNsZWFyUGFnZVJlc2VydmVkKHApOwogCQlpbml0X3BhZ2VfY291bnQocCk7CiAJCV9fZnJlZV9wYWdlKHApOworCQl0b3RhbHJhbV9wYWdlcysrOwogCQludW1fcGh5c3BhZ2VzKys7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pby11bml0LmMgYi9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYwppbmRleCBmMTY3ODM1Li5kYWFkZjVmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYworKysgYi9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYwpAQCAtMTIsMTAgKzEyLDExIEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgkvKiBwdGVfb2Zmc2V0X21hcCA9PiBrbWFwX2F0b21pYyAqLwogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pby11bml0Lmg+CiAjaW5jbHVkZSA8YXNtL214Y2MuaD4KQEAgLTM0LDEzICszNSwxMCBAQAogI2RlZmluZSBJT1BFUk0gICAgICAgIChJT1VQVEVfQ0FDSEUgfCBJT1VQVEVfV1JJVEUgfCBJT1VQVEVfVkFMSUQpCiAjZGVmaW5lIE1LSU9QVEUocGh5cykgX19pb3B0ZSgoKChwaHlzKT4+NCkgJiBJT1VQVEVfUEFHRSkgfCBJT1BFUk0pCiAKLXZvaWQgX19pbml0Ci1pb3VuaXRfaW5pdChpbnQgc2JpX25vZGUsIGludCBpb19ub2RlLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBfX2luaXQgaW91bml0X2lvbW11X2luaXQoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0JaW9wdGVfdCAqeHB0LCAqeHB0ZW5kOwogCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQ7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGlvbW11X3Byb21yZWdzW1BST01SRUdfTUFYXTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwlpb3B0ZV90ICp4cHQsICp4cHRlbmQ7CiAKIAlpb3VuaXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW91bml0X3N0cnVjdCksIEdGUF9BVE9NSUMpOwogCWlmICghaW91bml0KSB7CkBAIC01NSwxOCArNTMsMTMgQEAKIAlpb3VuaXQtPnJvdG9yWzFdID0gSU9VTklUX0JNQVAyX1NUQVJUOwogCWlvdW5pdC0+cm90b3JbMl0gPSBJT1VOSVRfQk1BUE1fU1RBUlQ7CiAKLQl4cHQgPSBOVUxMOwotCWlmKHByb21fZ2V0cHJvcGVydHkoc2JpX25vZGUsICJyZWciLCAodm9pZCAqKSBpb21tdV9wcm9tcmVncywKLQkJCSAgICBzaXplb2YoaW9tbXVfcHJvbXJlZ3MpKSAhPSAtMSkgewotCQlwcm9tX2FwcGx5X2dlbmVyaWNfcmFuZ2VzKGlvX25vZGUsIDAsIGlvbW11X3Byb21yZWdzLCAzKTsKLQkJbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOwotCQlyLmZsYWdzID0gaW9tbXVfcHJvbXJlZ3NbMl0ud2hpY2hfaW87Ci0JCXIuc3RhcnQgPSBpb21tdV9wcm9tcmVnc1syXS5waHlzX2FkZHI7Ci0JCXhwdCA9IChpb3B0ZV90ICopIHNidXNfaW9yZW1hcCgmciwgMCwgUEFHRV9TSVpFICogMTYsICJYUFQiKTsKKwl4cHQgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMl0sIDAsIFBBR0VfU0laRSAqIDE2LCAiWFBUIik7CisJaWYgKCF4cHQpIHsKKwkJcHJvbV9wcmludGYoIlNVTjREOiBDYW5ub3QgbWFwIEV4dGVybmFsIFBhZ2UgVGFibGUuIik7CisJCXByb21faGFsdCgpOwogCX0KLQlpZigheHB0KSBwYW5pYygiQ2Fubm90IG1hcCBFeHRlcm5hbCBQYWdlIFRhYmxlLiIpOwogCQotCXNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdSA9IGlvdW5pdDsKKwlvcC0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gaW91bml0OwogCWlvdW5pdC0+cGFnZV90YWJsZSA9IHhwdDsKIAlzcGluX2xvY2tfaW5pdCgmaW91bml0LT5sb2NrKTsKIAkKQEAgLTc1LDYgKzY4LDI1IEBACiAJICAgICAJaW9wdGVfdmFsKCp4cHQrKykgPSAwOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBpb3VuaXRfaW5pdCh2b2lkKQoreworCWV4dGVybiB2b2lkIHN1bjRkX2luaXRfc2JpX2lycSh2b2lkKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRwLCAic2JpIikgeworCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoZHApOworCisJCWlvdW5pdF9pb21tdV9pbml0KG9wKTsKKwkJb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKG9wKTsKKwl9CisKKwlzdW40ZF9pbml0X3NiaV9pcnEoKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoaW91bml0X2luaXQpOworCiAvKiBPbmUgaGFzIHRvIGhvbGQgaW91bml0LT5sb2NrIHRvIGNhbGwgdGhpcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW91bml0X2dldF9hcmVhKHN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKQogewpAQCAtMTI0LDEwICsxMzYsMTAgQEAKIAlyZXR1cm4gdmFkZHI7CiB9CiAKLXN0YXRpYyBfX3UzMiBpb3VuaXRfZ2V0X3Njc2lfb25lKGNoYXIgKnZhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIF9fdTMyIGlvdW5pdF9nZXRfc2NzaV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CisJc3RydWN0IGlvdW5pdF9zdHJ1Y3QgKmlvdW5pdCA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyByZXQsIGZsYWdzOwotCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7CiAJCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvdW5pdC0+bG9jaywgZmxhZ3MpOwogCXJldCA9IGlvdW5pdF9nZXRfYXJlYShpb3VuaXQsICh1bnNpZ25lZCBsb25nKXZhZGRyLCBsZW4pOwpAQCAtMTM1LDEwICsxNDcsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpb3VuaXRfZ2V0X3Njc2lfc2dsKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIHZvaWQgaW91bml0X2dldF9zY3NpX3NnbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeikKIHsKKwlzdHJ1Y3QgaW91bml0X3N0cnVjdCAqaW91bml0ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7CiAKIAkvKiBGSVhNRTogQ2FjaGUgc29tZSByZXNvbHZlZCBwYWdlcyAtIG9mdGVuIHNldmVyYWwgc2cgZW50cmllcyBhcmUgdG8gdGhlIHNhbWUgcGFnZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb3VuaXQtPmxvY2ssIGZsYWdzKTsKQEAgLTE1MSwxMCArMTYzLDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW91bml0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGlvdW5pdF9yZWxlYXNlX3Njc2lfb25lKF9fdTMyIHZhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIHZvaWQgaW91bml0X3JlbGVhc2Vfc2NzaV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBfX3UzMiB2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CisJc3RydWN0IGlvdW5pdF9zdHJ1Y3QgKmlvdW5pdCA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaW91bml0X3N0cnVjdCAqaW91bml0ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwogCQogCXNwaW5fbG9ja19pcnFzYXZlKCZpb3VuaXQtPmxvY2ssIGZsYWdzKTsKIAlsZW4gPSAoKHZhZGRyICYgflBBR0VfTUFTSykgKyBsZW4gKyAoUEFHRV9TSVpFLTEpKSA+PiBQQUdFX1NISUZUOwpAQCAtMTY1LDExICsxNzcsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3VuaXQtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgaW91bml0X3JlbGVhc2Vfc2NzaV9zZ2woc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHN6LCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBpb3VuaXRfcmVsZWFzZV9zY3NpX3NnbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeikKIHsKKwlzdHJ1Y3QgaW91bml0X3N0cnVjdCAqaW91bml0ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgdmFkZHIsIGxlbjsKLQlzdHJ1Y3QgaW91bml0X3N0cnVjdCAqaW91bml0ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvdW5pdC0+bG9jaywgZmxhZ3MpOwogCXdoaWxlIChzeiAhPSAwKSB7CkBAIC0xODUsMTIgKzE5NywxMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NCVVMKLXN0YXRpYyBpbnQgaW91bml0X21hcF9kbWFfYXJlYShkbWFfYWRkcl90ICpwYmEsIHVuc2lnbmVkIGxvbmcgdmEsIF9fdTMyIGFkZHIsIGludCBsZW4pCitzdGF0aWMgaW50IGlvdW5pdF9tYXBfZG1hX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90ICpwYmEsIHVuc2lnbmVkIGxvbmcgdmEsIF9fdTMyIGFkZHIsIGludCBsZW4pCiB7CisJc3RydWN0IGlvdW5pdF9zdHJ1Y3QgKmlvdW5pdCA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBwYWdlLCBlbmQ7CiAJcGdwcm90X3QgZHZtYV9wcm90OwogCWlvcHRlX3QgKmlvcHRlOwotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKIAogCSpwYmEgPSBhZGRyOwogCkBAIC0yMTIsMTIgKzIyNCw4IEBACiAJCQkKIAkJCWkgPSAoKGFkZHIgLSBJT1VOSVRfRE1BX0JBU0UpID4+IFBBR0VfU0hJRlQpOwogCi0JCQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLQkJCQlzdHJ1Y3QgaW91bml0X3N0cnVjdCAqaW91bml0ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwotCi0JCQkJaW9wdGUgPSAoaW9wdGVfdCAqKShpb3VuaXQtPnBhZ2VfdGFibGUgKyBpKTsKLQkJCQkqaW9wdGUgPSBNS0lPUFRFKF9fcGEocGFnZSkpOwotCQkJfQorCQkJaW9wdGUgPSAoaW9wdGVfdCAqKShpb3VuaXQtPnBhZ2VfdGFibGUgKyBpKTsKKwkJCSppb3B0ZSA9IE1LSU9QVEUoX19wYShwYWdlKSk7CiAJCX0KIAkJYWRkciArPSBQQUdFX1NJWkU7CiAJCXZhICs9IFBBR0VfU0laRTsKQEAgLTIyOCwyMyArMjM2LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlvdW5pdF91bm1hcF9kbWFfYXJlYSh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCitzdGF0aWMgdm9pZCBpb3VuaXRfdW5tYXBfZG1hX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCiB7CiAJLyogWFhYIFNvbWVib2R5IHBsZWFzZSBmaWxsIHRoaXMgaW4gKi8KIH0KLQotLyogWFhYIFdlIGRvIG5vdCBwYXNzIHNidXMgZGV2aWNlIGhlcmUsIGJhZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqaW91bml0X3RyYW5zbGF0ZV9kdm1hKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBzYnVzX3Jvb3Q7CS8qIFRoZXkgYXJlIGFsbCB0aGUgc2FtZSAqLwotCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JaW50IGk7Ci0JaW9wdGVfdCAqaW9wdGU7Ci0KLQlpID0gKChhZGRyIC0gSU9VTklUX0RNQV9CQVNFKSA+PiBQQUdFX1NISUZUKTsKLQlpb3B0ZSA9IChpb3B0ZV90ICopKGlvdW5pdC0+cGFnZV90YWJsZSArIGkpOwotCXJldHVybiBwZm5fdG9fcGFnZShpb3B0ZV92YWwoKmlvcHRlKSA+PiAoUEFHRV9TSElGVC00KSk7IC8qIFhYWCBzdW40ZCBndXJ1LCBoZWxwICovCi19CiAjZW5kaWYKIAogc3RhdGljIGNoYXIgKmlvdW5pdF9sb2NrYXJlYShjaGFyICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCkBAIC0yNzEsNTQgKzI2Niw1IEBACiAjaWZkZWYgQ09ORklHX1NCVVMKIAlCVEZJWFVQU0VUX0NBTEwobW11X21hcF9kbWFfYXJlYSwgaW91bml0X21hcF9kbWFfYXJlYSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKG1tdV91bm1hcF9kbWFfYXJlYSwgaW91bml0X3VubWFwX2RtYV9hcmVhLCBCVEZJWFVQQ0FMTF9OT1JNKTsKLQlCVEZJWFVQU0VUX0NBTEwobW11X3RyYW5zbGF0ZV9kdm1hLCBpb3VuaXRfdHJhbnNsYXRlX2R2bWEsIEJURklYVVBDQUxMX05PUk0pOwogI2VuZGlmCiB9Ci0KLV9fdTMyIGlvdW5pdF9tYXBfZG1hX2luaXQoc3RydWN0IHNidXNfYnVzICpzYnVzLCBpbnQgc2l6ZSkKLXsKLQlpbnQgaSwgaiwgaywgbnBhZ2VzOwotCXVuc2lnbmVkIGxvbmcgcm90b3IsIHNjYW4sIGxpbWl0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX191MzIgcmV0OwotCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0KLSAgICAgICAgbnBhZ2VzID0gKHNpemUgKyAoUEFHRV9TSVpFLTEpKSA+PiBQQUdFX1NISUZUOwotCWkgPSAweDAyMTM7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvdW5pdC0+bG9jaywgZmxhZ3MpOwotbmV4dDoJaiA9IChpICYgMTUpOwotCXJvdG9yID0gaW91bml0LT5yb3RvcltqIC0gMV07Ci0JbGltaXQgPSBpb3VuaXQtPmxpbWl0W2pdOwotCXNjYW4gPSByb3RvcjsKLW5leHRpOglzY2FuID0gZmluZF9uZXh0X3plcm9fYml0KGlvdW5pdC0+Ym1hcCwgbGltaXQsIHNjYW4pOwotCWlmIChzY2FuICsgbnBhZ2VzID4gbGltaXQpIHsKLQkJaWYgKGxpbWl0ICE9IHJvdG9yKSB7Ci0JCQlsaW1pdCA9IHJvdG9yOwotCQkJc2NhbiA9IGlvdW5pdC0+bGltaXRbaiAtIDFdOwotCQkJZ290byBuZXh0aTsKLQkJfQotCQlpID4+PSA0OwotCQlpZiAoIShpICYgMTUpKQotCQkJcGFuaWMoImlvdW5pdF9tYXBfZG1hX2luaXQ6IENvdWxkbid0IGZpbmQgZnJlZSBpb3B0ZSBzbG90cyBmb3IgJWQgYnl0ZXNcbiIsIHNpemUpOwotCQlnb3RvIG5leHQ7Ci0JfQotCWZvciAoayA9IDEsIHNjYW4rKzsgayA8IG5wYWdlczsgaysrKQotCQlpZiAodGVzdF9iaXQoc2NhbisrLCBpb3VuaXQtPmJtYXApKQotCQkJZ290byBuZXh0aTsKLQlpb3VuaXQtPnJvdG9yW2ogLSAxXSA9IChzY2FuIDwgbGltaXQpID8gc2NhbiA6IGlvdW5pdC0+bGltaXRbaiAtIDFdOwotCXNjYW4gLT0gbnBhZ2VzOwotCXJldCA9IElPVU5JVF9ETUFfQkFTRSArIChzY2FuIDw8IFBBR0VfU0hJRlQpOwotCWZvciAoayA9IDA7IGsgPCBucGFnZXM7IGsrKywgc2NhbisrKQotCQlzZXRfYml0KHNjYW4sIGlvdW5pdC0+Ym1hcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW91bml0LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotX191MzIgaW91bml0X21hcF9kbWFfcGFnZShfX3UzMiB2YWRkciwgdm9pZCAqYWRkciwgc3RydWN0IHNidXNfYnVzICpzYnVzKQotewotCWludCBzY2FuID0gKHZhZGRyIC0gSU9VTklUX0RNQV9CQVNFKSA+PiBQQUdFX1NISUZUOwotCXN0cnVjdCBpb3VuaXRfc3RydWN0ICppb3VuaXQgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JCi0JaW91bml0LT5wYWdlX3RhYmxlW3NjYW5dID0gTUtJT1BURShfX3BhKCgodW5zaWduZWQgbG9uZylhZGRyKSAmIFBBR0VfTUFTSykpOwotCXJldHVybiB2YWRkciArICgoKHVuc2lnbmVkIGxvbmcpYWRkcikgJiB+UEFHRV9NQVNLKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW9tbXUuYyBiL2FyY2gvc3BhcmMvbW0vaW9tbXUuYwppbmRleCA0YjkzNDI3Li5lN2E0OTllIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pb21tdS5jCkBAIC0xMywxMCArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgkvKiBwdGVfb2Zmc2V0X21hcCA9PiBrbWFwX2F0b21pYyAqLwogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9teGNjLmg+CiAjaW5jbHVkZSA8YXNtL21idXMuaD4KQEAgLTU1LDMwICs1NiwyMSBAQAogI2RlZmluZSBJT1BFUk0gICAgICAgIChJT1BURV9DQUNIRSB8IElPUFRFX1dSSVRFIHwgSU9QVEVfVkFMSUQpCiAjZGVmaW5lIE1LSU9QVEUocGZuLCBwZXJtKSAoKCgoKHBmbik8PDgpICYgSU9QVEVfUEFHRSkgfCAocGVybSkpICYgfklPUFRFX1dBWikKIAotdm9pZCBfX2luaXQKLWlvbW11X2luaXQoaW50IGlvbW11bmQsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2lvbW11X2luaXQoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0JdW5zaWduZWQgaW50IGltcGwsIHZlcnM7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJc3RydWN0IGlvbW11X3N0cnVjdCAqaW9tbXU7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGlvbW11X3Byb21yZWdzW1BST01SRUdfTUFYXTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwl1bnNpZ25lZCBpbnQgaW1wbCwgdmVyczsKIAl1bnNpZ25lZCBsb25nICpiaXRtYXA7CisJdW5zaWduZWQgbG9uZyB0bXA7CiAKIAlpb21tdSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV9zdHJ1Y3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWlvbW11KSB7CiAJCXByb21fcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgaW9tbXUgc3RydWN0dXJlXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQotCWlvbW11LT5yZWdzID0gTlVMTDsKLQlpZiAocHJvbV9nZXRwcm9wZXJ0eShpb21tdW5kLCAicmVnIiwgKHZvaWQgKikgaW9tbXVfcHJvbXJlZ3MsCi0JCQkgc2l6ZW9mKGlvbW11X3Byb21yZWdzKSkgIT0gLTEpIHsKLQkJbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOwotCQlyLmZsYWdzID0gaW9tbXVfcHJvbXJlZ3NbMF0ud2hpY2hfaW87Ci0JCXIuc3RhcnQgPSBpb21tdV9wcm9tcmVnc1swXS5waHlzX2FkZHI7Ci0JCWlvbW11LT5yZWdzID0gKHN0cnVjdCBpb21tdV9yZWdzICopCi0JCQlzYnVzX2lvcmVtYXAoJnIsIDAsIFBBR0VfU0laRSAqIDMsICJpb21tdV9yZWdzIik7Ci0JfQorCisJaW9tbXUtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIFBBR0VfU0laRSAqIDMsCisJCQkJICJpb21tdV9yZWdzIik7CiAJaWYgKCFpb21tdS0+cmVncykgewogCQlwcm9tX3ByaW50ZigiQ2Fubm90IG1hcCBJT01NVSByZWdpc3RlcnNcbiIpOwogCQlwcm9tX2hhbHQoKTsKQEAgLTEyOCwxMyArMTIwLDI5IEBACiAJZWxzZQogCQlpb21tdS0+dXNlbWFwLm51bV9jb2xvcnMgPSAxOwogCi0JcHJpbnRrKCJJT01NVTogaW1wbCAlZCB2ZXJzICVkIHRhYmxlIDB4JXBbJWQgQl0gbWFwIFslZCBiXVxuIiwKLQkgICAgaW1wbCwgdmVycywgaW9tbXUtPnBhZ2VfdGFibGUsCi0JICAgIChpbnQpKElPTU1VX05QVEVTKnNpemVvZihpb3B0ZV90KSksIChpbnQpSU9NTVVfTlBURVMpOworCXByaW50ayhLRVJOX0lORk8gIklPTU1VOiBpbXBsICVkIHZlcnMgJWQgdGFibGUgMHglcFslZCBCXSBtYXAgWyVkIGJdXG4iLAorCSAgICAgICBpbXBsLCB2ZXJzLCBpb21tdS0+cGFnZV90YWJsZSwKKwkgICAgICAgKGludCkoSU9NTVVfTlBURVMqc2l6ZW9mKGlvcHRlX3QpKSwgKGludClJT01NVV9OUFRFUyk7CiAKLQlzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXUgPSBpb21tdTsKKwlvcC0+ZGV2LmFyY2hkYXRhLmlvbW11ID0gaW9tbXU7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGlvbW11X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRwLCAiaW9tbXUiKSB7CisJCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisKKwkJc2J1c19pb21tdV9pbml0KG9wKTsKKwkJb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKG9wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKGlvbW11X2luaXQpOworCiAvKiBUaGlzIGJlZ3MgdG8gYmUgYnRmaXh1cC1lZCBieSBzcm1tdS4gKi8KIC8qIEZsdXNoIHRoZSBpb3RsYiBlbnRyaWVzIHRvIHJhbS4gKi8KIC8qIFRoaXMgY291bGQgYmUgYmV0dGVyIGlmIHdlIGRpZG4ndCBoYXZlIHRvIGZsdXNoIHdob2xlIHBhZ2VzLiAqLwpAQCAtMTY0LDkgKzE3Miw5IEBACiAJfQogfQogCi1zdGF0aWMgdTMyIGlvbW11X2dldF9vbmUoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBucGFnZXMsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB1MzIgaW9tbXVfZ2V0X29uZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnBhZ2VzKQogewotCXN0cnVjdCBpb21tdV9zdHJ1Y3QgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBpb21tdV9zdHJ1Y3QgKmlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKIAlpbnQgaW9wdGV4OwogCWlvcHRlX3QgKmlvcHRlLCAqaW9wdGUwOwogCXVuc2lnbmVkIGludCBidXNhLCBidXNhMDsKQEAgLTE5NCw4ICsyMDIsNyBAQAogCXJldHVybiBidXNhMDsKIH0KIAotc3RhdGljIHUzMiBpb21tdV9nZXRfc2NzaV9vbmUoY2hhciAqdmFkZHIsIHVuc2lnbmVkIGludCBsZW4sCi0gICAgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIHUzMiBpb21tdV9nZXRfc2NzaV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICp2YWRkciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIG9mZjsKIAlpbnQgbnBhZ2VzOwpAQCAtMjA1LDIyICsyMTIsMjIgQEAKIAlvZmYgPSAodW5zaWduZWQgbG9uZyl2YWRkciAmIH5QQUdFX01BU0s7CiAJbnBhZ2VzID0gKG9mZiArIGxlbiArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOwogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdmFkZHIgJiBQQUdFX01BU0spOwotCWJ1c2EgPSBpb21tdV9nZXRfb25lKHBhZ2UsIG5wYWdlcywgc2J1cyk7CisJYnVzYSA9IGlvbW11X2dldF9vbmUoZGV2LCBwYWdlLCBucGFnZXMpOwogCXJldHVybiBidXNhICsgb2ZmOwogfQogCi1zdGF0aWMgX191MzIgaW9tbXVfZ2V0X3Njc2lfb25lX25vZmx1c2goY2hhciAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgX191MzIgaW9tbXVfZ2V0X3Njc2lfb25lX25vZmx1c2goc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JcmV0dXJuIGlvbW11X2dldF9zY3NpX29uZSh2YWRkciwgbGVuLCBzYnVzKTsKKwlyZXR1cm4gaW9tbXVfZ2V0X3Njc2lfb25lKGRldiwgdmFkZHIsIGxlbik7CiB9CiAKLXN0YXRpYyBfX3UzMiBpb21tdV9nZXRfc2NzaV9vbmVfZ2ZsdXNoKGNoYXIgKnZhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIF9fdTMyIGlvbW11X2dldF9zY3NpX29uZV9nZmx1c2goc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJZmx1c2hfcGFnZV9mb3JfZG1hKDApOwotCXJldHVybiBpb21tdV9nZXRfc2NzaV9vbmUodmFkZHIsIGxlbiwgc2J1cyk7CisJcmV0dXJuIGlvbW11X2dldF9zY3NpX29uZShkZXYsIHZhZGRyLCBsZW4pOwogfQogCi1zdGF0aWMgX191MzIgaW9tbXVfZ2V0X3Njc2lfb25lX3BmbHVzaChjaGFyICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyBfX3UzMiBpb21tdV9nZXRfc2NzaV9vbmVfcGZsdXNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgcGFnZSA9ICgodW5zaWduZWQgbG9uZykgdmFkZHIpICYgUEFHRV9NQVNLOwogCkBAIC0yMjgsMjMgKzIzNSwyMyBAQAogCQlmbHVzaF9wYWdlX2Zvcl9kbWEocGFnZSk7CiAJCXBhZ2UgKz0gUEFHRV9TSVpFOwogCX0KLQlyZXR1cm4gaW9tbXVfZ2V0X3Njc2lfb25lKHZhZGRyLCBsZW4sIHNidXMpOworCXJldHVybiBpb21tdV9nZXRfc2NzaV9vbmUoZGV2LCB2YWRkciwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfZ2V0X3Njc2lfc2dsX25vZmx1c2goc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHN6LCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBpb21tdV9nZXRfc2NzaV9zZ2xfbm9mbHVzaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeikKIHsKIAlpbnQgbjsKIAogCXdoaWxlIChzeiAhPSAwKSB7CiAJCS0tc3o7CiAJCW4gPSAoc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKLQkJc2ctPmR2bWFfYWRkcmVzcyA9IGlvbW11X2dldF9vbmUoc2dfcGFnZShzZyksIG4sIHNidXMpICsgc2ctPm9mZnNldDsKKwkJc2ctPmR2bWFfYWRkcmVzcyA9IGlvbW11X2dldF9vbmUoZGV2LCBzZ19wYWdlKHNnKSwgbikgKyBzZy0+b2Zmc2V0OwogCQlzZy0+ZHZtYV9sZW5ndGggPSAoX191MzIpIHNnLT5sZW5ndGg7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9nZXRfc2NzaV9zZ2xfZ2ZsdXNoKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIHZvaWQgaW9tbXVfZ2V0X3Njc2lfc2dsX2dmbHVzaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeikKIHsKIAlpbnQgbjsKIApAQCAtMjUyLDEzICsyNTksMTMgQEAKIAl3aGlsZSAoc3ogIT0gMCkgewogCQktLXN6OwogCQluID0gKHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0ICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQ7Ci0JCXNnLT5kdm1hX2FkZHJlc3MgPSBpb21tdV9nZXRfb25lKHNnX3BhZ2Uoc2cpLCBuLCBzYnVzKSArIHNnLT5vZmZzZXQ7CisJCXNnLT5kdm1hX2FkZHJlc3MgPSBpb21tdV9nZXRfb25lKGRldiwgc2dfcGFnZShzZyksIG4pICsgc2ctPm9mZnNldDsKIAkJc2ctPmR2bWFfbGVuZ3RoID0gKF9fdTMyKSBzZy0+bGVuZ3RoOwogCQlzZyA9IHNnX25leHQoc2cpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfZ2V0X3Njc2lfc2dsX3BmbHVzaChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3osIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIGlvbW11X2dldF9zY3NpX3NnbF9wZmx1c2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3opCiB7CiAJdW5zaWduZWQgbG9uZyBwYWdlLCBvbGRwYWdlID0gMDsKIAlpbnQgbiwgaTsKQEAgLTI4MywxNSArMjkwLDE1IEBACiAJCQl9CiAJCX0KIAotCQlzZy0+ZHZtYV9hZGRyZXNzID0gaW9tbXVfZ2V0X29uZShzZ19wYWdlKHNnKSwgbiwgc2J1cykgKyBzZy0+b2Zmc2V0OworCQlzZy0+ZHZtYV9hZGRyZXNzID0gaW9tbXVfZ2V0X29uZShkZXYsIHNnX3BhZ2Uoc2cpLCBuKSArIHNnLT5vZmZzZXQ7CiAJCXNnLT5kdm1hX2xlbmd0aCA9IChfX3UzMikgc2ctPmxlbmd0aDsKIAkJc2cgPSBzZ19uZXh0KHNnKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGlvbW11X3JlbGVhc2Vfb25lKHUzMiBidXNhLCBpbnQgbnBhZ2VzLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBpb21tdV9yZWxlYXNlX29uZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBidXNhLCBpbnQgbnBhZ2VzKQogewotCXN0cnVjdCBpb21tdV9zdHJ1Y3QgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBpb21tdV9zdHJ1Y3QgKmlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKIAlpbnQgaW9wdGV4OwogCWludCBpOwogCkBAIC0zMDUsMTcgKzMxMiwxNyBAQAogCWJpdF9tYXBfY2xlYXIoJmlvbW11LT51c2VtYXAsIGlvcHRleCwgbnBhZ2VzKTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfcmVsZWFzZV9zY3NpX29uZShfX3UzMiB2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIGlvbW11X3JlbGVhc2Vfc2NzaV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBfX3UzMiB2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBvZmY7CiAJaW50IG5wYWdlczsKIAogCW9mZiA9IHZhZGRyICYgflBBR0VfTUFTSzsKIAlucGFnZXMgPSAob2ZmICsgbGVuICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQ7Ci0JaW9tbXVfcmVsZWFzZV9vbmUodmFkZHIgJiBQQUdFX01BU0ssIG5wYWdlcywgc2J1cyk7CisJaW9tbXVfcmVsZWFzZV9vbmUoZGV2LCB2YWRkciAmIFBBR0VfTUFTSywgbnBhZ2VzKTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfcmVsZWFzZV9zY3NpX3NnbChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3osIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIGlvbW11X3JlbGVhc2Vfc2NzaV9zZ2woc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3opCiB7CiAJaW50IG47CiAKQEAgLTMyMywxOCArMzMwLDE4IEBACiAJCS0tc3o7CiAKIAkJbiA9IChzZy0+bGVuZ3RoICsgc2ctPm9mZnNldCArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOwotCQlpb21tdV9yZWxlYXNlX29uZShzZy0+ZHZtYV9hZGRyZXNzICYgUEFHRV9NQVNLLCBuLCBzYnVzKTsKKwkJaW9tbXVfcmVsZWFzZV9vbmUoZGV2LCBzZy0+ZHZtYV9hZGRyZXNzICYgUEFHRV9NQVNLLCBuKTsKIAkJc2ctPmR2bWFfYWRkcmVzcyA9IDB4MjEyMTIxMjE7CiAJCXNnID0gc2dfbmV4dChzZyk7CiAJfQogfQogCiAjaWZkZWYgQ09ORklHX1NCVVMKLXN0YXRpYyBpbnQgaW9tbXVfbWFwX2RtYV9hcmVhKGRtYV9hZGRyX3QgKnBiYSwgdW5zaWduZWQgbG9uZyB2YSwKLSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCitzdGF0aWMgaW50IGlvbW11X21hcF9kbWFfYXJlYShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgKnBiYSwgdW5zaWduZWQgbG9uZyB2YSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbikKIHsKKwlzdHJ1Y3QgaW9tbXVfc3RydWN0ICppb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBwYWdlLCBlbmQ7Ci0Jc3RydWN0IGlvbW11X3N0cnVjdCAqaW9tbXUgPSBzYnVzX3Jvb3QtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKIAlpb3B0ZV90ICppb3B0ZSA9IGlvbW11LT5wYWdlX3RhYmxlOwogCWlvcHRlX3QgKmZpcnN0OwogCWludCBpb3B0ZXg7CkBAIC0zOTcsOSArNDA0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfdW5tYXBfZG1hX2FyZWEodW5zaWduZWQgbG9uZyBidXNhLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgaW9tbXVfdW5tYXBfZG1hX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGJ1c2EsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGlvbW11X3N0cnVjdCAqaW9tbXUgPSBzYnVzX3Jvb3QtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKKwlzdHJ1Y3QgaW9tbXVfc3RydWN0ICppb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJaW9wdGVfdCAqaW9wdGUgPSBpb21tdS0+cGFnZV90YWJsZTsKIAl1bnNpZ25lZCBsb25nIGVuZDsKIAlpbnQgaW9wdGV4ID0gKGJ1c2EgLSBpb21tdS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7CkBAIC00MTcsMTUgKzQyNCw2IEBACiAJaW9tbXVfaW52YWxpZGF0ZShpb21tdS0+cmVncyk7CiAJYml0X21hcF9jbGVhcigmaW9tbXUtPnVzZW1hcCwgaW9wdGV4LCBsZW4gPj4gUEFHRV9TSElGVCk7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqaW9tbXVfdHJhbnNsYXRlX2R2bWEodW5zaWduZWQgbG9uZyBidXNhKQotewotCXN0cnVjdCBpb21tdV9zdHJ1Y3QgKmlvbW11ID0gc2J1c19yb290LT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JaW9wdGVfdCAqaW9wdGUgPSBpb21tdS0+cGFnZV90YWJsZTsKLQotCWlvcHRlICs9ICgoYnVzYSAtIGlvbW11LT5zdGFydCkgPj4gUEFHRV9TSElGVCk7Ci0JcmV0dXJuIHBmbl90b19wYWdlKChpb3B0ZV92YWwoKmlvcHRlKSAmIElPUFRFX1BBR0UpID4+IChQQUdFX1NISUZULTQpKTsKLX0KICNlbmRpZgogCiBzdGF0aWMgY2hhciAqaW9tbXVfbG9ja2FyZWEoY2hhciAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQpAQCAtNDYxLDcgKzQ1OSw2IEBACiAjaWZkZWYgQ09ORklHX1NCVVMKIAlCVEZJWFVQU0VUX0NBTEwobW11X21hcF9kbWFfYXJlYSwgaW9tbXVfbWFwX2RtYV9hcmVhLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwobW11X3VubWFwX2RtYV9hcmVhLCBpb21tdV91bm1hcF9kbWFfYXJlYSwgQlRGSVhVUENBTExfTk9STSk7Ci0JQlRGSVhVUFNFVF9DQUxMKG1tdV90cmFuc2xhdGVfZHZtYSwgaW9tbXVfdHJhbnNsYXRlX2R2bWEsIEJURklYVVBDQUxMX05PUk0pOwogI2VuZGlmCiAKIAlpZiAodmlraW5nX214Y2NfcHJlc2VudCB8fCBzcm1tdV9tb2R0eXBlID09IEh5cGVyU3BhcmMpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vbm9zcm1tdS5jIGIvYXJjaC9zcGFyYy9tbS9ub3NybW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDFmNzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9tbS9ub3NybW11LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogbm9zcm1tdS5jOiBUaGlzIGZpbGUgaXMgYSBidW5jaCBvZiBkdW1taWVzIGZvciBzdW40IGNvbXBpbGVzLCAKLSAqICAgICAgICAgc28gdGhhdCBpdCBkb2VzIG5vdCBuZWVkIHNybW11IGFuZCBhdm9pZCBpZmRlZnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9tYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KLQotc3RhdGljIGNoYXIgc2hvdWxkbm90aGFwcGVuW10gX19pbml0ZGF0YSA9ICJTVU40IGtlcm5lbCBjYW4gb25seSBydW4gb24gU1VONFxuIjsKLQotZW51bSBtYnVzX21vZHVsZSBzcm1tdV9tb2R0eXBlOwotdm9pZCAqc3JtbXVfbm9jYWNoZV9wb29sOwotCi1pbnQgdmFjX2NhY2hlX3NpemUgPSAwOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2hvdWxkX25vdF9oYXBwZW4odm9pZCkKLXsKLQlwcm9tX3ByaW50ZihzaG91bGRub3RoYXBwZW4pOwotCXByb21faGFsdCgpOwotfQotCi12b2lkIF9faW5pdCBzcm1tdV9mcm9iX21lbV9tYXAodW5zaWduZWQgbG9uZyBzdGFydF9tZW0pCi17Ci0Jc2hvdWxkX25vdF9oYXBwZW4oKTsKLX0KLQotdW5zaWduZWQgbG9uZyBfX2luaXQgc3JtbXVfcGFnaW5nX2luaXQodW5zaWduZWQgbG9uZyBzdGFydF9tZW0sIHVuc2lnbmVkIGxvbmcgZW5kX21lbSkKLXsKLQlzaG91bGRfbm90X2hhcHBlbigpOwotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBsZF9tbXVfc3JtbXUodm9pZCkKLXsKLQlzaG91bGRfbm90X2hhcHBlbigpOwotfQotCi12b2lkIHNybW11X21hcGlvYWRkcih1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgaW50IGJ1c190eXBlLCBpbnQgcmRvbmx5KQotewotfQotCi12b2lkIHNybW11X3VubWFwaW9hZGRyKHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyKQotewotfQotCi1fX3UzMiBpb3VuaXRfbWFwX2RtYV9pbml0KHN0cnVjdCBzYnVzX2J1cyAqc2J1cywgaW50IHNpemUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLV9fdTMyIGlvdW5pdF9tYXBfZG1hX3BhZ2UoX191MzIgdmFkZHIsIHZvaWQgKmFkZHIsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwppbmRleCBlZTMwNDYyLi42YTVkN2NhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3NybW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL21idXMuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vbXNpLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3N1bjRjLmMgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKaW5kZXggZDE3ODJmNi4uZmU2NWFlZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3VuNGMuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9zdW40cGFkZHIuaD4KICNpbmNsdWRlIDxhc20vaGlnaG1lbS5oPgogI2luY2x1ZGUgPGFzbS9idGZpeHVwLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTUyLDE1ICs1MSwxMSBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX2tlcm5lbDsKIAotI2lmZGVmIENPTkZJR19TVU40Ci0jZGVmaW5lIFNVTjRDX1ZBQ19TSVpFIHN1bjRjX3ZhY2luZm8ubnVtX2J5dGVzCi0jZWxzZQogLyogVGhhdCdzIGl0LCB3ZSBwcm9tX2hhbHQoKSBvbiBzdW40YyBpZiB0aGUgY2FjaGUgc2l6ZSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiA2NTUzNi4KICAqIFNvIGxldCdzIHNhdmUgc29tZSBjeWNsZXMgYW5kIGp1c3QgdXNlIHRoYXQgZXZlcnl3aGVyZSBleGNlcHQgZm9yIHRoYXQgYm9vdHVwCiAgKiBzYW5pdHkgY2hlY2suCiAgKi8KICNkZWZpbmUgU1VONENfVkFDX1NJWkUgNjU1MzYKLSNlbmRpZgogCiAjZGVmaW5lIFNVTjRDX0tFUk5FTF9CVUNLRVRTIDMyCiAKQEAgLTI4NSw3NSArMjgwLDMyIEBACiB7CiAJc3VuNGNfZGlzYWJsZV92YWMoKTsKIAotCWlmIChBUkNIX1NVTjQpIHsKLQkJc3dpdGNoIChpZHByb20tPmlkX21hY2h0eXBlKSB7Ci0KLQkJY2FzZSAoU01fU1VONHxTTV80XzExMCk6Ci0JCQlzdW40Y192YWNpbmZvLnR5cGUgPSBWQUNfTk9ORTsKLQkJCXN1bjRjX3ZhY2luZm8ubnVtX2J5dGVzID0gMDsKLQkJCXN1bjRjX3ZhY2luZm8ubGluZXNpemUgPSAwOwotCQkJc3VuNGNfdmFjaW5mby5kb19od2ZsdXNoZXMgPSAwOwotCQkJcHJvbV9wcmludGYoIk5vIFZBQy4gR2V0IHNvbWUgYnVja3MgYW5kIGJ1eSBhIHJlYWwgY29tcHV0ZXIuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKFNNX1NVTjR8U01fNF8yNjApOgotCQkJc3VuNGNfdmFjaW5mby50eXBlID0gVkFDX1dSSVRFX0JBQ0s7Ci0JCQlzdW40Y192YWNpbmZvLm51bV9ieXRlcyA9IDEyOCAqIDEwMjQ7Ci0JCQlzdW40Y192YWNpbmZvLmxpbmVzaXplID0gMTY7Ci0JCQlzdW40Y192YWNpbmZvLmRvX2h3Zmx1c2hlcyA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIChTTV9TVU40fFNNXzRfMzMwKToKLQkJCXN1bjRjX3ZhY2luZm8udHlwZSA9IFZBQ19XUklURV9USFJPVUdIOwotCQkJc3VuNGNfdmFjaW5mby5udW1fYnl0ZXMgPSAxMjggKiAxMDI0OwotCQkJc3VuNGNfdmFjaW5mby5saW5lc2l6ZSA9IDE2OwotCQkJc3VuNGNfdmFjaW5mby5kb19od2ZsdXNoZXMgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAoU01fU1VONHxTTV80XzQ3MCk6Ci0JCQlzdW40Y192YWNpbmZvLnR5cGUgPSBWQUNfV1JJVEVfQkFDSzsKLQkJCXN1bjRjX3ZhY2luZm8ubnVtX2J5dGVzID0gMTI4ICogMTAyNDsKLQkJCXN1bjRjX3ZhY2luZm8ubGluZXNpemUgPSAzMjsKLQkJCXN1bjRjX3ZhY2luZm8uZG9faHdmbHVzaGVzID0gMDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcm9tX3ByaW50ZigiQ2Fubm90IGluaXRpYWxpemUgVkFDIC0gd2VpcmQgc3VuNCBtb2RlbCBpZHByb20tPmlkX21hY2h0eXBlID0gJWQiLCBpZHByb20tPmlkX21hY2h0eXBlKTsKLQkJCXByb21faGFsdCgpOwotCQl9OworCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzEpKSB8fAorCSAgICAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzFQTFVTKSkpIHsKKwkJLyogUFJPTSBvbiBTUzEgbGFja3MgdGhpcyBpbmZvLCB0byBiZSBzdXBlciBzYWZlIHdlCisJCSAqIGhhcmQgY29kZSBpdCBoZXJlIHNpbmNlIHRoaXMgYXJjaCBpcyBjYXN0IGluIHN0b25lLgorCQkgKi8KKwkJc3VuNGNfdmFjaW5mby5udW1fYnl0ZXMgPSA2NTUzNjsKKwkJc3VuNGNfdmFjaW5mby5saW5lc2l6ZSA9IDE2OwogCX0gZWxzZSB7Ci0JCXN1bjRjX3ZhY2luZm8udHlwZSA9IFZBQ19XUklURV9USFJPVUdIOworCQlzdW40Y192YWNpbmZvLm51bV9ieXRlcyA9CisJCSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9yb290X25vZGUsICJ2YWMtc2l6ZSIsIDY1NTM2KTsKKwkJc3VuNGNfdmFjaW5mby5saW5lc2l6ZSA9CisJCSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9yb290X25vZGUsICJ2YWMtbGluZXNpemUiLCAxNik7CisJfQorCXN1bjRjX3ZhY2luZm8uZG9faHdmbHVzaGVzID0KKwkgcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fcm9vdF9ub2RlLCAidmFjLWh3Zmx1c2giLCAwKTsKIAotCQlpZiAoKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjRDIHwgU01fNENfU1MxKSkgfHwKLQkJICAgIChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40QyB8IFNNXzRDX1NTMVBMVVMpKSkgewotCQkJLyogUFJPTSBvbiBTUzEgbGFja3MgdGhpcyBpbmZvLCB0byBiZSBzdXBlciBzYWZlIHdlCi0JCQkgKiBoYXJkIGNvZGUgaXQgaGVyZSBzaW5jZSB0aGlzIGFyY2ggaXMgY2FzdCBpbiBzdG9uZS4KLQkJCSAqLwotCQkJc3VuNGNfdmFjaW5mby5udW1fYnl0ZXMgPSA2NTUzNjsKLQkJCXN1bjRjX3ZhY2luZm8ubGluZXNpemUgPSAxNjsKLQkJfSBlbHNlIHsKLQkJCXN1bjRjX3ZhY2luZm8ubnVtX2J5dGVzID0KLQkJCSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9yb290X25vZGUsICJ2YWMtc2l6ZSIsIDY1NTM2KTsKLQkJCXN1bjRjX3ZhY2luZm8ubGluZXNpemUgPQotCQkJIHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX3Jvb3Rfbm9kZSwgInZhYy1saW5lc2l6ZSIsIDE2KTsKLQkJfQorCWlmIChzdW40Y192YWNpbmZvLmRvX2h3Zmx1c2hlcyA9PSAwKQogCQlzdW40Y192YWNpbmZvLmRvX2h3Zmx1c2hlcyA9Ci0JCSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9yb290X25vZGUsICJ2YWMtaHdmbHVzaCIsIDApOworCQkgcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fcm9vdF9ub2RlLCAidmFjX2h3Zmx1c2giLCAwKTsKIAotCQlpZiAoc3VuNGNfdmFjaW5mby5kb19od2ZsdXNoZXMgPT0gMCkKLQkJCXN1bjRjX3ZhY2luZm8uZG9faHdmbHVzaGVzID0KLQkJCSBwcm9tX2dldGludGRlZmF1bHQocHJvbV9yb290X25vZGUsICJ2YWNfaHdmbHVzaCIsIDApOwotCi0JCWlmIChzdW40Y192YWNpbmZvLm51bV9ieXRlcyAhPSA2NTUzNikgewotCQkJcHJvbV9wcmludGYoIldFSVJEIFN1bjRDIFZBQyBjYWNoZSBzaXplLCAiCi0JCQkJICAgICJ0ZWxsIHNwYXJjbGludXhAdmdlci5rZXJuZWwub3JnIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQorCWlmIChzdW40Y192YWNpbmZvLm51bV9ieXRlcyAhPSA2NTUzNikgeworCQlwcm9tX3ByaW50ZigiV0VJUkQgU3VuNEMgVkFDIGNhY2hlIHNpemUsICIKKwkJCSAgICAidGVsbCBzcGFyY2xpbnV4QHZnZXIua2VybmVsLm9yZyIpOworCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzdW40Y192YWNpbmZvLm51bV9saW5lcyA9Ci0JCShzdW40Y192YWNpbmZvLm51bV9ieXRlcyAvIHN1bjRjX3ZhY2luZm8ubGluZXNpemUpOwogCXN3aXRjaCAoc3VuNGNfdmFjaW5mby5saW5lc2l6ZSkgewogCWNhc2UgMTY6CiAJCXN1bjRjX3ZhY2luZm8ubG9nMmxzaXplID0gNDsKQEAgLTQ0Nyw0OSArMzk5LDE4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzdW40Y19wcm9iZV9tbXUodm9pZCkKIHsKLQlpZiAoQVJDSF9TVU40KSB7Ci0JCXN3aXRjaCAoaWRwcm9tLT5pZF9tYWNodHlwZSkgewotCQljYXNlIChTTV9TVU40fFNNXzRfMTEwKToKLQkJCXByb21fcHJpbnRmKCJObyBzdXBwb3J0IGZvciA0MTAwIHlldFxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJCW51bV9zZWdtYXBzID0gMjU2OwotCQkJbnVtX2NvbnRleHRzID0gODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKFNNX1NVTjR8U01fNF8yNjApOgotCQkJLyogc2hvdWxkIGJlIDUxMiBzZWdtYXBzLiB3aGVuIGl0IGdldCBmaXhlZCAqLwotCQkJbnVtX3NlZ21hcHMgPSAyNTY7Ci0JCQludW1fY29udGV4dHMgPSAxNjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKFNNX1NVTjR8U01fNF8zMzApOgotCQkJbnVtX3NlZ21hcHMgPSAyNTY7Ci0JCQludW1fY29udGV4dHMgPSAxNjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKFNNX1NVTjR8U01fNF80NzApOgotCQkJLyogc2hvdWxkIGJlIDEwMjQgc2VnbWFwcy4gd2hlbiBpdCBnZXQgZml4ZWQgKi8KLQkJCW51bV9zZWdtYXBzID0gMjU2OwotCQkJbnVtX2NvbnRleHRzID0gNjQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByb21fcHJpbnRmKCJJbnZhbGlkIFNVTjQgbW9kZWxcbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX07CisJaWYgKChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40QyB8IFNNXzRDX1NTMSkpIHx8CisJICAgIChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40QyB8IFNNXzRDX1NTMVBMVVMpKSkgeworCQkvKiBIYXJkY29kZSB0aGVzZSBqdXN0IHRvIGJlIHNhZmUsIFBST00gb24gU1MxIGRvZXMKKwkJKiBub3QgaGF2ZSB0aGlzIGluZm8gYXZhaWxhYmxlIGluIHRoZSByb290IG5vZGUuCisJCSovCisJCW51bV9zZWdtYXBzID0gMTI4OworCQludW1fY29udGV4dHMgPSA4OwogCX0gZWxzZSB7Ci0JCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzEpKSB8fAotCQkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjRDIHwgU01fNENfU1MxUExVUykpKSB7Ci0JCQkvKiBIYXJkY29kZSB0aGVzZSBqdXN0IHRvIGJlIHNhZmUsIFBST00gb24gU1MxIGRvZXMKLQkJIAkqIG5vdCBoYXZlIHRoaXMgaW5mbyBhdmFpbGFibGUgaW4gdGhlIHJvb3Qgbm9kZS4KLQkJIAkqLwotCQkJbnVtX3NlZ21hcHMgPSAxMjg7Ci0JCQludW1fY29udGV4dHMgPSA4OwotCQl9IGVsc2UgewotCQkJbnVtX3NlZ21hcHMgPQotCQkJICAgIHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX3Jvb3Rfbm9kZSwgIm1tdS1ucG1nIiwgMTI4KTsKLQkJCW51bV9jb250ZXh0cyA9Ci0JCQkgICAgcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fcm9vdF9ub2RlLCAibW11LW5jdHgiLCAweDgpOwotCQl9CisJCW51bV9zZWdtYXBzID0KKwkJICAgIHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX3Jvb3Rfbm9kZSwgIm1tdS1ucG1nIiwgMTI4KTsKKwkJbnVtX2NvbnRleHRzID0KKwkJICAgIHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX3Jvb3Rfbm9kZSwgIm1tdS1uY3R4IiwgMHg4KTsKIAl9CiAJcGF0Y2hfa2VybmVsX2ZhdWx0X2hhbmRsZXIoKTsKIH0KQEAgLTUwMSwxOCArNDIyLDE0IEBACiAJaW50IG5vZGU7CiAJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHJlZ3NbMV07CiAKLQlpZiAoQVJDSF9TVU40KSB7Ci0JCXN1bjRjX21lbWVycl9yZWcgPSBpb3JlbWFwKHN1bjRfbWVtcmVnX3BoeXNhZGRyLCBQQUdFX1NJWkUpOwotCX0gZWxzZSB7Ci0JCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQkJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3MocHJvbV9yb290X25vZGUsICJtZW1vcnktZXJyb3IiKTsKLQkJaWYgKCFub2RlKQotCQkJcmV0dXJuOwotCQlpZiAocHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwgKGNoYXIgKilyZWdzLCBzaXplb2YocmVncykpIDw9IDApCi0JCQlyZXR1cm47Ci0JCS8qIGhtbSBJIHRoaW5rIHJlZ3NbMF0ud2hpY2hfaW8gaXMgemVybyBoZXJlIGFueXdheXMgKi8KLQkJc3VuNGNfbWVtZXJyX3JlZyA9IGlvcmVtYXAocmVnc1swXS5waHlzX2FkZHIsIHJlZ3NbMF0ucmVnX3NpemUpOwotCX0KKwlub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7CisJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3MocHJvbV9yb290X25vZGUsICJtZW1vcnktZXJyb3IiKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybjsKKwlpZiAocHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwgKGNoYXIgKilyZWdzLCBzaXplb2YocmVncykpIDw9IDApCisJCXJldHVybjsKKwkvKiBobW0gSSB0aGluayByZWdzWzBdLndoaWNoX2lvIGlzIHplcm8gaGVyZSBhbnl3YXlzICovCisJc3VuNGNfbWVtZXJyX3JlZyA9IGlvcmVtYXAocmVnc1swXS5waHlzX2FkZHIsIHJlZ3NbMF0ucmVnX3NpemUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VuNGNfaW5pdF9zczJfY2FjaGVfYnVnKHZvaWQpCkBAIC01MjEsNyArNDM4LDYgQEAKIAogCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzIpKSB8fAogCSAgICAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19JUFgpKSB8fAotCSAgICAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONCB8IFNNXzRfMzMwKSkgfHwKIAkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjRDIHwgU01fNENfRUxDKSkpIHsKIAkJLyogV2hlZS4uICovCiAJCXByaW50aygiU1MyIGNhY2hlIGJ1ZyBkZXRlY3RlZCwgdW5jYWNoaW5nIHRyYXAgdGFibGUgcGFnZVxuIik7CkBAIC01MzIsOCArNDQ4LDggQEAKIH0KIAogLyogQWRkciBpcyBhbHdheXMgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnkgZm9yIHVzIGFscmVhZHkuICovCi1zdGF0aWMgaW50IHN1bjRjX21hcF9kbWFfYXJlYShkbWFfYWRkcl90ICpwYmEsIHVuc2lnbmVkIGxvbmcgdmEsCi0gICAgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKQorc3RhdGljIGludCBzdW40Y19tYXBfZG1hX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90ICpwYmEsIHVuc2lnbmVkIGxvbmcgdmEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBwYWdlLCBlbmQ7CiAKQEAgLTU1NSwxNCArNDcxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpzdW40Y190cmFuc2xhdGVfZHZtYSh1bnNpZ25lZCBsb25nIGJ1c2EpCi17Ci0JLyogRm9ydHVuYXRlbHkgZm9yIHVzLCBidXNfYWRkciA9PSB1bmNhY2hlZF92aXJ0IGluIHN1bjRjLiAqLwotCXVuc2lnbmVkIGxvbmcgcHRlID0gc3VuNGNfZ2V0X3B0ZShidXNhKTsKLQlyZXR1cm4gcGZuX3RvX3BhZ2UocHRlICYgU1VONENfUEZOX01BU0spOwotfQotCi1zdGF0aWMgdm9pZCBzdW40Y191bm1hcF9kbWFfYXJlYSh1bnNpZ25lZCBsb25nIGJ1c2EsIGludCBsZW4pCitzdGF0aWMgdm9pZCBzdW40Y191bm1hcF9kbWFfYXJlYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgYnVzYSwgaW50IGxlbikKIHsKIAkvKiBGb3J0dW5hdGVseSBmb3IgdXMsIGJ1c19hZGRyID09IHVuY2FjaGVkX3ZpcnQgaW4gc3VuNGMuICovCiAJLyogWFhYIEltcGxlbWVudCB0aGlzICovCkBAIC02MjQsMTEgKzUzMyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2YWRkcjsKIAl1bnNpZ25lZCBjaGFyIHBzZWcsIGN0eDsKLSNpZmRlZiBDT05GSUdfU1VONAotCS8qIHN1bjQvMTEwIGFuZCAyNjAgaGF2ZSBubyBrYWRiLiAqLwotCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSAhPSAoU01fU1VONCB8IFNNXzRfMjYwKSkgJiYgCi0JICAgIChpZHByb20tPmlkX21hY2h0eXBlICE9IChTTV9TVU40IHwgU01fNF8xMTApKSkgewotI2VuZGlmCisKIAlmb3IgKHZhZGRyID0gS0FEQl9ERUJVR0dFUl9CRUdWTTsKIAkgICAgIHZhZGRyIDwgTElOVVhfT1BQUk9NX0VORFZNOwogCSAgICAgdmFkZHIgKz0gU1VONENfUkVBTF9QR0RJUl9TSVpFKSB7CkBAIC02NDAsOSArNTQ1LDcgQEAKIAkJCWZpeF9wZXJtaXNzaW9ucyh2YWRkciwgX1NVTjRDX1BBR0VfUFJJViwgMCk7CiAJCX0KIAl9Ci0jaWZkZWYgQ09ORklHX1NVTjQKLQl9Ci0jZW5kaWYKKwogCWZvciAodmFkZHIgPSBLRVJOQkFTRTsgdmFkZHIgPCBrZXJuZWxfZW5kOyB2YWRkciArPSBTVU40Q19SRUFMX1BHRElSX1NJWkUpIHsKIAkJcHNlZyA9IHN1bjRjX2dldF9zZWdtYXAodmFkZHIpOwogCQltbXVfZW50cnlfcG9vbFtwc2VnXS5sb2NrZWQgPSAxOwpAQCAtMTA0OCwxNCArOTUxLDEwIEBACiAJICogc28gd2UgbXVzdCBmbHVzaCB0aGUgY2FjaGUgdG8gZ3VhcmFudGVlIGNvbnNpc3RlbmN5LgogCSAqLwogCXN1bjRjX2ZsdXNoX3BhZ2UocGFnZXMpOwotI2lmbmRlZiBDT05GSUdfU1VONAkKIAlzdW40Y19mbHVzaF9wYWdlKHBhZ2VzICsgUEFHRV9TSVpFKTsKLSNlbmRpZgogCiAJc3VuNGNfcHV0X3B0ZShhZGRyLCBCVUNLRVRfUFRFKHBhZ2VzKSk7Ci0jaWZuZGVmIENPTkZJR19TVU40CQogCXN1bjRjX3B1dF9wdGUoYWRkciArIFBBR0VfU0laRSwgQlVDS0VUX1BURShwYWdlcyArIFBBR0VfU0laRSkpOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKIAltZW1zZXQoKHZvaWQgKilhZGRyLCAwLCBQQUdFX1NJWkUgPDwgVEhSRUFEX0lORk9fT1JERVIpOwpAQCAtMTA3MiwxMyArOTcxLDExIEBACiAKIAkvKiBXZSBhcmUgZGVsZXRpbmcgYSBtYXBwaW5nLCBzbyB0aGUgZmx1c2ggaGVyZSBpcyBtYW5kYXRvcnkuICovCiAJc3VuNGNfZmx1c2hfcGFnZSh0aWFkZHIpOwotI2lmbmRlZiBDT05GSUdfU1VONAkKIAlzdW40Y19mbHVzaF9wYWdlKHRpYWRkciArIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwogCXN1bjRjX3B1dF9wdGUodGlhZGRyLCAwKTsKLSNpZm5kZWYgQ09ORklHX1NVTjQJCiAJc3VuNGNfcHV0X3B0ZSh0aWFkZHIgKyBQQUdFX1NJWkUsIDApOwotI2VuZGlmCisKIAlzdW40Y19idWNrZXRbZW50cnldID0gQlVDS0VUX0VNUFRZOwogCWlmIChlbnRyeSA8IHN1bjRjX2xvd2J1Y2tldF9hdmFpbCkKIAkJc3VuNGNfbG93YnVja2V0X2F2YWlsID0gZW50cnk7CkBAIC0xMjExLDcgKzExMDgsNyBAQAogICogYnkgaW1wbGljYXRpb24gYW5kIGZvb2wgdGhlIHBhZ2UgbG9ja2luZyBjb2RlIGFib3ZlCiAgKiBpZiBwYXNzZWQgdG8gYnkgbWlzdGFrZS4KICAqLwotc3RhdGljIF9fdTMyIHN1bjRjX2dldF9zY3NpX29uZShjaGFyICpidWZwdHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgX191MzIgc3VuNGNfZ2V0X3Njc2lfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmcHRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CiAKQEAgLTEyMjMsNyArMTEyMCw3IEBACiAJcmV0dXJuIChfX3UzMilzdW40Y19sb2NrYXJlYShidWZwdHIsIGxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjRjX2dldF9zY3NpX3NnbChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3osIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIHN1bjRjX2dldF9zY3NpX3NnbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzeikKIHsKIAl3aGlsZSAoc3ogIT0gMCkgewogCQktLXN6OwpAQCAtMTIzMywxNCArMTEzMCwxNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc3VuNGNfcmVsZWFzZV9zY3NpX29uZShfX3UzMiBidWZwdHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBzdW40Y19yZWxlYXNlX3Njc2lfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwgX191MzIgYnVmcHRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlpZiAoYnVmcHRyIDwgc3VuNGNfaW9idWZmZXJfc3RhcnQpCiAJCXJldHVybjsgLyogT24ga2VybmVsIHN0YWNrIG9yIHNpbWlsYXIsIHNlZSBhYm92ZSAqLwogCXN1bjRjX3VubG9ja2FyZWEoKGNoYXIgKilidWZwdHIsIGxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjRjX3JlbGVhc2Vfc2NzaV9zZ2woc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHN6LCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBzdW40Y19yZWxlYXNlX3Njc2lfc2dsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHN6KQogewogCXdoaWxlIChzeiAhPSAwKSB7CiAJCS0tc3o7CkBAIC0yMjYzLDcgKzIxNjAsNiBAQAogCiAJQlRGSVhVUFNFVF9DQUxMKG1tdV9tYXBfZG1hX2FyZWEsIHN1bjRjX21hcF9kbWFfYXJlYSwgQlRGSVhVUENBTExfTk9STSk7CiAJQlRGSVhVUFNFVF9DQUxMKG1tdV91bm1hcF9kbWFfYXJlYSwgc3VuNGNfdW5tYXBfZG1hX2FyZWEsIEJURklYVVBDQUxMX05PUk0pOwotCUJURklYVVBTRVRfQ0FMTChtbXVfdHJhbnNsYXRlX2R2bWEsIHN1bjRjX3RyYW5zbGF0ZV9kdm1hLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChzcGFyY19tYXBpb3JhbmdlLCBzdW40Y19tYXBpb3JhbmdlLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwoc3BhcmNfdW5tYXBpb3JhbmdlLCBzdW40Y191bm1hcGlvcmFuZ2UsIEJURklYVVBDQUxMX05PUk0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9wcm9tL01ha2VmaWxlCmluZGV4IDdmNWVhY2YuLjhmN2UxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL3Byb20vTWFrZWZpbGUKQEAgLTQsNSArNCwzIEBACiAKIGxpYi15IDo9IGJvb3RzdHIubyBkZXZtYXAubyBkZXZvcHMubyBpbml0Lm8gbWVtb3J5Lm8gbWlzYy5vIG1wLm8gXAogCSBwYWxsb2MubyByYW5nZXMubyBzZWdtZW50Lm8gY29uc29sZS5vIHByaW50Zi5vIHRyZWUubwotCi1saWItJChDT05GSUdfU1VONCkgKz0gc3VuNHByb20ubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2Jvb3RzdHIuYyBiL2FyY2gvc3BhcmMvcHJvbS9ib290c3RyLmMKaW5kZXggNWEzNWM3Ni4uOTE2ODMxZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2Jvb3RzdHIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vYm9vdHN0ci5jCkBAIC02LDE1ICs2LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vc3VuNHByb20uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNkZWZpbmUgQkFSR19MRU4gIDI1Ngogc3RhdGljIGNoYXIgYmFyZ19idWZbQkFSR19MRU5dID0geyAwIH07CiBzdGF0aWMgY2hhciBmZXRjaGVkIF9faW5pdGRhdGEgPSAwOwogCi1leHRlcm4gbGludXhfc3VuNF9yb212ZWMgKnN1bjRfcm9tdmVjOwotCiBjaGFyICogX19pbml0CiBwcm9tX2dldGJvb3RhcmdzKHZvaWQpCiB7CkBAIC0yOCw3ICsyNSw2IEBACiAKIAlzd2l0Y2gocHJvbV92ZXJzKSB7CiAJY2FzZSBQUk9NX1YwOgotCWNhc2UgUFJPTV9TVU40OgogCQljcCA9IGJhcmdfYnVmOwogCQkvKiBTdGFydCBmcm9tIDEgYW5kIGdvIG92ZXIgZmQoMCwwLDApa2VybmVsICovCiAJCWZvcihpdGVyID0gMTsgaXRlciA8IDg7IGl0ZXIrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGUuYyBiL2FyY2gvc3BhcmMvcHJvbS9jb25zb2xlLmMKaW5kZXggNzkwMDU3YS4uYjMwNzVkNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2NvbnNvbGUuYworKysgYi9hcmNoL3NwYXJjL3Byb20vY29uc29sZS5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KLSNpbmNsdWRlIDxhc20vc3VuNHByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0zMCw3ICsyOSw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByb21fbG9jaywgZmxhZ3MpOwogCXN3aXRjaChwcm9tX3ZlcnMpIHsKIAljYXNlIFBST01fVjA6Ci0JY2FzZSBQUk9NX1NVTjQ6CiAJCWkgPSAoKihyb212ZWMtPnB2X25iZ2V0Y2hhcikpKCk7CiAJCWJyZWFrOwogCWNhc2UgUFJPTV9WMjoKQEAgLTYzLDcgKzYxLDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJvbV9sb2NrLCBmbGFncyk7CiAJc3dpdGNoKHByb21fdmVycykgewogCWNhc2UgUFJPTV9WMDoKLQljYXNlIFBST01fU1VONDoKIAkJaSA9ICgqKHJvbXZlYy0+cHZfbmJwdXRjaGFyKSkoYyk7CiAJCWJyZWFrOwogCWNhc2UgUFJPTV9WMjoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9pbml0LmMgYi9hcmNoL3NwYXJjL3Byb20vaW5pdC5jCmluZGV4IDcyOWY4NzAuLjg3MzIxN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL2luaXQuYwpAQCAtMTEsMTIgKzExLDEwIEBACiAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vc3VuNHByb20uaD4KIAogc3RydWN0IGxpbnV4X3JvbXZlYyAqcm9tdmVjOwogZW51bSBwcm9tX21ham9yX3ZlcnNpb24gcHJvbV92ZXJzOwogdW5zaWduZWQgaW50IHByb21fcmV2LCBwcm9tX3ByZXY7Ci1saW51eF9zdW40X3JvbXZlYyAqc3VuNF9yb212ZWM7CiAKIC8qIFRoZSByb290IG5vZGUgb2YgdGhlIHByb20gZGV2aWNlIHRyZWUuICovCiBpbnQgcHJvbV9yb290X25vZGU7CkBAIC0zNCwxMCArMzIsNiBAQAogCiB2b2lkIF9faW5pdCBwcm9tX2luaXQoc3RydWN0IGxpbnV4X3JvbXZlYyAqcnApCiB7Ci0jaWZkZWYgQ09ORklHX1NVTjQKLQlleHRlcm4gc3RydWN0IGxpbnV4X3JvbXZlYyAqc3VuNF9wcm9tX2luaXQodm9pZCk7Ci0JcnAgPSBzdW40X3Byb21faW5pdCgpOwotI2VuZGlmCiAJcm9tdmVjID0gcnA7CiAKIAlzd2l0Y2gocm9tdmVjLT5wdl9yb212ZXJzKSB7CkBAIC01MCw5ICs0NCw2IEBACiAJY2FzZSAzOgogCQlwcm9tX3ZlcnMgPSBQUk9NX1YzOwogCQlicmVhazsKLQljYXNlIDQwOgotCQlwcm9tX3ZlcnMgPSBQUk9NX1NVTjQ7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByb21fcHJpbnRmKCJQUk9NTElCOiBCYWQgUFJPTSB2ZXJzaW9uICVkXG4iLAogCQkJICAgIHJvbXZlYy0+cHZfcm9tdmVycyk7CkBAIC03NiwxMSArNjcsOCBAQAogCiAJcHJvbV9yYW5nZXNfaW5pdCgpOwogCi0jaWZuZGVmIENPTkZJR19TVU40Ci0JLyogU1VONCBwcmludHMgdGhpcyBpbiBzdW40X3Byb21faW5pdCAqLwogCXByaW50aygiUFJPTUxJQjogU3VuIEJvb3QgUHJvbSBWZXJzaW9uICVkIFJldmlzaW9uICVkXG4iLAogCSAgICAgICByb212ZWMtPnB2X3JvbXZlcnMsIHByb21fcmV2KTsKLSNlbmRpZgogCiAJLyogSW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bC4gKi8KIAlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vbWVtb3J5LmMgYi9hcmNoL3NwYXJjL3Byb20vbWVtb3J5LmMKaW5kZXggOTQ3ZjA0Ny4uZmFjNzg5OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL21lbW9yeS5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9tZW1vcnkuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zdW40cHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKQEAgLTQ2LDE1ICs0NSw2IEBACiAJcmV0dXJuIG51bV9lbnRzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwcm9tX21lbWluaXRfc3VuNCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TVU40Ci0Jc3BfYmFua3NbMF0uYmFzZV9hZGRyID0gMDsKLQlzcF9iYW5rc1swXS5udW1fYnl0ZXMgPSAqKHN1bjRfcm9tdmVjLT5tZW1vcnlhdmFpbCk7Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBzcF9iYW5rc19jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKIHsKIAljb25zdCBzdHJ1Y3Qgc3BhcmNfcGh5c19iYW5rcyAqeCA9IGEsICp5ID0gYjsKQEAgLTgxLDEwICs3MSw2IEBACiAJCW51bV9lbnRzID0gcHJvbV9tZW1pbml0X3YyKCk7CiAJCWJyZWFrOwogCi0JY2FzZSBQUk9NX1NVTjQ6Ci0JCW51bV9lbnRzID0gcHJvbV9tZW1pbml0X3N1bjQoKTsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMgYi9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMKaW5kZXggZjliN2RlZi4uNjQ1NzlhMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHByb21saWJfb2Jpb19yYW5nZXNbUFJPTVJFR19NQVhdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL3N1bjRwcm9tLmMgYi9hcmNoL3NwYXJjL3Byb20vc3VuNHByb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzOTBhMi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL3Byb20vc3VuNHByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2IFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRnVqaXRzdSBMYWJvcmF0b3JpZXMgTGltaXRlZAotICogQ29weXJpZ2h0IChDKSAxOTk3IE1pY2hhZWwgQS4gR3JpZmZpdGggKGdyaWZAYWNtLm9yZykKLSAqIENvcHlyaWdodCAoQykgMTk5NyBTdW4gV2VlbmllIChrb0Brby5yZW5vLm52LnVzKQotICogQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR251Ci0gKiBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgbGF0ZXIKLSAqCi0gKiBmYWtlIGEgcmVhbGx5IHNpbXBsZSBTdW4gcHJvbSBmb3IgdGhlIFNVTjQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2lkcHJvbS5oPiAKLSNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4gCi0jaW5jbHVkZSA8YXNtL3N1bjRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2FzaS5oPgotI2luY2x1ZGUgPGFzbS9jb250cmVncy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotc3RhdGljIHN0cnVjdCBsaW51eF9yb212ZWMgc3VuNHJvbXZlYzsKLXN0YXRpYyBzdHJ1Y3QgaWRwcm9tIHN1bjRfaWRwcm9tOwotCi1zdHJ1Y3QgcHJvcGVydHkgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqdmFsdWU7Ci0JaW50IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBub2RlIHsKLQlpbnQgbGV2ZWw7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wZXJ0aWVzOwotfTsKLQotc3RydWN0IHByb3BlcnR5IG51bGxfcHJvcGVydGllcyA9IHsgTlVMTCwgTlVMTCwgLTEgfTsKLQotc3RydWN0IHByb3BlcnR5IHJvb3RfcHJvcGVydGllc1tdID0gewotCXsiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNH0sCi0JeyJpZHByb20iLCAoY2hhciAqKSZzdW40X2lkcHJvbSwgc2l6ZW9mKHN0cnVjdCBpZHByb20pfSwKLQl7TlVMTCwgTlVMTCwgLTF9Ci19OwotCi1zdHJ1Y3Qgbm9kZSBub2Rlc1tdID0gewotCXsgMCwgJm51bGxfcHJvcGVydGllcyB9LCAKLQl7IDAsIHJvb3RfcHJvcGVydGllcyB9LAotCXsgLTEsJm51bGxfcHJvcGVydGllcyB9Ci19OwotCi0KLXN0YXRpYyBpbnQgbm9fbmV4dG5vZGUoaW50IG5vZGUpCi17Ci0JaWYgKG5vZGVzW25vZGVdLmxldmVsID09IG5vZGVzW25vZGUrMV0ubGV2ZWwpCi0JCXJldHVybiBub2RlKzE7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IG5vX2NoaWxkKGludCBub2RlKQotewotCWlmIChub2Rlc1tub2RlXS5sZXZlbCA9PSBub2Rlc1tub2RlKzFdLmxldmVsLTEpCi0JCXJldHVybiBub2RlKzE7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgc3RydWN0IHByb3BlcnR5ICpmaW5kX3Byb3BlcnR5KGludCBub2RlLGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wID0gJm5vZGVzW25vZGVdLnByb3BlcnRpZXNbMF07Ci0Jd2hpbGUgKHByb3AgJiYgcHJvcC0+bmFtZSkgewotCQlpZiAoc3RyY21wKHByb3AtPm5hbWUsbmFtZSkgPT0gMCkgcmV0dXJuIHByb3A7Ci0JCXByb3ArKzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgbm9fcHJvcGxlbihpbnQgbm9kZSxjaGFyICpuYW1lKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IGZpbmRfcHJvcGVydHkobm9kZSxuYW1lKTsKLQlpZiAocHJvcCkgcmV0dXJuIHByb3AtPmxlbmd0aDsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgbm9fZ2V0cHJvcChpbnQgbm9kZSxjaGFyICpuYW1lLGNoYXIgKnZhbHVlKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IGZpbmRfcHJvcGVydHkobm9kZSxuYW1lKTsKLQlpZiAocHJvcCkgewotCQltZW1jcHkodmFsdWUscHJvcC0+dmFsdWUscHJvcC0+bGVuZ3RoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBub19zZXRwcm9wKGludCBub2RlLGNoYXIgKm5hbWUsY2hhciAqdmFsdWUsaW50IGxlbikKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBjaGFyICpub19uZXh0cHJvcChpbnQgbm9kZSxjaGFyICpuYW1lKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IGZpbmRfcHJvcGVydHkobm9kZSxuYW1lKTsKLQlpZiAocHJvcCkgcmV0dXJuIHByb3BbMV0ubmFtZTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBsaW51eF9ub2Rlb3BzIHN1bjRfbm9kZW9wcyA9IHsKLQlub19uZXh0bm9kZSwKLQlub19jaGlsZCwKLQlub19wcm9wbGVuLAotCW5vX2dldHByb3AsCi0Jbm9fc2V0cHJvcCwKLQlub19uZXh0cHJvcAotfTsKLQkKLXN0YXRpYyBpbnQgc3luY2hfaG9vazsKLQotc3RydWN0IGxpbnV4X3JvbXZlYyAqIF9faW5pdCBzdW40X3Byb21faW5pdCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgeDsKLQljaGFyICpwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlwID0gKGNoYXIgKikmc3VuNF9pZHByb207Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihzdW40X2lkcHJvbSk7IGkrKykgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdWJhIFslMV0gJTIsICUwIiA6ICI9ciIgKHgpIDoKLQkJCQkgICAgICAiciIgKEFDX0lEUFJPTSArIGkpLCAiaSIgKEFTSV9DT05UUk9MKSk7Ci0JCSpwKysgPSB4OwotCX0KLQotCW1lbXNldCgmc3VuNHJvbXZlYywwLHNpemVvZihzdW40cm9tdmVjKSk7Ci0KLQlzdW40X3JvbXZlYyA9IChsaW51eF9zdW40X3JvbXZlYyAqKSBTVU40X1BST01fVkVDVE9SOwotCi0Jc3VuNHJvbXZlYy5wdl9yb212ZXJzID0gNDA7Ci0Jc3VuNHJvbXZlYy5wdl9ub2Rlb3BzID0gJnN1bjRfbm9kZW9wczsKLQlzdW40cm9tdmVjLnB2X3JlYm9vdCA9IHN1bjRfcm9tdmVjLT5yZWJvb3Q7Ci0Jc3VuNHJvbXZlYy5wdl9hYm9ydCA9IHN1bjRfcm9tdmVjLT5hYm9ydGVudHJ5OwotCXN1bjRyb212ZWMucHZfaGFsdCA9IHN1bjRfcm9tdmVjLT5leGl0dG9tb247Ci0Jc3VuNHJvbXZlYy5wdl9zeW5jaG9vayA9ICh2b2lkICgqKikodm9pZCkpJnN5bmNoX2hvb2s7Ci0Jc3VuNHJvbXZlYy5wdl9zZXRjdHh0ID0gc3VuNF9yb212ZWMtPnNldGN4c2VnbWFwOwotCXN1bjRyb212ZWMucHZfdjBib290YXJncyA9IHN1bjRfcm9tdmVjLT5ib290UGFyYW07Ci0Jc3VuNHJvbXZlYy5wdl9uYmdldGNoYXIgPSBzdW40X3JvbXZlYy0+bWF5Z2V0OwotCXN1bjRyb212ZWMucHZfbmJwdXRjaGFyID0gc3VuNF9yb212ZWMtPm1heXB1dDsKLQlzdW40cm9tdmVjLnB2X3N0ZGluID0gc3VuNF9yb212ZWMtPmluc291cmNlOwotCXN1bjRyb212ZWMucHZfc3Rkb3V0ID0gc3VuNF9yb212ZWMtPm91dHNpbms7Ci0JCi0JLyoKLQkgKiBXZSB0dXJuIG9uIHRoZSBMRURzIHRvIGxldCBmb2xrcyB3aXRob3V0IG1vbml0b3JzIG9yCi0JICogdGVybWluYWxzIGtub3cgd2UgYm9vdGVkLiAgIE5vdGhpbmcgdG9vIGZhbmN5IG5vdy4gIFRoZXkKLQkgKiBhcmUgYWxsIG9uLCBleGNlcHQgZm9yIExFRCA1LCB3aGljaCBibGlua3MuICAgV2hlbiB3ZQotCSAqIGhhdmUgbW9yZSB0aW1lLCB3ZSBjYW4gdGVhY2ggdGhlIHBlbmd1aW4gdG8gc2F5ICJCeSB5b3VyCi0JICogY29tbWFuZCIgb3IgIkFjdGl2YXRpbmcgdHVyYm8gYm9vc3QsIE1pY2hhZWwiLiA6LSkKLQkgKi8KLQlzdW40X3JvbXZlYy0+c2V0TEVEcyhOVUxMKTsKLQkKLQlwcmludGsoIlBST01MSUI6IE9sZCBTdW40IGJvb3QgUFJPTSBtb25pdG9yICVzLCByb212ZWMgdmVyc2lvbiAlZFxuIiwKLQkJc3VuNF9yb212ZWMtPm1vbmlkLAotCQlzdW40X3JvbXZlYy0+cm9tdmVjdmVyc2lvbik7Ci0KLQlyZXR1cm4gJnN1bjRyb212ZWM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IDM2YjRiN2EuLjU0NDZlMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC0xOCw2ICsxOCwxMyBAQAogCXNlbGVjdCBIQVZFX0FSQ0hfS0dEQgogCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSworCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBSVENfQ0xBU1MKKwlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKKwlzZWxlY3QgUlRDX0RSVl9DTU9TCisJc2VsZWN0IFJUQ19EUlZfQlE0ODAyCisJc2VsZWN0IFJUQ19EUlZfU1VONFYKKwlzZWxlY3QgUlRDX0RSVl9TVEFSRklSRQogCiBjb25maWcgR0VORVJJQ19USU1FCiAJYm9vbApAQCAtMzEsNiArMzgsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX0dQSU8KKwlib29sCisJaGVscAorCSAgR2VuZXJpYyBHUElPIEFQSSBzdXBwb3J0CisKIGNvbmZpZyA2NEJJVAogCWRlZl9ib29sIHkKIApAQCAtMTg1LDYgKzE5NywxNyBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKK2NvbmZpZyBVUzNfTUMKKwl0cmlzdGF0ZSAiVWx0cmFTUEFSQy1JSUkgTWVtb3J5IENvbnRyb2xsZXIgZHJpdmVyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgYWRkcyBhIGRyaXZlciBmb3IgdGhlIFVsdHJhU1BBUkMtSUlJIG1lbW9yeSBjb250cm9sbGVyLgorCSAgTG9hZGluZyB0aGlzIGRyaXZlciBhbGxvd3MgZXhhY3QgbW5lbW9uaWMgc3RyaW5ncyB0byBiZQorCSAgcHJpbnRlZCBpbiB0aGUgZXZlbnQgb2YgYSBtZW1vcnkgZXJyb3IsIHNvIHRoYXQgdGhlIGZhdWx0eSBESU1NCisJICBvbiB0aGUgbW90aGVyYm9hcmQgY2FuIGJlIG1hdGNoZWQgdG8gdGhlIGVycm9yLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFksIGFzIHRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHZlcnkgdXNlZnVsLgorCiAjIEdsb2JhbCB0aGluZ3MgYWNyb3NzIGFsbCBTdW4gbWFjaGluZXMuCiBjb25maWcgR0VORVJJQ19MT0NLQlJFQUsKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQvTWFrZWZpbGUKaW5kZXggYjc4NWEzOS4uYzcyMTRhYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKICMgQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQogIwogCi1DSEVDS0ZMQUdTCSs9IC1EX19zcGFyY19fIC1EX19zcGFyY192OV9fIC1tNjQKK0NIRUNLRkxBR1MJKz0gLURfX3NwYXJjX18gLURfX3NwYXJjX3Y5X18gLURfX2FyY2g2NF9fIC1tNjQKIAogIyBVbmRlZmluZSBzcGFyYyB3aGVuIHByb2Nlc3Npbmcgdm1saW51eC5sZHMgLSBpdCBpcyB1c2VkCiAjIEFuZCB0ZWFjaCBDUFAgd2UgYXJlIGRvaW5nIDY0IGJpdCBidWlsZHMgKGZvciB0aGlzIGNhc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQppbmRleCA0MThiNTc4Li5jMGI4MDA5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTcsMTYgKzcsMTYgQEAKIAogZXh0cmEteQkJOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCiAKLW9iai15CQk6PSBwcm9jZXNzLm8gc2V0dXAubyBjcHUubyBpZHByb20ubyBcCitvYmoteQkJOj0gcHJvY2Vzcy5vIHNldHVwLm8gY3B1Lm8gaWRwcm9tLm8gcmVib290Lm8gXAogCQkgICB0cmFwcy5vIGF1eGlvLm8gdW5hX2FzbS5vIHN5c2ZzLm8gaW9tbXUubyBcCiAJCSAgIGlycS5vIHB0cmFjZS5vIHRpbWUubyBzeXNfc3BhcmMubyBzaWduYWwubyBcCi0JCSAgIHVuYWxpZ25lZC5vIGNlbnRyYWwubyBwY2kubyBzdGFyZmlyZS5vIFwKLQkJICAgcG93ZXIubyBzYnVzLm8gc3BhcmM2NF9rc3ltcy5vIGNobWMubyBcCisJCSAgIHVuYWxpZ25lZC5vIGNlbnRyYWwubyBzdGFyZmlyZS5vIFwKKwkJICAgcG93ZXIubyBzYnVzLm8gc3BhcmM2NF9rc3ltcy5vIGVidXMubyBcCiAJCSAgIHZpc2VtdWwubyBwcm9tLm8gb2ZfZGV2aWNlLm8gaHZhcGkubyBzc3RhdGUubyBtZGVzYy5vCiAKIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkgKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19TVEFDS1RSQUNFKSArPSBzdGFja3RyYWNlLm8KLW9iai0kKENPTkZJR19QQ0kpCSArPSBlYnVzLm8gcGNpX2NvbW1vbi5vIFwKK29iai0kKENPTkZJR19QQ0kpCSArPSBwY2kubyBwY2lfY29tbW9uLm8gcHN5Y2hvX2NvbW1vbi5vIFwKIAkJCSAgICBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vIFwKIAkJCSAgICBwY2lfc3VuNHYubyBwY2lfc3VuNHZfYXNtLm8gcGNpX2ZpcmUubwogb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IHBjaV9tc2kubwpAQCAtMjUsNiArMjUsNyBAQAogb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vCiBvYmotJChDT05GSUdfVVMzX0ZSRVEpICs9IHVzM19jcHVmcmVxLm8KIG9iai0kKENPTkZJR19VUzJFX0ZSRVEpICs9IHVzMmVfY3B1ZnJlcS5vCitvYmotJChDT05GSUdfVVMzX01DKSArPSBjaG1jLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KIG9iai0kKENPTkZJR19TVU5fTERPTVMpICs9IGxkYy5vIHZpby5vIHZpb2hzLm8gZHMubwogb2JqLSQoQ09ORklHX0FVRElUKSArPSBhdWRpdC5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMKaW5kZXggZGQ1YzdiZi4uODU4YmVkYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhdXhpb19tYXRjaFtdID0geworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBhdXhpb19tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiYXV4aW8iLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCmluZGV4IGYyZTg3ZDAuLjA1ZjFjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCkBAIC0xLDQ2MSArMSwyNjggQEAKIC8qIGNlbnRyYWwuYzogQ2VudHJhbCBGSEMgZHJpdmVyIGZvciBTdW5maXJlL1N0YXJmaXJlL1dpbGRmaXJlLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9maGMuaD4KLSNpbmNsdWRlIDxhc20vc3RhcmZpcmUuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgbGludXhfY2VudHJhbCAqY2VudHJhbF9idXMgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBsaW51eF9maGMgKmZoY19saXN0ID0gTlVMTDsKK3N0cnVjdCBjbG9ja19ib2FyZCB7CisJdm9pZCBfX2lvbWVtCQkqY2xvY2tfZnJlcV9yZWdzOworCXZvaWQgX19pb21lbQkJKmNsb2NrX3JlZ3M7CisJdm9pZCBfX2lvbWVtCQkqY2xvY2tfdmVyX3JlZzsKKwlpbnQJCQludW1fc2xvdHM7CisJc3RydWN0IHJlc291cmNlCQlsZWRzX3Jlc291cmNlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJbGVkc19wZGV2OworfTsKIAotI2RlZmluZSBJU19DRU5UUkFMX0ZIQyhfX2ZoYykJKChfX2ZoYykgPT0gY2VudHJhbF9idXMtPmNoaWxkKQorc3RydWN0IGZoYyB7CisJdm9pZCBfX2lvbWVtCQkqcHJlZ3M7CisJYm9vbAkJCWNlbnRyYWw7CisJYm9vbAkJCWp0YWdfbWFzdGVyOworCWludAkJCWJvYXJkX251bTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCWxlZHNfcmVzb3VyY2U7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQlsZWRzX3BkZXY7Cit9OwogCi1zdGF0aWMgdm9pZCBjZW50cmFsX3Byb2JlX2ZhaWx1cmUoaW50IGxpbmUpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbG9ja19ib2FyZF9jYWxjX25zbG90cyhzdHJ1Y3QgY2xvY2tfYm9hcmQgKnApCiB7Ci0JcHJvbV9wcmludGYoIkNFTlRSQUw6IENyaXRpY2FsIGRldmljZSBwcm9iZSBmYWlsdXJlIGF0IGNlbnRyYWwuYzolZFxuIiwKLQkJICAgIGxpbmUpOwotCXByb21faGFsdCgpOwotfQorCXU4IHJlZyA9IHVwYV9yZWFkYihwLT5jbG9ja19yZWdzICsgQ0xPQ0tfU1RBVDEpICYgMHhjMDsKIAotc3RhdGljIHZvaWQgY2VudHJhbF9yYW5nZXNfaW5pdChzdHJ1Y3QgbGludXhfY2VudHJhbCAqY2VudHJhbCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gY2VudHJhbC0+cHJvbV9ub2RlOwotCWNvbnN0IHZvaWQgKnB2YWw7Ci0JaW50IGxlbjsKLQkKLQljZW50cmFsLT5udW1fY2VudHJhbF9yYW5nZXMgPSAwOwotCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyYW5nZXMiLCAmbGVuKTsKLQlpZiAocHZhbCkgewotCQltZW1jcHkoY2VudHJhbC0+Y2VudHJhbF9yYW5nZXMsIHB2YWwsIGxlbik7Ci0JCWNlbnRyYWwtPm51bV9jZW50cmFsX3JhbmdlcyA9Ci0JCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmhjX3Jhbmdlc19pbml0KHN0cnVjdCBsaW51eF9maGMgKmZoYykKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZmhjLT5wcm9tX25vZGU7Ci0JY29uc3Qgdm9pZCAqcHZhbDsKLQlpbnQgbGVuOwotCQotCWZoYy0+bnVtX2ZoY19yYW5nZXMgPSAwOwotCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyYW5nZXMiLCAmbGVuKTsKLQlpZiAocHZhbCkgewotCQltZW1jcHkoZmhjLT5maGNfcmFuZ2VzLCBwdmFsLCBsZW4pOwotCQlmaGMtPm51bV9maGNfcmFuZ2VzID0KLQkJCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7Ci0JfQotfQotCi0vKiBSYW5nZSBhcHBsaWNhdGlvbiByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8gdmFyaW91cyBkcml2ZXJzLAotICogc28gZG8gbm90IF9faW5pdCB0aGlzLgotICovCi1zdGF0aWMgdm9pZCBhZGp1c3RfcmVncyhzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3AsIGludCBucmVncywKLQkJCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VwLCBpbnQgbnJhbmdlcykKLXsKLQlpbnQgcmVnYywgcm5nYzsKLQotCWZvciAocmVnYyA9IDA7IHJlZ2MgPCBucmVnczsgcmVnYysrKSB7Ci0JCWZvciAocm5nYyA9IDA7IHJuZ2MgPCBucmFuZ2VzOyBybmdjKyspCi0JCQlpZiAocmVncFtyZWdjXS53aGljaF9pbyA9PSByYW5nZXBbcm5nY10ub3RfY2hpbGRfc3BhY2UpCi0JCQkJYnJlYWs7IC8qIEZvdW50IGl0ICovCi0JCWlmIChybmdjID09IG5yYW5nZXMpIC8qIG9vcHMgKi8KLQkJCWNlbnRyYWxfcHJvYmVfZmFpbHVyZShfX0xJTkVfXyk7Ci0JCXJlZ3BbcmVnY10ud2hpY2hfaW8gPSByYW5nZXBbcm5nY10ub3RfcGFyZW50X3NwYWNlOwotCQlyZWdwW3JlZ2NdLnBoeXNfYWRkciAtPSByYW5nZXBbcm5nY10ub3RfY2hpbGRfYmFzZTsKLQkJcmVncFtyZWdjXS5waHlzX2FkZHIgKz0gcmFuZ2VwW3JuZ2NdLm90X3BhcmVudF9iYXNlOwotCX0KLX0KLQotLyogQXBwbHkgcHJvYmVkIGZoYyByYW5nZXMgdG8gcmVnaXN0ZXJzIHBhc3NlZCwgaWYgbm8gcmFuZ2VzIHJldHVybi4gKi8KLXN0YXRpYyB2b2lkIGFwcGx5X2ZoY19yYW5nZXMoc3RydWN0IGxpbnV4X2ZoYyAqZmhjLAotCQkJICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsCi0JCQkgICAgIGludCBucmVncykKLXsKLQlpZiAoZmhjLT5udW1fZmhjX3JhbmdlcykKLQkJYWRqdXN0X3JlZ3MocmVncywgbnJlZ3MsIGZoYy0+ZmhjX3JhbmdlcywKLQkJCSAgICBmaGMtPm51bV9maGNfcmFuZ2VzKTsKLX0KLQotLyogQXBwbHkgcHJvYmVkIGNlbnRyYWwgcmFuZ2VzIHRvIHJlZ2lzdGVycyBwYXNzZWQsIGlmIG5vIHJhbmdlcyByZXR1cm4uICovCi1zdGF0aWMgdm9pZCBhcHBseV9jZW50cmFsX3JhbmdlcyhzdHJ1Y3QgbGludXhfY2VudHJhbCAqY2VudHJhbCwKLQkJCQkgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzLCBpbnQgbnJlZ3MpCi17Ci0JaWYgKGNlbnRyYWwtPm51bV9jZW50cmFsX3JhbmdlcykKLQkJYWRqdXN0X3JlZ3MocmVncywgbnJlZ3MsIGNlbnRyYWwtPmNlbnRyYWxfcmFuZ2VzLAotCQkJICAgIGNlbnRyYWwtPm51bV9jZW50cmFsX3Jhbmdlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IGNlbnRyYWxfYWxsb2NfYm9vdG1lbSh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcmV0OwotCi0JcmV0ID0gX19hbGxvY19ib290bWVtKHNpemUsIFNNUF9DQUNIRV9CWVRFUywgMFVMKTsKLQlpZiAocmV0ICE9IE5VTEwpCi0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvbV9yZWdfdG9fcGFkZHIoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyKQotewotCXVuc2lnbmVkIGxvbmcgcmV0ID0gKCh1bnNpZ25lZCBsb25nKSByLT53aGljaF9pbykgPDwgMzI7Ci0KLQlyZXR1cm4gcmV0IHwgKHVuc2lnbmVkIGxvbmcpIHItPnBoeXNfYWRkcjsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHByb2JlX290aGVyX2ZoY3Modm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpmcHJlZ3M7Ci0KLQlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJmaGMiKSB7Ci0JCXN0cnVjdCBsaW51eF9maGMgKmZoYzsKLQkJaW50IGJvYXJkOwotCQl1MzIgdG1wOwotCi0JCWlmIChkcC0+cGFyZW50ICYmCi0JCSAgICBkcC0+cGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCi0JCWZoYyA9IChzdHJ1Y3QgbGludXhfZmhjICopCi0JCQljZW50cmFsX2FsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBsaW51eF9maGMpKTsKLQkJaWYgKGZoYyA9PSBOVUxMKQotCQkJY2VudHJhbF9wcm9iZV9mYWlsdXJlKF9fTElORV9fKTsKLQotCQkvKiBMaW5rIGl0IGludG8gdGhlIEZIQyBjaGFpbi4gKi8KLQkJZmhjLT5uZXh0ID0gZmhjX2xpc3Q7Ci0JCWZoY19saXN0ID0gZmhjOwotCi0JCS8qIFRvcGxldmVsIEZIQ3MgaGF2ZSBubyBwYXJlbnQuICovCi0JCWZoYy0+cGFyZW50ID0gTlVMTDsKLQkJCi0JCWZoYy0+cHJvbV9ub2RlID0gZHA7Ci0JCWZoY19yYW5nZXNfaW5pdChmaGMpOwotCi0JCS8qIE5vbi1jZW50cmFsIEZIQydzIGhhdmUgNjQtYml0IE9CUCBmb3JtYXQgcmVnaXN0ZXJzLiAqLwotCQlmcHJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKLQkJaWYgKCFmcHJlZ3MpCi0JCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwotCi0JCS8qIE9ubHkgY2VudHJhbCBGSEMgbmVlZHMgc3BlY2lhbCByYW5nZXMgYXBwbGllZC4gKi8KLQkJZmhjLT5maGNfcmVncy5wcmVncyA9IGZwcmVnc1swXS5waHlzX2FkZHI7Ci0JCWZoYy0+ZmhjX3JlZ3MuaXJlZyA9IGZwcmVnc1sxXS5waHlzX2FkZHI7Ci0JCWZoYy0+ZmhjX3JlZ3MuZmZyZWdzID0gZnByZWdzWzJdLnBoeXNfYWRkcjsKLQkJZmhjLT5maGNfcmVncy5zcmVncyA9IGZwcmVnc1szXS5waHlzX2FkZHI7Ci0JCWZoYy0+ZmhjX3JlZ3MudXJlZ3MgPSBmcHJlZ3NbNF0ucGh5c19hZGRyOwotCQlmaGMtPmZoY19yZWdzLnRyZWdzID0gZnByZWdzWzVdLnBoeXNfYWRkcjsKLQotCQlib2FyZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImJvYXJkIyIsIC0xKTsKLQkJZmhjLT5ib2FyZCA9IGJvYXJkOwotCi0JCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0pDVFJMKTsKLQkJaWYgKCh0bXAgJiBGSENfSlRBR19DVFJMX01FTkFCKSAhPSAwKQotCQkJZmhjLT5qdGFnX21hc3RlciA9IDE7Ci0JCWVsc2UKLQkJCWZoYy0+anRhZ19tYXN0ZXIgPSAwOwotCi0JCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0lEKTsKLQkJcHJpbnRrKCJGSEMoYm9hcmQgJWQpOiBWZXJzaW9uWyV4XSBQYXJ0SURbJXhdIE1hbnVmWyV4XSAlc1xuIiwKLQkJICAgICAgIGJvYXJkLAotCQkgICAgICAgKHRtcCAmIEZIQ19JRF9WRVJTKSA+PiAyOCwKLQkJICAgICAgICh0bXAgJiBGSENfSURfUEFSVElEKSA+PiAxMiwKLQkJICAgICAgICh0bXAgJiBGSENfSURfTUFOVUYpID4+IDEsCi0JCSAgICAgICAoZmhjLT5qdGFnX21hc3RlciA/ICIoSlRBRyBNYXN0ZXIpIiA6ICIiKSk7Ci0JCQotCQkvKiBUaGlzIGJpdCBtdXN0IGJlIHNldCBpbiBhbGwgbm9uLWNlbnRyYWwgRkhDJ3MgaW4KLQkJICogdGhlIHN5c3RlbS4gIFdoZW4gaXQgaXMgY2xlYXIsIHRoaXMgaWRlbnRpZmllcwotCQkgKiB0aGUgY2VudHJhbCBib2FyZC4KLQkJICovCi0JCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwotCQl0bXAgfD0gRkhDX0NPTlRST0xfSVhJU1Q7Ci0JCXVwYV93cml0ZWwodG1wLCBmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcHJvYmVfY2xvY2tfYm9hcmQoc3RydWN0IGxpbnV4X2NlbnRyYWwgKmNlbnRyYWwsCi0JCQkgICAgICBzdHJ1Y3QgbGludXhfZmhjICpmaGMsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZwKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGNyZWdzWzNdOwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHI7Ci0JaW50IG5zbG90cywgdG1wLCBucmVnczsKLQotCWRwID0gZnAtPmNoaWxkOwotCXdoaWxlIChkcCkgewotCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImNsb2NrLWJvYXJkIikpCi0JCQlicmVhazsKLQkJZHAgPSBkcC0+c2libGluZzsKLQl9Ci0JaWYgKCFkcCkKLQkJY2VudHJhbF9wcm9iZV9mYWlsdXJlKF9fTElORV9fKTsKLQotCXByID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJm5yZWdzKTsKLQlpZiAoIXByKQotCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwotCi0JbWVtY3B5KGNyZWdzLCBwciwgbnJlZ3MpOwotCW5yZWdzIC89IHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpOwotCi0JYXBwbHlfZmhjX3JhbmdlcyhmaGMsICZjcmVnc1swXSwgbnJlZ3MpOwotCWFwcGx5X2NlbnRyYWxfcmFuZ2VzKGNlbnRyYWwsICZjcmVnc1swXSwgbnJlZ3MpOwotCWNlbnRyYWwtPmNmcmVnID0gcHJvbV9yZWdfdG9fcGFkZHIoJmNyZWdzWzBdKTsKLQljZW50cmFsLT5jbGtyZWdzID0gcHJvbV9yZWdfdG9fcGFkZHIoJmNyZWdzWzFdKTsKLQotCWlmIChucmVncyA9PSAyKQotCQljZW50cmFsLT5jbGt2ZXIgPSAwVUw7Ci0JZWxzZQotCQljZW50cmFsLT5jbGt2ZXIgPSBwcm9tX3JlZ190b19wYWRkcigmY3JlZ3NbMl0pOwotCi0JdG1wID0gdXBhX3JlYWRiKGNlbnRyYWwtPmNsa3JlZ3MgKyBDTE9DS19TVEFUMSk7Ci0JdG1wICY9IDB4YzA7Ci0Jc3dpdGNoKHRtcCkgeworCXN3aXRjaCAocmVnKSB7CiAJY2FzZSAweDQwOgotCQluc2xvdHMgPSAxNjsKLQkJYnJlYWs7CisJCXJldHVybiAxNjsKKwogCWNhc2UgMHhjMDoKLQkJbnNsb3RzID0gODsKLQkJYnJlYWs7CisJCXJldHVybiA4OworCiAJY2FzZSAweDgwOgotCQlpZiAoY2VudHJhbC0+Y2xrdmVyICE9IDBVTCAmJgotCQkgICB1cGFfcmVhZGIoY2VudHJhbC0+Y2xrdmVyKSAhPSAwKSB7Ci0JCQlpZiAoKHVwYV9yZWFkYihjZW50cmFsLT5jbGt2ZXIpICYgMHg4MCkgIT0gMCkKLQkJCQluc2xvdHMgPSA0OworCQlyZWcgPSAwOworCQlpZiAocC0+Y2xvY2tfdmVyX3JlZykKKwkJCXJlZyA9IHVwYV9yZWFkYihwLT5jbG9ja192ZXJfcmVnKTsKKwkJaWYgKHJlZykgeworCQkJaWYgKHJlZyAmIDB4ODApCisJCQkJcmV0dXJuIDQ7CiAJCQllbHNlCi0JCQkJbnNsb3RzID0gNTsKLQkJCWJyZWFrOworCQkJCXJldHVybiA1OwogCQl9CisJCS8qIEZhbGx0aHJvdWdoICovCiAJZGVmYXVsdDoKLQkJbnNsb3RzID0gNDsKLQkJYnJlYWs7Ci0JfTsKLQljZW50cmFsLT5zbG90cyA9IG5zbG90czsKLQlwcmludGsoIkNFTlRSQUw6IERldGVjdGVkICVkIHNsb3QgRW50ZXJwcmlzZSBzeXN0ZW0uIGNmcmVnWyUwMnhdIGN2ZXJbJTAyeF1cbiIsCi0JICAgICAgIGNlbnRyYWwtPnNsb3RzLCB1cGFfcmVhZGIoY2VudHJhbC0+Y2ZyZWcpLAotCSAgICAgICAoY2VudHJhbC0+Y2xrdmVyID8gdXBhX3JlYWRiKGNlbnRyYWwtPmNsa3ZlcikgOiAweDAwKSk7CisJCXJldHVybiA0OworCX0KIH0KIAotc3RhdGljIHZvaWQgWkFQKHVuc2lnbmVkIGxvbmcgaWNsciwgdW5zaWduZWQgbG9uZyBpbWFwKQorc3RhdGljIGludCBfX2RldmluaXQgY2xvY2tfYm9hcmRfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXUzMiBpbWFwX3RtcDsKKwlzdHJ1Y3QgY2xvY2tfYm9hcmQgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWludCBlcnIgPSAtRU5PTUVNOwogCi0JdXBhX3dyaXRlbCgwLCBpY2xyKTsKLQl1cGFfcmVhZGwoaWNscik7Ci0JaW1hcF90bXAgPSB1cGFfcmVhZGwoaW1hcCk7Ci0JaW1hcF90bXAgJj0gfigweDgwMDAwMDAwKTsKLQl1cGFfd3JpdGVsKGltYXBfdG1wLCBpbWFwKTsKLQl1cGFfcmVhZGwoaW1hcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfYWxsX2ZoY19odyh2b2lkKQotewotCXN0cnVjdCBsaW51eF9maGMgKmZoYzsKLQotCWZvciAoZmhjID0gZmhjX2xpc3Q7IGZoYyAhPSBOVUxMOyBmaGMgPSBmaGMtPm5leHQpIHsKLQkJdTMyIHRtcDsKLQotCQkvKiBDbGVhciBhbGwgb2YgdGhlIGludGVycnVwdCBtYXBwaW5nIHJlZ2lzdGVycwotCQkgKiBqdXN0IGluIGNhc2UgT0JQIGxlZnQgdGhlbSBpbiBhIGZvdWwgc3RhdGUuCi0JCSAqLwotCQlaQVAoZmhjLT5maGNfcmVncy5mZnJlZ3MgKyBGSENfRkZSRUdTX0lDTFIsCi0JCSAgICBmaGMtPmZoY19yZWdzLmZmcmVncyArIEZIQ19GRlJFR1NfSU1BUCk7Ci0JCVpBUChmaGMtPmZoY19yZWdzLnNyZWdzICsgRkhDX1NSRUdTX0lDTFIsCi0JCSAgICBmaGMtPmZoY19yZWdzLnNyZWdzICsgRkhDX1NSRUdTX0lNQVApOwotCQlaQVAoZmhjLT5maGNfcmVncy51cmVncyArIEZIQ19VUkVHU19JQ0xSLAotCQkgICAgZmhjLT5maGNfcmVncy51cmVncyArIEZIQ19VUkVHU19JTUFQKTsKLQkJWkFQKGZoYy0+ZmhjX3JlZ3MudHJlZ3MgKyBGSENfVFJFR1NfSUNMUiwKLQkJICAgIGZoYy0+ZmhjX3JlZ3MudHJlZ3MgKyBGSENfVFJFR1NfSU1BUCk7Ci0KLQkJLyogU2V0dXAgRkhDIGNvbnRyb2wgcmVnaXN0ZXIuICovCi0JCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwotCi0JCS8qIEFsbCBub24tY2VudHJhbCBib2FyZHMgaGF2ZSB0aGlzIGJpdCBzZXQuICovCi0JCWlmICghIElTX0NFTlRSQUxfRkhDKGZoYykpCi0JCQl0bXAgfD0gRkhDX0NPTlRST0xfSVhJU1Q7Ci0KLQkJLyogRm9yIGFsbCBGSENzLCBjbGVhciB0aGUgZmlybXdhcmUgc3luY2hyb25pemF0aW9uCi0JCSAqIGxpbmUgYW5kIGJvdGggbG93IHBvd2VyIG1vZGUgZW5hYmxlcy4KLQkJICovCi0JCXRtcCAmPSB+KEZIQ19DT05UUk9MX0FPRkYgfCBGSENfQ09OVFJPTF9CT0ZGIHwKLQkJCSBGSENfQ09OVFJPTF9TTElORSk7Ci0KLQkJdXBhX3dyaXRlbCh0bXAsIGZoYy0+ZmhjX3JlZ3MucHJlZ3MgKyBGSENfUFJFR1NfQ1RSTCk7Ci0JCXVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOworCWlmICghcCkgeworCQlwcmludGsoS0VSTl9FUlIgImNsb2NrX2JvYXJkOiBDYW5ub3QgYWxsb2NhdGUgc3RydWN0IGNsb2NrX2JvYXJkXG4iKTsKKwkJZ290byBvdXQ7CiAJfQogCi19Ci0KLXZvaWQgX19pbml0IGNlbnRyYWxfcHJvYmUodm9pZCkKLXsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgZnByZWdzWzZdOwotCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHI7Ci0Jc3RydWN0IGxpbnV4X2ZoYyAqZmhjOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsICpmcDsKLQlpbnQgZXJyOwotCi0JZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY2VudHJhbCIpOwotCWlmICghZHApIHsKLQkJaWYgKHRoaXNfaXNfc3RhcmZpcmUpCi0JCQlzdGFyZmlyZV9jcHVfc2V0dXAoKTsKLQkJcmV0dXJuOworCXAtPmNsb2NrX2ZyZXFfcmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkJcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSwKKwkJCQkJImNsb2NrX2JvYXJkX2ZyZXEiKTsKKwlpZiAoIXAtPmNsb2NrX2ZyZXFfcmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImNsb2NrX2JvYXJkOiBDYW5ub3QgbWFwIGNsb2NrX2ZyZXFfcmVnc1xuIik7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JLyogT2sgd2UgZ290IG9uZSwgZ3JhYiBzb21lIG1lbW9yeSBmb3Igc29mdHdhcmUgc3RhdGUuICovCi0JY2VudHJhbF9idXMgPSAoc3RydWN0IGxpbnV4X2NlbnRyYWwgKikKLQkJY2VudHJhbF9hbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgbGludXhfY2VudHJhbCkpOwotCWlmIChjZW50cmFsX2J1cyA9PSBOVUxMKQotCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwotCi0JZmhjID0gKHN0cnVjdCBsaW51eF9maGMgKikKLQkJY2VudHJhbF9hbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgbGludXhfZmhjKSk7Ci0JaWYgKGZoYyA9PSBOVUxMKQotCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwotCi0JLyogRmlyc3QgaW5pdCBjZW50cmFsLiAqLwotCWNlbnRyYWxfYnVzLT5jaGlsZCA9IGZoYzsKLQljZW50cmFsX2J1cy0+cHJvbV9ub2RlID0gZHA7Ci0JY2VudHJhbF9yYW5nZXNfaW5pdChjZW50cmFsX2J1cyk7Ci0KLQkvKiBBbmQgdGhlbiBjZW50cmFsJ3MgRkhDLiAqLwotCWZoYy0+bmV4dCA9IGZoY19saXN0OwotCWZoY19saXN0ID0gZmhjOwotCi0JZmhjLT5wYXJlbnQgPSBjZW50cmFsX2J1czsKLQlmcCA9IGRwLT5jaGlsZDsKLQl3aGlsZSAoZnApIHsKLQkJaWYgKCFzdHJjbXAoZnAtPm5hbWUsICJmaGMiKSkKLQkJCWJyZWFrOwotCQlmcCA9IGZwLT5zaWJsaW5nOworCXAtPmNsb2NrX3JlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsCisJCQkJICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzFdKSwKKwkJCQkgICAiY2xvY2tfYm9hcmRfcmVncyIpOworCWlmICghcC0+Y2xvY2tfcmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImNsb2NrX2JvYXJkOiBDYW5ub3QgbWFwIGNsb2NrX3JlZ3NcbiIpOworCQlnb3RvIG91dF91bm1hcF9jbG9ja19mcmVxX3JlZ3M7CiAJfQotCWlmICghZnApCi0JCWNlbnRyYWxfcHJvYmVfZmFpbHVyZShfX0xJTkVfXyk7CiAKLQlmaGMtPnByb21fbm9kZSA9IGZwOwotCWZoY19yYW5nZXNfaW5pdChmaGMpOworCWlmIChvcC0+cmVzb3VyY2VbMl0uZmxhZ3MpIHsKKwkJcC0+Y2xvY2tfdmVyX3JlZyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsyXSwgMCwKKwkJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzJdKSwKKwkJCQkJICAgICAgImNsb2NrX3Zlcl9yZWciKTsKKwkJaWYgKCFwLT5jbG9ja192ZXJfcmVnKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNsb2NrX2JvYXJkOiBDYW5ub3QgbWFwIGNsb2NrX3Zlcl9yZWdcbiIpOworCQkJZ290byBvdXRfdW5tYXBfY2xvY2tfcmVnczsKKwkJfQorCX0KIAotCS8qIE5vdywgbWFwIGluIEZIQyByZWdpc3RlciBzZXQuICovCi0JcHIgPSBvZl9nZXRfcHJvcGVydHkoZnAsICJyZWciLCBOVUxMKTsKLQlpZiAoIXByKQotCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwotCW1lbWNweShmcHJlZ3MsIHByLCBzaXplb2YoZnByZWdzKSk7CisJcC0+bnVtX3Nsb3RzID0gY2xvY2tfYm9hcmRfY2FsY19uc2xvdHMocCk7CiAKLQlhcHBseV9jZW50cmFsX3JhbmdlcyhjZW50cmFsX2J1cywgJmZwcmVnc1swXSwgNik7Ci0JCi0JZmhjLT5maGNfcmVncy5wcmVncyA9IHByb21fcmVnX3RvX3BhZGRyKCZmcHJlZ3NbMF0pOwotCWZoYy0+ZmhjX3JlZ3MuaXJlZyA9IHByb21fcmVnX3RvX3BhZGRyKCZmcHJlZ3NbMV0pOwotCWZoYy0+ZmhjX3JlZ3MuZmZyZWdzID0gcHJvbV9yZWdfdG9fcGFkZHIoJmZwcmVnc1syXSk7Ci0JZmhjLT5maGNfcmVncy5zcmVncyA9IHByb21fcmVnX3RvX3BhZGRyKCZmcHJlZ3NbM10pOwotCWZoYy0+ZmhjX3JlZ3MudXJlZ3MgPSBwcm9tX3JlZ190b19wYWRkcigmZnByZWdzWzRdKTsKLQlmaGMtPmZoY19yZWdzLnRyZWdzID0gcHJvbV9yZWdfdG9fcGFkZHIoJmZwcmVnc1s1XSk7CisJcC0+bGVkc19yZXNvdXJjZS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKQorCQkocC0+Y2xvY2tfcmVncyArIENMT0NLX0NUUkwpOworCXAtPmxlZHNfcmVzb3VyY2UuZW5kID0gcC0+bGVkc19yZXNvdXJjZS5lbmQ7CisJcC0+bGVkc19yZXNvdXJjZS5uYW1lID0gImxlZHMiOwogCi0JLyogT2J0YWluIGJvYXJkIG51bWJlciBmcm9tIGJvYXJkIHN0YXR1cyByZWdpc3RlciwgQ2VudHJhbCdzCi0JICogRkhDIGxhY2tzICJib2FyZCMiIHByb3BlcnR5LgotCSAqLwotCWVyciA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0JTUik7Ci0JZmhjLT5ib2FyZCA9ICgoKGVyciA+PiAxNikgJiAweDAxKSB8Ci0JCSAgICAgICgoZXJyID4+IDEyKSAmIDB4MGUpKTsKKwlwLT5sZWRzX3BkZXYubmFtZSA9ICJzdW5maXJlLWNsb2NrYm9hcmQtbGVkcyI7CisJcC0+bGVkc19wZGV2LnJlc291cmNlID0gJnAtPmxlZHNfcmVzb3VyY2U7CisJcC0+bGVkc19wZGV2Lm51bV9yZXNvdXJjZXMgPSAxOworCXAtPmxlZHNfcGRldi5kZXYucGFyZW50ID0gJm9wLT5kZXY7CiAKLQlmaGMtPmp0YWdfbWFzdGVyID0gMDsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnAtPmxlZHNfcGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImNsb2NrX2JvYXJkOiBDb3VsZCBub3QgcmVnaXN0ZXIgTEVEUyAiCisJCSAgICAgICAicGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJZ290byBvdXRfdW5tYXBfY2xvY2tfdmVyX3JlZzsKKwl9CiAKLQkvKiBBdHRhY2ggdGhlIGNsb2NrIGJvYXJkIHJlZ2lzdGVycyBmb3IgQ0VOVFJBTC4gKi8KLQlwcm9iZV9jbG9ja19ib2FyZChjZW50cmFsX2J1cywgZmhjLCBmcCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY2xvY2tfYm9hcmQ6IERldGVjdGVkICVkIHNsb3QgRW50ZXJwcmlzZSBzeXN0ZW0uXG4iLAorCSAgICAgICBwLT5udW1fc2xvdHMpOwogCi0JZXJyID0gdXBhX3JlYWRsKGZoYy0+ZmhjX3JlZ3MucHJlZ3MgKyBGSENfUFJFR1NfSUQpOwotCXByaW50aygiRkhDKGJvYXJkICVkKTogVmVyc2lvblsleF0gUGFydElEWyV4XSBNYW51ZlsleF0gKENFTlRSQUwpXG4iLAotCSAgICAgICBmaGMtPmJvYXJkLAotCSAgICAgICAoKGVyciAmIEZIQ19JRF9WRVJTKSA+PiAyOCksCi0JICAgICAgICgoZXJyICYgRkhDX0lEX1BBUlRJRCkgPj4gMTIpLAotCSAgICAgICAoKGVyciAmIEZIQ19JRF9NQU5VRikgPj4gMSkpOworCWVyciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKIAotCXByb2JlX290aGVyX2ZoY3MoKTsKK291dF91bm1hcF9jbG9ja192ZXJfcmVnOgorCWlmIChwLT5jbG9ja192ZXJfcmVnKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMl0sIHAtPmNsb2NrX3Zlcl9yZWcsCisJCQkgICByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMl0pKTsKIAotCWluaXRfYWxsX2ZoY19odygpOworb3V0X3VubWFwX2Nsb2NrX3JlZ3M6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzFdLCBwLT5jbG9ja19yZWdzLAorCQkgICByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMV0pKTsKKworb3V0X3VubWFwX2Nsb2NrX2ZyZXFfcmVnczoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPmNsb2NrX2ZyZXFfcmVncywKKwkJICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSk7CisKK291dF9mcmVlOgorCWtmcmVlKHApOworCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmhjX2xlZGJsaW5rKHN0cnVjdCBsaW51eF9maGMgKmZoYywgaW50IG9uKQorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBjbG9ja19ib2FyZF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiY2xvY2stYm9hcmQiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBjbG9ja19ib2FyZF9kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlCT0gY2xvY2tfYm9hcmRfbWF0Y2gsCisJLnByb2JlCQk9IGNsb2NrX2JvYXJkX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJjbG9ja19ib2FyZCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZoY19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQl1MzIgdG1wOworCXN0cnVjdCBmaGMgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWludCBlcnIgPSAtRU5PTUVNOworCXUzMiByZWc7CiAKLQl0bXAgPSB1cGFfcmVhZGwoZmhjLT5maGNfcmVncy5wcmVncyArIEZIQ19QUkVHU19DVFJMKTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmaGM6IENhbm5vdCBhbGxvY2F0ZSBzdHJ1Y3QgZmhjXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCi0JLyogTk9URTogcmV2ZXJzZSBsb2dpYyBvbiB0aGlzIGJpdCAqLwotCWlmIChvbikKLQkJdG1wICY9IH4oRkhDX0NPTlRST0xfUkxFRCk7Ci0JZWxzZQotCQl0bXAgfD0gRkhDX0NPTlRST0xfUkxFRDsKLQl0bXAgJj0gfihGSENfQ09OVFJPTF9BT0ZGIHwgRkhDX0NPTlRST0xfQk9GRiB8IEZIQ19DT05UUk9MX1NMSU5FKTsKKwlpZiAoIXN0cmNtcChvcC0+bm9kZS0+cGFyZW50LT5uYW1lLCAiY2VudHJhbCIpKQorCQlwLT5jZW50cmFsID0gdHJ1ZTsKIAotCXVwYV93cml0ZWwodG1wLCBmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwotCXVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOworCXAtPnByZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJICAgICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSwKKwkJCSAgICAgICJmaGNfcHJlZ3MiKTsKKwlpZiAoIXAtPnByZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmhjOiBDYW5ub3QgbWFwIHByZWdzXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAocC0+Y2VudHJhbCkgeworCQlyZWcgPSB1cGFfcmVhZGwocC0+cHJlZ3MgKyBGSENfUFJFR1NfQlNSKTsKKwkJcC0+Ym9hcmRfbnVtID0gKChyZWcgPj4gMTYpICYgMSkgfCAoKHJlZyA+PiAxMikgJiAweDBlKTsKKwl9IGVsc2UgeworCQlwLT5ib2FyZF9udW0gPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQob3AtPm5vZGUsICJib2FyZCMiLCAtMSk7CisJCWlmIChwLT5ib2FyZF9udW0gPT0gLTEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZmhjOiBObyBib2FyZCMgcHJvcGVydHlcbiIpOworCQkJZ290byBvdXRfdW5tYXBfcHJlZ3M7CisJCX0KKwkJaWYgKHVwYV9yZWFkbChwLT5wcmVncyArIEZIQ19QUkVHU19KQ1RSTCkgJiBGSENfSlRBR19DVFJMX01FTkFCKQorCQkJcC0+anRhZ19tYXN0ZXIgPSB0cnVlOworCX0KKworCWlmICghcC0+Y2VudHJhbCkgeworCQlwLT5sZWRzX3Jlc291cmNlLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpCisJCQkocC0+cHJlZ3MgKyBGSENfUFJFR1NfQ1RSTCk7CisJCXAtPmxlZHNfcmVzb3VyY2UuZW5kID0gcC0+bGVkc19yZXNvdXJjZS5lbmQ7CisJCXAtPmxlZHNfcmVzb3VyY2UubmFtZSA9ICJsZWRzIjsKKworCQlwLT5sZWRzX3BkZXYubmFtZSA9ICJzdW5maXJlLWZoYy1sZWRzIjsKKwkJcC0+bGVkc19wZGV2LnJlc291cmNlID0gJnAtPmxlZHNfcmVzb3VyY2U7CisJCXAtPmxlZHNfcGRldi5udW1fcmVzb3VyY2VzID0gMTsKKwkJcC0+bGVkc19wZGV2LmRldi5wYXJlbnQgPSAmb3AtPmRldjsKKworCQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnAtPmxlZHNfcGRldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZmhjOiBDb3VsZCBub3QgcmVnaXN0ZXIgTEVEUyAiCisJCQkgICAgICAgInBsYXRmb3JtIGRldmljZVxuIik7CisJCQlnb3RvIG91dF91bm1hcF9wcmVnczsKKwkJfQorCX0KKwlyZWcgPSB1cGFfcmVhZGwocC0+cHJlZ3MgKyBGSENfUFJFR1NfQ1RSTCk7CisKKwlpZiAoIXAtPmNlbnRyYWwpCisJCXJlZyB8PSBGSENfQ09OVFJPTF9JWElTVDsKKworCXJlZyAmPSB+KEZIQ19DT05UUk9MX0FPRkYgfAorCQkgRkhDX0NPTlRST0xfQk9GRiB8CisJCSBGSENfQ09OVFJPTF9TTElORSk7CisKKwl1cGFfd3JpdGVsKHJlZywgcC0+cHJlZ3MgKyBGSENfUFJFR1NfQ1RSTCk7CisJdXBhX3JlYWRsKHAtPnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOworCisJcmVnID0gdXBhX3JlYWRsKHAtPnByZWdzICsgRkhDX1BSRUdTX0lEKTsKKwlwcmludGsoS0VSTl9JTkZPICJmaGM6IEJvYXJkICMlZCwgVmVyc2lvblsleF0gUGFydElEWyV4XSBNYW51ZlsleF0gJXNcbiIsCisJICAgICAgIHAtPmJvYXJkX251bSwKKwkgICAgICAgKHJlZyAmIEZIQ19JRF9WRVJTKSA+PiAyOCwKKwkgICAgICAgKHJlZyAmIEZIQ19JRF9QQVJUSUQpID4+IDEyLAorCSAgICAgICAocmVnICYgRkhDX0lEX01BTlVGKSA+PiAxLAorCSAgICAgICAocC0+anRhZ19tYXN0ZXIgPworCQkiKEpUQUcgTWFzdGVyKSIgOgorCQkocC0+Y2VudHJhbCA/ICIoQ2VudHJhbCkiIDogIiIpKSk7CisKKwllcnIgPSAwOworCitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X3VubWFwX3ByZWdzOgorCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcC0+cHJlZ3MsIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSkpOworCitvdXRfZnJlZToKKwlrZnJlZShwKTsKKwlnb3RvIG91dDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNlbnRyYWxfbGVkYmxpbmsoc3RydWN0IGxpbnV4X2NlbnRyYWwgKmNlbnRyYWwsIGludCBvbikKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgZmhjX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJmaGMiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmaGNfZHJpdmVyID0geworCS5tYXRjaF90YWJsZQk9IGZoY19tYXRjaCwKKwkucHJvYmUJCT0gZmhjX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJmaGMiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdW5maXJlX2luaXQodm9pZCkKIHsKLQl1OCB0bXA7Ci0KLQl0bXAgPSB1cGFfcmVhZGIoY2VudHJhbC0+Y2xrcmVncyArIENMT0NLX0NUUkwpOwotCi0JLyogTk9URTogcmV2ZXJzZSBsb2dpYyBvbiB0aGlzIGJpdCAqLwotCWlmIChvbikKLQkJdG1wICY9IH4oQ0xPQ0tfQ1RSTF9STEVEKTsKLQllbHNlCi0JCXRtcCB8PSBDTE9DS19DVFJMX1JMRUQ7Ci0KLQl1cGFfd3JpdGViKHRtcCwgY2VudHJhbC0+Y2xrcmVncyArIENMT0NLX0NUUkwpOwotCXVwYV9yZWFkYihjZW50cmFsLT5jbGtyZWdzICsgQ0xPQ0tfQ1RSTCk7CisJKHZvaWQpIG9mX3JlZ2lzdGVyX2RyaXZlcigmZmhjX2RyaXZlciwgJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKKwkodm9pZCkgb2ZfcmVnaXN0ZXJfZHJpdmVyKCZjbG9ja19ib2FyZF9kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzZnRpbWVyOwotc3RhdGljIGludCBsZWRfc3RhdGU7Ci0KLXN0YXRpYyB2b2lkIHN1bmZpcmVfdGltZXIodW5zaWduZWQgbG9uZyBfX2lnbm9yZWQpCi17Ci0Jc3RydWN0IGxpbnV4X2ZoYyAqZmhjOwotCi0JY2VudHJhbF9sZWRibGluayhjZW50cmFsX2J1cywgbGVkX3N0YXRlKTsKLQlmb3IgKGZoYyA9IGZoY19saXN0OyBmaGMgIT0gTlVMTDsgZmhjID0gZmhjLT5uZXh0KQotCQlpZiAoISBJU19DRU5UUkFMX0ZIQyhmaGMpKQotCQkJZmhjX2xlZGJsaW5rKGZoYywgbGVkX3N0YXRlKTsKLQlsZWRfc3RhdGUgPSAhIGxlZF9zdGF0ZTsKLQlzZnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaID4+IDEpOwotCWFkZF90aW1lcigmc2Z0aW1lcik7Ci19Ci0KLS8qIEFmdGVyIFBDSS9TQlVTIGJ1c3NlcyBoYXZlIGJlZW4gcHJvYmVkLCB0aGlzIGlzIGNhbGxlZCB0byBwZXJmb3JtCi0gKiBmaW5hbCBpbml0aWFsaXphdGlvbiBvZiBhbGwgRmlyZUhvc2UgQ29udHJvbGxlcnMgaW4gdGhlIHN5c3RlbS4KLSAqLwotdm9pZCBmaXJldHJ1Y2tfaW5pdCh2b2lkKQotewotCXN0cnVjdCBsaW51eF9jZW50cmFsICpjZW50cmFsID0gY2VudHJhbF9idXM7Ci0JdTggY3RybDsKLQotCS8qIE5vIGNlbnRyYWwgYnVzLCBub3RoaW5nIHRvIGRvLiAqLwotCWlmIChjZW50cmFsID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIE9CUCBsZWF2ZXMgaXQgb24sIHR1cm4gaXQgb2ZmIHNvIGNsb2NrIGJvYXJkIHRpbWVyIExFRAotCSAqIGlzIGluIHN5bmMgd2l0aCBGSEMgb25lcy4KLQkgKi8KLQljdHJsID0gdXBhX3JlYWRiKGNlbnRyYWwtPmNsa3JlZ3MgKyBDTE9DS19DVFJMKTsKLQljdHJsICY9IH4oQ0xPQ0tfQ1RSTF9STEVEKTsKLQl1cGFfd3JpdGViKGN0cmwsIGNlbnRyYWwtPmNsa3JlZ3MgKyBDTE9DS19DVFJMKTsKLQotCWxlZF9zdGF0ZSA9IDA7Ci0JaW5pdF90aW1lcigmc2Z0aW1lcik7Ci0Jc2Z0aW1lci5kYXRhID0gMDsKLQlzZnRpbWVyLmZ1bmN0aW9uID0gJnN1bmZpcmVfdGltZXI7Ci0Jc2Z0aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiA+PiAxKTsKLQlhZGRfdGltZXIoJnNmdGltZXIpOwotfQorc3Vic3lzX2luaXRjYWxsKHN1bmZpcmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2NobWMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jCmluZGV4IDZkNGYwMmUuLjNiOWY0ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jCkBAIC0xLDYgKzEsNiBAQAotLyogbWVtY3RybHIuYzogRHJpdmVyIGZvciBVbHRyYVNQQVJDLUlJSSBtZW1vcnkgY29udHJvbGxlci4KKy8qIGNobWMuYzogRHJpdmVyIGZvciBVbHRyYVNQQVJDLUlJSSBtZW1vcnkgY29udHJvbGxlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMyw0NSArMTMsNjQgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgogI2luY2x1ZGUgPGFzbS9jaG1jdHJsLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9oZWFkLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21lbWN0cmwuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJjaG1jIgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIwLjIiCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVWx0cmFTUEFSQy1JSUkgbWVtb3J5IGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdGF0aWMgaW50IG1jX3R5cGU7CisjZGVmaW5lIE1DX1RZUEVfU0FGQVJJCQkxCisjZGVmaW5lIE1DX1RZUEVfSkJVUwkJMgorCitzdGF0aWMgZGltbV9wcmludGVyX3QgdXMzbWNfZGltbV9wcmludGVyOwogCiAjZGVmaW5lIENITUNUUkxfTkRHUlBTCTIKICNkZWZpbmUgQ0hNQ1RSTF9ORElNTVMJNAogCi0jZGVmaW5lIERJTU1TX1BFUl9NQwkoQ0hNQ1RSTF9OREdSUFMgKiBDSE1DVFJMX05ESU1NUykKKyNkZWZpbmUgQ0hNQ19ESU1NU19QRVJfTUMJKENITUNUUkxfTkRHUlBTICogQ0hNQ1RSTF9ORElNTVMpCiAKIC8qIE9CUCBtZW1vcnktbGF5b3V0IHByb3BlcnR5IGZvcm1hdC4gKi8KLXN0cnVjdCBvYnBfbWFwIHsKK3N0cnVjdCBjaG1jX29icF9tYXAgewogCXVuc2lnbmVkIGNoYXIJZGltbV9tYXBbMTQ0XTsKIAl1bnNpZ25lZCBjaGFyCXBpbl9tYXBbNTc2XTsKIH07CiAKICNkZWZpbmUgRElNTV9MQUJFTF9TWgk4CiAKLXN0cnVjdCBvYnBfbWVtX2xheW91dCB7CitzdHJ1Y3QgY2htY19vYnBfbWVtX2xheW91dCB7CiAJLyogT25lIG1heCA4LWJ5dGUgc3RyaW5nIGxhYmVsIHBlciBESU1NLiAgVXN1YWxseQogCSAqIHRoaXMgbWF0Y2hlcyB0aGUgbGFiZWwgb24gdGhlIG1vdGhlcmJvYXJkIHdoZXJlCiAJICogdGhhdCBESU1NIHJlc2lkZXMuCiAJICovCi0JY2hhcgkJZGltbV9sYWJlbHNbRElNTVNfUEVSX01DXVtESU1NX0xBQkVMX1NaXTsKKwljaGFyCQkJZGltbV9sYWJlbHNbQ0hNQ19ESU1NU19QRVJfTUNdW0RJTU1fTEFCRUxfU1pdOwogCiAJLyogSWYgc3ltbWV0cmljIHVzZSBtYXBbMF0sIGVsc2UgaXQgaXMKIAkgKiBhc3ltbWV0cmljIGFuZCBtYXBbMV0gc2hvdWxkIGJlIHVzZWQuCiAJICovCi0JY2hhcgkJc3ltbWV0cmljOworCWNoYXIJCQlzeW1tZXRyaWM7CiAKLQlzdHJ1Y3Qgb2JwX21hcAltYXBbMl07CisJc3RydWN0IGNobWNfb2JwX21hcAltYXBbMl07CiB9OwogCiAjZGVmaW5lIENITUNUUkxfTkJBTktTCTQKIAotc3RydWN0IGJhbmtfaW5mbyB7Ci0Jc3RydWN0IG1jdHJsX2luZm8JKm1wOworc3RydWN0IGNobWNfYmFua19pbmZvIHsKKwlzdHJ1Y3QgY2htYwkJKnA7CiAJaW50CQkJYmFua19pZDsKIAogCXU2NAkJCXJhd19yZWc7CkBAIC02NSwyOCArODQsNDA2IEBACiAJdW5zaWduZWQgbG9uZwkJc2l6ZTsKIH07CiAKLXN0cnVjdCBtY3RybF9pbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JaW50CQkJcG9ydGlkOworc3RydWN0IGNobWMgeworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CisJaW50CQkJCXBvcnRpZDsKIAotCXN0cnVjdCBvYnBfbWVtX2xheW91dAlsYXlvdXRfcHJvcDsKLQlpbnQJCQlsYXlvdXRfc2l6ZTsKKwlzdHJ1Y3QgY2htY19vYnBfbWVtX2xheW91dAlsYXlvdXRfcHJvcDsKKwlpbnQJCQkJbGF5b3V0X3NpemU7CiAKLQl2b2lkIF9faW9tZW0JCSpyZWdzOworCXZvaWQgX19pb21lbQkJCSpyZWdzOwogCi0JdTY0CQkJdGltaW5nX2NvbnRyb2wxOwotCXU2NAkJCXRpbWluZ19jb250cm9sMjsKLQl1NjQJCQl0aW1pbmdfY29udHJvbDM7Ci0JdTY0CQkJdGltaW5nX2NvbnRyb2w0OwotCXU2NAkJCW1lbWFkZHJfY29udHJvbDsKKwl1NjQJCQkJdGltaW5nX2NvbnRyb2wxOworCXU2NAkJCQl0aW1pbmdfY29udHJvbDI7CisJdTY0CQkJCXRpbWluZ19jb250cm9sMzsKKwl1NjQJCQkJdGltaW5nX2NvbnRyb2w0OworCXU2NAkJCQltZW1hZGRyX2NvbnRyb2w7CiAKLQlzdHJ1Y3QgYmFua19pbmZvCWxvZ2ljYWxfYmFua3NbQ0hNQ1RSTF9OQkFOS1NdOworCXN0cnVjdCBjaG1jX2JhbmtfaW5mbwkJbG9naWNhbF9iYW5rc1tDSE1DVFJMX05CQU5LU107CiB9OwogCisjZGVmaW5lIEpCVVNNQ19SRUdTX1NJWkUJCTgKKworI2RlZmluZSBKQl9NQ19SRUcxX0RJTU0yX0JBTkszCQkweDgwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBKQl9NQ19SRUcxX0RJTU0xX0JBTksxCQkweDQwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBKQl9NQ19SRUcxX0RJTU0yX0JBTksyCQkweDIwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBKQl9NQ19SRUcxX0RJTU0xX0JBTkswCQkweDEwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBKQl9NQ19SRUcxX1hPUgkJCTB4MDAwMDAxMDAwMDAwMDAwMFVMCisjZGVmaW5lIEpCX01DX1JFRzFfQUREUl9HRU5fMgkJMHgwMDAwMDBlMDAwMDAwMDAwVUwKKyNkZWZpbmUgSkJfTUNfUkVHMV9BRERSX0dFTl8yX1NISUZUCTM3CisjZGVmaW5lIEpCX01DX1JFRzFfQUREUl9HRU5fMQkJMHgwMDAwMDAxYzAwMDAwMDAwVUwKKyNkZWZpbmUgSkJfTUNfUkVHMV9BRERSX0dFTl8xX1NISUZUCTM0CisjZGVmaW5lIEpCX01DX1JFRzFfSU5URVJMRUFWRQkJMHgwMDAwMDAwMDAxODAwMDAwVUwKKyNkZWZpbmUgSkJfTUNfUkVHMV9JTlRFUkxFQVZFX1NISUZUCTIzCisjZGVmaW5lIEpCX01DX1JFRzFfRElNTTJfUFRZUEUJCTB4MDAwMDAwMDAwMDIwMDAwMFVMCisjZGVmaW5lIEpCX01DX1JFRzFfRElNTTJfUFRZUEVfU0hJRlQJMjEKKyNkZWZpbmUgSkJfTUNfUkVHMV9ESU1NMV9QVFlQRQkJMHgwMDAwMDAwMDAwMTAwMDAwVUwKKyNkZWZpbmUgSkJfTUNfUkVHMV9ESU1NMV9QVFlQRV9TSElGVAkyMAorCisjZGVmaW5lIFBBUlRfVFlQRV9YOAkJMAorI2RlZmluZSBQQVJUX1RZUEVfWDQJCTEKKworI2RlZmluZSBJTlRFUkxFQVZFX05PTkUJCTAKKyNkZWZpbmUgSU5URVJMRUFWRV9TQU1FCQkxCisjZGVmaW5lIElOVEVSTEVBVkVfSU5URVJOQUwJMgorI2RlZmluZSBJTlRFUkxFQVZFX0JPVEgJCTMKKworI2RlZmluZSBBRERSX0dFTl8xMjhNQgkJMAorI2RlZmluZSBBRERSX0dFTl8yNTZNQgkJMQorI2RlZmluZSBBRERSX0dFTl81MTJNQgkJMgorI2RlZmluZSBBRERSX0dFTl8xR0IJCTMKKworI2RlZmluZSBKQl9OVU1fRElNTV9HUk9VUFMJMgorI2RlZmluZSBKQl9OVU1fRElNTVNfUEVSX0dST1VQCTIKKyNkZWZpbmUgSkJfTlVNX0RJTU1TCQkoSkJfTlVNX0RJTU1fR1JPVVBTICogSkJfTlVNX0RJTU1TX1BFUl9HUk9VUCkKKworc3RydWN0IGpidXNtY19vYnBfbWFwIHsKKwl1bnNpZ25lZCBjaGFyCWRpbW1fbWFwWzE4XTsKKwl1bnNpZ25lZCBjaGFyCXBpbl9tYXBbMTQ0XTsKK307CisKK3N0cnVjdCBqYnVzbWNfb2JwX21lbV9sYXlvdXQgeworCS8qIE9uZSBtYXggOC1ieXRlIHN0cmluZyBsYWJlbCBwZXIgRElNTS4gIFVzdWFsbHkKKwkgKiB0aGlzIG1hdGNoZXMgdGhlIGxhYmVsIG9uIHRoZSBtb3RoZXJib2FyZCB3aGVyZQorCSAqIHRoYXQgRElNTSByZXNpZGVzLgorCSAqLworCWNoYXIJCWRpbW1fbGFiZWxzW0pCX05VTV9ESU1NU11bRElNTV9MQUJFTF9TWl07CisKKwkvKiBJZiBzeW1tZXRyaWMgdXNlIG1hcFswXSwgZWxzZSBpdCBpcworCSAqIGFzeW1tZXRyaWMgYW5kIG1hcFsxXSBzaG91bGQgYmUgdXNlZC4KKwkgKi8KKwljaGFyCQkJc3ltbWV0cmljOworCisJc3RydWN0IGpidXNtY19vYnBfbWFwCW1hcDsKKworCWNoYXIJCQlfcGFkOworfTsKKworc3RydWN0IGpidXNtY19kaW1tX2dyb3VwIHsKKwlzdHJ1Y3QgamJ1c21jCQkJKmNvbnRyb2xsZXI7CisJaW50CQkJCWluZGV4OworCXU2NAkJCQliYXNlX2FkZHI7CisJdTY0CQkJCXNpemU7Cit9OworCitzdHJ1Y3QgamJ1c21jIHsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwl1NjQJCQkJbWNfcmVnXzE7CisJdTMyCQkJCXBvcnRpZDsKKwlzdHJ1Y3QgamJ1c21jX29icF9tZW1fbGF5b3V0CWxheW91dDsKKwlpbnQJCQkJbGF5b3V0X2xlbjsKKwlpbnQJCQkJbnVtX2RpbW1fZ3JvdXBzOworCXN0cnVjdCBqYnVzbWNfZGltbV9ncm91cAlkaW1tX2dyb3Vwc1tKQl9OVU1fRElNTV9HUk9VUFNdOworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1jdHJsX2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKG1jdHJsX2xpc3QpOwogCitzdGF0aWMgdm9pZCBtY19saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXNwaW5fbG9jaygmbWN0cmxfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZChsaXN0LCAmbWN0cmxfbGlzdCk7CisJc3Bpbl91bmxvY2soJm1jdHJsX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG1jX2xpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3Bpbl9sb2NrKCZtY3RybF9saXN0X2xvY2spOworCWxpc3RfZGVsX2luaXQobGlzdCk7CisJc3Bpbl91bmxvY2soJm1jdHJsX2xpc3RfbG9jayk7Cit9CisKKyNkZWZpbmUgU1lORFJPTUVfTUlOCS0xCisjZGVmaW5lIFNZTkRST01FX01BWAkxNDQKKworLyogQ292ZXJ0IHN5bmRyb21lIGNvZGUgaW50byB0aGUgd2F5IHRoZSBiaXRzIGFyZSBwb3NpdGlvbmVkCisgKiBvbiB0aGUgYnVzLgorICovCitzdGF0aWMgaW50IHN5bmRyb21lX3RvX3F3b3JkX2NvZGUoaW50IHN5bmRyb21lX2NvZGUpCit7CisJaWYgKHN5bmRyb21lX2NvZGUgPCAxMjgpCisJCXN5bmRyb21lX2NvZGUgKz0gMTY7CisJZWxzZSBpZiAoc3luZHJvbWVfY29kZSA8IDEyOCArIDkpCisJCXN5bmRyb21lX2NvZGUgLT0gKDEyOCAtIDcpOworCWVsc2UgaWYgKHN5bmRyb21lX2NvZGUgPCAoMTI4ICsgOSArIDMpKQorCQlzeW5kcm9tZV9jb2RlIC09ICgxMjggKyA5IC0gNCk7CisJZWxzZQorCQlzeW5kcm9tZV9jb2RlIC09ICgxMjggKyA5ICsgMyk7CisJcmV0dXJuIHN5bmRyb21lX2NvZGU7Cit9CisKKy8qIEFsbCB0aGlzIG1hZ2ljIGhhcyB0byBkbyB3aXRoIGhvdyBhIGNhY2hlIGxpbmUgY29tZXMgb3ZlciB0aGUgd2lyZQorICogb24gU2FmYXJpIGFuZCBKQlVTLiAgQSA2NC1iaXQgbGluZSBjb21lcyBvdmVyIGluIDEgb3IgbW9yZSBxdWFkd29yZAorICogY3ljbGVzLCBlYWNoIG9mIHdoaWNoIHRyYW5zbWl0IEVDQy9NVEFHIGluZm8gYXMgd2VsbCBhcyB0aGUgYWN0dWFsCisgKiBkYXRhLgorICovCisjZGVmaW5lIEwyX0xJTkVfU0laRQkJNjQKKyNkZWZpbmUgTDJfTElORV9BRERSX01TSwkoTDJfTElORV9TSVpFIC0gMSkKKyNkZWZpbmUgUVdfUEVSX0xJTkUJCTQKKyNkZWZpbmUgUVdfQllURVMJCShMMl9MSU5FX1NJWkUgLyBRV19QRVJfTElORSkKKyNkZWZpbmUgUVdfQklUUwkJCTE0NAorI2RlZmluZSBTQUZBUklfTEFTVF9CSVQJCSg1NzYgLSAxKQorI2RlZmluZSBKQlVTX0xBU1RfQklUCQkoMTQ0IC0gMSkKKworc3RhdGljIHZvaWQgZ2V0X3Bpbl9hbmRfZGltbV9zdHIoaW50IHN5bmRyb21lX2NvZGUsIHVuc2lnbmVkIGxvbmcgcGFkZHIsCisJCQkJIGludCAqcGluX3AsIGNoYXIgKipkaW1tX3N0cl9wLCB2b2lkICpfcHJvcCwKKwkJCQkgaW50IGJhc2VfZGltbV9vZmZzZXQpCit7CisJaW50IHF3b3JkX2NvZGUgPSBzeW5kcm9tZV90b19xd29yZF9jb2RlKHN5bmRyb21lX2NvZGUpOworCWludCBjYWNoZV9saW5lX29mZnNldDsKKwlpbnQgb2Zmc2V0X2ludmVyc2U7CisJaW50IGRpbW1fbWFwX2luZGV4OworCWludCBtYXBfdmFsOworCisJaWYgKG1jX3R5cGUgPT0gTUNfVFlQRV9KQlVTKSB7CisJCXN0cnVjdCBqYnVzbWNfb2JwX21lbV9sYXlvdXQgKnAgPSBfcHJvcDsKKworCQkvKiBKQlVTICovCisJCWNhY2hlX2xpbmVfb2Zmc2V0ID0gcXdvcmRfY29kZTsKKwkJb2Zmc2V0X2ludmVyc2UgPSAoSkJVU19MQVNUX0JJVCAtIGNhY2hlX2xpbmVfb2Zmc2V0KTsKKwkJZGltbV9tYXBfaW5kZXggPSBvZmZzZXRfaW52ZXJzZSAvIDg7CisJCW1hcF92YWwgPSBwLT5tYXAuZGltbV9tYXBbZGltbV9tYXBfaW5kZXhdOworCQltYXBfdmFsID0gKChtYXBfdmFsID4+ICgoNyAtIChvZmZzZXRfaW52ZXJzZSAmIDcpKSkpICYgMSk7CisJCSpkaW1tX3N0cl9wID0gcC0+ZGltbV9sYWJlbHNbYmFzZV9kaW1tX29mZnNldCArIG1hcF92YWxdOworCQkqcGluX3AgPSBwLT5tYXAucGluX21hcFtjYWNoZV9saW5lX29mZnNldF07CisJfSBlbHNlIHsKKwkJc3RydWN0IGNobWNfb2JwX21lbV9sYXlvdXQgKnAgPSBfcHJvcDsKKwkJc3RydWN0IGNobWNfb2JwX21hcCAqbXA7CisJCWludCBxd29yZDsKKworCQkvKiBTYWZhcmkgKi8KKwkJaWYgKHAtPnN5bW1ldHJpYykKKwkJCW1wID0gJnAtPm1hcFswXTsKKwkJZWxzZQorCQkJbXAgPSAmcC0+bWFwWzFdOworCisJCXF3b3JkID0gKHBhZGRyICYgTDJfTElORV9BRERSX01TSykgLyBRV19CWVRFUzsKKwkJY2FjaGVfbGluZV9vZmZzZXQgPSAoKDMgLSBxd29yZCkgKiBRV19CSVRTKSArIHF3b3JkX2NvZGU7CisJCW9mZnNldF9pbnZlcnNlID0gKFNBRkFSSV9MQVNUX0JJVCAtIGNhY2hlX2xpbmVfb2Zmc2V0KTsKKwkJZGltbV9tYXBfaW5kZXggPSBvZmZzZXRfaW52ZXJzZSA+PiAyOworCQltYXBfdmFsID0gbXAtPmRpbW1fbWFwW2RpbW1fbWFwX2luZGV4XTsKKwkJbWFwX3ZhbCA9ICgobWFwX3ZhbCA+PiAoKDMgLSAob2Zmc2V0X2ludmVyc2UgJiAzKSkgPDwgMSkpICYgMHgzKTsKKwkJKmRpbW1fc3RyX3AgPSBwLT5kaW1tX2xhYmVsc1tiYXNlX2RpbW1fb2Zmc2V0ICsgbWFwX3ZhbF07CisJCSpwaW5fcCA9IG1wLT5waW5fbWFwW2NhY2hlX2xpbmVfb2Zmc2V0XTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgamJ1c21jX2RpbW1fZ3JvdXAgKmpidXNtY19maW5kX2RpbW1fZ3JvdXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCit7CisJc3RydWN0IGpidXNtYyAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm1jdHJsX2xpc3QsIGxpc3QpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IHAtPm51bV9kaW1tX2dyb3VwczsgaSsrKSB7CisJCQlzdHJ1Y3QgamJ1c21jX2RpbW1fZ3JvdXAgKmRwID0gJnAtPmRpbW1fZ3JvdXBzW2ldOworCisJCQlpZiAocGh5c19hZGRyIDwgZHAtPmJhc2VfYWRkciB8fAorCQkJICAgIChkcC0+YmFzZV9hZGRyICsgZHAtPnNpemUpIDw9IHBoeXNfYWRkcikKKwkJCQljb250aW51ZTsKKworCQkJcmV0dXJuIGRwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGpidXNtY19wcmludF9kaW1tKGludCBzeW5kcm9tZV9jb2RlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgICAgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBqYnVzbWNfb2JwX21lbV9sYXlvdXQgKnByb3A7CisJc3RydWN0IGpidXNtY19kaW1tX2dyb3VwICpkcDsKKwlzdHJ1Y3QgamJ1c21jICpwOworCWludCBmaXJzdF9kaW1tOworCisJZHAgPSBqYnVzbWNfZmluZF9kaW1tX2dyb3VwKHBoeXNfYWRkcik7CisJaWYgKGRwID09IE5VTEwgfHwKKwkgICAgc3luZHJvbWVfY29kZSA8IFNZTkRST01FX01JTiB8fAorCSAgICBzeW5kcm9tZV9jb2RlID4gU1lORFJPTUVfTUFYKSB7CisJCWJ1ZlswXSA9ICc/JzsKKwkJYnVmWzFdID0gJz8nOworCQlidWZbMl0gPSAnPyc7CisJCWJ1ZlszXSA9ICdcMCc7CisJfQorCXAgPSBkcC0+Y29udHJvbGxlcjsKKwlwcm9wID0gJnAtPmxheW91dDsKKworCWZpcnN0X2RpbW0gPSBkcC0+aW5kZXggKiBKQl9OVU1fRElNTVNfUEVSX0dST1VQOworCisJaWYgKHN5bmRyb21lX2NvZGUgIT0gU1lORFJPTUVfTUlOKSB7CisJCWNoYXIgKmRpbW1fc3RyOworCQlpbnQgcGluOworCisJCWdldF9waW5fYW5kX2RpbW1fc3RyKHN5bmRyb21lX2NvZGUsIHBoeXNfYWRkciwgJnBpbiwKKwkJCQkgICAgICZkaW1tX3N0ciwgcHJvcCwgZmlyc3RfZGltbSk7CisJCXNwcmludGYoYnVmLCAiJXMsIHBpbiAlM2QiLCBkaW1tX3N0ciwgcGluKTsKKwl9IGVsc2UgeworCQlpbnQgZGltbTsKKworCQkvKiBNdWx0aS1iaXQgZXJyb3IsIHdlIGp1c3QgZHVtcCBvdXQgYWxsIHRoZQorCQkgKiBkaW1tIGxhYmVscyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaW1tIGdyb3VwLgorCQkgKi8KKwkJZm9yIChkaW1tID0gMDsgZGltbSA8IEpCX05VTV9ESU1NU19QRVJfR1JPVVA7IGRpbW0rKykgeworCQkJc3ByaW50ZihidWYsICIlcyAiLAorCQkJCXByb3AtPmRpbW1fbGFiZWxzW2ZpcnN0X2RpbW0gKyBkaW1tXSk7CisJCQlidWYgKz0gc3RybGVuKGJ1Zik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBfX2RldmluaXQgamJ1c21jX2RpbW1fZ3JvdXBfc2l6ZSh1NjQgYmFzZSwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICptZW1fcmVncywKKwkJCQkJICAgIGludCBudW1fbWVtX3JlZ3MpCit7CisJdTY0IG1heCA9IGJhc2UgKyAoOFVMICogMTAyNCAqIDEwMjQgKiAxMDI0KTsKKwl1NjQgbWF4X3NlZW4gPSBiYXNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tZW1fcmVnczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICplbnQ7CisJCXU2NCB0aGlzX2Jhc2U7CisJCXU2NCB0aGlzX2VuZDsKKworCQllbnQgPSAmbWVtX3JlZ3NbaV07CisJCXRoaXNfYmFzZSA9IGVudC0+cGh5c19hZGRyOworCQl0aGlzX2VuZCA9IHRoaXNfYmFzZSArIGVudC0+cmVnX3NpemU7CisJCWlmIChiYXNlIDwgdGhpc19iYXNlIHx8IGJhc2UgPj0gdGhpc19lbmQpCisJCQljb250aW51ZTsKKwkJaWYgKHRoaXNfZW5kID4gbWF4KQorCQkJdGhpc19lbmQgPSBtYXg7CisJCWlmICh0aGlzX2VuZCA+IG1heF9zZWVuKQorCQkJbWF4X3NlZW4gPSB0aGlzX2VuZDsKKwl9CisKKwlyZXR1cm4gbWF4X3NlZW4gLSBiYXNlOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgamJ1c21jX2NvbnN0cnVjdF9vbmVfZGltbV9ncm91cChzdHJ1Y3QgamJ1c21jICpwLAorCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmRleCwKKwkJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICptZW1fcmVncywKKwkJCQkJCSAgICAgIGludCBudW1fbWVtX3JlZ3MpCit7CisJc3RydWN0IGpidXNtY19kaW1tX2dyb3VwICpkcCA9ICZwLT5kaW1tX2dyb3Vwc1tpbmRleF07CisKKwlkcC0+Y29udHJvbGxlciA9IHA7CisJZHAtPmluZGV4ID0gaW5kZXg7CisKKwlkcC0+YmFzZV9hZGRyICA9IChwLT5wb3J0aWQgKiAoNjRVTCAqIDEwMjQgKiAxMDI0ICogMTAyNCkpOworCWRwLT5iYXNlX2FkZHIgKz0gKGluZGV4ICogKDhVTCAqIDEwMjQgKiAxMDI0ICogMTAyNCkpOworCWRwLT5zaXplID0gamJ1c21jX2RpbW1fZ3JvdXBfc2l6ZShkcC0+YmFzZV9hZGRyLCBtZW1fcmVncywgbnVtX21lbV9yZWdzKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGpidXNtY19jb25zdHJ1Y3RfZGltbV9ncm91cHMoc3RydWN0IGpidXNtYyAqcCwKKwkJCQkJCSAgIGNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICptZW1fcmVncywKKwkJCQkJCSAgIGludCBudW1fbWVtX3JlZ3MpCit7CisJaWYgKHAtPm1jX3JlZ18xICYgSkJfTUNfUkVHMV9ESU1NMV9CQU5LMCkgeworCQlqYnVzbWNfY29uc3RydWN0X29uZV9kaW1tX2dyb3VwKHAsIDAsIG1lbV9yZWdzLCBudW1fbWVtX3JlZ3MpOworCQlwLT5udW1fZGltbV9ncm91cHMrKzsKKwl9CisJaWYgKHAtPm1jX3JlZ18xICYgSkJfTUNfUkVHMV9ESU1NMl9CQU5LMikgeworCQlqYnVzbWNfY29uc3RydWN0X29uZV9kaW1tX2dyb3VwKHAsIDEsIG1lbV9yZWdzLCBudW1fbWVtX3JlZ3MpOworCQlwLT5udW1fZGltbV9ncm91cHMrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGpidXNtY19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICptZW1fcmVnczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbV9ub2RlOworCWludCBlcnIsIGxlbiwgbnVtX21lbV9yZWdzOworCXN0cnVjdCBqYnVzbWMgKnA7CisJY29uc3QgdTMyICpwcm9wOworCWNvbnN0IHZvaWQgKm1sOworCisJZXJyID0gLUVOT0RFVjsKKwltZW1fbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvbWVtb3J5Iik7CisJaWYgKCFtZW1fbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCAvbWVtb3J5IG5vZGUuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW1lbV9yZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KG1lbV9ub2RlLCAicmVnIiwgJmxlbik7CisJaWYgKCFtZW1fcmVncykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZ2V0IHJlZyBwcm9wZXJ0eSBvZiAvbWVtb3J5IG5vZGUuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW51bV9tZW1fcmVncyA9IGxlbiAvIHNpemVvZigqbWVtX3JlZ3MpOworCisJZXJyID0gLUVOT01FTTsKKwlwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHN0cnVjdCBqYnVzbWMuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnAtPmxpc3QpOworCisJZXJyID0gLUVOT0RFVjsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9wLT5ub2RlLCAicG9ydGlkIiwgJmxlbik7CisJaWYgKCFwcm9wIHx8IGxlbiAhPSA0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHBvcnRpZC5cbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXAtPnBvcnRpZCA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgIm1lbW9yeS1jb250cm9sLXJlZ2lzdGVyLTEiLCAmbGVuKTsKKwlpZiAoIXByb3AgfHwgbGVuICE9IDgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGdldCBtZW1vcnkgY29udHJvbCByZWdpc3RlciAxLlxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcC0+bWNfcmVnXzEgPSAoKHU2NClwcm9wWzBdIDw8IDMyKSB8ICh1NjQpIHByb3BbMV07CisKKwllcnIgPSAtRU5PTUVNOworCXAtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIEpCVVNNQ19SRUdTX1NJWkUsICJqYnVzbWMiKTsKKwlpZiAoIXAtPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBqYnVzbWMgcmVncy5cbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVyciA9IC1FTk9ERVY7CisJbWwgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJtZW1vcnktbGF5b3V0IiwgJnAtPmxheW91dF9sZW4pOworCWlmICghbWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGdldCBtZW1vcnkgbGF5b3V0IHByb3BlcnR5LlxuIik7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCWlmIChwLT5sYXlvdXRfbGVuID4gc2l6ZW9mKHAtPmxheW91dCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5leHBlY3RlZCBtZW1vcnktbGF5b3V0IHNpemUgJWRcbiIsCisJCSAgICAgICBwLT5sYXlvdXRfbGVuKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisJbWVtY3B5KCZwLT5sYXlvdXQsIG1sLCBwLT5sYXlvdXRfbGVuKTsKKworCWpidXNtY19jb25zdHJ1Y3RfZGltbV9ncm91cHMocCwgbWVtX3JlZ3MsIG51bV9tZW1fcmVncyk7CisKKwltY19saXN0X2FkZCgmcC0+bGlzdCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiVWx0cmFTUEFSQy1JSUlpIG1lbW9yeSBjb250cm9sbGVyIGF0ICVzXG4iLAorCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcCk7CisKKwllcnIgPSAwOworCitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X2lvdW5tYXA6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCBKQlVTTUNfUkVHU19TSVpFKTsKKworb3V0X2ZyZWU6CisJa2ZyZWUocCk7CisJZ290byBvdXQ7Cit9CisKIC8qIERvZXMgQkFOSyBkZWNvZGUgUEhZU19BRERSPyAqLwotc3RhdGljIGludCBiYW5rX21hdGNoKHN0cnVjdCBiYW5rX2luZm8gKmJwLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKK3N0YXRpYyBpbnQgY2htY19iYW5rX21hdGNoKHN0cnVjdCBjaG1jX2JhbmtfaW5mbyAqYnAsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgdXBwZXJfYml0cyA9IChwaHlzX2FkZHIgJiBQQV9VUFBFUl9CSVRTKSA+PiBQQV9VUFBFUl9CSVRTX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgbG93ZXJfYml0cyA9IChwaHlzX2FkZHIgJiBQQV9MT1dFUl9CSVRTKSA+PiBQQV9MT1dFUl9CSVRTX1NISUZUOwpAQCAtMTE4LDI1ICs1MTUsMTggQEAKIH0KIAogLyogR2l2ZW4gUEhZU19BRERSLCBzZWFyY2ggbWVtb3J5IGNvbnRyb2xsZXIgYmFua3MgZm9yIGEgbWF0Y2guICovCi1zdGF0aWMgc3RydWN0IGJhbmtfaW5mbyAqZmluZF9iYW5rKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQorc3RhdGljIHN0cnVjdCBjaG1jX2JhbmtfaW5mbyAqY2htY19maW5kX2JhbmsodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbWN0cmxfaGVhZCA9ICZtY3RybF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKm1jdHJsX2VudHJ5ID0gbWN0cmxfaGVhZC0+bmV4dDsKKwlzdHJ1Y3QgY2htYyAqcDsKIAotCWZvciAoOzspIHsKLQkJc3RydWN0IG1jdHJsX2luZm8gKm1wID0KLQkJCWxpc3RfZW50cnkobWN0cmxfZW50cnksIHN0cnVjdCBtY3RybF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZtY3RybF9saXN0LCBsaXN0KSB7CiAJCWludCBiYW5rX25vOwogCi0JCWlmIChtY3RybF9lbnRyeSA9PSBtY3RybF9oZWFkKQotCQkJYnJlYWs7Ci0JCW1jdHJsX2VudHJ5ID0gbWN0cmxfZW50cnktPm5leHQ7Ci0KIAkJZm9yIChiYW5rX25vID0gMDsgYmFua19ubyA8IENITUNUUkxfTkJBTktTOyBiYW5rX25vKyspIHsKLQkJCXN0cnVjdCBiYW5rX2luZm8gKmJwOworCQkJc3RydWN0IGNobWNfYmFua19pbmZvICpicDsKIAotCQkJYnAgPSAmbXAtPmxvZ2ljYWxfYmFua3NbYmFua19ub107Ci0JCQlpZiAoYmFua19tYXRjaChicCwgcGh5c19hZGRyKSkKKwkJCWJwID0gJnAtPmxvZ2ljYWxfYmFua3NbYmFua19ub107CisJCQlpZiAoY2htY19iYW5rX21hdGNoKGJwLCBwaHlzX2FkZHIpKQogCQkJCXJldHVybiBicDsKIAkJfQogCX0KQEAgLTE0NSwxNyArNTM1LDE1IEBACiB9CiAKIC8qIFRoaXMgaXMgdGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGRyaXZlci4gKi8KLSNkZWZpbmUgU1lORFJPTUVfTUlOCS0xCi0jZGVmaW5lIFNZTkRST01FX01BWAkxNDQKLWludCBjaG1jX2dldHVudW1iZXIoaW50IHN5bmRyb21lX2NvZGUsCi0JCSAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJICAgIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3N0YXRpYyBpbnQgY2htY19wcmludF9kaW1tKGludCBzeW5kcm9tZV9jb2RlLAorCQkJICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkgICBjaGFyICpidWYsIGludCBidWZsZW4pCiB7Ci0Jc3RydWN0IGJhbmtfaW5mbyAqYnA7Ci0Jc3RydWN0IG9icF9tZW1fbGF5b3V0ICpwcm9wOworCXN0cnVjdCBjaG1jX2JhbmtfaW5mbyAqYnA7CisJc3RydWN0IGNobWNfb2JwX21lbV9sYXlvdXQgKnByb3A7CiAJaW50IGJhbmtfaW5fY29udHJvbGxlciwgZmlyc3RfZGltbTsKIAotCWJwID0gZmluZF9iYW5rKHBoeXNfYWRkcik7CisJYnAgPSBjaG1jX2ZpbmRfYmFuayhwaHlzX2FkZHIpOwogCWlmIChicCA9PSBOVUxMIHx8CiAJICAgIHN5bmRyb21lX2NvZGUgPCBTWU5EUk9NRV9NSU4gfHwKIAkgICAgc3luZHJvbWVfY29kZSA+IFNZTkRST01FX01BWCkgewpAQCAtMTY2LDYwICs1NTQsMTggQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJvcCA9ICZicC0+bXAtPmxheW91dF9wcm9wOworCXByb3AgPSAmYnAtPnAtPmxheW91dF9wcm9wOwogCWJhbmtfaW5fY29udHJvbGxlciA9IGJwLT5iYW5rX2lkICYgKENITUNUUkxfTkJBTktTIC0gMSk7CiAJZmlyc3RfZGltbSAgPSAoYmFua19pbl9jb250cm9sbGVyICYgKENITUNUUkxfTkRHUlBTIC0gMSkpOwogCWZpcnN0X2RpbW0gKj0gQ0hNQ1RSTF9ORElNTVM7CiAKIAlpZiAoc3luZHJvbWVfY29kZSAhPSBTWU5EUk9NRV9NSU4pIHsKLQkJc3RydWN0IG9icF9tYXAgKm1hcDsKLQkJaW50IHF3b3JkLCB3aGVyZV9pbl9saW5lLCB3aGVyZSwgbWFwX2luZGV4LCBtYXBfb2Zmc2V0OwotCQl1bnNpZ25lZCBpbnQgbWFwX3ZhbDsKKwkJY2hhciAqZGltbV9zdHI7CisJCWludCBwaW47CiAKLQkJLyogWWFheSwgc2luZ2xlIGJpdCBlcnJvciBzbyB3ZSBjYW4gZmlndXJlIG91dAotCQkgKiB0aGUgZXhhY3QgZGltbS4KLQkJICovCi0JCWlmIChwcm9wLT5zeW1tZXRyaWMpCi0JCQltYXAgPSAmcHJvcC0+bWFwWzBdOwotCQllbHNlCi0JCQltYXAgPSAmcHJvcC0+bWFwWzFdOwotCi0JCS8qIENvdmVydCBzeW5kcm9tZSBjb2RlIGludG8gdGhlIHdheSB0aGUgYml0cyBhcmUKLQkJICogcG9zaXRpb25lZCBvbiB0aGUgYnVzLgotCQkgKi8KLQkJaWYgKHN5bmRyb21lX2NvZGUgPCAxNDQgLSAxNikKLQkJCXN5bmRyb21lX2NvZGUgKz0gMTY7Ci0JCWVsc2UgaWYgKHN5bmRyb21lX2NvZGUgPCAxNDQpCi0JCQlzeW5kcm9tZV9jb2RlIC09ICgxNDQgLSA3KTsKLQkJZWxzZSBpZiAoc3luZHJvbWVfY29kZSA8ICgxNDQgKyAzKSkKLQkJCXN5bmRyb21lX2NvZGUgLT0gKDE0NCArIDMgLSA0KTsKLQkJZWxzZQotCQkJc3luZHJvbWVfY29kZSAtPSAxNDQgKyAzOwotCi0JCS8qIEFsbCB0aGlzIG1hZ2ljIGhhcyB0byBkbyB3aXRoIGhvdyBhIGNhY2hlIGxpbmUKLQkJICogY29tZXMgb3ZlciB0aGUgd2lyZSBvbiBTYWZhcmkuICBBIDY0LWJpdCBsaW5lCi0JCSAqIGNvbWVzIG92ZXIgaW4gNCBxdWFkd29yZCBjeWNsZXMsIGVhY2ggb2Ygd2hpY2gKLQkJICogdHJhbnNtaXQgRUNDL01UQUcgaW5mbyBhcyB3ZWxsIGFzIHRoZSBhY3R1YWwKLQkJICogZGF0YS4gIDE0NCBiaXRzIHBlciBxdWFkd29yZCwgNTc2IHRvdGFsLgotCQkgKi8KLSNkZWZpbmUgTElORV9TSVpFCTY0Ci0jZGVmaW5lIExJTkVfQUREUl9NU0sJKExJTkVfU0laRSAtIDEpCi0jZGVmaW5lIFFXX1BFUl9MSU5FCTQKLSNkZWZpbmUgUVdfQllURVMJKExJTkVfU0laRSAvIFFXX1BFUl9MSU5FKQotI2RlZmluZSBRV19CSVRTCQkxNDQKLSNkZWZpbmUgTEFTVF9CSVQJKDU3NiAtIDEpCi0KLQkJcXdvcmQgPSAocGh5c19hZGRyICYgTElORV9BRERSX01TSykgLyBRV19CWVRFUzsKLQkJd2hlcmVfaW5fbGluZSA9ICgoMyAtIHF3b3JkKSAqIFFXX0JJVFMpICsgc3luZHJvbWVfY29kZTsKLQkJd2hlcmUgPSAoTEFTVF9CSVQgLSB3aGVyZV9pbl9saW5lKTsKLQkJbWFwX2luZGV4ID0gd2hlcmUgPj4gMjsKLQkJbWFwX29mZnNldCA9IHdoZXJlICYgMHgzOwotCQltYXBfdmFsID0gbWFwLT5kaW1tX21hcFttYXBfaW5kZXhdOwotCQltYXBfdmFsID0gKChtYXBfdmFsID4+ICgoMyAtIG1hcF9vZmZzZXQpIDw8IDEpKSAmICgyIC0gMSkpOwotCi0JCXNwcmludGYoYnVmLCAiJXMsIHBpbiAlM2QiLAotCQkJcHJvcC0+ZGltbV9sYWJlbHNbZmlyc3RfZGltbSArIG1hcF92YWxdLAotCQkJbWFwLT5waW5fbWFwW3doZXJlX2luX2xpbmVdKTsKKwkJZ2V0X3Bpbl9hbmRfZGltbV9zdHIoc3luZHJvbWVfY29kZSwgcGh5c19hZGRyLCAmcGluLAorCQkJCSAgICAgJmRpbW1fc3RyLCBwcm9wLCBmaXJzdF9kaW1tKTsKKwkJc3ByaW50ZihidWYsICIlcywgcGluICUzZCIsIGRpbW1fc3RyLCBwaW4pOwogCX0gZWxzZSB7CiAJCWludCBkaW1tOwogCkBAIC0yNDAsNyArNTg2LDcgQEAKICAqIHRoZSBjb2RlIGlzIGV4ZWN1dGluZywgeW91IG11c3QgdXNlIHNwZWNpYWwgQVNJIGxvYWQvc3RvcmUgZWxzZQogICogeW91IGdvIHRocm91Z2ggdGhlIGdsb2JhbCBtYXBwaW5nLgogICovCi1zdGF0aWMgdTY0IHJlYWRfbWNyZWcoc3RydWN0IG1jdHJsX2luZm8gKm1wLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3N0YXRpYyB1NjQgY2htY19yZWFkX21jcmVnKHN0cnVjdCBjaG1jICpwLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKIAl1bnNpZ25lZCBsb25nIHJldCwgdGhpc19jcHU7CiAKQEAgLTI0OCwxNCArNTk0LDE0IEBACiAKIAl0aGlzX2NwdSA9IHJlYWxfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAobXAtPnBvcnRpZCA9PSB0aGlzX2NwdSkgeworCWlmIChwLT5wb3J0aWQgPT0gdGhpc19jcHUpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEJWyUxXSAlMiwgJTAiCiAJCQkJICAgICA6ICI9ciIgKHJldCkKIAkJCQkgICAgIDogInIiIChvZmZzZXQpLCAiaSIgKEFTSV9NQ1VfQ1RSTF9SRUcpKTsKIAl9IGVsc2UgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YQlbJTFdICUyLCAlMCIKIAkJCQkgICAgIDogIj1yIiAocmV0KQotCQkJCSAgICAgOiAiciIgKG1wLT5yZWdzICsgb2Zmc2V0KSwKKwkJCQkgICAgIDogInIiIChwLT5yZWdzICsgb2Zmc2V0KSwKIAkJCQkgICAgICAgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkpOwogCX0KIApAQCAtMjY1LDE3OCArNjExLDI1MyBAQAogfQogCiAjaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCi1zdGF0aWMgdm9pZCB3cml0ZV9tY3JlZyhzdHJ1Y3QgbWN0cmxfaW5mbyAqbXAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1NjQgdmFsKQorc3RhdGljIHZvaWQgY2htY193cml0ZV9tY3JlZyhzdHJ1Y3QgY2htYyAqcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHU2NCB2YWwpCiB7Ci0JaWYgKG1wLT5wb3J0aWQgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJaWYgKHAtPnBvcnRpZCA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEJJTAsIFslMV0gJTIiCiAJCQkJICAgICA6IDogInIiICh2YWwpLAogCQkJCSAgICAgICAgICJyIiAob2Zmc2V0KSwgImkiIChBU0lfTUNVX0NUUkxfUkVHKSk7CiAJfSBlbHNlIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEJJTAsIFslMV0gJTIiCiAJCQkJICAgICA6IDogInIiICh2YWwpLAotCQkJCSAgICAgICAgICJyIiAobXAtPnJlZ3MgKyBvZmZzZXQpLAorCQkJCSAgICAgICAgICJyIiAocC0+cmVncyArIG9mZnNldCksCiAJCQkJICAgICAgICAgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkpOwogCX0KIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpbnRlcnByZXRfb25lX2RlY29kZV9yZWcoc3RydWN0IG1jdHJsX2luZm8gKm1wLCBpbnQgd2hpY2hfYmFuaywgdTY0IHZhbCkKK3N0YXRpYyB2b2lkIGNobWNfaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKHN0cnVjdCBjaG1jICpwLCBpbnQgd2hpY2hfYmFuaywgdTY0IHZhbCkKIHsKLQlzdHJ1Y3QgYmFua19pbmZvICpwID0gJm1wLT5sb2dpY2FsX2JhbmtzW3doaWNoX2JhbmtdOworCXN0cnVjdCBjaG1jX2JhbmtfaW5mbyAqYnAgPSAmcC0+bG9naWNhbF9iYW5rc1t3aGljaF9iYW5rXTsKIAotCXAtPm1wID0gbXA7Ci0JcC0+YmFua19pZCA9IChDSE1DVFJMX05CQU5LUyAqIG1wLT5wb3J0aWQpICsgd2hpY2hfYmFuazsKLQlwLT5yYXdfcmVnID0gdmFsOwotCXAtPnZhbGlkID0gKHZhbCAmIE1FTV9ERUNPREVfVkFMSUQpID4+IE1FTV9ERUNPREVfVkFMSURfU0hJRlQ7Ci0JcC0+dWsgPSAodmFsICYgTUVNX0RFQ09ERV9VSykgPj4gTUVNX0RFQ09ERV9VS19TSElGVDsKLQlwLT51bSA9ICh2YWwgJiBNRU1fREVDT0RFX1VNKSA+PiBNRU1fREVDT0RFX1VNX1NISUZUOwotCXAtPmxrID0gKHZhbCAmIE1FTV9ERUNPREVfTEspID4+IE1FTV9ERUNPREVfTEtfU0hJRlQ7Ci0JcC0+bG0gPSAodmFsICYgTUVNX0RFQ09ERV9MTSkgPj4gTUVNX0RFQ09ERV9MTV9TSElGVDsKKwlicC0+cCA9IHA7CisJYnAtPmJhbmtfaWQgPSAoQ0hNQ1RSTF9OQkFOS1MgKiBwLT5wb3J0aWQpICsgd2hpY2hfYmFuazsKKwlicC0+cmF3X3JlZyA9IHZhbDsKKwlicC0+dmFsaWQgPSAodmFsICYgTUVNX0RFQ09ERV9WQUxJRCkgPj4gTUVNX0RFQ09ERV9WQUxJRF9TSElGVDsKKwlicC0+dWsgPSAodmFsICYgTUVNX0RFQ09ERV9VSykgPj4gTUVNX0RFQ09ERV9VS19TSElGVDsKKwlicC0+dW0gPSAodmFsICYgTUVNX0RFQ09ERV9VTSkgPj4gTUVNX0RFQ09ERV9VTV9TSElGVDsKKwlicC0+bGsgPSAodmFsICYgTUVNX0RFQ09ERV9MSykgPj4gTUVNX0RFQ09ERV9MS19TSElGVDsKKwlicC0+bG0gPSAodmFsICYgTUVNX0RFQ09ERV9MTSkgPj4gTUVNX0RFQ09ERV9MTV9TSElGVDsKIAotCXAtPmJhc2UgID0gIChwLT51bSk7Ci0JcC0+YmFzZSAmPSB+KHAtPnVrKTsKLQlwLT5iYXNlIDw8PSBQQV9VUFBFUl9CSVRTX1NISUZUOworCWJwLT5iYXNlICA9ICAoYnAtPnVtKTsKKwlicC0+YmFzZSAmPSB+KGJwLT51ayk7CisJYnAtPmJhc2UgPDw9IFBBX1VQUEVSX0JJVFNfU0hJRlQ7CiAKLQlzd2l0Y2gocC0+bGspIHsKKwlzd2l0Y2goYnAtPmxrKSB7CiAJY2FzZSAweGY6CiAJZGVmYXVsdDoKLQkJcC0+aW50ZXJsZWF2ZSA9IDE7CisJCWJwLT5pbnRlcmxlYXZlID0gMTsKIAkJYnJlYWs7CiAKIAljYXNlIDB4ZToKLQkJcC0+aW50ZXJsZWF2ZSA9IDI7CisJCWJwLT5pbnRlcmxlYXZlID0gMjsKIAkJYnJlYWs7CiAKIAljYXNlIDB4YzoKLQkJcC0+aW50ZXJsZWF2ZSA9IDQ7CisJCWJwLT5pbnRlcmxlYXZlID0gNDsKIAkJYnJlYWs7CiAKIAljYXNlIDB4ODoKLQkJcC0+aW50ZXJsZWF2ZSA9IDg7CisJCWJwLT5pbnRlcmxlYXZlID0gODsKIAkJYnJlYWs7CiAKIAljYXNlIDB4MDoKLQkJcC0+aW50ZXJsZWF2ZSA9IDE2OworCQlicC0+aW50ZXJsZWF2ZSA9IDE2OwogCQlicmVhazsKIAl9OwogCiAJLyogVUtbMTBdIGlzIHJlc2VydmVkLCBhbmQgVUtbMTFdIGlzIG5vdCBzZXQgZm9yIHRoZSBTRFJBTQogCSAqIGJhbmsgc2l6ZSBkZWZpbml0aW9uLgogCSAqLwotCXAtPnNpemUgPSAoKCh1bnNpZ25lZCBsb25nKXAtPnVrICYKLQkJICAgICgoMVVMIDw8IDEwVUwpIC0gMVVMKSkgKyAxVUwpIDw8IFBBX1VQUEVSX0JJVFNfU0hJRlQ7Ci0JcC0+c2l6ZSAvPSBwLT5pbnRlcmxlYXZlOworCWJwLT5zaXplID0gKCgodW5zaWduZWQgbG9uZylicC0+dWsgJgorCQkgICAgICgoMVVMIDw8IDEwVUwpIC0gMVVMKSkgKyAxVUwpIDw8IFBBX1VQUEVSX0JJVFNfU0hJRlQ7CisJYnAtPnNpemUgLz0gYnAtPmludGVybGVhdmU7CiB9CiAKLXN0YXRpYyB2b2lkIGZldGNoX2RlY29kZV9yZWdzKHN0cnVjdCBtY3RybF9pbmZvICptcCkKK3N0YXRpYyB2b2lkIGNobWNfZmV0Y2hfZGVjb2RlX3JlZ3Moc3RydWN0IGNobWMgKnApCiB7Ci0JaWYgKG1wLT5sYXlvdXRfc2l6ZSA9PSAwKQorCWlmIChwLT5sYXlvdXRfc2l6ZSA9PSAwKQogCQlyZXR1cm47CiAKLQlpbnRlcnByZXRfb25lX2RlY29kZV9yZWcobXAsIDAsCi0JCQkJIHJlYWRfbWNyZWcobXAsIENITUNUUkxfREVDT0RFMSkpOwotCWludGVycHJldF9vbmVfZGVjb2RlX3JlZyhtcCwgMSwKLQkJCQkgcmVhZF9tY3JlZyhtcCwgQ0hNQ1RSTF9ERUNPREUyKSk7Ci0JaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKG1wLCAyLAotCQkJCSByZWFkX21jcmVnKG1wLCBDSE1DVFJMX0RFQ09ERTMpKTsKLQlpbnRlcnByZXRfb25lX2RlY29kZV9yZWcobXAsIDMsCi0JCQkJIHJlYWRfbWNyZWcobXAsIENITUNUUkxfREVDT0RFNCkpOworCWNobWNfaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKHAsIDAsCisJCQkJICAgICAgY2htY19yZWFkX21jcmVnKHAsIENITUNUUkxfREVDT0RFMSkpOworCWNobWNfaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKHAsIDEsCisJCQkJICAgICAgY2htY19yZWFkX21jcmVnKHAsIENITUNUUkxfREVDT0RFMikpOworCWNobWNfaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKHAsIDIsCisJCQkJICAgICAgY2htY19yZWFkX21jcmVnKHAsIENITUNUUkxfREVDT0RFMykpOworCWNobWNfaW50ZXJwcmV0X29uZV9kZWNvZGVfcmVnKHAsIDMsCisJCQkJICAgICAgY2htY19yZWFkX21jcmVnKHAsIENITUNUUkxfREVDT0RFNCkpOwogfQogCi1zdGF0aWMgaW50IGluaXRfb25lX21jdHJsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaG1jX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBtY3RybF9pbmZvICptcCA9IGt6YWxsb2Moc2l6ZW9mKCptcCksIEdGUF9LRVJORUwpOwotCWludCBwb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJwb3J0aWQiLCAtMSk7Ci0JY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOworCXVuc2lnbmVkIGxvbmcgdmVyOwogCWNvbnN0IHZvaWQgKnB2YWw7Ci0JaW50IGxlbjsKKwlpbnQgbGVuLCBwb3J0aWQ7CisJc3RydWN0IGNobWMgKnA7CisJaW50IGVycjsKIAotCWlmICghbXApCi0JCXJldHVybiAtMTsKKwllcnIgPSAtRU5PREVWOworCV9fYXNtX18gKCJyZHByICUldmVyLCAlMCIgOiAiPXIiICh2ZXIpKTsKKwlpZiAoKHZlciA+PiAzMlVMKSA9PSBfX0pBTEFQRU5PX0lEIHx8CisJICAgICh2ZXIgPj4gMzJVTCkgPT0gX19TRVJSQU5PX0lEKQorCQlnb3RvIG91dDsKKworCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIC0xKTsKIAlpZiAocG9ydGlkID09IC0xKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gb3V0OwogCi0JbXAtPnBvcnRpZCA9IHBvcnRpZDsKIAlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibWVtb3J5LWxheW91dCIsICZsZW4pOwotCW1wLT5sYXlvdXRfc2l6ZSA9IGxlbjsKKwlpZiAocHZhbCAmJiBsZW4gPiBzaXplb2YocC0+bGF5b3V0X3Byb3ApKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuZXhwZWN0ZWQgbWVtb3J5LWxheW91dCBwcm9wZXJ0eSAiCisJCSAgICAgICAic2l6ZSAlZC5cbiIsIGxlbik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IC1FTk9NRU07CisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBhbGxvY2F0ZSBzdHJ1Y3QgY2htYy5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwLT5wb3J0aWQgPSBwb3J0aWQ7CisJcC0+bGF5b3V0X3NpemUgPSBsZW47CiAJaWYgKCFwdmFsKQotCQltcC0+bGF5b3V0X3NpemUgPSAwOwotCWVsc2UgewotCQlpZiAobXAtPmxheW91dF9zaXplID4gc2l6ZW9mKG1wLT5sYXlvdXRfcHJvcCkpCi0JCQlnb3RvIGZhaWw7Ci0JCW1lbWNweSgmbXAtPmxheW91dF9wcm9wLCBwdmFsLCBsZW4pOworCQlwLT5sYXlvdXRfc2l6ZSA9IDA7CisJZWxzZQorCQltZW1jcHkoJnAtPmxheW91dF9wcm9wLCBwdmFsLCBsZW4pOworCisJcC0+cmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwgMHg0OCwgImNobWMiKTsKKwlpZiAoIXAtPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG1hcCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JaWYgKCFyZWdzIHx8IHJlZ3MtPnJlZ19zaXplICE9IDB4NDgpCi0JCWdvdG8gZmFpbDsKLQotCW1wLT5yZWdzID0gaW9yZW1hcChyZWdzLT5waHlzX2FkZHIsIHJlZ3MtPnJlZ19zaXplKTsKLQlpZiAobXAtPnJlZ3MgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCi0JaWYgKG1wLT5sYXlvdXRfc2l6ZSAhPSAwVUwpIHsKLQkJbXAtPnRpbWluZ19jb250cm9sMSA9IHJlYWRfbWNyZWcobXAsIENITUNUUkxfVENUUkwxKTsKLQkJbXAtPnRpbWluZ19jb250cm9sMiA9IHJlYWRfbWNyZWcobXAsIENITUNUUkxfVENUUkwyKTsKLQkJbXAtPnRpbWluZ19jb250cm9sMyA9IHJlYWRfbWNyZWcobXAsIENITUNUUkxfVENUUkwzKTsKLQkJbXAtPnRpbWluZ19jb250cm9sNCA9IHJlYWRfbWNyZWcobXAsIENITUNUUkxfVENUUkw0KTsKLQkJbXAtPm1lbWFkZHJfY29udHJvbCA9IHJlYWRfbWNyZWcobXAsIENITUNUUkxfTUFDVFJMKTsKKwlpZiAocC0+bGF5b3V0X3NpemUgIT0gMFVMKSB7CisJCXAtPnRpbWluZ19jb250cm9sMSA9IGNobWNfcmVhZF9tY3JlZyhwLCBDSE1DVFJMX1RDVFJMMSk7CisJCXAtPnRpbWluZ19jb250cm9sMiA9IGNobWNfcmVhZF9tY3JlZyhwLCBDSE1DVFJMX1RDVFJMMik7CisJCXAtPnRpbWluZ19jb250cm9sMyA9IGNobWNfcmVhZF9tY3JlZyhwLCBDSE1DVFJMX1RDVFJMMyk7CisJCXAtPnRpbWluZ19jb250cm9sNCA9IGNobWNfcmVhZF9tY3JlZyhwLCBDSE1DVFJMX1RDVFJMNCk7CisJCXAtPm1lbWFkZHJfY29udHJvbCA9IGNobWNfcmVhZF9tY3JlZyhwLCBDSE1DVFJMX01BQ1RSTCk7CiAJfQogCi0JZmV0Y2hfZGVjb2RlX3JlZ3MobXApOworCWNobWNfZmV0Y2hfZGVjb2RlX3JlZ3MocCk7CiAKLQlsaXN0X2FkZCgmbXAtPmxpc3QsICZtY3RybF9saXN0KTsKKwltY19saXN0X2FkZCgmcC0+bGlzdCk7CiAKLQkvKiBSZXBvcnQgdGhlIGRldmljZS4gKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogVVMzIG1lbW9yeSBjb250cm9sbGVyIGF0ICVwIFslc11cbiIsCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlVsdHJhU1BBUkMtSUlJIG1lbW9yeSBjb250cm9sbGVyIGF0ICVzIFslc11cbiIsCiAJICAgICAgIGRwLT5mdWxsX25hbWUsCi0JICAgICAgIG1wLT5yZWdzLCAobXAtPmxheW91dF9zaXplID8gIkFDVElWRSIgOiAiSU5BQ1RJVkUiKSk7CisJICAgICAgIChwLT5sYXlvdXRfc2l6ZSA/ICJBQ1RJVkUiIDogIklOQUNUSVZFIikpOwogCi0JcmV0dXJuIDA7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBwKTsKIAotZmFpbDoKLQlpZiAobXApIHsKLQkJaWYgKG1wLT5yZWdzICE9IE5VTEwpCi0JCQlpb3VubWFwKG1wLT5yZWdzKTsKLQkJa2ZyZWUobXApOwotCX0KLQlyZXR1cm4gLTE7CisJZXJyID0gMDsKKworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9mcmVlOgorCWtmcmVlKHApOworCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBjaG1jX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHVzM21jX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaWYgKG1jX3R5cGUgPT0gTUNfVFlQRV9TQUZBUkkpCisJCXJldHVybiBjaG1jX3Byb2JlKG9wLCBtYXRjaCk7CisJZWxzZSBpZiAobWNfdHlwZSA9PSBNQ19UWVBFX0pCVVMpCisJCXJldHVybiBqYnVzbWNfcHJvYmUob3AsIG1hdGNoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KIAotCS8qIFRoaXMgZHJpdmVyIGlzIG9ubHkgZm9yIGNoZWV0YWggcGxhdGZvcm1zLiAqLwotCWlmICh0bGJfdHlwZSAhPSBjaGVldGFoICYmIHRsYl90eXBlICE9IGNoZWV0YWhfcGx1cykKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaG1jX2Rlc3Ryb3koc3RydWN0IG9mX2RldmljZSAqb3AsIHN0cnVjdCBjaG1jICpwKQoreworCWxpc3RfZGVsKCZwLT5saXN0KTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIDB4NDgpOworCWtmcmVlKHApOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgamJ1c21jX2Rlc3Ryb3koc3RydWN0IG9mX2RldmljZSAqb3AsIHN0cnVjdCBqYnVzbWMgKnApCit7CisJbWNfbGlzdF9kZWwoJnAtPmxpc3QpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcC0+cmVncywgSkJVU01DX1JFR1NfU0laRSk7CisJa2ZyZWUocCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHVzM21jX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwl2b2lkICpwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKworCWlmIChwKSB7CisJCWlmIChtY190eXBlID09IE1DX1RZUEVfU0FGQVJJKQorCQkJY2htY19kZXN0cm95KG9wLCBwKTsKKwkJZWxzZSBpZiAobWNfdHlwZSA9PSBNQ19UWVBFX0pCVVMpCisJCQlqYnVzbWNfZGVzdHJveShvcCwgcCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB1czNtY19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAibWVtb3J5LWNvbnRyb2xsZXIiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdXMzbWNfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciB1czNtY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInVzM21jIiwKKwkubWF0Y2hfdGFibGUJPSB1czNtY19tYXRjaCwKKwkucHJvYmUJCT0gdXMzbWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh1czNtY19yZW1vdmUpLAorfTsKKworc3RhdGljIGlubGluZSBib29sIHVzM21jX3BsYXRmb3JtKHZvaWQpCit7CisJaWYgKHRsYl90eXBlID09IGNoZWV0YWggfHwgdGxiX3R5cGUgPT0gY2hlZXRhaF9wbHVzKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVzM21jX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZlcjsKKwlpbnQgcmV0OworCisJaWYgKCF1czNtY19wbGF0Zm9ybSgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgIm1lbW9yeS1jb250cm9sbGVyIikKLQkJaW5pdF9vbmVfbWN0cmwoZHApOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZHByICUldmVyLCAlMCIgOiAiPXIiICh2ZXIpKTsKKwlpZiAoKHZlciA+PiAzMlVMKSA9PSBfX0pBTEFQRU5PX0lEIHx8CisJICAgICh2ZXIgPj4gMzJVTCkgPT0gX19TRVJSQU5PX0lEKSB7CisJCW1jX3R5cGUgPSBNQ19UWVBFX0pCVVM7CisJCXVzM21jX2RpbW1fcHJpbnRlciA9IGpidXNtY19wcmludF9kaW1tOworCX0gZWxzZSB7CisJCW1jX3R5cGUgPSBNQ19UWVBFX1NBRkFSSTsKKwkJdXMzbWNfZGltbV9wcmludGVyID0gY2htY19wcmludF9kaW1tOworCX0KIAotCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgIm1jLXVzMyIpCi0JCWluaXRfb25lX21jdHJsKGRwKTsKKwlyZXQgPSByZWdpc3Rlcl9kaW1tX3ByaW50ZXIodXMzbWNfZGltbV9wcmludGVyKTsKIAotCXJldHVybiAwOworCWlmICghcmV0KSB7CisJCXJldCA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmdXMzbWNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworCQlpZiAocmV0KQorCQkJdW5yZWdpc3Rlcl9kaW1tX3ByaW50ZXIodXMzbWNfZGltbV9wcmludGVyKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGNobWNfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVzM21jX2NsZWFudXAodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm1jdHJsX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gaGVhZC0+bmV4dDsKLQotCWZvciAoOzspIHsKLQkJc3RydWN0IG1jdHJsX2luZm8gKnAgPQotCQkJbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBtY3RybF9pbmZvLCBsaXN0KTsKLQkJaWYgKHRtcCA9PSBoZWFkKQotCQkJYnJlYWs7Ci0JCXRtcCA9IHRtcC0+bmV4dDsKLQotCQlsaXN0X2RlbCgmcC0+bGlzdCk7Ci0JCWlvdW5tYXAocC0+cmVncyk7Ci0JCWtmcmVlKHApOworCWlmICh1czNtY19wbGF0Zm9ybSgpKSB7CisJCXVucmVnaXN0ZXJfZGltbV9wcmludGVyKHVzM21jX2RpbW1fcHJpbnRlcik7CisJCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZ1czNtY19kcml2ZXIpOwogCX0KIH0KIAotbW9kdWxlX2luaXQoY2htY19pbml0KTsKLW1vZHVsZV9leGl0KGNobWNfY2xlYW51cCk7Cittb2R1bGVfaW5pdCh1czNtY19pbml0KTsKK21vZHVsZV9leGl0KHVzM21jX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jcHUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY3B1LmMKaW5kZXggMDA5N2MwOC4uMGM5YWM4MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jcHUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NwdS5jCkBAIC0xLDcgKzEsNyBAQAogLyogY3B1LmM6IERpbmt5IHJvdXRpbmVzIHRvIGxvb2sgZm9yIHRoZSBraW5kIG9mIFNwYXJjIGNwdQogICogICAgICAgIHdlIGFyZSBvbi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw1MyArMTksODYgQEAKIAogREVGSU5FX1BFUl9DUFUoY3B1aW5mb19zcGFyYywgX19jcHVfZGF0YSkgPSB7IDAgfTsKIAotc3RydWN0IGNwdV9pdV9pbmZvIHsKLSAgc2hvcnQgbWFudWY7Ci0gIHNob3J0IGltcGw7Ci0gIGNoYXIqIGNwdV9uYW1lOyAgIC8qIHNob3VsZCBiZSBlbm91Z2ggSSBob3BlLi4uICovCitzdHJ1Y3QgY3B1X2NoaXBfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQJbWFudWY7CisJdW5zaWduZWQgc2hvcnQJaW1wbDsKKwljb25zdCBjaGFyCSpjcHVfbmFtZTsKKwljb25zdCBjaGFyCSpmcF9uYW1lOwogfTsKIAotc3RydWN0IGNwdV9mcF9pbmZvIHsKLSAgc2hvcnQgbWFudWY7Ci0gIHNob3J0IGltcGw7Ci0gIGNoYXIgZnB1X3ZlcnM7Ci0gIGNoYXIqIGZwX25hbWU7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9jaGlwX2luZm8gY3B1X2NoaXBzW10gPSB7CisJeworCQkubWFudWYJCT0gMHgxNywKKwkJLmltcGwJCT0gMHgxMCwKKwkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSSAgIChTcGl0RmlyZSkiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIEkgaW50ZWdyYXRlZCBGUFUiLAorCX0sCisJeworCQkubWFudWYJCT0gMHgyMiwKKwkJLmltcGwJCT0gMHgxMCwKKwkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSSAgIChTcGl0RmlyZSkiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIEkgaW50ZWdyYXRlZCBGUFUiLAorCX0sCisJeworCQkubWFudWYJCT0gMHgxNywKKwkJLmltcGwJCT0gMHgxMSwKKwkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSUkgIChCbGFja0JpcmQpIiwKKwkJLmZwX25hbWUJPSAiVWx0cmFTcGFyYyBJSSBpbnRlZ3JhdGVkIEZQVSIsCisJfSwKKwl7CisJCS5tYW51ZgkJPSAweDE3LAorCQkuaW1wbAkJPSAweDEyLAorCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJSWkgKFNhYnJlKSIsCisJCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSUlpIGludGVncmF0ZWQgRlBVIiwKKwl9LAorCXsKKwkJLm1hbnVmCQk9IDB4MTcsCisJCS5pbXBsCQk9IDB4MTMsCisJCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElJZSAoSHVtbWluZ2JpcmQpIiwKKwkJLmZwX25hbWUJPSAiVWx0cmFTcGFyYyBJSWUgaW50ZWdyYXRlZCBGUFUiLAorCX0sCisJeworCQkubWFudWYJCT0gMHgzZSwKKwkJLmltcGwJCT0gMHgxNCwKKwkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSUlJIChDaGVldGFoKSIsCisJCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSUlJIGludGVncmF0ZWQgRlBVIiwKKwl9LAorCXsKKwkJLm1hbnVmCQk9IDB4M2UsCisJCS5pbXBsCQk9IDB4MTUsCisJCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElJSSsgKENoZWV0YWgrKSIsCisJCS5mcF9uYW1lCT0gIlVsdHJhU3BhcmMgSUlJKyBpbnRlZ3JhdGVkIEZQVSIsCisJfSwKKwl7CisJCS5tYW51ZgkJPSAweDNlLAorCQkuaW1wbAkJPSAweDE2LAorCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJSUlpIChKYWxhcGVubykiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElJSWkgaW50ZWdyYXRlZCBGUFUiLAorCX0sCisJeworCQkubWFudWYJCT0gMHgzZSwKKwkJLmltcGwJCT0gMHgxOCwKKwkJLmNwdV9uYW1lCT0gIlRJIFVsdHJhU3BhcmMgSVYgKEphZ3VhcikiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElWIGludGVncmF0ZWQgRlBVIiwKKwl9LAorCXsKKwkJLm1hbnVmCQk9IDB4M2UsCisJCS5pbXBsCQk9IDB4MTksCisJCS5jcHVfbmFtZQk9ICJUSSBVbHRyYVNwYXJjIElWKyAoUGFudGhlcikiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElWKyBpbnRlZ3JhdGVkIEZQVSIsCisJfSwKKwl7CisJCS5tYW51ZgkJPSAweDNlLAorCQkuaW1wbAkJPSAweDIyLAorCQkuY3B1X25hbWUJPSAiVEkgVWx0cmFTcGFyYyBJSUlpKyAoU2VycmFubykiLAorCQkuZnBfbmFtZQk9ICJVbHRyYVNwYXJjIElJSWkrIGludGVncmF0ZWQgRlBVIiwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBjcHVfZnBfaW5mbyBsaW51eF9zcGFyY19mcHVbXSA9IHsKLSAgeyAweDE3LCAweDEwLCAwLCAiVWx0cmFTcGFyYyBJIGludGVncmF0ZWQgRlBVIn0sCi0gIHsgMHgyMiwgMHgxMCwgMCwgIlVsdHJhU3BhcmMgSSBpbnRlZ3JhdGVkIEZQVSJ9LAotICB7IDB4MTcsIDB4MTEsIDAsICJVbHRyYVNwYXJjIElJIGludGVncmF0ZWQgRlBVIn0sCi0gIHsgMHgxNywgMHgxMiwgMCwgIlVsdHJhU3BhcmMgSUlpIGludGVncmF0ZWQgRlBVIn0sCi0gIHsgMHgxNywgMHgxMywgMCwgIlVsdHJhU3BhcmMgSUllIGludGVncmF0ZWQgRlBVIn0sCi0gIHsgMHgzZSwgMHgxNCwgMCwgIlVsdHJhU3BhcmMgSUlJIGludGVncmF0ZWQgRlBVIn0sCi0gIHsgMHgzZSwgMHgxNSwgMCwgIlVsdHJhU3BhcmMgSUlJKyBpbnRlZ3JhdGVkIEZQVSJ9LAotICB7IDB4M2UsIDB4MTYsIDAsICJVbHRyYVNwYXJjIElJSWkgaW50ZWdyYXRlZCBGUFUifSwKLSAgeyAweDNlLCAweDE4LCAwLCAiVWx0cmFTcGFyYyBJViBpbnRlZ3JhdGVkIEZQVSJ9LAotICB7IDB4M2UsIDB4MTksIDAsICJVbHRyYVNwYXJjIElWKyBpbnRlZ3JhdGVkIEZQVSJ9LAotICB7IDB4M2UsIDB4MjIsIDAsICJVbHRyYVNwYXJjIElJSWkrIGludGVncmF0ZWQgRlBVIn0sCi19OworI2RlZmluZSBOU1BBUkNDSElQUyBBUlJBWV9TSVpFKGxpbnV4X3NwYXJjX2NoaXBzKQogCi0jZGVmaW5lIE5TUEFSQ0ZQVSAgQVJSQVlfU0laRShsaW51eF9zcGFyY19mcHUpCi0KLXN0YXRpYyBzdHJ1Y3QgY3B1X2l1X2luZm8gbGludXhfc3BhcmNfY2hpcHNbXSA9IHsKLSAgeyAweDE3LCAweDEwLCAiVEkgVWx0cmFTcGFyYyBJICAgKFNwaXRGaXJlKSJ9LAotICB7IDB4MjIsIDB4MTAsICJUSSBVbHRyYVNwYXJjIEkgICAoU3BpdEZpcmUpIn0sCi0gIHsgMHgxNywgMHgxMSwgIlRJIFVsdHJhU3BhcmMgSUkgIChCbGFja0JpcmQpIn0sCi0gIHsgMHgxNywgMHgxMiwgIlRJIFVsdHJhU3BhcmMgSUlpIChTYWJyZSkifSwKLSAgeyAweDE3LCAweDEzLCAiVEkgVWx0cmFTcGFyYyBJSWUgKEh1bW1pbmdiaXJkKSJ9LAotICB7IDB4M2UsIDB4MTQsICJUSSBVbHRyYVNwYXJjIElJSSAoQ2hlZXRhaCkifSwKLSAgeyAweDNlLCAweDE1LCAiVEkgVWx0cmFTcGFyYyBJSUkrIChDaGVldGFoKykifSwKLSAgeyAweDNlLCAweDE2LCAiVEkgVWx0cmFTcGFyYyBJSUlpIChKYWxhcGVubykifSwKLSAgeyAweDNlLCAweDE4LCAiVEkgVWx0cmFTcGFyYyBJViAoSmFndWFyKSJ9LAotICB7IDB4M2UsIDB4MTksICJUSSBVbHRyYVNwYXJjIElWKyAoUGFudGhlcikifSwKLSAgeyAweDNlLCAweDIyLCAiVEkgVWx0cmFTcGFyYyBJSUlpKyAoU2VycmFubykifSwKLX07Ci0KLSNkZWZpbmUgTlNQQVJDQ0hJUFMgIEFSUkFZX1NJWkUobGludXhfc3BhcmNfY2hpcHMpCi0KLWNoYXIgKnNwYXJjX2NwdV90eXBlOwotY2hhciAqc3BhcmNfZnB1X3R5cGU7Citjb25zdCBjaGFyICpzcGFyY19jcHVfdHlwZTsKK2NvbnN0IGNoYXIgKnNwYXJjX2ZwdV90eXBlOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc3VuNHZfY3B1X3Byb2JlKHZvaWQpCiB7CkBAIC04OSw2OCArMTIyLDQ1IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBjcHVfcHJvYmUodm9pZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2NoaXBfaW5mbyAqIF9faW5pdCBmaW5kX2NwdV9jaGlwKHVuc2lnbmVkIHNob3J0IG1hbnVmLAorCQkJCQkJCSB1bnNpZ25lZCBzaG9ydCBpbXBsKQogewotCXVuc2lnbmVkIGxvbmcgdmVyLCBmcHVfdmVycywgbWFudWYsIGltcGwsIGZwcnM7CiAJaW50IGk7Ci0JCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVfY2hpcHMpOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGNwdV9jaGlwX2luZm8gKnAgPSAmY3B1X2NoaXBzW2ldOworCisJCWlmIChwLT5tYW51ZiA9PSBtYW51ZiAmJiBwLT5pbXBsID09IGltcGwpCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdV90eXBlX3Byb2JlKHZvaWQpCit7CiAJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKIAkJc3VuNHZfY3B1X3Byb2JlKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcHJzID0gZnByc19yZWFkKCk7Ci0JZnByc193cml0ZShGUFJTX0ZFRik7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyZHByICUldmVyLCAlMDsgc3R4ICUlZnNyLCBbJTFdIgotCQkJICAgICAgOiAiPSZyIiAodmVyKQotCQkJICAgICAgOiAiciIgKCZmcHVfdmVycykpOwotCWZwcnNfd3JpdGUoZnBycyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB2ZXIsIG1hbnVmLCBpbXBsOworCQljb25zdCBzdHJ1Y3QgY3B1X2NoaXBfaW5mbyAqcDsKIAkKLQltYW51ZiA9ICgodmVyID4+IDQ4KSAmIDB4ZmZmZik7Ci0JaW1wbCA9ICgodmVyID4+IDMyKSAmIDB4ZmZmZik7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZHByICUldmVyLCAlMCIgOiAiPXIiICh2ZXIpKTsKKwkKKwkJbWFudWYgPSAoKHZlciA+PiA0OCkgJiAweGZmZmYpOworCQlpbXBsID0gKCh2ZXIgPj4gMzIpICYgMHhmZmZmKTsKIAotCWZwdV92ZXJzID0gKChmcHVfdmVycyA+PiAxNykgJiAweDcpOwotCi1yZXRyeToKLQlmb3IgKGkgPSAwOyBpIDwgTlNQQVJDQ0hJUFM7IGkrKykgewotCQlpZiAobGludXhfc3BhcmNfY2hpcHNbaV0ubWFudWYgPT0gbWFudWYpIHsKLQkJCWlmIChsaW51eF9zcGFyY19jaGlwc1tpXS5pbXBsID09IGltcGwpIHsKLQkJCQlzcGFyY19jcHVfdHlwZSA9Ci0JCQkJCWxpbnV4X3NwYXJjX2NoaXBzW2ldLmNwdV9uYW1lOwotCQkJCWJyZWFrOwotCQkJfQorCQlwID0gZmluZF9jcHVfY2hpcChtYW51ZiwgaW1wbCk7CisJCWlmIChwKSB7CisJCQlzcGFyY19jcHVfdHlwZSA9IHAtPmNwdV9uYW1lOworCQkJc3BhcmNfZnB1X3R5cGUgPSBwLT5mcF9uYW1lOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDUFU6IFVua25vd24gY2hpcCwgbWFudWZbJWx4XSBpbXBsWyVseF1cbiIsCisJCQkgICAgICAgbWFudWYsIGltcGwpOworCQkJc3BhcmNfY3B1X3R5cGUgPSAiVW5rbm93biBDUFUiOworCQkJc3BhcmNfZnB1X3R5cGUgPSAiVW5rbm93biBGUFUiOwogCQl9CiAJfQotCi0JaWYgKGkgPT0gTlNQQVJDQ0hJUFMpIHsKLSAJCS8qIE1heWJlIGl0IGlzIGEgY2hlZXRhaCsgZGVyaXZhdGl2ZSwgcmVwb3J0IGl0IGFzIGNoZWV0YWgrCi0gCQkgKiBpbiB0aGF0IGNhc2UgdW50aWwgd2UgbGVhcm4gdGhlIHJlYWwgbmFtZXMuCi0gCQkgKi8KLSAJCWlmIChtYW51ZiA9PSAweDNlICYmCi0gCQkgICAgaW1wbCA+IDB4MTUpIHsKLSAJCQlpbXBsID0gMHgxNTsKLSAJCQlnb3RvIHJldHJ5OwotIAkJfSBlbHNlIHsKLSAJCQlwcmludGsoIkRFQlVHOiBtYW51ZlslbHhdIGltcGxbJWx4XVxuIiwKLSAJCQkgICAgICAgbWFudWYsIGltcGwpOwotIAkJfQotCQlzcGFyY19jcHVfdHlwZSA9ICJVbmtub3duIENQVSI7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5TUEFSQ0ZQVTsgaSsrKSB7Ci0JCWlmIChsaW51eF9zcGFyY19mcHVbaV0ubWFudWYgPT0gbWFudWYgJiYKLQkJICAgIGxpbnV4X3NwYXJjX2ZwdVtpXS5pbXBsID09IGltcGwpIHsKLQkJCWlmIChsaW51eF9zcGFyY19mcHVbaV0uZnB1X3ZlcnMgPT0gZnB1X3ZlcnMpIHsKLQkJCQlzcGFyY19mcHVfdHlwZSA9Ci0JCQkJCWxpbnV4X3NwYXJjX2ZwdVtpXS5mcF9uYW1lOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGkgPT0gTlNQQVJDRlBVKSB7Ci0gCQlwcmludGsoIkRFQlVHOiBtYW51ZlslbHhdIGltcGxbJWx4XSBmc3IudmVyc1slbHhdXG4iLAotIAkJICAgICAgIG1hbnVmLCBpbXBsLCBmcHVfdmVycyk7Ci0JCXNwYXJjX2ZwdV90eXBlID0gIlVua25vd24gRlBVIjsKLQl9CisJcmV0dXJuIDA7CiB9CisKK2FyY2hfaW5pdGNhbGwoY3B1X3R5cGVfcHJvYmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jCmluZGV4IGQwZmE1YWEuLmY1MmUwNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2RzLmMKQEAgLTEsNiArMSw2IEBACiAvKiBkcy5jOiBEb21haW4gU2VydmljZXMgZHJpdmVyIGZvciBMb2dpY2FsIERvbWFpbnMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgZHNfbWF0Y2hbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBfX2luaXRkYXRhIGRzX21hdGNoW10gPSB7CiAJewogCQkudHlwZSA9ICJkb21haW4tc2VydmljZXMtcG9ydCIsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMKaW5kZXggNjBkMzZkMS4uNzdkYmY2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMKQEAgLTEsNSArMSw0IEBACi0vKgotICogZWJ1cy5jOiBQQ0kgdG8gRUJ1cyBicmlkZ2UgZGV2aWNlLgorLyogZWJ1cy5jOiBFQlVTIERNQSBsaWJyYXJ5IGNvZGUuCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk3ICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKICAqIENvcHlyaWdodCAoQykgMTk5OSAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQpAQCAtOSwyNCArOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2VidXMuaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9icHAuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2VidXNfZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qIEVCVVMgZG1hIGxpYnJhcnkuICovCi0KICNkZWZpbmUgRUJETUFfQ1NSCTB4MDBVTAkvKiBDb250cm9sL1N0YXR1cyAqLwogI2RlZmluZSBFQkRNQV9BRERSCTB4MDRVTAkvKiBETUEgQWRkcmVzcyAqLwogI2RlZmluZSBFQkRNQV9DT1VOVAkweDA4VUwJLyogRE1BIENvdW50ICovCkBAIC0yNjgsMjgzICsyNTUsMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPmxvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZWJ1c19kbWFfZW5hYmxlKTsKLQotc3RydWN0IGxpbnV4X2VidXMgKmVidXNfY2hhaW4gPSBOVUxMOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmVidXNfYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0Jdm9pZCAqbWVtOwotCi0JbWVtID0ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1lbSkKLQkJcGFuaWMoImVidXNfYWxsb2M6IG91dCBvZiBtZW1vcnkiKTsKLQlyZXR1cm4gbWVtOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9lYnVzX2NoaWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCi0JCQkJICAgc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmRldiwKLQkJCQkgICBpbnQgbm9uX3N0YW5kYXJkX3JlZ3MpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqb3A7Ci0JY29uc3QgaW50ICpyZWdzOwotCWludCBpLCBsZW47Ci0KLQlkZXYtPnByb21fbm9kZSA9IGRwOwotCXByaW50aygiICglcykiLCBkcC0+bmFtZSk7Ci0KLQlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7Ci0JaWYgKCFyZWdzKQotCQlkZXYtPm51bV9hZGRycyA9IDA7Ci0JZWxzZQotCQlkZXYtPm51bV9hZGRycyA9IGxlbiAvIHNpemVvZihyZWdzWzBdKTsKLQotCWlmIChub25fc3RhbmRhcmRfcmVncykgewotCQkvKiBUaGlzIGlzIHRvIGhhbmRsZSByZWcgcHJvcGVydGllcyB3aGljaCBhcmUgbm90Ci0JCSAqIGluIHRoZSBwYXJlbnQgcmVsYXRpdmUgZm9ybWF0LiAgT25lIGV4YW1wbGUgYXJlCi0JCSAqIGNoaWxkcmVuIG9mIHRoZSBpMmMgZGV2aWNlIG9uIENvbXBhY3RQQ0kgc3lzdGVtcy4KLQkJICoKLQkJICogU28sIGZvciBzdWNoIGRldmljZXMgd2UganVzdCByZWNvcmQgdGhlIHByb3BlcnR5Ci0JCSAqIHJhdyBpbiB0aGUgY2hpbGQgcmVzb3VyY2VzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2FkZHJzOyBpKyspCi0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gcmVnc1tpXTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWRkcnM7IGkrKykgewotCQkJaW50IHJudW0gPSByZWdzW2ldOwotCQkJaWYgKHJudW0gPj0gZGV2LT5wYXJlbnQtPm51bV9hZGRycykgewotCQkJCXByb21fcHJpbnRmKCJVR0g6IHByb3BlcnR5IGZvciAlcyB3YXMgJWQsIG5lZWQgPCAlZFxuIiwKLQkJCQkJICAgIGRwLT5uYW1lLCBsZW4sIGRldi0+cGFyZW50LT5udW1fYWRkcnMpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IGRldi0+cGFyZW50LT5yZXNvdXJjZVtpXS5zdGFydDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kID0gZGV2LT5wYXJlbnQtPnJlc291cmNlW2ldLmVuZDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQkJCWRldi0+cmVzb3VyY2VbaV0ubmFtZSA9IGRwLT5uYW1lOwotCQl9Ci0JfQotCi0Jb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKLQlpZiAoIW9wKSB7Ci0JCWRldi0+bnVtX2lycXMgPSAwOwotCX0gZWxzZSB7Ci0JCWRldi0+bnVtX2lycXMgPSBvcC0+bnVtX2lycXM7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9pcnFzOyBpKyspCi0JCQlkZXYtPmlycXNbaV0gPSBvcC0+aXJxc1tpXTsKLQl9Ci0KLQlpZiAoIWRldi0+bnVtX2lycXMpIHsKLQkJLyoKLQkJICogT2gsIHdlbGwsIHNvbWUgUFJPTXMgZG9uJ3QgZXhwb3J0IGludGVycnVwdHMKLQkJICogcHJvcGVydHkgdG8gY2hpbGRyZW4gb2YgRUJ1cyBkZXZpY2VzLi4uCi0JCSAqCi0JCSAqIEJlIHNtYXJ0IGFib3V0IFBTLzIga2V5Ym9hcmQgYW5kIG1vdXNlLgotCQkgKi8KLQkJaWYgKCFzdHJjbXAoZGV2LT5wYXJlbnQtPnByb21fbm9kZS0+bmFtZSwgIjgwNDIiKSkgewotCQkJaWYgKCFzdHJjbXAoZGV2LT5wcm9tX25vZGUtPm5hbWUsICJrYl9wczIiKSkgewotCQkJCWRldi0+bnVtX2lycXMgPSAxOwotCQkJCWRldi0+aXJxc1swXSA9IGRldi0+cGFyZW50LT5pcnFzWzBdOwotCQkJfSBlbHNlIHsKLQkJCQlkZXYtPm51bV9pcnFzID0gMTsKLQkJCQlkZXYtPmlycXNbMF0gPSBkZXYtPnBhcmVudC0+aXJxc1sxXTsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgY2hpbGRfcmVnc19ub25zdGFuZGFyZChzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldikKLXsKLQlpZiAoIXN0cmNtcChkZXYtPnByb21fbm9kZS0+bmFtZSwgImkyYyIpIHx8Ci0JICAgICFzdHJjbXAoZGV2LT5wcm9tX25vZGUtPm5hbWUsICJTVU5XLGxvbWJ1cyIpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGZpbGxfZWJ1c19kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmNoaWxkOwotCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkOwotCXN0cnVjdCBvZl9kZXZpY2UgKm9wOwotCWludCBpLCBsZW47Ci0KLQlkZXYtPnByb21fbm9kZSA9IGRwOwotCi0JcHJpbnRrKCIgWyVzIiwgZHAtPm5hbWUpOwotCi0Jb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKLQlpZiAoIW9wKSB7Ci0JCWRldi0+bnVtX2FkZHJzID0gMDsKLQkJZGV2LT5udW1faXJxcyA9IDA7Ci0JfSBlbHNlIHsKLQkJY29uc3QgaW50ICpyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7Ci0KLQkJaWYgKCFyZWdzKQotCQkJbGVuID0gMDsKLQkJZGV2LT5udW1fYWRkcnMgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWRkcnM7IGkrKykKLQkJCW1lbWNweSgmZGV2LT5yZXNvdXJjZVtpXSwKLQkJCSAgICAgICAmb3AtPnJlc291cmNlW2ldLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKLQotCQlkZXYtPm51bV9pcnFzID0gb3AtPm51bV9pcnFzOwotCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1faXJxczsgaSsrKQotCQkJZGV2LT5pcnFzW2ldID0gb3AtPmlycXNbaV07Ci0JfQotCi0Jc2QgPSAmZGV2LT5vZmRldi5kZXYuYXJjaGRhdGE7Ci0Jc2QtPnByb21fbm9kZSA9IGRwOwotCXNkLT5vcCA9ICZkZXYtPm9mZGV2OwotCXNkLT5pb21tdSA9IGRldi0+YnVzLT5vZmRldi5kZXYucGFyZW50LT5hcmNoZGF0YS5pb21tdTsKLQlzZC0+c3RjID0gZGV2LT5idXMtPm9mZGV2LmRldi5wYXJlbnQtPmFyY2hkYXRhLnN0YzsKLQlzZC0+bnVtYV9ub2RlID0gZGV2LT5idXMtPm9mZGV2LmRldi5wYXJlbnQtPmFyY2hkYXRhLm51bWFfbm9kZTsKLQotCWRldi0+b2ZkZXYubm9kZSA9IGRwOwotCWRldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZkZXYtPmJ1cy0+b2ZkZXYuZGV2OwotCWRldi0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCWRldl9zZXRfbmFtZSgmZGV2LT5vZmRldi5kZXYsICJlYnVzWyUwOHhdIiwgZHAtPm5vZGUpOwotCi0JLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCi0JaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZGV2LT5vZmRldikgIT0gMCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQotCWRwID0gZHAtPmNoaWxkOwotCWlmIChkcCkgewotCQlwcmludGsoIiAtPiIpOwotCQlkZXYtPmNoaWxkcmVuID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKLQotCQljaGlsZCA9IGRldi0+Y2hpbGRyZW47Ci0JCWNoaWxkLT5uZXh0ID0gTlVMTDsKLQkJY2hpbGQtPnBhcmVudCA9IGRldjsKLQkJY2hpbGQtPmJ1cyA9IGRldi0+YnVzOwotCQlmaWxsX2VidXNfY2hpbGQoZHAsIGNoaWxkLAotCQkJCWNoaWxkX3JlZ3Nfbm9uc3RhbmRhcmQoZGV2KSk7Ci0KLQkJd2hpbGUgKChkcCA9IGRwLT5zaWJsaW5nKSAhPSBOVUxMKSB7Ci0JCQljaGlsZC0+bmV4dCA9IGVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkKSk7Ci0KLQkJCWNoaWxkID0gY2hpbGQtPm5leHQ7Ci0JCQljaGlsZC0+bmV4dCA9IE5VTEw7Ci0JCQljaGlsZC0+cGFyZW50ID0gZGV2OwotCQkJY2hpbGQtPmJ1cyA9IGRldi0+YnVzOwotCQkJZmlsbF9lYnVzX2NoaWxkKGRwLCBjaGlsZCwKLQkJCQkJY2hpbGRfcmVnc19ub25zdGFuZGFyZChkZXYpKTsKLQkJfQotCX0KLQlwcmludGsoIl0iKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpmaW5kX25leHRfZWJ1cyhzdHJ1Y3QgcGNpX2RldiAqc3RhcnQsIGludCAqaXNfcmlvX3ApCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBzdGFydDsKLQotCXdoaWxlICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU1VOLCBQQ0lfQU5ZX0lELCBwZGV2KSkpCi0JCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fRUJVUyB8fAotCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1JJT19FQlVTKQotCQkJYnJlYWs7Ci0KLQkqaXNfcmlvX3AgPSAhIShwZGV2ICYmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fUklPX0VCVVMpKTsKLQotCXJldHVybiBwZGV2OwotfQotCi12b2lkIF9faW5pdCBlYnVzX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCWludCBpc19yaW87Ci0JaW50IG51bV9lYnVzID0gMDsKLQotCXBkZXYgPSBmaW5kX25leHRfZWJ1cyhOVUxMLCAmaXNfcmlvKTsKLQlpZiAoIXBkZXYpIHsKLQkJcHJpbnRrKCJlYnVzOiBObyBFQnVzJ3MgZm91bmQuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCi0JZWJ1c19jaGFpbiA9IGVidXMgPSBlYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1cykpOwotCWVidXMtPm5leHQgPSBOVUxMOwotCWVidXMtPmlzX3JpbyA9IGlzX3JpbzsKLQotCXdoaWxlIChkcCkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOwotCi0JCS8qIFNVTlcscGNpLXFmZSB1c2VzIGZvdXIgZW1wdHkgZWJ1c2VzIG9uIGl0LgotCQkgICBJIHRoaW5rIHdlIHNob3VsZCBub3QgY29uc2lkZXIgdGhlbSBoZXJlLAotCQkgICBhcyB0aGV5IGhhdmUgaGFsZiBvZiB0aGUgcHJvcGVydGllcyB0aGlzCi0JCSAgIGNvZGUgZXhwZWN0cyBhbmQgb25jZSB3ZSBkbyBQQ0kgaG90LXBsdWcsCi0JCSAgIHdlJ2QgaGF2ZSB0byB0d2VhayB3aXRoIHRoZSBlYnVzX2NoYWluCi0JCSAgIGluIHRoZSBydW50aW1lIGFmdGVyIGluaXRpYWxpemF0aW9uLiAtamogKi8KLQkJaWYgKCFkcC0+Y2hpbGQpIHsKLQkJCXBkZXYgPSBmaW5kX25leHRfZWJ1cyhwZGV2LCAmaXNfcmlvKTsKLQkJCWlmICghcGRldikgewotCQkJCWlmIChlYnVzID09IGVidXNfY2hhaW4pIHsKLQkJCQkJZWJ1c19jaGFpbiA9IE5VTEw7Ci0JCQkJCXByaW50aygiZWJ1czogTm8gRUJ1cydzIGZvdW5kLlxuIik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllYnVzLT5pc19yaW8gPSBpc19yaW87Ci0JCQlkcCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXByaW50aygiZWJ1cyVkOiIsIG51bV9lYnVzKTsKLQotCQllYnVzLT5pbmRleCA9IG51bV9lYnVzOwotCQllYnVzLT5wcm9tX25vZGUgPSBkcDsKLQkJZWJ1cy0+c2VsZiA9IHBkZXY7Ci0KLQkJZWJ1cy0+b2ZkZXYubm9kZSA9IGRwOwotCQllYnVzLT5vZmRldi5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKLQkJZWJ1cy0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCQlkZXZfc2V0X25hbWUoJmVidXMtPm9mZGV2LmRldiwgImVidXMlZCIsIG51bV9lYnVzKTsKLQotCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KLQkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZWJ1cy0+b2ZkZXYpICE9IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQotCi0JCWNoaWxkID0gZHAtPmNoaWxkOwotCQlpZiAoIWNoaWxkKQotCQkJZ290byBuZXh0X2VidXM7Ci0KLQkJZWJ1cy0+ZGV2aWNlcyA9IGVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSkpOwotCi0JCWRldiA9IGVidXMtPmRldmljZXM7Ci0JCWRldi0+bmV4dCA9IE5VTEw7Ci0JCWRldi0+Y2hpbGRyZW4gPSBOVUxMOwotCQlkZXYtPmJ1cyA9IGVidXM7Ci0JCWZpbGxfZWJ1c19kZXZpY2UoY2hpbGQsIGRldik7Ci0KLQkJd2hpbGUgKChjaGlsZCA9IGNoaWxkLT5zaWJsaW5nKSAhPSBOVUxMKSB7Ci0JCQlkZXYtPm5leHQgPSBlYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UpKTsKLQotCQkJZGV2ID0gZGV2LT5uZXh0OwotCQkJZGV2LT5uZXh0ID0gTlVMTDsKLQkJCWRldi0+Y2hpbGRyZW4gPSBOVUxMOwotCQkJZGV2LT5idXMgPSBlYnVzOwotCQkJZmlsbF9lYnVzX2RldmljZShjaGlsZCwgZGV2KTsKLQkJfQotCi0JbmV4dF9lYnVzOgotCQlwcmludGsoIlxuIik7Ci0KLQkJcGRldiA9IGZpbmRfbmV4dF9lYnVzKHBkZXYsICZpc19yaW8pOwotCQlpZiAoIXBkZXYpCi0JCQlicmVhazsKLQotCQlkcCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQotCQllYnVzLT5uZXh0ID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXMpKTsKLQkJZWJ1cyA9IGVidXMtPm5leHQ7Ci0JCWVidXMtPm5leHQgPSBOVUxMOwotCQllYnVzLT5pc19yaW8gPSBpc19yaW87Ci0JCSsrbnVtX2VidXM7Ci0JfQotCXBjaV9kZXZfcHV0KHBkZXYpOyAvKiBYWFggZm9yIHRoZSBjYXNlLCB3aGVuIGVidXNuZCBpcyAwLCBpcyBpdCBPSz8gKi8KLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuaCBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuaAppbmRleCBmYzI5NGEyLi4zNGQ3YWI1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LmgKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5oCkBAIC01LDggKzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi1leHRlcm4gY2hhciAqc3BhcmNfY3B1X3R5cGU7Ci1leHRlcm4gY2hhciAqc3BhcmNfZnB1X3R5cGU7CitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfY3B1X3R5cGU7CitleHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZnB1X3R5cGU7CiAKIGV4dGVybiB2b2lkIF9faW5pdCBwZXJfY3B1X3BhdGNoKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHN1bjR2X3BhdGNoKHZvaWQpOwpAQCAtMjIsNyArMjIsOCBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nIG9yaWdfaTAsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGhyZWFkX2luZm9fZmxhZ3MpOwogCi1leHRlcm4gYXNtbGlua2FnZSBpbnQgc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHN5c2NhbGxfZXhpdF9wKTsKK2V4dGVybiBhc21saW5rYWdlIGludCBzeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZV9sZWF2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGV4dGVybiB2b2lkIGJhZF90cmFwX3RsMShzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBsdmwpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCmluZGV4IGM5YWZlZjAuLjM1MzIyNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9odmFwaS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9odmFwaS5jCmluZGV4IDY5MTc2MGIuLjFkMjcyYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZhcGkuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2YXBpLmMKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9zc3RhdGUuaD4KIAogLyogSWYgdGhlIGh5cGVydmlzb3IgaW5kaWNhdGVzIHRoYXQgdGhlIEFQSSBzZXR0aW5nCiAgKiBjYWxscyBhcmUgdW5zdXBwb3J0ZWQsIGJ5IHJldHVybmluZyBIVl9FQkFEVFJBUCBvcgpAQCAtMTg0LDggKzE4Myw2IEBACiAJaWYgKHN1bjR2X2h2YXBpX3JlZ2lzdGVyKGdyb3VwLCBtYWpvciwgJm1pbm9yKSkKIAkJZ290byBiYWQ7CiAKLQlzdW40dl9zc3RhdGVfaW5pdCgpOwotCiAJcmV0dXJuOwogCiBiYWQ6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2Y2FsbHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZjYWxscy5TCmluZGV4IGEyODEwZjMuLmUwNjYyNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZjYWxscy5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZjYWxscy5TCkBAIC0zLDg5ICszLDc1IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3lzaW5vCiAJICovCi0JLmdsb2JsCXN1bjR2X2Rldmlub190b19zeXNpbm8KLQkudHlwZQlzdW40dl9kZXZpbm9fdG9fc3lzaW5vLCNmdW5jdGlvbgotc3VuNHZfZGV2aW5vX3RvX3N5c2lubzoKK0VOVFJZKHN1bjR2X2Rldmlub190b19zeXNpbm8pCiAJbW92CUhWX0ZBU1RfSU5UUl9ERVZJTk8yU1lTSU5PLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzEsICVvMAotCS5zaXplCXN1bjR2X2Rldmlub190b19zeXNpbm8sIC4tc3VuNHZfZGV2aW5vX3RvX3N5c2lubworRU5EUFJPQyhzdW40dl9kZXZpbm9fdG9fc3lzaW5vKQogCiAJLyogJW8wOiBzeXNpbm8KIAkgKgogCSAqIHJldHVybnMgJW8wOiBpbnRyX2VuYWJsZWQgKEhWX0lOVFJfe0RJU0FCTEVELEVOQUJMRUR9KQogCSAqLwotCS5nbG9ibAlzdW40dl9pbnRyX2dldGVuYWJsZWQKLQkudHlwZQlzdW40dl9pbnRyX2dldGVuYWJsZWQsI2Z1bmN0aW9uCi1zdW40dl9pbnRyX2dldGVuYWJsZWQ6CitFTlRSWShzdW40dl9pbnRyX2dldGVuYWJsZWQpCiAJbW92CUhWX0ZBU1RfSU5UUl9HRVRFTkFCTEVELCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzEsICVvMAotCS5zaXplCXN1bjR2X2ludHJfZ2V0ZW5hYmxlZCwgLi1zdW40dl9pbnRyX2dldGVuYWJsZWQKK0VORFBST0Moc3VuNHZfaW50cl9nZXRlbmFibGVkKQogCiAJLyogJW8wOiBzeXNpbm8KIAkgKiAlbzE6IGludHJfZW5hYmxlZCAoSFZfSU5UUl97RElTQUJMRUQsRU5BQkxFRH0pCiAJICovCi0JLmdsb2JsCXN1bjR2X2ludHJfc2V0ZW5hYmxlZAotCS50eXBlCXN1bjR2X2ludHJfc2V0ZW5hYmxlZCwjZnVuY3Rpb24KLXN1bjR2X2ludHJfc2V0ZW5hYmxlZDoKK0VOVFJZKHN1bjR2X2ludHJfc2V0ZW5hYmxlZCkKIAltb3YJSFZfRkFTVF9JTlRSX1NFVEVOQUJMRUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfaW50cl9zZXRlbmFibGVkLCAuLXN1bjR2X2ludHJfc2V0ZW5hYmxlZAorRU5EUFJPQyhzdW40dl9pbnRyX3NldGVuYWJsZWQpCiAKIAkvKiAlbzA6IHN5c2lubwogCSAqCiAJICogcmV0dXJucyAlbzA6IGludHJfc3RhdGUgKEhWX0lOVFJfU1RBVEVfKikKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfaW50cl9nZXRzdGF0ZQotCS50eXBlCXN1bjR2X2ludHJfZ2V0c3RhdGUsI2Z1bmN0aW9uCi1zdW40dl9pbnRyX2dldHN0YXRlOgorRU5UUlkoc3VuNHZfaW50cl9nZXRzdGF0ZSkKIAltb3YJSFZfRkFTVF9JTlRSX0dFVFNUQVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzEsICVvMAotCS5zaXplCXN1bjR2X2ludHJfZ2V0c3RhdGUsIC4tc3VuNHZfaW50cl9nZXRzdGF0ZQorRU5EUFJPQyhzdW40dl9pbnRyX2dldHN0YXRlKQogCiAJLyogJW8wOiBzeXNpbm8KIAkgKiAlbzE6IGludHJfc3RhdGUgKEhWX0lOVFJfU1RBVEVfKikKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfaW50cl9zZXRzdGF0ZQotCS50eXBlCXN1bjR2X2ludHJfc2V0c3RhdGUsI2Z1bmN0aW9uCi1zdW40dl9pbnRyX3NldHN0YXRlOgorRU5UUlkoc3VuNHZfaW50cl9zZXRzdGF0ZSkKIAltb3YJSFZfRkFTVF9JTlRSX1NFVFNUQVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2ludHJfc2V0c3RhdGUsIC4tc3VuNHZfaW50cl9zZXRzdGF0ZQorRU5EUFJPQyhzdW40dl9pbnRyX3NldHN0YXRlKQogCiAJLyogJW8wOiBzeXNpbm8KIAkgKgogCSAqIHJldHVybnMgJW8wOiBjcHVpZAogCSAqLwotCS5nbG9ibAlzdW40dl9pbnRyX2dldHRhcmdldAotCS50eXBlCXN1bjR2X2ludHJfZ2V0dGFyZ2V0LCNmdW5jdGlvbgotc3VuNHZfaW50cl9nZXR0YXJnZXQ6CitFTlRSWShzdW40dl9pbnRyX2dldHRhcmdldCkKIAltb3YJSFZfRkFTVF9JTlRSX0dFVFRBUkdFVCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBtb3YJJW8xLCAlbzAKLQkuc2l6ZQlzdW40dl9pbnRyX2dldHRhcmdldCwgLi1zdW40dl9pbnRyX2dldHRhcmdldAorRU5EUFJPQyhzdW40dl9pbnRyX2dldHRhcmdldCkKIAogCS8qICVvMDogc3lzaW5vCiAJICogJW8xOiBjcHVpZAogCSAqLwotCS5nbG9ibAlzdW40dl9pbnRyX3NldHRhcmdldAotCS50eXBlCXN1bjR2X2ludHJfc2V0dGFyZ2V0LCNmdW5jdGlvbgotc3VuNHZfaW50cl9zZXR0YXJnZXQ6CitFTlRSWShzdW40dl9pbnRyX3NldHRhcmdldCkKIAltb3YJSFZfRkFTVF9JTlRSX1NFVFRBUkdFVCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9pbnRyX3NldHRhcmdldCwgLi1zdW40dl9pbnRyX3NldHRhcmdldAorRU5EUFJPQyhzdW40dl9pbnRyX3NldHRhcmdldCkKIAogCS8qICVvMDoJY3B1aWQKIAkgKiAlbzE6IHBjCkBAIC05NCwzNyArODAsMzEgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfY3B1X3N0YXJ0Ci0JLnR5cGUJc3VuNHZfY3B1X3N0YXJ0LCNmdW5jdGlvbgotc3VuNHZfY3B1X3N0YXJ0OgorRU5UUlkoc3VuNHZfY3B1X3N0YXJ0KQogCW1vdglIVl9GQVNUX0NQVV9TVEFSVCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9jcHVfc3RhcnQsIC4tc3VuNHZfY3B1X3N0YXJ0CitFTkRQUk9DKHN1bjR2X2NwdV9zdGFydCkKIAogCS8qICVvMDoJY3B1aWQKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfY3B1X3N0b3AKLQkudHlwZQlzdW40dl9jcHVfc3RvcCwjZnVuY3Rpb24KLXN1bjR2X2NwdV9zdG9wOgorRU5UUlkoc3VuNHZfY3B1X3N0b3ApCiAJbW92CUhWX0ZBU1RfQ1BVX1NUT1AsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfY3B1X3N0b3AsIC4tc3VuNHZfY3B1X3N0b3AKK0VORFBST0Moc3VuNHZfY3B1X3N0b3ApCiAKIAkvKiByZXR1cm5zICVvMDoJc3RhdHVzICAqLwotCS5nbG9ibAlzdW40dl9jcHVfeWllbGQKLQkudHlwZQlzdW40dl9jcHVfeWllbGQsICNmdW5jdGlvbgotc3VuNHZfY3B1X3lpZWxkOgorRU5UUlkoc3VuNHZfY3B1X3lpZWxkKQogCW1vdglIVl9GQVNUX0NQVV9ZSUVMRCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9jcHVfeWllbGQsIC4tc3VuNHZfY3B1X3lpZWxkCitFTkRQUk9DKHN1bjR2X2NwdV95aWVsZCkKIAogCS8qICVvMDoJdHlwZQogCSAqICVvMToJcXVldWUgcGFkZHIKQEAgLTEzMiwxNCArMTEyLDEyIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDoJc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X2NwdV9xY29uZgotCS50eXBlCXN1bjR2X2NwdV9xY29uZiwjZnVuY3Rpb24KLXN1bjR2X2NwdV9xY29uZjoKK0VOVFJZKHN1bjR2X2NwdV9xY29uZikKIAltb3YJSFZfRkFTVF9DUFVfUUNPTkYsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfY3B1X3Fjb25mLCAuLXN1bjR2X2NwdV9xY29uZgorRU5EUFJPQyhzdW40dl9jcHVfcWNvbmYpCiAKIAkvKiAlbzA6CW51bSBjcHVzIGluIGNwdSBsaXN0CiAJICogJW8xOgljcHUgbGlzdCBwYWRkcgpAQCAtMTQ3LDIzICsxMjUsMTkgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfY3B1X21vbmRvX3NlbmQKLQkudHlwZQlzdW40dl9jcHVfbW9uZG9fc2VuZCwjZnVuY3Rpb24KLXN1bjR2X2NwdV9tb25kb19zZW5kOgorRU5UUlkoc3VuNHZfY3B1X21vbmRvX3NlbmQpCiAJbW92CUhWX0ZBU1RfQ1BVX01PTkRPX1NFTkQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfY3B1X21vbmRvX3NlbmQsIC4tc3VuNHZfY3B1X21vbmRvX3NlbmQKK0VORFBST0Moc3VuNHZfY3B1X21vbmRvX3NlbmQpCiAKIAkvKiAlbzA6CUNQVSBJRAogCSAqCiAJICogcmV0dXJucyAlbzA6CS1zdGF0dXMgaWYgc3RhdHVzIG5vbi16ZXJvLCBlbHNlCiAJICogICAgICAgICAlbzA6CWNwdSBzdGF0ZSBhcyBIVl9DUFVfU1RBVEVfKgogCSAqLwotCS5nbG9ibAlzdW40dl9jcHVfc3RhdGUKLQkudHlwZQlzdW40dl9jcHVfc3RhdGUsI2Z1bmN0aW9uCi1zdW40dl9jcHVfc3RhdGU6CitFTlRSWShzdW40dl9jcHVfc3RhdGUpCiAJbW92CUhWX0ZBU1RfQ1BVX1NUQVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlicm56LHBuCSVvMCwgMWYKQEAgLTE3MSw3ICsxNDUsNyBAQAogCW1vdgklbzEsICVvMAogMToJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9jcHVfc3RhdGUsIC4tc3VuNHZfY3B1X3N0YXRlCitFTkRQUk9DKHN1bjR2X2NwdV9zdGF0ZSkKIAogCS8qICVvMDogdmlydHVhbCBhZGRyZXNzCiAJICogJW8xOiBtdXN0IGJlIHplcm8KQEAgLTE4MCwyOCArMTU0LDI0IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X21tdV9tYXBfcGVybV9hZGRyCi0JLnR5cGUJc3VuNHZfbW11X21hcF9wZXJtX2FkZHIsI2Z1bmN0aW9uCi1zdW40dl9tbXVfbWFwX3Blcm1fYWRkcjoKK0VOVFJZKHN1bjR2X21tdV9tYXBfcGVybV9hZGRyKQogCW1vdglIVl9GQVNUX01NVV9NQVBfUEVSTV9BRERSLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X21tdV9tYXBfcGVybV9hZGRyLCAuLXN1bjR2X21tdV9tYXBfcGVybV9hZGRyCitFTkRQUk9DKHN1bjR2X21tdV9tYXBfcGVybV9hZGRyKQogCiAJLyogJW8wOiBudW1iZXIgb2YgVFNCIGRlc2NyaXB0aW9ucwogCSAqICVvMTogVFNCIGRlc2NyaXB0aW9ucyByZWFsIGFkZHJlc3MKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbW11X3RzYl9jdHgwCi0JLnR5cGUJc3VuNHZfbW11X3RzYl9jdHgwLCNmdW5jdGlvbgotc3VuNHZfbW11X3RzYl9jdHgwOgorRU5UUlkoc3VuNHZfbW11X3RzYl9jdHgwKQogCW1vdglIVl9GQVNUX01NVV9UU0JfQ1RYMCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9tbXVfdHNiX2N0eDAsIC4tc3VuNHZfbW11X3RzYl9jdHgwCitFTkRQUk9DKHN1bjR2X21tdV90c2JfY3R4MCkKIAogCS8qICVvMDoJQVBJIGdyb3VwIG51bWJlcgogCSAqICVvMTogcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIG1ham9yIG51bWJlciBzdG9yYWdlCkBAIC0yMDksOSArMTc5LDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfZ2V0X3ZlcnNpb24KLQkudHlwZQlzdW40dl9nZXRfdmVyc2lvbiwjZnVuY3Rpb24KLXN1bjR2X2dldF92ZXJzaW9uOgorRU5UUlkoc3VuNHZfZ2V0X3ZlcnNpb24pCiAJbW92CUhWX0NPUkVfR0VUX1ZFUiwgJW81CiAJbW92CSVvMSwgJW8zCiAJbW92CSVvMiwgJW80CkBAIC0yMTksNyArMTg3LDcgQEAKIAlzdHgJJW8xLCBbJW8zXQogCXJldGwKIAkgc3R4CSVvMiwgWyVvNF0KLQkuc2l6ZQlzdW40dl9nZXRfdmVyc2lvbiwgLi1zdW40dl9nZXRfdmVyc2lvbgorRU5EUFJPQyhzdW40dl9nZXRfdmVyc2lvbikKIAogCS8qICVvMDogQVBJIGdyb3VwIG51bWJlcgogCSAqICVvMTogZGVzaXJlZCBtYWpvciBudW1iZXIKQEAgLTIyOCw1MSArMTk2LDQzIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X3NldF92ZXJzaW9uCi0JLnR5cGUJc3VuNHZfc2V0X3ZlcnNpb24sI2Z1bmN0aW9uCi1zdW40dl9zZXRfdmVyc2lvbjoKK0VOVFJZKHN1bjR2X3NldF92ZXJzaW9uKQogCW1vdglIVl9DT1JFX1NFVF9WRVIsICVvNQogCW1vdgklbzMsICVvNAogCXRhCUhWX0NPUkVfVFJBUAogCXJldGwKIAkgc3R4CSVvMSwgWyVvNF0KLQkuc2l6ZQlzdW40dl9zZXRfdmVyc2lvbiwgLi1zdW40dl9zZXRfdmVyc2lvbgorRU5EUFJPQyhzdW40dl9zZXRfdmVyc2lvbikKIAogCS8qICVvMDogcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIHRpbWUKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfdG9kX2dldAotCS50eXBlCXN1bjR2X3RvZF9nZXQsI2Z1bmN0aW9uCi1zdW40dl90b2RfZ2V0OgorRU5UUlkoc3VuNHZfdG9kX2dldCkKIAltb3YJJW8wLCAlbzQKIAltb3YJSFZfRkFTVF9UT0RfR0VULCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfdG9kX2dldCwgLi1zdW40dl90b2RfZ2V0CitFTkRQUk9DKHN1bjR2X3RvZF9nZXQpCiAKIAkvKiAlbzA6IHRpbWUKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfdG9kX3NldAotCS50eXBlCXN1bjR2X3RvZF9zZXQsI2Z1bmN0aW9uCi1zdW40dl90b2Rfc2V0OgorRU5UUlkoc3VuNHZfdG9kX3NldCkKIAltb3YJSFZfRkFTVF9UT0RfU0VULCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3RvZF9zZXQsIC4tc3VuNHZfdG9kX3NldAorRU5EUFJPQyhzdW40dl90b2Rfc2V0KQogCiAJLyogJW8wOiBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgc3RhdHVzCiAJICoKIAkgKiByZXR1cm5zICVvMDogc2lnbmVkIGNoYXJhY3RlcgogCSAqLwotCS5nbG9ibAlzdW40dl9jb25fZ2V0Y2hhcgotCS50eXBlCXN1bjR2X2Nvbl9nZXRjaGFyLCNmdW5jdGlvbgotc3VuNHZfY29uX2dldGNoYXI6CitFTlRSWShzdW40dl9jb25fZ2V0Y2hhcikKIAltb3YJJW8wLCAlbzQKIAltb3YJSFZfRkFTVF9DT05TX0dFVENIQVIsICVvNQogCWNscgklbzAKQEAgLTI4MSwyMCArMjQxLDE4IEBACiAJc3R4CSVvMCwgWyVvNF0KIAlyZXRsCiAJIHNyYQklbzEsIDAsICVvMAotCS5zaXplCXN1bjR2X2Nvbl9nZXRjaGFyLCAuLXN1bjR2X2Nvbl9nZXRjaGFyCitFTkRQUk9DKHN1bjR2X2Nvbl9nZXRjaGFyKQogCiAJLyogJW8wOiBzaWduZWQgbG9uZyBjaGFyYWN0ZXIKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfY29uX3B1dGNoYXIKLQkudHlwZQlzdW40dl9jb25fcHV0Y2hhciwjZnVuY3Rpb24KLXN1bjR2X2Nvbl9wdXRjaGFyOgorRU5UUlkoc3VuNHZfY29uX3B1dGNoYXIpCiAJbW92CUhWX0ZBU1RfQ09OU19QVVRDSEFSLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIHNyYQklbzAsIDAsICVvMAotCS5zaXplCXN1bjR2X2Nvbl9wdXRjaGFyLCAuLXN1bjR2X2Nvbl9wdXRjaGFyCitFTkRQUk9DKHN1bjR2X2Nvbl9wdXRjaGFyKQogCiAJLyogJW8wOiBidWZmZXIgcmVhbCBhZGRyZXNzCiAJICogJW8xOiBidWZmZXIgc2l6ZQpAQCAtMzAyLDkgKzI2MCw3IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X2Nvbl9yZWFkCi0JLnR5cGUJc3VuNHZfY29uX3JlYWQsI2Z1bmN0aW9uCi1zdW40dl9jb25fcmVhZDoKK0VOVFJZKHN1bjR2X2Nvbl9yZWFkKQogCW1vdgklbzIsICVvNAogCW1vdglIVl9GQVNUX0NPTlNfUkVBRCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCkBAIC0zMTgsNyArMjc0LDcgQEAKIAlzdHgJJW8xLCBbJW80XQogMToJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9jb25fcmVhZCwgLi1zdW40dl9jb25fcmVhZAorRU5EUFJPQyhzdW40dl9jb25fcmVhZCkKIAogCS8qICVvMDogYnVmZmVyIHJlYWwgYWRkcmVzcwogCSAqICVvMTogYnVmZmVyIHNpemUKQEAgLTMyNiw0MyArMjgyLDM3IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X2Nvbl93cml0ZQotCS50eXBlCXN1bjR2X2Nvbl93cml0ZSwjZnVuY3Rpb24KLXN1bjR2X2Nvbl93cml0ZToKK0VOVFJZKHN1bjR2X2Nvbl93cml0ZSkKIAltb3YJJW8yLCAlbzQKIAltb3YJSFZfRkFTVF9DT05TX1dSSVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfY29uX3dyaXRlLCAuLXN1bjR2X2Nvbl93cml0ZQorRU5EUFJPQyhzdW40dl9jb25fd3JpdGUpCiAKIAkvKiAlbzA6CXNvZnQgc3RhdGUKIAkgKiAlbzE6CWFkZHJlc3Mgb2YgZGVzY3JpcHRpb24gc3RyaW5nCiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X21hY2hfc2V0X3NvZnRfc3RhdGUKLQkudHlwZQlzdW40dl9tYWNoX3NldF9zb2Z0X3N0YXRlLCNmdW5jdGlvbgotc3VuNHZfbWFjaF9zZXRfc29mdF9zdGF0ZToKK0VOVFJZKHN1bjR2X21hY2hfc2V0X3NvZnRfc3RhdGUpCiAJbW92CUhWX0ZBU1RfTUFDSF9TRVRfU09GVF9TVEFURSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9tYWNoX3NldF9zb2Z0X3N0YXRlLCAuLXN1bjR2X21hY2hfc2V0X3NvZnRfc3RhdGUKK0VORFBST0Moc3VuNHZfbWFjaF9zZXRfc29mdF9zdGF0ZSkKIAogCS8qICVvMDogZXhpdCBjb2RlCiAJICoKIAkgKiBEb2VzIG5vdCByZXR1cm4uCiAJICovCi0JLmdsb2JsCXN1bjR2X21hY2hfZXhpdAotCS50eXBlCXN1bjR2X21hY2hfZXhpdCwjZnVuY3Rpb24KLXN1bjR2X21hY2hfZXhpdDoKK0VOVFJZKHN1bjR2X21hY2hfZXhpdCkKIAltb3YJSFZfRkFTVF9NQUNIX0VYSVQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbWFjaF9leGl0LCAuLXN1bjR2X21hY2hfZXhpdAorRU5EUFJPQyhzdW40dl9tYWNoX2V4aXQpCiAKIAkvKiAlbzA6IGJ1ZmZlciByZWFsIGFkZHJlc3MKIAkgKiAlbzE6IGJ1ZmZlciBsZW5ndGgKQEAgLTM3MCw0NCArMzIwLDM4IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X21hY2hfZGVzYwotCS50eXBlCXN1bjR2X21hY2hfZGVzYywjZnVuY3Rpb24KLXN1bjR2X21hY2hfZGVzYzoKK0VOVFJZKHN1bjR2X21hY2hfZGVzYykKIAltb3YJJW8yLCAlbzQKIAltb3YJSFZfRkFTVF9NQUNIX0RFU0MsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslbzRdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9tYWNoX2Rlc2MsIC4tc3VuNHZfbWFjaF9kZXNjCitFTkRQUk9DKHN1bjR2X21hY2hfZGVzYykKIAogCS8qICVvMDogbmV3IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCiAJICogJW8xOiBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgb3JpZ190aW1lb3V0CiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X21hY2hfc2V0X3dhdGNoZG9nCi0JLnR5cGUJc3VuNHZfbWFjaF9zZXRfd2F0Y2hkb2csI2Z1bmN0aW9uCi1zdW40dl9tYWNoX3NldF93YXRjaGRvZzoKK0VOVFJZKHN1bjR2X21hY2hfc2V0X3dhdGNoZG9nKQogCW1vdgklbzEsICVvNAogCW1vdglIVl9GQVNUX01BQ0hfU0VUX1dBVENIRE9HLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbWFjaF9zZXRfd2F0Y2hkb2csIC4tc3VuNHZfbWFjaF9zZXRfd2F0Y2hkb2cKK0VORFBST0Moc3VuNHZfbWFjaF9zZXRfd2F0Y2hkb2cpCiAKIAkvKiBObyBpbnB1dHMgYW5kIGRvZXMgbm90IHJldHVybi4gICovCi0JLmdsb2JsCXN1bjR2X21hY2hfc2lyCi0JLnR5cGUJc3VuNHZfbWFjaF9zaXIsI2Z1bmN0aW9uCi1zdW40dl9tYWNoX3NpcjoKK0VOVFJZKHN1bjR2X21hY2hfc2lyKQogCW1vdgklbzEsICVvNAogCW1vdglIVl9GQVNUX01BQ0hfU0lSLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbWFjaF9zaXIsIC4tc3VuNHZfbWFjaF9zaXIKK0VORFBST0Moc3VuNHZfbWFjaF9zaXIpCiAKIAkvKiAlbzA6IGNoYW5uZWwKIAkgKiAlbzE6CXJhCkBAIC00MTUsMTQgKzM1OSwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfdHhfcWNvbmYKLQkudHlwZQlzdW40dl9sZGNfdHhfcWNvbmYsI2Z1bmN0aW9uCi1zdW40dl9sZGNfdHhfcWNvbmY6CitFTlRSWShzdW40dl9sZGNfdHhfcWNvbmYpCiAJbW92CUhWX0ZBU1RfTERDX1RYX1FDT05GLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2xkY190eF9xY29uZiwgLi1zdW40dl9sZGNfdHhfcWNvbmYKK0VORFBST0Moc3VuNHZfbGRjX3R4X3Fjb25mKQogCiAJLyogJW8wOiBjaGFubmVsCiAJICogJW8xOglwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgcmEKQEAgLTQzMCw5ICszNzIsNyBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfdHhfcWluZm8KLQkudHlwZQlzdW40dl9sZGNfdHhfcWluZm8sI2Z1bmN0aW9uCi1zdW40dl9sZGNfdHhfcWluZm86CitFTlRSWShzdW40dl9sZGNfdHhfcWluZm8pCiAJbW92CSVvMSwgJWcxCiAJbW92CSVvMiwgJWcyCiAJbW92CUhWX0ZBU1RfTERDX1RYX1FJTkZPLCAlbzUKQEAgLTQ0MSw3ICszODEsNyBAQAogCXN0eAklbzIsIFslZzJdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfdHhfcWluZm8sIC4tc3VuNHZfbGRjX3R4X3FpbmZvCitFTkRQUk9DKHN1bjR2X2xkY190eF9xaW5mbykKIAogCS8qICVvMDogY2hhbm5lbAogCSAqICVvMToJcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGhlYWRfb2ZmCkBAIC00NTAsOSArMzkwLDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX3R4X2dldF9zdGF0ZQotCS50eXBlCXN1bjR2X2xkY190eF9nZXRfc3RhdGUsI2Z1bmN0aW9uCi1zdW40dl9sZGNfdHhfZ2V0X3N0YXRlOgorRU5UUlkoc3VuNHZfbGRjX3R4X2dldF9zdGF0ZSkKIAltb3YJJW8xLCAlZzEKIAltb3YJJW8yLCAlZzIKIAltb3YJJW8zLCAlZzMKQEAgLTQ2MywyMSArNDAxLDE5IEBACiAJc3R4CSVvMywgWyVnM10KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2xkY190eF9nZXRfc3RhdGUsIC4tc3VuNHZfbGRjX3R4X2dldF9zdGF0ZQorRU5EUFJPQyhzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKQogCiAJLyogJW8wOiBjaGFubmVsCiAJICogJW8xOgl0YWlsX29mZgogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfdHhfc2V0X3F0YWlsCi0JLnR5cGUJc3VuNHZfbGRjX3R4X3NldF9xdGFpbCwjZnVuY3Rpb24KLXN1bjR2X2xkY190eF9zZXRfcXRhaWw6CitFTlRSWShzdW40dl9sZGNfdHhfc2V0X3F0YWlsKQogCW1vdglIVl9GQVNUX0xEQ19UWF9TRVRfUVRBSUwsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbGRjX3R4X3NldF9xdGFpbCwgLi1zdW40dl9sZGNfdHhfc2V0X3F0YWlsCitFTkRQUk9DKHN1bjR2X2xkY190eF9zZXRfcXRhaWwpCiAKIAkvKiAlbzA6IGNoYW5uZWwKIAkgKiAlbzE6CXJhCkBAIC00ODUsMTQgKzQyMSwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfcnhfcWNvbmYKLQkudHlwZQlzdW40dl9sZGNfcnhfcWNvbmYsI2Z1bmN0aW9uCi1zdW40dl9sZGNfcnhfcWNvbmY6CitFTlRSWShzdW40dl9sZGNfcnhfcWNvbmYpCiAJbW92CUhWX0ZBU1RfTERDX1JYX1FDT05GLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2xkY19yeF9xY29uZiwgLi1zdW40dl9sZGNfcnhfcWNvbmYKK0VORFBST0Moc3VuNHZfbGRjX3J4X3Fjb25mKQogCiAJLyogJW8wOiBjaGFubmVsCiAJICogJW8xOglwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcgcmEKQEAgLTUwMCw5ICs0MzQsNyBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfcnhfcWluZm8KLQkudHlwZQlzdW40dl9sZGNfcnhfcWluZm8sI2Z1bmN0aW9uCi1zdW40dl9sZGNfcnhfcWluZm86CitFTlRSWShzdW40dl9sZGNfcnhfcWluZm8pCiAJbW92CSVvMSwgJWcxCiAJbW92CSVvMiwgJWcyCiAJbW92CUhWX0ZBU1RfTERDX1JYX1FJTkZPLCAlbzUKQEAgLTUxMSw3ICs0NDMsNyBAQAogCXN0eAklbzIsIFslZzJdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfcnhfcWluZm8sIC4tc3VuNHZfbGRjX3J4X3FpbmZvCitFTkRQUk9DKHN1bjR2X2xkY19yeF9xaW5mbykKIAogCS8qICVvMDogY2hhbm5lbAogCSAqICVvMToJcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIGhlYWRfb2ZmCkBAIC01MjAsOSArNDUyLDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX3J4X2dldF9zdGF0ZQotCS50eXBlCXN1bjR2X2xkY19yeF9nZXRfc3RhdGUsI2Z1bmN0aW9uCi1zdW40dl9sZGNfcnhfZ2V0X3N0YXRlOgorRU5UUlkoc3VuNHZfbGRjX3J4X2dldF9zdGF0ZSkKIAltb3YJJW8xLCAlZzEKIAltb3YJJW8yLCAlZzIKIAltb3YJJW8zLCAlZzMKQEAgLTUzMywyMSArNDYzLDE5IEBACiAJc3R4CSVvMywgWyVnM10KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2xkY19yeF9nZXRfc3RhdGUsIC4tc3VuNHZfbGRjX3J4X2dldF9zdGF0ZQorRU5EUFJPQyhzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKQogCiAJLyogJW8wOiBjaGFubmVsCiAJICogJW8xOgloZWFkX29mZgogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfcnhfc2V0X3FoZWFkCi0JLnR5cGUJc3VuNHZfbGRjX3J4X3NldF9xaGVhZCwjZnVuY3Rpb24KLXN1bjR2X2xkY19yeF9zZXRfcWhlYWQ6CitFTlRSWShzdW40dl9sZGNfcnhfc2V0X3FoZWFkKQogCW1vdglIVl9GQVNUX0xEQ19SWF9TRVRfUUhFQUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbGRjX3J4X3NldF9xaGVhZCwgLi1zdW40dl9sZGNfcnhfc2V0X3FoZWFkCitFTkRQUk9DKHN1bjR2X2xkY19yeF9zZXRfcWhlYWQpCiAKIAkvKiAlbzA6IGNoYW5uZWwKIAkgKiAlbzE6CXJhCkBAIC01NTUsMTQgKzQ4MywxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfc2V0X21hcF90YWJsZQotCS50eXBlCXN1bjR2X2xkY19zZXRfbWFwX3RhYmxlLCNmdW5jdGlvbgotc3VuNHZfbGRjX3NldF9tYXBfdGFibGU6CitFTlRSWShzdW40dl9sZGNfc2V0X21hcF90YWJsZSkKIAltb3YJSFZfRkFTVF9MRENfU0VUX01BUF9UQUJMRSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfc2V0X21hcF90YWJsZSwgLi1zdW40dl9sZGNfc2V0X21hcF90YWJsZQorRU5EUFJPQyhzdW40dl9sZGNfc2V0X21hcF90YWJsZSkKIAogCS8qICVvMDogY2hhbm5lbAogCSAqICVvMToJcG9pbnRlciB0byB1bnNpZ25lZCBsb25nIHJhCkBAIC01NzAsOSArNDk2LDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX2dldF9tYXBfdGFibGUKLQkudHlwZQlzdW40dl9sZGNfZ2V0X21hcF90YWJsZSwjZnVuY3Rpb24KLXN1bjR2X2xkY19nZXRfbWFwX3RhYmxlOgorRU5UUlkoc3VuNHZfbGRjX2dldF9tYXBfdGFibGUpCiAJbW92CSVvMSwgJWcxCiAJbW92CSVvMiwgJWcyCiAJbW92CUhWX0ZBU1RfTERDX0dFVF9NQVBfVEFCTEUsICVvNQpAQCAtNTgxLDcgKzUwNSw3IEBACiAJc3R4CSVvMiwgWyVnMl0KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X2xkY19nZXRfbWFwX3RhYmxlLCAuLXN1bjR2X2xkY19nZXRfbWFwX3RhYmxlCitFTkRQUk9DKHN1bjR2X2xkY19nZXRfbWFwX3RhYmxlKQogCiAJLyogJW8wOgljaGFubmVsCiAJICogJW8xOglkaXJfY29kZQpAQCAtNTkyLDE2ICs1MTYsMTQgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX2NvcHkKLQkudHlwZQlzdW40dl9sZGNfY29weSwjZnVuY3Rpb24KLXN1bjR2X2xkY19jb3B5OgorRU5UUlkoc3VuNHZfbGRjX2NvcHkpCiAJbW92CSVvNSwgJWcxCiAJbW92CUhWX0ZBU1RfTERDX0NPUFksICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslZzFdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfY29weSwgLi1zdW40dl9sZGNfY29weQorRU5EUFJPQyhzdW40dl9sZGNfY29weSkKIAogCS8qICVvMDoJY2hhbm5lbAogCSAqICVvMToJY29va2llCkBAIC02MTAsOSArNTMyLDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX21hcGluCi0JLnR5cGUJc3VuNHZfbGRjX21hcGluLCNmdW5jdGlvbgotc3VuNHZfbGRjX21hcGluOgorRU5UUlkoc3VuNHZfbGRjX21hcGluKQogCW1vdgklbzIsICVnMQogCW1vdgklbzMsICVnMgogCW1vdglIVl9GQVNUX0xEQ19NQVBJTiwgJW81CkBAIC02MjEsMjAgKzU0MSwxOCBAQAogCXN0eAklbzIsIFslZzJdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfbWFwaW4sIC4tc3VuNHZfbGRjX21hcGluCitFTkRQUk9DKHN1bjR2X2xkY19tYXBpbikKIAogCS8qICVvMDoJcmEKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbGRjX3VubWFwCi0JLnR5cGUJc3VuNHZfbGRjX3VubWFwLCNmdW5jdGlvbgotc3VuNHZfbGRjX3VubWFwOgorRU5UUlkoc3VuNHZfbGRjX3VubWFwKQogCW1vdglIVl9GQVNUX0xEQ19VTk1BUCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9sZGNfdW5tYXAsIC4tc3VuNHZfbGRjX3VubWFwCitFTkRQUk9DKHN1bjR2X2xkY191bm1hcCkKIAogCS8qICVvMDogY2hhbm5lbAogCSAqICVvMToJY29va2llCkBAIC02NDIsMTQgKzU2MCwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6CXN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl9sZGNfcmV2b2tlCi0JLnR5cGUJc3VuNHZfbGRjX3Jldm9rZSwjZnVuY3Rpb24KLXN1bjR2X2xkY19yZXZva2U6CitFTlRSWShzdW40dl9sZGNfcmV2b2tlKQogCW1vdglIVl9GQVNUX0xEQ19SRVZPS0UsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbGRjX3Jldm9rZSwgLi1zdW40dl9sZGNfcmV2b2tlCitFTkRQUk9DKHN1bjR2X2xkY19yZXZva2UpCiAKIAkvKiAlbzA6IGRldmljZSBoYW5kbGUKIAkgKiAlbzE6CWRldmljZSBJTk8KQEAgLTY1NywxNiArNTczLDE0IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X3ZpbnRyX2dldF9jb29raWUKLQkudHlwZQlzdW40dl92aW50cl9nZXRfY29va2llLCNmdW5jdGlvbgotc3VuNHZfdmludHJfZ2V0X2Nvb2tpZToKK0VOVFJZKHN1bjR2X3ZpbnRyX2dldF9jb29raWUpCiAJbW92CSVvMiwgJWcxCiAJbW92CUhWX0ZBU1RfVklOVFJfR0VUX0NPT0tJRSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVnMV0KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3ZpbnRyX2dldF9jb29raWUsIC4tc3VuNHZfdmludHJfZ2V0X2Nvb2tpZQorRU5EUFJPQyhzdW40dl92aW50cl9nZXRfY29va2llKQogCiAJLyogJW8wOiBkZXZpY2UgaGFuZGxlCiAJICogJW8xOglkZXZpY2UgSU5PCkBAIC02NzQsMTQgKzU4OCwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl92aW50cl9zZXRfY29va2llCi0JLnR5cGUJc3VuNHZfdmludHJfc2V0X2Nvb2tpZSwjZnVuY3Rpb24KLXN1bjR2X3ZpbnRyX3NldF9jb29raWU6CitFTlRSWShzdW40dl92aW50cl9zZXRfY29va2llKQogCW1vdglIVl9GQVNUX1ZJTlRSX1NFVF9DT09LSUUsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfdmludHJfc2V0X2Nvb2tpZSwgLi1zdW40dl92aW50cl9zZXRfY29va2llCitFTkRQUk9DKHN1bjR2X3ZpbnRyX3NldF9jb29raWUpCiAKIAkvKiAlbzA6IGRldmljZSBoYW5kbGUKIAkgKiAlbzE6CWRldmljZSBJTk8KQEAgLTY4OSwxNiArNjAxLDE0IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXN1bjR2X3ZpbnRyX2dldF92YWxpZAotCS50eXBlCXN1bjR2X3ZpbnRyX2dldF92YWxpZCwjZnVuY3Rpb24KLXN1bjR2X3ZpbnRyX2dldF92YWxpZDoKK0VOVFJZKHN1bjR2X3ZpbnRyX2dldF92YWxpZCkKIAltb3YJJW8yLCAlZzEKIAltb3YJSFZfRkFTVF9WSU5UUl9HRVRfVkFMSUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslZzFdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl92aW50cl9nZXRfdmFsaWQsIC4tc3VuNHZfdmludHJfZ2V0X3ZhbGlkCitFTkRQUk9DKHN1bjR2X3ZpbnRyX2dldF92YWxpZCkKIAogCS8qICVvMDogZGV2aWNlIGhhbmRsZQogCSAqICVvMToJZGV2aWNlIElOTwpAQCAtNzA2LDE0ICs2MTYsMTIgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfdmludHJfc2V0X3ZhbGlkCi0JLnR5cGUJc3VuNHZfdmludHJfc2V0X3ZhbGlkLCNmdW5jdGlvbgotc3VuNHZfdmludHJfc2V0X3ZhbGlkOgorRU5UUlkoc3VuNHZfdmludHJfc2V0X3ZhbGlkKQogCW1vdglIVl9GQVNUX1ZJTlRSX1NFVF9WQUxJRCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl92aW50cl9zZXRfdmFsaWQsIC4tc3VuNHZfdmludHJfc2V0X3ZhbGlkCitFTkRQUk9DKHN1bjR2X3ZpbnRyX3NldF92YWxpZCkKIAogCS8qICVvMDogZGV2aWNlIGhhbmRsZQogCSAqICVvMToJZGV2aWNlIElOTwpAQCAtNzIxLDE2ICs2MjksMTQgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfdmludHJfZ2V0X3N0YXRlCi0JLnR5cGUJc3VuNHZfdmludHJfZ2V0X3N0YXRlLCNmdW5jdGlvbgotc3VuNHZfdmludHJfZ2V0X3N0YXRlOgorRU5UUlkoc3VuNHZfdmludHJfZ2V0X3N0YXRlKQogCW1vdgklbzIsICVnMQogCW1vdglIVl9GQVNUX1ZJTlRSX0dFVF9TVEFURSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVnMV0KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3ZpbnRyX2dldF9zdGF0ZSwgLi1zdW40dl92aW50cl9nZXRfc3RhdGUKK0VORFBST0Moc3VuNHZfdmludHJfZ2V0X3N0YXRlKQogCiAJLyogJW8wOiBkZXZpY2UgaGFuZGxlCiAJICogJW8xOglkZXZpY2UgSU5PCkBAIC03MzgsMTQgKzY0NCwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl92aW50cl9zZXRfc3RhdGUKLQkudHlwZQlzdW40dl92aW50cl9zZXRfc3RhdGUsI2Z1bmN0aW9uCi1zdW40dl92aW50cl9zZXRfc3RhdGU6CitFTlRSWShzdW40dl92aW50cl9zZXRfc3RhdGUpCiAJbW92CUhWX0ZBU1RfVklOVFJfU0VUX1NUQVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3ZpbnRyX3NldF9zdGF0ZSwgLi1zdW40dl92aW50cl9zZXRfc3RhdGUKK0VORFBST0Moc3VuNHZfdmludHJfc2V0X3N0YXRlKQogCiAJLyogJW8wOiBkZXZpY2UgaGFuZGxlCiAJICogJW8xOglkZXZpY2UgSU5PCkBAIC03NTMsMTYgKzY1NywxNCBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlzdW40dl92aW50cl9nZXRfdGFyZ2V0Ci0JLnR5cGUJc3VuNHZfdmludHJfZ2V0X3RhcmdldCwjZnVuY3Rpb24KLXN1bjR2X3ZpbnRyX2dldF90YXJnZXQ6CitFTlRSWShzdW40dl92aW50cl9nZXRfdGFyZ2V0KQogCW1vdgklbzIsICVnMQogCW1vdglIVl9GQVNUX1ZJTlRSX0dFVF9UQVJHRVQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslZzFdCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl92aW50cl9nZXRfdGFyZ2V0LCAuLXN1bjR2X3ZpbnRyX2dldF90YXJnZXQKK0VORFBST0Moc3VuNHZfdmludHJfZ2V0X3RhcmdldCkKIAogCS8qICVvMDogZGV2aWNlIGhhbmRsZQogCSAqICVvMToJZGV2aWNlIElOTwpAQCAtNzcwLDE0ICs2NzIsMTIgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfdmludHJfc2V0X3RhcmdldAotCS50eXBlCXN1bjR2X3ZpbnRyX3NldF90YXJnZXQsI2Z1bmN0aW9uCi1zdW40dl92aW50cl9zZXRfdGFyZ2V0OgorRU5UUlkoc3VuNHZfdmludHJfc2V0X3RhcmdldCkKIAltb3YJSFZfRkFTVF9WSU5UUl9TRVRfVEFSR0VULCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3ZpbnRyX3NldF90YXJnZXQsIC4tc3VuNHZfdmludHJfc2V0X3RhcmdldAorRU5EUFJPQyhzdW40dl92aW50cl9zZXRfdGFyZ2V0KQogCiAJLyogJW8wOiBOQ1Mgc3ViLWZ1bmN0aW9uCiAJICogJW8xOglzdWItZnVuY3Rpb24gYXJnIHJlYWwtYWRkcmVzcwpAQCAtNzg1LDE4ICs2ODUsMTQgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJc3VuNHZfbmNzX3JlcXVlc3QKLQkudHlwZQlzdW40dl9uY3NfcmVxdWVzdCwjZnVuY3Rpb24KLXN1bjR2X25jc19yZXF1ZXN0OgorRU5UUlkoc3VuNHZfbmNzX3JlcXVlc3QpCiAJbW92CUhWX0ZBU1RfTkNTX1JFUVVFU1QsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbmNzX3JlcXVlc3QsIC4tc3VuNHZfbmNzX3JlcXVlc3QKK0VORFBST0Moc3VuNHZfbmNzX3JlcXVlc3QpCiAKLQkuZ2xvYmwJc3VuNHZfc3ZjX3NlbmQKLQkudHlwZQlzdW40dl9zdmNfc2VuZCwjZnVuY3Rpb24KLXN1bjR2X3N2Y19zZW5kOgorRU5UUlkoc3VuNHZfc3ZjX3NlbmQpCiAJc2F2ZQklc3AsIC0xOTIsICVzcAogCW1vdgklaTAsICVvMAogCW1vdgklaTEsICVvMQpAQCAtODA2LDExICs3MDIsOSBAQAogCXN0eAklbzEsIFslaTNdCiAJcmV0CiAJcmVzdG9yZQotCS5zaXplCXN1bjR2X3N2Y19zZW5kLCAuLXN1bjR2X3N2Y19zZW5kCitFTkRQUk9DKHN1bjR2X3N2Y19zZW5kKQogCi0JLmdsb2JsCXN1bjR2X3N2Y19yZWN2Ci0JLnR5cGUJc3VuNHZfc3ZjX3JlY3YsI2Z1bmN0aW9uCi1zdW40dl9zdmNfcmVjdjoKK0VOVFJZKHN1bjR2X3N2Y19yZWN2KQogCXNhdmUJJXNwLCAtMTkyLCAlc3AKIAltb3YJJWkwLCAlbzAKIAltb3YJJWkxLCAlbzEKQEAgLTgyMCw2MiArNzE0LDUwIEBACiAJc3R4CSVvMSwgWyVpM10KIAlyZXQKIAlyZXN0b3JlCi0JLnNpemUJc3VuNHZfc3ZjX3JlY3YsIC4tc3VuNHZfc3ZjX3JlY3YKK0VORFBST0Moc3VuNHZfc3ZjX3JlY3YpCiAKLQkuZ2xvYmwJc3VuNHZfc3ZjX2dldHN0YXR1cwotCS50eXBlCXN1bjR2X3N2Y19nZXRzdGF0dXMsI2Z1bmN0aW9uCi1zdW40dl9zdmNfZ2V0c3RhdHVzOgorRU5UUlkoc3VuNHZfc3ZjX2dldHN0YXR1cykKIAltb3YJSFZfRkFTVF9TVkNfR0VUU1RBVFVTLCAlbzUKIAltb3YJJW8xLCAlbzQKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfc3ZjX2dldHN0YXR1cywgLi1zdW40dl9zdmNfZ2V0c3RhdHVzCitFTkRQUk9DKHN1bjR2X3N2Y19nZXRzdGF0dXMpCiAKLQkuZ2xvYmwJc3VuNHZfc3ZjX3NldHN0YXR1cwotCS50eXBlCXN1bjR2X3N2Y19zZXRzdGF0dXMsI2Z1bmN0aW9uCi1zdW40dl9zdmNfc2V0c3RhdHVzOgorRU5UUlkoc3VuNHZfc3ZjX3NldHN0YXR1cykKIAltb3YJSFZfRkFTVF9TVkNfU0VUU1RBVFVTLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X3N2Y19zZXRzdGF0dXMsIC4tc3VuNHZfc3ZjX3NldHN0YXR1cworRU5EUFJPQyhzdW40dl9zdmNfc2V0c3RhdHVzKQogCi0JLmdsb2JsCXN1bjR2X3N2Y19jbHJzdGF0dXMKLQkudHlwZQlzdW40dl9zdmNfY2xyc3RhdHVzLCNmdW5jdGlvbgotc3VuNHZfc3ZjX2NscnN0YXR1czoKK0VOVFJZKHN1bjR2X3N2Y19jbHJzdGF0dXMpCiAJbW92CUhWX0ZBU1RfU1ZDX0NMUlNUQVRVUywgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBub3AKLQkuc2l6ZQlzdW40dl9zdmNfY2xyc3RhdHVzLCAuLXN1bjR2X3N2Y19jbHJzdGF0dXMKK0VORFBST0Moc3VuNHZfc3ZjX2NscnN0YXR1cykKIAotCS5nbG9ibAlzdW40dl9tbXVzdGF0X2NvbmYKLQkudHlwZQlzdW40dl9tbXVzdGF0X2NvbmYsI2Z1bmN0aW9uCi1zdW40dl9tbXVzdGF0X2NvbmY6CitFTlRSWShzdW40dl9tbXVzdGF0X2NvbmYpCiAJbW92CSVvMSwgJW80CiAJbW92CUhWX0ZBU1RfTU1VU1RBVF9DT05GLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW80XQogCXJldGwKIAkgbm9wCi0JLnNpemUJc3VuNHZfbW11c3RhdF9jb25mLCAuLXN1bjR2X21tdXN0YXRfY29uZgorRU5EUFJPQyhzdW40dl9tbXVzdGF0X2NvbmYpCiAKLQkuZ2xvYmwJc3VuNHZfbW11c3RhdF9pbmZvCi0JLnR5cGUJc3VuNHZfbW11c3RhdF9pbmZvLCNmdW5jdGlvbgotc3VuNHZfbW11c3RhdF9pbmZvOgorRU5UUlkoc3VuNHZfbW11c3RhdF9pbmZvKQogCW1vdgklbzAsICVvNAogCW1vdglIVl9GQVNUX01NVVNUQVRfSU5GTywgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVvNF0KIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X21tdXN0YXRfaW5mbywgLi1zdW40dl9tbXVzdGF0X2luZm8KK0VORFBST0Moc3VuNHZfbW11c3RhdF9pbmZvKQogCi0JLmdsb2JsCXN1bjR2X21tdV9kZW1hcF9hbGwKLQkudHlwZQlzdW40dl9tbXVfZGVtYXBfYWxsLCNmdW5jdGlvbgotc3VuNHZfbW11X2RlbWFwX2FsbDoKK0VOVFJZKHN1bjR2X21tdV9kZW1hcF9hbGwpCiAJY2xyCSVvMAogCWNscgklbzEKIAltb3YJSFZfTU1VX0FMTCwgJW8yCkBAIC04ODMsNCArNzY1LDQgQEAKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG5vcAotCS5zaXplCXN1bjR2X21tdV9kZW1hcF9hbGwsIC4tc3VuNHZfbW11X2RlbWFwX2FsbAorRU5EUFJPQyhzdW40dl9tbXVfZGVtYXBfYWxsKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdS5jCmluZGV4IDJhMzdhNmMuLjFjYzE5OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lvbW11LmMKQEAgLTU3NSw3ICs1NzUsNyBAQAogCQl9CiAJCS8qIEFsbG9jYXRlIGlvbW11IGVudHJpZXMgZm9yIHRoYXQgc2VnbWVudCAqLwogCQlwYWRkciA9ICh1bnNpZ25lZCBsb25nKSBTR19FTlRfUEhZU19BRERSRVNTKHMpOwotCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGFkZHIsIHNsZW4pOworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGFkZHIsIHNsZW4sIElPX1BBR0VfU0laRSk7CiAJCWVudHJ5ID0gaW9tbXVfcmFuZ2VfYWxsb2MoZGV2LCBpb21tdSwgbnBhZ2VzLCAmaGFuZGxlKTsKIAogCQkvKiBIYW5kbGUgZmFpbHVyZSAqLwpAQCAtNjQ3LDcgKzY0Nyw4IEBACiAJCQlpb3B0ZV90ICpiYXNlOwogCiAJCQl2YWRkciA9IHMtPmRtYV9hZGRyZXNzICYgSU9fUEFHRV9NQVNLOwotCQkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoKTsKKwkJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwKKwkJCQkJCSBJT19QQUdFX1NJWkUpOwogCQkJaW9tbXVfcmFuZ2VfZnJlZShpb21tdSwgdmFkZHIsIG5wYWdlcyk7CiAKIAkJCWVudHJ5ID0gKHZhZGRyIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpCkBAIC03MTUsNyArNzE2LDcgQEAKIAogCQlpZiAoIWxlbikKIAkJCWJyZWFrOwotCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgbGVuKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9oYW5kbGUsIGxlbiwgSU9fUEFHRV9TSVpFKTsKIAkJaW9tbXVfcmFuZ2VfZnJlZShpb21tdSwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKIAogCQllbnRyeSA9ICgoZG1hX2hhbmRsZSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdV9jb21tb24uaCBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW9tbXVfY29tbW9uLmgKaW5kZXggNTNiMTljOC4uNTkxZjU4NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdV9jb21tb24uaAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lvbW11X2NvbW1vbi5oCkBAIC0zNSwxNyArMzUsNiBAQAogCiAjZGVmaW5lIFNHX0VOVF9QSFlTX0FERFJFU1MoU0cpCShfX3BhKHNnX3ZpcnQoKFNHKSkpKQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW9tbXVfbnVtX3BhZ2VzKHVuc2lnbmVkIGxvbmcgdmFkZHIsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIHNsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBucGFnZXM7Ci0KLQlucGFnZXMgPSBJT19QQUdFX0FMSUdOKHZhZGRyICsgc2xlbikgLSAodmFkZHIgJiBJT19QQUdFX01BU0spOwotCW5wYWdlcyA+Pj0gSU9fUEFHRV9TSElGVDsKLQotCXJldHVybiBucGFnZXM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGlzX3NwYW5fYm91bmRhcnkodW5zaWduZWQgbG9uZyBlbnRyeSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIHNoaWZ0LAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZSwKQEAgLTUzLDcgKzQyLDggQEAKIAkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQogewogCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBTR19FTlRfUEhZU19BRERSRVNTKG91dHMpOwotCWludCBuciA9IGlvbW11X251bV9wYWdlcyhwYWRkciwgb3V0cy0+ZG1hX2xlbmd0aCArIHNnLT5sZW5ndGgpOworCWludCBuciA9IGlvbW11X251bV9wYWdlcyhwYWRkciwgb3V0cy0+ZG1hX2xlbmd0aCArIHNnLT5sZW5ndGgsCisJCQkJIElPX1BBR0VfU0laRSk7CiAKIAlyZXR1cm4gaW9tbXVfaXNfc3Bhbl9ib3VuZGFyeShlbnRyeSwgbnIsIHNoaWZ0LCBib3VuZGFyeV9zaXplKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCmluZGV4IDliNjY4OWQuLjUyZmM4MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwpAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KQEAgLTI4LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3VwYS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpAQCAtNzkyLDYgKzc5Miw4IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaXJxXS5sb2NrLCBmbGFncyk7CiAJfQorCisJdGlja19vcHMtPmRpc2FibGVfaXJxKCk7CiB9CiAjZW5kaWYKIApAQCAtODY0LDcgKzg2Niw3IEBACiAJOiAiZzEiLCAiZzIiKTsKIH0KIAotdm9pZCBpbml0X2lycXdvcmtfY3VyY3B1KHZvaWQpCit2b2lkIG5vdHJhY2UgaW5pdF9pcnF3b3JrX2N1cmNwdSh2b2lkKQogewogCWludCBjcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtODk1LDcgKzg5Nyw3IEBACiAJfQogfQogCi12b2lkIF9fY3B1aW5pdCBzdW40dl9yZWdpc3Rlcl9tb25kb19xdWV1ZXMoaW50IHRoaXNfY3B1KQordm9pZCBfX2NwdWluaXQgbm90cmFjZSBzdW40dl9yZWdpc3Rlcl9tb25kb19xdWV1ZXMoaW50IHRoaXNfY3B1KQogewogCXN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiID0gJnRyYXBfYmxvY2tbdGhpc19jcHVdOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCBmODQ1ZjE1Li4wZjYxNmFlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTU1LDE1ICs1NSwzOCBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9maW5kX2RldmljZV9ieV9ub2RlKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLXN0cnVjdCBidXNfdHlwZSBlYnVzX2J1c190eXBlOwotRVhQT1JUX1NZTUJPTChlYnVzX2J1c190eXBlKTsKLSNlbmRpZgordW5zaWduZWQgaW50IGlycV9vZl9wYXJzZV9hbmRfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGluZGV4KQoreworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKIAotI2lmZGVmIENPTkZJR19TQlVTCi1zdHJ1Y3QgYnVzX3R5cGUgc2J1c19idXNfdHlwZTsKLUVYUE9SVF9TWU1CT0woc2J1c19idXNfdHlwZSk7Ci0jZW5kaWYKKwlpZiAoIW9wIHx8IGluZGV4ID49IG9wLT5udW1faXJxcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gb3AtPmlycXNbaW5kZXhdOworfQorRVhQT1JUX1NZTUJPTChpcnFfb2ZfcGFyc2VfYW5kX21hcCk7CisKKy8qIFRha2UgdGhlIGFyY2hkYXRhIHZhbHVlcyBmb3IgSU9NTVUsIFNUQywgYW5kIEhPU1REQVRBIGZvdW5kIGluCisgKiBCVVMgYW5kIHByb3BhZ2F0ZSB0byBhbGwgY2hpbGQgb2ZfZGV2aWNlIG9iamVjdHMuCisgKi8KK3ZvaWQgb2ZfcHJvcGFnYXRlX2FyY2hkYXRhKHN0cnVjdCBvZl9kZXZpY2UgKmJ1cykKK3sKKwlzdHJ1Y3QgZGV2X2FyY2hkYXRhICpidXNfc2QgPSAmYnVzLT5kZXYuYXJjaGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpidXNfZHAgPSBidXMtPm5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKworCWZvciAoZHAgPSBidXNfZHAtPmNoaWxkOyBkcDsgZHAgPSBkcC0+c2libGluZykgeworCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoZHApOworCisJCW9wLT5kZXYuYXJjaGRhdGEuaW9tbXUgPSBidXNfc2QtPmlvbW11OworCQlvcC0+ZGV2LmFyY2hkYXRhLnN0YyA9IGJ1c19zZC0+c3RjOworCQlvcC0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlciA9IGJ1c19zZC0+aG9zdF9jb250cm9sbGVyOworCQlvcC0+ZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IGJ1c19zZC0+bnVtYV9ub2RlOworCisJCWlmIChkcC0+Y2hpbGQpCisJCQlvZl9wcm9wYWdhdGVfYXJjaGRhdGEob3ApOworCX0KK30KIAogc3RydWN0IGJ1c190eXBlIG9mX3BsYXRmb3JtX2J1c190eXBlOwogRVhQT1JUX1NZTUJPTChvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CkBAIC0xNjksNyArMTkyLDcgQEAKIAogc3RhdGljIGludCBvZl9idXNfcGNpX21hdGNoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0JaWYgKCFzdHJjbXAobnAtPnR5cGUsICJwY2kiKSB8fCAhc3RyY21wKG5wLT50eXBlLCAicGNpZXgiKSkgeworCWlmICghc3RyY21wKG5wLT5uYW1lLCAicGNpIikpIHsKIAkJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOwogCiAJCWlmIChtb2RlbCAmJiAhc3RyY21wKG1vZGVsLCAiU1VOVyxzaW1iYSIpKQpAQCAtMjAwLDcgKzIyMyw3IEBACiAJLyogVHJlYXQgUENJIGJ1c3NlcyBsYWNraW5nIHJhbmdlcyBwcm9wZXJ0eSBqdXN0IGxpa2UKIAkgKiBzaW1iYS4KIAkgKi8KLQlpZiAoIXN0cmNtcChucC0+dHlwZSwgInBjaSIpIHx8ICFzdHJjbXAobnAtPnR5cGUsICJwY2lleCIpKSB7CisJaWYgKCFzdHJjbXAobnAtPm5hbWUsICJwY2kiKSkgewogCQlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJyYW5nZXMiLCBOVUxMKSkKIAkJCXJldHVybiAxOwogCX0KQEAgLTM3OCw4ICs0MDEsNyBAQAogCQkJCSAgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCiB7CiAJY29uc3QgdTMyICpyYW5nZXM7Ci0JdW5zaWduZWQgaW50IHJsZW47Ci0JaW50IHJvbmU7CisJaW50IHJvbmUsIHJsZW47CiAKIAlyYW5nZXMgPSBvZl9nZXRfcHJvcGVydHkocGFyZW50LCAicmFuZ2VzIiwgJnJsZW4pOwogCWlmIChyYW5nZXMgPT0gTlVMTCB8fCBybGVuID09IDApIHsKQEAgLTQyMSwxNSArNDQzLDI0IEBACiAKIAkvKiBJZiB0aGUgcGFyZW50IGlzIHRoZSBkbWEgbm9kZSBvZiBhbiBJU0EgYnVzLCBwYXNzCiAJICogdGhlIHRyYW5zbGF0aW9uIHVwIHRvIHRoZSByb290LgorCSAqCisJICogU29tZSBTQlVTIGRldmljZXMgdXNlIGludGVybWVkaWF0ZSBub2RlcyB0byBleHByZXNzCisJICogaGllcmFyY2h5IHdpdGhpbiB0aGUgZGV2aWNlIGl0c2VsZi4gIFRoZXNlIGFyZW4ndAorCSAqIHJlYWwgYnVzIG5vZGVzLCBhbmQgZG9uJ3QgaGF2ZSBhICdyYW5nZXMnIHByb3BlcnR5LgorCSAqIEJ1dCwgd2Ugc2hvdWxkIHN0aWxsIHBhc3MgdGhlIHRyYW5zbGF0aW9uIHdvcmsgdXAKKwkgKiB0byB0aGUgU0JVUyBpdHNlbGYuCiAJICovCi0JaWYgKCFzdHJjbXAocHAtPm5hbWUsICJkbWEiKSkKKwlpZiAoIXN0cmNtcChwcC0+bmFtZSwgImRtYSIpIHx8CisJICAgICFzdHJjbXAocHAtPm5hbWUsICJlc3BkbWEiKSB8fAorCSAgICAhc3RyY21wKHBwLT5uYW1lLCAibGVkbWEiKSB8fAorCSAgICAhc3RyY21wKHBwLT5uYW1lLCAibGVidWZmZXIiKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBTaW1pbGFybHkgZm9yIGFsbCBQQ0kgYnJpZGdlcywgaWYgd2UgZ2V0IHRoaXMgZmFyCiAJICogaXQgbGFja3MgYSByYW5nZXMgcHJvcGVydHksIGFuZCB0aGlzIHdpbGwgaW5jbHVkZQogCSAqIGNhc2VzIGxpa2UgU2ltYmEuCiAJICovCi0JaWYgKCFzdHJjbXAocHAtPnR5cGUsICJwY2kiKSB8fCAhc3RyY21wKHBwLT50eXBlLCAicGNpZXgiKSkKKwlpZiAoIXN0cmNtcChwcC0+bmFtZSwgInBjaSIpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwpAQCAtNzE0LDggKzc0NSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIXN0cmNtcChwcC0+dHlwZSwgInBjaSIpIHx8Ci0JCQkgICAgIXN0cmNtcChwcC0+dHlwZSwgInBjaWV4IikpIHsKKwkJCWlmICghc3RyY21wKHBwLT5uYW1lLCAicGNpIikpIHsKIAkJCQl1bnNpZ25lZCBpbnQgdGhpc19vcmlnX2lycSA9IGlycTsKIAogCQkJCWlycSA9IHBjaV9pcnFfc3dpenpsZShkcCwgcHAsIGlycSk7CkBAIC04NDUsMTUgKzg3NSw2IEBACiAJaW50IGVycjsKIAogCWVyciA9IG9mX2J1c190eXBlX2luaXQoJm9mX3BsYXRmb3JtX2J1c190eXBlLCAib2YiKTsKLSNpZmRlZiBDT05GSUdfUENJCi0JaWYgKCFlcnIpCi0JCWVyciA9IG9mX2J1c190eXBlX2luaXQoJmVidXNfYnVzX3R5cGUsICJlYnVzIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU0JVUwotCWlmICghZXJyKQotCQllcnIgPSBvZl9idXNfdHlwZV9pbml0KCZzYnVzX2J1c190eXBlLCAic2J1cyIpOwotI2VuZGlmCi0KIAlpZiAoIWVycikKIAkJc2Nhbl9vZl9kZXZpY2VzKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCmluZGV4IDU1MDk2MTkuLjI0MmFjMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwpAQCAtMTgsMzIgKzE4LDE3IEBACiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vYXBiLmg+CiAKICNpbmNsdWRlICJwY2lfaW1wbC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLS8qIEEgIm5vcCIgUENJIGltcGxlbWVudGF0aW9uLiAqLwotYXNtbGlua2FnZSBpbnQgc3lzX3BjaWNvbmZpZ19yZWFkKHVuc2lnbmVkIGxvbmcgYnVzLCB1bnNpZ25lZCBsb25nIGRmbiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgb2ZmLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gMDsKLX0KLWFzbWxpbmthZ2UgaW50IHN5c19wY2ljb25maWdfd3JpdGUodW5zaWduZWQgbG9uZyBidXMsIHVuc2lnbmVkIGxvbmcgZGZuLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2ZmLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkgICB1bnNpZ25lZCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotCiAvKiBMaXN0IG9mIGFsbCBQQ0kgY29udHJvbGxlcnMgZm91bmQgaW4gdGhlIHN5c3RlbS4gKi8KIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBjaV9wYm1fcm9vdCA9IE5VTEw7CiAKQEAgLTE3OSw5NyArMTY0LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfcG9rZV9sb2NrLCBmbGFncyk7CiB9CiAKLS8qIFByb2JlIGZvciBhbGwgUENJIGNvbnRyb2xsZXJzIGluIHRoZSBzeXN0ZW0uICovCi1leHRlcm4gdm9pZCBzYWJyZV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIHZvaWQgcHN5Y2hvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICosIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzY2hpem9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkIHNjaGl6b19wbHVzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICosIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCB0b21hdGlsbG9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkIHN1bjR2X3BjaV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIHZvaWQgZmlyZV9wY2lfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgY29uc3QgY2hhciAqKTsKLQotc3RhdGljIHN0cnVjdCB7Ci0JY2hhciAqbW9kZWxfbmFtZTsKLQl2b2lkICgqaW5pdCkoc3RydWN0IGRldmljZV9ub2RlICosIGNvbnN0IGNoYXIgKik7Ci19IHBjaV9jb250cm9sbGVyX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKLQl7ICJTVU5XLHNhYnJlIiwgc2FicmVfaW5pdCB9LAotCXsgInBjaTEwOGUsYTAwMCIsIHNhYnJlX2luaXQgfSwKLQl7ICJwY2kxMDhlLGEwMDEiLCBzYWJyZV9pbml0IH0sCi0JeyAiU1VOVyxwc3ljaG8iLCBwc3ljaG9faW5pdCB9LAotCXsgInBjaTEwOGUsODAwMCIsIHBzeWNob19pbml0IH0sCi0JeyAiU1VOVyxzY2hpem8iLCBzY2hpem9faW5pdCB9LAotCXsgInBjaTEwOGUsODAwMSIsIHNjaGl6b19pbml0IH0sCi0JeyAiU1VOVyxzY2hpem8rIiwgc2NoaXpvX3BsdXNfaW5pdCB9LAotCXsgInBjaTEwOGUsODAwMiIsIHNjaGl6b19wbHVzX2luaXQgfSwKLQl7ICJTVU5XLHRvbWF0aWxsbyIsIHRvbWF0aWxsb19pbml0IH0sCi0JeyAicGNpMTA4ZSxhODAxIiwgdG9tYXRpbGxvX2luaXQgfSwKLQl7ICJTVU5XLHN1bjR2LXBjaSIsIHN1bjR2X3BjaV9pbml0IH0sCi0JeyAicGNpZXgxMDhlLDgwZjAiLCBmaXJlX3BjaV9pbml0IH0sCi19OwotI2RlZmluZSBQQ0lfTlVNX0NPTlRST0xMRVJfVFlQRVMJQVJSQVlfU0laRShwY2lfY29udHJvbGxlcl90YWJsZSkKLQotc3RhdGljIGludCBfX2luaXQgcGNpX2NvbnRyb2xsZXJfaW5pdChjb25zdCBjaGFyICptb2RlbF9uYW1lLCBpbnQgbmFtZWxlbiwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX0NPTlRST0xMRVJfVFlQRVM7IGkrKykgewotCQlpZiAoIXN0cm5jbXAobW9kZWxfbmFtZSwKLQkJCSAgICAgcGNpX2NvbnRyb2xsZXJfdGFibGVbaV0ubW9kZWxfbmFtZSwKLQkJCSAgICAgbmFtZWxlbikpIHsKLQkJCXBjaV9jb250cm9sbGVyX3RhYmxlW2ldLmluaXQoZHAsIG1vZGVsX25hbWUpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGNpX2NvbnRyb2xsZXJfc2NhbihpbnQgKCpoYW5kbGVyKShjb25zdCBjaGFyICosIGludCwgc3RydWN0IGRldmljZV9ub2RlICopKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0JaW50IGNvdW50ID0gMDsKLQotCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgInBjaSIpIHsKLQkJc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCQlpbnQgbGVuOwotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAibW9kZWwiLCAmbGVuKTsKLQkJaWYgKCFwcm9wKQotCQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJjb21wYXRpYmxlIiwgJmxlbik7Ci0KLQkJaWYgKHByb3ApIHsKLQkJCWNvbnN0IGNoYXIgKm1vZGVsID0gcHJvcC0+dmFsdWU7Ci0JCQlpbnQgaXRlbV9sZW4gPSAwOwotCi0JCQkvKiBPdXIgdmFsdWUgbWF5IGJlIGEgbXVsdGktdmFsdWVkIHN0cmluZyBpbiB0aGUKLQkJCSAqIGNhc2Ugb2Ygc29tZSBjb21wYXRpYmxlIHByb3BlcnRpZXMuIEZvciBzYW5pdHksCi0JCQkgKiBvbmx5IHRyeSB0aGUgZmlyc3Qgb25lLgotCQkJICovCi0JCQl3aGlsZSAobW9kZWxbaXRlbV9sZW5dICYmIGxlbikgewotCQkJCWxlbi0tOwotCQkJCWl0ZW1fbGVuKys7Ci0JCQl9Ci0KLQkJCWlmIChoYW5kbGVyKG1vZGVsLCBpdGVtX2xlbiwgZHApKQotCQkJCWNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qIEZpbmQgZWFjaCBjb250cm9sbGVyIGluIHRoZSBzeXN0ZW0sIGF0dGFjaCBhbmQgaW5pdGlhbGl6ZQotICogc29mdHdhcmUgc3RhdGUgc3RydWN0dXJlIGZvciBlYWNoIGFuZCBsaW5rIGludG8gdGhlCi0gKiBwY2lfcGJtX3Jvb3QuICBTZXR1cCB0aGUgY29udHJvbGxlciBlbm91Z2ggc3VjaAotICogdGhhdCBidXMgc2Nhbm5pbmcgY2FuIGJlIGRvbmUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfY29udHJvbGxlcl9wcm9iZSh2b2lkKQotewotCXByaW50aygiUENJOiBQcm9iaW5nIGZvciBjb250cm9sbGVycy5cbiIpOwotCi0JcGNpX2NvbnRyb2xsZXJfc2NhbihwY2lfY29udHJvbGxlcl9pbml0KTsKLX0KLQogc3RhdGljIGludCBvZnBjaV92ZXJib3NlOwogCiBzdGF0aWMgaW50IF9faW5pdCBvZnBjaV9kZWJ1ZyhjaGFyICpzdHIpCkBAIC0zNDgsMTEgKzI0MiwxMiBAQAogCX0KIH0KIAotc3RydWN0IHBjaV9kZXYgKm9mX2NyZWF0ZV9wY2lfZGV2KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgIHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbikKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqb2ZfY3JlYXRlX3BjaV9kZXYoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCQkgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQkgc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKQogewogCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJY29uc3QgY2hhciAqdHlwZTsKIAl1MzIgY2xhc3M7CkBAIC0zNjYsMTQgKzI2MSwxNyBAQAogCXNkLT5zdGMgPSAmcGJtLT5zdGM7CiAJc2QtPmhvc3RfY29udHJvbGxlciA9IHBibTsKIAlzZC0+cHJvbV9ub2RlID0gbm9kZTsKLQlzZC0+b3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOworCXNkLT5vcCA9IG9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShub2RlKTsKIAlzZC0+bnVtYV9ub2RlID0gcGJtLT5udW1hX25vZGU7CiAKLQlzZCA9ICZzZC0+b3AtPmRldi5hcmNoZGF0YTsKKwlzZCA9ICZvcC0+ZGV2LmFyY2hkYXRhOwogCXNkLT5pb21tdSA9IHBibS0+aW9tbXU7CiAJc2QtPnN0YyA9ICZwYm0tPnN0YzsKIAlzZC0+bnVtYV9ub2RlID0gcGJtLT5udW1hX25vZGU7CiAKKwlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAiZWJ1cyIpKQorCQlvZl9wcm9wYWdhdGVfYXJjaGRhdGEob3ApOworCiAJdHlwZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKIAlpZiAodHlwZSA9PSBOVUxMKQogCQl0eXBlID0gIiI7CkBAIC00MjUsNyArMzIzLDcgQEAKIAlkZXYtPmN1cnJlbnRfc3RhdGUgPSA0OwkJLyogdW5rbm93biBwb3dlciBzdGF0ZSAqLwogCWRldi0+ZXJyb3Jfc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19ub3JtYWw7CiAKLQlpZiAoIXN0cmNtcCh0eXBlLCAicGNpIikgfHwgIXN0cmNtcCh0eXBlLCAicGNpZXgiKSkgeworCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJwY2kiKSkgewogCQkvKiBhIFBDSS1QQ0kgYnJpZGdlICovCiAJCWRldi0+aGRyX3R5cGUgPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOwogCQlkZXYtPnJvbV9iYXNlX3JlZyA9IFBDSV9ST01fQUREUkVTUzE7CkBAIC03NzUsMTUgKzY3MywxNSBAQAogCQlwY2lfYnVzX3JlZ2lzdGVyX29mX3N5c2ZzKGNoaWxkX2J1cyk7CiB9CiAKLXN0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaV9zY2FuX29uZV9wYm0oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RydWN0IHBjaV9idXMgKiBfX2RldmluaXQgcGNpX3NjYW5fb25lX3BibShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGJtLT5wcm9tX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGJtLT5vcC0+bm9kZTsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCiAJcHJpbnRrKCJQQ0k6IFNjYW5uaW5nIFBCTSAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKIAotCS8qIFhYWCBwYXJlbnQgZGV2aWNlPyBYWFggKi8KLQlidXMgPSBwY2lfY3JlYXRlX2J1cyhOVUxMLCBwYm0tPnBjaV9maXJzdF9idXNubywgcGJtLT5wY2lfb3BzLCBwYm0pOworCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKHBhcmVudCwgcGJtLT5wY2lfZmlyc3RfYnVzbm8sIHBibS0+cGNpX29wcywgcGJtKTsKIAlpZiAoIWJ1cykgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgYnVzIGZvciAlc1xuIiwKIAkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CkBAIC04MDIsMzIgKzcwMCw2IEBACiAJcmV0dXJuIGJ1czsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBjaV9zY2FuX2VhY2hfY29udHJvbGxlcl9idXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0KLQlmb3IgKHBibSA9IHBjaV9wYm1fcm9vdDsgcGJtOyBwYm0gPSBwYm0tPm5leHQpCi0JCXBibS0+c2Nhbl9idXMocGJtKTsKLX0KLQotZXh0ZXJuIHZvaWQgcG93ZXJfaW5pdCh2b2lkKTsKLQotc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCi17Ci0JcGNpX2NvbnRyb2xsZXJfcHJvYmUoKTsKLQlpZiAocGNpX3BibV9yb290ID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcGNpX3NjYW5fZWFjaF9jb250cm9sbGVyX2J1cygpOwotCi0JZWJ1c19pbml0KCk7Ci0JcG93ZXJfaW5pdCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwotCiB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwYnVzLT5zeXNkYXRhOwpAQCAtMTEwNSwxNCArOTc3LDE0IEBACiBFWFBPUlRfU1lNQk9MKHBjaWJ1c190b19ub2RlKTsKICNlbmRpZgogCi0vKiBSZXR1cm4gdGhlIGRvbWFpbiBudWJlciBmb3IgdGhpcyBwY2kgYnVzICovCisvKiBSZXR1cm4gdGhlIGRvbWFpbiBudW1iZXIgZm9yIHRoaXMgcGNpIGJ1cyAqLwogCiBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwYnVzLT5zeXNkYXRhOwogCWludCByZXQ7CiAKLQlpZiAocGJtID09IE5VTEwgfHwgcGJtLT5wYXJlbnQgPT0gTlVMTCkgeworCWlmICghcGJtKSB7CiAJCXJldCA9IC1FTlhJTzsKIAl9IGVsc2UgewogCQlyZXQgPSBwYm0tPmluZGV4OwpAQCAtMTEyNiw3ICs5OTgsNyBAQAogaW50IGFyY2hfc2V0dXBfbXNpX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG1zaV9kZXNjICpkZXNjKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBkZXYtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7Ci0JaW50IHZpcnRfaXJxOworCXVuc2lnbmVkIGludCB2aXJ0X2lycTsKIAogCWlmICghcGJtLT5zZXR1cF9tc2lfaXJxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNDAsMTAgKzEwMTIsOCBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZW50cnktPmRldjsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOwogCi0JaWYgKCFwYm0tPnRlYXJkb3duX21zaV9pcnEpCi0JCXJldHVybjsKLQotCXJldHVybiBwYm0tPnRlYXJkb3duX21zaV9pcnEodmlydF9pcnEsIHBkZXYpOworCWlmIChwYm0tPnRlYXJkb3duX21zaV9pcnEpCisJCXBibS0+dGVhcmRvd25fbXNpX2lycSh2aXJ0X2lycSwgcGRldik7CiB9CiAjZW5kaWYgLyogIShDT05GSUdfUENJX01TSSkgKi8KIApAQCAtMTIxNSw1ICsxMDg1LDMgQEAKIAkqc3RhcnQgPSBycC0+c3RhcnQgLSBvZmZzZXQ7CiAJKmVuZCA9IHJwLT5lbmQgLSBvZmZzZXQ7CiB9Ci0KLSNlbmRpZiAvKiAhKENPTkZJR19QQ0kpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IDA5YTVlYzIuLjIzYjg4MDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCkBAIC0zMTQsMTIgKzMxNCwxMiBAQAogCiB2b2lkIHBjaV9nZXRfcGJtX3Byb3BzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQljb25zdCB1MzIgKnZhbCA9IG9mX2dldF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwgImJ1cy1yYW5nZSIsIE5VTEwpOworCWNvbnN0IHUzMiAqdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKIAogCXBibS0+cGNpX2ZpcnN0X2J1c25vID0gdmFsWzBdOwogCXBibS0+cGNpX2xhc3RfYnVzbm8gPSB2YWxbMV07CiAKLQl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICJpbm8tYml0bWFwIiwgTlVMTCk7CisJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJpbm8tYml0bWFwIiwgTlVMTCk7CiAJaWYgKHZhbCkgewogCQlwYm0tPmlub19iaXRtYXAgPSAoKCh1NjQpdmFsWzFdIDw8IDMyVUwpIHwKIAkJCQkgICAoKHU2NCl2YWxbMF0gPDwgIDBVTCkpOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAKIHN0YXRpYyB2b2lkIHBjaV9yZWdpc3Rlcl9pb21tdV9yZWdpb24oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewotCWNvbnN0IHUzMiAqdmRtYSA9IG9mX2dldF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwgInZpcnR1YWwtZG1hIiwgTlVMTCk7CisJY29uc3QgdTMyICp2ZG1hID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJ2aXJ0dWFsLWRtYSIsIE5VTEwpOwogCiAJaWYgKHZkbWEpIHsKIAkJc3RydWN0IHJlc291cmNlICpycCA9IGttYWxsb2Moc2l6ZW9mKCpycCksIEdGUF9LRVJORUwpOwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJaW50IG51bV9wYm1fcmFuZ2VzOwogCiAJc2F3X21lbSA9IHNhd19pbyA9IDA7Ci0JcGJtX3JhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwgInJhbmdlcyIsICZpKTsKKwlwYm1fcmFuZ2VzID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJyYW5nZXMiLCAmaSk7CiAJaWYgKCFwYm1fcmFuZ2VzKSB7CiAJCXByb21fcHJpbnRmKCJQQ0k6IEZhdGFsIGVycm9yLCBtaXNzaW5nIFBCTSByYW5nZXMgcHJvcGVydHkgIgogCQkJICAgICIgZm9yICVzXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfZmlyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfZmlyZS5jCmluZGV4IGQyM2JiNmYuLjk0NjJiNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ZpcmUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMKQEAgLTgsMzQgKzgsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CiAKICNpbmNsdWRlICJwY2lfaW1wbC5oIgogCi0jZGVmaW5lIGZpcmVfcmVhZChfX3JlZykgXAotKHsJdTY0IF9fcmV0OyBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEgWyUxXSAlMiwgJTAiIFwKLQkJCSAgICAgOiAiPXIiIChfX3JldCkgXAotCQkJICAgICA6ICJyIiAoX19yZWcpLCAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCi0JCQkgICAgIDogIm1lbW9yeSIpOyBcCi0JX19yZXQ7IFwKLX0pCi0jZGVmaW5lIGZpcmVfd3JpdGUoX19yZWcsIF9fdmFsKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEgJTAsIFslMV0gJTIiIFwKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovIFwKLQkJCSAgICAgOiAiciIgKF9fdmFsKSwgInIiIChfX3JlZyksIFwKLQkJCSAgICAgICAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCi0JCQkgICAgIDogIm1lbW9yeSIpCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfZmlyZV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCi17Ci0JcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fb25lX3BibShwYm0pOwotCi0JLyogWFhYIHJlZ2lzdGVyIGVycm9yIGludGVycnVwdCBoYW5kbGVycyBYWFggKi8KLX0KKyNkZWZpbmUgRFJJVkVSX05BTUUJImZpcmUiCisjZGVmaW5lIFBGWAkJRFJJVkVSX05BTUUgIjogIgogCiAjZGVmaW5lIEZJUkVfSU9NTVVfQ09OVFJPTAkweDQwMDAwVUwKICNkZWZpbmUgRklSRV9JT01NVV9UU0JCQVNFCTB4NDAwMDhVTApAQCAtNjksMjEgKzUxLDIxIEBACiAJLyoKIAkgKiBJbnZhbGlkYXRlIFRMQiBFbnRyaWVzLgogCSAqLwotCWZpcmVfd3JpdGUoaW9tbXUtPmlvbW11X2ZsdXNoaW52LCB+KHU2NCkwKTsKKwl1cGFfd3JpdGVxKH4odTY0KTAsIGlvbW11LT5pb21tdV9mbHVzaGludik7CiAKIAllcnIgPSBpb21tdV90YWJsZV9pbml0KGlvbW11LCB0c2JzaXplICogOCAqIDEwMjQsIHZkbWFbMF0sIGRtYV9tYXNrLAogCQkJICAgICAgIHBibS0+bnVtYV9ub2RlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZmlyZV93cml0ZShpb21tdS0+aW9tbXVfdHNiYmFzZSwgX19wYShpb21tdS0+cGFnZV90YWJsZSkgfCAweDdVTCk7CisJdXBhX3dyaXRlcShfX3BhKGlvbW11LT5wYWdlX3RhYmxlKSB8IDB4N1VMLCBpb21tdS0+aW9tbXVfdHNiYmFzZSk7CiAKLQljb250cm9sID0gZmlyZV9yZWFkKGlvbW11LT5pb21tdV9jb250cm9sKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5pb21tdV9jb250cm9sKTsKIAljb250cm9sIHw9ICgweDAwMDAwNDAwIC8qIFRTQiBjYWNoZSBzbm9vcCBlbmFibGUgKi8JfAogCQkgICAgMHgwMDAwMDMwMCAvKiBDYWNoZSBtb2RlICovCQkJfAogCQkgICAgMHgwMDAwMDAwMiAvKiBCeXBhc3MgZW5hYmxlICovCQl8CiAJCSAgICAweDAwMDAwMDAxIC8qIFRyYW5zbGF0aW9uIGVuYWJsZSAqLyk7Ci0JZmlyZV93cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+aW9tbXVfY29udHJvbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NSw3ICsxNDcsNyBAQAogc3RhdGljIGludCBwY2lfZmlyZV9nZXRfaGVhZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHVuc2lnbmVkIGxvbmcgbXNpcWlkLAogCQkJICAgICB1bnNpZ25lZCBsb25nICpoZWFkKQogewotCSpoZWFkID0gZmlyZV9yZWFkKHBibS0+cGJtX3JlZ3MgKyBFVkVOVF9RVUVVRV9IRUFEKG1zaXFpZCkpOworCSpoZWFkID0gdXBhX3JlYWRxKHBibS0+cGJtX3JlZ3MgKyBFVkVOVF9RVUVVRV9IRUFEKG1zaXFpZCkpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTEsOCArMTczLDcgQEAKIAkqbXNpID0gbXNpX251bSA9ICgoZXAtPndvcmQwICYgTVNJUV9XT1JEMF9EQVRBMCkgPj4KIAkJCSAgTVNJUV9XT1JEMF9EQVRBMF9TSElGVCk7CiAKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBNU0lfQ0xFQVIobXNpX251bSksCi0JCSAgIE1TSV9DTEVBUl9FUVdSX04pOworCXVwYV93cml0ZXEoTVNJX0NMRUFSX0VRV1JfTiwgcGJtLT5wYm1fcmVncyArIE1TSV9DTEVBUihtc2lfbnVtKSk7CiAKIAkvKiBDbGVhciB0aGUgZW50cnkuICAqLwogCWVwLT53b3JkMCAmPSB+TVNJUV9XT1JEMF9GTVRfVFlQRTsKQEAgLTIwOCw3ICsxODksNyBAQAogc3RhdGljIGludCBwY2lfZmlyZV9zZXRfaGVhZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHVuc2lnbmVkIGxvbmcgbXNpcWlkLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGhlYWQpCiB7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgRVZFTlRfUVVFVUVfSEVBRChtc2lxaWQpLCBoZWFkKTsKKwl1cGFfd3JpdGVxKGhlYWQsIHBibS0+cGJtX3JlZ3MgKyBFVkVOVF9RVUVVRV9IRUFEKG1zaXFpZCkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTcsMTcgKzE5OCwxNiBAQAogewogCXU2NCB2YWw7CiAKLQl2YWwgPSBmaXJlX3JlYWQocGJtLT5wYm1fcmVncyArIE1TSV9NQVAobXNpKSk7CisJdmFsID0gdXBhX3JlYWRxKHBibS0+cGJtX3JlZ3MgKyBNU0lfTUFQKG1zaSkpOwogCXZhbCAmPSB+KE1TSV9NQVBfRVFOVU0pOwogCXZhbCB8PSBtc2lxaWQ7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgTVNJX01BUChtc2kpLCB2YWwpOworCXVwYV93cml0ZXEodmFsLCBwYm0tPnBibV9yZWdzICsgTVNJX01BUChtc2kpKTsKIAotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIE1TSV9DTEVBUihtc2kpLAotCQkgICBNU0lfQ0xFQVJfRVFXUl9OKTsKKwl1cGFfd3JpdGVxKE1TSV9DTEVBUl9FUVdSX04sIHBibS0+cGJtX3JlZ3MgKyBNU0lfQ0xFQVIobXNpKSk7CiAKLQl2YWwgPSBmaXJlX3JlYWQocGJtLT5wYm1fcmVncyArIE1TSV9NQVAobXNpKSk7CisJdmFsID0gdXBhX3JlYWRxKHBibS0+cGJtX3JlZ3MgKyBNU0lfTUFQKG1zaSkpOwogCXZhbCB8PSBNU0lfTUFQX1ZBTElEOwotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIE1TSV9NQVAobXNpKSwgdmFsKTsKKwl1cGFfd3JpdGVxKHZhbCwgcGJtLT5wYm1fcmVncyArIE1TSV9NQVAobXNpKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNywxMiArMjE3LDEyIEBACiAJdW5zaWduZWQgbG9uZyBtc2lxaWQ7CiAJdTY0IHZhbDsKIAotCXZhbCA9IGZpcmVfcmVhZChwYm0tPnBibV9yZWdzICsgTVNJX01BUChtc2kpKTsKKwl2YWwgPSB1cGFfcmVhZHEocGJtLT5wYm1fcmVncyArIE1TSV9NQVAobXNpKSk7CiAJbXNpcWlkID0gKHZhbCAmIE1TSV9NQVBfRVFOVU0pOwogCiAJdmFsICY9IH5NU0lfTUFQX1ZBTElEOwogCi0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgTVNJX01BUChtc2kpLCB2YWwpOworCXVwYV93cml0ZXEodmFsLCBwYm0tPnBibV9yZWdzICsgTVNJX01BUChtc2kpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjYxLDIyICsyNDEsMTkgQEAKIAltZW1zZXQoKGNoYXIgKilwYWdlcywgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAlwYm0tPm1zaV9xdWV1ZXMgPSAodm9pZCAqKSBwYWdlczsKIAotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEVWRU5UX1FVRVVFX0JBU0VfQUREUl9SRUcsCi0JCSAgIChFVkVOVF9RVUVVRV9CQVNFX0FERFJfQUxMX09ORVMgfAotCQkgICAgX19wYShwYm0tPm1zaV9xdWV1ZXMpKSk7CisJdXBhX3dyaXRlcSgoRVZFTlRfUVVFVUVfQkFTRV9BRERSX0FMTF9PTkVTIHwKKwkJICAgIF9fcGEocGJtLT5tc2lfcXVldWVzKSksCisJCSAgIHBibS0+cGJtX3JlZ3MgKyBFVkVOVF9RVUVVRV9CQVNFX0FERFJfUkVHKTsKIAotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIElNT05ET19EQVRBMCwKLQkJICAgcGJtLT5wb3J0aWQgPDwgNik7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgSU1PTkRPX0RBVEExLCAwKTsKKwl1cGFfd3JpdGVxKHBibS0+cG9ydGlkIDw8IDYsIHBibS0+cGJtX3JlZ3MgKyBJTU9ORE9fREFUQTApOworCXVwYV93cml0ZXEoMCwgcGJtLT5wYm1fcmVncyArIElNT05ET19EQVRBMSk7CiAKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBNU0lfMzJCSVRfQUREUiwKLQkJICAgcGJtLT5tc2kzMl9zdGFydCk7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgTVNJXzY0QklUX0FERFIsCi0JCSAgIHBibS0+bXNpNjRfc3RhcnQpOworCXVwYV93cml0ZXEocGJtLT5tc2kzMl9zdGFydCwgcGJtLT5wYm1fcmVncyArIE1TSV8zMkJJVF9BRERSKTsKKwl1cGFfd3JpdGVxKHBibS0+bXNpNjRfc3RhcnQsIHBibS0+cGJtX3JlZ3MgKyBNU0lfNjRCSVRfQUREUik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGJtLT5tc2lxX251bTsgaSsrKSB7Ci0JCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEVWRU5UX1FVRVVFX0hFQUQoaSksIDApOwotCQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBFVkVOVF9RVUVVRV9UQUlMKGkpLCAwKTsKKwkJdXBhX3dyaXRlcSgwLCBwYm0tPnBibV9yZWdzICsgRVZFTlRfUVVFVUVfSEVBRChpKSk7CisJCXVwYV93cml0ZXEoMCwgcGJtLT5wYm1fcmVncyArIEVWRU5UX1FVRVVFX1RBSUwoaSkpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzEwLDkgKzI4Nyw5IEBACiAJLyogWFhYIGl0ZXJhdGUgYW1vbmdzdCB0aGUgNCBJUlEgY29udHJvbGxlcnMgWFhYICovCiAJaW50X2N0cmxyID0gKDFVTCA8PCA2KTsKIAotCXZhbCA9IGZpcmVfcmVhZChpbWFwX3JlZyk7CisJdmFsID0gdXBhX3JlYWRxKGltYXBfcmVnKTsKIAl2YWwgfD0gKDFVTCA8PCA2MykgfCBpbnRfY3RybHI7Ci0JZmlyZV93cml0ZShpbWFwX3JlZywgdmFsKTsKKwl1cGFfd3JpdGVxKHZhbCwgaW1hcF9yZWcpOwogCiAJZml4dXAgPSAoKHBibS0+cG9ydGlkIDw8IDYpIHwgZGV2aW5vKSAtIGludF9jdHJscjsKIApAQCAtMzIwLDkgKzI5Nyw4IEBACiAJaWYgKCF2aXJ0X2lycSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKwotCQkgICBFVkVOVF9RVUVVRV9DT05UUk9MX1NFVChtc2lxaWQpLAotCQkgICBFVkVOVF9RVUVVRV9DT05UUk9MX1NFVF9FTik7CisJdXBhX3dyaXRlcShFVkVOVF9RVUVVRV9DT05UUk9MX1NFVF9FTiwKKwkJICAgcGJtLT5wYm1fcmVncyArIEVWRU5UX1FVRVVFX0NPTlRST0xfU0VUKG1zaXFpZCkpOwogCiAJcmV0dXJuIHZpcnRfaXJxOwogfQpAQCAtMzkwLDc3ICszNjYsNjUgQEAKIHsKIAl1NjQgdmFsOwogCi0JZmlyZV93cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIEZJUkVfUEFSSVRZX0NPTlRST0wsCi0JCSAgIEZJUkVfUEFSSVRZX0VOQUIpOworCXVwYV93cml0ZXEoRklSRV9QQVJJVFlfRU5BQiwKKwkJICAgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBGSVJFX1BBUklUWV9DT05UUk9MKTsKIAotCWZpcmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBGSVJFX0ZBVEFMX1JFU0VUX0NUTCwKLQkJICAgKEZJUkVfRkFUQUxfUkVTRVRfU1BBUkUgfAorCXVwYV93cml0ZXEoKEZJUkVfRkFUQUxfUkVTRVRfU1BBUkUgfAogCQkgICAgRklSRV9GQVRBTF9SRVNFVF9NQiB8CiAJCSAgICBGSVJFX0ZBVEFMX1JFU0VUX0NQRSB8CiAJCSAgICBGSVJFX0ZBVEFMX1JFU0VUX0FQRSB8CiAJCSAgICBGSVJFX0ZBVEFMX1JFU0VUX1BJTyB8CiAJCSAgICBGSVJFX0ZBVEFMX1JFU0VUX0pXIHwKIAkJICAgIEZJUkVfRkFUQUxfUkVTRVRfSkkgfAotCQkgICAgRklSRV9GQVRBTF9SRVNFVF9KUikpOworCQkgICAgRklSRV9GQVRBTF9SRVNFVF9KUiksCisJCSAgIHBibS0+Y29udHJvbGxlcl9yZWdzICsgRklSRV9GQVRBTF9SRVNFVF9DVEwpOwogCi0JZmlyZV93cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIEZJUkVfQ09SRV9JTlRSX0VOQUJMRSwgfih1NjQpMCk7CisJdXBhX3dyaXRlcSh+KHU2NCkwLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIEZJUkVfQ09SRV9JTlRSX0VOQUJMRSk7CiAKLQl2YWwgPSBmaXJlX3JlYWQocGJtLT5wYm1fcmVncyArIEZJUkVfVExVX0NUUkwpOworCXZhbCA9IHVwYV9yZWFkcShwYm0tPnBibV9yZWdzICsgRklSRV9UTFVfQ1RSTCk7CiAJdmFsIHw9IChGSVJFX1RMVV9DVFJMX1RJTSB8CiAJCUZJUkVfVExVX0NUUkxfUURFVCB8CiAJCUZJUkVfVExVX0NUUkxfQ0ZHKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX1RMVV9DVFJMLCB2YWwpOwotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfVExVX0RFVl9DVFJMLCAwKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX1RMVV9MSU5LX0NUUkwsCi0JCSAgIEZJUkVfVExVX0xJTktfQ1RSTF9DTEspOworCXVwYV93cml0ZXEodmFsLCBwYm0tPnBibV9yZWdzICsgRklSRV9UTFVfQ1RSTCk7CisJdXBhX3dyaXRlcSgwLCBwYm0tPnBibV9yZWdzICsgRklSRV9UTFVfREVWX0NUUkwpOworCXVwYV93cml0ZXEoRklSRV9UTFVfTElOS19DVFJMX0NMSywKKwkJICAgcGJtLT5wYm1fcmVncyArIEZJUkVfVExVX0xJTktfQ1RSTCk7CiAKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9SRVNFVCwgMCk7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgRklSRV9MUFVfTExDRkcsCi0JCSAgIEZJUkVfTFBVX0xMQ0ZHX1ZDMCk7Ci0JZmlyZV93cml0ZShwYm0tPnBibV9yZWdzICsgRklSRV9MUFVfRkNUUkxfVUNUUkwsCi0JCSAgIChGSVJFX0xQVV9GQ1RSTF9VQ1RSTF9OIHwKLQkJICAgIEZJUkVfTFBVX0ZDVFJMX1VDVFJMX1ApKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9UWExfRklGT1AsCi0JCSAgICgoMHhmZmZmIDw8IDE2KSB8ICgweDAwMDAgPDwgMCkpKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9MVFNTTV9DRkcyLCAzMDAwMDAwKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9MVFNTTV9DRkczLCA1MDAwMDApOwotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfTFBVX0xUU1NNX0NGRzQsCi0JCSAgICgyIDw8IDE2KSB8ICgxNDAgPDwgOCkpOwotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfTFBVX0xUU1NNX0NGRzUsIDApOworCXVwYV93cml0ZXEoMCwgcGJtLT5wYm1fcmVncyArIEZJUkVfTFBVX1JFU0VUKTsKKwl1cGFfd3JpdGVxKEZJUkVfTFBVX0xMQ0ZHX1ZDMCwgcGJtLT5wYm1fcmVncyArIEZJUkVfTFBVX0xMQ0ZHKTsKKwl1cGFfd3JpdGVxKChGSVJFX0xQVV9GQ1RSTF9VQ1RSTF9OIHwgRklSRV9MUFVfRkNUUkxfVUNUUkxfUCksCisJCSAgIHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9GQ1RSTF9VQ1RSTCk7CisJdXBhX3dyaXRlcSgoKDB4ZmZmZiA8PCAxNikgfCAoMHgwMDAwIDw8IDApKSwKKwkJICAgcGJtLT5wYm1fcmVncyArIEZJUkVfTFBVX1RYTF9GSUZPUCk7CisJdXBhX3dyaXRlcSgzMDAwMDAwLCBwYm0tPnBibV9yZWdzICsgRklSRV9MUFVfTFRTU01fQ0ZHMik7CisJdXBhX3dyaXRlcSg1MDAwMDAsIHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9MVFNTTV9DRkczKTsKKwl1cGFfd3JpdGVxKCgyIDw8IDE2KSB8ICgxNDAgPDwgOCksCisJCSAgIHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9MVFNTTV9DRkc0KTsKKwl1cGFfd3JpdGVxKDAsIHBibS0+cGJtX3JlZ3MgKyBGSVJFX0xQVV9MVFNTTV9DRkc1KTsKIAotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfRE1DX0lFTkFCLCB+KHU2NCkwKTsKLQlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX0RNQ19EQkdfU0VMX0EsIDApOwotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfRE1DX0RCR19TRUxfQiwgMCk7CisJdXBhX3dyaXRlcSh+KHU2NCkwLCBwYm0tPnBibV9yZWdzICsgRklSRV9ETUNfSUVOQUIpOworCXVwYV93cml0ZXEoMCwgcGJtLT5wYm1fcmVncyArIEZJUkVfRE1DX0RCR19TRUxfQSk7CisJdXBhX3dyaXRlcSgwLCBwYm0tPnBibV9yZWdzICsgRklSRV9ETUNfREJHX1NFTF9CKTsKIAotCWZpcmVfd3JpdGUocGJtLT5wYm1fcmVncyArIEZJUkVfUEVDX0lFTkFCLCB+KHU2NCkwKTsKKwl1cGFfd3JpdGVxKH4odTY0KTAsIHBibS0+cGJtX3JlZ3MgKyBGSVJFX1BFQ19JRU5BQik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9maXJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgcG9ydGlkKQorc3RhdGljIGludCBfX2luaXQgcGNpX2ZpcmVfcGJtX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdTMyIHBvcnRpZCkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCWludCBlcnI7CiAKLQlpZiAoKHBvcnRpZCAmIDEpID09IDApCi0JCXBibSA9ICZwLT5wYm1fQTsKLQllbHNlCi0JCXBibSA9ICZwLT5wYm1fQjsKLQotCXBibS0+bmV4dCA9IHBjaV9wYm1fcm9vdDsKLQlwY2lfcGJtX3Jvb3QgPSBwYm07Ci0KIAlwYm0tPm51bWFfbm9kZSA9IC0xOwogCi0JcGJtLT5zY2FuX2J1cyA9IHBjaV9maXJlX3NjYW5fYnVzOwogCXBibS0+cGNpX29wcyA9ICZzdW40dV9wY2lfb3BzOwogCXBibS0+Y29uZmlnX3NwYWNlX3JlZ19iaXRzID0gMTI7CiAKIAlwYm0tPmluZGV4ID0gcGNpX251bV9wYm1zKys7CiAKIAlwYm0tPnBvcnRpZCA9IHBvcnRpZDsKLQlwYm0tPnBhcmVudCA9IHA7Ci0JcGJtLT5wcm9tX25vZGUgPSBkcDsKKwlwYm0tPm9wID0gb3A7CiAJcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKIAogCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKQEAgLTQ4MSw1MyArNDQ1LDc3IEBACiAKIAlwY2lfZmlyZV9tc2lfaW5pdChwYm0pOwogCisJcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fb25lX3BibShwYm0sICZvcC0+ZGV2KTsKKworCS8qIFhYWCByZWdpc3RlciBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMgWFhYICovCisKKwlwYm0tPm5leHQgPSBwY2lfcGJtX3Jvb3Q7CisJcGNpX3BibV9yb290ID0gcGJtOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBvcnRpZF9jb21wYXJlKHUzMiB4LCB1MzIgeSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZpcmVfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0JaWYgKHggPT0gKHkgXiAxKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IGZpcmVfcGNpX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY29uc3QgY2hhciAqbW9kZWxfbmFtZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcDsKLQl1MzIgcG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgMHhmZik7Ci0Jc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOworCXN0cnVjdCBpb21tdSAqaW9tbXU7CisJdTMyIHBvcnRpZDsKKwlpbnQgZXJyOwogCi0JZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7Ci0JCWlmIChwb3J0aWRfY29tcGFyZShwYm0tPnBvcnRpZCwgcG9ydGlkKSkgewotCQkJaWYgKHBjaV9maXJlX3BibV9pbml0KHBibS0+cGFyZW50LCBkcCwgcG9ydGlkKSkKLQkJCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKLQkJCXJldHVybjsKLQkJfQorCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIDB4ZmYpOworCisJZXJyID0gLUVOT01FTTsKKwlwYm0gPSBremFsbG9jKHNpemVvZigqcGJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHBjaV9wYm1pbmZvLlxuIik7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXApCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgUEJNIGlvbW11LlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfY29udHJvbGxlcjsKKwl9CiAKLQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9BVE9NSUMpOwotCWlmICghaW9tbXUpCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCXBibS0+aW9tbXUgPSBpb21tdTsKIAotCXAtPnBibV9BLmlvbW11ID0gaW9tbXU7CisJZXJyID0gcGNpX2ZpcmVfcGJtX2luaXQocGJtLCBvcCwgcG9ydGlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2lvbW11OwogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWlvbW11KQotCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHBibSk7CiAKLQlwLT5wYm1fQi5pb21tdSA9IGlvbW11OworCXJldHVybiAwOwogCi0JaWYgKHBjaV9maXJlX3BibV9pbml0KHAsIGRwLCBwb3J0aWQpKQotCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKK291dF9mcmVlX2lvbW11OgorCWtmcmVlKHBibS0+aW9tbXUpOworCQkJCitvdXRfZnJlZV9jb250cm9sbGVyOgorCWtmcmVlKHBibSk7CiAKLQlyZXR1cm47Ci0KLWZhdGFsX21lbW9yeV9lcnJvcjoKLQlwcm9tX3ByaW50ZigiUENJX0ZJUkU6IEZhdGFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIik7Ci0JcHJvbV9oYWx0KCk7CitvdXRfZXJyOgorCXJldHVybiBlcnI7CiB9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgZmlyZV9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAicGNpIiwKKwkJLmNvbXBhdGlibGUgPSAicGNpZXgxMDhlLDgwZjAiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmaXJlX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSBmaXJlX21hdGNoLAorCS5wcm9iZQkJPSBmaXJlX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmlyZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZmlyZV9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChmaXJlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW1wbC5oIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW1wbC5oCmluZGV4IGMzODVkMTIuLjAzMTg2ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pbXBsLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CkBAIC01NiwxNSArNTcsMTEgQEAKIH07CiAjZW5kaWYKIAotc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm87Ci0KIHN0cnVjdCBwY2lfcGJtX2luZm8gewogCXN0cnVjdCBwY2lfcGJtX2luZm8JCSpuZXh0OworCXN0cnVjdCBwY2lfcGJtX2luZm8JCSpzaWJsaW5nOwogCWludAkJCQlpbmRleDsKIAotCS8qIFBDSSBjb250cm9sbGVyIHdlIHNpdCB1bmRlci4gKi8KLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbwkqcGFyZW50OwotCiAJLyogUGh5c2ljYWwgYWRkcmVzcyBiYXNlIG9mIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiAqLwogCXVuc2lnbmVkIGxvbmcJCQljb250cm9sbGVyX3JlZ3M7CiAKQEAgLTk0LDcgKzkxLDcgQEAKIAljaGFyCQkJCSpuYW1lOwogCiAJLyogT0JQIHNwZWNpZmljIGluZm9ybWF0aW9uLiAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCQkqb3A7CiAJdTY0CQkJCWlub19iaXRtYXA7CiAKIAkvKiBQQk0gSS9PIGFuZCBNZW1vcnkgc3BhY2UgcmVzb3VyY2VzLiAqLwpAQCAtMTA3LDYgKzEwNCwxMCBAQAogCS8qIFRoaXMgd2lsbCBiZSAxMiBvbiBQQ0ktRSBjb250cm9sbGVycywgOCBlbHNld2hlcmUuICAqLwogCXVuc2lnbmVkIGxvbmcJCQljb25maWdfc3BhY2VfcmVnX2JpdHM7CiAKKwl1bnNpZ25lZCBsb25nCQkJcGNpX2Fmc3I7CisJdW5zaWduZWQgbG9uZwkJCXBjaV9hZmFyOworCXVuc2lnbmVkIGxvbmcJCQlwY2lfY3NyOworCiAJLyogU3RhdGUgb2YgNjZNSHogY2FwYWJpbGl0aWVzIG9uIHRoaXMgUEJNLiAqLwogCWludAkJCQlpc182Nm1oel9jYXBhYmxlOwogCWludAkJCQlhbGxfZGV2c182Nm1oejsKQEAgLTE0NiwyNSArMTQ3LDE5IEBACiAJdW5zaWduZWQgaW50CQkJcGNpX2ZpcnN0X2J1c25vOwogCXVuc2lnbmVkIGludAkJCXBjaV9sYXN0X2J1c25vOwogCXN0cnVjdCBwY2lfYnVzCQkJKnBjaV9idXM7Ci0Jdm9pZCAoKnNjYW5fYnVzKShzdHJ1Y3QgcGNpX3BibV9pbmZvICopOwogCXN0cnVjdCBwY2lfb3BzCQkJKnBjaV9vcHM7CiAKIAlpbnQJCQkJbnVtYV9ub2RlOwogfTsKIAotc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gewotCS8qIFRoZSBQQ0kgYnVzIG1vZHVsZXMgY29udHJvbGxlZCBieSB1cy4gKi8KLQlzdHJ1Y3QgcGNpX3BibV9pbmZvCQlwYm1fQTsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvCQlwYm1fQjsKLX07Ci0KIGV4dGVybiBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwY2lfcGJtX3Jvb3Q7CiAKIGV4dGVybiBpbnQgcGNpX251bV9wYm1zOwogCiAvKiBQQ0kgYnVzIHNjYW5uaW5nIGFuZCBmaXh1cCBzdXBwb3J0LiAqLwogZXh0ZXJuIHZvaWQgcGNpX2dldF9wYm1fcHJvcHMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKTsKLWV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fb25lX3BibShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pOworZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9vbmVfcGJtKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkJc3RydWN0IGRldmljZSAqcGFyZW50KTsKIGV4dGVybiB2b2lkIHBjaV9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSk7CiAKIC8qIEVycm9yIHJlcG9ydGluZyBzdXBwb3J0LiAqLwpAQCAtMTgzLDQgKzE3OCw4IEBACiBleHRlcm4gc3RydWN0IHBjaV9vcHMgc3VuNHVfcGNpX29wczsKIGV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzdW40dl9wY2lfb3BzOwogCitleHRlcm4gdm9sYXRpbGUgaW50IHBjaV9wb2tlX2luX3Byb2dyZXNzOworZXh0ZXJuIHZvbGF0aWxlIGludCBwY2lfcG9rZV9jcHU7CitleHRlcm4gdm9sYXRpbGUgaW50IHBjaV9wb2tlX2ZhdWx0ZWQ7CisKICNlbmRpZiAvKiAhKFBDSV9JTVBMX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9tc2kuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX21zaS5jCmluZGV4IDYwYzcxZTMuLjJlNjgwZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX21zaS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX21zaS5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAljb25zdCB1MzIgKnZhbDsKIAlpbnQgbGVuOwogCi0JdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAiI21zaS1lcXMiLCAmbGVuKTsKKwl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5vcC0+bm9kZSwgIiNtc2ktZXFzIiwgJmxlbik7CiAJaWYgKCF2YWwgfHwgbGVuICE9IDQpCiAJCWdvdG8gbm9fbXNpOwogCXBibS0+bXNpcV9udW0gPSAqdmFsOwpAQCAtMzQ2LDE2ICszNDYsMTYgQEAKIAkJCXUzMiBtc2k2NF9sZW47CiAJCX0gKmFybmc7CiAKLQkJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAibXNpLWVxLXNpemUiLCAmbGVuKTsKKwkJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJtc2ktZXEtc2l6ZSIsICZsZW4pOwogCQlpZiAoIXZhbCB8fCBsZW4gIT0gNCkKIAkJCWdvdG8gbm9fbXNpOwogCiAJCXBibS0+bXNpcV9lbnRfY291bnQgPSAqdmFsOwogCi0JCW1xcCA9IG9mX2dldF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwKKwkJbXFwID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsCiAJCQkJICAgICAgIm1zaS1lcS10by1kZXZpbm8iLCAmbGVuKTsKIAkJaWYgKCFtcXApCi0JCQltcXAgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsCisJCQltcXAgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5vcC0+bm9kZSwKIAkJCQkJICAgICAgIm1zaS1lcS1kZXZpbm8iLCAmbGVuKTsKIAkJaWYgKCFtcXAgfHwgbGVuICE9IHNpemVvZihzdHJ1Y3QgbXNpcV9wcm9wKSkKIAkJCWdvdG8gbm9fbXNpOwpAQCAtMzYzLDI3ICszNjMsMjcgQEAKIAkJcGJtLT5tc2lxX2ZpcnN0ID0gbXFwLT5maXJzdF9tc2lxOwogCQlwYm0tPm1zaXFfZmlyc3RfZGV2aW5vID0gbXFwLT5maXJzdF9kZXZpbm87CiAKLQkJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAiI21zaSIsICZsZW4pOworCQl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5vcC0+bm9kZSwgIiNtc2kiLCAmbGVuKTsKIAkJaWYgKCF2YWwgfHwgbGVuICE9IDQpCiAJCQlnb3RvIG5vX21zaTsKIAkJcGJtLT5tc2lfbnVtID0gKnZhbDsKIAotCQltcm5nID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAibXNpLXJhbmdlcyIsICZsZW4pOworCQltcm5nID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJtc2ktcmFuZ2VzIiwgJmxlbik7CiAJCWlmICghbXJuZyB8fCBsZW4gIT0gc2l6ZW9mKHN0cnVjdCBtc2lfcmFuZ2VfcHJvcCkpCiAJCQlnb3RvIG5vX21zaTsKIAkJcGJtLT5tc2lfZmlyc3QgPSBtcm5nLT5maXJzdF9tc2k7CiAKLQkJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAibXNpLWRhdGEtbWFzayIsICZsZW4pOworCQl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5vcC0+bm9kZSwgIm1zaS1kYXRhLW1hc2siLCAmbGVuKTsKIAkJaWYgKCF2YWwgfHwgbGVuICE9IDQpCiAJCQlnb3RvIG5vX21zaTsKIAkJcGJtLT5tc2lfZGF0YV9tYXNrID0gKnZhbDsKIAotCQl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICJtc2l4LWRhdGEtd2lkdGgiLCAmbGVuKTsKKwkJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJtc2l4LWRhdGEtd2lkdGgiLCAmbGVuKTsKIAkJaWYgKCF2YWwgfHwgbGVuICE9IDQpCiAJCQlnb3RvIG5vX21zaTsKIAkJcGJtLT5tc2l4X2RhdGFfd2lkdGggPSAqdmFsOwogCi0JCWFybmcgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICJtc2ktYWRkcmVzcy1yYW5nZXMiLAorCQlhcm5nID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJtc2ktYWRkcmVzcy1yYW5nZXMiLAogCQkJCSAgICAgICAmbGVuKTsKIAkJaWYgKCFhcm5nIHx8IGxlbiAhPSBzaXplb2Yoc3RydWN0IGFkZHJfcmFuZ2VfcHJvcCkpCiAJCQlnb3RvIG5vX21zaTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKaW5kZXggZWY1ZmUyOS4uZGZiM2VjOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKQEAgLTE3LDI5ICsxNywxNCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3RhcmZpcmUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS91cGEuaD4KIAogI2luY2x1ZGUgInBjaV9pbXBsLmgiCiAjaW5jbHVkZSAiaW9tbXVfY29tbW9uLmgiCisjaW5jbHVkZSAicHN5Y2hvX2NvbW1vbi5oIgogCi0vKiBBbGwgUFNZQ0hPIHJlZ2lzdGVycyBhcmUgNjQtYml0cy4gIFRoZSBmb2xsb3dpbmcgYWNjZXNzb3IKLSAqIHJvdXRpbmVzIGFyZSBob3cgdGhleSBhcmUgYWNjZXNzZWQuICBUaGUgUkVHIHBhcmFtZXRlcgotICogaXMgYSBwaHlzaWNhbCBhZGRyZXNzLgotICovCi0jZGVmaW5lIHBzeWNob19yZWFkKF9fcmVnKSBcCi0oewl1NjQgX19yZXQ7IFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YSBbJTFdICUyLCAlMCIgXAotCQkJICAgICA6ICI9ciIgKF9fcmV0KSBcCi0JCQkgICAgIDogInIiIChfX3JlZyksICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpIFwKLQkJCSAgICAgOiAibWVtb3J5Iik7IFwKLQlfX3JldDsgXAotfSkKLSNkZWZpbmUgcHN5Y2hvX3dyaXRlKF9fcmVnLCBfX3ZhbCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhICUwLCBbJTFdICUyIiBcCi0JCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLyBcCi0JCQkgICAgIDogInIiIChfX3ZhbCksICJyIiAoX19yZWcpLCBcCi0JCQkgICAgICAgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkgXAotCQkJICAgICA6ICJtZW1vcnkiKQorI2RlZmluZSBEUklWRVJfTkFNRQkicHN5Y2hvIgorI2RlZmluZSBQRlgJCURSSVZFUl9OQU1FICI6ICIKIAogLyogTWlzYy4gUFNZQ0hPIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGRlZmluaXRpb25zLiAqLwogI2RlZmluZSBQU1lDSE9fQ09OVFJPTAkJMHgwMDEwVUwKQEAgLTY3LDM3ICs1Miw3IEBACiAjZGVmaW5lICBQU1lDSE9fUENJQ1RSTF9SRVNWNAkgMHgwMDAwMDAwMDAwMDAwMGMwVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSAgUFNZQ0hPX1BDSUNUUkxfQUVOCSAweDAwMDAwMDAwMDAwMDAwM2ZVTCAvKiBQQ0kgRFZNQSBBcmJpdHJhdGlvbiBFbmFibGUgICovCiAKLS8qIFUyUCBQcm9ncmFtbWVyJ3MgTWFudWFsLCBwYWdlIDEzLTU1LCBjb25maWd1cmF0aW9uIHNwYWNlCi0gKiBhZGRyZXNzIGZvcm1hdDoKLSAqIAotICogIDMyICAgICAgICAgICAgIDI0IDIzIDE2IDE1ICAgIDExIDEwICAgICAgIDggNyAgIDIgIDEgMAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8MCAwIDAgMCAwIDAgMCAwIDF8IGJ1cyB8IGRldmljZSB8IGZ1bmN0aW9uIHwgcmVnIHwgMCAwIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jZGVmaW5lIFBTWUNIT19DT05GSUdfQkFTRShQQk0pCVwKLQkoKFBCTSktPmNvbmZpZ19zcGFjZSB8ICgxVUwgPDwgMjQpKQotI2RlZmluZSBQU1lDSE9fQ09ORklHX0VOQ09ERShCVVMsIERFVkZOLCBSRUcpCVwKLQkoKCh1bnNpZ25lZCBsb25nKShCVVMpICAgPDwgMTYpIHwJXAotCSAoKHVuc2lnbmVkIGxvbmcpKERFVkZOKSA8PCA4KSAgfAlcCi0JICgodW5zaWduZWQgbG9uZykoUkVHKSkpCi0KLXN0YXRpYyB2b2lkICpwc3ljaG9fcGNpX2NvbmZpZ19ta2FkZHIoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgYnVzLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCQkgICAgICBpbnQgd2hlcmUpCi17Ci0JaWYgKCFwYm0pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAodm9pZCAqKQotCQkoUFNZQ0hPX0NPTkZJR19CQVNFKHBibSkgfAotCQkgUFNZQ0hPX0NPTkZJR19FTkNPREUoYnVzLCBkZXZmbiwgd2hlcmUpKTsKLX0KLQogLyogUFNZQ0hPIGVycm9yIGhhbmRsaW5nIHN1cHBvcnQuICovCi1lbnVtIHBzeWNob19lcnJvcl90eXBlIHsKLQlVRV9FUlIsIENFX0VSUiwgUENJX0VSUgotfTsKIAogLyogSGVscGVyIGZ1bmN0aW9uIG9mIElPTU1VIGVycm9yIGNoZWNraW5nLCB3aGljaCBjaGVja3Mgb3V0CiAgKiB0aGUgc3RhdGUgb2YgdGhlIHN0cmVhbWluZyBidWZmZXJzLiAgVGhlIElPTU1VIGxvY2sgaXMKQEAgLTEyMiwxMjkgKzc3LDEwIEBACiAjZGVmaW5lIFBTWUNIT19TVENfREFUQV9CCTB4YzAwMFVMCiAjZGVmaW5lIFBTWUNIT19TVENfRVJSX0EJMHhiNDAwVUwKICNkZWZpbmUgUFNZQ0hPX1NUQ19FUlJfQgkweGM0MDBVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0VSUl9XUklURQkgMHgwMDAwMDAwMDAwMDAwMDAyVUwJLyogV3JpdGUgRXJyb3IgKi8KLSNkZWZpbmUgIFBTWUNIT19TVENFUlJfUkVBRAkgMHgwMDAwMDAwMDAwMDAwMDAxVUwJLyogUmVhZCBFcnJvciAqLwogI2RlZmluZSBQU1lDSE9fU1RDX1RBR19BCTB4YjgwMFVMCiAjZGVmaW5lIFBTWUNIT19TVENfVEFHX0IJMHhjODAwVUwKLSNkZWZpbmUgIFBTWUNIT19TVENUQUdfUFBOCSAweDBmZmZmZmZmMDAwMDAwMDBVTAkvKiBQaHlzaWNhbCBQYWdlIE51bWJlciAqLwotI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19WUE4JIDB4MDAwMDAwMDBmZmZmZTAwMFVMCS8qIFZpcnR1YWwgUGFnZSBOdW1iZXIgKi8KLSNkZWZpbmUgIFBTWUNIT19TVENUQUdfVkFMSUQJIDB4MDAwMDAwMDAwMDAwMDAwMlVMCS8qIFZhbGlkICovCi0jZGVmaW5lICBQU1lDSE9fU1RDVEFHX1dSSVRFCSAweDAwMDAwMDAwMDAwMDAwMDFVTAkvKiBXcml0YWJsZSAqLwogI2RlZmluZSBQU1lDSE9fU1RDX0xJTkVfQQkweGI5MDBVTAogI2RlZmluZSBQU1lDSE9fU1RDX0xJTkVfQgkweGM5MDBVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfTElORFgJIDB4MDAwMDAwMDAwMWUwMDAwMFVMCS8qIExSVSBJbmRleCAqLwotI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfU1BUUgkgMHgwMDAwMDAwMDAwMWY4MDAwVUwJLyogRGlydHkgRGF0YSBTdGFydCBQb2ludGVyICovCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9MQUREUgkgMHgwMDAwMDAwMDAwMDA3ZjAwVUwJLyogTGluZSBBZGRyZXNzICovCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9FUFRSCSAweDAwMDAwMDAwMDAwMDAwZmNVTAkvKiBEaXJ0eSBEYXRhIEVuZCBQb2ludGVyICovCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9WQUxJRAkgMHgwMDAwMDAwMDAwMDAwMDAyVUwJLyogVmFsaWQgKi8KLSNkZWZpbmUgIFBTWUNIT19TVENMSU5FX0ZPRk4JIDB4MDAwMDAwMDAwMDAwMDAwMVVMCS8qIEZldGNoIE91dHN0YW5kaW5nIC8gRmx1c2ggTmVjZXNzYXJ5ICovCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RjX2J1Zl9sb2NrKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0Y19lcnJvcl9idWZbMTI4XTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0Y190YWdfYnVmWzE2XTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0Y19saW5lX2J1ZlsxNl07Ci0KLXN0YXRpYyB2b2lkIF9fcHN5Y2hvX2NoZWNrX29uZV9zdGMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgIGludCBpc19wYm1fYSkKLXsKLQlzdHJ1Y3Qgc3RyYnVmICpzdHJidWYgPSAmcGJtLT5zdGM7Ci0JdW5zaWduZWQgbG9uZyByZWdiYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3M7Ci0JdW5zaWduZWQgbG9uZyBlcnJfYmFzZSwgdGFnX2Jhc2UsIGxpbmVfYmFzZTsKLQl1NjQgY29udHJvbDsKLQlpbnQgaTsKLQotCWlmIChpc19wYm1fYSkgewotCQllcnJfYmFzZSA9IHJlZ2Jhc2UgKyBQU1lDSE9fU1RDX0VSUl9BOwotCQl0YWdfYmFzZSA9IHJlZ2Jhc2UgKyBQU1lDSE9fU1RDX1RBR19BOwotCQlsaW5lX2Jhc2UgPSByZWdiYXNlICsgUFNZQ0hPX1NUQ19MSU5FX0E7Ci0JfSBlbHNlIHsKLQkJZXJyX2Jhc2UgPSByZWdiYXNlICsgUFNZQ0hPX1NUQ19FUlJfQjsKLQkJdGFnX2Jhc2UgPSByZWdiYXNlICsgUFNZQ0hPX1NUQ19UQUdfQjsKLQkJbGluZV9iYXNlID0gcmVnYmFzZSArIFBTWUNIT19TVENfTElORV9COwotCX0KLQotCXNwaW5fbG9jaygmc3RjX2J1Zl9sb2NrKTsKLQotCS8qIFRoaXMgaXMgX19SRUFMTFlfXyBkYW5nZXJvdXMuICBXaGVuIHdlIHB1dCB0aGUKLQkgKiBzdHJlYW1pbmcgYnVmZmVyIGludG8gZGlhZ25vc3RpYyBtb2RlIHRvIHByb2JlCi0JICogaXQncyB0YWdzIGFuZCBlcnJvciBzdGF0dXMsIHdlIF9tdXN0XyBjbGVhciBhbGwKLQkgKiBvZiB0aGUgbGluZSB0YWcgdmFsaWQgYml0cyBiZWZvcmUgcmUtZW5hYmxpbmcKLQkgKiB0aGUgc3RyZWFtaW5nIGJ1ZmZlci4gIElmIGFueSBkaXJ0eSBkYXRhIGxpdmVzCi0JICogaW4gdGhlIFNUQyB3aGVuIHdlIGRvIHRoaXMsIHdlIHdpbGwgZW5kIHVwCi0JICogaW52YWxpZGF0aW5nIGl0IGJlZm9yZSBpdCBoYXMgYSBjaGFuY2UgdG8gcmVhY2gKLQkgKiBtYWluIG1lbW9yeS4KLQkgKi8KLQljb250cm9sID0gcHN5Y2hvX3JlYWQoc3RyYnVmLT5zdHJidWZfY29udHJvbCk7Ci0JcHN5Y2hvX3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wsCi0JCSAgICAgKGNvbnRyb2wgfCBQU1lDSE9fU1RSQlVGX0NUUkxfREVOQUIpKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQkJdmFsID0gcHN5Y2hvX3JlYWQoZXJyX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlwc3ljaG9fd3JpdGUoZXJyX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7Ci0JCXN0Y19lcnJvcl9idWZbaV0gPSB2YWw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXN0Y190YWdfYnVmW2ldID0gcHN5Y2hvX3JlYWQodGFnX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlzdGNfbGluZV9idWZbaV0gPSBwc3ljaG9fcmVhZChsaW5lX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlwc3ljaG9fd3JpdGUodGFnX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7Ci0JCXBzeWNob193cml0ZShsaW5lX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7Ci0JfQotCi0JLyogT0ssIHN0YXRlIGlzIGxvZ2dlZCwgZXhpdCBkaWFnbm9zdGljIG1vZGUuICovCi0JcHN5Y2hvX3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wsIGNvbnRyb2wpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaW50IGosIHNhd19lcnJvciwgZmlyc3QsIGxhc3Q7Ci0KLQkJc2F3X2Vycm9yID0gMDsKLQkJZmlyc3QgPSBpICogODsKLQkJbGFzdCA9IGZpcnN0ICsgODsKLQkJZm9yIChqID0gZmlyc3Q7IGogPCBsYXN0OyBqKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgZXJydmFsID0gc3RjX2Vycm9yX2J1ZltqXTsKLQkJCWlmIChlcnJ2YWwgIT0gMCkgewotCQkJCXNhd19lcnJvcisrOwotCQkJCXByaW50aygiJXM6IFNUQ19FUlIoJWQpW3dyKCVkKXJkKCVkKV1cbiIsCi0JCQkJICAgICAgIHBibS0+bmFtZSwKLQkJCQkgICAgICAgaiwKLQkJCQkgICAgICAgKGVycnZhbCAmIFBTWUNIT19TVENFUlJfV1JJVEUpID8gMSA6IDAsCi0JCQkJICAgICAgIChlcnJ2YWwgJiBQU1lDSE9fU1RDRVJSX1JFQUQpID8gMSA6IDApOwotCQkJfQotCQl9Ci0JCWlmIChzYXdfZXJyb3IgIT0gMCkgewotCQkJdW5zaWduZWQgbG9uZyB0YWd2YWwgPSBzdGNfdGFnX2J1ZltpXTsKLQkJCXVuc2lnbmVkIGxvbmcgbGluZXZhbCA9IHN0Y19saW5lX2J1ZltpXTsKLQkJCXByaW50aygiJXM6IFNUQ19UQUcoJWQpW1BBKCUwMTZseClWQSglMDhseClWKCVkKVcoJWQpXVxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUsCi0JCQkgICAgICAgaSwKLQkJCSAgICAgICAoKHRhZ3ZhbCAmIFBTWUNIT19TVENUQUdfUFBOKSA+PiAxOVVMKSwKLQkJCSAgICAgICAodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19WUE4pLAotCQkJICAgICAgICgodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19WQUxJRCkgPyAxIDogMCksCi0JCQkgICAgICAgKCh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1dSSVRFKSA/IDEgOiAwKSk7Ci0JCQlwcmludGsoIiVzOiBTVENfTElORSglZClbTElEWCglbHgpU1AoJWx4KUxBRERSKCVseClFUCglbHgpIgotCQkJICAgICAgICJWKCVkKUZPRk4oJWQpXVxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUsCi0JCQkgICAgICAgaSwKLQkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9MSU5EWCkgPj4gMjFVTCksCi0JCQkgICAgICAgKChsaW5ldmFsICYgUFNZQ0hPX1NUQ0xJTkVfU1BUUikgPj4gMTVVTCksCi0JCQkgICAgICAgKChsaW5ldmFsICYgUFNZQ0hPX1NUQ0xJTkVfTEFERFIpID4+IDhVTCksCi0JCQkgICAgICAgKChsaW5ldmFsICYgUFNZQ0hPX1NUQ0xJTkVfRVBUUikgPj4gMlVMKSwKLQkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9WQUxJRCkgPyAxIDogMCksCi0JCQkgICAgICAgKChsaW5ldmFsICYgUFNZQ0hPX1NUQ0xJTkVfRk9GTikgPyAxIDogMCkpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnN0Y19idWZfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fcHN5Y2hvX2NoZWNrX3N0Y19lcnJvcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFmc3IsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFmYXIsCi0JCQkJICAgICBlbnVtIHBzeWNob19lcnJvcl90eXBlIHR5cGUpCi17Ci0JX19wc3ljaG9fY2hlY2tfb25lX3N0YyhwYm0sCi0JCQkgICAgICAgKHBibSA9PSAmcGJtLT5wYXJlbnQtPnBibV9BKSk7Ci19CiAKIC8qIFdoZW4gYW4gVW5jb3JyZWN0YWJsZSBFcnJvciBvciBhIFBDSSBFcnJvciBoYXBwZW5zLCB3ZQogICogaW50ZXJyb2dhdGUgdGhlIElPTU1VIHN0YXRlIHRvIHNlZSBpZiBpdCBpcyB0aGUgY2F1c2UuCkBAIC0yNzEsMTIyICsxMDcsNyBAQAogI2RlZmluZSBQU1lDSE9fSU9NTVVfVFNCQkFTRQkweDAyMDhVTAogI2RlZmluZSBQU1lDSE9fSU9NTVVfRkxVU0gJMHgwMjEwVUwKICNkZWZpbmUgUFNZQ0hPX0lPTU1VX1RBRwkweGE1ODBVTAotI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RBR19FUlJTVFMgKDB4M1VMIDw8IDIzVUwpCi0jZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX0VSUgkgKDB4MVVMIDw8IDIyVUwpCi0jZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX1dSSVRFCSAoMHgxVUwgPDwgMjFVTCkKLSNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfU1RSRUFNICgweDFVTCA8PCAyMFVMKQotI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RBR19TSVpFCSAoMHgxVUwgPDwgMTlVTCkKLSNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfVlBBR0UJIDB4N2ZmZmZVTAogI2RlZmluZSBQU1lDSE9fSU9NTVVfREFUQQkweGE2MDBVTAotI2RlZmluZSAgUFNZQ0hPX0lPTU1VX0RBVEFfVkFMSUQgKDFVTCA8PCAzMFVMKQotI2RlZmluZSAgUFNZQ0hPX0lPTU1VX0RBVEFfQ0FDSEUgKDFVTCA8PCAyOFVMKQotI2RlZmluZSAgUFNZQ0hPX0lPTU1VX0RBVEFfUFBBR0UgMHhmZmZmZmZmVUwKLXN0YXRpYyB2b2lkIHBzeWNob19jaGVja19pb21tdV9lcnJvcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFmc3IsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFmYXIsCi0JCQkJICAgICBlbnVtIHBzeWNob19lcnJvcl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7Ci0JdW5zaWduZWQgbG9uZyBpb21tdV90YWdbMTZdOwotCXVuc2lnbmVkIGxvbmcgaW9tbXVfZGF0YVsxNl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1NjQgY29udHJvbDsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCWNvbnRyb2wgPSBwc3ljaG9fcmVhZChpb21tdS0+aW9tbXVfY29udHJvbCk7Ci0JaWYgKGNvbnRyb2wgJiBQU1lDSE9fSU9NTVVfQ1RSTF9YTFRFRVJSKSB7Ci0JCWNoYXIgKnR5cGVfc3RyaW5nOwotCi0JCS8qIENsZWFyIHRoZSBlcnJvciBlbmNvdW50ZXJlZCBiaXQuICovCi0JCWNvbnRyb2wgJj0gflBTWUNIT19JT01NVV9DVFJMX1hMVEVFUlI7Ci0JCXBzeWNob193cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7Ci0KLQkJc3dpdGNoKChjb250cm9sICYgUFNZQ0hPX0lPTU1VX0NUUkxfWExURVNUQVQpID4+IDI1VUwpIHsKLQkJY2FzZSAwOgotCQkJdHlwZV9zdHJpbmcgPSAiUHJvdGVjdGlvbiBFcnJvciI7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJdHlwZV9zdHJpbmcgPSAiSW52YWxpZCBFcnJvciI7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdHlwZV9zdHJpbmcgPSAiVGltZU91dCBFcnJvciI7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJdHlwZV9zdHJpbmcgPSAiRUNDIEVycm9yIjsKLQkJCWJyZWFrOwotCQl9OwotCQlwcmludGsoIiVzOiBJT01NVSBFcnJvciwgdHlwZVslc11cbiIsCi0JCSAgICAgICBwYm0tPm5hbWUsIHR5cGVfc3RyaW5nKTsKLQotCQkvKiBQdXQgdGhlIElPTU1VIGludG8gZGlhZ25vc3RpYyBtb2RlIGFuZCBwcm9iZQotCQkgKiBpdCdzIFRMQiBmb3IgZW50cmllcyB3aXRoIGVycm9yIHN0YXR1cy4KLQkJICoKLQkJICogSXQgaXMgdmVyeSBwb3NzaWJsZSBmb3IgYW5vdGhlciBEVk1BIHRvIG9jY3VyCi0JCSAqIHdoaWxlIHdlIGRvIHRoaXMgcHJvYmUsIGFuZCBjb3JydXB0IHRoZSBzeXN0ZW0KLQkJICogZnVydGhlci4gIEJ1dCB3ZSBhcmUgc28gc2NyZXdlZCBhdCB0aGlzIHBvaW50Ci0JCSAqIHRoYXQgd2UgYXJlIGxpa2VseSB0byBjcmFzaCBoYXJkIGFueXdheXMsIHNvCi0JCSAqIGdldCBhcyBtdWNoIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdG8gdGhlCi0JCSAqIGNvbnNvbGUgYXMgd2UgY2FuLgotCQkgKi8KLQkJcHN5Y2hvX3dyaXRlKGlvbW11LT5pb21tdV9jb250cm9sLAotCQkJICAgICBjb250cm9sIHwgUFNZQ0hPX0lPTU1VX0NUUkxfREVOQUIpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJdW5zaWduZWQgbG9uZyBiYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3M7Ci0KLQkJCWlvbW11X3RhZ1tpXSA9Ci0JCQkJcHN5Y2hvX3JlYWQoYmFzZSArIFBTWUNIT19JT01NVV9UQUcgKyAoaSAqIDhVTCkpOwotCQkJaW9tbXVfZGF0YVtpXSA9Ci0JCQkJcHN5Y2hvX3JlYWQoYmFzZSArIFBTWUNIT19JT01NVV9EQVRBICsgKGkgKiA4VUwpKTsKLQotCQkJLyogTm93IGNsZWFyIG91dCB0aGUgZW50cnkuICovCi0JCQlwc3ljaG9fd3JpdGUoYmFzZSArIFBTWUNIT19JT01NVV9UQUcgKyAoaSAqIDhVTCksIDApOwotCQkJcHN5Y2hvX3dyaXRlKGJhc2UgKyBQU1lDSE9fSU9NTVVfREFUQSArIChpICogOFVMKSwgMCk7Ci0JCX0KLQotCQkvKiBMZWF2ZSBkaWFnbm9zdGljIG1vZGUuICovCi0JCXBzeWNob193cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgdGFnLCBkYXRhOwotCi0JCQl0YWcgPSBpb21tdV90YWdbaV07Ci0JCQlpZiAoISh0YWcgJiBQU1lDSE9fSU9NTVVfVEFHX0VSUikpCi0JCQkJY29udGludWU7Ci0KLQkJCWRhdGEgPSBpb21tdV9kYXRhW2ldOwotCQkJc3dpdGNoKCh0YWcgJiBQU1lDSE9fSU9NTVVfVEFHX0VSUlNUUykgPj4gMjNVTCkgewotCQkJY2FzZSAwOgotCQkJCXR5cGVfc3RyaW5nID0gIlByb3RlY3Rpb24gRXJyb3IiOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXR5cGVfc3RyaW5nID0gIkludmFsaWQgRXJyb3IiOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXR5cGVfc3RyaW5nID0gIlRpbWVPdXQgRXJyb3IiOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJZGVmYXVsdDoKLQkJCQl0eXBlX3N0cmluZyA9ICJFQ0MgRXJyb3IiOwotCQkJCWJyZWFrOwotCQkJfTsKLQkJCXByaW50aygiJXM6IElPTU1VIFRBRyglZClbZXJyb3IoJXMpIHdyKCVkKSBzdHIoJWQpIHN6KCVkSykgdnBnKCUwOGx4KV1cbiIsCi0JCQkgICAgICAgcGJtLT5uYW1lLCBpLCB0eXBlX3N0cmluZywKLQkJCSAgICAgICAoKHRhZyAmIFBTWUNIT19JT01NVV9UQUdfV1JJVEUpID8gMSA6IDApLAotCQkJICAgICAgICgodGFnICYgUFNZQ0hPX0lPTU1VX1RBR19TVFJFQU0pID8gMSA6IDApLAotCQkJICAgICAgICgodGFnICYgUFNZQ0hPX0lPTU1VX1RBR19TSVpFKSA/IDY0IDogOCksCi0JCQkgICAgICAgKHRhZyAmIFBTWUNIT19JT01NVV9UQUdfVlBBR0UpIDw8IElPTU1VX1BBR0VfU0hJRlQpOwotCQkJcHJpbnRrKCIlczogSU9NTVUgREFUQSglZClbdmFsaWQoJWQpIGNhY2hlKCVkKSBwcGcoJTAxNmx4KV1cbiIsCi0JCQkgICAgICAgcGJtLT5uYW1lLCBpLAotCQkJICAgICAgICgoZGF0YSAmIFBTWUNIT19JT01NVV9EQVRBX1ZBTElEKSA/IDEgOiAwKSwKLQkJCSAgICAgICAoKGRhdGEgJiBQU1lDSE9fSU9NTVVfREFUQV9DQUNIRSkgPyAxIDogMCksCi0JCQkgICAgICAgKGRhdGEgJiBQU1lDSE9fSU9NTVVfREFUQV9QUEFHRSkgPDwgSU9NTVVfUEFHRV9TSElGVCk7Ci0JCX0KLQl9Ci0JX19wc3ljaG9fY2hlY2tfc3RjX2Vycm9yKHBibSwgYWZzciwgYWZhciwgdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLX0KIAogLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMuICBDYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHRoZSBhZGRyZXNzIGFyZQogICogcmVjb3JkZWQgaW4gdGhlIFVFX0FGU1IgYW5kIFVFX0FGQVIgb2YgUFNZQ0hPLiAgVGhleSBhcmUgZXJyb3JzCkBAIC00MTAsMTUgKzEzMSwxNCBAQAogc3RhdGljIGlycXJldHVybl90IHBzeWNob191ZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBkZXZfaWQ7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwYm0tPnBhcmVudDsKIAl1bnNpZ25lZCBsb25nIGFmc3JfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fVUVfQUZTUjsKIAl1bnNpZ25lZCBsb25nIGFmYXJfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fVUVfQUZBUjsKIAl1bnNpZ25lZCBsb25nIGFmc3IsIGFmYXIsIGVycm9yX2JpdHM7CiAJaW50IHJlcG9ydGVkOwogCiAJLyogTGF0Y2ggdW5jb3JyZWN0YWJsZSBlcnJvciBzdGF0dXMuICovCi0JYWZhciA9IHBzeWNob19yZWFkKGFmYXJfcmVnKTsKLQlhZnNyID0gcHN5Y2hvX3JlYWQoYWZzcl9yZWcpOworCWFmYXIgPSB1cGFfcmVhZHEoYWZhcl9yZWcpOworCWFmc3IgPSB1cGFfcmVhZHEoYWZzcl9yZWcpOwogCiAJLyogQ2xlYXIgdGhlIHByaW1hcnkvc2Vjb25kYXJ5IGVycm9yIHN0YXR1cyBiaXRzLiAqLwogCWVycm9yX2JpdHMgPSBhZnNyICYKQEAgLTQyNiw3ICsxNDYsNyBAQAogCQkgUFNZQ0hPX1VFQUZTUl9TUElPIHwgUFNZQ0hPX1VFQUZTUl9TRFJEIHwgUFNZQ0hPX1VFQUZTUl9TRFdSKTsKIAlpZiAoIWVycm9yX2JpdHMpCiAJCXJldHVybiBJUlFfTk9ORTsKLQlwc3ljaG9fd3JpdGUoYWZzcl9yZWcsIGVycm9yX2JpdHMpOworCXVwYV93cml0ZXEoZXJyb3JfYml0cywgYWZzcl9yZWcpOwogCiAJLyogTG9nIHRoZSBlcnJvci4gKi8KIAlwcmludGsoIiVzOiBVbmNvcnJlY3RhYmxlIEVycm9yLCBwcmltYXJ5IGVycm9yIHR5cGVbJXNdXG4iLApAQCAtNDYzLDggKzE4Myw5IEBACiAJcHJpbnRrKCJdXG4iKTsKIAogCS8qIEludGVycm9nYXRlIGJvdGggSU9NTVVzIGZvciBlcnJvciBzdGF0dXMuICovCi0JcHN5Y2hvX2NoZWNrX2lvbW11X2Vycm9yKCZwLT5wYm1fQSwgYWZzciwgYWZhciwgVUVfRVJSKTsKLQlwc3ljaG9fY2hlY2tfaW9tbXVfZXJyb3IoJnAtPnBibV9CLCBhZnNyLCBhZmFyLCBVRV9FUlIpOworCXBzeWNob19jaGVja19pb21tdV9lcnJvcihwYm0sIGFmc3IsIGFmYXIsIFVFX0VSUik7CisJaWYgKHBibS0+c2libGluZykKKwkJcHN5Y2hvX2NoZWNrX2lvbW11X2Vycm9yKHBibS0+c2libGluZywgYWZzciwgYWZhciwgVUVfRVJSKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTQ5NSw4ICsyMTYsOCBAQAogCWludCByZXBvcnRlZDsKIAogCS8qIExhdGNoIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gcHN5Y2hvX3JlYWQoYWZhcl9yZWcpOwotCWFmc3IgPSBwc3ljaG9fcmVhZChhZnNyX3JlZyk7CisJYWZhciA9IHVwYV9yZWFkcShhZmFyX3JlZyk7CisJYWZzciA9IHVwYV9yZWFkcShhZnNyX3JlZyk7CiAKIAkvKiBDbGVhciBwcmltYXJ5L3NlY29uZGFyeSBlcnJvciBzdGF0dXMgYml0cy4gKi8KIAllcnJvcl9iaXRzID0gYWZzciAmCkBAIC01MDQsNyArMjI1LDcgQEAKIAkJIFBTWUNIT19DRUFGU1JfU1BJTyB8IFBTWUNIT19DRUFGU1JfU0RSRCB8IFBTWUNIT19DRUFGU1JfU0RXUik7CiAJaWYgKCFlcnJvcl9iaXRzKQogCQlyZXR1cm4gSVJRX05PTkU7Ci0JcHN5Y2hvX3dyaXRlKGFmc3JfcmVnLCBlcnJvcl9iaXRzKTsKKwl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIGFmc3JfcmVnKTsKIAogCS8qIExvZyB0aGUgZXJyb3IuICovCiAJcHJpbnRrKCIlczogQ29ycmVjdGFibGUgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslc11cbiIsCkBAIC01NTQsMTYyICsyNzUsOSBAQAogICovCiAjZGVmaW5lIFBTWUNIT19QQ0lfQUZTUl9BCTB4MjAxMFVMCiAjZGVmaW5lIFBTWUNIT19QQ0lfQUZTUl9CCTB4NDAxMFVMCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9QTUEJMHg4MDAwMDAwMDAwMDAwMDAwVUwgLyogUHJpbWFyeSBNYXN0ZXIgQWJvcnQgRXJyb3IgICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUFRBCTB4NDAwMDAwMDAwMDAwMDAwMFVMIC8qIFByaW1hcnkgVGFyZ2V0IEFib3J0IEVycm9yICAgKi8KLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1BSVFJZCTB4MjAwMDAwMDAwMDAwMDAwMFVMIC8qIFByaW1hcnkgRXhjZXNzaXZlIFJldHJpZXMgICAgKi8KLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1BQRVJSCTB4MTAwMDAwMDAwMDAwMDAwMFVMIC8qIFByaW1hcnkgUGFyaXR5IEVycm9yICAgICAgICAgKi8KLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NNQQkweDA4MDAwMDAwMDAwMDAwMDBVTCAvKiBTZWNvbmRhcnkgTWFzdGVyIEFib3J0IEVycm9yICovCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9TVEEJMHgwNDAwMDAwMDAwMDAwMDAwVUwgLyogU2Vjb25kYXJ5IFRhcmdldCBBYm9ydCBFcnJvciAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfU1JUUlkJMHgwMjAwMDAwMDAwMDAwMDAwVUwgLyogU2Vjb25kYXJ5IEV4Y2Vzc2l2ZSBSZXRyaWVzICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfU1BFUlIJMHgwMTAwMDAwMDAwMDAwMDAwVUwgLyogU2Vjb25kYXJ5IFBhcml0eSBFcnJvciAgICAgICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUkVTVjEJMHgwMGZmMDAwMDAwMDAwMDAwVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfQk1TSwkweDAwMDBmZmZmMDAwMDAwMDBVTCAvKiBCeXRlbWFzayBvZiBmYWlsZWQgdHJhbnNmZXIgICovCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9CTEsJMHgwMDAwMDAwMDgwMDAwMDAwVUwgLyogVHJhbnMgd2FzIGJsb2NrIG9wZXJhdGlvbiAgICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUkVTVjIJMHgwMDAwMDAwMDQwMDAwMDAwVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfTUlECTB4MDAwMDAwMDAzZTAwMDAwMFVMIC8qIE1JRCBjYXVzaW5nIHRoZSBlcnJvciAgICAgICAgKi8KLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1JFU1YzCTB4MDAwMDAwMDAwMWZmZmZmZlVMIC8qIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgUFNZQ0hPX1BDSV9BRkFSX0EJMHgyMDE4VUwKICNkZWZpbmUgUFNZQ0hPX1BDSV9BRkFSX0IJMHg0MDE4VUwKIAotc3RhdGljIGlycXJldHVybl90IHBzeWNob19wY2llcnJfaW50cl9vdGhlcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIGludCBpc19wYm1fYSkKLXsKLQl1bnNpZ25lZCBsb25nIGNzcl9yZWcsIGNzciwgY3NyX2Vycm9yX2JpdHM7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0JdTE2IHN0YXQ7Ci0KLQlpZiAoaXNfcGJtX2EpIHsKLQkJY3NyX3JlZyA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTDsKLQl9IGVsc2UgewotCQljc3JfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9DVFJMOwotCX0KLQljc3IgPSBwc3ljaG9fcmVhZChjc3JfcmVnKTsKLQljc3JfZXJyb3JfYml0cyA9Ci0JCWNzciAmIChQU1lDSE9fUENJQ1RSTF9TQkhfRVJSIHwgUFNZQ0hPX1BDSUNUUkxfU0VSUik7Ci0JaWYgKGNzcl9lcnJvcl9iaXRzKSB7Ci0JCS8qIENsZWFyIHRoZSBlcnJvcnMuICAqLwotCQlwc3ljaG9fd3JpdGUoY3NyX3JlZywgY3NyKTsKLQotCQkvKiBMb2cgJ2VtLiAgKi8KLQkJaWYgKGNzcl9lcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUNUUkxfU0JIX0VSUikKLQkJCXByaW50aygiJXM6IFBDSSBzdHJlYW1pbmcgYnl0ZSBob2xlIGVycm9yIGFzc2VydGVkLlxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUpOwotCQlpZiAoY3NyX2Vycm9yX2JpdHMgJiBQU1lDSE9fUENJQ1RSTF9TRVJSKQotCQkJcHJpbnRrKCIlczogUENJIFNFUlIgc2lnbmFsIGFzc2VydGVkLlxuIiwgcGJtLT5uYW1lKTsKLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0JfQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBibS0+cGNpX2J1cy0+c2VsZiwgUENJX1NUQVRVUywgJnN0YXQpOwotCWlmIChzdGF0ICYgKFBDSV9TVEFUVVNfUEFSSVRZIHwKLQkJICAgIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCB8Ci0JCSAgICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfAotCQkgICAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwKLQkJICAgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUikpIHsKLQkJcHJpbnRrKCIlczogUENJIGJ1cyBlcnJvciwgUENJX1NUQVRVU1slMDR4XVxuIiwKLQkJICAgICAgIHBibS0+bmFtZSwgc3RhdCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwYm0tPnBjaV9idXMtPnNlbGYsIFBDSV9TVEFUVVMsIDB4ZmZmZik7Ci0JCXJldCA9IElSUV9IQU5ETEVEOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgcHN5Y2hvX3BjaWVycl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBkZXZfaWQ7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwYm0tPnBhcmVudDsKLQl1bnNpZ25lZCBsb25nIGFmc3JfcmVnLCBhZmFyX3JlZzsKLQl1bnNpZ25lZCBsb25nIGFmc3IsIGFmYXIsIGVycm9yX2JpdHM7Ci0JaW50IGlzX3BibV9hLCByZXBvcnRlZDsKLQotCWlzX3BibV9hID0gKHBibSA9PSAmcGJtLT5wYXJlbnQtPnBibV9BKTsKLQlpZiAoaXNfcGJtX2EpIHsKLQkJYWZzcl9yZWcgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJX0FGU1JfQTsKLQkJYWZhcl9yZWcgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJX0FGQVJfQTsKLQl9IGVsc2UgewotCQlhZnNyX3JlZyA9IHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lfQUZTUl9COwotCQlhZmFyX3JlZyA9IHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lfQUZBUl9COwotCX0KLQotCS8qIExhdGNoIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gcHN5Y2hvX3JlYWQoYWZhcl9yZWcpOwotCWFmc3IgPSBwc3ljaG9fcmVhZChhZnNyX3JlZyk7Ci0KLQkvKiBDbGVhciBwcmltYXJ5L3NlY29uZGFyeSBlcnJvciBzdGF0dXMgYml0cy4gKi8KLQllcnJvcl9iaXRzID0gYWZzciAmCi0JCShQU1lDSE9fUENJQUZTUl9QTUEgfCBQU1lDSE9fUENJQUZTUl9QVEEgfAotCQkgUFNZQ0hPX1BDSUFGU1JfUFJUUlkgfCBQU1lDSE9fUENJQUZTUl9QUEVSUiB8Ci0JCSBQU1lDSE9fUENJQUZTUl9TTUEgfCBQU1lDSE9fUENJQUZTUl9TVEEgfAotCQkgUFNZQ0hPX1BDSUFGU1JfU1JUUlkgfCBQU1lDSE9fUENJQUZTUl9TUEVSUik7Ci0JaWYgKCFlcnJvcl9iaXRzKQotCQlyZXR1cm4gcHN5Y2hvX3BjaWVycl9pbnRyX290aGVyKHBibSwgaXNfcGJtX2EpOwotCXBzeWNob193cml0ZShhZnNyX3JlZywgZXJyb3JfYml0cyk7Ci0KLQkvKiBMb2cgdGhlIGVycm9yLiAqLwotCXByaW50aygiJXM6IFBDSSBFcnJvciwgcHJpbWFyeSBlcnJvciB0eXBlWyVzXVxuIiwKLQkgICAgICAgcGJtLT5uYW1lLAotCSAgICAgICAoKChlcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUFGU1JfUE1BKSA/Ci0JCSAiTWFzdGVyIEFib3J0IiA6Ci0JCSAoKGVycm9yX2JpdHMgJiBQU1lDSE9fUENJQUZTUl9QVEEpID8KLQkJICAiVGFyZ2V0IEFib3J0IiA6Ci0JCSAgKChlcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUFGU1JfUFJUUlkpID8KLQkJICAgIkV4Y2Vzc2l2ZSBSZXRyaWVzIiA6Ci0JCSAgICgoZXJyb3JfYml0cyAmIFBTWUNIT19QQ0lBRlNSX1BQRVJSKSA/Ci0JCSAgICAiUGFyaXR5IEVycm9yIiA6ICI/Pz8iKSkpKSkpOwotCXByaW50aygiJXM6IGJ5dGVtYXNrWyUwNGx4XSBVUEFfTUlEWyUwMmx4XSB3YXNfYmxvY2soJWQpXG4iLAotCSAgICAgICBwYm0tPm5hbWUsCi0JICAgICAgIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfQk1TSykgPj4gMzJVTCwKLQkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9NSUQpID4+IDI1VUwsCi0JICAgICAgIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfQkxLKSA/IDEgOiAwKTsKLQlwcmludGsoIiVzOiBQQ0kgQUZBUiBbJTAxNmx4XVxuIiwgcGJtLT5uYW1lLCBhZmFyKTsKLQlwcmludGsoIiVzOiBQQ0kgU2Vjb25kYXJ5IGVycm9ycyBbIiwgcGJtLT5uYW1lKTsKLQlyZXBvcnRlZCA9IDA7Ci0JaWYgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9TTUEpIHsKLQkJcmVwb3J0ZWQrKzsKLQkJcHJpbnRrKCIoTWFzdGVyIEFib3J0KSIpOwotCX0KLQlpZiAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX1NUQSkgewotCQlyZXBvcnRlZCsrOwotCQlwcmludGsoIihUYXJnZXQgQWJvcnQpIik7Ci0JfQotCWlmIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfU1JUUlkpIHsKLQkJcmVwb3J0ZWQrKzsKLQkJcHJpbnRrKCIoRXhjZXNzaXZlIFJldHJpZXMpIik7Ci0JfQotCWlmIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfU1BFUlIpIHsKLQkJcmVwb3J0ZWQrKzsKLQkJcHJpbnRrKCIoUGFyaXR5IEVycm9yKSIpOwotCX0KLQlpZiAoIXJlcG9ydGVkKQotCQlwcmludGsoIihub25lKSIpOwotCXByaW50aygiXVxuIik7Ci0KLQkvKiBGb3IgdGhlIGVycm9yIHR5cGVzIHNob3duLCBzY2FuIFBCTSdzIFBDSSBidXMgZm9yIGRldmljZXMKLQkgKiB3aGljaCBoYXZlIGxvZ2dlZCB0aGF0IGVycm9yIHR5cGUuCi0JICovCi0KLQkvKiBJZiB3ZSBzZWUgYSBUYXJnZXQgQWJvcnQsIHRoaXMgY291bGQgYmUgdGhlIHJlc3VsdCBvZiBhbgotCSAqIElPTU1VIHRyYW5zbGF0aW9uIGVycm9yIG9mIHNvbWUgc29ydC4gIEl0IGlzIGV4dHJlbWVseQotCSAqIHVzZWZ1bCB0byBsb2cgdGhpcyBpbmZvcm1hdGlvbiBhcyB1c3VhbGx5IGl0IGluZGljYXRlcwotCSAqIGEgYnVnIGluIHRoZSBJT01NVSBzdXBwb3J0IGNvZGUgb3IgYSBQQ0kgZGV2aWNlIGRyaXZlci4KLQkgKi8KLQlpZiAoZXJyb3JfYml0cyAmIChQU1lDSE9fUENJQUZTUl9QVEEgfCBQU1lDSE9fUENJQUZTUl9TVEEpKSB7Ci0JCXBzeWNob19jaGVja19pb21tdV9lcnJvcihwYm0sIGFmc3IsIGFmYXIsIFBDSV9FUlIpOwotCQlwY2lfc2Nhbl9mb3JfdGFyZ2V0X2Fib3J0KHBibSwgcGJtLT5wY2lfYnVzKTsKLQl9Ci0JaWYgKGVycm9yX2JpdHMgJiAoUFNZQ0hPX1BDSUFGU1JfUE1BIHwgUFNZQ0hPX1BDSUFGU1JfU01BKSkKLQkJcGNpX3NjYW5fZm9yX21hc3Rlcl9hYm9ydChwYm0sIHBibS0+cGNpX2J1cyk7Ci0KLQkvKiBGb3IgZXhjZXNzaXZlIHJldHJpZXMsIFBTWUNITy9QQk0gd2lsbCBhYm9ydCB0aGUgZGV2aWNlCi0JICogYW5kIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZpY2FsbHkgY2hlY2sgZm9yIGV4Y2Vzc2l2ZQotCSAqIHJldHJpZXMgaW4gdGhlIGNvbmZpZyBzcGFjZSBzdGF0dXMgcmVnaXN0ZXJzLiAgU28gd2hhdAotCSAqIHdlIGhvcGUgaXMgdGhhdCB3ZSdsbCBjYXRjaCBpdCB2aWEgdGhlIG1hc3Rlci90YXJnZXQKLQkgKiBhYm9ydCBldmVudHMuCi0JICovCi0KLQlpZiAoZXJyb3JfYml0cyAmIChQU1lDSE9fUENJQUZTUl9QUEVSUiB8IFBTWUNIT19QQ0lBRlNSX1NQRVJSKSkKLQkJcGNpX3NjYW5fZm9yX3Bhcml0eV9lcnJvcihwYm0sIHBibS0+cGNpX2J1cyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KIC8qIFhYWCBXaGF0IGFib3V0IFBvd2VyRmFpbC9Qb3dlck1hbmFnZW1lbnQ/Pz8gLURhdmVNICovCiAjZGVmaW5lIFBTWUNIT19FQ0NfQ1RSTAkJMHgwMDIwCiAjZGVmaW5lICBQU1lDSE9fRUNDQ1RSTF9FRQkgMHg4MDAwMDAwMDAwMDAwMDAwVUwgLyogRW5hYmxlIEVDQyBDaGVja2luZyAqLwpAQCAtNzE3LDcgKzI4NSw3IEBACiAjZGVmaW5lICBQU1lDSE9fRUNDQ1RSTF9DRQkgMHgyMDAwMDAwMDAwMDAwMDAwVUwgLyogRW5hYmxlIENFIElOdGVycnVwdHMgKi8KIHN0YXRpYyB2b2lkIHBzeWNob19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7Ci0Jc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHBibS0+cHJvbV9ub2RlKTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUocGJtLT5vcC0+bm9kZSk7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3M7CiAJdTY0IHRtcDsKIAlpbnQgZXJyOwpAQCAtNzQ0LDQzICszMTIsNDIgQEAKIAkgKiB0aGUgc2Vjb25kIHdpbGwganVzdCBlcnJvciBvdXQgc2luY2Ugd2UgZG8gbm90IHBhc3MgaW4KIAkgKiBJUlFGX1NIQVJFRC4KIAkgKi8KLQllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1sxXSwgcHN5Y2hvX3VlX2ludHIsIDAsCisJZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMV0sIHBzeWNob191ZV9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJCSAgIlBTWUNIT19VRSIsIHBibSk7Ci0JZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMl0sIHBzeWNob19jZV9pbnRyLCAwLAorCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzJdLCBwc3ljaG9fY2VfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQkgICJQU1lDSE9fQ0UiLCBwYm0pOwogCiAJLyogVGhpcyBvbmUsIGhvd2V2ZXIsIG91Z2h0IG5vdCB0byBmYWlsLiAgV2UgY2FuIGp1c3Qgd2FybgogCSAqIGFib3V0IGl0IHNpbmNlIHRoZSBzeXN0ZW0gY2FuIHN0aWxsIG9wZXJhdGUgcHJvcGVybHkgZXZlbgogCSAqIGlmIHRoaXMgZmFpbHMuCiAJICovCi0JZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIHBzeWNob19wY2llcnJfaW50ciwgMCwKKwllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1swXSwgcHN5Y2hvX3BjaWVycl9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJCSAgIlBTWUNIT19QQ0lFUlIiLCBwYm0pOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgUENJRVJSLCAiCiAJCSAgICAgICAiZXJyPSVkXG4iLCBwYm0tPm5hbWUsIGVycik7CiAKIAkvKiBFbmFibGUgVUUgYW5kIENFIGludGVycnVwdHMgZm9yIGNvbnRyb2xsZXIuICovCi0JcHN5Y2hvX3dyaXRlKGJhc2UgKyBQU1lDSE9fRUNDX0NUUkwsCi0JCSAgICAgKFBTWUNIT19FQ0NDVFJMX0VFIHwKLQkJICAgICAgUFNZQ0hPX0VDQ0NUUkxfVUUgfAotCQkgICAgICBQU1lDSE9fRUNDQ1RSTF9DRSkpOworCXVwYV93cml0ZXEoKFBTWUNIT19FQ0NDVFJMX0VFIHwKKwkJICAgIFBTWUNIT19FQ0NDVFJMX1VFIHwKKwkJICAgIFBTWUNIT19FQ0NDVFJMX0NFKSwgYmFzZSArIFBTWUNIT19FQ0NfQ1RSTCk7CiAKIAkvKiBFbmFibGUgUENJIEVycm9yIGludGVycnVwdHMgYW5kIGNsZWFyIGVycm9yCiAJICogYml0cyBmb3IgZWFjaCBQQk0uCiAJICovCi0JdG1wID0gcHN5Y2hvX3JlYWQoYmFzZSArIFBTWUNIT19QQ0lBX0NUUkwpOworCXRtcCA9IHVwYV9yZWFkcShiYXNlICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CiAJdG1wIHw9IChQU1lDSE9fUENJQ1RSTF9TRVJSIHwKIAkJUFNZQ0hPX1BDSUNUUkxfU0JIX0VSUiB8CiAJCVBTWUNIT19QQ0lDVFJMX0VFTik7CiAJdG1wICY9IH4oUFNZQ0hPX1BDSUNUUkxfU0JIX0lOVCk7Ci0JcHN5Y2hvX3dyaXRlKGJhc2UgKyBQU1lDSE9fUENJQV9DVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBiYXNlICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CiAJCSAgICAgCi0JdG1wID0gcHN5Y2hvX3JlYWQoYmFzZSArIFBTWUNIT19QQ0lCX0NUUkwpOworCXRtcCA9IHVwYV9yZWFkcShiYXNlICsgUFNZQ0hPX1BDSUJfQ1RSTCk7CiAJdG1wIHw9IChQU1lDSE9fUENJQ1RSTF9TRVJSIHwKIAkJUFNZQ0hPX1BDSUNUUkxfU0JIX0VSUiB8CiAJCVBTWUNIT19QQ0lDVFJMX0VFTik7CiAJdG1wICY9IH4oUFNZQ0hPX1BDSUNUUkxfU0JIX0lOVCk7Ci0JcHN5Y2hvX3dyaXRlKGJhc2UgKyBQU1lDSE9fUENJQl9DVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBiYXNlICsgUFNZQ0hPX1BDSUJfQ1RSTCk7CiB9CiAKIC8qIFBTWUNITyBib290IHRpbWUgcHJvYmluZyBhbmQgaW5pdGlhbGl6YXRpb24uICovCkBAIC04MDEsMTEgKzM2OCwxMiBAQAogCXBjaV9jb25maWdfd3JpdGU4KGFkZHIsIDY0KTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBzeWNob19zY2FuX2J1cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX3NjYW5fYnVzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7CiAJcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcocGJtKTsKIAlwYm0tPmlzXzY2bWh6X2NhcGFibGUgPSAwOwotCXBibS0+cGNpX2J1cyA9IHBjaV9zY2FuX29uZV9wYm0ocGJtKTsKKwlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSwgcGFyZW50KTsKIAogCS8qIEFmdGVyIHRoZSBQQ0kgYnVzIHNjYW4gaXMgY29tcGxldGUsIHdlIGNhbiByZWdpc3RlcgogCSAqIHRoZSBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMuCkBAIC04MTMsNjEgKzM4MSw2IEBACiAJcHN5Y2hvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHBibSk7CiB9CiAKLXN0YXRpYyBpbnQgcHN5Y2hvX2lvbW11X2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQotewotCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwotCXVuc2lnbmVkIGxvbmcgaTsKLQl1NjQgY29udHJvbDsKLQlpbnQgZXJyOwotCi0JLyogUmVnaXN0ZXIgYWRkcmVzc2VzLiAqLwotCWlvbW11LT5pb21tdV9jb250cm9sICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPTU1VX0NPTlRST0w7Ci0JaW9tbXUtPmlvbW11X3RzYmJhc2UgID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfVFNCQkFTRTsKLQlpb21tdS0+aW9tbXVfZmx1c2ggICAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9GTFVTSDsKLQlpb21tdS0+aW9tbXVfdGFncyAgICAgPSBpb21tdS0+aW9tbXVfZmx1c2ggKyAoMHhhNTgwVUwgLSAweDAyMTBVTCk7Ci0KLQkvKiBQU1lDSE8ncyBJT01NVSBsYWNrcyBjdHggZmx1c2hpbmcuICovCi0JaW9tbXUtPmlvbW11X2N0eGZsdXNoID0gMDsKLQotCS8qIFdlIHVzZSB0aGUgbWFpbiBjb250cm9sIHJlZ2lzdGVyIG9mIFBTWUNITyBhcyB0aGUgd3JpdGUKLQkgKiBjb21wbGV0aW9uIHJlZ2lzdGVyLgotCSAqLwotCWlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19DT05UUk9MOwotCi0JLyoKLQkgKiBJbnZhbGlkYXRlIFRMQiBFbnRyaWVzLgotCSAqLwotCWNvbnRyb2wgPSBwc3ljaG9fcmVhZChwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9DT05UUk9MKTsKLQljb250cm9sIHw9IFBTWUNIT19JT01NVV9DVFJMX0RFTkFCOwotCXBzeWNob193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9DT05UUk9MLCBjb250cm9sKTsKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXBzeWNob193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9UQUcgKyAoaSAqIDhVTCksIDApOwotCQlwc3ljaG9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfREFUQSArIChpICogOFVMKSwgMCk7Ci0JfQotCi0JLyogTGVhdmUgZGlhZyBtb2RlIGVuYWJsZWQgZm9yIGZ1bGwtZmx1c2hpbmcgZG9uZQotCSAqIGluIHBjaV9pb21tdS5jCi0JICovCi0JZXJyID0gaW9tbXVfdGFibGVfaW5pdChpb21tdSwgSU9fVFNCX1NJWkUsIDB4YzAwMDAwMDAsIDB4ZmZmZmZmZmYsCi0JCQkgICAgICAgcGJtLT5udW1hX25vZGUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlwc3ljaG9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfVFNCQkFTRSwKLQkJICAgICBfX3BhKGlvbW11LT5wYWdlX3RhYmxlKSk7Ci0KLQljb250cm9sID0gcHN5Y2hvX3JlYWQocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfQ09OVFJPTCk7Ci0JY29udHJvbCAmPSB+KFBTWUNIT19JT01NVV9DVFJMX1RTQlNaIHwgUFNZQ0hPX0lPTU1VX0NUUkxfVEJXU1opOwotCWNvbnRyb2wgfD0gKFBTWUNIT19JT01NVV9UU0JTWl8xMjhLIHwgUFNZQ0hPX0lPTU1VX0NUUkxfRU5BQik7Ci0JcHN5Y2hvX3dyaXRlKHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPTU1VX0NPTlRST0wsIGNvbnRyb2wpOwotCi0JLyogSWYgbmVjZXNzYXJ5LCBob29rIHVzIHVwIGZvciBzdGFyZmlyZSBJUlEgdHJhbnNsYXRpb25zLiAqLwotCWlmICh0aGlzX2lzX3N0YXJmaXJlKQotCQlzdGFyZmlyZV9ob29rdXAocGJtLT5wb3J0aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KICNkZWZpbmUgUFNZQ0hPX0lSUV9SRVRSWQkweDFhMDBVTAogI2RlZmluZSBQU1lDSE9fUENJQV9ESUFHCTB4MjAyMFVMCiAjZGVmaW5lIFBTWUNIT19QQ0lCX0RJQUcJMHg0MDIwVUwKQEAgLTg4NCwyOCArMzk3LDI4IEBACiB7CiAJdTY0IHRtcDsKIAotCXBzeWNob193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JUlFfUkVUUlksIDUpOworCXVwYV93cml0ZXEoNSwgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSVJRX1JFVFJZKTsKIAogCS8qIEVuYWJsZSBhcmJpdGVyIGZvciBhbGwgUENJIHNsb3RzLiAqLwotCXRtcCA9IHBzeWNob19yZWFkKHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CisJdG1wID0gdXBhX3JlYWRxKHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CiAJdG1wIHw9IFBTWUNIT19QQ0lDVFJMX0FFTjsKLQlwc3ljaG9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQV9DVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lBX0NUUkwpOwogCi0JdG1wID0gcHN5Y2hvX3JlYWQocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9DVFJMKTsKKwl0bXAgPSB1cGFfcmVhZHEocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9DVFJMKTsKIAl0bXAgfD0gUFNZQ0hPX1BDSUNUUkxfQUVOOwotCXBzeWNob193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lCX0NUUkwsIHRtcCk7CisJdXBhX3dyaXRlcSh0bXAsIHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUJfQ1RSTCk7CiAKIAkvKiBEaXNhYmxlIERNQSB3cml0ZSAvIFBJTyByZWFkIHN5bmNocm9uaXphdGlvbiBvbgogCSAqIGJvdGggUENJIGJ1cyBzZWdtZW50cy4KIAkgKiBbIFUyUCBFcnJhdHVtIDEyNDM3NzAsIFNUUDIyMjNCR0EgZGF0YSBzaGVldCBdCiAJICovCi0JdG1wID0gcHN5Y2hvX3JlYWQocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQV9ESUFHKTsKKwl0bXAgPSB1cGFfcmVhZHEocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQV9ESUFHKTsKIAl0bXAgfD0gUFNZQ0hPX1BDSURJQUdfRERXU1lOQzsKLQlwc3ljaG9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQV9ESUFHLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lBX0RJQUcpOwogCi0JdG1wID0gcHN5Y2hvX3JlYWQocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9ESUFHKTsKKwl0bXAgPSB1cGFfcmVhZHEocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9ESUFHKTsKIAl0bXAgfD0gUFNZQ0hPX1BDSURJQUdfRERXU1lOQzsKLQlwc3ljaG9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJQl9ESUFHLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lCX0RJQUcpOwogfQogCiBzdGF0aWMgdm9pZCBwc3ljaG9fcGJtX3N0cmJ1Zl9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKQEAgLTkxOCwxMCArNDMxLDE2IEBACiAJCXBibS0+c3RjLnN0cmJ1Zl9jb250cm9sICA9IGJhc2UgKyBQU1lDSE9fU1RSQlVGX0NPTlRST0xfQTsKIAkJcGJtLT5zdGMuc3RyYnVmX3BmbHVzaCAgID0gYmFzZSArIFBTWUNIT19TVFJCVUZfRkxVU0hfQTsKIAkJcGJtLT5zdGMuc3RyYnVmX2ZzeW5jICAgID0gYmFzZSArIFBTWUNIT19TVFJCVUZfRlNZTkNfQTsKKwkJcGJtLT5zdGMuc3RyYnVmX2Vycl9zdGF0ID0gYmFzZSArIFBTWUNIT19TVENfRVJSX0E7CisJCXBibS0+c3RjLnN0cmJ1Zl90YWdfZGlhZyA9IGJhc2UgKyBQU1lDSE9fU1RDX1RBR19BOworCQlwYm0tPnN0Yy5zdHJidWZfbGluZV9kaWFnPSBiYXNlICsgUFNZQ0hPX1NUQ19MSU5FX0E7CiAJfSBlbHNlIHsKIAkJcGJtLT5zdGMuc3RyYnVmX2NvbnRyb2wgID0gYmFzZSArIFBTWUNIT19TVFJCVUZfQ09OVFJPTF9COwogCQlwYm0tPnN0Yy5zdHJidWZfcGZsdXNoICAgPSBiYXNlICsgUFNZQ0hPX1NUUkJVRl9GTFVTSF9COwogCQlwYm0tPnN0Yy5zdHJidWZfZnN5bmMgICAgPSBiYXNlICsgUFNZQ0hPX1NUUkJVRl9GU1lOQ19COworCQlwYm0tPnN0Yy5zdHJidWZfZXJyX3N0YXQgPSBiYXNlICsgUFNZQ0hPX1NUQ19FUlJfQjsKKwkJcGJtLT5zdGMuc3RyYnVmX3RhZ19kaWFnID0gYmFzZSArIFBTWUNIT19TVENfVEFHX0I7CisJCXBibS0+c3RjLnN0cmJ1Zl9saW5lX2RpYWc9IGJhc2UgKyBQU1lDSE9fU1RDX0xJTkVfQjsKIAl9CiAJLyogUFNZQ0hPJ3Mgc3RyZWFtaW5nIGJ1ZmZlciBsYWNrcyBjdHggZmx1c2hpbmcuICovCiAJcGJtLT5zdGMuc3RyYnVmX2N0eGZsdXNoICAgICAgPSAwOwpAQCAtOTQ0LDcgKzQ2Myw3IEBACiAJICovCiAjdW5kZWYgUFNZQ0hPX1NUUkJVRl9SRVJVTl9FTkFCTEUKICN1bmRlZiBQU1lDSE9fU1RSQlVGX1JFUlVOX0RJU0FCTEUKLQljb250cm9sID0gcHN5Y2hvX3JlYWQocGJtLT5zdGMuc3RyYnVmX2NvbnRyb2wpOworCWNvbnRyb2wgPSB1cGFfcmVhZHEocGJtLT5zdGMuc3RyYnVmX2NvbnRyb2wpOwogCWNvbnRyb2wgfD0gUFNZQ0hPX1NUUkJVRl9DVFJMX0VOQUI7CiAJY29udHJvbCAmPSB+KFBTWUNIT19TVFJCVUZfQ1RSTF9MRU5BQiB8IFBTWUNIT19TVFJCVUZfQ1RSTF9MUFRSKTsKICNpZmRlZiBQU1lDSE9fU1RSQlVGX1JFUlVOX0VOQUJMRQpAQCAtOTU0LDcgKzQ3Myw3IEBACiAJY29udHJvbCB8PSBQU1lDSE9fU1RSQlVGX0NUUkxfUlJESVM7CiAjZW5kaWYKICNlbmRpZgotCXBzeWNob193cml0ZShwYm0tPnN0Yy5zdHJidWZfY29udHJvbCwgY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sLCBwYm0tPnN0Yy5zdHJidWZfY29udHJvbCk7CiAKIAlwYm0tPnN0Yy5zdHJidWZfZW5hYmxlZCA9IDE7CiB9CkBAIC05NjYsMTExICs0ODUsMTM0IEBACiAjZGVmaW5lIFBTWUNIT19NRU1TUEFDRV9CCTB4MTgwMDAwMDAwVUwKICNkZWZpbmUgUFNZQ0hPX01FTVNQQUNFX1NJWkUJMHgwN2ZmZmZmZmZVTAogCi1zdGF0aWMgdm9pZCBfX2luaXQgcHN5Y2hvX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGludCBpc19wYm1fYSkKK3N0YXRpYyB2b2lkIF9faW5pdCBwc3ljaG9fcGJtX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgIHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBpbnQgaXNfcGJtX2EpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXBzeWNob19wYm1faW5pdF9jb21tb24ocGJtLCBvcCwgIlBTWUNITyIsIFBCTV9DSElQX1RZUEVfUFNZQ0hPKTsKKwlwc3ljaG9fcGJtX3N0cmJ1Zl9pbml0KHBibSwgaXNfcGJtX2EpOworCXBzeWNob19zY2FuX2J1cyhwYm0sICZvcC0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfcGJtX2luZm8gKiBfX2RldmluaXQgcHN5Y2hvX2ZpbmRfc2libGluZyh1MzIgdXBhX3BvcnRpZCkKK3sKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAKLQlpZiAoaXNfcGJtX2EpCi0JCXBibSA9ICZwLT5wYm1fQTsKLQllbHNlCi0JCXBibSA9ICZwLT5wYm1fQjsKLQotCXBibS0+bmV4dCA9IHBjaV9wYm1fcm9vdDsKLQlwY2lfcGJtX3Jvb3QgPSBwYm07Ci0KLQlwYm0tPm51bWFfbm9kZSA9IC0xOwotCi0JcGJtLT5zY2FuX2J1cyA9IHBzeWNob19zY2FuX2J1czsKLQlwYm0tPnBjaV9vcHMgPSAmc3VuNHVfcGNpX29wczsKLQlwYm0tPmNvbmZpZ19zcGFjZV9yZWdfYml0cyA9IDg7Ci0KLQlwYm0tPmluZGV4ID0gcGNpX251bV9wYm1zKys7Ci0KLQlwYm0tPmNoaXBfdHlwZSA9IFBCTV9DSElQX1RZUEVfUFNZQ0hPOwotCXBibS0+Y2hpcF92ZXJzaW9uID0gMDsKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInZlcnNpb24jIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCXBibS0+Y2hpcF92ZXJzaW9uID0gKihpbnQgKikgcHJvcC0+dmFsdWU7Ci0JcGJtLT5jaGlwX3JldmlzaW9uID0gMDsKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgIm1vZHVsZS1yZXZpc2lvbiMiLCBOVUxMKTsKLQlpZiAocHJvcCkKLQkJcGJtLT5jaGlwX3JldmlzaW9uID0gKihpbnQgKikgcHJvcC0+dmFsdWU7Ci0KLQlwYm0tPnBhcmVudCA9IHA7Ci0JcGJtLT5wcm9tX25vZGUgPSBkcDsKLQlwYm0tPm5hbWUgPSBkcC0+ZnVsbF9uYW1lOwotCi0JcHJpbnRrKCIlczogUFNZQ0hPIFBDSSBCdXMgTW9kdWxlIHZlclsleDoleF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgcGJtLT5jaGlwX3ZlcnNpb24sIHBibS0+Y2hpcF9yZXZpc2lvbik7Ci0KLQlwY2lfZGV0ZXJtaW5lX21lbV9pb19zcGFjZShwYm0pOwotCi0JcGNpX2dldF9wYm1fcHJvcHMocGJtKTsKLQotCXBzeWNob19wYm1fc3RyYnVmX2luaXQocGJtLCBpc19wYm1fYSk7CisJZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7CisJCWlmIChwYm0tPnBvcnRpZCA9PSB1cGFfcG9ydGlkKQorCQkJcmV0dXJuIHBibTsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKICNkZWZpbmUgUFNZQ0hPX0NPTkZJR1NQQUNFCTB4MDAxMDAwMDAwVUwKIAotdm9pZCBfX2luaXQgcHN5Y2hvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqbW9kZWxfbmFtZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBzeWNob19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcl9yZWdzOwotCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcl9yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJc3RydWN0IGlvbW11ICppb21tdTsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IGlzX3BibV9hLCBlcnI7CiAJdTMyIHVwYV9wb3J0aWQ7Ci0JaW50IGlzX3BibV9hOwogCi0JdXBhX3BvcnRpZCA9IDB4ZmY7Ci0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1cGEtcG9ydGlkIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCXVwYV9wb3J0aWQgPSAqKHUzMiAqKSBwcm9wLT52YWx1ZTsKKwl1cGFfcG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAidXBhLXBvcnRpZCIsIDB4ZmYpOwogCi0JZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwID0gcGJtLT5wYXJlbnQ7CisJZXJyID0gLUVOT01FTTsKKwlwYm0gPSBremFsbG9jKHNpemVvZigqcGJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHBjaV9wYm1faW5mby5cbiIpOworCQlnb3RvIG91dF9lcnI7CisJfQogCi0JCWlmIChwLT5wYm1fQS5wb3J0aWQgPT0gdXBhX3BvcnRpZCkgewotCQkJaXNfcGJtX2EgPSAocC0+cGJtX0EucHJvbV9ub2RlID09IE5VTEwpOwotCQkJcHN5Y2hvX3BibV9pbml0KHAsIGRwLCBpc19wYm1fYSk7Ci0JCQlyZXR1cm47CisJcGJtLT5zaWJsaW5nID0gcHN5Y2hvX2ZpbmRfc2libGluZyh1cGFfcG9ydGlkKTsKKwlpZiAocGJtLT5zaWJsaW5nKSB7CisJCWlvbW11ID0gcGJtLT5zaWJsaW5nLT5pb21tdTsKKwl9IGVsc2UgeworCQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9LRVJORUwpOworCQlpZiAoIWlvbW11KSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgUEJNIGlvbW11LlxuIik7CisJCQlnb3RvIG91dF9mcmVlX2NvbnRyb2xsZXI7CiAJCX0KIAl9CiAKLQlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXApCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwotCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpb21tdSkKLQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CisJcGJtLT5pb21tdSA9IGlvbW11OworCXBibS0+cG9ydGlkID0gdXBhX3BvcnRpZDsKIAotCXAtPnBibV9BLmlvbW11ID0gcC0+cGJtX0IuaW9tbXUgPSBpb21tdTsKLQotCXAtPnBibV9BLnBvcnRpZCA9IHVwYV9wb3J0aWQ7Ci0JcC0+cGJtX0IucG9ydGlkID0gdXBhX3BvcnRpZDsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JcHJfcmVncyA9IHByb3AtPnZhbHVlOwotCi0JcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1syXS5waHlzX2FkZHI7Ci0JcC0+cGJtX0IuY29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1syXS5waHlzX2FkZHI7Ci0KLQlwLT5wYm1fQS5jb25maWdfc3BhY2UgPSBwLT5wYm1fQi5jb25maWdfc3BhY2UgPQotCQkocHJfcmVnc1syXS5waHlzX2FkZHIgKyBQU1lDSE9fQ09ORklHU1BBQ0UpOwotCi0JcHN5Y2hvX2NvbnRyb2xsZXJfaHdpbml0KCZwLT5wYm1fQSk7Ci0KLQlpZiAocHN5Y2hvX2lvbW11X2luaXQoJnAtPnBibV9BKSkKLQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CisJcHJfcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFwcl9yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHJlZyBwcm9wZXJ0eS5cbiIpOworCQlnb3RvIG91dF9mcmVlX2lvbW11OworCX0KIAogCWlzX3BibV9hID0gKChwcl9yZWdzWzBdLnBoeXNfYWRkciAmIDB4NjAwMCkgPT0gMHgyMDAwKTsKLQlwc3ljaG9fcGJtX2luaXQocCwgZHAsIGlzX3BibV9hKTsKLQlyZXR1cm47CiAKLWZhdGFsX21lbW9yeV9lcnJvcjoKLQlwcm9tX3ByaW50ZigiUFNZQ0hPOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwotCXByb21faGFsdCgpOworCXBibS0+Y29udHJvbGxlcl9yZWdzID0gcHJfcmVnc1syXS5waHlzX2FkZHI7CisJcGJtLT5jb25maWdfc3BhY2UgPSAocHJfcmVnc1syXS5waHlzX2FkZHIgKyBQU1lDSE9fQ09ORklHU1BBQ0UpOworCisJaWYgKGlzX3BibV9hKSB7CisJCXBibS0+cGNpX2Fmc3IgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lfQUZTUl9BOworCQlwYm0tPnBjaV9hZmFyID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJX0FGQVJfQTsKKwkJcGJtLT5wY2lfY3NyICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTDsKKwl9IGVsc2UgeworCQlwYm0tPnBjaV9hZnNyID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fUENJX0FGU1JfQjsKKwkJcGJtLT5wY2lfYWZhciA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSV9BRkFSX0I7CisJCXBibS0+cGNpX2NzciAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19QQ0lCX0NUUkw7CisJfQorCisJcHN5Y2hvX2NvbnRyb2xsZXJfaHdpbml0KHBibSk7CisJaWYgKCFwYm0tPnNpYmxpbmcpIHsKKwkJZXJyID0gcHN5Y2hvX2lvbW11X2luaXQocGJtLCAxMjgsIDB4YzAwMDAwMDAsCisJCQkJCTB4ZmZmZmZmZmYsIFBTWUNIT19DT05UUk9MKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CisKKwkJLyogSWYgbmVjZXNzYXJ5LCBob29rIHVzIHVwIGZvciBzdGFyZmlyZSBJUlEgdHJhbnNsYXRpb25zLiAqLworCQlpZiAodGhpc19pc19zdGFyZmlyZSkKKwkJCXN0YXJmaXJlX2hvb2t1cChwYm0tPnBvcnRpZCk7CisJfQorCisJcHN5Y2hvX3BibV9pbml0KHBibSwgb3AsIGlzX3BibV9hKTsKKworCXBibS0+bmV4dCA9IHBjaV9wYm1fcm9vdDsKKwlwY2lfcGJtX3Jvb3QgPSBwYm07CisKKwlpZiAocGJtLT5zaWJsaW5nKQorCQlwYm0tPnNpYmxpbmctPnNpYmxpbmcgPSBwYm07CisKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHBibSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaW9tbXU6CisJaWYgKCFwYm0tPnNpYmxpbmcpCisJCWtmcmVlKHBibS0+aW9tbXUpOworCitvdXRfZnJlZV9jb250cm9sbGVyOgorCWtmcmVlKHBibSk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKIH0KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBwc3ljaG9fbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gInBjaSIsCisJCS5jb21wYXRpYmxlID0gInBjaTEwOGUsODAwMCIsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHBzeWNob19kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLm1hdGNoX3RhYmxlCT0gcHN5Y2hvX21hdGNoLAorCS5wcm9iZQkJPSBwc3ljaG9fcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwc3ljaG9faW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnBzeWNob19kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwc3ljaG9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCBhZGU1MTg0Li43MTMyNTdiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTE2LDMxICsxNiwxNSBAQAogI2luY2x1ZGUgPGFzbS9hcGIuaD4KICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VwYS5oPgogCiAjaW5jbHVkZSAicGNpX2ltcGwuaCIKICNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKKyNpbmNsdWRlICJwc3ljaG9fY29tbW9uLmgiCiAKLS8qIEFsbCBTQUJSRSByZWdpc3RlcnMgYXJlIDY0LWJpdHMuICBUaGUgZm9sbG93aW5nIGFjY2Vzc29yCi0gKiByb3V0aW5lcyBhcmUgaG93IHRoZXkgYXJlIGFjY2Vzc2VkLiAgVGhlIFJFRyBwYXJhbWV0ZXIKLSAqIGlzIGEgcGh5c2ljYWwgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBzYWJyZV9yZWFkKF9fcmVnKSBcCi0oewl1NjQgX19yZXQ7IFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YSBbJTFdICUyLCAlMCIgXAotCQkJICAgICA6ICI9ciIgKF9fcmV0KSBcCi0JCQkgICAgIDogInIiIChfX3JlZyksICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpIFwKLQkJCSAgICAgOiAibWVtb3J5Iik7IFwKLQlfX3JldDsgXAotfSkKLSNkZWZpbmUgc2FicmVfd3JpdGUoX19yZWcsIF9fdmFsKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEgJTAsIFslMV0gJTIiIFwKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovIFwKLQkJCSAgICAgOiAiciIgKF9fdmFsKSwgInIiIChfX3JlZyksIFwKLQkJCSAgICAgICAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCi0JCQkgICAgIDogIm1lbW9yeSIpCisjZGVmaW5lIERSSVZFUl9OQU1FCSJzYWJyZSIKKyNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCiAKIC8qIFNBQlJFIFBDSSBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGRlZmluaXRpb25zLiAqLwogI2RlZmluZSBTQUJSRV9VRV9BRlNSCQkweDAwMzBVTApAQCAtMjA4LDk1ICsxOTIsNiBAQAogc3RhdGljIGludCBodW1taW5nYmlyZF9wOwogc3RhdGljIHN0cnVjdCBwY2lfYnVzICpzYWJyZV9yb290X2J1czsKIAotLyogU0FCUkUgZXJyb3IgaGFuZGxpbmcgc3VwcG9ydC4gKi8KLXN0YXRpYyB2b2lkIHNhYnJlX2NoZWNrX2lvbW11X2Vycm9yKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZnNyLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFmYXIpCi17Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7Ci0JdW5zaWduZWQgbG9uZyBpb21tdV90YWdbMTZdOwotCXVuc2lnbmVkIGxvbmcgaW9tbXVfZGF0YVsxNl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1NjQgY29udHJvbDsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCWNvbnRyb2wgPSBzYWJyZV9yZWFkKGlvbW11LT5pb21tdV9jb250cm9sKTsKLQlpZiAoY29udHJvbCAmIFNBQlJFX0lPTU1VQ1RSTF9FUlIpIHsKLQkJY2hhciAqdHlwZV9zdHJpbmc7Ci0KLQkJLyogQ2xlYXIgdGhlIGVycm9yIGVuY291bnRlcmVkIGJpdC4KLQkJICogTk9URTogT24gU2FicmUgdGhpcyBpcyB3cml0ZSAxIHRvIGNsZWFyLAotCQkgKiAgICAgICB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBQc3ljaG8uCi0JCSAqLwotCQlzYWJyZV93cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7Ci0JCXN3aXRjaCgoY29udHJvbCAmIFNBQlJFX0lPTU1VQ1RSTF9FUlJTVFMpID4+IDI1VUwpIHsKLQkJY2FzZSAxOgotCQkJdHlwZV9zdHJpbmcgPSAiSW52YWxpZCBFcnJvciI7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJdHlwZV9zdHJpbmcgPSAiRUNDIEVycm9yIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHlwZV9zdHJpbmcgPSAiVW5rbm93biI7Ci0JCQlicmVhazsKLQkJfTsKLQkJcHJpbnRrKCIlczogSU9NTVUgRXJyb3IsIHR5cGVbJXNdXG4iLAotCQkgICAgICAgcGJtLT5uYW1lLCB0eXBlX3N0cmluZyk7Ci0KLQkJLyogRW50ZXIgZGlhZ25vc3RpYyBtb2RlIGFuZCBwcm9iZSBmb3IgZXJyb3InZAotCQkgKiBlbnRyaWVzIGluIHRoZSBJT1RMQi4KLQkJICovCi0JCWNvbnRyb2wgJj0gfihTQUJSRV9JT01NVUNUUkxfRVJSU1RTIHwgU0FCUkVfSU9NTVVDVFJMX0VSUik7Ci0JCXNhYnJlX3dyaXRlKGlvbW11LT5pb21tdV9jb250cm9sLAotCQkJICAgIChjb250cm9sIHwgU0FCUkVfSU9NTVVDVFJMX0RFTkFCKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVnczsKLQotCQkJaW9tbXVfdGFnW2ldID0KLQkJCQlzYWJyZV9yZWFkKGJhc2UgKyBTQUJSRV9JT01NVV9UQUcgKyAoaSAqIDhVTCkpOwotCQkJaW9tbXVfZGF0YVtpXSA9Ci0JCQkJc2FicmVfcmVhZChiYXNlICsgU0FCUkVfSU9NTVVfREFUQSArIChpICogOFVMKSk7Ci0JCQlzYWJyZV93cml0ZShiYXNlICsgU0FCUkVfSU9NTVVfVEFHICsgKGkgKiA4VUwpLCAwKTsKLQkJCXNhYnJlX3dyaXRlKGJhc2UgKyBTQUJSRV9JT01NVV9EQVRBICsgKGkgKiA4VUwpLCAwKTsKLQkJfQotCQlzYWJyZV93cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgdGFnLCBkYXRhOwotCi0JCQl0YWcgPSBpb21tdV90YWdbaV07Ci0JCQlpZiAoISh0YWcgJiBTQUJSRV9JT01NVVRBR19FUlIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlkYXRhID0gaW9tbXVfZGF0YVtpXTsKLQkJCXN3aXRjaCgodGFnICYgU0FCUkVfSU9NTVVUQUdfRVJSU1RTKSA+PiAyM1VMKSB7Ci0JCQljYXNlIDE6Ci0JCQkJdHlwZV9zdHJpbmcgPSAiSW52YWxpZCBFcnJvciI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdHlwZV9zdHJpbmcgPSAiRUNDIEVycm9yIjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdHlwZV9zdHJpbmcgPSAiVW5rbm93biI7Ci0JCQkJYnJlYWs7Ci0JCQl9OwotCQkJcHJpbnRrKCIlczogSU9NTVUgVEFHKCVkKVtSQVcoJTAxNmx4KWVycm9yKCVzKXdyKCVkKXN6KCVkSyl2cGcoJTA4bHgpXVxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUsIGksIHRhZywgdHlwZV9zdHJpbmcsCi0JCQkgICAgICAgKCh0YWcgJiBTQUJSRV9JT01NVVRBR19XUklURSkgPyAxIDogMCksCi0JCQkgICAgICAgKCh0YWcgJiBTQUJSRV9JT01NVVRBR19TSVpFKSA/IDY0IDogOCksCi0JCQkgICAgICAgKCh0YWcgJiBTQUJSRV9JT01NVVRBR19WUE4pIDw8IElPTU1VX1BBR0VfU0hJRlQpKTsKLQkJCXByaW50aygiJXM6IElPTU1VIERBVEEoJWQpW1JBVyglMDE2bHgpdmFsaWQoJWQpdXNlZCglZCljYWNoZSglZClwcGcoJTAxNmx4KVxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUsIGksIGRhdGEsCi0JCQkgICAgICAgKChkYXRhICYgU0FCUkVfSU9NTVVEQVRBX1ZBTElEKSA/IDEgOiAwKSwKLQkJCSAgICAgICAoKGRhdGEgJiBTQUJSRV9JT01NVURBVEFfVVNFRCkgPyAxIDogMCksCi0JCQkgICAgICAgKChkYXRhICYgU0FCUkVfSU9NTVVEQVRBX0NBQ0hFKSA/IDEgOiAwKSwKLQkJCSAgICAgICAoKGRhdGEgJiBTQUJSRV9JT01NVURBVEFfUFBOKSA8PCBJT01NVV9QQUdFX1NISUZUKSk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGlycXJldHVybl90IHNhYnJlX3VlX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IGRldl9pZDsKQEAgLTMwNiw4ICsyMDEsOCBAQAogCWludCByZXBvcnRlZDsKIAogCS8qIExhdGNoIHVuY29ycmVjdGFibGUgZXJyb3Igc3RhdHVzLiAqLwotCWFmYXIgPSBzYWJyZV9yZWFkKGFmYXJfcmVnKTsKLQlhZnNyID0gc2FicmVfcmVhZChhZnNyX3JlZyk7CisJYWZhciA9IHVwYV9yZWFkcShhZmFyX3JlZyk7CisJYWZzciA9IHVwYV9yZWFkcShhZnNyX3JlZyk7CiAKIAkvKiBDbGVhciB0aGUgcHJpbWFyeS9zZWNvbmRhcnkgZXJyb3Igc3RhdHVzIGJpdHMuICovCiAJZXJyb3JfYml0cyA9IGFmc3IgJgpAQCAtMzE2LDcgKzIxMSw3IEBACiAJCSBTQUJSRV9VRUFGU1JfU0RURSB8IFNBQlJFX1VFQUZTUl9QRFRFKTsKIAlpZiAoIWVycm9yX2JpdHMpCiAJCXJldHVybiBJUlFfTk9ORTsKLQlzYWJyZV93cml0ZShhZnNyX3JlZywgZXJyb3JfYml0cyk7CisJdXBhX3dyaXRlcShlcnJvcl9iaXRzLCBhZnNyX3JlZyk7CiAKIAkvKiBMb2cgdGhlIGVycm9yLiAqLwogCXByaW50aygiJXM6IFVuY29ycmVjdGFibGUgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslcyVzXVxuIiwKQEAgLTM1Miw3ICsyNDcsNyBAQAogCXByaW50aygiXVxuIik7CiAKIAkvKiBJbnRlcnJvZ2F0ZSBJT01NVSBmb3IgZXJyb3Igc3RhdHVzLiAqLwotCXNhYnJlX2NoZWNrX2lvbW11X2Vycm9yKHBibSwgYWZzciwgYWZhcik7CisJcHN5Y2hvX2NoZWNrX2lvbW11X2Vycm9yKHBibSwgYWZzciwgYWZhciwgVUVfRVJSKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTM2Niw4ICsyNjEsOCBAQAogCWludCByZXBvcnRlZDsKIAogCS8qIExhdGNoIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gc2FicmVfcmVhZChhZmFyX3JlZyk7Ci0JYWZzciA9IHNhYnJlX3JlYWQoYWZzcl9yZWcpOworCWFmYXIgPSB1cGFfcmVhZHEoYWZhcl9yZWcpOworCWFmc3IgPSB1cGFfcmVhZHEoYWZzcl9yZWcpOwogCiAJLyogQ2xlYXIgcHJpbWFyeS9zZWNvbmRhcnkgZXJyb3Igc3RhdHVzIGJpdHMuICovCiAJZXJyb3JfYml0cyA9IGFmc3IgJgpAQCAtMzc1LDcgKzI3MCw3IEBACiAJCSBTQUJSRV9DRUFGU1JfU0RSRCB8IFNBQlJFX0NFQUZTUl9TRFdSKTsKIAlpZiAoIWVycm9yX2JpdHMpCiAJCXJldHVybiBJUlFfTk9ORTsKLQlzYWJyZV93cml0ZShhZnNyX3JlZywgZXJyb3JfYml0cyk7CisJdXBhX3dyaXRlcShlcnJvcl9iaXRzLCBhZnNyX3JlZyk7CiAKIAkvKiBMb2cgdGhlIGVycm9yLiAqLwogCXByaW50aygiJXM6IENvcnJlY3RhYmxlIEVycm9yLCBwcmltYXJ5IGVycm9yIHR5cGVbJXNdXG4iLApAQCAtNDEzLDEzNiArMzA4LDkgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBzYWJyZV9wY2llcnJfaW50cl9vdGhlcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCi17Ci0JdW5zaWduZWQgbG9uZyBjc3JfcmVnLCBjc3IsIGNzcl9lcnJvcl9iaXRzOwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwotCXUxNiBzdGF0OwotCi0JY3NyX3JlZyA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0FCUkVfUENJQ1RSTDsKLQljc3IgPSBzYWJyZV9yZWFkKGNzcl9yZWcpOwotCWNzcl9lcnJvcl9iaXRzID0KLQkJY3NyICYgU0FCUkVfUENJQ1RSTF9TRVJSOwotCWlmIChjc3JfZXJyb3JfYml0cykgewotCQkvKiBDbGVhciB0aGUgZXJyb3JzLiAgKi8KLQkJc2FicmVfd3JpdGUoY3NyX3JlZywgY3NyKTsKLQotCQkvKiBMb2cgJ2VtLiAgKi8KLQkJaWYgKGNzcl9lcnJvcl9iaXRzICYgU0FCUkVfUENJQ1RSTF9TRVJSKQotCQkJcHJpbnRrKCIlczogUENJIFNFUlIgc2lnbmFsIGFzc2VydGVkLlxuIiwKLQkJCSAgICAgICBwYm0tPm5hbWUpOwotCQlyZXQgPSBJUlFfSEFORExFRDsKLQl9Ci0JcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHNhYnJlX3Jvb3RfYnVzLCAwLAotCQkJCSBQQ0lfU1RBVFVTLCAmc3RhdCk7Ci0JaWYgKHN0YXQgJiAoUENJX1NUQVRVU19QQVJJVFkgfAotCQkgICAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIHwKLQkJICAgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8Ci0JCSAgICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgfAotCQkgICAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SKSkgewotCQlwcmludGsoIiVzOiBQQ0kgYnVzIGVycm9yLCBQQ0lfU1RBVFVTWyUwNHhdXG4iLAotCQkgICAgICAgcGJtLT5uYW1lLCBzdGF0KTsKLQkJcGNpX2J1c193cml0ZV9jb25maWdfd29yZChzYWJyZV9yb290X2J1cywgMCwKLQkJCQkJICBQQ0lfU1RBVFVTLCAweGZmZmYpOwotCQlyZXQgPSBJUlFfSEFORExFRDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNhYnJlX3BjaWVycl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBkZXZfaWQ7Ci0JdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7Ci0JdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwotCWludCByZXBvcnRlZDsKLQotCWFmc3JfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9QSU9BRlNSOwotCWFmYXJfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9QSU9BRkFSOwotCi0JLyogTGF0Y2ggZXJyb3Igc3RhdHVzLiAqLwotCWFmYXIgPSBzYWJyZV9yZWFkKGFmYXJfcmVnKTsKLQlhZnNyID0gc2FicmVfcmVhZChhZnNyX3JlZyk7Ci0KLQkvKiBDbGVhciBwcmltYXJ5L3NlY29uZGFyeSBlcnJvciBzdGF0dXMgYml0cy4gKi8KLQllcnJvcl9iaXRzID0gYWZzciAmCi0JCShTQUJSRV9QSU9BRlNSX1BNQSB8IFNBQlJFX1BJT0FGU1JfUFRBIHwKLQkJIFNBQlJFX1BJT0FGU1JfUFJUUlkgfCBTQUJSRV9QSU9BRlNSX1BQRVJSIHwKLQkJIFNBQlJFX1BJT0FGU1JfU01BIHwgU0FCUkVfUElPQUZTUl9TVEEgfAotCQkgU0FCUkVfUElPQUZTUl9TUlRSWSB8IFNBQlJFX1BJT0FGU1JfU1BFUlIpOwotCWlmICghZXJyb3JfYml0cykKLQkJcmV0dXJuIHNhYnJlX3BjaWVycl9pbnRyX290aGVyKHBibSk7Ci0Jc2FicmVfd3JpdGUoYWZzcl9yZWcsIGVycm9yX2JpdHMpOwotCi0JLyogTG9nIHRoZSBlcnJvci4gKi8KLQlwcmludGsoIiVzOiBQQ0kgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslc11cbiIsCi0JICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgKCgoZXJyb3JfYml0cyAmIFNBQlJFX1BJT0FGU1JfUE1BKSA/Ci0JCSAiTWFzdGVyIEFib3J0IiA6Ci0JCSAoKGVycm9yX2JpdHMgJiBTQUJSRV9QSU9BRlNSX1BUQSkgPwotCQkgICJUYXJnZXQgQWJvcnQiIDoKLQkJICAoKGVycm9yX2JpdHMgJiBTQUJSRV9QSU9BRlNSX1BSVFJZKSA/Ci0JCSAgICJFeGNlc3NpdmUgUmV0cmllcyIgOgotCQkgICAoKGVycm9yX2JpdHMgJiBTQUJSRV9QSU9BRlNSX1BQRVJSKSA/Ci0JCSAgICAiUGFyaXR5IEVycm9yIiA6ICI/Pz8iKSkpKSkpOwotCXByaW50aygiJXM6IGJ5dGVtYXNrWyUwNGx4XSB3YXNfYmxvY2soJWQpXG4iLAotCSAgICAgICBwYm0tPm5hbWUsCi0JICAgICAgIChhZnNyICYgU0FCUkVfUElPQUZTUl9CTVNLKSA+PiAzMlVMLAotCSAgICAgICAoYWZzciAmIFNBQlJFX1BJT0FGU1JfQkxLKSA/IDEgOiAwKTsKLQlwcmludGsoIiVzOiBQQ0kgQUZBUiBbJTAxNmx4XVxuIiwgcGJtLT5uYW1lLCBhZmFyKTsKLQlwcmludGsoIiVzOiBQQ0kgU2Vjb25kYXJ5IGVycm9ycyBbIiwgcGJtLT5uYW1lKTsKLQlyZXBvcnRlZCA9IDA7Ci0JaWYgKGFmc3IgJiBTQUJSRV9QSU9BRlNSX1NNQSkgewotCQlyZXBvcnRlZCsrOwotCQlwcmludGsoIihNYXN0ZXIgQWJvcnQpIik7Ci0JfQotCWlmIChhZnNyICYgU0FCUkVfUElPQUZTUl9TVEEpIHsKLQkJcmVwb3J0ZWQrKzsKLQkJcHJpbnRrKCIoVGFyZ2V0IEFib3J0KSIpOwotCX0KLQlpZiAoYWZzciAmIFNBQlJFX1BJT0FGU1JfU1JUUlkpIHsKLQkJcmVwb3J0ZWQrKzsKLQkJcHJpbnRrKCIoRXhjZXNzaXZlIFJldHJpZXMpIik7Ci0JfQotCWlmIChhZnNyICYgU0FCUkVfUElPQUZTUl9TUEVSUikgewotCQlyZXBvcnRlZCsrOwotCQlwcmludGsoIihQYXJpdHkgRXJyb3IpIik7Ci0JfQotCWlmICghcmVwb3J0ZWQpCi0JCXByaW50aygiKG5vbmUpIik7Ci0JcHJpbnRrKCJdXG4iKTsKLQotCS8qIEZvciB0aGUgZXJyb3IgdHlwZXMgc2hvd24sIHNjYW4gYm90aCBQQ0kgYnVzZXMgZm9yIGRldmljZXMKLQkgKiB3aGljaCBoYXZlIGxvZ2dlZCB0aGF0IGVycm9yIHR5cGUuCi0JICovCi0KLQkvKiBJZiB3ZSBzZWUgYSBUYXJnZXQgQWJvcnQsIHRoaXMgY291bGQgYmUgdGhlIHJlc3VsdCBvZiBhbgotCSAqIElPTU1VIHRyYW5zbGF0aW9uIGVycm9yIG9mIHNvbWUgc29ydC4gIEl0IGlzIGV4dHJlbWVseQotCSAqIHVzZWZ1bCB0byBsb2cgdGhpcyBpbmZvcm1hdGlvbiBhcyB1c3VhbGx5IGl0IGluZGljYXRlcwotCSAqIGEgYnVnIGluIHRoZSBJT01NVSBzdXBwb3J0IGNvZGUgb3IgYSBQQ0kgZGV2aWNlIGRyaXZlci4KLQkgKi8KLQlpZiAoZXJyb3JfYml0cyAmIChTQUJSRV9QSU9BRlNSX1BUQSB8IFNBQlJFX1BJT0FGU1JfU1RBKSkgewotCQlzYWJyZV9jaGVja19pb21tdV9lcnJvcihwYm0sIGFmc3IsIGFmYXIpOwotCQlwY2lfc2Nhbl9mb3JfdGFyZ2V0X2Fib3J0KHBibSwgcGJtLT5wY2lfYnVzKTsKLQl9Ci0JaWYgKGVycm9yX2JpdHMgJiAoU0FCUkVfUElPQUZTUl9QTUEgfCBTQUJSRV9QSU9BRlNSX1NNQSkpCi0JCXBjaV9zY2FuX2Zvcl9tYXN0ZXJfYWJvcnQocGJtLCBwYm0tPnBjaV9idXMpOwotCi0JLyogRm9yIGV4Y2Vzc2l2ZSByZXRyaWVzLCBTQUJSRS9QQk0gd2lsbCBhYm9ydCB0aGUgZGV2aWNlCi0JICogYW5kIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZpY2FsbHkgY2hlY2sgZm9yIGV4Y2Vzc2l2ZQotCSAqIHJldHJpZXMgaW4gdGhlIGNvbmZpZyBzcGFjZSBzdGF0dXMgcmVnaXN0ZXJzLiAgU28gd2hhdAotCSAqIHdlIGhvcGUgaXMgdGhhdCB3ZSdsbCBjYXRjaCBpdCB2aWEgdGhlIG1hc3Rlci90YXJnZXQKLQkgKiBhYm9ydCBldmVudHMuCi0JICovCi0KLQlpZiAoZXJyb3JfYml0cyAmIChTQUJSRV9QSU9BRlNSX1BQRVJSIHwgU0FCUkVfUElPQUZTUl9TUEVSUikpCi0JCXBjaV9zY2FuX2Zvcl9wYXJpdHlfZXJyb3IocGJtLCBwYm0tPnBjaV9idXMpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCiBzdGF0aWMgdm9pZCBzYWJyZV9yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IHBibS0+cHJvbV9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBwYm0tPm9wLT5ub2RlOwogCXN0cnVjdCBvZl9kZXZpY2UgKm9wOwogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IHBibS0+Y29udHJvbGxlcl9yZWdzOwogCXU2NCB0bXA7CkBAIC01NjgsMzMgKzMzNiwzNCBAQAogCSAqIHJlZ2lzdGVyaW5nIHRoZSBoYW5kbGVyIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHNwdXJpb3VzCiAJICogaW50ZXJydXB0cy4KIAkgKi8KLQlzYWJyZV93cml0ZShiYXNlICsgU0FCUkVfVUVfQUZTUiwKLQkJICAgIChTQUJSRV9VRUFGU1JfUERSRCB8IFNBQlJFX1VFQUZTUl9QRFdSIHwKLQkJICAgICBTQUJSRV9VRUFGU1JfU0RSRCB8IFNBQlJFX1VFQUZTUl9TRFdSIHwKLQkJICAgICBTQUJSRV9VRUFGU1JfU0RURSB8IFNBQlJFX1VFQUZTUl9QRFRFKSk7CisJdXBhX3dyaXRlcSgoU0FCUkVfVUVBRlNSX1BEUkQgfCBTQUJSRV9VRUFGU1JfUERXUiB8CisJCSAgICBTQUJSRV9VRUFGU1JfU0RSRCB8IFNBQlJFX1VFQUZTUl9TRFdSIHwKKwkJICAgIFNBQlJFX1VFQUZTUl9TRFRFIHwgU0FCUkVfVUVBRlNSX1BEVEUpLAorCQkgICBiYXNlICsgU0FCUkVfVUVfQUZTUik7CiAKIAllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1sxXSwgc2FicmVfdWVfaW50ciwgMCwgIlNBQlJFX1VFIiwgcGJtKTsKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGRuJ3QgcmVnaXN0ZXIgVUUsIGVycj0lZC5cbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIGVycik7CiAKLQlzYWJyZV93cml0ZShiYXNlICsgU0FCUkVfQ0VfQUZTUiwKLQkJICAgIChTQUJSRV9DRUFGU1JfUERSRCB8IFNBQlJFX0NFQUZTUl9QRFdSIHwKLQkJICAgICBTQUJSRV9DRUFGU1JfU0RSRCB8IFNBQlJFX0NFQUZTUl9TRFdSKSk7CisJdXBhX3dyaXRlcSgoU0FCUkVfQ0VBRlNSX1BEUkQgfCBTQUJSRV9DRUFGU1JfUERXUiB8CisJCSAgICBTQUJSRV9DRUFGU1JfU0RSRCB8IFNBQlJFX0NFQUZTUl9TRFdSKSwKKwkJICAgYmFzZSArIFNBQlJFX0NFX0FGU1IpOworCiAKIAllcnIgPSByZXF1ZXN0X2lycShvcC0+aXJxc1syXSwgc2FicmVfY2VfaW50ciwgMCwgIlNBQlJFX0NFIiwgcGJtKTsKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGRuJ3QgcmVnaXN0ZXIgQ0UsIGVycj0lZC5cbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIGVycik7Ci0JZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIHNhYnJlX3BjaWVycl9pbnRyLCAwLAorCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzBdLCBwc3ljaG9fcGNpZXJyX2ludHIsIDAsCiAJCQkgICJTQUJSRV9QQ0lFUlIiLCBwYm0pOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZG4ndCByZWdpc3RlciBQQ0lFUlIsIGVycj0lZC5cbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIGVycik7CiAKLQl0bXAgPSBzYWJyZV9yZWFkKGJhc2UgKyBTQUJSRV9QQ0lDVFJMKTsKKwl0bXAgPSB1cGFfcmVhZHEoYmFzZSArIFNBQlJFX1BDSUNUUkwpOwogCXRtcCB8PSBTQUJSRV9QQ0lDVFJMX0VSUkVOOwotCXNhYnJlX3dyaXRlKGJhc2UgKyBTQUJSRV9QQ0lDVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBiYXNlICsgU0FCUkVfUENJQ1RSTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFwYl9pbml0KHN0cnVjdCBwY2lfYnVzICpzYWJyZV9idXMpCkBAIC02MzMsNyArNDAyLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzYWJyZV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfc2Nhbl9idXMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50KQogewogCXN0YXRpYyBpbnQgb25jZTsKIApAQCAtNjU2LDEyICs0MjYsMTIgQEAKIAkgKiB0byBsaXZlIGF0IGJ1cyAwLgogCSAqLwogCWlmIChvbmNlICE9IDApIHsKLQkJcHJvbV9wcmludGYoIlNBQlJFOiBNdWx0aXBsZSBjb250cm9sbGVycyB1bnN1cHBvcnRlZC5cbiIpOwotCQlwcm9tX2hhbHQoKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTXVsdGlwbGUgY29udHJvbGxlcnMgdW5zdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuOwogCX0KIAlvbmNlKys7CiAKLQlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSk7CisJcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fb25lX3BibShwYm0sIHBhcmVudCk7CiAJaWYgKCFwYm0tPnBjaV9idXMpCiAJCXJldHVybjsKIApAQCAtNjcyLDEzMyArNDQyLDU4IEBACiAJc2FicmVfcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMocGJtKTsKIH0KIAotc3RhdGljIGludCBzYWJyZV9pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCSAgICBpbnQgdHNic2l6ZSwgdW5zaWduZWQgbG9uZyBkdm1hX29mZnNldCwKLQkJCSAgICB1MzIgZG1hX21hc2spCitzdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfcGJtX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXU2NCBjb250cm9sOwotCWludCBlcnI7Ci0KLQkvKiBSZWdpc3RlciBhZGRyZXNzZXMuICovCi0JaW9tbXUtPmlvbW11X2NvbnRyb2wgID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9DT05UUk9MOwotCWlvbW11LT5pb21tdV90c2JiYXNlICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0FCUkVfSU9NTVVfVFNCQkFTRTsKLQlpb21tdS0+aW9tbXVfZmx1c2ggICAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPTU1VX0ZMVVNIOwotCWlvbW11LT5pb21tdV90YWdzICAgICA9IGlvbW11LT5pb21tdV9mbHVzaCArICgweGE1ODBVTCAtIDB4MDIxMFVMKTsKLQlpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9XUlNZTkM7Ci0JLyogU2FicmUncyBJT01NVSBsYWNrcyBjdHggZmx1c2hpbmcuICovCi0JaW9tbXUtPmlvbW11X2N0eGZsdXNoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvKiBJbnZhbGlkYXRlIFRMQiBFbnRyaWVzLiAqLwotCWNvbnRyb2wgPSBzYWJyZV9yZWFkKHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0FCUkVfSU9NTVVfQ09OVFJPTCk7Ci0JY29udHJvbCB8PSBTQUJSRV9JT01NVUNUUkxfREVOQUI7Ci0Jc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9DT05UUk9MLCBjb250cm9sKTsKLQotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9UQUcgKyAoaSAqIDhVTCksIDApOwotCQlzYWJyZV93cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPTU1VX0RBVEEgKyAoaSAqIDhVTCksIDApOwotCX0KLQotCS8qIExlYXZlIGRpYWcgbW9kZSBlbmFibGVkIGZvciBmdWxsLWZsdXNoaW5nIGRvbmUKLQkgKiBpbiBwY2lfaW9tbXUuYwotCSAqLwotCWVyciA9IGlvbW11X3RhYmxlX2luaXQoaW9tbXUsIHRzYnNpemUgKiAxMDI0ICogOCwKLQkJCSAgICAgICBkdm1hX29mZnNldCwgZG1hX21hc2ssIHBibS0+bnVtYV9ub2RlKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9UU0JCQVNFLAotCQkgICAgX19wYShpb21tdS0+cGFnZV90YWJsZSkpOwotCi0JY29udHJvbCA9IHNhYnJlX3JlYWQocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9DT05UUk9MKTsKLQljb250cm9sICY9IH4oU0FCUkVfSU9NTVVDVFJMX1RTQlNaIHwgU0FCUkVfSU9NTVVDVFJMX1RCV1NaKTsKLQljb250cm9sIHw9IFNBQlJFX0lPTU1VQ1RSTF9FTkFCOwotCXN3aXRjaCh0c2JzaXplKSB7Ci0JY2FzZSA2NDoKLQkJY29udHJvbCB8PSBTQUJSRV9JT01NVV9UU0JTWl82NEs7Ci0JCWJyZWFrOwotCWNhc2UgMTI4OgotCQljb250cm9sIHw9IFNBQlJFX0lPTU1VX1RTQlNaXzEyOEs7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByb21fcHJpbnRmKCJpb21tdV9pbml0OiBJbGxlZ2FsIFRTQiBzaXplICVkXG4iLCB0c2JzaXplKTsKLQkJcHJvbV9oYWx0KCk7Ci0JCWJyZWFrOwotCX0KLQlzYWJyZV93cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPTU1VX0NPTlRST0wsIGNvbnRyb2wpOwotCi0JcmV0dXJuIDA7CisJcHN5Y2hvX3BibV9pbml0X2NvbW1vbihwYm0sIG9wLCAiU0FCUkUiLCBQQk1fQ0hJUF9UWVBFX1NBQlJFKTsKKwlwYm0tPnBjaV9hZnNyID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9QSU9BRlNSOworCXBibS0+cGNpX2FmYXIgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX1BJT0FGQVI7CisJcGJtLT5wY2lfY3NyID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9QQ0lDVFJMOworCXNhYnJlX3NjYW5fYnVzKHBibSwgJm9wLT5kZXYpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2FicmVfcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkJICBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0JcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKLQlwcmludGsoIiVzOiBTQUJSRSBQQ0kgQnVzIE1vZHVsZVxuIiwgcGJtLT5uYW1lKTsKLQotCXBibS0+bnVtYV9ub2RlID0gLTE7Ci0KLQlwYm0tPnNjYW5fYnVzID0gc2FicmVfc2Nhbl9idXM7Ci0JcGJtLT5wY2lfb3BzID0gJnN1bjR1X3BjaV9vcHM7Ci0JcGJtLT5jb25maWdfc3BhY2VfcmVnX2JpdHMgPSA4OwotCi0JcGJtLT5pbmRleCA9IHBjaV9udW1fcGJtcysrOwotCi0JcGJtLT5jaGlwX3R5cGUgPSBQQk1fQ0hJUF9UWVBFX1NBQlJFOwotCXBibS0+cGFyZW50ID0gcDsKLQlwYm0tPnByb21fbm9kZSA9IGRwOwotCXBjaV9nZXRfcGJtX3Byb3BzKHBibSk7Ci0KLQlwY2lfZGV0ZXJtaW5lX21lbV9pb19zcGFjZShwYm0pOwotfQotCi12b2lkIF9faW5pdCBzYWJyZV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYWJyZV9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnByX3JlZ3M7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11OwotCWludCB0c2JzaXplOwotCWNvbnN0IHUzMiAqdmRtYTsKIAl1MzIgdXBhX3BvcnRpZCwgZG1hX21hc2s7CisJc3RydWN0IGlvbW11ICppb21tdTsKKwlpbnQgdHNic2l6ZSwgZXJyOworCWNvbnN0IHUzMiAqdmRtYTsKIAl1NjQgY2xlYXJfaXJxOwogCi0JaHVtbWluZ2JpcmRfcCA9IDA7Ci0JaWYgKCFzdHJjbXAobW9kZWxfbmFtZSwgInBjaTEwOGUsYTAwMSIpKQotCQlodW1taW5nYmlyZF9wID0gMTsKLQllbHNlIGlmICghc3RyY21wKG1vZGVsX25hbWUsICJTVU5XLHNhYnJlIikpIHsKLQkJY29uc3QgY2hhciAqY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiY29tcGF0aWJsZSIsIE5VTEwpOwotCQlpZiAoY29tcGF0ICYmICFzdHJjbXAoY29tcGF0LCAicGNpMTA4ZSxhMDAxIikpCi0JCQlodW1taW5nYmlyZF9wID0gMTsKLQkJaWYgKCFodW1taW5nYmlyZF9wKSB7Ci0JCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCWh1bW1pbmdiaXJkX3AgPSAobWF0Y2gtPmRhdGEgIT0gTlVMTCk7CisJaWYgKCFodW1taW5nYmlyZF9wKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1X2RwOwogCi0JCQkvKiBPZiBjb3Vyc2UsIFN1biBoYXMgdG8gZW5jb2RlIHRoaW5ncyBhIHRob3VzYW5kCi0JCQkgKiBkaWZmZXJlbnQgd2F5cywgaW5jb25zaXN0ZW50bHkuCi0JCQkgKi8KLQkJCWZvcl9lYWNoX25vZGVfYnlfdHlwZShkcCwgImNwdSIpIHsKLQkJCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgIlNVTlcsVWx0cmFTUEFSQy1JSWUiKSkKLQkJCQkJaHVtbWluZ2JpcmRfcCA9IDE7Ci0JCQl9CisJCS8qIE9mIGNvdXJzZSwgU3VuIGhhcyB0byBlbmNvZGUgdGhpbmdzIGEgdGhvdXNhbmQKKwkJICogZGlmZmVyZW50IHdheXMsIGluY29uc2lzdGVudGx5LgorCQkgKi8KKwkJZm9yX2VhY2hfbm9kZV9ieV90eXBlKGNwdV9kcCwgImNwdSIpIHsKKwkJCWlmICghc3RyY21wKGNwdV9kcC0+bmFtZSwgIlNVTlcsVWx0cmFTUEFSQy1JSWUiKSkKKwkJCQlodW1taW5nYmlyZF9wID0gMTsKIAkJfQogCX0KIAotCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9BVE9NSUMpOwotCWlmICghcCkKLQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CisJZXJyID0gLUVOT01FTTsKKwlwYm0gPSBremFsbG9jKHNpemVvZigqcGJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHBjaV9wYm1faW5mby5cbiIpOworCQlnb3RvIG91dF9lcnI7CisJfQogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZigqaW9tbXUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWlvbW11KQotCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKLQlwYm0gPSAmcC0+cGJtX0E7CisJaW9tbXUgPSBremFsbG9jKHNpemVvZigqaW9tbXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvbW11KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBQQk0gaW9tbXUuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9jb250cm9sbGVyOworCX0KKwogCXBibS0+aW9tbXUgPSBpb21tdTsKIAogCXVwYV9wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJ1cGEtcG9ydGlkIiwgMHhmZik7CiAKLQlwYm0tPm5leHQgPSBwY2lfcGJtX3Jvb3Q7Ci0JcGNpX3BibV9yb290ID0gcGJtOwotCiAJcGJtLT5wb3J0aWQgPSB1cGFfcG9ydGlkOwogCiAJLyoKQEAgLTgwNiw2ICs1MDEsMTEgQEAKIAkgKi8KIAkKIAlwcl9yZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXByX3JlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gcmVnIHByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfZnJlZV9pb21tdTsKKwl9CiAKIAkvKgogCSAqIEZpcnN0IFJFRyBpbiBwcm9wZXJ0eSBpcyBiYXNlIG9mIGVudGlyZSBTQUJSRSByZWdpc3RlciBzcGFjZS4KQEAgLTgxNiwyMiArNTE2LDI1IEBACiAKIAkvKiBQQ0kgZmlyc3QgKi8KIAlmb3IgKGNsZWFyX2lycSA9IFNBQlJFX0lDTFJfQV9TTE9UMDsgY2xlYXJfaXJxIDwgU0FCUkVfSUNMUl9CX1NMT1QwICsgMHg4MDsgY2xlYXJfaXJxICs9IDgpCi0JCXNhYnJlX3dyaXRlKHBibS0+Y29udHJvbGxlcl9yZWdzICsgY2xlYXJfaXJxLCAweDBVTCk7CisJCXVwYV93cml0ZXEoMHgwVUwsIHBibS0+Y29udHJvbGxlcl9yZWdzICsgY2xlYXJfaXJxKTsKIAogCS8qIFRoZW4gT0JJTyAqLwogCWZvciAoY2xlYXJfaXJxID0gU0FCUkVfSUNMUl9TQ1NJOyBjbGVhcl9pcnEgPCBTQUJSRV9JQ0xSX1NDU0kgKyAweDgwOyBjbGVhcl9pcnEgKz0gOCkKLQkJc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBjbGVhcl9pcnEsIDB4MFVMKTsKKwkJdXBhX3dyaXRlcSgweDBVTCwgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBjbGVhcl9pcnEpOwogCiAJLyogRXJyb3IgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBsYXRlciBhZnRlciB0aGUgYnVzIHNjYW4uICovCi0Jc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9QQ0lDVFJMLAotCQkgICAgKFNBQlJFX1BDSUNUUkxfTVJMRU4gICB8IFNBQlJFX1BDSUNUUkxfU0VSUiB8Ci0JCSAgICAgU0FCUkVfUENJQ1RSTF9BUkJQQVJLIHwgU0FCUkVfUENJQ1RSTF9BRU4pKTsKKwl1cGFfd3JpdGVxKChTQUJSRV9QQ0lDVFJMX01STEVOICAgfCBTQUJSRV9QQ0lDVFJMX1NFUlIgfAorCQkgICAgU0FCUkVfUENJQ1RSTF9BUkJQQVJLIHwgU0FCUkVfUENJQ1RSTF9BRU4pLAorCQkgICBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX1BDSUNUUkwpOwogCiAJLyogTm93IG1hcCBpbiBQQ0kgY29uZmlnIHNwYWNlIGZvciBlbnRpcmUgU0FCUkUuICovCi0JcGJtLT5jb25maWdfc3BhY2UgPQotCQkocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9DT05GSUdTUEFDRSk7CisJcGJtLT5jb25maWdfc3BhY2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0NPTkZJR1NQQUNFOwogCiAJdmRtYSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInZpcnR1YWwtZG1hIiwgTlVMTCk7CisJaWYgKCF2ZG1hKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHZpcnR1YWwtZG1hIHByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfZnJlZV9pb21tdTsKKwl9CiAKIAlkbWFfbWFzayA9IHZkbWFbMF07CiAJc3dpdGNoKHZkbWFbMV0pIHsKQEAgLTg0OSwyMCArNTUyLDU4IEBACiAJCQl0c2JzaXplID0gMTI4OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcm9tX3ByaW50ZigiU0FCUkU6IHN0cmFuZ2UgdmlydHVhbC1kbWEgc2l6ZS5cbiIpOwotCQkJcHJvbV9oYWx0KCk7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJTdHJhbmdlIHZpcnR1YWwtZG1hIHNpemUuXG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CiAJfQogCi0JaWYgKHNhYnJlX2lvbW11X2luaXQocGJtLCB0c2JzaXplLCB2ZG1hWzBdLCBkbWFfbWFzaykpCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWVyciA9IHBzeWNob19pb21tdV9pbml0KHBibSwgdHNic2l6ZSwgdmRtYVswXSwgZG1hX21hc2ssIFNBQlJFX1dSU1lOQyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9pb21tdTsKIAogCS8qCiAJICogTG9vayBmb3IgQVBCIHVuZGVybmVhdGguCiAJICovCi0Jc2FicmVfcGJtX2luaXQocCwgcGJtLCBkcCk7Ci0JcmV0dXJuOworCXNhYnJlX3BibV9pbml0KHBibSwgb3ApOwogCi1mYXRhbF9tZW1vcnlfZXJyb3I6Ci0JcHJvbV9wcmludGYoIlNBQlJFOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwotCXByb21faGFsdCgpOworCXBibS0+bmV4dCA9IHBjaV9wYm1fcm9vdDsKKwlwY2lfcGJtX3Jvb3QgPSBwYm07CisKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHBibSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaW9tbXU6CisJa2ZyZWUocGJtLT5pb21tdSk7CisKK291dF9mcmVlX2NvbnRyb2xsZXI6CisJa2ZyZWUocGJtKTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHNhYnJlX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJwY2kiLAorCQkuY29tcGF0aWJsZSA9ICJwY2kxMDhlLGEwMDEiLAorCQkuZGF0YSA9ICh2b2lkICopIDEsCisJfSwKKwl7CisJCS5uYW1lID0gInBjaSIsCisJCS5jb21wYXRpYmxlID0gInBjaTEwOGUsYTAwMCIsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHNhYnJlX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSBzYWJyZV9tYXRjaCwKKwkucHJvYmUJCT0gc2FicmVfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYWJyZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmc2FicmVfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworfQorCitzdWJzeXNfaW5pdGNhbGwoc2FicmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDkyNDhjNjcuLjQ1ZDlkYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0xLDYgKzEsNiBAQAogLyogcGNpX3NjaGl6by5jOiBTQ0hJWk8vVE9NQVRJTExPIHNwZWNpZmljIFBDSSBjb250cm9sbGVyIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTMsMzIgKzEzLDE1IEBACiAKICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3VwYS5oPgogI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS91cGEuaD4KIAogI2luY2x1ZGUgInBjaV9pbXBsLmgiCiAjaW5jbHVkZSAiaW9tbXVfY29tbW9uLmgiCiAKLS8qIEFsbCBTQ0hJWk8gcmVnaXN0ZXJzIGFyZSA2NC1iaXRzLiAgVGhlIGZvbGxvd2luZyBhY2Nlc3NvcgotICogcm91dGluZXMgYXJlIGhvdyB0aGV5IGFyZSBhY2Nlc3NlZC4gIFRoZSBSRUcgcGFyYW1ldGVyCi0gKiBpcyBhIHBoeXNpY2FsIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgc2NoaXpvX3JlYWQoX19yZWcpIFwKLSh7CXU2NCBfX3JldDsgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHhhIFslMV0gJTIsICUwIiBcCi0JCQkgICAgIDogIj1yIiAoX19yZXQpIFwKLQkJCSAgICAgOiAiciIgKF9fcmVnKSwgImkiIChBU0lfUEhZU19CWVBBU1NfRUNfRSkgXAotCQkJICAgICA6ICJtZW1vcnkiKTsgXAotCV9fcmV0OyBcCi19KQotI2RlZmluZSBzY2hpem9fd3JpdGUoX19yZWcsIF9fdmFsKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0eGEgJTAsIFslMV0gJTIiIFwKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovIFwKLQkJCSAgICAgOiAiciIgKF9fdmFsKSwgInIiIChfX3JlZyksIFwKLQkJCSAgICAgICAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSBcCi0JCQkgICAgIDogIm1lbW9yeSIpCisjZGVmaW5lIERSSVZFUl9OQU1FCSJzY2hpem8iCisjZGVmaW5lIFBGWAkJRFJJVkVSX05BTUUgIjogIgogCiAvKiBUaGlzIGlzIGEgY29udmVudGlvbiB0aGF0IGF0IGxlYXN0IEV4Y2FsaWJ1ciBhbmQgTWVybGluCiAgKiBmb2xsb3cuICBJIHN1cHBvc2UgdGhlIFNDSElaTyB1c2VkIGluIFN0YXJjYXQgYW5kIGZyaWVuZHMKQEAgLTE2MywyNSArMTQ2LDI1IEBACiAJICogaW52YWxpZGF0aW5nIGl0IGJlZm9yZSBpdCBoYXMgYSBjaGFuY2UgdG8gcmVhY2gKIAkgKiBtYWluIG1lbW9yeS4KIAkgKi8KLQljb250cm9sID0gc2NoaXpvX3JlYWQoc3RyYnVmLT5zdHJidWZfY29udHJvbCk7Ci0Jc2NoaXpvX3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wsCi0JCSAgICAgKGNvbnRyb2wgfCBTQ0hJWk9fU1RSQlVGX0NUUkxfREVOQUIpKTsKKwljb250cm9sID0gdXBhX3JlYWRxKHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wpOworCXVwYV93cml0ZXEoKGNvbnRyb2wgfCBTQ0hJWk9fU1RSQlVGX0NUUkxfREVOQUIpLAorCQkgICBzdHJidWYtPnN0cmJ1Zl9jb250cm9sKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQkJdmFsID0gc2NoaXpvX3JlYWQoZXJyX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlzY2hpem9fd3JpdGUoZXJyX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7CisJCXZhbCA9IHVwYV9yZWFkcShlcnJfYmFzZSArIChpICogOFVMKSk7CisJCXVwYV93cml0ZXEoMFVMLCBlcnJfYmFzZSArIChpICogOFVMKSk7CiAJCXN0Y19lcnJvcl9idWZbaV0gPSB2YWw7CiAJfQogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXN0Y190YWdfYnVmW2ldID0gc2NoaXpvX3JlYWQodGFnX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlzdGNfbGluZV9idWZbaV0gPSBzY2hpem9fcmVhZChsaW5lX2Jhc2UgKyAoaSAqIDhVTCkpOwotCQlzY2hpem9fd3JpdGUodGFnX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7Ci0JCXNjaGl6b193cml0ZShsaW5lX2Jhc2UgKyAoaSAqIDhVTCksIDBVTCk7CisJCXN0Y190YWdfYnVmW2ldID0gdXBhX3JlYWRxKHRhZ19iYXNlICsgKGkgKiA4VUwpKTsKKwkJc3RjX2xpbmVfYnVmW2ldID0gdXBhX3JlYWRxKGxpbmVfYmFzZSArIChpICogOFVMKSk7CisJCXVwYV93cml0ZXEoMFVMLCB0YWdfYmFzZSArIChpICogOFVMKSk7CisJCXVwYV93cml0ZXEoMFVMLCBsaW5lX2Jhc2UgKyAoaSAqIDhVTCkpOwogCX0KIAogCS8qIE9LLCBzdGF0ZSBpcyBsb2dnZWQsIGV4aXQgZGlhZ25vc3RpYyBtb2RlLiAqLwotCXNjaGl6b193cml0ZShzdHJidWYtPnN0cmJ1Zl9jb250cm9sLCBjb250cm9sKTsKKwl1cGFfd3JpdGVxKGNvbnRyb2wsIHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wpOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJaW50IGosIHNhd19lcnJvciwgZmlyc3QsIGxhc3Q7CkBAIC0yNTgsMTQgKzI0MSwxNCBAQAogCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JY29udHJvbCA9IHNjaGl6b19yZWFkKGlvbW11LT5pb21tdV9jb250cm9sKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5pb21tdV9jb250cm9sKTsKIAlpZiAoY29udHJvbCAmIFNDSElaT19JT01NVV9DVFJMX1hMVEVFUlIpIHsKIAkJdW5zaWduZWQgbG9uZyBiYXNlOwogCQljaGFyICp0eXBlX3N0cmluZzsKIAogCQkvKiBDbGVhciB0aGUgZXJyb3IgZW5jb3VudGVyZWQgYml0LiAqLwogCQljb250cm9sICY9IH5TQ0hJWk9fSU9NTVVfQ1RSTF9YTFRFRVJSOwotCQlzY2hpem9fd3JpdGUoaW9tbXUtPmlvbW11X2NvbnRyb2wsIGNvbnRyb2wpOworCQl1cGFfd3JpdGVxKGNvbnRyb2wsIGlvbW11LT5pb21tdV9jb250cm9sKTsKIAogCQlzd2l0Y2goKGNvbnRyb2wgJiBTQ0hJWk9fSU9NTVVfQ1RSTF9YTFRFU1RBVCkgPj4gMjVVTCkgewogCQljYXNlIDA6CkBAIC0yOTUsMjQgKzI3OCwyNCBAQAogCQkgKiBnZXQgYXMgbXVjaCBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRvIHRoZQogCQkgKiBjb25zb2xlIGFzIHdlIGNhbi4KIAkJICovCi0JCXNjaGl6b193cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwKLQkJCSAgICAgY29udHJvbCB8IFNDSElaT19JT01NVV9DVFJMX0RFTkFCKTsKKwkJdXBhX3dyaXRlcShjb250cm9sIHwgU0NISVpPX0lPTU1VX0NUUkxfREVOQUIsCisJCQkgICBpb21tdS0+aW9tbXVfY29udHJvbCk7CiAKIAkJYmFzZSA9IHBibS0+cGJtX3JlZ3M7CiAKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJCWlvbW11X3RhZ1tpXSA9Ci0JCQkJc2NoaXpvX3JlYWQoYmFzZSArIFNDSElaT19JT01NVV9UQUcgKyAoaSAqIDhVTCkpOworCQkJCXVwYV9yZWFkcShiYXNlICsgU0NISVpPX0lPTU1VX1RBRyArIChpICogOFVMKSk7CiAJCQlpb21tdV9kYXRhW2ldID0KLQkJCQlzY2hpem9fcmVhZChiYXNlICsgU0NISVpPX0lPTU1VX0RBVEEgKyAoaSAqIDhVTCkpOworCQkJCXVwYV9yZWFkcShiYXNlICsgU0NISVpPX0lPTU1VX0RBVEEgKyAoaSAqIDhVTCkpOwogCiAJCQkvKiBOb3cgY2xlYXIgb3V0IHRoZSBlbnRyeS4gKi8KLQkJCXNjaGl6b193cml0ZShiYXNlICsgU0NISVpPX0lPTU1VX1RBRyArIChpICogOFVMKSwgMCk7Ci0JCQlzY2hpem9fd3JpdGUoYmFzZSArIFNDSElaT19JT01NVV9EQVRBICsgKGkgKiA4VUwpLCAwKTsKKwkJCXVwYV93cml0ZXEoMCwgYmFzZSArIFNDSElaT19JT01NVV9UQUcgKyAoaSAqIDhVTCkpOworCQkJdXBhX3dyaXRlcSgwLCBiYXNlICsgU0NISVpPX0lPTU1VX0RBVEEgKyAoaSAqIDhVTCkpOwogCQl9CiAKIAkJLyogTGVhdmUgZGlhZ25vc3RpYyBtb2RlLiAqLwotCQlzY2hpem9fd3JpdGUoaW9tbXUtPmlvbW11X2NvbnRyb2wsIGNvbnRyb2wpOworCQl1cGFfd3JpdGVxKGNvbnRyb2wsIGlvbW11LT5pb21tdV9jb250cm9sKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQkJdW5zaWduZWQgbG9uZyB0YWcsIGRhdGE7CkBAIC0zNTcsMTEgKzM0MCwxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNjaGl6b19jaGVja19pb21tdV9lcnJvcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKK3N0YXRpYyB2b2lkIHNjaGl6b19jaGVja19pb21tdV9lcnJvcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAJCQkJICAgICBlbnVtIHNjaGl6b19lcnJvcl90eXBlIHR5cGUpCiB7Ci0Jc2NoaXpvX2NoZWNrX2lvbW11X2Vycm9yX3BibSgmcC0+cGJtX0EsIHR5cGUpOwotCXNjaGl6b19jaGVja19pb21tdV9lcnJvcl9wYm0oJnAtPnBibV9CLCB0eXBlKTsKKwlzY2hpem9fY2hlY2tfaW9tbXVfZXJyb3JfcGJtKHBibSwgdHlwZSk7CisJaWYgKHBibS0+c2libGluZykKKwkJc2NoaXpvX2NoZWNrX2lvbW11X2Vycm9yX3BibShwYm0tPnNpYmxpbmcsIHR5cGUpOwogfQogCiAvKiBVbmNvcnJlY3RhYmxlIEVDQyBlcnJvciBzdGF0dXMgZ2F0aGVyaW5nLiAqLwpAQCAtMzg2LDE0ICszNzAsMTMgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzY2hpem9fdWVfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gZGV2X2lkOwotCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwID0gcGJtLT5wYXJlbnQ7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZyA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX1VFX0FGU1I7CiAJdW5zaWduZWQgbG9uZyBhZmFyX3JlZyA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX1VFX0FGQVI7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwogCWludCByZXBvcnRlZCwgbGltaXQ7CiAKIAkvKiBMYXRjaCB1bmNvcnJlY3RhYmxlIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gc2NoaXpvX3JlYWQoYWZhcl9yZWcpOworCWFmYXIgPSB1cGFfcmVhZHEoYWZhcl9yZWcpOwogCiAJLyogSWYgZWl0aGVyIG9mIHRoZSBlcnJvciBwZW5kaW5nIGJpdHMgYXJlIHNldCBpbiB0aGUKIAkgKiBBRlNSLCB0aGUgZXJyb3Igc3RhdHVzIGlzIGJlaW5nIGFjdGl2ZWx5IHVwZGF0ZWQgYnkKQEAgLTQwMSw3ICszODQsNyBAQAogCSAqLwogCWxpbWl0ID0gMTAwMDsKIAlkbyB7Ci0JCWFmc3IgPSBzY2hpem9fcmVhZChhZnNyX3JlZyk7CisJCWFmc3IgPSB1cGFfcmVhZHEoYWZzcl9yZWcpOwogCX0gd2hpbGUgKChhZnNyICYgU0NISVpPX1VFQUZTUl9FUlJQTkRHKSAhPSAwICYmIC0tbGltaXQpOwogCiAJLyogQ2xlYXIgdGhlIHByaW1hcnkvc2Vjb25kYXJ5IGVycm9yIHN0YXR1cyBiaXRzLiAqLwpAQCAtNDEwLDcgKzM5Myw3IEBACiAJCSBTQ0hJWk9fVUVBRlNSX1NQSU8gfCBTQ0hJWk9fVUVBRlNSX1NETUEpOwogCWlmICghZXJyb3JfYml0cykKIAkJcmV0dXJuIElSUV9OT05FOwotCXNjaGl6b193cml0ZShhZnNyX3JlZywgZXJyb3JfYml0cyk7CisJdXBhX3dyaXRlcShlcnJvcl9iaXRzLCBhZnNyX3JlZyk7CiAKIAkvKiBMb2cgdGhlIGVycm9yLiAqLwogCXByaW50aygiJXM6IFVuY29ycmVjdGFibGUgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslc11cbiIsCkBAIC00NDksNyArNDMyLDcgQEAKIAlwcmludGsoIl1cbiIpOwogCiAJLyogSW50ZXJyb2dhdGUgSU9NTVUgZm9yIGVycm9yIHN0YXR1cy4gKi8KLQlzY2hpem9fY2hlY2tfaW9tbXVfZXJyb3IocCwgVUVfRVJSKTsKKwlzY2hpem9fY2hlY2tfaW9tbXVfZXJyb3IocGJtLCBVRV9FUlIpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDgxLDcgKzQ2NCw3IEBACiAJaW50IHJlcG9ydGVkLCBsaW1pdDsKIAogCS8qIExhdGNoIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gc2NoaXpvX3JlYWQoYWZhcl9yZWcpOworCWFmYXIgPSB1cGFfcmVhZHEoYWZhcl9yZWcpOwogCiAJLyogSWYgZWl0aGVyIG9mIHRoZSBlcnJvciBwZW5kaW5nIGJpdHMgYXJlIHNldCBpbiB0aGUKIAkgKiBBRlNSLCB0aGUgZXJyb3Igc3RhdHVzIGlzIGJlaW5nIGFjdGl2ZWx5IHVwZGF0ZWQgYnkKQEAgLTQ4OSw3ICs0NzIsNyBAQAogCSAqLwogCWxpbWl0ID0gMTAwMDsKIAlkbyB7Ci0JCWFmc3IgPSBzY2hpem9fcmVhZChhZnNyX3JlZyk7CisJCWFmc3IgPSB1cGFfcmVhZHEoYWZzcl9yZWcpOwogCX0gd2hpbGUgKChhZnNyICYgU0NISVpPX1VFQUZTUl9FUlJQTkRHKSAhPSAwICYmIC0tbGltaXQpOwogCiAJLyogQ2xlYXIgcHJpbWFyeS9zZWNvbmRhcnkgZXJyb3Igc3RhdHVzIGJpdHMuICovCkBAIC00OTgsNyArNDgxLDcgQEAKIAkJIFNDSElaT19DRUFGU1JfU1BJTyB8IFNDSElaT19DRUFGU1JfU0RNQSk7CiAJaWYgKCFlcnJvcl9iaXRzKQogCQlyZXR1cm4gSVJRX05PTkU7Ci0Jc2NoaXpvX3dyaXRlKGFmc3JfcmVnLCBlcnJvcl9iaXRzKTsKKwl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIGFmc3JfcmVnKTsKIAogCS8qIExvZyB0aGUgZXJyb3IuICovCiAJcHJpbnRrKCIlczogQ29ycmVjdGFibGUgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslc11cbiIsCkBAIC02MDAsNyArNTgzLDcgQEAKIAl1MTYgc3RhdDsKIAogCWNzcl9yZWcgPSBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMOwotCWNzciA9IHNjaGl6b19yZWFkKGNzcl9yZWcpOworCWNzciA9IHVwYV9yZWFkcShjc3JfcmVnKTsKIAljc3JfZXJyb3JfYml0cyA9CiAJCWNzciAmIChTQ0hJWk9fUENJQ1RSTF9CVVNfVU5VUyB8CiAJCSAgICAgICBTQ0hJWk9fUENJQ1RSTF9UVE9fRVJSIHwKQEAgLTYxMCw3ICs1OTMsNyBAQAogCQkgICAgICAgU0NISVpPX1BDSUNUUkxfU0VSUik7CiAJaWYgKGNzcl9lcnJvcl9iaXRzKSB7CiAJCS8qIENsZWFyIHRoZSBlcnJvcnMuICAqLwotCQlzY2hpem9fd3JpdGUoY3NyX3JlZywgY3NyKTsKKwkJdXBhX3dyaXRlcShjc3IsIGNzcl9yZWcpOwogCiAJCS8qIExvZyAnZW0uICAqLwogCQlpZiAoY3NyX2Vycm9yX2JpdHMgJiBTQ0hJWk9fUENJQ1RSTF9CVVNfVU5VUykKQEAgLTY1MCw3ICs2MzMsNiBAQAogc3RhdGljIGlycXJldHVybl90IHNjaGl6b19wY2llcnJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gZGV2X2lkOwotCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwID0gcGJtLT5wYXJlbnQ7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWcsIGJhc2U7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwogCWludCByZXBvcnRlZDsKQEAgLTY2MSw4ICs2NDMsOCBAQAogCWFmYXJfcmVnID0gYmFzZSArIFNDSElaT19QQ0lfQUZBUjsKIAogCS8qIExhdGNoIGVycm9yIHN0YXR1cy4gKi8KLQlhZmFyID0gc2NoaXpvX3JlYWQoYWZhcl9yZWcpOwotCWFmc3IgPSBzY2hpem9fcmVhZChhZnNyX3JlZyk7CisJYWZhciA9IHVwYV9yZWFkcShhZmFyX3JlZyk7CisJYWZzciA9IHVwYV9yZWFkcShhZnNyX3JlZyk7CiAKIAkvKiBDbGVhciBwcmltYXJ5L3NlY29uZGFyeSBlcnJvciBzdGF0dXMgYml0cy4gKi8KIAllcnJvcl9iaXRzID0gYWZzciAmCkBAIC02NzQsNyArNjU2LDcgQEAKIAkJIFNDSElaT19QQ0lBRlNSX1NUVE8gfCBTQ0hJWk9fUENJQUZTUl9TVU5VUyk7CiAJaWYgKCFlcnJvcl9iaXRzKQogCQlyZXR1cm4gc2NoaXpvX3BjaWVycl9pbnRyX290aGVyKHBibSk7Ci0Jc2NoaXpvX3dyaXRlKGFmc3JfcmVnLCBlcnJvcl9iaXRzKTsKKwl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIGFmc3JfcmVnKTsKIAogCS8qIExvZyB0aGUgZXJyb3IuICovCiAJcHJpbnRrKCIlczogUENJIEVycm9yLCBwcmltYXJ5IGVycm9yIHR5cGVbJXNdXG4iLApAQCAtNzQ0LDcgKzcyNiw3IEBACiAJICogYSBidWcgaW4gdGhlIElPTU1VIHN1cHBvcnQgY29kZSBvciBhIFBDSSBkZXZpY2UgZHJpdmVyLgogCSAqLwogCWlmIChlcnJvcl9iaXRzICYgKFNDSElaT19QQ0lBRlNSX1BUQSB8IFNDSElaT19QQ0lBRlNSX1NUQSkpIHsKLQkJc2NoaXpvX2NoZWNrX2lvbW11X2Vycm9yKHAsIFBDSV9FUlIpOworCQlzY2hpem9fY2hlY2tfaW9tbXVfZXJyb3IocGJtLCBQQ0lfRVJSKTsKIAkJcGNpX3NjYW5fZm9yX3RhcmdldF9hYm9ydChwYm0sIHBibS0+cGNpX2J1cyk7CiAJfQogCWlmIChlcnJvcl9iaXRzICYgKFNDSElaT19QQ0lBRlNSX1BNQSB8IFNDSElaT19QQ0lBRlNSX1NNQSkpCkBAIC04MDUsMTIgKzc4NywxMSBAQAogc3RhdGljIGlycXJldHVybl90IHNjaGl6b19zYWZhcmllcnJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gZGV2X2lkOwotCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwID0gcGJtLT5wYXJlbnQ7CiAJdTY0IGVycmxvZzsKIAotCWVycmxvZyA9IHNjaGl6b19yZWFkKHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX1NBRkFSSV9FUlJMT0cpOwotCXNjaGl6b193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19TQUZBUklfRVJSTE9HLAotCQkgICAgIGVycmxvZyAmIH4oU0FGQVJJX0VSUkxPR19FUlJPVVQpKTsKKwllcnJsb2cgPSB1cGFfcmVhZHEocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQ0hJWk9fU0FGQVJJX0VSUkxPRyk7CisJdXBhX3dyaXRlcShlcnJsb2cgJiB+KFNBRkFSSV9FUlJMT0dfRVJST1VUKSwKKwkJICAgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQ0hJWk9fU0FGQVJJX0VSUkxPRyk7CiAKIAlpZiAoIShlcnJsb2cgJiBCVVNfRVJST1JfVU5NQVApKSB7CiAJCXByaW50aygiJXM6IFVuZXhwZWN0ZWQgU2FmYXJpL0pCVVMgZXJyb3IgaW50ZXJydXB0LCBlcnJsb2dbJTAxNmx4XVxuIiwKQEAgLTgyMSw3ICs4MDIsNyBAQAogCiAJcHJpbnRrKCIlczogU2FmYXJpL0pCVVMgaW50ZXJydXB0LCBVTk1BUFBFRCBlcnJvciwgaW50ZXJyb2dhdGluZyBJT01NVXMuXG4iLAogCSAgICAgICBwYm0tPm5hbWUpOwotCXNjaGl6b19jaGVja19pb21tdV9lcnJvcihwLCBTQUZBUklfRVJSKTsKKwlzY2hpem9fY2hlY2tfaW9tbXVfZXJyb3IocGJtLCBTQUZBUklfRVJSKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTg2Myw3ICs4NDQsNyBAQAogICovCiBzdGF0aWMgdm9pZCB0b21hdGlsbG9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwYm0tPnByb21fbm9kZSk7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHBibS0+b3AtPm5vZGUpOwogCXU2NCB0bXAsIGVycl9tYXNrLCBlcnJfbm9fbWFzazsKIAlpbnQgZXJyOwogCkBAIC05MTAsMTAgKzg5MSw5IEBACiAJfQogCiAJLyogRW5hYmxlIFVFIGFuZCBDRSBpbnRlcnJ1cHRzIGZvciBjb250cm9sbGVyLiAqLwotCXNjaGl6b193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19FQ0NfQ1RSTCwKLQkJICAgICAoU0NISVpPX0VDQ0NUUkxfRUUgfAotCQkgICAgICBTQ0hJWk9fRUNDQ1RSTF9VRSB8Ci0JCSAgICAgIFNDSElaT19FQ0NDVFJMX0NFKSk7CisJdXBhX3dyaXRlcSgoU0NISVpPX0VDQ0NUUkxfRUUgfAorCQkgICAgU0NISVpPX0VDQ0NUUkxfVUUgfAorCQkgICAgU0NISVpPX0VDQ0NUUkxfQ0UpLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19FQ0NfQ1RSTCk7CiAKIAkvKiBFbmFibGUgUENJIEVycm9yIGludGVycnVwdHMgYW5kIGNsZWFyIGVycm9yCiAJICogYml0cy4KQEAgLTkyNiwxMCArOTA2LDEwIEBACiAKIAllcnJfbm9fbWFzayA9IFNDSElaT19QQ0lDVFJMX0RUT19FUlI7CiAKLQl0bXAgPSBzY2hpem9fcmVhZChwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKKwl0bXAgPSB1cGFfcmVhZHEocGJtLT5wYm1fcmVncyArIFNDSElaT19QQ0lfQ1RSTCk7CiAJdG1wIHw9IGVycl9tYXNrOwogCXRtcCAmPSB+ZXJyX25vX21hc2s7Ci0Jc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0NUUkwsIHRtcCk7CisJdXBhX3dyaXRlcSh0bXAsIHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0NUUkwpOwogCiAJZXJyX21hc2sgPSAoU0NISVpPX1BDSUFGU1JfUE1BIHwgU0NISVpPX1BDSUFGU1JfUFRBIHwKIAkJICAgIFNDSElaT19QQ0lBRlNSX1BSVFJZIHwgU0NISVpPX1BDSUFGU1JfUFBFUlIgfApAQCAtOTM4LDcgKzkxOCw3IEBACiAJCSAgICBTQ0hJWk9fUENJQUZTUl9TUlRSWSB8IFNDSElaT19QQ0lBRlNSX1NQRVJSIHwKIAkJICAgIFNDSElaT19QQ0lBRlNSX1NUVE8pOwogCi0Jc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0FGU1IsIGVycl9tYXNrKTsKKwl1cGFfd3JpdGVxKGVycl9tYXNrLCBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9BRlNSKTsKIAogCWVycl9tYXNrID0gKEJVU19FUlJPUl9CQURDTUQgfCBCVVNfRVJST1JfU05PT1BfR1IgfAogCQkgICAgQlVTX0VSUk9SX1NOT09QX1BDSSB8IEJVU19FUlJPUl9TTk9PUF9SRCB8CkBAIC05NTAsMTYgKzkzMCwxNiBAQAogCQkgICAgQlVTX0VSUk9SX0FQRVJSIHwgQlVTX0VSUk9SX1VOTUFQIHwKIAkJICAgIEJVU19FUlJPUl9CVVNFUlIgfCBCVVNfRVJST1JfVElNRU9VVCk7CiAKLQlzY2hpem9fd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQ0hJWk9fU0FGQVJJX0VSUkNUUkwsCi0JCSAgICAgKFNDSElaT19TQUZFUlJDVFJMX0VOIHwgZXJyX21hc2spKTsKKwl1cGFfd3JpdGVxKChTQ0hJWk9fU0FGRVJSQ1RSTF9FTiB8IGVycl9tYXNrKSwKKwkJICAgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQ0hJWk9fU0FGQVJJX0VSUkNUUkwpOwogCi0Jc2NoaXpvX3dyaXRlKHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX1NBRkFSSV9JUlFDVFJMLAotCQkgICAgIChTQ0hJWk9fU0FGSVJRQ1RSTF9FTiB8IChCVVNfRVJST1JfVU5NQVApKSk7CisJdXBhX3dyaXRlcSgoU0NISVpPX1NBRklSUUNUUkxfRU4gfCAoQlVTX0VSUk9SX1VOTUFQKSksCisJCSAgIHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX1NBRkFSSV9JUlFDVFJMKTsKIH0KIAogc3RhdGljIHZvaWQgc2NoaXpvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUocGJtLT5wcm9tX25vZGUpOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwYm0tPm9wLT5ub2RlKTsKIAl1NjQgdG1wLCBlcnJfbWFzaywgZXJyX25vX21hc2s7CiAJaW50IGVycjsKIApAQCAtMTAwNiwxMCArOTg2LDkgQEAKIAl9CiAKIAkvKiBFbmFibGUgVUUgYW5kIENFIGludGVycnVwdHMgZm9yIGNvbnRyb2xsZXIuICovCi0Jc2NoaXpvX3dyaXRlKHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX0VDQ19DVFJMLAotCQkgICAgIChTQ0hJWk9fRUNDQ1RSTF9FRSB8Ci0JCSAgICAgIFNDSElaT19FQ0NDVFJMX1VFIHwKLQkJICAgICAgU0NISVpPX0VDQ0NUUkxfQ0UpKTsKKwl1cGFfd3JpdGVxKChTQ0hJWk9fRUNDQ1RSTF9FRSB8CisJCSAgICBTQ0hJWk9fRUNDQ1RSTF9VRSB8CisJCSAgICBTQ0hJWk9fRUNDQ1RSTF9DRSksIHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0NISVpPX0VDQ19DVFJMKTsKIAogCWVycl9tYXNrID0gKFNDSElaT19QQ0lDVFJMX0JVU19VTlVTIHwKIAkJICAgIFNDSElaT19QQ0lDVFJMX0VTTENLIHwKQEAgLTEwMjUsMTggKzEwMDQsMTggQEAKIAkvKiBFbmFibGUgUENJIEVycm9yIGludGVycnVwdHMgYW5kIGNsZWFyIGVycm9yCiAJICogYml0cyBmb3IgZWFjaCBQQk0uCiAJICovCi0JdG1wID0gc2NoaXpvX3JlYWQocGJtLT5wYm1fcmVncyArIFNDSElaT19QQ0lfQ1RSTCk7CisJdG1wID0gdXBhX3JlYWRxKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0NUUkwpOwogCXRtcCB8PSBlcnJfbWFzazsKIAl0bXAgJj0gfmVycl9ub19tYXNrOwotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKIAotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9BRlNSLAotCQkgICAgIChTQ0hJWk9fUENJQUZTUl9QTUEgfCBTQ0hJWk9fUENJQUZTUl9QVEEgfAotCQkgICAgICBTQ0hJWk9fUENJQUZTUl9QUlRSWSB8IFNDSElaT19QQ0lBRlNSX1BQRVJSIHwKLQkJICAgICAgU0NISVpPX1BDSUFGU1JfUFRUTyB8IFNDSElaT19QQ0lBRlNSX1BVTlVTIHwKLQkJICAgICAgU0NISVpPX1BDSUFGU1JfU01BIHwgU0NISVpPX1BDSUFGU1JfU1RBIHwKLQkJICAgICAgU0NISVpPX1BDSUFGU1JfU1JUUlkgfCBTQ0hJWk9fUENJQUZTUl9TUEVSUiB8Ci0JCSAgICAgIFNDSElaT19QQ0lBRlNSX1NUVE8gfCBTQ0hJWk9fUENJQUZTUl9TVU5VUykpOworCXVwYV93cml0ZXEoKFNDSElaT19QQ0lBRlNSX1BNQSB8IFNDSElaT19QQ0lBRlNSX1BUQSB8CisJCSAgICBTQ0hJWk9fUENJQUZTUl9QUlRSWSB8IFNDSElaT19QQ0lBRlNSX1BQRVJSIHwKKwkJICAgIFNDSElaT19QQ0lBRlNSX1BUVE8gfCBTQ0hJWk9fUENJQUZTUl9QVU5VUyB8CisJCSAgICBTQ0hJWk9fUENJQUZTUl9TTUEgfCBTQ0hJWk9fUENJQUZTUl9TVEEgfAorCQkgICAgU0NISVpPX1BDSUFGU1JfU1JUUlkgfCBTQ0hJWk9fUENJQUZTUl9TUEVSUiB8CisJCSAgICBTQ0hJWk9fUENJQUZTUl9TVFRPIHwgU0NISVpPX1BDSUFGU1JfU1VOVVMpLAorCQkgICBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9BRlNSKTsKIAogCS8qIE1ha2UgYWxsIFNhZmFyaSBlcnJvciBjb25kaXRpb25zIGZhdGFsIGV4Y2VwdCB1bm1hcHBlZAogCSAqIGVycm9ycyB3aGljaCB3ZSBtYWtlIGdlbmVyYXRlIGludGVycnVwdHMuCkBAIC0xMDYzLDggKzEwNDIsOCBAQAogCQkgICAgICBCVVNfRVJST1JfQ1BVMFBTIHwgQlVTX0VSUk9SX0NQVTBQQik7CiAjZW5kaWYKIAotCXNjaGl6b193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19TQUZBUklfRVJSQ1RSTCwKLQkJICAgICAoU0NISVpPX1NBRkVSUkNUUkxfRU4gfCBlcnJfbWFzaykpOworCXVwYV93cml0ZXEoKFNDSElaT19TQUZFUlJDVFJMX0VOIHwgZXJyX21hc2spLAorCQkgICBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19TQUZBUklfRVJSQ1RSTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBibV9jb25maWdfYnVzbWFzdGVyaW5nKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKQEAgLTEwODQsMTQgKzEwNjMsMTUgQEAKIAlwY2lfY29uZmlnX3dyaXRlOChhZGRyLCA2NCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzY2hpem9fc2Nhbl9idXMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNjaGl6b19zY2FuX2J1cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50KQogewogCXBibV9jb25maWdfYnVzbWFzdGVyaW5nKHBibSk7CiAJcGJtLT5pc182Nm1oel9jYXBhYmxlID0KLQkJKG9mX2ZpbmRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICI2Nm1oei1jYXBhYmxlIiwgTlVMTCkKKwkJKG9mX2ZpbmRfcHJvcGVydHkocGJtLT5vcC0+bm9kZSwgIjY2bWh6LWNhcGFibGUiLCBOVUxMKQogCQkgIT0gTlVMTCk7CiAKLQlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSk7CisJcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fb25lX3BibShwYm0sIHBhcmVudCk7CiAKIAlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCiAJCXRvbWF0aWxsb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwYm0pOwpAQCAtMTEzMywxMiArMTExMywxMiBAQAogCSAqIHN0cmVhbWluZyBidWZmZXIgYW5kIGxlYXZlIHRoZSByZXJ1bi1kaXNhYmxlCiAJICogc2V0dGluZyBob3dldmVyIE9CUCBzZXQgaXQuCiAJICovCi0JY29udHJvbCA9IHNjaGl6b19yZWFkKHBibS0+c3RjLnN0cmJ1Zl9jb250cm9sKTsKKwljb250cm9sID0gdXBhX3JlYWRxKHBibS0+c3RjLnN0cmJ1Zl9jb250cm9sKTsKIAljb250cm9sICY9IH4oU0NISVpPX1NUUkJVRl9DVFJMX0xQVFIgfAogCQkgICAgIFNDSElaT19TVFJCVUZfQ1RSTF9MRU5BQiB8CiAJCSAgICAgU0NISVpPX1NUUkJVRl9DVFJMX0RFTkFCKTsKIAljb250cm9sIHw9IFNDSElaT19TVFJCVUZfQ1RSTF9FTkFCOwotCXNjaGl6b193cml0ZShwYm0tPnN0Yy5zdHJidWZfY29udHJvbCwgY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sLCBwYm0tPnN0Yy5zdHJidWZfY29udHJvbCk7CiAKIAlwYm0tPnN0Yy5zdHJidWZfZW5hYmxlZCA9IDE7CiB9CkBAIC0xMTUwLDI0ICsxMTMwLDE3IEBACiAKIHN0YXRpYyBpbnQgc2NoaXpvX3BibV9pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGJtLT5pb21tdTsKKwlzdGF0aWMgY29uc3QgdTMyIHZkbWFfZGVmYXVsdFtdID0geyAweGMwMDAwMDAwLCAweDQwMDAwMDAwIH07CiAJdW5zaWduZWQgbG9uZyBpLCB0YWdiYXNlLCBkYXRhYmFzZTsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0JdTMyIHZkbWFbMl0sIGRtYV9tYXNrOworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwogCWludCB0c2JzaXplLCBlcnI7CisJY29uc3QgdTMyICp2ZG1hOworCXUzMiBkbWFfbWFzazsKIAl1NjQgY29udHJvbDsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKLQlpZiAocHJvcCkgewotCQl1MzIgKnZhbCA9IHByb3AtPnZhbHVlOwotCi0JCXZkbWFbMF0gPSB2YWxbMF07Ci0JCXZkbWFbMV0gPSB2YWxbMV07Ci0JfSBlbHNlIHsKLQkJLyogTm8gcHJvcGVydHksIHVzZSBkZWZhdWx0IHZhbHVlcy4gKi8KLQkJdmRtYVswXSA9IDB4YzAwMDAwMDA7Ci0JCXZkbWFbMV0gPSAweDQwMDAwMDAwOwotCX0KKwl2ZG1hID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJ2aXJ0dWFsLWRtYSIsIE5VTEwpOworCWlmICghdmRtYSkKKwkJdmRtYSA9IHZkbWFfZGVmYXVsdDsKIAogCWRtYV9tYXNrID0gdmRtYVswXTsKIAlzd2l0Y2ggKHZkbWFbMV0pIHsKQEAgLTExODcsOSArMTE2MCw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJvbV9wcmludGYoIlNDSElaTzogc3RyYW5nZSB2aXJ0dWFsLWRtYSBzaXplLlxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQl9OworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU3RyYW5nZSB2aXJ0dWFsLWRtYSBzaXplLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBSZWdpc3RlciBhZGRyZXNzZXMsIFNDSElaTyBoYXMgaW9tbXUgY3R4IGZsdXNoaW5nLiAqLwogCWlvbW11LT5pb21tdV9jb250cm9sICA9IHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fSU9NTVVfQ09OVFJPTDsKQEAgLTEyMDYsMTUgKzExNzksMTUgQEAKIAkvKgogCSAqIEludmFsaWRhdGUgVExCIEVudHJpZXMuCiAJICovCi0JY29udHJvbCA9IHNjaGl6b19yZWFkKGlvbW11LT5pb21tdV9jb250cm9sKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5pb21tdV9jb250cm9sKTsKIAljb250cm9sIHw9IFNDSElaT19JT01NVV9DVFJMX0RFTkFCOwotCXNjaGl6b193cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+aW9tbXVfY29udHJvbCk7CiAKIAl0YWdiYXNlID0gU0NISVpPX0lPTU1VX1RBRywgZGF0YWJhc2UgPSBTQ0hJWk9fSU9NTVVfREFUQTsKIAotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyB0YWdiYXNlICsgKGkgKiA4VUwpLCAwKTsKLQkJc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBkYXRhYmFzZSArIChpICogOFVMKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdXBhX3dyaXRlcSgwLCBwYm0tPnBibV9yZWdzICsgdGFnYmFzZSArIChpICogOFVMKSk7CisJCXVwYV93cml0ZXEoMCwgcGJtLT5wYm1fcmVncyArIGRhdGFiYXNlICsgKGkgKiA4VUwpKTsKIAl9CiAKIAkvKiBMZWF2ZSBkaWFnIG1vZGUgZW5hYmxlZCBmb3IgZnVsbC1mbHVzaGluZyBkb25lCkBAIC0xMjIyLDEyICsxMTk1LDE0IEBACiAJICovCiAJZXJyID0gaW9tbXVfdGFibGVfaW5pdChpb21tdSwgdHNic2l6ZSAqIDggKiAxMDI0LCB2ZG1hWzBdLCBkbWFfbWFzaywKIAkJCSAgICAgICBwYm0tPm51bWFfbm9kZSk7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvbW11X3RhYmxlX2luaXQoKSBmYWlscyB3aXRoICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOworCX0KIAotCXNjaGl6b193cml0ZShpb21tdS0+aW9tbXVfdHNiYmFzZSwgX19wYShpb21tdS0+cGFnZV90YWJsZSkpOworCXVwYV93cml0ZXEoX19wYShpb21tdS0+cGFnZV90YWJsZSksIGlvbW11LT5pb21tdV90c2JiYXNlKTsKIAotCWNvbnRyb2wgPSBzY2hpem9fcmVhZChpb21tdS0+aW9tbXVfY29udHJvbCk7CisJY29udHJvbCA9IHVwYV9yZWFkcShpb21tdS0+aW9tbXVfY29udHJvbCk7CiAJY29udHJvbCAmPSB+KFNDSElaT19JT01NVV9DVFJMX1RTQlNaIHwgU0NISVpPX0lPTU1VX0NUUkxfVEJXU1opOwogCXN3aXRjaCAodHNic2l6ZSkgewogCWNhc2UgNjQ6CkBAIC0xMjM2LDEwICsxMjExLDEwIEBACiAJY2FzZSAxMjg6CiAJCWNvbnRyb2wgfD0gU0NISVpPX0lPTU1VX1RTQlNaXzEyOEs7CiAJCWJyZWFrOwotCX07CisJfQogCiAJY29udHJvbCB8PSBTQ0hJWk9fSU9NTVVfQ1RSTF9FTkFCOwotCXNjaGl6b193cml0ZShpb21tdS0+aW9tbXVfY29udHJvbCwgY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+aW9tbXVfY29udHJvbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODAsMTIgKzEyNTUsMTEgQEAKIAogc3RhdGljIHZvaWQgc2NoaXpvX3BibV9od19pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTY0IHRtcDsKIAotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9JUlFfUkVUUlksIDUpOworCXVwYV93cml0ZXEoNSwgcGJtLT5wYm1fcmVncyArIFNDSElaT19QQ0lfSVJRX1JFVFJZKTsKIAotCXRtcCA9IHNjaGl6b19yZWFkKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0NUUkwpOworCXRtcCA9IHVwYV9yZWFkcShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKIAogCS8qIEVuYWJsZSBhcmJpdGVyIGZvciBhbGwgUENJIHNsb3RzLiAgKi8KIAl0bXAgfD0gMHhmZjsKQEAgLTEyOTQsOCArMTI2OCw3IEBACiAJICAgIHBibS0+Y2hpcF92ZXJzaW9uID49IDB4MikKIAkJdG1wIHw9IDB4M1VMIDw8IFNDSElaT19QQ0lDVFJMX1BUT19TSElGVDsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAibm8tYnVzLXBhcmtpbmciLCBOVUxMKTsKLQlpZiAoIXByb3ApCisJaWYgKCFvZl9maW5kX3Byb3BlcnR5KHBibS0+b3AtPm5vZGUsICJuby1idXMtcGFya2luZyIsIE5VTEwpKQogCQl0bXAgfD0gU0NISVpPX1BDSUNUUkxfUEFSSzsKIAllbHNlCiAJCXRtcCAmPSB+U0NISVpPX1BDSUNUUkxfUEFSSzsKQEAgLTEzMTEsMTMgKzEyODQsMTMgQEAKIAkJCVNDSElaT19QQ0lDVFJMX1JET19QUkVGIHwKIAkJCVNDSElaT19QQ0lDVFJMX1JETF9QUkVGKTsKIAotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKIAotCXRtcCA9IHNjaGl6b19yZWFkKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0RJQUcpOworCXRtcCA9IHVwYV9yZWFkcShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9ESUFHKTsKIAl0bXAgJj0gfihTQ0hJWk9fUENJRElBR19EX1JUUllBUkIgfAogCQkgU0NISVpPX1BDSURJQUdfRF9SRVRSWSB8CiAJCSBTQ0hJWk9fUENJRElBR19EX0lOVFNZTkMpOwotCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9ESUFHLCB0bXApOworCXVwYV93cml0ZXEodG1wLCBwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9ESUFHKTsKIAogCWlmIChwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTykgewogCQkvKiBDbGVhciBwcmVmZXRjaCBsZW5ndGhzIHRvIHdvcmthcm91bmQgYSBidWcgaW4KQEAgLTEzMjksMTcgKzEzMDIsMTYgQEAKIAkJICAgICAgIFRPTUFUSUxMT19JT0NfUkRPTkVfQ1BFTkFCIHwKIAkJICAgICAgIFRPTUFUSUxMT19JT0NfUkRMSU5FX0NQRU5BQik7CiAKLQkJc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBUT01BVElMTE9fUENJX0lPQ19DU1IsCi0JCQkgICAgIHRtcCk7CisJCXVwYV93cml0ZXEodG1wLCBwYm0tPnBibV9yZWdzICsgVE9NQVRJTExPX1BDSV9JT0NfQ1NSKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNjaGl6b19wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHUzMiBwb3J0aWQsCi0JCQkJICBpbnQgY2hpcF90eXBlKQorc3RhdGljIGludCBfX2RldmluaXQgc2NoaXpvX3BibV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkgICAgIHN0cnVjdCBvZl9kZXZpY2UgKm9wLCB1MzIgcG9ydGlkLAorCQkJCSAgICAgaW50IGNoaXBfdHlwZSkKIHsKIAljb25zdCBzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCWNvbnN0IGNoYXIgKmNoaXBzZXRfbmFtZTsKIAlpbnQgaXNfcGJtX2EsIGVycjsKIApAQCAtMTM3MiwyNSArMTM0NCwxOSBAQAogCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKIAogCWlzX3BibV9hID0gKChyZWdzWzBdLnBoeXNfYWRkciAmIDB4MDA3MDAwMDApID09IDB4MDA2MDAwMDApOwotCWlmIChpc19wYm1fYSkKLQkJcGJtID0gJnAtPnBibV9BOwotCWVsc2UKLQkJcGJtID0gJnAtPnBibV9COwogCiAJcGJtLT5uZXh0ID0gcGNpX3BibV9yb290OwogCXBjaV9wYm1fcm9vdCA9IHBibTsKIAogCXBibS0+bnVtYV9ub2RlID0gLTE7CiAKLQlwYm0tPnNjYW5fYnVzID0gc2NoaXpvX3NjYW5fYnVzOwogCXBibS0+cGNpX29wcyA9ICZzdW40dV9wY2lfb3BzOwogCXBibS0+Y29uZmlnX3NwYWNlX3JlZ19iaXRzID0gODsKIAogCXBibS0+aW5kZXggPSBwY2lfbnVtX3BibXMrKzsKIAogCXBibS0+cG9ydGlkID0gcG9ydGlkOwotCXBibS0+cGFyZW50ID0gcDsKLQlwYm0tPnByb21fbm9kZSA9IGRwOworCXBibS0+b3AgPSBvcDsKIAogCXBibS0+Y2hpcF90eXBlID0gY2hpcF90eXBlOwogCXBibS0+Y2hpcF92ZXJzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAidmVyc2lvbiMiLCAwKTsKQEAgLTE0MjAsNiArMTM4Niw4IEBACiAKIAlzY2hpem9fcGJtX3N0cmJ1Zl9pbml0KHBibSk7CiAKKwlzY2hpem9fc2Nhbl9idXMocGJtLCAmb3AtPmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQzMyw2MiArMTQwMSwxMDQgQEAKIAlyZXR1cm4gKHggPT0geSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBfX3NjaGl6b19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUsCi0JCQkJIGludCBjaGlwX3R5cGUpCitzdGF0aWMgc3RydWN0IHBjaV9wYm1faW5mbyAqIF9fZGV2aW5pdCBzY2hpem9fZmluZF9zaWJsaW5nKHUzMiBwb3J0aWQsCisJCQkJCQkJICAgaW50IGNoaXBfdHlwZSkKIHsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcDsKKwlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CisKKwlmb3IgKHBibSA9IHBjaV9wYm1fcm9vdDsgcGJtOyBwYm0gPSBwYm0tPm5leHQpIHsKKwkJaWYgKHBvcnRpZF9jb21wYXJlKHBibS0+cG9ydGlkLCBwb3J0aWQsIGNoaXBfdHlwZSkpCisJCQlyZXR1cm4gcGJtOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgX19zY2hpem9faW5pdChzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdW5zaWduZWQgbG9uZyBjaGlwX3R5cGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXUzMiBwb3J0aWQ7CisJaW50IGVycjsKIAogCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIDB4ZmYpOwogCi0JZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7Ci0JCWlmIChwb3J0aWRfY29tcGFyZShwYm0tPnBvcnRpZCwgcG9ydGlkLCBjaGlwX3R5cGUpKSB7Ci0JCQlpZiAoc2NoaXpvX3BibV9pbml0KHBibS0+cGFyZW50LCBkcCwKLQkJCQkJICAgIHBvcnRpZCwgY2hpcF90eXBlKSkKLQkJCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKLQkJCXJldHVybjsKLQkJfQorCWVyciA9IC1FTk9NRU07CisJcGJtID0ga3phbGxvYyhzaXplb2YoKnBibSksIEdGUF9LRVJORUwpOworCWlmICghcGJtKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBwY2lfcGJtX2luZm8uXG4iKTsKKwkJZ290byBvdXRfZXJyOwogCX0KIAotCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmICghcCkKLQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CisJcGJtLT5zaWJsaW5nID0gc2NoaXpvX2ZpbmRfc2libGluZyhwb3J0aWQsIGNoaXBfdHlwZSk7CiAKLQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9BVE9NSUMpOwotCWlmICghaW9tbXUpCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgUEJNIEEgaW9tbXUuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9wYm07CisJfQogCi0JcC0+cGJtX0EuaW9tbXUgPSBpb21tdTsKKwlwYm0tPmlvbW11ID0gaW9tbXU7CiAKLQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9BVE9NSUMpOwotCWlmICghaW9tbXUpCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWlmIChzY2hpem9fcGJtX2luaXQocGJtLCBvcCwgcG9ydGlkLCBjaGlwX3R5cGUpKQorCQlnb3RvIG91dF9mcmVlX2lvbW11OwogCi0JcC0+cGJtX0IuaW9tbXUgPSBpb21tdTsKKwlpZiAocGJtLT5zaWJsaW5nKQorCQlwYm0tPnNpYmxpbmctPnNpYmxpbmcgPSBwYm07CiAKLQlpZiAoc2NoaXpvX3BibV9pbml0KHAsIGRwLCBwb3J0aWQsIGNoaXBfdHlwZSkpCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcGJtKTsKIAotCXJldHVybjsKKwlyZXR1cm4gMDsKIAotZmF0YWxfbWVtb3J5X2Vycm9yOgotCXByb21fcHJpbnRmKCJTQ0hJWk86IEZhdGFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIik7Ci0JcHJvbV9oYWx0KCk7CitvdXRfZnJlZV9pb21tdToKKwlrZnJlZShwYm0tPmlvbW11KTsKKworb3V0X2ZyZWVfcGJtOgorCWtmcmVlKHBibSk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBfX2luaXQgc2NoaXpvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqbW9kZWxfbmFtZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjaGl6b19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCV9fc2NoaXpvX2luaXQoZHAsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfU0NISVpPKTsKKwlyZXR1cm4gX19zY2hpem9faW5pdChvcCwgKHVuc2lnbmVkIGxvbmcpIG1hdGNoLT5kYXRhKTsKIH0KIAotdm9pZCBfX2luaXQgc2NoaXpvX3BsdXNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICptb2RlbF9uYW1lKQorLyogVGhlIG9yZGVyaW5nIG9mIHRoaXMgdGFibGUgaXMgdmVyeSBpbXBvcnRhbnQuICBTb21lIFRvbWF0aWxsbworICogbm9kZXMgYW5ub3VuY2UgdGhhdCB0aGV5IGFyZSBjb21wYXRpYmxlIHdpdGggYm90aCBwY2kxMDhlLGE4MDEKKyAqIGFuZCBwY2kxMDhlLDgwMDEuICBTbyBsaXN0IHRoZSBjaGlwcyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwKKyAqIG9yZGVyLgorICovCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHNjaGl6b19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAicGNpIiwKKwkJLmNvbXBhdGlibGUgPSAicGNpMTA4ZSxhODAxIiwKKwkJLmRhdGEgPSAodm9pZCAqKSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTywKKwl9LAorCXsKKwkJLm5hbWUgPSAicGNpIiwKKwkJLmNvbXBhdGlibGUgPSAicGNpMTA4ZSw4MDAyIiwKKwkJLmRhdGEgPSAodm9pZCAqKSBQQk1fQ0hJUF9UWVBFX1NDSElaT19QTFVTLAorCX0sCisJeworCQkubmFtZSA9ICJwY2kiLAorCQkuY29tcGF0aWJsZSA9ICJwY2kxMDhlLDgwMDEiLAorCQkuZGF0YSA9ICh2b2lkICopIFBCTV9DSElQX1RZUEVfU0NISVpPLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBzY2hpem9fZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IHNjaGl6b19tYXRjaCwKKwkucHJvYmUJCT0gc2NoaXpvX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2NoaXpvX2luaXQodm9pZCkKIHsKLQlfX3NjaGl6b19pbml0KGRwLCBtb2RlbF9uYW1lLCBQQk1fQ0hJUF9UWVBFX1NDSElaT19QTFVTKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZzY2hpem9fZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCi12b2lkIF9faW5pdCB0b21hdGlsbG9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICptb2RlbF9uYW1lKQotewotCV9fc2NoaXpvX2luaXQoZHAsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKTsKLX0KK3N1YnN5c19pbml0Y2FsbChzY2hpem9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCBhMTA0YzgwLi4zNGExZmRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTEzLDEyICsxMywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vdXBhLmg+Ci0jaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIApAQCAtMjcsNiArMjUsOSBAQAogCiAjaW5jbHVkZSAicGNpX3N1bjR2LmgiCiAKKyNkZWZpbmUgRFJJVkVSX05BTUUJInBjaV9zdW40diIKKyNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHZwY2lfbWFqb3IgPSAxOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdnBjaV9taW5vciA9IDE7CiAKQEAgLTQxLDYgKzQyLDcgQEAKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaW9tbXVfYmF0Y2gsIGlvbW11X2JhdGNoKTsKK3N0YXRpYyBpbnQgaW9tbXVfYmF0Y2hfaW5pdGlhbGl6ZWQ7CiAKIC8qIEludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZC4gICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9tbXVfYmF0Y2hfc3RhcnQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZW50cnkpCkBAIC0zODIsNyArMzg0LDcgQEAKIAkJfQogCQkvKiBBbGxvY2F0ZSBpb21tdSBlbnRyaWVzIGZvciB0aGF0IHNlZ21lbnQgKi8KIAkJcGFkZHIgPSAodW5zaWduZWQgbG9uZykgU0dfRU5UX1BIWVNfQUREUkVTUyhzKTsKLQkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHBhZGRyLCBzbGVuKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHBhZGRyLCBzbGVuLCBJT19QQUdFX1NJWkUpOwogCQllbnRyeSA9IGlvbW11X3JhbmdlX2FsbG9jKGRldiwgaW9tbXUsIG5wYWdlcywgJmhhbmRsZSk7CiAKIAkJLyogSGFuZGxlIGZhaWx1cmUgKi8KQEAgLTQ1OSw3ICs0NjEsOCBAQAogCQkJdW5zaWduZWQgbG9uZyB2YWRkciwgbnBhZ2VzOwogCiAJCQl2YWRkciA9IHMtPmRtYV9hZGRyZXNzICYgSU9fUEFHRV9NQVNLOwotCQkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoKTsKKwkJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwKKwkJCQkJCSBJT19QQUdFX1NJWkUpOwogCQkJaW9tbXVfcmFuZ2VfZnJlZShpb21tdSwgdmFkZHIsIG5wYWdlcyk7CiAJCQkvKiBYWFggZGVtYXA/IFhYWCAqLwogCQkJcy0+ZG1hX2FkZHJlc3MgPSBETUFfRVJST1JfQ09ERTsKQEAgLTQ5OCw3ICs1MDEsNyBAQAogCiAJCWlmICghbGVuKQogCQkJYnJlYWs7Ci0JCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfaGFuZGxlLCBsZW4pOworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgbGVuLCBJT19QQUdFX1NJWkUpOwogCQlpb21tdV9yYW5nZV9mcmVlKGlvbW11LCBkbWFfaGFuZGxlLCBucGFnZXMpOwogCiAJCWVudHJ5ID0gKChkbWFfaGFuZGxlIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpID4+IElPX1BBR0VfU0hJRlQpOwpAQCAtNTQyLDE1ICs1NDUsMTYgQEAKIAkuc3luY19zZ19mb3JfY3B1CQk9IGRtYV80dl9zeW5jX3NnX2Zvcl9jcHUsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGNpX3N1bjR2X3NjYW5fYnVzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfc3VuNHZfc2Nhbl9idXMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAotCWRwID0gcGJtLT5wcm9tX25vZGU7CisJZHAgPSBwYm0tPm9wLT5ub2RlOwogCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiNjZtaHotY2FwYWJsZSIsIE5VTEwpOwogCXBibS0+aXNfNjZtaHpfY2FwYWJsZSA9IChwcm9wICE9IE5VTEwpOwotCXBibS0+cGNpX2J1cyA9IHBjaV9zY2FuX29uZV9wYm0ocGJtKTsKKwlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSwgcGFyZW50KTsKIAogCS8qIFhYWCByZWdpc3RlciBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMgWFhYICovCiB9CkBAIC01ODMsMjkgKzU4NywyMiBAQAogCXJldHVybiBjbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfc3VuNHZfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgaW50IF9faW5pdCBwY2lfc3VuNHZfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CisJc3RhdGljIGNvbnN0IHUzMiB2ZG1hX2RlZmF1bHRbXSA9IHsgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCB9OwogCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgc3osIHRzYnNpemU7Ci0JdTMyIHZkbWFbMl0sIGRtYV9tYXNrLCBkbWFfb2Zmc2V0OworCXUzMiBkbWFfbWFzaywgZG1hX29mZnNldDsKKwljb25zdCB1MzIgKnZkbWE7CiAKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwgInZpcnR1YWwtZG1hIiwgTlVMTCk7Ci0JaWYgKHByb3ApIHsKLQkJdTMyICp2YWwgPSBwcm9wLT52YWx1ZTsKLQotCQl2ZG1hWzBdID0gdmFsWzBdOwotCQl2ZG1hWzFdID0gdmFsWzFdOwotCX0gZWxzZSB7Ci0JCS8qIE5vIHByb3BlcnR5LCB1c2UgZGVmYXVsdCB2YWx1ZXMuICovCi0JCXZkbWFbMF0gPSAweDgwMDAwMDAwOwotCQl2ZG1hWzFdID0gMHg4MDAwMDAwMDsKLQl9CisJdmRtYSA9IG9mX2dldF9wcm9wZXJ0eShwYm0tPm9wLT5ub2RlLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKKwlpZiAoIXZkbWEpCisJCXZkbWEgPSB2ZG1hX2RlZmF1bHQ7CiAKIAlpZiAoKHZkbWFbMF0gfCB2ZG1hWzFdKSAmIH5JT19QQUdFX01BU0spIHsKLQkJcHJvbV9wcmludGYoIlBDSS1TVU40Vjogc3RyYW5nZSB2aXJ0dWFsLWRtYVslMDh4OiUwOHhdLlxuIiwKLQkJCSAgICB2ZG1hWzBdLCB2ZG1hWzFdKTsKLQkJcHJvbV9oYWx0KCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlN0cmFuZ2UgdmlydHVhbC1kbWFbJTA4eDolMDh4XS5cbiIsCisJCSAgICAgICB2ZG1hWzBdLCB2ZG1hWzFdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfTsKIAogCWRtYV9tYXNrID0gKHJvdW5kdXBfcG93X29mX3R3byh2ZG1hWzFdKSAtIDFVTCk7CkBAIC02MjUsOCArNjIyLDggQEAKIAlzeiA9IChzeiArIDdVTCkgJiB+N1VMOwogCWlvbW11LT5hcmVuYS5tYXAgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlvbW11LT5hcmVuYS5tYXApIHsKLQkJcHJvbV9wcmludGYoIlBDSV9JT01NVTogRXJyb3IsIGttYWxsb2MoYXJlbmEubWFwKSBmYWlsZWQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVycm9yLCBrbWFsbG9jKGFyZW5hLm1hcCkgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpb21tdS0+YXJlbmEubGltaXQgPSBudW1fdHNiX2VudHJpZXM7CiAKQEAgLTYzNCw2ICs2MzEsOCBAQAogCWlmIChzeikKIAkJcHJpbnRrKCIlczogSW1wb3J0ZWQgJWx1IFRTQiBlbnRyaWVzIGZyb20gT0JQXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBzeik7CisKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCkBAIC04OTAsMjkgKzg4OSwyMCBAQAogfQogI2VuZGlmIC8qICEoQ09ORklHX1BDSV9NU0kpICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfc3VuNHZfcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIGRldmhhbmRsZSkKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zdW40dl9wYm1faW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgdTMyIGRldmhhbmRsZSkKIHsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0KLQlpZiAoZGV2aGFuZGxlICYgMHg0MCkKLQkJcGJtID0gJnAtPnBibV9COwotCWVsc2UKLQkJcGJtID0gJnAtPnBibV9BOwotCi0JcGJtLT5uZXh0ID0gcGNpX3BibV9yb290OwotCXBjaV9wYm1fcm9vdCA9IHBibTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7CisJaW50IGVycjsKIAogCXBibS0+bnVtYV9ub2RlID0gb2Zfbm9kZV90b19uaWQoZHApOwogCi0JcGJtLT5zY2FuX2J1cyA9IHBjaV9zdW40dl9zY2FuX2J1czsKIAlwYm0tPnBjaV9vcHMgPSAmc3VuNHZfcGNpX29wczsKIAlwYm0tPmNvbmZpZ19zcGFjZV9yZWdfYml0cyA9IDEyOwogCiAJcGJtLT5pbmRleCA9IHBjaV9udW1fcGJtcysrOwogCi0JcGJtLT5wYXJlbnQgPSBwOwotCXBibS0+cHJvbV9ub2RlID0gZHA7CisJcGJtLT5vcCA9IG9wOwogCiAJcGJtLT5kZXZoYW5kbGUgPSBkZXZoYW5kbGU7CiAKQEAgLTkyNCw4MiArOTE0LDEyMCBAQAogCXBjaV9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHBibSk7CiAKIAlwY2lfZ2V0X3BibV9wcm9wcyhwYm0pOwotCXBjaV9zdW40dl9pb21tdV9pbml0KHBibSk7CisKKwllcnIgPSBwY2lfc3VuNHZfaW9tbXVfaW5pdChwYm0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlwY2lfc3VuNHZfbXNpX2luaXQocGJtKTsKKworCXBjaV9zdW40dl9zY2FuX2J1cyhwYm0sICZvcC0+ZGV2KTsKKworCXBibS0+bmV4dCA9IHBjaV9wYm1fcm9vdDsKKwlwY2lfcGJtX3Jvb3QgPSBwYm07CisKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgc3VuNHZfcGNpX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqbW9kZWxfbmFtZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaV9zdW40dl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogeworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwogCXN0YXRpYyBpbnQgaHZhcGlfbmVnb3RpYXRlZCA9IDA7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJc3RydWN0IGlvbW11ICppb21tdTsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJdTMyIGRldmhhbmRsZTsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyOworCisJZHAgPSBvcC0+bm9kZTsKIAogCWlmICghaHZhcGlfbmVnb3RpYXRlZCsrKSB7Ci0JCWludCBlcnIgPSBzdW40dl9odmFwaV9yZWdpc3RlcihIVl9HUlBfUENJLAotCQkJCQkgICAgICAgdnBjaV9tYWpvciwKLQkJCQkJICAgICAgICZ2cGNpX21pbm9yKTsKKwkJZXJyID0gc3VuNHZfaHZhcGlfcmVnaXN0ZXIoSFZfR1JQX1BDSSwKKwkJCQkJICAgdnBjaV9tYWpvciwKKwkJCQkJICAgJnZwY2lfbWlub3IpOwogCiAJCWlmIChlcnIpIHsKLQkJCXByb21fcHJpbnRmKCJTVU40Vl9QQ0k6IENvdWxkIG5vdCByZWdpc3RlciBodmFwaSwgIgotCQkJCSAgICAiZXJyPSVkXG4iLCBlcnIpOwotCQkJcHJvbV9oYWx0KCk7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgaHZhcGksICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLCBlcnIpOworCQkJcmV0dXJuIGVycjsKIAkJfQotCQlwcmludGsoIlNVTjRWX1BDSTogUmVnaXN0ZXJlZCBodmFwaSBtYWpvclslbHVdIG1pbm9yWyVsdV1cbiIsCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJSZWdpc3RlcmVkIGh2YXBpIG1ham9yWyVsdV0gbWlub3JbJWx1XVxuIiwKIAkJICAgICAgIHZwY2lfbWFqb3IsIHZwY2lfbWlub3IpOwogCiAJCWRtYV9vcHMgPSAmc3VuNHZfZG1hX29wczsKIAl9CiAKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCWlmICghcHJvcCkgewotCQlwcm9tX3ByaW50ZigiU1VONFZfUENJOiBDb3VsZCBub3QgZmluZCBjb25maWcgcmVnaXN0ZXJzXG4iKTsKLQkJcHJvbV9oYWx0KCk7CisJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyByZWdpc3RlcnNcbiIpOworCQlnb3RvIG91dF9lcnI7CiAJfQotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQogCWRldmhhbmRsZSA9IChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmOwogCi0JZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7Ci0JCWlmIChwYm0tPmRldmhhbmRsZSA9PSAoZGV2aGFuZGxlIF4gMHg0MCkpIHsKLQkJCXBjaV9zdW40dl9wYm1faW5pdChwYm0tPnBhcmVudCwgZHAsIGRldmhhbmRsZSk7Ci0JCQlyZXR1cm47CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWlvbW11X2JhdGNoX2luaXRpYWxpemVkKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCQl1bnNpZ25lZCBsb25nIHBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwkJCWlmICghcGFnZSkKKwkJCQlnb3RvIG91dF9lcnI7CisKKwkJCXBlcl9jcHUoaW9tbXVfYmF0Y2gsIGkpLnBnbGlzdCA9ICh1NjQgKikgcGFnZTsKIAkJfQorCQlpb21tdV9iYXRjaF9pbml0aWFsaXplZCA9IDE7CiAJfQogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJdW5zaWduZWQgbG9uZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwotCi0JCWlmICghcGFnZSkKLQkJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwotCi0JCXBlcl9jcHUoaW9tbXVfYmF0Y2gsIGkpLnBnbGlzdCA9ICh1NjQgKikgcGFnZTsKKwlwYm0gPSBremFsbG9jKHNpemVvZigqcGJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IGFsbG9jYXRlIHBjaV9wYm1faW5mb1xuIik7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXApCi0JCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgYWxsb2NhdGUgcGJtIGlvbW11XG4iKTsKKwkJZ290byBvdXRfZnJlZV9jb250cm9sbGVyOworCX0KIAotCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpb21tdSkKLQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CisJcGJtLT5pb21tdSA9IGlvbW11OwogCi0JcC0+cGJtX0EuaW9tbXUgPSBpb21tdTsKKwllcnIgPSBwY2lfc3VuNHZfcGJtX2luaXQocGJtLCBvcCwgZGV2aGFuZGxlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2lvbW11OwogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWlvbW11KQotCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHBibSk7CiAKLQlwLT5wYm1fQi5pb21tdSA9IGlvbW11OworCXJldHVybiAwOwogCi0JcGNpX3N1bjR2X3BibV9pbml0KHAsIGRwLCBkZXZoYW5kbGUpOwotCXJldHVybjsKK291dF9mcmVlX2lvbW11OgorCWtmcmVlKHBibS0+aW9tbXUpOwogCi1mYXRhbF9tZW1vcnlfZXJyb3I6Ci0JcHJvbV9wcmludGYoIlNVTjRWX1BDSTogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKLQlwcm9tX2hhbHQoKTsKK291dF9mcmVlX2NvbnRyb2xsZXI6CisJa2ZyZWUocGJtKTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHBjaV9zdW40dl9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAicGNpIiwKKwkJLmNvbXBhdGlibGUgPSAiU1VOVyxzdW40di1wY2kiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBwY2lfc3VuNHZfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IHBjaV9zdW40dl9tYXRjaCwKKwkucHJvYmUJCT0gcGNpX3N1bjR2X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpX3N1bjR2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfc3VuNHZfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpX3N1bjR2X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHZfYXNtLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40dl9hc20uUwppbmRleCBlY2I4MWYzLi5lNjA2ZDQ2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40dl9hc20uUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40dl9hc20uUwpAQCAtMSw4ICsxLDkgQEAKIC8qIHBjaV9zdW40dl9hc206IEh5cGVydmlzb3IgY2FsbHMgZm9yIFBDSSBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogCS8qICVvMDogZGV2aGFuZGxlCkBAIC0xNCw4ICsxNSw3IEBACiAJICogcmV0dXJucyAlbzA6CS1zdGF0dXMgaWYgc3RhdHVzIHdhcyBub24temVybywgZWxzZQogCSAqICAgICAgICAgJW8wOgludW0gcGFnZXMgbWFwcGVkCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9pb21tdV9tYXAKLXBjaV9zdW40dl9pb21tdV9tYXA6CitFTlRSWShwY2lfc3VuNHZfaW9tbXVfbWFwKQogCW1vdgklbzUsICVnMQogCW1vdglIVl9GQVNUX1BDSV9JT01NVV9NQVAsICVvNQogCXRhCUhWX0ZBU1RfVFJBUApAQCAtMjQsNiArMjQsNyBAQAogCW1vdgklbzEsICVvMAogMToJcmV0bAogCSBub3AKK0VORFBST0MocGNpX3N1bjR2X2lvbW11X21hcCkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOgl0c2JpZApAQCAtMzEsMTIgKzMyLDEyIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDoJbnVtIHR0ZXMgZGVtYXBwZWQKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X2lvbW11X2RlbWFwCi1wY2lfc3VuNHZfaW9tbXVfZGVtYXA6CitFTlRSWShwY2lfc3VuNHZfaW9tbXVfZGVtYXApCiAJbW92CUhWX0ZBU1RfUENJX0lPTU1VX0RFTUFQLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzEsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfaW9tbXVfZGVtYXApCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMToJdHNiaWQKQEAgLTQ1LDggKzQ2LDcgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOglzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X2lvbW11X2dldG1hcAotcGNpX3N1bjR2X2lvbW11X2dldG1hcDoKK0VOVFJZKHBjaV9zdW40dl9pb21tdV9nZXRtYXApCiAJbW92CSVvMiwgJW80CiAJbW92CUhWX0ZBU1RfUENJX0lPTU1VX0dFVE1BUCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCkBAIC01NCw2ICs1NCw3IEBACiAJc3R4CSVvMiwgWyVvM10KIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfaW9tbXVfZ2V0bWFwKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6CXBjaV9kZXZpY2UKQEAgLTY1LDE0ICs2NiwxNCBAQAogCSAqIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgZGF0YSB3aWxsIGJlIHJldHVybmVkCiAJICogYXMgYWxsIDEncy4KIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X2NvbmZpZ19nZXQKLXBjaV9zdW40dl9jb25maWdfZ2V0OgorRU5UUlkocGNpX3N1bjR2X2NvbmZpZ19nZXQpCiAJbW92CUhWX0ZBU1RfUENJX0NPTkZJR19HRVQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCWJybnosYSxwbiAlbzEsIDFmCiAJIG1vdgktMSwgJW8yCiAxOglyZXRsCiAJIG1vdgklbzIsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfY29uZmlnX2dldCkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOglwY2lfZGV2aWNlCkBAIC04NSwxNCArODYsMTQgQEAKIAkgKiBzdGF0dXMgd2lsbCBiZSB6ZXJvIGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVkCiAJICogc3VjY2Vzc2Z1bGx5LCBlbHNlIC0xIGlmIG5vdAogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfY29uZmlnX3B1dAotcGNpX3N1bjR2X2NvbmZpZ19wdXQ6CitFTlRSWShwY2lfc3VuNHZfY29uZmlnX3B1dCkKIAltb3YJSFZfRkFTVF9QQ0lfQ09ORklHX1BVVCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJYnJueixhLHBuICVvMSwgMWYKIAkgbW92CS0xLCAlbzEKIDE6CXJldGwKIAkgbW92CSVvMSwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9jb25maWdfcHV0KQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaXFpZApAQCAtMTA0LDEyICsxMDUsMTIgQEAKIAkgKiBzdGF0dXMgd2lsbCBiZSB6ZXJvIGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVkCiAJICogc3VjY2Vzc2Z1bGx5LCBlbHNlIC0xIGlmIG5vdAogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpcV9jb25mCi1wY2lfc3VuNHZfbXNpcV9jb25mOgorRU5UUlkocGNpX3N1bjR2X21zaXFfY29uZikKIAltb3YJSFZfRkFTVF9QQ0lfTVNJUV9DT05GLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpcV9jb25mKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaXFpZApAQCAtMTE4LDggKzExOSw3IEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2lxX2luZm8KLXBjaV9zdW40dl9tc2lxX2luZm86CitFTlRSWShwY2lfc3VuNHZfbXNpcV9pbmZvKQogCW1vdgklbzIsICVvNAogCW1vdglIVl9GQVNUX1BDSV9NU0lRX0lORk8sICVvNQogCXRhCUhWX0ZBU1RfVFJBUApAQCAtMTI3LDYgKzEyNyw3IEBACiAJc3R4CSVvMiwgWyVvM10KIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpcV9pbmZvKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaXFpZApAQCAtMTM0LDEzICsxMzUsMTMgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X21zaXFfZ2V0dmFsaWQKLXBjaV9zdW40dl9tc2lxX2dldHZhbGlkOgorRU5UUlkocGNpX3N1bjR2X21zaXFfZ2V0dmFsaWQpCiAJbW92CUhWX0ZBU1RfUENJX01TSVFfR0VUVkFMSUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslbzJdCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zaXFfZ2V0dmFsaWQpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpcWlkCkBAIC0xNDgsMTIgKzE0OSwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpcV9zZXR2YWxpZAotcGNpX3N1bjR2X21zaXFfc2V0dmFsaWQ6CitFTlRSWShwY2lfc3VuNHZfbXNpcV9zZXR2YWxpZCkKIAltb3YJSFZfRkFTVF9QQ0lfTVNJUV9TRVRWQUxJRCwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zaXFfc2V0dmFsaWQpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpcWlkCkBAIC0xNjEsMTMgKzE2MiwxMyBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpcV9nZXRzdGF0ZQotcGNpX3N1bjR2X21zaXFfZ2V0c3RhdGU6CitFTlRSWShwY2lfc3VuNHZfbXNpcV9nZXRzdGF0ZSkKIAltb3YJSFZfRkFTVF9QQ0lfTVNJUV9HRVRTVEFURSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVvMl0KIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpcV9nZXRzdGF0ZSkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2lxaWQKQEAgLTE3NSwxMiArMTc2LDEyIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2lxX3NldHN0YXRlCi1wY2lfc3VuNHZfbXNpcV9zZXRzdGF0ZToKK0VOVFJZKHBjaV9zdW40dl9tc2lxX3NldHN0YXRlKQogCW1vdglIVl9GQVNUX1BDSV9NU0lRX1NFVFNUQVRFLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpcV9zZXRzdGF0ZSkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2lxaWQKQEAgLTE4OCwxMyArMTg5LDEzIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2lxX2dldGhlYWQKLXBjaV9zdW40dl9tc2lxX2dldGhlYWQ6CitFTlRSWShwY2lfc3VuNHZfbXNpcV9nZXRoZWFkKQogCW1vdglIVl9GQVNUX1BDSV9NU0lRX0dFVEhFQUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslbzJdCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zaXFfZ2V0aGVhZCkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2lxaWQKQEAgLTIwMiwxMiArMjAzLDEyIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2lxX3NldGhlYWQKLXBjaV9zdW40dl9tc2lxX3NldGhlYWQ6CitFTlRSWShwY2lfc3VuNHZfbXNpcV9zZXRoZWFkKQogCW1vdglIVl9GQVNUX1BDSV9NU0lRX1NFVEhFQUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2lxX3NldGhlYWQpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpcWlkCkBAIC0yMTUsMTMgKzIxNiwxMyBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpcV9nZXR0YWlsCi1wY2lfc3VuNHZfbXNpcV9nZXR0YWlsOgorRU5UUlkocGNpX3N1bjR2X21zaXFfZ2V0dGFpbCkKIAltb3YJSFZfRkFTVF9QQ0lfTVNJUV9HRVRUQUlMLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW8yXQogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2lxX2dldHRhaWwpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpbnVtCkBAIC0yMjksMTMgKzIzMCwxMyBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpX2dldHZhbGlkCi1wY2lfc3VuNHZfbXNpX2dldHZhbGlkOgorRU5UUlkocGNpX3N1bjR2X21zaV9nZXR2YWxpZCkKIAltb3YJSFZfRkFTVF9QQ0lfTVNJX0dFVFZBTElELCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW8yXQogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2lfZ2V0dmFsaWQpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpbnVtCkBAIC0yNDMsMTIgKzI0NCwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNpX3NldHZhbGlkCi1wY2lfc3VuNHZfbXNpX3NldHZhbGlkOgorRU5UUlkocGNpX3N1bjR2X21zaV9zZXR2YWxpZCkKIAltb3YJSFZfRkFTVF9QQ0lfTVNJX1NFVFZBTElELCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpX3NldHZhbGlkKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaW51bQpAQCAtMjU2LDEzICsyNTcsMTMgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X21zaV9nZXRtc2lxCi1wY2lfc3VuNHZfbXNpX2dldG1zaXE6CitFTlRSWShwY2lfc3VuNHZfbXNpX2dldG1zaXEpCiAJbW92CUhWX0ZBU1RfUENJX01TSV9HRVRNU0lRLCAlbzUKIAl0YQlIVl9GQVNUX1RSQVAKIAlzdHgJJW8xLCBbJW8yXQogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2lfZ2V0bXNpcSkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2ludW0KQEAgLTI3MSwxMiArMjcyLDEyIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2lfc2V0bXNpcQotcGNpX3N1bjR2X21zaV9zZXRtc2lxOgorRU5UUlkocGNpX3N1bjR2X21zaV9zZXRtc2lxKQogCW1vdglIVl9GQVNUX1BDSV9NU0lfU0VUTVNJUSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zaV9zZXRtc2lxKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaW51bQpAQCAtMjg0LDEzICsyODUsMTMgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X21zaV9nZXRzdGF0ZQotcGNpX3N1bjR2X21zaV9nZXRzdGF0ZToKK0VOVFJZKHBjaV9zdW40dl9tc2lfZ2V0c3RhdGUpCiAJbW92CUhWX0ZBU1RfUENJX01TSV9HRVRTVEFURSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVvMl0KIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNpX2dldHN0YXRlKQogCiAJLyogJW8wOiBkZXZoYW5kbGUKIAkgKiAlbzE6IG1zaW51bQpAQCAtMjk4LDEyICsyOTksMTIgQEAKIAkgKgogCSAqIHJldHVybnMgJW8wOiBzdGF0dXMKIAkgKi8KLQkuZ2xvYmwJcGNpX3N1bjR2X21zaV9zZXRzdGF0ZQotcGNpX3N1bjR2X21zaV9zZXRzdGF0ZToKK0VOVFJZKHBjaV9zdW40dl9tc2lfc2V0c3RhdGUpCiAJbW92CUhWX0ZBU1RfUENJX01TSV9TRVRTVEFURSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zaV9zZXRzdGF0ZSkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2ludW0KQEAgLTMxMSwxMyArMzEyLDEzIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2dfZ2V0bXNpcQotcGNpX3N1bjR2X21zZ19nZXRtc2lxOgorRU5UUlkocGNpX3N1bjR2X21zZ19nZXRtc2lxKQogCW1vdglIVl9GQVNUX1BDSV9NU0dfR0VUTVNJUSwgJW81CiAJdGEJSFZfRkFTVF9UUkFQCiAJc3R4CSVvMSwgWyVvMl0KIAlyZXRsCiAJIG1vdgklbzAsICVvMAorRU5EUFJPQyhwY2lfc3VuNHZfbXNnX2dldG1zaXEpCiAKIAkvKiAlbzA6IGRldmhhbmRsZQogCSAqICVvMTogbXNpbnVtCkBAIC0zMjUsMTIgKzMyNiwxMiBAQAogCSAqCiAJICogcmV0dXJucyAlbzA6IHN0YXR1cwogCSAqLwotCS5nbG9ibAlwY2lfc3VuNHZfbXNnX3NldG1zaXEKLXBjaV9zdW40dl9tc2dfc2V0bXNpcToKK0VOVFJZKHBjaV9zdW40dl9tc2dfc2V0bXNpcSkKIAltb3YJSFZfRkFTVF9QQ0lfTVNHX1NFVE1TSVEsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2dfc2V0bXNpcSkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2ludW0KQEAgLTMzOCwxMyArMzM5LDEzIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2dfZ2V0dmFsaWQKLXBjaV9zdW40dl9tc2dfZ2V0dmFsaWQ6CitFTlRSWShwY2lfc3VuNHZfbXNnX2dldHZhbGlkKQogCW1vdglIVl9GQVNUX1BDSV9NU0dfR0VUVkFMSUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXN0eAklbzEsIFslbzJdCiAJcmV0bAogCSBtb3YJJW8wLCAlbzAKK0VORFBST0MocGNpX3N1bjR2X21zZ19nZXR2YWxpZCkKIAogCS8qICVvMDogZGV2aGFuZGxlCiAJICogJW8xOiBtc2ludW0KQEAgLTM1MiwxMCArMzUzLDEwIEBACiAJICoKIAkgKiByZXR1cm5zICVvMDogc3RhdHVzCiAJICovCi0JLmdsb2JsCXBjaV9zdW40dl9tc2dfc2V0dmFsaWQKLXBjaV9zdW40dl9tc2dfc2V0dmFsaWQ6CitFTlRSWShwY2lfc3VuNHZfbXNnX3NldHZhbGlkKQogCW1vdglIVl9GQVNUX1BDSV9NU0dfU0VUVkFMSUQsICVvNQogCXRhCUhWX0ZBU1RfVFJBUAogCXJldGwKIAkgbW92CSVvMCwgJW8wCitFTkRQUk9DKHBjaV9zdW40dl9tc2dfc2V0dmFsaWQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwppbmRleCAzYmI5ODdhLi4wNzZjYWQ3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCkBAIC0xLDM0ICsxLDE3IEBACiAvKiBwb3dlci5jOiBQb3dlciBtYW5hZ2VtZW50IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc3N0YXRlLmg+Ci0jaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotCi0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0KLS8qCi0gKiBzeXNjdGwgLSB0b2dnbGUgcG93ZXItb2ZmIHJlc3RyaWN0aW9uIGZvciBzZXJpYWwgY29uc29sZSAKLSAqIHN5c3RlbXMgaW4gbWFjaGluZV9wb3dlcl9vZmYoKQotICovCi1pbnQgc2NvbnNfcHdyb2ZmID0gMTsgCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnBvd2VyX3JlZzsKIApAQCAtNDAsMzEgKzIzLDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkICgqcG93ZXJvZmZfbWV0aG9kKSh2b2lkKSA9IG1hY2hpbmVfYWx0X3Bvd2VyX29mZjsKLQotdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQotewotCXNzdGF0ZV9wb3dlcm9mZigpOwotCWlmIChzdHJjbXAob2ZfY29uc29sZV9kZXZpY2UtPnR5cGUsICJzZXJpYWwiKSB8fCBzY29uc19wd3JvZmYpIHsKLQkJaWYgKHBvd2VyX3JlZykgewotCQkJLyogQm90aCByZWdpc3RlciBiaXRzIHNlZW0gdG8gaGF2ZSB0aGUKLQkJCSAqIHNhbWUgZWZmZWN0LCBzbyB1bnRpbCBJIGZpZ3VyZSBvdXQKLQkJCSAqIHdoYXQgdGhlIGRpZmZlcmVuY2UgaXMuLi4KLQkJCSAqLwotCQkJd3JpdGVsKEFVWElPX1BDSU9fQ1BXUl9PRkYgfCBBVVhJT19QQ0lPX1NQV1JfT0ZGLCBwb3dlcl9yZWcpOwotCQl9IGVsc2UgewotCQkJaWYgKHBvd2Vyb2ZmX21ldGhvZCAhPSBOVUxMKSB7Ci0JCQkJcG93ZXJvZmZfbWV0aG9kKCk7Ci0JCQkJLyogbm90IHJlYWNoZWQgKi8KLQkJCX0KLQkJfQotCX0KLQltYWNoaW5lX2hhbHQoKTsKLX0KLQotdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKLUVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKLQogc3RhdGljIGludCBfX2luaXQgaGFzX2J1dHRvbl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKIAlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCkBAIC04NSw4ICs0Myw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbnRyb2wgcmVnIGF0ICVseFxuIiwKIAkgICAgICAgb3AtPm5vZGUtPm5hbWUsIHJlcy0+c3RhcnQpOwogCi0JcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KLQogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewogCQlpZiAocmVxdWVzdF9pcnEoaXJxLAogCQkJCXBvd2VyX2hhbmRsZXIsIDAsICJwb3dlciIsIE5VTEwpIDwgMCkKQEAgLTk2LDcgKzUyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcG93ZXJfbWF0Y2hbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgcG93ZXJfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gInBvd2VyIiwKIAl9LApAQCAtMTExLDggKzY3LDkgQEAKIAl9LAogfTsKIAotdm9pZCBfX2luaXQgcG93ZXJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcG93ZXJfaW5pdCh2b2lkKQogewotCW9mX3JlZ2lzdGVyX2RyaXZlcigmcG93ZXJfZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOwotCXJldHVybjsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZwb3dlcl9kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CiB9CisKK2RldmljZV9pbml0Y2FsbChwb3dlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMTVmNDE3OC4uZDVlMmFjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgpAQCAtMzEsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogCi0jaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTQ2LDggKzQ0LDYgQEAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KLSNpbmNsdWRlIDxhc20vc3N0YXRlLmg+Ci0jaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTExNSwzNSArMTExLDYgQEAKIAl9CiB9CiAKLXZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCi17Ci0Jc3N0YXRlX2hhbHQoKTsKLQlwcm9tX2hhbHQoKTsKLQlwYW5pYygiSGFsdCBmYWlsZWQhIik7Ci19Ci0KLXZvaWQgbWFjaGluZV9hbHRfcG93ZXJfb2ZmKHZvaWQpCi17Ci0Jc3N0YXRlX3Bvd2Vyb2ZmKCk7Ci0JcHJvbV9oYWx0X3Bvd2VyX29mZigpOwotCXBhbmljKCJQb3dlci1vZmYgZmFpbGVkISIpOwotfQotCi12b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogY21kKQotewotCWNoYXIgKnA7Ci0JCi0Jc3N0YXRlX3JlYm9vdCgpOwotCXAgPSBzdHJjaHIgKHJlYm9vdF9jb21tYW5kLCAnXG4nKTsKLQlpZiAocCkgKnAgPSAwOwotCWlmIChjbWQpCi0JCXByb21fcmVib290KGNtZCk7Ci0JaWYgKCpyZWJvb3RfY29tbWFuZCkKLQkJcHJvbV9yZWJvb3QocmVib290X2NvbW1hbmQpOwotCXByb21fcmVib290KCIiKTsKLQlwYW5pYygiUmVib290IGZhaWxlZCEiKTsKLX0KLQogI2lmZGVmIENPTkZJR19DT01QQVQKIHN0YXRpYyB2b2lkIHNob3dfcmVnd2luZG93MzIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0yNDgsNyArMjE1LDYgQEAKIAlnbG9iYWxfcmVnX3NuYXBzaG90W3RoaXNfY3B1XS5vNyA9IHJlZ3MtPnVfcmVnc1tVUkVHX0k3XTsKIAogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgewotCQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcnc7CiAKIAkJcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikKQEAgLTMwNCw3ICsyNzAsNiBAQAogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IGdsb2JhbF9yZWdfc25hcHNob3QgKmdwID0gJmdsb2JhbF9yZWdfc25hcHNob3RbY3B1XTsKLQkJc3RydWN0IHRocmVhZF9pbmZvICp0cDsKIAogCQlfX2dsb2JhbF9yZWdfcG9sbChncCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggM2MwNDhhYy4uZGJiYTgyZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTM4LDcgKzM4LDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCi0JZm9yIChucCA9IGFsbG5vZGVzOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KQorCWZvciAobnAgPSBhbGxub2RlczsgbnA7IG5wID0gbnAtPmFsbG5leHQpCiAJCWlmIChucC0+bm9kZSA9PSBoYW5kbGUpCiAJCQlicmVhazsKIApAQCAtNTksNiArNTksOSBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRpbnRwcm9wX2RlZmF1bHQpOwogCitERUZJTkVfTVVURVgob2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKK0VYUE9SVF9TWU1CT0wob2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKKwogaW50IG9mX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pCiB7CiAJc3RydWN0IHByb3BlcnR5ICoqcHJldnA7CkBAIC04Miw3ICs4NSwxMCBAQAogCQkJdm9pZCAqb2xkX3ZhbCA9IHByb3AtPnZhbHVlOwogCQkJaW50IHJldDsKIAorCQkJbXV0ZXhfbG9jaygmb2Zfc2V0X3Byb3BlcnR5X211dGV4KTsKIAkJCXJldCA9IHByb21fc2V0cHJvcChkcC0+bm9kZSwgbmFtZSwgdmFsLCBsZW4pOworCQkJbXV0ZXhfdW5sb2NrKCZvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOworCiAJCQllcnIgPSAtRUlOVkFMOwogCQkJaWYgKHJldCA+PSAwKSB7CiAJCQkJcHJvcC0+dmFsdWUgPSBuZXdfdmFsOwpAQCAtMTU2LDU1ICsxNjIsMTEgQEAKIAkJcmV0dXJuIFBTWUNIT19JTUFQX0JfU0xPVDAgKyAoc2xvdCAqIDgpOwogfQogCi0jZGVmaW5lIFBTWUNIT19JTUFQX1NDU0kJMHgxMDAwVUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfRVRICQkweDEwMDhVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9CUFAJCTB4MTAxMFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX0FVX1JFQwkweDEwMThVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9BVV9QTEFZCTB4MTAyMFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX1BGQUlMCTB4MTAyOFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX0tNUwkJMHgxMDMwVUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfRkxQWQkweDEwMzhVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9TSFcJCTB4MTA0MFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX0tCRAkJMHgxMDQ4VUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfTVMJCTB4MTA1MFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX1NFUgkJMHgxMDU4VUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfVElNMAkweDEwNjBVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9USU0xCTB4MTA2OFVMCi0jZGVmaW5lIFBTWUNIT19JTUFQX1VFCQkweDEwNzBVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9DRQkJMHgxMDc4VUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfQV9FUlIJMHgxMDgwVUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfQl9FUlIJMHgxMDg4VUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfUE1HTVQJMHgxMDkwVUwKLSNkZWZpbmUgUFNZQ0hPX0lNQVBfR0ZYCQkweDEwOThVTAotI2RlZmluZSBQU1lDSE9fSU1BUF9FVVBBCTB4MTBhMFVMCisjZGVmaW5lIFBTWUNIT19PQklPX0lNQVBfQkFTRQkweDEwMDBVTAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX3BzeWNob19vbmJvYXJkX2ltYXBfb2ZmW10gPSB7Ci0vKjB4MjAqLwlQU1lDSE9fSU1BUF9TQ1NJLAotLyoweDIxKi8JUFNZQ0hPX0lNQVBfRVRILAotLyoweDIyKi8JUFNZQ0hPX0lNQVBfQlBQLAotLyoweDIzKi8JUFNZQ0hPX0lNQVBfQVVfUkVDLAotLyoweDI0Ki8JUFNZQ0hPX0lNQVBfQVVfUExBWSwKLS8qMHgyNSovCVBTWUNIT19JTUFQX1BGQUlMLAotLyoweDI2Ki8JUFNZQ0hPX0lNQVBfS01TLAotLyoweDI3Ki8JUFNZQ0hPX0lNQVBfRkxQWSwKLS8qMHgyOCovCVBTWUNIT19JTUFQX1NIVywKLS8qMHgyOSovCVBTWUNIT19JTUFQX0tCRCwKLS8qMHgyYSovCVBTWUNIT19JTUFQX01TLAotLyoweDJiKi8JUFNZQ0hPX0lNQVBfU0VSLAotLyoweDJjKi8JUFNZQ0hPX0lNQVBfVElNMCwKLS8qMHgyZCovCVBTWUNIT19JTUFQX1RJTTEsCi0vKjB4MmUqLwlQU1lDSE9fSU1BUF9VRSwKLS8qMHgyZiovCVBTWUNIT19JTUFQX0NFLAotLyoweDMwKi8JUFNZQ0hPX0lNQVBfQV9FUlIsCi0vKjB4MzEqLwlQU1lDSE9fSU1BUF9CX0VSUiwKLS8qMHgzMiovCVBTWUNIT19JTUFQX1BNR01ULAotLyoweDMzKi8JUFNZQ0hPX0lNQVBfR0ZYLAotLyoweDM0Ki8JUFNZQ0hPX0lNQVBfRVVQQSwKLX07CiAjZGVmaW5lIFBTWUNIT19PTkJPQVJEX0lSUV9CQVNFCQkweDIwCi0jZGVmaW5lIFBTWUNIT19PTkJPQVJEX0lSUV9MQVNUCQkweDM0CiAjZGVmaW5lIHBzeWNob19vbmJvYXJkX2ltYXBfb2Zmc2V0KF9faW5vKSBcCi0JX19wc3ljaG9fb25ib2FyZF9pbWFwX29mZlsoX19pbm8pIC0gUFNZQ0hPX09OQk9BUkRfSVJRX0JBU0VdCisJKFBTWUNIT19PQklPX0lNQVBfQkFTRSArICgoKF9faW5vKSAmIDB4MWYpIDw8IDMpKQogCiAjZGVmaW5lIFBTWUNIT19JQ0xSX0FfU0xPVDAJMHgxNDAwVUwKICNkZWZpbmUgUFNZQ0hPX0lDTFJfU0NTSQkweDE4MDBVTApAQCAtMjI4LDEwICsxOTAsNiBAQAogCQlpbWFwX29mZiA9IHBzeWNob19wY2lzbG90X2ltYXBfb2Zmc2V0KGlubyk7CiAJfSBlbHNlIHsKIAkJLyogT25ib2FyZCBkZXZpY2UgKi8KLQkJaWYgKGlubyA+IFBTWUNIT19PTkJPQVJEX0lSUV9MQVNUKSB7Ci0JCQlwcm9tX3ByaW50ZigicHN5Y2hvX2lycV9idWlsZDogV2Fja3kgSU5PIFsleF1cbiIsIGlubyk7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQogCQlpbWFwX29mZiA9IHBzeWNob19vbmJvYXJkX2ltYXBfb2Zmc2V0KGlubyk7CiAJfQogCkBAIC0zMTgsMjMgKzI3Niw2IEBACiAKICNkZWZpbmUgU0FCUkVfSU1BUF9BX1NMT1QwCTB4MGMwMFVMCiAjZGVmaW5lIFNBQlJFX0lNQVBfQl9TTE9UMAkweDBjMjBVTAotI2RlZmluZSBTQUJSRV9JTUFQX1NDU0kJCTB4MTAwMFVMCi0jZGVmaW5lIFNBQlJFX0lNQVBfRVRICQkweDEwMDhVTAotI2RlZmluZSBTQUJSRV9JTUFQX0JQUAkJMHgxMDEwVUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9BVV9SRUMJMHgxMDE4VUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9BVV9QTEFZCTB4MTAyMFVMCi0jZGVmaW5lIFNBQlJFX0lNQVBfUEZBSUwJMHgxMDI4VUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9LTVMJCTB4MTAzMFVMCi0jZGVmaW5lIFNBQlJFX0lNQVBfRkxQWQkJMHgxMDM4VUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9TSFcJCTB4MTA0MFVMCi0jZGVmaW5lIFNBQlJFX0lNQVBfS0JECQkweDEwNDhVTAotI2RlZmluZSBTQUJSRV9JTUFQX01TCQkweDEwNTBVTAotI2RlZmluZSBTQUJSRV9JTUFQX1NFUgkJMHgxMDU4VUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9VRQkJMHgxMDcwVUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9DRQkJMHgxMDc4VUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9QQ0lFUlIJMHgxMDgwVUwKLSNkZWZpbmUgU0FCUkVfSU1BUF9HRlgJCTB4MTA5OFVMCi0jZGVmaW5lIFNBQlJFX0lNQVBfRVVQQQkJMHgxMGEwVUwKICNkZWZpbmUgU0FCUkVfSUNMUl9BX1NMT1QwCTB4MTQwMFVMCiAjZGVmaW5lIFNBQlJFX0lDTFJfQl9TTE9UMAkweDE0ODBVTAogI2RlZmluZSBTQUJSRV9JQ0xSX1NDU0kJCTB4MTgwMFVMCkBAIC0zNjQsMzMgKzMwNSwxMCBAQAogCQlyZXR1cm4gU0FCUkVfSU1BUF9CX1NMT1QwICsgKHNsb3QgKiA4KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19zYWJyZV9vbmJvYXJkX2ltYXBfb2ZmW10gPSB7Ci0vKjB4MjAqLwlTQUJSRV9JTUFQX1NDU0ksCi0vKjB4MjEqLwlTQUJSRV9JTUFQX0VUSCwKLS8qMHgyMiovCVNBQlJFX0lNQVBfQlBQLAotLyoweDIzKi8JU0FCUkVfSU1BUF9BVV9SRUMsCi0vKjB4MjQqLwlTQUJSRV9JTUFQX0FVX1BMQVksCi0vKjB4MjUqLwlTQUJSRV9JTUFQX1BGQUlMLAotLyoweDI2Ki8JU0FCUkVfSU1BUF9LTVMsCi0vKjB4MjcqLwlTQUJSRV9JTUFQX0ZMUFksCi0vKjB4MjgqLwlTQUJSRV9JTUFQX1NIVywKLS8qMHgyOSovCVNBQlJFX0lNQVBfS0JELAotLyoweDJhKi8JU0FCUkVfSU1BUF9NUywKLS8qMHgyYiovCVNBQlJFX0lNQVBfU0VSLAotLyoweDJjKi8JMCAvKiByZXNlcnZlZCAqLywKLS8qMHgyZCovCTAgLyogcmVzZXJ2ZWQgKi8sCi0vKjB4MmUqLwlTQUJSRV9JTUFQX1VFLAotLyoweDJmKi8JU0FCUkVfSU1BUF9DRSwKLS8qMHgzMCovCVNBQlJFX0lNQVBfUENJRVJSLAotLyoweDMxKi8JMCAvKiByZXNlcnZlZCAqLywKLS8qMHgzMiovCTAgLyogcmVzZXJ2ZWQgKi8sCi0vKjB4MzMqLwlTQUJSRV9JTUFQX0dGWCwKLS8qMHgzNCovCVNBQlJFX0lNQVBfRVVQQSwKLX07Ci0jZGVmaW5lIFNBQlJFX09OQk9BUkRfSVJRX0JBU0UJCTB4MjAKLSNkZWZpbmUgU0FCUkVfT05CT0FSRF9JUlFfTEFTVAkJMHgzMAorI2RlZmluZSBTQUJSRV9PQklPX0lNQVBfQkFTRQkweDEwMDBVTAorI2RlZmluZSBTQUJSRV9PTkJPQVJEX0lSUV9CQVNFCTB4MjAKICNkZWZpbmUgc2FicmVfb25ib2FyZF9pbWFwX29mZnNldChfX2lubykgXAotCV9fc2FicmVfb25ib2FyZF9pbWFwX29mZlsoX19pbm8pIC0gU0FCUkVfT05CT0FSRF9JUlFfQkFTRV0KKwkoU0FCUkVfT0JJT19JTUFQX0JBU0UgKyAoKChfX2lubykgJiAweDFmKSA8PCAzKSkKIAogI2RlZmluZSBzYWJyZV9pY2xyX29mZnNldChpbm8pCQkJCQkgICAgICBcCiAJKChpbm8gJiAweDIwKSA/IChTQUJSRV9JQ0xSX1NDU0kgKyAoKChpbm8pICYgMHgxZikgPDwgMykpIDogIFwKQEAgLTQ1MywxMCArMzcxLDYgQEAKIAkJaW1hcF9vZmYgPSBzYWJyZV9wY2lzbG90X2ltYXBfb2Zmc2V0KGlubyk7CiAJfSBlbHNlIHsKIAkJLyogb25ib2FyZCBkZXZpY2UgKi8KLQkJaWYgKGlubyA+IFNBQlJFX09OQk9BUkRfSVJRX0xBU1QpIHsKLQkJCXByb21fcHJpbnRmKCJzYWJyZV9pcnFfYnVpbGQ6IFdhY2t5IElOTyBbJXhdXG4iLCBpbm8pOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KIAkJaW1hcF9vZmYgPSBzYWJyZV9vbmJvYXJkX2ltYXBfb2Zmc2V0KGlubyk7CiAJfQogCkBAIC0xMDM3LDIyICs5NTEsMzAgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpX2lycV90cmFuc190YWJsZSk7IGkrKykgewogCQkJc3RydWN0IGlycV90cmFucyAqdCA9ICZwY2lfaXJxX3RyYW5zX3RhYmxlW2ldOwogCi0JCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpCi0JCQkJcmV0dXJuIHQtPmluaXQoZHApOworCQkJaWYgKCFzdHJjbXAobW9kZWwsIHQtPm5hbWUpKSB7CisJCQkJdC0+aW5pdChkcCk7CisJCQkJcmV0dXJuOworCQkJfQogCQl9CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKIAlpZiAoIXN0cmNtcChkcC0+bmFtZSwgInNidXMiKSB8fAotCSAgICAhc3RyY21wKGRwLT5uYW1lLCAic2JpIikpCi0JCXJldHVybiBzYnVzX2lycV90cmFuc19pbml0KGRwKTsKKwkgICAgIXN0cmNtcChkcC0+bmFtZSwgInNiaSIpKSB7CisJCXNidXNfaXJxX3RyYW5zX2luaXQoZHApOworCQlyZXR1cm47CisJfQogI2VuZGlmCiAJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJmaGMiKSAmJgotCSAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJjZW50cmFsIikpCi0JCXJldHVybiBjZW50cmFsX2lycV90cmFuc19pbml0KGRwKTsKKwkgICAgIXN0cmNtcChkcC0+cGFyZW50LT5uYW1lLCAiY2VudHJhbCIpKSB7CisJCWNlbnRyYWxfaXJxX3RyYW5zX2luaXQoZHApOworCQlyZXR1cm47CisJfQogCWlmICghc3RyY21wKGRwLT5uYW1lLCAidmlydHVhbC1kZXZpY2VzIikgfHwKLQkgICAgIXN0cmNtcChkcC0+bmFtZSwgIm5pdSIpKQotCQlyZXR1cm4gc3VuNHZfdmRldl9pcnFfdHJhbnNfaW5pdChkcCk7CisJICAgICFzdHJjbXAoZHAtPm5hbWUsICJuaXUiKSkgeworCQlzdW40dl92ZGV2X2lycV90cmFuc19pbml0KGRwKTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIGludCBpc19yb290X25vZGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkcCkKQEAgLTEzMjMsMzIgKzEyNDUsNDkgQEAKIAogCWlmIChwYXJlbnQgIT0gTlVMTCkgewogCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2kiKSB8fAotCQkgICAgIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2lleCIpKQotCQkJcmV0dXJuIHBjaV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Ci0JCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInNidXMiKSkKLQkJCXJldHVybiBzYnVzX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAidXBhIikpCi0JCQlyZXR1cm4gdXBhX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAiZWJ1cyIpKQotCQkJcmV0dXJuIGVidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkgICAgIXN0cmNtcChwYXJlbnQtPnR5cGUsICJwY2lleCIpKSB7CisJCQlwY2lfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInNidXMiKSkgeworCQkJc2J1c19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAidXBhIikpIHsKKwkJCXVwYV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAiZWJ1cyIpKSB7CisJCQllYnVzX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJCXJldHVybjsKKwkJfQogCQlpZiAoIXN0cmNtcChwYXJlbnQtPm5hbWUsICJ1c2IiKSB8fAotCQkgICAgIXN0cmNtcChwYXJlbnQtPm5hbWUsICJodWIiKSkKLQkJCXJldHVybiB1c2JfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJpMmMiKSkKLQkJCXJldHVybiBpMmNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOwotCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJmaXJld2lyZSIpKQotCQkJcmV0dXJuIGllZWUxMzk0X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAidmlydHVhbC1kZXZpY2VzIikpCi0JCQlyZXR1cm4gdmRldl9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Ci0KKwkJICAgICFzdHJjbXAocGFyZW50LT5uYW1lLCAiaHViIikpIHsKKwkJCXVzYl9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAiaTJjIikpIHsKKwkJCWkyY19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAiZmlyZXdpcmUiKSkgeworCQkJaWVlZTEzOTRfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInZpcnR1YWwtZGV2aWNlcyIpKSB7CisJCQl2ZGV2X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJCXJldHVybjsKKwkJfQogCQkvKiAiaXNhIiBpcyBoYW5kbGVkIHdpdGggcGxhdGZvcm0gbmFtaW5nICovCiAJfQogCiAJLyogVXNlIHBsYXRmb3JtIG5hbWluZyBjb252ZW50aW9uLiAgKi8KLQlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikKLQkJcmV0dXJuIHN1bjR2X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKLQllbHNlCi0JCXJldHVybiBzdW40dV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKKwkJc3VuNHZfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJc3VuNHVfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCX0KIH0KIAogc3RhdGljIGNoYXIgKiBfX2luaXQgYnVpbGRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwOTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCkBAIC0wLDAgKzEsNDcwIEBACisvKiBwc3ljaG9fY29tbW9uLmM6IENvZGUgY29tbW9uIHRvIFBTWUNITyBhbmQgZGVyaXZhdGl2ZSBQQ0kgY29udHJvbGxlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VwYS5oPgorCisjaW5jbHVkZSAicGNpX2ltcGwuaCIKKyNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKKyNpbmNsdWRlICJwc3ljaG9fY29tbW9uLmgiCisKKyNkZWZpbmUgIFBTWUNIT19TVFJCVUZfQ1RSTF9ERU5BQgkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0VSUl9XUklURQkJMHgwMDAwMDAwMDAwMDAwMDAyVUwKKyNkZWZpbmUgIFBTWUNIT19TVENFUlJfUkVBRAkJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKyNkZWZpbmUgIFBTWUNIT19TVENUQUdfUFBOCQkweDBmZmZmZmZmMDAwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19WUE4JCTB4MDAwMDAwMDBmZmZmZTAwMFVMCisjZGVmaW5lICBQU1lDSE9fU1RDVEFHX1ZBTElECQkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19XUklURQkJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKyNkZWZpbmUgIFBTWUNIT19TVENMSU5FX0xJTkRYCQkweDAwMDAwMDAwMDFlMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfU1BUUgkJMHgwMDAwMDAwMDAwMWY4MDAwVUwKKyNkZWZpbmUgIFBTWUNIT19TVENMSU5FX0xBRERSCQkweDAwMDAwMDAwMDAwMDdmMDBVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfRVBUUgkJMHgwMDAwMDAwMDAwMDAwMGZjVUwKKyNkZWZpbmUgIFBTWUNIT19TVENMSU5FX1ZBTElECQkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfRk9GTgkJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzdGNfYnVmX2xvY2spOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RjX2Vycm9yX2J1ZlsxMjhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RjX3RhZ19idWZbMTZdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RjX2xpbmVfYnVmWzE2XTsKKworc3RhdGljIHZvaWQgcHN5Y2hvX2NoZWNrX3N0Y19lcnJvcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCit7CisJdW5zaWduZWQgbG9uZyBlcnJfYmFzZSwgdGFnX2Jhc2UsIGxpbmVfYmFzZTsKKwlzdHJ1Y3Qgc3RyYnVmICpzdHJidWYgPSAmcGJtLT5zdGM7CisJdTY0IGNvbnRyb2w7CisJaW50IGk7CisKKwlpZiAoIXN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wpCisJCXJldHVybjsKKworCWVycl9iYXNlID0gc3RyYnVmLT5zdHJidWZfZXJyX3N0YXQ7CisJdGFnX2Jhc2UgPSBzdHJidWYtPnN0cmJ1Zl90YWdfZGlhZzsKKwlsaW5lX2Jhc2UgPSBzdHJidWYtPnN0cmJ1Zl9saW5lX2RpYWc7CisKKwlzcGluX2xvY2soJnN0Y19idWZfbG9jayk7CisKKwkvKiBUaGlzIGlzIF9fUkVBTExZX18gZGFuZ2Vyb3VzLiAgV2hlbiB3ZSBwdXQgdGhlIHN0cmVhbWluZworCSAqIGJ1ZmZlciBpbnRvIGRpYWdub3N0aWMgbW9kZSB0byBwcm9iZSBpdCdzIHRhZ3MgYW5kIGVycm9yCisJICogc3RhdHVzLCB3ZSBfbXVzdF8gY2xlYXIgYWxsIG9mIHRoZSBsaW5lIHRhZyB2YWxpZCBiaXRzCisJICogYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBzdHJlYW1pbmcgYnVmZmVyLiAgSWYgYW55IGRpcnR5IGRhdGEKKwkgKiBsaXZlcyBpbiB0aGUgU1RDIHdoZW4gd2UgZG8gdGhpcywgd2Ugd2lsbCBlbmQgdXAKKwkgKiBpbnZhbGlkYXRpbmcgaXQgYmVmb3JlIGl0IGhhcyBhIGNoYW5jZSB0byByZWFjaCBtYWluCisJICogbWVtb3J5LgorCSAqLworCWNvbnRyb2wgPSB1cGFfcmVhZHEoc3RyYnVmLT5zdHJidWZfY29udHJvbCk7CisJdXBhX3dyaXRlcShjb250cm9sIHwgUFNZQ0hPX1NUUkJVRl9DVFJMX0RFTkFCLCBzdHJidWYtPnN0cmJ1Zl9jb250cm9sKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJdTY0IHZhbDsKKworCQl2YWwgPSB1cGFfcmVhZHEoZXJyX2Jhc2UgKyAoaSAqIDhVTCkpOworCQl1cGFfd3JpdGVxKDBVTCwgZXJyX2Jhc2UgKyAoaSAqIDhVTCkpOworCQlzdGNfZXJyb3JfYnVmW2ldID0gdmFsOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlzdGNfdGFnX2J1ZltpXSA9IHVwYV9yZWFkcSh0YWdfYmFzZSArIChpICogOFVMKSk7CisJCXN0Y19saW5lX2J1ZltpXSA9IHVwYV9yZWFkcShsaW5lX2Jhc2UgKyAoaSAqIDhVTCkpOworCQl1cGFfd3JpdGVxKDBVTCwgdGFnX2Jhc2UgKyAoaSAqIDhVTCkpOworCQl1cGFfd3JpdGVxKDBVTCwgbGluZV9iYXNlICsgKGkgKiA4VUwpKTsKKwl9CisKKwkvKiBPSywgc3RhdGUgaXMgbG9nZ2VkLCBleGl0IGRpYWdub3N0aWMgbW9kZS4gKi8KKwl1cGFfd3JpdGVxKGNvbnRyb2wsIHN0cmJ1Zi0+c3RyYnVmX2NvbnRyb2wpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaW50IGosIHNhd19lcnJvciwgZmlyc3QsIGxhc3Q7CisKKwkJc2F3X2Vycm9yID0gMDsKKwkJZmlyc3QgPSBpICogODsKKwkJbGFzdCA9IGZpcnN0ICsgODsKKwkJZm9yIChqID0gZmlyc3Q7IGogPCBsYXN0OyBqKyspIHsKKwkJCXU2NCBlcnJ2YWwgPSBzdGNfZXJyb3JfYnVmW2pdOworCQkJaWYgKGVycnZhbCAhPSAwKSB7CisJCQkJc2F3X2Vycm9yKys7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU1RDX0VSUiglZClbd3IoJWQpIgorCQkJCSAgICAgICAicmQoJWQpXVxuIiwKKwkJCQkgICAgICAgcGJtLT5uYW1lLAorCQkJCSAgICAgICBqLAorCQkJCSAgICAgICAoZXJydmFsICYgUFNZQ0hPX1NUQ0VSUl9XUklURSkgPyAxIDogMCwKKwkJCQkgICAgICAgKGVycnZhbCAmIFBTWUNIT19TVENFUlJfUkVBRCkgPyAxIDogMCk7CisJCQl9CisJCX0KKwkJaWYgKHNhd19lcnJvciAhPSAwKSB7CisJCQl1NjQgdGFndmFsID0gc3RjX3RhZ19idWZbaV07CisJCQl1NjQgbGluZXZhbCA9IHN0Y19saW5lX2J1ZltpXTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19UQUcoJWQpW1BBKCUwMTZseClWQSglMDhseCkiCisJCQkgICAgICAgIlYoJWQpVyglZCldXG4iLAorCQkJICAgICAgIHBibS0+bmFtZSwKKwkJCSAgICAgICBpLAorCQkJICAgICAgICgodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19QUE4pID4+IDE5VUwpLAorCQkJICAgICAgICh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1ZQTiksCisJCQkgICAgICAgKCh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1ZBTElEKSA/IDEgOiAwKSwKKwkJCSAgICAgICAoKHRhZ3ZhbCAmIFBTWUNIT19TVENUQUdfV1JJVEUpID8gMSA6IDApKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19MSU5FKCVkKVtMSURYKCVseClTUCglbHgpIgorCQkJICAgICAgICJMQUREUiglbHgpRVAoJWx4KVYoJWQpRk9GTiglZCldXG4iLAorCQkJICAgICAgIHBibS0+bmFtZSwKKwkJCSAgICAgICBpLAorCQkJICAgICAgICgobGluZXZhbCAmIFBTWUNIT19TVENMSU5FX0xJTkRYKSA+PiAyMVVMKSwKKwkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9TUFRSKSA+PiAxNVVMKSwKKwkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9MQUREUikgPj4gOFVMKSwKKwkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9FUFRSKSA+PiAyVUwpLAorCQkJICAgICAgICgobGluZXZhbCAmIFBTWUNIT19TVENMSU5FX1ZBTElEKSA/IDEgOiAwKSwKKwkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9GT0ZOKSA/IDEgOiAwKSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmc3RjX2J1Zl9sb2NrKTsKK30KKworI2RlZmluZSBQU1lDSE9fSU9NTVVfVEFHCQkweGE1ODBVTAorI2RlZmluZSBQU1lDSE9fSU9NTVVfREFUQQkJMHhhNjAwVUwKKworc3RhdGljIHZvaWQgcHN5Y2hvX3JlY29yZF9pb21tdV90YWdzX2FuZF9kYXRhKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkJICAgICAgdTY0ICp0YWcsIHU2NCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZSA9IHBibS0+Y29udHJvbGxlcl9yZWdzOworCQl1bnNpZ25lZCBsb25nIG9mZiA9IGkgKiA4VUw7CisKKwkJdGFnW2ldID0gdXBhX3JlYWRxKGJhc2UgKyBQU1lDSE9fSU9NTVVfVEFHK29mZik7CisJCWRhdGFbaV0gPSB1cGFfcmVhZHEoYmFzZSArIFBTWUNIT19JT01NVV9EQVRBK29mZik7CisKKwkJLyogTm93IGNsZWFyIG91dCB0aGUgZW50cnkuICovCisJCXVwYV93cml0ZXEoMCwgYmFzZSArIFBTWUNIT19JT01NVV9UQUcgKyBvZmYpOworCQl1cGFfd3JpdGVxKDAsIGJhc2UgKyBQU1lDSE9fSU9NTVVfREFUQSArIG9mZik7CisJfQorfQorCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX0VSUlNUUyAoMHgzVUwgPDwgMjNVTCkKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfRVJSCSAoMHgxVUwgPDwgMjJVTCkKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfV1JJVEUJICgweDFVTCA8PCAyMVVMKQorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RBR19TVFJFQU0gKDB4MVVMIDw8IDIwVUwpCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX1NJWkUJICgweDFVTCA8PCAxOVVMKQorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RBR19WUEFHRQkgMHg3ZmZmZlVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfREFUQV9WQUxJRCAoMVVMIDw8IDMwVUwpCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfREFUQV9DQUNIRSAoMVVMIDw8IDI4VUwpCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfREFUQV9QUEFHRSAweGZmZmZmZmZVTAorCitzdGF0aWMgdm9pZCBwc3ljaG9fZHVtcF9pb21tdV90YWdzX2FuZF9kYXRhKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkJICAgIHU2NCAqdGFnLCB1NjQgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl1NjQgdGFnX3ZhbCwgZGF0YV92YWw7CisJCWNvbnN0IGNoYXIgKnR5cGVfc3RyOworCQl0YWdfdmFsID0gdGFnW2ldOworCQlpZiAoISh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19FUlIpKQorCQkJY29udGludWU7CisKKwkJZGF0YV92YWwgPSBkYXRhW2ldOworCQlzd2l0Y2goKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX0VSUlNUUykgPj4gMjNVTCkgeworCQljYXNlIDA6CisJCQl0eXBlX3N0ciA9ICJQcm90ZWN0aW9uIEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0eXBlX3N0ciA9ICJJbnZhbGlkIEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0eXBlX3N0ciA9ICJUaW1lT3V0IEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCWRlZmF1bHQ6CisJCQl0eXBlX3N0ciA9ICJFQ0MgRXJyb3IiOworCQkJYnJlYWs7CisJCX0KKworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT01NVSBUQUcoJWQpW2Vycm9yKCVzKSB3ciglZCkgIgorCQkgICAgICAgInN0ciglZCkgc3ooJWRLKSB2cGcoJTA4bHgpXVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwgaSwgdHlwZV9zdHIsCisJCSAgICAgICAoKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1dSSVRFKSA/IDEgOiAwKSwKKwkJICAgICAgICgodGFnX3ZhbCAmIFBTWUNIT19JT01NVV9UQUdfU1RSRUFNKSA/IDEgOiAwKSwKKwkJICAgICAgICgodGFnX3ZhbCAmIFBTWUNIT19JT01NVV9UQUdfU0laRSkgPyA2NCA6IDgpLAorCQkgICAgICAgKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1ZQQUdFKSA8PCBJT01NVV9QQUdFX1NISUZUKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSU9NTVUgREFUQSglZClbdmFsaWQoJWQpIGNhY2hlKCVkKSAiCisJCSAgICAgICAicHBnKCUwMTZseCldXG4iLAorCQkgICAgICAgcGJtLT5uYW1lLCBpLAorCQkgICAgICAgKChkYXRhX3ZhbCAmIFBTWUNIT19JT01NVV9EQVRBX1ZBTElEKSA/IDEgOiAwKSwKKwkJICAgICAgICgoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9DQUNIRSkgPyAxIDogMCksCisJCSAgICAgICAoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9QUEFHRSk8PElPTU1VX1BBR0VfU0hJRlQpOworCX0KK30KKworI2RlZmluZSAgUFNZQ0hPX0lPTU1VX0NUUkxfWExURVNUQVQJMHgwMDAwMDAwMDA2MDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9DVFJMX1hMVEVFUlIJMHgwMDAwMDAwMDAxMDAwMDAwVUwKKwordm9pZCBwc3ljaG9fY2hlY2tfaW9tbXVfZXJyb3Ioc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZnNyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZmFyLAorCQkJICAgICAgZW51bSBwc3ljaG9fZXJyb3JfdHlwZSB0eXBlKQoreworCXU2NCBjb250cm9sLCBpb21tdV90YWdbMTZdLCBpb21tdV9kYXRhWzE2XTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGJtLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJY29udHJvbCA9IHVwYV9yZWFkcShpb21tdS0+aW9tbXVfY29udHJvbCk7CisJaWYgKGNvbnRyb2wgJiBQU1lDSE9fSU9NTVVfQ1RSTF9YTFRFRVJSKSB7CisJCWNvbnN0IGNoYXIgKnR5cGVfc3RyOworCisJCWNvbnRyb2wgJj0gflBTWUNIT19JT01NVV9DVFJMX1hMVEVFUlI7CisJCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPmlvbW11X2NvbnRyb2wpOworCisJCXN3aXRjaCAoKGNvbnRyb2wgJiBQU1lDSE9fSU9NTVVfQ1RSTF9YTFRFU1RBVCkgPj4gMjVVTCkgeworCQljYXNlIDA6CisJCQl0eXBlX3N0ciA9ICJQcm90ZWN0aW9uIEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0eXBlX3N0ciA9ICJJbnZhbGlkIEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0eXBlX3N0ciA9ICJUaW1lT3V0IEVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCWRlZmF1bHQ6CisJCQl0eXBlX3N0ciA9ICJFQ0MgRXJyb3IiOworCQkJYnJlYWs7CisJCX07CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIEVycm9yLCB0eXBlWyVzXVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwgdHlwZV9zdHIpOworCisJCS8qIEl0IGlzIHZlcnkgcG9zc2libGUgZm9yIGFub3RoZXIgRFZNQSB0byBvY2N1ciB3aGlsZQorCQkgKiB3ZSBkbyB0aGlzIHByb2JlLCBhbmQgY29ycnVwdCB0aGUgc3lzdGVtIGZ1cnRoZXIuCisJCSAqIEJ1dCB3ZSBhcmUgc28gc2NyZXdlZCBhdCB0aGlzIHBvaW50IHRoYXQgd2UgYXJlCisJCSAqIGxpa2VseSB0byBjcmFzaCBoYXJkIGFueXdheXMsIHNvIGdldCBhcyBtdWNoCisJCSAqIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUgYXMgd2UgY2FuLgorCQkgKi8KKwkJcHN5Y2hvX3JlY29yZF9pb21tdV90YWdzX2FuZF9kYXRhKHBibSwgaW9tbXVfdGFnLCBpb21tdV9kYXRhKTsKKwkJcHN5Y2hvX2R1bXBfaW9tbXVfdGFnc19hbmRfZGF0YShwYm0sIGlvbW11X3RhZywgaW9tbXVfZGF0YSk7CisJfQorCXBzeWNob19jaGVja19zdGNfZXJyb3IocGJtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lICBQU1lDSE9fUENJQ1RSTF9TQkhfRVJSCSAweDAwMDAwMDA4MDAwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUNUUkxfU0VSUgkgMHgwMDAwMDAwNDAwMDAwMDAwVUwKKworc3RhdGljIGlycXJldHVybl90IHBzeWNob19wY2llcnJfaW50cl9vdGhlcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCit7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdTY0IGNzciwgY3NyX2Vycm9yX2JpdHM7CisJdTE2IHN0YXQsICphZGRyOworCisJY3NyID0gdXBhX3JlYWRxKHBibS0+cGNpX2Nzcik7CisJY3NyX2Vycm9yX2JpdHMgPSBjc3IgJiAoUFNZQ0hPX1BDSUNUUkxfU0JIX0VSUiB8IFBTWUNIT19QQ0lDVFJMX1NFUlIpOworCWlmIChjc3JfZXJyb3JfYml0cykgeworCQkvKiBDbGVhciB0aGUgZXJyb3JzLiAgKi8KKwkJdXBhX3dyaXRlcShjc3IsIHBibS0+cGNpX2Nzcik7CisKKwkJLyogTG9nICdlbS4gICovCisJCWlmIChjc3JfZXJyb3JfYml0cyAmIFBTWUNIT19QQ0lDVFJMX1NCSF9FUlIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgc3RyZWFtaW5nIGJ5dGUgaG9sZSAiCisJCQkgICAgICAgImVycm9yIGFzc2VydGVkLlxuIiwgcGJtLT5uYW1lKTsKKwkJaWYgKGNzcl9lcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUNUUkxfU0VSUikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBTRVJSIHNpZ25hbCBhc3NlcnRlZC5cbiIsCisJCQkgICAgICAgcGJtLT5uYW1lKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCWFkZHIgPSBwc3ljaG9fcGNpX2NvbmZpZ19ta2FkZHIocGJtLCBwYm0tPnBjaV9maXJzdF9idXNubywKKwkJCQkJMCwgUENJX1NUQVRVUyk7CisJcGNpX2NvbmZpZ19yZWFkMTYoYWRkciwgJnN0YXQpOworCWlmIChzdGF0ICYgKFBDSV9TVEFUVVNfUEFSSVRZIHwKKwkJICAgIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCB8CisJCSAgICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfAorCQkgICAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwKKwkJICAgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGJ1cyBlcnJvciwgUENJX1NUQVRVU1slMDR4XVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwgc3RhdCk7CisJCXBjaV9jb25maWdfd3JpdGUxNihhZGRyLCAweGZmZmYpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUE1BCTB4ODAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9QVEEJMHg0MDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1BSVFJZCTB4MjAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9QUEVSUgkweDEwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfU01BCTB4MDgwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9TVEEJMHgwNDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NSVFJZCTB4MDIwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9TUEVSUgkweDAxMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUkVTVjEJMHgwMGZmMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX0JNU0sJMHgwMDAwZmZmZjAwMDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX0JMSwkweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUkVTVjIJMHgwMDAwMDAwMDQwMDAwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX01JRAkweDAwMDAwMDAwM2UwMDAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUkVTVjMJMHgwMDAwMDAwMDAxZmZmZmZmVUwKKworaXJxcmV0dXJuX3QgcHN5Y2hvX3BjaWVycl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBkZXZfaWQ7CisJdTY0IGFmc3IsIGFmYXIsIGVycm9yX2JpdHM7CisJaW50IHJlcG9ydGVkOworCisJYWZzciA9IHVwYV9yZWFkcShwYm0tPnBjaV9hZnNyKTsKKwlhZmFyID0gdXBhX3JlYWRxKHBibS0+cGNpX2FmYXIpOworCWVycm9yX2JpdHMgPSBhZnNyICYKKwkJKFBTWUNIT19QQ0lBRlNSX1BNQSB8IFBTWUNIT19QQ0lBRlNSX1BUQSB8CisJCSBQU1lDSE9fUENJQUZTUl9QUlRSWSB8IFBTWUNIT19QQ0lBRlNSX1BQRVJSIHwKKwkJIFBTWUNIT19QQ0lBRlNSX1NNQSB8IFBTWUNIT19QQ0lBRlNSX1NUQSB8CisJCSBQU1lDSE9fUENJQUZTUl9TUlRSWSB8IFBTWUNIT19QQ0lBRlNSX1NQRVJSKTsKKwlpZiAoIWVycm9yX2JpdHMpCisJCXJldHVybiBwc3ljaG9fcGNpZXJyX2ludHJfb3RoZXIocGJtKTsKKwl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIHBibS0+cGNpX2Fmc3IpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBFcnJvciwgcHJpbWFyeSBlcnJvciB0eXBlWyVzXVxuIiwKKwkgICAgICAgcGJtLT5uYW1lLAorCSAgICAgICAoKChlcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUFGU1JfUE1BKSA/CisJCSAiTWFzdGVyIEFib3J0IiA6CisJCSAoKGVycm9yX2JpdHMgJiBQU1lDSE9fUENJQUZTUl9QVEEpID8KKwkJICAiVGFyZ2V0IEFib3J0IiA6CisJCSAgKChlcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUFGU1JfUFJUUlkpID8KKwkJICAgIkV4Y2Vzc2l2ZSBSZXRyaWVzIiA6CisJCSAgICgoZXJyb3JfYml0cyAmIFBTWUNIT19QQ0lBRlNSX1BQRVJSKSA/CisJCSAgICAiUGFyaXR5IEVycm9yIiA6ICI/Pz8iKSkpKSkpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ5dGVtYXNrWyUwNGx4XSBVUEFfTUlEWyUwMmx4XSB3YXNfYmxvY2soJWQpXG4iLAorCSAgICAgICBwYm0tPm5hbWUsCisJICAgICAgIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfQk1TSykgPj4gMzJVTCwKKwkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9NSUQpID4+IDI1VUwsCisJICAgICAgIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfQkxLKSA/IDEgOiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgQUZBUiBbJTAxNmx4XVxuIiwgcGJtLT5uYW1lLCBhZmFyKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgU2Vjb25kYXJ5IGVycm9ycyBbIiwgcGJtLT5uYW1lKTsKKwlyZXBvcnRlZCA9IDA7CisJaWYgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9TTUEpIHsKKwkJcmVwb3J0ZWQrKzsKKwkJcHJpbnRrKCIoTWFzdGVyIEFib3J0KSIpOworCX0KKwlpZiAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX1NUQSkgeworCQlyZXBvcnRlZCsrOworCQlwcmludGsoIihUYXJnZXQgQWJvcnQpIik7CisJfQorCWlmIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfU1JUUlkpIHsKKwkJcmVwb3J0ZWQrKzsKKwkJcHJpbnRrKCIoRXhjZXNzaXZlIFJldHJpZXMpIik7CisJfQorCWlmIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfU1BFUlIpIHsKKwkJcmVwb3J0ZWQrKzsKKwkJcHJpbnRrKCIoUGFyaXR5IEVycm9yKSIpOworCX0KKwlpZiAoIXJlcG9ydGVkKQorCQlwcmludGsoIihub25lKSIpOworCXByaW50aygiXVxuIik7CisKKwlpZiAoZXJyb3JfYml0cyAmIChQU1lDSE9fUENJQUZTUl9QVEEgfCBQU1lDSE9fUENJQUZTUl9TVEEpKSB7CisJCXBzeWNob19jaGVja19pb21tdV9lcnJvcihwYm0sIGFmc3IsIGFmYXIsIFBDSV9FUlIpOworCQlwY2lfc2Nhbl9mb3JfdGFyZ2V0X2Fib3J0KHBibSwgcGJtLT5wY2lfYnVzKTsKKwl9CisJaWYgKGVycm9yX2JpdHMgJiAoUFNZQ0hPX1BDSUFGU1JfUE1BIHwgUFNZQ0hPX1BDSUFGU1JfU01BKSkKKwkJcGNpX3NjYW5fZm9yX21hc3Rlcl9hYm9ydChwYm0sIHBibS0+cGNpX2J1cyk7CisKKwlpZiAoZXJyb3JfYml0cyAmIChQU1lDSE9fUENJQUZTUl9QUEVSUiB8IFBTWUNIT19QQ0lBRlNSX1NQRVJSKSkKKwkJcGNpX3NjYW5fZm9yX3Bhcml0eV9lcnJvcihwYm0sIHBibS0+cGNpX2J1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHBzeWNob19pb21tdV9mbHVzaChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIG9mZiA9IGkgKiA4OworCisJCXVwYV93cml0ZXEoMCwgcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfVEFHICsgb2ZmKTsKKwkJdXBhX3dyaXRlcSgwLCBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9EQVRBICsgb2ZmKTsKKwl9Cit9CisKKyNkZWZpbmUgUFNZQ0hPX0lPTU1VX0NPTlRST0wJCTB4MDIwMFVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfQ1RSTF9UU0JTWgkweDAwMDAwMDAwMDAwNzAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RTQlNaXzFLICAgICAgCTB4MDAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfVFNCU1pfMksgICAgICAJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9UU0JTWl80SyAgICAgIAkweDAwMDAwMDAwMDAwMjAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RTQlNaXzhLICAgICAgCTB4MDAwMDAwMDAwMDAzMDAwMFVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfVFNCU1pfMTZLICAgICAJMHgwMDAwMDAwMDAwMDQwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9UU0JTWl8zMksgICAgIAkweDAwMDAwMDAwMDAwNTAwMDBVTAorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RTQlNaXzY0SyAgICAgCTB4MDAwMDAwMDAwMDA2MDAwMFVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfVFNCU1pfMTI4SyAgICAJMHgwMDAwMDAwMDAwMDcwMDAwVUwKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9DVFJMX1RCV1NaICAgIAkweDAwMDAwMDAwMDAwMDAwMDRVTAorI2RlZmluZSAgUFNZQ0hPX0lPTU1VX0NUUkxfREVOQUIgICAgCTB4MDAwMDAwMDAwMDAwMDAwMlVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfQ1RSTF9FTkFCICAgICAJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKyNkZWZpbmUgUFNZQ0hPX0lPTU1VX0ZMVVNICQkweDAyMTBVTAorI2RlZmluZSBQU1lDSE9fSU9NTVVfVFNCQkFTRQkJMHgwMjA4VUwKKworaW50IHBzeWNob19pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwgaW50IHRzYnNpemUsCisJCSAgICAgIHUzMiBkdm1hX29mZnNldCwgdTMyIGRtYV9tYXNrLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2NvbXBsZXRlX29mZnNldCkKK3sKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGJtLT5pb21tdTsKKwl1NjQgY29udHJvbDsKKwlpbnQgZXJyOworCisJaW9tbXUtPmlvbW11X2NvbnRyb2wgID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfQ09OVFJPTDsKKwlpb21tdS0+aW9tbXVfdHNiYmFzZSAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9UU0JCQVNFOworCWlvbW11LT5pb21tdV9mbHVzaCAgICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPTU1VX0ZMVVNIOworCWlvbW11LT5pb21tdV90YWdzICAgICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPTU1VX1RBRzsKKwlpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnID0gKHBibS0+Y29udHJvbGxlcl9yZWdzICsKKwkJCQkgICAgIHdyaXRlX2NvbXBsZXRlX29mZnNldCk7CisKKwlpb21tdS0+aW9tbXVfY3R4Zmx1c2ggPSAwOworCisJY29udHJvbCA9IHVwYV9yZWFkcShpb21tdS0+aW9tbXVfY29udHJvbCk7CisJY29udHJvbCB8PSBQU1lDSE9fSU9NTVVfQ1RSTF9ERU5BQjsKKwl1cGFfd3JpdGVxKGNvbnRyb2wsIGlvbW11LT5pb21tdV9jb250cm9sKTsKKworCXBzeWNob19pb21tdV9mbHVzaChwYm0pOworCisJLyogTGVhdmUgZGlhZyBtb2RlIGVuYWJsZWQgZm9yIGZ1bGwtZmx1c2hpbmcgZG9uZSBpbiBwY2lfaW9tbXUuYyAqLworCWVyciA9IGlvbW11X3RhYmxlX2luaXQoaW9tbXUsIHRzYnNpemUgKiAxMDI0ICogOCwKKwkJCSAgICAgICBkdm1hX29mZnNldCwgZG1hX21hc2ssIHBibS0+bnVtYV9ub2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdXBhX3dyaXRlcShfX3BhKGlvbW11LT5wYWdlX3RhYmxlKSwgaW9tbXUtPmlvbW11X3RzYmJhc2UpOworCisJY29udHJvbCA9IHVwYV9yZWFkcShpb21tdS0+aW9tbXVfY29udHJvbCk7CisJY29udHJvbCAmPSB+KFBTWUNIT19JT01NVV9DVFJMX1RTQlNaIHwgUFNZQ0hPX0lPTU1VX0NUUkxfVEJXU1opOworCWNvbnRyb2wgfD0gUFNZQ0hPX0lPTU1VX0NUUkxfRU5BQjsKKworCXN3aXRjaCAodHNic2l6ZSkgeworCWNhc2UgNjQ6CisJCWNvbnRyb2wgfD0gUFNZQ0hPX0lPTU1VX1RTQlNaXzY0SzsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CisJCWNvbnRyb2wgfD0gUFNZQ0hPX0lPTU1VX1RTQlNaXzEyOEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPmlvbW11X2NvbnRyb2wpOworCisJcmV0dXJuIDA7CisKK30KKwordm9pZCBwc3ljaG9fcGJtX2luaXRfY29tbW9uKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwgc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkgICAgY29uc3QgY2hhciAqY2hpcF9uYW1lLCBpbnQgY2hpcF90eXBlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKKworCXBibS0+bmFtZSA9IGRwLT5mdWxsX25hbWU7CisJcGJtLT5udW1hX25vZGUgPSAtMTsKKwlwYm0tPmNoaXBfdHlwZSA9IGNoaXBfdHlwZTsKKwlwYm0tPmNoaXBfdmVyc2lvbiA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInZlcnNpb24jIiwgMCk7CisJcGJtLT5jaGlwX3JldmlzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibW9kdWxlLXJldmlzaW9uIyIsIDApOworCXBibS0+b3AgPSBvcDsKKwlwYm0tPnBjaV9vcHMgPSAmc3VuNHVfcGNpX29wczsKKwlwYm0tPmNvbmZpZ19zcGFjZV9yZWdfYml0cyA9IDg7CisJcGJtLT5pbmRleCA9IHBjaV9udW1fcGJtcysrOworCXBjaV9nZXRfcGJtX3Byb3BzKHBibSk7CisJcGNpX2RldGVybWluZV9tZW1faW9fc3BhY2UocGJtKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQQ0kgQnVzIE1vZHVsZSB2ZXJbJXg6JXhdXG4iLAorCSAgICAgICBwYm0tPm5hbWUsIGNoaXBfbmFtZSwKKwkgICAgICAgcGJtLT5jaGlwX3ZlcnNpb24sIHBibS0+Y2hpcF9yZXZpc2lvbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BzeWNob19jb21tb24uaCBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MmMyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BzeWNob19jb21tb24uaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIF9QU1lDSE9fQ09NTU9OX0gKKyNkZWZpbmUgX1BTWUNIT19DT01NT05fSAorCisvKiBVMlAgUHJvZ3JhbW1lcidzIE1hbnVhbCwgcGFnZSAxMy01NSwgY29uZmlndXJhdGlvbiBzcGFjZQorICogYWRkcmVzcyBmb3JtYXQ6CisgKiAKKyAqICAzMiAgICAgICAgICAgICAyNCAyMyAxNiAxNSAgICAxMSAxMCAgICAgICA4IDcgICAyICAxIDAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfDAgMCAwIDAgMCAwIDAgMCAxfCBidXMgfCBkZXZpY2UgfCBmdW5jdGlvbiB8IHJlZyB8IDAgMCB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBQU1lDSE9fQ09ORklHX0JBU0UoUEJNKQlcCisJKChQQk0pLT5jb25maWdfc3BhY2UgfCAoMVVMIDw8IDI0KSkKKyNkZWZpbmUgUFNZQ0hPX0NPTkZJR19FTkNPREUoQlVTLCBERVZGTiwgUkVHKQlcCisJKCgodW5zaWduZWQgbG9uZykoQlVTKSAgIDw8IDE2KSB8CVwKKwkgKCh1bnNpZ25lZCBsb25nKShERVZGTikgPDwgOCkgIHwJXAorCSAoKHVuc2lnbmVkIGxvbmcpKFJFRykpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnBzeWNob19wY2lfY29uZmlnX21rYWRkcihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciBidXMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCQkgICAgIGludCB3aGVyZSkKK3sKKwlyZXR1cm4gKHZvaWQgKikKKwkJKFBTWUNIT19DT05GSUdfQkFTRShwYm0pIHwKKwkJIFBTWUNIT19DT05GSUdfRU5DT0RFKGJ1cywgZGV2Zm4sIHdoZXJlKSk7Cit9CisKK2VudW0gcHN5Y2hvX2Vycm9yX3R5cGUgeworCVVFX0VSUiwgQ0VfRVJSLCBQQ0lfRVJSCit9OworCitleHRlcm4gdm9pZCBwc3ljaG9fY2hlY2tfaW9tbXVfZXJyb3Ioc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZnNyLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZmFyLAorCQkJCSAgICAgZW51bSBwc3ljaG9fZXJyb3JfdHlwZSB0eXBlKTsKKworZXh0ZXJuIGlycXJldHVybl90IHBzeWNob19wY2llcnJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCitleHRlcm4gaW50IHBzeWNob19pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwgaW50IHRzYnNpemUsCisJCQkgICAgIHUzMiBkdm1hX29mZnNldCwgdTMyIGRtYV9tYXNrLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2NvbXBsZXRlX29mZnNldCk7CisKK2V4dGVybiB2b2lkIHBzeWNob19wYm1faW5pdF9jb21tb24oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgIHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCSAgIGNvbnN0IGNoYXIgKmNoaXBfbmFtZSwgaW50IGNoaXBfdHlwZSk7CisKKyNlbmRpZiAvKiBfUFNZQ0hPX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCBiZDU3OGNjLi5mNDNhZGJjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCSAqLwogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLAotCQkubiA9IDM2ICogc2l6ZW9mKHU2NCksCisJCS5uID0gMzYsCiAJCS5zaXplID0gc2l6ZW9mKHU2NCksIC5hbGlnbiA9IHNpemVvZih1NjQpLAogCQkuZ2V0ID0gZ2VucmVnczY0X2dldCwgLnNldCA9IGdlbnJlZ3M2NF9zZXQKIAl9LApAQCAtNDU1LDcgKzQ1NSw3IEBACiAJICovCiAJW1JFR1NFVF9GUF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSRlBSRUcsCi0JCS5uID0gMzUgKiBzaXplb2YodTY0KSwKKwkJLm4gPSAzNSwKIAkJLnNpemUgPSBzaXplb2YodTY0KSwgLmFsaWduID0gc2l6ZW9mKHU2NCksCiAJCS5nZXQgPSBmcHJlZ3M2NF9nZXQsIC5zZXQgPSBmcHJlZ3M2NF9zZXQKIAl9LApAQCAtODAxLDcgKzgwMSw3IEBACiAJICovCiAJW1JFR1NFVF9HRU5FUkFMXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCi0JCS5uID0gMzggKiBzaXplb2YodTMyKSwKKwkJLm4gPSAzOCwKIAkJLnNpemUgPSBzaXplb2YodTMyKSwgLmFsaWduID0gc2l6ZW9mKHUzMiksCiAJCS5nZXQgPSBnZW5yZWdzMzJfZ2V0LCAuc2V0ID0gZ2VucmVnczMyX3NldAogCX0sCkBAIC04MTcsNyArODE3LDcgQEAKIAkgKi8KIAlbUkVHU0VUX0ZQXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJGUFJFRywKLQkJLm4gPSA5OSAqIHNpemVvZih1MzIpLAorCQkubiA9IDk5LAogCQkuc2l6ZSA9IHNpemVvZih1MzIpLCAuYWxpZ24gPSBzaXplb2YodTMyKSwKIAkJLmdldCA9IGZwcmVnczMyX2dldCwgLnNldCA9IGZwcmVnczMyX3NldAogCX0sCkBAIC0xMDUwLDMxICsxMDUwLDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBpbnQgc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHN5c2NhbGxfZXhpdF9wKQorYXNtbGlua2FnZSBpbnQgc3lzY2FsbF90cmFjZV9lbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIGRvIHRoZSBzZWN1cmUgY29tcHV0aW5nIGNoZWNrIGZpcnN0ICovCiAJc2VjdXJlX2NvbXB1dGluZyhyZWdzLT51X3JlZ3NbVVJFR19HMV0pOwogCi0JaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpICYmIHN5c2NhbGxfZXhpdF9wKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdHN0YXRlID0gcmVncy0+dHN0YXRlOwotCQlpbnQgcmVzdWx0ID0gQVVESVRTQ19TVUNDRVNTOworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJcmV0ID0gdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KHJlZ3MpOwogCi0JCWlmICh1bmxpa2VseSh0c3RhdGUgJiAoVFNUQVRFX1hDQVJSWSB8IFRTVEFURV9JQ0FSUlkpKSkKLQkJCXJlc3VsdCA9IEFVRElUU0NfRkFJTFVSRTsKLQotCQlhdWRpdF9zeXNjYWxsX2V4aXQocmVzdWx0LCByZWdzLT51X3JlZ3NbVVJFR19JMF0pOwotCX0KLQotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkgewotCQlpZiAoc3lzY2FsbF9leGl0X3ApCi0JCQl0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdChyZWdzLCAwKTsKLQkJZWxzZQotCQkJcmV0ID0gdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KHJlZ3MpOwotCX0KLQotCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiAhc3lzY2FsbF9leGl0X3AgJiYgIXJldCkKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkgJiYgIXJldCkKIAkJYXVkaXRfc3lzY2FsbF9lbnRyeSgodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpID8KIAkJCQkgICAgIEFVRElUX0FSQ0hfU1BBUkMgOgogCQkJCSAgICAgQVVESVRfQVJDSF9TUEFSQzY0KSwKQEAgLTEwODYsMyArMTA3MiwxOSBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKSB7CisJCXVuc2lnbmVkIGxvbmcgdHN0YXRlID0gcmVncy0+dHN0YXRlOworCQlpbnQgcmVzdWx0ID0gQVVESVRTQ19TVUNDRVNTOworCisJCWlmICh1bmxpa2VseSh0c3RhdGUgJiAoVFNUQVRFX1hDQVJSWSB8IFRTVEFURV9JQ0FSUlkpKSkKKwkJCXJlc3VsdCA9IEFVRElUU0NfRkFJTFVSRTsKKworCQlhdWRpdF9zeXNjYWxsX2V4aXQocmVzdWx0LCByZWdzLT51X3JlZ3NbVVJFR19JMF0pOworCX0KKworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQocmVncywgMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3JlYm9vdC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg5ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9yZWJvb3QuYwpAQCAtMCwwICsxLDUzIEBACisvKiByZWJvb3QuYzogcmVib290L3NodXRkb3duL2hhbHQvcG93ZXJvZmYgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisvKiBzeXNjdGwgLSB0b2dnbGUgcG93ZXItb2ZmIHJlc3RyaWN0aW9uIGZvciBzZXJpYWwgY29uc29sZQorICogc3lzdGVtcyBpbiBtYWNoaW5lX3Bvd2VyX29mZigpCisgKi8KK2ludCBzY29uc19wd3JvZmYgPSAxOworCisvKiBUaGlzIGlzbid0IGFjdHVhbGx5IHVzZWQsIGl0IGV4aXN0cyBtZXJlbHkgdG8gc2F0aXNmeSB0aGUKKyAqIHJlZmVyZW5jZSBpbiBrZXJuZWwvc3lzLmMKKyAqLwordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKK0VYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKKwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworCWlmIChzdHJjbXAob2ZfY29uc29sZV9kZXZpY2UtPnR5cGUsICJzZXJpYWwiKSB8fCBzY29uc19wd3JvZmYpCisJCXByb21faGFsdF9wb3dlcl9vZmYoKTsKKworCXByb21faGFsdCgpOworfQorCit2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQoreworCXByb21faGFsdCgpOworCXBhbmljKCJIYWx0IGZhaWxlZCEiKTsKK30KKwordm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqY21kKQoreworCWNoYXIgKnA7CisKKwlwID0gc3RyY2hyKHJlYm9vdF9jb21tYW5kLCAnXG4nKTsKKwlpZiAocCkKKwkJKnAgPSAwOworCWlmIChjbWQpCisJCXByb21fcmVib290KGNtZCk7CisJaWYgKCpyZWJvb3RfY29tbWFuZCkKKwkJcHJvbV9yZWJvb3QocmVib290X2NvbW1hbmQpOworCXByb21fcmVib290KCIiKTsKKwlwYW5pYygiUmVib290IGZhaWxlZCEiKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zYnVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYwppbmRleCBlMzNhOGE2Li4yZWFkMzEwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYwpAQCAtMTEsMTUgKzExLDE3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91cGEuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3N0YXJmaXJlLmg+CiAKICNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKQEAgLTUyLDEzICs1NCwyMyBAQAogI2RlZmluZSBTVFJCVUZfVEFHX1ZBTElECTB4MDJVTAogCiAvKiBFbmFibGUgNjQtYml0IERWTUEgbW9kZSBmb3IgdGhlIGdpdmVuIGRldmljZS4gKi8KLXZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IGJ1cnN0cykKK3ZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGJ1cnN0cykKIHsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gc2Rldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwotCWludCBzbG90ID0gc2Rldi0+c2xvdDsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHRvX29mX2RldmljZShkZXYpOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAl1bnNpZ25lZCBsb25nIGNmZ19yZWc7CisJaW50IHNsb3Q7CiAJdTY0IHZhbDsKIAorCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYnVzX3NldF9zYnVzNjQ6IENhbm5vdCBmaW5kIHJlZ3MgZm9yICVzXG4iLAorCQkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJc2xvdCA9IHJlZ3MtPndoaWNoX2lvOworCiAJY2ZnX3JlZyA9IGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWc7CiAJc3dpdGNoIChzbG90KSB7CiAJY2FzZSAwOgpAQCAtMTkxLDEwICsyMDMsOSBAQAogCXJldHVybiBpbWFwICsgZGlmZjsKIH0KIAotdW5zaWduZWQgaW50IHNidXNfYnVpbGRfaXJxKHZvaWQgKmJ1c2Nvb2tpZSwgdW5zaWduZWQgaW50IGlubykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEoc3RydWN0IG9mX2RldmljZSAqb3AsIHVuc2lnbmVkIGludCBpbm8pCiB7Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzID0gKHN0cnVjdCBzYnVzX2J1cyAqKWJ1c2Nvb2tpZTsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBvcC0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwogCWludCBzYnVzX2xldmVsID0gMDsKQEAgLTI1NSwxMiArMjY2LDEyIEBACiAjZGVmaW5lICBTWVNJT19VRUFGU1JfUkVTVjIgMHgwMDAwMDAxZmZmZmZmZmZmVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLwogc3RhdGljIGlycXJldHVybl90IHN5c2lvX3VlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IGRldl9pZDsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZGV2X2lkOworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBvcC0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwotCWludCByZXBvcnRlZDsKKwlpbnQgcmVwb3J0ZWQsIHBvcnRpZDsKIAogCWFmc3JfcmVnID0gcmVnX2Jhc2UgKyBTWVNJT19VRV9BRlNSOwogCWFmYXJfcmVnID0gcmVnX2Jhc2UgKyBTWVNJT19VRV9BRkFSOwpAQCAtMjc1LDkgKzI4NiwxMSBAQAogCQkgU1lTSU9fVUVBRlNSX1NQSU8gfCBTWVNJT19VRUFGU1JfU0RSRCB8IFNZU0lPX1VFQUZTUl9TRFdSKTsKIAl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIGFmc3JfcmVnKTsKIAorCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChvcC0+bm9kZSwgInBvcnRpZCIsIC0xKTsKKwogCS8qIExvZyB0aGUgZXJyb3IuICovCiAJcHJpbnRrKCJTWVNJT1sleF06IFVuY29ycmVjdGFibGUgRUNDIEVycm9yLCBwcmltYXJ5IGVycm9yIHR5cGVbJXNdXG4iLAotCSAgICAgICBzYnVzLT5wb3J0aWQsCisJICAgICAgIHBvcnRpZCwKIAkgICAgICAgKCgoZXJyb3JfYml0cyAmIFNZU0lPX1VFQUZTUl9QUElPKSA/CiAJCSAiUElPIiA6CiAJCSAoKGVycm9yX2JpdHMgJiBTWVNJT19VRUFGU1JfUERSRCkgPwpAQCAtMjg1LDEyICsyOTgsMTIgQEAKIAkJICAoKGVycm9yX2JpdHMgJiBTWVNJT19VRUFGU1JfUERXUikgPwogCQkgICAiRFZNQSBXcml0ZSIgOiAiPz8/IikpKSkpOwogCXByaW50aygiU1lTSU9bJXhdOiBET0ZGWyVseF0gU0laRVslbHhdIE1JRFslbHhdXG4iLAotCSAgICAgICBzYnVzLT5wb3J0aWQsCisJICAgICAgIHBvcnRpZCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19VRUFGU1JfRE9GRikgPj4gNDVVTCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19VRUFGU1JfU0laRSkgPj4gNDJVTCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19VRUFGU1JfTUlEKSA+PiAzN1VMKTsKLQlwcmludGsoIlNZU0lPWyV4XTogQUZBUlslMDE2bHhdXG4iLCBzYnVzLT5wb3J0aWQsIGFmYXIpOwotCXByaW50aygiU1lTSU9bJXhdOiBTZWNvbmRhcnkgVUUgZXJyb3JzIFsiLCBzYnVzLT5wb3J0aWQpOworCXByaW50aygiU1lTSU9bJXhdOiBBRkFSWyUwMTZseF1cbiIsIHBvcnRpZCwgYWZhcik7CisJcHJpbnRrKCJTWVNJT1sleF06IFNlY29uZGFyeSBVRSBlcnJvcnMgWyIsIHBvcnRpZCk7CiAJcmVwb3J0ZWQgPSAwOwogCWlmIChhZnNyICYgU1lTSU9fVUVBRlNSX1NQSU8pIHsKIAkJcmVwb3J0ZWQrKzsKQEAgLTMyNywxMiArMzQwLDEyIEBACiAjZGVmaW5lICBTWVNJT19DRUFGU1JfUkVTVjIgMHgwMDAwMDAxZmZmZmZmZmZmVUwgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLwogc3RhdGljIGlycXJldHVybl90IHN5c2lvX2NlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IGRldl9pZDsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZGV2X2lkOworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBvcC0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwotCWludCByZXBvcnRlZDsKKwlpbnQgcmVwb3J0ZWQsIHBvcnRpZDsKIAogCWFmc3JfcmVnID0gcmVnX2Jhc2UgKyBTWVNJT19DRV9BRlNSOwogCWFmYXJfcmVnID0gcmVnX2Jhc2UgKyBTWVNJT19DRV9BRkFSOwpAQCAtMzQ3LDggKzM2MCwxMCBAQAogCQkgU1lTSU9fQ0VBRlNSX1NQSU8gfCBTWVNJT19DRUFGU1JfU0RSRCB8IFNZU0lPX0NFQUZTUl9TRFdSKTsKIAl1cGFfd3JpdGVxKGVycm9yX2JpdHMsIGFmc3JfcmVnKTsKIAorCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChvcC0+bm9kZSwgInBvcnRpZCIsIC0xKTsKKwogCXByaW50aygiU1lTSU9bJXhdOiBDb3JyZWN0YWJsZSBFQ0MgRXJyb3IsIHByaW1hcnkgZXJyb3IgdHlwZVslc11cbiIsCi0JICAgICAgIHNidXMtPnBvcnRpZCwKKwkgICAgICAgcG9ydGlkLAogCSAgICAgICAoKChlcnJvcl9iaXRzICYgU1lTSU9fQ0VBRlNSX1BQSU8pID8KIAkJICJQSU8iIDoKIAkJICgoZXJyb3JfYml0cyAmIFNZU0lPX0NFQUZTUl9QRFJEKSA/CkBAIC0zNjAsMTQgKzM3NSwxNCBAQAogCSAqIFhYWCBVREIgQ0UgdHJhcCBoYW5kbGVyIGRvZXMuLi4gLURhdmVNCiAJICovCiAJcHJpbnRrKCJTWVNJT1sleF06IERPRkZbJWx4XSBFQ0MgU3luZHJvbWVbJWx4XSBTaXplWyVseF0gTUlEWyVseF1cbiIsCi0JICAgICAgIHNidXMtPnBvcnRpZCwKKwkgICAgICAgcG9ydGlkLAogCSAgICAgICAoYWZzciAmIFNZU0lPX0NFQUZTUl9ET0ZGKSA+PiA0NVVMLAogCSAgICAgICAoYWZzciAmIFNZU0lPX0NFQUZTUl9FU1lORCkgPj4gNDhVTCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19DRUFGU1JfU0laRSkgPj4gNDJVTCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19DRUFGU1JfTUlEKSA+PiAzN1VMKTsKLQlwcmludGsoIlNZU0lPWyV4XTogQUZBUlslMDE2bHhdXG4iLCBzYnVzLT5wb3J0aWQsIGFmYXIpOworCXByaW50aygiU1lTSU9bJXhdOiBBRkFSWyUwMTZseF1cbiIsIHBvcnRpZCwgYWZhcik7CiAKLQlwcmludGsoIlNZU0lPWyV4XTogU2Vjb25kYXJ5IENFIGVycm9ycyBbIiwgc2J1cy0+cG9ydGlkKTsKKwlwcmludGsoIlNZU0lPWyV4XTogU2Vjb25kYXJ5IENFIGVycm9ycyBbIiwgcG9ydGlkKTsKIAlyZXBvcnRlZCA9IDA7CiAJaWYgKGFmc3IgJiBTWVNJT19DRUFGU1JfU1BJTykgewogCQlyZXBvcnRlZCsrOwpAQCAtNDA0LDExICs0MTksMTEgQEAKICNkZWZpbmUgIFNZU0lPX1NCQUZTUl9SRVNWMyAweDAwMDAwMDFmZmZmZmZmZmZVTCAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3lzaW9fc2J1c19lcnJvcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBkZXZfaWQ7Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9IHNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGRldl9pZDsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gb3AtPmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGFmc3JfcmVnLCBhZmFyX3JlZywgcmVnX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwotCWludCByZXBvcnRlZDsKKwlpbnQgcmVwb3J0ZWQsIHBvcnRpZDsKIAogCXJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCWFmc3JfcmVnID0gcmVnX2Jhc2UgKyBTWVNJT19TQlVTX0FGU1I7CkBAIC00MjMsOSArNDM4LDExIEBACiAJCSBTWVNJT19TQkFGU1JfU0xFIHwgU1lTSU9fU0JBRlNSX1NUTyB8IFNZU0lPX1NCQUZTUl9TQkVSUik7CiAJdXBhX3dyaXRlcShlcnJvcl9iaXRzLCBhZnNyX3JlZyk7CiAKKwlwb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQob3AtPm5vZGUsICJwb3J0aWQiLCAtMSk7CisKIAkvKiBMb2cgdGhlIGVycm9yLiAqLwogCXByaW50aygiU1lTSU9bJXhdOiBTQlVTIEVycm9yLCBwcmltYXJ5IGVycm9yIHR5cGVbJXNdIHJlYWQoJWQpXG4iLAotCSAgICAgICBzYnVzLT5wb3J0aWQsCisJICAgICAgIHBvcnRpZCwKIAkgICAgICAgKCgoZXJyb3JfYml0cyAmIFNZU0lPX1NCQUZTUl9QTEUpID8KIAkJICJMYXRlIFBJTyBFcnJvciIgOgogCQkgKChlcnJvcl9iaXRzICYgU1lTSU9fU0JBRlNSX1BUTykgPwpAQCAtNDM0LDExICs0NTEsMTEgQEAKIAkJICAgIkVycm9yIEFjayIgOiAiPz8/IikpKSksCiAJICAgICAgIChhZnNyICYgU1lTSU9fU0JBRlNSX1JEKSA/IDEgOiAwKTsKIAlwcmludGsoIlNZU0lPWyV4XTogc2l6ZVslbHhdIE1JRFslbHhdXG4iLAotCSAgICAgICBzYnVzLT5wb3J0aWQsCisJICAgICAgIHBvcnRpZCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19TQkFGU1JfU0laRSkgPj4gNDJVTCwKIAkgICAgICAgKGFmc3IgJiBTWVNJT19TQkFGU1JfTUlEKSA+PiAzN1VMKTsKLQlwcmludGsoIlNZU0lPWyV4XTogQUZBUlslMDE2bHhdXG4iLCBzYnVzLT5wb3J0aWQsIGFmYXIpOwotCXByaW50aygiU1lTSU9bJXhdOiBTZWNvbmRhcnkgU0JVUyBlcnJvcnMgWyIsIHNidXMtPnBvcnRpZCk7CisJcHJpbnRrKCJTWVNJT1sleF06IEFGQVJbJTAxNmx4XVxuIiwgcG9ydGlkLCBhZmFyKTsKKwlwcmludGsoIlNZU0lPWyV4XTogU2Vjb25kYXJ5IFNCVVMgZXJyb3JzIFsiLCBwb3J0aWQpOwogCXJlcG9ydGVkID0gMDsKIAlpZiAoYWZzciAmIFNZU0lPX1NCQUZTUl9TTEUpIHsKIAkJcmVwb3J0ZWQrKzsKQEAgLTQ3MCwzNCArNDg3LDM3IEBACiAjZGVmaW5lIFNZU0lPX0NFX0lOTwkJMHgzNQogI2RlZmluZSBTWVNJT19TQlVTRVJSX0lOTwkweDM2CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzeXNpb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBfX2luaXQgc3lzaW9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9IHNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gb3AtPmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCXVuc2lnbmVkIGludCBpcnE7CiAJdTY0IGNvbnRyb2w7CisJaW50IHBvcnRpZDsKIAotCWlycSA9IHNidXNfYnVpbGRfaXJxKHNidXMsIFNZU0lPX1VFX0lOTyk7CisJcG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KG9wLT5ub2RlLCAicG9ydGlkIiwgLTEpOworCisJaXJxID0gc2J1c19idWlsZF9pcnEob3AsIFNZU0lPX1VFX0lOTyk7CiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgc3lzaW9fdWVfaGFuZGxlciwgMCwKLQkJCSJTWVNJT19VRSIsIHNidXMpIDwgMCkgeworCQkJIlNZU0lPX1VFIiwgb3ApIDwgMCkgewogCQlwcm9tX3ByaW50ZigiU1lTSU9bJXhdOiBDYW5ub3QgcmVnaXN0ZXIgVUUgaW50ZXJydXB0LlxuIiwKLQkJCSAgICBzYnVzLT5wb3J0aWQpOworCQkJICAgIHBvcnRpZCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWlycSA9IHNidXNfYnVpbGRfaXJxKHNidXMsIFNZU0lPX0NFX0lOTyk7CisJaXJxID0gc2J1c19idWlsZF9pcnEob3AsIFNZU0lPX0NFX0lOTyk7CiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgc3lzaW9fY2VfaGFuZGxlciwgMCwKLQkJCSJTWVNJT19DRSIsIHNidXMpIDwgMCkgeworCQkJIlNZU0lPX0NFIiwgb3ApIDwgMCkgewogCQlwcm9tX3ByaW50ZigiU1lTSU9bJXhdOiBDYW5ub3QgcmVnaXN0ZXIgQ0UgaW50ZXJydXB0LlxuIiwKLQkJCSAgICBzYnVzLT5wb3J0aWQpOworCQkJICAgIHBvcnRpZCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWlycSA9IHNidXNfYnVpbGRfaXJxKHNidXMsIFNZU0lPX1NCVVNFUlJfSU5PKTsKKwlpcnEgPSBzYnVzX2J1aWxkX2lycShvcCwgU1lTSU9fU0JVU0VSUl9JTk8pOwogCWlmIChyZXF1ZXN0X2lycShpcnEsIHN5c2lvX3NidXNfZXJyb3JfaGFuZGxlciwgMCwKLQkJCSJTWVNJT19TQkVSUiIsIHNidXMpIDwgMCkgeworCQkJIlNZU0lPX1NCRVJSIiwgb3ApIDwgMCkgewogCQlwcm9tX3ByaW50ZigiU1lTSU9bJXhdOiBDYW5ub3QgcmVnaXN0ZXIgU0JVUyBFcnJvciBpbnRlcnJ1cHQuXG4iLAotCQkJICAgIHNidXMtPnBvcnRpZCk7CisJCQkgICAgcG9ydGlkKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCkBAIC01MTMsMTkgKzUzMywxNSBAQAogfQogCiAvKiBCb290IHRpbWUgaW5pdGlhbGl6YXRpb24uICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pb21tdV9pbml0KGludCBfX25vZGUsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKK3N0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2lvbW11X2luaXQoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnByOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJc3RydWN0IHN0cmJ1ZiAqc3RyYnVmOwogCXVuc2lnbmVkIGxvbmcgcmVncywgcmVnX2Jhc2U7CisJaW50IGksIHBvcnRpZDsKIAl1NjQgY29udHJvbDsKLQlpbnQgaTsKLQotCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoX19ub2RlKTsKLQotCXNidXMtPnBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInVwYS1wb3J0aWQiLCAtMSk7CiAKIAlwciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwogCWlmICghcHIpIHsKQEAgLTU0Miw5ICs1NTgsOSBAQAogCWlmICghc3RyYnVmKQogCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAotCXNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdSA9IGlvbW11OwotCXNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5zdGMgPSBzdHJidWY7Ci0Jc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IC0xOworCW9wLT5kZXYuYXJjaGRhdGEuaW9tbXUgPSBpb21tdTsKKwlvcC0+ZGV2LmFyY2hkYXRhLnN0YyA9IHN0cmJ1ZjsKKwlvcC0+ZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IC0xOwogCiAJcmVnX2Jhc2UgPSByZWdzICsgU1lTSU9fSU9NTVVSRUdfQkFTRTsKIAlpb21tdS0+aW9tbXVfY29udHJvbCA9IHJlZ19iYXNlICsgSU9NTVVfQ09OVFJPTDsKQEAgLTU3Miw4ICs1ODgsOSBAQAogCSAqLwogCWlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgPSByZWdzICsgMHgyMDAwVUw7CiAKLQlwcmludGsoIlNZU0lPOiBVUEEgcG9ydElEICV4LCBhdCAlMDE2bHhcbiIsCi0JICAgICAgIHNidXMtPnBvcnRpZCwgcmVncyk7CisJcG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KG9wLT5ub2RlLCAicG9ydGlkIiwgLTEpOworCXByaW50ayhLRVJOX0lORk8gIlNZU0lPOiBVUEEgcG9ydElEICV4LCBhdCAlMDE2bHhcbiIsCisJICAgICAgIHBvcnRpZCwgcmVncyk7CiAKIAkvKiBTZXR1cCBmb3IgVFNCX1NJWkU9NywgVEJXX1NJWkU9MCwgTU1VX0RFPTEsIE1NVV9FTj0xICovCiAJaWYgKGlvbW11X3RhYmxlX2luaXQoaW9tbXUsIElPX1RTQl9TSVpFLCBNQVBfQkFTRSwgMHhmZmZmZmZmZiwgLTEpKQpAQCAtNjMxLDU2ICs2NDgsMjcgQEAKIAogCS8qIE5vdyBzb21lIFhmaXJlIHNwZWNpZmljIGdyb3QuLi4gKi8KIAlpZiAodGhpc19pc19zdGFyZmlyZSkKLQkJc3RhcmZpcmVfaG9va3VwKHNidXMtPnBvcnRpZCk7CisJCXN0YXJmaXJlX2hvb2t1cChwb3J0aWQpOwogCi0Jc3lzaW9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc2J1cyk7CisJc3lzaW9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMob3ApOwogCXJldHVybjsKIAogZmF0YWxfbWVtb3J5X2Vycm9yOgogCXByb21fcHJpbnRmKCJzYnVzX2lvbW11X2luaXQ6IEZhdGFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIik7CiB9CiAKLXZvaWQgc2J1c19maWxsX2RldmljZV9pcnEoc3RydWN0IHNidXNfZGV2ICpzZGV2KQorc3RhdGljIGludCBfX2luaXQgc2J1c19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHNkZXYtPnByb21fbm9kZSk7Ci0JY29uc3Qgc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCi0JaXJxcyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImludGVycnVwdHMiLCBOVUxMKTsKLQlpZiAoIWlycXMpIHsKLQkJc2Rldi0+aXJxc1swXSA9IDA7Ci0JCXNkZXYtPm51bV9pcnFzID0gMDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgcHJpID0gaXJxc1swXS5wcmk7CisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRwLCAic2J1cyIpIHsKKwkJc3RydWN0IG9mX2RldmljZSAqb3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKIAotCQlzZGV2LT5udW1faXJxcyA9IDE7Ci0JCWlmIChwcmkgPCAweDIwKQotCQkJcHJpICs9IHNkZXYtPnNsb3QgKiA4OwotCi0JCXNkZXYtPmlycXNbMF0gPQlzYnVzX2J1aWxkX2lycShzZGV2LT5idXMsIHByaSk7CisJCXNidXNfaW9tbXVfaW5pdChvcCk7CisJCW9mX3Byb3BhZ2F0ZV9hcmNoZGF0YShvcCk7CiAJfQotfQogCi12b2lkIF9faW5pdCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqcG4sIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLXsKLX0KLQotdm9pZCBfX2luaXQgc2J1c19zZXR1cF9pb21tdShzdHJ1Y3Qgc2J1c19idXMgKnNidXMsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0Jc2J1c19pb21tdV9pbml0KGRwLT5ub2RlLCBzYnVzKTsKLX0KLQotdm9pZCBfX2luaXQgc2J1c19zZXR1cF9hcmNoX3Byb3BzKHN0cnVjdCBzYnVzX2J1cyAqc2J1cywgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLX0KLQotaW50IF9faW5pdCBzYnVzX2FyY2hfcHJlaW5pdCh2b2lkKQotewogCXJldHVybiAwOwogfQogCi12b2lkIF9faW5pdCBzYnVzX2FyY2hfcG9zdGluaXQodm9pZCkKLXsKLQlleHRlcm4gdm9pZCBmaXJldHJ1Y2tfaW5pdCh2b2lkKTsKLQotCWZpcmV0cnVja19pbml0KCk7Ci19CitzdWJzeXNfaW5pdGNhbGwoc2J1c19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IDc0M2NjYWQuLmU1NjI3MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbG1iLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vaGVhZC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTgwLDggKzgxLDYgQEAKIAkJCSAgIGksIGNwdV9kYXRhKGkpLmNsb2NrX3RpY2spOwogfQogCi1zdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7Ci0KIGV4dGVybiB2b2lkIHNldHVwX3NwYXJjNjRfdGltZXIodm9pZCk7CiAKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNhbGxpbl9mbGFnID0gMDsKQEAgLTExNywxMiArMTE2LDE1IEBACiAJYXRvbWljX2luYygmaW5pdF9tbS5tbV9jb3VudCk7CiAJY3VycmVudC0+YWN0aXZlX21tID0gJmluaXRfbW07CiAKKwkvKiBpbmZvcm0gdGhlIG5vdGlmaWVycyBhYm91dCB0aGUgbmV3IGNwdSAqLworCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1aWQpOworCiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1aWQsIHNtcF9jb21tZW5jZWRfbWFzaykpCiAJCXJtYigpOwogCi0Jc3Bpbl9sb2NrKCZjYWxsX2xvY2spOworCWlwaV9jYWxsX2xvY2soKTsKIAljcHVfc2V0KGNwdWlkLCBjcHVfb25saW5lX21hcCk7Ci0Jc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisJaXBpX2NhbGxfdW5sb2NrKCk7CiAKIAkvKiBpZGxlIHRocmVhZCBpcyBleHBlY3RlZCB0byBoYXZlIHByZWVtcHQgZGlzYWJsZWQgKi8KIAlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTEzMDUsMTAgKzEzMDcsNiBAQAogCWMtPmNvcmVfaWQgPSAwOwogCWMtPnByb2NfaWQgPSAtMTsKIAotCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKLQljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7Ci0Jc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7Ci0KIAlzbXBfd21iKCk7CiAKIAkvKiBNYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBwb2ludCB0byB0aGlzIGNwdS4gICovCkBAIC0xMzE4LDYgKzEzMTYsMTAgQEAKIAltZGVsYXkoMSk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAorCWlwaV9jYWxsX2xvY2soKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJaXBpX2NhbGxfdW5sb2NrKCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYwppbmRleCAwODA0ZjcxLi4zMGJiYThiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vaGVhZC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KLSNpbmNsdWRlIDxhc20vbW9zdGVrLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CkBAIC00NCwxMiArNDMsOCBAQAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpZmRlZiBDT05GSUdfU0JVUwotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGFzbS9lYnVzLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxhc20vbnM4NzMwMy5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CkBAIC02OCw3ICs2Myw2IEBACiBleHRlcm4gdm9pZCAqX19tZW1zY2FuX2dlbmVyaWModm9pZCAqLCBpbnQsIHNpemVfdCk7CiBleHRlcm4gaW50IF9fbWVtY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX2tlcm5lbF9zaXplX3QpOwogZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiwgaW50KTsKIGV4dGVybiB2b2lkIHN5c19zaWdzdXNwZW5kKHZvaWQpOwogZXh0ZXJuIGludCBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdTMyIGFyZyk7CiBleHRlcm4gaW50ICgqaGFuZGxlX21hdGhlbXUpKHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCBmcHVzdGF0ZSAqKTsKQEAgLTE1NCwyNiArMTQ4LDEyIEBACiBFWFBPUlRfU1lNQk9MKF9fZmx1c2hfZGNhY2hlX3JhbmdlKTsKICNlbmRpZgogCi1FWFBPUlRfU1lNQk9MKG1vc3Rla19sb2NrKTsKLUVYUE9SVF9TWU1CT0wobXN0azQ4dDAyX3JlZ3MpOwogI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIEVYUE9SVF9TWU1CT0woYXV4aW9fc2V0X2xlZCk7CiBFWFBPUlRfU1lNQk9MKGF1eGlvX3NldF9sdGUpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKLUVYUE9SVF9TWU1CT0woc2J1c19yb290KTsKLUVYUE9SVF9TWU1CT0woZG1hX2NoYWluKTsKIEVYUE9SVF9TWU1CT0woc2J1c19zZXRfc2J1czY0KTsKLUVYUE9SVF9TWU1CT0woc2J1c19hbGxvY19jb25zaXN0ZW50KTsKLUVYUE9SVF9TWU1CT0woc2J1c19mcmVlX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChzYnVzX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChzYnVzX3VubWFwX3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfbWFwX3NnKTsKLUVYUE9SVF9TWU1CT0woc2J1c191bm1hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKHNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTChzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woc2J1c19kbWFfc3luY19zZ19mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0woc2J1c19kbWFfc3luY19zZ19mb3JfZGV2aWNlKTsKICNlbmRpZgogRVhQT1JUX1NZTUJPTChvdXRzYik7CiBFWFBPUlRfU1lNQk9MKG91dHN3KTsKQEAgLTE4Miw3ICsxNjIsNiBAQAogRVhQT1JUX1NZTUJPTChpbnN3KTsKIEVYUE9SVF9TWU1CT0woaW5zbCk7CiAjaWZkZWYgQ09ORklHX1BDSQotRVhQT1JUX1NZTUJPTChlYnVzX2NoYWluKTsKIEVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2NvbnNpc3RlbnQpOwogRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKIEVYUE9SVF9TWU1CT0wocGNpX21hcF9zaW5nbGUpOwpAQCAtMzAwLDMgKzI3OSw1IEBACiBFWFBPUlRfU1lNQk9MKHhvcl9uaWFnYXJhXzMpOwogRVhQT1JUX1NZTUJPTCh4b3JfbmlhZ2FyYV80KTsKIEVYUE9SVF9TWU1CT0woeG9yX25pYWdhcmFfNSk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJlYWxfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3N0YXRlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NzdGF0ZS5jCmluZGV4IDViNmU3NWIuLjhjZGJlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3N0YXRlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zc3RhdGUuYwpAQCAtMSwxNCArMSwxNSBAQAogLyogc3N0YXRlLmM6IFN5c3RlbSBzb2Z0IHN0YXRlIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KLSNpbmNsdWRlIDxhc20vc3N0YXRlLmg+CisjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2hlYWQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTUwLDMwICs1MSwzMyBAQAogc3RhdGljIGNvbnN0IGNoYXIgcGFuaWNpbmdfbXNnWzMyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpID0KIAkiTGludXggcGFuaWNpbmciOwogCi12b2lkIHNzdGF0ZV9ib290aW5nKHZvaWQpCitzdGF0aWMgaW50IHNzdGF0ZV9yZWJvb3RfY2FsbChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5wLCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQgKl91bnVzZWQpCiB7Ci0JZG9fc2V0X3NzdGF0ZShIVl9TT0ZUX1NUQVRFX1RSQU5TSVRJT04sIGJvb3RpbmdfbXNnKTsKKwljb25zdCBjaGFyICptc2c7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNZU19ET1dOOgorCWRlZmF1bHQ6CisJCW1zZyA9IHJlYm9vdGluZ19tc2c7CisJCWJyZWFrOworCisJY2FzZSBTWVNfSEFMVDoKKwkJbXNnID0gaGFsdGluZ19tc2c7CisJCWJyZWFrOworCisJY2FzZSBTWVNfUE9XRVJfT0ZGOgorCQltc2cgPSBwb3dlcm9mZl9tc2c7CisJCWJyZWFrOworCX0KKworCWRvX3NldF9zc3RhdGUoSFZfU09GVF9TVEFURV9UUkFOU0lUSU9OLCBtc2cpOworCisJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotdm9pZCBzc3RhdGVfcnVubmluZyh2b2lkKQotewotCWRvX3NldF9zc3RhdGUoSFZfU09GVF9TVEFURV9OT1JNQUwsIHJ1bm5pbmdfbXNnKTsKLX0KLQotdm9pZCBzc3RhdGVfaGFsdCh2b2lkKQotewotCWRvX3NldF9zc3RhdGUoSFZfU09GVF9TVEFURV9UUkFOU0lUSU9OLCBoYWx0aW5nX21zZyk7Ci19Ci0KLXZvaWQgc3N0YXRlX3Bvd2Vyb2ZmKHZvaWQpCi17Ci0JZG9fc2V0X3NzdGF0ZShIVl9TT0ZUX1NUQVRFX1RSQU5TSVRJT04sIHBvd2Vyb2ZmX21zZyk7Ci19Ci0KLXZvaWQgc3N0YXRlX3JlYm9vdCh2b2lkKQotewotCWRvX3NldF9zc3RhdGUoSFZfU09GVF9TVEFURV9UUkFOU0lUSU9OLCByZWJvb3RpbmdfbXNnKTsKLX0KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc3N0YXRlX3JlYm9vdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNzdGF0ZV9yZWJvb3RfY2FsbCwKK307CiAKIHN0YXRpYyBpbnQgc3N0YXRlX3BhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQogewpAQCAtODcsMTggKzkxLDM3IEBACiAJLnByaW9yaXR5CT0JSU5UX01BWCwKIH07CiAKLXZvaWQgX19pbml0IHN1bjR2X3NzdGF0ZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzc3RhdGVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbWFqb3IsIG1pbm9yOwogCisJaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpCisJCXJldHVybiAwOworCiAJbWFqb3IgPSAxOwogCW1pbm9yID0gMDsKIAlpZiAoc3VuNHZfaHZhcGlfcmVnaXN0ZXIoSFZfR1JQX1NPRlRfU1RBVEUsIG1ham9yLCAmbWlub3IpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaHZfc3VwcG9ydHNfc29mdF9zdGF0ZSA9IDE7CiAKIAlwcm9tX3N1bjR2X2d1ZXN0X3NvZnRfc3RhdGUoKTsKKworCWRvX3NldF9zc3RhdGUoSFZfU09GVF9TVEFURV9UUkFOU0lUSU9OLCBib290aW5nX21zZyk7CisKIAlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCiAJCQkJICAgICAgICZzc3RhdGVfcGFuaWNfYmxvY2spOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc3N0YXRlX3JlYm9vdF9ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKIH0KKworY29yZV9pbml0Y2FsbChzc3RhdGVfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNzdGF0ZV9ydW5uaW5nKHZvaWQpCit7CisJZG9fc2V0X3NzdGF0ZShIVl9TT0ZUX1NUQVRFX05PUk1BTCwgcnVubmluZ19tc2cpOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKHNzdGF0ZV9ydW5uaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3RhcmZpcmUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3RhcmZpcmUuYwppbmRleCA3NDYxNTgxLi4wNjBkMGYzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N0YXJmaXJlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdGFyZmlyZS5jCkBAIC0yOCwxMSArMjgsNiBAQAogCQl0aGlzX2lzX3N0YXJmaXJlID0gMTsKIH0KIAotdm9pZCBzdGFyZmlyZV9jcHVfc2V0dXAodm9pZCkKLXsKLQkvKiBDdXJyZW50bHksIG5vdGhpbmcgdG8gZG8uICAqLwotfQotCiBpbnQgc3RhcmZpcmVfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCiB7CiAJcmV0dXJuIHVwYV9yZWFkbCgweDFmZmY0MDAwMGQwVUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCmluZGV4IDNkMTE4NTMuLmU4MDA1MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTU4LDE1ICs1OCw2IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdF9zaWduYWwuaD4KIAotLyogMzItYml0IHRpbWV2YWwgYW5kIHJlbGF0ZWQgZmxvdHNhbS4gICovCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBwdXRfdHYzMihzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICpvLCBzdHJ1Y3QgdGltZXZhbCAqaSkKLXsKLQlyZXR1cm4gKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvLCBzaXplb2YoKm8pKSB8fAotCQkoX19wdXRfdXNlcihpLT50dl9zZWMsICZvLT50dl9zZWMpIHwKLQkJIF9fcHV0X3VzZXIoaS0+dHZfdXNlYywgJm8tPnR2X3VzZWMpKSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfU1lTVklQQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19pcGModTMyIGNhbGwsIHUzMiBmaXJzdCwgdTMyIHNlY29uZCwgdTMyIHRoaXJkLCBjb21wYXRfdXB0cl90IHB0ciwgdTMyIGZpZnRoKQogewpAQCAtMTQ4LDQxICsxMzksNiBAQAogCQlyZXR1cm4gc3lzX2Z0cnVuY2F0ZShmZCwgKGhpZ2ggPDwgMzIpIHwgbG93KTsKIH0KIAotaW50IGNwX2NvbXBhdF9zdGF0KHN0cnVjdCBrc3RhdCAqc3RhdCwgc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqc3RhdGJ1ZikKLXsKLQljb21wYXRfaW5vX3QgaW5vOwotCWludCBlcnI7Ci0KLQlpZiAoc3RhdC0+c2l6ZSA+IE1BWF9OT05fTEZTIHx8ICFvbGRfdmFsaWRfZGV2KHN0YXQtPmRldikgfHwKLQkgICAgIW9sZF92YWxpZF9kZXYoc3RhdC0+cmRldikpCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCi0JaW5vID0gc3RhdC0+aW5vOwotCWlmIChzaXplb2YoaW5vKSA8IHNpemVvZihzdGF0LT5pbm8pICYmIGlubyAhPSBzdGF0LT5pbm8pCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCi0JZXJyICA9IHB1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPmRldiksICZzdGF0YnVmLT5zdF9kZXYpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5pbm8sICZzdGF0YnVmLT5zdF9pbm8pOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5tb2RlLCAmc3RhdGJ1Zi0+c3RfbW9kZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPm5saW5rLCAmc3RhdGJ1Zi0+c3RfbmxpbmspOwotCWVyciB8PSBwdXRfdXNlcihoaWdoMmxvd3VpZChzdGF0LT51aWQpLCAmc3RhdGJ1Zi0+c3RfdWlkKTsKLQllcnIgfD0gcHV0X3VzZXIoaGlnaDJsb3dnaWQoc3RhdC0+Z2lkKSwgJnN0YXRidWYtPnN0X2dpZCk7Ci0JZXJyIHw9IHB1dF91c2VyKG9sZF9lbmNvZGVfZGV2KHN0YXQtPnJkZXYpLCAmc3RhdGJ1Zi0+c3RfcmRldik7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPnNpemUsICZzdGF0YnVmLT5zdF9zaXplKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+YXRpbWUudHZfc2VjLCAmc3RhdGJ1Zi0+c3RfYXRpbWUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5hdGltZS50dl9uc2VjLCAmc3RhdGJ1Zi0+c3RfYXRpbWVfbnNlYyk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPm10aW1lLnR2X3NlYywgJnN0YXRidWYtPnN0X210aW1lKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+bXRpbWUudHZfbnNlYywgJnN0YXRidWYtPnN0X210aW1lX25zZWMpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5jdGltZS50dl9zZWMsICZzdGF0YnVmLT5zdF9jdGltZSk7Ci0JZXJyIHw9IHB1dF91c2VyKHN0YXQtPmN0aW1lLnR2X25zZWMsICZzdGF0YnVmLT5zdF9jdGltZV9uc2VjKTsKLQllcnIgfD0gcHV0X3VzZXIoc3RhdC0+Ymxrc2l6ZSwgJnN0YXRidWYtPnN0X2Jsa3NpemUpOwotCWVyciB8PSBwdXRfdXNlcihzdGF0LT5ibG9ja3MsICZzdGF0YnVmLT5zdF9ibG9ja3MpOwotCWVyciB8PSBwdXRfdXNlcigwLCAmc3RhdGJ1Zi0+X191bnVzZWQ0WzBdKTsKLQllcnIgfD0gcHV0X3VzZXIoMCwgJnN0YXRidWYtPl9fdW51c2VkNFsxXSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IGNwX2NvbXBhdF9zdGF0NjQoc3RydWN0IGtzdGF0ICpzdGF0LAogCQkJICAgIHN0cnVjdCBjb21wYXRfc3RhdDY0IF9fdXNlciAqc3RhdGJ1ZikKIHsKQEAgLTUyMiw2NyArNDc4LDYgQEAKIAogI2VuZGlmICAvKiBDT05GSUdfTU9EVUxFUyAqLwogCi0vKiBUcmFuc2xhdGlvbnMgZHVlIHRvIHRpbWVfdCBzaXplIGRpZmZlcmVuY2VzLiAgV2hpY2ggYWZmZWN0cyBhbGwKLSAgIHNvcnRzIG9mIHRoaW5ncywgbGlrZSB0aW1ldmFsIGFuZCBpdGltZXJ2YWwuICAqLwotCi1leHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKLQotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHRpbWVvZmRheShzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0diwKLQkJCQkgICBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKLXsKLQlpZiAodHYpIHsKLQkJc3RydWN0IHRpbWV2YWwga3R2OwotCQlkb19nZXR0aW1lb2ZkYXkoJmt0dik7Ci0JCWlmIChwdXRfdHYzMih0diwgJmt0dikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIodHosICZzeXNfdHosIHNpemVvZihzeXNfdHopKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGdldF90czMyKHN0cnVjdCB0aW1lc3BlYyAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKLXsKLQlsb25nIHVzZWM7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaSwgc2l6ZW9mKCppKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChfX2dldF91c2VyKHVzZWMsICZpLT50dl91c2VjKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jby0+dHZfbnNlYyA9IHVzZWMgKiAxMDAwOwotCXJldHVybiAwOwotfQotCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAotCQkJCSAgIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQotewotCXN0cnVjdCB0aW1lc3BlYyBrdHM7Ci0Jc3RydWN0IHRpbWV6b25lIGt0ejsKLQotIAlpZiAodHYpIHsKLQkJaWYgKGdldF90czMyKCZrdHMsIHR2KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAodHopIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdHosIHR6LCBzaXplb2Yoa3R6KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gZG9fc3lzX3NldHRpbWVvZmRheSh0diA/ICZrdHMgOiBOVUxMLCB0eiA/ICZrdHogOiBOVUxMKTsKLX0KLQotLyogVGhlc2UgYXJlIGhlcmUganVzdCBpbiBjYXNlIHNvbWUgb2xkIHNwYXJjMzIgYmluYXJ5IGNhbGxzIGl0LiAqLwotYXNtbGlua2FnZSBsb25nIHN5czMyX3BhdXNlKHZvaWQpCi17Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGUoKTsKLQlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwotfQotCiBhc21saW5rYWdlIGNvbXBhdF9zc2l6ZV90IHN5czMyX3ByZWFkNjQodW5zaWduZWQgaW50IGZkLAogCQkJCQljaGFyIF9fdXNlciAqdWJ1ZiwKIAkJCQkJY29tcGF0X3NpemVfdCBjb3VudCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBhMmYyNDI3Li43YTY3ODZhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNjYWxscy5TCkBAIC02NSw5ICs2NSw4IEBACiAJYW5kY2MJJWw1LCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAliZSxwdAklaWNjLCBydHJhcAogCSBub3AKLQlhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQljYWxsCXN5c2NhbGxfdHJhY2UKLQkgbW92CTEsICVvMQorCWNhbGwJc3lzY2FsbF90cmFjZV9sZWF2ZQorCSBhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAliYSxwdAkleGNjLCBydHJhcAogCSBub3AKIApAQCAtMTU5LDkgKzE1OCw4IEBACiAJIG9yCSVsNywgJWxvKHN5c19uaV9zeXNjYWxsKSwgJWw3CiAKIGxpbnV4X3N5c2NhbGxfdHJhY2UzMjoKLQlhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQljYWxsCXN5c2NhbGxfdHJhY2UKLQkgY2xyCSVvMQorCWNhbGwJc3lzY2FsbF90cmFjZV9lbnRlcgorCSBhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAlicm56LHBuCSVvMCwgM2YKIAkgbW92CS1FTk9TWVMsICVvMAogCXNybAklaTAsIDAsICVvMApAQCAtMTcyLDkgKzE3MCw4IEBACiAJIHNybAklaTMsIDAsICVvMwogCiBsaW51eF9zeXNjYWxsX3RyYWNlOgotCWFkZAklc3AsIFBUUkVHU19PRkYsICVvMAotCWNhbGwJc3lzY2FsbF90cmFjZQotCSBjbHIJJW8xCisJY2FsbAlzeXNjYWxsX3RyYWNlX2VudGVyCisJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMAogCWJybnoscG4JJW8wLCAzZgogCSBtb3YJLUVOT1NZUywgJW8wCiAJbW92CSVpMCwgJW8wCkBAIC0yNzUsOSArMjcyLDggQEAKIAliLHB0CSV4Y2MsIHJ0cmFwCiAJIHN0eAklbDIsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVE5QQ10KIGxpbnV4X3N5c2NhbGxfdHJhY2UyOgotCWFkZAklc3AsIFBUUkVHU19PRkYsICVvMAotCWNhbGwJc3lzY2FsbF90cmFjZQotCSBtb3YJMSwgJW8xCisJY2FsbAlzeXNjYWxsX3RyYWNlX2xlYXZlCisJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMAogCXN0eAklbDEsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFBDXQogCWJhLHB0CSV4Y2MsIHJ0cmFwCiAJIHN0eAklbDIsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVE5QQ10KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggMGZkYmYzYi4uYjJmYTRjMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKQEAgLTIzLDcgKzIzLDcgQEAKIC8qMTAqLyAgLndvcmQgc3lzX3VubGluaywgc3Vub3NfZXhlY3YsIHN5c19jaGRpciwgc3lzX2Nob3duMTYsIHN5czMyX21rbm9kCiAvKjE1Ki8JLndvcmQgc3lzX2NobW9kLCBzeXNfbGNob3duMTYsIHNwYXJjX2Jyaywgc3lzMzJfcGVyZmN0ciwgc3lzMzJfbHNlZWsKIC8qMjAqLwkud29yZCBzeXNfZ2V0cGlkLCBzeXNfY2FwZ2V0LCBzeXNfY2Fwc2V0LCBzeXNfc2V0dWlkMTYsIHN5c19nZXR1aWQxNgotLyoyNSovCS53b3JkIHN5czMyX3Ztc3BsaWNlLCBjb21wYXRfc3lzX3B0cmFjZSwgc3lzX2FsYXJtLCBzeXMzMl9zaWdhbHRzdGFjaywgc3lzMzJfcGF1c2UKKy8qMjUqLwkud29yZCBzeXMzMl92bXNwbGljZSwgY29tcGF0X3N5c19wdHJhY2UsIHN5c19hbGFybSwgc3lzMzJfc2lnYWx0c3RhY2ssIHN5c19wYXVzZQogLyozMCovCS53b3JkIGNvbXBhdF9zeXNfdXRpbWUsIHN5c19sY2hvd24sIHN5c19mY2hvd24sIHN5czMyX2FjY2Vzcywgc3lzMzJfbmljZQogCS53b3JkIHN5c19jaG93biwgc3lzX3N5bmMsIHN5czMyX2tpbGwsIGNvbXBhdF9zeXNfbmV3c3RhdCwgc3lzMzJfc2VuZGZpbGUKIC8qNDAqLwkud29yZCBjb21wYXRfc3lzX25ld2xzdGF0LCBzeXNfZHVwLCBzeXNfcGlwZSwgY29tcGF0X3N5c190aW1lcywgc3lzX2dldHVpZApAQCAtNDEsOCArNDEsOCBAQAogLyoxMDAqLyAud29yZCBzeXMzMl9nZXRwcmlvcml0eSwgc3lzMzJfcnRfc2lncmV0dXJuLCBzeXMzMl9ydF9zaWdhY3Rpb24sIHN5czMyX3J0X3NpZ3Byb2NtYXNrLCBzeXMzMl9ydF9zaWdwZW5kaW5nCiAJLndvcmQgY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQsIHN5czMyX3J0X3NpZ3F1ZXVlaW5mbywgY29tcGF0X3N5c19ydF9zaWdzdXNwZW5kLCBzeXNfc2V0cmVzdWlkLCBzeXNfZ2V0cmVzdWlkCiAvKjExMCovCS53b3JkIHN5c19zZXRyZXNnaWQsIHN5c19nZXRyZXNnaWQsIHN5c19zZXRyZWdpZCwgc3lzX25pc19zeXNjYWxsLCBzeXNfbmlzX3N5c2NhbGwKLQkud29yZCBzeXMzMl9nZXRncm91cHMsIHN5czMyX2dldHRpbWVvZmRheSwgc3lzMzJfZ2V0cnVzYWdlLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRjd2QKLS8qMTIwKi8JLndvcmQgY29tcGF0X3N5c19yZWFkdiwgY29tcGF0X3N5c193cml0ZXYsIHN5czMyX3NldHRpbWVvZmRheSwgc3lzX2ZjaG93bjE2LCBzeXNfZmNobW9kCisJLndvcmQgc3lzMzJfZ2V0Z3JvdXBzLCBjb21wYXRfc3lzX2dldHRpbWVvZmRheSwgc3lzMzJfZ2V0cnVzYWdlLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRjd2QKKy8qMTIwKi8JLndvcmQgY29tcGF0X3N5c19yZWFkdiwgY29tcGF0X3N5c193cml0ZXYsIGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5LCBzeXNfZmNob3duMTYsIHN5c19mY2htb2QKIAkud29yZCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zZXRyZXVpZDE2LCBzeXNfc2V0cmVnaWQxNiwgc3lzX3JlbmFtZSwgc3lzX3RydW5jYXRlCiAvKjEzMCovCS53b3JkIHN5c19mdHJ1bmNhdGUsIHN5c19mbG9jaywgY29tcGF0X3N5c19sc3RhdDY0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uaXNfc3lzY2FsbAogCS53b3JkIHN5c19uaXNfc3lzY2FsbCwgc3lzMzJfbWtkaXIsIHN5c19ybWRpciwgY29tcGF0X3N5c191dGltZXMsIGNvbXBhdF9zeXNfc3RhdDY0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCmluZGV4IGNjMTZmZGMuLjgwZDcxYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jCkBAIC0zMCwxMyArMzAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjL200OHQ1OS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vbW9zdGVrLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNTAsMTggKzUxLDcgQEAKIAogI2luY2x1ZGUgImVudHJ5LmgiCiAKLURFRklORV9TUElOTE9DSyhtb3N0ZWtfbG9jayk7CiBERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOwotdm9pZCBfX2lvbWVtICptc3RrNDh0MDJfcmVncyA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBkczEyODdfcmVncyA9IDBVTDsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmJxNDgwMl9yZWdzOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKm1zdGs0OHQwOF9yZWdzOwotc3RhdGljIHZvaWQgX19pb21lbSAqbXN0azQ4dDU5X3JlZ3M7Ci0KLXN0YXRpYyBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcpOwogCiAjZGVmaW5lIFRJQ0tfUFJJVl9CSVQJKDFVTCA8PCA2MykKICNkZWZpbmUgVElDS0NNUF9JUlFfQklUCSgxVUwgPDwgNjMpCkBAIC00MDUsMzEzICszOTUsMTY3IEBACiAKIGludCB1cGRhdGVfcGVyc2lzdGVudF9jbG9jayhzdHJ1Y3QgdGltZXNwZWMgbm93KQogewotCXJldHVybiBzZXRfcnRjX21tc3Mobm93LnR2X3NlYyk7Ci19CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHJ0Y19jbGFzc19vcGVuKCJydGMwIik7CisJaW50IGVyciA9IC0xOwogCi0vKiBLaWNrIHN0YXJ0IGEgc3RvcHBlZCBjbG9jayAocHJvY2VkdXJlIGZyb20gdGhlIFN1biBOVlJBTS9ob3N0aWQgRkFRKS4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBraWNrX3N0YXJ0X2Nsb2NrKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gbXN0azQ4dDAyX3JlZ3M7Ci0JdTggc2VjLCB0bXA7Ci0JaW50IGksIGNvdW50OwotCi0JcHJvbV9wcmludGYoIkNMT0NLOiBDbG9jayB3YXMgc3RvcHBlZC4gS2ljayBzdGFydCAiKTsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCS8qIFR1cm4gb24gdGhlIGtpY2sgc3RhcnQgYml0IHRvIHN0YXJ0IHRoZSBvc2NpbGxhdG9yLiAqLwotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JdG1wIHw9IE1TVEtfQ1JFR19XUklURTsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfU0VDKTsKLQl0bXAgJj0gfk1TVEtfU1RPUDsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19TRUMsIHRtcCk7Ci0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19IT1VSKTsKLQl0bXAgfD0gTVNUS19LSUNLX1NUQVJUOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0hPVVIsIHRtcCk7Ci0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgJj0gfk1TVEtfQ1JFR19XUklURTsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0KLQkvKiBEZWxheSB0byBhbGxvdyB0aGUgY2xvY2sgb3NjaWxsYXRvciB0byBzdGFydC4gKi8KLQlzZWMgPSBNU1RLX1JFR19TRUMocmVncyk7Ci0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQl3aGlsZSAoc2VjID09IE1TVEtfUkVHX1NFQyhyZWdzKSkKLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDAwMDsgY291bnQrKykKLQkJCQkvKiBub3RoaW5nICovIDsKLQkJcHJvbV9wcmludGYoIi4iKTsKLQkJc2VjID0gTVNUS19SRUdfU0VDKHJlZ3MpOwotCX0KLQlwcm9tX3ByaW50ZigiXG4iKTsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCS8qIFR1cm4gb2ZmIGtpY2sgc3RhcnQgYW5kIHNldCBhICJ2YWxpZCIgdGltZSBhbmQgZGF0ZS4gKi8KLQl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0NSRUcpOwotCXRtcCB8PSBNU1RLX0NSRUdfV1JJVEU7Ci0JbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0hPVVIpOwotCXRtcCAmPSB+TVNUS19LSUNLX1NUQVJUOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0hPVVIsIHRtcCk7Ci0JTVNUS19TRVRfUkVHX1NFQyhyZWdzLDApOwotCU1TVEtfU0VUX1JFR19NSU4ocmVncywwKTsKLQlNU1RLX1NFVF9SRUdfSE9VUihyZWdzLDApOwotCU1TVEtfU0VUX1JFR19ET1cocmVncyw1KTsKLQlNU1RLX1NFVF9SRUdfRE9NKHJlZ3MsMSk7Ci0JTVNUS19TRVRfUkVHX01PTlRIKHJlZ3MsOCk7Ci0JTVNUS19TRVRfUkVHX1lFQVIocmVncywxOTk2IC0gTVNUS19ZRUFSX1pFUk8pOwotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JdG1wICY9IH5NU1RLX0NSRUdfV1JJVEU7Ci0JbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmbW9zdGVrX2xvY2spOwotCi0JLyogRW5zdXJlIHRoZSBraWNrIHN0YXJ0IGJpdCBpcyBvZmYuIElmIGl0IGlzbid0LCB0dXJuIGl0IG9mZi4gKi8KLQl3aGlsZSAobW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19IT1VSKSAmIE1TVEtfS0lDS19TVEFSVCkgewotCQlwcm9tX3ByaW50ZigiQ0xPQ0s6IEtpY2sgc3RhcnQgc3RpbGwgb24hXG4iKTsKLQotCQlzcGluX2xvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0KLQkJdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQkJdG1wIHw9IE1TVEtfQ1JFR19XUklURTsKLQkJbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQotCQl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0hPVVIpOwotCQl0bXAgJj0gfk1TVEtfS0lDS19TVEFSVDsKLQkJbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfSE9VUiwgdG1wKTsKLQotCQl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0NSRUcpOwotCQl0bXAgJj0gfk1TVEtfQ1JFR19XUklURTsKLQkJbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQotCQlzcGluX3VubG9ja19pcnEoJm1vc3Rla19sb2NrKTsKKwlpZiAocnRjKSB7CisJCWVyciA9IHJ0Y19zZXRfbW1zcyhydGMsIG5vdy50dl9zZWMpOworCQlydGNfY2xhc3NfY2xvc2UocnRjKTsKIAl9CiAKLQlwcm9tX3ByaW50ZigiQ0xPQ0s6IEtpY2sgc3RhcnQgcHJvY2VkdXJlIHN1Y2Nlc3NmdWwuXG4iKTsKKwlyZXR1cm4gZXJyOwogfQogCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgY2xvY2sgY2hpcCBiYXR0ZXJ5IGlzIGxvdy4gKi8KLXN0YXRpYyBpbnQgX19pbml0IGhhc19sb3dfYmF0dGVyeSh2b2lkKQordW5zaWduZWQgbG9uZyBjbW9zX3JlZ3M7CitFWFBPUlRfU1lNQk9MKGNtb3NfcmVncyk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX2Ntb3NfcmVzb3VyY2U7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19jbW9zX2RldmljZSA9IHsKKwkubmFtZQkJPSAicnRjX2Ntb3MiLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSAmcnRjX2Ntb3NfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgcnRjX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtc3RrNDh0MDJfcmVnczsKLQl1OCBkYXRhMSwgZGF0YTI7CisJc3RydWN0IHJlc291cmNlICpyOwogCi0Jc3Bpbl9sb2NrX2lycSgmbW9zdGVrX2xvY2spOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBSVEMgcmVncyBhdCAweCVseFxuIiwKKwkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwgb3AtPnJlc291cmNlWzBdLnN0YXJ0KTsKIAotCWRhdGExID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19FRVBST00pOwkvKiBSZWFkIHNvbWUgZGF0YS4gKi8KLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19FRVBST00sIH5kYXRhMSk7CS8qIFdyaXRlIGJhY2sgdGhlIGNvbXBsZW1lbnQuICovCi0JZGF0YTIgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0VFUFJPTSk7CS8qIFJlYWQgYmFjayB0aGUgY29tcGxlbWVudC4gKi8KLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19FRVBST00sIGRhdGExKTsJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZS4gKi8KLQotCXNwaW5fdW5sb2NrX2lycSgmbW9zdGVrX2xvY2spOwotCi0JcmV0dXJuIChkYXRhMSA9PSBkYXRhMik7CS8qIFdhcyB0aGUgd3JpdGUgYmxvY2tlZD8gKi8KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG1vc3Rla19zZXRfc3lzdGVtX3RpbWUodm9pZCBfX2lvbWVtICptcmVncykKLXsKLQl1bnNpZ25lZCBpbnQgeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjOwotCXU4IHRtcDsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCS8qIFRyYWRpdGlvbmFsIE1vc3RlayBjaGlwLiAqLwotCXRtcCA9IG1vc3Rla19yZWFkKG1yZWdzICsgTU9TVEVLX0NSRUcpOwotCXRtcCB8PSBNU1RLX0NSRUdfUkVBRDsKLQltb3N0ZWtfd3JpdGUobXJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQotCXNlYyA9IE1TVEtfUkVHX1NFQyhtcmVncyk7Ci0JbWluID0gTVNUS19SRUdfTUlOKG1yZWdzKTsKLQlob3VyID0gTVNUS19SRUdfSE9VUihtcmVncyk7Ci0JZGF5ID0gTVNUS19SRUdfRE9NKG1yZWdzKTsKLQltb24gPSBNU1RLX1JFR19NT05USChtcmVncyk7Ci0JeWVhciA9IE1TVEtfQ1ZUX1lFQVIoIE1TVEtfUkVHX1lFQVIobXJlZ3MpICk7Ci0KLQl4dGltZS50dl9zZWMgPSBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKLQl4dGltZS50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAotIAkgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7Ci0KLQl0bXAgPSBtb3N0ZWtfcmVhZChtcmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgJj0gfk1TVEtfQ1JFR19SRUFEOwotCW1vc3Rla193cml0ZShtcmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci19Ci0KLS8qIFByb2JlIGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrIGNoaXAuICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X3N5c3RlbV90aW1lKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKLQl2b2lkIF9faW9tZW0gKm1yZWdzID0gbXN0azQ4dDAyX3JlZ3M7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSBkczEyODdfcmVnczsKLQl2b2lkIF9faW9tZW0gKmJyZWdzID0gYnE0ODAyX3JlZ3M7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSAwVUw7Ci0Jdm9pZCBfX2lvbWVtICpicmVncyA9IDBVTDsKLSNlbmRpZgotCi0JaWYgKCFtcmVncyAmJiAhZHJlZ3MgJiYgIWJyZWdzKSB7Ci0JCXByb21fcHJpbnRmKCJTb21ldGhpbmcgd3JvbmcsIGNsb2NrIHJlZ3Mgbm90IG1hcHBlZCB5ZXQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQkJCi0KLQlpZiAobXJlZ3MpIHsKLQkJbW9zdGVrX3NldF9zeXN0ZW1fdGltZShtcmVncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYnJlZ3MpIHsKLQkJdW5zaWduZWQgY2hhciB2YWwgPSByZWFkYihicmVncyArIDB4MGUpOwotCQl1bnNpZ25lZCBpbnQgY2VudHVyeTsKLQotCQkvKiBCUTQ4MDIgUlRDIGNoaXAuICovCi0KLQkJd3JpdGViKHZhbCB8IDB4MDgsIGJyZWdzICsgMHgwZSk7Ci0KLQkJc2VjICA9IHJlYWRiKGJyZWdzICsgMHgwMCk7Ci0JCW1pbiAgPSByZWFkYihicmVncyArIDB4MDIpOwotCQlob3VyID0gcmVhZGIoYnJlZ3MgKyAweDA0KTsKLQkJZGF5ICA9IHJlYWRiKGJyZWdzICsgMHgwNik7Ci0JCW1vbiAgPSByZWFkYihicmVncyArIDB4MDkpOwotCQl5ZWFyID0gcmVhZGIoYnJlZ3MgKyAweDBhKTsKLQkJY2VudHVyeSA9IHJlYWRiKGJyZWdzICsgMHgwZik7Ci0KLQkJd3JpdGViKHZhbCwgYnJlZ3MgKyAweDBlKTsKLQotCQlCQ0RfVE9fQklOKHNlYyk7Ci0JCUJDRF9UT19CSU4obWluKTsKLQkJQkNEX1RPX0JJTihob3VyKTsKLQkJQkNEX1RPX0JJTihkYXkpOwotCQlCQ0RfVE9fQklOKG1vbik7Ci0JCUJDRF9UT19CSU4oeWVhcik7Ci0JCUJDRF9UT19CSU4oY2VudHVyeSk7Ci0KLQkJeWVhciArPSAoY2VudHVyeSAqIDEwMCk7Ci0JfSBlbHNlIHsKLQkJLyogRGFsbGFzIDEyODg3IFJUQyBjaGlwLiAqLwotCi0JCWRvIHsKLQkJCXNlYyAgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFMpOwotCQkJbWluICA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7Ci0JCQlob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7Ci0JCQlkYXkgID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOwotCQkJbW9uICA9IENNT1NfUkVBRChSVENfTU9OVEgpOwotCQkJeWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7Ci0JCX0gd2hpbGUgKHNlYyAhPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFMpKTsKLQotCQlpZiAoIShDTU9TX1JFQUQoUlRDX0NPTlRST0wpICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpIHsKLQkJCUJDRF9UT19CSU4oc2VjKTsKLQkJCUJDRF9UT19CSU4obWluKTsKLQkJCUJDRF9UT19CSU4oaG91cik7Ci0JCQlCQ0RfVE9fQklOKGRheSk7Ci0JCQlCQ0RfVE9fQklOKG1vbik7Ci0JCQlCQ0RfVE9fQklOKHllYXIpOwotCQl9Ci0JCWlmICgoeWVhciArPSAxOTAwKSA8IDE5NzApCi0JCQl5ZWFyICs9IDEwMDsKLQl9Ci0KLQl4dGltZS50dl9zZWMgPSBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKLQl4dGltZS50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAotIAkgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7Ci19Ci0KLS8qIGRhdmVtIHN1Z2dlc3RzIHdlIGtlZXAgdGhpcyB3aXRoaW4gdGhlIDRNIGxvY2tlZCBrZXJuZWwgaW1hZ2UgKi8KLXN0YXRpYyB1MzIgc3RhcmZpcmVfZ2V0X3RpbWUodm9pZCkKLXsKLQlzdGF0aWMgY2hhciBvYnBfZ2V0dG9kWzMyXTsKLQlzdGF0aWMgdTMyIHVuaXhfdG9kOwotCi0Jc3ByaW50ZihvYnBfZ2V0dG9kLCAiaCMgJTA4eCB1bml4LWdldHRvZCIsCi0JCSh1bnNpZ25lZCBpbnQpIChsb25nKSAmdW5peF90b2QpOwotCXByb21fZmV2YWwob2JwX2dldHRvZCk7Ci0KLQlyZXR1cm4gdW5peF90b2Q7Ci19Ci0KLXN0YXRpYyBpbnQgc3RhcmZpcmVfc2V0X3RpbWUodTMyIHZhbCkKLXsKLQkvKiBEbyBub3RoaW5nLCB0aW1lIGlzIHNldCB1c2luZyB0aGUgc2VydmljZSBwcm9jZXNzb3IKLQkgKiBjb25zb2xlIG9uIHRoaXMgcGxhdGZvcm0uCisJLyogVGhlIENNT1MgUlRDIGRyaXZlciBvbmx5IGFjY2VwdHMgSU9SRVNPVVJDRV9JTywgc28gY29ucworCSAqIHVwIGEgZmFrZSByZXNvdXJjZSBzbyB0aGF0IHRoZSBwcm9iZSB3b3JrcyBmb3IgYWxsIGNhc2VzLgorCSAqIFdoZW4gdGhlIFJUQyBpcyBiZWhpbmQgYW4gSVNBIGJ1cyBpdCB3aWxsIGhhdmUgSU9SRVNPVVJDRV9JTworCSAqIGFscmVhZHksIHdoZXJlYXMgd2hlbiBpdCdzIGJlaGluZCBFQlVTIGlzIHdpbGwgYmUgSU9SRVNPVVJDRV9NRU0uCiAJICovCi0JcmV0dXJuIDA7CisKKwlyID0gJnJ0Y19jbW9zX3Jlc291cmNlOworCXItPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwlyLT5uYW1lID0gb3AtPnJlc291cmNlWzBdLm5hbWU7CisJci0+c3RhcnQgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJci0+ZW5kID0gb3AtPnJlc291cmNlWzBdLmVuZDsKKworCWNtb3NfcmVncyA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfY21vc19kZXZpY2UpOwogfQogCi1zdGF0aWMgdTMyIGh5cGVydmlzb3JfZ2V0X3RpbWUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJldCwgdGltZTsKLQlpbnQgcmV0cmllcyA9IDEwMDAwOworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBydGNfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0YyIsCisJCS5jb21wYXRpYmxlID0gIm01ODE5IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAicnRjIiwKKwkJLmNvbXBhdGlibGUgPSAiaXNhLW01ODE5cCIsCisJfSwKKwl7CisJCS5uYW1lID0gInJ0YyIsCisJCS5jb21wYXRpYmxlID0gImlzYS1tNTgyM3AiLAorCX0sCisJeworCQkubmFtZSA9ICJydGMiLAorCQkuY29tcGF0aWJsZSA9ICJkczEyODciLAorCX0sCisJe30sCit9OwogCi1yZXRyeToKLQlyZXQgPSBzdW40dl90b2RfZ2V0KCZ0aW1lKTsKLQlpZiAocmV0ID09IEhWX0VPSykKLQkJcmV0dXJuIHRpbWU7Ci0JaWYgKHJldCA9PSBIVl9FV09VTERCTE9DSykgewotCQlpZiAoLS1yZXRyaWVzID4gMCkgewotCQkJdWRlbGF5KDEwMCk7Ci0JCQlnb3RvIHJldHJ5OwotCQl9Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNVTjRWOiB0b2RfZ2V0KCkgdGltZWQgb3V0LlxuIik7Ci0JCXJldHVybiAwOworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgcnRjX2RyaXZlciA9IHsKKwkubWF0Y2hfdGFibGUJPSBydGNfbWF0Y2gsCisJLnByb2JlCQk9IHJ0Y19wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2JxNDgwMl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInJ0Yy1icTQ4MDIiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBicTQ4MDJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJRNDgwMiByZWdzIGF0IDB4JWx4XG4iLAorCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOworCisJcnRjX2JxNDgwMl9kZXZpY2UucmVzb3VyY2UgPSAmb3AtPnJlc291cmNlWzBdOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJ0Y19icTQ4MDJfZGV2aWNlKTsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBicTQ4MDJfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0YyIsCisJCS5jb21wYXRpYmxlID0gImJxNDgwMiIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGJxNDgwMl9kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlCT0gYnE0ODAyX21hdGNoLAorCS5wcm9iZQkJPSBicTQ4MDJfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImJxNDgwMiIsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1vc3Rla19yZWFkX2J5dGUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlyZWdzID0gKHZvaWQgX19pb21lbSAqKSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwl2YWwgPSByZWFkYihyZWdzICsgb2ZzKTsKKworCS8qIHRoZSB5ZWFyIDAgaXMgMTk2OCAqLworCWlmIChvZnMgPT0gcGRhdGEtPm9mZnNldCArIE00OFQ1OV9ZRUFSKSB7CisJCXZhbCArPSAweDY4OworCQlpZiAoKHZhbCAmIDB4ZikgPiA5KQorCQkJdmFsICs9IDY7CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgIlNVTjRWOiB0b2RfZ2V0KCkgbm90IHN1cHBvcnRlZC5cbiIpOwotCXJldHVybiAwOworCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBpbnQgaHlwZXJ2aXNvcl9zZXRfdGltZSh1MzIgc2VjcykKK3N0YXRpYyB2b2lkIG1vc3Rla193cml0ZV9ieXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcywgdTggdmFsKQogewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCWludCByZXRyaWVzID0gMTAwMDA7Ci0KLXJldHJ5OgotCXJldCA9IHN1bjR2X3RvZF9zZXQoc2Vjcyk7Ci0JaWYgKHJldCA9PSBIVl9FT0spCi0JCXJldHVybiAwOwotCWlmIChyZXQgPT0gSFZfRVdPVUxEQkxPQ0spIHsKLQkJaWYgKC0tcmV0cmllcyA+IDApIHsKLQkJCXVkZWxheSgxMDApOwotCQkJZ290byByZXRyeTsKLQkJfQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVU40VjogdG9kX3NldCgpIHRpbWVkIG91dC5cbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiU1VONFY6IHRvZF9zZXQoKSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjbG9ja19tb2RlbF9tYXRjaGVzKGNvbnN0IGNoYXIgKm1vZGVsKQotewotCWlmIChzdHJjbXAobW9kZWwsICJtazQ4dDAyIikgJiYKLQkgICAgc3RyY21wKG1vZGVsLCAibWs0OHQwOCIpICYmCi0JICAgIHN0cmNtcChtb2RlbCwgIm1rNDh0NTkiKSAmJgotCSAgICBzdHJjbXAobW9kZWwsICJtNTgxOSIpICYmCi0JICAgIHN0cmNtcChtb2RlbCwgIm01ODE5cCIpICYmCi0JICAgIHN0cmNtcChtb2RlbCwgIm01ODIzIikgJiYKLQkgICAgc3RyY21wKG1vZGVsLCAiZHMxMjg3IikgJiYKLQkgICAgc3RyY21wKG1vZGVsLCAiYnE0ODAyIikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGNsb2NrX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7Ci0JY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOwotCWNvbnN0IGNoYXIgKmNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImNvbXBhdGlibGUiLCBOVUxMKTsKLQl1bnNpZ25lZCBsb25nIHNpemUsIGZsYWdzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAKLQlpZiAoIW1vZGVsKQotCQltb2RlbCA9IGNvbXBhdDsKKwlyZWdzID0gKHZvaWQgX19pb21lbSAqKSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwlpZiAob2ZzID09IHBkYXRhLT5vZmZzZXQgKyBNNDhUNTlfWUVBUikgeworCQlpZiAodmFsIDwgMHg2OCkKKwkJCXZhbCArPSAweDMyOworCQllbHNlCisJCQl2YWwgLT0gMHg2ODsKKwkJaWYgKCh2YWwgJiAweGYpID4gOSkKKwkJCXZhbCArPSA2OworCQlpZiAoKHZhbCAmIDB4ZjApID4gMHg5QSkKKwkJCXZhbCArPSAweDYwOworCX0KKwl3cml0ZWIodmFsLCByZWdzICsgb2ZzKTsKK30KIAotCWlmICghbW9kZWwgfHwgIWNsb2NrX21vZGVsX21hdGNoZXMobW9kZWwpKQotCQlyZXR1cm4gLUVOT0RFVjsKK3N0YXRpYyBzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSBtNDh0NTlfZGF0YSA9IHsKKwkucmVhZF9ieXRlCT0gbW9zdGVrX3JlYWRfYnl0ZSwKKwkud3JpdGVfYnl0ZQk9IG1vc3Rla193cml0ZV9ieXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbTQ4dDU5X3J0YyA9IHsKKwkubmFtZQkJPSAicnRjLW00OHQ1OSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJm00OHQ1OV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtb3N0ZWtfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAogCS8qIE9uIGFuIEVudGVycHJpc2Ugc3lzdGVtIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtb3N0ZWsgY2xvY2tzLgogCSAqIFdlIHNob3VsZCBvbmx5IG1hdGNoIHRoZSBvbmUgdGhhdCBpcyBvbiB0aGUgY2VudHJhbCBGSEMgYnVzLgpAQCAtNzIwLDg4ICs1NjQsNTEgQEAKIAkgICAgc3RyY21wKGRwLT5wYXJlbnQtPnBhcmVudC0+bmFtZSwgImNlbnRyYWwiKSAhPSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXNpemUgPSAob3AtPnJlc291cmNlWzBdLmVuZCAtIG9wLT5yZXNvdXJjZVswXS5zdGFydCkgKyAxOwotCXJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIHNpemUsICJjbG9jayIpOwotCWlmICghcmVncykKLQkJcmV0dXJuIC1FTk9NRU07CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vc3RlayByZWdzIGF0IDB4JWx4XG4iLAorCSAgICAgICBkcC0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWlmICghc3RyY21wKG1vZGVsLCAiZHMxMjg3IikgfHwKLQkgICAgIXN0cmNtcChtb2RlbCwgIm01ODE5IikgfHwKLQkgICAgIXN0cmNtcChtb2RlbCwgIm01ODE5cCIpIHx8Ci0JICAgICFzdHJjbXAobW9kZWwsICJtNTgyMyIpKSB7Ci0JCWRzMTI4N19yZWdzID0gKHVuc2lnbmVkIGxvbmcpIHJlZ3M7Ci0JfSBlbHNlIGlmICghc3RyY21wKG1vZGVsLCAiYnE0ODAyIikpIHsKLQkJYnE0ODAyX3JlZ3MgPSByZWdzOwotCX0gZWxzZQotI2VuZGlmCi0JaWYgKG1vZGVsWzVdID09ICcwJyAmJiBtb2RlbFs2XSA9PSAnMicpIHsKLQkJbXN0azQ4dDAyX3JlZ3MgPSByZWdzOwotCX0gZWxzZSBpZihtb2RlbFs1XSA9PSAnMCcgJiYgbW9kZWxbNl0gPT0gJzgnKSB7Ci0JCW1zdGs0OHQwOF9yZWdzID0gcmVnczsKLQkJbXN0azQ4dDAyX3JlZ3MgPSBtc3RrNDh0MDhfcmVncyArIE1PU1RFS180OFQwOF80OFQwMjsKLQl9IGVsc2UgewotCQltc3RrNDh0NTlfcmVncyA9IHJlZ3M7Ci0JCW1zdGs0OHQwMl9yZWdzID0gbXN0azQ4dDU5X3JlZ3MgKyBNT1NURUtfNDhUNTlfNDhUMDI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENsb2NrIHJlZ3MgYXQgJXBcbiIsIGRwLT5mdWxsX25hbWUsIHJlZ3MpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKG1zdGs0OHQwMl9yZWdzICE9IE5VTEwpIHsKLQkJLyogUmVwb3J0IGEgbG93IGJhdHRlcnkgdm9sdGFnZSBjb25kaXRpb24uICovCi0JCWlmIChoYXNfbG93X2JhdHRlcnkoKSkKLQkJCXByb21fcHJpbnRmKCJOVlJBTTogTG93IGJhdHRlcnkgdm9sdGFnZSFcbiIpOwotCi0JCS8qIEtpY2sgc3RhcnQgdGhlIGNsb2NrIGlmIGl0IGlzIGNvbXBsZXRlbHkgc3RvcHBlZC4gKi8KLQkJaWYgKG1vc3Rla19yZWFkKG1zdGs0OHQwMl9yZWdzICsgTU9TVEVLX1NFQykgJiBNU1RLX1NUT1ApCi0JCQlraWNrX3N0YXJ0X2Nsb2NrKCk7Ci0JfQotCi0Jc2V0X3N5c3RlbV90aW1lKCk7Ci0JCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDA7CisJbTQ4dDU5X3J0Yy5yZXNvdXJjZSA9ICZvcC0+cmVzb3VyY2VbMF07CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbTQ4dDU5X3J0Yyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNsb2NrX21hdGNoW10gPSB7CitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG1vc3Rla19tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiZWVwcm9tIiwKIAl9LAotCXsKLQkJLm5hbWUgPSAicnRjIiwKLQl9LAogCXt9LAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgY2xvY2tfZHJpdmVyID0gewotCS5tYXRjaF90YWJsZQk9IGNsb2NrX21hdGNoLAotCS5wcm9iZQkJPSBjbG9ja19wcm9iZSwKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG1vc3Rla19kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlCT0gbW9zdGVrX21hdGNoLAorCS5wcm9iZQkJPSBtb3N0ZWtfcHJvYmUsCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImNsb2NrIiwKKwkJLm5hbWUJPSAibW9zdGVrIiwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX3N1bjR2X2RldmljZSA9IHsKKwkubmFtZQkJPSAicnRjLXN1bjR2IiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfc3RhcmZpcmVfZGV2aWNlID0geworCS5uYW1lCQk9ICJydGMtc3RhcmZpcmUiLAorCS5pZAkJPSAtMSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGNsb2NrX2luaXQodm9pZCkKIHsKLQlpZiAodGhpc19pc19zdGFyZmlyZSkgewotCQl4dGltZS50dl9zZWMgPSBzdGFyZmlyZV9nZXRfdGltZSgpOwotCQl4dGltZS50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0JCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKLQkJeHRpbWUudHZfc2VjID0gaHlwZXJ2aXNvcl9nZXRfdGltZSgpOwotCQl4dGltZS50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0JCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKHRoaXNfaXNfc3RhcmZpcmUpCisJCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJ0Y19zdGFyZmlyZV9kZXZpY2UpOwogCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmY2xvY2tfZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOworCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKQorCQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfc3VuNHZfZGV2aWNlKTsKKworCSh2b2lkKSBvZl9yZWdpc3Rlcl9kcml2ZXIoJnJ0Y19kcml2ZXIsICZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7CisJKHZvaWQpIG9mX3JlZ2lzdGVyX2RyaXZlcigmbW9zdGVrX2RyaXZlciwgJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKKwkodm9pZCkgb2ZfcmVnaXN0ZXJfZHJpdmVyKCZicTQ4MDJfZHJpdmVyLCAmb2ZfcGxhdGZvcm1fYnVzX3R5cGUpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIE11c3QgYmUgYWZ0ZXIgc3Vic3lzX2luaXRjYWxsKCkgc28gdGhhdCBidXNzZXMgYXJlIHByb2JlZC4gIE11c3QKQEAgLTgxNCw3ICs2MjEsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF9pbml0X3RpbWVycyh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0JdW5zaWduZWQgbG9uZyBjbG9jazsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CiAKIAlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJaWYgKHRsYl90eXBlID09IHNwaXRmaXJlKSB7CkBAIC04MjcsMTcgKzYzNCwxNyBAQAogCQlpZiAobWFudWYgPT0gMHgxNyAmJiBpbXBsID09IDB4MTMpIHsKIAkJCS8qIEh1bW1pbmdiaXJkLCBha2EgVWx0cmEtSUllICovCiAJCQl0aWNrX29wcyA9ICZoYnRpY2tfb3BlcmF0aW9uczsKLQkJCWNsb2NrID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic3RpY2stZnJlcXVlbmN5IiwgMCk7CisJCQlmcmVxID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic3RpY2stZnJlcXVlbmN5IiwgMCk7CiAJCX0gZWxzZSB7CiAJCQl0aWNrX29wcyA9ICZ0aWNrX29wZXJhdGlvbnM7Ci0JCQljbG9jayA9IGxvY2FsX2NwdV9kYXRhKCkuY2xvY2tfdGljazsKKwkJCWZyZXEgPSBsb2NhbF9jcHVfZGF0YSgpLmNsb2NrX3RpY2s7CiAJCX0KIAl9IGVsc2UgewogCQl0aWNrX29wcyA9ICZzdGlja19vcGVyYXRpb25zOwotCQljbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIDApOworCQlmcmVxID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic3RpY2stZnJlcXVlbmN5IiwgMCk7CiAJfQogCi0JcmV0dXJuIGNsb2NrOworCXJldHVybiBmcmVxOwogfQogCiBzdHJ1Y3QgZnJlcV90YWJsZSB7CkBAIC0xMDI5LDE2ICs4MzYsMTYgQEAKIAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjbG9jayA9IHNwYXJjNjRfaW5pdF90aW1lcnMoKTsKKwl1bnNpZ25lZCBsb25nIGZyZXEgPSBzcGFyYzY0X2luaXRfdGltZXJzKCk7CiAKLQl0Yl90aWNrc19wZXJfdXNlYyA9IGNsb2NrIC8gVVNFQ19QRVJfU0VDOworCXRiX3RpY2tzX3Blcl91c2VjID0gZnJlcSAvIFVTRUNfUEVSX1NFQzsKIAogCXRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50ID0KLQkJY2xvY2tzb3VyY2VfaHoybXVsdChjbG9jaywgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpOworCQljbG9ja3NvdXJjZV9oejJtdWx0KGZyZXEsIFNQQVJDNjRfTlNFQ19QRVJfQ1lDX1NISUZUKTsKIAogCWNsb2Nrc291cmNlX3RpY2submFtZSA9IHRpY2tfb3BzLT5uYW1lOwogCWNsb2Nrc291cmNlX3RpY2subXVsdCA9Ci0JCWNsb2Nrc291cmNlX2h6Mm11bHQoY2xvY2ssCisJCWNsb2Nrc291cmNlX2h6Mm11bHQoZnJlcSwKIAkJCQkgICAgY2xvY2tzb3VyY2VfdGljay5zaGlmdCk7CiAJY2xvY2tzb3VyY2VfdGljay5yZWFkID0gdGlja19vcHMtPmdldF90aWNrOwogCkBAIC0xMDQ5LDcgKzg1Niw3IEBACiAKIAlzcGFyYzY0X2Nsb2NrZXZlbnQubmFtZSA9IHRpY2tfb3BzLT5uYW1lOwogCi0Jc2V0dXBfY2xvY2tldmVudF9tdWx0aXBsaWVyKGNsb2NrKTsKKwlzZXR1cF9jbG9ja2V2ZW50X211bHRpcGxpZXIoZnJlcSk7CiAKIAlzcGFyYzY0X2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucygweDdmZmZmZmZmZmZmZmZmZmZVTCwgJnNwYXJjNjRfY2xvY2tldmVudCk7CkBAIC0xMDcwLDY3MiArODc3LDggQEAKIAkJPj4gU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQ7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKLXsKLQlpbnQgcmVhbF9zZWNvbmRzLCByZWFsX21pbnV0ZXMsIGNoaXBfbWludXRlczsKLQl2b2lkIF9faW9tZW0gKm1yZWdzID0gbXN0azQ4dDAyX3JlZ3M7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSBkczEyODdfcmVnczsKLQl2b2lkIF9faW9tZW0gKmJyZWdzID0gYnE0ODAyX3JlZ3M7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSAwVUw7Ci0Jdm9pZCBfX2lvbWVtICpicmVncyA9IDBVTDsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggdG1wOwotCi0JLyogCi0JICogTm90IGhhdmluZyBhIHJlZ2lzdGVyIHNldCBjYW4gbGVhZCB0byB0cm91YmxlLgotCSAqIEFsc28gc3RhcmZpcmUgZG9lc24ndCBoYXZlIGEgdG9kIGNsb2NrLgotCSAqLwotCWlmICghbXJlZ3MgJiYgIWRyZWdzICYmICFicmVncykKLQkJcmV0dXJuIC0xOwotCi0JaWYgKG1yZWdzKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtb3N0ZWtfbG9jaywgZmxhZ3MpOwotCi0JCS8qIFJlYWQgdGhlIGN1cnJlbnQgUlRDIG1pbnV0ZXMuICovCi0JCXRtcCA9IG1vc3Rla19yZWFkKG1yZWdzICsgTU9TVEVLX0NSRUcpOwotCQl0bXAgfD0gTVNUS19DUkVHX1JFQUQ7Ci0JCW1vc3Rla193cml0ZShtcmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0JCWNoaXBfbWludXRlcyA9IE1TVEtfUkVHX01JTihtcmVncyk7Ci0KLQkJdG1wID0gbW9zdGVrX3JlYWQobXJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JCXRtcCAmPSB+TVNUS19DUkVHX1JFQUQ7Ci0JCW1vc3Rla193cml0ZShtcmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0JCS8qCi0JCSAqIHNpbmNlIHdlJ3JlIG9ubHkgYWRqdXN0aW5nIG1pbnV0ZXMgYW5kIHNlY29uZHMsCi0JCSAqIGRvbid0IGludGVyZmVyZSB3aXRoIGhvdXIgb3ZlcmZsb3cuIFRoaXMgYXZvaWRzCi0JCSAqIG1lc3Npbmcgd2l0aCB1bmtub3duIHRpbWUgem9uZXMgYnV0IHJlcXVpcmVzIHlvdXIKLQkJICogUlRDIG5vdCB0byBiZSBvZmYgYnkgbW9yZSB0aGFuIDE1IG1pbnV0ZXMKLQkJICovCi0JCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKLQkJcmVhbF9taW51dGVzID0gbm93dGltZSAvIDYwOwotCQlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gY2hpcF9taW51dGVzKSArIDE1KS8zMCkgJiAxKQotCQkJcmVhbF9taW51dGVzICs9IDMwOwkvKiBjb3JyZWN0IGZvciBoYWxmIGhvdXIgdGltZSB6b25lICovCi0JCXJlYWxfbWludXRlcyAlPSA2MDsKLQotCQlpZiAoYWJzKHJlYWxfbWludXRlcyAtIGNoaXBfbWludXRlcykgPCAzMCkgewotCQkJdG1wID0gbW9zdGVrX3JlYWQobXJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JCQl0bXAgfD0gTVNUS19DUkVHX1dSSVRFOwotCQkJbW9zdGVrX3dyaXRlKG1yZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7Ci0KLQkJCU1TVEtfU0VUX1JFR19TRUMobXJlZ3MscmVhbF9zZWNvbmRzKTsKLQkJCU1TVEtfU0VUX1JFR19NSU4obXJlZ3MscmVhbF9taW51dGVzKTsKLQotCQkJdG1wID0gbW9zdGVrX3JlYWQobXJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JCQl0bXAgJj0gfk1TVEtfQ1JFR19XUklURTsKLQkJCW1vc3Rla193cml0ZShtcmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3N0ZWtfbG9jaywgZmxhZ3MpOwotCi0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vc3Rla19sb2NrLCBmbGFncyk7Ci0KLQkJCXJldHVybiAtMTsKLQkJfQotCX0gZWxzZSBpZiAoYnJlZ3MpIHsKLQkJaW50IHJldHZhbCA9IDA7Ci0JCXVuc2lnbmVkIGNoYXIgdmFsID0gcmVhZGIoYnJlZ3MgKyAweDBlKTsKLQotCQkvKiBCUTQ4MDIgUlRDIGNoaXAuICovCi0KLQkJd3JpdGViKHZhbCB8IDB4MDgsIGJyZWdzICsgMHgwZSk7Ci0KLQkJY2hpcF9taW51dGVzID0gcmVhZGIoYnJlZ3MgKyAweDAyKTsKLQkJQkNEX1RPX0JJTihjaGlwX21pbnV0ZXMpOwotCQlyZWFsX3NlY29uZHMgPSBub3d0aW1lICUgNjA7Ci0JCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKLQkJaWYgKCgoYWJzKHJlYWxfbWludXRlcyAtIGNoaXBfbWludXRlcykgKyAxNSkvMzApICYgMSkKLQkJCXJlYWxfbWludXRlcyArPSAzMDsKLQkJcmVhbF9taW51dGVzICU9IDYwOwotCi0JCWlmIChhYnMocmVhbF9taW51dGVzIC0gY2hpcF9taW51dGVzKSA8IDMwKSB7Ci0JCQlCSU5fVE9fQkNEKHJlYWxfc2Vjb25kcyk7Ci0JCQlCSU5fVE9fQkNEKHJlYWxfbWludXRlcyk7Ci0JCQl3cml0ZWIocmVhbF9zZWNvbmRzLCBicmVncyArIDB4MDApOwotCQkJd3JpdGViKHJlYWxfbWludXRlcywgYnJlZ3MgKyAweDAyKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKLQkJCSAgICAgICBjaGlwX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7Ci0JCQlyZXR2YWwgPSAtMTsKLQkJfQotCi0JCXdyaXRlYih2YWwsIGJyZWdzICsgMHgwZSk7Ci0KLQkJcmV0dXJuIHJldHZhbDsKLQl9IGVsc2UgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2wsIHNhdmVfZnJlcV9zZWxlY3Q7Ci0KLQkJLyogU3RvbGVuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMsIHNlZSB0aGVyZSBmb3IKLQkJICogY3JlZGl0cyBhbmQgZGVzY3JpcHRpdmUgY29tbWVudHMuCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQkJc2F2ZV9jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsgLyogdGVsbCB0aGUgY2xvY2sgaXQncyBiZWluZyBzZXQgKi8KLQkJQ01PU19XUklURSgoc2F2ZV9jb250cm9sfFJUQ19TRVQpLCBSVENfQ09OVFJPTCk7Ci0KLQkJc2F2ZV9mcmVxX3NlbGVjdCA9IENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpOyAvKiBzdG9wIGFuZCByZXNldCBwcmVzY2FsZXIgKi8KLQkJQ01PU19XUklURSgoc2F2ZV9mcmVxX3NlbGVjdHxSVENfRElWX1JFU0VUMiksIFJUQ19GUkVRX1NFTEVDVCk7Ci0KLQkJY2hpcF9taW51dGVzID0gQ01PU19SRUFEKFJUQ19NSU5VVEVTKTsKLQkJaWYgKCEoc2F2ZV9jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCi0JCQlCQ0RfVE9fQklOKGNoaXBfbWludXRlcyk7Ci0JCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKLQkJcmVhbF9taW51dGVzID0gbm93dGltZSAvIDYwOwotCQlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gY2hpcF9taW51dGVzKSArIDE1KS8zMCkgJiAxKQotCQkJcmVhbF9taW51dGVzICs9IDMwOwotCQlyZWFsX21pbnV0ZXMgJT0gNjA7Ci0KLQkJaWYgKGFicyhyZWFsX21pbnV0ZXMgLSBjaGlwX21pbnV0ZXMpIDwgMzApIHsKLQkJCWlmICghKHNhdmVfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKSB7Ci0JCQkJQklOX1RPX0JDRChyZWFsX3NlY29uZHMpOwotCQkJCUJJTl9UT19CQ0QocmVhbF9taW51dGVzKTsKLQkJCX0KLQkJCUNNT1NfV1JJVEUocmVhbF9zZWNvbmRzLFJUQ19TRUNPTkRTKTsKLQkJCUNNT1NfV1JJVEUocmVhbF9taW51dGVzLFJUQ19NSU5VVEVTKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKLQkJCSAgICAgICBjaGlwX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7Ci0JCQlyZXR2YWwgPSAtMTsKLQkJfQotCi0JCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sLCBSVENfQ09OVFJPTCk7Ci0JCUNNT1NfV1JJVEUoc2F2ZV9mcmVxX3NlbGVjdCwgUlRDX0ZSRVFfU0VMRUNUKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLX0KLQotI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1pbmlfcnRjX3N0YXR1czsJLyogYml0bWFwcGVkIHN0YXR1cyBieXRlLgkqLwotCi0jZGVmaW5lIEZFQlJVQVJZCTIKLSNkZWZpbmUJU1RBUlRPRlRJTUUJMTk3MAotI2RlZmluZSBTRUNEQVkJCTg2NDAwTAotI2RlZmluZSBTRUNZUgkJKFNFQ0RBWSAqIDM2NSkKLSNkZWZpbmUJbGVhcHllYXIoeWVhcikJCSgoeWVhcikgJSA0ID09IDAgJiYgXAotCQkJCSAoKHllYXIpICUgMTAwICE9IDAgfHwgKHllYXIpICUgNDAwID09IDApKQotI2RlZmluZQlkYXlzX2luX3llYXIoYSkgCShsZWFweWVhcihhKSA/IDM2NiA6IDM2NSkKLSNkZWZpbmUJZGF5c19pbl9tb250aChhKSAJKG1vbnRoX2RheXNbKGEpIC0gMV0pCi0KLXN0YXRpYyBpbnQgbW9udGhfZGF5c1sxMl0gPSB7Ci0JMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQotfTsKLQotLyoKLSAqIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdyZWdvcmlhbiBjYWxlbmRhciAtIGkuZS4gYWZ0ZXIgMTc1MiAoaW4gdGhlIFVLKQotICovCi1zdGF0aWMgdm9pZCBHcmVnb3JpYW5EYXkoc3RydWN0IHJ0Y190aW1lICogdG0pCi17Ci0JaW50IGxlYXBzVG9EYXRlOwotCWludCBsYXN0WWVhcjsKLQlpbnQgZGF5OwotCWludCBNb250aE9mZnNldFtdID0geyAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCB9OwotCi0JbGFzdFllYXIgPSB0bS0+dG1feWVhciAtIDE7Ci0KLQkvKgotCSAqIE51bWJlciBvZiBsZWFwIGNvcnJlY3Rpb25zIHRvIGFwcGx5IHVwIHRvIGVuZCBvZiBsYXN0IHllYXIKLQkgKi8KLQlsZWFwc1RvRGF0ZSA9IGxhc3RZZWFyIC8gNCAtIGxhc3RZZWFyIC8gMTAwICsgbGFzdFllYXIgLyA0MDA7Ci0KLQkvKgotCSAqIFRoaXMgeWVhciBpcyBhIGxlYXAgeWVhciBpZiBpdCBpcyBkaXZpc2libGUgYnkgNCBleGNlcHQgd2hlbiBpdCBpcwotCSAqIGRpdmlzaWJsZSBieSAxMDAgdW5sZXNzIGl0IGlzIGRpdmlzaWJsZSBieSA0MDAKLQkgKgotCSAqIGUuZy4gMTkwNCB3YXMgYSBsZWFwIHllYXIsIDE5MDAgd2FzIG5vdCwgMTk5NiBpcywgYW5kIDIwMDAgd2FzCi0JICovCi0JZGF5ID0gdG0tPnRtX21vbiA+IDIgJiYgbGVhcHllYXIodG0tPnRtX3llYXIpOwotCi0JZGF5ICs9IGxhc3RZZWFyKjM2NSArIGxlYXBzVG9EYXRlICsgTW9udGhPZmZzZXRbdG0tPnRtX21vbi0xXSArCi0JCSAgIHRtLT50bV9tZGF5OwotCi0JdG0tPnRtX3dkYXkgPSBkYXkgJSA3OwotfQotCi1zdGF0aWMgdm9pZCB0b190bShpbnQgdGltLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJlZ2lzdGVyIGludCAgICBpOwotCXJlZ2lzdGVyIGxvbmcgICBobXMsIGRheTsKLQotCWRheSA9IHRpbSAvIFNFQ0RBWTsKLQlobXMgPSB0aW0gJSBTRUNEQVk7Ci0KLQkvKiBIb3VycywgbWludXRlcywgc2Vjb25kcyBhcmUgZWFzeSAqLwotCXRtLT50bV9ob3VyID0gaG1zIC8gMzYwMDsKLQl0bS0+dG1fbWluID0gKGhtcyAlIDM2MDApIC8gNjA7Ci0JdG0tPnRtX3NlYyA9IChobXMgJSAzNjAwKSAlIDYwOwotCi0JLyogTnVtYmVyIG9mIHllYXJzIGluIGRheXMgKi8KLQlmb3IgKGkgPSBTVEFSVE9GVElNRTsgZGF5ID49IGRheXNfaW5feWVhcihpKTsgaSsrKQotCQlkYXkgLT0gZGF5c19pbl95ZWFyKGkpOwotCXRtLT50bV95ZWFyID0gaTsKLQotCS8qIE51bWJlciBvZiBtb250aHMgaW4gZGF5cyBsZWZ0ICovCi0JaWYgKGxlYXB5ZWFyKHRtLT50bV95ZWFyKSkKLQkJZGF5c19pbl9tb250aChGRUJSVUFSWSkgPSAyOTsKLQlmb3IgKGkgPSAxOyBkYXkgPj0gZGF5c19pbl9tb250aChpKTsgaSsrKQotCQlkYXkgLT0gZGF5c19pbl9tb250aChpKTsKLQlkYXlzX2luX21vbnRoKEZFQlJVQVJZKSA9IDI4OwotCXRtLT50bV9tb24gPSBpOwotCi0JLyogRGF5cyBhcmUgd2hhdCBpcyBsZWZ0IG92ZXIgKCsxKSBmcm9tIGFsbCB0aGF0LiAqLwotCXRtLT50bV9tZGF5ID0gZGF5ICsgMTsKLQotCS8qCi0JICogRGV0ZXJtaW5lIHRoZSBkYXkgb2Ygd2VlawotCSAqLwotCUdyZWdvcmlhbkRheSh0bSk7Ci19Ci0KLS8qIEJvdGggU3RhcmZpcmUgYW5kIFNVTjRWIGdpdmUgdXMgc2Vjb25kcyBzaW5jZSBKYW4gMXN0LCAxOTcwLAotICogYWthIFVuaXggdGltZS4gIFNvIHdlIGhhdmUgdG8gY29udmVydCB0by9mcm9tIHJ0Y190aW1lLgotICovCi1zdGF0aWMgdm9pZCBzdGFyZmlyZV9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQotewotCXUzMiBzZWNvbmRzID0gc3RhcmZpcmVfZ2V0X3RpbWUoKTsKLQotCXRvX3RtKHNlY29uZHMsIHRpbWUpOwotCXRpbWUtPnRtX3llYXIgLT0gMTkwMDsKLQl0aW1lLT50bV9tb24gLT0gMTsKLX0KLQotc3RhdGljIGludCBzdGFyZmlyZV9zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQotewotCXUzMiBzZWNvbmRzID0gbWt0aW1lKHRpbWUtPnRtX3llYXIgKyAxOTAwLCB0aW1lLT50bV9tb24gKyAxLAotCQkJICAgICB0aW1lLT50bV9tZGF5LCB0aW1lLT50bV9ob3VyLAotCQkJICAgICB0aW1lLT50bV9taW4sIHRpbWUtPnRtX3NlYyk7Ci0KLQlyZXR1cm4gc3RhcmZpcmVfc2V0X3RpbWUoc2Vjb25kcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGh5cGVydmlzb3JfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKLXsKLQl1MzIgc2Vjb25kcyA9IGh5cGVydmlzb3JfZ2V0X3RpbWUoKTsKLQotCXRvX3RtKHNlY29uZHMsIHRpbWUpOwotCXRpbWUtPnRtX3llYXIgLT0gMTkwMDsKLQl0aW1lLT50bV9tb24gLT0gMTsKLX0KLQotc3RhdGljIGludCBoeXBlcnZpc29yX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCi17Ci0JdTMyIHNlY29uZHMgPSBta3RpbWUodGltZS0+dG1feWVhciArIDE5MDAsIHRpbWUtPnRtX21vbiArIDEsCi0JCQkgICAgIHRpbWUtPnRtX21kYXksIHRpbWUtPnRtX2hvdXIsCi0JCQkgICAgIHRpbWUtPnRtX21pbiwgdGltZS0+dG1fc2VjKTsKLQotCXJldHVybiBoeXBlcnZpc29yX3NldF90aW1lKHNlY29uZHMpOwotfQotCi0jaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHZvaWQgYnE0ODAyX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCi17Ci0JdW5zaWduZWQgY2hhciB2YWwgPSByZWFkYihicTQ4MDJfcmVncyArIDB4MGUpOwotCXVuc2lnbmVkIGludCBjZW50dXJ5OwotCi0Jd3JpdGViKHZhbCB8IDB4MDgsIGJxNDgwMl9yZWdzICsgMHgwZSk7Ci0KLQl0aW1lLT50bV9zZWMgPSByZWFkYihicTQ4MDJfcmVncyArIDB4MDApOwotCXRpbWUtPnRtX21pbiA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwMik7Ci0JdGltZS0+dG1faG91ciA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwNCk7Ci0JdGltZS0+dG1fbWRheSA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwNik7Ci0JdGltZS0+dG1fbW9uID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDA5KTsKLQl0aW1lLT50bV95ZWFyID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDBhKTsKLQl0aW1lLT50bV93ZGF5ID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDA4KTsKLQljZW50dXJ5ID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDBmKTsKLQotCXdyaXRlYih2YWwsIGJxNDgwMl9yZWdzICsgMHgwZSk7Ci0KLQlCQ0RfVE9fQklOKHRpbWUtPnRtX3NlYyk7Ci0JQkNEX1RPX0JJTih0aW1lLT50bV9taW4pOwotCUJDRF9UT19CSU4odGltZS0+dG1faG91cik7Ci0JQkNEX1RPX0JJTih0aW1lLT50bV9tZGF5KTsKLQlCQ0RfVE9fQklOKHRpbWUtPnRtX21vbik7Ci0JQkNEX1RPX0JJTih0aW1lLT50bV95ZWFyKTsKLQlCQ0RfVE9fQklOKHRpbWUtPnRtX3dkYXkpOwotCUJDRF9UT19CSU4oY2VudHVyeSk7Ci0KLQl0aW1lLT50bV95ZWFyICs9IChjZW50dXJ5ICogMTAwKTsKLQl0aW1lLT50bV95ZWFyIC09IDE5MDA7Ci0KLQl0aW1lLT50bV9tb24tLTsKLX0KLQotc3RhdGljIGludCBicTQ4MDJfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwZSk7Ci0JdW5zaWduZWQgY2hhciBzZWMsIG1pbiwgaHJzLCBkYXksIG1vbiwgeXJzLCBjZW50dXJ5OwotCXVuc2lnbmVkIGludCB5ZWFyOwotCi0JeWVhciA9IHRpbWUtPnRtX3llYXIgKyAxOTAwOwotCWNlbnR1cnkgPSB5ZWFyIC8gMTAwOwotCXlycyA9IHllYXIgJSAxMDA7Ci0KLQltb24gPSB0aW1lLT50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLwotCWRheSA9IHRpbWUtPnRtX21kYXk7Ci0JaHJzID0gdGltZS0+dG1faG91cjsKLQltaW4gPSB0aW1lLT50bV9taW47Ci0Jc2VjID0gdGltZS0+dG1fc2VjOwotCi0JQklOX1RPX0JDRChzZWMpOwotCUJJTl9UT19CQ0QobWluKTsKLQlCSU5fVE9fQkNEKGhycyk7Ci0JQklOX1RPX0JDRChkYXkpOwotCUJJTl9UT19CQ0QobW9uKTsKLQlCSU5fVE9fQkNEKHlycyk7Ci0JQklOX1RPX0JDRChjZW50dXJ5KTsKLQotCXdyaXRlYih2YWwgfCAweDA4LCBicTQ4MDJfcmVncyArIDB4MGUpOwotCi0Jd3JpdGViKHNlYywgYnE0ODAyX3JlZ3MgKyAweDAwKTsKLQl3cml0ZWIobWluLCBicTQ4MDJfcmVncyArIDB4MDIpOwotCXdyaXRlYihocnMsIGJxNDgwMl9yZWdzICsgMHgwNCk7Ci0Jd3JpdGViKGRheSwgYnE0ODAyX3JlZ3MgKyAweDA2KTsKLQl3cml0ZWIobW9uLCBicTQ4MDJfcmVncyArIDB4MDkpOwotCXdyaXRlYih5cnMsIGJxNDgwMl9yZWdzICsgMHgwYSk7Ci0Jd3JpdGViKGNlbnR1cnksIGJxNDgwMl9yZWdzICsgMHgwZik7Ci0KLQl3cml0ZWIodmFsLCBicTQ4MDJfcmVncyArIDB4MGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNtb3NfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQotewotCXVuc2lnbmVkIGNoYXIgY3RybDsKLQotCXJ0Y190bS0+dG1fc2VjID0gQ01PU19SRUFEKFJUQ19TRUNPTkRTKTsKLQlydGNfdG0tPnRtX21pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFUyk7Ci0JcnRjX3RtLT50bV9ob3VyID0gQ01PU19SRUFEKFJUQ19IT1VSUyk7Ci0JcnRjX3RtLT50bV9tZGF5ID0gQ01PU19SRUFEKFJUQ19EQVlfT0ZfTU9OVEgpOwotCXJ0Y190bS0+dG1fbW9uID0gQ01PU19SRUFEKFJUQ19NT05USCk7Ci0JcnRjX3RtLT50bV95ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKLQlydGNfdG0tPnRtX3dkYXkgPSBDTU9TX1JFQUQoUlRDX0RBWV9PRl9XRUVLKTsKLQotCWN0cmwgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOwotCWlmICghKGN0cmwgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgewotCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fc2VjKTsKLQkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21pbik7Ci0JCUJDRF9UT19CSU4ocnRjX3RtLT50bV9ob3VyKTsKLQkJQkNEX1RPX0JJTihydGNfdG0tPnRtX21kYXkpOwotCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fbW9uKTsKLQkJQkNEX1RPX0JJTihydGNfdG0tPnRtX3llYXIpOwotCQlCQ0RfVE9fQklOKHJ0Y190bS0+dG1fd2RheSk7Ci0JfQotCi0JaWYgKHJ0Y190bS0+dG1feWVhciA8PSA2OSkKLQkJcnRjX3RtLT50bV95ZWFyICs9IDEwMDsKLQotCXJ0Y190bS0+dG1fbW9uLS07Ci19Ci0KLXN0YXRpYyBpbnQgY21vc19zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCi17Ci0JdW5zaWduZWQgY2hhciBtb24sIGRheSwgaHJzLCBtaW4sIHNlYzsKLQl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKLQl1bnNpZ25lZCBpbnQgeXJzOwotCi0JeXJzID0gcnRjX3RtLT50bV95ZWFyOwotCW1vbiA9IHJ0Y190bS0+dG1fbW9uICsgMTsKLQlkYXkgPSBydGNfdG0tPnRtX21kYXk7Ci0JaHJzID0gcnRjX3RtLT50bV9ob3VyOwotCW1pbiA9IHJ0Y190bS0+dG1fbWluOwotCXNlYyA9IHJ0Y190bS0+dG1fc2VjOwotCi0JaWYgKHlycyA+PSAxMDApCi0JCXlycyAtPSAxMDA7Ci0KLQlpZiAoIShDTU9TX1JFQUQoUlRDX0NPTlRST0wpICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpIHsKLQkJQklOX1RPX0JDRChzZWMpOwotCQlCSU5fVE9fQkNEKG1pbik7Ci0JCUJJTl9UT19CQ0QoaHJzKTsKLQkJQklOX1RPX0JDRChkYXkpOwotCQlCSU5fVE9fQkNEKG1vbik7Ci0JCUJJTl9UT19CQ0QoeXJzKTsKLQl9Ci0KLQlzYXZlX2NvbnRyb2wgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOwotCUNNT1NfV1JJVEUoKHNhdmVfY29udHJvbHxSVENfU0VUKSwgUlRDX0NPTlRST0wpOwotCXNhdmVfZnJlcV9zZWxlY3QgPSBDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKTsKLQlDTU9TX1dSSVRFKChzYXZlX2ZyZXFfc2VsZWN0fFJUQ19ESVZfUkVTRVQyKSwgUlRDX0ZSRVFfU0VMRUNUKTsKLQotCUNNT1NfV1JJVEUoeXJzLCBSVENfWUVBUik7Ci0JQ01PU19XUklURShtb24sIFJUQ19NT05USCk7Ci0JQ01PU19XUklURShkYXksIFJUQ19EQVlfT0ZfTU9OVEgpOwotCUNNT1NfV1JJVEUoaHJzLCBSVENfSE9VUlMpOwotCUNNT1NfV1JJVEUobWluLCBSVENfTUlOVVRFUyk7Ci0JQ01PU19XUklURShzZWMsIFJUQ19TRUNPTkRTKTsKLQotCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sLCBSVENfQ09OVFJPTCk7Ci0JQ01PU19XUklURShzYXZlX2ZyZXFfc2VsZWN0LCBSVENfRlJFUV9TRUxFQ1QpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCi1zdGF0aWMgdm9pZCBtb3N0ZWtfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQotewotCXZvaWQgX19pb21lbSAqcmVncyA9IG1zdGs0OHQwMl9yZWdzOwotCXU4IHRtcDsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JdG1wIHw9IE1TVEtfQ1JFR19SRUFEOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7Ci0KLQlydGNfdG0tPnRtX3NlYyA9IE1TVEtfUkVHX1NFQyhyZWdzKTsKLQlydGNfdG0tPnRtX21pbiA9IE1TVEtfUkVHX01JTihyZWdzKTsKLQlydGNfdG0tPnRtX2hvdXIgPSBNU1RLX1JFR19IT1VSKHJlZ3MpOwotCXJ0Y190bS0+dG1fbWRheSA9IE1TVEtfUkVHX0RPTShyZWdzKTsKLQlydGNfdG0tPnRtX21vbiA9IE1TVEtfUkVHX01PTlRIKHJlZ3MpOwotCXJ0Y190bS0+dG1feWVhciA9IE1TVEtfQ1ZUX1lFQVIoIE1TVEtfUkVHX1lFQVIocmVncykgKTsKLQlydGNfdG0tPnRtX3dkYXkgPSBNU1RLX1JFR19ET1cocmVncyk7Ci0KLQl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0NSRUcpOwotCXRtcCAmPSB+TVNUS19DUkVHX1JFQUQ7Ci0JbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmbW9zdGVrX2xvY2spOwotCi0JcnRjX3RtLT50bV9tb24tLTsKLQlydGNfdG0tPnRtX3dkYXktLTsKLQlydGNfdG0tPnRtX3llYXIgLT0gMTkwMDsKLX0KLQotc3RhdGljIGludCBtb3N0ZWtfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQotewotCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWMsIHdkYXk7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gbXN0azQ4dDAyX3JlZ3M7Ci0JdW5zaWduZWQgaW50IHlyczsKLQl1OCB0bXA7Ci0KLQl5cnMgPSBydGNfdG0tPnRtX3llYXIgKyAxOTAwOwotCW1vbiA9IHJ0Y190bS0+dG1fbW9uICsgMTsKLQlkYXkgPSBydGNfdG0tPnRtX21kYXk7Ci0Jd2RheSA9IHJ0Y190bS0+dG1fd2RheSArIDE7Ci0JaHJzID0gcnRjX3RtLT50bV9ob3VyOwotCW1pbiA9IHJ0Y190bS0+dG1fbWluOwotCXNlYyA9IHJ0Y190bS0+dG1fc2VjOwotCi0Jc3Bpbl9sb2NrX2lycSgmbW9zdGVrX2xvY2spOwotCi0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgfD0gTVNUS19DUkVHX1dSSVRFOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7Ci0KLQlNU1RLX1NFVF9SRUdfU0VDKHJlZ3MsIHNlYyk7Ci0JTVNUS19TRVRfUkVHX01JTihyZWdzLCBtaW4pOwotCU1TVEtfU0VUX1JFR19IT1VSKHJlZ3MsIGhycyk7Ci0JTVNUS19TRVRfUkVHX0RPVyhyZWdzLCB3ZGF5KTsKLQlNU1RLX1NFVF9SRUdfRE9NKHJlZ3MsIGRheSk7Ci0JTVNUS19TRVRfUkVHX01PTlRIKHJlZ3MsIG1vbik7Ci0JTVNUS19TRVRfUkVHX1lFQVIocmVncywgeXJzIC0gTVNUS19ZRUFSX1pFUk8pOwotCi0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgJj0gfk1TVEtfQ1JFR19XUklURTsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG1pbmlfcnRjX29wcyB7Ci0Jdm9pZCAoKmdldF9ydGNfdGltZSkoc3RydWN0IHJ0Y190aW1lICopOwotCWludCAoKnNldF9ydGNfdGltZSkoc3RydWN0IHJ0Y190aW1lICopOwotfTsKLQotc3RhdGljIHN0cnVjdCBtaW5pX3J0Y19vcHMgc3RhcmZpcmVfcnRjX29wcyA9IHsKLQkuZ2V0X3J0Y190aW1lID0gc3RhcmZpcmVfZ2V0X3J0Y190aW1lLAotCS5zZXRfcnRjX3RpbWUgPSBzdGFyZmlyZV9zZXRfcnRjX3RpbWUsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pbmlfcnRjX29wcyBoeXBlcnZpc29yX3J0Y19vcHMgPSB7Ci0JLmdldF9ydGNfdGltZSA9IGh5cGVydmlzb3JfZ2V0X3J0Y190aW1lLAotCS5zZXRfcnRjX3RpbWUgPSBoeXBlcnZpc29yX3NldF9ydGNfdGltZSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgc3RydWN0IG1pbmlfcnRjX29wcyBicTQ4MDJfcnRjX29wcyA9IHsKLQkuZ2V0X3J0Y190aW1lID0gYnE0ODAyX2dldF9ydGNfdGltZSwKLQkuc2V0X3J0Y190aW1lID0gYnE0ODAyX3NldF9ydGNfdGltZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWluaV9ydGNfb3BzIGNtb3NfcnRjX29wcyA9IHsKLQkuZ2V0X3J0Y190aW1lID0gY21vc19nZXRfcnRjX3RpbWUsCi0JLnNldF9ydGNfdGltZSA9IGNtb3Nfc2V0X3J0Y190aW1lLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWluaV9ydGNfb3BzIG1vc3Rla19ydGNfb3BzID0gewotCS5nZXRfcnRjX3RpbWUgPSBtb3N0ZWtfZ2V0X3J0Y190aW1lLAotCS5zZXRfcnRjX3RpbWUgPSBtb3N0ZWtfc2V0X3J0Y190aW1lLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaW5pX3J0Y19vcHMgKm1pbmlfcnRjX29wczsKLQotc3RhdGljIGlubGluZSB2b2lkIG1pbmlfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JbWluaV9ydGNfb3BzLT5nZXRfcnRjX3RpbWUodGltZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWluaV9zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwotCWVyciA9IG1pbmlfcnRjX29wcy0+c2V0X3J0Y190aW1lKHRpbWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG1pbmlfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgd3RpbWU7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBSVENfUExMX0dFVDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXNlIFJUQ19QTExfU0VUOgotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNhc2UgUlRDX1VJRV9PRkY6CS8qIGRpc2FibGUgaW50cyBmcm9tIFJUQyB1cGRhdGVzLgkqLwotCQlyZXR1cm4gMDsKLQotCWNhc2UgUlRDX1VJRV9PTjoJLyogZW5hYmxlIGludHMgZm9yIFJUQyB1cGRhdGVzLgkqLwotCSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXNlIFJUQ19SRF9USU1FOgkvKiBSZWFkIHRoZSB0aW1lL2RhdGUgZnJvbSBSVEMJKi8KLQkJLyogdGhpcyBkb2Vzbid0IGdldCB3ZWVrLWRheSwgd2hvIGNhcmVzICovCi0JCW1lbXNldCgmd3RpbWUsIDAsIHNpemVvZih3dGltZSkpOwotCQltaW5pX2dldF9ydGNfdGltZSgmd3RpbWUpOwotCi0JCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJnd0aW1lLCBzaXplb2Yod3RpbWUpKSA/IC1FRkFVTFQgOiAwOwotCi0JY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCi0JICAgIHsKLQkJaW50IHllYXIsIGRheXM7Ci0KLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCi0JCQlyZXR1cm4gLUVBQ0NFUzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnd0aW1lLCBhcmdwLCBzaXplb2Yod3RpbWUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXllYXIgPSB3dGltZS50bV95ZWFyICsgMTkwMDsKLQkJZGF5cyA9IG1vbnRoX2RheXNbd3RpbWUudG1fbW9uXSArCi0JCSAgICAgICAoKHd0aW1lLnRtX21vbiA9PSAxKSAmJiBsZWFweWVhcih5ZWFyKSk7Ci0KLQkJaWYgKCh3dGltZS50bV9tb24gPCAwIHx8IHd0aW1lLnRtX21vbiA+IDExKSB8fAotCQkgICAgKHd0aW1lLnRtX21kYXkgPCAxKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmICh3dGltZS50bV9tZGF5IDwgMCB8fCB3dGltZS50bV9tZGF5ID4gZGF5cykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmICh3dGltZS50bV9ob3VyIDwgMCB8fCB3dGltZS50bV9ob3VyID49IDI0IHx8Ci0JCSAgICB3dGltZS50bV9taW4gPCAwIHx8IHd0aW1lLnRtX21pbiA+PSA2MCB8fAotCQkgICAgd3RpbWUudG1fc2VjIDwgMCB8fCB3dGltZS50bV9zZWMgPj0gNjApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlyZXR1cm4gbWluaV9zZXRfcnRjX3RpbWUoJnd0aW1lKTsKLQkgICAgfQotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1pbmlfcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JbG9ja19rZXJuZWwoKTsKLQlpZiAobWluaV9ydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCW1pbmlfcnRjX3N0YXR1cyB8PSBSVENfSVNfT1BFTjsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaW5pX3J0Y19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCW1pbmlfcnRjX3N0YXR1cyAmPSB+UlRDX0lTX09QRU47Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWluaV9ydGNfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmlvY3RsCQk9IG1pbmlfcnRjX2lvY3RsLAotCS5vcGVuCQk9IG1pbmlfcnRjX29wZW4sCi0JLnJlbGVhc2UJPSBtaW5pX3J0Y19yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJ0Y19taW5pX2RldiA9Ci17Ci0JLm1pbm9yCQk9IFJUQ19NSU5PUiwKLQkubmFtZQkJPSAicnRjIiwKLQkuZm9wcwkJPSAmbWluaV9ydGNfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0Y19taW5pX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCi0JCW1pbmlfcnRjX29wcyA9ICZoeXBlcnZpc29yX3J0Y19vcHM7Ci0JZWxzZSBpZiAodGhpc19pc19zdGFyZmlyZSkKLQkJbWluaV9ydGNfb3BzID0gJnN0YXJmaXJlX3J0Y19vcHM7Ci0jaWZkZWYgQ09ORklHX1BDSQotCWVsc2UgaWYgKGJxNDgwMl9yZWdzKQotCQltaW5pX3J0Y19vcHMgPSAmYnE0ODAyX3J0Y19vcHM7Ci0JZWxzZSBpZiAoZHMxMjg3X3JlZ3MpCi0JCW1pbmlfcnRjX29wcyA9ICZjbW9zX3J0Y19vcHM7Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCWVsc2UgaWYgKG1zdGs0OHQwMl9yZWdzKQotCQltaW5pX3J0Y19vcHMgPSAmbW9zdGVrX3J0Y19vcHM7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByaW50ayhLRVJOX0lORk8gIk1pbmkgUlRDIERyaXZlclxuIik7Ci0KLQlyZXR2YWwgPSBtaXNjX3JlZ2lzdGVyKCZydGNfbWluaV9kZXYpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBydGNfbWluaV9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZydGNfbWluaV9kZXYpOwotfQotCiBpbnQgX19kZXZpbml0IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWwpCiB7CiAJKnRpbWVyX3ZhbCA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwogCXJldHVybiAwOwogfQotCi1tb2R1bGVfaW5pdChydGNfbWluaV9pbml0KTsKLW1vZHVsZV9leGl0KHJ0Y19taW5pX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDNkOTI0MTIuLjgxY2NkMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9oZWFkLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWVtY3RybC5oPgogCiAjaW5jbHVkZSAiZW50cnkuaCIKICNpbmNsdWRlICJrc3RhY2suaCIKQEAgLTEyOCw2ICsxMzAsNTYgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpbW1faGFuZGxlcl9sb2NrKTsKK3N0YXRpYyBkaW1tX3ByaW50ZXJfdCBkaW1tX2hhbmRsZXI7CisKK3N0YXRpYyBpbnQgc3ByaW50Zl9kaW1tKGludCBzeW5kX2NvZGUsIHVuc2lnbmVkIGxvbmcgcGFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRU5PREVWOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbW1faGFuZGxlcl9sb2NrLCBmbGFncyk7CisJaWYgKGRpbW1faGFuZGxlcikgeworCQlyZXQgPSBkaW1tX2hhbmRsZXIoc3luZF9jb2RlLCBwYWRkciwgYnVmLCBidWZsZW4pOworCX0gZWxzZSBpZiAodGxiX3R5cGUgPT0gc3BpdGZpcmUpIHsKKwkJaWYgKHByb21fZ2V0dW51bWJlcihzeW5kX2NvZGUsIHBhZGRyLCBidWYsIGJ1ZmxlbikgPT0gLTEpCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlCisJCQlyZXQgPSAwOworCX0gZWxzZQorCQlyZXQgPSAtRU5PREVWOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpbW1faGFuZGxlcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVnaXN0ZXJfZGltbV9wcmludGVyKGRpbW1fcHJpbnRlcl90IGZ1bmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW1tX2hhbmRsZXJfbG9jaywgZmxhZ3MpOworCWlmICghZGltbV9oYW5kbGVyKQorCQlkaW1tX2hhbmRsZXIgPSBmdW5jOworCWVsc2UKKwkJcmV0ID0gLUVFWElTVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW1tX2hhbmRsZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2RpbW1fcHJpbnRlcik7CisKK3ZvaWQgdW5yZWdpc3Rlcl9kaW1tX3ByaW50ZXIoZGltbV9wcmludGVyX3QgZnVuYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbW1faGFuZGxlcl9sb2NrLCBmbGFncyk7CisJaWYgKGRpbW1faGFuZGxlciA9PSBmdW5jKQorCQlkaW1tX2hhbmRsZXIgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpbW1faGFuZGxlcl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX2RpbW1fcHJpbnRlcik7CisKIHZvaWQgc3BpdGZpcmVfaW5zbl9hY2Nlc3NfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHNmc3IsIHVuc2lnbmVkIGxvbmcgc2ZhcikKIHsKIAlzaWdpbmZvX3QgaW5mbzsKQEAgLTI5MCwxMCArMzQyLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QQ0kKLS8qIFRoaXMgaXMgcmVhbGx5IHBhdGhldGljLi4uICovCi1leHRlcm4gdm9sYXRpbGUgaW50IHBjaV9wb2tlX2luX3Byb2dyZXNzOwotZXh0ZXJuIHZvbGF0aWxlIGludCBwY2lfcG9rZV9jcHU7Ci1leHRlcm4gdm9sYXRpbGUgaW50IHBjaV9wb2tlX2ZhdWx0ZWQ7CisjaW5jbHVkZSAicGNpX2ltcGwuaCIKICNlbmRpZgogCiAvKiBXaGVuIGFjY2VzcyBleGNlcHRpb25zIGhhcHBlbiwgd2UgbXVzdCBkbyB0aGlzLiAqLwpAQCAtMzc1LDggKzQyNCw3IEBACiAKIAlpZiAodWRibCAmIGJpdCkgewogCQlzY29kZSA9IGVjY19zeW5kcm9tZV90YWJsZVt1ZGJsICYgMHhmZl07Ci0JCWlmIChwcm9tX2dldHVudW1iZXIoc2NvZGUsIGFmYXIsCi0JCQkJICAgIG1lbW1vZF9zdHIsIHNpemVvZihtZW1tb2Rfc3RyKSkgPT0gLTEpCisJCWlmIChzcHJpbnRmX2RpbW0oc2NvZGUsIGFmYXIsIG1lbW1vZF9zdHIsIHNpemVvZihtZW1tb2Rfc3RyKSkgPCAwKQogCQkJcCA9IHN5bmRyb21lX3Vua25vd247CiAJCWVsc2UKIAkJCXAgPSBtZW1tb2Rfc3RyOwpAQCAtMzg3LDggKzQzNSw3IEBACiAKIAlpZiAodWRiaCAmIGJpdCkgewogCQlzY29kZSA9IGVjY19zeW5kcm9tZV90YWJsZVt1ZGJoICYgMHhmZl07Ci0JCWlmIChwcm9tX2dldHVudW1iZXIoc2NvZGUsIGFmYXIsCi0JCQkJICAgIG1lbW1vZF9zdHIsIHNpemVvZihtZW1tb2Rfc3RyKSkgPT0gLTEpCisJCWlmIChzcHJpbnRmX2RpbW0oc2NvZGUsIGFmYXIsIG1lbW1vZF9zdHIsIHNpemVvZihtZW1tb2Rfc3RyKSkgPCAwKQogCQkJcCA9IHN5bmRyb21lX3Vua25vd247CiAJCWVsc2UKIAkJCXAgPSBtZW1tb2Rfc3RyOwpAQCAtMTA2MSw4ICsxMTA4LDYgQEAKIAlyZXR1cm4gIj8/PyI7CiB9CiAKLWV4dGVybiBpbnQgY2htY19nZXR1bnVtYmVyKGludCwgdW5zaWduZWQgbG9uZywgY2hhciAqLCBpbnQpOwotCiBzdGF0aWMgdm9pZCBjaGVldGFoX2xvZ19lcnJvcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBjaGVldGFoX2Vycl9pbmZvICppbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWZzciwgdW5zaWduZWQgbG9uZyBhZmFyLCBpbnQgcmVjb3ZlcmFibGUpCiB7CkBAIC0xMTA0LDcgKzExNDksNyBAQAogCiAJCXN5bmRyb21lID0gKGFmc3IgJiBDSEFGU1JfRV9TWU5EUk9NRSkgPj4gQ0hBRlNSX0VfU1lORFJPTUVfU0hJRlQ7CiAJCXN5bmRyb21lID0gY2hlZXRhaF9lY2Nfc3ludGFiW3N5bmRyb21lXTsKLQkJcmV0ID0gY2htY19nZXR1bnVtYmVyKHN5bmRyb21lLCBhZmFyLCB1bnVtLCBzaXplb2YodW51bSkpOworCQlyZXQgPSBzcHJpbnRmX2RpbW0oc3luZHJvbWUsIGFmYXIsIHVudW0sIHNpemVvZih1bnVtKSk7CiAJCWlmIChyZXQgIT0gLTEpCiAJCQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBBRkFSIEUtc3luZHJvbWUgWyVzXVxuIiwKIAkJCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLApAQCAtMTExNSw3ICsxMTYwLDcgQEAKIAogCQlzeW5kcm9tZSA9IChhZnNyICYgQ0hBRlNSX01fU1lORFJPTUUpID4+IENIQUZTUl9NX1NZTkRST01FX1NISUZUOwogCQlzeW5kcm9tZSA9IGNoZWV0YWhfbXRhZ19zeW50YWJbc3luZHJvbWVdOwotCQlyZXQgPSBjaG1jX2dldHVudW1iZXIoc3luZHJvbWUsIGFmYXIsIHVudW0sIHNpemVvZih1bnVtKSk7CisJCXJldCA9IHNwcmludGZfZGltbShzeW5kcm9tZSwgYWZhciwgdW51bSwgc2l6ZW9mKHVudW0pKTsKIAkJaWYgKHJldCAhPSAtMSkKIAkJCXByaW50aygiJXMiICJFUlJPUiglZCk6IEFGQVIgTS1zeW5kcm9tZSBbJXNdXG4iLAogCQkJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksCkBAIC0yMjIzLDcgKzIyNjgsNiBAQAogCiBleHRlcm4gaW50IGhhbmRsZV9wb3BjKHUzMiBpbnNuLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gaW50IGhhbmRsZV9sZGZfc3RxKHUzMiBpbnNuLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gaW50IHZpc19lbXVsKHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGludCk7CiAKIHZvaWQgZG9faWxsZWdhbF9pbnN0cnVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTI0NTMsNyArMjQ5Nyw3IEBACiAvKiBUaGlzIGNhbiBnZXQgaW52b2tlZCBiZWZvcmUgc2NoZWRfaW5pdCgpIHNvIHBsYXkgaXQgc3VwZXIgc2FmZQogICogYW5kIHVzZSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKS4KICAqLwotdm9pZCBpbml0X2N1cl9jcHVfdHJhcChzdHJ1Y3QgdGhyZWFkX2luZm8gKnQpCit2b2lkIG5vdHJhY2UgaW5pdF9jdXJfY3B1X3RyYXAoc3RydWN0IHRocmVhZF9pbmZvICp0KQogewogCWludCBjcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICpwID0gJnRyYXBfYmxvY2tbY3B1XTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdXMzX2NwdWZyZXEuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdXMzX2NwdWZyZXEuYwppbmRleCA0N2UzYWNhLi4zNjViNjQ2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3VzM19jcHVmcmVxLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC91czNfY3B1ZnJlcS5jCkBAIC0xODMsNyArMTgzLDYgQEAKIAl0YWJsZVszXS5pbmRleCA9IDA7CiAJdGFibGVbM10uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CiAKLQlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOwogCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAwOwogCXBvbGljeS0+Y3VyID0gY2xvY2tfdGljazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMKaW5kZXggYTQ5MDA3Ny4uOTJiMWY4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihvYnBwYXRoLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCiAJCSAgIHNob3dfcGNpb2JwcGF0aF9hdHRyLCBOVUxMKTsKIAotc3RydWN0IGRldmljZV9ub2RlICpjZGV2X25vZGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjZGV2X25vZGU7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqcm9vdF92ZGV2Owogc3RhdGljIHU2NCBjZGV2X2NmZ19oYW5kbGU7CkBAIC0zNzEsOSArMzcxLDkgQEAKIAkubm9kZV9uYW1lCT0gImRvbWFpbi1zZXJ2aWNlcy1wb3J0IiwKIH07CiAKLWNvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19ub2RlID0gImNoYW5uZWwtZGV2aWNlcyI7Ci1jb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfY29tcGF0ID0gIlNVTlcsc3VuNHYtY2hhbm5lbC1kZXZpY2VzIjsKLWNvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfbm9kZSA9ICJjaGFubmVsLWRldmljZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19jb21wYXQgPSAiU1VOVyxzdW40di1jaGFubmVsLWRldmljZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKIAogc3RhdGljIGludCBfX2luaXQgdmlvX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlzZW11bC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aXNlbXVsLmMKaW5kZXggYzNmZDY0Ny4uOWUwNWNiNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92aXNlbXVsLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aXNlbXVsLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogc3RydWN0IGVkZ2VfdGFiIHsKIAl1MTYgbGVmdCwgcmlnaHQ7CiB9Owotc3RydWN0IGVkZ2VfdGFiIGVkZ2U4X3RhYls4XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZWRnZV90YWIgZWRnZThfdGFiWzhdID0gewogCXsgMHhmZiwgMHg4MCB9LAogCXsgMHg3ZiwgMHhjMCB9LAogCXsgMHgzZiwgMHhlMCB9LApAQCAtMjUzLDcgKzI1Myw3IEBACiAJeyAweDAzLCAweGZlIH0sCiAJeyAweDAxLCAweGZmIH0sCiB9Owotc3RydWN0IGVkZ2VfdGFiIGVkZ2U4X3RhYl9sWzhdID0geworc3RhdGljIHN0cnVjdCBlZGdlX3RhYiBlZGdlOF90YWJfbFs4XSA9IHsKIAl7IDB4ZmYsIDB4MDEgfSwKIAl7IDB4ZmUsIDB4MDMgfSwKIAl7IDB4ZmMsIDB4MDcgfSwKQEAgLTI2MywyMyArMjYzLDIzIEBACiAJeyAweGMwLCAweDdmIH0sCiAJeyAweDgwLCAweGZmIH0sCiB9Owotc3RydWN0IGVkZ2VfdGFiIGVkZ2UxNl90YWJbNF0gPSB7CitzdGF0aWMgc3RydWN0IGVkZ2VfdGFiIGVkZ2UxNl90YWJbNF0gPSB7CiAJeyAweGYsIDB4OCB9LAogCXsgMHg3LCAweGMgfSwKIAl7IDB4MywgMHhlIH0sCiAJeyAweDEsIDB4ZiB9LAogfTsKLXN0cnVjdCBlZGdlX3RhYiBlZGdlMTZfdGFiX2xbNF0gPSB7CitzdGF0aWMgc3RydWN0IGVkZ2VfdGFiIGVkZ2UxNl90YWJfbFs0XSA9IHsKIAl7IDB4ZiwgMHgxIH0sCiAJeyAweGUsIDB4MyB9LAogCXsgMHhjLCAweDcgfSwKIAl7IDB4OCwgMHhmIH0sCiB9Owotc3RydWN0IGVkZ2VfdGFiIGVkZ2UzMl90YWJbMl0gPSB7CitzdGF0aWMgc3RydWN0IGVkZ2VfdGFiIGVkZ2UzMl90YWJbMl0gPSB7CiAJeyAweDMsIDB4MiB9LAogCXsgMHgxLCAweDMgfSwKIH07Ci1zdHJ1Y3QgZWRnZV90YWIgZWRnZTMyX3RhYl9sWzJdID0geworc3RhdGljIHN0cnVjdCBlZGdlX3RhYiBlZGdlMzJfdGFiX2xbMl0gPSB7CiAJeyAweDMsIDB4MSB9LAogCXsgMHgyLCAweDMgfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vZmF1bHQuYyBiL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCmluZGV4IGVhN2Q3YWUuLmE5ZTQ3NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jCkBAIC01MSw0MyArNTEsNiBAQAogfQogI2VuZGlmCiAKLS8qCi0gKiBUbyBkZWJ1ZyBrZXJuZWwgdG8gY2F0Y2ggYWNjZXNzZXMgdG8gY2VydGFpbiB2aXJ0dWFsL3BoeXNpY2FsIGFkZHJlc3Nlcy4KLSAqIE1vZGUgPSAwIHNlbGVjdHMgcGh5c2ljYWwgd2F0Y2hwb2ludHMsIG1vZGUgPSAxIHNlbGVjdHMgdmlydHVhbCB3YXRjaHBvaW50cy4KLSAqIGZsYWdzID0gVk1fUkVBRCB3YXRjaGVzIG1lbXJlYWQgYWNjZXNzZXMsIGZsYWdzID0gVk1fV1JJVEUgd2F0Y2hlcyBtZW13cml0ZSBhY2Nlc3Nlcy4KLSAqIENhbGxlciBwYXNzZXMgaW4gYSA2NGJpdCBhbGlnbmVkIGFkZHIsIHdpdGggbWFzayBzZXQgdG8gdGhlIGJ5dGVzIHRoYXQgbmVlZCB0byBiZQotICogd2F0Y2hlZC4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBvbiBhIHNpbmdsZSBjcHUgbWFjaGluZSBmb3Igbm93LiBBZnRlciB0aGUgd2F0Y2hwb2ludAotICogaXMgZGV0ZWN0ZWQsIHRoZSBwcm9jZXNzIGNhdXNpbmcgaXQgd2lsbCBiZSBraWxsZWQsIHRodXMgcHJldmVudGluZyBhbiBpbmZpbml0ZSBsb29wLgotICovCi12b2lkIHNldF9icmtwdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGNoYXIgbWFzaywgaW50IGZsYWdzLCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBsb25nIGxzdWJpdHM7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR4YSBbJSVnMF0gJTEsICUwIgotCQkJICAgICA6ICI9ciIgKGxzdWJpdHMpCi0JCQkgICAgIDogImkiIChBU0lfTFNVX0NPTlRST0wpKTsKLQlsc3ViaXRzICY9IH4oTFNVX0NPTlRST0xfUE0gfCBMU1VfQ09OVFJPTF9WTSB8Ci0JCSAgICAgTFNVX0NPTlRST0xfUFIgfCBMU1VfQ09OVFJPTF9WUiB8Ci0JCSAgICAgTFNVX0NPTlRST0xfUFcgfCBMU1VfQ09OVFJPTF9WVyk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YQklMCwgWyUxXSAlMlxuXHQiCi0JCQkgICAgICJtZW1iYXIJI1N5bmMiCi0JCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJICAgICA6ICJyIiAoYWRkciksICJyIiAobW9kZSA/IFZJUlRfV0FUQ0hQT0lOVCA6IFBIWVNfV0FUQ0hQT0lOVCksCi0JCQkgICAgICAgImkiIChBU0lfRE1NVSkpOwotCi0JbHN1Yml0cyB8PSAoKHVuc2lnbmVkIGxvbmcpbWFzayA8PCAobW9kZSA/IDI1IDogMzMpKTsKLQlpZiAoZmxhZ3MgJiBWTV9SRUFEKQotCQlsc3ViaXRzIHw9IChtb2RlID8gTFNVX0NPTlRST0xfVlIgOiBMU1VfQ09OVFJPTF9QUik7Ci0JaWYgKGZsYWdzICYgVk1fV1JJVEUpCi0JCWxzdWJpdHMgfD0gKG1vZGUgPyBMU1VfQ09OVFJPTF9WVyA6IExTVV9DT05UUk9MX1BXKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R4YSAlMCwgWyUlZzBdICUxXG5cdCIKLQkJCSAgICAgIm1lbWJhciAjU3luYyIKLQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkgICAgIDogInIiIChsc3ViaXRzKSwgImkiIChBU0lfTFNVX0NPTlRST0wpCi0JCQkgICAgIDogIm1lbW9yeSIpOwotfQotCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgdW5oYW5kbGVkX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IGE0MWRmN2IuLjNjMTBkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtNDYsMTUgKzQ2LDExIEBACiAjaW5jbHVkZSA8YXNtL3RzYi5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vc3N0YXRlLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNkZWZpbmUgTUFYX1BIWVNfQUREUkVTUwkoMVVMIDw8IDQyVUwpCi0jZGVmaW5lIEtQVEVfQklUTUFQX0NIVU5LX1NaCSgyNTZVTCAqIDEwMjRVTCAqIDEwMjRVTCkKLSNkZWZpbmUgS1BURV9CSVRNQVBfQllURVMJXAotCSgoTUFYX1BIWVNfQUREUkVTUyAvIEtQVEVfQklUTUFQX0NIVU5LX1NaKSAvIDgpCisjaW5jbHVkZSAiaW5pdC5oIgogCiB1bnNpZ25lZCBsb25nIGtlcm5fbGluZWFyX3B0ZV94b3JbMl0gX19yZWFkX21vc3RseTsKIApAQCAtNDE2LDE3ICs0MTIsOSBAQAogI2VuZGlmIC8qIENPTkZJR19ERUJVR19EQ0ZMVVNIICovCiB9CiAKLXN0cnVjdCBsaW51eF9wcm9tX3RyYW5zbGF0aW9uIHsKLQl1bnNpZ25lZCBsb25nIHZpcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLX07Ci0KLS8qIEV4cG9ydGVkIGZvciBrZXJuZWwgVExCIG1pc3MgaGFuZGxpbmcgaW4ga3RsYi5TICovCiBzdHJ1Y3QgbGludXhfcHJvbV90cmFuc2xhdGlvbiBwcm9tX3RyYW5zWzUxMl0gX19yZWFkX21vc3RseTsKIHVuc2lnbmVkIGludCBwcm9tX3RyYW5zX2VudHMgX19yZWFkX21vc3RseTsKIAotLyogRXhwb3J0ZWQgZm9yIFNNUCBib290dXAgcHVycG9zZXMuICovCiB1bnNpZ25lZCBsb25nIGtlcm5fbG9ja2VkX3R0ZV9kYXRhOwogCiAvKiBUaGUgb2JwIHRyYW5zbGF0aW9ucyBhcmUgc2F2ZWQgYmFzZWQgb24gOGsgcGFnZXNpemUsIHNpbmNlIG9icCBjYW4KQEAgLTkzOCw2ICs5MjYsMTAgQEAKIAlpbnQgY291bnQsIG5pZDsKIAl1NjQgZ3JwOwogCisJLyogVGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gb24gY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIFNVTjRVIE5VTUEgcGxhdGZvcm1zIGFzIHdlbGwsIGFzIHRoZSBQQ0kgY29udHJvbGxlciBkb2VzCisJICogbm90IHNpdCBiZWhpbmQgYW55IHBhcnRpY3VsYXIgbWVtb3J5IGNvbnRyb2xsZXIuCisJICovCiAJaWYgKCFtbGdyb3VwcykKIAkJcmV0dXJuIC0xOwogCkBAIC0xMjA2LDggKzExOTgsNDQgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBudW1hX3BhcnNlX2pidXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdSwgaW5kZXg7CisKKwkvKiBOVU1BIG5vZGUgaWQgaXMgZW5jb2RlZCBpbiBiaXRzIDM2IGFuZCBoaWdoZXIsIGFuZCB0aGVyZSBpcworCSAqIGEgMS10by0xIG1hcHBpbmcgZnJvbSBDUFUgSUQgdG8gTlVNQSBub2RlIElELgorCSAqLworCWluZGV4ID0gMDsKKwlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJbnVtYV9jcHVfbG9va3VwX3RhYmxlW2NwdV0gPSBpbmRleDsKKwkJbnVtYV9jcHVtYXNrX2xvb2t1cF90YWJsZVtpbmRleF0gPSBjcHVtYXNrX29mX2NwdShjcHUpOworCQlub2RlX21hc2tzW2luZGV4XS5tYXNrID0gfigoMVVMIDw8IDM2VUwpIC0gMVVMKTsKKwkJbm9kZV9tYXNrc1tpbmRleF0udmFsID0gY3B1IDw8IDM2VUw7CisKKwkJaW5kZXgrKzsKKwl9CisJbnVtX25vZGVfbWFza3MgPSBpbmRleDsKKworCWFkZF9ub2RlX3JhbmdlcygpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtX25vZGVfbWFza3M7IGluZGV4KyspIHsKKwkJYWxsb2NhdGVfbm9kZV9kYXRhKGluZGV4KTsKKwkJbm9kZV9zZXRfb25saW5lKGluZGV4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgbnVtYV9wYXJzZV9zdW40dSh2b2lkKQogeworCWlmICh0bGJfdHlwZSA9PSBjaGVldGFoIHx8IHRsYl90eXBlID09IGNoZWV0YWhfcGx1cykgeworCQl1bnNpZ25lZCBsb25nIHZlcjsKKworCQlfX2FzbV9fICgicmRwciAlJXZlciwgJTAiIDogIj1yIiAodmVyKSk7CisJCWlmICgodmVyID4+IDMyVUwpID09IF9fSkFMQVBFTk9fSUQgfHwKKwkJICAgICh2ZXIgPj4gMzJVTCkgPT0gX19TRVJSQU5PX0lEKQorCQkJcmV0dXJuIG51bWFfcGFyc2VfamJ1cygpOworCX0KIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE2MzMsOCArMTY2MSw2IEBACiAKIC8qIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMgKi8KIAotZXh0ZXJuIHZvaWQgY2VudHJhbF9wcm9iZSh2b2lkKTsKLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZF9wZm47CiBwZ2RfdCBzd2FwcGVyX3BnX2RpclsyMDQ4XTsKIApAQCAtMTY3OSw4ICsxNzA1LDYgQEAKIAlrZXJuX2Jhc2UgPSAocHJvbV9ib290X21hcHBpbmdfcGh5c19sb3cgPj4gMjJVTCkgPDwgMjJVTDsKIAlrZXJuX3NpemUgPSAodW5zaWduZWQgbG9uZykmX2VuZCAtICh1bnNpZ25lZCBsb25nKUtFUk5CQVNFOwogCi0Jc3N0YXRlX2Jvb3RpbmcoKTsKLQogCS8qIEludmFsaWRhdGUgYm90aCBrZXJuZWwgVFNCcy4gICovCiAJbWVtc2V0KHN3YXBwZXJfdHNiLCAweDQwLCBzaXplb2Yoc3dhcHBlcl90c2IpKTsKICNpZm5kZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwpAQCAtMTgwMyw5ICsxODI3LDYgQEAKIAl9CiAKIAlwcmludGsoIkJvb3RpbmcgTGludXguLi5cbiIpOwotCi0JY2VudHJhbF9wcm9iZSgpOwotCWNwdV9wcm9iZSgpOwogfQogCiBpbnQgX19pbml0IHBhZ2VfaW5fcGh5c19hdmFpbCh1bnNpZ25lZCBsb25nIHBhZGRyKQpAQCAtMjAzMiw3ICsyMDUzLDYgQEAKIHBncHJvdF90IFBBR0VfU0hBUkVEIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKFBBR0VfU0hBUkVEKTsKIAotcGdwcm90X3QgUEFHRV9FWEVDIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIHBnX2lvYml0cyBfX3JlYWRfbW9zdGx5OwogCiB1bnNpZ25lZCBsb25nIF9QQUdFX0lFIF9fcmVhZF9tb3N0bHk7CkBAIC0yMDQ1LDE0ICsyMDY1LDYgQEAKIEVYUE9SVF9TWU1CT0woX1BBR0VfQ0FDSEUpOwogCiAjaWZkZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCi0KLSNkZWZpbmUgVk1FTU1BUF9DSFVOS19TSElGVAkyMgotI2RlZmluZSBWTUVNTUFQX0NIVU5LCQkoMVVMIDw8IFZNRU1NQVBfQ0hVTktfU0hJRlQpCi0jZGVmaW5lIFZNRU1NQVBfQ0hVTktfTUFTSwl+KFZNRU1NQVBfQ0hVTksgLSAxVUwpCi0jZGVmaW5lIFZNRU1NQVBfQUxJR04oeCkJKCgoeCkrVk1FTU1BUF9DSFVOSy0xVUwpJlZNRU1NQVBfQ0hVTktfTUFTSykKLQotI2RlZmluZSBWTUVNTUFQX1NJWkUJKCgoKDFVTCA8PCBNQVhfUEhZU0FERFJfQklUUykgPj4gUEFHRV9TSElGVCkgKiBcCi0JCQkgIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkgPj4gVk1FTU1BUF9DSFVOS19TSElGVCkKIHVuc2lnbmVkIGxvbmcgdm1lbW1hcF90YWJsZVtWTUVNTUFQX1NJWkVdOwogCiBpbnQgX19tZW1pbml0IHZtZW1tYXBfcG9wdWxhdGUoc3RydWN0IHBhZ2UgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIG5yLCBpbnQgbm9kZSkKQEAgLTIxMzYsNyArMjE0OCw2IEBACiAJCQkJICAgICAgIF9QQUdFX0NBQ0hFXzRVIHwgX1BBR0VfUF80VSB8CiAJCQkJICAgICAgIF9fQUNDRVNTX0JJVFNfNFUgfCBfX0RJUlRZX0JJVFNfNFUgfAogCQkJCSAgICAgICBfUEFHRV9FWEVDXzRVIHwgX1BBR0VfTF80VSk7Ci0JUEFHRV9FWEVDID0gX19wZ3Byb3QoX1BBR0VfRVhFQ180VSk7CiAKIAlfUEFHRV9JRSA9IF9QQUdFX0lFXzRVOwogCV9QQUdFX0UgPSBfUEFHRV9FXzRVOwpAQCAtMjE0NywxMCArMjE1OCwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCWtlcm5fbGluZWFyX3B0ZV94b3JbMF0gPSAoX1BBR0VfVkFMSUQgfCBfUEFHRV9TWkJJVFNfNFUpIF4KLQkJMHhmZmZmZjgwMDAwMDAwMDAwOworCQkweGZmZmZmODAwMDAwMDAwMDBVTDsKICNlbHNlCiAJa2Vybl9saW5lYXJfcHRlX3hvclswXSA9IChfUEFHRV9WQUxJRCB8IF9QQUdFX1NaNE1CXzRVKSBeCi0JCTB4ZmZmZmY4MDAwMDAwMDAwMDsKKwkJMHhmZmZmZjgwMDAwMDAwMDAwVUw7CiAjZW5kaWYKIAlrZXJuX2xpbmVhcl9wdGVfeG9yWzBdIHw9IChfUEFHRV9DUF80VSB8IF9QQUdFX0NWXzRVIHwKIAkJCQkgICBfUEFHRV9QXzRVIHwgX1BBR0VfV180VSk7CkBAIC0yMTg4LDcgKzIxOTksNiBAQAogCQkJCV9fQUNDRVNTX0JJVFNfNFYgfCBfX0RJUlRZX0JJVFNfNFYgfAogCQkJCV9QQUdFX0VYRUNfNFYpOwogCVBBR0VfS0VSTkVMX0xPQ0tFRCA9IFBBR0VfS0VSTkVMOwotCVBBR0VfRVhFQyA9IF9fcGdwcm90KF9QQUdFX0VYRUNfNFYpOwogCiAJX1BBR0VfSUUgPSBfUEFHRV9JRV80VjsKIAlfUEFHRV9FID0gX1BBR0VfRV80VjsKQEAgLTIxOTYsMjAgKzIyMDYsMjAgQEAKIAogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIAlrZXJuX2xpbmVhcl9wdGVfeG9yWzBdID0gKF9QQUdFX1ZBTElEIHwgX1BBR0VfU1pCSVRTXzRWKSBeCi0JCTB4ZmZmZmY4MDAwMDAwMDAwMDsKKwkJMHhmZmZmZjgwMDAwMDAwMDAwVUw7CiAjZWxzZQogCWtlcm5fbGluZWFyX3B0ZV94b3JbMF0gPSAoX1BBR0VfVkFMSUQgfCBfUEFHRV9TWjRNQl80VikgXgotCQkweGZmZmZmODAwMDAwMDAwMDA7CisJCTB4ZmZmZmY4MDAwMDAwMDAwMFVMOwogI2VuZGlmCiAJa2Vybl9saW5lYXJfcHRlX3hvclswXSB8PSAoX1BBR0VfQ1BfNFYgfCBfUEFHRV9DVl80ViB8CiAJCQkJICAgX1BBR0VfUF80ViB8IF9QQUdFX1dfNFYpOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCWtlcm5fbGluZWFyX3B0ZV94b3JbMV0gPSAoX1BBR0VfVkFMSUQgfCBfUEFHRV9TWkJJVFNfNFYpIF4KLQkJMHhmZmZmZjgwMDAwMDAwMDAwOworCQkweGZmZmZmODAwMDAwMDAwMDBVTDsKICNlbHNlCiAJa2Vybl9saW5lYXJfcHRlX3hvclsxXSA9IChfUEFHRV9WQUxJRCB8IF9QQUdFX1NaMjU2TUJfNFYpIF4KLQkJMHhmZmZmZjgwMDAwMDAwMDAwOworCQkweGZmZmZmODAwMDAwMDAwMDBVTDsKICNlbmRpZgogCWtlcm5fbGluZWFyX3B0ZV94b3JbMV0gfD0gKF9QQUdFX0NQXzRWIHwgX1BBR0VfQ1ZfNFYgfAogCQkJCSAgIF9QQUdFX1BfNFYgfCBfUEFHRV9XXzRWKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmggYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDYzODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX1NQQVJDNjRfTU1fSU5JVF9ICisjZGVmaW5lIF9TUEFSQzY0X01NX0lOSVRfSAorCisvKiBNb3N0IG9mIHRoZSBzeW1ib2xzIGluIHRoaXMgZmlsZSBhcmUgZGVmaW5lZCBpbiBpbml0LmMgYW5kCisgKiBtYXJrZWQgbm9uLXN0YXRpYyBzbyB0aGF0IGFzc2VtYmxlciBjb2RlIGNhbiBnZXQgYXQgdGhlbS4KKyAqLworCisjZGVmaW5lIE1BWF9QSFlTX0FERFJFU1MJKDFVTCA8PCA0MlVMKQorI2RlZmluZSBLUFRFX0JJVE1BUF9DSFVOS19TWgkoMjU2VUwgKiAxMDI0VUwgKiAxMDI0VUwpCisjZGVmaW5lIEtQVEVfQklUTUFQX0JZVEVTCVwKKwkoKE1BWF9QSFlTX0FERFJFU1MgLyBLUFRFX0JJVE1BUF9DSFVOS19TWikgLyA4KQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuX2xpbmVhcl9wdGVfeG9yWzJdOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcga3B0ZV9saW5lYXJfYml0bWFwW0tQVEVfQklUTUFQX0JZVEVTIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BhcmM2NF9oaWdoZXN0X3VubG9ja2VkX3RsYl9lbnQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2tlcm5fcHJpX2NvbnRleHQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2tlcm5fcHJpX251Y19iaXRzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF9rZXJuX3NlY19jb250ZXh0OworZXh0ZXJuIHZvaWQgbW11X2luZm8oc3RydWN0IHNlcV9maWxlICptKTsKKworc3RydWN0IGxpbnV4X3Byb21fdHJhbnNsYXRpb24geworCXVuc2lnbmVkIGxvbmcgdmlydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBkYXRhOworfTsKKworLyogRXhwb3J0ZWQgZm9yIGtlcm5lbCBUTEIgbWlzcyBoYW5kbGluZyBpbiBrdGxiLlMgKi8KK2V4dGVybiBzdHJ1Y3QgbGludXhfcHJvbV90cmFuc2xhdGlvbiBwcm9tX3RyYW5zWzUxMl07CitleHRlcm4gdW5zaWduZWQgaW50IHByb21fdHJhbnNfZW50czsKKworLyogRXhwb3J0ZWQgZm9yIFNNUCBib290dXAgcHVycG9zZXMuICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuX2xvY2tlZF90dGVfZGF0YTsKKworZXh0ZXJuIHZvaWQgcHJvbV93b3JsZChpbnQgZW50ZXIpOworCitleHRlcm4gdm9pZCBmcmVlX2luaXRtZW0odm9pZCk7CisKKyNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKKyNkZWZpbmUgVk1FTU1BUF9DSFVOS19TSElGVAkyMgorI2RlZmluZSBWTUVNTUFQX0NIVU5LCQkoMVVMIDw8IFZNRU1NQVBfQ0hVTktfU0hJRlQpCisjZGVmaW5lIFZNRU1NQVBfQ0hVTktfTUFTSwl+KFZNRU1NQVBfQ0hVTksgLSAxVUwpCisjZGVmaW5lIFZNRU1NQVBfQUxJR04oeCkJKCgoeCkrVk1FTU1BUF9DSFVOSy0xVUwpJlZNRU1NQVBfQ0hVTktfTUFTSykKKworI2RlZmluZSBWTUVNTUFQX1NJWkUJKCgoKDFVTCA8PCBNQVhfUEhZU0FERFJfQklUUykgPj4gUEFHRV9TSElGVCkgKiBcCisJCQkgIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkgPj4gVk1FTU1BUF9DSFVOS19TSElGVCkKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZtZW1tYXBfdGFibGVbVk1FTU1BUF9TSVpFXTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1NQQVJDNjRfTU1fSU5JVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdGxiLmMgYi9hcmNoL3NwYXJjNjQvbW0vdGxiLmMKaW5kZXggYWUyNDkxOS4uZDhmMjFlMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL3RsYi5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS90bGIuYwpAQCAtMTksNyArMTksNyBAQAogCiAvKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBwcGM2NCBjb2RlLiAgKi8KIAotREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKSA9IHsgMCwgfTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CiAKIHZvaWQgZmx1c2hfdGxiX3BlbmRpbmcodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5jaGFyIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKaW5kZXggMWIyMzhlYi4uNzBkYWJkMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmNoYXIKKysrIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKQEAgLTIwMyw2ICsyMDMsMTAgQEAKIAl0cmlzdGF0ZQogCWRlZmF1bHQgVU1MX1NPVU5ECiAKK2NvbmZpZyBTT1VORF9PU1NfQ09SRQorCWJvb2wKKwlkZWZhdWx0IFVNTF9TT1VORAorCiBjb25maWcgSE9TVEFVRElPCiAJdHJpc3RhdGUKIAlkZWZhdWx0IFVNTF9TT1VORApkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLmkzODYgYi9hcmNoL3VtL0tjb25maWcuaTM4NgppbmRleCBlMDllZGZhLi4xZjU3YzExIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuaTM4NgorKysgYi9hcmNoL3VtL0tjb25maWcuaTM4NgpAQCAtOSw4ICs5LDkgQEAKIAlkZWZhdWx0IHkKIAogY29uZmlnIFg4Nl8zMgotICAgICAgIGJvb2wKLSAgICAgICBkZWZhdWx0IHkKKwlib29sCisJZGVmYXVsdCB5CisgIAlzZWxlY3QgSEFWRV9BT1VUCiAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWRlZl9ib29sIHkKQEAgLTQyLDYgKzQzLDMgQEAKIGNvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCiAJZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKLQlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcueDg2XzY0IGIvYXJjaC91bS9LY29uZmlnLng4Nl82NAppbmRleCA1Njk2ZTdiLi40MGIzNDA3IDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcueDg2XzY0CisrKyBiL2FyY2gvdW0vS2NvbmZpZy54ODZfNjQKQEAgLTM3LDYgKzM3LDMgQEAKIGNvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCiAJZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKLQlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCBkNzQxZjM1Li4xNGExMDJlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTI3NSw2ICsyNzUsOCBAQAogCWNhc2UgVElPQ0dMVEM6CiAJY2FzZSBUSU9DU0xUQzoKICNlbmRpZgorCS8qIE5vdGU6IHRoZXNlIGFyZSBvdXQgb2YgZGF0ZSBhcyB3ZSBub3cgaGF2ZSBUQ0dFVFMyIGV0YyBidXQgdGhpcworCSAgIHdob2xlIGxvdCBzaG91bGQgcHJvYmFibHkgZ28gYXdheSAqLwogCWNhc2UgVENHRVRTOgogCWNhc2UgVENTRVRTRjoKIAljYXNlIFRDU0VUU1c6CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKaW5kZXggZjVkN2Y0NS4uNTk4NzExYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZXhlYy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2V4ZWMuYwpAQCAtNDIsMjMgKzQyLDExIEBACiAJUFRfUkVHU19TUChyZWdzKSA9IGVzcDsKIH0KIAotI2lmZGVmIENPTkZJR19UVFlfTE9HCi1leHRlcm4gdm9pZCBsb2dfZXhlYyhjaGFyICoqYXJndiwgdm9pZCAqdHR5KTsKLSNlbmRpZgotCiBzdGF0aWMgbG9uZyBleGVjdmUxKGNoYXIgKmZpbGUsIGNoYXIgX191c2VyICogX191c2VyICphcmd2LAogCQkgICAgY2hhciBfX3VzZXIgKl9fdXNlciAqZW52KQogewogCWxvbmcgZXJyb3I7Ci0jaWZkZWYgQ09ORklHX1RUWV9MT0cKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKLQlpZiAodHR5KQotCQlsb2dfZXhlYyhhcmd2LCB0dHkpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLSNlbmRpZgogCWVycm9yID0gZG9fZXhlY3ZlKGZpbGUsIGFyZ3YsIGVudiwgJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKIAlpZiAoZXJyb3IgPT0gMCkgewogCQl0YXNrX2xvY2soY3VycmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zbXAuYyBiL2FyY2gvdW0va2VybmVsL3NtcC5jCmluZGV4IGJlMmQ1MGMuLjA0NTc3MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NtcC5jCkBAIC04NSw2ICs4NSw3IEBACiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKQogCQljcHVfcmVsYXgoKTsKIAorCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KTsKIAljcHVfc2V0KGNwdSwgY3B1X29ubGluZV9tYXApOwogCWRlZmF1bHRfaWRsZSgpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZSBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKaW5kZXggOGE0OGQ2YS4uZDY2ZjAzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQorKysgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCkBAIC03LDkgKzcsNiBAQAogCXJlZ2lzdGVycy5vIHNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHR5Lm8gdWFjY2Vzcy5vIFwKIAl1bWlkLm8gdGxzLm8gdXNlcl9zeW1zLm8gdXRpbC5vIGRyaXZlcnMvIHN5cy0kKFNVQkFSQ0gpLyBza2FzLwogCi1vYmotJChDT05GSUdfVFRZX0xPRykgKz0gdHR5X2xvZy5vCi11c2VyLW9ianMtJChDT05GSUdfVFRZX0xPRykgKz0gdHR5X2xvZy5vCi0KIFVTRVJfT0JKUyA6PSAkKHVzZXItb2Jqcy15KSBhaW8ubyBlbGZfYXV4Lm8gZXhlY3ZwLm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIFwKIAltYWluLm8gbWVtLm8gcHJvY2Vzcy5vIHJlZ2lzdGVycy5vIHNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gXAogCXR0eS5vIHRscy5vIHVhY2Nlc3MubyB1bWlkLm8gdXRpbC5vCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3R0eV9sb2cuYyBiL2FyY2gvdW0vb3MtTGludXgvdHR5X2xvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY0OGU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvdHR5X2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKSBhbmQKLSAqIGdlb2ZmcmV5IGhpbmcgPGdoaW5nQG5ldC5vaGlvLXN0YXRlLmVkdT4KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJvcy5oIgotCi0jZGVmaW5lIFRUWV9MT0dfRElSICIuLyIKLQotLyogU2V0IGVhcmx5IGluIGJvb3QgYW5kIHRoZW4gdW5jaGFuZ2VkICovCi1zdGF0aWMgY2hhciAqdHR5X2xvZ19kaXIgPSBUVFlfTE9HX0RJUjsKLXN0YXRpYyBpbnQgdHR5X2xvZ19mZCA9IC0xOwotCi0jZGVmaW5lIFRUWV9MT0dfT1BFTiAxCi0jZGVmaW5lIFRUWV9MT0dfQ0xPU0UgMgotI2RlZmluZSBUVFlfTE9HX1dSSVRFIDMKLSNkZWZpbmUgVFRZX0xPR19FWEVDIDQKLQotI2RlZmluZSBUVFlfUkVBRCAxCi0jZGVmaW5lIFRUWV9XUklURSAyCi0KLXN0cnVjdCB0dHlfbG9nX2J1ZiB7Ci0JaW50IHdoYXQ7Ci0JdW5zaWduZWQgbG9uZyB0dHk7Ci0JaW50IGxlbjsKLQlpbnQgZGlyZWN0aW9uOwotCXVuc2lnbmVkIGxvbmcgc2VjOwotCXVuc2lnbmVkIGxvbmcgdXNlYzsKLX07Ci0KLWludCBvcGVuX3R0eV9sb2codm9pZCAqdHR5LCB2b2lkICpjdXJyZW50X3R0eSkKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlzdHJ1Y3QgdHR5X2xvZ19idWYgZGF0YTsKLQljaGFyIGJ1ZltzdHJsZW4odHR5X2xvZ19kaXIpICsgc2l6ZW9mKCIwMTIzNDU2Nzg5MC0wMTIzNDU2N1wwIildOwotCWludCBmZDsKLQotCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotCWlmKHR0eV9sb2dfZmQgIT0gLTEpewotCQlkYXRhID0gKChzdHJ1Y3QgdHR5X2xvZ19idWYpIHsgLndoYXQgCT0gVFRZX0xPR19PUEVOLAotCQkJCQkgICAgICAgLnR0eSAgPSAodW5zaWduZWQgbG9uZykgdHR5LAotCQkJCQkgICAgICAgLmxlbiAgPSBzaXplb2YoY3VycmVudF90dHkpLAotCQkJCQkgICAgICAgLmRpcmVjdGlvbiA9IDAsCi0JCQkJCSAgICAgICAuc2VjID0gdHYudHZfc2VjLAotCQkJCQkgICAgICAgLnVzZWMgPSB0di50dl91c2VjIH0gKTsKLQkJd3JpdGUodHR5X2xvZ19mZCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0JCXdyaXRlKHR0eV9sb2dfZmQsICZjdXJyZW50X3R0eSwgZGF0YS5sZW4pOwotCQlyZXR1cm4gdHR5X2xvZ19mZDsKLQl9Ci0KLQlzcHJpbnRmKGJ1ZiwgIiVzLyUwdS0lMHUiLCB0dHlfbG9nX2RpciwgKHVuc2lnbmVkIGludCkgdHYudHZfc2VjLAotIAkJKHVuc2lnbmVkIGludCkgdHYudHZfdXNlYyk7Ci0KLQlmZCA9IG9zX29wZW5fZmlsZShidWYsIG9mX2FwcGVuZChvZl9jcmVhdGUob2ZfcmR3cihPUEVORkxBR1MoKSkpKSwKLQkJCSAgMDY0NCk7Ci0JaWYoZmQgPCAwKXsKLQkJcHJpbnRrKCJvcGVuX3R0eV9sb2cgOiBjb3VsZG4ndCBvcGVuICclcycsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgICBidWYsIC1mZCk7Ci0JfQotCXJldHVybiBmZDsKLX0KLQotdm9pZCBjbG9zZV90dHlfbG9nKGludCBmZCwgdm9pZCAqdHR5KQotewotCXN0cnVjdCB0dHlfbG9nX2J1ZiBkYXRhOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCi0JaWYodHR5X2xvZ19mZCAhPSAtMSl7Ci0JCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotCQlkYXRhID0gKChzdHJ1Y3QgdHR5X2xvZ19idWYpIHsgLndoYXQgCT0gVFRZX0xPR19DTE9TRSwKLQkJCQkJICAgICAgIC50dHkgID0gKHVuc2lnbmVkIGxvbmcpIHR0eSwKLQkJCQkJICAgICAgIC5sZW4gID0gMCwKLQkJCQkJICAgICAgIC5kaXJlY3Rpb24gPSAwLAotCQkJCQkgICAgICAgLnNlYyA9IHR2LnR2X3NlYywKLQkJCQkJICAgICAgIC51c2VjID0gdHYudHZfdXNlYyB9ICk7Ci0JCXdyaXRlKHR0eV9sb2dfZmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotCQlyZXR1cm47Ci0JfQotCW9zX2Nsb3NlX2ZpbGUoZmQpOwotfQotCi1zdGF0aWMgaW50IGxvZ19jaHVuayhpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgdG90YWwgPSAwLCB0cnksIG1pc3NlZCwgbjsKLQljaGFyIGNodW5rWzY0XTsKLQotCXdoaWxlKGxlbiA+IDApewotCQl0cnkgPSAobGVuID4gc2l6ZW9mKGNodW5rKSkgPyBzaXplb2YoY2h1bmspIDogbGVuOwotCQltaXNzZWQgPSBjb3B5X2Zyb21fdXNlcl9wcm9jKGNodW5rLCAoY2hhciAqKSBidWYsIHRyeSk7Ci0JCXRyeSAtPSBtaXNzZWQ7Ci0JCW4gPSB3cml0ZShmZCwgY2h1bmssIHRyeSk7Ci0JCWlmKG4gIT0gdHJ5KSB7Ci0JCQlpZihuIDwgMCkKLQkJCQlyZXR1cm4gLWVycm5vOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJaWYobWlzc2VkICE9IDApCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlsZW4gLT0gdHJ5OwotCQl0b3RhbCArPSB0cnk7Ci0JCWJ1ZiArPSB0cnk7Ci0JfQotCi0JcmV0dXJuIHRvdGFsOwotfQotCi1pbnQgd3JpdGVfdHR5X2xvZyhpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgdm9pZCAqdHR5LCBpbnQgaXNfcmVhZCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlzdHJ1Y3QgdHR5X2xvZ19idWYgZGF0YTsKLQlpbnQgZGlyZWN0aW9uOwotCi0JaWYoZmQgPT0gdHR5X2xvZ19mZCl7Ci0JCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotCQlkaXJlY3Rpb24gPSBpc19yZWFkID8gVFRZX1JFQUQgOiBUVFlfV1JJVEU7Ci0JCWRhdGEgPSAoKHN0cnVjdCB0dHlfbG9nX2J1ZikgeyAud2hhdCAJPSBUVFlfTE9HX1dSSVRFLAotCQkJCQkgICAgICAgLnR0eSAgPSAodW5zaWduZWQgbG9uZykgdHR5LAotCQkJCQkgICAgICAgLmxlbiAgPSBsZW4sCi0JCQkJCSAgICAgICAuZGlyZWN0aW9uID0gZGlyZWN0aW9uLAotCQkJCQkgICAgICAgLnNlYyA9IHR2LnR2X3NlYywKLQkJCQkJICAgICAgIC51c2VjID0gdHYudHZfdXNlYyB9ICk7Ci0JCXdyaXRlKHR0eV9sb2dfZmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotCX0KLQotCXJldHVybiBsb2dfY2h1bmsoZmQsIGJ1ZiwgbGVuKTsKLX0KLQotdm9pZCBsb2dfZXhlYyhjaGFyICoqYXJndiwgdm9pZCAqdHR5KQotewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCXN0cnVjdCB0dHlfbG9nX2J1ZiBkYXRhOwotCWNoYXIgKipwdHIsKmFyZzsKLQlpbnQgbGVuOwotCi0JaWYodHR5X2xvZ19mZCA9PSAtMSkgcmV0dXJuOwotCi0JZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0KLQlsZW4gPSAwOwotCWZvcihwdHIgPSBhcmd2OyA7IHB0cisrKXsKLQkJaWYoY29weV9mcm9tX3VzZXJfcHJvYygmYXJnLCBwdHIsIHNpemVvZihhcmcpKSkKLQkJCXJldHVybjsKLQkJaWYoYXJnID09IE5VTEwpIGJyZWFrOwotCQlsZW4gKz0gc3RybGVuX3VzZXJfcHJvYyhhcmcpOwotCX0KLQotCWRhdGEgPSAoKHN0cnVjdCB0dHlfbG9nX2J1ZikgeyAud2hhdCAJPSBUVFlfTE9HX0VYRUMsCi0JCQkJICAgICAgIC50dHkgID0gKHVuc2lnbmVkIGxvbmcpIHR0eSwKLQkJCQkgICAgICAgLmxlbiAgPSBsZW4sCi0JCQkJICAgICAgIC5kaXJlY3Rpb24gPSAwLAotCQkJCSAgICAgICAuc2VjID0gdHYudHZfc2VjLAotCQkJCSAgICAgICAudXNlYyA9IHR2LnR2X3VzZWMgfSApOwotCXdyaXRlKHR0eV9sb2dfZmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotCi0JZm9yKHB0ciA9IGFyZ3Y7IDsgcHRyKyspewotCQlpZihjb3B5X2Zyb21fdXNlcl9wcm9jKCZhcmcsIHB0ciwgc2l6ZW9mKGFyZykpKQotCQkJcmV0dXJuOwotCQlpZihhcmcgPT0gTlVMTCkgYnJlYWs7Ci0JCWxvZ19jaHVuayh0dHlfbG9nX2ZkLCBhcmcsIHN0cmxlbl91c2VyX3Byb2MoYXJnKSk7Ci0JfQotfQotCi1leHRlcm4gdm9pZCByZWdpc3Rlcl90dHlfbG9nZ2VyKGludCAoKm9wZW5lcikodm9pZCAqLCB2b2lkICopLAotCQkJCWludCAoKndyaXRlcikoaW50LCBjb25zdCBjaGFyICosIGludCwKLQkJCQkJICAgICAgdm9pZCAqLCBpbnQpLAotCQkJCXZvaWQgKCpjbG9zZXIpKGludCwgdm9pZCAqKSk7Ci0KLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbG9nZ2VyKHZvaWQpCi17Ci0JcmVnaXN0ZXJfdHR5X2xvZ2dlcihvcGVuX3R0eV9sb2csIHdyaXRlX3R0eV9sb2csIGNsb3NlX3R0eV9sb2cpOwotCXJldHVybiAwOwotfQotCi1fX3VtbF9pbml0Y2FsbChyZWdpc3Rlcl9sb2dnZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzZXRfdHR5X2xvZ19kaXIoY2hhciAqbmFtZSwgaW50ICphZGQpCi17Ci0JdHR5X2xvZ19kaXIgPSBuYW1lOwotCXJldHVybiAwOwotfQotCi1fX3VtbF9zZXR1cCgidHR5X2xvZ19kaXI9Iiwgc2V0X3R0eV9sb2dfZGlyLAotInR0eV9sb2dfZGlyPTxkaXJlY3Rvcnk+XG4iCi0iICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxvZ3Mgb2YgYWxsIHB0eVxuIgotIiAgICBkYXRhIGZyb20gdGhpcyBVTUwgbWFjaGluZSB3aWxsIGJlIHdyaXR0ZW4uXG5cbiIKLSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldF90dHlfbG9nX2ZkKGNoYXIgKm5hbWUsIGludCAqYWRkKQotewotCWNoYXIgKmVuZDsKLQotCXR0eV9sb2dfZmQgPSBzdHJ0b3VsKG5hbWUsICZlbmQsIDApOwotCWlmKCgqZW5kICE9ICdcMCcpIHx8IChlbmQgPT0gbmFtZSkpewotCQlwcmludGYoInNldF90dHlfbG9nX2ZkIC0gc3RydG91bCBmYWlsZWQgb24gJyVzJ1xuIiwgbmFtZSk7Ci0JCXR0eV9sb2dfZmQgPSAtMTsKLQl9Ci0KLQkqYWRkID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotX191bWxfc2V0dXAoInR0eV9sb2dfZmQ9Iiwgc2V0X3R0eV9sb2dfZmQsCi0idHR5X2xvZ19mZD08ZmQ+XG4iCi0iICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGEgcHJlY29uZmlndXJlZCBmaWxlIGRlc2NyaXB0b3IgdG8gd2hpY2ggYWxsXG4iCi0iICAgIHR0eSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4gIFByZWNvbmZpZ3VyZSB0aGUgZGVzY3JpcHRvciB3aXRoIHNvbWV0aGluZ1xuIgotIiAgICBsaWtlICcxMD50dHlfbG9nIHR0eV9sb2dfZmQ9MTAnLlxuXG4iCi0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxfdGFibGUuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zeXNjYWxsX3RhYmxlLmMKaW5kZXggYzEyOGViOC4uMzJmNWZiZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxfdGFibGUuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbF90YWJsZS5jCkBAIC00MSwxMiArNDEsMTIgQEAKICNkZWZpbmUgc3R1Yl9ydF9zaWdyZXR1cm4gc3lzX3J0X3NpZ3JldHVybgogCiAjZGVmaW5lIF9fU1lTQ0FMTChuciwgc3ltKSBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5bSh2b2lkKSA7Ci0jdW5kZWYgX0FTTV9YODZfNjRfVU5JU1REX0hfCisjdW5kZWYgQVNNX1g4Nl9fVU5JU1REXzY0X0gKICNpbmNsdWRlIDxhc20teDg2L3VuaXN0ZF82NC5oPgogCiAjdW5kZWYgX19TWVNDQUxMCiAjZGVmaW5lIF9fU1lTQ0FMTChuciwgc3ltKSBbIG5yIF0gPSBzeW0sCi0jdW5kZWYgX0FTTV9YODZfNjRfVU5JU1REX0hfCisjdW5kZWYgQVNNX1g4Nl9fVU5JU1REXzY0X0gKIAogdHlwZWRlZiB2b2lkICgqc3lzX2NhbGxfcHRyX3QpKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBlZDkyODY0Li5iZDNjMmM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTE4LDYgKzE4LDcgQEAKICMjIyBBcmNoIHNldHRpbmdzCiBjb25maWcgWDg2CiAJZGVmX2Jvb2wgeQorCXNlbGVjdCBIQVZFX0FPVVQgaWYgWDg2XzMyCiAJc2VsZWN0IEhBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0sKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQpAQCAtMjksNiArMzAsNyBAQAogCXNlbGVjdCBIQVZFX0ZUUkFDRQogCXNlbGVjdCBIQVZFX0tWTSBpZiAoKFg4Nl8zMiAmJiAhWDg2X1ZPWUFHRVIgJiYgIVg4Nl9WSVNXUyAmJiAhWDg2X05VTUFRKSB8fCBYODZfNjQpCiAJc2VsZWN0IEhBVkVfQVJDSF9LR0RCIGlmICFYODZfVk9ZQUdFUgorCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCiAJc2VsZWN0IEhBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaWYgWDg2XzMyCiAJc2VsZWN0IEhBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKIApAQCAtMzcsMTAgKzM5LDYgQEAKIAlkZWZhdWx0ICJhcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnIiBpZiBYODZfMzIKIAlkZWZhdWx0ICJhcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWciIGlmIFg4Nl82NAogCi0KLWNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBSwotCWRlZl9ib29sIG4KLQogY29uZmlnIEdFTkVSSUNfVElNRQogCWRlZl9ib29sIHkKIApAQCAtOTMsNyArOTEsNyBAQAogCWRlZl9ib29sIHkKIAogY29uZmlnIEdFTkVSSUNfR1BJTwotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWRlZl9ib29sIHkKQEAgLTEwNCwxMiArMTAyLDYgQEAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWRlZl9ib29sIFg4Nl9YQURECiAKLWNvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKLQlkZWZfYm9vbCBuCi0KLWNvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKLQlkZWZfYm9vbCBuCi0KIGNvbmZpZyBBUkNIX0hBU19DUFVfSURMRV9XQUlUCiAJZGVmX2Jvb2wgeQogCkBAIC0xNTEsOSArMTQzLDYgQEAKIAlib29sCiAJZGVmYXVsdCBYODZfNjQKIAotY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAotCWRlZl9ib29sIHkKLQogY29uZmlnIEFSQ0hfU1VQUE9SVFNfT1BUSU1JWkVEX0lOTElOSU5HCiAJZGVmX2Jvb2wgeQogCkBAIC01NTMsNiArNTQyLDcgQEAKIGNvbmZpZyBBTURfSU9NTVUKIAlib29sICJBTUQgSU9NTVUgc3VwcG9ydCIKIAlzZWxlY3QgU1dJT1RMQgorCXNlbGVjdCBQQ0lfTVNJCiAJZGVwZW5kcyBvbiBYODZfNjQgJiYgUENJICYmIEFDUEkKIAloZWxwCiAJICBXaXRoIHRoaXMgb3B0aW9uIHlvdSBjYW4gZW5hYmxlIHN1cHBvcnQgZm9yIEFNRCBJT01NVSBoYXJkd2FyZSBpbgpAQCAtNzU4LDkgKzc0OCw4IEBACiAJICBTYXkgTiBvdGhlcndpc2UuCiAKIGNvbmZpZyBYODZfUkVCT09URklYVVBTCi0JZGVmX2Jvb2wgbgotCXByb21wdCAiRW5hYmxlIFg4NiBib2FyZCBzcGVjaWZpYyBmaXh1cHMgZm9yIHJlYm9vdCIKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBYODYKKwlib29sICJFbmFibGUgWDg2IGJvYXJkIHNwZWNpZmljIGZpeHVwcyBmb3IgcmVib290IgorCWRlcGVuZHMgb24gWDg2XzMyCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIGNoaXBzZXQgYW5kL29yIGJvYXJkIHNwZWNpZmljIGZpeHVwcyB0byBiZSBkb25lCiAJICBpbiBvcmRlciB0byBnZXQgcmVib290IHRvIHdvcmsgY29ycmVjdGx5LiBUaGlzIGlzIG9ubHkgbmVlZGVkIG9uCkBAIC03NzYsMjMgKzc2NSw0NSBAQAogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgTUlDUk9DT0RFCi0JdHJpc3RhdGUgIi9kZXYvY3B1L21pY3JvY29kZSAtIEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSBzdXBwb3J0IgorCXRyaXN0YXRlICIvZGV2L2NwdS9taWNyb2NvZGUgLSBtaWNyb2NvZGUgc3VwcG9ydCIKIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXBkYXRlIHRoZSBtaWNyb2NvZGUgb24KLQkgIEludGVsIHByb2Nlc3NvcnMgaW4gdGhlIElBMzIgZmFtaWx5LCBlLmcuIFBlbnRpdW0gUHJvLCBQZW50aXVtIElJLAotCSAgUGVudGl1bSBJSUksIFBlbnRpdW0gNCwgWGVvbiBldGMuICBZb3Ugd2lsbCBvYnZpb3VzbHkgbmVlZCB0aGUKLQkgIGFjdHVhbCBtaWNyb2NvZGUgYmluYXJ5IGRhdGEgaXRzZWxmIHdoaWNoIGlzIG5vdCBzaGlwcGVkIHdpdGggdGhlCi0JICBMaW51eCBrZXJuZWwuCisJICBjZXJ0YWluIEludGVsIGFuZCBBTUQgcHJvY2Vzc29ycy4gVGhlIEludGVsIHN1cHBvcnQgaXMgZm9yIHRoZQorCSAgSUEzMiBmYW1pbHksIGUuZy4gUGVudGl1bSBQcm8sIFBlbnRpdW0gSUksIFBlbnRpdW0gSUlJLAorCSAgUGVudGl1bSA0LCBYZW9uIGV0Yy4gVGhlIEFNRCBzdXBwb3J0IGlzIGZvciBmYW1pbHkgMHgxMCBhbmQKKwkgIDB4MTEgcHJvY2Vzc29ycywgZS5nLiBPcHRlcm9uLCBQaGVub20gYW5kIFR1cmlvbiA2NCBVbHRyYS4KKwkgIFlvdSB3aWxsIG9idmlvdXNseSBuZWVkIHRoZSBhY3R1YWwgbWljcm9jb2RlIGJpbmFyeSBkYXRhIGl0c2VsZgorCSAgd2hpY2ggaXMgbm90IHNoaXBwZWQgd2l0aCB0aGUgTGludXgga2VybmVsLgogCi0JICBGb3IgbGF0ZXN0IG5ld3MgYW5kIGluZm9ybWF0aW9uIG9uIG9idGFpbmluZyBhbGwgdGhlIHJlcXVpcmVkCi0JICBpbmdyZWRpZW50cyBmb3IgdGhpcyBkcml2ZXIsIGNoZWNrOgotCSAgPGh0dHA6Ly93d3cudXJiYW5teXRoLm9yZy9taWNyb2NvZGUvPi4KKwkgIFRoaXMgb3B0aW9uIHNlbGVjdHMgdGhlIGdlbmVyYWwgbW9kdWxlIG9ubHksIHlvdSBuZWVkIHRvIHNlbGVjdAorCSAgYXQgbGVhc3Qgb25lIHZlbmRvciBzcGVjaWZpYyBtb2R1bGUgYXMgd2VsbC4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWljcm9jb2RlLgogCi1jb25maWcgTUlDUk9DT0RFX09MRF9JTlRFUkZBQ0UKK2NvbmZpZyBNSUNST0NPREVfSU5URUwKKyAgICAgICBib29sICJJbnRlbCBtaWNyb2NvZGUgcGF0Y2ggbG9hZGluZyBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gTUlDUk9DT0RFCisgICAgICAgZGVmYXVsdCBNSUNST0NPREUKKyAgICAgICBzZWxlY3QgRldfTE9BREVSCisgICAgICAgLS1oZWxwLS0tCisgICAgICAgICBUaGlzIG9wdGlvbnMgZW5hYmxlcyBtaWNyb2NvZGUgcGF0Y2ggbG9hZGluZyBzdXBwb3J0IGZvciBJbnRlbAorICAgICAgICAgcHJvY2Vzc29ycy4KKworICAgICAgICAgRm9yIGxhdGVzdCBuZXdzIGFuZCBpbmZvcm1hdGlvbiBvbiBvYnRhaW5pbmcgYWxsIHRoZSByZXF1aXJlZAorICAgICAgICAgSW50ZWwgaW5ncmVkaWVudHMgZm9yIHRoaXMgZHJpdmVyLCBjaGVjazoKKyAgICAgICAgIDxodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlLz4uCisKK2NvbmZpZyBNSUNST0NPREVfQU1ECisgICAgICAgYm9vbCAiQU1EIG1pY3JvY29kZSBwYXRjaCBsb2FkaW5nIHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBNSUNST0NPREUKKyAgICAgICBzZWxlY3QgRldfTE9BREVSCisgICAgICAgLS1oZWxwLS0tCisgICAgICAgICBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCBtaWNyb2NvZGUgcGF0Y2ggbG9hZGluZyBzdXBwb3J0IGZvciBBTUQKKwkgcHJvY2Vzc29ycyB3aWxsIGJlIGVuYWJsZWQuCisKKyAgIGNvbmZpZyBNSUNST0NPREVfT0xEX0lOVEVSRkFDRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE1JQ1JPQ09ERQogCkBAIC05MjIsMTYgKzkzMywxNyBAQAogCWRlcGVuZHMgb24gWDg2XzMyICYmIChISUdITUVNNjRHIHx8IEhJR0hNRU00RykKIAogY29uZmlnIFg4Nl9QQUUKLQlkZWZfYm9vbCBuCi0JcHJvbXB0ICJQQUUgKFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uKSBTdXBwb3J0IgorCWJvb2wgIlBBRSAoUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24pIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYODZfMzIgJiYgIUhJR0hNRU00RwotCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQKIAloZWxwCiAJICBQQUUgaXMgcmVxdWlyZWQgZm9yIE5YIHN1cHBvcnQsIGFuZCBmdXJ0aGVybW9yZSBlbmFibGVzCiAJICBsYXJnZXIgc3dhcHNwYWNlIHN1cHBvcnQgZm9yIG5vbi1vdmVyY29tbWl0IHB1cnBvc2VzLiBJdAogCSAgaGFzIHRoZSBjb3N0IG9mIG1vcmUgcGFnZXRhYmxlIGxvb2t1cCBvdmVyaGVhZCwgYW5kIGFsc28KIAkgIGNvbnN1bWVzIG1vcmUgcGFnZXRhYmxlIHNwYWNlIHBlciBwcm9jZXNzLgogCitjb25maWcgQVJDSF9QSFlTX0FERFJfVF82NEJJVAorICAgICAgIGRlZl9ib29sIFg4Nl82NCB8fCBYODZfUEFFCisKICMgQ29tbW9uIE5VTUEgRmVhdHVyZXMKIGNvbmZpZyBOVU1BCiAJYm9vbCAiTnVtYSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCkBAIC0xMDIwLDcgKzEwMzIsNyBAQAogCiBjb25maWcgQVJDSF9GTEFUTUVNX0VOQUJMRQogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBBUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgJiYgWDg2X1BDICYmICFOVU1BCisJZGVwZW5kcyBvbiBYODZfMzIgJiYgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMICYmICFOVU1BCiAKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlkZWZfYm9vbCB5CkBAIC0xMDM2LDcgKzEwNDgsNyBAQAogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gWDg2XzY0IHx8IE5VTUEgfHwgKEVYUEVSSU1FTlRBTCAmJiBYODZfUEMpCisJZGVwZW5kcyBvbiBYODZfNjQgfHwgTlVNQSB8fCAoRVhQRVJJTUVOVEFMICYmIFg4Nl9QQykgfHwgWDg2X0dFTkVSSUNBUkNICiAJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMgaWYgWDg2XzMyCiAJc2VsZWN0IFNQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpZiBYODZfNjQKIApAQCAtMTA1OSw2ICsxMDcxLDU2IEBACiAJICBsb3cgbWVtb3J5LiAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIHB1dCB1c2VyLXNwYWNlIHBhZ2UgdGFibGUKIAkgIGVudHJpZXMgaW4gaGlnaCBtZW1vcnkuCiAKK2NvbmZpZyBYODZfQ0hFQ0tfQklPU19DT1JSVVBUSU9OCisgICAgICAgIGJvb2wgIkNoZWNrIGZvciBsb3cgbWVtb3J5IGNvcnJ1cHRpb24iCisJaGVscAorCSBQZXJpb2RpY2FsbHkgY2hlY2sgZm9yIG1lbW9yeSBjb3JydXB0aW9uIGluIGxvdyBtZW1vcnksIHdoaWNoCisJIGlzIHN1c3BlY3RlZCB0byBiZSBjYXVzZWQgYnkgQklPUy4gIEV2ZW4gd2hlbiBlbmFibGVkIGluIHRoZQorCSBjb25maWd1cmF0aW9uLCBpdCBpcyBkaXNhYmxlZCBhdCBydW50aW1lLiAgRW5hYmxlIGl0IGJ5CisJIHNldHRpbmcgIm1lbW9yeV9jb3JydXB0aW9uX2NoZWNrPTEiIG9uIHRoZSBrZXJuZWwgY29tbWFuZAorCSBsaW5lLiAgQnkgZGVmYXVsdCBpdCBzY2FucyB0aGUgbG93IDY0ayBvZiBtZW1vcnkgZXZlcnkgNjAKKwkgc2Vjb25kczsgc2VlIHRoZSBtZW1vcnlfY29ycnVwdGlvbl9jaGVja19zaXplIGFuZAorCSBtZW1vcnlfY29ycnVwdGlvbl9jaGVja19wZXJpb2QgcGFyYW1ldGVycyBpbgorCSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCB0byBhZGp1c3QgdGhpcy4KKworCSBXaGVuIGVuYWJsZWQgd2l0aCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLCB0aGlzIG9wdGlvbiBoYXMKKwkgYWxtb3N0IG5vIG92ZXJoZWFkLCBhcyBpdCByZXNlcnZlcyBhIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50CisJIG9mIG1lbW9yeSBhbmQgc2NhbnMgaXQgaW5mcmVxdWVudGx5LiAgSXQgYm90aCBkZXRlY3RzIGNvcnJ1cHRpb24KKwkgYW5kIHByZXZlbnRzIGl0IGZyb20gYWZmZWN0aW5nIHRoZSBydW5uaW5nIHN5c3RlbS4KKworCSBJdCBpcywgaG93ZXZlciwgaW50ZW5kZWQgYXMgYSBkaWFnbm9zdGljIHRvb2w7IGlmIHJlcGVhdGFibGUKKwkgQklPUy1vcmlnaW5hdGVkIGNvcnJ1cHRpb24gYWx3YXlzIGFmZmVjdHMgdGhlIHNhbWUgbWVtb3J5LAorCSB5b3UgY2FuIHVzZSBtZW1tYXA9IHRvIHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIHVzaW5nIHRoYXQKKwkgbWVtb3J5LgorCitjb25maWcgWDg2X0JPT1RQQVJBTV9NRU1PUllfQ09SUlVQVElPTl9DSEVDSworICAgICAgICBib29sICJTZXQgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiBtZW1vcnlfY29ycnVwdGlvbl9jaGVjayIKKwlkZXBlbmRzIG9uIFg4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT04KKwlkZWZhdWx0IHkKKwloZWxwCisJIFNldCB3aGV0aGVyIHRoZSBkZWZhdWx0IHN0YXRlIG9mIG1lbW9yeV9jb3JydXB0aW9uX2NoZWNrIGlzCisJIG9uIG9yIG9mZi4KKworY29uZmlnIFg4Nl9SRVNFUlZFX0xPV182NEsKKyAgICAgICAgYm9vbCAiUmVzZXJ2ZSBsb3cgNjRLIG9mIFJBTSBvbiBBTUkvUGhvZW5peCBCSU9TZW4iCisJZGVmYXVsdCB5CisJaGVscAorCSBSZXNlcnZlIHRoZSBmaXJzdCA2NEsgb2YgcGh5c2ljYWwgUkFNIG9uIEJJT1NlcyB0aGF0IGFyZSBrbm93bgorCSB0byBwb3RlbnRpYWxseSBjb3JydXB0IHRoYXQgbWVtb3J5IHJhbmdlLiBBIG51bWJlcnMgb2YgQklPU2VzIGFyZQorCSBrbm93biB0byB1dGlsaXplIHRoaXMgYXJlYSBkdXJpbmcgc3VzcGVuZC9yZXN1bWUsIHNvIGl0IG11c3Qgbm90CisJIGJlIHVzZWQgYnkgdGhlIGtlcm5lbC4KKworCSBTZXQgdGhpcyB0byBOIGlmIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgeW91IHRydXN0IHRoZSBCSU9TCisJIHRvIGdldCBhbGwgaXRzIG1lbW9yeSByZXNlcnZhdGlvbnMgYW5kIHVzYWdlcyByaWdodC4KKworCSBJZiB5b3UgaGF2ZSBkb3VidHMgYWJvdXQgdGhlIEJJT1MgKGUuZy4gc3VzcGVuZC9yZXN1bWUgZG9lcyBub3QKKwkgd29yayBvciB0aGVyZSdzIGtlcm5lbCBjcmFzaGVzIGFmdGVyIGNlcnRhaW4gaGFyZHdhcmUgaG90cGx1ZworCSBldmVudHMpIGFuZCBpdCdzIG5vdCBBTUkgb3IgUGhvZW5peCwgdGhlbiB5b3UgbWlnaHQgd2FudCB0byBlbmFibGUKKwkgWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTj15IHRvIGFsbG93IHRoZSBrZXJuZWwgdG8gY2hlY2sgdHlwaWNhbAorCSBjb3JydXB0aW9uIHBhdHRlcm5zLgorCisJIFNheSBZIGlmIHVuc3VyZS4KKwogY29uZmlnIE1BVEhfRU1VTEFUSU9OCiAJYm9vbAogCXByb21wdCAiTWF0aCBlbXVsYXRpb24iIGlmIFg4Nl8zMgpAQCAtMTExNywxMCArMTE3OSwxMCBAQAogCSAgWW91IGNhbiBzYWZlbHkgc2F5IFkgZXZlbiBpZiB5b3VyIG1hY2hpbmUgZG9lc24ndCBoYXZlIE1UUlJzLCB5b3UnbGwKIAkgIGp1c3QgYWRkIGFib3V0IDkgS0IgdG8geW91ciBrZXJuZWwuCiAKLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL210cnIudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3g4Ni9tdHJyLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIGNvbmZpZyBNVFJSX1NBTklUSVpFUgotCWJvb2wKKwlkZWZfYm9vbCB5CiAJcHJvbXB0ICJNVFJSIGNsZWFudXAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1UUlIKIAloZWxwCkBAIC0xMTMxLDcgKzExOTMsNyBAQAogCSAgVGhlIGxhcmdlc3QgbXRyciBlbnRyeSBzaXplIGZvciBhIGNvbnRpbm91cyBibG9jayBjYW4gYmUgc2V0IHdpdGgKIAkgIG10cnJfY2h1bmtfc2l6ZS4KIAotCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBNVFJSX1NBTklUSVpFUl9FTkFCTEVfREVGQVVMVAogCWludCAiTVRSUiBjbGVhbnVwIGVuYWJsZSB2YWx1ZSAoMC0xKSIKQEAgLTExNjYsOCArMTIyOCw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgRUZJCi0JZGVmX2Jvb2wgbgotCXByb21wdCAiRUZJIHJ1bnRpbWUgc2VydmljZSBzdXBwb3J0IgorCWJvb2wgIkVGSSBydW50aW1lIHNlcnZpY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFDUEkKIAktLS1oZWxwLS0tCiAJVGhpcyBlbmFibGVzIHRoZSBrZXJuZWwgdG8gdXNlIEVGSSBydW50aW1lIHNlcnZpY2VzIHRoYXQgYXJlCkBAIC0xMTkxLDcgKzEyNTIsNiBAQAogY29uZmlnIFNFQ0NPTVAKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCi0JZGVwZW5kcyBvbiBQUk9DX0ZTCiAJaGVscAogCSAgVGhpcyBrZXJuZWwgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIG51bWJlciBjcnVuY2hpbmcgYXBwbGljYXRpb25zCiAJICB0aGF0IG1heSBuZWVkIHRvIGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIGR1cmluZyB0aGVpcgpAQCAtMTE5OSw3ICsxMjU5LDcgQEAKIAkgIHRoZSBwcm9jZXNzIGFzIGZpbGUgZGVzY3JpcHRvcnMgc3VwcG9ydGluZyB0aGUgcmVhZC93cml0ZQogCSAgc3lzY2FsbHMsIGl0J3MgcG9zc2libGUgdG8gaXNvbGF0ZSB0aG9zZSBhcHBsaWNhdGlvbnMgaW4KIAkgIHRoZWlyIG93biBhZGRyZXNzIHNwYWNlIHVzaW5nIHNlY2NvbXAuIE9uY2Ugc2VjY29tcCBpcwotCSAgZW5hYmxlZCB2aWEgL3Byb2MvPHBpZD4vc2VjY29tcCwgaXQgY2Fubm90IGJlIGRpc2FibGVkCisJICBlbmFibGVkIHZpYSBwcmN0bChQUl9TRVRfU0VDQ09NUCksIGl0IGNhbm5vdCBiZSBkaXNhYmxlZAogCSAgYW5kIHRoZSB0YXNrIGlzIG9ubHkgYWxsb3dlZCB0byBleGVjdXRlIGEgZmV3IHNhZmUgc3lzY2FsbHMKIAkgIGRlZmluZWQgYnkgZWFjaCBzZWNjb21wIG1vZGUuCiAKQEAgLTEzNTYsMTQgKzE0MTYsMTQgQEAKIAkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKIGNvbmZpZyBIT1RQTFVHX0NQVQotCWJvb2wgIlN1cHBvcnQgZm9yIHN1c3BlbmQgb24gU01QIGFuZCBob3QtcGx1Z2dhYmxlIENQVXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwgJiYgIVg4Nl9WT1lBR0VSCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIgorCWRlcGVuZHMgb24gU01QICYmIEhPVFBMVUcgJiYgIVg4Nl9WT1lBR0VSCiAJLS0taGVscC0tLQotCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24sIGFuZCB0bwotCSAgZW5hYmxlIHN1c3BlbmQgb24gU01QIHN5c3RlbXMuIENQVXMgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaAotCSAgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUuCi0JICBTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnIGFuZCBkb24ndCBuZWVkIHRvCi0JICBzdXNwZW5kLgorCSAgU2F5IFkgaGVyZSB0byBhbGxvdyB0dXJuaW5nIENQVXMgb2ZmIGFuZCBvbi4gQ1BVcyBjYW4gYmUKKwkgIGNvbnRyb2xsZWQgdGhyb3VnaCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS4KKwkgICggTm90ZTogcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0IHdpbGwgZW5hYmxlIHRoaXMgb3B0aW9uCisJICAgIGF1dG9tYXRpY2FsbHkgb24gU01QIHN5c3RlbXMuICkKKwkgIFNheSBOIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgQ1BVIGhvdHBsdWcuCiAKIGNvbmZpZyBDT01QQVRfVkRTTwogCWRlZl9ib29sIHkKQEAgLTEzNzgsNiArMTQzOCw1MSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgQ01ETElORV9CT09MCisJYm9vbCAiQnVpbHQtaW4ga2VybmVsIGNvbW1hbmQgbGluZSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBBbGxvdyBmb3Igc3BlY2lmeWluZyBib290IGFyZ3VtZW50cyB0byB0aGUga2VybmVsIGF0CisJICBidWlsZCB0aW1lLiAgT24gc29tZSBzeXN0ZW1zIChlLmcuIGVtYmVkZGVkIG9uZXMpLCBpdCBpcworCSAgbmVjZXNzYXJ5IG9yIGNvbnZlbmllbnQgdG8gcHJvdmlkZSBzb21lIG9yIGFsbCBvZiB0aGUKKwkgIGtlcm5lbCBib290IGFyZ3VtZW50cyB3aXRoIHRoZSBrZXJuZWwgaXRzZWxmICh0aGF0IGlzLAorCSAgdG8gbm90IHJlbHkgb24gdGhlIGJvb3QgbG9hZGVyIHRvIHByb3ZpZGUgdGhlbS4pCisKKwkgIFRvIGNvbXBpbGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIHRoZSBrZXJuZWwsCisJICBzZXQgdGhpcyBvcHRpb24gdG8gJ1knLCB0aGVuIGZpbGwgaW4gdGhlCisJICB0aGUgYm9vdCBhcmd1bWVudHMgaW4gQ09ORklHX0NNRExJTkUuCisKKwkgIFN5c3RlbXMgd2l0aCBmdWxseSBmdW5jdGlvbmFsIGJvb3QgbG9hZGVycyAoaS5lLiBub24tZW1iZWRkZWQpCisJICBzaG91bGQgbGVhdmUgdGhpcyBvcHRpb24gc2V0IHRvICdOJy4KKworY29uZmlnIENNRExJTkUKKwlzdHJpbmcgIkJ1aWx0LWluIGtlcm5lbCBjb21tYW5kIHN0cmluZyIKKwlkZXBlbmRzIG9uIENNRExJTkVfQk9PTAorCWRlZmF1bHQgIiIKKwloZWxwCisJICBFbnRlciBhcmd1bWVudHMgaGVyZSB0aGF0IHNob3VsZCBiZSBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwKKwkgIGltYWdlIGFuZCB1c2VkIGF0IGJvb3QgdGltZS4gIElmIHRoZSBib290IGxvYWRlciBwcm92aWRlcyBhCisJICBjb21tYW5kIGxpbmUgYXQgYm9vdCB0aW1lLCBpdCBpcyBhcHBlbmRlZCB0byB0aGlzIHN0cmluZyB0bworCSAgZm9ybSB0aGUgZnVsbCBrZXJuZWwgY29tbWFuZCBsaW5lLCB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMuCisKKwkgIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIHRoZSBDT05GSUdfQ01ETElORV9PVkVSUklERSBvcHRpb24gdG8KKwkgIGNoYW5nZSB0aGlzIGJlaGF2aW9yLgorCisJICBJbiBtb3N0IGNhc2VzLCB0aGUgY29tbWFuZCBsaW5lICh3aGV0aGVyIGJ1aWx0LWluIG9yIHByb3ZpZGVkCisJICBieSB0aGUgYm9vdCBsb2FkZXIpIHNob3VsZCBzcGVjaWZ5IHRoZSBkZXZpY2UgZm9yIHRoZSByb290CisJICBmaWxlIHN5c3RlbS4KKworY29uZmlnIENNRExJTkVfT1ZFUlJJREUKKwlib29sICJCdWlsdC1pbiBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIGJvb3QgbG9hZGVyIGFyZ3VtZW50cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIENNRExJTkVfQk9PTAorCWhlbHAKKwkgIFNldCB0aGlzIG9wdGlvbiB0byAnWScgdG8gaGF2ZSB0aGUga2VybmVsIGlnbm9yZSB0aGUgYm9vdCBsb2FkZXIKKwkgIGNvbW1hbmQgbGluZSwgYW5kIHVzZSBPTkxZIHRoZSBidWlsdC1pbiBjb21tYW5kIGxpbmUuCisKKwkgIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCBicm9rZW4gYm9vdCBsb2FkZXJzLiAgVGhpcyBzaG91bGQKKwkgIGJlIHNldCB0byAnTicgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMuCisKIGVuZG1lbnUKIAogY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCkBAIC0xNjQzLDYgKzE3NDgsMTQgQEAKIAkgd29ya2Fyb3VuZCB3aWxsIHNldHVwIGEgMToxIG1hcHBpbmcgZm9yIHRoZSBmaXJzdAogCSAxNk0gdG8gbWFrZSBmbG9wcHkgKGFuIElTQSBkZXZpY2UpIHdvcmsuCiAKK2NvbmZpZyBJTlRSX1JFTUFQCisJYm9vbCAiU3VwcG9ydCBmb3IgSW50ZXJydXB0IFJlbWFwcGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFg4Nl82NCAmJiBYODZfSU9fQVBJQyAmJiBQQ0lfTVNJICYmIEFDUEkgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSBTdXBwb3J0cyBJbnRlcnJ1cHQgcmVtYXBwaW5nIGZvciBJTy1BUElDIGFuZCBNU0kgZGV2aWNlcy4KKwkgVG8gdXNlIHgyYXBpYyBtb2RlIGluIHRoZSBDUFUncyB3aGljaCBzdXBwb3J0IHgyQVBJQyBlbmhhbmNlbWVudHMgb3IKKwkgdG8gc3VwcG9ydCBwbGF0Zm9ybXMgd2l0aCBDUFUncyBoYXZpbmcgPiA4IGJpdCBBUElDIElELCBzYXkgWS4KKwogc291cmNlICJkcml2ZXJzL3BjaS9wY2llL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKQEAgLTE3NTksNyArMTg3Miw3IEBACiAKIGNvbmZpZyBJQTMyX0FPVVQKICAgICAgICB0cmlzdGF0ZSAiSUEzMiBhLm91dCBzdXBwb3J0IgotICAgICAgIGRlcGVuZHMgb24gSUEzMl9FTVVMQVRJT04gJiYgQVJDSF9TVVBQT1JUU19BT1VUCisgICAgICAgZGVwZW5kcyBvbiBJQTMyX0VNVUxBVElPTgogICAgICAgIGhlbHAKICAgICAgICAgIFN1cHBvcnQgb2xkIGEub3V0IGJpbmFyaWVzIGluIHRoZSAzMmJpdCBlbXVsYXRpb24uCiAKQEAgLTE3NzMsNyArMTg4Niw3IEBACiAKIGNvbmZpZyBTWVNWSVBDX0NPTVBBVAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFg4Nl82NCAmJiBDT01QQVQgJiYgU1lTVklQQworCWRlcGVuZHMgb24gQ09NUEFUICYmIFNZU1ZJUEMKIAogZW5kbWVudQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnLmNwdSBiL2FyY2gveDg2L0tjb25maWcuY3B1CmluZGV4IDJjNTE4ZmIuLjBiN2M0YTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuY3B1CisrKyBiL2FyY2gveDg2L0tjb25maWcuY3B1CkBAIC0zOCw4ICszOCw3IEBACiAJICAtICJDcnVzb2UiIGZvciB0aGUgVHJhbnNtZXRhIENydXNvZSBzZXJpZXMuCiAJICAtICJFZmZpY2VvbiIgZm9yIHRoZSBUcmFuc21ldGEgRWZmaWNlb24gc2VyaWVzLgogCSAgLSAiV2luY2hpcC1DNiIgZm9yIG9yaWdpbmFsIElEVCBXaW5jaGlwLgotCSAgLSAiV2luY2hpcC0yIiBmb3IgSURUIFdpbmNoaXAgMi4KLQkgIC0gIldpbmNoaXAtMkEiIGZvciBJRFQgV2luY2hpcHMgd2l0aCAzZE5vdyEgY2FwYWJpbGl0aWVzLgorCSAgLSAiV2luY2hpcC0yIiBmb3IgSURUIFdpbmNoaXBzIHdpdGggM2ROb3chIGNhcGFiaWxpdGllcy4KIAkgIC0gIkdlb2RlR1gxIiBmb3IgR2VvZGUgR1gxIChDeXJpeCBNZWRpYUdYKS4KIAkgIC0gIkdlb2RlIEdYL0xYIiBGb3IgQU1EIEdlb2RlIEdYIGFuZCBMWCBwcm9jZXNzb3JzLgogCSAgLSAiQ3lyaXhJSUkvVklBIEMzIiBmb3IgVklBIEN5cml4IElJSSBvciBWSUEgQzMuCkBAIC0xOTQsMTkgKzE5MywxMSBAQAogCSAgdHJlYXQgdGhpcyBjaGlwIGFzIGEgNTg2VFNDIHdpdGggc29tZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMKIAkgIGFuZCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLgogCi1jb25maWcgTVdJTkNISVAyCi0JYm9vbCAiV2luY2hpcC0yIgotCWRlcGVuZHMgb24gWDg2XzMyCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTIuICBMaW51eCBhbmQgR0NDCi0JICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucwotCSAgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCi0KIGNvbmZpZyBNV0lOQ0hJUDNECi0JYm9vbCAiV2luY2hpcC0yQS9XaW5jaGlwLTMiCisJYm9vbCAiV2luY2hpcC0yL1dpbmNoaXAtMkEvV2luY2hpcC0zIgogCWRlcGVuZHMgb24gWDg2XzMyCiAJaGVscAotCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTJBIG9yIDMuICBMaW51eCBhbmQgR0NDCisJICBTZWxlY3QgdGhpcyBmb3IgYW4gSURUIFdpbmNoaXAtMiwgMkEgb3IgMy4gIExpbnV4IGFuZCBHQ0MKIAkgIHRyZWF0IHRoaXMgY2hpcCBhcyBhIDU4NlRTQyB3aXRoIHNvbWUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zCiAJICBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gIEFsc28gZW5hYmxlIG91dCBvZiBvcmRlciBtZW1vcnkKIAkgIHN0b3JlcyBmb3IgdGhpcyBDUFUsIHdoaWNoIGNhbiBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvZiBzb21lCkBAIC0zMTgsNyArMzA5LDcgQEAKIAlpbnQKIAlkZWZhdWx0ICI3IiBpZiBNUEVOVElVTTQgfHwgWDg2X0dFTkVSSUMgfHwgR0VORVJJQ19DUFUgfHwgTVBTQwogCWRlZmF1bHQgIjQiIGlmIFg4Nl9FTEFOIHx8IE00ODYgfHwgTTM4NiB8fCBNR0VPREVHWDEKLQlkZWZhdWx0ICI1IiBpZiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNV0lOQ0hJUEM2IHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzYgfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE1WSUFDM18yIHx8IE1HRU9ERV9MWAorCWRlZmF1bHQgIjUiIGlmIE1XSU5DSElQM0QgfHwgTVdJTkNISVBDNiB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs2IHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNVklBQzNfMiB8fCBNR0VPREVfTFgKIAlkZWZhdWx0ICI2IiBpZiBNSzcgfHwgTUs4IHx8IE1QRU5USVVNTSB8fCBNQ09SRTIgfHwgTVZJQUM3CiAKIGNvbmZpZyBYODZfWEFERApAQCAtMzYwLDcgKzM1MSw3IEBACiAKIGNvbmZpZyBYODZfQUxJR05NRU5UXzE2CiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gTVdJTkNISVAzRCB8fCBNV0lOQ0hJUDIgfHwgTVdJTkNISVBDNiB8fCBNQ1lSSVhJSUkgfHwgWDg2X0VMQU4gfHwgTUs2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTVZJQUMzXzIgfHwgTUdFT0RFR1gxCisJZGVwZW5kcyBvbiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQQzYgfHwgTUNZUklYSUlJIHx8IFg4Nl9FTEFOIHx8IE1LNiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNNDg2IHx8IE1WSUFDM18yIHx8IE1HRU9ERUdYMQogCiBjb25maWcgWDg2X0lOVEVMX1VTRVJDT1BZCiAJZGVmX2Jvb2wgeQpAQCAtMzY4LDcgKzM1OSw3IEBACiAKIGNvbmZpZyBYODZfVVNFX1BQUk9fQ0hFQ0tTVU0KIAlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNV0lOQ0hJUEM2IHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE1LOCB8fCBNVklBQzNfMiB8fCBNRUZGSUNFT04gfHwgTUdFT0RFX0xYIHx8IE1DT1JFMgorCWRlcGVuZHMgb24gTVdJTkNISVAzRCB8fCBNV0lOQ0hJUEM2IHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE1LOCB8fCBNVklBQzNfMiB8fCBNRUZGSUNFT04gfHwgTUdFT0RFX0xYIHx8IE1DT1JFMgogCiBjb25maWcgWDg2X1VTRV8zRE5PVwogCWRlZl9ib29sIHkKQEAgLTM3NiwyNCArMzY3LDI3IEBACiAKIGNvbmZpZyBYODZfT09TVE9SRQogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIChNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNV0lOQ0hJUEM2KSAmJiBNVFJSCisJZGVwZW5kcyBvbiAoTVdJTkNISVAzRCB8fCBNV0lOQ0hJUEM2KSAmJiBNVFJSCiAKICMKICMgUDZfTk9QcyBhcmUgYSByZWxhdGl2ZWx5IG1pbm9yIG9wdGltaXphdGlvbiB0aGF0IHJlcXVpcmUgYSBmYW1pbHkgPj0KICMgNiBwcm9jZXNzb3IsIGV4Y2VwdCB0aGF0IGl0IGlzIGJyb2tlbiBvbiBjZXJ0YWluIFZJQSBjaGlwcy4KICMgRnVydGhlcm1vcmUsIEFNRCBjaGlwcyBwcmVmZXIgYSB0b3RhbGx5IGRpZmZlcmVudCBzZXF1ZW5jZSBvZiBOT1BzCi0jICh3aGljaCB3b3JrIG9uIGFsbCBDUFVzKS4gIEFzIGEgcmVzdWx0LCBkaXNhbGxvdyB0aGVzZSBpZiB3ZSdyZQotIyBjb21waWxpbmcgWDg2X0dFTkVSSUMgYnV0IG5vdCBYODZfNjQgKHRoZXNlIE5PUHMgZG8gd29yayBvbiBhbGwKLSMgeDg2LTY0IGNhcGFibGUgY2hpcHMpOyB0aGUgbGlzdCBvZiBwcm9jZXNzb3JzIGluIHRoZSByaWdodC1oYW5kIGNsYXVzZQotIyBhcmUgdGhlIGNvcmVzIHRoYXQgYmVuZWZpdCBmcm9tIHRoaXMgb3B0aW1pemF0aW9uLgorIyAod2hpY2ggd29yayBvbiBhbGwgQ1BVcykuICBJbiBhZGRpdGlvbiwgaXQgbG9va3MgbGlrZSBWaXJ0dWFsIFBDCisjIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlbS4KKyMKKyMgQXMgYSByZXN1bHQsIGRpc2FsbG93IHRoZXNlIGlmIHdlJ3JlIG5vdCBjb21waWxpbmcgZm9yIFg4Nl82NCAodGhlc2UKKyMgTk9QcyBkbyB3b3JrIG9uIGFsbCB4ODYtNjQgY2FwYWJsZSBjaGlwcyk7IHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMgaW4KKyMgdGhlIHJpZ2h0LWhhbmQgY2xhdXNlIGFyZSB0aGUgY29yZXMgdGhhdCBiZW5lZml0IGZyb20gdGhpcyBvcHRpbWl6YXRpb24uCiAjCiBjb25maWcgWDg2X1A2X05PUAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIChYODZfNjQgfHwgIVg4Nl9HRU5FUklDKSAmJiAoTTY4NiB8fCBNUEVOVElVTUlJIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNTSB8fCBNQ09SRTIgfHwgTVBFTlRJVU00IHx8IE1QU0MpCisJZGVwZW5kcyBvbiBYODZfNjQKKwlkZXBlbmRzIG9uIChNQ09SRTIgfHwgTVBFTlRJVU00IHx8IE1QU0MpCiAKIGNvbmZpZyBYODZfVFNDCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gKChNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs3IHx8IE1LNiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1WSUFDNyB8fCBNR0VPREVHWDEgfHwgTUdFT0RFX0xYIHx8IE1DT1JFMikgJiYgIVg4Nl9OVU1BUSkgfHwgWDg2XzY0CisJZGVwZW5kcyBvbiAoKE1XSU5DSElQM0QgfHwgTUNSVVNPRSB8fCBNRUZGSUNFT04gfHwgTUNZUklYSUlJIHx8IE1LNyB8fCBNSzYgfHwgTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE02ODYgfHwgTTU4Nk1NWCB8fCBNNTg2VFNDIHx8IE1LOCB8fCBNVklBQzNfMiB8fCBNVklBQzcgfHwgTUdFT0RFR1gxIHx8IE1HRU9ERV9MWCB8fCBNQ09SRTIpICYmICFYODZfTlVNQVEpIHx8IFg4Nl82NAogCiBjb25maWcgWDg2X0NNUFhDSEc2NAogCWRlZl9ib29sIHkKQEAgLTQwMyw3ICszOTcsNyBAQAogIyBnZW5lcmF0ZXMgY21vdi4KIGNvbmZpZyBYODZfQ01PVgogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIChNSzcgfHwgTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE02ODYgfHwgTVZJQUMzXzIgfHwgTVZJQUM3IHx8IFg4Nl82NCkKKwlkZXBlbmRzIG9uIChNSzggfHwgTUs3IHx8IE1DT1JFMiB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNVklBQzNfMiB8fCBNVklBQzcgfHwgTUNSVVNPRSB8fCBNRUZGSUNFT04gfHwgWDg2XzY0KQogCiBjb25maWcgWDg2X01JTklNVU1fQ1BVX0ZBTUlMWQogCWludApAQCAtNDE0LDQgKzQwOCwxMjQgQEAKIAogY29uZmlnIFg4Nl9ERUJVR0NUTE1TUgogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uICEoTUs2IHx8IE1XSU5DSElQQzYgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQM0QgfHwgTUNZUklYSUlJIHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NikKKwlkZXBlbmRzIG9uICEoTUs2IHx8IE1XSU5DSElQQzYgfHwgTVdJTkNISVAzRCB8fCBNQ1lSSVhJSUkgfHwgTTU4Nk1NWCB8fCBNNTg2VFNDIHx8IE01ODYgfHwgTTQ4NiB8fCBNMzg2KQorCittZW51Y29uZmlnIFBST0NFU1NPUl9TRUxFQ1QKKwlib29sICJTdXBwb3J0ZWQgcHJvY2Vzc29yIHZlbmRvcnMiIGlmIEVNQkVEREVECisJaGVscAorCSAgVGhpcyBsZXRzIHlvdSBjaG9vc2Ugd2hhdCB4ODYgdmVuZG9yIHN1cHBvcnQgY29kZSB5b3VyIGtlcm5lbAorCSAgd2lsbCBpbmNsdWRlLgorCitjb25maWcgQ1BVX1NVUF9JTlRFTAorCWRlZmF1bHQgeQorCWJvb2wgIlN1cHBvcnQgSW50ZWwgcHJvY2Vzc29ycyIgaWYgUFJPQ0VTU09SX1NFTEVDVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBkZXRlY3Rpb24sIHR1bmluZ3MgYW5kIHF1aXJrcyBmb3IgSW50ZWwgcHJvY2Vzc29ycworCisJICBZb3UgbmVlZCB0aGlzIGVuYWJsZWQgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gcnVuIG9uIGFuCisJICBJbnRlbCBDUFUuIERpc2FibGluZyB0aGlzIG9wdGlvbiBvbiBvdGhlciB0eXBlcyBvZiBDUFVzCisJICBtYWtlcyB0aGUga2VybmVsIGEgdGlueSBiaXQgc21hbGxlci4gRGlzYWJsaW5nIGl0IG9uIGFuIEludGVsCisJICBDUFUgbWlnaHQgcmVuZGVyIHRoZSBrZXJuZWwgdW5ib290YWJsZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIENQVV9TVVBfQ1lSSVhfMzIKKwlkZWZhdWx0IHkKKwlib29sICJTdXBwb3J0IEN5cml4IHByb2Nlc3NvcnMiIGlmIFBST0NFU1NPUl9TRUxFQ1QKKwlkZXBlbmRzIG9uICE2NEJJVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBkZXRlY3Rpb24sIHR1bmluZ3MgYW5kIHF1aXJrcyBmb3IgQ3lyaXggcHJvY2Vzc29ycworCisJICBZb3UgbmVlZCB0aGlzIGVuYWJsZWQgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gcnVuIG9uIGEKKwkgIEN5cml4IENQVS4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIG9uIG90aGVyIHR5cGVzIG9mIENQVXMKKwkgIG1ha2VzIHRoZSBrZXJuZWwgYSB0aW55IGJpdCBzbWFsbGVyLiBEaXNhYmxpbmcgaXQgb24gYSBDeXJpeAorCSAgQ1BVIG1pZ2h0IHJlbmRlciB0aGUga2VybmVsIHVuYm9vdGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfU1VQX0FNRAorCWRlZmF1bHQgeQorCWJvb2wgIlN1cHBvcnQgQU1EIHByb2Nlc3NvcnMiIGlmIFBST0NFU1NPUl9TRUxFQ1QKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgZGV0ZWN0aW9uLCB0dW5pbmdzIGFuZCBxdWlya3MgZm9yIEFNRCBwcm9jZXNzb3JzCisKKwkgIFlvdSBuZWVkIHRoaXMgZW5hYmxlZCBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBydW4gb24gYW4KKwkgIEFNRCBDUFUuIERpc2FibGluZyB0aGlzIG9wdGlvbiBvbiBvdGhlciB0eXBlcyBvZiBDUFVzCisJICBtYWtlcyB0aGUga2VybmVsIGEgdGlueSBiaXQgc21hbGxlci4gRGlzYWJsaW5nIGl0IG9uIGFuIEFNRAorCSAgQ1BVIG1pZ2h0IHJlbmRlciB0aGUga2VybmVsIHVuYm9vdGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfU1VQX0NFTlRBVVJfMzIKKwlkZWZhdWx0IHkKKwlib29sICJTdXBwb3J0IENlbnRhdXIgcHJvY2Vzc29ycyIgaWYgUFJPQ0VTU09SX1NFTEVDVAorCWRlcGVuZHMgb24gITY0QklUCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGRldGVjdGlvbiwgdHVuaW5ncyBhbmQgcXVpcmtzIGZvciBDZW50YXVyIHByb2Nlc3NvcnMKKworCSAgWW91IG5lZWQgdGhpcyBlbmFibGVkIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHJ1biBvbiBhCisJICBDZW50YXVyIENQVS4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIG9uIG90aGVyIHR5cGVzIG9mIENQVXMKKwkgIG1ha2VzIHRoZSBrZXJuZWwgYSB0aW55IGJpdCBzbWFsbGVyLiBEaXNhYmxpbmcgaXQgb24gYSBDZW50YXVyCisJICBDUFUgbWlnaHQgcmVuZGVyIHRoZSBrZXJuZWwgdW5ib290YWJsZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIENQVV9TVVBfQ0VOVEFVUl82NAorCWRlZmF1bHQgeQorCWJvb2wgIlN1cHBvcnQgQ2VudGF1ciBwcm9jZXNzb3JzIiBpZiBQUk9DRVNTT1JfU0VMRUNUCisJZGVwZW5kcyBvbiA2NEJJVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBkZXRlY3Rpb24sIHR1bmluZ3MgYW5kIHF1aXJrcyBmb3IgQ2VudGF1ciBwcm9jZXNzb3JzCisKKwkgIFlvdSBuZWVkIHRoaXMgZW5hYmxlZCBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBydW4gb24gYQorCSAgQ2VudGF1ciBDUFUuIERpc2FibGluZyB0aGlzIG9wdGlvbiBvbiBvdGhlciB0eXBlcyBvZiBDUFVzCisJICBtYWtlcyB0aGUga2VybmVsIGEgdGlueSBiaXQgc21hbGxlci4gRGlzYWJsaW5nIGl0IG9uIGEgQ2VudGF1cgorCSAgQ1BVIG1pZ2h0IHJlbmRlciB0aGUga2VybmVsIHVuYm9vdGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfU1VQX1RSQU5TTUVUQV8zMgorCWRlZmF1bHQgeQorCWJvb2wgIlN1cHBvcnQgVHJhbnNtZXRhIHByb2Nlc3NvcnMiIGlmIFBST0NFU1NPUl9TRUxFQ1QKKwlkZXBlbmRzIG9uICE2NEJJVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBkZXRlY3Rpb24sIHR1bmluZ3MgYW5kIHF1aXJrcyBmb3IgVHJhbnNtZXRhIHByb2Nlc3NvcnMKKworCSAgWW91IG5lZWQgdGhpcyBlbmFibGVkIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHJ1biBvbiBhCisJICBUcmFuc21ldGEgQ1BVLiBEaXNhYmxpbmcgdGhpcyBvcHRpb24gb24gb3RoZXIgdHlwZXMgb2YgQ1BVcworCSAgbWFrZXMgdGhlIGtlcm5lbCBhIHRpbnkgYml0IHNtYWxsZXIuIERpc2FibGluZyBpdCBvbiBhIFRyYW5zbWV0YQorCSAgQ1BVIG1pZ2h0IHJlbmRlciB0aGUga2VybmVsIHVuYm9vdGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfU1VQX1VNQ18zMgorCWRlZmF1bHQgeQorCWJvb2wgIlN1cHBvcnQgVU1DIHByb2Nlc3NvcnMiIGlmIFBST0NFU1NPUl9TRUxFQ1QKKwlkZXBlbmRzIG9uICE2NEJJVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBkZXRlY3Rpb24sIHR1bmluZ3MgYW5kIHF1aXJrcyBmb3IgVU1DIHByb2Nlc3NvcnMKKworCSAgWW91IG5lZWQgdGhpcyBlbmFibGVkIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHJ1biBvbiBhCisJICBVTUMgQ1BVLiBEaXNhYmxpbmcgdGhpcyBvcHRpb24gb24gb3RoZXIgdHlwZXMgb2YgQ1BVcworCSAgbWFrZXMgdGhlIGtlcm5lbCBhIHRpbnkgYml0IHNtYWxsZXIuIERpc2FibGluZyBpdCBvbiBhIFVNQworCSAgQ1BVIG1pZ2h0IHJlbmRlciB0aGUga2VybmVsIHVuYm9vdGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBYODZfRFMKKwlib29sICJEZWJ1ZyBTdG9yZSBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciBEZWJ1ZyBTdG9yZS4KKwkgIFRoaXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gcHJvdmlkZSBhIG1lbW9yeSBidWZmZXIgdG8gdGhlIGhhcmR3YXJlCisJICB0byBzdG9yZSB2YXJpb3VzIHByb2ZpbGluZyBhbmQgdHJhY2luZyBldmVudHMuCisKK2NvbmZpZyBYODZfUFRSQUNFX0JUUworCWJvb2wgInB0cmFjZSBpbnRlcmZhY2UgdG8gQnJhbmNoIFRyYWNlIFN0b3JlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gKFg4Nl9EUyAmJiBYODZfREVCVUdDVExNU1IpCisJaGVscAorCSAgQWRkIGEgcHRyYWNlIGludGVyZmFjZSB0byBhbGxvdyBjb2xsZWN0aW5nIGFuIGV4ZWN1dGlvbiB0cmFjZQorCSAgb2YgdGhlIHRyYWNlZCB0YXNrLgorCSAgVGhpcyBjb2xsZWN0cyBjb250cm9sIGZsb3cgY2hhbmdlcyBpbiBhIChjeWNsaWMpIGJ1ZmZlciBhbmQgYWxsb3dzCisJICBkZWJ1Z2dlcnMgdG8gZmlsbCBpbiB0aGUgZ2FwcyBhbmQgc2hvdyBhbiBleGVjdXRpb24gdHJhY2Ugb2YgdGhlIGRlYnVnZ2VlLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gveDg2L0tjb25maWcuZGVidWcKaW5kZXggMDkyZjAxOS4uMmEzZGZiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCkBAIC00Myw2ICs0MywxOSBAQAogCSAgd2l0aCBrbG9nZC9zeXNsb2dkIG9yIHRoZSBYIHNlcnZlci4gWW91IHNob3VsZCBub3JtYWxseSBOIGhlcmUsCiAJICB1bmxlc3MgeW91IHdhbnQgdG8gZGVidWcgc3VjaCBhIGNyYXNoLgogCitjb25maWcgRUFSTFlfUFJJTlRLX0RCR1AKKwlib29sICJFYXJseSBwcmludGsgdmlhIEVIQ0kgZGVidWcgcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEVBUkxZX1BSSU5USyAmJiBQQ0kKKwloZWxwCisJICBXcml0ZSBrZXJuZWwgbG9nIG91dHB1dCBkaXJlY3RseSBpbnRvIHRoZSBFSENJIGRlYnVnIHBvcnQuCisKKwkgIFRoaXMgaXMgdXNlZnVsIGZvciBrZXJuZWwgZGVidWdnaW5nIHdoZW4geW91ciBtYWNoaW5lIGNyYXNoZXMgdmVyeQorCSAgZWFybHkgYmVmb3JlIHRoZSBjb25zb2xlIGNvZGUgaXMgaW5pdGlhbGl6ZWQuIEZvciBub3JtYWwgb3BlcmF0aW9uCisJICBpdCBpcyBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBpdCBsb29rcyB1Z2x5IGFuZCBkb2Vzbid0IGNvb3BlcmF0ZQorCSAgd2l0aCBrbG9nZC9zeXNsb2dkIG9yIHRoZSBYIHNlcnZlci4gWW91IHNob3VsZCBub3JtYWxseSBOIGhlcmUsCisJICB1bmxlc3MgeW91IHdhbnQgdG8gZGVidWcgc3VjaCBhIGNyYXNoLiBZb3UgbmVlZCB1c2IgZGVidWcgZGV2aWNlLgorCiBjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVwogCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdSBiL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQppbmRleCBlMzcyYjU4Li44MDE3N2VjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9NYWtlZmlsZV8zMi5jcHUKKysrIGIvYXJjaC94ODYvTWFrZWZpbGVfMzIuY3B1CkBAIC0yOCw3ICsyOCw2IEBACiBjZmxhZ3MtJChDT05GSUdfTUNSVVNPRSkJKz0gLW1hcmNoPWk2ODYgJChhbGlnbiktZnVuY3Rpb25zPTAgJChhbGlnbiktanVtcHM9MCAkKGFsaWduKS1sb29wcz0wCiBjZmxhZ3MtJChDT05GSUdfTUVGRklDRU9OKQkrPSAtbWFyY2g9aTY4NiAkKGNhbGwgdHVuZSxwZW50aXVtMykgJChhbGlnbiktZnVuY3Rpb25zPTAgJChhbGlnbiktanVtcHM9MCAkKGFsaWduKS1sb29wcz0wCiBjZmxhZ3MtJChDT05GSUdfTVdJTkNISVBDNikJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9d2luY2hpcC1jNiwtbWFyY2g9aTU4NikKLWNmbGFncy0kKENPTkZJR19NV0lOQ0hJUDIpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAyLC1tYXJjaD1pNTg2KQogY2ZsYWdzLSQoQ09ORklHX01XSU5DSElQM0QpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAyLC1tYXJjaD1pNTg2KQogY2ZsYWdzLSQoQ09ORklHX01DWVJJWElJSSkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YzMsLW1hcmNoPWk0ODYpICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAogY2ZsYWdzLSQoQ09ORklHX01WSUFDM18yKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1jMy0yLC1tYXJjaD1pNjg2KQpAQCAtNDUsMyArNDQsOCBAQAogIyBjcHUgZW50cmllcwogY2ZsYWdzLSQoQ09ORklHX1g4Nl9HRU5FUklDKSAJKz0gJChjYWxsIHR1bmUsZ2VuZXJpYywkKGNhbGwgdHVuZSxpNjg2KSkKIAorIyBCdWcgZml4IGZvciBiaW51dGlsczogdGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8ga2VlcAorIyBiaW51dGlscyBmcm9tIGdlbmVyYXRpbmcgTk9QTCBpbnN0cnVjdGlvbnMgYWdhaW5zdCBvdXIgd2lsbC4KK2lmbmVxICgkKENPTkZJR19YODZfUDZfTk9QKSx5KQorY2ZsYWdzLXkJCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1XYSQoY29tbWEpLW10dW5lPWdlbmVyaWMzMiwpCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggN2VlMTAyZi4uY2Q0OGM3MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L01ha2VmaWxlCkBAIC03Miw5ICs3Miw3IEBACiBLQlVJTERfQ0ZMQUdTICs9ICAgJChjYWxsIGNjLW9wdGlvbiwtbTMyKQogS0JVSUxEX0FGTEFHUwk6PSAkKEtCVUlMRF9DRkxBR1MpIC1EX19BU1NFTUJMWV9fCiAKLSQob2JqKS96SW1hZ2U6ICBJTUFHRV9PRkZTRVQgOj0gMHgxMDAwCiAkKG9iaikvekltYWdlOiAgYXNmbGFncy15IDo9ICQoU1ZHQV9NT0RFKSAkKFJBTURJU0spCi0kKG9iaikvYnpJbWFnZTogSU1BR0VfT0ZGU0VUIDo9IDB4MTAwMDAwCiAkKG9iaikvYnpJbWFnZTogY2NmbGFncy15IDo9IC1EX19CSUdfS0VSTkVMX18KICQob2JqKS9iekltYWdlOiBhc2ZsYWdzLXkgOj0gJChTVkdBX01PREUpICQoUkFNRElTSykgLURfX0JJR19LRVJORUxfXwogJChvYmopL2J6SW1hZ2U6IEJVSUxERkxBR1MgICA6PSAtYgpAQCAtMTE3LDcgKzExNSw3IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAogJChvYmopL2NvbXByZXNzZWQvdm1saW51eDogRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvY29tcHJlc3NlZCBJTUFHRV9PRkZTRVQ9JChJTUFHRV9PRkZTRVQpICRACisJJChRKSQoTUFLRSkgJChidWlsZCk9JChvYmopL2NvbXByZXNzZWQgJEAKIAogIyBTZXQgdGhpcyBpZiB5b3Ugd2FudCB0byBwYXNzIGFwcGVuZCBhcmd1bWVudHMgdG8gdGhlIHpkaXNrL2ZkaW1hZ2UvaXNvaW1hZ2Uga2VybmVsCiBGREFSR1MgPQpAQCAtMTgxLDYgKzE3OSw3IEBACiAJbWtpc29mcyAtSiAtciAtbyAkKG9iaikvaW1hZ2UuaXNvIC1iIGlzb2xpbnV4LmJpbiAtYyBib290LmNhdCBcCiAJCS1uby1lbXVsLWJvb3QgLWJvb3QtbG9hZC1zaXplIDQgLWJvb3QtaW5mby10YWJsZSBcCiAJCSQob2JqKS9pc29pbWFnZQorCWlzb2h5YnJpZCAkKG9iaikvaW1hZ2UuaXNvIDI+L2Rldi9udWxsIHx8IHRydWUKIAlybSAtcmYgJChvYmopL2lzb2ltYWdlCiAKIHpsaWxvOiAkKEJPT1RJTUFHRSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCA5MmZkZDM1Li4xNzcxYzgwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0yNyw5ICsyNyw4IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAogCi1pZmVxICgkKENPTkZJR19YODZfMzIpLHkpCi10YXJnZXRzICs9IHZtbGludXguYmluLmFsbCB2bWxpbnV4LnJlbG9jcwotaG9zdHByb2dzLXkgOj0gcmVsb2NzCit0YXJnZXRzICs9IHZtbGludXguYmluLmFsbCB2bWxpbnV4LnJlbG9jcyByZWxvY3MKK2hvc3Rwcm9ncy0kKENPTkZJR19YODZfMzIpICs9IHJlbG9jcwogCiBxdWlldF9jbWRfcmVsb2NzID0gUkVMT0NTICAkQAogICAgICAgY21kX3JlbG9jcyA9ICQob2JqKS9yZWxvY3MgJDwgPiAkQDskKG9iaikvcmVsb2NzIC0tYWJzLXJlbG9jcyAkPApAQCAtNDMsNiArNDIsOCBAQAogJChvYmopL3ZtbGludXguYmluLmFsbDogJCh2bWxpbnV4LmJpbi5hbGwteSkgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxyZWxvY2JpbikKIAoraWZlcSAoJChDT05GSUdfWDg2XzMyKSx5KQorCiBpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKICQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluLmFsbCBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCkBAIC01OSw2ICs2MCw1IEBACiBMREZMQUdTX3BpZ2d5Lm8gOj0gLXIgLS1mb3JtYXQgYmluYXJ5IC0tb2Zvcm1hdCBlbGY2NC14ODYtNjQgLVQKIGVuZGlmCiAKLQogJChvYmopL3BpZ2d5Lm86ICQob2JqKS92bWxpbnV4LnNjciAkKG9iaikvdm1saW51eC5iaW4uZ3ogRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCmluZGV4IGJhNzczNmMuLjI5YzVmYmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwpAQCAtMTM3LDE0ICsxMzcsMTUgQEAKICAqLwogCW1vdmwgb3V0cHV0X2xlbiglZWJ4KSwgJWVheAogCXB1c2hsICVlYXgKKwkJCSMgcHVzaCBhcmd1bWVudHMgZm9yIGRlY29tcHJlc3Nfa2VybmVsOgogCXB1c2hsICVlYnAJIyBvdXRwdXQgYWRkcmVzcwogCW1vdmwgaW5wdXRfbGVuKCVlYngpLCAlZWF4CiAJcHVzaGwgJWVheAkjIGlucHV0X2xlbgogCWxlYWwgaW5wdXRfZGF0YSglZWJ4KSwgJWVheAogCXB1c2hsICVlYXgJIyBpbnB1dF9kYXRhCiAJbGVhbCBib290X2hlYXAoJWVieCksICVlYXgKLQlwdXNobCAlZWF4CSMgaGVhcCBhcmVhIGFzIHRoaXJkIGFyZ3VtZW50Ci0JcHVzaGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyIGFzIHNlY29uZCBhcmcKKwlwdXNobCAlZWF4CSMgaGVhcCBhcmVhCisJcHVzaGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyCiAJY2FsbCBkZWNvbXByZXNzX2tlcm5lbAogCWFkZGwgJDIwLCAlZXNwCiAJcG9wbCAlZWN4CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCA5ZmVhNzM3Li41NzgwZDM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqLwogI3VuZGVmIENPTkZJR19QQVJBVklSVAogI2lmZGVmIENPTkZJR19YODZfMzIKLSNkZWZpbmUgX0FTTV9ERVNDX0hfIDEKKyNkZWZpbmUgQVNNX1g4Nl9fREVTQ19IIDEKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJCXktLTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXZpZG1lbSBbKHggKyBjb2xzICogeSkgKiAyXSA9IGM7CisJCQl2aWRtZW1bKHggKyBjb2xzICogeSkgKiAyXSA9IGM7CiAJCQlpZiAoKyt4ID49IGNvbHMpIHsKIAkJCQl4ID0gMDsKIAkJCQlpZiAoKyt5ID49IGxpbmVzKSB7CkBAIC0yNzcsNyArMjc3LDggQEAKIAlpbnQgaTsKIAljaGFyICpzcyA9IHM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBzc1tpXSA9IGM7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJc3NbaV0gPSBjOwogCXJldHVybiBzOwogfQogCkBAIC0yODcsNyArMjg4LDggQEAKIAljb25zdCBjaGFyICpzID0gc3JjOwogCWNoYXIgKmQgPSBkZXN0OwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgZFtpXSA9IHNbaV07CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJZFtpXSA9IHNbaV07CiAJcmV0dXJuIGRlc3Q7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9yZWxvY3MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9yZWxvY3MuYwppbmRleCBhMTMxMGM1Li44NTdlNDkyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvcmVsb2NzLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3JlbG9jcy5jCkBAIC00OTIsNyArNDkyLDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXNoX3N5bXRhYiA9IHNlY19zeW10YWItPnN5bXRhYjsKLQkJc3ltX3N0cnRhYiA9IHNlYy0+bGluay0+c3RydGFiOworCQlzeW1fc3RydGFiID0gc2VjX3N5bXRhYi0+bGluay0+c3RydGFiOwogCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6ZW9mKEVsZjMyX1JlbCk7IGorKykgewogCQkJRWxmMzJfUmVsICpyZWw7CiAJCQlFbGYzMl9TeW0gKnN5bTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY3B1LmMgYi9hcmNoL3g4Ni9ib290L2NwdS5jCmluZGV4IDc1Mjk4ZmUuLjZlYzZiYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY3B1LmMKKysrIGIvYXJjaC94ODYvYm9vdC9jcHUuYwpAQCAtNTksMTcgKzU5LDE4IEBACiAJCQl1MzIgZSA9IGVycl9mbGFnc1tpXTsKIAogCQkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKLQkJCQlpbnQgbiA9IChpIDw8IDUpK2o7Ci0JCQkJaWYgKCptc2dfc3RycyA8IG4pIHsKKwkJCQlpZiAobXNnX3N0cnNbMF0gPCBpIHx8CisJCQkJICAgIChtc2dfc3Ryc1swXSA9PSBpICYmIG1zZ19zdHJzWzFdIDwgaikpIHsKIAkJCQkJLyogU2tpcCB0byB0aGUgbmV4dCBzdHJpbmcgKi8KLQkJCQkJZG8gewotCQkJCQkJbXNnX3N0cnMrKzsKLQkJCQkJfSB3aGlsZSAoKm1zZ19zdHJzKTsKLQkJCQkJbXNnX3N0cnMrKzsKKwkJCQkJbXNnX3N0cnMgKz0gMjsKKwkJCQkJd2hpbGUgKCptc2dfc3RycysrKQorCQkJCQkJOwogCQkJCX0KIAkJCQlpZiAoZSAmIDEpIHsKLQkJCQkJaWYgKCptc2dfc3RycyA9PSBuICYmIG1zZ19zdHJzWzFdKQotCQkJCQkJcHJpbnRmKCIlcyAiLCBtc2dfc3RycysxKTsKKwkJCQkJaWYgKG1zZ19zdHJzWzBdID09IGkgJiYKKwkJCQkJICAgIG1zZ19zdHJzWzFdID09IGogJiYKKwkJCQkJICAgIG1zZ19zdHJzWzJdKQorCQkJCQkJcHJpbnRmKCIlcyAiLCBtc2dfc3RycysyKTsKIAkJCQkJZWxzZQogCQkJCQkJcHJpbnRmKCIlZDolZCAiLCBpLCBqKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NwdWNoZWNrLmMgYi9hcmNoL3g4Ni9ib290L2NwdWNoZWNrLmMKaW5kZXggNGI5YWU3Yy4uNGQzZmYwMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jcHVjaGVjay5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY3B1Y2hlY2suYwpAQCAtMzgsMTIgKzM4LDEyIEBACiB7CiAJUkVRVUlSRURfTUFTSzAsCiAJUkVRVUlSRURfTUFTSzEsCi0JUkVRVUlSRURfTUFTSzIsCi0JUkVRVUlSRURfTUFTSzMsCisJMCwgLyogUkVRVUlSRURfTUFTSzIgbm90IGltcGxlbWVudGVkIGluIHRoaXMgZmlsZSAqLworCTAsIC8qIFJFUVVJUkVEX01BU0szIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGZpbGUgKi8KIAlSRVFVSVJFRF9NQVNLNCwKLQlSRVFVSVJFRF9NQVNLNSwKKwkwLCAvKiBSRVFVSVJFRF9NQVNLNSBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyBmaWxlICovCiAJUkVRVUlSRURfTUFTSzYsCi0JUkVRVUlSRURfTUFTSzcsCisJMCwgLyogUkVRVUlSRURfTUFTSzcgbm90IGltcGxlbWVudGVkIGluIHRoaXMgZmlsZSAqLwogfTsKIAogI2RlZmluZSBBMzIoYSwgYiwgYywgZCkgKCgoZCkgPDwgMjQpKygoYykgPDwgMTYpKygoYikgPDwgOCkrKGEpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9lZGQuYyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKaW5kZXggZDkzY2JjNi4uMWFhZThmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9lZGQuYworKysgYi9hcmNoL3g4Ni9ib290L2VkZC5jCkBAIC00MSw2ICs0MSw3IEBACiAJY2hhciAqbWJyYnVmX3B0ciwgKm1icmJ1Zl9lbmQ7CiAJdTMyIGJ1Zl9iYXNlLCBtYnJfYmFzZTsKIAlleHRlcm4gY2hhciBfZW5kW107CisJdTE2IG1icl9tYWdpYzsKIAogCXNlY3Rvcl9zaXplID0gZWktPnBhcmFtcy5ieXRlc19wZXJfc2VjdG9yOwogCWlmICghc2VjdG9yX3NpemUpCkBAIC01OCwxMSArNTksMTUgQEAKIAlpZiAobWJyYnVmX2VuZCA+IChjaGFyICopKHNpemVfdClib290X3BhcmFtcy5oZHIuaGVhcF9lbmRfcHRyKQogCQlyZXR1cm4gLTE7CiAKKwltZW1zZXQobWJyYnVmX3B0ciwgMCwgc2VjdG9yX3NpemUpOwogCWlmIChyZWFkX21icihkZXZubywgbWJyYnVmX3B0cikpCiAJCXJldHVybiAtMTsKIAogCSptYnJzaWcgPSAqKHUzMiAqKSZtYnJidWZfcHRyW0VERF9NQlJfU0lHX09GRlNFVF07Ci0JcmV0dXJuIDA7CisJbWJyX21hZ2ljID0gKih1MTYgKikmbWJyYnVmX3B0cls1MTBdOworCisJLyogY2hlY2sgZm9yIHZhbGlkIE1CUiBtYWdpYyAqLworCXJldHVybiBtYnJfbWFnaWMgPT0gMHhBQTU1ID8gMCA6IC0xOwogfQogCiBzdGF0aWMgaW50IGdldF9lZGRfaW5mbyh1OCBkZXZubywgc3RydWN0IGVkZF9pbmZvICplaSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMgYi9hcmNoL3g4Ni9ib290L2hlYWRlci5TCmluZGV4IGFmODZlNDMuLmI5OTMwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9oZWFkZXIuUwpAQCAtMzAsNyArMzAsNiBAQAogU1lTU0laRQkJPSBERUZfU1lTU0laRQkJLyogc3lzdGVtIHNpemU6ICMgb2YgMTYtYnl0ZSBjbGlja3MgKi8KIAkJCQkJLyogdG8gYmUgbG9hZGVkICovCiBST09UX0RFVgk9IDAJCQkvKiBST09UX0RFViBpcyBub3cgd3JpdHRlbiBieSAiYnVpbGQiICovCi1TV0FQX0RFVgk9IDAJCQkvKiBTV0FQX0RFViBpcyBub3cgd3JpdHRlbiBieSAiYnVpbGQiICovCiAKICNpZm5kZWYgU1ZHQV9NT0RFCiAjZGVmaW5lIFNWR0FfTU9ERSBBU0tfVkdBCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L21rY3B1c3RyLmMgYi9hcmNoL3g4Ni9ib290L21rY3B1c3RyLmMKaW5kZXggYmJlNzY5NS4uOGVmNjBmMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9ta2NwdXN0ci5jCisrKyBiL2FyY2gveDg2L2Jvb3QvbWtjcHVzdHIuYwpAQCAtMTUsMzMgKzE1LDMzIEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSAiLi4va2VybmVsL2NwdS9mZWF0dXJlX25hbWVzLmMiCi0KLSNpZiBOQ0FQRkxBR1MgPiA4Ci0jIGVycm9yICJOZWVkIHRvIGFkanVzdCB0aGUgYm9vdCBjb2RlIGhhbmRsaW5nIG9mIENQVUlEIHN0cmluZ3MiCi0jZW5kaWYKKyNpbmNsdWRlICIuLi9rZXJuZWwvY3B1L2NhcGZsYWdzLmMiCiAKIGludCBtYWluKHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IGksIGo7CiAJY29uc3QgY2hhciAqc3RyOwogCiAJcHJpbnRmKCJzdGF0aWMgY29uc3QgY2hhciB4ODZfY2FwX3N0cnNbXSA9IFxuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFMqMzI7IGkrKykgewotCQlzdHIgPSB4ODZfY2FwX2ZsYWdzW2ldOworCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCQlzdHIgPSB4ODZfY2FwX2ZsYWdzW2kqMzIral07CiAKLQkJaWYgKGkgPT0gTkNBUElOVFMqMzItMSkgewotCQkJLyogVGhlIGxhc3QgZW50cnkgbXVzdCBiZSB1bmNvbmRpdGlvbmFsOyB0aGlzCi0JCQkgICBhbHNvIGNvbnN1bWVzIHRoZSBjb21waWxlci1hZGRlZCBudWxsIGNoYXJhY3RlciAqLwotCQkJaWYgKCFzdHIpCi0JCQkJc3RyID0gIiI7Ci0JCQlwcmludGYoIlx0XCJcXHglMDJ4XCJcIiVzXCJcbiIsIGksIHN0cik7Ci0JCX0gZWxzZSBpZiAoc3RyKSB7Ci0JCQlwcmludGYoIiNpZiBSRVFVSVJFRF9NQVNLJWQgJiAoMSA8PCAlZClcbiIKLQkJCSAgICAgICAiXHRcIlxceCUwMnhcIlwiJXNcXDBcIlxuIgotCQkJICAgICAgICIjZW5kaWZcbiIsCi0JCQkgICAgICAgaSA+PiA1LCBpICYgMzEsIGksIHN0cik7CisJCQlpZiAoaSA9PSBOQ0FQSU5UUy0xICYmIGogPT0gMzEpIHsKKwkJCQkvKiBUaGUgbGFzdCBlbnRyeSBtdXN0IGJlIHVuY29uZGl0aW9uYWw7IHRoaXMKKwkJCQkgICBhbHNvIGNvbnN1bWVzIHRoZSBjb21waWxlci1hZGRlZCBudWxsCisJCQkJICAgY2hhcmFjdGVyICovCisJCQkJaWYgKCFzdHIpCisJCQkJCXN0ciA9ICIiOworCQkJCXByaW50ZigiXHRcIlxceCUwMnhcXHglMDJ4XCJcIiVzXCJcbiIsCisJCQkJICAgICAgIGksIGosIHN0cik7CisJCQl9IGVsc2UgaWYgKHN0cikgeworCQkJCXByaW50ZigiI2lmIFJFUVVJUkVEX01BU0slZCAmICgxIDw8ICVkKVxuIgorCQkJCSAgICAgICAiXHRcIlxceCUwMnhcXHglMDJ4XCJcIiVzXFwwXCJcbiIKKwkJCQkgICAgICAgIiNlbmRpZlxuIiwKKwkJCQkgICAgICAgaSwgaiwgaSwgaiwgc3RyKTsKKwkJCX0KIAkJfQogCX0KIAlwcmludGYoIlx0O1xuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCmluZGV4IDQwMWFkOTkuLjk5YjMwNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jCkBAIC04OCwxNCArODgsMTEgQEAKIAkJCSAgICh2bWluZm8ubWVtb3J5X2xheW91dCA9PSA0IHx8CiAJCQkgICAgdm1pbmZvLm1lbW9yeV9sYXlvdXQgPT0gNikgJiYKIAkJCSAgIHZtaW5mby5tZW1vcnlfcGxhbmVzID09IDEpIHsKLSNpZmRlZiBDT05GSUdfRkIKKyNpZmRlZiBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQKIAkJCS8qIEdyYXBoaWNzIG1vZGUsIGNvbG9yLCBsaW5lYXIgZnJhbWUgYnVmZmVyCiAJCQkgICBzdXBwb3J0ZWQuICBPbmx5IHJlZ2lzdGVyIHRoZSBtb2RlIGlmCiAJCQkgICBpZiBmcmFtZWJ1ZmZlciBpcyBjb25maWd1cmVkLCBob3dldmVyLAotCQkJICAgb3RoZXJ3aXNlIHRoZSB1c2VyIHdpbGwgYmUgbGVmdCB3aXRob3V0IGEgc2NyZWVuLgotCQkJICAgV2UgZG9uJ3QgcmVxdWlyZSBDT05GSUdfRkJfVkVTQSwgaG93ZXZlciwgc2luY2UKLQkJCSAgIHNvbWUgb2YgdGhlIG90aGVyIGZyYW1lYnVmZmVyIGRyaXZlcnMgY2FuIHVzZQotCQkJICAgdGhpcyBtb2RlLXNldHRpbmcsIHRvby4gKi8KKwkJCSAgIG90aGVyd2lzZSB0aGUgdXNlciB3aWxsIGJlIGxlZnQgd2l0aG91dCBhIHNjcmVlbi4gKi8KIAkJCW1pID0gR0VUX0hFQVAoc3RydWN0IG1vZGVfaW5mbywgMSk7CiAJCQltaS0+bW9kZSA9IG1vZGUgKyBWSURFT19GSVJTVF9WRVNBOwogCQkJbWktPmRlcHRoID0gdm1pbmZvLmJwcDsKQEAgLTEzMywxMCArMTMwLDEyIEBACiAJaWYgKCh2bWluZm8ubW9kZV9hdHRyICYgMHgxNSkgPT0gMHgwNSkgewogCQkvKiBJdCdzIGEgc3VwcG9ydGVkIHRleHQgbW9kZSAqLwogCQlpc19ncmFwaGljID0gMDsKKyNpZmRlZiBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQKIAl9IGVsc2UgaWYgKCh2bWluZm8ubW9kZV9hdHRyICYgMHg5OSkgPT0gMHg5OSkgewogCQkvKiBJdCdzIGEgZ3JhcGhpY3MgbW9kZSB3aXRoIGxpbmVhciBmcmFtZSBidWZmZXIgKi8KIAkJaXNfZ3JhcGhpYyA9IDE7CiAJCXZlc2FfbW9kZSB8PSAweDQwMDA7IC8qIFJlcXVlc3QgbGluZWFyIGZyYW1lIGJ1ZmZlciAqLworI2VuZGlmCiAJfSBlbHNlIHsKIAkJcmV0dXJuIC0xOwkvKiBJbnZhbGlkIG1vZGUgKi8KIAl9CkBAIC0yMjQsNyArMjIzLDcgQEAKIHN0YXRpYyB2b2lkIHZlc2Ffc3RvcmVfbW9kZV9wYXJhbXNfZ3JhcGhpY3Modm9pZCkKIHsKIAkvKiBUZWxsIHRoZSBrZXJuZWwgd2UncmUgaW4gVkVTQSBncmFwaGljcyBtb2RlICovCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSA9IDB4MjM7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSA9IFZJREVPX1RZUEVfVkxGQjsKIAogCS8qIE1vZGUgcGFyYW1ldGVycyAqLwogCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnZlc2FfYXR0cmlidXRlcyA9IHZtaW5mby5tb2RlX2F0dHI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnIGIvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZwppbmRleCAxMDQyNzVlLi41MmQwMzU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCisrKyBiL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM0Ci0jIE1vbiBBdWcgMjUgMTU6MDQ6MDAgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNQorIyBXZWQgU2VwICAzIDE3OjIzOjA5IDIwMDgKICMKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19YODZfMzI9eQpAQCAtMjAyLDcgKzIwMiw3IEBACiAjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKICMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAogIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKK0NPTkZJR19NNjg2PXkKICMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAogIyBDT05GSUdfTVBFTlRJVU1JSUkgaXMgbm90IHNldAogIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKQEAgLTIxMyw3ICsyMTMsNiBAQAogIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUZGSUNFT04gaXMgbm90IHNldAogIyBDT05GSUdfTVdJTkNISVBDNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NV0lOQ0hJUDIgaXMgbm90IHNldAogIyBDT05GSUdfTVdJTkNISVAzRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NR0VPREVHWDEgaXMgbm90IHNldAogIyBDT05GSUdfTUdFT0RFX0xYIGlzIG5vdCBzZXQKQEAgLTIyMSwxMyArMjIwLDE0IEBACiAjIENPTkZJR19NVklBQzNfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVklBQzcgaXMgbm90IHNldAogIyBDT05GSUdfTVBTQyBpcyBub3Qgc2V0Ci1DT05GSUdfTUNPUkUyPXkKKyMgQ09ORklHX01DT1JFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5FUklDX0NQVSBpcyBub3Qgc2V0CiBDT05GSUdfWDg2X0dFTkVSSUM9eQogQ09ORklHX1g4Nl9DUFU9eQogQ09ORklHX1g4Nl9DTVBYQ0hHPXkKIENPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NwogQ09ORklHX1g4Nl9YQUREPXkKKyMgQ09ORklHX1g4Nl9QUFJPX0ZFTkNFIGlzIG5vdCBzZXQKIENPTkZJR19YODZfV1BfV09SS1NfT0s9eQogQ09ORklHX1g4Nl9JTlZMUEc9eQogQ09ORklHX1g4Nl9CU1dBUD15CkBAIC0yMzUsMTQgKzIzNSwxNSBAQAogQ09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWT15CiBDT05GSUdfWDg2X1VTRV9QUFJPX0NIRUNLU1VNPXkKIENPTkZJR19YODZfVFNDPXkKK0NPTkZJR19YODZfQ01PVj15CiBDT05GSUdfWDg2X01JTklNVU1fQ1BVX0ZBTUlMWT00CiBDT05GSUdfWDg2X0RFQlVHQ1RMTVNSPXkKIENPTkZJR19IUEVUX1RJTUVSPXkKIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDPXkKIENPTkZJR19ETUk9eQogIyBDT05GSUdfSU9NTVVfSEVMUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19OUl9DUFVTPTQKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfTlJfQ1BVUz02NAorQ09ORklHX1NDSEVEX1NNVD15CiBDT05GSUdfU0NIRURfTUM9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CkBAIC0yNTQsNyArMjU1LDggQEAKICMgQ09ORklHX1RPU0hJQkEgaXMgbm90IHNldAogIyBDT05GSUdfSThLIGlzIG5vdCBzZXQKIENPTkZJR19YODZfUkVCT09URklYVVBTPXkKLSMgQ09ORklHX01JQ1JPQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfTUlDUk9DT0RFPXkKK0NPTkZJR19NSUNST0NPREVfT0xEX0lOVEVSRkFDRT15CiBDT05GSUdfWDg2X01TUj15CiBDT05GSUdfWDg2X0NQVUlEPXkKICMgQ09ORklHX05PSElHSE1FTSBpcyBub3Qgc2V0CkBAIC0xNTMyLDcgKzE1MzQsNiBAQAogQ09ORklHX1ZHQV9DT05TT0xFPXkKIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLPXkKIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLX1NJWkU9NjQKLUNPTkZJR19WSURFT19TRUxFQ1Q9eQogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQogIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfTE9HTz15CkBAIC0yMTE1LDcgKzIxMTYsNyBAQAogQ09ORklHX0RFRkFVTFRfSU9fREVMQVlfVFlQRT0wCiBDT05GSUdfREVCVUdfQk9PVF9QQVJBTVM9eQogIyBDT05GSUdfQ1BBX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX09QVElNSVpFX0lOTElOSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19PUFRJTUlaRV9JTkxJTklORz15CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnIGIvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCmluZGV4IDY3OGM4YWMuLmYwYTAzZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjctcmM0Ci0jIE1vbiBBdWcgMjUgMTQ6NDA6NDYgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI3LXJjNQorIyBXZWQgU2VwICAzIDE3OjEzOjM5IDIwMDgKICMKIENPTkZJR182NEJJVD15CiAjIENPTkZJR19YODZfMzIgaXMgbm90IHNldApAQCAtMjEwLDcgKzIxMCw2IEBACiAjIENPTkZJR19NQ1JVU09FIGlzIG5vdCBzZXQKICMgQ09ORklHX01FRkZJQ0VPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NV0lOQ0hJUEM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01XSU5DSElQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NV0lOQ0hJUDNEIGlzIG5vdCBzZXQKICMgQ09ORklHX01HRU9ERUdYMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NR0VPREVfTFggaXMgbm90IHNldApAQCAtMjE4LDE3ICsyMTcsMTQgQEAKICMgQ09ORklHX01WSUFDM18yIGlzIG5vdCBzZXQKICMgQ09ORklHX01WSUFDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19NUFNDIGlzIG5vdCBzZXQKLUNPTkZJR19NQ09SRTI9eQotIyBDT05GSUdfR0VORVJJQ19DUFUgaXMgbm90IHNldAorIyBDT05GSUdfTUNPUkUyIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NQVT15CiBDT05GSUdfWDg2X0NQVT15Ci1DT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTPTY0Ci1DT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUz02NAorQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUz0xMjgKK0NPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTPTEyOAogQ09ORklHX1g4Nl9DTVBYQ0hHPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NgorQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD03CiBDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKLUNPTkZJR19YODZfSU5URUxfVVNFUkNPUFk9eQotQ09ORklHX1g4Nl9VU0VfUFBST19DSEVDS1NVTT15Ci1DT05GSUdfWDg2X1A2X05PUD15CiBDT05GSUdfWDg2X1RTQz15CiBDT05GSUdfWDg2X0NNUFhDSEc2ND15CiBDT05GSUdfWDg2X0NNT1Y9eQpAQCAtMjQzLDkgKzIzOSw4IEBACiBDT05GSUdfQU1EX0lPTU1VPXkKIENPTkZJR19TV0lPVExCPXkKIENPTkZJR19JT01NVV9IRUxQRVI9eQotIyBDT05GSUdfTUFYU01QIGlzIG5vdCBzZXQKLUNPTkZJR19OUl9DUFVTPTQKLSMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfTlJfQ1BVUz02NAorQ09ORklHX1NDSEVEX1NNVD15CiBDT05GSUdfU0NIRURfTUM9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CkBAIC0yNTQsNyArMjQ5LDggQEAKIENPTkZJR19YODZfSU9fQVBJQz15CiAjIENPTkZJR19YODZfTUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0k4SyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSUNST0NPREUgaXMgbm90IHNldAorQ09ORklHX01JQ1JPQ09ERT15CitDT05GSUdfTUlDUk9DT0RFX09MRF9JTlRFUkZBQ0U9eQogQ09ORklHX1g4Nl9NU1I9eQogQ09ORklHX1g4Nl9DUFVJRD15CiBDT05GSUdfTlVNQT15CkBAIC0yOTAsNyArMjg2LDcgQEAKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfTVRSUj15CiAjIENPTkZJR19NVFJSX1NBTklUSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YODZfUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfUEFUPXkKIENPTkZJR19FRkk9eQogQ09ORklHX1NFQ0NPTVA9eQogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKQEAgLTE1MDgsNyArMTUwNCw2IEBACiBDT05GSUdfVkdBX0NPTlNPTEU9eQogQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0s9eQogQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0tfU0laRT02NAotQ09ORklHX1ZJREVPX1NFTEVDVD15CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CiAjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19MT0dPPXkKQEAgLTIwODksNyArMjA4NCw3IEBACiBDT05GSUdfREVGQVVMVF9JT19ERUxBWV9UWVBFPTAKIENPTkZJR19ERUJVR19CT09UX1BBUkFNUz15CiAjIENPTkZJR19DUEFfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfT1BUSU1JWkVfSU5MSU5JTkcgaXMgbm90IHNldAorQ09ORklHX09QVElNSVpFX0lOTElOSU5HPXkKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUKaW5kZXggMzg3NGMyZC4uOTAzZGU0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2NyeXB0by9NYWtlZmlsZQpAQCAtMTAsNiArMTAsOCBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NCkgKz0gdHdvZmlzaC14ODZfNjQubwogb2JqLSQoQ09ORklHX0NSWVBUT19TQUxTQTIwX1g4Nl82NCkgKz0gc2Fsc2EyMC14ODZfNjQubwogCitvYmotJChDT05GSUdfQ1JZUFRPX0NSQzMyQ19JTlRFTCkgKz0gY3JjMzJjLWludGVsLm8KKwogYWVzLWk1ODYteSA6PSBhZXMtaTU4Ni1hc21fMzIubyBhZXNfZ2x1ZS5vCiB0d29maXNoLWk1ODYteSA6PSB0d29maXNoLWk1ODYtYXNtXzMyLm8gdHdvZmlzaF9nbHVlLm8KIHNhbHNhMjAtaTU4Ni15IDo9IHNhbHNhMjAtaTU4Ni1hc21fMzIubyBzYWxzYTIwX2dsdWUubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL2NyYzMyYy1pbnRlbC5jIGIvYXJjaC94ODYvY3J5cHRvL2NyYzMyYy1pbnRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGFmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vY3JjMzJjLWludGVsLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBVc2luZyBoYXJkd2FyZSBwcm92aWRlZCBDUkMzMiBpbnN0cnVjdGlvbiB0byBhY2NlbGVyYXRlIHRoZSBDUkMzMiBkaXNwb3NhbC4KKyAqIENSQzMyQyBwb2x5bm9taWFsOjB4MUVEQzZGNDEoQkUpLzB4ODJGNjNCNzgoTEUpCisgKiBDUkMzMiBpcyBhIG5ldyBpbnN0cnVjdGlvbiBpbiBJbnRlbCBTU0U0LjIsIHRoZSByZWZlcmVuY2UgY2FuIGJlIGZvdW5kIGF0OgorICogaHR0cDovL3d3dy5pbnRlbC5jb20vcHJvZHVjdHMvcHJvY2Vzc29yL21hbnVhbHMvCisgKiBJbnRlbChSKSA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwKKyAqIFZvbHVtZSAyQTogSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSwgQS1NCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEF1c3RpbiBaaGFuZyA8YXVzdGluX3poYW5nQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBLZW50IExpdSA8a2VudC5saXVAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisKKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorCisjZGVmaW5lIENIS1NVTV9CTE9DS19TSVpFCTEKKyNkZWZpbmUgQ0hLU1VNX0RJR0VTVF9TSVpFCTQKKworI2RlZmluZSBTQ0FMRV9GCXNpemVvZih1bnNpZ25lZCBsb25nKQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBSRVhfUFJFICIweDQ4LCAiCisjZWxzZQorI2RlZmluZSBSRVhfUFJFCisjZW5kaWYKKworc3RhdGljIHUzMiBjcmMzMmNfaW50ZWxfbGVfaHdfYnl0ZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCXdoaWxlIChsZW5ndGgtLSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSIuYnl0ZSAweGYyLCAweGYsIDB4MzgsIDB4ZjAsIDB4ZjEiCisJCQk6Ij1TIihjcmMpCisJCQk6IjAiKGNyYyksICJjIigqZGF0YSkKKwkJKTsKKwkJZGF0YSsrOworCX0KKworCXJldHVybiBjcmM7Cit9CisKK3N0YXRpYyB1MzIgX19wdXJlIGNyYzMyY19pbnRlbF9sZV9odyh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGludCBpcXVvdGllbnQgPSBsZW4gLyBTQ0FMRV9GOworCXVuc2lnbmVkIGludCBpcmVtYWluZGVyID0gbGVuICUgU0NBTEVfRjsKKwl1bnNpZ25lZCBsb25nICpwdG1wID0gKHVuc2lnbmVkIGxvbmcgKilwOworCisJd2hpbGUgKGlxdW90aWVudC0tKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJIi5ieXRlIDB4ZjIsICIgUkVYX1BSRSAiMHhmLCAweDM4LCAweGYxLCAweGYxOyIKKwkJCToiPVMiKGNyYykKKwkJCToiMCIoY3JjKSwgImMiKCpwdG1wKQorCQkpOworCQlwdG1wKys7CisJfQorCisJaWYgKGlyZW1haW5kZXIpCisJCWNyYyA9IGNyYzMyY19pbnRlbF9sZV9od19ieXRlKGNyYywgKHVuc2lnbmVkIGNoYXIgKilwdG1wLAorCQkJCSBpcmVtYWluZGVyKTsKKworCXJldHVybiBjcmM7Cit9CisKKy8qCisgKiBTZXR0aW5nIHRoZSBzZWVkIGFsbG93cyBhcmJpdHJhcnkgYWNjdW11bGF0b3JzIGFuZCBmbGV4aWJsZSBYT1IgcG9saWN5CisgKiBJZiB5b3VyIGFsZ29yaXRobSBzdGFydHMgd2l0aCB+MCwgdGhlbiBYT1Igd2l0aCB+MCBiZWZvcmUgeW91IHNldAorICogdGhlIHNlZWQuCisgKi8KK3N0YXRpYyBpbnQgY3JjMzJjX2ludGVsX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FoYXNoICpoYXNoLCBjb25zdCB1OCAqa2V5LAorCQkJdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwl1MzIgKm1jdHggPSBjcnlwdG9fYWhhc2hfY3R4KGhhc2gpOworCisJaWYgKGtleWxlbiAhPSBzaXplb2YodTMyKSkgeworCQljcnlwdG9fYWhhc2hfc2V0X2ZsYWdzKGhhc2gsIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSptY3R4ID0gbGUzMl90b19jcHVwKChfX2xlMzIgKilrZXkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyYzMyY19pbnRlbF9pbml0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJdTMyICptY3R4ID0gY3J5cHRvX2FoYXNoX2N0eChjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSkpOworCXUzMiAqY3JjcCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisKKwkqY3JjcCA9ICptY3R4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JjMzJjX2ludGVsX3VwZGF0ZShzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9faGFzaF93YWxrIHdhbGs7CisJdTMyICpjcmNwID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwl1MzIgY3JjID0gKmNyY3A7CisJaW50IG5ieXRlczsKKworCWZvciAobmJ5dGVzID0gY3J5cHRvX2hhc2hfd2Fsa19maXJzdChyZXEsICZ3YWxrKTsgbmJ5dGVzOworCSAgIG5ieXRlcyA9IGNyeXB0b19oYXNoX3dhbGtfZG9uZSgmd2FsaywgMCkpCisJY3JjID0gY3JjMzJjX2ludGVsX2xlX2h3KGNyYywgd2Fsay5kYXRhLCBuYnl0ZXMpOworCisJKmNyY3AgPSBjcmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JjMzJjX2ludGVsX2ZpbmFsKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJdTMyICpjcmNwID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKworCSooX19sZTMyICopcmVxLT5yZXN1bHQgPSB+Y3B1X3RvX2xlMzJwKGNyY3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyYzMyY19pbnRlbF9kaWdlc3Qoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2hhc2hfd2FsayB3YWxrOworCXUzMiAqbWN0eCA9IGNyeXB0b19haGFzaF9jdHgoY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpKTsKKwl1MzIgY3JjID0gKm1jdHg7CisJaW50IG5ieXRlczsKKworCWZvciAobmJ5dGVzID0gY3J5cHRvX2hhc2hfd2Fsa19maXJzdChyZXEsICZ3YWxrKTsgbmJ5dGVzOworCSAgIG5ieXRlcyA9IGNyeXB0b19oYXNoX3dhbGtfZG9uZSgmd2FsaywgMCkpCisJCWNyYyA9IGNyYzMyY19pbnRlbF9sZV9odyhjcmMsIHdhbGsuZGF0YSwgbmJ5dGVzKTsKKworCSooX19sZTMyICopcmVxLT5yZXN1bHQgPSB+Y3B1X3RvX2xlMzIoY3JjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmMzMmNfaW50ZWxfY3JhX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwl1MzIgKmtleSA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwkqa2V5ID0gfjA7CisKKwl0Zm0tPmNydF9haGFzaC5yZXFzaXplID0gc2l6ZW9mKHUzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFsZyA9IHsKKwkuY3JhX25hbWUgICAgICAgICAgICAgICA9ICAgICAgICJjcmMzMmMiLAorCS5jcmFfZHJpdmVyX25hbWUgICAgICAgID0gICAgICAgImNyYzMyYy1pbnRlbCIsCisJLmNyYV9wcmlvcml0eSAgICAgICAgICAgPSAgICAgICAyMDAsCisJLmNyYV9mbGFncyAgICAgICAgICAgICAgPSAgICAgICBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJLmNyYV9ibG9ja3NpemUgICAgICAgICAgPSAgICAgICBDSEtTVU1fQkxPQ0tfU0laRSwKKwkuY3JhX2FsaWdubWFzayAgICAgICAgICA9ICAgICAgIDMsCisJLmNyYV9jdHhzaXplICAgICAgICAgICAgPSAgICAgICBzaXplb2YodTMyKSwKKwkuY3JhX21vZHVsZSAgICAgICAgICAgICA9ICAgICAgIFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdCAgICAgICAgICAgICAgID0gICAgICAgTElTVF9IRUFEX0lOSVQoYWxnLmNyYV9saXN0KSwKKwkuY3JhX2luaXQgICAgICAgICAgICAgICA9ICAgICAgIGNyYzMyY19pbnRlbF9jcmFfaW5pdCwKKwkuY3JhX3R5cGUgICAgICAgICAgICAgICA9ICAgICAgICZjcnlwdG9fYWhhc2hfdHlwZSwKKwkuY3JhX3UgICAgICAgICAgICAgICAgICA9ICAgICAgIHsKKwkJLmFoYXNoID0geworCQkJLmRpZ2VzdHNpemUgICAgPSAgICAgICBDSEtTVU1fRElHRVNUX1NJWkUsCisJCQkuc2V0a2V5ICAgICAgICA9ICAgICAgIGNyYzMyY19pbnRlbF9zZXRrZXksCisJCQkuaW5pdCAgICAgICAgICA9ICAgICAgIGNyYzMyY19pbnRlbF9pbml0LAorCQkJLnVwZGF0ZSAgICAgICAgPSAgICAgICBjcmMzMmNfaW50ZWxfdXBkYXRlLAorCQkJLmZpbmFsICAgICAgICAgPSAgICAgICBjcmMzMmNfaW50ZWxfZmluYWwsCisJCQkuZGlnZXN0ICAgICAgICA9ICAgICAgIGNyYzMyY19pbnRlbF9kaWdlc3QsCisJCX0KKwl9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGNyYzMyY19pbnRlbF9tb2RfaW5pdCh2b2lkKQoreworCWlmIChjcHVfaGFzX3htbTRfMikKKwkJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFsZyk7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNyYzMyY19pbnRlbF9tb2RfZmluaSh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWxnKTsKK30KKworbW9kdWxlX2luaXQoY3JjMzJjX2ludGVsX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGNyYzMyY19pbnRlbF9tb2RfZmluaSk7CisKK01PRFVMRV9BVVRIT1IoIkF1c3RpbiBaaGFuZyA8YXVzdGluLnpoYW5nQGludGVsLmNvbT4sIEtlbnQgTGl1IDxrZW50LmxpdUBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzMyYyAoQ2FzdGFnbm9saSkgb3B0aW1pemF0aW9uIHVzaW5nIEludGVsIEhhcmR3YXJlLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfQUxJQVMoImNyYzMyYyIpOworTU9EVUxFX0FMSUFTKCJjcmMzMmMtaW50ZWwiKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX2FvdXQuYyBiL2FyY2gveDg2L2lhMzIvaWEzMl9hb3V0LmMKaW5kZXggYTBlMWRiZS4uMTI3ZWMzZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9pYTMyX2FvdXQuYworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfYW91dC5jCkBAIC04NSw4ICs4NSwxMCBAQAogCWR1bXAtPnJlZ3MuYXggPSByZWdzLT5heDsKIAlkdW1wLT5yZWdzLmRzID0gY3VycmVudC0+dGhyZWFkLmRzOwogCWR1bXAtPnJlZ3MuZXMgPSBjdXJyZW50LT50aHJlYWQuZXM7Ci0JYXNtKCJtb3ZsICUlZnMsJTAiIDogIj1yIiAoZnMpKTsgZHVtcC0+cmVncy5mcyA9IGZzOwotCWFzbSgibW92bCAlJWdzLCUwIiA6ICI9ciIgKGdzKSk7IGR1bXAtPnJlZ3MuZ3MgPSBnczsKKwlzYXZlc2VnbWVudChmcywgZnMpOworCWR1bXAtPnJlZ3MuZnMgPSBmczsKKwlzYXZlc2VnbWVudChncywgZ3MpOworCWR1bXAtPnJlZ3MuZ3MgPSBnczsKIAlkdW1wLT5yZWdzLm9yaWdfYXggPSByZWdzLT5vcmlnX2F4OwogCWR1bXAtPnJlZ3MuaXAgPSByZWdzLT5pcDsKIAlkdW1wLT5yZWdzLmNzID0gcmVncy0+Y3M7CkBAIC00MzAsOCArNDMyLDkgQEAKIAljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPQogCQkodW5zaWduZWQgbG9uZyljcmVhdGVfYW91dF90YWJsZXMoKGNoYXIgX191c2VyICopYnBybS0+cCwgYnBybSk7CiAJLyogc3RhcnQgdGhyZWFkICovCi0JYXNtIHZvbGF0aWxlKCJtb3ZsICUwLCUlZnMiIDo6ICJyIiAoMCkpOyBcCi0JYXNtIHZvbGF0aWxlKCJtb3ZsICUwLCUlZXM7IG1vdmwgJTAsJSVkcyI6IDoiciIgKF9fVVNFUjMyX0RTKSk7CisJbG9hZHNlZ21lbnQoZnMsIDApOworCWxvYWRzZWdtZW50KGRzLCBfX1VTRVIzMl9EUyk7CisJbG9hZHNlZ21lbnQoZXMsIF9fVVNFUjMyX0RTKTsKIAlsb2FkX2dzX2luZGV4KDApOwogCShyZWdzKS0+aXAgPSBleC5hX2VudHJ5OwogCShyZWdzKS0+c3AgPSBjdXJyZW50LT5tbS0+c3RhcnRfc3RhY2s7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggMjBhZjRjNy4uNGJjMDJiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYwpAQCAtMTc5LDkgKzE3OSwxMCBAQAogCXUzMiBwcmV0Y29kZTsKIAlpbnQgc2lnOwogCXN0cnVjdCBzaWdjb250ZXh0X2lhMzIgc2M7Ci0Jc3RydWN0IF9mcHN0YXRlX2lhMzIgZnBzdGF0ZTsKKwlzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBmcHN0YXRlX3VudXNlZDsgLyogbG9vayBhdCBrZXJuZWwvc2lnZnJhbWUuaCAqLwogCXVuc2lnbmVkIGludCBleHRyYW1hc2tbX0NPTVBBVF9OU0lHX1dPUkRTLTFdOwogCWNoYXIgcmV0Y29kZVs4XTsKKwkvKiBmcCBzdGF0ZSBmb2xsb3dzIGhlcmUgKi8KIH07CiAKIHN0cnVjdCBydF9zaWdmcmFtZQpAQCAtMTkyLDggKzE5Myw4IEBACiAJdTMyIHB1YzsKIAljb21wYXRfc2lnaW5mb190IGluZm87CiAJc3RydWN0IHVjb250ZXh0X2lhMzIgdWM7Ci0Jc3RydWN0IF9mcHN0YXRlX2lhMzIgZnBzdGF0ZTsKIAljaGFyIHJldGNvZGVbOF07CisJLyogZnAgc3RhdGUgZm9sbG93cyBoZXJlICovCiB9OwogCiAjZGVmaW5lIENPUFkoeCkJCXsgCQlcCkBAIC0yMDYsNyArMjA3LDcgQEAKIAl7IHVuc2lnbmVkIGludCBjdXI7CQkJCQkJXAogCSAgdW5zaWduZWQgc2hvcnQgcHJlOwkJCQkJCVwKIAkgIGVyciB8PSBfX2dldF91c2VyKHByZSwgJnNjLT5zZWcpOwkJCQlcCi0JICBhc20gdm9sYXRpbGUoIm1vdmwgJSUiICNzZWcgIiwlMCIgOiAiPXIiIChjdXIpKTsJCVwKKwkgIHNhdmVzZWdtZW50KHNlZywgY3VyKTsJCQkJCVwKIAkgIHByZSB8PSBtYXNrOwkJCQkJCQlcCiAJICBpZiAocHJlICE9IGN1cikgbG9hZHNlZ21lbnQoc2VnLCBwcmUpOyB9CiAKQEAgLTIxNSw3ICsyMTYsNyBAQAogCQkJCSAgIHVuc2lnbmVkIGludCAqcGVheCkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wZmxhZ3MsIGdzLCBvbGRncywgZXJyID0gMDsKLQlzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBfX3VzZXIgKmJ1ZjsKKwl2b2lkIF9fdXNlciAqYnVmOwogCXUzMiB0bXA7CiAKIAkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KQEAgLTIzNSw3ICsyMzYsNyBAQAogCSAqLwogCWVyciB8PSBfX2dldF91c2VyKGdzLCAmc2MtPmdzKTsKIAlncyB8PSAzOwotCWFzbSgibW92bCAlJWdzLCUwIiA6ICI9ciIgKG9sZGdzKSk7CisJc2F2ZXNlZ21lbnQoZ3MsIG9sZGdzKTsKIAlpZiAoZ3MgIT0gb2xkZ3MpCiAJCWxvYWRfZ3NfaW5kZXgoZ3MpOwogCkBAIC0yNTksMjYgKzI2MCwxMiBAQAogCiAJZXJyIHw9IF9fZ2V0X3VzZXIodG1wLCAmc2MtPmZwc3RhdGUpOwogCWJ1ZiA9IGNvbXBhdF9wdHIodG1wKTsKLQlpZiAoYnVmKSB7Ci0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIHNpemVvZigqYnVmKSkpCi0JCQlnb3RvIGJhZGZyYW1lOwotCQllcnIgfD0gcmVzdG9yZV9pMzg3X2lhMzIoYnVmKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKLQotCQlpZiAodXNlZF9tYXRoKCkpIHsKLQkJCWNsZWFyX2ZwdShtZSk7Ci0JCQljbGVhcl91c2VkX21hdGgoKTsKLQkJfQotCX0KKwllcnIgfD0gcmVzdG9yZV9pMzg3X3hzdGF0ZV9pYTMyKGJ1Zik7CiAKIAllcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+YXgpOwogCSpwZWF4ID0gdG1wOwogCiAJcmV0dXJuIGVycjsKLQotYmFkZnJhbWU6Ci0JcmV0dXJuIDE7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0zNTAsNDYgKzMzNyw0MiBAQAogICovCiAKIHN0YXRpYyBpbnQgaWEzMl9zZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0X2lhMzIgX191c2VyICpzYywKLQkJCQkgc3RydWN0IF9mcHN0YXRlX2lhMzIgX191c2VyICpmcHN0YXRlLAorCQkJCSB2b2lkIF9fdXNlciAqZnBzdGF0ZSwKIAkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBtYXNrKQogewogCWludCB0bXAsIGVyciA9IDA7CiAKLQl0bXAgPSAwOwotCV9fYXNtX18oIm1vdmwgJSVncywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwlzYXZlc2VnbWVudChncywgdG1wKTsKIAllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5ncyk7Ci0JX19hc21fXygibW92bCAlJWZzLCUwIiA6ICI9ciIodG1wKTogIjAiKHRtcCkpOworCXNhdmVzZWdtZW50KGZzLCB0bXApOwogCWVyciB8PSBfX3B1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPmZzKTsKLQlfX2FzbV9fKCJtb3ZsICUlZHMsJTAiIDogIj1yIih0bXApOiAiMCIodG1wKSk7CisJc2F2ZXNlZ21lbnQoZHMsIHRtcCk7CiAJZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+ZHMpOwotCV9fYXNtX18oIm1vdmwgJSVlcywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwlzYXZlc2VnbWVudChlcywgdG1wKTsKIAllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5lcyk7CiAKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmRpLCAmc2MtPmRpKTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPnNpLCAmc2MtPnNpKTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmJwLCAmc2MtPmJwKTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPnNwLCAmc2MtPnNwKTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmJ4LCAmc2MtPmJ4KTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmR4LCAmc2MtPmR4KTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmN4LCAmc2MtPmN4KTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmF4LCAmc2MtPmF4KTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPmNzLCAmc2MtPmNzKTsKLQllcnIgfD0gX19wdXRfdXNlcigodTMyKXJlZ3MtPnNzLCAmc2MtPnNzKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5kaSwgJnNjLT5kaSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+c2ksICZzYy0+c2kpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmJwLCAmc2MtPmJwKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5zcCwgJnNjLT5zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+YngsICZzYy0+YngpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmR4LCAmc2MtPmR4KTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5jeCwgJnNjLT5jeCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+YXgsICZzYy0+YXgpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmNzLCAmc2MtPmNzKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5zcywgJnNjLT5zcyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sICZzYy0+dHJhcG5vKTsKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNjLT5lcnIpOwotCWVyciB8PSBfX3B1dF91c2VyKCh1MzIpcmVncy0+aXAsICZzYy0+aXApOwotCWVyciB8PSBfX3B1dF91c2VyKCh1MzIpcmVncy0+ZmxhZ3MsICZzYy0+ZmxhZ3MpOwotCWVyciB8PSBfX3B1dF91c2VyKCh1MzIpcmVncy0+c3AsICZzYy0+c3BfYXRfc2lnbmFsKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5pcCwgJnNjLT5pcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZmxhZ3MsICZzYy0+ZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnNwLCAmc2MtPnNwX2F0X3NpZ25hbCk7CiAKLQl0bXAgPSBzYXZlX2kzODdfaWEzMihmcHN0YXRlKTsKKwl0bXAgPSBzYXZlX2kzODdfeHN0YXRlX2lhMzIoZnBzdGF0ZSk7CiAJaWYgKHRtcCA8IDApCiAJCWVyciA9IC1FRkFVTFQ7Ci0JZWxzZSB7Ci0JCWNsZWFyX3VzZWRfbWF0aCgpOwotCQlzdHRzKCk7CisJZWxzZQogCQllcnIgfD0gX19wdXRfdXNlcihwdHJfdG9fY29tcGF0KHRtcCA/IGZwc3RhdGUgOiBOVUxMKSwKIAkJCQkJJnNjLT5mcHN0YXRlKTsKLQl9CiAKIAkvKiBub24taUJDUzIgZXh0ZW5zaW9ucy4uICovCiAJZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnNjLT5vbGRtYXNrKTsKQEAgLTQwMiw3ICszODUsOCBAQAogICogRGV0ZXJtaW5lIHdoaWNoIHN0YWNrIHRvIHVzZS4uCiAgKi8KIHN0YXRpYyB2b2lkIF9fdXNlciAqZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSBzaXplX3QgZnJhbWVfc2l6ZSkKKwkJCQkgc2l6ZV90IGZyYW1lX3NpemUsCisJCQkJIHZvaWQgKipmcHN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgc3A7CiAKQEAgLTQyMSw2ICs0MDUsMTEgQEAKIAkJIGthLT5zYS5zYV9yZXN0b3JlcikKIAkJc3AgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX3Jlc3RvcmVyOwogCisJaWYgKHVzZWRfbWF0aCgpKSB7CisJCXNwID0gc3AgLSBzaWdfeHN0YXRlX2lhMzJfc2l6ZTsKKwkJKmZwc3RhdGUgPSAoc3RydWN0IF9mcHN0YXRlX2lhMzIgKikgc3A7CisJfQorCiAJc3AgLT0gZnJhbWVfc2l6ZTsKIAkvKiBBbGlnbiB0aGUgc3RhY2sgcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGkzODYgQUJJLAogCSAqIGkuZS4gc28gdGhhdCBvbiBmdW5jdGlvbiBlbnRyeSAoKHNwICsgNCkgJiAxNSkgPT0gMC4gKi8KQEAgLTQzNCw2ICs0MjMsNyBAQAogCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCXZvaWQgX191c2VyICpyZXN0b3JlcjsKIAlpbnQgZXJyID0gMDsKKwl2b2lkIF9fdXNlciAqZnBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBjb3B5X3RvX3VzZXIgb3B0aW1pemVzIHRoYXQgaW50byBhIHNpbmdsZSA4IGJ5dGUgc3RvcmUgKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IHsKQEAgLTQ0OCwyNSArNDM4LDIxIEBACiAJCTAsCiAJfTsKIAotCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpLCAmZnBzdGF0ZSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOwotCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCWlmIChfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciB8PSBpYTMyX3NldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT5zYywgJmZyYW1lLT5mcHN0YXRlLCByZWdzLAotCQkJCQlzZXQtPnNpZ1swXSk7Ci0JaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJaWYgKGlhMzJfc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnNjLCBmcHN0YXRlLCByZWdzLCBzZXQtPnNpZ1swXSkpCisJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKF9DT01QQVRfTlNJR19XT1JEUyA+IDEpIHsKLQkJZXJyIHw9IF9fY29weV90b191c2VyKGZyYW1lLT5leHRyYW1hc2ssICZzZXQtPnNpZ1sxXSwKLQkJCQkgICAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpOwotCQlpZiAoZXJyKQotCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCWlmIChfX2NvcHlfdG9fdXNlcihmcmFtZS0+ZXh0cmFtYXNrLCAmc2V0LT5zaWdbMV0sCisJCQkJICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgewpAQCAtNDg3LDcgKzQ3Myw3IEBACiAJICovCiAJZXJyIHw9IF9fY29weV90b191c2VyKGZyYW1lLT5yZXRjb2RlLCAmY29kZSwgOCk7CiAJaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAlyZWdzLT5zcCA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKQEAgLTQ5OCw4ICs0ODQsOCBAQAogCXJlZ3MtPmR4ID0gMDsKIAlyZWdzLT5jeCA9IDA7CiAKLQlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVkcyIgOjogInIiIChfX1VTRVIzMl9EUykpOwotCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWVzIiA6OiAiciIgKF9fVVNFUjMyX0RTKSk7CisJbG9hZHNlZ21lbnQoZHMsIF9fVVNFUjMyX0RTKTsKKwlsb2Fkc2VnbWVudChlcywgX19VU0VSMzJfRFMpOwogCiAJcmVncy0+Y3MgPSBfX1VTRVIzMl9DUzsKIAlyZWdzLT5zcyA9IF9fVVNFUjMyX0RTOwpAQCAtNTEwLDEwICs0OTYsNiBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKLQotZ2l2ZV9zaWdzZWd2OgotCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKLQlyZXR1cm4gLUVGQVVMVDsKIH0KIAogaW50IGlhMzJfc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLApAQCAtNTIyLDYgKzUwNCw3IEBACiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJdm9pZCBfX3VzZXIgKnJlc3RvcmVyOwogCWludCBlcnIgPSAwOworCXZvaWQgX191c2VyICpmcHN0YXRlID0gTlVMTDsKIAogCS8qIF9fY29weV90b191c2VyIG9wdGltaXplcyB0aGF0IGludG8gYSBzaW5nbGUgOCBieXRlIHN0b3JlICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC01MzcsMzAgKzUyMCwzMyBAQAogCQkwLAogCX07CiAKLQlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSwgJmZwc3RhdGUpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQotCQlnb3RvIGdpdmVfc2lnc2VndjsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAllcnIgfD0gX19wdXRfdXNlcihzaWcsICZmcmFtZS0+c2lnKTsKIAllcnIgfD0gX19wdXRfdXNlcihwdHJfdG9fY29tcGF0KCZmcmFtZS0+aW5mbyksICZmcmFtZS0+cGluZm8pOwogCWVyciB8PSBfX3B1dF91c2VyKHB0cl90b19jb21wYXQoJmZyYW1lLT51YyksICZmcmFtZS0+cHVjKTsKIAllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sIGluZm8pOwogCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWlmIChjcHVfaGFzX3hzYXZlKQorCQllcnIgfD0gX19wdXRfdXNlcihVQ19GUF9YU1RBVEUsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVsc2UKKwkJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwogCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhyZWdzLT5zcCksCiAJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwogCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOwotCWVyciB8PSBpYTMyX3NldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5mcHN0YXRlLAorCWVyciB8PSBpYTMyX3NldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgZnBzdGF0ZSwKIAkJCQkgICAgIHJlZ3MsIHNldC0+c2lnWzBdKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CiAJaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQogCQlyZXN0b3JlciA9IGthLT5zYS5zYV9yZXN0b3JlcjsKQEAgLTU3NSw3ICs1NjEsNyBAQAogCSAqLwogCWVyciB8PSBfX2NvcHlfdG9fdXNlcihmcmFtZS0+cmV0Y29kZSwgJmNvZGUsIDgpOwogCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+c3AgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CkBAIC01OTEsOCArNTc3LDggQEAKIAlyZWdzLT5keCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87CiAJcmVncy0+Y3ggPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT51YzsKIAotCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWRzIiA6OiAiciIgKF9fVVNFUjMyX0RTKSk7Ci0JYXNtIHZvbGF0aWxlKCJtb3ZsICUwLCUlZXMiIDo6ICJyIiAoX19VU0VSMzJfRFMpKTsKKwlsb2Fkc2VnbWVudChkcywgX19VU0VSMzJfRFMpOworCWxvYWRzZWdtZW50KGVzLCBfX1VTRVIzMl9EUyk7CiAKIAlyZWdzLT5jcyA9IF9fVVNFUjMyX0NTOwogCXJlZ3MtPnNzID0gX19VU0VSMzJfRFM7CkBAIC02MDMsOCArNTg5LDQgQEAKICNlbmRpZgogCiAJcmV0dXJuIDA7Ci0KLWdpdmVfc2lnc2VndjoKLQlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwppbmRleCBmZmMxYmI0Li4yNTZiMDBiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTM5LDExICszOSwxMSBAQAogCS5lbmRtIAogCiAJLyogY2xvYmJlcnMgJWVheCAqLwkKLQkubWFjcm8gIENMRUFSX1JSRUdTCisJLm1hY3JvICBDTEVBUl9SUkVHUyBfcjk9cmF4CiAJeG9ybCAJJWVheCwlZWF4CiAJbW92cQklcmF4LFIxMSglcnNwKQogCW1vdnEJJXJheCxSMTAoJXJzcCkKLQltb3ZxCSVyYXgsUjkoJXJzcCkKKwltb3ZxCSVcX3I5LFI5KCVyc3ApCiAJbW92cQklcmF4LFI4KCVyc3ApCiAJLmVuZG0KIApAQCAtNTIsMTEgKzUyLDEwIEBACiAJICogV2UgZG9uJ3QgcmVsb2FkICVlYXggYmVjYXVzZSBzeXNjYWxsX3RyYWNlX2VudGVyKCkgcmV0dXJuZWQKIAkgKiB0aGUgdmFsdWUgaXQgd2FudHMgdXMgdG8gdXNlIGluIHRoZSB0YWJsZSBsb29rdXAuCiAJICovCi0JLm1hY3JvIExPQURfQVJHUzMyIG9mZnNldAotCW1vdmwgXG9mZnNldCglcnNwKSwlcjExZAotCW1vdmwgXG9mZnNldCs4KCVyc3ApLCVyMTBkCisJLm1hY3JvIExPQURfQVJHUzMyIG9mZnNldCwgX3I5PTAKKwkuaWYgXF9yOQogCW1vdmwgXG9mZnNldCsxNiglcnNwKSwlcjlkCi0JbW92bCBcb2Zmc2V0KzI0KCVyc3ApLCVyOGQKKwkuZW5kaWYKIAltb3ZsIFxvZmZzZXQrNDAoJXJzcCksJWVjeAogCW1vdmwgXG9mZnNldCs0OCglcnNwKSwlZWR4CiAJbW92bCBcb2Zmc2V0KzU2KCVyc3ApLCVlc2kKQEAgLTE0NSw3ICsxNDQsNyBAQAogCVNBVkVfQVJHUyAwLDAsMQogIAkvKiBubyBuZWVkIHRvIGRvIGFuIGFjY2Vzc19vayBjaGVjayBoZXJlIGJlY2F1c2UgcmJwIGhhcyBiZWVuCiAgCSAgIDMyYml0IHplcm8gZXh0ZW5kZWQgKi8gCi0xOgltb3ZsCSglcmJwKSwlcjlkCisxOgltb3ZsCSglcmJwKSwlZWJwCiAgCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAgCS5xdWFkIDFiLGlhMzJfYmFkYXJnCiAgCS5wcmV2aW91cwkKQEAgLTE1Nyw3ICsxNTYsNyBAQAogCWNtcGwJJChJQTMyX05SX3N5c2NhbGxzLTEpLCVlYXgKIAlqYQlpYTMyX2JhZHN5cwogc3lzZW50ZXJfZG9fY2FsbDoKLQlJQTMyX0FSR19GSVhVUCAxCisJSUEzMl9BUkdfRklYVVAKIHN5c2VudGVyX2Rpc3BhdGNoOgogCWNhbGwJKmlhMzJfc3lzX2NhbGxfdGFibGUoLCVyYXgsOCkKIAltb3ZxCSVyYXgsUkFYLUFSR09GRlNFVCglcnNwKQpAQCAtMjM0LDIwICsyMzMsMTcgQEAKICNlbmRpZgogCiBzeXNlbnRlcl90cmFjZXN5czoKLQl4Y2hnbAklcjlkLCVlYnAKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiAJdGVzdGwJJChfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSAmIH5fVElGX1NZU0NBTExfQVVESVQpLFRJX2ZsYWdzKCVyMTApCiAJanoJc3lzZW50ZXJfYXVkaXRzeXMKICNlbmRpZgogCVNBVkVfUkVTVAogCUNMRUFSX1JSRUdTCi0JbW92cQklcjksUjkoJXJzcCkKIAltb3ZxCSQtRU5PU1lTLFJBWCglcnNwKS8qIHB0cmFjZSBjYW4gY2hhbmdlIHRoaXMgZm9yIGEgYmFkIHN5c2NhbGwgKi8KIAltb3ZxCSVyc3AsJXJkaSAgICAgICAgLyogJnB0X3JlZ3MgLT4gYXJnMSAqLwogCWNhbGwJc3lzY2FsbF90cmFjZV9lbnRlcgogCUxPQURfQVJHUzMyIEFSR09GRlNFVCAgLyogcmVsb2FkIGFyZ3MgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIGl0ICovCiAJUkVTVE9SRV9SRVNUCi0JeGNoZ2wJJWVicCwlcjlkCiAJY21wbAkkKElBMzJfTlJfc3lzY2FsbHMtMSksJWVheAogCWphCWludF9yZXRfZnJvbV9zeXNfY2FsbCAvKiBzeXNlbnRlcl90cmFjZXN5cyBoYXMgc2V0IFJBWCglcnNwKSAqLwogCWptcAlzeXNlbnRlcl9kb19jYWxsCkBAIC0zMTQsOSArMzEwLDkgQEAKIAl0ZXN0bCAkX1RJRl9XT1JLX1NZU0NBTExfRU5UUlksVElfZmxhZ3MoJXIxMCkKIAlDRklfUkVNRU1CRVJfU1RBVEUKIAlqbnogICBjc3Rhcl90cmFjZXN5cwotY3N0YXJfZG9fY2FsbDoJCiAJY21wbCAkSUEzMl9OUl9zeXNjYWxscy0xLCVlYXgKIAlqYSAgaWEzMl9iYWRzeXMKK2NzdGFyX2RvX2NhbGw6CiAJSUEzMl9BUkdfRklYVVAgMQogY3N0YXJfZGlzcGF0Y2g6CiAJY2FsbCAqaWEzMl9zeXNfY2FsbF90YWJsZSgsJXJheCw4KQpAQCAtMzU3LDE1ICszNTMsMTMgQEAKICNlbmRpZgogCXhjaGdsICVyOWQsJWVicAogCVNBVkVfUkVTVAotCUNMRUFSX1JSRUdTCi0JbW92cSAlcjksUjkoJXJzcCkKKwlDTEVBUl9SUkVHUyByOQogCW1vdnEgJC1FTk9TWVMsUkFYKCVyc3ApCS8qIHB0cmFjZSBjYW4gY2hhbmdlIHRoaXMgZm9yIGEgYmFkIHN5c2NhbGwgKi8KIAltb3ZxICVyc3AsJXJkaSAgICAgICAgLyogJnB0X3JlZ3MgLT4gYXJnMSAqLwogCWNhbGwgc3lzY2FsbF90cmFjZV9lbnRlcgotCUxPQURfQVJHUzMyIEFSR09GRlNFVCAgLyogcmVsb2FkIGFyZ3MgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIGl0ICovCisJTE9BRF9BUkdTMzIgQVJHT0ZGU0VULCAxICAvKiByZWxvYWQgYXJncyBmcm9tIHN0YWNrIGluIGNhc2UgcHRyYWNlIGNoYW5nZWQgaXQgKi8KIAlSRVNUT1JFX1JFU1QKIAl4Y2hnbCAlZWJwLCVyOWQKLQltb3ZsIFJTUC1BUkdPRkZTRVQoJXJzcCksICVyOGQKIAljbXBsICQoSUEzMl9OUl9zeXNjYWxscy0xKSwlZWF4CiAJamEgaW50X3JldF9mcm9tX3N5c19jYWxsIC8qIGNzdGFyX3RyYWNlc3lzIGhhcyBzZXQgUkFYKCVyc3ApICovCiAJam1wIGNzdGFyX2RvX2NhbGwKQEAgLTU3Nyw4ICs1NzEsOCBAQAogCS5xdWFkIGNvbXBhdF9zeXNfc2V0cmxpbWl0CS8qIDc1ICovCiAJLnF1YWQgY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0CS8qIG9sZF9nZXRybGltaXQgKi8KIAkucXVhZCBjb21wYXRfc3lzX2dldHJ1c2FnZQotCS5xdWFkIHN5czMyX2dldHRpbWVvZmRheQotCS5xdWFkIHN5czMyX3NldHRpbWVvZmRheQorCS5xdWFkIGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5CisJLnF1YWQgY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkKIAkucXVhZCBzeXNfZ2V0Z3JvdXBzMTYJLyogODAgKi8KIAkucXVhZCBzeXNfc2V0Z3JvdXBzMTYKIAkucXVhZCBzeXMzMl9vbGRfc2VsZWN0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMKaW5kZXggZDNjNjQwOC4uMmUwOWRjZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYwpAQCAtNDksNDEgKzQ5LDYgQEAKIAogI2RlZmluZSBBQShfX3gpCQkoKHVuc2lnbmVkIGxvbmcpKF9feCkpCiAKLWludCBjcF9jb21wYXRfc3RhdChzdHJ1Y3Qga3N0YXQgKmtidWYsIHN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnVidWYpCi17Ci0JY29tcGF0X2lub190IGlubzsKLQotCXR5cGVvZih1YnVmLT5zdF91aWQpIHVpZCA9IDA7Ci0JdHlwZW9mKHVidWYtPnN0X2dpZCkgZ2lkID0gMDsKLQlTRVRfVUlEKHVpZCwga2J1Zi0+dWlkKTsKLQlTRVRfR0lEKGdpZCwga2J1Zi0+Z2lkKTsKLQlpZiAoIW9sZF92YWxpZF9kZXYoa2J1Zi0+ZGV2KSB8fCAhb2xkX3ZhbGlkX2RldihrYnVmLT5yZGV2KSkKLQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JaWYgKGtidWYtPnNpemUgPj0gMHg3ZmZmZmZmZikKLQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JaW5vID0ga2J1Zi0+aW5vOwotCWlmIChzaXplb2YoaW5vKSA8IHNpemVvZihrYnVmLT5pbm8pICYmIGlubyAhPSBrYnVmLT5pbm8pCi0JCXJldHVybiAtRU9WRVJGTE9XOwotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWJ1Ziwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfc3RhdCkpIHx8Ci0JICAgIF9fcHV0X3VzZXIob2xkX2VuY29kZV9kZXYoa2J1Zi0+ZGV2KSwgJnVidWYtPnN0X2RldikgfHwKLQkgICAgX19wdXRfdXNlcihpbm8sICZ1YnVmLT5zdF9pbm8pIHx8Ci0JICAgIF9fcHV0X3VzZXIoa2J1Zi0+bW9kZSwgJnVidWYtPnN0X21vZGUpIHx8Ci0JICAgIF9fcHV0X3VzZXIoa2J1Zi0+bmxpbmssICZ1YnVmLT5zdF9ubGluaykgfHwKLQkgICAgX19wdXRfdXNlcih1aWQsICZ1YnVmLT5zdF91aWQpIHx8Ci0JICAgIF9fcHV0X3VzZXIoZ2lkLCAmdWJ1Zi0+c3RfZ2lkKSB8fAotCSAgICBfX3B1dF91c2VyKG9sZF9lbmNvZGVfZGV2KGtidWYtPnJkZXYpLCAmdWJ1Zi0+c3RfcmRldikgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5zaXplLCAmdWJ1Zi0+c3Rfc2l6ZSkgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5hdGltZS50dl9zZWMsICZ1YnVmLT5zdF9hdGltZSkgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5hdGltZS50dl9uc2VjLCAmdWJ1Zi0+c3RfYXRpbWVfbnNlYykgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5tdGltZS50dl9zZWMsICZ1YnVmLT5zdF9tdGltZSkgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5tdGltZS50dl9uc2VjLCAmdWJ1Zi0+c3RfbXRpbWVfbnNlYykgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5jdGltZS50dl9zZWMsICZ1YnVmLT5zdF9jdGltZSkgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5jdGltZS50dl9uc2VjLCAmdWJ1Zi0+c3RfY3RpbWVfbnNlYykgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5ibGtzaXplLCAmdWJ1Zi0+c3RfYmxrc2l6ZSkgfHwKLQkgICAgX19wdXRfdXNlcihrYnVmLT5ibG9ja3MsICZ1YnVmLT5zdF9ibG9ja3MpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KIAogYXNtbGlua2FnZSBsb25nIHN5czMyX3RydW5jYXRlNjQoY2hhciBfX3VzZXIgKmZpbGVuYW1lLAogCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldF9sb3csCkBAIC00MDIsNzUgKzM2NywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgZ2V0X3R2MzIoc3RydWN0IHRpbWV2YWwgKm8sIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKmkpCi17Ci0JaW50IGVyciA9IC1FRkFVTFQ7Ci0KLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBpLCBzaXplb2YoKmkpKSkgewotCQllcnIgPSBfX2dldF91c2VyKG8tPnR2X3NlYywgJmktPnR2X3NlYyk7Ci0JCWVyciB8PSBfX2dldF91c2VyKG8tPnR2X3VzZWMsICZpLT50dl91c2VjKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIHB1dF90djMyKHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKm8sIHN0cnVjdCB0aW1ldmFsICppKQotewotCWludCBlcnIgPSAtRUZBVUxUOwotCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG8sIHNpemVvZigqbykpKSB7Ci0JCWVyciA9IF9fcHV0X3VzZXIoaS0+dHZfc2VjLCAmby0+dHZfc2VjKTsKLQkJZXJyIHw9IF9fcHV0X3VzZXIoaS0+dHZfdXNlYywgJm8tPnR2X3VzZWMpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfYWxhcm0odW5zaWduZWQgaW50IHNlY29uZHMpCiB7CiAJcmV0dXJuIGFsYXJtX3NldGl0aW1lcihzZWNvbmRzKTsKIH0KIAotLyoKLSAqIFRyYW5zbGF0aW9ucyBkdWUgdG8gdGltZV90IHNpemUgZGlmZmVyZW5jZXMuIFdoaWNoIGFmZmVjdHMgYWxsCi0gKiBzb3J0cyBvZiB0aGluZ3MsIGxpa2UgdGltZXZhbCBhbmQgaXRpbWVydmFsLgotICovCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAotCQkJCSAgIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQotewotCWlmICh0dikgewotCQlzdHJ1Y3QgdGltZXZhbCBrdHY7Ci0KLQkJZG9fZ2V0dGltZW9mZGF5KCZrdHYpOwotCQlpZiAocHV0X3R2MzIodHYsICZrdHYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWlmICh0eikgewotCQlpZiAoY29weV90b191c2VyKHR6LCAmc3lzX3R6LCBzaXplb2Yoc3lzX3R6KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9zZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCi0JCQkJICAgc3RydWN0IHRpbWV6b25lIF9fdXNlciAqdHopCi17Ci0Jc3RydWN0IHRpbWV2YWwga3R2OwotCXN0cnVjdCB0aW1lc3BlYyBrdHM7Ci0Jc3RydWN0IHRpbWV6b25lIGt0ejsKLQotCWlmICh0dikgewotCQlpZiAoZ2V0X3R2MzIoJmt0diwgdHYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWt0cy50dl9zZWMgPSBrdHYudHZfc2VjOwotCQlrdHMudHZfbnNlYyA9IGt0di50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKLQl9Ci0JaWYgKHR6KSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Ci19Ci0KIHN0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CiAJdW5zaWduZWQgaW50IG47CiAJdW5zaWduZWQgaW50IGlucDsKQEAgLTU1NiwxNSArNDU3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUaGVzZSBhcmUgaGVyZSBqdXN0IGluIGNhc2Ugc29tZSBvbGQgaWEzMiBiaW5hcnkgY2FsbHMgaXQuICovCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfcGF1c2Uodm9pZCkKLXsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZSgpOwotCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7Ci19Ci0KLQogI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogc3RydWN0IHN5c2N0bF9pYTMyIHsKIAl1bnNpZ25lZCBpbnQJbmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCAzZGI2NTFmLi4wZDQxZjAzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw3IEBACiAjIERvIG5vdCBwcm9maWxlIGRlYnVnIGFuZCBsb3dsZXZlbCB1dGlsaXRpZXMKIENGTEFHU19SRU1PVkVfdHNjLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfcnRjLm8gPSAtcGcKLUNGTEFHU19SRU1PVkVfcGFyYXZpcnQubyA9IC1wZworQ0ZMQUdTX1JFTU9WRV9wYXJhdmlydC1zcGlubG9ja3MubyA9IC1wZwogZW5kaWYKIAogIwpAQCAtMjMsNyArMjMsNyBAQAogQ0ZMQUdTX3RzYy5vCQk6PSAkKG5vc3RhY2twKQogCiBvYmoteQkJCTo9IHByb2Nlc3NfJChCSVRTKS5vIHNpZ25hbF8kKEJJVFMpLm8gZW50cnlfJChCSVRTKS5vCi1vYmoteQkJCSs9IHRyYXBzXyQoQklUUykubyBpcnFfJChCSVRTKS5vCitvYmoteQkJCSs9IHRyYXBzLm8gaXJxXyQoQklUUykubyBkdW1wc3RhY2tfJChCSVRTKS5vCiBvYmoteQkJCSs9IHRpbWVfJChCSVRTKS5vIGlvcG9ydC5vIGxkdC5vCiBvYmoteQkJCSs9IHNldHVwLm8gaTgyNTkubyBpcnFpbml0XyQoQklUUykubyBzZXR1cF9wZXJjcHUubwogb2JqLSQoQ09ORklHX1g4Nl9WSVNXUykJKz0gdmlzd3NfcXVpcmtzLm8KQEAgLTM4LDcgKzM4LDcgQEAKIAogb2JqLSQoQ09ORklHX1g4Nl9UUkFNUE9MSU5FKQkrPSB0cmFtcG9saW5lLm8KIG9iai15CQkJCSs9IHByb2Nlc3Mubwotb2JqLXkJCQkJKz0gaTM4Ny5vCitvYmoteQkJCQkrPSBpMzg3Lm8geHNhdmUubwogb2JqLXkJCQkJKz0gcHRyYWNlLm8KIG9iai15CQkJCSs9IGRzLm8KIG9iai0kKENPTkZJR19YODZfMzIpCQkrPSB0bHMubwpAQCAtNTEsNyArNTEsNiBAQAogb2JqLSQoQ09ORklHX01DQSkJCSs9IG1jYV8zMi5vCiBvYmotJChDT05GSUdfWDg2X01TUikJCSs9IG1zci5vCiBvYmotJChDT05GSUdfWDg2X0NQVUlEKQkJKz0gY3B1aWQubwotb2JqLSQoQ09ORklHX01JQ1JPQ09ERSkJCSs9IG1pY3JvY29kZS5vCiBvYmotJChDT05GSUdfUENJKQkJKz0gZWFybHktcXVpcmtzLm8KIGFwbS15CQkJCTo9IGFwbV8zMi5vCiBvYmotJChDT05GSUdfQVBNKQkJKz0gYXBtLm8KQEAgLTY5LDYgKzY4LDcgQEAKIG9iai0kKENPTkZJR19LRVhFQykJCSs9IHJlbG9jYXRlX2tlcm5lbF8kKEJJVFMpLm8gY3Jhc2gubwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXBfJChCSVRTKS5vCiBvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXFfMzIubworb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCSs9IGVzNzAwMF8zMi5vCiBvYmotJChDT05GSUdfWDg2X1NVTU1JVF9OVU1BKQkrPSBzdW1taXRfMzIubwogb2JqLXkJCQkJKz0gdnNtcF82NC5vCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubwpAQCAtODksNyArODksNyBAQAogb2JqLSQoQ09ORklHX1ZNSSkJCSs9IHZtaV8zMi5vIHZtaWNsb2NrXzMyLm8KIG9iai0kKENPTkZJR19LVk1fR1VFU1QpCQkrPSBrdm0ubwogb2JqLSQoQ09ORklHX0tWTV9DTE9DSykJCSs9IGt2bWNsb2NrLm8KLW9iai0kKENPTkZJR19QQVJBVklSVCkJCSs9IHBhcmF2aXJ0Lm8gcGFyYXZpcnRfcGF0Y2hfJChCSVRTKS5vCitvYmotJChDT05GSUdfUEFSQVZJUlQpCQkrPSBwYXJhdmlydC5vIHBhcmF2aXJ0X3BhdGNoXyQoQklUUykubyBwYXJhdmlydC1zcGlubG9ja3Mubwogb2JqLSQoQ09ORklHX1BBUkFWSVJUX0NMT0NLKQkrPSBwdmNsb2NrLm8KIAogb2JqLSQoQ09ORklHX1BDU1BLUl9QTEFURk9STSkJKz0gcGNzcGVha2VyLm8KQEAgLTk5LDExICs5OSwxOCBAQAogCiBvYmotJChDT05GSUdfT0xQQykJCSs9IG9scGMubwogCittaWNyb2NvZGUteQkJCQk6PSBtaWNyb2NvZGVfY29yZS5vCittaWNyb2NvZGUtJChDT05GSUdfTUlDUk9DT0RFX0lOVEVMKQkrPSBtaWNyb2NvZGVfaW50ZWwubworbWljcm9jb2RlLSQoQ09ORklHX01JQ1JPQ09ERV9BTUQpCSs9IG1pY3JvY29kZV9hbWQubworb2JqLSQoQ09ORklHX01JQ1JPQ09ERSkJCQkrPSBtaWNyb2NvZGUubworCiAjIyMKICMgNjQgYml0IHNwZWNpZmljIGZpbGVzCiBpZmVxICgkKENPTkZJR19YODZfNjQpLHkpCiAgICAgICAgIG9iai15CQkJCSs9IGdlbmFwaWNfNjQubyBnZW5hcGljX2ZsYXRfNjQubyBnZW54MmFwaWNfdXZfeC5vIHRsYl91di5vCiAJb2JqLXkJCQkJKz0gYmlvc191di5vCisgICAgICAgIG9iai15CQkJCSs9IGdlbngyYXBpY19jbHVzdGVyLm8KKyAgICAgICAgb2JqLXkJCQkJKz0gZ2VueDJhcGljX3BoeXMubwogICAgICAgICBvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSBwbXRpbWVyXzY0Lm8KICAgICAgICAgb2JqLSQoQ09ORklHX0FVRElUKQkJKz0gYXVkaXRfNjQubwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggYmZkMTBmZC4uZWI4NzVjZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtNTgsNyArNTgsNiBAQAogI2lmZGVmCUNPTkZJR19YODZfNjQKIAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgotI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAKICNlbHNlCQkJCS8qIFg4NiAqLwogCkBAIC05Nyw4ICs5Niw2IEBACiAjd2FybmluZyBBQ1BJIHVzZXMgQ01QWENIRywgaTQ4NiBhbmQgbGF0ZXIgaGFyZHdhcmUKICNlbmRpZgogCi1zdGF0aWMgaW50IGFjcGlfbWNmZ182NGJpdF9iYXNlX2FkZHIgX19pbml0ZGF0YSA9IEZBTFNFOwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdC10aW1lIENvbmZpZ3VyYXRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjAsNiArMTU3LDggQEAKIHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqcGNpX21tY2ZnX2NvbmZpZzsKIGludCBwY2lfbW1jZmdfY29uZmlnX251bTsKIAorc3RhdGljIGludCBhY3BpX21jZmdfNjRiaXRfYmFzZV9hZGRyIF9faW5pdGRhdGEgPSBGQUxTRTsKKwogc3RhdGljIGludCBfX2luaXQgYWNwaV9tY2ZnX29lbV9jaGVjayhzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICptY2ZnKQogewogCWlmICghc3RyY21wKG1jZmctPmhlYWRlci5vZW1faWQsICJTR0kiKSkKQEAgLTI1MywxMCArMjUyLDggQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIENPTkZJR19YODZfMzIKIAlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkICE9IC0xVSkKIAkJdmVyID0gYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF07Ci0jZW5kaWYKIAogCWdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaWQsIHZlcik7CiB9CkBAIC03NzUsMTEgKzc3Miw5IEBACiAKIAlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYWRkcmVzcyk7CiAJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9PSAtMVUpIHsKLQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkICA9IEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKTsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCAgPSByZWFkX2FwaWNfaWQoKTsKIAkJYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0gPQogCQkJIEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7Ci0jZW5kaWYKIAl9CiB9CiAKQEAgLTEzNTEsNyArMTM0Niw5IEBACiAJCQkJYWNwaV9pb2FwaWMgPSAxOwogCiAJCQkJc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCQkJCXNldHVwX2FwaWNfcm91dGluZygpOworI2VuZGlmCiAJCQl9CiAJCX0KIAkJaWYgKGVycm9yID09IC1FSU5WQUwpIHsKQEAgLTE0MjEsOCArMTQxOCwxNiBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBkbWlfaWdub3JlX2lycTBfdGltZXJfb3ZlcnJpZGUoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCiB7Ci0JcHJfbm90aWNlKCIlcyBkZXRlY3RlZDogSWdub3JpbmcgQklPUyBJUlEwIHBpbjIgb3ZlcnJpZGVcbiIsIGQtPmlkZW50KTsKLQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOworCS8qCisJICogVGhlIGF0aV9peHA0eDBfcmV2KCkgZWFybHkgUENJIHF1aXJrIHNob3VsZCBoYXZlIHNldAorCSAqIHRoZSBhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgZmxhZyBhbHJlYWR5OgorCSAqLworCWlmICghYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlKSB7CisJCVdBUk4oMSwgS0VSTl9FUlIgImF0aV9peHA0eDAgcXVpcmsgbm90IGNvbXBsZXRlLlxuIik7CisJCXByX25vdGljZSgiJXMgZGV0ZWN0ZWQ6IElnbm9yaW5nIEJJT1MgSVJRMCBwaW4yIG92ZXJyaWRlXG4iLAorCQkJZC0+aWRlbnQpOworCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYwNSw2ICsxNjEwLDE0IEBACiAJICovCiAJewogCSAuY2FsbGJhY2sgPSBkbWlfaWdub3JlX2lycTBfdGltZXJfb3ZlcnJpZGUsCisJIC5pZGVudCA9ICJIUCBueDYxMTUgbGFwdG9wIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIUCBDb21wYXEgbng2MTE1IiksCisJCSAgICAgfSwKKwkgfSwKKwl7CisJIC5jYWxsYmFjayA9IGRtaV9pZ25vcmVfaXJxMF90aW1lcl9vdmVycmlkZSwKIAkgLmlkZW50ID0gIkhQIE5YNjEyNSBsYXB0b3AiLAogCSAubWF0Y2hlcyA9IHsKIAkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKQEAgLTE2MTksNiArMTYzMiwxNCBAQAogCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgQ29tcGFxIG54NjMyNSIpLAogCQkgICAgIH0sCiAJIH0sCisJeworCSAuY2FsbGJhY2sgPSBkbWlfaWdub3JlX2lycTBfdGltZXJfb3ZlcnJpZGUsCisJIC5pZGVudCA9ICJIUCA2NzE1YiBsYXB0b3AiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIENvbXBhcSA2NzE1YiIpLAorCQkgICAgIH0sCisJIH0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKaW5kZXggMjc2M2NiMy4uYTg0YWM3YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTE0NSwzNSArMTQ1LDI1IEBACiBleHRlcm4gY2hhciBfX3ZzeXNjYWxsXzA7CiBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCAqZmluZF9ub3BfdGFibGUodm9pZCkKIHsKLQlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwKLQkgICAgICAgYm9vdF9jcHVfZGF0YS54ODYgPCA2ID8gazhfbm9wcyA6IHA2X25vcHM7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICYmCisJICAgIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9OT1BMKSkKKwkJcmV0dXJuIHA2X25vcHM7CisJZWxzZQorCQlyZXR1cm4gazhfbm9wczsKIH0KIAogI2Vsc2UgLyogQ09ORklHX1g4Nl82NCAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcCB7Ci0JaW50IGNwdWlkOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0ICpub3B0YWJsZTsKLX0gbm9wdHlwZXNbXSA9IHsKLQl7IFg4Nl9GRUFUVVJFX0s4LCBrOF9ub3BzIH0sCi0JeyBYODZfRkVBVFVSRV9LNywgazdfbm9wcyB9LAotCXsgWDg2X0ZFQVRVUkVfUDQsIHA2X25vcHMgfSwKLQl7IFg4Nl9GRUFUVVJFX1AzLCBwNl9ub3BzIH0sCi0JeyAtMSwgTlVMTCB9Ci19OwotCiBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCAqZmluZF9ub3BfdGFibGUodm9pZCkKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCAqbm9wdGFibGUgPSBpbnRlbF9ub3BzOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgbm9wdHlwZXNbaV0uY3B1aWQgPj0gMDsgaSsrKSB7Ci0JCWlmIChib290X2NwdV9oYXMobm9wdHlwZXNbaV0uY3B1aWQpKSB7Ci0JCQlub3B0YWJsZSA9IG5vcHR5cGVzW2ldLm5vcHRhYmxlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5vcHRhYmxlOworCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSzgpKQorCQlyZXR1cm4gazhfbm9wczsKKwllbHNlIGlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSzcpKQorCQlyZXR1cm4gazdfbm9wczsKKwllbHNlIGlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTk9QTCkpCisJCXJldHVybiBwNl9ub3BzOworCWVsc2UKKwkJcmV0dXJuIGludGVsX25vcHM7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCkBAIC0yNDEsMjUgKzIzMSwyNSBAQAogCQkJY29udGludWU7CiAJCWlmICgqcHRyID4gdGV4dF9lbmQpCiAJCQljb250aW51ZTsKLQkJdGV4dF9wb2tlKCpwdHIsICgodW5zaWduZWQgY2hhciBbXSl7MHhmMH0pLCAxKTsgLyogYWRkIGxvY2sgcHJlZml4ICovCisJCS8qIHR1cm4gRFMgc2VnbWVudCBvdmVycmlkZSBwcmVmaXggaW50byBsb2NrIHByZWZpeCAqLworCQl0ZXh0X3Bva2UoKnB0ciwgKCh1bnNpZ25lZCBjaGFyIFtdKXsweGYwfSksIDEpOwogCX07CiB9CiAKIHN0YXRpYyB2b2lkIGFsdGVybmF0aXZlc19zbXBfdW5sb2NrKHU4ICoqc3RhcnQsIHU4ICoqZW5kLCB1OCAqdGV4dCwgdTggKnRleHRfZW5kKQogewogCXU4ICoqcHRyOwotCWNoYXIgaW5zblsxXTsKIAogCWlmIChub3JlcGxhY2Vfc21wKQogCQlyZXR1cm47CiAKLQlhZGRfbm9wcyhpbnNuLCAxKTsKIAlmb3IgKHB0ciA9IHN0YXJ0OyBwdHIgPCBlbmQ7IHB0cisrKSB7CiAJCWlmICgqcHRyIDwgdGV4dCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKnB0ciA+IHRleHRfZW5kKQogCQkJY29udGludWU7Ci0JCXRleHRfcG9rZSgqcHRyLCBpbnNuLCAxKTsKKwkJLyogdHVybiBsb2NrIHByZWZpeCBpbnRvIERTIHNlZ21lbnQgb3ZlcnJpZGUgcHJlZml4ICovCisJCXRleHRfcG9rZSgqcHRyLCAoKHVuc2lnbmVkIGNoYXIgW10pezB4M0V9KSwgMSk7CiAJfTsKIH0KIApAQCAtNDU0LDcgKzQ0NCw3IEBACiAJCQkJCSAgICBfdGV4dCwgX2V0ZXh0KTsKIAogCQkvKiBPbmx5IHN3aXRjaCB0byBVUCBtb2RlIGlmIHdlIGRvbid0IGltbWVkaWF0ZWx5IGJvb3Qgb3RoZXJzICovCi0JCWlmIChudW1fcG9zc2libGVfY3B1cygpID09IDEgfHwgc2V0dXBfbWF4X2NwdXMgPD0gMSkKKwkJaWYgKG51bV9wcmVzZW50X2NwdXMoKSA9PSAxIHx8IHNldHVwX21heF9jcHVzIDw9IDEpCiAJCQlhbHRlcm5hdGl2ZXNfc21wX3N3aXRjaCgwKTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwppbmRleCA2OWI0ZDA2Li5hOGZkOWViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCkBAIC0zMyw2ICszMywxMCBAQAogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhhbWRfaW9tbXVfZGV2dGFibGVfbG9jayk7CiAKKy8qIEEgbGlzdCBvZiBwcmVhbGxvY2F0ZWQgcHJvdGVjdGlvbiBkb21haW5zICovCitzdGF0aWMgTElTVF9IRUFEKGlvbW11X3BkX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpb21tdV9wZF9saXN0X2xvY2spOworCiAvKgogICogZ2VuZXJhbCBzdHJ1Y3QgdG8gbWFuYWdlIGNvbW1hbmRzIHNlbmQgdG8gYW4gSU9NTVUKICAqLwpAQCAtNTEsNiArNTUsMTAyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogSW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBpb21tdV9wcmludF9ldmVudCh2b2lkICpfX2V2dCkKK3sKKwl1MzIgKmV2ZW50ID0gX19ldnQ7CisJaW50IHR5cGUgID0gKGV2ZW50WzFdID4+IEVWRU5UX1RZUEVfU0hJRlQpICAmIEVWRU5UX1RZUEVfTUFTSzsKKwlpbnQgZGV2aWQgPSAoZXZlbnRbMF0gPj4gRVZFTlRfREVWSURfU0hJRlQpICYgRVZFTlRfREVWSURfTUFTSzsKKwlpbnQgZG9taWQgPSAoZXZlbnRbMV0gPj4gRVZFTlRfRE9NSURfU0hJRlQpICYgRVZFTlRfRE9NSURfTUFTSzsKKwlpbnQgZmxhZ3MgPSAoZXZlbnRbMV0gPj4gRVZFTlRfRkxBR1NfU0hJRlQpICYgRVZFTlRfRkxBR1NfTUFTSzsKKwl1NjQgYWRkcmVzcyA9ICh1NjQpKCgodTY0KWV2ZW50WzNdKSA8PCAzMikgfCBldmVudFsyXTsKKworCXByaW50ayhLRVJOX0VSUiAiQU1EIElPTU1VOiBFdmVudCBsb2dnZWQgWyIpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFVkVOVF9UWVBFX0lMTF9ERVY6CisJCXByaW50aygiSUxMRUdBTF9ERVZfVEFCTEVfRU5UUlkgZGV2aWNlPSUwMng6JTAyeC4leCAiCisJCSAgICAgICAiYWRkcmVzcz0weCUwMTZsbHggZmxhZ3M9MHglMDR4XVxuIiwKKwkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKKwkJICAgICAgIGFkZHJlc3MsIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9UWVBFX0lPX0ZBVUxUOgorCQlwcmludGsoIklPX1BBR0VfRkFVTFQgZGV2aWNlPSUwMng6JTAyeC4leCAiCisJCSAgICAgICAiZG9tYWluPTB4JTA0eCBhZGRyZXNzPTB4JTAxNmxseCBmbGFncz0weCUwNHhdXG4iLAorCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAorCQkgICAgICAgZG9taWQsIGFkZHJlc3MsIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9UWVBFX0RFVl9UQUJfRVJSOgorCQlwcmludGsoIkRFVl9UQUJfSEFSRFdBUkVfRVJST1IgZGV2aWNlPSUwMng6JTAyeC4leCAiCisJCSAgICAgICAiYWRkcmVzcz0weCUwMTZsbHggZmxhZ3M9MHglMDR4XVxuIiwKKwkJICAgICAgIFBDSV9CVVMoZGV2aWQpLCBQQ0lfU0xPVChkZXZpZCksIFBDSV9GVU5DKGRldmlkKSwKKwkJICAgICAgIGFkZHJlc3MsIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9UWVBFX1BBR0VfVEFCX0VSUjoKKwkJcHJpbnRrKCJQQUdFX1RBQl9IQVJEV0FSRV9FUlJPUiBkZXZpY2U9JTAyeDolMDJ4LiV4ICIKKwkJICAgICAgICJkb21haW49MHglMDR4IGFkZHJlc3M9MHglMDE2bGx4IGZsYWdzPTB4JTA0eF1cbiIsCisJCSAgICAgICBQQ0lfQlVTKGRldmlkKSwgUENJX1NMT1QoZGV2aWQpLCBQQ0lfRlVOQyhkZXZpZCksCisJCSAgICAgICBkb21pZCwgYWRkcmVzcywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIEVWRU5UX1RZUEVfSUxMX0NNRDoKKwkJcHJpbnRrKCJJTExFR0FMX0NPTU1BTkRfRVJST1IgYWRkcmVzcz0weCUwMTZsbHhdXG4iLCBhZGRyZXNzKTsKKwkJYnJlYWs7CisJY2FzZSBFVkVOVF9UWVBFX0NNRF9IQVJEX0VSUjoKKwkJcHJpbnRrKCJDT01NQU5EX0hBUkRXQVJFX0VSUk9SIGFkZHJlc3M9MHglMDE2bGx4ICIKKwkJICAgICAgICJmbGFncz0weCUwNHhdXG4iLCBhZGRyZXNzLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgRVZFTlRfVFlQRV9JT1RMQl9JTlZfVE86CisJCXByaW50aygiSU9UTEJfSU5WX1RJTUVPVVQgZGV2aWNlPSUwMng6JTAyeC4leCAiCisJCSAgICAgICAiYWRkcmVzcz0weCUwMTZsbHhdXG4iLAorCQkgICAgICAgUENJX0JVUyhkZXZpZCksIFBDSV9TTE9UKGRldmlkKSwgUENJX0ZVTkMoZGV2aWQpLAorCQkgICAgICAgYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgRVZFTlRfVFlQRV9JTlZfREVWX1JFUToKKwkJcHJpbnRrKCJJTlZBTElEX0RFVklDRV9SRVFVRVNUIGRldmljZT0lMDJ4OiUwMnguJXggIgorCQkgICAgICAgImFkZHJlc3M9MHglMDE2bGx4IGZsYWdzPTB4JTA0eF1cbiIsCisJCSAgICAgICBQQ0lfQlVTKGRldmlkKSwgUENJX1NMT1QoZGV2aWQpLCBQQ0lfRlVOQyhkZXZpZCksCisJCSAgICAgICBhZGRyZXNzLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiVU5LTk9XTiB0eXBlPTB4JTAyeF1cbiIsIHR5cGUpOworCX0KK30KKworc3RhdGljIHZvaWQgaW9tbXVfcG9sbF9ldmVudHMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTMyIGhlYWQsIHRhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaGVhZCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9IRUFEX09GRlNFVCk7CisJdGFpbCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0VWVF9UQUlMX09GRlNFVCk7CisKKwl3aGlsZSAoaGVhZCAhPSB0YWlsKSB7CisJCWlvbW11X3ByaW50X2V2ZW50KGlvbW11LT5ldnRfYnVmICsgaGVhZCk7CisJCWhlYWQgPSAoaGVhZCArIEVWRU5UX0VOVFJZX1NJWkUpICUgaW9tbXUtPmV2dF9idWZfc2l6ZTsKKwl9CisKKwl3cml0ZWwoaGVhZCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX0hFQURfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Cit9CisKK2lycXJldHVybl90IGFtZF9pb21tdV9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpb21tdSwgJmFtZF9pb21tdV9saXN0LCBsaXN0KQorCQlpb21tdV9wb2xsX2V2ZW50cyhpb21tdSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogSU9NTVUgY29tbWFuZCBxdWV1aW5nIGZ1bmN0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAxLDEwICsyMDEsMTAgQEAKICAqLwogc3RhdGljIGludCBpb21tdV9jb21wbGV0aW9uX3dhaXQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JaW50IHJldCwgcmVhZHkgPSAwOworCWludCByZXQgPSAwLCByZWFkeSA9IDA7CiAJdW5zaWduZWQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgaW9tbXVfY21kIGNtZDsKLQl1bnNpZ25lZCBsb25nIGkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGkgPSAwOwogCiAJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAljbWQuZGF0YVswXSA9IENNRF9DT01QTF9XQUlUX0lOVF9NQVNLOwpAQCAtMTEyLDEwICsyMTIsMTIgQEAKIAogCWlvbW11LT5uZWVkX3N5bmMgPSAwOwogCi0JcmV0ID0gaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBfX2lvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOwogCiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAKIAl3aGlsZSAoIXJlYWR5ICYmIChpIDwgRVhJVF9MT09QX0NPVU5UKSkgewogCQkrK2k7CkBAIC0xMzAsNiArMjMyLDggQEAKIAogCWlmICh1bmxpa2VseSgoaSA9PSBFWElUX0xPT1BfQ09VTlQpICYmIHByaW50a19yYXRlbGltaXQoKSkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFNRCBJT01NVTogQ29tcGxldGlvbiB3YWl0IGxvb3AgZmFpbGVkXG4iKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDAsNiArMjQ0LDcgQEAKIHN0YXRpYyBpbnQgaW9tbXVfcXVldWVfaW52X2Rldl9lbnRyeShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTE2IGRldmlkKQogewogCXN0cnVjdCBpb21tdV9jbWQgY21kOworCWludCByZXQ7CiAKIAlCVUdfT04oaW9tbXUgPT0gTlVMTCk7CiAKQEAgLTE0Nyw5ICsyNTIsMTEgQEAKIAlDTURfU0VUX1RZUEUoJmNtZCwgQ01EX0lOVl9ERVZfRU5UUlkpOwogCWNtZC5kYXRhWzBdID0gZGV2aWQ7CiAKKwlyZXQgPSBpb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKKwogCWlvbW11LT5uZWVkX3N5bmMgPSAxOwogCi0JcmV0dXJuIGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xNTksNiArMjY2LDcgQEAKIAkJdTY0IGFkZHJlc3MsIHUxNiBkb21pZCwgaW50IHBkZSwgaW50IHMpCiB7CiAJc3RydWN0IGlvbW11X2NtZCBjbWQ7CisJaW50IHJldDsKIAogCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAJYWRkcmVzcyAmPSBQQUdFX01BU0s7CkBAIC0xNzEsOSArMjc5LDExIEBACiAJaWYgKHBkZSkgLyogUERFIGJpdCAtIHdlIHdhbid0IGZsdXNoIGV2ZXJ5dGhpbmcgbm90IG9ubHkgdGhlIFBURXMgKi8KIAkJY21kLmRhdGFbMl0gfD0gQ01EX0lOVl9JT01NVV9QQUdFU19QREVfTUFTSzsKIAorCXJldCA9IGlvbW11X3F1ZXVlX2NvbW1hbmQoaW9tbXUsICZjbWQpOworCiAJaW9tbXUtPm5lZWRfc3luYyA9IDE7CiAKLQlyZXR1cm4gaW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTE4NSw3ICsyOTUsNyBAQAogCQl1NjQgYWRkcmVzcywgc2l6ZV90IHNpemUpCiB7CiAJaW50IHMgPSAwOwotCXVuc2lnbmVkIHBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHJlc3MsIHNpemUpOworCXVuc2lnbmVkIHBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGFkZHJlc3MsIHNpemUsIFBBR0VfU0laRSk7CiAKIAlhZGRyZXNzICY9IFBBR0VfTUFTSzsKIApAQCAtMjAzLDYgKzMxMywxNCBAQAogCXJldHVybiAwOwogfQogCisvKiBGbHVzaCB0aGUgd2hvbGUgSU8vVExCIGZvciBhIGdpdmVuIHByb3RlY3Rpb24gZG9tYWluICovCitzdGF0aWMgdm9pZCBpb21tdV9mbHVzaF90bGIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHUxNiBkb21pZCkKK3sKKwl1NjQgYWRkcmVzcyA9IENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1M7CisKKwlpb21tdV9xdWV1ZV9pbnZfaW9tbXVfcGFnZXMoaW9tbXUsIGFkZHJlc3MsIGRvbWlkLCAwLCAxKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSB1c2VkIHRoZSBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgbWFwcGluZ3MgZm9yCkBAIC0zNjIsMTEgKzQ4MCw2IEBACiAgKiBlZmZpY2llbnQgYWxsb2NhdG9yLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX21hc2tfdG9fcGFnZXModW5zaWduZWQgbG9uZyBtYXNrKQotewotCXJldHVybiAobWFzayA+PiBQQUdFX1NISUZUKSArCi0JCShQQUdFX0FMSUdOKG1hc2sgJiB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUKTsKLX0KIAogLyoKICAqIFRoZSBhZGRyZXNzIGFsbG9jYXRvciBjb3JlIGZ1bmN0aW9uLgpAQCAtMzc1LDI1ICs0ODgsMzEgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX29wc19hbGxvY19hZGRyZXNzZXMoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBwYWdlcykKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcGFnZXMsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrLAorCQkJCQkgICAgIHU2NCBkbWFfbWFzaykKIHsKLQl1bnNpZ25lZCBsb25nIGxpbWl0ID0gZG1hX21hc2tfdG9fcGFnZXMoKmRldi0+ZG1hX21hc2spOworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZTsKIAogCWJvdW5kYXJ5X3NpemUgPSBBTElHTihkbWFfZ2V0X3NlZ19ib3VuZGFyeShkZXYpICsgMSwKIAkJCVBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKLQlsaW1pdCA9IGxpbWl0IDwgc2l6ZSA/IGxpbWl0IDogc2l6ZTsKKwlsaW1pdCA9IGlvbW11X2RldmljZV9tYXhfaW5kZXgoZG9tLT5hcGVydHVyZV9zaXplID4+IFBBR0VfU0hJRlQsIDAsCisJCQkJICAgICAgIGRtYV9tYXNrID4+IFBBR0VfU0hJRlQpOwogCi0JaWYgKGRvbS0+bmV4dF9iaXQgPj0gbGltaXQpCisJaWYgKGRvbS0+bmV4dF9iaXQgPj0gbGltaXQpIHsKIAkJZG9tLT5uZXh0X2JpdCA9IDA7CisJCWRvbS0+bmVlZF9mbHVzaCA9IHRydWU7CisJfQogCiAJYWRkcmVzcyA9IGlvbW11X2FyZWFfYWxsb2MoZG9tLT5iaXRtYXAsIGxpbWl0LCBkb20tPm5leHRfYml0LCBwYWdlcywKLQkJCTAgLCBib3VuZGFyeV9zaXplLCAwKTsKLQlpZiAoYWRkcmVzcyA9PSAtMSkKKwkJCQkgICAwICwgYm91bmRhcnlfc2l6ZSwgYWxpZ25fbWFzayk7CisJaWYgKGFkZHJlc3MgPT0gLTEpIHsKIAkJYWRkcmVzcyA9IGlvbW11X2FyZWFfYWxsb2MoZG9tLT5iaXRtYXAsIGxpbWl0LCAwLCBwYWdlcywKLQkJCQkwLCBib3VuZGFyeV9zaXplLCAwKTsKKwkJCQkwLCBib3VuZGFyeV9zaXplLCBhbGlnbl9tYXNrKTsKKwkJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKKwl9CiAKIAlpZiAobGlrZWx5KGFkZHJlc3MgIT0gLTEpKSB7CiAJCWRvbS0+bmV4dF9iaXQgPSBhZGRyZXNzICsgcGFnZXM7CkBAIC00NTksNyArNTc4LDcgQEAKIAlpZiAoc3RhcnRfcGFnZSArIHBhZ2VzID4gbGFzdF9wYWdlKQogCQlwYWdlcyA9IGxhc3RfcGFnZSAtIHN0YXJ0X3BhZ2U7CiAKLQlzZXRfYml0X3N0cmluZyhkb20tPmJpdG1hcCwgc3RhcnRfcGFnZSwgcGFnZXMpOworCWlvbW11X2FyZWFfcmVzZXJ2ZShkb20tPmJpdG1hcCwgc3RhcnRfcGFnZSwgcGFnZXMpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfb3BzX2ZyZWVfcGFnZXRhYmxlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbSkKQEAgLTU1MywxMiArNjcyLDE2IEBACiAJZG1hX2RvbS0+Yml0bWFwWzBdID0gMTsKIAlkbWFfZG9tLT5uZXh0X2JpdCA9IDA7CiAKKwlkbWFfZG9tLT5uZWVkX2ZsdXNoID0gZmFsc2U7CisJZG1hX2RvbS0+dGFyZ2V0X2RldiA9IDB4ZmZmZjsKKwogCS8qIEludGlhbGl6ZSB0aGUgZXhjbHVzaW9uIHJhbmdlIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYmCiAJICAgIGlvbW11LT5leGNsdXNpb25fc3RhcnQgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRwYWdlID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA+PiBQQUdFX1NISUZUOwogCQlpbnQgcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCwKLQkJCQkJICAgIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoKTsKKwkJCQkJICAgIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoLAorCQkJCQkgICAgUEFHRV9TSVpFKTsKIAkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBzdGFydHBhZ2UsIHBhZ2VzKTsKIAl9CiAKQEAgLTYyMywxMiArNzQ2LDEzIEBACiAKIAl1NjQgcHRlX3Jvb3QgPSB2aXJ0X3RvX3BoeXMoZG9tYWluLT5wdF9yb290KTsKIAotCXB0ZV9yb290IHw9IChkb21haW4tPm1vZGUgJiAweDA3KSA8PCA5OwotCXB0ZV9yb290IHw9IElPTU1VX1BURV9JUiB8IElPTU1VX1BURV9JVyB8IElPTU1VX1BURV9QIHwgMjsKKwlwdGVfcm9vdCB8PSAoZG9tYWluLT5tb2RlICYgREVWX0VOVFJZX01PREVfTUFTSykKKwkJICAgIDw8IERFVl9FTlRSWV9NT0RFX1NISUZUOworCXB0ZV9yb290IHw9IElPTU1VX1BURV9JUiB8IElPTU1VX1BURV9JVyB8IElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX1RWOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZhbWRfaW9tbXVfZGV2dGFibGVfbG9jaywgZmxhZ3MpOwotCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMF0gPSBwdGVfcm9vdDsKLQlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzFdID0gcHRlX3Jvb3QgPj4gMzI7CisJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVswXSA9IGxvd2VyXzMyX2JpdHMocHRlX3Jvb3QpOworCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMV0gPSB1cHBlcl8zMl9iaXRzKHB0ZV9yb290KTsKIAlhbWRfaW9tbXVfZGV2X3RhYmxlW2RldmlkXS5kYXRhWzJdID0gZG9tYWluLT5pZDsKIAogCWFtZF9pb21tdV9wZF90YWJsZVtkZXZpZF0gPSBkb21haW47CkBAIC02NDYsNiArNzcwLDQ1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZHJpdmVyIGdvdCBhIHZhbGlkIGRldmljZSBmcm9tIHRoZSBjYWxsZXIgdG8KKyAqIGF2b2lkIGRlcmVmZXJlbmNpbmcgaW52YWxpZCBwb2ludGVycy4KKyAqLworc3RhdGljIGJvb2wgY2hlY2tfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldiB8fCAhZGV2LT5kbWFfbWFzaykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBJbiB0aGlzIGZ1bmN0aW9uIHRoZSBsaXN0IG9mIHByZWFsbG9jYXRlZCBwcm90ZWN0aW9uIGRvbWFpbnMgaXMgdHJhdmVyc2VkIHRvCisgKiBmaW5kIHRoZSBkb21haW4gZm9yIGEgc3BlY2lmaWMgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmZpbmRfcHJvdGVjdGlvbl9kb21haW4odTE2IGRldmlkKQoreworCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZW50cnksICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlzdF9lbXB0eSgmaW9tbXVfcGRfbGlzdCkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11X3BkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmlvbW11X3BkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT50YXJnZXRfZGV2ID09IGRldmlkKSB7CisJCQlyZXQgPSBlbnRyeTsKKwkJCWxpc3RfZGVsKCZyZXQtPmxpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdV9wZF9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBJbiB0aGUgZG1hX29wcyBwYXRoIHdlIG9ubHkgaGF2ZSB0aGUgc3RydWN0IGRldmljZS4gVGhpcyBmdW5jdGlvbgogICogZmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgSU9NTVUsIHRoZSBwcm90ZWN0aW9uIGRvbWFpbiBhbmQgdGhlCiAgKiByZXF1ZXN0b3IgaWQgZm9yIGEgZ2l2ZW4gZGV2aWNlLgpAQCAtNjYxLDI3ICs4MjQsMzAgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwogCXUxNiBfYmRmOwogCi0JQlVHX09OKCFkZXYgfHwgZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSB8fCAhZGV2LT5kbWFfbWFzayk7CisJKmlvbW11ID0gTlVMTDsKKwkqZG9tYWluID0gTlVMTDsKKwkqYmRmID0gMHhmZmZmOworCisJaWYgKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiAwOwogCiAJcGNpZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCV9iZGYgPSBjYWxjX2RldmlkKHBjaWRldi0+YnVzLT5udW1iZXIsIHBjaWRldi0+ZGV2Zm4pOwogCiAJLyogZGV2aWNlIG5vdCB0cmFuc2xhdGVkIGJ5IGFueSBJT01NVSBpbiB0aGUgc3lzdGVtPyAqLwotCWlmIChfYmRmID4gYW1kX2lvbW11X2xhc3RfYmRmKSB7Ci0JCSppb21tdSA9IE5VTEw7Ci0JCSpkb21haW4gPSBOVUxMOwotCQkqYmRmID0gMHhmZmZmOworCWlmIChfYmRmID4gYW1kX2lvbW11X2xhc3RfYmRmKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkqYmRmID0gYW1kX2lvbW11X2FsaWFzX3RhYmxlW19iZGZdOwogCiAJKmlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbKmJkZl07CiAJaWYgKCppb21tdSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlkbWFfZG9tID0gKCppb21tdSktPmRlZmF1bHRfZG9tOwogCSpkb21haW4gPSBkb21haW5fZm9yX2RldmljZSgqYmRmKTsKIAlpZiAoKmRvbWFpbiA9PSBOVUxMKSB7CisJCWRtYV9kb20gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKCpiZGYpOworCQlpZiAoIWRtYV9kb20pCisJCQlkbWFfZG9tID0gKCppb21tdSktPmRlZmF1bHRfZG9tOwogCQkqZG9tYWluID0gJmRtYV9kb20tPmRvbWFpbjsKIAkJc2V0X2RldmljZV9kb21haW4oKmlvbW11LCAqZG9tYWluLCAqYmRmKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiBVc2luZyBwcm90ZWN0aW9uIGRvbWFpbiAlZCBmb3IgIgpAQCAtNzYwLDE3ICs5MjYsMjQgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCiAJCQkgICAgICAgcGh5c19hZGRyX3QgcGFkZHIsCiAJCQkgICAgICAgc2l6ZV90IHNpemUsCi0JCQkgICAgICAgaW50IGRpcikKKwkJCSAgICAgICBpbnQgZGlyLAorCQkJICAgICAgIGJvb2wgYWxpZ24sCisJCQkgICAgICAgdTY0IGRtYV9tYXNrKQogewogCWRtYV9hZGRyX3Qgb2Zmc2V0ID0gcGFkZHIgJiB+UEFHRV9NQVNLOwogCWRtYV9hZGRyX3QgYWRkcmVzcywgc3RhcnQ7CiAJdW5zaWduZWQgaW50IHBhZ2VzOworCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzayA9IDA7CiAJaW50IGk7CiAKLQlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhwYWRkciwgc2l6ZSk7CisJcGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGFkZHIsIHNpemUsIFBBR0VfU0laRSk7CiAJcGFkZHIgJj0gUEFHRV9NQVNLOwogCi0JYWRkcmVzcyA9IGRtYV9vcHNfYWxsb2NfYWRkcmVzc2VzKGRldiwgZG1hX2RvbSwgcGFnZXMpOworCWlmIChhbGlnbikKKwkJYWxpZ25fbWFzayA9ICgxVUwgPDwgZ2V0X29yZGVyKHNpemUpKSAtIDE7CisKKwlhZGRyZXNzID0gZG1hX29wc19hbGxvY19hZGRyZXNzZXMoZGV2LCBkbWFfZG9tLCBwYWdlcywgYWxpZ25fbWFzaywKKwkJCQkJICBkbWFfbWFzayk7CiAJaWYgKHVubGlrZWx5KGFkZHJlc3MgPT0gYmFkX2RtYV9hZGRyZXNzKSkKIAkJZ290byBvdXQ7CiAKQEAgLTc4Miw2ICs5NTUsMTIgQEAKIAl9CiAJYWRkcmVzcyArPSBvZmZzZXQ7CiAKKwlpZiAodW5saWtlbHkoZG1hX2RvbS0+bmVlZF9mbHVzaCAmJiAhYW1kX2lvbW11X3VubWFwX2ZsdXNoKSkgeworCQlpb21tdV9mbHVzaF90bGIoaW9tbXUsIGRtYV9kb20tPmRvbWFpbi5pZCk7CisJCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGlvbW11X2hhc19ucGNhY2hlKGlvbW11KSkpCisJCWlvbW11X2ZsdXNoX3BhZ2VzKGlvbW11LCBkbWFfZG9tLT5kb21haW4uaWQsIGFkZHJlc3MsIHNpemUpOworCiBvdXQ6CiAJcmV0dXJuIGFkZHJlc3M7CiB9CkBAIC04MDIsNyArOTgxLDcgQEAKIAlpZiAoKGRtYV9hZGRyID09IDApIHx8IChkbWFfYWRkciArIHNpemUgPiBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSkKIAkJcmV0dXJuOwogCi0JcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2FkZHIsIHNpemUpOworCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9hZGRyLCBzaXplLCBQQUdFX1NJWkUpOwogCWRtYV9hZGRyICY9IFBBR0VfTUFTSzsKIAlzdGFydCA9IGRtYV9hZGRyOwogCkBAIC04MTIsNiArOTkxLDkgQEAKIAl9CiAKIAlkbWFfb3BzX2ZyZWVfYWRkcmVzc2VzKGRtYV9kb20sIGRtYV9hZGRyLCBwYWdlcyk7CisKKwlpZiAoYW1kX2lvbW11X3VubWFwX2ZsdXNoKQorCQlpb21tdV9mbHVzaF9wYWdlcyhpb21tdSwgZG1hX2RvbS0+ZG9tYWluLmlkLCBkbWFfYWRkciwgc2l6ZSk7CiB9CiAKIC8qCkBAIC04MjUsNiArMTAwNywxMiBAQAogCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwogCXUxNiBkZXZpZDsKIAlkbWFfYWRkcl90IGFkZHI7CisJdTY0IGRtYV9tYXNrOworCisJaWYgKCFjaGVja19kZXZpY2UoZGV2KSkKKwkJcmV0dXJuIGJhZF9kbWFfYWRkcmVzczsKKworCWRtYV9tYXNrID0gKmRldi0+ZG1hX21hc2s7CiAKIAlnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKTsKIApAQCAtODMzLDE0ICsxMDIxLDEyIEBACiAJCXJldHVybiAoZG1hX2FkZHJfdClwYWRkcjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKLQlhZGRyID0gX19tYXBfc2luZ2xlKGRldiwgaW9tbXUsIGRvbWFpbi0+cHJpdiwgcGFkZHIsIHNpemUsIGRpcik7CisJYWRkciA9IF9fbWFwX3NpbmdsZShkZXYsIGlvbW11LCBkb21haW4tPnByaXYsIHBhZGRyLCBzaXplLCBkaXIsIGZhbHNlLAorCQkJICAgIGRtYV9tYXNrKTsKIAlpZiAoYWRkciA9PSBiYWRfZG1hX2FkZHJlc3MpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGlvbW11X2hhc19ucGNhY2hlKGlvbW11KSkKLQkJaW9tbXVfZmx1c2hfcGFnZXMoaW9tbXUsIGRvbWFpbi0+aWQsIGFkZHIsIHNpemUpOwotCi0JaWYgKGlvbW11LT5uZWVkX3N5bmMpCisJaWYgKHVubGlrZWx5KGlvbW11LT5uZWVkX3N5bmMpKQogCQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogCiBvdXQ6CkBAIC04NjAsNyArMTA0Niw4IEBACiAJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47CiAJdTE2IGRldmlkOwogCi0JaWYgKCFnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKSkKKwlpZiAoIWNoZWNrX2RldmljZShkZXYpIHx8CisJICAgICFnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKSkKIAkJLyogZGV2aWNlIG5vdCBoYW5kbGVkIGJ5IGFueSBBTUQgSU9NTVUgKi8KIAkJcmV0dXJuOwogCkBAIC04NjgsOSArMTA1NSw3IEBACiAKIAlfX3VubWFwX3NpbmdsZShpb21tdSwgZG9tYWluLT5wcml2LCBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKIAotCWlvbW11X2ZsdXNoX3BhZ2VzKGlvbW11LCBkb21haW4tPmlkLCBkbWFfYWRkciwgc2l6ZSk7Ci0KLQlpZiAoaW9tbXUtPm5lZWRfc3luYykKKwlpZiAodW5saWtlbHkoaW9tbXUtPm5lZWRfc3luYykpCiAJCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKQEAgLTkwOSw2ICsxMDk0LDEyIEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwogCXBoeXNfYWRkcl90IHBhZGRyOwogCWludCBtYXBwZWRfZWxlbXMgPSAwOworCXU2NCBkbWFfbWFzazsKKworCWlmICghY2hlY2tfZGV2aWNlKGRldikpCisJCXJldHVybiAwOworCisJZG1hX21hc2sgPSAqZGV2LT5kbWFfbWFzazsKIAogCWdldF9kZXZpY2VfcmVzb3VyY2VzKGRldiwgJmlvbW11LCAmZG9tYWluLCAmZGV2aWQpOwogCkBAIC05MjEsMTkgKzExMTIsMTcgQEAKIAkJcGFkZHIgPSBzZ19waHlzKHMpOwogCiAJCXMtPmRtYV9hZGRyZXNzID0gX19tYXBfc2luZ2xlKGRldiwgaW9tbXUsIGRvbWFpbi0+cHJpdiwKLQkJCQkJICAgICAgcGFkZHIsIHMtPmxlbmd0aCwgZGlyKTsKKwkJCQkJICAgICAgcGFkZHIsIHMtPmxlbmd0aCwgZGlyLCBmYWxzZSwKKwkJCQkJICAgICAgZG1hX21hc2spOwogCiAJCWlmIChzLT5kbWFfYWRkcmVzcykgewogCQkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKIAkJCW1hcHBlZF9lbGVtcysrOwogCQl9IGVsc2UKIAkJCWdvdG8gdW5tYXA7Ci0JCWlmIChpb21tdV9oYXNfbnBjYWNoZShpb21tdSkpCi0JCQlpb21tdV9mbHVzaF9wYWdlcyhpb21tdSwgZG9tYWluLT5pZCwgcy0+ZG1hX2FkZHJlc3MsCi0JCQkJCSAgcy0+ZG1hX2xlbmd0aCk7CiAJfQogCi0JaWYgKGlvbW11LT5uZWVkX3N5bmMpCisJaWYgKHVubGlrZWx5KGlvbW11LT5uZWVkX3N5bmMpKQogCQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogCiBvdXQ6CkBAIC05NjcsNyArMTE1Niw4IEBACiAJdTE2IGRldmlkOwogCWludCBpOwogCi0JaWYgKCFnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKSkKKwlpZiAoIWNoZWNrX2RldmljZShkZXYpIHx8CisJICAgICFnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKSkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwpAQCAtOTc1LDEyICsxMTY1LDEwIEBACiAJZm9yX2VhY2hfc2coc2dsaXN0LCBzLCBuZWxlbXMsIGkpIHsKIAkJX191bm1hcF9zaW5nbGUoaW9tbXUsIGRvbWFpbi0+cHJpdiwgcy0+ZG1hX2FkZHJlc3MsCiAJCQkgICAgICAgcy0+ZG1hX2xlbmd0aCwgZGlyKTsKLQkJaW9tbXVfZmx1c2hfcGFnZXMoaW9tbXUsIGRvbWFpbi0+aWQsIHMtPmRtYV9hZGRyZXNzLAotCQkJCSAgcy0+ZG1hX2xlbmd0aCk7CiAJCXMtPmRtYV9hZGRyZXNzID0gcy0+ZG1hX2xlbmd0aCA9IDA7CiAJfQogCi0JaWYgKGlvbW11LT5uZWVkX3N5bmMpCisJaWYgKHVubGlrZWx5KGlvbW11LT5uZWVkX3N5bmMpKQogCQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CkBAIC05OTgsMjUgKzExODYsMzMgQEAKIAlzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbjsKIAl1MTYgZGV2aWQ7CiAJcGh5c19hZGRyX3QgcGFkZHI7CisJdTY0IGRtYV9tYXNrID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKIAorCWlmICghY2hlY2tfZGV2aWNlKGRldikpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFnZXRfZGV2aWNlX3Jlc291cmNlcyhkZXYsICZpb21tdSwgJmRvbWFpbiwgJmRldmlkKSkKKwkJZmxhZyAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9ETUEzMik7CisKKwlmbGFnIHw9IF9fR0ZQX1pFUk87CiAJdmlydF9hZGRyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7CiAJaWYgKCF2aXJ0X2FkZHIpCiAJCXJldHVybiAwOwogCi0JbWVtc2V0KHZpcnRfYWRkciwgMCwgc2l6ZSk7CiAJcGFkZHIgPSB2aXJ0X3RvX3BoeXModmlydF9hZGRyKTsKIAotCWdldF9kZXZpY2VfcmVzb3VyY2VzKGRldiwgJmlvbW11LCAmZG9tYWluLCAmZGV2aWQpOwotCiAJaWYgKCFpb21tdSB8fCAhZG9tYWluKSB7CiAJCSpkbWFfYWRkciA9IChkbWFfYWRkcl90KXBhZGRyOwogCQlyZXR1cm4gdmlydF9hZGRyOwogCX0KIAorCWlmICghZG1hX21hc2spCisJCWRtYV9tYXNrID0gKmRldi0+ZG1hX21hc2s7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CiAKIAkqZG1hX2FkZHIgPSBfX21hcF9zaW5nbGUoZGV2LCBpb21tdSwgZG9tYWluLT5wcml2LCBwYWRkciwKLQkJCQkgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCSBzaXplLCBETUFfQklESVJFQ1RJT05BTCwgdHJ1ZSwgZG1hX21hc2spOwogCiAJaWYgKCpkbWFfYWRkciA9PSBiYWRfZG1hX2FkZHJlc3MpIHsKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIsIGdldF9vcmRlcihzaXplKSk7CkBAIC0xMDI0LDEwICsxMjIwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGlvbW11X2hhc19ucGNhY2hlKGlvbW11KSkKLQkJaW9tbXVfZmx1c2hfcGFnZXMoaW9tbXUsIGRvbWFpbi0+aWQsICpkbWFfYWRkciwgc2l6ZSk7Ci0KLQlpZiAoaW9tbXUtPm5lZWRfc3luYykKKwlpZiAodW5saWtlbHkoaW9tbXUtPm5lZWRfc3luYykpCiAJCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiAKIG91dDoKQEAgLTEwMzgsOCArMTIzMSw2IEBACiAKIC8qCiAgKiBUaGUgZXhwb3J0ZWQgZnJlZV9jb2hlcmVudCBmdW5jdGlvbiBmb3IgZG1hX29wcy4KLSAqIEZJWE1FOiBmaXggdGhlIGdlbmVyaWMgeDg2IERNQSBsYXllciBzbyB0aGF0IGl0IGFjdHVhbGx5IGNhbGxzIHRoYXQKLSAqICAgICAgICBmdW5jdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCQkJICB2b2lkICp2aXJ0X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCkBAIC0xMDQ5LDYgKzEyNDAsOSBAQAogCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwogCXUxNiBkZXZpZDsKIAorCWlmICghY2hlY2tfZGV2aWNlKGRldikpCisJCXJldHVybjsKKwogCWdldF9kZXZpY2VfcmVzb3VyY2VzKGRldiwgJmlvbW11LCAmZG9tYWluLCAmZGV2aWQpOwogCiAJaWYgKCFpb21tdSB8fCAhZG9tYWluKQpAQCAtMTA1Nyw5ICsxMjUxLDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZG9tYWluLT5sb2NrLCBmbGFncyk7CiAKIAlfX3VubWFwX3NpbmdsZShpb21tdSwgZG9tYWluLT5wcml2LCBkbWFfYWRkciwgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOwotCWlvbW11X2ZsdXNoX3BhZ2VzKGlvbW11LCBkb21haW4tPmlkLCBkbWFfYWRkciwgc2l6ZSk7CiAKLQlpZiAoaW9tbXUtPm5lZWRfc3luYykKKwlpZiAodW5saWtlbHkoaW9tbXUtPm5lZWRfc3luYykpCiAJCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKQEAgLTEwNjksNiArMTI2MiwzMCBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIERNQSBsYXllciB0byBmaW5kIG91dCBpZiB3ZSBjYW4gaGFuZGxlIGEKKyAqIHBhcnRpY3VsYXIgZGV2aWNlLiBJdCBpcyBwYXJ0IG9mIHRoZSBkbWFfb3BzLgorICovCitzdGF0aWMgaW50IGFtZF9pb21tdV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJdTE2IGJkZjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCisJLyogTm8gZGV2aWNlIG9yIG5vIFBDSSBkZXZpY2UgKi8KKwlpZiAoIWRldiB8fCBkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKQorCQlyZXR1cm4gMDsKKworCXBjaWRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKworCWJkZiA9IGNhbGNfZGV2aWQocGNpZGV2LT5idXMtPm51bWJlciwgcGNpZGV2LT5kZXZmbik7CisKKwkvKiBPdXQgb2Ygb3VyIHNjb3BlPyAqLworCWlmIChiZGYgPiBhbWRfaW9tbXVfbGFzdF9iZGYpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCiAgKiBUaGUgZnVuY3Rpb24gZm9yIHByZS1hbGxvY2F0aW5nIHByb3RlY3Rpb24gZG9tYWlucy4KICAqCiAgKiBJZiB0aGUgZHJpdmVyIGNvcmUgaW5mb3JtcyB0aGUgRE1BIGxheWVyIGlmIGEgZHJpdmVyIGdyYWJzIGEgZGV2aWNlCkBAIC0xMDk3LDEwICsxMzE0LDkgQEAKIAkJaWYgKCFkbWFfZG9tKQogCQkJY29udGludWU7CiAJCWluaXRfdW5pdHlfbWFwcGluZ3NfZm9yX2RldmljZShkbWFfZG9tLCBkZXZpZCk7Ci0JCXNldF9kZXZpY2VfZG9tYWluKGlvbW11LCAmZG1hX2RvbS0+ZG9tYWluLCBkZXZpZCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogQWxsb2NhdGVkIGRvbWFpbiAlZCBmb3IgZGV2aWNlICIsCi0JCSAgICAgICBkbWFfZG9tLT5kb21haW4uaWQpOwotCQlwcmludF9kZXZpZChkZXZpZCwgMSk7CisJCWRtYV9kb20tPnRhcmdldF9kZXYgPSBkZXZpZDsKKworCQlsaXN0X2FkZF90YWlsKCZkbWFfZG9tLT5saXN0LCAmaW9tbXVfcGRfbGlzdCk7CiAJfQogfQogCkBAIC0xMTExLDYgKzEzMjcsNyBAQAogCS51bm1hcF9zaW5nbGUgPSB1bm1hcF9zaW5nbGUsCiAJLm1hcF9zZyA9IG1hcF9zZywKIAkudW5tYXBfc2cgPSB1bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZCA9IGFtZF9pb21tdV9kbWFfc3VwcG9ydGVkLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKaW5kZXggYTY5Y2MwZi4uNGNkODA4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KICNpbmNsdWRlIDxhc20vYW1kX2lvbW11X3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2FtZF9pb21tdS5oPgpAQCAtMzAsNyArMzIsNiBAQAogLyoKICAqIGRlZmluaXRpb25zIGZvciB0aGUgQUNQSSBzY2FubmluZyBjb2RlCiAgKi8KLSNkZWZpbmUgUENJX0JVUyh4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIElWUlNfSEVBREVSX0xFTkdUSCA0OAogCiAjZGVmaW5lIEFDUElfSVZIRF9UWVBFICAgICAgICAgICAgICAgICAgMHgxMApAQCAtMTIxLDYgKzEyMiw3IEBACiAJCQkJCSAgIHdlIGZpbmQgaW4gQUNQSSAqLwogdW5zaWduZWQgYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyID0gMjY7IC8qIHNpemUgb2YgYXBlcnR1cmUgaW4gcG93ZXIgb2YgMiAqLwogaW50IGFtZF9pb21tdV9pc29sYXRlOwkJCS8qIGlmIDEsIGRldmljZSBpc29sYXRpb24gaXMgZW5hYmxlZCAqLworYm9vbCBhbWRfaW9tbXVfdW5tYXBfZmx1c2g7CQkvKiBpZiB0cnVlLCBmbHVzaCBvbiBldmVyeSB1bm1hcCAqLwogCiBMSVNUX0hFQUQoYW1kX2lvbW11X2xpc3QpOwkJLyogbGlzdCBvZiBhbGwgQU1EIElPTU1VcyBpbiB0aGUKIAkJCQkJICAgc3lzdGVtICovCkBAIC0yMzQsNyArMjM2LDcgQEAKIHsKIAl1MzIgY3RybDsKIAotCWN0cmwgPSAodTY0KXJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKKwljdHJsID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ09OVFJPTF9PRkZTRVQpOwogCWN0cmwgJj0gfigxIDw8IGJpdCk7CiAJd3JpdGVsKGN0cmwsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NPTlRST0xfT0ZGU0VUKTsKIH0KQEAgLTI0MiwxMyArMjQ0LDIzIEBACiAvKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIGhhcmR3YXJlICovCiB2b2lkIF9faW5pdCBpb21tdV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiBFbmFibGluZyBJT01NVSBhdCAiKTsKLQlwcmludF9kZXZpZChpb21tdS0+ZGV2aWQsIDApOwotCXByaW50aygiIGNhcCAweCVoeFxuIiwgaW9tbXUtPmNhcF9wdHIpOworCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogRW5hYmxpbmcgSU9NTVUgIgorCSAgICAgICAiYXQgJTAyeDolMDJ4LiV4IGNhcCAweCVoeFxuIiwKKwkgICAgICAgaW9tbXUtPmRldi0+YnVzLT5udW1iZXIsCisJICAgICAgIFBDSV9TTE9UKGlvbW11LT5kZXYtPmRldmZuKSwKKwkgICAgICAgUENJX0ZVTkMoaW9tbXUtPmRldi0+ZGV2Zm4pLAorCSAgICAgICBpb21tdS0+Y2FwX3B0cik7CiAKIAlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9JT01NVV9FTik7CiB9CiAKKy8qIEZ1bmN0aW9uIHRvIGVuYWJsZSBJT01NVSBldmVudCBsb2dnaW5nIGFuZCBldmVudCBpbnRlcnJ1cHRzICovCit2b2lkIF9faW5pdCBpb21tdV9lbmFibGVfZXZlbnRfbG9nZ2luZyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfTE9HX0VOKTsKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfSU5UX0VOKTsKK30KKwogLyoKICAqIG1hcHBpbmcgYW5kIHVubWFwcGluZyBmdW5jdGlvbnMgZm9yIHRoZSBJT01NVSBNTUlPIHNwYWNlLiBFYWNoIEFNRCBJT01NVSBpbgogICogdGhlIHN5c3RlbSBoYXMgb25lLgpAQCAtMjg2LDYgKzI5OCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIGdpdmVuIElWSEQgZW50cnkKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXZoZF9lbnRyeV9sZW5ndGgodTggKml2aGQpCit7CisJcmV0dXJuIDB4MDQgPDwgKCppdmhkID4+IDYpOworfQorCisvKgogICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbGFzdCBkZXZpY2UgaWQgdGhlIElPTU1VIGhhcyB0byBoYW5kbGUgZnJvbSB0aGUgUENJCiAgKiBjYXBhYmlsaXR5IGhlYWRlciBmb3IgdGhpcyBJT01NVQogICovCkBAIC0zMjksNyArMzQ5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9Ci0JCXAgKz0gMHgwNCA8PCAoKnAgPj4gNik7CisJCXAgKz0gaXZoZF9lbnRyeV9sZW5ndGgocCk7CiAJfQogCiAJV0FSTl9PTihwICE9IGVuZCk7CkBAIC00MTQsNyArNDM0LDMyIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2NvbW1hbmRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9tbXUtPmNtZF9idWYsIGdldF9vcmRlcihDTURfQlVGRkVSX1NJWkUpKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvbW11LT5jbWRfYnVmLAorCQkgICBnZXRfb3JkZXIoaW9tbXUtPmNtZF9idWZfc2l6ZSkpOworfQorCisvKiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSB3aGVyZSB0aGUgSU9NTVUgd2lsbCBsb2cgaXRzIGV2ZW50cyB0byAqLworc3RhdGljIHU4ICogX19pbml0IGFsbG9jX2V2ZW50X2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1NjQgZW50cnk7CisJaW9tbXUtPmV2dF9idWYgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAorCQkJCQkJZ2V0X29yZGVyKEVWVF9CVUZGRVJfU0laRSkpOworCisJaWYgKGlvbW11LT5ldnRfYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZW50cnkgPSAodTY0KXZpcnRfdG9fcGh5cyhpb21tdS0+ZXZ0X2J1ZikgfCBFVlRfTEVOX01BU0s7CisJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX0JVRl9PRkZTRVQsCisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCisJaW9tbXUtPmV2dF9idWZfc2l6ZSA9IEVWVF9CVUZGRVJfU0laRTsKKworCXJldHVybiBpb21tdS0+ZXZ0X2J1ZjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfZXZlbnRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9tbXUtPmV2dF9idWYsIGdldF9vcmRlcihFVlRfQlVGRkVSX1NJWkUpKTsKIH0KIAogLyogc2V0cyBhIHNwZWNpZmljIGJpdCBpbiB0aGUgZGV2aWNlIHRhYmxlIGVudHJ5LiAqLwpAQCAtNDg3LDE5ICs1MzIsMjEgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGluaXRfaW9tbXVfZnJvbV9wY2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JaW50IGJ1cyA9IFBDSV9CVVMoaW9tbXUtPmRldmlkKTsKLQlpbnQgZGV2ID0gUENJX1NMT1QoaW9tbXUtPmRldmlkKTsKLQlpbnQgZm4gID0gUENJX0ZVTkMoaW9tbXUtPmRldmlkKTsKIAlpbnQgY2FwX3B0ciA9IGlvbW11LT5jYXBfcHRyOwotCXUzMiByYW5nZTsKKwl1MzIgcmFuZ2UsIG1pc2M7CiAKLQlpb21tdS0+Y2FwID0gcmVhZF9wY2lfY29uZmlnKGJ1cywgZGV2LCBmbiwgY2FwX3B0citNTUlPX0NBUF9IRFJfT0ZGU0VUKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW9tbXUtPmRldiwgY2FwX3B0ciArIE1NSU9fQ0FQX0hEUl9PRkZTRVQsCisJCQkgICAgICAmaW9tbXUtPmNhcCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGNhcF9wdHIgKyBNTUlPX1JBTkdFX09GRlNFVCwKKwkJCSAgICAgICZyYW5nZSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvbW11LT5kZXYsIGNhcF9wdHIgKyBNTUlPX01JU0NfT0ZGU0VULAorCQkJICAgICAgJm1pc2MpOwogCi0JcmFuZ2UgPSByZWFkX3BjaV9jb25maWcoYnVzLCBkZXYsIGZuLCBjYXBfcHRyK01NSU9fUkFOR0VfT0ZGU0VUKTsKIAlpb21tdS0+Zmlyc3RfZGV2aWNlID0gY2FsY19kZXZpZChNTUlPX0dFVF9CVVMocmFuZ2UpLAogCQkJCQkgTU1JT19HRVRfRkQocmFuZ2UpKTsKIAlpb21tdS0+bGFzdF9kZXZpY2UgPSBjYWxjX2RldmlkKE1NSU9fR0VUX0JVUyhyYW5nZSksCiAJCQkJCU1NSU9fR0VUX0xEKHJhbmdlKSk7CisJaW9tbXUtPmV2dF9tc2lfbnVtID0gTU1JT19NU0lfTlVNKG1pc2MpOwogfQogCiAvKgpAQCAtNjA0LDcgKzY1MSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXAgKz0gMHgwNCA8PCAoZS0+dHlwZSA+PiA2KTsKKwkJcCArPSBpdmhkX2VudHJ5X2xlbmd0aChwKTsKIAl9CiB9CiAKQEAgLTYyMiw2ICs2NjksNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGZyZWVfaW9tbXVfb25lKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCWZyZWVfY29tbWFuZF9idWZmZXIoaW9tbXUpOworCWZyZWVfZXZlbnRfYnVmZmVyKGlvbW11KTsKIAlpb21tdV91bm1hcF9tbWlvX3NwYWNlKGlvbW11KTsKIH0KIApAQCAtNjQ5LDggKzY5NywxMiBAQAogCS8qCiAJICogQ29weSBkYXRhIGZyb20gQUNQSSB0YWJsZSBlbnRyeSB0byB0aGUgaW9tbXUgc3RydWN0CiAJICovCi0JaW9tbXUtPmRldmlkID0gaC0+ZGV2aWQ7CisJaW9tbXUtPmRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KFBDSV9CVVMoaC0+ZGV2aWQpLCBoLT5kZXZpZCAmIDB4ZmYpOworCWlmICghaW9tbXUtPmRldikKKwkJcmV0dXJuIDE7CisKIAlpb21tdS0+Y2FwX3B0ciA9IGgtPmNhcF9wdHI7CisJaW9tbXUtPnBjaV9zZWcgPSBoLT5wY2lfc2VnOwogCWlvbW11LT5tbWlvX3BoeXMgPSBoLT5tbWlvX3BoeXM7CiAJaW9tbXUtPm1taW9fYmFzZSA9IGlvbW11X21hcF9tbWlvX3NwYWNlKGgtPm1taW9fcGh5cyk7CiAJaWYgKCFpb21tdS0+bW1pb19iYXNlKQpAQCAtNjYxLDExICs3MTMsMTcgQEAKIAlpZiAoIWlvbW11LT5jbWRfYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlvbW11LT5ldnRfYnVmID0gYWxsb2NfZXZlbnRfYnVmZmVyKGlvbW11KTsKKwlpZiAoIWlvbW11LT5ldnRfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlvbW11LT5pbnRfZW5hYmxlZCA9IGZhbHNlOworCiAJaW5pdF9pb21tdV9mcm9tX3BjaShpb21tdSk7CiAJaW5pdF9pb21tdV9mcm9tX2FjcGkoaW9tbXUsIGgpOwogCWluaXRfaW9tbXVfZGV2aWNlcyhpb21tdSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpX2VuYWJsZV9kZXZpY2UoaW9tbXUtPmRldik7CiB9CiAKIC8qCkBAIC03MDYsNiArNzY0LDk1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW5pdGlhbGl6ZSB0aGUgTVNJIGludGVycnVwdHMgZm9yIGFsbCBJT01NVXMKKyAqIGluIHRoZSBzeXN0ZW0uIEl0cyBhIGJpdCBjaGFsbGVuZ2luZyBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlCisgKiBJT01NVXMgcGVyIFBDSSBCREYgYnV0IHdlIGNhbiBjYWxsIHBjaV9lbmFibGVfbXNpKHgpIG9ubHkgb25jZSBwZXIKKyAqIHBjaV9kZXYuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IGlvbW11X3NldHVwX21zaXgoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IGFtZF9pb21tdSAqY3VycjsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzWzMyXTsgLyogb25seSAzMiBzdXBwb3J0ZWQgYnkgQU1EIElPTU1VICovCisJaW50IG52ZWMgPSAwLCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJyLCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cnItPmRldiA9PSBpb21tdS0+ZGV2KSB7CisJCQllbnRyaWVzW252ZWNdLmVudHJ5ID0gY3Vyci0+ZXZ0X21zaV9udW07CisJCQllbnRyaWVzW252ZWNdLnZlY3RvciA9IDA7CisJCQljdXJyLT5pbnRfZW5hYmxlZCA9IHRydWU7CisJCQludmVjKys7CisJCX0KKwl9CisKKwlpZiAocGNpX2VuYWJsZV9tc2l4KGlvbW11LT5kZXYsIGVudHJpZXMsIG52ZWMpKSB7CisJCXBjaV9kaXNhYmxlX21zaXgoaW9tbXUtPmRldik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudmVjOyArK2kpIHsKKwkJaW50IHIgPSByZXF1ZXN0X2lycShlbnRyaWVzLT52ZWN0b3IsIGFtZF9pb21tdV9pbnRfaGFuZGxlciwKKwkJCQkgICAgSVJRRl9TQU1QTEVfUkFORE9NLAorCQkJCSAgICAiQU1EIElPTU1VIiwKKwkJCQkgICAgTlVMTCk7CisJCWlmIChyKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJZm9yIChpIC09IDE7IGkgPj0gMDsgLS1pKQorCQlmcmVlX2lycShlbnRyaWVzLT52ZWN0b3IsIE5VTEwpOworCisJcGNpX2Rpc2FibGVfbXNpeChpb21tdS0+ZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpb21tdV9zZXR1cF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaW50IHI7CisJc3RydWN0IGFtZF9pb21tdSAqY3VycjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyciwgJmFtZF9pb21tdV9saXN0LCBsaXN0KSB7CisJCWlmIChjdXJyLT5kZXYgPT0gaW9tbXUtPmRldikKKwkJCWN1cnItPmludF9lbmFibGVkID0gdHJ1ZTsKKwl9CisKKworCWlmIChwY2lfZW5hYmxlX21zaShpb21tdS0+ZGV2KSkKKwkJcmV0dXJuIDE7CisKKwlyID0gcmVxdWVzdF9pcnEoaW9tbXUtPmRldi0+aXJxLCBhbWRfaW9tbXVfaW50X2hhbmRsZXIsCisJCQlJUlFGX1NBTVBMRV9SQU5ET00sCisJCQkiQU1EIElPTU1VIiwKKwkJCU5VTEwpOworCisJaWYgKHIpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGlvbW11LT5kZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9tbXVfaW5pdF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaWYgKGlvbW11LT5pbnRfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShpb21tdS0+ZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKQorCQlyZXR1cm4gaW9tbXVfc2V0dXBfbXNpeChpb21tdSk7CisJZWxzZSBpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShpb21tdS0+ZGV2LCBQQ0lfQ0FQX0lEX01TSSkpCisJCXJldHVybiBpb21tdV9zZXR1cF9tc2koaW9tbXUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogVGhlIG5leHQgZnVuY3Rpb25zIGJlbG9uZyB0byB0aGUgdGhpcmQgcGFzcyBvZiBwYXJzaW5nIHRoZSBBQ1BJCiAgKiB0YWJsZS4gSW4gdGhpcyBsYXN0IHBhc3MgdGhlIG1lbW9yeSBtYXBwaW5nIHJlcXVpcmVtZW50cyBhcmUKICAqIGdhdGhlcmVkIChsaWtlIGV4Y2x1c2lvbiBhbmQgdW5pdHkgbWFwcGluZyByZWFuZ2VzKS4KQEAgLTgxMSw3ICs5NTgsNiBAQAogCWZvciAoZGV2aWQgPSAwOyBkZXZpZCA8PSBhbWRfaW9tbXVfbGFzdF9iZGY7ICsrZGV2aWQpIHsKIAkJc2V0X2Rldl9lbnRyeV9iaXQoZGV2aWQsIERFVl9FTlRSWV9WQUxJRCk7CiAJCXNldF9kZXZfZW50cnlfYml0KGRldmlkLCBERVZfRU5UUllfVFJBTlNMQVRJT04pOwotCQlzZXRfZGV2X2VudHJ5X2JpdChkZXZpZCwgREVWX0VOVFJZX05PX1BBR0VfRkFVTFQpOwogCX0KIH0KIApAQCAtODI1LDYgKzk3MSw4IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKIAkJaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShpb21tdSk7CisJCWlvbW11X2luaXRfbXNpKGlvbW11KTsKKwkJaW9tbXVfZW5hYmxlX2V2ZW50X2xvZ2dpbmcoaW9tbXUpOwogCQlpb21tdV9lbmFibGUoaW9tbXUpOwogCX0KIH0KQEAgLTk5NSwxMSArMTE0MywxNyBAQAogCWVsc2UKIAkJcHJpbnRrKCJkaXNhYmxlZFxuIik7CiAKKwlpZiAoYW1kX2lvbW11X3VubWFwX2ZsdXNoKQorCQlwcmludGsoS0VSTl9JTkZPICJBTUQgSU9NTVU6IElPL1RMQiBmbHVzaCBvbiB1bm1hcCBlbmFibGVkXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogTGF6eSBJTy9UTEIgZmx1c2hpbmcgZW5hYmxlZFxuIik7CisKIG91dDoKIAlyZXR1cm4gcmV0OwogCiBmcmVlOgotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcCwgMSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwLAorCQkgICBnZXRfb3JkZXIoTUFYX0RPTUFJTl9JRC84KSk7CiAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFtZF9pb21tdV9wZF90YWJsZSwKIAkJICAgZ2V0X29yZGVyKHJsb29rdXBfdGFibGVfc2l6ZSkpOwpAQCAtMTA1Nyw4ICsxMjExLDEwIEBACiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfb3B0aW9ucyhjaGFyICpzdHIpCiB7CiAJZm9yICg7ICpzdHI7ICsrc3RyKSB7Ci0JCWlmIChzdHJjbXAoc3RyLCAiaXNvbGF0ZSIpID09IDApCisJCWlmIChzdHJuY21wKHN0ciwgImlzb2xhdGUiLCA3KSA9PSAwKQogCQkJYW1kX2lvbW11X2lzb2xhdGUgPSAxOworCQlpZiAoc3RybmNtcChzdHIsICJmdWxsZmx1c2giLCAxMSkgPT0gMCkKKwkJCWFtZF9pb21tdV91bm1hcF9mbHVzaCA9IHRydWU7CiAJfQogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCmluZGV4IDQ0ZTIxODIuLjlhMzJiMzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCkBAIC00NTUsMTEgKzQ1NSwxMSBAQAogCQkgICBmb3JjZV9pb21tdSB8fAogCQkgICB2YWxpZF9hZ3AgfHwKIAkJICAgZmFsbGJhY2tfYXBlcl9mb3JjZSkgewotCQlwcmludGsoS0VSTl9FUlIKKwkJcHJpbnRrKEtFUk5fSU5GTwogCQkJIllvdXIgQklPUyBkb2Vzbid0IGxlYXZlIGEgYXBlcnR1cmUgbWVtb3J5IGhvbGVcbiIpOwotCQlwcmludGsoS0VSTl9FUlIKKwkJcHJpbnRrKEtFUk5fSU5GTwogCQkJIlBsZWFzZSBlbmFibGUgdGhlIElPTU1VIG9wdGlvbiBpbiB0aGUgQklPUyBzZXR1cFxuIik7Ci0JCXByaW50ayhLRVJOX0VSUgorCQlwcmludGsoS0VSTl9JTkZPCiAJCQkiVGhpcyBjb3N0cyB5b3UgJWQgTUIgb2YgUkFNXG4iLAogCQkJCTMyIDw8IGZhbGxiYWNrX2FwZXJfb3JkZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpY18zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWNfMzIuYwppbmRleCBmODhiZDBkLi4yMWM4MzFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpY18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljXzMyLmMKQEAgLTYwLDEwICs2MCw4IEBACiBzdGF0aWMgaW50IGZvcmNlX2VuYWJsZV9sb2NhbF9hcGljOwogaW50IGRpc2FibGVfYXBpYzsKIAotLyogTG9jYWwgQVBJQyB0aW1lciB2ZXJpZmljYXRpb24gb2sgKi8KLXN0YXRpYyBpbnQgbG9jYWxfYXBpY190aW1lcl92ZXJpZnlfb2s7CiAvKiBEaXNhYmxlIGxvY2FsIEFQSUMgdGltZXIgZnJvbSB0aGUga2VybmVsIGNvbW1hbmRsaW5lIG9yIHZpYSBkbWkgcXVpcmsgKi8KLXN0YXRpYyBpbnQgbG9jYWxfYXBpY190aW1lcl9kaXNhYmxlZDsKK3N0YXRpYyBpbnQgZGlzYWJsZV9hcGljX3RpbWVyIF9fY3B1aW5pdGRhdGE7CiAvKiBMb2NhbCBBUElDIHRpbWVyIHdvcmtzIGluIEMyICovCiBpbnQgbG9jYWxfYXBpY190aW1lcl9jMl9vazsKIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2FsX2FwaWNfdGltZXJfYzJfb2spOwpAQCAtMTMwLDcgKzEyOCwxMSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBsYXBpY19pc19pbnRlZ3JhdGVkKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXJldHVybiAxOworI2Vsc2UKIAlyZXR1cm4gQVBJQ19JTlRFR1JBVEVEKGxhcGljX2dldF92ZXJzaW9uKCkpOworI2VuZGlmCiB9CiAKIC8qCkBAIC0xNDUsMTMgKzE0NywxOCBAQAogCXJldHVybiBsYXBpY19nZXRfdmVyc2lvbigpID49IDB4MTQ7CiB9CiAKLXZvaWQgYXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCisvKgorICogUGFyYXZpcnQga2VybmVscyBhbHNvIG1pZ2h0IGJlIHVzaW5nIHRoZXNlIGJlbG93IG9wcy4gU28gd2Ugc3RpbGwKKyAqIHVzZSBnZW5lcmljIGFwaWNfcmVhZCgpL2FwaWNfd3JpdGUoKSwgd2hpY2ggbWlnaHQgYmUgcG9pbnRpbmcgdG8gZGlmZmVyZW50CisgKiBvcHMgaW4gUEFSQVZJUlQgY2FzZS4KKyAqLwordm9pZCB4YXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCiB7CiAJd2hpbGUgKGFwaWNfcmVhZChBUElDX0lDUikgJiBBUElDX0lDUl9CVVNZKQogCQljcHVfcmVsYXgoKTsKIH0KIAotdTMyIHNhZmVfYXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCit1MzIgc2FmZV94YXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCiB7CiAJdTMyIHNlbmRfc3RhdHVzOwogCWludCB0aW1lb3V0OwpAQCAtMTY3LDE2ICsxNzQsNDggQEAKIAlyZXR1cm4gc2VuZF9zdGF0dXM7CiB9CiAKK3ZvaWQgeGFwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCkKK3sKKwlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChpZCkpOworCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIGxvdyk7Cit9CisKK3U2NCB4YXBpY19pY3JfcmVhZCh2b2lkKQoreworCXUzMiBpY3IxLCBpY3IyOworCisJaWNyMiA9IGFwaWNfcmVhZChBUElDX0lDUjIpOworCWljcjEgPSBhcGljX3JlYWQoQVBJQ19JQ1IpOworCisJcmV0dXJuIGljcjEgfCAoKHU2NClpY3IyIDw8IDMyKTsKK30KKworc3RhdGljIHN0cnVjdCBhcGljX29wcyB4YXBpY19vcHMgPSB7CisJLnJlYWQgPSBuYXRpdmVfYXBpY19tZW1fcmVhZCwKKwkud3JpdGUgPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCisJLmljcl9yZWFkID0geGFwaWNfaWNyX3JlYWQsCisJLmljcl93cml0ZSA9IHhhcGljX2ljcl93cml0ZSwKKwkud2FpdF9pY3JfaWRsZSA9IHhhcGljX3dhaXRfaWNyX2lkbGUsCisJLnNhZmVfd2FpdF9pY3JfaWRsZSA9IHNhZmVfeGFwaWNfd2FpdF9pY3JfaWRsZSwKK307CisKK3N0cnVjdCBhcGljX29wcyBfX3JlYWRfbW9zdGx5ICphcGljX29wcyA9ICZ4YXBpY19vcHM7CitFWFBPUlRfU1lNQk9MX0dQTChhcGljX29wcyk7CisKIC8qKgogICogZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgLSBlbmFibGUgTk1JIHRocm91Z2ggbG9jYWwgdmVjdG9yIHRhYmxlIDAKICAqLwogdm9pZCBfX2NwdWluaXQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgdiA9IEFQSUNfRE1fTk1JOworCXVuc2lnbmVkIGludCB2OwogCi0JLyogTGV2ZWwgdHJpZ2dlcmVkIGZvciA4MjQ4OURYICovCisJLyogdW5tYXNrIGFuZCBzZXQgdG8gTk1JICovCisJdiA9IEFQSUNfRE1fTk1JOworCisJLyogTGV2ZWwgdHJpZ2dlcmVkIGZvciA4MjQ4OURYICgzMmJpdCBtb2RlKSAqLwogCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQogCQl2IHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CisKIAlhcGljX3dyaXRlKEFQSUNfTFZUMCwgdik7CiB9CiAKQEAgLTE5Myw5ICsyMzIsMTMgQEAKICAqLwogaW50IGxhcGljX2dldF9tYXhsdnQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJdW5zaWduZWQgaW50IHY7CiAKLQkvKiA4MjQ4OURYcyBkbyBub3QgcmVwb3J0ICMgb2YgTFZUIGVudHJpZXMuICovCisJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJLyoKKwkgKiAtIHdlIGFsd2F5cyBoYXZlIEFQSUMgaW50ZWdyYXRlZCBvbiA2NGJpdCBtb2RlCisJICogLSA4MjQ4OURYcyBkbyBub3QgcmVwb3J0ICMgb2YgTFZUIGVudHJpZXMKKwkgKi8KIAlyZXR1cm4gQVBJQ19JTlRFR1JBVEVEKEdFVF9BUElDX1ZFUlNJT04odikpID8gR0VUX0FQSUNfTUFYTFZUKHYpIDogMjsKIH0KIApAQCAtMjAzLDggKzI0NiwxMiBAQAogICogTG9jYWwgQVBJQyB0aW1lcgogICovCiAKLS8qIENsb2NrIGRpdmlzb3IgaXMgc2V0IHRvIDE2ICovCisvKiBDbG9jayBkaXZpc29yICovCisjaWZkZWYgQ09ORkdfWDg2XzY0CisjZGVmaW5lIEFQSUNfRElWSVNPUiAxCisjZWxzZQogI2RlZmluZSBBUElDX0RJVklTT1IgMTYKKyNlbmRpZgogCiAvKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyLCB3aXRoIGEgdGltZW91dCBvZgpAQCAtMjEyLDYgKzI1OSw5IEBACiAgKiB0aGlzIGZ1bmN0aW9uIHR3aWNlIG9uIHRoZSBib290IENQVSwgb25jZSB3aXRoIGEgYm9ndXMgdGltZW91dAogICogdmFsdWUsIHNlY29uZCB0aW1lIGZvciByZWFsLiBUaGUgb3RoZXIgKG5vbmNhbGlicmF0aW5nKSBDUFVzCiAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gb25seSBvbmNlLCB3aXRoIHRoZSByZWFsLCBjYWxpYnJhdGVkIHZhbHVlLgorICoKKyAqIFdlIGRvIHJlYWRzIGJlZm9yZSB3cml0ZXMgZXZlbiBpZiB1bm5lY2Vzc2FyeSwgdG8gZ2V0IGFyb3VuZCB0aGUKKyAqIFA1IEFQSUMgZG91YmxlIHdyaXRlIGJ1Zy4KICAqLwogc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcywgaW50IG9uZXNob3QsIGludCBpcnFlbikKIHsKQEAgLTIzMywxNCArMjgzLDQ4IEBACiAJICovCiAJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CiAJYXBpY193cml0ZShBUElDX1REQ1IsCi0JCSAgICh0bXBfdmFsdWUgJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpIHwKLQkJICAgQVBJQ19URFJfRElWXzE2KTsKKwkJKHRtcF92YWx1ZSAmIH4oQVBJQ19URFJfRElWXzEgfCBBUElDX1REUl9ESVZfVE1CQVNFKSkgfAorCQlBUElDX1REUl9ESVZfMTYpOwogCiAJaWYgKCFvbmVzaG90KQogCQlhcGljX3dyaXRlKEFQSUNfVE1JQ1QsIGNsb2NrcyAvIEFQSUNfRElWSVNPUik7CiB9CiAKIC8qCisgKiBTZXR1cCBleHRlbmRlZCBMVlQsIEFNRCBzcGVjaWZpYyAoSzgsIGZhbWlseSAxMGgpCisgKgorICogVmVjdG9yIG1hcHBpbmdzIGFyZSBoYXJkIGNvZGVkLiBPbiBLOCBvbmx5IG9mZnNldCAwIChBUElDNTAwKSBhbmQKKyAqIE1DRSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQuIFRodXMgTUNFIG9mZnNldCBtdXN0IGJlIHNldCB0byAwLgorICoKKyAqIElmIG1hc2s9MSwgdGhlIExWVCBlbnRyeSBkb2VzIG5vdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIHdoaWxlIG1hc2s9MAorICogZW5hYmxlcyB0aGUgdmVjdG9yLiBTZWUgYWxzbyB0aGUgQktER3MuCisgKi8KKworI2RlZmluZSBBUElDX0VJTFZUX0xWVE9GRl9NQ0UgMAorI2RlZmluZSBBUElDX0VJTFZUX0xWVE9GRl9JQlMgMQorCitzdGF0aWMgdm9pZCBzZXR1cF9BUElDX2VpbHZ0KHU4IGx2dF9vZmYsIHU4IHZlY3RvciwgdTggbXNnX3R5cGUsIHU4IG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWcgPSAobHZ0X29mZiA8PCA0KSArIEFQSUNfRUlMVlQwOworCXVuc2lnbmVkIGludCAgdiAgID0gKG1hc2sgPDwgMTYpIHwgKG1zZ190eXBlIDw8IDgpIHwgdmVjdG9yOworCisJYXBpY193cml0ZShyZWcsIHYpOworfQorCit1OCBzZXR1cF9BUElDX2VpbHZ0X21jZSh1OCB2ZWN0b3IsIHU4IG1zZ190eXBlLCB1OCBtYXNrKQoreworCXNldHVwX0FQSUNfZWlsdnQoQVBJQ19FSUxWVF9MVlRPRkZfTUNFLCB2ZWN0b3IsIG1zZ190eXBlLCBtYXNrKTsKKwlyZXR1cm4gQVBJQ19FSUxWVF9MVlRPRkZfTUNFOworfQorCit1OCBzZXR1cF9BUElDX2VpbHZ0X2licyh1OCB2ZWN0b3IsIHU4IG1zZ190eXBlLCB1OCBtYXNrKQoreworCXNldHVwX0FQSUNfZWlsdnQoQVBJQ19FSUxWVF9MVlRPRkZfSUJTLCB2ZWN0b3IsIG1zZ190eXBlLCBtYXNrKTsKKwlyZXR1cm4gQVBJQ19FSUxWVF9MVlRPRkZfSUJTOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0dXBfQVBJQ19laWx2dF9pYnMpOworCisvKgogICogUHJvZ3JhbSB0aGUgbmV4dCBldmVudCwgcmVsYXRpdmUgdG8gbm93CiAgKi8KIHN0YXRpYyBpbnQgbGFwaWNfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLApAQCAtMjU5LDggKzM0Myw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgdjsKIAotCS8qIExhcGljIHVzZWQgZm9yIGJyb2FkY2FzdCA/ICovCi0JaWYgKCFsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vaykKKwkvKiBMYXBpYyB1c2VkIGFzIGR1bW15IGZvciBicm9hZGNhc3QgPyAqLworCWlmIChldnQtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfRFVNTVkpCiAJCXJldHVybjsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKQEAgLTQ3Myw3ICs1NTcsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JbG9jYWxfYXBpY190aW1lcl92ZXJpZnlfb2sgPSAxOworCWxldnQtPmZlYXR1cmVzICY9IH5DTE9DS19FVlRfRkVBVF9EVU1NWTsKIAogCS8qIFdlIHRydXN0IHRoZSBwbSB0aW1lciBiYXNlZCBjYWxpYnJhdGlvbiAqLwogCWlmICghcG1fcmVmZXJlbmNlZCkgewpAQCAtNTA3LDExICs1OTEsMTEgQEAKIAkJaWYgKGRlbHRhaiA+PSBMQVBJQ19DQUxfTE9PUFMtMiAmJiBkZWx0YWogPD0gTEFQSUNfQ0FMX0xPT1BTKzIpCiAJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4gamlmZmllcyByZXN1bHQgb2tcbiIpOwogCQllbHNlCi0JCQlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDA7CisJCQlsZXZ0LT5mZWF0dXJlcyB8PSBDTE9DS19FVlRfRkVBVF9EVU1NWTsKIAl9IGVsc2UKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0JaWYgKCFsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vaykgeworCWlmIChsZXZ0LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZS5cbiIpOwogCQkJcmV0dXJuIC0xOwpAQCAtNTMzLDcgKzYxNyw4IEBACiAJICogdGltZXIgYXMgYSBkdW1teSBjbG9jayBldmVudCBzb3VyY2Ugb24gU01QIHN5c3RlbXMsIHNvIHRoZQogCSAqIGJyb2FkY2FzdCBtZWNoYW5pc20gaXMgdXNlZC4gT24gVVAgc3lzdGVtcyBzaW1wbHkgaWdub3JlIGl0LgogCSAqLwotCWlmIChsb2NhbF9hcGljX3RpbWVyX2Rpc2FibGVkKSB7CisJaWYgKGRpc2FibGVfYXBpY190aW1lcikgeworCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgQVBJQyB0aW1lclxuIik7CiAJCS8qIE5vIGJyb2FkY2FzdCBvbiBVUCAhICovCiAJCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gMSkgewogCQkJbGFwaWNfY2xvY2tldmVudC5tdWx0ID0gMTsKQEAgLTYwMiw3ICs2ODcsMTEgQEAKIAkvKgogCSAqIHRoZSBOTUkgZGVhZGxvY2stZGV0ZWN0b3IgdXNlcyB0aGlzLgogCSAqLworI2lmZGVmIENPTkZJR19YODZfNjQKKwlhZGRfcGRhKGFwaWNfdGltZXJfaXJxcywgMSk7CisjZWxzZQogCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzKys7CisjZW5kaWYKIAogCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwogfQpAQCAtNjQyLDM1ICs3MzEsNiBAQAogfQogCiAvKgotICogU2V0dXAgZXh0ZW5kZWQgTFZULCBBTUQgc3BlY2lmaWMgKEs4LCBmYW1pbHkgMTBoKQotICoKLSAqIFZlY3RvciBtYXBwaW5ncyBhcmUgaGFyZCBjb2RlZC4gT24gSzggb25seSBvZmZzZXQgMCAoQVBJQzUwMCkgYW5kCi0gKiBNQ0UgaW50ZXJydXB0cyBhcmUgc3VwcG9ydGVkLiBUaHVzIE1DRSBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gMC4KLSAqLwotCi0jZGVmaW5lIEFQSUNfRUlMVlRfTFZUT0ZGX01DRSAwCi0jZGVmaW5lIEFQSUNfRUlMVlRfTFZUT0ZGX0lCUyAxCi0KLXN0YXRpYyB2b2lkIHNldHVwX0FQSUNfZWlsdnQodTggbHZ0X29mZiwgdTggdmVjdG9yLCB1OCBtc2dfdHlwZSwgdTggbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZyA9IChsdnRfb2ZmIDw8IDQpICsgQVBJQ19FSUxWVDA7Ci0JdW5zaWduZWQgaW50ICB2ICAgPSAobWFzayA8PCAxNikgfCAobXNnX3R5cGUgPDwgOCkgfCB2ZWN0b3I7Ci0JYXBpY193cml0ZShyZWcsIHYpOwotfQotCi11OCBzZXR1cF9BUElDX2VpbHZ0X21jZSh1OCB2ZWN0b3IsIHU4IG1zZ190eXBlLCB1OCBtYXNrKQotewotCXNldHVwX0FQSUNfZWlsdnQoQVBJQ19FSUxWVF9MVlRPRkZfTUNFLCB2ZWN0b3IsIG1zZ190eXBlLCBtYXNrKTsKLQlyZXR1cm4gQVBJQ19FSUxWVF9MVlRPRkZfTUNFOwotfQotCi11OCBzZXR1cF9BUElDX2VpbHZ0X2licyh1OCB2ZWN0b3IsIHU4IG1zZ190eXBlLCB1OCBtYXNrKQotewotCXNldHVwX0FQSUNfZWlsdnQoQVBJQ19FSUxWVF9MVlRPRkZfSUJTLCB2ZWN0b3IsIG1zZ190eXBlLCBtYXNrKTsKLQlyZXR1cm4gQVBJQ19FSUxWVF9MVlRPRkZfSUJTOwotfQotCi0vKgogICogTG9jYWwgQVBJQyBzdGFydCBhbmQgc2h1dGRvd24KICAqLwogCkBAIC03MTUsNyArNzc1LDcgQEAKIAl9CiAKIAkvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwpIHx8IGRlZmluZWQoWDg2X01DRV9JTlRFTCkKIAlpZiAobWF4bHZ0ID49IDUpIHsKIAkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOwogCQlhcGljX3dyaXRlKEFQSUNfTFZUVEhNUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CkBAIC03MzIsMTAgKzc5Miw2IEBACiAJaWYgKG1heGx2dCA+PSA0KQogCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfTFZUX01BU0tFRCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKLQlpZiAobWF4bHZ0ID49IDUpCi0JCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBBUElDX0xWVF9NQVNLRUQpOwotI2VuZGlmCiAJLyogSW50ZWdyYXRlZCBBUElDICghODI0ODlEWCkgPyAqLwogCWlmIChsYXBpY19pc19pbnRlZ3JhdGVkKCkpIHsKIAkJaWYgKG1heGx2dCA+IDMpCkBAIC03NTAsNyArODA2LDcgQEAKICAqLwogdm9pZCBkaXNhYmxlX2xvY2FsX0FQSUModm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGludCB2YWx1ZTsKIAogCWNsZWFyX2xvY2FsX0FQSUMoKTsKIApAQCAtNzYyLDYgKzgxOCw3IEBACiAJdmFsdWUgJj0gfkFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7CiAJYXBpY193cml0ZShBUElDX1NQSVYsIHZhbHVlKTsKIAorI2lmZGVmIENPTkZJR19YODZfMzIKIAkvKgogCSAqIFdoZW4gTEFQSUMgd2FzIGRpc2FibGVkIGJ5IHRoZSBCSU9TIGFuZCBlbmFibGVkIGJ5IHRoZSBrZXJuZWwsCiAJICogcmVzdG9yZSB0aGUgZGlzYWJsZWQgc3RhdGUuCkBAIC03NzMsNiArODMwLDcgQEAKIAkJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFOwogCQl3cm1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CiAJfQorI2VuZGlmCiB9CiAKIC8qCkBAIC03ODksMTEgKzg0NywxNSBAQAogCQlyZXR1cm47CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY2xlYXJfbG9jYWxfQVBJQygpOwogCi0JaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKQorI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAoIWVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQljbGVhcl9sb2NhbF9BUElDKCk7CisJZWxzZQorI2VuZGlmCiAJCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCisKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTgzOCw2ICs5MDAsMTIgQEAKIAkgKi8KIAlyZWcwID0gYXBpY19yZWFkKEFQSUNfSUQpOwogCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIElEOiAleFxuIiwgcmVnMCk7CisJYXBpY193cml0ZShBUElDX0lELCByZWcwIF4gQVBJQ19JRF9NQVNLKTsKKwlyZWcxID0gYXBpY19yZWFkKEFQSUNfSUQpOworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIElEOiAleFxuIiwgcmVnMSk7CisJYXBpY193cml0ZShBUElDX0lELCByZWcwKTsKKwlpZiAocmVnMSAhPSAocmVnMCBeIEFQSUNfSURfTUFTSykpCisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBUaGUgbmV4dCB0d28gYXJlIGp1c3QgdG8gc2VlIGlmIHdlIGhhdmUgc2FuZSB2YWx1ZXMuCkBAIC04NjMsMTQgKzkzMSwxNSBAQAogCSAqLwogCWlmIChtb2Rlcm5fYXBpYygpIHx8IGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKIAkJcmV0dXJuOworCiAJLyoKIAkgKiBXYWl0IGZvciBpZGxlLgogCSAqLwogCWFwaWNfd2FpdF9pY3JfaWRsZSgpOwogCiAJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIlN5bmNocm9uaXppbmcgQXJiIElEcy5cbiIpOwotCWFwaWNfd3JpdGUoQVBJQ19JQ1IsCi0JCSAgIEFQSUNfREVTVF9BTExJTkMgfCBBUElDX0lOVF9MRVZFTFRSSUcgfCBBUElDX0RNX0lOSVQpOworCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIEFQSUNfREVTVF9BTExJTkMgfAorCQkJQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19ETV9JTklUKTsKIH0KIAogLyoKQEAgLTg3OCw3ICs5NDcsNyBAQAogICovCiB2b2lkIF9faW5pdCBpbml0X2JzcF9BUElDKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CiAKIAkvKgogCSAqIERvbid0IGRvIHRoZSBzZXR1cCBub3cgaWYgd2UgaGF2ZSBhIFNNUCBCSU9TIGFzIHRoZQpAQCAtODk5LDExICs5NjgsMTMgQEAKIAl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKIAl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCS8qIFRoaXMgYml0IGlzIHJlc2VydmVkIG9uIFA0L1hlb24gYW5kIHNob3VsZCBiZSBjbGVhcmVkICovCiAJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKIAkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKIAkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKIAllbHNlCisjZW5kaWYKIAkJdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwogCXZhbHVlIHw9IFNQVVJJT1VTX0FQSUNfVkVDVE9SOwogCWFwaWNfd3JpdGUoQVBJQ19TUElWLCB2YWx1ZSk7CkBAIC05MjIsNiArOTkzLDE2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIG1heGx2dDsKIAlpZiAobGFwaWNfaXNfaW50ZWdyYXRlZCgpICYmICFlc3JfZGlzYWJsZSkgeworCQlpZiAoZXNyX2Rpc2FibGUpIHsKKwkJCS8qCisJCQkgKiBTb21ldGhpbmcgdW50cmFjZWFibGUgaXMgY3JlYXRpbmcgYmFkIGludGVycnVwdHMgb24KKwkJCSAqIHNlY29uZGFyeSBxdWFkcyAuLi4gZm9yIHRoZSBtb21lbnQsIGp1c3QgbGVhdmUgdGhlCisJCQkgKiBFU1IgZGlzYWJsZWQgLSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGUKKwkJCSAqIGVycm9ycyBhbnl3YXkgLSBtYmxpZ2gKKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKKwkJCXJldHVybjsKKwkJfQogCQkvKiAhODI0ODlEWCAqLwogCQltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAJCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLiAqLwpAQCAtOTQyLDE2ICsxMDIzLDcgQEAKIAkJCQkidmVjdG9yOiAweCUwOGx4ICBhZnRlcjogMHglMDhseFxuIiwKIAkJCQlvbGR2YWx1ZSwgdmFsdWUpOwogCX0gZWxzZSB7Ci0JCWlmIChlc3JfZGlzYWJsZSkKLQkJCS8qCi0JCQkgKiBTb21ldGhpbmcgdW50cmFjZWFibGUgaXMgY3JlYXRpbmcgYmFkIGludGVycnVwdHMgb24KLQkJCSAqIHNlY29uZGFyeSBxdWFkcyAuLi4gZm9yIHRoZSBtb21lbnQsIGp1c3QgbGVhdmUgdGhlCi0JCQkgKiBFU1IgZGlzYWJsZWQgLSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGUKLQkJCSAqIGVycm9ycyBhbnl3YXkgLSBtYmxpZ2gKLQkJCSAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gRVNSIGZvciA4MjQ4OURYLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIEVTUiBmb3IgODI0ODlEWC5cbiIpOwogCX0KIH0KIApAQCAtMTA4OSwxMyArMTE2MSwxNyBAQAogCiB2b2lkIF9fY3B1aW5pdCBlbmRfbG9jYWxfQVBJQ19zZXR1cCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KIAlsYXBpY19zZXR1cF9lc3IoKTsKLQkvKiBEaXNhYmxlIHRoZSBsb2NhbCBhcGljIHRpbWVyICovCi0JdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKLQl2YWx1ZSB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKLQlhcGljX3dyaXRlKEFQSUNfTFZUVCwgdmFsdWUpOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCXsKKwkJdW5zaWduZWQgaW50IHZhbHVlOworCQkvKiBEaXNhYmxlIHRoZSBsb2NhbCBhcGljIHRpbWVyICovCisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7CisJCXZhbHVlIHw9IChBUElDX0xWVF9NQVNLRUQgfCBMT0NBTF9USU1FUl9WRUNUT1IpOworCQlhcGljX3dyaXRlKEFQSUNfTFZUVCwgdmFsdWUpOworCX0KKyNlbmRpZgogCiAJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coTlVMTCk7CiAJYXBpY19wbV9hY3RpdmF0ZSgpOwpAQCAtMTIwNSw3ICsxMjgxLDcgQEAKIAkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgogCSAqLwogCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSk7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOwogCiB9CiAKQEAgLTEyNDIsNyArMTMxOCw3IEBACiAJICogbWlnaHQgYmUgemVybyBpZiByZWFkIGZyb20gTVAgdGFibGVzLiBHZXQgaXQgZnJvbSBMQVBJQy4KIAkgKi8KICNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAotCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKTsKKwlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKICNlbmRpZgogCXBoeXNpZF9zZXRfbWFza19vZl9waHlzaWQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkLCAmcGh5c19jcHVfcHJlc2VudF9tYXApOwogCkBAIC0xMzIxLDU5ICsxMzk3LDEyIEBACiAJaXJxX2V4aXQoKTsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgX19pbml0IHNtcF9pbnRyX2luaXQodm9pZCkKLXsKLQkvKgotCSAqIElSUTAgbXVzdCBiZSBnaXZlbiBhIGZpeGVkIGFzc2lnbm1lbnQgYW5kIGluaXRpYWxpemVkLAotCSAqIGJlY2F1c2UgaXQncyB1c2VkIGJlZm9yZSB0aGUgSU8tQVBJQyBpcyBzZXQgdXAuCi0JICovCi0Jc2V0X2ludHJfZ2F0ZShGSVJTVF9ERVZJQ0VfVkVDVE9SLCBpbnRlcnJ1cHRbMF0pOwotCi0JLyoKLQkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCi0JICogSVBJLCBkcml2ZW4gYnkgd2FrZXVwLgotCSAqLwotCWFsbG9jX2ludHJfZ2F0ZShSRVNDSEVEVUxFX1ZFQ1RPUiwgcmVzY2hlZHVsZV9pbnRlcnJ1cHQpOwotCi0JLyogSVBJIGZvciBpbnZhbGlkYXRpb24gKi8KLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SLCBpbnZhbGlkYXRlX2ludGVycnVwdCk7Ci0KLQkvKiBJUEkgZm9yIGdlbmVyaWMgZnVuY3Rpb24gY2FsbCAqLwotCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1ZFQ1RPUiwgY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQpOwotCi0JLyogSVBJIGZvciBzaW5nbGUgY2FsbCBmdW5jdGlvbiAqLwotCXNldF9pbnRyX2dhdGUoQ0FMTF9GVU5DVElPTl9TSU5HTEVfVkVDVE9SLAotCQkJCWNhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEluaXRpYWxpemUgQVBJQyBpbnRlcnJ1cHRzCi0gKi8KLXZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCXNtcF9pbnRyX2luaXQoKTsKLSNlbmRpZgotCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLwotCWFsbG9jX2ludHJfZ2F0ZShMT0NBTF9USU1FUl9WRUNUT1IsIGFwaWNfdGltZXJfaW50ZXJydXB0KTsKLQotCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCi0JYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwotCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCi0JYWxsb2NfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKLSNlbmRpZgotfQotCiAvKioKICAqIGNvbm5lY3RfYnNwX0FQSUMgLSBhdHRhY2ggdGhlIEFQSUMgdG8gdGhlIGludGVycnVwdCBzeXN0ZW0KICAqLwogdm9pZCBfX2luaXQgY29ubmVjdF9ic3BfQVBJQyh2b2lkKQogeworI2lmZGVmIENPTkZJR19YODZfMzIKIAlpZiAocGljX21vZGUpIHsKIAkJLyoKIAkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KQEAgLTEzODgsNiArMTQxNyw3IEBACiAJCW91dGIoMHg3MCwgMHgyMik7CiAJCW91dGIoMHgwMSwgMHgyMyk7CiAJfQorI2VuZGlmCiAJZW5hYmxlX2FwaWNfbW9kZSgpOwogfQogCkBAIC0xNDAwLDYgKzE0MzAsOSBAQAogICovCiB2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMoaW50IHZpcnRfd2lyZV9zZXR1cCkKIHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJaWYgKHBpY19tb2RlKSB7CiAJCS8qCiAJCSAqIFB1dCB0aGUgYm9hcmQgYmFjayBpbnRvIFBJQyBtb2RlIChoYXMgYW4gZWZmZWN0IG9ubHkgb24KQEAgLTE0MTEsNTQgKzE0NDQsNTMgQEAKIAkJCQkiZW50ZXJpbmcgUElDIG1vZGUuXG4iKTsKIAkJb3V0YigweDcwLCAweDIyKTsKIAkJb3V0YigweDAwLCAweDIzKTsKLQl9IGVsc2UgewotCQkvKiBHbyBiYWNrIHRvIFZpcnR1YWwgV2lyZSBjb21wYXRpYmlsaXR5IG1vZGUgKi8KLQkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgogCi0JCS8qIEZvciB0aGUgc3B1cmlvdXMgaW50ZXJydXB0IHVzZSB2ZWN0b3IgRiwgYW5kIGVuYWJsZSBpdCAqLwotCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwotCQl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKLQkJdmFsdWUgfD0gQVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKLQkJdmFsdWUgfD0gMHhmOwotCQlhcGljX3dyaXRlKEFQSUNfU1BJViwgdmFsdWUpOworCS8qIEdvIGJhY2sgdG8gVmlydHVhbCBXaXJlIGNvbXBhdGliaWxpdHkgbW9kZSAqLwogCi0JCWlmICghdmlydF93aXJlX3NldHVwKSB7Ci0JCQkvKgotCQkJICogRm9yIExWVDAgbWFrZSBpdCBlZGdlIHRyaWdnZXJlZCwgYWN0aXZlIGhpZ2gsCi0JCQkgKiBleHRlcm5hbCBhbmQgZW5hYmxlZAotCQkJICovCi0JCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOwotCQkJdmFsdWUgJj0gfihBUElDX01PREVfTUFTSyB8IEFQSUNfU0VORF9QRU5ESU5HIHwKLQkJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8Ci0JCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7Ci0JCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7Ci0JCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9FWFRJTlQpOwotCQkJYXBpY193cml0ZShBUElDX0xWVDAsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8qIERpc2FibGUgTFZUMCAqLwotCQkJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7Ci0JCX0KKwkvKiBGb3IgdGhlIHNwdXJpb3VzIGludGVycnVwdCB1c2UgdmVjdG9yIEYsIGFuZCBlbmFibGUgaXQgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOworCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOworCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7CisJdmFsdWUgfD0gMHhmOworCWFwaWNfd3JpdGUoQVBJQ19TUElWLCB2YWx1ZSk7CiAKKwlpZiAoIXZpcnRfd2lyZV9zZXR1cCkgewogCQkvKgotCQkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZAotCQkgKiBlbmFibGVkCisJCSAqIEZvciBMVlQwIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLAorCQkgKiBleHRlcm5hbCBhbmQgZW5hYmxlZAogCQkgKi8KLQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQkJdmFsdWUgJj0gfigKLQkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAorCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAogCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAogCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKLQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKLQkJYXBpY193cml0ZShBUElDX0xWVDEsIHZhbHVlKTsKKwkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfRVhUSU5UKTsKKwkJYXBpY193cml0ZShBUElDX0xWVDAsIHZhbHVlKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIExWVDAgKi8KKwkJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CiAJfQorCisJLyoKKwkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwKKwkgKiBubWkgYW5kIGVuYWJsZWQKKwkgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCXZhbHVlICY9IH4oQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7CisJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCiB2b2lkIF9fY3B1aW5pdCBnZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGludCBhcGljaWQsIGludCB2ZXJzaW9uKQogewogCWludCBjcHU7CiAJY3B1bWFza190IHRtcF9tYXA7Ci0JcGh5c2lkX21hc2tfdCBwaHlzX2NwdTsKIAogCS8qCiAJICogVmFsaWRhdGUgdmVyc2lvbgpAQCAtMTQ3MSw5ICsxNTAzLDYgQEAKIAl9CiAJYXBpY192ZXJzaW9uW2FwaWNpZF0gPSB2ZXJzaW9uOwogCi0JcGh5c19jcHUgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQoYXBpY2lkKTsKLQlwaHlzaWRzX29yKHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHUpOwotCiAJaWYgKG51bV9wcm9jZXNzb3JzID49IE5SX0NQVVMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiV0FSTklORzogTlJfQ1BVUyBsaW1pdCBvZiAlaSByZWFjaGVkLiIKIAkJCSIgIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgTlJfQ1BVUyk7CkBAIC0xNDg0LDE3ICsxNTEzLDE5IEBACiAJY3B1c19jb21wbGVtZW50KHRtcF9tYXAsIGNwdV9wcmVzZW50X21hcCk7CiAJY3B1ID0gZmlyc3RfY3B1KHRtcF9tYXApOwogCi0JaWYgKGFwaWNpZCA9PSBib290X2NwdV9waHlzaWNhbF9hcGljaWQpCisJcGh5c2lkX3NldChhcGljaWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwlpZiAoYXBpY2lkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkgewogCQkvKgogCQkgKiB4ODZfYmlvc19jcHVfYXBpY2lkIGlzIHJlcXVpcmVkIHRvIGhhdmUgcHJvY2Vzc29ycyBsaXN0ZWQKIAkJICogaW4gc2FtZSBvcmRlciBhcyBsb2dpY2FsIGNwdSBudW1iZXJzLiBIZW5jZSB0aGUgZmlyc3QKIAkJICogZW50cnkgaXMgQlNQLCBhbmQgc28gb24uCiAJCSAqLwogCQljcHUgPSAwOwotCisJfQogCWlmIChhcGljaWQgPiBtYXhfcGh5c2ljYWxfYXBpY2lkKQogCQltYXhfcGh5c2ljYWxfYXBpY2lkID0gYXBpY2lkOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCS8qCiAJICogV291bGQgYmUgcHJlZmVyYWJsZSB0byBzd2l0Y2ggdG8gYmlnc21wIHdoZW4gQ09ORklHX0hPVFBMVUdfQ1BVPXkKIAkgKiBidXQgd2UgbmVlZCB0byB3b3JrIG90aGVyIGRlcGVuZGVuY2llcyBsaWtlIFNNUF9TVVNQRU5EIGV0YwpAQCAtMTUxNCw3ICsxNTQ1LDkgQEAKIAkJCWRlZl90b19iaWdzbXAgPSAxOwogCQl9CiAJfQotI2lmZGVmIENPTkZJR19TTVAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NNUCkgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCS8qIGFyZSB3ZSBiZWluZyBjYWxsZWQgZWFybHkgaW4ga2VybmVsIHN0YXJ0dXA/ICovCiAJaWYgKGVhcmx5X3Blcl9jcHVfcHRyKHg4Nl9jcHVfdG9fYXBpY2lkKSkgewogCQl1MTYgKmNwdV90b19hcGljaWQgPSBlYXJseV9wZXJfY3B1X3B0cih4ODZfY3B1X3RvX2FwaWNpZCk7CkBAIC0xNTI3LDYgKzE1NjAsNyBAQAogCQlwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSkgPSBhcGljaWQ7CiAJfQogI2VuZGlmCisKIAljcHVfc2V0KGNwdSwgY3B1X3Bvc3NpYmxlX21hcCk7CiAJY3B1X3NldChjcHUsIGNwdV9wcmVzZW50X21hcCk7CiB9CkBAIC0xNTM3LDYgKzE1NzEsMTEgQEAKICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHN0cnVjdCB7CisJLyoKKwkgKiAnYWN0aXZlJyBpcyB0cnVlIGlmIHRoZSBsb2NhbCBBUElDIHdhcyBlbmFibGVkIGJ5IHVzIGFuZAorCSAqIG5vdCB0aGUgQklPUzsgdGhpcyBzaWduaWZpZXMgdGhhdCB3ZSBhcmUgYWxzbyByZXNwb25zaWJsZQorCSAqIGZvciBkaXNhYmxpbmcgaXQgYmVmb3JlIGVudGVyaW5nIGFwbS9hY3BpIHN1c3BlbmQKKwkgKi8KIAlpbnQgYWN0aXZlOwogCS8qIHIvdyBhcGljIGZpZWxkcyAqLwogCXVuc2lnbmVkIGludCBhcGljX2lkOwpAQCAtMTU3Nyw3ICsxNjE2LDcgQEAKIAlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyID0gYXBpY19yZWFkKEFQSUNfTFZURVJSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QgPSBhcGljX3JlYWQoQVBJQ19UTUlDVCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3RkY3IgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfTUNFX1A0VEhFUk1BTCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X01DRV9JTlRFTCkKIAlpZiAobWF4bHZ0ID49IDUpCiAJCWFwaWNfcG1fc3RhdGUuYXBpY190aG1yID0gYXBpY19yZWFkKEFQSUNfTFZUVEhNUik7CiAjZW5kaWYKQEAgLTE2MDEsMTYgKzE2NDAsMjMgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBBUElDQkFTRSBwb2ludHMgdG8gdGhlIHJpZ2h0IGFkZHJlc3MKLQkgKgotCSAqIEZJWE1FISBUaGlzIHdpbGwgYmUgd3JvbmcgaWYgd2UgZXZlciBzdXBwb3J0IHN1c3BlbmQgb24KLQkgKiBTTVAhIFdlJ2xsIG5lZWQgdG8gZG8gdGhpcyBhcyBwYXJ0IG9mIHRoZSBDUFUgcmVzdG9yZSEKLQkgKi8KLQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKLQlsIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IG1wX2xhcGljX2FkZHI7Ci0Jd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwlpZiAoeDJhcGljKQorCQllbmFibGVfeDJhcGljKCk7CisJZWxzZQorI2VuZGlmCisJeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIEFQSUNCQVNFIHBvaW50cyB0byB0aGUgcmlnaHQgYWRkcmVzcworCQkgKgorCQkgKiBGSVhNRSEgVGhpcyB3aWxsIGJlIHdyb25nIGlmIHdlIGV2ZXIgc3VwcG9ydCBzdXNwZW5kIG9uCisJCSAqIFNNUCEgV2UnbGwgbmVlZCB0byBkbyB0aGlzIGFzIHBhcnQgb2YgdGhlIENQVSByZXN0b3JlIQorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOworCQlsIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IG1wX2xhcGljX2FkZHI7CisJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwl9CiAKIAlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCBFUlJPUl9BUElDX1ZFQ1RPUiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJYXBpY193cml0ZShBUElDX0lELCBhcGljX3BtX3N0YXRlLmFwaWNfaWQpOwpAQCAtMTYyMCw3ICsxNjY2LDcgQEAKIAlhcGljX3dyaXRlKEFQSUNfU1BJViwgYXBpY19wbV9zdGF0ZS5hcGljX3NwaXYpOwogCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MCk7CiAJYXBpY193cml0ZShBUElDX0xWVDEsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQxKTsKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfTUNFX1A0VEhFUk1BTCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X01DRV9JTlRFTCkKIAlpZiAobWF4bHZ0ID49IDUpCiAJCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBhcGljX3BtX3N0YXRlLmFwaWNfdGhtcik7CiAjZW5kaWYKQEAgLTE2MzQsNyArMTY4MCw5IEBACiAJYXBpY193cml0ZShBUElDX0xWVEVSUiwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dGVycik7CiAJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjkwLDIwICsxNzM4LDIwIEBACiB9CiBlYXJseV9wYXJhbSgibGFwaWMiLCBwYXJzZV9sYXBpYyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX25vbGFwaWMoY2hhciAqYXJnKQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfZGlzYWJsZWFwaWMoY2hhciAqYXJnKQogewogCWRpc2FibGVfYXBpYyA9IDE7CiAJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9BUElDKTsKIAlyZXR1cm4gMDsKIH0KLWVhcmx5X3BhcmFtKCJub2xhcGljIiwgcGFyc2Vfbm9sYXBpYyk7CitlYXJseV9wYXJhbSgiZGlzYWJsZWFwaWMiLCBzZXR1cF9kaXNhYmxlYXBpYyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2Rpc2FibGVfbGFwaWNfdGltZXIoY2hhciAqYXJnKQorLyogc2FtZSBhcyBkaXNhYmxlYXBpYywgZm9yIGNvbXBhdGliaWxpdHkgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25vbGFwaWMoY2hhciAqYXJnKQogewotCWxvY2FsX2FwaWNfdGltZXJfZGlzYWJsZWQgPSAxOwotCXJldHVybiAwOworCXJldHVybiBzZXR1cF9kaXNhYmxlYXBpYyhhcmcpOwogfQotZWFybHlfcGFyYW0oIm5vbGFwaWNfdGltZXIiLCBwYXJzZV9kaXNhYmxlX2xhcGljX3RpbWVyKTsKK2Vhcmx5X3BhcmFtKCJub2xhcGljIiwgc2V0dXBfbm9sYXBpYyk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljX3RpbWVyX2MyX29rKGNoYXIgKmFyZykKIHsKQEAgLTE3MTIsMTUgKzE3NjAsNDAgQEAKIH0KIGVhcmx5X3BhcmFtKCJsYXBpY190aW1lcl9jMl9vayIsIHBhcnNlX2xhcGljX3RpbWVyX2MyX29rKTsKIAorc3RhdGljIGludCBfX2luaXQgcGFyc2VfZGlzYWJsZV9hcGljX3RpbWVyKGNoYXIgKmFyZykKK3sKKwlkaXNhYmxlX2FwaWNfdGltZXIgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vYXBpY3RpbWVyIiwgcGFyc2VfZGlzYWJsZV9hcGljX3RpbWVyKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9sYXBpY190aW1lcihjaGFyICphcmcpCit7CisJZGlzYWJsZV9hcGljX3RpbWVyID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2xhcGljX3RpbWVyIiwgcGFyc2Vfbm9sYXBpY190aW1lcik7CisKIHN0YXRpYyBpbnQgX19pbml0IGFwaWNfc2V0X3ZlcmJvc2l0eShjaGFyICphcmcpCiB7Ci0JaWYgKCFhcmcpCisJaWYgKCFhcmcpICB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlza2lwX2lvYXBpY19zZXR1cCA9IDA7CisJCWlvYXBpY19mb3JjZSA9IDE7CisJCXJldHVybiAwOworI2VuZGlmCiAJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWlmIChzdHJjbXAoYXJnLCAiZGVidWciKSA9PSAwKQorCWlmIChzdHJjbXAoImRlYnVnIiwgYXJnKSA9PSAwKQogCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgInZlcmJvc2UiKSA9PSAwKQorCWVsc2UgaWYgKHN0cmNtcCgidmVyYm9zZSIsIGFyZykgPT0gMCkKIAkJYXBpY192ZXJib3NpdHkgPSBBUElDX1ZFUkJPU0U7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQSUMgVmVyYm9zaXR5IGxldmVsICVzIG5vdCByZWNvZ25pc2VkIgorCQkJIiB1c2UgYXBpYz12ZXJib3NlIG9yIGFwaWM9ZGVidWdcbiIsIGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWNfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljXzY0LmMKaW5kZXggNDQ2YzA2Mi4uOTRkZGI2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWNfNjQuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpX3BtdG1yLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hci5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTM5LDEzICs0MCwyMCBAQAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS90aW1leC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAKICNpbmNsdWRlIDxtYWNoX2lwaS5oPgogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogCisvKiBEaXNhYmxlIGxvY2FsIEFQSUMgdGltZXIgZnJvbSB0aGUga2VybmVsIGNvbW1hbmRsaW5lIG9yIHZpYSBkbWkgcXVpcmsgKi8KIHN0YXRpYyBpbnQgZGlzYWJsZV9hcGljX3RpbWVyIF9fY3B1aW5pdGRhdGE7CiBzdGF0aWMgaW50IGFwaWNfY2FsaWJyYXRlX3BtdG1yIF9faW5pdGRhdGE7CiBpbnQgZGlzYWJsZV9hcGljOworaW50IGRpc2FibGVfeDJhcGljOworaW50IHgyYXBpYzsKKworLyogeDJhcGljIGVuYWJsZWQgYmVmb3JlIE9TIGhhbmRvdmVyICovCitpbnQgeDJhcGljX3ByZWVuYWJsZWQ7CiAKIC8qIExvY2FsIEFQSUMgdGltZXIgd29ya3MgaW4gQzIgKi8KIGludCBsb2NhbF9hcGljX3RpbWVyX2MyX29rOwpAQCAtNzMsNiArODEsOSBAQAogc3RhdGljIHZvaWQgbGFwaWNfdGltZXJfYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKTsKIHN0YXRpYyB2b2lkIGFwaWNfcG1fYWN0aXZhdGUodm9pZCk7CiAKKy8qCisgKiBUaGUgbG9jYWwgYXBpYyB0aW1lciBjYW4gYmUgdXNlZCBmb3IgYW55IGZ1bmN0aW9uIHdoaWNoIGlzIENQVSBsb2NhbC4KKyAqLwogc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgbGFwaWNfY2xvY2tldmVudCA9IHsKIAkubmFtZQkJPSAibGFwaWMiLAogCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVApAQCAtOTksMTEgKzExMCwxNSBAQAogfQogCiAvKgotICogQ2hlY2ssIGlmIHRoZSBBUElDIGlzIGludGVncmF0ZWQgb3IgYSBzZXBlcmF0ZSBjaGlwCisgKiBDaGVjaywgaWYgdGhlIEFQSUMgaXMgaW50ZWdyYXRlZCBvciBhIHNlcGFyYXRlIGNoaXAKICAqLwogc3RhdGljIGlubGluZSBpbnQgbGFwaWNfaXNfaW50ZWdyYXRlZCh2b2lkKQogeworI2lmZGVmIENPTkZJR19YODZfNjQKIAlyZXR1cm4gMTsKKyNlbHNlCisJcmV0dXJuIEFQSUNfSU5URUdSQVRFRChsYXBpY19nZXRfdmVyc2lvbigpKTsKKyNlbmRpZgogfQogCiAvKgpAQCAtMTE4LDEzICsxMzMsMTggQEAKIAlyZXR1cm4gbGFwaWNfZ2V0X3ZlcnNpb24oKSA+PSAweDE0OwogfQogCi12b2lkIGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQorLyoKKyAqIFBhcmF2aXJ0IGtlcm5lbHMgYWxzbyBtaWdodCBiZSB1c2luZyB0aGVzZSBiZWxvdyBvcHMuIFNvIHdlIHN0aWxsCisgKiB1c2UgZ2VuZXJpYyBhcGljX3JlYWQoKS9hcGljX3dyaXRlKCksIHdoaWNoIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGRpZmZlcmVudAorICogb3BzIGluIFBBUkFWSVJUIGNhc2UuCisgKi8KK3ZvaWQgeGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQogewogCXdoaWxlIChhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWSkKIAkJY3B1X3JlbGF4KCk7CiB9CiAKLXUzMiBzYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQordTMyIHNhZmVfeGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQogewogCXUzMiBzZW5kX3N0YXR1czsKIAlpbnQgdGltZW91dDsKQEAgLTE0MCw2ICsxNjAsNjggQEAKIAlyZXR1cm4gc2VuZF9zdGF0dXM7CiB9CiAKK3ZvaWQgeGFwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCkKK3sKKwlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChpZCkpOworCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIGxvdyk7Cit9CisKK3U2NCB4YXBpY19pY3JfcmVhZCh2b2lkKQoreworCXUzMiBpY3IxLCBpY3IyOworCisJaWNyMiA9IGFwaWNfcmVhZChBUElDX0lDUjIpOworCWljcjEgPSBhcGljX3JlYWQoQVBJQ19JQ1IpOworCisJcmV0dXJuIGljcjEgfCAoKHU2NClpY3IyIDw8IDMyKTsKK30KKworc3RhdGljIHN0cnVjdCBhcGljX29wcyB4YXBpY19vcHMgPSB7CisJLnJlYWQgPSBuYXRpdmVfYXBpY19tZW1fcmVhZCwKKwkud3JpdGUgPSBuYXRpdmVfYXBpY19tZW1fd3JpdGUsCisJLmljcl9yZWFkID0geGFwaWNfaWNyX3JlYWQsCisJLmljcl93cml0ZSA9IHhhcGljX2ljcl93cml0ZSwKKwkud2FpdF9pY3JfaWRsZSA9IHhhcGljX3dhaXRfaWNyX2lkbGUsCisJLnNhZmVfd2FpdF9pY3JfaWRsZSA9IHNhZmVfeGFwaWNfd2FpdF9pY3JfaWRsZSwKK307CisKK3N0cnVjdCBhcGljX29wcyBfX3JlYWRfbW9zdGx5ICphcGljX29wcyA9ICZ4YXBpY19vcHM7CitFWFBPUlRfU1lNQk9MX0dQTChhcGljX29wcyk7CisKK3N0YXRpYyB2b2lkIHgyYXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCit7CisJLyogbm8gbmVlZCB0byB3YWl0IGZvciBpY3IgaWRsZSBpbiB4MmFwaWMgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1MzIgc2FmZV94MmFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQoreworCS8qIG5vIG5lZWQgdG8gd2FpdCBmb3IgaWNyIGlkbGUgaW4geDJhcGljICovCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgeDJhcGljX2ljcl93cml0ZSh1MzIgbG93LCB1MzIgaWQpCit7CisJd3Jtc3JsKEFQSUNfQkFTRV9NU1IgKyAoQVBJQ19JQ1IgPj4gNCksICgoX191NjQpIGlkKSA8PCAzMiB8IGxvdyk7Cit9CisKK3U2NCB4MmFwaWNfaWNyX3JlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXJkbXNybChBUElDX0JBU0VfTVNSICsgKEFQSUNfSUNSID4+IDQpLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXBpY19vcHMgeDJhcGljX29wcyA9IHsKKwkucmVhZCA9IG5hdGl2ZV9hcGljX21zcl9yZWFkLAorCS53cml0ZSA9IG5hdGl2ZV9hcGljX21zcl93cml0ZSwKKwkuaWNyX3JlYWQgPSB4MmFwaWNfaWNyX3JlYWQsCisJLmljcl93cml0ZSA9IHgyYXBpY19pY3Jfd3JpdGUsCisJLndhaXRfaWNyX2lkbGUgPSB4MmFwaWNfd2FpdF9pY3JfaWRsZSwKKwkuc2FmZV93YWl0X2ljcl9pZGxlID0gc2FmZV94MmFwaWNfd2FpdF9pY3JfaWRsZSwKK307CisKIC8qKgogICogZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgLSBlbmFibGUgTk1JIHRocm91Z2ggbG9jYWwgdmVjdG9yIHRhYmxlIDAKICAqLwpAQCAtMTQ5LDYgKzIzMSwxMSBAQAogCiAJLyogdW5tYXNrIGFuZCBzZXQgdG8gTk1JICovCiAJdiA9IEFQSUNfRE1fTk1JOworCisJLyogTGV2ZWwgdHJpZ2dlcmVkIGZvciA4MjQ4OURYICgzMmJpdCBtb2RlKSAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQorCQl2IHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CisKIAlhcGljX3dyaXRlKEFQSUNfTFZUMCwgdik7CiB9CiAKQEAgLTE1NywxNCArMjQ0LDI4IEBACiAgKi8KIGludCBsYXBpY19nZXRfbWF4bHZ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHYsIG1heGx2dDsKKwl1bnNpZ25lZCBpbnQgdjsKIAogCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCW1heGx2dCA9IEdFVF9BUElDX01BWExWVCh2KTsKLQlyZXR1cm4gbWF4bHZ0OworCS8qCisJICogLSB3ZSBhbHdheXMgaGF2ZSBBUElDIGludGVncmF0ZWQgb24gNjRiaXQgbW9kZQorCSAqIC0gODI0ODlEWHMgZG8gbm90IHJlcG9ydCAjIG9mIExWVCBlbnRyaWVzCisJICovCisJcmV0dXJuIEFQSUNfSU5URUdSQVRFRChHRVRfQVBJQ19WRVJTSU9OKHYpKSA/IEdFVF9BUElDX01BWExWVCh2KSA6IDI7CiB9CiAKIC8qCisgKiBMb2NhbCBBUElDIHRpbWVyCisgKi8KKworLyogQ2xvY2sgZGl2aXNvciAqLworI2lmZGVmIENPTkZHX1g4Nl82NAorI2RlZmluZSBBUElDX0RJVklTT1IgMQorI2Vsc2UKKyNkZWZpbmUgQVBJQ19ESVZJU09SIDE2CisjZW5kaWYKKworLyoKICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbG9jYWwgQVBJQyB0aW1lciwgd2l0aCBhIHRpbWVvdXQgb2YKICAqICdjbG9ja3MnIEFQSUMgYnVzIGNsb2NrLiBEdXJpbmcgY2FsaWJyYXRpb24gd2UgYWN0dWFsbHkgY2FsbAogICogdGhpcyBmdW5jdGlvbiB0d2ljZSBvbiB0aGUgYm9vdCBDUFUsIG9uY2Ugd2l0aCBhIGJvZ3VzIHRpbWVvdXQKQEAgLTE3NCw3ICsyNzUsNiBAQAogICogV2UgZG8gcmVhZHMgYmVmb3JlIHdyaXRlcyBldmVuIGlmIHVubmVjZXNzYXJ5LCB0byBnZXQgYXJvdW5kIHRoZQogICogUDUgQVBJQyBkb3VibGUgd3JpdGUgYnVnLgogICovCi0KIHN0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MsIGludCBvbmVzaG90LCBpbnQgaXJxZW4pCiB7CiAJdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZTsKQEAgLTE4Miw2ICsyODIsOSBAQAogCWx2dHRfdmFsdWUgPSBMT0NBTF9USU1FUl9WRUNUT1I7CiAJaWYgKCFvbmVzaG90KQogCQlsdnR0X3ZhbHVlIHw9IEFQSUNfTFZUX1RJTUVSX1BFUklPRElDOworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQorCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7CisKIAlpZiAoIWlycWVuKQogCQlsdnR0X3ZhbHVlIHw9IEFQSUNfTFZUX01BU0tFRDsKIApAQCAtMTkxLDEyICsyOTQsMTIgQEAKIAkgKiBEaXZpZGUgUElDTEsgYnkgMTYKIAkgKi8KIAl0bXBfdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3dyaXRlKEFQSUNfVERDUiwgKHRtcF92YWx1ZQotCQkJCSYgfihBUElDX1REUl9ESVZfMSB8IEFQSUNfVERSX0RJVl9UTUJBU0UpKQotCQkJCXwgQVBJQ19URFJfRElWXzE2KTsKKwlhcGljX3dyaXRlKEFQSUNfVERDUiwKKwkJKHRtcF92YWx1ZSAmIH4oQVBJQ19URFJfRElWXzEgfCBBUElDX1REUl9ESVZfVE1CQVNFKSkgfAorCQlBUElDX1REUl9ESVZfMTYpOwogCiAJaWYgKCFvbmVzaG90KQotCQlhcGljX3dyaXRlKEFQSUNfVE1JQ1QsIGNsb2Nrcyk7CisJCWFwaWNfd3JpdGUoQVBJQ19UTUlDVCwgY2xvY2tzIC8gQVBJQ19ESVZJU09SKTsKIH0KIAogLyoKQEAgLTIwNCw2ICszMDcsOSBAQAogICoKICAqIFZlY3RvciBtYXBwaW5ncyBhcmUgaGFyZCBjb2RlZC4gT24gSzggb25seSBvZmZzZXQgMCAoQVBJQzUwMCkgYW5kCiAgKiBNQ0UgaW50ZXJydXB0cyBhcmUgc3VwcG9ydGVkLiBUaHVzIE1DRSBvZmZzZXQgbXVzdCBiZSBzZXQgdG8gMC4KKyAqCisgKiBJZiBtYXNrPTEsIHRoZSBMVlQgZW50cnkgZG9lcyBub3QgZ2VuZXJhdGUgaW50ZXJydXB0cyB3aGlsZSBtYXNrPTAKKyAqIGVuYWJsZXMgdGhlIHZlY3Rvci4gU2VlIGFsc28gdGhlIEJLREdzLgogICovCiAKICNkZWZpbmUgQVBJQ19FSUxWVF9MVlRPRkZfTUNFIDAKQEAgLTIyOCw2ICszMzQsNyBAQAogCXNldHVwX0FQSUNfZWlsdnQoQVBJQ19FSUxWVF9MVlRPRkZfSUJTLCB2ZWN0b3IsIG1zZ190eXBlLCBtYXNrKTsKIAlyZXR1cm4gQVBJQ19FSUxWVF9MVlRPRkZfSUJTOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0dXBfQVBJQ19laWx2dF9pYnMpOwogCiAvKgogICogUHJvZ3JhbSB0aGUgbmV4dCBldmVudCwgcmVsYXRpdmUgdG8gbm93CkBAIC0zNjYsNyArNDczLDcgQEAKIAlsYXBpY19jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9CiAJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhGLCAmbGFwaWNfY2xvY2tldmVudCk7CiAKLQljYWxpYnJhdGlvbl9yZXN1bHQgPSByZXN1bHQgLyBIWjsKKwljYWxpYnJhdGlvbl9yZXN1bHQgPSAocmVzdWx0ICogQVBJQ19ESVZJU09SKSAvIEhaOwogCiAJLyoKIAkgKiBEbyBhIHNhbml0eSBjaGVjayBvbiB0aGUgQVBJQyBjYWxpYnJhdGlvbiByZXN1bHQKQEAgLTM4OCwxMCArNDk1LDEwIEBACiB2b2lkIF9faW5pdCBzZXR1cF9ib290X0FQSUNfY2xvY2sodm9pZCkKIHsKIAkvKgotCSAqIFRoZSBsb2NhbCBhcGljIHRpbWVyIGNhbiBiZSBkaXNhYmxlZCB2aWEgdGhlIGtlcm5lbCBjb21tYW5kbGluZS4KLQkgKiBSZWdpc3RlciB0aGUgbGFwaWMgdGltZXIgYXMgYSBkdW1teSBjbG9jayBldmVudCBzb3VyY2Ugb24gU01QCi0JICogc3lzdGVtcywgc28gdGhlIGJyb2FkY2FzdCBtZWNoYW5pc20gaXMgdXNlZC4gT24gVVAgc3lzdGVtcyBzaW1wbHkKLQkgKiBpZ25vcmUgaXQuCisJICogVGhlIGxvY2FsIGFwaWMgdGltZXIgY2FuIGJlIGRpc2FibGVkIHZpYSB0aGUga2VybmVsCisJICogY29tbWFuZGxpbmUgb3IgZnJvbSB0aGUgQ1BVIGRldGVjdGlvbiBjb2RlLiBSZWdpc3RlciB0aGUgbGFwaWMKKwkgKiB0aW1lciBhcyBhIGR1bW15IGNsb2NrIGV2ZW50IHNvdXJjZSBvbiBTTVAgc3lzdGVtcywgc28gdGhlCisJICogYnJvYWRjYXN0IG1lY2hhbmlzbSBpcyB1c2VkLiBPbiBVUCBzeXN0ZW1zIHNpbXBseSBpZ25vcmUgaXQuCiAJICovCiAJaWYgKGRpc2FibGVfYXBpY190aW1lcikgewogCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgQVBJQyB0aW1lclxuIik7CkBAIC00MDMsNyArNTEwLDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy5cbiIpOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy5cbiIKKwkJICAgICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7CisKIAlpZiAoY2FsaWJyYXRlX0FQSUNfY2xvY2soKSkgewogCQkvKiBObyBicm9hZGNhc3Qgb24gVVAgISAqLwogCQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpCkBAIC00MjIsNiArNTMxLDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBJQyB0aW1lciByZWdpc3RlcmVkIGFzIGR1bW15LCIKIAkJCSIgZHVlIHRvIG5taV93YXRjaGRvZz0lZCFcbiIsIG5taV93YXRjaGRvZyk7CiAKKwkvKiBTZXR1cCB0aGUgbGFwaWMgb3IgcmVxdWVzdCB0aGUgYnJvYWRjYXN0ICovCiAJc2V0dXBfQVBJQ190aW1lcigpOwogfQogCkBAIC00NjAsNyArNTcwLDExIEBACiAJLyoKIAkgKiB0aGUgTk1JIGRlYWRsb2NrLWRldGVjdG9yIHVzZXMgdGhpcy4KIAkgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CiAJYWRkX3BkYShhcGljX3RpbWVyX2lycXMsIDEpOworI2Vsc2UKKwlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOworI2VuZGlmCiAKIAlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKIH0KQEAgLTQ5MSw2ICs2MDUsNyBAQAogCWlycV9lbnRlcigpOwogCWxvY2FsX2FwaWNfdGltZXJfaW50ZXJydXB0KCk7CiAJaXJxX2V4aXQoKTsKKwogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKQEAgLTU0NCw2ICs2NTksMTMgQEAKIAkJYXBpY193cml0ZShBUElDX0xWVFBDLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiAKKwkvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwpIHx8IGRlZmluZWQoWDg2X01DRV9JTlRFTCkKKwlpZiAobWF4bHZ0ID49IDUpIHsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworCQlhcGljX3dyaXRlKEFQSUNfTFZUVEhNUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorI2VuZGlmCiAJLyoKIAkgKiBDbGVhbiBBUElDIHN0YXRlIGZvciBvdGhlciBPU3M6CiAJICovCkBAIC01NTQsOCArNjc2LDE0IEBACiAJCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIEFQSUNfTFZUX01BU0tFRCk7CiAJaWYgKG1heGx2dCA+PSA0KQogCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfTFZUX01BU0tFRCk7Ci0JYXBpY193cml0ZShBUElDX0VTUiwgMCk7Ci0JYXBpY19yZWFkKEFQSUNfRVNSKTsKKworCS8qIEludGVncmF0ZWQgQVBJQyAoITgyNDg5RFgpID8gKi8KKwlpZiAobGFwaWNfaXNfaW50ZWdyYXRlZCgpKSB7CisJCWlmIChtYXhsdnQgPiAzKQorCQkJLyogQ2xlYXIgRVNSIGR1ZSB0byBQZW50aXVtIGVycmF0YSAzQVAgYW5kIDExQVAgKi8KKwkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlhcGljX3JlYWQoQVBJQ19FU1IpOworCX0KIH0KIAogLyoqCkBAIC01NzQsOCArNzAyLDI4IEBACiAJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKIAl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKIAlhcGljX3dyaXRlKEFQSUNfU1BJViwgdmFsdWUpOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qCisJICogV2hlbiBMQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCwKKwkgKiByZXN0b3JlIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKwkgKi8KKwlpZiAoZW5hYmxlZF92aWFfYXBpY2Jhc2UpIHsKKwkJdW5zaWduZWQgaW50IGwsIGg7CisKKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CisJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwl9CisjZW5kaWYKIH0KIAorLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdCBkaXNhYmxlIGl0IGRvd24gYmVmb3JlCisgKiByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4gIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZAorICogbm90IHBvd2VyLW9mZi4gIEFkZGl0aW9uYWxseSBjbGVhciBhbGwgTFZUIGVudHJpZXMgYmVmb3JlIGRpc2FibGVfbG9jYWxfQVBJQworICogZm9yIHRoZSBjYXNlIHdoZXJlIExpbnV4IGRpZG4ndCBlbmFibGUgdGhlIExBUElDLgorICovCiB2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU4NSw3ICs3MzMsMTMgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCWRpc2FibGVfbG9jYWxfQVBJQygpOworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAoIWVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQljbGVhcl9sb2NhbF9BUElDKCk7CisJZWxzZQorI2VuZGlmCisJCWRpc2FibGVfbG9jYWxfQVBJQygpOworCiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC02MjksMTAgKzc4MywxMCBAQAogCS8qCiAJICogVGhlIElEIHJlZ2lzdGVyIGlzIHJlYWQvd3JpdGUgaW4gYSByZWFsIEFQSUMuCiAJICovCi0JcmVnMCA9IHJlYWRfYXBpY19pZCgpOworCXJlZzAgPSBhcGljX3JlYWQoQVBJQ19JRCk7CiAJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgSUQ6ICV4XG4iLCByZWcwKTsKIAlhcGljX3dyaXRlKEFQSUNfSUQsIHJlZzAgXiBBUElDX0lEX01BU0spOwotCXJlZzEgPSByZWFkX2FwaWNfaWQoKTsKKwlyZWcxID0gYXBpY19yZWFkKEFQSUNfSUQpOwogCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIElEOiAleFxuIiwgcmVnMSk7CiAJYXBpY193cml0ZShBUElDX0lELCByZWcwKTsKIAlpZiAocmVnMSAhPSAocmVnMCBeIEFQSUNfSURfTUFTSykpCkBAIC02NTYsOCArODEwLDExIEBACiAgKi8KIHZvaWQgX19pbml0IHN5bmNfQXJiX0lEcyh2b2lkKQogewotCS8qIFVuc3VwcG9ydGVkIG9uIFA0IC0gc2VlIEludGVsIERldi4gTWFudWFsIFZvbC4gMywgQ2guIDguNi4xICovCi0JaWYgKG1vZGVybl9hcGljKCkpCisJLyoKKwkgKiBVbnN1cHBvcnRlZCBvbiBQNCAtIHNlZSBJbnRlbCBEZXYuIE1hbnVhbCBWb2wuIDMsIENoLiA4LjYuMSBBbmQgbm90CisJICogbmVlZGVkIG9uIEFNRC4KKwkgKi8KKwlpZiAobW9kZXJuX2FwaWMoKSB8fCBib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpCiAJCXJldHVybjsKIAogCS8qCkBAIC02NjYsOCArODIzLDggQEAKIAlhcGljX3dhaXRfaWNyX2lkbGUoKTsKIAogCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJTeW5jaHJvbml6aW5nIEFyYiBJRHMuXG4iKTsKLQlhcGljX3dyaXRlKEFQSUNfSUNSLCBBUElDX0RFU1RfQUxMSU5DIHwgQVBJQ19JTlRfTEVWRUxUUklHCi0JCQkJfCBBUElDX0RNX0lOSVQpOworCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIEFQSUNfREVTVF9BTExJTkMgfAorCQkJQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19ETV9JTklUKTsKIH0KIAogLyoKQEAgLTY4NCw4ICs4NDEsNiBAQAogCWlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFjcHVfaGFzX2FwaWMpCiAJCXJldHVybjsKIAotCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKLQogCS8qCiAJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KIAkgKi8KQEAgLTY5Nyw3ICs4NTIsMTUgQEAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwogCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7Ci0JdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qIFRoaXMgYml0IGlzIHJlc2VydmVkIG9uIFA0L1hlb24gYW5kIHNob3VsZCBiZSBjbGVhcmVkICovCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKwllbHNlCisjZW5kaWYKKwkJdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwogCXZhbHVlIHw9IFNQVVJJT1VTX0FQSUNfVkVDVE9SOwogCWFwaWNfd3JpdGUoQVBJQ19TUElWLCB2YWx1ZSk7CiAKQEAgLTcwNiw5ICs4NjksNTAgQEAKIAkgKi8KIAlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19ETV9FWFRJTlQpOwogCXZhbHVlID0gQVBJQ19ETV9OTUk7CisJaWYgKCFsYXBpY19pc19pbnRlZ3JhdGVkKCkpCQkvKiA4MjQ4OURYICovCisJCXZhbHVlIHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CiAJYXBpY193cml0ZShBUElDX0xWVDEsIHZhbHVlKTsKIH0KIAorc3RhdGljIHZvaWQgX19jcHVpbml0IGxhcGljX3NldHVwX2Vzcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgb2xkdmFsdWUsIHZhbHVlLCBtYXhsdnQ7CisJaWYgKGxhcGljX2lzX2ludGVncmF0ZWQoKSAmJiAhZXNyX2Rpc2FibGUpIHsKKwkJaWYgKGVzcl9kaXNhYmxlKSB7CisJCQkvKgorCQkJICogU29tZXRoaW5nIHVudHJhY2VhYmxlIGlzIGNyZWF0aW5nIGJhZCBpbnRlcnJ1cHRzIG9uCisJCQkgKiBzZWNvbmRhcnkgcXVhZHMgLi4uIGZvciB0aGUgbW9tZW50LCBqdXN0IGxlYXZlIHRoZQorCQkJICogRVNSIGRpc2FibGVkIC0gd2UgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggdGhlCisJCQkgKiBlcnJvcnMgYW55d2F5IC0gbWJsaWdoCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIkxlYXZpbmcgRVNSIGRpc2FibGVkLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogITgyNDg5RFggKi8KKwkJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOworCQlpZiAobWF4bHZ0ID4gMykJCS8qIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4gKi8KKwkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlvbGR2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0VTUik7CisKKwkJLyogZW5hYmxlcyBzZW5kaW5nIGVycm9ycyAqLworCQl2YWx1ZSA9IEVSUk9SX0FQSUNfVkVDVE9SOworCQlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCB2YWx1ZSk7CisJCS8qCisJCSAqIHNwZWMgc2F5cyBjbGVhciBlcnJvcnMgYWZ0ZXIgZW5hYmxpbmcgdmVjdG9yLgorCQkgKi8KKwkJaWYgKG1heGx2dCA+IDMpCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCQlpZiAodmFsdWUgIT0gb2xkdmFsdWUpCisJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJFU1IgdmFsdWUgYmVmb3JlIGVuYWJsaW5nICIKKwkJCQkidmVjdG9yOiAweCUwOGx4ICBhZnRlcjogMHglMDhseFxuIiwKKwkJCQlvbGR2YWx1ZSwgdmFsdWUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIEVTUiBmb3IgODI0ODlEWC5cbiIpOworCX0KK30KKworCiAvKioKICAqIHNldHVwX2xvY2FsX0FQSUMgLSBzZXR1cCB0aGUgbG9jYWwgQVBJQwogICovCkBAIC04MTQsMjUgKzEwMTgsMTQzIEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IGxhcGljX3NldHVwX2Vzcih2b2lkKQotewotCXVuc2lnbmVkIG1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKLQotCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIEVSUk9SX0FQSUNfVkVDVE9SKTsKLQkvKgotCSAqIHNwZWMgc2F5cyBjbGVhciBlcnJvcnMgYWZ0ZXIgZW5hYmxpbmcgdmVjdG9yLgotCSAqLwotCWlmIChtYXhsdnQgPiAzKQotCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKLX0KLQogdm9pZCBfX2NwdWluaXQgZW5kX2xvY2FsX0FQSUNfc2V0dXAodm9pZCkKIHsKIAlsYXBpY19zZXR1cF9lc3IoKTsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwl7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsKKwkJLyogRGlzYWJsZSB0aGUgbG9jYWwgYXBpYyB0aW1lciAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCQl2YWx1ZSB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwkJYXBpY193cml0ZShBUElDX0xWVFQsIHZhbHVlKTsKKwl9CisjZW5kaWYKKwogCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwogCWFwaWNfcG1fYWN0aXZhdGUoKTsKIH0KIAordm9pZCBjaGVja194MmFwaWModm9pZCkKK3sKKwlpbnQgbXNyLCBtc3IyOworCisJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zciwgbXNyMik7CisKKwlpZiAobXNyICYgWDJBUElDX0VOQUJMRSkgeworCQlwcmludGsoIngyYXBpYyBlbmFibGVkIGJ5IEJJT1MsIHN3aXRjaGluZyB0byB4MmFwaWMgb3BzXG4iKTsKKwkJeDJhcGljX3ByZWVuYWJsZWQgPSB4MmFwaWMgPSAxOworCQlhcGljX29wcyA9ICZ4MmFwaWNfb3BzOworCX0KK30KKwordm9pZCBlbmFibGVfeDJhcGljKHZvaWQpCit7CisJaW50IG1zciwgbXNyMjsKKworCXJkbXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IsIG1zcjIpOworCWlmICghKG1zciAmIFgyQVBJQ19FTkFCTEUpKSB7CisJCXByaW50aygiRW5hYmxpbmcgeDJhcGljXG4iKTsKKwkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zciB8IFgyQVBJQ19FTkFCTEUsIDApOworCX0KK30KKwordm9pZCBlbmFibGVfSVJfeDJhcGljKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNwdV9oYXNfeDJhcGljKQorCQlyZXR1cm47CisKKwlpZiAoIXgyYXBpY19wcmVlbmFibGVkICYmIGRpc2FibGVfeDJhcGljKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJTa2lwcGVkIGVuYWJsaW5nIHgyYXBpYyBhbmQgSW50ZXJydXB0LXJlbWFwcGluZyAiCisJCSAgICAgICAiYmVjYXVzZSBvZiBub3gyYXBpY1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoeDJhcGljX3ByZWVuYWJsZWQgJiYgZGlzYWJsZV94MmFwaWMpCisJCXBhbmljKCJCaW9zIGFscmVhZHkgZW5hYmxlZCB4MmFwaWMsIGNhbid0IGVuZm9yY2Ugbm94MmFwaWMiKTsKKworCWlmICgheDJhcGljX3ByZWVuYWJsZWQgJiYgc2tpcF9pb2FwaWNfc2V0dXApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIlNraXBwZWQgZW5hYmxpbmcgeDJhcGljIGFuZCBJbnRlcnJ1cHQtcmVtYXBwaW5nICIKKwkJICAgICAgICJiZWNhdXNlIG9mIHNraXBwaW5nIGlvLWFwaWMgc2V0dXBcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZG1hcl90YWJsZV9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiZG1hcl90YWJsZV9pbml0KCkgZmFpbGVkIHdpdGggJWQ6XG4iLCByZXQpOworCisJCWlmICh4MmFwaWNfcHJlZW5hYmxlZCkKKwkJCXBhbmljKCJ4MmFwaWMgZW5hYmxlZCBieSBiaW9zLiBCdXQgSVIgZW5hYmxpbmcgZmFpbGVkIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiTm90IGVuYWJsaW5nIHgyYXBpYyxJbnRyLXJlbWFwcGluZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbWFza184MjU5QSgpOworCXNhdmVfbWFza19JT19BUElDX3NldHVwKCk7CisKKwlyZXQgPSBlbmFibGVfaW50cl9yZW1hcHBpbmcoMSk7CisKKwlpZiAocmV0ICYmIHgyYXBpY19wcmVlbmFibGVkKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcGFuaWMoIngyYXBpYyBlbmFibGVkIGJ5IGJpb3MuIEJ1dCBJUiBlbmFibGluZyBmYWlsZWQiKTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIGVuZDsKKworCWlmICgheDJhcGljKSB7CisJCXgyYXBpYyA9IDE7CisJCWFwaWNfb3BzID0gJngyYXBpY19vcHM7CisJCWVuYWJsZV94MmFwaWMoKTsKKwl9CitlbmQ6CisJaWYgKHJldCkKKwkJLyoKKwkJICogSVIgZW5hYmxpbmcgZmFpbGVkCisJCSAqLworCQlyZXN0b3JlX0lPX0FQSUNfc2V0dXAoKTsKKwllbHNlCisJCXJlaW5pdF9pbnRyX3JlbWFwcGVkX0lPX0FQSUMoeDJhcGljX3ByZWVuYWJsZWQpOworCisJdW5tYXNrXzgyNTlBKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKCFyZXQpIHsKKwkJaWYgKCF4MmFwaWNfcHJlZW5hYmxlZCkKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiRW5hYmxlZCB4MmFwaWMgYW5kIGludGVycnVwdC1yZW1hcHBpbmdcbiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIkVuYWJsZWQgSW50ZXJydXB0LXJlbWFwcGluZ1xuIik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkZhaWxlZCB0byBlbmFibGUgSW50ZXJydXB0LXJlbWFwcGluZyBhbmQgeDJhcGljXG4iKTsKKyNlbHNlCisJaWYgKCFjcHVfaGFzX3gyYXBpYykKKwkJcmV0dXJuOworCisJaWYgKHgyYXBpY19wcmVlbmFibGVkKQorCQlwYW5pYygieDJhcGljIGVuYWJsZWQgcHJpb3IgT1MgaGFuZG92ZXIsIgorCQkgICAgICAiIGVuYWJsZSBDT05GSUdfSU5UUl9SRU1BUCIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIENPTkZJR19JTlRSX1JFTUFQIGZvciBlbmFibGluZyBpbnRyLXJlbWFwcGluZyAiCisJICAgICAgICIgYW5kIHgyYXBpY1xuIik7CisjZW5kaWYKKworCXJldHVybjsKK30KKwogLyoKICAqIERldGVjdCBhbmQgZW5hYmxlIGxvY2FsIEFQSUNzIG9uIG5vbi1TTVAgYm9hcmRzLgogICogT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5IEtlaXIgRnJhc2VyLgpAQCAtODcyLDcgKzExOTQsNyBAQAogCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKIAkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgogCSAqLwotCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKTsKKwlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKIH0KIAogLyoqCkBAIC04ODAsNiArMTIwMiwxMSBAQAogICovCiB2b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKIHsKKwlpZiAoeDJhcGljKSB7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCB0aGVuIHNldCB1cCBhIGZha2UgYWxsCiAJICogemVyb2VzIHBhZ2UgdG8gc2ltdWxhdGUgdGhlIGxvY2FsIEFQSUMgYW5kIGFub3RoZXIKQEAgLTg5OSwxMyArMTIyNiwxNSBAQAogCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKIAkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgogCSAqLwotCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKTsKKwlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKIH0KIAogLyoKICAqIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIElPLUFQSUMgYW5kIEFQSUMgaGFyZHdhcmUgaWYgdGhpcyBpcwogICogYSBVUCBrZXJuZWwuCiAgKi8KK2ludCBhcGljX3ZlcnNpb25bTUFYX0FQSUNTXTsKKwogaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yKHZvaWQpCiB7CiAJaWYgKGRpc2FibGVfYXBpYykgewpAQCAtOTE4LDYgKzEyNDcsOSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJZW5hYmxlX0lSX3gyYXBpYygpOworCXNldHVwX2FwaWNfcm91dGluZygpOworCiAJdmVyaWZ5X2xvY2FsX0FQSUMoKTsKIAogCWNvbm5lY3RfYnNwX0FQSUMoKTsKQEAgLTEwMDQsMTcgKzEzMzYsNTcgQEAKIH0KIAogLyoqCi0gKiAgKiBjb25uZWN0X2JzcF9BUElDIC0gYXR0YWNoIHRoZSBBUElDIHRvIHRoZSBpbnRlcnJ1cHQgc3lzdGVtCi0gKiAgICovCisgKiBjb25uZWN0X2JzcF9BUElDIC0gYXR0YWNoIHRoZSBBUElDIHRvIHRoZSBpbnRlcnJ1cHQgc3lzdGVtCisgKi8KIHZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWYgKHBpY19tb2RlKSB7CisJCS8qCisJCSAqIERvIG5vdCB0cnVzdCB0aGUgbG9jYWwgQVBJQyBiZWluZyBlbXB0eSBhdCBib290dXAuCisJCSAqLworCQljbGVhcl9sb2NhbF9BUElDKCk7CisJCS8qCisJCSAqIFBJQyBtb2RlLCBlbmFibGUgQVBJQyBtb2RlIGluIHRoZSBJTUNSLCBpLmUuICBjb25uZWN0IEJTUCdzCisJCSAqIGxvY2FsIEFQSUMgdG8gSU5UIGFuZCBOTUkgbGluZXMuCisJCSAqLworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJsZWF2aW5nIFBJQyBtb2RlLCAiCisJCQkJImVuYWJsaW5nIEFQSUMgbW9kZS5cbiIpOworCQlvdXRiKDB4NzAsIDB4MjIpOworCQlvdXRiKDB4MDEsIDB4MjMpOworCX0KKyNlbmRpZgogCWVuYWJsZV9hcGljX21vZGUoKTsKIH0KIAorLyoqCisgKiBkaXNjb25uZWN0X2JzcF9BUElDIC0gZGV0YWNoIHRoZSBBUElDIGZyb20gdGhlIGludGVycnVwdCBzeXN0ZW0KKyAqIEB2aXJ0X3dpcmVfc2V0dXA6CWluZGljYXRlcywgd2hldGhlciB2aXJ0dWFsIHdpcmUgbW9kZSBpcyBzZWxlY3RlZAorICoKKyAqIFZpcnR1YWwgd2lyZSBtb2RlIGlzIG5lY2Vzc2FyeSB0byBkZWxpdmVyIGxlZ2FjeSBpbnRlcnJ1cHRzIGV2ZW4gd2hlbiB0aGUKKyAqIEFQSUMgaXMgZGlzYWJsZWQuCisgKi8KIHZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKQogeworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3Qgb25seSBvbgorCQkgKiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQyBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcKKwkJICogSVBJcywgd29uJ3Qgd29yayBiZXlvbmQgdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUKKwkJICogSU5JVCBJUElzLgorCQkgKi8KKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgorCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOworCQlvdXRiKDB4NzAsIDB4MjIpOworCQlvdXRiKDB4MDAsIDB4MjMpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKIAkvKiBHbyBiYWNrIHRvIFZpcnR1YWwgV2lyZSBjb21wYXRpYmlsaXR5IG1vZGUgKi8KLQl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCiAJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKQEAgLTEwNDAsNyArMTQxMiwxMCBAQAogCQlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiAKLQkvKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZCBlbmFibGVkICovCisJLyoKKwkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwKKwkgKiBubWkgYW5kIGVuYWJsZWQKKwkgKi8KIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOwogCXZhbHVlICY9IH4oQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CiAJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CkBAIC0xMDU1LDkgKzE0MzAsMjAgQEAKIAlpbnQgY3B1OwogCWNwdW1hc2tfdCB0bXBfbWFwOwogCisJLyoKKwkgKiBWYWxpZGF0ZSB2ZXJzaW9uCisJICovCisJaWYgKHZlcnNpb24gPT0gMHgwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISAiCisJCQkJImZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQkJdmVyc2lvbik7CisJCXZlcnNpb24gPSAweDEwOworCX0KKwlhcGljX3ZlcnNpb25bYXBpY2lkXSA9IHZlcnNpb247CisKIAlpZiAobnVtX3Byb2Nlc3NvcnMgPj0gTlJfQ1BVUykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBOUl9DUFVTIGxpbWl0IG9mICVpIHJlYWNoZWQuIgotCQkgICAgICAgIiBQcm9jZXNzb3IgaWdub3JlZC5cbiIsIE5SX0NQVVMpOworCQkJIiAgUHJvY2Vzc29yIGlnbm9yZWQuXG4iLCBOUl9DUFVTKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA3Nyw2ICsxNDYzLDI5IEBACiAJaWYgKGFwaWNpZCA+IG1heF9waHlzaWNhbF9hcGljaWQpCiAJCW1heF9waHlzaWNhbF9hcGljaWQgPSBhcGljaWQ7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLyoKKwkgKiBXb3VsZCBiZSBwcmVmZXJhYmxlIHRvIHN3aXRjaCB0byBiaWdzbXAgd2hlbiBDT05GSUdfSE9UUExVR19DUFU9eQorCSAqIGJ1dCB3ZSBuZWVkIHRvIHdvcmsgb3RoZXIgZGVwZW5kZW5jaWVzIGxpa2UgU01QX1NVU1BFTkQgZXRjCisJICogYmVmb3JlIHRoaXMgY2FuIGJlIGRvbmUgd2l0aG91dCBzb21lIGNvbmZ1c2lvbi4KKwkgKiBpZiAoQ1BVX0hPVFBMVUdfRU5BQkxFRCB8fCBudW1fcHJvY2Vzc29ycyA+IDgpCisJICogICAgICAgLSBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CisJICovCisJaWYgKG1heF9waHlzaWNhbF9hcGljaWQgPj0gOCkgeworCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlpZiAoIUFQSUNfWEFQSUModmVyc2lvbikpIHsKKwkJCQlkZWZfdG9fYmlnc21wID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIElmIFA0IGFuZCBhYm92ZSBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWRlZl90b19iaWdzbXAgPSAxOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfU01QKSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCiAJLyogYXJlIHdlIGJlaW5nIGNhbGxlZCBlYXJseSBpbiBrZXJuZWwgc3RhcnR1cD8gKi8KIAlpZiAoZWFybHlfcGVyX2NwdV9wdHIoeDg2X2NwdV90b19hcGljaWQpKSB7CiAJCXUxNiAqY3B1X3RvX2FwaWNpZCA9IGVhcmx5X3Blcl9jcHVfcHRyKHg4Nl9jcHVfdG9fYXBpY2lkKTsKQEAgLTEwODgsMjAgKzE0OTcsMjggQEAKIAkJcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KSA9IGFwaWNpZDsKIAkJcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBjcHUpID0gYXBpY2lkOwogCX0KKyNlbmRpZgogCiAJY3B1X3NldChjcHUsIGNwdV9wb3NzaWJsZV9tYXApOwogCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOwogfQogCitpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfYXBpY19pZCgpOworfQorCiAvKgogICogUG93ZXIgbWFuYWdlbWVudAogICovCiAjaWZkZWYgQ09ORklHX1BNCiAKIHN0YXRpYyBzdHJ1Y3QgewotCS8qICdhY3RpdmUnIGlzIHRydWUgaWYgdGhlIGxvY2FsIEFQSUMgd2FzIGVuYWJsZWQgYnkgdXMgYW5kCi0JICAgbm90IHRoZSBCSU9TOyB0aGlzIHNpZ25pZmllcyB0aGF0IHdlIGFyZSBhbHNvIHJlc3BvbnNpYmxlCi0JICAgZm9yIGRpc2FibGluZyBpdCBiZWZvcmUgZW50ZXJpbmcgYXBtL2FjcGkgc3VzcGVuZCAqLworCS8qCisJICogJ2FjdGl2ZScgaXMgdHJ1ZSBpZiB0aGUgbG9jYWwgQVBJQyB3YXMgZW5hYmxlZCBieSB1cyBhbmQKKwkgKiBub3QgdGhlIEJJT1M7IHRoaXMgc2lnbmlmaWVzIHRoYXQgd2UgYXJlIGFsc28gcmVzcG9uc2libGUKKwkgKiBmb3IgZGlzYWJsaW5nIGl0IGJlZm9yZSBlbnRlcmluZyBhcG0vYWNwaSBzdXNwZW5kCisJICovCiAJaW50IGFjdGl2ZTsKIAkvKiByL3cgYXBpYyBmaWVsZHMgKi8KIAl1bnNpZ25lZCBpbnQgYXBpY19pZDsKQEAgLTExMjksNyArMTU0Niw3IEBACiAKIAltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAKLQlhcGljX3BtX3N0YXRlLmFwaWNfaWQgPSByZWFkX2FwaWNfaWQoKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfaWQgPSBhcGljX3JlYWQoQVBJQ19JRCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3Rhc2twcmkgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfbGRyID0gYXBpY19yZWFkKEFQSUNfTERSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfZGZyID0gYXBpY19yZWFkKEFQSUNfREZSKTsKQEAgLTExNDIsMTAgKzE1NTksMTEgQEAKIAlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyID0gYXBpY19yZWFkKEFQSUNfTFZURVJSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QgPSBhcGljX3JlYWQoQVBJQ19UTUlDVCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3RkY3IgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9JTlRFTAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMKSB8fCBkZWZpbmVkKENPTkZJR19YODZfTUNFX0lOVEVMKQogCWlmIChtYXhsdnQgPj0gNSkKIAkJYXBpY19wbV9zdGF0ZS5hcGljX3RobXIgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKICNlbmRpZgorCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTExNjQsMTAgKzE1ODIsMjUgQEAKIAltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwotCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7Ci0JbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBtcF9sYXBpY19hZGRyOwotCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlpZiAoeDJhcGljKQorCQllbmFibGVfeDJhcGljKCk7CisJZWxzZQorI2VuZGlmCisJeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIEFQSUNCQVNFIHBvaW50cyB0byB0aGUgcmlnaHQgYWRkcmVzcworCQkgKgorCQkgKiBGSVhNRSEgVGhpcyB3aWxsIGJlIHdyb25nIGlmIHdlIGV2ZXIgc3VwcG9ydCBzdXNwZW5kIG9uCisJCSAqIFNNUCEgV2UnbGwgbmVlZCB0byBkbyB0aGlzIGFzIHBhcnQgb2YgdGhlIENQVSByZXN0b3JlIQorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOworCQlsIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IG1wX2xhcGljX2FkZHI7CisJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwl9CisKIAlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCBFUlJPUl9BUElDX1ZFQ1RPUiB8IEFQSUNfTFZUX01BU0tFRCk7CiAJYXBpY193cml0ZShBUElDX0lELCBhcGljX3BtX3N0YXRlLmFwaWNfaWQpOwogCWFwaWNfd3JpdGUoQVBJQ19ERlIsIGFwaWNfcG1fc3RhdGUuYXBpY19kZnIpOwpAQCAtMTE3Niw3ICsxNjA5LDcgQEAKIAlhcGljX3dyaXRlKEFQSUNfU1BJViwgYXBpY19wbV9zdGF0ZS5hcGljX3NwaXYpOwogCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MCk7CiAJYXBpY193cml0ZShBUElDX0xWVDEsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQxKTsKLSNpZmRlZiBDT05GSUdfWDg2X01DRV9JTlRFTAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMKSB8fCBkZWZpbmVkKENPTkZJR19YODZfTUNFX0lOVEVMKQogCWlmIChtYXhsdnQgPj0gNSkKIAkJYXBpY193cml0ZShBUElDX0xWVFRITVIsIGFwaWNfcG1fc3RhdGUuYXBpY190aG1yKTsKICNlbmRpZgpAQCAtMTE5MCwxMCArMTYyMywxNyBAQAogCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnRlcnIpOwogCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwogCWFwaWNfcmVhZChBUElDX0VTUik7CisKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoaXMgZGV2aWNlIGhhcyBubyBzaHV0ZG93biBtZXRob2QgLSBmdWxseSBmdW5jdGlvbmluZyBsb2NhbCBBUElDcworICogYXJlIG5lZWRlZCBvbiBldmVyeSBDUFUgdXAgdW50aWwgbWFjaGluZV9oYWx0L3Jlc3RhcnQvcG93ZXJvZmYuCisgKi8KKwogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbGFwaWNfc3lzY2xhc3MgPSB7CiAJLm5hbWUJCT0gImxhcGljIiwKIAkucmVzdW1lCQk9IGxhcGljX3Jlc3VtZSwKQEAgLTEzMDcsMzEgKzE3NDcsMTkgQEAKIAlyZXR1cm4gKGNsdXN0ZXJzID4gMik7CiB9CiAKK3N0YXRpYyBfX2luaXQgaW50IHNldHVwX25veDJhcGljKGNoYXIgKnN0cikKK3sKKwlkaXNhYmxlX3gyYXBpYyA9IDE7CisJY2xlYXJfY3B1X2NhcCgmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfWDJBUElDKTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub3gyYXBpYyIsIHNldHVwX25veDJhcGljKTsKKworCiAvKgogICogQVBJQyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycwogICovCi1zdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqc3RyKQotewotCWlmIChzdHIgPT0gTlVMTCkgIHsKLQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAwOwotCQlpb2FwaWNfZm9yY2UgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHN0cmNtcCgiZGVidWciLCBzdHIpID09IDApCi0JCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19ERUJVRzsKLQllbHNlIGlmIChzdHJjbXAoInZlcmJvc2UiLCBzdHIpID09IDApCi0JCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19WRVJCT1NFOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBUElDIFZlcmJvc2l0eSBsZXZlbCAlcyBub3QgcmVjb2duaXNlZCIKLQkJCQkiIHVzZSBhcGljPXZlcmJvc2Ugb3IgYXBpYz1kZWJ1Z1xuIiwgc3RyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgiYXBpYyIsIGFwaWNfc2V0X3ZlcmJvc2l0eSk7Ci0KLXN0YXRpYyBfX2luaXQgaW50IHNldHVwX2Rpc2FibGVhcGljKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2Rpc2FibGVhcGljKGNoYXIgKmFyZykKIHsKIAlkaXNhYmxlX2FwaWMgPSAxOwogCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfQVBJQyk7CkBAIC0xMzQwLDkgKzE3NjgsOSBAQAogZWFybHlfcGFyYW0oImRpc2FibGVhcGljIiwgc2V0dXBfZGlzYWJsZWFwaWMpOwogCiAvKiBzYW1lIGFzIGRpc2FibGVhcGljLCBmb3IgY29tcGF0aWJpbGl0eSAqLwotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9sYXBpYyhjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9ub2xhcGljKGNoYXIgKmFyZykKIHsKLQlyZXR1cm4gc2V0dXBfZGlzYWJsZWFwaWMoc3RyKTsKKwlyZXR1cm4gc2V0dXBfZGlzYWJsZWFwaWMoYXJnKTsKIH0KIGVhcmx5X3BhcmFtKCJub2xhcGljIiwgc2V0dXBfbm9sYXBpYyk7CiAKQEAgLTEzNTMsMTQgKzE3ODEsMTkgQEAKIH0KIGVhcmx5X3BhcmFtKCJsYXBpY190aW1lcl9jMl9vayIsIHBhcnNlX2xhcGljX3RpbWVyX2MyX29rKTsKIAotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9hcGljdGltZXIoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgcGFyc2VfZGlzYWJsZV9hcGljX3RpbWVyKGNoYXIgKmFyZykKIHsKLQlpZiAoc3RyWzBdICE9ICcgJyAmJiBzdHJbMF0gIT0gMCkKLQkJcmV0dXJuIDA7CiAJZGlzYWJsZV9hcGljX3RpbWVyID0gMTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KLV9fc2V0dXAoIm5vYXBpY3RpbWVyIiwgc2V0dXBfbm9hcGljdGltZXIpOworZWFybHlfcGFyYW0oIm5vYXBpY3RpbWVyIiwgcGFyc2VfZGlzYWJsZV9hcGljX3RpbWVyKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9sYXBpY190aW1lcihjaGFyICphcmcpCit7CisJZGlzYWJsZV9hcGljX3RpbWVyID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2xhcGljX3RpbWVyIiwgcGFyc2Vfbm9sYXBpY190aW1lcik7CiAKIHN0YXRpYyBfX2luaXQgaW50IHNldHVwX2FwaWNwbXRpbWVyKGNoYXIgKnMpCiB7CkBAIC0xMzcwLDYgKzE4MDMsMzEgQEAKIH0KIF9fc2V0dXAoImFwaWNwbXRpbWVyIiwgc2V0dXBfYXBpY3BtdGltZXIpOwogCitzdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqYXJnKQoreworCWlmICghYXJnKSAgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJc2tpcF9pb2FwaWNfc2V0dXAgPSAwOworCQlpb2FwaWNfZm9yY2UgPSAxOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKCJkZWJ1ZyIsIGFyZykgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX0RFQlVHOworCWVsc2UgaWYgKHN0cmNtcCgidmVyYm9zZSIsIGFyZykgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX1ZFUkJPU0U7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQSUMgVmVyYm9zaXR5IGxldmVsICVzIG5vdCByZWNvZ25pc2VkIgorCQkJIiB1c2UgYXBpYz12ZXJib3NlIG9yIGFwaWM9ZGVidWdcbiIsIGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImFwaWMiLCBhcGljX3NldF92ZXJib3NpdHkpOworCiBzdGF0aWMgaW50IF9faW5pdCBsYXBpY19pbnNlcnRfcmVzb3VyY2Uodm9pZCkKIHsKIAlpZiAoIWFwaWNfcGh5cykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYwppbmRleCA5ZWUyNGU2Li41MTQ1YTZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCkBAIC0yMjgsMTIgKzIyOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pODI1My5oPgorI2luY2x1ZGUgPGFzbS9vbHBjLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogCkBAIC0yMjE3LDcgKzIyMTcsNyBAQAogCiAJZG1pX2NoZWNrX3N5c3RlbShhcG1fZG1pX3RhYmxlKTsKIAotCWlmIChhcG1faW5mby5iaW9zLnZlcnNpb24gPT0gMCB8fCBwYXJhdmlydF9lbmFibGVkKCkpIHsKKwlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID09IDAgfHwgcGFyYXZpcnRfZW5hYmxlZCgpIHx8IG1hY2hpbmVfaXNfb2xwYygpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFwbTogQklPUyBub3QgZm91bmQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwppbmRleCBhYTg5Mzg3Li41MDU1NDNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjZGVmaW5lIF9fTk9fU1RVQlMgMQogI3VuZGVmIF9fU1lTQ0FMTAotI3VuZGVmIF9BU01fWDg2XzY0X1VOSVNURF9IXworI3VuZGVmIEFTTV9YODZfX1VOSVNURF82NF9ICiAjZGVmaW5lIF9fU1lTQ0FMTChuciwgc3ltKSBbbnJdID0gMSwKIHN0YXRpYyBjaGFyIHN5c2NhbGxzW10gPSB7CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2Jpb3NfdXYuYyBiL2FyY2gveDg2L2tlcm5lbC9iaW9zX3V2LmMKaW5kZXggYzYzOWJkNS4uZmRkNTg1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Jpb3NfdXYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYmlvc191di5jCkBAIC0yNSwxMSArMjUsMTEgQEAKIHsKIAljb25zdCBjaGFyICpzdHI7CiAJc3dpdGNoIChzdGF0dXMpIHsKLQljYXNlICAwOiBzdHIgPSAiQ2FsbCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciI7IGJyZWFrOwotCWNhc2UgLTE6IHN0ciA9ICJOb3QgaW1wbGVtZW50ZWQiOyBicmVhazsKLQljYXNlIC0yOiBzdHIgPSAiSW52YWxpZCBhcmd1bWVudCI7IGJyZWFrOwotCWNhc2UgLTM6IHN0ciA9ICJDYWxsIGNvbXBsZXRlZCB3aXRoIGVycm9yIjsgYnJlYWs7Ci0JZGVmYXVsdDogc3RyID0gIlVua25vd24gQklPUyBzdGF0dXMgY29kZSI7IGJyZWFrOworCWNhc2UgIDA6IHN0ciA9ICJDYWxsIGNvbXBsZXRlZCB3aXRob3V0IGVycm9yIjsJYnJlYWs7CisJY2FzZSAtMTogc3RyID0gIk5vdCBpbXBsZW1lbnRlZCI7CQlicmVhazsKKwljYXNlIC0yOiBzdHIgPSAiSW52YWxpZCBhcmd1bWVudCI7CQlicmVhazsKKwljYXNlIC0zOiBzdHIgPSAiQ2FsbCBjb21wbGV0ZWQgd2l0aCBlcnJvciI7CWJyZWFrOworCWRlZmF1bHQ6IHN0ciA9ICJVbmtub3duIEJJT1Mgc3RhdHVzIGNvZGUiOwlicmVhazsKIAl9CiAJcmV0dXJuIHN0cjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IGVlNzZlYWEuLjdmMGI0NWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMywyMiArMywzMCBAQAogIwogCiBvYmoteQkJCTo9IGludGVsX2NhY2hlaW5mby5vIGFkZG9uX2NwdWlkX2ZlYXR1cmVzLm8KLW9iai15CQkJKz0gcHJvYy5vIGZlYXR1cmVfbmFtZXMubworb2JqLXkJCQkrPSBwcm9jLm8gY2FwZmxhZ3MubyBwb3dlcmZsYWdzLm8gY29tbW9uLm8KIAotb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gY29tbW9uLm8gYnVncy5vCi1vYmotJChDT05GSUdfWDg2XzY0KQkrPSBjb21tb25fNjQubyBidWdzXzY0Lm8KLW9iai0kKENPTkZJR19YODZfMzIpCSs9IGFtZC5vCi1vYmotJChDT05GSUdfWDg2XzY0KQkrPSBhbWRfNjQubwotb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gY3lyaXgubwotb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gY2VudGF1ci5vCi1vYmotJChDT05GSUdfWDg2XzY0KQkrPSBjZW50YXVyXzY0Lm8KLW9iai0kKENPTkZJR19YODZfMzIpCSs9IHRyYW5zbWV0YS5vCi1vYmotJChDT05GSUdfWDg2XzMyKQkrPSBpbnRlbC5vCi1vYmotJChDT05GSUdfWDg2XzY0KQkrPSBpbnRlbF82NC5vCi1vYmotJChDT05GSUdfWDg2XzMyKQkrPSB1bWMubworb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gYnVncy5vIGNtcHhjaGcubworb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gYnVnc182NC5vCisKK29iai0kKENPTkZJR19DUFVfU1VQX0lOVEVMKQkJKz0gaW50ZWwubworb2JqLSQoQ09ORklHX0NQVV9TVVBfQU1EKQkJKz0gYW1kLm8KK29iai0kKENPTkZJR19DUFVfU1VQX0NZUklYXzMyKQkJKz0gY3lyaXgubworb2JqLSQoQ09ORklHX0NQVV9TVVBfQ0VOVEFVUl8zMikJKz0gY2VudGF1ci5vCitvYmotJChDT05GSUdfQ1BVX1NVUF9DRU5UQVVSXzY0KQkrPSBjZW50YXVyXzY0Lm8KK29iai0kKENPTkZJR19DUFVfU1VQX1RSQU5TTUVUQV8zMikJKz0gdHJhbnNtZXRhLm8KK29iai0kKENPTkZJR19DUFVfU1VQX1VNQ18zMikJCSs9IHVtYy5vCiAKIG9iai0kKENPTkZJR19YODZfTUNFKQkrPSBtY2hlY2svCiBvYmotJChDT05GSUdfTVRSUikJKz0gbXRyci8KIG9iai0kKENPTkZJR19DUFVfRlJFUSkJKz0gY3B1ZnJlcS8KIAogb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSArPSBwZXJmY3RyLXdhdGNoZG9nLm8KKworcXVpZXRfY21kX21rY2FwZmxhZ3MgPSBNS0NBUCAgICRACisgICAgICBjbWRfbWtjYXBmbGFncyA9ICQoUEVSTCkgJChzcmN0cmVlKS8kKHNyYykvbWtjYXBmbGFncy5wbCAkPCAkQAorCitjcHVmZWF0dXJlID0gJChzcmMpLy4uLy4uLy4uLy4uL2luY2x1ZGUvYXNtLXg4Ni9jcHVmZWF0dXJlLmgKKwordGFyZ2V0cyArPSBjYXBmbGFncy5jCiskKG9iaikvY2FwZmxhZ3MuYzogJChjcHVmZWF0dXJlKSAkKHNyYykvbWtjYXBmbGFncy5wbCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG1rY2FwZmxhZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FkZG9uX2NwdWlkX2ZlYXR1cmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FkZG9uX2NwdWlkX2ZlYXR1cmVzLmMKaW5kZXggYTZlZjY3Mi4uMGQ5Yzk5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9hZGRvbl9jcHVpZF9mZWF0dXJlcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYWRkb25fY3B1aWRfZmVhdHVyZXMuYwpAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxhc20vcGF0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisKIHN0cnVjdCBjcHVpZF9iaXQgewogCXUxNiBmZWF0dXJlOwogCXU4IHJlZzsKQEAgLTQ4LDYgKzUwLDkyIEBACiAJfQogfQogCisvKiBsZWFmIDB4YiBTTVQgbGV2ZWwgKi8KKyNkZWZpbmUgU01UX0xFVkVMCTAKKworLyogbGVhZiAweGIgc3ViLWxlYWYgdHlwZXMgKi8KKyNkZWZpbmUgSU5WQUxJRF9UWVBFCTAKKyNkZWZpbmUgU01UX1RZUEUJMQorI2RlZmluZSBDT1JFX1RZUEUJMgorCisjZGVmaW5lIExFQUZCX1NVQlRZUEUoZWN4KQkJKCgoZWN4KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIEJJVFNfU0hJRlRfTkVYVF9MRVZFTChlYXgpCSgoZWF4KSAmIDB4MWYpCisjZGVmaW5lIExFVkVMX01BWF9TSUJMSU5HUyhlYngpCQkoKGVieCkgJiAweGZmZmYpCisKKy8qCisgKiBDaGVjayBmb3IgZXh0ZW5kZWQgdG9wb2xvZ3kgZW51bWVyYXRpb24gY3B1aWQgbGVhZiAweGIgYW5kIGlmIGl0CisgKiBleGlzdHMsIHVzZSBpdCBmb3IgcG9wdWxhdGluZyBpbml0aWFsX2FwaWNpZCBhbmQgY3B1IHRvcG9sb2d5CisgKiBkZXRlY3Rpb24uCisgKi8KK3ZvaWQgX19jcHVpbml0IGRldGVjdF9leHRlbmRlZF90b3BvbG9neShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHgsIHN1Yl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgaHRfbWFza193aWR0aCwgY29yZV9wbHVzX21hc2tfd2lkdGg7CisJdW5zaWduZWQgaW50IGNvcmVfc2VsZWN0X21hc2ssIGNvcmVfbGV2ZWxfc2libGluZ3M7CisKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPCAweGIpCisJCXJldHVybjsKKworCWNwdWlkX2NvdW50KDB4YiwgU01UX0xFVkVMLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCS8qCisJICogY2hlY2sgaWYgdGhlIGNwdWlkIGxlYWYgMHhiIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkLgorCSAqLworCWlmIChlYnggPT0gMCB8fCAoTEVBRkJfU1VCVFlQRShlY3gpICE9IFNNVF9UWVBFKSkKKwkJcmV0dXJuOworCisJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfWFRPUE9MT0dZKTsKKworCS8qCisJICogaW5pdGlhbCBhcGljIGlkLCB3aGljaCBhbHNvIHJlcHJlc2VudHMgMzItYml0IGV4dGVuZGVkIHgyYXBpYyBpZC4KKwkgKi8KKwljLT5pbml0aWFsX2FwaWNpZCA9IGVkeDsKKworCS8qCisJICogUG9wdWxhdGUgSFQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHN1Yi1sZWFmIGxldmVsIDAuCisJICovCisJY29yZV9sZXZlbF9zaWJsaW5ncyA9IHNtcF9udW1fc2libGluZ3MgPSBMRVZFTF9NQVhfU0lCTElOR1MoZWJ4KTsKKwljb3JlX3BsdXNfbWFza193aWR0aCA9IGh0X21hc2tfd2lkdGggPSBCSVRTX1NISUZUX05FWFRfTEVWRUwoZWF4KTsKKworCXN1Yl9pbmRleCA9IDE7CisJZG8geworCQljcHVpZF9jb3VudCgweGIsIHN1Yl9pbmRleCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHRoZSBDb3JlIHR5cGUgaW4gdGhlIGltcGxlbWVudGVkIHN1YiBsZWF2ZXMuCisJCSAqLworCQlpZiAoTEVBRkJfU1VCVFlQRShlY3gpID09IENPUkVfVFlQRSkgeworCQkJY29yZV9sZXZlbF9zaWJsaW5ncyA9IExFVkVMX01BWF9TSUJMSU5HUyhlYngpOworCQkJY29yZV9wbHVzX21hc2tfd2lkdGggPSBCSVRTX1NISUZUX05FWFRfTEVWRUwoZWF4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3ViX2luZGV4Kys7CisJfSB3aGlsZSAoTEVBRkJfU1VCVFlQRShlY3gpICE9IElOVkFMSURfVFlQRSk7CisKKwljb3JlX3NlbGVjdF9tYXNrID0gKH4oLTEgPDwgY29yZV9wbHVzX21hc2tfd2lkdGgpKSA+PiBodF9tYXNrX3dpZHRoOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWMtPmNwdV9jb3JlX2lkID0gcGh5c19wa2dfaWQoYy0+aW5pdGlhbF9hcGljaWQsIGh0X21hc2tfd2lkdGgpCisJCQkJCQkgJiBjb3JlX3NlbGVjdF9tYXNrOworCWMtPnBoeXNfcHJvY19pZCA9IHBoeXNfcGtnX2lkKGMtPmluaXRpYWxfYXBpY2lkLCBjb3JlX3BsdXNfbWFza193aWR0aCk7CisjZWxzZQorCWMtPmNwdV9jb3JlX2lkID0gcGh5c19wa2dfaWQoaHRfbWFza193aWR0aCkgJiBjb3JlX3NlbGVjdF9tYXNrOworCWMtPnBoeXNfcHJvY19pZCA9IHBoeXNfcGtnX2lkKGNvcmVfcGx1c19tYXNrX3dpZHRoKTsKKyNlbmRpZgorCWMtPng4Nl9tYXhfY29yZXMgPSAoY29yZV9sZXZlbF9zaWJsaW5ncyAvIHNtcF9udW1fc2libGluZ3MpOworCisKKwlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAorCSAgICAgICBjLT5waHlzX3Byb2NfaWQpOworCWlmIChjLT54ODZfbWF4X2NvcmVzID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUHJvY2Vzc29yIENvcmUgSUQ6ICVkXG4iLAorCQkgICAgICAgYy0+Y3B1X2NvcmVfaWQpOworCXJldHVybjsKKyNlbmRpZgorfQorCiAjaWZkZWYgQ09ORklHX1g4Nl9QQVQKIHZvaWQgX19jcHVpbml0IHZhbGlkYXRlX3BhdF9zdXBwb3J0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGNhZTljYWIuLjMyZTczNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtMSwxMyArMSwyMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjIGluY2x1ZGUgPGFzbS9udW1hXzY0Lmg+CisjIGluY2x1ZGUgPGFzbS9tbWNvbmZpZy5oPgorIyBpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKwogI2luY2x1ZGUgImNwdS5oIgogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogLyoKICAqCUIgc3RlcCBBTUQgSzYgYmVmb3JlIEIgOTczMHh4eHggaGF2ZSBoYXJkd2FyZSBidWdzIHRoYXQgY2FuIGNhdXNlCiAgKgltaXNleGVjdXRpb24gb2YgY29kZSB1bmRlciBMaW51eC4gT3duZXJzIG9mIHN1Y2ggcHJvY2Vzc29ycyBzaG91bGQKQEAgLTI0LDIxICszMywyNzMgQEAKIGV4dGVybiB2b2lkIHZpZGUodm9pZCk7CiBfX2FzbV9fKCIuYWxpZ24gNFxudmlkZTogcmV0Iik7CiAKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZF9rNShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisvKgorICogR2VuZXJhbCBTeXN0ZW1zIEJJT1NlbiBhbGlhcyB0aGUgY3B1IGZyZXF1ZW5jeSByZWdpc3RlcnMKKyAqIG9mIHRoZSBFbGFuIGF0IDB4MDAwZGYwMDAuIFVuZm9ydHVhbnRseSwgb25lIG9mIHRoZSBMaW51eAorICogZHJpdmVycyBzdWJzZXF1ZW50bHkgcG9rZXMgaXQsIGFuZCBjaGFuZ2VzIHRoZSBDUFUgc3BlZWQuCisgKiBXb3JrYXJvdW5kIDogUmVtb3ZlIHRoZSB1bm5lZWRlZCBhbGlhcy4KKyAqLworI2RlZmluZSBDQkFSCQkoMHhmZmZjKSAvKiBDb25maWd1cmF0aW9uIEJhc2UgQWRkcmVzcyAgKDMyLWJpdCkgKi8KKyNkZWZpbmUgQ0JBUl9FTkIJKDB4ODAwMDAwMDApCisjZGVmaW5lIENCQVJfS0VZCSgwWDAwMDAwMENCKQorCWlmIChjLT54ODZfbW9kZWwgPT0gOSB8fCBjLT54ODZfbW9kZWwgPT0gMTApIHsKKwkJaWYgKGlubCAoQ0JBUikgJiBDQkFSX0VOQikKKwkJCW91dGwgKDAgfCBDQkFSX0tFWSwgQ0JBUik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZF9rNihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJaW50IG1ieXRlcyA9IG51bV9waHlzcGFnZXMgPj4gKDIwLVBBR0VfU0hJRlQpOworCisJaWYgKGMtPng4Nl9tb2RlbCA8IDYpIHsKKwkJLyogQmFzZWQgb24gQU1EIGRvYyAyMDczNFIgLSBKdW5lIDIwMDAgKi8KKwkJaWYgKGMtPng4Nl9tb2RlbCA9PSAwKSB7CisJCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0FQSUMpOworCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUEdFKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKGMtPng4Nl9tb2RlbCA9PSA2ICYmIGMtPng4Nl9tYXNrID09IDEpIHsKKwkJY29uc3QgaW50IEs2X0JVR19MT09QID0gMTAwMDAwMDsKKwkJaW50IG47CisJCXZvaWQgKCpmX3ZpZGUpKHZvaWQpOworCQl1bnNpZ25lZCBsb25nIGQsIGQyOworCisJCXByaW50ayhLRVJOX0lORk8gIkFNRCBLNiBzdGVwcGluZyBCIGRldGVjdGVkIC0gIik7CisKKwkJLyoKKwkJICogSXQgbG9va3MgbGlrZSBBTUQgZml4ZWQgdGhlIDIuNi4yIGJ1ZyBhbmQgaW1wcm92ZWQgaW5kaXJlY3QKKwkJICogY2FsbHMgYXQgdGhlIHNhbWUgdGltZS4KKwkJICovCisKKwkJbiA9IEs2X0JVR19MT09QOworCQlmX3ZpZGUgPSB2aWRlOworCQlyZHRzY2woZCk7CisJCXdoaWxlIChuLS0pCisJCQlmX3ZpZGUoKTsKKwkJcmR0c2NsKGQyKTsKKwkJZCA9IGQyLWQ7CisKKwkJaWYgKGQgPiAyMCpLNl9CVUdfTE9PUCkKKwkJCXByaW50aygic3lzdGVtIHN0YWJpbGl0eSBtYXkgYmUgaW1wYWlyZWQgd2hlbiBtb3JlIHRoYW4gMzIgTUIgYXJlIHVzZWQuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJwcm9iYWJseSBPSyAoYWZ0ZXIgQjk3MzB4eHh4KS5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2Ugc2VlIGh0dHA6Ly9tZW1icmVzLmx5Y29zLmZyL3BvdWxvdC9rNmJ1Zy5odG1sXG4iKTsKKwl9CisKKwkvKiBLNiB3aXRoIG9sZCBzdHlsZSBXSENSICovCisJaWYgKGMtPng4Nl9tb2RlbCA8IDggfHwKKwkgICAoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPCA4KSkgeworCQkvKiBXZSBjYW4gb25seSB3cml0ZSBhbGxvY2F0ZSBvbiB0aGUgbG93IDUwOE1iICovCisJCWlmIChtYnl0ZXMgPiA1MDgpCisJCQltYnl0ZXMgPSA1MDg7CisKKwkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOworCQlpZiAoKGwmMHgwMDAwRkZGRikgPT0gMCkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCWwgPSAoMTw8MCl8KChtYnl0ZXMvNCk8PDEpOworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJd2JpbnZkKCk7CisJCQl3cm1zcihNU1JfSzZfV0hDUiwgbCwgaCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBvbGQgc3R5bGUgSzYgd3JpdGUgYWxsb2NhdGlvbiBmb3IgJWQgTWJcbiIsCisJCQkJbWJ5dGVzKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+IDcpIHx8CisJICAgICBjLT54ODZfbW9kZWwgPT0gOSB8fCBjLT54ODZfbW9kZWwgPT0gMTMpIHsKKwkJLyogVGhlIG1vcmUgc2VyaW91cyBjaGlwcyAuLiAqLworCisJCWlmIChtYnl0ZXMgPiA0MDkyKQorCQkJbWJ5dGVzID0gNDA5MjsKKworCQlyZG1zcihNU1JfSzZfV0hDUiwgbCwgaCk7CisJCWlmICgobCYweEZGRkYwMDAwKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJbCA9ICgobWJ5dGVzPj4yKTw8MjIpfCgxPDwxNik7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQl3YmludmQoKTsKKwkJCXdybXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIG5ldyBzdHlsZSBLNiB3cml0ZSBhbGxvY2F0aW9uIGZvciAlZCBNYlxuIiwKKwkJCQltYnl0ZXMpOworCQl9CisKKwkJcmV0dXJuOworCX0KKworCWlmIChjLT54ODZfbW9kZWwgPT0gMTApIHsKKwkJLyogQU1EIEdlb2RlIExYIGlzIG1vZGVsIDEwICovCisJCS8qIHBsYWNlaG9sZGVyIGZvciBhbnkgbmVlZGVkIG1vZHMgKi8KKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfYW1kX2s3KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKworCS8qCisJICogQml0IDE1IG9mIEF0aGxvbiBzcGVjaWZpYyBNU1IgMTUsIG5lZWRzIHRvIGJlIDAKKwkgKiB0byBlbmFibGUgU1NFIG9uIFBhbG9taW5vL01vcmdhbi9CYXJ0b24gQ1BVJ3MuCisJICogSWYgdGhlIEJJT1MgZGlkbid0IGVuYWJsZSBpdCBhbHJlYWR5LCBlbmFibGUgaXQgaGVyZS4KKwkgKi8KKwlpZiAoYy0+eDg2X21vZGVsID49IDYgJiYgYy0+eDg2X21vZGVsIDw9IDEwKSB7CisJCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9YTU0pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBkaXNhYmxlZCBLNy9TU0UgU3VwcG9ydC5cbiIpOworCQkJcmRtc3IoTVNSX0s3X0hXQ1IsIGwsIGgpOworCQkJbCAmPSB+MHgwMDAwODAwMDsKKwkJCXdybXNyKE1TUl9LN19IV0NSLCBsLCBoKTsKKwkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1hNTSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEl0J3MgYmVlbiBkZXRlcm1pbmVkIGJ5IEFNRCB0aGF0IEF0aGxvbnMgc2luY2UgbW9kZWwgOCBzdGVwcGluZyAxCisJICogYXJlIG1vcmUgcm9idXN0IHdpdGggQ0xLX0NUTCBzZXQgdG8gMjAweHh4eHggaW5zdGVhZCBvZiA2MDB4eHh4eAorCSAqIEFzIHBlciBBTUQgdGVjaG5pY2FsIG5vdGUgMjcyMTIgMC4yCisJICovCisJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+PSAxKSB8fCAoYy0+eDg2X21vZGVsID4gOCkpIHsKKwkJcmRtc3IoTVNSX0s3X0NMS19DVEwsIGwsIGgpOworCQlpZiAoKGwgJiAweGZmZjAwMDAwKSAhPSAweDIwMDAwMDAwKSB7CisJCQlwcmludGsgKCJDUFU6IENMS19DVEwgTVNSIHdhcyAleC4gUmVwcm9ncmFtbWluZyB0byAleFxuIiwgbCwKKwkJCQkoKGwgJiAweDAwMGZmZmZmKXwweDIwMDAwMDAwKSk7CisJCQl3cm1zcihNU1JfSzdfQ0xLX0NUTCwgKGwgJiAweDAwMGZmZmZmKXwweDIwMDAwMDAwLCBoKTsKKwkJfQorCX0KKworCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0s3KTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorc3RhdGljIGludCBfX2NwdWluaXQgbmVhcmJ5X25vZGUoaW50IGFwaWNpZCkKK3sKKwlpbnQgaSwgbm9kZTsKKworCWZvciAoaSA9IGFwaWNpZCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtpXTsKKwkJaWYgKG5vZGUgIT0gTlVNQV9OT19OT0RFICYmIG5vZGVfb25saW5lKG5vZGUpKQorCQkJcmV0dXJuIG5vZGU7CisJfQorCWZvciAoaSA9IGFwaWNpZCArIDE7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKSB7CisJCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtpXTsKKwkJaWYgKG5vZGUgIT0gTlVNQV9OT19OT0RFICYmIG5vZGVfb25saW5lKG5vZGUpKQorCQkJcmV0dXJuIG5vZGU7CisJfQorCXJldHVybiBmaXJzdF9ub2RlKG5vZGVfb25saW5lX21hcCk7IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KK30KKyNlbmRpZgorCisvKgorICogT24gYSBBTUQgZHVhbCBjb3JlIHNldHVwIHRoZSBsb3dlciBiaXRzIG9mIHRoZSBBUElDIGlkIGRpc3Rpbmd1c2ggdGhlIGNvcmVzLgorICogQXNzdW1lcyBudW1iZXIgb2YgY29yZXMgaXMgYSBwb3dlciBvZiB0d28uCisgKi8KK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBhbWRfZGV0ZWN0X2NtcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXVuc2lnbmVkIGJpdHM7CisKKwliaXRzID0gYy0+eDg2X2NvcmVpZF9iaXRzOworCisJLyogTG93IG9yZGVyIGJpdHMgZGVmaW5lIHRoZSBjb3JlIGlkIChpbmRleCBvZiBjb3JlIGluIHNvY2tldCkgKi8KKwljLT5jcHVfY29yZV9pZCA9IGMtPmluaXRpYWxfYXBpY2lkICYgKCgxIDw8IGJpdHMpLTEpOworCS8qIENvbnZlcnQgdGhlIGluaXRpYWwgQVBJQyBJRCBpbnRvIHRoZSBzb2NrZXQgSUQgKi8KKwljLT5waHlzX3Byb2NfaWQgPSBjLT5pbml0aWFsX2FwaWNpZCA+PiBiaXRzOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcmF0X2RldGVjdF9ub2RlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19OVU1BKSAmJiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgbm9kZTsKKwl1bnNpZ25lZCBhcGljaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCW5vZGUgPSBjLT5waHlzX3Byb2NfaWQ7CisJaWYgKGFwaWNpZF90b19ub2RlW2FwaWNpZF0gIT0gTlVNQV9OT19OT0RFKQorCQlub2RlID0gYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKKwlpZiAoIW5vZGVfb25saW5lKG5vZGUpKSB7CisJCS8qIFR3byBwb3NzaWJpbGl0aWVzIGhlcmU6CisJCSAgIC0gVGhlIENQVSBpcyBtaXNzaW5nIG1lbW9yeSBhbmQgbm8gbm9kZSB3YXMgY3JlYXRlZC4KKwkJICAgSW4gdGhhdCBjYXNlIHRyeSBwaWNraW5nIG9uZSBmcm9tIGEgbmVhcmJ5IENQVQorCQkgICAtIFRoZSBBUElDIElEcyBkaWZmZXIgZnJvbSB0aGUgSHlwZXJUcmFuc3BvcnQgbm9kZSBJRHMKKwkJICAgd2hpY2ggdGhlIEs4IG5vcnRoYnJpZGdlIHBhcnNpbmcgZmlsbHMgaW4uCisJCSAgIEFzc3VtZSB0aGV5IGFyZSBhbGwgaW5jcmVhc2VkIGJ5IGEgY29uc3RhbnQgb2Zmc2V0LAorCQkgICBidXQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEhUIG5vZGVpZHMuCisJCSAgIElmIHRoYXQgZG9lc24ndCByZXN1bHQgaW4gYSB1c2FibGUgbm9kZSBmYWxsIGJhY2sgdG8gdGhlCisJCSAgIHBhdGggZm9yIHRoZSBwcmV2aW91cyBjYXNlLiAgKi8KKworCQlpbnQgaHRfbm9kZWlkID0gYy0+aW5pdGlhbF9hcGljaWQ7CisKKwkJaWYgKGh0X25vZGVpZCA+PSAwICYmCisJCSAgICBhcGljaWRfdG9fbm9kZVtodF9ub2RlaWRdICE9IE5VTUFfTk9fTk9ERSkKKwkJCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtodF9ub2RlaWRdOworCQkvKiBQaWNrIGEgbmVhcmJ5IG5vZGUgKi8KKwkJaWYgKCFub2RlX29ubGluZShub2RlKSkKKwkJCW5vZGUgPSBuZWFyYnlfbm9kZShhcGljaWQpOworCX0KKwludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQvJXggLT4gTm9kZSAlZFxuIiwgY3B1LCBhcGljaWQsIG5vZGUpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2FtZF9tYyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXVuc2lnbmVkIGJpdHMsIGVjeDsKKworCS8qIE11bHRpIGNvcmUgQ1BVPyAqLworCWlmIChjLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA8IDB4ODAwMDAwMDgpCisJCXJldHVybjsKKworCWVjeCA9IGNwdWlkX2VjeCgweDgwMDAwMDA4KTsKKworCWMtPng4Nl9tYXhfY29yZXMgPSAoZWN4ICYgMHhmZikgKyAxOworCisJLyogQ1BVIHRlbGxpbmcgdXMgdGhlIGNvcmUgaWQgYml0cyBzaGlmdD8gKi8KKwliaXRzID0gKGVjeCA+PiAxMikgJiAweEY7CisKKwkvKiBPdGhlcndpc2UgcmVjb21wdXRlICovCisJaWYgKGJpdHMgPT0gMCkgeworCQl3aGlsZSAoKDEgPDwgYml0cykgPCBjLT54ODZfbWF4X2NvcmVzKQorCQkJYml0cysrOworCX0KKworCWMtPng4Nl9jb3JlaWRfYml0cyA9IGJpdHM7CisjZW5kaWYKK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IGVhcmx5X2luaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKLQlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDcpIHsKLQkJYy0+eDg2X3Bvd2VyID0gY3B1aWRfZWR4KDB4ODAwMDAwMDcpOwotCQlpZiAoYy0+eDg2X3Bvd2VyICYgKDE8PDgpKQotCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKLQl9CisJZWFybHlfaW5pdF9hbWRfbWMoYyk7CisKKwkvKiBjLT54ODZfcG93ZXIgaXMgODAwMF8wMDA3IGVkeC4gQml0IDggaXMgY29uc3RhbnQgVFNDICovCisJaWYgKGMtPng4Nl9wb3dlciAmICgxPDw4KSkKKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9TWVNDQUxMMzIpOworI2Vsc2UKKwkvKiAgU2V0IE1UUlIgY2FwYWJpbGl0eSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKGMtPng4NiA9PSA1KQorCQlpZiAoYy0+eDg2X21vZGVsID09IDEzIHx8IGMtPng4Nl9tb2RlbCA9PSA5IHx8CisJCSAgICAoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPj0gOCkpCisJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9LNl9NVFJSKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXUzMiBsLCBoOwotCWludCBtYnl0ZXMgPSBudW1fcGh5c3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKTsKLQlpbnQgcjsKLQogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWU7CiAKQEAgLTQ5LDcgKzMxMCw3IEBACiAJICogRXJyYXRhIDYzIGZvciBTSC1CMyBzdGVwcGluZ3MKIAkgKiBFcnJhdGEgMTIyIGZvciBhbGwgc3RlcHBpbmdzIChGKyBoYXZlIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQpCiAJICovCi0JaWYgKGMtPng4NiA9PSAxNSkgeworCWlmIChjLT54ODYgPT0gMHhmKSB7CiAJCXJkbXNybChNU1JfSzdfSFdDUiwgdmFsdWUpOwogCQl2YWx1ZSB8PSAxIDw8IDY7CiAJCXdybXNybChNU1JfSzdfSFdDUiwgdmFsdWUpOwpAQCAtNTksMjEzICszMjAsMTE5IEBACiAJZWFybHlfaW5pdF9hbWQoYyk7CiAKIAkvKgotCSAqCUZJWE1FOiBXZSBzaG91bGQgaGFuZGxlIHRoZSBLNSBoZXJlLiBTZXQgdXAgdGhlIHdyaXRlCi0JICoJcmFuZ2UgYW5kIGFsc28gdHVybiBvbiBNU1IgODMgYml0cyA0IGFuZCAzMSAod3JpdGUgYWxsb2MsCi0JICoJbm8gYnVzIHBpcGVsaW5lKQotCSAqLwotCi0JLyoKIAkgKiBCaXQgMzEgaW4gbm9ybWFsIENQVUlEIHVzZWQgZm9yIG5vbnN0YW5kYXJkIDNETm93IElEOwogCSAqIDNETm93IGlzIElEZCBieSBiaXQgMzEgaW4gZXh0ZW5kZWQgQ1BVSUQgKDEqMzIrMzEpIGFueXdheQogCSAqLwogCWNsZWFyX2NwdV9jYXAoYywgMCozMiszMSk7CiAKLQlyID0gZ2V0X21vZGVsX25hbWUoYyk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS8qIE9uIEMrIHN0ZXBwaW5nIEs4IHJlcCBtaWNyb2NvZGUgd29ya3Mgd2VsbCBmb3IgY29weS9tZW1zZXQgKi8KKwlpZiAoYy0+eDg2ID09IDB4ZikgeworCQl1MzIgbGV2ZWw7CisKKwkJbGV2ZWwgPSBjcHVpZF9lYXgoMSk7CisJCWlmKChsZXZlbCA+PSAweDBmNDggJiYgbGV2ZWwgPCAweDBmNTApIHx8IGxldmVsID49IDB4MGY1OCkKKwkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JFUF9HT09EKTsKKwl9CisJaWYgKGMtPng4NiA9PSAweDEwIHx8IGMtPng4NiA9PSAweDExKQorCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9SRVBfR09PRCk7CisjZWxzZQorCisJLyoKKwkgKglGSVhNRTogV2Ugc2hvdWxkIGhhbmRsZSB0aGUgSzUgaGVyZS4gU2V0IHVwIHRoZSB3cml0ZQorCSAqCXJhbmdlIGFuZCBhbHNvIHR1cm4gb24gTVNSIDgzIGJpdHMgNCBhbmQgMzEgKHdyaXRlIGFsbG9jLAorCSAqCW5vIGJ1cyBwaXBlbGluZSkKKwkgKi8KIAogCXN3aXRjaCAoYy0+eDg2KSB7CiAJY2FzZSA0OgotCQkvKgotCQkgKiBHZW5lcmFsIFN5c3RlbXMgQklPU2VuIGFsaWFzIHRoZSBjcHUgZnJlcXVlbmN5IHJlZ2lzdGVycwotCQkgKiBvZiB0aGUgRWxhbiBhdCAweDAwMGRmMDAwLiBVbmZvcnR1YW50bHksIG9uZSBvZiB0aGUgTGludXgKLQkJICogZHJpdmVycyBzdWJzZXF1ZW50bHkgcG9rZXMgaXQsIGFuZCBjaGFuZ2VzIHRoZSBDUFUgc3BlZWQuCi0JCSAqIFdvcmthcm91bmQgOiBSZW1vdmUgdGhlIHVubmVlZGVkIGFsaWFzLgotCQkgKi8KLSNkZWZpbmUgQ0JBUgkJKDB4ZmZmYykgLyogQ29uZmlndXJhdGlvbiBCYXNlIEFkZHJlc3MgICgzMi1iaXQpICovCi0jZGVmaW5lIENCQVJfRU5CCSgweDgwMDAwMDAwKQotI2RlZmluZSBDQkFSX0tFWQkoMFgwMDAwMDBDQikKLQkJCWlmIChjLT54ODZfbW9kZWwgPT0gOSB8fCBjLT54ODZfbW9kZWwgPT0gMTApIHsKLQkJCQlpZiAoaW5sIChDQkFSKSAmIENCQVJfRU5CKQotCQkJCQlvdXRsICgwIHwgQ0JBUl9LRVksIENCQVIpOwotCQkJfQotCQkJYnJlYWs7CisJCWluaXRfYW1kX2s1KGMpOworCQlicmVhazsKIAljYXNlIDU6Ci0JCQlpZiAoYy0+eDg2X21vZGVsIDwgNikgewotCQkJCS8qIEJhc2VkIG9uIEFNRCBkb2MgMjA3MzRSIC0gSnVuZSAyMDAwICovCi0JCQkJaWYgKGMtPng4Nl9tb2RlbCA9PSAwKSB7Ci0JCQkJCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQVBJQyk7Ci0JCQkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BHRSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoYy0+eDg2X21vZGVsID09IDYgJiYgYy0+eDg2X21hc2sgPT0gMSkgewotCQkJCWNvbnN0IGludCBLNl9CVUdfTE9PUCA9IDEwMDAwMDA7Ci0JCQkJaW50IG47Ci0JCQkJdm9pZCAoKmZfdmlkZSkodm9pZCk7Ci0JCQkJdW5zaWduZWQgbG9uZyBkLCBkMjsKLQotCQkJCXByaW50ayhLRVJOX0lORk8gIkFNRCBLNiBzdGVwcGluZyBCIGRldGVjdGVkIC0gIik7Ci0KLQkJCQkvKgotCQkJCSAqIEl0IGxvb2tzIGxpa2UgQU1EIGZpeGVkIHRoZSAyLjYuMiBidWcgYW5kIGltcHJvdmVkIGluZGlyZWN0Ci0JCQkJICogY2FsbHMgYXQgdGhlIHNhbWUgdGltZS4KLQkJCQkgKi8KLQotCQkJCW4gPSBLNl9CVUdfTE9PUDsKLQkJCQlmX3ZpZGUgPSB2aWRlOwotCQkJCXJkdHNjbChkKTsKLQkJCQl3aGlsZSAobi0tKQotCQkJCQlmX3ZpZGUoKTsKLQkJCQlyZHRzY2woZDIpOwotCQkJCWQgPSBkMi1kOwotCi0JCQkJaWYgKGQgPiAyMCpLNl9CVUdfTE9PUCkKLQkJCQkJcHJpbnRrKCJzeXN0ZW0gc3RhYmlsaXR5IG1heSBiZSBpbXBhaXJlZCB3aGVuIG1vcmUgdGhhbiAzMiBNQiBhcmUgdXNlZC5cbiIpOwotCQkJCWVsc2UKLQkJCQkJcHJpbnRrKCJwcm9iYWJseSBPSyAoYWZ0ZXIgQjk3MzB4eHh4KS5cbiIpOwotCQkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBzZWUgaHR0cDovL21lbWJyZXMubHljb3MuZnIvcG91bG90L2s2YnVnLmh0bWxcbiIpOwotCQkJfQotCi0JCQkvKiBLNiB3aXRoIG9sZCBzdHlsZSBXSENSICovCi0JCQlpZiAoYy0+eDg2X21vZGVsIDwgOCB8fAotCQkJICAgKGMtPng4Nl9tb2RlbCA9PSA4ICYmIGMtPng4Nl9tYXNrIDwgOCkpIHsKLQkJCQkvKiBXZSBjYW4gb25seSB3cml0ZSBhbGxvY2F0ZSBvbiB0aGUgbG93IDUwOE1iICovCi0JCQkJaWYgKG1ieXRlcyA+IDUwOCkKLQkJCQkJbWJ5dGVzID0gNTA4OwotCi0JCQkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOwotCQkJCWlmICgobCYweDAwMDBGRkZGKSA9PSAwKSB7Ci0JCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQkJCWwgPSAoMTw8MCl8KChtYnl0ZXMvNCk8PDEpOwotCQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQkJCXdiaW52ZCgpOwotCQkJCQl3cm1zcihNU1JfSzZfV0hDUiwgbCwgaCk7Ci0JCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgb2xkIHN0eWxlIEs2IHdyaXRlIGFsbG9jYXRpb24gZm9yICVkIE1iXG4iLAotCQkJCQkJbWJ5dGVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICgoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPiA3KSB8fAotCQkJICAgICBjLT54ODZfbW9kZWwgPT0gOSB8fCBjLT54ODZfbW9kZWwgPT0gMTMpIHsKLQkJCQkvKiBUaGUgbW9yZSBzZXJpb3VzIGNoaXBzIC4uICovCi0KLQkJCQlpZiAobWJ5dGVzID4gNDA5MikKLQkJCQkJbWJ5dGVzID0gNDA5MjsKLQotCQkJCXJkbXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKLQkJCQlpZiAoKGwmMHhGRkZGMDAwMCkgPT0gMCkgewotCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQkJCQlsID0gKChtYnl0ZXM+PjIpPDwyMil8KDE8PDE2KTsKLQkJCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJCQl3YmludmQoKTsKLQkJCQkJd3Jtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOwotCQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIG5ldyBzdHlsZSBLNiB3cml0ZSBhbGxvY2F0aW9uIGZvciAlZCBNYlxuIiwKLQkJCQkJCW1ieXRlcyk7Ci0JCQkJfQotCi0JCQkJLyogIFNldCBNVFJSIGNhcGFiaWxpdHkgZmxhZyBpZiBhcHByb3ByaWF0ZSAqLwotCQkJCWlmIChjLT54ODZfbW9kZWwgPT0gMTMgfHwgYy0+eDg2X21vZGVsID09IDkgfHwKLQkJCQkgICAoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPj0gOCkpCi0JCQkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0s2X01UUlIpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoYy0+eDg2X21vZGVsID09IDEwKSB7Ci0JCQkJLyogQU1EIEdlb2RlIExYIGlzIG1vZGVsIDEwICovCi0JCQkJLyogcGxhY2Vob2xkZXIgZm9yIGFueSBuZWVkZWQgbW9kcyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7CisJCWluaXRfYW1kX2s2KGMpOworCQlicmVhazsKIAljYXNlIDY6IC8qIEFuIEF0aGxvbi9EdXJvbiAqLwotCi0JCQkvKgotCQkJICogQml0IDE1IG9mIEF0aGxvbiBzcGVjaWZpYyBNU1IgMTUsIG5lZWRzIHRvIGJlIDAKLQkJCSAqIHRvIGVuYWJsZSBTU0Ugb24gUGFsb21pbm8vTW9yZ2FuL0JhcnRvbiBDUFUncy4KLQkJCSAqIElmIHRoZSBCSU9TIGRpZG4ndCBlbmFibGUgaXQgYWxyZWFkeSwgZW5hYmxlIGl0IGhlcmUuCi0JCQkgKi8KLQkJCWlmIChjLT54ODZfbW9kZWwgPj0gNiAmJiBjLT54ODZfbW9kZWwgPD0gMTApIHsKLQkJCQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NKSkgewotCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBkaXNhYmxlZCBLNy9TU0UgU3VwcG9ydC5cbiIpOwotCQkJCQlyZG1zcihNU1JfSzdfSFdDUiwgbCwgaCk7Ci0JCQkJCWwgJj0gfjB4MDAwMDgwMDA7Ci0JCQkJCXdybXNyKE1TUl9LN19IV0NSLCBsLCBoKTsKLQkJCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfWE1NKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJdCdzIGJlZW4gZGV0ZXJtaW5lZCBieSBBTUQgdGhhdCBBdGhsb25zIHNpbmNlIG1vZGVsIDggc3RlcHBpbmcgMQotCQkJICogYXJlIG1vcmUgcm9idXN0IHdpdGggQ0xLX0NUTCBzZXQgdG8gMjAweHh4eHggaW5zdGVhZCBvZiA2MDB4eHh4eAotCQkJICogQXMgcGVyIEFNRCB0ZWNobmljYWwgbm90ZSAyNzIxMiAwLjIKLQkJCSAqLwotCQkJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+PSAxKSB8fCAoYy0+eDg2X21vZGVsID4gOCkpIHsKLQkJCQlyZG1zcihNU1JfSzdfQ0xLX0NUTCwgbCwgaCk7Ci0JCQkJaWYgKChsICYgMHhmZmYwMDAwMCkgIT0gMHgyMDAwMDAwMCkgewotCQkJCQlwcmludGsgKCJDUFU6IENMS19DVEwgTVNSIHdhcyAleC4gUmVwcm9ncmFtbWluZyB0byAleFxuIiwgbCwKLQkJCQkJCSgobCAmIDB4MDAwZmZmZmYpfDB4MjAwMDAwMDApKTsKLQkJCQkJd3Jtc3IoTVNSX0s3X0NMS19DVEwsIChsICYgMHgwMDBmZmZmZil8MHgyMDAwMDAwMCwgaCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChjLT54ODYpIHsKLQljYXNlIDE1OgotCS8qIFVzZSBLOCB0dW5pbmcgZm9yIEZhbTEwaCBhbmQgRmFtMTFoICovCi0JY2FzZSAweDEwOgotCWNhc2UgMHgxMToKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfSzgpOworCQlpbml0X2FtZF9rNyhjKTsKIAkJYnJlYWs7Ci0JY2FzZSA2OgotCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9LNyk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoYy0+eDg2ID49IDYpCi0JCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLKTsKLQotCWRpc3BsYXlfY2FjaGVpbmZvKGMpOwotCi0JaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA4KQotCQljLT54ODZfbWF4X2NvcmVzID0gKGNwdWlkX2VjeCgweDgwMDAwMDA4KSAmIDB4ZmYpICsgMTsKLQotI2lmZGVmIENPTkZJR19YODZfSFQKLQkvKgotCSAqIE9uIGEgQU1EIG11bHRpIGNvcmUgc2V0dXAgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIEFQSUMgaWQKLQkgKiBkaXN0aW5ndWlzaCB0aGUgY29yZXMuCi0JICovCi0JaWYgKGMtPng4Nl9tYXhfY29yZXMgPiAxKSB7Ci0JCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCXVuc2lnbmVkIGJpdHMgPSAoY3B1aWRfZWN4KDB4ODAwMDAwMDgpID4+IDEyKSAmIDB4ZjsKLQotCQlpZiAoYml0cyA9PSAwKSB7Ci0JCQl3aGlsZSAoKDEgPDwgYml0cykgPCBjLT54ODZfbWF4X2NvcmVzKQotCQkJCWJpdHMrKzsKLQkJfQotCQljLT5jcHVfY29yZV9pZCA9IGMtPnBoeXNfcHJvY19pZCAmICgoMTw8Yml0cyktMSk7Ci0JCWMtPnBoeXNfcHJvY19pZCA+Pj0gYml0czsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkKCVkKSAtPiBDb3JlICVkXG4iLAotCQkgICAgICAgY3B1LCBjLT54ODZfbWF4X2NvcmVzLCBjLT5jcHVfY29yZV9pZCk7Ci0JfQotI2VuZGlmCi0KLQlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDYpIHsKLQkJaWYgKChjLT54ODYgPT0gMHgxMCkgJiYgKGNwdWlkX2VkeCgweDgwMDAwMDA2KSAmIDB4ZjAwMCkpCi0JCQludW1fY2FjaGVfbGVhdmVzID0gNDsKLQkJZWxzZQotCQkJbnVtX2NhY2hlX2xlYXZlcyA9IDM7CiAJfQogCiAJLyogSzZzIHJlcG9ydHMgTUNFcyBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbGwgdGhlIE1TUnMgKi8KIAlpZiAoYy0+eDg2IDwgNikKIAkJY2xlYXJfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9NQ0UpOworI2VuZGlmCiAKLQlpZiAoY3B1X2hhc194bW0yKQorCS8qIEVuYWJsZSB3b3JrYXJvdW5kIGZvciBGWFNBVkUgbGVhayAqLworCWlmIChjLT54ODYgPj0gNikKKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfRlhTQVZFX0xFQUspOworCisJaWYgKCFjLT54ODZfbW9kZWxfaWRbMF0pIHsKKwkJc3dpdGNoIChjLT54ODYpIHsKKwkJY2FzZSAweGY6CisJCQkvKiBTaG91bGQgZGlzdGluZ3Vpc2ggTW9kZWxzIGhlcmUsIGJ1dCB0aGlzIGlzIG9ubHkKKwkJCSAgIGEgZmFsbGJhY2sgYW55d2F5cy4gKi8KKwkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICJIYW1tZXIiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisKKwkvKiBNdWx0aSBjb3JlIENQVT8gKi8KKwlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwOCkgeworCQlhbWRfZGV0ZWN0X2NtcChjKTsKKwkJc3JhdF9kZXRlY3Rfbm9kZShjKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJZGV0ZWN0X2h0KGMpOworI2VuZGlmCisKKwlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwNikgeworCQlpZiAoKGMtPng4NiA+PSAweDBmKSAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDYpICYgMHhmMDAwKSkKKwkJCW51bV9jYWNoZV9sZWF2ZXMgPSA0OworCQllbHNlCisJCQludW1fY2FjaGVfbGVhdmVzID0gMzsKKwl9CisKKwlpZiAoYy0+eDg2ID49IDB4ZiAmJiBjLT54ODYgPD0gMHgxMSkKKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfSzgpOworCisJaWYgKGNwdV9oYXNfeG1tMikgeworCQkvKiBNRkVOQ0Ugc3RvcHMgUkRUU0Mgc3BlY3VsYXRpb24gKi8KIAkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaWYgKGMtPng4NiA9PSAweDEwKSB7CisJCS8qIGRvIHRoaXMgZm9yIGJvb3QgY3B1ICovCisJCWlmIChjID09ICZib290X2NwdV9kYXRhKQorCQkJY2hlY2tfZW5hYmxlX2FtZF9tbWNvbmZfZG1pKCk7CisKKwkJZmFtMTBoX2NoZWNrX2VuYWJsZV9tbWNmZygpOworCX0KKworCWlmIChjID09ICZib290X2NwdV9kYXRhICYmIGMtPng4NiA+PSAweGYgJiYgYy0+eDg2IDw9IDB4MTEpIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHRzZWc7CisKKwkJLyoKKwkJICogU3BsaXQgdXAgZGlyZWN0IG1hcHBpbmcgYXJvdW5kIHRoZSBUU0VHIFNNTSBhcmVhLgorCQkgKiBEb24ndCBkbyBpdCBmb3IgZ2JwYWdlcyBiZWNhdXNlIHRoZXJlIHNlZW1zIHZlcnkgbGl0dGxlCisJCSAqIGJlbmVmaXQgaW4gZG9pbmcgc28uCisJCSAqLworCQlpZiAoIXJkbXNybF9zYWZlKE1TUl9LOF9UU0VHX0FERFIsICZ0c2VnKSkgeworCQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInRzZWc6ICUwMTBsbHhcbiIsIHRzZWcpOworCQkgICAgaWYgKCh0c2VnPj5QTURfU0hJRlQpIDwKKwkJCQkobWF4X2xvd19wZm5fbWFwcGVkPj4oUE1EX1NISUZULVBBR0VfU0hJRlQpKSB8fAorCQkJKCh0c2VnPj5QTURfU0hJRlQpIDwKKwkJCQkobWF4X3Bmbl9tYXBwZWQ+PihQTURfU0hJRlQtUEFHRV9TSElGVCkpICYmCisJCQkgKHRzZWc+PlBNRF9TSElGVCkgPj0gKDFVTEw8PCgzMiAtIFBNRF9TSElGVCkpKSkKKwkJCXNldF9tZW1vcnlfNGsoKHVuc2lnbmVkIGxvbmcpX192YSh0c2VnKSwgMSk7CisJCX0KKwl9CisjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19YODZfMzIKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19jcHVpbml0IGFtZF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJLyogQU1EIGVycmF0YSBUMTMgKG9yZGVyICMyMTkyMikgKi8KQEAgLTI3OCwxMCArNDQ1LDEyIEBACiAJfQogCXJldHVybiBzaXplOwogfQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBhbWRfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJBTUQiLAogCS5jX2lkZW50CT0geyAiQXV0aGVudGljQU1EIiB9LAorI2lmZGVmIENPTkZJR19YODZfMzIKIAkuY19tb2RlbHMgPSB7CiAJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfQU1ELCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KIAkJICB7CkBAIC0yOTQsOSArNDYzLDExIEBACiAJCSAgfQogCQl9LAogCX0sCisJLmNfc2l6ZV9jYWNoZQk9IGFtZF9zaXplX2NhY2hlLAorI2VuZGlmCiAJLmNfZWFybHlfaW5pdCAgID0gZWFybHlfaW5pdF9hbWQsCiAJLmNfaW5pdAkJPSBpbml0X2FtZCwKLQkuY19zaXplX2NhY2hlCT0gYW1kX3NpemVfY2FjaGUsCisJLmNfeDg2X3ZlbmRvcgk9IFg4Nl9WRU5ET1JfQU1ELAogfTsKIAotY3B1X3ZlbmRvcl9kZXZfcmVnaXN0ZXIoWDg2X1ZFTkRPUl9BTUQsICZhbWRfY3B1X2Rldik7CitjcHVfZGV2X3JlZ2lzdGVyKGFtZF9jcHVfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZF82NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY5MmIyLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kXzY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8YXNtL251bWFfNjQuaD4KLSNpbmNsdWRlIDxhc20vbW1jb25maWcuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotCi0jaW5jbHVkZSA8bWFjaF9hcGljLmg+Ci0KLSNpbmNsdWRlICJjcHUuaCIKLQotaW50IGZvcmNlX213YWl0IF9fY3B1aW5pdGRhdGE7Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotc3RhdGljIGludCBfX2NwdWluaXQgbmVhcmJ5X25vZGUoaW50IGFwaWNpZCkKLXsKLQlpbnQgaSwgbm9kZTsKLQotCWZvciAoaSA9IGFwaWNpZCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtpXTsKLQkJaWYgKG5vZGUgIT0gTlVNQV9OT19OT0RFICYmIG5vZGVfb25saW5lKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7Ci0JfQotCWZvciAoaSA9IGFwaWNpZCArIDE7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKSB7Ci0JCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtpXTsKLQkJaWYgKG5vZGUgIT0gTlVNQV9OT19OT0RFICYmIG5vZGVfb25saW5lKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7Ci0JfQotCXJldHVybiBmaXJzdF9ub2RlKG5vZGVfb25saW5lX21hcCk7IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLX0KLSNlbmRpZgotCi0vKgotICogT24gYSBBTUQgZHVhbCBjb3JlIHNldHVwIHRoZSBsb3dlciBiaXRzIG9mIHRoZSBBUElDIGlkIGRpc3Rpbmd1c2ggdGhlIGNvcmVzLgotICogQXNzdW1lcyBudW1iZXIgb2YgY29yZXMgaXMgYSBwb3dlciBvZiB0d28uCi0gKi8KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBhbWRfZGV0ZWN0X2NtcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCXVuc2lnbmVkIGJpdHM7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBub2RlID0gMDsKLQl1bnNpZ25lZCBhcGljaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLSNlbmRpZgotCWJpdHMgPSBjLT54ODZfY29yZWlkX2JpdHM7Ci0KLQkvKiBMb3cgb3JkZXIgYml0cyBkZWZpbmUgdGhlIGNvcmUgaWQgKGluZGV4IG9mIGNvcmUgaW4gc29ja2V0KSAqLwotCWMtPmNwdV9jb3JlX2lkID0gYy0+aW5pdGlhbF9hcGljaWQgJiAoKDEgPDwgYml0cyktMSk7Ci0JLyogQ29udmVydCB0aGUgaW5pdGlhbCBBUElDIElEIGludG8gdGhlIHNvY2tldCBJRCAqLwotCWMtPnBoeXNfcHJvY19pZCA9IGMtPmluaXRpYWxfYXBpY2lkID4+IGJpdHM7Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCW5vZGUgPSBjLT5waHlzX3Byb2NfaWQ7Ci0JaWYgKGFwaWNpZF90b19ub2RlW2FwaWNpZF0gIT0gTlVNQV9OT19OT0RFKQotCQlub2RlID0gYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKLQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKSB7Ci0JCS8qIFR3byBwb3NzaWJpbGl0aWVzIGhlcmU6Ci0JCSAgIC0gVGhlIENQVSBpcyBtaXNzaW5nIG1lbW9yeSBhbmQgbm8gbm9kZSB3YXMgY3JlYXRlZC4KLQkJICAgSW4gdGhhdCBjYXNlIHRyeSBwaWNraW5nIG9uZSBmcm9tIGEgbmVhcmJ5IENQVQotCQkgICAtIFRoZSBBUElDIElEcyBkaWZmZXIgZnJvbSB0aGUgSHlwZXJUcmFuc3BvcnQgbm9kZSBJRHMKLQkJICAgd2hpY2ggdGhlIEs4IG5vcnRoYnJpZGdlIHBhcnNpbmcgZmlsbHMgaW4uCi0JCSAgIEFzc3VtZSB0aGV5IGFyZSBhbGwgaW5jcmVhc2VkIGJ5IGEgY29uc3RhbnQgb2Zmc2V0LAotCQkgICBidXQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEhUIG5vZGVpZHMuCi0JCSAgIElmIHRoYXQgZG9lc24ndCByZXN1bHQgaW4gYSB1c2FibGUgbm9kZSBmYWxsIGJhY2sgdG8gdGhlCi0JCSAgIHBhdGggZm9yIHRoZSBwcmV2aW91cyBjYXNlLiAgKi8KLQotCQlpbnQgaHRfbm9kZWlkID0gYy0+aW5pdGlhbF9hcGljaWQ7Ci0KLQkJaWYgKGh0X25vZGVpZCA+PSAwICYmCi0JCSAgICBhcGljaWRfdG9fbm9kZVtodF9ub2RlaWRdICE9IE5VTUFfTk9fTk9ERSkKLQkJCW5vZGUgPSBhcGljaWRfdG9fbm9kZVtodF9ub2RlaWRdOwotCQkvKiBQaWNrIGEgbmVhcmJ5IG5vZGUgKi8KLQkJaWYgKCFub2RlX29ubGluZShub2RlKSkKLQkJCW5vZGUgPSBuZWFyYnlfbm9kZShhcGljaWQpOwotCX0KLQludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQvJXggLT4gTm9kZSAlZFxuIiwgY3B1LCBhcGljaWQsIG5vZGUpOwotI2VuZGlmCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgX19jcHVpbml0IGVhcmx5X2luaXRfYW1kX21jKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JdW5zaWduZWQgYml0cywgZWN4OwotCi0JLyogTXVsdGkgY29yZSBDUFU/ICovCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsIDwgMHg4MDAwMDAwOCkKLQkJcmV0dXJuOwotCi0JZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDgpOwotCi0JYy0+eDg2X21heF9jb3JlcyA9IChlY3ggJiAweGZmKSArIDE7Ci0KLQkvKiBDUFUgdGVsbGluZyB1cyB0aGUgY29yZSBpZCBiaXRzIHNoaWZ0PyAqLwotCWJpdHMgPSAoZWN4ID4+IDEyKSAmIDB4RjsKLQotCS8qIE90aGVyd2lzZSByZWNvbXB1dGUgKi8KLQlpZiAoYml0cyA9PSAwKSB7Ci0JCXdoaWxlICgoMSA8PCBiaXRzKSA8IGMtPng4Nl9tYXhfY29yZXMpCi0JCQliaXRzKys7Ci0JfQotCi0JYy0+eDg2X2NvcmVpZF9iaXRzID0gYml0czsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JZWFybHlfaW5pdF9hbWRfbWMoYyk7Ci0KLQkvKiBjLT54ODZfcG93ZXIgaXMgODAwMF8wMDA3IGVkeC4gQml0IDggaXMgY29uc3RhbnQgVFNDICovCi0JaWYgKGMtPng4Nl9wb3dlciAmICgxPDw4KSkKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKLQotCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1NZU0NBTEwzMik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JdW5zaWduZWQgbGV2ZWw7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCS8qCi0JICogRGlzYWJsZSBUTEIgZmx1c2ggZmlsdGVyIGJ5IHNldHRpbmcgSFdDUi5GRkRJUyBvbiBLOAotCSAqIGJpdCA2IG9mIG1zciBDMDAxXzAwMTUKLQkgKgotCSAqIEVycmF0YSA2MyBmb3IgU0gtQjMgc3RlcHBpbmdzCi0JICogRXJyYXRhIDEyMiBmb3IgYWxsIHN0ZXBwaW5ncyAoRisgaGF2ZSBpdCBkaXNhYmxlZCBieSBkZWZhdWx0KQotCSAqLwotCWlmIChjLT54ODYgPT0gMHhmKSB7Ci0JCXJkbXNybChNU1JfSzhfSFdDUiwgdmFsdWUpOwotCQl2YWx1ZSB8PSAxIDw8IDY7Ci0JCXdybXNybChNU1JfSzhfSFdDUiwgdmFsdWUpOwotCX0KLSNlbmRpZgotCi0JLyogQml0IDMxIGluIG5vcm1hbCBDUFVJRCB1c2VkIGZvciBub25zdGFuZGFyZCAzRE5vdyBJRDsKLQkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KLQljbGVhcl9jcHVfY2FwKGMsIDAqMzIrMzEpOwotCi0JLyogT24gQysgc3RlcHBpbmcgSzggcmVwIG1pY3JvY29kZSB3b3JrcyB3ZWxsIGZvciBjb3B5L21lbXNldCAqLwotCWlmIChjLT54ODYgPT0gMHhmKSB7Ci0JCWxldmVsID0gY3B1aWRfZWF4KDEpOwotCQlpZigobGV2ZWwgPj0gMHgwZjQ4ICYmIGxldmVsIDwgMHgwZjUwKSB8fCBsZXZlbCA+PSAweDBmNTgpCi0JCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9SRVBfR09PRCk7Ci0JfQotCWlmIChjLT54ODYgPT0gMHgxMCB8fCBjLT54ODYgPT0gMHgxMSkKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUkVQX0dPT0QpOwotCi0JLyogRW5hYmxlIHdvcmthcm91bmQgZm9yIEZYU0FWRSBsZWFrICovCi0JaWYgKGMtPng4NiA+PSA2KQotCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9GWFNBVkVfTEVBSyk7Ci0KLQlsZXZlbCA9IGdldF9tb2RlbF9uYW1lKGMpOwotCWlmICghbGV2ZWwpIHsKLQkJc3dpdGNoIChjLT54ODYpIHsKLQkJY2FzZSAweGY6Ci0JCQkvKiBTaG91bGQgZGlzdGluZ3Vpc2ggTW9kZWxzIGhlcmUsIGJ1dCB0aGlzIGlzIG9ubHkKLQkJCSAgIGEgZmFsbGJhY2sgYW55d2F5cy4gKi8KLQkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICJIYW1tZXIiKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWRpc3BsYXlfY2FjaGVpbmZvKGMpOwotCi0JLyogTXVsdGkgY29yZSBDUFU/ICovCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDgpCi0JCWFtZF9kZXRlY3RfY21wKGMpOwotCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDYgJiYKLQkJKGNwdWlkX2VkeCgweDgwMDAwMDA2KSAmIDB4ZjAwMCkpCi0JCW51bV9jYWNoZV9sZWF2ZXMgPSA0OwotCWVsc2UKLQkJbnVtX2NhY2hlX2xlYXZlcyA9IDM7Ci0KLQlpZiAoYy0+eDg2ID49IDB4ZiAmJiBjLT54ODYgPD0gMHgxMSkKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfSzgpOwotCi0JLyogTUZFTkNFIHN0b3BzIFJEVFNDIHNwZWN1bGF0aW9uICovCi0Jc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDKTsKLQotCWlmIChjLT54ODYgPT0gMHgxMCkgewotCQkvKiBkbyB0aGlzIGZvciBib290IGNwdSAqLwotCQlpZiAoYyA9PSAmYm9vdF9jcHVfZGF0YSkKLQkJCWNoZWNrX2VuYWJsZV9hbWRfbW1jb25mX2RtaSgpOwotCi0JCWZhbTEwaF9jaGVja19lbmFibGVfbW1jZmcoKTsKLQl9Ci0KLQlpZiAoYyA9PSAmYm9vdF9jcHVfZGF0YSAmJiBjLT54ODYgPj0gMHhmICYmIGMtPng4NiA8PSAweDExKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2VnOwotCi0JCS8qCi0JCSAqIFNwbGl0IHVwIGRpcmVjdCBtYXBwaW5nIGFyb3VuZCB0aGUgVFNFRyBTTU0gYXJlYS4KLQkJICogRG9uJ3QgZG8gaXQgZm9yIGdicGFnZXMgYmVjYXVzZSB0aGVyZSBzZWVtcyB2ZXJ5IGxpdHRsZQotCQkgKiBiZW5lZml0IGluIGRvaW5nIHNvLgotCQkgKi8KLQkJaWYgKCFyZG1zcmxfc2FmZShNU1JfSzhfVFNFR19BRERSLCAmdHNlZykpIHsKLQkJICAgIHByaW50ayhLRVJOX0RFQlVHICJ0c2VnOiAlMDEwbGx4XG4iLCB0c2VnKTsKLQkJICAgIGlmICgodHNlZz4+UE1EX1NISUZUKSA8Ci0JCQkJKG1heF9sb3dfcGZuX21hcHBlZD4+KFBNRF9TSElGVC1QQUdFX1NISUZUKSkgfHwKLQkJCSgodHNlZz4+UE1EX1NISUZUKSA8Ci0JCQkJKG1heF9wZm5fbWFwcGVkPj4oUE1EX1NISUZULVBBR0VfU0hJRlQpKSAmJgotCQkJICh0c2VnPj5QTURfU0hJRlQpID49ICgxVUxMPDwoMzIgLSBQTURfU0hJRlQpKSkpCi0JCQlzZXRfbWVtb3J5XzRrKCh1bnNpZ25lZCBsb25nKV9fdmEodHNlZyksIDEpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgYW1kX2NwdV9kZXYgX19jcHVpbml0ZGF0YSA9IHsKLQkuY192ZW5kb3IJPSAiQU1EIiwKLQkuY19pZGVudAk9IHsgIkF1dGhlbnRpY0FNRCIgfSwKLQkuY19lYXJseV9pbml0ICAgPSBlYXJseV9pbml0X2FtZCwKLQkuY19pbml0CQk9IGluaXRfYW1kLAotfTsKLQotY3B1X3ZlbmRvcl9kZXZfcmVnaXN0ZXIoWDg2X1ZFTkRPUl9BTUQsICZhbWRfY3B1X2Rldik7Ci0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY2VudGF1ci5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jZW50YXVyLmMKaW5kZXggZTBmNDVlZC4uODliZmRkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jZW50YXVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jZW50YXVyLmMKQEAgLTI4OSw3ICsyODksNiBAQAogCWlmIChjLT54ODZfbW9kZWwgPj0gNiAmJiBjLT54ODZfbW9kZWwgPCA5KQogCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV8zRE5PVyk7CiAKLQlnZXRfbW9kZWxfbmFtZShjKTsKIAlkaXNwbGF5X2NhY2hlaW5mbyhjKTsKIH0KIApAQCAtMzE0LDYgKzMxMywxNiBAQAogCQlFQU1EM0QJCT0gMTw8MjAsCiB9OwogCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaW5pdF9jZW50YXVyKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlzd2l0Y2ggKGMtPng4NikgeworCWNhc2UgNToKKwkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDZW50YXVyJ3MgTUNSLiAqLworCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9DRU5UQVVSX01DUik7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfY2VudGF1cihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAKQEAgLTQ2Miw4ICs0NzEsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjZW50YXVyX2NwdV9kZXYgX19jcHVpbml0ZGF0YSA9IHsKIAkuY192ZW5kb3IJPSAiQ2VudGF1ciIsCiAJLmNfaWRlbnQJPSB7ICJDZW50YXVySGF1bHMiIH0sCisJLmNfZWFybHlfaW5pdAk9IGVhcmx5X2luaXRfY2VudGF1ciwKIAkuY19pbml0CQk9IGluaXRfY2VudGF1ciwKIAkuY19zaXplX2NhY2hlCT0gY2VudGF1cl9zaXplX2NhY2hlLAorCS5jX3g4Nl92ZW5kb3IJPSBYODZfVkVORE9SX0NFTlRBVVIsCiB9OwogCi1jcHVfdmVuZG9yX2Rldl9yZWdpc3RlcihYODZfVkVORE9SX0NFTlRBVVIsICZjZW50YXVyX2NwdV9kZXYpOworY3B1X2Rldl9yZWdpc3RlcihjZW50YXVyX2NwdV9kZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jZW50YXVyXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NlbnRhdXJfNjQuYwppbmRleCAxZDE4MWM0Li5hMTYyNWY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NlbnRhdXJfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NlbnRhdXJfNjQuYwpAQCAtMTYsOSArMTYsMTAgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfY2VudGF1cihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJZWFybHlfaW5pdF9jZW50YXVyKGMpOworCiAJaWYgKGMtPng4NiA9PSAweDYgJiYgYy0+eDg2X21vZGVsID49IDB4ZikgewogCQljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gYy0+eDg2X2NsZmx1c2hfc2l6ZSAqIDI7Ci0JCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQyk7CiAJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JFUF9HT09EKTsKIAl9CiAJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKQEAgLTI5LDcgKzMwLDggQEAKIAkuY19pZGVudAk9IHsgIkNlbnRhdXJIYXVscyIgfSwKIAkuY19lYXJseV9pbml0CT0gZWFybHlfaW5pdF9jZW50YXVyLAogCS5jX2luaXQJCT0gaW5pdF9jZW50YXVyLAorCS5jX3g4Nl92ZW5kb3IJPSBYODZfVkVORE9SX0NFTlRBVVIsCiB9OwogCi1jcHVfdmVuZG9yX2Rldl9yZWdpc3RlcihYODZfVkVORE9SX0NFTlRBVVIsICZjZW50YXVyX2NwdV9kZXYpOworY3B1X2Rldl9yZWdpc3RlcihjZW50YXVyX2NwdV9kZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NtcHhjaGcuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY21weGNoZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTZjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NtcHhjaGcuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogY21weGNoZyooKSBmYWxsYmFja3MgZm9yIENQVSBub3Qgc3VwcG9ydGluZyB0aGVzZSBpbnN0cnVjdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZm5kZWYgQ09ORklHX1g4Nl9DTVBYQ0hHCit1bnNpZ25lZCBsb25nIGNtcHhjaGdfMzg2X3U4KHZvbGF0aWxlIHZvaWQgKnB0ciwgdTggb2xkLCB1OCBuZXcpCit7CisJdTggcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1OCAqKXB0cjsKKwlpZiAocHJldiA9PSBvbGQpCisJCSoodTggKilwdHIgPSBuZXc7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBwcmV2OworfQorRVhQT1JUX1NZTUJPTChjbXB4Y2hnXzM4Nl91OCk7CisKK3Vuc2lnbmVkIGxvbmcgY21weGNoZ18zODZfdTE2KHZvbGF0aWxlIHZvaWQgKnB0ciwgdTE2IG9sZCwgdTE2IG5ldykKK3sKKwl1MTYgcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1MTYgKilwdHI7CisJaWYgKHByZXYgPT0gb2xkKQorCQkqKHUxNiAqKXB0ciA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHByZXY7Cit9CitFWFBPUlRfU1lNQk9MKGNtcHhjaGdfMzg2X3UxNik7CisKK3Vuc2lnbmVkIGxvbmcgY21weGNoZ18zODZfdTMyKHZvbGF0aWxlIHZvaWQgKnB0ciwgdTMyIG9sZCwgdTMyIG5ldykKK3sKKwl1MzIgcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUG9vciBtYW4ncyBjbXB4Y2hnIGZvciAzODYuIFVuc3VpdGFibGUgZm9yIFNNUCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmV2ID0gKih1MzIgKilwdHI7CisJaWYgKHByZXYgPT0gb2xkKQorCQkqKHUzMiAqKXB0ciA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHByZXY7Cit9CitFWFBPUlRfU1lNQk9MKGNtcHhjaGdfMzg2X3UzMik7CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfWDg2X0NNUFhDSEc2NAordW5zaWduZWQgbG9uZyBsb25nIGNtcHhjaGdfNDg2X3U2NCh2b2xhdGlsZSB2b2lkICpwdHIsIHU2NCBvbGQsIHU2NCBuZXcpCit7CisJdTY0IHByZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBvb3IgbWFuJ3MgY21weGNoZzhiIGZvciAzODYgYW5kIDQ4Ni4gVW5zdWl0YWJsZSBmb3IgU01QICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXByZXYgPSAqKHU2NCAqKXB0cjsKKwlpZiAocHJldiA9PSBvbGQpCisJCSoodTY0ICopcHRyID0gbmV3OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcHJldjsKK30KK0VYUE9SVF9TWU1CT0woY21weGNoZ180ODZfdTY0KTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA4MGFiMjBkLi4yNTU4MWRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTEsMjcgKzEsNjIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2dkYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL3BhdC5oPgorI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vbnVtYS5oPgogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKwogI2luY2x1ZGUgImNwdS5oIgogCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgKnRoaXNfY3B1IF9fY3B1aW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvKiBXZSBuZWVkIHZhbGlkIGtlcm5lbCBzZWdtZW50cyBmb3IgZGF0YSBhbmQgY29kZSBpbiBsb25nIG1vZGUgdG9vCisgKiBJUkVUIHdpbGwgY2hlY2sgdGhlIHNlZ21lbnQgdHlwZXMgIGtrZWlsIDIwMDAvMTAvMjgKKyAqIEFsc28gc3lzcmV0IG1hbmRhdGVzIGEgc3BlY2lhbCBHRFQgbGF5b3V0CisgKi8KKy8qIFRoZSBUTFMgZGVzY3JpcHRvcnMgYXJlIGN1cnJlbnRseSBhdCBhIGRpZmZlcmVudCBwbGFjZSBjb21wYXJlZCB0byBpMzg2LgorICAgSG9wZWZ1bGx5IG5vYm9keSBleHBlY3RzIHRoZW0gYXQgYSBmaXhlZCBwbGFjZSAoV2luZT8pICovCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZ2R0X3BhZ2UsIGdkdF9wYWdlKSA9IHsgLmdkdCA9IHsKKwlbR0RUX0VOVFJZX0tFUk5FTDMyX0NTXSA9IHsgeyB7IDB4MDAwMGZmZmYsIDB4MDBjZjliMDAgfSB9IH0sCisJW0dEVF9FTlRSWV9LRVJORUxfQ1NdID0geyB7IHsgMHgwMDAwZmZmZiwgMHgwMGFmOWIwMCB9IH0gfSwKKwlbR0RUX0VOVFJZX0tFUk5FTF9EU10gPSB7IHsgeyAweDAwMDBmZmZmLCAweDAwY2Y5MzAwIH0gfSB9LAorCVtHRFRfRU5UUllfREVGQVVMVF9VU0VSMzJfQ1NdID0geyB7IHsgMHgwMDAwZmZmZiwgMHgwMGNmZmIwMCB9IH0gfSwKKwlbR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9EU10gPSB7IHsgeyAweDAwMDBmZmZmLCAweDAwY2ZmMzAwIH0gfSB9LAorCVtHRFRfRU5UUllfREVGQVVMVF9VU0VSX0NTXSA9IHsgeyB7IDB4MDAwMGZmZmYsIDB4MDBhZmZiMDAgfSB9IH0sCit9IH07CisjZWxzZQorREVGSU5FX1BFUl9DUFVfUEFHRV9BTElHTkVEKHN0cnVjdCBnZHRfcGFnZSwgZ2R0X3BhZ2UpID0geyAuZ2R0ID0gewogCVtHRFRfRU5UUllfS0VSTkVMX0NTXSA9IHsgeyB7IDB4MDAwMGZmZmYsIDB4MDBjZjlhMDAgfSB9IH0sCiAJW0dEVF9FTlRSWV9LRVJORUxfRFNdID0geyB7IHsgMHgwMDAwZmZmZiwgMHgwMGNmOTIwMCB9IH0gfSwKIAlbR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DU10gPSB7IHsgeyAweDAwMDBmZmZmLCAweDAwY2ZmYTAwIH0gfSB9LApAQCAtNTUsMzQgKzkwLDEzIEBACiAJW0dEVF9FTlRSWV9FU1BGSVhfU1NdID0geyB7IHsgMHgwMDAwMDAwMCwgMHgwMGMwOTIwMCB9IH0gfSwKIAlbR0RUX0VOVFJZX1BFUkNQVV0gPSB7IHsgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0gfSB9LAogfSB9OworI2VuZGlmCiBFWFBPUlRfUEVSX0NQVV9TWU1CT0xfR1BMKGdkdF9wYWdlKTsKIAotX191MzIgY2xlYXJlZF9jcHVfY2Fwc1tOQ0FQSU5UU10gX19jcHVpbml0ZGF0YTsKLQorI2lmZGVmIENPTkZJR19YODZfMzIKIHN0YXRpYyBpbnQgY2FjaGVzaXplX292ZXJyaWRlIF9fY3B1aW5pdGRhdGEgPSAtMTsKIHN0YXRpYyBpbnQgZGlzYWJsZV94ODZfc2VyaWFsX25yIF9fY3B1aW5pdGRhdGEgPSAxOwogCi1zdHJ1Y3QgY3B1X2RldiAqY3B1X2RldnNbWDg2X1ZFTkRPUl9OVU1dID0ge307Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBkZWZhdWx0X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQotewotCS8qIE5vdCBtdWNoIHdlIGNhbiBkbyBoZXJlLi4uICovCi0JLyogQ2hlY2sgaWYgYXQgbGVhc3QgaXQgaGFzIGNwdWlkICovCi0JaWYgKGMtPmNwdWlkX2xldmVsID09IC0xKSB7Ci0JCS8qIE5vIGNwdWlkLiBJdCBtdXN0IGJlIGFuIGFuY2llbnQgQ1BVICovCi0JCWlmIChjLT54ODYgPT0gNCkKLQkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICI0ODYiKTsKLQkJZWxzZSBpZiAoYy0+eDg2ID09IDMpCi0JCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCAiMzg2Iik7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgX19jcHVpbml0ZGF0YSBkZWZhdWx0X2NwdSA9IHsKLQkuY19pbml0CT0gZGVmYXVsdF9pbml0LAotCS5jX3ZlbmRvciA9ICJVbmtub3duIiwKLX07Ci1zdGF0aWMgc3RydWN0IGNwdV9kZXYgKnRoaXNfY3B1IF9fY3B1aW5pdGRhdGEgPSAmZGVmYXVsdF9jcHU7Ci0KIHN0YXRpYyBpbnQgX19pbml0IGNhY2hlc2l6ZV9zZXR1cChjaGFyICpzdHIpCiB7CiAJZ2V0X29wdGlvbigmc3RyLCAmY2FjaGVzaXplX292ZXJyaWRlKTsKQEAgLTkwLDcxICsxMDQsOTEgQEAKIH0KIF9fc2V0dXAoImNhY2hlc2l6ZT0iLCBjYWNoZXNpemVfc2V0dXApOwogCi1pbnQgX19jcHVpbml0IGdldF9tb2RlbF9uYW1lKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyBpbnQgX19pbml0IHg4Nl9meHNyX3NldHVwKGNoYXIgKnMpCiB7Ci0JdW5zaWduZWQgaW50ICp2OwotCWNoYXIgKnAsICpxOwotCi0JaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA8IDB4ODAwMDAwMDQpCi0JCXJldHVybiAwOwotCi0JdiA9ICh1bnNpZ25lZCBpbnQgKikgYy0+eDg2X21vZGVsX2lkOwotCWNwdWlkKDB4ODAwMDAwMDIsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKLQljcHVpZCgweDgwMDAwMDAzLCAmdls0XSwgJnZbNV0sICZ2WzZdLCAmdls3XSk7Ci0JY3B1aWQoMHg4MDAwMDAwNCwgJnZbOF0sICZ2WzldLCAmdlsxMF0sICZ2WzExXSk7Ci0JYy0+eDg2X21vZGVsX2lkWzQ4XSA9IDA7Ci0KLQkvKiBJbnRlbCBjaGlwcyByaWdodC1qdXN0aWZ5IHRoaXMgc3RyaW5nIGZvciBzb21lIGR1bWIgcmVhc29uOwotCSAgIHVuZG8gdGhhdCBicmFpbiBkYW1hZ2UgKi8KLQlwID0gcSA9ICZjLT54ODZfbW9kZWxfaWRbMF07Ci0Jd2hpbGUgKCpwID09ICcgJykKLQkgICAgIHArKzsKLQlpZiAocCAhPSBxKSB7Ci0JICAgICB3aGlsZSAoKnApCi0JCSAgKnErKyA9ICpwKys7Ci0JICAgICB3aGlsZSAocSA8PSAmYy0+eDg2X21vZGVsX2lkWzQ4XSkKLQkJICAqcSsrID0gJ1wwJzsJLyogWmVyby1wYWQgdGhlIHJlc3QgKi8KLQl9Ci0KKwlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX0ZYU1IpOworCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfWE1NKTsKIAlyZXR1cm4gMTsKIH0KK19fc2V0dXAoIm5vZnhzciIsIHg4Nl9meHNyX3NldHVwKTsKIAotCi12b2lkIF9fY3B1aW5pdCBkaXNwbGF5X2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgaW50IF9faW5pdCB4ODZfc2VwX3NldHVwKGNoYXIgKnMpCiB7Ci0JdW5zaWduZWQgaW50IG4sIGR1bW15LCBlY3gsIGVkeCwgbDJzaXplOwotCi0JbiA9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKLQotCWlmIChuID49IDB4ODAwMDAwMDUpIHsKLQkJY3B1aWQoMHg4MDAwMDAwNSwgJmR1bW15LCAmZHVtbXksICZlY3gsICZlZHgpOwotCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwxIEkgQ2FjaGU6ICVkSyAoJWQgYnl0ZXMvbGluZSksIEQgY2FjaGUgJWRLICglZCBieXRlcy9saW5lKVxuIiwKLQkJCWVkeD4+MjQsIGVkeCYweEZGLCBlY3g+PjI0LCBlY3gmMHhGRik7Ci0JCWMtPng4Nl9jYWNoZV9zaXplID0gKGVjeD4+MjQpKyhlZHg+PjI0KTsKLQl9Ci0KLQlpZiAobiA8IDB4ODAwMDAwMDYpCS8qIFNvbWUgY2hpcHMganVzdCBoYXMgYSBsYXJnZSBMMS4gKi8KLQkJcmV0dXJuOwotCi0JZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDYpOwotCWwyc2l6ZSA9IGVjeCA+PiAxNjsKLQotCS8qIGRvIHByb2Nlc3Nvci1zcGVjaWZpYyBjYWNoZSByZXNpemluZyAqLwotCWlmICh0aGlzX2NwdS0+Y19zaXplX2NhY2hlKQotCQlsMnNpemUgPSB0aGlzX2NwdS0+Y19zaXplX2NhY2hlKGMsIGwyc2l6ZSk7Ci0KLQkvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGFsbCB0aGlzIGlmIG5lY2Vzc2FyeS4gKi8KLQlpZiAoY2FjaGVzaXplX292ZXJyaWRlICE9IC0xKQotCQlsMnNpemUgPSBjYWNoZXNpemVfb3ZlcnJpZGU7Ci0KLQlpZiAobDJzaXplID09IDApCi0JCXJldHVybjsJCS8qIEFnYWluLCBubyBMMiBjYWNoZSBpcyBwb3NzaWJsZSAqLwotCi0JYy0+eDg2X2NhY2hlX3NpemUgPSBsMnNpemU7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwyIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpXG4iLAotCSAgICAgICBsMnNpemUsIGVjeCAmIDB4RkYpOworCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfU0VQKTsKKwlyZXR1cm4gMTsKIH0KK19fc2V0dXAoIm5vc2VwIiwgeDg2X3NlcF9zZXR1cCk7CisKKy8qIFN0YW5kYXJkIG1hY3JvIHRvIHNlZSBpZiBhIHNwZWNpZmljIGZsYWcgaXMgY2hhbmdlYWJsZSAqLworc3RhdGljIGlubGluZSBpbnQgZmxhZ19pc19jaGFuZ2VhYmxlX3AodTMyIGZsYWcpCit7CisJdTMyIGYxLCBmMjsKKworCS8qCisJICogQ3lyaXggYW5kIElEVCBjcHVzIGFsbG93IGRpc2FibGluZyBvZiBDUFVJRAorCSAqIHNvIHRoZSBjb2RlIGJlbG93IG1heSByZXR1cm4gZGlmZmVyZW50IHJlc3VsdHMKKwkgKiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZW5hYmxpbmcKKwkgKiB0aGUgQ1BVSUQuIEFkZCAidm9sYXRpbGUiIHRvIG5vdCBhbGxvdyBnY2MgdG8KKwkgKiBvcHRpbWl6ZSB0aGUgc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWFzbSB2b2xhdGlsZSAoInB1c2hmbFxuXHQiCisJCSAgICAgICJwdXNoZmxcblx0IgorCQkgICAgICAicG9wbCAlMFxuXHQiCisJCSAgICAgICJtb3ZsICUwLCUxXG5cdCIKKwkJICAgICAgInhvcmwgJTIsJTBcblx0IgorCQkgICAgICAicHVzaGwgJTBcblx0IgorCQkgICAgICAicG9wZmxcblx0IgorCQkgICAgICAicHVzaGZsXG5cdCIKKwkJICAgICAgInBvcGwgJTBcblx0IgorCQkgICAgICAicG9wZmxcblx0IgorCQkgICAgICA6ICI9JnIiIChmMSksICI9JnIiIChmMikKKwkJICAgICAgOiAiaXIiIChmbGFnKSk7CisKKwlyZXR1cm4gKChmMV5mMikgJiBmbGFnKSAhPSAwOworfQorCisvKiBQcm9iZSBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IF9fY3B1aW5pdCBoYXZlX2NwdWlkX3Aodm9pZCkKK3sKKwlyZXR1cm4gZmxhZ19pc19jaGFuZ2VhYmxlX3AoWDg2X0VGTEFHU19JRCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcXVhc2hfdGhlX3N0dXBpZF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTikgJiYgZGlzYWJsZV94ODZfc2VyaWFsX25yKSB7CisJCS8qIERpc2FibGUgcHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KKwkJdW5zaWduZWQgbG9uZyBsbywgaGk7CisJCXJkbXNyKE1TUl9JQTMyX0JCTF9DUl9DVEwsIGxvLCBoaSk7CisJCWxvIHw9IDB4MjAwMDAwOworCQl3cm1zcihNU1JfSUEzMl9CQkxfQ1JfQ1RMLCBsbywgaGkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSBzZXJpYWwgbnVtYmVyIGRpc2FibGVkLlxuIik7CisJCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUE4pOworCisJCS8qIERpc2FibGluZyB0aGUgc2VyaWFsIG51bWJlciBtYXkgYWZmZWN0IHRoZSBjcHVpZCBsZXZlbCAqLworCQljLT5jcHVpZF9sZXZlbCA9IGNwdWlkX2VheCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHg4Nl9zZXJpYWxfbnJfc2V0dXAoY2hhciAqcykKK3sKKwlkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgPSAwOworCXJldHVybiAxOworfQorX19zZXR1cCgic2VyaWFsbnVtYmVyIiwgeDg2X3NlcmlhbF9ucl9zZXR1cCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZmxhZ19pc19jaGFuZ2VhYmxlX3AodTMyIGZsYWcpCit7CisJcmV0dXJuIDE7Cit9CisvKiBQcm9iZSBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBoYXZlX2NwdWlkX3Aodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcXVhc2hfdGhlX3N0dXBpZF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKK30KKyNlbmRpZgogCiAvKgogICogTmFtaW5nIGNvbnZlbnRpb24gc2hvdWxkIGJlOiA8TmFtZT4gWyg8Q29kZW5hbWU+KV0KQEAgLTE4NCw4MSArMjE4LDIxMCBAQAogCXJldHVybiBOVUxMOwkJLyogTm90IGZvdW5kICovCiB9CiAKK19fdTMyIGNsZWFyZWRfY3B1X2NhcHNbTkNBUElOVFNdIF9fY3B1aW5pdGRhdGE7CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZXRfY3B1X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGludCBlYXJseSkKKy8qIEN1cnJlbnQgZ2R0IHBvaW50cyAlZnMgYXQgdGhlICJtYXN0ZXIiIHBlci1jcHUgYXJlYTogYWZ0ZXIgdGhpcywKKyAqIGl0J3Mgb24gdGhlIHJlYWwgb25lLiAqLwordm9pZCBzd2l0Y2hfdG9fbmV3X2dkdCh2b2lkKQoreworCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CisKKwlnZHRfZGVzY3IuYWRkcmVzcyA9IChsb25nKWdldF9jcHVfZ2R0X3RhYmxlKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJZ2R0X2Rlc2NyLnNpemUgPSBHRFRfU0laRSAtIDE7CisJbG9hZF9nZHQoJmdkdF9kZXNjcik7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWFzbSgibW92ICUwLCAlJWZzIiA6IDogInIiIChfX0tFUk5FTF9QRVJDUFUpIDogIm1lbW9yeSIpOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiAqY3B1X2RldnNbWDg2X1ZFTkRPUl9OVU1dID0ge307CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkZWZhdWx0X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworI2lmZGVmIENPTkZJR19YODZfNjQKKwlkaXNwbGF5X2NhY2hlaW5mbyhjKTsKKyNlbHNlCisJLyogTm90IG11Y2ggd2UgY2FuIGRvIGhlcmUuLi4gKi8KKwkvKiBDaGVjayBpZiBhdCBsZWFzdCBpdCBoYXMgY3B1aWQgKi8KKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPT0gLTEpIHsKKwkJLyogTm8gY3B1aWQuIEl0IG11c3QgYmUgYW4gYW5jaWVudCBDUFUgKi8KKwkJaWYgKGMtPng4NiA9PSA0KQorCQkJc3RyY3B5KGMtPng4Nl9tb2RlbF9pZCwgIjQ4NiIpOworCQllbHNlIGlmIChjLT54ODYgPT0gMykKKwkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICIzODYiKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IF9fY3B1aW5pdGRhdGEgZGVmYXVsdF9jcHUgPSB7CisJLmNfaW5pdAk9IGRlZmF1bHRfaW5pdCwKKwkuY192ZW5kb3IgPSAiVW5rbm93biIsCisJLmNfeDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfVU5LTk9XTiwKK307CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgaW50ICp2OworCWNoYXIgKnAsICpxOworCisJaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsIDwgMHg4MDAwMDAwNCkKKwkJcmV0dXJuOworCisJdiA9ICh1bnNpZ25lZCBpbnQgKikgYy0+eDg2X21vZGVsX2lkOworCWNwdWlkKDB4ODAwMDAwMDIsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKKwljcHVpZCgweDgwMDAwMDAzLCAmdls0XSwgJnZbNV0sICZ2WzZdLCAmdls3XSk7CisJY3B1aWQoMHg4MDAwMDAwNCwgJnZbOF0sICZ2WzldLCAmdlsxMF0sICZ2WzExXSk7CisJYy0+eDg2X21vZGVsX2lkWzQ4XSA9IDA7CisKKwkvKiBJbnRlbCBjaGlwcyByaWdodC1qdXN0aWZ5IHRoaXMgc3RyaW5nIGZvciBzb21lIGR1bWIgcmVhc29uOworCSAgIHVuZG8gdGhhdCBicmFpbiBkYW1hZ2UgKi8KKwlwID0gcSA9ICZjLT54ODZfbW9kZWxfaWRbMF07CisJd2hpbGUgKCpwID09ICcgJykKKwkgICAgIHArKzsKKwlpZiAocCAhPSBxKSB7CisJICAgICB3aGlsZSAoKnApCisJCSAgKnErKyA9ICpwKys7CisJICAgICB3aGlsZSAocSA8PSAmYy0+eDg2X21vZGVsX2lkWzQ4XSkKKwkJICAqcSsrID0gJ1wwJzsJLyogWmVyby1wYWQgdGhlIHJlc3QgKi8KKwl9Cit9CisKK3ZvaWQgX19jcHVpbml0IGRpc3BsYXlfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgbiwgZHVtbXksIGVieCwgZWN4LCBlZHgsIGwyc2l6ZTsKKworCW4gPSBjLT5leHRlbmRlZF9jcHVpZF9sZXZlbDsKKworCWlmIChuID49IDB4ODAwMDAwMDUpIHsKKwkJY3B1aWQoMHg4MDAwMDAwNSwgJmR1bW15LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBMMSBJIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpLCBEIGNhY2hlICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCisJCQkJZWR4Pj4yNCwgZWR4JjB4RkYsIGVjeD4+MjQsIGVjeCYweEZGKTsKKwkJYy0+eDg2X2NhY2hlX3NpemUgPSAoZWN4Pj4yNCkgKyAoZWR4Pj4yNCk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQkvKiBPbiBLOCBMMSBUTEIgaXMgaW5jbHVzaXZlLCBzbyBkb24ndCBjb3VudCBpdCAqLworCQljLT54ODZfdGxic2l6ZSA9IDA7CisjZW5kaWYKKwl9CisKKwlpZiAobiA8IDB4ODAwMDAwMDYpCS8qIFNvbWUgY2hpcHMganVzdCBoYXMgYSBsYXJnZSBMMS4gKi8KKwkJcmV0dXJuOworCisJY3B1aWQoMHg4MDAwMDAwNiwgJmR1bW15LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlsMnNpemUgPSBlY3ggPj4gMTY7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJYy0+eDg2X3RsYnNpemUgKz0gKChlYnggPj4gMTYpICYgMHhmZmYpICsgKGVieCAmIDB4ZmZmKTsKKyNlbHNlCisJLyogZG8gcHJvY2Vzc29yLXNwZWNpZmljIGNhY2hlIHJlc2l6aW5nICovCisJaWYgKHRoaXNfY3B1LT5jX3NpemVfY2FjaGUpCisJCWwyc2l6ZSA9IHRoaXNfY3B1LT5jX3NpemVfY2FjaGUoYywgbDJzaXplKTsKKworCS8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgYWxsIHRoaXMgaWYgbmVjZXNzYXJ5LiAqLworCWlmIChjYWNoZXNpemVfb3ZlcnJpZGUgIT0gLTEpCisJCWwyc2l6ZSA9IGNhY2hlc2l6ZV9vdmVycmlkZTsKKworCWlmIChsMnNpemUgPT0gMCkKKwkJcmV0dXJuOwkJLyogQWdhaW4sIG5vIEwyIGNhY2hlIGlzIHBvc3NpYmxlICovCisjZW5kaWYKKworCWMtPng4Nl9jYWNoZV9zaXplID0gbDJzaXplOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBMMiBDYWNoZTogJWRLICglZCBieXRlcy9saW5lKVxuIiwKKwkJCWwyc2l6ZSwgZWN4ICYgMHhGRik7Cit9CisKK3ZvaWQgX19jcHVpbml0IGRldGVjdF9odChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXUzMiBlYXgsIGVieCwgZWN4LCBlZHg7CisJaW50IGluZGV4X21zYiwgY29yZV9iaXRzOworCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0hUKSkKKwkJcmV0dXJuOworCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ01QX0xFR0FDWSkpCisJCWdvdG8gb3V0OworCisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWFRPUE9MT0dZKSkKKwkJcmV0dXJuOworCisJY3B1aWQoMSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwlzbXBfbnVtX3NpYmxpbmdzID0gKGVieCAmIDB4ZmYwMDAwKSA+PiAxNjsKKworCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogSHlwZXItVGhyZWFkaW5nIGlzIGRpc2FibGVkXG4iKTsKKwl9IGVsc2UgaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKSB7CisKKwkJaWYgKHNtcF9udW1fc2libGluZ3MgPiBOUl9DUFVTKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDUFU6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBzaWJsaW5ncyAlZCIsCisJCQkJCXNtcF9udW1fc2libGluZ3MpOworCQkJc21wX251bV9zaWJsaW5ncyA9IDE7CisJCQlyZXR1cm47CisJCX0KKworCQlpbmRleF9tc2IgPSBnZXRfY291bnRfb3JkZXIoc21wX251bV9zaWJsaW5ncyk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQljLT5waHlzX3Byb2NfaWQgPSBwaHlzX3BrZ19pZChpbmRleF9tc2IpOworI2Vsc2UKKwkJYy0+cGh5c19wcm9jX2lkID0gcGh5c19wa2dfaWQoYy0+aW5pdGlhbF9hcGljaWQsIGluZGV4X21zYik7CisjZW5kaWYKKworCQlzbXBfbnVtX3NpYmxpbmdzID0gc21wX251bV9zaWJsaW5ncyAvIGMtPng4Nl9tYXhfY29yZXM7CisKKwkJaW5kZXhfbXNiID0gZ2V0X2NvdW50X29yZGVyKHNtcF9udW1fc2libGluZ3MpOworCisJCWNvcmVfYml0cyA9IGdldF9jb3VudF9vcmRlcihjLT54ODZfbWF4X2NvcmVzKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJYy0+Y3B1X2NvcmVfaWQgPSBwaHlzX3BrZ19pZChpbmRleF9tc2IpICYKKwkJCQkJICAgICAgICgoMSA8PCBjb3JlX2JpdHMpIC0gMSk7CisjZWxzZQorCQljLT5jcHVfY29yZV9pZCA9IHBoeXNfcGtnX2lkKGMtPmluaXRpYWxfYXBpY2lkLCBpbmRleF9tc2IpICYKKwkJCQkJICAgICAgICgoMSA8PCBjb3JlX2JpdHMpIC0gMSk7CisjZW5kaWYKKwl9CisKK291dDoKKwlpZiAoKGMtPng4Nl9tYXhfY29yZXMgKiBzbXBfbnVtX3NpYmxpbmdzKSA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUGh5c2ljYWwgUHJvY2Vzc29yIElEOiAlZFxuIiwKKwkJICAgICAgIGMtPnBoeXNfcHJvY19pZCk7CisJCXByaW50ayhLRVJOX0lORk8gICJDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAlZFxuIiwKKwkJICAgICAgIGMtPmNwdV9jb3JlX2lkKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAljaGFyICp2ID0gYy0+eDg2X3ZlbmRvcl9pZDsKIAlpbnQgaTsKIAlzdGF0aWMgaW50IHByaW50ZWQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgWDg2X1ZFTkRPUl9OVU07IGkrKykgewotCQlpZiAoY3B1X2RldnNbaV0pIHsKLQkJCWlmICghc3RyY21wKHYsIGNwdV9kZXZzW2ldLT5jX2lkZW50WzBdKSB8fAotCQkJICAgIChjcHVfZGV2c1tpXS0+Y19pZGVudFsxXSAmJgotCQkJICAgICAhc3RyY21wKHYsIGNwdV9kZXZzW2ldLT5jX2lkZW50WzFdKSkpIHsKLQkJCQljLT54ODZfdmVuZG9yID0gaTsKLQkJCQlpZiAoIWVhcmx5KQotCQkJCQl0aGlzX2NwdSA9IGNwdV9kZXZzW2ldOwotCQkJCXJldHVybjsKLQkJCX0KKwkJaWYgKCFjcHVfZGV2c1tpXSkKKwkJCWJyZWFrOworCisJCWlmICghc3RyY21wKHYsIGNwdV9kZXZzW2ldLT5jX2lkZW50WzBdKSB8fAorCQkgICAgKGNwdV9kZXZzW2ldLT5jX2lkZW50WzFdICYmCisJCSAgICAgIXN0cmNtcCh2LCBjcHVfZGV2c1tpXS0+Y19pZGVudFsxXSkpKSB7CisJCQl0aGlzX2NwdSA9IGNwdV9kZXZzW2ldOworCQkJYy0+eDg2X3ZlbmRvciA9IHRoaXNfY3B1LT5jX3g4Nl92ZW5kb3I7CisJCQlyZXR1cm47CiAJCX0KIAl9CisKIAlpZiAoIXByaW50ZWQpIHsKIAkJcHJpbnRlZCsrOwotCQlwcmludGsoS0VSTl9FUlIgIkNQVTogVmVuZG9yIHVua25vd24sIHVzaW5nIGdlbmVyaWMgaW5pdC5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkNQVTogdmVuZG9yX2lkICclcycgdW5rbm93biwgdXNpbmcgZ2VuZXJpYyBpbml0LlxuIiwgdik7CiAJCXByaW50ayhLRVJOX0VSUiAiQ1BVOiBZb3VyIHN5c3RlbSBtYXkgYmUgdW5zdGFibGUuXG4iKTsKIAl9CisKIAljLT54ODZfdmVuZG9yID0gWDg2X1ZFTkRPUl9VTktOT1dOOwogCXRoaXNfY3B1ID0gJmRlZmF1bHRfY3B1OwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IHg4Nl9meHNyX3NldHVwKGNoYXIgKnMpCi17Ci0Jc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9GWFNSKTsKLQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1hNTSk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJub2Z4c3IiLCB4ODZfZnhzcl9zZXR1cCk7Ci0KLQotc3RhdGljIGludCBfX2luaXQgeDg2X3NlcF9zZXR1cChjaGFyICpzKQotewotCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfU0VQKTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoIm5vc2VwIiwgeDg2X3NlcF9zZXR1cCk7Ci0KLQotLyogU3RhbmRhcmQgbWFjcm8gdG8gc2VlIGlmIGEgc3BlY2lmaWMgZmxhZyBpcyBjaGFuZ2VhYmxlICovCi1zdGF0aWMgaW5saW5lIGludCBmbGFnX2lzX2NoYW5nZWFibGVfcCh1MzIgZmxhZykKLXsKLQl1MzIgZjEsIGYyOwotCi0JYXNtKCJwdXNoZmxcblx0IgotCSAgICAicHVzaGZsXG5cdCIKLQkgICAgInBvcGwgJTBcblx0IgotCSAgICAibW92bCAlMCwlMVxuXHQiCi0JICAgICJ4b3JsICUyLCUwXG5cdCIKLQkgICAgInB1c2hsICUwXG5cdCIKLQkgICAgInBvcGZsXG5cdCIKLQkgICAgInB1c2hmbFxuXHQiCi0JICAgICJwb3BsICUwXG5cdCIKLQkgICAgInBvcGZsXG5cdCIKLQkgICAgOiAiPSZyIiAoZjEpLCAiPSZyIiAoZjIpCi0JICAgIDogImlyIiAoZmxhZykpOwotCi0JcmV0dXJuICgoZjFeZjIpICYgZmxhZykgIT0gMDsKLX0KLQotCi0vKiBQcm9iZSBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCBoYXZlX2NwdWlkX3Aodm9pZCkKLXsKLQlyZXR1cm4gZmxhZ19pc19jaGFuZ2VhYmxlX3AoWDg2X0VGTEFHU19JRCk7Ci19Ci0KLXZvaWQgX19pbml0IGNwdV9kZXRlY3Qoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2NwdWluaXQgY3B1X2RldGVjdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJLyogR2V0IHZlbmRvciBuYW1lICovCiAJY3B1aWQoMHgwMDAwMDAwMCwgKHVuc2lnbmVkIGludCAqKSZjLT5jcHVpZF9sZXZlbCwKQEAgLTI2Nyw0OCArNDMwLDg1IEBACiAJICAgICAgKHVuc2lnbmVkIGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzRdKTsKIAogCWMtPng4NiA9IDQ7CisJLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLwogCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7CiAJCXUzMiBqdW5rLCB0Zm1zLCBjYXAwLCBtaXNjOwogCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJm1pc2MsICZqdW5rLCAmY2FwMCk7Ci0JCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7Ci0JCWMtPng4Nl9tb2RlbCA9ICh0Zm1zID4+IDQpICYgMTU7CisJCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMHhmOworCQljLT54ODZfbW9kZWwgPSAodGZtcyA+PiA0KSAmIDB4ZjsKKwkJYy0+eDg2X21hc2sgPSB0Zm1zICYgMHhmOwogCQlpZiAoYy0+eDg2ID09IDB4ZikKIAkJCWMtPng4NiArPSAodGZtcyA+PiAyMCkgJiAweGZmOwogCQlpZiAoYy0+eDg2ID49IDB4NikKLQkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OwotCQljLT54ODZfbWFzayA9IHRmbXMgJiAxNTsKKwkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhmKSA8PCA0OwogCQlpZiAoY2FwMCAmICgxPDwxOSkpIHsKLQkJCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSAoKG1pc2MgPj4gOCkgJiAweGZmKSAqIDg7CiAJCQljLT54ODZfY2xmbHVzaF9zaXplID0gKChtaXNjID4+IDgpICYgMHhmZikgKiA4OworCQkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IGMtPng4Nl9jbGZsdXNoX3NpemU7CiAJCX0KIAl9CiB9Ci1zdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfZ2V0X2NhcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZXRfY3B1X2NhcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIHRmbXMsIHhsdmw7Ci0JdW5zaWduZWQgaW50IGVieDsKKwl1MzIgZWJ4OwogCi0JbWVtc2V0KCZjLT54ODZfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mIGMtPng4Nl9jYXBhYmlsaXR5KTsKLQlpZiAoaGF2ZV9jcHVpZF9wKCkpIHsKLQkJLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLwotCQlpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwMSkgewotCQkJdTMyIGNhcGFiaWxpdHksIGV4Y2FwOwotCQkJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZlYngsICZleGNhcCwgJmNhcGFiaWxpdHkpOwotCQkJYy0+eDg2X2NhcGFiaWxpdHlbMF0gPSBjYXBhYmlsaXR5OwotCQkJYy0+eDg2X2NhcGFiaWxpdHlbNF0gPSBleGNhcDsKLQkJfQotCi0JCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCi0JCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7Ci0JCWlmICgoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODAwMDAwMDApIHsKLQkJCWlmICh4bHZsID49IDB4ODAwMDAwMDEpIHsKLQkJCQljLT54ODZfY2FwYWJpbGl0eVsxXSA9IGNwdWlkX2VkeCgweDgwMDAwMDAxKTsKLQkJCQljLT54ODZfY2FwYWJpbGl0eVs2XSA9IGNwdWlkX2VjeCgweDgwMDAwMDAxKTsKLQkJCX0KLQkJfQotCisJLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLworCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7CisJCXUzMiBjYXBhYmlsaXR5LCBleGNhcDsKKwkJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZlYngsICZleGNhcCwgJmNhcGFiaWxpdHkpOworCQljLT54ODZfY2FwYWJpbGl0eVswXSA9IGNhcGFiaWxpdHk7CisJCWMtPng4Nl9jYXBhYmlsaXR5WzRdID0gZXhjYXA7CiAJfQogCisJLyogQU1ELWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODAwMDAwMDEgKi8KKwl4bHZsID0gY3B1aWRfZWF4KDB4ODAwMDAwMDApOworCWMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID0geGx2bDsKKwlpZiAoKHhsdmwgJiAweGZmZmYwMDAwKSA9PSAweDgwMDAwMDAwKSB7CisJCWlmICh4bHZsID49IDB4ODAwMDAwMDEpIHsKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzFdID0gY3B1aWRfZWR4KDB4ODAwMDAwMDEpOworCQkJYy0+eDg2X2NhcGFiaWxpdHlbNl0gPSBjcHVpZF9lY3goMHg4MDAwMDAwMSk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDgpIHsKKwkJdTMyIGVheCA9IGNwdWlkX2VheCgweDgwMDAwMDA4KTsKKworCQljLT54ODZfdmlydF9iaXRzID0gKGVheCA+PiA4KSAmIDB4ZmY7CisJCWMtPng4Nl9waHlzX2JpdHMgPSBlYXggJiAweGZmOworCX0KKyNlbmRpZgorCisJaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDcpCisJCWMtPng4Nl9wb3dlciA9IGNwdWlkX2VkeCgweDgwMDAwMDA3KTsKKworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaWRlbnRpZnlfY3B1X3dpdGhvdXRfY3B1aWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpbnQgaTsKKworCS8qCisJICogRmlyc3Qgb2YgYWxsLCBkZWNpZGUgaWYgdGhpcyBpcyBhIDQ4NiBvciBoaWdoZXIKKwkgKiBJdCdzIGEgNDg2IGlmIHdlIGNhbiBtb2RpZnkgdGhlIEFDIGZsYWcKKwkgKi8KKwlpZiAoZmxhZ19pc19jaGFuZ2VhYmxlX3AoWDg2X0VGTEFHU19BQykpCisJCWMtPng4NiA9IDQ7CisJZWxzZQorCQljLT54ODYgPSAzOworCisJZm9yIChpID0gMDsgaSA8IFg4Nl9WRU5ET1JfTlVNOyBpKyspCisJCWlmIChjcHVfZGV2c1tpXSAmJiBjcHVfZGV2c1tpXS0+Y19pZGVudGlmeSkgeworCQkJYy0+eDg2X3ZlbmRvcl9pZFswXSA9IDA7CisJCQljcHVfZGV2c1tpXS0+Y19pZGVudGlmeShjKTsKKwkJCWlmIChjLT54ODZfdmVuZG9yX2lkWzBdKSB7CisJCQkJZ2V0X2NwdV92ZW5kb3IoYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZgogfQogCiAvKgpAQCAtMzIwLDExMCArNTIwLDExNCBAQAogICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiB0aGUgQlAuICBEb24ndCBhZGQgY29kZSBoZXJlCiAgKiB0aGF0IGlzIHN1cHBvc2VkIHRvIHJ1biBvbiBhbGwgQ1BVcy4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X2NwdV9kZXRlY3Qodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9pZGVudGlmeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOwotCi0JYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDMyOworI2lmZGVmIENPTkZJR19YODZfNjQKKwljLT54ODZfY2xmbHVzaF9zaXplID0gNjQ7CisjZWxzZQogCWMtPng4Nl9jbGZsdXNoX3NpemUgPSAzMjsKKyNlbmRpZgorCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSBjLT54ODZfY2xmbHVzaF9zaXplOwogCisJbWVtc2V0KCZjLT54ODZfY2FwYWJpbGl0eSwgMCwgc2l6ZW9mIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwljLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA9IDA7CisKKwlpZiAoIWhhdmVfY3B1aWRfcCgpKQorCQlpZGVudGlmeV9jcHVfd2l0aG91dF9jcHVpZChjKTsKKworCS8qIGN5cml4IGNvdWxkIGhhdmUgY3B1aWQgZW5hYmxlZCB2aWEgY19pZGVudGlmeSgpKi8KIAlpZiAoIWhhdmVfY3B1aWRfcCgpKQogCQlyZXR1cm47CiAKIAljcHVfZGV0ZWN0KGMpOwogCi0JZ2V0X2NwdV92ZW5kb3IoYywgMSk7CisJZ2V0X2NwdV92ZW5kb3IoYyk7CiAKLQlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX1VOS05PV04gJiYKLQkgICAgY3B1X2RldnNbYy0+eDg2X3ZlbmRvcl0tPmNfZWFybHlfaW5pdCkKLQkJY3B1X2RldnNbYy0+eDg2X3ZlbmRvcl0tPmNfZWFybHlfaW5pdChjKTsKKwlnZXRfY3B1X2NhcChjKTsKIAotCWVhcmx5X2dldF9jYXAoYyk7CisJaWYgKHRoaXNfY3B1LT5jX2Vhcmx5X2luaXQpCisJCXRoaXNfY3B1LT5jX2Vhcmx5X2luaXQoYyk7CisKKwl2YWxpZGF0ZV9wYXRfc3VwcG9ydChjKTsKK30KKwordm9pZCBfX2luaXQgZWFybHlfY3B1X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1X2RldiAqKmNkZXY7CisJaW50IGNvdW50ID0gMDsKKworCXByaW50aygiS0VSTkVMIHN1cHBvcnRlZCBjcHVzOlxuIik7CisJZm9yIChjZGV2ID0gX194ODZfY3B1X2Rldl9zdGFydDsgY2RldiA8IF9feDg2X2NwdV9kZXZfZW5kOyBjZGV2KyspIHsKKwkJc3RydWN0IGNwdV9kZXYgKmNwdWRldiA9ICpjZGV2OworCQl1bnNpZ25lZCBpbnQgajsKKworCQlpZiAoY291bnQgPj0gWDg2X1ZFTkRPUl9OVU0pCisJCQlicmVhazsKKwkJY3B1X2RldnNbY291bnRdID0gY3B1ZGV2OworCQljb3VudCsrOworCisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWlmICghY3B1ZGV2LT5jX2lkZW50W2pdKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKCIgICVzICVzXG4iLCBjcHVkZXYtPmNfdmVuZG9yLAorCQkJCWNwdWRldi0+Y19pZGVudFtqXSk7CisJCX0KKwl9CisKKwllYXJseV9pZGVudGlmeV9jcHUoJmJvb3RfY3B1X2RhdGEpOworfQorCisvKgorICogVGhlIE5PUEwgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9zZWQgdG8gZXhpc3Qgb24gYWxsIENQVXMgd2l0aAorICogZmFtaWx5ID49IDY7IHVuZm9ydHVuYXRlbHksIHRoYXQncyBub3QgdHJ1ZSBpbiBwcmFjdGljZSBiZWNhdXNlCisgKiBvZiBlYXJseSBWSUEgY2hpcHMgYW5kIChtb3JlIGltcG9ydGFudGx5KSBicm9rZW4gdmlydHVhbGl6ZXJzIHRoYXQKKyAqIGFyZSBub3QgZWFzeSB0byBkZXRlY3QuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgZG9lc24ndCBldmVuICpmYWlsKgorICogcmVsaWFibHksIHNvIHByb2JpbmcgZm9yIGl0IGRvZXNuJ3QgZXZlbiB3b3JrLiAgRGlzYWJsZSBpdCBjb21wbGV0ZWx5CisgKiB1bmxlc3Mgd2UgY2FuIGZpbmQgYSByZWxpYWJsZSB3YXkgdG8gZGV0ZWN0IGFsbCB0aGUgYnJva2VuIGNhc2VzLgorICovCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZGV0ZWN0X25vcGwoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTk9QTCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZW5lcmljX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKLQl1MzIgdGZtcywgeGx2bDsKLQl1bnNpZ25lZCBpbnQgZWJ4OworCWMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID0gMDsKIAotCWlmIChoYXZlX2NwdWlkX3AoKSkgewotCQkvKiBHZXQgdmVuZG9yIG5hbWUgKi8KLQkJY3B1aWQoMHgwMDAwMDAwMCwgKHVuc2lnbmVkIGludCAqKSZjLT5jcHVpZF9sZXZlbCwKLQkJICAgICAgKHVuc2lnbmVkIGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzBdLAotCQkgICAgICAodW5zaWduZWQgaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbOF0sCi0JCSAgICAgICh1bnNpZ25lZCBpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs0XSk7CisJaWYgKCFoYXZlX2NwdWlkX3AoKSkKKwkJaWRlbnRpZnlfY3B1X3dpdGhvdXRfY3B1aWQoYyk7CiAKLQkJZ2V0X2NwdV92ZW5kb3IoYywgMCk7Ci0JCS8qIEluaXRpYWxpemUgdGhlIHN0YW5kYXJkIHNldCBvZiBjYXBhYmlsaXRpZXMgKi8KLQkJLyogTm90ZSB0aGF0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgY29kZSBiZWxvdyBtaWdodCBvdmVycmlkZSAqLwotCQkvKiBJbnRlbC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDAwMDAwMDAxICovCi0JCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7Ci0JCQl1MzIgY2FwYWJpbGl0eSwgZXhjYXA7Ci0JCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJmVieCwgJmV4Y2FwLCAmY2FwYWJpbGl0eSk7Ci0JCQljLT54ODZfY2FwYWJpbGl0eVswXSA9IGNhcGFiaWxpdHk7Ci0JCQljLT54ODZfY2FwYWJpbGl0eVs0XSA9IGV4Y2FwOwotCQkJYy0+eDg2ID0gKHRmbXMgPj4gOCkgJiAxNTsKLQkJCWMtPng4Nl9tb2RlbCA9ICh0Zm1zID4+IDQpICYgMTU7Ci0JCQlpZiAoYy0+eDg2ID09IDB4ZikKLQkJCQljLT54ODYgKz0gKHRmbXMgPj4gMjApICYgMHhmZjsKLQkJCWlmIChjLT54ODYgPj0gMHg2KQotCQkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OwotCQkJYy0+eDg2X21hc2sgPSB0Zm1zICYgMTU7Ci0JCQljLT5pbml0aWFsX2FwaWNpZCA9IChlYnggPj4gMjQpICYgMHhGRjsKLSNpZmRlZiBDT05GSUdfWDg2X0hUCi0JCQljLT5hcGljaWQgPSBwaHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgMCk7Ci0JCQljLT5waHlzX3Byb2NfaWQgPSBjLT5pbml0aWFsX2FwaWNpZDsKLSNlbHNlCi0JCQljLT5hcGljaWQgPSBjLT5pbml0aWFsX2FwaWNpZDsKKwkvKiBjeXJpeCBjb3VsZCBoYXZlIGNwdWlkIGVuYWJsZWQgdmlhIGNfaWRlbnRpZnkoKSovCisJaWYgKCFoYXZlX2NwdWlkX3AoKSkKKwkJcmV0dXJuOworCisJY3B1X2RldGVjdChjKTsKKworCWdldF9jcHVfdmVuZG9yKGMpOworCisJZ2V0X2NwdV9jYXAoYyk7CisKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwMSkgeworCQljLT5pbml0aWFsX2FwaWNpZCA9IChjcHVpZF9lYngoMSkgPj4gMjQpICYgMHhGRjsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjIGlmZGVmIENPTkZJR19YODZfSFQKKwkJYy0+YXBpY2lkID0gcGh5c19wa2dfaWQoYy0+aW5pdGlhbF9hcGljaWQsIDApOworIyBlbHNlCisJCWMtPmFwaWNpZCA9IGMtPmluaXRpYWxfYXBpY2lkOworIyBlbmRpZgogI2VuZGlmCi0JCQlpZiAodGVzdF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0NMRkxTSCkpCi0JCQkJYy0+eDg2X2NsZmx1c2hfc2l6ZSA9ICgoZWJ4ID4+IDgpICYgMHhmZikgKiA4OwotCQl9IGVsc2UgewotCQkJLyogSGF2ZSBDUFVJRCBsZXZlbCAwIG9ubHkgLSB1bmhlYXJkIG9mICovCi0JCQljLT54ODYgPSA0OwotCQl9CiAKLQkJLyogQU1ELWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODAwMDAwMDEgKi8KLQkJeGx2bCA9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKLQkJaWYgKCh4bHZsICYgMHhmZmZmMDAwMCkgPT0gMHg4MDAwMDAwMCkgewotCQkJaWYgKHhsdmwgPj0gMHg4MDAwMDAwMSkgewotCQkJCWMtPng4Nl9jYXBhYmlsaXR5WzFdID0gY3B1aWRfZWR4KDB4ODAwMDAwMDEpOwotCQkJCWMtPng4Nl9jYXBhYmlsaXR5WzZdID0gY3B1aWRfZWN4KDB4ODAwMDAwMDEpOwotCQkJfQotCQkJaWYgKHhsdmwgPj0gMHg4MDAwMDAwNCkKLQkJCQlnZXRfbW9kZWxfbmFtZShjKTsgLyogRGVmYXVsdCBuYW1lICovCi0JCX0KLQotCQlpbml0X3NjYXR0ZXJlZF9jcHVpZF9mZWF0dXJlcyhjKTsKKyNpZmRlZiBDT05GSUdfWDg2X0hUCisJCWMtPnBoeXNfcHJvY19pZCA9IGMtPmluaXRpYWxfYXBpY2lkOworI2VuZGlmCiAJfQogCisJZ2V0X21vZGVsX25hbWUoYyk7IC8qIERlZmF1bHQgbmFtZSAqLworCisJaW5pdF9zY2F0dGVyZWRfY3B1aWRfZmVhdHVyZXMoYyk7CisJZGV0ZWN0X25vcGwoYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcXVhc2hfdGhlX3N0dXBpZF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9QTikgJiYgZGlzYWJsZV94ODZfc2VyaWFsX25yKSB7Ci0JCS8qIERpc2FibGUgcHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KLQkJdW5zaWduZWQgbG9uZyBsbywgaGk7Ci0JCXJkbXNyKE1TUl9JQTMyX0JCTF9DUl9DVEwsIGxvLCBoaSk7Ci0JCWxvIHw9IDB4MjAwMDAwOwotCQl3cm1zcihNU1JfSUEzMl9CQkxfQ1JfQ1RMLCBsbywgaGkpOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSBzZXJpYWwgbnVtYmVyIGRpc2FibGVkLlxuIik7Ci0JCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUE4pOwotCi0JCS8qIERpc2FibGluZyB0aGUgc2VyaWFsIG51bWJlciBtYXkgYWZmZWN0IHRoZSBjcHVpZCBsZXZlbCAqLwotCQljLT5jcHVpZF9sZXZlbCA9IGNwdWlkX2VheCgwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHg4Nl9zZXJpYWxfbnJfc2V0dXAoY2hhciAqcykKLXsKLQlkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgPSAwOwotCXJldHVybiAxOwotfQotX19zZXR1cCgic2VyaWFsbnVtYmVyIiwgeDg2X3NlcmlhbF9ucl9zZXR1cCk7Ci0KLQotCiAvKgogICogVGhpcyBkb2VzIHRoZSBoYXJkIHdvcmsgb2YgYWN0dWFsbHkgcGlja2luZyBhcGFydCB0aGUgQ1BVIHN0dWZmLi4uCiAgKi8KQEAgLTQzNCwzMCArNjM4LDI5IEBACiAJYy0+bG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwogCWMtPng4Nl9jYWNoZV9zaXplID0gLTE7CiAJYy0+eDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfVU5LTk9XTjsKLQljLT5jcHVpZF9sZXZlbCA9IC0xOwkvKiBDUFVJRCBub3QgZGV0ZWN0ZWQgKi8KIAljLT54ODZfbW9kZWwgPSBjLT54ODZfbWFzayA9IDA7CS8qIFNvIGZhciB1bmtub3duLi4uICovCiAJYy0+eDg2X3ZlbmRvcl9pZFswXSA9ICdcMCc7IC8qIFVuc2V0ICovCiAJYy0+eDg2X21vZGVsX2lkWzBdID0gJ1wwJzsgIC8qIFVuc2V0ICovCiAJYy0+eDg2X21heF9jb3JlcyA9IDE7CisJYy0+eDg2X2NvcmVpZF9iaXRzID0gMDsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJYy0+eDg2X2NsZmx1c2hfc2l6ZSA9IDY0OworI2Vsc2UKKwljLT5jcHVpZF9sZXZlbCA9IC0xOwkvKiBDUFVJRCBub3QgZGV0ZWN0ZWQgKi8KIAljLT54ODZfY2xmbHVzaF9zaXplID0gMzI7CisjZW5kaWYKKwljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gYy0+eDg2X2NsZmx1c2hfc2l6ZTsKIAltZW1zZXQoJmMtPng4Nl9jYXBhYmlsaXR5LCAwLCBzaXplb2YgYy0+eDg2X2NhcGFiaWxpdHkpOwogCi0JaWYgKCFoYXZlX2NwdWlkX3AoKSkgewotCQkvKgotCQkgKiBGaXJzdCBvZiBhbGwsIGRlY2lkZSBpZiB0aGlzIGlzIGEgNDg2IG9yIGhpZ2hlcgotCQkgKiBJdCdzIGEgNDg2IGlmIHdlIGNhbiBtb2RpZnkgdGhlIEFDIGZsYWcKLQkJICovCi0JCWlmIChmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0FDKSkKLQkJCWMtPng4NiA9IDQ7Ci0JCWVsc2UKLQkJCWMtPng4NiA9IDM7Ci0JfQotCiAJZ2VuZXJpY19pZGVudGlmeShjKTsKIAogCWlmICh0aGlzX2NwdS0+Y19pZGVudGlmeSkKIAkJdGhpc19jcHUtPmNfaWRlbnRpZnkoYyk7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJYy0+YXBpY2lkID0gcGh5c19wa2dfaWQoMCk7CisjZW5kaWYKKwogCS8qCiAJICogVmVuZG9yLXNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAgSW4gdGhpcyBzZWN0aW9uIHdlCiAJICogY2Fub25pY2FsaXplIHRoZSBmZWF0dXJlIGZsYWdzLCBtZWFuaW5nIGlmIHRoZXJlIGFyZQpAQCAtNDkxLDYgKzY5NCwxMCBAQAogCQkJCWMtPng4NiwgYy0+eDg2X21vZGVsKTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJZGV0ZWN0X2h0KGMpOworI2VuZGlmCisKIAkvKgogCSAqIE9uIFNNUCwgYm9vdF9jcHVfZGF0YSBob2xkcyB0aGUgY29tbW9uIGZlYXR1cmUgc2V0IGJldHdlZW4KIAkgKiBhbGwgQ1BVczsgc28gbWFrZSBzdXJlIHRoYXQgd2UgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgYXJlCkBAIC00OTksNyArNzA2LDcgQEAKIAkgKi8KIAlpZiAoYyAhPSAmYm9vdF9jcHVfZGF0YSkgewogCQkvKiBBTkQgdGhlIGFscmVhZHkgYWNjdW11bGF0ZWQgZmxhZ3Mgd2l0aCB0aGVzZSAqLwotCQlmb3IgKGkgPSAwIDsgaSA8IE5DQVBJTlRTIDsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykKIAkJCWJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbaV0gJj0gYy0+eDg2X2NhcGFiaWxpdHlbaV07CiAJfQogCkBAIC01MDcsNzIgKzcxNCw5MSBAQAogCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQogCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y2xlYXJlZF9jcHVfY2Fwc1tpXTsKIAorI2lmZGVmIENPTkZJR19YODZfTUNFCiAJLyogSW5pdCBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBpZiBhdmFpbGFibGUuICovCiAJbWNoZWNrX2luaXQoYyk7CisjZW5kaWYKIAogCXNlbGVjdF9pZGxlX3JvdXRpbmUoYyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19OVU1BKSAmJiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJbnVtYV9hZGRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyB2b2lkIHZnZXRjcHVfc2V0X21vZGUodm9pZCkKK3sKKwlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfUkRUU0NQKSkKKwkJdmdldGNwdV9tb2RlID0gVkdFVENQVV9SRFRTQ1A7CisJZWxzZQorCQl2Z2V0Y3B1X21vZGUgPSBWR0VUQ1BVX0xTTDsKK30KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBpZGVudGlmeV9ib290X2NwdSh2b2lkKQogewogCWlkZW50aWZ5X2NwdSgmYm9vdF9jcHVfZGF0YSk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXN5c2VudGVyX3NldHVwKCk7CiAJZW5hYmxlX3NlcF9jcHUoKTsKKyNlbHNlCisJdmdldGNwdV9zZXRfbW9kZSgpOworI2VuZGlmCiB9CiAKIHZvaWQgX19jcHVpbml0IGlkZW50aWZ5X3NlY29uZGFyeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCUJVR19PTihjID09ICZib290X2NwdV9kYXRhKTsKIAlpZGVudGlmeV9jcHUoYyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWVuYWJsZV9zZXBfY3B1KCk7CisjZW5kaWYKIAltdHJyX2FwX2luaXQoKTsKIH0KIAotI2lmZGVmIENPTkZJR19YODZfSFQKLXZvaWQgX19jcHVpbml0IGRldGVjdF9odChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdHJ1Y3QgbXNyX3JhbmdlIHsKKwl1bnNpZ25lZCBtaW47CisJdW5zaWduZWQgbWF4OworfTsKKworc3RhdGljIHN0cnVjdCBtc3JfcmFuZ2UgbXNyX3JhbmdlX2FycmF5W10gX19jcHVpbml0ZGF0YSA9IHsKKwl7IDB4MDAwMDAwMDAsIDB4MDAwMDA0MTh9LAorCXsgMHhjMDAwMDAwMCwgMHhjMDAwMDQwYn0sCisJeyAweGMwMDEwMDAwLCAweGMwMDEwMTQyfSwKKwl7IDB4YzAwMTEwMDAsIDB4YzAwMTEwM2J9LAorfTsKKworc3RhdGljIHZvaWQgX19jcHVpbml0IHByaW50X2NwdV9tc3Iodm9pZCkKIHsKLQl1MzIgCWVheCwgZWJ4LCBlY3gsIGVkeDsKLQlpbnQgCWluZGV4X21zYiwgY29yZV9iaXRzOworCXVuc2lnbmVkIGluZGV4OworCXU2NCB2YWw7CisJaW50IGk7CisJdW5zaWduZWQgaW5kZXhfbWluLCBpbmRleF9tYXg7CiAKLQljcHVpZCgxLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQotCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9IVCkgfHwgY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DTVBfTEVHQUNZKSkKLQkJcmV0dXJuOwotCi0Jc21wX251bV9zaWJsaW5ncyA9IChlYnggJiAweGZmMDAwMCkgPj4gMTY7Ci0KLQlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gICJDUFU6IEh5cGVyLVRocmVhZGluZyBpcyBkaXNhYmxlZFxuIik7Ci0JfSBlbHNlIGlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkgewotCi0JCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gTlJfQ1BVUykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1BVOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgdGhlICIKLQkJCQkJInNpYmxpbmdzICVkIiwgc21wX251bV9zaWJsaW5ncyk7Ci0JCQlzbXBfbnVtX3NpYmxpbmdzID0gMTsKLQkJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3JfcmFuZ2VfYXJyYXkpOyBpKyspIHsKKwkJaW5kZXhfbWluID0gbXNyX3JhbmdlX2FycmF5W2ldLm1pbjsKKwkJaW5kZXhfbWF4ID0gbXNyX3JhbmdlX2FycmF5W2ldLm1heDsKKwkJZm9yIChpbmRleCA9IGluZGV4X21pbjsgaW5kZXggPCBpbmRleF9tYXg7IGluZGV4KyspIHsKKwkJCWlmIChyZG1zcmxfYW1kX3NhZmUoaW5kZXgsICZ2YWwpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIE1TUiUwOHg6ICUwMTZsbHhcbiIsIGluZGV4LCB2YWwpOwogCQl9Ci0KLQkJaW5kZXhfbXNiID0gZ2V0X2NvdW50X29yZGVyKHNtcF9udW1fc2libGluZ3MpOwotCQljLT5waHlzX3Byb2NfaWQgPSBwaHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgaW5kZXhfbXNiKTsKLQotCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAotCQkgICAgICAgYy0+cGh5c19wcm9jX2lkKTsKLQotCQlzbXBfbnVtX3NpYmxpbmdzID0gc21wX251bV9zaWJsaW5ncyAvIGMtPng4Nl9tYXhfY29yZXM7Ci0KLQkJaW5kZXhfbXNiID0gZ2V0X2NvdW50X29yZGVyKHNtcF9udW1fc2libGluZ3MpIDsKLQotCQljb3JlX2JpdHMgPSBnZXRfY291bnRfb3JkZXIoYy0+eDg2X21heF9jb3Jlcyk7Ci0KLQkJYy0+Y3B1X2NvcmVfaWQgPSBwaHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgaW5kZXhfbXNiKSAmCi0JCQkJCSAgICAgICAoKDEgPDwgY29yZV9iaXRzKSAtIDEpOwotCi0JCWlmIChjLT54ODZfbWF4X2NvcmVzID4gMSkKLQkJCXByaW50ayhLRVJOX0lORk8gICJDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAlZFxuIiwKLQkJCSAgICAgICBjLT5jcHVfY29yZV9pZCk7CiAJfQogfQotI2VuZGlmCisKK3N0YXRpYyBpbnQgc2hvd19tc3IgX19jcHVpbml0ZGF0YTsKK3N0YXRpYyBfX2luaXQgaW50IHNldHVwX3Nob3dfbXNyKGNoYXIgKmFyZykKK3sKKwlpbnQgbnVtOworCisJZ2V0X29wdGlvbigmYXJnLCAmbnVtKTsKKworCWlmIChudW0gPiAwKQorCQlzaG93X21zciA9IG51bTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInNob3dfbXNyPSIsIHNldHVwX3Nob3dfbXNyKTsKIAogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9jbGZsdXNoKGNoYXIgKmFyZykKIHsKQEAgLTU5MCwxOCArODE2LDI2IEBACiAJZWxzZSBpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMCkKIAkJdmVuZG9yID0gYy0+eDg2X3ZlbmRvcl9pZDsKIAotCWlmICh2ZW5kb3IgJiYgc3RybmNtcChjLT54ODZfbW9kZWxfaWQsIHZlbmRvciwgc3RybGVuKHZlbmRvcikpKQotCQlwcmludGsoIiVzICIsIHZlbmRvcik7CisJaWYgKHZlbmRvciAmJiAhc3Ryc3RyKGMtPng4Nl9tb2RlbF9pZCwgdmVuZG9yKSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiJXMgIiwgdmVuZG9yKTsKIAotCWlmICghYy0+eDg2X21vZGVsX2lkWzBdKQotCQlwcmludGsoIiVkODYiLCBjLT54ODYpOworCWlmIChjLT54ODZfbW9kZWxfaWRbMF0pCisJCXByaW50ayhLRVJOX0NPTlQgIiVzIiwgYy0+eDg2X21vZGVsX2lkKTsKIAllbHNlCi0JCXByaW50aygiJXMiLCBjLT54ODZfbW9kZWxfaWQpOworCQlwcmludGsoS0VSTl9DT05UICIlZDg2IiwgYy0+eDg2KTsKIAogCWlmIChjLT54ODZfbWFzayB8fCBjLT5jcHVpZF9sZXZlbCA+PSAwKQotCQlwcmludGsoIiBzdGVwcGluZyAlMDJ4XG4iLCBjLT54ODZfbWFzayk7CisJCXByaW50ayhLRVJOX0NPTlQgIiBzdGVwcGluZyAlMDJ4XG4iLCBjLT54ODZfbWFzayk7CiAJZWxzZQotCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKGMtPmNwdV9pbmRleCA8IHNob3dfbXNyKQorCQlwcmludF9jcHVfbXNyKCk7CisjZWxzZQorCWlmIChzaG93X21zcikKKwkJcHJpbnRfY3B1X21zcigpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBfX2luaXQgaW50IHNldHVwX2Rpc2FibGVjcHVpZChjaGFyICphcmcpCkBAIC02MTcsMTkgKzg1MSw4OSBAQAogCiBjcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkIF9fY3B1aW5pdGRhdGEgPSBDUFVfTUFTS19OT05FOwogCi12b2lkIF9faW5pdCBlYXJseV9jcHVfaW5pdCh2b2lkKQorI2lmZGVmIENPTkZJR19YODZfNjQKK3N0cnVjdCB4ODY2NF9wZGEgKipfY3B1X3BkYSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChfY3B1X3BkYSk7CisKK3N0cnVjdCBkZXNjX3B0ciBpZHRfZGVzY3IgPSB7IDI1NiAqIDE2IC0gMSwgKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSB9OworCitjaGFyIGJvb3RfY3B1X3N0YWNrW0lSUVNUQUNLU0laRV0gX19wYWdlX2FsaWduZWRfYnNzOworCit2b2lkIF9fY3B1aW5pdCBwZGFfaW5pdChpbnQgY3B1KQogewotCXN0cnVjdCBjcHVfdmVuZG9yX2RldiAqY3ZkZXY7CisJc3RydWN0IHg4NjY0X3BkYSAqcGRhID0gY3B1X3BkYShjcHUpOwogCi0JZm9yIChjdmRldiA9IF9feDg2Y3B1dmVuZG9yX3N0YXJ0IDsKLQkgICAgIGN2ZGV2IDwgX194ODZjcHV2ZW5kb3JfZW5kICAgOwotCSAgICAgY3ZkZXYrKykKLQkJY3B1X2RldnNbY3ZkZXYtPnZlbmRvcl0gPSBjdmRldi0+Y3B1X2RldjsKKwkvKiBTZXR1cCB1cCBkYXRhIHRoYXQgbWF5IGJlIG5lZWRlZCBpbiBfX2dldF9mcmVlX3BhZ2VzIGVhcmx5ICovCisJbG9hZHNlZ21lbnQoZnMsIDApOworCWxvYWRzZWdtZW50KGdzLCAwKTsKKwkvKiBNZW1vcnkgY2xvYmJlcnMgdXNlZCB0byBvcmRlciBQREEgYWNjZXNzZWQgKi8KKwltYigpOworCXdybXNybChNU1JfR1NfQkFTRSwgcGRhKTsKKwltYigpOwogCi0JZWFybHlfY3B1X2RldGVjdCgpOwotCXZhbGlkYXRlX3BhdF9zdXBwb3J0KCZib290X2NwdV9kYXRhKTsKKwlwZGEtPmNwdW51bWJlciA9IGNwdTsKKwlwZGEtPmlycWNvdW50ID0gLTE7CisJcGRhLT5rZXJuZWxzdGFjayA9ICh1bnNpZ25lZCBsb25nKXN0YWNrX3RocmVhZF9pbmZvKCkgLQorCQkJCSBQREFfU1RBQ0tPRkZTRVQgKyBUSFJFQURfU0laRTsKKwlwZGEtPmFjdGl2ZV9tbSA9ICZpbml0X21tOworCXBkYS0+bW11X3N0YXRlID0gMDsKKworCWlmIChjcHUgPT0gMCkgeworCQkvKiBvdGhlcnMgYXJlIGluaXRpYWxpemVkIGluIHNtcGJvb3QuYyAqLworCQlwZGEtPnBjdXJyZW50ID0gJmluaXRfdGFzazsKKwkJcGRhLT5pcnFzdGFja3B0ciA9IGJvb3RfY3B1X3N0YWNrOworCQlwZGEtPmlycXN0YWNrcHRyICs9IElSUVNUQUNLU0laRSAtIDY0OworCX0gZWxzZSB7CisJCWlmICghcGRhLT5pcnFzdGFja3B0cikgeworCQkJcGRhLT5pcnFzdGFja3B0ciA9IChjaGFyICopCisJCQkJX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBJUlFTVEFDS19PUkRFUik7CisJCQlpZiAoIXBkYS0+aXJxc3RhY2twdHIpCisJCQkJcGFuaWMoImNhbm5vdCBhbGxvY2F0ZSBpcnFzdGFjayBmb3IgY3B1ICVkIiwKKwkJCQkgICAgICBjcHUpOworCQkJcGRhLT5pcnFzdGFja3B0ciArPSBJUlFTVEFDS1NJWkUgLSA2NDsKKwkJfQorCisJCWlmIChwZGEtPm5vZGVudW1iZXIgPT0gMCAmJiBjcHVfdG9fbm9kZShjcHUpICE9IE5VTUFfTk9fTk9ERSkKKwkJCXBkYS0+bm9kZW51bWJlciA9IGNwdV90b19ub2RlKGNwdSk7CisJfQogfQogCitjaGFyIGJvb3RfZXhjZXB0aW9uX3N0YWNrc1soTl9FWENFUFRJT05fU1RBQ0tTIC0gMSkgKiBFWENFUFRJT05fU1RLU1ogKworCQkJICAgREVCVUdfU1RLU1pdIF9fcGFnZV9hbGlnbmVkX2JzczsKKworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBpZ25vcmVfc3lzcmV0KHZvaWQpOworCisvKiBNYXkgbm90IGJlIG1hcmtlZCBfX2luaXQ6IHVzZWQgYnkgc29mdHdhcmUgc3VzcGVuZCAqLwordm9pZCBzeXNjYWxsX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIExTVEFSIGFuZCBTVEFSIGxpdmUgaW4gYSBiaXQgc3RyYW5nZSBzeW1iaW9zaXMuCisJICogVGhleSBib3RoIHdyaXRlIHRvIHRoZSBzYW1lIGludGVybmFsIHJlZ2lzdGVyLiBTVEFSIGFsbG93cyB0bworCSAqIHNldCBDUy9EUyBidXQgb25seSBhIDMyYml0IHRhcmdldC4gTFNUQVIgc2V0cyB0aGUgNjRiaXQgcmlwLgorCSAqLworCXdybXNybChNU1JfU1RBUiwgICgodTY0KV9fVVNFUjMyX0NTKTw8NDggIHwgKCh1NjQpX19LRVJORUxfQ1MpPDwzMik7CisJd3Jtc3JsKE1TUl9MU1RBUiwgc3lzdGVtX2NhbGwpOworCXdybXNybChNU1JfQ1NUQVIsIGlnbm9yZV9zeXNyZXQpOworCisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJc3lzY2FsbDMyX2NwdV9pbml0KCk7CisjZW5kaWYKKworCS8qIEZsYWdzIHRvIGNsZWFyIG9uIHN5c2NhbGwgKi8KKwl3cm1zcmwoTVNSX1NZU0NBTExfTUFTSywKKwkgICAgICAgWDg2X0VGTEFHU19URnxYODZfRUZMQUdTX0RGfFg4Nl9FRkxBR1NfSUZ8WDg2X0VGTEFHU19JT1BMKTsKK30KKwordW5zaWduZWQgbG9uZyBrZXJuZWxfZWZsYWdzOworCisvKgorICogQ29waWVzIG9mIHRoZSBvcmlnaW5hbCBpc3QgdmFsdWVzIGZyb20gdGhlIHRzcyBhcmUgb25seSBhY2Nlc3NlZCBkdXJpbmcKKyAqIGRlYnVnZ2luZywgbm8gc3BlY2lhbCBhbGlnbm1lbnQgcmVxdWlyZWQuCisgKi8KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBvcmlnX2lzdCwgb3JpZ19pc3QpOworCisjZWxzZQorCiAvKiBNYWtlIHN1cmUgJWZzIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IGluIGlkbGUgdGhyZWFkcyAqLwogc3RydWN0IHB0X3JlZ3MgKiBfX2NwdWluaXQgaWRsZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtNjM3LDI1ICs5NDEsMTM2IEBACiAJcmVncy0+ZnMgPSBfX0tFUk5FTF9QRVJDUFU7CiAJcmV0dXJuIHJlZ3M7CiB9Ci0KLS8qIEN1cnJlbnQgZ2R0IHBvaW50cyAlZnMgYXQgdGhlICJtYXN0ZXIiIHBlci1jcHUgYXJlYTogYWZ0ZXIgdGhpcywKLSAqIGl0J3Mgb24gdGhlIHJlYWwgb25lLiAqLwotdm9pZCBzd2l0Y2hfdG9fbmV3X2dkdCh2b2lkKQotewotCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7Ci0KLQlnZHRfZGVzY3IuYWRkcmVzcyA9IChsb25nKWdldF9jcHVfZ2R0X3RhYmxlKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JZ2R0X2Rlc2NyLnNpemUgPSBHRFRfU0laRSAtIDE7Ci0JbG9hZF9nZHQoJmdkdF9kZXNjcik7Ci0JYXNtKCJtb3YgJTAsICUlZnMiIDogOiAiciIgKF9fS0VSTkVMX1BFUkNQVSkgOiAibWVtb3J5Iik7Ci19CisjZW5kaWYKIAogLyoKICAqIGNwdV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhdGUgdGhhdCBpcyBwZXItQ1BVLiBTb21lIGRhdGEgaXMgYWxyZWFkeQogICogaW5pdGlhbGl6ZWQgKG5hdHVyYWxseSkgaW4gdGhlIGJvb3RzdHJhcCBwcm9jZXNzLCBzdWNoIGFzIHRoZSBHRFQKICAqIGFuZCBJRFQuIFdlIHJlbG9hZCB0aGVtIG5ldmVydGhlbGVzcywgdGhpcyBmdW5jdGlvbiBhY3RzIGFzIGEKICAqICdDUFUgc3RhdGUgYmFycmllcicsIG5vdGhpbmcgc2hvdWxkIGdldCBhY3Jvc3MuCisgKiBBIGxvdCBvZiBzdGF0ZSBpcyBhbHJlYWR5IHNldCB1cCBpbiBQREEgaW5pdCBmb3IgNjQgYml0CiAgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0Cit2b2lkIF9fY3B1aW5pdCBjcHVfaW5pdCh2b2lkKQoreworCWludCBjcHUgPSBzdGFja19zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnQgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3Qgb3JpZ19pc3QgKm9yaWdfaXN0ID0gJnBlcl9jcHUob3JpZ19pc3QsIGNwdSk7CisJdW5zaWduZWQgbG9uZyB2OworCWNoYXIgKmVzdGFja3MgPSBOVUxMOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWU7CisJaW50IGk7CisKKwkvKiBDUFUgMCBpcyBpbml0aWFsaXNlZCBpbiBoZWFkNjQuYyAqLworCWlmIChjcHUgIT0gMCkKKwkJcGRhX2luaXQoY3B1KTsKKwllbHNlCisJCWVzdGFja3MgPSBib290X2V4Y2VwdGlvbl9zdGFja3M7CisKKwltZSA9IGN1cnJlbnQ7CisKKwlpZiAoY3B1X3Rlc3RfYW5kX3NldChjcHUsIGNwdV9pbml0aWFsaXplZCkpCisJCXBhbmljKCJDUFUjJWQgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIsIGNwdSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ1BVIyVkXG4iLCBjcHUpOworCisJY2xlYXJfaW5fY3I0KFg4Nl9DUjRfVk1FfFg4Nl9DUjRfUFZJfFg4Nl9DUjRfVFNEfFg4Nl9DUjRfREUpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwZXItQ1BVIEdEVCB3aXRoIHRoZSBib290IEdEVCwKKwkgKiBhbmQgc2V0IHVwIHRoZSBHRFQgZGVzY3JpcHRvcjoKKwkgKi8KKworCXN3aXRjaF90b19uZXdfZ2R0KCk7CisJbG9hZF9pZHQoKGNvbnN0IHN0cnVjdCBkZXNjX3B0ciAqKSZpZHRfZGVzY3IpOworCisJbWVtc2V0KG1lLT50aHJlYWQudGxzX2FycmF5LCAwLCBHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KTsKKwlzeXNjYWxsX2luaXQoKTsKKworCXdybXNybChNU1JfRlNfQkFTRSwgMCk7CisJd3Jtc3JsKE1TUl9LRVJORUxfR1NfQkFTRSwgMCk7CisJYmFycmllcigpOworCisJY2hlY2tfZWZlcigpOworCWlmIChjcHUgIT0gMCAmJiB4MmFwaWMpCisJCWVuYWJsZV94MmFwaWMoKTsKKworCS8qCisJICogc2V0IHVwIGFuZCBsb2FkIHRoZSBwZXItQ1BVIFRTUworCSAqLworCWlmICghb3JpZ19pc3QtPmlzdFswXSkgeworCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9yZGVyW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7CisJCSAgWzAgLi4uIE5fRVhDRVBUSU9OX1NUQUNLUyAtIDFdID0gRVhDRVBUSU9OX1NUQUNLX09SREVSLAorCQkgIFtERUJVR19TVEFDSyAtIDFdID0gREVCVUdfU1RBQ0tfT1JERVIKKwkJfTsKKwkJZm9yICh2ID0gMDsgdiA8IE5fRVhDRVBUSU9OX1NUQUNLUzsgdisrKSB7CisJCQlpZiAoY3B1KSB7CisJCQkJZXN0YWNrcyA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlclt2XSk7CisJCQkJaWYgKCFlc3RhY2tzKQorCQkJCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIGV4Y2VwdGlvbiAiCisJCQkJCSAgICAgICJzdGFjayAlbGQgJWRcbiIsIHYsIGNwdSk7CisJCQl9CisJCQllc3RhY2tzICs9IFBBR0VfU0laRSA8PCBvcmRlclt2XTsKKwkJCW9yaWdfaXN0LT5pc3Rbdl0gPSB0LT54ODZfdHNzLmlzdFt2XSA9CisJCQkJCSh1bnNpZ25lZCBsb25nKWVzdGFja3M7CisJCX0KKwl9CisKKwl0LT54ODZfdHNzLmlvX2JpdG1hcF9iYXNlID0gb2Zmc2V0b2Yoc3RydWN0IHRzc19zdHJ1Y3QsIGlvX2JpdG1hcCk7CisJLyoKKwkgKiA8PSBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBDUFUgd2lsbCBhY2Nlc3MgdXAgdG8KKwkgKiA4IGJpdHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIElPIHBlcm1pc3Npb24gYml0bWFwLgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gSU9fQklUTUFQX0xPTkdTOyBpKyspCisJCXQtPmlvX2JpdG1hcFtpXSA9IH4wVUw7CisKKwlhdG9taWNfaW5jKCZpbml0X21tLm1tX2NvdW50KTsKKwltZS0+YWN0aXZlX21tID0gJmluaXRfbW07CisJaWYgKG1lLT5tbSkKKwkJQlVHKCk7CisJZW50ZXJfbGF6eV90bGIoJmluaXRfbW0sIG1lKTsKKworCWxvYWRfc3AwKHQsICZjdXJyZW50LT50aHJlYWQpOworCXNldF90c3NfZGVzYyhjcHUsIHQpOworCWxvYWRfVFJfZGVzYygpOworCWxvYWRfTERUKCZpbml0X21tLmNvbnRleHQpOworCisjaWZkZWYgQ09ORklHX0tHREIKKwkvKgorCSAqIElmIHRoZSBrZ2RiIGlzIGNvbm5lY3RlZCBubyBkZWJ1ZyByZWdzIHNob3VsZCBiZSBhbHRlcmVkLiAgVGhpcworCSAqIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIEtHREIgYW5kIGEgS0dEQiBJL08gbW9kdWxlIGFyZSBidWlsdAorCSAqIGludG8gdGhlIGtlcm5lbCBhbmQgeW91IGFyZSB1c2luZyBlYXJseSBkZWJ1Z2dpbmcgd2l0aAorCSAqIGtnZGJ3YWl0LiBLR0RCIHdpbGwgY29udHJvbCB0aGUga2VybmVsIEhXIGJyZWFrcG9pbnQgcmVnaXN0ZXJzLgorCSAqLworCWlmIChrZ2RiX2Nvbm5lY3RlZCAmJiBhcmNoX2tnZGJfb3BzLmNvcnJlY3RfaHdfYnJlYWspCisJCWFyY2hfa2dkYl9vcHMuY29ycmVjdF9od19icmVhaygpOworCWVsc2UgeworI2VuZGlmCisJLyoKKwkgKiBDbGVhciBhbGwgNiBkZWJ1ZyByZWdpc3RlcnM6CisJICovCisKKwlzZXRfZGVidWdyZWcoMFVMLCAwKTsKKwlzZXRfZGVidWdyZWcoMFVMLCAxKTsKKwlzZXRfZGVidWdyZWcoMFVMLCAyKTsKKwlzZXRfZGVidWdyZWcoMFVMLCAzKTsKKwlzZXRfZGVidWdyZWcoMFVMLCA2KTsKKwlzZXRfZGVidWdyZWcoMFVMLCA3KTsKKyNpZmRlZiBDT05GSUdfS0dEQgorCS8qIElmIHRoZSBrZ2RiIGlzIGNvbm5lY3RlZCBubyBkZWJ1ZyByZWdzIHNob3VsZCBiZSBhbHRlcmVkLiAqLworCX0KKyNlbmRpZgorCisJZnB1X2luaXQoKTsKKworCXJhd19sb2NhbF9zYXZlX2ZsYWdzKGtlcm5lbF9lZmxhZ3MpOworCisJaWYgKGlzX3V2X3N5c3RlbSgpKQorCQl1dl9jcHVfaW5pdCgpOworfQorCisjZWxzZQorCiB2b2lkIF9fY3B1aW5pdCBjcHVfaW5pdCh2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC03MDksMTkgKzExMjQsMjEgQEAKIAkvKgogCSAqIEZvcmNlIEZQVSBpbml0aWFsaXphdGlvbjoKIAkgKi8KLQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CisJaWYgKGNwdV9oYXNfeHNhdmUpCisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzID0gVFNfWFNBVkU7CisJZWxzZQorCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CiAJY2xlYXJfdXNlZF9tYXRoKCk7CiAJbXhjc3JfZmVhdHVyZV9tYXNrX2luaXQoKTsKKworCS8qCisJICogQm9vdCBwcm9jZXNzb3IgdG8gc2V0dXAgdGhlIEZQIGFuZCBleHRlbmRlZCBzdGF0ZSBjb250ZXh0IGluZm8uCisJICovCisJaWYgKCFzbXBfcHJvY2Vzc29yX2lkKCkpCisJCWluaXRfdGhyZWFkX3hzdGF0ZSgpOworCisJeHNhdmVfaW5pdCgpOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi12b2lkIF9fY3B1aW5pdCBjcHVfdW5pbml0KHZvaWQpCi17Ci0JaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JY3B1X2NsZWFyKGNwdSwgY3B1X2luaXRpYWxpemVkKTsKIAotCS8qIGxhenkgVExCIHN0YXRlICovCi0JcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuc3RhdGUgPSAwOwotCXBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLmFjdGl2ZV9tbSA9ICZpbml0X21tOwotfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbl82NC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb25fNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2ZTNmMS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbl82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2dkYi5oPgotI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxhc20vaTM4Ny5oPgotI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9tdHJyLmg+Ci0jaW5jbHVkZSA8YXNtL21jZS5oPgotI2luY2x1ZGUgPGFzbS9wYXQuaD4KLSNpbmNsdWRlIDxhc20vbnVtYS5oPgotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL3BkYS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9wcm90by5oPgotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+Ci0KLSNpbmNsdWRlICJjcHUuaCIKLQotLyogV2UgbmVlZCB2YWxpZCBrZXJuZWwgc2VnbWVudHMgZm9yIGRhdGEgYW5kIGNvZGUgaW4gbG9uZyBtb2RlIHRvbwotICogSVJFVCB3aWxsIGNoZWNrIHRoZSBzZWdtZW50IHR5cGVzICBra2VpbCAyMDAwLzEwLzI4Ci0gKiBBbHNvIHN5c3JldCBtYW5kYXRlcyBhIHNwZWNpYWwgR0RUIGxheW91dAotICovCi0vKiBUaGUgVExTIGRlc2NyaXB0b3JzIGFyZSBjdXJyZW50bHkgYXQgYSBkaWZmZXJlbnQgcGxhY2UgY29tcGFyZWQgdG8gaTM4Ni4KLSAgIEhvcGVmdWxseSBub2JvZHkgZXhwZWN0cyB0aGVtIGF0IGEgZml4ZWQgcGxhY2UgKFdpbmU/KSAqLwotREVGSU5FX1BFUl9DUFUoc3RydWN0IGdkdF9wYWdlLCBnZHRfcGFnZSkgPSB7IC5nZHQgPSB7Ci0JW0dEVF9FTlRSWV9LRVJORUwzMl9DU10gPSB7IHsgeyAweDAwMDBmZmZmLCAweDAwY2Y5YjAwIH0gfSB9LAotCVtHRFRfRU5UUllfS0VSTkVMX0NTXSA9IHsgeyB7IDB4MDAwMGZmZmYsIDB4MDBhZjliMDAgfSB9IH0sCi0JW0dEVF9FTlRSWV9LRVJORUxfRFNdID0geyB7IHsgMHgwMDAwZmZmZiwgMHgwMGNmOTMwMCB9IH0gfSwKLQlbR0RUX0VOVFJZX0RFRkFVTFRfVVNFUjMyX0NTXSA9IHsgeyB7IDB4MDAwMGZmZmYsIDB4MDBjZmZiMDAgfSB9IH0sCi0JW0dEVF9FTlRSWV9ERUZBVUxUX1VTRVJfRFNdID0geyB7IHsgMHgwMDAwZmZmZiwgMHgwMGNmZjMwMCB9IH0gfSwKLQlbR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DU10gPSB7IHsgeyAweDAwMDBmZmZmLCAweDAwYWZmYjAwIH0gfSB9LAotfSB9OwotRVhQT1JUX1BFUl9DUFVfU1lNQk9MX0dQTChnZHRfcGFnZSk7Ci0KLV9fdTMyIGNsZWFyZWRfY3B1X2NhcHNbTkNBUElOVFNdIF9fY3B1aW5pdGRhdGE7Ci0KLS8qIEN1cnJlbnQgZ2R0IHBvaW50cyAlZnMgYXQgdGhlICJtYXN0ZXIiIHBlci1jcHUgYXJlYTogYWZ0ZXIgdGhpcywKLSAqIGl0J3Mgb24gdGhlIHJlYWwgb25lLiAqLwotdm9pZCBzd2l0Y2hfdG9fbmV3X2dkdCh2b2lkKQotewotCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7Ci0KLQlnZHRfZGVzY3IuYWRkcmVzcyA9IChsb25nKWdldF9jcHVfZ2R0X3RhYmxlKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JZ2R0X2Rlc2NyLnNpemUgPSBHRFRfU0laRSAtIDE7Ci0JbG9hZF9nZHQoJmdkdF9kZXNjcik7Ci19Ci0KLXN0cnVjdCBjcHVfZGV2ICpjcHVfZGV2c1tYODZfVkVORE9SX05VTV0gPSB7fTsKLQotc3RhdGljIHZvaWQgX19jcHVpbml0IGRlZmF1bHRfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JZGlzcGxheV9jYWNoZWluZm8oYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBfX2NwdWluaXRkYXRhIGRlZmF1bHRfY3B1ID0gewotCS5jX2luaXQJPSBkZWZhdWx0X2luaXQsCi0JLmNfdmVuZG9yID0gIlVua25vd24iLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiAqdGhpc19jcHUgX19jcHVpbml0ZGF0YSA9ICZkZWZhdWx0X2NwdTsKLQotaW50IF9fY3B1aW5pdCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JdW5zaWduZWQgaW50ICp2OwotCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsIDwgMHg4MDAwMDAwNCkKLQkJcmV0dXJuIDA7Ci0KLQl2ID0gKHVuc2lnbmVkIGludCAqKSBjLT54ODZfbW9kZWxfaWQ7Ci0JY3B1aWQoMHg4MDAwMDAwMiwgJnZbMF0sICZ2WzFdLCAmdlsyXSwgJnZbM10pOwotCWNwdWlkKDB4ODAwMDAwMDMsICZ2WzRdLCAmdls1XSwgJnZbNl0sICZ2WzddKTsKLQljcHVpZCgweDgwMDAwMDA0LCAmdls4XSwgJnZbOV0sICZ2WzEwXSwgJnZbMTFdKTsKLQljLT54ODZfbW9kZWxfaWRbNDhdID0gMDsKLQlyZXR1cm4gMTsKLX0KLQotCi12b2lkIF9fY3B1aW5pdCBkaXNwbGF5X2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JdW5zaWduZWQgaW50IG4sIGR1bW15LCBlYngsIGVjeCwgZWR4OwotCi0JbiA9IGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsOwotCi0JaWYgKG4gPj0gMHg4MDAwMDAwNSkgewotCQljcHVpZCgweDgwMDAwMDA1LCAmZHVtbXksICZlYngsICZlY3gsICZlZHgpOwotCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwxIEkgQ2FjaGU6ICVkSyAoJWQgYnl0ZXMvbGluZSksICIKLQkJICAgICAgICJEIGNhY2hlICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCi0JCSAgICAgICBlZHg+PjI0LCBlZHgmMHhGRiwgZWN4Pj4yNCwgZWN4JjB4RkYpOwotCQljLT54ODZfY2FjaGVfc2l6ZSA9IChlY3g+PjI0KSArIChlZHg+PjI0KTsKLQkJLyogT24gSzggTDEgVExCIGlzIGluY2x1c2l2ZSwgc28gZG9uJ3QgY291bnQgaXQgKi8KLQkJYy0+eDg2X3RsYnNpemUgPSAwOwotCX0KLQotCWlmIChuID49IDB4ODAwMDAwMDYpIHsKLQkJY3B1aWQoMHg4MDAwMDAwNiwgJmR1bW15LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQkJZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDYpOwotCQljLT54ODZfY2FjaGVfc2l6ZSA9IGVjeCA+PiAxNjsKLQkJYy0+eDg2X3RsYnNpemUgKz0gKChlYnggPj4gMTYpICYgMHhmZmYpICsgKGVieCAmIDB4ZmZmKTsKLQotCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwyIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpXG4iLAotCQljLT54ODZfY2FjaGVfc2l6ZSwgZWN4ICYgMHhGRik7Ci0JfQotfQotCi12b2lkIF9fY3B1aW5pdCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKQotewotI2lmZGVmIENPTkZJR19TTVAKLQl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OwotCWludCBpbmRleF9tc2IsIGNvcmVfYml0czsKLQotCWNwdWlkKDEsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwotCi0KLQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSFQpKQotCQlyZXR1cm47Ci0JaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ01QX0xFR0FDWSkpCi0JCWdvdG8gb3V0OwotCi0Jc21wX251bV9zaWJsaW5ncyA9IChlYnggJiAweGZmMDAwMCkgPj4gMTY7Ci0KLQlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gICJDUFU6IEh5cGVyLVRocmVhZGluZyBpcyBkaXNhYmxlZFxuIik7Ci0JfSBlbHNlIGlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkgewotCi0JCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gTlJfQ1BVUykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1BVOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgIgotCQkJICAgICAgICJzaWJsaW5ncyAlZCIsIHNtcF9udW1fc2libGluZ3MpOwotCQkJc21wX251bV9zaWJsaW5ncyA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbmRleF9tc2IgPSBnZXRfY291bnRfb3JkZXIoc21wX251bV9zaWJsaW5ncyk7Ci0JCWMtPnBoeXNfcHJvY19pZCA9IHBoeXNfcGtnX2lkKGluZGV4X21zYik7Ci0KLQkJc21wX251bV9zaWJsaW5ncyA9IHNtcF9udW1fc2libGluZ3MgLyBjLT54ODZfbWF4X2NvcmVzOwotCi0JCWluZGV4X21zYiA9IGdldF9jb3VudF9vcmRlcihzbXBfbnVtX3NpYmxpbmdzKTsKLQotCQljb3JlX2JpdHMgPSBnZXRfY291bnRfb3JkZXIoYy0+eDg2X21heF9jb3Jlcyk7Ci0KLQkJYy0+Y3B1X2NvcmVfaWQgPSBwaHlzX3BrZ19pZChpbmRleF9tc2IpICYKLQkJCQkJICAgICAgICgoMSA8PCBjb3JlX2JpdHMpIC0gMSk7Ci0JfQotb3V0OgotCWlmICgoYy0+eDg2X21heF9jb3JlcyAqIHNtcF9udW1fc2libGluZ3MpID4gMSkgewotCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAotCQkgICAgICAgYy0+cGh5c19wcm9jX2lkKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAgIkNQVTogUHJvY2Vzc29yIENvcmUgSUQ6ICVkXG4iLAotCQkgICAgICAgYy0+Y3B1X2NvcmVfaWQpOwotCX0KLQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBnZXRfY3B1X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JY2hhciAqdiA9IGMtPng4Nl92ZW5kb3JfaWQ7Ci0JaW50IGk7Ci0Jc3RhdGljIGludCBwcmludGVkOwotCi0JZm9yIChpID0gMDsgaSA8IFg4Nl9WRU5ET1JfTlVNOyBpKyspIHsKLQkJaWYgKGNwdV9kZXZzW2ldKSB7Ci0JCQlpZiAoIXN0cmNtcCh2LCBjcHVfZGV2c1tpXS0+Y19pZGVudFswXSkgfHwKLQkJCSAgICAoY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0gJiYKLQkJCSAgICAhc3RyY21wKHYsIGNwdV9kZXZzW2ldLT5jX2lkZW50WzFdKSkpIHsKLQkJCQljLT54ODZfdmVuZG9yID0gaTsKLQkJCQl0aGlzX2NwdSA9IGNwdV9kZXZzW2ldOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIXByaW50ZWQpIHsKLQkJcHJpbnRlZCsrOwotCQlwcmludGsoS0VSTl9FUlIgIkNQVTogVmVuZG9yIHVua25vd24sIHVzaW5nIGdlbmVyaWMgaW5pdC5cbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIkNQVTogWW91ciBzeXN0ZW0gbWF5IGJlIHVuc3RhYmxlLlxuIik7Ci0JfQotCWMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX1VOS05PV047Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jcHVfc3VwcG9ydF9wcmludCh2b2lkKQotewotCWludCBpLGo7Ci0Jc3RydWN0IGNwdV9kZXYgKmNwdV9kZXZ4OwotCi0JcHJpbnRrKCJLRVJORUwgc3VwcG9ydGVkIGNwdXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgWDg2X1ZFTkRPUl9OVU07IGkrKykgewotCQljcHVfZGV2eCA9IGNwdV9kZXZzW2ldOwotCQlpZiAoIWNwdV9kZXZ4KQotCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCWlmICghY3B1X2RldngtPmNfaWRlbnRbal0pCi0JCQkJY29udGludWU7Ci0JCQlwcmludGsoIiAgJXMgJXNcbiIsIGNwdV9kZXZ4LT5jX3ZlbmRvciwKLQkJCQljcHVfZGV2eC0+Y19pZGVudFtqXSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pZGVudGlmeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKLQotdm9pZCBfX2luaXQgZWFybHlfY3B1X2luaXQodm9pZCkKLXsKLSAgICAgICAgc3RydWN0IGNwdV92ZW5kb3JfZGV2ICpjdmRldjsKLQotICAgICAgICBmb3IgKGN2ZGV2ID0gX194ODZjcHV2ZW5kb3Jfc3RhcnQgOwotICAgICAgICAgICAgIGN2ZGV2IDwgX194ODZjcHV2ZW5kb3JfZW5kICAgOwotICAgICAgICAgICAgIGN2ZGV2KyspCi0gICAgICAgICAgICAgICAgY3B1X2RldnNbY3ZkZXYtPnZlbmRvcl0gPSBjdmRldi0+Y3B1X2RldjsKLQllYXJseV9jcHVfc3VwcG9ydF9wcmludCgpOwotCWVhcmx5X2lkZW50aWZ5X2NwdSgmYm9vdF9jcHVfZGF0YSk7Ci19Ci0KLS8qIERvIHNvbWUgZWFybHkgY3B1aWQgb24gdGhlIGJvb3QgQ1BVIHRvIGdldCBzb21lIHBhcmFtZXRlciB0aGF0IGFyZQotICAgbmVlZGVkIGJlZm9yZSBjaGVja19idWdzLiBFdmVyeXRoaW5nIGFkdmFuY2VkIGlzIGluIGlkZW50aWZ5X2NwdQotICAgYmVsb3cuICovCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaWRlbnRpZnlfY3B1KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQl1MzIgdGZtcywgeGx2bDsKLQotCWMtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKLQljLT54ODZfY2FjaGVfc2l6ZSA9IC0xOwotCWMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX1VOS05PV047Ci0JYy0+eDg2X21vZGVsID0gYy0+eDg2X21hc2sgPSAwOwkvKiBTbyBmYXIgdW5rbm93bi4uLiAqLwotCWMtPng4Nl92ZW5kb3JfaWRbMF0gPSAnXDAnOyAvKiBVbnNldCAqLwotCWMtPng4Nl9tb2RlbF9pZFswXSA9ICdcMCc7ICAvKiBVbnNldCAqLwotCWMtPng4Nl9jbGZsdXNoX3NpemUgPSA2NDsKLQljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gYy0+eDg2X2NsZmx1c2hfc2l6ZTsKLQljLT54ODZfbWF4X2NvcmVzID0gMTsKLQljLT54ODZfY29yZWlkX2JpdHMgPSAwOwotCWMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID0gMDsKLQltZW1zZXQoJmMtPng4Nl9jYXBhYmlsaXR5LCAwLCBzaXplb2YgYy0+eDg2X2NhcGFiaWxpdHkpOwotCi0JLyogR2V0IHZlbmRvciBuYW1lICovCi0JY3B1aWQoMHgwMDAwMDAwMCwgKHVuc2lnbmVkIGludCAqKSZjLT5jcHVpZF9sZXZlbCwKLQkgICAgICAodW5zaWduZWQgaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbMF0sCi0JICAgICAgKHVuc2lnbmVkIGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzhdLAotCSAgICAgICh1bnNpZ25lZCBpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs0XSk7Ci0KLQlnZXRfY3B1X3ZlbmRvcihjKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHN0YW5kYXJkIHNldCBvZiBjYXBhYmlsaXRpZXMgKi8KLQkvKiBOb3RlIHRoYXQgdGhlIHZlbmRvci1zcGVjaWZpYyBjb2RlIGJlbG93IG1pZ2h0IG92ZXJyaWRlICovCi0KLQkvKiBJbnRlbC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDAwMDAwMDAxICovCi0JaWYgKGMtPmNwdWlkX2xldmVsID49IDB4MDAwMDAwMDEpIHsKLQkJX191MzIgbWlzYzsKLQkJY3B1aWQoMHgwMDAwMDAwMSwgJnRmbXMsICZtaXNjLCAmYy0+eDg2X2NhcGFiaWxpdHlbNF0sCi0JCSAgICAgICZjLT54ODZfY2FwYWJpbGl0eVswXSk7Ci0JCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMHhmOwotCQljLT54ODZfbW9kZWwgPSAodGZtcyA+PiA0KSAmIDB4ZjsKLQkJYy0+eDg2X21hc2sgPSB0Zm1zICYgMHhmOwotCQlpZiAoYy0+eDg2ID09IDB4ZikKLQkJCWMtPng4NiArPSAodGZtcyA+PiAyMCkgJiAweGZmOwotCQlpZiAoYy0+eDg2ID49IDB4NikKLQkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OwotCQlpZiAodGVzdF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0NMRkxTSCkpCi0JCQljLT54ODZfY2xmbHVzaF9zaXplID0gKChtaXNjID4+IDgpICYgMHhmZikgKiA4OwotCX0gZWxzZSB7Ci0JCS8qIEhhdmUgQ1BVSUQgbGV2ZWwgMCBvbmx5IC0gdW5oZWFyZCBvZiAqLwotCQljLT54ODYgPSA0OwotCX0KLQotCWMtPmluaXRpYWxfYXBpY2lkID0gKGNwdWlkX2VieCgxKSA+PiAyNCkgJiAweGZmOwotI2lmZGVmIENPTkZJR19TTVAKLQljLT5waHlzX3Byb2NfaWQgPSBjLT5pbml0aWFsX2FwaWNpZDsKLSNlbmRpZgotCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCi0JeGx2bCA9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKLQljLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA9IHhsdmw7Ci0JaWYgKCh4bHZsICYgMHhmZmZmMDAwMCkgPT0gMHg4MDAwMDAwMCkgewotCQlpZiAoeGx2bCA+PSAweDgwMDAwMDAxKSB7Ci0JCQljLT54ODZfY2FwYWJpbGl0eVsxXSA9IGNwdWlkX2VkeCgweDgwMDAwMDAxKTsKLQkJCWMtPng4Nl9jYXBhYmlsaXR5WzZdID0gY3B1aWRfZWN4KDB4ODAwMDAwMDEpOwotCQl9Ci0JCWlmICh4bHZsID49IDB4ODAwMDAwMDQpCi0JCQlnZXRfbW9kZWxfbmFtZShjKTsgLyogRGVmYXVsdCBuYW1lICovCi0JfQotCi0JLyogVHJhbnNtZXRhLWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODA4NjAwMDEgKi8KLQl4bHZsID0gY3B1aWRfZWF4KDB4ODA4NjAwMDApOwotCWlmICgoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDApIHsKLQkJLyogRG9uJ3Qgc2V0IHg4Nl9jcHVpZF9sZXZlbCBoZXJlIGZvciBub3cgdG8gbm90IGNvbmZ1c2UuICovCi0JCWlmICh4bHZsID49IDB4ODA4NjAwMDEpCi0JCQljLT54ODZfY2FwYWJpbGl0eVsyXSA9IGNwdWlkX2VkeCgweDgwODYwMDAxKTsKLQl9Ci0KLQlpZiAoYy0+ZXh0ZW5kZWRfY3B1aWRfbGV2ZWwgPj0gMHg4MDAwMDAwNykKLQkJYy0+eDg2X3Bvd2VyID0gY3B1aWRfZWR4KDB4ODAwMDAwMDcpOwotCi0JaWYgKGMtPmV4dGVuZGVkX2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDgpIHsKLQkJdTMyIGVheCA9IGNwdWlkX2VheCgweDgwMDAwMDA4KTsKLQotCQljLT54ODZfdmlydF9iaXRzID0gKGVheCA+PiA4KSAmIDB4ZmY7Ci0JCWMtPng4Nl9waHlzX2JpdHMgPSBlYXggJiAweGZmOwotCX0KLQotCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfVU5LTk9XTiAmJgotCSAgICBjcHVfZGV2c1tjLT54ODZfdmVuZG9yXS0+Y19lYXJseV9pbml0KQotCQljcHVfZGV2c1tjLT54ODZfdmVuZG9yXS0+Y19lYXJseV9pbml0KGMpOwotCi0JdmFsaWRhdGVfcGF0X3N1cHBvcnQoYyk7Ci19Ci0KLS8qCi0gKiBUaGlzIGRvZXMgdGhlIGhhcmQgd29yayBvZiBhY3R1YWxseSBwaWNraW5nIGFwYXJ0IHRoZSBDUFUgc3R1ZmYuLi4KLSAqLwotc3RhdGljIHZvaWQgX19jcHVpbml0IGlkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JaW50IGk7Ci0KLQllYXJseV9pZGVudGlmeV9jcHUoYyk7Ci0KLQlpbml0X3NjYXR0ZXJlZF9jcHVpZF9mZWF0dXJlcyhjKTsKLQotCWMtPmFwaWNpZCA9IHBoeXNfcGtnX2lkKDApOwotCi0JLyoKLQkgKiBWZW5kb3Itc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBJbiB0aGlzIHNlY3Rpb24gd2UKLQkgKiBjYW5vbmljYWxpemUgdGhlIGZlYXR1cmUgZmxhZ3MsIG1lYW5pbmcgaWYgdGhlcmUgYXJlCi0JICogZmVhdHVyZXMgYSBjZXJ0YWluIENQVSBzdXBwb3J0cyB3aGljaCBDUFVJRCBkb2Vzbid0Ci0JICogdGVsbCB1cywgQ1BVSUQgY2xhaW1pbmcgaW5jb3JyZWN0IGZsYWdzLCBvciBvdGhlciBidWdzLAotCSAqIHdlIGhhbmRsZSB0aGVtIGhlcmUuCi0JICoKLQkgKiBBdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiwgYy0+eDg2X2NhcGFiaWxpdHkgYmV0dGVyCi0JICogaW5kaWNhdGUgdGhlIGZlYXR1cmVzIHRoaXMgQ1BVIGdlbnVpbmVseSBzdXBwb3J0cyEKLQkgKi8KLQlpZiAodGhpc19jcHUtPmNfaW5pdCkKLQkJdGhpc19jcHUtPmNfaW5pdChjKTsKLQotCWRldGVjdF9odChjKTsKLQotCS8qCi0JICogT24gU01QLCBib290X2NwdV9kYXRhIGhvbGRzIHRoZSBjb21tb24gZmVhdHVyZSBzZXQgYmV0d2VlbgotCSAqIGFsbCBDUFVzOyBzbyBtYWtlIHN1cmUgdGhhdCB3ZSBpbmRpY2F0ZSB3aGljaCBmZWF0dXJlcyBhcmUKLQkgKiBjb21tb24gYmV0d2VlbiB0aGUgQ1BVcy4gIFRoZSBmaXJzdCB0aW1lIHRoaXMgcm91dGluZSBnZXRzCi0JICogZXhlY3V0ZWQsIGMgPT0gJmJvb3RfY3B1X2RhdGEuCi0JICovCi0JaWYgKGMgIT0gJmJvb3RfY3B1X2RhdGEpIHsKLQkJLyogQU5EIHRoZSBhbHJlYWR5IGFjY3VtdWxhdGVkIGZsYWdzIHdpdGggdGhlc2UgKi8KLQkJZm9yIChpID0gMDsgaSA8IE5DQVBJTlRTOyBpKyspCi0JCQlib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5W2ldICY9IGMtPng4Nl9jYXBhYmlsaXR5W2ldOwotCX0KLQotCS8qIENsZWFyIGFsbCBmbGFncyBvdmVycmlkZW4gYnkgb3B0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQotCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y2xlYXJlZF9jcHVfY2Fwc1tpXTsKLQotI2lmZGVmIENPTkZJR19YODZfTUNFCi0JbWNoZWNrX2luaXQoYyk7Ci0jZW5kaWYKLQlzZWxlY3RfaWRsZV9yb3V0aW5lKGMpOwotCi0jaWZkZWYgQ09ORklHX05VTUEKLQludW1hX2FkZF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLSNlbmRpZgotCi19Ci0KLXZvaWQgX19jcHVpbml0IGlkZW50aWZ5X2Jvb3RfY3B1KHZvaWQpCi17Ci0JaWRlbnRpZnlfY3B1KCZib290X2NwdV9kYXRhKTsKLX0KLQotdm9pZCBfX2NwdWluaXQgaWRlbnRpZnlfc2Vjb25kYXJ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JQlVHX09OKGMgPT0gJmJvb3RfY3B1X2RhdGEpOwotCWlkZW50aWZ5X2NwdShjKTsKLQltdHJyX2FwX2luaXQoKTsKLX0KLQotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9jbGZsdXNoKGNoYXIgKmFyZykKLXsKLQlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX0NMRkxTSCk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJub2NsZmx1c2giLCBzZXR1cF9ub2NsZmx1c2gpOwotCi12b2lkIF9fY3B1aW5pdCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JaWYgKGMtPng4Nl9tb2RlbF9pZFswXSkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiJXMiLCBjLT54ODZfbW9kZWxfaWQpOwotCi0JaWYgKGMtPng4Nl9tYXNrIHx8IGMtPmNwdWlkX2xldmVsID49IDApCi0JCXByaW50ayhLRVJOX0NPTlQgIiBzdGVwcGluZyAlMDJ4XG4iLCBjLT54ODZfbWFzayk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotfQotCi1zdGF0aWMgX19pbml0IGludCBzZXR1cF9kaXNhYmxlY3B1aWQoY2hhciAqYXJnKQotewotCWludCBiaXQ7Ci0JaWYgKGdldF9vcHRpb24oJmFyZywgJmJpdCkgJiYgYml0IDwgTkNBUElOVFMqMzIpCi0JCXNldHVwX2NsZWFyX2NwdV9jYXAoYml0KTsKLQllbHNlCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotX19zZXR1cCgiY2xlYXJjcHVpZD0iLCBzZXR1cF9kaXNhYmxlY3B1aWQpOwotCi1jcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkIF9fY3B1aW5pdGRhdGEgPSBDUFVfTUFTS19OT05FOwotCi1zdHJ1Y3QgeDg2NjRfcGRhICoqX2NwdV9wZGEgX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0woX2NwdV9wZGEpOwotCi1zdHJ1Y3QgZGVzY19wdHIgaWR0X2Rlc2NyID0geyAyNTYgKiAxNiAtIDEsICh1bnNpZ25lZCBsb25nKSBpZHRfdGFibGUgfTsKLQotY2hhciBib290X2NwdV9zdGFja1tJUlFTVEFDS1NJWkVdIF9fcGFnZV9hbGlnbmVkX2JzczsKLQotdW5zaWduZWQgbG9uZyBfX3N1cHBvcnRlZF9wdGVfbWFzayBfX3JlYWRfbW9zdGx5ID0gfjBVTDsKLUVYUE9SVF9TWU1CT0xfR1BMKF9fc3VwcG9ydGVkX3B0ZV9tYXNrKTsKLQotc3RhdGljIGludCBkb19ub3RfbnggX19jcHVpbml0ZGF0YTsKLQotLyogbm9leGVjPW9ufG9mZgotQ29udHJvbCBub24gZXhlY3V0YWJsZSBtYXBwaW5ncyBmb3IgNjRiaXQgcHJvY2Vzc2VzLgotCi1vbglFbmFibGUoZGVmYXVsdCkKLW9mZglEaXNhYmxlCi0qLwotc3RhdGljIGludCBfX2luaXQgbm9ueF9zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKCFzdHIpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICghc3RybmNtcChzdHIsICJvbiIsIDIpKSB7Ci0JCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOwotCQlkb19ub3RfbnggPSAwOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAib2ZmIiwgMykpIHsKLQkJZG9fbm90X254ID0gMTsKLQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX05YOwotCX0KLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJub2V4ZWMiLCBub254X3NldHVwKTsKLQotaW50IGZvcmNlX3BlcnNvbmFsaXR5MzI7Ci0KLS8qIG5vZXhlYzMyPW9ufG9mZgotQ29udHJvbCBub24gZXhlY3V0YWJsZSBoZWFwIGZvciAzMmJpdCBwcm9jZXNzZXMuCi1UbyBjb250cm9sIHRoZSBzdGFjayB0b28gdXNlIG5vZXhlYz1vZmYKLQotb24JUFJPVF9SRUFEIGRvZXMgbm90IGltcGx5IFBST1RfRVhFQyBmb3IgMzJiaXQgcHJvY2Vzc2VzIChkZWZhdWx0KQotb2ZmCVBST1RfUkVBRCBpbXBsaWVzIFBST1RfRVhFQwotKi8KLXN0YXRpYyBpbnQgX19pbml0IG5vbngzMl9zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKLQkJZm9yY2VfcGVyc29uYWxpdHkzMiAmPSB+UkVBRF9JTVBMSUVTX0VYRUM7Ci0JZWxzZSBpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKLQkJZm9yY2VfcGVyc29uYWxpdHkzMiB8PSBSRUFEX0lNUExJRVNfRVhFQzsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoIm5vZXhlYzMyPSIsIG5vbngzMl9zZXR1cCk7Ci0KLXZvaWQgcGRhX2luaXQoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgeDg2NjRfcGRhICpwZGEgPSBjcHVfcGRhKGNwdSk7Ci0KLQkvKiBTZXR1cCB1cCBkYXRhIHRoYXQgbWF5IGJlIG5lZWRlZCBpbiBfX2dldF9mcmVlX3BhZ2VzIGVhcmx5ICovCi0JbG9hZHNlZ21lbnQoZnMsIDApOwotCWxvYWRzZWdtZW50KGdzLCAwKTsKLQkvKiBNZW1vcnkgY2xvYmJlcnMgdXNlZCB0byBvcmRlciBQREEgYWNjZXNzZWQgKi8KLQltYigpOwotCXdybXNybChNU1JfR1NfQkFTRSwgcGRhKTsKLQltYigpOwotCi0JcGRhLT5jcHVudW1iZXIgPSBjcHU7Ci0JcGRhLT5pcnFjb3VudCA9IC0xOwotCXBkYS0+a2VybmVsc3RhY2sgPSAodW5zaWduZWQgbG9uZylzdGFja190aHJlYWRfaW5mbygpIC0KLQkJCQkgUERBX1NUQUNLT0ZGU0VUICsgVEhSRUFEX1NJWkU7Ci0JcGRhLT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKLQlwZGEtPm1tdV9zdGF0ZSA9IDA7Ci0KLQlpZiAoY3B1ID09IDApIHsKLQkJLyogb3RoZXJzIGFyZSBpbml0aWFsaXplZCBpbiBzbXBib290LmMgKi8KLQkJcGRhLT5wY3VycmVudCA9ICZpbml0X3Rhc2s7Ci0JCXBkYS0+aXJxc3RhY2twdHIgPSBib290X2NwdV9zdGFjazsKLQl9IGVsc2UgewotCQlwZGEtPmlycXN0YWNrcHRyID0gKGNoYXIgKikKLQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgSVJRU1RBQ0tfT1JERVIpOwotCQlpZiAoIXBkYS0+aXJxc3RhY2twdHIpCi0JCQlwYW5pYygiY2Fubm90IGFsbG9jYXRlIGlycXN0YWNrIGZvciBjcHUgJWQiLCBjcHUpOwotCi0JCWlmIChwZGEtPm5vZGVudW1iZXIgPT0gMCAmJiBjcHVfdG9fbm9kZShjcHUpICE9IE5VTUFfTk9fTk9ERSkKLQkJCXBkYS0+bm9kZW51bWJlciA9IGNwdV90b19ub2RlKGNwdSk7Ci0JfQotCi0JcGRhLT5pcnFzdGFja3B0ciArPSBJUlFTVEFDS1NJWkUtNjQ7Ci19Ci0KLWNoYXIgYm9vdF9leGNlcHRpb25fc3RhY2tzWyhOX0VYQ0VQVElPTl9TVEFDS1MgLSAxKSAqIEVYQ0VQVElPTl9TVEtTWiArCi0JCQkgICBERUJVR19TVEtTWl0gX19wYWdlX2FsaWduZWRfYnNzOwotCi1leHRlcm4gYXNtbGlua2FnZSB2b2lkIGlnbm9yZV9zeXNyZXQodm9pZCk7Ci0KLS8qIE1heSBub3QgYmUgbWFya2VkIF9faW5pdDogdXNlZCBieSBzb2Z0d2FyZSBzdXNwZW5kICovCi12b2lkIHN5c2NhbGxfaW5pdCh2b2lkKQotewotCS8qCi0JICogTFNUQVIgYW5kIFNUQVIgbGl2ZSBpbiBhIGJpdCBzdHJhbmdlIHN5bWJpb3Npcy4KLQkgKiBUaGV5IGJvdGggd3JpdGUgdG8gdGhlIHNhbWUgaW50ZXJuYWwgcmVnaXN0ZXIuIFNUQVIgYWxsb3dzIHRvCi0JICogc2V0IENTL0RTIGJ1dCBvbmx5IGEgMzJiaXQgdGFyZ2V0LiBMU1RBUiBzZXRzIHRoZSA2NGJpdCByaXAuCi0JICovCi0Jd3Jtc3JsKE1TUl9TVEFSLCAgKCh1NjQpX19VU0VSMzJfQ1MpPDw0OCAgfCAoKHU2NClfX0tFUk5FTF9DUyk8PDMyKTsKLQl3cm1zcmwoTVNSX0xTVEFSLCBzeXN0ZW1fY2FsbCk7Ci0Jd3Jtc3JsKE1TUl9DU1RBUiwgaWdub3JlX3N5c3JldCk7Ci0KLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlzeXNjYWxsMzJfY3B1X2luaXQoKTsKLSNlbmRpZgotCi0JLyogRmxhZ3MgdG8gY2xlYXIgb24gc3lzY2FsbCAqLwotCXdybXNybChNU1JfU1lTQ0FMTF9NQVNLLAotCSAgICAgICBYODZfRUZMQUdTX1RGfFg4Nl9FRkxBR1NfREZ8WDg2X0VGTEFHU19JRnxYODZfRUZMQUdTX0lPUEwpOwotfQotCi12b2lkIF9fY3B1aW5pdCBjaGVja19lZmVyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBlZmVyOwotCi0JcmRtc3JsKE1TUl9FRkVSLCBlZmVyKTsKLQlpZiAoIShlZmVyICYgRUZFUl9OWCkgfHwgZG9fbm90X254KQotCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Ci19Ci0KLXVuc2lnbmVkIGxvbmcga2VybmVsX2VmbGFnczsKLQotLyoKLSAqIENvcGllcyBvZiB0aGUgb3JpZ2luYWwgaXN0IHZhbHVlcyBmcm9tIHRoZSB0c3MgYXJlIG9ubHkgYWNjZXNzZWQgZHVyaW5nCi0gKiBkZWJ1Z2dpbmcsIG5vIHNwZWNpYWwgYWxpZ25tZW50IHJlcXVpcmVkLgotICovCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgb3JpZ19pc3QsIG9yaWdfaXN0KTsKLQotLyoKLSAqIGNwdV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhdGUgdGhhdCBpcyBwZXItQ1BVLiBTb21lIGRhdGEgaXMgYWxyZWFkeQotICogaW5pdGlhbGl6ZWQgKG5hdHVyYWxseSkgaW4gdGhlIGJvb3RzdHJhcCBwcm9jZXNzLCBzdWNoIGFzIHRoZSBHRFQKLSAqIGFuZCBJRFQuIFdlIHJlbG9hZCB0aGVtIG5ldmVydGhlbGVzcywgdGhpcyBmdW5jdGlvbiBhY3RzIGFzIGEKLSAqICdDUFUgc3RhdGUgYmFycmllcicsIG5vdGhpbmcgc2hvdWxkIGdldCBhY3Jvc3MuCi0gKiBBIGxvdCBvZiBzdGF0ZSBpcyBhbHJlYWR5IHNldCB1cCBpbiBQREEgaW5pdC4KLSAqLwotdm9pZCBfX2NwdWluaXQgY3B1X2luaXQodm9pZCkKLXsKLQlpbnQgY3B1ID0gc3RhY2tfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB0c3Nfc3RydWN0ICp0ID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7Ci0Jc3RydWN0IG9yaWdfaXN0ICpvcmlnX2lzdCA9ICZwZXJfY3B1KG9yaWdfaXN0LCBjcHUpOwotCXVuc2lnbmVkIGxvbmcgdjsKLQljaGFyICplc3RhY2tzID0gTlVMTDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lOwotCWludCBpOwotCi0JLyogQ1BVIDAgaXMgaW5pdGlhbGlzZWQgaW4gaGVhZDY0LmMgKi8KLQlpZiAoY3B1ICE9IDApCi0JCXBkYV9pbml0KGNwdSk7Ci0JZWxzZQotCQllc3RhY2tzID0gYm9vdF9leGNlcHRpb25fc3RhY2tzOwotCi0JbWUgPSBjdXJyZW50OwotCi0JaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKQotCQlwYW5pYygiQ1BVIyVkIGFscmVhZHkgaW5pdGlhbGl6ZWQhXG4iLCBjcHUpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIENQVSMlZFxuIiwgY3B1KTsKLQotCWNsZWFyX2luX2NyNChYODZfQ1I0X1ZNRXxYODZfQ1I0X1BWSXxYODZfQ1I0X1RTRHxYODZfQ1I0X0RFKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgcGVyLUNQVSBHRFQgd2l0aCB0aGUgYm9vdCBHRFQsCi0JICogYW5kIHNldCB1cCB0aGUgR0RUIGRlc2NyaXB0b3I6Ci0JICovCi0KLQlzd2l0Y2hfdG9fbmV3X2dkdCgpOwotCWxvYWRfaWR0KChjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKikmaWR0X2Rlc2NyKTsKLQotCW1lbXNldChtZS0+dGhyZWFkLnRsc19hcnJheSwgMCwgR0RUX0VOVFJZX1RMU19FTlRSSUVTICogOCk7Ci0Jc3lzY2FsbF9pbml0KCk7Ci0KLQl3cm1zcmwoTVNSX0ZTX0JBU0UsIDApOwotCXdybXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIDApOwotCWJhcnJpZXIoKTsKLQotCWNoZWNrX2VmZXIoKTsKLQotCS8qCi0JICogc2V0IHVwIGFuZCBsb2FkIHRoZSBwZXItQ1BVIFRTUwotCSAqLwotCWZvciAodiA9IDA7IHYgPCBOX0VYQ0VQVElPTl9TVEFDS1M7IHYrKykgewotCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9yZGVyW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7Ci0JCQlbMCAuLi4gTl9FWENFUFRJT05fU1RBQ0tTIC0gMV0gPSBFWENFUFRJT05fU1RBQ0tfT1JERVIsCi0JCQlbREVCVUdfU1RBQ0sgLSAxXSA9IERFQlVHX1NUQUNLX09SREVSCi0JCX07Ci0JCWlmIChjcHUpIHsKLQkJCWVzdGFja3MgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXJbdl0pOwotCQkJaWYgKCFlc3RhY2tzKQotCQkJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgZXhjZXB0aW9uIHN0YWNrICVsZCAlZFxuIiwKLQkJCQkgICAgICB2LCBjcHUpOwotCQl9Ci0JCWVzdGFja3MgKz0gUEFHRV9TSVpFIDw8IG9yZGVyW3ZdOwotCQlvcmlnX2lzdC0+aXN0W3ZdID0gdC0+eDg2X3Rzcy5pc3Rbdl0gPSAodW5zaWduZWQgbG9uZyllc3RhY2tzOwotCX0KLQotCXQtPng4Nl90c3MuaW9fYml0bWFwX2Jhc2UgPSBvZmZzZXRvZihzdHJ1Y3QgdHNzX3N0cnVjdCwgaW9fYml0bWFwKTsKLQkvKgotCSAqIDw9IGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIENQVSB3aWxsIGFjY2VzcyB1cCB0bwotCSAqIDggYml0cyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgSU8gcGVybWlzc2lvbiBiaXRtYXAuCi0JICovCi0JZm9yIChpID0gMDsgaSA8PSBJT19CSVRNQVBfTE9OR1M7IGkrKykKLQkJdC0+aW9fYml0bWFwW2ldID0gfjBVTDsKLQotCWF0b21pY19pbmMoJmluaXRfbW0ubW1fY291bnQpOwotCW1lLT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKLQlpZiAobWUtPm1tKQotCQlCVUcoKTsKLQllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgbWUpOwotCi0JbG9hZF9zcDAodCwgJmN1cnJlbnQtPnRocmVhZCk7Ci0Jc2V0X3Rzc19kZXNjKGNwdSwgdCk7Ci0JbG9hZF9UUl9kZXNjKCk7Ci0JbG9hZF9MRFQoJmluaXRfbW0uY29udGV4dCk7Ci0KLSNpZmRlZiBDT05GSUdfS0dEQgotCS8qCi0JICogSWYgdGhlIGtnZGIgaXMgY29ubmVjdGVkIG5vIGRlYnVnIHJlZ3Mgc2hvdWxkIGJlIGFsdGVyZWQuICBUaGlzCi0JICogaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gS0dEQiBhbmQgYSBLR0RCIEkvTyBtb2R1bGUgYXJlIGJ1aWx0Ci0JICogaW50byB0aGUga2VybmVsIGFuZCB5b3UgYXJlIHVzaW5nIGVhcmx5IGRlYnVnZ2luZyB3aXRoCi0JICoga2dkYndhaXQuIEtHREIgd2lsbCBjb250cm9sIHRoZSBrZXJuZWwgSFcgYnJlYWtwb2ludCByZWdpc3RlcnMuCi0JICovCi0JaWYgKGtnZGJfY29ubmVjdGVkICYmIGFyY2hfa2dkYl9vcHMuY29ycmVjdF9od19icmVhaykKLQkJYXJjaF9rZ2RiX29wcy5jb3JyZWN0X2h3X2JyZWFrKCk7Ci0JZWxzZSB7Ci0jZW5kaWYKLQkvKgotCSAqIENsZWFyIGFsbCA2IGRlYnVnIHJlZ2lzdGVyczoKLQkgKi8KLQotCXNldF9kZWJ1Z3JlZygwVUwsIDApOwotCXNldF9kZWJ1Z3JlZygwVUwsIDEpOwotCXNldF9kZWJ1Z3JlZygwVUwsIDIpOwotCXNldF9kZWJ1Z3JlZygwVUwsIDMpOwotCXNldF9kZWJ1Z3JlZygwVUwsIDYpOwotCXNldF9kZWJ1Z3JlZygwVUwsIDcpOwotI2lmZGVmIENPTkZJR19LR0RCCi0JLyogSWYgdGhlIGtnZGIgaXMgY29ubmVjdGVkIG5vIGRlYnVnIHJlZ3Mgc2hvdWxkIGJlIGFsdGVyZWQuICovCi0JfQotI2VuZGlmCi0KLQlmcHVfaW5pdCgpOwotCi0JcmF3X2xvY2FsX3NhdmVfZmxhZ3Moa2VybmVsX2VmbGFncyk7Ci0KLQlpZiAoaXNfdXZfc3lzdGVtKCkpCi0JCXV2X2NwdV9pbml0KCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdS5oIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaAppbmRleCA0ZDg5NGU4Li5kZTQwOTRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdS5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1LmgKQEAgLTIxLDIzICsyMSwxNiBAQAogCXZvaWQJCSgqY19pbml0KShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKTsKIAl2b2lkCQkoKmNfaWRlbnRpZnkpKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOwogCXVuc2lnbmVkIGludAkoKmNfc2l6ZV9jYWNoZSkoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpOworCWludAljX3g4Nl92ZW5kb3I7CiB9OwogCi1leHRlcm4gc3RydWN0IGNwdV9kZXYgKiBjcHVfZGV2cyBbWDg2X1ZFTkRPUl9OVU1dOworI2RlZmluZSBjcHVfZGV2X3JlZ2lzdGVyKGNwdV9kZXZYKSBcCisJc3RhdGljIHN0cnVjdCBjcHVfZGV2ICpfX2NwdV9kZXZfIyNjcHVfZGV2WCBfX3VzZWQgXAorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIueDg2X2NwdV9kZXYuaW5pdCIpKSkgPSBcCisJJmNwdV9kZXZYOwogCi1zdHJ1Y3QgY3B1X3ZlbmRvcl9kZXYgewotCWludCB2ZW5kb3I7Ci0Jc3RydWN0IGNwdV9kZXYgKmNwdV9kZXY7Ci19OworZXh0ZXJuIHN0cnVjdCBjcHVfZGV2ICpfX3g4Nl9jcHVfZGV2X3N0YXJ0W10sICpfX3g4Nl9jcHVfZGV2X2VuZFtdOwogCi0jZGVmaW5lIGNwdV92ZW5kb3JfZGV2X3JlZ2lzdGVyKGNwdV92ZW5kb3JfaWQsIGNwdV9kZXYpIFwKLQlzdGF0aWMgc3RydWN0IGNwdV92ZW5kb3JfZGV2IF9fY3B1X3ZlbmRvcl9kZXZfIyNjcHVfdmVuZG9yX2lkIF9fdXNlZCBcCi0JX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi54ODZjcHV2ZW5kb3IuaW5pdCIpKSkgPSBcCi0JeyBjcHVfdmVuZG9yX2lkLCBjcHVfZGV2IH0KLQotZXh0ZXJuIHN0cnVjdCBjcHVfdmVuZG9yX2RldiBfX3g4NmNwdXZlbmRvcl9zdGFydFtdLCBfX3g4NmNwdXZlbmRvcl9lbmRbXTsKLQotZXh0ZXJuIGludCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgZGlzcGxheV9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggZGQwOTdiOC4uYzI0YzRhNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMjU2LDcgKzI1Niw4IEBACiAgKiBPbmx5IElBMzJfQVBFUkYvSUEzMl9NUEVSRiByYXRpbyBpcyBhcmNoaXRlY3R1cmFsbHkgZGVmaW5lZCBhbmQKICAqIG5vIG1lYW5pbmcgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlc2UgTVNScy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbWVhc3VyZWRfcGVyZih1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbWVhc3VyZWRfcGVyZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuaW9uIHsKIAkJc3RydWN0IHsKQEAgLTMyNiw3ICszMjcsNyBAQAogCiAjZW5kaWYKIAotCXJldHZhbCA9IHBlcl9jcHUoZHJ2X2RhdGEsIGNwdSktPm1heF9mcmVxICogcGVyZl9wZXJjZW50IC8gMTAwOworCXJldHZhbCA9IHBlcl9jcHUoZHJ2X2RhdGEsIHBvbGljeS0+Y3B1KS0+bWF4X2ZyZXEgKiBwZXJmX3BlcmNlbnQgLyAxMDA7CiAKIAlwdXRfY3B1KCk7CiAJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJnNhdmVkX21hc2spOwpAQCAtNzg1LDcgKzc4NiwxMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlmcmVlX3BlcmNwdShhY3BpX3BlcmZfZGF0YSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9jcHVmcmVxX2V4aXQodm9pZCkKQEAgLTc5NSw4ICs4MDAsNiBAQAogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOwogCiAJZnJlZV9wZXJjcHUoYWNwaV9wZXJmX2RhdGEpOwotCi0JcmV0dXJuOwogfQogCiBtb2R1bGVfcGFyYW0oYWNwaV9wc3RhdGVfc3RyaWN0LCB1aW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMKaW5kZXggZTRhNGJmOC4uZmU2MTNjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VsYW5mcmVxLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAKICNpbmNsdWRlIDxhc20vbXNyLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjZGVmaW5lIFJFR19DU0NJUiAweDIyCQkvKiBDaGlwIFNldHVwIGFuZCBDb250cm9sIEluZGV4IFJlZ2lzdGVyICAgICovCiAjZGVmaW5lIFJFR19DU0NEUiAweDIzCQkvKiBDaGlwIFNldHVwIGFuZCBDb250cm9sIERhdGEgIFJlZ2lzdGVyICAgICovCkBAIC04Miw3ICs4Miw3IEBACiAJdTggY2xvY2tzcGVlZF9yZWc7ICAgIC8qIENsb2NrIFNwZWVkIFJlZ2lzdGVyICovCiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCW91dGJfcCgweDgwLFJFR19DU0NJUik7CisJb3V0Yl9wKDB4ODAsIFJFR19DU0NJUik7CiAJY2xvY2tzcGVlZF9yZWcgPSBpbmJfcChSRUdfQ1NDRFIpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtOTgsMTAgKzk4LDEwIEBACiAJfQogCiAJLyogMzMgTUh6IGlzIG5vdCAzMiBNSHouLi4gKi8KLQlpZiAoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCk9PTB4QTApCisJaWYgKChjbG9ja3NwZWVkX3JlZyAmIDB4RTApID09IDB4QTApCiAJCXJldHVybiAzMzAwMDsKIAotCXJldHVybiAoKDE8PCgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA+PiA1KSkgKiAxMDAwKTsKKwlyZXR1cm4gKDE8PCgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA+PiA1KSkgKiAxMDAwOwogfQogCiAKQEAgLTExNyw3ICsxMTcsNyBAQAogICoJVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgogICovCiAKLXN0YXRpYyB2b2lkIGVsYW5mcmVxX3NldF9jcHVfc3RhdGUgKHVuc2lnbmVkIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIGVsYW5mcmVxX3NldF9jcHVfc3RhdGUodW5zaWduZWQgaW50IHN0YXRlKQogewogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICAgIGZyZXFzOwogCkBAIC0xNDQsMjAgKzE0NCwyMCBAQAogCSAqLwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlvdXRiX3AoMHg0MCxSRUdfQ1NDSVIpOwkJLyogRGlzYWJsZSBoeXBlcnNwZWVkIG1vZGUgKi8KLQlvdXRiX3AoMHgwMCxSRUdfQ1NDRFIpOworCW91dGJfcCgweDQwLCBSRUdfQ1NDSVIpOwkJLyogRGlzYWJsZSBoeXBlcnNwZWVkIG1vZGUgKi8KKwlvdXRiX3AoMHgwMCwgUkVHX0NTQ0RSKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CQkvKiB3YWl0IHRpbGwgaW50ZXJuYWwgcGlwZWxpbmVzIGFuZCAqLwogCXVkZWxheSgxMDAwKTsJCQkvKiBidWZmZXJzIGhhdmUgY2xlYW5lZCB1cCAgICAgICAgICAqLwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAogCS8qIG5vdywgc2V0IHRoZSBDUFUgY2xvY2sgc3BlZWQgcmVnaXN0ZXIgKDB4ODApICovCi0Jb3V0Yl9wKDB4ODAsUkVHX0NTQ0lSKTsKLQlvdXRiX3AoZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS52YWw4MGgsUkVHX0NTQ0RSKTsKKwlvdXRiX3AoMHg4MCwgUkVHX0NTQ0lSKTsKKwlvdXRiX3AoZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS52YWw4MGgsIFJFR19DU0NEUik7CiAKIAkvKiBub3csIHRoZSBoeXBlcnNwZWVkIGJpdCBpbiBQTVUgRm9yY2UgTW9kZSBSZWdpc3RlciAoMHg0MCkgKi8KLQlvdXRiX3AoMHg0MCxSRUdfQ1NDSVIpOwotCW91dGJfcChlbGFuX211bHRpcGxpZXJbc3RhdGVdLnZhbDQwaCxSRUdfQ1NDRFIpOworCW91dGJfcCgweDQwLCBSRUdfQ1NDSVIpOworCW91dGJfcChlbGFuX211bHRpcGxpZXJbc3RhdGVdLnZhbDQwaCwgUkVHX0NTQ0RSKTsKIAl1ZGVsYXkoMTAwMDApOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApAQCAtMTczLDEyICsxNzMsMTIgQEAKICAqCWZvciB0aGUgaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCiAgKi8KIAotc3RhdGljIGludCBlbGFuZnJlcV92ZXJpZnkgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQorc3RhdGljIGludCBlbGFuZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZlbGFuZnJlcV90YWJsZVswXSk7CiB9CiAKLXN0YXRpYyBpbnQgZWxhbmZyZXFfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKK3N0YXRpYyBpbnQgZWxhbmZyZXFfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCiB7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAogCS8qIGNhcGFiaWxpdHkgY2hlY2sgKi8KIAlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8Ci0JICAgIChjLT54ODYgIT0gNCkgfHwgKGMtPng4Nl9tb2RlbCE9MTApKQorCSAgICAoYy0+eDg2ICE9IDQpIHx8IChjLT54ODZfbW9kZWwgIT0gMTApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIG1heCBmcmVxICovCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJbWF4X2ZyZXEgPSBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSgwKTsKIAogCS8qIHRhYmxlIGluaXQgKi8KLQlmb3IgKGk9MDsgKGVsYW5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCWZvciAoaSA9IDA7IChlbGFuZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJaWYgKGVsYW5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA+IG1heF9mcmVxKQogCQkJZWxhbmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOwogCX0KQEAgLTIyNCw3ICsyMjQsNyBAQAogCiAJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGVsYW5mcmVxX3RhYmxlKTsKIAlpZiAocmVzdWx0KQotCQlyZXR1cm4gKHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CiAKIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihlbGFuZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOwogCXJldHVybiAwOwpAQCAtMjYwLDcgKzI2MCw3IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogZWxhbmZyZXFfYXR0cltdID0geworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgKmVsYW5mcmVxX2F0dHJbXSA9IHsKIAkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCiAJTlVMTCwKIH07CkBAIC0yODQsOSArMjg0LDkgQEAKIAogCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KIAlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8Ci0JCShjLT54ODYgIT0gNCkgfHwgKGMtPng4Nl9tb2RlbCE9MTApKSB7CisJCShjLT54ODYgIT0gNCkgfHwgKGMtPng4Nl9tb2RlbCAhPSAxMCkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZWxhbmZyZXE6IGVycm9yOiBubyBFbGFuIHByb2Nlc3NvciBmb3VuZCFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZlbGFuZnJlcV9kcml2ZXIpOwogfQpAQCAtMjk4LDcgKzI5OCw3IEBACiB9CiAKIAotbW9kdWxlX3BhcmFtIChtYXhfZnJlcSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShtYXhfZnJlcSwgaW50LCAwNDQ0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPiwgU3ZlbiBHZWdndXMgPHN2ZW5AZ2VnZ3VzLm5ldD4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKaW5kZXggZjE2ODVmYi4uYjhlMDVlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCX0KIAogCWlmIChjLT54ODYgIT0gMHhGKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGNwdWZyZXFAbGlzdHMubGludXgub3JnLnVrPlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGNwdWZyZXFAdmdlci5rZXJuZWwub3JnPlxuIik7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwppbmRleCBlYjliNjJiLi5iNWNlZDgwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpAQCAtMTUsMTIgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL21zci5oPgotI2luY2x1ZGUgPGFzbS90aW1leC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotCi0jZGVmaW5lIFBPV0VSTk9XX0lPUE9SVCAweGZmZjAgICAgICAgICAvKiBpdCBkb2Vzbid0IG1hdHRlciB3aGVyZSwgYXMgbG9uZwotCQkJCQkgIGFzIGl0IGlzIHVudXNlZCAqLworI2RlZmluZSBQT1dFUk5PV19JT1BPUlQgMHhmZmYwICAgICAgICAgIC8qIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXJlLCBhcyBsb25nCisJCQkJCSAgIGFzIGl0IGlzIHVudXNlZCAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgYnVzZnJlcTsgICAvKiBGU0IsIGluIDEwIGtIeiAqLwogc3RhdGljIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgIG1heF9tdWx0aXBsaWVyOwpAQCAtNTMsNyArNTIsNyBAQAogCiAJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOwogCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KLQlpbnZhbHVlPWlubChQT1dFUk5PV19JT1BPUlQgKyAweDgpOworCWludmFsdWUgPSBpbmwoUE9XRVJOT1dfSU9QT1JUICsgMHg4KTsKIAltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDA7CiAJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGRpc2FibGUgaXQgYWdhaW4gKi8KIApAQCAtNjcsOSArNjYsOSBAQAogICoKICAqICAgVHJpZXMgdG8gY2hhbmdlIHRoZSBQb3dlck5vdyEgbXVsdGlwbGllcgogICovCi1zdGF0aWMgdm9pZCBwb3dlcm5vd19rNl9zZXRfc3RhdGUgKHVuc2lnbmVkIGludCBiZXN0X2kpCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rNl9zZXRfc3RhdGUodW5zaWduZWQgaW50IGJlc3RfaSkKIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBvdXR2YWx1ZT0wLCBpbnZhbHVlPTA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgb3V0dmFsdWUgPSAwLCBpbnZhbHVlID0gMDsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgICBtc3J2YWw7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgZnJlcXM7CiAKQEAgLTkwLDEwICs4OSwxMCBAQAogCiAJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOwogCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KLQlpbnZhbHVlPWlubChQT1dFUk5PV19JT1BPUlQgKyAweDgpOworCWludmFsdWUgPSBpbmwoUE9XRVJOT1dfSU9QT1JUICsgMHg4KTsKIAlpbnZhbHVlID0gaW52YWx1ZSAmIDB4ZjsKIAlvdXR2YWx1ZSA9IG91dHZhbHVlIHwgaW52YWx1ZTsKLQlvdXRsKG91dHZhbHVlICwoUE9XRVJOT1dfSU9QT1JUICsgMHg4KSk7CisJb3V0bChvdXR2YWx1ZSAsIChQT1dFUk5PV19JT1BPUlQgKyAweDgpKTsKIAltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDA7CiAJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGRpc2FibGUgaXQgYWdhaW4gKi8KIApAQCAtMTI0LDcgKzEyMyw3IEBACiAgKgogICogc2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeQogICovCi1zdGF0aWMgaW50IHBvd2Vybm93X2s2X3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCitzdGF0aWMgaW50IHBvd2Vybm93X2s2X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewpAQCAtMTUyLDcgKzE1MSw3IEBACiAJYnVzZnJlcSA9IGNwdV9raHogLyBtYXhfbXVsdGlwbGllcjsKIAogCS8qIHRhYmxlIGluaXQgKi8KLQlmb3IgKGk9MDsgKGNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCWZvciAoaSA9IDA7IChjbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJaWYgKGNsb2NrX3JhdGlvW2ldLmluZGV4ID4gbWF4X211bHRpcGxpZXIpCiAJCQljbG9ja19yYXRpb1tpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CiAJCWVsc2UKQEAgLTE2NSw3ICsxNjQsNyBAQAogCiAJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGNsb2NrX3JhdGlvKTsKIAlpZiAocmVzdWx0KQotCQlyZXR1cm4gKHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CiAKIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihjbG9ja19yYXRpbywgcG9saWN5LT5jcHUpOwogCkBAIC0xNzYsOCArMTc1LDggQEAKIHN0YXRpYyBpbnQgcG93ZXJub3dfazZfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0JCWlmIChpPT1tYXhfbXVsdGlwbGllcikKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChpID09IG1heF9tdWx0aXBsaWVyKQogCQkJcG93ZXJub3dfazZfc2V0X3N0YXRlKGkpOwogCX0KIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CkBAIC0xODksNyArMTg4LDcgQEAKIAlyZXR1cm4gYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpOwogfQogCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogcG93ZXJub3dfazZfYXR0cltdID0geworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgKnBvd2Vybm93X2s2X2F0dHJbXSA9IHsKIAkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCiAJTlVMTCwKIH07CkBAIC0yMjcsNyArMjI2LDcgQEAKIAl9CiAKIAlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2s2X2RyaXZlcikpIHsKLQkJcmVsZWFzZV9yZWdpb24gKFBPV0VSTk9XX0lPUE9SVCwgMTYpOworCQlyZWxlYXNlX3JlZ2lvbihQT1dFUk5PV19JT1BPUlQsIDE2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDMsMTMgKzI0MiwxMyBAQAogc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93X2s2X2V4aXQodm9pZCkKIHsKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZwb3dlcm5vd19rNl9kcml2ZXIpOwotCXJlbGVhc2VfcmVnaW9uIChQT1dFUk5PV19JT1BPUlQsIDE2KTsKKwlyZWxlYXNlX3JlZ2lvbihQT1dFUk5PV19JT1BPUlQsIDE2KTsKIH0KIAogCi1NT0RVTEVfQVVUSE9SICgiQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+LCBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4sIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTiAoIlBvd2VyTm93ISBkcml2ZXIgZm9yIEFNRCBLNi0yKyAvIEs2LTMrIHByb2Nlc3NvcnMuIik7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+LCBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4sIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXJOb3chIGRyaXZlciBmb3IgQU1EIEs2LTIrIC8gSzYtMysgcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogbW9kdWxlX2luaXQocG93ZXJub3dfazZfaW5pdCk7CiBtb2R1bGVfZXhpdChwb3dlcm5vd19rNl9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwppbmRleCAxNWUxM2MwLi4zYjVmMDY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIAogI2RlZmluZSBQRlgJCSJzcGVlZHN0ZXAtY2VudHJpbm86ICIKLSNkZWZpbmUgTUFJTlRBSU5FUgkiY3B1ZnJlcUBsaXN0cy5saW51eC5vcmcudWsiCisjZGVmaW5lIE1BSU5UQUlORVIJImNwdWZyZXFAdmdlci5rZXJuZWwub3JnIgogCiAjZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCiAJY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJzcGVlZHN0ZXAtY2VudHJpbm8iLCBtc2cpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2N5cml4LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2N5cml4LmMKaW5kZXggZTcxMGEyMS4uZmZkMGY1ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jeXJpeC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3lyaXguYwpAQCAtMTUsMTMgKzE1LDExIEBACiAvKgogICogUmVhZCBOU0MvQ3lyaXggREVWSUQgcmVnaXN0ZXJzIChESVIpIHRvIGdldCBtb3JlIGRldGFpbGVkIGluZm8uIGFib3V0IHRoZSBDUFUKICAqLwotc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX2N5cml4X2RldmlkKHVuc2lnbmVkIGNoYXIgKmRpcjAsIHVuc2lnbmVkIGNoYXIgKmRpcjEpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgX19kb19jeXJpeF9kZXZpZCh1bnNpZ25lZCBjaGFyICpkaXIwLCB1bnNpZ25lZCBjaGFyICpkaXIxKQogewogCXVuc2lnbmVkIGNoYXIgY2NyMiwgY2NyMzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogd2UgdGVzdCBmb3IgREVWSUQgYnkgY2hlY2tpbmcgd2hldGhlciBDQ1IzIGlzIHdyaXRhYmxlICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CiAJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMgXiAweDgwKTsKIAlnZXRDeDg2KDB4YzApOyAgIC8qIGR1bW15IHRvIGNoYW5nZSBidXMgKi8KQEAgLTQ0LDkgKzQyLDE2IEBACiAJCSpkaXIwID0gZ2V0Q3g4NihDWDg2X0RJUjApOwogCQkqZGlyMSA9IGdldEN4ODYoQ1g4Nl9ESVIxKTsKIAl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZG9fY3lyaXhfZGV2aWQodW5zaWduZWQgY2hhciAqZGlyMCwgdW5zaWduZWQgY2hhciAqZGlyMSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fZG9fY3lyaXhfZGV2aWQoZGlyMCwgZGlyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQogLyoKICAqIEN4ODZfZGlyMF9tc2IgaXMgYSBIQUNLIG5lZWRlZCBieSBjaGVja19jeDY4Nl9jcHVpZC9zbG9wIGluIGJ1Z3MuaCBpbgogICogb3JkZXIgdG8gaWRlbnRpZnkgdGhlIEN5cml4IENQVSBtb2RlbCBhZnRlciB3ZSdyZSBvdXQgb2Ygc2V0dXAuYwpAQCAtMTE2LDcgKzEyMSw3IEBACiAJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOICovCiAKIAkvKiBMb2FkL1N0b3JlIFNlcmlhbGl6ZSB0byBtZW0gYWNjZXNzIGRpc2FibGUgKD1yZW9yZGVyIGl0KSAqLwotCXNldEN4ODYoQ1g4Nl9QQ1IwLCBnZXRDeDg2KENYODZfUENSMCkgJiB+MHg4MCk7CisJc2V0Q3g4Nl9vbGQoQ1g4Nl9QQ1IwLCBnZXRDeDg2X29sZChDWDg2X1BDUjApICYgfjB4ODApOwogCS8qIHNldCBsb2FkL3N0b3JlIHNlcmlhbGl6ZSBmcm9tIDFHQiB0byA0R0IgKi8KIAljY3IzIHw9IDB4ZTA7CiAJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwpAQCAtMTI3LDExICsxMzIsMTEgQEAKIAlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5LVdyaXRlLWJhY2sgbW9kZSBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CiAKIAkvKiBDQ1IyIGJpdCAyOiB1bmxvY2sgTlcgYml0ICovCi0Jc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSAmIH4weDA0KTsKKwlzZXRDeDg2X29sZChDWDg2X0NDUjIsIGdldEN4ODZfb2xkKENYODZfQ0NSMikgJiB+MHgwNCk7CiAJLyogc2V0ICdOb3QgV3JpdGUtdGhyb3VnaCcgKi8KIAl3cml0ZV9jcjAocmVhZF9jcjAoKSB8IFg4Nl9DUjBfTlcpOwogCS8qIENDUjIgYml0IDI6IGxvY2sgTlcgYml0IGFuZCBzZXQgV1QxICovCi0Jc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4MTQpOworCXNldEN4ODZfb2xkKENYODZfQ0NSMiwgZ2V0Q3g4Nl9vbGQoQ1g4Nl9DQ1IyKSB8IDB4MTQpOwogfQogCiAvKgpAQCAtMTQ1LDE0ICsxNTAsMTQgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKiBTdXNwZW5kIG9uIGhhbHQgcG93ZXIgc2F2aW5nIGFuZCBlbmFibGUgI1NVU1AgcGluICovCi0Jc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4ODgpOworCXNldEN4ODZfb2xkKENYODZfQ0NSMiwgZ2V0Q3g4Nl9vbGQoQ1g4Nl9DQ1IyKSB8IDB4ODgpOwogCiAJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKIAlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOwkvKiBlbmFibGUgTUFQRU4gKi8KIAogCiAJLyogRlBVIGZhc3QsIERURSBjYWNoZSwgTWVtIGJ5cGFzcyAqLwotCXNldEN4ODYoQ1g4Nl9DQ1I0LCBnZXRDeDg2KENYODZfQ0NSNCkgfCAweDM4KTsKKwlzZXRDeDg2X29sZChDWDg2X0NDUjQsIGdldEN4ODZfb2xkKENYODZfQ0NSNCkgfCAweDM4KTsKIAlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CQkJLyogZGlzYWJsZSBNQVBFTiAqLwogCiAJc2V0X2N4ODZfbWVtd2IoKTsKQEAgLTE2MSw2ICsxNjYsMjQgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2N5cml4KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjBfbXNuLCBkaXIxID0gMDsKKworCV9fZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKKwlkaXIwX21zbiA9IGRpcjAgPj4gNDsgLyogaWRlbnRpZmllcyBDUFUgImZhbWlseSIgICAqLworCisJc3dpdGNoIChkaXIwX21zbikgeworCWNhc2UgMzogLyogNng4Ni82eDg2TCAqLworCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSKTsKKwkJYnJlYWs7CisJY2FzZSA1OiAvKiA2eDg2TVgvTSBJSSAqLworCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KKwkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSKTsKKwkJYnJlYWs7CisJfQorfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CkBAIC0yNjgsNyArMjkxLDcgQEAKIAkJLyogR1htIHN1cHBvcnRzIGV4dGVuZGVkIGNwdWlkIGxldmVscyAnYWxhJyBBTUQgKi8KIAkJaWYgKGMtPmNwdWlkX2xldmVsID09IDIpIHsKIAkJCS8qIEVuYWJsZSBjeE1NWCBleHRlbnNpb25zIChHWDEgRGF0YXNoZWV0IDU0KSAqLwotCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KSB8IDEpOworCQkJc2V0Q3g4Nl9vbGQoQ1g4Nl9DQ1I3LCBnZXRDeDg2X29sZChDWDg2X0NDUjcpIHwgMSk7CiAKIAkJCS8qCiAJCQkgKiBHWG0gOiAweDMwIC4uLiAweDVmIEdYbSAgZGF0YXNoZWV0IDUxCkBAIC0yNzgsNyArMzAxLDYgQEAKIAkJCSAqLwogCQkJaWYgKCgweDMwIDw9IGRpcjEgJiYgZGlyMSA8PSAweDZmKSB8fCAoMHg4MCA8PSBkaXIxICYmIGRpcjEgPD0gMHg4ZikpCiAJCQkJZ2VvZGVfY29uZmlndXJlKCk7Ci0JCQlnZXRfbW9kZWxfbmFtZShjKTsgIC8qIGdldCBDUFUgbWFya2V0aW5nIG5hbWUgKi8KIAkJCXJldHVybjsKIAkJfSBlbHNlIHsgLyogTWVkaWFHWCAqLwogCQkJQ3g4Nl9jYlsyXSA9IChkaXIwX2xzbiAmIDEpID8gJzMnIDogJzQnOwpAQCAtMjkxLDcgKzMxMyw3IEBACiAJCWlmIChkaXIxID4gNykgewogCQkJZGlyMF9tc24rKzsgIC8qIE0gSUkgKi8KIAkJCS8qIEVuYWJsZSBNTVggZXh0ZW5zaW9ucyAoQXBwIG5vdGUgMTA4KSAqLwotCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKKwkJCXNldEN4ODZfb2xkKENYODZfQ0NSNywgZ2V0Q3g4Nl9vbGQoQ1g4Nl9DQ1I3KXwxKTsKIAkJfSBlbHNlIHsKIAkJCWMtPmNvbWFfYnVnID0gMTsgICAgICAvKiA2eDg2TVgsIGl0IGhhcyB0aGUgYnVnLiAqLwogCQl9CkBAIC00MDYsNyArNDI4LDcgQEAKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CiAJCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAgICAgICAvKiBlbmFibGUgTUFQRU4gICovCi0JCQlzZXRDeDg2KENYODZfQ0NSNCwgZ2V0Q3g4NihDWDg2X0NDUjQpIHwgMHg4MCk7ICAvKiBlbmFibGUgY3B1aWQgICovCisJCQlzZXRDeDg2X29sZChDWDg2X0NDUjQsIGdldEN4ODZfb2xkKENYODZfQ0NSNCkgfCAweDgwKTsgIC8qIGVuYWJsZSBjcHVpZCAgKi8KIAkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJfQpAQCAtNDE2LDE2ICs0MzgsMTkgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjeXJpeF9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CiAJLmNfdmVuZG9yCT0gIkN5cml4IiwKIAkuY19pZGVudAk9IHsgIkN5cml4SW5zdGVhZCIgfSwKKwkuY19lYXJseV9pbml0CT0gZWFybHlfaW5pdF9jeXJpeCwKIAkuY19pbml0CQk9IGluaXRfY3lyaXgsCiAJLmNfaWRlbnRpZnkJPSBjeXJpeF9pZGVudGlmeSwKKwkuY194ODZfdmVuZG9yCT0gWDg2X1ZFTkRPUl9DWVJJWCwKIH07CiAKLWNwdV92ZW5kb3JfZGV2X3JlZ2lzdGVyKFg4Nl9WRU5ET1JfQ1lSSVgsICZjeXJpeF9jcHVfZGV2KTsKK2NwdV9kZXZfcmVnaXN0ZXIoY3lyaXhfY3B1X2Rldik7CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJOU0MiLAogCS5jX2lkZW50CT0geyAiR2VvZGUgYnkgTlNDIiB9LAogCS5jX2luaXQJCT0gaW5pdF9uc2MsCisJLmNfeDg2X3ZlbmRvcgk9IFg4Nl9WRU5ET1JfTlNDLAogfTsKIAotY3B1X3ZlbmRvcl9kZXZfcmVnaXN0ZXIoWDg2X1ZFTkRPUl9OU0MsICZuc2NfY3B1X2Rldik7CitjcHVfZGV2X3JlZ2lzdGVyKG5zY19jcHVfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvZmVhdHVyZV9uYW1lcy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9mZWF0dXJlX25hbWVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2FkNGEuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9mZWF0dXJlX25hbWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogU3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgeDg2IGNhcGFiaWxpdHkgZmxhZ3MuCi0gKgotICogVGhpcyBmaWxlIG11c3Qgbm90IGNvbnRhaW4gYW55IGV4ZWN1dGFibGUgY29kZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KLQotLyoKLSAqIFRoZXNlIGZsYWcgYml0cyBtdXN0IG1hdGNoIHRoZSBkZWZpbml0aW9ucyBpbiA8YXNtL2NwdWZlYXR1cmUuaD4uCi0gKiBOVUxMIG1lYW5zIHRoaXMgYml0IGlzIHVuZGVmaW5lZCBvciByZXNlcnZlZDsgZWl0aGVyIHdheSBpdCBkb2Vzbid0Ci0gKiBoYXZlIG1lYW5pbmcgYXMgZmFyIGFzIExpbnV4IGlzIGNvbmNlcm5lZC4gIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudAotICogdG8gcmVhbGl6ZSB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIHRhYmxlIGFuZCBDUFVJRCAtLSBpZgotICogYXBwbGljYXRpb25zIHdhbnQgdG8gZ2V0IHRoZSByYXcgQ1BVSUQgZGF0YSwgdGhleSBzaG91bGQgYWNjZXNzCi0gKiAvZGV2L2NwdS88Y3B1X25yPi9jcHVpZCBpbnN0ZWFkLgotICovCi1jb25zdCBjaGFyICogY29uc3QgeDg2X2NhcF9mbGFnc1tOQ0FQSU5UUyozMl0gPSB7Ci0JLyogSW50ZWwtZGVmaW5lZCAqLwotCSJmcHUiLCAidm1lIiwgImRlIiwgInBzZSIsICJ0c2MiLCAibXNyIiwgInBhZSIsICJtY2UiLAotCSJjeDgiLCAiYXBpYyIsIE5VTEwsICJzZXAiLCAibXRyciIsICJwZ2UiLCAibWNhIiwgImNtb3YiLAotCSJwYXQiLCAicHNlMzYiLCAicG4iLCAiY2xmbHVzaCIsIE5VTEwsICJkdHMiLCAiYWNwaSIsICJtbXgiLAotCSJmeHNyIiwgInNzZSIsICJzc2UyIiwgInNzIiwgImh0IiwgInRtIiwgImlhNjQiLCAicGJlIiwKLQotCS8qIEFNRC1kZWZpbmVkICovCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQlOVUxMLCBOVUxMLCBOVUxMLCAic3lzY2FsbCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JTlVMTCwgTlVMTCwgTlVMTCwgIm1wIiwgIm54IiwgTlVMTCwgIm1teGV4dCIsIE5VTEwsCi0JTlVMTCwgImZ4c3Jfb3B0IiwgInBkcGUxZ2IiLCAicmR0c2NwIiwgTlVMTCwgImxtIiwKLQkiM2Rub3dleHQiLCAiM2Rub3ciLAotCi0JLyogVHJhbnNtZXRhLWRlZmluZWQgKi8KLQkicmVjb3ZlcnkiLCAibG9uZ3J1biIsIE5VTEwsICJscnRpIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQotCS8qIE90aGVyIChMaW51eC1kZWZpbmVkKSAqLwotCSJjeG1teCIsICJrNl9tdHJyIiwgImN5cml4X2FyciIsICJjZW50YXVyX21jciIsCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkiY29uc3RhbnRfdHNjIiwgInVwIiwgTlVMTCwgImFyY2hfcGVyZm1vbiIsCi0JInBlYnMiLCAiYnRzIiwgTlVMTCwgTlVMTCwKLQkicmVwX2dvb2QiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0KLQkvKiBJbnRlbC1kZWZpbmVkICgjMikgKi8KLQkicG5pIiwgTlVMTCwgTlVMTCwgIm1vbml0b3IiLCAiZHNfY3BsIiwgInZteCIsICJzbXgiLCAiZXN0IiwKLQkidG0yIiwgInNzc2UzIiwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAotCU5VTEwsIE5VTEwsICJkY2EiLCAic3NlNF8xIiwgInNzZTRfMiIsIE5VTEwsIE5VTEwsICJwb3BjbnQiLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0KLQkvKiBWSUEvQ3lyaXgvQ2VudGF1ci1kZWZpbmVkICovCi0JTlVMTCwgTlVMTCwgInJuZyIsICJybmdfZW4iLCBOVUxMLCBOVUxMLCAiYWNlIiwgImFjZV9lbiIsCi0JImFjZTIiLCAiYWNlMl9lbiIsICJwaGUiLCAicGhlX2VuIiwgInBtbSIsICJwbW1fZW4iLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQotCS8qIEFNRC1kZWZpbmVkICgjMikgKi8KLQkibGFoZl9sbSIsICJjbXBfbGVnYWN5IiwgInN2bSIsICJleHRhcGljIiwKLQkiY3I4X2xlZ2FjeSIsICJhYm0iLCAic3NlNGEiLCAibWlzYWxpZ25zc2UiLAotCSIzZG5vd3ByZWZldGNoIiwgIm9zdnciLCAiaWJzIiwgInNzZTUiLAotCSJza2luaXQiLCAid2R0IiwgTlVMTCwgTlVMTCwKLQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0KLQkvKiBBdXhpbGlhcnkgKExpbnV4LWRlZmluZWQpICovCi0JImlkYSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi19OwotCi1jb25zdCBjaGFyICpjb25zdCB4ODZfcG93ZXJfZmxhZ3NbMzJdID0gewotCSJ0cyIsCS8qIHRlbXBlcmF0dXJlIHNlbnNvciAqLwotCSJmaWQiLCAgLyogZnJlcXVlbmN5IGlkIGNvbnRyb2wgKi8KLQkidmlkIiwgIC8qIHZvbHRhZ2UgaWQgY29udHJvbCAqLwotCSJ0dHAiLCAgLyogdGhlcm1hbCB0cmlwICovCi0JInRtIiwKLQkic3RjIiwKLQkiMTAwbWh6c3RlcHMiLAotCSJod3BzdGF0ZSIsCi0JIiIsCS8qIHRzYyBpbnZhcmlhbnQgbWFwcGVkIHRvIGNvbnN0YW50X3RzYyAqLwotCQkvKiBub3RoaW5nICovCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCmluZGV4IGI3NWYyNTYuLjk5NDY4ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTE1LDYgKzE1LDExIEBACiAjaW5jbHVkZSA8YXNtL2RzLmg+CiAjaW5jbHVkZSA8YXNtL2J1Z3MuaD4KIAorI2lmZGVmIENPTkZJR19YODZfNjQKKyNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDxhc20vbnVtYV82NC5oPgorI2VuZGlmCisKICNpbmNsdWRlICJjcHUuaCIKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwpAQCAtMjMsMjMgKzI4LDIyIEBACiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkKLS8qCi0gKiBBbGlnbm1lbnQgYXQgd2hpY2ggbW92c2wgaXMgcHJlZmVycmVkIGZvciBidWxrIG1lbW9yeSBjb3BpZXMuCi0gKi8KLXN0cnVjdCBtb3ZzbF9tYXNrIG1vdnNsX21hc2sgX19yZWFkX21vc3RseTsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0JLyogTmV0YnVyc3QgcmVwb3J0cyA2NCBieXRlcyBjbGZsdXNoIHNpemUsIGJ1dCBkb2VzIElPIGluIDEyOCBieXRlcyAqLwotCWlmIChjLT54ODYgPT0gMTUgJiYgYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9PSA2NCkKLQkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDEyODsKIAlpZiAoKGMtPng4NiA9PSAweGYgJiYgYy0+eDg2X21vZGVsID49IDB4MDMpIHx8CiAJCShjLT54ODYgPT0gMHg2ICYmIGMtPng4Nl9tb2RlbCA+PSAweDBlKSkKIAkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9TWVNFTlRFUjMyKTsKKyNlbHNlCisJLyogTmV0YnVyc3QgcmVwb3J0cyA2NCBieXRlcyBjbGZsdXNoIHNpemUsIGJ1dCBkb2VzIElPIGluIDEyOCBieXRlcyAqLworCWlmIChjLT54ODYgPT0gMTUgJiYgYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9PSA2NCkKKwkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDEyODsKKyNlbmRpZgogfQogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogLyoKICAqCUVhcmx5IHByb2JlIHN1cHBvcnQgbG9naWMgZm9yIHBwcm8gbWVtb3J5IGVycmF0dW0gIzUwCiAgKgpAQCAtNTksNDUgKzYzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKgotICogUDQgWGVvbiBlcnJhdGEgMDM3IHdvcmthcm91bmQuCi0gKiBIYXJkd2FyZSBwcmVmZXRjaGVyIG1heSBjYXVzZSBzdGFsZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYWNoZS4KLSAqLwotc3RhdGljIHZvaWQgX19jcHVpbml0IEludGVsX2VycmF0YV93b3JrYXJvdW5kcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JdW5zaWduZWQgbG9uZyBsbywgaGk7Ci0KLQlpZiAoKGMtPng4NiA9PSAxNSkgJiYgKGMtPng4Nl9tb2RlbCA9PSAxKSAmJiAoYy0+eDg2X21hc2sgPT0gMSkpIHsKLQkJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7Ci0JCWlmICgobG8gJiAoMTw8OSkpID09IDApIHsKLQkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IEMwIHN0ZXBwaW5nIFA0IFhlb24gZGV0ZWN0ZWQuXG4iKTsKLQkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IERpc2FibGluZyBoYXJkd2FyZSBwcmVmZXRjaGluZyAoRXJyYXRhIDAzNylcbiIpOwotCQkJbG8gfD0gKDE8PDkpOwkvKiBEaXNhYmxlIGh3IHByZWZldGNoaW5nICovCi0JCQl3cm1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvLCBoaSk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLSAqIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIG9uIHRoZSBkaWUKLSAqLwotc3RhdGljIGludCBfX2NwdWluaXQgbnVtX2NwdV9jb3JlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCi17Ci0JdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKLQotCWlmIChjLT5jcHVpZF9sZXZlbCA8IDQpCi0JCXJldHVybiAxOwotCi0JLyogSW50ZWwgaGFzIGEgbm9uLXN0YW5kYXJkIGRlcGVuZGVuY3kgb24gJWVjeCBmb3IgdGhpcyBDUFVJRCBsZXZlbC4gKi8KLQljcHVpZF9jb3VudCg0LCAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQlpZiAoZWF4ICYgMHgxZikKLQkJcmV0dXJuICgoZWF4ID4+IDI2KSArIDEpOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KICNpZmRlZiBDT05GSUdfWDg2X0YwMEZfQlVHCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgdHJhcF9pbml0X2YwMGZfYnVnKHZvaWQpCiB7CkBAIC0xMTIsMTIgKzc3LDkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW50ZWxfd29ya2Fyb3VuZHMoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXVuc2lnbmVkIGludCBsMiA9IDA7Ci0JY2hhciAqcCA9IE5VTEw7Ci0KLQllYXJseV9pbml0X2ludGVsKGMpOworCXVuc2lnbmVkIGxvbmcgbG8sIGhpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRwogCS8qCkBAIC0xMzgsNiArMTAwLDE0OCBAQAogCX0KICNlbmRpZgogCisJLyoKKwkgKiBTRVAgQ1BVSUQgYnVnOiBQZW50aXVtIFBybyByZXBvcnRzIFNFUCBidXQgZG9lc24ndCBoYXZlIGl0IHVudGlsCisJICogbW9kZWwgMyBtYXNrIDMKKwkgKi8KKwlpZiAoKGMtPng4Njw8OCB8IGMtPng4Nl9tb2RlbDw8NCB8IGMtPng4Nl9tYXNrKSA8IDB4NjMzKQorCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1NFUCk7CisKKwkvKgorCSAqIFA0IFhlb24gZXJyYXRhIDAzNyB3b3JrYXJvdW5kLgorCSAqIEhhcmR3YXJlIHByZWZldGNoZXIgbWF5IGNhdXNlIHN0YWxlIGRhdGEgdG8gYmUgbG9hZGVkIGludG8gdGhlIGNhY2hlLgorCSAqLworCWlmICgoYy0+eDg2ID09IDE1KSAmJiAoYy0+eDg2X21vZGVsID09IDEpICYmIChjLT54ODZfbWFzayA9PSAxKSkgeworCQlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbG8sIGhpKTsKKwkJaWYgKChsbyAmICgxPDw5KSkgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogQzAgc3RlcHBpbmcgUDQgWGVvbiBkZXRlY3RlZC5cbiIpOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogRGlzYWJsaW5nIGhhcmR3YXJlIHByZWZldGNoaW5nIChFcnJhdGEgMDM3KVxuIik7CisJCQlsbyB8PSAoMTw8OSk7CS8qIERpc2FibGUgaHcgcHJlZmV0Y2hpbmcgKi8KKwkJCXdybXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbG8sIGhpKTsKKwkJfQorCX0KKworCS8qCisJICogU2VlIGlmIHdlIGhhdmUgYSBnb29kIGxvY2FsIEFQSUMgYnkgY2hlY2tpbmcgZm9yIGJ1Z2d5IFBlbnRpYSwKKwkgKiBpLmUuIGFsbCBCIHN0ZXBwaW5ncyBhbmQgdGhlIEMyIHN0ZXBwaW5nIG9mIFA1NEMgd2hlbiB1c2luZyB0aGVpcgorCSAqIGludGVncmF0ZWQgQVBJQyAoc2VlIDExQVAgZXJyYXR1bSBpbiAiUGVudGl1bSBQcm9jZXNzb3IKKwkgKiBTcGVjaWZpY2F0aW9uIFVwZGF0ZSIpLgorCSAqLworCWlmIChjcHVfaGFzX2FwaWMgJiYgKGMtPng4Njw8OCB8IGMtPng4Nl9tb2RlbDw8NCkgPT0gMHg1MjAgJiYKKwkgICAgKGMtPng4Nl9tYXNrIDwgMHg2IHx8IGMtPng4Nl9tYXNrID09IDB4YikpCisJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFXzExQVApOworCisKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisJLyoKKwkgKiBTZXQgdXAgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgZm9yIG1vdnNsIGJ1bGsgbWVtb3J5IG1vdmVzCisJICovCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDQ6CQkvKiA0ODY6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNToJCS8qIE9sZCBQZW50aWE6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNjoJCS8qIFBJSS9QSUlJIG9ubHkgbGlrZSBtb3ZzbCB3aXRoIDgtYnl0ZSBhbGlnbm1lbnQgKi8KKwkJbW92c2xfbWFzay5tYXNrID0gNzsKKwkJYnJlYWs7CisJY2FzZSAxNToJLyogUDQgaXMgT0sgZG93biB0byA4LWJ5dGUgYWxpZ25tZW50ICovCisJCW1vdnNsX21hc2subWFzayA9IDc7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQorCW51bWFxX3RzY19kaXNhYmxlKCk7CisjZW5kaWYKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW50ZWxfd29ya2Fyb3VuZHMoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcmF0X2RldGVjdF9ub2RlKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCXVuc2lnbmVkIG5vZGU7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgYXBpY2lkID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBEb24ndCBkbyB0aGUgZnVua3kgZmFsbGJhY2sgaGV1cmlzdGljcyB0aGUgQU1EIHZlcnNpb24gZW1wbG95cworCSAgIGZvciBub3cuICovCisJbm9kZSA9IGFwaWNpZF90b19ub2RlW2FwaWNpZF07CisJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFIHx8ICFub2RlX29ubGluZShub2RlKSkKKwkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKKwludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQvJXggLT4gTm9kZSAlZFxuIiwgY3B1LCBhcGljaWQsIG5vZGUpOworI2VuZGlmCit9CisKKy8qCisgKiBmaW5kIG91dCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvciBjb3JlcyBvbiB0aGUgZGllCisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0IGludGVsX251bV9jcHVfY29yZXMoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPCA0KQorCQlyZXR1cm4gMTsKKworCS8qIEludGVsIGhhcyBhIG5vbi1zdGFuZGFyZCBkZXBlbmRlbmN5IG9uICVlY3ggZm9yIHRoaXMgQ1BVSUQgbGV2ZWwuICovCisJY3B1aWRfY291bnQoNCwgMCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJaWYgKGVheCAmIDB4MWYpCisJCXJldHVybiAoKGVheCA+PiAyNikgKyAxKTsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZGV0ZWN0X3ZteF92aXJ0Y2FwKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwkvKiBJbnRlbCBWTVggTVNSIGluZGljYXRlZCBmZWF0dXJlcyAqLworI2RlZmluZSBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTX1RQUl9TSEFET1cJMHgwMDIwMDAwMAorI2RlZmluZSBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTX1ZOTUkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgWDg2X1ZNWF9GRUFUVVJFX1BST0NfQ1RMU18yTkRfQ1RMUwkweDgwMDAwMDAwCisjZGVmaW5lIFg4Nl9WTVhfRkVBVFVSRV9QUk9DX0NUTFMyX1ZJUlRfQVBJQwkweDAwMDAwMDAxCisjZGVmaW5lIFg4Nl9WTVhfRkVBVFVSRV9QUk9DX0NUTFMyX0VQVAkJMHgwMDAwMDAwMgorI2RlZmluZSBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTMl9WUElECQkweDAwMDAwMDIwCisKKwl1MzIgdm14X21zcl9sb3csIHZteF9tc3JfaGlnaCwgbXNyX2N0bCwgbXNyX2N0bDI7CisKKwljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1RQUl9TSEFET1cpOworCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfVk5NSSk7CisJY2xlYXJfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9GTEVYUFJJT1JJVFkpOworCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfRVBUKTsKKwljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1ZQSUQpOworCisJcmRtc3IoTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTLCB2bXhfbXNyX2xvdywgdm14X21zcl9oaWdoKTsKKwltc3JfY3RsID0gdm14X21zcl9oaWdoIHwgdm14X21zcl9sb3c7CisJaWYgKG1zcl9jdGwgJiBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTX1RQUl9TSEFET1cpCisJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1RQUl9TSEFET1cpOworCWlmIChtc3JfY3RsICYgWDg2X1ZNWF9GRUFUVVJFX1BST0NfQ1RMU19WTk1JKQorCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9WTk1JKTsKKwlpZiAobXNyX2N0bCAmIFg4Nl9WTVhfRkVBVFVSRV9QUk9DX0NUTFNfMk5EX0NUTFMpIHsKKwkJcmRtc3IoTVNSX0lBMzJfVk1YX1BST0NCQVNFRF9DVExTMiwKKwkJICAgICAgdm14X21zcl9sb3csIHZteF9tc3JfaGlnaCk7CisJCW1zcl9jdGwyID0gdm14X21zcl9oaWdoIHwgdm14X21zcl9sb3c7CisJCWlmICgobXNyX2N0bDIgJiBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTMl9WSVJUX0FQSUMpICYmCisJCSAgICAobXNyX2N0bCAmIFg4Nl9WTVhfRkVBVFVSRV9QUk9DX0NUTFNfVFBSX1NIQURPVykpCisJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9GTEVYUFJJT1JJVFkpOworCQlpZiAobXNyX2N0bDIgJiBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTMl9FUFQpCisJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9FUFQpOworCQlpZiAobXNyX2N0bDIgJiBYODZfVk1YX0ZFQVRVUkVfUFJPQ19DVExTMl9WUElEKQorCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfVlBJRCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgaW50IGwyID0gMDsKKworCWVhcmx5X2luaXRfaW50ZWwoYyk7CisKKwlpbnRlbF93b3JrYXJvdW5kcyhjKTsKKwogCWwyID0gaW5pdF9pbnRlbF9jYWNoZWluZm8oYyk7CiAJaWYgKGMtPmNwdWlkX2xldmVsID4gOSkgewogCQl1bnNpZ25lZCBlYXggPSBjcHVpZF9lYXgoMTApOwpAQCAtMTQ2LDE2ICsyNTAsMzIgQEAKIAkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTik7CiAJfQogCi0JLyogU0VQIENQVUlEIGJ1ZzogUGVudGl1bSBQcm8gcmVwb3J0cyBTRVAgYnV0IGRvZXNuJ3QgaGF2ZSBpdCB1bnRpbCBtb2RlbCAzIG1hc2sgMyAqLwotCWlmICgoYy0+eDg2PDw4IHwgYy0+eDg2X21vZGVsPDw0IHwgYy0+eDg2X21hc2spIDwgMHg2MzMpCi0JCWNsZWFyX2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfU0VQKTsKKwlpZiAoY3B1X2hhc194bW0yKQorCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9MRkVOQ0VfUkRUU0MpOworCWlmIChjcHVfaGFzX2RzKSB7CisJCXVuc2lnbmVkIGludCBsMTsKKwkJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwxLCBsMik7CisJCWlmICghKGwxICYgKDE8PDExKSkpCisJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9CVFMpOworCQlpZiAoIShsMSAmICgxPDwxMikpKQorCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUEVCUyk7CisJCWRzX2luaXRfaW50ZWwoYyk7CisJfQogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCWlmIChjLT54ODYgPT0gMTUpCisJCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSBjLT54ODZfY2xmbHVzaF9zaXplICogMjsKKwlpZiAoYy0+eDg2ID09IDYpCisJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JFUF9HT09EKTsKKyNlbHNlCiAJLyoKIAkgKiBOYW1lcyBmb3IgdGhlIFBlbnRpdW0gSUkvQ2VsZXJvbiBwcm9jZXNzb3JzCiAJICogZGV0ZWN0YWJsZSBvbmx5IGJ5IGFsc28gY2hlY2tpbmcgdGhlIGNhY2hlIHNpemUuCiAJICogRGl4b24gaXMgTk9UIGEgQ2VsZXJvbi4KIAkgKi8KIAlpZiAoYy0+eDg2ID09IDYpIHsKKwkJY2hhciAqcCA9IE5VTEw7CisKIAkJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKIAkJY2FzZSA1OgogCQkJaWYgKGMtPng4Nl9tYXNrID09IDApIHsKQEAgLTE3OCw3MCArMjk4LDQxIEBACiAJCQkJcCA9ICJDZWxlcm9uIChDb3BwZXJtaW5lKSI7CiAJCQlicmVhazsKIAkJfQorCisJCWlmIChwKQorCQkJc3RyY3B5KGMtPng4Nl9tb2RlbF9pZCwgcCk7CiAJfQogCi0JaWYgKHApCi0JCXN0cmNweShjLT54ODZfbW9kZWxfaWQsIHApOwotCi0JYy0+eDg2X21heF9jb3JlcyA9IG51bV9jcHVfY29yZXMoYyk7Ci0KLQlkZXRlY3RfaHQoYyk7Ci0KLQkvKiBXb3JrIGFyb3VuZCBlcnJhdGEgKi8KLQlJbnRlbF9lcnJhdGFfd29ya2Fyb3VuZHMoYyk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCi0JLyoKLQkgKiBTZXQgdXAgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgZm9yIG1vdnNsIGJ1bGsgbWVtb3J5IG1vdmVzCi0JICovCi0Jc3dpdGNoIChjLT54ODYpIHsKLQljYXNlIDQ6CQkvKiA0ODY6IHVudGVzdGVkICovCi0JCWJyZWFrOwotCWNhc2UgNToJCS8qIE9sZCBQZW50aWE6IHVudGVzdGVkICovCi0JCWJyZWFrOwotCWNhc2UgNjoJCS8qIFBJSS9QSUlJIG9ubHkgbGlrZSBtb3ZzbCB3aXRoIDgtYnl0ZSBhbGlnbm1lbnQgKi8KLQkJbW92c2xfbWFzay5tYXNrID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSAxNToJLyogUDQgaXMgT0sgZG93biB0byA4LWJ5dGUgYWxpZ25tZW50ICovCi0JCW1vdnNsX21hc2subWFzayA9IDc7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgotCi0JaWYgKGNwdV9oYXNfeG1tMikKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKLQlpZiAoYy0+eDg2ID09IDE1KSB7CisJaWYgKGMtPng4NiA9PSAxNSkKIAkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUDQpOwotCX0KIAlpZiAoYy0+eDg2ID09IDYpCiAJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1AzKTsKLQlpZiAoY3B1X2hhc19kcykgewotCQl1bnNpZ25lZCBpbnQgbDE7Ci0JCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsMSwgbDIpOwotCQlpZiAoIShsMSAmICgxPDwxMSkpKQotCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQlRTKTsKLQkJaWYgKCEobDEgJiAoMTw8MTIpKSkKLQkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BFQlMpOwotCX0KIAogCWlmIChjcHVfaGFzX2J0cykKLQkJZHNfaW5pdF9pbnRlbChjKTsKKwkJcHRyYWNlX2J0c19pbml0X2ludGVsKGMpOwogCi0JLyoKLQkgKiBTZWUgaWYgd2UgaGF2ZSBhIGdvb2QgbG9jYWwgQVBJQyBieSBjaGVja2luZyBmb3IgYnVnZ3kgUGVudGlhLAotCSAqIGkuZS4gYWxsIEIgc3RlcHBpbmdzIGFuZCB0aGUgQzIgc3RlcHBpbmcgb2YgUDU0QyB3aGVuIHVzaW5nIHRoZWlyCi0JICogaW50ZWdyYXRlZCBBUElDIChzZWUgMTFBUCBlcnJhdHVtIGluICJQZW50aXVtIFByb2Nlc3NvcgotCSAqIFNwZWNpZmljYXRpb24gVXBkYXRlIikuCi0JICovCi0JaWYgKGNwdV9oYXNfYXBpYyAmJiAoYy0+eDg2PDw4IHwgYy0+eDg2X21vZGVsPDw0KSA9PSAweDUyMCAmJgotCSAgICAoYy0+eDg2X21hc2sgPCAweDYgfHwgYy0+eDg2X21hc2sgPT0gMHhiKSkKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfMTFBUCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JbnVtYXFfdHNjX2Rpc2FibGUoKTsKICNlbmRpZgorCisJZGV0ZWN0X2V4dGVuZGVkX3RvcG9sb2d5KGMpOworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9YVE9QT0xPR1kpKSB7CisJCS8qCisJCSAqIGxldCdzIHVzZSB0aGUgbGVnYWN5IGNwdWlkIHZlY3RvciAweDEgYW5kIDB4NCBmb3IgdG9wb2xvZ3kKKwkJICogZGV0ZWN0aW9uLgorCQkgKi8KKwkJYy0+eDg2X21heF9jb3JlcyA9IGludGVsX251bV9jcHVfY29yZXMoYyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCQlkZXRlY3RfaHQoYyk7CisjZW5kaWYKKwl9CisKKwkvKiBXb3JrIGFyb3VuZCBlcnJhdGEgKi8KKwlzcmF0X2RldGVjdF9ub2RlKCk7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9WTVgpKQorCQlkZXRlY3Rfdm14X3ZpcnRjYXAoYyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1aW5pdCBpbnRlbF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJLyoKQEAgLTI1NCwxMCArMzQ1LDEyIEBACiAJCXNpemUgPSAyNTY7CiAJcmV0dXJuIHNpemU7CiB9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjcHVfZGV2IGludGVsX2NwdV9kZXYgX19jcHVpbml0ZGF0YSA9IHsKIAkuY192ZW5kb3IJPSAiSW50ZWwiLAogCS5jX2lkZW50CT0geyAiR2VudWluZUludGVsIiB9LAorI2lmZGVmIENPTkZJR19YODZfMzIKIAkuY19tb2RlbHMgPSB7CiAJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSA0LCAubW9kZWxfbmFtZXMgPQogCQkgIHsKQEAgLTMwNyw3NiArNDAwLDEyIEBACiAJCSAgfQogCQl9LAogCX0sCisJLmNfc2l6ZV9jYWNoZQk9IGludGVsX3NpemVfY2FjaGUsCisjZW5kaWYKIAkuY19lYXJseV9pbml0ICAgPSBlYXJseV9pbml0X2ludGVsLAogCS5jX2luaXQJCT0gaW5pdF9pbnRlbCwKLQkuY19zaXplX2NhY2hlCT0gaW50ZWxfc2l6ZV9jYWNoZSwKKwkuY194ODZfdmVuZG9yCT0gWDg2X1ZFTkRPUl9JTlRFTCwKIH07CiAKLWNwdV92ZW5kb3JfZGV2X3JlZ2lzdGVyKFg4Nl9WRU5ET1JfSU5URUwsICZpbnRlbF9jcHVfZGV2KTsKLQotI2lmbmRlZiBDT05GSUdfWDg2X0NNUFhDSEcKLXVuc2lnbmVkIGxvbmcgY21weGNoZ18zODZfdTgodm9sYXRpbGUgdm9pZCAqcHRyLCB1OCBvbGQsIHU4IG5ldykKLXsKLQl1OCBwcmV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQb29yIG1hbidzIGNtcHhjaGcgZm9yIDM4Ni4gVW5zdWl0YWJsZSBmb3IgU01QICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXByZXYgPSAqKHU4ICopcHRyOwotCWlmIChwcmV2ID09IG9sZCkKLQkJKih1OCAqKXB0ciA9IG5ldzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHByZXY7Ci19Ci1FWFBPUlRfU1lNQk9MKGNtcHhjaGdfMzg2X3U4KTsKLQotdW5zaWduZWQgbG9uZyBjbXB4Y2hnXzM4Nl91MTYodm9sYXRpbGUgdm9pZCAqcHRyLCB1MTYgb2xkLCB1MTYgbmV3KQotewotCXUxNiBwcmV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQb29yIG1hbidzIGNtcHhjaGcgZm9yIDM4Ni4gVW5zdWl0YWJsZSBmb3IgU01QICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXByZXYgPSAqKHUxNiAqKXB0cjsKLQlpZiAocHJldiA9PSBvbGQpCi0JCSoodTE2ICopcHRyID0gbmV3OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcHJldjsKLX0KLUVYUE9SVF9TWU1CT0woY21weGNoZ18zODZfdTE2KTsKLQotdW5zaWduZWQgbG9uZyBjbXB4Y2hnXzM4Nl91MzIodm9sYXRpbGUgdm9pZCAqcHRyLCB1MzIgb2xkLCB1MzIgbmV3KQotewotCXUzMiBwcmV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQb29yIG1hbidzIGNtcHhjaGcgZm9yIDM4Ni4gVW5zdWl0YWJsZSBmb3IgU01QICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXByZXYgPSAqKHUzMiAqKXB0cjsKLQlpZiAocHJldiA9PSBvbGQpCi0JCSoodTMyICopcHRyID0gbmV3OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcHJldjsKLX0KLUVYUE9SVF9TWU1CT0woY21weGNoZ18zODZfdTMyKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19YODZfQ01QWENIRzY0Ci11bnNpZ25lZCBsb25nIGxvbmcgY21weGNoZ180ODZfdTY0KHZvbGF0aWxlIHZvaWQgKnB0ciwgdTY0IG9sZCwgdTY0IG5ldykKLXsKLQl1NjQgcHJldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogUG9vciBtYW4ncyBjbXB4Y2hnOGIgZm9yIDM4NiBhbmQgNDg2LiBVbnN1aXRhYmxlIGZvciBTTVAgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcHJldiA9ICoodTY0ICopcHRyOwotCWlmIChwcmV2ID09IG9sZCkKLQkJKih1NjQgKilwdHIgPSBuZXc7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBwcmV2OwotfQotRVhQT1JUX1NZTUJPTChjbXB4Y2hnXzQ4Nl91NjQpOwotI2VuZGlmCi0KLS8qIGFyY2hfaW5pdGNhbGwoaW50ZWxfY3B1X2luaXQpOyAqLworY3B1X2Rldl9yZWdpc3RlcihpbnRlbF9jcHVfZGV2KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF82NC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF82NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE5YzU4Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KLSNpbmNsdWRlIDxhc20vbnVtYV82NC5oPgotCi0jaW5jbHVkZSAiY3B1LmgiCi0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQlpZiAoKGMtPng4NiA9PSAweGYgJiYgYy0+eDg2X21vZGVsID49IDB4MDMpIHx8Ci0JICAgIChjLT54ODYgPT0gMHg2ICYmIGMtPng4Nl9tb2RlbCA+PSAweDBlKSkKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKLQotCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1NZU0VOVEVSMzIpOwotfQotCi0vKgotICogZmluZCBvdXQgdGhlIG51bWJlciBvZiBwcm9jZXNzb3IgY29yZXMgb24gdGhlIGRpZQotICovCi1zdGF0aWMgaW50IF9fY3B1aW5pdCBpbnRlbF9udW1fY3B1X2NvcmVzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQl1bnNpZ25lZCBpbnQgZWF4LCB0OwotCi0JaWYgKGMtPmNwdWlkX2xldmVsIDwgNCkKLQkJcmV0dXJuIDE7Ci0KLQljcHVpZF9jb3VudCg0LCAwLCAmZWF4LCAmdCwgJnQsICZ0KTsKLQotCWlmIChlYXggJiAweDFmKQotCQlyZXR1cm4gKChlYXggPj4gMjYpICsgMSk7Ci0JZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgX19jcHVpbml0IHNyYXRfZGV0ZWN0X25vZGUodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfTlVNQQotCXVuc2lnbmVkIG5vZGU7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgYXBpY2lkID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKiBEb24ndCBkbyB0aGUgZnVua3kgZmFsbGJhY2sgaGV1cmlzdGljcyB0aGUgQU1EIHZlcnNpb24gZW1wbG95cwotCSAgIGZvciBub3cuICovCi0Jbm9kZSA9IGFwaWNpZF90b19ub2RlW2FwaWNpZF07Ci0JaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFIHx8ICFub2RlX29ubGluZShub2RlKSkKLQkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKLQludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQvJXggLT4gTm9kZSAlZFxuIiwgY3B1LCBhcGljaWQsIG5vZGUpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQlpbml0X2ludGVsX2NhY2hlaW5mbyhjKTsKLQlpZiAoYy0+Y3B1aWRfbGV2ZWwgPiA5KSB7Ci0JCXVuc2lnbmVkIGVheCA9IGNwdWlkX2VheCgxMCk7Ci0JCS8qIENoZWNrIGZvciB2ZXJzaW9uIGFuZCB0aGUgbnVtYmVyIG9mIGNvdW50ZXJzICovCi0JCWlmICgoZWF4ICYgMHhmZikgJiYgKCgoZWF4Pj44KSAmIDB4ZmYpID4gMSkpCi0JCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pOwotCX0KLQotCWlmIChjcHVfaGFzX2RzKSB7Ci0JCXVuc2lnbmVkIGludCBsMSwgbDI7Ci0JCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsMSwgbDIpOwotCQlpZiAoIShsMSAmICgxPDwxMSkpKQotCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfQlRTKTsKLQkJaWYgKCEobDEgJiAoMTw8MTIpKSkKLQkJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BFQlMpOwotCX0KLQotCi0JaWYgKGNwdV9oYXNfYnRzKQotCQlkc19pbml0X2ludGVsKGMpOwotCi0JaWYgKGMtPng4NiA9PSAxNSkKLQkJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IGMtPng4Nl9jbGZsdXNoX3NpemUgKiAyOwotCWlmIChjLT54ODYgPT0gNikKLQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfUkVQX0dPT0QpOwotCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyk7Ci0JYy0+eDg2X21heF9jb3JlcyA9IGludGVsX251bV9jcHVfY29yZXMoYyk7Ci0KLQlzcmF0X2RldGVjdF9ub2RlKCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBpbnRlbF9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7Ci0JLmNfdmVuZG9yCT0gIkludGVsIiwKLQkuY19pZGVudAk9IHsgIkdlbnVpbmVJbnRlbCIgfSwKLQkuY19lYXJseV9pbml0ICAgPSBlYXJseV9pbml0X2ludGVsLAotCS5jX2luaXQJCT0gaW5pdF9pbnRlbCwKLX07Ci1jcHVfdmVuZG9yX2Rldl9yZWdpc3RlcihYODZfVkVORE9SX0lOVEVMLCAmaW50ZWxfY3B1X2Rldik7Ci0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IDZiMGExMGIuLjNmNDZhZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwpAQCAtMSw4ICsxLDggQEAKIC8qCi0gKiAgICAgIFJvdXRpbmVzIHRvIGluZGVudGlmeSBjYWNoZXMgb24gSW50ZWwgQ1BVLgorICoJUm91dGluZXMgdG8gaW5kZW50aWZ5IGNhY2hlcyBvbiBJbnRlbCBDUFUuCiAgKgotICogICAgICBDaGFuZ2VzOgotICogICAgICBWZW5rYXRlc2ggUGFsbGlwYWRpCTogQWRkaW5nIGNhY2hlIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggY3B1aWQoNCkKKyAqCUNoYW5nZXM6CisgKglWZW5rYXRlc2ggUGFsbGlwYWRpCTogQWRkaW5nIGNhY2hlIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggY3B1aWQoNCkKICAqCQlBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+OiBXb3JrIHdpdGggQ1BVIGhvdHBsdWcgaW5mcmFzdHJ1Y3R1cmUuCiAgKglBbmRpIEtsZWVuIC8gQW5kcmVhcyBIZXJybWFubgk6IENQVUlENCBlbXVsYXRpb24gb24gQU1ELgogICovCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTEzMCw5ICsxMzEsMTggQEAKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IGVieDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IGVjeDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBjYW5fZGlzYWJsZTsKIAljcHVtYXNrX3Qgc2hhcmVkX2NwdV9tYXA7CS8qIGZ1dHVyZT86IG9ubHkgY3B1cy9ub2RlIGlzIG5lZWRlZCAqLwogfTsKIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrOF9uYl9pZFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMjAzKSB9LAorCXt9Cit9OworI2VuZGlmCisKIHVuc2lnbmVkIHNob3J0CQkJbnVtX2NhY2hlX2xlYXZlczsKIAogLyogQU1EIGRvZXNuJ3QgaGF2ZSBDUFVJRDQuIEVtdWxhdGUgaXQgaGVyZSB0byByZXBvcnQgdGhlIHNhbWUKQEAgLTE4Miw5ICsxOTIsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxldmVsc1tdIF9fY3B1aW5pdGRhdGEgPSB7IDEsIDEsIDIsIDMgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHR5cGVzW10gX19jcHVpbml0ZGF0YSA9IHsgMSwgMiwgMywgMyB9OwogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgYW1kX2NwdWlkNChpbnQgbGVhZiwgdW5pb24gX2NwdWlkNF9sZWFmX2VheCAqZWF4LAotCQkgICAgICAgdW5pb24gX2NwdWlkNF9sZWFmX2VieCAqZWJ4LAotCQkgICAgICAgdW5pb24gX2NwdWlkNF9sZWFmX2VjeCAqZWN4KQorc3RhdGljIHZvaWQgX19jcHVpbml0CithbWRfY3B1aWQ0KGludCBsZWFmLCB1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4ICplYXgsCisJCSAgICAgdW5pb24gX2NwdWlkNF9sZWFmX2VieCAqZWJ4LAorCQkgICAgIHVuaW9uIF9jcHVpZDRfbGVhZl9lY3ggKmVjeCkKIHsKIAl1bnNpZ25lZCBkdW1teTsKIAl1bnNpZ25lZCBsaW5lX3NpemUsIGxpbmVzX3Blcl90YWcsIGFzc29jLCBzaXplX2luX2tiOwpAQCAtMjUxLDI3ICsyNjIsNDAgQEAKIAkJKGVieC0+c3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ICsgMSkgLSAxOwogfQogCi1zdGF0aWMgaW50IF9fY3B1aW5pdCBjcHVpZDRfY2FjaGVfbG9va3VwKGludCBpbmRleCwgc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmKQorc3RhdGljIHZvaWQgX19jcHVpbml0CithbWRfY2hlY2tfbDNfZGlzYWJsZShpbnQgaW5kZXgsIHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZikKK3sKKwlpZiAoaW5kZXggPCAzKQorCQlyZXR1cm47CisJdGhpc19sZWFmLT5jYW5fZGlzYWJsZSA9IDE7Cit9CisKK3N0YXRpYyBpbnQKK19fY3B1aW5pdCBjcHVpZDRfY2FjaGVfbG9va3VwKGludCBpbmRleCwgc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmKQogewogCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXggCWVheDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IAllYng7CiAJdW5pb24gX2NwdWlkNF9sZWFmX2VjeCAJZWN4OwogCXVuc2lnbmVkCQllZHg7CiAKLQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQorCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpIHsKIAkJYW1kX2NwdWlkNChpbmRleCwgJmVheCwgJmVieCwgJmVjeCk7Ci0JZWxzZQotCQljcHVpZF9jb3VudCg0LCBpbmRleCwgJmVheC5mdWxsLCAmZWJ4LmZ1bGwsICZlY3guZnVsbCwgICZlZHgpOworCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCkKKwkJCWFtZF9jaGVja19sM19kaXNhYmxlKGluZGV4LCB0aGlzX2xlYWYpOworCX0gZWxzZSB7CisJCWNwdWlkX2NvdW50KDQsIGluZGV4LCAmZWF4LmZ1bGwsICZlYnguZnVsbCwgJmVjeC5mdWxsLCAmZWR4KTsKKwl9CisKIAlpZiAoZWF4LnNwbGl0LnR5cGUgPT0gQ0FDSEVfVFlQRV9OVUxMKQogCQlyZXR1cm4gLUVJTzsgLyogYmV0dGVyIGVycm9yID8gKi8KIAogCXRoaXNfbGVhZi0+ZWF4ID0gZWF4OwogCXRoaXNfbGVhZi0+ZWJ4ID0gZWJ4OwogCXRoaXNfbGVhZi0+ZWN4ID0gZWN4OwotCXRoaXNfbGVhZi0+c2l6ZSA9IChlY3guc3BsaXQubnVtYmVyX29mX3NldHMgKyAxKSAqCi0JCShlYnguc3BsaXQuY29oZXJlbmN5X2xpbmVfc2l6ZSArIDEpICoKLQkJKGVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiArIDEpICoKLQkJKGVieC5zcGxpdC53YXlzX29mX2Fzc29jaWF0aXZpdHkgKyAxKTsKKwl0aGlzX2xlYWYtPnNpemUgPSAoZWN4LnNwbGl0Lm51bWJlcl9vZl9zZXRzICAgICAgICAgICsgMSkgKgorCQkJICAoZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgICAgICsgMSkgKgorCQkJICAoZWJ4LnNwbGl0LnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uICsgMSkgKgorCQkJICAoZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSAgICsgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1Myw3ICs0NzcsNyBAQAogCiAvKiBwb2ludGVyIHRvIF9jcHVpZDRfaW5mbyBhcnJheSAoZm9yIGVhY2ggY2FjaGUgbGVhZikgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGNwdWlkNF9pbmZvKTsKLSNkZWZpbmUgQ1BVSUQ0X0lORk9fSURYKHgsIHkpICAgICgmKChwZXJfY3B1KGNwdWlkNF9pbmZvLCB4KSlbeV0pKQorI2RlZmluZSBDUFVJRDRfSU5GT19JRFgoeCwgeSkJKCYoKHBlcl9jcHUoY3B1aWQ0X2luZm8sIHgpKVt5XSkpCiAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4KQpAQCAtNDkwLDcgKzUxNCw3IEBACiAKIAl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpbmRleCk7CiAJZm9yX2VhY2hfY3B1X21hc2tfbnIoc2libGluZywgdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCkgewotCQlzaWJsaW5nX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoc2libGluZywgaW5kZXgpOwkKKwkJc2libGluZ19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKHNpYmxpbmcsIGluZGV4KTsKIAkJY3B1X2NsZWFyKGNwdSwgc2libGluZ19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CiAJfQogfQpAQCAtNTcyLDcgKzU5Niw3IEBACiAKIC8qIHBvaW50ZXIgdG8gYXJyYXkgb2Yga29iamVjdHMgZm9yIGNwdVgvY2FjaGUvaW5kZXhZICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IF9pbmRleF9rb2JqZWN0ICosIGluZGV4X2tvYmplY3QpOwotI2RlZmluZSBJTkRFWF9LT0JKRUNUX1BUUih4LCB5KSAgICAoJigocGVyX2NwdShpbmRleF9rb2JqZWN0LCB4KSlbeV0pKQorI2RlZmluZSBJTkRFWF9LT0JKRUNUX1BUUih4LCB5KQkJKCYoKHBlcl9jcHUoaW5kZXhfa29iamVjdCwgeCkpW3ldKSkKIAogI2RlZmluZSBzaG93X29uZV9wbHVzKGZpbGVfbmFtZSwgb2JqZWN0LCB2YWwpCQkJCVwKIHN0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWxlX25hbWUJCQkJCQlcCkBAIC02MzcsNiArNjYxLDk5IEBACiAJfQogfQogCisjZGVmaW5lIHRvX29iamVjdChrKQljb250YWluZXJfb2Yoaywgc3RydWN0IF9pbmRleF9rb2JqZWN0LCBrb2JqKQorI2RlZmluZSB0b19hdHRyKGEpCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgX2NhY2hlX2F0dHIsIGF0dHIpCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmdldF9rOF9ub3J0aGJyaWRnZShpbnQgbm9kZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gbm9kZTsgaSsrKSB7CisJCWRvIHsKKwkJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldik7CisJCQlpZiAoIWRldikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoIXBjaV9tYXRjaF9pZCgmazhfbmJfaWRbMF0sIGRldikpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZGV2OworfQorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZ2V0X2s4X25vcnRoYnJpZGdlKGludCBub2RlKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGZpcnN0X2NwdSh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJc3NpemVfdCByZXQgPSAwOworCWludCBpOworCisJaWYgKCF0aGlzX2xlYWYtPmNhbl9kaXNhYmxlKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJGZWF0dXJlIG5vdCBlbmFibGVkXG4iKTsKKworCWRldiA9IGdldF9rOF9ub3J0aGJyaWRnZShub2RlKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgIkF0dGVtcHRpbmcgQU1EIG5vcnRoYnJpZGdlIG9wZXJhdGlvbiBvbiBhIHN5c3RlbSB3aXRoIG5vIG5vcnRoYnJpZGdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgcmVnOworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgaSAqIDQsICZyZWcpOworCisJCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzRW50cnk6ICVkXG4iLCBidWYsIGkpOworCQlyZXQgKz0gc3ByaW50ZihidWYsICIlc1JlYWRzOiAgJXNcdE5ldyBFbnRyaWVzOiAlc1xuIiwgIAorCQkJYnVmLAorCQkJcmVnICYgMHg4MDAwMDAwMCA/ICJEaXNhYmxlZCIgOiAiQWxsb3dlZCIsCisJCQlyZWcgJiAweDQwMDAwMDAwID8gIkRpc2FibGVkIiA6ICJBbGxvd2VkIik7CisJCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzU3ViQ2FjaGU6ICV4XHRJbmRleDogJXhcbiIsCisJCQlidWYsIChyZWcgJiAweDMwMDAwKSA+PiAxNiwgcmVnICYgMHhmZmYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGZpcnN0X2NwdSh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHJldCwgaW5kZXgsIHZhbDsKKworCWlmICghdGhpc19sZWFmLT5jYW5fZGlzYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RybGVuKGJ1ZikgPiAxNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmaW5kZXgsICZ2YWwpOworCWlmIChyZXQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgfD0gMHhjMDAwMDAwMDsKKwlkZXYgPSBnZXRfazhfbm9ydGhicmlkZ2Uobm9kZSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdHRlbXB0aW5nIEFNRCBub3J0aGJyaWRnZSBvcGVyYXRpb24gb24gYSBzeXN0ZW0gd2l0aCBubyBub3J0aGJyaWRnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDFCQyArIGluZGV4ICogNCwgdmFsICYgfjB4NDAwMDAwMDApOworCXdiaW52ZCgpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDFCQyArIGluZGV4ICogNCwgdmFsKTsKKworCXJldHVybiAxOworfQorCiBzdHJ1Y3QgX2NhY2hlX2F0dHIgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjaGFyICopOwpAQCAtNjU3LDYgKzc3NCw4IEBACiBkZWZpbmVfb25lX3JvKHNoYXJlZF9jcHVfbWFwKTsKIGRlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9saXN0KTsKIAorc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBjYWNoZV9kaXNhYmxlID0gX19BVFRSKGNhY2hlX2Rpc2FibGUsIDA2NDQsIHNob3dfY2FjaGVfZGlzYWJsZSwgc3RvcmVfY2FjaGVfZGlzYWJsZSk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogZGVmYXVsdF9hdHRyc1tdID0gewogCSZ0eXBlLmF0dHIsCiAJJmxldmVsLmF0dHIsCkBAIC02NjcsMTIgKzc4NiwxMCBAQAogCSZzaXplLmF0dHIsCiAJJnNoYXJlZF9jcHVfbWFwLmF0dHIsCiAJJnNoYXJlZF9jcHVfbGlzdC5hdHRyLAorCSZjYWNoZV9kaXNhYmxlLmF0dHIsCiAJTlVMTAogfTsKIAotI2RlZmluZSB0b19vYmplY3QoaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBfaW5kZXhfa29iamVjdCwga29iaikKLSNkZWZpbmUgdG9fYXR0cihhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IF9jYWNoZV9hdHRyLCBhdHRyKQotCiBzdGF0aWMgc3NpemVfdCBzaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCiB7CiAJc3RydWN0IF9jYWNoZV9hdHRyICpmYXR0ciA9IHRvX2F0dHIoYXR0cik7CkBAIC02ODIsMTQgKzc5OSwyMiBAQAogCXJldCA9IGZhdHRyLT5zaG93ID8KIAkJZmF0dHItPnNob3coQ1BVSUQ0X0lORk9fSURYKHRoaXNfbGVhZi0+Y3B1LCB0aGlzX2xlYWYtPmluZGV4KSwKIAkJCWJ1ZikgOgotCSAgICAgICAJMDsKKwkJMDsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLAogCQkgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKIHsKLQlyZXR1cm4gMDsKKwlzdHJ1Y3QgX2NhY2hlX2F0dHIgKmZhdHRyID0gdG9fYXR0cihhdHRyKTsKKwlzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKnRoaXNfbGVhZiA9IHRvX29iamVjdChrb2JqKTsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IGZhdHRyLT5zdG9yZSA/CisJCWZhdHRyLT5zdG9yZShDUFVJRDRfSU5GT19JRFgodGhpc19sZWFmLT5jcHUsIHRoaXNfbGVhZi0+aW5kZXgpLAorCQkJYnVmLCBjb3VudCkgOgorCQkwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHN5c2ZzX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV82NC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlXzY0LmMKaW5kZXggNzI2YTVmYy4uNGIwMzFhNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlXzY0LmMKQEAgLTg2MCw3ICs4NjAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIG1jZV9yZW1vdmVfZGV2aWNlKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgX19jcHVpbml0IHZvaWQgbWNlX3JlbW92ZV9kZXZpY2UodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9ta2NhcGZsYWdzLnBsIGIvYXJjaC94ODYva2VybmVsL2NwdS9ta2NhcGZsYWdzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWEzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21rY2FwZmxhZ3MucGwKQEAgLTAsMCArMSwzMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIEdlbmVyYXRlIHRoZSB4ODZfY2FwX2ZsYWdzW10gYXJyYXkgZnJvbSBpbmNsdWRlL2FzbS14ODYvY3B1ZmVhdHVyZS5oCisjCisKKygkaW4sICRvdXQpID0gQEFSR1Y7CisKK29wZW4oSU4sICI8ICRpblwwIikgICBvciBkaWUgIiQwOiBjYW5ub3Qgb3BlbjogJGluOiAkIVxuIjsKK29wZW4oT1VULCAiPiAkb3V0XDAiKSBvciBkaWUgIiQwOiBjYW5ub3QgY3JlYXRlOiAkb3V0OiAkIVxuIjsKKworcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD5cblxuIjsKK3ByaW50IE9VVCAiY29uc3QgY2hhciAqIGNvbnN0IHg4Nl9jYXBfZmxhZ3NbTkNBUElOVFMqMzJdID0ge1xuIjsKKword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8SU4+KSkgeworCWlmICgkbGluZSA9fiAvXlxzKlwjXHMqZGVmaW5lXHMrKFg4Nl9GRUFUVVJFXyhcUyspKVxzKyguKikkLykgeworCQkkbWFjcm8gPSAkMTsKKwkJJGZlYXR1cmUgPSAkMjsKKwkJJHRhaWwgPSAkMzsKKwkJaWYgKCR0YWlsID1+IC9cL1wqXHMqXCIoW14iXSopXCIuKlwqXC8vKSB7CisJCQkkZmVhdHVyZSA9ICQxOworCQl9CisKKwkJaWYgKCRmZWF0dXJlIG5lICcnKSB7CisJCQlwcmludGYgT1VUICJcdCUtMzJzID0gXCIlc1wiLFxuIiwKKwkJCQkiWyRtYWNyb10iLCAiXEwkZmVhdHVyZSI7CisJCX0KKwl9Cit9CitwcmludCBPVVQgIn07XG4iOworCitjbG9zZShJTik7CitjbG9zZShPVVQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKaW5kZXggY2I3ZDNiNi4uNGU4ZDc3ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCkBAIC00MDEsMTIgKzQwMSw3IEBACiAJCXRtcCB8PSB+KCgxPDwoaGkgLSAxKSkgLSAxKTsKIAogCQlpZiAodG1wICE9IG1hc2tfbG8pIHsKLQkJCXN0YXRpYyBpbnQgb25jZSA9IDE7Ci0KLQkJCWlmIChvbmNlKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogeW91ciBCSU9TIGhhcyBzZXQgdXAgYW4gaW5jb3JyZWN0IG1hc2ssIGZpeGluZyBpdCB1cC5cbiIpOwotCQkJCW9uY2UgPSAwOwotCQkJfQorCQkJV0FSTl9PTkNFKDEsIEtFUk5fSU5GTyAibXRycjogeW91ciBCSU9TIGhhcyBzZXQgdXAgYW4gaW5jb3JyZWN0IG1hc2ssIGZpeGluZyBpdCB1cC5cbiIpOwogCQkJbWFza19sbyA9IHRtcDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9pZi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKaW5kZXggODRjNDgwYi4uNGM0MjE0NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMKQEAgLTQwNSw5ICs0MDUsOSBAQAogCQkJfQogCQkJLyogUkVELVBFTjogYmFzZSBjYW4gYmUgPiAzMmJpdCAqLyAKIAkJCWxlbiArPSBzZXFfcHJpbnRmKHNlcSwgCi0JCQkJICAgInJlZyUwMmk6IGJhc2U9MHglMDVseDAwMCAoJTRsdU1CKSwgc2l6ZT0lNGx1JWNCOiAlcywgY291bnQ9JWRcbiIsCisJCQkJICAgInJlZyUwMmk6IGJhc2U9MHglMDZseDAwMCAoJTVsdU1CKSwgc2l6ZT0lNWx1JWNCLCBjb3VudD0lZDogJXNcbiIsCiAJCQkgICAgIGksIGJhc2UsIGJhc2UgPj4gKDIwIC0gUEFHRV9TSElGVCksIHNpemUsIGZhY3RvciwKLQkJCSAgICAgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpLCBtdHJyX3VzYWdlX3RhYmxlW2ldKTsKKwkJCSAgICAgbXRycl91c2FnZV90YWJsZVtpXSwgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IGIxMTdkN2YuLmM3OGMwNDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtNzI5LDcgKzcyOSw3IEBACiAJbXRycl90eXBlIHR5cGU7CiB9OwogCi1zdHJ1Y3QgdmFyX210cnJfcmFuZ2Vfc3RhdGUgX19pbml0ZGF0YSByYW5nZV9zdGF0ZVtSQU5HRV9OVU1dOworc3RhdGljIHN0cnVjdCB2YXJfbXRycl9yYW5nZV9zdGF0ZSBfX2luaXRkYXRhIHJhbmdlX3N0YXRlW1JBTkdFX05VTV07CiBzdGF0aWMgaW50IF9faW5pdGRhdGEgZGVidWdfcHJpbnQ7CiAKIHN0YXRpYyBpbnQgX19pbml0CkBAIC03NTksNyArNzU5LDggQEAKIAkvKiB0YWtlIG91dCBVQyByYW5nZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykgewogCQl0eXBlID0gcmFuZ2Vfc3RhdGVbaV0udHlwZTsKLQkJaWYgKHR5cGUgIT0gTVRSUl9UWVBFX1VOQ0FDSEFCTEUpCisJCWlmICh0eXBlICE9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFICYmCisJCSAgICB0eXBlICE9IE1UUlJfVFlQRV9XUlBST1QpCiAJCQljb250aW51ZTsKIAkJc2l6ZSA9IHJhbmdlX3N0YXRlW2ldLnNpemVfcGZuOwogCQlpZiAoIXNpemUpCkBAIC04MzQsNyArODM1LDE0IEBACiAJCWVuYWJsZV9tdHJyX2NsZWFudXAgPSAxOwogCXJldHVybiAwOwogfQotZWFybHlfcGFyYW0oImVuYmxlX210cnJfY2xlYW51cCIsIGVuYWJsZV9tdHJyX2NsZWFudXBfc2V0dXApOworZWFybHlfcGFyYW0oImVuYWJsZV9tdHJyX2NsZWFudXAiLCBlbmFibGVfbXRycl9jbGVhbnVwX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgbXRycl9jbGVhbnVwX2RlYnVnX3NldHVwKGNoYXIgKnN0cikKK3sKKwlkZWJ1Z19wcmludCA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibXRycl9jbGVhbnVwX2RlYnVnIiwgbXRycl9jbGVhbnVwX2RlYnVnX3NldHVwKTsKIAogc3RydWN0IHZhcl9tdHJyX3N0YXRlIHsKIAl1bnNpZ25lZCBsb25nCXJhbmdlX3N0YXJ0azsKQEAgLTg5OCw2ICs5MDYsMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvX3NpemVfZmFjdG9yKHVuc2lnbmVkIGxvbmcgc2l6ZWssIGNoYXIgKmZhY3RvcnApCit7CisJY2hhciBmYWN0b3I7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gc2l6ZWs7CisKKwlpZiAoYmFzZSAmICgoMTw8MTApIC0gMSkpIHsKKwkJLyogbm90IE1CIGFsaWdubWVudCAqLworCQlmYWN0b3IgPSAnSyc7CisJfSBlbHNlIGlmIChiYXNlICYgKCgxPDwyMCkgLSAxKSl7CisJCWZhY3RvciA9ICdNJzsKKwkJYmFzZSA+Pj0gMTA7CisJfSBlbHNlIHsKKwkJZmFjdG9yID0gJ0cnOworCQliYXNlID4+PSAyMDsKKwl9CisKKwkqZmFjdG9ycCA9IGZhY3RvcjsKKworCXJldHVybiBiYXNlOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdAogcmFuZ2VfdG9fbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIHJhbmdlX3N0YXJ0aywKIAkgICAgICB1bnNpZ25lZCBsb25nIHJhbmdlX3NpemVrLCB1bnNpZ25lZCBjaGFyIHR5cGUpCkBAIC05MTksMTMgKzk0OCwyMSBAQAogCQkJYWxpZ24gPSBtYXhfYWxpZ247CiAKIAkJc2l6ZWsgPSAxIDw8IGFsaWduOwotCQlpZiAoZGVidWdfcHJpbnQpCisJCWlmIChkZWJ1Z19wcmludCkgeworCQkJY2hhciBzdGFydF9mYWN0b3IgPSAnSycsIHNpemVfZmFjdG9yID0gJ0snOworCQkJdW5zaWduZWQgbG9uZyBzdGFydF9iYXNlLCBzaXplX2Jhc2U7CisKKwkJCXN0YXJ0X2Jhc2UgPSB0b19zaXplX2ZhY3RvcihyYW5nZV9zdGFydGssICZzdGFydF9mYWN0b3IpLAorCQkJc2l6ZV9iYXNlID0gdG9fc2l6ZV9mYWN0b3Ioc2l6ZWssICZzaXplX2ZhY3RvciksCisKIAkJCXByaW50ayhLRVJOX0RFQlVHICJTZXR0aW5nIHZhcmlhYmxlIE1UUlIgJWQsICIKLQkJCQkiYmFzZTogJWxkTUIsIHJhbmdlOiAlbGRNQiwgdHlwZSAlc1xuIiwKLQkJCQlyZWcsIHJhbmdlX3N0YXJ0ayA+PiAxMCwgc2l6ZWsgPj4gMTAsCisJCQkJImJhc2U6ICVsZCVjQiwgcmFuZ2U6ICVsZCVjQiwgdHlwZSAlc1xuIiwKKwkJCQlyZWcsIHN0YXJ0X2Jhc2UsIHN0YXJ0X2ZhY3RvciwKKwkJCQlzaXplX2Jhc2UsIHNpemVfZmFjdG9yLAogCQkJCSh0eXBlID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKT8iVUMiOgogCQkJCSAgICAoKHR5cGUgPT0gTVRSUl9UWVBFX1dSQkFDSyk/IldCIjoiT3RoZXIiKQogCQkJCSk7CisJCX0KIAkJc2F2ZV92YXJfbXRycihyZWcrKywgcmFuZ2Vfc3RhcnRrLCBzaXplaywgdHlwZSk7CiAJCXJhbmdlX3N0YXJ0ayArPSBzaXplazsKIAkJcmFuZ2Vfc2l6ZWsgLT0gc2l6ZWs7CkBAIC05NzAsNiArMTAwNyw4IEBACiAJLyogdHJ5IHRvIGFwcGVuZCBzb21lIHNtYWxsIGhvbGUgKi8KIAlyYW5nZTBfYmFzZWsgPSBzdGF0ZS0+cmFuZ2Vfc3RhcnRrOwogCXJhbmdlMF9zaXplayA9IEFMSUdOKHN0YXRlLT5yYW5nZV9zaXplaywgY2h1bmtfc2l6ZWspOworCisJLyogbm8gaW5jcmVhc2UgKi8KIAlpZiAocmFuZ2UwX3NpemVrID09IHN0YXRlLT5yYW5nZV9zaXplaykgewogCQlpZiAoZGVidWdfcHJpbnQpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAicmFuZ2VYOiAlMDE2bHggLSAlMDE2bHhcbiIsCkBAIC05ODAsMTMgKzEwMTksNDAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmFuZ2UwX3NpemVrIC09IGNodW5rX3NpemVrOwotCWlmIChyYW5nZTBfc2l6ZWsgJiYgc2l6ZWspIHsKLQkgICAgd2hpbGUgKHJhbmdlMF9iYXNlayArIHJhbmdlMF9zaXplayA+IChiYXNlayArIHNpemVrKSkgewotCQlyYW5nZTBfc2l6ZWsgLT0gY2h1bmtfc2l6ZWs7Ci0JCWlmICghcmFuZ2UwX3NpemVrKQotCQkJYnJlYWs7Ci0JICAgIH0KKwkvKiBvbmx5IGN1dCBiYWNrLCB3aGVuIGl0IGlzIG5vdCB0aGUgbGFzdCAqLworCWlmIChzaXplaykgeworCQl3aGlsZSAocmFuZ2UwX2Jhc2VrICsgcmFuZ2UwX3NpemVrID4gKGJhc2VrICsgc2l6ZWspKSB7CisJCQlpZiAocmFuZ2UwX3NpemVrID49IGNodW5rX3NpemVrKQorCQkJCXJhbmdlMF9zaXplayAtPSBjaHVua19zaXplazsKKwkJCWVsc2UKKwkJCQlyYW5nZTBfc2l6ZWsgPSAwOworCisJCQlpZiAoIXJhbmdlMF9zaXplaykKKwkJCQlicmVhazsKKwkJfQorCX0KKworc2Vjb25kX3RyeToKKwlyYW5nZV9iYXNlayA9IHJhbmdlMF9iYXNlayArIHJhbmdlMF9zaXplazsKKworCS8qIG9uZSBob2xlIGluIHRoZSBtaWRkbGUgKi8KKwlpZiAocmFuZ2VfYmFzZWsgPiBiYXNlayAmJiByYW5nZV9iYXNlayA8PSAoYmFzZWsgKyBzaXplaykpCisJCXNlY29uZF9zaXplayA9IHJhbmdlX2Jhc2VrIC0gYmFzZWs7CisKKwlpZiAocmFuZ2UwX3NpemVrID4gc3RhdGUtPnJhbmdlX3NpemVrKSB7CisKKwkJLyogb25lIGhvbGUgaW4gbWlkZGxlIG9yIGF0IGVuZCAqLworCQlob2xlX3NpemVrID0gcmFuZ2UwX3NpemVrIC0gc3RhdGUtPnJhbmdlX3NpemVrIC0gc2Vjb25kX3NpemVrOworCisJCS8qIGhvbGUgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIGhhbGYgb2YgcmFuZ2UwIHNpemUgKi8KKwkJaWYgKGhvbGVfc2l6ZWsgPj0gKHJhbmdlMF9zaXplayA+PiAxKSAmJgorCQkgICAgcmFuZ2UwX3NpemVrID49IGNodW5rX3NpemVrKSB7CisJCQlyYW5nZTBfc2l6ZWsgLT0gY2h1bmtfc2l6ZWs7CisJCQlzZWNvbmRfc2l6ZWsgPSAwOworCQkJaG9sZV9zaXplayA9IDA7CisKKwkJCWdvdG8gc2Vjb25kX3RyeTsKKwkJfQogCX0KIAogCWlmIChyYW5nZTBfc2l6ZWspIHsKQEAgLTk5Niw1MCArMTA2MiwyOCBAQAogCQkJCShyYW5nZTBfYmFzZWsgKyByYW5nZTBfc2l6ZWspPDwxMCk7CiAJCXN0YXRlLT5yZWcgPSByYW5nZV90b19tdHJyKHN0YXRlLT5yZWcsIHJhbmdlMF9iYXNlaywKIAkJCQlyYW5nZTBfc2l6ZWssIE1UUlJfVFlQRV9XUkJBQ0spOwotCiAJfQogCi0JcmFuZ2VfYmFzZWsgPSByYW5nZTBfYmFzZWsgKyByYW5nZTBfc2l6ZWs7Ci0JcmFuZ2Vfc2l6ZWsgPSBjaHVua19zaXplazsKLQotCWlmIChyYW5nZV9iYXNlayArIHJhbmdlX3NpemVrID4gYmFzZWsgJiYKLQkgICAgcmFuZ2VfYmFzZWsgKyByYW5nZV9zaXplayA8PSAoYmFzZWsgKyBzaXplaykpIHsKLQkJLyogb25lIGhvbGUgKi8KLQkJc2Vjb25kX2Jhc2VrID0gYmFzZWs7Ci0JCXNlY29uZF9zaXplayA9IHJhbmdlX2Jhc2VrICsgcmFuZ2Vfc2l6ZWsgLSBiYXNlazsKLQl9Ci0KLQkvKiBpZiBsYXN0IHBpZWNlLCBvbmx5IGNvdWxkIG9uZSBob2xlIG5lYXIgZW5kICovCi0JaWYgKChzZWNvbmRfYmFzZWsgfHwgIWJhc2VrKSAmJgotCSAgICByYW5nZV9zaXplayAtIChzdGF0ZS0+cmFuZ2Vfc2l6ZWsgLSByYW5nZTBfc2l6ZWspIC0gc2Vjb25kX3NpemVrIDwKLQkgICAgKGNodW5rX3NpemVrID4+IDEpKSB7Ci0JCS8qCi0JCSAqIG9uZSBob2xlIGluIG1pZGRsZSAoc2Vjb25kX3NpemVrIGlzIDApIG9yIGF0IGVuZAotCQkgKiAoc2Vjb25kX3NpemVrIGlzIDAgKQotCQkgKi8KLQkJaG9sZV9zaXplayA9IHJhbmdlX3NpemVrIC0gKHN0YXRlLT5yYW5nZV9zaXplayAtIHJhbmdlMF9zaXplaykKLQkJCQkgLSBzZWNvbmRfc2l6ZWs7Ci0JCWhvbGVfYmFzZWsgPSByYW5nZV9iYXNlayArIHJhbmdlX3NpemVrIC0gaG9sZV9zaXplawotCQkJCSAtIHNlY29uZF9zaXplazsKLQl9IGVsc2UgewotCQkvKiBmYWxsYmFjayBmb3IgYmlnIGhvbGUsIG9yIHNldmVyYWwgaG9sZXMgKi8KKwlpZiAocmFuZ2UwX3NpemVrIDwgc3RhdGUtPnJhbmdlX3NpemVrKSB7CisJCS8qIG5lZWQgdG8gaGFuZGxlIGxlZnQgb3ZlciAqLwogCQlyYW5nZV9zaXplayA9IHN0YXRlLT5yYW5nZV9zaXplayAtIHJhbmdlMF9zaXplazsKLQkJc2Vjb25kX2Jhc2VrID0gMDsKLQkJc2Vjb25kX3NpemVrID0gMDsKKworCQlpZiAoZGVidWdfcHJpbnQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAicmFuZ2U6ICUwMTZseCAtICUwMTZseFxuIiwKKwkJCQkgcmFuZ2VfYmFzZWs8PDEwLAorCQkJCSAocmFuZ2VfYmFzZWsgKyByYW5nZV9zaXplayk8PDEwKTsKKwkJc3RhdGUtPnJlZyA9IHJhbmdlX3RvX210cnIoc3RhdGUtPnJlZywgcmFuZ2VfYmFzZWssCisJCQkJIHJhbmdlX3NpemVrLCBNVFJSX1RZUEVfV1JCQUNLKTsKIAl9CiAKLQlpZiAoZGVidWdfcHJpbnQpCi0JCXByaW50ayhLRVJOX0RFQlVHICJyYW5nZTogJTAxNmx4IC0gJTAxNmx4XG4iLCByYW5nZV9iYXNlazw8MTAsCi0JCQkgKHJhbmdlX2Jhc2VrICsgcmFuZ2Vfc2l6ZWspPDwxMCk7Ci0Jc3RhdGUtPnJlZyA9IHJhbmdlX3RvX210cnIoc3RhdGUtPnJlZywgcmFuZ2VfYmFzZWssIHJhbmdlX3NpemVrLAotCQkJCQkgTVRSUl9UWVBFX1dSQkFDSyk7CiAJaWYgKGhvbGVfc2l6ZWspIHsKKwkJaG9sZV9iYXNlayA9IHJhbmdlX2Jhc2VrIC0gaG9sZV9zaXplayAtIHNlY29uZF9zaXplazsKIAkJaWYgKGRlYnVnX3ByaW50KQogCQkJcHJpbnRrKEtFUk5fREVCVUcgImhvbGU6ICUwMTZseCAtICUwMTZseFxuIiwKLQkJCQkgaG9sZV9iYXNlazw8MTAsIChob2xlX2Jhc2VrICsgaG9sZV9zaXplayk8PDEwKTsKLQkJc3RhdGUtPnJlZyA9IHJhbmdlX3RvX210cnIoc3RhdGUtPnJlZywgaG9sZV9iYXNlaywgaG9sZV9zaXplaywKLQkJCQkJCSBNVFJSX1RZUEVfVU5DQUNIQUJMRSk7Ci0KKwkJCQkgaG9sZV9iYXNlazw8MTAsCisJCQkJIChob2xlX2Jhc2VrICsgaG9sZV9zaXplayk8PDEwKTsKKwkJc3RhdGUtPnJlZyA9IHJhbmdlX3RvX210cnIoc3RhdGUtPnJlZywgaG9sZV9iYXNlaywKKwkJCQkgaG9sZV9zaXplaywgTVRSUl9UWVBFX1VOQ0FDSEFCTEUpOwogCX0KIAogCXJldHVybiBzZWNvbmRfc2l6ZWs7CkBAIC0xMTU0LDExICsxMTk4LDExIEBACiB9OwogCiAvKgotICogZ3Jhbl9zaXplOiAxTSwgMk0sIC4uLiwgMkcKLSAqIGNodW5rIHNpemU6IGdyYW5fc2l6ZSwgLi4uLCA0RwotICogc28gd2UgbmVlZCAoMisxMykqNgorICogZ3Jhbl9zaXplOiA2NEssIDEyOEssIDI1NkssIDUxMkssIDFNLCAyTSwgLi4uLCAyRworICogY2h1bmsgc2l6ZTogZ3Jhbl9zaXplLCAuLi4sIDJHCisgKiBzbyB3ZSBuZWVkICgxKzE2KSo4CiAgKi8KLSNkZWZpbmUgTlVNX1JFU1VMVAk5MAorI2RlZmluZSBOVU1fUkVTVUxUCTEzNgogI2RlZmluZSBQU0hJRlQJCShQQUdFX1NISUZUIC0gMTApCiAKIHN0YXRpYyBzdHJ1Y3QgbXRycl9jbGVhbnVwX3Jlc3VsdCBfX2luaXRkYXRhIHJlc3VsdFtOVU1fUkVTVUxUXTsKQEAgLTExNjgsMTMgKzEyMTIsMTQgQEAKIHN0YXRpYyBpbnQgX19pbml0IG10cnJfY2xlYW51cCh1bnNpZ25lZCBhZGRyZXNzX2JpdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBleHRyYV9yZW1vdmVfYmFzZSwgZXh0cmFfcmVtb3ZlX3NpemU7Ci0JdW5zaWduZWQgbG9uZyBpLCBiYXNlLCBzaXplLCBkZWYsIGR1bW15OworCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZSwgZGVmLCBkdW1teTsKIAltdHJyX3R5cGUgdHlwZTsKIAlpbnQgbnJfcmFuZ2UsIG5yX3JhbmdlX25ldzsKIAl1NjQgY2h1bmtfc2l6ZSwgZ3Jhbl9zaXplOwogCXVuc2lnbmVkIGxvbmcgcmFuZ2Vfc3VtcywgcmFuZ2Vfc3Vtc19uZXc7CiAJaW50IGluZGV4X2dvb2Q7CiAJaW50IG51bV9yZWdfZ29vZDsKKwlpbnQgaTsKIAogCS8qIGV4dHJhIG9uZSBmb3IgYWxsIDAgKi8KIAlpbnQgbnVtW01UUlJfTlVNX1RZUEVTICsgMV07CkBAIC0xMjA0LDYgKzEyNDksOCBAQAogCQkJY29udGludWU7CiAJCWlmICghc2l6ZSkKIAkJCXR5cGUgPSBNVFJSX05VTV9UWVBFUzsKKwkJaWYgKHR5cGUgPT0gTVRSUl9UWVBFX1dSUFJPVCkKKwkJCXR5cGUgPSBNVFJSX1RZUEVfVU5DQUNIQUJMRTsKIAkJbnVtW3R5cGVdKys7CiAJfQogCkBAIC0xMjE2LDIzICsxMjYzLDU3IEBACiAJCW51bV92YXJfcmFuZ2VzIC0gbnVtW01UUlJfTlVNX1RZUEVTXSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBwcmludCBvcmlnaW5hbCB2YXIgTVRSUnMgYXQgZmlyc3QsIGZvciBkZWJ1Z2dpbmc6ICovCisJcHJpbnRrKEtFUk5fREVCVUcgIm9yaWdpbmFsIHZhcmlhYmxlIE1UUlJzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykgeworCQljaGFyIHN0YXJ0X2ZhY3RvciA9ICdLJywgc2l6ZV9mYWN0b3IgPSAnSyc7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYmFzZSwgc2l6ZV9iYXNlOworCisJCXNpemVfYmFzZSA9IHJhbmdlX3N0YXRlW2ldLnNpemVfcGZuIDw8IChQQUdFX1NISUZUIC0gMTApOworCQlpZiAoIXNpemVfYmFzZSkKKwkJCWNvbnRpbnVlOworCisJCXNpemVfYmFzZSA9IHRvX3NpemVfZmFjdG9yKHNpemVfYmFzZSwgJnNpemVfZmFjdG9yKSwKKwkJc3RhcnRfYmFzZSA9IHJhbmdlX3N0YXRlW2ldLmJhc2VfcGZuIDw8IChQQUdFX1NISUZUIC0gMTApOworCQlzdGFydF9iYXNlID0gdG9fc2l6ZV9mYWN0b3Ioc3RhcnRfYmFzZSwgJnN0YXJ0X2ZhY3RvciksCisJCXR5cGUgPSByYW5nZV9zdGF0ZVtpXS50eXBlOworCisJCXByaW50ayhLRVJOX0RFQlVHICJyZWcgJWQsIGJhc2U6ICVsZCVjQiwgcmFuZ2U6ICVsZCVjQiwgdHlwZSAlc1xuIiwKKwkJCWksIHN0YXJ0X2Jhc2UsIHN0YXJ0X2ZhY3RvciwKKwkJCXNpemVfYmFzZSwgc2l6ZV9mYWN0b3IsCisJCQkodHlwZSA9PSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkgPyAiVUMiIDoKKwkJCSAgICAoKHR5cGUgPT0gTVRSUl9UWVBFX1dSUFJPVCkgPyAiV1AiIDoKKwkJCSAgICAgKCh0eXBlID09IE1UUlJfVFlQRV9XUkJBQ0spID8gIldCIiA6ICJPdGhlciIpKQorCQkJKTsKKwl9CisKIAltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOwogCWV4dHJhX3JlbW92ZV9zaXplID0gMDsKLQlpZiAobXRycl90b20yKSB7Ci0JCWV4dHJhX3JlbW92ZV9iYXNlID0gMSA8PCAoMzIgLSBQQUdFX1NISUZUKTsKKwlleHRyYV9yZW1vdmVfYmFzZSA9IDEgPDwgKDMyIC0gUEFHRV9TSElGVCk7CisJaWYgKG10cnJfdG9tMikKIAkJZXh0cmFfcmVtb3ZlX3NpemUgPQogCQkJKG10cnJfdG9tMiA+PiBQQUdFX1NISUZUKSAtIGV4dHJhX3JlbW92ZV9iYXNlOwotCX0KIAlucl9yYW5nZSA9IHg4Nl9nZXRfbXRycl9tZW1fcmFuZ2UocmFuZ2UsIDAsIGV4dHJhX3JlbW92ZV9iYXNlLAogCQkJCQkgIGV4dHJhX3JlbW92ZV9zaXplKTsKKwkvKgorCSAqIFswLCAxTSkgc2hvdWxkIGFsd2F5cyBiZSBjb3ZlcnJlZCBieSB2YXIgbXRyciB3aXRoIFdCCisJICogYW5kIGZpeGVkIG10cnJzIHNob3VsZCB0YWtlIGVmZmVjdGl2ZSBiZWZvcmUgdmFyIG10cnIgZm9yIGl0CisJICovCisJbnJfcmFuZ2UgPSBhZGRfcmFuZ2Vfd2l0aF9tZXJnZShyYW5nZSwgbnJfcmFuZ2UsIDAsCisJCQkJCSgxVUxMPDwoMjAgLSBQQUdFX1NISUZUKSkgLSAxKTsKKwkvKiBzb3J0IHRoZSByYW5nZXMgKi8KKwlzb3J0KHJhbmdlLCBucl9yYW5nZSwgc2l6ZW9mKHN0cnVjdCByZXNfcmFuZ2UpLCBjbXBfcmFuZ2UsIE5VTEwpOworCiAJcmFuZ2Vfc3VtcyA9IHN1bV9yYW5nZXMocmFuZ2UsIG5yX3JhbmdlKTsKIAlwcmludGsoS0VSTl9JTkZPICJ0b3RhbCBSQU0gY292ZXJyZWQ6ICVsZE1cbiIsCiAJICAgICAgIHJhbmdlX3N1bXMgPj4gKDIwIC0gUEFHRV9TSElGVCkpOwogCiAJaWYgKG10cnJfY2h1bmtfc2l6ZSAmJiBtdHJyX2dyYW5fc2l6ZSkgewogCQlpbnQgbnVtX3JlZzsKKwkJY2hhciBncmFuX2ZhY3RvciwgY2h1bmtfZmFjdG9yLCBsb3NlX2ZhY3RvcjsKKwkJdW5zaWduZWQgbG9uZyBncmFuX2Jhc2UsIGNodW5rX2Jhc2UsIGxvc2VfYmFzZTsKIAotCQlkZWJ1Z19wcmludCA9IDE7CisJCWRlYnVnX3ByaW50Kys7CiAJCS8qIGNvbnZlcnQgcmFuZ2VzIHRvIHZhciByYW5nZXMgc3RhdGUgKi8KIAkJbnVtX3JlZyA9IHg4Nl9zZXR1cF92YXJfbXRycnMocmFuZ2UsIG5yX3JhbmdlLCBtdHJyX2NodW5rX3NpemUsCiAJCQkJCSAgICAgIG10cnJfZ3Jhbl9zaXplKTsKQEAgLTEyNTYsMzQgKzEzMzcsNDggQEAKIAkJCXJlc3VsdFtpXS5sb3NlX2NvdmVyX3NpemVrID0KIAkJCQkocmFuZ2Vfc3VtcyAtIHJhbmdlX3N1bXNfbmV3KSA8PCBQU0hJRlQ7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNncmFuX3NpemU6ICVsZE0gXHRjaHVua19zaXplOiAlbGRNIFx0IiwKLQkJCSByZXN1bHRbaV0uYmFkPyIqQkFEKiI6IiAiLCByZXN1bHRbaV0uZ3Jhbl9zaXplayA+PiAxMCwKLQkJCSByZXN1bHRbaV0uY2h1bmtfc2l6ZWsgPj4gMTApOwotCQlwcmludGsoS0VSTl9DT05UICJudW1fcmVnOiAlZCAgXHRsb3NlIGNvdmVyIFJBTTogJXMlbGRNIFxuIiwKKwkJZ3Jhbl9iYXNlID0gdG9fc2l6ZV9mYWN0b3IocmVzdWx0W2ldLmdyYW5fc2l6ZWssICZncmFuX2ZhY3RvciksCisJCWNodW5rX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihyZXN1bHRbaV0uY2h1bmtfc2l6ZWssICZjaHVua19mYWN0b3IpLAorCQlsb3NlX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihyZXN1bHRbaV0ubG9zZV9jb3Zlcl9zaXplaywgJmxvc2VfZmFjdG9yKSwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXNncmFuX3NpemU6ICVsZCVjIFx0Y2h1bmtfc2l6ZTogJWxkJWMgXHQiLAorCQkJIHJlc3VsdFtpXS5iYWQ/IipCQUQqIjoiICIsCisJCQkgZ3Jhbl9iYXNlLCBncmFuX2ZhY3RvciwgY2h1bmtfYmFzZSwgY2h1bmtfZmFjdG9yKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAibnVtX3JlZzogJWQgIFx0bG9zZSBjb3ZlciBSQU06ICVzJWxkJWNcbiIsCiAJCQkgcmVzdWx0W2ldLm51bV9yZWcsIHJlc3VsdFtpXS5iYWQ/Ii0iOiIiLAotCQkJIHJlc3VsdFtpXS5sb3NlX2NvdmVyX3NpemVrID4+IDEwKTsKKwkJCSBsb3NlX2Jhc2UsIGxvc2VfZmFjdG9yKTsKIAkJaWYgKCFyZXN1bHRbaV0uYmFkKSB7CiAJCQlzZXRfdmFyX210cnJfYWxsKGFkZHJlc3NfYml0cyk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlwcmludGsoS0VSTl9JTkZPICJpbnZhbGlkIG10cnJfZ3Jhbl9zaXplIG9yIG10cnJfY2h1bmtfc2l6ZSwgIgogCQkgICAgICAgIndpbGwgZmluZCBvcHRpbWFsIG9uZVxuIik7Ci0JCWRlYnVnX3ByaW50ID0gMDsKKwkJZGVidWdfcHJpbnQtLTsKIAkJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdFswXSkpOwogCX0KIAogCWkgPSAwOwogCW1lbXNldChtaW5fbG9zc19wZm4sIDB4ZmYsIHNpemVvZihtaW5fbG9zc19wZm4pKTsKIAltZW1zZXQocmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7Ci0JZm9yIChncmFuX3NpemUgPSAoMVVMTDw8MjApOyBncmFuX3NpemUgPCAoMVVMTDw8MzIpOyBncmFuX3NpemUgPDw9IDEpIHsKLQkJZm9yIChjaHVua19zaXplID0gZ3Jhbl9zaXplOyBjaHVua19zaXplIDwgKDFVTEw8PDMzKTsKKwlmb3IgKGdyYW5fc2l6ZSA9ICgxVUxMPDwxNik7IGdyYW5fc2l6ZSA8ICgxVUxMPDwzMik7IGdyYW5fc2l6ZSA8PD0gMSkgeworCQljaGFyIGdyYW5fZmFjdG9yOworCQl1bnNpZ25lZCBsb25nIGdyYW5fYmFzZTsKKworCQlpZiAoZGVidWdfcHJpbnQpCisJCQlncmFuX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihncmFuX3NpemUgPj4gMTAsICZncmFuX2ZhY3Rvcik7CisKKwkJZm9yIChjaHVua19zaXplID0gZ3Jhbl9zaXplOyBjaHVua19zaXplIDwgKDFVTEw8PDMyKTsKIAkJICAgICBjaHVua19zaXplIDw8PSAxKSB7CiAJCQlpbnQgbnVtX3JlZzsKIAotCQkJaWYgKGRlYnVnX3ByaW50KQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiXG5ncmFuX3NpemU6ICVsbGRNICAgY2h1bmtfc2l6ZV9zaXplOiAlbGxkTVxuIiwKLQkJCQkgICAgICAgZ3Jhbl9zaXplID4+IDIwLCBjaHVua19zaXplID4+IDIwKTsKKwkJCWlmIChkZWJ1Z19wcmludCkgeworCQkJCWNoYXIgY2h1bmtfZmFjdG9yOworCQkJCXVuc2lnbmVkIGxvbmcgY2h1bmtfYmFzZTsKKworCQkJCWNodW5rX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihjaHVua19zaXplPj4xMCwgJmNodW5rX2ZhY3RvciksCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJncmFuX3NpemU6ICVsZCVjICAgY2h1bmtfc2l6ZTogJWxkJWMgXG4iLAorCQkJCSAgICAgICBncmFuX2Jhc2UsIGdyYW5fZmFjdG9yLCBjaHVua19iYXNlLCBjaHVua19mYWN0b3IpOworCQkJfQogCQkJaWYgKGkgPj0gTlVNX1JFU1VMVCkKIAkJCQljb250aW51ZTsKIApAQCAtMTMyNiwxMiArMTQyMSwxOCBAQAogCiAJLyogcHJpbnQgb3V0IGFsbCAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fUkVTVUxUOyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNncmFuX3NpemU6ICVsZE0gXHRjaHVua19zaXplOiAlbGRNIFx0IiwKLQkJICAgICAgIHJlc3VsdFtpXS5iYWQ/IipCQUQqICI6IiAiLCByZXN1bHRbaV0uZ3Jhbl9zaXplayA+PiAxMCwKLQkJICAgICAgIHJlc3VsdFtpXS5jaHVua19zaXplayA+PiAxMCk7Ci0JCXByaW50ayhLRVJOX0NPTlQgIm51bV9yZWc6ICVkIFx0bG9zZSBSQU06ICVzJWxkTVxuIiwKLQkJICAgICAgIHJlc3VsdFtpXS5udW1fcmVnLCByZXN1bHRbaV0uYmFkPyItIjoiIiwKLQkJICAgICAgIHJlc3VsdFtpXS5sb3NlX2NvdmVyX3NpemVrID4+IDEwKTsKKwkJY2hhciBncmFuX2ZhY3RvciwgY2h1bmtfZmFjdG9yLCBsb3NlX2ZhY3RvcjsKKwkJdW5zaWduZWQgbG9uZyBncmFuX2Jhc2UsIGNodW5rX2Jhc2UsIGxvc2VfYmFzZTsKKworCQlncmFuX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihyZXN1bHRbaV0uZ3Jhbl9zaXplaywgJmdyYW5fZmFjdG9yKSwKKwkJY2h1bmtfYmFzZSA9IHRvX3NpemVfZmFjdG9yKHJlc3VsdFtpXS5jaHVua19zaXplaywgJmNodW5rX2ZhY3RvciksCisJCWxvc2VfYmFzZSA9IHRvX3NpemVfZmFjdG9yKHJlc3VsdFtpXS5sb3NlX2NvdmVyX3NpemVrLCAmbG9zZV9mYWN0b3IpLAorCQlwcmludGsoS0VSTl9JTkZPICIlc2dyYW5fc2l6ZTogJWxkJWMgXHRjaHVua19zaXplOiAlbGQlYyBcdCIsCisJCQkgcmVzdWx0W2ldLmJhZD8iKkJBRCoiOiIgIiwKKwkJCSBncmFuX2Jhc2UsIGdyYW5fZmFjdG9yLCBjaHVua19iYXNlLCBjaHVua19mYWN0b3IpOworCQlwcmludGsoS0VSTl9DT05UICJudW1fcmVnOiAlZCAgXHRsb3NlIGNvdmVyIFJBTTogJXMlbGQlY1xuIiwKKwkJCSByZXN1bHRbaV0ubnVtX3JlZywgcmVzdWx0W2ldLmJhZD8iLSI6IiIsCisJCQkgbG9zZV9iYXNlLCBsb3NlX2ZhY3Rvcik7CiAJfQogCiAJLyogdHJ5IHRvIGZpbmQgdGhlIG9wdGltYWwgaW5kZXggKi8KQEAgLTEzMzksMTAgKzE0NDAsOCBAQAogCQlucl9tdHJyX3NwYXJlX3JlZyA9IG51bV92YXJfcmFuZ2VzIC0gMTsKIAludW1fcmVnX2dvb2QgPSAtMTsKIAlmb3IgKGkgPSBudW1fdmFyX3JhbmdlcyAtIG5yX210cnJfc3BhcmVfcmVnOyBpID4gMDsgaS0tKSB7Ci0JCWlmICghbWluX2xvc3NfcGZuW2ldKSB7CisJCWlmICghbWluX2xvc3NfcGZuW2ldKQogCQkJbnVtX3JlZ19nb29kID0gaTsKLQkJCWJyZWFrOwotCQl9CiAJfQogCiAJaW5kZXhfZ29vZCA9IC0xOwpAQCAtMTM1OCwyMSArMTQ1NywyNiBAQAogCX0KIAogCWlmIChpbmRleF9nb29kICE9IC0xKSB7CisJCWNoYXIgZ3Jhbl9mYWN0b3IsIGNodW5rX2ZhY3RvciwgbG9zZV9mYWN0b3I7CisJCXVuc2lnbmVkIGxvbmcgZ3Jhbl9iYXNlLCBjaHVua19iYXNlLCBsb3NlX2Jhc2U7CisKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgb3B0aW1hbCBzZXR0aW5nIGZvciBtdHJyIGNsZWFuIHVwXG4iKTsKIAkJaSA9IGluZGV4X2dvb2Q7Ci0JCXByaW50ayhLRVJOX0lORk8gImdyYW5fc2l6ZTogJWxkTSBcdGNodW5rX3NpemU6ICVsZE0gXHQiLAotCQkJCXJlc3VsdFtpXS5ncmFuX3NpemVrID4+IDEwLAotCQkJCXJlc3VsdFtpXS5jaHVua19zaXplayA+PiAxMCk7Ci0JCXByaW50ayhLRVJOX0NPTlQgIm51bV9yZWc6ICVkIFx0bG9zZSBSQU06ICVsZE1cbiIsCi0JCQkJcmVzdWx0W2ldLm51bV9yZWcsCi0JCQkJcmVzdWx0W2ldLmxvc2VfY292ZXJfc2l6ZWsgPj4gMTApOworCQlncmFuX2Jhc2UgPSB0b19zaXplX2ZhY3RvcihyZXN1bHRbaV0uZ3Jhbl9zaXplaywgJmdyYW5fZmFjdG9yKSwKKwkJY2h1bmtfYmFzZSA9IHRvX3NpemVfZmFjdG9yKHJlc3VsdFtpXS5jaHVua19zaXplaywgJmNodW5rX2ZhY3RvciksCisJCWxvc2VfYmFzZSA9IHRvX3NpemVfZmFjdG9yKHJlc3VsdFtpXS5sb3NlX2NvdmVyX3NpemVrLCAmbG9zZV9mYWN0b3IpLAorCQlwcmludGsoS0VSTl9JTkZPICJncmFuX3NpemU6ICVsZCVjIFx0Y2h1bmtfc2l6ZTogJWxkJWMgXHQiLAorCQkJIGdyYW5fYmFzZSwgZ3Jhbl9mYWN0b3IsIGNodW5rX2Jhc2UsIGNodW5rX2ZhY3Rvcik7CisJCXByaW50ayhLRVJOX0NPTlQgIm51bV9yZWc6ICVkICBcdGxvc2UgUkFNOiAlbGQlY1xuIiwKKwkJCSByZXN1bHRbaV0ubnVtX3JlZywgbG9zZV9iYXNlLCBsb3NlX2ZhY3Rvcik7CiAJCS8qIGNvbnZlcnQgcmFuZ2VzIHRvIHZhciByYW5nZXMgc3RhdGUgKi8KIAkJY2h1bmtfc2l6ZSA9IHJlc3VsdFtpXS5jaHVua19zaXplazsKIAkJY2h1bmtfc2l6ZSA8PD0gMTA7CiAJCWdyYW5fc2l6ZSA9IHJlc3VsdFtpXS5ncmFuX3NpemVrOwogCQlncmFuX3NpemUgPDw9IDEwOwotCQlkZWJ1Z19wcmludCA9IDE7CisJCWRlYnVnX3ByaW50Kys7CiAJCXg4Nl9zZXR1cF92YXJfbXRycnMocmFuZ2UsIG5yX3JhbmdlLCBjaHVua19zaXplLCBncmFuX3NpemUpOworCQlkZWJ1Z19wcmludC0tOwogCQlzZXRfdmFyX210cnJfYWxsKGFkZHJlc3NfYml0cyk7CiAJCXJldHVybiAxOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZmN0ci13YXRjaGRvZy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKaW5kZXggMDVjYzIyZC4uNmJmZjM4MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKQEAgLTI5NSwxMyArMjk1LDE5IEBACiAJLyogc2V0dXAgdGhlIHRpbWVyICovCiAJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOwogCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIocGVyZmN0cl9tc3IsICJLN19QRVJGQ1RSMCIsbm1pX2h6KTsKKworCS8qIGluaXRpYWxpemUgdGhlIHdkIHN0cnVjdCBiZWZvcmUgZW5hYmxpbmcgKi8KKwl3ZC0+cGVyZmN0cl9tc3IgPSBwZXJmY3RyX21zcjsKKwl3ZC0+ZXZudHNlbF9tc3IgPSBldm50c2VsX21zcjsKKwl3ZC0+Y2Njcl9tc3IgPSAwOyAgLyogdW51c2VkICovCisKKwkvKiBvaywgZXZlcnl0aGluZyBpcyBpbml0aWFsaXplZCwgYW5ub3VuY2UgdGhhdCB3ZSdyZSBzZXQgKi8KKwljcHVfbm1pX3NldF93ZF9lbmFibGVkKCk7CisKIAlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKIAlldm50c2VsIHw9IEs3X0VWTlRTRUxfRU5BQkxFOwogCXdybXNyKGV2bnRzZWxfbXNyLCBldm50c2VsLCAwKTsKIAotCXdkLT5wZXJmY3RyX21zciA9IHBlcmZjdHJfbXNyOwotCXdkLT5ldm50c2VsX21zciA9IGV2bnRzZWxfbXNyOwotCXdkLT5jY2NyX21zciA9IDA7ICAvKiB1bnVzZWQgKi8KIAlyZXR1cm4gMTsKIH0KIApAQCAtMzc5LDEzICszODUsMTkgQEAKIAl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CiAJbm1pX2h6ID0gYWRqdXN0X2Zvcl8zMmJpdF9jdHIobm1pX2h6KTsKIAl3cml0ZV93YXRjaGRvZ19jb3VudGVyMzIocGVyZmN0cl9tc3IsICJQNl9QRVJGQ1RSMCIsbm1pX2h6KTsKKworCS8qIGluaXRpYWxpemUgdGhlIHdkIHN0cnVjdCBiZWZvcmUgZW5hYmxpbmcgKi8KKwl3ZC0+cGVyZmN0cl9tc3IgPSBwZXJmY3RyX21zcjsKKwl3ZC0+ZXZudHNlbF9tc3IgPSBldm50c2VsX21zcjsKKwl3ZC0+Y2Njcl9tc3IgPSAwOyAgLyogdW51c2VkICovCisKKwkvKiBvaywgZXZlcnl0aGluZyBpcyBpbml0aWFsaXplZCwgYW5ub3VuY2UgdGhhdCB3ZSdyZSBzZXQgKi8KKwljcHVfbm1pX3NldF93ZF9lbmFibGVkKCk7CisKIAlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKIAlldm50c2VsIHw9IFA2X0VWTlRTRUwwX0VOQUJMRTsKIAl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CiAKLQl3ZC0+cGVyZmN0cl9tc3IgPSBwZXJmY3RyX21zcjsKLQl3ZC0+ZXZudHNlbF9tc3IgPSBldm50c2VsX21zcjsKLQl3ZC0+Y2Njcl9tc3IgPSAwOyAgLyogdW51c2VkICovCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQzMiw2ICs0NDQsMjcgQEAKICNkZWZpbmUgUDRfQ0NDUl9FTkFCTEUJCSgxIDw8IDEyKQogI2RlZmluZSBQNF9DQ0NSX09WRiAJCSgxIDw8IDMxKQogCisjZGVmaW5lIFA0X0NPTlRST0xTIDE4CitzdGF0aWMgdW5zaWduZWQgaW50IHA0X2NvbnRyb2xzWzE4XSA9IHsKKwlNU1JfUDRfQlBVX0NDQ1IwLAorCU1TUl9QNF9CUFVfQ0NDUjEsCisJTVNSX1A0X0JQVV9DQ0NSMiwKKwlNU1JfUDRfQlBVX0NDQ1IzLAorCU1TUl9QNF9NU19DQ0NSMCwKKwlNU1JfUDRfTVNfQ0NDUjEsCisJTVNSX1A0X01TX0NDQ1IyLAorCU1TUl9QNF9NU19DQ0NSMywKKwlNU1JfUDRfRkxBTUVfQ0NDUjAsCisJTVNSX1A0X0ZMQU1FX0NDQ1IxLAorCU1TUl9QNF9GTEFNRV9DQ0NSMiwKKwlNU1JfUDRfRkxBTUVfQ0NDUjMsCisJTVNSX1A0X0lRX0NDQ1IwLAorCU1TUl9QNF9JUV9DQ0NSMSwKKwlNU1JfUDRfSVFfQ0NDUjIsCisJTVNSX1A0X0lRX0NDQ1IzLAorCU1TUl9QNF9JUV9DQ0NSNCwKKwlNU1JfUDRfSVFfQ0NDUjUsCit9OwogLyoKICAqIFNldCB1cCBJUV9DT1VOVEVSMCB0byBiZWhhdmUgbGlrZSBhIGNsb2NrLCBieSBoYXZpbmcgSVFfQ0NDUjAgZmlsdGVyCiAgKiBDUlVfRVNDUjAgKHdpdGggYW55IG5vbi1udWxsIGV2ZW50IHNlbGVjdG9yKSB0aHJvdWdoIGEgY29tcGxlbWVudGVkCkBAIC00NzMsNiArNTA2LDI2IEBACiAJCWV2bnRzZWxfbXNyID0gTVNSX1A0X0NSVV9FU0NSMDsKIAkJY2Njcl9tc3IgPSBNU1JfUDRfSVFfQ0NDUjA7CiAJCWNjY3JfdmFsID0gUDRfQ0NDUl9PVkZfUE1JMCB8IFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCk7CisKKwkJLyoKKwkJICogSWYgd2UncmUgb24gdGhlIGtkdW1wIGtlcm5lbCBvciBvdGhlciBzaXR1YXRpb24sIHdlIG1heQorCQkgKiBzdGlsbCBoYXZlIG90aGVyIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXJzIHNldCB0bworCQkgKiBpbnRlcnJ1cHQgYW5kIHRoZXknbGwga2VlcCBpbnRlcnJ1cHRpbmcgZm9yZXZlciBiZWNhdXNlCisJCSAqIG9mIHRoZSBQNF9DQ0NSX09WRiBxdWlyay4gU28gd2UgbmVlZCB0byBBQ0sgYWxsIHRoZQorCQkgKiBwZW5kaW5nIGludGVycnVwdHMgYW5kIGRpc2FibGUgYWxsIHRoZSByZWdpc3RlcnMgaGVyZSwKKwkJICogYmVmb3JlIHJlZW5hYmxpbmcgdGhlIE5NSSBkZWxpdmVyeS4gUmVmZXIgdG8gcDRfcmVhcm0oKQorCQkgKiBhYm91dCB0aGUgUDRfQ0NDUl9PVkYgcXVpcmsuCisJCSAqLworCQlpZiAocmVzZXRfZGV2aWNlcykgeworCQkJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgUDRfQ09OVFJPTFM7IGkrKykgeworCQkJCXJkbXNyKHA0X2NvbnRyb2xzW2ldLCBsb3csIGhpZ2gpOworCQkJCWxvdyAmPSB+KFA0X0NDQ1JfRU5BQkxFIHwgUDRfQ0NDUl9PVkYpOworCQkJCXdybXNyKHA0X2NvbnRyb2xzW2ldLCBsb3csIGhpZ2gpOworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJLyogbG9naWNhbCBjcHUgMSAqLwogCQlwZXJmY3RyX21zciA9IE1TUl9QNF9JUV9QRVJGQ1RSMTsKQEAgLTQ5OSwxMiArNTUyLDE3IEBACiAJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOwogCXdybXNyKGNjY3JfbXNyLCBjY2NyX3ZhbCwgMCk7CiAJd3JpdGVfd2F0Y2hkb2dfY291bnRlcihwZXJmY3RyX21zciwgIlA0X0lRX0NPVU5URVIwIiwgbm1pX2h6KTsKLQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKLQljY2NyX3ZhbCB8PSBQNF9DQ0NSX0VOQUJMRTsKLQl3cm1zcihjY2NyX21zciwgY2Njcl92YWwsIDApOworCiAJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CiAJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CiAJd2QtPmNjY3JfbXNyID0gY2Njcl9tc3I7CisKKwkvKiBvaywgZXZlcnl0aGluZyBpcyBpbml0aWFsaXplZCwgYW5ub3VuY2UgdGhhdCB3ZSdyZSBzZXQgKi8KKwljcHVfbm1pX3NldF93ZF9lbmFibGVkKCk7CisKKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwljY2NyX3ZhbCB8PSBQNF9DQ0NSX0VOQUJMRTsKKwl3cm1zcihjY2NyX21zciwgY2Njcl92YWwsIDApOwogCXJldHVybiAxOwogfQogCkBAIC02MjAsMTMgKzY3OCwxNyBAQAogCXdybXNyKGV2bnRzZWxfbXNyLCBldm50c2VsLCAwKTsKIAlubWlfaHogPSBhZGp1c3RfZm9yXzMyYml0X2N0cihubWlfaHopOwogCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIzMihwZXJmY3RyX21zciwgIklOVEVMX0FSQ0hfUEVSRkNUUjAiLCBubWlfaHopOwotCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwotCWV2bnRzZWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7Ci0Jd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOwogCiAJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CiAJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CiAJd2QtPmNjY3JfbXNyID0gMDsgIC8qIHVudXNlZCAqLworCisJLyogb2ssIGV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQsIGFubm91bmNlIHRoYXQgd2UncmUgc2V0ICovCisJY3B1X25taV9zZXRfd2RfZW5hYmxlZCgpOworCisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRTsKKwl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CiAJaW50ZWxfYXJjaF93ZF9vcHMuY2hlY2tiaXQgPSAxVUxMIDw8IChlYXguc3BsaXQuYml0X3dpZHRoIC0gMSk7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3Bvd2VyZmxhZ3MuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcG93ZXJmbGFncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmJlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3Bvd2VyZmxhZ3MuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogU3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgeDg2IHBvd2VyIGZsYWdzCisgKgorICogVGhpcyBmaWxlIG11c3Qgbm90IGNvbnRhaW4gYW55IGV4ZWN1dGFibGUgY29kZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKworY29uc3QgY2hhciAqY29uc3QgeDg2X3Bvd2VyX2ZsYWdzWzMyXSA9IHsKKwkidHMiLAkvKiB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKwkiZmlkIiwgIC8qIGZyZXF1ZW5jeSBpZCBjb250cm9sICovCisJInZpZCIsICAvKiB2b2x0YWdlIGlkIGNvbnRyb2wgKi8KKwkidHRwIiwgIC8qIHRoZXJtYWwgdHJpcCAqLworCSJ0bSIsCisJInN0YyIsCisJIjEwMG1oenN0ZXBzIiwKKwkiaHdwc3RhdGUiLAorCSIiLAkvKiB0c2MgaW52YXJpYW50IG1hcHBlZCB0byBjb25zdGFudF90c2MgKi8KKwkJLyogbm90aGluZyAqLworfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3RyYW5zbWV0YS5jCmluZGV4IGI5MTFhMmMuLjUyYjNmZWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS90cmFuc21ldGEuYwpAQCAtNSw2ICs1LDE4IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgImNwdS5oIgogCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaW5pdF90cmFuc21ldGEoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiB4bHZsOworCisJLyogVHJhbnNtZXRhLWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODA4NjAwMDEgKi8KKwl4bHZsID0gY3B1aWRfZWF4KDB4ODA4NjAwMDApOworCWlmICgoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDApIHsKKwkJaWYgKHhsdmwgPj0gMHg4MDg2MDAwMSkKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzJdID0gY3B1aWRfZWR4KDB4ODA4NjAwMDEpOworCX0KK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfdHJhbnNtZXRhKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBpbnQgY2FwX21hc2ssIHVrLCBtYXgsIGR1bW15OwpAQCAtMTIsNyArMjQsOCBAQAogCXVuc2lnbmVkIGludCBjcHVfcmV2LCBjcHVfZnJlcSA9IDAsIGNwdV9mbGFncywgbmV3X2NwdV9yZXY7CiAJY2hhciBjcHVfaW5mb1s2NV07CiAKLQlnZXRfbW9kZWxfbmFtZShjKTsJLyogU2FtZSBhcyBBTUQvQ3lyaXggKi8KKwllYXJseV9pbml0X3RyYW5zbWV0YShjKTsKKwogCWRpc3BsYXlfY2FjaGVpbmZvKGMpOwogCiAJLyogUHJpbnQgQ01TIGFuZCBDUFUgcmV2aXNpb24gKi8KQEAgLTg1LDIzICs5OCwxMiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCB0cmFuc21ldGFfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICpjKQotewotCXUzMiB4bHZsOwotCi0JLyogVHJhbnNtZXRhLWRlZmluZWQgZmxhZ3M6IGxldmVsIDB4ODA4NjAwMDEgKi8KLQl4bHZsID0gY3B1aWRfZWF4KDB4ODA4NjAwMDApOwotCWlmICgoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDApIHsKLQkJaWYgKHhsdmwgPj0gMHg4MDg2MDAwMSkKLQkJCWMtPng4Nl9jYXBhYmlsaXR5WzJdID0gY3B1aWRfZWR4KDB4ODA4NjAwMDEpOwotCX0KLX0KLQogc3RhdGljIHN0cnVjdCBjcHVfZGV2IHRyYW5zbWV0YV9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CiAJLmNfdmVuZG9yCT0gIlRyYW5zbWV0YSIsCiAJLmNfaWRlbnQJPSB7ICJHZW51aW5lVE14ODYiLCAiVHJhbnNtZXRhQ1BVIiB9LAorCS5jX2Vhcmx5X2luaXQJPSBlYXJseV9pbml0X3RyYW5zbWV0YSwKIAkuY19pbml0CQk9IGluaXRfdHJhbnNtZXRhLAotCS5jX2lkZW50aWZ5CT0gdHJhbnNtZXRhX2lkZW50aWZ5LAorCS5jX3g4Nl92ZW5kb3IJPSBYODZfVkVORE9SX1RSQU5TTUVUQSwKIH07CiAKLWNwdV92ZW5kb3JfZGV2X3JlZ2lzdGVyKFg4Nl9WRU5ET1JfVFJBTlNNRVRBLCAmdHJhbnNtZXRhX2NwdV9kZXYpOworY3B1X2Rldl9yZWdpc3Rlcih0cmFuc21ldGFfY3B1X2Rldik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3VtYy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS91bWMuYwppbmRleCBiMWZjOTA5Li5lNzc3Zjc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3VtYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvdW1jLmMKQEAgLTE5LDcgKzE5LDggQEAKIAkJICB9CiAJCX0sCiAJfSwKKwkuY194ODZfdmVuZG9yCT0gWDg2X1ZFTkRPUl9VTUMsCiB9OwogCi1jcHVfdmVuZG9yX2Rldl9yZWdpc3RlcihYODZfVkVORE9SX1VNQywgJnVtY19jcHVfZGV2KTsKK2NwdV9kZXZfcmVnaXN0ZXIodW1jX2NwdV9kZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1aWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHVpZC5jCmluZGV4IDhlOWNkNmEuLjcyY2VmZDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHVpZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHVpZC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgpAQCAtMTQ4LDggKzE0Nyw4IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCi0JZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGNwdWlkX2NsYXNzLCBOVUxMLCBNS0RFVihDUFVJRF9NQUpPUiwgY3B1KSwKLQkJCQkgICAgTlVMTCwgImNwdSVkIiwgY3B1KTsKKwlkZXYgPSBkZXZpY2VfY3JlYXRlKGNwdWlkX2NsYXNzLCBOVUxMLCBNS0RFVihDUFVJRF9NQUpPUiwgY3B1KSwgTlVMTCwKKwkJCSAgICAiY3B1JWQiLCBjcHUpOwogCXJldHVybiBJU19FUlIoZGV2KSA/IFBUUl9FUlIoZGV2KSA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaF9kdW1wXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2hfZHVtcF82NC5jCmluZGV4IDE1ZTZjNmIuLmU5MGE2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaF9kdW1wXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NyYXNoX2R1bXBfNjQuYwpAQCAtNyw5ICs3LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogLyoqCiAgKiBjb3B5X29sZG1lbV9wYWdlIC0gY29weSBvbmUgcGFnZSBmcm9tICJvbGRtZW0iCkBAIC0yNSw3ICsyNCw3IEBACiAgKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFdlIHN0aXRjaCB1cCBhIHB0ZSwgc2ltaWxhciB0byBrbWFwX2F0b21pYy4KICAqLwogc3NpemVfdCBjb3B5X29sZG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuLCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHVzZXJidWYpCisJCXNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQogewogCXZvaWQgICp2YWRkcjsKIApAQCAtMzMsMTQgKzMyLDE2IEBACiAJCXJldHVybiAwOwogCiAJdmFkZHIgPSBpb3JlbWFwKHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX1NJWkUpOworCWlmICghdmFkZHIpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKHVzZXJidWYpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsICh2YWRkciArIG9mZnNldCksIGNzaXplKSkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgdmFkZHIgKyBvZmZzZXQsIGNzaXplKSkgewogCQkJaW91bm1hcCh2YWRkcik7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCX0gZWxzZQotCW1lbWNweShidWYsICh2YWRkciArIG9mZnNldCksIGNzaXplKTsKKwkJbWVtY3B5KGJ1ZiwgdmFkZHIgKyBvZmZzZXQsIGNzaXplKTsKIAogCWlvdW5tYXAodmFkZHIpOwogCXJldHVybiBjc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kb3VibGVmYXVsdF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2RvdWJsZWZhdWx0XzMyLmMKaW5kZXggYTQ3Nzk4Yi4uYjRmMTRjNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RvdWJsZWZhdWx0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RvdWJsZWZhdWx0XzMyLmMKQEAgLTY2LDYgKzY2LDYgQEAKIAkJLmRzCQk9IF9fVVNFUl9EUywKIAkJLmZzCQk9IF9fS0VSTkVMX1BFUkNQVSwKIAotCQkuX19jcjMJCT0gX19wYShzd2FwcGVyX3BnX2RpcikKKwkJLl9fY3IzCQk9IF9fcGFfbm9kZWJ1Zyhzd2FwcGVyX3BnX2RpciksCiAJfQogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kcy5jIGIvYXJjaC94ODYva2VybmVsL2RzLmMKaW5kZXggMTFjMTFiOC4uMmI2OTk5NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RzLmMKQEAgLTIsMjYgKzIsNDkgQEAKICAqIERlYnVnIFN0b3JlIHN1cHBvcnQKICAqCiAgKiBUaGlzIHByb3ZpZGVzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgaGFyZHdhcmUncyBEZWJ1ZyBTdG9yZQotICogZmVhdHVyZSB0aGF0IGlzIHVzZWQgZm9yIGxhc3QgYnJhbmNoIHJlY29yZGluZyAoTEJSKSBhbmQKKyAqIGZlYXR1cmUgdGhhdCBpcyB1c2VkIGZvciBicmFuY2ggdHJhY2Ugc3RvcmUgKEJUUykgYW5kCiAgKiBwcmVjaXNlLWV2ZW50IGJhc2VkIHNhbXBsaW5nIChQRUJTKS4KICAqCi0gKiBEaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyB1c2UgYSBkaWZmZXJlbnQgRFMgbGF5b3V0L3BvaW50ZXIgc2l6ZS4KLSAqIFRoZSBiZWxvdyBmdW5jdGlvbnMgdGhlcmVmb3JlIHdvcmsgb24gYSB2b2lkKi4KKyAqIEl0IG1hbmFnZXM6CisgKiAtIHBlci10aHJlYWQgYW5kIHBlci1jcHUgYWxsb2NhdGlvbiBvZiBCVFMgYW5kIFBFQlMKKyAqIC0gYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uIChvcHRpb25hbCkKKyAqIC0gYnVmZmVyIG92ZXJmbG93IGhhbmRsaW5nCisgKiAtIGJ1ZmZlciBhY2Nlc3MKKyAqCisgKiBJdCBhc3N1bWVzOgorICogLSBnZXRfdGFza19zdHJ1Y3Qgb24gYWxsIHBhcmFtZXRlciB0YXNrcworICogLSBjdXJyZW50IGlzIGFsbG93ZWQgdG8gdHJhY2UgcGFyYW1ldGVyIHRhc2tzCiAgKgogICoKLSAqIFNpbmNlIHRoZXJlIGlzIG5vIHVzZXIgZm9yIFBFQlMsIHlldCwgb25seSBMQlIgKG9yIGJyYW5jaAotICogdHJhY2Ugc3RvcmUsIEJUUykgaXMgc3VwcG9ydGVkLgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uCi0gKiBNYXJrdXMgTWV0emdlciA8bWFya3VzLnQubWV0emdlckBpbnRlbC5jb20+LCBEZWMgMjAwNworICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uCisgKiBNYXJrdXMgTWV0emdlciA8bWFya3VzLnQubWV0emdlckBpbnRlbC5jb20+LCAyMDA3LTIwMDgKICAqLwogCisKKyNpZmRlZiBDT05GSUdfWDg2X0RTCisKICNpbmNsdWRlIDxhc20vZHMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworCisvKgorICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgcGFydGljdWxhciBEUyBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24geworCS8qIHRoZSBzaXplIG9mIHRoZSBEUyBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyICBzaXplb2ZfZHM7CisJLyogdGhlIHNpemUgb2Ygb25lIHBvaW50ZXItdHlwZWQgZmllbGQgaW4gdGhlIERTIHN0cnVjdHVyZSBpbiBieXRlczsKKwkgICB0aGlzIGNvdmVycyB0aGUgZmlyc3QgOCBmaWVsZHMgcmVsYXRlZCB0byBidWZmZXIgbWFuYWdlbWVudC4gKi8KKwl1bnNpZ25lZCBjaGFyICBzaXplb2ZfZmllbGQ7CisJLyogdGhlIHNpemUgb2YgYSBCVFMvUEVCUyByZWNvcmQgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyICBzaXplb2ZfcmVjWzJdOworfTsKK3N0YXRpYyBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmc7CiAKIAogLyoKQEAgLTQ0LDM3OCArNjcsNzQ3IEBACiAgKiAgIChpbnRlcnJ1cHQgb2NjdXJzIHdoZW4gd3JpdGUgcG9pbnRlciBwYXNzZXMgaW50ZXJydXB0IHBvaW50ZXIpCiAgKiAtIHZhbHVlIHRvIHdoaWNoIGNvdW50ZXIgaXMgcmVzZXQgZm9sbG93aW5nIGNvdW50ZXIgb3ZlcmZsb3cKICAqCi0gKiBPbiBsYXRlciBhcmNoaXRlY3R1cmVzLCB0aGUgbGFzdCBicmFuY2ggcmVjb3JkaW5nIGhhcmR3YXJlIHVzZXMKLSAqIDY0Yml0IHBvaW50ZXJzIGV2ZW4gaW4gMzJiaXQgbW9kZS4KKyAqIExhdGVyIGFyY2hpdGVjdHVyZXMgdXNlIDY0Yml0IHBvaW50ZXJzIHRocm91Z2hvdXQsIHdoZXJlYXMgZWFybGllcgorICogYXJjaGl0ZWN0dXJlcyB1c2UgMzJiaXQgcG9pbnRlcnMgaW4gMzJiaXQgbW9kZS4KICAqCiAgKgotICogQnJhbmNoIFRyYWNlIFN0b3JlIChCVFMpIHJlY29yZHMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udHJvbAotICogZmxvdyBjaGFuZ2VzLiBUaGV5IGF0IGxlYXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSAqIC0gc291cmNlIGxpbmVhciBhZGRyZXNzCi0gKiAtIGRlc3RpbmF0aW9uIGxpbmVhciBhZGRyZXNzCisgKiBXZSBjb21wdXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBmaXJzdCA4IGZpZWxkcyBiYXNlZCBvbjoKKyAqIC0gdGhlIGZpZWxkIHNpemUgc3RvcmVkIGluIHRoZSBEUyBjb25maWd1cmF0aW9uCisgKiAtIHRoZSByZWxhdGl2ZSBmaWVsZCBwb3NpdGlvbgorICogLSBhbiBvZmZzZXQgZ2l2aW5nIHRoZSBzdGFydCBvZiB0aGUgcmVzcGVjdGl2ZSByZWdpb24KICAqCi0gKiBOZXRidXJzdCBzdXBwb3J0ZWQgYSBwcmVkaWNhdGVkIGJpdCB0aGF0IGhhZCBiZWVuIGRyb3BwZWQgaW4gbGF0ZXIKLSAqIGFyY2hpdGVjdHVyZXMuIFdlIGRvIG5vdCBzdXBwb3IgaXQuCisgKiBUaGlzIG9mZnNldCBpcyBmdXJ0aGVyIHVzZWQgdG8gaW5kZXggdmFyaW91cyBhcnJheXMgaG9sZGluZworICogaW5mb3JtYXRpb24gZm9yIEJUUyBhbmQgUEVCUyBhdCB0aGUgcmVzcGVjdGl2ZSBpbmRleC4KICAqCi0gKgotICogSW4gb3JkZXIgdG8gYWJzdHJhY3QgZnJvbSB0aGUgYWN0dWFsIERTIGFuZCBCVFMgbGF5b3V0LCB3ZSBkZXNjcmliZQotICogdGhlIGFjY2VzcyB0byB0aGUgcmVsZXZhbnQgZmllbGRzLgotICogVGhhbmtzIHRvIEFuZGkgS2xlZW4gZm9yIHByb3Bvc2luZyB0aGlzIGRlc2lnbi4KLSAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24sIGhvd2V2ZXIsIGlzIG5vdCBhcyBnZW5lcmFsIGFzIGl0IG1pZ2h0IHNlZW0uIEluCi0gKiBvcmRlciB0byBzdGF5IHNvbWV3aGF0IHNpbXBsZSBhbmQgZWZmaWNpZW50LCB3ZSBhc3N1bWUgYW4KLSAqIHVuZGVybHlpbmcgdW5zaWduZWQgdHlwZSAobW9zdGx5IGEgcG9pbnRlciB0eXBlKSBhbmQgd2UgZXhwZWN0IHRoZQotICogZmllbGQgdG8gYmUgYXQgbGVhc3QgYXMgYmlnIGFzIHRoYXQgdHlwZS4KKyAqIE9uIGxhdGVyIDMyYml0IHByb2Nlc3NvcnMsIHdlIG9ubHkgYWNjZXNzIHRoZSBsb3dlciAzMmJpdCBvZiB0aGUKKyAqIDY0Yml0IHBvaW50ZXIgZmllbGRzLiBUaGUgdXBwZXIgaGFsdmVzIHdpbGwgYmUgemVyb2VkIG91dC4KICAqLwogCi0vKgotICogQSBzcGVjaWFsIGZyb21faXAgYWRkcmVzcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBCVFMgcmVjb3JkIGlzIGFuCi0gKiBpbmZvIHJlY29yZCB0aGF0IG5lZWRzIHRvIGJlIGludGVycHJldGVkIG9yIHNraXBwZWQuCi0gKi8KLSNkZWZpbmUgQlRTX0VTQ0FQRV9BRERSRVNTICgtMSkKLQotLyoKLSAqIEEgZmllbGQgYWNjZXNzIGRlc2NyaXB0b3IKLSAqLwotc3RydWN0IGFjY2Vzc19kZXNjIHsKLQl1bnNpZ25lZCBjaGFyIG9mZnNldDsKLQl1bnNpZ25lZCBjaGFyIHNpemU7CitlbnVtIGRzX2ZpZWxkIHsKKwlkc19idWZmZXJfYmFzZSA9IDAsCisJZHNfaW5kZXgsCisJZHNfYWJzb2x1dGVfbWF4aW11bSwKKwlkc19pbnRlcnJ1cHRfdGhyZXNob2xkLAogfTsKIAotLyoKLSAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgRFMvQlRTIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uLgotICovCi1zdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiB7Ci0JLyogdGhlIERTIGNvbmZpZ3VyYXRpb24gKi8KLQl1bnNpZ25lZCBjaGFyICBzaXplb2ZfZHM7Ci0Jc3RydWN0IGFjY2Vzc19kZXNjIGJ0c19idWZmZXJfYmFzZTsKLQlzdHJ1Y3QgYWNjZXNzX2Rlc2MgYnRzX2luZGV4OwotCXN0cnVjdCBhY2Nlc3NfZGVzYyBidHNfYWJzb2x1dGVfbWF4aW11bTsKLQlzdHJ1Y3QgYWNjZXNzX2Rlc2MgYnRzX2ludGVycnVwdF90aHJlc2hvbGQ7Ci0JLyogdGhlIEJUUyBjb25maWd1cmF0aW9uICovCi0JdW5zaWduZWQgY2hhciAgc2l6ZW9mX2J0czsKLQlzdHJ1Y3QgYWNjZXNzX2Rlc2MgZnJvbV9pcDsKLQlzdHJ1Y3QgYWNjZXNzX2Rlc2MgdG9faXA7Ci0JLyogQlRTIHZhcmlhbnRzIHVzZWQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlCi0JICAgdGltZXN0YW1wcyAqLwotCXN0cnVjdCBhY2Nlc3NfZGVzYyBpbmZvX3R5cGU7Ci0Jc3RydWN0IGFjY2Vzc19kZXNjIGluZm9fZGF0YTsKLQl1bnNpZ25lZCBsb25nIGRlYnVnY3RsX21hc2s7CitlbnVtIGRzX3F1YWxpZmllciB7CisJZHNfYnRzICA9IDAsCisJZHNfcGVicwogfTsKIAotLyoKLSAqIFRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSBiZWxvdyBhY2Nlc3NvciBmdW5jdGlvbnMKLSAqLwotc3RhdGljIHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZzsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkc19nZXQoY29uc3QgdW5zaWduZWQgY2hhciAqYmFzZSwKKwkJCQkgICBlbnVtIGRzX3F1YWxpZmllciBxdWFsLCBlbnVtIGRzX2ZpZWxkIGZpZWxkKQoreworCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfZmllbGQgKiAoZmllbGQgKyAoNCAqIHF1YWwpKSk7CisJcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKWJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc19zZXQodW5zaWduZWQgY2hhciAqYmFzZSwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwKKwkJCSAgZW51bSBkc19maWVsZCBmaWVsZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwliYXNlICs9IChkc19jZmcuc2l6ZW9mX2ZpZWxkICogKGZpZWxkICsgKDQgKiBxdWFsKSkpOworCSgqKHVuc2lnbmVkIGxvbmcgKiliYXNlKSA9IHZhbHVlOworfQorCiAKIC8qCi0gKiBBY2Nlc3NvciBmdW5jdGlvbnMgZm9yIHNvbWUgRFMgYW5kIEJUUyBmaWVsZHMgdXNpbmcgdGhlIGFib3ZlCi0gKiBnbG9iYWwgcHRyYWNlX2J0c19jZmcuCisgKiBMb2NraW5nIGlzIGRvbmUgb25seSBmb3IgYWxsb2NhdGluZyBCVFMgb3IgUEVCUyByZXNvdXJjZXMgYW5kIGZvcgorICogZ3VhcmRpbmcgY29udGV4dCBhbmQgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIE1vc3QgZnVuY3Rpb25zIHJlcXVpcmUgdGhlIGN1cnJlbnQgdGFzayB0byBvd24gdGhlIGRzIGNvbnRleHQgcGFydAorICogdGhleSBhcmUgZ29pbmcgdG8gYWNjZXNzLiBBbGwgdGhlIGxvY2tpbmcgaXMgZG9uZSB3aGVuIHZhbGlkYXRpbmcKKyAqIGFjY2VzcyB0byB0aGUgY29udGV4dC4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9idHNfYnVmZmVyX2Jhc2UoY2hhciAqYmFzZSkKLXsKLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopKGJhc2UgKyBkc19jZmcuYnRzX2J1ZmZlcl9iYXNlLm9mZnNldCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J0c19idWZmZXJfYmFzZShjaGFyICpiYXNlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCSgqKHVuc2lnbmVkIGxvbmcgKikoYmFzZSArIGRzX2NmZy5idHNfYnVmZmVyX2Jhc2Uub2Zmc2V0KSkgPSB2YWx1ZTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfYnRzX2luZGV4KGNoYXIgKmJhc2UpCi17Ci0JcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmJ0c19pbmRleC5vZmZzZXQpOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9idHNfaW5kZXgoY2hhciAqYmFzZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQkoKih1bnNpZ25lZCBsb25nICopKGJhc2UgKyBkc19jZmcuYnRzX2luZGV4Lm9mZnNldCkpID0gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2J0c19hYnNvbHV0ZV9tYXhpbXVtKGNoYXIgKmJhc2UpCi17Ci0JcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmJ0c19hYnNvbHV0ZV9tYXhpbXVtLm9mZnNldCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J0c19hYnNvbHV0ZV9tYXhpbXVtKGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JKCoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmJ0c19hYnNvbHV0ZV9tYXhpbXVtLm9mZnNldCkpID0gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2J0c19pbnRlcnJ1cHRfdGhyZXNob2xkKGNoYXIgKmJhc2UpCi17Ci0JcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkLm9mZnNldCk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2J0c19pbnRlcnJ1cHRfdGhyZXNob2xkKGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JKCoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkLm9mZnNldCkpID0gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2Zyb21faXAoY2hhciAqYmFzZSkKLXsKLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopKGJhc2UgKyBkc19jZmcuZnJvbV9pcC5vZmZzZXQpOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9mcm9tX2lwKGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JKCoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmZyb21faXAub2Zmc2V0KSkgPSB2YWx1ZTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdG9faXAoY2hhciAqYmFzZSkKLXsKLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopKGJhc2UgKyBkc19jZmcudG9faXAub2Zmc2V0KTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdG9faXAoY2hhciAqYmFzZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQkoKih1bnNpZ25lZCBsb25nICopKGJhc2UgKyBkc19jZmcudG9faXAub2Zmc2V0KSkgPSB2YWx1ZTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBnZXRfaW5mb190eXBlKGNoYXIgKmJhc2UpCi17Ci0JcmV0dXJuICoodW5zaWduZWQgY2hhciAqKShiYXNlICsgZHNfY2ZnLmluZm9fdHlwZS5vZmZzZXQpOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9pbmZvX3R5cGUoY2hhciAqYmFzZSwgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQkoKih1bnNpZ25lZCBjaGFyICopKGJhc2UgKyBkc19jZmcuaW5mb190eXBlLm9mZnNldCkpID0gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2luZm9fZGF0YShjaGFyICpiYXNlKQotewotCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikoYmFzZSArIGRzX2NmZy5pbmZvX2RhdGEub2Zmc2V0KTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW5mb19kYXRhKGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JKCoodW5zaWduZWQgbG9uZyAqKShiYXNlICsgZHNfY2ZnLmluZm9fZGF0YS5vZmZzZXQpKSA9IHZhbHVlOwotfQorc3RhdGljIHNwaW5sb2NrX3QgZHNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRzX2xvY2spOwogCi0KLWludCBkc19hbGxvY2F0ZSh2b2lkICoqZHNwLCBzaXplX3QgYnRzX3NpemVfaW5fYnl0ZXMpCisvKgorICogVmFsaWRhdGUgdGhhdCB0aGUgY3VycmVudCB0YXNrIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBCVFMvUEVCUworICogYnVmZmVyIG9mIHRoZSBwYXJhbWV0ZXIgdGFzay4KKyAqCisgKiBSZXR1cm5zIDAsIGlmIGFjY2VzcyBpcyBncmFudGVkOyAtRWVycm5vLCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRzX3ZhbGlkYXRlX2FjY2VzcyhzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCwKKwkJCQkgICAgIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwpCiB7Ci0Jc2l6ZV90IGJ0c19zaXplX2luX3JlY29yZHM7Ci0JdW5zaWduZWQgbG9uZyBidHM7Ci0Jdm9pZCAqZHM7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCFkc19jZmcuc2l6ZW9mX2RzIHx8ICFkc19jZmcuc2l6ZW9mX2J0cykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGJ0c19zaXplX2luX2J5dGVzIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlidHNfc2l6ZV9pbl9yZWNvcmRzID0KLQkJYnRzX3NpemVfaW5fYnl0ZXMgLyBkc19jZmcuc2l6ZW9mX2J0czsKLQlidHNfc2l6ZV9pbl9ieXRlcyA9Ci0JCWJ0c19zaXplX2luX3JlY29yZHMgKiBkc19jZmcuc2l6ZW9mX2J0czsKLQotCWlmIChidHNfc2l6ZV9pbl9ieXRlcyA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ0cyA9ICh1bnNpZ25lZCBsb25nKWt6YWxsb2MoYnRzX3NpemVfaW5fYnl0ZXMsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFidHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZHMgPSBremFsbG9jKGRzX2NmZy5zaXplb2ZfZHMsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkcykgewotCQlrZnJlZSgodm9pZCAqKWJ0cyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNldF9idHNfYnVmZmVyX2Jhc2UoZHMsIGJ0cyk7Ci0Jc2V0X2J0c19pbmRleChkcywgYnRzKTsKLQlzZXRfYnRzX2Fic29sdXRlX21heGltdW0oZHMsIGJ0cyArIGJ0c19zaXplX2luX2J5dGVzKTsKLQlzZXRfYnRzX2ludGVycnVwdF90aHJlc2hvbGQoZHMsIGJ0cyArIGJ0c19zaXplX2luX2J5dGVzICsgMSk7Ci0KLQkqZHNwID0gZHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkc19mcmVlKHZvaWQgKipkc3ApCi17Ci0JaWYgKCpkc3ApIHsKLQkJa2ZyZWUoKHZvaWQgKilnZXRfYnRzX2J1ZmZlcl9iYXNlKCpkc3ApKTsKLQkJa2ZyZWUoKmRzcCk7Ci0JCSpkc3AgPSBOVUxMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRzX2dldF9idHNfc2l6ZSh2b2lkICpkcykKLXsKLQlpbnQgc2l6ZV9pbl9ieXRlczsKLQotCWlmICghZHNfY2ZnLnNpemVvZl9kcyB8fCAhZHNfY2ZnLnNpemVvZl9idHMpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmICghZHMpCisJaWYgKGNvbnRleHQtPm93bmVyW3F1YWxdID09IGN1cnJlbnQpCiAJCXJldHVybiAwOwogCi0Jc2l6ZV9pbl9ieXRlcyA9Ci0JCWdldF9idHNfYWJzb2x1dGVfbWF4aW11bShkcykgLQotCQlnZXRfYnRzX2J1ZmZlcl9iYXNlKGRzKTsKLQlyZXR1cm4gc2l6ZV9pbl9ieXRlczsKKwlyZXR1cm4gLUVQRVJNOwogfQogCi1pbnQgZHNfZ2V0X2J0c19lbmQodm9pZCAqZHMpCisKKy8qCisgKiBXZSBlaXRoZXIgc3VwcG9ydCAoc3lzdGVtLXdpZGUpIHBlci1jcHUgb3IgcGVyLXRocmVhZCBhbGxvY2F0aW9uLgorICogV2UgZGlzdGluZ3Vpc2ggdGhlIHR3byBiYXNlZCBvbiB0aGUgdGFza19zdHJ1Y3QgcG9pbnRlciwgd2hlcmUgYQorICogTlVMTCBwb2ludGVyIGluZGljYXRlcyBwZXItY3B1IGFsbG9jYXRpb24gZm9yIHRoZSBjdXJyZW50IGNwdS4KKyAqCisgKiBBbGxvY2F0aW9ucyBhcmUgdXNlLWNvdW50ZWQuIEFzIHNvb24gYXMgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQsCisgKiBmdXJ0aGVyIGFsbG9jYXRpb25zIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSAocGVyLWNwdSBvcgorICogcGVyLXRocmVhZCkuIFdlIG1vZGVsIHRoaXMgYnkgY291bnRpbmcgYWxsb2NhdGlvbnMgKGkuZS4gdGhlIG51bWJlcgorICogb2YgdHJhY2VycyBvZiBhIGNlcnRhaW4gdHlwZSkgZm9yIG9uZSB0eXBlIG5lZ2F0aXZlbHk6CisgKiAgID0wICBubyB0cmFjZXJzCisgKiAgID4wICBudW1iZXIgb2YgcGVyLXRocmVhZCB0cmFjZXJzCisgKiAgIDwwICBudW1iZXIgb2YgcGVyLWNwdSB0cmFjZXJzCisgKgorICogVGhlIGJlbG93IGZ1bmN0aW9ucyB0byBnZXQgYW5kIHB1dCB0cmFjZXJzIGFuZCB0byBjaGVjayB0aGUKKyAqIGFsbG9jYXRpb24gdHlwZSByZXF1aXJlIHRoZSBkc19sb2NrIHRvIGJlIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBUcmFjZXJzIGVzc2VudGlhbGx5IGdpdmVzIHRoZSBudW1iZXIgb2YgZHMgY29udGV4dHMgZm9yIGEgY2VydGFpbgorICogdHlwZSBvZiBhbGxvY2F0aW9uLgorICovCitzdGF0aWMgbG9uZyB0cmFjZXJzOworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaW50IHNpemVfaW5fYnl0ZXMgPSBkc19nZXRfYnRzX3NpemUoZHMpOwotCi0JaWYgKHNpemVfaW5fYnl0ZXMgPD0gMCkKLQkJcmV0dXJuIHNpemVfaW5fYnl0ZXM7Ci0KLQlyZXR1cm4gc2l6ZV9pbl9ieXRlcyAvIGRzX2NmZy5zaXplb2ZfYnRzOworCXRyYWNlcnMgKz0gKHRhc2sgPyAxIDogLTEpOwogfQogCi1pbnQgZHNfZ2V0X2J0c19pbmRleCh2b2lkICpkcykKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHJhY2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlpbnQgaW5kZXhfb2Zmc2V0X2luX2J5dGVzOwotCi0JaWYgKCFkc19jZmcuc2l6ZW9mX2RzIHx8ICFkc19jZmcuc2l6ZW9mX2J0cykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaW5kZXhfb2Zmc2V0X2luX2J5dGVzID0KLQkJZ2V0X2J0c19pbmRleChkcykgLQotCQlnZXRfYnRzX2J1ZmZlcl9iYXNlKGRzKTsKLQotCXJldHVybiBpbmRleF9vZmZzZXRfaW5fYnl0ZXMgLyBkc19jZmcuc2l6ZW9mX2J0czsKKwl0cmFjZXJzIC09ICh0YXNrID8gMSA6IC0xKTsKIH0KIAotaW50IGRzX3NldF9vdmVyZmxvdyh2b2lkICpkcywgaW50IG1ldGhvZCkKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3dpdGNoIChtZXRob2QpIHsKLQljYXNlIERTX09fU0lHTkFMOgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JY2FzZSBEU19PX1dSQVA6Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlyZXR1cm4gKHRhc2sgPyAodHJhY2VycyA+PSAwKSA6ICh0cmFjZXJzIDw9IDApKTsKIH0KIAotaW50IGRzX2dldF9vdmVyZmxvdyh2b2lkICpkcykKKworLyoKKyAqIFRoZSBEUyBjb250ZXh0IGlzIGVpdGhlciBhdHRhY2hlZCB0byBhIHRocmVhZCBvciB0byBhIGNwdToKKyAqIC0gaW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdGhyZWFkX3N0cnVjdCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgIGF0dGFjaGVkIGNvbnRleHQuCisgKiAtIGluIHRoZSBsYXR0ZXIgY2FzZSwgd2UgdXNlIGEgc3RhdGljIGFycmF5IG9mIHBlci1jcHUgY29udGV4dAorICogICBwb2ludGVycy4KKyAqCisgKiBDb250ZXh0cyBhcmUgdXNlLWNvdW50ZWQuIFRoZXkgYXJlIGFsbG9jYXRlZCBvbiBmaXJzdCBhY2Nlc3MgYW5kCisgKiBkZWFsbG9jYXRlZCB3aGVuIHRoZSBsYXN0IHVzZXIgcHV0cyB0aGUgY29udGV4dC4KKyAqCisgKiBXZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIGFsbG9jYXRpbmcgYW5kIGEgbm9uLWFsbG9jYXRpbmcgZ2V0IG9mIGEKKyAqIGNvbnRleHQ6CisgKiAtIHRoZSBhbGxvY2F0aW5nIGdldCBpcyB1c2VkIGZvciByZXF1ZXN0aW5nIEJUUy9QRUJTIHJlc291cmNlcy4gSXQKKyAqICAgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBob2xkIHRoZSBnbG9iYWwgZHNfbG9jay4KKyAqIC0gdGhlIG5vbi1hbGxvY2F0aW5nIGdldCBpcyB1c2VkIGZvciBhbGwgb3RoZXIgY2FzZXMuIEEKKyAqICAgbm9uLWV4aXN0aW5nIGNvbnRleHQgaW5kaWNhdGVzIGFuIGVycm9yLiBJdCBhY3F1aXJlcyBhbmQgcmVsZWFzZXMKKyAqICAgdGhlIGRzX2xvY2sgaXRzZWxmIGZvciBvYnRhaW5pbmcgdGhlIGNvbnRleHQuCisgKgorICogQSBjb250ZXh0IGFuZCBpdHMgRFMgY29uZmlndXJhdGlvbiBhcmUgYWxsb2NhdGVkIGFuZCBkZWFsbG9jYXRlZAorICogdG9nZXRoZXIuIEEgY29udGV4dCBhbHdheXMgaGFzIGEgRFMgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAqIGFwcHJvcHJpYXRlIHNpemUuCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZHNfY29udGV4dCAqLCBzeXN0ZW1fY29udGV4dCk7CisKKyNkZWZpbmUgdGhpc19zeXN0ZW1fY29udGV4dCBwZXJfY3B1KHN5c3RlbV9jb250ZXh0LCBzbXBfcHJvY2Vzc29yX2lkKCkpCisKKy8qCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIgdGFzaydzIGNvbnRleHQgb3IgdG8gdGhlCisgKiBzeXN0ZW0td2lkZSBjb250ZXh0LCBpZiB0YXNrIGlzIE5VTEwuCisgKgorICogSW5jcmVhc2VzIHRoZSB1c2UgY291bnQgb2YgdGhlIHJldHVybmVkIGNvbnRleHQsIGlmIG5vdCBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkc19jb250ZXh0ICpkc19nZXRfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JcmV0dXJuIERTX09fV1JBUDsKKwlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dDsKKworCXNwaW5fbG9jaygmZHNfbG9jayk7CisKKwljb250ZXh0ID0gKHRhc2sgPyB0YXNrLT50aHJlYWQuZHNfY3R4IDogdGhpc19zeXN0ZW1fY29udGV4dCk7CisJaWYgKGNvbnRleHQpCisJCWNvbnRleHQtPmNvdW50Kys7CisKKwlzcGluX3VubG9jaygmZHNfbG9jayk7CisKKwlyZXR1cm4gY29udGV4dDsKIH0KIAotaW50IGRzX2NsZWFyKHZvaWQgKmRzKQorLyoKKyAqIFNhbWUgYXMgZHNfZ2V0X2NvbnRleHQsIGJ1dCBhbGxvY2F0ZXMgdGhlIGNvbnRleHQgYW5kIGl0J3MgRFMKKyAqIHN0cnVjdHVyZSwgaWYgbmVjZXNzYXJ5OyByZXR1cm5zIE5VTEw7IGlmIG91dCBvZiBtZW1vcnkuCisgKgorICogcHJlOiByZXF1aXJlcyBkc19sb2NrIHRvIGJlIGhlbGQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHNfY29udGV4dCAqZHNfYWxsb2NfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaW50IGJ0c19zaXplID0gZHNfZ2V0X2J0c19zaXplKGRzKTsKLQl1bnNpZ25lZCBsb25nIGJ0c19iYXNlOworCXN0cnVjdCBkc19jb250ZXh0ICoqcF9jb250ZXh0ID0KKwkJKHRhc2sgPyAmdGFzay0+dGhyZWFkLmRzX2N0eCA6ICZ0aGlzX3N5c3RlbV9jb250ZXh0KTsKKwlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCA9ICpwX2NvbnRleHQ7CiAKLQlpZiAoYnRzX3NpemUgPD0gMCkKLQkJcmV0dXJuIGJ0c19zaXplOworCWlmICghY29udGV4dCkgeworCQljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAotCWJ0c19iYXNlID0gZ2V0X2J0c19idWZmZXJfYmFzZShkcyk7Ci0JbWVtc2V0KCh2b2lkICopYnRzX2Jhc2UsIDAsIGJ0c19zaXplKTsKKwkJaWYgKCFjb250ZXh0KQorCQkJcmV0dXJuIE5VTEw7CiAKLQlzZXRfYnRzX2luZGV4KGRzLCBidHNfYmFzZSk7Ci0JcmV0dXJuIDA7Ci19CisJCWNvbnRleHQtPmRzID0ga3phbGxvYyhkc19jZmcuc2l6ZW9mX2RzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjb250ZXh0LT5kcykgeworCQkJa2ZyZWUoY29udGV4dCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCi1pbnQgZHNfcmVhZF9idHModm9pZCAqZHMsIGludCBpbmRleCwgc3RydWN0IGJ0c19zdHJ1Y3QgKm91dCkKLXsKLQl2b2lkICpidHM7CisJCSpwX2NvbnRleHQgPSBjb250ZXh0OwogCi0JaWYgKCFkc19jZmcuc2l6ZW9mX2RzIHx8ICFkc19jZmcuc2l6ZW9mX2J0cykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQljb250ZXh0LT50aGlzID0gcF9jb250ZXh0OworCQljb250ZXh0LT50YXNrID0gdGFzazsKIAotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlpZiAodGFzaykKKwkJCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RTX0FSRUFfTVNSKTsKIAotCWlmIChpbmRleCA+PSBkc19nZXRfYnRzX3NpemUoZHMpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF0YXNrIHx8ICh0YXNrID09IGN1cnJlbnQpKQorCQkJd3Jtc3IoTVNSX0lBMzJfRFNfQVJFQSwgKHVuc2lnbmVkIGxvbmcpY29udGV4dC0+ZHMsIDApOwogCi0JYnRzID0gKHZvaWQgKikoZ2V0X2J0c19idWZmZXJfYmFzZShkcykgKyAoaW5kZXggKiBkc19jZmcuc2l6ZW9mX2J0cykpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKCpvdXQpKTsKLQlpZiAoZ2V0X2Zyb21faXAoYnRzKSA9PSBCVFNfRVNDQVBFX0FERFJFU1MpIHsKLQkJb3V0LT5xdWFsaWZpZXIgICAgICAgPSBnZXRfaW5mb190eXBlKGJ0cyk7Ci0JCW91dC0+dmFyaWFudC5qaWZmaWVzID0gZ2V0X2luZm9fZGF0YShidHMpOwotCX0gZWxzZSB7Ci0JCW91dC0+cXVhbGlmaWVyID0gQlRTX0JSQU5DSDsKLQkJb3V0LT52YXJpYW50Lmxici5mcm9tX2lwID0gZ2V0X2Zyb21faXAoYnRzKTsKLQkJb3V0LT52YXJpYW50Lmxici50b19pcCAgID0gZ2V0X3RvX2lwKGJ0cyk7CisJCWdldF90cmFjZXIodGFzayk7CiAJfQogCi0JcmV0dXJuIHNpemVvZigqb3V0KTs7CisJY29udGV4dC0+Y291bnQrKzsKKworCXJldHVybiBjb250ZXh0OwogfQogCi1pbnQgZHNfd3JpdGVfYnRzKHZvaWQgKmRzLCBjb25zdCBzdHJ1Y3QgYnRzX3N0cnVjdCAqaW4pCisvKgorICogRGVjcmVhc2VzIHRoZSB1c2UgY291bnQgb2YgdGhlIHBhcmFtZXRlciBjb250ZXh0LCBpZiBub3QgTlVMTC4KKyAqIERlYWxsb2NhdGVzIHRoZSBjb250ZXh0LCBpZiB0aGUgdXNlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRzX3B1dF9jb250ZXh0KHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0KQogewotCXVuc2lnbmVkIGxvbmcgYnRzOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOwogCi0JaWYgKCFkc19jZmcuc2l6ZW9mX2RzIHx8ICFkc19jZmcuc2l6ZW9mX2J0cykKKwlzcGluX2xvY2soJmRzX2xvY2spOworCisJaWYgKC0tY29udGV4dC0+Y291bnQpCisJCWdvdG8gb3V0OworCisJKihjb250ZXh0LT50aGlzKSA9IE5VTEw7CisKKwlpZiAoY29udGV4dC0+dGFzaykKKwkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNvbnRleHQtPnRhc2ssIFRJRl9EU19BUkVBX01TUik7CisKKwlpZiAoIWNvbnRleHQtPnRhc2sgfHwgKGNvbnRleHQtPnRhc2sgPT0gY3VycmVudCkpCisJCXdybXNybChNU1JfSUEzMl9EU19BUkVBLCAwKTsKKworCXB1dF90cmFjZXIoY29udGV4dC0+dGFzayk7CisKKwkvKiBmcmVlIGFueSBsZWZ0b3ZlciBidWZmZXJzIGZyb20gdHJhY2VycyB0aGF0IGRpZCBub3QKKwkgKiBkZWFsbG9jYXRlIHRoZW0gcHJvcGVybHkuICovCisJa2ZyZWUoY29udGV4dC0+YnVmZmVyW2RzX2J0c10pOworCWtmcmVlKGNvbnRleHQtPmJ1ZmZlcltkc19wZWJzXSk7CisJa2ZyZWUoY29udGV4dC0+ZHMpOworCWtmcmVlKGNvbnRleHQpOworIG91dDoKKwlzcGluX3VubG9jaygmZHNfbG9jayk7Cit9CisKKworLyoKKyAqIEhhbmRsZSBhIGJ1ZmZlciBvdmVyZmxvdworICoKKyAqIHRhc2s6IHRoZSB0YXNrIHdob3NlIGJ1ZmZlcnMgYXJlIG92ZXJmbG93aW5nOworICogICAgICAgTlVMTCBmb3IgYSBidWZmZXIgb3ZlcmZsb3cgb24gdGhlIGN1cnJlbnQgY3B1CisgKiBjb250ZXh0OiB0aGUgZHMgY29udGV4dAorICogcXVhbDogdGhlIGJ1ZmZlciB0eXBlCisgKi8KK3N0YXRpYyB2b2lkIGRzX292ZXJmbG93KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQsCisJCQllbnVtIGRzX3F1YWxpZmllciBxdWFsKQoreworCWlmICghY29udGV4dCkKKwkJcmV0dXJuOworCisJaWYgKGNvbnRleHQtPmNhbGxiYWNrW3F1YWxdKQorCQkoKmNvbnRleHQtPmNhbGxiYWNrW3F1YWxdKSh0YXNrKTsKKworCS8qIHRvZG86IGRvIHNvbWUgbW9yZSBvdmVyZmxvdyBoYW5kbGluZyAqLworfQorCisKKy8qCisgKiBBbGxvY2F0ZSBhIG5vbi1wYWdlYWJsZSBidWZmZXIgb2YgdGhlIHBhcmFtZXRlciBzaXplLgorICogQ2hlY2tzIHRoZSBtZW1vcnkgYW5kIHRoZSBsb2NrZWQgbWVtb3J5IHJsaW1pdC4KKyAqCisgKiBSZXR1cm5zIHRoZSBidWZmZXIsIGlmIHN1Y2Nlc3NmdWw7CisgKiAgICAgICAgIE5VTEwsIGlmIG91dCBvZiBtZW1vcnkgb3IgcmxpbWl0IGV4Y2VlZGVkLgorICoKKyAqIHNpemU6IHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIHBhZ2VzIChvdXQpOiBpZiBub3QgTlVMTCwgY29udGFpbnMgdGhlIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmRzX2FsbG9jYXRlX2J1ZmZlcihzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50ICpwYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIHJsaW0sIHZtLCBwZ3N6OworCXZvaWQgKmJ1ZmZlcjsKKworCXBnc3ogPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CisKKwlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9BU10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKKwl2bSAgID0gY3VycmVudC0+bW0tPnRvdGFsX3ZtICArIHBnc3o7CisJaWYgKHJsaW0gPCB2bSkKKwkJcmV0dXJuIE5VTEw7CisKKwlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOworCXZtICAgPSBjdXJyZW50LT5tbS0+bG9ja2VkX3ZtICArIHBnc3o7CisJaWYgKHJsaW0gPCB2bSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gTlVMTDsKKworCWN1cnJlbnQtPm1tLT50b3RhbF92bSAgKz0gcGdzejsKKwljdXJyZW50LT5tbS0+bG9ja2VkX3ZtICs9IHBnc3o7CisKKwlpZiAocGFnZXMpCisJCSpwYWdlcyA9IHBnc3o7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50IGRzX3JlcXVlc3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgZHNfb3ZmbF9jYWxsYmFja190IG92ZmwsIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwpCit7CisJc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBidWZmZXIsIGFkajsKKwljb25zdCB1bnNpZ25lZCBsb25nIGFsaWdubWVudCA9ICgxIDw8IDMpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIWRzX2NmZy5zaXplb2ZfZHMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChkc19nZXRfYnRzX3NpemUoZHMpIDw9IDApCi0JCXJldHVybiAtRU5YSU87Ci0KLQlidHMgPSBnZXRfYnRzX2luZGV4KGRzKTsKLQotCW1lbXNldCgodm9pZCAqKWJ0cywgMCwgZHNfY2ZnLnNpemVvZl9idHMpOwotCXN3aXRjaCAoaW4tPnF1YWxpZmllcikgewotCWNhc2UgQlRTX0lOVkFMSUQ6Ci0JCWJyZWFrOwotCi0JY2FzZSBCVFNfQlJBTkNIOgotCQlzZXRfZnJvbV9pcCgodm9pZCAqKWJ0cywgaW4tPnZhcmlhbnQubGJyLmZyb21faXApOwotCQlzZXRfdG9faXAoKHZvaWQgKilidHMsIGluLT52YXJpYW50Lmxici50b19pcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBCVFNfVEFTS19BUlJJVkVTOgotCWNhc2UgQlRTX1RBU0tfREVQQVJUUzoKLQkJc2V0X2Zyb21faXAoKHZvaWQgKilidHMsIEJUU19FU0NBUEVfQUREUkVTUyk7Ci0JCXNldF9pbmZvX3R5cGUoKHZvaWQgKilidHMsIGluLT5xdWFsaWZpZXIpOwotCQlzZXRfaW5mb19kYXRhKCh2b2lkICopYnRzLCBpbi0+dmFyaWFudC5qaWZmaWVzKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgorCS8qIHdlIHJlcXVpcmUgc29tZSBzcGFjZSB0byBkbyBhbGlnbm1lbnQgYWRqdXN0bWVudHMgYmVsb3cgKi8KKwlpZiAoc2l6ZSA8IChhbGlnbm1lbnQgKyBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXSkpCiAJCXJldHVybiAtRUlOVkFMOworCisJLyogYnVmZmVyIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCisJaWYgKG92ZmwpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCisJc3Bpbl9sb2NrKCZkc19sb2NrKTsKKworCWlmICghY2hlY2tfdHJhY2VyKHRhc2spKQorCQlyZXR1cm4gLUVQRVJNOworCisJZXJyb3IgPSAtRU5PTUVNOworCWNvbnRleHQgPSBkc19hbGxvY19jb250ZXh0KHRhc2spOworCWlmICghY29udGV4dCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyb3IgPSAtRUFMUkVBRFk7CisJaWYgKGNvbnRleHQtPm93bmVyW3F1YWxdID09IGN1cnJlbnQpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoY29udGV4dC0+b3duZXJbcXVhbF0gIT0gTlVMTCkKKwkJZ290byBvdXRfdW5sb2NrOworCWNvbnRleHQtPm93bmVyW3F1YWxdID0gY3VycmVudDsKKworCXNwaW5fdW5sb2NrKCZkc19sb2NrKTsKKworCisJZXJyb3IgPSAtRU5PTUVNOworCWlmICghYmFzZSkgeworCQliYXNlID0gZHNfYWxsb2NhdGVfYnVmZmVyKHNpemUsICZjb250ZXh0LT5wYWdlc1txdWFsXSk7CisJCWlmICghYmFzZSkKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisKKwkJY29udGV4dC0+YnVmZmVyW3F1YWxdICAgPSBiYXNlOworCX0KKwllcnJvciA9IDA7CisKKwljb250ZXh0LT5jYWxsYmFja1txdWFsXSA9IG92Zmw7CisKKwkvKiBhZGp1c3QgdGhlIGJ1ZmZlciBhZGRyZXNzIGFuZCBzaXplIHRvIG1lZXQgYWxpZ25tZW50CisJICogY29uc3RyYWludHM6CisJICogLSBidWZmZXIgaXMgZG91YmxlLXdvcmQgYWxpZ25lZAorCSAqIC0gc2l6ZSBpcyBtdWx0aXBsZSBvZiByZWNvcmQgc2l6ZQorCSAqCisJICogV2UgY2hlY2tlZCB0aGUgc2l6ZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmc7IHdlIGhhdmUgZW5vdWdoCisJICogc3BhY2UgdG8gZG8gdGhlIGFkanVzdG1lbnQuCisJICovCisJYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKworCWFkaiA9IEFMSUdOKGJ1ZmZlciwgYWxpZ25tZW50KSAtIGJ1ZmZlcjsKKwlidWZmZXIgKz0gYWRqOworCXNpemUgICAtPSBhZGo7CisKKwlzaXplIC89IGRzX2NmZy5zaXplb2ZfcmVjW3F1YWxdOworCXNpemUgKj0gZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF07CisKKwlkc19zZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2J1ZmZlcl9iYXNlLCBidWZmZXIpOworCWRzX3NldChjb250ZXh0LT5kcywgcXVhbCwgZHNfaW5kZXgsIGJ1ZmZlcik7CisJZHNfc2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19hYnNvbHV0ZV9tYXhpbXVtLCBidWZmZXIgKyBzaXplKTsKKworCWlmIChvdmZsKSB7CisJCS8qIHRvZG86IHNlbGVjdCBhIHN1aXRhYmxlIGludGVycnVwdCB0aHJlc2hvbGQgKi8KKwl9IGVsc2UKKwkJZHNfc2V0KGNvbnRleHQtPmRzLCBxdWFsLAorCQkgICAgICAgZHNfaW50ZXJydXB0X3RocmVzaG9sZCwgYnVmZmVyICsgc2l6ZSArIDEpOworCisJLyogd2Uga2VlcCB0aGUgY29udGV4dCB1bnRpbCBkc19yZWxlYXNlICovCisJcmV0dXJuIGVycm9yOworCisgb3V0X3JlbGVhc2U6CisJY29udGV4dC0+b3duZXJbcXVhbF0gPSBOVUxMOworCWRzX3B1dF9jb250ZXh0KGNvbnRleHQpOworCXJldHVybiBlcnJvcjsKKworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRzX2xvY2spOworCWRzX3B1dF9jb250ZXh0KGNvbnRleHQpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IGRzX3JlcXVlc3RfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCSAgIGRzX292ZmxfY2FsbGJhY2tfdCBvdmZsKQoreworCXJldHVybiBkc19yZXF1ZXN0KHRhc2ssIGJhc2UsIHNpemUsIG92ZmwsIGRzX2J0cyk7Cit9CisKK2ludCBkc19yZXF1ZXN0X3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJICAgIGRzX292ZmxfY2FsbGJhY2tfdCBvdmZsKQoreworCXJldHVybiBkc19yZXF1ZXN0KHRhc2ssIGJhc2UsIHNpemUsIG92ZmwsIGRzX3BlYnMpOworfQorCitzdGF0aWMgaW50IGRzX3JlbGVhc2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbnVtIGRzX3F1YWxpZmllciBxdWFsKQoreworCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OworCWludCBlcnJvcjsKKworCWNvbnRleHQgPSBkc19nZXRfY29udGV4dCh0YXNrKTsKKwllcnJvciA9IGRzX3ZhbGlkYXRlX2FjY2Vzcyhjb250ZXh0LCBxdWFsKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWtmcmVlKGNvbnRleHQtPmJ1ZmZlcltxdWFsXSk7CisJY29udGV4dC0+YnVmZmVyW3F1YWxdID0gTlVMTDsKKworCWN1cnJlbnQtPm1tLT50b3RhbF92bSAgLT0gY29udGV4dC0+cGFnZXNbcXVhbF07CisJY3VycmVudC0+bW0tPmxvY2tlZF92bSAtPSBjb250ZXh0LT5wYWdlc1txdWFsXTsKKwljb250ZXh0LT5wYWdlc1txdWFsXSA9IDA7CisJY29udGV4dC0+b3duZXJbcXVhbF0gPSBOVUxMOworCisJLyoKKwkgKiB3ZSBwdXQgdGhlIGNvbnRleHQgdHdpY2U6CisJICogICBvbmNlIGZvciB0aGUgZHNfZ2V0X2NvbnRleHQKKwkgKiAgIG9uY2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGRzX3JlcXVlc3QKKwkgKi8KKwlkc19wdXRfY29udGV4dChjb250ZXh0KTsKKyBvdXQ6CisJZHNfcHV0X2NvbnRleHQoY29udGV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZHNfcmVsZWFzZV9idHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBkc19yZWxlYXNlKHRhc2ssIGRzX2J0cyk7Cit9CisKK2ludCBkc19yZWxlYXNlX3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBkc19yZWxlYXNlKHRhc2ssIGRzX3BlYnMpOworfQorCitzdGF0aWMgaW50IGRzX2dldF9pbmRleChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHNpemVfdCAqcG9zLAorCQkJZW51bSBkc19xdWFsaWZpZXIgcXVhbCkKK3sKKwlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGluZGV4OworCWludCBlcnJvcjsKKworCWNvbnRleHQgPSBkc19nZXRfY29udGV4dCh0YXNrKTsKKwllcnJvciA9IGRzX3ZhbGlkYXRlX2FjY2Vzcyhjb250ZXh0LCBxdWFsKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWJhc2UgID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19idWZmZXJfYmFzZSk7CisJaW5kZXggPSBkc19nZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2luZGV4KTsKKworCWVycm9yID0gKChpbmRleCAtIGJhc2UpIC8gZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF0pOworCWlmIChwb3MpCisJCSpwb3MgPSBlcnJvcjsKKyBvdXQ6CisJZHNfcHV0X2NvbnRleHQoY29udGV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZHNfZ2V0X2J0c19pbmRleChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHNpemVfdCAqcG9zKQoreworCXJldHVybiBkc19nZXRfaW5kZXgodGFzaywgcG9zLCBkc19idHMpOworfQorCitpbnQgZHNfZ2V0X3BlYnNfaW5kZXgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzaXplX3QgKnBvcykKK3sKKwlyZXR1cm4gZHNfZ2V0X2luZGV4KHRhc2ssIHBvcywgZHNfcGVicyk7Cit9CisKK3N0YXRpYyBpbnQgZHNfZ2V0X2VuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHNpemVfdCAqcG9zLAorCQkgICAgICBlbnVtIGRzX3F1YWxpZmllciBxdWFsKQoreworCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OworCXVuc2lnbmVkIGxvbmcgYmFzZSwgZW5kOworCWludCBlcnJvcjsKKworCWNvbnRleHQgPSBkc19nZXRfY29udGV4dCh0YXNrKTsKKwllcnJvciA9IGRzX3ZhbGlkYXRlX2FjY2Vzcyhjb250ZXh0LCBxdWFsKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWJhc2UgPSBkc19nZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2J1ZmZlcl9iYXNlKTsKKwllbmQgID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19hYnNvbHV0ZV9tYXhpbXVtKTsKKworCWVycm9yID0gKChlbmQgLSBiYXNlKSAvIGRzX2NmZy5zaXplb2ZfcmVjW3F1YWxdKTsKKwlpZiAocG9zKQorCQkqcG9zID0gZXJyb3I7Cisgb3V0OgorCWRzX3B1dF9jb250ZXh0KGNvbnRleHQpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IGRzX2dldF9idHNfZW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc2l6ZV90ICpwb3MpCit7CisJcmV0dXJuIGRzX2dldF9lbmQodGFzaywgcG9zLCBkc19idHMpOworfQorCitpbnQgZHNfZ2V0X3BlYnNfZW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc2l6ZV90ICpwb3MpCit7CisJcmV0dXJuIGRzX2dldF9lbmQodGFzaywgcG9zLCBkc19wZWJzKTsKK30KKworc3RhdGljIGludCBkc19hY2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzaXplX3QgaW5kZXgsCisJCSAgICAgY29uc3Qgdm9pZCAqKnJlY29yZCwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCkKK3sKKwlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGlkeDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXJlY29yZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb250ZXh0ID0gZHNfZ2V0X2NvbnRleHQodGFzayk7CisJZXJyb3IgPSBkc192YWxpZGF0ZV9hY2Nlc3MoY29udGV4dCwgcXVhbCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwliYXNlID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19idWZmZXJfYmFzZSk7CisJaWR4ID0gYmFzZSArIChpbmRleCAqIGRzX2NmZy5zaXplb2ZfcmVjW3F1YWxdKTsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoaWR4ID4gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19hYnNvbHV0ZV9tYXhpbXVtKSkKKwkJZ290byBvdXQ7CisKKwkqcmVjb3JkID0gKGNvbnN0IHZvaWQgKilpZHg7CisJZXJyb3IgPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKKyBvdXQ6CisJZHNfcHV0X2NvbnRleHQoY29udGV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZHNfYWNjZXNzX2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHNpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnJlY29yZCkKK3sKKwlyZXR1cm4gZHNfYWNjZXNzKHRhc2ssIGluZGV4LCByZWNvcmQsIGRzX2J0cyk7Cit9CisKK2ludCBkc19hY2Nlc3NfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHNpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnJlY29yZCkKK3sKKwlyZXR1cm4gZHNfYWNjZXNzKHRhc2ssIGluZGV4LCByZWNvcmQsIGRzX3BlYnMpOworfQorCitzdGF0aWMgaW50IGRzX3dyaXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgdm9pZCAqcmVjb3JkLCBzaXplX3Qgc2l6ZSwKKwkJICAgIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXJlY29yZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IC1FUEVSTTsKKwljb250ZXh0ID0gZHNfZ2V0X2NvbnRleHQodGFzayk7CisJaWYgKCFjb250ZXh0KQorCQlnb3RvIG91dDsKKworCWlmICghZm9yY2UpIHsKKwkJZXJyb3IgPSBkc192YWxpZGF0ZV9hY2Nlc3MoY29udGV4dCwgcXVhbCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKIAl9CiAKLQlidHMgPSBidHMgKyBkc19jZmcuc2l6ZW9mX2J0czsKLQlpZiAoYnRzID49IGdldF9idHNfYWJzb2x1dGVfbWF4aW11bShkcykpCi0JCWJ0cyA9IGdldF9idHNfYnVmZmVyX2Jhc2UoZHMpOwotCXNldF9idHNfaW5kZXgoZHMsIGJ0cyk7CisJZXJyb3IgPSAwOworCXdoaWxlIChzaXplKSB7CisJCXVuc2lnbmVkIGxvbmcgYmFzZSwgaW5kZXgsIGVuZCwgd3JpdGVfZW5kLCBpbnRfdGg7CisJCXVuc2lnbmVkIGxvbmcgd3JpdGVfc2l6ZSwgYWRqX3dyaXRlX3NpemU7CiAKLQlyZXR1cm4gZHNfY2ZnLnNpemVvZl9idHM7CisJCS8qCisJCSAqIHdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCBwcm9kdWNpbmcgYW4KKwkJICogb3ZlcmZsb3cgaW50ZXJydXB0LgorCQkgKgorCQkgKiBpbnRlcnJ1cHRfdGhyZXNob2xkIG11c3QgZWl0aGVyIGJlCisJCSAqIC0gYmlnZ2VyIHRoYW4gYWJzb2x1dGVfbWF4aW11bSBvcgorCQkgKiAtIHBvaW50IHRvIGEgcmVjb3JkIGJldHdlZW4gYnVmZmVyX2Jhc2UgYW5kIGFic29sdXRlX21heGltdW0KKwkJICoKKwkJICogaW5kZXggcG9pbnRzIHRvIGEgdmFsaWQgcmVjb3JkLgorCQkgKi8KKwkJYmFzZSAgID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19idWZmZXJfYmFzZSk7CisJCWluZGV4ICA9IGRzX2dldChjb250ZXh0LT5kcywgcXVhbCwgZHNfaW5kZXgpOworCQllbmQgICAgPSBkc19nZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2Fic29sdXRlX21heGltdW0pOworCQlpbnRfdGggPSBkc19nZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2ludGVycnVwdF90aHJlc2hvbGQpOworCisJCXdyaXRlX2VuZCA9IG1pbihlbmQsIGludF90aCk7CisKKwkJLyogaWYgd2UgYXJlIGFscmVhZHkgYmV5b25kIHRoZSBpbnRlcnJ1cHQgdGhyZXNob2xkLAorCQkgKiB3ZSBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyICovCisJCWlmICh3cml0ZV9lbmQgPD0gaW5kZXgpCisJCQl3cml0ZV9lbmQgPSBlbmQ7CisKKwkJaWYgKHdyaXRlX2VuZCA8PSBpbmRleCkKKwkJCWdvdG8gb3V0OworCisJCXdyaXRlX3NpemUgPSBtaW4oKHVuc2lnbmVkIGxvbmcpIHNpemUsIHdyaXRlX2VuZCAtIGluZGV4KTsKKwkJbWVtY3B5KCh2b2lkICopaW5kZXgsIHJlY29yZCwgd3JpdGVfc2l6ZSk7CisKKwkJcmVjb3JkID0gKGNvbnN0IGNoYXIgKilyZWNvcmQgKyB3cml0ZV9zaXplOworCQlzaXplICAtPSB3cml0ZV9zaXplOworCQllcnJvciArPSB3cml0ZV9zaXplOworCisJCWFkal93cml0ZV9zaXplID0gd3JpdGVfc2l6ZSAvIGRzX2NmZy5zaXplb2ZfcmVjW3F1YWxdOworCQlhZGpfd3JpdGVfc2l6ZSAqPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKKworCQkvKiB6ZXJvIG91dCB0cmFpbGluZyBieXRlcyAqLworCQltZW1zZXQoKGNoYXIgKilpbmRleCArIHdyaXRlX3NpemUsIDAsCisJCSAgICAgICBhZGpfd3JpdGVfc2l6ZSAtIHdyaXRlX3NpemUpOworCQlpbmRleCArPSBhZGpfd3JpdGVfc2l6ZTsKKworCQlpZiAoaW5kZXggPj0gZW5kKQorCQkJaW5kZXggPSBiYXNlOworCQlkc19zZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2luZGV4LCBpbmRleCk7CisKKwkJaWYgKGluZGV4ID49IGludF90aCkKKwkJCWRzX292ZXJmbG93KHRhc2ssIGNvbnRleHQsIHF1YWwpOworCX0KKworIG91dDoKKwlkc19wdXRfY29udGV4dChjb250ZXh0KTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHNfZGVidWdjdGxfbWFzayh2b2lkKQoraW50IGRzX3dyaXRlX2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHZvaWQgKnJlY29yZCwgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIGRzX2NmZy5kZWJ1Z2N0bF9tYXNrOworCXJldHVybiBkc193cml0ZSh0YXNrLCByZWNvcmQsIHNpemUsIGRzX2J0cywgLyogZm9yY2UgPSAqLyAwKTsKIH0KIAotI2lmZGVmIF9faTM4Nl9fCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24gZHNfY2ZnX25ldGJ1cnN0ID0gewotCS5zaXplb2ZfZHMgPSA5ICogNCwKLQkuYnRzX2J1ZmZlcl9iYXNlID0geyAwLCA0IH0sCi0JLmJ0c19pbmRleCA9IHsgNCwgNCB9LAotCS5idHNfYWJzb2x1dGVfbWF4aW11bSA9IHsgOCwgNCB9LAotCS5idHNfaW50ZXJydXB0X3RocmVzaG9sZCA9IHsgMTIsIDQgfSwKLQkuc2l6ZW9mX2J0cyA9IDMgKiA0LAotCS5mcm9tX2lwID0geyAwLCA0IH0sCi0JLnRvX2lwID0geyA0LCA0IH0sCi0JLmluZm9fdHlwZSA9IHsgNCwgMSB9LAotCS5pbmZvX2RhdGEgPSB7IDgsIDQgfSwKLQkuZGVidWdjdGxfbWFzayA9ICgxPDwyKXwoMTw8MykKK2ludCBkc193cml0ZV9wZWJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgdm9pZCAqcmVjb3JkLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gZHNfd3JpdGUodGFzaywgcmVjb3JkLCBzaXplLCBkc19wZWJzLCAvKiBmb3JjZSA9ICovIDApOworfQorCitpbnQgZHNfdW5jaGVja2VkX3dyaXRlX2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICBjb25zdCB2b2lkICpyZWNvcmQsIHNpemVfdCBzaXplKQoreworCXJldHVybiBkc193cml0ZSh0YXNrLCByZWNvcmQsIHNpemUsIGRzX2J0cywgLyogZm9yY2UgPSAqLyAxKTsKK30KKworaW50IGRzX3VuY2hlY2tlZF93cml0ZV9wZWJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCSAgICBjb25zdCB2b2lkICpyZWNvcmQsIHNpemVfdCBzaXplKQoreworCXJldHVybiBkc193cml0ZSh0YXNrLCByZWNvcmQsIHNpemUsIGRzX3BlYnMsIC8qIGZvcmNlID0gKi8gMSk7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVzZXRfb3JfY2xlYXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJICAgICBlbnVtIGRzX3F1YWxpZmllciBxdWFsLCBpbnQgY2xlYXIpCit7CisJc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBiYXNlLCBlbmQ7CisJaW50IGVycm9yOworCisJY29udGV4dCA9IGRzX2dldF9jb250ZXh0KHRhc2spOworCWVycm9yID0gZHNfdmFsaWRhdGVfYWNjZXNzKGNvbnRleHQsIHF1YWwpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJYmFzZSA9IGRzX2dldChjb250ZXh0LT5kcywgcXVhbCwgZHNfYnVmZmVyX2Jhc2UpOworCWVuZCAgPSBkc19nZXQoY29udGV4dC0+ZHMsIHF1YWwsIGRzX2Fic29sdXRlX21heGltdW0pOworCisJaWYgKGNsZWFyKQorCQltZW1zZXQoKHZvaWQgKiliYXNlLCAwLCBlbmQgLSBiYXNlKTsKKworCWRzX3NldChjb250ZXh0LT5kcywgcXVhbCwgZHNfaW5kZXgsIGJhc2UpOworCisJZXJyb3IgPSAwOworIG91dDoKKwlkc19wdXRfY29udGV4dChjb250ZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBkc19yZXNldF9idHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBkc19yZXNldF9vcl9jbGVhcih0YXNrLCBkc19idHMsIC8qIGNsZWFyID0gKi8gMCk7Cit9CisKK2ludCBkc19yZXNldF9wZWJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gZHNfcmVzZXRfb3JfY2xlYXIodGFzaywgZHNfcGVicywgLyogY2xlYXIgPSAqLyAwKTsKK30KKworaW50IGRzX2NsZWFyX2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIGRzX3Jlc2V0X29yX2NsZWFyKHRhc2ssIGRzX2J0cywgLyogY2xlYXIgPSAqLyAxKTsKK30KKworaW50IGRzX2NsZWFyX3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBkc19yZXNldF9vcl9jbGVhcih0YXNrLCBkc19wZWJzLCAvKiBjbGVhciA9ICovIDEpOworfQorCitpbnQgZHNfZ2V0X3BlYnNfcmVzZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1NjQgKnZhbHVlKQoreworCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OworCWludCBlcnJvcjsKKworCWlmICghdmFsdWUpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udGV4dCA9IGRzX2dldF9jb250ZXh0KHRhc2spOworCWVycm9yID0gZHNfdmFsaWRhdGVfYWNjZXNzKGNvbnRleHQsIGRzX3BlYnMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJKnZhbHVlID0gKih1NjQgKikoY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKTsKKworCWVycm9yID0gMDsKKyBvdXQ6CisJZHNfcHV0X2NvbnRleHQoY29udGV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZHNfc2V0X3BlYnNfcmVzZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1NjQgdmFsdWUpCit7CisJc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQ7CisJaW50IGVycm9yOworCisJY29udGV4dCA9IGRzX2dldF9jb250ZXh0KHRhc2spOworCWVycm9yID0gZHNfdmFsaWRhdGVfYWNjZXNzKGNvbnRleHQsIGRzX3BlYnMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJKih1NjQgKikoY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKSA9IHZhbHVlOworCisJZXJyb3IgPSAwOworIG91dDoKKwlkc19wdXRfY29udGV4dChjb250ZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmdfdmFyID0geworCS5zaXplb2ZfZHMgICAgPSBzaXplb2YobG9uZykgKiAxMiwKKwkuc2l6ZW9mX2ZpZWxkID0gc2l6ZW9mKGxvbmcpLAorCS5zaXplb2ZfcmVjW2RzX2J0c10gICA9IHNpemVvZihsb25nKSAqIDMsCisJLnNpemVvZl9yZWNbZHNfcGVic10gID0gc2l6ZW9mKGxvbmcpICogMTAKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmdfcGVudGl1bV9tID0gewotCS5zaXplb2ZfZHMgPSA5ICogNCwKLQkuYnRzX2J1ZmZlcl9iYXNlID0geyAwLCA0IH0sCi0JLmJ0c19pbmRleCA9IHsgNCwgNCB9LAotCS5idHNfYWJzb2x1dGVfbWF4aW11bSA9IHsgOCwgNCB9LAotCS5idHNfaW50ZXJydXB0X3RocmVzaG9sZCA9IHsgMTIsIDQgfSwKLQkuc2l6ZW9mX2J0cyA9IDMgKiA0LAotCS5mcm9tX2lwID0geyAwLCA0IH0sCi0JLnRvX2lwID0geyA0LCA0IH0sCi0JLmluZm9fdHlwZSA9IHsgNCwgMSB9LAotCS5pbmZvX2RhdGEgPSB7IDgsIDQgfSwKLQkuZGVidWdjdGxfbWFzayA9ICgxPDw2KXwoMTw8NykKLX07Ci0jZW5kaWYgLyogX2kzODZfICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmdfY29yZTIgPSB7Ci0JLnNpemVvZl9kcyA9IDkgKiA4LAotCS5idHNfYnVmZmVyX2Jhc2UgPSB7IDAsIDggfSwKLQkuYnRzX2luZGV4ID0geyA4LCA4IH0sCi0JLmJ0c19hYnNvbHV0ZV9tYXhpbXVtID0geyAxNiwgOCB9LAotCS5idHNfaW50ZXJydXB0X3RocmVzaG9sZCA9IHsgMjQsIDggfSwKLQkuc2l6ZW9mX2J0cyA9IDMgKiA4LAotCS5mcm9tX2lwID0geyAwLCA4IH0sCi0JLnRvX2lwID0geyA4LCA4IH0sCi0JLmluZm9fdHlwZSA9IHsgOCwgMSB9LAotCS5pbmZvX2RhdGEgPSB7IDE2LCA4IH0sCi0JLmRlYnVnY3RsX21hc2sgPSAoMTw8Nil8KDE8PDcpfCgxPDw5KQorc3RhdGljIGNvbnN0IHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZ182NCA9IHsKKwkuc2l6ZW9mX2RzICAgID0gOCAqIDEyLAorCS5zaXplb2ZfZmllbGQgPSA4LAorCS5zaXplb2ZfcmVjW2RzX2J0c10gICA9IDggKiAzLAorCS5zaXplb2ZfcmVjW2RzX3BlYnNdICA9IDggKiAxMAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC00MjksMTQgKzgyMSwxMyBAQAogCXN3aXRjaCAoYy0+eDg2KSB7CiAJY2FzZSAweDY6CiAJCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7Ci0jaWZkZWYgX19pMzg2X18KIAkJY2FzZSAweEQ6CiAJCWNhc2UgMHhFOiAvKiBQZW50aXVtIE0gKi8KLQkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX3BlbnRpdW1fbSk7CisJCQlkc19jb25maWd1cmUoJmRzX2NmZ192YXIpOwogCQkJYnJlYWs7Ci0jZW5kaWYgLyogX2kzODZfICovCiAJCWNhc2UgMHhGOiAvKiBDb3JlMiAqLwotCQkJZHNfY29uZmlndXJlKCZkc19jZmdfY29yZTIpOworCQljYXNlIDB4MUM6IC8qIEF0b20gKi8KKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnXzY0KTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogc29ycnksIGRvbid0IGtub3cgYWJvdXQgdGhlbSAqLwpAQCAtNDQ1LDEzICs4MzYsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSAweEY6CiAJCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7Ci0jaWZkZWYgX19pMzg2X18KIAkJY2FzZSAweDA6CiAJCWNhc2UgMHgxOgogCQljYXNlIDB4MjogLyogTmV0YnVyc3QgKi8KLQkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX25ldGJ1cnN0KTsKKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX3Zhcik7CiAJCQlicmVhazsKLSNlbmRpZiAvKiBfaTM4Nl8gKi8KIAkJZGVmYXVsdDoKIAkJCS8qIHNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0gKi8KIAkJCWJyZWFrOwpAQCAtNDYyLDMgKzg1MSwxNCBAQAogCQlicmVhazsKIAl9CiB9CisKK3ZvaWQgZHNfZnJlZShzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCkKK3sKKwkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSB0YXNrIG93bmluZyB0aGUgcGFyYW1ldGVyIGNvbnRleHQKKwkgKiBpcyBkeWluZy4gVGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgdXNlciBvZiB0aGF0IGNvbnRleHQgbGVmdAorCSAqIHRvIGRpc3R1cmIgdXMsIGFueW1vcmUuICovCisJdW5zaWduZWQgbG9uZyBsZWZ0b3ZlcnMgPSBjb250ZXh0LT5jb3VudDsKKwl3aGlsZSAobGVmdG92ZXJzLS0pCisJCWRzX3B1dF9jb250ZXh0KGNvbnRleHQpOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfRFMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTc4MTgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorCisjZGVmaW5lIFNUQUNLU0xPVFNfUEVSX0xJTkUgOAorI2RlZmluZSBnZXRfYnAoYnApIGFzbSgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoYnApIDopCisKK2ludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CitpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMyAqIFNUQUNLU0xPVFNfUEVSX0xJTkU7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVfYnl0ZXMgPSA2NDsKK3N0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisKK3ZvaWQgcHJpbnRrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUpCit7CisJcHJpbnRrKCIgWzwlcD5dICVzJXBTXG4iLCAodm9pZCAqKSBhZGRyZXNzLAorCQkJcmVsaWFibGUgPyAiIiA6ICI/ICIsICh2b2lkICopIGFkZHJlc3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywKKwkJCXZvaWQgKnAsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICplbmQpCit7CisJdm9pZCAqdCA9IHRpbmZvOworCWlmIChlbmQpIHsKKwkJaWYgKHAgPCBlbmQgJiYgcCA+PSAoZW5kLVRIUkVBRF9TSVpFKSkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHAgPiB0ICYmIHAgPCB0ICsgVEhSRUFEX1NJWkUgLSBzaXplOworfQorCisvKiBUaGUgZm9ybSBvZiB0aGUgdG9wIG9mIHRoZSBmcmFtZSBvbiB0aGUgc3RhY2sgKi8KK3N0cnVjdCBzdGFja19mcmFtZSB7CisJc3RydWN0IHN0YWNrX2ZyYW1lICpuZXh0X2ZyYW1lOworCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2FkZHJlc3M7Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3ByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywKKwkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCisJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhLAorCQl1bnNpZ25lZCBsb25nICplbmQpCit7CisJc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKKworCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrLCBzaXplb2YoKnN0YWNrKSwgZW5kKSkgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJYWRkciA9ICpzdGFjazsKKwkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeworCQkJaWYgKCh1bnNpZ25lZCBsb25nKSBzdGFjayA9PSBicCArIHNpemVvZihsb25nKSkgeworCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCAxKTsKKwkJCQlmcmFtZSA9IGZyYW1lLT5uZXh0X2ZyYW1lOworCQkJCWJwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCQkJfSBlbHNlIHsKKwkJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkciwgYnAgPT0gMCk7CisJCQl9CisJCX0KKwkJc3RhY2srKzsKKwl9CisJcmV0dXJuIGJwOworfQorCit2b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCisJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQoreworCWlmICghdGFzaykKKwkJdGFzayA9IGN1cnJlbnQ7CisKKwlpZiAoIXN0YWNrKSB7CisJCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJCXN0YWNrID0gJmR1bW15OworCQlpZiAodGFzayAmJiB0YXNrICE9IGN1cnJlbnQpCisJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworCX0KKworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJaWYgKCFicCkgeworCQlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCQkvKiBHcmFiIGJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KKwkJCWdldF9icChicCk7CisJCX0gZWxzZSB7CisJCQkvKiBicCBpcyB0aGUgbGFzdCByZWcgcHVzaGVkIGJ5IHN3aXRjaF90byAqLworCQkJYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLnNwOworCQl9CisJfQorI2VuZGlmCisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKKworCQljb250ZXh0ID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQorCQkJKCh1bnNpZ25lZCBsb25nKXN0YWNrICYgKH4oVEhSRUFEX1NJWkUgLSAxKSkpOworCQlicCA9IHByaW50X2NvbnRleHRfc3RhY2soY29udGV4dCwgc3RhY2ssIGJwLCBvcHMsIGRhdGEsIE5VTEwpOworCisJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKiljb250ZXh0LT5wcmV2aW91c19lc3A7CisJCWlmICghc3RhY2spCisJCQlicmVhazsKKwkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKKwkJCWJyZWFrOworCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGR1bXBfdHJhY2UpOworCitzdGF0aWMgdm9pZAorcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wodm9pZCAqZGF0YSwgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIHN5bWJvbCkKK3sKKwlwcmludGsoZGF0YSk7CisJcHJpbnRfc3ltYm9sKG1zZywgc3ltYm9sKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3RyYWNlX3dhcm5pbmcodm9pZCAqZGF0YSwgY2hhciAqbXNnKQoreworCXByaW50aygiJXMlc1xuIiwgKGNoYXIgKilkYXRhLCBtc2cpOworfQorCitzdGF0aWMgaW50IHByaW50X3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCit7CisJcHJpbnRrKCIlcyA8JXM+ICIsIChjaGFyICopZGF0YSwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcmludCBvbmUgYWRkcmVzcy9zeW1ib2wgZW50cmllcyBwZXIgbGluZS4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKK3sKKwl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwlwcmludGsoZGF0YSk7CisJcHJpbnRrX2FkZHJlc3MoYWRkciwgcmVsaWFibGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHByaW50X3RyYWNlX29wcyA9IHsKKwkud2FybmluZyA9IHByaW50X3RyYWNlX3dhcm5pbmcsCisJLndhcm5pbmdfc3ltYm9sID0gcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wsCisJLnN0YWNrID0gcHJpbnRfdHJhY2Vfc3RhY2ssCisJLmFkZHJlc3MgPSBwcmludF90cmFjZV9hZGRyZXNzLAorfTsKKworc3RhdGljIHZvaWQKK3Nob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKK3sKKwlwcmludGsoIiVzQ2FsbCBUcmFjZTpcbiIsIGxvZ19sdmwpOworCWR1bXBfdHJhY2UodGFzaywgcmVncywgc3RhY2ssIGJwLCAmcHJpbnRfdHJhY2Vfb3BzLCBsb2dfbHZsKTsKK30KKwordm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwKQoreworCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzdGFjaywgYnAsICIiKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQl1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlpbnQgaTsKKworCWlmIChzcCA9PSBOVUxMKSB7CisJCWlmICh0YXNrKQorCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKKwkJZWxzZQorCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKKwl9CisKKwlzdGFjayA9IHNwOworCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgeworCQlpZiAoa3N0YWNrX2VuZChzdGFjaykpCisJCQlicmVhazsKKwkJaWYgKGkgJiYgKChpICUgU1RBQ0tTTE9UU19QRVJfTElORSkgPT0gMCkpCisJCQlwcmludGsoIlxuJXMiLCBsb2dfbHZsKTsKKwkJcHJpbnRrKCIgJTA4bHgiLCAqc3RhY2srKyk7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCX0KKwlwcmludGsoIlxuIik7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHNwLCBicCwgbG9nX2x2bCk7Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXNob3dfc3RhY2tfbG9nX2x2bCh0YXNrLCBOVUxMLCBzcCwgMCwgIiIpOworfQorCisvKgorICogVGhlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkdW1wX3N0YWNrIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGJwID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwlpZiAoIWJwKQorCQlnZXRfYnAoYnApOworI2VuZGlmCisKKwlwcmludGsoIlBpZDogJWQsIGNvbW06ICUuMjBzICVzICVzICUuKnNcbiIsCisJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgcHJpbnRfdGFpbnRlZCgpLAorCQlpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKKwkJKGludClzdHJjc3BuKGluaXRfdXRzbmFtZSgpLT52ZXJzaW9uLCAiICIpLAorCQlpbml0X3V0c25hbWUoKS0+dmVyc2lvbik7CisJc2hvd190cmFjZShOVUxMLCBOVUxMLCAmc3RhY2ssIGJwKTsKK30KKworRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKKwordm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKworCXByaW50X21vZHVsZXMoKTsKKwlfX3Nob3dfcmVncyhyZWdzLCAwKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICUuKnMgKHBpZDogJWQsIHRpPSVwIHRhc2s9JXAgdGFzay50aT0lcClcbiIsCisJCVRBU0tfQ09NTV9MRU4sIGN1cnJlbnQtPmNvbW0sIHRhc2tfcGlkX25yKGN1cnJlbnQpLAorCQljdXJyZW50X3RocmVhZF9pbmZvKCksIGN1cnJlbnQsIHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCkpOworCS8qCisJICogV2hlbiBpbi1rZXJuZWwsIHdlIGFsc28gcHJpbnQgb3V0IHRoZSBzdGFjayBhbmQgY29kZSBhdCB0aGUKKwkgKiB0aW1lIG9mIHRoZSBmYXVsdC4uCisJICovCisJaWYgKCF1c2VyX21vZGVfdm0ocmVncykpIHsKKwkJdW5zaWduZWQgaW50IGNvZGVfcHJvbG9ndWUgPSBjb2RlX2J5dGVzICogNDMgLyA2NDsKKwkJdW5zaWduZWQgaW50IGNvZGVfbGVuID0gY29kZV9ieXRlczsKKwkJdW5zaWduZWQgY2hhciBjOworCQl1OCAqaXA7CisKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIlN0YWNrOlxuIik7CisJCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCByZWdzLCAmcmVncy0+c3AsCisJCQkJMCwgS0VSTl9FTUVSRyk7CisKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOworCisJCWlwID0gKHU4ICopcmVncy0+aXAgLSBjb2RlX3Byb2xvZ3VlOworCQlpZiAoaXAgPCAodTggKilQQUdFX09GRlNFVCB8fCBwcm9iZV9rZXJuZWxfYWRkcmVzcyhpcCwgYykpIHsKKwkJCS8qIHRyeSBzdGFydGluZyBhdCBJUCAqLworCQkJaXAgPSAodTggKilyZWdzLT5pcDsKKwkJCWNvZGVfbGVuID0gY29kZV9sZW4gLSBjb2RlX3Byb2xvZ3VlICsgMTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgY29kZV9sZW47IGkrKywgaXArKykgeworCQkJaWYgKGlwIDwgKHU4ICopUEFHRV9PRkZTRVQgfHwKKwkJCQkJcHJvYmVfa2VybmVsX2FkZHJlc3MoaXAsIGMpKSB7CisJCQkJcHJpbnRrKCIgQmFkIEVJUCB2YWx1ZS4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpcCA9PSAodTggKilyZWdzLT5pcCkKKwkJCQlwcmludGsoIjwlMDJ4PiAiLCBjKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiUwMnggIiwgYyk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGlwKQoreworCXVuc2lnbmVkIHNob3J0IHVkMjsKKworCWlmIChpcCA8IFBBR0VfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKwlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0ICopaXAsIHVkMikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHVkMiA9PSAweDBiMGY7Cit9CisKK3N0YXRpYyByYXdfc3BpbmxvY2tfdCBkaWVfbG9jayA9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBpbnQgZGllX293bmVyID0gLTE7CitzdGF0aWMgdW5zaWduZWQgaW50IGRpZV9uZXN0X2NvdW50OworCit1bnNpZ25lZCBfX2twcm9iZXMgbG9uZyBvb3BzX2JlZ2luKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW9vcHNfZW50ZXIoKTsKKworCWlmIChkaWVfb3duZXIgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgeworCQljb25zb2xlX3ZlcmJvc2UoKTsKKwkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJX19yYXdfc3Bpbl9sb2NrKCZkaWVfbG9jayk7CisJCWRpZV9vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllX25lc3RfY291bnQgPSAwOworCQlidXN0X3NwaW5sb2NrcygxKTsKKwl9IGVsc2UgeworCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCX0KKwlkaWVfbmVzdF9jb3VudCsrOworCXJldHVybiBmbGFnczsKK30KKwordm9pZCBfX2twcm9iZXMgb29wc19lbmQodW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzaWducikKK3sKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkaWVfb3duZXIgPSAtMTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKKwlfX3Jhd19zcGluX3VubG9jaygmZGllX2xvY2spOworCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAoIXJlZ3MpCisJCXJldHVybjsKKworCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpCisJCWNyYXNoX2tleGVjKHJlZ3MpOworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKKwlpZiAocGFuaWNfb25fb29wcykKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOworCW9vcHNfZXhpdCgpOworCWRvX2V4aXQoc2lnbnIpOworfQorCitpbnQgX19rcHJvYmVzIF9fZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQoreworCXVuc2lnbmVkIHNob3J0IHNzOworCXVuc2lnbmVkIGxvbmcgc3A7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiJXM6ICUwNGx4IFsjJWRdICIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXByaW50aygiUFJFRU1QVCAiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTVAKKwlwcmludGsoIlNNUCAiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKwlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOworI2VuZGlmCisJcHJpbnRrKCJcbiIpOworCXN5c2ZzX3ByaW50a19sYXN0X2ZpbGUoKTsKKwlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsCisJCQljdXJyZW50LT50aHJlYWQudHJhcF9ubywgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybiAxOworCisJc2hvd19yZWdpc3RlcnMocmVncyk7CisJLyogRXhlY3V0aXZlIHN1bW1hcnkgaW4gY2FzZSB0aGUgb29wcyBzY3JvbGxlZCBhd2F5ICovCisJc3AgPSAodW5zaWduZWQgbG9uZykgKCZyZWdzLT5zcCk7CisJc2F2ZXNlZ21lbnQoc3MsIHNzKTsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCXNwID0gcmVncy0+c3A7CisJCXNzID0gcmVncy0+c3MgJiAweGZmZmY7CisJfQorCXByaW50ayhLRVJOX0VNRVJHICJFSVA6IFs8JTA4bHg+XSAiLCByZWdzLT5pcCk7CisJcHJpbnRfc3ltYm9sKCIlcyIsIHJlZ3MtPmlwKTsKKwlwcmludGsoIiBTUzpFU1AgJTA0eDolMDhseFxuIiwgc3MsIHNwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgZ29uZSB0aHJvdWdoIHdoZW4gc29tZXRoaW5nIGluIHRoZSBrZXJuZWwgaGFzIGRvbmUgc29tZXRoaW5nIGJhZAorICogYW5kIGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWQ6CisgKi8KK3ZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvb3BzX2JlZ2luKCk7CisKKwlpZiAoZGllX25lc3RfY291bnQgPCAzKSB7CisJCXJlcG9ydF9idWcocmVncy0+aXAsIHJlZ3MpOworCisJCWlmIChfX2RpZShzdHIsIHJlZ3MsIGVycikpCisJCQlyZWdzID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FTUVSRyAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKwl9CisKKwlvb3BzX2VuZChmbGFncywgcmVncywgU0lHU0VHVik7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm1pX3ByaW50X2xvY2spOworCit2b2lkIG5vdHJhY2UgX19rcHJvYmVzCitkaWVfbm1pKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBkb19wYW5pYykKK3sKKwlpZiAobm90aWZ5X2RpZShESUVfTk1JV0FUQ0hET0csIHN0ciwgcmVncywgMCwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZubWlfcHJpbnRfbG9jayk7CisJLyoKKwkqIFdlIGFyZSBpbiB0cm91YmxlIGFueXdheSwgbGV0cyBhdCBsZWFzdCB0cnkKKwkqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0OgorCSovCisJYnVzdF9zcGlubG9ja3MoMSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIiVzIiwgc3RyKTsKKwlwcmludGsoIiBvbiBDUFUlZCwgaXAgJTA4bHgsIHJlZ2lzdGVyczpcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncy0+aXApOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWlmIChkb19wYW5pYykKKwkJcGFuaWMoIk5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQiKTsKKwljb25zb2xlX3NpbGVudCgpOworCXNwaW5fdW5sb2NrKCZubWlfcHJpbnRfbG9jayk7CisJYnVzdF9zcGlubG9ja3MoMCk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBpbiBrZXJuZWwgd2UgYXJlIHByb2JhYmx5IG5lc3RlZCB1cCBwcmV0dHkgYmFkCisJICogYW5kIG1pZ2h0IGFzd2VsbCBnZXQgb3V0IG5vdyB3aGlsZSB3ZSBzdGlsbCBjYW46CisJICovCisJaWYgKCF1c2VyX21vZGVfdm0ocmVncykpIHsKKwkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAyOworCQljcmFzaF9rZXhlYyhyZWdzKTsKKwl9CisKKwlkb19leGl0KFNJR1NFR1YpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvb3BzX3NldHVwKGNoYXIgKnMpCit7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cmNtcChzLCAicGFuaWMiKSkKKwkJcGFuaWNfb25fb29wcyA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgib29wcyIsIG9vcHNfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBrc3RhY2tfc2V0dXAoY2hhciAqcykKK3sKKwlpZiAoIXMpCisJCXJldHVybiAtRUlOVkFMOworCWtzdGFja19kZXB0aF90b19wcmludCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImtzdGFjayIsIGtzdGFja19zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvZGVfYnl0ZXNfc2V0dXAoY2hhciAqcykKK3sKKwljb2RlX2J5dGVzID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7CisJaWYgKGNvZGVfYnl0ZXMgPiA4MTkyKQorCQljb2RlX2J5dGVzID0gODE5MjsKKworCXJldHVybiAxOworfQorX19zZXR1cCgiY29kZV9ieXRlcz0iLCBjb2RlX2J5dGVzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmE1ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorCisjZGVmaW5lIFNUQUNLU0xPVFNfUEVSX0xJTkUgNAorI2RlZmluZSBnZXRfYnAoYnApIGFzbSgibW92cSAlJXJicCwgJTAiIDogIj1yIiAoYnApIDopCisKK2ludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CitpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMyAqIFNUQUNLU0xPVFNfUEVSX0xJTkU7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVfYnl0ZXMgPSA2NDsKK3N0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisKK3ZvaWQgcHJpbnRrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUpCit7CisJcHJpbnRrKCIgWzwlcD5dICVzJXBTXG4iLCAodm9pZCAqKSBhZGRyZXNzLAorCQkJcmVsaWFibGUgPyAiIiA6ICI/ICIsICh2b2lkICopIGFkZHJlc3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqaW5fZXhjZXB0aW9uX3N0YWNrKHVuc2lnbmVkIGNwdSwgdW5zaWduZWQgbG9uZyBzdGFjaywKKwkJCQkJdW5zaWduZWQgKnVzZWRwLCBjaGFyICoqaWRwKQoreworCXN0YXRpYyBjaGFyIGlkc1tdWzhdID0geworCQlbREVCVUdfU1RBQ0sgLSAxXSA9ICIjREIiLAorCQlbTk1JX1NUQUNLIC0gMV0gPSAiTk1JIiwKKwkJW0RPVUJMRUZBVUxUX1NUQUNLIC0gMV0gPSAiI0RGIiwKKwkJW1NUQUNLRkFVTFRfU1RBQ0sgLSAxXSA9ICIjU1MiLAorCQlbTUNFX1NUQUNLIC0gMV0gPSAiI01DIiwKKyNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgorCQlbTl9FWENFUFRJT05fU1RBQ0tTIC4uLgorCQkJTl9FWENFUFRJT05fU1RBQ0tTICsgREVCVUdfU1RLU1ogLyBFWENFUFRJT05fU1RLU1ogLSAyXSA9ICIjREJbP10iCisjZW5kaWYKKwl9OworCXVuc2lnbmVkIGs7CisKKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciBhbGwgZXhjZXB0aW9uIHN0YWNrcywgYW5kIGZpZ3VyZSBvdXQgd2hldGhlcgorCSAqICdzdGFjaycgaXMgaW4gb25lIG9mIHRoZW06CisJICovCisJZm9yIChrID0gMDsgayA8IE5fRVhDRVBUSU9OX1NUQUNLUzsgaysrKSB7CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gcGVyX2NwdShvcmlnX2lzdCwgY3B1KS5pc3Rba107CisJCS8qCisJCSAqIElzICdzdGFjaycgYWJvdmUgdGhpcyBleGNlcHRpb24gZnJhbWUncyBlbmQ/CisJCSAqIElmIHllcyB0aGVuIHNraXAgdG8gdGhlIG5leHQgZnJhbWUuCisJCSAqLworCQlpZiAoc3RhY2sgPj0gZW5kKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElzICdzdGFjaycgYWJvdmUgdGhpcyBleGNlcHRpb24gZnJhbWUncyBzdGFydCBhZGRyZXNzPworCQkgKiBJZiB5ZXMgdGhlbiB3ZSBmb3VuZCB0aGUgcmlnaHQgZnJhbWUuCisJCSAqLworCQlpZiAoc3RhY2sgPj0gZW5kIC0gRVhDRVBUSU9OX1NUS1NaKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHdlIG9ubHkgaXRlcmF0ZSB0aHJvdWdoIGFuIGV4Y2VwdGlvbgorCQkJICogc3RhY2sgb25jZS4gSWYgaXQgY29tZXMgdXAgZm9yIHRoZSBzZWNvbmQgdGltZQorCQkJICogdGhlbiB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZyBnb2luZyBvbiAtIGp1c3QKKwkJCSAqIGJyZWFrIG91dCBhbmQgcmV0dXJuIE5VTEw6CisJCQkgKi8KKwkJCWlmICgqdXNlZHAgJiAoMVUgPDwgaykpCisJCQkJYnJlYWs7CisJCQkqdXNlZHAgfD0gMVUgPDwgazsKKwkJCSppZHAgPSBpZHNba107CisJCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKillbmQ7CisJCX0KKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIGRlYnVnIHN0YWNrLCBhbmQgaWYgaXQgaGFzIGEgbGFyZ2VyIHNpemUgdGhhbgorCQkgKiB0aGUgdXN1YWwgZXhjZXB0aW9uIHN0YWNrcywgdGhlbiAnc3RhY2snIG1pZ2h0IHN0aWxsCisJCSAqIGJlIHdpdGhpbiB0aGUgbG93ZXIgcG9ydGlvbiBvZiB0aGUgZGVidWcgc3RhY2s6CisJCSAqLworI2lmIERFQlVHX1NUS1NaID4gRVhDRVBUSU9OX1NUS1NaCisJCWlmIChrID09IERFQlVHX1NUQUNLIC0gMSAmJiBzdGFjayA+PSBlbmQgLSBERUJVR19TVEtTWikgeworCQkJdW5zaWduZWQgaiA9IE5fRVhDRVBUSU9OX1NUQUNLUyAtIDE7CisKKwkJCS8qCisJCQkgKiBCbGFjayBtYWdpYy4gQSBsYXJnZSBkZWJ1ZyBzdGFjayBpcyBjb21wb3NlZCBvZgorCQkJICogbXVsdGlwbGUgZXhjZXB0aW9uIHN0YWNrIGVudHJpZXMsIHdoaWNoIHdlCisJCQkgKiBpdGVyYXRlIHRocm91Z2ggbm93LiBEb250IGxvb2s6CisJCQkgKi8KKwkJCWRvIHsKKwkJCQkrK2o7CisJCQkJZW5kIC09IEVYQ0VQVElPTl9TVEtTWjsKKwkJCQlpZHNbal1bNF0gPSAnMScgKyAoaiAtIE5fRVhDRVBUSU9OX1NUQUNLUyk7CisJCQl9IHdoaWxlIChzdGFjayA8IGVuZCAtIEVYQ0VQVElPTl9TVEtTWik7CisJCQlpZiAoKnVzZWRwICYgKDFVIDw8IGopKQorCQkJCWJyZWFrOworCQkJKnVzZWRwIHw9IDFVIDw8IGo7CisJCQkqaWRwID0gaWRzW2pdOworCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nICopZW5kOworCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKKyAqIHByb2Nlc3Mgc3RhY2sKKyAqIGludGVycnVwdCBzdGFjaworICogc2V2ZXJlIGV4Y2VwdGlvbiAoZG91YmxlIGZhdWx0LCBubWksIHN0YWNrIGZhdWx0LCBkZWJ1ZywgbWNlKSBoYXJkd2FyZSBzdGFjaworICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAorCQkJdm9pZCAqcCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmVuZCkKK3sKKwl2b2lkICp0ID0gdGluZm87CisJaWYgKGVuZCkgeworCQlpZiAocCA8IGVuZCAmJiBwID49IChlbmQtVEhSRUFEX1NJWkUpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gcCA+IHQgJiYgcCA8IHQgKyBUSFJFQURfU0laRSAtIHNpemU7Cit9CisKKy8qIFRoZSBmb3JtIG9mIHRoZSB0b3Agb2YgdGhlIGZyYW1lIG9uIHRoZSBzdGFjayAqLworc3RydWN0IHN0YWNrX2ZyYW1lIHsKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKm5leHRfZnJhbWU7CisJdW5zaWduZWQgbG9uZyByZXR1cm5fYWRkcmVzczsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAorCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKKwkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEsCisJCXVuc2lnbmVkIGxvbmcgKmVuZCkKK3sKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKWJwOworCisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgc3RhY2ssIHNpemVvZigqc3RhY2spLCBlbmQpKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gKnN0YWNrOworCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHN0YWNrID09IGJwICsgc2l6ZW9mKGxvbmcpKSB7CisJCQkJb3BzLT5hZGRyZXNzKGRhdGEsIGFkZHIsIDEpOworCQkJCWZyYW1lID0gZnJhbWUtPm5leHRfZnJhbWU7CisJCQkJYnAgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJCQl9IGVsc2UgeworCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCBicCA9PSAwKTsKKwkJCX0KKwkJfQorCQlzdGFjaysrOworCX0KKwlyZXR1cm4gYnA7Cit9CisKK3ZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKKwkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCit7CisJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOworCXVuc2lnbmVkIGxvbmcgKmlycXN0YWNrX2VuZCA9ICh1bnNpZ25lZCBsb25nICopY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0cjsKKwl1bnNpZ25lZCB1c2VkID0gMDsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOworCisJaWYgKCF0YXNrKQorCQl0YXNrID0gY3VycmVudDsKKworCWlmICghc3RhY2spIHsKKwkJdW5zaWduZWQgbG9uZyBkdW1teTsKKwkJc3RhY2sgPSAmZHVtbXk7CisJCWlmICh0YXNrICYmIHRhc2sgIT0gY3VycmVudCkKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7CisJfQorCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwlpZiAoIWJwKSB7CisJCWlmICh0YXNrID09IGN1cnJlbnQpIHsKKwkJCS8qIEdyYWIgYnAgcmlnaHQgZnJvbSBvdXIgcmVncyAqLworCQkJZ2V0X2JwKGJwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCisJCQlicCA9ICoodW5zaWduZWQgbG9uZyAqKSB0YXNrLT50aHJlYWQuc3A7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogUHJpbnQgZnVuY3Rpb24gY2FsbCBlbnRyaWVzIGluIGFsbCBzdGFja3MsIHN0YXJ0aW5nIGF0IHRoZQorCSAqIGN1cnJlbnQgc3RhY2sgYWRkcmVzcy4gSWYgdGhlIHN0YWNrcyBjb25zaXN0IG9mIG5lc3RlZAorCSAqIGV4Y2VwdGlvbnMKKwkgKi8KKwl0aW5mbyA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7CisJZm9yICg7OykgeworCQljaGFyICppZDsKKwkJdW5zaWduZWQgbG9uZyAqZXN0YWNrX2VuZDsKKwkJZXN0YWNrX2VuZCA9IGluX2V4Y2VwdGlvbl9zdGFjayhjcHUsICh1bnNpZ25lZCBsb25nKXN0YWNrLAorCQkJCQkJJnVzZWQsICZpZCk7CisKKwkJaWYgKGVzdGFja19lbmQpIHsKKwkJCWlmIChvcHMtPnN0YWNrKGRhdGEsIGlkKSA8IDApCisJCQkJYnJlYWs7CisKKwkJCWJwID0gcHJpbnRfY29udGV4dF9zdGFjayh0aW5mbywgc3RhY2ssIGJwLCBvcHMsCisJCQkJCQkJZGF0YSwgZXN0YWNrX2VuZCk7CisJCQlvcHMtPnN0YWNrKGRhdGEsICI8RU9FPiIpOworCQkJLyoKKwkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgdmlhIHRoZQorCQkJICogc2Vjb25kLXRvLWxhc3QgcG9pbnRlciAoaW5kZXggLTIgdG8gZW5kKSBpbiB0aGUKKwkJCSAqIGV4Y2VwdGlvbiBzdGFjazoKKwkJCSAqLworCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSBlc3RhY2tfZW5kWy0yXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpcnFzdGFja19lbmQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgKmlycXN0YWNrOworCQkJaXJxc3RhY2sgPSBpcnFzdGFja19lbmQgLQorCQkJCShJUlFTVEFDS1NJWkUgLSA2NCkgLyBzaXplb2YoKmlycXN0YWNrKTsKKworCQkJaWYgKHN0YWNrID49IGlycXN0YWNrICYmIHN0YWNrIDwgaXJxc3RhY2tfZW5kKSB7CisJCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJYnAgPSBwcmludF9jb250ZXh0X3N0YWNrKHRpbmZvLCBzdGFjaywgYnAsCisJCQkJCQlvcHMsIGRhdGEsIGlycXN0YWNrX2VuZCk7CisJCQkJLyoKKwkJCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrICh3aGljaCB3b3VsZCBiZQorCQkJCSAqIHRoZSBwcm9jZXNzIHN0YWNrIG5vcm1hbGx5KSB0aGUgbGFzdAorCQkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKKwkJCQkgKi8KKwkJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChpcnFzdGFja19lbmRbLTFdKTsKKwkJCQlpcnFzdGFja19lbmQgPSBOVUxMOworCQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCS8qCisJICogVGhpcyBoYW5kbGVzIHRoZSBwcm9jZXNzIHN0YWNrOgorCSAqLworCWJwID0gcHJpbnRfY29udGV4dF9zdGFjayh0aW5mbywgc3RhY2ssIGJwLCBvcHMsIGRhdGEsIE5VTEwpOworCXB1dF9jcHUoKTsKK30KK0VYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CisKK3N0YXRpYyB2b2lkCitwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQoreworCXByaW50ayhkYXRhKTsKKwlwcmludF9zeW1ib2wobXNnLCBzeW1ib2wpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHJhY2Vfd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCit7CisJcHJpbnRrKCIlcyVzXG4iLCAoY2hhciAqKWRhdGEsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKK3sKKwlwcmludGsoIiVzIDwlcz4gIiwgKGNoYXIgKilkYXRhLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IG9uZSBhZGRyZXNzL3N5bWJvbCBlbnRyaWVzIHBlciBsaW5lLgorICovCitzdGF0aWMgdm9pZCBwcmludF90cmFjZV9hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQoreworCXRvdWNoX25taV93YXRjaGRvZygpOworCXByaW50ayhkYXRhKTsKKwlwcmludGtfYWRkcmVzcyhhZGRyLCByZWxpYWJsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgcHJpbnRfdHJhY2Vfb3BzID0geworCS53YXJuaW5nID0gcHJpbnRfdHJhY2Vfd2FybmluZywKKwkud2FybmluZ19zeW1ib2wgPSBwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCwKKwkuc3RhY2sgPSBwcmludF90cmFjZV9zdGFjaywKKwkuYWRkcmVzcyA9IHByaW50X3RyYWNlX2FkZHJlc3MsCit9OworCitzdGF0aWMgdm9pZAorc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQoreworCXByaW50aygiJXNDYWxsIFRyYWNlOlxuIiwgbG9nX2x2bCk7CisJZHVtcF90cmFjZSh0YXNrLCByZWdzLCBzdGFjaywgYnAsICZwcmludF90cmFjZV9vcHMsIGxvZ19sdmwpOworfQorCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnApCit7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHN0YWNrLCBicCwgIiIpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQoreworCXVuc2lnbmVkIGxvbmcgKnN0YWNrOworCWludCBpOworCWNvbnN0IGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyAqaXJxc3RhY2tfZW5kID0KKwkJKHVuc2lnbmVkIGxvbmcgKikgKGNwdV9wZGEoY3B1KS0+aXJxc3RhY2twdHIpOworCXVuc2lnbmVkIGxvbmcgKmlycXN0YWNrID0KKwkJKHVuc2lnbmVkIGxvbmcgKikgKGNwdV9wZGEoY3B1KS0+aXJxc3RhY2twdHIgLSBJUlFTVEFDS1NJWkUpOworCisJLyoKKwkgKiBkZWJ1Z2dpbmcgYWlkOiAic2hvd19zdGFjayhOVUxMLCBOVUxMKTsiIHByaW50cyB0aGUKKwkgKiBiYWNrIHRyYWNlIGZvciB0aGlzIGNwdS4KKwkgKi8KKworCWlmIChzcCA9PSBOVUxMKSB7CisJCWlmICh0YXNrKQorCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKKwkJZWxzZQorCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKKwl9CisKKwlzdGFjayA9IHNwOworCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgeworCQlpZiAoc3RhY2sgPj0gaXJxc3RhY2sgJiYgc3RhY2sgPD0gaXJxc3RhY2tfZW5kKSB7CisJCQlpZiAoc3RhY2sgPT0gaXJxc3RhY2tfZW5kKSB7CisJCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoaXJxc3RhY2tfZW5kWy0xXSk7CisJCQkJcHJpbnRrKCIgPEVPST4gIik7CisJCQl9CisJCX0gZWxzZSB7CisJCWlmICgoKGxvbmcpIHN0YWNrICYgKFRIUkVBRF9TSVpFLTEpKSA9PSAwKQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgJiYgKChpICUgU1RBQ0tTTE9UU19QRVJfTElORSkgPT0gMCkpCisJCQlwcmludGsoIlxuJXMiLCBsb2dfbHZsKTsKKwkJcHJpbnRrKCIgJTAxNmx4IiwgKnN0YWNrKyspOworCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgYnAsIGxvZ19sdmwpOworfQorCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgTlVMTCwgc3AsIDAsICIiKTsKK30KKworLyoKKyAqIFRoZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZHVtcF9zdGFjayBnZW5lcmF0b3IKKyAqLwordm9pZCBkdW1wX3N0YWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBicCA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKKworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJaWYgKCFicCkKKwkJZ2V0X2JwKGJwKTsKKyNlbmRpZgorCisJcHJpbnRrKCJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlcyAlLipzXG4iLAorCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwKKwkJaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCisJCShpbnQpc3RyY3Nwbihpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgIiAiKSwKKwkJaW5pdF91dHNuYW1lKCktPnZlcnNpb24pOworCXNob3dfdHJhY2UoTlVMTCwgTlVMTCwgJnN0YWNrLCBicCk7Cit9CitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc3A7CisJY29uc3QgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1ciA9IGNwdV9wZGEoY3B1KS0+cGN1cnJlbnQ7CisKKwlzcCA9IHJlZ3MtPnNwOworCXByaW50aygiQ1BVICVkICIsIGNwdSk7CisJX19zaG93X3JlZ3MocmVncywgMSk7CisJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCB0aHJlYWRpbmZvICVwLCB0YXNrICVwKVxuIiwKKwkJY3VyLT5jb21tLCBjdXItPnBpZCwgdGFza190aHJlYWRfaW5mbyhjdXIpLCBjdXIpOworCisJLyoKKwkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCQl1bnNpZ25lZCBpbnQgY29kZV9wcm9sb2d1ZSA9IGNvZGVfYnl0ZXMgKiA0MyAvIDY0OworCQl1bnNpZ25lZCBpbnQgY29kZV9sZW4gPSBjb2RlX2J5dGVzOworCQl1bnNpZ25lZCBjaGFyIGM7CisJCXU4ICppcDsKKworCQlwcmludGsoS0VSTl9FTUVSRyAiU3RhY2s6XG4iKTsKKwkJc2hvd19zdGFja19sb2dfbHZsKE5VTEwsIHJlZ3MsICh1bnNpZ25lZCBsb25nICopc3AsCisJCQkJcmVncy0+YnAsIEtFUk5fRU1FUkcpOworCisJCXByaW50ayhLRVJOX0VNRVJHICJDb2RlOiAiKTsKKworCQlpcCA9ICh1OCAqKXJlZ3MtPmlwIC0gY29kZV9wcm9sb2d1ZTsKKwkJaWYgKGlwIDwgKHU4ICopUEFHRV9PRkZTRVQgfHwgcHJvYmVfa2VybmVsX2FkZHJlc3MoaXAsIGMpKSB7CisJCQkvKiB0cnkgc3RhcnRpbmcgYXQgSVAgKi8KKwkJCWlwID0gKHU4ICopcmVncy0+aXA7CisJCQljb2RlX2xlbiA9IGNvZGVfbGVuIC0gY29kZV9wcm9sb2d1ZSArIDE7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGNvZGVfbGVuOyBpKyssIGlwKyspIHsKKwkJCWlmIChpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8CisJCQkJCXByb2JlX2tlcm5lbF9hZGRyZXNzKGlwLCBjKSkgeworCQkJCXByaW50aygiIEJhZCBSSVAgdmFsdWUuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaXAgPT0gKHU4ICopcmVncy0+aXApCisJCQkJcHJpbnRrKCI8JTAyeD4gIiwgYyk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOworCQl9CisJfQorCXByaW50aygiXG4iKTsKK30KKworaW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBpcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB1ZDI7CisKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmdWQyLCAoY29uc3Qgdm9pZCBfX3VzZXIgKikgaXAsIHNpemVvZih1ZDIpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdWQyID09IDB4MGIwZjsKK30KKworc3RhdGljIHJhd19zcGlubG9ja190IGRpZV9sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIGludCBkaWVfb3duZXIgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGllX25lc3RfY291bnQ7CisKK3Vuc2lnbmVkIF9fa3Byb2JlcyBsb25nIG9vcHNfYmVnaW4odm9pZCkKK3sKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlvb3BzX2VudGVyKCk7CisKKwkvKiByYWN5LCBidXQgYmV0dGVyIHRoYW4gcmlza2luZyBkZWFkbG9jay4gKi8KKwlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIV9fcmF3X3NwaW5fdHJ5bG9jaygmZGllX2xvY2spKSB7CisJCWlmIChjcHUgPT0gZGllX293bmVyKQorCQkJLyogbmVzdGVkIG9vcHMuIHNob3VsZCBzdG9wIGV2ZW50dWFsbHkgKi87CisJCWVsc2UKKwkJCV9fcmF3X3NwaW5fbG9jaygmZGllX2xvY2spOworCX0KKwlkaWVfbmVzdF9jb3VudCsrOworCWRpZV9vd25lciA9IGNwdTsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlidXN0X3NwaW5sb2NrcygxKTsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgX19rcHJvYmVzIG9vcHNfZW5kKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2lnbnIpCit7CisJZGllX293bmVyID0gLTE7CisJYnVzdF9zcGlubG9ja3MoMCk7CisJZGllX25lc3RfY291bnQtLTsKKwlpZiAoIWRpZV9uZXN0X2NvdW50KQorCQkvKiBOZXN0IGNvdW50IHJlYWNoZXMgemVybywgcmVsZWFzZSB0aGUgbG9jay4gKi8KKwkJX19yYXdfc3Bpbl91bmxvY2soJmRpZV9sb2NrKTsKKwlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWlmICghcmVncykgeworCQlvb3BzX2V4aXQoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CisJaWYgKHBhbmljX29uX29vcHMpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb24iKTsKKwlvb3BzX2V4aXQoKTsKKwlkb19leGl0KHNpZ25yKTsKK30KKworaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiJXM6ICUwNGx4IFsjJWRdICIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXByaW50aygiUFJFRU1QVCAiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTVAKKwlwcmludGsoIlNNUCAiKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKwlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOworI2VuZGlmCisJcHJpbnRrKCJcbiIpOworCXN5c2ZzX3ByaW50a19sYXN0X2ZpbGUoKTsKKwlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsCisJCQljdXJyZW50LT50aHJlYWQudHJhcF9ubywgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybiAxOworCisJc2hvd19yZWdpc3RlcnMocmVncyk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CisJLyogRXhlY3V0aXZlIHN1bW1hcnkgaW4gY2FzZSB0aGUgb29wcyBzY3JvbGxlZCBhd2F5ICovCisJcHJpbnRrKEtFUk5fQUxFUlQgIlJJUCAiKTsKKwlwcmludGtfYWRkcmVzcyhyZWdzLT5pcCwgMSk7CisJcHJpbnRrKCIgUlNQIDwlMDE2bHg+XG4iLCByZWdzLT5zcCk7CisJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKKwkJY3Jhc2hfa2V4ZWMocmVncyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvb3BzX2JlZ2luKCk7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcmVwb3J0X2J1ZyhyZWdzLT5pcCwgcmVncyk7CisKKwlpZiAoX19kaWUoc3RyLCByZWdzLCBlcnIpKQorCQlyZWdzID0gTlVMTDsKKwlvb3BzX2VuZChmbGFncywgcmVncywgU0lHU0VHVik7Cit9CisKK25vdHJhY2UgX19rcHJvYmVzIHZvaWQKK2RpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGRvX3BhbmljKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobm90aWZ5X2RpZShESUVfTk1JV0FUQ0hET0csIHN0ciwgcmVncywgMCwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCisJZmxhZ3MgPSBvb3BzX2JlZ2luKCk7CisJLyoKKwkgKiBXZSBhcmUgaW4gdHJvdWJsZSBhbnl3YXksIGxldHMgYXQgbGVhc3QgdHJ5CisJICogdG8gZ2V0IGEgbWVzc2FnZSBvdXQuCisJICovCisJcHJpbnRrKEtFUk5fRU1FUkcgIiVzIiwgc3RyKTsKKwlwcmludGsoIiBvbiBDUFUlZCwgaXAgJTA4bHgsIHJlZ2lzdGVyczpcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncy0+aXApOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpCisJCWNyYXNoX2tleGVjKHJlZ3MpOworCWlmIChkb19wYW5pYyB8fCBwYW5pY19vbl9vb3BzKQorCQlwYW5pYygiTm9uIG1hc2thYmxlIGludGVycnVwdCIpOworCW9vcHNfZW5kKGZsYWdzLCBOVUxMLCBTSUdCVVMpOworCW5taV9leGl0KCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWRvX2V4aXQoU0lHQlVTKTsKK30KKworc3RhdGljIGludCBfX2luaXQgb29wc19zZXR1cChjaGFyICpzKQoreworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFzdHJjbXAocywgInBhbmljIikpCisJCXBhbmljX29uX29vcHMgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm9vcHMiLCBvb3BzX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQga3N0YWNrX3NldHVwKGNoYXIgKnMpCit7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSBzaW1wbGVfc3RydG91bChzLCBOVUxMLCAwKTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJrc3RhY2siLCBrc3RhY2tfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBjb2RlX2J5dGVzX3NldHVwKGNoYXIgKnMpCit7CisJY29kZV9ieXRlcyA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOworCWlmIChjb2RlX2J5dGVzID4gODE5MikKKwkJY29kZV9ieXRlcyA9IDgxOTI7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNvZGVfYnl0ZXM9IiwgY29kZV9ieXRlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCA5YWY4OTA3Li5jZTk3YmYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTE0OCw2ICsxNDgsOSBAQAogCQljYXNlIEU4MjBfTlZTOgogCQkJcHJpbnRrKEtFUk5fQ09OVCAiKEFDUEkgTlZTKVxuIik7CiAJCQlicmVhazsKKwkJY2FzZSBFODIwX1VOVVNBQkxFOgorCQkJcHJpbnRrKCIodW51c2FibGUpXG4iKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fQ09OVCAidHlwZSAldVxuIiwgZTgyMC5tYXBbaV0udHlwZSk7CiAJCQlicmVhazsKQEAgLTEyMDMsNyArMTIwNiw3IEBACiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghc3RyY21wKHAsICJleGFjdG1hcCIpKSB7CisJaWYgKCFzdHJuY21wKHAsICJleGFjdG1hcCIsIDgpKSB7CiAjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKIAkJLyoKIAkJICogSWYgd2UgYXJlIGRvaW5nIGEgY3Jhc2ggZHVtcCwgd2Ugc3RpbGwgbmVlZCB0byBrbm93CkBAIC0xMjYwLDYgKzEyNjMsNyBAQAogCWNhc2UgRTgyMF9SQU06CXJldHVybiAiU3lzdGVtIFJBTSI7CiAJY2FzZSBFODIwX0FDUEk6CXJldHVybiAiQUNQSSBUYWJsZXMiOwogCWNhc2UgRTgyMF9OVlM6CXJldHVybiAiQUNQSSBOb24tdm9sYXRpbGUgU3RvcmFnZSI7CisJY2FzZSBFODIwX1VOVVNBQkxFOglyZXR1cm4gIlVudXNhYmxlIG1lbW9yeSI7CiAJZGVmYXVsdDoJcmV0dXJuICJyZXNlcnZlZCI7CiAJfQogfQpAQCAtMTI2Nyw2ICsxMjcxLDcgQEAKIC8qCiAgKiBNYXJrIGU4MjAgcmVzZXJ2ZWQgYXJlYXMgYXMgYnVzeSBmb3IgdGhlIHJlc291cmNlIG1hbmFnZXIuCiAgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19pbml0ZGF0YSAqZTgyMF9yZXM7CiB2b2lkIF9faW5pdCBlODIwX3Jlc2VydmVfcmVzb3VyY2VzKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0xMjc0LDIwICsxMjc5LDI2IEBACiAJdTY0IGVuZDsKIAogCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogZTgyMC5ucl9tYXApOworCWU4MjBfcmVzID0gcmVzOwogCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CiAJCWVuZCA9IGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplIC0gMTsKLSNpZm5kZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAotCQlpZiAoZW5kID4gMHgxMDAwMDAwMDBVTEwpIHsKKwkJaWYgKGVuZCAhPSAocmVzb3VyY2Vfc2l6ZV90KWVuZCkgewogCQkJcmVzKys7CiAJCQljb250aW51ZTsKIAkJfQotI2VuZGlmCiAJCXJlcy0+bmFtZSA9IGU4MjBfdHlwZV90b19zdHJpbmcoZTgyMC5tYXBbaV0udHlwZSk7CiAJCXJlcy0+c3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOwogCQlyZXMtPmVuZCA9IGVuZDsKIAogCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7Ci0JCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisKKwkJLyoKKwkJICogZG9uJ3QgcmVnaXN0ZXIgdGhlIHJlZ2lvbiB0aGF0IGNvdWxkIGJlIGNvbmZsaWN0ZWQgd2l0aAorCQkgKiBwY2kgZGV2aWNlIEJBUiByZXNvdXJjZSBhbmQgaW5zZXJ0IHRoZW0gbGF0ZXIgaW4KKwkJICogcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKQorCQkgKi8KKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgIT0gRTgyMF9SRVNFUlZFRCB8fCByZXMtPnN0YXJ0IDwgKDFVTEw8PDIwKSkKKwkJCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CiAJCXJlcysrOwogCX0KIApAQCAtMTI5OSw2ICsxMzEwLDE5IEBACiAJfQogfQogCit2b2lkIF9faW5pdCBlODIwX3Jlc2VydmVfcmVzb3VyY2VzX2xhdGUodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IGU4MjBfcmVzOworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCWlmICghcmVzLT5wYXJlbnQgJiYgcmVzLT5lbmQpCisJCQlyZXNlcnZlX3JlZ2lvbl93aXRoX3NwbGl0KCZpb21lbV9yZXNvdXJjZSwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIHJlcy0+bmFtZSk7CisJCXJlcysrOworCX0KK30KKwogY2hhciAqX19pbml0IGRlZmF1bHRfbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCkKIHsKIAljaGFyICp3aG8gPSAiQklPUy1lODIwIjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCA0MzUzY2Y1Li43MzNjNGY4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC05NSw2ICs5NSw2NiBAQAogCiB9CiAKK3N0YXRpYyB1MzIgYXRpX2l4cDR4MF9yZXYoaW50IG51bSwgaW50IHNsb3QsIGludCBmdW5jKQoreworCXUzMiBkOworCXU4ICBiOworCisJYiA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSwgc2xvdCwgZnVuYywgMHhhYyk7CisJYiAmPSB+KDE8PDUpOworCXdyaXRlX3BjaV9jb25maWdfYnl0ZShudW0sIHNsb3QsIGZ1bmMsIDB4YWMsIGIpOworCisJZCA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsIDB4NzApOworCWQgfD0gMTw8ODsKKwl3cml0ZV9wY2lfY29uZmlnKG51bSwgc2xvdCwgZnVuYywgMHg3MCwgZCk7CisKKwlkID0gcmVhZF9wY2lfY29uZmlnKG51bSwgc2xvdCwgZnVuYywgMHg4KTsKKwlkICY9IDB4ZmY7CisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdGlfYnVncyhpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZCAoQ09ORklHX1g4Nl9JT19BUElDKQorCXUzMiBkOworCXU4ICBiOworCisJaWYgKGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlKQorCQlyZXR1cm47CisKKwlkID0gYXRpX2l4cDR4MF9yZXYobnVtLCBzbG90LCBmdW5jKTsKKwlpZiAoZCAgPCAweDgyKQorCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOworCWVsc2UgeworCQkvKiBjaGVjayBmb3IgSVJRMCBpbnRlcnJ1cHQgc3dhcCAqLworCQlvdXRiKDB4NzIsIDB4Y2Q2KTsgYiA9IGluYigweGNkNyk7CisJCWlmICghKGIgJiAweDIpKQorCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKKwl9CisKKwlpZiAoYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNCNFgwIHJldmlzaW9uIDB4JXhcbiIsIGQpOworCQlwcmludGsoS0VSTl9JTkZPICJJZ25vcmluZyBBQ1BJIHRpbWVyIG92ZXJyaWRlLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIklmIHlvdSBnb3QgdGltZXIgdHJvdWJsZSAiCisJCSAgICAgICAidHJ5IGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlXG4iKTsKKwl9CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19ETUFSCitzdGF0aWMgdm9pZCBfX2luaXQgaW50ZWxfZzMzX2RtYXIoaW50IG51bSwgaW50IHNsb3QsIGludCBmdW5jKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZG1hcl90Ymw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdfRE1BUiwgMCwgJmRtYXJfdGJsKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBCVUc6IERNQVIgYWR2ZXJ0aXNlZCBvbiBJbnRlbCBHMzEvRzMzIGNoaXBzZXQgLS0gaWdub3JpbmdcbiIpOworCQlkbWFyX2Rpc2FibGVkID0gMTsKKwl9Cit9CisjZW5kaWYKKwogI2RlZmluZSBRRkxBR19BUFBMWV9PTkNFIAkweDEKICNkZWZpbmUgUUZMQUdfQVBQTElFRAkJMHgyCiAjZGVmaW5lIFFGTEFHX0RPTkUJCShRRkxBR19BUFBMWV9PTkNFfFFGTEFHX0FQUExJRUQpCkBAIC0xMTQsNiArMTc0LDEyIEBACiAJICBQQ0lfQ0xBU1NfQlJJREdFX1BDSSwgUENJX0FOWV9JRCwgUUZMQUdfQVBQTFlfT05DRSwgdmlhX2J1Z3MgfSwKIAl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9LOF9OQiwKIAkgIFBDSV9DTEFTU19CUklER0VfSE9TVCwgUENJX0FOWV9JRCwgMCwgZml4X2h5cGVydHJhbnNwb3J0X2NvbmZpZyB9LAorCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDQwMF9TTUJVUywKKwkgIFBDSV9DTEFTU19TRVJJQUxfU01CVVMsIFBDSV9BTllfSUQsIDAsIGF0aV9idWdzIH0sCisjaWZkZWYgQ09ORklHX0RNQVIKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjljMCwKKwkgIFBDSV9DTEFTU19CUklER0VfSE9TVCwgUENJX0FOWV9JRCwgMCwgaW50ZWxfZzMzX2RtYXIgfSwKKyNlbmRpZgogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggZmY5ZTczNS4uMzRhZDk5NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMywxMSArMywxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vZmNudGwuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDx4ZW4vaHZjLWNvbnNvbGUuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9laGNpX2RlZi5oPgogCiAvKiBTaW1wbGUgVkdBIG91dHB1dCAqLwogI2RlZmluZSBWR0FCQVNFCQkoX19JU0FfSU9fYmFzZSArIDB4YjgwMDApCkBAIC03OCw2ICs4Niw3IEBACiBzdGF0aWMgaW50IGVhcmx5X3NlcmlhbF9wdXRjKHVuc2lnbmVkIGNoYXIgY2gpCiB7CiAJdW5zaWduZWQgdGltZW91dCA9IDB4ZmZmZjsKKwogCXdoaWxlICgoaW5iKGVhcmx5X3NlcmlhbF9iYXNlICsgTFNSKSAmIFhNVFJEWSkgPT0gMCAmJiAtLXRpbWVvdXQpCiAJCWNwdV9yZWxheCgpOwogCW91dGIoY2gsIGVhcmx5X3NlcmlhbF9iYXNlICsgVFhSKTsKQEAgLTExMSw3ICsxMjAsNyBAQAogCQlpZiAoIXN0cm5jbXAocywgIjB4IiwgMikpIHsKIAkJCWVhcmx5X3NlcmlhbF9iYXNlID0gc2ltcGxlX3N0cnRvdWwocywgJmUsIDE2KTsKIAkJfSBlbHNlIHsKLQkJCXN0YXRpYyBpbnQgYmFzZXNbXSA9IHsgMHgzZjgsIDB4MmY4IH07CisJCQlzdGF0aWMgY29uc3QgaW50IF9faW5pdGNvbnN0IGJhc2VzW10gPSB7IDB4M2Y4LCAweDJmOCB9OwogCiAJCQlpZiAoIXN0cm5jbXAocywgInR0eVMiLCA0KSkKIAkJCQlzICs9IDQ7CkBAIC0xNTEsNiArMTYwLDcyMSBAQAogCS5pbmRleCA9CS0xLAogfTsKIAorI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEtfREJHUAorCitzdGF0aWMgc3RydWN0IGVoY2lfY2FwcyBfX2lvbWVtICplaGNpX2NhcHM7CitzdGF0aWMgc3RydWN0IGVoY2lfcmVncyBfX2lvbWVtICplaGNpX3JlZ3M7CitzdGF0aWMgc3RydWN0IGVoY2lfZGJnX3BvcnQgX19pb21lbSAqZWhjaV9kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGJncF9lbmRwb2ludF9vdXQ7CisKK3N0cnVjdCBlaGNpX2RldiB7CisJdTMyIGJ1czsKKwl1MzIgc2xvdDsKKwl1MzIgZnVuYzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWhjaV9kZXYgZWhjaV9kZXY7CisKKyNkZWZpbmUgVVNCX0RFQlVHX0RFVk5VTSAxMjcKKworI2RlZmluZSBEQkdQX0RBVEFfVE9HR0xFCTB4ODgwMAorCitzdGF0aWMgaW5saW5lIHUzMiBkYmdwX3BpZF91cGRhdGUodTMyIHgsIHUzMiB0b2spCit7CisJcmV0dXJuICgoeCBeIERCR1BfREFUQV9UT0dHTEUpICYgMHhmZmZmMDApIHwgKHRvayAmIDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBkYmdwX2xlbl91cGRhdGUodTMyIHgsIHUzMiBsZW4pCit7CisJcmV0dXJuICh4ICYgfjB4MGYpIHwgKGxlbiAmIDB4MGYpOworfQorCisvKgorICogVVNCIFBhY2tldCBJRHMgKFBJRHMpCisgKi8KKworLyogdG9rZW4gKi8KKyNkZWZpbmUgVVNCX1BJRF9PVVQJCTB4ZTEKKyNkZWZpbmUgVVNCX1BJRF9JTgkJMHg2OQorI2RlZmluZSBVU0JfUElEX1NPRgkJMHhhNQorI2RlZmluZSBVU0JfUElEX1NFVFVQCQkweDJkCisvKiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgVVNCX1BJRF9BQ0sJCTB4ZDIKKyNkZWZpbmUgVVNCX1BJRF9OQUsJCTB4NWEKKyNkZWZpbmUgVVNCX1BJRF9TVEFMTAkJMHgxZQorI2RlZmluZSBVU0JfUElEX05ZRVQJCTB4OTYKKy8qIGRhdGEgKi8KKyNkZWZpbmUgVVNCX1BJRF9EQVRBMAkJMHhjMworI2RlZmluZSBVU0JfUElEX0RBVEExCQkweDRiCisjZGVmaW5lIFVTQl9QSURfREFUQTIJCTB4ODcKKyNkZWZpbmUgVVNCX1BJRF9NREFUQQkJMHgwZgorLyogU3BlY2lhbCAqLworI2RlZmluZSBVU0JfUElEX1BSRUFNQkxFCTB4M2MKKyNkZWZpbmUgVVNCX1BJRF9FUlIJCTB4M2MKKyNkZWZpbmUgVVNCX1BJRF9TUExJVAkJMHg3OAorI2RlZmluZSBVU0JfUElEX1BJTkcJCTB4YjQKKyNkZWZpbmUgVVNCX1BJRF9VTkRFRl8wCQkweGYwCisKKyNkZWZpbmUgVVNCX1BJRF9EQVRBX1RPR0dMRQkweDg4CisjZGVmaW5lIERCR1BfQ0xBSU0gKERCR1BfT1dORVIgfCBEQkdQX0VOQUJMRUQgfCBEQkdQX0lOVVNFKQorCisjZGVmaW5lIFBDSV9DQVBfSURfRUhDSV9ERUJVRwkweGEKKworI2RlZmluZSBIVUJfUk9PVF9SRVNFVF9USU1FCTUwCS8qIHRpbWVzIGFyZSBpbiBtc2VjICovCisjZGVmaW5lIEhVQl9TSE9SVF9SRVNFVF9USU1FCTEwCisjZGVmaW5lIEhVQl9MT05HX1JFU0VUX1RJTUUJMjAwCisjZGVmaW5lIEhVQl9SRVNFVF9USU1FT1VUCTUwMAorCisjZGVmaW5lIERCR1BfTUFYX1BBQ0tFVAkJOAorCitzdGF0aWMgaW50IGRiZ3Bfd2FpdF91bnRpbF9jb21wbGV0ZSh2b2lkKQoreworCXUzMiBjdHJsOworCWludCBsb29wID0gMHgxMDAwMDA7CisKKwlkbyB7CisJCWN0cmwgPSByZWFkbCgmZWhjaV9kZWJ1Zy0+Y29udHJvbCk7CisJCS8qIFN0b3Agd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQgKi8KKwkJaWYgKGN0cmwgJiBEQkdQX0RPTkUpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWxvb3AgPiAwKTsKKworCWlmICghbG9vcCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIG9ic2VydmVkIHRoZSBjb21wbGV0ZWQgdHJhbnNhY3Rpb24sCisJICogY2xlYXIgdGhlIGRvbmUgYml0LgorCSAqLworCXdyaXRlbChjdHJsIHwgREJHUF9ET05FLCAmZWhjaV9kZWJ1Zy0+Y29udHJvbCk7CisJcmV0dXJuIChjdHJsICYgREJHUF9FUlJPUikgPyAtREJHUF9FUlJDT0RFKGN0cmwpIDogREJHUF9MRU4oY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkIGRiZ3BfbWRlbGF5KGludCBtcykKK3sKKwlpbnQgaTsKKworCXdoaWxlIChtcy0tKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCQlvdXRiKDB4MSwgMHg4MCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYmdwX2JyZWF0aCh2b2lkKQoreworCS8qIFNsZWVwIHRvIGdpdmUgdGhlIGRlYnVnIHBvcnQgYSBjaGFuY2UgdG8gYnJlYXRoZSAqLworfQorCitzdGF0aWMgaW50IGRiZ3Bfd2FpdF91bnRpbF9kb25lKHVuc2lnbmVkIGN0cmwpCit7CisJdTMyIHBpZHMsIGxwaWQ7CisJaW50IHJldDsKKwlpbnQgbG9vcCA9IDM7CisKK3JldHJ5OgorCXdyaXRlbChjdHJsIHwgREJHUF9HTywgJmVoY2lfZGVidWctPmNvbnRyb2wpOworCXJldCA9IGRiZ3Bfd2FpdF91bnRpbF9jb21wbGV0ZSgpOworCXBpZHMgPSByZWFkbCgmZWhjaV9kZWJ1Zy0+cGlkcyk7CisJbHBpZCA9IERCR1BfUElEX0dFVChwaWRzKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyBnZXR0aW5nIGZ1bGwgb3IgaXQgaGFzIGRyb3BwZWQgZGF0YQorCSAqIHN0YXJ0IHBhY2luZyBvdXJzZWx2ZXMsIG5vdCBuZWNlc3NhcnkgYnV0IGl0J3MgZnJpZW5kbHkuCisJICovCisJaWYgKChscGlkID09IFVTQl9QSURfTkFLKSB8fCAobHBpZCA9PSBVU0JfUElEX05ZRVQpKQorCQlkYmdwX2JyZWF0aCgpOworCisJLyogSWYgSSBnZXQgYSBOQUNLIHJlaXNzdWUgdGhlIHRyYW5zbWlzc2lvbiAqLworCWlmIChscGlkID09IFVTQl9QSURfTkFLKSB7CisJCWlmICgtLWxvb3AgPiAwKQorCQkJZ290byByZXRyeTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkYmdwX3NldF9kYXRhKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSBidWY7CisJdTMyIGxvLCBoaTsKKwlpbnQgaTsKKworCWxvID0gaGkgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0ICYmIGkgPCBzaXplOyBpKyspCisJCWxvIHw9IGJ5dGVzW2ldIDw8ICg4KmkpOworCWZvciAoOyBpIDwgOCAmJiBpIDwgc2l6ZTsgaSsrKQorCQloaSB8PSBieXRlc1tpXSA8PCAoOCooaSAtIDQpKTsKKwl3cml0ZWwobG8sICZlaGNpX2RlYnVnLT5kYXRhMDMpOworCXdyaXRlbChoaSwgJmVoY2lfZGVidWctPmRhdGE0Nyk7Cit9CisKK3N0YXRpYyB2b2lkIGRiZ3BfZ2V0X2RhdGEodm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpieXRlcyA9IGJ1ZjsKKwl1MzIgbG8sIGhpOworCWludCBpOworCisJbG8gPSByZWFkbCgmZWhjaV9kZWJ1Zy0+ZGF0YTAzKTsKKwloaSA9IHJlYWRsKCZlaGNpX2RlYnVnLT5kYXRhNDcpOworCWZvciAoaSA9IDA7IGkgPCA0ICYmIGkgPCBzaXplOyBpKyspCisJCWJ5dGVzW2ldID0gKGxvID4+ICg4KmkpKSAmIDB4ZmY7CisJZm9yICg7IGkgPCA4ICYmIGkgPCBzaXplOyBpKyspCisJCWJ5dGVzW2ldID0gKGhpID4+ICg4KihpIC0gNCkpKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgZGJncF9idWxrX3dyaXRlKHVuc2lnbmVkIGRldm51bSwgdW5zaWduZWQgZW5kcG9pbnQsCisJCQkgY29uc3QgY2hhciAqYnl0ZXMsIGludCBzaXplKQoreworCXUzMiBwaWRzLCBhZGRyLCBjdHJsOworCWludCByZXQ7CisKKwlpZiAoc2l6ZSA+IERCR1BfTUFYX1BBQ0tFVCkKKwkJcmV0dXJuIC0xOworCisJYWRkciA9IERCR1BfRVBBRERSKGRldm51bSwgZW5kcG9pbnQpOworCisJcGlkcyA9IHJlYWRsKCZlaGNpX2RlYnVnLT5waWRzKTsKKwlwaWRzID0gZGJncF9waWRfdXBkYXRlKHBpZHMsIFVTQl9QSURfT1VUKTsKKworCWN0cmwgPSByZWFkbCgmZWhjaV9kZWJ1Zy0+Y29udHJvbCk7CisJY3RybCA9IGRiZ3BfbGVuX3VwZGF0ZShjdHJsLCBzaXplKTsKKwljdHJsIHw9IERCR1BfT1VUOworCWN0cmwgfD0gREJHUF9HTzsKKworCWRiZ3Bfc2V0X2RhdGEoYnl0ZXMsIHNpemUpOworCXdyaXRlbChhZGRyLCAmZWhjaV9kZWJ1Zy0+YWRkcmVzcyk7CisJd3JpdGVsKHBpZHMsICZlaGNpX2RlYnVnLT5waWRzKTsKKworCXJldCA9IGRiZ3Bfd2FpdF91bnRpbF9kb25lKGN0cmwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYmdwX2J1bGtfcmVhZCh1bnNpZ25lZCBkZXZudW0sIHVuc2lnbmVkIGVuZHBvaW50LCB2b2lkICpkYXRhLAorCQkJCSBpbnQgc2l6ZSkKK3sKKwl1MzIgcGlkcywgYWRkciwgY3RybDsKKwlpbnQgcmV0OworCisJaWYgKHNpemUgPiBEQkdQX01BWF9QQUNLRVQpCisJCXJldHVybiAtMTsKKworCWFkZHIgPSBEQkdQX0VQQUREUihkZXZudW0sIGVuZHBvaW50KTsKKworCXBpZHMgPSByZWFkbCgmZWhjaV9kZWJ1Zy0+cGlkcyk7CisJcGlkcyA9IGRiZ3BfcGlkX3VwZGF0ZShwaWRzLCBVU0JfUElEX0lOKTsKKworCWN0cmwgPSByZWFkbCgmZWhjaV9kZWJ1Zy0+Y29udHJvbCk7CisJY3RybCA9IGRiZ3BfbGVuX3VwZGF0ZShjdHJsLCBzaXplKTsKKwljdHJsICY9IH5EQkdQX09VVDsKKwljdHJsIHw9IERCR1BfR087CisKKwl3cml0ZWwoYWRkciwgJmVoY2lfZGVidWctPmFkZHJlc3MpOworCXdyaXRlbChwaWRzLCAmZWhjaV9kZWJ1Zy0+cGlkcyk7CisJcmV0ID0gZGJncF93YWl0X3VudGlsX2RvbmUoY3RybCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2l6ZSA+IHJldCkKKwkJc2l6ZSA9IHJldDsKKwlkYmdwX2dldF9kYXRhKGRhdGEsIHNpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGJncF9jb250cm9sX21zZyh1bnNpZ25lZCBkZXZudW0sIGludCByZXF1ZXN0dHlwZSwgaW50IHJlcXVlc3QsCisJaW50IHZhbHVlLCBpbnQgaW5kZXgsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXUzMiBwaWRzLCBhZGRyLCBjdHJsOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgcmVxOworCWludCByZWFkOworCWludCByZXQ7CisKKwlyZWFkID0gKHJlcXVlc3R0eXBlICYgVVNCX0RJUl9JTikgIT0gMDsKKwlpZiAoc2l6ZSA+IChyZWFkID8gREJHUF9NQVhfUEFDS0VUOjApKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDb21wdXRlIHRoZSBjb250cm9sIG1lc3NhZ2UgKi8KKwlyZXEuYlJlcXVlc3RUeXBlID0gcmVxdWVzdHR5cGU7CisJcmVxLmJSZXF1ZXN0ID0gcmVxdWVzdDsKKwlyZXEud1ZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCXJlcS53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJcmVxLndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXBpZHMgPSBEQkdQX1BJRF9TRVQoVVNCX1BJRF9EQVRBMCwgVVNCX1BJRF9TRVRVUCk7CisJYWRkciA9IERCR1BfRVBBRERSKGRldm51bSwgMCk7CisKKwljdHJsID0gcmVhZGwoJmVoY2lfZGVidWctPmNvbnRyb2wpOworCWN0cmwgPSBkYmdwX2xlbl91cGRhdGUoY3RybCwgc2l6ZW9mKHJlcSkpOworCWN0cmwgfD0gREJHUF9PVVQ7CisJY3RybCB8PSBEQkdQX0dPOworCisJLyogU2VuZCB0aGUgc2V0dXAgbWVzc2FnZSAqLworCWRiZ3Bfc2V0X2RhdGEoJnJlcSwgc2l6ZW9mKHJlcSkpOworCXdyaXRlbChhZGRyLCAmZWhjaV9kZWJ1Zy0+YWRkcmVzcyk7CisJd3JpdGVsKHBpZHMsICZlaGNpX2RlYnVnLT5waWRzKTsKKwlyZXQgPSBkYmdwX3dhaXRfdW50aWxfZG9uZShjdHJsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlYWQgdGhlIHJlc3VsdCAqLworCXJldHVybiBkYmdwX2J1bGtfcmVhZChkZXZudW0sIDAsIGRhdGEsIHNpemUpOworfQorCisKKy8qIEZpbmQgYSBQQ0kgY2FwYWJpbGl0eSAqLworc3RhdGljIHUzMiBfX2luaXQgZmluZF9jYXAodTMyIG51bSwgdTMyIHNsb3QsIHUzMiBmdW5jLCBpbnQgY2FwKQoreworCXU4IHBvczsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoIShyZWFkX3BjaV9jb25maWdfMTYobnVtLCBzbG90LCBmdW5jLCBQQ0lfU1RBVFVTKSAmCisJCVBDSV9TVEFUVVNfQ0FQX0xJU1QpKQorCQlyZXR1cm4gMDsKKworCXBvcyA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSwgc2xvdCwgZnVuYywgUENJX0NBUEFCSUxJVFlfTElTVCk7CisJZm9yIChieXRlcyA9IDA7IGJ5dGVzIDwgNDggJiYgcG9zID49IDB4NDA7IGJ5dGVzKyspIHsKKwkJdTggaWQ7CisKKwkJcG9zICY9IH4zOworCQlpZCA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSwgc2xvdCwgZnVuYywgcG9zK1BDSV9DQVBfTElTVF9JRCk7CisJCWlmIChpZCA9PSAweGZmKQorCQkJYnJlYWs7CisJCWlmIChpZCA9PSBjYXApCisJCQlyZXR1cm4gcG9zOworCisJCXBvcyA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSwgc2xvdCwgZnVuYywKKwkJCQkJCSBwb3MrUENJX0NBUF9MSVNUX05FWFQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBfX2luaXQgX19maW5kX2RiZ3AodTMyIGJ1cywgdTMyIHNsb3QsIHUzMiBmdW5jKQoreworCXUzMiBjbGFzczsKKworCWNsYXNzID0gcmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgZnVuYywgUENJX0NMQVNTX1JFVklTSU9OKTsKKwlpZiAoKGNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TRVJJQUxfVVNCX0VIQ0kpCisJCXJldHVybiAwOworCisJcmV0dXJuIGZpbmRfY2FwKGJ1cywgc2xvdCwgZnVuYywgUENJX0NBUF9JRF9FSENJX0RFQlVHKTsKK30KKworc3RhdGljIHUzMiBfX2luaXQgZmluZF9kYmdwKGludCBlaGNpX251bSwgdTMyICpyYnVzLCB1MzIgKnJzbG90LCB1MzIgKnJmdW5jKQoreworCXUzMiBidXMsIHNsb3QsIGZ1bmM7CisKKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IDI1NjsgYnVzKyspIHsKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDMyOyBzbG90KyspIHsKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsKKwkJCQl1bnNpZ25lZCBjYXA7CisKKwkJCQljYXAgPSBfX2ZpbmRfZGJncChidXMsIHNsb3QsIGZ1bmMpOworCisJCQkJaWYgKCFjYXApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChlaGNpX251bS0tICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJCSpyYnVzID0gYnVzOworCQkJCSpyc2xvdCA9IHNsb3Q7CisJCQkJKnJmdW5jID0gZnVuYzsKKwkJCQlyZXR1cm4gY2FwOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVoY2lfcmVzZXRfcG9ydChpbnQgcG9ydCkKK3sKKwl1MzIgcG9ydHNjOworCXUzMiBkZWxheV90aW1lLCBkZWxheTsKKwlpbnQgbG9vcDsKKworCS8qIFJlc2V0IHRoZSB1c2IgZGVidWcgcG9ydCAqLworCXBvcnRzYyA9IHJlYWRsKCZlaGNpX3JlZ3MtPnBvcnRfc3RhdHVzW3BvcnQgLSAxXSk7CisJcG9ydHNjICY9IH5QT1JUX1BFOworCXBvcnRzYyB8PSBQT1JUX1JFU0VUOworCXdyaXRlbChwb3J0c2MsICZlaGNpX3JlZ3MtPnBvcnRfc3RhdHVzW3BvcnQgLSAxXSk7CisKKwlkZWxheSA9IEhVQl9ST09UX1JFU0VUX1RJTUU7CisJZm9yIChkZWxheV90aW1lID0gMDsgZGVsYXlfdGltZSA8IEhVQl9SRVNFVF9USU1FT1VUOworCSAgICAgZGVsYXlfdGltZSArPSBkZWxheSkgeworCQlkYmdwX21kZWxheShkZWxheSk7CisKKwkJcG9ydHNjID0gcmVhZGwoJmVoY2lfcmVncy0+cG9ydF9zdGF0dXNbcG9ydCAtIDFdKTsKKwkJaWYgKHBvcnRzYyAmIFBPUlRfUkVTRVQpIHsKKwkJCS8qIGZvcmNlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJCQlsb29wID0gMjsKKwkJCXdyaXRlbChwb3J0c2MgJiB+KFBPUlRfUldDX0JJVFMgfCBQT1JUX1JFU0VUKSwKKwkJCQkmZWhjaV9yZWdzLT5wb3J0X3N0YXR1c1twb3J0IC0gMV0pOworCQkJZG8geworCQkJCXBvcnRzYyA9IHJlYWRsKCZlaGNpX3JlZ3MtPnBvcnRfc3RhdHVzW3BvcnQtMV0pOworCQkJfSB3aGlsZSAoKHBvcnRzYyAmIFBPUlRfUkVTRVQpICYmICgtLWxvb3AgPiAwKSk7CisJCX0KKworCQkvKiBEZXZpY2Ugd2VudCBhd2F5PyAqLworCQlpZiAoIShwb3J0c2MgJiBQT1JUX0NPTk5FQ1QpKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKworCQkvKiBib21iIG91dCBjb21wbGV0ZWx5IGlmIHNvbWV0aGluZyB3ZWlyZCBoYXBwZW5kICovCisJCWlmICgocG9ydHNjICYgUE9SVF9DU0MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogSWYgd2UndmUgZmluaXNoZWQgcmVzZXR0aW5nLCB0aGVuIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworCQlpZiAoIShwb3J0c2MgJiBQT1JUX1JFU0VUKSAmJiAocG9ydHNjICYgUE9SVF9QRSkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBlaGNpX3dhaXRfZm9yX3BvcnQoaW50IHBvcnQpCit7CisJdTMyIHN0YXR1czsKKwlpbnQgcmV0LCByZXBzOworCisJZm9yIChyZXBzID0gMDsgcmVwcyA8IDM7IHJlcHMrKykgeworCQlkYmdwX21kZWxheSgxMDApOworCQlzdGF0dXMgPSByZWFkbCgmZWhjaV9yZWdzLT5zdGF0dXMpOworCQlpZiAoc3RhdHVzICYgU1RTX1BDRCkgeworCQkJcmV0ID0gZWhjaV9yZXNldF9wb3J0KHBvcnQpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PVENPTk47Cit9CisKKyNpZmRlZiBEQkdQX0RFQlVHCisjIGRlZmluZSBkYmdwX3ByaW50ayBlYXJseV9wcmludGsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGJncF9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIHsgfQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKnNldF9kZWJ1Z19wb3J0X3QpKGludCBwb3J0KTsKKworc3RhdGljIHZvaWQgZGVmYXVsdF9zZXRfZGVidWdfcG9ydChpbnQgcG9ydCkKK3sKK30KKworc3RhdGljIHNldF9kZWJ1Z19wb3J0X3Qgc2V0X2RlYnVnX3BvcnQgPSBkZWZhdWx0X3NldF9kZWJ1Z19wb3J0OworCitzdGF0aWMgdm9pZCBudmlkaWFfc2V0X2RlYnVnX3BvcnQoaW50IHBvcnQpCit7CisJdTMyIGR3b3JkOworCWR3b3JkID0gcmVhZF9wY2lfY29uZmlnKGVoY2lfZGV2LmJ1cywgZWhjaV9kZXYuc2xvdCwgZWhjaV9kZXYuZnVuYywKKwkJCQkgMHg3NCk7CisJZHdvcmQgJj0gfigweDBmPDwxMik7CisJZHdvcmQgfD0gKChwb3J0ICYgMHgwZik8PDEyKTsKKwl3cml0ZV9wY2lfY29uZmlnKGVoY2lfZGV2LmJ1cywgZWhjaV9kZXYuc2xvdCwgZWhjaV9kZXYuZnVuYywgMHg3NCwKKwkJCQkgZHdvcmQpOworCWRiZ3BfcHJpbnRrKCJzZXQgZGVidWcgcG9ydCB0byAlZFxuIiwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkZXRlY3Rfc2V0X2RlYnVnX3BvcnQodm9pZCkKK3sKKwl1MzIgdmVuZG9yaWQ7CisKKwl2ZW5kb3JpZCA9IHJlYWRfcGNpX2NvbmZpZyhlaGNpX2Rldi5idXMsIGVoY2lfZGV2LnNsb3QsIGVoY2lfZGV2LmZ1bmMsCisJCSAweDAwKTsKKworCWlmICgodmVuZG9yaWQgJiAweGZmZmYpID09IDB4MTBkZSkgeworCQlkYmdwX3ByaW50aygidXNpbmcgbnZpZGlhIHNldF9kZWJ1Z19wb3J0XG4iKTsKKwkJc2V0X2RlYnVnX3BvcnQgPSBudmlkaWFfc2V0X2RlYnVnX3BvcnQ7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBlaGNpX3NldHVwKHZvaWQpCit7CisJc3RydWN0IHVzYl9kZWJ1Z19kZXNjcmlwdG9yIGRiZ3BfZGVzYzsKKwl1MzIgY21kLCBjdHJsLCBzdGF0dXMsIHBvcnRzYywgaGNzX3BhcmFtczsKKwl1MzIgZGVidWdfcG9ydCwgbmV3X2RlYnVnX3BvcnQgPSAwLCBuX3BvcnRzOworCXUzMiAgZGV2bnVtOworCWludCByZXQsIGk7CisJaW50IGxvb3A7CisJaW50IHBvcnRfbWFwX3RyaWVkOworCWludCBwbGF5dGltZXMgPSAzOworCit0cnlfbmV4dF90aW1lOgorCXBvcnRfbWFwX3RyaWVkID0gMDsKKwordHJ5X25leHRfcG9ydDoKKworCWhjc19wYXJhbXMgPSByZWFkbCgmZWhjaV9jYXBzLT5oY3NfcGFyYW1zKTsKKwlkZWJ1Z19wb3J0ID0gSENTX0RFQlVHX1BPUlQoaGNzX3BhcmFtcyk7CisJbl9wb3J0cyAgICA9IEhDU19OX1BPUlRTKGhjc19wYXJhbXMpOworCisJZGJncF9wcmludGsoImRlYnVnX3BvcnQ6ICVkXG4iLCBkZWJ1Z19wb3J0KTsKKwlkYmdwX3ByaW50aygibl9wb3J0czogICAgJWRcbiIsIG5fcG9ydHMpOworCisJZm9yIChpID0gMTsgaSA8PSBuX3BvcnRzOyBpKyspIHsKKwkJcG9ydHNjID0gcmVhZGwoJmVoY2lfcmVncy0+cG9ydF9zdGF0dXNbaS0xXSk7CisJCWRiZ3BfcHJpbnRrKCJwb3J0c3RhdHVzJWQ6ICUwOHhcbiIsIGksIHBvcnRzYyk7CisJfQorCisJaWYgKHBvcnRfbWFwX3RyaWVkICYmIChuZXdfZGVidWdfcG9ydCAhPSBkZWJ1Z19wb3J0KSkgeworCQlpZiAoLS1wbGF5dGltZXMpIHsKKwkJCXNldF9kZWJ1Z19wb3J0KG5ld19kZWJ1Z19wb3J0KTsKKwkJCWdvdG8gdHJ5X25leHRfdGltZTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJbG9vcCA9IDEwOworCS8qIFJlc2V0IHRoZSBFSENJIGNvbnRyb2xsZXIgKi8KKwljbWQgPSByZWFkbCgmZWhjaV9yZWdzLT5jb21tYW5kKTsKKwljbWQgfD0gQ01EX1JFU0VUOworCXdyaXRlbChjbWQsICZlaGNpX3JlZ3MtPmNvbW1hbmQpOworCWRvIHsKKwkJY21kID0gcmVhZGwoJmVoY2lfcmVncy0+Y29tbWFuZCk7CisJfSB3aGlsZSAoKGNtZCAmIENNRF9SRVNFVCkgJiYgKC0tbG9vcCA+IDApKTsKKworCWlmICghbG9vcCkgeworCQlkYmdwX3ByaW50aygiY2FuIG5vdCByZXNldCBlaGNpXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkYmdwX3ByaW50aygiZWhjaSByZXNldCBkb25lXG4iKTsKKworCS8qIENsYWltIG93bmVyc2hpcCwgYnV0IGRvIG5vdCBlbmFibGUgeWV0ICovCisJY3RybCA9IHJlYWRsKCZlaGNpX2RlYnVnLT5jb250cm9sKTsKKwljdHJsIHw9IERCR1BfT1dORVI7CisJY3RybCAmPSB+KERCR1BfRU5BQkxFRCB8IERCR1BfSU5VU0UpOworCXdyaXRlbChjdHJsLCAmZWhjaV9kZWJ1Zy0+Y29udHJvbCk7CisKKwkvKiBTdGFydCB0aGUgZWhjaSBydW5uaW5nICovCisJY21kID0gcmVhZGwoJmVoY2lfcmVncy0+Y29tbWFuZCk7CisJY21kICY9IH4oQ01EX0xSRVNFVCB8IENNRF9JQUFEIHwgQ01EX1BTRSB8IENNRF9BU0UgfCBDTURfUkVTRVQpOworCWNtZCB8PSBDTURfUlVOOworCXdyaXRlbChjbWQsICZlaGNpX3JlZ3MtPmNvbW1hbmQpOworCisJLyogRW5zdXJlIGV2ZXJ5dGhpbmcgaXMgcm91dGVkIHRvIHRoZSBFSENJICovCisJd3JpdGVsKEZMQUdfQ0YsICZlaGNpX3JlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBjb250cm9sbGVyIGlzIG5vIGxvbmdlciBoYWx0ZWQgKi8KKwlsb29wID0gMTA7CisJZG8geworCQlzdGF0dXMgPSByZWFkbCgmZWhjaV9yZWdzLT5zdGF0dXMpOworCX0gd2hpbGUgKChzdGF0dXMgJiBTVFNfSEFMVCkgJiYgKC0tbG9vcCA+IDApKTsKKworCWlmICghbG9vcCkgeworCQlkYmdwX3ByaW50aygiZWhjaSBjYW4gYmUgc3RhcnRlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJZGJncF9wcmludGsoImVoY2kgc3RhcnRlZFxuIik7CisKKwkvKiBXYWl0IGZvciBhIGRldmljZSB0byBzaG93IHVwIGluIHRoZSBkZWJ1ZyBwb3J0ICovCisJcmV0ID0gZWhjaV93YWl0X2Zvcl9wb3J0KGRlYnVnX3BvcnQpOworCWlmIChyZXQgPCAwKSB7CisJCWRiZ3BfcHJpbnRrKCJObyBkZXZpY2UgZm91bmQgaW4gZGVidWcgcG9ydFxuIik7CisJCWdvdG8gbmV4dF9kZWJ1Z19wb3J0OworCX0KKwlkYmdwX3ByaW50aygiZWhjaSB3YWl0IGZvciBwb3J0IGRvbmVcbiIpOworCisJLyogRW5hYmxlIHRoZSBkZWJ1ZyBwb3J0ICovCisJY3RybCA9IHJlYWRsKCZlaGNpX2RlYnVnLT5jb250cm9sKTsKKwljdHJsIHw9IERCR1BfQ0xBSU07CisJd3JpdGVsKGN0cmwsICZlaGNpX2RlYnVnLT5jb250cm9sKTsKKwljdHJsID0gcmVhZGwoJmVoY2lfZGVidWctPmNvbnRyb2wpOworCWlmICgoY3RybCAmIERCR1BfQ0xBSU0pICE9IERCR1BfQ0xBSU0pIHsKKwkJZGJncF9wcmludGsoIk5vIGRldmljZSBpbiBkZWJ1ZyBwb3J0XG4iKTsKKwkJd3JpdGVsKGN0cmwgJiB+REJHUF9DTEFJTSwgJmVoY2lfZGVidWctPmNvbnRyb2wpOworCQlnb3RvIGVycjsKKwl9CisJZGJncF9wcmludGsoImRlYnVnIHBvcnRlZCBlbmFibGVkXG4iKTsKKworCS8qIENvbXBsZXRlbHkgdHJhbnNmZXIgdGhlIGRlYnVnIGRldmljZSB0byB0aGUgZGVidWcgY29udHJvbGxlciAqLworCXBvcnRzYyA9IHJlYWRsKCZlaGNpX3JlZ3MtPnBvcnRfc3RhdHVzW2RlYnVnX3BvcnQgLSAxXSk7CisJcG9ydHNjICY9IH5QT1JUX1BFOworCXdyaXRlbChwb3J0c2MsICZlaGNpX3JlZ3MtPnBvcnRfc3RhdHVzW2RlYnVnX3BvcnQgLSAxXSk7CisKKwlkYmdwX21kZWxheSgxMDApOworCisJLyogRmluZCB0aGUgZGVidWcgZGV2aWNlIGFuZCBtYWtlIGl0IGRldmljZSBudW1iZXIgMTI3ICovCisJZm9yIChkZXZudW0gPSAwOyBkZXZudW0gPD0gMTI3OyBkZXZudW0rKykgeworCQlyZXQgPSBkYmdwX2NvbnRyb2xfbXNnKGRldm51bSwKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9TVEFOREFSRCB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQlVU0JfUkVRX0dFVF9ERVNDUklQVE9SLCAoVVNCX0RUX0RFQlVHIDw8IDgpLCAwLAorCQkJJmRiZ3BfZGVzYywgc2l6ZW9mKGRiZ3BfZGVzYykpOworCQlpZiAocmV0ID4gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGV2bnVtID4gMTI3KSB7CisJCWRiZ3BfcHJpbnRrKCJDb3VsZCBub3QgZmluZCBhdHRhY2hlZCBkZWJ1ZyBkZXZpY2VcbiIpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZGJncF9wcmludGsoIkF0dGFjaGVkIGRldmljZSBpcyBub3QgYSBkZWJ1ZyBkZXZpY2VcbiIpOworCQlnb3RvIGVycjsKKwl9CisJZGJncF9lbmRwb2ludF9vdXQgPSBkYmdwX2Rlc2MuYkRlYnVnT3V0RW5kcG9pbnQ7CisKKwkvKiBNb3ZlIHRoZSBkZXZpY2UgdG8gMTI3IGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUgKi8KKwlpZiAoZGV2bnVtICE9IFVTQl9ERUJVR19ERVZOVU0pIHsKKwkJcmV0ID0gZGJncF9jb250cm9sX21zZyhkZXZudW0sCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCVVTQl9SRVFfU0VUX0FERFJFU1MsIFVTQl9ERUJVR19ERVZOVU0sIDAsIE5VTEwsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJZGJncF9wcmludGsoIkNvdWxkIG5vdCBtb3ZlIGF0dGFjaGVkIGRldmljZSB0byAlZFxuIiwKKwkJCQlVU0JfREVCVUdfREVWTlVNKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRldm51bSA9IFVTQl9ERUJVR19ERVZOVU07CisJCWRiZ3BfcHJpbnRrKCJkZWJ1ZyBkZXZpY2UgcmVuYW1lZCB0byAxMjdcbiIpOworCX0KKworCS8qIEVuYWJsZSB0aGUgZGVidWcgaW50ZXJmYWNlICovCisJcmV0ID0gZGJncF9jb250cm9sX21zZyhVU0JfREVCVUdfREVWTlVNLAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX0RFVklDRV9ERUJVR19NT0RFLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkYmdwX3ByaW50aygiIENvdWxkIG5vdCBlbmFibGUgdGhlIGRlYnVnIGRldmljZVxuIik7CisJCWdvdG8gZXJyOworCX0KKwlkYmdwX3ByaW50aygiZGVidWcgaW50ZXJmYWNlIGVuYWJsZWRcbiIpOworCisJLyogUGVyZm9ybSBhIHNtYWxsIHdyaXRlIHRvIGdldCB0aGUgZXZlbi9vZGQgZGF0YSBzdGF0ZSBpbiBzeW5jCisJICovCisJcmV0ID0gZGJncF9idWxrX3dyaXRlKFVTQl9ERUJVR19ERVZOVU0sIGRiZ3BfZW5kcG9pbnRfb3V0LCAiICIsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRiZ3BfcHJpbnRrKCJkYmdwX2J1bGtfd3JpdGUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCWRiZ3BfcHJpbnRrKCJzbWFsbCB3cml0ZSBkb25lZFxuIik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwkvKiBUaGluZ3MgZGlkbid0IHdvcmsgc28gcmVtb3ZlIG15IGNsYWltICovCisJY3RybCA9IHJlYWRsKCZlaGNpX2RlYnVnLT5jb250cm9sKTsKKwljdHJsICY9IH4oREJHUF9DTEFJTSB8IERCR1BfT1VUKTsKKwl3cml0ZWwoY3RybCwgJmVoY2lfZGVidWctPmNvbnRyb2wpOworCXJldHVybiAtMTsKKworbmV4dF9kZWJ1Z19wb3J0OgorCXBvcnRfbWFwX3RyaWVkIHw9ICgxPDwoZGVidWdfcG9ydCAtIDEpKTsKKwluZXdfZGVidWdfcG9ydCA9ICgoZGVidWdfcG9ydC0xKzEpJW5fcG9ydHMpICsgMTsKKwlpZiAocG9ydF9tYXBfdHJpZWQgIT0gKCgxPDxuX3BvcnRzKSAtIDEpKSB7CisJCXNldF9kZWJ1Z19wb3J0KG5ld19kZWJ1Z19wb3J0KTsKKwkJZ290byB0cnlfbmV4dF9wb3J0OworCX0KKwlpZiAoLS1wbGF5dGltZXMpIHsKKwkJc2V0X2RlYnVnX3BvcnQobmV3X2RlYnVnX3BvcnQpOworCQlnb3RvIHRyeV9uZXh0X3RpbWU7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9kYmdwX2luaXQoY2hhciAqcykKK3sKKwl1MzIgZGVidWdfcG9ydCwgYmFyLCBvZmZzZXQ7CisJdTMyIGJ1cywgc2xvdCwgZnVuYywgY2FwOworCXZvaWQgX19pb21lbSAqZWhjaV9iYXI7CisJdTMyIGRiZ3BfbnVtOworCXUzMiBiYXJfdmFsOworCWNoYXIgKmU7CisJaW50IHJldDsKKwl1OCBieXRlOworCisJaWYgKCFlYXJseV9wY2lfYWxsb3dlZCgpKQorCQlyZXR1cm4gLTE7CisKKwlkYmdwX251bSA9IDA7CisJaWYgKCpzKQorCQlkYmdwX251bSA9IHNpbXBsZV9zdHJ0b3VsKHMsICZlLCAxMCk7CisJZGJncF9wcmludGsoImRiZ3BfbnVtOiAlZFxuIiwgZGJncF9udW0pOworCisJY2FwID0gZmluZF9kYmdwKGRiZ3BfbnVtLCAmYnVzLCAmc2xvdCwgJmZ1bmMpOworCWlmICghY2FwKQorCQlyZXR1cm4gLTE7CisKKwlkYmdwX3ByaW50aygiRm91bmQgRUhDSSBkZWJ1ZyBwb3J0IG9uICUwMng6JTAyeC4lMXhcbiIsIGJ1cywgc2xvdCwKKwkJCSBmdW5jKTsKKworCWRlYnVnX3BvcnQgPSByZWFkX3BjaV9jb25maWcoYnVzLCBzbG90LCBmdW5jLCBjYXApOworCWJhciA9IChkZWJ1Z19wb3J0ID4+IDI5KSAmIDB4NzsKKwliYXIgPSAoYmFyICogNCkgKyAweGM7CisJb2Zmc2V0ID0gKGRlYnVnX3BvcnQgPj4gMTYpICYgMHhmZmY7CisJZGJncF9wcmludGsoImJhcjogJTAyeCBvZmZzZXQ6ICUwM3hcbiIsIGJhciwgb2Zmc2V0KTsKKwlpZiAoYmFyICE9IFBDSV9CQVNFX0FERFJFU1NfMCkgeworCQlkYmdwX3ByaW50aygib25seSBkZWJ1ZyBwb3J0cyBvbiBiYXIgMSBoYW5kbGVkLlxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWJhcl92YWwgPSByZWFkX3BjaV9jb25maWcoYnVzLCBzbG90LCBmdW5jLCBQQ0lfQkFTRV9BRERSRVNTXzApOworCWRiZ3BfcHJpbnRrKCJiYXJfdmFsOiAlMDJ4IG9mZnNldDogJTAzeFxuIiwgYmFyX3ZhbCwgb2Zmc2V0KTsKKwlpZiAoYmFyX3ZhbCAmIH5QQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKSB7CisJCWRiZ3BfcHJpbnRrKCJvbmx5IHNpbXBsZSAzMmJpdCBtbWlvIGJhcnMgc3VwcG9ydGVkXG4iKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZG91YmxlIGNoZWNrIGlmIHRoZSBtZW0gc3BhY2UgaXMgZW5hYmxlZCAqLworCWJ5dGUgPSByZWFkX3BjaV9jb25maWdfYnl0ZShidXMsIHNsb3QsIGZ1bmMsIDB4MDQpOworCWlmICghKGJ5dGUgJiAweDIpKSB7CisJCWJ5dGUgIHw9IDB4MDI7CisJCXdyaXRlX3BjaV9jb25maWdfYnl0ZShidXMsIHNsb3QsIGZ1bmMsIDB4MDQsIGJ5dGUpOworCQlkYmdwX3ByaW50aygibW1pbyBmb3IgZWhjaSBlbmFibGVkXG4iKTsKKwl9CisKKwkvKgorCSAqIEZJWE1FIEkgZG9uJ3QgaGF2ZSB0aGUgYmFyIHNpemUgc28ganVzdCBndWVzcyBQQUdFX1NJWkUgaXMgbW9yZQorCSAqIHRoYW4gZW5vdWdoLiAgMUsgaXMgdGhlIGJpZ2dlc3QgSSBoYXZlIHNlZW4uCisJICovCisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9EQkdQX0JBU0UsIGJhcl92YWwgJiBQQUdFX01BU0spOworCWVoY2lfYmFyID0gKHZvaWQgX19pb21lbSAqKV9fZml4X3RvX3ZpcnQoRklYX0RCR1BfQkFTRSk7CisJZWhjaV9iYXIgKz0gYmFyX3ZhbCAmIH5QQUdFX01BU0s7CisJZGJncF9wcmludGsoImVoY2lfYmFyOiAlcFxuIiwgZWhjaV9iYXIpOworCisJZWhjaV9jYXBzICA9IGVoY2lfYmFyOworCWVoY2lfcmVncyAgPSBlaGNpX2JhciArIEhDX0xFTkdUSChyZWFkbCgmZWhjaV9jYXBzLT5oY19jYXBiYXNlKSk7CisJZWhjaV9kZWJ1ZyA9IGVoY2lfYmFyICsgb2Zmc2V0OworCWVoY2lfZGV2LmJ1cyA9IGJ1czsKKwllaGNpX2Rldi5zbG90ID0gc2xvdDsKKwllaGNpX2Rldi5mdW5jID0gZnVuYzsKKworCWRldGVjdF9zZXRfZGVidWdfcG9ydCgpOworCisJcmV0ID0gZWhjaV9zZXR1cCgpOworCWlmIChyZXQgPCAwKSB7CisJCWRiZ3BfcHJpbnRrKCJlaGNpX3NldHVwIGZhaWxlZFxuIik7CisJCWVoY2lfZGVidWcgPSBOVUxMOworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWFybHlfZGJncF93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpzdHIsIHUzMiBuKQoreworCWludCBjaHVuaywgcmV0OworCisJaWYgKCFlaGNpX2RlYnVnKQorCQlyZXR1cm47CisJd2hpbGUgKG4gPiAwKSB7CisJCWNodW5rID0gbjsKKwkJaWYgKGNodW5rID4gREJHUF9NQVhfUEFDS0VUKQorCQkJY2h1bmsgPSBEQkdQX01BWF9QQUNLRVQ7CisJCXJldCA9IGRiZ3BfYnVsa193cml0ZShVU0JfREVCVUdfREVWTlVNLAorCQkJZGJncF9lbmRwb2ludF9vdXQsIHN0ciwgY2h1bmspOworCQlzdHIgKz0gY2h1bms7CisJCW4gLT0gY2h1bms7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNvbnNvbGUgZWFybHlfZGJncF9jb25zb2xlID0geworCS5uYW1lID0JCSJlYXJseWRiZyIsCisJLndyaXRlID0JZWFybHlfZGJncF93cml0ZSwKKwkuZmxhZ3MgPQlDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4ID0JLTEsCit9OworI2VuZGlmCisKIC8qIENvbnNvbGUgaW50ZXJmYWNlIHRvIGEgaG9zdCBmaWxlIG9uIEFNRCdzIFNpbU5vdyEgKi8KIAogc3RhdGljIGludCBzaW1ub3dfZmQ7CkBAIC0xNjUsNiArODg5LDcgQEAKIHN0YXRpYyBub2lubGluZSBsb25nIHNpbW5vdyhsb25nIGNtZCwgbG9uZyBhLCBsb25nIGIsIGxvbmcgYykKIHsKIAlsb25nIHJldDsKKwogCWFzbSB2b2xhdGlsZSgiY3B1aWQiIDoKIAkJICAgICAiPWEiIChyZXQpIDoKIAkJICAgICAiYiIgKGEpLCAiYyIgKGIpLCAiZCIgKGMpLCAiMCIgKE1BR0lDMSksICJEIiAoY21kICsgTUFHSUMyKSk7CkBAIC0xNzQsNiArODk5LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBzaW1ub3dfaW5pdChjaGFyICpzdHIpCiB7CiAJY2hhciAqZm4gPSAia2xvZyI7CisKIAlpZiAoKnN0ciA9PSAnPScpCiAJCWZuID0gKytzdHI7CiAJLyogZXJyb3IgaWdub3JlZCAqLwpAQCAtMTk0LDcgKzkyMCw3IEBACiAKIC8qIERpcmVjdCBpbnRlcmZhY2UgZm9yIGVtZXJnZW5jaWVzICovCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgKmVhcmx5X2NvbnNvbGUgPSAmZWFybHlfdmdhX2NvbnNvbGU7Ci1zdGF0aWMgaW50IGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZWFybHlfY29uc29sZV9pbml0aWFsaXplZDsKIAogYXNtbGlua2FnZSB2b2lkIGVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKQEAgLTIwOCwxMCArOTM0LDExIEBACiAJdmFfZW5kKGFwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXRkYXRhIGtlZXBfZWFybHk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICpidWYpCiB7CisJaW50IGtlZXBfZWFybHk7CisKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIDA7CiAKQEAgLTIxOSw4ICs5NDYsNyBAQAogCQlyZXR1cm4gMDsKIAllYXJseV9jb25zb2xlX2luaXRpYWxpemVkID0gMTsKIAotCWlmIChzdHJzdHIoYnVmLCAia2VlcCIpKQotCQlrZWVwX2Vhcmx5ID0gMTsKKwlrZWVwX2Vhcmx5ID0gKHN0cnN0cihidWYsICJrZWVwIikgIT0gTlVMTCk7CiAKIAlpZiAoIXN0cm5jbXAoYnVmLCAic2VyaWFsIiwgNikpIHsKIAkJZWFybHlfc2VyaWFsX2luaXQoYnVmICsgNik7CkBAIC0yMzgsNiArOTY0LDE3IEBACiAJCXNpbW5vd19pbml0KGJ1ZiArIDYpOwogCQllYXJseV9jb25zb2xlID0gJnNpbW5vd19jb25zb2xlOwogCQlrZWVwX2Vhcmx5ID0gMTsKKyNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLX0RCR1AKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwgImRiZ3AiLCA0KSkgeworCQlpZiAoZWFybHlfZGJncF9pbml0KGJ1Zis0KSA8IDApCisJCQlyZXR1cm4gMDsKKwkJZWFybHlfY29uc29sZSA9ICZlYXJseV9kYmdwX2NvbnNvbGU7CisJCS8qCisJCSAqIHVzYiBzdWJzeXMgd2lsbCByZXNldCBlaGNpIGNvbnRyb2xsZXIsIHNvIGRvbid0IGtlZXAKKwkJICogdGhhdCBlYXJseSBjb25zb2xlCisJCSAqLworCQlrZWVwX2Vhcmx5ID0gMDsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19IVkNfWEVOCiAJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJ4ZW4iLCAzKSkgewogCQllYXJseV9jb25zb2xlID0gJnhlbmJvb3RfY29uc29sZTsKQEAgLTI1MSw0ICs5ODgsNSBAQAogCXJlZ2lzdGVyX2NvbnNvbGUoZWFybHlfY29uc29sZSk7CiAJcmV0dXJuIDA7CiB9CisKIGVhcmx5X3BhcmFtKCJlYXJseXByaW50ayIsIHNldHVwX2Vhcmx5X3ByaW50ayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWZpLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWZpLmMKaW5kZXggMDZjYzhkNC4uOTQ1YTMxYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VmaS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lZmkuYwpAQCAtNDE0LDkgKzQxNCwxMSBAQAogCWlmIChtZW1tYXAubWFwID09IE5VTEwpCiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAhXG4iKTsKIAltZW1tYXAubWFwX2VuZCA9IG1lbW1hcC5tYXAgKyAobWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpOworCiAJaWYgKG1lbW1hcC5kZXNjX3NpemUgIT0gc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiS2VybmVsLWRlZmluZWQgbWVtZGVzYyIKLQkJICAgICAgICJkb2Vzbid0IG1hdGNoIHRoZSBvbmUgZnJvbSBFRkkhXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICJLZXJuZWwtZGVmaW5lZCBtZW1kZXNjIGRvZXNuJ3QgbWF0Y2ggdGhlIG9uZSBmcm9tIEVGSSFcbiIpOworCiAJaWYgKGFkZF9lZmlfbWVtbWFwKQogCQlkb19hZGRfZWZpX21lbW1hcCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDEwOTc5MmIuLmIyMWZiZmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC03MzAsNiArNzMwLDcgQEAKIAltb3ZsICQoX19VU0VSX0RTKSwgJWVjeAogCW1vdmwgJWVjeCwgJWRzCiAJbW92bCAlZWN4LCAlZXMKKwlUUkFDRV9JUlFTX09GRgogCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKIAljYWxsIColZWRpCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgpAQCAtNzYwLDIwICs3NjEsOSBAQAogCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0Ci0JU0FWRV9BTEwKLQlHRVRfQ1IwX0lOVE9fRUFYCi0JdGVzdGwgJDB4NCwgJWVheAkJIyBFTSAobWF0aCBlbXVsYXRpb24gYml0KQotCWpuZSBkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlCi0JcHJlZW1wdF9zdG9wKENMQlJfQU5ZKQotCWNhbGwgbWF0aF9zdGF0ZV9yZXN0b3JlCi0Jam1wIHJldF9mcm9tX2V4Y2VwdGlvbgotZGV2aWNlX25vdF9hdmFpbGFibGVfZW11bGF0ZToKLQlwdXNobCAkMAkJCSMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIE9SSUdfRUlQCisJcHVzaGwgJGRvX2RldmljZV9ub3RfYXZhaWxhYmxlCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKLQljYWxsIG1hdGhfZW11bGF0ZQotCWFkZGwgJDQsICVlc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKLQlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisJam1wIGVycm9yX2NvZGUKIAlDRklfRU5EUFJPQwogRU5EKGRldmljZV9ub3RfYXZhaWxhYmxlKQogCkBAIC04MTQsNiArODA0LDcgQEAKIAlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCisJVFJBQ0VfSVJRU19PRkYKIAl4b3JsICVlZHgsJWVkeAkJCSMgZXJyb3IgY29kZSAwCiAJbW92bCAlZXNwLCVlYXgJCQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgZG9fZGVidWcKQEAgLTg1OCw2ICs4NDksNyBAQAogCXB1c2hsICVlYXgKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCisJVFJBQ0VfSVJRU19PRkYKIAl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKIAltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKIAljYWxsIGRvX25taQpAQCAtODk4LDYgKzg5MCw3IEBACiAJcHVzaGwgJWVheAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJU0FWRV9BTEwKKwlUUkFDRV9JUlFTX09GRgogCUZJWFVQX0VTUEZJWF9TVEFDSwkJIyAlZWF4ID09ICVlc3AKIAl4b3JsICVlZHgsJWVkeAkJCSMgemVybyBlcnJvciBjb2RlCiAJY2FsbCBkb19ubWkKQEAgLTkyOCw2ICs5MjEsNyBAQAogCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJU0FWRV9BTEwKKwlUUkFDRV9JUlFTX09GRgogCXhvcmwgJWVkeCwlZWR4CQkjIHplcm8gZXJyb3IgY29kZQogCW1vdmwgJWVzcCwlZWF4CQkjIHB0X3JlZ3MgcG9pbnRlcgogCWNhbGwgZG9faW50MwpAQCAtMTAzMCw3ICsxMDI0LDcgQEAKIAlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAkMAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0Ci0JcHVzaGwgbWFjaGluZV9jaGVja192ZWN0b3IKKwlwdXNobCAkZG9fbWFjaGluZV9jaGVjawogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJam1wIGVycm9yX2NvZGUKIAlDRklfRU5EUFJPQwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwppbmRleCA4OTQzNGQ0Li4xZGI2Y2U0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMjc1LDkgKzI3NSw5IEBACiBFTlRSWShyZXRfZnJvbV9mb3JrKQogCUNGSV9ERUZBVUxUX1NUQUNLCiAJcHVzaCBrZXJuZWxfZWZsYWdzKCVyaXApCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAogCXBvcGYJCQkJIyByZXNldCBrZXJuZWwgZWZsYWdzCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC04CiAJY2FsbCBzY2hlZHVsZV90YWlsCiAJR0VUX1RIUkVBRF9JTkZPKCVyY3gpCiAJdGVzdGwgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncyglcmN4KQpAQCAtNjY3LDYgKzY2NywxMyBAQAogCVNBVkVfQVJHUwogCWxlYXEgLUFSR09GRlNFVCglcnNwKSwlcmRpCSMgYXJnMSBmb3IgaGFuZGxlcgogCXB1c2hxICVyYnAKKwkvKgorCSAqIFNhdmUgcmJwIHR3aWNlOiBPbmUgaXMgZm9yIG1hcmtpbmcgdGhlIHN0YWNrIGZyYW1lLCBhcyB1c3VhbCwgYW5kIHRoZQorCSAqIG90aGVyLCB0byBmaWxsIHB0X3JlZ3MgcHJvcGVybHkuIFRoaXMgaXMgYmVjYXVzZSBieCBjb21lcyByaWdodAorCSAqIGJlZm9yZSB0aGUgbGFzdCBzYXZlZCByZWdpc3RlciBpbiB0aGF0IHN0cnVjdHVyZSwgYW5kIG5vdCBicC4gSWYgdGhlCisJICogYmFzZSBwb2ludGVyIHdlcmUgaW4gdGhlIHBsYWNlIGJ4IGlzIHRvZGF5LCB0aGlzIHdvdWxkIG5vdCBiZSBuZWVkZWQuCisJICovCisJbW92cSAlcmJwLCAtOCglcnNwKQogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAk4CiAJQ0ZJX1JFTF9PRkZTRVQJCXJicCwgMAogCW1vdnEgJXJzcCwlcmJwCkBAIC05MzIsNiArOTM5LDkgQEAKIAkuaWYgXGlzdAogCW1vdnEJJWdzOnBkYV9kYXRhX29mZnNldCwgJXJicAogCS5lbmRpZgorCS5pZiBcaXJxdHJhY2UKKwlUUkFDRV9JUlFTX09GRgorCS5lbmRpZgogCW1vdnEgJXJzcCwlcmRpCiAJbW92cSBPUklHX1JBWCglcnNwKSwlcnNpCiAJbW92cSAkLTEsT1JJR19SQVgoJXJzcCkKQEAgLTEwNTgsNyArMTA2OCw4IEBACiAJamUgIGVycm9yX2tlcm5lbHNwYWNlCiBlcnJvcl9zd2FwZ3M6CQogCVNXQVBHUwotZXJyb3Jfc3RpOgkKK2Vycm9yX3N0aToKKwlUUkFDRV9JUlFTX09GRgogCW1vdnEgJXJkaSxSREkoJXJzcCkgCQogCUNGSV9SRUxfT0ZGU0VUCXJkaSxSREkKIAltb3ZxICVyc3AsJXJkaQpAQCAtMTIzMiw3ICsxMjQzLDcgQEAKIEVORChzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKQogCiBFTlRSWShkZXZpY2Vfbm90X2F2YWlsYWJsZSkKLQl6ZXJvZW50cnkgbWF0aF9zdGF0ZV9yZXN0b3JlCisJemVyb2VudHJ5IGRvX2RldmljZV9ub3RfYXZhaWxhYmxlCiBFTkQoZGV2aWNlX25vdF9hdmFpbGFibGUpCiAKIAkvKiBydW5zIG9uIGV4Y2VwdGlvbiBzdGFjayAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VzNzAwMF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2VzNzAwMF8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTRjNzhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2VzNzAwMF8zMi5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogV3JpdHRlbiBieTogR2FycnkgRm9yc2dyZW4sIFVuaXN5cyBDb3Jwb3JhdGlvbgorICogICAgICAgICAgICAgTmF0YWxpZSBQcm90YXNldmljaCwgVW5pc3lzIENvcnBvcmF0aW9uCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gY29uZmlndXJlIGFuZCBpbnRlcmZhY2UKKyAqIHdpdGggVW5pc3lzIEVTNzAwMCBzZXJpZXMgaGFyZHdhcmUgc3lzdGVtIG1hbmFnZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFVuaXN5cyBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFVuaXN5cyBDb3Jwb3JhdGlvbiwgVG93bnNoaXAgTGluZSAmIFVuaW9uIE1lZXRpbmcKKyAqIFJvYWRzLUEsIFVuaXN5cyBXYXksIEJsdWUgQmVsbCwgUGVubnN5bHZhbmlhLCAxOTQyNCwgb3I6CisgKgorICogaHR0cDovL3d3dy51bmlzeXMuY29tCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CisjaW5jbHVkZSA8bWFjaF9tcHBhcnNlLmg+CisKKy8qCisgKiBFUzcwMDAgY2hpcHNldHMKKyAqLworCisjZGVmaW5lIE5PTl9VTklTWVMJCTAKKyNkZWZpbmUgRVM3MDAwX0NMQVNTSUMJCTEKKyNkZWZpbmUgRVM3MDAwX1pPUlJPCQkyCisKKworI2RlZmluZQlNSVBfUkVHCQkJMQorI2RlZmluZQlNSVBfUFNBSV9SRUcJCTQKKworI2RlZmluZQlNSVBfQlVTWQkJMQorI2RlZmluZQlNSVBfU1BJTgkJMHhmMDAwMAorI2RlZmluZQlNSVBfVkFMSUQJCTB4MDEwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZQlNSVBfUE9SVChWQUxVRSkJKChWQUxVRSA+PiAzMikgJiAweGZmZmYpCisKKyNkZWZpbmUJTUlQX1JEX0xPKFZBTFVFKQkoVkFMVUUgJiAweGZmZmZmZmZmKQorCitzdHJ1Y3QgbWlwX3JlZ19pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWlwX2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGRlbGl2ZXJ5X2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGhvc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaXBfcmVnOworfTsKKworc3RydWN0IHBhcnRfaW5mbyB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcGFydF9pZDsKKwl1bnNpZ25lZCBjaGFyIGFwaWNfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHNudW07CisJY2hhciBwdHlwZVsxNl07CisJY2hhciBzbmFtZVs2NF07CisJY2hhciBwbmFtZVs2NF07Cit9OworCitzdHJ1Y3QgcHNhaSB7CisJdW5zaWduZWQgbG9uZyBsb25nIGVudHJ5X3R5cGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsb25nIGJlcF9hZGRyOworfTsKKworc3RydWN0IGVzNzAwMF9tZW1faW5mbyB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcmVzdls2XTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgbG9uZyAgc2l6ZTsKK307CisKK3N0cnVjdCBlczcwMDBfb2VtX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaGRyOworCXN0cnVjdCBtaXBfcmVnX2luZm8gbWlwOworCXN0cnVjdCBwYXJ0X2luZm8gcGlmOworCXN0cnVjdCBlczcwMDBfbWVtX2luZm8gc2htOworCXN0cnVjdCBwc2FpIHBzYWk7Cit9OworCisjaWZkZWYgQ09ORklHX0FDUEkKKworc3RydWN0IG9lbV90YWJsZSB7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIEhlYWRlcjsKKwl1MzIgT0VNVGFibGVBZGRyOworCXUzMiBPRU1UYWJsZVNpemU7Cit9OworCitleHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKTsKK2V4dGVybiB2b2lkIHVubWFwX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nIG9lbV9hZGRyKTsKKyNlbmRpZgorCitzdHJ1Y3QgbWlwX3JlZyB7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8wOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfODsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzEwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMTg7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8yMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzI4OworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMzA7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8zODsKK307CisKKyNkZWZpbmUJTUlQX1NXX0FQSUMJCTB4MTAyMGIKKyNkZWZpbmUJTUlQX0ZVTkMoVkFMVUUpCQkoVkFMVUUgJiAweGZmKQorCisvKgorICogRVM3MDAwIEdsb2JhbHMKKyAqLworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZwkqcHNhaSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IG1pcF9yZWcJCSptaXBfcmVnOworc3RhdGljIHN0cnVjdCBtaXBfcmVnCQkqaG9zdF9yZWc7CitzdGF0aWMgaW50IAkJCW1pcF9wb3J0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJCW1pcF9hZGRyLCBob3N0X2FkZHI7CisKK2ludCBlczcwMDBfcGxhdDsKKworLyoKKyAqIEdTSSBvdmVycmlkZSBmb3IgRVM3MDAwIHBsYXRmb3Jtcy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGJhc2U7CisKK3N0YXRpYyBpbnQKK2VzNzAwMF9yZW5hbWVfZ3NpKGludCBpb2FwaWMsIGludCBnc2kpCit7CisJaWYgKGVzNzAwMF9wbGF0ID09IEVTNzAwMF9aT1JSTykKKwkJcmV0dXJuIGdzaTsKKworCWlmICghYmFzZSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykKKwkJCWJhc2UgKz0gbnJfaW9hcGljX3JlZ2lzdGVyc1tpXTsKKwl9CisKKwlpZiAoIWlvYXBpYyAmJiAoZ3NpIDwgMTYpKQorCQlnc2kgKz0gYmFzZTsKKwlyZXR1cm4gZ3NpOworfQorCit2b2lkIF9faW5pdAorc2V0dXBfdW5pc3lzKHZvaWQpCit7CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KKwkgKgorCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94CisJICogZXM3MDAwX3BsYXQgPSAyIGlmIHRoZSBtYWNoaW5lIGlzIGEgeDg2XzY0IEVTNzAwMCBib3gKKwkgKgorCSAqLworCWlmICghKGJvb3RfY3B1X2RhdGEueDg2IDw9IDE1ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDIpKQorCQllczcwMDBfcGxhdCA9IEVTNzAwMF9aT1JSTzsKKwllbHNlCisJCWVzNzAwMF9wbGF0ID0gRVM3MDAwX0NMQVNTSUM7CisJaW9hcGljX3JlbnVtYmVyX2lycSA9IGVzNzAwMF9yZW5hbWVfZ3NpOworfQorCisvKgorICogUGFyc2UgdGhlIE9FTSBUYWJsZQorICovCisKK2ludCBfX2luaXQKK3BhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0cikKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCWludCAJCQlzdWNjZXNzID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICB0eXBlLCBzaXplOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHZhbDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqdHAgPSBOVUxMOworCXN0cnVjdCBwc2FpICAgICAgICAgICAgICpwc2FpcCA9IE5VTEw7CisJc3RydWN0IG1pcF9yZWdfaW5mbyAJKm1pOworCXN0cnVjdCBtaXBfcmVnCQkqaG9zdCwgKm1pcDsKKworCXRwID0gb2VtcHRyOworCisJdHAgKz0gODsKKworCWZvciAoaT0wOyBpIDw9IDY7IGkrKykgeworCQl0eXBlID0gKnRwKys7CisJCXNpemUgPSAqdHArKzsKKwkJdHAgLT0gMjsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgTUlQX1JFRzoKKwkJCW1pID0gKHN0cnVjdCBtaXBfcmVnX2luZm8gKil0cDsKKwkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+aG9zdF9yZWcpOworCQkJaG9zdF9hZGRyID0gdmFsOworCQkJaG9zdCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKKwkJCWhvc3RfcmVnID0gX192YShob3N0KTsKKwkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+bWlwX3JlZyk7CisJCQltaXBfcG9ydCA9IE1JUF9QT1JUKG1pLT5taXBfaW5mbyk7CisJCQltaXBfYWRkciA9IHZhbDsKKwkJCW1pcCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKKwkJCW1pcF9yZWcgPSBfX3ZhKG1pcCk7CisJCQlwcl9kZWJ1ZygiZXM3MDAwX21pcGNmZzogaG9zdF9yZWcgPSAweCVseCBcbiIsCisJCQkJICh1bnNpZ25lZCBsb25nKWhvc3RfcmVnKTsKKwkJCXByX2RlYnVnKCJlczcwMDBfbWlwY2ZnOiBtaXBfcmVnID0gMHglbHggXG4iLAorCQkJCSAodW5zaWduZWQgbG9uZyltaXBfcmVnKTsKKwkJCXN1Y2Nlc3MrKzsKKwkJCWJyZWFrOworCQljYXNlIE1JUF9QU0FJX1JFRzoKKwkJCXBzYWlwID0gKHN0cnVjdCBwc2FpICopdHA7CisJCQlpZiAodHAgIT0gTlVMTCkgeworCQkJCWlmIChwc2FpcC0+YWRkcikKKwkJCQkJcHNhaSA9IF9fdmEocHNhaXAtPmFkZHIpOworCQkJCWVsc2UKKwkJCQkJcHNhaSA9IE5VTEw7CisJCQkJc3VjY2VzcysrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl0cCArPSBzaXplOworCX0KKworCWlmIChzdWNjZXNzIDwgMikgeworCQllczcwMDBfcGxhdCA9IE5PTl9VTklTWVM7CisJfSBlbHNlCisJCXNldHVwX3VuaXN5cygpOworCXJldHVybiBlczcwMDBfcGxhdDsKK30KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZW1fYWRkclg7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvZW1fc2l6ZTsKK2ludCBfX2luaXQgZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyAqb2VtX2FkZHIpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCWludCBpID0gMDsKKwlhY3BpX3NpemUgdGJsX3NpemU7CisKKwl3aGlsZSAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZSgiT0VNMSIsIGkrKywgJmhlYWRlciwgJnRibF9zaXplKSkpIHsKKwkJaWYgKCFtZW1jbXAoKGNoYXIgKikgJmhlYWRlci0+b2VtX2lkLCAiVU5JU1lTIiwgNikpIHsKKwkJCXN0cnVjdCBvZW1fdGFibGUgKnQgPSAoc3RydWN0IG9lbV90YWJsZSAqKWhlYWRlcjsKKworCQkJb2VtX2FkZHJYID0gdC0+T0VNVGFibGVBZGRyOworCQkJb2VtX3NpemUgPSB0LT5PRU1UYWJsZVNpemU7CisJCQllYXJseV9hY3BpX29zX3VubWFwX21lbW9yeShoZWFkZXIsIHRibF9zaXplKTsKKworCQkJKm9lbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX19hY3BpX21hcF90YWJsZShvZW1fYWRkclgsCisJCQkJCQkJCSAgICBvZW1fc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllYXJseV9hY3BpX29zX3VubWFwX21lbW9yeShoZWFkZXIsIHRibF9zaXplKTsKKwl9CisJcmV0dXJuIC0xOworfQorCit2b2lkIF9faW5pdCB1bm1hcF91bmlzeXNfYWNwaV9vZW1fdGFibGUodW5zaWduZWQgbG9uZyBvZW1fYWRkcikKK3sKKwlpZiAoIW9lbV9hZGRyKQorCQlyZXR1cm47CisKKwlfX2FjcGlfdW5tYXBfdGFibGUoKGNoYXIgKilvZW1fYWRkciwgb2VtX3NpemUpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitlczcwMDBfc3BpbihpbnQgbikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSsrIDwgbikKKwkJcmVwX25vcCgpOworfQorCitzdGF0aWMgaW50IF9faW5pdAorZXM3MDAwX21pcF93cml0ZShzdHJ1Y3QgbWlwX3JlZyAqbWlwX3JlZykKK3sKKwlpbnQJCQlzdGF0dXMgPSAwOworCWludAkJCXNwaW47CisKKwlzcGluID0gTUlQX1NQSU47CisJd2hpbGUgKCgodW5zaWduZWQgbG9uZyBsb25nKWhvc3RfcmVnLT5vZmZfMzggJgorCQkodW5zaWduZWQgbG9uZyBsb25nKU1JUF9WQUxJRCkgIT0gMCkgeworCQkJaWYgKC0tc3BpbiA8PSAwKSB7CisJCQkJcHJpbnRrKCJlczcwMDBfbWlwX3dyaXRlOiBUaW1lb3V0IHdhaXRpbmcgZm9yIEhvc3QgVmFsaWQgRmxhZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJZXM3MDAwX3NwaW4oTUlQX1NQSU4pOworCX0KKworCW1lbWNweShob3N0X3JlZywgbWlwX3JlZywgc2l6ZW9mKHN0cnVjdCBtaXBfcmVnKSk7CisJb3V0YigxLCBtaXBfcG9ydCk7CisKKwlzcGluID0gTUlQX1NQSU47CisKKwl3aGlsZSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbWlwX3JlZy0+b2ZmXzM4ICYKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylNSVBfVkFMSUQpID09IDApIHsKKwkJaWYgKC0tc3BpbiA8PSAwKSB7CisJCQlwcmludGsoImVzNzAwMF9taXBfd3JpdGU6IFRpbWVvdXQgd2FpdGluZyBmb3IgTUlQIFZhbGlkIEZsYWciKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQllczcwMDBfc3BpbihNSVBfU1BJTik7CisJfQorCisJc3RhdHVzID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbWlwX3JlZy0+b2ZmXzAgJgorCQkodW5zaWduZWQgbG9uZyBsb25nKTB4ZmZmZjAwMDAwMDAwMDBVTEwpID4+IDQ4OworCW1pcF9yZWctPm9mZl8zOCA9ICgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8zOCAmCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpfk1JUF9WQUxJRCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CitlczcwMDBfc3RhcnRfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZWlwKQoreworCXVuc2lnbmVkIGxvbmcgdmVjdCA9IDAsIHBzYWl2YWwgPSAwOworCisJaWYgKHBzYWkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJdmVjdCA9ICgodW5zaWduZWQgbG9uZylfX3BhKGVpcCkvMHgxMDAwKSA8PCAxNjsKKwlwc2FpdmFsID0gKDB4MTAwMDAwMCB8IHZlY3QgfCBjcHUpOworCisJd2hpbGUgKCpwc2FpICYgMHgxMDAwMDAwKQorICAgICAgICAgICAgICAgIDsKKworCSpwc2FpID0gcHNhaXZhbDsKKworCXJldHVybiAwOworCit9CisKK3ZvaWQgX19pbml0CitlczcwMDBfc3dfYXBpYyh2b2lkKQoreworCWlmIChlczcwMDBfcGxhdCkgeworCQlpbnQgbWlwX3N0YXR1czsKKwkJc3RydWN0IG1pcF9yZWcgZXM3MDAwX21pcF9yZWc7CisKKwkJcHJpbnRrKCJFUzcwMDA6IEVuYWJsaW5nIEFQSUMgbW9kZS5cbiIpOworICAgICAgICAJbWVtc2V0KCZlczcwMDBfbWlwX3JlZywgMCwgc2l6ZW9mKHN0cnVjdCBtaXBfcmVnKSk7CisgICAgICAgIAllczcwMDBfbWlwX3JlZy5vZmZfMCA9IE1JUF9TV19BUElDOworICAgICAgICAJZXM3MDAwX21pcF9yZWcub2ZmXzM4ID0gKE1JUF9WQUxJRCk7CisgICAgICAgIAl3aGlsZSAoKG1pcF9zdGF0dXMgPSBlczcwMDBfbWlwX3dyaXRlKCZlczcwMDBfbWlwX3JlZykpICE9IDApCisgICAgICAgICAgICAgIAkJcHJpbnRrKCJlczcwMDBfc3dfYXBpYzogY29tbWFuZCBmYWlsZWQsIHN0YXR1cyA9ICV4XG4iLAorCQkJCW1pcF9zdGF0dXMpOworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2dlbmFwaWNfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9nZW5hcGljXzY0LmMKaW5kZXggZWFmZjBiYi4uNmM5YmZjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2dlbmFwaWNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZ2VuYXBpY182NC5jCkBAIC0xNiw4NyArMTYsNjMgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZG1hci5oPgogCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9pcGkuaD4KICNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgogCi0jaWZkZWYgQ09ORklHX0FDUEkKLSNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jZW5kaWYKLQotREVGSU5FX1BFUl9DUFUoaW50LCB4MmFwaWNfZXh0cmFfYml0cyk7CitleHRlcm4gc3RydWN0IGdlbmFwaWMgYXBpY19mbGF0OworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfcGh5c2ZsYXQ7CitleHRlcm4gc3RydWN0IGdlbmFwaWMgYXBpY194MnhwaWNfdXZfeDsKK2V4dGVybiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX3gyYXBpY19waHlzOworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfeDJhcGljX2NsdXN0ZXI7CiAKIHN0cnVjdCBnZW5hcGljIF9fcmVhZF9tb3N0bHkgKmdlbmFwaWMgPSAmYXBpY19mbGF0OwogCi1zdGF0aWMgZW51bSB1dl9zeXN0ZW1fdHlwZSB1dl9zeXN0ZW1fdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgZ2VuYXBpYyAqYXBpY19wcm9iZVtdIF9faW5pdGRhdGEgPSB7CisJJmFwaWNfeDJhcGljX3V2X3gsCisJJmFwaWNfeDJhcGljX3BoeXMsCisJJmFwaWNfeDJhcGljX2NsdXN0ZXIsCisJJmFwaWNfcGh5c2ZsYXQsCisJTlVMTCwKK307CiAKIC8qCiAgKiBDaGVjayB0aGUgQVBJQyBJRHMgaW4gYmlvc19jcHVfYXBpY2lkIGFuZCBjaG9vc2UgdGhlIEFQSUMgbW9kZS4KICAqLwogdm9pZCBfX2luaXQgc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpCiB7Ci0JaWYgKHV2X3N5c3RlbV90eXBlID09IFVWX05PTl9VTklRVUVfQVBJQykKLQkJZ2VuYXBpYyA9ICZhcGljX3gyYXBpY191dl94OwotCWVsc2UKLSNpZmRlZiBDT05GSUdfQUNQSQotCS8qCi0JICogUXVpcms6IHNvbWUgeDg2XzY0IG1hY2hpbmVzIGNhbiBvbmx5IHVzZSBwaHlzaWNhbCBBUElDIG1vZGUKLQkgKiByZWdhcmRsZXNzIG9mIGhvdyBtYW55IHByb2Nlc3NvcnMgYXJlIHByZXNlbnQgKHg4Nl82NCBFUzcwMDAKLQkgKiBpcyBhbiBleGFtcGxlKS4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIucmV2aXNpb24gPiBGQURUMl9SRVZJU0lPTl9JRCAmJgotCQkJKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfQVBJQ19QSFlTSUNBTCkpCi0JCWdlbmFwaWMgPSAmYXBpY19waHlzZmxhdDsKLQllbHNlCi0jZW5kaWYKKwlpZiAoZ2VuYXBpYyA9PSAmYXBpY194MmFwaWNfcGh5cyB8fCBnZW5hcGljID09ICZhcGljX3gyYXBpY19jbHVzdGVyKSB7CisJCWlmICghaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkKKwkJCWdlbmFwaWMgPSAmYXBpY19mbGF0OworCX0KIAotCWlmIChtYXhfcGh5c2ljYWxfYXBpY2lkIDwgOCkKLQkJZ2VuYXBpYyA9ICZhcGljX2ZsYXQ7Ci0JZWxzZQotCQlnZW5hcGljID0gJmFwaWNfcGh5c2ZsYXQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIEFQSUMgcm91dGluZyB0byAlc1xuIiwgZ2VuYXBpYy0+bmFtZSk7CisJaWYgKGdlbmFwaWMgPT0gJmFwaWNfZmxhdCkgeworCQlpZiAobWF4X3BoeXNpY2FsX2FwaWNpZCA+PSA4KQorCQkJZ2VuYXBpYyA9ICZhcGljX3BoeXNmbGF0OworCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIEFQSUMgcm91dGluZyB0byAlc1xuIiwgZ2VuYXBpYy0+bmFtZSk7CisJfQogfQogCiAvKiBTYW1lIGZvciBib3RoIGZsYXQgYW5kIHBoeXNpY2FsLiAqLwogCi12b2lkIHNlbmRfSVBJX3NlbGYoaW50IHZlY3RvcikKK3ZvaWQgYXBpY19zZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpCiB7CiAJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfU0VMRiwgdmVjdG9yLCBBUElDX0RFU1RfUEhZU0lDQUwpOwogfQogCiBpbnQgX19pbml0IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCiB7Ci0JaWYgKCFzdHJjbXAob2VtX2lkLCAiU0dJIikpIHsKLQkJaWYgKCFzdHJjbXAob2VtX3RhYmxlX2lkLCAiVVZMIikpCi0JCQl1dl9zeXN0ZW1fdHlwZSA9IFVWX0xFR0FDWV9BUElDOwotCQllbHNlIGlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWWCIpKQotCQkJdXZfc3lzdGVtX3R5cGUgPSBVVl9YMkFQSUM7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob2VtX3RhYmxlX2lkLCAiVVZIIikpCi0JCQl1dl9zeXN0ZW1fdHlwZSA9IFVWX05PTl9VTklRVUVfQVBJQzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGFwaWNfcHJvYmVbaV07ICsraSkgeworCQlpZiAoYXBpY19wcm9iZVtpXS0+YWNwaV9tYWR0X29lbV9jaGVjayhvZW1faWQsIG9lbV90YWJsZV9pZCkpIHsKKwkJCWdlbmFwaWMgPSBhcGljX3Byb2JlW2ldOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBBUElDIHJvdXRpbmcgdG8gJXMuXG4iLAorCQkJCWdlbmFwaWMtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9Ci0KLXVuc2lnbmVkIGludCByZWFkX2FwaWNfaWQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlXQVJOX09OKHByZWVtcHRpYmxlKCkgJiYgbnVtX29ubGluZV9jcHVzKCkgPiAxKTsKLQlpZCA9IGFwaWNfcmVhZChBUElDX0lEKTsKLQlpZiAodXZfc3lzdGVtX3R5cGUgPj0gVVZfWDJBUElDKQotCQlpZCAgfD0gX19nZXRfY3B1X3Zhcih4MmFwaWNfZXh0cmFfYml0cyk7Ci0JcmV0dXJuIGlkOwotfQotCi1lbnVtIHV2X3N5c3RlbV90eXBlIGdldF91dl9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiB1dl9zeXN0ZW1fdHlwZTsKLX0KLQotaW50IGlzX3V2X3N5c3RlbSh2b2lkKQotewotCXJldHVybiB1dl9zeXN0ZW1fdHlwZSAhPSBVVl9OT05FOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXNfdXZfc3lzdGVtKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9nZW5hcGljX2ZsYXRfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9nZW5hcGljX2ZsYXRfNjQuYwppbmRleCA3ODY1NDhhLi45ZWNhNWJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZ2VuYXBpY19mbGF0XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2dlbmFwaWNfZmxhdF82NC5jCkBAIC0xNSw5ICsxNSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2lwaS5oPgogI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljZGVmLmg+CisKKyNpZmRlZiBDT05GSUdfQUNQSQorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCit7CisJcmV0dXJuIDE7Cit9CiAKIHN0YXRpYyBjcHVtYXNrX3QgZmxhdF90YXJnZXRfY3B1cyh2b2lkKQogewpAQCAtOTUsOSArMTA2LDMzIEBACiAJCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTElOQywgdmVjdG9yLCBBUElDX0RFU1RfTE9HSUNBTCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQoreworCXVuc2lnbmVkIGludCBpZDsKKworCWlkID0gKCgoeCk+PjI0KSAmIDB4RkZ1KTsKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9hcGljX2lkKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwl4ID0gKChpZCAmIDB4RkZ1KTw8MjQpOworCXJldHVybiB4OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfeGFwaWNfaWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlpZCA9IGdldF9hcGljX2lkKGFwaWNfcmVhZChBUElDX0lEKSk7CisJcmV0dXJuIGlkOworfQorCiBzdGF0aWMgaW50IGZsYXRfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCiB7Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSksIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwlyZXR1cm4gcGh5c2lkX2lzc2V0KHJlYWRfeGFwaWNfaWQoKSwgcGh5c19jcHVfcHJlc2VudF9tYXApOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZsYXRfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2tfdCBjcHVtYXNrKQpAQCAtMTEyLDYgKzE0Nyw3IEBACiAKIHN0cnVjdCBnZW5hcGljIGFwaWNfZmxhdCA9ICB7CiAJLm5hbWUgPSAiZmxhdCIsCisJLmFjcGlfbWFkdF9vZW1fY2hlY2sgPSBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2ssCiAJLmludF9kZWxpdmVyeV9tb2RlID0gZGVzdF9Mb3dlc3RQcmlvLAogCS5pbnRfZGVzdF9tb2RlID0gKEFQSUNfREVTVF9MT0dJQ0FMICE9IDApLAogCS50YXJnZXRfY3B1cyA9IGZsYXRfdGFyZ2V0X2NwdXMsCkBAIC0xMjEsOCArMTU3LDEyIEBACiAJLnNlbmRfSVBJX2FsbCA9IGZsYXRfc2VuZF9JUElfYWxsLAogCS5zZW5kX0lQSV9hbGxidXRzZWxmID0gZmxhdF9zZW5kX0lQSV9hbGxidXRzZWxmLAogCS5zZW5kX0lQSV9tYXNrID0gZmxhdF9zZW5kX0lQSV9tYXNrLAorCS5zZW5kX0lQSV9zZWxmID0gYXBpY19zZW5kX0lQSV9zZWxmLAogCS5jcHVfbWFza190b19hcGljaWQgPSBmbGF0X2NwdV9tYXNrX3RvX2FwaWNpZCwKIAkucGh5c19wa2dfaWQgPSBwaHlzX3BrZ19pZCwKKwkuZ2V0X2FwaWNfaWQgPSBnZXRfYXBpY19pZCwKKwkuc2V0X2FwaWNfaWQgPSBzZXRfYXBpY19pZCwKKwkuYXBpY19pZF9tYXNrID0gKDB4RkZ1PDwyNCksCiB9OwogCiAvKgpAQCAtMTMwLDYgKzE3MCwyMSBAQAogICogV2UgY2Fubm90IHVzZSBsb2dpY2FsIGRlbGl2ZXJ5IGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoZSBtYXNrCiAgKiBvdmVyZmxvd3MsIHNvIHVzZSBwaHlzaWNhbCBtb2RlLgogICovCitzdGF0aWMgaW50IF9faW5pdCBwaHlzZmxhdF9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQoreworI2lmZGVmIENPTkZJR19BQ1BJCisJLyoKKwkgKiBRdWlyazogc29tZSB4ODZfNjQgbWFjaGluZXMgY2FuIG9ubHkgdXNlIHBoeXNpY2FsIEFQSUMgbW9kZQorCSAqIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgcHJvY2Vzc29ycyBhcmUgcHJlc2VudCAoeDg2XzY0IEVTNzAwMAorCSAqIGlzIGFuIGV4YW1wbGUpLgorCSAqLworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA+IEZBRFQyX1JFVklTSU9OX0lEICYmCisJCShhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX0FQSUNfUEhZU0lDQUwpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBjcHVtYXNrX3QgcGh5c2ZsYXRfdGFyZ2V0X2NwdXModm9pZCkKIHsKQEAgLTE3Niw2ICsyMzEsNyBAQAogCiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX3BoeXNmbGF0ID0gIHsKIAkubmFtZSA9ICJwaHlzaWNhbCBmbGF0IiwKKwkuYWNwaV9tYWR0X29lbV9jaGVjayA9IHBoeXNmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2ssCiAJLmludF9kZWxpdmVyeV9tb2RlID0gZGVzdF9GaXhlZCwKIAkuaW50X2Rlc3RfbW9kZSA9IChBUElDX0RFU1RfUEhZU0lDQUwgIT0gMCksCiAJLnRhcmdldF9jcHVzID0gcGh5c2ZsYXRfdGFyZ2V0X2NwdXMsCkBAIC0xODUsNiArMjQxLDEwIEBACiAJLnNlbmRfSVBJX2FsbCA9IHBoeXNmbGF0X3NlbmRfSVBJX2FsbCwKIAkuc2VuZF9JUElfYWxsYnV0c2VsZiA9IHBoeXNmbGF0X3NlbmRfSVBJX2FsbGJ1dHNlbGYsCiAJLnNlbmRfSVBJX21hc2sgPSBwaHlzZmxhdF9zZW5kX0lQSV9tYXNrLAorCS5zZW5kX0lQSV9zZWxmID0gYXBpY19zZW5kX0lQSV9zZWxmLAogCS5jcHVfbWFza190b19hcGljaWQgPSBwaHlzZmxhdF9jcHVfbWFza190b19hcGljaWQsCiAJLnBoeXNfcGtnX2lkID0gcGh5c19wa2dfaWQsCisJLmdldF9hcGljX2lkID0gZ2V0X2FwaWNfaWQsCisJLnNldF9hcGljX2lkID0gc2V0X2FwaWNfaWQsCisJLmFwaWNfaWRfbWFzayA9ICgweEZGdTw8MjQpLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9nZW54MmFwaWNfY2x1c3Rlci5jIGIvYXJjaC94ODYva2VybmVsL2dlbngyYXBpY19jbHVzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZjJjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9nZW54MmFwaWNfY2x1c3Rlci5jCkBAIC0wLDAgKzEsMTU5IEBACisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFyLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lwaS5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CisKK0RFRklORV9QRVJfQ1BVKHUzMiwgeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHgyYXBpY19hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQoreworCWlmIChjcHVfaGFzX3gyYXBpYykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RhcnQgd2l0aCBhbGwgSVJRcyBwb2ludGluZyB0byBib290IENQVS4gIElSUSBiYWxhbmNpbmcgd2lsbCBzaGlmdCB0aGVtLiAqLworCitzdGF0aWMgY3B1bWFza190IHgyYXBpY190YXJnZXRfY3B1cyh2b2lkKQoreworCXJldHVybiBjcHVtYXNrX29mX2NwdSgwKTsKK30KKworLyoKKyAqIGZvciBub3cgZWFjaCBsb2dpY2FsIGNwdSBpcyBpbiBpdHMgb3duIHZlY3RvciBhbGxvY2F0aW9uIGRvbWFpbi4KKyAqLworc3RhdGljIGNwdW1hc2tfdCB4MmFwaWNfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluKGludCBjcHUpCit7CisJY3B1bWFza190IGRvbWFpbiA9IENQVV9NQVNLX05PTkU7CisJY3B1X3NldChjcHUsIGRvbWFpbik7CisJcmV0dXJuIGRvbWFpbjsKK30KKworc3RhdGljIHZvaWQgX194MmFwaWNfc2VuZF9JUElfZGVzdCh1bnNpZ25lZCBpbnQgYXBpY2lkLCBpbnQgdmVjdG9yLAorCQkJCSAgIHVuc2lnbmVkIGludCBkZXN0KQoreworCXVuc2lnbmVkIGxvbmcgY2ZnOworCisJY2ZnID0gX19wcmVwYXJlX0lDUigwLCB2ZWN0b3IsIGRlc3QpOworCisJLyoKKwkgKiBzZW5kIHRoZSBJUEkuCisJICovCisJeDJhcGljX2ljcl93cml0ZShjZmcsIGFwaWNpZCk7Cit9CisKKy8qCisgKiBmb3Igbm93LCB3ZSBzZW5kIHRoZSBJUEkncyBvbmUgYnkgb25lIGluIHRoZSBjcHVtYXNrLgorICogVEJEOiBCYXNlZCBvbiB0aGUgY3B1IG1hc2ssIHdlIGNhbiBzZW5kIHRoZSBJUEkncyB0byB0aGUgY2x1c3RlciBncm91cAorICogYXQgb25jZS4gV2UgaGF2ZSAxNiBjcHUncyBpbiBhIGNsdXN0ZXIuIFRoaXMgd2lsbCBtaW5pbWl6ZSBJUEkgcmVnaXN0ZXIKKyAqIHdyaXRlcy4KKyAqLworc3RhdGljIHZvaWQgeDJhcGljX3NlbmRfSVBJX21hc2soY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHF1ZXJ5X2NwdTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmb3JfZWFjaF9jcHVfbWFzayhxdWVyeV9jcHUsIG1hc2spIHsKKwkJX194MmFwaWNfc2VuZF9JUElfZGVzdChwZXJfY3B1KHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQsIHF1ZXJ5X2NwdSksCisJCQkJICAgICAgIHZlY3RvciwgQVBJQ19ERVNUX0xPR0lDQUwpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHgyYXBpY19zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCit7CisJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKKworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG1hc2spOworCisJaWYgKCFjcHVzX2VtcHR5KG1hc2spKQorCQl4MmFwaWNfc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOworfQorCitzdGF0aWMgdm9pZCB4MmFwaWNfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCit7CisJeDJhcGljX3NlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXAsIHZlY3Rvcik7Cit9CisKK3N0YXRpYyBpbnQgeDJhcGljX2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHgyYXBpY19jcHVfbWFza190b19hcGljaWQoY3B1bWFza190IGNwdW1hc2spCit7CisJaW50IGNwdTsKKworCS8qCisJICogV2UncmUgdXNpbmcgZml4ZWQgSVJRIGRlbGl2ZXJ5LCBjYW4gb25seSByZXR1cm4gb25lIHBoeXMgQVBJQyBJRC4KKwkgKiBNYXkgYXMgd2VsbCBiZSB0aGUgZmlyc3QuCisJICovCisJY3B1ID0gZmlyc3RfY3B1KGNwdW1hc2spOworCWlmICgodW5zaWduZWQpY3B1IDwgTlJfQ1BVUykKKwkJcmV0dXJuIHBlcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgY3B1KTsKKwllbHNlCisJCXJldHVybiBCQURfQVBJQ0lEOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlpZCA9IHg7CisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfYXBpY19pZCh1bnNpZ25lZCBpbnQgaWQpCit7CisJdW5zaWduZWQgbG9uZyB4OworCisJeCA9IGlkOworCXJldHVybiB4OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBoeXNfcGtnX2lkKGludCBpbmRleF9tc2IpCit7CisJcmV0dXJuIGN1cnJlbnRfY3B1X2RhdGEuaW5pdGlhbF9hcGljaWQgPj4gaW5kZXhfbXNiOworfQorCitzdGF0aWMgdm9pZCB4MmFwaWNfc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKQoreworCWFwaWNfd3JpdGUoQVBJQ19TRUxGX0lQSSwgdmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF94MmFwaWNfbGRyKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXBlcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgY3B1KSA9IGFwaWNfcmVhZChBUElDX0xEUik7CisJcmV0dXJuOworfQorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX3gyYXBpY19jbHVzdGVyID0geworCS5uYW1lID0gImNsdXN0ZXIgeDJhcGljIiwKKwkuYWNwaV9tYWR0X29lbV9jaGVjayA9IHgyYXBpY19hY3BpX21hZHRfb2VtX2NoZWNrLAorCS5pbnRfZGVsaXZlcnlfbW9kZSA9IGRlc3RfTG93ZXN0UHJpbywKKwkuaW50X2Rlc3RfbW9kZSA9IChBUElDX0RFU1RfTE9HSUNBTCAhPSAwKSwKKwkudGFyZ2V0X2NwdXMgPSB4MmFwaWNfdGFyZ2V0X2NwdXMsCisJLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiA9IHgyYXBpY192ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4sCisJLmFwaWNfaWRfcmVnaXN0ZXJlZCA9IHgyYXBpY19hcGljX2lkX3JlZ2lzdGVyZWQsCisJLmluaXRfYXBpY19sZHIgPSBpbml0X3gyYXBpY19sZHIsCisJLnNlbmRfSVBJX2FsbCA9IHgyYXBpY19zZW5kX0lQSV9hbGwsCisJLnNlbmRfSVBJX2FsbGJ1dHNlbGYgPSB4MmFwaWNfc2VuZF9JUElfYWxsYnV0c2VsZiwKKwkuc2VuZF9JUElfbWFzayA9IHgyYXBpY19zZW5kX0lQSV9tYXNrLAorCS5zZW5kX0lQSV9zZWxmID0geDJhcGljX3NlbmRfSVBJX3NlbGYsCisJLmNwdV9tYXNrX3RvX2FwaWNpZCA9IHgyYXBpY19jcHVfbWFza190b19hcGljaWQsCisJLnBoeXNfcGtnX2lkID0gcGh5c19wa2dfaWQsCisJLmdldF9hcGljX2lkID0gZ2V0X2FwaWNfaWQsCisJLnNldF9hcGljX2lkID0gc2V0X2FwaWNfaWQsCisJLmFwaWNfaWRfbWFzayA9ICgweEZGRkZGRkZGdSksCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2dlbngyYXBpY19waHlzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZ2VueDJhcGljX3BoeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjEzNDNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2dlbngyYXBpY19waHlzLmMKQEAgLTAsMCArMSwxNTQgQEAKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXIuaD4KKworI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaXBpLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKworc3RhdGljIGludCB4MmFwaWNfcGh5czsKKworc3RhdGljIGludCBzZXRfeDJhcGljX3BoeXNfbW9kZShjaGFyICphcmcpCit7CisJeDJhcGljX3BoeXMgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIngyYXBpY19waHlzIiwgc2V0X3gyYXBpY19waHlzX21vZGUpOworCitzdGF0aWMgaW50IF9faW5pdCB4MmFwaWNfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKK3sKKwlpZiAoY3B1X2hhc194MmFwaWMgJiYgeDJhcGljX3BoeXMpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0YXJ0IHdpdGggYWxsIElSUXMgcG9pbnRpbmcgdG8gYm9vdCBDUFUuICBJUlEgYmFsYW5jaW5nIHdpbGwgc2hpZnQgdGhlbS4gKi8KKworc3RhdGljIGNwdW1hc2tfdCB4MmFwaWNfdGFyZ2V0X2NwdXModm9pZCkKK3sKKwlyZXR1cm4gY3B1bWFza19vZl9jcHUoMCk7Cit9CisKK3N0YXRpYyBjcHVtYXNrX3QgeDJhcGljX3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbihpbnQgY3B1KQoreworCWNwdW1hc2tfdCBkb21haW4gPSBDUFVfTUFTS19OT05FOworCWNwdV9zZXQoY3B1LCBkb21haW4pOworCXJldHVybiBkb21haW47Cit9CisKK3N0YXRpYyB2b2lkIF9feDJhcGljX3NlbmRfSVBJX2Rlc3QodW5zaWduZWQgaW50IGFwaWNpZCwgaW50IHZlY3RvciwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGVzdCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZzsKKworCWNmZyA9IF9fcHJlcGFyZV9JQ1IoMCwgdmVjdG9yLCBkZXN0KTsKKworCS8qCisJICogc2VuZCB0aGUgSVBJLgorCSAqLworCXgyYXBpY19pY3Jfd3JpdGUoY2ZnLCBhcGljaWQpOworfQorCitzdGF0aWMgdm9pZCB4MmFwaWNfc2VuZF9JUElfbWFzayhjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgcXVlcnlfY3B1OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvcl9lYWNoX2NwdV9tYXNrKHF1ZXJ5X2NwdSwgbWFzaykgeworCQlfX3gyYXBpY19zZW5kX0lQSV9kZXN0KHBlcl9jcHUoeDg2X2NwdV90b19hcGljaWQsIHF1ZXJ5X2NwdSksCisJCQkJICAgICAgIHZlY3RvciwgQVBJQ19ERVNUX1BIWVNJQ0FMKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB4MmFwaWNfc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQoreworCWNwdW1hc2tfdCBtYXNrID0gY3B1X29ubGluZV9tYXA7CisKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKworCWlmICghY3B1c19lbXB0eShtYXNrKSkKKwkJeDJhcGljX3NlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQgeDJhcGljX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQoreworCXgyYXBpY19zZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFwLCB2ZWN0b3IpOworfQorCitzdGF0aWMgaW50IHgyYXBpY19hcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB4MmFwaWNfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2tfdCBjcHVtYXNrKQoreworCWludCBjcHU7CisKKwkvKgorCSAqIFdlJ3JlIHVzaW5nIGZpeGVkIElSUSBkZWxpdmVyeSwgY2FuIG9ubHkgcmV0dXJuIG9uZSBwaHlzIEFQSUMgSUQuCisJICogTWF5IGFzIHdlbGwgYmUgdGhlIGZpcnN0LgorCSAqLworCWNwdSA9IGZpcnN0X2NwdShjcHVtYXNrKTsKKwlpZiAoKHVuc2lnbmVkKWNwdSA8IE5SX0NQVVMpCisJCXJldHVybiBwZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOworCWVsc2UKKwkJcmV0dXJuIEJBRF9BUElDSUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQoreworCXVuc2lnbmVkIGludCBpZDsKKworCWlkID0geDsKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9hcGljX2lkKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwl4ID0gaWQ7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGh5c19wa2dfaWQoaW50IGluZGV4X21zYikKK3sKKwlyZXR1cm4gY3VycmVudF9jcHVfZGF0YS5pbml0aWFsX2FwaWNpZCA+PiBpbmRleF9tc2I7Cit9CisKK3ZvaWQgeDJhcGljX3NlbmRfSVBJX3NlbGYoaW50IHZlY3RvcikKK3sKKwlhcGljX3dyaXRlKEFQSUNfU0VMRl9JUEksIHZlY3Rvcik7Cit9CisKK3ZvaWQgaW5pdF94MmFwaWNfbGRyKHZvaWQpCit7CisJcmV0dXJuOworfQorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX3gyYXBpY19waHlzID0geworCS5uYW1lID0gInBoeXNpY2FsIHgyYXBpYyIsCisJLmFjcGlfbWFkdF9vZW1fY2hlY2sgPSB4MmFwaWNfYWNwaV9tYWR0X29lbV9jaGVjaywKKwkuaW50X2RlbGl2ZXJ5X21vZGUgPSBkZXN0X0ZpeGVkLAorCS5pbnRfZGVzdF9tb2RlID0gKEFQSUNfREVTVF9QSFlTSUNBTCAhPSAwKSwKKwkudGFyZ2V0X2NwdXMgPSB4MmFwaWNfdGFyZ2V0X2NwdXMsCisJLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiA9IHgyYXBpY192ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4sCisJLmFwaWNfaWRfcmVnaXN0ZXJlZCA9IHgyYXBpY19hcGljX2lkX3JlZ2lzdGVyZWQsCisJLmluaXRfYXBpY19sZHIgPSBpbml0X3gyYXBpY19sZHIsCisJLnNlbmRfSVBJX2FsbCA9IHgyYXBpY19zZW5kX0lQSV9hbGwsCisJLnNlbmRfSVBJX2FsbGJ1dHNlbGYgPSB4MmFwaWNfc2VuZF9JUElfYWxsYnV0c2VsZiwKKwkuc2VuZF9JUElfbWFzayA9IHgyYXBpY19zZW5kX0lQSV9tYXNrLAorCS5zZW5kX0lQSV9zZWxmID0geDJhcGljX3NlbmRfSVBJX3NlbGYsCisJLmNwdV9tYXNrX3RvX2FwaWNpZCA9IHgyYXBpY19jcHVfbWFza190b19hcGljaWQsCisJLnBoeXNfcGtnX2lkID0gcGh5c19wa2dfaWQsCisJLmdldF9hcGljX2lkID0gZ2V0X2FwaWNfaWQsCisJLnNldF9hcGljX2lkID0gc2V0X2FwaWNfaWQsCisJLmFwaWNfaWRfbWFzayA9ICgweEZGRkZGRkZGdSksCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2dlbngyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvZ2VueDJhcGljX3V2X3guYwppbmRleCBiZmE4MzdjLi4zMzU4MWQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZ2VueDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZ2VueDJhcGljX3V2X3guYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9pcGkuaD4KICNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgpAQCAtMjYsNiArMjYsMzYgQEAKICNpbmNsdWRlIDxhc20vdXYvdXZfaHViLmg+CiAjaW5jbHVkZSA8YXNtL3V2L2Jpb3MuaD4KIAorREVGSU5FX1BFUl9DUFUoaW50LCB4MmFwaWNfZXh0cmFfYml0cyk7CisKK3N0YXRpYyBlbnVtIHV2X3N5c3RlbV90eXBlIHV2X3N5c3RlbV90eXBlOworCitzdGF0aWMgaW50IF9faW5pdCB1dl9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQoreworCWlmICghc3RyY21wKG9lbV9pZCwgIlNHSSIpKSB7CisJCWlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWTCIpKQorCQkJdXZfc3lzdGVtX3R5cGUgPSBVVl9MRUdBQ1lfQVBJQzsKKwkJZWxzZSBpZiAoIXN0cmNtcChvZW1fdGFibGVfaWQsICJVVlgiKSkKKwkJCXV2X3N5c3RlbV90eXBlID0gVVZfWDJBUElDOworCQllbHNlIGlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWSCIpKSB7CisJCQl1dl9zeXN0ZW1fdHlwZSA9IFVWX05PTl9VTklRVUVfQVBJQzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHV2X3N5c3RlbV90eXBlIGdldF91dl9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiB1dl9zeXN0ZW1fdHlwZTsKK30KKworaW50IGlzX3V2X3N5c3RlbSh2b2lkKQoreworCXJldHVybiB1dl9zeXN0ZW1fdHlwZSAhPSBVVl9OT05FOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXNfdXZfc3lzdGVtKTsKKwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHV2X2h1Yl9pbmZvX3MsIF9fdXZfaHViX2luZm8pOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MX0dQTChfX3V2X2h1Yl9pbmZvKTsKIApAQCAtODQsNyArMTE0LDcgQEAKIAl1bnNpZ25lZCBsb25nIHZhbCwgYXBpY2lkLCBsYXBpY2lkOwogCWludCBwbm9kZTsKIAotCWFwaWNpZCA9IHBlcl9jcHUoeDg2X2NwdV90b19hcGljaWQsIGNwdSk7IC8qIFpaWiAtIGNhY2hlIG5vZGUtbG9jYWwgPyAqLworCWFwaWNpZCA9IHBlcl9jcHUoeDg2X2NwdV90b19hcGljaWQsIGNwdSk7CiAJbGFwaWNpZCA9IGFwaWNpZCAmIDB4M2Y7CQkvKiBaWlogbWFjcm8gbmVlZGVkICovCiAJcG5vZGUgPSB1dl9hcGljaWRfdG9fcG5vZGUoYXBpY2lkKTsKIAl2YWwgPQpAQCAtMTIzLDYgKzE1MywxMCBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCB1dl9pbml0X2FwaWNfbGRyKHZvaWQpCit7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdXZfY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2tfdCBjcHVtYXNrKQogewogCWludCBjcHU7CkBAIC0xMzgsMzEgKzE3Miw1OSBAQAogCQlyZXR1cm4gQkFEX0FQSUNJRDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBwaHlzX3BrZ19pZChpbnQgaW5kZXhfbXNiKQorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCiB7Ci0JcmV0dXJuIEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKSA+PiBpbmRleF9tc2I7CisJdW5zaWduZWQgaW50IGlkOworCisJV0FSTl9PTihwcmVlbXB0aWJsZSgpICYmIG51bV9vbmxpbmVfY3B1cygpID4gMSk7CisJaWQgPSB4IHwgX19nZXRfY3B1X3Zhcih4MmFwaWNfZXh0cmFfYml0cyk7CisKKwlyZXR1cm4gaWQ7CiB9CiAKLSNpZmRlZiBaWloJCS8qIE5lZWRzIHgyYXBpYyBwYXRjaCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2FwaWNfaWQodW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKworCS8qIG1hc2tvdXQgeDJhcGljX2V4dHJhX2JpdHMgPyAqLworCXggPSBpZDsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1dl9yZWFkX2FwaWNfaWQodm9pZCkKK3sKKworCXJldHVybiBnZXRfYXBpY19pZChhcGljX3JlYWQoQVBJQ19JRCkpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBoeXNfcGtnX2lkKGludCBpbmRleF9tc2IpCit7CisJcmV0dXJuIHV2X3JlYWRfYXBpY19pZCgpID4+IGluZGV4X21zYjsKK30KKwogc3RhdGljIHZvaWQgdXZfc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKQogewogCWFwaWNfd3JpdGUoQVBJQ19TRUxGX0lQSSwgdmVjdG9yKTsKIH0KLSNlbmRpZgogCiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX3gyYXBpY191dl94ID0gewogCS5uYW1lID0gIlVWIGxhcmdlIHN5c3RlbSIsCisJLmFjcGlfbWFkdF9vZW1fY2hlY2sgPSB1dl9hY3BpX21hZHRfb2VtX2NoZWNrLAogCS5pbnRfZGVsaXZlcnlfbW9kZSA9IGRlc3RfRml4ZWQsCiAJLmludF9kZXN0X21vZGUgPSAoQVBJQ19ERVNUX1BIWVNJQ0FMICE9IDApLAogCS50YXJnZXRfY3B1cyA9IHV2X3RhcmdldF9jcHVzLAotCS52ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4gPSB1dl92ZWN0b3JfYWxsb2NhdGlvbl9kb21haW4sLyogRml4bWUgWlpaICovCisJLnZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiA9IHV2X3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiwKIAkuYXBpY19pZF9yZWdpc3RlcmVkID0gdXZfYXBpY19pZF9yZWdpc3RlcmVkLAorCS5pbml0X2FwaWNfbGRyID0gdXZfaW5pdF9hcGljX2xkciwKIAkuc2VuZF9JUElfYWxsID0gdXZfc2VuZF9JUElfYWxsLAogCS5zZW5kX0lQSV9hbGxidXRzZWxmID0gdXZfc2VuZF9JUElfYWxsYnV0c2VsZiwKIAkuc2VuZF9JUElfbWFzayA9IHV2X3NlbmRfSVBJX21hc2ssCi0JLyogWlpaLnNlbmRfSVBJX3NlbGYgPSB1dl9zZW5kX0lQSV9zZWxmLCAqLworCS5zZW5kX0lQSV9zZWxmID0gdXZfc2VuZF9JUElfc2VsZiwKIAkuY3B1X21hc2tfdG9fYXBpY2lkID0gdXZfY3B1X21hc2tfdG9fYXBpY2lkLAotCS5waHlzX3BrZ19pZCA9IHBoeXNfcGtnX2lkLAkvKiBGaXhtZSBaWlogKi8KKwkucGh5c19wa2dfaWQgPSBwaHlzX3BrZ19pZCwKKwkuZ2V0X2FwaWNfaWQgPSBnZXRfYXBpY19pZCwKKwkuc2V0X2FwaWNfaWQgPSBzZXRfYXBpY19pZCwKKwkuYXBpY19pZF9tYXNrID0gKDB4RkZGRkZGRkZ1KSwKIH07CiAKIHN0YXRpYyBfX2NwdWluaXQgdm9pZCBzZXRfeDJhcGljX2V4dHJhX2JpdHMoaW50IHBub2RlKQpAQCAtMjIyLDEyICsyODQsMTMgQEAKIAogZW51bSBtYXBfdHlwZSB7bWFwX3diLCBtYXBfdWN9OwogCi1zdGF0aWMgX19pbml0IHZvaWQgbWFwX2hpZ2goY2hhciAqaWQsIHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IHNoaWZ0LCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKQorc3RhdGljIF9faW5pdCB2b2lkIG1hcF9oaWdoKGNoYXIgKmlkLCB1bnNpZ25lZCBsb25nIGJhc2UsIGludCBzaGlmdCwKKwkJCSAgICBpbnQgbWF4X3Bub2RlLCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKQogewogCXVuc2lnbmVkIGxvbmcgYnl0ZXMsIHBhZGRyOwogCiAJcGFkZHIgPSBiYXNlIDw8IHNoaWZ0OwotCWJ5dGVzID0gKDFVTCA8PCBzaGlmdCk7CisJYnl0ZXMgPSAoMVVMIDw8IHNoaWZ0KSAqIChtYXhfcG5vZGUgKyAxKTsKIAlwcmludGsoS0VSTl9JTkZPICJVVjogTWFwICVzX0hJIDB4JWx4IC0gMHglbHhcbiIsIGlkLCBwYWRkciwKIAkgICAgICAgCQkJCQlwYWRkciArIGJ5dGVzKTsKIAlpZiAobWFwX3R5cGUgPT0gbWFwX3VjKQpAQCAtMjQzLDcgKzMwNiw3IEBACiAKIAlncnUudiA9IHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9SSF9HQU1fR1JVX09WRVJMQVlfQ09ORklHX01NUik7CiAJaWYgKGdydS5zLmVuYWJsZSkKLQkJbWFwX2hpZ2goIkdSVSIsIGdydS5zLmJhc2UsIHNoaWZ0LCBtYXBfd2IpOworCQltYXBfaGlnaCgiR1JVIiwgZ3J1LnMuYmFzZSwgc2hpZnQsIG1heF9wbm9kZSwgbWFwX3diKTsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIG1hcF9jb25maWdfaGlnaChpbnQgbWF4X3Bub2RlKQpAQCAtMjUzLDcgKzMxNiw3IEBACiAKIAljZmcudiA9IHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9SSF9HQU1fQ0ZHX09WRVJMQVlfQ09ORklHX01NUik7CiAJaWYgKGNmZy5zLmVuYWJsZSkKLQkJbWFwX2hpZ2goIkNPTkZJRyIsIGNmZy5zLmJhc2UsIHNoaWZ0LCBtYXBfdWMpOworCQltYXBfaGlnaCgiQ09ORklHIiwgY2ZnLnMuYmFzZSwgc2hpZnQsIG1heF9wbm9kZSwgbWFwX3VjKTsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIG1hcF9tbXJfaGlnaChpbnQgbWF4X3Bub2RlKQpAQCAtMjYzLDcgKzMyNiw3IEBACiAKIAltbXIudiA9IHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUik7CiAJaWYgKG1tci5zLmVuYWJsZSkKLQkJbWFwX2hpZ2goIk1NUiIsIG1tci5zLmJhc2UsIHNoaWZ0LCBtYXBfdWMpOworCQltYXBfaGlnaCgiTU1SIiwgbW1yLnMuYmFzZSwgc2hpZnQsIG1heF9wbm9kZSwgbWFwX3VjKTsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIG1hcF9tbWlvaF9oaWdoKGludCBtYXhfcG5vZGUpCkBAIC0yNzMsNyArMzM2LDcgQEAKIAogCW1taW9oLnYgPSB1dl9yZWFkX2xvY2FsX21tcihVVkhfUkhfR0FNX01NSU9IX09WRVJMQVlfQ09ORklHX01NUik7CiAJaWYgKG1taW9oLnMuZW5hYmxlKQotCQltYXBfaGlnaCgiTU1JT0giLCBtbWlvaC5zLmJhc2UsIHNoaWZ0LCBtYXBfdWMpOworCQltYXBfaGlnaCgiTU1JT0giLCBtbWlvaC5zLmJhc2UsIHNoaWZ0LCBtYXhfcG5vZGUsIG1hcF91Yyk7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCB1dl9ydGNfaW5pdCh2b2lkKQpAQCAtNDAxLDMgKzQ2NCw1IEBACiAJaWYgKGdldF91dl9zeXN0ZW1fdHlwZSgpID09IFVWX05PTl9VTklRVUVfQVBJQykKIAkJc2V0X3gyYXBpY19leHRyYV9iaXRzKHV2X2h1Yl9pbmZvLT5wbm9kZSk7CiB9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWQuYyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkLmMKaW5kZXggM2U2NmJkMy4uMWRjYjBmMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZC5jCkBAIC0zNSw2ICszNSw3IEBACiAKIAkvKiBzdGFydCBvZiBFQkRBIGFyZWEgKi8KIAllYmRhX2FkZHIgPSBnZXRfYmlvc19lYmRhKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQklPUyBFQkRBL2xvd21lbSBhdDogJTA4eC8lMDh4XG4iLCBlYmRhX2FkZHIsIGxvd21lbSk7CiAKIAkvKiBGaXh1cDogYmlvcyBwdXRzIGFuIEVCREEgaW4gdGhlIHRvcCA2NEsgc2VnbWVudCAqLwogCS8qIG9mIGNvbnZlbnRpb25hbCBtZW1vcnksIGJ1dCBkb2VzIG5vdCBhZGp1c3QgbG93bWVtLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jIGIvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jCmluZGV4IDliZmM0ZDcuLmQxNjA4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9oZWFkNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZDY0LmMKQEAgLTEwOCwxMiArMTA4LDExIEBACiAJfQogCWxvYWRfaWR0KChjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKikmaWR0X2Rlc2NyKTsKIAotCWVhcmx5X3ByaW50aygiS2VybmVsIGFsaXZlXG4iKTsKKwlpZiAoY29uc29sZV9sb2dsZXZlbCA9PSAxMCkKKwkJZWFybHlfcHJpbnRrKCJLZXJuZWwgYWxpdmVcbiIpOwogCiAJeDg2XzY0X2luaXRfcGRhKCk7CiAKLQllYXJseV9wcmludGsoIktlcm5lbCByZWFsbHkgYWxpdmVcbiIpOwotCiAJeDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucyhyZWFsX21vZGVfZGF0YSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCmluZGV4IGE3MDEwYzMuLmU4MzViNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwpAQCAtMTcyLDEwICsxNzIsNiBAQAogICoKICAqIE5vdGUgdGhhdCB0aGUgc3RhY2sgaXMgbm90IHlldCBzZXQgdXAhCiAgKi8KLSNkZWZpbmUgUFRFX0FUVFIJMHgwMDcJCS8qIFBSRVNFTlQrUlcrVVNFUiAqLwotI2RlZmluZSBQREVfQVRUUgkweDA2NwkJLyogUFJFU0VOVCtSVytVU0VSK0RJUlRZK0FDQ0VTU0VEICovCi0jZGVmaW5lIFBHRF9BVFRSCTB4MDAxCQkvKiBQUkVTRU5UIChubyBvdGhlciBhdHRyaWJ1dGVzKSAqLwotCiBkZWZhdWx0X2VudHJ5OgogI2lmZGVmIENPTkZJR19YODZfUEFFCiAKQEAgLTE5Niw5ICsxOTIsOSBAQAogCW1vdmwgJHBhKHBnMCksICVlZGkKIAltb3ZsICVlZGksIHBhKGluaXRfcGdfdGFibGVzX3N0YXJ0KQogCW1vdmwgJHBhKHN3YXBwZXJfcGdfcG1kKSwgJWVkeAotCW1vdmwgJFBURV9BVFRSLCAlZWF4CisJbW92bCAkUFRFX0lERU5UX0FUVFIsICVlYXgKIDEwOgotCWxlYWwgUERFX0FUVFIoJWVkaSksJWVjeAkJLyogQ3JlYXRlIFBNRCBlbnRyeSAqLworCWxlYWwgUERFX0lERU5UX0FUVFIoJWVkaSksJWVjeAkJLyogQ3JlYXRlIFBNRCBlbnRyeSAqLwogCW1vdmwgJWVjeCwoJWVkeCkJCQkvKiBTdG9yZSBQTUQgZW50cnkgKi8KIAkJCQkJCS8qIFVwcGVyIGhhbGYgYWxyZWFkeSB6ZXJvICovCiAJYWRkbCAkOCwlZWR4CkBAIC0yMTUsNyArMjExLDcgQEAKIAkgKiBFbmQgY29uZGl0aW9uOiB3ZSBtdXN0IG1hcCB1cCB0byBhbmQgaW5jbHVkaW5nIElOSVRfTUFQX0JFWU9ORF9FTkQKIAkgKiBieXRlcyBiZXlvbmQgdGhlIGVuZCBvZiBvdXIgb3duIHBhZ2UgdGFibGVzLgogCSAqLwotCWxlYWwgKElOSVRfTUFQX0JFWU9ORF9FTkQrUFRFX0FUVFIpKCVlZGkpLCVlYnAKKwlsZWFsIChJTklUX01BUF9CRVlPTkRfRU5EK1BURV9JREVOVF9BVFRSKSglZWRpKSwlZWJwCiAJY21wbCAlZWJwLCVlYXgKIAlqYiAxMGIKIDE6CkBAIC0yMjQsNyArMjIwLDcgQEAKIAltb3ZsICVlYXgsIHBhKG1heF9wZm5fbWFwcGVkKQogCiAJLyogRG8gZWFybHkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZpeG1hcCBhcmVhICovCi0JbW92bCAkcGEoc3dhcHBlcl9wZ19maXhtYXApK1BERV9BVFRSLCVlYXgKKwltb3ZsICRwYShzd2FwcGVyX3BnX2ZpeG1hcCkrUERFX0lERU5UX0FUVFIsJWVheAogCW1vdmwgJWVheCxwYShzd2FwcGVyX3BnX3BtZCsweDEwMDAqS1BNRFMtOCkKICNlbHNlCS8qIE5vdCBQQUUgKi8KIApAQCAtMjMzLDkgKzIyOSw5IEBACiAJbW92bCAkcGEocGcwKSwgJWVkaQogCW1vdmwgJWVkaSwgcGEoaW5pdF9wZ190YWJsZXNfc3RhcnQpCiAJbW92bCAkcGEoc3dhcHBlcl9wZ19kaXIpLCAlZWR4Ci0JbW92bCAkUFRFX0FUVFIsICVlYXgKKwltb3ZsICRQVEVfSURFTlRfQVRUUiwgJWVheAogMTA6Ci0JbGVhbCBQREVfQVRUUiglZWRpKSwlZWN4CQkvKiBDcmVhdGUgUERFIGVudHJ5ICovCisJbGVhbCBQREVfSURFTlRfQVRUUiglZWRpKSwlZWN4CQkvKiBDcmVhdGUgUERFIGVudHJ5ICovCiAJbW92bCAlZWN4LCglZWR4KQkJCS8qIFN0b3JlIGlkZW50aXR5IFBERSBlbnRyeSAqLwogCW1vdmwgJWVjeCxwYWdlX3BkZV9vZmZzZXQoJWVkeCkJCS8qIFN0b3JlIGtlcm5lbCBQREUgZW50cnkgKi8KIAlhZGRsICQ0LCVlZHgKQEAgLTI0OSw3ICsyNDUsNyBAQAogCSAqIGJ5dGVzIGJleW9uZCB0aGUgZW5kIG9mIG91ciBvd24gcGFnZSB0YWJsZXM7IHRoZSArMHgwMDcgaXMKIAkgKiB0aGUgYXR0cmlidXRlIGJpdHMKIAkgKi8KLQlsZWFsIChJTklUX01BUF9CRVlPTkRfRU5EK1BURV9BVFRSKSglZWRpKSwlZWJwCisJbGVhbCAoSU5JVF9NQVBfQkVZT05EX0VORCtQVEVfSURFTlRfQVRUUikoJWVkaSksJWVicAogCWNtcGwgJWVicCwlZWF4CiAJamIgMTBiCiAJbW92bCAlZWRpLHBhKGluaXRfcGdfdGFibGVzX2VuZCkKQEAgLTI1Nyw3ICsyNTMsNyBAQAogCW1vdmwgJWVheCwgcGEobWF4X3Bmbl9tYXBwZWQpCiAKIAkvKiBEbyBlYXJseSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZml4bWFwIGFyZWEgKi8KLQltb3ZsICRwYShzd2FwcGVyX3BnX2ZpeG1hcCkrUERFX0FUVFIsJWVheAorCW1vdmwgJHBhKHN3YXBwZXJfcGdfZml4bWFwKStQREVfSURFTlRfQVRUUiwlZWF4CiAJbW92bCAlZWF4LHBhKHN3YXBwZXJfcGdfZGlyKzB4ZmZjKQogI2VuZGlmCiAJam1wIDNmCkBAIC02MzQsMTkgKzYzMCwxOSBAQAogCS8qIFBhZ2UtYWxpZ25lZCBmb3IgdGhlIGJlbmVmaXQgb2YgcGFyYXZpcnQ/ICovCiAJLmFsaWduIFBBR0VfU0laRV9hc20KIEVOVFJZKHN3YXBwZXJfcGdfZGlyKQotCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9BVFRSKSwwCQkvKiBsb3cgaWRlbnRpdHkgbWFwICovCisJLmxvbmcJcGEoc3dhcHBlcl9wZ19wbWQrUEdEX0lERU5UX0FUVFIpLDAJLyogbG93IGlkZW50aXR5IG1hcCAqLwogIyBpZiBLUE1EUyA9PSAzCi0JLmxvbmcJcGEoc3dhcHBlcl9wZ19wbWQrUEdEX0FUVFIpLDAKLQkubG9uZwlwYShzd2FwcGVyX3BnX3BtZCtQR0RfQVRUUisweDEwMDApLDAKLQkubG9uZwlwYShzd2FwcGVyX3BnX3BtZCtQR0RfQVRUUisweDIwMDApLDAKKwkubG9uZwlwYShzd2FwcGVyX3BnX3BtZCtQR0RfSURFTlRfQVRUUiksMAorCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9JREVOVF9BVFRSKzB4MTAwMCksMAorCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9JREVOVF9BVFRSKzB4MjAwMCksMAogIyBlbGlmIEtQTURTID09IDIKIAkubG9uZwkwLDAKLQkubG9uZwlwYShzd2FwcGVyX3BnX3BtZCtQR0RfQVRUUiksMAotCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9BVFRSKzB4MTAwMCksMAorCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9JREVOVF9BVFRSKSwwCisJLmxvbmcJcGEoc3dhcHBlcl9wZ19wbWQrUEdEX0lERU5UX0FUVFIrMHgxMDAwKSwwCiAjIGVsaWYgS1BNRFMgPT0gMQogCS5sb25nCTAsMAogCS5sb25nCTAsMAotCS5sb25nCXBhKHN3YXBwZXJfcGdfcG1kK1BHRF9BVFRSKSwwCisJLmxvbmcJcGEoc3dhcHBlcl9wZ19wbWQrUEdEX0lERU5UX0FUVFIpLDAKICMgZWxzZQogIyAgZXJyb3IgIktlcm5lbCBQTURzIHNob3VsZCBiZSAxLCAyIG9yIDMiCiAjIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUwppbmRleCBkYjMyODBhLi4yNmNmZGMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKQEAgLTExMCw3ICsxMTAsNyBAQAogCW1vdnEJJXJkaSwgJXJheAogCXNocnEJJFBNRF9TSElGVCwgJXJheAogCWFuZHEJJChQVFJTX1BFUl9QTUQgLSAxKSwgJXJheAotCWxlYXEJX19QQUdFX0tFUk5FTF9MQVJHRV9FWEVDKCVyZGkpLCAlcmR4CisJbGVhcQlfX1BBR0VfS0VSTkVMX0lERU5UX0xBUkdFX0VYRUMoJXJkaSksICVyZHgKIAlsZWFxCWxldmVsMl9zcGFyZV9wZ3QoJXJpcCksICVyYngKIAltb3ZxCSVyZHgsIDAoJXJieCwgJXJheCwgOCkKIGlkZW50X2NvbXBsZXRlOgpAQCAtMzc0LDcgKzM3NCw3IEBACiAJLyogU2luY2UgSSBlYXNpbHkgY2FuLCBtYXAgdGhlIGZpcnN0IDFHLgogCSAqIERvbid0IHNldCBOWCBiZWNhdXNlIGNvZGUgcnVucyBmcm9tIHRoZXNlIHBhZ2VzLgogCSAqLwotCVBNRFMoMCwgX19QQUdFX0tFUk5FTF9MQVJHRV9FWEVDLCBQVFJTX1BFUl9QTUQpCisJUE1EUygwLCBfX1BBR0VfS0VSTkVMX0lERU5UX0xBUkdFX0VYRUMsIFBUUlNfUEVSX1BNRCkKIAogTkVYVF9QQUdFKGxldmVsMl9rZXJuZWxfcGd0KQogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwppbmRleCA1OWZkM2I2Li5hY2Y2MmZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKQEAgLTExNSwxMyArMTE1LDE3IEBACiAJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOwogCWhkLmhkX2FkZHJlc3MgPSBocGV0OwogCWhkLmhkX25pcnFzID0gbnJ0aW1lcnM7Ci0JaGQuaGRfZmxhZ3MgPSBIUEVUX0RBVEFfUExBVEZPUk07CiAJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7CiAKICNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwogCWhwZXRfcmVzZXJ2ZV90aW1lcigmaGQsIDEpOwogI2VuZGlmCiAKKwkvKgorCSAqIE5PVEUgdGhhdCBoZF9pcnFbXSByZWZsZWN0cyBJT0FQSUMgaW5wdXQgcGlucyAoTEVHQUNZXzgyNTQKKwkgKiBpcyB3cm9uZyBmb3IgaTgyNTkhKSBub3QgdGhlIG91dHB1dCBJUlEuICBNYW55IEJJT1Mgd3JpdGVycworCSAqIGRvbid0IGJvdGhlciBjb25maWd1cmluZyAqYW55KiBjb21wYXJhdG9yIGludGVycnVwdHMuCisJICovCiAJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKIAloZC5oZF9pcnFbMV0gPSBIUEVUX0xFR0FDWV9SVEM7CiAKQEAgLTIxMCw4ICsyMTQsOCBAQAogCS8qIENhbGN1bGF0ZSB0aGUgbWluIC8gbWF4IGRlbHRhICovCiAJaHBldF9jbG9ja2V2ZW50Lm1heF9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHg3RkZGRkZGRiwKIAkJCQkJCQkgICAmaHBldF9jbG9ja2V2ZW50KTsKLQlocGV0X2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweDMwLAotCQkJCQkJCSAgICZocGV0X2Nsb2NrZXZlbnQpOworCS8qIDUgdXNlYyBtaW5pbXVtIHJlcHJvZ3JhbW1pbmcgZGVsdGEuICovCisJaHBldF9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9IDUwMDA7CiAKIAkvKgogCSAqIFN0YXJ0IGhwZXQgd2l0aCB0aGUgYm9vdCBjcHUgbWFzayBhbmQgbWFrZSBpdApAQCAtMjcwLDE1ICsyNzQsMjIgQEAKIH0KIAogc3RhdGljIGludCBocGV0X2xlZ2FjeV9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCi0JCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjbnQ7CisJdTMyIGNudDsKIAogCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQljbnQgKz0gZGVsdGE7CisJY250ICs9ICh1MzIpIGRlbHRhOwogCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMF9DTVApOwogCi0JcmV0dXJuICgobG9uZykoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gY250ICkgPiAwKSA/IC1FVElNRSA6IDA7CisJLyoKKwkgKiBXZSBuZWVkIHRvIHJlYWQgYmFjayB0aGUgQ01QIHJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSB0aGF0CisJICogd2hhdCB3ZSB3cm90ZSBoaXQgdGhlIGNoaXAgYmVmb3JlIHdlIGNvbXBhcmUgaXQgdG8gdGhlCisJICogY291bnRlci4KKwkgKi8KKwlXQVJOX09OKCh1MzIpaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgIT0gY250KTsKKworCXJldHVybiAoczMyKSgodTMyKWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSAtIGNudCkgPj0gMCA/IC1FVElNRSA6IDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODYva2VybmVsL2kzODcuYwppbmRleCBlYjlkZGQ4Li4xZjIwNjA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMKQEAgLTIxLDkgKzIxLDEyIEBACiAjIGluY2x1ZGUgPGFzbS9zaWdjb250ZXh0MzIuaD4KICMgaW5jbHVkZSA8YXNtL3VzZXIzMi5oPgogI2Vsc2UKLSMgZGVmaW5lIHNhdmVfaTM4N19pYTMyCQlzYXZlX2kzODcKLSMgZGVmaW5lIHJlc3RvcmVfaTM4N19pYTMyCXJlc3RvcmVfaTM4NworIyBkZWZpbmUgc2F2ZV9pMzg3X3hzdGF0ZV9pYTMyCQlzYXZlX2kzODdfeHN0YXRlCisjIGRlZmluZSByZXN0b3JlX2kzODdfeHN0YXRlX2lhMzIJcmVzdG9yZV9pMzg3X3hzdGF0ZQogIyBkZWZpbmUgX2Zwc3RhdGVfaWEzMgkJX2Zwc3RhdGUKKyMgZGVmaW5lIF94c3RhdGVfaWEzMgkJX3hzdGF0ZQorIyBkZWZpbmUgc2lnX3hzdGF0ZV9pYTMyX3NpemUgICBzaWdfeHN0YXRlX3NpemUKKyMgZGVmaW5lIGZ4X3N3X3Jlc2VydmVkX2lhMzIJZnhfc3dfcmVzZXJ2ZWQKICMgZGVmaW5lIHVzZXJfaTM4N19pYTMyX3N0cnVjdAl1c2VyX2kzODdfc3RydWN0CiAjIGRlZmluZSB1c2VyMzJfZnhzcl9zdHJ1Y3QJdXNlcl9meHNyX3N0cnVjdAogI2VuZGlmCkBAIC0zNiw2ICszOSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQJCW14Y3NyX2ZlYXR1cmVfbWFzayBfX3JlYWRfbW9zdGx5ID0gMHhmZmZmZmZmZnU7CiB1bnNpZ25lZCBpbnQgeHN0YXRlX3NpemU7Cit1bnNpZ25lZCBpbnQgc2lnX3hzdGF0ZV9pYTMyX3NpemUgPSBzaXplb2Yoc3RydWN0IF9mcHN0YXRlX2lhMzIpOwogc3RhdGljIHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgZnhfc2NyYXRjaCBfX2NwdWluaXRkYXRhOwogCiB2b2lkIF9fY3B1aW5pdCBteGNzcl9mZWF0dXJlX21hc2tfaW5pdCh2b2lkKQpAQCAtNjEsNiArNjUsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChjcHVfaGFzX3hzYXZlKSB7CisJCXhzYXZlX2NudHh0X2luaXQoKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChjcHVfaGFzX2Z4c3IpCiAJCXhzdGF0ZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpOwogI2lmZGVmIENPTkZJR19YODZfMzIKQEAgLTgzLDkgKzkyLDE5IEBACiAKIAl3cml0ZV9jcjAob2xkY3IwICYgfihYODZfQ1IwX1RTfFg4Nl9DUjBfRU0pKTsgLyogY2xlYXIgVFMgYW5kIEVNICovCiAKKwkvKgorCSAqIEJvb3QgcHJvY2Vzc29yIHRvIHNldHVwIHRoZSBGUCBhbmQgZXh0ZW5kZWQgc3RhdGUgY29udGV4dCBpbmZvLgorCSAqLworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlpbml0X3RocmVhZF94c3RhdGUoKTsKKwl4c2F2ZV9pbml0KCk7CisKIAlteGNzcl9mZWF0dXJlX21hc2tfaW5pdCgpOwogCS8qIGNsZWFuIHN0YXRlIGluIGluaXQgKi8KLQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CisJaWYgKGNwdV9oYXNfeHNhdmUpCisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzID0gVFNfWFNBVkU7CisJZWxzZQorCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CiAJY2xlYXJfdXNlZF9tYXRoKCk7CiB9CiAjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwpAQCAtMTk1LDYgKzIxNCwxMyBAQAogCSAqLwogCXRhcmdldC0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlLm14Y3NyICY9IG14Y3NyX2ZlYXR1cmVfbWFzazsKIAorCS8qCisJICogdXBkYXRlIHRoZSBoZWFkZXIgYml0cyBpbiB0aGUgeHNhdmUgaGVhZGVyLCBpbmRpY2F0aW5nIHRoZQorCSAqIHByZXNlbmNlIG9mIEZQIGFuZCBTU0Ugc3RhdGUuCisJICovCisJaWYgKGNwdV9oYXNfeHNhdmUpCisJCXRhcmdldC0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUueHNhdmVfaGRyLnhzdGF0ZV9idiB8PSBYU1RBVEVfRlBTU0U7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zOTUsNiArNDIxLDEyIEBACiAJaWYgKCFyZXQpCiAJCWNvbnZlcnRfdG9fZnhzcih0YXJnZXQsICZlbnYpOwogCisJLyoKKwkgKiB1cGRhdGUgdGhlIGhlYWRlciBiaXQgaW4gdGhlIHhzYXZlIGhlYWRlciwgaW5kaWNhdGluZyB0aGUKKwkgKiBwcmVzZW5jZSBvZiBGUC4KKwkgKi8KKwlpZiAoY3B1X2hhc194c2F2ZSkKKwkJdGFyZ2V0LT50aHJlYWQueHN0YXRlLT54c2F2ZS54c2F2ZV9oZHIueHN0YXRlX2J2IHw9IFhTVEFURV9GUDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MDcsNyArNDM5LDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IGkzODdfZnNhdmVfc3RydWN0ICpmcCA9ICZ0c2stPnRocmVhZC54c3RhdGUtPmZzYXZlOwogCi0JdW5sYXp5X2ZwdSh0c2spOwogCWZwLT5zdGF0dXMgPSBmcC0+c3dkOwogCWlmIChfX2NvcHlfdG9fdXNlcihidWYsIGZwLCBzaXplb2Yoc3RydWN0IGkzODdfZnNhdmVfc3RydWN0KSkpCiAJCXJldHVybiAtMTsKQEAgLTQyMSw4ICs0NTIsNiBAQAogCXN0cnVjdCB1c2VyX2kzODdfaWEzMl9zdHJ1Y3QgZW52OwogCWludCBlcnIgPSAwOwogCi0JdW5sYXp5X2ZwdSh0c2spOwotCiAJY29udmVydF9mcm9tX2Z4c3IoJmVudiwgdHNrKTsKIAlpZiAoX19jb3B5X3RvX3VzZXIoYnVmLCAmZW52LCBzaXplb2YoZW52KSkpCiAJCXJldHVybiAtMTsKQEAgLTQzMiwxNiArNDYxLDU0IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC0xOwogCi0JaWYgKF9fY29weV90b191c2VyKCZidWYtPl9meHNyX2VudlswXSwgZngsCi0JCQkgICBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkpKQorCWlmIChfX2NvcHlfdG9fdXNlcigmYnVmLT5fZnhzcl9lbnZbMF0sIGZ4LCB4c3RhdGVfc2l6ZSkpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gMTsKIH0KIAotaW50IHNhdmVfaTM4N19pYTMyKHN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqYnVmKQorc3RhdGljIGludCBzYXZlX2kzODdfeHNhdmUodm9pZCBfX3VzZXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IF9mcHN0YXRlX2lhMzIgX191c2VyICpmeCA9IGJ1ZjsKKwlpbnQgZXJyID0gMDsKKworCS8qCisJICogRm9yIGxlZ2FjeSBjb21wYXRpYmxlLCB3ZSBhbHdheXMgc2V0IEZQL1NTRSBiaXRzIGluIHRoZSBiaXQKKwkgKiB2ZWN0b3Igd2hpbGUgc2F2aW5nIHRoZSBzdGF0ZSB0byB0aGUgdXNlciBjb250ZXh0LgorCSAqIFRoaXMgd2lsbCBlbmFibGUgdXMgY2FwdHVyaW5nIGFueSBjaGFuZ2VzKGR1cmluZyBzaWdyZXR1cm4pIHRvCisJICogdGhlIEZQL1NTRSBiaXRzIGJ5IHRoZSBsZWdhY3kgYXBwbGljYXRpb25zIHdoaWNoIGRvbid0IHRvdWNoCisJICogeHN0YXRlX2J2IGluIHRoZSB4c2F2ZSBoZWFkZXIuCisJICoKKwkgKiB4c2F2ZSBhd2FyZSBhcHBsaWNhdGlvbnMgY2FuIGNoYW5nZSB0aGUgeHN0YXRlX2J2IGluIHRoZSB4c2F2ZQorCSAqIGhlYWRlciBhcyB3ZWxsIGFzIGNoYW5nZSBhbnkgY29udGVudHMgaW4gdGhlIG1lbW9yeSBsYXlvdXQuCisJICogeHJlc3RvcmUgYXMgcGFydCBvZiBzaWdyZXR1cm4gd2lsbCBjYXB0dXJlIGFsbCB0aGUgY2hhbmdlcy4KKwkgKi8KKwl0c2stPnRocmVhZC54c3RhdGUtPnhzYXZlLnhzYXZlX2hkci54c3RhdGVfYnYgfD0gWFNUQVRFX0ZQU1NFOworCisJaWYgKHNhdmVfaTM4N19meHNhdmUoZngpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJZXJyID0gX19jb3B5X3RvX3VzZXIoJmZ4LT5zd19yZXNlcnZlZCwgJmZ4X3N3X3Jlc2VydmVkX2lhMzIsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgX2ZweF9zd19ieXRlcykpOworCWVyciB8PSBfX3B1dF91c2VyKEZQX1hTVEFURV9NQUdJQzIsCisJCQkgIChfX3UzMiBfX3VzZXIgKikgKGJ1ZiArIHNpZ194c3RhdGVfaWEzMl9zaXplCisJCQkJCSAgICAtIEZQX1hTVEFURV9NQUdJQzJfU0laRSkpOworCWlmIChlcnIpCisJCXJldHVybiAtMTsKKworCXJldHVybiAxOworfQorCitpbnQgc2F2ZV9pMzg3X3hzdGF0ZV9pYTMyKHZvaWQgX191c2VyICpidWYpCit7CisJc3RydWN0IF9mcHN0YXRlX2lhMzIgX191c2VyICpmcCA9IChzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBfX3VzZXIgKikgYnVmOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwogCWlmICghdXNlZF9tYXRoKCkpCiAJCXJldHVybiAwOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIHNpZ194c3RhdGVfaWEzMl9zaXplKSkKKwkJcmV0dXJuIC1FQUNDRVM7CiAJLyoKIAkgKiBUaGlzIHdpbGwgY2F1c2UgYSAiZmluaXQiIHRvIGJlIHRyaWdnZXJlZCBieSB0aGUgbmV4dAogCSAqIGF0dGVtcHRlZCBGUFUgb3BlcmF0aW9uIGJ5IHRoZSAnY3VycmVudCcgcHJvY2Vzcy4KQEAgLTQ1MSwxMyArNTE4LDE3IEBACiAJaWYgKCFIQVZFX0hXRlApIHsKIAkJcmV0dXJuIGZwcmVnc19zb2Z0X2dldChjdXJyZW50LCBOVUxMLAogCQkJCSAgICAgICAwLCBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19pYTMyX3N0cnVjdCksCi0JCQkJICAgICAgIE5VTEwsIGJ1ZikgPyAtMSA6IDE7CisJCQkJICAgICAgIE5VTEwsIGZwKSA/IC0xIDogMTsKIAl9CiAKKwl1bmxhenlfZnB1KHRzayk7CisKKwlpZiAoY3B1X2hhc194c2F2ZSkKKwkJcmV0dXJuIHNhdmVfaTM4N194c2F2ZShmcCk7CiAJaWYgKGNwdV9oYXNfZnhzcikKLQkJcmV0dXJuIHNhdmVfaTM4N19meHNhdmUoYnVmKTsKKwkJcmV0dXJuIHNhdmVfaTM4N19meHNhdmUoZnApOwogCWVsc2UKLQkJcmV0dXJuIHNhdmVfaTM4N19mc2F2ZShidWYpOworCQlyZXR1cm4gc2F2ZV9pMzg3X2ZzYXZlKGZwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9pMzg3X2ZzYXZlKHN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqYnVmKQpAQCAtNDY4LDE0ICs1MzksMTUgQEAKIAkJCQlzaXplb2Yoc3RydWN0IGkzODdfZnNhdmVfc3RydWN0KSk7CiB9CiAKLXN0YXRpYyBpbnQgcmVzdG9yZV9pMzg3X2Z4c2F2ZShzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBfX3VzZXIgKmJ1ZikKK3N0YXRpYyBpbnQgcmVzdG9yZV9pMzg3X2Z4c2F2ZShzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IHVzZXJfaTM4N19pYTMyX3N0cnVjdCBlbnY7CiAJaW50IGVycjsKIAogCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlLCAmYnVmLT5fZnhzcl9lbnZbMF0sCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKKwkJCSAgICAgICBzaXplKTsKIAkvKiBteGNzciByZXNlcnZlZCBiaXRzIG11c3QgYmUgbWFza2VkIHRvIHplcm8gZm9yIHNlY3VyaXR5IHJlYXNvbnMgKi8KIAl0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZS5teGNzciAmPSBteGNzcl9mZWF0dXJlX21hc2s7CiAJaWYgKGVyciB8fCBfX2NvcHlfZnJvbV91c2VyKCZlbnYsIGJ1Ziwgc2l6ZW9mKGVudikpKQpAQCAtNDg1LDE0ICs1NTcsNjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlc3RvcmVfaTM4N19pYTMyKHN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqYnVmKQorc3RhdGljIGludCByZXN0b3JlX2kzODdfeHNhdmUodm9pZCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBmeF9zd191c2VyOworCXN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqZnhfdXNlciA9CisJCQkoKHN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqKSBidWYpOworCXN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgX191c2VyICpmeCA9CisJCShzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0IF9fdXNlciAqKSAmZnhfdXNlci0+X2Z4c3JfZW52WzBdOworCXN0cnVjdCB4c2F2ZV9oZHJfc3RydWN0ICp4c2F2ZV9oZHIgPQorCQkJCSZjdXJyZW50LT50aHJlYWQueHN0YXRlLT54c2F2ZS54c2F2ZV9oZHI7CisJdTY0IG1hc2s7CisJaW50IGVycjsKKworCWlmIChjaGVja19mb3JfeHN0YXRlKGZ4LCBidWYsICZmeF9zd191c2VyKSkKKwkJZ290byBmeF9vbmx5OworCisJbWFzayA9IGZ4X3N3X3VzZXIueHN0YXRlX2J2OworCisJZXJyID0gcmVzdG9yZV9pMzg3X2Z4c2F2ZShidWYsIGZ4X3N3X3VzZXIueHN0YXRlX3NpemUpOworCisJeHNhdmVfaGRyLT54c3RhdGVfYnYgJj0gcGNudHh0X21hc2s7CisJLyoKKwkgKiBUaGVzZSBiaXRzIG11c3QgYmUgemVyby4KKwkgKi8KKwl4c2F2ZV9oZHItPnJlc2VydmVkMVswXSA9IHhzYXZlX2hkci0+cmVzZXJ2ZWQxWzFdID0gMDsKKworCS8qCisJICogSW5pdCB0aGUgc3RhdGUgdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVtb3J5IGxheW91dAorCSAqIGFuZCBlbmFibGVkIGJ5IHRoZSBPUy4KKwkgKi8KKwltYXNrID0gfihwY250eHRfbWFzayAmIH5tYXNrKTsKKwl4c2F2ZV9oZHItPnhzdGF0ZV9idiAmPSBtYXNrOworCisJcmV0dXJuIGVycjsKK2Z4X29ubHk6CisJLyoKKwkgKiBDb3VsZG4ndCBmaW5kIHRoZSBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWVtb3J5CisJICogbGF5b3V0LiBSZXN0b3JlIHRoZSBGUC9TU0UgYW5kIGluaXQgdGhlIG90aGVyIGV4dGVuZGVkIHN0YXRlCisJICogZW5hYmxlZCBieSB0aGUgT1MuCisJICovCisJeHNhdmVfaGRyLT54c3RhdGVfYnYgPSBYU1RBVEVfRlBTU0U7CisJcmV0dXJuIHJlc3RvcmVfaTM4N19meHNhdmUoYnVmLCBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkpOworfQorCitpbnQgcmVzdG9yZV9pMzg3X3hzdGF0ZV9pYTMyKHZvaWQgX191c2VyICpidWYpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IF9mcHN0YXRlX2lhMzIgX191c2VyICpmcCA9IChzdHJ1Y3QgX2Zwc3RhdGVfaWEzMiBfX3VzZXIgKikgYnVmOwogCiAJaWYgKEhBVkVfSFdGUCkKIAkJY2xlYXJfZnB1KHRzayk7CiAKKwlpZiAoIWJ1ZikgeworCQlpZiAodXNlZF9tYXRoKCkpIHsKKwkJCWNsZWFyX2ZwdSh0c2spOworCQkJY2xlYXJfdXNlZF9tYXRoKCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1Ziwgc2lnX3hzdGF0ZV9pYTMyX3NpemUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAoIXVzZWRfbWF0aCgpKSB7CiAJCWVyciA9IGluaXRfZnB1KHRzayk7CiAJCWlmIChlcnIpCkBAIC01MDAsMTQgKzYyNywxNyBAQAogCX0KIAogCWlmIChIQVZFX0hXRlApIHsKLQkJaWYgKGNwdV9oYXNfZnhzcikKLQkJCWVyciA9IHJlc3RvcmVfaTM4N19meHNhdmUoYnVmKTsKKwkJaWYgKGNwdV9oYXNfeHNhdmUpCisJCQllcnIgPSByZXN0b3JlX2kzODdfeHNhdmUoYnVmKTsKKwkJZWxzZSBpZiAoY3B1X2hhc19meHNyKQorCQkJZXJyID0gcmVzdG9yZV9pMzg3X2Z4c2F2ZShmcCwgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgIGkzODdfZnhzYXZlX3N0cnVjdCkpOwogCQllbHNlCi0JCQllcnIgPSByZXN0b3JlX2kzODdfZnNhdmUoYnVmKTsKKwkJCWVyciA9IHJlc3RvcmVfaTM4N19mc2F2ZShmcCk7CiAJfSBlbHNlIHsKIAkJZXJyID0gZnByZWdzX3NvZnRfc2V0KGN1cnJlbnQsIE5VTEwsCiAJCQkJICAgICAgMCwgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfaWEzMl9zdHJ1Y3QpLAotCQkJCSAgICAgIE5VTEwsIGJ1ZikgIT0gMDsKKwkJCQkgICAgICBOVUxMLCBmcCkgIT0gMDsKIAl9CiAJc2V0X3VzZWRfbWF0aCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gveDg2L2tlcm5lbC9pODI1OS5jCmluZGV4IGRjOTJiNDkuLjRiOGE1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pODI1OS5jCkBAIC0yODIsNiArMjgyLDMwIEBACiAKIGRldmljZV9pbml0Y2FsbChpODI1OUFfaW5pdF9zeXNmcyk7CiAKK3ZvaWQgbWFza184MjU5QSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCW91dGIoMHhmZiwgUElDX01BU1RFUl9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCisJb3V0YigweGZmLCBQSUNfU0xBVkVfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMiAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCB1bm1hc2tfODI1OUEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOyAvKiByZXN0b3JlIG1hc3RlciBJUlEgbWFzayAqLworCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIFBJQ19TTEFWRV9JTVIpOwkgIC8qIHJlc3RvcmUgc2xhdmUgSVJRIG1hc2sgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Cit9CisKIHZvaWQgaW5pdF84MjU5QShpbnQgYXV0b19lb2kpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaW9fYXBpY18zMi5jCmluZGV4IDA5Y2RkYjUuLmU3MTAyODkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lvX2FwaWNfMzIuYwpAQCAtNDYsMTAgKzQ2LDEzIEBACiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9tc2lkZWYuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ0cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogI2luY2x1ZGUgPG1hY2hfYXBpY2RlZi5oPgogCisjZGVmaW5lIF9fYXBpY2RlYnVnaW5pdCh0eXBlKSBzdGF0aWMgdHlwZSBfX2luaXQKKwogaW50ICgqaW9hcGljX3JlbnVtYmVyX2lycSkoaW50IGlvYXBpYywgaW50IGlycSk7CiBhdG9taWNfdCBpcnFfbWlzX2NvdW50OwogCkBAIC0xMzQxLDcgKzEzNDQsOCBAQAogCWlvYXBpY193cml0ZV9lbnRyeShhcGljLCBwaW4sIGVudHJ5KTsKIH0KIAotdm9pZCBfX2luaXQgcHJpbnRfSU9fQVBJQyh2b2lkKQorCitfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfSU9fQVBJQyh2b2lkKQogewogCWludCBhcGljLCBpOwogCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKQEAgLTE0NTYsOSArMTQ2MCw3IEBACiAJcmV0dXJuOwogfQogCi0jaWYgMAotCi1zdGF0aWMgdm9pZCBwcmludF9BUElDX2JpdGZpZWxkKGludCBiYXNlKQorX19hcGljZGVidWdpbml0KHZvaWQpIHByaW50X0FQSUNfYml0ZmllbGQoaW50IGJhc2UpCiB7CiAJdW5zaWduZWQgaW50IHY7CiAJaW50IGksIGo7CkBAIC0xNDc5LDkgKzE0ODEsMTAgQEAKIAl9CiB9CiAKLXZvaWQgLypfX2luaXQqLyBwcmludF9sb2NhbF9BUElDKHZvaWQgKmR1bW15KQorX19hcGljZGVidWdpbml0KHZvaWQpIHByaW50X2xvY2FsX0FQSUModm9pZCAqZHVtbXkpCiB7CiAJdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCXU2NCBpY3I7CiAKIAlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKIAkJcmV0dXJuOwpAQCAtMTQ5MCw3ICsxNDkzLDcgQEAKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJdiA9IGFwaWNfcmVhZChBUElDX0lEKTsKIAlwcmludGsoS0VSTl9JTkZPICIuLi4gQVBJQyBJRDogICAgICAlMDh4ICglMDF4KVxuIiwgdiwKLQkJCUdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKSk7CisJCQlHRVRfQVBJQ19JRCh2KSk7CiAJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiLi4uIEFQSUMgVkVSU0lPTjogJTA4eFxuIiwgdik7CiAJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2KTsKQEAgLTE1MzIsMTAgKzE1MzUsOSBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgRVNSOiAlMDh4XG4iLCB2KTsKIAl9CiAKLQl2ID0gYXBpY19yZWFkKEFQSUNfSUNSKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCB2KTsKLQl2ID0gYXBpY19yZWFkKEFQSUNfSUNSMik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjI6ICUwOHhcbiIsIHYpOworCWljciA9IGFwaWNfaWNyX3JlYWQoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCBpY3IpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBJQ1IyOiAlMDh4XG4iLCBpY3IgPj4gMzIpOwogCiAJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlRUOiAlMDh4XG4iLCB2KTsKQEAgLTE1NjMsMTIgKzE1NjUsMTIgQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXZvaWQgcHJpbnRfYWxsX2xvY2FsX0FQSUNzKHZvaWQpCitfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfYWxsX2xvY2FsX0FQSUNzKHZvaWQpCiB7CiAJb25fZWFjaF9jcHUocHJpbnRfbG9jYWxfQVBJQywgTlVMTCwgMSk7CiB9CiAKLXZvaWQgLypfX2luaXQqLyBwcmludF9QSUModm9pZCkKK19fYXBpY2RlYnVnaW5pdCh2b2lkKSBwcmludF9QSUModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTYwMCw3ICsxNjAyLDE3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBQSUMgRUxDUjogJTA0eFxuIiwgdik7CiB9CiAKLSNlbmRpZiAgLyogIDAgICovCitfX2FwaWNkZWJ1Z2luaXQoaW50KSBwcmludF9hbGxfSUNzKHZvaWQpCit7CisJcHJpbnRfUElDKCk7CisJcHJpbnRfYWxsX2xvY2FsX0FQSUNzKCk7CisJcHJpbnRfSU9fQVBJQygpOworCisJcmV0dXJuIDA7Cit9CisKK2ZzX2luaXRjYWxsKHByaW50X2FsbF9JQ3MpOworCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfSU9fQVBJQyh2b2lkKQogewpAQCAtMTY5OCw4ICsxNzEwLDcgQEAKIAkJZW50cnkuZGVzdF9tb2RlICAgICAgID0gMDsgLyogUGh5c2ljYWwgKi8KIAkJZW50cnkuZGVsaXZlcnlfbW9kZSAgID0gZGVzdF9FeHRJTlQ7IC8qIEV4dEludCAqLwogCQllbnRyeS52ZWN0b3IgICAgICAgICAgPSAwOwotCQllbnRyeS5kZXN0LnBoeXNpY2FsLnBoeXNpY2FsX2Rlc3QgPQotCQkJCQlHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSk7CisJCWVudHJ5LmRlc3QucGh5c2ljYWwucGh5c2ljYWxfZGVzdCA9IHJlYWRfYXBpY19pZCgpOwogCiAJCS8qCiAJCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKQEAgLTE3MjUsMTAgKzE3MzYsOCBAQAogCXVuc2lnbmVkIGNoYXIgb2xkX2lkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JaWYgKGZvdW5kX251bWFxKQorCWlmICh4ODZfcXVpcmtzLT5zZXR1cF9pb2FwaWNfaWRzICYmIHg4Nl9xdWlya3MtPnNldHVwX2lvYXBpY19pZHMoKSkKIAkJcmV0dXJuOwotI2VuZGlmCiAKIAkvKgogCSAqIERvbid0IGNoZWNrIEkvTyBBUElDIElEcyBmb3IgeEFQSUMgc3lzdGVtcy4gIFRoZXkgaGF2ZQpAQCAtMjMyOSw4ICsyMzM4LDYgQEAKIAlzZXR1cF9JT19BUElDX2lycXMoKTsKIAlpbml0X0lPX0FQSUNfdHJhcHMoKTsKIAljaGVja190aW1lcigpOwotCWlmICghYWNwaV9pb2FwaWMpCi0JCXByaW50X0lPX0FQSUMoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaW9fYXBpY182NC5jCmluZGV4IDYxYTgzYjcuLjAyMDYzYWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pb19hcGljXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lvX2FwaWNfNjQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFyLmg+CiAKICNpbmNsdWRlIDxhc20vaWRsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDksMTAgKzUwLDEzIEBACiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9tc2lkZWYuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ0cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8bWFjaF9pcGkuaD4KICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KIAorI2RlZmluZSBfX2FwaWNkZWJ1Z2luaXQodHlwZSkgc3RhdGljIHR5cGUgX19pbml0CisKIHN0cnVjdCBpcnFfY2ZnIHsKIAljcHVtYXNrX3QgZG9tYWluOwogCWNwdW1hc2tfdCBvbGRfZG9tYWluOwpAQCAtODcsOCArOTEsNiBAQAogCiBjaGFyIHN5c3RlbV92ZWN0b3JzW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUy0xXSA9IFNZU19WRUNUT1JfRlJFRX07CiAKLSNkZWZpbmUgX19hcGljZGVidWdpbml0ICBfX2luaXQKLQogaW50IHNpc19hcGljX2J1ZzsgLyogbm90IGFjdHVhbGx5IHN1cHBvcnRlZCwgZHVtbXkgZm9yIGNvbXBpbGUgKi8KIAogc3RhdGljIGludCBub190aW1lcl9jaGVjazsKQEAgLTEwOCw2ICsxMTAsOSBAQAogICovCiBpbnQgbnJfaW9hcGljX3JlZ2lzdGVyc1tNQVhfSU9fQVBJQ1NdOwogCisvKiBJL08gQVBJQyBSVEUgY29udGVudHMgYXQgdGhlIE9TIGJvb3QgdXAgKi8KK3N0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplYXJseV9pb2FwaWNfZW50cmllc1tNQVhfSU9fQVBJQ1NdOworCiAvKiBJL08gQVBJQyBlbnRyaWVzICovCiBzdHJ1Y3QgbXBfY29uZmlnX2lvYXBpYyBtcF9pb2FwaWNzW01BWF9JT19BUElDU107CiBpbnQgbnJfaW9hcGljczsKQEAgLTMwMyw3ICszMDgsMTIgQEAKIAkJcGluID0gZW50cnktPnBpbjsKIAkJaWYgKHBpbiA9PSAtMSkKIAkJCWJyZWFrOwotCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyBwaW4qMiwgZGVzdCk7CisJCS8qCisJCSAqIFdpdGggaW50ZXJydXB0LXJlbWFwcGluZywgZGVzdGluYXRpb24gaW5mb3JtYXRpb24gY29tZXMKKwkJICogZnJvbSBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIGVudHJ5LgorCQkgKi8KKwkJaWYgKCFpcnFfcmVtYXBwZWQoaXJxKSkKKwkJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIHBpbioyLCBkZXN0KTsKIAkJcmVnID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAgKyBwaW4qMik7CiAJCXJlZyAmPSB+SU9fQVBJQ19SRURJUl9WRUNUT1JfTUFTSzsKIAkJcmVnIHw9IHZlY3RvcjsKQEAgLTQ0MCw2ICs0NTAsNjkgQEAKIAkJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7CiB9CiAKKy8qCisgKiBTYXZlcyBhbmQgbWFza3MgYWxsIHRoZSB1bm1hc2tlZCBJTy1BUElDIFJURSdzCisgKi8KK2ludCBzYXZlX21hc2tfSU9fQVBJQ19zZXR1cCh2b2lkKQoreworCXVuaW9uIElPX0FQSUNfcmVnXzAxIHJlZ18wMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBhcGljLCBwaW47CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgSU8tQVBJQyBJUlEgcmVnaXN0ZXJzICg9PSAjcGlucyk6CisJICovCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXSA9IHJlZ18wMS5iaXRzLmVudHJpZXMrMTsKKwl9CisKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisJCWVhcmx5X2lvYXBpY19lbnRyaWVzW2FwaWNdID0KKwkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5KSAqCisJCQkJbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZWFybHlfaW9hcGljX2VudHJpZXNbYXBpY10pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKQorCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbYXBpY107IHBpbisrKSB7CisJCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKworCQkJZW50cnkgPSBlYXJseV9pb2FwaWNfZW50cmllc1thcGljXVtwaW5dID0KKwkJCQlpb2FwaWNfcmVhZF9lbnRyeShhcGljLCBwaW4pOworCQkJaWYgKCFlbnRyeS5tYXNrKSB7CisJCQkJZW50cnkubWFzayA9IDE7CisJCQkJaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOworCQkJfQorCQl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzdG9yZV9JT19BUElDX3NldHVwKHZvaWQpCit7CisJaW50IGFwaWMsIHBpbjsKKworCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspCisJCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXTsgcGluKyspCisJCQlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLAorCQkJCQkgICBlYXJseV9pb2FwaWNfZW50cmllc1thcGljXVtwaW5dKTsKK30KKwordm9pZCByZWluaXRfaW50cl9yZW1hcHBlZF9JT19BUElDKGludCBpbnRyX3JlbWFwcGluZykKK3sKKwkvKgorCSAqIGZvciBub3cgcGxhaW4gcmVzdG9yZSBvZiBwcmV2aW91cyBzZXR0aW5ncy4KKwkgKiBUQkQ6IEluIHRoZSBjYXNlIG9mIE9TIGVuYWJsaW5nIGludGVycnVwdC1yZW1hcHBpbmcsCisJICogSU8tQVBJQyBSVEUncyBuZWVkIHRvIGJlIHNldHVwIHRvIHBvaW50IHRvIGludGVycnVwdC1yZW1hcHBpbmcKKwkgKiB0YWJsZSBlbnRyaWVzLiBmb3Igbm93LCBkbyBhIHBsYWluIHJlc3RvcmUsIGFuZCB3YWl0IGZvcgorCSAqIHRoZSBzZXR1cF9JT19BUElDX2lycXMoKSB0byBkbyBwcm9wZXIgaW5pdGlhbGl6YXRpb24uCisJICovCisJcmVzdG9yZV9JT19BUElDX3NldHVwKCk7Cit9CisKIGludCBza2lwX2lvYXBpY19zZXR1cDsKIGludCBpb2FwaWNfZm9yY2U7CiAKQEAgLTgzOSwxOCArOTEyLDk4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW9hcGljX2NoaXA7CisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXJfaW9hcGljX2NoaXA7CisjZW5kaWYKIAogc3RhdGljIHZvaWQgaW9hcGljX3JlZ2lzdGVyX2ludHIoaW50IGlycSwgdW5zaWduZWQgbG9uZyB0cmlnZ2VyKQogewotCWlmICh0cmlnZ2VyKSB7CisJaWYgKHRyaWdnZXIpCiAJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9MRVZFTDsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCi0JCQkJCSAgICAgIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJj0gfklSUV9MRVZFTDsKKworI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCisJaWYgKGlycV9yZW1hcHBlZChpcnEpKSB7CisJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9NT1ZFX1BDTlRYVDsKKwkJaWYgKHRyaWdnZXIpCisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpcl9pb2FwaWNfY2hpcCwKKwkJCQkJCSAgICAgIGhhbmRsZV9mYXN0ZW9pX2lycSwKKwkJCQkJCSAgICAgImZhc3Rlb2kiKTsKKwkJZWxzZQorCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXJfaW9hcGljX2NoaXAsCisJCQkJCQkgICAgICBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAodHJpZ2dlcikKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9mYXN0ZW9pX2lycSwKKwkJCQkJICAgICAgImZhc3Rlb2kiKTsKKwllbHNlCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgICAgICBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfaW9hcGljX2VudHJ5KGludCBhcGljLCBpbnQgaXJxLAorCQkJICAgICAgc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKmVudHJ5LAorCQkJICAgICAgdW5zaWduZWQgaW50IGRlc3RpbmF0aW9uLCBpbnQgdHJpZ2dlciwKKwkJCSAgICAgIGludCBwb2xhcml0eSwgaW50IHZlY3RvcikKK3sKKwkvKgorCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkgKi8KKwltZW1zZXQoZW50cnksMCxzaXplb2YoKmVudHJ5KSk7CisKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorCWlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKSB7CisJCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBtYXBfaW9hcGljX3RvX2lyKGFwaWMpOworCQlzdHJ1Y3QgaXJ0ZSBpcnRlOworCQlzdHJ1Y3QgSVJfSU9fQVBJQ19yb3V0ZV9lbnRyeSAqaXJfZW50cnkgPQorCQkJKHN0cnVjdCBJUl9JT19BUElDX3JvdXRlX2VudHJ5ICopIGVudHJ5OworCQlpbnQgaW5kZXg7CisKKwkJaWYgKCFpb21tdSkKKwkJCXBhbmljKCJObyBtYXBwaW5nIGlvbW11IGZvciBpb2FwaWMgJWRcbiIsIGFwaWMpOworCisJCWluZGV4ID0gYWxsb2NfaXJ0ZShpb21tdSwgaXJxLCAxKTsKKwkJaWYgKGluZGV4IDwgMCkKKwkJCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgSVJURSBmb3IgaW9hcGljICVkXG4iLCBhcGljKTsKKworCQltZW1zZXQoJmlydGUsIDAsIHNpemVvZihpcnRlKSk7CisKKwkJaXJ0ZS5wcmVzZW50ID0gMTsKKwkJaXJ0ZS5kc3RfbW9kZSA9IElOVF9ERVNUX01PREU7CisJCWlydGUudHJpZ2dlcl9tb2RlID0gdHJpZ2dlcjsKKwkJaXJ0ZS5kbHZyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJCWlydGUudmVjdG9yID0gdmVjdG9yOworCQlpcnRlLmRlc3RfaWQgPSBJUlRFX0RFU1QoZGVzdGluYXRpb24pOworCisJCW1vZGlmeV9pcnRlKGlycSwgJmlydGUpOworCisJCWlyX2VudHJ5LT5pbmRleDIgPSAoaW5kZXggPj4gMTUpICYgMHgxOworCQlpcl9lbnRyeS0+emVybyA9IDA7CisJCWlyX2VudHJ5LT5mb3JtYXQgPSAxOworCQlpcl9lbnRyeS0+aW5kZXggPSAoaW5kZXggJiAweDdmZmYpOworCX0gZWxzZQorI2VuZGlmCisJeworCQllbnRyeS0+ZGVsaXZlcnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOworCQllbnRyeS0+ZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwkJZW50cnktPmRlc3QgPSBkZXN0aW5hdGlvbjsKIAl9CisKKwllbnRyeS0+bWFzayA9IDA7CQkJCS8qIGVuYWJsZSBJUlEgKi8KKwllbnRyeS0+dHJpZ2dlciA9IHRyaWdnZXI7CisJZW50cnktPnBvbGFyaXR5ID0gcG9sYXJpdHk7CisJZW50cnktPnZlY3RvciA9IHZlY3RvcjsKKworCS8qIE1hc2sgbGV2ZWwgdHJpZ2dlcmVkIGlycXMuCisJICogVXNlIElSUV9ERUxBWUVEX0RJU0FCTEUgZm9yIGVkZ2UgdHJpZ2dlcmVkIGlycXMuCisJICovCisJaWYgKHRyaWdnZXIpCisJCWVudHJ5LT5tYXNrID0gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfSU9fQVBJQ19pcnEoaW50IGFwaWMsIGludCBwaW4sIHVuc2lnbmVkIGludCBpcnEsCkBAIC04NzUsMjQgKzEwMjgsMTUgQEAKIAkJICAgIGFwaWMsIG1wX2lvYXBpY3NbYXBpY10ubXBfYXBpY2lkLCBwaW4sIGNmZy0+dmVjdG9yLAogCQkgICAgaXJxLCB0cmlnZ2VyLCBwb2xhcml0eSk7CiAKLQkvKgotCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKLQkgKi8KLQltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CiAKLQllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7Ci0JZW50cnkuZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKLQllbnRyeS5kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOwotCWVudHJ5Lm1hc2sgPSAwOwkJCQkvKiBlbmFibGUgSVJRICovCi0JZW50cnkudHJpZ2dlciA9IHRyaWdnZXI7Ci0JZW50cnkucG9sYXJpdHkgPSBwb2xhcml0eTsKLQllbnRyeS52ZWN0b3IgPSBjZmctPnZlY3RvcjsKLQotCS8qIE1hc2sgbGV2ZWwgdHJpZ2dlcmVkIGlycXMuCi0JICogVXNlIElSUV9ERUxBWUVEX0RJU0FCTEUgZm9yIGVkZ2UgdHJpZ2dlcmVkIGlycXMuCi0JICovCi0JaWYgKHRyaWdnZXIpCi0JCWVudHJ5Lm1hc2sgPSAxOworCWlmIChzZXR1cF9pb2FwaWNfZW50cnkobXBfaW9hcGljc1thcGljXS5tcF9hcGljaWQsIGlycSwgJmVudHJ5LAorCQkJICAgICAgIGNwdV9tYXNrX3RvX2FwaWNpZChtYXNrKSwgdHJpZ2dlciwgcG9sYXJpdHksCisJCQkgICAgICAgY2ZnLT52ZWN0b3IpKSB7CisJCXByaW50aygiRmFpbGVkIHRvIHNldHVwIGlvYXBpYyBlbnRyeSBmb3IgaW9hcGljICAlZCwgcGluICVkXG4iLAorCQkgICAgICAgbXBfaW9hcGljc1thcGljXS5tcF9hcGljaWQsIHBpbik7CisJCV9fY2xlYXJfaXJxX3ZlY3RvcihpcnEpOworCQlyZXR1cm47CisJfQogCiAJaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCB0cmlnZ2VyKTsKIAlpZiAoaXJxIDwgMTYpCkBAIC05NDQsNiArMTA4OCw5IEBACiB7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CiAKKwlpZiAoaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkKKwkJcmV0dXJuOworCiAJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CiAKIAkvKgpAQCAtOTcwLDcgKzExMTcsOCBAQAogCWlvYXBpY193cml0ZV9lbnRyeShhcGljLCBwaW4sIGVudHJ5KTsKIH0KIAotdm9pZCBfX2FwaWNkZWJ1Z2luaXQgcHJpbnRfSU9fQVBJQyh2b2lkKQorCitfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfSU9fQVBJQyh2b2lkKQogewogCWludCBhcGljLCBpOwogCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKQEAgLTEwNjQsOSArMTIxMiw3IEBACiAJcmV0dXJuOwogfQogCi0jaWYgMAotCi1zdGF0aWMgX19hcGljZGVidWdpbml0IHZvaWQgcHJpbnRfQVBJQ19iaXRmaWVsZCAoaW50IGJhc2UpCitfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfQVBJQ19iaXRmaWVsZChpbnQgYmFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgdjsKIAlpbnQgaSwgajsKQEAgLTEwODcsOSArMTIzMywxMCBAQAogCX0KIH0KIAotdm9pZCBfX2FwaWNkZWJ1Z2luaXQgcHJpbnRfbG9jYWxfQVBJQyh2b2lkICogZHVtbXkpCitfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfbG9jYWxfQVBJQyh2b2lkICpkdW1teSkKIHsKIAl1bnNpZ25lZCBpbnQgdiwgdmVyLCBtYXhsdnQ7CisJdW5zaWduZWQgbG9uZyBpY3I7CiAKIAlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKIAkJcmV0dXJuOwpAQCAtMTA5Nyw3ICsxMjQ0LDcgQEAKIAlwcmludGsoIlxuIiBLRVJOX0RFQlVHICJwcmludGluZyBsb2NhbCBBUElDIGNvbnRlbnRzIG9uIENQVSMlZC8lZDpcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpOwogCXYgPSBhcGljX3JlYWQoQVBJQ19JRCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiLi4uIEFQSUMgSUQ6ICAgICAgJTA4eCAoJTAxeClcbiIsIHYsIEdFVF9BUElDX0lEKHJlYWRfYXBpY19pZCgpKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiLi4uIEFQSUMgSUQ6ICAgICAgJTA4eCAoJTAxeClcbiIsIHYsIHJlYWRfYXBpY19pZCgpKTsKIAl2ID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKIAlwcmludGsoS0VSTl9JTkZPICIuLi4gQVBJQyBWRVJTSU9OOiAlMDh4XG4iLCB2KTsKIAl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHYpOwpAQCAtMTEzMywxMCArMTI4MCw5IEBACiAJdiA9IGFwaWNfcmVhZChBUElDX0VTUik7CiAJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVTUjogJTA4eFxuIiwgdik7CiAKLQl2ID0gYXBpY19yZWFkKEFQSUNfSUNSKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCB2KTsKLQl2ID0gYXBpY19yZWFkKEFQSUNfSUNSMik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjI6ICUwOHhcbiIsIHYpOworCWljciA9IGFwaWNfaWNyX3JlYWQoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCAodTMyKWljcik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjI6ICUwOHhcbiIsICh1MzIpKGljciA+PiAzMikpOwogCiAJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlRUOiAlMDh4XG4iLCB2KTsKQEAgLTExNjQsMTIgKzEzMTAsMTIgQEAKIAlwcmludGsoIlxuIik7CiB9CiAKLXZvaWQgcHJpbnRfYWxsX2xvY2FsX0FQSUNzICh2b2lkKQorX19hcGljZGVidWdpbml0KHZvaWQpIHByaW50X2FsbF9sb2NhbF9BUElDcyh2b2lkKQogewogCW9uX2VhY2hfY3B1KHByaW50X2xvY2FsX0FQSUMsIE5VTEwsIDEpOwogfQogCi12b2lkIF9fYXBpY2RlYnVnaW5pdCBwcmludF9QSUModm9pZCkKK19fYXBpY2RlYnVnaW5pdCh2b2lkKSBwcmludF9QSUModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTIwMSw3ICsxMzQ3LDE3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBQSUMgRUxDUjogJTA0eFxuIiwgdik7CiB9CiAKLSNlbmRpZiAgLyogIDAgICovCitfX2FwaWNkZWJ1Z2luaXQoaW50KSBwcmludF9hbGxfSUNzKHZvaWQpCit7CisJcHJpbnRfUElDKCk7CisJcHJpbnRfYWxsX2xvY2FsX0FQSUNzKCk7CisJcHJpbnRfSU9fQVBJQygpOworCisJcmV0dXJuIDA7Cit9CisKK2ZzX2luaXRjYWxsKHByaW50X2FsbF9JQ3MpOworCiAKIHZvaWQgX19pbml0IGVuYWJsZV9JT19BUElDKHZvaWQpCiB7CkBAIC0xMjkxLDcgKzE0NDcsNyBAQAogCQllbnRyeS5kZXN0X21vZGUgICAgICAgPSAwOyAvKiBQaHlzaWNhbCAqLwogCQllbnRyeS5kZWxpdmVyeV9tb2RlICAgPSBkZXN0X0V4dElOVDsgLyogRXh0SW50ICovCiAJCWVudHJ5LnZlY3RvciAgICAgICAgICA9IDA7Ci0JCWVudHJ5LmRlc3QgICAgICAgICAgPSBHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSk7CisJCWVudHJ5LmRlc3QgICAgICAgICAgICA9IHJlYWRfYXBpY19pZCgpOwogCiAJCS8qCiAJCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKQEAgLTEzOTcsNiArMTU1MywxNDcgQEAKICAqLwogCiAjaWZkZWYgQ09ORklHX1NNUAorCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKK3N0YXRpYyB2b2lkIGlyX2lycV9taWdyYXRpb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGlyX21pZ3JhdGlvbl93b3JrLCBpcl9pcnFfbWlncmF0aW9uKTsKKworLyoKKyAqIE1pZ3JhdGUgdGhlIElPLUFQSUMgaXJxIGluIHRoZSBwcmVzZW5jZSBvZiBpbnRyLXJlbWFwcGluZy4KKyAqCisgKiBGb3IgZWRnZSB0cmlnZ2VyZWQsIGlycSBtaWdyYXRpb24gaXMgYSBzaW1wbGUgYXRvbWljIHVwZGF0ZShvZiB2ZWN0b3IKKyAqIGFuZCBjcHUgZGVzdGluYXRpb24pIG9mIElSVEUgYW5kIGZsdXNoIHRoZSBoYXJkd2FyZSBjYWNoZS4KKyAqCisgKiBGb3IgbGV2ZWwgdHJpZ2dlcmVkLCB3ZSBuZWVkIHRvIG1vZGlmeSB0aGUgaW8tYXBpYyBSVEUgYXN3ZWxsIHdpdGggdGhlIHVwZGF0ZQorICogdmVjdG9yIGluZm9ybWF0aW9uLCBhbG9uZyB3aXRoIG1vZGlmeWluZyBJUlRFIHdpdGggdmVjdG9yIGFuZCBkZXN0aW5hdGlvbi4KKyAqIFNvIGlycSBtaWdyYXRpb24gZm9yIGxldmVsIHRyaWdnZXJlZCBpcyBsaXR0bGUgIGJpdCBtb3JlIGNvbXBsZXggY29tcGFyZWQgdG8KKyAqIGVkZ2UgdHJpZ2dlcmVkIG1pZ3JhdGlvbi4gQnV0IHRoZSBnb29kIG5ld3MgaXMsIHdlIHVzZSB0aGUgc2FtZSBhbGdvcml0aG0KKyAqIGZvciBsZXZlbCB0cmlnZ2VyZWQgbWlncmF0aW9uIGFzIHdlIGhhdmUgdG9kYXksIG9ubHkgZGlmZmVyZW5jZSBiZWluZywKKyAqIHdlIG5vdyBpbml0aWF0ZSB0aGUgaXJxIG1pZ3JhdGlvbiBmcm9tIHByb2Nlc3MgY29udGV4dCBpbnN0ZWFkIG9mIHRoZQorICogaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogSW4gZnV0dXJlLCB3aGVuIHdlIGRvIGEgZGlyZWN0ZWQgRU9JIChjb21iaW5lZCB3aXRoIGNwdSBFT0kgYnJvYWRjYXN0CisgKiBzdXBwcmVzc2lvbikgdG8gdGhlIElPLUFQSUMsIGxldmVsIHRyaWdnZXJlZCBpcnEgbWlncmF0aW9uIHdpbGwgYWxzbyBiZQorICogYXMgc2ltcGxlIGFzIGVkZ2UgdHJpZ2dlcmVkIG1pZ3JhdGlvbiBhbmQgd2UgY2FuIGRvIHRoZSBpcnEgbWlncmF0aW9uCisgKiB3aXRoIGEgc2ltcGxlIGF0b21pYyB1cGRhdGUgdG8gSU8tQVBJQyBSVEUuCisgKi8KK3N0YXRpYyB2b2lkIG1pZ3JhdGVfaW9hcGljX2lycShpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZyArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwljcHVtYXNrX3QgdG1wLCBjbGVhbnVwX21hc2s7CisJc3RydWN0IGlydGUgaXJ0ZTsKKwlpbnQgbW9kaWZ5X2lvYXBpY19ydGUgPSBkZXNjLT5zdGF0dXMgJiBJUlFfTEVWRUw7CisJdW5zaWduZWQgaW50IGRlc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNwdXNfYW5kKHRtcCwgbWFzaywgY3B1X29ubGluZV9tYXApOworCWlmIChjcHVzX2VtcHR5KHRtcCkpCisJCXJldHVybjsKKworCWlmIChnZXRfaXJ0ZShpcnEsICZpcnRlKSkKKwkJcmV0dXJuOworCisJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgbWFzaykpCisJCXJldHVybjsKKworCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIG1hc2spOworCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKKworCWlmIChtb2RpZnlfaW9hcGljX3J0ZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJX190YXJnZXRfSU9fQVBJQ19pcnEoaXJxLCBkZXN0LCBjZmctPnZlY3Rvcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJfQorCisJaXJ0ZS52ZWN0b3IgPSBjZmctPnZlY3RvcjsKKwlpcnRlLmRlc3RfaWQgPSBJUlRFX0RFU1QoZGVzdCk7CisKKwkvKgorCSAqIE1vZGlmaWVkIHRoZSBJUlRFIGFuZCBmbHVzaGVzIHRoZSBJbnRlcnJ1cHQgZW50cnkgY2FjaGUuCisJICovCisJbW9kaWZ5X2lydGUoaXJxLCAmaXJ0ZSk7CisKKwlpZiAoY2ZnLT5tb3ZlX2luX3Byb2dyZXNzKSB7CisJCWNwdXNfYW5kKGNsZWFudXBfbWFzaywgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hcCk7CisJCWNmZy0+bW92ZV9jbGVhbnVwX2NvdW50ID0gY3B1c193ZWlnaHQoY2xlYW51cF9tYXNrKTsKKwkJc2VuZF9JUElfbWFzayhjbGVhbnVwX21hc2ssIElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SKTsKKwkJY2ZnLT5tb3ZlX2luX3Byb2dyZXNzID0gMDsKKwl9CisKKwlpcnFfZGVzY1tpcnFdLmFmZmluaXR5ID0gbWFzazsKK30KKworc3RhdGljIGludCBtaWdyYXRlX2lycV9yZW1hcHBlZF9sZXZlbChpbnQgaXJxKQoreworCWludCByZXQgPSAtMTsKKworCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKworCWlmIChpb19hcGljX2xldmVsX2Fja19wZW5kaW5nKGlycSkpIHsKKwkJLyoKKwkgCSAqIEludGVycnVwdCBpbiBwcm9ncmVzcy4gTWlncmF0aW5nIGlycSBub3cgd2lsbCBjaGFuZ2UgdGhlCisJCSAqIHZlY3RvciBpbmZvcm1hdGlvbiBpbiB0aGUgSU8tQVBJQyBSVEUgYW5kIHRoYXQgd2lsbCBjb25mdXNlCisJCSAqIHRoZSBFT0kgYnJvYWRjYXN0IHBlcmZvcm1lZCBieSBjcHUuCisJCSAqIFNvLCBkZWxheSB0aGUgaXJxIG1pZ3JhdGlvbiB0byB0aGUgbmV4dCBpbnN0YW5jZS4KKwkJICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaXJfbWlncmF0aW9uX3dvcmssIDEpOworCQlnb3RvIHVubWFzazsKKwl9CisKKwkvKiBldmVydGhpbmcgaXMgY2xlYXIuIHdlIGhhdmUgcmlnaHQgb2Ygd2F5ICovCisJbWlncmF0ZV9pb2FwaWNfaXJxKGlycSwgaXJxX2Rlc2NbaXJxXS5wZW5kaW5nX21hc2spOworCisJcmV0ID0gMDsKKwlpcnFfZGVzY1tpcnFdLnN0YXR1cyAmPSB+SVJRX01PVkVfUEVORElORzsKKwljcHVzX2NsZWFyKGlycV9kZXNjW2lycV0ucGVuZGluZ19tYXNrKTsKKwordW5tYXNrOgorCXVubWFza19JT19BUElDX2lycShpcnEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlyX2lycV9taWdyYXRpb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX01PVkVfUEVORElORykgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICghZGVzYy0+Y2hpcC0+c2V0X2FmZmluaXR5IHx8CisJCQkgICAgIShkZXNjLT5zdGF0dXMgJiBJUlFfTU9WRV9QRU5ESU5HKSkgeworCQkJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX01PVkVfUEVORElORzsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsCisJCQkJCSAgICAgICAgIGlycV9kZXNjW2lycV0ucGVuZGluZ19tYXNrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKworLyoKKyAqIE1pZ3JhdGVzIHRoZSBJUlEgZGVzdGluYXRpb24gaW4gdGhlIHByb2Nlc3MgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgc2V0X2lyX2lvYXBpY19hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCit7CisJaWYgKGlycV9kZXNjW2lycV0uc3RhdHVzICYgSVJRX0xFVkVMKSB7CisJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9NT1ZFX1BFTkRJTkc7CisJCWlycV9kZXNjW2lycV0ucGVuZGluZ19tYXNrID0gbWFzazsKKwkJbWlncmF0ZV9pcnFfcmVtYXBwZWRfbGV2ZWwoaXJxKTsKKwkJcmV0dXJuOworCX0KKworCW1pZ3JhdGVfaW9hcGljX2lycShpcnEsIG1hc2spOworfQorI2VuZGlmCisKIGFzbWxpbmthZ2Ugdm9pZCBzbXBfaXJxX21vdmVfY2xlYW51cF9pbnRlcnJ1cHQodm9pZCkKIHsKIAl1bnNpZ25lZCB2ZWN0b3IsIG1lOwpAQCAtMTQ1Myw2ICsxNzUwLDE3IEBACiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGlycV9jb21wbGV0ZV9tb3ZlKHVuc2lnbmVkIGludCBpcnEpIHt9CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorc3RhdGljIHZvaWQgYWNrX3gyYXBpY19sZXZlbCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWFja194MkFQSUNfaXJxKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFja194MmFwaWNfZWRnZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWFja194MkFQSUNfaXJxKCk7Cit9CisjZW5kaWYKIAogc3RhdGljIHZvaWQgYWNrX2FwaWNfZWRnZSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtMTUyNyw2ICsxODM1LDIxIEBACiAJLnJldHJpZ2dlcgk9IGlvYXBpY19yZXRyaWdnZXJfaXJxLAogfTsKIAorI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlyX2lvYXBpY19jaGlwIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgCQk9ICJJUi1JTy1BUElDIiwKKwkuc3RhcnR1cCAJPSBzdGFydHVwX2lvYXBpY19pcnEsCisJLm1hc2sJIAk9IG1hc2tfSU9fQVBJQ19pcnEsCisJLnVubWFzawkgCT0gdW5tYXNrX0lPX0FQSUNfaXJxLAorCS5hY2sgCQk9IGFja194MmFwaWNfZWRnZSwKKwkuZW9pIAkJPSBhY2tfeDJhcGljX2xldmVsLAorI2lmZGVmIENPTkZJR19TTVAKKwkuc2V0X2FmZmluaXR5IAk9IHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxLAorI2VuZGlmCisJLnJldHJpZ2dlcgk9IGlvYXBpY19yZXRyaWdnZXJfaXJxLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9JT19BUElDX3RyYXBzKHZvaWQpCiB7CiAJaW50IGlycTsKQEAgLTE3MTIsNiArMjAzNSw4IEBACiAJICogODI1OUEuCiAJICovCiAJaWYgKHBpbjEgPT0gLTEpIHsKKwkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCisJCQlwYW5pYygiQklPUyBidWc6IHRpbWVyIG5vdCBjb25uZWN0ZWQgdG8gSU8tQVBJQyIpOwogCQlwaW4xID0gcGluMjsKIAkJYXBpYzEgPSBhcGljMjsKIAkJbm9fcGluMSA9IDE7CkBAIC0xNzM4LDYgKzIwNjMsOCBAQAogCQkJCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbjEpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCisJCQlwYW5pYygidGltZXIgZG9lc24ndCB3b3JrIHRocm91Z2ggSW50ZXJydXB0LXJlbWFwcGVkIElPLUFQSUMiKTsKIAkJY2xlYXJfSU9fQVBJQ19waW4oYXBpYzEsIHBpbjEpOwogCQlpZiAoIW5vX3BpbjEpCiAJCQlhcGljX3ByaW50ayhBUElDX1FVSUVULCBLRVJOX0VSUiAiLi5NUC1CSU9TIGJ1ZzogIgpAQCAtMTg1NCw4ICsyMTgxLDYgQEAKIAlzZXR1cF9JT19BUElDX2lycXMoKTsKIAlpbml0X0lPX0FQSUNfdHJhcHMoKTsKIAljaGVja190aW1lcigpOwotCWlmICghYWNwaV9pb2FwaWMpCi0JCXByaW50X0lPX0FQSUMoKTsKIH0KIAogc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhIHsKQEAgLTE5NzcsNiArMjMwMiw5IEBACiAKIAlkeW5hbWljX2lycV9jbGVhbnVwKGlycSk7CiAKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorCWZyZWVfaXJ0ZShpcnEpOworI2VuZGlmCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7CiAJX19jbGVhcl9pcnFfdmVjdG9yKGlycSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKQEAgLTE5OTUsMTAgKzIzMjMsNDEgQEAKIAogCXRtcCA9IFRBUkdFVF9DUFVTOwogCWVyciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgdG1wKTsKLQlpZiAoIWVycikgewotCQljcHVzX2FuZCh0bXAsIGNmZy0+ZG9tYWluLCB0bXApOwotCQlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKHRtcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAorCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIHRtcCk7CisJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOworCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlpZiAoaXJxX3JlbWFwcGVkKGlycSkpIHsKKwkJc3RydWN0IGlydGUgaXJ0ZTsKKwkJaW50IGlyX2luZGV4OworCQl1MTYgc3ViX2hhbmRsZTsKKworCQlpcl9pbmRleCA9IG1hcF9pcnFfdG9faXJ0ZV9oYW5kbGUoaXJxLCAmc3ViX2hhbmRsZSk7CisJCUJVR19PTihpcl9pbmRleCA9PSAtMSk7CisKKwkJbWVtc2V0ICgmaXJ0ZSwgMCwgc2l6ZW9mKGlydGUpKTsKKworCQlpcnRlLnByZXNlbnQgPSAxOworCQlpcnRlLmRzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwkJaXJ0ZS50cmlnZ2VyX21vZGUgPSAwOyAvKiBlZGdlICovCisJCWlydGUuZGx2cnlfbW9kZSA9IElOVF9ERUxJVkVSWV9NT0RFOworCQlpcnRlLnZlY3RvciA9IGNmZy0+dmVjdG9yOworCQlpcnRlLmRlc3RfaWQgPSBJUlRFX0RFU1QoZGVzdCk7CisKKwkJbW9kaWZ5X2lydGUoaXJxLCAmaXJ0ZSk7CisKKwkJbXNnLT5hZGRyZXNzX2hpID0gTVNJX0FERFJfQkFTRV9ISTsKKwkJbXNnLT5kYXRhID0gc3ViX2hhbmRsZTsKKwkJbXNnLT5hZGRyZXNzX2xvID0gTVNJX0FERFJfQkFTRV9MTyB8IE1TSV9BRERSX0lSX0VYVF9JTlQgfAorCQkJCSAgTVNJX0FERFJfSVJfU0hWIHwKKwkJCQkgIE1TSV9BRERSX0lSX0lOREVYMShpcl9pbmRleCkgfAorCQkJCSAgTVNJX0FERFJfSVJfSU5ERVgyKGlyX2luZGV4KTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKIAkJbXNnLT5hZGRyZXNzX2hpID0gTVNJX0FERFJfQkFTRV9ISTsKIAkJbXNnLT5hZGRyZXNzX2xvID0KIAkJCU1TSV9BRERSX0JBU0VfTE8gfApAQCAtMjA0OSw2ICsyNDA4LDU1IEBACiAJd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwogCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBtYXNrOwogfQorCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKy8qCisgKiBNaWdyYXRlIHRoZSBNU0kgaXJxIHRvIGFub3RoZXIgY3B1bWFzay4gVGhpcyBtaWdyYXRpb24gaXMKKyAqIGRvbmUgaW4gdGhlIHByb2Nlc3MgY29udGV4dCB1c2luZyBpbnRlcnJ1cHQtcmVtYXBwaW5nIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCBpcl9zZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZyArIGlycTsKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwljcHVtYXNrX3QgdG1wLCBjbGVhbnVwX21hc2s7CisJc3RydWN0IGlydGUgaXJ0ZTsKKworCWNwdXNfYW5kKHRtcCwgbWFzaywgY3B1X29ubGluZV9tYXApOworCWlmIChjcHVzX2VtcHR5KHRtcCkpCisJCXJldHVybjsKKworCWlmIChnZXRfaXJ0ZShpcnEsICZpcnRlKSkKKwkJcmV0dXJuOworCisJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgbWFzaykpCisJCXJldHVybjsKKworCWNwdXNfYW5kKHRtcCwgY2ZnLT5kb21haW4sIG1hc2spOworCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKKworCWlydGUudmVjdG9yID0gY2ZnLT52ZWN0b3I7CisJaXJ0ZS5kZXN0X2lkID0gSVJURV9ERVNUKGRlc3QpOworCisJLyoKKwkgKiBhdG9taWNhbGx5IHVwZGF0ZSB0aGUgSVJURSB3aXRoIHRoZSBuZXcgZGVzdGluYXRpb24gYW5kIHZlY3Rvci4KKwkgKi8KKwltb2RpZnlfaXJ0ZShpcnEsICZpcnRlKTsKKworCS8qCisJICogQWZ0ZXIgdGhpcyBwb2ludCwgYWxsIHRoZSBpbnRlcnJ1cHRzIHdpbGwgc3RhcnQgYXJyaXZpbmcKKwkgKiBhdCB0aGUgbmV3IGRlc3RpbmF0aW9uLiBTbywgdGltZSB0byBjbGVhbnVwIHRoZSBwcmV2aW91cworCSAqIHZlY3RvciBhbGxvY2F0aW9uLgorCSAqLworCWlmIChjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpIHsKKwkJY3B1c19hbmQoY2xlYW51cF9tYXNrLCBjZmctPm9sZF9kb21haW4sIGNwdV9vbmxpbmVfbWFwKTsKKwkJY2ZnLT5tb3ZlX2NsZWFudXBfY291bnQgPSBjcHVzX3dlaWdodChjbGVhbnVwX21hc2spOworCQlzZW5kX0lQSV9tYXNrKGNsZWFudXBfbWFzaywgSVJRX01PVkVfQ0xFQU5VUF9WRUNUT1IpOworCQljZmctPm1vdmVfaW5fcHJvZ3Jlc3MgPSAwOworCX0KKworCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBtYXNrOworfQorI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAvKgpAQCAtMjA2NiwyOCArMjQ3NCwxNTkgQEAKIAkucmV0cmlnZ2VyCT0gaW9hcGljX3JldHJpZ2dlcl9pcnEsCiB9OwogCi1pbnQgYXJjaF9zZXR1cF9tc2lfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqZGVzYykKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtc2lfaXJfY2hpcCA9IHsKKwkubmFtZQkJPSAiSVItUENJLU1TSSIsCisJLnVubWFzawkJPSB1bm1hc2tfbXNpX2lycSwKKwkubWFzawkJPSBtYXNrX21zaV9pcnEsCisJLmFjawkJPSBhY2tfeDJhcGljX2VkZ2UsCisjaWZkZWYgQ09ORklHX1NNUAorCS5zZXRfYWZmaW5pdHkJPSBpcl9zZXRfbXNpX2lycV9hZmZpbml0eSwKKyNlbmRpZgorCS5yZXRyaWdnZXIJPSBpb2FwaWNfcmV0cmlnZ2VyX2lycSwKK307CisKKy8qCisgKiBNYXAgdGhlIFBDSSBkZXYgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVtYXBwaW5nIGhhcmR3YXJlIHVuaXQKKyAqIGFuZCBhbGxvY2F0ZSAnbnZlYycgY29uc2VjdXRpdmUgaW50ZXJydXB0LXJlbWFwcGluZyB0YWJsZSBlbnRyaWVzCisgKiBpbiBpdC4KKyAqLworc3RhdGljIGludCBtc2lfYWxsb2NfaXJ0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaXJxLCBpbnQgbnZlYykKIHsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCWludCBpbmRleDsKKworCWlvbW11ID0gbWFwX2Rldl90b19pcihkZXYpOworCWlmICghaW9tbXUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiVW5hYmxlIHRvIG1hcCBQQ0kgJXMgdG8gaW9tbXVcbiIsIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpbmRleCA9IGFsbG9jX2lydGUoaW9tbXUsIGlycSwgbnZlYyk7CisJaWYgKGluZGV4IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgJWQgSVJURSBmb3IgUENJICVzXG4iLCBudmVjLAorCQkgICAgICAgIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJcmV0dXJuIGluZGV4OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2V0dXBfbXNpX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MsIGludCBpcnEpCit7CisJaW50IHJldDsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7Ci0JaW50IGlycSwgcmV0OwotCWlycSA9IGNyZWF0ZV9pcnEoKTsKLQlpZiAoaXJxIDwgMCkKLQkJcmV0dXJuIGlycTsKIAogCXJldCA9IG1zaV9jb21wb3NlX21zZyhkZXYsIGlycSwgJm1zZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGVzdHJveV9pcnEoaXJxKTsKKwlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKIAlzZXRfaXJxX21zaShpcnEsIGRlc2MpOwogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJm1zaV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7CisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlpZiAoaXJxX3JlbWFwcGVkKGlycSkpIHsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCS8qCisJCSAqIGlycSBtaWdyYXRpb24gaW4gcHJvY2VzcyBjb250ZXh0CisJCSAqLworCQlkZXNjLT5zdGF0dXMgfD0gSVJRX01PVkVfUENOVFhUOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZtc2lfaXJfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOworCX0gZWxzZQorI2VuZGlmCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJm1zaV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7CiAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGFyY2hfc2V0dXBfbXNpX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCit7CisJaW50IGlycSwgcmV0OworCisJaXJxID0gY3JlYXRlX2lycSgpOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gaXJxOworCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlpZiAoIWludHJfcmVtYXBwaW5nX2VuYWJsZWQpCisJCWdvdG8gbm9faXI7CisKKwlyZXQgPSBtc2lfYWxsb2NfaXJ0ZShkZXYsIGlycSwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7Citub19pcjoKKyNlbmRpZgorCXJldCA9IHNldHVwX21zaV9pcnEoZGV2LCBkZXNjLCBpcnEpOworCWlmIChyZXQgPCAwKSB7CisJCWRlc3Ryb3lfaXJxKGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKK2Vycm9yOgorCWRlc3Ryb3lfaXJxKGlycSk7CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCitpbnQgYXJjaF9zZXR1cF9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYywgaW50IHR5cGUpCit7CisJaW50IGlycSwgcmV0LCBzdWJfaGFuZGxlOworCXN0cnVjdCBtc2lfZGVzYyAqZGVzYzsKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSAwOworCWludCBpbmRleCA9IDA7CisjZW5kaWYKKworCXN1Yl9oYW5kbGUgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaXJxID0gY3JlYXRlX2lycSgpOworCQlpZiAoaXJxIDwgMCkKKwkJCXJldHVybiBpcnE7CisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwkJaWYgKCFpbnRyX3JlbWFwcGluZ19lbmFibGVkKQorCQkJZ290byBub19pcjsKKworCQlpZiAoIXN1Yl9oYW5kbGUpIHsKKwkJCS8qCisJCQkgKiBhbGxvY2F0ZSB0aGUgY29uc2VjdXRpdmUgYmxvY2sgb2YgSVJURSdzCisJCQkgKiBmb3IgJ252ZWMnCisJCQkgKi8KKwkJCWluZGV4ID0gbXNpX2FsbG9jX2lydGUoZGV2LCBpcnEsIG52ZWMpOworCQkJaWYgKGluZGV4IDwgMCkgeworCQkJCXJldCA9IGluZGV4OworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpb21tdSA9IG1hcF9kZXZfdG9faXIoZGV2KTsKKwkJCWlmICghaW9tbXUpIHsKKwkJCQlyZXQgPSAtRU5PRU5UOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQkvKgorCQkJICogc2V0dXAgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgaXJxIGFuZCB0aGUgSVJURQorCQkJICogYmFzZSBpbmRleCwgdGhlIHN1Yl9oYW5kbGUgcG9pbnRpbmcgdG8gdGhlCisJCQkgKiBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQgcmVtYXAgdGFibGUgZW50cnkuCisJCQkgKi8KKwkJCXNldF9pcnRlX2lycShpcnEsIGlvbW11LCBpbmRleCwgc3ViX2hhbmRsZSk7CisJCX0KK25vX2lyOgorI2VuZGlmCisJCXJldCA9IHNldHVwX21zaV9pcnEoZGV2LCBkZXNjLCBpcnEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN1Yl9oYW5kbGUrKzsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWRlc3Ryb3lfaXJxKGlycSk7CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBhcmNoX3RlYXJkb3duX21zaV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlkZXN0cm95X2lycShpcnEpOwpAQCAtMjMzMyw2ICsyODcyLDEwIEBACiAJCQkJc2V0dXBfSU9fQVBJQ19pcnEoaW9hcGljLCBwaW4sIGlycSwKIAkJCQkJCSAgaXJxX3RyaWdnZXIoaXJxX2VudHJ5KSwKIAkJCQkJCSAgaXJxX3BvbGFyaXR5KGlycV9lbnRyeSkpOworI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCisJCQllbHNlIGlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKQorCQkJCXNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgVEFSR0VUX0NQVVMpOworI2VuZGlmCiAJCQllbHNlCiAJCQkJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBUQVJHRVRfQ1BVUyk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9pb3BvcnQuYwppbmRleCA1MGU1ZTRhLi4xOTE5MTQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lvcG9ydC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogLyogU2V0IEVYVEVOVCBiaXRzIHN0YXJ0aW5nIGF0IEJBU0UgaW4gQklUTUFQIHRvIHZhbHVlIFRVUk5fT04uICovCiBzdGF0aWMgdm9pZCBzZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IGJhc2UsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXBpLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXBpLmMKaW5kZXggM2Y3NTM3Yi4uZjFjNjg4ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lwaS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcGkuYwpAQCAtMjAsNiArMjAsOCBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorI2luY2x1ZGUgPG1hY2hfaXBpLmg+CisKIC8qCiAgKiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBkZWFsIHdpdGggc2VuZGluZyBJUElzIGJldHdlZW4gQ1BVcy4KICAqCkBAIC0xNDcsNyArMTQ5LDYgQEAKIH0KIAogLyogbXVzdCBjb21lIGFmdGVyIHRoZSBzZW5kX0lQSSBmdW5jdGlvbnMgYWJvdmUgZm9yIGlubGluaW5nICovCi0jaW5jbHVkZSA8bWFjaF9pcGkuaD4KIHN0YXRpYyBpbnQgY29udmVydF9hcGljaWRfdG9fY3B1KGludCBhcGljX2lkKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCmluZGV4IDFjZjhjMWYuLmI3MWUwMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKQEAgLTMyNSw3ICszMjUsNyBAQAogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsCiAJCQkJcGVyX2NwdShpcnFfc3RhdCxqKS5pcnFfY2FsbF9jb3VudCk7Ci0JCXNlcV9wcmludGYocCwgIiAgZnVuY3Rpb24gY2FsbCBpbnRlcnJ1cHRzXG4iKTsKKwkJc2VxX3ByaW50ZihwLCAiICBGdW5jdGlvbiBjYWxsIGludGVycnVwdHNcbiIpOwogCQlzZXFfcHJpbnRmKHAsICJUTEI6ICIpOwogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKaW5kZXggMWY3OGIyMy4uZjA2NWZlOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCXNlcV9wcmludGYocCwgIkNBTDogIik7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoaikKIAkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgY3B1X3BkYShqKS0+aXJxX2NhbGxfY291bnQpOwotCQlzZXFfcHJpbnRmKHAsICIgIGZ1bmN0aW9uIGNhbGwgaW50ZXJydXB0c1xuIik7CisJCXNlcV9wcmludGYocCwgIiAgRnVuY3Rpb24gY2FsbCBpbnRlcnJ1cHRzXG4iKTsKIAkJc2VxX3ByaW50ZihwLCAiVExCOiAiKTsKIAkJZm9yX2VhY2hfb25saW5lX2NwdShqKQogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBjcHVfcGRhKGopLT5pcnFfdGxiX2NvdW50KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF8zMi5jCmluZGV4IGQ2NjkxNDIuLjkyMDBhMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYwpAQCAtNzQsNiArNzQsMTUgQEAKIAl9CiB9CiAKKy8qCisgKiBJUlEyIGlzIGNhc2NhZGUgaW50ZXJydXB0IHRvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICovCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEyID0geworCS5oYW5kbGVyID0gbm9fYWN0aW9uLAorCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZSA9ICJjYXNjYWRlIiwKK307CisKIC8qIE92ZXJyaWRkZW4gaW4gcGFyYXZpcnQuYyAqLwogdm9pZCBpbml0X0lSUSh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygibmF0aXZlX2luaXRfSVJRIikpKTsKIApAQCAtOTgsNiArMTA3LDQ2IEBACiAJCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2ldKTsKIAl9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfTE9DQUxfQVBJQykgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCS8qCisJICogSVJRMCBtdXN0IGJlIGdpdmVuIGEgZml4ZWQgYXNzaWdubWVudCBhbmQgaW5pdGlhbGl6ZWQsCisJICogYmVjYXVzZSBpdCdzIHVzZWQgYmVmb3JlIHRoZSBJTy1BUElDIGlzIHNldCB1cC4KKwkgKi8KKwlzZXRfaW50cl9nYXRlKEZJUlNUX0RFVklDRV9WRUNUT1IsIGludGVycnVwdFswXSk7CisKKwkvKgorCSAqIFRoZSByZXNjaGVkdWxlIGludGVycnVwdCBpcyBhIENQVS10by1DUFUgcmVzY2hlZHVsZS1oZWxwZXIKKwkgKiBJUEksIGRyaXZlbiBieSB3YWtldXAuCisJICovCisJYWxsb2NfaW50cl9nYXRlKFJFU0NIRURVTEVfVkVDVE9SLCByZXNjaGVkdWxlX2ludGVycnVwdCk7CisKKwkvKiBJUEkgZm9yIGludmFsaWRhdGlvbiAqLworCWFsbG9jX2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1IsIGludmFsaWRhdGVfaW50ZXJydXB0KTsKKworCS8qIElQSSBmb3IgZ2VuZXJpYyBmdW5jdGlvbiBjYWxsICovCisJYWxsb2NfaW50cl9nYXRlKENBTExfRlVOQ1RJT05fVkVDVE9SLCBjYWxsX2Z1bmN0aW9uX2ludGVycnVwdCk7CisKKwkvKiBJUEkgZm9yIHNpbmdsZSBjYWxsIGZ1bmN0aW9uICovCisJc2V0X2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IsIGNhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLworCWFsbG9jX2ludHJfZ2F0ZShMT0NBTF9USU1FUl9WRUNUT1IsIGFwaWNfdGltZXJfaW50ZXJydXB0KTsKKworCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCisJYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOworCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMKQorCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCisJYWxsb2NfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2lvYXBpYykKKwkJc2V0dXBfaXJxKDIsICZpcnEyKTsKKwogCS8qIHNldHVwIGFmdGVyIGNhbGwgZ2F0ZXMgYXJlIGluaXRpYWxpc2VkICh1c3VhbGx5IGFkZCBpbgogCSAqIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZ2F0ZXMpCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jIGIvYXJjaC94ODYva2VybmVsL2lycWluaXRfNjQuYwppbmRleCAxZjI2ZmQ5Li41YjViZTlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCVtJUlExNV9WRUNUT1IgKyAxIC4uLiBOUl9WRUNUT1JTIC0gMV0gPSAtMQogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfSVNBX2lycXMgKHZvaWQpCit2b2lkIF9faW5pdCBpbml0X0lTQV9pcnFzKHZvaWQpCiB7CiAJaW50IGk7CiAKQEAgLTE2NCwyMiArMTY0LDggQEAKIAogdm9pZCBpbml0X0lSUSh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygibmF0aXZlX2luaXRfSVJRIikpKTsKIAotdm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc21wX2ludHJfaW5pdCh2b2lkKQogewotCWludCBpOwotCi0JaW5pdF9JU0FfaXJxcygpOwotCS8qCi0JICogQ292ZXIgdGhlIHdob2xlIHZlY3RvciBzcGFjZSwgbm8gdmVjdG9yIGNhbiBlc2NhcGUKLQkgKiB1cy4gKHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGFuZCBiZWNvbWUKLQkgKiAnc3BlY2lhbCcgU01QIGludGVycnVwdHMpCi0JICovCi0JZm9yIChpID0gMDsgaSA8IChOUl9WRUNUT1JTIC0gRklSU1RfRVhURVJOQUxfVkVDVE9SKTsgaSsrKSB7Ci0JCWludCB2ZWN0b3IgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IgKyBpOwotCQlpZiAodmVjdG9yICE9IElBMzJfU1lTQ0FMTF9WRUNUT1IpCi0JCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2ldKTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfU01QCiAJLyoKIAkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCkBAIC0yMDcsNiArMTkzLDEyIEBACiAJLyogTG93IHByaW9yaXR5IElQSSB0byBjbGVhbnVwIGFmdGVyIG1vdmluZyBhbiBpcnEgKi8KIAlzZXRfaW50cl9nYXRlKElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SLCBpcnFfbW92ZV9jbGVhbnVwX2ludGVycnVwdCk7CiAjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisJc21wX2ludHJfaW5pdCgpOworCiAJYWxsb2NfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKIAlhbGxvY19pbnRyX2dhdGUoVEhSRVNIT0xEX0FQSUNfVkVDVE9SLCB0aHJlc2hvbGRfaW50ZXJydXB0KTsKIApAQCAtMjE2LDYgKzIwOCwyNSBAQAogCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCiAJYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwogCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKK30KKwordm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpCit7CisJaW50IGk7CisKKwlpbml0X0lTQV9pcnFzKCk7CisJLyoKKwkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQorCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQorCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKE5SX1ZFQ1RPUlMgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOyBpKyspIHsKKwkJaW50IHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIGk7CisJCWlmICh2ZWN0b3IgIT0gSUEzMl9TWVNDQUxMX1ZFQ1RPUikKKwkJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaV0pOworCX0KKworCWFwaWNfaW50cl9pbml0KCk7CiAKIAlpZiAoIWFjcGlfaW9hcGljKQogCQlzZXR1cF9pcnEoMiwgJmlycTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2s4LmMgYi9hcmNoL3g4Ni9rZXJuZWwvazguYwppbmRleCA3Mzc3Y2NiLi4zMDRkOGJhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2s4LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2s4LmMKQEAgLTE2LDggKzE2LDkgQEAKIHN0YXRpYyB1MzIgKmZsdXNoX3dvcmRzOwogCiBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrOF9uYl9pZHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIDB4MTEwMykgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIDB4MTIwMykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01JU0MpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xMEhfTkJfTUlTQykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzExSF9OQl9NSVNDKSB9LAogCXt9CiB9OwogRVhQT1JUX1NZTUJPTChrOF9uYl9pZHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tkZWJ1Z2ZzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva2RlYnVnZnMuYwppbmRleCBmMmQ0M2JjLi5mZjdkM2IwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva2RlYnVnZnMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2RlYnVnZnMuYwpAQCAtMTM5LDYgKzEzOSw3IEBACiAJCWlmIChQYWdlSGlnaE1lbShwZykpIHsKIAkJCWRhdGEgPSBpb3JlbWFwX2NhY2hlKHBhX2RhdGEsIHNpemVvZigqZGF0YSkpOwogCQkJaWYgKCFkYXRhKSB7CisJCQkJa2ZyZWUobm9kZSk7CiAJCQkJZXJyb3IgPSAtRU5YSU87CiAJCQkJZ290byBlcnJfZGlyOwogCQkJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggZjQ3ZjBlYi4uMTA0MzVhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC02OSw2ICs2OSw5IEBACiAgKi8KIHZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisjaWZuZGVmIENPTkZJR19YODZfMzIKKwl1MzIgKmdkYl9yZWdzMzIgPSAodTMyICopZ2RiX3JlZ3M7CisjZW5kaWYKIAlnZGJfcmVnc1tHREJfQVhdCT0gcmVncy0+YXg7CiAJZ2RiX3JlZ3NbR0RCX0JYXQk9IHJlZ3MtPmJ4OwogCWdkYl9yZWdzW0dEQl9DWF0JPSByZWdzLT5jeDsKQEAgLTc2LDkgKzc5LDkgQEAKIAlnZGJfcmVnc1tHREJfU0ldCT0gcmVncy0+c2k7CiAJZ2RiX3JlZ3NbR0RCX0RJXQk9IHJlZ3MtPmRpOwogCWdkYl9yZWdzW0dEQl9CUF0JPSByZWdzLT5icDsKLQlnZGJfcmVnc1tHREJfUFNdCT0gcmVncy0+ZmxhZ3M7CiAJZ2RiX3JlZ3NbR0RCX1BDXQk9IHJlZ3MtPmlwOwogI2lmZGVmIENPTkZJR19YODZfMzIKKwlnZGJfcmVnc1tHREJfUFNdCT0gcmVncy0+ZmxhZ3M7CiAJZ2RiX3JlZ3NbR0RCX0RTXQk9IHJlZ3MtPmRzOwogCWdkYl9yZWdzW0dEQl9FU10JPSByZWdzLT5lczsKIAlnZGJfcmVnc1tHREJfQ1NdCT0gcmVncy0+Y3M7CkBAIC05NCw2ICs5Nyw5IEBACiAJZ2RiX3JlZ3NbR0RCX1IxM10JPSByZWdzLT5yMTM7CiAJZ2RiX3JlZ3NbR0RCX1IxNF0JPSByZWdzLT5yMTQ7CiAJZ2RiX3JlZ3NbR0RCX1IxNV0JPSByZWdzLT5yMTU7CisJZ2RiX3JlZ3MzMltHREJfUFNdCT0gcmVncy0+ZmxhZ3M7CisJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gcmVncy0+Y3M7CisJZ2RiX3JlZ3MzMltHREJfU1NdCT0gcmVncy0+c3M7CiAjZW5kaWYKIAlnZGJfcmVnc1tHREJfU1BdCT0gcmVncy0+c3A7CiB9CkBAIC0xMTIsNiArMTE4LDkgQEAKICAqLwogdm9pZCBzbGVlcGluZ190aHJlYWRfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKKyNpZm5kZWYgQ09ORklHX1g4Nl8zMgorCXUzMiAqZ2RiX3JlZ3MzMiA9ICh1MzIgKilnZGJfcmVnczsKKyNlbmRpZgogCWdkYl9yZWdzW0dEQl9BWF0JPSAwOwogCWdkYl9yZWdzW0dEQl9CWF0JPSAwOwogCWdkYl9yZWdzW0dEQl9DWF0JPSAwOwpAQCAtMTI5LDggKzEzOCwxMCBAQAogCWdkYl9yZWdzW0dEQl9GU10JPSAweEZGRkY7CiAJZ2RiX3JlZ3NbR0RCX0dTXQk9IDB4RkZGRjsKICNlbHNlCi0JZ2RiX3JlZ3NbR0RCX1BTXQk9ICoodW5zaWduZWQgbG9uZyAqKShwLT50aHJlYWQuc3AgKyA4KTsKLQlnZGJfcmVnc1tHREJfUENdCT0gMDsKKwlnZGJfcmVnczMyW0dEQl9QU10JPSAqKHVuc2lnbmVkIGxvbmcgKikocC0+dGhyZWFkLnNwICsgOCk7CisJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gX19LRVJORUxfQ1M7CisJZ2RiX3JlZ3MzMltHREJfU1NdCT0gX19LRVJORUxfRFM7CisJZ2RiX3JlZ3NbR0RCX1BDXQk9IHAtPnRocmVhZC5pcDsKIAlnZGJfcmVnc1tHREJfUjhdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjldCT0gMDsKIAlnZGJfcmVnc1tHREJfUjEwXQk9IDA7CkBAIC0xNTMsNiArMTY0LDkgQEAKICAqLwogdm9pZCBnZGJfcmVnc190b19wdF9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKyNpZm5kZWYgQ09ORklHX1g4Nl8zMgorCXUzMiAqZ2RiX3JlZ3MzMiA9ICh1MzIgKilnZGJfcmVnczsKKyNlbmRpZgogCXJlZ3MtPmF4CQk9IGdkYl9yZWdzW0dEQl9BWF07CiAJcmVncy0+YngJCT0gZ2RiX3JlZ3NbR0RCX0JYXTsKIAlyZWdzLT5jeAkJPSBnZGJfcmVnc1tHREJfQ1hdOwpAQCAtMTYwLDkgKzE3NCw5IEBACiAJcmVncy0+c2kJCT0gZ2RiX3JlZ3NbR0RCX1NJXTsKIAlyZWdzLT5kaQkJPSBnZGJfcmVnc1tHREJfREldOwogCXJlZ3MtPmJwCQk9IGdkYl9yZWdzW0dEQl9CUF07Ci0JcmVncy0+ZmxhZ3MJCT0gZ2RiX3JlZ3NbR0RCX1BTXTsKIAlyZWdzLT5pcAkJPSBnZGJfcmVnc1tHREJfUENdOwogI2lmZGVmIENPTkZJR19YODZfMzIKKwlyZWdzLT5mbGFncwkJPSBnZGJfcmVnc1tHREJfUFNdOwogCXJlZ3MtPmRzCQk9IGdkYl9yZWdzW0dEQl9EU107CiAJcmVncy0+ZXMJCT0gZ2RiX3JlZ3NbR0RCX0VTXTsKIAlyZWdzLT5jcwkJPSBnZGJfcmVnc1tHREJfQ1NdOwpAQCAtMTc1LDYgKzE4OSw5IEBACiAJcmVncy0+cjEzCQk9IGdkYl9yZWdzW0dEQl9SMTNdOwogCXJlZ3MtPnIxNAkJPSBnZGJfcmVnc1tHREJfUjE0XTsKIAlyZWdzLT5yMTUJCT0gZ2RiX3JlZ3NbR0RCX1IxNV07CisJcmVncy0+ZmxhZ3MJCT0gZ2RiX3JlZ3MzMltHREJfUFNdOworCXJlZ3MtPmNzCQk9IGdkYl9yZWdzMzJbR0RCX0NTXTsKKwlyZWdzLT5zcwkJPSBnZGJfcmVnczMyW0dEQl9TU107CiAjZW5kaWYKIH0KIApAQCAtMzc4LDEwICszOTUsOCBAQAogCQlpZiAocmVtY29tSW5CdWZmZXJbMF0gPT0gJ3MnKSB7CiAJCQlsaW51eF9yZWdzLT5mbGFncyB8PSBYODZfRUZMQUdTX1RGOwogCQkJa2dkYl9zaW5nbGVfc3RlcCA9IDE7Ci0JCQlpZiAoa2dkYl9jb250dGhyZWFkKSB7Ci0JCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCi0JCQkJCSAgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwotCQkJfQorCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCisJCQkJICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCX0KIAogCQlnZXRfZGVidWdyZWcoZHI2LCA2KTsKQEAgLTQ0MCwxMiArNDU1LDcgQEAKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJY2FzZSBESUVfTk1JX0lQSToKLQkJaWYgKGF0b21pY19yZWFkKCZrZ2RiX2FjdGl2ZSkgIT0gLTEpIHsKLQkJCS8qIEtHREIgQ1BVIHJvdW5kdXAgKi8KLQkJCWtnZGJfbm1pY2FsbGJhY2socmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgcmVncyk7Ci0JCQl3YXNfaW5fZGVidWdfbm1pW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldID0gMTsKLQkJCXRvdWNoX25taV93YXRjaGRvZygpOwotCQl9CisJCS8qIEp1c3QgaWdub3JlLCB3ZSB3aWxsIGhhbmRsZSB0aGUgcm91bmR1cCBvbiBESUVfTk1JLiAqLwogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAljYXNlIERJRV9OTUlVTktOT1dOOgpAQCAtNDY2LDkgKzQ3NiwxNSBAQAogCiAJY2FzZSBESUVfREVCVUc6CiAJCWlmIChhdG9taWNfcmVhZCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXApID09Ci0JCQlyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICYmCi0JCQl1c2VyX21vZGUocmVncykpCi0JCQlyZXR1cm4gc2luZ2xlX3N0ZXBfY29udChyZWdzLCBhcmdzKTsKKwkJICAgIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJCWlmICh1c2VyX21vZGUocmVncykpCisJCQkJcmV0dXJuIHNpbmdsZV9zdGVwX2NvbnQocmVncywgYXJncyk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJCS8qIFRoaXMgbWVhbnMgYSB1c2VyIHRocmVhZCBpcyBzaW5nbGUgc3RlcHBpbmcKKwkJCSAqIGEgc3lzdGVtIGNhbGwgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQKKwkJCSAqLworCQkJcmV0dXJuIE5PVElGWV9ET05FOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQlpZiAodXNlcl9tb2RlKHJlZ3MpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bS5jIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCmluZGV4IDhiN2EzY2YuLjQ3OGJjYTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCWt2bV9kZWZlcnJlZF9tbXVfb3AoJmZ0bGIsIHNpemVvZiBmdGxiKTsKIH0KIAotc3RhdGljIHZvaWQga3ZtX3JlbGVhc2VfcHQodTMyIHBmbikKK3N0YXRpYyB2b2lkIGt2bV9yZWxlYXNlX3B0KHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXN0cnVjdCBrdm1fbW11X29wX3JlbGVhc2VfcHQgcnB0ID0gewogCQkuaGVhZGVyLm9wID0gS1ZNX01NVV9PUF9SRUxFQVNFX1BULApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwppbmRleCBkMDJkZWYwLi43NzRhYzQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwpAQCAtNzgsNiArNzgsMzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogSWYgd2UgZG9uJ3QgZG8gdGhhdCwgdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGd1ZXN0CisgKiB3aWxsIGNhbGlicmF0ZSB1bmRlciBoZWF2eSBsb2FkIC0gdGh1cywgZ2V0dGluZyBhIGxvd2VyIGxwaiAtCisgKiBhbmQgZXhlY3V0ZSB0aGUgZGVsYXlzIHRoZW1zZWx2ZXMgd2l0aG91dCBsb2FkLiBUaGlzIGlzIHdyb25nLAorICogYmVjYXVzZSBubyBkZWxheSBsb29wIGNhbiBmaW5pc2ggYmVmb3JlaGFuZC4KKyAqIEFueSBoZXVyaXN0aWNzIGlzIHN1YmplY3QgdG8gZmFpbCwgYmVjYXVzZSB1bHRpbWF0ZWx5LCBhIGxhcmdlCisgKiBwb2xsIG9mIGd1ZXN0cyBjYW4gYmUgcnVubmluZyBhbmQgdHJvdWJsZSBlYWNoIG90aGVyLiBTbyB3ZSBwcmVzZXQKKyAqIGxwaiBoZXJlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGt2bV9nZXRfdHNjX2toeih2b2lkKQoreworCXJldHVybiBwcmVzZXRfbHBqOworfQorCitzdGF0aWMgdm9pZCBrdm1fZ2V0X3ByZXNldF9scGoodm9pZCkKK3sKKwlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqc3JjOworCXVuc2lnbmVkIGxvbmcga2h6OworCXU2NCBscGo7CisKKwlzcmMgPSAmcGVyX2NwdShodl9jbG9jaywgMCk7CisJa2h6ID0gcHZjbG9ja190c2Nfa2h6KHNyYyk7CisKKwlscGogPSAoKHU2NClraHogKiAxMDAwKTsKKwlkb19kaXYobHBqLCBIWik7CisJcHJlc2V0X2xwaiA9IGxwajsKK30KKwogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBrdm1fY2xvY2sgPSB7CiAJLm5hbWUgPSAia3ZtLWNsb2NrIiwKIAkucmVhZCA9IGt2bV9jbG9ja19yZWFkLApAQCAtMTUzLDYgKzE4MSw3IEBACiAJCXB2X3RpbWVfb3BzLmdldF93YWxsY2xvY2sgPSBrdm1fZ2V0X3dhbGxjbG9jazsKIAkJcHZfdGltZV9vcHMuc2V0X3dhbGxjbG9jayA9IGt2bV9zZXRfd2FsbGNsb2NrOwogCQlwdl90aW1lX29wcy5zY2hlZF9jbG9jayA9IGt2bV9jbG9ja19yZWFkOworCQlwdl90aW1lX29wcy5nZXRfdHNjX2toeiA9IGt2bV9nZXRfdHNjX2toejsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkJcHZfYXBpY19vcHMuc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrID0ga3ZtX3NldHVwX3NlY29uZGFyeV9jbG9jazsKICNlbmRpZgpAQCAtMTYzLDYgKzE5Miw3IEBACiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJCW1hY2hpbmVfb3BzLmNyYXNoX3NodXRkb3duICA9IGt2bV9jcmFzaF9zaHV0ZG93bjsKICNlbmRpZgorCQlrdm1fZ2V0X3ByZXNldF9scGooKTsKIAkJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmt2bV9jbG9jayk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2xkdC5jIGIvYXJjaC94ODYva2VybmVsL2xkdC5jCmluZGV4IGI2OGUyMWYuLmVlZTMyYjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9sZHQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbGR0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vbGR0Lmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyB2b2lkIGZsdXNoX2xkdCh2b2lkICpjdXJyZW50X21tKQpAQCAtNTEsNiArNTIsOCBAQAogCW1lbXNldChuZXdsZHQgKyBvbGRzaXplICogTERUX0VOVFJZX1NJWkUsIDAsCiAJICAgICAgIChtaW5jb3VudCAtIG9sZHNpemUpICogTERUX0VOVFJZX1NJWkUpOwogCisJcGFyYXZpcnRfYWxsb2NfbGR0KG5ld2xkdCwgbWluY291bnQpOworCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCS8qIENIRUNLTUU6IERvIHdlIHJlYWxseSBuZWVkIHRoaXMgPyAqLwogCXdtYigpOwpAQCAtNzMsNiArNzYsNyBAQAogI2VuZGlmCiAJfQogCWlmIChvbGRzaXplKSB7CisJCXBhcmF2aXJ0X2ZyZWVfbGR0KG9sZGxkdCwgb2xkc2l6ZSk7CiAJCWlmIChvbGRzaXplICogTERUX0VOVFJZX1NJWkUgPiBQQUdFX1NJWkUpCiAJCQl2ZnJlZShvbGRsZHQpOwogCQllbHNlCkBAIC04NCwxMCArODgsMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfbGR0KG1tX2NvbnRleHRfdCAqbmV3LCBtbV9jb250ZXh0X3QgKm9sZCkKIHsKIAlpbnQgZXJyID0gYWxsb2NfbGR0KG5ldywgb2xkLT5zaXplLCAwKTsKKwlpbnQgaTsKIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCW1lbWNweShuZXctPmxkdCwgb2xkLT5sZHQsIG9sZC0+c2l6ZSAqIExEVF9FTlRSWV9TSVpFKTsKKworCWZvcihpID0gMDsgaSA8IG9sZC0+c2l6ZTsgaSsrKQorCQl3cml0ZV9sZHRfZW50cnkobmV3LT5sZHQsIGksIG9sZC0+bGR0ICsgaSAqIExEVF9FTlRSWV9TSVpFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI0LDYgKzEzMSw3IEBACiAJCWlmIChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCiAJCQljbGVhcl9MRFQoKTsKICNlbmRpZgorCQlwYXJhdmlydF9mcmVlX2xkdChtbS0+Y29udGV4dC5sZHQsIG1tLT5jb250ZXh0LnNpemUpOwogCQlpZiAobW0tPmNvbnRleHQuc2l6ZSAqIExEVF9FTlRSWV9TSVpFID4gUEFHRV9TSVpFKQogCQkJdmZyZWUobW0tPmNvbnRleHQubGR0KTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZS5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTJmYTVjLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKgotICoJSW50ZWwgQ1BVIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIGZvciBMaW51eAotICoKLSAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDA2IFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPgotICoJCSAgICAgIDIwMDYJU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+Ci0gKgotICoJVGhpcyBkcml2ZXIgYWxsb3dzIHRvIHVwZ3JhZGUgbWljcm9jb2RlIG9uIEludGVsIHByb2Nlc3NvcnMKLSAqCWJlbG9uZ2luZyB0byBJQS0zMiBmYW1pbHkgLSBQZW50aXVtUHJvLCBQZW50aXVtIElJLAotICoJUGVudGl1bSBJSUksIFhlb24sIFBlbnRpdW0gNCwgZXRjLgotICoKLSAqCVJlZmVyZW5jZTogU2VjdGlvbiA4LjExIG9mIFZvbHVtZSAzYSwgSUEtMzIgSW50ZWw/IEFyY2hpdGVjdHVyZQotICoJU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsCi0gKglPcmRlciBOdW1iZXIgMjUzNjY4IG9yIGZyZWUgZG93bmxvYWQgZnJvbToKLSAqCi0gKglodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vcGVudGl1bTQvbWFudWFscy8yNTM2NjguaHRtCi0gKgotICoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIGdvIHRvIGh0dHA6Ly93d3cudXJiYW5teXRoLm9yZy9taWNyb2NvZGUKLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCTEuMAkxNiBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KLSAqCQlJbml0aWFsIHJlbGVhc2UuCi0gKgkxLjAxCTE4IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgotICoJCUFkZGVkIHJlYWQoKSBzdXBwb3J0ICsgY2xlYW51cHMuCi0gKgkxLjAyCTIxIEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgotICoJCUFkZGVkICdkZXZpY2UgdHJpbW1pbmcnIHN1cHBvcnQuIG9wZW4oT19XUk9OTFkpIHplcm9lcwotICoJCWFuZCBmcmVlcyB0aGUgc2F2ZWQgY29weSBvZiBhcHBsaWVkIG1pY3JvY29kZS4KLSAqCTEuMDMJMjkgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+Ci0gKgkJTWFkZSB0byB1c2UgZGV2ZnMgKC9kZXYvY3B1L21pY3JvY29kZSkgKyBjbGVhbnVwcy4KLSAqCTEuMDQJMDYgSnVuIDIwMDAsIFNpbW9uIFRyaW1tZXIgPHNpbW9uQHZlcml0YXMuY29tPgotICoJCUFkZGVkIG1pc2MgZGV2aWNlIHN1cHBvcnQgKG5vdyB1c2VzIGJvdGggZGV2ZnMgYW5kIG1pc2MpLgotICoJCUFkZGVkIE1JQ1JPQ09ERV9JT0NGUkVFIGlvY3RsIHRvIGNsZWFyIG1lbW9yeS4KLSAqCTEuMDUJMDkgSnVuIDIwMDAsIFNpbW9uIFRyaW1tZXIgPHNpbW9uQHZlcml0YXMuY29tPgotICoJCU1lc3NhZ2VzIGZvciBlcnJvciBjYXNlcyAobm9uIEludGVsICYgbm8gc3VpdGFibGUgbWljcm9jb2RlKS4KLSAqCTEuMDYJMDMgQXVnIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgotICoJCVJlbW92ZWQgLT5yZWxlYXNlKCkuIFJlbW92ZWQgZXhjbHVzaXZlIG9wZW4gYW5kIHN0YXR1cyBiaXRtYXAuCi0gKgkJQWRkZWQgbWljcm9jb2RlX3J3c2VtIHRvIHNlcmlhbGl6ZSByZWFkKCkvd3JpdGUoKS9pb2N0bCgpLgotICoJCVJlbW92ZWQgZ2xvYmFsIGtlcm5lbCBsb2NrIHVzYWdlLgotICoJMS4wNwkwNyBTZXAgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+Ci0gKgkJV3JpdGUgMCB0byAweDhCIG1zciBhbmQgdGhlbiBjcHVpZCBiZWZvcmUgcmVhZGluZyByZXZpc2lvbiwKLSAqCQlzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gaWYgdGhlcmUgd2VyZSBubyB1cGRhdGUgZG9uZSBieSB0aGUKLSAqCQlCSU9TLiBPdGhlcndpc2UsIHJlYWRpbmcgZnJvbSAweDhCIGdpdmVzIGp1bmsgKHdoaWNoIGhhcHBlbmVkCi0gKgkJdG8gYmUgMCBvbiBteSBtYWNoaW5lIHdoaWNoIGlzIHdoeSBpdCB3b3JrZWQgZXZlbiB3aGVuIEkKLSAqCQlkaXNhYmxlZCB1cGRhdGUgYnkgdGhlIEJJT1MpCi0gKgkJVGhhbmtzIHRvIEVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybWFuQGxueGkuY29tPiBmb3IgdGhlIGZpeC4KLSAqCTEuMDgJMTEgRGVjIDIwMDAsIFJpY2hhcmQgU2NoYWFsIDxyaWNoYXJkLnNjaGFhbEBpbnRlbC5jb20+IGFuZAotICoJCQkgICAgIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgotICoJCUludGVsIFBlbnRpdW0gNCBwcm9jZXNzb3Igc3VwcG9ydCBhbmQgYnVnZml4ZXMuCi0gKgkxLjA5CTMwIE9jdCAyMDAxLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KLSAqCQlCdWdmaXggZm9yIEhUIChIeXBlci1UaHJlYWRpbmcpIGVuYWJsZWQgcHJvY2Vzc29ycwotICoJCXdoZXJlYnkgcHJvY2Vzc29yIHJlc291cmNlcyBhcmUgc2hhcmVkIGJ5IGFsbCBsb2dpY2FsIHByb2Nlc3NvcnMKLSAqCQlpbiBhIHNpbmdsZSBDUFUgcGFja2FnZS4KLSAqCTEuMTAJMjggRmViIDIwMDIgQXNpdCBLIE1hbGxpY2sgPGFzaXQuay5tYWxsaWNrQGludGVsLmNvbT4gYW5kCi0gKgkJVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+LAotICoJCVNlcmlhbGl6ZSB1cGRhdGVzIGFzIHJlcXVpcmVkIG9uIEhUIHByb2Nlc3NvcnMgZHVlIHRvIHNwZWN1bGF0aXZlCi0gKgkJbmF0dXJlIG9mIGltcGxlbWVudGF0aW9uLgotICoJMS4xMQkyMiBNYXIgMjAwMiBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KLSAqCQlGaXggdGhlIHBhbmljIHdoZW4gd3JpdGluZyB6ZXJvLWxlbmd0aCBtaWNyb2NvZGUgY2h1bmsuCi0gKgkxLjEyCTI5IFNlcCAyMDAzIE5pdGluIEthbWJsZSA8bml0aW4uYS5rYW1ibGVAaW50ZWwuY29tPiwKLSAqCQlKdW4gTmFrYWppbWEgPGp1bi5uYWthamltYUBpbnRlbC5jb20+Ci0gKgkJU3VwcG9ydCBmb3IgdGhlIG1pY3JvY29kZSB1cGRhdGVzIGluIHRoZSBuZXcgZm9ybWF0LgotICoJMS4xMwkxMCBPY3QgMjAwMyBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KLSAqCQlSZW1vdmVkIC0+cmVhZCgpIG1ldGhvZCBhbmQgb2Jzb2xldGVkIE1JQ1JPQ09ERV9JT0NGUkVFIGlvY3RsCi0gKgkJYmVjYXVzZSB3ZSBubyBsb25nZXIgaG9sZCBhIGNvcHkgb2YgYXBwbGllZCBtaWNyb2NvZGUKLSAqCQlpbiBrZXJuZWwgbWVtb3J5LgotICoJMS4xNAkyNSBKdW4gMjAwNCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KLSAqCQlGaXggc2lnbWF0Y2goKSBtYWNybyB0byBoYW5kbGUgb2xkIENQVXMgd2l0aCBwZiA9PSAwLgotICoJCVRoYW5rcyB0byBTdHVhcnQgU3dhbGVzIGZvciBwb2ludGluZyBvdXQgdGhpcyBidWcuCi0gKi8KLQotLy8jZGVmaW5lIERFQlVHIC8qIHByX2RlYnVnICovCi0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBDUFUgKElBLTMyKSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0YSIKLQotI2RlZmluZSBERUZBVUxUX1VDT0RFX0RBVEFTSVpFIAkoMjAwMCkgCSAgLyogMjAwMCBieXRlcyAqLwotI2RlZmluZSBNQ19IRUFERVJfU0laRQkJKHNpemVvZiAobWljcm9jb2RlX2hlYWRlcl90KSkgIAkgIC8qIDQ4IGJ5dGVzICovCi0jZGVmaW5lIERFRkFVTFRfVUNPREVfVE9UQUxTSVpFIChERUZBVUxUX1VDT0RFX0RBVEFTSVpFICsgTUNfSEVBREVSX1NJWkUpIC8qIDIwNDggYnl0ZXMgKi8KLSNkZWZpbmUgRVhUX0hFQURFUl9TSVpFCQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUpKSAvKiAyMCBieXRlcyAqLwotI2RlZmluZSBFWFRfU0lHTkFUVVJFX1NJWkUJKHNpemVvZiAoc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSkpIC8qIDEyIGJ5dGVzICovCi0jZGVmaW5lIERXU0laRQkJCShzaXplb2YgKHUzMikpCi0jZGVmaW5lIGdldF90b3RhbHNpemUobWMpIFwKLQkoKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLnRvdGFsc2l6ZSA/IFwKLQkgKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLnRvdGFsc2l6ZSA6IERFRkFVTFRfVUNPREVfVE9UQUxTSVpFKQotI2RlZmluZSBnZXRfZGF0YXNpemUobWMpIFwKLQkoKChtaWNyb2NvZGVfdCAqKW1jKS0+aGRyLmRhdGFzaXplID8gXAotCSAoKG1pY3JvY29kZV90ICopbWMpLT5oZHIuZGF0YXNpemUgOiBERUZBVUxUX1VDT0RFX0RBVEFTSVpFKQotCi0jZGVmaW5lIHNpZ21hdGNoKHMxLCBzMiwgcDEsIHAyKSBcCi0JKCgoczEpID09IChzMikpICYmICgoKHAxKSAmIChwMikpIHx8ICgoKHAxKSA9PSAwKSAmJiAoKHAyKSA9PSAwKSkpKQotCi0jZGVmaW5lIGV4dHRhYmxlX3NpemUoZXQpICgoZXQpLT5jb3VudCAqIEVYVF9TSUdOQVRVUkVfU0laRSArIEVYVF9IRUFERVJfU0laRSkKLQotLyogc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcGh5c2ljYWwgd3JpdGUgdG8gTVNSIDB4NzkgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWljcm9jb2RlX3VwZGF0ZV9sb2NrKTsKLQotLyogbm8gY29uY3VycmVudCAtPndyaXRlKClzIGFyZSBhbGxvd2VkIG9uIC9kZXYvY3B1L21pY3JvY29kZSAqLwotc3RhdGljIERFRklORV9NVVRFWChtaWNyb2NvZGVfbXV0ZXgpOwotCi1zdGF0aWMgc3RydWN0IHVjb2RlX2NwdV9pbmZvIHsKLQlpbnQgdmFsaWQ7Ci0JdW5zaWduZWQgaW50IHNpZzsKLQl1bnNpZ25lZCBpbnQgcGY7Ci0JdW5zaWduZWQgaW50IHJldjsKLQltaWNyb2NvZGVfdCAqbWM7Ci19IHVjb2RlX2NwdV9pbmZvW05SX0NQVVNdOwotCi1zdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvKGludCBjcHVfbnVtKQotewotCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHVfbnVtKTsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKLQl1bnNpZ25lZCBpbnQgdmFsWzJdOwotCi0JLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLwotCUJVR19PTihyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdV9udW0pOwotCXVjaS0+cGYgPSB1Y2ktPnJldiA9IDA7Ci0JdWNpLT5tYyA9IE5VTEw7Ci0JdWNpLT52YWxpZCA9IDE7Ci0KLQlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8IGMtPng4NiA8IDYgfHwKLQkgICAgCWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSUE2NCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIG5vdCBhIGNhcGFibGUgSW50ZWwgIgotCQkJInByb2Nlc3NvclxuIiwgY3B1X251bSk7Ci0JCXVjaS0+dmFsaWQgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JdWNpLT5zaWcgPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7Ci0KLQlpZiAoKGMtPng4Nl9tb2RlbCA+PSA1KSB8fCAoYy0+eDg2ID4gNikpIHsKLQkJLyogZ2V0IHByb2Nlc3NvciBmbGFncyBmcm9tIE1TUiAweDE3ICovCi0JCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCB2YWxbMF0sIHZhbFsxXSk7Ci0JCXVjaS0+cGYgPSAxIDw8ICgodmFsWzFdID4+IDE4KSAmIDcpOwotCX0KLQotCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7Ci0JLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KLQlzeW5jX2NvcmUoKTsKLQkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwotCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB1Y2ktPnJldik7Ci0JcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKLQkJCXVjaS0+c2lnLCB1Y2ktPnBmLCB1Y2ktPnJldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1pY3JvY29kZV91cGRhdGVfbWF0Y2goaW50IGNwdV9udW0sCi0JbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIsIGludCBzaWcsIGludCBwZikKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKLQotCWlmICghc2lnbWF0Y2goc2lnLCB1Y2ktPnNpZywgcGYsIHVjaS0+cGYpCi0JCXx8IG1jX2hlYWRlci0+cmV2IDw9IHVjaS0+cmV2KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtaWNyb2NvZGVfc2FuaXR5X2NoZWNrKHZvaWQgKm1jKQotewotCW1pY3JvY29kZV9oZWFkZXJfdCAqbWNfaGVhZGVyID0gbWM7Ci0Jc3RydWN0IGV4dGVuZGVkX3NpZ3RhYmxlICpleHRfaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlICpleHRfc2lnOwotCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZSwgZGF0YV9zaXplLCBleHRfdGFibGVfc2l6ZTsKLQlpbnQgc3VtLCBvcmlnX3N1bSwgZXh0X3NpZ2NvdW50ID0gMCwgaTsKLQotCXRvdGFsX3NpemUgPSBnZXRfdG90YWxzaXplKG1jX2hlYWRlcik7Ci0JZGF0YV9zaXplID0gZ2V0X2RhdGFzaXplKG1jX2hlYWRlcik7Ci0JaWYgKGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFID4gdG90YWxfc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhICIKLQkJCSJCYWQgZGF0YSBzaXplIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAobWNfaGVhZGVyLT5sZHJ2ZXIgIT0gMSB8fCBtY19oZWFkZXItPmhkcnZlciAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgotCQkJIlVua25vd24gbWljcm9jb2RlIHVwZGF0ZSBmb3JtYXRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZXh0X3RhYmxlX3NpemUgPSB0b3RhbF9zaXplIC0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKTsKLQlpZiAoZXh0X3RhYmxlX3NpemUpIHsKLQkJaWYgKChleHRfdGFibGVfc2l6ZSA8IEVYVF9IRUFERVJfU0laRSkKLQkJIHx8ICgoZXh0X3RhYmxlX3NpemUgLSBFWFRfSEVBREVSX1NJWkUpICUgRVhUX1NJR05BVFVSRV9TSVpFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCi0JCQkJIlNtYWxsIGV4dHRhYmxlIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlleHRfaGVhZGVyID0gbWMgKyBNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZTsKLQkJaWYgKGV4dF90YWJsZV9zaXplICE9IGV4dHRhYmxlX3NpemUoZXh0X2hlYWRlcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgotCQkJCSJCYWQgZXh0dGFibGUgc2l6ZSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWV4dF9zaWdjb3VudCA9IGV4dF9oZWFkZXItPmNvdW50OwotCX0KLQotCS8qIGNoZWNrIGV4dGVuZGVkIHRhYmxlIGNoZWNrc3VtICovCi0JaWYgKGV4dF90YWJsZV9zaXplKSB7Ci0JCWludCBleHRfdGFibGVfc3VtID0gMDsKLQkJaW50ICpleHRfdGFibGVwID0gKGludCAqKWV4dF9oZWFkZXI7Ci0KLQkJaSA9IGV4dF90YWJsZV9zaXplIC8gRFdTSVpFOwotCQl3aGlsZSAoaS0tKQotCQkJZXh0X3RhYmxlX3N1bSArPSBleHRfdGFibGVwW2ldOwotCQlpZiAoZXh0X3RhYmxlX3N1bSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljcm9jb2RlOiBhYm9ydGluZywgIgotCQkJCSJiYWQgZXh0ZW5kZWQgc2lnbmF0dXJlIHRhYmxlIGNoZWNrc3VtXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogY2FsY3VsYXRlIHRoZSBjaGVja3N1bSAqLwotCW9yaWdfc3VtID0gMDsKLQlpID0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKSAvIERXU0laRTsKLQl3aGlsZSAoaS0tKQotCQlvcmlnX3N1bSArPSAoKGludCAqKW1jKVtpXTsKLQlpZiAob3JpZ19zdW0pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGFib3J0aW5nLCBiYWQgY2hlY2tzdW1cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFleHRfdGFibGVfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0JLyogY2hlY2sgZXh0ZW5kZWQgc2lnbmF0dXJlIGNoZWNrc3VtICovCi0JZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7Ci0JCWV4dF9zaWcgPSAodm9pZCAqKWV4dF9oZWFkZXIgKyBFWFRfSEVBREVSX1NJWkUgKwotCQkJICBFWFRfU0lHTkFUVVJFX1NJWkUgKiBpOwotCQlzdW0gPSBvcmlnX3N1bQotCQkJLSAobWNfaGVhZGVyLT5zaWcgKyBtY19oZWFkZXItPnBmICsgbWNfaGVhZGVyLT5ja3N1bSkKLQkJCSsgKGV4dF9zaWctPnNpZyArIGV4dF9zaWctPnBmICsgZXh0X3NpZy0+Y2tzdW0pOwotCQlpZiAoc3VtKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogYWJvcnRpbmcsIGJhZCBjaGVja3N1bVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJldHVybiAwIC0gbm8gdXBkYXRlIGZvdW5kCi0gKiByZXR1cm4gMSAtIGZvdW5kIHVwZGF0ZQotICogcmV0dXJuIDwgMCAtIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X21hY2hpbmdfbWljcm9jb2RlKHZvaWQgKm1jLCBpbnQgY3B1KQotewotCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7Ci0JbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIgPSBtYzsKLQlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZShtY19oZWFkZXIpOwotCWludCBleHRfc2lnY291bnQsIGk7Ci0Jc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSAqZXh0X3NpZzsKLQl2b2lkICpuZXdfbWM7Ci0KLQlpZiAobWljcm9jb2RlX3VwZGF0ZV9tYXRjaChjcHUsIG1jX2hlYWRlciwKLQkJCW1jX2hlYWRlci0+c2lnLCBtY19oZWFkZXItPnBmKSkKLQkJZ290byBmaW5kOwotCi0JaWYgKHRvdGFsX3NpemUgPD0gZ2V0X2RhdGFzaXplKG1jX2hlYWRlcikgKyBNQ19IRUFERVJfU0laRSkKLQkJcmV0dXJuIDA7Ci0KLQlleHRfaGVhZGVyID0gbWMgKyBnZXRfZGF0YXNpemUobWNfaGVhZGVyKSArIE1DX0hFQURFUl9TSVpFOwotCWV4dF9zaWdjb3VudCA9IGV4dF9oZWFkZXItPmNvdW50OwotCWV4dF9zaWcgPSAodm9pZCAqKWV4dF9oZWFkZXIgKyBFWFRfSEVBREVSX1NJWkU7Ci0JZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7Ci0JCWlmIChtaWNyb2NvZGVfdXBkYXRlX21hdGNoKGNwdSwgbWNfaGVhZGVyLAotCQkJCWV4dF9zaWctPnNpZywgZXh0X3NpZy0+cGYpKQotCQkJZ290byBmaW5kOwotCQlleHRfc2lnKys7Ci0JfQotCXJldHVybiAwOwotZmluZDoKLQlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCBmb3VuZCBhIG1hdGNoaW5nIG1pY3JvY29kZSB1cGRhdGUgd2l0aCIKLQkJIiB2ZXJzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdSwgbWNfaGVhZGVyLT5yZXYsdWNpLT5yZXYpOwotCW5ld19tYyA9IHZtYWxsb2ModG90YWxfc2l6ZSk7Ci0JaWYgKCFuZXdfbWMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIGZyZWUgcHJldmlvdXMgdXBkYXRlIGZpbGUgKi8KLQl2ZnJlZSh1Y2ktPm1jKTsKLQotCW1lbWNweShuZXdfbWMsIG1jLCB0b3RhbF9zaXplKTsKLQl1Y2ktPm1jID0gbmV3X21jOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBhcHBseV9taWNyb2NvZGUoaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCB2YWxbMl07Ci0JaW50IGNwdV9udW0gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOwotCi0JLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLwotCUJVR19PTihjcHVfbnVtICE9IGNwdSk7Ci0KLQlpZiAodWNpLT5tYyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKLQotCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KLQl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKLQkJKHVuc2lnbmVkIGxvbmcpIHVjaS0+bWMtPmJpdHMsCi0JCSh1bnNpZ25lZCBsb25nKSB1Y2ktPm1jLT5iaXRzID4+IDE2ID4+IDE2KTsKLQl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwotCi0JLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KLQlzeW5jX2NvcmUoKTsKLQotCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCi0JcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIHZhbFsxXSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKLQlpZiAodmFsWzFdICE9IHVjaS0+bWMtPmhkci5yZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSBmcm9tIHJldmlzaW9uICIKLQkJCSIweCV4IHRvIDB4JXggZmFpbGVkXG4iLCBjcHVfbnVtLCB1Y2ktPnJldiwgdmFsWzFdKTsKLQkJcmV0dXJuOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgZnJvbSByZXZpc2lvbiAiCi0JICAgICAgICIweCV4IHRvIDB4JXgsIGRhdGUgPSAlMDh4IFxuIiwKLQkgICAgICAgY3B1X251bSwgdWNpLT5yZXYsIHZhbFsxXSwgdWNpLT5tYy0+aGRyLmRhdGUpOwotCXVjaS0+cmV2ID0gdmFsWzFdOwotfQotCi0jaWZkZWYgQ09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFCi1zdGF0aWMgdm9pZCBfX3VzZXIgKnVzZXJfYnVmZmVyOwkvKiB1c2VyIGFyZWEgbWljcm9jb2RlIGRhdGEgYnVmZmVyICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHVzZXJfYnVmZmVyX3NpemU7CS8qIGl0J3Mgc2l6ZSAqLwotCi1zdGF0aWMgbG9uZyBnZXRfbmV4dF91Y29kZSh2b2lkICoqbWMsIGxvbmcgb2Zmc2V0KQotewotCW1pY3JvY29kZV9oZWFkZXJfdCBtY19oZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotCi0JLyogTm8gbW9yZSBkYXRhICovCi0JaWYgKG9mZnNldCA+PSB1c2VyX2J1ZmZlcl9zaXplKQotCQlyZXR1cm4gMDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJm1jX2hlYWRlciwgdXNlcl9idWZmZXIgKyBvZmZzZXQsIE1DX0hFQURFUl9TSVpFKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JdG90YWxfc2l6ZSA9IGdldF90b3RhbHNpemUoJm1jX2hlYWRlcik7Ci0JaWYgKG9mZnNldCArIHRvdGFsX3NpemUgPiB1c2VyX2J1ZmZlcl9zaXplKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIHRvdGFsIHNpemUgaW4gbWljcm9jb2RlICIKLQkJCQkiZGF0YSBmaWxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCSptYyA9IHZtYWxsb2ModG90YWxfc2l6ZSk7Ci0JaWYgKCEqbWMpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcigqbWMsIHVzZXJfYnVmZmVyICsgb2Zmc2V0LCB0b3RhbF9zaXplKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOwotCQl2ZnJlZSgqbWMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIG9mZnNldCArIHRvdGFsX3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fbWljcm9jb2RlX3VwZGF0ZSAodm9pZCkKLXsKLQlsb25nIGN1cnNvciA9IDA7Ci0JaW50IGVycm9yID0gMDsKLQl2b2lkICpuZXdfbWMgPSBOVUxMOwotCWludCBjcHU7Ci0JY3B1bWFza190IG9sZDsKLQotCW9sZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQotCXdoaWxlICgoY3Vyc29yID0gZ2V0X25leHRfdWNvZGUoJm5ld19tYywgY3Vyc29yKSkgPiAwKSB7Ci0JCWVycm9yID0gbWljcm9jb2RlX3Nhbml0eV9jaGVjayhuZXdfbWMpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKLQkJLyoKLQkJICogSXQncyBwb3NzaWJsZSB0aGUgZGF0YSBmaWxlIGhhcyBtdWx0aXBsZSBtYXRjaGluZyB1Y29kZSwKLQkJICogbGV0cyBrZWVwIHNlYXJjaGluZyB0aWxsIHRoZSBsYXRlc3QgdmVyc2lvbgotCQkgKi8KLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7Ci0KLQkJCWlmICghdWNpLT52YWxpZCkKLQkJCQljb250aW51ZTsKLQkJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKLQkJCWVycm9yID0gZ2V0X21hY2hpbmdfbWljcm9jb2RlKG5ld19tYywgY3B1KTsKLQkJCWlmIChlcnJvciA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCQlpZiAoZXJyb3IgPT0gMSkKLQkJCQlhcHBseV9taWNyb2NvZGUoY3B1KTsKLQkJfQotCQl2ZnJlZShuZXdfbWMpOwotCX0KLW91dDoKLQlpZiAoY3Vyc29yID4gMCkKLQkJdmZyZWUobmV3X21jKTsKLQlpZiAoY3Vyc29yIDwgMCkKLQkJZXJyb3IgPSBjdXJzb3I7Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJm9sZCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IG1pY3JvY29kZV9vcGVuIChzdHJ1Y3QgaW5vZGUgKnVudXNlZDEsIHN0cnVjdCBmaWxlICp1bnVzZWQyKQotewotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7Ci0JcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOwotfQotCi1zdGF0aWMgc3NpemVfdCBtaWNyb2NvZGVfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpZiAoKGxlbiA+PiBQQUdFX1NISUZUKSA+IG51bV9waHlzcGFnZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IHRvbyBtdWNoIGRhdGEgKG1heCAlbGQgcGFnZXMpXG4iLCBudW1fcGh5c3BhZ2VzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZ2V0X29ubGluZV9jcHVzKCk7Ci0JbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKLQotCXVzZXJfYnVmZmVyID0gKHZvaWQgX191c2VyICopIGJ1ZjsKLQl1c2VyX2J1ZmZlcl9zaXplID0gKGludCkgbGVuOwotCi0JcmV0ID0gZG9fbWljcm9jb2RlX3VwZGF0ZSgpOwotCWlmICghcmV0KQotCQlyZXQgPSAoc3NpemVfdClsZW47Ci0KLQltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7Ci0JcHV0X29ubGluZV9jcHVzKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaWNyb2NvZGVfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLndyaXRlCQk9IG1pY3JvY29kZV93cml0ZSwKLQkub3BlbgkJPSBtaWNyb2NvZGVfb3BlbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtaWNyb2NvZGVfZGV2ID0gewotCS5taW5vcgkJPSBNSUNST0NPREVfTUlOT1IsCi0JLm5hbWUJCT0gIm1pY3JvY29kZSIsCi0JLmZvcHMJCT0gJm1pY3JvY29kZV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWljcm9jb2RlX2Rldl9pbml0ICh2b2lkKQotewotCWludCBlcnJvcjsKLQotCWVycm9yID0gbWlzY19yZWdpc3RlcigmbWljcm9jb2RlX2Rldik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIm1pY3JvY29kZTogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwKLQkJCU1JQ1JPQ09ERV9NSU5PUik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbWljcm9jb2RlX2Rldl9leGl0ICh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmbWljcm9jb2RlX2Rldik7Ci19Ci0KLU1PRFVMRV9BTElBU19NSVNDREVWKE1JQ1JPQ09ERV9NSU5PUik7Ci0jZWxzZQotI2RlZmluZSBtaWNyb2NvZGVfZGV2X2luaXQoKSAwCi0jZGVmaW5lIG1pY3JvY29kZV9kZXZfZXhpdCgpIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGdldF9uZXh0X3Vjb2RlX2Zyb21fYnVmZmVyKHZvaWQgKiptYywgY29uc3QgdTggKmJ1ZiwKLQl1bnNpZ25lZCBsb25nIHNpemUsIGxvbmcgb2Zmc2V0KQotewotCW1pY3JvY29kZV9oZWFkZXJfdCAqbWNfaGVhZGVyOwotCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKLQotCS8qIE5vIG1vcmUgZGF0YSAqLwotCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJcmV0dXJuIDA7Ci0JbWNfaGVhZGVyID0gKG1pY3JvY29kZV9oZWFkZXJfdCAqKShidWYgKyBvZmZzZXQpOwotCXRvdGFsX3NpemUgPSBnZXRfdG90YWxzaXplKG1jX2hlYWRlcik7Ci0KLQlpZiAob2Zmc2V0ICsgdG90YWxfc2l6ZSA+IHNpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKm1jID0gdm1hbGxvYyh0b3RhbF9zaXplKTsKLQlpZiAoISptYykgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbWNweSgqbWMsIGJ1ZiArIG9mZnNldCwgdG90YWxfc2l6ZSk7Ci0JcmV0dXJuIG9mZnNldCArIHRvdGFsX3NpemU7Ci19Ci0KLS8qIGZha2UgZGV2aWNlIGZvciByZXF1ZXN0X2Zpcm13YXJlICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWljcm9jb2RlX3BkZXY7Ci0KLXN0YXRpYyBpbnQgY3B1X3JlcXVlc3RfbWljcm9jb2RlKGludCBjcHUpCi17Ci0JY2hhciBuYW1lWzMwXTsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWNvbnN0IHU4ICpidWY7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCWxvbmcgb2Zmc2V0ID0gMDsKLQlpbnQgZXJyb3I7Ci0Jdm9pZCAqbWM7Ci0KLQkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCi0JQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlzcHJpbnRmKG5hbWUsImludGVsLXVjb2RlLyUwMngtJTAyeC0lMDJ4IiwKLQkJYy0+eDg2LCBjLT54ODZfbW9kZWwsIGMtPng4Nl9tYXNrKTsKLQllcnJvciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBuYW1lLCAmbWljcm9jb2RlX3BkZXYtPmRldik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByX2RlYnVnKCJtaWNyb2NvZGU6IGRhdGEgZmlsZSAlcyBsb2FkIGZhaWxlZFxuIiwgbmFtZSk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JYnVmID0gZmlybXdhcmUtPmRhdGE7Ci0Jc2l6ZSA9IGZpcm13YXJlLT5zaXplOwotCXdoaWxlICgob2Zmc2V0ID0gZ2V0X25leHRfdWNvZGVfZnJvbV9idWZmZXIoJm1jLCBidWYsIHNpemUsIG9mZnNldCkpCi0JCQk+IDApIHsKLQkJZXJyb3IgPSBtaWNyb2NvZGVfc2FuaXR5X2NoZWNrKG1jKTsKLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7Ci0JCWVycm9yID0gZ2V0X21hY2hpbmdfbWljcm9jb2RlKG1jLCBjcHUpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIEl0J3MgcG9zc2libGUgdGhlIGRhdGEgZmlsZSBoYXMgbXVsdGlwbGUgbWF0Y2hpbmcgdWNvZGUsCi0JCSAqIGxldHMga2VlcCBzZWFyY2hpbmcgdGlsbCB0aGUgbGF0ZXN0IHZlcnNpb24KLQkJICovCi0JCWlmIChlcnJvciA9PSAxKSB7Ci0JCQlhcHBseV9taWNyb2NvZGUoY3B1KTsKLQkJCWVycm9yID0gMDsKLQkJfQotCQl2ZnJlZShtYyk7Ci0JfQotCWlmIChvZmZzZXQgPiAwKQotCQl2ZnJlZShtYyk7Ci0JaWYgKG9mZnNldCA8IDApCi0JCWVycm9yID0gb2Zmc2V0OwotCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IGFwcGx5X21pY3JvY29kZV9jaGVja19jcHUoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwotCWNwdW1hc2tfdCBvbGQ7Ci0JdW5zaWduZWQgaW50IHZhbFsyXTsKLQlpbnQgZXJyID0gMDsKLQotCS8qIENoZWNrIGlmIHRoZSBtaWNyb2NvZGUgaXMgYXZhaWxhYmxlICovCi0JaWYgKCF1Y2ktPm1jKQotCQlyZXR1cm4gMDsKLQotCW9sZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmY3B1bWFza19vZl9jcHUoY3B1KSk7Ci0KLQkvKiBDaGVjayBpZiB0aGUgbWljcm9jb2RlIHdlIGhhdmUgaW4gbWVtb3J5IG1hdGNoZXMgdGhlIENQVSAqLwotCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgYy0+eDg2IDwgNiB8fAotCSAgICBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0lBNjQpIHx8IHVjaS0+c2lnICE9IGNwdWlkX2VheCgweDAwMDAwMDAxKSkKLQkJZXJyID0gLUVJTlZBTDsKLQotCWlmICghZXJyICYmICgoYy0+eDg2X21vZGVsID49IDUpIHx8IChjLT54ODYgPiA2KSkpIHsKLQkJLyogZ2V0IHByb2Nlc3NvciBmbGFncyBmcm9tIE1TUiAweDE3ICovCi0JCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCB2YWxbMF0sIHZhbFsxXSk7Ci0JCWlmICh1Y2ktPnBmICE9ICgxIDw8ICgodmFsWzFdID4+IDE4KSAmIDcpKSkKLQkJCWVyciA9IC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFlcnIpIHsKLQkJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKLQkJLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KLQkJc3luY19jb3JlKCk7Ci0JCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCi0JCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB2YWxbMV0pOwotCQlpZiAodWNpLT5yZXYgIT0gdmFsWzFdKQotCQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWVycikKLQkJYXBwbHlfbWljcm9jb2RlKGNwdSk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ291bGQgbm90IGFwcGx5IG1pY3JvY29kZSB0byBDUFUlZDoiCi0JCQkiIHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKLQkJCWNwdSwgdWNpLT5zaWcsIHVjaS0+cGYsIHVjaS0+cmV2KTsKLQotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pY3JvY29kZV9pbml0X2NwdShpbnQgY3B1LCBpbnQgcmVzdW1lKQotewotCWNwdW1hc2tfdCBvbGQ7Ci0Jc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKLQotCW9sZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKLQltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwotCWNvbGxlY3RfY3B1X2luZm8oY3B1KTsKLQlpZiAodWNpLT52YWxpZCAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcgJiYgIXJlc3VtZSkKLQkJY3B1X3JlcXVlc3RfbWljcm9jb2RlKGNwdSk7Ci0JbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOwotfQotCi1zdGF0aWMgdm9pZCBtaWNyb2NvZGVfZmluaV9jcHUoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwotCi0JbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKLQl1Y2ktPnZhbGlkID0gMDsKLQl2ZnJlZSh1Y2ktPm1jKTsKLQl1Y2ktPm1jID0gTlVMTDsKLQltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlbG9hZF9zdG9yZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KQotewotCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBkZXYtPmlkOwotCWNoYXIgKmVuZDsKLQl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZCwgMCk7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGNwdSA9IGRldi0+aWQ7Ci0KLQlpZiAoZW5kID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhbCA9PSAxKSB7Ci0JCWNwdW1hc2tfdCBvbGQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0KLQkJZ2V0X29ubGluZV9jcHVzKCk7Ci0JCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKLQotCQltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwotCQlpZiAodWNpLT52YWxpZCkKLQkJCWVyciA9IGNwdV9yZXF1ZXN0X21pY3JvY29kZShjcHUpOwotCQltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7Ci0JCXB1dF9vbmxpbmVfY3B1cygpOwotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmb2xkKTsKLQl9Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gc3o7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAotCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgZGV2LT5pZDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHVjaS0+cmV2KTsKLX0KLQotc3RhdGljIHNzaXplX3QgcGZfc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAotCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgZGV2LT5pZDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHVjaS0+cGYpOwotfQotCi1zdGF0aWMgU1lTREVWX0FUVFIocmVsb2FkLCAwMjAwLCBOVUxMLCByZWxvYWRfc3RvcmUpOwotc3RhdGljIFNZU0RFVl9BVFRSKHZlcnNpb24sIDA0MDAsIHZlcnNpb25fc2hvdywgTlVMTCk7Ci1zdGF0aWMgU1lTREVWX0FUVFIocHJvY2Vzc29yX2ZsYWdzLCAwNDAwLCBwZl9zaG93LCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1jX2RlZmF1bHRfYXR0cnNbXSA9IHsKLQkmYXR0cl9yZWxvYWQuYXR0ciwKLQkmYXR0cl92ZXJzaW9uLmF0dHIsCi0JJmF0dHJfcHJvY2Vzc29yX2ZsYWdzLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWNfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBtY19kZWZhdWx0X2F0dHJzLAotCS5uYW1lID0gIm1pY3JvY29kZSIsCi19OwotCi1zdGF0aWMgaW50IF9fbWNfc3lzZGV2X2FkZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldiwgaW50IHJlc3VtZSkKLXsKLQlpbnQgZXJyLCBjcHUgPSBzeXNfZGV2LT5pZDsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwotCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAwOwotCi0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7Ci0JbWVtc2V0KHVjaSwgMCwgc2l6ZW9mKCp1Y2kpKTsKLQotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQltaWNyb2NvZGVfaW5pdF9jcHUoY3B1LCByZXN1bWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWNfc3lzZGV2X2FkZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKLXsKLQlyZXR1cm4gX19tY19zeXNkZXZfYWRkKHN5c19kZXYsIDApOwotfQotCi1zdGF0aWMgaW50IG1jX3N5c2Rldl9yZW1vdmUoc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXYpCi17Ci0JaW50IGNwdSA9IHN5c19kZXYtPmlkOwotCi0JaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiAwOwotCi0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgcmVtb3ZlZFxuIiwgY3B1KTsKLQltaWNyb2NvZGVfZmluaV9jcHUoY3B1KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtY19zeXNkZXZfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCi17Ci0JaW50IGNwdSA9IGRldi0+aWQ7Ci0KLQlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKLQkJcmV0dXJuIDA7Ci0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgcmVzdW1lZFxuIiwgY3B1KTsKLQkvKiBvbmx5IENQVSAwIHdpbGwgYXBwbHkgdWNvZGUgaGVyZSAqLwotCWFwcGx5X21pY3JvY29kZSgwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIG1jX3N5c2Rldl9kcml2ZXIgPSB7Ci0JLmFkZCA9IG1jX3N5c2Rldl9hZGQsCi0JLnJlbW92ZSA9IG1jX3N5c2Rldl9yZW1vdmUsCi0JLnJlc3VtZSA9IG1jX3N5c2Rldl9yZXN1bWUsCi19OwotCi1zdGF0aWMgX19jcHVpbml0IGludAotbWNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2OwotCi0Jc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JCS8qIFRoZSBDUFUgcmVmdXNlZCB0byBjb21lIHVwIGR1cmluZyBhIHN5c3RlbSByZXN1bWUgKi8KLQkJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJbWNfc3lzZGV2X2FkZChzeXNfZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJLyogU3lzdGVtLXdpZGUgcmVzdW1lIGlzIGluIHByb2dyZXNzLCB0cnkgdG8gYXBwbHkgbWljcm9jb2RlICovCi0JCWlmIChhcHBseV9taWNyb2NvZGVfY2hlY2tfY3B1KGNwdSkpIHsKLQkJCS8qIFRoZSBhcHBsaWNhdGlvbiBvZiBtaWNyb2NvZGUgZmFpbGVkICovCi0JCQltaWNyb2NvZGVfZmluaV9jcHUoY3B1KTsKLQkJCV9fbWNfc3lzZGV2X2FkZChzeXNfZGV2LCAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogRmFpbGVkIHRvIGNyZWF0ZSB0aGUgc3lzZnMgIgotCQkJCSJncm91cCBmb3IgQ1BVJWRcbiIsIGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJbWNfc3lzZGV2X3JlbW92ZShzeXNfZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKLQkJLyogU3VzcGVuZCBpcyBpbiBwcm9ncmVzcywgb25seSByZW1vdmUgdGhlIGludGVyZmFjZSAqLwotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19yZWZkYXRhIG1jX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG1jX2NwdV9jYWxsYmFjaywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1pY3JvY29kZV9pbml0ICh2b2lkKQotewotCWludCBlcnJvcjsKLQotCXByaW50ayhLRVJOX0lORk8KLQkJIklBLTMyIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTiAiIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+XG4iKTsKLQotCWVycm9yID0gbWljcm9jb2RlX2Rldl9pbml0KCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0JbWljcm9jb2RlX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJtaWNyb2NvZGUiLCAtMSwKLQkJCQkJCQkgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihtaWNyb2NvZGVfcGRldikpIHsKLQkJbWljcm9jb2RlX2Rldl9leGl0KCk7Ci0JCXJldHVybiBQVFJfRVJSKG1pY3JvY29kZV9wZGV2KTsKLQl9Ci0KLQlnZXRfb25saW5lX2NwdXMoKTsKLQllcnJvciA9IHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKLQlpZiAoZXJyb3IpIHsKLQkJbWljcm9jb2RlX2Rldl9leGl0KCk7Ci0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1pY3JvY29kZV9wZGV2KTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNfY3B1X25vdGlmaWVyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9leGl0ICh2b2lkKQotewotCW1pY3JvY29kZV9kZXZfZXhpdCgpOwotCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7Ci0KLQlnZXRfb25saW5lX2NwdXMoKTsKLQlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1pY3JvY29kZV9wZGV2KTsKLX0KLQotbW9kdWxlX2luaXQobWljcm9jb2RlX2luaXQpCi1tb2R1bGVfZXhpdChtaWNyb2NvZGVfZXhpdCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWY4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogIEFNRCBDUFUgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIgZm9yIExpbnV4CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IEFkdmFuY2VkIE1pY3JvIERldmljZXMgSW5jLgorICoKKyAqICBBdXRob3I6IFBldGVyIE9ydWJhIDxwZXRlci5vcnViYUBhbWQuY29tPgorICoKKyAqICBCYXNlZCBvbiB3b3JrIGJ5OgorICogIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPgorICoKKyAqICBUaGlzIGRyaXZlciBhbGxvd3MgdG8gdXBncmFkZSBtaWNyb2NvZGUgb24gQU1ECisgKiAgZmFtaWx5IDB4MTAgYW5kIDB4MTEgcHJvY2Vzc29ycy4KKyAqCisgKiAgTGljZW5zZWQgdW50ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIHZlcnNpb24gMi4gU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21pY3JvY29kZS5oPgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFNRCBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGV0ZXIgT3J1YmEgPHBldGVyLm9ydWJhQGFtZC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKKyNkZWZpbmUgVUNPREVfTUFHSUMgICAgICAgICAgICAgICAgMHgwMDQxNGQ0NAorI2RlZmluZSBVQ09ERV9FUVVJVl9DUFVfVEFCTEVfVFlQRSAweDAwMDAwMDAwCisjZGVmaW5lIFVDT0RFX1VDT0RFX1RZUEUgICAgICAgICAgIDB4MDAwMDAwMDEKKworc3RydWN0IGVxdWl2X2NwdV9lbnRyeSB7CisJdW5zaWduZWQgaW50IGluc3RhbGxlZF9jcHU7CisJdW5zaWduZWQgaW50IGZpeGVkX2VycmF0YV9tYXNrOworCXVuc2lnbmVkIGludCBmaXhlZF9lcnJhdGFfY29tcGFyZTsKKwl1bnNpZ25lZCBpbnQgZXF1aXZfY3B1OworfTsKKworc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfYW1kIHsKKwl1bnNpZ25lZCBpbnQgIGRhdGFfY29kZTsKKwl1bnNpZ25lZCBpbnQgIHBhdGNoX2lkOworCXVuc2lnbmVkIGNoYXIgbWNfcGF0Y2hfZGF0YV9pZFsyXTsKKwl1bnNpZ25lZCBjaGFyIG1jX3BhdGNoX2RhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgaW5pdF9mbGFnOworCXVuc2lnbmVkIGludCAgbWNfcGF0Y2hfZGF0YV9jaGVja3N1bTsKKwl1bnNpZ25lZCBpbnQgIG5iX2Rldl9pZDsKKwl1bnNpZ25lZCBpbnQgIHNiX2Rldl9pZDsKKwl1bnNpZ25lZCBjaGFyIHByb2Nlc3Nvcl9yZXZfaWRbMl07CisJdW5zaWduZWQgY2hhciBuYl9yZXZfaWQ7CisJdW5zaWduZWQgY2hhciBzYl9yZXZfaWQ7CisJdW5zaWduZWQgY2hhciBiaW9zX2FwaV9yZXY7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDFbM107CisJdW5zaWduZWQgaW50ICBtYXRjaF9yZWdbOF07Cit9OworCitzdHJ1Y3QgbWljcm9jb2RlX2FtZCB7CisJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfYW1kIGhkcjsKKwl1bnNpZ25lZCBpbnQgbXBiWzBdOworfTsKKworI2RlZmluZSBVQ09ERV9NQVhfU0laRSAgICAgICAgICAoMjA0OCkKKyNkZWZpbmUgREVGQVVMVF9VQ09ERV9EQVRBU0laRQkoODk2KQorI2RlZmluZSBNQ19IRUFERVJfU0laRQkJKHNpemVvZihzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9hbWQpKQorI2RlZmluZSBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSAoREVGQVVMVF9VQ09ERV9EQVRBU0laRSArIE1DX0hFQURFUl9TSVpFKQorI2RlZmluZSBEV1NJWkUJCQkoc2l6ZW9mKHUzMikpCisvKiBGb3Igbm93IHdlIHN1cHBvcnQgYSBmaXhlZCB1Y29kZSB0b3RhbCBzaXplIG9ubHkgKi8KKyNkZWZpbmUgZ2V0X3RvdGFsc2l6ZShtYykgXAorCSgoKChzdHJ1Y3QgbWljcm9jb2RlX2FtZCAqKW1jKS0+aGRyLm1jX3BhdGNoX2RhdGFfbGVuICogMjgpIFwKKwkgKyBNQ19IRUFERVJfU0laRSkKKworLyogc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcGh5c2ljYWwgd3JpdGUgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWljcm9jb2RlX3VwZGF0ZV9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKmVxdWl2X2NwdV90YWJsZTsKKworc3RhdGljIGludCBjb2xsZWN0X2NwdV9pbmZvX2FtZChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3NpZykKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKKworCW1lbXNldChjc2lnLCAwLCBzaXplb2YoKmNzaWcpKTsKKworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EIHx8IGMtPng4NiA8IDB4MTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIG5vdCBhIGNhcGFibGUgQU1EIHByb2Nlc3NvclxuIiwKKwkJICAgICAgIGNwdSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhc20gdm9sYXRpbGUoIm1vdmwgJTEsICUlZWN4OyByZG1zciIKKwkJICAgICA6ICI9YSIgKGNzaWctPnJldikKKwkJICAgICA6ICJpIiAoMHgwMDAwMDA4QikgOiAiZWN4Iik7CisKKwlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IGNvbGxlY3RfY3B1X2luZm9fYW1kIDogcGF0Y2hfaWQ9MHgleFxuIiwKKwkJY3NpZy0+cmV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tYXRjaGluZ19taWNyb2NvZGUoaW50IGNwdSwgdm9pZCAqbWMsIGludCByZXYpCit7CisJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfYW1kICptY19oZWFkZXIgPSBtYzsKKwlzdHJ1Y3QgcGNpX2RldiAqbmJfcGNpX2RldiwgKnNiX3BjaV9kZXY7CisJdW5zaWduZWQgaW50IGN1cnJlbnRfY3B1X2lkOworCXVuc2lnbmVkIGludCBlcXVpdl9jcHVfaWQgPSAweDAwOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCUJVR19PTihlcXVpdl9jcHVfdGFibGUgPT0gTlVMTCk7CisJY3VycmVudF9jcHVfaWQgPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7CisKKwl3aGlsZSAoZXF1aXZfY3B1X3RhYmxlW2ldLmluc3RhbGxlZF9jcHUgIT0gMCkgeworCQlpZiAoY3VycmVudF9jcHVfaWQgPT0gZXF1aXZfY3B1X3RhYmxlW2ldLmluc3RhbGxlZF9jcHUpIHsKKwkJCWVxdWl2X2NwdV9pZCA9IGVxdWl2X2NwdV90YWJsZVtpXS5lcXVpdl9jcHU7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCisJaWYgKCFlcXVpdl9jcHVfaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIGNwdV9pZCAiCisJCSAgICAgICAibm90IGZvdW5kIGluIGVxdWl2YWxlbnQgY3B1IHRhYmxlIFxuIiwgY3B1KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChtY19oZWFkZXItPnByb2Nlc3Nvcl9yZXZfaWRbMF0pICE9IChlcXVpdl9jcHVfaWQgJiAweGZmKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJtaWNyb2NvZGU6IENQVSVkIHBhdGNoIGRvZXMgbm90IG1hdGNoICIKKwkJCSIocGF0Y2ggaXMgJXgsIGNwdSBleHRlbmRlZCBpcyAleCkgXG4iLAorCQkJY3B1LCBtY19oZWFkZXItPnByb2Nlc3Nvcl9yZXZfaWRbMF0sCisJCQkoZXF1aXZfY3B1X2lkICYgMHhmZikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKG1jX2hlYWRlci0+cHJvY2Vzc29yX3Jldl9pZFsxXSkgIT0gKChlcXVpdl9jcHVfaWQgPj4gMTYpICYgMHhmZikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHBhdGNoIGRvZXMgbm90IG1hdGNoICIKKwkJCSIocGF0Y2ggaXMgJXgsIGNwdSBiYXNlIGlkIGlzICV4KSBcbiIsCisJCQljcHUsIG1jX2hlYWRlci0+cHJvY2Vzc29yX3Jldl9pZFsxXSwKKwkJCSgoZXF1aXZfY3B1X2lkID4+IDE2KSAmIDB4ZmYpKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB1Y29kZSBtYXkgYmUgbm9ydGhicmlkZ2Ugc3BlY2lmaWMgKi8KKwlpZiAobWNfaGVhZGVyLT5uYl9kZXZfaWQpIHsKKwkJbmJfcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELAorCQkJCQkgICAgKG1jX2hlYWRlci0+bmJfZGV2X2lkICYgMHhmZiksCisJCQkJCSAgICBOVUxMKTsKKwkJaWYgKCghbmJfcGNpX2RldikgfHwKKwkJICAgIChtY19oZWFkZXItPm5iX3Jldl9pZCAhPSBuYl9wY2lfZGV2LT5yZXZpc2lvbikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBOQiBtaXNtYXRjaCBcbiIsIGNwdSk7CisJCQlwY2lfZGV2X3B1dChuYl9wY2lfZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCXBjaV9kZXZfcHV0KG5iX3BjaV9kZXYpOworCX0KKworCS8qIHVjb2RlIG1heSBiZSBzb3V0aGJyaWRnZSBzcGVjaWZpYyAqLworCWlmIChtY19oZWFkZXItPnNiX2Rldl9pZCkgeworCQlzYl9wY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsCisJCQkJCSAgICAobWNfaGVhZGVyLT5zYl9kZXZfaWQgJiAweGZmKSwKKwkJCQkJICAgIE5VTEwpOworCQlpZiAoKCFzYl9wY2lfZGV2KSB8fAorCQkgICAgKG1jX2hlYWRlci0+c2JfcmV2X2lkICE9IHNiX3BjaV9kZXYtPnJldmlzaW9uKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIFNCIG1pc21hdGNoIFxuIiwgY3B1KTsKKwkJCXBjaV9kZXZfcHV0KHNiX3BjaV9kZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGNpX2Rldl9wdXQoc2JfcGNpX2Rldik7CisJfQorCisJaWYgKG1jX2hlYWRlci0+cGF0Y2hfaWQgPD0gcmV2KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9taWNyb2NvZGVfYW1kKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZWF4LCBlZHg7CisJdW5zaWduZWQgaW50IHJldjsKKwlpbnQgY3B1X251bSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJc3RydWN0IG1pY3JvY29kZV9hbWQgKm1jX2FtZCA9IHVjaS0+bWM7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLworCUJVR19PTihjcHVfbnVtICE9IGNwdSk7CisKKwlpZiAobWNfYW1kID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykmbWNfYW1kLT5oZHIuZGF0YV9jb2RlOworCWVkeCA9ICh1bnNpZ25lZCBpbnQpKCgodW5zaWduZWQgbG9uZyl1cHBlcl8zMl9iaXRzKGFkZHIpKSk7CisJZWF4ID0gKHVuc2lnbmVkIGludCkoKCh1bnNpZ25lZCBsb25nKWxvd2VyXzMyX2JpdHMoYWRkcikpKTsKKworCWFzbSB2b2xhdGlsZSgibW92bCAlMCwgJSVlY3g7IHdybXNyIiA6CisJCSAgICAgOiAiaSIgKDB4YzAwMTAwMjApLCAiYSIgKGVheCksICJkIiAoZWR4KSA6ICJlY3giKTsKKworCS8qIGdldCBwYXRjaCBpZCBhZnRlciBwYXRjaGluZyAqLworCWFzbSB2b2xhdGlsZSgibW92bCAlMSwgJSVlY3g7IHJkbXNyIgorCQkgICAgIDogIj1hIiAocmV2KQorCQkgICAgIDogImkiICgweDAwMDAwMDhCKSA6ICJlY3giKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOworCisJLyogY2hlY2sgY3VycmVudCBwYXRjaCBpZCBhbmQgcGF0Y2gncyBpZCBmb3IgbWF0Y2ggKi8KKwlpZiAocmV2ICE9IG1jX2FtZC0+aGRyLnBhdGNoX2lkKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGUgZnJvbSByZXZpc2lvbiAiCisJCSAgICAgICAiMHgleCB0byAweCV4IGZhaWxlZFxuIiwgY3B1X251bSwKKwkJICAgICAgIG1jX2FtZC0+aGRyLnBhdGNoX2lkLCByZXYpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGVkIGZyb20gcmV2aXNpb24gIgorCSAgICAgICAiMHgleCB0byAweCV4IFxuIiwKKwkgICAgICAgY3B1X251bSwgdWNpLT5jcHVfc2lnLnJldiwgbWNfYW1kLT5oZHIucGF0Y2hfaWQpOworCisJdWNpLT5jcHVfc2lnLnJldiA9IHJldjsKK30KKworc3RhdGljIHZvaWQgKiBnZXRfbmV4dF91Y29kZSh1OCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCWludCAoKmdldF91Y29kZV9kYXRhKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSwKKwkJCXVuc2lnbmVkIGludCAqbWNfc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZTsKKyNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX1NFQ1RJT05fSERSCTgKKwl1OCBzZWN0aW9uX2hkcltVQ09ERV9DT05UQUlORVJfU0VDVElPTl9IRFJdOworCXZvaWQgKm1jOworCisJaWYgKGdldF91Y29kZV9kYXRhKHNlY3Rpb25faGRyLCBidWYsIFVDT0RFX0NPTlRBSU5FUl9TRUNUSU9OX0hEUikpCisJCXJldHVybiBOVUxMOworCisJaWYgKHNlY3Rpb25faGRyWzBdICE9IFVDT0RFX1VDT0RFX1RZUEUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCisJCSAgICAgICAiV3JvbmcgbWljcm9jb2RlIHBheWxvYWQgdHlwZSBmaWVsZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXRvdGFsX3NpemUgPSAodW5zaWduZWQgbG9uZykgKHNlY3Rpb25faGRyWzRdICsgKHNlY3Rpb25faGRyWzVdIDw8IDgpKTsKKworCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogc2l6ZSAldSwgdG90YWxfc2l6ZSAldVxuIiwKKwkJc2l6ZSwgdG90YWxfc2l6ZSk7CisKKwlpZiAodG90YWxfc2l6ZSA+IHNpemUgfHwgdG90YWxfc2l6ZSA+IFVDT0RFX01BWF9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1jID0gdm1hbGxvYyhVQ09ERV9NQVhfU0laRSk7CisJaWYgKG1jKSB7CisJCW1lbXNldChtYywgMCwgVUNPREVfTUFYX1NJWkUpOworCQlpZiAoZ2V0X3Vjb2RlX2RhdGEobWMsIGJ1ZiArIFVDT0RFX0NPTlRBSU5FUl9TRUNUSU9OX0hEUiwgdG90YWxfc2l6ZSkpIHsKKwkJCXZmcmVlKG1jKTsKKwkJCW1jID0gTlVMTDsKKwkJfSBlbHNlCisJCQkqbWNfc2l6ZSA9IHRvdGFsX3NpemUgKyBVQ09ERV9DT05UQUlORVJfU0VDVElPTl9IRFI7CisJfQorI3VuZGVmIFVDT0RFX0NPTlRBSU5FUl9TRUNUSU9OX0hEUgorCXJldHVybiBtYzsKK30KKworCitzdGF0aWMgaW50IGluc3RhbGxfZXF1aXZfY3B1X3RhYmxlKHU4ICpidWYsCisJCWludCAoKmdldF91Y29kZV9kYXRhKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSkKK3sKKyNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFCTEyCisJdTggKmNvbnRhaW5lcl9oZHJbVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgKmJ1Zl9wb3MgPSAodW5zaWduZWQgaW50ICopY29udGFpbmVyX2hkcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlpZiAoZ2V0X3Vjb2RlX2RhdGEoJmNvbnRhaW5lcl9oZHIsIGJ1ZiwgVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSkKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gYnVmX3Bvc1syXTsKKworCWlmIChidWZfcG9zWzFdICE9IFVDT0RFX0VRVUlWX0NQVV9UQUJMRV9UWVBFIHx8ICFzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgorCQkgICAgICAgIldyb25nIG1pY3JvY29kZSBlcXVpdmFsbmV0IGNwdSB0YWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWVxdWl2X2NwdV90YWJsZSA9IChzdHJ1Y3QgZXF1aXZfY3B1X2VudHJ5ICopIHZtYWxsb2Moc2l6ZSk7CisJaWYgKCFlcXVpdl9jcHVfdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVxdWl2IENQVSB0YWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWJ1ZiArPSBVQ09ERV9DT05UQUlORVJfSEVBREVSX1NJWkU7CisJaWYgKGdldF91Y29kZV9kYXRhKGVxdWl2X2NwdV90YWJsZSwgYnVmLCBzaXplKSkgeworCQl2ZnJlZShlcXVpdl9jcHVfdGFibGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc2l6ZSArIFVDT0RFX0NPTlRBSU5FUl9IRUFERVJfU0laRTsgLyogYWRkIGhlYWRlciBsZW5ndGggKi8KKyN1bmRlZiBVQ09ERV9DT05UQUlORVJfSEVBREVSX1NJWkUKK30KKworc3RhdGljIHZvaWQgZnJlZV9lcXVpdl9jcHVfdGFibGUodm9pZCkKK3sKKwlpZiAoZXF1aXZfY3B1X3RhYmxlKSB7CisJCXZmcmVlKGVxdWl2X2NwdV90YWJsZSk7CisJCWVxdWl2X2NwdV90YWJsZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGdlbmVyaWNfbG9hZF9taWNyb2NvZGUoaW50IGNwdSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisJCWludCAoKmdldF91Y29kZV9kYXRhKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSkKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCXU4ICp1Y29kZV9wdHIgPSBkYXRhLCAqbmV3X21jID0gTlVMTCwgKm1jOworCWludCBuZXdfcmV2ID0gdWNpLT5jcHVfc2lnLnJldjsKKwl1bnNpZ25lZCBpbnQgbGVmdG92ZXI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlvZmZzZXQgPSBpbnN0YWxsX2VxdWl2X2NwdV90YWJsZSh1Y29kZV9wdHIsIGdldF91Y29kZV9kYXRhKTsKKwlpZiAoIW9mZnNldCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogaW5zdGFsbGluZyBlcXVpdmFsZW50IGNwdSB0YWJsZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Y29kZV9wdHIgKz0gb2Zmc2V0OworCWxlZnRvdmVyID0gc2l6ZSAtIG9mZnNldDsKKworCXdoaWxlIChsZWZ0b3ZlcikgeworCQl1bnNpZ25lZCBpbnQgdW5pbml0aWFsaXplZF92YXIobWNfc2l6ZSk7CisJCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqbWNfaGVhZGVyOworCisJCW1jID0gZ2V0X25leHRfdWNvZGUodWNvZGVfcHRyLCBsZWZ0b3ZlciwgZ2V0X3Vjb2RlX2RhdGEsICZtY19zaXplKTsKKwkJaWYgKCFtYykKKwkJCWJyZWFrOworCisJCW1jX2hlYWRlciA9IChzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9hbWQgKiltYzsKKwkJaWYgKGdldF9tYXRjaGluZ19taWNyb2NvZGUoY3B1LCBtYywgbmV3X3JldikpIHsKKwkJCWlmIChuZXdfbWMpCisJCQkJdmZyZWUobmV3X21jKTsKKwkJCW5ld19yZXYgPSBtY19oZWFkZXItPnBhdGNoX2lkOworCQkJbmV3X21jICA9IG1jOworCQl9IGVsc2UgCisJCQl2ZnJlZShtYyk7CisKKwkJdWNvZGVfcHRyICs9IG1jX3NpemU7CisJCWxlZnRvdmVyICAtPSBtY19zaXplOworCX0KKworCWlmIChuZXdfbWMpIHsKKwkJaWYgKCFsZWZ0b3ZlcikgeworCQkJaWYgKHVjaS0+bWMpCisJCQkJdmZyZWUodWNpLT5tYyk7CisJCQl1Y2ktPm1jID0gbmV3X21jOworCQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGgiCisJCQkJIiB2ZXJzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsCisJCQkJY3B1LCBuZXdfcmV2LCB1Y2ktPmNwdV9zaWcucmV2KTsKKwkJfSBlbHNlCisJCQl2ZnJlZShuZXdfbWMpOworCX0KKworCWZyZWVfZXF1aXZfY3B1X3RhYmxlKCk7CisKKwlyZXR1cm4gKGludClsZWZ0b3ZlcjsKK30KKworc3RhdGljIGludCBnZXRfdWNvZGVfZncodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQoreworCW1lbWNweSh0bywgZnJvbSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWNvbnN0IGNoYXIgKmZ3X25hbWUgPSAiYW1kLXVjb2RlL21pY3JvY29kZV9hbWQuYmluIjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCWludCByZXQ7CisKKwkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCisJQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBmd19uYW1lLCBkZXZpY2UpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IHVjb2RlIGRhdGEgZmlsZSAlcyBsb2FkIGZhaWxlZFxuIiwgZndfbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkKilmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUsCisJCQkmZ2V0X3Vjb2RlX2Z3KTsKKworCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X21pY3JvY29kZV91c2VyKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY3JvY29kZTogQU1EIG1pY3JvY29kZSB1cGRhdGUgdmlhIC9kZXYvY3B1L21pY3JvY29kZSIKKwkJCSJpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvY29kZV9maW5pX2NwdV9hbWQoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCisJdmZyZWUodWNpLT5tYyk7CisJdWNpLT5tYyA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWljcm9jb2RlX29wcyBtaWNyb2NvZGVfYW1kX29wcyA9IHsKKwkucmVxdWVzdF9taWNyb2NvZGVfdXNlciAgICAgICAgICAgPSByZXF1ZXN0X21pY3JvY29kZV91c2VyLAorCS5yZXF1ZXN0X21pY3JvY29kZV9mdyAgICAgICAgICAgICA9IHJlcXVlc3RfbWljcm9jb2RlX2Z3LAorCS5jb2xsZWN0X2NwdV9pbmZvICAgICAgICAgICAgICAgICA9IGNvbGxlY3RfY3B1X2luZm9fYW1kLAorCS5hcHBseV9taWNyb2NvZGUgICAgICAgICAgICAgICAgICA9IGFwcGx5X21pY3JvY29kZV9hbWQsCisJLm1pY3JvY29kZV9maW5pX2NwdSAgICAgICAgICAgICAgID0gbWljcm9jb2RlX2ZpbmlfY3B1X2FtZCwKK307CisKK3N0cnVjdCBtaWNyb2NvZGVfb3BzICogX19pbml0IGluaXRfYW1kX21pY3JvY29kZSh2b2lkKQoreworCXJldHVybiAmbWljcm9jb2RlX2FtZF9vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqCUludGVsIENQVSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciBmb3IgTGludXgKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4KKyAqCQkgICAgICAyMDA2CVNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgorICoKKyAqCVRoaXMgZHJpdmVyIGFsbG93cyB0byB1cGdyYWRlIG1pY3JvY29kZSBvbiBJbnRlbCBwcm9jZXNzb3JzCisgKgliZWxvbmdpbmcgdG8gSUEtMzIgZmFtaWx5IC0gUGVudGl1bVBybywgUGVudGl1bSBJSSwKKyAqCVBlbnRpdW0gSUlJLCBYZW9uLCBQZW50aXVtIDQsIGV0Yy4KKyAqCisgKglSZWZlcmVuY2U6IFNlY3Rpb24gOC4xMSBvZiBWb2x1bWUgM2EsIElBLTMyIEludGVsPyBBcmNoaXRlY3R1cmUKKyAqCVNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbAorICoJT3JkZXIgTnVtYmVyIDI1MzY2OCBvciBmcmVlIGRvd25sb2FkIGZyb206CisgKgorICoJaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL3BlbnRpdW00L21hbnVhbHMvMjUzNjY4Lmh0bQorICoKKyAqCUZvciBtb3JlIGluZm9ybWF0aW9uLCBnbyB0byBodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkxLjAJMTYgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJSW5pdGlhbCByZWxlYXNlLgorICoJMS4wMQkxOCBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlBZGRlZCByZWFkKCkgc3VwcG9ydCArIGNsZWFudXBzLgorICoJMS4wMgkyMSBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlBZGRlZCAnZGV2aWNlIHRyaW1taW5nJyBzdXBwb3J0LiBvcGVuKE9fV1JPTkxZKSB6ZXJvZXMKKyAqCQlhbmQgZnJlZXMgdGhlIHNhdmVkIGNvcHkgb2YgYXBwbGllZCBtaWNyb2NvZGUuCisgKgkxLjAzCTI5IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCU1hZGUgdG8gdXNlIGRldmZzICgvZGV2L2NwdS9taWNyb2NvZGUpICsgY2xlYW51cHMuCisgKgkxLjA0CTA2IEp1biAyMDAwLCBTaW1vbiBUcmltbWVyIDxzaW1vbkB2ZXJpdGFzLmNvbT4KKyAqCQlBZGRlZCBtaXNjIGRldmljZSBzdXBwb3J0IChub3cgdXNlcyBib3RoIGRldmZzIGFuZCBtaXNjKS4KKyAqCQlBZGRlZCBNSUNST0NPREVfSU9DRlJFRSBpb2N0bCB0byBjbGVhciBtZW1vcnkuCisgKgkxLjA1CTA5IEp1biAyMDAwLCBTaW1vbiBUcmltbWVyIDxzaW1vbkB2ZXJpdGFzLmNvbT4KKyAqCQlNZXNzYWdlcyBmb3IgZXJyb3IgY2FzZXMgKG5vbiBJbnRlbCAmIG5vIHN1aXRhYmxlIG1pY3JvY29kZSkuCisgKgkxLjA2CTAzIEF1ZyAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlSZW1vdmVkIC0+cmVsZWFzZSgpLiBSZW1vdmVkIGV4Y2x1c2l2ZSBvcGVuIGFuZCBzdGF0dXMgYml0bWFwLgorICoJCUFkZGVkIG1pY3JvY29kZV9yd3NlbSB0byBzZXJpYWxpemUgcmVhZCgpL3dyaXRlKCkvaW9jdGwoKS4KKyAqCQlSZW1vdmVkIGdsb2JhbCBrZXJuZWwgbG9jayB1c2FnZS4KKyAqCTEuMDcJMDcgU2VwIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCVdyaXRlIDAgdG8gMHg4QiBtc3IgYW5kIHRoZW4gY3B1aWQgYmVmb3JlIHJlYWRpbmcgcmV2aXNpb24sCisgKgkJc28gdGhhdCBpdCB3b3JrcyBldmVuIGlmIHRoZXJlIHdlcmUgbm8gdXBkYXRlIGRvbmUgYnkgdGhlCisgKgkJQklPUy4gT3RoZXJ3aXNlLCByZWFkaW5nIGZyb20gMHg4QiBnaXZlcyBqdW5rICh3aGljaCBoYXBwZW5lZAorICoJCXRvIGJlIDAgb24gbXkgbWFjaGluZSB3aGljaCBpcyB3aHkgaXQgd29ya2VkIGV2ZW4gd2hlbiBJCisgKgkJZGlzYWJsZWQgdXBkYXRlIGJ5IHRoZSBCSU9TKQorICoJCVRoYW5rcyB0byBFcmljIFcuIEJpZWRlcm1hbiA8ZWJpZWRlcm1hbkBsbnhpLmNvbT4gZm9yIHRoZSBmaXguCisgKgkxLjA4CTExIERlYyAyMDAwLCBSaWNoYXJkIFNjaGFhbCA8cmljaGFyZC5zY2hhYWxAaW50ZWwuY29tPiBhbmQKKyAqCQkJICAgICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlJbnRlbCBQZW50aXVtIDQgcHJvY2Vzc29yIHN1cHBvcnQgYW5kIGJ1Z2ZpeGVzLgorICoJMS4wOQkzMCBPY3QgMjAwMSwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJQnVnZml4IGZvciBIVCAoSHlwZXItVGhyZWFkaW5nKSBlbmFibGVkIHByb2Nlc3NvcnMKKyAqCQl3aGVyZWJ5IHByb2Nlc3NvciByZXNvdXJjZXMgYXJlIHNoYXJlZCBieSBhbGwgbG9naWNhbCBwcm9jZXNzb3JzCisgKgkJaW4gYSBzaW5nbGUgQ1BVIHBhY2thZ2UuCisgKgkxLjEwCTI4IEZlYiAyMDAyIEFzaXQgSyBNYWxsaWNrIDxhc2l0LmsubWFsbGlja0BpbnRlbC5jb20+IGFuZAorICoJCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPiwKKyAqCQlTZXJpYWxpemUgdXBkYXRlcyBhcyByZXF1aXJlZCBvbiBIVCBwcm9jZXNzb3JzIGR1ZSB0bworICoJCXNwZWN1bGF0aXZlIG5hdHVyZSBvZiBpbXBsZW1lbnRhdGlvbi4KKyAqCTEuMTEJMjIgTWFyIDIwMDIgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHRoZSBwYW5pYyB3aGVuIHdyaXRpbmcgemVyby1sZW5ndGggbWljcm9jb2RlIGNodW5rLgorICoJMS4xMgkyOSBTZXAgMjAwMyBOaXRpbiBLYW1ibGUgPG5pdGluLmEua2FtYmxlQGludGVsLmNvbT4sCisgKgkJSnVuIE5ha2FqaW1hIDxqdW4ubmFrYWppbWFAaW50ZWwuY29tPgorICoJCVN1cHBvcnQgZm9yIHRoZSBtaWNyb2NvZGUgdXBkYXRlcyBpbiB0aGUgbmV3IGZvcm1hdC4KKyAqCTEuMTMJMTAgT2N0IDIwMDMgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJUmVtb3ZlZCAtPnJlYWQoKSBtZXRob2QgYW5kIG9ic29sZXRlZCBNSUNST0NPREVfSU9DRlJFRSBpb2N0bAorICoJCWJlY2F1c2Ugd2Ugbm8gbG9uZ2VyIGhvbGQgYSBjb3B5IG9mIGFwcGxpZWQgbWljcm9jb2RlCisgKgkJaW4ga2VybmVsIG1lbW9yeS4KKyAqCTEuMTQJMjUgSnVuIDIwMDQgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KKyAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgorICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbWljcm9jb2RlLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIE1JQ1JPQ09ERV9WRVJTSU9OIAkiMi4wMCIKKworc3RydWN0IG1pY3JvY29kZV9vcHMgKm1pY3JvY29kZV9vcHM7CisKKy8qIG5vIGNvbmN1cnJlbnQgLT53cml0ZSgpcyBhcmUgYWxsb3dlZCBvbiAvZGV2L2NwdS9taWNyb2NvZGUgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgobWljcm9jb2RlX211dGV4KTsKKworc3RydWN0IHVjb2RlX2NwdV9pbmZvIHVjb2RlX2NwdV9pbmZvW05SX0NQVVNdOworRVhQT1JUX1NZTUJPTF9HUEwodWNvZGVfY3B1X2luZm8pOworCisjaWZkZWYgQ09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFCitzdGF0aWMgaW50IGRvX21pY3JvY29kZV91cGRhdGUoY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJY3B1bWFza190IG9sZDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBjcHU7CisKKwlvbGQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCisJCWlmICghdWNpLT52YWxpZCkKKwkJCWNvbnRpbnVlOworCisJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKKwkJZXJyb3IgPSBtaWNyb2NvZGVfb3BzLT5yZXF1ZXN0X21pY3JvY29kZV91c2VyKGNwdSwgYnVmLCBzaXplKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoIWVycm9yKQorCQkJbWljcm9jb2RlX29wcy0+YXBwbHlfbWljcm9jb2RlKGNwdSk7CisJfQorb3V0OgorCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBtaWNyb2NvZGVfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZDEsIHN0cnVjdCBmaWxlICp1bnVzZWQyKQoreworCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOworfQorCitzdGF0aWMgc3NpemVfdCBtaWNyb2NvZGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QgcmV0OworCisJaWYgKChsZW4gPj4gUEFHRV9TSElGVCkgPiBudW1fcGh5c3BhZ2VzKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiB0b28gbXVjaCBkYXRhIChtYXggJWxkIHBhZ2VzKVxuIiwKKwkJICAgICAgIG51bV9waHlzcGFnZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOworCisJcmV0ID0gZG9fbWljcm9jb2RlX3VwZGF0ZShidWYsIGxlbik7CisJaWYgKCFyZXQpCisJCXJldCA9IChzc2l6ZV90KWxlbjsKKworCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pY3JvY29kZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gbWljcm9jb2RlX3dyaXRlLAorCS5vcGVuCQk9IG1pY3JvY29kZV9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG1pY3JvY29kZV9kZXYgPSB7CisJLm1pbm9yCQk9IE1JQ1JPQ09ERV9NSU5PUiwKKwkubmFtZQkJPSAibWljcm9jb2RlIiwKKwkuZm9wcwkJPSAmbWljcm9jb2RlX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtaWNyb2NvZGVfZGV2X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQlNSUNST0NPREVfTUlOT1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvY29kZV9kZXZfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmbWljcm9jb2RlX2Rldik7Cit9CisKK01PRFVMRV9BTElBU19NSVNDREVWKE1JQ1JPQ09ERV9NSU5PUik7CisjZWxzZQorI2RlZmluZSBtaWNyb2NvZGVfZGV2X2luaXQoKSAwCisjZGVmaW5lIG1pY3JvY29kZV9kZXZfZXhpdCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBmYWtlIGRldmljZSBmb3IgcmVxdWVzdF9maXJtd2FyZSAqLworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWljcm9jb2RlX3BkZXY7CisKK3N0YXRpYyBzc2l6ZV90IHJlbG9hZF9zdG9yZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHN6KQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBkZXYtPmlkOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZCwgMCk7CisJaW50IGVyciA9IDA7CisJaW50IGNwdSA9IGRldi0+aWQ7CisKKwlpZiAoZW5kID09IGJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA9PSAxKSB7CisJCWNwdW1hc2tfdCBvbGQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwkJZ2V0X29ubGluZV9jcHVzKCk7CisJCWlmIChjcHVfb25saW5lKGNwdSkpIHsKKwkJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKKwkJCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisJCQlpZiAodWNpLT52YWxpZCkgeworCQkJCWVyciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX2Z3KGNwdSwKKwkJCQkJCSZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKKwkJCQlpZiAoIWVycikKKwkJCQkJbWljcm9jb2RlX29wcy0+YXBwbHlfbWljcm9jb2RlKGNwdSk7CisJCQl9CisJCQltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7CisJCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmb2xkKTsKKwkJfQorCQlwdXRfb25saW5lX2NwdXMoKTsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gc3o7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgZGV2LT5pZDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHVjaS0+Y3B1X3NpZy5yZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBwZl9zaG93KHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBkZXYtPmlkOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgdWNpLT5jcHVfc2lnLnBmKTsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKHJlbG9hZCwgMDIwMCwgTlVMTCwgcmVsb2FkX3N0b3JlKTsKK3N0YXRpYyBTWVNERVZfQVRUUih2ZXJzaW9uLCAwNDAwLCB2ZXJzaW9uX3Nob3csIE5VTEwpOworc3RhdGljIFNZU0RFVl9BVFRSKHByb2Nlc3Nvcl9mbGFncywgMDQwMCwgcGZfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptY19kZWZhdWx0X2F0dHJzW10gPSB7CisJJmF0dHJfcmVsb2FkLmF0dHIsCisJJmF0dHJfdmVyc2lvbi5hdHRyLAorCSZhdHRyX3Byb2Nlc3Nvcl9mbGFncy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbWNfZGVmYXVsdF9hdHRycywKKwkubmFtZSA9ICJtaWNyb2NvZGUiLAorfTsKKworc3RhdGljIHZvaWQgbWljcm9jb2RlX2ZpbmlfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKworCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisJbWljcm9jb2RlX29wcy0+bWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7CisJdWNpLT52YWxpZCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvKGludCBjcHUpCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKworCW1lbXNldCh1Y2ksIDAsIHNpemVvZigqdWNpKSk7CisJaWYgKCFtaWNyb2NvZGVfb3BzLT5jb2xsZWN0X2NwdV9pbmZvKGNwdSwgJnVjaS0+Y3B1X3NpZykpCisJCXVjaS0+dmFsaWQgPSAxOworfQorCitzdGF0aWMgaW50IG1pY3JvY29kZV9yZXN1bWVfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKwlzdHJ1Y3QgY3B1X3NpZ25hdHVyZSBuc2lnOworCisJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgcmVzdW1lZFxuIiwgY3B1KTsKKworCWlmICghdWNpLT5tYykKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIExldCdzIHZlcmlmeSB0aGF0IHRoZSAnY2FjaGVkJyB1Y29kZSBkb2VzIGJlbG9uZworCSAqIHRvIHRoaXMgY3B1IChhIGJpdCBvZiBwYXJhbm9pYSk6CisJICovCisJaWYgKG1pY3JvY29kZV9vcHMtPmNvbGxlY3RfY3B1X2luZm8oY3B1LCAmbnNpZykpIHsKKwkJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWVtY21wKCZuc2lnLCAmdWNpLT5jcHVfc2lnLCBzaXplb2YobnNpZykpKSB7CisJCW1pY3JvY29kZV9maW5pX2NwdShjcHUpOworCQkvKiBTaG91bGQgd2UgbG9vayBmb3IgYSBuZXcgdWNvZGUgaGVyZT8gKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWljcm9jb2RlX3VwZGF0ZV9jcHUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgc3lzdGVtIHJlc3VtZSBpcyBpbiBwcm9ncmVzcyAodWNpLT52YWxpZCAhPSBOVUxMKSwKKwkgKiBvdGhlcndpc2UganVzdCByZXF1ZXN0IGEgZmlybXdhcmU6CisJICovCisJaWYgKHVjaS0+dmFsaWQpIHsKKwkJZXJyID0gbWljcm9jb2RlX3Jlc3VtZV9jcHUoY3B1KTsKKwl9IGVsc2UgewkKKwkJY29sbGVjdF9jcHVfaW5mbyhjcHUpOworCQlpZiAodWNpLT52YWxpZCAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCisJCQllcnIgPSBtaWNyb2NvZGVfb3BzLT5yZXF1ZXN0X21pY3JvY29kZV9mdyhjcHUsCisJCQkJCSZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKKwl9CisJaWYgKCFlcnIpCisJCW1pY3JvY29kZV9vcHMtPmFwcGx5X21pY3JvY29kZShjcHUpOworfQorCitzdGF0aWMgdm9pZCBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKK3sKKwljcHVtYXNrX3Qgb2xkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCS8qIFdlIHNob3VsZCBiaW5kIHRoZSB0YXNrIHRvIHRoZSBDUFUgKi8KKwlCVUdfT04ocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpOworCisJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKKwltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOworCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKKworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOworfQorCitzdGF0aWMgaW50IG1jX3N5c2Rldl9hZGQoc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXYpCit7CisJaW50IGVyciwgY3B1ID0gc3lzX2Rldi0+aWQ7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gMDsKKworCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGFkZGVkXG4iLCBjcHUpOworCW1lbXNldCh1Y2ksIDAsIHNpemVvZigqdWNpKSk7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWljcm9jb2RlX2luaXRfY3B1KGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNfc3lzZGV2X3JlbW92ZShzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKK3sKKwlpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisKKwlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCByZW1vdmVkXG4iLCBjcHUpOworCW1pY3JvY29kZV9maW5pX2NwdShjcHUpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jX3N5c2Rldl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpbnQgY3B1ID0gZGV2LT5pZDsKKworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gMDsKKworCS8qIG9ubHkgQ1BVIDAgd2lsbCBhcHBseSB1Y29kZSBoZXJlICovCisJbWljcm9jb2RlX3VwZGF0ZV9jcHUoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBtY19zeXNkZXZfZHJpdmVyID0geworCS5hZGQgPSBtY19zeXNkZXZfYWRkLAorCS5yZW1vdmUgPSBtY19zeXNkZXZfcmVtb3ZlLAorCS5yZXN1bWUgPSBtY19zeXNkZXZfcmVzdW1lLAorfTsKKworc3RhdGljIF9fY3B1aW5pdCBpbnQKK21jX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldjsKKworCXN5c19kZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CisJCW1pY3JvY29kZV9pbml0X2NwdShjcHUpOworCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgorCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKKwkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CisJCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKSkKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBzeXNmcyAiCisJCQkJImdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCS8qIFN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcmZhY2UgKi8KKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CisJCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHJlbW92ZWRcbiIsIGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RFQUQ6CisJY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgorCQkvKiBUaGUgQ1BVIHJlZnVzZWQgdG8gY29tZSB1cCBkdXJpbmcgYSBzeXN0ZW0gcmVzdW1lICovCisJCW1pY3JvY29kZV9maW5pX2NwdShjcHUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX3JlZmRhdGEgbWNfY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gbWNfY3B1X2NhbGxiYWNrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWljcm9jb2RlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoMCk7CisJaW50IGVycm9yOworCisJaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJbWljcm9jb2RlX29wcyA9IGluaXRfaW50ZWxfbWljcm9jb2RlKCk7CisJZWxzZSBpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKKwkJbWljcm9jb2RlX29wcyA9IGluaXRfYW1kX21pY3JvY29kZSgpOworCisJaWYgKCFtaWNyb2NvZGVfb3BzKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBubyBzdXBwb3J0IGZvciB0aGlzIENQVSB2ZW5kb3JcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnJvciA9IG1pY3JvY29kZV9kZXZfaW5pdCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCW1pY3JvY29kZV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibWljcm9jb2RlIiwgLTEsCisJCQkJCQkJIE5VTEwsIDApOworCWlmIChJU19FUlIobWljcm9jb2RlX3BkZXYpKSB7CisJCW1pY3JvY29kZV9kZXZfZXhpdCgpOworCQlyZXR1cm4gUFRSX0VSUihtaWNyb2NvZGVfcGRldik7CisJfQorCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZXJyb3IgPSBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLCAmbWNfc3lzZGV2X2RyaXZlcik7CisJcHV0X29ubGluZV9jcHVzKCk7CisJaWYgKGVycm9yKSB7CisJCW1pY3JvY29kZV9kZXZfZXhpdCgpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtaWNyb2NvZGVfcGRldik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CisKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04KKwkgICAgICAgIiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiIKKwkgICAgICAgIiA8cGV0ZXIub3J1YmFAYW1kLmNvbT5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaWNyb2NvZGVfZXhpdCh2b2lkKQoreworCW1pY3JvY29kZV9kZXZfZXhpdCgpOworCisJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1pY3JvY29kZV9wZGV2KTsKKworCW1pY3JvY29kZV9vcHMgPSBOVUxMOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgcmVtb3ZlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCk7Cittb2R1bGVfZXhpdChtaWNyb2NvZGVfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyZGM0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqCUludGVsIENQVSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciBmb3IgTGludXgKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNiBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4KKyAqCQkgICAgICAyMDA2CVNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgorICoKKyAqCVRoaXMgZHJpdmVyIGFsbG93cyB0byB1cGdyYWRlIG1pY3JvY29kZSBvbiBJbnRlbCBwcm9jZXNzb3JzCisgKgliZWxvbmdpbmcgdG8gSUEtMzIgZmFtaWx5IC0gUGVudGl1bVBybywgUGVudGl1bSBJSSwKKyAqCVBlbnRpdW0gSUlJLCBYZW9uLCBQZW50aXVtIDQsIGV0Yy4KKyAqCisgKglSZWZlcmVuY2U6IFNlY3Rpb24gOC4xMSBvZiBWb2x1bWUgM2EsIElBLTMyIEludGVsPyBBcmNoaXRlY3R1cmUKKyAqCVNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbAorICoJT3JkZXIgTnVtYmVyIDI1MzY2OCBvciBmcmVlIGRvd25sb2FkIGZyb206CisgKgorICoJaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL3BlbnRpdW00L21hbnVhbHMvMjUzNjY4Lmh0bQorICoKKyAqCUZvciBtb3JlIGluZm9ybWF0aW9uLCBnbyB0byBodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkxLjAJMTYgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJSW5pdGlhbCByZWxlYXNlLgorICoJMS4wMQkxOCBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlBZGRlZCByZWFkKCkgc3VwcG9ydCArIGNsZWFudXBzLgorICoJMS4wMgkyMSBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlBZGRlZCAnZGV2aWNlIHRyaW1taW5nJyBzdXBwb3J0LiBvcGVuKE9fV1JPTkxZKSB6ZXJvZXMKKyAqCQlhbmQgZnJlZXMgdGhlIHNhdmVkIGNvcHkgb2YgYXBwbGllZCBtaWNyb2NvZGUuCisgKgkxLjAzCTI5IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCU1hZGUgdG8gdXNlIGRldmZzICgvZGV2L2NwdS9taWNyb2NvZGUpICsgY2xlYW51cHMuCisgKgkxLjA0CTA2IEp1biAyMDAwLCBTaW1vbiBUcmltbWVyIDxzaW1vbkB2ZXJpdGFzLmNvbT4KKyAqCQlBZGRlZCBtaXNjIGRldmljZSBzdXBwb3J0IChub3cgdXNlcyBib3RoIGRldmZzIGFuZCBtaXNjKS4KKyAqCQlBZGRlZCBNSUNST0NPREVfSU9DRlJFRSBpb2N0bCB0byBjbGVhciBtZW1vcnkuCisgKgkxLjA1CTA5IEp1biAyMDAwLCBTaW1vbiBUcmltbWVyIDxzaW1vbkB2ZXJpdGFzLmNvbT4KKyAqCQlNZXNzYWdlcyBmb3IgZXJyb3IgY2FzZXMgKG5vbiBJbnRlbCAmIG5vIHN1aXRhYmxlIG1pY3JvY29kZSkuCisgKgkxLjA2CTAzIEF1ZyAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlSZW1vdmVkIC0+cmVsZWFzZSgpLiBSZW1vdmVkIGV4Y2x1c2l2ZSBvcGVuIGFuZCBzdGF0dXMgYml0bWFwLgorICoJCUFkZGVkIG1pY3JvY29kZV9yd3NlbSB0byBzZXJpYWxpemUgcmVhZCgpL3dyaXRlKCkvaW9jdGwoKS4KKyAqCQlSZW1vdmVkIGdsb2JhbCBrZXJuZWwgbG9jayB1c2FnZS4KKyAqCTEuMDcJMDcgU2VwIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCVdyaXRlIDAgdG8gMHg4QiBtc3IgYW5kIHRoZW4gY3B1aWQgYmVmb3JlIHJlYWRpbmcgcmV2aXNpb24sCisgKgkJc28gdGhhdCBpdCB3b3JrcyBldmVuIGlmIHRoZXJlIHdlcmUgbm8gdXBkYXRlIGRvbmUgYnkgdGhlCisgKgkJQklPUy4gT3RoZXJ3aXNlLCByZWFkaW5nIGZyb20gMHg4QiBnaXZlcyBqdW5rICh3aGljaCBoYXBwZW5lZAorICoJCXRvIGJlIDAgb24gbXkgbWFjaGluZSB3aGljaCBpcyB3aHkgaXQgd29ya2VkIGV2ZW4gd2hlbiBJCisgKgkJZGlzYWJsZWQgdXBkYXRlIGJ5IHRoZSBCSU9TKQorICoJCVRoYW5rcyB0byBFcmljIFcuIEJpZWRlcm1hbiA8ZWJpZWRlcm1hbkBsbnhpLmNvbT4gZm9yIHRoZSBmaXguCisgKgkxLjA4CTExIERlYyAyMDAwLCBSaWNoYXJkIFNjaGFhbCA8cmljaGFyZC5zY2hhYWxAaW50ZWwuY29tPiBhbmQKKyAqCQkJICAgICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlJbnRlbCBQZW50aXVtIDQgcHJvY2Vzc29yIHN1cHBvcnQgYW5kIGJ1Z2ZpeGVzLgorICoJMS4wOQkzMCBPY3QgMjAwMSwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJQnVnZml4IGZvciBIVCAoSHlwZXItVGhyZWFkaW5nKSBlbmFibGVkIHByb2Nlc3NvcnMKKyAqCQl3aGVyZWJ5IHByb2Nlc3NvciByZXNvdXJjZXMgYXJlIHNoYXJlZCBieSBhbGwgbG9naWNhbCBwcm9jZXNzb3JzCisgKgkJaW4gYSBzaW5nbGUgQ1BVIHBhY2thZ2UuCisgKgkxLjEwCTI4IEZlYiAyMDAyIEFzaXQgSyBNYWxsaWNrIDxhc2l0LmsubWFsbGlja0BpbnRlbC5jb20+IGFuZAorICoJCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPiwKKyAqCQlTZXJpYWxpemUgdXBkYXRlcyBhcyByZXF1aXJlZCBvbiBIVCBwcm9jZXNzb3JzIGR1ZSB0bworICoJCXNwZWN1bGF0aXZlIG5hdHVyZSBvZiBpbXBsZW1lbnRhdGlvbi4KKyAqCTEuMTEJMjIgTWFyIDIwMDIgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHRoZSBwYW5pYyB3aGVuIHdyaXRpbmcgemVyby1sZW5ndGggbWljcm9jb2RlIGNodW5rLgorICoJMS4xMgkyOSBTZXAgMjAwMyBOaXRpbiBLYW1ibGUgPG5pdGluLmEua2FtYmxlQGludGVsLmNvbT4sCisgKgkJSnVuIE5ha2FqaW1hIDxqdW4ubmFrYWppbWFAaW50ZWwuY29tPgorICoJCVN1cHBvcnQgZm9yIHRoZSBtaWNyb2NvZGUgdXBkYXRlcyBpbiB0aGUgbmV3IGZvcm1hdC4KKyAqCTEuMTMJMTAgT2N0IDIwMDMgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJUmVtb3ZlZCAtPnJlYWQoKSBtZXRob2QgYW5kIG9ic29sZXRlZCBNSUNST0NPREVfSU9DRlJFRSBpb2N0bAorICoJCWJlY2F1c2Ugd2Ugbm8gbG9uZ2VyIGhvbGQgYSBjb3B5IG9mIGFwcGxpZWQgbWljcm9jb2RlCisgKgkJaW4ga2VybmVsIG1lbW9yeS4KKyAqCTEuMTQJMjUgSnVuIDIwMDQgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KKyAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgorICovCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbWljcm9jb2RlLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCB7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgaGRydmVyOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJldjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBkYXRlOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHNpZzsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBja3N1bTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBsZHJ2ZXI7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcGY7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZGF0YXNpemU7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgdG90YWxzaXplOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IG1pY3JvY29kZV9pbnRlbCB7CisJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgaGRyOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJpdHNbMF07Cit9OworCisvKiBtaWNyb2NvZGUgZm9ybWF0IGlzIGV4dGVuZGVkIGZyb20gcHJlc2NvdHQgcHJvY2Vzc29ycyAqLworc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSB7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgc2lnOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBmOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGNrc3VtOworfTsKKworc3RydWN0IGV4dGVuZGVkX3NpZ3RhYmxlIHsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjb3VudDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBja3N1bTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICByZXNlcnZlZFszXTsKKwlzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlIHNpZ3NbMF07Cit9OworCisjZGVmaW5lIERFRkFVTFRfVUNPREVfREFUQVNJWkUgCSgyMDAwKQorI2RlZmluZSBNQ19IRUFERVJfU0laRQkJKHNpemVvZihzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCkpCisjZGVmaW5lIERFRkFVTFRfVUNPREVfVE9UQUxTSVpFIChERUZBVUxUX1VDT0RFX0RBVEFTSVpFICsgTUNfSEVBREVSX1NJWkUpCisjZGVmaW5lIEVYVF9IRUFERVJfU0laRQkJKHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUpKQorI2RlZmluZSBFWFRfU0lHTkFUVVJFX1NJWkUJKHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlKSkKKyNkZWZpbmUgRFdTSVpFCQkJKHNpemVvZih1MzIpKQorI2RlZmluZSBnZXRfdG90YWxzaXplKG1jKSBcCisJKCgoc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqKW1jKS0+aGRyLnRvdGFsc2l6ZSA/IFwKKwkgKChzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICopbWMpLT5oZHIudG90YWxzaXplIDogXAorCSBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSkKKworI2RlZmluZSBnZXRfZGF0YXNpemUobWMpIFwKKwkoKChzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICopbWMpLT5oZHIuZGF0YXNpemUgPyBcCisJICgoc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqKW1jKS0+aGRyLmRhdGFzaXplIDogREVGQVVMVF9VQ09ERV9EQVRBU0laRSkKKworI2RlZmluZSBzaWdtYXRjaChzMSwgczIsIHAxLCBwMikgXAorCSgoKHMxKSA9PSAoczIpKSAmJiAoKChwMSkgJiAocDIpKSB8fCAoKChwMSkgPT0gMCkgJiYgKChwMikgPT0gMCkpKSkKKworI2RlZmluZSBleHR0YWJsZV9zaXplKGV0KSAoKGV0KS0+Y291bnQgKiBFWFRfU0lHTkFUVVJFX1NJWkUgKyBFWFRfSEVBREVSX1NJWkUpCisKKy8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pY3JvY29kZV91cGRhdGVfbG9jayk7CisKK3N0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1X251bSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdV9udW0pOworCXVuc2lnbmVkIGludCB2YWxbMl07CisKKwltZW1zZXQoY3NpZywgMCwgc2l6ZW9mKCpjc2lnKSk7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMIHx8IGMtPng4NiA8IDYgfHwKKwkgICAgY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9JQTY0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90IGEgY2FwYWJsZSBJbnRlbCAiCisJCQkicHJvY2Vzc29yXG4iLCBjcHVfbnVtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNzaWctPnNpZyA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKKworCWlmICgoYy0+eDg2X21vZGVsID49IDUpIHx8IChjLT54ODYgPiA2KSkgeworCQkvKiBnZXQgcHJvY2Vzc29yIGZsYWdzIGZyb20gTVNSIDB4MTcgKi8KKwkJcmRtc3IoTVNSX0lBMzJfUExBVEZPUk1fSUQsIHZhbFswXSwgdmFsWzFdKTsKKwkJY3NpZy0+cGYgPSAxIDw8ICgodmFsWzFdID4+IDE4KSAmIDcpOworCX0KKworCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CisJLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KKwlzeW5jX2NvcmUoKTsKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLworCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCBjc2lnLT5yZXYpOworCXByX2RlYnVnKCJtaWNyb2NvZGU6IGNvbGxlY3RfY3B1X2luZm8gOiBzaWc9MHgleCwgcGY9MHgleCwgcmV2PTB4JXhcbiIsCisJCQljc2lnLT5zaWcsIGNzaWctPnBmLCBjc2lnLT5yZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVwZGF0ZV9tYXRjaF9jcHUoc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcsIGludCBzaWcsIGludCBwZikKK3sKKwlyZXR1cm4gKCFzaWdtYXRjaChzaWcsIGNzaWctPnNpZywgcGYsIGNzaWctPnBmKSkgPyAwIDogMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgCit1cGRhdGVfbWF0Y2hfcmV2aXNpb24oc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hlYWRlciwJaW50IHJldikKK3sKKwlyZXR1cm4gKG1jX2hlYWRlci0+cmV2IDw9IHJldikgPyAwIDogMTsKK30KKworc3RhdGljIGludCBtaWNyb2NvZGVfc2FuaXR5X2NoZWNrKHZvaWQgKm1jKQoreworCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZWFkZXIgPSBtYzsKKwlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCBleHRlbmRlZF9zaWduYXR1cmUgKmV4dF9zaWc7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplLCBkYXRhX3NpemUsIGV4dF90YWJsZV9zaXplOworCWludCBzdW0sIG9yaWdfc3VtLCBleHRfc2lnY291bnQgPSAwLCBpOworCisJdG90YWxfc2l6ZSA9IGdldF90b3RhbHNpemUobWNfaGVhZGVyKTsKKwlkYXRhX3NpemUgPSBnZXRfZGF0YXNpemUobWNfaGVhZGVyKTsKKwlpZiAoZGF0YV9zaXplICsgTUNfSEVBREVSX1NJWkUgPiB0b3RhbF9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgorCQkJIkJhZCBkYXRhIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtY19oZWFkZXItPmxkcnZlciAhPSAxIHx8IG1jX2hlYWRlci0+aGRydmVyICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCisJCQkiVW5rbm93biBtaWNyb2NvZGUgdXBkYXRlIGZvcm1hdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlleHRfdGFibGVfc2l6ZSA9IHRvdGFsX3NpemUgLSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpOworCWlmIChleHRfdGFibGVfc2l6ZSkgeworCQlpZiAoKGV4dF90YWJsZV9zaXplIDwgRVhUX0hFQURFUl9TSVpFKQorCQkgfHwgKChleHRfdGFibGVfc2l6ZSAtIEVYVF9IRUFERVJfU0laRSkgJSBFWFRfU0lHTkFUVVJFX1NJWkUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhICIKKwkJCQkiU21hbGwgZXh0dGFibGUgc2l6ZSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWV4dF9oZWFkZXIgPSBtYyArIE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplOworCQlpZiAoZXh0X3RhYmxlX3NpemUgIT0gZXh0dGFibGVfc2l6ZShleHRfaGVhZGVyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCisJCQkJIkJhZCBleHR0YWJsZSBzaXplIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZXh0X3NpZ2NvdW50ID0gZXh0X2hlYWRlci0+Y291bnQ7CisJfQorCisJLyogY2hlY2sgZXh0ZW5kZWQgdGFibGUgY2hlY2tzdW0gKi8KKwlpZiAoZXh0X3RhYmxlX3NpemUpIHsKKwkJaW50IGV4dF90YWJsZV9zdW0gPSAwOworCQlpbnQgKmV4dF90YWJsZXAgPSAoaW50ICopZXh0X2hlYWRlcjsKKworCQlpID0gZXh0X3RhYmxlX3NpemUgLyBEV1NJWkU7CisJCXdoaWxlIChpLS0pCisJCQlleHRfdGFibGVfc3VtICs9IGV4dF90YWJsZXBbaV07CisJCWlmIChleHRfdGFibGVfc3VtKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNyb2NvZGU6IGFib3J0aW5nLCAiCisJCQkJImJhZCBleHRlbmRlZCBzaWduYXR1cmUgdGFibGUgY2hlY2tzdW1cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtICovCisJb3JpZ19zdW0gPSAwOworCWkgPSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpIC8gRFdTSVpFOworCXdoaWxlIChpLS0pCisJCW9yaWdfc3VtICs9ICgoaW50ICopbWMpW2ldOworCWlmIChvcmlnX3N1bSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogYWJvcnRpbmcsIGJhZCBjaGVja3N1bVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWV4dF90YWJsZV9zaXplKQorCQlyZXR1cm4gMDsKKwkvKiBjaGVjayBleHRlbmRlZCBzaWduYXR1cmUgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZXh0X3NpZ2NvdW50OyBpKyspIHsKKwkJZXh0X3NpZyA9ICh2b2lkICopZXh0X2hlYWRlciArIEVYVF9IRUFERVJfU0laRSArCisJCQkgIEVYVF9TSUdOQVRVUkVfU0laRSAqIGk7CisJCXN1bSA9IG9yaWdfc3VtCisJCQktIChtY19oZWFkZXItPnNpZyArIG1jX2hlYWRlci0+cGYgKyBtY19oZWFkZXItPmNrc3VtKQorCQkJKyAoZXh0X3NpZy0+c2lnICsgZXh0X3NpZy0+cGYgKyBleHRfc2lnLT5ja3N1bSk7CisJCWlmIChzdW0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBhYm9ydGluZywgYmFkIGNoZWNrc3VtXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogcmV0dXJuIDAgLSBubyB1cGRhdGUgZm91bmQKKyAqIHJldHVybiAxIC0gZm91bmQgdXBkYXRlCisgKi8KK3N0YXRpYyBpbnQKK2dldF9tYXRjaGluZ19taWNyb2NvZGUoc3RydWN0IGNwdV9zaWduYXR1cmUgKmNwdV9zaWcsIHZvaWQgKm1jLCBpbnQgcmV2KQoreworCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZWFkZXIgPSBtYzsKKwlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXI7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZShtY19oZWFkZXIpOworCWludCBleHRfc2lnY291bnQsIGk7CisJc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSAqZXh0X3NpZzsKKworCWlmICghdXBkYXRlX21hdGNoX3JldmlzaW9uKG1jX2hlYWRlciwgcmV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodXBkYXRlX21hdGNoX2NwdShjcHVfc2lnLCBtY19oZWFkZXItPnNpZywgbWNfaGVhZGVyLT5wZikpCisJCXJldHVybiAxOworCisJLyogTG9vayBmb3IgZXh0LiBoZWFkZXJzOiAqLworCWlmICh0b3RhbF9zaXplIDw9IGdldF9kYXRhc2l6ZShtY19oZWFkZXIpICsgTUNfSEVBREVSX1NJWkUpCisJCXJldHVybiAwOworCisJZXh0X2hlYWRlciA9IG1jICsgZ2V0X2RhdGFzaXplKG1jX2hlYWRlcikgKyBNQ19IRUFERVJfU0laRTsKKwlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLT5jb3VudDsKKwlleHRfc2lnID0gKHZvaWQgKilleHRfaGVhZGVyICsgRVhUX0hFQURFUl9TSVpFOworCisJZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7CisJCWlmICh1cGRhdGVfbWF0Y2hfY3B1KGNwdV9zaWcsIGV4dF9zaWctPnNpZywgZXh0X3NpZy0+cGYpKQorCQkJcmV0dXJuIDE7CisJCWV4dF9zaWcrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X21pY3JvY29kZShpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbFsyXTsKKwlpbnQgY3B1X251bSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKwlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICptY19pbnRlbCA9IHVjaS0+bWM7CisKKwkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCisJQlVHX09OKGNwdV9udW0gIT0gY3B1KTsKKworCWlmIChtY19pbnRlbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKKworCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KKwl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKKwkgICAgICAodW5zaWduZWQgbG9uZykgbWNfaW50ZWwtPmJpdHMsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpIG1jX2ludGVsLT5iaXRzID4+IDE2ID4+IDE2KTsKKwl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOworCisJLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KKwlzeW5jX2NvcmUoKTsKKworCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCisJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIHZhbFsxXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAodmFsWzFdICE9IG1jX2ludGVsLT5oZHIucmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGUgZnJvbSByZXZpc2lvbiAiCisJCQkiMHgleCB0byAweCV4IGZhaWxlZFxuIiwgY3B1X251bSwgdWNpLT5jcHVfc2lnLnJldiwgdmFsWzFdKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgZnJvbSByZXZpc2lvbiAiCisJICAgICAgICIweCV4IHRvIDB4JXgsIGRhdGUgPSAlMDR4LSUwMngtJTAyeCBcbiIsCisJCWNwdV9udW0sIHVjaS0+Y3B1X3NpZy5yZXYsIHZhbFsxXSwKKwkJbWNfaW50ZWwtPmhkci5kYXRlICYgMHhmZmZmLAorCQltY19pbnRlbC0+aGRyLmRhdGUgPj4gMjQsCisJCShtY19pbnRlbC0+aGRyLmRhdGUgPj4gMTYpICYgMHhmZik7CisJdWNpLT5jcHVfc2lnLnJldiA9IHZhbFsxXTsKK30KKworc3RhdGljIGludCBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorCQlpbnQgKCpnZXRfdWNvZGVfZGF0YSkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkpCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKwl1OCAqdWNvZGVfcHRyID0gZGF0YSwgKm5ld19tYyA9IE5VTEwsICptYzsKKwlpbnQgbmV3X3JldiA9IHVjaS0+Y3B1X3NpZy5yZXY7CisJdW5zaWduZWQgaW50IGxlZnRvdmVyID0gc2l6ZTsKKworCXdoaWxlIChsZWZ0b3ZlcikgeworCQlzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCBtY19oZWFkZXI7CisJCXVuc2lnbmVkIGludCBtY19zaXplOworCisJCWlmIChnZXRfdWNvZGVfZGF0YSgmbWNfaGVhZGVyLCB1Y29kZV9wdHIsIHNpemVvZihtY19oZWFkZXIpKSkKKwkJCWJyZWFrOworCisJCW1jX3NpemUgPSBnZXRfdG90YWxzaXplKCZtY19oZWFkZXIpOworCQlpZiAoIW1jX3NpemUgfHwgbWNfc2l6ZSA+IGxlZnRvdmVyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIgorCQkJCQkiQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCW1jID0gdm1hbGxvYyhtY19zaXplKTsKKwkJaWYgKCFtYykKKwkJCWJyZWFrOworCisJCWlmIChnZXRfdWNvZGVfZGF0YShtYywgdWNvZGVfcHRyLCBtY19zaXplKSB8fAorCQkgICAgbWljcm9jb2RlX3Nhbml0eV9jaGVjayhtYykgPCAwKSB7CisJCQl2ZnJlZShtYyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChnZXRfbWF0Y2hpbmdfbWljcm9jb2RlKCZ1Y2ktPmNwdV9zaWcsIG1jLCBuZXdfcmV2KSkgeworCQkJaWYgKG5ld19tYykKKwkJCQl2ZnJlZShuZXdfbWMpOworCQkJbmV3X3JldiA9IG1jX2hlYWRlci5yZXY7CisJCQluZXdfbWMgID0gbWM7CisJCX0gZWxzZQorCQkJdmZyZWUobWMpOworCisJCXVjb2RlX3B0ciArPSBtY19zaXplOworCQlsZWZ0b3ZlciAgLT0gbWNfc2l6ZTsKKwl9CisKKwlpZiAobmV3X21jKSB7CisJCWlmICghbGVmdG92ZXIpIHsKKwkJCWlmICh1Y2ktPm1jKQorCQkJCXZmcmVlKHVjaS0+bWMpOworCQkJdWNpLT5tYyA9IChzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICopbmV3X21jOworCQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGgiCisJCQkJICIgdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLAorCQkJCWNwdSwgbmV3X3JldiwgdWNpLT5jcHVfc2lnLnJldik7CisJCX0gZWxzZQorCQkJdmZyZWUobmV3X21jKTsKKwl9CisKKwlyZXR1cm4gKGludClsZWZ0b3ZlcjsKK30KKworc3RhdGljIGludCBnZXRfdWNvZGVfZncodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQoreworCW1lbWNweSh0bywgZnJvbSwgbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWNoYXIgbmFtZVszMF07CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdSk7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwlpbnQgcmV0OworCisJLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLworCUJVR19PTihjcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3ByaW50ZihuYW1lLCAiaW50ZWwtdWNvZGUvJTAyeC0lMDJ4LSUwMngiLAorCQljLT54ODYsIGMtPng4Nl9tb2RlbCwgYy0+eDg2X21hc2spOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBuYW1lLCBkZXZpY2UpOworCWlmIChyZXQpIHsKKwkJcHJfZGVidWcoIm1pY3JvY29kZTogZGF0YSBmaWxlICVzIGxvYWQgZmFpbGVkXG4iLCBuYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGNwdSwgKHZvaWQqKWZpcm13YXJlLT5kYXRhLCBmaXJtd2FyZS0+c2l6ZSwKKwkJCSZnZXRfdWNvZGVfZncpOworCisJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF91Y29kZV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK3sKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfbWljcm9jb2RlX3VzZXIoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLworCUJVR19PTihjcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlyZXR1cm4gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkKilidWYsIHNpemUsICZnZXRfdWNvZGVfdXNlcik7Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvY29kZV9maW5pX2NwdShpbnQgY3B1KQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CisKKwl2ZnJlZSh1Y2ktPm1jKTsKKwl1Y2ktPm1jID0gTlVMTDsKK30KKworc3RydWN0IG1pY3JvY29kZV9vcHMgbWljcm9jb2RlX2ludGVsX29wcyA9IHsKKwkucmVxdWVzdF9taWNyb2NvZGVfdXNlcgkJICA9IHJlcXVlc3RfbWljcm9jb2RlX3VzZXIsCisJLnJlcXVlc3RfbWljcm9jb2RlX2Z3ICAgICAgICAgICAgID0gcmVxdWVzdF9taWNyb2NvZGVfZncsCisJLmNvbGxlY3RfY3B1X2luZm8gICAgICAgICAgICAgICAgID0gY29sbGVjdF9jcHVfaW5mbywKKwkuYXBwbHlfbWljcm9jb2RlICAgICAgICAgICAgICAgICAgPSBhcHBseV9taWNyb2NvZGUsCisJLm1pY3JvY29kZV9maW5pX2NwdSAgICAgICAgICAgICAgID0gbWljcm9jb2RlX2ZpbmlfY3B1LAorfTsKKworc3RydWN0IG1pY3JvY29kZV9vcHMgKiBfX2luaXQgaW5pdF9pbnRlbF9taWNyb2NvZGUodm9pZCkKK3sKKwlyZXR1cm4gJm1pY3JvY29kZV9pbnRlbF9vcHM7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IGIzZmI0MzAuLmY5OGY0ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtMzk3LDcgKzM5Nyw5IEBACiAgICAgICAgZ2VuZXJpY19iaWdzbXBfcHJvYmUoKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXNldHVwX2FwaWNfcm91dGluZygpOworI2VuZGlmCiAJaWYgKCFudW1fcHJvY2Vzc29ycykKIAkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBubyBwcm9jZXNzb3JzIHJlZ2lzdGVyZWQhXG4iKTsKIAlyZXR1cm4gbnVtX3Byb2Nlc3NvcnM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbXNyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXNyLmMKaW5kZXggMmUyYWY1ZC4uODJhN2M3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21zci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tc3IuYwpAQCAtMTYzLDggKzE2Myw4IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCi0JZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKG1zcl9jbGFzcywgTlVMTCwgTUtERVYoTVNSX01BSk9SLCBjcHUpLAotCQkJCSAgICBOVUxMLCAibXNyJWQiLCBjcHUpOworCWRldiA9IGRldmljZV9jcmVhdGUobXNyX2NsYXNzLCBOVUxMLCBNS0RFVihNU1JfTUFKT1IsIGNwdSksIE5VTEwsCisJCQkgICAgIm1zciVkIiwgY3B1KTsKIAlyZXR1cm4gSVNfRVJSKGRldikgPyBQVFJfRVJSKGRldikgOiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKaW5kZXggYWJiNzhhMi4uMmM5N2YwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ubWkuYwpAQCAtMjk5LDYgKzI5OSwxNSBAQAogCQlvbl9lYWNoX2NwdShfX2FjcGlfbm1pX2Rpc2FibGUsIE5VTEwsIDEpOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgc29vbiB0aGUgTEFQSUMgTk1JIHdhdGNoZG9nIGRyaXZlciBoYXMgZXZlcnl0aGluZworICogaW4gcGxhY2UgYW5kIGl0J3MgcmVhZHkgdG8gY2hlY2sgaWYgdGhlIE5NSXMgYmVsb25nIHRvIHRoZSBOTUkgd2F0Y2hkb2cKKyAqLwordm9pZCBjcHVfbm1pX3NldF93ZF9lbmFibGVkKHZvaWQpCit7CisJX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVkKSA9IDE7Cit9CisKIHZvaWQgc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2codm9pZCAqdW51c2VkKQogewogCWlmIChfX2dldF9jcHVfdmFyKHdkX2VuYWJsZWQpKQpAQCAtMzExLDggKzMyMCw2IEBACiAKIAlzd2l0Y2ggKG5taV93YXRjaGRvZykgewogCWNhc2UgTk1JX0xPQ0FMX0FQSUM6Ci0JCSAvKiBlbmFibGUgaXQgYmVmb3JlIHRvIGF2b2lkIHJhY2Ugd2l0aCBoYW5kbGVyICovCi0JCV9fZ2V0X2NwdV92YXIod2RfZW5hYmxlZCkgPSAxOwogCQlpZiAobGFwaWNfd2F0Y2hkb2dfaW5pdChubWlfaHopIDwgMCkgewogCQkJX19nZXRfY3B1X3Zhcih3ZF9lbmFibGVkKSA9IDA7CiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbnVtYXFfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9udW1hcV8zMi5jCmluZGV4IGVlY2M4YzEuLjRjYWZmMzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9udW1hcV8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9udW1hcV8zMi5jCkBAIC0yMjksNiArMjI5LDEyIEBACiAJfQogfQogCitzdGF0aWMgaW50IF9faW5pdCBudW1hcV9zZXR1cF9pb2FwaWNfaWRzKHZvaWQpCit7CisJLyogc28gY2FuIHNraXAgaXQgKi8KKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHN0cnVjdCB4ODZfcXVpcmtzIG51bWFxX3g4Nl9xdWlya3MgX19pbml0ZGF0YSA9IHsKIAkuYXJjaF9wcmVfdGltZV9pbml0CT0gbnVtYXFfcHJlX3RpbWVfaW5pdCwKIAkuYXJjaF90aW1lX2luaXQJCT0gTlVMTCwKQEAgLTI0Myw2ICsyNDksNyBAQAogCS5tcGNfb2VtX2J1c19pbmZvCT0gbXBjX29lbV9idXNfaW5mbywKIAkubXBjX29lbV9wY2lfYnVzCT0gbXBjX29lbV9wY2lfYnVzLAogCS5zbXBfcmVhZF9tcGNfb2VtCT0gc21wX3JlYWRfbXBjX29lbSwKKwkuc2V0dXBfaW9hcGljX2lkcwk9IG51bWFxX3NldHVwX2lvYXBpY19pZHMsCiB9OwogCiB2b2lkIG51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvb2xwYy5jIGIvYXJjaC94ODYva2VybmVsL29scGMuYwppbmRleCAzZTY2NzIyLi43YTEzZmFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvb2xwYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9vbHBjLmMKQEAgLTE5MCwxMiArMTkwLDEyIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcGxhdGZvcm1fZGV0ZWN0KHZvaWQpCiB7CiAJc2l6ZV90IHByb3BzaXplOwotCXUzMiByZXY7CisJX19iZTMyIHJldjsKIAogCWlmIChvZncoImdldHByb3AiLCA0LCAxLCBOVUxMLCAiYm9hcmQtcmV2aXNpb24taW50IiwgJnJldiwgNCwKIAkJCSZwcm9wc2l6ZSkgfHwgcHJvcHNpemUgIT0gNCkgewogCQlwcmludGsoS0VSTl9FUlIgIm9mdzogZ2V0cHJvcCBjYWxsIGZhaWxlZCFcbiIpOwotCQlyZXYgPSAwOworCQlyZXYgPSBjcHVfdG9fYmUzMigwKTsKIAl9CiAJb2xwY19wbGF0Zm9ybV9pbmZvLmJvYXJkcmV2ID0gYmUzMl90b19jcHUocmV2KTsKIH0KQEAgLTIwMyw3ICsyMDMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX2RldGVjdCh2b2lkKQogewogCS8qIHN0b3BnYXAgdW50aWwgT0ZXIHN1cHBvcnQgaXMgYWRkZWQgdG8gdGhlIGtlcm5lbCAqLwotCW9scGNfcGxhdGZvcm1faW5mby5ib2FyZHJldiA9IGJlMzJfdG9fY3B1KDB4YzIpOworCW9scGNfcGxhdGZvcm1faW5mby5ib2FyZHJldiA9IDB4YzI7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWYxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFNwbGl0IHNwaW5sb2NrIGltcGxlbWVudGF0aW9uIG91dCBpbnRvIGl0cyBvd24gZmlsZSwgc28gaXQgY2FuIGJlCisgKiBjb21waWxlZCBpbiBhIEZUUkFDRS1jb21wYXRpYmxlIHdheS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KKworc3RhdGljIHZvaWQgZGVmYXVsdF9zcGluX2xvY2tfZmxhZ3Moc3RydWN0IHJhd19zcGlubG9jayAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlfX3Jhd19zcGluX2xvY2sobG9jayk7Cit9CisKK3N0cnVjdCBwdl9sb2NrX29wcyBwdl9sb2NrX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfU01QCisJLnNwaW5faXNfbG9ja2VkID0gX190aWNrZXRfc3Bpbl9pc19sb2NrZWQsCisJLnNwaW5faXNfY29udGVuZGVkID0gX190aWNrZXRfc3Bpbl9pc19jb250ZW5kZWQsCisKKwkuc3Bpbl9sb2NrID0gX190aWNrZXRfc3Bpbl9sb2NrLAorCS5zcGluX2xvY2tfZmxhZ3MgPSBkZWZhdWx0X3NwaW5fbG9ja19mbGFncywKKwkuc3Bpbl90cnlsb2NrID0gX190aWNrZXRfc3Bpbl90cnlsb2NrLAorCS5zcGluX3VubG9jayA9IF9fdGlja2V0X3NwaW5fdW5sb2NrLAorI2VuZGlmCit9OworRVhQT1JUX1NZTUJPTChwdl9sb2NrX29wcyk7CisKK3ZvaWQgX19pbml0IHBhcmF2aXJ0X3VzZV9ieXRlbG9ja3Modm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcHZfbG9ja19vcHMuc3Bpbl9pc19sb2NrZWQgPSBfX2J5dGVfc3Bpbl9pc19sb2NrZWQ7CisJcHZfbG9ja19vcHMuc3Bpbl9pc19jb250ZW5kZWQgPSBfX2J5dGVfc3Bpbl9pc19jb250ZW5kZWQ7CisJcHZfbG9ja19vcHMuc3Bpbl9sb2NrID0gX19ieXRlX3NwaW5fbG9jazsKKwlwdl9sb2NrX29wcy5zcGluX3RyeWxvY2sgPSBfX2J5dGVfc3Bpbl90cnlsb2NrOworCXB2X2xvY2tfb3BzLnNwaW5fdW5sb2NrID0gX19ieXRlX3NwaW5fdW5sb2NrOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCmluZGV4IDMwMGRhMTcuLmU0YzhmYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCkBAIC0yNjgsMTcgKzI2OCw2IEBACiAJcmV0dXJuIF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKTsKIH0KIAotdm9pZCBfX2luaXQgcGFyYXZpcnRfdXNlX2J5dGVsb2Nrcyh2b2lkKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlwdl9sb2NrX29wcy5zcGluX2lzX2xvY2tlZCA9IF9fYnl0ZV9zcGluX2lzX2xvY2tlZDsKLQlwdl9sb2NrX29wcy5zcGluX2lzX2NvbnRlbmRlZCA9IF9fYnl0ZV9zcGluX2lzX2NvbnRlbmRlZDsKLQlwdl9sb2NrX29wcy5zcGluX2xvY2sgPSBfX2J5dGVfc3Bpbl9sb2NrOwotCXB2X2xvY2tfb3BzLnNwaW5fdHJ5bG9jayA9IF9fYnl0ZV9zcGluX3RyeWxvY2s7Ci0JcHZfbG9ja19vcHMuc3Bpbl91bmxvY2sgPSBfX2J5dGVfc3Bpbl91bmxvY2s7Ci0jZW5kaWYKLX0KLQogc3RydWN0IHB2X2luZm8gcHZfaW5mbyA9IHsKIAkubmFtZSA9ICJiYXJlIGhhcmR3YXJlIiwKIAkucGFyYXZpcnRfZW5hYmxlZCA9IDAsCkBAIC0zMzAsNiArMzE5LDcgQEAKICNlbmRpZgogCS53YmludmQgPSBuYXRpdmVfd2JpbnZkLAogCS5yZWFkX21zciA9IG5hdGl2ZV9yZWFkX21zcl9zYWZlLAorCS5yZWFkX21zcl9hbWQgPSBuYXRpdmVfcmVhZF9tc3JfYW1kX3NhZmUsCiAJLndyaXRlX21zciA9IG5hdGl2ZV93cml0ZV9tc3Jfc2FmZSwKIAkucmVhZF90c2MgPSBuYXRpdmVfcmVhZF90c2MsCiAJLnJlYWRfcG1jID0gbmF0aXZlX3JlYWRfcG1jLApAQCAtMzQ4LDYgKzMzOCwxMCBAQAogCS53cml0ZV9sZHRfZW50cnkgPSBuYXRpdmVfd3JpdGVfbGR0X2VudHJ5LAogCS53cml0ZV9nZHRfZW50cnkgPSBuYXRpdmVfd3JpdGVfZ2R0X2VudHJ5LAogCS53cml0ZV9pZHRfZW50cnkgPSBuYXRpdmVfd3JpdGVfaWR0X2VudHJ5LAorCisJLmFsbG9jX2xkdCA9IHBhcmF2aXJ0X25vcCwKKwkuZnJlZV9sZHQgPSBwYXJhdmlydF9ub3AsCisKIAkubG9hZF9zcDAgPSBuYXRpdmVfbG9hZF9zcDAsCiAKICNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpIHx8IGRlZmluZWQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKQpAQCAtMzczLDggKzM2Nyw2IEBACiAKIHN0cnVjdCBwdl9hcGljX29wcyBwdl9hcGljX29wcyA9IHsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQkuYXBpY193cml0ZSA9IG5hdGl2ZV9hcGljX3dyaXRlLAotCS5hcGljX3JlYWQgPSBuYXRpdmVfYXBpY19yZWFkLAogCS5zZXR1cF9ib290X2Nsb2NrID0gc2V0dXBfYm9vdF9BUElDX2Nsb2NrLAogCS5zZXR1cF9zZWNvbmRhcnlfY2xvY2sgPSBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jaywKIAkuc3RhcnR1cF9pcGlfaG9vayA9IHBhcmF2aXJ0X25vcCwKQEAgLTQ2MSwxOCArNDUzLDYgQEAKIAkuc2V0X2ZpeG1hcCA9IG5hdGl2ZV9zZXRfZml4bWFwLAogfTsKIAotc3RydWN0IHB2X2xvY2tfb3BzIHB2X2xvY2tfb3BzID0gewotI2lmZGVmIENPTkZJR19TTVAKLQkuc3Bpbl9pc19sb2NrZWQgPSBfX3RpY2tldF9zcGluX2lzX2xvY2tlZCwKLQkuc3Bpbl9pc19jb250ZW5kZWQgPSBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZCwKLQotCS5zcGluX2xvY2sgPSBfX3RpY2tldF9zcGluX2xvY2ssCi0JLnNwaW5fdHJ5bG9jayA9IF9fdGlja2V0X3NwaW5fdHJ5bG9jaywKLQkuc3Bpbl91bmxvY2sgPSBfX3RpY2tldF9zcGluX3VubG9jaywKLSNlbmRpZgotfTsKLUVYUE9SVF9TWU1CT0wocHZfbG9ja19vcHMpOwotCiBFWFBPUlRfU1lNQk9MX0dQTChwdl90aW1lX29wcyk7CiBFWFBPUlRfU1lNQk9MICAgIChwdl9jcHVfb3BzKTsKIEVYUE9SVF9TWU1CT0wgICAgKHB2X21tdV9vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0X3BhdGNoXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwppbmRleCA1ODI2MjIxLi45ZmU2NDRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwpAQCAtMjMsNyArMjMsNyBAQAogCQkJc3RhcnQgPSBzdGFydF8jI29wcyMjXyMjeDsJCVwKIAkJCWVuZCA9IGVuZF8jI29wcyMjXyMjeDsJCQlcCiAJCQlnb3RvIHBhdGNoX3NpdGUKLQlzd2l0Y2godHlwZSkgeworCXN3aXRjaCAodHlwZSkgewogCQlQQVRDSF9TSVRFKHB2X2lycV9vcHMsIGlycV9kaXNhYmxlKTsKIAkJUEFUQ0hfU0lURShwdl9pcnFfb3BzLCBpcnFfZW5hYmxlKTsKIAkJUEFUQ0hfU0lURShwdl9pcnFfb3BzLCByZXN0b3JlX2ZsKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktY2FsZ2FyeV82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKaW5kZXggZGNkYWM2Yy4uZTFlNzMxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKQEAgLTIxNywxNiArMjE3LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19JT01NVV9ERUJVRyAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBudW1fZG1hX3BhZ2VzKHVuc2lnbmVkIGxvbmcgZG1hLCB1bnNpZ25lZCBpbnQgZG1hbGVuKQotewotCXVuc2lnbmVkIGludCBucGFnZXM7Ci0KLQlucGFnZXMgPSBQQUdFX0FMSUdOKGRtYSArIGRtYWxlbikgLSAoZG1hICYgUEFHRV9NQVNLKTsKLQlucGFnZXMgPj49IFBBR0VfU0hJRlQ7Ci0KLQlyZXR1cm4gbnBhZ2VzOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB0cmFuc2xhdGlvbl9lbmFibGVkKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKQogewogCS8qIG9ubHkgUEhCcyB3aXRoIHRyYW5zbGF0aW9uIGVuYWJsZWQgaGF2ZSBhbiBJT01NVSB0YWJsZSAqLwpAQCAtMjYxLDcgKzI1MSw3IEBACiAJCQkgICAgICAgYmFkYml0LCB0YmwsIHN0YXJ0X2FkZHIsIG5wYWdlcyk7CiAJfQogCi0Jc2V0X2JpdF9zdHJpbmcodGJsLT5pdF9tYXAsIGluZGV4LCBucGFnZXMpOworCWlvbW11X2FyZWFfcmVzZXJ2ZSh0YmwtPml0X21hcCwgaW5kZXgsIG5wYWdlcyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YmwtPml0X2xvY2ssIGZsYWdzKTsKIH0KQEAgLTQwOCw3ICszOTgsNyBAQAogCQlpZiAoZG1hbGVuID09IDApCiAJCQlicmVhazsKIAotCQlucGFnZXMgPSBudW1fZG1hX3BhZ2VzKGRtYSwgZG1hbGVuKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYSwgZG1hbGVuLCBQQUdFX1NJWkUpOwogCQlpb21tdV9mcmVlKHRibCwgZG1hLCBucGFnZXMpOwogCX0KIH0KQEAgLTQyNyw3ICs0MTcsNyBAQAogCQlCVUdfT04oIXNnX3BhZ2UocykpOwogCiAJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNnX3ZpcnQocyk7Ci0JCW5wYWdlcyA9IG51bV9kbWFfcGFnZXModmFkZHIsIHMtPmxlbmd0aCk7CisJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyh2YWRkciwgcy0+bGVuZ3RoLCBQQUdFX1NJWkUpOwogCiAJCWVudHJ5ID0gaW9tbXVfcmFuZ2VfYWxsb2MoZGV2LCB0YmwsIG5wYWdlcyk7CiAJCWlmIChlbnRyeSA9PSBiYWRfZG1hX2FkZHJlc3MpIHsKQEAgLTQ2NCw3ICs0NTQsNyBAQAogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsID0gZmluZF9pb21tdV90YWJsZShkZXYpOwogCiAJdWFkZHIgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKLQlucGFnZXMgPSBudW1fZG1hX3BhZ2VzKHVhZGRyLCBzaXplKTsKKwlucGFnZXMgPSBpb21tdV9udW1fcGFnZXModWFkZHIsIHNpemUsIFBBR0VfU0laRSk7CiAKIAlyZXR1cm4gaW9tbXVfYWxsb2MoZGV2LCB0YmwsIHZhZGRyLCBucGFnZXMsIGRpcmVjdGlvbik7CiB9CkBAIC00NzUsNyArNDY1LDcgQEAKIAlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGZpbmRfaW9tbXVfdGFibGUoZGV2KTsKIAl1bnNpZ25lZCBpbnQgbnBhZ2VzOwogCi0JbnBhZ2VzID0gbnVtX2RtYV9wYWdlcyhkbWFfaGFuZGxlLCBzaXplKTsKKwlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgc2l6ZSwgUEFHRV9TSVpFKTsKIAlpb21tdV9mcmVlKHRibCwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKIH0KIApAQCAtNDkxLDYgKzQ4MSw4IEBACiAJbnBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwogCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwogCisJZmxhZyAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9ETUEzMik7CisKIAkvKiBhbGxvYyBlbm91Z2ggcGFnZXMgKGFuZCBwb3NzaWJseSBtb3JlKSAqLwogCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFnLCBvcmRlcik7CiAJaWYgKCFyZXQpCkBAIC01MTAsOCArNTAyLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgY2FsZ2FyeV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBucGFnZXM7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBmaW5kX2lvbW11X3RhYmxlKGRldik7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlucGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisKKwlpb21tdV9mcmVlKHRibCwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCiBzdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBjYWxnYXJ5X2RtYV9vcHMgPSB7CiAJLmFsbG9jX2NvaGVyZW50ID0gY2FsZ2FyeV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCA9IGNhbGdhcnlfZnJlZV9jb2hlcmVudCwKIAkubWFwX3NpbmdsZSA9IGNhbGdhcnlfbWFwX3NpbmdsZSwKIAkudW5tYXBfc2luZ2xlID0gY2FsZ2FyeV91bm1hcF9zaW5nbGUsCiAJLm1hcF9zZyA9IGNhbGdhcnlfbWFwX3NnLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggODdkNGQ2OS4uMTkyNjI0OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC00MSwxMSArNDEsMTIgQEAKIC8qIER1bW15IGRldmljZSB1c2VkIGZvciBOVUxMIGFyZ3VtZW50cyAobm9ybWFsbHkgSVNBKS4gQmV0dGVyIHdvdWxkCiAgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1idWcgY29tcGF0aWJsZQogICAgdG8gb2xkZXIgaTM4Ni4gKi8KLXN0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2ID0geworc3RydWN0IGRldmljZSB4ODZfZG1hX2ZhbGxiYWNrX2RldiA9IHsKIAkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCiAJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0ssCi0JLmRtYV9tYXNrID0gJmZhbGxiYWNrX2Rldi5jb2hlcmVudF9kbWFfbWFzaywKKwkuZG1hX21hc2sgPSAmeDg2X2RtYV9mYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OworRVhQT1JUX1NZTUJPTCh4ODZfZG1hX2ZhbGxiYWNrX2Rldik7CiAKIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKIHsKQEAgLTgyLDcgKzgzLDcgQEAKIAkgKiB1c2luZyA1MTJNIGFzIGdvYWwKIAkgKi8KIAlhbGlnbiA9IDY0VUxMPDwyMDsKLQlzaXplID0gcm91bmRfdXAoZG1hMzJfYm9vdG1lbV9zaXplLCBhbGlnbik7CisJc2l6ZSA9IHJvdW5kdXAoZG1hMzJfYm9vdG1lbV9zaXplLCBhbGlnbik7CiAJZG1hMzJfYm9vdG1lbV9wdHIgPSBfX2FsbG9jX2Jvb3RtZW1fbm9wYW5pYyhzaXplLCBhbGlnbiwKIAkJCQkgNTEyVUxMPDwyMCk7CiAJaWYgKGRtYTMyX2Jvb3RtZW1fcHRyKQpAQCAtMTI0LDE1ICsxMjUsNDYgQEAKIAlwY2lfc3dpb3RsYl9pbml0KCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgaW9tbXVfbnVtX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit1bnNpZ25lZCBsb25nIGlvbW11X25yX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gcm91bmR1cCgoYWRkciAmIH5QQUdFX01BU0spICsgbGVuLCBQQUdFX1NJWkUpOwogCiAJcmV0dXJuIHNpemUgPj4gUEFHRV9TSElGVDsKIH0KLUVYUE9SVF9TWU1CT0woaW9tbXVfbnVtX3BhZ2VzKTsKK0VYUE9SVF9TWU1CT0woaW9tbXVfbnJfcGFnZXMpOwogI2VuZGlmCiAKK3ZvaWQgKmRtYV9nZW5lcmljX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJIGRtYV9hZGRyX3QgKmRtYV9hZGRyLCBnZnBfdCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZG1hX21hc2s7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBhZGRyOworCisJZG1hX21hc2sgPSBkbWFfYWxsb2NfY29oZXJlbnRfbWFzayhkZXYsIGZsYWcpOworCisJZmxhZyB8PSBfX0dGUF9aRVJPOworYWdhaW46CisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoZGV2X3RvX25vZGUoZGV2KSwgZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwlpZiAoIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfbWFzaywgYWRkciwgc2l6ZSkpIHsKKwkJX19mcmVlX3BhZ2VzKHBhZ2UsIGdldF9vcmRlcihzaXplKSk7CisKKwkJaWYgKGRtYV9tYXNrIDwgRE1BXzMyQklUX01BU0sgJiYgIShmbGFnICYgR0ZQX0RNQSkpIHsKKwkJCWZsYWcgPSAoZmxhZyAmIH5HRlBfRE1BMzIpIHwgR0ZQX0RNQTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZG1hX2FkZHIgPSBhZGRyOworCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7Cit9CisKIC8qCiAgKiBTZWUgPERvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQ+IGZvciB0aGUgaW9tbXUga2VybmVsIHBhcmFtZXRlcgogICogZG9jdW1lbnRhdGlvbi4KQEAgLTI0MSwxNDcgKzI3Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOwogCi0vKiBBbGxvY2F0ZSBETUEgbWVtb3J5IG9uIG5vZGUgbmVhciBkZXZpY2UgKi8KLXN0YXRpYyBub2lubGluZSBzdHJ1Y3QgcGFnZSAqCi1kbWFfYWxsb2NfcGFnZXMoc3RydWN0IGRldmljZSAqZGV2LCBnZnBfdCBnZnAsIHVuc2lnbmVkIG9yZGVyKQotewotCWludCBub2RlOwotCi0Jbm9kZSA9IGRldl90b19ub2RlKGRldik7Ci0KLQlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBnZnAsIG9yZGVyKTsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBjb2hlcmVudCBtYXBwaW5nLgotICovCi12b2lkICoKLWRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkgICBnZnBfdCBnZnApCi17Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKLQl2b2lkICptZW1vcnkgPSBOVUxMOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgZG1hX21hc2sgPSAwOwotCWRtYV9hZGRyX3QgYnVzOwotCWludCBub3JldHJ5ID0gMDsKLQotCS8qIGlnbm9yZSByZWdpb24gc3BlY2lmaWVycyAqLwotCWdmcCAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9ETUEzMik7Ci0KLQlpZiAoZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCAmbWVtb3J5KSkKLQkJcmV0dXJuIG1lbW9yeTsKLQotCWlmICghZGV2KSB7Ci0JCWRldiA9ICZmYWxsYmFja19kZXY7Ci0JCWdmcCB8PSBHRlBfRE1BOwotCX0KLQlkbWFfbWFzayA9IGRldi0+Y29oZXJlbnRfZG1hX21hc2s7Ci0JaWYgKGRtYV9tYXNrID09IDApCi0JCWRtYV9tYXNrID0gKGdmcCAmIEdGUF9ETUEpID8gRE1BXzI0QklUX01BU0sgOiBETUFfMzJCSVRfTUFTSzsKLQotCS8qIERldmljZSBub3QgRE1BIGFibGUgKi8KLQlpZiAoZGV2LT5kbWFfbWFzayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIERvbid0IGludm9rZSBPT00ga2lsbGVyIG9yIHJldHJ5IGluIGxvd2VyIDE2TUIgRE1BIHpvbmUgKi8KLQlpZiAoZ2ZwICYgX19HRlBfRE1BKQotCQlub3JldHJ5ID0gMTsKLQotI2lmZGVmIENPTkZJR19YODZfNjQKLQkvKiBXaHkgPD0/IEV2ZW4gd2hlbiB0aGUgbWFzayBpcyBzbWFsbGVyIHRoYW4gNEdCIGl0IGlzIG9mdGVuCi0JICAgbGFyZ2VyIHRoYW4gMTZNQiBhbmQgaW4gdGhpcyBjYXNlIHdlIGhhdmUgYSBjaGFuY2Ugb2YKLQkgICBmaW5kaW5nIGZpdHRpbmcgbWVtb3J5IGluIHRoZSBuZXh0IGhpZ2hlciB6b25lIGZpcnN0LiBJZgotCSAgIG5vdCByZXRyeSB3aXRoIHRydWUgR0ZQX0RNQS4gLUFLICovCi0JaWYgKGRtYV9tYXNrIDw9IERNQV8zMkJJVF9NQVNLICYmICEoZ2ZwICYgR0ZQX0RNQSkpIHsKLQkJZ2ZwIHw9IEdGUF9ETUEzMjsKLQkJaWYgKGRtYV9tYXNrIDwgRE1BXzMyQklUX01BU0spCi0JCQlub3JldHJ5ID0gMTsKLQl9Ci0jZW5kaWYKLQotIGFnYWluOgotCXBhZ2UgPSBkbWFfYWxsb2NfcGFnZXMoZGV2LAotCQlub3JldHJ5ID8gZ2ZwIHwgX19HRlBfTk9SRVRSWSA6IGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKLQlpZiAocGFnZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXsKLQkJaW50IGhpZ2gsIG1tdTsKLQkJYnVzID0gcGFnZV90b19waHlzKHBhZ2UpOwotCQltZW1vcnkgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCWhpZ2ggPSAoYnVzICsgc2l6ZSkgPj0gZG1hX21hc2s7Ci0JCW1tdSA9IGhpZ2g7Ci0JCWlmIChmb3JjZV9pb21tdSAmJiAhKGdmcCAmIEdGUF9ETUEpKQotCQkJbW11ID0gMTsKLQkJZWxzZSBpZiAoaGlnaCkgewotCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksCi0JCQkJICAgZ2V0X29yZGVyKHNpemUpKTsKLQotCQkJLyogRG9uJ3QgdXNlIHRoZSAxNk1CIFpPTkVfRE1BIHVubGVzcyBhYnNvbHV0ZWx5Ci0JCQkgICBuZWVkZWQuIEl0J3MgYmV0dGVyIHRvIHVzZSByZW1hcHBpbmcgZmlyc3QuICovCi0JCQlpZiAoZG1hX21hc2sgPCBETUFfMzJCSVRfTUFTSyAmJiAhKGdmcCAmIEdGUF9ETUEpKSB7Ci0JCQkJZ2ZwID0gKGdmcCAmIH5HRlBfRE1BMzIpIHwgR0ZQX0RNQTsKLQkJCQlnb3RvIGFnYWluOwotCQkJfQotCi0JCQkvKiBMZXQgbG93IGxldmVsIG1ha2UgaXRzIG93biB6b25lIGRlY2lzaW9ucyAqLwotCQkJZ2ZwICY9IH4oR0ZQX0RNQTMyfEdGUF9ETUEpOwotCi0JCQlpZiAob3BzLT5hbGxvY19jb2hlcmVudCkKLQkJCQlyZXR1cm4gb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsCi0JCQkJCQkJICAgZG1hX2hhbmRsZSwgZ2ZwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJbWVtc2V0KG1lbW9yeSwgMCwgc2l6ZSk7Ci0JCWlmICghbW11KSB7Ci0JCQkqZG1hX2hhbmRsZSA9IGJ1czsKLQkJCXJldHVybiBtZW1vcnk7Ci0JCX0KLQl9Ci0KLQlpZiAob3BzLT5hbGxvY19jb2hlcmVudCkgewotCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1lbW9yeSwgZ2V0X29yZGVyKHNpemUpKTsKLQkJZ2ZwICY9IH4oR0ZQX0RNQXxHRlBfRE1BMzIpOwotCQlyZXR1cm4gb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsIGdmcCk7Ci0JfQotCi0JaWYgKG9wcy0+bWFwX3NpbXBsZSkgewotCQkqZG1hX2hhbmRsZSA9IG9wcy0+bWFwX3NpbXBsZShkZXYsIHZpcnRfdG9fcGh5cyhtZW1vcnkpLAotCQkJCQkgICAgICBzaXplLAotCQkJCQkgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCQlpZiAoKmRtYV9oYW5kbGUgIT0gYmFkX2RtYV9hZGRyZXNzKQotCQkJcmV0dXJuIG1lbW9yeTsKLQl9Ci0KLQlpZiAocGFuaWNfb25fb3ZlcmZsb3cpCi0JCXBhbmljKCJkbWFfYWxsb2NfY29oZXJlbnQ6IElPTU1VIG92ZXJmbG93IGJ5ICVsdSBieXRlc1xuIiwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW1vcnksIGdldF9vcmRlcihzaXplKSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19jb2hlcmVudCk7Ci0KLS8qCi0gKiBVbm1hcCBjb2hlcmVudCBtZW1vcnkuCi0gKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIGRldmljZSBoYXMgZmluaXNoZWQgYWNjZXNzaW5nIHRoZSBtYXBwaW5nLgotICovCi12b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgYnVzKQotewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7Ci0KLQlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwkvKiBmb3IgcG9ydGFiaWxpdHkgKi8KLQlpZiAoZG1hX3JlbGVhc2VfZnJvbV9jb2hlcmVudChkZXYsIG9yZGVyLCB2YWRkcikpCi0JCXJldHVybjsKLQlpZiAob3BzLT51bm1hcF9zaW5nbGUpCi0JCW9wcy0+dW5tYXBfc2luZ2xlKGRldiwgYnVzLCBzaXplLCAwKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBvcmRlcik7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9mcmVlX2NvaGVyZW50KTsKLQogc3RhdGljIGludCBfX2luaXQgcGNpX2lvbW11X2luaXQodm9pZCkKIHsKIAljYWxnYXJ5X2lvbW11X2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktZ2FydF82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMKaW5kZXggNDkyODVmOC4uZTNmNzViYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvbW11LWhlbHBlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KQEAgLTgwLDkgKzgwLDEwIEBACiBBR1BFWFRFUk4gX191MzIgKmFncF9nYXR0X3RhYmxlOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2JpdDsgIC8qIHByb3RlY3RlZCBieSBpb21tdV9iaXRtYXBfbG9jayAqLwotc3RhdGljIGludCBuZWVkX2ZsdXNoOwkJLyogZ2xvYmFsIGZsdXNoIHN0YXRlLiBzZXQgZm9yIGVhY2ggZ2FydCB3cmFwICovCitzdGF0aWMgYm9vbCBuZWVkX2ZsdXNoOwkJLyogZ2xvYmFsIGZsdXNoIHN0YXRlLiBzZXQgZm9yIGVhY2ggZ2FydCB3cmFwICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX2lvbW11KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzaXplLAorCQkJCSB1bnNpZ25lZCBsb25nIGFsaWduX21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZTsKQEAgLTkwLDI2ICs5MSwyNyBAQAogCiAJYmFzZV9pbmRleCA9IEFMSUdOKGlvbW11X2J1c19iYXNlICYgZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KSwKIAkJCSAgIFBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKLQlib3VuZGFyeV9zaXplID0gQUxJR04oZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KSArIDEsCisJYm91bmRhcnlfc2l6ZSA9IEFMSUdOKCh1bnNpZ25lZCBsb25nIGxvbmcpZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KSArIDEsCiAJCQkgICAgICBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIAlvZmZzZXQgPSBpb21tdV9hcmVhX2FsbG9jKGlvbW11X2dhcnRfYml0bWFwLCBpb21tdV9wYWdlcywgbmV4dF9iaXQsCi0JCQkJICBzaXplLCBiYXNlX2luZGV4LCBib3VuZGFyeV9zaXplLCAwKTsKKwkJCQkgIHNpemUsIGJhc2VfaW5kZXgsIGJvdW5kYXJ5X3NpemUsIGFsaWduX21hc2spOwogCWlmIChvZmZzZXQgPT0gLTEpIHsKLQkJbmVlZF9mbHVzaCA9IDE7CisJCW5lZWRfZmx1c2ggPSB0cnVlOwogCQlvZmZzZXQgPSBpb21tdV9hcmVhX2FsbG9jKGlvbW11X2dhcnRfYml0bWFwLCBpb21tdV9wYWdlcywgMCwKLQkJCQkJICBzaXplLCBiYXNlX2luZGV4LCBib3VuZGFyeV9zaXplLCAwKTsKKwkJCQkJICBzaXplLCBiYXNlX2luZGV4LCBib3VuZGFyeV9zaXplLAorCQkJCQkgIGFsaWduX21hc2spOwogCX0KIAlpZiAob2Zmc2V0ICE9IC0xKSB7CiAJCW5leHRfYml0ID0gb2Zmc2V0K3NpemU7CiAJCWlmIChuZXh0X2JpdCA+PSBpb21tdV9wYWdlcykgewogCQkJbmV4dF9iaXQgPSAwOwotCQkJbmVlZF9mbHVzaCA9IDE7CisJCQluZWVkX2ZsdXNoID0gdHJ1ZTsKIAkJfQogCX0KIAlpZiAoaW9tbXVfZnVsbGZsdXNoKQotCQluZWVkX2ZsdXNoID0gMTsKKwkJbmVlZF9mbHVzaCA9IHRydWU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBvZmZzZXQ7CkBAIC0xMzQsNyArMTM2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIAlpZiAobmVlZF9mbHVzaCkgewogCQlrOF9mbHVzaF9nYXJ0cygpOwotCQluZWVkX2ZsdXNoID0gMDsKKwkJbmVlZF9mbHVzaCA9IGZhbHNlOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwogfQpAQCAtMTczLDcgKzE3NSw4IEBACiAJICAgICAgIGlvbW11X2xlYWtfcGFnZXMpOwogCWZvciAoaSA9IDA7IGkgPCBpb21tdV9sZWFrX3BhZ2VzOyBpICs9IDIpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVsdTogIiwgaW9tbXVfcGFnZXMtaSk7Ci0JCXByaW50a19hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBpb21tdV9sZWFrX3RhYltpb21tdV9wYWdlcy1pXSwgMCk7CisJCXByaW50a19hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBpb21tdV9sZWFrX3RhYltpb21tdV9wYWdlcy1pXSwKKwkJCQkwKTsKIAkJcHJpbnRrKEtFUk5fQ09OVCAiJWMiLCAoaSsxKSUyID09IDAgPyAnXG4nIDogJyAnKTsKIAl9CiAJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CkBAIC0yMTIsMzQgKzIxNSwyNCBAQAogc3RhdGljIGlubGluZSBpbnQKIG5lZWRfaW9tbXUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBzaXplKQogewotCXU2NCBtYXNrID0gKmRldi0+ZG1hX21hc2s7Ci0JaW50IGhpZ2ggPSBhZGRyICsgc2l6ZSA+IG1hc2s7Ci0JaW50IG1tdSA9IGhpZ2g7Ci0KLQlpZiAoZm9yY2VfaW9tbXUpCi0JCW1tdSA9IDE7Ci0KLQlyZXR1cm4gbW11OworCXJldHVybiBmb3JjZV9pb21tdSB8fAorCQkhaXNfYnVmZmVyX2RtYV9jYXBhYmxlKCpkZXYtPmRtYV9tYXNrLCBhZGRyLCBzaXplKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKIG5vbmZvcmNlZF9pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IHNpemUpCiB7Ci0JdTY0IG1hc2sgPSAqZGV2LT5kbWFfbWFzazsKLQlpbnQgaGlnaCA9IGFkZHIgKyBzaXplID4gbWFzazsKLQlpbnQgbW11ID0gaGlnaDsKLQotCXJldHVybiBtbXU7CisJcmV0dXJuICFpc19idWZmZXJfZG1hX2NhcGFibGUoKmRldi0+ZG1hX21hc2ssIGFkZHIsIHNpemUpOwogfQogCiAvKiBNYXAgYSBzaW5nbGUgY29udGludW91cyBwaHlzaWNhbCBhcmVhIGludG8gdGhlIElPTU1VLgogICogQ2FsbGVyIG5lZWRzIHRvIGNoZWNrIGlmIHRoZSBpb21tdSBpcyBuZWVkZWQgYW5kIGZsdXNoLgogICovCiBzdGF0aWMgZG1hX2FkZHJfdCBkbWFfbWFwX2FyZWEoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IHBoeXNfbWVtLAotCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyKQorCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyLCB1bnNpZ25lZCBsb25nIGFsaWduX21hc2spCiB7Ci0JdW5zaWduZWQgbG9uZyBucGFnZXMgPSBpb21tdV9udW1fcGFnZXMocGh5c19tZW0sIHNpemUpOwotCXVuc2lnbmVkIGxvbmcgaW9tbXVfcGFnZSA9IGFsbG9jX2lvbW11KGRldiwgbnBhZ2VzKTsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhwaHlzX21lbSwgc2l6ZSwgUEFHRV9TSVpFKTsKKwl1bnNpZ25lZCBsb25nIGlvbW11X3BhZ2UgPSBhbGxvY19pb21tdShkZXYsIG5wYWdlcywgYWxpZ25fbWFzayk7CiAJaW50IGk7CiAKIAlpZiAoaW9tbXVfcGFnZSA9PSAtMSkgewpAQCAtMjU5LDE2ICsyNTIsNiBAQAogCXJldHVybiBpb21tdV9idXNfYmFzZSArIGlvbW11X3BhZ2UqUEFHRV9TSVpFICsgKHBoeXNfbWVtICYgflBBR0VfTUFTSyk7CiB9CiAKLXN0YXRpYyBkbWFfYWRkcl90Ci1nYXJ0X21hcF9zaW1wbGUoc3RydWN0IGRldmljZSAqZGV2LCBwaHlzX2FkZHJfdCBwYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXIpCi17Ci0JZG1hX2FkZHJfdCBtYXAgPSBkbWFfbWFwX2FyZWEoZGV2LCBwYWRkciwgc2l6ZSwgZGlyKTsKLQotCWZsdXNoX2dhcnQoKTsKLQotCXJldHVybiBtYXA7Ci19Ci0KIC8qIE1hcCBhIHNpbmdsZSBhcmVhIGludG8gdGhlIElPTU1VICovCiBzdGF0aWMgZG1hX2FkZHJfdAogZ2FydF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQpAQCAtMjc2LDEyICsyNTksMTMgQEAKIAl1bnNpZ25lZCBsb25nIGJ1czsKIAogCWlmICghZGV2KQotCQlkZXYgPSAmZmFsbGJhY2tfZGV2OworCQlkZXYgPSAmeDg2X2RtYV9mYWxsYmFja19kZXY7CiAKIAlpZiAoIW5lZWRfaW9tbXUoZGV2LCBwYWRkciwgc2l6ZSkpCiAJCXJldHVybiBwYWRkcjsKIAotCWJ1cyA9IGdhcnRfbWFwX3NpbXBsZShkZXYsIHBhZGRyLCBzaXplLCBkaXIpOworCWJ1cyA9IGRtYV9tYXBfYXJlYShkZXYsIHBhZGRyLCBzaXplLCBkaXIsIDApOworCWZsdXNoX2dhcnQoKTsKIAogCXJldHVybiBidXM7CiB9CkBAIC0zMDEsNyArMjg1LDcgQEAKIAkJcmV0dXJuOwogCiAJaW9tbXVfcGFnZSA9IChkbWFfYWRkciAtIGlvbW11X2J1c19iYXNlKT4+UEFHRV9TSElGVDsKLQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2FkZHIsIHNpemUpOworCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKIAkJaW9tbXVfZ2F0dF9iYXNlW2lvbW11X3BhZ2UgKyBpXSA9IGdhcnRfdW5tYXBwZWRfZW50cnk7CiAJCUNMRUFSX0xFQUsoaW9tbXVfcGFnZSArIGkpOwpAQCAtMzQwLDcgKzMyNCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHNnX3BoeXMocyk7CiAKIAkJaWYgKG5vbmZvcmNlZF9pb21tdShkZXYsIGFkZHIsIHMtPmxlbmd0aCkpIHsKLQkJCWFkZHIgPSBkbWFfbWFwX2FyZWEoZGV2LCBhZGRyLCBzLT5sZW5ndGgsIGRpcik7CisJCQlhZGRyID0gZG1hX21hcF9hcmVhKGRldiwgYWRkciwgcy0+bGVuZ3RoLCBkaXIsIDApOwogCQkJaWYgKGFkZHIgPT0gYmFkX2RtYV9hZGRyZXNzKSB7CiAJCQkJaWYgKGkgPiAwKQogCQkJCQlnYXJ0X3VubWFwX3NnKGRldiwgc2csIGksIGRpcik7CkBAIC0zNjIsNyArMzQ2LDcgQEAKIAkJCSAgaW50IG5lbGVtcywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzb3V0LAogCQkJICB1bnNpZ25lZCBsb25nIHBhZ2VzKQogewotCXVuc2lnbmVkIGxvbmcgaW9tbXVfc3RhcnQgPSBhbGxvY19pb21tdShkZXYsIHBhZ2VzKTsKKwl1bnNpZ25lZCBsb25nIGlvbW11X3N0YXJ0ID0gYWxsb2NfaW9tbXUoZGV2LCBwYWdlcywgMCk7CiAJdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlID0gaW9tbXVfc3RhcnQ7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwogCWludCBpOwpAQCAtMzg0LDcgKzM2OCw3IEBACiAJCX0KIAogCQlhZGRyID0gcGh5c19hZGRyOwotCQlwYWdlcyA9IGlvbW11X251bV9wYWdlcyhzLT5vZmZzZXQsIHMtPmxlbmd0aCk7CisJCXBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHMtPm9mZnNldCwgcy0+bGVuZ3RoLCBQQUdFX1NJWkUpOwogCQl3aGlsZSAocGFnZXMtLSkgewogCQkJaW9tbXVfZ2F0dF9iYXNlW2lvbW11X3BhZ2VdID0gR1BURV9FTkNPREUoYWRkcik7CiAJCQlTRVRfTEVBSyhpb21tdV9wYWdlKTsKQEAgLTQyNyw3ICs0MTEsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghZGV2KQotCQlkZXYgPSAmZmFsbGJhY2tfZGV2OworCQlkZXYgPSAmeDg2X2RtYV9mYWxsYmFja19kZXY7CiAKIAlvdXQgPSAwOwogCXN0YXJ0ID0gMDsKQEAgLTQ2Nyw3ICs0NTEsNyBAQAogCiAJCXNlZ19zaXplICs9IHMtPmxlbmd0aDsKIAkJbmVlZCA9IG5leHRuZWVkOwotCQlwYWdlcyArPSBpb21tdV9udW1fcGFnZXMocy0+b2Zmc2V0LCBzLT5sZW5ndGgpOworCQlwYWdlcyArPSBpb21tdV9udW1fcGFnZXMocy0+b2Zmc2V0LCBzLT5sZW5ndGgsIFBBR0VfU0laRSk7CiAJCXBzID0gczsKIAl9CiAJaWYgKGRtYV9tYXBfY29udChkZXYsIHN0YXJ0X3NnLCBpIC0gc3RhcnQsIHNnbWFwLCBwYWdlcywgbmVlZCkgPCAwKQpAQCAtNDk5LDYgKzQ4Myw0NiBAQAogCXJldHVybiAwOwogfQogCisvKiBhbGxvY2F0ZSBhbmQgbWFwIGEgY29oZXJlbnQgbWFwcGluZyAqLworc3RhdGljIHZvaWQgKgorZ2FydF9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfYWRkciwKKwkJICAgIGdmcF90IGZsYWcpCit7CisJZG1hX2FkZHJfdCBwYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFsaWduX21hc2s7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoZm9yY2VfaW9tbXUgJiYgIShmbGFnICYgR0ZQX0RNQSkpIHsKKwkJZmxhZyAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9ETUEzMik7CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhmbGFnIHwgX19HRlBfWkVSTywgZ2V0X29yZGVyKHNpemUpKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJYWxpZ25fbWFzayA9ICgxVUwgPDwgZ2V0X29yZGVyKHNpemUpKSAtIDE7CisJCXBhZGRyID0gZG1hX21hcF9hcmVhKGRldiwgcGFnZV90b19waHlzKHBhZ2UpLCBzaXplLAorCQkJCSAgICAgRE1BX0JJRElSRUNUSU9OQUwsIGFsaWduX21hc2spOworCisJCWZsdXNoX2dhcnQoKTsKKwkJaWYgKHBhZGRyICE9IGJhZF9kbWFfYWRkcmVzcykgeworCQkJKmRtYV9hZGRyID0gcGFkZHI7CisJCQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQl9CisJCV9fZnJlZV9wYWdlcyhwYWdlLCBnZXRfb3JkZXIoc2l6ZSkpOworCX0gZWxzZQorCQlyZXR1cm4gZG1hX2dlbmVyaWNfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfYWRkciwgZmxhZyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogZnJlZSBhIGNvaGVyZW50IG1hcHBpbmcgKi8KK3N0YXRpYyB2b2lkCitnYXJ0X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCisJCSAgIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJZ2FydF91bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKIHN0YXRpYyBpbnQgbm9fYWdwOwogCiBzdGF0aWMgX19pbml0IHVuc2lnbmVkIGxvbmcgY2hlY2tfaW9tbXVfc2l6ZSh1bnNpZ25lZCBsb25nIGFwZXIsIHU2NCBhcGVyX3NpemUpCkBAIC02MjYsNyArNjUwLDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXZvaWQgKmdhdHQ7CiAJaW50IGksIGVycm9yOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogRGlzYWJsaW5nIEFHUC5cbiIpOwogCWFwZXJfc2l6ZSA9IGFwZXJfYmFzZSA9IGluZm8tPmFwZXJfc2l6ZSA9IDA7CkBAIC02NTAsMTMgKzY3MywxMyBAQAogCWluZm8tPmFwZXJfc2l6ZSA9IGFwZXJfc2l6ZSA+PiAyMDsKIAogCWdhdHRfc2l6ZSA9IChhcGVyX3NpemUgPj4gUEFHRV9TSElGVCkgKiBzaXplb2YodTMyKTsKLQlnYXR0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcihnYXR0X3NpemUpKTsKKwlnYXR0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAorCQkJCQlnZXRfb3JkZXIoZ2F0dF9zaXplKSk7CiAJaWYgKCFnYXR0KQogCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIEdBVFQgdGFibGUiKTsKIAlpZiAoc2V0X21lbW9yeV91YygodW5zaWduZWQgbG9uZylnYXR0LCBnYXR0X3NpemUgPj4gUEFHRV9TSElGVCkpCiAJCXBhbmljKCJDb3VsZCBub3Qgc2V0IEdBUlQgUFRFcyB0byB1bmNhY2hlYWJsZSBwYWdlcyIpOwogCi0JbWVtc2V0KGdhdHQsIDAsIGdhdHRfc2l6ZSk7CiAJYWdwX2dhdHRfdGFibGUgPSBnYXR0OwogCiAJZW5hYmxlX2dhcnRfdHJhbnNsYXRpb25zKCk7CkBAIC02NjUsMTkgKzY4OCwxNCBAQAogCWlmICghZXJyb3IpCiAJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfZ2FydCk7CiAJaWYgKGVycm9yKQotCQlwYW5pYygiQ291bGQgbm90IHJlZ2lzdGVyIGdhcnRfc3lzZGV2IC0tIHdvdWxkIGNvcnJ1cHQgZGF0YSBvbiBuZXh0IHN1c3BlbmQiKTsKKwkJcGFuaWMoIkNvdWxkIG5vdCByZWdpc3RlciBnYXJ0X3N5c2RldiAtLSAiCisJCSAgICAgICJ3b3VsZCBjb3JydXB0IGRhdGEgb24gbmV4dCBzdXNwZW5kIik7CiAKIAlmbHVzaF9nYXJ0KCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBhcGVydHVyZSBiYXNlIEAgJXggc2l6ZSAldSBLQlxuIiwKIAkgICAgICAgYXBlcl9iYXNlLCBhcGVyX3NpemU+PjEwKTsKIAotCS8qIG5lZWQgdG8gbWFwIHRoYXQgcmFuZ2UgKi8KLQllbmRfcGZuID0gKGFwZXJfYmFzZT4+UEFHRV9TSElGVCkgKyAoYXBlcl9zaXplPj5QQUdFX1NISUZUKTsKLQlpZiAoZW5kX3BmbiA+IG1heF9sb3dfcGZuX21hcHBlZCkgewotCQlzdGFydF9wZm4gPSAoYXBlcl9iYXNlPj5QQUdFX1NISUZUKTsKLQkJaW5pdF9tZW1vcnlfbWFwcGluZyhzdGFydF9wZm48PFBBR0VfU0hJRlQsIGVuZF9wZm48PFBBR0VfU0hJRlQpOwotCX0KIAlyZXR1cm4gMDsKIAogIG5vbW11OgpAQCAtNjg3LDIwICs3MDUsMTMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWV4dGVybiBpbnQgYWdwX2FtZDY0X2luaXQodm9pZCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGdhcnRfZG1hX29wcyA9IHsKIAkubWFwX3NpbmdsZQkJCT0gZ2FydF9tYXBfc2luZ2xlLAotCS5tYXBfc2ltcGxlCQkJPSBnYXJ0X21hcF9zaW1wbGUsCiAJLnVubWFwX3NpbmdsZQkJCT0gZ2FydF91bm1hcF9zaW5nbGUsCi0JLnN5bmNfc2luZ2xlX2Zvcl9jcHUJCT0gTlVMTCwKLQkuc3luY19zaW5nbGVfZm9yX2RldmljZQkJPSBOVUxMLAotCS5zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1CT0gTlVMTCwKLQkuc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZQk9IE5VTEwsCi0JLnN5bmNfc2dfZm9yX2NwdQkJPSBOVUxMLAotCS5zeW5jX3NnX2Zvcl9kZXZpY2UJCT0gTlVMTCwKIAkubWFwX3NnCQkJCT0gZ2FydF9tYXBfc2csCiAJLnVubWFwX3NnCQkJPSBnYXJ0X3VubWFwX3NnLAorCS5hbGxvY19jb2hlcmVudAkJCT0gZ2FydF9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAkJCT0gZ2FydF9mcmVlX2NvaGVyZW50LAogfTsKIAogdm9pZCBnYXJ0X2lvbW11X3NodXRkb3duKHZvaWQpCkBAIC03MjcsNyArNzM4LDggQEAKIHsKIAlzdHJ1Y3QgYWdwX2tlcm5faW5mbyBpbmZvOwogCXVuc2lnbmVkIGxvbmcgaW9tbXVfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBhcGVyX3NpemU7CisJdW5zaWduZWQgbG9uZyBhcGVyX2Jhc2UsIGFwZXJfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKIAl1bnNpZ25lZCBsb25nIHNjcmF0Y2g7CiAJbG9uZyBpOwogCkBAIC03NTksMzAgKzc3MSwzNSBAQAogCSAgICAobm9fYWdwICYmIGluaXRfazhfZ2F0dCgmaW5mbykgPCAwKSkgewogCQlpZiAobWF4X3BmbiA+IE1BWF9ETUEzMl9QRk4pIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1vcmUgdGhhbiA0R0Igb2YgbWVtb3J5ICIKLQkJCSAgICAgICAJICAgICAgICAgICJidXQgR0FSVCBJT01NVSBub3QgYXZhaWxhYmxlLlxuIgotCQkJICAgICAgIEtFUk5fV0FSTklORyAiZmFsbGluZyBiYWNrIHRvIGlvbW11PXNvZnQuXG4iKTsKKwkJCSAgICAgICAiYnV0IEdBUlQgSU9NTVUgbm90IGF2YWlsYWJsZS5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmFsbGluZyBiYWNrIHRvIGlvbW11PXNvZnQuXG4iKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCisJLyogbmVlZCB0byBtYXAgdGhhdCByYW5nZSAqLworCWFwZXJfc2l6ZSA9IGluZm8uYXBlcl9zaXplIDw8IDIwOworCWFwZXJfYmFzZSA9IGluZm8uYXBlcl9iYXNlOworCWVuZF9wZm4gPSAoYXBlcl9iYXNlPj5QQUdFX1NISUZUKSArIChhcGVyX3NpemU+PlBBR0VfU0hJRlQpOworCWlmIChlbmRfcGZuID4gbWF4X2xvd19wZm5fbWFwcGVkKSB7CisJCXN0YXJ0X3BmbiA9IChhcGVyX2Jhc2U+PlBBR0VfU0hJRlQpOworCQlpbml0X21lbW9yeV9tYXBwaW5nKHN0YXJ0X3Bmbjw8UEFHRV9TSElGVCwgZW5kX3Bmbjw8UEFHRV9TSElGVCk7CisJfQorCiAJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogdXNpbmcgR0FSVCBJT01NVS5cbiIpOwotCWFwZXJfc2l6ZSA9IGluZm8uYXBlcl9zaXplICogMTAyNCAqIDEwMjQ7CiAJaW9tbXVfc2l6ZSA9IGNoZWNrX2lvbW11X3NpemUoaW5mby5hcGVyX2Jhc2UsIGFwZXJfc2l6ZSk7CiAJaW9tbXVfcGFnZXMgPSBpb21tdV9zaXplID4+IFBBR0VfU0hJRlQ7CiAKLQlpb21tdV9nYXJ0X2JpdG1hcCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwlpb21tdV9nYXJ0X2JpdG1hcCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQkJCQkgICAgICBnZXRfb3JkZXIoaW9tbXVfcGFnZXMvOCkpOwogCWlmICghaW9tbXVfZ2FydF9iaXRtYXApCiAJCXBhbmljKCJDYW5ub3QgYWxsb2NhdGUgaW9tbXUgYml0bWFwXG4iKTsKLQltZW1zZXQoaW9tbXVfZ2FydF9iaXRtYXAsIDAsIGlvbW11X3BhZ2VzLzgpOwogCiAjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsKIAlpZiAobGVha190cmFjZSkgewotCQlpb21tdV9sZWFrX3RhYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQlpb21tdV9sZWFrX3RhYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCiAJCQkJICBnZXRfb3JkZXIoaW9tbXVfcGFnZXMqc2l6ZW9mKHZvaWQgKikpKTsKLQkJaWYgKGlvbW11X2xlYWtfdGFiKQotCQkJbWVtc2V0KGlvbW11X2xlYWtfdGFiLCAwLCBpb21tdV9wYWdlcyAqIDgpOwotCQllbHNlCisJCWlmICghaW9tbXVfbGVha190YWIpCiAJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJICAgICAgICJQQ0ktRE1BOiBDYW5ub3QgYWxsb2NhdGUgbGVhayB0cmFjZSBhcmVhXG4iKTsKIAl9CkBAIC03OTIsNyArODA5LDcgQEAKIAkgKiBPdXQgb2YgSU9NTVUgc3BhY2UgaGFuZGxpbmcuCiAJICogUmVzZXJ2ZSBzb21lIGludmFsaWQgcGFnZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgR0FSVC4KIAkgKi8KLQlzZXRfYml0X3N0cmluZyhpb21tdV9nYXJ0X2JpdG1hcCwgMCwgRU1FUkdFTkNZX1BBR0VTKTsKKwlpb21tdV9hcmVhX3Jlc2VydmUoaW9tbXVfZ2FydF9iaXRtYXAsIDAsIEVNRVJHRU5DWV9QQUdFUyk7CiAKIAlhZ3BfbWVtb3J5X3Jlc2VydmVkID0gaW9tbXVfc2l6ZTsKIAlwcmludGsoS0VSTl9JTkZPCkBAIC04NTAsNyArODY3LDggQEAKIAlpZiAoIXN0cm5jbXAocCwgImxlYWsiLCA0KSkgewogCQlsZWFrX3RyYWNlID0gMTsKIAkJcCArPSA0OwotCQlpZiAoKnAgPT0gJz0nKSArK3A7CisJCWlmICgqcCA9PSAnPScpCisJCQkrK3A7CiAJCWlmIChpc2RpZ2l0KCpwKSAmJiBnZXRfb3B0aW9uKCZwLCAmYXJnKSkKIAkJCWlvbW11X2xlYWtfcGFnZXMgPSBhcmc7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1ub21tdS5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1ub21tdS5jCmluZGV4IDNmOTFmNzEuLmM3MGFiNWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wY2ktbm9tbXUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLW5vbW11LmMKQEAgLTE0LDcgKzE0LDcgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX2FkZHIoY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYnVzLCBzaXplX3Qgc2l6ZSkKIHsKLQlpZiAoaHdkZXYgJiYgYnVzICsgc2l6ZSA+ICpod2Rldi0+ZG1hX21hc2spIHsKKwlpZiAoaHdkZXYgJiYgIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZSgqaHdkZXYtPmRtYV9tYXNrLCBidXMsIHNpemUpKSB7CiAJCWlmICgqaHdkZXYtPmRtYV9tYXNrID49IERNQV8zMkJJVF9NQVNLKQogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgIm5vbW11XyVzOiBvdmVyZmxvdyAlTHgrJXp1IG9mIGRldmljZSBtYXNrICVMeFxuIiwKQEAgLTcyLDcgKzcyLDE1IEBACiAJcmV0dXJuIG5lbnRzOwogfQogCitzdGF0aWMgdm9pZCBub21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAorCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKK30KKwogc3RydWN0IGRtYV9tYXBwaW5nX29wcyBub21tdV9kbWFfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IGRtYV9nZW5lcmljX2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50ID0gbm9tbXVfZnJlZV9jb2hlcmVudCwKIAkubWFwX3NpbmdsZSA9IG5vbW11X21hcF9zaW5nbGUsCiAJLm1hcF9zZyA9IG5vbW11X21hcF9zZywKIAkuaXNfcGh5cyA9IDEsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNzcGVha2VyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNzcGVha2VyLmMKaW5kZXggYmMxZjJkMy4uYTMxMWZmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Bjc3BlYWtlci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY3NwZWFrZXIuYwpAQCAtMSwyMCArMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiBzdGF0aWMgX19pbml0IGludCBhZGRfcGNzcGtyKHZvaWQpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7Ci0JaW50IHJldDsKIAotCXBkID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJwY3Nwa3IiLCAtMSk7Ci0JaWYgKCFwZCkKLQkJcmV0dXJuIC1FTk9NRU07CisJcGQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJwY3Nwa3IiLCAtMSwgTlVMTCwgMCk7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkKTsKLQlpZiAocmV0KQotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIElTX0VSUihwZCkgPyBQVFJfRVJSKHBkKSA6IDA7CiB9CiBkZXZpY2VfaW5pdGNhbGwoYWRkX3Bjc3Brcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3ZmM0ZDViLi5jNjIyNzcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE1LDcgKzE1LDYgQEAKIEVYUE9SVF9TWU1CT0woaWRsZV9ub213YWl0KTsKIAogc3RydWN0IGttZW1fY2FjaGUgKnRhc2tfeHN0YXRlX2NhY2hlcDsKLXN0YXRpYyBpbnQgZm9yY2VfbXdhaXQgX19jcHVpbml0ZGF0YTsKIAogaW50IGFyY2hfZHVwX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqZHN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNyYykKIHsKQEAgLTE4NSw3ICsxODQsOCBAQAogc3RhdGljIHZvaWQgcG9sbF9pZGxlKHZvaWQpCiB7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotCWNwdV9yZWxheCgpOworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCisJCWNwdV9yZWxheCgpOwogfQogCiAvKgpAQCAtMjQ2LDYgKzI0NiwxNCBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgY3B1bWFza190IGMxZV9tYXNrID0gQ1BVX01BU0tfTk9ORTsKK3N0YXRpYyBpbnQgYzFlX2RldGVjdGVkOworCit2b2lkIGMxZV9yZW1vdmVfY3B1KGludCBjcHUpCit7CisJY3B1X2NsZWFyKGNwdSwgYzFlX21hc2spOworfQorCiAvKgogICogQzFFIGF3YXJlIGlkbGUgcm91dGluZS4gV2UgY2hlY2sgZm9yIEMxRSBhY3RpdmUgaW4gdGhlIGludGVycnVwdAogICogcGVuZGluZyBtZXNzYWdlIE1TUi4gSWYgd2UgZGV0ZWN0IEMxRSwgdGhlbiB3ZSBoYW5kbGUgaXQgdGhlIHNhbWUKQEAgLTI1Myw5ICsyNjEsNiBAQAogICovCiBzdGF0aWMgdm9pZCBjMWVfaWRsZSh2b2lkKQogewotCXN0YXRpYyBjcHVtYXNrX3QgYzFlX21hc2sgPSBDUFVfTUFTS19OT05FOwotCXN0YXRpYyBpbnQgYzFlX2RldGVjdGVkOwotCiAJaWYgKG5lZWRfcmVzY2hlZCgpKQogCQlyZXR1cm47CiAKQEAgLTI2NSw4ICsyNzAsMTAgQEAKIAkJcmRtc3IoTVNSX0s4X0lOVF9QRU5ESU5HX01TRywgbG8sIGhpKTsKIAkJaWYgKGxvICYgSzhfSU5UUF9DMUVfQUNUSVZFX01BU0spIHsKIAkJCWMxZV9kZXRlY3RlZCA9IDE7Ci0JCQltYXJrX3RzY191bnN0YWJsZSgiVFNDIGhhbHQgaW4gQzFFIik7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJTeXN0ZW0gaGFzIEMxRSBlbmFibGVkXG4iKTsKKwkJCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQykpCisJCQkJbWFya190c2NfdW5zdGFibGUoIlRTQyBoYWx0IGluIEFNRCBDMUUiKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlN5c3RlbSBoYXMgQU1EIEMxRSBlbmFibGVkXG4iKTsKKwkJCXNldF9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BTURDMUUpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCAzYjdhMWRkLi4wYTEzMDJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTU1LDYgKzU2LDkgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9pZGxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiBhc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKSBfX2FzbV9fKCJyZXRfZnJvbV9mb3JrIik7CiAKQEAgLTcyLDQ2ICs3NiwxMiBAQAogCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0c2stPnRocmVhZC5zcClbM107CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLSNpbmNsdWRlIDxhc20vbm1pLmg+Ci0KLXN0YXRpYyB2b2lkIGNwdV9leGl0X2NsZWFyKHZvaWQpCi17Ci0JaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlpZGxlX3Rhc2tfZXhpdCgpOwotCi0JY3B1X3VuaW5pdCgpOwotCWlycV9jdHhfZXhpdChjcHUpOwotCi0JY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKLQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbGluX21hcCk7Ci0KLQludW1hX3JlbW92ZV9jcHUoY3B1KTsKLX0KLQotLyogV2UgZG9uJ3QgYWN0dWFsbHkgdGFrZSBDUFUgZG93biwganVzdCBzcGluIHdpdGhvdXQgaW50ZXJydXB0cy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwbGF5X2RlYWQodm9pZCkKLXsKLQkvKiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgZGVhZCBDUFUgYWNrICovCi0JY3B1X2V4aXRfY2xlYXIoKTsKLQltYigpOwotCS8qIEFjayBpdCAqLwotCV9fZ2V0X2NwdV92YXIoY3B1X3N0YXRlKSA9IENQVV9ERUFEOwotCi0JLyoKLQkgKiBXaXRoIHBoeXNpY2FsIENQVSBob3RwbHVnLCB3ZSBzaG91bGQgaGFsdCB0aGUgY3B1Ci0JICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzLCBmbHVzaCBhbnkgYW5kIGFsbCBjYWNoZXMsIGFuZCBoYWx0ICovCi0Jd2JpbnZkX2hhbHQoKTsKLX0KLSNlbHNlCisjaWZuZGVmIENPTkZJR19TTVAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbGF5X2RlYWQodm9pZCkKIHsKIAlCVUcoKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKyNlbmRpZgogCiAvKgogICogVGhlIGlkbGUgdGhyZWFkLiBUaGVyZSdzIG5vIHVzZWZ1bCB3b3JrIHRvIGJlCkBAIC0xNTMsMTIgKzEyMywxMyBAQAogCX0KIH0KIAotdm9pZCBfX3Nob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKQordm9pZCBfX3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGFsbCkKIHsKIAl1bnNpZ25lZCBsb25nIGNyMCA9IDBMLCBjcjIgPSAwTCwgY3IzID0gMEwsIGNyNCA9IDBMOwogCXVuc2lnbmVkIGxvbmcgZDAsIGQxLCBkMiwgZDMsIGQ2LCBkNzsKIAl1bnNpZ25lZCBsb25nIHNwOwogCXVuc2lnbmVkIHNob3J0IHNzLCBnczsKKwljb25zdCBjaGFyICpib2FyZDsKIAogCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKIAkJc3AgPSByZWdzLT5zcDsKQEAgLTE3MSwxMSArMTQyLDE1IEBACiAJfQogCiAJcHJpbnRrKCJcbiIpOwotCXByaW50aygiUGlkOiAlZCwgY29tbTogJXMgJXMgKCVzICUuKnMpXG4iLAorCisJYm9hcmQgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOworCWlmICghYm9hcmQpCisJCWJvYXJkID0gIiI7CisJcHJpbnRrKCJQaWQ6ICVkLCBjb21tOiAlcyAlcyAoJXMgJS4qcykgJXNcbiIsCiAJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgY3VycmVudC0+Y29tbSwKIAkJCXByaW50X3RhaW50ZWQoKSwgaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCiAJCQkoaW50KXN0cmNzcG4oaW5pdF91dHNuYW1lKCktPnZlcnNpb24sICIgIiksCi0JCQlpbml0X3V0c25hbWUoKS0+dmVyc2lvbik7CisJCQlpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgYm9hcmQpOwogCiAJcHJpbnRrKCJFSVA6ICUwNHg6WzwlMDhseD5dIEVGTEFHUzogJTA4bHggQ1BVOiAlZFxuIiwKIAkJCSh1MTYpcmVncy0+Y3MsIHJlZ3MtPmlwLCByZWdzLT5mbGFncywKQEAgLTIxNCw3ICsxODksNyBAQAogCiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlfX3Nob3dfcmVnaXN0ZXJzKHJlZ3MsIDEpOworCV9fc2hvd19yZWdzKHJlZ3MsIDEpOwogCXNob3dfdHJhY2UoTlVMTCwgcmVncywgJnJlZ3MtPnNwLCByZWdzLT5icCk7CiB9CiAKQEAgLTI3NSw2ICsyNTAsMTQgQEAKIAkJdHNzLT54ODZfdHNzLmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUOwogCQlwdXRfY3B1KCk7CiAJfQorI2lmZGVmIENPTkZJR19YODZfRFMKKwkvKiBGcmVlIGFueSBEUyBjb250ZXh0cyB0aGF0IGhhdmUgbm90IGJlZW4gcHJvcGVybHkgcmVsZWFzZWQuICovCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnRocmVhZC5kc19jdHgpKSB7CisJCS8qIHdlIGNsZWFyIGRlYnVnY3RsIHRvIG1ha2Ugc3VyZSBEUyBpcyBub3QgdXNlZC4gKi8KKwkJdXBkYXRlX2RlYnVnY3RsbXNyKDApOworCQlkc19mcmVlKGN1cnJlbnQtPnRocmVhZC5kc19jdHgpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0RTICovCiB9CiAKIHZvaWQgZmx1c2hfdGhyZWFkKHZvaWQpCkBAIC00MzYsNiArNDE5LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2X0RTCitzdGF0aWMgaW50IHVwZGF0ZV9kZWJ1Z2N0bChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqcHJldiwKKwkJCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0LCB1bnNpZ25lZCBsb25nIGRlYnVnY3RsKQoreworCXVuc2lnbmVkIGxvbmcgZHNfcHJldiA9IDA7CisJdW5zaWduZWQgbG9uZyBkc19uZXh0ID0gMDsKKworCWlmIChwcmV2LT5kc19jdHgpCisJCWRzX3ByZXYgPSAodW5zaWduZWQgbG9uZylwcmV2LT5kc19jdHgtPmRzOworCWlmIChuZXh0LT5kc19jdHgpCisJCWRzX25leHQgPSAodW5zaWduZWQgbG9uZyluZXh0LT5kc19jdHgtPmRzOworCisJaWYgKGRzX25leHQgIT0gZHNfcHJldikgeworCQkvKiB3ZSBjbGVhciBkZWJ1Z2N0bCB0byBtYWtlIHN1cmUgRFMKKwkJICogaXMgbm90IGluIHVzZSB3aGVuIHdlIGNoYW5nZSBpdCAqLworCQlkZWJ1Z2N0bCA9IDA7CisJCXVwZGF0ZV9kZWJ1Z2N0bG1zcigwKTsKKwkJd3Jtc3IoTVNSX0lBMzJfRFNfQVJFQSwgZHNfbmV4dCwgMCk7CisJfQorCXJldHVybiBkZWJ1Z2N0bDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHVwZGF0ZV9kZWJ1Z2N0bChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqcHJldiwKKwkJCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0LCB1bnNpZ25lZCBsb25nIGRlYnVnY3RsKQoreworCXJldHVybiBkZWJ1Z2N0bDsKK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0RTICovCisKIHN0YXRpYyBub2lubGluZSB2b2lkCiBfX3N3aXRjaF90b194dHJhKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKIAkJIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCkBAIC00NDYsMTQgKzQ1OCw3IEBACiAJcHJldiA9ICZwcmV2X3AtPnRocmVhZDsKIAluZXh0ID0gJm5leHRfcC0+dGhyZWFkOwogCi0JZGVidWdjdGwgPSBwcmV2LT5kZWJ1Z2N0bG1zcjsKLQlpZiAobmV4dC0+ZHNfYXJlYV9tc3IgIT0gcHJldi0+ZHNfYXJlYV9tc3IpIHsKLQkJLyogd2UgY2xlYXIgZGVidWdjdGwgdG8gbWFrZSBzdXJlIERTCi0JCSAqIGlzIG5vdCBpbiB1c2Ugd2hlbiB3ZSBjaGFuZ2UgaXQgKi8KLQkJZGVidWdjdGwgPSAwOwotCQl1cGRhdGVfZGVidWdjdGxtc3IoMCk7Ci0JCXdybXNyKE1TUl9JQTMyX0RTX0FSRUEsIG5leHQtPmRzX2FyZWFfbXNyLCAwKTsKLQl9CisJZGVidWdjdGwgPSB1cGRhdGVfZGVidWdjdGwocHJldiwgbmV4dCwgcHJldi0+ZGVidWdjdGxtc3IpOwogCiAJaWYgKG5leHQtPmRlYnVnY3RsbXNyICE9IGRlYnVnY3RsKQogCQl1cGRhdGVfZGVidWdjdGxtc3IobmV4dC0+ZGVidWdjdGxtc3IpOwpAQCAtNDc3LDEzICs0ODIsMTMgQEAKIAkJCWhhcmRfZW5hYmxlX1RTQygpOwogCX0KIAotI2lmZGVmIFg4Nl9CVFMKKyNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKIAlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocHJldl9wLCBUSUZfQlRTX1RSQUNFX1RTKSkKIAkJcHRyYWNlX2J0c190YWtlX3RpbWVzdGFtcChwcmV2X3AsIEJUU19UQVNLX0RFUEFSVFMpOwogCiAJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKG5leHRfcCwgVElGX0JUU19UUkFDRV9UUykpCiAJCXB0cmFjZV9idHNfdGFrZV90aW1lc3RhbXAobmV4dF9wLCBCVFNfVEFTS19BUlJJVkVTKTsKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogCiAKIAlpZiAoIXRlc3RfdHNrX3RocmVhZF9mbGFnKG5leHRfcCwgVElGX0lPX0JJVE1BUCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IDcxNTUzYjYuLmNkOGMwZWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogYXNtbGlua2FnZSBleHRlcm4gdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCkBAIC04NSwyOCArODYsMTIgQEAKIAlfX2V4aXRfaWRsZSgpOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1ERUNMQVJFX1BFUl9DUFUoaW50LCBjcHVfc3RhdGUpOwotCi0jaW5jbHVkZSA8YXNtL25taS5oPgotLyogV2UgaGFsdCB0aGUgQ1BVIHdpdGggcGh5c2ljYWwgQ1BVIGhvdHBsdWcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwbGF5X2RlYWQodm9pZCkKLXsKLQlpZGxlX3Rhc2tfZXhpdCgpOwotCW1iKCk7Ci0JLyogQWNrIGl0ICovCi0JX19nZXRfY3B1X3ZhcihjcHVfc3RhdGUpID0gQ1BVX0RFQUQ7Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCS8qIG1hc2sgYWxsIGludGVycnVwdHMsIGZsdXNoIGFueSBhbmQgYWxsIGNhY2hlcywgYW5kIGhhbHQgKi8KLQl3YmludmRfaGFsdCgpOwotfQotI2Vsc2UKKyNpZm5kZWYgQ09ORklHX1NNUAogc3RhdGljIGlubGluZSB2b2lkIHBsYXlfZGVhZCh2b2lkKQogewogCUJVRygpOwogfQotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworI2VuZGlmCiAKIC8qCiAgKiBUaGUgaWRsZSB0aHJlYWQuIFRoZXJlJ3Mgbm8gdXNlZnVsIHdvcmsgdG8gYmUKQEAgLTE1MSw3ICsxMzYsNyBAQAogfQogCiAvKiBQcmludHMgYWxzbyBzb21lIHN0YXRlIHRoYXQgaXNuJ3Qgc2F2ZWQgaW4gdGhlIHB0X3JlZ3MgKi8KLXZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQordm9pZCBfX3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGFsbCkKIHsKIAl1bnNpZ25lZCBsb25nIGNyMCA9IDBMLCBjcjIgPSAwTCwgY3IzID0gMEwsIGNyNCA9IDBMLCBmcywgZ3MsIHNoYWRvd2dzOwogCXVuc2lnbmVkIGxvbmcgZDAsIGQxLCBkMiwgZDMsIGQ2LCBkNzsKQEAgLTE2MCw2MCArMTQ1LDY1IEBACiAKIAlwcmludGsoIlxuIik7CiAJcHJpbnRfbW9kdWxlcygpOwotCXByaW50aygiUGlkOiAlZCwgY29tbTogJS4yMHMgJXMgJXMgJS4qc1xuIiwKKwlwcmludGsoS0VSTl9JTkZPICJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlcyAlLipzXG4iLAogCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwKIAkJaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCiAJCShpbnQpc3RyY3Nwbihpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgIiAiKSwKIAkJaW5pdF91dHNuYW1lKCktPnZlcnNpb24pOwotCXByaW50aygiUklQOiAlMDRseDpbPCUwMTZseD5dICIsIHJlZ3MtPmNzICYgMHhmZmZmLCByZWdzLT5pcCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUklQOiAlMDRseDpbPCUwMTZseD5dICIsIHJlZ3MtPmNzICYgMHhmZmZmLCByZWdzLT5pcCk7CiAJcHJpbnRrX2FkZHJlc3MocmVncy0+aXAsIDEpOwotCXByaW50aygiUlNQOiAlMDRseDolMDE2bHggIEVGTEFHUzogJTA4bHhcbiIsIHJlZ3MtPnNzLCByZWdzLT5zcCwKLQkJcmVncy0+ZmxhZ3MpOwotCXByaW50aygiUkFYOiAlMDE2bHggUkJYOiAlMDE2bHggUkNYOiAlMDE2bHhcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiUlNQOiAlMDRseDolMDE2bHggIEVGTEFHUzogJTA4bHhcbiIsIHJlZ3MtPnNzLAorCQkJcmVncy0+c3AsIHJlZ3MtPmZsYWdzKTsKKwlwcmludGsoS0VSTl9JTkZPICJSQVg6ICUwMTZseCBSQlg6ICUwMTZseCBSQ1g6ICUwMTZseFxuIiwKIAkgICAgICAgcmVncy0+YXgsIHJlZ3MtPmJ4LCByZWdzLT5jeCk7Ci0JcHJpbnRrKCJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKIAkgICAgICAgcmVncy0+ZHgsIHJlZ3MtPnNpLCByZWdzLT5kaSk7Ci0JcHJpbnRrKCJSQlA6ICUwMTZseCBSMDg6ICUwMTZseCBSMDk6ICUwMTZseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJSQlA6ICUwMTZseCBSMDg6ICUwMTZseCBSMDk6ICUwMTZseFxuIiwKIAkgICAgICAgcmVncy0+YnAsIHJlZ3MtPnI4LCByZWdzLT5yOSk7Ci0JcHJpbnRrKCJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKLQkgICAgICAgcmVncy0+cjEwLCByZWdzLT5yMTEsIHJlZ3MtPnIxMik7IAotCXByaW50aygiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCi0JICAgICAgIHJlZ3MtPnIxMywgcmVncy0+cjE0LCByZWdzLT5yMTUpOyAKKwlwcmludGsoS0VSTl9JTkZPICJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKKwkgICAgICAgcmVncy0+cjEwLCByZWdzLT5yMTEsIHJlZ3MtPnIxMik7CisJcHJpbnRrKEtFUk5fSU5GTyAiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCisJICAgICAgIHJlZ3MtPnIxMywgcmVncy0+cjE0LCByZWdzLT5yMTUpOwogCi0JYXNtKCJtb3ZsICUlZHMsJTAiIDogIj1yIiAoZHMpKTsgCi0JYXNtKCJtb3ZsICUlY3MsJTAiIDogIj1yIiAoY3MpKTsgCi0JYXNtKCJtb3ZsICUlZXMsJTAiIDogIj1yIiAoZXMpKTsgCisJYXNtKCJtb3ZsICUlZHMsJTAiIDogIj1yIiAoZHMpKTsKKwlhc20oIm1vdmwgJSVjcywlMCIgOiAiPXIiIChjcykpOworCWFzbSgibW92bCAlJWVzLCUwIiA6ICI9ciIgKGVzKSk7CiAJYXNtKCJtb3ZsICUlZnMsJTAiIDogIj1yIiAoZnNpbmRleCkpOwogCWFzbSgibW92bCAlJWdzLCUwIiA6ICI9ciIgKGdzaW5kZXgpKTsKIAogCXJkbXNybChNU1JfRlNfQkFTRSwgZnMpOwotCXJkbXNybChNU1JfR1NfQkFTRSwgZ3MpOyAKLQlyZG1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBzaGFkb3dncyk7IAorCXJkbXNybChNU1JfR1NfQkFTRSwgZ3MpOworCXJkbXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIHNoYWRvd2dzKTsKKworCWlmICghYWxsKQorCQlyZXR1cm47CiAKIAljcjAgPSByZWFkX2NyMCgpOwogCWNyMiA9IHJlYWRfY3IyKCk7CiAJY3IzID0gcmVhZF9jcjMoKTsKIAljcjQgPSByZWFkX2NyNCgpOwogCi0JcHJpbnRrKCJGUzogICUwMTZseCglMDR4KSBHUzolMDE2bHgoJTA0eCkga25sR1M6JTAxNmx4XG4iLCAKLQkgICAgICAgZnMsZnNpbmRleCxncyxnc2luZGV4LHNoYWRvd2dzKTsgCi0JcHJpbnRrKCJDUzogICUwNHggRFM6ICUwNHggRVM6ICUwNHggQ1IwOiAlMDE2bHhcbiIsIGNzLCBkcywgZXMsIGNyMCk7IAotCXByaW50aygiQ1IyOiAlMDE2bHggQ1IzOiAlMDE2bHggQ1I0OiAlMDE2bHhcbiIsIGNyMiwgY3IzLCBjcjQpOworCXByaW50ayhLRVJOX0lORk8gIkZTOiAgJTAxNmx4KCUwNHgpIEdTOiUwMTZseCglMDR4KSBrbmxHUzolMDE2bHhcbiIsCisJICAgICAgIGZzLCBmc2luZGV4LCBncywgZ3NpbmRleCwgc2hhZG93Z3MpOworCXByaW50ayhLRVJOX0lORk8gIkNTOiAgJTA0eCBEUzogJTA0eCBFUzogJTA0eCBDUjA6ICUwMTZseFxuIiwgY3MsIGRzLAorCQkJZXMsIGNyMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ1IyOiAlMDE2bHggQ1IzOiAlMDE2bHggQ1I0OiAlMDE2bHhcbiIsIGNyMiwgY3IzLAorCQkJY3I0KTsKIAogCWdldF9kZWJ1Z3JlZyhkMCwgMCk7CiAJZ2V0X2RlYnVncmVnKGQxLCAxKTsKIAlnZXRfZGVidWdyZWcoZDIsIDIpOwotCXByaW50aygiRFIwOiAlMDE2bHggRFIxOiAlMDE2bHggRFIyOiAlMDE2bHhcbiIsIGQwLCBkMSwgZDIpOworCXByaW50ayhLRVJOX0lORk8gIkRSMDogJTAxNmx4IERSMTogJTAxNmx4IERSMjogJTAxNmx4XG4iLCBkMCwgZDEsIGQyKTsKIAlnZXRfZGVidWdyZWcoZDMsIDMpOwogCWdldF9kZWJ1Z3JlZyhkNiwgNik7CiAJZ2V0X2RlYnVncmVnKGQ3LCA3KTsKLQlwcmludGsoIkRSMzogJTAxNmx4IERSNjogJTAxNmx4IERSNzogJTAxNmx4XG4iLCBkMywgZDYsIGQ3KTsKKwlwcmludGsoS0VSTl9JTkZPICJEUjM6ICUwMTZseCBEUjY6ICUwMTZseCBEUjc6ICUwMTZseFxuIiwgZDMsIGQ2LCBkNyk7CiB9CiAKIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXByaW50aygiQ1BVICVkOiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JX19zaG93X3JlZ3MocmVncyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkOiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJX19zaG93X3JlZ3MocmVncywgMSk7CiAJc2hvd190cmFjZShOVUxMLCByZWdzLCAodm9pZCAqKShyZWdzICsgMSksIHJlZ3MtPmJwKTsKIH0KIApAQCAtMjM4LDYgKzIyOCwxNCBAQAogCQl0LT5pb19iaXRtYXBfbWF4ID0gMDsKIAkJcHV0X2NwdSgpOwogCX0KKyNpZmRlZiBDT05GSUdfWDg2X0RTCisJLyogRnJlZSBhbnkgRFMgY29udGV4dHMgdGhhdCBoYXZlIG5vdCBiZWVuIHByb3Blcmx5IHJlbGVhc2VkLiAqLworCWlmICh1bmxpa2VseSh0LT5kc19jdHgpKSB7CisJCS8qIHdlIGNsZWFyIGRlYnVnY3RsIHRvIG1ha2Ugc3VyZSBEUyBpcyBub3QgdXNlZC4gKi8KKwkJdXBkYXRlX2RlYnVnY3RsbXNyKDApOworCQlkc19mcmVlKHQtPmRzX2N0eCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19YODZfRFMgKi8KIH0KIAogdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKQEAgLTMxMywxMCArMzExLDEwIEBACiAKIGludCBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc3AsCiAJCXVuc2lnbmVkIGxvbmcgdW51c2VkLAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIHN0cnVjdCBwdF9yZWdzICogcmVncykKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBlcnI7Ci0Jc3RydWN0IHB0X3JlZ3MgKiBjaGlsZHJlZ3M7CisJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKIAogCWNoaWxkcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikKQEAgLTM2MSwxMCArMzU5LDEwIEBACiAJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSkKIAkJCWVyciA9IGRvX3NldF90aHJlYWRfYXJlYShwLCAtMSwKIAkJCQkoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKiljaGlsZHJlZ3MtPnNpLCAwKTsKLQkJZWxzZSAJCQkKLSNlbmRpZgkgCi0JCQllcnIgPSBkb19hcmNoX3ByY3RsKHAsIEFSQ0hfU0VUX0ZTLCBjaGlsZHJlZ3MtPnI4KTsgCi0JCWlmIChlcnIpIAorCQllbHNlCisjZW5kaWYKKwkJCWVyciA9IGRvX2FyY2hfcHJjdGwocCwgQVJDSF9TRVRfRlMsIGNoaWxkcmVncy0+cjgpOworCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQogCWVyciA9IDA7CkBAIC00NzEsMTMgKzQ2OSwyNyBAQAogCW5leHQgPSAmbmV4dF9wLT50aHJlYWQ7CiAKIAlkZWJ1Z2N0bCA9IHByZXYtPmRlYnVnY3RsbXNyOwotCWlmIChuZXh0LT5kc19hcmVhX21zciAhPSBwcmV2LT5kc19hcmVhX21zcikgewotCQkvKiB3ZSBjbGVhciBkZWJ1Z2N0bCB0byBtYWtlIHN1cmUgRFMKLQkJICogaXMgbm90IGluIHVzZSB3aGVuIHdlIGNoYW5nZSBpdCAqLwotCQlkZWJ1Z2N0bCA9IDA7Ci0JCXVwZGF0ZV9kZWJ1Z2N0bG1zcigwKTsKLQkJd3Jtc3JsKE1TUl9JQTMyX0RTX0FSRUEsIG5leHQtPmRzX2FyZWFfbXNyKTsKKworI2lmZGVmIENPTkZJR19YODZfRFMKKwl7CisJCXVuc2lnbmVkIGxvbmcgZHNfcHJldiA9IDAsIGRzX25leHQgPSAwOworCisJCWlmIChwcmV2LT5kc19jdHgpCisJCQlkc19wcmV2ID0gKHVuc2lnbmVkIGxvbmcpcHJldi0+ZHNfY3R4LT5kczsKKwkJaWYgKG5leHQtPmRzX2N0eCkKKwkJCWRzX25leHQgPSAodW5zaWduZWQgbG9uZyluZXh0LT5kc19jdHgtPmRzOworCisJCWlmIChkc19uZXh0ICE9IGRzX3ByZXYpIHsKKwkJCS8qCisJCQkgKiBXZSBjbGVhciBkZWJ1Z2N0bCB0byBtYWtlIHN1cmUgRFMKKwkJCSAqIGlzIG5vdCBpbiB1c2Ugd2hlbiB3ZSBjaGFuZ2UgaXQ6CisJCQkgKi8KKwkJCWRlYnVnY3RsID0gMDsKKwkJCXVwZGF0ZV9kZWJ1Z2N0bG1zcigwKTsKKwkJCXdybXNybChNU1JfSUEzMl9EU19BUkVBLCBkc19uZXh0KTsKKwkJfQogCX0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0RTICovCiAKIAlpZiAobmV4dC0+ZGVidWdjdGxtc3IgIT0gZGVidWdjdGwpCiAJCXVwZGF0ZV9kZWJ1Z2N0bG1zcihuZXh0LT5kZWJ1Z2N0bG1zcik7CkBAIC01MTUsMTMgKzUyNywxMyBAQAogCQltZW1zZXQodHNzLT5pb19iaXRtYXAsIDB4ZmYsIHByZXYtPmlvX2JpdG1hcF9tYXgpOwogCX0KIAotI2lmZGVmIFg4Nl9CVFMKKyNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKIAlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocHJldl9wLCBUSUZfQlRTX1RSQUNFX1RTKSkKIAkJcHRyYWNlX2J0c190YWtlX3RpbWVzdGFtcChwcmV2X3AsIEJUU19UQVNLX0RFUEFSVFMpOwogCiAJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKG5leHRfcCwgVElGX0JUU19UUkFDRV9UUykpCiAJCXB0cmFjZV9idHNfdGFrZV90aW1lc3RhbXAobmV4dF9wLCBCVFNfVEFTS19BUlJJVkVTKTsKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogfQogCiAvKgpAQCAtNTQzLDcgKzU1NSw3IEBACiAJdW5zaWduZWQgZnNpbmRleCwgZ3NpbmRleDsKIAogCS8qIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGlzIHNvb24sIGFmdGVyIGEgZmV3IGV4cGVuc2l2ZSB0aGluZ3MgKi8KLQlpZiAobmV4dF9wLT5mcHVfY291bnRlcj41KQorCWlmIChuZXh0X3AtPmZwdV9jb3VudGVyID4gNSkKIAkJcHJlZmV0Y2gobmV4dC0+eHN0YXRlKTsKIAogCS8qCkBAIC01NTEsMTMgKzU2MywxMyBAQAogCSAqLwogCWxvYWRfc3AwKHRzcywgbmV4dCk7CiAKLQkvKiAKKwkvKgogCSAqIFN3aXRjaCBEUyBhbmQgRVMuCiAJICogVGhpcyB3b24ndCBwaWNrIHVwIHRocmVhZCBzZWxlY3RvciBjaGFuZ2VzLCBidXQgSSBndWVzcyB0aGF0IGlzIG9rLgogCSAqLwogCXNhdmVzZWdtZW50KGVzLCBwcmV2LT5lcyk7CiAJaWYgKHVubGlrZWx5KG5leHQtPmVzIHwgcHJldi0+ZXMpKQotCQlsb2Fkc2VnbWVudChlcywgbmV4dC0+ZXMpOyAKKwkJbG9hZHNlZ21lbnQoZXMsIG5leHQtPmVzKTsKIAogCXNhdmVzZWdtZW50KGRzLCBwcmV2LT5kcyk7CiAJaWYgKHVubGlrZWx5KG5leHQtPmRzIHwgcHJldi0+ZHMpKQpAQCAtNTgzLDcgKzU5NSw3IEBACiAJICovCiAJYXJjaF9sZWF2ZV9sYXp5X2NwdV9tb2RlKCk7CiAKLQkvKiAKKwkvKgogCSAqIFN3aXRjaCBGUyBhbmQgR1MuCiAJICoKIAkgKiBTZWdtZW50IHJlZ2lzdGVyICE9IDAgYWx3YXlzIHJlcXVpcmVzIGEgcmVsb2FkLiAgQWxzbwpAQCAtNTkyLDEzICs2MDQsMTMgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoZnNpbmRleCB8IG5leHQtPmZzaW5kZXggfCBwcmV2LT5mcykpIHsKIAkJbG9hZHNlZ21lbnQoZnMsIG5leHQtPmZzaW5kZXgpOwotCQkvKiAKKwkJLyoKIAkJICogQ2hlY2sgaWYgdGhlIHVzZXIgdXNlZCBhIHNlbGVjdG9yICE9IDA7IGlmIHllcwogCQkgKiAgY2xlYXIgNjRiaXQgYmFzZSwgc2luY2Ugb3ZlcmxvYWRlZCBiYXNlIGlzIGFsd2F5cwogCQkgKiAgbWFwcGVkIHRvIHRoZSBOdWxsIHNlbGVjdG9yCiAJCSAqLwogCQlpZiAoZnNpbmRleCkKLQkJCXByZXYtPmZzID0gMDsJCQkJCisJCQlwcmV2LT5mcyA9IDA7CiAJfQogCS8qIHdoZW4gbmV4dCBwcm9jZXNzIGhhcyBhIDY0Yml0IGJhc2UgdXNlIGl0ICovCiAJaWYgKG5leHQtPmZzKQpAQCAtNjA4LDcgKzYyMCw3IEBACiAJaWYgKHVubGlrZWx5KGdzaW5kZXggfCBuZXh0LT5nc2luZGV4IHwgcHJldi0+Z3MpKSB7CiAJCWxvYWRfZ3NfaW5kZXgobmV4dC0+Z3NpbmRleCk7CiAJCWlmIChnc2luZGV4KQotCQkJcHJldi0+Z3MgPSAwOwkJCQkKKwkJCXByZXYtPmdzID0gMDsKIAl9CiAJaWYgKG5leHQtPmdzKQogCQl3cm1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBuZXh0LT5ncyk7CkBAIC02MTcsMTIgKzYyOSwxMiBAQAogCS8qIE11c3QgYmUgYWZ0ZXIgRFMgcmVsb2FkICovCiAJdW5sYXp5X2ZwdShwcmV2X3ApOwogCi0JLyogCisJLyoKIAkgKiBTd2l0Y2ggdGhlIFBEQSBhbmQgRlBVIGNvbnRleHRzLgogCSAqLwogCXByZXYtPnVzZXJzcCA9IHJlYWRfcGRhKG9sZHJzcCk7CiAJd3JpdGVfcGRhKG9sZHJzcCwgbmV4dC0+dXNlcnNwKTsKLQl3cml0ZV9wZGEocGN1cnJlbnQsIG5leHRfcCk7IAorCXdyaXRlX3BkYShwY3VycmVudCwgbmV4dF9wKTsKIAogCXdyaXRlX3BkYShrZXJuZWxzdGFjaywKIAkJICAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArCkBAIC02NjMsNyArNjc1LDcgQEAKIAkJY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWxvbmcgZXJyb3I7Ci0JY2hhciAqIGZpbGVuYW1lOworCWNoYXIgKmZpbGVuYW1lOwogCiAJZmlsZW5hbWUgPSBnZXRuYW1lKG5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CkBAIC03MjEsNTUgKzczMyw1NSBAQAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0JdTY0IGZwLGlwOworCXU2NCBmcCwgaXA7CiAJaW50IGNvdW50ID0gMDsKIAotCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGU9PVRBU0tfUlVOTklORykKLQkJcmV0dXJuIDA7IAorCWlmICghcCB8fCBwID09IGN1cnJlbnQgfHwgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQorCQlyZXR1cm4gMDsKIAlzdGFjayA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKLQlpZiAocC0+dGhyZWFkLnNwIDwgc3RhY2sgfHwgcC0+dGhyZWFkLnNwID4gc3RhY2srVEhSRUFEX1NJWkUpCisJaWYgKHAtPnRocmVhZC5zcCA8IHN0YWNrIHx8IHAtPnRocmVhZC5zcCA+PSBzdGFjaytUSFJFQURfU0laRSkKIAkJcmV0dXJuIDA7CiAJZnAgPSAqKHU2NCAqKShwLT50aHJlYWQuc3ApOwotCWRvIHsgCisJZG8gewogCQlpZiAoZnAgPCAodW5zaWduZWQgbG9uZylzdGFjayB8fAotCQkgICAgZnAgPiAodW5zaWduZWQgbG9uZylzdGFjaytUSFJFQURfU0laRSkKLQkJCXJldHVybiAwOyAKKwkJICAgIGZwID49ICh1bnNpZ25lZCBsb25nKXN0YWNrK1RIUkVBRF9TSVpFKQorCQkJcmV0dXJuIDA7CiAJCWlwID0gKih1NjQgKikoZnArOCk7CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGlwKSkKIAkJCXJldHVybiBpcDsKLQkJZnAgPSAqKHU2NCAqKWZwOyAKLQl9IHdoaWxlIChjb3VudCsrIDwgMTYpOyAKKwkJZnAgPSAqKHU2NCAqKWZwOworCX0gd2hpbGUgKGNvdW50KysgPCAxNik7CiAJcmV0dXJuIDA7CiB9CiAKIGxvbmcgZG9fYXJjaF9wcmN0bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17IAotCWludCByZXQgPSAwOyAKK3sKKwlpbnQgcmV0ID0gMDsKIAlpbnQgZG9pdCA9IHRhc2sgPT0gY3VycmVudDsKIAlpbnQgY3B1OwogCi0Jc3dpdGNoIChjb2RlKSB7IAorCXN3aXRjaCAoY29kZSkgewogCWNhc2UgQVJDSF9TRVRfR1M6CiAJCWlmIChhZGRyID49IFRBU0tfU0laRV9PRih0YXNrKSkKLQkJCXJldHVybiAtRVBFUk07IAorCQkJcmV0dXJuIC1FUEVSTTsKIAkJY3B1ID0gZ2V0X2NwdSgpOwotCQkvKiBoYW5kbGUgc21hbGwgYmFzZXMgdmlhIHRoZSBHRFQgYmVjYXVzZSB0aGF0J3MgZmFzdGVyIHRvIAorCQkvKiBoYW5kbGUgc21hbGwgYmFzZXMgdmlhIHRoZSBHRFQgYmVjYXVzZSB0aGF0J3MgZmFzdGVyIHRvCiAJCSAgIHN3aXRjaC4gKi8KLQkJaWYgKGFkZHIgPD0gMHhmZmZmZmZmZikgeyAgCi0JCQlzZXRfMzJiaXRfdGxzKHRhc2ssIEdTX1RMUywgYWRkcik7IAotCQkJaWYgKGRvaXQpIHsgCisJCWlmIChhZGRyIDw9IDB4ZmZmZmZmZmYpIHsKKwkJCXNldF8zMmJpdF90bHModGFzaywgR1NfVExTLCBhZGRyKTsKKwkJCWlmIChkb2l0KSB7CiAJCQkJbG9hZF9UTFMoJnRhc2stPnRocmVhZCwgY3B1KTsKLQkJCQlsb2FkX2dzX2luZGV4KEdTX1RMU19TRUwpOyAKKwkJCQlsb2FkX2dzX2luZGV4KEdTX1RMU19TRUwpOwogCQkJfQotCQkJdGFzay0+dGhyZWFkLmdzaW5kZXggPSBHU19UTFNfU0VMOyAKKwkJCXRhc2stPnRocmVhZC5nc2luZGV4ID0gR1NfVExTX1NFTDsKIAkJCXRhc2stPnRocmVhZC5ncyA9IDA7Ci0JCX0gZWxzZSB7IAorCQl9IGVsc2UgewogCQkJdGFzay0+dGhyZWFkLmdzaW5kZXggPSAwOwogCQkJdGFzay0+dGhyZWFkLmdzID0gYWRkcjsKIAkJCWlmIChkb2l0KSB7CiAJCQkJbG9hZF9nc19pbmRleCgwKTsKIAkJCQlyZXQgPSBjaGVja2luZ193cm1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBhZGRyKTsKLQkJCX0gCisJCQl9CiAJCX0KIAkJcHV0X2NwdSgpOwogCQlicmVhazsKQEAgLTgyMyw4ICs4MzUsNyBAQAogCQkJCXJkbXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIGJhc2UpOwogCQkJZWxzZQogCQkJCWJhc2UgPSB0YXNrLT50aHJlYWQuZ3M7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCWJhc2UgPSB0YXNrLT50aHJlYWQuZ3M7CiAJCXJldCA9IHB1dF91c2VyKGJhc2UsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCBlMzdkY2NjLi4wYTZkOGMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KQEAgLTM5LDcgKzQwLDkgQEAKIAlSRUdTRVRfR0VORVJBTCwKIAlSRUdTRVRfRlAsCiAJUkVHU0VUX1hGUCwKKwlSRUdTRVRfSU9QRVJNNjQgPSBSRUdTRVRfWEZQLAogCVJFR1NFVF9UTFMsCisJUkVHU0VUX0lPUEVSTTMyLAogfTsKIAogLyoKQEAgLTY5LDcgKzcyLDcgQEAKIAogI2RlZmluZSBGTEFHX01BU0sJCUZMQUdfTUFTS18zMgogCi1zdGF0aWMgbG9uZyAqcHRfcmVnc19hY2Nlc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcmVnbm8pCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqcHRfcmVnc19hY2Nlc3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgcmVnbm8pCiB7CiAJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBieCkgIT0gMCk7CiAJcmVnbm8gPj49IDI7CkBAIC01NTQsNDUgKzU1NywxMzggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIFg4Nl9CVFMKLQotc3RhdGljIGludCBwdHJhY2VfYnRzX2dldF9zaXplKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCisvKgorICogVGhlc2UgYWNjZXNzIHRoZSBjdXJyZW50IG9yIGFub3RoZXIgKHN0b3BwZWQpIHRhc2sncyBpbyBwZXJtaXNzaW9uCisgKiBiaXRtYXAgZm9yIGRlYnVnZ2luZyBvciBjb3JlIGR1bXAuCisgKi8KK3N0YXRpYyBpbnQgaW9wZXJtX2FjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCkKIHsKLQlpZiAoIWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3IpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlyZXR1cm4gZHNfZ2V0X2J0c19pbmRleCgodm9pZCAqKWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3IpOworCXJldHVybiB0YXJnZXQtPnRocmVhZC5pb19iaXRtYXBfbWF4IC8gcmVnc2V0LT5zaXplOwogfQogCi1zdGF0aWMgaW50IHB0cmFjZV9idHNfcmVhZF9yZWNvcmQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKLQkJCQkgIGxvbmcgaW5kZXgsCitzdGF0aWMgaW50IGlvcGVybV9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQoreworCWlmICghdGFyZ2V0LT50aHJlYWQuaW9fYml0bWFwX3B0cikKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgIHRhcmdldC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIsCisJCQkJICAgMCwgSU9fQklUTUFQX0JZVEVTKTsKK30KKworI2lmZGVmIENPTkZJR19YODZfUFRSQUNFX0JUUworLyoKKyAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgQlRTIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uLgorICovCitzdHJ1Y3QgYnRzX2NvbmZpZ3VyYXRpb24geworCS8qIHRoZSBzaXplIG9mIGEgQlRTIHJlY29yZCBpbiBieXRlczsgYXQgbW9zdCBCVFNfTUFYX1JFQ09SRF9TSVpFICovCisJdW5zaWduZWQgY2hhciAgc2l6ZW9mX2J0czsKKwkvKiB0aGUgc2l6ZSBvZiBhIGZpZWxkIGluIHRoZSBCVFMgcmVjb3JkIGluIGJ5dGVzICovCisJdW5zaWduZWQgY2hhciAgc2l6ZW9mX2ZpZWxkOworCS8qIGEgYml0bWFzayB0byBlbmFibGUvZGlzYWJsZSBCVFMgaW4gREVCVUdDVEwgTVNSICovCisJdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bF9tYXNrOworfTsKK3N0YXRpYyBzdHJ1Y3QgYnRzX2NvbmZpZ3VyYXRpb24gYnRzX2NmZzsKKworI2RlZmluZSBCVFNfTUFYX1JFQ09SRF9TSVpFICg4ICogMykKKworCisvKgorICogQnJhbmNoIFRyYWNlIFN0b3JlIChCVFMpIHVzZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQuIERpZmZlcmVudAorICogYXJjaGl0ZWN0dXJlcyB2YXJ5IGluIHRoZSBzaXplIG9mIHRob3NlIGZpZWxkcy4KKyAqIC0gc291cmNlIGxpbmVhciBhZGRyZXNzCisgKiAtIGRlc3RpbmF0aW9uIGxpbmVhciBhZGRyZXNzCisgKiAtIGZsYWdzCisgKgorICogTGF0ZXIgYXJjaGl0ZWN0dXJlcyB1c2UgNjRiaXQgcG9pbnRlcnMgdGhyb3VnaG91dCwgd2hlcmVhcyBlYXJsaWVyCisgKiBhcmNoaXRlY3R1cmVzIHVzZSAzMmJpdCBwb2ludGVycyBpbiAzMmJpdCBtb2RlLgorICoKKyAqIFdlIGNvbXB1dGUgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGZpcnN0IDggZmllbGRzIGJhc2VkIG9uOgorICogLSB0aGUgZmllbGQgc2l6ZSBzdG9yZWQgaW4gdGhlIERTIGNvbmZpZ3VyYXRpb24KKyAqIC0gdGhlIHJlbGF0aXZlIGZpZWxkIHBvc2l0aW9uCisgKgorICogSW4gb3JkZXIgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgQlRTIGJ1ZmZlciwgd2UgdXNlCisgKiBhIHNwZWNpYWwgc291cmNlIGFkZHJlc3MgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVjb3JkIHJlcXVpcmVzCisgKiBzcGVjaWFsIGludGVycHJldGF0aW9uLgorICoKKyAqIE5ldGJ1cnN0IGluZGljYXRlZCB2aWEgYSBiaXQgaW4gdGhlIGZsYWdzIGZpZWxkIHdoZXRoZXIgdGhlIGJyYW5jaAorICogd2FzIHByZWRpY3RlZDsgdGhpcyBpcyBpZ25vcmVkLgorICovCisKK2VudW0gYnRzX2ZpZWxkIHsKKwlidHNfZnJvbSA9IDAsCisJYnRzX3RvLAorCWJ0c19mbGFncywKKworCWJ0c19lc2NhcGUgPSAodW5zaWduZWQgbG9uZyktMSwKKwlidHNfcXVhbCA9IGJ0c190bywKKwlidHNfamlmZmllcyA9IGJ0c19mbGFncworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ0c19nZXQoY29uc3QgY2hhciAqYmFzZSwgZW51bSBidHNfZmllbGQgZmllbGQpCit7CisJYmFzZSArPSAoYnRzX2NmZy5zaXplb2ZfZmllbGQgKiBmaWVsZCk7CisJcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKWJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHNfc2V0KGNoYXIgKmJhc2UsIGVudW0gYnRzX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwliYXNlICs9IChidHNfY2ZnLnNpemVvZl9maWVsZCAqIGZpZWxkKTs7CisJKCoodW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdmFsOworfQorCisvKgorICogVHJhbnNsYXRlIGEgQlRTIHJlY29yZCBmcm9tIHRoZSByYXcgZm9ybWF0IGludG8gdGhlIGJ0c19zdHJ1Y3QgZm9ybWF0CisgKgorICogb3V0IChvdXQpOiBidHNfc3RydWN0IGludGVycHJldGF0aW9uCisgKiByYXc6IHJhdyBCVFMgcmVjb3JkCisgKi8KK3N0YXRpYyB2b2lkIHB0cmFjZV9idHNfdHJhbnNsYXRlX3JlY29yZChzdHJ1Y3QgYnRzX3N0cnVjdCAqb3V0LCBjb25zdCB2b2lkICpyYXcpCit7CisJbWVtc2V0KG91dCwgMCwgc2l6ZW9mKCpvdXQpKTsKKwlpZiAoYnRzX2dldChyYXcsIGJ0c19mcm9tKSA9PSBidHNfZXNjYXBlKSB7CisJCW91dC0+cXVhbGlmaWVyICAgICAgID0gYnRzX2dldChyYXcsIGJ0c19xdWFsKTsKKwkJb3V0LT52YXJpYW50LmppZmZpZXMgPSBidHNfZ2V0KHJhdywgYnRzX2ppZmZpZXMpOworCX0gZWxzZSB7CisJCW91dC0+cXVhbGlmaWVyID0gQlRTX0JSQU5DSDsKKwkJb3V0LT52YXJpYW50Lmxici5mcm9tX2lwID0gYnRzX2dldChyYXcsIGJ0c19mcm9tKTsKKwkJb3V0LT52YXJpYW50Lmxici50b19pcCAgID0gYnRzX2dldChyYXcsIGJ0c190byk7CisJfQorfQorCitzdGF0aWMgaW50IHB0cmFjZV9idHNfcmVhZF9yZWNvcmQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc2l6ZV90IGluZGV4LAogCQkJCSAgc3RydWN0IGJ0c19zdHJ1Y3QgX191c2VyICpvdXQpCiB7CiAJc3RydWN0IGJ0c19zdHJ1Y3QgcmV0OwotCWludCByZXR2YWw7Ci0JaW50IGJ0c19lbmQ7Ci0JaW50IGJ0c19pbmRleDsKKwljb25zdCB2b2lkICpidHNfcmVjb3JkOworCXNpemVfdCBidHNfaW5kZXgsIGJ0c19lbmQ7CisJaW50IGVycm9yOwogCi0JaWYgKCFjaGlsZC0+dGhyZWFkLmRzX2FyZWFfbXNyKQotCQlyZXR1cm4gLUVOWElPOworCWVycm9yID0gZHNfZ2V0X2J0c19lbmQoY2hpbGQsICZidHNfZW5kKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ0c19lbmQgPSBkc19nZXRfYnRzX2VuZCgodm9pZCAqKWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3IpOwogCWlmIChidHNfZW5kIDw9IGluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIHRyYW5zbGF0ZSB0aGUgcHRyYWNlIGJ0cyBpbmRleCBpbnRvIHRoZSBkcyBidHMgaW5kZXggKi8KLQlidHNfaW5kZXggPSBkc19nZXRfYnRzX2luZGV4KCh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcik7Ci0JYnRzX2luZGV4IC09IChpbmRleCArIDEpOwotCWlmIChidHNfaW5kZXggPCAwKQotCQlidHNfaW5kZXggKz0gYnRzX2VuZDsKKwllcnJvciA9IGRzX2dldF9idHNfaW5kZXgoY2hpbGQsICZidHNfaW5kZXgpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKIAotCXJldHZhbCA9IGRzX3JlYWRfYnRzKCh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zciwKLQkJCSAgICAgYnRzX2luZGV4LCAmcmV0KTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKKwkvKiB0cmFuc2xhdGUgdGhlIHB0cmFjZSBidHMgaW5kZXggaW50byB0aGUgZHMgYnRzIGluZGV4ICovCisJYnRzX2luZGV4ICs9IGJ0c19lbmQgLSAoaW5kZXggKyAxKTsKKwlpZiAoYnRzX2VuZCA8PSBidHNfaW5kZXgpCisJCWJ0c19pbmRleCAtPSBidHNfZW5kOworCisJZXJyb3IgPSBkc19hY2Nlc3NfYnRzKGNoaWxkLCBidHNfaW5kZXgsICZidHNfcmVjb3JkKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlwdHJhY2VfYnRzX3RyYW5zbGF0ZV9yZWNvcmQoJnJldCwgYnRzX3JlY29yZCk7CiAKIAlpZiAoY29weV90b191c2VyKG91dCwgJnJldCwgc2l6ZW9mKHJldCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTYwMCwxMDEgKzY5NiwxMDYgQEAKIAlyZXR1cm4gc2l6ZW9mKHJldCk7CiB9CiAKLXN0YXRpYyBpbnQgcHRyYWNlX2J0c19jbGVhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWlmICghY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXJldHVybiBkc19jbGVhcigodm9pZCAqKWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3IpOwotfQotCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfZHJhaW4oc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKIAkJCSAgICBsb25nIHNpemUsCiAJCQkgICAgc3RydWN0IGJ0c19zdHJ1Y3QgX191c2VyICpvdXQpCiB7Ci0JaW50IGVuZCwgaTsKLQl2b2lkICpkcyA9ICh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcjsKKwlzdHJ1Y3QgYnRzX3N0cnVjdCByZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmF3OworCXNpemVfdCBlbmQsIGk7CisJaW50IGVycm9yOwogCi0JaWYgKCFkcykKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWVuZCA9IGRzX2dldF9idHNfaW5kZXgoZHMpOwotCWlmIChlbmQgPD0gMCkKLQkJcmV0dXJuIGVuZDsKKwllcnJvciA9IGRzX2dldF9idHNfaW5kZXgoY2hpbGQsICZlbmQpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKIAogCWlmIChzaXplIDwgKGVuZCAqIHNpemVvZihzdHJ1Y3QgYnRzX3N0cnVjdCkpKQogCQlyZXR1cm4gLUVJTzsKIAotCWZvciAoaSA9IDA7IGkgPCBlbmQ7IGkrKywgb3V0KyspIHsKLQkJc3RydWN0IGJ0c19zdHJ1Y3QgcmV0OwotCQlpbnQgcmV0dmFsOworCWVycm9yID0gZHNfYWNjZXNzX2J0cyhjaGlsZCwgMCwgKGNvbnN0IHZvaWQgKiopJnJhdyk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOwogCi0JCXJldHZhbCA9IGRzX3JlYWRfYnRzKGRzLCBpLCAmcmV0KTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlyZXR1cm4gcmV0dmFsOworCWZvciAoaSA9IDA7IGkgPCBlbmQ7IGkrKywgb3V0KyssIHJhdyArPSBidHNfY2ZnLnNpemVvZl9idHMpIHsKKwkJcHRyYWNlX2J0c190cmFuc2xhdGVfcmVjb3JkKCZyZXQsIHJhdyk7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcihvdXQsICZyZXQsIHNpemVvZihyZXQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWRzX2NsZWFyKGRzKTsKKwllcnJvciA9IGRzX2NsZWFyX2J0cyhjaGlsZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOwogCiAJcmV0dXJuIGVuZDsKIH0KIAorc3RhdGljIHZvaWQgcHRyYWNlX2J0c19vdmZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJc2VuZF9zaWcoY2hpbGQtPnRocmVhZC5idHNfb3ZmbF9zaWduYWwsIGNoaWxkLCAwKTsKK30KKwogc3RhdGljIGludCBwdHJhY2VfYnRzX2NvbmZpZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAogCQkJICAgICBsb25nIGNmZ19zaXplLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgcHRyYWNlX2J0c19jb25maWcgX191c2VyICp1Y2ZnKQogewogCXN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBjZmc7Ci0JaW50IGJ0c19zaXplLCByZXQgPSAwOwotCXZvaWQgKmRzOworCWludCBlcnJvciA9IDA7CiAKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmICghYnRzX2NmZy5zaXplb2ZfYnRzKQorCQlnb3RvIGVycm91dDsKKworCWVycm9yID0gLUVJTzsKIAlpZiAoY2ZnX3NpemUgPCBzaXplb2YoY2ZnKSkKLQkJcmV0dXJuIC1FSU87CisJCWdvdG8gZXJyb3V0OwogCisJZXJyb3IgPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCB1Y2ZnLCBzaXplb2YoY2ZnKSkpCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIGVycm91dDsKIAotCWlmICgoaW50KWNmZy5zaXplIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJZXJyb3IgPSAtRUlOVkFMOworCWlmICgoY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX1NJR05BTCkgJiYKKwkgICAgIShjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fQUxMT0MpKQorCQlnb3RvIGVycm91dDsKIAotCWJ0c19zaXplID0gMDsKLQlkcyA9ICh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcjsKLQlpZiAoZHMpIHsKLQkJYnRzX3NpemUgPSBkc19nZXRfYnRzX3NpemUoZHMpOwotCQlpZiAoYnRzX3NpemUgPCAwKQotCQkJcmV0dXJuIGJ0c19zaXplOwotCX0KLQljZmcuc2l6ZSA9IFBBR0VfQUxJR04oY2ZnLnNpemUpOworCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fQUxMT0MpIHsKKwkJZHNfb3ZmbF9jYWxsYmFja190IG92ZmwgPSBOVUxMOworCQl1bnNpZ25lZCBpbnQgc2lnID0gMDsKIAotCWlmIChidHNfc2l6ZSAhPSBjZmcuc2l6ZSkgewotCQlyZXQgPSBwdHJhY2VfYnRzX3JlYWxsb2MoY2hpbGQsIGNmZy5zaXplLAotCQkJCQkgY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX0NVVF9TSVpFKTsKLQkJaWYgKHJldCA8IDApCisJCS8qIHdlIGlnbm9yZSB0aGUgZXJyb3IgaW4gY2FzZSB3ZSB3ZXJlIG5vdCB0cmFjaW5nIGNoaWxkICovCisJCSh2b2lkKWRzX3JlbGVhc2VfYnRzKGNoaWxkKTsKKworCQlpZiAoY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX1NJR05BTCkgeworCQkJaWYgKCFjZmcuc2lnbmFsKQorCQkJCWdvdG8gZXJyb3V0OworCisJCQlzaWcgID0gY2ZnLnNpZ25hbDsKKwkJCW92ZmwgPSBwdHJhY2VfYnRzX292Zmw7CisJCX0KKworCQllcnJvciA9IGRzX3JlcXVlc3RfYnRzKGNoaWxkLCAvKiBiYXNlID0gKi8gTlVMTCwgY2ZnLnNpemUsIG92ZmwpOworCQlpZiAoZXJyb3IgPCAwKQogCQkJZ290byBlcnJvdXQ7CiAKLQkJZHMgPSAodm9pZCAqKWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3I7CisJCWNoaWxkLT50aHJlYWQuYnRzX292Zmxfc2lnbmFsID0gc2lnOwogCX0KIAotCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fU0lHTkFMKQotCQlyZXQgPSBkc19zZXRfb3ZlcmZsb3coZHMsIERTX09fU0lHTkFMKTsKLQllbHNlCi0JCXJldCA9IGRzX3NldF9vdmVyZmxvdyhkcywgRFNfT19XUkFQKTsKLQlpZiAocmV0IDwgMCkKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFjaGlsZC0+dGhyZWFkLmRzX2N0eCAmJiBjZmcuZmxhZ3MpCiAJCWdvdG8gZXJyb3V0OwogCiAJaWYgKGNmZy5mbGFncyAmIFBUUkFDRV9CVFNfT19UUkFDRSkKLQkJY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zciB8PSBkc19kZWJ1Z2N0bF9tYXNrKCk7CisJCWNoaWxkLT50aHJlYWQuZGVidWdjdGxtc3IgfD0gYnRzX2NmZy5kZWJ1Z2N0bF9tYXNrOwogCWVsc2UKLQkJY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zciAmPSB+ZHNfZGVidWdjdGxfbWFzaygpOworCQljaGlsZC0+dGhyZWFkLmRlYnVnY3RsbXNyICY9IH5idHNfY2ZnLmRlYnVnY3RsX21hc2s7CiAKIAlpZiAoY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX1NDSEVEKQogCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfQlRTX1RSQUNFX1RTKTsKIAllbHNlCiAJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0JUU19UUkFDRV9UUyk7CiAKLQlyZXQgPSBzaXplb2YoY2ZnKTsKKwllcnJvciA9IHNpemVvZihjZmcpOwogCiBvdXQ6CiAJaWYgKGNoaWxkLT50aHJlYWQuZGVidWdjdGxtc3IpCkBAIC03MDIsMTAgKzgwMywxMCBAQAogCWVsc2UKIAkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfREVCVUdDVExNU1IpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyb3I7CiAKIGVycm91dDoKLQljaGlsZC0+dGhyZWFkLmRlYnVnY3RsbXNyICY9IH5kc19kZWJ1Z2N0bF9tYXNrKCk7CisJY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zciAmPSB+YnRzX2NmZy5kZWJ1Z2N0bF9tYXNrOwogCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0JUU19UUkFDRV9UUyk7CiAJZ290byBvdXQ7CiB9CkBAIC03MTQsMTE5ICs4MTUsNzkgQEAKIAkJCSAgICAgbG9uZyBjZmdfc2l6ZSwKIAkJCSAgICAgc3RydWN0IHB0cmFjZV9idHNfY29uZmlnIF9fdXNlciAqdWNmZykKIHsKLQl2b2lkICpkcyA9ICh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcjsKIAlzdHJ1Y3QgcHRyYWNlX2J0c19jb25maWcgY2ZnOworCXNpemVfdCBlbmQ7CisJY29uc3Qgdm9pZCAqYmFzZSwgKm1heDsKKwlpbnQgZXJyb3I7CiAKIAlpZiAoY2ZnX3NpemUgPCBzaXplb2YoY2ZnKSkKIAkJcmV0dXJuIC1FSU87CiAKKwllcnJvciA9IGRzX2dldF9idHNfZW5kKGNoaWxkLCAmZW5kKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGRzX2FjY2Vzc19idHMoY2hpbGQsIC8qIGluZGV4ID0gKi8gMCwgJmJhc2UpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gZHNfYWNjZXNzX2J0cyhjaGlsZCwgLyogaW5kZXggPSAqLyBlbmQsICZtYXgpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwogCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0KLQlpZiAoZHMpIHsKLQkJY2ZnLnNpemUgPSBkc19nZXRfYnRzX3NpemUoZHMpOwotCi0JCWlmIChkc19nZXRfb3ZlcmZsb3coZHMpID09IERTX09fU0lHTkFMKQotCQkJY2ZnLmZsYWdzIHw9IFBUUkFDRV9CVFNfT19TSUdOQUw7Ci0KLQkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfREVCVUdDVExNU1IpICYmCi0JCSAgICBjaGlsZC0+dGhyZWFkLmRlYnVnY3RsbXNyICYgZHNfZGVidWdjdGxfbWFzaygpKQotCQkJY2ZnLmZsYWdzIHw9IFBUUkFDRV9CVFNfT19UUkFDRTsKLQotCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9CVFNfVFJBQ0VfVFMpKQotCQkJY2ZnLmZsYWdzIHw9IFBUUkFDRV9CVFNfT19TQ0hFRDsKLQl9Ci0KKwljZmcuc2l6ZSA9IChtYXggLSBiYXNlKTsKKwljZmcuc2lnbmFsID0gY2hpbGQtPnRocmVhZC5idHNfb3ZmbF9zaWduYWw7CiAJY2ZnLmJ0c19zaXplID0gc2l6ZW9mKHN0cnVjdCBidHNfc3RydWN0KTsKIAorCWlmIChjZmcuc2lnbmFsKQorCQljZmcuZmxhZ3MgfD0gUFRSQUNFX0JUU19PX1NJR05BTDsKKworCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RFQlVHQ1RMTVNSKSAmJgorCSAgICBjaGlsZC0+dGhyZWFkLmRlYnVnY3RsbXNyICYgYnRzX2NmZy5kZWJ1Z2N0bF9tYXNrKQorCQljZmcuZmxhZ3MgfD0gUFRSQUNFX0JUU19PX1RSQUNFOworCisJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfQlRTX1RSQUNFX1RTKSkKKwkJY2ZnLmZsYWdzIHw9IFBUUkFDRV9CVFNfT19TQ0hFRDsKKwogCWlmIChjb3B5X3RvX3VzZXIodWNmZywgJmNmZywgc2l6ZW9mKGNmZykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiBzaXplb2YoY2ZnKTsKIH0KIAotCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfd3JpdGVfcmVjb3JkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCQkJICAgY29uc3Qgc3RydWN0IGJ0c19zdHJ1Y3QgKmluKQogewotCWludCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBidHNfcmVjb3JkW0JUU19NQVhfUkVDT1JEX1NJWkVdOwogCi0JaWYgKCFjaGlsZC0+dGhyZWFkLmRzX2FyZWFfbXNyKQotCQlyZXR1cm4gLUVOWElPOworCUJVR19PTihCVFNfTUFYX1JFQ09SRF9TSVpFIDwgYnRzX2NmZy5zaXplb2ZfYnRzKTsKIAotCXJldHZhbCA9IGRzX3dyaXRlX2J0cygodm9pZCAqKWNoaWxkLT50aHJlYWQuZHNfYXJlYV9tc3IsIGluKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCW1lbXNldChidHNfcmVjb3JkLCAwLCBidHNfY2ZnLnNpemVvZl9idHMpOworCXN3aXRjaCAoaW4tPnF1YWxpZmllcikgeworCWNhc2UgQlRTX0lOVkFMSUQ6CisJCWJyZWFrOwogCi0JcmV0dXJuIHNpemVvZigqaW4pOwotfQorCWNhc2UgQlRTX0JSQU5DSDoKKwkJYnRzX3NldChidHNfcmVjb3JkLCBidHNfZnJvbSwgaW4tPnZhcmlhbnQubGJyLmZyb21faXApOworCQlidHNfc2V0KGJ0c19yZWNvcmQsIGJ0c190bywgICBpbi0+dmFyaWFudC5sYnIudG9faXApOworCQlicmVhazsKIAotc3RhdGljIGludCBwdHJhY2VfYnRzX3JlYWxsb2Moc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKLQkJCSAgICAgIGludCBzaXplLCBpbnQgcmVkdWNlX3NpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBybGltLCB2bTsKLQlpbnQgcmV0LCBvbGRfc2l6ZTsKKwljYXNlIEJUU19UQVNLX0FSUklWRVM6CisJY2FzZSBCVFNfVEFTS19ERVBBUlRTOgorCQlidHNfc2V0KGJ0c19yZWNvcmQsIGJ0c19mcm9tLCAgICBidHNfZXNjYXBlKTsKKwkJYnRzX3NldChidHNfcmVjb3JkLCBidHNfcXVhbCwgICAgaW4tPnF1YWxpZmllcik7CisJCWJ0c19zZXQoYnRzX3JlY29yZCwgYnRzX2ppZmZpZXMsIGluLT52YXJpYW50LmppZmZpZXMpOworCQlicmVhazsKIAotCWlmIChzaXplIDwgMCkKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9sZF9zaXplID0gZHNfZ2V0X2J0c19zaXplKCh2b2lkICopY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcik7Ci0JaWYgKG9sZF9zaXplIDwgMCkKLQkJcmV0dXJuIG9sZF9zaXplOwotCi0JcmV0ID0gZHNfZnJlZSgodm9pZCAqKikmY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0Jc2l6ZSA+Pj0gUEFHRV9TSElGVDsKLQlvbGRfc2l6ZSA+Pj0gUEFHRV9TSElGVDsKLQotCWN1cnJlbnQtPm1tLT50b3RhbF92bSAgLT0gb2xkX3NpemU7Ci0JY3VycmVudC0+bW0tPmxvY2tlZF92bSAtPSBvbGRfc2l6ZTsKLQotCWlmIChzaXplID09IDApCi0JCWdvdG8gb3V0OwotCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQVNdLnJsaW1fY3VyID4+IFBBR0VfU0hJRlQ7Ci0Jdm0gPSBjdXJyZW50LT5tbS0+dG90YWxfdm0gICsgc2l6ZTsKLQlpZiAocmxpbSA8IHZtKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0KLQkJaWYgKCFyZWR1Y2Vfc2l6ZSkKLQkJCWdvdG8gb3V0OwotCi0JCXNpemUgPSBybGltIC0gY3VycmVudC0+bW0tPnRvdGFsX3ZtOwotCQlpZiAoc2l6ZSA8PSAwKQotCQkJZ290byBvdXQ7CiAJfQogCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTUVNTE9DS10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKLQl2bSA9IGN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gICsgc2l6ZTsKLQlpZiAocmxpbSA8IHZtKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0KLQkJaWYgKCFyZWR1Y2Vfc2l6ZSkKLQkJCWdvdG8gb3V0OwotCi0JCXNpemUgPSBybGltIC0gY3VycmVudC0+bW0tPmxvY2tlZF92bTsKLQkJaWYgKHNpemUgPD0gMCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGRzX2FsbG9jYXRlKCh2b2lkICoqKSZjaGlsZC0+dGhyZWFkLmRzX2FyZWFfbXNyLAotCQkJICBzaXplIDw8IFBBR0VfU0hJRlQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCWN1cnJlbnQtPm1tLT50b3RhbF92bSAgKz0gc2l6ZTsKLQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtICs9IHNpemU7Ci0KLW91dDoKLQlpZiAoY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcikKLQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RTX0FSRUFfTVNSKTsKLQllbHNlCi0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RTX0FSRUFfTVNSKTsKLQotCXJldHVybiByZXQ7CisJLyogVGhlIHdyaXRpbmcgdGFzayB3aWxsIGJlIHRoZSBzd2l0Y2hlZC10byB0YXNrIG9uIGEgY29udGV4dAorCSAqIHN3aXRjaC4gSXQgbmVlZHMgdG8gd3JpdGUgaW50byB0aGUgc3dpdGNoZWQtZnJvbSB0YXNrJ3MgQlRTCisJICogYnVmZmVyLiAqLworCXJldHVybiBkc191bmNoZWNrZWRfd3JpdGVfYnRzKGNoaWxkLCBidHNfcmVjb3JkLCBidHNfY2ZnLnNpemVvZl9idHMpOwogfQogCiB2b2lkIHB0cmFjZV9idHNfdGFrZV90aW1lc3RhbXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCkBAIC04MzksNyArOTAwLDY2IEBACiAKIAlwdHJhY2VfYnRzX3dyaXRlX3JlY29yZCh0c2ssICZyZWMpOwogfQotI2VuZGlmIC8qIFg4Nl9CVFMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBidHNfY29uZmlndXJhdGlvbiBidHNfY2ZnX25ldGJ1cnN0ID0geworCS5zaXplb2ZfYnRzICAgID0gc2l6ZW9mKGxvbmcpICogMywKKwkuc2l6ZW9mX2ZpZWxkICA9IHNpemVvZihsb25nKSwKKwkuZGVidWdjdGxfbWFzayA9ICgxPDwyKXwoMTw8Myl8KDE8PDUpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0c19jb25maWd1cmF0aW9uIGJ0c19jZmdfcGVudGl1bV9tID0geworCS5zaXplb2ZfYnRzICAgID0gc2l6ZW9mKGxvbmcpICogMywKKwkuc2l6ZW9mX2ZpZWxkICA9IHNpemVvZihsb25nKSwKKwkuZGVidWdjdGxfbWFzayA9ICgxPDw2KXwoMTw8NykKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRzX2NvbmZpZ3VyYXRpb24gYnRzX2NmZ19jb3JlMiA9IHsKKwkuc2l6ZW9mX2J0cyAgICA9IDggKiAzLAorCS5zaXplb2ZfZmllbGQgID0gOCwKKwkuZGVidWdjdGxfbWFzayA9ICgxPDw2KXwoMTw8Nyl8KDE8PDkpCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgYnRzX2NvbmZpZ3VyZShjb25zdCBzdHJ1Y3QgYnRzX2NvbmZpZ3VyYXRpb24gKmNmZykKK3sKKwlidHNfY2ZnID0gKmNmZzsKK30KKwordm9pZCBfX2NwdWluaXQgcHRyYWNlX2J0c19pbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlzd2l0Y2ggKGMtPng4NikgeworCWNhc2UgMHg2OgorCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCQljYXNlIDB4RDoKKwkJY2FzZSAweEU6IC8qIFBlbnRpdW0gTSAqLworCQkJYnRzX2NvbmZpZ3VyZSgmYnRzX2NmZ19wZW50aXVtX20pOworCQkJYnJlYWs7CisJCWNhc2UgMHhGOiAvKiBDb3JlMiAqLworICAgICAgICBjYXNlIDB4MUM6IC8qIEF0b20gKi8KKwkJCWJ0c19jb25maWd1cmUoJmJ0c19jZmdfY29yZTIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBzb3JyeSwgZG9uJ3Qga25vdyBhYm91dCB0aGVtICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4RjoKKwkJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKKwkJY2FzZSAweDA6CisJCWNhc2UgMHgxOgorCQljYXNlIDB4MjogLyogTmV0YnVyc3QgKi8KKwkJCWJ0c19jb25maWd1cmUoJmJ0c19jZmdfbmV0YnVyc3QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBzb3JyeSwgZG9uJ3Qga25vdyBhYm91dCB0aGVtICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzb3JyeSwgZG9uJ3Qga25vdyBhYm91dCB0aGVtICovCisJCWJyZWFrOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BUUkFDRV9CVFMgKi8KIAogLyoKICAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgpAQCAtODUyLDE1ICs5NzIsMTUgQEAKICNpZmRlZiBUSUZfU1lTQ0FMTF9FTVUKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX0VNVSk7CiAjZW5kaWYKLQlpZiAoY2hpbGQtPnRocmVhZC5kc19hcmVhX21zcikgewotI2lmZGVmIFg4Nl9CVFMKLQkJcHRyYWNlX2J0c19yZWFsbG9jKGNoaWxkLCAwLCAwKTsKLSNlbmRpZgotCQljaGlsZC0+dGhyZWFkLmRlYnVnY3RsbXNyICY9IH5kc19kZWJ1Z2N0bF9tYXNrKCk7Ci0JCWlmICghY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zcikKLQkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RFQlVHQ1RMTVNSKTsKLQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfQlRTX1RSQUNFX1RTKTsKLQl9CisjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCisJKHZvaWQpZHNfcmVsZWFzZV9idHMoY2hpbGQpOworCisJY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zciAmPSB+YnRzX2NmZy5kZWJ1Z2N0bF9tYXNrOworCWlmICghY2hpbGQtPnRocmVhZC5kZWJ1Z2N0bG1zcikKKwkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfREVCVUdDVExNU1IpOworCisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfQlRTX1RSQUNFX1RTKTsKKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BUUkFDRV9CVFMgKi8KIH0KIAogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgpAQCAtOTgwLDcgKzExMDAsNyBAQAogCS8qCiAJICogVGhlc2UgYml0cyBuZWVkIG1vcmUgY29va2luZyAtIG5vdCBlbmFibGVkIHlldDoKIAkgKi8KLSNpZmRlZiBYODZfQlRTCisjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCiAJY2FzZSBQVFJBQ0VfQlRTX0NPTkZJRzoKIAkJcmV0ID0gcHRyYWNlX2J0c19jb25maWcKIAkJCShjaGlsZCwgZGF0YSwgKHN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBfX3VzZXIgKilhZGRyKTsKQEAgLTk5Miw3ICsxMTEyLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9CVFNfU0laRToKLQkJcmV0ID0gcHRyYWNlX2J0c19nZXRfc2l6ZShjaGlsZCk7CisJCXJldCA9IGRzX2dldF9idHNfaW5kZXgoY2hpbGQsIC8qIHBvcyA9ICovIE5VTEwpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX0JUU19HRVQ6CkBAIC0xMDAxLDE0ICsxMTIxLDE0IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfQlRTX0NMRUFSOgotCQlyZXQgPSBwdHJhY2VfYnRzX2NsZWFyKGNoaWxkKTsKKwkJcmV0ID0gZHNfY2xlYXJfYnRzKGNoaWxkKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9CVFNfRFJBSU46CiAJCXJldCA9IHB0cmFjZV9idHNfZHJhaW4KIAkJCShjaGlsZCwgZGF0YSwgKHN0cnVjdCBidHNfc3RydWN0IF9fdXNlciAqKSBhZGRyKTsKIAkJYnJlYWs7Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BUUkFDRV9CVFMgKi8KIAogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKQEAgLTEyOTAsNiArMTQxMCwxMiBAQAogCQkuc2l6ZSA9IHNpemVvZihsb25nKSwgLmFsaWduID0gc2l6ZW9mKGxvbmcpLAogCQkuYWN0aXZlID0geGZwcmVnc19hY3RpdmUsIC5nZXQgPSB4ZnByZWdzX2dldCwgLnNldCA9IHhmcHJlZ3Nfc2V0CiAJfSwKKwlbUkVHU0VUX0lPUEVSTTY0XSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfMzg2X0lPUEVSTSwKKwkJLm4gPSBJT19CSVRNQVBfTE9OR1MsCisJCS5zaXplID0gc2l6ZW9mKGxvbmcpLCAuYWxpZ24gPSBzaXplb2YobG9uZyksCisJCS5hY3RpdmUgPSBpb3Blcm1fYWN0aXZlLCAuZ2V0ID0gaW9wZXJtX2dldAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgdXNlcl94ODZfNjRfdmlldyA9IHsKQEAgLTEzMzYsNiArMTQ2MiwxMiBAQAogCQkuYWN0aXZlID0gcmVnc2V0X3Rsc19hY3RpdmUsCiAJCS5nZXQgPSByZWdzZXRfdGxzX2dldCwgLnNldCA9IHJlZ3NldF90bHNfc2V0CiAJfSwKKwlbUkVHU0VUX0lPUEVSTTMyXSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfMzg2X0lPUEVSTSwKKwkJLm4gPSBJT19CSVRNQVBfQllURVMgLyBzaXplb2YodTMyKSwKKwkJLnNpemUgPSBzaXplb2YodTMyKSwgLmFsaWduID0gc2l6ZW9mKHUzMiksCisJCS5hY3RpdmUgPSBpb3Blcm1fYWN0aXZlLCAuZ2V0ID0gaW9wZXJtX2dldAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgdXNlcl94ODZfMzJfdmlldyA9IHsKQEAgLTEzNTcsNyArMTQ4OSw4IEBACiAjZW5kaWYKIH0KIAotdm9pZCBzZW5kX3NpZ3RyYXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyb3JfY29kZSkKK3ZvaWQgc2VuZF9zaWd0cmFwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIGludCBlcnJvcl9jb2RlLCBpbnQgc2lfY29kZSkKIHsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCkBAIC0xMzY2LDcgKzE0OTksNyBAQAogCiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOwotCWluZm8uc2lfY29kZSA9IFRSQVBfQlJLUFQ7CisJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKIAogCS8qIFVzZXItbW9kZSBpcD8gKi8KIAlpbmZvLnNpX2FkZHIgPSB1c2VyX21vZGVfdm0ocmVncykgPyAodm9pZCBfX3VzZXIgKikgcmVncy0+aXAgOiBOVUxMOwpAQCAtMTM3NSwzMCArMTUwOCw2IEBACiAJZm9yY2Vfc2lnX2luZm8oU0lHVFJBUCwgJmluZm8sIHRzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXJldHVybjsKLQotI2lmIDAKLQlwcmludGsoInRyYWNlICVzIGlwICVseCBzcCAlbHggYXggJWQgb3JpZ3JheCAlZCBjYWxsZXIgJWx4IHRpZmxhZ3MgJXggcHRyYWNlICV4XG4iLAotCSAgICAgICBjdXJyZW50LT5jb21tLAotCSAgICAgICByZWdzLT5pcCwgcmVncy0+c3AsIHJlZ3MtPmF4LCByZWdzLT5vcmlnX2F4LCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksCi0JICAgICAgIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIGN1cnJlbnQtPnB0cmFjZSk7Ci0jZW5kaWYKLQotCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQotCQkJCT8gMHg4MCA6IDApKTsKLQkvKgotCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbwotCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCi0JICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAotCSAqLwotCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKLQkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKLQkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKLQl9Ci19CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGRlZmluZSBJU19JQTMyCTEKQEAgLTE0MzIsOCArMTU0MSw5IEBACiAJaWYgKHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfRU1VKSkpCiAJCXJldCA9IC0xTDsKIAotCWlmIChyZXQgfHwgdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCi0JCXN5c2NhbGxfdHJhY2UocmVncyk7CisJaWYgKChyZXQgfHwgdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpICYmCisJICAgIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShyZWdzKSkKKwkJcmV0ID0gLTFMOwogCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKSB7CiAJCWlmIChJU19JQTMyKQpAQCAtMTQ1OSw3ICsxNTY5LDcgQEAKIAkJYXVkaXRfc3lzY2FsbF9leGl0KEFVRElUU0NfUkVTVUxUKHJlZ3MtPmF4KSwgcmVncy0+YXgpOwogCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlzeXNjYWxsX3RyYWNlKHJlZ3MpOworCQl0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdChyZWdzLCAwKTsKIAogCS8qCiAJICogSWYgVElGX1NZU0NBTExfRU1VIGlzIHNldCwgd2Ugb25seSBnZXQgaGVyZSBiZWNhdXNlIG9mCkBAIC0xNDc1LDYgKzE1ODUsNiBAQAogCSAqIHN5c3RlbSBjYWxsIGluc3RydWN0aW9uLgogCSAqLwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSAmJgotCSAgICAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXNlbmRfc2lndHJhcChjdXJyZW50LCByZWdzLCAwKTsKKwkgICAgdHJhY2Vob29rX2NvbnNpZGVyX2ZhdGFsX3NpZ25hbChjdXJyZW50LCBTSUdUUkFQLCBTSUdfREZMKSkKKwkJc2VuZF9zaWd0cmFwKGN1cnJlbnQsIHJlZ3MsIDAsIFRSQVBfQlJLUFQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B2Y2xvY2suYyBiL2FyY2gveDg2L2tlcm5lbC9wdmNsb2NrLmMKaW5kZXggMDVmYmU5YS4uNGY5YzU1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3B2Y2xvY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jCkBAIC05Nyw2ICs5NywxOCBAQAogCXJldHVybiBkc3QtPnZlcnNpb247CiB9CiAKK3Vuc2lnbmVkIGxvbmcgcHZjbG9ja190c2Nfa2h6KHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICpzcmMpCit7CisJdTY0IHB2X3RzY19raHogPSAxMDAwMDAwVUxMIDw8IDMyOworCisJZG9fZGl2KHB2X3RzY19raHosIHNyYy0+dHNjX3RvX3N5c3RlbV9tdWwpOworCWlmIChzcmMtPnRzY19zaGlmdCA8IDApCisJCXB2X3RzY19raHogPDw9IC1zcmMtPnRzY19zaGlmdDsKKwllbHNlCisJCXB2X3RzY19raHogPj49IHNyYy0+dHNjX3NoaWZ0OworCXJldHVybiBwdl90c2Nfa2h6OworfQorCiBjeWNsZV90IHB2Y2xvY2tfY2xvY2tzb3VyY2VfcmVhZChzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqc3JjKQogewogCXN0cnVjdCBwdmNsb2NrX3NoYWRvd190aW1lIHNoYWRvdzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYwppbmRleCBkMTM4NTg4Li5mNmExMWI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCkBAIC0zNTQsOSArMzU0LDI3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIkZvcmNlIGVuYWJsZWQgSFBFVCBhdCByZXN1bWVcbiIpOwogfQogCitzdGF0aWMgdTMyIGF0aV9peHA0eDBfcmV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTMyIGQ7CisJdTggIGI7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4YWMsICZiKTsKKwliICY9IH4oMTw8NSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhhYywgYik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg3MCwgJmQpOworCWQgfD0gMTw8ODsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg3MCwgZCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg4LCAmZCk7CisJZCAmPSAweGZmOworCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiU0I0WDAgcmV2aXNpb24gMHgleFxuIiwgZCk7CisJcmV0dXJuIGQ7Cit9CisKIHN0YXRpYyB2b2lkIGF0aV9mb3JjZV9lbmFibGVfaHBldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXUzMiB1bmluaXRpYWxpemVkX3Zhcih2YWwpOworCXUzMiBkLCB2YWw7CisJdTggIGI7CiAKIAlpZiAoaHBldF9hZGRyZXNzIHx8IGZvcmNlX2hwZXRfYWRkcmVzcykKIAkJcmV0dXJuOwpAQCAtMzY2LDE0ICszODQsMzMgQEAKIAkJcmV0dXJuOwogCX0KIAorCWQgPSBhdGlfaXhwNHgwX3JldihkZXYpOworCWlmIChkICA8IDB4ODIpCisJCXJldHVybjsKKworCS8qIGJhc2UgYWRkcmVzcyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDE0LCAweGZlZDAwMDAwKTsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDE0LCAmdmFsKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlvdXRiKDB4NzIsIDB4Y2Q2KTsgYiA9IGluYigweGNkNyk7CisJYiB8PSAweDE7CisJb3V0YigweDcyLCAweGNkNik7IG91dGIoYiwgMHhjZDcpOworCW91dGIoMHg3MiwgMHhjZDYpOyBiID0gaW5iKDB4Y2Q3KTsKKwlpZiAoIShiICYgMHgxKSkKKwkJcmV0dXJuOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NjQsICZkKTsKKwlkIHw9ICgxPDwxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NjQsIGQpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NjQsICZkKTsKKwlpZiAoIShkICYgKDE8PDEwKSkpCisJCXJldHVybjsKKwogCWZvcmNlX2hwZXRfYWRkcmVzcyA9IHZhbDsKIAlmb3JjZV9ocGV0X3Jlc3VtZV90eXBlID0gQVRJX0ZPUkNFX0hQRVRfUkVTVU1FOwogCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiRm9yY2UgZW5hYmxlZCBIUEVUIGF0IDB4JWx4XG4iLAogCQkgICBmb3JjZV9ocGV0X2FkZHJlc3MpOwogCWNhY2hlZF9kZXYgPSBkZXY7Ci0JcmV0dXJuOwogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9JWFA0MDBfU01CVVMsCiAJCQkgYXRpX2ZvcmNlX2VuYWJsZV9ocGV0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCA3MjRhZGZjLi5mNGM5M2YxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC0yOSw3ICsyOSwxMSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRlc2NfcHRyIG5vX2lkdCA9IHt9Owogc3RhdGljIGludCByZWJvb3RfbW9kZTsKLWVudW0gcmVib290X3R5cGUgcmVib290X3R5cGUgPSBCT09UX0tCRDsKKy8qCisgKiBLZXlib2FyZCByZXNldCBhbmQgdHJpcGxlIGZhdWx0IG1heSByZXN1bHQgaW4gSU5JVCwgbm90IFJFU0VULCB3aGljaAorICogZG9lc24ndCB3b3JrIHdoZW4gd2UncmUgaW4gdm14IHJvb3QgbW9kZS4gIFRyeSBBQ1BJIGZpcnN0LgorICovCitlbnVtIHJlYm9vdF90eXBlIHJlYm9vdF90eXBlID0gQk9PVF9BQ1BJOwogaW50IHJlYm9vdF9mb3JjZTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgJiYgZGVmaW5lZChDT05GSUdfU01QKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3J0Yy5jIGIvYXJjaC94ODYva2VybmVsL3J0Yy5jCmluZGV4IDA1MTkxYmIuLjBhMjNiNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ydGMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKQEAgLTIyMywxMSArMjIzLDI1IEBACiBzdGF0aWMgX19pbml0IGludCBhZGRfcnRjX2Ntb3Modm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKCFwbnBfcGxhdGZvcm1fZGV2aWNlcykKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfZGV2aWNlKTsKLSNlbHNlCisJc3RhdGljIGNvbnN0IGNoYXIgKmlkc1tdIF9faW5pdGNvbnN0ID0KKwkgICAgeyAiUE5QMGIwMCIsICJQTlAwYjAxIiwgIlBOUDBiMDIiLCB9OworCXN0cnVjdCBwbnBfZGV2ICpkZXY7CisJc3RydWN0IHBucF9pZCAqaWQ7CisJaW50IGk7CisKKwlwbnBfZm9yX2VhY2hfZGV2KGRldikgeworCQlmb3IgKGlkID0gZGV2LT5pZDsgaWQ7IGlkID0gaWQtPm5leHQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlkcyk7IGkrKykgeworCQkJCWlmIChjb21wYXJlX3BucF9pZChpZCwgaWRzW2ldKSAhPSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZydGNfZGV2aWNlKTsKLSNlbmRpZiAvKiBDT05GSUdfUE5QICovCisJZGV2X2luZm8oJnJ0Y19kZXZpY2UuZGV2LAorCQkgInJlZ2lzdGVyZWQgcGxhdGZvcm0gUlRDIGRldmljZSAobm8gUE5QIGRldmljZSBmb3VuZClcbiIpOwogCXJldHVybiAwOwogfQogZGV2aWNlX2luaXRjYWxsKGFkZF9ydGNfY21vcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IDM2MmQ0ZTcuLjIyNTU3ODIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC0yMjMsNiArMjIzLDkgQEAKICNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAwMAogCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisjaWZkZWYgQ09ORklHX0NNRExJTkVfQk9PTAorc3RhdGljIGNoYXIgX19pbml0ZGF0YSBidWlsdGluX2NtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdID0gQ09ORklHX0NNRExJTkU7CisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKIHN0cnVjdCBlZGQgZWRkOwpAQCAtMjk5LDcgKzMwMiw3IEBACiAJCWlmIChjbGVuID4gTUFYX01BUF9DSFVOSy1zbG9wKQogCQkJY2xlbiA9IE1BWF9NQVBfQ0hVTkstc2xvcDsKIAkJbWFwYWRkciA9IHJhbWRpc2tfaW1hZ2UgJiBQQUdFX01BU0s7Ci0JCXAgPSBlYXJseV9pb3JlbWFwKG1hcGFkZHIsIGNsZW4rc2xvcCk7CisJCXAgPSBlYXJseV9tZW1yZW1hcChtYXBhZGRyLCBjbGVuK3Nsb3ApOwogCQltZW1jcHkocSwgcCtzbG9wLCBjbGVuKTsKIAkJZWFybHlfaW91bm1hcChwLCBjbGVuK3Nsb3ApOwogCQlxICs9IGNsZW47CkBAIC0zNzYsNyArMzc5LDcgQEAKIAkJcmV0dXJuOwogCXBhX2RhdGEgPSBib290X3BhcmFtcy5oZHIuc2V0dXBfZGF0YTsKIAl3aGlsZSAocGFfZGF0YSkgewotCQlkYXRhID0gZWFybHlfaW9yZW1hcChwYV9kYXRhLCBQQUdFX1NJWkUpOworCQlkYXRhID0gZWFybHlfbWVtcmVtYXAocGFfZGF0YSwgUEFHRV9TSVpFKTsKIAkJc3dpdGNoIChkYXRhLT50eXBlKSB7CiAJCWNhc2UgU0VUVVBfRTgyMF9FWFQ6CiAJCQlwYXJzZV9lODIwX2V4dChkYXRhLCBwYV9kYXRhKTsKQEAgLTM5OSw3ICs0MDIsNyBAQAogCQlyZXR1cm47CiAJcGFfZGF0YSA9IGJvb3RfcGFyYW1zLmhkci5zZXR1cF9kYXRhOwogCXdoaWxlIChwYV9kYXRhKSB7Ci0JCWRhdGEgPSBlYXJseV9pb3JlbWFwKHBhX2RhdGEsIHNpemVvZigqZGF0YSkpOworCQlkYXRhID0gZWFybHlfbWVtcmVtYXAocGFfZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CiAJCWU4MjBfdXBkYXRlX3JhbmdlKHBhX2RhdGEsIHNpemVvZigqZGF0YSkrZGF0YS0+bGVuLAogCQkJIEU4MjBfUkFNLCBFODIwX1JFU0VSVkVEX0tFUk4pOwogCQlmb3VuZCA9IDE7CkBAIC00MjUsNyArNDI4LDcgQEAKIAkJcmV0dXJuOwogCXBhX2RhdGEgPSBib290X3BhcmFtcy5oZHIuc2V0dXBfZGF0YTsKIAl3aGlsZSAocGFfZGF0YSkgewotCQlkYXRhID0gZWFybHlfaW9yZW1hcChwYV9kYXRhLCBzaXplb2YoKmRhdGEpKTsKKwkJZGF0YSA9IGVhcmx5X21lbXJlbWFwKHBhX2RhdGEsIHNpemVvZigqZGF0YSkpOwogCQlzcHJpbnRmKGJ1ZiwgInNldHVwIGRhdGEgJXgiLCBkYXRhLT50eXBlKTsKIAkJcmVzZXJ2ZV9lYXJseShwYV9kYXRhLCBwYV9kYXRhK3NpemVvZigqZGF0YSkrZGF0YS0+bGVuLCBidWYpOwogCQlwYV9kYXRhID0gZGF0YS0+bmV4dDsKQEAgLTU3OSw2ICs1ODIsMTkwIEBACiBzdHJ1Y3QgeDg2X3F1aXJrcyAqeDg2X3F1aXJrcyBfX2luaXRkYXRhID0gJmRlZmF1bHRfeDg2X3F1aXJrczsKIAogLyoKKyAqIFNvbWUgQklPU2VzIHNlZW0gdG8gY29ycnVwdCB0aGUgbG93IDY0ayBvZiBtZW1vcnkgZHVyaW5nIGV2ZW50cworICogbGlrZSBzdXNwZW5kL3Jlc3VtZSBhbmQgdW5wbHVnZ2luZyBhbiBIRE1JIGNhYmxlLiAgUmVzZXJ2ZSBhbGwKKyAqIHJlbWFpbmluZyBmcmVlIG1lbW9yeSBpbiB0aGF0IGFyZWEgYW5kIGZpbGwgaXQgd2l0aCBhIGRpc3RpbmN0CisgKiBwYXR0ZXJuLgorICovCisjaWZkZWYgQ09ORklHX1g4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT04KKyNkZWZpbmUgTUFYX1NDQU5fQVJFQVMJOAorCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgbWVtb3J5X2NvcnJ1cHRpb25fY2hlY2sgPSAtMTsKKworc3RhdGljIHVuc2lnbmVkIF9fcmVhZF9tb3N0bHkgY29ycnVwdGlvbl9jaGVja19zaXplID0gNjQqMTAyNDsKK3N0YXRpYyB1bnNpZ25lZCBfX3JlYWRfbW9zdGx5IGNvcnJ1cHRpb25fY2hlY2tfcGVyaW9kID0gNjA7IC8qIHNlY29uZHMgKi8KKworc3RhdGljIHN0cnVjdCBlODIwZW50cnkgc2Nhbl9hcmVhc1tNQVhfU0NBTl9BUkVBU107CitzdGF0aWMgaW50IG51bV9zY2FuX2FyZWFzOworCisKK3N0YXRpYyBpbnQgc2V0X2NvcnJ1cHRpb25fY2hlY2soY2hhciAqYXJnKQoreworCWNoYXIgKmVuZDsKKworCW1lbW9yeV9jb3JydXB0aW9uX2NoZWNrID0gc2ltcGxlX3N0cnRvbChhcmcsICZlbmQsIDEwKTsKKworCXJldHVybiAoKmVuZCA9PSAwKSA/IDAgOiAtRUlOVkFMOworfQorZWFybHlfcGFyYW0oIm1lbW9yeV9jb3JydXB0aW9uX2NoZWNrIiwgc2V0X2NvcnJ1cHRpb25fY2hlY2spOworCitzdGF0aWMgaW50IHNldF9jb3JydXB0aW9uX2NoZWNrX3BlcmlvZChjaGFyICphcmcpCit7CisJY2hhciAqZW5kOworCisJY29ycnVwdGlvbl9jaGVja19wZXJpb2QgPSBzaW1wbGVfc3RydG91bChhcmcsICZlbmQsIDEwKTsKKworCXJldHVybiAoKmVuZCA9PSAwKSA/IDAgOiAtRUlOVkFMOworfQorZWFybHlfcGFyYW0oIm1lbW9yeV9jb3JydXB0aW9uX2NoZWNrX3BlcmlvZCIsIHNldF9jb3JydXB0aW9uX2NoZWNrX3BlcmlvZCk7CisKK3N0YXRpYyBpbnQgc2V0X2NvcnJ1cHRpb25fY2hlY2tfc2l6ZShjaGFyICphcmcpCit7CisJY2hhciAqZW5kOworCXVuc2lnbmVkIHNpemU7CisKKwlzaXplID0gbWVtcGFyc2UoYXJnLCAmZW5kKTsKKworCWlmICgqZW5kID09ICdcMCcpCisJCWNvcnJ1cHRpb25fY2hlY2tfc2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gKHNpemUgPT0gY29ycnVwdGlvbl9jaGVja19zaXplKSA/IDAgOiAtRUlOVkFMOworfQorZWFybHlfcGFyYW0oIm1lbW9yeV9jb3JydXB0aW9uX2NoZWNrX3NpemUiLCBzZXRfY29ycnVwdGlvbl9jaGVja19zaXplKTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfYmlvc19jb3JydXB0aW9uX2NoZWNrKHZvaWQpCit7CisJdTY0IGFkZHIgPSBQQUdFX1NJWkU7CS8qIGFzc3VtZSBmaXJzdCBwYWdlIGlzIHJlc2VydmVkIGFueXdheSAqLworCisJaWYgKG1lbW9yeV9jb3JydXB0aW9uX2NoZWNrID09IC0xKSB7CisJCW1lbW9yeV9jb3JydXB0aW9uX2NoZWNrID0KKyNpZmRlZiBDT05GSUdfWDg2X0JPT1RQQVJBTV9NRU1PUllfQ09SUlVQVElPTl9DSEVDSworCQkJMQorI2Vsc2UKKwkJCTAKKyNlbmRpZgorCQkJOworCX0KKworCWlmIChjb3JydXB0aW9uX2NoZWNrX3NpemUgPT0gMCkKKwkJbWVtb3J5X2NvcnJ1cHRpb25fY2hlY2sgPSAwOworCisJaWYgKCFtZW1vcnlfY29ycnVwdGlvbl9jaGVjaykKKwkJcmV0dXJuOworCisJY29ycnVwdGlvbl9jaGVja19zaXplID0gcm91bmRfdXAoY29ycnVwdGlvbl9jaGVja19zaXplLCBQQUdFX1NJWkUpOworCisJd2hpbGUoYWRkciA8IGNvcnJ1cHRpb25fY2hlY2tfc2l6ZSAmJiBudW1fc2Nhbl9hcmVhcyA8IE1BWF9TQ0FOX0FSRUFTKSB7CisJCXU2NCBzaXplOworCQlhZGRyID0gZmluZF9lODIwX2FyZWFfc2l6ZShhZGRyLCAmc2l6ZSwgUEFHRV9TSVpFKTsKKworCQlpZiAoYWRkciA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKChhZGRyICsgc2l6ZSkgPiBjb3JydXB0aW9uX2NoZWNrX3NpemUpCisJCQlzaXplID0gY29ycnVwdGlvbl9jaGVja19zaXplIC0gYWRkcjsKKworCQlpZiAoc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisKKwkJZTgyMF91cGRhdGVfcmFuZ2UoYWRkciwgc2l6ZSwgRTgyMF9SQU0sIEU4MjBfUkVTRVJWRUQpOworCQlzY2FuX2FyZWFzW251bV9zY2FuX2FyZWFzXS5hZGRyID0gYWRkcjsKKwkJc2Nhbl9hcmVhc1tudW1fc2Nhbl9hcmVhc10uc2l6ZSA9IHNpemU7CisJCW51bV9zY2FuX2FyZWFzKys7CisKKwkJLyogQXNzdW1lIHdlJ3ZlIGFscmVhZHkgbWFwcGVkIHRoaXMgZWFybHkgbWVtb3J5ICovCisJCW1lbXNldChfX3ZhKGFkZHIpLCAwLCBzaXplKTsKKworCQlhZGRyICs9IHNpemU7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiU2Nhbm5pbmcgJWQgYXJlYXMgZm9yIGxvdyBtZW1vcnkgY29ycnVwdGlvblxuIiwKKwkgICAgICAgbnVtX3NjYW5fYXJlYXMpOworCXVwZGF0ZV9lODIwKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwZXJpb2RpY19jaGVja190aW1lcjsKKwordm9pZCBjaGVja19mb3JfYmlvc19jb3JydXB0aW9uKHZvaWQpCit7CisJaW50IGk7CisJaW50IGNvcnJ1cHRpb24gPSAwOworCisJaWYgKCFtZW1vcnlfY29ycnVwdGlvbl9jaGVjaykKKwkJcmV0dXJuOworCisJZm9yKGkgPSAwOyBpIDwgbnVtX3NjYW5fYXJlYXM7IGkrKykgeworCQl1bnNpZ25lZCBsb25nICphZGRyID0gX192YShzY2FuX2FyZWFzW2ldLmFkZHIpOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBzY2FuX2FyZWFzW2ldLnNpemU7CisKKwkJZm9yKDsgc2l6ZTsgYWRkcisrLCBzaXplIC09IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworCQkJaWYgKCEqYWRkcikKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ29ycnVwdGVkIGxvdyBtZW1vcnkgYXQgJXAgKCVseCBwaHlzKSA9ICUwOGx4XG4iLAorCQkJICAgICAgIGFkZHIsIF9fcGEoYWRkciksICphZGRyKTsKKwkJCWNvcnJ1cHRpb24gPSAxOworCQkJKmFkZHIgPSAwOworCQl9CisJfQorCisJV0FSTihjb3JydXB0aW9uLCBLRVJOX0VSUiAiTWVtb3J5IGNvcnJ1cHRpb24gZGV0ZWN0ZWQgaW4gbG93IG1lbW9yeVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmlvZGljX2NoZWNrX2Zvcl9jb3JydXB0aW9uKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwljaGVja19mb3JfYmlvc19jb3JydXB0aW9uKCk7CisJbW9kX3RpbWVyKCZwZXJpb2RpY19jaGVja190aW1lciwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgY29ycnVwdGlvbl9jaGVja19wZXJpb2QqSFopKTsKK30KKwordm9pZCBzdGFydF9wZXJpb2RpY19jaGVja19mb3JfY29ycnVwdGlvbih2b2lkKQoreworCWlmICghbWVtb3J5X2NvcnJ1cHRpb25fY2hlY2sgfHwgY29ycnVwdGlvbl9jaGVja19wZXJpb2QgPT0gMCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU2Nhbm5pbmcgZm9yIGxvdyBtZW1vcnkgY29ycnVwdGlvbiBldmVyeSAlZCBzZWNvbmRzXG4iLAorCSAgICAgICBjb3JydXB0aW9uX2NoZWNrX3BlcmlvZCk7CisKKwlpbml0X3RpbWVyKCZwZXJpb2RpY19jaGVja190aW1lcik7CisJcGVyaW9kaWNfY2hlY2tfdGltZXIuZnVuY3Rpb24gPSAmcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb247CisJcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb24oMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZG1pX2xvd19tZW1vcnlfY29ycnVwdGlvbihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkJIiVzIGRldGVjdGVkOiBCSU9TIG1heSBjb3JydXB0IGxvdyBSQU0sIHdvcmtpbmcgaXQgYXJvdW5kLlxuIiwKKwkJZC0+aWRlbnQpOworCisJZTgyMF91cGRhdGVfcmFuZ2UoMCwgMHgxMDAwMCwgRTgyMF9SQU0sIEU4MjBfUkVTRVJWRUQpOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKworCXJldHVybiAwOworfQorCisvKiBMaXN0IG9mIHN5c3RlbXMgdGhhdCBoYXZlIGtub3duIGxvdyBtZW1vcnkgY29ycnVwdGlvbiBCSU9TIHByb2JsZW1zICovCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBiYWRfYmlvc19kbWlfdGFibGVbXSA9IHsKKyNpZmRlZiBDT05GSUdfWDg2X1JFU0VSVkVfTE9XXzY0SworCXsKKwkJLmNhbGxiYWNrID0gZG1pX2xvd19tZW1vcnlfY29ycnVwdGlvbiwKKwkJLmlkZW50ID0gIkFNSSBCSU9TIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9sb3dfbWVtb3J5X2NvcnJ1cHRpb24sCisJCS5pZGVudCA9ICJQaG9lbml4IEJJT1MiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcywgTFREIiksCisJCX0sCisJfSwKKyNlbmRpZgorCXt9Cit9OworCisvKgogICogRGV0ZXJtaW5lIGlmIHdlIHdlcmUgbG9hZGVkIGJ5IGFuIEVGSSBsb2FkZXIuICBJZiBzbywgdGhlbiB3ZSBoYXZlIGFsc28gYmVlbgogICogcGFzc2VkIHRoZSBlZmkgbWVtbWFwLCBzeXN0YWIsIGV0Yy4sIHNvIHdlIHNob3VsZCB1c2UgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzCiAgKiBmb3IgaW5pdGlhbGl6YXRpb24uICBOb3RlLCB0aGUgZWZpIGluaXQgY29kZSBwYXRoIGlzIGRldGVybWluZWQgYnkgdGhlCkBAIC02NjUsMTEgKzg1MiwyOCBAQAogCWJzc19yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fcGh5cygmX19ic3Nfc3RhcnQpOwogCWJzc19yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoJl9fYnNzX3N0b3ApLTE7CiAKKyNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCisjaWZkZWYgQ09ORklHX0NNRExJTkVfT1ZFUlJJREUKKwlzdHJsY3B5KGJvb3RfY29tbWFuZF9saW5lLCBidWlsdGluX2NtZGxpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKyNlbHNlCisJaWYgKGJ1aWx0aW5fY21kbGluZVswXSkgeworCQkvKiBhcHBlbmQgYm9vdCBsb2FkZXIgY21kbGluZSB0byBidWlsdGluICovCisJCXN0cmxjYXQoYnVpbHRpbl9jbWRsaW5lLCAiICIsIENPTU1BTkRfTElORV9TSVpFKTsKKwkJc3RybGNhdChidWlsdGluX2NtZGxpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJCXN0cmxjcHkoYm9vdF9jb21tYW5kX2xpbmUsIGJ1aWx0aW5fY21kbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCX0KKyNlbmRpZgorI2VuZGlmCisKIAlzdHJsY3B5KGNvbW1hbmRfbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKIAkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwogCiAJcGFyc2VfZWFybHlfcGFyYW0oKTsKIAorI2lmZGVmIENPTkZJR19YODZfNjQKKwljaGVja19lZmVyKCk7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1ZNSSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzMyKQogCS8qCiAJICogTXVzdCBiZSBiZWZvcmUga2VybmVsIHBhZ2V0YWJsZXMgYXJlIHNldHVwCkBAIC02OTUsNiArODk5LDEwIEBACiAKIAlmaW5pc2hfZTgyMF9wYXJzaW5nKCk7CiAKKwlkbWlfc2Nhbl9tYWNoaW5lKCk7CisKKwlkbWlfY2hlY2tfc3lzdGVtKGJhZF9iaW9zX2RtaV90YWJsZSk7CisKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJcHJvYmVfcm9tcygpOwogI2VuZGlmCkBAIC03MzgsNyArOTQ2LDggQEAKICNlbHNlCiAJbnVtX3BoeXNwYWdlcyA9IG1heF9wZm47CiAKLQljaGVja19lZmVyKCk7CisgCWlmIChjcHVfaGFzX3gyYXBpYykKKyAJCWNoZWNrX3gyYXBpYygpOwogCiAJLyogSG93IG1hbnkgZW5kLW9mLW1lbW9yeSB2YXJpYWJsZXMgeW91IGhhdmUsIGdyYW5kbWEhICovCiAJLyogbmVlZCB0aGlzIGJlZm9yZSBjYWxsaW5nIHJlc2VydmVfaW5pdHJkICovCkBAIC03NTAsNiArOTU5LDEwIEBACiAJaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEobWF4X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1g4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT04KKwlzZXR1cF9iaW9zX2NvcnJ1cHRpb25fY2hlY2soKTsKKyNlbmRpZgorCiAJLyogbWF4X3Bmbl9tYXBwZWQgaXMgdXBkYXRlZCBoZXJlICovCiAJbWF4X2xvd19wZm5fbWFwcGVkID0gaW5pdF9tZW1vcnlfbWFwcGluZygwLCBtYXhfbG93X3Bmbjw8UEFHRV9TSElGVCk7CiAJbWF4X3Bmbl9tYXBwZWQgPSBtYXhfbG93X3Bmbl9tYXBwZWQ7CkBAIC03NzgsOCArOTkxLDYgQEAKIAl2c21wX2luaXQoKTsKICNlbmRpZgogCi0JZG1pX3NjYW5fbWFjaGluZSgpOwotCiAJaW9fZGVsYXlfaW5pdCgpOwogCiAJLyoKQEAgLTc4Nyw2ICs5OTgsOCBAQAogCSAqLwogCWFjcGlfYm9vdF90YWJsZV9pbml0KCk7CiAKKwllYXJseV9hY3BpX2Jvb3RfaW5pdCgpOworCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCS8qCiAJICogUGFyc2UgU1JBVCB0byBkaXNjb3ZlciBub2Rlcy4KQEAgLTg4MiwzICsxMDk1LDUgQEAKICNlbmRpZgogI2VuZGlmCiB9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCmluZGV4IDc2ZTMwNWUuLjBlNjdmNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKQEAgLTE2Miw5ICsxNjIsMTYgQEAKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiY3B1ICVkIGhhcyBubyBub2RlICVkIG9yIG5vZGUtbG9jYWwgbWVtb3J5XG4iLAogCQkJCWNwdSwgbm9kZSk7CisJCQlpZiAocHRyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJwZXIgY3B1IGRhdGEgZm9yIGNwdSVkIGF0ICUwMTZseFxuIiwKKwkJCQkJIGNwdSwgX19wYShwdHIpKTsKIAkJfQotCQllbHNlCisJCWVsc2UgewogCQkJcHRyID0gYWxsb2NfYm9vdG1lbV9wYWdlc19ub2RlKE5PREVfREFUQShub2RlKSwgc2l6ZSk7CisJCQlpZiAocHRyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJwZXIgY3B1IGRhdGEgZm9yIGNwdSVkIG9uIG5vZGUlZCBhdCAlMDE2bHhcbiIsCisJCQkJCSBjcHUsIG5vZGUsIF9fcGEocHRyKSk7CisJCX0KICNlbmRpZgogCQlwZXJfY3B1X29mZnNldChjcHUpID0gcHRyIC0gX19wZXJfY3B1X3N0YXJ0OwogCQltZW1jcHkocHRyLCBfX3Blcl9jcHVfc3RhcnQsIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NpZ2ZyYW1lLmggYi9hcmNoL3g4Ni9rZXJuZWwvc2lnZnJhbWUuaAppbmRleCA3MmJiYjUxLi5jYzY3M2FhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2lnZnJhbWUuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnZnJhbWUuaApAQCAtMyw5ICszLDE4IEBACiAJY2hhciBfX3VzZXIgKnByZXRjb2RlOwogCWludCBzaWc7CiAJc3RydWN0IHNpZ2NvbnRleHQgc2M7Ci0Jc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJLyoKKwkgKiBmcHN0YXRlIGlzIHVudXNlZC4gZnBzdGF0ZSBpcyBtb3ZlZC9hbGxvY2F0ZWQgYWZ0ZXIKKwkgKiByZXRjb2RlW10gYmVsb3cuIFRoaXMgbW92ZW1lbnQgYWxsb3dzIHRvIGhhdmUgdGhlIEZQIHN0YXRlIGFuZCB0aGUKKwkgKiBmdXR1cmUgc3RhdGUgZXh0ZW5zaW9ucyAoeHNhdmUpIHN0YXkgdG9nZXRoZXIuCisJICogQW5kIGF0IHRoZSBzYW1lIHRpbWUgcmV0YWluaW5nIHRoZSB1bnVzZWQgZnBzdGF0ZSwgcHJldmVudHMgY2hhbmdpbmcKKwkgKiB0aGUgb2Zmc2V0IG9mIGV4dHJhbWFza1tdIGluIHRoZSBzaWdmcmFtZSBhbmQgdGh1cyBwcmV2ZW50IGFueQorCSAqIGxlZ2FjeSBhcHBsaWNhdGlvbiBhY2Nlc3NpbmcvbW9kaWZ5aW5nIGl0LgorCSAqLworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlX3VudXNlZDsKIAl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKIAljaGFyIHJldGNvZGVbOF07CisJLyogZnAgc3RhdGUgZm9sbG93cyBoZXJlICovCiB9OwogCiBzdHJ1Y3QgcnRfc2lnZnJhbWUgewpAQCAtMTUsMTMgKzI0LDE5IEBACiAJdm9pZCBfX3VzZXIgKnB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKLQlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKIAljaGFyIHJldGNvZGVbOF07CisJLyogZnAgc3RhdGUgZm9sbG93cyBoZXJlICovCiB9OwogI2Vsc2UKIHN0cnVjdCBydF9zaWdmcmFtZSB7CiAJY2hhciBfX3VzZXIgKnByZXRjb2RlOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCS8qIGZwIHN0YXRlIGZvbGxvd3MgaGVyZSAqLwogfTsKKworaW50IGlhMzJfc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgaWEzMl9zZXR1cF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCA2ZmI1YmNkLi5kNmRkMDU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NpZ25hbF8zMi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMjYsNiArMjcsOCBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlICJzaWdmcmFtZS5oIgogCkBAIC0xMTAsNiArMTEzLDI3IEBACiAJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+c3ApOwogfQogCisjZGVmaW5lIENPUFkoeCkJCQl7CQlcCisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+eCwgJnNjLT54KTsJXAorfQorCisjZGVmaW5lIENPUFlfU0VHKHNlZykJCXsJCQlcCisJCXVuc2lnbmVkIHNob3J0IHRtcDsJCQlcCisJCWVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zZWcpOwlcCisJCXJlZ3MtPnNlZyA9IHRtcDsJCQlcCit9CisKKyNkZWZpbmUgQ09QWV9TRUdfU1RSSUNUKHNlZykJewkJCVwKKwkJdW5zaWduZWQgc2hvcnQgdG1wOwkJCVwKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodG1wLCAmc2MtPnNlZyk7CVwKKwkJcmVncy0+c2VnID0gdG1wIHwgMzsJCQlcCit9CisKKyNkZWZpbmUgR0VUX1NFRyhzZWcpCQl7CQkJXAorCQl1bnNpZ25lZCBzaG9ydCB0bXA7CQkJXAorCQllcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJXAorCQlsb2Fkc2VnbWVudChzZWcsIHRtcCk7CQkJXAorfQogCiAvKgogICogRG8gYSBzaWduYWwgcmV0dXJuOyB1bmRvIHRoZSBzaWduYWwgc3RhY2suCkBAIC0xMTgsMjggKzE0MiwxMyBAQAogcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLAogCQkgICB1bnNpZ25lZCBsb25nICpwYXgpCiB7CisJdm9pZCBfX3VzZXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgdG1wZmxhZ3M7CiAJdW5zaWduZWQgaW50IGVyciA9IDA7CiAKIAkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKLSNkZWZpbmUgQ09QWSh4KQkJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+eCwgJnNjLT54KQotCi0jZGVmaW5lIENPUFlfU0VHKHNlZykJCQkJCQkJXAotCXsgdW5zaWduZWQgc2hvcnQgdG1wOwkJCQkJCVwKLQkgIGVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zZWcpOwkJCQlcCi0JICByZWdzLT5zZWcgPSB0bXA7IH0KLQotI2RlZmluZSBDT1BZX1NFR19TVFJJQ1Qoc2VnKQkJCQkJCVwKLQl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCi0JICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAotCSAgcmVncy0+c2VnID0gdG1wfDM7IH0KLQotI2RlZmluZSBHRVRfU0VHKHNlZykJCQkJCQkJXAotCXsgdW5zaWduZWQgc2hvcnQgdG1wOwkJCQkJCVwKLQkgIGVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zZWcpOwkJCQlcCi0JICBsb2Fkc2VnbWVudChzZWcsIHRtcCk7IH0KLQogCUdFVF9TRUcoZ3MpOwogCUNPUFlfU0VHKGZzKTsKIAlDT1BZX1NFRyhlcyk7CkBAIC0xNDksMzggKzE1OCwxNSBAQAogCUNPUFlfU0VHX1NUUklDVChjcyk7CiAJQ09QWV9TRUdfU1RSSUNUKHNzKTsKIAotCXsKLQkJdW5zaWduZWQgaW50IHRtcGZsYWdzOworCWVyciB8PSBfX2dldF91c2VyKHRtcGZsYWdzLCAmc2MtPmZsYWdzKTsKKwlyZWdzLT5mbGFncyA9IChyZWdzLT5mbGFncyAmIH5GSVhfRUZMQUdTKSB8ICh0bXBmbGFncyAmIEZJWF9FRkxBR1MpOworCXJlZ3MtPm9yaWdfYXggPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KIAotCQllcnIgfD0gX19nZXRfdXNlcih0bXBmbGFncywgJnNjLT5mbGFncyk7Ci0JCXJlZ3MtPmZsYWdzID0gKHJlZ3MtPmZsYWdzICYgfkZJWF9FRkxBR1MpIHwKLQkJCQkJCSh0bXBmbGFncyAmIEZJWF9FRkxBR1MpOwotCQlyZWdzLT5vcmlnX2F4ID0gLTE7CQkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCi0JfQotCi0JewotCQlzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWY7Ci0KLQkJZXJyIHw9IF9fZ2V0X3VzZXIoYnVmLCAmc2MtPmZwc3RhdGUpOwotCQlpZiAoYnVmKSB7Ci0JCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBzaXplb2YoKmJ1ZikpKQotCQkJCWdvdG8gYmFkZnJhbWU7Ci0JCQllcnIgfD0gcmVzdG9yZV9pMzg3KGJ1Zik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKLQotCQkJaWYgKHVzZWRfbWF0aCgpKSB7Ci0JCQkJY2xlYXJfZnB1KG1lKTsKLQkJCQljbGVhcl91c2VkX21hdGgoKTsKLQkJCX0KLQkJfQotCX0KKwllcnIgfD0gX19nZXRfdXNlcihidWYsICZzYy0+ZnBzdGF0ZSk7CisJZXJyIHw9IHJlc3RvcmVfaTM4N194c3RhdGUoYnVmKTsKIAogCWVyciB8PSBfX2dldF91c2VyKCpwYXgsICZzYy0+YXgpOwogCXJldHVybiBlcnI7Ci0KLWJhZGZyYW1lOgotCXJldHVybiAxOwogfQogCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQpAQCAtMjI2LDkgKzIxMiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4odW5zaWduZWQgbG9uZyBfX3VudXNlZCkKK3N0YXRpYyBsb25nIGRvX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSZfX3VudXNlZDsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAl1bnNpZ25lZCBsb25nIGF4OwogCXNpZ3NldF90IHNldDsKQEAgLTI1NCwxNSArMjM5LDIyIEBACiAJcmV0dXJuIGF4OwogCiBiYWRmcmFtZToKLQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJc2lnbmFsX2ZhdWx0KHJlZ3MsIGZyYW1lLCAicnRfc2lncmV0dXJuIik7CiAJcmV0dXJuIDA7CiB9CiAKK2FzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4odW5zaWduZWQgbG9uZyBfX3VudXNlZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSZfX3VudXNlZDsKKworCXJldHVybiBkb19ydF9zaWdyZXR1cm4ocmVncyk7Cit9CisKIC8qCiAgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUuCiAgKi8KIHN0YXRpYyBpbnQKLXNldHVwX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnBzdGF0ZSwKK3NldHVwX3NpZ2NvbnRleHQoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywgdm9pZCBfX3VzZXIgKmZwc3RhdGUsCiAJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWludCB0bXAsIGVyciA9IDA7CkBAIC0yODksNyArMjgxLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5zcCwgJnNjLT5zcF9hdF9zaWduYWwpOwogCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnNzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+c3MpOwogCi0JdG1wID0gc2F2ZV9pMzg3KGZwc3RhdGUpOworCXRtcCA9IHNhdmVfaTM4N194c3RhdGUoZnBzdGF0ZSk7CiAJaWYgKHRtcCA8IDApCiAJCWVyciA9IDE7CiAJZWxzZQpAQCAtMzA2LDcgKzI5OCw4IEBACiAgKiBEZXRlcm1pbmUgd2hpY2ggc3RhY2sgdG8gdXNlLi4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCi1nZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQorZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaXplX3QgZnJhbWVfc2l6ZSwKKwkgICAgIHZvaWQgKipmcHN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgc3A7CiAKQEAgLTMzMiw2ICszMjUsMTEgQEAKIAkJCXNwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9yZXN0b3JlcjsKIAl9CiAKKwlpZiAodXNlZF9tYXRoKCkpIHsKKwkJc3AgPSBzcCAtIHNpZ194c3RhdGVfc2l6ZTsKKwkJKmZwc3RhdGUgPSAoc3RydWN0IF9mcHN0YXRlICopIHNwOworCX0KKwogCXNwIC09IGZyYW1lX3NpemU7CiAJLyoKIAkgKiBBbGlnbiB0aGUgc3RhY2sgcG9pbnRlciBhY2NvcmRpbmcgdG8gdGhlIGkzODYgQUJJLApAQCAtMzQzLDM4ICszNDEsMjkgQEAKIH0KIAogc3RhdGljIGludAotc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnc2V0X3QgKnNldCwKLQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitfX3NldHVwX2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ3NldF90ICpzZXQsCisJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJdm9pZCBfX3VzZXIgKnJlc3RvcmVyOwogCWludCBlcnIgPSAwOwotCWludCB1c2lnOworCXZvaWQgX191c2VyICpmcHN0YXRlID0gTlVMTDsKIAotCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpLCAmZnBzdGF0ZSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAotCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKLQkJJiYgc2lnIDwgMzIKLQkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJOiBzaWc7CisJaWYgKF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZykpCisJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gX19wdXRfdXNlcih1c2lnLCAmZnJhbWUtPnNpZyk7Ci0JaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7Ci0KLQllcnIgPSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsICZmcmFtZS0+ZnBzdGF0ZSwgcmVncywgc2V0LT5zaWdbMF0pOwotCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCWlmIChzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsIGZwc3RhdGUsIHJlZ3MsIHNldC0+c2lnWzBdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoX05TSUdfV09SRFMgPiAxKSB7Ci0JCWVyciA9IF9fY29weV90b191c2VyKCZmcmFtZS0+ZXh0cmFtYXNrLCAmc2V0LT5zaWdbMV0sCi0JCQkJICAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlpZiAoX19jb3B5X3RvX3VzZXIoJmZyYW1lLT5leHRyYW1hc2ssICZzZXQtPnNpZ1sxXSwKKwkJCQkgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJaWYgKGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28pCkBAIC0zOTksNyArMzg4LDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNikpOwogCiAJaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAlyZWdzLT5zcCA9ICh1bnNpZ25lZCBsb25nKWZyYW1lOwpAQCAtNDE0LDUwICs0MDMsNDMgQEAKIAlyZWdzLT5jcyA9IF9fVVNFUl9DUzsKIAogCXJldHVybiAwOwotCi1naXZlX3NpZ3NlZ3Y6Ci0JZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCXJldHVybiAtRUZBVUxUOwogfQogCi1zdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKLQkJCSAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCXZvaWQgX191c2VyICpyZXN0b3JlcjsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdXNpZzsKKwl2b2lkIF9fdXNlciAqZnBzdGF0ZSA9IE5VTEw7CiAKLQlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSwgJmZwc3RhdGUpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQotCQlnb3RvIGdpdmVfc2lnc2VndjsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLQl1c2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgotCQkmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JCSYmIHNpZyA8IDMyCi0JCT8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCi0JCTogc2lnOwotCi0JZXJyIHw9IF9fcHV0X3VzZXIodXNpZywgJmZyYW1lLT5zaWcpOworCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOwogCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpOwogCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pOwogCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWlmIChjcHVfaGFzX3hzYXZlKQorCQllcnIgfD0gX19wdXRfdXNlcihVQ19GUF9YU1RBVEUsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVsc2UKKwkJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwogCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhyZWdzLT5zcCksCiAJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwogCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOwotCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZmcmFtZS0+ZnBzdGF0ZSwKKwllcnIgfD0gc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnVjLnVjX21jb250ZXh0LCBmcHN0YXRlLAogCQkJCXJlZ3MsIHNldC0+c2lnWzBdKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CiAJaWYgKGVycikKLQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCXJldHVybiAtRUZBVUxUOwogCiAJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gICovCiAJcmVzdG9yZXIgPSBWRFNPMzJfU1lNQk9MKGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28sIHJ0X3NpZ3JldHVybik7CkBAIC00NzcsMTIgKzQ1OSwxMiBAQAogCWVyciB8PSBfX3B1dF91c2VyKDB4ODBjZCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSs1KSk7CiAKIAlpZiAoZXJyKQotCQlnb3RvIGdpdmVfc2lnc2VndjsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWU7CiAJcmVncy0+aXAgPSAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfaGFuZGxlcjsKLQlyZWdzLT5heCA9ICh1bnNpZ25lZCBsb25nKXVzaWc7CisJcmVncy0+YXggPSAodW5zaWduZWQgbG9uZylzaWc7CiAJcmVncy0+ZHggPSAodW5zaWduZWQgbG9uZykmZnJhbWUtPmluZm87CiAJcmVncy0+Y3ggPSAodW5zaWduZWQgbG9uZykmZnJhbWUtPnVjOwogCkBAIC00OTIsMTUgKzQ3NCw0OCBAQAogCXJlZ3MtPmNzID0gX19VU0VSX0NTOwogCiAJcmV0dXJuIDA7Ci0KLWdpdmVfc2lnc2VndjoKLQlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIC8qCiAgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyOgogICovCitzdGF0aWMgaW50IHNpZ25yX2NvbnZlcnQoaW50IHNpZykKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKmluZm8gPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisKKwlpZiAoaW5mby0+ZXhlY19kb21haW4gJiYgaW5mby0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAgJiYgc2lnIDwgMzIpCisJCXJldHVybiBpbmZvLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOworCXJldHVybiBzaWc7Cit9CisKKyNkZWZpbmUgaXNfaWEzMgkxCisjZGVmaW5lIGlhMzJfc2V0dXBfZnJhbWUJX19zZXR1cF9mcmFtZQorI2RlZmluZSBpYTMyX3NldHVwX3J0X2ZyYW1lCV9fc2V0dXBfcnRfZnJhbWUKKworc3RhdGljIGludAorc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCSAgICAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgdXNpZyA9IHNpZ25yX2NvbnZlcnQoc2lnKTsKKwlpbnQgcmV0OworCisJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLworCWlmIChpc19pYTMyKSB7CisJCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQorCQkJcmV0ID0gaWEzMl9zZXR1cF9ydF9mcmFtZSh1c2lnLCBrYSwgaW5mbywgc2V0LCByZWdzKTsKKwkJZWxzZQorCQkJcmV0ID0gaWEzMl9zZXR1cF9mcmFtZSh1c2lnLCBrYSwgc2V0LCByZWdzKTsKKwl9IGVsc2UKKwkJcmV0ID0gX19zZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBzZXQsIHJlZ3MpOworCisJaWYgKHJldCkgeworCQlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQKIGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkgICAgICBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTUwOCw5ICs1MjMsOSBAQAogCWludCByZXQ7CiAKIAkvKiBBcmUgd2UgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwotCWlmICgobG9uZylyZWdzLT5vcmlnX2F4ID49IDApIHsKKwlpZiAoc3lzY2FsbF9nZXRfbnIoY3VycmVudCwgcmVncykgPj0gMCkgewogCQkvKiBJZiBzbywgY2hlY2sgc3lzdGVtIGNhbGwgcmVzdGFydGluZy4uICovCi0JCXN3aXRjaCAocmVncy0+YXgpIHsKKwkJc3dpdGNoIChzeXNjYWxsX2dldF9lcnJvcihjdXJyZW50LCByZWdzKSkgewogCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CiAJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgogCQkJcmVncy0+YXggPSAtRUlOVFI7CkBAIC01MzcsMTUgKzU1MiwyMCBAQAogCSAgICBsaWtlbHkodGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0ZPUkNFRF9URikpKQogCQlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKIAotCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKLQllbHNlCi0JCXJldCA9IHNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CisJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyoKKwkgKiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggc2VnbWVudCByZWdpc3RlcnMsCisJICogZGVzcGl0ZSB0aGUgbmFtZS4gIFRoaXMgbWFnaWMgYWZmZWN0cyB1YWNjZXNzLmgKKwkgKiBtYWNyb3MnIGJlaGF2aW9yLiAgUmVzZXQgaXQgdG8gdGhlIG5vcm1hbCBzZXR0aW5nLgorCSAqLworCXNldF9mcyhVU0VSX0RTKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBDbGVhciB0aGUgZGlyZWN0aW9uIGZsYWcgYXMgcGVyIHRoZSBBQkkgZm9yIGZ1bmN0aW9uIGVudHJ5LgogCSAqLwpAQCAtNTU4LDggKzU3OCw2IEBACiAJICogaGFuZGxlciB0b28uCiAJICovCiAJcmVncy0+ZmxhZ3MgJj0gflg4Nl9FRkxBR1NfVEY7Ci0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQotCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOwogCiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCAmY3VycmVudC0+YmxvY2tlZCwgJmthLT5zYS5zYV9tYXNrKTsKQEAgLTU2OCw5ICs1ODYsMTMgQEAKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKKwl0cmFjZWhvb2tfc2lnbmFsX2hhbmRsZXIoc2lnLCBpbmZvLCBrYSwgcmVncywKKwkJCQkgdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpOworCiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgTlJfcmVzdGFydF9zeXNjYWxsCV9fTlJfcmVzdGFydF9zeXNjYWxsCiAvKgogICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0CiAgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKQEAgLTYyMyw5ICs2NDUsOSBAQAogCX0KIAogCS8qIERpZCB3ZSBjb21lIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KLQlpZiAoKGxvbmcpcmVncy0+b3JpZ19heCA+PSAwKSB7CisJaWYgKHN5c2NhbGxfZ2V0X25yKGN1cnJlbnQsIHJlZ3MpID49IDApIHsKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCi0JCXN3aXRjaCAocmVncy0+YXgpIHsKKwkJc3dpdGNoIChzeXNjYWxsX2dldF9lcnJvcihjdXJyZW50LCByZWdzKSkgewogCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKIAkJY2FzZSAtRVJFU1RBUlRTWVM6CiAJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgpAQCAtNjM0LDcgKzY1Niw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6Ci0JCQlyZWdzLT5heCA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQkJcmVncy0+YXggPSBOUl9yZXN0YXJ0X3N5c2NhbGw7CiAJCQlyZWdzLT5pcCAtPSAyOwogCQkJYnJlYWs7CiAJCX0KQEAgLTY1Nyw5ICs2NzksMzggQEAKIHZvaWQKIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKnVudXNlZCwgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19YODZfTUNFKQorCS8qIG5vdGlmeSB1c2Vyc3BhY2Ugb2YgcGVuZGluZyBNQ0VzICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9NQ0VfTk9USUZZKQorCQltY2Vfbm90aWZ5X3VzZXIoKTsKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICYmIENPTkZJR19YODZfTUNFICovCisKIAkvKiBkZWFsIHdpdGggcGVuZGluZyBzaWduYWwgZGVsaXZlcnkgKi8KIAlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX1NJR1BFTkRJTkcpCiAJCWRvX3NpZ25hbChyZWdzKTsKIAorCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfTk9USUZZX1JFU1VNRSk7CisJCXRyYWNlaG9va19ub3RpZnlfcmVzdW1lKHJlZ3MpOworCX0KKworI2lmZGVmIENPTkZJR19YODZfMzIKIAljbGVhcl90aHJlYWRfZmxhZyhUSUZfSVJFVCk7CisjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLworfQorCit2b2lkIHNpZ25hbF9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCBfX3VzZXIgKmZyYW1lLCBjaGFyICp3aGVyZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKKworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXNbJWRdIGJhZCBmcmFtZSBpbiAlcyBmcmFtZTolcCBpcDolbHggc3A6JWx4IG9yYXg6JWx4IiwKKwkJICAgICAgIG1lLT5jb21tLCBtZS0+cGlkLCB3aGVyZSwgZnJhbWUsCisJCSAgICAgICByZWdzLT5pcCwgcmVncy0+c3AsIHJlZ3MtPm9yaWdfYXgpOworCQlwcmludF92bWFfYWRkcigiIGluICIsIHJlZ3MtPmlwKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwl9CisKKwlmb3JjZV9zaWcoU0lHU0VHViwgbWUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NpZ25hbF82NC5jIGIvYXJjaC94ODYva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IGNhMzE2YjUuLmE1Yzk2MjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsXzY0LmMKQEAgLTE1LDE3ICsxNSwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9pYTMyX3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogI2luY2x1ZGUgInNpZ2ZyYW1lLmgiCiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCkBAIC00MSwxMSArNDUsNiBAQAogIyBkZWZpbmUgRklYX0VGTEFHUwlfX0ZJWF9FRkxBR1MKICNlbmRpZgogCi1pbnQgaWEzMl9zZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCi0gICAgICAgICAgICAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOyAKLWludCBpYTMyX3NldHVwX2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0gICAgICAgICAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOyAKLQogYXNtbGlua2FnZSBsb25nCiBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsCiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNTMsNjcgKzUyLDE0IEBACiAJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+c3ApOwogfQogCi0vKgotICogU2lnbmFsIGZyYW1lIGhhbmRsZXJzLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHNhdmVfaTM4NyhzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCWludCBlcnIgPSAwOwotCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkgIT0KLQkJCXNpemVvZih0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSkpOwotCi0JaWYgKCh1bnNpZ25lZCBsb25nKWJ1ZiAlIDE2KQotCQlwcmludGsoInNhdmVfaTM4NzogYmFkIGZwc3RhdGUgJXBcbiIsIGJ1Zik7Ci0KLQlpZiAoIXVzZWRfbWF0aCgpKQotCQlyZXR1cm4gMDsKLQljbGVhcl91c2VkX21hdGgoKTsgLyogdHJpZ2dlciBmaW5pdCAqLwotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKLQkJZXJyID0gc2F2ZV9pMzg3X2NoZWNraW5nKChzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0IF9fdXNlciAqKQotCQkJCQkgYnVmKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwotCQlzdHRzKCk7Ci0JfSBlbHNlIHsKLQkJaWYgKF9fY29weV90b191c2VyKGJ1ZiwgJnRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAxOworI2RlZmluZSBDT1BZKHgpCQkJewkJXAorCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+eCk7CVwKIH0KIAotLyoKLSAqIFRoaXMgcmVzdG9yZXMgZGlyZWN0bHkgb3V0IG9mIHVzZXIgc3BhY2UuIEV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJlc3RvcmVfaTM4NyhzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCWludCBlcnI7Ci0KLQlpZiAoIXVzZWRfbWF0aCgpKSB7Ci0JCWVyciA9IGluaXRfZnB1KHRzayk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICghKHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCktPnN0YXR1cyAmIFRTX1VTRURGUFUpKSB7Ci0JCWNsdHMoKTsKLQkJdGFza190aHJlYWRfaW5mbyhjdXJyZW50KS0+c3RhdHVzIHw9IFRTX1VTRURGUFU7Ci0JfQotCWVyciA9IHJlc3RvcmVfZnB1X2NoZWNraW5nKChfX2ZvcmNlIHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKilidWYpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCS8qCi0JCSAqIEVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIGRvaW5nIHRoZSByZXN0b3JlIGZyb20gdGhlCi0JCSAqIHVzZXIgYnVmZmVyLCBjbGVhciB0aGUgZnB1IHN0YXRlLgotCQkgKi8KLQkJY2xlYXJfZnB1KHRzayk7Ci0JCWNsZWFyX3VzZWRfbWF0aCgpOwotCX0KLQlyZXR1cm4gZXJyOworI2RlZmluZSBDT1BZX1NFR19TVFJJQ1Qoc2VnKQl7CQkJXAorCQl1bnNpZ25lZCBzaG9ydCB0bXA7CQkJXAorCQllcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJXAorCQlyZWdzLT5zZWcgPSB0bXAgfCAzOwkJCVwKIH0KIAogLyoKQEAgLTEyMywxMyArNjksMTMgQEAKIHJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKIAkJICAgdW5zaWduZWQgbG9uZyAqcGF4KQogeworCXZvaWQgX191c2VyICpidWY7CisJdW5zaWduZWQgaW50IHRtcGZsYWdzOwogCXVuc2lnbmVkIGludCBlcnIgPSAwOwogCiAJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwogCi0jZGVmaW5lIENPUFkoeCkJCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+eCkKLQogCUNPUFkoZGkpOyBDT1BZKHNpKTsgQ09QWShicCk7IENPUFkoc3ApOyBDT1BZKGJ4KTsKIAlDT1BZKGR4KTsgQ09QWShjeCk7IENPUFkoaXApOwogCUNPUFkocjgpOwpAQCAtMTQ0LDQ4ICs5MCwyNCBAQAogCS8qIEtlcm5lbCBzYXZlcyBhbmQgcmVzdG9yZXMgb25seSB0aGUgQ1Mgc2VnbWVudCByZWdpc3RlciBvbiBzaWduYWxzLAogCSAqIHdoaWNoIGlzIHRoZSBiYXJlIG1pbmltdW0gbmVlZGVkIHRvIGFsbG93IG1peGVkIDMyLzY0LWJpdCBjb2RlLgogCSAqIEFwcCdzIHNpZ25hbCBoYW5kbGVyIGNhbiBzYXZlL3Jlc3RvcmUgb3RoZXIgc2VnbWVudHMgaWYgbmVlZGVkLiAqLwotCXsKLQkJdW5zaWduZWQgY3M7Ci0JCWVyciB8PSBfX2dldF91c2VyKGNzLCAmc2MtPmNzKTsKLQkJcmVncy0+Y3MgPSBjcyB8IDM7CS8qIEZvcmNlIGludG8gdXNlciBtb2RlICovCi0JfQorCUNPUFlfU0VHX1NUUklDVChjcyk7CiAKLQl7Ci0JCXVuc2lnbmVkIGludCB0bXBmbGFnczsKLQkJZXJyIHw9IF9fZ2V0X3VzZXIodG1wZmxhZ3MsICZzYy0+ZmxhZ3MpOwotCQlyZWdzLT5mbGFncyA9IChyZWdzLT5mbGFncyAmIH5GSVhfRUZMQUdTKSB8ICh0bXBmbGFncyAmIEZJWF9FRkxBR1MpOwotCQlyZWdzLT5vcmlnX2F4ID0gLTE7CQkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCi0JfQorCWVyciB8PSBfX2dldF91c2VyKHRtcGZsYWdzLCAmc2MtPmZsYWdzKTsKKwlyZWdzLT5mbGFncyA9IChyZWdzLT5mbGFncyAmIH5GSVhfRUZMQUdTKSB8ICh0bXBmbGFncyAmIEZJWF9FRkxBR1MpOworCXJlZ3MtPm9yaWdfYXggPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KIAotCXsKLQkJc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqIGJ1ZjsKLQkJZXJyIHw9IF9fZ2V0X3VzZXIoYnVmLCAmc2MtPmZwc3RhdGUpOwotCi0JCWlmIChidWYpIHsKLQkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIHNpemVvZigqYnVmKSkpCi0JCQkJZ290byBiYWRmcmFtZTsKLQkJCWVyciB8PSByZXN0b3JlX2kzODcoYnVmKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwotCQkJaWYgKHVzZWRfbWF0aCgpKSB7Ci0JCQkJY2xlYXJfZnB1KG1lKTsKLQkJCQljbGVhcl91c2VkX21hdGgoKTsKLQkJCX0KLQkJfQotCX0KKwllcnIgfD0gX19nZXRfdXNlcihidWYsICZzYy0+ZnBzdGF0ZSk7CisJZXJyIHw9IHJlc3RvcmVfaTM4N194c3RhdGUoYnVmKTsKIAogCWVyciB8PSBfX2dldF91c2VyKCpwYXgsICZzYy0+YXgpOwogCXJldHVybiBlcnI7Ci0KLWJhZGZyYW1lOgotCXJldHVybiAxOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBsb25nIGRvX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlzaWdzZXRfdCBzZXQ7CiAJdW5zaWduZWQgbG9uZyBheDsKKwlzaWdzZXRfdCBzZXQ7CiAKIAlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPnNwIC0gc2l6ZW9mKGxvbmcpKTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKQEAgLTE5OCw3ICsxMjAsNyBAQAogCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQorCiAJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0LCAmYXgpKQogCQlnb3RvIGJhZGZyYW1lOwogCkBAIC0yMDgsMTYgKzEzMCwyMiBAQAogCXJldHVybiBheDsKIAogYmFkZnJhbWU6Ci0Jc2lnbmFsX2ZhdWx0KHJlZ3MsZnJhbWUsInNpZ3JldHVybiIpOworCXNpZ25hbF9mYXVsdChyZWdzLCBmcmFtZSwgInJ0X3NpZ3JldHVybiIpOwogCXJldHVybiAwOwotfQkKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIGRvX3J0X3NpZ3JldHVybihyZWdzKTsKK30KIAogLyoKICAqIFNldCB1cCBhIHNpZ25hbCBmcmFtZS4KICAqLwogCiBzdGF0aWMgaW5saW5lIGludAotc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lKQorc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lKQogewogCWludCBlcnIgPSAwOwogCkBAIC0yNjksNDEgKzE5Nyw0MCBAQAogCQkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKIAl9CiAKLQlyZXR1cm4gKHZvaWQgX191c2VyICopcm91bmRfZG93bihzcCAtIHNpemUsIDE2KTsKKwlyZXR1cm4gKHZvaWQgX191c2VyICopcm91bmRfZG93bihzcCAtIHNpemUsIDY0KTsKIH0KIAotc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCi0JCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaW50IF9fc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCXN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmZwID0gTlVMTDsgCisJdm9pZCBfX3VzZXIgKmZwID0gTlVMTDsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKIAogCWlmICh1c2VkX21hdGgoKSkgewotCQlmcCA9IGdldF9zdGFjayhrYSwgcmVncywgc2l6ZW9mKHN0cnVjdCBfZnBzdGF0ZSkpOyAKKwkJZnAgPSBnZXRfc3RhY2soa2EsIHJlZ3MsIHNpZ194c3RhdGVfc2l6ZSk7CiAJCWZyYW1lID0gKHZvaWQgX191c2VyICopcm91bmRfZG93bigKIAkJCSh1bnNpZ25lZCBsb25nKWZwIC0gc2l6ZW9mKHN0cnVjdCBydF9zaWdmcmFtZSksIDE2KSAtIDg7CiAKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcCwgc2l6ZW9mKHN0cnVjdCBfZnBzdGF0ZSkpKQotCQkJZ290byBnaXZlX3NpZ3NlZ3Y7Ci0KLQkJaWYgKHNhdmVfaTM4NyhmcCkgPCAwKSAKLQkJCWVyciB8PSAtMTsgCisJCWlmIChzYXZlX2kzODdfeHN0YXRlKGZwKSA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UKIAkJZnJhbWUgPSBnZXRfc3RhY2soa2EsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcnRfc2lnZnJhbWUpKSAtIDg7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKSB7IAotCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKSB7CisJCWlmIChjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCQkKKwogCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWlmIChjcHVfaGFzX3hzYXZlKQorCQllcnIgfD0gX19wdXRfdXNlcihVQ19GUF9YU1RBVEUsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVsc2UKKwkJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKIAllcnIgfD0gX19wdXRfdXNlcihtZS0+c2FzX3NzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmVncy0+c3ApLApAQCAtMzExLDkgKzIzOCw5IEBACiAJZXJyIHw9IF9fcHV0X3VzZXIobWUtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOwogCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsIHJlZ3MsIHNldC0+c2lnWzBdLCBtZSk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoZnAsICZmcmFtZS0+dWMudWNfbWNvbnRleHQuZnBzdGF0ZSk7Ci0JaWYgKHNpemVvZigqc2V0KSA9PSAxNikgeyAKKwlpZiAoc2l6ZW9mKCpzZXQpID09IDE2KSB7CiAJCV9fcHV0X3VzZXIoc2V0LT5zaWdbMF0sICZmcmFtZS0+dWMudWNfc2lnbWFzay5zaWdbMF0pOwotCQlfX3B1dF91c2VyKHNldC0+c2lnWzFdLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2suc2lnWzFdKTsgCisJCV9fcHV0X3VzZXIoc2V0LT5zaWdbMV0sICZmcmFtZS0+dWMudWNfc2lnbWFzay5zaWdbMV0pOwogCX0gZWxzZQogCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CiAKQEAgLTMyNCwxNSArMjUxLDE1IEBACiAJCWVyciB8PSBfX3B1dF91c2VyKGthLT5zYS5zYV9yZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7CiAJfSBlbHNlIHsKIAkJLyogY291bGQgdXNlIGEgdnN0dWIgaGVyZSAqLwotCQlnb3RvIGdpdmVfc2lnc2VndjsgCisJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmIChlcnIpCi0JCWdvdG8gZ2l2ZV9zaWdzZWd2OworCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+ZGkgPSBzaWc7Ci0JLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLyAKKwkvKiBJbiBjYXNlIHRoZSBzaWduYWwgaGFuZGxlciB3YXMgZGVjbGFyZWQgd2l0aG91dCBwcm90b3R5cGVzICovCiAJcmVncy0+YXggPSAwOwogCiAJLyogVGhpcyBhbHNvIHdvcmtzIGZvciBub24gU0FfU0lHSU5GTyBoYW5kbGVycyBiZWNhdXNlIHRoZXkgZXhwZWN0IHRoZQpAQCAtMzQ4LDQ0ICsyNzUsNDUgQEAKIAlyZWdzLT5jcyA9IF9fVVNFUl9DUzsKIAogCXJldHVybiAwOwotCi1naXZlX3NpZ3NlZ3Y6Ci0JZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCXJldHVybiAtRUZBVUxUOwotfQotCi0vKgotICogUmV0dXJuIC0xTCBvciB0aGUgc3lzY2FsbCBudW1iZXIgdGhhdCBAcmVncyBpcyBleGVjdXRpbmcuCi0gKi8KLXN0YXRpYyBsb25nIGN1cnJlbnRfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQkvKgotCSAqIFdlIGFsd2F5cyBzaWduLWV4dGVuZCBhIC0xIHZhbHVlIGJlaW5nIHNldCBoZXJlLAotCSAqIHNvIHRoaXMgaXMgYWx3YXlzIGVpdGhlciAtMUwgb3IgYSBzeXNjYWxsIG51bWJlci4KLQkgKi8KLQlyZXR1cm4gcmVncy0+b3JpZ19heDsKLX0KLQotLyoKLSAqIFJldHVybiBhIHZhbHVlIHRoYXQgaXMgLUVGT08gaWYgdGhlIHN5c3RlbSBjYWxsIGluIEByZWdzLT5vcmlnX2F4Ci0gKiByZXR1cm5lZCBhbiBlcnJvci4gIFRoaXMgb25seSB3b3JrcyBmb3IgQHJlZ3MgZnJvbSBAY3VycmVudC4KLSAqLwotc3RhdGljIGxvbmcgY3VycmVudF9zeXNjYWxsX3JldChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikpCi0JCS8qCi0JCSAqIFNpZ24tZXh0ZW5kIHRoZSB2YWx1ZSBzbyAoaW50KS1FRk9PIGJlY29tZXMgKGxvbmcpLUVGT08KLQkJICogYW5kIHdpbGwgbWF0Y2ggY29ycmVjdGx5IGluIGNvbXBhcmlzb25zLgotCQkgKi8KLQkJcmV0dXJuIChpbnQpIHJlZ3MtPmF4OwotI2VuZGlmCi0JcmV0dXJuIHJlZ3MtPmF4OwogfQogCiAvKgogICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgotICovCQorICovCitzdGF0aWMgaW50IHNpZ25yX2NvbnZlcnQoaW50IHNpZykKK3sKKwlyZXR1cm4gc2lnOworfQorCisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisjZGVmaW5lIGlzX2lhMzIJdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikKKyNlbHNlCisjZGVmaW5lIGlzX2lhMzIJMAorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3NldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKKwkgICAgICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHVzaWcgPSBzaWducl9jb252ZXJ0KHNpZyk7CisJaW50IHJldDsKKworCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KKwlpZiAoaXNfaWEzMikgeworCQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJCXJldCA9IGlhMzJfc2V0dXBfcnRfZnJhbWUodXNpZywga2EsIGluZm8sIHNldCwgcmVncyk7CisJCWVsc2UKKwkJCXJldCA9IGlhMzJfc2V0dXBfZnJhbWUodXNpZywga2EsIHNldCwgcmVncyk7CisJfSBlbHNlCisJCXJldCA9IF9fc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgc2V0LCByZWdzKTsKKworCWlmIChyZXQpIHsKKwkJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQogCiBzdGF0aWMgaW50CiBoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCkBAIC0zOTQsOSArMzIyLDkgQEAKIAlpbnQgcmV0OwogCiAJLyogQXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KLQlpZiAoY3VycmVudF9zeXNjYWxsKHJlZ3MpID49IDApIHsKKwlpZiAoc3lzY2FsbF9nZXRfbnIoY3VycmVudCwgcmVncykgPj0gMCkgewogCQkvKiBJZiBzbywgY2hlY2sgc3lzdGVtIGNhbGwgcmVzdGFydGluZy4uICovCi0JCXN3aXRjaCAoY3VycmVudF9zeXNjYWxsX3JldChyZWdzKSkgeworCQlzd2l0Y2ggKHN5c2NhbGxfZ2V0X2Vycm9yKGN1cnJlbnQsIHJlZ3MpKSB7CiAJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKIAkJY2FzZSAtRVJFU1RBUlROT0hBTkQ6CiAJCQlyZWdzLT5heCA9IC1FSU5UUjsKQEAgLTQyMyw1MCArMzUxLDQ4IEBACiAJICAgIGxpa2VseSh0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfRk9SQ0VEX1RGKSkpCiAJCXJlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX1RGOwogCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpKSB7Ci0JCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQkJcmV0ID0gaWEzMl9zZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCQllbHNlCi0JCQlyZXQgPSBpYTMyX3NldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7Ci0JfSBlbHNlIAotI2VuZGlmCiAJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAotCWlmIChyZXQgPT0gMCkgewotCQkvKgotCQkgKiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggc2VnbWVudCByZWdpc3RlcnMsCi0JCSAqIGRlc3BpdGUgdGhlIG5hbWUuICBUaGlzIG1hZ2ljIGFmZmVjdHMgdWFjY2Vzcy5oCi0JCSAqIG1hY3JvcycgYmVoYXZpb3IuICBSZXNldCBpdCB0byB0aGUgbm9ybWFsIHNldHRpbmcuCi0JCSAqLwotCQlzZXRfZnMoVVNFUl9EUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCQkvKgotCQkgKiBDbGVhciB0aGUgZGlyZWN0aW9uIGZsYWcgYXMgcGVyIHRoZSBBQkkgZm9yIGZ1bmN0aW9uIGVudHJ5LgotCQkgKi8KLQkJcmVncy0+ZmxhZ3MgJj0gflg4Nl9FRkxBR1NfREY7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS8qCisJICogVGhpcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIHNlZ21lbnQgcmVnaXN0ZXJzLAorCSAqIGRlc3BpdGUgdGhlIG5hbWUuICBUaGlzIG1hZ2ljIGFmZmVjdHMgdWFjY2Vzcy5oCisJICogbWFjcm9zJyBiZWhhdmlvci4gIFJlc2V0IGl0IHRvIHRoZSBub3JtYWwgc2V0dGluZy4KKwkgKi8KKwlzZXRfZnMoVVNFUl9EUyk7CisjZW5kaWYKIAotCQkvKgotCQkgKiBDbGVhciBURiB3aGVuIGVudGVyaW5nIHRoZSBzaWduYWwgaGFuZGxlciwgYnV0Ci0JCSAqIG5vdGlmeSBhbnkgdHJhY2VyIHRoYXQgd2FzIHNpbmdsZS1zdGVwcGluZyBpdC4KLQkJICogVGhlIHRyYWNlciBtYXkgd2FudCB0byBzaW5nbGUtc3RlcCBpbnNpZGUgdGhlCi0JCSAqIGhhbmRsZXIgdG9vLgotCQkgKi8KLQkJcmVncy0+ZmxhZ3MgJj0gflg4Nl9FRkxBR1NfVEY7Ci0JCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKLQkJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisJLyoKKwkgKiBDbGVhciB0aGUgZGlyZWN0aW9uIGZsYWcgYXMgcGVyIHRoZSBBQkkgZm9yIGZ1bmN0aW9uIGVudHJ5LgorCSAqLworCXJlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX0RGOwogCi0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCi0JCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKLQkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl9CisJLyoKKwkgKiBDbGVhciBURiB3aGVuIGVudGVyaW5nIHRoZSBzaWduYWwgaGFuZGxlciwgYnV0CisJICogbm90aWZ5IGFueSB0cmFjZXIgdGhhdCB3YXMgc2luZ2xlLXN0ZXBwaW5nIGl0LgorCSAqIFRoZSB0cmFjZXIgbWF5IHdhbnQgdG8gc2luZ2xlLXN0ZXAgaW5zaWRlIHRoZQorCSAqIGhhbmRsZXIgdG9vLgorCSAqLworCXJlZ3MtPmZsYWdzICY9IH5YODZfRUZMQUdTX1RGOwogCi0JcmV0dXJuIHJldDsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZyk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJdHJhY2Vob29rX3NpZ25hbF9oYW5kbGVyKHNpZywgaW5mbywga2EsIHJlZ3MsCisJCQkJIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKKworCXJldHVybiAwOwogfQogCisjZGVmaW5lIE5SX3Jlc3RhcnRfc3lzY2FsbAlcCisJdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikgPyBfX05SX2lhMzJfcmVzdGFydF9zeXNjYWxsIDogX19OUl9yZXN0YXJ0X3N5c2NhbGwKIC8qCiAgKiBOb3RlIHRoYXQgJ2luaXQnIGlzIGEgc3BlY2lhbCBwcm9jZXNzOiBpdCBkb2Vzbid0IGdldCBzaWduYWxzIGl0IGRvZXNuJ3QKICAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQpAQCAtNDk2LDcgKzQyMiw4IEBACiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAlpZiAoc2lnbnIgPiAwKSB7Ci0JCS8qIFJlLWVuYWJsZSBhbnkgd2F0Y2hwb2ludHMgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlCisJCS8qCisJCSAqIFJlLWVuYWJsZSBhbnkgd2F0Y2hwb2ludHMgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlCiAJCSAqIHNpZ25hbCB0byB1c2VyIHNwYWNlLiBUaGUgcHJvY2Vzc29yIHJlZ2lzdGVyIHdpbGwKIAkJICogaGF2ZSBiZWVuIGNsZWFyZWQgaWYgdGhlIHdhdGNocG9pbnQgdHJpZ2dlcmVkCiAJCSAqIGluc2lkZSB0aGUga2VybmVsLgpAQCAtNTA0LDcgKzQzMSw3IEBACiAJCWlmIChjdXJyZW50LT50aHJlYWQuZGVidWdyZWc3KQogCQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZzcsIDcpOwogCi0JCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLworCQkvKiBXaGVlISBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKSA9PSAwKSB7CiAJCQkvKgogCQkJICogQSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZApAQCAtNTE4LDE5ICs0NDUsMTggQEAKIAl9CiAKIAkvKiBEaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCi0JaWYgKGN1cnJlbnRfc3lzY2FsbChyZWdzKSA+PSAwKSB7CisJaWYgKHN5c2NhbGxfZ2V0X25yKGN1cnJlbnQsIHJlZ3MpID49IDApIHsKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCi0JCXN3aXRjaCAoY3VycmVudF9zeXNjYWxsX3JldChyZWdzKSkgeworCQlzd2l0Y2ggKHN5c2NhbGxfZ2V0X2Vycm9yKGN1cnJlbnQsIHJlZ3MpKSB7CiAJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgogCQljYXNlIC1FUkVTVEFSVFNZUzoKIAkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CiAJCQlyZWdzLT5heCA9IHJlZ3MtPm9yaWdfYXg7CiAJCQlyZWdzLT5pcCAtPSAyOwogCQkJYnJlYWs7CisKIAkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgotCQkJcmVncy0+YXggPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/Ci0JCQkJCV9fTlJfaWEzMl9yZXN0YXJ0X3N5c2NhbGwgOgotCQkJCQlfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJCXJlZ3MtPmF4ID0gTlJfcmVzdGFydF9zeXNjYWxsOwogCQkJcmVncy0+aXAgLT0gMjsKIAkJCWJyZWFrOwogCQl9CkBAIC01NDYsMjkgKzQ3Miw0NSBAQAogCX0KIH0KIAotdm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICp1bnVzZWQsCi0JCSAgICAgIF9fdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQorLyoKKyAqIG5vdGlmaWNhdGlvbiBvZiB1c2Vyc3BhY2UgZXhlY3V0aW9uIHJlc3VtcHRpb24KKyAqIC0gdHJpZ2dlcmVkIGJ5IHRoZSBUSUZfV09SS19NQVNLIGZsYWdzCisgKi8KK3ZvaWQKK2RvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKnVudXNlZCwgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCiB7Ci0jaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0UpCiAJLyogbm90aWZ5IHVzZXJzcGFjZSBvZiBwZW5kaW5nIE1DRXMgKi8KIAlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX01DRV9OT1RJRlkpCiAJCW1jZV9ub3RpZnlfdXNlcigpOwotI2VuZGlmIC8qIENPTkZJR19YODZfTUNFICovCisjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAmJiBDT05GSUdfWDg2X01DRSAqLwogCiAJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCiAJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQogCQlkb19zaWduYWwocmVncyk7CisKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOworCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lSRVQpOworI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KIH0KIAogdm9pZCBzaWduYWxfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgX191c2VyICpmcmFtZSwgY2hhciAqd2hlcmUpCi17IAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OyAKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKKwogCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoIiVzWyVkXSBiYWQgZnJhbWUgaW4gJXMgZnJhbWU6JXAgaXA6JWx4IHNwOiVseCBvcmF4OiVseCIsCi0JICAgICAgIG1lLT5jb21tLG1lLT5waWQsd2hlcmUsZnJhbWUscmVncy0+aXAscmVncy0+c3AscmVncy0+b3JpZ19heCk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlc1slZF0gYmFkIGZyYW1lIGluICVzIGZyYW1lOiVwIGlwOiVseCBzcDolbHggb3JheDolbHgiLAorCQkgICAgICAgbWUtPmNvbW0sIG1lLT5waWQsIHdoZXJlLCBmcmFtZSwKKwkJICAgICAgIHJlZ3MtPmlwLCByZWdzLT5zcCwgcmVncy0+b3JpZ19heCk7CiAJCXByaW50X3ZtYV9hZGRyKCIgaW4gIiwgcmVncy0+aXApOwotCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJfQogCi0JZm9yY2Vfc2lnKFNJR1NFR1YsIG1lKTsgCi19IAorCWZvcmNlX3NpZyhTSUdTRUdWLCBtZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKaW5kZXggMzYxYjdhNC4uMThmOWIxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwpAQCAtMjE0LDEyICsyMTQsMTYgQEAKIHN0cnVjdCBzbXBfb3BzIHNtcF9vcHMgPSB7CiAJLnNtcF9wcmVwYXJlX2Jvb3RfY3B1ID0gbmF0aXZlX3NtcF9wcmVwYXJlX2Jvb3RfY3B1LAogCS5zbXBfcHJlcGFyZV9jcHVzID0gbmF0aXZlX3NtcF9wcmVwYXJlX2NwdXMsCi0JLmNwdV91cCA9IG5hdGl2ZV9jcHVfdXAsCiAJLnNtcF9jcHVzX2RvbmUgPSBuYXRpdmVfc21wX2NwdXNfZG9uZSwKIAogCS5zbXBfc2VuZF9zdG9wID0gbmF0aXZlX3NtcF9zZW5kX3N0b3AsCiAJLnNtcF9zZW5kX3Jlc2NoZWR1bGUgPSBuYXRpdmVfc21wX3NlbmRfcmVzY2hlZHVsZSwKIAorCS5jcHVfdXAgPSBuYXRpdmVfY3B1X3VwLAorCS5jcHVfZGllID0gbmF0aXZlX2NwdV9kaWUsCisJLmNwdV9kaXNhYmxlID0gbmF0aXZlX2NwdV9kaXNhYmxlLAorCS5wbGF5X2RlYWQgPSBuYXRpdmVfcGxheV9kZWFkLAorCiAJLnNlbmRfY2FsbF9mdW5jX2lwaSA9IG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGksCiAJLnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkgPSBuYXRpdmVfc2VuZF9jYWxsX2Z1bmNfc2luZ2xlX2lwaSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCA3OTg1YzViLi43ZWQ5ZTA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lkbGUuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3RyYW1wb2xpbmUuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CkBAIC04OCw3ICs4OSw3IEBACiAjZGVmaW5lIGdldF9pZGxlX2Zvcl9jcHUoeCkgICAgICAocGVyX2NwdShpZGxlX3RocmVhZF9hcnJheSwgeCkpCiAjZGVmaW5lIHNldF9pZGxlX2Zvcl9jcHUoeCwgcCkgICAocGVyX2NwdShpZGxlX3RocmVhZF9hcnJheSwgeCkgPSAocCkpCiAjZWxzZQotc3RydWN0IHRhc2tfc3RydWN0ICppZGxlX3RocmVhZF9hcnJheVtOUl9DUFVTXSBfX2NwdWluaXRkYXRhIDsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGVfdGhyZWFkX2FycmF5W05SX0NQVVNdIF9fY3B1aW5pdGRhdGEgOwogI2RlZmluZSBnZXRfaWRsZV9mb3JfY3B1KHgpICAgICAgKGlkbGVfdGhyZWFkX2FycmF5Wyh4KV0pCiAjZGVmaW5lIHNldF9pZGxlX2Zvcl9jcHUoeCwgcCkgICAoaWRsZV90aHJlYWRfYXJyYXlbKHgpXSA9IChwKSkKICNlbmRpZgpAQCAtMTIzLDEzICsxMjQsMTIgQEAKIAogc3RhdGljIGF0b21pY190IGluaXRfZGVhc3NlcnRlZDsKIAotc3RhdGljIGludCBib290X2NwdV9sb2dpY2FsX2FwaWNpZDsKIAogLyogcmVwcmVzZW50aW5nIGNwdXMgZm9yIHdoaWNoIHNpYmxpbmcgbWFwcyBjYW4gYmUgY29tcHV0ZWQgKi8KIHN0YXRpYyBjcHVtYXNrX3QgY3B1X3NpYmxpbmdfc2V0dXBfbWFwOwogCiAvKiBTZXQgaWYgd2UgZmluZCBhIEIgc3RlcHBpbmcgQ1BVICovCi1pbnQgX19jcHVpbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKK3N0YXRpYyBpbnQgX19jcHVpbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKIAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikKIApAQCAtMTY1LDYgKzE2NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfMzIKK3N0YXRpYyBpbnQgYm9vdF9jcHVfbG9naWNhbF9hcGljaWQ7CisKIHU4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPQogCQkJCQl7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwogCkBAIC0yMTAsNyArMjEyLDcgQEAKIAkvKgogCSAqIChUaGlzIHdvcmtzIGV2ZW4gaWYgdGhlIEFQSUMgaXMgbm90IGVuYWJsZWQuKQogCSAqLwotCXBoeXNfaWQgPSBHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSk7CisJcGh5c19pZCA9IHJlYWRfYXBpY19pZCgpOwogCWNwdWlkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWlmIChjcHVfaXNzZXQoY3B1aWQsIGNwdV9jYWxsaW5fbWFwKSkgewogCQlwYW5pYygiJXM6IHBoeXMgQ1BVIyVkLCBDUFUjJWQgYWxyZWFkeSBwcmVzZW50Pz9cbiIsIF9fZnVuY19fLApAQCAtMjU3LDYgKzI1OSw3IEBACiAJZW5kX2xvY2FsX0FQSUNfc2V0dXAoKTsKIAltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CiAKKwlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdWlkKTsKIAkvKgogCSAqIEdldCBvdXIgYm9nb21pcHMuCiAJICoKQEAgLTI3OSw2ICsyODIsOCBAQAogCWNwdV9zZXQoY3B1aWQsIGNwdV9jYWxsaW5fbWFwKTsKIH0KIAorc3RhdGljIGludCBfX2NwdWluaXRkYXRhIHVuc2FmZV9zbXA7CisKIC8qCiAgKiBBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCiAgKi8KQEAgLTMzMSwxNCArMzM2LDE3IEBACiAJICogZG9lcyBub3QgY2hhbmdlIHdoaWxlIHdlIGFyZSBhc3NpZ25pbmcgdmVjdG9ycyB0byBjcHVzLiAgSG9sZGluZwogCSAqIHRoaXMgbG9jayBlbnN1cmVzIHdlIGRvbid0IGhhbGYgYXNzaWduIG9yIHJlbW92ZSBhbiBpcnEgZnJvbSBhIGNwdS4KIAkgKi8KLQlpcGlfY2FsbF9sb2NrX2lycSgpOworCWlwaV9jYWxsX2xvY2soKTsKIAlsb2NrX3ZlY3Rvcl9sb2NrKCk7CiAJX19zZXR1cF92ZWN0b3JfaXJxKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAl1bmxvY2tfdmVjdG9yX2xvY2soKTsKLQlpcGlfY2FsbF91bmxvY2tfaXJxKCk7CisJaXBpX2NhbGxfdW5sb2NrKCk7CiAJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOwogCisJLyogZW5hYmxlIGxvY2FsIGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKIAlzZXR1cF9zZWNvbmRhcnlfY2xvY2soKTsKIAogCXdtYigpOwpAQCAtMzkxLDcgKzM5OSw3IEBACiAJCQkJZ290byB2YWxpZF9rNzsKIAogCQkvKiBJZiB3ZSBnZXQgaGVyZSwgbm90IGEgY2VydGlmaWVkIFNNUCBjYXBhYmxlIEFNRCBzeXN0ZW0uICovCi0JCWFkZF90YWludChUQUlOVF9VTlNBRkVfU01QKTsKKwkJdW5zYWZlX3NtcCA9IDE7CiAJfQogCiB2YWxpZF9rNzoKQEAgLTQwOCwxMiArNDE2LDEwIEBACiAJICogRG9uJ3QgdGFpbnQgaWYgd2UgYXJlIHJ1bm5pbmcgU01QIGtlcm5lbCBvbiBhIHNpbmdsZSBub24tTVAKIAkgKiBhcHByb3ZlZCBBdGhsb24KIAkgKi8KLQlpZiAodGFpbnRlZCAmIFRBSU5UX1VOU0FGRV9TTVApIHsKLQkJaWYgKG51bV9vbmxpbmVfY3B1cygpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiV0FSTklORzogVGhpcyBjb21iaW5hdGlvbiBvZiBBTUQiCi0JCQkJInByb2Nlc3NvcnMgaXMgbm90IHN1aXRhYmxlIGZvciBTTVAuXG4iKTsKLQkJZWxzZQotCQkJdGFpbnRlZCAmPSB+VEFJTlRfVU5TQUZFX1NNUDsKKwlpZiAodW5zYWZlX3NtcCAmJiBudW1fb25saW5lX2NwdXMoKSA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV0FSTklORzogVGhpcyBjb21iaW5hdGlvbiBvZiBBTUQiCisJCQkicHJvY2Vzc29ycyBpcyBub3Qgc3VpdGFibGUgZm9yIFNNUC5cbiIpOworCQlhZGRfdGFpbnQoVEFJTlRfVU5TQUZFX1NNUCk7CiAJfQogfQogCkBAIC01NTAsOCArNTU2LDcgQEAKIAkJCXByaW50ayhLRVJOX0NPTlQKIAkJCSAgICAgICAiYSBwcmV2aW91cyBBUElDIGRlbGl2ZXJ5IG1heSBoYXZlIGZhaWxlZFxuIik7CiAKLQkJYXBpY193cml0ZShBUElDX0lDUjIsIFNFVF9BUElDX0RFU1RfRklFTEQoYXBpY2lkKSk7Ci0JCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIEFQSUNfRE1fUkVNUkQgfCByZWdzW2ldKTsKKwkJYXBpY19pY3Jfd3JpdGUoQVBJQ19ETV9SRU1SRCB8IHJlZ3NbaV0sIGFwaWNpZCk7CiAKIAkJdGltZW91dCA9IDA7CiAJCWRvIHsKQEAgLTU4MywxMSArNTg4LDkgQEAKIAlpbnQgbWF4bHZ0OwogCiAJLyogVGFyZ2V0IGNoaXAgKi8KLQlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChsb2dpY2FsX2FwaWNpZCkpOwotCiAJLyogQm9vdCBvbiB0aGUgc3RhY2sgKi8KIAkvKiBLaWNrIHRoZSBzZWNvbmQgKi8KLQlhcGljX3dyaXRlKEFQSUNfSUNSLCBBUElDX0RNX05NSSB8IEFQSUNfREVTVF9MT0dJQ0FMKTsKKwlhcGljX2ljcl93cml0ZShBUElDX0RNX05NSSB8IEFQSUNfREVTVF9MT0dJQ0FMLCBsb2dpY2FsX2FwaWNpZCk7CiAKIAlwcl9kZWJ1ZygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOwogCXNlbmRfc3RhdHVzID0gc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUoKTsKQEAgLTU5NiwxMCArNTk5LDEyIEBACiAJICogR2l2ZSB0aGUgb3RoZXIgQ1BVIHNvbWUgdGltZSB0byBhY2NlcHQgdGhlIElQSS4KIAkgKi8KIAl1ZGVsYXkoMjAwKTsKLQltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7Ci0JaWYgKG1heGx2dCA+IDMpCQkJLyogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLiAgKi8KLQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7Ci0JYWNjZXB0X3N0YXR1cyA9IChhcGljX3JlYWQoQVBJQ19FU1IpICYgMHhFRik7CisJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkgeworCQltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CisJCWlmIChtYXhsdnQgPiAzKQkJCS8qIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4gICovCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYWNjZXB0X3N0YXR1cyA9IChhcGljX3JlYWQoQVBJQ19FU1IpICYgMHhFRik7CisJfQogCXByX2RlYnVnKCJOTUkgc2VudC5cbiIpOwogCiAJaWYgKHNlbmRfc3RhdHVzKQpAQCAtNjQwLDEzICs2NDUsMTEgQEAKIAkvKgogCSAqIFR1cm4gSU5JVCBvbiB0YXJnZXQgY2hpcAogCSAqLwotCWFwaWNfd3JpdGUoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKHBoeXNfYXBpY2lkKSk7Ci0KIAkvKgogCSAqIFNlbmQgSVBJCiAJICovCi0JYXBpY193cml0ZShBUElDX0lDUiwKLQkJICAgQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19JTlRfQVNTRVJUIHwgQVBJQ19ETV9JTklUKTsKKwlhcGljX2ljcl93cml0ZShBUElDX0lOVF9MRVZFTFRSSUcgfCBBUElDX0lOVF9BU1NFUlQgfCBBUElDX0RNX0lOSVQsCisJCSAgICAgICBwaHlzX2FwaWNpZCk7CiAKIAlwcl9kZWJ1ZygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOwogCXNlbmRfc3RhdHVzID0gc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUoKTsKQEAgLTY1NiwxMCArNjU5LDggQEAKIAlwcl9kZWJ1ZygiRGVhc3NlcnRpbmcgSU5JVC5cbiIpOwogCiAJLyogVGFyZ2V0IGNoaXAgKi8KLQlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOwotCiAJLyogU2VuZCBJUEkgKi8KLQlhcGljX3dyaXRlKEFQSUNfSUNSLCBBUElDX0lOVF9MRVZFTFRSSUcgfCBBUElDX0RNX0lOSVQpOworCWFwaWNfaWNyX3dyaXRlKEFQSUNfSU5UX0xFVkVMVFJJRyB8IEFQSUNfRE1fSU5JVCwgcGh5c19hcGljaWQpOwogCiAJcHJfZGVidWcoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKIAlzZW5kX3N0YXR1cyA9IHNhZmVfYXBpY193YWl0X2ljcl9pZGxlKCk7CkBAIC03MDIsMTEgKzcwMywxMCBAQAogCQkgKi8KIAogCQkvKiBUYXJnZXQgY2hpcCAqLwotCQlhcGljX3dyaXRlKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOwotCiAJCS8qIEJvb3Qgb24gdGhlIHN0YWNrICovCiAJCS8qIEtpY2sgdGhlIHNlY29uZCAqLwotCQlhcGljX3dyaXRlKEFQSUNfSUNSLCBBUElDX0RNX1NUQVJUVVAgfCAoc3RhcnRfZWlwID4+IDEyKSk7CisJCWFwaWNfaWNyX3dyaXRlKEFQSUNfRE1fU1RBUlRVUCB8IChzdGFydF9laXAgPj4gMTIpLAorCQkJICAgICAgIHBoeXNfYXBpY2lkKTsKIAogCQkvKgogCQkgKiBHaXZlIHRoZSBvdGhlciBDUFUgc29tZSB0aW1lIHRvIGFjY2VwdCB0aGUgSVBJLgpAQCAtMTE3NSwxMCArMTE3NSwxNyBAQAogCSAqIFNldHVwIGJvb3QgQ1BVIGluZm9ybWF0aW9uCiAJICovCiAJc21wX3N0b3JlX2NwdV9pbmZvKDApOyAvKiBGaW5hbCBmdWxsIHZlcnNpb24gb2YgdGhlIGRhdGEgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJYm9vdF9jcHVfbG9naWNhbF9hcGljaWQgPSBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1ID0gMDsgIC8qIG5lZWRlZD8gKi8KIAlzZXRfY3B1X3NpYmxpbmdfbWFwKDApOwogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCWVuYWJsZV9JUl94MmFwaWMoKTsKKwlzZXR1cF9hcGljX3JvdXRpbmcoKTsKKyNlbmRpZgorCiAJaWYgKHNtcF9zYW5pdHlfY2hlY2sobWF4X2NwdXMpIDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJTTVAgZGlzYWJsZWRcbiIpOwogCQlkaXNhYmxlX3NtcCgpOwpAQCAtMTE4Niw5ICsxMTkzLDkgQEAKIAl9CiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAoR0VUX0FQSUNfSUQocmVhZF9hcGljX2lkKCkpICE9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkgeworCWlmIChyZWFkX2FwaWNfaWQoKSAhPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQpIHsKIAkJcGFuaWMoIkJvb3QgQVBJQyBJRCBpbiBsb2NhbCBBUElDIHVuZXhwZWN0ZWQgKCVkIHZzICVkKSIsCi0JCSAgICAgR0VUX0FQSUNfSUQocmVhZF9hcGljX2lkKCkpLCBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQkgICAgIHJlYWRfYXBpY19pZCgpLCBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwogCQkvKiBPciBjYW4gd2Ugc3dpdGNoIGJhY2sgdG8gUElDIGhlcmU/ICovCiAJfQogCXByZWVtcHRfZW5hYmxlKCk7CkBAIC0xMjU0LDYgKzEyNjEsNDQgQEAKIAljaGVja19ubWlfd2F0Y2hkb2coKTsKIH0KIAorLyoKKyAqIGNwdV9wb3NzaWJsZV9tYXAgc2hvdWxkIGJlIHN0YXRpYywgaXQgY2Fubm90IGNoYW5nZSBhcyBjcHUncworICogYXJlIG9ubGluZWQsIG9yIG9mZmxpbmVkLiBUaGUgcmVhc29uIGlzIHBlci1jcHUgZGF0YS1zdHJ1Y3R1cmVzCisgKiBhcmUgYWxsb2NhdGVkIGJ5IHNvbWUgbW9kdWxlcyBhdCBpbml0IHRpbWUsIGFuZCBkb250IGV4cGVjdCB0bworICogZG8gdGhpcyBkeW5hbWljYWxseSBvbiBjcHUgYXJyaXZhbC9kZXBhcnR1cmUuCisgKiBjcHVfcHJlc2VudF9tYXAgb24gdGhlIG90aGVyIGhhbmQgY2FuIGNoYW5nZSBkeW5hbWljYWxseS4KKyAqIEluIGNhc2Ugd2hlbiBjcHVfaG90cGx1ZyBpcyBub3QgY29tcGlsZWQsIHRoZW4gd2UgcmVzb3J0IHRvIGN1cnJlbnQKKyAqIGJlaGF2aW91ciwgd2hpY2ggaXMgY3B1X3Bvc3NpYmxlID09IGNwdV9wcmVzZW50LgorICogLSBBc2hvayBSYWoKKyAqCisgKiBUaHJlZSB3YXlzIHRvIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBob3RwbHVnIENQVXM6CisgKiAtIElmIHRoZSBCSU9TIHNwZWNpZmllZCBkaXNhYmxlZCBDUFVzIGluIEFDUEkvbXB0YWJsZXMgdXNlIHRoYXQuCisgKiAtIFRoZSB1c2VyIGNhbiBvdmVyd3JpdGUgaXQgd2l0aCBhZGRpdGlvbmFsX2NwdXM9TlVNCisgKiAtIE90aGVyd2lzZSBkb24ndCByZXNlcnZlIGFkZGl0aW9uYWwgQ1BVcy4KKyAqIFdlIGRvIHRoaXMgYmVjYXVzZSBhZGRpdGlvbmFsIENQVXMgd2FzdGUgYSBsb3Qgb2YgbWVtb3J5LgorICogLUFLCisgKi8KK19faW5pdCB2b2lkIHByZWZpbGxfcG9zc2libGVfbWFwKHZvaWQpCit7CisJaW50IGksIHBvc3NpYmxlOworCisJLyogbm8gcHJvY2Vzc29yIGZyb20gbXB0YWJsZSBvciBtYWR0ICovCisJaWYgKCFudW1fcHJvY2Vzc29ycykKKwkJbnVtX3Byb2Nlc3NvcnMgPSAxOworCisJcG9zc2libGUgPSBudW1fcHJvY2Vzc29ycyArIGRpc2FibGVkX2NwdXM7CisJaWYgKHBvc3NpYmxlID4gTlJfQ1BVUykKKwkJcG9zc2libGUgPSBOUl9DUFVTOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU01QOiBBbGxvd2luZyAlZCBDUFVzLCAlZCBob3RwbHVnIENQVXNcbiIsCisJCXBvc3NpYmxlLCBtYXhfdChpbnQsIHBvc3NpYmxlIC0gbnVtX3Byb2Nlc3NvcnMsIDApKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3NzaWJsZTsgaSsrKQorCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworCisJbnJfY3B1X2lkcyA9IHBvc3NpYmxlOworfQorCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAKIHN0YXRpYyB2b2lkIHJlbW92ZV9zaWJsaW5naW5mbyhpbnQgY3B1KQpAQCAtMTI3OSw2MyArMTMyNCw2IEBACiAJY3B1X2NsZWFyKGNwdSwgY3B1X3NpYmxpbmdfc2V0dXBfbWFwKTsKIH0KIAotc3RhdGljIGludCBhZGRpdGlvbmFsX2NwdXMgX19pbml0ZGF0YSA9IC0xOwotCi1zdGF0aWMgX19pbml0IGludCBzZXR1cF9hZGRpdGlvbmFsX2NwdXMoY2hhciAqcykKLXsKLQlyZXR1cm4gcyAmJiBnZXRfb3B0aW9uKCZzLCAmYWRkaXRpb25hbF9jcHVzKSA/IDAgOiAtRUlOVkFMOwotfQotZWFybHlfcGFyYW0oImFkZGl0aW9uYWxfY3B1cyIsIHNldHVwX2FkZGl0aW9uYWxfY3B1cyk7Ci0KLS8qCi0gKiBjcHVfcG9zc2libGVfbWFwIHNob3VsZCBiZSBzdGF0aWMsIGl0IGNhbm5vdCBjaGFuZ2UgYXMgY3B1J3MKLSAqIGFyZSBvbmxpbmVkLCBvciBvZmZsaW5lZC4gVGhlIHJlYXNvbiBpcyBwZXItY3B1IGRhdGEtc3RydWN0dXJlcwotICogYXJlIGFsbG9jYXRlZCBieSBzb21lIG1vZHVsZXMgYXQgaW5pdCB0aW1lLCBhbmQgZG9udCBleHBlY3QgdG8KLSAqIGRvIHRoaXMgZHluYW1pY2FsbHkgb24gY3B1IGFycml2YWwvZGVwYXJ0dXJlLgotICogY3B1X3ByZXNlbnRfbWFwIG9uIHRoZSBvdGhlciBoYW5kIGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkuCi0gKiBJbiBjYXNlIHdoZW4gY3B1X2hvdHBsdWcgaXMgbm90IGNvbXBpbGVkLCB0aGVuIHdlIHJlc29ydCB0byBjdXJyZW50Ci0gKiBiZWhhdmlvdXIsIHdoaWNoIGlzIGNwdV9wb3NzaWJsZSA9PSBjcHVfcHJlc2VudC4KLSAqIC0gQXNob2sgUmFqCi0gKgotICogVGhyZWUgd2F5cyB0byBmaW5kIG91dCB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgaG90cGx1ZyBDUFVzOgotICogLSBJZiB0aGUgQklPUyBzcGVjaWZpZWQgZGlzYWJsZWQgQ1BVcyBpbiBBQ1BJL21wdGFibGVzIHVzZSB0aGF0LgotICogLSBUaGUgdXNlciBjYW4gb3ZlcndyaXRlIGl0IHdpdGggYWRkaXRpb25hbF9jcHVzPU5VTQotICogLSBPdGhlcndpc2UgZG9uJ3QgcmVzZXJ2ZSBhZGRpdGlvbmFsIENQVXMuCi0gKiBXZSBkbyB0aGlzIGJlY2F1c2UgYWRkaXRpb25hbCBDUFVzIHdhc3RlIGEgbG90IG9mIG1lbW9yeS4KLSAqIC1BSwotICovCi1fX2luaXQgdm9pZCBwcmVmaWxsX3Bvc3NpYmxlX21hcCh2b2lkKQotewotCWludCBpOwotCWludCBwb3NzaWJsZTsKLQotCS8qIG5vIHByb2Nlc3NvciBmcm9tIG1wdGFibGUgb3IgbWFkdCAqLwotCWlmICghbnVtX3Byb2Nlc3NvcnMpCi0JCW51bV9wcm9jZXNzb3JzID0gMTsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWlmIChhZGRpdGlvbmFsX2NwdXMgPT0gLTEpIHsKLQkJaWYgKGRpc2FibGVkX2NwdXMgPiAwKQotCQkJYWRkaXRpb25hbF9jcHVzID0gZGlzYWJsZWRfY3B1czsKLQkJZWxzZQotCQkJYWRkaXRpb25hbF9jcHVzID0gMDsKLQl9Ci0jZWxzZQotCWFkZGl0aW9uYWxfY3B1cyA9IDA7Ci0jZW5kaWYKLQlwb3NzaWJsZSA9IG51bV9wcm9jZXNzb3JzICsgYWRkaXRpb25hbF9jcHVzOwotCWlmIChwb3NzaWJsZSA+IE5SX0NQVVMpCi0JCXBvc3NpYmxlID0gTlJfQ1BVUzsKLQotCXByaW50ayhLRVJOX0lORk8gIlNNUDogQWxsb3dpbmcgJWQgQ1BVcywgJWQgaG90cGx1ZyBDUFVzXG4iLAotCQlwb3NzaWJsZSwgbWF4X3QoaW50LCBwb3NzaWJsZSAtIG51bV9wcm9jZXNzb3JzLCAwKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcG9zc2libGU7IGkrKykKLQkJY3B1X3NldChpLCBjcHVfcG9zc2libGVfbWFwKTsKLQotCW5yX2NwdV9pZHMgPSBwb3NzaWJsZTsKLX0KLQogc3RhdGljIHZvaWQgX19yZWYgcmVtb3ZlX2NwdV9mcm9tX21hcHMoaW50IGNwdSkKIHsKIAljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CkBAIC0xMzQ2LDcgKzEzMzQsMjkgQEAKIAludW1hX3JlbW92ZV9jcHUoY3B1KTsKIH0KIAotaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK3ZvaWQgY3B1X2Rpc2FibGVfY29tbW9uKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkvKgorCSAqIEhBQ0s6CisJICogQWxsb3cgYW55IHF1ZXVlZCB0aW1lciBpbnRlcnJ1cHRzIHRvIGdldCBzZXJ2aWNlZAorCSAqIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBzb2x1dGlvbiB1bnRpbCB3ZSBjbGVhbnVwCisJICogZml4dXBfaXJxcyBhcyB3ZSBkbyBmb3IgSUE2NC4KKwkgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbWRlbGF5KDEpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlyZW1vdmVfc2libGluZ2luZm8oY3B1KTsKKworCS8qIEl0J3Mgbm93IHNhZmUgdG8gcmVtb3ZlIHRoaXMgcHJvY2Vzc29yIGZyb20gdGhlIG9ubGluZSBtYXAgKi8KKwlsb2NrX3ZlY3Rvcl9sb2NrKCk7CisJcmVtb3ZlX2NwdV9mcm9tX21hcHMoY3B1KTsKKwl1bmxvY2tfdmVjdG9yX2xvY2soKTsKKwlmaXh1cF9pcnFzKGNwdV9vbmxpbmVfbWFwKTsKK30KKworaW50IG5hdGl2ZV9jcHVfZGlzYWJsZSh2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKQEAgLTEzNjUsMjcgKzEzNzUsMTEgQEAKIAkJc3RvcF9hcGljX25taV93YXRjaGRvZyhOVUxMKTsKIAljbGVhcl9sb2NhbF9BUElDKCk7CiAKLQkvKgotCSAqIEhBQ0s6Ci0JICogQWxsb3cgYW55IHF1ZXVlZCB0aW1lciBpbnRlcnJ1cHRzIHRvIGdldCBzZXJ2aWNlZAotCSAqIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBzb2x1dGlvbiB1bnRpbCB3ZSBjbGVhbnVwCi0JICogZml4dXBfaXJxcyBhcyB3ZSBkbyBmb3IgSUE2NC4KLQkgKi8KLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JbWRlbGF5KDEpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlyZW1vdmVfc2libGluZ2luZm8oY3B1KTsKLQotCS8qIEl0J3Mgbm93IHNhZmUgdG8gcmVtb3ZlIHRoaXMgcHJvY2Vzc29yIGZyb20gdGhlIG9ubGluZSBtYXAgKi8KLQlsb2NrX3ZlY3Rvcl9sb2NrKCk7Ci0JcmVtb3ZlX2NwdV9mcm9tX21hcHMoY3B1KTsKLQl1bmxvY2tfdmVjdG9yX2xvY2soKTsKLQlmaXh1cF9pcnFzKGNwdV9vbmxpbmVfbWFwKTsKKwljcHVfZGlzYWJsZV9jb21tb24oKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgbmF0aXZlX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKiBXZSBkb24ndCBkbyBhbnl0aGluZyBoZXJlOiBpZGxlIHRhc2sgaXMgZmFraW5nIGRlYXRoIGl0c2VsZi4gKi8KIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTE0MDIsMTUgKzEzOTYsNDUgQEAKIAl9CiAJcHJpbnRrKEtFUk5fRVJSICJDUFUgJXUgZGlkbid0IGRpZS4uLlxuIiwgY3B1KTsKIH0KKwordm9pZCBwbGF5X2RlYWRfY29tbW9uKHZvaWQpCit7CisJaWRsZV90YXNrX2V4aXQoKTsKKwlyZXNldF9sYXp5X3RsYnN0YXRlKCk7CisJaXJxX2N0eF9leGl0KHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCWMxZV9yZW1vdmVfY3B1KHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCisJbWIoKTsKKwkvKiBBY2sgaXQgKi8KKwlfX2dldF9jcHVfdmFyKGNwdV9zdGF0ZSkgPSBDUFVfREVBRDsKKworCS8qCisJICogV2l0aCBwaHlzaWNhbCBDUFUgaG90cGx1Zywgd2Ugc2hvdWxkIGhhbHQgdGhlIGNwdQorCSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisKK3ZvaWQgbmF0aXZlX3BsYXlfZGVhZCh2b2lkKQoreworCXBsYXlfZGVhZF9jb21tb24oKTsKKwl3YmludmRfaGFsdCgpOworfQorCiAjZWxzZSAvKiAuLi4gIUNPTkZJR19IT1RQTFVHX0NQVSAqLwotaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK2ludCBuYXRpdmVfY3B1X2Rpc2FibGUodm9pZCkKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgbmF0aXZlX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKiBXZSBzYWlkICJubyIgaW4gX19jcHVfZGlzYWJsZSAqLwogCUJVRygpOwogfQorCit2b2lkIG5hdGl2ZV9wbGF5X2RlYWQodm9pZCkKK3sKKwlCVUcoKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3VtbWl0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc3VtbWl0XzMyLmMKaW5kZXggZDY3Y2U1Zi4uN2I5ODc4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N1bW1pdF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zdW1taXRfMzIuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oPgorI2luY2x1ZGUgPGFzbS9zdW1taXQvbXBwYXJzZS5oPgogCiBzdGF0aWMgc3RydWN0IHJpb190YWJsZV9oZHIgKnJpb190YWJsZV9oZHIgX19pbml0ZGF0YTsKIHN0YXRpYyBzdHJ1Y3Qgc2NhbF9kZXRhaWwgICAqc2NhbF9kZXZzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jIGIvYXJjaC94ODYva2VybmVsL3N5c19pMzg2XzMyLmMKaW5kZXggNzA2NmNiOC4uMTg4NGE4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c19pMzg2XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3N5c19pMzg2XzMyLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KKwogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jIGIvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYwppbmRleCAzYjM2MGVmLi42YmMyMTFhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKQEAgLTEzLDE1ICsxMywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lhMzIuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIG9mZikKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgb2ZmKQogewogCWxvbmcgZXJyb3I7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBmaWxlICpmaWxlOwogCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChvZmYgJiB+UEFHRV9NQVNLKQpAQCAtNTYsOSArNTgsOSBAQAogCQkgICB1bm1hcHBlZCBiYXNlIGRvd24gZm9yIHRoaXMgY2FzZS4gVGhpcyBjYW4gZ2l2ZQogCQkgICBjb25mbGljdHMgd2l0aCB0aGUgaGVhcCwgYnV0IHdlIGFzc3VtZSB0aGF0IGdsaWJjCiAJCSAgIG1hbGxvYyBrbm93cyBob3cgdG8gZmFsbCBiYWNrIHRvIG1tYXAuIEdpdmUgaXQgMUdCCi0JCSAgIG9mIHBsYXlncm91bmQgZm9yIG5vdy4gLUFLICovIAotCQkqYmVnaW4gPSAweDQwMDAwMDAwOyAKLQkJKmVuZCA9IDB4ODAwMDAwMDA7CQkKKwkJICAgb2YgcGxheWdyb3VuZCBmb3Igbm93LiAtQUsgKi8KKwkJKmJlZ2luID0gMHg0MDAwMDAwMDsKKwkJKmVuZCA9IDB4ODAwMDAwMDA7CiAJCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgewogCQkJbmV3X2JlZ2luID0gcmFuZG9taXplX3JhbmdlKCpiZWdpbiwgKmJlZ2luICsgMHgwMjAwMDAwMCwgMCk7CiAJCQlpZiAobmV3X2JlZ2luKQpAQCAtNjYsOSArNjgsOSBAQAogCQl9CiAJfSBlbHNlIHsKIAkJKmJlZ2luID0gVEFTS19VTk1BUFBFRF9CQVNFOwotCQkqZW5kID0gVEFTS19TSVpFOyAKKwkJKmVuZCA9IFRBU0tfU0laRTsKIAl9Ci19IAorfQogCiB1bnNpZ25lZCBsb25nCiBhcmNoX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC03OCwxMSArODAsMTEgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CiAJdW5zaWduZWQgbG9uZyBiZWdpbiwgZW5kOwotCQorCiAJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKQogCQlyZXR1cm4gYWRkcjsKIAotCWZpbmRfc3RhcnRfZW5kKGZsYWdzLCAmYmVnaW4sICZlbmQpOyAKKwlmaW5kX3N0YXJ0X2VuZChmbGFncywgJmJlZ2luLCAmZW5kKTsKIAogCWlmIChsZW4gPiBlbmQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTYsMTIgKzk4LDEyIEBACiAJfQogCWlmICgoKGZsYWdzICYgTUFQXzMyQklUKSB8fCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSkKIAkgICAgJiYgbGVuIDw9IG1tLT5jYWNoZWRfaG9sZV9zaXplKSB7Ci0JICAgICAgICBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IDA7CisJCW1tLT5jYWNoZWRfaG9sZV9zaXplID0gMDsKIAkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGJlZ2luOwogCX0KIAlhZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKLQlpZiAoYWRkciA8IGJlZ2luKSAKLQkJYWRkciA9IGJlZ2luOyAKKwlpZiAoYWRkciA8IGJlZ2luKQorCQlhZGRyID0gYmVnaW47CiAJc3RhcnRfYWRkciA9IGFkZHI7CiAKIGZ1bGxfc2VhcmNoOgpAQCAtMTI3LDcgKzEyOSw3IEBACiAJCQlyZXR1cm4gYWRkcjsKIAkJfQogCQlpZiAoYWRkciArIG1tLT5jYWNoZWRfaG9sZV9zaXplIDwgdm1hLT52bV9zdGFydCkKLQkJICAgICAgICBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IHZtYS0+dm1fc3RhcnQgLSBhZGRyOworCQkJbW0tPmNhY2hlZF9ob2xlX3NpemUgPSB2bWEtPnZtX3N0YXJ0IC0gYWRkcjsKIAogCQlhZGRyID0gdm1hLT52bV9lbmQ7CiAJfQpAQCAtMTc3LDcgKzE3OSw3IEBACiAJCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyLWxlbik7CiAJCWlmICghdm1hIHx8IGFkZHIgPD0gdm1hLT52bV9zdGFydCkKIAkJCS8qIHJlbWVtYmVyIHRoZSBhZGRyZXNzIGFzIGEgaGludCBmb3IgbmV4dCB0aW1lICovCi0JCQlyZXR1cm4gKG1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyLWxlbik7CisJCQlyZXR1cm4gbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGFkZHItbGVuOwogCX0KIAogCWlmIChtbS0+bW1hcF9iYXNlIDwgbGVuKQpAQCAtMTk0LDcgKzE5Niw3IEBACiAJCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsKIAkJaWYgKCF2bWEgfHwgYWRkcitsZW4gPD0gdm1hLT52bV9zdGFydCkKIAkJCS8qIHJlbWVtYmVyIHRoZSBhZGRyZXNzIGFzIGEgaGludCBmb3IgbmV4dCB0aW1lICovCi0JCQlyZXR1cm4gKG1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyKTsKKwkJCXJldHVybiBtbS0+ZnJlZV9hcmVhX2NhY2hlID0gYWRkcjsKIAogCQkvKiByZW1lbWJlciB0aGUgbGFyZ2VzdCBob2xlIHdlIHNhdyBzbyBmYXIgKi8KIAkJaWYgKGFkZHIgKyBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSA8IHZtYS0+dm1fc3RhcnQpCkBAIC0yMjQsMTMgKzIyNiwxMyBAQAogfQogCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdW5hbWUoc3RydWN0IG5ld191dHNuYW1lIF9fdXNlciAqIG5hbWUpCithc21saW5rYWdlIGxvbmcgc3lzX3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKm5hbWUpCiB7CiAJaW50IGVycjsKIAlkb3duX3JlYWQoJnV0c19zZW0pOwotCWVyciA9IGNvcHlfdG9fdXNlcihuYW1lLCB1dHNuYW1lKCksIHNpemVvZiAoKm5hbWUpKTsKKwllcnIgPSBjb3B5X3RvX3VzZXIobmFtZSwgdXRzbmFtZSgpLCBzaXplb2YoKm5hbWUpKTsKIAl1cF9yZWFkKCZ1dHNfc2VtKTsKLQlpZiAocGVyc29uYWxpdHkoY3VycmVudC0+cGVyc29uYWxpdHkpID09IFBFUl9MSU5VWDMyKSAKLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigmbmFtZS0+bWFjaGluZSwgImk2ODYiLCA1KTsgCQkKKwlpZiAocGVyc29uYWxpdHkoY3VycmVudC0+cGVyc29uYWxpdHkpID09IFBFUl9MSU5VWDMyKQorCQllcnIgfD0gY29weV90b191c2VyKCZuYW1lLT5tYWNoaW5lLCAiaTY4NiIsIDUpOwogCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF82NC5jCmluZGV4IDE3MGQ0M2MuLjNkMWJlNGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfNjQuYwpAQCAtOCwxMiArOCwxMiBAQAogI2RlZmluZSBfX05PX1NUVUJTCiAKICNkZWZpbmUgX19TWVNDQUxMKG5yLCBzeW0pIGV4dGVybiBhc21saW5rYWdlIHZvaWQgc3ltKHZvaWQpIDsKLSN1bmRlZiBfQVNNX1g4Nl82NF9VTklTVERfSF8KKyN1bmRlZiBBU01fWDg2X19VTklTVERfNjRfSAogI2luY2x1ZGUgPGFzbS91bmlzdGRfNjQuaD4KIAogI3VuZGVmIF9fU1lTQ0FMTAogI2RlZmluZSBfX1NZU0NBTEwobnIsIHN5bSkgW25yXSA9IHN5bSwKLSN1bmRlZiBfQVNNX1g4Nl82NF9VTklTVERfSF8KKyN1bmRlZiBBU01fWDg2X19VTklTVERfNjRfSAogCiB0eXBlZGVmIHZvaWQgKCpzeXNfY2FsbF9wdHJfdCkodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZV8zMi5jCmluZGV4IGZmZTNjNjYuLjc3YjQwMGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWVfMzIuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgogCiAjaW5jbHVkZSAiZG9fdGltZXIuaCIKIApAQCAtNDYsMTAgKzQ3LDkgQEAKIAl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKIAogI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoIXY4MDg2X21vZGUocmVncykgJiYgU0VHTUVOVF9JU19LRVJORUxfQ09ERShyZWdzLT5jcykgJiYKLQkgICAgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CisJaWYgKCF1c2VyX21vZGVfdm0ocmVncykgJiYgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CiAjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQkJcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShyZWdzLT5icCArIDQpOworCQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopKHJlZ3MtPmJwICsgc2l6ZW9mKGxvbmcpKTsKICNlbHNlCiAJCXVuc2lnbmVkIGxvbmcgKnNwID0gKHVuc2lnbmVkIGxvbmcgKikmcmVncy0+c3A7CiAKQEAgLTk0LDYgKzk0LDcgQEAKIAogCWRvX3RpbWVyX2ludGVycnVwdF9ob29rKCk7CiAKKyNpZmRlZiBDT05GSUdfTUNBCiAJaWYgKE1DQV9idXMpIHsKIAkJLyogVGhlIFBTLzIgdXNlcyBsZXZlbC10cmlnZ2VyZWQgaW50ZXJydXB0cy4gIFlvdSBjYW4ndAogCQl0dXJuIHRoZW0gb2ZmLCBub3Igd291bGQgeW91IHdhbnQgdG8gKGFueSBhdHRlbXB0IHRvCkBAIC0xMDcsNiArMTA4LDcgQEAKIAkJdTggaXJxX3YgPSBpbmJfcCggMHg2MSApOwkvKiByZWFkIHRoZSBjdXJyZW50IHN0YXRlICovCiAJCW91dGJfcCggaXJxX3Z8MHg4MCwgMHg2MSApOwkvKiByZXNldCB0aGUgSVJRICovCiAJfQorI2VuZGlmCiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGltZV82NC5jIGIvYXJjaC94ODYva2VybmVsL3RpbWVfNjQuYwppbmRleCBlM2Q0OWM1Li5jYjE5ZDY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90aW1lXzY0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CiAKICNpbmNsdWRlIDxhc20vaTgyNTMuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgpAQCAtMzMsMjMgKzM0LDM0IEBACiAJLyogQXNzdW1lIHRoZSBsb2NrIGZ1bmN0aW9uIGhhcyBlaXRoZXIgbm8gc3RhY2sgZnJhbWUgb3IgYSBjb3B5CiAJICAgb2YgZmxhZ3MgZnJvbSBQVVNIRgogCSAgIEVmbGFncyBhbHdheXMgaGFzIGJpdHMgMjIgYW5kIHVwIGNsZWFyZWQgdW5saWtlIGtlcm5lbCBhZGRyZXNzZXMuICovCi0JaWYgKCF1c2VyX21vZGUocmVncykgJiYgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CisJaWYgKCF1c2VyX21vZGVfdm0ocmVncykgJiYgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwkJcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShyZWdzLT5icCArIHNpemVvZihsb25nKSk7CisjZWxzZQogCQl1bnNpZ25lZCBsb25nICpzcCA9ICh1bnNpZ25lZCBsb25nICopcmVncy0+c3A7CiAJCWlmIChzcFswXSA+PiAyMikKIAkJCXJldHVybiBzcFswXTsKIAkJaWYgKHNwWzFdID4+IDIyKQogCQkJcmV0dXJuIHNwWzFdOworI2VuZGlmCiAJfQogCXJldHVybiBwYzsKIH0KIEVYUE9SVF9TWU1CT0wocHJvZmlsZV9wYyk7CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9ldmVudF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoraXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlhZGRfcGRhKGlycTBfaXJxcywgMSk7CiAKIAlnbG9iYWxfY2xvY2tfZXZlbnQtPmV2ZW50X2hhbmRsZXIoZ2xvYmFsX2Nsb2NrX2V2ZW50KTsKIAorI2lmZGVmIENPTkZJR19NQ0EKKwlpZiAoTUNBX2J1cykgeworCQl1OCBpcnFfdiA9IGluYl9wKDB4NjEpOyAgICAgICAvKiByZWFkIHRoZSBjdXJyZW50IHN0YXRlICovCisJCW91dGJfcChpcnFfdnwweDgwLCAweDYxKTsgICAgIC8qIHJlc2V0IHRoZSBJUlEgKi8KKwl9CisjZW5kaWYKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTAwLDcgKzExMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgPSB7Ci0JLmhhbmRsZXIJPSB0aW1lcl9ldmVudF9pbnRlcnJ1cHQsCisJLmhhbmRsZXIJPSB0aW1lcl9pbnRlcnJ1cHQsCiAJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX0lSUVBPTEwgfCBJUlFGX05PQkFMQU5DSU5HLAogCS5tYXNrCQk9IENQVV9NQVNLX05PTkUsCiAJLm5hbWUJCT0gInRpbWVyIgpAQCAtMTExLDE2ICsxMjMsMTMgQEAKIAlpZiAoIWhwZXRfZW5hYmxlKCkpCiAJCXNldHVwX3BpdF90aW1lcigpOwogCisJaXJxMC5tYXNrID0gY3B1bWFza19vZl9jcHUoMCk7CiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKIH0KIAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7CiAJdHNjX2luaXQoKTsKLQlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfUkRUU0NQKSkKLQkJdmdldGNwdV9tb2RlID0gVkdFVENQVV9SRFRTQ1A7Ci0JZWxzZQotCQl2Z2V0Y3B1X21vZGUgPSBWR0VUQ1BVX0xTTDsKIAogCWxhdGVfdGltZV9pbml0ID0gY2hvb3NlX3RpbWVfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RsYl8zMi5jIGIvYXJjaC94ODYva2VybmVsL3RsYl8zMi5jCmluZGV4IGZlYzFlY2UuLmUwMDUzNGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90bGJfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdGxiXzMyLmMKQEAgLTI0MSwzICsyNDEsMTEgQEAKIAlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCBOVUxMLCAxKTsKIH0KIAordm9pZCByZXNldF9sYXp5X3RsYnN0YXRlKHZvaWQpCit7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9IDA7CisJcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tID0gJmluaXRfbW07Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90bHMuYyBiL2FyY2gveDg2L2tlcm5lbC90bHMuYwppbmRleCBhYjZiZjM3Li42YmI3Yjg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGxzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Rscy5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL2xkdC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogI2luY2x1ZGUgInRscy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjI5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMCwwICsxLDEwMzQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBBbmRpIEtsZWVuLCBTdVNFIExhYnMKKyAqCisgKiAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworLyoKKyAqIEhhbmRsZSBoYXJkd2FyZSB0cmFwcyBhbmQgZmF1bHRzLgorICovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaWZkZWYgQ09ORklHX0VJU0EKKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRURBQykKKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKworI2luY2x1ZGUgPG1hY2hfdHJhcHMuaD4KKworI2lmZGVmIENPTkZJR19YODZfNjQKKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wcm90by5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworI2luY2x1ZGUgImNwdS9tY2hlY2svbWNlLmgiCisKK0RFQ0xBUkVfQklUTUFQKHVzZWRfdmVjdG9ycywgTlJfVkVDVE9SUyk7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2VkX3ZlY3RvcnMpOworCithc21saW5rYWdlIGludCBzeXN0ZW1fY2FsbCh2b2lkKTsKKworLyogRG8gd2UgaWdub3JlIEZQVSBpbnRlcnJ1cHRzID8gKi8KK2NoYXIgaWdub3JlX2ZwdV9pcnE7CisKKy8qCisgKiBUaGUgSURUIGhhcyB0byBiZSBwYWdlLWFsaWduZWQgdG8gc2ltcGxpZnkgdGhlIFBlbnRpdW0KKyAqIEYwIDBGIGJ1ZyB3b3JrYXJvdW5kLi4gV2UgaGF2ZSBhIHNwZWNpYWwgbGluayBzZWdtZW50CisgKiBmb3IgdGhpcy4KKyAqLworZ2F0ZV9kZXNjIGlkdF90YWJsZVsyNTZdCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmlkdCIpKSkgPSB7IHsgeyB7IDAsIDAgfSB9IH0sIH07CisjZW5kaWYKKworc3RhdGljIGludCBpZ25vcmVfbm1pczsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmRpdGlvbmFsX3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVncy0+ZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVlbXB0X2NvbmRpdGlvbmFsX3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByZWVtcHRfY29uZGl0aW9uYWxfY2xpKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZGVjX3ByZWVtcHRfY291bnQoKTsKK30KKworI2lmZGVmIENPTkZJR19YODZfMzIKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlpZiAoIXVzZXJfbW9kZV92bShyZWdzKSkKKwkJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIGxhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBJZiB0aGUgVFNTIGhhcyBhbgorICogaW52YWxpZCBvZmZzZXQgc2V0ICh0aGUgTEFaWSBvbmUpIGFuZCB0aGUgZmF1bHRpbmcgdGhyZWFkIGhhcworICogYSB2YWxpZCBJL08gYml0bWFwIHBvaW50ZXIsIHdlIGNvcHkgdGhlIEkvTyBiaXRtYXAgaW4gdGhlIFRTUywKKyAqIHdlIHNldCB0aGUgb2Zmc2V0IGZpZWxkIGNvcnJlY3RseSBhbmQgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgbGF6eV9pb2JpdG1hcF9jb3B5KHZvaWQpCit7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZDsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzOworCWludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKKworCWlmICh0c3MtPng4Nl90c3MuaW9fYml0bWFwX2Jhc2UgPT0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUX0xBWlkgJiYKKwkgICAgdGhyZWFkLT5pb19iaXRtYXBfcHRyKSB7CisJCW1lbWNweSh0c3MtPmlvX2JpdG1hcCwgdGhyZWFkLT5pb19iaXRtYXBfcHRyLAorCQkgICAgICAgdGhyZWFkLT5pb19iaXRtYXBfbWF4KTsKKwkJLyoKKwkJICogSWYgdGhlIHByZXZpb3VzbHkgc2V0IG1hcCB3YXMgZXh0ZW5kaW5nIHRvIGhpZ2hlciBwb3J0cworCQkgKiB0aGFuIHRoZSBjdXJyZW50IG9uZSwgcGFkIGV4dHJhIHNwYWNlIHdpdGggMHhmZiAobm8gYWNjZXNzKS4KKwkJICovCisJCWlmICh0aHJlYWQtPmlvX2JpdG1hcF9tYXggPCB0c3MtPmlvX2JpdG1hcF9tYXgpIHsKKwkJCW1lbXNldCgoY2hhciAqKSB0c3MtPmlvX2JpdG1hcCArCisJCQkJdGhyZWFkLT5pb19iaXRtYXBfbWF4LCAweGZmLAorCQkJCXRzcy0+aW9fYml0bWFwX21heCAtIHRocmVhZC0+aW9fYml0bWFwX21heCk7CisJCX0KKwkJdHNzLT5pb19iaXRtYXBfbWF4ID0gdGhyZWFkLT5pb19iaXRtYXBfbWF4OworCQl0c3MtPng4Nl90c3MuaW9fYml0bWFwX2Jhc2UgPSBJT19CSVRNQVBfT0ZGU0VUOworCQl0c3MtPmlvX2JpdG1hcF9vd25lciA9IHRocmVhZDsKKwkJcHV0X2NwdSgpOworCisJCXJldHVybiAxOworCX0KKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMKK2RvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCWxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAocmVncy0+ZmxhZ3MgJiBYODZfVk1fTUFTSykgeworCQkvKgorCQkgKiB0cmFwcyAwLCAxLCAzLCA0LCBhbmQgNSBzaG91bGQgYmUgZm9yd2FyZGVkIHRvIHZtODYuCisJCSAqIE9uIG5taSAoaW50ZXJydXB0IDIpLCBkb190cmFwIHNob3VsZCBub3QgYmUgY2FsbGVkLgorCQkgKi8KKwkJaWYgKHRyYXBuciA8IDYpCisJCQlnb3RvIHZtODZfdHJhcDsKKwkJZ290byB0cmFwX3NpZ25hbDsKKwl9CisjZW5kaWYKKworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlnb3RvIGtlcm5lbF90cmFwOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgordHJhcF9zaWduYWw6CisjZW5kaWYKKwkvKgorCSAqIFdlIHdhbnQgZXJyb3JfY29kZSBhbmQgdHJhcF9ubyBzZXQgZm9yIHVzZXJzcGFjZSBmYXVsdHMgYW5kCisJICoga2VybmVsc3BhY2UgZmF1bHRzIHdoaWNoIHJlc3VsdCBpbiBkaWUoKSwgYnV0IG5vdAorCSAqIGtlcm5lbHNwYWNlIGZhdWx0cyB3aGljaCBhcmUgZml4ZWQgdXAuICBkaWUoKSBnaXZlcyB0aGUKKwkgKiBwcm9jZXNzIG5vIGNoYW5jZSB0byBoYW5kbGUgdGhlIHNpZ25hbCBhbmQgbm90aWNlIHRoZQorCSAqIGtlcm5lbCBmYXVsdCBpbmZvcm1hdGlvbiwgc28gdGhhdCB3b24ndCByZXN1bHQgaW4gcG9sbHV0aW5nCisJICogdGhlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzbHkgcXVldWVkLCBidXQgbm90IHlldAorCSAqIGRlbGl2ZXJlZCwgZmF1bHRzLiAgU2VlIGFsc28gZG9fZ2VuZXJhbF9wcm90ZWN0aW9uIGJlbG93LgorCSAqLworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgdW5oYW5kbGVkX3NpZ25hbCh0c2ssIHNpZ25yKSAmJgorCSAgICBwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzWyVkXSB0cmFwICVzIGlwOiVseCBzcDolbHggZXJyb3I6JWx4IiwKKwkJICAgICAgIHRzay0+Y29tbSwgdHNrLT5waWQsIHN0ciwKKwkJICAgICAgIHJlZ3MtPmlwLCByZWdzLT5zcCwgZXJyb3JfY29kZSk7CisJCXByaW50X3ZtYV9hZGRyKCIgaW4gIiwgcmVncy0+aXApOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoaW5mbykKKwkJZm9yY2Vfc2lnX2luZm8oc2lnbnIsIGluZm8sIHRzayk7CisJZWxzZQorCQlmb3JjZV9zaWcoc2lnbnIsIHRzayk7CisJcmV0dXJuOworCitrZXJuZWxfdHJhcDoKKwlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkgeworCQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKwkJdHNrLT50aHJlYWQudHJhcF9ubyA9IHRyYXBucjsKKwkJZGllKHN0ciwgcmVncywgZXJyb3JfY29kZSk7CisJfQorCXJldHVybjsKKworI2lmZGVmIENPTkZJR19YODZfMzIKK3ZtODZfdHJhcDoKKwlpZiAoaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywKKwkJCQkJCWVycm9yX2NvZGUsIHRyYXBucikpCisJCWdvdG8gdHJhcF9zaWduYWw7CisJcmV0dXJuOworI2VuZGlmCit9CisKKyNkZWZpbmUgRE9fRVJST1IodHJhcG5yLCBzaWduciwgc3RyLCBuYW1lKQkJCQlcCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCVwKK3sJCQkJCQkJCQlcCisJaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgdHJhcG5yLCBzaWducikJXAorCQkJCQkJCT09IE5PVElGWV9TVE9QKQlcCisJCXJldHVybjsJCQkJCQkJXAorCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsJCQkJCQlcCisJZG9fdHJhcCh0cmFwbnIsIHNpZ25yLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIE5VTEwpOwkJXAorfQorCisjZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikJCVwKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkJXAorewkJCQkJCQkJCVwKKwlzaWdpbmZvX3QgaW5mbzsJCQkJCQkJXAorCWluZm8uc2lfc2lnbm8gPSBzaWducjsJCQkJCQlcCisJaW5mby5zaV9lcnJubyA9IDA7CQkJCQkJXAorCWluZm8uc2lfY29kZSA9IHNpY29kZTsJCQkJCQlcCisJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopc2lhZGRyOwkJCQlcCisJaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgdHJhcG5yLCBzaWducikJXAorCQkJCQkJCT09IE5PVElGWV9TVE9QKQlcCisJCXJldHVybjsJCQkJCQkJXAorCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsJCQkJCQlcCisJZG9fdHJhcCh0cmFwbnIsIHNpZ25yLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsICZpbmZvKTsJCVwKK30KKworRE9fRVJST1JfSU5GTygwLCBTSUdGUEUsICJkaXZpZGUgZXJyb3IiLCBkaXZpZGVfZXJyb3IsIEZQRV9JTlRESVYsIHJlZ3MtPmlwKQorRE9fRVJST1IoNCwgU0lHU0VHViwgIm92ZXJmbG93Iiwgb3ZlcmZsb3cpCitET19FUlJPUig1LCBTSUdTRUdWLCAiYm91bmRzIiwgYm91bmRzKQorRE9fRVJST1JfSU5GTyg2LCBTSUdJTEwsICJpbnZhbGlkIG9wY29kZSIsIGludmFsaWRfb3AsIElMTF9JTExPUE4sIHJlZ3MtPmlwKQorRE9fRVJST1IoOSwgU0lHRlBFLCAiY29wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuIiwgY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKQorRE9fRVJST1IoMTAsIFNJR1NFR1YsICJpbnZhbGlkIFRTUyIsIGludmFsaWRfVFNTKQorRE9fRVJST1IoMTEsIFNJR0JVUywgInNlZ21lbnQgbm90IHByZXNlbnQiLCBzZWdtZW50X25vdF9wcmVzZW50KQorI2lmZGVmIENPTkZJR19YODZfMzIKK0RPX0VSUk9SKDEyLCBTSUdCVVMsICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKKyNlbmRpZgorRE9fRVJST1JfSU5GTygxNywgU0lHQlVTLCAiYWxpZ25tZW50IGNoZWNrIiwgYWxpZ25tZW50X2NoZWNrLCBCVVNfQURSQUxOLCAwKQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyogUnVucyBvbiBJU1Qgc3RhY2sgKi8KK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19zdGFja19zZWdtZW50KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsICJzdGFjayBzZWdtZW50IiwgcmVncywgZXJyb3JfY29kZSwKKwkJCTEyLCBTSUdCVVMpID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJcHJlZW1wdF9jb25kaXRpb25hbF9zdGkocmVncyk7CisJZG9fdHJhcCgxMiwgU0lHQlVTLCAic3RhY2sgc2VnbWVudCIsIHJlZ3MsIGVycm9yX2NvZGUsIE5VTEwpOworCXByZWVtcHRfY29uZGl0aW9uYWxfY2xpKHJlZ3MpOworfQorCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9fZG91YmxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3RyW10gPSAiZG91YmxlIGZhdWx0IjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwkvKiBSZXR1cm4gbm90IGNoZWNrZWQgYmVjYXVzZSBkb3VibGUgY2hlY2sgY2Fubm90IGJlIGlnbm9yZWQgKi8KKwlub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIDgsIFNJR1NFR1YpOworCisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDg7CisKKwkvKiBUaGlzIGlzIGFsd2F5cyBhIGtlcm5lbCB0cmFwIGFuZCBuZXZlciBmaXhhYmxlIChhbmQgdGh1cyBtdXN0CisJICAgbmV2ZXIgcmV0dXJuKS4gKi8KKwlmb3IgKDs7KQorCQlkaWUoc3RyLCByZWdzLCBlcnJvcl9jb2RlKTsKK30KKyNlbmRpZgorCitkb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzCitkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAobGF6eV9pb2JpdG1hcF9jb3B5KCkpIHsKKwkJLyogcmVzdGFydCB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKQorCQlnb3RvIGdwX2luX3ZtODY7CisjZW5kaWYKKworCXRzayA9IGN1cnJlbnQ7CisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCWdvdG8gZ3BfaW5fa2VybmVsOworCisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDEzOworCisJaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgdW5oYW5kbGVkX3NpZ25hbCh0c2ssIFNJR1NFR1YpICYmCisJCQlwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzWyVkXSBnZW5lcmFsIHByb3RlY3Rpb24gaXA6JWx4IHNwOiVseCBlcnJvcjolbHgiLAorCQkJdHNrLT5jb21tLCB0YXNrX3BpZF9ucih0c2spLAorCQkJcmVncy0+aXAsIHJlZ3MtPnNwLCBlcnJvcl9jb2RlKTsKKwkJcHJpbnRfdm1hX2FkZHIoIiBpbiAiLCByZWdzLT5pcCk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKKwlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCitncF9pbl92bTg2OgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloYW5kbGVfdm04Nl9mYXVsdCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSk7CisJcmV0dXJuOworI2VuZGlmCisKK2dwX2luX2tlcm5lbDoKKwlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQorCQlyZXR1cm47CisKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKKwl0c2stPnRocmVhZC50cmFwX25vID0gMTM7CisJaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCisJCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJZGllKCJnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlKTsKK30KKworc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKK21lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ayhLRVJOX0VNRVJHCisJCSJVaGh1aC4gTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCisJCQlyZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlwcmludGsoS0VSTl9FTUVSRworCQkiWW91IGhhdmUgc29tZSBoYXJkd2FyZSBwcm9ibGVtLCBsaWtlbHkgb24gdGhlIFBDSSBidXMuXG4iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0VEQUMpCisJaWYgKGVkYWNfaGFuZGxlcl9zZXQoKSkgeworCQllZGFjX2F0b21pY19hc3NlcnRfZXJyb3IoKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKKwkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOworCisJLyogQ2xlYXIgYW5kIGRpc2FibGUgdGhlIG1lbW9yeSBwYXJpdHkgZXJyb3IgbGluZS4gKi8KKwlyZWFzb24gPSAocmVhc29uICYgMHhmKSB8IDQ7CisJb3V0YihyZWFzb24sIDB4NjEpOworfQorCitzdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZAoraW9fY2hlY2tfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCXByaW50ayhLRVJOX0VNRVJHICJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pXG4iKTsKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKworCS8qIFJlLWVuYWJsZSB0aGUgSU9DSyBsaW5lLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzICovCisJcmVhc29uID0gKHJlYXNvbiAmIDB4ZikgfCA4OworCW91dGIocmVhc29uLCAweDYxKTsKKworCWkgPSAyMDAwOworCXdoaWxlICgtLWkpCisJCXVkZWxheSgxMDAwKTsKKworCXJlYXNvbiAmPSB+ODsKKwlvdXRiKHJlYXNvbiwgMHg2MSk7Cit9CisKK3N0YXRpYyBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCit1bmtub3duX25taV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKG5vdGlmeV9kaWUoRElFX05NSVVOS05PV04sICJubWkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkgPT0KKwkJCU5PVElGWV9TVE9QKQorCQlyZXR1cm47CisjaWZkZWYgQ09ORklHX01DQQorCS8qCisJICogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQorCSAqIGlzOgorCSAqLworCWlmIChNQ0FfYnVzKSB7CisJCW1jYV9oYW5kbGVfbm1pKCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlwcmludGsoS0VSTl9FTUVSRworCQkiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAorCQkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7CisJaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKKwkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOworfQorCitzdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlYXNvbiA9IDA7CisJaW50IGNwdTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qIE9ubHkgdGhlIEJTUCBnZXRzIGV4dGVybmFsIE5NSXMgZnJvbSB0aGUgc3lzdGVtLiAqLworCWlmICghY3B1KQorCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOworCisJaWYgKCEocmVhc29uICYgMHhjMCkpIHsKKwkJaWYgKG5vdGlmeV9kaWUoRElFX05NSV9JUEksICJubWlfaXBpIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCisJCQkJCQkJCT09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQkvKgorCQkgKiBPaywgc28gdGhpcyBpcyBub25lIG9mIHRoZSBkb2N1bWVudGVkIE5NSSBzb3VyY2VzLAorCQkgKiBzbyBpdCBtdXN0IGJlIHRoZSBOTUkgd2F0Y2hkb2cuCisJCSAqLworCQlpZiAobm1pX3dhdGNoZG9nX3RpY2socmVncywgcmVhc29uKSkKKwkJCXJldHVybjsKKwkJaWYgKCFkb19ubWlfY2FsbGJhY2socmVncywgY3B1KSkKKwkJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CisjZWxzZQorCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOworI2VuZGlmCisKKwkJcmV0dXJuOworCX0KKwlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisKKwkvKiBBSzogZm9sbG93aW5nIGNoZWNrcyBzZWVtIHRvIGJlIGJyb2tlbiBvbiBtb2Rlcm4gY2hpcHNldHMuIEZJWE1FICovCisJaWYgKHJlYXNvbiAmIDB4ODApCisJCW1lbV9wYXJpdHlfZXJyb3IocmVhc29uLCByZWdzKTsKKwlpZiAocmVhc29uICYgMHg0MCkKKwkJaW9fY2hlY2tfZXJyb3IocmVhc29uLCByZWdzKTsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLyoKKwkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlIG1lYW53aGlsZQorCSAqIGFzIGl0J3MgZWRnZS10cmlnZ2VyZWQ6CisJICovCisJcmVhc3NlcnRfbm1pKCk7CisjZW5kaWYKK30KKworZG90cmFwbGlua2FnZSBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCitkb19ubWkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlubWlfZW50ZXIoKTsKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwl7IGludCBjcHU7IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsgKytubWlfY291bnQoY3B1KTsgfQorI2Vsc2UKKwlhZGRfcGRhKF9fbm1pX2NvdW50LCAxKTsKKyNlbmRpZgorCisJaWYgKCFpZ25vcmVfbm1pcykKKwkJZGVmYXVsdF9kb19ubWkocmVncyk7CisKKwlubWlfZXhpdCgpOworfQorCit2b2lkIHN0b3Bfbm1pKHZvaWQpCit7CisJYWNwaV9ubWlfZGlzYWJsZSgpOworCWlnbm9yZV9ubWlzKys7Cit9CisKK3ZvaWQgcmVzdGFydF9ubWkodm9pZCkKK3sKKwlpZ25vcmVfbm1pcy0tOworCWFjcGlfbm1pX2VuYWJsZSgpOworfQorCisvKiBNYXkgcnVuIG9uIElTVCBzdGFjay4gKi8KK2RvdHJhcGxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworI2lmZGVmIENPTkZJR19LUFJPQkVTCisJaWYgKG5vdGlmeV9kaWUoRElFX0lOVDMsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgMywgU0lHVFJBUCkKKwkJCT09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisjZWxzZQorCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApCisJCQk9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwcmVlbXB0X2NvbmRpdGlvbmFsX3N0aShyZWdzKTsKKwlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CisJcHJlZW1wdF9jb25kaXRpb25hbF9jbGkocmVncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvKiBIZWxwIGhhbmRsZXIgcnVubmluZyBvbiBJU1Qgc3RhY2sgdG8gc3dpdGNoIGJhY2sgdG8gdXNlciBzdGFjaworICAgZm9yIHNjaGVkdWxpbmcgb3Igc2lnbmFsIGhhbmRsaW5nLiBUaGUgYWN0dWFsIHN0YWNrIHN3aXRjaCBpcyBkb25lIGluCisgICBlbnRyeS5TICovCithc21saW5rYWdlIF9fa3Byb2JlcyBzdHJ1Y3QgcHRfcmVncyAqc3luY19yZWdzKHN0cnVjdCBwdF9yZWdzICplcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGVyZWdzOworCS8qIERpZCBhbHJlYWR5IHN5bmMgKi8KKwlpZiAoZXJlZ3MgPT0gKHN0cnVjdCBwdF9yZWdzICopZXJlZ3MtPnNwKQorCQk7CisJLyogRXhjZXB0aW9uIGZyb20gdXNlciBzcGFjZSAqLworCWVsc2UgaWYgKHVzZXJfbW9kZShlcmVncykpCisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJLyogRXhjZXB0aW9uIGZyb20ga2VybmVsIGFuZCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLiBNb3ZlIHRvCisJICAga2VybmVsIHByb2Nlc3Mgc3RhY2suICovCisJZWxzZSBpZiAoZXJlZ3MtPmZsYWdzICYgWDg2X0VGTEFHU19JRikKKwkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKShlcmVncy0+c3AgLT0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJaWYgKGVyZWdzICE9IHJlZ3MpCisJCSpyZWdzID0gKmVyZWdzOworCXJldHVybiByZWdzOworfQorI2VuZGlmCisKKy8qCisgKiBPdXIgaGFuZGxpbmcgb2YgdGhlIHByb2Nlc3NvciBkZWJ1ZyByZWdpc3RlcnMgaXMgbm9uLXRyaXZpYWwuCisgKiBXZSBkbyBub3QgY2xlYXIgdGhlbSBvbiBlbnRyeSBhbmQgZXhpdCBmcm9tIHRoZSBrZXJuZWwuIFRoZXJlZm9yZQorICogaXQgaXMgcG9zc2libGUgdG8gZ2V0IGEgd2F0Y2hwb2ludCB0cmFwIGhlcmUgZnJvbSBpbnNpZGUgdGhlIGtlcm5lbC4KKyAqIEhvd2V2ZXIsIHRoZSBjb2RlIGluIC4vcHRyYWNlLmMgaGFzIGVuc3VyZWQgdGhhdCB0aGUgdXNlciBjYW4KKyAqIG9ubHkgc2V0IHdhdGNocG9pbnRzIG9uIHVzZXJzcGFjZSBhZGRyZXNzZXMuIFRoZXJlZm9yZSB0aGUgaW4ta2VybmVsCisgKiB3YXRjaHBvaW50IHRyYXAgY2FuIG9ubHkgb2NjdXIgaW4gY29kZSB3aGljaCBpcyByZWFkaW5nL3dyaXRpbmcKKyAqIGZyb20gdXNlciBzcGFjZS4gU3VjaCBjb2RlIG11c3Qgbm90IGhvbGQga2VybmVsIGxvY2tzIChzaW5jZSBpdAorICogY2FuIGVxdWFsbHkgdGFrZSBhIHBhZ2UgZmF1bHQpLCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0byBjYWxsCisgKiBmb3JjZV9zaWdfaW5mbyBldmVuIHRob3VnaCB0aGF0IGNsYWltcyBhbmQgcmVsZWFzZXMgbG9ja3MuCisgKgorICogQ29kZSBpbiAuL3NpZ25hbC5jIGVuc3VyZXMgdGhhdCB0aGUgZGVidWcgY29udHJvbCByZWdpc3RlcgorICogaXMgcmVzdG9yZWQgYmVmb3JlIHdlIGRlbGl2ZXIgYW55IHNpZ25hbCwgYW5kIHRoZXJlZm9yZSB0aGF0CisgKiB1c2VyIGNvZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgZXZlbiB0aG91Z2gKKyAqIHdlIGNsZWFyIGl0IGhlcmUuCisgKgorICogQmVpbmcgY2FyZWZ1bCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBiZSBhcyBjYXJlZnVsIGluIGEKKyAqIGxvdCBvZiBtb3JlIGNvbXBsaWNhdGVkIHBsYWNlcyAodGFzayBzd2l0Y2hpbmcgY2FuIGJlIGEgYml0IGxhenkKKyAqIGFib3V0IHJlc3RvcmluZyBhbGwgdGhlIGRlYnVnIHN0YXRlLCBhbmQgcHRyYWNlIGRvZXNuJ3QgaGF2ZSB0bworICogZmluZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSBURiBiaXQgdGhhdCBjb3VsZCBiZSBzYXZlZCBhd2F5IGV2ZW4KKyAqIGJ5IHVzZXIgY29kZSkKKyAqCisgKiBNYXkgcnVuIG9uIElTVCBzdGFjay4KKyAqLworZG90cmFwbGlua2FnZSB2b2lkIF9fa3Byb2JlcyBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwl1bnNpZ25lZCBsb25nIGNvbmRpdGlvbjsKKwlpbnQgc2lfY29kZTsKKworCWdldF9kZWJ1Z3JlZyhjb25kaXRpb24sIDYpOworCisJLyoKKwkgKiBUaGUgcHJvY2Vzc29yIGNsZWFyZWQgQlRGLCBzbyBkb24ndCBtYXJrIHRoYXQgd2UgbmVlZCBpdCBzZXQuCisJICovCisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX0RFQlVHQ1RMTVNSKTsKKwl0c2stPnRocmVhZC5kZWJ1Z2N0bG1zciA9IDA7CisKKwlpZiAobm90aWZ5X2RpZShESUVfREVCVUcsICJkZWJ1ZyIsIHJlZ3MsIGNvbmRpdGlvbiwgZXJyb3JfY29kZSwKKwkJCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisKKwkvKiBJdCdzIHNhZmUgdG8gYWxsb3cgaXJxJ3MgYWZ0ZXIgRFI2IGhhcyBiZWVuIHNhdmVkICovCisJcHJlZW1wdF9jb25kaXRpb25hbF9zdGkocmVncyk7CisKKwkvKiBNYXNrIG91dCBzcHVyaW91cyBkZWJ1ZyB0cmFwcyBkdWUgdG8gbGF6eSBEUjcgc2V0dGluZyAqLworCWlmIChjb25kaXRpb24gJiAoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpKSB7CisJCWlmICghdHNrLT50aHJlYWQuZGVidWdyZWc3KQorCQkJZ290byBjbGVhcl9kcjc7CisJfQorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKQorCQlnb3RvIGRlYnVnX3ZtODY7CisjZW5kaWYKKworCS8qIFNhdmUgZGVidWcgc3RhdHVzIHJlZ2lzdGVyIHdoZXJlIHB0cmFjZSBjYW4gc2VlIGl0ICovCisJdHNrLT50aHJlYWQuZGVidWdyZWc2ID0gY29uZGl0aW9uOworCisJLyoKKwkgKiBTaW5nbGUtc3RlcHBpbmcgdGhyb3VnaCBURjogbWFrZSBzdXJlIHdlIGlnbm9yZSBhbnkgZXZlbnRzIGluCisJICoga2VybmVsIHNwYWNlIChidXQgcmUtZW5hYmxlIFRGIHdoZW4gcmV0dXJuaW5nIHRvIHVzZXIgbW9kZSkuCisJICovCisJaWYgKGNvbmRpdGlvbiAmIERSX1NURVApIHsKKwkJaWYgKCF1c2VyX21vZGUocmVncykpCisJCQlnb3RvIGNsZWFyX1RGX3JlZW5hYmxlOworCX0KKworCXNpX2NvZGUgPSBnZXRfc2lfY29kZShjb25kaXRpb24pOworCS8qIE9rLCBmaW5hbGx5IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlICovCisJc2VuZF9zaWd0cmFwKHRzaywgcmVncywgZXJyb3JfY29kZSwgc2lfY29kZSk7CisKKwkvKgorCSAqIERpc2FibGUgYWRkaXRpb25hbCB0cmFwcy4gVGhleSdsbCBiZSByZS1lbmFibGVkIHdoZW4KKwkgKiB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZC4KKwkgKi8KK2NsZWFyX2RyNzoKKwlzZXRfZGVidWdyZWcoMCwgNyk7CisJcHJlZW1wdF9jb25kaXRpb25hbF9jbGkocmVncyk7CisJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorZGVidWdfdm04NjoKKwloYW5kbGVfdm04Nl90cmFwKChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKSByZWdzLCBlcnJvcl9jb2RlLCAxKTsKKwlwcmVlbXB0X2NvbmRpdGlvbmFsX2NsaShyZWdzKTsKKwlyZXR1cm47CisjZW5kaWYKKworY2xlYXJfVEZfcmVlbmFibGU6CisJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TSU5HTEVTVEVQKTsKKwlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKKwlwcmVlbXB0X2NvbmRpdGlvbmFsX2NsaShyZWdzKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CitzdGF0aWMgaW50IGtlcm5lbF9tYXRoX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpzdHIsIGludCB0cmFwbnIpCit7CisJaWYgKGZpeHVwX2V4Y2VwdGlvbihyZWdzKSkKKwkJcmV0dXJuIDE7CisKKwlub3RpZnlfZGllKERJRV9HUEYsIHN0ciwgcmVncywgMCwgdHJhcG5yLCBTSUdGUEUpOworCS8qIElsbGVnYWwgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGluIHRoZSBrZXJuZWwgKi8KKwljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IHRyYXBucjsKKwlkaWUoc3RyLCByZWdzLCAwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogTm90ZSB0aGF0IHdlIHBsYXkgYXJvdW5kIHdpdGggdGhlICdUUycgYml0IGluIGFuIGF0dGVtcHQgdG8gZ2V0CisgKiB0aGUgY29ycmVjdCBiZWhhdmlvdXIgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGFzeW5jaHJvbm91cworICogSVJRMTMgYmVoYXZpb3VyCisgKi8KK3ZvaWQgbWF0aF9lcnJvcih2b2lkIF9fdXNlciAqaXApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXNpZ2luZm9fdCBpbmZvOworCXVuc2lnbmVkIHNob3J0IGN3ZCwgc3dkOworCisJLyoKKwkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KKwkgKi8KKwl0YXNrID0gY3VycmVudDsKKwlzYXZlX2luaXRfZnB1KHRhc2spOworCXRhc2stPnRocmVhZC50cmFwX25vID0gMTY7CisJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKKwlpbmZvLnNpX2FkZHIgPSBpcDsKKwkvKgorCSAqICh+Y3dkICYgc3dkKSB3aWxsIG1hc2sgb3V0IGV4Y2VwdGlvbnMgdGhhdCBhcmUgbm90IHNldCB0byB1bm1hc2tlZAorCSAqIHN0YXR1cy4gIDB4M2YgaXMgdGhlIGV4Y2VwdGlvbiBiaXRzIGluIHRoZXNlIHJlZ3MsIDB4MjAwIGlzIHRoZQorCSAqIEMxIHJlZyB5b3UgbmVlZCBpbiBjYXNlIG9mIGEgc3RhY2sgZmF1bHQsIDB4MDQwIGlzIHRoZSBzdGFjaworCSAqIGZhdWx0IGJpdC4gIFdlIHNob3VsZCBvbmx5IGJlIHRha2luZyBvbmUgZXhjZXB0aW9uIGF0IGEgdGltZSwKKwkgKiBzbyBpZiB0aGlzIGNvbWJpbmF0aW9uIGRvZXNuJ3QgcHJvZHVjZSBhbnkgc2luZ2xlIGV4Y2VwdGlvbiwKKwkgKiB0aGVuIHdlIGhhdmUgYSBiYWQgcHJvZ3JhbSB0aGF0IGlzbid0IHN5bmNocm9uaXppbmcgaXRzIEZQVSB1c2FnZQorCSAqIGFuZCBpdCB3aWxsIHN1ZmZlciB0aGUgY29uc2VxdWVuY2VzIHNpbmNlIHdlIHdvbid0IGJlIGFibGUgdG8KKwkgKiBmdWxseSByZXByb2R1Y2UgdGhlIGNvbnRleHQgb2YgdGhlIGV4Y2VwdGlvbgorCSAqLworCWN3ZCA9IGdldF9mcHVfY3dkKHRhc2spOworCXN3ZCA9IGdldF9mcHVfc3dkKHRhc2spOworCXN3aXRjaCAoc3dkICYgfmN3ZCAmIDB4M2YpIHsKKwljYXNlIDB4MDAwOiAvKiBObyB1bm1hc2tlZCBleGNlcHRpb24gKi8KKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJCXJldHVybjsKKyNlbmRpZgorCWRlZmF1bHQ6IC8qIE11bHRpcGxlIGV4Y2VwdGlvbnMgKi8KKwkJYnJlYWs7CisJY2FzZSAweDAwMTogLyogSW52YWxpZCBPcCAqLworCQkvKgorCQkgKiBzd2QgJiAweDI0MCA9PSAweDA0MDogU3RhY2sgVW5kZXJmbG93CisJCSAqIHN3ZCAmIDB4MjQwID09IDB4MjQwOiBTdGFjayBPdmVyZmxvdworCQkgKiBVc2VyIG11c3QgY2xlYXIgdGhlIFNGIGJpdCAoMHg0MCkgaWYgc2V0CisJCSAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQlicmVhazsKKwljYXNlIDB4MDAyOiAvKiBEZW5vcm1hbGl6ZSAqLworCWNhc2UgMHgwMTA6IC8qIFVuZGVyZmxvdyAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQlicmVhazsKKwljYXNlIDB4MDA0OiAvKiBaZXJvIERpdmlkZSAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQlicmVhazsKKwljYXNlIDB4MDA4OiAvKiBPdmVyZmxvdyAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQlicmVhazsKKwljYXNlIDB4MDIwOiAvKiBQcmVjaXNpb24gKi8KKwkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJYnJlYWs7CisJfQorCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRhc2spOworfQorCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9fY29wcm9jZXNzb3JfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwljb25kaXRpb25hbF9zdGkocmVncyk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWdub3JlX2ZwdV9pcnEgPSAxOworI2Vsc2UKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSAmJgorCSAgICBrZXJuZWxfbWF0aF9lcnJvcihyZWdzLCAia2VybmVsIHg4NyBtYXRoIGVycm9yIiwgMTYpKQorCQlyZXR1cm47CisjZW5kaWYKKworCW1hdGhfZXJyb3IoKHZvaWQgX191c2VyICopcmVncy0+aXApOworfQorCitzdGF0aWMgdm9pZCBzaW1kX21hdGhfZXJyb3Iodm9pZCBfX3VzZXIgKmlwKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzaWdpbmZvX3QgaW5mbzsKKwl1bnNpZ25lZCBzaG9ydCBteGNzcjsKKworCS8qCisJICogU2F2ZSB0aGUgaW5mbyBmb3IgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCBjbGVhciB0aGUgZXJyb3IuCisJICovCisJdGFzayA9IGN1cnJlbnQ7CisJc2F2ZV9pbml0X2ZwdSh0YXNrKTsKKwl0YXNrLT50aHJlYWQudHJhcF9ubyA9IDE5OworCXRhc2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKKwlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IF9fU0lfRkFVTFQ7CisJaW5mby5zaV9hZGRyID0gaXA7CisJLyoKKwkgKiBUaGUgU0lNRCBGUFUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSwgYXMgdGhlcmUKKwkgKiBpcyBvbmx5IGEgc2luZ2xlIHN0YXR1cy9jb250cm9sIHJlZ2lzdGVyLiAgVGh1cywgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogdW5tYXNrZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2UgbXVzdCBtYXNrIHRoZSBleGNlcHRpb24gbWFzayBiaXRzCisJICogYXQgMHgxZjgwLCBhbmQgdGhlbiB1c2UgdGhlc2UgdG8gbWFzayB0aGUgZXhjZXB0aW9uIGJpdHMgYXQgMHgzZi4KKwkgKi8KKwlteGNzciA9IGdldF9mcHVfbXhjc3IodGFzayk7CisJc3dpdGNoICh+KChteGNzciAmIDB4MWY4MCkgPj4gNykgJiAobXhjc3IgJiAweDNmKSkgeworCWNhc2UgMHgwMDA6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJY2FzZSAweDAwMTogLyogSW52YWxpZCBPcCAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQlicmVhazsKKwljYXNlIDB4MDAyOiAvKiBEZW5vcm1hbGl6ZSAqLworCWNhc2UgMHgwMTA6IC8qIFVuZGVyZmxvdyAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQlicmVhazsKKwljYXNlIDB4MDA0OiAvKiBaZXJvIERpdmlkZSAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQlicmVhazsKKwljYXNlIDB4MDA4OiAvKiBPdmVyZmxvdyAqLworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQlicmVhazsKKwljYXNlIDB4MDIwOiAvKiBQcmVjaXNpb24gKi8KKwkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJYnJlYWs7CisJfQorCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRhc2spOworfQorCitkb3RyYXBsaW5rYWdlIHZvaWQKK2RvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwljb25kaXRpb25hbF9zdGkocmVncyk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWYgKGNwdV9oYXNfeG1tKSB7CisJCS8qIEhhbmRsZSBTSU1EIEZQVSBleGNlcHRpb25zIG9uIFBJSUkrIHByb2Nlc3NvcnMuICovCisJCWlnbm9yZV9mcHVfaXJxID0gMTsKKwkJc2ltZF9tYXRoX2Vycm9yKCh2b2lkIF9fdXNlciAqKXJlZ3MtPmlwKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIEhhbmRsZSBzdHJhbmdlIGNhY2hlIGZsdXNoIGZyb20gdXNlciBzcGFjZSBleGNlcHRpb24KKwkgKiBpbiBhbGwgb3RoZXIgY2FzZXMuICBUaGlzIGlzIHVuZG9jdW1lbnRlZCBiZWhhdmlvdXIuCisJICovCisJaWYgKHJlZ3MtPmZsYWdzICYgWDg2X1ZNX01BU0spIHsKKwkJaGFuZGxlX3ZtODZfZmF1bHQoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopcmVncywgZXJyb3JfY29kZSk7CisJCXJldHVybjsKKwl9CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxOTsKKwljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJZGllX2lmX2tlcm5lbCgiY2FjaGUgZmx1c2ggZGVuaWVkIiwgcmVncywgZXJyb3JfY29kZSk7CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworI2Vsc2UKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSAmJgorCQkJa2VybmVsX21hdGhfZXJyb3IocmVncywgImtlcm5lbCBzaW1kIG1hdGggZXJyb3IiLCAxOSkpCisJCXJldHVybjsKKwlzaW1kX21hdGhfZXJyb3IoKHZvaWQgX191c2VyICopcmVncy0+aXApOworI2VuZGlmCit9CisKK2RvdHJhcGxpbmthZ2Ugdm9pZAorZG9fc3B1cmlvdXNfaW50ZXJydXB0X2J1ZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKKyNpZiAwCisJLyogTm8gbmVlZCB0byB3YXJuIGFib3V0IHRoaXMgYW55IGxvbmdlci4gKi8KKwlwcmludGsoS0VSTl9JTkZPICJJZ25vcmluZyBQNiBMb2NhbCBBUElDIFNwdXJpb3VzIEludGVycnVwdCBCdWcuLi5cbiIpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCit1bnNpZ25lZCBsb25nIHBhdGNoX2VzcGZpeF9kZXNjKHVuc2lnbmVkIGxvbmcgdWVzcCwgdW5zaWduZWQgbG9uZyBrZXNwKQoreworCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0ID0gZ2V0X2NwdV9nZHRfdGFibGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSAoa2VzcCAtIHVlc3ApICYgLVRIUkVBRF9TSVpFOworCXVuc2lnbmVkIGxvbmcgbmV3X2tlc3AgPSBrZXNwIC0gYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxpbV9wYWdlcyA9IChuZXdfa2VzcCB8IChUSFJFQURfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOworCV9fdTY0IGRlc2MgPSAqKF9fdTY0ICopJmdkdFtHRFRfRU5UUllfRVNQRklYX1NTXTsKKworCS8qIFNldCB1cCBiYXNlIGZvciBlc3BmaXggc2VnbWVudCAqLworCWRlc2MgJj0gMHgwMGYwZmYwMDAwMDAwMDAwVUxMOworCWRlc2MgfD0JKCgoKF9fdTY0KWJhc2UpIDw8IDE2KSAmIDB4MDAwMDAwZmZmZmZmMDAwMFVMTCkgfAorCQkoKCgoX191NjQpYmFzZSkgPDwgMzIpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB8CisJCSgoKChfX3U2NClsaW1fcGFnZXMpIDw8IDMyKSAmIDB4MDAwZjAwMDAwMDAwMDAwMFVMTCkgfAorCQkobGltX3BhZ2VzICYgMHhmZmZmKTsKKwkqKF9fdTY0ICopJmdkdFtHRFRfRU5UUllfRVNQRklYX1NTXSA9IGRlc2M7CisKKwlyZXR1cm4gbmV3X2tlc3A7Cit9CisjZWxzZQorYXNtbGlua2FnZSB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBzbXBfdGhlcm1hbF9pbnRlcnJ1cHQodm9pZCkKK3sKK30KKworYXNtbGlua2FnZSB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBtY2VfdGhyZXNob2xkX2ludGVycnVwdCh2b2lkKQoreworfQorI2VuZGlmCisKKy8qCisgKiAnbWF0aF9zdGF0ZV9yZXN0b3JlKCknIHNhdmVzIHRoZSBjdXJyZW50IG1hdGggaW5mb3JtYXRpb24gaW4gdGhlCisgKiBvbGQgbWF0aCBzdGF0ZSBhcnJheSwgYW5kIGdldHMgdGhlIG5ldyBvbmVzIGZyb20gdGhlIGN1cnJlbnQgdGFzaworICoKKyAqIENhcmVmdWwuLiBUaGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBJQk0tZGVzaWduZWQgSVJRMTMgYmVoYXZpb3VyLgorICogRG9uJ3QgdG91Y2ggdW5sZXNzIHlvdSAqcmVhbGx5KiBrbm93IGhvdyBpdCB3b3Jrcy4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkIChpbiB0aGlzIGNhc2UsCisgKiBsb2NhbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhdCB0aGUgY2FsbC1zaXRlIGluIGVudHJ5LlMpLgorICovCithc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSB0aHJlYWQtPnRhc2s7CisKKwlpZiAoIXRza191c2VkX21hdGgodHNrKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCS8qCisJCSAqIGRvZXMgYSBzbGFiIGFsbG9jIHdoaWNoIGNhbiBzbGVlcAorCQkgKi8KKwkJaWYgKGluaXRfZnB1KHRzaykpIHsKKwkJCS8qCisJCQkgKiByYW4gb3V0IG9mIG1lbW9yeSEKKwkJCSAqLworCQkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKKwkJCXJldHVybjsKKwkJfQorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCX0KKworCWNsdHMoKTsJCQkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLworI2lmZGVmIENPTkZJR19YODZfMzIKKwlyZXN0b3JlX2ZwdSh0c2spOworI2Vsc2UKKwkvKgorCSAqIFBhcmFub2lkIHJlc3RvcmUuIHNlbmQgYSBTSUdTRUdWIGlmIHdlIGZhaWwgdG8gcmVzdG9yZSB0aGUgc3RhdGUuCisJICovCisJaWYgKHVubGlrZWx5KHJlc3RvcmVfZnB1X2NoZWNraW5nKHRzaykpKSB7CisJCXN0dHMoKTsKKwkJZm9yY2Vfc2lnKFNJR1NFR1YsIHRzayk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl0aHJlYWQtPnN0YXR1cyB8PSBUU19VU0VERlBVOwkvKiBTbyB3ZSBmbnNhdmUgb24gc3dpdGNoX3RvKCkgKi8KKwl0c2stPmZwdV9jb3VudGVyKys7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYXRoX3N0YXRlX3Jlc3RvcmUpOworCisjaWZuZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgorYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKK3sKKwlwcmludGsoS0VSTl9FTUVSRworCQkibWF0aC1lbXVsYXRpb24gbm90IGVuYWJsZWQgYW5kIG5vIGNvcHJvY2Vzc29yIGZvdW5kLlxuIik7CisJcHJpbnRrKEtFUk5fRU1FUkcgImtpbGxpbmcgJXMuXG4iLCBjdXJyZW50LT5jb21tKTsKKwlmb3JjZV9zaWcoU0lHRlBFLCBjdXJyZW50KTsKKwlzY2hlZHVsZSgpOworfQorI2VuZGlmIC8qIENPTkZJR19NQVRIX0VNVUxBVElPTiAqLworCitkb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzCitkb19kZXZpY2Vfbm90X2F2YWlsYWJsZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcikKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWYgKHJlYWRfY3IwKCkgJiBYODZfQ1IwX0VNKSB7CisJCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKKwkJbWF0aF9lbXVsYXRlKDApOworCX0gZWxzZSB7CisJCW1hdGhfc3RhdGVfcmVzdG9yZSgpOyAvKiBpbnRlcnJ1cHRzIHN0aWxsIG9mZiAqLworCQljb25kaXRpb25hbF9zdGkocmVncyk7CisJfQorI2Vsc2UKKwltYXRoX3N0YXRlX3Jlc3RvcmUoKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorI2lmZGVmIENPTkZJR19YODZfTUNFCitkb3RyYXBsaW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3IpCit7CisJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOworCW1hY2hpbmVfY2hlY2tfdmVjdG9yKHJlZ3MsIGVycm9yKTsKK30KKyNlbmRpZgorCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9faXJldF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXNpZ2luZm9fdCBpbmZvOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWluZm8uc2lfc2lnbm8gPSBTSUdJTEw7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gSUxMX0JBRFNUSzsKKwlpbmZvLnNpX2FkZHIgPSAwOworCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCAiaXJldCBleGNlcHRpb24iLAorCQkJcmVncywgZXJyb3JfY29kZSwgMzIsIFNJR0lMTCkgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybjsKKwlkb190cmFwKDMyLCBTSUdJTEwsICJpcmV0IGV4Y2VwdGlvbiIsIHJlZ3MsIGVycm9yX2NvZGUsICZpbmZvKTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaW50IGk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FSVNBCisJdm9pZCBfX2lvbWVtICpwID0gZWFybHlfaW9yZW1hcCgweDBGRkZEOSwgNCk7CisKKwlpZiAocmVhZGwocCkgPT0gJ0UnICsgKCdJJzw8OCkgKyAoJ1MnPDwxNikgKyAoJ0EnPDwyNCkpCisJCUVJU0FfYnVzID0gMTsKKwllYXJseV9pb3VubWFwKHAsIDQpOworI2VuZGlmCisKKwlzZXRfaW50cl9nYXRlKDAsICZkaXZpZGVfZXJyb3IpOworCXNldF9pbnRyX2dhdGVfaXN0KDEsICZkZWJ1ZywgREVCVUdfU1RBQ0spOworCXNldF9pbnRyX2dhdGVfaXN0KDIsICZubWksIE5NSV9TVEFDSyk7CisJLyogaW50MyBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCisJc2V0X3N5c3RlbV9pbnRyX2dhdGVfaXN0KDMsICZpbnQzLCBERUJVR19TVEFDSyk7CisJLyogaW50NCBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCisJc2V0X3N5c3RlbV9pbnRyX2dhdGUoNCwgJm92ZXJmbG93KTsKKwlzZXRfaW50cl9nYXRlKDUsICZib3VuZHMpOworCXNldF9pbnRyX2dhdGUoNiwgJmludmFsaWRfb3ApOworCXNldF9pbnRyX2dhdGUoNywgJmRldmljZV9ub3RfYXZhaWxhYmxlKTsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJc2V0X3Rhc2tfZ2F0ZSg4LCBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKKyNlbHNlCisJc2V0X2ludHJfZ2F0ZV9pc3QoOCwgJmRvdWJsZV9mYXVsdCwgRE9VQkxFRkFVTFRfU1RBQ0spOworI2VuZGlmCisJc2V0X2ludHJfZ2F0ZSg5LCAmY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKTsKKwlzZXRfaW50cl9nYXRlKDEwLCAmaW52YWxpZF9UU1MpOworCXNldF9pbnRyX2dhdGUoMTEsICZzZWdtZW50X25vdF9wcmVzZW50KTsKKwlzZXRfaW50cl9nYXRlX2lzdCgxMiwgJnN0YWNrX3NlZ21lbnQsIFNUQUNLRkFVTFRfU1RBQ0spOworCXNldF9pbnRyX2dhdGUoMTMsICZnZW5lcmFsX3Byb3RlY3Rpb24pOworCXNldF9pbnRyX2dhdGUoMTQsICZwYWdlX2ZhdWx0KTsKKwlzZXRfaW50cl9nYXRlKDE1LCAmc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyk7CisJc2V0X2ludHJfZ2F0ZSgxNiwgJmNvcHJvY2Vzc29yX2Vycm9yKTsKKwlzZXRfaW50cl9nYXRlKDE3LCAmYWxpZ25tZW50X2NoZWNrKTsKKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCXNldF9pbnRyX2dhdGVfaXN0KDE4LCAmbWFjaGluZV9jaGVjaywgTUNFX1NUQUNLKTsKKyNlbmRpZgorCXNldF9pbnRyX2dhdGUoMTksICZzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKTsKKworI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgorCXNldF9zeXN0ZW1faW50cl9nYXRlKElBMzJfU1lTQ0FMTF9WRUNUT1IsIGlhMzJfc3lzY2FsbCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAoY3B1X2hhc19meHNyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUuLi4gIik7CisJCXNldF9pbl9jcjQoWDg2X0NSNF9PU0ZYU1IpOworCQlwcmludGsoImRvbmUuXG4iKTsKKwl9CisJaWYgKGNwdV9oYXNfeG1tKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJFbmFibGluZyB1bm1hc2tlZCBTSU1EIEZQVSBleGNlcHRpb24gc3VwcG9ydC4uLiAiKTsKKwkJc2V0X2luX2NyNChYODZfQ1I0X09TWE1NRVhDUFQpOworCQlwcmludGsoImRvbmUuXG4iKTsKKwl9CisKKwlzZXRfc3lzdGVtX3RyYXBfZ2F0ZShTWVNDQUxMX1ZFQ1RPUiwgJnN5c3RlbV9jYWxsKTsKKworCS8qIFJlc2VydmUgYWxsIHRoZSBidWlsdGluIGFuZCB0aGUgc3lzY2FsbCB2ZWN0b3I6ICovCisJZm9yIChpID0gMDsgaSA8IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUjsgaSsrKQorCQlzZXRfYml0KGksIHVzZWRfdmVjdG9ycyk7CisKKwlzZXRfYml0KFNZU0NBTExfVkVDVE9SLCB1c2VkX3ZlY3RvcnMpOworI2VuZGlmCisJLyoKKwkgKiBTaG91bGQgYmUgYSBiYXJyaWVyIGZvciBhbnkgZXh0ZXJuYWwgQ1BVIHN0YXRlOgorCSAqLworCWNwdV9pbml0KCk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJdHJhcF9pbml0X2hvb2soKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHNfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkZjhlNC4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHNfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicwotICoKLSAqICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAotICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKLSAqLwotCi0vKgotICogJ1RyYXBzLmMnIGhhbmRsZXMgaGFyZHdhcmUgdHJhcHMgYW5kIGZhdWx0cyBhZnRlciB3ZSBoYXZlIHNhdmVkIHNvbWUKLSAqIHN0YXRlIGluICdhc20ucycuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvbm1pLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2lmZGVmIENPTkZJR19FSVNBCi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWlzYS5oPgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUNBCi0jaW5jbHVkZSA8bGludXgvbWNhLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0VEQUMpCi0jaW5jbHVkZSA8bGludXgvZWRhYy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgotI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Vud2luZC5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+Ci0jaW5jbHVkZSA8YXNtL2kzODcuaD4KLSNpbmNsdWRlIDxhc20vbm1pLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotCi0jaW5jbHVkZSAibWFjaF90cmFwcy5oIgotCi1ERUNMQVJFX0JJVE1BUCh1c2VkX3ZlY3RvcnMsIE5SX1ZFQ1RPUlMpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNlZF92ZWN0b3JzKTsKLQotYXNtbGlua2FnZSBpbnQgc3lzdGVtX2NhbGwodm9pZCk7Ci0KLS8qIERvIHdlIGlnbm9yZSBGUFUgaW50ZXJydXB0cyA/ICovCi1jaGFyIGlnbm9yZV9mcHVfaXJxOwotCi0vKgotICogVGhlIElEVCBoYXMgdG8gYmUgcGFnZS1hbGlnbmVkIHRvIHNpbXBsaWZ5IHRoZSBQZW50aXVtCi0gKiBGMCAwRiBidWcgd29ya2Fyb3VuZC4uIFdlIGhhdmUgYSBzcGVjaWFsIGxpbmsgc2VnbWVudAotICogZm9yIHRoaXMuCi0gKi8KLWdhdGVfZGVzYyBpZHRfdGFibGVbMjU2XQotCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pZHQiKSkpID0geyB7IHsgeyAwLCAwIH0gfSB9LCB9OwotCi1pbnQgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pOwotaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0Owotc3RhdGljIHVuc2lnbmVkIGludCBjb2RlX2J5dGVzID0gNjQ7Ci1zdGF0aWMgaW50IGlnbm9yZV9ubWlzOwotc3RhdGljIGludCBkaWVfY291bnRlcjsKLQotdm9pZCBwcmludGtfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCByZWxpYWJsZSkKLXsKLSNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzeW1zaXplOwotCWNvbnN0IGNoYXIgKnN5bW5hbWU7Ci0JY2hhciAqbW9kbmFtZTsKLQljaGFyICpkZWxpbSA9ICI6IjsKLQljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTl07Ci0JY2hhciByZWxpYWJbNF0gPSAiIjsKLQotCXN5bW5hbWUgPSBrYWxsc3ltc19sb29rdXAoYWRkcmVzcywgJnN5bXNpemUsICZvZmZzZXQsCi0JCQkJCSZtb2RuYW1lLCBuYW1lYnVmKTsKLQlpZiAoIXN5bW5hbWUpIHsKLQkJcHJpbnRrKCIgWzwlMDhseD5dXG4iLCBhZGRyZXNzKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIXJlbGlhYmxlKQotCQlzdHJjcHkocmVsaWFiLCAiPyAiKTsKLQotCWlmICghbW9kbmFtZSkKLQkJbW9kbmFtZSA9IGRlbGltID0gIiI7Ci0JcHJpbnRrKCIgWzwlMDhseD5dICVzJXMlcyVzJXMrMHglbHgvMHglbHhcbiIsCi0JCWFkZHJlc3MsIHJlbGlhYiwgZGVsaW0sIG1vZG5hbWUsIGRlbGltLCBzeW1uYW1lLCBvZmZzZXQsIHN5bXNpemUpOwotI2Vsc2UKLQlwcmludGsoIiBbPCUwOGx4Pl1cbiIsIGFkZHJlc3MpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAotCQkJdm9pZCAqcCwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0Jdm9pZCAqdCA9IHRpbmZvOwotCXJldHVybglwID4gdCAmJiBwIDw9IHQgKyBUSFJFQURfU0laRSAtIHNpemU7Ci19Ci0KLS8qIFRoZSBmb3JtIG9mIHRoZSB0b3Agb2YgdGhlIGZyYW1lIG9uIHRoZSBzdGFjayAqLwotc3RydWN0IHN0YWNrX2ZyYW1lIHsKLQlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKm5leHRfZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyByZXR1cm5fYWRkcmVzczsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKLQotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrLCBzaXplb2YoKnN0YWNrKSkpIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JCWFkZHIgPSAqc3RhY2s7Ci0JCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCWlmICgodW5zaWduZWQgbG9uZykgc3RhY2sgPT0gYnAgKyA0KSB7Ci0JCQkJb3BzLT5hZGRyZXNzKGRhdGEsIGFkZHIsIDEpOwotCQkJCWZyYW1lID0gZnJhbWUtPm5leHRfZnJhbWU7Ci0JCQkJYnAgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0JCQl9IGVsc2UgewotCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCBicCA9PSAwKTsKLQkJCX0KLQkJfQotCQlzdGFjaysrOwotCX0KLQlyZXR1cm4gYnA7Ci19Ci0KLXZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCi17Ci0JaWYgKCF0YXNrKQotCQl0YXNrID0gY3VycmVudDsKLQotCWlmICghc3RhY2spIHsKLQkJdW5zaWduZWQgbG9uZyBkdW1teTsKLQkJc3RhY2sgPSAmZHVtbXk7Ci0JCWlmICh0YXNrICE9IGN1cnJlbnQpCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOwotCX0KLQotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi0JaWYgKCFicCkgewotCQlpZiAodGFzayA9PSBjdXJyZW50KSB7Ci0JCQkvKiBHcmFiIGJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KLQkJCWFzbSgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoYnApIDopOwotCQl9IGVsc2UgewotCQkJLyogYnAgaXMgdGhlIGxhc3QgcmVnIHB1c2hlZCBieSBzd2l0Y2hfdG8gKi8KLQkJCWJwID0gKih1bnNpZ25lZCBsb25nICopIHRhc2stPnRocmVhZC5zcDsKLQkJfQotCX0KLSNlbmRpZgotCi0JZm9yICg7OykgewotCQlzdHJ1Y3QgdGhyZWFkX2luZm8gKmNvbnRleHQ7Ci0KLQkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKLQkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQkJYnAgPSBwcmludF9jb250ZXh0X3N0YWNrKGNvbnRleHQsIHN0YWNrLCBicCwgb3BzLCBkYXRhKTsKLQkJLyoKLQkJICogU2hvdWxkIGJlIGFmdGVyIHRoZSBsaW5lIGJlbG93LCBidXQgc29tZXdoZXJlCi0JCSAqIGluIGVhcmx5IGJvb3QgY29udGV4dCBjb21lcyBvdXQgY29ycnVwdGVkIGFuZCB3ZQotCQkgKiBjYW4ndCByZWZlcmVuY2UgaXQ6Ci0JCSAqLwotCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQotCQkJYnJlYWs7Ci0JCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKiljb250ZXh0LT5wcmV2aW91c19lc3A7Ci0JCWlmICghc3RhY2spCi0JCQlicmVhazsKLQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3RyYWNlX3dhcm5pbmdfc3ltYm9sKHZvaWQgKmRhdGEsIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBzeW1ib2wpCi17Ci0JcHJpbnRrKGRhdGEpOwotCXByaW50X3N5bWJvbChtc2csIHN5bWJvbCk7Ci0JcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF90cmFjZV93YXJuaW5nKHZvaWQgKmRhdGEsIGNoYXIgKm1zZykKLXsKLQlwcmludGsoIiVzJXNcbiIsIChjaGFyICopZGF0YSwgbXNnKTsKLX0KLQotc3RhdGljIGludCBwcmludF90cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogUHJpbnQgb25lIGFkZHJlc3Mvc3ltYm9sIGVudHJpZXMgcGVyIGxpbmUuCi0gKi8KLXN0YXRpYyB2b2lkIHByaW50X3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0JcHJpbnRrKCIlcyBbPCUwOGx4Pl0gIiwgKGNoYXIgKilkYXRhLCBhZGRyKTsKLQlpZiAoIXJlbGlhYmxlKQotCQlwcmludGsoIj8gIik7Ci0JcHJpbnRfc3ltYm9sKCIlc1xuIiwgYWRkcik7Ci0JdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgcHJpbnRfdHJhY2Vfb3BzID0gewotCS53YXJuaW5nID0gcHJpbnRfdHJhY2Vfd2FybmluZywKLQkud2FybmluZ19zeW1ib2wgPSBwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCwKLQkuc3RhY2sgPSBwcmludF90cmFjZV9zdGFjaywKLQkuYWRkcmVzcyA9IHByaW50X3RyYWNlX2FkZHJlc3MsCi19OwotCi1zdGF0aWMgdm9pZAotc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQotewotCWR1bXBfdHJhY2UodGFzaywgcmVncywgc3RhY2ssIGJwLCAmcHJpbnRfdHJhY2Vfb3BzLCBsb2dfbHZsKTsKLQlwcmludGsoIiVzID09PT09PT09PT09PT09PT09PT09PT09XG4iLCBsb2dfbHZsKTsKLX0KLQotdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwKQotewotCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzdGFjaywgYnAsICIiKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKLXsKLQl1bnNpZ25lZCBsb25nICpzdGFjazsKLQlpbnQgaTsKLQotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCWlmICh0YXNrKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKLQkJZWxzZQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKLQl9Ci0KLQlzdGFjayA9IHNwOwotCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgewotCQlpZiAoa3N0YWNrX2VuZChzdGFjaykpCi0JCQlicmVhazsKLQkJaWYgKGkgJiYgKChpICUgOCkgPT0gMCkpCi0JCQlwcmludGsoIlxuJXMgICAgICAgIiwgbG9nX2x2bCk7Ci0JCXByaW50aygiJTA4bHggIiwgKnN0YWNrKyspOwotCX0KLQlwcmludGsoIlxuJXNDYWxsIFRyYWNlOlxuIiwgbG9nX2x2bCk7Ci0KLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3AsIGJwLCBsb2dfbHZsKTsKLX0KLQotdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApCi17Ci0JcHJpbnRrKCIgICAgICAgIik7Ci0Jc2hvd19zdGFja19sb2dfbHZsKHRhc2ssIE5VTEwsIHNwLCAwLCAiIik7Ci19Ci0KLS8qCi0gKiBUaGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGR1bXBfc3RhY2sgZ2VuZXJhdG9yCi0gKi8KLXZvaWQgZHVtcF9zdGFjayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYnAgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0KLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCWlmICghYnApCi0JCWFzbSgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoYnApOik7Ci0jZW5kaWYKLQotCXByaW50aygiUGlkOiAlZCwgY29tbTogJS4yMHMgJXMgJXMgJS4qc1xuIiwKLQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCBwcmludF90YWludGVkKCksCi0JCWluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAotCQkoaW50KXN0cmNzcG4oaW5pdF91dHNuYW1lKCktPnZlcnNpb24sICIgIiksCi0JCWluaXRfdXRzbmFtZSgpLT52ZXJzaW9uKTsKLQotCXNob3dfdHJhY2UoY3VycmVudCwgTlVMTCwgJnN0YWNrLCBicCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7Ci0KLXZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGk7Ci0KLQlwcmludF9tb2R1bGVzKCk7Ci0JX19zaG93X3JlZ2lzdGVycyhyZWdzLCAwKTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICUuKnMgKHBpZDogJWQsIHRpPSVwIHRhc2s9JXAgdGFzay50aT0lcCkiLAotCQlUQVNLX0NPTU1fTEVOLCBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwKLQkJY3VycmVudF90aHJlYWRfaW5mbygpLCBjdXJyZW50LCB0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpKTsKLQkvKgotCSAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCi0JICogdGltZSBvZiB0aGUgZmF1bHQuLgotCSAqLwotCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKSB7Ci0JCXVuc2lnbmVkIGludCBjb2RlX3Byb2xvZ3VlID0gY29kZV9ieXRlcyAqIDQzIC8gNjQ7Ci0JCXVuc2lnbmVkIGludCBjb2RlX2xlbiA9IGNvZGVfYnl0ZXM7Ci0JCXVuc2lnbmVkIGNoYXIgYzsKLQkJdTggKmlwOwotCi0JCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIlN0YWNrOiAiKTsKLQkJc2hvd19zdGFja19sb2dfbHZsKE5VTEwsIHJlZ3MsICZyZWdzLT5zcCwgMCwgS0VSTl9FTUVSRyk7Ci0KLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOwotCi0JCWlwID0gKHU4ICopcmVncy0+aXAgLSBjb2RlX3Byb2xvZ3VlOwotCQlpZiAoaXAgPCAodTggKilQQUdFX09GRlNFVCB8fCBwcm9iZV9rZXJuZWxfYWRkcmVzcyhpcCwgYykpIHsKLQkJCS8qIHRyeSBzdGFydGluZyBhdCBFSVAgKi8KLQkJCWlwID0gKHU4ICopcmVncy0+aXA7Ci0JCQljb2RlX2xlbiA9IGNvZGVfbGVuIC0gY29kZV9wcm9sb2d1ZSArIDE7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IGNvZGVfbGVuOyBpKyssIGlwKyspIHsKLQkJCWlmIChpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8Ci0JCQkJCXByb2JlX2tlcm5lbF9hZGRyZXNzKGlwLCBjKSkgewotCQkJCXByaW50aygiIEJhZCBFSVAgdmFsdWUuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaXAgPT0gKHU4ICopcmVncy0+aXApCi0JCQkJcHJpbnRrKCI8JTAyeD4gIiwgYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOwotCQl9Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotaW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBpcCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB1ZDI7Ci0KLQlpZiAoaXAgPCBQQUdFX09GRlNFVCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHByb2JlX2tlcm5lbF9hZGRyZXNzKCh1bnNpZ25lZCBzaG9ydCAqKWlwLCB1ZDIpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB1ZDIgPT0gMHgwYjBmOwotfQotCi1zdGF0aWMgcmF3X3NwaW5sb2NrX3QgZGllX2xvY2sgPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7Ci1zdGF0aWMgaW50IGRpZV9vd25lciA9IC0xOwotc3RhdGljIHVuc2lnbmVkIGludCBkaWVfbmVzdF9jb3VudDsKLQotdW5zaWduZWQgX19rcHJvYmVzIGxvbmcgb29wc19iZWdpbih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlvb3BzX2VudGVyKCk7Ci0KLQlpZiAoZGllX293bmVyICE9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpIHsKLQkJY29uc29sZV92ZXJib3NlKCk7Ci0JCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCV9fcmF3X3NwaW5fbG9jaygmZGllX2xvY2spOwotCQlkaWVfb3duZXIgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWRpZV9uZXN0X2NvdW50ID0gMDsKLQkJYnVzdF9zcGlubG9ja3MoMSk7Ci0JfSBlbHNlIHsKLQkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl9Ci0JZGllX25lc3RfY291bnQrKzsKLQlyZXR1cm4gZmxhZ3M7Ci19Ci0KLXZvaWQgX19rcHJvYmVzIG9vcHNfZW5kKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2lnbnIpCi17Ci0JYnVzdF9zcGlubG9ja3MoMCk7Ci0JZGllX293bmVyID0gLTE7Ci0JYWRkX3RhaW50KFRBSU5UX0RJRSk7Ci0JX19yYXdfc3Bpbl91bmxvY2soJmRpZV9sb2NrKTsKLQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JaWYgKCFyZWdzKQotCQlyZXR1cm47Ci0KLQlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpKQotCQljcmFzaF9rZXhlYyhyZWdzKTsKLQotCWlmIChpbl9pbnRlcnJ1cHQoKSkKLQkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKLQotCWlmIChwYW5pY19vbl9vb3BzKQotCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7Ci0KLQlvb3BzX2V4aXQoKTsKLQlkb19leGl0KHNpZ25yKTsKLX0KLQotaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKLXsKLQl1bnNpZ25lZCBzaG9ydCBzczsKLQl1bnNpZ25lZCBsb25nIHNwOwotCi0JcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlMDRseCBbIyVkXSAiLCBzdHIsIGVyciAmIDB4ZmZmZiwgKytkaWVfY291bnRlcik7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQlwcmludGsoIlBSRUVNUFQgIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU01QCi0JcHJpbnRrKCJTTVAgIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCi0JcHJpbnRrKCJERUJVR19QQUdFQUxMT0MiKTsKLSNlbmRpZgotCXByaW50aygiXG4iKTsKLQlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsCi0JCQljdXJyZW50LT50aHJlYWQudHJhcF9ubywgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCi0JCXJldHVybiAxOwotCi0Jc2hvd19yZWdpc3RlcnMocmVncyk7Ci0JLyogRXhlY3V0aXZlIHN1bW1hcnkgaW4gY2FzZSB0aGUgb29wcyBzY3JvbGxlZCBhd2F5ICovCi0Jc3AgPSAodW5zaWduZWQgbG9uZykgKCZyZWdzLT5zcCk7Ci0Jc2F2ZXNlZ21lbnQoc3MsIHNzKTsKLQlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCXNwID0gcmVncy0+c3A7Ci0JCXNzID0gcmVncy0+c3MgJiAweGZmZmY7Ci0JfQotCXByaW50ayhLRVJOX0VNRVJHICJFSVA6IFs8JTA4bHg+XSAiLCByZWdzLT5pcCk7Ci0JcHJpbnRfc3ltYm9sKCIlcyIsIHJlZ3MtPmlwKTsKLQlwcmludGsoIiBTUzpFU1AgJTA0eDolMDhseFxuIiwgc3MsIHNwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgaXMgZ29uZSB0aHJvdWdoIHdoZW4gc29tZXRoaW5nIGluIHRoZSBrZXJuZWwgaGFzIGRvbmUgc29tZXRoaW5nIGJhZAotICogYW5kIGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWQ6Ci0gKi8KLXZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvb3BzX2JlZ2luKCk7Ci0KLQlpZiAoZGllX25lc3RfY291bnQgPCAzKSB7Ci0JCXJlcG9ydF9idWcocmVncy0+aXAsIHJlZ3MpOwotCi0JCWlmIChfX2RpZShzdHIsIHJlZ3MsIGVycikpCi0JCQlyZWdzID0gTlVMTDsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FTUVSRyAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKLQl9Ci0KLQlvb3BzX2VuZChmbGFncywgcmVncywgU0lHU0VHVik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKLXsKLQlpZiAoIXVzZXJfbW9kZV92bShyZWdzKSkKLQkJZGllKHN0ciwgcmVncywgZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgX19rcHJvYmVzCi1kb190cmFwKGludCB0cmFwbnIsIGludCBzaWduciwgY2hhciAqc3RyLCBpbnQgdm04Niwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JbG9uZyBlcnJvcl9jb2RlLCBzaWdpbmZvX3QgKmluZm8pCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCi0JaWYgKHJlZ3MtPmZsYWdzICYgWDg2X1ZNX01BU0spIHsKLQkJaWYgKHZtODYpCi0JCQlnb3RvIHZtODZfdHJhcDsKLQkJZ290byB0cmFwX3NpZ25hbDsKLQl9Ci0KLQlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJZ290byBrZXJuZWxfdHJhcDsKLQotdHJhcF9zaWduYWw6Ci0JLyoKLQkgKiBXZSB3YW50IGVycm9yX2NvZGUgYW5kIHRyYXBfbm8gc2V0IGZvciB1c2Vyc3BhY2UgZmF1bHRzIGFuZAotCSAqIGtlcm5lbHNwYWNlIGZhdWx0cyB3aGljaCByZXN1bHQgaW4gZGllKCksIGJ1dCBub3QKLQkgKiBrZXJuZWxzcGFjZSBmYXVsdHMgd2hpY2ggYXJlIGZpeGVkIHVwLiAgZGllKCkgZ2l2ZXMgdGhlCi0JICogcHJvY2VzcyBubyBjaGFuY2UgdG8gaGFuZGxlIHRoZSBzaWduYWwgYW5kIG5vdGljZSB0aGUKLQkgKiBrZXJuZWwgZmF1bHQgaW5mb3JtYXRpb24sIHNvIHRoYXQgd29uJ3QgcmVzdWx0IGluIHBvbGx1dGluZwotCSAqIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91c2x5IHF1ZXVlZCwgYnV0IG5vdCB5ZXQKLQkgKiBkZWxpdmVyZWQsIGZhdWx0cy4gIFNlZSBhbHNvIGRvX2dlbmVyYWxfcHJvdGVjdGlvbiBiZWxvdy4KLQkgKi8KLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLQl0c2stPnRocmVhZC50cmFwX25vID0gdHJhcG5yOwotCi0JaWYgKGluZm8pCi0JCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCBpbmZvLCB0c2spOwotCWVsc2UKLQkJZm9yY2Vfc2lnKHNpZ25yLCB0c2spOwotCXJldHVybjsKLQota2VybmVsX3RyYXA6Ci0JaWYgKCFmaXh1cF9leGNlcHRpb24ocmVncykpIHsKLQkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7Ci0JCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7Ci0JCWRpZShzdHIsIHJlZ3MsIGVycm9yX2NvZGUpOwotCX0KLQlyZXR1cm47Ci0KLXZtODZfdHJhcDoKLQlpZiAoaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywKLQkJCQkJCWVycm9yX2NvZGUsIHRyYXBucikpCi0JCWdvdG8gdHJhcF9zaWduYWw7Ci0JcmV0dXJuOwotfQotCi0jZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkJCQkJXAotdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkJCQlcCi17CQkJCQkJCQkJXAotCXRyYWNlX2hhcmRpcnFzX2ZpeHVwKCk7CQkJCQkJXAotCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpCVwKLQkJCQkJCQk9PSBOT1RJRllfU1RPUCkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMCwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CQlcCi19Ci0KLSNkZWZpbmUgRE9fRVJST1JfSU5GTyh0cmFwbnIsIHNpZ25yLCBzdHIsIG5hbWUsIHNpY29kZSwgc2lhZGRyLCBpcnEpCVwKLXZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCQkJXAotewkJCQkJCQkJCVwKLQlzaWdpbmZvX3QgaW5mbzsJCQkJCQkJXAotCWlmIChpcnEpCQkJCQkJCVwKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwkJCQkJXAotCWluZm8uc2lfc2lnbm8gPSBzaWducjsJCQkJCQlcCi0JaW5mby5zaV9lcnJubyA9IDA7CQkJCQkJXAotCWluZm8uc2lfY29kZSA9IHNpY29kZTsJCQkJCQlcCi0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopc2lhZGRyOwkJCQlcCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgdHJhcG5yLCBzaWducikJXAotCQkJCQkJCT09IE5PVElGWV9TVE9QKQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCAwLCByZWdzLCBlcnJvcl9jb2RlLCAmaW5mbyk7CVwKLX0KLQotI2RlZmluZSBET19WTTg2X0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkJCQkJXAotdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkJCQlcCi17CQkJCQkJCQkJXAotCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpCVwKLQkJCQkJCQk9PSBOT1RJRllfU1RPUCkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CQlcCi19Ci0KLSNkZWZpbmUgRE9fVk04Nl9FUlJPUl9JTkZPKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSwgc2ljb2RlLCBzaWFkZHIpCVwKLXZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCQkJXAotewkJCQkJCQkJCVwKLQlzaWdpbmZvX3QgaW5mbzsJCQkJCQkJXAotCWluZm8uc2lfc2lnbm8gPSBzaWducjsJCQkJCQlcCi0JaW5mby5zaV9lcnJubyA9IDA7CQkJCQkJXAotCWluZm8uc2lfY29kZSA9IHNpY29kZTsJCQkJCQlcCi0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopc2lhZGRyOwkJCQlcCi0JdHJhY2VfaGFyZGlycXNfZml4dXAoKTsJCQkJCQlcCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgdHJhcG5yLCBzaWducikJXAotCQkJCQkJCT09IE5PVElGWV9TVE9QKQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCAxLCByZWdzLCBlcnJvcl9jb2RlLCAmaW5mbyk7CVwKLX0KLQotRE9fVk04Nl9FUlJPUl9JTkZPKDAsIFNJR0ZQRSwgImRpdmlkZSBlcnJvciIsIGRpdmlkZV9lcnJvciwgRlBFX0lOVERJViwgcmVncy0+aXApCi0jaWZuZGVmIENPTkZJR19LUFJPQkVTCi1ET19WTTg2X0VSUk9SKDMsIFNJR1RSQVAsICJpbnQzIiwgaW50MykKLSNlbmRpZgotRE9fVk04Nl9FUlJPUig0LCBTSUdTRUdWLCAib3ZlcmZsb3ciLCBvdmVyZmxvdykKLURPX1ZNODZfRVJST1IoNSwgU0lHU0VHViwgImJvdW5kcyIsIGJvdW5kcykKLURPX0VSUk9SX0lORk8oNiwgU0lHSUxMLCAiaW52YWxpZCBvcGNvZGUiLCBpbnZhbGlkX29wLCBJTExfSUxMT1BOLCByZWdzLT5pcCwgMCkKLURPX0VSUk9SKDksIFNJR0ZQRSwgImNvcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biIsIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bikKLURPX0VSUk9SKDEwLCBTSUdTRUdWLCAiaW52YWxpZCBUU1MiLCBpbnZhbGlkX1RTUykKLURPX0VSUk9SKDExLCBTSUdCVVMsICJzZWdtZW50IG5vdCBwcmVzZW50Iiwgc2VnbWVudF9ub3RfcHJlc2VudCkKLURPX0VSUk9SKDEyLCBTSUdCVVMsICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKLURPX0VSUk9SX0lORk8oMTcsIFNJR0JVUywgImFsaWdubWVudCBjaGVjayIsIGFsaWdubWVudF9jaGVjaywgQlVTX0FEUkFMTiwgMCwgMCkKLURPX0VSUk9SX0lORk8oMzIsIFNJR0lMTCwgImlyZXQgZXhjZXB0aW9uIiwgaXJldF9lcnJvciwgSUxMX0JBRFNUSywgMCwgMSkKLQotdm9pZCBfX2twcm9iZXMKLWRvX2dlbmVyYWxfcHJvdGVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQ7Ci0Jc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKLQlpbnQgY3B1OwotCi0JY3B1ID0gZ2V0X2NwdSgpOwotCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwotCXRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7Ci0KLQkvKgotCSAqIFBlcmZvcm0gdGhlIGxhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBJZiB0aGUgVFNTIGhhcyBhbgotCSAqIGludmFsaWQgb2Zmc2V0IHNldCAodGhlIExBWlkgb25lKSBhbmQgdGhlIGZhdWx0aW5nIHRocmVhZCBoYXMKLQkgKiBhIHZhbGlkIEkvTyBiaXRtYXAgcG9pbnRlciwgd2UgY29weSB0aGUgSS9PIGJpdG1hcCBpbiB0aGUgVFNTCi0JICogYW5kIHdlIHNldCB0aGUgb2Zmc2V0IGZpZWxkIGNvcnJlY3RseS4gVGhlbiB3ZSBsZXQgdGhlIENQVSB0bwotCSAqIHJlc3RhcnQgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLgotCSAqLwotCWlmICh0c3MtPng4Nl90c3MuaW9fYml0bWFwX2Jhc2UgPT0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUX0xBWlkgJiYKLQkgICAgdGhyZWFkLT5pb19iaXRtYXBfcHRyKSB7Ci0JCW1lbWNweSh0c3MtPmlvX2JpdG1hcCwgdGhyZWFkLT5pb19iaXRtYXBfcHRyLAotCQkgICAgICAgdGhyZWFkLT5pb19iaXRtYXBfbWF4KTsKLQkJLyoKLQkJICogSWYgdGhlIHByZXZpb3VzbHkgc2V0IG1hcCB3YXMgZXh0ZW5kaW5nIHRvIGhpZ2hlciBwb3J0cwotCQkgKiB0aGFuIHRoZSBjdXJyZW50IG9uZSwgcGFkIGV4dHJhIHNwYWNlIHdpdGggMHhmZiAobm8gYWNjZXNzKS4KLQkJICovCi0JCWlmICh0aHJlYWQtPmlvX2JpdG1hcF9tYXggPCB0c3MtPmlvX2JpdG1hcF9tYXgpIHsKLQkJCW1lbXNldCgoY2hhciAqKSB0c3MtPmlvX2JpdG1hcCArCi0JCQkJdGhyZWFkLT5pb19iaXRtYXBfbWF4LCAweGZmLAotCQkJCXRzcy0+aW9fYml0bWFwX21heCAtIHRocmVhZC0+aW9fYml0bWFwX21heCk7Ci0JCX0KLQkJdHNzLT5pb19iaXRtYXBfbWF4ID0gdGhyZWFkLT5pb19iaXRtYXBfbWF4OwotCQl0c3MtPng4Nl90c3MuaW9fYml0bWFwX2Jhc2UgPSBJT19CSVRNQVBfT0ZGU0VUOwotCQl0c3MtPmlvX2JpdG1hcF9vd25lciA9IHRocmVhZDsKLQkJcHV0X2NwdSgpOwotCi0JCXJldHVybjsKLQl9Ci0JcHV0X2NwdSgpOwotCi0JaWYgKHJlZ3MtPmZsYWdzICYgWDg2X1ZNX01BU0spCi0JCWdvdG8gZ3BfaW5fdm04NjsKLQotCXRzayA9IGN1cnJlbnQ7Ci0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JCWdvdG8gZ3BfaW5fa2VybmVsOwotCi0JdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7Ci0JdHNrLT50aHJlYWQudHJhcF9ubyA9IDEzOwotCi0JaWYgKHNob3dfdW5oYW5kbGVkX3NpZ25hbHMgJiYgdW5oYW5kbGVkX3NpZ25hbCh0c2ssIFNJR1NFR1YpICYmCi0JCQlwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJIiVzWyVkXSBnZW5lcmFsIHByb3RlY3Rpb24gaXA6JWx4IHNwOiVseCBlcnJvcjolbHgiLAotCQkJdHNrLT5jb21tLCB0YXNrX3BpZF9ucih0c2spLAotCQkJcmVncy0+aXAsIHJlZ3MtPnNwLCBlcnJvcl9jb2RlKTsKLQkJcHJpbnRfdm1hX2FkZHIoIiBpbiAiLCByZWdzLT5pcCk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKLQlyZXR1cm47Ci0KLWdwX2luX3ZtODY6Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCWhhbmRsZV92bTg2X2ZhdWx0KChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKSByZWdzLCBlcnJvcl9jb2RlKTsKLQlyZXR1cm47Ci0KLWdwX2luX2tlcm5lbDoKLQlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQotCQlyZXR1cm47Ci0KLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLQl0c2stPnRocmVhZC50cmFwX25vID0gMTM7Ci0JaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCi0JCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JZGllKCJnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlKTsKLX0KLQotc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKLW1lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXByaW50ayhLRVJOX0VNRVJHCi0JCSJVaGh1aC4gTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCi0JCQlyZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KLQlwcmludGsoS0VSTl9FTUVSRwotCQkiWW91IGhhdmUgc29tZSBoYXJkd2FyZSBwcm9ibGVtLCBsaWtlbHkgb24gdGhlIFBDSSBidXMuXG4iKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0VEQUMpCi0JaWYgKGVkYWNfaGFuZGxlcl9zZXQoKSkgewotCQllZGFjX2F0b21pY19hc3NlcnRfZXJyb3IoKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKLQkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotCi0JLyogQ2xlYXIgYW5kIGRpc2FibGUgdGhlIG1lbW9yeSBwYXJpdHkgZXJyb3IgbGluZS4gKi8KLQljbGVhcl9tZW1fZXJyb3IocmVhc29uKTsKLX0KLQotc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKLWlvX2NoZWNrX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlwcmludGsoS0VSTl9FTUVSRyAiTk1JOiBJT0NLIGVycm9yIChkZWJ1ZyBpbnRlcnJ1cHQ/KVxuIik7Ci0Jc2hvd19yZWdpc3RlcnMocmVncyk7Ci0KLQkvKiBSZS1lbmFibGUgdGhlIElPQ0sgbGluZSwgd2FpdCBmb3IgYSBmZXcgc2Vjb25kcyAqLwotCXJlYXNvbiA9IChyZWFzb24gJiAweGYpIHwgODsKLQlvdXRiKHJlYXNvbiwgMHg2MSk7Ci0KLQlpID0gMjAwMDsKLQl3aGlsZSAoLS1pKQotCQl1ZGVsYXkoMTAwMCk7Ci0KLQlyZWFzb24gJj0gfjg7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOwotfQotCi1zdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZAotdW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlmIChub3RpZnlfZGllKERJRV9OTUlVTktOT1dOLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0jaWZkZWYgQ09ORklHX01DQQotCS8qCi0JICogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQotCSAqIGlzOgotCSAqLwotCWlmIChNQ0FfYnVzKSB7Ci0JCW1jYV9oYW5kbGVfbm1pKCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQlwcmludGsoS0VSTl9FTUVSRwotCQkiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAotCQkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JcHJpbnRrKEtFUk5fRU1FUkcgIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7Ci0JaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKLQkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotfQotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5taV9wcmludF9sb2NrKTsKLQotdm9pZCBub3RyYWNlIF9fa3Byb2JlcyBkaWVfbm1pKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBkb19wYW5pYykKLXsKLQlpZiAobm90aWZ5X2RpZShESUVfTk1JV0FUQ0hET0csIHN0ciwgcmVncywgMCwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZubWlfcHJpbnRfbG9jayk7Ci0JLyoKLQkqIFdlIGFyZSBpbiB0cm91YmxlIGFueXdheSwgbGV0cyBhdCBsZWFzdCB0cnkKLQkqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0OgotCSovCi0JYnVzdF9zcGlubG9ja3MoMSk7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIiVzIiwgc3RyKTsKLQlwcmludGsoIiBvbiBDUFUlZCwgaXAgJTA4bHgsIHJlZ2lzdGVyczpcbiIsCi0JCXNtcF9wcm9jZXNzb3JfaWQoKSwgcmVncy0+aXApOwotCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotCWlmIChkb19wYW5pYykKLQkJcGFuaWMoIk5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQiKTsKLQljb25zb2xlX3NpbGVudCgpOwotCXNwaW5fdW5sb2NrKCZubWlfcHJpbnRfbG9jayk7Ci0JYnVzdF9zcGlubG9ja3MoMCk7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBpbiBrZXJuZWwgd2UgYXJlIHByb2JhYmx5IG5lc3RlZCB1cCBwcmV0dHkgYmFkCi0JICogYW5kIG1pZ2h0IGFzd2VsbCBnZXQgb3V0IG5vdyB3aGlsZSB3ZSBzdGlsbCBjYW46Ci0JICovCi0JaWYgKCF1c2VyX21vZGVfdm0ocmVncykpIHsKLQkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAyOwotCQljcmFzaF9rZXhlYyhyZWdzKTsKLQl9Ci0KLQlkb19leGl0KFNJR1NFR1YpOwotfQotCi1zdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBjaGFyIHJlYXNvbiA9IDA7Ci0JaW50IGNwdTsKLQotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCS8qIE9ubHkgdGhlIEJTUCBnZXRzIGV4dGVybmFsIE5NSXMgZnJvbSB0aGUgc3lzdGVtLiAqLwotCWlmICghY3B1KQotCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOwotCi0JaWYgKCEocmVhc29uICYgMHhjMCkpIHsKLQkJaWYgKG5vdGlmeV9kaWUoRElFX05NSV9JUEksICJubWlfaXBpIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCi0JCQkJCQkJCT09IE5PVElGWV9TVE9QKQotCQkJcmV0dXJuOwotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCQkvKgotCQkgKiBPaywgc28gdGhpcyBpcyBub25lIG9mIHRoZSBkb2N1bWVudGVkIE5NSSBzb3VyY2VzLAotCQkgKiBzbyBpdCBtdXN0IGJlIHRoZSBOTUkgd2F0Y2hkb2cuCi0JCSAqLwotCQlpZiAobm1pX3dhdGNoZG9nX3RpY2socmVncywgcmVhc29uKSkKLQkJCXJldHVybjsKLQkJaWYgKCFkb19ubWlfY2FsbGJhY2socmVncywgY3B1KSkKLQkJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7Ci0jZWxzZQotCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOwotI2VuZGlmCi0KLQkJcmV0dXJuOwotCX0KLQlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0KLQkvKiBBSzogZm9sbG93aW5nIGNoZWNrcyBzZWVtIHRvIGJlIGJyb2tlbiBvbiBtb2Rlcm4gY2hpcHNldHMuIEZJWE1FICovCi0JaWYgKHJlYXNvbiAmIDB4ODApCi0JCW1lbV9wYXJpdHlfZXJyb3IocmVhc29uLCByZWdzKTsKLQlpZiAocmVhc29uICYgMHg0MCkKLQkJaW9fY2hlY2tfZXJyb3IocmVhc29uLCByZWdzKTsKLQkvKgotCSAqIFJlYXNzZXJ0IE5NSSBpbiBjYXNlIGl0IGJlY2FtZSBhY3RpdmUgbWVhbndoaWxlCi0JICogYXMgaXQncyBlZGdlLXRyaWdnZXJlZDoKLQkgKi8KLQlyZWFzc2VydF9ubWkoKTsKLX0KLQotbm90cmFjZSBfX2twcm9iZXMgdm9pZCBkb19ubWkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLXsKLQlpbnQgY3B1OwotCi0Jbm1pX2VudGVyKCk7Ci0KLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkrK25taV9jb3VudChjcHUpOwotCi0JaWYgKCFpZ25vcmVfbm1pcykKLQkJZGVmYXVsdF9kb19ubWkocmVncyk7Ci0KLQlubWlfZXhpdCgpOwotfQotCi12b2lkIHN0b3Bfbm1pKHZvaWQpCi17Ci0JYWNwaV9ubWlfZGlzYWJsZSgpOwotCWlnbm9yZV9ubWlzKys7Ci19Ci0KLXZvaWQgcmVzdGFydF9ubWkodm9pZCkKLXsKLQlpZ25vcmVfbm1pcy0tOwotCWFjcGlfbm1pX2VuYWJsZSgpOwotfQotCi0jaWZkZWYgQ09ORklHX0tQUk9CRVMKLXZvaWQgX19rcHJvYmVzIGRvX2ludDMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLXsKLQl0cmFjZV9oYXJkaXJxc19maXh1cCgpOwotCi0JaWYgKG5vdGlmeV9kaWUoRElFX0lOVDMsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgMywgU0lHVFJBUCkKLQkJCT09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JLyoKLQkgKiBUaGlzIGlzIGFuIGludGVycnVwdCBnYXRlLCBiZWNhdXNlIGtwcm9iZXMgd2FudHMgaW50ZXJydXB0cwotCSAqIGRpc2FibGVkLiBOb3JtYWwgdHJhcCBoYW5kbGVycyBkb24ndC4KLQkgKi8KLQlyZXN0b3JlX2ludGVycnVwdHMocmVncyk7Ci0KLQlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIE91ciBoYW5kbGluZyBvZiB0aGUgcHJvY2Vzc29yIGRlYnVnIHJlZ2lzdGVycyBpcyBub24tdHJpdmlhbC4KLSAqIFdlIGRvIG5vdCBjbGVhciB0aGVtIG9uIGVudHJ5IGFuZCBleGl0IGZyb20gdGhlIGtlcm5lbC4gVGhlcmVmb3JlCi0gKiBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYSB3YXRjaHBvaW50IHRyYXAgaGVyZSBmcm9tIGluc2lkZSB0aGUga2VybmVsLgotICogSG93ZXZlciwgdGhlIGNvZGUgaW4gLi9wdHJhY2UuYyBoYXMgZW5zdXJlZCB0aGF0IHRoZSB1c2VyIGNhbgotICogb25seSBzZXQgd2F0Y2hwb2ludHMgb24gdXNlcnNwYWNlIGFkZHJlc3Nlcy4gVGhlcmVmb3JlIHRoZSBpbi1rZXJuZWwKLSAqIHdhdGNocG9pbnQgdHJhcCBjYW4gb25seSBvY2N1ciBpbiBjb2RlIHdoaWNoIGlzIHJlYWRpbmcvd3JpdGluZwotICogZnJvbSB1c2VyIHNwYWNlLiBTdWNoIGNvZGUgbXVzdCBub3QgaG9sZCBrZXJuZWwgbG9ja3MgKHNpbmNlIGl0Ci0gKiBjYW4gZXF1YWxseSB0YWtlIGEgcGFnZSBmYXVsdCksIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGNhbGwKLSAqIGZvcmNlX3NpZ19pbmZvIGV2ZW4gdGhvdWdoIHRoYXQgY2xhaW1zIGFuZCByZWxlYXNlcyBsb2Nrcy4KLSAqCi0gKiBDb2RlIGluIC4vc2lnbmFsLmMgZW5zdXJlcyB0aGF0IHRoZSBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyCi0gKiBpcyByZXN0b3JlZCBiZWZvcmUgd2UgZGVsaXZlciBhbnkgc2lnbmFsLCBhbmQgdGhlcmVmb3JlIHRoYXQKLSAqIHVzZXIgY29kZSBydW5zIHdpdGggdGhlIGNvcnJlY3QgZGVidWcgY29udHJvbCByZWdpc3RlciBldmVuIHRob3VnaAotICogd2UgY2xlYXIgaXQgaGVyZS4KLSAqCi0gKiBCZWluZyBjYXJlZnVsIGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGJlIGFzIGNhcmVmdWwgaW4gYQotICogbG90IG9mIG1vcmUgY29tcGxpY2F0ZWQgcGxhY2VzICh0YXNrIHN3aXRjaGluZyBjYW4gYmUgYSBiaXQgbGF6eQotICogYWJvdXQgcmVzdG9yaW5nIGFsbCB0aGUgZGVidWcgc3RhdGUsIGFuZCBwdHJhY2UgZG9lc24ndCBoYXZlIHRvCi0gKiBmaW5kIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgdGhlIFRGIGJpdCB0aGF0IGNvdWxkIGJlIHNhdmVkIGF3YXkgZXZlbgotICogYnkgdXNlciBjb2RlKQotICovCi12b2lkIF9fa3Byb2JlcyBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQl1bnNpZ25lZCBpbnQgY29uZGl0aW9uOwotCi0JdHJhY2VfaGFyZGlycXNfZml4dXAoKTsKLQotCWdldF9kZWJ1Z3JlZyhjb25kaXRpb24sIDYpOwotCi0JLyoKLQkgKiBUaGUgcHJvY2Vzc29yIGNsZWFyZWQgQlRGLCBzbyBkb24ndCBtYXJrIHRoYXQgd2UgbmVlZCBpdCBzZXQuCi0JICovCi0JY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX0RFQlVHQ1RMTVNSKTsKLQl0c2stPnRocmVhZC5kZWJ1Z2N0bG1zciA9IDA7Ci0KLQlpZiAobm90aWZ5X2RpZShESUVfREVCVUcsICJkZWJ1ZyIsIHJlZ3MsIGNvbmRpdGlvbiwgZXJyb3JfY29kZSwKLQkJCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JLyogSXQncyBzYWZlIHRvIGFsbG93IGlycSdzIGFmdGVyIERSNiBoYXMgYmVlbiBzYXZlZCAqLwotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCS8qIE1hc2sgb3V0IHNwdXJpb3VzIGRlYnVnIHRyYXBzIGR1ZSB0byBsYXp5IERSNyBzZXR0aW5nICovCi0JaWYgKGNvbmRpdGlvbiAmIChEUl9UUkFQMHxEUl9UUkFQMXxEUl9UUkFQMnxEUl9UUkFQMykpIHsKLQkJaWYgKCF0c2stPnRocmVhZC5kZWJ1Z3JlZzcpCi0JCQlnb3RvIGNsZWFyX2RyNzsKLQl9Ci0KLQlpZiAocmVncy0+ZmxhZ3MgJiBYODZfVk1fTUFTSykKLQkJZ290byBkZWJ1Z192bTg2OwotCi0JLyogU2F2ZSBkZWJ1ZyBzdGF0dXMgcmVnaXN0ZXIgd2hlcmUgcHRyYWNlIGNhbiBzZWUgaXQgKi8KLQl0c2stPnRocmVhZC5kZWJ1Z3JlZzYgPSBjb25kaXRpb247Ci0KLQkvKgotCSAqIFNpbmdsZS1zdGVwcGluZyB0aHJvdWdoIFRGOiBtYWtlIHN1cmUgd2UgaWdub3JlIGFueSBldmVudHMgaW4KLQkgKiBrZXJuZWwgc3BhY2UgKGJ1dCByZS1lbmFibGUgVEYgd2hlbiByZXR1cm5pbmcgdG8gdXNlciBtb2RlKS4KLQkgKi8KLQlpZiAoY29uZGl0aW9uICYgRFJfU1RFUCkgewotCQkvKgotCQkgKiBXZSBhbHJlYWR5IGNoZWNrZWQgdjg2IG1vZGUgYWJvdmUsIHNvIHdlIGNhbgotCQkgKiBjaGVjayBmb3Iga2VybmVsIG1vZGUgYnkganVzdCBjaGVja2luZyB0aGUgQ1BMCi0JCSAqIG9mIENTLgotCQkgKi8KLQkJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCQlnb3RvIGNsZWFyX1RGX3JlZW5hYmxlOwotCX0KLQotCS8qIE9rLCBmaW5hbGx5IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlICovCi0Jc2VuZF9zaWd0cmFwKHRzaywgcmVncywgZXJyb3JfY29kZSk7Ci0KLQkvKgotCSAqIERpc2FibGUgYWRkaXRpb25hbCB0cmFwcy4gVGhleSdsbCBiZSByZS1lbmFibGVkIHdoZW4KLQkgKiB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZC4KLQkgKi8KLWNsZWFyX2RyNzoKLQlzZXRfZGVidWdyZWcoMCwgNyk7Ci0JcmV0dXJuOwotCi1kZWJ1Z192bTg2OgotCWhhbmRsZV92bTg2X3RyYXAoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopIHJlZ3MsIGVycm9yX2NvZGUsIDEpOwotCXJldHVybjsKLQotY2xlYXJfVEZfcmVlbmFibGU6Ci0Jc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TSU5HTEVTVEVQKTsKLQlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBOb3RlIHRoYXQgd2UgcGxheSBhcm91bmQgd2l0aCB0aGUgJ1RTJyBiaXQgaW4gYW4gYXR0ZW1wdCB0byBnZXQKLSAqIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXN5bmNocm9ub3VzCi0gKiBJUlExMyBiZWhhdmlvdXIKLSAqLwotdm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICppcCkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0Jc2lnaW5mb190IGluZm87Ci0JdW5zaWduZWQgc2hvcnQgY3dkLCBzd2Q7Ci0KLQkvKgotCSAqIFNhdmUgdGhlIGluZm8gZm9yIHRoZSBleGNlcHRpb24gaGFuZGxlciBhbmQgY2xlYXIgdGhlIGVycm9yLgotCSAqLwotCXRhc2sgPSBjdXJyZW50OwotCXNhdmVfaW5pdF9mcHUodGFzayk7Ci0JdGFzay0+dGhyZWFkLnRyYXBfbm8gPSAxNjsKLQl0YXNrLT50aHJlYWQuZXJyb3JfY29kZSA9IDA7Ci0JaW5mby5zaV9zaWdubyA9IFNJR0ZQRTsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2NvZGUgPSBfX1NJX0ZBVUxUOwotCWluZm8uc2lfYWRkciA9IGlwOwotCS8qCi0JICogKH5jd2QgJiBzd2QpIHdpbGwgbWFzayBvdXQgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3Qgc2V0IHRvIHVubWFza2VkCi0JICogc3RhdHVzLiAgMHgzZiBpcyB0aGUgZXhjZXB0aW9uIGJpdHMgaW4gdGhlc2UgcmVncywgMHgyMDAgaXMgdGhlCi0JICogQzEgcmVnIHlvdSBuZWVkIGluIGNhc2Ugb2YgYSBzdGFjayBmYXVsdCwgMHgwNDAgaXMgdGhlIHN0YWNrCi0JICogZmF1bHQgYml0LiAgV2Ugc2hvdWxkIG9ubHkgYmUgdGFraW5nIG9uZSBleGNlcHRpb24gYXQgYSB0aW1lLAotCSAqIHNvIGlmIHRoaXMgY29tYmluYXRpb24gZG9lc24ndCBwcm9kdWNlIGFueSBzaW5nbGUgZXhjZXB0aW9uLAotCSAqIHRoZW4gd2UgaGF2ZSBhIGJhZCBwcm9ncmFtIHRoYXQgaXNuJ3Qgc3luY2hyb25pemluZyBpdHMgRlBVIHVzYWdlCi0JICogYW5kIGl0IHdpbGwgc3VmZmVyIHRoZSBjb25zZXF1ZW5jZXMgc2luY2Ugd2Ugd29uJ3QgYmUgYWJsZSB0bwotCSAqIGZ1bGx5IHJlcHJvZHVjZSB0aGUgY29udGV4dCBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JY3dkID0gZ2V0X2ZwdV9jd2QodGFzayk7Ci0Jc3dkID0gZ2V0X2ZwdV9zd2QodGFzayk7Ci0Jc3dpdGNoIChzd2QgJiB+Y3dkICYgMHgzZikgewotCWNhc2UgMHgwMDA6IC8qIE5vIHVubWFza2VkIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm47Ci0JZGVmYXVsdDogLyogTXVsdGlwbGUgZXhjZXB0aW9ucyAqLwotCQlicmVhazsKLQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCi0JCS8qCi0JCSAqIHN3ZCAmIDB4MjQwID09IDB4MDQwOiBTdGFjayBVbmRlcmZsb3cKLQkJICogc3dkICYgMHgyNDAgPT0gMHgyNDA6IFN0YWNrIE92ZXJmbG93Ci0JCSAqIFVzZXIgbXVzdCBjbGVhciB0aGUgU0YgYml0ICgweDQwKSBpZiBzZXQKLQkJICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDI6IC8qIERlbm9ybWFsaXplICovCi0JY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRVTkQ7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRESVY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRPVkY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUUkVTOwotCQlicmVhazsKLQl9Ci0JZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgdGFzayk7Ci19Ci0KLXZvaWQgZG9fY29wcm9jZXNzb3JfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLXsKLQlpZ25vcmVfZnB1X2lycSA9IDE7Ci0JbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5pcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpbWRfbWF0aF9lcnJvcih2b2lkIF9fdXNlciAqaXApCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXNpZ2luZm9fdCBpbmZvOwotCXVuc2lnbmVkIHNob3J0IG14Y3NyOwotCi0JLyoKLQkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KLQkgKi8KLQl0YXNrID0gY3VycmVudDsKLQlzYXZlX2luaXRfZnB1KHRhc2spOwotCXRhc2stPnRocmVhZC50cmFwX25vID0gMTk7Ci0JdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7Ci0JaW5mby5zaV9lcnJubyA9IDA7Ci0JaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKLQlpbmZvLnNpX2FkZHIgPSBpcDsKLQkvKgotCSAqIFRoZSBTSU1EIEZQVSBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LCBhcyB0aGVyZQotCSAqIGlzIG9ubHkgYSBzaW5nbGUgc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXIuICBUaHVzLCB0byBkZXRlcm1pbmUgd2hpY2gKLQkgKiB1bm1hc2tlZCBleGNlcHRpb24gd2FzIGNhdWdodCB3ZSBtdXN0IG1hc2sgdGhlIGV4Y2VwdGlvbiBtYXNrIGJpdHMKLQkgKiBhdCAweDFmODAsIGFuZCB0aGVuIHVzZSB0aGVzZSB0byBtYXNrIHRoZSBleGNlcHRpb24gYml0cyBhdCAweDNmLgotCSAqLwotCW14Y3NyID0gZ2V0X2ZwdV9teGNzcih0YXNrKTsKLQlzd2l0Y2ggKH4oKG14Y3NyICYgMHgxZjgwKSA+PiA3KSAmIChteGNzciAmIDB4M2YpKSB7Ci0JY2FzZSAweDAwMDoKLQlkZWZhdWx0OgotCQlicmVhazsKLQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDI6IC8qIERlbm9ybWFsaXplICovCi0JY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRVTkQ7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRESVY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRPVkY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUUkVTOwotCQlicmVhazsKLQl9Ci0JZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgdGFzayk7Ci19Ci0KLXZvaWQgZG9fc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQotewotCWlmIChjcHVfaGFzX3htbSkgewotCQkvKiBIYW5kbGUgU0lNRCBGUFUgZXhjZXB0aW9ucyBvbiBQSUlJKyBwcm9jZXNzb3JzLiAqLwotCQlpZ25vcmVfZnB1X2lycSA9IDE7Ci0JCXNpbWRfbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5pcCk7Ci0JCXJldHVybjsKLQl9Ci0JLyoKLQkgKiBIYW5kbGUgc3RyYW5nZSBjYWNoZSBmbHVzaCBmcm9tIHVzZXIgc3BhY2UgZXhjZXB0aW9uCi0JICogaW4gYWxsIG90aGVyIGNhc2VzLiAgVGhpcyBpcyB1bmRvY3VtZW50ZWQgYmVoYXZpb3VyLgotCSAqLwotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKSB7Ci0JCWhhbmRsZV92bTg2X2ZhdWx0KChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKXJlZ3MsIGVycm9yX2NvZGUpOwotCQlyZXR1cm47Ci0JfQotCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gMTk7Ci0JY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCWRpZV9pZl9rZXJuZWwoImNhY2hlIGZsdXNoIGRlbmllZCIsIHJlZ3MsIGVycm9yX2NvZGUpOwotCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKLX0KLQotdm9pZCBkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCi17Ci0jaWYgMAotCS8qIE5vIG5lZWQgdG8gd2FybiBhYm91dCB0aGlzIGFueSBsb25nZXIuICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiSWdub3JpbmcgUDYgTG9jYWwgQVBJQyBTcHVyaW91cyBJbnRlcnJ1cHQgQnVnLi4uXG4iKTsKLSNlbmRpZgotfQotCi11bnNpZ25lZCBsb25nIHBhdGNoX2VzcGZpeF9kZXNjKHVuc2lnbmVkIGxvbmcgdWVzcCwgdW5zaWduZWQgbG9uZyBrZXNwKQotewotCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0ID0gZ2V0X2NwdV9nZHRfdGFibGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQl1bnNpZ25lZCBsb25nIGJhc2UgPSAoa2VzcCAtIHVlc3ApICYgLVRIUkVBRF9TSVpFOwotCXVuc2lnbmVkIGxvbmcgbmV3X2tlc3AgPSBrZXNwIC0gYmFzZTsKLQl1bnNpZ25lZCBsb25nIGxpbV9wYWdlcyA9IChuZXdfa2VzcCB8IChUSFJFQURfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwotCV9fdTY0IGRlc2MgPSAqKF9fdTY0ICopJmdkdFtHRFRfRU5UUllfRVNQRklYX1NTXTsKLQotCS8qIFNldCB1cCBiYXNlIGZvciBlc3BmaXggc2VnbWVudCAqLwotCWRlc2MgJj0gMHgwMGYwZmYwMDAwMDAwMDAwVUxMOwotCWRlc2MgfD0JKCgoKF9fdTY0KWJhc2UpIDw8IDE2KSAmIDB4MDAwMDAwZmZmZmZmMDAwMFVMTCkgfAotCQkoKCgoX191NjQpYmFzZSkgPDwgMzIpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB8Ci0JCSgoKChfX3U2NClsaW1fcGFnZXMpIDw8IDMyKSAmIDB4MDAwZjAwMDAwMDAwMDAwMFVMTCkgfAotCQkobGltX3BhZ2VzICYgMHhmZmZmKTsKLQkqKF9fdTY0ICopJmdkdFtHRFRfRU5UUllfRVNQRklYX1NTXSA9IGRlc2M7Ci0KLQlyZXR1cm4gbmV3X2tlc3A7Ci19Ci0KLS8qCi0gKiAnbWF0aF9zdGF0ZV9yZXN0b3JlKCknIHNhdmVzIHRoZSBjdXJyZW50IG1hdGggaW5mb3JtYXRpb24gaW4gdGhlCi0gKiBvbGQgbWF0aCBzdGF0ZSBhcnJheSwgYW5kIGdldHMgdGhlIG5ldyBvbmVzIGZyb20gdGhlIGN1cnJlbnQgdGFzawotICoKLSAqIENhcmVmdWwuLiBUaGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBJQk0tZGVzaWduZWQgSVJRMTMgYmVoYXZpb3VyLgotICogRG9uJ3QgdG91Y2ggdW5sZXNzIHlvdSAqcmVhbGx5KiBrbm93IGhvdyBpdCB3b3Jrcy4KLSAqCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkIChpbiB0aGlzIGNhc2UsCi0gKiBsb2NhbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhdCB0aGUgY2FsbC1zaXRlIGluIGVudHJ5LlMpLgotICovCi1hc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSB0aHJlYWQtPnRhc2s7Ci0KLQlpZiAoIXRza191c2VkX21hdGgodHNrKSkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCS8qCi0JCSAqIGRvZXMgYSBzbGFiIGFsbG9jIHdoaWNoIGNhbiBzbGVlcAotCQkgKi8KLQkJaWYgKGluaXRfZnB1KHRzaykpIHsKLQkJCS8qCi0JCQkgKiByYW4gb3V0IG9mIG1lbW9yeSEKLQkJCSAqLwotCQkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKLQkJCXJldHVybjsKLQkJfQotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCX0KLQotCWNsdHMoKTsJCQkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLwotCXJlc3RvcmVfZnB1KHRzayk7Ci0JdGhyZWFkLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsJLyogU28gd2UgZm5zYXZlIG9uIHN3aXRjaF90bygpICovCi0JdHNrLT5mcHVfY291bnRlcisrOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWF0aF9zdGF0ZV9yZXN0b3JlKTsKLQotI2lmbmRlZiBDT05GSUdfTUFUSF9FTVVMQVRJT04KLQotYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKLXsKLQlwcmludGsoS0VSTl9FTUVSRwotCQkibWF0aC1lbXVsYXRpb24gbm90IGVuYWJsZWQgYW5kIG5vIGNvcHJvY2Vzc29yIGZvdW5kLlxuIik7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgImtpbGxpbmcgJXMuXG4iLCBjdXJyZW50LT5jb21tKTsKLQlmb3JjZV9zaWcoU0lHRlBFLCBjdXJyZW50KTsKLQlzY2hlZHVsZSgpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX01BVEhfRU1VTEFUSU9OICovCi0KLXZvaWQgX19pbml0IHRyYXBfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX0VJU0EKLQl2b2lkIF9faW9tZW0gKnAgPSBlYXJseV9pb3JlbWFwKDB4MEZGRkQ5LCA0KTsKLQotCWlmIChyZWFkbChwKSA9PSAnRScgKyAoJ0knPDw4KSArICgnUyc8PDE2KSArICgnQSc8PDI0KSkKLQkJRUlTQV9idXMgPSAxOwotCWVhcmx5X2lvdW5tYXAocCwgNCk7Ci0jZW5kaWYKLQotCXNldF90cmFwX2dhdGUoMCwgJmRpdmlkZV9lcnJvcik7Ci0Jc2V0X2ludHJfZ2F0ZSgxLCAmZGVidWcpOwotCXNldF9pbnRyX2dhdGUoMiwgJm5taSk7Ci0Jc2V0X3N5c3RlbV9pbnRyX2dhdGUoMywgJmludDMpOyAvKiBpbnQzIGNhbiBiZSBjYWxsZWQgZnJvbSBhbGwgKi8KLQlzZXRfc3lzdGVtX2dhdGUoNCwgJm92ZXJmbG93KTsgLyogaW50NCBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCi0Jc2V0X3RyYXBfZ2F0ZSg1LCAmYm91bmRzKTsKLQlzZXRfdHJhcF9nYXRlKDYsICZpbnZhbGlkX29wKTsKLQlzZXRfdHJhcF9nYXRlKDcsICZkZXZpY2Vfbm90X2F2YWlsYWJsZSk7Ci0Jc2V0X3Rhc2tfZ2F0ZSg4LCBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKLQlzZXRfdHJhcF9nYXRlKDksICZjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pOwotCXNldF90cmFwX2dhdGUoMTAsICZpbnZhbGlkX1RTUyk7Ci0Jc2V0X3RyYXBfZ2F0ZSgxMSwgJnNlZ21lbnRfbm90X3ByZXNlbnQpOwotCXNldF90cmFwX2dhdGUoMTIsICZzdGFja19zZWdtZW50KTsKLQlzZXRfdHJhcF9nYXRlKDEzLCAmZ2VuZXJhbF9wcm90ZWN0aW9uKTsKLQlzZXRfaW50cl9nYXRlKDE0LCAmcGFnZV9mYXVsdCk7Ci0Jc2V0X3RyYXBfZ2F0ZSgxNSwgJnNwdXJpb3VzX2ludGVycnVwdF9idWcpOwotCXNldF90cmFwX2dhdGUoMTYsICZjb3Byb2Nlc3Nvcl9lcnJvcik7Ci0Jc2V0X3RyYXBfZ2F0ZSgxNywgJmFsaWdubWVudF9jaGVjayk7Ci0jaWZkZWYgQ09ORklHX1g4Nl9NQ0UKLQlzZXRfdHJhcF9nYXRlKDE4LCAmbWFjaGluZV9jaGVjayk7Ci0jZW5kaWYKLQlzZXRfdHJhcF9nYXRlKDE5LCAmc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcik7Ci0KLQlpZiAoY3B1X2hhc19meHNyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIGZhc3QgRlBVIHNhdmUgYW5kIHJlc3RvcmUuLi4gIik7Ci0JCXNldF9pbl9jcjQoWDg2X0NSNF9PU0ZYU1IpOwotCQlwcmludGsoImRvbmUuXG4iKTsKLQl9Ci0JaWYgKGNwdV9oYXNfeG1tKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJCSJFbmFibGluZyB1bm1hc2tlZCBTSU1EIEZQVSBleGNlcHRpb24gc3VwcG9ydC4uLiAiKTsKLQkJc2V0X2luX2NyNChYODZfQ1I0X09TWE1NRVhDUFQpOwotCQlwcmludGsoImRvbmUuXG4iKTsKLQl9Ci0KLQlzZXRfc3lzdGVtX2dhdGUoU1lTQ0FMTF9WRUNUT1IsICZzeXN0ZW1fY2FsbCk7Ci0KLQkvKiBSZXNlcnZlIGFsbCB0aGUgYnVpbHRpbiBhbmQgdGhlIHN5c2NhbGwgdmVjdG9yOiAqLwotCWZvciAoaSA9IDA7IGkgPCBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IGkrKykKLQkJc2V0X2JpdChpLCB1c2VkX3ZlY3RvcnMpOwotCi0Jc2V0X2JpdChTWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKLQotCWluaXRfdGhyZWFkX3hzdGF0ZSgpOwotCS8qCi0JICogU2hvdWxkIGJlIGEgYmFycmllciBmb3IgYW55IGV4dGVybmFsIENQVSBzdGF0ZToKLQkgKi8KLQljcHVfaW5pdCgpOwotCi0JdHJhcF9pbml0X2hvb2soKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQga3N0YWNrX3NldHVwKGNoYXIgKnMpCi17Ci0Ja3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImtzdGFjaz0iLCBrc3RhY2tfc2V0dXApOwotCi1zdGF0aWMgaW50IF9faW5pdCBjb2RlX2J5dGVzX3NldHVwKGNoYXIgKnMpCi17Ci0JY29kZV9ieXRlcyA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOwotCWlmIChjb2RlX2J5dGVzID4gODE5MikKLQkJY29kZV9ieXRlcyA9IDgxOTI7Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImNvZGVfYnl0ZXM9IiwgY29kZV9ieXRlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHNfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwc182NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNjYWFjLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwc182NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMiArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCi0gKgotICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0Ci0gKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAotICovCi0KLS8qCi0gKiAnVHJhcHMuYycgaGFuZGxlcyBoYXJkd2FyZSB0cmFwcyBhbmQgZmF1bHRzIGFmdGVyIHdlIGhhdmUgc2F2ZWQgc29tZQotICogc3RhdGUgaW4gJ2VudHJ5LlMnLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bGludXgva2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdW53aW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9idWcuaD4KLSNpbmNsdWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfRURBQykKLSNpbmNsdWRlIDxsaW51eC9lZGFjLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3Vud2luZC5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+Ci0jaW5jbHVkZSA8YXNtL2kzODcuaD4KLSNpbmNsdWRlIDxhc20vbm1pLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0jaW5jbHVkZSA8YXNtL3BkYS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotCi0jaW5jbHVkZSA8bWFjaF90cmFwcy5oPgotCi1pbnQgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pOwotaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDEyOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2RlX2J5dGVzID0gNjQ7Ci1zdGF0aWMgaW50IGlnbm9yZV9ubWlzOwotc3RhdGljIGludCBkaWVfY291bnRlcjsKLQotc3RhdGljIGlubGluZSB2b2lkIGNvbmRpdGlvbmFsX3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpZiAocmVncy0+ZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVlbXB0X2NvbmRpdGlvbmFsX3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbmNfcHJlZW1wdF9jb3VudCgpOwotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByZWVtcHRfY29uZGl0aW9uYWxfY2xpKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JLyogTWFrZSBzdXJlIHRvIG5vdCBzY2hlZHVsZSBoZXJlIGJlY2F1c2Ugd2UgY291bGQgYmUgcnVubmluZwotCSAgIG9uIGFuIGV4Y2VwdGlvbiBzdGFjay4gKi8KLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotfQotCi12b2lkIHByaW50a19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlbGlhYmxlKQotewotCXByaW50aygiIFs8JTAxNmx4Pl0gJXMlcFNcbiIsIGFkZHJlc3MsIHJlbGlhYmxlID8gIiI6ICI/ICIsICh2b2lkICopIGFkZHJlc3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAqaW5fZXhjZXB0aW9uX3N0YWNrKHVuc2lnbmVkIGNwdSwgdW5zaWduZWQgbG9uZyBzdGFjaywKLQkJCQkJdW5zaWduZWQgKnVzZWRwLCBjaGFyICoqaWRwKQotewotCXN0YXRpYyBjaGFyIGlkc1tdWzhdID0gewotCQlbREVCVUdfU1RBQ0sgLSAxXSA9ICIjREIiLAotCQlbTk1JX1NUQUNLIC0gMV0gPSAiTk1JIiwKLQkJW0RPVUJMRUZBVUxUX1NUQUNLIC0gMV0gPSAiI0RGIiwKLQkJW1NUQUNLRkFVTFRfU1RBQ0sgLSAxXSA9ICIjU1MiLAotCQlbTUNFX1NUQUNLIC0gMV0gPSAiI01DIiwKLSNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgotCQlbTl9FWENFUFRJT05fU1RBQ0tTIC4uLiBOX0VYQ0VQVElPTl9TVEFDS1MgKyBERUJVR19TVEtTWiAvIEVYQ0VQVElPTl9TVEtTWiAtIDJdID0gIiNEQls/XSIKLSNlbmRpZgotCX07Ci0JdW5zaWduZWQgazsKLQotCS8qCi0JICogSXRlcmF0ZSBvdmVyIGFsbCBleGNlcHRpb24gc3RhY2tzLCBhbmQgZmlndXJlIG91dCB3aGV0aGVyCi0JICogJ3N0YWNrJyBpcyBpbiBvbmUgb2YgdGhlbToKLQkgKi8KLQlmb3IgKGsgPSAwOyBrIDwgTl9FWENFUFRJT05fU1RBQ0tTOyBrKyspIHsKLQkJdW5zaWduZWQgbG9uZyBlbmQgPSBwZXJfY3B1KG9yaWdfaXN0LCBjcHUpLmlzdFtrXTsKLQkJLyoKLQkJICogSXMgJ3N0YWNrJyBhYm92ZSB0aGlzIGV4Y2VwdGlvbiBmcmFtZSdzIGVuZD8KLQkJICogSWYgeWVzIHRoZW4gc2tpcCB0byB0aGUgbmV4dCBmcmFtZS4KLQkJICovCi0JCWlmIChzdGFjayA+PSBlbmQpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogSXMgJ3N0YWNrJyBhYm92ZSB0aGlzIGV4Y2VwdGlvbiBmcmFtZSdzIHN0YXJ0IGFkZHJlc3M/Ci0JCSAqIElmIHllcyB0aGVuIHdlIGZvdW5kIHRoZSByaWdodCBmcmFtZS4KLQkJICovCi0JCWlmIChzdGFjayA+PSBlbmQgLSBFWENFUFRJT05fU1RLU1opIHsKLQkJCS8qCi0JCQkgKiBNYWtlIHN1cmUgd2Ugb25seSBpdGVyYXRlIHRocm91Z2ggYW4gZXhjZXB0aW9uCi0JCQkgKiBzdGFjayBvbmNlLiBJZiBpdCBjb21lcyB1cCBmb3IgdGhlIHNlY29uZCB0aW1lCi0JCQkgKiB0aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIGdvaW5nIG9uIC0ganVzdAotCQkJICogYnJlYWsgb3V0IGFuZCByZXR1cm4gTlVMTDoKLQkJCSAqLwotCQkJaWYgKCp1c2VkcCAmICgxVSA8PCBrKSkKLQkJCQlicmVhazsKLQkJCSp1c2VkcCB8PSAxVSA8PCBrOwotCQkJKmlkcCA9IGlkc1trXTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWVuZDsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIGEgZGVidWcgc3RhY2ssIGFuZCBpZiBpdCBoYXMgYSBsYXJnZXIgc2l6ZSB0aGFuCi0JCSAqIHRoZSB1c3VhbCBleGNlcHRpb24gc3RhY2tzLCB0aGVuICdzdGFjaycgbWlnaHQgc3RpbGwKLQkJICogYmUgd2l0aGluIHRoZSBsb3dlciBwb3J0aW9uIG9mIHRoZSBkZWJ1ZyBzdGFjazoKLQkJICovCi0jaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKLQkJaWYgKGsgPT0gREVCVUdfU1RBQ0sgLSAxICYmIHN0YWNrID49IGVuZCAtIERFQlVHX1NUS1NaKSB7Ci0JCQl1bnNpZ25lZCBqID0gTl9FWENFUFRJT05fU1RBQ0tTIC0gMTsKLQotCQkJLyoKLQkJCSAqIEJsYWNrIG1hZ2ljLiBBIGxhcmdlIGRlYnVnIHN0YWNrIGlzIGNvbXBvc2VkIG9mCi0JCQkgKiBtdWx0aXBsZSBleGNlcHRpb24gc3RhY2sgZW50cmllcywgd2hpY2ggd2UKLQkJCSAqIGl0ZXJhdGUgdGhyb3VnaCBub3cuIERvbnQgbG9vazoKLQkJCSAqLwotCQkJZG8gewotCQkJCSsrajsKLQkJCQllbmQgLT0gRVhDRVBUSU9OX1NUS1NaOwotCQkJCWlkc1tqXVs0XSA9ICcxJyArIChqIC0gTl9FWENFUFRJT05fU1RBQ0tTKTsKLQkJCX0gd2hpbGUgKHN0YWNrIDwgZW5kIC0gRVhDRVBUSU9OX1NUS1NaKTsKLQkJCWlmICgqdXNlZHAgJiAoMVUgPDwgaikpCi0JCQkJYnJlYWs7Ci0JCQkqdXNlZHAgfD0gMVUgPDwgajsKLQkJCSppZHAgPSBpZHNbal07Ci0JCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKillbmQ7Ci0JCX0KLSNlbmRpZgotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOiAKLSAqIHByb2Nlc3Mgc3RhY2sKLSAqIGludGVycnVwdCBzdGFjawotICogc2V2ZXJlIGV4Y2VwdGlvbiAoZG91YmxlIGZhdWx0LCBubWksIHN0YWNrIGZhdWx0LCBkZWJ1ZywgbWNlKSBoYXJkd2FyZSBzdGFjawotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAotCQkJdm9pZCAqcCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmVuZCkKLXsKLQl2b2lkICp0ID0gdGluZm87Ci0JaWYgKGVuZCkgewotCQlpZiAocCA8IGVuZCAmJiBwID49IChlbmQtVEhSRUFEX1NJWkUpKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcCA+IHQgJiYgcCA8IHQgKyBUSFJFQURfU0laRSAtIHNpemU7Ci19Ci0KLS8qIFRoZSBmb3JtIG9mIHRoZSB0b3Agb2YgdGhlIGZyYW1lIG9uIHRoZSBzdGFjayAqLwotc3RydWN0IHN0YWNrX2ZyYW1lIHsKLQlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKm5leHRfZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyByZXR1cm5fYWRkcmVzczsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEsCi0JCXVuc2lnbmVkIGxvbmcgKmVuZCkKLXsKLQlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKWJwOwotCi0Jd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgc3RhY2ssIHNpemVvZigqc3RhY2spLCBlbmQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCQlhZGRyID0gKnN0YWNrOwotCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHN0YWNrID09IGJwICsgOCkgewotCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCAxKTsKLQkJCQlmcmFtZSA9IGZyYW1lLT5uZXh0X2ZyYW1lOwotCQkJCWJwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkciwgYnAgPT0gMCk7Ci0JCQl9Ci0JCX0KLQkJc3RhY2srKzsKLQl9Ci0JcmV0dXJuIGJwOwotfQotCi12b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQotewotCWNvbnN0IHVuc2lnbmVkIGNwdSA9IGdldF9jcHUoKTsKLQl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyopY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0cjsKLQl1bnNpZ25lZCB1c2VkID0gMDsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOwotCi0JaWYgKCF0YXNrKQotCQl0YXNrID0gY3VycmVudDsKLQotCWlmICghc3RhY2spIHsKLQkJdW5zaWduZWQgbG9uZyBkdW1teTsKLQkJc3RhY2sgPSAmZHVtbXk7Ci0JCWlmICh0YXNrICYmIHRhc2sgIT0gY3VycmVudCkKLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQlpZiAoIWJwKSB7Ci0JCWlmICh0YXNrID09IGN1cnJlbnQpIHsKLQkJCS8qIEdyYWIgYnAgcmlnaHQgZnJvbSBvdXIgcmVncyAqLwotCQkJYXNtKCJtb3ZxICUlcmJwLCAlMCIgOiAiPXIiIChicCkgOik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBicCBpcyB0aGUgbGFzdCByZWcgcHVzaGVkIGJ5IHN3aXRjaF90byAqLwotCQkJYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLnNwOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIFByaW50IGZ1bmN0aW9uIGNhbGwgZW50cmllcyBpbiBhbGwgc3RhY2tzLCBzdGFydGluZyBhdCB0aGUKLQkgKiBjdXJyZW50IHN0YWNrIGFkZHJlc3MuIElmIHRoZSBzdGFja3MgY29uc2lzdCBvZiBuZXN0ZWQKLQkgKiBleGNlcHRpb25zCi0JICovCi0JdGluZm8gPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spOwotCWZvciAoOzspIHsKLQkJY2hhciAqaWQ7Ci0JCXVuc2lnbmVkIGxvbmcgKmVzdGFja19lbmQ7Ci0JCWVzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKLQkJCQkJCSZ1c2VkLCAmaWQpOwotCi0JCWlmIChlc3RhY2tfZW5kKSB7Ci0JCQlpZiAob3BzLT5zdGFjayhkYXRhLCBpZCkgPCAwKQotCQkJCWJyZWFrOwotCi0JCQlicCA9IHByaW50X2NvbnRleHRfc3RhY2sodGluZm8sIHN0YWNrLCBicCwgb3BzLAotCQkJCQkJCWRhdGEsIGVzdGFja19lbmQpOwotCQkJb3BzLT5zdGFjayhkYXRhLCAiPEVPRT4iKTsKLQkJCS8qCi0JCQkgKiBXZSBsaW5rIHRvIHRoZSBuZXh0IHN0YWNrIHZpYSB0aGUKLQkJCSAqIHNlY29uZC10by1sYXN0IHBvaW50ZXIgKGluZGV4IC0yIHRvIGVuZCkgaW4gdGhlCi0JCQkgKiBleGNlcHRpb24gc3RhY2s6Ci0JCQkgKi8KLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgZXN0YWNrX2VuZFstMl07Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoaXJxc3RhY2tfZW5kKSB7Ci0JCQl1bnNpZ25lZCBsb25nICppcnFzdGFjazsKLQkJCWlycXN0YWNrID0gaXJxc3RhY2tfZW5kIC0KLQkJCQkoSVJRU1RBQ0tTSVpFIC0gNjQpIC8gc2l6ZW9mKCppcnFzdGFjayk7Ci0KLQkJCWlmIChzdGFjayA+PSBpcnFzdGFjayAmJiBzdGFjayA8IGlycXN0YWNrX2VuZCkgewotCQkJCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCi0JCQkJCWJyZWFrOwotCQkJCWJwID0gcHJpbnRfY29udGV4dF9zdGFjayh0aW5mbywgc3RhY2ssIGJwLAotCQkJCQkJb3BzLCBkYXRhLCBpcnFzdGFja19lbmQpOwotCQkJCS8qCi0JCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayAod2hpY2ggd291bGQgYmUKLQkJCQkgKiB0aGUgcHJvY2VzcyBzdGFjayBub3JtYWxseSkgdGhlIGxhc3QKLQkJCQkgKiBwb2ludGVyIChpbmRleCAtMSB0byBlbmQpIGluIHRoZSBJUlEgc3RhY2s6Ci0JCQkJICovCi0JCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoaXJxc3RhY2tfZW5kWy0xXSk7Ci0JCQkJaXJxc3RhY2tfZW5kID0gTlVMTDsKLQkJCQlvcHMtPnN0YWNrKGRhdGEsICJFT0kiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaGFuZGxlcyB0aGUgcHJvY2VzcyBzdGFjazoKLQkgKi8KLQlicCA9IHByaW50X2NvbnRleHRfc3RhY2sodGluZm8sIHN0YWNrLCBicCwgb3BzLCBkYXRhLCBOVUxMKTsKLQlwdXRfY3B1KCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdHJhY2UpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wodm9pZCAqZGF0YSwgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIHN5bWJvbCkKLXsKLQlwcmludF9zeW1ib2wobXNnLCBzeW1ib2wpOwotCXByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfdHJhY2Vfd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCi17Ci0JcHJpbnRrKCIlc1xuIiwgbXNnKTsKLX0KLQotc3RhdGljIGludCBwcmludF90cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQotewotCXByaW50aygiIDwlcz4gIiwgbmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0JdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JcHJpbnRrX2FkZHJlc3MoYWRkciwgcmVsaWFibGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHByaW50X3RyYWNlX29wcyA9IHsKLQkud2FybmluZyA9IHByaW50X3RyYWNlX3dhcm5pbmcsCi0JLndhcm5pbmdfc3ltYm9sID0gcHJpbnRfdHJhY2Vfd2FybmluZ19zeW1ib2wsCi0JLnN0YWNrID0gcHJpbnRfdHJhY2Vfc3RhY2ssCi0JLmFkZHJlc3MgPSBwcmludF90cmFjZV9hZGRyZXNzLAotfTsKLQotc3RhdGljIHZvaWQKLXNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKLXsKLQlwcmludGsoIlxuQ2FsbCBUcmFjZTpcbiIpOwotCWR1bXBfdHJhY2UodGFzaywgcmVncywgc3RhY2ssIGJwLCAmcHJpbnRfdHJhY2Vfb3BzLCBsb2dfbHZsKTsKLQlwcmludGsoIlxuIik7Ci19Ci0KLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCkKLXsKLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3RhY2ssIGJwLCAiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpCi17Ci0JdW5zaWduZWQgbG9uZyAqc3RhY2s7Ci0JaW50IGk7Ci0JY29uc3QgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKSAoY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0cik7Ci0JdW5zaWduZWQgbG9uZyAqaXJxc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoY3B1X3BkYShjcHUpLT5pcnFzdGFja3B0ciAtIElSUVNUQUNLU0laRSk7Ci0KLQkvLyBkZWJ1Z2dpbmcgYWlkOiAic2hvd19zdGFjayhOVUxMLCBOVUxMKTsiIHByaW50cyB0aGUKLQkvLyBiYWNrIHRyYWNlIGZvciB0aGlzIGNwdS4KLQotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCWlmICh0YXNrKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKLQkJZWxzZQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKLQl9Ci0KLQlzdGFjayA9IHNwOwotCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgewotCQlpZiAoc3RhY2sgPj0gaXJxc3RhY2sgJiYgc3RhY2sgPD0gaXJxc3RhY2tfZW5kKSB7Ci0JCQlpZiAoc3RhY2sgPT0gaXJxc3RhY2tfZW5kKSB7Ci0JCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoaXJxc3RhY2tfZW5kWy0xXSk7Ci0JCQkJcHJpbnRrKCIgPEVPST4gIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCWlmICgoKGxvbmcpIHN0YWNrICYgKFRIUkVBRF9TSVpFLTEpKSA9PSAwKQotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGkgJiYgKChpICUgNCkgPT0gMCkpCi0JCQlwcmludGsoIlxuIik7Ci0JCXByaW50aygiICUwMTZseCIsICpzdGFjaysrKTsKLQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JfQotCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgYnAsIGxvZ19sdmwpOwotfQotCi12b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKLXsKLQlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgTlVMTCwgc3AsIDAsICIiKTsKLX0KLQotLyoKLSAqIFRoZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZHVtcF9zdGFjayBnZW5lcmF0b3IKLSAqLwotdm9pZCBkdW1wX3N0YWNrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBicCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKLQotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi0JaWYgKCFicCkKLQkJYXNtKCJtb3ZxICUlcmJwLCAlMCIgOiAiPXIiIChicCk6KTsKLSNlbmRpZgotCi0JcHJpbnRrKCJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlcyAlLipzXG4iLAotCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwKLQkJaW5pdF91dHNuYW1lKCktPnJlbGVhc2UsCi0JCShpbnQpc3RyY3Nwbihpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwgIiAiKSwKLQkJaW5pdF91dHNuYW1lKCktPnZlcnNpb24pOwotCXNob3dfdHJhY2UoTlVMTCwgTlVMTCwgJnN0YWNrLCBicCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7Ci0KLXZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzcDsKLQljb25zdCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyID0gY3B1X3BkYShjcHUpLT5wY3VycmVudDsKLQotCXNwID0gcmVncy0+c3A7Ci0JcHJpbnRrKCJDUFUgJWQgIiwgY3B1KTsKLQlfX3Nob3dfcmVncyhyZWdzKTsKLQlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm8gJXAsIHRhc2sgJXApXG4iLAotCQljdXItPmNvbW0sIGN1ci0+cGlkLCB0YXNrX3RocmVhZF9pbmZvKGN1ciksIGN1cik7Ci0KLQkvKgotCSAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCi0JICogdGltZSBvZiB0aGUgZmF1bHQuLgotCSAqLwotCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCXVuc2lnbmVkIGludCBjb2RlX3Byb2xvZ3VlID0gY29kZV9ieXRlcyAqIDQzIC8gNjQ7Ci0JCXVuc2lnbmVkIGludCBjb2RlX2xlbiA9IGNvZGVfYnl0ZXM7Ci0JCXVuc2lnbmVkIGNoYXIgYzsKLQkJdTggKmlwOwotCi0JCXByaW50aygiU3RhY2s6ICIpOwotCQlzaG93X3N0YWNrX2xvZ19sdmwoTlVMTCwgcmVncywgKHVuc2lnbmVkIGxvbmcgKilzcCwKLQkJCQlyZWdzLT5icCwgIiIpOwotCQlwcmludGsoIlxuIik7Ci0KLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOwotCi0JCWlwID0gKHU4ICopcmVncy0+aXAgLSBjb2RlX3Byb2xvZ3VlOwotCQlpZiAoaXAgPCAodTggKilQQUdFX09GRlNFVCB8fCBwcm9iZV9rZXJuZWxfYWRkcmVzcyhpcCwgYykpIHsKLQkJCS8qIHRyeSBzdGFydGluZyBhdCBSSVAgKi8KLQkJCWlwID0gKHU4ICopcmVncy0+aXA7Ci0JCQljb2RlX2xlbiA9IGNvZGVfbGVuIC0gY29kZV9wcm9sb2d1ZSArIDE7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IGNvZGVfbGVuOyBpKyssIGlwKyspIHsKLQkJCWlmIChpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8Ci0JCQkJCXByb2JlX2tlcm5lbF9hZGRyZXNzKGlwLCBjKSkgewotCQkJCXByaW50aygiIEJhZCBSSVAgdmFsdWUuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaXAgPT0gKHU4ICopcmVncy0+aXApCi0JCQkJcHJpbnRrKCI8JTAyeD4gIiwgYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOwotCQl9Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotaW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBpcCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB1ZDI7Ci0KLQlpZiAoX19jb3B5X2Zyb21fdXNlcigmdWQyLCAoY29uc3Qgdm9pZCBfX3VzZXIgKikgaXAsIHNpemVvZih1ZDIpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gdWQyID09IDB4MGIwZjsKLX0KLQotc3RhdGljIHJhd19zcGlubG9ja190IGRpZV9sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOwotc3RhdGljIGludCBkaWVfb3duZXIgPSAtMTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGllX25lc3RfY291bnQ7Ci0KLXVuc2lnbmVkIF9fa3Byb2JlcyBsb25nIG9vcHNfYmVnaW4odm9pZCkKLXsKLQlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlvb3BzX2VudGVyKCk7Ci0KLQkvKiByYWN5LCBidXQgYmV0dGVyIHRoYW4gcmlza2luZyBkZWFkbG9jay4gKi8KLQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoIV9fcmF3X3NwaW5fdHJ5bG9jaygmZGllX2xvY2spKSB7Ci0JCWlmIChjcHUgPT0gZGllX293bmVyKSAKLQkJCS8qIG5lc3RlZCBvb3BzLiBzaG91bGQgc3RvcCBldmVudHVhbGx5ICovOwotCQllbHNlCi0JCQlfX3Jhd19zcGluX2xvY2soJmRpZV9sb2NrKTsKLQl9Ci0JZGllX25lc3RfY291bnQrKzsKLQlkaWVfb3duZXIgPSBjcHU7Ci0JY29uc29sZV92ZXJib3NlKCk7Ci0JYnVzdF9zcGlubG9ja3MoMSk7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi12b2lkIF9fa3Byb2JlcyBvb3BzX2VuZCh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQotewotCWRpZV9vd25lciA9IC0xOwotCWJ1c3Rfc3BpbmxvY2tzKDApOwotCWRpZV9uZXN0X2NvdW50LS07Ci0JaWYgKCFkaWVfbmVzdF9jb3VudCkKLQkJLyogTmVzdCBjb3VudCByZWFjaGVzIHplcm8sIHJlbGVhc2UgdGhlIGxvY2suICovCi0JCV9fcmF3X3NwaW5fdW5sb2NrKCZkaWVfbG9jayk7Ci0JcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlpZiAoIXJlZ3MpIHsKLQkJb29wc19leGl0KCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBhbmljX29uX29vcHMpCi0JCXBhbmljKCJGYXRhbCBleGNlcHRpb24iKTsKLQlvb3BzX2V4aXQoKTsKLQlkb19leGl0KHNpZ25yKTsKLX0KLQotaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKLXsKLQlwcmludGsoS0VSTl9FTUVSRyAiJXM6ICUwNGx4IFsldV0gIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JcHJpbnRrKCJQUkVFTVBUICIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NNUAotCXByaW50aygiU01QICIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwotCXByaW50aygiREVCVUdfUEFHRUFMTE9DIik7Ci0jZW5kaWYKLQlwcmludGsoIlxuIik7Ci0JaWYgKG5vdGlmeV9kaWUoRElFX09PUFMsIHN0ciwgcmVncywgZXJyLAotCQkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm4gMTsKLQotCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotCWFkZF90YWludChUQUlOVF9ESUUpOwotCS8qIEV4ZWN1dGl2ZSBzdW1tYXJ5IGluIGNhc2UgdGhlIG9vcHMgc2Nyb2xsZWQgYXdheSAqLwotCXByaW50ayhLRVJOX0FMRVJUICJSSVAgIik7Ci0JcHJpbnRrX2FkZHJlc3MocmVncy0+aXAsIDEpOwotCXByaW50aygiIFJTUCA8JTAxNmx4PlxuIiwgcmVncy0+c3ApOwotCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpCi0JCWNyYXNoX2tleGVjKHJlZ3MpOwotCXJldHVybiAwOwotfQotCi12b2lkIGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbigpOwotCi0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJlcG9ydF9idWcocmVncy0+aXAsIHJlZ3MpOwotCi0JaWYgKF9fZGllKHN0ciwgcmVncywgZXJyKSkKLQkJcmVncyA9IE5VTEw7Ci0Jb29wc19lbmQoZmxhZ3MsIHJlZ3MsIFNJR1NFR1YpOwotfQotCi1ub3RyYWNlIF9fa3Byb2JlcyB2b2lkCi1kaWVfbm1pKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBkb19wYW5pYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG5vdGlmeV9kaWUoRElFX05NSVdBVENIRE9HLCBzdHIsIHJlZ3MsIDAsIDIsIFNJR0lOVCkgPT0gTk9USUZZX1NUT1ApCi0JCXJldHVybjsKLQotCWZsYWdzID0gb29wc19iZWdpbigpOwotCS8qCi0JICogV2UgYXJlIGluIHRyb3VibGUgYW55d2F5LCBsZXRzIGF0IGxlYXN0IHRyeQotCSAqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0LgotCSAqLwotCXByaW50ayhLRVJOX0VNRVJHICIlcyIsIHN0cik7Ci0JcHJpbnRrKCIgb24gQ1BVJWQsIGlwICUwOGx4LCByZWdpc3RlcnM6XG4iLAotCQlzbXBfcHJvY2Vzc29yX2lkKCksIHJlZ3MtPmlwKTsKLQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKLQlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpKQotCQljcmFzaF9rZXhlYyhyZWdzKTsKLQlpZiAoZG9fcGFuaWMgfHwgcGFuaWNfb25fb29wcykKLQkJcGFuaWMoIk5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQiKTsKLQlvb3BzX2VuZChmbGFncywgTlVMTCwgU0lHQlVTKTsKLQlubWlfZXhpdCgpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlkb19leGl0KFNJR0JVUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fa3Byb2JlcwotZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JbG9uZyBlcnJvcl9jb2RlLCBzaWdpbmZvX3QgKmluZm8pCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCi0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JCWdvdG8ga2VybmVsX3RyYXA7Ci0KLQkvKgotCSAqIFdlIHdhbnQgZXJyb3JfY29kZSBhbmQgdHJhcF9ubyBzZXQgZm9yIHVzZXJzcGFjZSBmYXVsdHMgYW5kCi0JICoga2VybmVsc3BhY2UgZmF1bHRzIHdoaWNoIHJlc3VsdCBpbiBkaWUoKSwgYnV0IG5vdAotCSAqIGtlcm5lbHNwYWNlIGZhdWx0cyB3aGljaCBhcmUgZml4ZWQgdXAuICBkaWUoKSBnaXZlcyB0aGUKLQkgKiBwcm9jZXNzIG5vIGNoYW5jZSB0byBoYW5kbGUgdGhlIHNpZ25hbCBhbmQgbm90aWNlIHRoZQotCSAqIGtlcm5lbCBmYXVsdCBpbmZvcm1hdGlvbiwgc28gdGhhdCB3b24ndCByZXN1bHQgaW4gcG9sbHV0aW5nCi0JICogdGhlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzbHkgcXVldWVkLCBidXQgbm90IHlldAotCSAqIGRlbGl2ZXJlZCwgZmF1bHRzLiAgU2VlIGFsc28gZG9fZ2VuZXJhbF9wcm90ZWN0aW9uIGJlbG93LgotCSAqLwotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7Ci0KLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiB1bmhhbmRsZWRfc2lnbmFsKHRzaywgc2lnbnIpICYmCi0JICAgIHByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiJXNbJWRdIHRyYXAgJXMgaXA6JWx4IHNwOiVseCBlcnJvcjolbHgiLAotCQkgICAgICAgdHNrLT5jb21tLCB0c2stPnBpZCwgc3RyLAotCQkgICAgICAgcmVncy0+aXAsIHJlZ3MtPnNwLCBlcnJvcl9jb2RlKTsKLQkJcHJpbnRfdm1hX2FkZHIoIiBpbiAiLCByZWdzLT5pcCk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlpZiAoaW5mbykKLQkJZm9yY2Vfc2lnX2luZm8oc2lnbnIsIGluZm8sIHRzayk7Ci0JZWxzZQotCQlmb3JjZV9zaWcoc2lnbnIsIHRzayk7Ci0JcmV0dXJuOwotCi1rZXJuZWxfdHJhcDoKLQlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkgewotCQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLQkJdHNrLT50aHJlYWQudHJhcF9ubyA9IHRyYXBucjsKLQkJZGllKHN0ciwgcmVncywgZXJyb3JfY29kZSk7Ci0JfQotCXJldHVybjsKLX0KLQotI2RlZmluZSBET19FUlJPUih0cmFwbnIsIHNpZ25yLCBzdHIsIG5hbWUpIFwKLWFzbWxpbmthZ2Ugdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCVwKLXsJCQkJCQkJCQlcCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsIHN0ciwgcmVncywgZXJyb3JfY29kZSwgdHJhcG5yLCBzaWducikJXAotCQkJCQkJCT09IE5PVElGWV9TVE9QKQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsJCQkJCQlcCi0JZG9fdHJhcCh0cmFwbnIsIHNpZ25yLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIE5VTEwpOwkJXAotfQotCi0jZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikJCVwKLWFzbWxpbmthZ2Ugdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCVwKLXsJCQkJCQkJCQlcCi0Jc2lnaW5mb190IGluZm87CQkJCQkJCVwKLQlpbmZvLnNpX3NpZ25vID0gc2lnbnI7CQkJCQkJXAotCWluZm8uc2lfZXJybm8gPSAwOwkJCQkJCVwKLQlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7CQkJCQkJXAotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXNpYWRkcjsJCQkJXAotCXRyYWNlX2hhcmRpcnFzX2ZpeHVwKCk7CQkJCQkJXAotCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpCVwKLQkJCQkJCQk9PSBOT1RJRllfU1RPUCkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQljb25kaXRpb25hbF9zdGkocmVncyk7CQkJCQkJXAotCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCAmaW5mbyk7CQlcCi19Ci0KLURPX0VSUk9SX0lORk8oMCwgU0lHRlBFLCAiZGl2aWRlIGVycm9yIiwgZGl2aWRlX2Vycm9yLCBGUEVfSU5URElWLCByZWdzLT5pcCkKLURPX0VSUk9SKDQsIFNJR1NFR1YsICJvdmVyZmxvdyIsIG92ZXJmbG93KQotRE9fRVJST1IoNSwgU0lHU0VHViwgImJvdW5kcyIsIGJvdW5kcykKLURPX0VSUk9SX0lORk8oNiwgU0lHSUxMLCAiaW52YWxpZCBvcGNvZGUiLCBpbnZhbGlkX29wLCBJTExfSUxMT1BOLCByZWdzLT5pcCkKLURPX0VSUk9SKDksIFNJR0ZQRSwgImNvcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biIsIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bikKLURPX0VSUk9SKDEwLCBTSUdTRUdWLCAiaW52YWxpZCBUU1MiLCBpbnZhbGlkX1RTUykKLURPX0VSUk9SKDExLCBTSUdCVVMsICJzZWdtZW50IG5vdCBwcmVzZW50Iiwgc2VnbWVudF9ub3RfcHJlc2VudCkKLURPX0VSUk9SX0lORk8oMTcsIFNJR0JVUywgImFsaWdubWVudCBjaGVjayIsIGFsaWdubWVudF9jaGVjaywgQlVTX0FEUkFMTiwgMCkKLQotLyogUnVucyBvbiBJU1Qgc3RhY2sgKi8KLWFzbWxpbmthZ2Ugdm9pZCBkb19zdGFja19zZWdtZW50KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCi17Ci0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsICJzdGFjayBzZWdtZW50IiwgcmVncywgZXJyb3JfY29kZSwKLQkJCTEyLCBTSUdCVVMpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JcHJlZW1wdF9jb25kaXRpb25hbF9zdGkocmVncyk7Ci0JZG9fdHJhcCgxMiwgU0lHQlVTLCAic3RhY2sgc2VnbWVudCIsIHJlZ3MsIGVycm9yX2NvZGUsIE5VTEwpOwotCXByZWVtcHRfY29uZGl0aW9uYWxfY2xpKHJlZ3MpOwotfQotCi1hc21saW5rYWdlIHZvaWQgZG9fZG91YmxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQotewotCXN0YXRpYyBjb25zdCBjaGFyIHN0cltdID0gImRvdWJsZSBmYXVsdCI7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCi0JLyogUmV0dXJuIG5vdCBjaGVja2VkIGJlY2F1c2UgZG91YmxlIGNoZWNrIGNhbm5vdCBiZSBpZ25vcmVkICovCi0Jbm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCA4LCBTSUdTRUdWKTsKLQotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSA4OwotCi0JLyogVGhpcyBpcyBhbHdheXMgYSBrZXJuZWwgdHJhcCBhbmQgbmV2ZXIgZml4YWJsZSAoYW5kIHRodXMgbXVzdAotCSAgIG5ldmVyIHJldHVybikuICovCi0JZm9yICg7OykKLQkJZGllKHN0ciwgcmVncywgZXJyb3JfY29kZSk7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMKLWRvX2dlbmVyYWxfcHJvdGVjdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCi0JY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwotCi0JdHNrID0gY3VycmVudDsKLQlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJZ290byBncF9pbl9rZXJuZWw7Ci0KLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLQl0c2stPnRocmVhZC50cmFwX25vID0gMTM7Ci0KLQlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJiB1bmhhbmRsZWRfc2lnbmFsKHRzaywgU0lHU0VHVikgJiYKLQkJCXByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCQkiJXNbJWRdIGdlbmVyYWwgcHJvdGVjdGlvbiBpcDolbHggc3A6JWx4IGVycm9yOiVseCIsCi0JCQl0c2stPmNvbW0sIHRzay0+cGlkLAotCQkJcmVncy0+aXAsIHJlZ3MtPnNwLCBlcnJvcl9jb2RlKTsKLQkJcHJpbnRfdm1hX2FkZHIoIiBpbiAiLCByZWdzLT5pcCk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKLQlyZXR1cm47Ci0KLWdwX2luX2tlcm5lbDoKLQlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQotCQlyZXR1cm47Ci0KLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKLQl0c2stPnRocmVhZC50cmFwX25vID0gMTM7Ci0JaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCi0JCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JZGllKCJnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQiLCByZWdzLCBlcnJvcl9jb2RlKTsKLX0KLQotc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKLW1lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXByaW50ayhLRVJOX0VNRVJHICJVaGh1aC4gTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4LlxuIiwKLQkJcmVhc29uKTsKLQlwcmludGsoS0VSTl9FTUVSRyAiWW91IGhhdmUgc29tZSBoYXJkd2FyZSBwcm9ibGVtLCBsaWtlbHkgb24gdGhlIFBDSSBidXMuXG4iKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0VEQUMpCi0JaWYgKGVkYWNfaGFuZGxlcl9zZXQoKSkgewotCQllZGFjX2F0b21pY19hc3NlcnRfZXJyb3IoKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKLQkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotCi0JLyogQ2xlYXIgYW5kIGRpc2FibGUgdGhlIG1lbW9yeSBwYXJpdHkgZXJyb3IgbGluZS4gKi8KLQlyZWFzb24gPSAocmVhc29uICYgMHhmKSB8IDQ7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOwotfQotCi1zdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZAotaW9fY2hlY2tfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXByaW50aygiTk1JOiBJT0NLIGVycm9yIChkZWJ1ZyBpbnRlcnJ1cHQ/KVxuIik7Ci0Jc2hvd19yZWdpc3RlcnMocmVncyk7Ci0KLQkvKiBSZS1lbmFibGUgdGhlIElPQ0sgbGluZSwgd2FpdCBmb3IgYSBmZXcgc2Vjb25kcyAqLwotCXJlYXNvbiA9IChyZWFzb24gJiAweGYpIHwgODsKLQlvdXRiKHJlYXNvbiwgMHg2MSk7Ci0JbWRlbGF5KDIwMDApOwotCXJlYXNvbiAmPSB+ODsKLQlvdXRiKHJlYXNvbiwgMHg2MSk7Ci19Ci0KLXN0YXRpYyBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCi11bmtub3duX25taV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotewotCWlmIChub3RpZnlfZGllKERJRV9OTUlVTktOT1dOLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpID09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnguXG4iLAotCQlyZWFzb24pOwotCXByaW50ayhLRVJOX0VNRVJHICJEbyB5b3UgaGF2ZSBhIHN0cmFuZ2UgcG93ZXIgc2F2aW5nIG1vZGUgZW5hYmxlZD9cbiIpOwotCi0JaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKLQkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotfQotCi0vKiBSdW5zIG9uIElTVCBzdGFjay4gVGhpcyBjb2RlIG11c3Qga2VlcCBpbnRlcnJ1cHRzIG9mZiBhbGwgdGhlIHRpbWUuCi0gICBOZXN0ZWQgTk1JcyBhcmUgcHJldmVudGVkIGJ5IHRoZSBDUFUuICovCi1hc21saW5rYWdlIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQgZGVmYXVsdF9kb19ubWkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciByZWFzb24gPSAwOwotCWludCBjcHU7Ci0KLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKiBPbmx5IHRoZSBCU1AgZ2V0cyBleHRlcm5hbCBOTUlzIGZyb20gdGhlIHN5c3RlbS4gKi8KLQlpZiAoIWNwdSkKLQkJcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKLQotCWlmICghKHJlYXNvbiAmIDB4YzApKSB7Ci0JCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQotCQkJCQkJCQk9PSBOT1RJRllfU1RPUCkKLQkJCXJldHVybjsKLQkJLyoKLQkJICogT2ssIHNvIHRoaXMgaXMgbm9uZSBvZiB0aGUgZG9jdW1lbnRlZCBOTUkgc291cmNlcywKLQkJICogc28gaXQgbXVzdCBiZSB0aGUgTk1JIHdhdGNoZG9nLgotCQkgKi8KLQkJaWYgKG5taV93YXRjaGRvZ190aWNrKHJlZ3MsIHJlYXNvbikpCi0JCQlyZXR1cm47Ci0JCWlmICghZG9fbm1pX2NhbGxiYWNrKHJlZ3MsIGNwdSkpCi0JCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOwotCi0JCXJldHVybjsKLQl9Ci0JaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKLQkJcmV0dXJuOwotCi0JLyogQUs6IGZvbGxvd2luZyBjaGVja3Mgc2VlbSB0byBiZSBicm9rZW4gb24gbW9kZXJuIGNoaXBzZXRzLiBGSVhNRSAqLwotCWlmIChyZWFzb24gJiAweDgwKQotCQltZW1fcGFyaXR5X2Vycm9yKHJlYXNvbiwgcmVncyk7Ci0JaWYgKHJlYXNvbiAmIDB4NDApCi0JCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7Ci19Ci0KLWFzbWxpbmthZ2Ugbm90cmFjZSBfX2twcm9iZXMgdm9pZAotZG9fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycm9yX2NvZGUpCi17Ci0Jbm1pX2VudGVyKCk7Ci0KLQlhZGRfcGRhKF9fbm1pX2NvdW50LCAxKTsKLQotCWlmICghaWdub3JlX25taXMpCi0JCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOwotCi0Jbm1pX2V4aXQoKTsKLX0KLQotdm9pZCBzdG9wX25taSh2b2lkKQotewotCWFjcGlfbm1pX2Rpc2FibGUoKTsKLQlpZ25vcmVfbm1pcysrOwotfQotCi12b2lkIHJlc3RhcnRfbm1pKHZvaWQpCi17Ci0JaWdub3JlX25taXMtLTsKLQlhY3BpX25taV9lbmFibGUoKTsKLX0KLQotLyogcnVucyBvbiBJU1Qgc3RhY2suICovCi1hc21saW5rYWdlIHZvaWQgX19rcHJvYmVzIGRvX2ludDMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKLXsKLQl0cmFjZV9oYXJkaXJxc19maXh1cCgpOwotCi0JaWYgKG5vdGlmeV9kaWUoRElFX0lOVDMsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgMywgU0lHVFJBUCkKLQkJCT09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0KLQlwcmVlbXB0X2NvbmRpdGlvbmFsX3N0aShyZWdzKTsKLQlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7Ci0JcHJlZW1wdF9jb25kaXRpb25hbF9jbGkocmVncyk7Ci19Ci0KLS8qIEhlbHAgaGFuZGxlciBydW5uaW5nIG9uIElTVCBzdGFjayB0byBzd2l0Y2ggYmFjayB0byB1c2VyIHN0YWNrCi0gICBmb3Igc2NoZWR1bGluZyBvciBzaWduYWwgaGFuZGxpbmcuIFRoZSBhY3R1YWwgc3RhY2sgc3dpdGNoIGlzIGRvbmUgaW4KLSAgIGVudHJ5LlMgKi8KLWFzbWxpbmthZ2UgX19rcHJvYmVzIHN0cnVjdCBwdF9yZWdzICpzeW5jX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKmVyZWdzKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZXJlZ3M7Ci0JLyogRGlkIGFscmVhZHkgc3luYyAqLwotCWlmIChlcmVncyA9PSAoc3RydWN0IHB0X3JlZ3MgKillcmVncy0+c3ApCi0JCTsKLQkvKiBFeGNlcHRpb24gZnJvbSB1c2VyIHNwYWNlICovCi0JZWxzZSBpZiAodXNlcl9tb2RlKGVyZWdzKSkKLQkJcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKLQkvKiBFeGNlcHRpb24gZnJvbSBrZXJuZWwgYW5kIGludGVycnVwdHMgYXJlIGVuYWJsZWQuIE1vdmUgdG8KLSAJICAga2VybmVsIHByb2Nlc3Mgc3RhY2suICovCi0JZWxzZSBpZiAoZXJlZ3MtPmZsYWdzICYgWDg2X0VGTEFHU19JRikKLQkJcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKShlcmVncy0+c3AgLT0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7Ci0JaWYgKGVyZWdzICE9IHJlZ3MpCi0JCSpyZWdzID0gKmVyZWdzOwotCXJldHVybiByZWdzOwotfQotCi0vKiBydW5zIG9uIElTVCBzdGFjay4gKi8KLWFzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBjb25kaXRpb247Ci0Jc2lnaW5mb190IGluZm87Ci0KLQl0cmFjZV9oYXJkaXJxc19maXh1cCgpOwotCi0JZ2V0X2RlYnVncmVnKGNvbmRpdGlvbiwgNik7Ci0KLQkvKgotCSAqIFRoZSBwcm9jZXNzb3IgY2xlYXJlZCBCVEYsIHNvIGRvbid0IG1hcmsgdGhhdCB3ZSBuZWVkIGl0IHNldC4KLQkgKi8KLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfREVCVUdDVExNU1IpOwotCXRzay0+dGhyZWFkLmRlYnVnY3RsbXNyID0gMDsKLQotCWlmIChub3RpZnlfZGllKERJRV9ERUJVRywgImRlYnVnIiwgcmVncywgY29uZGl0aW9uLCBlcnJvcl9jb2RlLAotCQkJCQkJU0lHVFJBUCkgPT0gTk9USUZZX1NUT1ApCi0JCXJldHVybjsKLQotCXByZWVtcHRfY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwotCi0JLyogTWFzayBvdXQgc3B1cmlvdXMgZGVidWcgdHJhcHMgZHVlIHRvIGxhenkgRFI3IHNldHRpbmcgKi8KLQlpZiAoY29uZGl0aW9uICYgKERSX1RSQVAwfERSX1RSQVAxfERSX1RSQVAyfERSX1RSQVAzKSkgewotCQlpZiAoIXRzay0+dGhyZWFkLmRlYnVncmVnNykKLQkJCWdvdG8gY2xlYXJfZHI3OwotCX0KLQotCXRzay0+dGhyZWFkLmRlYnVncmVnNiA9IGNvbmRpdGlvbjsKLQotCS8qCi0JICogU2luZ2xlLXN0ZXBwaW5nIHRocm91Z2ggVEY6IG1ha2Ugc3VyZSB3ZSBpZ25vcmUgYW55IGV2ZW50cyBpbgotCSAqIGtlcm5lbCBzcGFjZSAoYnV0IHJlLWVuYWJsZSBURiB3aGVuIHJldHVybmluZyB0byB1c2VyIG1vZGUpLgotCSAqLwotCWlmIChjb25kaXRpb24gJiBEUl9TVEVQKSB7Ci0JCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQkJZ290byBjbGVhcl9URl9yZWVuYWJsZTsKLQl9Ci0KLQkvKiBPaywgZmluYWxseSBzb21ldGhpbmcgd2UgY2FuIGhhbmRsZSAqLwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxOwotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOwotCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfY29kZSA9IFRSQVBfQlJLUFQ7Ci0JaW5mby5zaV9hZGRyID0gdXNlcl9tb2RlKHJlZ3MpID8gKHZvaWQgX191c2VyICopcmVncy0+aXAgOiBOVUxMOwotCWZvcmNlX3NpZ19pbmZvKFNJR1RSQVAsICZpbmZvLCB0c2spOwotCi1jbGVhcl9kcjc6Ci0Jc2V0X2RlYnVncmVnKDAsIDcpOwotCXByZWVtcHRfY29uZGl0aW9uYWxfY2xpKHJlZ3MpOwotCXJldHVybjsKLQotY2xlYXJfVEZfcmVlbmFibGU6Ci0Jc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TSU5HTEVTVEVQKTsKLQlyZWdzLT5mbGFncyAmPSB+WDg2X0VGTEFHU19URjsKLQlwcmVlbXB0X2NvbmRpdGlvbmFsX2NsaShyZWdzKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQga2VybmVsX21hdGhfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHRyYXBucikKLXsKLQlpZiAoZml4dXBfZXhjZXB0aW9uKHJlZ3MpKQotCQlyZXR1cm4gMTsKLQotCW5vdGlmeV9kaWUoRElFX0dQRiwgc3RyLCByZWdzLCAwLCB0cmFwbnIsIFNJR0ZQRSk7Ci0JLyogSWxsZWdhbCBmbG9hdGluZyBwb2ludCBvcGVyYXRpb24gaW4gdGhlIGtlcm5lbCAqLwotCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gdHJhcG5yOwotCWRpZShzdHIsIHJlZ3MsIDApOwotCXJldHVybiAwOwotfQotCi0vKgotICogTm90ZSB0aGF0IHdlIHBsYXkgYXJvdW5kIHdpdGggdGhlICdUUycgYml0IGluIGFuIGF0dGVtcHQgdG8gZ2V0Ci0gKiB0aGUgY29ycmVjdCBiZWhhdmlvdXIgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGFzeW5jaHJvbm91cwotICogSVJRMTMgYmVoYXZpb3VyCi0gKi8KLWFzbWxpbmthZ2Ugdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl2b2lkIF9fdXNlciAqaXAgPSAodm9pZCBfX3VzZXIgKikocmVncy0+aXApOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlzaWdpbmZvX3QgaW5mbzsKLQl1bnNpZ25lZCBzaG9ydCBjd2QsIHN3ZDsKLQotCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKLQlpZiAoIXVzZXJfbW9kZShyZWdzKSAmJgotCSAgICBrZXJuZWxfbWF0aF9lcnJvcihyZWdzLCAia2VybmVsIHg4NyBtYXRoIGVycm9yIiwgMTYpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFNhdmUgdGhlIGluZm8gZm9yIHRoZSBleGNlcHRpb24gaGFuZGxlciBhbmQgY2xlYXIgdGhlIGVycm9yLgotCSAqLwotCXRhc2sgPSBjdXJyZW50OwotCXNhdmVfaW5pdF9mcHUodGFzayk7Ci0JdGFzay0+dGhyZWFkLnRyYXBfbm8gPSAxNjsKLQl0YXNrLT50aHJlYWQuZXJyb3JfY29kZSA9IDA7Ci0JaW5mby5zaV9zaWdubyA9IFNJR0ZQRTsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2NvZGUgPSBfX1NJX0ZBVUxUOwotCWluZm8uc2lfYWRkciA9IGlwOwotCS8qCi0JICogKH5jd2QgJiBzd2QpIHdpbGwgbWFzayBvdXQgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3Qgc2V0IHRvIHVubWFza2VkCi0JICogc3RhdHVzLiAgMHgzZiBpcyB0aGUgZXhjZXB0aW9uIGJpdHMgaW4gdGhlc2UgcmVncywgMHgyMDAgaXMgdGhlCi0JICogQzEgcmVnIHlvdSBuZWVkIGluIGNhc2Ugb2YgYSBzdGFjayBmYXVsdCwgMHgwNDAgaXMgdGhlIHN0YWNrCi0JICogZmF1bHQgYml0LiAgV2Ugc2hvdWxkIG9ubHkgYmUgdGFraW5nIG9uZSBleGNlcHRpb24gYXQgYSB0aW1lLAotCSAqIHNvIGlmIHRoaXMgY29tYmluYXRpb24gZG9lc24ndCBwcm9kdWNlIGFueSBzaW5nbGUgZXhjZXB0aW9uLAotCSAqIHRoZW4gd2UgaGF2ZSBhIGJhZCBwcm9ncmFtIHRoYXQgaXNuJ3Qgc3luY2hyb25pemluZyBpdHMgRlBVIHVzYWdlCi0JICogYW5kIGl0IHdpbGwgc3VmZmVyIHRoZSBjb25zZXF1ZW5jZXMgc2luY2Ugd2Ugd29uJ3QgYmUgYWJsZSB0bwotCSAqIGZ1bGx5IHJlcHJvZHVjZSB0aGUgY29udGV4dCBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JY3dkID0gZ2V0X2ZwdV9jd2QodGFzayk7Ci0Jc3dkID0gZ2V0X2ZwdV9zd2QodGFzayk7Ci0Jc3dpdGNoIChzd2QgJiB+Y3dkICYgMHgzZikgewotCWNhc2UgMHgwMDA6IC8qIE5vIHVubWFza2VkIGV4Y2VwdGlvbiAqLwotCWRlZmF1bHQ6IC8qIE11bHRpcGxlIGV4Y2VwdGlvbnMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAweDAwMTogLyogSW52YWxpZCBPcCAqLwotCQkvKgotCQkgKiBzd2QgJiAweDI0MCA9PSAweDA0MDogU3RhY2sgVW5kZXJmbG93Ci0JCSAqIHN3ZCAmIDB4MjQwID09IDB4MjQwOiBTdGFjayBPdmVyZmxvdwotCQkgKiBVc2VyIG11c3QgY2xlYXIgdGhlIFNGIGJpdCAoMHg0MCkgaWYgc2V0Ci0JCSAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOwotCQlicmVhazsKLQljYXNlIDB4MDAyOiAvKiBEZW5vcm1hbGl6ZSAqLwotCWNhc2UgMHgwMTA6IC8qIFVuZGVyZmxvdyAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOwotCQlicmVhazsKLQljYXNlIDB4MDA0OiAvKiBaZXJvIERpdmlkZSAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOwotCQlicmVhazsKLQljYXNlIDB4MDA4OiAvKiBPdmVyZmxvdyAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOwotCQlicmVhazsKLQljYXNlIDB4MDIwOiAvKiBQcmVjaXNpb24gKi8KLQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKLQkJYnJlYWs7Ci0JfQotCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRhc2spOwotfQotCi1hc21saW5rYWdlIHZvaWQgYmFkX2ludHIodm9pZCkKLXsKLQlwcmludGsoImJhZCBpbnRlcnJ1cHQiKTsgCi19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXZvaWQgX191c2VyICppcCA9ICh2b2lkIF9fdXNlciAqKShyZWdzLT5pcCk7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXNpZ2luZm9fdCBpbmZvOwotCXVuc2lnbmVkIHNob3J0IG14Y3NyOwotCi0JY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwotCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmCi0gICAgICAgIAlrZXJuZWxfbWF0aF9lcnJvcihyZWdzLCAia2VybmVsIHNpbWQgbWF0aCBlcnJvciIsIDE5KSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KLQkgKi8KLQl0YXNrID0gY3VycmVudDsKLQlzYXZlX2luaXRfZnB1KHRhc2spOwotCXRhc2stPnRocmVhZC50cmFwX25vID0gMTk7Ci0JdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7Ci0JaW5mby5zaV9lcnJubyA9IDA7Ci0JaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKLQlpbmZvLnNpX2FkZHIgPSBpcDsKLQkvKgotCSAqIFRoZSBTSU1EIEZQVSBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LCBhcyB0aGVyZQotCSAqIGlzIG9ubHkgYSBzaW5nbGUgc3RhdHVzL2NvbnRyb2wgcmVnaXN0ZXIuICBUaHVzLCB0byBkZXRlcm1pbmUgd2hpY2gKLQkgKiB1bm1hc2tlZCBleGNlcHRpb24gd2FzIGNhdWdodCB3ZSBtdXN0IG1hc2sgdGhlIGV4Y2VwdGlvbiBtYXNrIGJpdHMKLQkgKiBhdCAweDFmODAsIGFuZCB0aGVuIHVzZSB0aGVzZSB0byBtYXNrIHRoZSBleGNlcHRpb24gYml0cyBhdCAweDNmLgotCSAqLwotCW14Y3NyID0gZ2V0X2ZwdV9teGNzcih0YXNrKTsKLQlzd2l0Y2ggKH4oKG14Y3NyICYgMHgxZjgwKSA+PiA3KSAmIChteGNzciAmIDB4M2YpKSB7Ci0JY2FzZSAweDAwMDoKLQlkZWZhdWx0OgotCQlicmVhazsKLQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDI6IC8qIERlbm9ybWFsaXplICovCi0JY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRVTkQ7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRESVY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCi0JCWluZm8uc2lfY29kZSA9IEZQRV9GTFRPVkY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLwotCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUUkVTOwotCQlicmVhazsKLQl9Ci0JZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgdGFzayk7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnKHN0cnVjdCBwdF9yZWdzICogcmVncykKLXsKLX0KLQotYXNtbGlua2FnZSB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBzbXBfdGhlcm1hbF9pbnRlcnJ1cHQodm9pZCkKLXsKLX0KLQotYXNtbGlua2FnZSB2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBtY2VfdGhyZXNob2xkX2ludGVycnVwdCh2b2lkKQotewotfQotCi0vKgotICogJ21hdGhfc3RhdGVfcmVzdG9yZSgpJyBzYXZlcyB0aGUgY3VycmVudCBtYXRoIGluZm9ybWF0aW9uIGluIHRoZQotICogb2xkIG1hdGggc3RhdGUgYXJyYXksIGFuZCBnZXRzIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBjdXJyZW50IHRhc2sKLSAqCi0gKiBDYXJlZnVsLi4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggSUJNLWRlc2lnbmVkIElSUTEzIGJlaGF2aW91ci4KLSAqIERvbid0IHRvdWNoIHVubGVzcyB5b3UgKnJlYWxseSoga25vdyBob3cgaXQgd29ya3MuCi0gKi8KLWFzbWxpbmthZ2Ugdm9pZCBtYXRoX3N0YXRlX3Jlc3RvcmUodm9pZCkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKLQotCWlmICghdXNlZF9tYXRoKCkpIHsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkvKgotCQkgKiBkb2VzIGEgc2xhYiBhbGxvYyB3aGljaCBjYW4gc2xlZXAKLQkJICovCi0JCWlmIChpbml0X2ZwdShtZSkpIHsKLQkJCS8qCi0JCQkgKiByYW4gb3V0IG9mIG1lbW9yeSEKLQkJCSAqLwotCQkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKLQkJCXJldHVybjsKLQkJfQotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCX0KLQotCWNsdHMoKTsJCQkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLwotCS8qCi0JICogUGFyYW5vaWQgcmVzdG9yZS4gc2VuZCBhIFNJR1NFR1YgaWYgd2UgZmFpbCB0byByZXN0b3JlIHRoZSBzdGF0ZS4KLQkgKi8KLQlpZiAodW5saWtlbHkocmVzdG9yZV9mcHVfY2hlY2tpbmcoJm1lLT50aHJlYWQueHN0YXRlLT5meHNhdmUpKSkgewotCQlzdHRzKCk7Ci0JCWZvcmNlX3NpZyhTSUdTRUdWLCBtZSk7Ci0JCXJldHVybjsKLQl9Ci0JdGFza190aHJlYWRfaW5mbyhtZSktPnN0YXR1cyB8PSBUU19VU0VERlBVOwotCW1lLT5mcHVfY291bnRlcisrOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWF0aF9zdGF0ZV9yZXN0b3JlKTsKLQotdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCi17Ci0Jc2V0X2ludHJfZ2F0ZSgwLCAmZGl2aWRlX2Vycm9yKTsKLQlzZXRfaW50cl9nYXRlX2lzdCgxLCAmZGVidWcsIERFQlVHX1NUQUNLKTsKLQlzZXRfaW50cl9nYXRlX2lzdCgyLCAmbm1pLCBOTUlfU1RBQ0spOwotIAlzZXRfc3lzdGVtX2dhdGVfaXN0KDMsICZpbnQzLCBERUJVR19TVEFDSyk7IC8qIGludDMgY2FuIGJlIGNhbGxlZCBmcm9tIGFsbCAqLwotCXNldF9zeXN0ZW1fZ2F0ZSg0LCAmb3ZlcmZsb3cpOyAvKiBpbnQ0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbGwgKi8KLQlzZXRfaW50cl9nYXRlKDUsICZib3VuZHMpOwotCXNldF9pbnRyX2dhdGUoNiwgJmludmFsaWRfb3ApOwotCXNldF9pbnRyX2dhdGUoNywgJmRldmljZV9ub3RfYXZhaWxhYmxlKTsKLQlzZXRfaW50cl9nYXRlX2lzdCg4LCAmZG91YmxlX2ZhdWx0LCBET1VCTEVGQVVMVF9TVEFDSyk7Ci0Jc2V0X2ludHJfZ2F0ZSg5LCAmY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKTsKLQlzZXRfaW50cl9nYXRlKDEwLCAmaW52YWxpZF9UU1MpOwotCXNldF9pbnRyX2dhdGUoMTEsICZzZWdtZW50X25vdF9wcmVzZW50KTsKLQlzZXRfaW50cl9nYXRlX2lzdCgxMiwgJnN0YWNrX3NlZ21lbnQsIFNUQUNLRkFVTFRfU1RBQ0spOwotCXNldF9pbnRyX2dhdGUoMTMsICZnZW5lcmFsX3Byb3RlY3Rpb24pOwotCXNldF9pbnRyX2dhdGUoMTQsICZwYWdlX2ZhdWx0KTsKLQlzZXRfaW50cl9nYXRlKDE1LCAmc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyk7Ci0Jc2V0X2ludHJfZ2F0ZSgxNiwgJmNvcHJvY2Vzc29yX2Vycm9yKTsKLQlzZXRfaW50cl9nYXRlKDE3LCAmYWxpZ25tZW50X2NoZWNrKTsKLSNpZmRlZiBDT05GSUdfWDg2X01DRQotCXNldF9pbnRyX2dhdGVfaXN0KDE4LCAmbWFjaGluZV9jaGVjaywgTUNFX1NUQUNLKTsKLSNlbmRpZgotCXNldF9pbnRyX2dhdGUoMTksICZzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKTsKLQotI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCXNldF9zeXN0ZW1fZ2F0ZShJQTMyX1NZU0NBTExfVkVDVE9SLCBpYTMyX3N5c2NhbGwpOwotI2VuZGlmCi0JLyoKLQkgKiBpbml0aWFsaXplIHRoZSBwZXIgdGhyZWFkIGV4dGVuZGVkIHN0YXRlOgotCSAqLwotCWluaXRfdGhyZWFkX3hzdGF0ZSgpOwotCS8qCi0JICogU2hvdWxkIGJlIGEgYmFycmllciBmb3IgYW55IGV4dGVybmFsIENQVSBzdGF0ZToKLQkgKi8KLQljcHVfaW5pdCgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBvb3BzX3NldHVwKGNoYXIgKnMpCi17Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXN0cmNtcChzLCAicGFuaWMiKSkKLQkJcGFuaWNfb25fb29wcyA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgib29wcyIsIG9vcHNfc2V0dXApOwotCi1zdGF0aWMgaW50IF9faW5pdCBrc3RhY2tfc2V0dXAoY2hhciAqcykKLXsKLQlpZiAoIXMpCi0JCXJldHVybiAtRUlOVkFMOwotCWtzdGFja19kZXB0aF90b19wcmludCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oImtzdGFjayIsIGtzdGFja19zZXR1cCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNvZGVfYnl0ZXNfc2V0dXAoY2hhciAqcykKLXsKLQljb2RlX2J5dGVzID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7Ci0JaWYgKGNvZGVfYnl0ZXMgPiA4MTkyKQotCQljb2RlX2J5dGVzID0gODE5MjsKLQotCXJldHVybiAxOwotfQotX19zZXR1cCgiY29kZV9ieXRlcz0iLCBjb2RlX2J5dGVzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCA4Zjk4ZTlkLi4xNjFiYjg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIC8qCiAgKiBSZWFkIFRTQyBhbmQgdGhlIHJlZmVyZW5jZSBjb3VudGVycy4gVGFrZSBjYXJlIG9mIFNNSSBkaXN0dXJiYW5jZQogICovCi1zdGF0aWMgdTY0IHRzY19yZWFkX3JlZnModTY0ICpwbSwgdTY0ICpocGV0KQorc3RhdGljIHU2NCB0c2NfcmVhZF9yZWZzKHU2NCAqcCwgaW50IGhwZXQpCiB7CiAJdTY0IHQxLCB0MjsKIAlpbnQgaTsKQEAgLTExMiw5ICsxMTIsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVUUklFUzsgaSsrKSB7CiAJCXQxID0gZ2V0X2N5Y2xlcygpOwogCQlpZiAoaHBldCkKLQkJCSpocGV0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpICYgMHhGRkZGRkZGRjsKKwkJCSpwID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpICYgMHhGRkZGRkZGRjsKIAkJZWxzZQotCQkJKnBtID0gYWNwaV9wbV9yZWFkX2Vhcmx5KCk7CisJCQkqcCA9IGFjcGlfcG1fcmVhZF9lYXJseSgpOwogCQl0MiA9IGdldF9jeWNsZXMoKTsKIAkJaWYgKCh0MiAtIHQxKSA8IFNNSV9UUkVTSE9MRCkKIAkJCXJldHVybiB0MjsKQEAgLTEyMywxMyArMTIzLDU5IEBACiB9CiAKIC8qCisgKiBDYWxjdWxhdGUgdGhlIFRTQyBmcmVxdWVuY3kgZnJvbSBIUEVUIHJlZmVyZW5jZQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2hwZXRfcmVmKHU2NCBkZWx0YXRzYywgdTY0IGhwZXQxLCB1NjQgaHBldDIpCit7CisJdTY0IHRtcDsKKworCWlmIChocGV0MiA8IGhwZXQxKQorCQlocGV0MiArPSAweDEwMDAwMDAwMFVMTDsKKwlocGV0MiAtPSBocGV0MTsKKwl0bXAgPSAoKHU2NClocGV0MiAqIGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpKTsKKwlkb19kaXYodG1wLCAxMDAwMDAwKTsKKwlkb19kaXYoZGVsdGF0c2MsIHRtcCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIGRlbHRhdHNjOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBUU0MgZnJlcXVlbmN5IGZyb20gUE1UaW1lciByZWZlcmVuY2UKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19wbXRpbWVyX3JlZih1NjQgZGVsdGF0c2MsIHU2NCBwbTEsIHU2NCBwbTIpCit7CisJdTY0IHRtcDsKKworCWlmICghcG0xICYmICFwbTIpCisJCXJldHVybiBVTE9OR19NQVg7CisKKwlpZiAocG0yIDwgcG0xKQorCQlwbTIgKz0gKHU2NClBQ1BJX1BNX09WUlJVTjsKKwlwbTIgLT0gcG0xOworCXRtcCA9IHBtMiAqIDEwMDAwMDAwMDBMTDsKKwlkb19kaXYodG1wLCBQTVRNUl9USUNLU19QRVJfU0VDKTsKKwlkb19kaXYoZGVsdGF0c2MsIHRtcCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIGRlbHRhdHNjOworfQorCisjZGVmaW5lIENBTF9NUwkJMTAKKyNkZWZpbmUgQ0FMX0xBVENICShDTE9DS19USUNLX1JBVEUgLyAoMTAwMCAvIENBTF9NUykpCisjZGVmaW5lIENBTF9QSVRfTE9PUFMJMTAwMAorCisjZGVmaW5lIENBTDJfTVMJCTUwCisjZGVmaW5lIENBTDJfTEFUQ0gJKENMT0NLX1RJQ0tfUkFURSAvICgxMDAwIC8gQ0FMMl9NUykpCisjZGVmaW5lIENBTDJfUElUX0xPT1BTCTUwMDAKKworCisvKgogICogVHJ5IHRvIGNhbGlicmF0ZSB0aGUgVFNDIGFnYWluc3QgdGhlIFByb2dyYW1tYWJsZQogICogSW50ZXJydXB0IFRpbWVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgVFNDCiAgKiBpbiBrSHouCiAgKgogICogUmV0dXJuIFVMT05HX01BWCBvbiBmYWlsdXJlIHRvIGNhbGlicmF0ZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGl0X2NhbGlicmF0ZV90c2Modm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBpdF9jYWxpYnJhdGVfdHNjKHUzMiBsYXRjaCwgdW5zaWduZWQgbG9uZyBtcywgaW50IGxvb3BtaW4pCiB7CiAJdTY0IHRzYywgdDEsIHQyLCBkZWx0YTsKIAl1bnNpZ25lZCBsb25nIHRzY21pbiwgdHNjbWF4OwpAQCAtMTQ0LDggKzE5MCw4IEBACiAJICogKExTQiB0aGVuIE1TQikgdG8gYmVnaW4gY291bnRkb3duLgogCSAqLwogCW91dGIoMHhiMCwgMHg0Myk7Ci0Jb3V0YigoQ0xPQ0tfVElDS19SQVRFIC8gKDEwMDAgLyA1MCkpICYgMHhmZiwgMHg0Mik7Ci0Jb3V0YigoQ0xPQ0tfVElDS19SQVRFIC8gKDEwMDAgLyA1MCkpID4+IDgsIDB4NDIpOworCW91dGIobGF0Y2ggJiAweGZmLCAweDQyKTsKKwlvdXRiKGxhdGNoID4+IDgsIDB4NDIpOwogCiAJdHNjID0gdDEgPSB0MiA9IGdldF9jeWNsZXMoKTsKIApAQCAtMTY2LDMxICsyMTIsMTU0IEBACiAJLyoKIAkgKiBTYW5pdHkgY2hlY2tzOgogCSAqCi0JICogSWYgd2Ugd2VyZSBub3QgYWJsZSB0byByZWFkIHRoZSBQSVQgbW9yZSB0aGFuIDUwMDAKKwkgKiBJZiB3ZSB3ZXJlIG5vdCBhYmxlIHRvIHJlYWQgdGhlIFBJVCBtb3JlIHRoYW4gbG9vcG1pbgogCSAqIHRpbWVzLCB0aGVuIHdlIGhhdmUgYmVlbiBoaXQgYnkgYSBtYXNzaXZlIFNNSQogCSAqCiAJICogSWYgdGhlIG1heGltdW0gaXMgMTAgdGltZXMgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0sCiAJICogdGhlbiB3ZSBnb3QgaGl0IGJ5IGFuIFNNSSBhcyB3ZWxsLgogCSAqLwotCWlmIChwaXRjbnQgPCA1MDAwIHx8IHRzY21heCA+IDEwICogdHNjbWluKQorCWlmIChwaXRjbnQgPCBsb29wbWluIHx8IHRzY21heCA+IDEwICogdHNjbWluKQogCQlyZXR1cm4gVUxPTkdfTUFYOwogCiAJLyogQ2FsY3VsYXRlIHRoZSBQSVQgdmFsdWUgKi8KIAlkZWx0YSA9IHQyIC0gdDE7Ci0JZG9fZGl2KGRlbHRhLCA1MCk7CisJZG9fZGl2KGRlbHRhLCBtcyk7CiAJcmV0dXJuIGRlbHRhOwogfQogCisvKgorICogVGhpcyByZWFkcyB0aGUgY3VycmVudCBNU0Igb2YgdGhlIFBJVCBjb3VudGVyLCBhbmQKKyAqIGNoZWNrcyBpZiB3ZSBhcmUgcnVubmluZyBvbiBzdWZmaWNpZW50bHkgZmFzdCBhbmQKKyAqIG5vbi12aXJ0dWFsaXplZCBoYXJkd2FyZS4KKyAqCisgKiBPdXIgZXhwZWN0YXRpb25zIGFyZToKKyAqCisgKiAgLSB0aGUgUElUIGlzIHJ1bm5pbmcgYXQgcm91Z2hseSAxLjE5TUh6CisgKgorICogIC0gZWFjaCBJTyBpcyBnb2luZyB0byB0YWtlIGFib3V0IDF1cyBvbiByZWFsIGhhcmR3YXJlLAorICogICAgYnV0IHdlIGFsbG93IGl0IHRvIGJlIG11Y2ggZmFzdGVyIChieSBhIGZhY3RvciBvZiAxMCkgb3IKKyAqICAgIF9zbGlnaHRseV8gc2xvd2VyIChpZSB3ZSBhbGxvdyB1cCB0byBhIDJ1cyByZWFkK2NvdW50ZXIKKyAqICAgIHVwZGF0ZSAtIGFueXRoaW5nIGVsc2UgaW1wbGllcyBhIHVuYWNjZXB0YWJseSBzbG93IENQVQorICogICAgb3IgUElUIGZvciB0aGUgZmFzdCBjYWxpYnJhdGlvbiB0byB3b3JrLgorICoKKyAqICAtIHdpdGggMjU2IFBJVCB0aWNrcyB0byByZWFkIHRoZSB2YWx1ZSwgd2UgaGF2ZSAyMTR1cyB0bworICogICAgc2VlIHRoZSBzYW1lIE1TQiAoYW5kIG92ZXJoZWFkIGxpa2UgZG9pbmcgYSBzaW5nbGUgVFNDCisgKiAgICByZWFkIHBlciBNU0IgdmFsdWUgZXRjKS4KKyAqCisgKiAgLSBXZSdyZSBkb2luZyAyIHJlYWRzIHBlciBsb29wIChMU0IsIE1TQiksIGFuZCB3ZSBleHBlY3QKKyAqICAgIHRoZW0gZWFjaCB0byB0YWtlIGFib3V0IGEgbWljcm9zZWNvbmQgb24gcmVhbCBoYXJkd2FyZS4KKyAqICAgIFNvIHdlIGV4cGVjdCBhIGNvdW50IHZhbHVlIG9mIGFyb3VuZCAxMDAuIEJ1dCB3ZSdsbCBiZQorICogICAgZ2VuZXJvdXMsIGFuZCBhY2NlcHQgYW55dGhpbmcgb3ZlciA1MC4KKyAqCisgKiAgLSBpZiB0aGUgUElUIGlzIHN0dWNrLCBhbmQgd2Ugc2VlICptYW55KiBtb3JlIHJlYWRzLCB3ZQorICogICAgcmV0dXJuIGVhcmx5IChhbmQgdGhlIG5leHQgY2FsbGVyIG9mIHBpdF9leHBlY3RfbXNiKCkKKyAqICAgIHRoZW4gY29uc2lkZXIgaXQgYSBmYWlsdXJlIHdoZW4gdGhleSBkb24ndCBzZWUgdGhlCisgKiAgICBuZXh0IGV4cGVjdGVkIHZhbHVlKS4KKyAqCisgKiBUaGVzZSBleHBlY3RhdGlvbnMgbWVhbiB0aGF0IHdlIGtub3cgdGhhdCB3ZSBoYXZlIHNlZW4gdGhlCisgKiB0cmFuc2l0aW9uIGZyb20gb25lIGV4cGVjdGVkIHZhbHVlIHRvIGFub3RoZXIgd2l0aCBhIGZhaXJseQorICogaGlnaCBhY2N1cmFjeSwgYW5kIHdlIGRpZG4ndCBtaXNzIGFueSBldmVudHMuIFdlIGNhbiB0aHVzCisgKiB1c2UgdGhlIFRTQyB2YWx1ZSBhdCB0aGUgdHJhbnNpdGlvbnMgdG8gY2FsY3VsYXRlIGEgcHJldHR5CisgKiBnb29kIHZhbHVlIGZvciB0aGUgVFNDIGZyZXF1ZW5jdHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBpdF9leHBlY3RfbXNiKHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWludCBjb3VudCA9IDA7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA1MDAwMDsgY291bnQrKykgeworCQkvKiBJZ25vcmUgTFNCICovCisJCWluYigweDQyKTsKKwkJaWYgKGluYigweDQyKSAhPSB2YWwpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGNvdW50ID4gNTA7Cit9CisKKy8qCisgKiBIb3cgbWFueSBNU0IgdmFsdWVzIGRvIHdlIHdhbnQgdG8gc2VlPyBXZSBhaW0gZm9yIGEKKyAqIDE1bXMgY2FsaWJyYXRpb24sIHdoaWNoIGFzc3VtaW5nIGEgMnVzIGNvdW50ZXIgcmVhZAorICogZXJyb3Igc2hvdWxkIGdpdmUgdXMgcm91Z2hseSAxNTAgcHBtIHByZWNpc2lvbiBmb3IKKyAqIHRoZSBjYWxpYnJhdGlvbi4KKyAqLworI2RlZmluZSBRVUlDS19QSVRfTVMgMTUKKyNkZWZpbmUgUVVJQ0tfUElUX0lURVJBVElPTlMgKFFVSUNLX1BJVF9NUyAqIFBJVF9USUNLX1JBVEUgLyAxMDAwIC8gMjU2KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBxdWlja19waXRfY2FsaWJyYXRlKHZvaWQpCit7CisJLyogU2V0IHRoZSBHYXRlIGhpZ2gsIGRpc2FibGUgc3BlYWtlciAqLworCW91dGIoKGluYigweDYxKSAmIH4weDAyKSB8IDB4MDEsIDB4NjEpOworCisJLyoKKwkgKiBDb3VudGVyIDIsIG1vZGUgMCAob25lLXNob3QpLCBiaW5hcnkgY291bnQKKwkgKgorCSAqIE5PVEUhIE1vZGUgMiBkZWNyZW1lbnRzIGJ5IHR3byAoYW5kIHRoZW4gdGhlCisJICogb3V0cHV0IGlzIGZsaXBwZWQgZWFjaCB0aW1lLCBnaXZpbmcgdGhlIHNhbWUKKwkgKiBmaW5hbCBvdXRwdXQgZnJlcXVlbmN5IGFzIGEgZGVjcmVtZW50LWJ5LW9uZSksCisJICogc28gbW9kZSAwIGlzIG11Y2ggYmV0dGVyIHdoZW4gbG9va2luZyBhdCB0aGUKKwkgKiBpbmRpdmlkdWFsIGNvdW50cy4KKwkgKi8KKwlvdXRiKDB4YjAsIDB4NDMpOworCisJLyogU3RhcnQgYXQgMHhmZmZmICovCisJb3V0YigweGZmLCAweDQyKTsKKwlvdXRiKDB4ZmYsIDB4NDIpOworCisJaWYgKHBpdF9leHBlY3RfbXNiKDB4ZmYpKSB7CisJCWludCBpOworCQl1NjQgdDEsIHQyLCBkZWx0YTsKKwkJdW5zaWduZWQgY2hhciBleHBlY3QgPSAweGZlOworCisJCXQxID0gZ2V0X2N5Y2xlcygpOworCQlmb3IgKGkgPSAwOyBpIDwgUVVJQ0tfUElUX0lURVJBVElPTlM7IGkrKywgZXhwZWN0LS0pIHsKKwkJCWlmICghcGl0X2V4cGVjdF9tc2IoZXhwZWN0KSkKKwkJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQl0MiA9IGdldF9jeWNsZXMoKTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgd2UgY2FuIHJlbHkgb24gdGhlIHNlY29uZCBUU0MgdGltZXN0YW1wOgorCQkgKi8KKwkJaWYgKCFwaXRfZXhwZWN0X21zYihleHBlY3QpKQorCQkJZ290byBmYWlsZWQ7CisKKwkJLyoKKwkJICogT2ssIGlmIHdlIGdldCBoZXJlLCB0aGVuIHdlJ3ZlIHNlZW4gdGhlCisJCSAqIE1TQiBvZiB0aGUgUElUIGRlY3JlbWVudCBRVUlDS19QSVRfSVRFUkFUSU9OUworCQkgKiB0aW1lcywgYW5kIGVhY2ggTVNCIGhhZCBtYW55IGhpdHMsIHNvIHdlIG5ldmVyCisJCSAqIGhhZCBhbnkgc3VkZGVuIGp1bXBzLgorCQkgKgorCQkgKiBBcyBhIHJlc3VsdCwgd2UgY2FuIGRlcGVuZCBvbiB0aGVyZSBub3QgYmVpbmcKKwkJICogYW55IG9kZCBkZWxheXMgYW55d2hlcmUsIGFuZCB0aGUgVFNDIHJlYWRzIGFyZQorCQkgKiByZWxpYWJsZS4KKwkJICoKKwkJICoga0h6ID0gdGlja3MgLyB0aW1lLWluLXNlY29uZHMgLyAxMDAwOworCQkgKiBrSHogPSAodDIgLSB0MSkgLyAoUVBJICogMjU2IC8gUElUX1RJQ0tfUkFURSkgLyAxMDAwCisJCSAqIGtIeiA9ICgodDIgLSB0MSkgKiBQSVRfVElDS19SQVRFKSAvIChRUEkgKiAyNTYgKiAxMDAwKQorCQkgKi8KKwkJZGVsdGEgPSAodDIgLSB0MSkqUElUX1RJQ0tfUkFURTsKKwkJZG9fZGl2KGRlbHRhLCBRVUlDS19QSVRfSVRFUkFUSU9OUyoyNTYqMTAwMCk7CisJCXByaW50aygiRmFzdCBUU0MgY2FsaWJyYXRpb24gdXNpbmcgUElUXG4iKTsKKwkJcmV0dXJuIGRlbHRhOworCX0KK2ZhaWxlZDoKKwlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiBuYXRpdmVfY2FsaWJyYXRlX3RzYyAtIGNhbGlicmF0ZSB0aGUgdHNjIG9uIGJvb3QKICAqLwogdW5zaWduZWQgbG9uZyBuYXRpdmVfY2FsaWJyYXRlX3RzYyh2b2lkKQogewotCXU2NCB0c2MxLCB0c2MyLCBkZWx0YSwgcG0xLCBwbTIsIGhwZXQxLCBocGV0MjsKKwl1NjQgdHNjMSwgdHNjMiwgZGVsdGEsIHJlZjEsIHJlZjI7CiAJdW5zaWduZWQgbG9uZyB0c2NfcGl0X21pbiA9IFVMT05HX01BWCwgdHNjX3JlZl9taW4gPSBVTE9OR19NQVg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaHBldCA9IGlzX2hwZXRfZW5hYmxlZCgpLCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGxhdGNoLCBtcywgZmFzdF9jYWxpYnJhdGU7CisJaW50IGhwZXQgPSBpc19ocGV0X2VuYWJsZWQoKSwgaSwgbG9vcG1pbjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlmYXN0X2NhbGlicmF0ZSA9IHF1aWNrX3BpdF9jYWxpYnJhdGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaWYgKGZhc3RfY2FsaWJyYXRlKQorCQlyZXR1cm4gZmFzdF9jYWxpYnJhdGU7CiAKIAkvKgogCSAqIFJ1biA1IGNhbGlicmF0aW9uIGxvb3BzIHRvIGdldCB0aGUgbG93ZXN0IGZyZXF1ZW5jeSB2YWx1ZQpAQCAtMjE2LDcgKzM4NSwxMyBAQAogCSAqIGNhbGlicmF0aW9uIGRlbGF5IGxvb3AgYXMgd2UgaGF2ZSB0byB3YWl0IGZvciBhIGNlcnRhaW4KIAkgKiBhbW91bnQgb2YgdGltZSBhbnl3YXkuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCisJLyogUHJlc2V0IFBJVCBsb29wIHZhbHVlcyAqLworCWxhdGNoID0gQ0FMX0xBVENIOworCW1zID0gQ0FMX01TOworCWxvb3BtaW4gPSBDQUxfUElUX0xPT1BTOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHRzY19waXRfa2h6OwogCiAJCS8qCkBAIC0yMjYsMTYgKzQwMSwxNiBAQAogCQkgKiByZWFkIHRoZSBlbmQgdmFsdWUuCiAJCSAqLwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXRzYzEgPSB0c2NfcmVhZF9yZWZzKCZwbTEsIGhwZXQgPyAmaHBldDEgOiBOVUxMKTsKLQkJdHNjX3BpdF9raHogPSBwaXRfY2FsaWJyYXRlX3RzYygpOwotCQl0c2MyID0gdHNjX3JlYWRfcmVmcygmcG0yLCBocGV0ID8gJmhwZXQyIDogTlVMTCk7CisJCXRzYzEgPSB0c2NfcmVhZF9yZWZzKCZyZWYxLCBocGV0KTsKKwkJdHNjX3BpdF9raHogPSBwaXRfY2FsaWJyYXRlX3RzYyhsYXRjaCwgbXMsIGxvb3BtaW4pOworCQl0c2MyID0gdHNjX3JlYWRfcmVmcygmcmVmMiwgaHBldCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCQkvKiBQaWNrIHRoZSBsb3dlc3QgUElUIFRTQyBjYWxpYnJhdGlvbiBzbyBmYXIgKi8KIAkJdHNjX3BpdF9taW4gPSBtaW4odHNjX3BpdF9taW4sIHRzY19waXRfa2h6KTsKIAogCQkvKiBocGV0IG9yIHBtdGltZXIgYXZhaWxhYmxlID8gKi8KLQkJaWYgKCFocGV0ICYmICFwbTEgJiYgIXBtMikKKwkJaWYgKCFocGV0ICYmICFyZWYxICYmICFyZWYyKQogCQkJY29udGludWU7CiAKIAkJLyogQ2hlY2ssIHdoZXRoZXIgdGhlIHNhbXBsaW5nIHdhcyBkaXN0dXJiZWQgYnkgYW4gU01JICovCkBAIC0yNDMsMjMgKzQxOCw0MSBAQAogCQkJY29udGludWU7CiAKIAkJdHNjMiA9ICh0c2MyIC0gdHNjMSkgKiAxMDAwMDAwTEw7CisJCWlmIChocGV0KQorCQkJdHNjMiA9IGNhbGNfaHBldF9yZWYodHNjMiwgcmVmMSwgcmVmMik7CisJCWVsc2UKKwkJCXRzYzIgPSBjYWxjX3BtdGltZXJfcmVmKHRzYzIsIHJlZjEsIHJlZjIpOwogCi0JCWlmIChocGV0KSB7Ci0JCQlpZiAoaHBldDIgPCBocGV0MSkKLQkJCQlocGV0MiArPSAweDEwMDAwMDAwMFVMTDsKLQkJCWhwZXQyIC09IGhwZXQxOwotCQkJdHNjMSA9ICgodTY0KWhwZXQyICogaHBldF9yZWFkbChIUEVUX1BFUklPRCkpOwotCQkJZG9fZGl2KHRzYzEsIDEwMDAwMDApOwotCQl9IGVsc2UgewotCQkJaWYgKHBtMiA8IHBtMSkKLQkJCQlwbTIgKz0gKHU2NClBQ1BJX1BNX09WUlJVTjsKLQkJCXBtMiAtPSBwbTE7Ci0JCQl0c2MxID0gcG0yICogMTAwMDAwMDAwMExMOwotCQkJZG9fZGl2KHRzYzEsIFBNVE1SX1RJQ0tTX1BFUl9TRUMpOworCQl0c2NfcmVmX21pbiA9IG1pbih0c2NfcmVmX21pbiwgKHVuc2lnbmVkIGxvbmcpIHRzYzIpOworCisJCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgZGV2aWF0aW9uICovCisJCWRlbHRhID0gKCh1NjQpIHRzY19waXRfbWluKSAqIDEwMDsKKwkJZG9fZGl2KGRlbHRhLCB0c2NfcmVmX21pbik7CisKKwkJLyoKKwkJICogSWYgYm90aCBjYWxpYnJhdGlvbiByZXN1bHRzIGFyZSBpbnNpZGUgYSAxMCUgd2luZG93CisJCSAqIHRoZW4gd2UgY2FuIGJlIHN1cmUsIHRoYXQgdGhlIGNhbGlicmF0aW9uCisJCSAqIHN1Y2NlZWRlZC4gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHJpZ2h0IGF3YXkuIFdlCisJCSAqIHVzZSB0aGUgcmVmZXJlbmNlIHZhbHVlLCBhcyBpdCBpcyBtb3JlIHByZWNpc2UuCisJCSAqLworCQlpZiAoZGVsdGEgPj0gOTAgJiYgZGVsdGEgPD0gMTEwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIlRTQzogUElUIGNhbGlicmF0aW9uIG1hdGNoZXMgJXMuICVkIGxvb3BzXG4iLAorCQkJICAgICAgIGhwZXQgPyAiSFBFVCIgOiAiUE1USU1FUiIsIGkgKyAxKTsKKwkJCXJldHVybiB0c2NfcmVmX21pbjsKIAkJfQogCi0JCWRvX2Rpdih0c2MyLCB0c2MxKTsKLQkJdHNjX3JlZl9taW4gPSBtaW4odHNjX3JlZl9taW4sICh1bnNpZ25lZCBsb25nKSB0c2MyKTsKKwkJLyoKKwkJICogQ2hlY2sgd2hldGhlciBQSVQgZmFpbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzCisJCSAqIGhhcHBlbnMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBXZSBuZWVkIHRvCisJCSAqIGdpdmUgdGhlIHZpcnR1YWwgUEMgYSBzbGlnaHRseSBsb25nZXIgdGltZWZyYW1lIGZvcgorCQkgKiB0aGUgSFBFVC9QTVRJTUVSIHRvIG1ha2UgdGhlIHJlc3VsdCBwcmVjaXNlLgorCQkgKi8KKwkJaWYgKGkgPT0gMSAmJiB0c2NfcGl0X21pbiA9PSBVTE9OR19NQVgpIHsKKwkJCWxhdGNoID0gQ0FMMl9MQVRDSDsKKwkJCW1zID0gQ0FMMl9NUzsKKwkJCWxvb3BtaW4gPSBDQUwyX1BJVF9MT09QUzsKKwkJfQogCX0KIAogCS8qCkBAIC0yNzAsNyArNDYzLDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDOiBVbmFibGUgdG8gY2FsaWJyYXRlIGFnYWluc3QgUElUXG4iKTsKIAogCQkvKiBXZSBkb24ndCBoYXZlIGFuIGFsdGVybmF0aXZlIHNvdXJjZSwgZGlzYWJsZSBUU0MgKi8KLQkJaWYgKCFocGV0ICYmICFwbTEgJiYgIXBtMikgeworCQlpZiAoIWhwZXQgJiYgIXJlZjEgJiYgIXJlZjIpIHsKIAkJCXByaW50aygiVFNDOiBObyByZWZlcmVuY2UgKEhQRVQvUE1USU1FUikgYXZhaWxhYmxlXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yNzgsNyArNDcxLDcgQEAKIAkJLyogVGhlIGFsdGVybmF0aXZlIHNvdXJjZSBmYWlsZWQgYXMgd2VsbCwgZGlzYWJsZSBUU0MgKi8KIAkJaWYgKHRzY19yZWZfbWluID09IFVMT05HX01BWCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDOiBIUEVUL1BNVElNRVIgY2FsaWJyYXRpb24gIgotCQkJICAgICAgICJmYWlsZWQgZHVlIHRvIFNNSSBkaXN0dXJiYW5jZS5cbiIpOworCQkJICAgICAgICJmYWlsZWQuXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTI5MCw0NCArNDgzLDI1IEBACiAJfQogCiAJLyogV2UgZG9uJ3QgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBzb3VyY2UsIHVzZSB0aGUgUElUIGNhbGlicmF0aW9uIHZhbHVlICovCi0JaWYgKCFocGV0ICYmICFwbTEgJiYgIXBtMikgeworCWlmICghaHBldCAmJiAhcmVmMSAmJiAhcmVmMikgewogCQlwcmludGsoS0VSTl9JTkZPICJUU0M6IFVzaW5nIFBJVCBjYWxpYnJhdGlvbiB2YWx1ZVxuIik7CiAJCXJldHVybiB0c2NfcGl0X21pbjsKIAl9CiAKIAkvKiBUaGUgYWx0ZXJuYXRpdmUgc291cmNlIGZhaWxlZCwgdXNlIHRoZSBQSVQgY2FsaWJyYXRpb24gdmFsdWUgKi8KIAlpZiAodHNjX3JlZl9taW4gPT0gVUxPTkdfTUFYKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRTQzogSFBFVC9QTVRJTUVSIGNhbGlicmF0aW9uIGZhaWxlZCBkdWUgIgotCQkgICAgICAgInRvIFNNSSBkaXN0dXJiYW5jZS4gVXNpbmcgUElUIGNhbGlicmF0aW9uXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDOiBIUEVUL1BNVElNRVIgY2FsaWJyYXRpb24gZmFpbGVkLiAiCisJCSAgICAgICAiVXNpbmcgUElUIGNhbGlicmF0aW9uXG4iKTsKIAkJcmV0dXJuIHRzY19waXRfbWluOwogCX0KIAotCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgZGV2aWF0aW9uICovCi0JZGVsdGEgPSAoKHU2NCkgdHNjX3BpdF9taW4pICogMTAwOwotCWRvX2RpdihkZWx0YSwgdHNjX3JlZl9taW4pOwotCi0JLyoKLQkgKiBJZiBib3RoIGNhbGlicmF0aW9uIHJlc3VsdHMgYXJlIGluc2lkZSBhIDUlIHdpbmRvdywgdGhlIHdlCi0JICogdXNlIHRoZSBsb3dlciBmcmVxdWVuY3kgb2YgdGhvc2UgYXMgaXQgaXMgcHJvYmFibHkgdGhlCi0JICogY2xvc2VzdCBlc3RpbWF0ZS4KLQkgKi8KLQlpZiAoZGVsdGEgPj0gOTUgJiYgZGVsdGEgPD0gMTA1KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRTQzogUElUIGNhbGlicmF0aW9uIGNvbmZpcm1lZCBieSAlcy5cbiIsCi0JCSAgICAgICBocGV0ID8gIkhQRVQiIDogIlBNVElNRVIiKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVFNDOiB1c2luZyAlcyBjYWxpYnJhdGlvbiB2YWx1ZVxuIiwKLQkJICAgICAgIHRzY19waXRfbWluIDw9IHRzY19yZWZfbWluID8gIlBJVCIgOgotCQkgICAgICAgaHBldCA/ICJIUEVUIiA6ICJQTVRJTUVSIik7Ci0JCXJldHVybiB0c2NfcGl0X21pbiA8PSB0c2NfcmVmX21pbiA/IHRzY19waXRfbWluIDogdHNjX3JlZl9taW47Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDOiBQSVQgY2FsaWJyYXRpb24gZGV2aWF0ZXMgZnJvbSAlczogJWx1ICVsdS5cbiIsCi0JICAgICAgIGhwZXQgPyAiSFBFVCIgOiAiUE1USU1FUiIsIHRzY19waXRfbWluLCB0c2NfcmVmX21pbik7Ci0KIAkvKgogCSAqIFRoZSBjYWxpYnJhdGlvbiB2YWx1ZXMgZGlmZmVyIHRvbyBtdWNoLiBJbiBkb3VidCwgd2UgdXNlCiAJICogdGhlIFBJVCB2YWx1ZSBhcyB3ZSBrbm93IHRoYXQgdGhlcmUgYXJlIFBNVElNRVJzIGFyb3VuZAotCSAqIHJ1bm5pbmcgYXQgZG91YmxlIHNwZWVkLgorCSAqIHJ1bm5pbmcgYXQgZG91YmxlIHNwZWVkLiBBdCBsZWFzdCB3ZSBsZXQgdGhlIHVzZXIga25vdzoKIAkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJUU0M6IFBJVCBjYWxpYnJhdGlvbiBkZXZpYXRlcyBmcm9tICVzOiAlbHUgJWx1LlxuIiwKKwkgICAgICAgaHBldCA/ICJIUEVUIiA6ICJQTVRJTUVSIiwgdHNjX3BpdF9taW4sIHRzY19yZWZfbWluKTsKIAlwcmludGsoS0VSTl9JTkZPICJUU0M6IFVzaW5nIFBJVCBjYWxpYnJhdGlvbiB2YWx1ZVxuIik7CiAJcmV0dXJuIHRzY19waXRfbWluOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Zpc3dzX3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3Zpc3dzX3F1aXJrcy5jCmluZGV4IDU5NGVmNDcuLjYxYTk3ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92aXN3c19xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdmlzd3NfcXVpcmtzLmMKQEAgLTI1LDQ1ICsyNSwzMSBAQAogI2luY2x1ZGUgPGFzbS92aXN3cy9jb2JhbHQuaD4KICNpbmNsdWRlIDxhc20vdmlzd3MvcGlpeDQuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2hfaXBpLmg+CiAKICNpbmNsdWRlICJtYWNoX2FwaWMuaCIKIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vaXJxX3ZlY3RvcnMuaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvY29iYWx0Lmg+CiAjaW5jbHVkZSA8YXNtL3Zpc3dzL2xpdGhpdW0uaD4KLSNpbmNsdWRlIDxhc20vdmlzd3MvcGlpeDQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KIAogZXh0ZXJuIGludCBub19icm9hZGNhc3Q7CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+Ci0jaW5jbHVkZSA8YXNtL3Zpc3dzL2NvYmFsdC5oPgotI2luY2x1ZGUgPGFzbS92aXN3cy9saXRoaXVtLmg+CiAKIGNoYXIgdmlzd3NfYm9hcmRfdHlwZQk9IC0xOwogY2hhciB2aXN3c19ib2FyZF9yZXYJPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jCmluZGV4IDM4ZjU2NmYuLjRlZWI1Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogLyoKICAqIEtub3duIHByb2JsZW1zOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtaV8zMi5jIGIvYXJjaC94ODYva2VybmVsL3ZtaV8zMi5jCmluZGV4IDZjYTUxNWQuLjhiNmMzOTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQkJCWNvbnN0IHZvaWQgKmRlc2MpCiB7CiAJdTMyICpsZHRfZW50cnkgPSAodTMyICopZGVzYzsKLQl2bWlfb3BzLndyaXRlX2lkdF9lbnRyeShkdCwgZW50cnksIGxkdF9lbnRyeVswXSwgbGR0X2VudHJ5WzFdKTsKKwl2bWlfb3BzLndyaXRlX2xkdF9lbnRyeShkdCwgZW50cnksIGxkdF9lbnRyeVswXSwgbGR0X2VudHJ5WzFdKTsKIH0KIAogc3RhdGljIHZvaWQgdm1pX2xvYWRfc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsCkBAIC0zOTMsMTMgKzM5MywxMyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHZtaV9hbGxvY2F0ZV9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfYWxsb2NhdGVfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl2bWlfc2V0X3BhZ2VfdHlwZShwZm4sIFZNSV9QQUdFX0wxKTsKIAl2bWlfb3BzLmFsbG9jYXRlX3BhZ2UocGZuLCBWTUlfUEFHRV9MMSwgMCwgMCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtaV9hbGxvY2F0ZV9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfYWxsb2NhdGVfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKICAJLyoKIAkgKiBUaGlzIGNhbGwgY29tZXMgaW4gdmVyeSBlYXJseSwgYmVmb3JlIG1lbV9tYXAgaXMgc2V0dXAuCkBAIC00MTAsMjAgKzQxMCwyMCBAQAogCXZtaV9vcHMuYWxsb2NhdGVfcGFnZShwZm4sIFZNSV9QQUdFX0wyLCAwLCAwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgdm1pX2FsbG9jYXRlX3BtZF9jbG9uZSh1MzIgcGZuLCB1MzIgY2xvbmVwZm4sIHUzMiBzdGFydCwgdTMyIGNvdW50KQorc3RhdGljIHZvaWQgdm1pX2FsbG9jYXRlX3BtZF9jbG9uZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBjbG9uZXBmbiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKICAJdm1pX3NldF9wYWdlX3R5cGUocGZuLCBWTUlfUEFHRV9MMiB8IFZNSV9QQUdFX0NMT05FKTsKIAl2bWlfY2hlY2tfcGFnZV90eXBlKGNsb25lcGZuLCBWTUlfUEFHRV9MMik7CiAJdm1pX29wcy5hbGxvY2F0ZV9wYWdlKHBmbiwgVk1JX1BBR0VfTDIgfCBWTUlfUEFHRV9DTE9ORSwgY2xvbmVwZm4sIHN0YXJ0LCBjb3VudCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZtaV9yZWxlYXNlX3B0ZSh1MzIgcGZuKQorc3RhdGljIHZvaWQgdm1pX3JlbGVhc2VfcHRlKHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXZtaV9vcHMucmVsZWFzZV9wYWdlKHBmbiwgVk1JX1BBR0VfTDEpOwogCXZtaV9zZXRfcGFnZV90eXBlKHBmbiwgVk1JX1BBR0VfTk9STUFMKTsKIH0KIAotc3RhdGljIHZvaWQgdm1pX3JlbGVhc2VfcG1kKHUzMiBwZm4pCitzdGF0aWMgdm9pZCB2bWlfcmVsZWFzZV9wbWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJdm1pX29wcy5yZWxlYXNlX3BhZ2UocGZuLCBWTUlfUEFHRV9MMik7CiAJdm1pX3NldF9wYWdlX3R5cGUocGZuLCBWTUlfUEFHRV9OT1JNQUwpOwpAQCAtOTA1LDggKzkwNSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXBhcmFfZmlsbChwdl9hcGljX29wcy5hcGljX3JlYWQsIEFQSUNSZWFkKTsKLQlwYXJhX2ZpbGwocHZfYXBpY19vcHMuYXBpY193cml0ZSwgQVBJQ1dyaXRlKTsKKyAgICAgICBwYXJhX2ZpbGwoYXBpY19vcHMtPnJlYWQsIEFQSUNSZWFkKTsKKyAgICAgICBwYXJhX2ZpbGwoYXBpY19vcHMtPndyaXRlLCBBUElDV3JpdGUpOwogI2VuZGlmCiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfMzIubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF8zMi5sZHMuUwppbmRleCBhZjViZGFkLi5hOWI4NTYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF8zMi5sZHMuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF8zMi5sZHMuUwpAQCAtMTQwLDEwICsxNDAsMTAgQEAKIAkqKC5jb25faW5pdGNhbGwuaW5pdCkKICAgCV9fY29uX2luaXRjYWxsX2VuZCA9IC47CiAgIH0KLSAgLng4NmNwdXZlbmRvci5pbml0IDogQVQoQUREUigueDg2Y3B1dmVuZG9yLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKLQlfX3g4NmNwdXZlbmRvcl9zdGFydCA9IC47Ci0JKigueDg2Y3B1dmVuZG9yLmluaXQpCi0JX194ODZjcHV2ZW5kb3JfZW5kID0gLjsKKyAgLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7CisJX194ODZfY3B1X2Rldl9zdGFydCA9IC47CisJKigueDg2X2NwdV9kZXYuaW5pdCkKKwlfX3g4Nl9jcHVfZGV2X2VuZCA9IC47CiAgIH0KICAgU0VDVVJJVFlfSU5JVAogICAuID0gQUxJR04oNCk7CkBAIC0xODAsNiArMTgwLDcgQEAKICAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAgIC5kYXRhLnBlcmNwdSAgOiBBVChBRERSKC5kYXRhLnBlcmNwdSkgLSBMT0FEX09GRlNFVCkgewogCV9fcGVyX2NwdV9zdGFydCA9IC47CisJKiguZGF0YS5wZXJjcHUucGFnZV9hbGlnbmVkKQogCSooLmRhdGEucGVyY3B1KQogCSooLmRhdGEucGVyY3B1LnNoYXJlZF9hbGlnbmVkKQogCV9fcGVyX2NwdV9lbmQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfNjQubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUwppbmRleCA2M2U1YzFhLi40NmUwNTQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUwpAQCAtMTY4LDEyICsxNjgsMTEgQEAKIAkqKC5jb25faW5pdGNhbGwuaW5pdCkKICAgfQogICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwotICAuID0gQUxJR04oMTYpOwotICBfX3g4NmNwdXZlbmRvcl9zdGFydCA9IC47Ci0gIC54ODZjcHV2ZW5kb3IuaW5pdCA6IEFUKEFERFIoLng4NmNwdXZlbmRvci5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JKigueDg2Y3B1dmVuZG9yLmluaXQpCisgIF9feDg2X2NwdV9kZXZfc3RhcnQgPSAuOworICAueDg2X2NwdV9kZXYuaW5pdCA6IEFUKEFERFIoLng4Nl9jcHVfZGV2LmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKKwkqKC54ODZfY3B1X2Rldi5pbml0KQogICB9Ci0gIF9feDg2Y3B1dmVuZG9yX2VuZCA9IC47CisgIF9feDg2X2NwdV9kZXZfZW5kID0gLjsKICAgU0VDVVJJVFlfSU5JVAogCiAgIC4gPSBBTElHTig4KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92c21wXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnNtcF82NC5jCmluZGV4IDBjMDI5ZTguLjc3NjZkMzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92c21wXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZzbXBfNjQuYwpAQCAtNjEsNyArNjEsNyBAQAogCW5hdGl2ZV9yZXN0b3JlX2ZsKChmbGFncyB8IFg4Nl9FRkxBR1NfSUYpICYgKH5YODZfRUZMQUdTX0FDKSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBfX2luaXQgdnNtcF9wYXRjaCh1OCB0eXBlLCB1MTYgY2xvYmJlcnMsIHZvaWQgKmlidWYsCitzdGF0aWMgdW5zaWduZWQgX19pbml0X29yX21vZHVsZSB2c21wX3BhdGNoKHU4IHR5cGUsIHUxNiBjbG9iYmVycywgdm9pZCAqaWJ1ZiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbGVuKQogewogCXN3aXRjaCAodHlwZSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3hzYXZlLmMgYi9hcmNoL3g4Ni9rZXJuZWwveHNhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWJhYzhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiB4c2F2ZS94cnN0b3Igc3VwcG9ydC4KKyAqCisgKiBBdXRob3I6IFN1cmVzaCBTaWRkaGEgPHN1cmVzaC5iLnNpZGRoYUBpbnRlbC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dDMyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20veGNyLmg+CisKKy8qCisgKiBTdXBwb3J0ZWQgZmVhdHVyZSBtYXNrIGJ5IHRoZSBDUFUgYW5kIHRoZSBrZXJuZWwuCisgKi8KK3U2NCBwY250eHRfbWFzazsKKworc3RydWN0IF9mcHhfc3dfYnl0ZXMgZnhfc3dfcmVzZXJ2ZWQ7CisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCitzdHJ1Y3QgX2ZweF9zd19ieXRlcyBmeF9zd19yZXNlcnZlZF9pYTMyOworI2VuZGlmCisKKy8qCisgKiBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZQorICogdXNlciBmcHN0YXRlIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuCisgKi8KK2ludCBjaGVja19mb3JfeHN0YXRlKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgX191c2VyICpidWYsCisJCSAgICAgdm9pZCBfX3VzZXIgKmZwc3RhdGUsCisJCSAgICAgc3RydWN0IF9mcHhfc3dfYnl0ZXMgKmZ4X3N3X3VzZXIpCit7CisJaW50IG1pbl94c3RhdGVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSArCisJCQkgICAgICBzaXplb2Yoc3RydWN0IHhzYXZlX2hkcl9zdHJ1Y3QpOworCXVuc2lnbmVkIGludCBtYWdpYzI7CisJaW50IGVycjsKKworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoZnhfc3dfdXNlciwgJmJ1Zi0+c3dfcmVzZXJ2ZWRbMF0sCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBfZnB4X3N3X2J5dGVzKSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBGaXJzdCBNYWdpYyBjaGVjayBmYWlsZWQuCisJICovCisJaWYgKGZ4X3N3X3VzZXItPm1hZ2ljMSAhPSBGUF9YU1RBVEVfTUFHSUMxKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENoZWNrIGZvciBlcnJvciBzY2VuYXJpb3MuCisJICovCisJaWYgKGZ4X3N3X3VzZXItPnhzdGF0ZV9zaXplIDwgbWluX3hzdGF0ZV9zaXplIHx8CisJICAgIGZ4X3N3X3VzZXItPnhzdGF0ZV9zaXplID4geHN0YXRlX3NpemUgfHwKKwkgICAgZnhfc3dfdXNlci0+eHN0YXRlX3NpemUgPiBmeF9zd191c2VyLT5leHRlbmRlZF9zaXplKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBfX2dldF91c2VyKG1hZ2ljMiwgKF9fdTMyICopICgoKHZvaWQgKilmcHN0YXRlKSArCisJCQkJCSAgICBmeF9zd191c2VyLT5leHRlbmRlZF9zaXplIC0KKwkJCQkJICAgIEZQX1hTVEFURV9NQUdJQzJfU0laRSkpOworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBzZWNvbmQgbWFnaWMgd29yZCBhdCB0aGUgZW5kIG9mIG1lbW9yeQorCSAqIGxheW91dC4gVGhpcyBkZXRlY3RzIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGp1c3QgY29waWVkIHRoZSBsZWdhY3kKKwkgKiBmcHN0YXRlIGxheW91dCB3aXRoIG91dCBjb3B5aW5nIHRoZSBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbgorCSAqIGluIHRoZSBtZW1vcnkgbGF5b3V0LgorCSAqLworCWlmIChlcnIgfHwgbWFnaWMyICE9IEZQX1hTVEFURV9NQUdJQzIpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyoKKyAqIFNpZ25hbCBmcmFtZSBoYW5kbGVycy4KKyAqLworCitpbnQgc2F2ZV9pMzg3X3hzdGF0ZSh2b2lkIF9fdXNlciAqYnVmKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBzaWdfeHN0YXRlX3NpemUpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCUJVR19PTihzaWdfeHN0YXRlX3NpemUgPCB4c3RhdGVfc2l6ZSk7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYnVmICUgNjQpCisJCXByaW50aygic2F2ZV9pMzg3X3hzdGF0ZTogYmFkIGZwc3RhdGUgJXBcbiIsIGJ1Zik7CisKKwlpZiAoIXVzZWRfbWF0aCgpKQorCQlyZXR1cm4gMDsKKwljbGVhcl91c2VkX21hdGgoKTsgLyogdHJpZ2dlciBmaW5pdCAqLworCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1VTRURGUFUpIHsKKwkJLyoKKwkgCSAqIFN0YXJ0IHdpdGggY2xlYXJpbmcgdGhlIHVzZXIgYnVmZmVyLiBUaGlzIHdpbGwgcHJlc2VudCBhCisJIAkgKiBjbGVhbiBjb250ZXh0IGZvciB0aGUgYnl0ZXMgbm90IHRvdWNoZWQgYnkgdGhlIGZ4c2F2ZS94c2F2ZS4KKwkJICovCisJCWVyciA9IF9fY2xlYXJfdXNlcihidWYsIHNpZ194c3RhdGVfc2l6ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1hTQVZFKQorCQkJZXJyID0geHNhdmVfdXNlcihidWYpOworCQllbHNlCisJCQllcnIgPSBmeHNhdmVfdXNlcihidWYpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQl0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmPSB+VFNfVVNFREZQVTsKKwkJc3R0cygpOworCX0gZWxzZSB7CisJCWlmIChfX2NvcHlfdG9fdXNlcihidWYsICZ0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSwKKwkJCQkgICB4c3RhdGVfc2l6ZSkpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfWFNBVkUpIHsKKwkJc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnggPSBidWY7CisJCXN0cnVjdCBfeHN0YXRlIF9fdXNlciAqeCA9IGJ1ZjsKKwkJdTY0IHhzdGF0ZV9idjsKKworCQllcnIgPSBfX2NvcHlfdG9fdXNlcigmZngtPnN3X3Jlc2VydmVkLCAmZnhfc3dfcmVzZXJ2ZWQsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IF9mcHhfc3dfYnl0ZXMpKTsKKworCQllcnIgfD0gX19wdXRfdXNlcihGUF9YU1RBVEVfTUFHSUMyLAorCQkJCSAgKF9fdTMyIF9fdXNlciAqKSAoYnVmICsgc2lnX3hzdGF0ZV9zaXplCisJCQkJCQkgICAgLSBGUF9YU1RBVEVfTUFHSUMyX1NJWkUpKTsKKworCQkvKgorCQkgKiBSZWFkIHRoZSB4c3RhdGVfYnYgd2hpY2ggd2UgY29waWVkIChkaXJlY3RseSBmcm9tIHRoZSBjcHUgb3IKKwkJICogZnJvbSB0aGUgc3RhdGUgaW4gdGFzayBzdHJ1Y3QpIHRvIHRoZSB1c2VyIGJ1ZmZlcnMgYW5kCisJCSAqIHNldCB0aGUgRlAvU1NFIGJpdHMuCisJCSAqLworCQllcnIgfD0gX19nZXRfdXNlcih4c3RhdGVfYnYsICZ4LT54c3RhdGVfaGRyLnhzdGF0ZV9idik7CisKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSBjb21wYXRpYmxlLCB3ZSBhbHdheXMgc2V0IEZQL1NTRSBiaXRzIGluIHRoZSBiaXQKKwkJICogdmVjdG9yIHdoaWxlIHNhdmluZyB0aGUgc3RhdGUgdG8gdGhlIHVzZXIgY29udGV4dC4gVGhpcyB3aWxsCisJCSAqIGVuYWJsZSB1cyBjYXB0dXJpbmcgYW55IGNoYW5nZXMoZHVyaW5nIHNpZ3JldHVybikgdG8KKwkJICogdGhlIEZQL1NTRSBiaXRzIGJ5IHRoZSBsZWdhY3kgYXBwbGljYXRpb25zIHdoaWNoIGRvbid0IHRvdWNoCisJCSAqIHhzdGF0ZV9idiBpbiB0aGUgeHNhdmUgaGVhZGVyLgorCQkgKgorCQkgKiB4c2F2ZSBhd2FyZSBhcHBzIGNhbiBjaGFuZ2UgdGhlIHhzdGF0ZV9idiBpbiB0aGUgeHNhdmUKKwkJICogaGVhZGVyIGFzIHdlbGwgYXMgY2hhbmdlIGFueSBjb250ZW50cyBpbiB0aGUgbWVtb3J5IGxheW91dC4KKwkJICogeHJlc3RvcmUgYXMgcGFydCBvZiBzaWdyZXR1cm4gd2lsbCBjYXB0dXJlIGFsbCB0aGUgY2hhbmdlcy4KKwkJICovCisJCXhzdGF0ZV9idiB8PSBYU1RBVEVfRlBTU0U7CisKKwkJZXJyIHw9IF9fcHV0X3VzZXIoeHN0YXRlX2J2LCAmeC0+eHN0YXRlX2hkci54c3RhdGVfYnYpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogUmVzdG9yZSB0aGUgZXh0ZW5kZWQgc3RhdGUgaWYgcHJlc2VudC4gT3RoZXJ3aXNlLCByZXN0b3JlIHRoZSBGUC9TU0UKKyAqIHN0YXRlLgorICovCitpbnQgcmVzdG9yZV91c2VyX3hzdGF0ZSh2b2lkIF9fdXNlciAqYnVmKQoreworCXN0cnVjdCBfZnB4X3N3X2J5dGVzIGZ4X3N3X3VzZXI7CisJdTY0IG1hc2s7CisJaW50IGVycjsKKworCWlmICgoKHVuc2lnbmVkIGxvbmcpYnVmICUgNjQpIHx8CisJICAgICBjaGVja19mb3JfeHN0YXRlKGJ1ZiwgYnVmLCAmZnhfc3dfdXNlcikpCisJCWdvdG8gZnhfb25seTsKKworCW1hc2sgPSBmeF9zd191c2VyLnhzdGF0ZV9idjsKKworCS8qCisJICogcmVzdG9yZSB0aGUgc3RhdGUgcGFzc2VkIGJ5IHRoZSB1c2VyLgorCSAqLworCWVyciA9IHhyZXN0b3JlX3VzZXIoYnVmLCBtYXNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBpbml0IHRoZSBzdGF0ZSBza2lwcGVkIGJ5IHRoZSB1c2VyLgorCSAqLworCW1hc2sgPSBwY250eHRfbWFzayAmIH5tYXNrOworCisJeHJzdG9yX3N0YXRlKGluaXRfeHN0YXRlX2J1ZiwgbWFzayk7CisKKwlyZXR1cm4gMDsKKworZnhfb25seToKKwkvKgorCSAqIGNvdWxkbid0IGZpbmQgdGhlIGV4dGVuZGVkIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZQorCSAqIG1lbW9yeSBsYXlvdXQuIFJlc3RvcmUganVzdCB0aGUgRlAvU1NFIGFuZCBpbml0IGFsbAorCSAqIHRoZSBvdGhlciBleHRlbmRlZCBzdGF0ZS4KKwkgKi8KKwl4cnN0b3Jfc3RhdGUoaW5pdF94c3RhdGVfYnVmLCBwY250eHRfbWFzayAmIH5YU1RBVEVfRlBTU0UpOworCXJldHVybiBmeHJzdG9yX2NoZWNraW5nKChfX2ZvcmNlIHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKilidWYpOworfQorCisvKgorICogVGhpcyByZXN0b3JlcyBkaXJlY3RseSBvdXQgb2YgdXNlciBzcGFjZS4gRXhjZXB0aW9ucyBhcmUgaGFuZGxlZC4KKyAqLworaW50IHJlc3RvcmVfaTM4N194c3RhdGUodm9pZCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWJ1ZikgeworCQlpZiAodXNlZF9tYXRoKCkpCisJCQlnb3RvIGNsZWFyOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1Ziwgc2lnX3hzdGF0ZV9zaXplKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCF1c2VkX21hdGgoKSkgeworCQllcnIgPSBpbml0X2ZwdSh0c2spOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoISh0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpLT5zdGF0dXMgJiBUU19VU0VERlBVKSkgeworCQljbHRzKCk7CisJCXRhc2tfdGhyZWFkX2luZm8oY3VycmVudCktPnN0YXR1cyB8PSBUU19VU0VERlBVOworCX0KKwlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkKKwkJZXJyID0gcmVzdG9yZV91c2VyX3hzdGF0ZShidWYpOworCWVsc2UKKwkJZXJyID0gZnhyc3Rvcl9jaGVja2luZygoX19mb3JjZSBzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICopCisJCQkJICAgICAgIGJ1Zik7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJLyoKKwkJICogRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbGUgZG9pbmcgdGhlIHJlc3RvcmUgZnJvbSB0aGUKKwkJICogdXNlciBidWZmZXIsIGNsZWFyIHRoZSBmcHUgc3RhdGUuCisJCSAqLworY2xlYXI6CisJCWNsZWFyX2ZwdSh0c2spOworCQljbGVhcl91c2VkX21hdGgoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKgorICogUHJlcGFyZSB0aGUgU1cgcmVzZXJ2ZWQgcG9ydGlvbiBvZiB0aGUgZnhzYXZlIG1lbW9yeSBsYXlvdXQsIGluZGljYXRpbmcKKyAqIHRoZSBwcmVzZW5jZSBvZiB0aGUgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIG1lbW9yeSBsYXlvdXQKKyAqIHBvaW50ZWQgYnkgdGhlIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dC4KKyAqIFRoaXMgd2lsbCBiZSBzYXZlZCB3aGVuIGV2ZXIgdGhlIEZQIGFuZCBleHRlbmRlZCBzdGF0ZSBjb250ZXh0IGlzCisgKiBzYXZlZCBvbiB0aGUgdXNlciBzdGFjayBkdXJpbmcgdGhlIHNpZ25hbCBoYW5kbGVyIGRlbGl2ZXJ5IHRvIHRoZSB1c2VyLgorICovCit2b2lkIHByZXBhcmVfZnhfc3dfZnJhbWUodm9pZCkKK3sKKwlpbnQgc2l6ZV9leHRlbmRlZCA9ICh4c3RhdGVfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSkgKworCQkJICAgICBGUF9YU1RBVEVfTUFHSUMyX1NJWkU7CisKKwlzaWdfeHN0YXRlX3NpemUgPSBzaXplb2Yoc3RydWN0IF9mcHN0YXRlKSArIHNpemVfZXh0ZW5kZWQ7CisKKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKwlzaWdfeHN0YXRlX2lhMzJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgX2Zwc3RhdGVfaWEzMikgKyBzaXplX2V4dGVuZGVkOworI2VuZGlmCisKKwltZW1zZXQoJmZ4X3N3X3Jlc2VydmVkLCAwLCBzaXplb2YoZnhfc3dfcmVzZXJ2ZWQpKTsKKworCWZ4X3N3X3Jlc2VydmVkLm1hZ2ljMSA9IEZQX1hTVEFURV9NQUdJQzE7CisJZnhfc3dfcmVzZXJ2ZWQuZXh0ZW5kZWRfc2l6ZSA9IHNpZ194c3RhdGVfc2l6ZTsKKwlmeF9zd19yZXNlcnZlZC54c3RhdGVfYnYgPSBwY250eHRfbWFzazsKKwlmeF9zd19yZXNlcnZlZC54c3RhdGVfc2l6ZSA9IHhzdGF0ZV9zaXplOworI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgorCW1lbWNweSgmZnhfc3dfcmVzZXJ2ZWRfaWEzMiwgJmZ4X3N3X3Jlc2VydmVkLAorCSAgICAgICBzaXplb2Yoc3RydWN0IF9mcHhfc3dfYnl0ZXMpKTsKKwlmeF9zd19yZXNlcnZlZF9pYTMyLmV4dGVuZGVkX3NpemUgPSBzaWdfeHN0YXRlX2lhMzJfc2l6ZTsKKyNlbmRpZgorfQorCisvKgorICogUmVwcmVzZW50cyBpbml0IHN0YXRlIGZvciB0aGUgc3VwcG9ydGVkIGV4dGVuZGVkIHN0YXRlLgorICovCitzdHJ1Y3QgeHNhdmVfc3RydWN0ICppbml0X3hzdGF0ZV9idWY7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0Cit1bnNpZ25lZCBpbnQgc2lnX3hzdGF0ZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBfZnBzdGF0ZSk7CisjZW5kaWYKKworLyoKKyAqIEVuYWJsZSB0aGUgZXh0ZW5kZWQgcHJvY2Vzc29yIHN0YXRlIHNhdmUvcmVzdG9yZSBmZWF0dXJlCisgKi8KK3ZvaWQgX19jcHVpbml0IHhzYXZlX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9oYXNfeHNhdmUpCisJCXJldHVybjsKKworCXNldF9pbl9jcjQoWDg2X0NSNF9PU1hTQVZFKTsKKworCS8qCisJICogRW5hYmxlIGFsbCB0aGUgZmVhdHVyZXMgdGhhdCB0aGUgSFcgaXMgY2FwYWJsZSBvZgorCSAqIGFuZCB0aGUgTGludXgga2VybmVsIGlzIGF3YXJlIG9mLgorCSAqLworCXhzZXRidihYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLLCBwY250eHRfbWFzayk7Cit9CisKKy8qCisgKiBzZXR1cCB0aGUgeHN0YXRlIGltYWdlIHJlcHJlc2VudGluZyB0aGUgaW5pdCBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfeHN0YXRlX2luaXQodm9pZCkKK3sKKwlpbml0X3hzdGF0ZV9idWYgPSBhbGxvY19ib290bWVtKHhzdGF0ZV9zaXplKTsKKwlpbml0X3hzdGF0ZV9idWYtPmkzODcubXhjc3IgPSBNWENTUl9ERUZBVUxUOworfQorCisvKgorICogRW5hYmxlIGFuZCBpbml0aWFsaXplIHRoZSB4c2F2ZSBmZWF0dXJlLgorICovCit2b2lkIF9faW5pdCB4c2F2ZV9jbnR4dF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCWNwdWlkX2NvdW50KDB4ZCwgMCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJcGNudHh0X21hc2sgPSBlYXggKyAoKHU2NCllZHggPDwgMzIpOworCisJaWYgKChwY250eHRfbWFzayAmIFhTVEFURV9GUFNTRSkgIT0gWFNUQVRFX0ZQU1NFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRlAvU1NFIG5vdCBzaG93biB1bmRlciB4c2F2ZSBmZWF0dXJlcyAweCVsbHhcbiIsCisJCSAgICAgICBwY250eHRfbWFzayk7CisJCUJVRygpOworCX0KKworCS8qCisJICogZm9yIG5vdyBPUyBrbm93cyBvbmx5IGFib3V0IEZQL1NTRQorCSAqLworCXBjbnR4dF9tYXNrID0gcGNudHh0X21hc2sgJiBYQ05UWFRfTUFTSzsKKwl4c2F2ZV9pbml0KCk7CisKKwkvKgorCSAqIFJlY29tcHV0ZSB0aGUgY29udGV4dCBzaXplIGZvciBlbmFibGVkIGZlYXR1cmVzCisJICovCisJY3B1aWRfY291bnQoMHhkLCAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwl4c3RhdGVfc2l6ZSA9IGVieDsKKworCXByZXBhcmVfZnhfc3dfZnJhbWUoKTsKKworCXNldHVwX3hzdGF0ZV9pbml0KCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJ4c2F2ZS94cnN0b3I6IGVuYWJsZWQgeHN0YXRlX2J2IDB4JWxseCwgIgorCSAgICAgICAiY250eHQgc2l6ZSAweCV4XG4iLAorCSAgICAgICBwY250eHRfbWFzaywgeHN0YXRlX3NpemUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL01ha2VmaWxlIGIvYXJjaC94ODYva3ZtL01ha2VmaWxlCmluZGV4IGQwZTk0MGIuLmMwMjM0MzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKQEAgLTMsMTAgKzMsMTMgQEAKICMKIAogY29tbW9uLW9ianMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi92aXJ0L2t2bS8sIGt2bV9tYWluLm8gaW9hcGljLm8gXAotICAgICAgICAgICAgICAgIGNvYWxlc2NlZF9tbWlvLm8pCisgICAgICAgICAgICAgICAgY29hbGVzY2VkX21taW8ubyBpcnFfY29tbS5vKQogaWZlcSAoJChDT05GSUdfS1ZNX1RSQUNFKSx5KQogY29tbW9uLW9ianMgKz0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCBrdm1fdHJhY2UubykKIGVuZGlmCitpZmVxICgkKENPTkZJR19ETUFSKSx5KQorY29tbW9uLW9ianMgKz0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCB2dGQubykKK2VuZGlmCiAKIEVYVFJBX0NGTEFHUyArPSAtSXZpcnQva3ZtIC1JYXJjaC94ODYva3ZtCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pODI1NC5jIGIvYXJjaC94ODYva3ZtL2k4MjU0LmMKaW5kZXggMWJmOGY1Ny4uMTFjNjcyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2k4MjU0LmMKKysrIGIvYXJjaC94ODYva3ZtL2k4MjU0LmMKQEAgLTIwMCwxMyArMjAwLDE0IEBACiAKIAlpZiAoIWF0b21pY19pbmNfYW5kX3Rlc3QoJnB0LT5wZW5kaW5nKSkKIAkJc2V0X2JpdChLVk1fUkVRX1BFTkRJTkdfVElNRVIsICZ2Y3B1MC0+cmVxdWVzdHMpOwotCWlmICh2Y3B1MCAmJiB3YWl0cXVldWVfYWN0aXZlKCZ2Y3B1MC0+d3EpKSB7Ci0JCXZjcHUwLT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOworCisJaWYgKHZjcHUwICYmIHdhaXRxdWV1ZV9hY3RpdmUoJnZjcHUwLT53cSkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNwdTAtPndxKTsKLQl9CiAKIAlocnRpbWVyX2FkZF9leHBpcmVzX25zKCZwdC0+dGltZXIsIHB0LT5wZXJpb2QpOwotCXB0LT5zY2hlZHVsZWQgPSBrdGltZV90b19ucyhocnRpbWVyX2dldF9leHBpcmVzKCZwdC0+dGltZXIpKTsKKwlwdC0+c2NoZWR1bGVkID0gaHJ0aW1lcl9nZXRfZXhwaXJlc19ucygmcHQtPnRpbWVyKTsKKwlpZiAocHQtPnBlcmlvZCkKKwkJcHMtPmNoYW5uZWxzWzBdLmNvdW50X2xvYWRfdGltZSA9IGhydGltZXJfZ2V0X2V4cGlyZXMoJnB0LT50aW1lcik7CiAKIAlyZXR1cm4gKHB0LT5wZXJpb2QgPT0gMCA/IDAgOiAxKTsKIH0KQEAgLTIxNSwxMiArMjE2LDIyIEBACiB7CiAJc3RydWN0IGt2bV9waXQgKnBpdCA9IHZjcHUtPmt2bS0+YXJjaC52cGl0OwogCi0JaWYgKHBpdCAmJiB2Y3B1LT52Y3B1X2lkID09IDAgJiYgcGl0LT5waXRfc3RhdGUuaW5qZWN0X3BlbmRpbmcpCisJaWYgKHBpdCAmJiB2Y3B1LT52Y3B1X2lkID09IDAgJiYgcGl0LT5waXRfc3RhdGUuaXJxX2FjaykKIAkJcmV0dXJuIGF0b21pY19yZWFkKCZwaXQtPnBpdF9zdGF0ZS5waXRfdGltZXIucGVuZGluZyk7Ci0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQga3ZtX3BpdF9hY2tfaXJxKHN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciAqa2lhbikKK3sKKwlzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgKnBzID0gY29udGFpbmVyX29mKGtpYW4sIHN0cnVjdCBrdm1fa3BpdF9zdGF0ZSwKKwkJCQkJCSBpcnFfYWNrX25vdGlmaWVyKTsKKwlzcGluX2xvY2soJnBzLT5pbmplY3RfbG9jayk7CisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZwcy0+cGl0X3RpbWVyLnBlbmRpbmcpIDwgMCkKKwkJYXRvbWljX2luYygmcHMtPnBpdF90aW1lci5wZW5kaW5nKTsKKwlwcy0+aXJxX2FjayA9IDE7CisJc3Bpbl91bmxvY2soJnBzLT5pbmplY3RfbG9jayk7Cit9CisKIHN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBwaXRfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpCiB7CiAJc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwczsKQEAgLTI1NSw4ICsyNjYsOSBAQAogCWhydGltZXJfY2FuY2VsKCZwdC0+dGltZXIpOwogfQogCi1zdGF0aWMgdm9pZCBjcmVhdGVfcGl0X3RpbWVyKHN0cnVjdCBrdm1fa3BpdF90aW1lciAqcHQsIHUzMiB2YWwsIGludCBpc19wZXJpb2QpCitzdGF0aWMgdm9pZCBjcmVhdGVfcGl0X3RpbWVyKHN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHMsIHUzMiB2YWwsIGludCBpc19wZXJpb2QpCiB7CisJc3RydWN0IGt2bV9rcGl0X3RpbWVyICpwdCA9ICZwcy0+cGl0X3RpbWVyOwogCXM2NCBpbnRlcnZhbDsKIAogCWludGVydmFsID0gbXVsZGl2NjQodmFsLCBOU0VDX1BFUl9TRUMsIEtWTV9QSVRfRlJFUSk7CkBAIC0yNjgsNiArMjgwLDcgQEAKIAlwdC0+cGVyaW9kID0gKGlzX3BlcmlvZCA9PSAwKSA/IDAgOiBpbnRlcnZhbDsKIAlwdC0+dGltZXIuZnVuY3Rpb24gPSBwaXRfdGltZXJfZm47CiAJYXRvbWljX3NldCgmcHQtPnBlbmRpbmcsIDApOworCXBzLT5pcnFfYWNrID0gMTsKIAogCWhydGltZXJfc3RhcnQoJnB0LT50aW1lciwga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCBpbnRlcnZhbCksCiAJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwpAQCAtMzAyLDExICszMTUsMTEgQEAKIAljYXNlIDE6CiAgICAgICAgIC8qIEZJWE1FOiBlbmhhbmNlIG1vZGUgNCBwcmVjaXNpb24gKi8KIAljYXNlIDQ6Ci0JCWNyZWF0ZV9waXRfdGltZXIoJnBzLT5waXRfdGltZXIsIHZhbCwgMCk7CisJCWNyZWF0ZV9waXRfdGltZXIocHMsIHZhbCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKIAljYXNlIDM6Ci0JCWNyZWF0ZV9waXRfdGltZXIoJnBzLT5waXRfdGltZXIsIHZhbCwgMSk7CisJCWNyZWF0ZV9waXRfdGltZXIocHMsIHZhbCwgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlc3Ryb3lfcGl0X3RpbWVyKCZwcy0+cGl0X3RpbWVyKTsKQEAgLTUyMCw3ICs1MzMsNyBAQAogCW11dGV4X3VubG9jaygmcGl0LT5waXRfc3RhdGUubG9jayk7CiAKIAlhdG9taWNfc2V0KCZwaXQtPnBpdF9zdGF0ZS5waXRfdGltZXIucGVuZGluZywgMCk7Ci0JcGl0LT5waXRfc3RhdGUuaW5qZWN0X3BlbmRpbmcgPSAxOworCXBpdC0+cGl0X3N0YXRlLmlycV9hY2sgPSAxOwogfQogCiBzdHJ1Y3Qga3ZtX3BpdCAqa3ZtX2NyZWF0ZV9waXQoc3RydWN0IGt2bSAqa3ZtKQpAQCAtNTM0LDYgKzU0Nyw3IEBACiAKIAltdXRleF9pbml0KCZwaXQtPnBpdF9zdGF0ZS5sb2NrKTsKIAltdXRleF9sb2NrKCZwaXQtPnBpdF9zdGF0ZS5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGl0LT5waXRfc3RhdGUuaW5qZWN0X2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSBQSU8gZGV2aWNlICovCiAJcGl0LT5kZXYucmVhZCA9IHBpdF9pb3BvcnRfcmVhZDsKQEAgLTU1NSw2ICs1NjksOSBAQAogCXBpdF9zdGF0ZS0+cGl0ID0gcGl0OwogCWhydGltZXJfaW5pdCgmcGl0X3N0YXRlLT5waXRfdGltZXIudGltZXIsCiAJCSAgICAgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwlwaXRfc3RhdGUtPmlycV9hY2tfbm90aWZpZXIuZ3NpID0gMDsKKwlwaXRfc3RhdGUtPmlycV9hY2tfbm90aWZpZXIuaXJxX2Fja2VkID0ga3ZtX3BpdF9hY2tfaXJxOworCWt2bV9yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKGt2bSwgJnBpdF9zdGF0ZS0+aXJxX2Fja19ub3RpZmllcik7CiAJbXV0ZXhfdW5sb2NrKCZwaXQtPnBpdF9zdGF0ZS5sb2NrKTsKIAogCWt2bV9waXRfcmVzZXQocGl0KTsKQEAgLTU3OCwxMCArNTk1LDggQEAKIHN0YXRpYyB2b2lkIF9faW5qZWN0X3BpdF90aW1lcl9pbnRyKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwotCWt2bV9pb2FwaWNfc2V0X2lycShrdm0tPmFyY2gudmlvYXBpYywgMCwgMSk7Ci0Ja3ZtX2lvYXBpY19zZXRfaXJxKGt2bS0+YXJjaC52aW9hcGljLCAwLCAwKTsKLQlrdm1fcGljX3NldF9pcnEocGljX2lycWNoaXAoa3ZtKSwgMCwgMSk7Ci0Ja3ZtX3BpY19zZXRfaXJxKHBpY19pcnFjaGlwKGt2bSksIDAsIDApOworCWt2bV9zZXRfaXJxKGt2bSwgMCwgMSk7CisJa3ZtX3NldF9pcnEoa3ZtLCAwLCAwKTsKIAltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiB9CiAKQEAgLTU5MiwzNyArNjA3LDE5IEBACiAJc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwczsKIAogCWlmICh2Y3B1ICYmIHBpdCkgeworCQlpbnQgaW5qZWN0ID0gMDsKIAkJcHMgPSAmcGl0LT5waXRfc3RhdGU7CiAKLQkJLyogVHJ5IHRvIGluamVjdCBwZW5kaW5nIGludGVycnVwdHMgd2hlbjoKLQkJICogMS4gUGVuZGluZyBleGlzdHMKLQkJICogMi4gTGFzdCBpbnRlcnJ1cHQgd2FzIGFjY2VwdGVkIG9yIHdhaXRlZCBmb3IgdG9vIGxvbmcgdGltZSovCi0JCWlmIChhdG9taWNfcmVhZCgmcHMtPnBpdF90aW1lci5wZW5kaW5nKSAmJgotCQkgICAgKHBzLT5pbmplY3RfcGVuZGluZyB8fAotCQkgICAgKGppZmZpZXMgLSBwcy0+bGFzdF9pbmplY3RlZF90aW1lCi0JCQkJPj0gS1ZNX01BWF9QSVRfSU5UUl9JTlRFUlZBTCkpKSB7Ci0JCQlwcy0+aW5qZWN0X3BlbmRpbmcgPSAwOworCQkvKiBUcnkgdG8gaW5qZWN0IHBlbmRpbmcgaW50ZXJydXB0cyB3aGVuCisJCSAqIGxhc3Qgb25lIGhhcyBiZWVuIGFja2VkLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZwcy0+aW5qZWN0X2xvY2spOworCQlpZiAoYXRvbWljX3JlYWQoJnBzLT5waXRfdGltZXIucGVuZGluZykgJiYgcHMtPmlycV9hY2spIHsKKwkJCXBzLT5pcnFfYWNrID0gMDsKKwkJCWluamVjdCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2soJnBzLT5pbmplY3RfbG9jayk7CisJCWlmIChpbmplY3QpCiAJCQlfX2luamVjdF9waXRfdGltZXJfaW50cihrdm0pOwotCQkJcHMtPmxhc3RfaW5qZWN0ZWRfdGltZSA9IGppZmZpZXM7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQga3ZtX3BpdF90aW1lcl9pbnRyX3Bvc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgdmVjKQotewotCXN0cnVjdCBrdm1fYXJjaCAqYXJjaCA9ICZ2Y3B1LT5rdm0tPmFyY2g7Ci0Jc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwczsKLQotCWlmICh2Y3B1ICYmIGFyY2gtPnZwaXQpIHsKLQkJcHMgPSAmYXJjaC0+dnBpdC0+cGl0X3N0YXRlOwotCQlpZiAoYXRvbWljX3JlYWQoJnBzLT5waXRfdGltZXIucGVuZGluZykgJiYKLQkJKCgoYXJjaC0+dnBpYy0+cGljc1swXS5pbXIgJiAxKSA9PSAwICYmCi0JCSAgYXJjaC0+dnBpYy0+cGljc1swXS5pcnFfYmFzZSA9PSB2ZWMpIHx8Ci0JCSAgKGFyY2gtPnZpb2FwaWMtPnJlZGlydGJsWzBdLmZpZWxkcy52ZWN0b3IgPT0gdmVjICYmCi0JCSAgYXJjaC0+dmlvYXBpYy0+cmVkaXJ0YmxbMF0uZmllbGRzLm1hc2sgIT0gMSkpKSB7Ci0JCQlwcy0+aW5qZWN0X3BlbmRpbmcgPSAxOwotCQkJYXRvbWljX2RlYygmcHMtPnBpdF90aW1lci5wZW5kaW5nKTsKLQkJCXBzLT5jaGFubmVsc1swXS5jb3VudF9sb2FkX3RpbWUgPSBrdGltZV9nZXQoKTsKLQkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pODI1NC5oIGIvYXJjaC94ODYva3ZtL2k4MjU0LmgKaW5kZXggZGIyNWMyYS4uZTQzNmQ0OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2k4MjU0LmgKKysrIGIvYXJjaC94ODYva3ZtL2k4MjU0LmgKQEAgLTgsNyArOCw2IEBACiAJaW50IGlycTsKIAlzNjQgcGVyaW9kOyAvKiB1bml0OiBucyAqLwogCXM2NCBzY2hlZHVsZWQ7Ci0Ja3RpbWVfdCBsYXN0X3VwZGF0ZTsKIAlhdG9taWNfdCBwZW5kaW5nOwogfTsKIApAQCAtMzQsOCArMzMsOSBAQAogCXUzMiAgICBzcGVha2VyX2RhdGFfb247CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJc3RydWN0IGt2bV9waXQgKnBpdDsKLQlib29sIGluamVjdF9wZW5kaW5nOyAvKiBpZiBpbmplY3QgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X2luamVjdGVkX3RpbWU7CisJc3BpbmxvY2tfdCBpbmplY3RfbG9jazsKKwl1bnNpZ25lZCBsb25nIGlycV9hY2s7CisJc3RydWN0IGt2bV9pcnFfYWNrX25vdGlmaWVyIGlycV9hY2tfbm90aWZpZXI7CiB9OwogCiBzdHJ1Y3Qga3ZtX3BpdCB7CkBAIC01NCw3ICs1NCw2IEBACiAjZGVmaW5lIEtWTV9QSVRfQ0hBTk5FTF9NQVNLCSAgICAweDMKIAogdm9pZCBrdm1faW5qZWN0X3BpdF90aW1lcl9pcnFzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci12b2lkIGt2bV9waXRfdGltZXJfaW50cl9wb3N0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHZlYyk7CiB2b2lkIGt2bV9waXRfbG9hZF9jb3VudChzdHJ1Y3Qga3ZtICprdm0sIGludCBjaGFubmVsLCB1MzIgdmFsKTsKIHN0cnVjdCBrdm1fcGl0ICprdm1fY3JlYXRlX3BpdChzdHJ1Y3Qga3ZtICprdm0pOwogdm9pZCBrdm1fZnJlZV9waXQoc3RydWN0IGt2bSAqa3ZtKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pODI1OS5jIGIvYXJjaC94ODYva3ZtL2k4MjU5LmMKaW5kZXggYzMxMTY0ZS4uMTdlNDFlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2k4MjU5LmMKKysrIGIvYXJjaC94ODYva3ZtL2k4MjU5LmMKQEAgLTMwLDYgKzMwLDE5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCitzdGF0aWMgdm9pZCBwaWNfY2xlYXJfaXNyKHN0cnVjdCBrdm1fa3BpY19zdGF0ZSAqcywgaW50IGlycSkKK3sKKwlzLT5pc3IgJj0gfigxIDw8IGlycSk7CisJcy0+aXNyX2FjayB8PSAoMSA8PCBpcnEpOworfQorCit2b2lkIGt2bV9waWNfY2xlYXJfaXNyX2FjayhzdHJ1Y3Qga3ZtICprdm0pCit7CisJc3RydWN0IGt2bV9waWMgKnMgPSBwaWNfaXJxY2hpcChrdm0pOworCXMtPnBpY3NbMF0uaXNyX2FjayA9IDB4ZmY7CisJcy0+cGljc1sxXS5pc3JfYWNrID0gMHhmZjsKK30KKwogLyoKICAqIHNldCBpcnEgbGV2ZWwuIElmIGFuIGVkZ2UgaXMgZGV0ZWN0ZWQsIHRoZW4gdGhlIElSUiBpcyBzZXQgdG8gMQogICovCkBAIC0xNDEsMTEgKzE1NCwxMiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcGljX2ludGFjayhzdHJ1Y3Qga3ZtX2twaWNfc3RhdGUgKnMsIGludCBpcnEpCiB7CisJcy0+aXNyIHw9IDEgPDwgaXJxOwogCWlmIChzLT5hdXRvX2VvaSkgewogCQlpZiAocy0+cm90YXRlX29uX2F1dG9fZW9pKQogCQkJcy0+cHJpb3JpdHlfYWRkID0gKGlycSArIDEpICYgNzsKLQl9IGVsc2UKLQkJcy0+aXNyIHw9ICgxIDw8IGlycSk7CisJCXBpY19jbGVhcl9pc3IocywgaXJxKTsKKwl9CiAJLyoKIAkgKiBXZSBkb24ndCBjbGVhciBhIGxldmVsIHNlbnNpdGl2ZSBpbnRlcnJ1cHQgaGVyZQogCSAqLwpAQCAtMTUzLDkgKzE2NywxMCBAQAogCQlzLT5pcnIgJj0gfigxIDw8IGlycSk7CiB9CiAKLWludCBrdm1fcGljX3JlYWRfaXJxKHN0cnVjdCBrdm1fcGljICpzKQoraW50IGt2bV9waWNfcmVhZF9pcnEoc3RydWN0IGt2bSAqa3ZtKQogewogCWludCBpcnEsIGlycTIsIGludG5vOworCXN0cnVjdCBrdm1fcGljICpzID0gcGljX2lycWNoaXAoa3ZtKTsKIAogCWlycSA9IHBpY19nZXRfaXJxKCZzLT5waWNzWzBdKTsKIAlpZiAoaXJxID49IDApIHsKQEAgLTE4MSwxNiArMTk2LDMyIEBACiAJCWludG5vID0gcy0+cGljc1swXS5pcnFfYmFzZSArIGlycTsKIAl9CiAJcGljX3VwZGF0ZV9pcnEocyk7CisJa3ZtX25vdGlmeV9hY2tlZF9pcnEoa3ZtLCBpcnEpOwogCiAJcmV0dXJuIGludG5vOwogfQogCiB2b2lkIGt2bV9waWNfcmVzZXQoc3RydWN0IGt2bV9rcGljX3N0YXRlICpzKQogeworCWludCBpcnEsIGlycWJhc2U7CisJc3RydWN0IGt2bSAqa3ZtID0gcy0+cGljc19zdGF0ZS0+aXJxX3JlcXVlc3Rfb3BhcXVlOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTAgPSBrdm0tPnZjcHVzWzBdOworCisJaWYgKHMgPT0gJnMtPnBpY3Nfc3RhdGUtPnBpY3NbMF0pCisJCWlycWJhc2UgPSAwOworCWVsc2UKKwkJaXJxYmFzZSA9IDg7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IFBJQ19OVU1fUElOUy8yOyBpcnErKykgeworCQlpZiAodmNwdTAgJiYga3ZtX2FwaWNfYWNjZXB0X3BpY19pbnRyKHZjcHUwKSkKKwkJCWlmIChzLT5pcnIgJiAoMSA8PCBpcnEpIHx8IHMtPmlzciAmICgxIDw8IGlycSkpCisJCQkJa3ZtX25vdGlmeV9hY2tlZF9pcnEoa3ZtLCBpcnEraXJxYmFzZSk7CisJfQogCXMtPmxhc3RfaXJyID0gMDsKIAlzLT5pcnIgPSAwOwogCXMtPmltciA9IDA7CiAJcy0+aXNyID0gMDsKKwlzLT5pc3JfYWNrID0gMHhmZjsKIAlzLT5wcmlvcml0eV9hZGQgPSAwOwogCXMtPmlycV9iYXNlID0gMDsKIAlzLT5yZWFkX3JlZ19zZWxlY3QgPSAwOwpAQCAtMjQzLDcgKzI3NCw3IEBACiAJCQkJcHJpb3JpdHkgPSBnZXRfcHJpb3JpdHkocywgcy0+aXNyKTsKIAkJCQlpZiAocHJpb3JpdHkgIT0gOCkgewogCQkJCQlpcnEgPSAocHJpb3JpdHkgKyBzLT5wcmlvcml0eV9hZGQpICYgNzsKLQkJCQkJcy0+aXNyICY9IH4oMSA8PCBpcnEpOworCQkJCQlwaWNfY2xlYXJfaXNyKHMsIGlycSk7CiAJCQkJCWlmIChjbWQgPT0gNSkKIAkJCQkJCXMtPnByaW9yaXR5X2FkZCA9IChpcnEgKyAxKSAmIDc7CiAJCQkJCXBpY191cGRhdGVfaXJxKHMtPnBpY3Nfc3RhdGUpOwpAQCAtMjUxLDcgKzI4Miw3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6CiAJCQkJaXJxID0gdmFsICYgNzsKLQkJCQlzLT5pc3IgJj0gfigxIDw8IGlycSk7CisJCQkJcGljX2NsZWFyX2lzcihzLCBpcnEpOwogCQkJCXBpY191cGRhdGVfaXJxKHMtPnBpY3Nfc3RhdGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSA2OgpAQCAtMjYwLDggKzI5MSw4IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIDc6CiAJCQkJaXJxID0gdmFsICYgNzsKLQkJCQlzLT5pc3IgJj0gfigxIDw8IGlycSk7CiAJCQkJcy0+cHJpb3JpdHlfYWRkID0gKGlycSArIDEpICYgNzsKKwkJCQlwaWNfY2xlYXJfaXNyKHMsIGlycSk7CiAJCQkJcGljX3VwZGF0ZV9pcnEocy0+cGljc19zdGF0ZSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgpAQCAtMzAzLDcgKzMzNCw3IEBACiAJCQlzLT5waWNzX3N0YXRlLT5waWNzWzBdLmlyciAmPSB+KDEgPDwgMik7CiAJCX0KIAkJcy0+aXJyICY9IH4oMSA8PCByZXQpOwotCQlzLT5pc3IgJj0gfigxIDw8IHJldCk7CisJCXBpY19jbGVhcl9pc3IocywgcmV0KTsKIAkJaWYgKGFkZHIxID4+IDcgfHwgcmV0ICE9IDIpCiAJCQlwaWNfdXBkYXRlX2lycShzLT5waWNzX3N0YXRlKTsKIAl9IGVsc2UgewpAQCAtNDIyLDEwICs0NTMsMTQgQEAKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBvcGFxdWU7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0ga3ZtLT52Y3B1c1swXTsKKwlzdHJ1Y3Qga3ZtX3BpYyAqcyA9IHBpY19pcnFjaGlwKGt2bSk7CisJaW50IGlycSA9IHBpY19nZXRfaXJxKCZzLT5waWNzWzBdKTsKIAotCXBpY19pcnFjaGlwKGt2bSktPm91dHB1dCA9IGxldmVsOwotCWlmICh2Y3B1KQorCXMtPm91dHB1dCA9IGxldmVsOworCWlmICh2Y3B1ICYmIGxldmVsICYmIChzLT5waWNzWzBdLmlzcl9hY2sgJiAoMSA8PCBpcnEpKSkgeworCQlzLT5waWNzWzBdLmlzcl9hY2sgJj0gfigxIDw8IGlycSk7CiAJCWt2bV92Y3B1X2tpY2sodmNwdSk7CisJfQogfQogCiBzdHJ1Y3Qga3ZtX3BpYyAqa3ZtX2NyZWF0ZV9waWMoc3RydWN0IGt2bSAqa3ZtKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2lycS5jIGIvYXJjaC94ODYva3ZtL2lycS5jCmluZGV4IDc2ZDczNmIuLmMwMTliOGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pcnEuYworKysgYi9hcmNoL3g4Ni9rdm0vaXJxLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJaWYgKGt2bV9hcGljX2FjY2VwdF9waWNfaW50cih2KSkgewogCQkJcyA9IHBpY19pcnFjaGlwKHYtPmt2bSk7CiAJCQlzLT5vdXRwdXQgPSAwOwkJLyogUElDICovCi0JCQl2ZWN0b3IgPSBrdm1fcGljX3JlYWRfaXJxKHMpOworCQkJdmVjdG9yID0ga3ZtX3BpY19yZWFkX2lycSh2LT5rdm0pOwogCQl9CiAJfQogCXJldHVybiB2ZWN0b3I7CkBAIC05MCw3ICs5MCw2IEBACiB2b2lkIGt2bV90aW1lcl9pbnRyX3Bvc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgdmVjKQogewogCWt2bV9hcGljX3RpbWVyX2ludHJfcG9zdCh2Y3B1LCB2ZWMpOwotCWt2bV9waXRfdGltZXJfaW50cl9wb3N0KHZjcHUsIHZlYyk7CiAJLyogVE9ETzogUElULCBSVEMgZXRjLiAqLwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3RpbWVyX2ludHJfcG9zdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaXJxLmggYi9hcmNoL3g4Ni9rdm0vaXJxLmgKaW5kZXggN2NhNDdjYi4uZjE3YzhmNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lycS5oCisrKyBiL2FyY2gveDg2L2t2bS9pcnEuaApAQCAtNDIsNiArNDIsNyBAQAogCXU4IGlycjsJCS8qIGludGVycnVwdCByZXF1ZXN0IHJlZ2lzdGVyICovCiAJdTggaW1yOwkJLyogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KIAl1OCBpc3I7CQkvKiBpbnRlcnJ1cHQgc2VydmljZSByZWdpc3RlciAqLworCXU4IGlzcl9hY2s7CS8qIGludGVycnVwdCBhY2sgZGV0ZWN0aW9uICovCiAJdTggcHJpb3JpdHlfYWRkOwkvKiBoaWdoZXN0IGlycSBwcmlvcml0eSAqLwogCXU4IGlycV9iYXNlOwogCXU4IHJlYWRfcmVnX3NlbGVjdDsKQEAgLTYzLDEyICs2NCwxMyBAQAogCXZvaWQgKmlycV9yZXF1ZXN0X29wYXF1ZTsKIAlpbnQgb3V0cHV0OwkJLyogaW50ciBmcm9tIG1hc3RlciBQSUMgKi8KIAlzdHJ1Y3Qga3ZtX2lvX2RldmljZSBkZXY7CisJdm9pZCAoKmFja19ub3RpZmllcikodm9pZCAqb3BhcXVlLCBpbnQgaXJxKTsKIH07CiAKIHN0cnVjdCBrdm1fcGljICprdm1fY3JlYXRlX3BpYyhzdHJ1Y3Qga3ZtICprdm0pOwotdm9pZCBrdm1fcGljX3NldF9pcnEodm9pZCAqb3BhcXVlLCBpbnQgaXJxLCBpbnQgbGV2ZWwpOwotaW50IGt2bV9waWNfcmVhZF9pcnEoc3RydWN0IGt2bV9waWMgKnMpOworaW50IGt2bV9waWNfcmVhZF9pcnEoc3RydWN0IGt2bSAqa3ZtKTsKIHZvaWQga3ZtX3BpY191cGRhdGVfaXJxKHN0cnVjdCBrdm1fcGljICpzKTsKK3ZvaWQga3ZtX3BpY19jbGVhcl9pc3JfYWNrKHN0cnVjdCBrdm0gKmt2bSk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGt2bV9waWMgKnBpY19pcnFjaGlwKHN0cnVjdCBrdm0gKmt2bSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oIGIvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmODE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgQVNNX0tWTV9DQUNIRV9SRUdTX0gKKyNkZWZpbmUgQVNNX0tWTV9DQUNIRV9SRUdTX0gKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2bV9yZWdpc3Rlcl9yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJICAgICAgZW51bSBrdm1fcmVnIHJlZykKK3sKKwlpZiAoIXRlc3RfYml0KHJlZywgKHVuc2lnbmVkIGxvbmcgKikmdmNwdS0+YXJjaC5yZWdzX2F2YWlsKSkKKwkJa3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZyh2Y3B1LCByZWcpOworCisJcmV0dXJuIHZjcHUtPmFyY2gucmVnc1tyZWddOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICBlbnVtIGt2bV9yZWcgcmVnLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXZjcHUtPmFyY2gucmVnc1tyZWddID0gdmFsOworCV9fc2V0X2JpdChyZWcsICh1bnNpZ25lZCBsb25nICopJnZjcHUtPmFyY2gucmVnc19kaXJ0eSk7CisJX19zZXRfYml0KHJlZywgKHVuc2lnbmVkIGxvbmcgKikmdmNwdS0+YXJjaC5yZWdzX2F2YWlsKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2bV9yaXBfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SSVApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3JpcF93cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUklQLCB2YWwpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9sYXBpYy5jIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKaW5kZXggYTViNjFkZS4uMGZjM2NhYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2xhcGljLmMKKysrIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgImt2bV9jYWNoZV9yZWdzLmgiCiAjaW5jbHVkZSAiaXJxLmgiCiAKICNkZWZpbmUgUFJJZDY0ICJkIgpAQCAtMzM4LDEzICszMzksNyBAQAogCQl9IGVsc2UKIAkJCWFwaWNfY2xlYXJfdmVjdG9yKHZlY3RvciwgYXBpYy0+cmVncyArIEFQSUNfVE1SKTsKIAotCQlpZiAodmNwdS0+YXJjaC5tcF9zdGF0ZSA9PSBLVk1fTVBfU1RBVEVfUlVOTkFCTEUpCi0JCQlrdm1fdmNwdV9raWNrKHZjcHUpOwotCQllbHNlIGlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9IQUxURUQpIHsKLQkJCXZjcHUtPmFyY2gubXBfc3RhdGUgPSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU7Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdS0+d3EpKQotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNwdS0+d3EpOwotCQl9CisJCWt2bV92Y3B1X2tpY2sodmNwdSk7CiAKIAkJcmVzdWx0ID0gKG9yaWdfaXJyID09IDApOwogCQlicmVhazsKQEAgLTM3MCwyMSArMzY1LDE4IEBACiAJCQl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX0lOSVRfUkVDRUlWRUQ7CiAJCQlrdm1fdmNwdV9raWNrKHZjcHUpOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCSAgICAgICAiSWdub3JpbmcgZGUtYXNzZXJ0IElOSVQgdG8gdmNwdSAlZFxuIiwKLQkJCSAgICAgICB2Y3B1LT52Y3B1X2lkKTsKKwkJCWFwaWNfZGVidWcoIklnbm9yaW5nIGRlLWFzc2VydCBJTklUIHRvIHZjcHUgJWRcbiIsCisJCQkJICAgdmNwdS0+dmNwdV9pZCk7CiAJCX0KLQogCQlicmVhazsKIAogCWNhc2UgQVBJQ19ETV9TVEFSVFVQOgotCQlwcmludGsoS0VSTl9ERUJVRyAiU0lQSSB0byB2Y3B1ICVkIHZlY3RvciAweCUwMnhcbiIsCi0JCSAgICAgICB2Y3B1LT52Y3B1X2lkLCB2ZWN0b3IpOworCQlhcGljX2RlYnVnKCJTSVBJIHRvIHZjcHUgJWQgdmVjdG9yIDB4JTAyeFxuIiwKKwkJCSAgIHZjcHUtPnZjcHVfaWQsIHZlY3Rvcik7CiAJCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9JTklUX1JFQ0VJVkVEKSB7CiAJCQl2Y3B1LT5hcmNoLnNpcGlfdmVjdG9yID0gdmVjdG9yOwogCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9IEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVEOwotCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnZjcHUtPndxKSkKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZjcHUtPndxKTsKKwkJCWt2bV92Y3B1X2tpY2sodmNwdSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTQzOCw3ICs0MzAsNyBAQAogc3RhdGljIHZvaWQgYXBpY19zZXRfZW9pKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMpCiB7CiAJaW50IHZlY3RvciA9IGFwaWNfZmluZF9oaWdoZXN0X2lzcihhcGljKTsKLQorCWludCB0cmlnZ2VyX21vZGU7CiAJLyoKIAkgKiBOb3QgZXZlcnkgd3JpdGUgRU9JIHdpbGwgaGFzIGNvcnJlc3BvbmRpbmcgSVNSLAogCSAqIG9uZSBleGFtcGxlIGlzIHdoZW4gS2VybmVsIGNoZWNrIHRpbWVyIG9uIHNldHVwX0lPX0FQSUMKQEAgLTQ1MCw3ICs0NDIsMTAgQEAKIAlhcGljX3VwZGF0ZV9wcHIoYXBpYyk7CiAKIAlpZiAoYXBpY190ZXN0X2FuZF9jbGVhcl92ZWN0b3IodmVjdG9yLCBhcGljLT5yZWdzICsgQVBJQ19UTVIpKQotCQlrdm1faW9hcGljX3VwZGF0ZV9lb2koYXBpYy0+dmNwdS0+a3ZtLCB2ZWN0b3IpOworCQl0cmlnZ2VyX21vZGUgPSBJT0FQSUNfTEVWRUxfVFJJRzsKKwllbHNlCisJCXRyaWdnZXJfbW9kZSA9IElPQVBJQ19FREdFX1RSSUc7CisJa3ZtX2lvYXBpY191cGRhdGVfZW9pKGFwaWMtPnZjcHUtPmt2bSwgdmVjdG9yLCB0cmlnZ2VyX21vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBhcGljX3NlbmRfaXBpKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMpCkBAIC01NTgsOCArNTUzLDcgQEAKIAlzdHJ1Y3Qga3ZtX3J1biAqcnVuID0gdmNwdS0+cnVuOwogCiAJc2V0X2JpdChLVk1fUkVRX1JFUE9SVF9UUFJfQUNDRVNTLCAmdmNwdS0+cmVxdWVzdHMpOwotCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwotCXJ1bi0+dHByX2FjY2Vzcy5yaXAgPSB2Y3B1LT5hcmNoLnJpcDsKKwlydW4tPnRwcl9hY2Nlc3MucmlwID0ga3ZtX3JpcF9yZWFkKHZjcHUpOwogCXJ1bi0+dHByX2FjY2Vzcy5pc193cml0ZSA9IHdyaXRlOwogfQogCkBAIC02ODMsOSArNjc3LDkgQEAKIAkgKiBSZWZlciBTRE0gOC40LjEKIAkgKi8KIAlpZiAobGVuICE9IDQgfHwgYWxpZ25tZW50KSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgImFwaWMgd3JpdGU6IGJhZCBzaXplPSVkICVseFxuIiwKLQkJCSAgICAgICBsZW4sIChsb25nKWFkZHJlc3MpOworCQkvKiBEb24ndCBzaG91dCBsb3VkLCAkaW5mYW1vdXNfb3Mgd291bGQgY2F1c2Ugb25seSBub2lzZS4gKi8KKwkJYXBpY19kZWJ1ZygiYXBpYyB3cml0ZTogYmFkIHNpemU9JWQgJWx4XG4iLAorCQkJICAgbGVuLCAobG9uZylhZGRyZXNzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTQ3LDEwICs5NDEsOSBAQAogCiAJaWYoIWF0b21pY19pbmNfYW5kX3Rlc3QoJmFwaWMtPnRpbWVyLnBlbmRpbmcpKQogCQlzZXRfYml0KEtWTV9SRVFfUEVORElOR19USU1FUiwgJmFwaWMtPnZjcHUtPnJlcXVlc3RzKTsKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZShxKSkgewotCQlhcGljLT52Y3B1LT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOworCWlmICh3YWl0cXVldWVfYWN0aXZlKHEpKQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUocSk7Ci0JfQorCiAJaWYgKGFwaWNfbHZ0dF9wZXJpb2QoYXBpYykpIHsKIAkJcmVzdWx0ID0gMTsKIAkJaHJ0aW1lcl9hZGRfZXhwaXJlc19ucygmYXBpYy0+dGltZXIuZGV2LCBhcGljLT50aW1lci5wZXJpb2QpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IDBiZmUyYmQuLjk5YzIzOWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTcwLDYgKzcwLDkgQEAKIG1vZHVsZV9wYXJhbShkYmcsIGJvb2wsIDA2NDQpOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgb29zX3NoYWRvdyA9IDE7Cittb2R1bGVfcGFyYW0ob29zX3NoYWRvdywgYm9vbCwgMDY0NCk7CisKICNpZm5kZWYgTU1VX0RFQlVHCiAjZGVmaW5lIEFTU0VSVCh4KSBkbyB7IH0gd2hpbGUgKDApCiAjZWxzZQpAQCAtMTM1LDE4ICsxMzgsMjQgQEAKICNkZWZpbmUgQUNDX1VTRVJfTUFTSyAgICBQVF9VU0VSX01BU0sKICNkZWZpbmUgQUNDX0FMTCAgICAgICAgICAoQUNDX0VYRUNfTUFTSyB8IEFDQ19XUklURV9NQVNLIHwgQUNDX1VTRVJfTUFTSykKIAotc3RydWN0IGt2bV9wdl9tbXVfb3BfYnVmZmVyIHsKLQl2b2lkICpwdHI7Ci0JdW5zaWduZWQgbGVuOwotCXVuc2lnbmVkIHByb2Nlc3NlZDsKLQljaGFyIGJ1Zls1MTJdIF9fYWxpZ25lZChzaXplb2YobG9uZykpOwotfTsKKyNkZWZpbmUgU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQogCiBzdHJ1Y3Qga3ZtX3JtYXBfZGVzYyB7CiAJdTY0ICpzaGFkb3dfcHRlc1tSTUFQX0VYVF07CiAJc3RydWN0IGt2bV9ybWFwX2Rlc2MgKm1vcmU7CiB9OwogCitzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrIHsKKwlpbnQgKCplbnRyeSkoc3RydWN0IGt2bV9zaGFkb3dfd2FsayAqd2Fsaywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkgICAgIHU2NCBhZGRyLCB1NjQgKnNwdGUsIGludCBsZXZlbCk7Cit9OworCitzdHJ1Y3Qga3ZtX3Vuc3luY193YWxrIHsKKwlpbnQgKCplbnRyeSkgKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBzdHJ1Y3Qga3ZtX3Vuc3luY193YWxrICp3YWxrKTsKK307CisKK3R5cGVkZWYgaW50ICgqbW11X3BhcmVudF93YWxrX2ZuKSAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCk7CisKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcHRlX2NoYWluX2NhY2hlOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpybWFwX2Rlc2NfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1tdV9wYWdlX2hlYWRlcl9jYWNoZTsKQEAgLTQwNSwxNiArNDE0LDE5IEBACiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCByZXQgPSAwOwogCiAJYWRkciA9IGdmbl90b19odmEoa3ZtLCBnZm4pOwogCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJldDsKIAorCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgYWRkcik7CiAJaWYgKHZtYSAmJiBpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKLQkJcmV0dXJuIDE7CisJCXJldCA9IDE7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaXNfbGFyZ2VwYWdlX2JhY2tlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGxhcmdlX2dmbikKQEAgLTY0OSw4ICs2NjEsNiBAQAogCiAJaWYgKHdyaXRlX3Byb3RlY3RlZCkKIAkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7Ci0KLQlhY2NvdW50X3NoYWRvd2VkKGt2bSwgZ2ZuKTsKIH0KIAogc3RhdGljIGludCBrdm1fdW5tYXBfcm1hcHAoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nICpybWFwcCkKQEAgLTcxMSw2ICs3MjEsMTAgQEAKIAl1NjQgKnNwdGU7CiAJaW50IHlvdW5nID0gMDsKIAorCS8qIGFsd2F5cyByZXR1cm4gb2xkIGZvciBFUFQgKi8KKwlpZiAoIXNoYWRvd19hY2Nlc3NlZF9tYXNrKQorCQlyZXR1cm4gMDsKKwogCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgTlVMTCk7CiAJd2hpbGUgKHNwdGUpIHsKIAkJaW50IF95b3VuZzsKQEAgLTg1NSw2ICs4NjksNzcgQEAKIAlCVUcoKTsKIH0KIAorCitzdGF0aWMgdm9pZCBtbXVfcGFyZW50X3dhbGsoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKKwkJCSAgICBtbXVfcGFyZW50X3dhbGtfZm4gZm4pCit7CisJc3RydWN0IGt2bV9wdGVfY2hhaW4gKnB0ZV9jaGFpbjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYXJlbnRfc3A7CisJaW50IGk7CisKKwlpZiAoIXNwLT5tdWx0aW1hcHBlZCAmJiBzcC0+cGFyZW50X3B0ZSkgeworCQlwYXJlbnRfc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwLT5wYXJlbnRfcHRlKSk7CisJCWZuKHZjcHUsIHBhcmVudF9zcCk7CisJCW1tdV9wYXJlbnRfd2Fsayh2Y3B1LCBwYXJlbnRfc3AsIGZuKTsKKwkJcmV0dXJuOworCX0KKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwdGVfY2hhaW4sIG5vZGUsICZzcC0+cGFyZW50X3B0ZXMsIGxpbmspCisJCWZvciAoaSA9IDA7IGkgPCBOUl9QVEVfQ0hBSU5fRU5UUklFUzsgKytpKSB7CisJCQlpZiAoIXB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV0pCisJCQkJYnJlYWs7CisJCQlwYXJlbnRfc3AgPSBwYWdlX2hlYWRlcihfX3BhKHB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV0pKTsKKwkJCWZuKHZjcHUsIHBhcmVudF9zcCk7CisJCQltbXVfcGFyZW50X3dhbGsodmNwdSwgcGFyZW50X3NwLCBmbik7CisJCX0KK30KKworc3RhdGljIHZvaWQga3ZtX21tdV91cGRhdGVfdW5zeW5jX2JpdG1hcCh1NjQgKnNwdGUpCit7CisJdW5zaWduZWQgaW50IGluZGV4OworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwID0gcGFnZV9oZWFkZXIoX19wYShzcHRlKSk7CisKKwlpbmRleCA9IHNwdGUgLSBzcC0+c3B0OworCV9fc2V0X2JpdChpbmRleCwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApOworCXNwLT51bnN5bmNfY2hpbGRyZW4gPSAxOworfQorCitzdGF0aWMgdm9pZCBrdm1fbW11X3VwZGF0ZV9wYXJlbnRzX3Vuc3luYyhzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKK3sKKwlzdHJ1Y3Qga3ZtX3B0ZV9jaGFpbiAqcHRlX2NoYWluOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWludCBpOworCisJaWYgKCFzcC0+cGFyZW50X3B0ZSkKKwkJcmV0dXJuOworCisJaWYgKCFzcC0+bXVsdGltYXBwZWQpIHsKKwkJa3ZtX21tdV91cGRhdGVfdW5zeW5jX2JpdG1hcChzcC0+cGFyZW50X3B0ZSk7CisJCXJldHVybjsKKwl9CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwdGVfY2hhaW4sIG5vZGUsICZzcC0+cGFyZW50X3B0ZXMsIGxpbmspCisJCWZvciAoaSA9IDA7IGkgPCBOUl9QVEVfQ0hBSU5fRU5UUklFUzsgKytpKSB7CisJCQlpZiAoIXB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV0pCisJCQkJYnJlYWs7CisJCQlrdm1fbW11X3VwZGF0ZV91bnN5bmNfYml0bWFwKHB0ZV9jaGFpbi0+cGFyZW50X3B0ZXNbaV0pOworCQl9Cit9CisKK3N0YXRpYyBpbnQgdW5zeW5jX3dhbGtfZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKK3sKKwlzcC0+dW5zeW5jX2NoaWxkcmVuID0gMTsKKwlrdm1fbW11X3VwZGF0ZV9wYXJlbnRzX3Vuc3luYyhzcCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCW1tdV9wYXJlbnRfd2Fsayh2Y3B1LCBzcCwgdW5zeW5jX3dhbGtfZm4pOworCWt2bV9tbXVfdXBkYXRlX3BhcmVudHNfdW5zeW5jKHNwKTsKK30KKwogc3RhdGljIHZvaWQgbm9ucGFnaW5nX3ByZWZldGNoX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKQEAgLTg2NCw2ICs5NDksNTggQEAKIAkJc3AtPnNwdFtpXSA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOwogfQogCitzdGF0aWMgaW50IG5vbnBhZ2luZ19zeW5jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBub25wYWdpbmdfaW52bHBnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKQoreworfQorCisjZGVmaW5lIGZvcl9lYWNoX3Vuc3luY19jaGlsZHJlbihiaXRtYXAsIGlkeCkJCVwKKwlmb3IgKGlkeCA9IGZpbmRfZmlyc3RfYml0KGJpdG1hcCwgNTEyKTsJCVwKKwkgICAgIGlkeCA8IDUxMjsJCQkJCVwKKwkgICAgIGlkeCA9IGZpbmRfbmV4dF9iaXQoYml0bWFwLCA1MTIsIGlkeCsxKSkKKworc3RhdGljIGludCBtbXVfdW5zeW5jX3dhbGsoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsCisJCQkgICBzdHJ1Y3Qga3ZtX3Vuc3luY193YWxrICp3YWxrZXIpCit7CisJaW50IGksIHJldDsKKworCWlmICghc3AtPnVuc3luY19jaGlsZHJlbikKKwkJcmV0dXJuIDA7CisKKwlmb3JfZWFjaF91bnN5bmNfY2hpbGRyZW4oc3AtPnVuc3luY19jaGlsZF9iaXRtYXAsIGkpIHsKKwkJdTY0IGVudCA9IHNwLT5zcHRbaV07CisKKwkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZShlbnQpKSB7CisJCQlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpjaGlsZDsKKwkJCWNoaWxkID0gcGFnZV9oZWFkZXIoZW50ICYgUFQ2NF9CQVNFX0FERFJfTUFTSyk7CisKKwkJCWlmIChjaGlsZC0+dW5zeW5jX2NoaWxkcmVuKSB7CisJCQkJcmV0ID0gbW11X3Vuc3luY193YWxrKGNoaWxkLCB3YWxrZXIpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQkJX19jbGVhcl9iaXQoaSwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApOworCQkJfQorCisJCQlpZiAoY2hpbGQtPnVuc3luYykgeworCQkJCXJldCA9IHdhbGtlci0+ZW50cnkoY2hpbGQsIHdhbGtlcik7CisJCQkJX19jbGVhcl9iaXQoaSwgc3AtPnVuc3luY19jaGlsZF9iaXRtYXApOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZmluZF9maXJzdF9iaXQoc3AtPnVuc3luY19jaGlsZF9iaXRtYXAsIDUxMikgPT0gNTEyKQorCQlzcC0+dW5zeW5jX2NoaWxkcmVuID0gMDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGt2bV9tbXVfcGFnZSAqa3ZtX21tdV9sb29rdXBfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKIAl1bnNpZ25lZCBpbmRleDsKQEAgLTg4NCw2ICsxMDIxLDU5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGt2bV91bmxpbmtfdW5zeW5jX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKK3sKKwlXQVJOX09OKCFzcC0+dW5zeW5jKTsKKwlzcC0+dW5zeW5jID0gMDsKKwktLWt2bS0+c3RhdC5tbXVfdW5zeW5jOworfQorCitzdGF0aWMgaW50IGt2bV9tbXVfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCk7CisKK3N0YXRpYyBpbnQga3ZtX3N5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCWlmIChzcC0+cm9sZS5nbGV2ZWxzICE9IHZjcHUtPmFyY2gubW11LnJvb3RfbGV2ZWwpIHsKKwkJa3ZtX21tdV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcm1hcF93cml0ZV9wcm90ZWN0KHZjcHUtPmt2bSwgc3AtPmdmbik7CisJaWYgKHZjcHUtPmFyY2gubW11LnN5bmNfcGFnZSh2Y3B1LCBzcCkpIHsKKwkJa3ZtX21tdV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7CisJa3ZtX3VubGlua191bnN5bmNfcGFnZSh2Y3B1LT5rdm0sIHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHN5bmNfd2Fsa2VyIHsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJc3RydWN0IGt2bV91bnN5bmNfd2FsayB3YWxrZXI7Cit9OworCitzdGF0aWMgaW50IG1tdV9zeW5jX2ZuKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBzdHJ1Y3Qga3ZtX3Vuc3luY193YWxrICp3YWxrKQoreworCXN0cnVjdCBzeW5jX3dhbGtlciAqc3luY193YWxrID0gY29udGFpbmVyX29mKHdhbGssIHN0cnVjdCBzeW5jX3dhbGtlciwKKwkJCQkJCSAgICAgd2Fsa2VyKTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBzeW5jX3dhbGstPnZjcHU7CisKKwlrdm1fc3luY19wYWdlKHZjcHUsIHNwKTsKKwlyZXR1cm4gKG5lZWRfcmVzY2hlZCgpIHx8IHNwaW5fbmVlZGJyZWFrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1tdV9zeW5jX2NoaWxkcmVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCit7CisJc3RydWN0IHN5bmNfd2Fsa2VyIHdhbGtlciA9IHsKKwkJLndhbGtlciA9IHsgLmVudHJ5ID0gbW11X3N5bmNfZm4sIH0sCisJCS52Y3B1ID0gdmNwdSwKKwl9OworCisJd2hpbGUgKG1tdV91bnN5bmNfd2FsayhzcCwgJndhbGtlci53YWxrZXIpKQorCQljb25kX3Jlc2NoZWRfbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qga3ZtX21tdV9wYWdlICprdm1fbW11X2dldF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICAgICBnZm5fdCBnZm4sCiAJCQkJCSAgICAgZ3ZhX3QgZ2FkZHIsCkBAIC04OTcsNyArMTA4Nyw3IEBACiAJdW5zaWduZWQgcXVhZHJhbnQ7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKIAogCXJvbGUud29yZCA9IDA7CiAJcm9sZS5nbGV2ZWxzID0gdmNwdS0+YXJjaC5tbXUucm9vdF9sZXZlbDsKQEAgLTkxMyw5ICsxMTAzLDIwIEBACiAJCSBnZm4sIHJvbGUud29yZCk7CiAJaW5kZXggPSBrdm1fcGFnZV90YWJsZV9oYXNoZm4oZ2ZuKTsKIAlidWNrZXQgPSAmdmNwdS0+a3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCBub2RlLCBidWNrZXQsIGhhc2hfbGluaykKLQkJaWYgKHNwLT5nZm4gPT0gZ2ZuICYmIHNwLT5yb2xlLndvcmQgPT0gcm9sZS53b3JkKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcCwgbm9kZSwgdG1wLCBidWNrZXQsIGhhc2hfbGluaykKKwkJaWYgKHNwLT5nZm4gPT0gZ2ZuKSB7CisJCQlpZiAoc3AtPnVuc3luYykKKwkJCQlpZiAoa3ZtX3N5bmNfcGFnZSh2Y3B1LCBzcCkpCisJCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3AtPnJvbGUud29yZCAhPSByb2xlLndvcmQpCisJCQkJY29udGludWU7CisKIAkJCW1tdV9wYWdlX2FkZF9wYXJlbnRfcHRlKHZjcHUsIHNwLCBwYXJlbnRfcHRlKTsKKwkJCWlmIChzcC0+dW5zeW5jX2NoaWxkcmVuKSB7CisJCQkJc2V0X2JpdChLVk1fUkVRX01NVV9TWU5DLCAmdmNwdS0+cmVxdWVzdHMpOworCQkJCWt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyh2Y3B1LCBzcCk7CisJCQl9CiAJCQlwZ3ByaW50aygiJXM6IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gc3A7CiAJCX0KQEAgLTkyNyw4ICsxMTI4LDEwIEBACiAJc3AtPmdmbiA9IGdmbjsKIAlzcC0+cm9sZSA9IHJvbGU7CiAJaGxpc3RfYWRkX2hlYWQoJnNwLT5oYXNoX2xpbmssIGJ1Y2tldCk7Ci0JaWYgKCFtZXRhcGh5c2ljYWwpCisJaWYgKCFtZXRhcGh5c2ljYWwpIHsKIAkJcm1hcF93cml0ZV9wcm90ZWN0KHZjcHUtPmt2bSwgZ2ZuKTsKKwkJYWNjb3VudF9zaGFkb3dlZCh2Y3B1LT5rdm0sIGdmbik7CisJfQogCWlmIChzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSAhPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKQogCQl2Y3B1LT5hcmNoLm1tdS5wcmVmZXRjaF9wYWdlKHZjcHUsIHNwKTsKIAllbHNlCkBAIC05MzYsNiArMTEzOSwzNSBAQAogCXJldHVybiBzcDsKIH0KIAorc3RhdGljIGludCB3YWxrX3NoYWRvdyhzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrICp3YWxrZXIsCisJCSAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBhZGRyKQoreworCWhwYV90IHNoYWRvd19hZGRyOworCWludCBsZXZlbDsKKwlpbnQgcjsKKwl1NjQgKnNwdGVwOworCXVuc2lnbmVkIGluZGV4OworCisJc2hhZG93X2FkZHIgPSB2Y3B1LT5hcmNoLm1tdS5yb290X2hwYTsKKwlsZXZlbCA9IHZjcHUtPmFyY2gubW11LnNoYWRvd19yb290X2xldmVsOworCWlmIChsZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKSB7CisJCXNoYWRvd19hZGRyID0gdmNwdS0+YXJjaC5tbXUucGFlX3Jvb3RbKGFkZHIgPj4gMzApICYgM107CisJCXNoYWRvd19hZGRyICY9IFBUNjRfQkFTRV9BRERSX01BU0s7CisJCS0tbGV2ZWw7CisJfQorCisJd2hpbGUgKGxldmVsID49IFBUX1BBR0VfVEFCTEVfTEVWRUwpIHsKKwkJaW5kZXggPSBTSEFET1dfUFRfSU5ERVgoYWRkciwgbGV2ZWwpOworCQlzcHRlcCA9ICgodTY0ICopX192YShzaGFkb3dfYWRkcikpICsgaW5kZXg7CisJCXIgPSB3YWxrZXItPmVudHJ5KHdhbGtlciwgdmNwdSwgYWRkciwgc3B0ZXAsIGxldmVsKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwkJc2hhZG93X2FkZHIgPSAqc3B0ZXAgJiBQVDY0X0JBU0VfQUREUl9NQVNLOworCQktLWxldmVsOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQga3ZtX21tdV9wYWdlX3VubGlua19jaGlsZHJlbihzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJCSBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKQEAgLTk1MSw3ICsxMTgzLDYgQEAKIAkJCQlybWFwX3JlbW92ZShrdm0sICZwdFtpXSk7CiAJCQlwdFtpXSA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOwogCQl9Ci0JCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOwogCQlyZXR1cm47CiAJfQogCkBAIC05NzAsNyArMTIwMSw2IEBACiAJCX0KIAkJcHRbaV0gPSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKIAl9Ci0Ja3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9tbXVfcHV0X3BhZ2Uoc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsIHU2NCAqcGFyZW50X3B0ZSkKQEAgLTk4NywxMSArMTIxNywxMCBAQAogCQkJa3ZtLT52Y3B1c1tpXS0+YXJjaC5sYXN0X3B0ZV91cGRhdGVkID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQga3ZtX21tdV96YXBfcGFnZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQorc3RhdGljIHZvaWQga3ZtX21tdV91bmxpbmtfcGFyZW50cyhzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQogewogCXU2NCAqcGFyZW50X3B0ZTsKIAotCSsra3ZtLT5zdGF0Lm1tdV9zaGFkb3dfemFwcGVkOwogCXdoaWxlIChzcC0+bXVsdGltYXBwZWQgfHwgc3AtPnBhcmVudF9wdGUpIHsKIAkJaWYgKCFzcC0+bXVsdGltYXBwZWQpCiAJCQlwYXJlbnRfcHRlID0gc3AtPnBhcmVudF9wdGU7CkBAIC0xMDA2LDIxICsxMjM1LDU5IEBACiAJCWt2bV9tbXVfcHV0X3BhZ2Uoc3AsIHBhcmVudF9wdGUpOwogCQlzZXRfc2hhZG93X3B0ZShwYXJlbnRfcHRlLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CiAJfQorfQorCitzdHJ1Y3QgemFwX3dhbGtlciB7CisJc3RydWN0IGt2bV91bnN5bmNfd2FsayB3YWxrZXI7CisJc3RydWN0IGt2bSAqa3ZtOworCWludCB6YXBwZWQ7Cit9OworCitzdGF0aWMgaW50IG1tdV96YXBfZm4oc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AsIHN0cnVjdCBrdm1fdW5zeW5jX3dhbGsgKndhbGspCit7CisJc3RydWN0IHphcF93YWxrZXIgKnphcF93YWxrID0gY29udGFpbmVyX29mKHdhbGssIHN0cnVjdCB6YXBfd2Fsa2VyLAorCQkJCQkJICAgICB3YWxrZXIpOworCWt2bV9tbXVfemFwX3BhZ2UoemFwX3dhbGstPmt2bSwgc3ApOworCXphcF93YWxrLT56YXBwZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCit7CisJc3RydWN0IHphcF93YWxrZXIgd2Fsa2VyID0geworCQkud2Fsa2VyID0geyAuZW50cnkgPSBtbXVfemFwX2ZuLCB9LAorCQkua3ZtID0ga3ZtLAorCQkuemFwcGVkID0gMCwKKwl9OworCisJaWYgKHNwLT5yb2xlLmxldmVsID09IFBUX1BBR0VfVEFCTEVfTEVWRUwpCisJCXJldHVybiAwOworCW1tdV91bnN5bmNfd2FsayhzcCwgJndhbGtlci53YWxrZXIpOworCXJldHVybiB3YWxrZXIuemFwcGVkOworfQorCitzdGF0aWMgaW50IGt2bV9tbXVfemFwX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKK3sKKwlpbnQgcmV0OworCSsra3ZtLT5zdGF0Lm1tdV9zaGFkb3dfemFwcGVkOworCXJldCA9IG1tdV96YXBfdW5zeW5jX2NoaWxkcmVuKGt2bSwgc3ApOwogCWt2bV9tbXVfcGFnZV91bmxpbmtfY2hpbGRyZW4oa3ZtLCBzcCk7CisJa3ZtX21tdV91bmxpbmtfcGFyZW50cyhrdm0sIHNwKTsKKwlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKKwlpZiAoIXNwLT5yb2xlLmludmFsaWQgJiYgIXNwLT5yb2xlLm1ldGFwaHlzaWNhbCkKKwkJdW5hY2NvdW50X3NoYWRvd2VkKGt2bSwgc3AtPmdmbik7CisJaWYgKHNwLT51bnN5bmMpCisJCWt2bV91bmxpbmtfdW5zeW5jX3BhZ2Uoa3ZtLCBzcCk7CiAJaWYgKCFzcC0+cm9vdF9jb3VudCkgewotCQlpZiAoIXNwLT5yb2xlLm1ldGFwaHlzaWNhbCAmJiAhc3AtPnJvbGUuaW52YWxpZCkKLQkJCXVuYWNjb3VudF9zaGFkb3dlZChrdm0sIHNwLT5nZm4pOwogCQlobGlzdF9kZWwoJnNwLT5oYXNoX2xpbmspOwogCQlrdm1fbW11X2ZyZWVfcGFnZShrdm0sIHNwKTsKIAl9IGVsc2UgewotCQlpbnQgaW52YWxpZCA9IHNwLT5yb2xlLmludmFsaWQ7Ci0JCWxpc3RfbW92ZSgmc3AtPmxpbmssICZrdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcyk7CiAJCXNwLT5yb2xlLmludmFsaWQgPSAxOworCQlsaXN0X21vdmUoJnNwLT5saW5rLCAma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOwogCQlrdm1fcmVsb2FkX3JlbW90ZV9tbXVzKGt2bSk7Ci0JCWlmICghc3AtPnJvbGUubWV0YXBoeXNpY2FsICYmICFpbnZhbGlkKQotCQkJdW5hY2NvdW50X3NoYWRvd2VkKGt2bSwgc3AtPmdmbik7CiAJfQogCWt2bV9tbXVfcmVzZXRfbGFzdF9wdGVfdXBkYXRlZChrdm0pOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xMDczLDggKzEzNDAsOSBAQAogCQlpZiAoc3AtPmdmbiA9PSBnZm4gJiYgIXNwLT5yb2xlLm1ldGFwaHlzaWNhbCkgewogCQkJcGdwcmludGsoIiVzOiBnZm4gJWx4IHJvbGUgJXhcbiIsIF9fZnVuY19fLCBnZm4sCiAJCQkJIHNwLT5yb2xlLndvcmQpOwotCQkJa3ZtX21tdV96YXBfcGFnZShrdm0sIHNwKTsKIAkJCXIgPSAxOworCQkJaWYgKGt2bV9tbXVfemFwX3BhZ2Uoa3ZtLCBzcCkpCisJCQkJbiA9IGJ1Y2tldC0+Zmlyc3Q7CiAJCX0KIAlyZXR1cm4gcjsKIH0KQEAgLTEwOTcsNiArMTM2NSwyMCBAQAogCV9fc2V0X2JpdChzbG90LCAmc3AtPnNsb3RfYml0bWFwKTsKIH0KIAorc3RhdGljIHZvaWQgbW11X2NvbnZlcnRfbm90cmFwKHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCWludCBpOworCXU2NCAqcHQgPSBzcC0+c3B0OworCisJaWYgKHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlID09IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBQVDY0X0VOVF9QRVJfUEFHRTsgKytpKSB7CisJCWlmIChwdFtpXSA9PSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKQorCQkJc2V0X3NoYWRvd19wdGUoJnB0W2ldLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJfQorfQorCiBzdHJ1Y3QgcGFnZSAqZ3ZhX3RvX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMTA2LDIwICsxMzg4LDExNiBAQAogCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQogCQlyZXR1cm4gTlVMTDsKIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlwYWdlID0gZ2ZuX3RvX3BhZ2UodmNwdS0+a3ZtLCBncGEgPj4gUEFHRV9TSElGVCk7Ci0JdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAogCXJldHVybiBwYWdlOwogfQogCitzdGF0aWMgaW50IGt2bV91bnN5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCXVuc2lnbmVkIGluZGV4OworCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqczsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47CisKKwlpbmRleCA9IGt2bV9wYWdlX3RhYmxlX2hhc2hmbihzcC0+Z2ZuKTsKKwlidWNrZXQgPSAmdmNwdS0+a3ZtLT5hcmNoLm1tdV9wYWdlX2hhc2hbaW5kZXhdOworCS8qIGRvbid0IHVuc3luYyBpZiBwYWdldGFibGUgaXMgc2hhZG93ZWQgd2l0aCBtdWx0aXBsZSByb2xlcyAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocywgbm9kZSwgbiwgYnVja2V0LCBoYXNoX2xpbmspIHsKKwkJaWYgKHMtPmdmbiAhPSBzcC0+Z2ZuIHx8IHMtPnJvbGUubWV0YXBoeXNpY2FsKQorCQkJY29udGludWU7CisJCWlmIChzLT5yb2xlLndvcmQgIT0gc3AtPnJvbGUud29yZCkKKwkJCXJldHVybiAxOworCX0KKwlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmModmNwdSwgc3ApOworCSsrdmNwdS0+a3ZtLT5zdGF0Lm1tdV91bnN5bmM7CisJc3AtPnVuc3luYyA9IDE7CisJbW11X2NvbnZlcnRfbm90cmFwKHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbXVfbmVlZF93cml0ZV9wcm90ZWN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuLAorCQkJCSAgYm9vbCBjYW5fdW5zeW5jKQoreworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNoYWRvdzsKKworCXNoYWRvdyA9IGt2bV9tbXVfbG9va3VwX3BhZ2UodmNwdS0+a3ZtLCBnZm4pOworCWlmIChzaGFkb3cpIHsKKwkJaWYgKHNoYWRvdy0+cm9sZS5sZXZlbCAhPSBQVF9QQUdFX1RBQkxFX0xFVkVMKQorCQkJcmV0dXJuIDE7CisJCWlmIChzaGFkb3ctPnVuc3luYykKKwkJCXJldHVybiAwOworCQlpZiAoY2FuX3Vuc3luYyAmJiBvb3Nfc2hhZG93KQorCQkJcmV0dXJuIGt2bV91bnN5bmNfcGFnZSh2Y3B1LCBzaGFkb3cpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NwdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNoYWRvd19wdGUsCisJCSAgICB1bnNpZ25lZCBwdGVfYWNjZXNzLCBpbnQgdXNlcl9mYXVsdCwKKwkJICAgIGludCB3cml0ZV9mYXVsdCwgaW50IGRpcnR5LCBpbnQgbGFyZ2VwYWdlLAorCQkgICAgZ2ZuX3QgZ2ZuLCBwZm5fdCBwZm4sIGJvb2wgc3BlY3VsYXRpdmUsCisJCSAgICBib29sIGNhbl91bnN5bmMpCit7CisJdTY0IHNwdGU7CisJaW50IHJldCA9IDA7CisJLyoKKwkgKiBXZSBkb24ndCBzZXQgdGhlIGFjY2Vzc2VkIGJpdCwgc2luY2Ugd2Ugc29tZXRpbWVzIHdhbnQgdG8gc2VlCisJICogd2hldGhlciB0aGUgZ3Vlc3QgYWN0dWFsbHkgdXNlZCB0aGUgcHRlIChpbiBvcmRlciB0byBkZXRlY3QKKwkgKiBkZW1hbmQgcGFnaW5nKS4KKwkgKi8KKwlzcHRlID0gc2hhZG93X2Jhc2VfcHJlc2VudF9wdGUgfCBzaGFkb3dfZGlydHlfbWFzazsKKwlpZiAoIXNwZWN1bGF0aXZlKQorCQlzcHRlIHw9IHNoYWRvd19hY2Nlc3NlZF9tYXNrOworCWlmICghZGlydHkpCisJCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCWlmIChwdGVfYWNjZXNzICYgQUNDX0VYRUNfTUFTSykKKwkJc3B0ZSB8PSBzaGFkb3dfeF9tYXNrOworCWVsc2UKKwkJc3B0ZSB8PSBzaGFkb3dfbnhfbWFzazsKKwlpZiAocHRlX2FjY2VzcyAmIEFDQ19VU0VSX01BU0spCisJCXNwdGUgfD0gc2hhZG93X3VzZXJfbWFzazsKKwlpZiAobGFyZ2VwYWdlKQorCQlzcHRlIHw9IFBUX1BBR0VfU0laRV9NQVNLOworCisJc3B0ZSB8PSAodTY0KXBmbiA8PCBQQUdFX1NISUZUOworCisJaWYgKChwdGVfYWNjZXNzICYgQUNDX1dSSVRFX01BU0spCisJICAgIHx8ICh3cml0ZV9mYXVsdCAmJiAhaXNfd3JpdGVfcHJvdGVjdGlvbih2Y3B1KSAmJiAhdXNlcl9mYXVsdCkpIHsKKworCQlpZiAobGFyZ2VwYWdlICYmIGhhc193cnByb3RlY3RlZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuKSkgeworCQkJcmV0ID0gMTsKKwkJCXNwdGUgPSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKKwkJCWdvdG8gc2V0X3B0ZTsKKwkJfQorCisJCXNwdGUgfD0gUFRfV1JJVEFCTEVfTUFTSzsKKworCQlpZiAobW11X25lZWRfd3JpdGVfcHJvdGVjdCh2Y3B1LCBnZm4sIGNhbl91bnN5bmMpKSB7CisJCQlwZ3ByaW50aygiJXM6IGZvdW5kIHNoYWRvdyBwYWdlIGZvciAlbHgsIG1hcmtpbmcgcm9cbiIsCisJCQkJIF9fZnVuY19fLCBnZm4pOworCQkJcmV0ID0gMTsKKwkJCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCQkJaWYgKGlzX3dyaXRlYmxlX3B0ZShzcHRlKSkKKwkJCQlzcHRlICY9IH5QVF9XUklUQUJMRV9NQVNLOworCQl9CisJfQorCisJaWYgKHB0ZV9hY2Nlc3MgJiBBQ0NfV1JJVEVfTUFTSykKKwkJbWFya19wYWdlX2RpcnR5KHZjcHUtPmt2bSwgZ2ZuKTsKKworc2V0X3B0ZToKKwlzZXRfc2hhZG93X3B0ZShzaGFkb3dfcHRlLCBzcHRlKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBtbXVfc2V0X3NwdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNoYWRvd19wdGUsCiAJCQkgdW5zaWduZWQgcHRfYWNjZXNzLCB1bnNpZ25lZCBwdGVfYWNjZXNzLAogCQkJIGludCB1c2VyX2ZhdWx0LCBpbnQgd3JpdGVfZmF1bHQsIGludCBkaXJ0eSwKIAkJCSBpbnQgKnB0d3JpdGUsIGludCBsYXJnZXBhZ2UsIGdmbl90IGdmbiwKIAkJCSBwZm5fdCBwZm4sIGJvb2wgc3BlY3VsYXRpdmUpCiB7Ci0JdTY0IHNwdGU7CiAJaW50IHdhc19ybWFwcGVkID0gMDsKIAlpbnQgd2FzX3dyaXRlYmxlID0gaXNfd3JpdGVibGVfcHRlKCpzaGFkb3dfcHRlKTsKIApAQCAtMTE1MCw1OSArMTUyOCwxOSBAQAogCQkJCXdhc19ybWFwcGVkID0gMTsKIAkJfQogCX0KLQotCS8qCi0JICogV2UgZG9uJ3Qgc2V0IHRoZSBhY2Nlc3NlZCBiaXQsIHNpbmNlIHdlIHNvbWV0aW1lcyB3YW50IHRvIHNlZQotCSAqIHdoZXRoZXIgdGhlIGd1ZXN0IGFjdHVhbGx5IHVzZWQgdGhlIHB0ZSAoaW4gb3JkZXIgdG8gZGV0ZWN0Ci0JICogZGVtYW5kIHBhZ2luZykuCi0JICovCi0Jc3B0ZSA9IHNoYWRvd19iYXNlX3ByZXNlbnRfcHRlIHwgc2hhZG93X2RpcnR5X21hc2s7Ci0JaWYgKCFzcGVjdWxhdGl2ZSkKLQkJcHRlX2FjY2VzcyB8PSBQVF9BQ0NFU1NFRF9NQVNLOwotCWlmICghZGlydHkpCi0JCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOwotCWlmIChwdGVfYWNjZXNzICYgQUNDX0VYRUNfTUFTSykKLQkJc3B0ZSB8PSBzaGFkb3dfeF9tYXNrOwotCWVsc2UKLQkJc3B0ZSB8PSBzaGFkb3dfbnhfbWFzazsKLQlpZiAocHRlX2FjY2VzcyAmIEFDQ19VU0VSX01BU0spCi0JCXNwdGUgfD0gc2hhZG93X3VzZXJfbWFzazsKLQlpZiAobGFyZ2VwYWdlKQotCQlzcHRlIHw9IFBUX1BBR0VfU0laRV9NQVNLOwotCi0Jc3B0ZSB8PSAodTY0KXBmbiA8PCBQQUdFX1NISUZUOwotCi0JaWYgKChwdGVfYWNjZXNzICYgQUNDX1dSSVRFX01BU0spCi0JICAgIHx8ICh3cml0ZV9mYXVsdCAmJiAhaXNfd3JpdGVfcHJvdGVjdGlvbih2Y3B1KSAmJiAhdXNlcl9mYXVsdCkpIHsKLQkJc3RydWN0IGt2bV9tbXVfcGFnZSAqc2hhZG93OwotCi0JCXNwdGUgfD0gUFRfV1JJVEFCTEVfTUFTSzsKLQotCQlzaGFkb3cgPSBrdm1fbW11X2xvb2t1cF9wYWdlKHZjcHUtPmt2bSwgZ2ZuKTsKLQkJaWYgKHNoYWRvdyB8fAotCQkgICAobGFyZ2VwYWdlICYmIGhhc193cnByb3RlY3RlZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuKSkpIHsKLQkJCXBncHJpbnRrKCIlczogZm91bmQgc2hhZG93IHBhZ2UgZm9yICVseCwgbWFya2luZyByb1xuIiwKLQkJCQkgX19mdW5jX18sIGdmbik7Ci0JCQlwdGVfYWNjZXNzICY9IH5BQ0NfV1JJVEVfTUFTSzsKLQkJCWlmIChpc193cml0ZWJsZV9wdGUoc3B0ZSkpIHsKLQkJCQlzcHRlICY9IH5QVF9XUklUQUJMRV9NQVNLOwotCQkJCWt2bV94ODZfb3BzLT50bGJfZmx1c2godmNwdSk7Ci0JCQl9Ci0JCQlpZiAod3JpdGVfZmF1bHQpCi0JCQkJKnB0d3JpdGUgPSAxOwotCQl9CisJaWYgKHNldF9zcHRlKHZjcHUsIHNoYWRvd19wdGUsIHB0ZV9hY2Nlc3MsIHVzZXJfZmF1bHQsIHdyaXRlX2ZhdWx0LAorCQkgICAgICBkaXJ0eSwgbGFyZ2VwYWdlLCBnZm4sIHBmbiwgc3BlY3VsYXRpdmUsIHRydWUpKSB7CisJCWlmICh3cml0ZV9mYXVsdCkKKwkJCSpwdHdyaXRlID0gMTsKKwkJa3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKIAl9CiAKLQlpZiAocHRlX2FjY2VzcyAmIEFDQ19XUklURV9NQVNLKQotCQltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCBnZm4pOwotCi0JcGdwcmludGsoIiVzOiBzZXR0aW5nIHNwdGUgJWxseFxuIiwgX19mdW5jX18sIHNwdGUpOworCXBncHJpbnRrKCIlczogc2V0dGluZyBzcHRlICVsbHhcbiIsIF9fZnVuY19fLCAqc2hhZG93X3B0ZSk7CiAJcGdwcmludGsoImluc3RhbnRpYXRpbmcgJXMgUFRFICglcykgYXQgJWxkICglbGx4KSBhZGRyICVwXG4iLAotCQkgKHNwdGUmUFRfUEFHRV9TSVpFX01BU0spPyAiMk1CIiA6ICI0a0IiLAotCQkgKHNwdGUmUFRfV1JJVEFCTEVfTUFTSyk/IlJXIjoiUiIsIGdmbiwgc3B0ZSwgc2hhZG93X3B0ZSk7Ci0Jc2V0X3NoYWRvd19wdGUoc2hhZG93X3B0ZSwgc3B0ZSk7Ci0JaWYgKCF3YXNfcm1hcHBlZCAmJiAoc3B0ZSAmIFBUX1BBR0VfU0laRV9NQVNLKQotCSAgICAmJiAoc3B0ZSAmIFBUX1BSRVNFTlRfTUFTSykpCisJCSBpc19sYXJnZV9wdGUoKnNoYWRvd19wdGUpPyAiMk1CIiA6ICI0a0IiLAorCQkgaXNfcHJlc2VudF9wdGUoKnNoYWRvd19wdGUpPyJSVyI6IlIiLCBnZm4sCisJCSAqc2hhZG93X3B0ZSwgc2hhZG93X3B0ZSk7CisJaWYgKCF3YXNfcm1hcHBlZCAmJiBpc19sYXJnZV9wdGUoKnNoYWRvd19wdGUpKQogCQkrK3ZjcHUtPmt2bS0+c3RhdC5scGFnZXM7CiAKIAlwYWdlX2hlYWRlcl91cGRhdGVfc2xvdCh2Y3B1LT5rdm0sIHNoYWRvd19wdGUsIGdmbik7CkBAIC0xMjI2LDU0ICsxNTY0LDY3IEBACiB7CiB9CiAKLXN0YXRpYyBpbnQgX19kaXJlY3RfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgdiwgaW50IHdyaXRlLAotCQkJICAgaW50IGxhcmdlcGFnZSwgZ2ZuX3QgZ2ZuLCBwZm5fdCBwZm4sCi0JCQkgICBpbnQgbGV2ZWwpCitzdHJ1Y3QgZGlyZWN0X3NoYWRvd193YWxrIHsKKwlzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrIHdhbGtlcjsKKwlwZm5fdCBwZm47CisJaW50IHdyaXRlOworCWludCBsYXJnZXBhZ2U7CisJaW50IHB0X3dyaXRlOworfTsKKworc3RhdGljIGludCBkaXJlY3RfbWFwX2VudHJ5KHN0cnVjdCBrdm1fc2hhZG93X3dhbGsgKl93YWxrLAorCQkJICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICB1NjQgYWRkciwgdTY0ICpzcHRlcCwgaW50IGxldmVsKQogewotCWhwYV90IHRhYmxlX2FkZHIgPSB2Y3B1LT5hcmNoLm1tdS5yb290X2hwYTsKLQlpbnQgcHRfd3JpdGUgPSAwOworCXN0cnVjdCBkaXJlY3Rfc2hhZG93X3dhbGsgKndhbGsgPQorCQljb250YWluZXJfb2YoX3dhbGssIHN0cnVjdCBkaXJlY3Rfc2hhZG93X3dhbGssIHdhbGtlcik7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CisJZ2ZuX3QgcHNldWRvX2dmbjsKKwlnZm5fdCBnZm4gPSBhZGRyID4+IFBBR0VfU0hJRlQ7CiAKLQlmb3IgKDsgOyBsZXZlbC0tKSB7Ci0JCXUzMiBpbmRleCA9IFBUNjRfSU5ERVgodiwgbGV2ZWwpOwotCQl1NjQgKnRhYmxlOwotCi0JCUFTU0VSVChWQUxJRF9QQUdFKHRhYmxlX2FkZHIpKTsKLQkJdGFibGUgPSBfX3ZhKHRhYmxlX2FkZHIpOwotCi0JCWlmIChsZXZlbCA9PSAxKSB7Ci0JCQltbXVfc2V0X3NwdGUodmNwdSwgJnRhYmxlW2luZGV4XSwgQUNDX0FMTCwgQUNDX0FMTCwKLQkJCQkgICAgIDAsIHdyaXRlLCAxLCAmcHRfd3JpdGUsIDAsIGdmbiwgcGZuLCBmYWxzZSk7Ci0JCQlyZXR1cm4gcHRfd3JpdGU7Ci0JCX0KLQotCQlpZiAobGFyZ2VwYWdlICYmIGxldmVsID09IDIpIHsKLQkJCW1tdV9zZXRfc3B0ZSh2Y3B1LCAmdGFibGVbaW5kZXhdLCBBQ0NfQUxMLCBBQ0NfQUxMLAotCQkJCSAgICAgMCwgd3JpdGUsIDEsICZwdF93cml0ZSwgMSwgZ2ZuLCBwZm4sIGZhbHNlKTsKLQkJCXJldHVybiBwdF93cml0ZTsKLQkJfQotCi0JCWlmICh0YWJsZVtpbmRleF0gPT0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpIHsKLQkJCXN0cnVjdCBrdm1fbW11X3BhZ2UgKm5ld190YWJsZTsKLQkJCWdmbl90IHBzZXVkb19nZm47Ci0KLQkJCXBzZXVkb19nZm4gPSAodiAmIFBUNjRfRElSX0JBU0VfQUREUl9NQVNLKQotCQkJCT4+IFBBR0VfU0hJRlQ7Ci0JCQluZXdfdGFibGUgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIHBzZXVkb19nZm4sCi0JCQkJCQkgICAgIHYsIGxldmVsIC0gMSwKLQkJCQkJCSAgICAgMSwgQUNDX0FMTCwgJnRhYmxlW2luZGV4XSk7Ci0JCQlpZiAoIW5ld190YWJsZSkgewotCQkJCXBncHJpbnRrKCJub25wYWdpbmdfbWFwOiBFTk9NRU1cbiIpOwotCQkJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCi0JCQlzZXRfc2hhZG93X3B0ZSgmdGFibGVbaW5kZXhdLAotCQkJCSAgICAgICBfX3BhKG5ld190YWJsZS0+c3B0KQotCQkJCSAgICAgICB8IFBUX1BSRVNFTlRfTUFTSyB8IFBUX1dSSVRBQkxFX01BU0sKLQkJCQkgICAgICAgfCBzaGFkb3dfdXNlcl9tYXNrIHwgc2hhZG93X3hfbWFzayk7Ci0JCX0KLQkJdGFibGVfYWRkciA9IHRhYmxlW2luZGV4XSAmIFBUNjRfQkFTRV9BRERSX01BU0s7CisJaWYgKGxldmVsID09IFBUX1BBR0VfVEFCTEVfTEVWRUwKKwkgICAgfHwgKHdhbGstPmxhcmdlcGFnZSAmJiBsZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpKSB7CisJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzcHRlcCwgQUNDX0FMTCwgQUNDX0FMTCwKKwkJCSAgICAgMCwgd2Fsay0+d3JpdGUsIDEsICZ3YWxrLT5wdF93cml0ZSwKKwkJCSAgICAgd2Fsay0+bGFyZ2VwYWdlLCBnZm4sIHdhbGstPnBmbiwgZmFsc2UpOworCQkrK3ZjcHUtPnN0YXQucGZfZml4ZWQ7CisJCXJldHVybiAxOwogCX0KKworCWlmICgqc3B0ZXAgPT0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGUpIHsKKwkJcHNldWRvX2dmbiA9IChhZGRyICYgUFQ2NF9ESVJfQkFTRV9BRERSX01BU0spID4+IFBBR0VfU0hJRlQ7CisJCXNwID0ga3ZtX21tdV9nZXRfcGFnZSh2Y3B1LCBwc2V1ZG9fZ2ZuLCAoZ3ZhX3QpYWRkciwgbGV2ZWwgLSAxLAorCQkJCSAgICAgIDEsIEFDQ19BTEwsIHNwdGVwKTsKKwkJaWYgKCFzcCkgeworCQkJcGdwcmludGsoIm5vbnBhZ2luZ19tYXA6IEVOT01FTVxuIik7CisJCQlrdm1fcmVsZWFzZV9wZm5fY2xlYW4od2Fsay0+cGZuKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc2V0X3NoYWRvd19wdGUoc3B0ZXAsCisJCQkgICAgICAgX19wYShzcC0+c3B0KQorCQkJICAgICAgIHwgUFRfUFJFU0VOVF9NQVNLIHwgUFRfV1JJVEFCTEVfTUFTSworCQkJICAgICAgIHwgc2hhZG93X3VzZXJfbWFzayB8IHNoYWRvd194X21hc2spOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RpcmVjdF9tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCB2LCBpbnQgd3JpdGUsCisJCQlpbnQgbGFyZ2VwYWdlLCBnZm5fdCBnZm4sIHBmbl90IHBmbikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGlyZWN0X3NoYWRvd193YWxrIHdhbGtlciA9IHsKKwkJLndhbGtlciA9IHsgLmVudHJ5ID0gZGlyZWN0X21hcF9lbnRyeSwgfSwKKwkJLnBmbiA9IHBmbiwKKwkJLmxhcmdlcGFnZSA9IGxhcmdlcGFnZSwKKwkJLndyaXRlID0gd3JpdGUsCisJCS5wdF93cml0ZSA9IDAsCisJfTsKKworCXIgPSB3YWxrX3NoYWRvdygmd2Fsa2VyLndhbGtlciwgdmNwdSwgZ2ZuIDw8IFBBR0VfU0hJRlQpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJcmV0dXJuIHdhbGtlci5wdF93cml0ZTsKIH0KIAogc3RhdGljIGludCBub25wYWdpbmdfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdiwgaW50IHdyaXRlLCBnZm5fdCBnZm4pCkBAIC0xMjgzLDE2ICsxNjM0LDE0IEBACiAJcGZuX3QgcGZuOwogCXVuc2lnbmVkIGxvbmcgbW11X3NlcTsKIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlpZiAoaXNfbGFyZ2VwYWdlX2JhY2tlZCh2Y3B1LCBnZm4gJiB+KEtWTV9QQUdFU19QRVJfSFBBR0UtMSkpKSB7CiAJCWdmbiAmPSB+KEtWTV9QQUdFU19QRVJfSFBBR0UtMSk7CiAJCWxhcmdlcGFnZSA9IDE7CiAJfQogCiAJbW11X3NlcSA9IHZjcHUtPmt2bS0+bW11X25vdGlmaWVyX3NlcTsKLQkvKiBpbXBsaWNpdCBtYigpLCB3ZSdsbCByZWFkIGJlZm9yZSBQVCBsb2NrIGlzIHVubG9ja2VkICovCisJc21wX3JtYigpOwogCXBmbiA9IGdmbl90b19wZm4odmNwdS0+a3ZtLCBnZm4pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAkvKiBtbWlvICovCiAJaWYgKGlzX2Vycm9yX3BmbihwZm4pKSB7CkBAIC0xMzA0LDggKzE2NTMsNyBAQAogCWlmIChtbXVfbm90aWZpZXJfcmV0cnkodmNwdSwgbW11X3NlcSkpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlrdm1fbW11X2ZyZWVfc29tZV9wYWdlcyh2Y3B1KTsKLQlyID0gX19kaXJlY3RfbWFwKHZjcHUsIHYsIHdyaXRlLCBsYXJnZXBhZ2UsIGdmbiwgcGZuLAotCQkJIFBUMzJFX1JPT1RfTEVWRUwpOworCXIgPSBfX2RpcmVjdF9tYXAodmNwdSwgdiwgd3JpdGUsIGxhcmdlcGFnZSwgZ2ZuLCBwZm4pOwogCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKIAogCkBAIC0xNDAxLDYgKzE3NDksMzcgQEAKIAl2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSA9IF9fcGEodmNwdS0+YXJjaC5tbXUucGFlX3Jvb3QpOwogfQogCitzdGF0aWMgdm9pZCBtbXVfc3luY19yb290cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IGk7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CisKKwlpZiAoIVZBTElEX1BBR0UodmNwdS0+YXJjaC5tbXUucm9vdF9ocGEpKQorCQlyZXR1cm47CisJaWYgKHZjcHUtPmFyY2gubW11LnNoYWRvd19yb290X2xldmVsID09IFBUNjRfUk9PVF9MRVZFTCkgeworCQlocGFfdCByb290ID0gdmNwdS0+YXJjaC5tbXUucm9vdF9ocGE7CisJCXNwID0gcGFnZV9oZWFkZXIocm9vdCk7CisJCW1tdV9zeW5jX2NoaWxkcmVuKHZjcHUsIHNwKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJCWhwYV90IHJvb3QgPSB2Y3B1LT5hcmNoLm1tdS5wYWVfcm9vdFtpXTsKKworCQlpZiAocm9vdCkgeworCQkJcm9vdCAmPSBQVDY0X0JBU0VfQUREUl9NQVNLOworCQkJc3AgPSBwYWdlX2hlYWRlcihyb290KTsKKwkJCW1tdV9zeW5jX2NoaWxkcmVuKHZjcHUsIHNwKTsKKwkJfQorCX0KK30KKwordm9pZCBrdm1fbW11X3N5bmNfcm9vdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CisJbW11X3N5bmNfcm9vdHModmNwdSk7CisJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOworfQorCiBzdGF0aWMgZ3BhX3Qgbm9ucGFnaW5nX2d2YV90b19ncGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCB2YWRkcikKIHsKIAlyZXR1cm4gdmFkZHI7CkBAIC0xNDQyLDE1ICsxODIxLDEzIEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWlmIChpc19sYXJnZXBhZ2VfYmFja2VkKHZjcHUsIGdmbiAmIH4oS1ZNX1BBR0VTX1BFUl9IUEFHRS0xKSkpIHsKIAkJZ2ZuICY9IH4oS1ZNX1BBR0VTX1BFUl9IUEFHRS0xKTsKIAkJbGFyZ2VwYWdlID0gMTsKIAl9CiAJbW11X3NlcSA9IHZjcHUtPmt2bS0+bW11X25vdGlmaWVyX3NlcTsKLQkvKiBpbXBsaWNpdCBtYigpLCB3ZSdsbCByZWFkIGJlZm9yZSBQVCBsb2NrIGlzIHVubG9ja2VkICovCisJc21wX3JtYigpOwogCXBmbiA9IGdmbl90b19wZm4odmNwdS0+a3ZtLCBnZm4pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJaWYgKGlzX2Vycm9yX3BmbihwZm4pKSB7CiAJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOwogCQlyZXR1cm4gMTsKQEAgLTE0NjAsNyArMTgzNyw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAlrdm1fbW11X2ZyZWVfc29tZV9wYWdlcyh2Y3B1KTsKIAlyID0gX19kaXJlY3RfbWFwKHZjcHUsIGdwYSwgZXJyb3JfY29kZSAmIFBGRVJSX1dSSVRFX01BU0ssCi0JCQkgbGFyZ2VwYWdlLCBnZm4sIHBmbiwga3ZtX3g4Nl9vcHMtPmdldF90ZHBfbGV2ZWwoKSk7CisJCQkgbGFyZ2VwYWdlLCBnZm4sIHBmbik7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCiAJcmV0dXJuIHI7CkBAIC0xNDg1LDYgKzE4NjIsOCBAQAogCWNvbnRleHQtPmd2YV90b19ncGEgPSBub25wYWdpbmdfZ3ZhX3RvX2dwYTsKIAljb250ZXh0LT5mcmVlID0gbm9ucGFnaW5nX2ZyZWU7CiAJY29udGV4dC0+cHJlZmV0Y2hfcGFnZSA9IG5vbnBhZ2luZ19wcmVmZXRjaF9wYWdlOworCWNvbnRleHQtPnN5bmNfcGFnZSA9IG5vbnBhZ2luZ19zeW5jX3BhZ2U7CisJY29udGV4dC0+aW52bHBnID0gbm9ucGFnaW5nX2ludmxwZzsKIAljb250ZXh0LT5yb290X2xldmVsID0gMDsKIAljb250ZXh0LT5zaGFkb3dfcm9vdF9sZXZlbCA9IFBUMzJFX1JPT1RfTEVWRUw7CiAJY29udGV4dC0+cm9vdF9ocGEgPSBJTlZBTElEX1BBR0U7CkBAIC0xNTMyLDYgKzE5MTEsOCBAQAogCWNvbnRleHQtPnBhZ2VfZmF1bHQgPSBwYWdpbmc2NF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPmd2YV90b19ncGEgPSBwYWdpbmc2NF9ndmFfdG9fZ3BhOwogCWNvbnRleHQtPnByZWZldGNoX3BhZ2UgPSBwYWdpbmc2NF9wcmVmZXRjaF9wYWdlOworCWNvbnRleHQtPnN5bmNfcGFnZSA9IHBhZ2luZzY0X3N5bmNfcGFnZTsKKwljb250ZXh0LT5pbnZscGcgPSBwYWdpbmc2NF9pbnZscGc7CiAJY29udGV4dC0+ZnJlZSA9IHBhZ2luZ19mcmVlOwogCWNvbnRleHQtPnJvb3RfbGV2ZWwgPSBsZXZlbDsKIAljb250ZXh0LT5zaGFkb3dfcm9vdF9sZXZlbCA9IGxldmVsOwpAQCAtMTU1Myw2ICsxOTM0LDggQEAKIAljb250ZXh0LT5ndmFfdG9fZ3BhID0gcGFnaW5nMzJfZ3ZhX3RvX2dwYTsKIAljb250ZXh0LT5mcmVlID0gcGFnaW5nX2ZyZWU7CiAJY29udGV4dC0+cHJlZmV0Y2hfcGFnZSA9IHBhZ2luZzMyX3ByZWZldGNoX3BhZ2U7CisJY29udGV4dC0+c3luY19wYWdlID0gcGFnaW5nMzJfc3luY19wYWdlOworCWNvbnRleHQtPmludmxwZyA9IHBhZ2luZzMyX2ludmxwZzsKIAljb250ZXh0LT5yb290X2xldmVsID0gUFQzMl9ST09UX0xFVkVMOwogCWNvbnRleHQtPnNoYWRvd19yb290X2xldmVsID0gUFQzMkVfUk9PVF9MRVZFTDsKIAljb250ZXh0LT5yb290X2hwYSA9IElOVkFMSURfUEFHRTsKQEAgLTE1NzIsNiArMTk1NSw4IEBACiAJY29udGV4dC0+cGFnZV9mYXVsdCA9IHRkcF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPmZyZWUgPSBub25wYWdpbmdfZnJlZTsKIAljb250ZXh0LT5wcmVmZXRjaF9wYWdlID0gbm9ucGFnaW5nX3ByZWZldGNoX3BhZ2U7CisJY29udGV4dC0+c3luY19wYWdlID0gbm9ucGFnaW5nX3N5bmNfcGFnZTsKKwljb250ZXh0LT5pbnZscGcgPSBub25wYWdpbmdfaW52bHBnOwogCWNvbnRleHQtPnNoYWRvd19yb290X2xldmVsID0ga3ZtX3g4Nl9vcHMtPmdldF90ZHBfbGV2ZWwoKTsKIAljb250ZXh0LT5yb290X2hwYSA9IElOVkFMSURfUEFHRTsKIApAQCAtMTY0Myw2ICsyMDI4LDcgQEAKIAlzcGluX2xvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOwogCW1tdV9hbGxvY19yb290cyh2Y3B1KTsKKwltbXVfc3luY19yb290cyh2Y3B1KTsKIAlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJa3ZtX3g4Nl9vcHMtPnNldF9jcjModmNwdSwgdmNwdS0+YXJjaC5tbXUucm9vdF9ocGEpOwogCWt2bV9tbXVfZmx1c2hfdGxiKHZjcHUpOwpAQCAtMTc2MywxNSArMjE0OSwxMyBAQAogCQlyZXR1cm47CiAJZ2ZuID0gKGdwdGUgJiBQVDY0X0JBU0VfQUREUl9NQVNLKSA+PiBQQUdFX1NISUZUOwogCi0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWlmIChpc19sYXJnZV9wdGUoZ3B0ZSkgJiYgaXNfbGFyZ2VwYWdlX2JhY2tlZCh2Y3B1LCBnZm4pKSB7CiAJCWdmbiAmPSB+KEtWTV9QQUdFU19QRVJfSFBBR0UtMSk7CiAJCXZjcHUtPmFyY2gudXBkYXRlX3B0ZS5sYXJnZXBhZ2UgPSAxOwogCX0KIAl2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUubW11X3NlcSA9IHZjcHUtPmt2bS0+bW11X25vdGlmaWVyX3NlcTsKLQkvKiBpbXBsaWNpdCBtYigpLCB3ZSdsbCByZWFkIGJlZm9yZSBQVCBsb2NrIGlzIHVubG9ja2VkICovCisJc21wX3JtYigpOwogCXBmbiA9IGdmbl90b19wZm4odmNwdS0+a3ZtLCBnZm4pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKIAkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CkBAIC0xODMzLDcgKzIyMTcsNyBAQAogCWluZGV4ID0ga3ZtX3BhZ2VfdGFibGVfaGFzaGZuKGdmbik7CiAJYnVja2V0ID0gJnZjcHUtPmt2bS0+YXJjaC5tbXVfcGFnZV9oYXNoW2luZGV4XTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBub2RlLCBuLCBidWNrZXQsIGhhc2hfbGluaykgewotCQlpZiAoc3AtPmdmbiAhPSBnZm4gfHwgc3AtPnJvbGUubWV0YXBoeXNpY2FsKQorCQlpZiAoc3AtPmdmbiAhPSBnZm4gfHwgc3AtPnJvbGUubWV0YXBoeXNpY2FsIHx8IHNwLT5yb2xlLmludmFsaWQpCiAJCQljb250aW51ZTsKIAkJcHRlX3NpemUgPSBzcC0+cm9sZS5nbGV2ZWxzID09IFBUMzJfUk9PVF9MRVZFTCA/IDQgOiA4OwogCQltaXNhbGlnbmVkID0gKG9mZnNldCBeIChvZmZzZXQgKyBieXRlcyAtIDEpKSAmIH4ocHRlX3NpemUgLSAxKTsKQEAgLTE4NTEsNyArMjIzNSw4IEBACiAJCQkgKi8KIAkJCXBncHJpbnRrKCJtaXNhbGlnbmVkOiBncGEgJWxseCBieXRlcyAlZCByb2xlICV4XG4iLAogCQkJCSBncGEsIGJ5dGVzLCBzcC0+cm9sZS53b3JkKTsKLQkJCWt2bV9tbXVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCk7CisJCQlpZiAoa3ZtX21tdV96YXBfcGFnZSh2Y3B1LT5rdm0sIHNwKSkKKwkJCQluID0gYnVja2V0LT5maXJzdDsKIAkJCSsrdmNwdS0+a3ZtLT5zdGF0Lm1tdV9mbG9vZGVkOwogCQkJY29udGludWU7CiAJCX0KQEAgLTE5NjUsNiArMjM1MCwxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX21tdV9wYWdlX2ZhdWx0KTsKIAordm9pZCBrdm1fbW11X2ludmxwZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSkKK3sKKwlzcGluX2xvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOworCXZjcHUtPmFyY2gubW11LmludmxwZyh2Y3B1LCBndmEpOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKKwlrdm1fbW11X2ZsdXNoX3RsYih2Y3B1KTsKKwkrK3ZjcHUtPnN0YXQuaW52bHBnOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX21tdV9pbnZscGcpOworCiB2b2lkIGt2bV9lbmFibGVfdGRwKHZvaWQpCiB7CiAJdGRwX2VuYWJsZWQgPSB0cnVlOwpAQCAtMjA1MSw2ICsyNDQ2LDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAorCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgJmt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzLCBsaW5rKSB7CiAJCWludCBpOwogCQl1NjQgKnB0OwpAQCAtMjA2NCw2ICsyNDYwLDggQEAKIAkJCWlmIChwdFtpXSAmIFBUX1dSSVRBQkxFX01BU0spCiAJCQkJcHRbaV0gJj0gflBUX1dSSVRBQkxFX01BU0s7CiAJfQorCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOworCXNwaW5fdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIH0KIAogdm9pZCBrdm1fbW11X3phcF9hbGwoc3RydWN0IGt2bSAqa3ZtKQpAQCAtMjA3Miw3ICsyNDcwLDkgQEAKIAogCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwLCBub2RlLCAma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMsIGxpbmspCi0JCWt2bV9tbXVfemFwX3BhZ2Uoa3ZtLCBzcCk7CisJCWlmIChrdm1fbW11X3phcF9wYWdlKGt2bSwgc3ApKQorCQkJbm9kZSA9IGNvbnRhaW5lcl9vZihrdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcy5uZXh0LAorCQkJCQkgICAgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7CiAJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CkBAIC0yMjg3LDE4ICsyNjg3LDE4IEBACiAJCSAgZ3BhX3QgYWRkciwgdW5zaWduZWQgbG9uZyAqcmV0KQogewogCWludCByOwotCXN0cnVjdCBrdm1fcHZfbW11X29wX2J1ZmZlciBidWZmZXI7CisJc3RydWN0IGt2bV9wdl9tbXVfb3BfYnVmZmVyICpidWZmZXIgPSAmdmNwdS0+YXJjaC5tbXVfb3BfYnVmZmVyOwogCi0JYnVmZmVyLnB0ciA9IGJ1ZmZlci5idWY7Ci0JYnVmZmVyLmxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGJ5dGVzLCBzaXplb2YgYnVmZmVyLmJ1Zik7Ci0JYnVmZmVyLnByb2Nlc3NlZCA9IDA7CisJYnVmZmVyLT5wdHIgPSBidWZmZXItPmJ1ZjsKKwlidWZmZXItPmxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGJ5dGVzLCBzaXplb2YgYnVmZmVyLT5idWYpOworCWJ1ZmZlci0+cHJvY2Vzc2VkID0gMDsKIAotCXIgPSBrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGFkZHIsIGJ1ZmZlci5idWYsIGJ1ZmZlci5sZW4pOworCXIgPSBrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGFkZHIsIGJ1ZmZlci0+YnVmLCBidWZmZXItPmxlbik7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCi0Jd2hpbGUgKGJ1ZmZlci5sZW4pIHsKLQkJciA9IGt2bV9wdl9tbXVfb3Bfb25lKHZjcHUsICZidWZmZXIpOworCXdoaWxlIChidWZmZXItPmxlbikgeworCQlyID0ga3ZtX3B2X21tdV9vcF9vbmUodmNwdSwgYnVmZmVyKTsKIAkJaWYgKHIgPCAwKQogCQkJZ290byBvdXQ7CiAJCWlmIChyID09IDApCkBAIC0yMzA3LDcgKzI3MDcsNyBAQAogCiAJciA9IDE7CiBvdXQ6Ci0JKnJldCA9IGJ1ZmZlci5wcm9jZXNzZWQ7CisJKnJldCA9IGJ1ZmZlci0+cHJvY2Vzc2VkOwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vcGFnaW5nX3RtcGwuaCBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCmluZGV4IDRhODE0YmYuLjYxM2VjOWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCisrKyBiL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oCkBAIC0yNSwxMSArMjUsMTEgQEAKICNpZiBQVFRZUEUgPT0gNjQKIAkjZGVmaW5lIHB0X2VsZW1lbnRfdCB1NjQKIAkjZGVmaW5lIGd1ZXN0X3dhbGtlciBndWVzdF93YWxrZXI2NAorCSNkZWZpbmUgc2hhZG93X3dhbGtlciBzaGFkb3dfd2Fsa2VyNjQKIAkjZGVmaW5lIEZOQU1FKG5hbWUpIHBhZ2luZyMjNjRfIyNuYW1lCiAJI2RlZmluZSBQVF9CQVNFX0FERFJfTUFTSyBQVDY0X0JBU0VfQUREUl9NQVNLCiAJI2RlZmluZSBQVF9ESVJfQkFTRV9BRERSX01BU0sgUFQ2NF9ESVJfQkFTRV9BRERSX01BU0sKIAkjZGVmaW5lIFBUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQotCSNkZWZpbmUgU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQogCSNkZWZpbmUgUFRfTEVWRUxfTUFTSyhsZXZlbCkgUFQ2NF9MRVZFTF9NQVNLKGxldmVsKQogCSNkZWZpbmUgUFRfTEVWRUxfQklUUyBQVDY0X0xFVkVMX0JJVFMKIAkjaWZkZWYgQ09ORklHX1g4Nl82NApAQCAtNDIsMTEgKzQyLDExIEBACiAjZWxpZiBQVFRZUEUgPT0gMzIKIAkjZGVmaW5lIHB0X2VsZW1lbnRfdCB1MzIKIAkjZGVmaW5lIGd1ZXN0X3dhbGtlciBndWVzdF93YWxrZXIzMgorCSNkZWZpbmUgc2hhZG93X3dhbGtlciBzaGFkb3dfd2Fsa2VyMzIKIAkjZGVmaW5lIEZOQU1FKG5hbWUpIHBhZ2luZyMjMzJfIyNuYW1lCiAJI2RlZmluZSBQVF9CQVNFX0FERFJfTUFTSyBQVDMyX0JBU0VfQUREUl9NQVNLCiAJI2RlZmluZSBQVF9ESVJfQkFTRV9BRERSX01BU0sgUFQzMl9ESVJfQkFTRV9BRERSX01BU0sKIAkjZGVmaW5lIFBUX0lOREVYKGFkZHIsIGxldmVsKSBQVDMyX0lOREVYKGFkZHIsIGxldmVsKQotCSNkZWZpbmUgU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQogCSNkZWZpbmUgUFRfTEVWRUxfTUFTSyhsZXZlbCkgUFQzMl9MRVZFTF9NQVNLKGxldmVsKQogCSNkZWZpbmUgUFRfTEVWRUxfQklUUyBQVDMyX0xFVkVMX0JJVFMKIAkjZGVmaW5lIFBUX01BWF9GVUxMX0xFVkVMUyAyCkBAIC03Myw2ICs3MywxNyBAQAogCXUzMiBlcnJvcl9jb2RlOwogfTsKIAorc3RydWN0IHNoYWRvd193YWxrZXIgeworCXN0cnVjdCBrdm1fc2hhZG93X3dhbGsgd2Fsa2VyOworCXN0cnVjdCBndWVzdF93YWxrZXIgKmd1ZXN0X3dhbGtlcjsKKwlpbnQgdXNlcl9mYXVsdDsKKwlpbnQgd3JpdGVfZmF1bHQ7CisJaW50IGxhcmdlcGFnZTsKKwlpbnQgKnB0d3JpdGU7CisJcGZuX3QgcGZuOworCXU2NCAqc3B0ZXA7Cit9OworCiBzdGF0aWMgZ2ZuX3QgZ3B0ZV90b19nZm4ocHRfZWxlbWVudF90IGdwdGUpCiB7CiAJcmV0dXJuIChncHRlICYgUFRfQkFTRV9BRERSX01BU0spID4+IFBBR0VfU0hJRlQ7CkBAIC05MSwxNCArMTAyLDEwIEBACiAJcHRfZWxlbWVudF90ICp0YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlwYWdlID0gZ2ZuX3RvX3BhZ2Uoa3ZtLCB0YWJsZV9nZm4pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAl0YWJsZSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQogCXJldCA9IENNUFhDSEcoJnRhYmxlW2luZGV4XSwgb3JpZ19wdGUsIG5ld19wdGUpOwotCiAJa3VubWFwX2F0b21pYyh0YWJsZSwgS01fVVNFUjApOwogCiAJa3ZtX3JlbGVhc2VfcGFnZV9kaXJ0eShwYWdlKTsKQEAgLTI3NCw4NiArMjgxLDg5IEBACiAvKgogICogRmV0Y2ggYSBzaGFkb3cgcHRlIGZvciBhIHNwZWNpZmljIGxldmVsIGluIHRoZSBwYWdpbmcgaGllcmFyY2h5LgogICovCitzdGF0aWMgaW50IEZOQU1FKHNoYWRvd193YWxrX2VudHJ5KShzdHJ1Y3Qga3ZtX3NoYWRvd193YWxrICpfc3csCisJCQkJICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGFkZHIsCisJCQkJICAgIHU2NCAqc3B0ZXAsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc2hhZG93X3dhbGtlciAqc3cgPQorCQljb250YWluZXJfb2YoX3N3LCBzdHJ1Y3Qgc2hhZG93X3dhbGtlciwgd2Fsa2VyKTsKKwlzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyICpndyA9IHN3LT5ndWVzdF93YWxrZXI7CisJdW5zaWduZWQgYWNjZXNzID0gZ3ctPnB0X2FjY2VzczsKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzaGFkb3dfcGFnZTsKKwl1NjQgc3B0ZTsKKwlpbnQgbWV0YXBoeXNpY2FsOworCWdmbl90IHRhYmxlX2dmbjsKKwlpbnQgcjsKKwlwdF9lbGVtZW50X3QgY3Vycl9wdGU7CisKKwlpZiAobGV2ZWwgPT0gUFRfUEFHRV9UQUJMRV9MRVZFTAorCSAgICB8fCAoc3ctPmxhcmdlcGFnZSAmJiBsZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpKSB7CisJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzcHRlcCwgYWNjZXNzLCBndy0+cHRlX2FjY2VzcyAmIGFjY2VzcywKKwkJCSAgICAgc3ctPnVzZXJfZmF1bHQsIHN3LT53cml0ZV9mYXVsdCwKKwkJCSAgICAgZ3ctPnB0ZXNbZ3ctPmxldmVsLTFdICYgUFRfRElSVFlfTUFTSywKKwkJCSAgICAgc3ctPnB0d3JpdGUsIHN3LT5sYXJnZXBhZ2UsIGd3LT5nZm4sIHN3LT5wZm4sCisJCQkgICAgIGZhbHNlKTsKKwkJc3ctPnNwdGVwID0gc3B0ZXA7CisJCXJldHVybiAxOworCX0KKworCWlmIChpc19zaGFkb3dfcHJlc2VudF9wdGUoKnNwdGVwKSAmJiAhaXNfbGFyZ2VfcHRlKCpzcHRlcCkpCisJCXJldHVybiAwOworCisJaWYgKGlzX2xhcmdlX3B0ZSgqc3B0ZXApKSB7CisJCXNldF9zaGFkb3dfcHRlKHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyh2Y3B1LT5rdm0pOworCQlybWFwX3JlbW92ZSh2Y3B1LT5rdm0sIHNwdGVwKTsKKwl9CisKKwlpZiAobGV2ZWwgPT0gUFRfRElSRUNUT1JZX0xFVkVMICYmIGd3LT5sZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpIHsKKwkJbWV0YXBoeXNpY2FsID0gMTsKKwkJaWYgKCFpc19kaXJ0eV9wdGUoZ3ctPnB0ZXNbbGV2ZWwgLSAxXSkpCisJCQlhY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOworCQl0YWJsZV9nZm4gPSBncHRlX3RvX2dmbihndy0+cHRlc1tsZXZlbCAtIDFdKTsKKwl9IGVsc2UgeworCQltZXRhcGh5c2ljYWwgPSAwOworCQl0YWJsZV9nZm4gPSBndy0+dGFibGVfZ2ZuW2xldmVsIC0gMl07CisJfQorCXNoYWRvd19wYWdlID0ga3ZtX21tdV9nZXRfcGFnZSh2Y3B1LCB0YWJsZV9nZm4sIChndmFfdClhZGRyLCBsZXZlbC0xLAorCQkJCSAgICAgICBtZXRhcGh5c2ljYWwsIGFjY2Vzcywgc3B0ZXApOworCWlmICghbWV0YXBoeXNpY2FsKSB7CisJCXIgPSBrdm1fcmVhZF9ndWVzdF9hdG9taWModmNwdS0+a3ZtLCBndy0+cHRlX2dwYVtsZXZlbCAtIDJdLAorCQkJCQkgICZjdXJyX3B0ZSwgc2l6ZW9mKGN1cnJfcHRlKSk7CisJCWlmIChyIHx8IGN1cnJfcHRlICE9IGd3LT5wdGVzW2xldmVsIC0gMl0pIHsKKwkJCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihzdy0+cGZuKTsKKwkJCXN3LT5zcHRlcCA9IE5VTEw7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXNwdGUgPSBfX3BhKHNoYWRvd19wYWdlLT5zcHQpIHwgUFRfUFJFU0VOVF9NQVNLIHwgUFRfQUNDRVNTRURfTUFTSworCQl8IFBUX1dSSVRBQkxFX01BU0sgfCBQVF9VU0VSX01BU0s7CisJKnNwdGVwID0gc3B0ZTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHU2NCAqRk5BTUUoZmV0Y2gpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgYWRkciwKLQkJCSBzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyICp3YWxrZXIsCisJCQkgc3RydWN0IGd1ZXN0X3dhbGtlciAqZ3Vlc3Rfd2Fsa2VyLAogCQkJIGludCB1c2VyX2ZhdWx0LCBpbnQgd3JpdGVfZmF1bHQsIGludCBsYXJnZXBhZ2UsCiAJCQkgaW50ICpwdHdyaXRlLCBwZm5fdCBwZm4pCiB7Ci0JaHBhX3Qgc2hhZG93X2FkZHI7Ci0JaW50IGxldmVsOwotCXU2NCAqc2hhZG93X2VudDsKLQl1bnNpZ25lZCBhY2Nlc3MgPSB3YWxrZXItPnB0X2FjY2VzczsKKwlzdHJ1Y3Qgc2hhZG93X3dhbGtlciB3YWxrZXIgPSB7CisJCS53YWxrZXIgPSB7IC5lbnRyeSA9IEZOQU1FKHNoYWRvd193YWxrX2VudHJ5KSwgfSwKKwkJLmd1ZXN0X3dhbGtlciA9IGd1ZXN0X3dhbGtlciwKKwkJLnVzZXJfZmF1bHQgPSB1c2VyX2ZhdWx0LAorCQkud3JpdGVfZmF1bHQgPSB3cml0ZV9mYXVsdCwKKwkJLmxhcmdlcGFnZSA9IGxhcmdlcGFnZSwKKwkJLnB0d3JpdGUgPSBwdHdyaXRlLAorCQkucGZuID0gcGZuLAorCX07CiAKLQlpZiAoIWlzX3ByZXNlbnRfcHRlKHdhbGtlci0+cHRlc1t3YWxrZXItPmxldmVsIC0gMV0pKQorCWlmICghaXNfcHJlc2VudF9wdGUoZ3Vlc3Rfd2Fsa2VyLT5wdGVzW2d1ZXN0X3dhbGtlci0+bGV2ZWwgLSAxXSkpCiAJCXJldHVybiBOVUxMOwogCi0Jc2hhZG93X2FkZHIgPSB2Y3B1LT5hcmNoLm1tdS5yb290X2hwYTsKLQlsZXZlbCA9IHZjcHUtPmFyY2gubW11LnNoYWRvd19yb290X2xldmVsOwotCWlmIChsZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKSB7Ci0JCXNoYWRvd19hZGRyID0gdmNwdS0+YXJjaC5tbXUucGFlX3Jvb3RbKGFkZHIgPj4gMzApICYgM107Ci0JCXNoYWRvd19hZGRyICY9IFBUNjRfQkFTRV9BRERSX01BU0s7Ci0JCS0tbGV2ZWw7Ci0JfQorCXdhbGtfc2hhZG93KCZ3YWxrZXIud2Fsa2VyLCB2Y3B1LCBhZGRyKTsKIAotCWZvciAoOyA7IGxldmVsLS0pIHsKLQkJdTMyIGluZGV4ID0gU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKTsKLQkJc3RydWN0IGt2bV9tbXVfcGFnZSAqc2hhZG93X3BhZ2U7Ci0JCXU2NCBzaGFkb3dfcHRlOwotCQlpbnQgbWV0YXBoeXNpY2FsOwotCQlnZm5fdCB0YWJsZV9nZm47Ci0KLQkJc2hhZG93X2VudCA9ICgodTY0ICopX192YShzaGFkb3dfYWRkcikpICsgaW5kZXg7Ci0JCWlmIChsZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGxhcmdlcGFnZSAmJiBsZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpCi0JCQlicmVhazsKLQotCQlpZiAoaXNfc2hhZG93X3ByZXNlbnRfcHRlKCpzaGFkb3dfZW50KQotCQkgICAgJiYgIWlzX2xhcmdlX3B0ZSgqc2hhZG93X2VudCkpIHsKLQkJCXNoYWRvd19hZGRyID0gKnNoYWRvd19lbnQgJiBQVDY0X0JBU0VfQUREUl9NQVNLOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoaXNfbGFyZ2VfcHRlKCpzaGFkb3dfZW50KSkKLQkJCXJtYXBfcmVtb3ZlKHZjcHUtPmt2bSwgc2hhZG93X2VudCk7Ci0KLQkJaWYgKGxldmVsIC0gMSA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMCi0JCSAgICAmJiB3YWxrZXItPmxldmVsID09IFBUX0RJUkVDVE9SWV9MRVZFTCkgewotCQkJbWV0YXBoeXNpY2FsID0gMTsKLQkJCWlmICghaXNfZGlydHlfcHRlKHdhbGtlci0+cHRlc1tsZXZlbCAtIDFdKSkKLQkJCQlhY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOwotCQkJdGFibGVfZ2ZuID0gZ3B0ZV90b19nZm4od2Fsa2VyLT5wdGVzW2xldmVsIC0gMV0pOwotCQl9IGVsc2UgewotCQkJbWV0YXBoeXNpY2FsID0gMDsKLQkJCXRhYmxlX2dmbiA9IHdhbGtlci0+dGFibGVfZ2ZuW2xldmVsIC0gMl07Ci0JCX0KLQkJc2hhZG93X3BhZ2UgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIHRhYmxlX2dmbiwgYWRkciwgbGV2ZWwtMSwKLQkJCQkJICAgICAgIG1ldGFwaHlzaWNhbCwgYWNjZXNzLAotCQkJCQkgICAgICAgc2hhZG93X2VudCk7Ci0JCWlmICghbWV0YXBoeXNpY2FsKSB7Ci0JCQlpbnQgcjsKLQkJCXB0X2VsZW1lbnRfdCBjdXJyX3B0ZTsKLQkJCXIgPSBrdm1fcmVhZF9ndWVzdF9hdG9taWModmNwdS0+a3ZtLAotCQkJCQkJICB3YWxrZXItPnB0ZV9ncGFbbGV2ZWwgLSAyXSwKLQkJCQkJCSAgJmN1cnJfcHRlLCBzaXplb2YoY3Vycl9wdGUpKTsKLQkJCWlmIChyIHx8IGN1cnJfcHRlICE9IHdhbGtlci0+cHRlc1tsZXZlbCAtIDJdKSB7Ci0JCQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJc2hhZG93X2FkZHIgPSBfX3BhKHNoYWRvd19wYWdlLT5zcHQpOwotCQlzaGFkb3dfcHRlID0gc2hhZG93X2FkZHIgfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9BQ0NFU1NFRF9NQVNLCi0JCQl8IFBUX1dSSVRBQkxFX01BU0sgfCBQVF9VU0VSX01BU0s7Ci0JCXNldF9zaGFkb3dfcHRlKHNoYWRvd19lbnQsIHNoYWRvd19wdGUpOwotCX0KLQotCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzaGFkb3dfZW50LCBhY2Nlc3MsIHdhbGtlci0+cHRlX2FjY2VzcyAmIGFjY2VzcywKLQkJICAgICB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwKLQkJICAgICB3YWxrZXItPnB0ZXNbd2Fsa2VyLT5sZXZlbC0xXSAmIFBUX0RJUlRZX01BU0ssCi0JCSAgICAgcHR3cml0ZSwgbGFyZ2VwYWdlLCB3YWxrZXItPmdmbiwgcGZuLCBmYWxzZSk7Ci0KLQlyZXR1cm4gc2hhZG93X2VudDsKKwlyZXR1cm4gd2Fsa2VyLnNwdGVwOwogfQogCiAvKgpAQCAtNDA3LDcgKzQxNyw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlpZiAod2Fsa2VyLmxldmVsID09IFBUX0RJUkVDVE9SWV9MRVZFTCkgewogCQlnZm5fdCBsYXJnZV9nZm47CiAJCWxhcmdlX2dmbiA9IHdhbGtlci5nZm4gJiB+KEtWTV9QQUdFU19QRVJfSFBBR0UtMSk7CkBAIC00MTcsOSArNDI2LDggQEAKIAkJfQogCX0KIAltbXVfc2VxID0gdmNwdS0+a3ZtLT5tbXVfbm90aWZpZXJfc2VxOwotCS8qIGltcGxpY2l0IG1iKCksIHdlJ2xsIHJlYWQgYmVmb3JlIFBUIGxvY2sgaXMgdW5sb2NrZWQgKi8KKwlzbXBfcm1iKCk7CiAJcGZuID0gZ2ZuX3RvX3Bmbih2Y3B1LT5rdm0sIHdhbGtlci5nZm4pOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAkvKiBtbWlvICovCiAJaWYgKGlzX2Vycm9yX3BmbihwZm4pKSB7CkBAIC00NTMsNiArNDYxLDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgRk5BTUUoc2hhZG93X2ludmxwZ19lbnRyeSkoc3RydWN0IGt2bV9zaGFkb3dfd2FsayAqX3N3LAorCQkJCSAgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGFkZHIsCisJCQkJICAgICAgdTY0ICpzcHRlcCwgaW50IGxldmVsKQoreworCisJaWYgKGxldmVsID09IFBUX1BBR0VfVEFCTEVfTEVWRUwpIHsKKwkJaWYgKGlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApKQorCQkJcm1hcF9yZW1vdmUodmNwdS0+a3ZtLCBzcHRlcCk7CisJCXNldF9zaGFkb3dfcHRlKHNwdGVwLCBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZSgqc3B0ZXApKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRk5BTUUoaW52bHBnKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSkKK3sKKwlzdHJ1Y3Qgc2hhZG93X3dhbGtlciB3YWxrZXIgPSB7CisJCS53YWxrZXIgPSB7IC5lbnRyeSA9IEZOQU1FKHNoYWRvd19pbnZscGdfZW50cnkpLCB9LAorCX07CisKKwl3YWxrX3NoYWRvdygmd2Fsa2VyLndhbGtlciwgdmNwdSwgZ3ZhKTsKK30KKwogc3RhdGljIGdwYV90IEZOQU1FKGd2YV90b19ncGEpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdmFkZHIpCiB7CiAJc3RydWN0IGd1ZXN0X3dhbGtlciB3YWxrZXI7CkBAIC00OTksMTIgKzUzMiw2NiBAQAogCX0KIH0KIAorLyoKKyAqIFVzaW5nIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZnJvbSBzcC0+Z2ZucyBpcyBzYWZlIGJlY2F1c2U6CisgKiAtIFRoZSBzcHRlIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RydWN0IHBhZ2UsIHNvIHRoZSBwZm4gZm9yIGEgZ2l2ZW4gZ2ZuCisgKiAgIGNhbid0IGNoYW5nZSB1bmxlc3MgYWxsIHNwdGVzIHBvaW50aW5nIHRvIGl0IGFyZSBudWtlZCBmaXJzdC4KKyAqIC0gQWxpYXMgY2hhbmdlcyB6YXAgdGhlIGVudGlyZSBzaGFkb3cgY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQgRk5BTUUoc3luY19wYWdlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQoreworCWludCBpLCBvZmZzZXQsIG5yX3ByZXNlbnQ7CisKKwlvZmZzZXQgPSBucl9wcmVzZW50ID0gMDsKKworCWlmIChQVFRZUEUgPT0gMzIpCisJCW9mZnNldCA9IHNwLT5yb2xlLnF1YWRyYW50IDw8IFBUNjRfTEVWRUxfQklUUzsKKworCWZvciAoaSA9IDA7IGkgPCBQVDY0X0VOVF9QRVJfUEFHRTsgaSsrKSB7CisJCXVuc2lnbmVkIHB0ZV9hY2Nlc3M7CisJCXB0X2VsZW1lbnRfdCBncHRlOworCQlncGFfdCBwdGVfZ3BhOworCQlnZm5fdCBnZm4gPSBzcC0+Z2Zuc1tpXTsKKworCQlpZiAoIWlzX3NoYWRvd19wcmVzZW50X3B0ZShzcC0+c3B0W2ldKSkKKwkJCWNvbnRpbnVlOworCisJCXB0ZV9ncGEgPSBnZm5fdG9fZ3BhKHNwLT5nZm4pOworCQlwdGVfZ3BhICs9IChpK29mZnNldCkgKiBzaXplb2YocHRfZWxlbWVudF90KTsKKworCQlpZiAoa3ZtX3JlYWRfZ3Vlc3RfYXRvbWljKHZjcHUtPmt2bSwgcHRlX2dwYSwgJmdwdGUsCisJCQkJCSAgc2l6ZW9mKHB0X2VsZW1lbnRfdCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGdwdGVfdG9fZ2ZuKGdwdGUpICE9IGdmbiB8fCAhaXNfcHJlc2VudF9wdGUoZ3B0ZSkgfHwKKwkJICAgICEoZ3B0ZSAmIFBUX0FDQ0VTU0VEX01BU0spKSB7CisJCQl1NjQgbm9ucHJlc2VudDsKKworCQkJcm1hcF9yZW1vdmUodmNwdS0+a3ZtLCAmc3AtPnNwdFtpXSk7CisJCQlpZiAoaXNfcHJlc2VudF9wdGUoZ3B0ZSkpCisJCQkJbm9ucHJlc2VudCA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOworCQkJZWxzZQorCQkJCW5vbnByZXNlbnQgPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOworCQkJc2V0X3NoYWRvd19wdGUoJnNwLT5zcHRbaV0sIG5vbnByZXNlbnQpOworCQkJY29udGludWU7CisJCX0KKworCQlucl9wcmVzZW50Kys7CisJCXB0ZV9hY2Nlc3MgPSBzcC0+cm9sZS5hY2Nlc3MgJiBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgZ3B0ZSk7CisJCXNldF9zcHRlKHZjcHUsICZzcC0+c3B0W2ldLCBwdGVfYWNjZXNzLCAwLCAwLAorCQkJIGlzX2RpcnR5X3B0ZShncHRlKSwgMCwgZ2ZuLAorCQkJIHNwdGVfdG9fcGZuKHNwLT5zcHRbaV0pLCB0cnVlLCBmYWxzZSk7CisJfQorCisJcmV0dXJuICFucl9wcmVzZW50OworfQorCiAjdW5kZWYgcHRfZWxlbWVudF90CiAjdW5kZWYgZ3Vlc3Rfd2Fsa2VyCisjdW5kZWYgc2hhZG93X3dhbGtlcgogI3VuZGVmIEZOQU1FCiAjdW5kZWYgUFRfQkFTRV9BRERSX01BU0sKICN1bmRlZiBQVF9JTkRFWAotI3VuZGVmIFNIQURPV19QVF9JTkRFWAogI3VuZGVmIFBUX0xFVkVMX01BU0sKICN1bmRlZiBQVF9ESVJfQkFTRV9BRERSX01BU0sKICN1bmRlZiBQVF9MRVZFTF9CSVRTCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vc3ZtLmMgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKaW5kZXggZTJlZTI2NC4uOWM0Y2U2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3N2bS5jCisrKyBiL2FyY2gveDg2L2t2bS9zdm0uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgImt2bV9zdm0uaCIKICNpbmNsdWRlICJpcnEuaCIKICNpbmNsdWRlICJtbXUuaCIKKyNpbmNsdWRlICJrdm1fY2FjaGVfcmVncy5oIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNSwxMCArMzYsNiBAQAogI2RlZmluZSBJT1BNX0FMTE9DX09SREVSIDIKICNkZWZpbmUgTVNSUE1fQUxMT0NfT1JERVIgMQogCi0jZGVmaW5lIERCX1ZFQ1RPUiAxCi0jZGVmaW5lIFVEX1ZFQ1RPUiA2Ci0jZGVmaW5lIEdQX1ZFQ1RPUiAxMwotCiAjZGVmaW5lIERSN19HRF9NQVNLICgxIDw8IDEzKQogI2RlZmluZSBEUjZfQkRfTUFTSyAoMSA8PCAxMykKIApAQCAtNDcsNyArNDQsNyBAQAogCiAjZGVmaW5lIFNWTV9GRUFUVVJFX05QVCAgKDEgPDwgMCkKICNkZWZpbmUgU1ZNX0ZFQVRVUkVfTEJSViAoMSA8PCAxKQotI2RlZmluZSBTVk1fREVBVFVSRV9TVk1MICgxIDw8IDIpCisjZGVmaW5lIFNWTV9GRUFUVVJFX1NWTUwgKDEgPDwgMikKIAogI2RlZmluZSBERUJVR0NUTF9SRVNFUlZFRF9CSVRTICh+KDB4M2ZVTEwpKQogCkBAIC02Miw2ICs1OSw3IEBACiBtb2R1bGVfcGFyYW0obnB0LCBpbnQsIFNfSVJVR08pOwogCiBzdGF0aWMgdm9pZCBrdm1fcmVwdXRfaXJxKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKTsKK3N0YXRpYyB2b2lkIHN2bV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdmNwdV9zdm0gKnRvX3N2bShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC0yMzUsMTMgKzIzMywxMSBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5PUFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQotCWlmIChzdm0tPm5leHRfcmlwIC0gc3ZtLT52bWNiLT5zYXZlLnJpcCA+IE1BWF9JTlNUX1NJWkUpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGlwIDB4JWxseCBuZXh0IDB4JWxseFxuIiwKLQkJICAgICAgIF9fZnVuY19fLAotCQkgICAgICAgc3ZtLT52bWNiLT5zYXZlLnJpcCwKLQkJICAgICAgIHN2bS0+bmV4dF9yaXApOworCWlmIChzdm0tPm5leHRfcmlwIC0ga3ZtX3JpcF9yZWFkKHZjcHUpID4gTUFYX0lOU1RfU0laRSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaXAgMHglbHggbmV4dCAweCVsbHhcbiIsCisJCSAgICAgICBfX2Z1bmNfXywga3ZtX3JpcF9yZWFkKHZjcHUpLCBzdm0tPm5leHRfcmlwKTsKIAotCXZjcHUtPmFyY2gucmlwID0gc3ZtLT52bWNiLT5zYXZlLnJpcCA9IHN2bS0+bmV4dF9yaXA7CisJa3ZtX3JpcF93cml0ZSh2Y3B1LCBzdm0tPm5leHRfcmlwKTsKIAlzdm0tPnZtY2ItPmNvbnRyb2wuaW50X3N0YXRlICY9IH5TVk1fSU5URVJSVVBUX1NIQURPV19NQVNLOwogCiAJdmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gPSAxOwpAQCAtNTI5LDYgKzUyNSw3IEBACiAJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0NQVUlEKSB8CiAJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0lOVkQpIHwKIAkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfSExUKSB8CisJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0lOVkxQRykgfAogCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JTlZMUEdBKSB8CiAJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0lPSU9fUFJPVCkgfAogCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9NU1JfUFJPVCkgfApAQCAtNTgwLDYgKzU3Nyw3IEBACiAJc2F2ZS0+ZHI3ID0gMHg0MDA7CiAJc2F2ZS0+cmZsYWdzID0gMjsKIAlzYXZlLT5yaXAgPSAweDAwMDBmZmYwOworCXN2bS0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JJUF0gPSBzYXZlLT5yaXA7CiAKIAkvKgogCSAqIGNyMCB2YWwgb24gY3B1IGluaXQgc2hvdWxkIGJlIDB4NjAwMDAwMTAsIHdlIGVuYWJsZSBjcHUKQEAgLTU5Miw3ICs1OTAsOCBAQAogCWlmIChucHRfZW5hYmxlZCkgewogCQkvKiBTZXR1cCBWTUNCIGZvciBOZXN0ZWQgUGFnaW5nICovCiAJCWNvbnRyb2wtPm5lc3RlZF9jdGwgPSAxOwotCQljb250cm9sLT5pbnRlcmNlcHQgJj0gfigxVUxMIDw8IElOVEVSQ0VQVF9UQVNLX1NXSVRDSCk7CisJCWNvbnRyb2wtPmludGVyY2VwdCAmPSB+KCgxVUxMIDw8IElOVEVSQ0VQVF9UQVNLX1NXSVRDSCkgfAorCQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfSU5WTFBHKSk7CiAJCWNvbnRyb2wtPmludGVyY2VwdF9leGNlcHRpb25zICY9IH4oMSA8PCBQRl9WRUNUT1IpOwogCQljb250cm9sLT5pbnRlcmNlcHRfY3JfcmVhZCAmPSB+KElOVEVSQ0VQVF9DUjBfTUFTS3wKIAkJCQkJCUlOVEVSQ0VQVF9DUjNfTUFTSyk7CkBAIC02MTQsMTAgKzYxMywxMiBAQAogCWluaXRfdm1jYihzdm0pOwogCiAJaWYgKHZjcHUtPnZjcHVfaWQgIT0gMCkgewotCQlzdm0tPnZtY2ItPnNhdmUucmlwID0gMDsKKwkJa3ZtX3JpcF93cml0ZSh2Y3B1LCAwKTsKIAkJc3ZtLT52bWNiLT5zYXZlLmNzLmJhc2UgPSBzdm0tPnZjcHUuYXJjaC5zaXBpX3ZlY3RvciA8PCAxMjsKIAkJc3ZtLT52bWNiLT5zYXZlLmNzLnNlbGVjdG9yID0gc3ZtLT52Y3B1LmFyY2guc2lwaV92ZWN0b3IgPDwgODsKIAl9CisJdmNwdS0+YXJjaC5yZWdzX2F2YWlsID0gfjA7CisJdmNwdS0+YXJjaC5yZWdzX2RpcnR5ID0gfjA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcyMCwyMyArNzIxLDYgQEAKIAlyZHRzY2xsKHZjcHUtPmFyY2guaG9zdF90c2MpOwogfQogCi1zdGF0aWMgdm9pZCBzdm1fY2FjaGVfcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7Ci0KLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSBzdm0tPnZtY2ItPnNhdmUucmF4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHN2bS0+dm1jYi0+c2F2ZS5yc3A7Ci0JdmNwdS0+YXJjaC5yaXAgPSBzdm0tPnZtY2ItPnNhdmUucmlwOwotfQotCi1zdGF0aWMgdm9pZCBzdm1fZGVjYWNoZV9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKLQlzdm0tPnZtY2ItPnNhdmUucmF4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXN2bS0+dm1jYi0+c2F2ZS5yc3AgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF07Ci0Jc3ZtLT52bWNiLT5zYXZlLnJpcCA9IHZjcHUtPmFyY2gucmlwOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdm1fZ2V0X3JmbGFncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHRvX3N2bSh2Y3B1KS0+dm1jYi0+c2F2ZS5yZmxhZ3M7CkBAIC04NzgsNiArODYyLDEwIEBACiBzdGF0aWMgdm9pZCBzdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQogewogCXVuc2lnbmVkIGxvbmcgaG9zdF9jcjRfbWNlID0gcmVhZF9jcjQoKSAmIFg4Nl9DUjRfTUNFOworCXVuc2lnbmVkIGxvbmcgb2xkX2NyNCA9IHRvX3N2bSh2Y3B1KS0+dm1jYi0+c2F2ZS5jcjQ7CisKKwlpZiAobnB0X2VuYWJsZWQgJiYgKChvbGRfY3I0IF4gY3I0KSAmIFg4Nl9DUjRfUEdFKSkKKwkJZm9yY2VfbmV3X2FzaWQodmNwdSk7CiAKIAl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKIAlpZiAoIW5wdF9lbmFibGVkKQpAQCAtMTAyNyw4ICsxMDE1LDE1IEBACiAJCUtWTVRSQUNFXzNEKFREUF9GQVVMVCwgJnN2bS0+dmNwdSwgZXJyb3JfY29kZSwKIAkJCSAgICAodTMyKWZhdWx0X2FkZHJlc3MsICh1MzIpKGZhdWx0X2FkZHJlc3MgPj4gMzIpLAogCQkJICAgIGhhbmRsZXIpOworCS8qCisJICogRklYTUU6IFRpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGhlcmUsIGJ1dCB0aGVyZSBpcyBhIGZsdXNoCisJICogbWlzc2luZyBpbiB0aGUgTU1VIGNvZGUuIFVudGlsIHdlIGZpbmQgdGhpcyBidWcsIGZsdXNoIHRoZQorCSAqIGNvbXBsZXRlIFRMQiBoZXJlIG9uIGFuIE5QRgorCSAqLworCWlmIChucHRfZW5hYmxlZCkKKwkJc3ZtX2ZsdXNoX3RsYigmc3ZtLT52Y3B1KTsKIAotCWlmIChldmVudF9pbmplY3Rpb24pCisJaWYgKCFucHRfZW5hYmxlZCAmJiBldmVudF9pbmplY3Rpb24pCiAJCWt2bV9tbXVfdW5wcm90ZWN0X3BhZ2VfdmlydCgmc3ZtLT52Y3B1LCBmYXVsdF9hZGRyZXNzKTsKIAlyZXR1cm4ga3ZtX21tdV9wYWdlX2ZhdWx0KCZzdm0tPnZjcHUsIGZhdWx0X2FkZHJlc3MsIGVycm9yX2NvZGUpOwogfQpAQCAtMTEyNywxNCArMTEyMiwxNCBAQAogCiBzdGF0aWMgaW50IGhhbHRfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKLQlzdm0tPm5leHRfcmlwID0gc3ZtLT52bWNiLT5zYXZlLnJpcCArIDE7CisJc3ZtLT5uZXh0X3JpcCA9IGt2bV9yaXBfcmVhZCgmc3ZtLT52Y3B1KSArIDE7CiAJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1KTsKIAlyZXR1cm4ga3ZtX2VtdWxhdGVfaGFsdCgmc3ZtLT52Y3B1KTsKIH0KIAogc3RhdGljIGludCB2bW1jYWxsX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7Ci0Jc3ZtLT5uZXh0X3JpcCA9IHN2bS0+dm1jYi0+c2F2ZS5yaXAgKyAzOworCXN2bS0+bmV4dF9yaXAgPSBrdm1fcmlwX3JlYWQoJnN2bS0+dmNwdSkgKyAzOwogCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSk7CiAJa3ZtX2VtdWxhdGVfaHlwZXJjYWxsKCZzdm0tPnZjcHUpOwogCXJldHVybiAxOwpAQCAtMTE2NiwxMSArMTE2MSwxOCBAQAogCiBzdGF0aWMgaW50IGNwdWlkX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7Ci0Jc3ZtLT5uZXh0X3JpcCA9IHN2bS0+dm1jYi0+c2F2ZS5yaXAgKyAyOworCXN2bS0+bmV4dF9yaXAgPSBrdm1fcmlwX3JlYWQoJnN2bS0+dmNwdSkgKyAyOwogCWt2bV9lbXVsYXRlX2NwdWlkKCZzdm0tPnZjcHUpOwogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IGludmxwZ19pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0sIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCWlmIChlbXVsYXRlX2luc3RydWN0aW9uKCZzdm0tPnZjcHUsIGt2bV9ydW4sIDAsIDAsIDApICE9IEVNVUxBVEVfRE9ORSkKKwkJcHJfdW5pbXBsKCZzdm0tPnZjcHUsICIlczogZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0sCiAJCQkJICAgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CkBAIC0xMjYxLDkgKzEyNjMsOSBAQAogCQlLVk1UUkFDRV8zRChNU1JfUkVBRCwgJnN2bS0+dmNwdSwgZWN4LCAodTMyKWRhdGEsCiAJCQkgICAgKHUzMikoZGF0YSA+PiAzMiksIGhhbmRsZXIpOwogCi0JCXN2bS0+dm1jYi0+c2F2ZS5yYXggPSBkYXRhICYgMHhmZmZmZmZmZjsKKwkJc3ZtLT52Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSA9IGRhdGEgJiAweGZmZmZmZmZmOwogCQlzdm0tPnZjcHUuYXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdID0gZGF0YSA+PiAzMjsKLQkJc3ZtLT5uZXh0X3JpcCA9IHN2bS0+dm1jYi0+c2F2ZS5yaXAgKyAyOworCQlzdm0tPm5leHRfcmlwID0ga3ZtX3JpcF9yZWFkKCZzdm0tPnZjcHUpICsgMjsKIAkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1KTsKIAl9CiAJcmV0dXJuIDE7CkBAIC0xMzQ3LDEzICsxMzQ5LDEzIEBACiBzdGF0aWMgaW50IHdybXNyX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CiAJdTMyIGVjeCA9IHN2bS0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JdTY0IGRhdGEgPSAoc3ZtLT52bWNiLT5zYXZlLnJheCAmIC0xdSkKKwl1NjQgZGF0YSA9IChzdm0tPnZjcHUuYXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdICYgLTF1KQogCQl8ICgodTY0KShzdm0tPnZjcHUuYXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdICYgLTF1KSA8PCAzMik7CiAKIAlLVk1UUkFDRV8zRChNU1JfV1JJVEUsICZzdm0tPnZjcHUsIGVjeCwgKHUzMilkYXRhLCAodTMyKShkYXRhID4+IDMyKSwKIAkJICAgIGhhbmRsZXIpOwogCi0Jc3ZtLT5uZXh0X3JpcCA9IHN2bS0+dm1jYi0+c2F2ZS5yaXAgKyAyOworCXN2bS0+bmV4dF9yaXAgPSBrdm1fcmlwX3JlYWQoJnN2bS0+dmNwdSkgKyAyOwogCWlmIChzdm1fc2V0X21zcigmc3ZtLT52Y3B1LCBlY3gsIGRhdGEpKQogCQlrdm1faW5qZWN0X2dwKCZzdm0tPnZjcHUsIDApOwogCWVsc2UKQEAgLTE0MjQsNyArMTQyNiw3IEBACiAJW1NWTV9FWElUX0NQVUlEXQkJCT0gY3B1aWRfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9JTlZEXSAgICAgICAgICAgICAgICAgICAgICAgICA9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9ITFRdCQkJCT0gaGFsdF9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX0lOVkxQR10JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9JTlZMUEddCQkJPSBpbnZscGdfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9JTlZMUEdBXQkJCT0gaW52YWxpZF9vcF9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX0lPSU9dIAkJICAJPSBpb19pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX01TUl0JCQkJPSBtc3JfaW50ZXJjZXB0aW9uLApAQCAtMTUyNiw2ICsxNTI4LDcgQEAKIAogCUtWTVRSQUNFXzFEKElOSl9WSVJRLCAmc3ZtLT52Y3B1LCAodTMyKWlycSwgaGFuZGxlcik7CiAKKwkrK3N2bS0+dmNwdS5zdGF0LmlycV9pbmplY3Rpb25zOwogCWNvbnRyb2wgPSAmc3ZtLT52bWNiLT5jb250cm9sOwogCWNvbnRyb2wtPmludF92ZWN0b3IgPSBpcnE7CiAJY29udHJvbC0+aW50X2N0bCAmPSB+Vl9JTlRSX1BSSU9fTUFTSzsKQEAgLTE3MDQsNiArMTcwNywxMiBAQAogCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfY3RsIHw9IGNyOCAmIFZfVFBSX01BU0s7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIFIgInIiCisjZWxzZQorI2RlZmluZSBSICJlIgorI2VuZGlmCisKIHN0YXRpYyB2b2lkIHN2bV92Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwpAQCAtMTcxMSw2ICsxNzIwLDEwIEBACiAJdTE2IGdzX3NlbGVjdG9yOwogCXUxNiBsZHRfc2VsZWN0b3I7CiAKKwlzdm0tPnZtY2ItPnNhdmUucmF4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXN2bS0+dm1jYi0+c2F2ZS5yc3AgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF07CisJc3ZtLT52bWNiLT5zYXZlLnJpcCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUklQXTsKKwogCXByZV9zdm1fcnVuKHN2bSk7CiAKIAlzeW5jX2xhcGljX3RvX2NyOCh2Y3B1KTsKQEAgLTE3MzgsMTkgKzE3NTEsMTQgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlhc20gdm9sYXRpbGUgKAorCQkicHVzaCAlJSJSImJwOyBcblx0IgorCQkibW92ICVjW3JieF0oJVtzdm1dKSwgJSUiUiJieCBcblx0IgorCQkibW92ICVjW3JjeF0oJVtzdm1dKSwgJSUiUiJjeCBcblx0IgorCQkibW92ICVjW3JkeF0oJVtzdm1dKSwgJSUiUiJkeCBcblx0IgorCQkibW92ICVjW3JzaV0oJVtzdm1dKSwgJSUiUiJzaSBcblx0IgorCQkibW92ICVjW3JkaV0oJVtzdm1dKSwgJSUiUiJkaSBcblx0IgorCQkibW92ICVjW3JicF0oJVtzdm1dKSwgJSUiUiJicCBcblx0IgogI2lmZGVmIENPTkZJR19YODZfNjQKLQkJInB1c2ggJSVyYnA7IFxuXHQiCi0jZWxzZQotCQkicHVzaCAlJWVicDsgXG5cdCIKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCQkibW92ICVjW3JieF0oJVtzdm1dKSwgJSVyYnggXG5cdCIKLQkJIm1vdiAlY1tyY3hdKCVbc3ZtXSksICUlcmN4IFxuXHQiCi0JCSJtb3YgJWNbcmR4XSglW3N2bV0pLCAlJXJkeCBcblx0IgotCQkibW92ICVjW3JzaV0oJVtzdm1dKSwgJSVyc2kgXG5cdCIKLQkJIm1vdiAlY1tyZGldKCVbc3ZtXSksICUlcmRpIFxuXHQiCi0JCSJtb3YgJWNbcmJwXSglW3N2bV0pLCAlJXJicCBcblx0IgogCQkibW92ICVjW3I4XSglW3N2bV0pLCAgJSVyOCAgXG5cdCIKIAkJIm1vdiAlY1tyOV0oJVtzdm1dKSwgICUlcjkgIFxuXHQiCiAJCSJtb3YgJWNbcjEwXSglW3N2bV0pLCAlJXIxMCBcblx0IgpAQCAtMTc1OSw0MSArMTc2NywyNCBAQAogCQkibW92ICVjW3IxM10oJVtzdm1dKSwgJSVyMTMgXG5cdCIKIAkJIm1vdiAlY1tyMTRdKCVbc3ZtXSksICUlcjE0IFxuXHQiCiAJCSJtb3YgJWNbcjE1XSglW3N2bV0pLCAlJXIxNSBcblx0IgotI2Vsc2UKLQkJIm1vdiAlY1tyYnhdKCVbc3ZtXSksICUlZWJ4IFxuXHQiCi0JCSJtb3YgJWNbcmN4XSglW3N2bV0pLCAlJWVjeCBcblx0IgotCQkibW92ICVjW3JkeF0oJVtzdm1dKSwgJSVlZHggXG5cdCIKLQkJIm1vdiAlY1tyc2ldKCVbc3ZtXSksICUlZXNpIFxuXHQiCi0JCSJtb3YgJWNbcmRpXSglW3N2bV0pLCAlJWVkaSBcblx0IgotCQkibW92ICVjW3JicF0oJVtzdm1dKSwgJSVlYnAgXG5cdCIKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAogCQkvKiBFbnRlciBndWVzdCBtb2RlICovCi0JCSJwdXNoICUlcmF4IFxuXHQiCi0JCSJtb3YgJWNbdm1jYl0oJVtzdm1dKSwgJSVyYXggXG5cdCIKKwkJInB1c2ggJSUiUiJheCBcblx0IgorCQkibW92ICVjW3ZtY2JdKCVbc3ZtXSksICUlIlIiYXggXG5cdCIKIAkJX19leChTVk1fVk1MT0FEKSAiXG5cdCIKIAkJX19leChTVk1fVk1SVU4pICJcblx0IgogCQlfX2V4KFNWTV9WTVNBVkUpICJcblx0IgotCQkicG9wICUlcmF4IFxuXHQiCi0jZWxzZQotCQkvKiBFbnRlciBndWVzdCBtb2RlICovCi0JCSJwdXNoICUlZWF4IFxuXHQiCi0JCSJtb3YgJWNbdm1jYl0oJVtzdm1dKSwgJSVlYXggXG5cdCIKLQkJX19leChTVk1fVk1MT0FEKSAiXG5cdCIKLQkJX19leChTVk1fVk1SVU4pICJcblx0IgotCQlfX2V4KFNWTV9WTVNBVkUpICJcblx0IgotCQkicG9wICUlZWF4IFxuXHQiCi0jZW5kaWYKKwkJInBvcCAlJSJSImF4IFxuXHQiCiAKIAkJLyogU2F2ZSBndWVzdCByZWdpc3RlcnMsIGxvYWQgaG9zdCByZWdpc3RlcnMgKi8KKwkJIm1vdiAlJSJSImJ4LCAlY1tyYnhdKCVbc3ZtXSkgXG5cdCIKKwkJIm1vdiAlJSJSImN4LCAlY1tyY3hdKCVbc3ZtXSkgXG5cdCIKKwkJIm1vdiAlJSJSImR4LCAlY1tyZHhdKCVbc3ZtXSkgXG5cdCIKKwkJIm1vdiAlJSJSInNpLCAlY1tyc2ldKCVbc3ZtXSkgXG5cdCIKKwkJIm1vdiAlJSJSImRpLCAlY1tyZGldKCVbc3ZtXSkgXG5cdCIKKwkJIm1vdiAlJSJSImJwLCAlY1tyYnBdKCVbc3ZtXSkgXG5cdCIKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JCSJtb3YgJSVyYngsICVjW3JieF0oJVtzdm1dKSBcblx0IgotCQkibW92ICUlcmN4LCAlY1tyY3hdKCVbc3ZtXSkgXG5cdCIKLQkJIm1vdiAlJXJkeCwgJWNbcmR4XSglW3N2bV0pIFxuXHQiCi0JCSJtb3YgJSVyc2ksICVjW3JzaV0oJVtzdm1dKSBcblx0IgotCQkibW92ICUlcmRpLCAlY1tyZGldKCVbc3ZtXSkgXG5cdCIKLQkJIm1vdiAlJXJicCwgJWNbcmJwXSglW3N2bV0pIFxuXHQiCiAJCSJtb3YgJSVyOCwgICVjW3I4XSglW3N2bV0pIFxuXHQiCiAJCSJtb3YgJSVyOSwgICVjW3I5XSglW3N2bV0pIFxuXHQiCiAJCSJtb3YgJSVyMTAsICVjW3IxMF0oJVtzdm1dKSBcblx0IgpAQCAtMTgwMiwxOCArMTc5Myw4IEBACiAJCSJtb3YgJSVyMTMsICVjW3IxM10oJVtzdm1dKSBcblx0IgogCQkibW92ICUlcjE0LCAlY1tyMTRdKCVbc3ZtXSkgXG5cdCIKIAkJIm1vdiAlJXIxNSwgJWNbcjE1XSglW3N2bV0pIFxuXHQiCi0KLQkJInBvcCAgJSVyYnA7IFxuXHQiCi0jZWxzZQotCQkibW92ICUlZWJ4LCAlY1tyYnhdKCVbc3ZtXSkgXG5cdCIKLQkJIm1vdiAlJWVjeCwgJWNbcmN4XSglW3N2bV0pIFxuXHQiCi0JCSJtb3YgJSVlZHgsICVjW3JkeF0oJVtzdm1dKSBcblx0IgotCQkibW92ICUlZXNpLCAlY1tyc2ldKCVbc3ZtXSkgXG5cdCIKLQkJIm1vdiAlJWVkaSwgJWNbcmRpXSglW3N2bV0pIFxuXHQiCi0JCSJtb3YgJSVlYnAsICVjW3JicF0oJVtzdm1dKSBcblx0IgotCi0JCSJwb3AgICUlZWJwOyBcblx0IgogI2VuZGlmCisJCSJwb3AgJSUiUiJicCIKIAkJOgogCQk6IFtzdm1dImEiKHN2bSksCiAJCSAgW3ZtY2JdImkiKG9mZnNldG9mKHN0cnVjdCB2Y3B1X3N2bSwgdm1jYl9wYSkpLApAQCAtMTgzNCwxMSArMTgxNSw5IEBACiAJCSAgW3IxNV0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfc3ZtLCB2Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUjE1XSkpCiAjZW5kaWYKIAkJOiAiY2MiLCAibWVtb3J5IgorCQksIFIiYngiLCBSImN4IiwgUiJkeCIsIFIic2kiLCBSImRpIgogI2lmZGVmIENPTkZJR19YODZfNjQKLQkJLCAicmJ4IiwgInJjeCIsICJyZHgiLCAicnNpIiwgInJkaSIKIAkJLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIgLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IgotI2Vsc2UKLQkJLCAiZWJ4IiwgImVjeCIsICJlZHgiICwgImVzaSIsICJlZGkiCiAjZW5kaWYKIAkJKTsKIApAQCAtMTg0Niw2ICsxODI1LDkgQEAKIAkJbG9hZF9kYl9yZWdzKHN2bS0+aG9zdF9kYl9yZWdzKTsKIAogCXZjcHUtPmFyY2guY3IyID0gc3ZtLT52bWNiLT5zYXZlLmNyMjsKKwl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSBzdm0tPnZtY2ItPnNhdmUucmF4OworCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHN2bS0+dm1jYi0+c2F2ZS5yc3A7CisJdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SSVBdID0gc3ZtLT52bWNiLT5zYXZlLnJpcDsKIAogCXdyaXRlX2RyNihzdm0tPmhvc3RfZHI2KTsKIAl3cml0ZV9kcjcoc3ZtLT5ob3N0X2RyNyk7CkBAIC0xODY3LDYgKzE4NDksOCBAQAogCXN2bS0+bmV4dF9yaXAgPSAwOwogfQogCisjdW5kZWYgUgorCiBzdGF0aWMgdm9pZCBzdm1fc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgcm9vdCkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKQEAgLTE5NjUsOCArMTk0OSw2IEBACiAJLnNldF9nZHQgPSBzdm1fc2V0X2dkdCwKIAkuZ2V0X2RyID0gc3ZtX2dldF9kciwKIAkuc2V0X2RyID0gc3ZtX3NldF9kciwKLQkuY2FjaGVfcmVncyA9IHN2bV9jYWNoZV9yZWdzLAotCS5kZWNhY2hlX3JlZ3MgPSBzdm1fZGVjYWNoZV9yZWdzLAogCS5nZXRfcmZsYWdzID0gc3ZtX2dldF9yZmxhZ3MsCiAJLnNldF9yZmxhZ3MgPSBzdm1fc2V0X3JmbGFncywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IDJhNjk3NzMuLjI2NDNiNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgImt2bV9jYWNoZV9yZWdzLmgiCisjaW5jbHVkZSAieDg2LmgiCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgpAQCAtNDcsNiArNDksOSBAQAogc3RhdGljIGludCBlbmFibGVfZXB0ID0gMTsKIG1vZHVsZV9wYXJhbShlbmFibGVfZXB0LCBib29sLCAwKTsKIAorc3RhdGljIGludCBlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUgPSAwOworbW9kdWxlX3BhcmFtKGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSwgYm9vbCwgMCk7CisKIHN0cnVjdCB2bWNzIHsKIAl1MzIgcmV2aXNpb25faWQ7CiAJdTMyIGFib3J0OwpAQCAtNTYsNiArNjEsNyBAQAogc3RydWN0IHZjcHVfdm14IHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgICAgICAgdmNwdTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgbG9jYWxfdmNwdXNfbGluazsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgaG9zdF9yc3A7CiAJaW50ICAgICAgICAgICAgICAgICAgIGxhdW5jaGVkOwogCXU4ICAgICAgICAgICAgICAgICAgICBmYWlsOwogCXUzMiAgICAgICAgICAgICAgICAgICBpZHRfdmVjdG9yaW5nX2luZm87CkBAIC04Myw2ICs4OSw3IEBACiAJCX0gaXJxOwogCX0gcm1vZGU7CiAJaW50IHZwaWQ7CisJYm9vbCBlbXVsYXRpb25fcmVxdWlyZWQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2Y3B1X3ZteCAqdG9fdm14KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ2OCw3ICs0NzUsNyBAQAogCWlmICghdmNwdS0+ZnB1X2FjdGl2ZSkKIAkJZWIgfD0gMXUgPDwgTk1fVkVDVE9SOwogCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkKQotCQllYiB8PSAxdSA8PCAxOworCQllYiB8PSAxdSA8PCBEQl9WRUNUT1I7CiAJaWYgKHZjcHUtPmFyY2gucm1vZGUuYWN0aXZlKQogCQllYiA9IH4wOwogCWlmICh2bV9uZWVkX2VwdCgpKQpAQCAtNzE1LDkgKzcyMiw5IEBACiAJdW5zaWduZWQgbG9uZyByaXA7CiAJdTMyIGludGVycnVwdGliaWxpdHk7CiAKLQlyaXAgPSB2bWNzX3JlYWRsKEdVRVNUX1JJUCk7CisJcmlwID0ga3ZtX3JpcF9yZWFkKHZjcHUpOwogCXJpcCArPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7Ci0Jdm1jc193cml0ZWwoR1VFU1RfUklQLCByaXApOworCWt2bV9yaXBfd3JpdGUodmNwdSwgcmlwKTsKIAogCS8qCiAJICogV2UgZW11bGF0ZWQgYW4gaW5zdHJ1Y3Rpb24sIHNvIHRlbXBvcmFyeSBpbnRlcnJ1cHQgYmxvY2tpbmcKQEAgLTczMywxOSArNzQwLDM1IEBACiBzdGF0aWMgdm9pZCB2bXhfcXVldWVfZXhjZXB0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbnIsCiAJCQkJYm9vbCBoYXNfZXJyb3JfY29kZSwgdTMyIGVycm9yX2NvZGUpCiB7CisJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CisKKwlpZiAoaGFzX2Vycm9yX2NvZGUpCisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwgZXJyb3JfY29kZSk7CisKKwlpZiAodmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUpIHsKKwkJdm14LT5ybW9kZS5pcnEucGVuZGluZyA9IHRydWU7CisJCXZteC0+cm1vZGUuaXJxLnZlY3RvciA9IG5yOworCQl2bXgtPnJtb2RlLmlycS5yaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CisJCWlmIChuciA9PSBCUF9WRUNUT1IpCisJCQl2bXgtPnJtb2RlLmlycS5yaXArKzsKKwkJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKKwkJCSAgICAgbnIgfCBJTlRSX1RZUEVfU09GVF9JTlRSCisJCQkgICAgIHwgKGhhc19lcnJvcl9jb2RlID8gSU5UUl9JTkZPX0RFTElWRVJfQ09ERV9NQVNLIDogMCkKKwkJCSAgICAgfCBJTlRSX0lORk9fVkFMSURfTUFTSyk7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sIDEpOworCQlrdm1fcmlwX3dyaXRlKHZjcHUsIHZteC0+cm1vZGUuaXJxLnJpcCAtIDEpOworCQlyZXR1cm47CisJfQorCiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKIAkJICAgICBuciB8IElOVFJfVFlQRV9FWENFUFRJT04KIAkJICAgICB8IChoYXNfZXJyb3JfY29kZSA/IElOVFJfSU5GT19ERUxJVkVSX0NPREVfTUFTSyA6IDApCiAJCSAgICAgfCBJTlRSX0lORk9fVkFMSURfTUFTSyk7Ci0JaWYgKGhhc19lcnJvcl9jb2RlKQotCQl2bWNzX3dyaXRlMzIoVk1fRU5UUllfRVhDRVBUSU9OX0VSUk9SX0NPREUsIGVycm9yX2NvZGUpOwogfQogCiBzdGF0aWMgYm9vbCB2bXhfZXhjZXB0aW9uX2luamVjdGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKLQotCXJldHVybiAhKHZteC0+aWR0X3ZlY3RvcmluZ19pbmZvICYgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSyk7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtOTQ3LDI0ICs5NzAsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogU3luYyB0aGUgcnNwIGFuZCByaXAgcmVnaXN0ZXJzIGludG8gdGhlIHZjcHUgc3RydWN0dXJlLiAgVGhpcyBhbGxvd3MKLSAqIHJlZ2lzdGVycyB0byBiZSBhY2Nlc3NlZCBieSBpbmRleGluZyB2Y3B1LT5hcmNoLnJlZ3MuCi0gKi8KLXN0YXRpYyB2b2lkIHZjcHVfbG9hZF9yc3BfcmlwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyB2b2lkIHZteF9jYWNoZV9yZWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBlbnVtIGt2bV9yZWcgcmVnKQogewotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHZtY3NfcmVhZGwoR1VFU1RfUlNQKTsKLQl2Y3B1LT5hcmNoLnJpcCA9IHZtY3NfcmVhZGwoR1VFU1RfUklQKTsKLX0KLQotLyoKLSAqIFN5bmNzIHJzcCBhbmQgcmlwIGJhY2sgaW50byB0aGUgdm1jcy4gIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcG9zc2libGUKLSAqIG1vZGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgdmNwdV9wdXRfcnNwX3JpcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jdm1jc193cml0ZWwoR1VFU1RfUlNQLCB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF0pOwotCXZtY3Nfd3JpdGVsKEdVRVNUX1JJUCwgdmNwdS0+YXJjaC5yaXApOworCV9fc2V0X2JpdChyZWcsICh1bnNpZ25lZCBsb25nICopJnZjcHUtPmFyY2gucmVnc19hdmFpbCk7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFZDUFVfUkVHU19SU1A6CisJCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHZtY3NfcmVhZGwoR1VFU1RfUlNQKTsKKwkJYnJlYWs7CisJY2FzZSBWQ1BVX1JFR1NfUklQOgorCQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JJUF0gPSB2bWNzX3JlYWRsKEdVRVNUX1JJUCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIH0KIAogc3RhdGljIGludCBzZXRfZ3Vlc3RfZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2RlYnVnX2d1ZXN0ICpkYmcpCkBAIC0xMDA3LDE3ICsxMDI1LDkgQEAKIAogc3RhdGljIGludCB2bXhfZ2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7Ci0JdTMyIGlkdHZfaW5mb19maWVsZDsKLQotCWlkdHZfaW5mb19maWVsZCA9IHZteC0+aWR0X3ZlY3RvcmluZ19pbmZvOwotCWlmIChpZHR2X2luZm9fZmllbGQgJiBJTlRSX0lORk9fVkFMSURfTUFTSykgewotCQlpZiAoaXNfZXh0ZXJuYWxfaW50ZXJydXB0KGlkdHZfaW5mb19maWVsZCkpCi0JCQlyZXR1cm4gaWR0dl9pbmZvX2ZpZWxkICYgVkVDVE9SSU5HX0lORk9fVkVDVE9SX01BU0s7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0RFQlVHICJwZW5kaW5nIGV4Y2VwdGlvbjogbm90IGhhbmRsZWQgeWV0XG4iKTsKLQl9Ci0JcmV0dXJuIC0xOworCWlmICghdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykKKwkJcmV0dXJuIC0xOworCXJldHVybiB2Y3B1LT5hcmNoLmludGVycnVwdC5ucjsKIH0KIAogc3RhdGljIF9faW5pdCBpbnQgY3B1X2hhc19rdm1fc3VwcG9ydCh2b2lkKQpAQCAtMTAzMSw5ICsxMDQxLDkgQEAKIAl1NjQgbXNyOwogCiAJcmRtc3JsKE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCwgbXNyKTsKLQlyZXR1cm4gKG1zciAmIChNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0xfTE9DS0VEIHwKLQkJICAgICAgIE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTF9WTVhPTl9FTkFCTEVEKSkKLQkgICAgPT0gTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MX0xPQ0tFRDsKKwlyZXR1cm4gKG1zciAmIChGRUFUVVJFX0NPTlRST0xfTE9DS0VEIHwKKwkJICAgICAgIEZFQVRVUkVfQ09OVFJPTF9WTVhPTl9FTkFCTEVEKSkKKwkgICAgPT0gRkVBVFVSRV9DT05UUk9MX0xPQ0tFRDsKIAkvKiBsb2NrZWQgYnV0IG5vdCBlbmFibGVkICovCiB9CiAKQEAgLTEwNDUsMTQgKzEwNTUsMTQgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KHZjcHVzX29uX2NwdSwgY3B1KSk7CiAJcmRtc3JsKE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCwgb2xkKTsKLQlpZiAoKG9sZCAmIChNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0xfTE9DS0VEIHwKLQkJICAgIE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTF9WTVhPTl9FTkFCTEVEKSkKLQkgICAgIT0gKE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTF9MT0NLRUQgfAotCQlNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRCkpCisJaWYgKChvbGQgJiAoRkVBVFVSRV9DT05UUk9MX0xPQ0tFRCB8CisJCSAgICBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRCkpCisJICAgICE9IChGRUFUVVJFX0NPTlRST0xfTE9DS0VEIHwKKwkJRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRUQpKQogCQkvKiBlbmFibGUgYW5kIGxvY2sgKi8KIAkJd3Jtc3JsKE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCwgb2xkIHwKLQkJICAgICAgIE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTF9MT0NLRUQgfAotCQkgICAgICAgTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRUQpOworCQkgICAgICAgRkVBVFVSRV9DT05UUk9MX0xPQ0tFRCB8CisJCSAgICAgICBGRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRCk7CiAJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1ZNWEUpOyAvKiBGSVhNRTogbm90IGNwdSBob3RwbHVnIHNhZmUgKi8KIAlhc20gdm9sYXRpbGUgKEFTTV9WTVhfVk1YT05fUkFYCiAJCSAgICAgIDogOiAiYSIoJnBoeXNfYWRkciksICJtIihwaHlzX2FkZHIpCkBAIC0xMTIwLDcgKzExMzAsOCBAQAogCSAgICAgIENQVV9CQVNFRF9DUjNfU1RPUkVfRVhJVElORyB8CiAJICAgICAgQ1BVX0JBU0VEX1VTRV9JT19CSVRNQVBTIHwKIAkgICAgICBDUFVfQkFTRURfTU9WX0RSX0VYSVRJTkcgfAotCSAgICAgIENQVV9CQVNFRF9VU0VfVFNDX09GRlNFVElORzsKKwkgICAgICBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcgfAorCSAgICAgIENQVV9CQVNFRF9JTlZMUEdfRVhJVElORzsKIAlvcHQgPSBDUFVfQkFTRURfVFBSX1NIQURPVyB8CiAJICAgICAgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUyB8CiAJICAgICAgQ1BVX0JBU0VEX0FDVElWQVRFX1NFQ09OREFSWV9DT05UUk9MUzsKQEAgLTExNDksOSArMTE2MCwxMSBAQAogCQlfY3B1X2Jhc2VkX2V4ZWNfY29udHJvbCAmPSB+Q1BVX0JBU0VEX1RQUl9TSEFET1c7CiAjZW5kaWYKIAlpZiAoX2NwdV9iYXNlZF8ybmRfZXhlY19jb250cm9sICYgU0VDT05EQVJZX0VYRUNfRU5BQkxFX0VQVCkgewotCQkvKiBDUjMgYWNjZXNzZXMgZG9uJ3QgbmVlZCB0byBjYXVzZSBWTSBFeGl0cyB3aGVuIEVQVCBlbmFibGVkICovCisJCS8qIENSMyBhY2Nlc3NlcyBhbmQgaW52bHBnIGRvbid0IG5lZWQgdG8gY2F1c2UgVk0gRXhpdHMgd2hlbiBFUFQKKwkJICAgZW5hYmxlZCAqLwogCQltaW4gJj0gfihDUFVfQkFTRURfQ1IzX0xPQURfRVhJVElORyB8Ci0JCQkgQ1BVX0JBU0VEX0NSM19TVE9SRV9FWElUSU5HKTsKKwkJCSBDUFVfQkFTRURfQ1IzX1NUT1JFX0VYSVRJTkcgfAorCQkJIENQVV9CQVNFRF9JTlZMUEdfRVhJVElORyk7CiAJCWlmIChhZGp1c3Rfdm14X2NvbnRyb2xzKG1pbiwgb3B0LCBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMsCiAJCQkJCSZfY3B1X2Jhc2VkX2V4ZWNfY29udHJvbCkgPCAwKQogCQkJcmV0dXJuIC1FSU87CkBAIC0xMjg4LDcgKzEzMDEsOSBAQAogc3RhdGljIHZvaWQgZW50ZXJfcG1vZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CiAKKwl2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCA9IDE7CiAJdmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUgPSAwOwogCiAJdm1jc193cml0ZWwoR1VFU1RfVFJfQkFTRSwgdmNwdS0+YXJjaC5ybW9kZS50ci5iYXNlKTsKQEAgLTEzMDUsNiArMTMyMCw5IEBACiAKIAl1cGRhdGVfZXhjZXB0aW9uX2JpdG1hcCh2Y3B1KTsKIAorCWlmIChlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUpCisJCXJldHVybjsKKwogCWZpeF9wbW9kZV9kYXRhc2VnKFZDUFVfU1JFR19FUywgJnZjcHUtPmFyY2gucm1vZGUuZXMpOwogCWZpeF9wbW9kZV9kYXRhc2VnKFZDUFVfU1JFR19EUywgJnZjcHUtPmFyY2gucm1vZGUuZHMpOwogCWZpeF9wbW9kZV9kYXRhc2VnKFZDUFVfU1JFR19HUywgJnZjcHUtPmFyY2gucm1vZGUuZ3MpOwpAQCAtMTM0NSw3ICsxMzYzLDkgQEAKIHN0YXRpYyB2b2lkIGVudGVyX3Jtb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwogCisJdm14LT5lbXVsYXRpb25fcmVxdWlyZWQgPSAxOwogCXZjcHUtPmFyY2gucm1vZGUuYWN0aXZlID0gMTsKIAogCXZjcHUtPmFyY2gucm1vZGUudHIuYmFzZSA9IHZtY3NfcmVhZGwoR1VFU1RfVFJfQkFTRSk7CkBAIC0xMzY3LDYgKzEzODcsOSBAQAogCXZtY3Nfd3JpdGVsKEdVRVNUX0NSNCwgdm1jc19yZWFkbChHVUVTVF9DUjQpIHwgWDg2X0NSNF9WTUUpOwogCXVwZGF0ZV9leGNlcHRpb25fYml0bWFwKHZjcHUpOwogCisJaWYgKGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSkKKwkJZ290byBjb250aW51ZV9ybW9kZTsKKwogCXZtY3Nfd3JpdGUxNihHVUVTVF9TU19TRUxFQ1RPUiwgdm1jc19yZWFkbChHVUVTVF9TU19CQVNFKSA+PiA0KTsKIAl2bWNzX3dyaXRlMzIoR1VFU1RfU1NfTElNSVQsIDB4ZmZmZik7CiAJdm1jc193cml0ZTMyKEdVRVNUX1NTX0FSX0JZVEVTLCAweGYzKTsKQEAgLTEzODIsNiArMTQwNSw3IEBACiAJZml4X3Jtb2RlX3NlZyhWQ1BVX1NSRUdfR1MsICZ2Y3B1LT5hcmNoLnJtb2RlLmdzKTsKIAlmaXhfcm1vZGVfc2VnKFZDUFVfU1JFR19GUywgJnZjcHUtPmFyY2gucm1vZGUuZnMpOwogCitjb250aW51ZV9ybW9kZToKIAlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CiAJaW5pdF9ybW9kZSh2Y3B1LT5rdm0pOwogfQpAQCAtMTcxNSw2ICsxNzM5LDE4NiBAQAogCXZtY3Nfd3JpdGVsKEdVRVNUX0dEVFJfQkFTRSwgZHQtPmJhc2UpOwogfQogCitzdGF0aWMgYm9vbCBybW9kZV9zZWdtZW50X3ZhbGlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgdmFyOworCXUzMiBhcjsKKworCXZteF9nZXRfc2VnbWVudCh2Y3B1LCAmdmFyLCBzZWcpOworCWFyID0gdm14X3NlZ21lbnRfYWNjZXNzX3JpZ2h0cygmdmFyKTsKKworCWlmICh2YXIuYmFzZSAhPSAodmFyLnNlbGVjdG9yIDw8IDQpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHZhci5saW1pdCAhPSAweGZmZmYpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoYXIgIT0gMHhmMykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNvZGVfc2VnbWVudF92YWxpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9zZWdtZW50IGNzOworCXVuc2lnbmVkIGludCBjc19ycGw7CisKKwl2bXhfZ2V0X3NlZ21lbnQodmNwdSwgJmNzLCBWQ1BVX1NSRUdfQ1MpOworCWNzX3JwbCA9IGNzLnNlbGVjdG9yICYgU0VMRUNUT1JfUlBMX01BU0s7CisKKwlpZiAofmNzLnR5cGUgJiAoQVJfVFlQRV9DT0RFX01BU0t8QVJfVFlQRV9BQ0NFU1NFU19NQVNLKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghY3MucykKKwkJcmV0dXJuIGZhbHNlOworCWlmICghKH5jcy50eXBlICYgKEFSX1RZUEVfQ09ERV9NQVNLfEFSX1RZUEVfV1JJVEVBQkxFX01BU0spKSkgeworCQlpZiAoY3MuZHBsID4gY3NfcnBsKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAoY3MudHlwZSAmIEFSX1RZUEVfQ09ERV9NQVNLKSB7CisJCWlmIChjcy5kcGwgIT0gY3NfcnBsKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoIWNzLnByZXNlbnQpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFRPRE86IEFkZCBSZXNlcnZlZCBmaWVsZCBjaGVjaywgdGhpcydsbCByZXF1aXJlIGEgbmV3IG1lbWJlciBpbiB0aGUga3ZtX3NlZ21lbnRfZmllbGQgc3RydWN0dXJlICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHN0YWNrX3NlZ21lbnRfdmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fc2VnbWVudCBzczsKKwl1bnNpZ25lZCBpbnQgc3NfcnBsOworCisJdm14X2dldF9zZWdtZW50KHZjcHUsICZzcywgVkNQVV9TUkVHX1NTKTsKKwlzc19ycGwgPSBzcy5zZWxlY3RvciAmIFNFTEVDVE9SX1JQTF9NQVNLOworCisJaWYgKChzcy50eXBlICE9IDMpIHx8IChzcy50eXBlICE9IDcpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFzcy5zKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHNzLmRwbCAhPSBzc19ycGwpIC8qIERQTCAhPSBSUEwgKi8KKwkJcmV0dXJuIGZhbHNlOworCWlmICghc3MucHJlc2VudCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGRhdGFfc2VnbWVudF92YWxpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzZWcpCit7CisJc3RydWN0IGt2bV9zZWdtZW50IHZhcjsKKwl1bnNpZ25lZCBpbnQgcnBsOworCisJdm14X2dldF9zZWdtZW50KHZjcHUsICZ2YXIsIHNlZyk7CisJcnBsID0gdmFyLnNlbGVjdG9yICYgU0VMRUNUT1JfUlBMX01BU0s7CisKKwlpZiAoIXZhci5zKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCF2YXIucHJlc2VudCkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh+dmFyLnR5cGUgJiAoQVJfVFlQRV9DT0RFX01BU0t8QVJfVFlQRV9XUklURUFCTEVfTUFTSykpIHsKKwkJaWYgKHZhci5kcGwgPCBycGwpIC8qIERQTCA8IFJQTCAqLworCQkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIFRPRE86IEFkZCBvdGhlciBtZW1iZXJzIHRvIGt2bV9zZWdtZW50X2ZpZWxkIHRvIGFsbG93IGNoZWNraW5nIGZvciBvdGhlciBhY2Nlc3MKKwkgKiByaWdodHMgZmxhZ3MKKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdHJfdmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fc2VnbWVudCB0cjsKKworCXZteF9nZXRfc2VnbWVudCh2Y3B1LCAmdHIsIFZDUFVfU1JFR19UUik7CisKKwlpZiAodHIuc2VsZWN0b3IgJiBTRUxFQ1RPUl9USV9NQVNLKQkvKiBUSSA9IDEgKi8KKwkJcmV0dXJuIGZhbHNlOworCWlmICgodHIudHlwZSAhPSAzKSB8fCAodHIudHlwZSAhPSAxMSkpIC8qIFRPRE86IENoZWNrIGlmIGd1ZXN0IGlzIGluIElBMzJlIG1vZGUgKi8KKwkJcmV0dXJuIGZhbHNlOworCWlmICghdHIucHJlc2VudCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGxkdHJfdmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fc2VnbWVudCBsZHRyOworCisJdm14X2dldF9zZWdtZW50KHZjcHUsICZsZHRyLCBWQ1BVX1NSRUdfTERUUik7CisKKwlpZiAobGR0ci5zZWxlY3RvciAmIFNFTEVDVE9SX1RJX01BU0spCS8qIFRJID0gMSAqLworCQlyZXR1cm4gZmFsc2U7CisJaWYgKGxkdHIudHlwZSAhPSAyKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFsZHRyLnByZXNlbnQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjc19zc19ycGxfY2hlY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fc2VnbWVudCBjcywgc3M7CisKKwl2bXhfZ2V0X3NlZ21lbnQodmNwdSwgJmNzLCBWQ1BVX1NSRUdfQ1MpOworCXZteF9nZXRfc2VnbWVudCh2Y3B1LCAmc3MsIFZDUFVfU1JFR19TUyk7CisKKwlyZXR1cm4gKChjcy5zZWxlY3RvciAmIFNFTEVDVE9SX1JQTF9NQVNLKSA9PQorCQkgKHNzLnNlbGVjdG9yICYgU0VMRUNUT1JfUlBMX01BU0spKTsKK30KKworLyoKKyAqIENoZWNrIGlmIGd1ZXN0IHN0YXRlIGlzIHZhbGlkLiBSZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIGlmCisgKiBub3QuCisgKiBXZSBhc3N1bWUgdGhhdCByZWdpc3RlcnMgYXJlIGFsd2F5cyB1c2FibGUKKyAqLworc3RhdGljIGJvb2wgZ3Vlc3Rfc3RhdGVfdmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIHJlYWwgbW9kZSBndWVzdCBzdGF0ZSBjaGVja3MgKi8KKwlpZiAoISh2Y3B1LT5hcmNoLmNyMCAmIFg4Nl9DUjBfUEUpKSB7CisJCWlmICghcm1vZGVfc2VnbWVudF92YWxpZCh2Y3B1LCBWQ1BVX1NSRUdfQ1MpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoIXJtb2RlX3NlZ21lbnRfdmFsaWQodmNwdSwgVkNQVV9TUkVHX1NTKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFybW9kZV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19EUykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghcm1vZGVfc2VnbWVudF92YWxpZCh2Y3B1LCBWQ1BVX1NSRUdfRVMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoIXJtb2RlX3NlZ21lbnRfdmFsaWQodmNwdSwgVkNQVV9TUkVHX0ZTKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFybW9kZV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19HUykpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkvKiBwcm90ZWN0ZWQgbW9kZSBndWVzdCBzdGF0ZSBjaGVja3MgKi8KKwkJaWYgKCFjc19zc19ycGxfY2hlY2sodmNwdSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghY29kZV9zZWdtZW50X3ZhbGlkKHZjcHUpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoIXN0YWNrX3NlZ21lbnRfdmFsaWQodmNwdSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghZGF0YV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19EUykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghZGF0YV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19FUykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghZGF0YV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19GUykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghZGF0YV9zZWdtZW50X3ZhbGlkKHZjcHUsIFZDUFVfU1JFR19HUykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghdHJfdmFsaWQodmNwdSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghbGR0cl92YWxpZCh2Y3B1KSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJLyogVE9ETzoKKwkgKiAtIEFkZCBjaGVja3Mgb24gUklQCisJICogLSBBZGQgY2hlY2tzIG9uIFJGTEFHUworCSAqLworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBpbnQgaW5pdF9ybW9kZV90c3Moc3RydWN0IGt2bSAqa3ZtKQogewogCWdmbl90IGZuID0gcm1vZGVfdHNzX2Jhc2Uoa3ZtKSA+PiBQQUdFX1NISUZUOwpAQCAtMTcyNiw3ICsxOTMwLDggQEAKIAlpZiAociA8IDApCiAJCWdvdG8gb3V0OwogCWRhdGEgPSBUU1NfQkFTRV9TSVpFICsgVFNTX1JFRElSRUNUSU9OX1NJWkU7Ci0JciA9IGt2bV93cml0ZV9ndWVzdF9wYWdlKGt2bSwgZm4rKywgJmRhdGEsIDB4NjYsIHNpemVvZih1MTYpKTsKKwlyID0ga3ZtX3dyaXRlX2d1ZXN0X3BhZ2Uoa3ZtLCBmbisrLCAmZGF0YSwKKwkJCVRTU19JT1BCX0JBU0VfT0ZGU0VULCBzaXplb2YodTE2KSk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIG91dDsKIAlyID0ga3ZtX2NsZWFyX2d1ZXN0X3BhZ2Uoa3ZtLCBmbisrLCAwLCBQQUdFX1NJWkUpOwpAQCAtMTc4OSw3ICsxOTk0LDcgQEAKIAl2bWNzX3dyaXRlMTYoc2YtPnNlbGVjdG9yLCAwKTsKIAl2bWNzX3dyaXRlbChzZi0+YmFzZSwgMCk7CiAJdm1jc193cml0ZTMyKHNmLT5saW1pdCwgMHhmZmZmKTsKLQl2bWNzX3dyaXRlMzIoc2YtPmFyX2J5dGVzLCAweDkzKTsKKwl2bWNzX3dyaXRlMzIoc2YtPmFyX2J5dGVzLCAweGYzKTsKIH0KIAogc3RhdGljIGludCBhbGxvY19hcGljX2FjY2Vzc19wYWdlKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTE4MDgsOSArMjAxMyw3IEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCi0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWt2bS0+YXJjaC5hcGljX2FjY2Vzc19wYWdlID0gZ2ZuX3RvX3BhZ2Uoa3ZtLCAweGZlZTAwKTsKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogb3V0OgogCXVwX3dyaXRlKCZrdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiByOwpAQCAtMTgzMiwxMCArMjAzNSw4IEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCi0JZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWt2bS0+YXJjaC5lcHRfaWRlbnRpdHlfcGFnZXRhYmxlID0gZ2ZuX3RvX3BhZ2Uoa3ZtLAogCQkJVk1YX0VQVF9JREVOVElUWV9QQUdFVEFCTEVfQUREUiA+PiBQQUdFX1NISUZUKTsKLQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogb3V0OgogCXVwX3dyaXRlKCZrdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiByOwpAQCAtMTkxNyw3ICsyMTE4LDggQEAKIAl9CiAJaWYgKCF2bV9uZWVkX2VwdCgpKQogCQlleGVjX2NvbnRyb2wgfD0gQ1BVX0JBU0VEX0NSM19TVE9SRV9FWElUSU5HIHwKLQkJCQlDUFVfQkFTRURfQ1IzX0xPQURfRVhJVElORzsKKwkJCQlDUFVfQkFTRURfQ1IzX0xPQURfRVhJVElORyAgfAorCQkJCUNQVV9CQVNFRF9JTlZMUEdfRVhJVElORzsKIAl2bWNzX3dyaXRlMzIoQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwgZXhlY19jb250cm9sKTsKIAogCWlmIChjcHVfaGFzX3NlY29uZGFyeV9leGVjX2N0cmxzKCkpIHsKQEAgLTIwMTksNiArMjIyMSw3IEBACiAJdTY0IG1zcjsKIAlpbnQgcmV0OwogCisJdmNwdS0+YXJjaC5yZWdzX2F2YWlsID0gfigoMSA8PCBWQ1BVX1JFR1NfUklQKSB8ICgxIDw8IFZDUFVfUkVHU19SU1ApKTsKIAlkb3duX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7CiAJaWYgKCFpbml0X3Jtb2RlKHZteC0+dmNwdS5rdm0pKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0yMDM2LDYgKzIyMzksNyBAQAogCiAJZnhfaW5pdCgmdm14LT52Y3B1KTsKIAorCXNlZ19zZXR1cChWQ1BVX1NSRUdfQ1MpOwogCS8qCiAJICogR1VFU1RfQ1NfQkFTRSBzaG91bGQgcmVhbGx5IGJlIDB4ZmZmZjAwMDAsIGJ1dCBWVCB2bTg2IG1vZGUKIAkgKiBpbnNpc3RzIG9uIGhhdmluZyBHVUVTVF9DU19CQVNFID09IEdVRVNUX0NTX1NFTEVDVE9SIDw8IDQuICBTaWdoLgpAQCAtMjA0Nyw4ICsyMjUxLDYgQEAKIAkJdm1jc193cml0ZTE2KEdVRVNUX0NTX1NFTEVDVE9SLCB2bXgtPnZjcHUuYXJjaC5zaXBpX3ZlY3RvciA8PCA4KTsKIAkJdm1jc193cml0ZWwoR1VFU1RfQ1NfQkFTRSwgdm14LT52Y3B1LmFyY2guc2lwaV92ZWN0b3IgPDwgMTIpOwogCX0KLQl2bWNzX3dyaXRlMzIoR1VFU1RfQ1NfTElNSVQsIDB4ZmZmZik7Ci0Jdm1jc193cml0ZTMyKEdVRVNUX0NTX0FSX0JZVEVTLCAweDliKTsKIAogCXNlZ19zZXR1cChWQ1BVX1NSRUdfRFMpOwogCXNlZ19zZXR1cChWQ1BVX1NSRUdfRVMpOwpAQCAtMjA3MiwxMCArMjI3NCwxMCBAQAogCiAJdm1jc193cml0ZWwoR1VFU1RfUkZMQUdTLCAweDAyKTsKIAlpZiAodm14LT52Y3B1LnZjcHVfaWQgPT0gMCkKLQkJdm1jc193cml0ZWwoR1VFU1RfUklQLCAweGZmZjApOworCQlrdm1fcmlwX3dyaXRlKHZjcHUsIDB4ZmZmMCk7CiAJZWxzZQotCQl2bWNzX3dyaXRlbChHVUVTVF9SSVAsIDApOwotCXZtY3Nfd3JpdGVsKEdVRVNUX1JTUCwgMCk7CisJCWt2bV9yaXBfd3JpdGUodmNwdSwgMCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SU1AsIDApOwogCiAJLyogdG9kbzogZHIwID0gZHIxID0gZHIyID0gZHIzID0gMDsgZHI2ID0gMHhmZmZmMGZmMCAqLwogCXZtY3Nfd3JpdGVsKEdVRVNUX0RSNywgMHg0MDApOwpAQCAtMjEyNSw2ICsyMzI3LDkgQEAKIAogCXJldCA9IDA7CiAKKwkvKiBIQUNLOiBEb24ndCBlbmFibGUgZW11bGF0aW9uIG9uIGd1ZXN0IGJvb3QvcmVzZXQgKi8KKwl2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCA9IDA7CisKIG91dDoKIAl1cF9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiByZXQ7CkBAIC0yMTM2LDE0ICsyMzQxLDE1IEBACiAKIAlLVk1UUkFDRV8xRChJTkpfVklSUSwgdmNwdSwgKHUzMilpcnEsIGhhbmRsZXIpOwogCisJKyt2Y3B1LT5zdGF0LmlycV9pbmplY3Rpb25zOwogCWlmICh2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSkgewogCQl2bXgtPnJtb2RlLmlycS5wZW5kaW5nID0gdHJ1ZTsKIAkJdm14LT5ybW9kZS5pcnEudmVjdG9yID0gaXJxOwotCQl2bXgtPnJtb2RlLmlycS5yaXAgPSB2bWNzX3JlYWRsKEdVRVNUX1JJUCk7CisJCXZteC0+cm1vZGUuaXJxLnJpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAkJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKIAkJCSAgICAgaXJxIHwgSU5UUl9UWVBFX1NPRlRfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLKTsKIAkJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiwgMSk7Ci0JCXZtY3Nfd3JpdGVsKEdVRVNUX1JJUCwgdm14LT5ybW9kZS5pcnEucmlwIC0gMSk7CisJCWt2bV9yaXBfd3JpdGUodmNwdSwgdm14LT5ybW9kZS5pcnEucmlwIC0gMSk7CiAJCXJldHVybjsKIAl9CiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKQEAgLTIxNTQsNyArMjM2MCw2IEBACiB7CiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKIAkJCUlOVFJfVFlQRV9OTUlfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLIHwgTk1JX1ZFQ1RPUik7Ci0JdmNwdS0+YXJjaC5ubWlfcGVuZGluZyA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9kb19pbmplY3RfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTIxNjYsNyArMjM3MSw3IEBACiAJY2xlYXJfYml0KGJpdF9pbmRleCwgJnZjcHUtPmFyY2guaXJxX3BlbmRpbmdbd29yZF9pbmRleF0pOwogCWlmICghdmNwdS0+YXJjaC5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSkKIAkJY2xlYXJfYml0KHdvcmRfaW5kZXgsICZ2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5KTsKLQl2bXhfaW5qZWN0X2lycSh2Y3B1LCBpcnEpOworCWt2bV9xdWV1ZV9pbnRlcnJ1cHQodmNwdSwgaXJxKTsKIH0KIAogCkBAIC0yMTgwLDEzICsyMzg1LDEyIEBACiAJCSAodm1jc19yZWFkMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPKSAmIDMpID09IDApOwogCiAJaWYgKHZjcHUtPmFyY2guaW50ZXJydXB0X3dpbmRvd19vcGVuICYmCi0JICAgIHZjcHUtPmFyY2guaXJxX3N1bW1hcnkgJiYKLQkgICAgISh2bWNzX3JlYWQzMihWTV9FTlRSWV9JTlRSX0lORk9fRklFTEQpICYgSU5UUl9JTkZPX1ZBTElEX01BU0spKQotCQkvKgotCQkgKiBJZiBpbnRlcnJ1cHRzIGVuYWJsZWQsIGFuZCBub3QgYmxvY2tlZCBieSBzdGkgb3IgbW92IHNzLiBHb29kLgotCQkgKi8KKwkgICAgdmNwdS0+YXJjaC5pcnFfc3VtbWFyeSAmJiAhdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykKIAkJa3ZtX2RvX2luamVjdF9pcnEodmNwdSk7CiAKKwlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gJiYgdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykKKwkJdm14X2luamVjdF9pcnEodmNwdSwgdmNwdS0+YXJjaC5pbnRlcnJ1cHQubnIpOworCiAJY3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCA9IHZtY3NfcmVhZDMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wpOwogCWlmICghdmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gJiYKIAkgICAgKHZjcHUtPmFyY2guaXJxX3N1bW1hcnkgfHwga3ZtX3J1bi0+cmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93KSkKQEAgLTIyMzcsOSArMjQ0MSw2IEBACiBzdGF0aWMgaW50IGhhbmRsZV9ybW9kZV9leGNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgaW50IHZlYywgdTMyIGVycl9jb2RlKQogewotCWlmICghdmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUpCi0JCXJldHVybiAwOwotCiAJLyoKIAkgKiBJbnN0cnVjdGlvbiB3aXRoIGFkZHJlc3Mgc2l6ZSBvdmVycmlkZSBwcmVmaXggb3Bjb2RlIDB4NjcKIAkgKiBDYXVzZSB0aGUgI1NTIGZhdWx0IHdpdGggMCBlcnJvciBjb2RlIGluIFZNODYgbW9kZS4KQEAgLTIyNDcsNiArMjQ0OCwyNSBAQAogCWlmICgoKHZlYyA9PSBHUF9WRUNUT1IpIHx8ICh2ZWMgPT0gU1NfVkVDVE9SKSkgJiYgZXJyX2NvZGUgPT0gMCkKIAkJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgTlVMTCwgMCwgMCwgMCkgPT0gRU1VTEFURV9ET05FKQogCQkJcmV0dXJuIDE7CisJLyoKKwkgKiBGb3J3YXJkIGFsbCBvdGhlciBleGNlcHRpb25zIHRoYXQgYXJlIHZhbGlkIGluIHJlYWwgbW9kZS4KKwkgKiBGSVhNRTogQnJlYWtzIGd1ZXN0IGRlYnVnZ2luZyBpbiByZWFsIG1vZGUsIG5lZWRzIHRvIGJlIGZpeGVkIHdpdGgKKwkgKiAgICAgICAgdGhlIHJlcXVpcmVkIGRlYnVnZ2luZyBpbmZyYXN0cnVjdHVyZSByZXdvcmsuCisJICovCisJc3dpdGNoICh2ZWMpIHsKKwljYXNlIERFX1ZFQ1RPUjoKKwljYXNlIERCX1ZFQ1RPUjoKKwljYXNlIEJQX1ZFQ1RPUjoKKwljYXNlIE9GX1ZFQ1RPUjoKKwljYXNlIEJSX1ZFQ1RPUjoKKwljYXNlIFVEX1ZFQ1RPUjoKKwljYXNlIERGX1ZFQ1RPUjoKKwljYXNlIFNTX1ZFQ1RPUjoKKwljYXNlIEdQX1ZFQ1RPUjoKKwljYXNlIE1GX1ZFQ1RPUjoKKwkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCB2ZWMpOworCQlyZXR1cm4gMTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyODgsNyArMjUwOCw3IEBACiAJfQogCiAJZXJyb3JfY29kZSA9IDA7Ci0JcmlwID0gdm1jc19yZWFkbChHVUVTVF9SSVApOworCXJpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAlpZiAoaW50cl9pbmZvICYgSU5UUl9JTkZPX0RFTElWRVJfQ09ERV9NQVNLKQogCQllcnJvcl9jb2RlID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUpOwogCWlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKQEAgLTIyOTgsNyArMjUxOCw3IEBACiAJCWNyMiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKIAkJS1ZNVFJBQ0VfM0QoUEFHRV9GQVVMVCwgdmNwdSwgZXJyb3JfY29kZSwgKHUzMiljcjIsCiAJCQkgICAgKHUzMikoKHU2NCljcjIgPj4gMzIpLCBoYW5kbGVyKTsKLQkJaWYgKHZlY3RfaW5mbyAmIFZFQ1RPUklOR19JTkZPX1ZBTElEX01BU0spCisJCWlmICh2Y3B1LT5hcmNoLmludGVycnVwdC5wZW5kaW5nIHx8IHZjcHUtPmFyY2guZXhjZXB0aW9uLnBlbmRpbmcpCiAJCQlrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQodmNwdSwgY3IyKTsKIAkJcmV0dXJuIGt2bV9tbXVfcGFnZV9mYXVsdCh2Y3B1LCBjcjIsIGVycm9yX2NvZGUpOwogCX0KQEAgLTIzODYsMjcgKzI2MDYsMjUgQEAKIAlyZWcgPSAoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDgpICYgMTU7CiAJc3dpdGNoICgoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDQpICYgMykgewogCWNhc2UgMDogLyogbW92IHRvIGNyICovCi0JCUtWTVRSQUNFXzNEKENSX1dSSVRFLCB2Y3B1LCAodTMyKWNyLCAodTMyKXZjcHUtPmFyY2gucmVnc1tyZWddLAotCQkJICAgICh1MzIpKCh1NjQpdmNwdS0+YXJjaC5yZWdzW3JlZ10gPj4gMzIpLCBoYW5kbGVyKTsKKwkJS1ZNVFJBQ0VfM0QoQ1JfV1JJVEUsIHZjcHUsICh1MzIpY3IsCisJCQkgICAgKHUzMilrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpLAorCQkJICAgICh1MzIpKCh1NjQpa3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgcmVnKSA+PiAzMiksCisJCQkgICAgaGFuZGxlcik7CiAJCXN3aXRjaCAoY3IpIHsKIAkJY2FzZSAwOgotCQkJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7Ci0JCQlrdm1fc2V0X2NyMCh2Y3B1LCB2Y3B1LT5hcmNoLnJlZ3NbcmVnXSk7CisJCQlrdm1fc2V0X2NyMCh2Y3B1LCBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSAzOgotCQkJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7Ci0JCQlrdm1fc2V0X2NyMyh2Y3B1LCB2Y3B1LT5hcmNoLnJlZ3NbcmVnXSk7CisJCQlrdm1fc2V0X2NyMyh2Y3B1LCBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA0OgotCQkJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7Ci0JCQlrdm1fc2V0X2NyNCh2Y3B1LCB2Y3B1LT5hcmNoLnJlZ3NbcmVnXSk7CisJCQlrdm1fc2V0X2NyNCh2Y3B1LCBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA4OgotCQkJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7Ci0JCQlrdm1fc2V0X2NyOCh2Y3B1LCB2Y3B1LT5hcmNoLnJlZ3NbcmVnXSk7CisJCQlrdm1fc2V0X2NyOCh2Y3B1LCBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkKIAkJCQlyZXR1cm4gMTsKQEAgLTI0MTUsNyArMjYzMyw2IEBACiAJCX07CiAJCWJyZWFrOwogCWNhc2UgMjogLyogY2x0cyAqLwotCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKIAkJdm14X2ZwdV9kZWFjdGl2YXRlKHZjcHUpOwogCQl2Y3B1LT5hcmNoLmNyMCAmPSB+WDg2X0NSMF9UUzsKIAkJdm1jc193cml0ZWwoQ1IwX1JFQURfU0hBRE9XLCB2Y3B1LT5hcmNoLmNyMCk7CkBAIC0yNDI2LDIxICsyNjQzLDE3IEBACiAJY2FzZSAxOiAvKm1vdiBmcm9tIGNyKi8KIAkJc3dpdGNoIChjcikgewogCQljYXNlIDM6Ci0JCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKLQkJCXZjcHUtPmFyY2gucmVnc1tyZWddID0gdmNwdS0+YXJjaC5jcjM7Ci0JCQl2Y3B1X3B1dF9yc3BfcmlwKHZjcHUpOworCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIHJlZywgdmNwdS0+YXJjaC5jcjMpOwogCQkJS1ZNVFJBQ0VfM0QoQ1JfUkVBRCwgdmNwdSwgKHUzMiljciwKLQkJCQkgICAgKHUzMil2Y3B1LT5hcmNoLnJlZ3NbcmVnXSwKLQkJCQkgICAgKHUzMikoKHU2NCl2Y3B1LT5hcmNoLnJlZ3NbcmVnXSA+PiAzMiksCisJCQkJICAgICh1MzIpa3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgcmVnKSwKKwkJCQkgICAgKHUzMikoKHU2NClrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpID4+IDMyKSwKIAkJCQkgICAgaGFuZGxlcik7CiAJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCQkJcmV0dXJuIDE7CiAJCWNhc2UgODoKLQkJCXZjcHVfbG9hZF9yc3BfcmlwKHZjcHUpOwotCQkJdmNwdS0+YXJjaC5yZWdzW3JlZ10gPSBrdm1fZ2V0X2NyOCh2Y3B1KTsKLQkJCXZjcHVfcHV0X3JzcF9yaXAodmNwdSk7CisJCQlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgcmVnLCBrdm1fZ2V0X2NyOCh2Y3B1KSk7CiAJCQlLVk1UUkFDRV8yRChDUl9SRUFELCB2Y3B1LCAodTMyKWNyLAotCQkJCSAgICAodTMyKXZjcHUtPmFyY2gucmVnc1tyZWddLCBoYW5kbGVyKTsKKwkJCQkgICAgKHUzMilrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpLCBoYW5kbGVyKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMjQ3Miw3ICsyNjg1LDYgQEAKIAlleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAJZHIgPSBleGl0X3F1YWxpZmljYXRpb24gJiA3OwogCXJlZyA9IChleGl0X3F1YWxpZmljYXRpb24gPj4gOCkgJiAxNTsKLQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKIAlpZiAoZXhpdF9xdWFsaWZpY2F0aW9uICYgMTYpIHsKIAkJLyogbW92IGZyb20gZHIgKi8KIAkJc3dpdGNoIChkcikgewpAQCAtMjQ4NSwxMiArMjY5NywxMSBAQAogCQlkZWZhdWx0OgogCQkJdmFsID0gMDsKIAkJfQotCQl2Y3B1LT5hcmNoLnJlZ3NbcmVnXSA9IHZhbDsKKwkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIHJlZywgdmFsKTsKIAkJS1ZNVFJBQ0VfMkQoRFJfUkVBRCwgdmNwdSwgKHUzMilkciwgKHUzMil2YWwsIGhhbmRsZXIpOwogCX0gZWxzZSB7CiAJCS8qIG1vdiB0byBkciAqLwogCX0KLQl2Y3B1X3B1dF9yc3BfcmlwKHZjcHUpOwogCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJcmV0dXJuIDE7CiB9CkBAIC0yNTgzLDYgKzI3OTQsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBoYW5kbGVfaW52bHBnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJdTY0IGV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZDY0KEVYSVRfUVVBTElGSUNBVElPTik7CisKKwlrdm1fbW11X2ludmxwZyh2Y3B1LCBleGl0X3F1YWxpZmljYXRpb24pOworCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX3diaW52ZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewogCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CkBAIC0yNjk1LDYgKzI5MTUsNDMgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQgaGFuZGxlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOworCWludCBlcnI7CisKKwlwcmVlbXB0X2VuYWJsZSgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXdoaWxlICghZ3Vlc3Rfc3RhdGVfdmFsaWQodmNwdSkpIHsKKwkJZXJyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCBrdm1fcnVuLCAwLCAwLCAwKTsKKworCQlzd2l0Y2ggKGVycikgeworCQkJY2FzZSBFTVVMQVRFX0RPTkU6CisJCQkJYnJlYWs7CisJCQljYXNlIEVNVUxBVEVfRE9fTU1JTzoKKwkJCQlrdm1fcmVwb3J0X2VtdWxhdGlvbl9mYWlsdXJlKHZjcHUsICJtbWlvIik7CisJCQkJLyogVE9ETzogSGFuZGxlIE1NSU8gKi8KKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCWt2bV9yZXBvcnRfZW11bGF0aW9uX2ZhaWx1cmUodmNwdSwgImVtdWxhdGlvbiBmYWlsdXJlIik7CisJCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCS8qIEd1ZXN0IHN0YXRlIHNob3VsZCBiZSB2YWxpZCBub3csIG5vIG1vcmUgZW11bGF0aW9uIHNob3VsZCBiZSBuZWVkZWQgKi8KKwl2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCA9IDA7Cit9CisKIC8qCiAgKiBUaGUgZXhpdCBoYW5kbGVycyByZXR1cm4gMSBpZiB0aGUgZXhpdCB3YXMgaGFuZGxlZCBmdWxseSBhbmQgZ3Vlc3QgZXhlY3V0aW9uCiAgKiBtYXkgcmVzdW1lLiAgT3RoZXJ3aXNlIHRoZXkgc2V0IHRoZSBrdm1fcnVuIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGF0IG5lZWRzCkBAIC0yNzE0LDYgKzI5NzEsNyBAQAogCVtFWElUX1JFQVNPTl9NU1JfV1JJVEVdICAgICAgICAgICAgICAgPSBoYW5kbGVfd3Jtc3IsCiAJW0VYSVRfUkVBU09OX1BFTkRJTkdfSU5URVJSVVBUXSAgICAgICA9IGhhbmRsZV9pbnRlcnJ1cHRfd2luZG93LAogCVtFWElUX1JFQVNPTl9ITFRdICAgICAgICAgICAgICAgICAgICAgPSBoYW5kbGVfaGFsdCwKKwlbRVhJVF9SRUFTT05fSU5WTFBHXQkJICAgICAgPSBoYW5kbGVfaW52bHBnLAogCVtFWElUX1JFQVNPTl9WTUNBTExdICAgICAgICAgICAgICAgICAgPSBoYW5kbGVfdm1jYWxsLAogCVtFWElUX1JFQVNPTl9UUFJfQkVMT1dfVEhSRVNIT0xEXSAgICAgPSBoYW5kbGVfdHByX2JlbG93X3RocmVzaG9sZCwKIAlbRVhJVF9SRUFTT05fQVBJQ19BQ0NFU1NdICAgICAgICAgICAgID0gaGFuZGxlX2FwaWNfYWNjZXNzLApAQCAtMjczNSw4ICsyOTkzLDggQEAKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKIAl1MzIgdmVjdG9yaW5nX2luZm8gPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKIAotCUtWTVRSQUNFXzNEKFZNRVhJVCwgdmNwdSwgZXhpdF9yZWFzb24sICh1MzIpdm1jc19yZWFkbChHVUVTVF9SSVApLAotCQkgICAgKHUzMikoKHU2NCl2bWNzX3JlYWRsKEdVRVNUX1JJUCkgPj4gMzIpLCBlbnRyeWV4aXQpOworCUtWTVRSQUNFXzNEKFZNRVhJVCwgdmNwdSwgZXhpdF9yZWFzb24sICh1MzIpa3ZtX3JpcF9yZWFkKHZjcHUpLAorCQkgICAgKHUzMikoKHU2NClrdm1fcmlwX3JlYWQodmNwdSkgPj4gMzIpLCBlbnRyeWV4aXQpOwogCiAJLyogQWNjZXNzIENSMyBkb24ndCBjYXVzZSBWTUV4aXQgaW4gcGFnaW5nIG1vZGUsIHNvIHdlIG5lZWQKIAkgKiB0byBzeW5jIHdpdGggZ3Vlc3QgcmVhbCBDUjMuICovCkBAIC0yODI5LDg4ICszMDg3LDkyIEBACiAJCWVuYWJsZV9pcnFfd2luZG93KHZjcHUpOwogfQogCi1zdGF0aWMgdm9pZCB2bXhfaW50cl9hc3Npc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHZvaWQgdm14X2NvbXBsZXRlX2ludGVycnVwdHMoc3RydWN0IHZjcHVfdm14ICp2bXgpCiB7Ci0Jc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7Ci0JdTMyIGlkdHZfaW5mb19maWVsZCwgaW50cl9pbmZvX2ZpZWxkLCBleGl0X2ludHJfaW5mb19maWVsZDsKLQlpbnQgdmVjdG9yOworCXUzMiBleGl0X2ludHJfaW5mbzsKKwl1MzIgaWR0X3ZlY3RvcmluZ19pbmZvOworCWJvb2wgdW5ibG9ja19ubWk7CisJdTggdmVjdG9yOworCWludCB0eXBlOworCWJvb2wgaWR0dl9pbmZvX3ZhbGlkOworCXUzMiBlcnJvcjsKIAotCXVwZGF0ZV90cHJfdGhyZXNob2xkKHZjcHUpOwotCi0JaW50cl9pbmZvX2ZpZWxkID0gdm1jc19yZWFkMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxEKTsKLQlleGl0X2ludHJfaW5mb19maWVsZCA9IHZtY3NfcmVhZDMyKFZNX0VYSVRfSU5UUl9JTkZPKTsKLQlpZHR2X2luZm9fZmllbGQgPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKLQlpZiAoaW50cl9pbmZvX2ZpZWxkICYgSU5UUl9JTkZPX1ZBTElEX01BU0spIHsKLQkJaWYgKGlkdHZfaW5mb19maWVsZCAmIElOVFJfSU5GT19WQUxJRF9NQVNLKSB7Ci0JCQkvKiBUT0RPOiBmYXVsdCB3aGVuIElEVF9WZWN0b3JpbmcgKi8KLQkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJGYXVsdCB3aGVuIElEVF9WZWN0b3JpbmdcbiIpOwotCQl9Ci0JCWVuYWJsZV9pbnRyX3dpbmRvdyh2Y3B1KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodW5saWtlbHkoaWR0dl9pbmZvX2ZpZWxkICYgSU5UUl9JTkZPX1ZBTElEX01BU0spKSB7Ci0JCWlmICgoaWR0dl9pbmZvX2ZpZWxkICYgVkVDVE9SSU5HX0lORk9fVFlQRV9NQVNLKQotCQkgICAgPT0gSU5UUl9UWVBFX0VYVF9JTlRSCi0JCSAgICAmJiB2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSkgewotCQkJdTggdmVjdCA9IGlkdHZfaW5mb19maWVsZCAmIFZFQ1RPUklOR19JTkZPX1ZFQ1RPUl9NQVNLOwotCi0JCQl2bXhfaW5qZWN0X2lycSh2Y3B1LCB2ZWN0KTsKLQkJCWVuYWJsZV9pbnRyX3dpbmRvdyh2Y3B1KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUtWTVRSQUNFXzFEKFJFREVMSVZFUl9FVlQsIHZjcHUsIGlkdHZfaW5mb19maWVsZCwgaGFuZGxlcik7Ci0KLQkJLyoKLQkJICogU0RNIDM6IDI1LjcuMS4yCi0JCSAqIENsZWFyIGJpdCAiYmxvY2sgYnkgTk1JIiBiZWZvcmUgVk0gZW50cnkgaWYgYSBOTUkgZGVsaXZlcnkKLQkJICogZmF1bHRlZC4KLQkJICovCi0JCWlmICgoaWR0dl9pbmZvX2ZpZWxkICYgVkVDVE9SSU5HX0lORk9fVFlQRV9NQVNLKQotCQkgICAgPT0gSU5UUl9UWVBFX05NSV9JTlRSICYmIGNwdV9oYXNfdmlydHVhbF9ubWlzKCkpCi0JCQl2bWNzX3dyaXRlMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAotCQkJCXZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTykgJgotCQkJCX5HVUVTVF9JTlRSX1NUQVRFX05NSSk7Ci0KLQkJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwgaWR0dl9pbmZvX2ZpZWxkCi0JCQkJJiB+SU5UUl9JTkZPX1JFU1ZEX0JJVFNfTUFTSyk7Ci0JCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sCi0JCQkJdm1jc19yZWFkMzIoVk1fRVhJVF9JTlNUUlVDVElPTl9MRU4pKTsKLQotCQlpZiAodW5saWtlbHkoaWR0dl9pbmZvX2ZpZWxkICYgSU5UUl9JTkZPX0RFTElWRVJfQ09ERV9NQVNLKSkKLQkJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwKLQkJCQl2bWNzX3JlYWQzMihJRFRfVkVDVE9SSU5HX0VSUk9SX0NPREUpKTsKLQkJZW5hYmxlX2ludHJfd2luZG93KHZjcHUpOwotCQlyZXR1cm47Ci0JfQorCWV4aXRfaW50cl9pbmZvID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0lORk8pOwogCWlmIChjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKSB7CisJCXVuYmxvY2tfbm1pID0gKGV4aXRfaW50cl9pbmZvICYgSU5UUl9JTkZPX1VOQkxPQ0tfTk1JKSAhPSAwOworCQl2ZWN0b3IgPSBleGl0X2ludHJfaW5mbyAmIElOVFJfSU5GT19WRUNUT1JfTUFTSzsKIAkJLyoKIAkJICogU0RNIDM6IDI1LjcuMS4yCiAJCSAqIFJlLXNldCBiaXQgImJsb2NrIGJ5IE5NSSIgYmVmb3JlIFZNIGVudHJ5IGlmIHZtZXhpdCBjYXVzZWQgYnkKIAkJICogYSBndWVzdCBJUkVUIGZhdWx0LgogCQkgKi8KLQkJaWYgKChleGl0X2ludHJfaW5mb19maWVsZCAmIElOVFJfSU5GT19VTkJMT0NLX05NSSkgJiYKLQkJICAgIChleGl0X2ludHJfaW5mb19maWVsZCAmIElOVFJfSU5GT19WRUNUT1JfTUFTSykgIT0gOCkKLQkJCXZtY3Nfd3JpdGUzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8sCi0JCQkJdm1jc19yZWFkMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPKSB8Ci0JCQkJR1VFU1RfSU5UUl9TVEFURV9OTUkpOwotCQllbHNlIGlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKSB7Ci0JCQlpZiAodm14X25taV9lbmFibGVkKHZjcHUpKQotCQkJCXZteF9pbmplY3Rfbm1pKHZjcHUpOworCQlpZiAodW5ibG9ja19ubWkgJiYgdmVjdG9yICE9IERGX1ZFQ1RPUikKKwkJCXZtY3Nfc2V0X2JpdHMoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAorCQkJCSAgICAgIEdVRVNUX0lOVFJfU1RBVEVfTk1JKTsKKwl9CisKKwlpZHRfdmVjdG9yaW5nX2luZm8gPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKKwlpZHR2X2luZm9fdmFsaWQgPSBpZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19WQUxJRF9NQVNLOworCXZlY3RvciA9IGlkdF92ZWN0b3JpbmdfaW5mbyAmIFZFQ1RPUklOR19JTkZPX1ZFQ1RPUl9NQVNLOworCXR5cGUgPSBpZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19UWVBFX01BU0s7CisJaWYgKHZteC0+dmNwdS5hcmNoLm5taV9pbmplY3RlZCkgeworCQkvKgorCQkgKiBTRE0gMzogMjUuNy4xLjIKKwkJICogQ2xlYXIgYml0ICJibG9jayBieSBOTUkiIGJlZm9yZSBWTSBlbnRyeSBpZiBhIE5NSSBkZWxpdmVyeQorCQkgKiBmYXVsdGVkLgorCQkgKi8KKwkJaWYgKGlkdHZfaW5mb192YWxpZCAmJiB0eXBlID09IElOVFJfVFlQRV9OTUlfSU5UUikKKwkJCXZtY3NfY2xlYXJfYml0cyhHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8sCisJCQkJCUdVRVNUX0lOVFJfU1RBVEVfTk1JKTsKKwkJZWxzZQorCQkJdm14LT52Y3B1LmFyY2gubm1pX2luamVjdGVkID0gZmFsc2U7CisJfQorCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUoJnZteC0+dmNwdSk7CisJaWYgKGlkdHZfaW5mb192YWxpZCAmJiB0eXBlID09IElOVFJfVFlQRV9FWENFUFRJT04pIHsKKwkJaWYgKGlkdF92ZWN0b3JpbmdfaW5mbyAmIFZFQ1RPUklOR19JTkZPX0RFTElWRVJfQ09ERV9NQVNLKSB7CisJCQllcnJvciA9IHZtY3NfcmVhZDMyKElEVF9WRUNUT1JJTkdfRVJST1JfQ09ERSk7CisJCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UoJnZteC0+dmNwdSwgdmVjdG9yLCBlcnJvcik7CisJCX0gZWxzZQorCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbigmdm14LT52Y3B1LCB2ZWN0b3IpOworCQl2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbyA9IDA7CisJfQorCWt2bV9jbGVhcl9pbnRlcnJ1cHRfcXVldWUoJnZteC0+dmNwdSk7CisJaWYgKGlkdHZfaW5mb192YWxpZCAmJiB0eXBlID09IElOVFJfVFlQRV9FWFRfSU5UUikgeworCQlrdm1fcXVldWVfaW50ZXJydXB0KCZ2bXgtPnZjcHUsIHZlY3Rvcik7CisJCXZteC0+aWR0X3ZlY3RvcmluZ19pbmZvID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZteF9pbnRyX2Fzc2lzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdXBkYXRlX3Rwcl90aHJlc2hvbGQodmNwdSk7CisKKwlpZiAoY3B1X2hhc192aXJ0dWFsX25taXMoKSkgeworCQlpZiAodmNwdS0+YXJjaC5ubWlfcGVuZGluZyAmJiAhdmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQpIHsKKwkJCWlmICh2bXhfbm1pX2VuYWJsZWQodmNwdSkpIHsKKwkJCQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CisJCQkJdmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQllbmFibGVfaW50cl93aW5kb3codmNwdSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmICh2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCkgeworCQkJdm14X2luamVjdF9ubWkodmNwdSk7CiAJCQllbmFibGVfaW50cl93aW5kb3codmNwdSk7CiAJCQlyZXR1cm47CiAJCX0KLQogCX0KLQlpZiAoIWt2bV9jcHVfaGFzX2ludGVycnVwdCh2Y3B1KSkKLQkJcmV0dXJuOwotCWlmICh2bXhfaXJxX2VuYWJsZWQodmNwdSkpIHsKLQkJdmVjdG9yID0ga3ZtX2NwdV9nZXRfaW50ZXJydXB0KHZjcHUpOwotCQl2bXhfaW5qZWN0X2lycSh2Y3B1LCB2ZWN0b3IpOwotCQlrdm1fdGltZXJfaW50cl9wb3N0KHZjcHUsIHZlY3Rvcik7Ci0JfSBlbHNlCi0JCWVuYWJsZV9pcnFfd2luZG93KHZjcHUpOworCWlmICghdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZyAmJiBrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpIHsKKwkJaWYgKHZteF9pcnFfZW5hYmxlZCh2Y3B1KSkKKwkJCWt2bV9xdWV1ZV9pbnRlcnJ1cHQodmNwdSwga3ZtX2NwdV9nZXRfaW50ZXJydXB0KHZjcHUpKTsKKwkJZWxzZQorCQkJZW5hYmxlX2lycV93aW5kb3codmNwdSk7CisJfQorCWlmICh2Y3B1LT5hcmNoLmludGVycnVwdC5wZW5kaW5nKSB7CisJCXZteF9pbmplY3RfaXJxKHZjcHUsIHZjcHUtPmFyY2guaW50ZXJydXB0Lm5yKTsKKwkJa3ZtX3RpbWVyX2ludHJfcG9zdCh2Y3B1LCB2Y3B1LT5hcmNoLmludGVycnVwdC5ucik7CisJfQogfQogCiAvKgpAQCAtMjkyMiw5ICszMTg0LDkgQEAKIHN0YXRpYyB2b2lkIGZpeHVwX3Jtb2RlX2lycShzdHJ1Y3QgdmNwdV92bXggKnZteCkKIHsKIAl2bXgtPnJtb2RlLmlycS5wZW5kaW5nID0gMDsKLQlpZiAodm1jc19yZWFkbChHVUVTVF9SSVApICsgMSAhPSB2bXgtPnJtb2RlLmlycS5yaXApCisJaWYgKGt2bV9yaXBfcmVhZCgmdm14LT52Y3B1KSArIDEgIT0gdm14LT5ybW9kZS5pcnEucmlwKQogCQlyZXR1cm47Ci0Jdm1jc193cml0ZWwoR1VFU1RfUklQLCB2bXgtPnJtb2RlLmlycS5yaXApOworCWt2bV9yaXBfd3JpdGUoJnZteC0+dmNwdSwgdm14LT5ybW9kZS5pcnEucmlwKTsKIAlpZiAodm14LT5pZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19WQUxJRF9NQVNLKSB7CiAJCXZteC0+aWR0X3ZlY3RvcmluZ19pbmZvICY9IH5WRUNUT1JJTkdfSU5GT19UWVBFX01BU0s7CiAJCXZteC0+aWR0X3ZlY3RvcmluZ19pbmZvIHw9IElOVFJfVFlQRV9FWFRfSU5UUjsKQEAgLTI5MzYsMTEgKzMxOTgsMzAgQEAKIAkJfCB2bXgtPnJtb2RlLmlycS52ZWN0b3I7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIFIgInIiCisjZGVmaW5lIFEgInEiCisjZWxzZQorI2RlZmluZSBSICJlIgorI2RlZmluZSBRICJsIgorI2VuZGlmCisKIHN0YXRpYyB2b2lkIHZteF92Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwogCXUzMiBpbnRyX2luZm87CiAKKwkvKiBIYW5kbGUgaW52YWxpZCBndWVzdCBzdGF0ZSBpbnN0ZWFkIG9mIGVudGVyaW5nIFZNWCAqLworCWlmICh2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCAmJiBlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUpIHsKKwkJaGFuZGxlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUodmNwdSwga3ZtX3J1bik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGVzdF9iaXQoVkNQVV9SRUdTX1JTUCwgKHVuc2lnbmVkIGxvbmcgKikmdmNwdS0+YXJjaC5yZWdzX2RpcnR5KSkKKwkJdm1jc193cml0ZWwoR1VFU1RfUlNQLCB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF0pOworCWlmICh0ZXN0X2JpdChWQ1BVX1JFR1NfUklQLCAodW5zaWduZWQgbG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfZGlydHkpKQorCQl2bWNzX3dyaXRlbChHVUVTVF9SSVAsIHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUklQXSk7CisKIAkvKgogCSAqIExvYWRpbmcgZ3Vlc3QgZnB1IG1heSBoYXZlIGNsZWFyZWQgaG9zdCBjcjAudHMKIAkgKi8KQEAgLTI5NDgsMjYgKzMyMjksMjUgQEAKIAogCWFzbSgKIAkJLyogU3RvcmUgaG9zdCByZWdpc3RlcnMgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JCSJwdXNoICUlcmR4OyBwdXNoICUlcmJwOyIKLQkJInB1c2ggJSVyY3ggXG5cdCIKLSNlbHNlCi0JCSJwdXNoICUlZWR4OyBwdXNoICUlZWJwOyIKLQkJInB1c2ggJSVlY3ggXG5cdCIKLSNlbmRpZgorCQkicHVzaCAlJSJSImR4OyBwdXNoICUlIlIiYnA7IgorCQkicHVzaCAlJSJSImN4IFxuXHQiCisJCSJjbXAgJSUiUiJzcCwgJWNbaG9zdF9yc3BdKCUwKSBcblx0IgorCQkiamUgMWYgXG5cdCIKKwkJIm1vdiAlJSJSInNwLCAlY1tob3N0X3JzcF0oJTApIFxuXHQiCiAJCV9fZXgoQVNNX1ZNWF9WTVdSSVRFX1JTUF9SRFgpICJcblx0IgorCQkiMTogXG5cdCIKIAkJLyogQ2hlY2sgaWYgdm1sYXVuY2ggb2Ygdm1yZXN1bWUgaXMgbmVlZGVkICovCiAJCSJjbXBsICQwLCAlY1tsYXVuY2hlZF0oJTApIFxuXHQiCiAJCS8qIExvYWQgZ3Vlc3QgcmVnaXN0ZXJzLiAgRG9uJ3QgY2xvYmJlciBmbGFncy4gKi8KKwkJIm1vdiAlY1tjcjJdKCUwKSwgJSUiUiJheCBcblx0IgorCQkibW92ICUlIlIiYXgsICUlY3IyIFxuXHQiCisJCSJtb3YgJWNbcmF4XSglMCksICUlIlIiYXggXG5cdCIKKwkJIm1vdiAlY1tyYnhdKCUwKSwgJSUiUiJieCBcblx0IgorCQkibW92ICVjW3JkeF0oJTApLCAlJSJSImR4IFxuXHQiCisJCSJtb3YgJWNbcnNpXSglMCksICUlIlIic2kgXG5cdCIKKwkJIm1vdiAlY1tyZGldKCUwKSwgJSUiUiJkaSBcblx0IgorCQkibW92ICVjW3JicF0oJTApLCAlJSJSImJwIFxuXHQiCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCQkibW92ICVjW2NyMl0oJTApLCAlJXJheCBcblx0IgotCQkibW92ICUlcmF4LCAlJWNyMiBcblx0IgotCQkibW92ICVjW3JheF0oJTApLCAlJXJheCBcblx0IgotCQkibW92ICVjW3JieF0oJTApLCAlJXJieCBcblx0IgotCQkibW92ICVjW3JkeF0oJTApLCAlJXJkeCBcblx0IgotCQkibW92ICVjW3JzaV0oJTApLCAlJXJzaSBcblx0IgotCQkibW92ICVjW3JkaV0oJTApLCAlJXJkaSBcblx0IgotCQkibW92ICVjW3JicF0oJTApLCAlJXJicCBcblx0IgogCQkibW92ICVjW3I4XSglMCksICAlJXI4ICBcblx0IgogCQkibW92ICVjW3I5XSglMCksICAlJXI5ICBcblx0IgogCQkibW92ICVjW3IxMF0oJTApLCAlJXIxMCBcblx0IgpAQCAtMjk3NiwxOCArMzI1Niw5IEBACiAJCSJtb3YgJWNbcjEzXSglMCksICUlcjEzIFxuXHQiCiAJCSJtb3YgJWNbcjE0XSglMCksICUlcjE0IFxuXHQiCiAJCSJtb3YgJWNbcjE1XSglMCksICUlcjE1IFxuXHQiCi0JCSJtb3YgJWNbcmN4XSglMCksICUlcmN4IFxuXHQiIC8qIGtpbGxzICUwIChyY3gpICovCi0jZWxzZQotCQkibW92ICVjW2NyMl0oJTApLCAlJWVheCBcblx0IgotCQkibW92ICUlZWF4LCAgICUlY3IyIFxuXHQiCi0JCSJtb3YgJWNbcmF4XSglMCksICUlZWF4IFxuXHQiCi0JCSJtb3YgJWNbcmJ4XSglMCksICUlZWJ4IFxuXHQiCi0JCSJtb3YgJWNbcmR4XSglMCksICUlZWR4IFxuXHQiCi0JCSJtb3YgJWNbcnNpXSglMCksICUlZXNpIFxuXHQiCi0JCSJtb3YgJWNbcmRpXSglMCksICUlZWRpIFxuXHQiCi0JCSJtb3YgJWNbcmJwXSglMCksICUlZWJwIFxuXHQiCi0JCSJtb3YgJWNbcmN4XSglMCksICUlZWN4IFxuXHQiIC8qIGtpbGxzICUwIChlY3gpICovCiAjZW5kaWYKKwkJIm1vdiAlY1tyY3hdKCUwKSwgJSUiUiJjeCBcblx0IiAvKiBraWxscyAlMCAoZWN4KSAqLworCiAJCS8qIEVudGVyIGd1ZXN0IG1vZGUgKi8KIAkJImpuZSAuTGxhdW5jaGVkIFxuXHQiCiAJCV9fZXgoQVNNX1ZNWF9WTUxBVU5DSCkgIlxuXHQiCkBAIC0yOTk1LDE1ICszMjY2LDE1IEBACiAJCSIuTGxhdW5jaGVkOiAiIF9fZXgoQVNNX1ZNWF9WTVJFU1VNRSkgIlxuXHQiCiAJCSIuTGt2bV92bXhfcmV0dXJuOiAiCiAJCS8qIFNhdmUgZ3Vlc3QgcmVnaXN0ZXJzLCBsb2FkIGhvc3QgcmVnaXN0ZXJzLCBrZWVwIGZsYWdzICovCisJCSJ4Y2hnICUwLCAgICAgKCUlIlIic3ApIFxuXHQiCisJCSJtb3YgJSUiUiJheCwgJWNbcmF4XSglMCkgXG5cdCIKKwkJIm1vdiAlJSJSImJ4LCAlY1tyYnhdKCUwKSBcblx0IgorCQkicHVzaCJRIiAoJSUiUiJzcCk7IHBvcCJRIiAlY1tyY3hdKCUwKSBcblx0IgorCQkibW92ICUlIlIiZHgsICVjW3JkeF0oJTApIFxuXHQiCisJCSJtb3YgJSUiUiJzaSwgJWNbcnNpXSglMCkgXG5cdCIKKwkJIm1vdiAlJSJSImRpLCAlY1tyZGldKCUwKSBcblx0IgorCQkibW92ICUlIlIiYnAsICVjW3JicF0oJTApIFxuXHQiCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCQkieGNoZyAlMCwgICAgICglJXJzcCkgXG5cdCIKLQkJIm1vdiAlJXJheCwgJWNbcmF4XSglMCkgXG5cdCIKLQkJIm1vdiAlJXJieCwgJWNbcmJ4XSglMCkgXG5cdCIKLQkJInB1c2hxICglJXJzcCk7IHBvcHEgJWNbcmN4XSglMCkgXG5cdCIKLQkJIm1vdiAlJXJkeCwgJWNbcmR4XSglMCkgXG5cdCIKLQkJIm1vdiAlJXJzaSwgJWNbcnNpXSglMCkgXG5cdCIKLQkJIm1vdiAlJXJkaSwgJWNbcmRpXSglMCkgXG5cdCIKLQkJIm1vdiAlJXJicCwgJWNbcmJwXSglMCkgXG5cdCIKIAkJIm1vdiAlJXI4LCAgJWNbcjhdKCUwKSBcblx0IgogCQkibW92ICUlcjksICAlY1tyOV0oJTApIFxuXHQiCiAJCSJtb3YgJSVyMTAsICVjW3IxMF0oJTApIFxuXHQiCkBAIC0zMDEyLDI4ICszMjgzLDE2IEBACiAJCSJtb3YgJSVyMTMsICVjW3IxM10oJTApIFxuXHQiCiAJCSJtb3YgJSVyMTQsICVjW3IxNF0oJTApIFxuXHQiCiAJCSJtb3YgJSVyMTUsICVjW3IxNV0oJTApIFxuXHQiCi0JCSJtb3YgJSVjcjIsICUlcmF4ICAgXG5cdCIKLQkJIm1vdiAlJXJheCwgJWNbY3IyXSglMCkgXG5cdCIKLQotCQkicG9wICAlJXJicDsgcG9wICAlJXJicDsgcG9wICAlJXJkeCBcblx0IgotI2Vsc2UKLQkJInhjaGcgJTAsICglJWVzcCkgXG5cdCIKLQkJIm1vdiAlJWVheCwgJWNbcmF4XSglMCkgXG5cdCIKLQkJIm1vdiAlJWVieCwgJWNbcmJ4XSglMCkgXG5cdCIKLQkJInB1c2hsICglJWVzcCk7IHBvcGwgJWNbcmN4XSglMCkgXG5cdCIKLQkJIm1vdiAlJWVkeCwgJWNbcmR4XSglMCkgXG5cdCIKLQkJIm1vdiAlJWVzaSwgJWNbcnNpXSglMCkgXG5cdCIKLQkJIm1vdiAlJWVkaSwgJWNbcmRpXSglMCkgXG5cdCIKLQkJIm1vdiAlJWVicCwgJWNbcmJwXSglMCkgXG5cdCIKLQkJIm1vdiAlJWNyMiwgJSVlYXggIFxuXHQiCi0JCSJtb3YgJSVlYXgsICVjW2NyMl0oJTApIFxuXHQiCi0KLQkJInBvcCAlJWVicDsgcG9wICUlZWJwOyBwb3AgJSVlZHggXG5cdCIKICNlbmRpZgorCQkibW92ICUlY3IyLCAlJSJSImF4ICAgXG5cdCIKKwkJIm1vdiAlJSJSImF4LCAlY1tjcjJdKCUwKSBcblx0IgorCisJCSJwb3AgICUlIlIiYnA7IHBvcCAgJSUiUiJicDsgcG9wICAlJSJSImR4IFxuXHQiCiAJCSJzZXRiZSAlY1tmYWlsXSglMCkgXG5cdCIKIAkgICAgICA6IDogImMiKHZteCksICJkIigodW5zaWduZWQgbG9uZylIT1NUX1JTUCksCiAJCVtsYXVuY2hlZF0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfdm14LCBsYXVuY2hlZCkpLAogCQlbZmFpbF0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfdm14LCBmYWlsKSksCisJCVtob3N0X3JzcF0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfdm14LCBob3N0X3JzcCkpLAogCQlbcmF4XSJpIihvZmZzZXRvZihzdHJ1Y3QgdmNwdV92bXgsIHZjcHUuYXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdKSksCiAJCVtyYnhdImkiKG9mZnNldG9mKHN0cnVjdCB2Y3B1X3ZteCwgdmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JCWF0pKSwKIAkJW3JjeF0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfdm14LCB2Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSkpLApAQCAtMzA1MywxNCArMzMxMiwxNSBAQAogI2VuZGlmCiAJCVtjcjJdImkiKG9mZnNldG9mKHN0cnVjdCB2Y3B1X3ZteCwgdmNwdS5hcmNoLmNyMikpCiAJICAgICAgOiAiY2MiLCAibWVtb3J5IgorCQksIFIiYngiLCBSImRpIiwgUiJzaSIKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JCSwgInJieCIsICJyZGkiLCAicnNpIgogCQksICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKLSNlbHNlCi0JCSwgImVieCIsICJlZGkiLCAicnNpIgogI2VuZGlmCiAJICAgICAgKTsKIAorCXZjcHUtPmFyY2gucmVnc19hdmFpbCA9IH4oKDEgPDwgVkNQVV9SRUdTX1JJUCkgfCAoMSA8PCBWQ1BVX1JFR1NfUlNQKSk7CisJdmNwdS0+YXJjaC5yZWdzX2RpcnR5ID0gMDsKKwogCXZteC0+aWR0X3ZlY3RvcmluZ19pbmZvID0gdm1jc19yZWFkMzIoSURUX1ZFQ1RPUklOR19JTkZPX0ZJRUxEKTsKIAlpZiAodm14LT5ybW9kZS5pcnEucGVuZGluZykKIAkJZml4dXBfcm1vZGVfaXJxKHZteCk7CkBAIC0zMDgwLDggKzMzNDAsMTMgQEAKIAkJS1ZNVFJBQ0VfMEQoTk1JLCB2Y3B1LCBoYW5kbGVyKTsKIAkJYXNtKCJpbnQgJDIiKTsKIAl9CisKKwl2bXhfY29tcGxldGVfaW50ZXJydXB0cyh2bXgpOwogfQogCisjdW5kZWYgUgorI3VuZGVmIFEKKwogc3RhdGljIHZvaWQgdm14X2ZyZWVfdm1jcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CkBAIC0zMjI0LDggKzM0ODksNyBAQAogCS5zZXRfaWR0ID0gdm14X3NldF9pZHQsCiAJLmdldF9nZHQgPSB2bXhfZ2V0X2dkdCwKIAkuc2V0X2dkdCA9IHZteF9zZXRfZ2R0LAotCS5jYWNoZV9yZWdzID0gdmNwdV9sb2FkX3JzcF9yaXAsCi0JLmRlY2FjaGVfcmVncyA9IHZjcHVfcHV0X3JzcF9yaXAsCisJLmNhY2hlX3JlZyA9IHZteF9jYWNoZV9yZWcsCiAJLmdldF9yZmxhZ3MgPSB2bXhfZ2V0X3JmbGFncywKIAkuc2V0X3JmbGFncyA9IHZteF9zZXRfcmZsYWdzLAogCkBAIC0zMzAxLDggKzM1NjUsNyBAQAogCQlrdm1fbW11X3NldF9iYXNlX3B0ZXMoVk1YX0VQVF9SRUFEQUJMRV9NQVNLIHwKIAkJCVZNWF9FUFRfV1JJVEFCTEVfTUFTSyB8CiAJCQlWTVhfRVBUX0RFRkFVTFRfTVQgPDwgVk1YX0VQVF9NVF9FUFRFX1NISUZUKTsKLQkJa3ZtX21tdV9zZXRfbWFza19wdGVzKDB1bGwsIFZNWF9FUFRfRkFLRV9BQ0NFU1NFRF9NQVNLLAotCQkJCVZNWF9FUFRfRkFLRV9ESVJUWV9NQVNLLCAwdWxsLAorCQlrdm1fbW11X3NldF9tYXNrX3B0ZXMoMHVsbCwgMHVsbCwgMHVsbCwgMHVsbCwKIAkJCQlWTVhfRVBUX0VYRUNVVEFCTEVfTUFTSyk7CiAJCWt2bV9lbmFibGVfdGRwKCk7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmggYi9hcmNoL3g4Ni9rdm0vdm14LmgKaW5kZXggNDI1YTEzNC4uM2UwMTBkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5oCisrKyBiL2FyY2gveDg2L2t2bS92bXguaApAQCAtMzMxLDI0ICszMzEsNiBAQAogCiAjZGVmaW5lIEFSX1JFU0VSVkRfTUFTSyAweGZmZmUwZjAwCiAKLSNkZWZpbmUgTVNSX0lBMzJfVk1YX0JBU0lDICAgICAgICAgICAgICAgICAgICAgIDB4NDgwCi0jZGVmaW5lIE1TUl9JQTMyX1ZNWF9QSU5CQVNFRF9DVExTICAgICAgICAgICAgICAweDQ4MQotI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMgICAgICAgICAgICAgMHg0ODIKLSNkZWZpbmUgTVNSX0lBMzJfVk1YX0VYSVRfQ1RMUyAgICAgICAgICAgICAgICAgIDB4NDgzCi0jZGVmaW5lIE1TUl9JQTMyX1ZNWF9FTlRSWV9DVExTICAgICAgICAgICAgICAgICAweDQ4NAotI2RlZmluZSBNU1JfSUEzMl9WTVhfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgMHg0ODUKLSNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSMF9GSVhFRDAgICAgICAgICAgICAgICAgIDB4NDg2Ci0jZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjBfRklYRUQxICAgICAgICAgICAgICAgICAweDQ4NwotI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMCAgICAgICAgICAgICAgICAgMHg0ODgKLSNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSNF9GSVhFRDEgICAgICAgICAgICAgICAgIDB4NDg5Ci0jZGVmaW5lIE1TUl9JQTMyX1ZNWF9WTUNTX0VOVU0gICAgICAgICAgICAgICAgICAweDQ4YQotI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMyICAgICAgICAgICAgMHg0OGIKLSNkZWZpbmUgTVNSX0lBMzJfVk1YX0VQVF9WUElEX0NBUCAgICAgICAgICAgICAgIDB4NDhjCi0KLSNkZWZpbmUgTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MICAgICAgICAgICAgICAgIDB4M2EKLSNkZWZpbmUgTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MX0xPQ0tFRCAgICAgICAgIDB4MQotI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0xfVk1YT05fRU5BQkxFRCAgMHg0Ci0KICNkZWZpbmUgQVBJQ19BQ0NFU1NfUEFHRV9QUklWQVRFX01FTVNMT1QJOQogI2RlZmluZSBJREVOVElUWV9QQUdFVEFCTEVfUFJJVkFURV9NRU1TTE9UCTEwCiAKQEAgLTM3MCw4ICszNTIsNiBAQAogI2RlZmluZSBWTVhfRVBUX1JFQURBQkxFX01BU0sJCQkweDF1bGwKICNkZWZpbmUgVk1YX0VQVF9XUklUQUJMRV9NQVNLCQkJMHgydWxsCiAjZGVmaW5lIFZNWF9FUFRfRVhFQ1VUQUJMRV9NQVNLCQkJMHg0dWxsCi0jZGVmaW5lIFZNWF9FUFRfRkFLRV9BQ0NFU1NFRF9NQVNLCQkoMXVsbCA8PCA2MikKLSNkZWZpbmUgVk1YX0VQVF9GQUtFX0RJUlRZX01BU0sJCQkoMXVsbCA8PCA2MykKIAogI2RlZmluZSBWTVhfRVBUX0lERU5USVRZX1BBR0VUQUJMRV9BRERSCQkweGZmZmJjMDAwdWwKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IDBkNjgyZmMuLjRmMDY3N2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTQsMTAgKzQsMTQgQEAKICAqIGRlcml2ZWQgZnJvbSBkcml2ZXJzL2t2bS9rdm1fbWFpbi5jCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0LCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUXVtcmFuZXQsIEluYy4KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDgKICAqCiAgKiBBdXRob3JzOgogICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CiAgKiAgIFlhbml2IEthbWF5ICA8eWFuaXZAcXVtcmFuZXQuY29tPgorICogICBBbWl0IFNoYWggICAgPGFtaXQuc2hhaEBxdW1yYW5ldC5jb20+CisgKiAgIEJlbi1BbWkgWWFzc291ciA8YmVuYW1pQGlsLmlibS5jb20+CiAgKgogICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCiAgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgpAQCAtMTksMTQgKzIzLDE4IEBACiAjaW5jbHVkZSAibW11LmgiCiAjaW5jbHVkZSAiaTgyNTQuaCIKICNpbmNsdWRlICJ0c3MuaCIKKyNpbmNsdWRlICJrdm1fY2FjaGVfcmVncy5oIgorI2luY2x1ZGUgIng4Ni5oIgogCiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KQEAgLTYxLDYgKzY5LDcgQEAKIAkJCQkgICAgc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgX191c2VyICplbnRyaWVzKTsKIAogc3RydWN0IGt2bV94ODZfb3BzICprdm1feDg2X29wczsKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV94ODZfb3BzKTsKIAogc3RydWN0IGt2bV9zdGF0c19kZWJ1Z2ZzX2l0ZW0gZGVidWdmc19lbnRyaWVzW10gPSB7CiAJeyAicGZfZml4ZWQiLCBWQ1BVX1NUQVQocGZfZml4ZWQpIH0sCkBAIC04Myw2ICs5Miw3IEBACiAJeyAiZnB1X3JlbG9hZCIsIFZDUFVfU1RBVChmcHVfcmVsb2FkKSB9LAogCXsgImluc25fZW11bGF0aW9uIiwgVkNQVV9TVEFUKGluc25fZW11bGF0aW9uKSB9LAogCXsgImluc25fZW11bGF0aW9uX2ZhaWwiLCBWQ1BVX1NUQVQoaW5zbl9lbXVsYXRpb25fZmFpbCkgfSwKKwl7ICJpcnFfaW5qZWN0aW9ucyIsIFZDUFVfU1RBVChpcnFfaW5qZWN0aW9ucykgfSwKIAl7ICJtbXVfc2hhZG93X3phcHBlZCIsIFZNX1NUQVQobW11X3NoYWRvd196YXBwZWQpIH0sCiAJeyAibW11X3B0ZV93cml0ZSIsIFZNX1NUQVQobW11X3B0ZV93cml0ZSkgfSwKIAl7ICJtbXVfcHRlX3VwZGF0ZWQiLCBWTV9TVEFUKG1tdV9wdGVfdXBkYXRlZCkgfSwKQEAgLTkwLDEyICsxMDAsMTIgQEAKIAl7ICJtbXVfZmxvb2RlZCIsIFZNX1NUQVQobW11X2Zsb29kZWQpIH0sCiAJeyAibW11X3JlY3ljbGVkIiwgVk1fU1RBVChtbXVfcmVjeWNsZWQpIH0sCiAJeyAibW11X2NhY2hlX21pc3MiLCBWTV9TVEFUKG1tdV9jYWNoZV9taXNzKSB9LAorCXsgIm1tdV91bnN5bmMiLCBWTV9TVEFUKG1tdV91bnN5bmMpIH0sCiAJeyAicmVtb3RlX3RsYl9mbHVzaCIsIFZNX1NUQVQocmVtb3RlX3RsYl9mbHVzaCkgfSwKIAl7ICJsYXJnZXBhZ2VzIiwgVk1fU1RBVChscGFnZXMpIH0sCiAJeyBOVUxMIH0KIH07CiAKLQogdW5zaWduZWQgbG9uZyBzZWdtZW50X2Jhc2UodTE2IHNlbGVjdG9yKQogewogCXN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlIGdkdDsKQEAgLTM1Miw2ICszNjIsNyBAQAogdm9pZCBrdm1fc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKQogewogCWlmIChjcjMgPT0gdmNwdS0+YXJjaC5jcjMgJiYgIXBkcHRyc19jaGFuZ2VkKHZjcHUpKSB7CisJCWt2bV9tbXVfc3luY19yb290cyh2Y3B1KTsKIAkJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7CiAJCXJldHVybjsKIAl9CkBAIC01NjQsNyArNTc1LDcgQEAKIAlodl9jbG9jay0+dHNjX3RvX3N5c3RlbV9tdWwgPSBkaXZfZnJhYyhuc2VjcywgdHBzMzIpOwogCiAJcHJfZGVidWcoIiVzOiB0c2Nfa2h6ICV1LCB0c2Nfc2hpZnQgJWQsIHRzY19tdWwgJXVcbiIsCi0JCSBfX0ZVTkNUSU9OX18sIHRzY19raHosIGh2X2Nsb2NrLT50c2Nfc2hpZnQsCisJCSBfX2Z1bmNfXywgdHNjX2toeiwgaHZfY2xvY2stPnRzY19zaGlmdCwKIAkJIGh2X2Nsb2NrLT50c2NfdG9fc3lzdGVtX211bCk7CiB9CiAKQEAgLTY2Miw2ICs2NzMsMTggQEAKIAkJcHJfdW5pbXBsKHZjcHUsICIlczogTVNSX0lBMzJfTUNHX0NUTCAweCVsbHgsIG5vcFxuIiwKIAkJCV9fZnVuY19fLCBkYXRhKTsKIAkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9ERUJVR0NUTE1TUjoKKwkJaWYgKCFkYXRhKSB7CisJCQkvKiBXZSBzdXBwb3J0IHRoZSBub24tYWN0aXZhdGVkIGNhc2UgYWxyZWFkeSAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoZGF0YSAmIH4oREVCVUdDVExNU1JfTEJSIHwgREVCVUdDVExNU1JfQlRGKSkgeworCQkJLyogVmFsdWVzIG90aGVyIHRoYW4gTEJSIGFuZCBCVEYgYXJlIHZlbmRvci1zcGVjaWZpYywKKwkJCSAgIHRodXMgcmVzZXJ2ZWQgYW5kIHNob3VsZCB0aHJvdyBhICNHUCAqLworCQkJcmV0dXJuIDE7CisJCX0KKwkJcHJfdW5pbXBsKHZjcHUsICIlczogTVNSX0lBMzJfREVCVUdDVExNU1IgMHglbGx4LCBub3BcbiIsCisJCQlfX2Z1bmNfXywgZGF0YSk7CisJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfVUNPREVfUkVWOgogCWNhc2UgTVNSX0lBMzJfVUNPREVfV1JJVEU6CiAJCWJyZWFrOwpAQCAtNjkyLDEwICs3MTUsOCBAQAogCQkvKiAuLi5idXQgY2xlYW4gaXQgYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgd3JpdGUgKi8KIAkJdmNwdS0+YXJjaC50aW1lX29mZnNldCA9IGRhdGEgJiB+KFBBR0VfTUFTSyB8IDEpOwogCi0JCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkJdmNwdS0+YXJjaC50aW1lX3BhZ2UgPQogCQkJCWdmbl90b19wYWdlKHZjcHUtPmt2bSwgZGF0YSA+PiBQQUdFX1NISUZUKTsKLQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAogCQlpZiAoaXNfZXJyb3JfcGFnZSh2Y3B1LT5hcmNoLnRpbWVfcGFnZSkpIHsKIAkJCWt2bV9yZWxlYXNlX3BhZ2VfY2xlYW4odmNwdS0+YXJjaC50aW1lX3BhZ2UpOwpAQCAtNzUyLDggKzc3MywxNCBAQAogCWNhc2UgTVNSX0lBMzJfTUMwX01JU0MrODoKIAljYXNlIE1TUl9JQTMyX01DMF9NSVNDKzEyOgogCWNhc2UgTVNSX0lBMzJfTUMwX01JU0MrMTY6CisJY2FzZSBNU1JfSUEzMl9NQzBfTUlTQysyMDoKIAljYXNlIE1TUl9JQTMyX1VDT0RFX1JFVjoKIAljYXNlIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOgorCWNhc2UgTVNSX0lBMzJfREVCVUdDVExNU1I6CisJY2FzZSBNU1JfSUEzMl9MQVNUQlJBTkNIRlJPTUlQOgorCWNhc2UgTVNSX0lBMzJfTEFTVEJSQU5DSFRPSVA6CisJY2FzZSBNU1JfSUEzMl9MQVNUSU5URlJPTUlQOgorCWNhc2UgTVNSX0lBMzJfTEFTVElOVFRPSVA6CiAJCWRhdGEgPSAwOwogCQlicmVhazsKIAljYXNlIE1TUl9NVFJSY2FwOgpAQCAtOTAxLDYgKzkyOCw5IEBACiAJY2FzZSBLVk1fQ0FQX1BWX01NVToKIAkJciA9ICF0ZHBfZW5hYmxlZDsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX0lPTU1VOgorCQlyID0gaW50ZWxfaW9tbXVfZm91bmQoKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMTMwMywyOCArMTMzMywzMyBAQAogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcjsKKwlzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlICpsYXBpYyA9IE5VTEw7CiAKIAlzd2l0Y2ggKGlvY3RsKSB7CiAJY2FzZSBLVk1fR0VUX0xBUElDOiB7Ci0JCXN0cnVjdCBrdm1fbGFwaWNfc3RhdGUgbGFwaWM7CisJCWxhcGljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9sYXBpY19zdGF0ZSksIEdGUF9LRVJORUwpOwogCi0JCW1lbXNldCgmbGFwaWMsIDAsIHNpemVvZiBsYXBpYyk7Ci0JCXIgPSBrdm1fdmNwdV9pb2N0bF9nZXRfbGFwaWModmNwdSwgJmxhcGljKTsKKwkJciA9IC1FTk9NRU07CisJCWlmICghbGFwaWMpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV92Y3B1X2lvY3RsX2dldF9sYXBpYyh2Y3B1LCBsYXBpYyk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsYXBpYywgc2l6ZW9mIGxhcGljKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBsYXBpYywgc2l6ZW9mKHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0gMDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgS1ZNX1NFVF9MQVBJQzogewotCQlzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlIGxhcGljOwotCi0JCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmxhcGljLCBhcmdwLCBzaXplb2YgbGFwaWMpKQorCQlsYXBpYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJciA9IC1FTk9NRU07CisJCWlmICghbGFwaWMpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV92Y3B1X2lvY3RsX3NldF9sYXBpYyh2Y3B1LCAmbGFwaWMpOzsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihsYXBpYywgYXJncCwgc2l6ZW9mKHN0cnVjdCBrdm1fbGFwaWNfc3RhdGUpKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX3ZjcHVfaW9jdGxfc2V0X2xhcGljKHZjcHUsIGxhcGljKTsKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CkBAIC0xNDIyLDYgKzE0NTcsOCBAQAogCQlyID0gLUVJTlZBTDsKIAl9CiBvdXQ6CisJaWYgKGxhcGljKQorCQlrZnJlZShsYXBpYyk7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTE2MzAsNiArMTY2NywxNSBAQAogCXN0cnVjdCBrdm0gKmt2bSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgciA9IC1FSU5WQUw7CisJLyoKKwkgKiBUaGlzIHVuaW9uIG1ha2VzIGl0IGNvbXBsZXRlbHkgZXhwbGljaXQgdG8gZ2NjLTMueAorCSAqIHRoYXQgdGhlc2UgdHdvIHZhcmlhYmxlcycgc3RhY2sgdXNhZ2Ugc2hvdWxkIGJlCisJICogY29tYmluZWQsIG5vdCBhZGRlZCB0b2dldGhlci4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBrdm1fcGl0X3N0YXRlIHBzOworCQlzdHJ1Y3Qga3ZtX21lbW9yeV9hbGlhcyBhbGlhczsKKwl9IHU7CiAKIAlzd2l0Y2ggKGlvY3RsKSB7CiAJY2FzZSBLVk1fU0VUX1RTU19BRERSOgpAQCAtMTY2MSwxNyArMTcwNywxNCBAQAogCWNhc2UgS1ZNX0dFVF9OUl9NTVVfUEFHRVM6CiAJCXIgPSBrdm1fdm1faW9jdGxfZ2V0X25yX21tdV9wYWdlcyhrdm0pOwogCQlicmVhazsKLQljYXNlIEtWTV9TRVRfTUVNT1JZX0FMSUFTOiB7Ci0JCXN0cnVjdCBrdm1fbWVtb3J5X2FsaWFzIGFsaWFzOwotCisJY2FzZSBLVk1fU0VUX01FTU9SWV9BTElBUzoKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWxpYXMsIGFyZ3AsIHNpemVvZiBhbGlhcykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdS5hbGlhcywgYXJncCwgc2l6ZW9mKHN0cnVjdCBrdm1fbWVtb3J5X2FsaWFzKSkpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X2FsaWFzKGt2bSwgJmFsaWFzKTsKKwkJciA9IGt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X2FsaWFzKGt2bSwgJnUuYWxpYXMpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwogCQlicmVhazsKLQl9CiAJY2FzZSBLVk1fQ1JFQVRFX0lSUUNISVA6CiAJCXIgPSAtRU5PTUVNOwogCQlrdm0tPmFyY2gudnBpYyA9IGt2bV9jcmVhdGVfcGljKGt2bSk7CkBAIC0xNjk5LDEzICsxNzQyLDcgQEAKIAkJCWdvdG8gb3V0OwogCQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkgewogCQkJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKLQkJCWlmIChpcnFfZXZlbnQuaXJxIDwgMTYpCi0JCQkJa3ZtX3BpY19zZXRfaXJxKHBpY19pcnFjaGlwKGt2bSksCi0JCQkJCWlycV9ldmVudC5pcnEsCi0JCQkJCWlycV9ldmVudC5sZXZlbCk7Ci0JCQlrdm1faW9hcGljX3NldF9pcnEoa3ZtLT5hcmNoLnZpb2FwaWMsCi0JCQkJCWlycV9ldmVudC5pcnEsCi0JCQkJCWlycV9ldmVudC5sZXZlbCk7CisJCQlrdm1fc2V0X2lycShrdm0sIGlycV9ldmVudC5pcnEsIGlycV9ldmVudC5sZXZlbCk7CiAJCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiAJCQlyID0gMDsKIAkJfQpAQCAtMTcxMyw2NSArMTc1MCw3NyBAQAogCX0KIAljYXNlIEtWTV9HRVRfSVJRQ0hJUDogewogCQkvKiAwOiBQSUMgbWFzdGVyLCAxOiBQSUMgc2xhdmUsIDI6IElPQVBJQyAqLwotCQlzdHJ1Y3Qga3ZtX2lycWNoaXAgY2hpcDsKKwkJc3RydWN0IGt2bV9pcnFjaGlwICpjaGlwID0ga21hbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAotCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaGlwLCBhcmdwLCBzaXplb2YgY2hpcCkpCisJCXIgPSAtRU5PTUVNOworCQlpZiAoIWNoaXApCiAJCQlnb3RvIG91dDsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihjaGlwLCBhcmdwLCBzaXplb2YgKmNoaXApKQorCQkJZ290byBnZXRfaXJxY2hpcF9vdXQ7CiAJCXIgPSAtRU5YSU87CiAJCWlmICghaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkKLQkJCWdvdG8gb3V0OwotCQlyID0ga3ZtX3ZtX2lvY3RsX2dldF9pcnFjaGlwKGt2bSwgJmNoaXApOworCQkJZ290byBnZXRfaXJxY2hpcF9vdXQ7CisJCXIgPSBrdm1fdm1faW9jdGxfZ2V0X2lycWNoaXAoa3ZtLCBjaGlwKTsKKwkJaWYgKHIpCisJCQlnb3RvIGdldF9pcnFjaGlwX291dDsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY2hpcCwgc2l6ZW9mICpjaGlwKSkKKwkJCWdvdG8gZ2V0X2lycWNoaXBfb3V0OworCQlyID0gMDsKKwlnZXRfaXJxY2hpcF9vdXQ6CisJCWtmcmVlKGNoaXApOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwotCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2hpcCwgc2l6ZW9mIGNoaXApKQotCQkJZ290byBvdXQ7Ci0JCXIgPSAwOwogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fU0VUX0lSUUNISVA6IHsKIAkJLyogMDogUElDIG1hc3RlciwgMTogUElDIHNsYXZlLCAyOiBJT0FQSUMgKi8KLQkJc3RydWN0IGt2bV9pcnFjaGlwIGNoaXA7CisJCXN0cnVjdCBrdm1faXJxY2hpcCAqY2hpcCA9IGttYWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CiAKLQkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2hpcCwgYXJncCwgc2l6ZW9mIGNoaXApKQorCQlyID0gLUVOT01FTTsKKwkJaWYgKCFjaGlwKQogCQkJZ290byBvdXQ7CisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoY2hpcCwgYXJncCwgc2l6ZW9mICpjaGlwKSkKKwkJCWdvdG8gc2V0X2lycWNoaXBfb3V0OwogCQlyID0gLUVOWElPOwogCQlpZiAoIWlycWNoaXBfaW5fa2VybmVsKGt2bSkpCi0JCQlnb3RvIG91dDsKLQkJciA9IGt2bV92bV9pb2N0bF9zZXRfaXJxY2hpcChrdm0sICZjaGlwKTsKKwkJCWdvdG8gc2V0X2lycWNoaXBfb3V0OworCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9pcnFjaGlwKGt2bSwgY2hpcCk7CisJCWlmIChyKQorCQkJZ290byBzZXRfaXJxY2hpcF9vdXQ7CisJCXIgPSAwOworCXNldF9pcnFjaGlwX291dDoKKwkJa2ZyZWUoY2hpcCk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7Ci0JCXIgPSAwOwogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fR0VUX1BJVDogewotCQlzdHJ1Y3Qga3ZtX3BpdF9zdGF0ZSBwczsKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcHMsIGFyZ3AsIHNpemVvZiBwcykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdS5wcywgYXJncCwgc2l6ZW9mKHN0cnVjdCBrdm1fcGl0X3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FTlhJTzsKIAkJaWYgKCFrdm0tPmFyY2gudnBpdCkKIAkJCWdvdG8gb3V0OwotCQlyID0ga3ZtX3ZtX2lvY3RsX2dldF9waXQoa3ZtLCAmcHMpOworCQlyID0ga3ZtX3ZtX2lvY3RsX2dldF9waXQoa3ZtLCAmdS5wcyk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZwcywgc2l6ZW9mIHBzKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdS5wcywgc2l6ZW9mKHN0cnVjdCBrdm1fcGl0X3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9TRVRfUElUOiB7Ci0JCXN0cnVjdCBrdm1fcGl0X3N0YXRlIHBzOwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwcywgYXJncCwgc2l6ZW9mIHBzKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LnBzLCBhcmdwLCBzaXplb2YgdS5wcykpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FTlhJTzsKIAkJaWYgKCFrdm0tPmFyY2gudnBpdCkKIAkJCWdvdG8gb3V0OwotCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9waXQoa3ZtLCAmcHMpOworCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9waXQoa3ZtLCAmdS5wcyk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAwOwpAQCAtMjAxOCw5ICsyMDY3LDcgQEAKIAogCQl2YWwgPSAqKHU2NCAqKW5ldzsKIAotCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJCXBhZ2UgPSBnZm5fdG9fcGFnZSh2Y3B1LT5rdm0sIGdwYSA+PiBQQUdFX1NISUZUKTsKLQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAogCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAkJc2V0XzY0Yml0KCh1NjQgKikoa2FkZHIgKyBvZmZzZXRfaW5fcGFnZShncGEpKSwgdmFsKTsKQEAgLTIwNDAsNiArMjA4Nyw3IEBACiAKIGludCBlbXVsYXRlX2ludmxwZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGFkZHJlc3MpCiB7CisJa3ZtX21tdV9pbnZscGcodmNwdSwgYWRkcmVzcyk7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKQEAgLTIwODAsNyArMjEyOCw3IEBACiB2b2lkIGt2bV9yZXBvcnRfZW11bGF0aW9uX2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBjb25zdCBjaGFyICpjb250ZXh0KQogewogCXU4IG9wY29kZXNbNF07Ci0JdW5zaWduZWQgbG9uZyByaXAgPSB2Y3B1LT5hcmNoLnJpcDsKKwl1bnNpZ25lZCBsb25nIHJpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAl1bnNpZ25lZCBsb25nIHJpcF9saW5lYXI7CiAKIAlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKQEAgLTIxMDIsNiArMjE1MCwxNCBAQAogCS5jbXB4Y2hnX2VtdWxhdGVkICAgID0gZW11bGF0b3JfY21weGNoZ19lbXVsYXRlZCwKIH07CiAKK3N0YXRpYyB2b2lkIGNhY2hlX2FsbF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKKwlrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNQKTsKKwlrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUklQKTsKKwl2Y3B1LT5hcmNoLnJlZ3NfZGlydHkgPSB+MDsKK30KKwogaW50IGVtdWxhdGVfaW5zdHJ1Y3Rpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJc3RydWN0IGt2bV9ydW4gKnJ1biwKIAkJCXVuc2lnbmVkIGxvbmcgY3IyLApAQCAtMjExMSw4ICsyMTY3LDE1IEBACiAJaW50IHI7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYzsKIAorCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUodmNwdSk7CiAJdmNwdS0+YXJjaC5tbWlvX2ZhdWx0X2NyMiA9IGNyMjsKLQlrdm1feDg2X29wcy0+Y2FjaGVfcmVncyh2Y3B1KTsKKwkvKgorCSAqIFRPRE86IGZpeCB4ODZfZW11bGF0ZS5jIHRvIHVzZSBndWVzdF9yZWFkL3dyaXRlX3JlZ2lzdGVyCisJICogaW5zdGVhZCBvZiBkaXJlY3QgLT5yZWdzIGFjY2Vzc2VzLCBjYW4gc2F2ZSBodW5kcmVkIGN5Y2xlcworCSAqIG9uIEludGVsIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBkb24ndCByZWFkL2NoYW5nZSBSU1AsIGZvcgorCSAqIGZvciBleGFtcGxlLgorCSAqLworCWNhY2hlX2FsbF9yZWdzKHZjcHUpOwogCiAJdmNwdS0+bW1pb19pc193cml0ZSA9IDA7CiAJdmNwdS0+YXJjaC5waW8uc3RyaW5nID0gMDsKQEAgLTIxNzIsNyArMjIzNSw2IEBACiAJCXJldHVybiBFTVVMQVRFX0RPX01NSU87CiAJfQogCi0Ja3ZtX3g4Nl9vcHMtPmRlY2FjaGVfcmVncyh2Y3B1KTsKIAlrdm1feDg2X29wcy0+c2V0X3JmbGFncyh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5lZmxhZ3MpOwogCiAJaWYgKHZjcHUtPm1taW9faXNfd3JpdGUpIHsKQEAgLTIyMjUsMjAgKzIyODcsMTkgQEAKIAlzdHJ1Y3Qga3ZtX3Bpb19yZXF1ZXN0ICppbyA9ICZ2Y3B1LT5hcmNoLnBpbzsKIAlsb25nIGRlbHRhOwogCWludCByOwotCi0Ja3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoIWlvLT5zdHJpbmcpIHsKLQkJaWYgKGlvLT5pbikKLQkJCW1lbWNweSgmdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdLCB2Y3B1LT5hcmNoLnBpb19kYXRhLAotCQkJICAgICAgIGlvLT5zaXplKTsKKwkJaWYgKGlvLT5pbikgeworCQkJdmFsID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JBWCk7CisJCQltZW1jcHkoJnZhbCwgdmNwdS0+YXJjaC5waW9fZGF0YSwgaW8tPnNpemUpOworCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQVgsIHZhbCk7CisJCX0KIAl9IGVsc2UgewogCQlpZiAoaW8tPmluKSB7CiAJCQlyID0gcGlvX2NvcHlfZGF0YSh2Y3B1KTsKLQkJCWlmIChyKSB7Ci0JCQkJa3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7CisJCQlpZiAocikKIAkJCQlyZXR1cm4gcjsKLQkJCX0KIAkJfQogCiAJCWRlbHRhID0gMTsKQEAgLTIyNDgsMTkgKzIzMDksMjQgQEAKIAkJCSAqIFRoZSBzaXplIG9mIHRoZSByZWdpc3RlciBzaG91bGQgcmVhbGx5IGRlcGVuZCBvbgogCQkJICogY3VycmVudCBhZGRyZXNzIHNpemUuCiAJCQkgKi8KLQkJCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSAtPSBkZWx0YTsKKwkJCXZhbCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQ1gpOworCQkJdmFsIC09IGRlbHRhOworCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQ1gsIHZhbCk7CiAJCX0KIAkJaWYgKGlvLT5kb3duKQogCQkJZGVsdGEgPSAtZGVsdGE7CiAJCWRlbHRhICo9IGlvLT5zaXplOwotCQlpZiAoaW8tPmluKQotCQkJdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SREldICs9IGRlbHRhOwotCQllbHNlCi0JCQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTSV0gKz0gZGVsdGE7CisJCWlmIChpby0+aW4pIHsKKwkJCXZhbCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SREkpOworCQkJdmFsICs9IGRlbHRhOworCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SREksIHZhbCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNJKTsKKwkJCXZhbCArPSBkZWx0YTsKKwkJCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUlNJLCB2YWwpOworCQl9CiAJfQogCi0Ja3ZtX3g4Nl9vcHMtPmRlY2FjaGVfcmVncyh2Y3B1KTsKLQogCWlvLT5jb3VudCAtPSBpby0+Y3VyX2NvdW50OwogCWlvLT5jdXJfY291bnQgPSAwOwogCkBAIC0yMzEzLDYgKzIzNzksNyBAQAogCQkgIGludCBzaXplLCB1bnNpZ25lZCBwb3J0KQogewogCXN0cnVjdCBrdm1faW9fZGV2aWNlICpwaW9fZGV2OworCXVuc2lnbmVkIGxvbmcgdmFsOwogCiAJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lPOwogCXZjcHUtPnJ1bi0+aW8uZGlyZWN0aW9uID0gaW4gPyBLVk1fRVhJVF9JT19JTiA6IEtWTV9FWElUX0lPX09VVDsKQEAgLTIzMzMsOCArMjQwMCw4IEBACiAJCUtWTVRSQUNFXzJEKElPX1dSSVRFLCB2Y3B1LCB2Y3B1LT5ydW4tPmlvLnBvcnQsICh1MzIpc2l6ZSwKIAkJCSAgICBoYW5kbGVyKTsKIAotCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwotCW1lbWNweSh2Y3B1LT5hcmNoLnBpb19kYXRhLCAmdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdLCA0KTsKKwl2YWwgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKKwltZW1jcHkodmNwdS0+YXJjaC5waW9fZGF0YSwgJnZhbCwgNCk7CiAKIAlrdm1feDg2X29wcy0+c2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKIApAQCAtMjQ5MiwxMSArMjU1OSw2IEBACiAJS1ZNVFJBQ0VfMEQoSExULCB2Y3B1LCBoYW5kbGVyKTsKIAlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkgewogCQl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX0hBTFRFRDsKLQkJdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7Ci0JCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgIT0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFKQotCQkJcmV0dXJuIC1FSU5UUjsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKIAkJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0hMVDsKQEAgLTI1MTksMTMgKzI1ODEsMTEgQEAKIAl1bnNpZ25lZCBsb25nIG5yLCBhMCwgYTEsIGEyLCBhMywgcmV0OwogCWludCByID0gMTsKIAotCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwotCi0JbnIgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JYTAgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JCWF07Ci0JYTEgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JYTIgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JEWF07Ci0JYTMgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTSV07CisJbnIgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKKwlhMCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQlgpOworCWExID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JDWCk7CisJYTIgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkRYKTsKKwlhMyA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SU0kpOwogCiAJS1ZNVFJBQ0VfMUQoVk1NQ0FMTCwgdmNwdSwgKHUzMiluciwgaGFuZGxlcik7CiAKQEAgLTI1NDgsOCArMjYwOCw3IEBACiAJCXJldCA9IC1LVk1fRU5PU1lTOwogCQlicmVhazsKIAl9Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdID0gcmV0OwotCWt2bV94ODZfb3BzLT5kZWNhY2hlX3JlZ3ModmNwdSk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQVgsIHJldCk7CiAJKyt2Y3B1LT5zdGF0Lmh5cGVyY2FsbHM7CiAJcmV0dXJuIHI7CiB9CkBAIC0yNTU5LDYgKzI2MTgsNyBAQAogewogCWNoYXIgaW5zdHJ1Y3Rpb25bM107CiAJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyByaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CiAKIAogCS8qCkBAIC0yNTY4LDkgKzI2MjgsOCBAQAogCSAqLwogCWt2bV9tbXVfemFwX2FsbCh2Y3B1LT5rdm0pOwogCi0Ja3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7CiAJa3ZtX3g4Nl9vcHMtPnBhdGNoX2h5cGVyY2FsbCh2Y3B1LCBpbnN0cnVjdGlvbik7Ci0JaWYgKGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKHZjcHUtPmFyY2gucmlwLCBpbnN0cnVjdGlvbiwgMywgdmNwdSkKKwlpZiAoZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQocmlwLCBpbnN0cnVjdGlvbiwgMywgdmNwdSkKIAkgICAgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0ID0gLUVGQVVMVDsKIApAQCAtMjcwMCwxMyArMjc1OSwxMiBAQAogCXUzMiBmdW5jdGlvbiwgaW5kZXg7CiAJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmUsICpiZXN0OwogCi0Ja3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7Ci0JZnVuY3Rpb24gPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JaW5kZXggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdID0gMDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JCWF0gPSAwOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSA9IDA7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdID0gMDsKKwlmdW5jdGlvbiA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQVgpOworCWluZGV4ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JDWCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQVgsIDApOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkJYLCAwKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JDWCwgMCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SRFgsIDApOwogCWJlc3QgPSBOVUxMOwogCWZvciAoaSA9IDA7IGkgPCB2Y3B1LT5hcmNoLmNwdWlkX25lbnQ7ICsraSkgewogCQllID0gJnZjcHUtPmFyY2guY3B1aWRfZW50cmllc1tpXTsKQEAgLTI3MjQsMTggKzI3ODIsMTcgQEAKIAkJCQliZXN0ID0gZTsKIAl9CiAJaWYgKGJlc3QpIHsKLQkJdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdID0gYmVzdC0+ZWF4OwotCQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JCWF0gPSBiZXN0LT5lYng7Ci0JCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSA9IGJlc3QtPmVjeDsKLQkJdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdID0gYmVzdC0+ZWR4OworCQlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JBWCwgYmVzdC0+ZWF4KTsKKwkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQlgsIGJlc3QtPmVieCk7CisJCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkNYLCBiZXN0LT5lY3gpOworCQlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JEWCwgYmVzdC0+ZWR4KTsKIAl9Ci0Ja3ZtX3g4Nl9vcHMtPmRlY2FjaGVfcmVncyh2Y3B1KTsKIAlrdm1feDg2X29wcy0+c2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKIAlLVk1UUkFDRV81RChDUFVJRCwgdmNwdSwgZnVuY3Rpb24sCi0JCSAgICAodTMyKXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSwKLQkJICAgICh1MzIpdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQlhdLAotCQkgICAgKHUzMil2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF0sCi0JCSAgICAodTMyKXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXSwgaGFuZGxlcik7CisJCSAgICAodTMyKWt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQVgpLAorCQkgICAgKHUzMilrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkJYKSwKKwkJICAgICh1MzIpa3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JDWCksCisJCSAgICAodTMyKWt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SRFgpLCBoYW5kbGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9lbXVsYXRlX2NwdWlkKTsKIApAQCAtMjc3Niw5ICsyODMzLDcgQEAKIAlpZiAoIWFwaWMgfHwgIWFwaWMtPnZhcGljX2FkZHIpCiAJCXJldHVybjsKIAotCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlwYWdlID0gZ2ZuX3RvX3BhZ2UodmNwdS0+a3ZtLCBhcGljLT52YXBpY19hZGRyID4+IFBBR0VfU0hJRlQpOwotCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAl2Y3B1LT5hcmNoLmFwaWMtPnZhcGljX3BhZ2UgPSBwYWdlOwogfQpAQCAtMjc5NiwyOCArMjg1MSwxMCBAQAogCXVwX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgX192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQorc3RhdGljIGludCB2Y3B1X2VudGVyX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CiAJaW50IHI7CiAKLQlpZiAodW5saWtlbHkodmNwdS0+YXJjaC5tcF9zdGF0ZSA9PSBLVk1fTVBfU1RBVEVfU0lQSV9SRUNFSVZFRCkpIHsKLQkJcHJfZGVidWcoInZjcHUgJWQgcmVjZWl2ZWQgc2lwaSB3aXRoIHZlY3RvciAjICV4XG4iLAotCQkgICAgICAgdmNwdS0+dmNwdV9pZCwgdmNwdS0+YXJjaC5zaXBpX3ZlY3Rvcik7Ci0JCWt2bV9sYXBpY19yZXNldCh2Y3B1KTsKLQkJciA9IGt2bV94ODZfb3BzLT52Y3B1X3Jlc2V0KHZjcHUpOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCQl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOwotCX0KLQotCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQl2YXBpY19lbnRlcih2Y3B1KTsKLQotcHJlZW1wdGVkOgotCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkKQotCQlrdm1feDg2X29wcy0+Z3Vlc3RfZGVidWdfcHJlKHZjcHUpOwotCi1hZ2FpbjoKIAlpZiAodmNwdS0+cmVxdWVzdHMpCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9NTVVfUkVMT0FELCAmdmNwdS0+cmVxdWVzdHMpKQogCQkJa3ZtX21tdV91bmxvYWQodmNwdSk7CkBAIC0yODI5LDYgKzI4NjYsOCBAQAogCWlmICh2Y3B1LT5yZXF1ZXN0cykgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfTUlHUkFURV9USU1FUiwgJnZjcHUtPnJlcXVlc3RzKSkKIAkJCV9fa3ZtX21pZ3JhdGVfdGltZXJzKHZjcHUpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfTU1VX1NZTkMsICZ2Y3B1LT5yZXF1ZXN0cykpCisJCQlrdm1fbW11X3N5bmNfcm9vdHModmNwdSk7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9UTEJfRkxVU0gsICZ2Y3B1LT5yZXF1ZXN0cykpCiAJCQlrdm1feDg2X29wcy0+dGxiX2ZsdXNoKHZjcHUpOwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfUkVQT1JUX1RQUl9BQ0NFU1MsCkBAIC0yODU0LDIxICsyODkzLDE1IEBACiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JaWYgKHZjcHUtPnJlcXVlc3RzIHx8IG5lZWRfcmVzY2hlZCgpKSB7CisJaWYgKHZjcHUtPnJlcXVlc3RzIHx8IG5lZWRfcmVzY2hlZCgpIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJciA9IDE7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JCXIgPSAtRUlOVFI7Ci0JCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKLQkJKyt2Y3B1LT5zdGF0LnNpZ25hbF9leGl0czsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkKQorCQlrdm1feDg2X29wcy0+Z3Vlc3RfZGVidWdfcHJlKHZjcHUpOwogCiAJdmNwdS0+Z3Vlc3RfbW9kZSA9IDE7CiAJLyoKQEAgLTI5MTcsOCArMjk1MCw4IEBACiAJICogUHJvZmlsZSBLVk0gZXhpdCBSSVBzOgogCSAqLwogCWlmICh1bmxpa2VseShwcm9mX29uID09IEtWTV9QUk9GSUxJTkcpKSB7Ci0JCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwotCQlwcm9maWxlX2hpdChLVk1fUFJPRklMSU5HLCAodm9pZCAqKXZjcHUtPmFyY2gucmlwKTsKKwkJdW5zaWduZWQgbG9uZyByaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CisJCXByb2ZpbGVfaGl0KEtWTV9QUk9GSUxJTkcsICh2b2lkICopcmlwKTsKIAl9CiAKIAlpZiAodmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyAmJiBrdm1feDg2X29wcy0+ZXhjZXB0aW9uX2luamVjdGVkKHZjcHUpKQpAQCAtMjkyNywyNiArMjk2MCw2MyBAQAogCWt2bV9sYXBpY19zeW5jX2Zyb21fdmFwaWModmNwdSk7CiAKIAlyID0ga3ZtX3g4Nl9vcHMtPmhhbmRsZV9leGl0KGt2bV9ydW4sIHZjcHUpOwotCi0JaWYgKHIgPiAwKSB7Ci0JCWlmIChkbV9yZXF1ZXN0X2Zvcl9pcnFfaW5qZWN0aW9uKHZjcHUsIGt2bV9ydW4pKSB7Ci0JCQlyID0gLUVJTlRSOwotCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJKyt2Y3B1LT5zdGF0LnJlcXVlc3RfaXJxX2V4aXRzOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCWdvdG8gYWdhaW47Ci0JfQotCiBvdXQ6Ci0JdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQlpZiAociA+IDApIHsKLQkJa3ZtX3Jlc2NoZWQodmNwdSk7Ci0JCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQkJZ290byBwcmVlbXB0ZWQ7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCWludCByOworCisJaWYgKHVubGlrZWx5KHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX1NJUElfUkVDRUlWRUQpKSB7CisJCXByX2RlYnVnKCJ2Y3B1ICVkIHJlY2VpdmVkIHNpcGkgd2l0aCB2ZWN0b3IgIyAleFxuIiwKKwkJCSB2Y3B1LT52Y3B1X2lkLCB2Y3B1LT5hcmNoLnNpcGlfdmVjdG9yKTsKKwkJa3ZtX2xhcGljX3Jlc2V0KHZjcHUpOworCQlyID0ga3ZtX3g4Nl9vcHMtPnZjcHVfcmVzZXQodmNwdSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCXZjcHUtPmFyY2gubXBfc3RhdGUgPSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU7CiAJfQogCisJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOworCXZhcGljX2VudGVyKHZjcHUpOworCisJciA9IDE7CisJd2hpbGUgKHIgPiAwKSB7CisJCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9SVU5OQUJMRSkKKwkJCXIgPSB2Y3B1X2VudGVyX2d1ZXN0KHZjcHUsIGt2bV9ydW4pOworCQllbHNlIHsKKwkJCXVwX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7CisJCQlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKKwkJCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9VTkhBTFQsICZ2Y3B1LT5yZXF1ZXN0cykpCisJCQkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX0hBTFRFRCkKKwkJCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9CisJCQkJCQkJS1ZNX01QX1NUQVRFX1JVTk5BQkxFOworCQkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgIT0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFKQorCQkJCXIgPSAtRUlOVFI7CisJCX0KKworCQlpZiAociA+IDApIHsKKwkJCWlmIChkbV9yZXF1ZXN0X2Zvcl9pcnFfaW5qZWN0aW9uKHZjcHUsIGt2bV9ydW4pKSB7CisJCQkJciA9IC1FSU5UUjsKKwkJCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQkJKyt2Y3B1LT5zdGF0LnJlcXVlc3RfaXJxX2V4aXRzOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJciA9IC1FSU5UUjsKKwkJCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQkJKyt2Y3B1LT5zdGF0LnNpZ25hbF9leGl0czsKKwkJCX0KKwkJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJCXVwX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7CisJCQkJa3ZtX3Jlc2NoZWQodmNwdSk7CisJCQkJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOworCQkJfQorCQl9CisJfQorCisJdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIAlwb3N0X2t2bV9ydW5fc2F2ZSh2Y3B1LCBrdm1fcnVuKTsKIAogCXZhcGljX2V4aXQodmNwdSk7CkBAIC0yOTY2LDYgKzMwMzYsNyBAQAogCiAJaWYgKHVubGlrZWx5KHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX1VOSU5JVElBTElaRUQpKSB7CiAJCWt2bV92Y3B1X2Jsb2NrKHZjcHUpOworCQljbGVhcl9iaXQoS1ZNX1JFUV9VTkhBTFQsICZ2Y3B1LT5yZXF1ZXN0cyk7CiAJCXIgPSAtRUFHQUlOOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yOTk5LDExICszMDcwLDkgQEAKIAkJfQogCX0KICNlbmRpZgotCWlmIChrdm1fcnVuLT5leGl0X3JlYXNvbiA9PSBLVk1fRVhJVF9IWVBFUkNBTEwpIHsKLQkJa3ZtX3g4Nl9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7Ci0JCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSA9IGt2bV9ydW4tPmh5cGVyY2FsbC5yZXQ7Ci0JCWt2bV94ODZfb3BzLT5kZWNhY2hlX3JlZ3ModmNwdSk7Ci0JfQorCWlmIChrdm1fcnVuLT5leGl0X3JlYXNvbiA9PSBLVk1fRVhJVF9IWVBFUkNBTEwpCisJCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkFYLAorCQkJCSAgICAga3ZtX3J1bi0+aHlwZXJjYWxsLnJldCk7CiAKIAlyID0gX192Y3B1X3J1bih2Y3B1LCBrdm1fcnVuKTsKIApAQCAtMzAxOSwyOCArMzA4OCwyNiBAQAogewogCXZjcHVfbG9hZCh2Y3B1KTsKIAotCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwotCi0JcmVncy0+cmF4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXJlZ3MtPnJieCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJYXTsKLQlyZWdzLT5yY3ggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JcmVncy0+cmR4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCXJlZ3MtPnJzaSA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNJXTsKLQlyZWdzLT5yZGkgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JESV07Ci0JcmVncy0+cnNwID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU1BdOwotCXJlZ3MtPnJicCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJQXTsKKwlyZWdzLT5yYXggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKKwlyZWdzLT5yYnggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkJYKTsKKwlyZWdzLT5yY3ggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKKwlyZWdzLT5yZHggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkRYKTsKKwlyZWdzLT5yc2kgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNJKTsKKwlyZWdzLT5yZGkgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkRJKTsKKwlyZWdzLT5yc3AgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNQKTsKKwlyZWdzLT5yYnAgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkJQKTsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JcmVncy0+cjggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1I4XTsKLQlyZWdzLT5yOSA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUjldOwotCXJlZ3MtPnIxMCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUjEwXTsKLQlyZWdzLT5yMTEgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1IxMV07Ci0JcmVncy0+cjEyID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SMTJdOwotCXJlZ3MtPnIxMyA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUjEzXTsKLQlyZWdzLT5yMTQgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1IxNF07Ci0JcmVncy0+cjE1ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SMTVdOworCXJlZ3MtPnI4ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1I4KTsKKwlyZWdzLT5yOSA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SOSk7CisJcmVncy0+cjEwID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxMCk7CisJcmVncy0+cjExID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxMSk7CisJcmVncy0+cjEyID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxMik7CisJcmVncy0+cjEzID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxMyk7CisJcmVncy0+cjE0ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxNCk7CisJcmVncy0+cjE1ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1IxNSk7CiAjZW5kaWYKIAotCXJlZ3MtPnJpcCA9IHZjcHUtPmFyY2gucmlwOworCXJlZ3MtPnJpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAlyZWdzLT5yZmxhZ3MgPSBrdm1feDg2X29wcy0+Z2V0X3JmbGFncyh2Y3B1KTsKIAogCS8qCkBAIC0zMDU4LDI5ICszMTI1LDI5IEBACiB7CiAJdmNwdV9sb2FkKHZjcHUpOwogCi0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdID0gcmVncy0+cmF4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJYXSA9IHJlZ3MtPnJieDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF0gPSByZWdzLT5yY3g7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdID0gcmVncy0+cmR4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNJXSA9IHJlZ3MtPnJzaTsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JESV0gPSByZWdzLT5yZGk7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU1BdID0gcmVncy0+cnNwOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJQXSA9IHJlZ3MtPnJicDsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JBWCwgcmVncy0+cmF4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JCWCwgcmVncy0+cmJ4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JDWCwgcmVncy0+cmN4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JEWCwgcmVncy0+cmR4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JTSSwgcmVncy0+cnNpKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JESSwgcmVncy0+cmRpKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JTUCwgcmVncy0+cnNwKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JCUCwgcmVncy0+cmJwKTsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SOF0gPSByZWdzLT5yODsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1I5XSA9IHJlZ3MtPnI5OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUjEwXSA9IHJlZ3MtPnIxMDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1IxMV0gPSByZWdzLT5yMTE7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SMTJdID0gcmVncy0+cjEyOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUjEzXSA9IHJlZ3MtPnIxMzsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1IxNF0gPSByZWdzLT5yMTQ7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SMTVdID0gcmVncy0+cjE1OworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUjgsIHJlZ3MtPnI4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1I5LCByZWdzLT5yOSk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTAsIHJlZ3MtPnIxMCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTEsIHJlZ3MtPnIxMSk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTIsIHJlZ3MtPnIxMik7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTMsIHJlZ3MtPnIxMyk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTQsIHJlZ3MtPnIxNCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SMTUsIHJlZ3MtPnIxNSk7CisKICNlbmRpZgogCi0JdmNwdS0+YXJjaC5yaXAgPSByZWdzLT5yaXA7CisJa3ZtX3JpcF93cml0ZSh2Y3B1LCByZWdzLT5yaXApOwogCWt2bV94ODZfb3BzLT5zZXRfcmZsYWdzKHZjcHUsIHJlZ3MtPnJmbGFncyk7CiAKLQlrdm1feDg2X29wcy0+ZGVjYWNoZV9yZWdzKHZjcHUpOwogCiAJdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyA9IGZhbHNlOwogCkBAIC0zMjk0LDExICszMzYxLDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX2xvYWRfcmVhbG1vZGVfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBzZWxlY3RvciwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgc2VndmFyID0geworCQkuYmFzZSA9IHNlbGVjdG9yIDw8IDQsCisJCS5saW1pdCA9IDB4ZmZmZiwKKwkJLnNlbGVjdG9yID0gc2VsZWN0b3IsCisJCS50eXBlID0gMywKKwkJLnByZXNlbnQgPSAxLAorCQkuZHBsID0gMywKKwkJLmRiID0gMCwKKwkJLnMgPSAxLAorCQkubCA9IDAsCisJCS5nID0gMCwKKwkJLmF2bCA9IDAsCisJCS51bnVzYWJsZSA9IDAsCisJfTsKKwlrdm1feDg2X29wcy0+c2V0X3NlZ21lbnQodmNwdSwgJnNlZ3Zhciwgc2VnKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGt2bV9sb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBzZWxlY3RvciwKIAkJCQlpbnQgdHlwZV9iaXRzLCBpbnQgc2VnKQogewogCXN0cnVjdCBrdm1fc2VnbWVudCBrdm1fc2VnOwogCisJaWYgKCEodmNwdS0+YXJjaC5jcjAgJiBYODZfQ1IwX1BFKSkKKwkJcmV0dXJuIGt2bV9sb2FkX3JlYWxtb2RlX3NlZ21lbnQodmNwdSwgc2VsZWN0b3IsIHNlZyk7CiAJaWYgKGxvYWRfc2VnbWVudF9kZXNjcmlwdG9yX3RvX2t2bV9kZXNjdCh2Y3B1LCBzZWxlY3RvciwgJmt2bV9zZWcpKQogCQlyZXR1cm4gMTsKIAlrdm1fc2VnLnR5cGUgfD0gdHlwZV9iaXRzOwpAQCAtMzMxNiwxNyArMzQwNSwxNiBAQAogCQkJCXN0cnVjdCB0c3Nfc2VnbWVudF8zMiAqdHNzKQogewogCXRzcy0+Y3IzID0gdmNwdS0+YXJjaC5jcjM7Ci0JdHNzLT5laXAgPSB2Y3B1LT5hcmNoLnJpcDsKKwl0c3MtPmVpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAl0c3MtPmVmbGFncyA9IGt2bV94ODZfb3BzLT5nZXRfcmZsYWdzKHZjcHUpOwotCXRzcy0+ZWF4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXRzcy0+ZWN4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQ1hdOwotCXRzcy0+ZWR4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCXRzcy0+ZWJ4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQlhdOwotCXRzcy0+ZXNwID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU1BdOwotCXRzcy0+ZWJwID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQlBdOwotCXRzcy0+ZXNpID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU0ldOwotCXRzcy0+ZWRpID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SREldOwotCisJdHNzLT5lYXggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKTsKKwl0c3MtPmVjeCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQ1gpOworCXRzcy0+ZWR4ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JEWCk7CisJdHNzLT5lYnggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkJYKTsKKwl0c3MtPmVzcCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SU1ApOworCXRzcy0+ZWJwID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JCUCk7CisJdHNzLT5lc2kgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNJKTsKKwl0c3MtPmVkaSA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SREkpOwogCXRzcy0+ZXMgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfRVMpOwogCXRzcy0+Y3MgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfQ1MpOwogCXRzcy0+c3MgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfU1MpOwpAQCAtMzM0MiwxNyArMzQzMCwxNyBAQAogewogCWt2bV9zZXRfY3IzKHZjcHUsIHRzcy0+Y3IzKTsKIAotCXZjcHUtPmFyY2gucmlwID0gdHNzLT5laXA7CisJa3ZtX3JpcF93cml0ZSh2Y3B1LCB0c3MtPmVpcCk7CiAJa3ZtX3g4Nl9vcHMtPnNldF9yZmxhZ3ModmNwdSwgdHNzLT5lZmxhZ3MgfCAyKTsKIAotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+ZWF4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSA9IHRzcy0+ZWN4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXSA9IHRzcy0+ZWR4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJYXSA9IHRzcy0+ZWJ4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHRzcy0+ZXNwOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJQXSA9IHRzcy0+ZWJwOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNJXSA9IHRzcy0+ZXNpOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRJXSA9IHRzcy0+ZWRpOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkFYLCB0c3MtPmVheCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQ1gsIHRzcy0+ZWN4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JEWCwgdHNzLT5lZHgpOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkJYLCB0c3MtPmVieCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SU1AsIHRzcy0+ZXNwKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JCUCwgdHNzLT5lYnApOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUlNJLCB0c3MtPmVzaSk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SREksIHRzcy0+ZWRpKTsKIAogCWlmIChrdm1fbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IodmNwdSwgdHNzLT5sZHRfc2VsZWN0b3IsIDAsIFZDUFVfU1JFR19MRFRSKSkKIAkJcmV0dXJuIDE7CkBAIC0zMzgwLDE2ICszNDY4LDE2IEBACiBzdGF0aWMgdm9pZCBzYXZlX3N0YXRlX3RvX3RzczE2KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQlzdHJ1Y3QgdHNzX3NlZ21lbnRfMTYgKnRzcykKIHsKLQl0c3MtPmlwID0gdmNwdS0+YXJjaC5yaXA7CisJdHNzLT5pcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKIAl0c3MtPmZsYWcgPSBrdm1feDg2X29wcy0+Z2V0X3JmbGFncyh2Y3B1KTsKLQl0c3MtPmF4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCXRzcy0+Y3ggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JdHNzLT5keCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXTsKLQl0c3MtPmJ4ID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQlhdOwotCXRzcy0+c3AgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF07Ci0JdHNzLT5icCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkJQXTsKLQl0c3MtPnNpID0gdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU0ldOwotCXRzcy0+ZGkgPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JESV07CisJdHNzLT5heCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQVgpOworCXRzcy0+Y3ggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKKwl0c3MtPmR4ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JEWCk7CisJdHNzLT5ieCA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SQlgpOworCXRzcy0+c3AgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUlNQKTsKKwl0c3MtPmJwID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JCUCk7CisJdHNzLT5zaSA9IGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIFZDUFVfUkVHU19SU0kpOworCXRzcy0+ZGkgPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkRJKTsKIAogCXRzcy0+ZXMgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfRVMpOwogCXRzcy0+Y3MgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfQ1MpOwpAQCAtMzQwMiwxNiArMzQ5MCwxNiBAQAogc3RhdGljIGludCBsb2FkX3N0YXRlX2Zyb21fdHNzMTYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSBzdHJ1Y3QgdHNzX3NlZ21lbnRfMTYgKnRzcykKIHsKLQl2Y3B1LT5hcmNoLnJpcCA9IHRzcy0+aXA7CisJa3ZtX3JpcF93cml0ZSh2Y3B1LCB0c3MtPmlwKTsKIAlrdm1feDg2X29wcy0+c2V0X3JmbGFncyh2Y3B1LCB0c3MtPmZsYWcgfCAyKTsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSB0c3MtPmF4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkNYXSA9IHRzcy0+Y3g7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SRFhdID0gdHNzLT5keDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JCWF0gPSB0c3MtPmJ4OwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHRzcy0+c3A7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQlBdID0gdHNzLT5icDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTSV0gPSB0c3MtPnNpOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRJXSA9IHRzcy0+ZGk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQVgsIHRzcy0+YXgpOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkNYLCB0c3MtPmN4KTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JEWCwgdHNzLT5keCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SQlgsIHRzcy0+YngpOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUlNQLCB0c3MtPnNwKTsKKwlrdm1fcmVnaXN0ZXJfd3JpdGUodmNwdSwgVkNQVV9SRUdTX1JCUCwgdHNzLT5icCk7CisJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SU0ksIHRzcy0+c2kpOworCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCBWQ1BVX1JFR1NfUkRJLCB0c3MtPmRpKTsKIAogCWlmIChrdm1fbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IodmNwdSwgdHNzLT5sZHQsIDAsIFZDUFVfU1JFR19MRFRSKSkKIAkJcmV0dXJuIDE7CkBAIC0zNTM0LDcgKzM2MjIsNiBAQAogCX0KIAogCWt2bV94ODZfb3BzLT5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwotCWt2bV94ODZfb3BzLT5jYWNoZV9yZWdzKHZjcHUpOwogCiAJaWYgKG5zZWdfZGVzYy50eXBlICYgOCkKIAkJcmV0ID0ga3ZtX3Rhc2tfc3dpdGNoXzMyKHZjcHUsIHRzc19zZWxlY3Rvciwgb2xkX3Rzc19iYXNlLApAQCAtMzU1OSw3ICszNjQ2LDYgQEAKIAl0cl9zZWcudHlwZSA9IDExOwogCWt2bV9zZXRfc2VnbWVudCh2Y3B1LCAmdHJfc2VnLCBWQ1BVX1NSRUdfVFIpOwogb3V0OgotCWt2bV94ODZfb3BzLT5kZWNhY2hlX3JlZ3ModmNwdSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV90YXNrX3N3aXRjaCk7CkBAIC0zNjIyLDYgKzM3MDgsNyBAQAogCQkJcHJfZGVidWcoIlNldCBiYWNrIHBlbmRpbmcgaXJxICVkXG4iLAogCQkJCSBwZW5kaW5nX3ZlYyk7CiAJCX0KKwkJa3ZtX3BpY19jbGVhcl9pc3JfYWNrKHZjcHUtPmt2bSk7CiAJfQogCiAJa3ZtX3NldF9zZWdtZW50KHZjcHUsICZzcmVncy0+Y3MsIFZDUFVfU1JFR19DUyk7CkBAIC0zNjM0LDYgKzM3MjEsMTIgQEAKIAlrdm1fc2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT50ciwgVkNQVV9TUkVHX1RSKTsKIAlrdm1fc2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT5sZHQsIFZDUFVfU1JFR19MRFRSKTsKIAorCS8qIE9sZGVyIHVzZXJzcGFjZSB3b24ndCB1bmhhbHQgdGhlIHZjcHUgb24gcmVzZXQuICovCisJaWYgKHZjcHUtPnZjcHVfaWQgPT0gMCAmJiBrdm1fcmlwX3JlYWQodmNwdSkgPT0gMHhmZmYwICYmCisJICAgIHNyZWdzLT5jcy5zZWxlY3RvciA9PSAweGYwMDAgJiYgc3JlZ3MtPmNzLmJhc2UgPT0gMHhmZmZmMDAwMCAmJgorCSAgICAhKHZjcHUtPmFyY2guY3IwICYgWDg2X0NSMF9QRSkpCisJCXZjcHUtPmFyY2gubXBfc3RhdGUgPSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU7CisKIAl2Y3B1X3B1dCh2Y3B1KTsKIAogCXJldHVybiAwOwpAQCAtMzkxOCw2ICs0MDExLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOworCUlOSVRfTElTVF9IRUFEKCZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQpOwogCiAJcmV0dXJuIGt2bTsKIH0KQEAgLTM5NTAsNiArNDA0NCw4IEBACiAKIHZvaWQga3ZtX2FyY2hfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCiB7CisJa3ZtX2lvbW11X3VubWFwX2d1ZXN0KGt2bSk7CisJa3ZtX2ZyZWVfYWxsX2Fzc2lnbmVkX2RldmljZXMoa3ZtKTsKIAlrdm1fZnJlZV9waXQoa3ZtKTsKIAlrZnJlZShrdm0tPmFyY2gudnBpYyk7CiAJa2ZyZWUoa3ZtLT5hcmNoLnZpb2FwaWMpOwpAQCAtMzk4MSw3ICs0MDc3LDcgQEAKIAkJCXVzZXJzcGFjZV9hZGRyID0gZG9fbW1hcChOVUxMLCAwLAogCQkJCQkJIG5wYWdlcyAqIFBBR0VfU0laRSwKIAkJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCQkJIE1BUF9TSEFSRUQgfCBNQVBfQU5PTllNT1VTLAorCQkJCQkJIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywKIAkJCQkJCSAwKTsKIAkJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmggYi9hcmNoL3g4Ni9rdm0veDg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0YmU3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2t2bS94ODYuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIEFSQ0hfWDg2X0tWTV9YODZfSAorI2RlZmluZSBBUkNIX1g4Nl9LVk1fWDg2X0gKKworI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYXJfZXhjZXB0aW9uX3F1ZXVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fcXVldWVfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTggdmVjdG9yKQoreworCXZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcgPSB0cnVlOworCXZjcHUtPmFyY2guaW50ZXJydXB0Lm5yID0gdmVjdG9yOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFyX2ludGVycnVwdF9xdWV1ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZyA9IGZhbHNlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODZfZW11bGF0ZS5jIGIvYXJjaC94ODYva3ZtL3g4Nl9lbXVsYXRlLmMKaW5kZXggZjJmOTA0Ni4uZWEwNTExNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3g4Nl9lbXVsYXRlLmMKKysrIGIvYXJjaC94ODYva3ZtL3g4Nl9lbXVsYXRlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNkZWZpbmUgRFBSSU5URihfZiwgX2EgLi4uKSBwcmludGYoX2YgLCAjIyBfYSkKICNlbHNlCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlICJrdm1fY2FjaGVfcmVncy5oIgogI2RlZmluZSBEUFJJTlRGKHguLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00NiwyNSArNDcsMjYgQEAKICNkZWZpbmUgSW1wbGljaXRPcHMgKDE8PDEpCS8qIEltcGxpY2l0IGluIG9wY29kZS4gTm8gZ2VuZXJpYyBkZWNvZGUuICovCiAjZGVmaW5lIERzdFJlZyAgICAgICgyPDwxKQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwogI2RlZmluZSBEc3RNZW0gICAgICAoMzw8MSkJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIERzdE1hc2sgICAgICgzPDwxKQorI2RlZmluZSBEc3RBY2MgICAgICAoNDw8MSkgICAgICAvKiBEZXN0aW5hdGlvbiBBY2N1bXVsYXRvciAqLworI2RlZmluZSBEc3RNYXNrICAgICAoNzw8MSkKIC8qIFNvdXJjZSBvcGVyYW5kIHR5cGUuICovCi0jZGVmaW5lIFNyY05vbmUgICAgICgwPDwzKQkvKiBObyBzb3VyY2Ugb3BlcmFuZC4gKi8KLSNkZWZpbmUgU3JjSW1wbGljaXQgKDA8PDMpCS8qIFNvdXJjZSBvcGVyYW5kIGlzIGltcGxpY2l0IGluIHRoZSBvcGNvZGUuICovCi0jZGVmaW5lIFNyY1JlZyAgICAgICgxPDwzKQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0gICAgICAoMjw8MykJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY01lbTE2ICAgICgzPDwzKQkvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KLSNkZWZpbmUgU3JjTWVtMzIgICAgKDQ8PDMpCS8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLwotI2RlZmluZSBTcmNJbW0gICAgICAoNTw8MykJLyogSW1tZWRpYXRlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY0ltbUJ5dGUgICg2PDwzKQkvKiA4LWJpdCBzaWduLWV4dGVuZGVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNYXNrICAgICAoNzw8MykKKyNkZWZpbmUgU3JjTm9uZSAgICAgKDA8PDQpCS8qIE5vIHNvdXJjZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNJbXBsaWNpdCAoMDw8NCkJLyogU291cmNlIG9wZXJhbmQgaXMgaW1wbGljaXQgaW4gdGhlIG9wY29kZS4gKi8KKyNkZWZpbmUgU3JjUmVnICAgICAgKDE8PDQpCS8qIFJlZ2lzdGVyIG9wZXJhbmQuICovCisjZGVmaW5lIFNyY01lbSAgICAgICgyPDw0KQkvKiBNZW1vcnkgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjTWVtMTYgICAgKDM8PDQpCS8qIE1lbW9yeSBvcGVyYW5kICgxNi1iaXQpLiAqLworI2RlZmluZSBTcmNNZW0zMiAgICAoNDw8NCkJLyogTWVtb3J5IG9wZXJhbmQgKDMyLWJpdCkuICovCisjZGVmaW5lIFNyY0ltbSAgICAgICg1PDw0KQkvKiBJbW1lZGlhdGUgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjSW1tQnl0ZSAgKDY8PDQpCS8qIDgtYml0IHNpZ24tZXh0ZW5kZWQgaW1tZWRpYXRlIG9wZXJhbmQuICovCisjZGVmaW5lIFNyY01hc2sgICAgICg3PDw0KQogLyogR2VuZXJpYyBNb2RSTSBkZWNvZGUuICovCi0jZGVmaW5lIE1vZFJNICAgICAgICgxPDw2KQorI2RlZmluZSBNb2RSTSAgICAgICAoMTw8NykKIC8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KLSNkZWZpbmUgTW92ICAgICAgICAgKDE8PDcpCi0jZGVmaW5lIEJpdE9wICAgICAgICgxPDw4KQotI2RlZmluZSBNZW1BYnMgICAgICAoMTw8OSkgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEwKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KLSNkZWZpbmUgU3RhY2sgICAgICAgKDE8PDExKSAgICAgLyogU3RhY2sgaW5zdHJ1Y3Rpb24gKHB1c2gvcG9wKSAqLworI2RlZmluZSBNb3YgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgQml0T3AgICAgICAgKDE8PDkpCisjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMCkgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEyKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KKyNkZWZpbmUgU3RhY2sgICAgICAgKDE8PDEzKSAgICAgLyogU3RhY2sgaW5zdHJ1Y3Rpb24gKHB1c2gvcG9wKSAqLwogI2RlZmluZSBHcm91cCAgICAgICAoMTw8MTQpICAgICAvKiBCaXRzIDM6NSBvZiBtb2RybSBieXRlIGV4dGVuZCBvcGNvZGUgKi8KICNkZWZpbmUgR3JvdXBEdWFsICAgKDE8PDE1KSAgICAgLyogQWx0ZXJuYXRlIGRlY29kaW5nIG9mIG1vZCA9PSAzICovCiAjZGVmaW5lIEdyb3VwTWFzayAgIDB4ZmYgICAgICAgIC8qIEdyb3VwIG51bWJlciBzdG9yZWQgaW4gYml0cyAwOjcgKi8KQEAgLTk0LDcgKzk2LDcgQEAKIAkvKiAweDIwIC0gMHgyNyAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKIAlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCi0JU3JjSW1tQnl0ZSwgU3JjSW1tLCAwLCAwLAorCURzdEFjYyB8IFNyY0ltbUJ5dGUsIERzdEFjYyB8IFNyY0ltbSwgMCwgMCwKIAkvKiAweDI4IC0gMHgyRiAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKIAlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCkBAIC0xMDYsNyArMTA4LDggQEAKIAkvKiAweDM4IC0gMHgzRiAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKIAlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCi0JMCwgMCwgMCwgMCwKKwlCeXRlT3AgfCBEc3RBY2MgfCBTcmNJbW0sIERzdEFjYyB8IFNyY0ltbSwKKwkwLCAwLAogCS8qIDB4NDAgLSAweDQ3ICovCiAJRHN0UmVnLCBEc3RSZWcsIERzdFJlZywgRHN0UmVnLCBEc3RSZWcsIERzdFJlZywgRHN0UmVnLCBEc3RSZWcsCiAJLyogMHg0OCAtIDB4NEYgKi8KQEAgLTE1Myw5ICsxNTYsMTYgQEAKIAkwLCAwLCBCeXRlT3AgfCBJbXBsaWNpdE9wcyB8IE1vdiB8IFN0cmluZywgSW1wbGljaXRPcHMgfCBNb3YgfCBTdHJpbmcsCiAJQnl0ZU9wIHwgSW1wbGljaXRPcHMgfCBNb3YgfCBTdHJpbmcsIEltcGxpY2l0T3BzIHwgTW92IHwgU3RyaW5nLAogCUJ5dGVPcCB8IEltcGxpY2l0T3BzIHwgU3RyaW5nLCBJbXBsaWNpdE9wcyB8IFN0cmluZywKLQkvKiAweEIwIC0gMHhCRiAqLwotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JRHN0UmVnIHwgU3JjSW1tIHwgTW92LCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4QjAgLSAweEI3ICovCisJQnl0ZU9wIHwgRHN0UmVnIHwgU3JjSW1tIHwgTW92LCBCeXRlT3AgfCBEc3RSZWcgfCBTcmNJbW0gfCBNb3YsCisJQnl0ZU9wIHwgRHN0UmVnIHwgU3JjSW1tIHwgTW92LCBCeXRlT3AgfCBEc3RSZWcgfCBTcmNJbW0gfCBNb3YsCisJQnl0ZU9wIHwgRHN0UmVnIHwgU3JjSW1tIHwgTW92LCBCeXRlT3AgfCBEc3RSZWcgfCBTcmNJbW0gfCBNb3YsCisJQnl0ZU9wIHwgRHN0UmVnIHwgU3JjSW1tIHwgTW92LCBCeXRlT3AgfCBEc3RSZWcgfCBTcmNJbW0gfCBNb3YsCisJLyogMHhCOCAtIDB4QkYgKi8KKwlEc3RSZWcgfCBTcmNJbW0gfCBNb3YsIERzdFJlZyB8IFNyY0ltbSB8IE1vdiwKKwlEc3RSZWcgfCBTcmNJbW0gfCBNb3YsIERzdFJlZyB8IFNyY0ltbSB8IE1vdiwKKwlEc3RSZWcgfCBTcmNJbW0gfCBNb3YsIERzdFJlZyB8IFNyY0ltbSB8IE1vdiwKKwlEc3RSZWcgfCBTcmNJbW0gfCBNb3YsIERzdFJlZyB8IFNyY0ltbSB8IE1vdiwKIAkvKiAweEMwIC0gMHhDNyAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNJbW1CeXRlIHwgTW9kUk0sCiAJMCwgSW1wbGljaXRPcHMgfCBTdGFjaywgMCwgMCwKQEAgLTE2OSwxNyArMTc5LDIwIEBACiAJLyogMHhEOCAtIDB4REYgKi8KIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogCS8qIDB4RTAgLSAweEU3ICovCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLAorCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAorCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAogCS8qIDB4RTggLSAweEVGICovCiAJSW1wbGljaXRPcHMgfCBTdGFjaywgU3JjSW1tIHwgSW1wbGljaXRPcHMsCiAJSW1wbGljaXRPcHMsIFNyY0ltbUJ5dGUgfCBJbXBsaWNpdE9wcywKLQkwLCAwLCAwLCAwLAorCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAorCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAogCS8qIDB4RjAgLSAweEY3ICovCiAJMCwgMCwgMCwgMCwKIAlJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsIEdyb3VwIHwgR3JvdXAzX0J5dGUsIEdyb3VwIHwgR3JvdXAzLAogCS8qIDB4RjggLSAweEZGICovCiAJSW1wbGljaXRPcHMsIDAsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywKLQkwLCAwLCBHcm91cCB8IEdyb3VwNCwgR3JvdXAgfCBHcm91cDUsCisJSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLCBHcm91cCB8IEdyb3VwNCwgR3JvdXAgfCBHcm91cDUsCiB9OwogCiBzdGF0aWMgdTE2IHR3b2J5dGVfdGFibGVbMjU2XSA9IHsKQEAgLTI2OCwxNSArMjgxLDE2IEBACiAJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sCiAJMCwgMCwgMCwgMCwKIAlbR3JvdXAzKjhdID0KLQlEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSB8IFNyY0ltbSwgMCwKLQlEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sIEJ5dGVPcCB8IERzdE1lbSB8IFNyY05vbmUgfCBNb2RSTSwKKwlEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgMCwKKwlEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sIERzdE1lbSB8IFNyY05vbmUgfCBNb2RSTSwKIAkwLCAwLCAwLCAwLAogCVtHcm91cDQqOF0gPQogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY05vbmUgfCBNb2RSTSwgQnl0ZU9wIHwgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLAogCTAsIDAsIDAsIDAsIDAsIDAsCiAJW0dyb3VwNSo4XSA9Ci0JRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sIDAsIDAsCi0JU3JjTWVtIHwgTW9kUk0sIDAsIFNyY01lbSB8IE1vZFJNIHwgU3RhY2ssIDAsCisJRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sCisJU3JjTWVtIHwgTW9kUk0gfCBTdGFjaywgMCwKKwlTcmNNZW0gfCBNb2RSTSB8IFN0YWNrLCAwLCBTcmNNZW0gfCBNb2RSTSB8IFN0YWNrLCAwLAogCVtHcm91cDcqOF0gPQogCTAsIDAsIE1vZFJNIHwgU3JjTWVtLCBNb2RSTSB8IFNyY01lbSwKIAlTcmNOb25lIHwgTW9kUk0gfCBEc3RNZW0gfCBNb3YsIDAsCkBAIC04MzksNyArODUzLDcgQEAKIAkvKiBTaGFkb3cgY29weSBvZiByZWdpc3RlciBzdGF0ZS4gQ29tbWl0dGVkIG9uIHN1Y2Nlc3NmdWwgZW11bGF0aW9uLiAqLwogCiAJbWVtc2V0KGMsIDAsIHNpemVvZihzdHJ1Y3QgZGVjb2RlX2NhY2hlKSk7Ci0JYy0+ZWlwID0gY3R4dC0+dmNwdS0+YXJjaC5yaXA7CisJYy0+ZWlwID0ga3ZtX3JpcF9yZWFkKGN0eHQtPnZjcHUpOwogCWN0eHQtPmNzX2Jhc2UgPSBzZWdfYmFzZShjdHh0LCBWQ1BVX1NSRUdfQ1MpOwogCW1lbWNweShjLT5yZWdzLCBjdHh0LT52Y3B1LT5hcmNoLnJlZ3MsIHNpemVvZiBjLT5yZWdzKTsKIApAQCAtMTA0OCw2ICsxMDYyLDIzIEBACiAJCX0KIAkJYy0+ZHN0LnR5cGUgPSBPUF9NRU07CiAJCWJyZWFrOworCWNhc2UgRHN0QWNjOgorCQljLT5kc3QudHlwZSA9IE9QX1JFRzsKKwkJYy0+ZHN0LmJ5dGVzID0gYy0+b3BfYnl0ZXM7CisJCWMtPmRzdC5wdHIgPSAmYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKKwkJc3dpdGNoIChjLT5vcF9ieXRlcykgeworCQkJY2FzZSAxOgorCQkJCWMtPmRzdC52YWwgPSAqKHU4ICopYy0+ZHN0LnB0cjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQljLT5kc3QudmFsID0gKih1MTYgKiljLT5kc3QucHRyOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWMtPmRzdC52YWwgPSAqKHUzMiAqKWMtPmRzdC5wdHI7CisJCQkJYnJlYWs7CisJCX0KKwkJYy0+ZHN0Lm9yaWdfdmFsID0gYy0+ZHN0LnZhbDsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKGMtPnJpcF9yZWxhdGl2ZSkKQEAgLTExNTEsNiArMTE4MiwxNCBAQAogCWNhc2UgMToJLyogZGVjICovCiAJCWVtdWxhdGVfMW9wKCJkZWMiLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOworCWNhc2UgMjogLyogY2FsbCBuZWFyIGFicyAqLyB7CisJCWxvbmcgaW50IG9sZF9laXA7CisJCW9sZF9laXAgPSBjLT5laXA7CisJCWMtPmVpcCA9IGMtPnNyYy52YWw7CisJCWMtPnNyYy52YWwgPSBvbGRfZWlwOworCQllbXVsYXRlX3B1c2goY3R4dCk7CisJCWJyZWFrOworCX0KIAljYXNlIDQ6IC8qIGptcCBhYnMgKi8KIAkJYy0+ZWlwID0gYy0+c3JjLnZhbDsKIAkJYnJlYWs7CkBAIC0xMjUxLDYgKzEyOTAsOCBAQAogCXU2NCBtc3JfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHNhdmVkX2VpcCA9IDA7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CisJdW5zaWduZWQgaW50IHBvcnQ7CisJaW50IGlvX2Rpcl9pbjsKIAlpbnQgcmMgPSAwOwogCiAJLyogU2hhZG93IGNvcHkgb2YgcmVnaXN0ZXIgc3RhdGUuIENvbW1pdHRlZCBvbiBzdWNjZXNzZnVsIGVtdWxhdGlvbi4KQEAgLTEyNjcsNyArMTMwOCw3IEBACiAJaWYgKGMtPnJlcF9wcmVmaXggJiYgKGMtPmQgJiBTdHJpbmcpKSB7CiAJCS8qIEFsbCBSRVAgcHJlZml4ZXMgaGF2ZSB0aGUgc2FtZSBmaXJzdCB0ZXJtaW5hdGlvbiBjb25kaXRpb24gKi8KIAkJaWYgKGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF0gPT0gMCkgewotCQkJY3R4dC0+dmNwdS0+YXJjaC5yaXAgPSBjLT5laXA7CisJCQlrdm1fcmlwX3dyaXRlKGN0eHQtPnZjcHUsIGMtPmVpcCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJLyogVGhlIHNlY29uZCB0ZXJtaW5hdGlvbiBjb25kaXRpb24gb25seSBhcHBsaWVzIGZvciBSRVBFCkBAIC0xMjgxLDE3ICsxMzIyLDE3IEBACiAJCQkJKGMtPmIgPT0gMHhhZSkgfHwgKGMtPmIgPT0gMHhhZikpIHsKIAkJCWlmICgoYy0+cmVwX3ByZWZpeCA9PSBSRVBFX1BSRUZJWCkgJiYKIAkJCQkoKGN0eHQtPmVmbGFncyAmIEVGTEdfWkYpID09IDApKSB7Ci0JCQkJCWN0eHQtPnZjcHUtPmFyY2gucmlwID0gYy0+ZWlwOworCQkJCQlrdm1fcmlwX3dyaXRlKGN0eHQtPnZjcHUsIGMtPmVpcCk7CiAJCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJCWlmICgoYy0+cmVwX3ByZWZpeCA9PSBSRVBORV9QUkVGSVgpICYmCiAJCQkJKChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSA9PSBFRkxHX1pGKSkgewotCQkJCWN0eHQtPnZjcHUtPmFyY2gucmlwID0gYy0+ZWlwOworCQkJCWt2bV9yaXBfd3JpdGUoY3R4dC0+dmNwdSwgYy0+ZWlwKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KIAkJYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXS0tOwotCQljLT5laXAgPSBjdHh0LT52Y3B1LT5hcmNoLnJpcDsKKwkJYy0+ZWlwID0ga3ZtX3JpcF9yZWFkKGN0eHQtPnZjcHUpOwogCX0KIAogCWlmIChjLT5zcmMudHlwZSA9PSBPUF9NRU0pIHsKQEAgLTEzNTEsMjcgKzEzOTIsMTAgQEAKIAkgICAgICBzYmI6CQkvKiBzYmIgKi8KIAkJZW11bGF0ZV8yb3BfU3JjVigic2JiIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMHgyMCAuLi4gMHgyMzoKKwljYXNlIDB4MjAgLi4uIDB4MjU6CiAJICAgICAgYW5kOgkJLyogYW5kICovCiAJCWVtdWxhdGVfMm9wX1NyY1YoImFuZCIsIGMtPnNyYywgYy0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwogCQlicmVhazsKLQljYXNlIDB4MjQ6ICAgICAgICAgICAgICAvKiBhbmQgYWwgaW1tOCAqLwotCQljLT5kc3QudHlwZSA9IE9QX1JFRzsKLQkJYy0+ZHN0LnB0ciA9ICZjLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQljLT5kc3QudmFsID0gKih1OCAqKWMtPmRzdC5wdHI7Ci0JCWMtPmRzdC5ieXRlcyA9IDE7Ci0JCWMtPmRzdC5vcmlnX3ZhbCA9IGMtPmRzdC52YWw7Ci0JCWdvdG8gYW5kOwotCWNhc2UgMHgyNTogICAgICAgICAgICAgIC8qIGFuZCBheCBpbW0xNiwgb3IgZWF4IGltbTMyICovCi0JCWMtPmRzdC50eXBlID0gT1BfUkVHOwotCQljLT5kc3QuYnl0ZXMgPSBjLT5vcF9ieXRlczsKLQkJYy0+ZHN0LnB0ciA9ICZjLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQlpZiAoYy0+b3BfYnl0ZXMgPT0gMikKLQkJCWMtPmRzdC52YWwgPSAqKHUxNiAqKWMtPmRzdC5wdHI7Ci0JCWVsc2UKLQkJCWMtPmRzdC52YWwgPSAqKHUzMiAqKWMtPmRzdC5wdHI7Ci0JCWMtPmRzdC5vcmlnX3ZhbCA9IGMtPmRzdC52YWw7Ci0JCWdvdG8gYW5kOwogCWNhc2UgMHgyOCAuLi4gMHgyZDoKIAkgICAgICBzdWI6CQkvKiBzdWIgKi8KIAkJZW11bGF0ZV8yb3BfU3JjVigic3ViIiwgYy0+c3JjLCBjLT5kc3QsIGN0eHQtPmVmbGFncyk7CkBAIC0xNjU5LDcgKzE2ODMsNyBAQAogCWNhc2UgMHhhZSAuLi4gMHhhZjoJLyogc2NhcyAqLwogCQlEUFJJTlRGKCJVcmshIEkgZG9uJ3QgaGFuZGxlIFNDQVMuXG4iKTsKIAkJZ290byBjYW5ub3RfZW11bGF0ZTsKLQljYXNlIDB4Yjg6IC8qIG1vdiByLCBpbW0gKi8KKwljYXNlIDB4YjAgLi4uIDB4YmY6IC8qIG1vdiByLCBpbW0gKi8KIAkJZ290byBtb3Y7CiAJY2FzZSAweGMwIC4uLiAweGMxOgogCQllbXVsYXRlX2dycDIoY3R4dCk7CkBAIC0xNjc5LDYgKzE3MDMsMTYgQEAKIAkJYy0+c3JjLnZhbCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JDWF07CiAJCWVtdWxhdGVfZ3JwMihjdHh0KTsKIAkJYnJlYWs7CisJY2FzZSAweGU0OiAJLyogaW5iICovCisJY2FzZSAweGU1OiAJLyogaW4gKi8KKwkJcG9ydCA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCk7CisJCWlvX2Rpcl9pbiA9IDE7CisJCWdvdG8gZG9faW87CisJY2FzZSAweGU2OiAvKiBvdXRiICovCisJY2FzZSAweGU3OiAvKiBvdXQgKi8KKwkJcG9ydCA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCk7CisJCWlvX2Rpcl9pbiA9IDA7CisJCWdvdG8gZG9faW87CiAJY2FzZSAweGU4OiAvKiBjYWxsIChuZWFyKSAqLyB7CiAJCWxvbmcgaW50IHJlbDsKIAkJc3dpdGNoIChjLT5vcF9ieXRlcykgewpAQCAtMTcyOSw2ICsxNzYzLDIyIEBACiAJCWptcF9yZWwoYywgYy0+c3JjLnZhbCk7CiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsgLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCWJyZWFrOworCWNhc2UgMHhlYzogLyogaW4gYWwsZHggKi8KKwljYXNlIDB4ZWQ6IC8qIGluIChlL3IpYXgsZHggKi8KKwkJcG9ydCA9IGMtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJCWlvX2Rpcl9pbiA9IDE7CisJCWdvdG8gZG9faW87CisJY2FzZSAweGVlOiAvKiBvdXQgYWwsZHggKi8KKwljYXNlIDB4ZWY6IC8qIG91dCAoZS9yKWF4LGR4ICovCisJCXBvcnQgPSBjLT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCQlpb19kaXJfaW4gPSAwOworCWRvX2lvOglpZiAoa3ZtX2VtdWxhdGVfcGlvKGN0eHQtPnZjcHUsIE5VTEwsIGlvX2Rpcl9pbiwKKwkJCQkgICAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXMsCisJCQkJICAgcG9ydCkgIT0gMCkgeworCQkJYy0+ZWlwID0gc2F2ZWRfZWlwOworCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwkJfQorCQlyZXR1cm4gMDsKIAljYXNlIDB4ZjQ6ICAgICAgICAgICAgICAvKiBobHQgKi8KIAkJY3R4dC0+dmNwdS0+YXJjaC5oYWx0X3JlcXVlc3QgPSAxOwogCQlicmVhazsKQEAgLTE3NTQsNiArMTgwNCwxNCBAQAogCQljdHh0LT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19JRjsKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KIAkJYnJlYWs7CisJY2FzZSAweGZjOiAvKiBjbGQgKi8KKwkJY3R4dC0+ZWZsYWdzICY9IH5FRkxHX0RGOworCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CS8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCQlicmVhazsKKwljYXNlIDB4ZmQ6IC8qIHN0ZCAqLworCQljdHh0LT5lZmxhZ3MgfD0gRUZMR19ERjsKKwkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KKwkJYnJlYWs7CiAJY2FzZSAweGZlIC4uLiAweGZmOgkvKiBHcnA0L0dycDUgKi8KIAkJcmMgPSBlbXVsYXRlX2dycDQ1KGN0eHQsIG9wcyk7CiAJCWlmIChyYyAhPSAwKQpAQCAtMTc2OCw3ICsxODI2LDcgQEAKIAogCS8qIENvbW1pdCBzaGFkb3cgcmVnaXN0ZXIgc3RhdGUuICovCiAJbWVtY3B5KGN0eHQtPnZjcHUtPmFyY2gucmVncywgYy0+cmVncywgc2l6ZW9mIGMtPnJlZ3MpOwotCWN0eHQtPnZjcHUtPmFyY2gucmlwID0gYy0+ZWlwOworCWt2bV9yaXBfd3JpdGUoY3R4dC0+dmNwdSwgYy0+ZWlwKTsKIAogZG9uZToKIAlpZiAocmMgPT0gWDg2RU1VTF9VTkhBTkRMRUFCTEUpIHsKQEAgLTE3OTMsNyArMTg1MSw3IEBACiAJCQkJZ290byBkb25lOwogCiAJCQkvKiBMZXQgdGhlIHByb2Nlc3NvciByZS1leGVjdXRlIHRoZSBmaXhlZCBoeXBlcmNhbGwgKi8KLQkJCWMtPmVpcCA9IGN0eHQtPnZjcHUtPmFyY2gucmlwOworCQkJYy0+ZWlwID0ga3ZtX3JpcF9yZWFkKGN0eHQtPnZjcHUpOwogCQkJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCQlicmVhazsKQEAgLTE4ODksNyArMTk0Nyw3IEBACiAJCXJjID0ga3ZtX3NldF9tc3IoY3R4dC0+dmNwdSwgYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgbXNyX2RhdGEpOwogCQlpZiAocmMpIHsKIAkJCWt2bV9pbmplY3RfZ3AoY3R4dC0+dmNwdSwgMCk7Ci0JCQljLT5laXAgPSBjdHh0LT52Y3B1LT5hcmNoLnJpcDsKKwkJCWMtPmVpcCA9IGt2bV9yaXBfcmVhZChjdHh0LT52Y3B1KTsKIAkJfQogCQlyYyA9IFg4NkVNVUxfQ09OVElOVUU7CiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKQEAgLTE4OTksNyArMTk1Nyw3IEBACiAJCXJjID0ga3ZtX2dldF9tc3IoY3R4dC0+dmNwdSwgYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgJm1zcl9kYXRhKTsKIAkJaWYgKHJjKSB7CiAJCQlrdm1faW5qZWN0X2dwKGN0eHQtPnZjcHUsIDApOwotCQkJYy0+ZWlwID0gY3R4dC0+dmNwdS0+YXJjaC5yaXA7CisJCQljLT5laXAgPSBrdm1fcmlwX3JlYWQoY3R4dC0+dmNwdSk7CiAJCX0gZWxzZSB7CiAJCQljLT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gKHUzMiltc3JfZGF0YTsKIAkJCWMtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gPSBtc3JfZGF0YSA+PiAzMjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xndWVzdC9ib290LmMgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCmluZGV4IGQ5MjQ5YTguLjY1ZjBiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xndWVzdC9ib290LmMKKysrIGIvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xndWVzdF9sYXVuY2hlci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9sZ3Vlc3QuaD4KICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4KQEAgLTc4MywxNCArNzg0LDQ0IEBACiAgKiBjb2RlIHF1YWxpZmllcyBmb3IgQWR2YW5jZWQuICBJdCB3aWxsIGFsc28gbmV2ZXIgaW50ZXJydXB0IGFueXRoaW5nLiAgSXQKICAqIGRvZXMsIGhvd2V2ZXIsIGFsbG93IHVzIHRvIGdldCB0aHJvdWdoIHRoZSBMaW51eCBib290IGNvZGUuICovCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi1zdGF0aWMgdm9pZCBsZ3Vlc3RfYXBpY193cml0ZSh1bnNpZ25lZCBsb25nIHJlZywgdTMyIHYpCitzdGF0aWMgdm9pZCBsZ3Vlc3RfYXBpY193cml0ZSh1MzIgcmVnLCB1MzIgdikKIHsKIH0KIAotc3RhdGljIHUzMiBsZ3Vlc3RfYXBpY19yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQorc3RhdGljIHUzMiBsZ3Vlc3RfYXBpY19yZWFkKHUzMiByZWcpCiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyB1NjQgbGd1ZXN0X2FwaWNfaWNyX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGd1ZXN0X2FwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCkKK3sKKwkvKiBXYXJuIHRvIHNlZSBpZiB0aGVyZSdzIGFueSBzdHJheSByZWZlcmVuY2VzICovCisJV0FSTl9PTigxKTsKK30KKworc3RhdGljIHZvaWQgbGd1ZXN0X2FwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQoreworCXJldHVybjsKK30KKworc3RhdGljIHUzMiBsZ3Vlc3RfYXBpY19zYWZlX3dhaXRfaWNyX2lkbGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhcGljX29wcyBsZ3Vlc3RfYmFzaWNfYXBpY19vcHMgPSB7CisJLnJlYWQgPSBsZ3Vlc3RfYXBpY19yZWFkLAorCS53cml0ZSA9IGxndWVzdF9hcGljX3dyaXRlLAorCS5pY3JfcmVhZCA9IGxndWVzdF9hcGljX2ljcl9yZWFkLAorCS5pY3Jfd3JpdGUgPSBsZ3Vlc3RfYXBpY19pY3Jfd3JpdGUsCisJLndhaXRfaWNyX2lkbGUgPSBsZ3Vlc3RfYXBpY193YWl0X2ljcl9pZGxlLAorCS5zYWZlX3dhaXRfaWNyX2lkbGUgPSBsZ3Vlc3RfYXBpY19zYWZlX3dhaXRfaWNyX2lkbGUsCit9OwogI2VuZGlmCiAKIC8qIFNUT1AhICBVbnRpbCBhbiBpbnRlcnJ1cHQgY29tZXMgaW4uICovCkBAIC05OTAsOCArMTAyMSw3IEBACiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKiBhcGljIHJlYWQvd3JpdGUgaW50ZXJjZXB0cyAqLwotCXB2X2FwaWNfb3BzLmFwaWNfd3JpdGUgPSBsZ3Vlc3RfYXBpY193cml0ZTsKLQlwdl9hcGljX29wcy5hcGljX3JlYWQgPSBsZ3Vlc3RfYXBpY19yZWFkOworCWFwaWNfb3BzID0gJmxndWVzdF9iYXNpY19hcGljX29wczsKICNlbmRpZgogCiAJLyogdGltZSBvcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKaW5kZXggYWEzZmE0MS4uNTVlMTFhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQpAQCAtMTcsOSArMTcsNiBAQAogICAgICAgICBsaWItJChDT05GSUdfWDg2X1VTRV8zRE5PVykgKz0gbW14XzMyLm8KIGVsc2UKICAgICAgICAgb2JqLXkgKz0gaW9fNjQubyBpb21hcF9jb3B5XzY0Lm8KLQotICAgICAgICBDRkxBR1NfY3N1bS1wYXJ0aWFsXzY0Lm8gOj0gLWZ1bnJvbGwtbG9vcHMKLQogICAgICAgICBsaWIteSArPSBjc3VtLXBhcnRpYWxfNjQubyBjc3VtLWNvcHlfNjQubyBjc3VtLXdyYXBwZXJzXzY0Lm8KICAgICAgICAgbGliLXkgKz0gdGh1bmtfNjQubyBjbGVhcl9wYWdlXzY0Lm8gY29weV9wYWdlXzY0Lm8KICAgICAgICAgbGliLXkgKz0gbWVtbW92ZV82NC5vIG1lbXNldF82NC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbXNyLW9uLWNwdS5jIGIvYXJjaC94ODYvbGliL21zci1vbi1jcHUuYwppbmRleCAwMWI4NjhiLi4zMjFjZjcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvbXNyLW9uLWNwdS5jCisrKyBiL2FyY2gveDg2L2xpYi9tc3Itb24tY3B1LmMKQEAgLTE2LDM3ICsxNiw0NiBAQAogCXJkbXNyKHJ2LT5tc3Jfbm8sIHJ2LT5sLCBydi0+aCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fcmRtc3Jfc2FmZV9vbl9jcHUodm9pZCAqaW5mbykKK3N0YXRpYyB2b2lkIF9fd3Jtc3Jfb25fY3B1KHZvaWQgKmluZm8pCiB7CiAJc3RydWN0IG1zcl9pbmZvICpydiA9IGluZm87CiAKLQlydi0+ZXJyID0gcmRtc3Jfc2FmZShydi0+bXNyX25vLCAmcnYtPmwsICZydi0+aCk7CisJd3Jtc3IocnYtPm1zcl9ubywgcnYtPmwsIHJ2LT5oKTsKIH0KIAotc3RhdGljIGludCBfcmRtc3Jfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiAqbCwgdTMyICpoLCBpbnQgc2FmZSkKK2ludCByZG1zcl9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyICpsLCB1MzIgKmgpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAlzdHJ1Y3QgbXNyX2luZm8gcnY7CiAKIAlydi5tc3Jfbm8gPSBtc3Jfbm87Ci0JaWYgKHNhZmUpIHsKLQkJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX19yZG1zcl9zYWZlX29uX2NwdSwKLQkJCQkJICAgICAgICZydiwgMSk7Ci0JCWVyciA9IGVyciA/IGVyciA6IHJ2LmVycjsKLQl9IGVsc2UgewotCQllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3JkbXNyX29uX2NwdSwgJnJ2LCAxKTsKLQl9CisJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX19yZG1zcl9vbl9jcHUsICZydiwgMSk7CiAJKmwgPSBydi5sOwogCSpoID0gcnYuaDsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fd3Jtc3Jfb25fY3B1KHZvaWQgKmluZm8pCitpbnQgd3Jtc3Jfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiBsLCB1MzIgaCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtc3JfaW5mbyBydjsKKworCXJ2Lm1zcl9ubyA9IG1zcl9ubzsKKwlydi5sID0gbDsKKwlydi5oID0gaDsKKwllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3dybXNyX29uX2NwdSwgJnJ2LCAxKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoZXNlICJzYWZlIiB2YXJpYW50cyBhcmUgc2xvd2VyIGFuZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSB0YXJnZXQgTVNSCisgICBtYXkgbm90IGFjdHVhbGx5IGV4aXN0LiAqLworc3RhdGljIHZvaWQgX19yZG1zcl9zYWZlX29uX2NwdSh2b2lkICppbmZvKQogewogCXN0cnVjdCBtc3JfaW5mbyAqcnYgPSBpbmZvOwogCi0Jd3Jtc3IocnYtPm1zcl9ubywgcnYtPmwsIHJ2LT5oKTsKKwlydi0+ZXJyID0gcmRtc3Jfc2FmZShydi0+bXNyX25vLCAmcnYtPmwsICZydi0+aCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fd3Jtc3Jfc2FmZV9vbl9jcHUodm9pZCAqaW5mbykKQEAgLTU2LDQ1ICs2NSwzMCBAQAogCXJ2LT5lcnIgPSB3cm1zcl9zYWZlKHJ2LT5tc3Jfbm8sIHJ2LT5sLCBydi0+aCk7CiB9CiAKLXN0YXRpYyBpbnQgX3dybXNyX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgbCwgdTMyIGgsIGludCBzYWZlKQoraW50IHJkbXNyX3NhZmVfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiAqbCwgdTMyICpoKQogewotCWludCBlcnIgPSAwOworCWludCBlcnI7CisJc3RydWN0IG1zcl9pbmZvIHJ2OworCisJcnYubXNyX25vID0gbXNyX25vOworCWVyciA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fcmRtc3Jfc2FmZV9vbl9jcHUsICZydiwgMSk7CisJKmwgPSBydi5sOworCSpoID0gcnYuaDsKKworCXJldHVybiBlcnIgPyBlcnIgOiBydi5lcnI7Cit9CisKK2ludCB3cm1zcl9zYWZlX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgbCwgdTMyIGgpCit7CisJaW50IGVycjsKIAlzdHJ1Y3QgbXNyX2luZm8gcnY7CiAKIAlydi5tc3Jfbm8gPSBtc3Jfbm87CiAJcnYubCA9IGw7CiAJcnYuaCA9IGg7Ci0JaWYgKHNhZmUpIHsKLQkJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX193cm1zcl9zYWZlX29uX2NwdSwKLQkJCQkJICAgICAgICZydiwgMSk7Ci0JCWVyciA9IGVyciA/IGVyciA6IHJ2LmVycjsKLQl9IGVsc2UgewotCQllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3dybXNyX29uX2NwdSwgJnJ2LCAxKTsKLQl9CisJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX193cm1zcl9zYWZlX29uX2NwdSwgJnJ2LCAxKTsKIAotCXJldHVybiBlcnI7Ci19Ci0KLWludCB3cm1zcl9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyIGwsIHUzMiBoKQotewotCXJldHVybiBfd3Jtc3Jfb25fY3B1KGNwdSwgbXNyX25vLCBsLCBoLCAwKTsKLX0KLQotaW50IHJkbXNyX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgKmwsIHUzMiAqaCkKLXsKLQlyZXR1cm4gX3JkbXNyX29uX2NwdShjcHUsIG1zcl9ubywgbCwgaCwgMCk7Ci19Ci0KLS8qIFRoZXNlICJzYWZlIiB2YXJpYW50cyBhcmUgc2xvd2VyIGFuZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSB0YXJnZXQgTVNSCi0gICBtYXkgbm90IGFjdHVhbGx5IGV4aXN0LiAqLwotaW50IHdybXNyX3NhZmVfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiBsLCB1MzIgaCkKLXsKLQlyZXR1cm4gX3dybXNyX29uX2NwdShjcHUsIG1zcl9ubywgbCwgaCwgMSk7Ci19Ci0KLWludCByZG1zcl9zYWZlX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgKmwsIHUzMiAqaCkKLXsKLQlyZXR1cm4gX3JkbXNyX29uX2NwdShjcHUsIG1zcl9ubywgbCwgaCwgMSk7CisJcmV0dXJuIGVyciA/IGVyciA6IHJ2LmVycjsKIH0KIAogRVhQT1JUX1NZTUJPTChyZG1zcl9vbl9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3N0cmluZ18zMi5jIGIvYXJjaC94ODYvbGliL3N0cmluZ18zMi5jCmluZGV4IDk0OTcyZTcuLjgyMDA0ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9zdHJpbmdfMzIuYworKysgYi9hcmNoL3g4Ni9saWIvc3RyaW5nXzMyLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAkJInRlc3RiICUlYWwsJSVhbFxuXHQiCiAJCSJqbmUgMWIiCiAJCTogIj0mUyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mYSIgKGQyKQotCQk6IjAiIChzcmMpLCAiMSIgKGRlc3QpIDogIm1lbW9yeSIpOworCQk6ICIwIiAoc3JjKSwgIjEiIChkZXN0KSA6ICJtZW1vcnkiKTsKIAlyZXR1cm4gZGVzdDsKIH0KIEVYUE9SVF9TWU1CT0woc3RyY3B5KTsKQEAgLTQyLDcgKzQyLDcgQEAKIAkJInN0b3NiXG4iCiAJCSIyOiIKIAkJOiAiPSZTIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZjIiAoZDIpLCAiPSZhIiAoZDMpCi0JCToiMCIgKHNyYyksICIxIiAoZGVzdCksICIyIiAoY291bnQpIDogIm1lbW9yeSIpOworCQk6ICIwIiAoc3JjKSwgIjEiIChkZXN0KSwgIjIiIChjb3VudCkgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGRlc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cm5jcHkpOwpAQCAtNjAsNyArNjAsNyBAQAogCQkidGVzdGIgJSVhbCwlJWFsXG5cdCIKIAkJImpuZSAxYiIKIAkJOiAiPSZTIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZhIiAoZDIpLCAiPSZjIiAoZDMpCi0JCTogIjAiIChzcmMpLCAiMSIgKGRlc3QpLCAiMiIgKDApLCAiMyIgKDB4ZmZmZmZmZmZ1KTogIm1lbW9yeSIpOworCQk6ICIwIiAoc3JjKSwgIjEiIChkZXN0KSwgIjIiICgwKSwgIjMiICgweGZmZmZmZmZmdSkgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGRlc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmNhdCk7CkBAIC0xMDUsOSArMTA1LDkgQEAKIAkJIjI6XHRzYmJsICUlZWF4LCUlZWF4XG5cdCIKIAkJIm9yYiAkMSwlJWFsXG4iCiAJCSIzOiIKLQkJOiI9YSIgKHJlcyksICI9JlMiIChkMCksICI9JkQiIChkMSkKLQkJOiIxIiAoY3MpLCAiMiIgKGN0KQotCQk6Im1lbW9yeSIpOworCQk6ICI9YSIgKHJlcyksICI9JlMiIChkMCksICI9JkQiIChkMSkKKwkJOiAiMSIgKGNzKSwgIjIiIChjdCkKKwkJOiAibWVtb3J5Iik7CiAJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0woc3RyY21wKTsKQEAgLTEzMCw5ICsxMzAsOSBAQAogCQkiMzpcdHNiYmwgJSVlYXgsJSVlYXhcblx0IgogCQkib3JiICQxLCUlYWxcbiIKIAkJIjQ6IgotCQk6Ij1hIiAocmVzKSwgIj0mUyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mYyIgKGQyKQotCQk6IjEiIChjcyksICIyIiAoY3QpLCAiMyIgKGNvdW50KQotCQk6Im1lbW9yeSIpOworCQk6ICI9YSIgKHJlcyksICI9JlMiIChkMCksICI9JkQiIChkMSksICI9JmMiIChkMikKKwkJOiAiMSIgKGNzKSwgIjIiIChjdCksICIzIiAoY291bnQpCisJCTogIm1lbW9yeSIpOwogCXJldHVybiByZXM7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cm5jbXApOwpAQCAtMTUyLDkgKzE1Miw5IEBACiAJCSJtb3ZsICQxLCUxXG4iCiAJCSIyOlx0bW92bCAlMSwlMFxuXHQiCiAJCSJkZWNsICUwIgotCQk6Ij1hIiAocmVzKSwgIj0mUyIgKGQwKQotCQk6IjEiIChzKSwgIjAiIChjKQotCQk6Im1lbW9yeSIpOworCQk6ICI9YSIgKHJlcyksICI9JlMiIChkMCkKKwkJOiAiMSIgKHMpLCAiMCIgKGMpCisJCTogIm1lbW9yeSIpOwogCXJldHVybiByZXM7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmNocik7CkBAIC0xNjksOSArMTY5LDkgQEAKIAkJInNjYXNiXG5cdCIKIAkJIm5vdGwgJTBcblx0IgogCQkiZGVjbCAlMCIKLQkJOiI9YyIgKHJlcyksICI9JkQiIChkMCkKLQkJOiIxIiAocyksICJhIiAoMCksICIwIiAoMHhmZmZmZmZmZnUpCi0JCToibWVtb3J5Iik7CisJCTogIj1jIiAocmVzKSwgIj0mRCIgKGQwKQorCQk6ICIxIiAocyksICJhIiAoMCksICIwIiAoMHhmZmZmZmZmZnUpCisJCTogIm1lbW9yeSIpOwogCXJldHVybiByZXM7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmxlbik7CkBAIC0xODksOSArMTg5LDkgQEAKIAkJImplIDFmXG5cdCIKIAkJIm1vdmwgJDEsJTBcbiIKIAkJIjE6XHRkZWNsICUwIgotCQk6Ij1EIiAocmVzKSwgIj0mYyIgKGQwKQotCQk6ImEiIChjKSwgIjAiIChjcyksICIxIiAoY291bnQpCi0JCToibWVtb3J5Iik7CisJCTogIj1EIiAocmVzKSwgIj0mYyIgKGQwKQorCQk6ICJhIiAoYyksICIwIiAoY3MpLCAiMSIgKGNvdW50KQorCQk6ICJtZW1vcnkiKTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTChtZW1jaHIpOwpAQCAtMjI4LDkgKzIyOCw5IEBACiAJCSJjbXBsICQtMSwlMVxuXHQiCiAJCSJqbmUgMWJcbiIKIAkJIjM6XHRzdWJsICUyLCUwIgotCQk6Ij1hIiAocmVzKSwgIj0mZCIgKGQwKQotCQk6ImMiIChzKSwgIjEiIChjb3VudCkKLQkJOiJtZW1vcnkiKTsKKwkJOiAiPWEiIChyZXMpLCAiPSZkIiAoZDApCisJCTogImMiIChzKSwgIjEiIChjb3VudCkKKwkJOiAibWVtb3J5Iik7CiAJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0woc3Rybmxlbik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvc3Ryc3RyXzMyLmMgYi9hcmNoL3g4Ni9saWIvc3Ryc3RyXzMyLmMKaW5kZXggNDJlOGE1MC4uOGUyZDU1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3N0cnN0cl8zMi5jCisrKyBiL2FyY2gveDg2L2xpYi9zdHJzdHJfMzIuYwpAQCAtMjMsOSArMjMsOSBAQAogCSJqbmUgMWJcblx0IgogCSJ4b3JsICUlZWF4LCUlZWF4XG5cdCIKIAkiMjoiCi0JOiI9YSIgKF9fcmVzKSwgIj0mYyIgKGQwKSwgIj0mUyIgKGQxKQotCToiMCIgKDApLCAiMSIgKDB4ZmZmZmZmZmYpLCAiMiIgKGNzKSwgImciIChjdCkKLQk6ImR4IiwgImRpIik7CisJOiAiPWEiIChfX3JlcyksICI9JmMiIChkMCksICI9JlMiIChkMSkKKwk6ICIwIiAoMCksICIxIiAoMHhmZmZmZmZmZiksICIyIiAoY3MpLCAiZyIgKGN0KQorCTogImR4IiwgImRpIik7CiByZXR1cm4gX19yZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi91c2VyY29weV8zMi5jIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKaW5kZXggMjRlNjA5NC4uOWU2ODA3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKKysrIGIvYXJjaC94ODYvbGliL3VzZXJjb3B5XzMyLmMKQEAgLTE0LDYgKzE0LDEzIEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW14Lmg+CiAKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisvKgorICogQWxpZ25tZW50IGF0IHdoaWNoIG1vdnNsIGlzIHByZWZlcnJlZCBmb3IgYnVsayBtZW1vcnkgY29waWVzLgorICovCitzdHJ1Y3QgbW92c2xfbWFzayBtb3ZzbF9tYXNrIF9fcmVhZF9tb3N0bHk7CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBpbnQgX19tb3ZzbF9pc19vayh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1kZWZhdWx0L3NldHVwLmMgYi9hcmNoL3g4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCAzZDMxNzgzLi4zN2I5YWU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYworKysgYi9hcmNoL3g4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwpAQCAtMTAsMTMgKzEwLDE1IEBACiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAorI2luY2x1ZGUgPG1hY2hfaXBpLmg+CisKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKICNkZWZpbmUgREVGQVVMVF9TRU5EX0lQSQkoMSkKICNlbHNlCiAjZGVmaW5lIERFRkFVTFRfU0VORF9JUEkJKDApCiAjZW5kaWYKIAotaW50IG5vX2Jyb2FkY2FzdD1ERUZBVUxUX1NFTkRfSVBJOworaW50IG5vX2Jyb2FkY2FzdCA9IERFRkFVTFRfU0VORF9JUEk7CiAKIC8qKgogICogcHJlX2ludHJfaW5pdF9ob29rIC0gaW5pdGlhbGlzYXRpb24gcHJpb3IgdG8gc2V0dGluZyB1cCBpbnRlcnJ1cHQgdmVjdG9ycwpAQCAtMzYsMTUgKzM4LDYgQEAKIAlpbml0X0lTQV9pcnFzKCk7CiB9CiAKLS8qCi0gKiBJUlEyIGlzIGNhc2NhZGUgaW50ZXJydXB0IHRvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlcgotICovCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEyID0gewotCS5oYW5kbGVyID0gbm9fYWN0aW9uLAotCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKLQkubmFtZSA9ICJjYXNjYWRlIiwKLX07Ci0KIC8qKgogICogaW50cl9pbml0X2hvb2sgLSBwb3N0IGdhdGUgc2V0dXAgaW50ZXJydXB0IGluaXRpYWxpc2F0aW9uCiAgKgpAQCAtNjAsMTIgKzUzLDYgQEAKIAkJaWYgKHg4Nl9xdWlya3MtPmFyY2hfaW50cl9pbml0KCkpCiAJCQlyZXR1cm47CiAJfQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWFwaWNfaW50cl9pbml0KCk7Ci0jZW5kaWYKLQotCWlmICghYWNwaV9pb2FwaWMpCi0JCXNldHVwX2lycSgyLCAmaXJxMik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1lczcwMDAvTWFrZWZpbGUgYi9hcmNoL3g4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmOGI0My4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KLSMKLQotb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCTo9IGVzNzAwMHBsYXQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1lczcwMDAvZXM3MDAwLmggYi9hcmNoL3g4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNWFhMS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogV3JpdHRlbiBieTogR2FycnkgRm9yc2dyZW4sIFVuaXN5cyBDb3Jwb3JhdGlvbgotICogICAgICAgICAgICAgTmF0YWxpZSBQcm90YXNldmljaCwgVW5pc3lzIENvcnBvcmF0aW9uCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gY29uZmlndXJlIGFuZCBpbnRlcmZhY2UgCi0gKiB3aXRoIFVuaXN5cyBFUzcwMDAgc2VyaWVzIGhhcmR3YXJlIHN5c3RlbSBtYW5hZ2VyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBVbmlzeXMgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKiBDb250YWN0IGluZm9ybWF0aW9uOiBVbmlzeXMgQ29ycG9yYXRpb24sIFRvd25zaGlwIExpbmUgJiBVbmlvbiBNZWV0aW5nIAotICogUm9hZHMtQSwgVW5pc3lzIFdheSwgQmx1ZSBCZWxsLCBQZW5uc3lsdmFuaWEsIDE5NDI0LCBvcjoKLSAqCi0gKiBodHRwOi8vd3d3LnVuaXN5cy5jb20KLSAqLwotCi0vKgotICogRVM3MDAwIGNoaXBzZXRzCi0gKi8KLQotI2RlZmluZSBOT05fVU5JU1lTCQkwCi0jZGVmaW5lIEVTNzAwMF9DTEFTU0lDCQkxCi0jZGVmaW5lIEVTNzAwMF9aT1JSTwkJMgotCi0KLSNkZWZpbmUJTUlQX1JFRwkJCTEKLSNkZWZpbmUJTUlQX1BTQUlfUkVHCQk0Ci0KLSNkZWZpbmUJTUlQX0JVU1kJCTEKLSNkZWZpbmUJTUlQX1NQSU4JCTB4ZjAwMDAKLSNkZWZpbmUJTUlQX1ZBTElECQkweDAxMDAwMDAwMDAwMDAwMDBVTEwKLSNkZWZpbmUJTUlQX1BPUlQoVkFMVUUpCSgoVkFMVUUgPj4gMzIpICYgMHhmZmZmKQotCi0jZGVmaW5lCU1JUF9SRF9MTyhWQUxVRSkJKFZBTFVFICYgMHhmZmZmZmZmZikgICAKLQotc3RydWN0IG1pcF9yZWdfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG1pcF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWxpdmVyeV9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBob3N0X3JlZzsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbWlwX3JlZzsKLX07Ci0KLXN0cnVjdCBwYXJ0X2luZm8gewotCXVuc2lnbmVkIGNoYXIgdHlwZTsgICAKLQl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKLQl1bnNpZ25lZCBjaGFyIHBhcnRfaWQ7Ci0JdW5zaWduZWQgY2hhciBhcGljX21vZGU7Ci0JdW5zaWduZWQgbG9uZyBzbnVtOyAgICAKLQljaGFyIHB0eXBlWzE2XTsKLQljaGFyIHNuYW1lWzY0XTsKLQljaGFyIHBuYW1lWzY0XTsKLX07Ci0KLXN0cnVjdCBwc2FpIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZW50cnlfdHlwZTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYmVwX2FkZHI7Ci19OwotCi1zdHJ1Y3QgZXM3MDAwX21lbV9pbmZvIHsKLQl1bnNpZ25lZCBjaGFyIHR5cGU7ICAgCi0JdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0JdW5zaWduZWQgY2hhciByZXN2WzZdOwotCXVuc2lnbmVkIGxvbmcgbG9uZyAgc3RhcnQ7IAotCXVuc2lnbmVkIGxvbmcgbG9uZyAgc2l6ZTsgCi19OwotCi1zdHJ1Y3QgZXM3MDAwX29lbV90YWJsZSB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGhkcjsKLQlzdHJ1Y3QgbWlwX3JlZ19pbmZvIG1pcDsKLQlzdHJ1Y3QgcGFydF9pbmZvIHBpZjsKLQlzdHJ1Y3QgZXM3MDAwX21lbV9pbmZvIHNobTsKLQlzdHJ1Y3QgcHNhaSBwc2FpOwotfTsKLQotI2lmZGVmIENPTkZJR19BQ1BJCi0KLXN0cnVjdCBvZW1fdGFibGUgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIE9FTVRhYmxlQWRkcjsKLQl1MzIgT0VNVGFibGVTaXplOwotfTsKLQotZXh0ZXJuIGludCBmaW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nICpvZW1fYWRkcik7Ci0jZW5kaWYKLQotc3RydWN0IG1pcF9yZWcgewotCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzg7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG9mZl8xMDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzE4OwotCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMjA7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG9mZl8yODsKLQl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzMwOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMzg7Ci19OwotCi0jZGVmaW5lCU1JUF9TV19BUElDCQkweDEwMjBiCi0jZGVmaW5lCU1JUF9GVU5DKFZBTFVFKSAJKFZBTFVFICYgMHhmZikKLQotZXh0ZXJuIGludCBwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIpOwotZXh0ZXJuIHZvaWQgc2V0dXBfdW5pc3lzKHZvaWQpOwotZXh0ZXJuIGludCBlczcwMDBfc3RhcnRfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZWlwKTsKLWV4dGVybiB2b2lkIGVzNzAwMF9zd19hcGljKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jIGIvYXJjaC94ODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE4OWFmLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogV3JpdHRlbiBieTogR2FycnkgRm9yc2dyZW4sIFVuaXN5cyBDb3Jwb3JhdGlvbgotICogICAgICAgICAgICAgTmF0YWxpZSBQcm90YXNldmljaCwgVW5pc3lzIENvcnBvcmF0aW9uCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gY29uZmlndXJlIGFuZCBpbnRlcmZhY2UKLSAqIHdpdGggVW5pc3lzIEVTNzAwMCBzZXJpZXMgaGFyZHdhcmUgc3lzdGVtIG1hbmFnZXIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFVuaXN5cyBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIENvbnRhY3QgaW5mb3JtYXRpb246IFVuaXN5cyBDb3Jwb3JhdGlvbiwgVG93bnNoaXAgTGluZSAmIFVuaW9uIE1lZXRpbmcKLSAqIFJvYWRzLUEsIFVuaXN5cyBXYXksIEJsdWUgQmVsbCwgUGVubnN5bHZhbmlhLCAxOTQyNCwgb3I6Ci0gKgotICogaHR0cDovL3d3dy51bmlzeXMuY29tCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbm1pLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+Ci0jaW5jbHVkZSAiZXM3MDAwLmgiCi0jaW5jbHVkZSA8bWFjaF9tcHBhcnNlLmg+Ci0KLS8qCi0gKiBFUzcwMDAgR2xvYmFscwotICovCi0KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSpwc2FpID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgbWlwX3JlZwkJKm1pcF9yZWc7Ci1zdGF0aWMgc3RydWN0IG1pcF9yZWcJCSpob3N0X3JlZzsKLXN0YXRpYyBpbnQgCQkJbWlwX3BvcnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZwkJbWlwX2FkZHIsIGhvc3RfYWRkcjsKLQotaW50IGVzNzAwMF9wbGF0OwotCi0vKgotICogR1NJIG92ZXJyaWRlIGZvciBFUzcwMDAgcGxhdGZvcm1zLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZTsKLQotc3RhdGljIGludAotZXM3MDAwX3JlbmFtZV9nc2koaW50IGlvYXBpYywgaW50IGdzaSkKLXsKLQlpZiAoZXM3MDAwX3BsYXQgPT0gRVM3MDAwX1pPUlJPKQotCQlyZXR1cm4gZ3NpOwotCi0JaWYgKCFiYXNlKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKQotCQkJYmFzZSArPSBucl9pb2FwaWNfcmVnaXN0ZXJzW2ldOwotCX0KLQotCWlmICghaW9hcGljICYmIChnc2kgPCAxNikpIAotCQlnc2kgKz0gYmFzZTsKLQlyZXR1cm4gZ3NpOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfdW5pc3lzKHZvaWQpCi17Ci0JLyoKLQkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KLQkgKgotCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94Ci0JICogZXM3MDAwX3BsYXQgPSAyIGlmIHRoZSBtYWNoaW5lIGlzIGEgeDg2XzY0IEVTNzAwMCBib3gKLQkgKgotCSAqLwotCWlmICghKGJvb3RfY3B1X2RhdGEueDg2IDw9IDE1ICYmIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw9IDIpKQotCQllczcwMDBfcGxhdCA9IEVTNzAwMF9aT1JSTzsKLQllbHNlCi0JCWVzNzAwMF9wbGF0ID0gRVM3MDAwX0NMQVNTSUM7Ci0JaW9hcGljX3JlbnVtYmVyX2lycSA9IGVzNzAwMF9yZW5hbWVfZ3NpOwotfQotCi0vKgotICogUGFyc2UgdGhlIE9FTSBUYWJsZQotICovCi0KLWludCBfX2luaXQKLXBhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0cikKLXsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBpOwotCWludCAJCQlzdWNjZXNzID0gMDsKLQl1bnNpZ25lZCBjaGFyICAgICAgICAgICB0eXBlLCBzaXplOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHZhbDsKLQljaGFyICAgICAgICAgICAgICAgICAgICAqdHAgPSBOVUxMOwotCXN0cnVjdCBwc2FpICAgICAgICAgICAgICpwc2FpcCA9IE5VTEw7Ci0Jc3RydWN0IG1pcF9yZWdfaW5mbyAJKm1pOwotCXN0cnVjdCBtaXBfcmVnCQkqaG9zdCwgKm1pcDsKLQotCXRwID0gb2VtcHRyOwotCi0JdHAgKz0gODsKLQotCWZvciAoaT0wOyBpIDw9IDY7IGkrKykgewotCQl0eXBlID0gKnRwKys7Ci0JCXNpemUgPSAqdHArKzsKLQkJdHAgLT0gMjsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgTUlQX1JFRzoKLQkJCW1pID0gKHN0cnVjdCBtaXBfcmVnX2luZm8gKil0cDsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+aG9zdF9yZWcpOwotCQkJaG9zdF9hZGRyID0gdmFsOwotCQkJaG9zdCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCWhvc3RfcmVnID0gX192YShob3N0KTsKLQkJCXZhbCA9IE1JUF9SRF9MTyhtaS0+bWlwX3JlZyk7Ci0JCQltaXBfcG9ydCA9IE1JUF9QT1JUKG1pLT5taXBfaW5mbyk7Ci0JCQltaXBfYWRkciA9IHZhbDsKLQkJCW1pcCA9IChzdHJ1Y3QgbWlwX3JlZyAqKXZhbDsKLQkJCW1pcF9yZWcgPSBfX3ZhKG1pcCk7Ci0JCQlwcl9kZWJ1ZygiZXM3MDAwX21pcGNmZzogaG9zdF9yZWcgPSAweCVseCBcbiIsCi0JCQkJICh1bnNpZ25lZCBsb25nKWhvc3RfcmVnKTsKLQkJCXByX2RlYnVnKCJlczcwMDBfbWlwY2ZnOiBtaXBfcmVnID0gMHglbHggXG4iLAotCQkJCSAodW5zaWduZWQgbG9uZyltaXBfcmVnKTsKLQkJCXN1Y2Nlc3MrKzsKLQkJCWJyZWFrOwotCQljYXNlIE1JUF9QU0FJX1JFRzoKLQkJCXBzYWlwID0gKHN0cnVjdCBwc2FpICopdHA7Ci0JCQlpZiAodHAgIT0gTlVMTCkgewotCQkJCWlmIChwc2FpcC0+YWRkcikKLQkJCQkJcHNhaSA9IF9fdmEocHNhaXAtPmFkZHIpOwotCQkJCWVsc2UKLQkJCQkJcHNhaSA9IE5VTEw7Ci0JCQkJc3VjY2VzcysrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQl0cCArPSBzaXplOwotCX0KLQotCWlmIChzdWNjZXNzIDwgMikgewotCQllczcwMDBfcGxhdCA9IE5PTl9VTklTWVM7Ci0JfSBlbHNlCi0JCXNldHVwX3VuaXN5cygpOwotCXJldHVybiBlczcwMDBfcGxhdDsKLX0KLQotI2lmZGVmIENPTkZJR19BQ1BJCi1pbnQgX19pbml0Ci1maW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nICpvZW1fYWRkcikKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCXdoaWxlIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGUoIk9FTTEiLCBpKyssICZoZWFkZXIpKSkgewotCQlpZiAoIW1lbWNtcCgoY2hhciAqKSAmaGVhZGVyLT5vZW1faWQsICJVTklTWVMiLCA2KSkgewotCQkJc3RydWN0IG9lbV90YWJsZSAqdCA9IChzdHJ1Y3Qgb2VtX3RhYmxlICopaGVhZGVyOwotCQkJKm9lbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpX19hY3BpX21hcF90YWJsZSh0LT5PRU1UYWJsZUFkZHIsCi0JCQkJCQkJCSAgICB0LT5PRU1UYWJsZVNpemUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1lczcwMDBfc3BpbihpbnQgbikKLXsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoaSsrIDwgbikKLQkJcmVwX25vcCgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdAotZXM3MDAwX21pcF93cml0ZShzdHJ1Y3QgbWlwX3JlZyAqbWlwX3JlZykKLXsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCWludAkJCXNwaW47Ci0KLQlzcGluID0gTUlQX1NQSU47Ci0Jd2hpbGUgKCgodW5zaWduZWQgbG9uZyBsb25nKWhvc3RfcmVnLT5vZmZfMzggJgotCQkodW5zaWduZWQgbG9uZyBsb25nKU1JUF9WQUxJRCkgIT0gMCkgewotCQkJaWYgKC0tc3BpbiA8PSAwKSB7Ci0JCQkJcHJpbnRrKCJlczcwMDBfbWlwX3dyaXRlOiBUaW1lb3V0IHdhaXRpbmcgZm9yIEhvc3QgVmFsaWQgRmxhZyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJZXM3MDAwX3NwaW4oTUlQX1NQSU4pOwotCX0KLQotCW1lbWNweShob3N0X3JlZywgbWlwX3JlZywgc2l6ZW9mKHN0cnVjdCBtaXBfcmVnKSk7Ci0Jb3V0YigxLCBtaXBfcG9ydCk7Ci0KLQlzcGluID0gTUlQX1NQSU47Ci0KLQl3aGlsZSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbWlwX3JlZy0+b2ZmXzM4ICYKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylNSVBfVkFMSUQpID09IDApIHsKLQkJaWYgKC0tc3BpbiA8PSAwKSB7Ci0JCQlwcmludGsoImVzNzAwMF9taXBfd3JpdGU6IFRpbWVvdXQgd2FpdGluZyBmb3IgTUlQIFZhbGlkIEZsYWciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllczcwMDBfc3BpbihNSVBfU1BJTik7Ci0JfQotCi0Jc3RhdHVzID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbWlwX3JlZy0+b2ZmXzAgJgotCQkodW5zaWduZWQgbG9uZyBsb25nKTB4ZmZmZjAwMDAwMDAwMDBVTEwpID4+IDQ4OwotCW1pcF9yZWctPm9mZl8zOCA9ICgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8zOCAmCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpfk1JUF9WQUxJRCk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50Ci1lczcwMDBfc3RhcnRfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZWlwKQotewotCXVuc2lnbmVkIGxvbmcgdmVjdCA9IDAsIHBzYWl2YWwgPSAwOwotCi0JaWYgKHBzYWkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JdmVjdCA9ICgodW5zaWduZWQgbG9uZylfX3BhKGVpcCkvMHgxMDAwKSA8PCAxNjsKLQlwc2FpdmFsID0gKDB4MTAwMDAwMCB8IHZlY3QgfCBjcHUpOwotCi0Jd2hpbGUgKCpwc2FpICYgMHgxMDAwMDAwKQotICAgICAgICAgICAgICAgIDsKLQotCSpwc2FpID0gcHNhaXZhbDsKLQotCXJldHVybiAwOwotCi19Ci0KLXZvaWQgX19pbml0Ci1lczcwMDBfc3dfYXBpYyh2b2lkKQotewotCWlmIChlczcwMDBfcGxhdCkgewotCQlpbnQgbWlwX3N0YXR1czsKLQkJc3RydWN0IG1pcF9yZWcgZXM3MDAwX21pcF9yZWc7Ci0KLQkJcHJpbnRrKCJFUzcwMDA6IEVuYWJsaW5nIEFQSUMgbW9kZS5cbiIpOwotICAgICAgICAJbWVtc2V0KCZlczcwMDBfbWlwX3JlZywgMCwgc2l6ZW9mKHN0cnVjdCBtaXBfcmVnKSk7Ci0gICAgICAgIAllczcwMDBfbWlwX3JlZy5vZmZfMCA9IE1JUF9TV19BUElDOwotICAgICAgICAJZXM3MDAwX21pcF9yZWcub2ZmXzM4ID0gKE1JUF9WQUxJRCk7Ci0gICAgICAgIAl3aGlsZSAoKG1pcF9zdGF0dXMgPSBlczcwMDBfbWlwX3dyaXRlKCZlczcwMDBfbWlwX3JlZykpICE9IDApCi0gICAgICAgICAgICAgIAkJcHJpbnRrKCJlczcwMDBfc3dfYXBpYzogY29tbWFuZCBmYWlsZWQsIHN0YXR1cyA9ICV4XG4iLAotCQkJCW1pcF9zdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL01ha2VmaWxlIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL01ha2VmaWxlCmluZGV4IDBkYmQ3ODAuLjY3MzBmNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvTWFrZWZpbGUKQEAgLTksNCArOSwzIEBACiBvYmotJChDT05GSUdfWDg2X1NVTU1JVCkJKz0gc3VtbWl0Lm8KIG9iai0kKENPTkZJR19YODZfQklHU01QKQkrPSBiaWdzbXAubwogb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCSs9IGVzNzAwMC5vCi1vYmotJChDT05GSUdfWDg2X0VTNzAwMCkJKz0gLi4vLi4veDg2L21hY2gtZXM3MDAwLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jCmluZGV4IDU5ZDc3MTcuLmRmMzdmYzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYworKysgYi9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvYmlnc21wLmMKQEAgLTUsMTggKzUsMTcgQEAKICNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtYmlnc21wL21hY2hfYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWJpZ3NtcC9tYWNoX2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1iaWdzbXAvbWFjaF9pcGkuaD4KKyNpbmNsdWRlIDxhc20vYmlnc21wL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYmlnc21wL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vYmlnc21wL2lwaS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWRlZmF1bHQvbWFjaF9tcHBhcnNlLmg+CiAKIHN0YXRpYyBpbnQgZG1pX2JpZ3NtcDsgLyogY2FuIGJlIHNldCBieSBkbWkgc2Nhbm5lcnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYyBiL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwppbmRleCA0NzQyNjI2Li42NTEzZDQxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvZXM3MDAwLmMKKysrIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jCkBAIC00LDIwICs0LDE5IEBACiAjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1lczcwMDAvbWFjaF9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtZXM3MDAwL21hY2hfaXBpLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtZXM3MDAwL21hY2hfbXBwYXJzZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX3dha2VjcHUuaD4KKyNpbmNsdWRlIDxhc20vZXM3MDAwL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vZXM3MDAwL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vZXM3MDAwL2lwaS5oPgorI2luY2x1ZGUgPGFzbS9lczcwMDAvbXBwYXJzZS5oPgorI2luY2x1ZGUgPGFzbS9lczcwMDAvd2FrZWNwdS5oPgogCiBzdGF0aWMgaW50IHByb2JlX2VzNzAwMCh2b2lkKQogewpAQCAtNDgsMTYgKzQ3LDI2IEBACiAvKiBIb29rIGZyb20gZ2VuZXJpYyBBQ1BJIHRhYmxlcy5jICovCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQogewotCXVuc2lnbmVkIGxvbmcgb2VtX2FkZHI7CisJdW5zaWduZWQgbG9uZyBvZW1fYWRkciA9IDA7CisJaW50IGNoZWNrX2RzZHQ7CisJaW50IHJldCA9IDA7CisKKwkvKiBjaGVjayBkc2R0IGF0IGZpcnN0IHRvIGF2b2lkIGNsZWFyIGZpeF9tYXAgZm9yIG9lbV9hZGRyICovCisJY2hlY2tfZHNkdCA9IGVzNzAwMF9jaGVja19kc2R0KCk7CisKIAlpZiAoIWZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKCZvZW1fYWRkcikpIHsKLQkJaWYgKGVzNzAwMF9jaGVja19kc2R0KCkpCi0JCQlyZXR1cm4gcGFyc2VfdW5pc3lzX29lbSgoY2hhciAqKW9lbV9hZGRyKTsKKwkJaWYgKGNoZWNrX2RzZHQpCisJCQlyZXQgPSBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX2FkZHIpOwogCQllbHNlIHsKIAkJCXNldHVwX3VuaXN5cygpOwotCQkJcmV0dXJuIDE7CisJCQlyZXQgPSAxOwogCQl9CisJCS8qCisJCSAqIHdlIG5lZWQgdG8gdW5tYXAgaXQKKwkJICovCisJCXVubWFwX3VuaXN5c19hY3BpX29lbV90YWJsZShvZW1fYWRkcik7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAjZWxzZQogc3RhdGljIGludCBfX2luaXQgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9udW1hcS5jIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL251bWFxLmMKaW5kZXggODA5MWU2OC4uOGNmNTgzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL251bWFxLmMKKysrIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL251bWFxLmMKQEAgLTQsNyArNCw2IEBACiAjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CkBAIC0xMiwxMSArMTEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtbnVtYXEvbWFjaF9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtbnVtYXEvbWFjaF9hcGljZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtbnVtYXEvbWFjaF9pcGkuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1udW1hcS9tYWNoX21wcGFyc2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1udW1hcS9tYWNoX3dha2VjcHUuaD4KKyNpbmNsdWRlIDxhc20vbnVtYXEvYXBpY2RlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9udW1hcS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL251bWFxL2lwaS5oPgorI2luY2x1ZGUgPGFzbS9udW1hcS9tcHBhcnNlLmg+CisjaW5jbHVkZSA8YXNtL251bWFxL3dha2VjcHUuaD4KICNpbmNsdWRlIDxhc20vbnVtYXEuaD4KIAogc3RhdGljIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL3N1bW1pdC5jIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL3N1bW1pdC5jCmluZGV4IGE5N2VhMGYuLjZhZDZiNjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9zdW1taXQuYworKysgYi9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKQEAgLTQsMTkgKzQsMTggQEAKICNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXN1bW1pdC9tYWNoX2FwaWNkZWYuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9pcGkuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmg+CisjaW5jbHVkZSA8YXNtL3N1bW1pdC9hcGljZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL3N1bW1pdC9hcGljLmg+CisjaW5jbHVkZSA8YXNtL3N1bW1pdC9pcGkuaD4KKyNpbmNsdWRlIDxhc20vc3VtbWl0L21wcGFyc2UuaD4KIAogc3RhdGljIGludCBwcm9iZV9zdW1taXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jIGIvYXJjaC94ODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKaW5kZXggZWUwZmJhMC4uMTk5YTVmNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKKysrIGIvYXJjaC94ODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKQEAgLTQ0OCw2ICs0NDgsOCBAQAogCiAJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENQVSVkLCBzdGFjayBhdCBhYm91dCAlcFxuIiwgY3B1aWQsICZjcHVpZCkpOwogCisJbm90aWZ5X2NwdV9zdGFydGluZyhjcHVpZCk7CisKIAkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQppbmRleCBkZmI5MzJkLi41OWY4OWI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQpAQCAtMTMsMTIgKzEzLDggQEAKIG1taW90cmFjZS15CQkJOj0gcGZfaW4ubyBtbWlvLW1vZC5vCiBvYmotJChDT05GSUdfTU1JT1RSQUNFX1RFU1QpCSs9IHRlc3RtbWlvdHJhY2UubwogCi1pZmVxICgkKENPTkZJR19YODZfMzIpLHkpCi1vYmotJChDT05GSUdfTlVNQSkJCSs9IGRpc2NvbnRpZ18zMi5vCi1lbHNlCi1vYmotJChDT05GSUdfTlVNQSkJCSs9IG51bWFfNjQubworb2JqLSQoQ09ORklHX05VTUEpCQkrPSBudW1hXyQoQklUUykubwogb2JqLSQoQ09ORklHX0s4X05VTUEpCQkrPSBrOHRvcG9sb2d5XzY0Lm8KLWVuZGlmCiBvYmotJChDT05GSUdfQUNQSV9OVU1BKQkJKz0gc3JhdF8kKEJJVFMpLm8KIAogb2JqLSQoQ09ORklHX01FTVRFU1QpCQkrPSBtZW10ZXN0Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2Rpc2NvbnRpZ18zMi5jIGIvYXJjaC94ODYvbW0vZGlzY29udGlnXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZmE0NDAuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvbW0vZGlzY29udGlnXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoKLSAqIFdyaXR0ZW4gYnk6IFBhdHJpY2lhIEdhdWdoZW4gPGdvbmVAdXMuaWJtLmNvbT4sIElCTSBDb3Jwb3JhdGlvbgotICogQXVndXN0IDIwMDI6IGFkZGVkIHJlbW90ZSBub2RlIEtWQSByZW1hcCAtIE1hcnRpbiBKLiBCbGlnaCAKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0KLSNpbmNsdWRlIDxhc20vZTgyMC5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KLSNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0KLXN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKLQotLyoKLSAqIG51bWEgaW50ZXJmYWNlIC0gd2UgZXhwZWN0IHRoZSBudW1hIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgcG9wdWxhdGVkIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGlzYXRpb24uCi0gKgotICogMSkgbm9kZV9vbmxpbmVfbWFwICAtIHRoZSBtYXAgb2YgYWxsIG5vZGVzIGNvbmZpZ3VyZWQgKG9ubGluZSkgaW4gdGhlIHN5c3RlbQotICogMikgbm9kZV9zdGFydF9wZm4gICAtIHRoZSBzdGFydGluZyBwYWdlIGZyYW1lIG51bWJlciBmb3IgYSBub2RlCi0gKiAzKSBub2RlX2VuZF9wZm4gICAgIC0gdGhlIGVuZGluZyBwYWdlIGZyYW0gbnVtYmVyIGZvciBhIG5vZGUKLSAqLwotdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Ci11bnNpZ25lZCBsb25nIG5vZGVfZW5kX3BmbltNQVhfTlVNTk9ERVNdIF9fcmVhZF9tb3N0bHk7Ci0KLQotI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KLS8qCi0gKiA0KSBwaHlzbm9kZV9tYXAgICAgIC0gdGhlIG1hcHBpbmcgYmV0d2VlbiBhIHBmbiBhbmQgb3duaW5nIG5vZGUKLSAqIHBoeXNub2RlX21hcCBrZWVwcyB0cmFjayBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5IGxheW91dCBvZiBhIGdlbmVyaWMKLSAqIG51bWEgbm9kZSBvbiBhIDY0TWIgYnJlYWsgKGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgd2lsbAotICogcmVwcmVzZW50IDY0TWIgb2YgbWVtb3J5IGFuZCB3aWxsIGJlIG1hcmtlZCBieSB0aGUgbm9kZSBpZC4gIHNvLAotICogaWYgdGhlIGZpcnN0IGdpZyBpcyBvbiBub2RlIDAsIGFuZCB0aGUgc2Vjb25kIGdpZyBpcyBvbiBub2RlIDEKLSAqIHBoeXNub2RlX21hcCB3aWxsIGNvbnRhaW46Ci0gKgotICogICAgIHBoeXNub2RlX21hcFswLTE1XSA9IDA7Ci0gKiAgICAgcGh5c25vZGVfbWFwWzE2LTMxXSA9IDE7Ci0gKiAgICAgcGh5c25vZGVfbWFwWzMyLSBdID0gLTE7Ci0gKi8KLXM4IHBoeXNub2RlX21hcFtNQVhfRUxFTUVOVFNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiAoTUFYX0VMRU1FTlRTIC0gMSldID0gLTF9OwotRVhQT1JUX1NZTUJPTChwaHlzbm9kZV9tYXApOwotCi12b2lkIG1lbW9yeV9wcmVzZW50KGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXVuc2lnbmVkIGxvbmcgcGZuOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiTm9kZTogJWQsIHN0YXJ0X3BmbjogJWx4LCBlbmRfcGZuOiAlbHhcbiIsCi0JCQluaWQsIHN0YXJ0LCBlbmQpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIFNldHRpbmcgcGh5c25vZGVfbWFwIGFycmF5IHRvIG5vZGUgJWQgZm9yIHBmbnM6XG4iLCBuaWQpOwotCXByaW50ayhLRVJOX0RFQlVHICIgICIpOwotCWZvciAocGZuID0gc3RhcnQ7IHBmbiA8IGVuZDsgcGZuICs9IFBBR0VTX1BFUl9FTEVNRU5UKSB7Ci0JCXBoeXNub2RlX21hcFtwZm4gLyBQQUdFU19QRVJfRUxFTUVOVF0gPSBuaWQ7Ci0JCXByaW50ayhLRVJOX0NPTlQgIiVseCAiLCBwZm4pOwotCX0KLQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotfQotCi11bnNpZ25lZCBsb25nIG5vZGVfbWVtbWFwX3NpemVfYnl0ZXMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKLXsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKLQotCWlmICghbnJfcGFnZXMpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIChucl9wYWdlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBwYWdlKTsKLX0KLSNlbmRpZgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBmaW5kX21heF9sb3dfcGZuKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaGlnaGVuZF9wZm4sIGhpZ2hzdGFydF9wZm47Ci0KLSNkZWZpbmUgTEFSR0VfUEFHRV9CWVRFUyAoUFRSU19QRVJfUFRFICogUEFHRV9TSVpFKQotCi11bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfc2l6ZVtNQVhfTlVNTk9ERVNdOwotc3RhdGljIHZvaWQgKm5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbTUFYX05VTU5PREVTXTsKLXZvaWQgc2V0X3BtZF9wZm4odW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IGZsYWdzKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcga3ZhX3N0YXJ0X3BmbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGt2YV9wYWdlczsKLS8qCi0gKiBGTEFUIC0gc3VwcG9ydCBmb3IgYmFzaWMgUEMgbWVtb3J5IG1vZGVsIHdpdGggZGlzY29udGlnIGVuYWJsZWQsIGVzc2VudGlhbGx5Ci0gKiAgICAgICAgYSBzaW5nbGUgbm9kZSB3aXRoIGFsbCBhdmFpbGFibGUgcHJvY2Vzc29ycyBpbiBpdCB3aXRoIGEgZmxhdAotICogICAgICAgIG1lbW9yeSBtYXAuCi0gKi8KLWludCBfX2luaXQgZ2V0X21lbWNmZ19udW1hX2ZsYXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAiTlVNQSAtIHNpbmdsZSBub2RlLCBmbGF0IG1lbW9yeSBtb2RlXG4iKTsKLQotCW5vZGVfc3RhcnRfcGZuWzBdID0gMDsKLQlub2RlX2VuZF9wZm5bMF0gPSBtYXhfcGZuOwotCWU4MjBfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMoMCwgMCwgbWF4X3Bmbik7Ci0JbWVtb3J5X3ByZXNlbnQoMCwgMCwgbWF4X3Bmbik7Ci0Jbm9kZV9yZW1hcF9zaXplWzBdID0gbm9kZV9tZW1tYXBfc2l6ZV9ieXRlcygwLCAwLCBtYXhfcGZuKTsKLQotICAgICAgICAvKiBJbmRpY2F0ZSB0aGVyZSBpcyBvbmUgbm9kZSBhdmFpbGFibGUuICovCi0Jbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKLQlub2RlX3NldF9vbmxpbmUoMCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlIGZvciB0aGUgbm9kZQotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcHJvcGFnYXRlX2U4MjBfbWFwX25vZGUoaW50IG5pZCkKLXsKLQlpZiAobm9kZV9lbmRfcGZuW25pZF0gPiBtYXhfcGZuKQotCQlub2RlX2VuZF9wZm5bbmlkXSA9IG1heF9wZm47Ci0JLyoKLQkgKiBpZiBhIHVzZXIgaGFzIGdpdmVuIG1lbT1YWFhYLCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIAotCSAqIHRoYXQgdGhlIG5vZGUgX3N0YXJ0c18gYmVmb3JlIHRoYXQsIHRvbywgbm90IGp1c3QgZW5kcwotCSAqLwotCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWF4X3BmbikKLQkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1heF9wZm47Ci0JQlVHX09OKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBub2RlX2VuZF9wZm5bbmlkXSk7Ci19Ci0KLS8qIAotICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGdfZGF0YV90IGZvciB0aGlzIG5vZGUgdmlhIGEgY3J1ZGUgcHJlLWJvb3RtZW0KLSAqIG1ldGhvZC4gIEZvciBub2RlIHplcm8gdGFrZSB0aGlzIGZyb20gdGhlIGJvdHRvbSBvZiBtZW1vcnksIGZvcgotICogc3Vic2VxdWVudCBub2RlcyBwbGFjZSB0aGVtIGF0IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHIgd2hpY2ggY29udGFpbnMKLSAqIG5vZGUgbG9jYWwgZGF0YSBpbiBwaHlzaWNhbGx5IG5vZGUgbG9jYWwgbWVtb3J5LiAgU2VlIHNldHVwX21lbW9yeSgpCi0gKiBmb3IgZGV0YWlscy4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGFsbG9jYXRlX3BnZGF0KGludCBuaWQpCi17Ci0JY2hhciBidWZbMTZdOwotCi0JaWYgKG5vZGVfaGFzX29ubGluZV9tZW0obmlkKSAmJiBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0pCi0JCU5PREVfREFUQShuaWQpID0gKHBnX2RhdGFfdCAqKW5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXTsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBwZ2RhdF9waHlzOwotCQlwZ2RhdF9waHlzID0gZmluZF9lODIwX2FyZWEobWluX2xvd19wZm48PFBBR0VfU0hJRlQsCi0JCQkJIG1heF9wZm5fbWFwcGVkPDxQQUdFX1NISUZULAotCQkJCSBzaXplb2YocGdfZGF0YV90KSwKLQkJCQkgUEFHRV9TSVpFKTsKLQkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopKHBmbl90b19rYWRkcihwZ2RhdF9waHlzPj5QQUdFX1NISUZUKSk7Ci0JCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkJc3ByaW50ZihidWYsICJOT0RFX0RBVEEgJWQiLCAgbmlkKTsKLQkJcmVzZXJ2ZV9lYXJseShwZ2RhdF9waHlzLCBwZ2RhdF9waHlzICsgc2l6ZW9mKHBnX2RhdGFfdCksIGJ1Zik7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJhbGxvY2F0ZV9wZ2RhdDogbm9kZSAlZCBOT0RFX0RBVEEgJTA4bHhcbiIsCi0JCW5pZCwgKHVuc2lnbmVkIGxvbmcpTk9ERV9EQVRBKG5pZCkpOwotfQotCi0vKgotICogSW4gdGhlIERJU0NPTlRJR01FTSBhbmQgU1BBUlNFTUVNIG1lbW9yeSBtb2RlbCwgYSBwb3J0aW9uIG9mIHRoZSBrZXJuZWwKLSAqIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAoS1ZBKSBpcyByZXNlcnZlZCBhbmQgcG9ydGlvbnMgb2Ygbm9kZXMgYXJlIG1hcHBlZAotICogdXNpbmcgaXQuIFRoaXMgaXMgdG8gYWxsb3cgbm9kZS1sb2NhbCBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGZvcgotICogc3RydWN0dXJlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IHJlcXVpcmUgWk9ORV9OT1JNQUwuIFRoZSBtZW1vcnkgaXMKLSAqIGFsbG9jYXRlZCB3aXRoIGFsbG9jX3JlbWFwKCkgYW5kIGNhbGxlcnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGFsbG9jYXRlCi0gKiBmcm9tIHRoZSBib290bWVtIGFsbG9jYXRvciBpbnN0ZWFkLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBub2RlX3JlbWFwX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOwotc3RhdGljIHZvaWQgKm5vZGVfcmVtYXBfZW5kX3ZhZGRyW01BWF9OVU1OT0RFU107Ci1zdGF0aWMgdm9pZCAqbm9kZV9yZW1hcF9hbGxvY192YWRkcltNQVhfTlVNTk9ERVNdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9vZmZzZXRbTUFYX05VTU5PREVTXTsKLQotdm9pZCAqYWxsb2NfcmVtYXAoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXZvaWQgKmFsbG9jYXRpb24gPSBub2RlX3JlbWFwX2FsbG9jX3ZhZGRyW25pZF07Ci0KLQlzaXplID0gQUxJR04oc2l6ZSwgTDFfQ0FDSEVfQllURVMpOwotCi0JaWYgKCFhbGxvY2F0aW9uIHx8IChhbGxvY2F0aW9uICsgc2l6ZSkgPj0gbm9kZV9yZW1hcF9lbmRfdmFkZHJbbmlkXSkKLQkJcmV0dXJuIDA7Ci0KLQlub2RlX3JlbWFwX2FsbG9jX3ZhZGRyW25pZF0gKz0gc2l6ZTsKLQltZW1zZXQoYWxsb2NhdGlvbiwgMCwgc2l6ZSk7Ci0KLQlyZXR1cm4gYWxsb2NhdGlvbjsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHJlbWFwX251bWFfa3ZhKHZvaWQpCi17Ci0Jdm9pZCAqdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JaW50IG5vZGU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJyZW1hcF9udW1hX2t2YTogbm9kZSAlZFxuIiwgbm9kZSk7Ci0JCWZvciAocGZuPTA7IHBmbiA8IG5vZGVfcmVtYXBfc2l6ZVtub2RlXTsgcGZuICs9IFBUUlNfUEVSX1BURSkgewotCQkJdmFkZHIgPSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25vZGVdKyhwZm48PFBBR0VfU0hJRlQpOwotCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbWFwX251bWFfa3ZhOiAlMDhseCB0byBwZm4gJTA4bHhcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpdmFkZHIsCi0JCQkJbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV0gKyBwZm4pOwotCQkJc2V0X3BtZF9wZm4oKHVsb25nKSB2YWRkciwgCi0JCQkJbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV0gKyBwZm4sIAotCQkJCVBBR0VfS0VSTkVMX0xBUkdFKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX251bWFfcmVtYXBfcGFnZXModm9pZCkKLXsKLQlpbnQgbmlkOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcmVzZXJ2ZV9wYWdlcyA9IDA7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKLQkJdTY0IG5vZGVfa3ZhX3RhcmdldDsKLQkJdTY0IG5vZGVfa3ZhX2ZpbmFsOwotCi0JCS8qCi0JCSAqIFRoZSBhY3BpL3NyYXQgbm9kZSBpbmZvIGNhbiBzaG93IGhvdC1hZGQgbWVtcm95IHpvbmVzCi0JCSAqIHdoZXJlIG1lbW9yeSBjb3VsZCBiZSBhZGRlZCBidXQgbm90IGN1cnJlbnRseSBwcmVzZW50LgotCQkgKi8KLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgJWQgcGZuOiBbJWx4IC0gJWx4XVxuIiwKLQkJCW5pZCwgbm9kZV9zdGFydF9wZm5bbmlkXSwgbm9kZV9lbmRfcGZuW25pZF0pOwotCQlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA+IG1heF9wZm4pCi0JCQljb250aW51ZTsKLQkJaWYgKCFub2RlX2VuZF9wZm5bbmlkXSkKLQkJCWNvbnRpbnVlOwotCQlpZiAobm9kZV9lbmRfcGZuW25pZF0gPiBtYXhfcGZuKQotCQkJbm9kZV9lbmRfcGZuW25pZF0gPSBtYXhfcGZuOwotCi0JCS8qIGVuc3VyZSB0aGUgcmVtYXAgaW5jbHVkZXMgc3BhY2UgZm9yIHRoZSBwZ2RhdC4gKi8KLQkJc2l6ZSA9IG5vZGVfcmVtYXBfc2l6ZVtuaWRdICsgc2l6ZW9mKHBnX2RhdGFfdCk7Ci0KLQkJLyogY29udmVydCBzaXplIHRvIGxhcmdlIChwbWQgc2l6ZSkgcGFnZXMsIHJvdW5kaW5nIHVwICovCi0JCXNpemUgPSAoc2l6ZSArIExBUkdFX1BBR0VfQllURVMgLSAxKSAvIExBUkdFX1BBR0VfQllURVM7Ci0JCS8qIG5vdyB0aGUgcm91bmR1cCBpcyBjb3JyZWN0LCBjb252ZXJ0IHRvIFBBR0VfU0laRSBwYWdlcyAqLwotCQlzaXplID0gc2l6ZSAqIFBUUlNfUEVSX1BURTsKLQotCQlub2RlX2t2YV90YXJnZXQgPSByb3VuZF9kb3duKG5vZGVfZW5kX3BmbltuaWRdIC0gc2l6ZSwKLQkJCQkJCSBQVFJTX1BFUl9QVEUpOwotCQlub2RlX2t2YV90YXJnZXQgPDw9IFBBR0VfU0hJRlQ7Ci0JCWRvIHsKLQkJCW5vZGVfa3ZhX2ZpbmFsID0gZmluZF9lODIwX2FyZWEobm9kZV9rdmFfdGFyZ2V0LAotCQkJCQkoKHU2NClub2RlX2VuZF9wZm5bbmlkXSk8PFBBR0VfU0hJRlQsCi0JCQkJCQkoKHU2NClzaXplKTw8UEFHRV9TSElGVCwKLQkJCQkJCUxBUkdFX1BBR0VfQllURVMpOwotCQkJbm9kZV9rdmFfdGFyZ2V0IC09IExBUkdFX1BBR0VfQllURVM7Ci0JCX0gd2hpbGUgKG5vZGVfa3ZhX2ZpbmFsID09IC0xVUxMICYmCi0JCQkgKG5vZGVfa3ZhX3RhcmdldD4+UEFHRV9TSElGVCkgPiAobm9kZV9zdGFydF9wZm5bbmlkXSkpOwotCi0JCWlmIChub2RlX2t2YV9maW5hbCA9PSAtMVVMTCkKLQkJCXBhbmljKCJDYW4gbm90IGdldCBrdmEgcmFtXG4iKTsKLQotCQlub2RlX3JlbWFwX3NpemVbbmlkXSA9IHNpemU7Ci0JCW5vZGVfcmVtYXBfb2Zmc2V0W25pZF0gPSByZXNlcnZlX3BhZ2VzOwotCQlyZXNlcnZlX3BhZ2VzICs9IHNpemU7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSZXNlcnZpbmcgJWxkIHBhZ2VzIG9mIEtWQSBmb3IgbG1lbV9tYXAgb2YiCi0JCQkJICAiIG5vZGUgJWQgYXQgJWxseFxuIiwKLQkJCQlzaXplLCBuaWQsIG5vZGVfa3ZhX2ZpbmFsPj5QQUdFX1NISUZUKTsKLQotCQkvKgotCQkgKiAgcHJldmVudCBrdmEgYWRkcmVzcyBiZWxvdyBtYXhfbG93X3BmbiB3YW50IGl0IG9uIHN5c3RlbQotCQkgKiAgd2l0aCBsZXNzIG1lbW9yeSBsYXRlci4KLQkJICogIGxheW91dCB3aWxsIGJlOiBLVkEgYWRkcmVzcyAsIEtWQSBSQU0KLQkJICoKLQkJICogIHdlIGFyZSBzdXBwb3NlZCB0byBvbmx5IHJlY29yZCB0aGUgb25lIGxlc3MgdGhlbiBtYXhfbG93X3BmbgotCQkgKiAgYnV0IHdlIGNvdWxkIGhhdmUgc29tZSBob2xlIGluIGhpZ2ggbWVtb3J5LCBhbmQgaXQgd2lsbCBvbmx5Ci0JCSAqICBjaGVjayBwYWdlX2lzX3JhbShwZm4pICYmICFwYWdlX2lzX3Jlc2VydmVkX2Vhcmx5KHBmbikgdG8gZGVjaWRlCi0JCSAqICB0byB1c2UgaXQgYXMgZnJlZS4KLQkJICogIFNvIHJlc2VydmVfZWFybHkgaGVyZSwgaG9wZSB3ZSBkb24ndCBydW4gb3V0IG9mIHRoYXQgYXJyYXkKLQkJICovCi0JCXJlc2VydmVfZWFybHkobm9kZV9rdmFfZmluYWwsCi0JCQkgICAgICBub2RlX2t2YV9maW5hbCsoKCh1NjQpc2l6ZSk8PFBBR0VfU0hJRlQpLAotCQkJICAgICAgIktWQSBSQU0iKTsKLQotCQlub2RlX3JlbWFwX3N0YXJ0X3BmbltuaWRdID0gbm9kZV9rdmFfZmluYWw+PlBBR0VfU0hJRlQ7Ci0JCXJlbW92ZV9hY3RpdmVfcmFuZ2UobmlkLCBub2RlX3JlbWFwX3N0YXJ0X3BmbltuaWRdLAotCQkJCQkgbm9kZV9yZW1hcF9zdGFydF9wZm5bbmlkXSArIHNpemUpOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJSZXNlcnZpbmcgdG90YWwgb2YgJWx4IHBhZ2VzIGZvciBudW1hIEtWQSByZW1hcFxuIiwKLQkJCXJlc2VydmVfcGFnZXMpOwotCXJldHVybiByZXNlcnZlX3BhZ2VzOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3JlbWFwX2FsbG9jYXRvcihpbnQgbmlkKQotewotCW5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSA9IHBmbl90b19rYWRkcigKLQkJCWt2YV9zdGFydF9wZm4gKyBub2RlX3JlbWFwX29mZnNldFtuaWRdKTsKLQlub2RlX3JlbWFwX2VuZF92YWRkcltuaWRdID0gbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdICsKLQkJKG5vZGVfcmVtYXBfc2l6ZVtuaWRdICogUEFHRV9TSVpFKTsKLQlub2RlX3JlbWFwX2FsbG9jX3ZhZGRyW25pZF0gPSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0gKwotCQlBTElHTihzaXplb2YocGdfZGF0YV90KSwgUEFHRV9TSVpFKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJub2RlICVkIHdpbGwgcmVtYXAgdG8gdmFkZHIgJTA4bHggLSAlMDhseFxuIiwgbmlkLAotCQkodWxvbmcpIG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSwKLQkJKHVsb25nKSBub2RlX3JlbWFwX2VuZF92YWRkcltuaWRdKTsKLX0KLQotdm9pZCBfX2luaXQgaW5pdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCSAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCWludCBuaWQ7Ci0JbG9uZyBrdmFfdGFyZ2V0X3BmbjsKLQotCS8qCi0JICogV2hlbiBtYXBwaW5nIGEgTlVNQSBtYWNoaW5lIHdlIGFsbG9jYXRlIHRoZSBub2RlX21lbV9tYXAgYXJyYXlzCi0JICogZnJvbSBub2RlIGxvY2FsIG1lbW9yeS4gIFRoZXkgYXJlIHRoZW4gbWFwcGVkIGRpcmVjdGx5IGludG8gS1ZBCi0JICogYmV0d2VlbiB6b25lIG5vcm1hbCBhbmQgdm1hbGxvYyBzcGFjZS4gIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZgotCSAqIHRoaXMgc3BhY2UgYW5kIHVzZSBpdCB0byBhZGp1c3QgdGhlIGJvdW5kYXJ5IGJldHdlZW4gWk9ORV9OT1JNQUwKLQkgKiBhbmQgWk9ORV9ISUdITUVNLgotCSAqLwotCi0JZ2V0X21lbWNmZ19udW1hKCk7Ci0KLQlrdmFfcGFnZXMgPSByb3VuZF91cChjYWxjdWxhdGVfbnVtYV9yZW1hcF9wYWdlcygpLCBQVFJTX1BFUl9QVEUpOwotCi0Ja3ZhX3RhcmdldF9wZm4gPSByb3VuZF9kb3duKG1heF9sb3dfcGZuIC0ga3ZhX3BhZ2VzLCBQVFJTX1BFUl9QVEUpOwotCWRvIHsKLQkJa3ZhX3N0YXJ0X3BmbiA9IGZpbmRfZTgyMF9hcmVhKGt2YV90YXJnZXRfcGZuPDxQQUdFX1NISUZULAotCQkJCQltYXhfbG93X3Bmbjw8UEFHRV9TSElGVCwKLQkJCQkJa3ZhX3BhZ2VzPDxQQUdFX1NISUZULAotCQkJCQlQVFJTX1BFUl9QVEU8PFBBR0VfU0hJRlQpID4+IFBBR0VfU0hJRlQ7Ci0JCWt2YV90YXJnZXRfcGZuIC09IFBUUlNfUEVSX1BURTsKLQl9IHdoaWxlIChrdmFfc3RhcnRfcGZuID09IC0xVUwgJiYga3ZhX3RhcmdldF9wZm4gPiBtaW5fbG93X3Bmbik7Ci0KLQlpZiAoa3ZhX3N0YXJ0X3BmbiA9PSAtMVVMKQotCQlwYW5pYygiQ2FuIG5vdCBnZXQga3ZhIHNwYWNlXG4iKTsKLQotCXByaW50ayhLRVJOX0lORk8gImt2YV9zdGFydF9wZm4gfiAlbHggbWF4X2xvd19wZm4gfiAlbHhcbiIsCi0JCWt2YV9zdGFydF9wZm4sIG1heF9sb3dfcGZuKTsKLQlwcmludGsoS0VSTl9JTkZPICJtYXhfcGZuID0gJWx4XG4iLCBtYXhfcGZuKTsKLQotCS8qIGF2b2lkIGNsYXNoIHdpdGggaW5pdHJkICovCi0JcmVzZXJ2ZV9lYXJseShrdmFfc3RhcnRfcGZuPDxQQUdFX1NISUZULAotCQkgICAgICAoa3ZhX3N0YXJ0X3BmbiArIGt2YV9wYWdlcyk8PFBBR0VfU0hJRlQsCi0JCSAgICAgIktWQSBQRyIpOwotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JaGlnaHN0YXJ0X3BmbiA9IGhpZ2hlbmRfcGZuID0gbWF4X3BmbjsKLQlpZiAobWF4X3BmbiA+IG1heF9sb3dfcGZuKQotCQloaWdoc3RhcnRfcGZuID0gbWF4X2xvd19wZm47Ci0JcHJpbnRrKEtFUk5fTk9USUNFICIlbGRNQiBISUdITUVNIGF2YWlsYWJsZS5cbiIsCi0JICAgICAgIHBhZ2VzX3RvX21iKGhpZ2hlbmRfcGZuIC0gaGlnaHN0YXJ0X3BmbikpOwotCW51bV9waHlzcGFnZXMgPSBoaWdoZW5kX3BmbjsKLQloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEoaGlnaHN0YXJ0X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKLSNlbHNlCi0JbnVtX3BoeXNwYWdlcyA9IG1heF9sb3dfcGZuOwotCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKLSNlbmRpZgotCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgTE9XTUVNIGF2YWlsYWJsZS5cbiIsCi0JCQlwYWdlc190b19tYihtYXhfbG93X3BmbikpOwotCXByaW50ayhLRVJOX0RFQlVHICJtYXhfbG93X3BmbiA9ICVseCwgaGlnaHN0YXJ0X3BmbiA9ICVseFxuIiwKLQkJCW1heF9sb3dfcGZuLCBoaWdoc3RhcnRfcGZuKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJMb3cgbWVtb3J5IGVuZHMgYXQgdmFkZHIgJTA4bHhcbiIsCi0JCQkodWxvbmcpIHBmbl90b19rYWRkcihtYXhfbG93X3BmbikpOwotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewotCQlpbml0X3JlbWFwX2FsbG9jYXRvcihuaWQpOwotCi0JCWFsbG9jYXRlX3BnZGF0KG5pZCk7Ci0JfQotCXJlbWFwX251bWFfa3ZhKCk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiSGlnaCBtZW1vcnkgc3RhcnRzIGF0IHZhZGRyICUwOGx4XG4iLAotCQkJKHVsb25nKSBwZm5fdG9fa2FkZHIoaGlnaHN0YXJ0X3BmbikpOwotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKLQkJcHJvcGFnYXRlX2U4MjBfbWFwX25vZGUobmlkKTsKLQotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKLQkJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7Ci0KLQlOT0RFX0RBVEEoMCktPmJkYXRhID0gJmJvb3RtZW1fbm9kZV9kYXRhWzBdOwotCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKCk7Ci19Ci0KLXZvaWQgX19pbml0IHNldF9oaWdobWVtX3BhZ2VzX2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfSElHSE1FTQotCXN0cnVjdCB6b25lICp6b25lOwotCWludCBuaWQ7Ci0KLQlmb3JfZWFjaF96b25lKHpvbmUpIHsKLQkJdW5zaWduZWQgbG9uZyB6b25lX3N0YXJ0X3Bmbiwgem9uZV9lbmRfcGZuOwotCi0JCWlmICghaXNfaGlnaG1lbSh6b25lKSkKLQkJCWNvbnRpbnVlOwotCi0JCXpvbmVfc3RhcnRfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm47Ci0JCXpvbmVfZW5kX3BmbiA9IHpvbmVfc3RhcnRfcGZuICsgem9uZS0+c3Bhbm5lZF9wYWdlczsKLQotCQluaWQgPSB6b25lX3RvX25pZCh6b25lKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nICVzIGZvciBub2RlICVkICglMDhseDolMDhseClcbiIsCi0JCQkJem9uZS0+bmFtZSwgbmlkLCB6b25lX3N0YXJ0X3Bmbiwgem9uZV9lbmRfcGZuKTsKLQotCQlhZGRfaGlnaHBhZ2VzX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCB6b25lX3N0YXJ0X3BmbiwKLQkJCQkgem9uZV9lbmRfcGZuKTsKLQl9Ci0JdG90YWxyYW1fcGFnZXMgKz0gdG90YWxoaWdoX3BhZ2VzOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKLXN0YXRpYyBpbnQgcGFkZHJfdG9fbmlkKHU2NCBhZGRyKQotewotCWludCBuaWQ7Ci0JdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihhZGRyKTsKLQotCWZvcl9lYWNoX25vZGUobmlkKQotCQlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA8PSBwZm4gJiYKLQkJICAgIHBmbiA8IG5vZGVfZW5kX3BmbltuaWRdKQotCQkJcmV0dXJuIG5pZDsKLQotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc2sgbm9kZSBpZCBCRUZPUkUgbWVtbWFwIGFuZCBtZW1fc2VjdGlvbidzCi0gKiBpbml0aWFsaXphdGlvbiAocGZuX3RvX25pZCgpIGNhbid0IGJlIHVzZWQgeWV0KS4KLSAqIElmIF9QWE0gaXMgbm90IGRlZmluZWQgb24gQUNQSSdzIERTRFQsIG5vZGUgaWQgbXVzdCBiZSBmb3VuZCBieSB0aGlzLgotICovCi1pbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IGFkZHIpCi17Ci0JaW50IG5pZCA9IHBhZGRyX3RvX25pZChhZGRyKTsKLQlyZXR1cm4gKG5pZCA+PSAwKSA/IG5pZCA6IDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYyBiL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCmluZGV4IGEyMGQxZmEuLmU3Mjc3Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCisrKyBiL2FyY2gveDg2L21tL2R1bXBfcGFnZXRhYmxlcy5jCkBAIC0xNDgsOCArMTQ4LDggQEAKIAkgKiB3ZSBoYXZlIG5vdy4gImJyZWFrIiBpcyBlaXRoZXIgY2hhbmdpbmcgcGVybXMsIGxldmVscyBvcgogCSAqIGFkZHJlc3Mgc3BhY2UgbWFya2VyLgogCSAqLwotCXByb3QgPSBwZ3Byb3RfdmFsKG5ld19wcm90KSAmIH4oUFRFX1BGTl9NQVNLKTsKLQljdXIgPSBwZ3Byb3RfdmFsKHN0LT5jdXJyZW50X3Byb3QpICYgfihQVEVfUEZOX01BU0spOworCXByb3QgPSBwZ3Byb3RfdmFsKG5ld19wcm90KSAmIFBURV9GTEFHU19NQVNLOworCWN1ciA9IHBncHJvdF92YWwoc3QtPmN1cnJlbnRfcHJvdCkgJiBQVEVfRkxBR1NfTUFTSzsKIAogCWlmICghc3QtPmxldmVsKSB7CiAJCS8qIEZpcnN0IGVudHJ5ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA0NTVmM2ZlLi4zMWU4NzMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiAvKgogICogUGFnZSBmYXVsdCBlcnJvciBjb2RlIGJpdHMKQEAgLTM1Nyw4ICszNTgsNiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGRvX2ludmFsaWRfb3Aoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZyk7Ci0KIHN0YXRpYyBpbnQgaXNfZjAwZl9idWcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKICNpZmRlZiBDT05GSUdfWDg2X0YwMEZfQlVHCkBAIC01OTMsMTEgKzU5Miw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKICNlbmRpZgogCi0JLyoKLQkgKiBXZSBjYW4gZmF1bHQgZnJvbSBwcmV0dHkgbXVjaCBhbnl3aGVyZSwgd2l0aCB1bmtub3duIElSUSBzdGF0ZS4KLQkgKi8KLQl0cmFjZV9oYXJkaXJxc19maXh1cCgpOwotCiAJdHNrID0gY3VycmVudDsKIAltbSA9IHRzay0+bW07CiAJcHJlZmV0Y2h3KCZtbS0+bW1hcF9zZW0pOwpAQCAtNjQ2LDI0ICs2NDAsMjMgQEAKIAl9CiAKIAotI2lmZGVmIENPTkZJR19YODZfMzIKLQkvKiBJdCdzIHNhZmUgdG8gYWxsb3cgaXJxJ3MgYWZ0ZXIgY3IyIGhhcyBiZWVuIHNhdmVkIGFuZCB0aGUgdm1hbGxvYwotCSAgIGZhdWx0IGhhcyBiZWVuIGhhbmRsZWQuICovCi0JaWYgKHJlZ3MtPmZsYWdzICYgKFg4Nl9FRkxBR1NfSUYgfCBYODZfVk1fTUFTSykpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQogCS8qCi0JICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0LCBoYXZlIG5vIHVzZXIgY29udGV4dCBvciBhcmUgcnVubmluZyBpbiBhbgotCSAqIGF0b21pYyByZWdpb24gdGhlbiB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBmYXVsdC4KKwkgKiBJdCdzIHNhZmUgdG8gYWxsb3cgaXJxJ3MgYWZ0ZXIgY3IyIGhhcyBiZWVuIHNhdmVkIGFuZCB0aGUKKwkgKiB2bWFsbG9jIGZhdWx0IGhhcyBiZWVuIGhhbmRsZWQuCisJICoKKwkgKiBVc2VyLW1vZGUgcmVnaXN0ZXJzIGNvdW50IGFzIGEgdXNlciBhY2Nlc3MgZXZlbiBmb3IgYW55CisJICogcG90ZW50aWFsIHN5c3RlbSBmYXVsdCBvciBDUFUgYnVnbGV0LgogCSAqLwotCWlmIChpbl9hdG9taWMoKSB8fCAhbW0pCi0JCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7Ci0jZWxzZSAvKiBDT05GSUdfWDg2XzY0ICovCi0JaWYgKGxpa2VseShyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpKQorCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQllcnJvcl9jb2RlIHw9IFBGX1VTRVI7CisJfSBlbHNlIGlmIChyZWdzLT5mbGFncyAmIFg4Nl9FRkxBR1NfSUYpCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAorI2lmZGVmIENPTkZJR19YODZfNjQKIAlpZiAodW5saWtlbHkoZXJyb3JfY29kZSAmIFBGX1JTVkQpKQogCQlwZ3RhYmxlX2JhZChhZGRyZXNzLCByZWdzLCBlcnJvcl9jb2RlKTsKKyNlbmRpZgogCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQsIGhhdmUgbm8gdXNlciBjb250ZXh0IG9yIGFyZSBydW5uaW5nIGluIGFuCkBAIC02NzIsMTUgKzY2NSw5IEBACiAJaWYgKHVubGlrZWx5KGluX2F0b21pYygpIHx8ICFtbSkpCiAJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CiAKLQkvKgotCSAqIFVzZXItbW9kZSByZWdpc3RlcnMgY291bnQgYXMgYSB1c2VyIGFjY2VzcyBldmVuIGZvciBhbnkKLQkgKiBwb3RlbnRpYWwgc3lzdGVtIGZhdWx0IG9yIENQVSBidWdsZXQuCi0JICovCi0JaWYgKHVzZXJfbW9kZV92bShyZWdzKSkKLQkJZXJyb3JfY29kZSB8PSBQRl9VU0VSOwogYWdhaW46Ci0jZW5kaWYKLQkvKiBXaGVuIHJ1bm5pbmcgaW4gdGhlIGtlcm5lbCB3ZSBleHBlY3QgZmF1bHRzIHRvIG9jY3VyIG9ubHkgdG8KKwkvKgorCSAqIFdoZW4gcnVubmluZyBpbiB0aGUga2VybmVsIHdlIGV4cGVjdCBmYXVsdHMgdG8gb2NjdXIgb25seSB0bwogCSAqIGFkZHJlc3NlcyBpbiB1c2VyIHNwYWNlLiAgQWxsIG90aGVyIGZhdWx0cyByZXByZXNlbnQgZXJyb3JzIGluIHRoZQogCSAqIGtlcm5lbCBhbmQgc2hvdWxkIGdlbmVyYXRlIGFuIE9PUFMuICBVbmZvcnR1bmF0ZWx5LCBpbiB0aGUgY2FzZSBvZiBhbgogCSAqIGVycm9uZW91cyBmYXVsdCBvY2N1cnJpbmcgaW4gYSBjb2RlIHBhdGggd2hpY2ggYWxyZWFkeSBob2xkcyBtbWFwX3NlbQpAQCAtNzQzLDkgKzczMCw2IEBACiAJCQlnb3RvIGJhZF9hcmVhOwogCX0KIAotI2lmZGVmIENPTkZJR19YODZfMzIKLXN1cnZpdmU6Ci0jZW5kaWYKIAkvKgogCSAqIElmIGZvciBhbnkgcmVhc29uIGF0IGFsbCB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlIGZhdWx0LAogCSAqIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW5kbGVzc2x5IHJlZG8KQEAgLTg4MCwxMiArODY0LDExIEBACiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAlpZiAoaXNfZ2xvYmFsX2luaXQodHNrKSkgewogCQl5aWVsZCgpOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQlnb3RvIHN1cnZpdmU7Ci0jZWxzZQorCQkvKgorCQkgKiBSZS1sb29rdXAgdGhlIHZtYSAtIGluIHRoZW9yeSB0aGUgdm1hIHRyZWUgbWlnaHQKKwkJICogaGF2ZSBjaGFuZ2VkOgorCQkgKi8KIAkJZ290byBhZ2FpbjsKLSNlbmRpZgogCX0KIAogCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKQEAgLTkxNSwxNSArODk4LDE1IEBACiAKIHZvaWQgdm1hbGxvY19zeW5jX2FsbCh2b2lkKQogewotI2lmZGVmIENPTkZJR19YODZfMzIKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gVk1BTExPQ19TVEFSVCAmIFBHRElSX01BU0s7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWlmIChTSEFSRURfS0VSTkVMX1BNRCkKIAkJcmV0dXJuOwogCi0JQlVJTERfQlVHX09OKFRBU0tfU0laRSAmIH5QR0RJUl9NQVNLKTsKLQlmb3IgKGFkZHJlc3MgPSBzdGFydDsgYWRkcmVzcyA+PSBUQVNLX1NJWkU7IGFkZHJlc3MgKz0gUEdESVJfU0laRSkgeworCWZvciAoYWRkcmVzcyA9IFZNQUxMT0NfU1RBUlQgJiBQTURfTUFTSzsKKwkgICAgIGFkZHJlc3MgPj0gVEFTS19TSVpFICYmIGFkZHJlc3MgPCBGSVhBRERSX1RPUDsKKwkgICAgIGFkZHJlc3MgKz0gUE1EX1NJWkUpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKQEAgLTkzNiwxMCArOTE5LDggQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKIAl9CiAjZWxzZSAvKiBDT05GSUdfWDg2XzY0ICovCi0JdW5zaWduZWQgbG9uZyBzdGFydCA9IFZNQUxMT0NfU1RBUlQgJiBQR0RJUl9NQVNLOwotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQotCWZvciAoYWRkcmVzcyA9IHN0YXJ0OyBhZGRyZXNzIDw9IFZNQUxMT0NfRU5EOyBhZGRyZXNzICs9IFBHRElSX1NJWkUpIHsKKwlmb3IgKGFkZHJlc3MgPSBWTUFMTE9DX1NUQVJUICYgUEdESVJfTUFTSzsgYWRkcmVzcyA8PSBWTUFMTE9DX0VORDsKKwkgICAgIGFkZHJlc3MgKz0gUEdESVJfU0laRSkgewogCQljb25zdCBwZ2RfdCAqcGdkX3JlZiA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9ndXAuYyBiL2FyY2gveDg2L21tL2d1cC5jCmluZGV4IDAwN2JiMDYuLjRiYTM3M2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2d1cC5jCisrKyBiL2FyY2gveDg2L21tL2d1cC5jCkBAIC04Miw3ICs4Miw3IEBACiAJCXB0ZV90IHB0ZSA9IGd1cF9nZXRfcHRlKHB0ZXApOwogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQlpZiAoKHB0ZV92YWwocHRlKSAmIChtYXNrIHwgX1BBR0VfU1BFQ0lBTCkpICE9IG1hc2spIHsKKwkJaWYgKChwdGVfZmxhZ3MocHRlKSAmIChtYXNrIHwgX1BBR0VfU1BFQ0lBTCkpICE9IG1hc2spIHsKIAkJCXB0ZV91bm1hcChwdGVwKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMTYsMTAgKzExNiwxMCBAQAogCW1hc2sgPSBfUEFHRV9QUkVTRU5UfF9QQUdFX1VTRVI7CiAJaWYgKHdyaXRlKQogCQltYXNrIHw9IF9QQUdFX1JXOwotCWlmICgocHRlX3ZhbChwdGUpICYgbWFzaykgIT0gbWFzaykKKwlpZiAoKHB0ZV9mbGFncyhwdGUpICYgbWFzaykgIT0gbWFzaykKIAkJcmV0dXJuIDA7CiAJLyogaHVnZXBhZ2VzIGFyZSBuZXZlciAic3BlY2lhbCIgKi8KLQlWTV9CVUdfT04ocHRlX3ZhbChwdGUpICYgX1BBR0VfU1BFQ0lBTCk7CisJVk1fQlVHX09OKHB0ZV9mbGFncyhwdGUpICYgX1BBR0VfU1BFQ0lBTCk7CiAJVk1fQlVHX09OKCFwZm5fdmFsaWQocHRlX3BmbihwdGUpKSk7CiAKIAlyZWZzID0gMDsKQEAgLTE3MywxMCArMTczLDEwIEBACiAJbWFzayA9IF9QQUdFX1BSRVNFTlR8X1BBR0VfVVNFUjsKIAlpZiAod3JpdGUpCiAJCW1hc2sgfD0gX1BBR0VfUlc7Ci0JaWYgKChwdGVfdmFsKHB0ZSkgJiBtYXNrKSAhPSBtYXNrKQorCWlmICgocHRlX2ZsYWdzKHB0ZSkgJiBtYXNrKSAhPSBtYXNrKQogCQlyZXR1cm4gMDsKIAkvKiBodWdlcGFnZXMgYXJlIG5ldmVyICJzcGVjaWFsIiAqLwotCVZNX0JVR19PTihwdGVfdmFsKHB0ZSkgJiBfUEFHRV9TUEVDSUFMKTsKKwlWTV9CVUdfT04ocHRlX2ZsYWdzKHB0ZSkgJiBfUEFHRV9TUEVDSUFMKTsKIAlWTV9CVUdfT04oIXBmbl92YWxpZChwdGVfcGZuKHB0ZSkpKTsKIAogCXJlZnMgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IGQzN2YyOTMuLjgzOTY4NjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL2Jpb3NfZWJkYS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ3LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogdW5zaWduZWQgaW50IF9fVk1BTExPQ19SRVNFUlZFID0gMTI4IDw8IDIwOwogCkBAIC0xOTQsMTEgKzE5NiwzMCBAQAogCXBnZF90ICpwZ2Q7CiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlOwotCXVuc2lnbmVkIHBhZ2VzXzJtID0gMCwgcGFnZXNfNGsgPSAwOworCXVuc2lnbmVkIHBhZ2VzXzJtLCBwYWdlc180azsKKwlpbnQgbWFwcGluZ19pdGVyOworCisJLyoKKwkgKiBGaXJzdCBpdGVyYXRpb24gd2lsbCBzZXR1cCBpZGVudGl0eSBtYXBwaW5nIHVzaW5nIGxhcmdlL3NtYWxsIHBhZ2VzCisJICogYmFzZWQgb24gdXNlX3BzZSwgd2l0aCBvdGhlciBhdHRyaWJ1dGVzIHNhbWUgYXMgc2V0IGJ5CisJICogdGhlIGVhcmx5IGNvZGUgaW4gaGVhZF8zMi5TCisJICoKKwkgKiBTZWNvbmQgaXRlcmF0aW9uIHdpbGwgc2V0dXAgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgKE5YLCBHTE9CQUwuLikKKwkgKiBhcyBkZXNpcmVkIGZvciB0aGUga2VybmVsIGlkZW50aXR5IG1hcHBpbmcuCisJICoKKwkgKiBUaGlzIHR3byBwYXNzIG1lY2hhbmlzbSBjb25mb3JtcyB0byB0aGUgVExCIGFwcCBub3RlIHdoaWNoIHNheXM6CisJICoKKwkgKiAgICAgIlNvZnR3YXJlIHNob3VsZCBub3Qgd3JpdGUgdG8gYSBwYWdpbmctc3RydWN0dXJlIGVudHJ5IGluIGEgd2F5CisJICogICAgICB0aGF0IHdvdWxkIGNoYW5nZSwgZm9yIGFueSBsaW5lYXIgYWRkcmVzcywgYm90aCB0aGUgcGFnZSBzaXplCisJICogICAgICBhbmQgZWl0aGVyIHRoZSBwYWdlIGZyYW1lIG9yIGF0dHJpYnV0ZXMuIgorCSAqLworCW1hcHBpbmdfaXRlciA9IDE7CiAKIAlpZiAoIWNwdV9oYXNfcHNlKQogCQl1c2VfcHNlID0gMDsKIAorcmVwZWF0OgorCXBhZ2VzXzJtID0gcGFnZXNfNGsgPSAwOwogCXBmbiA9IHN0YXJ0X3BmbjsKIAlwZ2RfaWR4ID0gcGdkX2luZGV4KChwZm48PFBBR0VfU0hJRlQpICsgUEFHRV9PRkZTRVQpOwogCXBnZCA9IHBnZF9iYXNlICsgcGdkX2lkeDsKQEAgLTIyNCw2ICsyNDUsMTMgQEAKIAkJCWlmICh1c2VfcHNlKSB7CiAJCQkJdW5zaWduZWQgaW50IGFkZHIyOwogCQkJCXBncHJvdF90IHByb3QgPSBQQUdFX0tFUk5FTF9MQVJHRTsKKwkJCQkvKgorCQkJCSAqIGZpcnN0IHBhc3Mgd2lsbCB1c2UgdGhlIHNhbWUgaW5pdGlhbAorCQkJCSAqIGlkZW50aXR5IG1hcHBpbmcgYXR0cmlidXRlICsgX1BBR0VfUFNFLgorCQkJCSAqLworCQkJCXBncHJvdF90IGluaXRfcHJvdCA9CisJCQkJCV9fcGdwcm90KFBURV9JREVOVF9BVFRSIHwKKwkJCQkJCSBfUEFHRV9QU0UpOwogCiAJCQkJYWRkcjIgPSAocGZuICsgUFRSU19QRVJfUFRFLTEpICogUEFHRV9TSVpFICsKIAkJCQkJUEFHRV9PRkZTRVQgKyBQQUdFX1NJWkUtMTsKQEAgLTIzMyw3ICsyNjEsMTAgQEAKIAkJCQkJcHJvdCA9IFBBR0VfS0VSTkVMX0xBUkdFX0VYRUM7CiAKIAkJCQlwYWdlc18ybSsrOwotCQkJCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgcHJvdCkpOworCQkJCWlmIChtYXBwaW5nX2l0ZXIgPT0gMSkKKwkJCQkJc2V0X3BtZChwbWQsIHBmbl9wbWQocGZuLCBpbml0X3Byb3QpKTsKKwkJCQllbHNlCisJCQkJCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgcHJvdCkpOwogCiAJCQkJcGZuICs9IFBUUlNfUEVSX1BURTsKIAkJCQljb250aW51ZTsKQEAgLTI0NSwxNyArMjc2LDQzIEBACiAJCQlmb3IgKDsgcHRlX29mcyA8IFBUUlNfUEVSX1BURSAmJiBwZm4gPCBlbmRfcGZuOwogCQkJICAgICBwdGUrKywgcGZuKyssIHB0ZV9vZnMrKywgYWRkciArPSBQQUdFX1NJWkUpIHsKIAkJCQlwZ3Byb3RfdCBwcm90ID0gUEFHRV9LRVJORUw7CisJCQkJLyoKKwkJCQkgKiBmaXJzdCBwYXNzIHdpbGwgdXNlIHRoZSBzYW1lIGluaXRpYWwKKwkJCQkgKiBpZGVudGl0eSBtYXBwaW5nIGF0dHJpYnV0ZS4KKwkJCQkgKi8KKwkJCQlwZ3Byb3RfdCBpbml0X3Byb3QgPSBfX3BncHJvdChQVEVfSURFTlRfQVRUUik7CiAKIAkJCQlpZiAoaXNfa2VybmVsX3RleHQoYWRkcikpCiAJCQkJCXByb3QgPSBQQUdFX0tFUk5FTF9FWEVDOwogCiAJCQkJcGFnZXNfNGsrKzsKLQkJCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIHByb3QpKTsKKwkJCQlpZiAobWFwcGluZ19pdGVyID09IDEpCisJCQkJCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgaW5pdF9wcm90KSk7CisJCQkJZWxzZQorCQkJCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIHByb3QpKTsKIAkJCX0KIAkJfQogCX0KLQl1cGRhdGVfcGFnZV9jb3VudChQR19MRVZFTF8yTSwgcGFnZXNfMm0pOwotCXVwZGF0ZV9wYWdlX2NvdW50KFBHX0xFVkVMXzRLLCBwYWdlc180ayk7CisJaWYgKG1hcHBpbmdfaXRlciA9PSAxKSB7CisJCS8qCisJCSAqIHVwZGF0ZSBkaXJlY3QgbWFwcGluZyBwYWdlIGNvdW50IG9ubHkgaW4gdGhlIGZpcnN0CisJCSAqIGl0ZXJhdGlvbi4KKwkJICovCisJCXVwZGF0ZV9wYWdlX2NvdW50KFBHX0xFVkVMXzJNLCBwYWdlc18ybSk7CisJCXVwZGF0ZV9wYWdlX2NvdW50KFBHX0xFVkVMXzRLLCBwYWdlc180ayk7CisKKwkJLyoKKwkJICogbG9jYWwgZ2xvYmFsIGZsdXNoIHRsYiwgd2hpY2ggd2lsbCBmbHVzaCB0aGUgcHJldmlvdXMKKwkJICogbWFwcGluZ3MgcHJlc2VudCBpbiBib3RoIHNtYWxsIGFuZCBsYXJnZSBwYWdlIFRMQidzLgorCQkgKi8KKwkJX19mbHVzaF90bGJfYWxsKCk7CisKKwkJLyoKKwkJICogU2Vjb25kIGl0ZXJhdGlvbiB3aWxsIHNldCB0aGUgYWN0dWFsIGRlc2lyZWQgUFRFIGF0dHJpYnV0ZXMuCisJCSAqLworCQltYXBwaW5nX2l0ZXIgPSAyOworCQlnb3RvIHJlcGVhdDsKKwl9CiB9CiAKIC8qCkBAIC00NTgsMTEgKzUxNSw3IEBACiB7CiAJcGdkX3QgKnBnZF9iYXNlID0gc3dhcHBlcl9wZ19kaXI7CiAKLQlwYXJhdmlydF9wYWdldGFibGVfc2V0dXBfc3RhcnQocGdkX2Jhc2UpOwotCiAJcGVybWFuZW50X2ttYXBzX2luaXQocGdkX2Jhc2UpOwotCi0JcGFyYXZpcnRfcGFnZXRhYmxlX3NldHVwX2RvbmUocGdkX2Jhc2UpOwogfQogCiAjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKQEAgLTUwNSw3ICs1NTgsNyBAQAogCiBpbnQgbnhfZW5hYmxlZDsKIAotcHRldmFsX3QgX19zdXBwb3J0ZWRfcHRlX21hc2sgX19yZWFkX21vc3RseSA9IH4oX1BBR0VfTlggfCBfUEFHRV9HTE9CQUwpOworcHRldmFsX3QgX19zdXBwb3J0ZWRfcHRlX21hc2sgX19yZWFkX21vc3RseSA9IH4oX1BBR0VfTlggfCBfUEFHRV9HTE9CQUwgfCBfUEFHRV9JT01BUCk7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiAKICNpZmRlZiBDT05GSUdfWDg2X1BBRQpAQCAtNzIyLDcgKzc3NSw3IEBACiAJYWZ0ZXJfaW5pdF9ib290bWVtID0gMTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGZpbmRfZWFybHlfdGFibGVfc3BhY2UodW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9lYXJseV90YWJsZV9zcGFjZSh1bnNpZ25lZCBsb25nIGVuZCwgaW50IHVzZV9wc2UpCiB7CiAJdW5zaWduZWQgbG9uZyBwdWRzLCBwbWRzLCBwdGVzLCB0YWJsZXMsIHN0YXJ0OwogCkBAIC03MzIsNyArNzg1LDcgQEAKIAlwbWRzID0gKGVuZCArIFBNRF9TSVpFIC0gMSkgPj4gUE1EX1NISUZUOwogCXRhYmxlcyArPSBQQUdFX0FMSUdOKHBtZHMgKiBzaXplb2YocG1kX3QpKTsKIAotCWlmIChjcHVfaGFzX3BzZSkgeworCWlmICh1c2VfcHNlKSB7CiAJCXVuc2lnbmVkIGxvbmcgZXh0cmE7CiAKIAkJZXh0cmEgPSBlbmQgLSAoKGVuZD4+UE1EX1NISUZUKSA8PCBQTURfU0hJRlQpOwpAQCAtNzcyLDEyICs4MjUsMjIgQEAKIAlwZ2RfdCAqcGdkX2Jhc2UgPSBzd2FwcGVyX3BnX2RpcjsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKIAl1bnNpZ25lZCBsb25nIGJpZ19wYWdlX3N0YXJ0OworI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKwkvKgorCSAqIEZvciBDT05GSUdfREVCVUdfUEFHRUFMTE9DLCBpZGVudGl0eSBtYXBwaW5nIHdpbGwgdXNlIHNtYWxsIHBhZ2VzLgorCSAqIFRoaXMgd2lsbCBzaW1wbGlmeSBjcGEoKSwgd2hpY2ggb3RoZXJ3aXNlIG5lZWRzIHRvIHN1cHBvcnQgc3BsaXR0aW5nCisJICogbGFyZ2UgcGFnZXMgaW50byBzbWFsbCBpbiBpbnRlcnJ1cHQgY29udGV4dCwgZXRjLgorCSAqLworCWludCB1c2VfcHNlID0gMDsKKyNlbHNlCisJaW50IHVzZV9wc2UgPSBjcHVfaGFzX3BzZTsKKyNlbmRpZgogCiAJLyoKIAkgKiBGaW5kIHNwYWNlIGZvciB0aGUga2VybmVsIGRpcmVjdCBtYXBwaW5nIHRhYmxlcy4KIAkgKi8KIAlpZiAoIWFmdGVyX2luaXRfYm9vdG1lbSkKLQkJZmluZF9lYXJseV90YWJsZV9zcGFjZShlbmQpOworCQlmaW5kX2Vhcmx5X3RhYmxlX3NwYWNlKGVuZCwgdXNlX3BzZSk7CiAKICNpZmRlZiBDT05GSUdfWDg2X1BBRQogCXNldF9ueCgpOwpAQCAtODIzLDcgKzg4Niw3IEBACiAJZW5kX3BmbiA9IChlbmQ+PlBNRF9TSElGVCkgPDwgKFBNRF9TSElGVCAtIFBBR0VfU0hJRlQpOwogCWlmIChzdGFydF9wZm4gPCBlbmRfcGZuKQogCQlrZXJuZWxfcGh5c2ljYWxfbWFwcGluZ19pbml0KHBnZF9iYXNlLCBzdGFydF9wZm4sIGVuZF9wZm4sCi0JCQkJCQljcHVfaGFzX3BzZSk7CisJCQkJCSAgICAgdXNlX3BzZSk7CiAKIAkvKiB0YWlsIGlzIG5vdCBiaWcgcGFnZSBhbGlnbm1lbnQgPyAqLwogCXN0YXJ0X3BmbiA9IGVuZF9wZm47CkBAIC05MDcsNiArOTcwLDggQEAKIAlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgdG1wOwogCisJc3RhcnRfcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb24oKTsKKwogI2lmZGVmIENPTkZJR19GTEFUTUVNCiAJQlVHX09OKCFtZW1fbWFwKTsKICNlbmRpZgpAQCAtOTg2LDcgKzEwNTEsNiBAQAogCWlmIChib290X2NwdV9kYXRhLndwX3dvcmtzX29rIDwgMCkKIAkJdGVzdF93cF9iaXQoKTsKIAotCWNwYV9pbml0KCk7CiAJc2F2ZV9wZ19kaXIoKTsKIAl6YXBfbG93X21hcHBpbmdzKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggZDM3NDZlZi4uYjhlNDYxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9iaW9zX2ViZGEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtODgsNiArODksNjIgQEAKIAogaW50IGFmdGVyX2Jvb3RtZW07CiAKK3B0ZXZhbF90IF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+X1BBR0VfSU9NQVA7CitFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CisKK3N0YXRpYyBpbnQgZG9fbm90X254IF9fY3B1aW5pdGRhdGE7CisKKy8qCisgKiBub2V4ZWM9b258b2ZmCisgKiBDb250cm9sIG5vbi1leGVjdXRhYmxlIG1hcHBpbmdzIGZvciA2NC1iaXQgcHJvY2Vzc2VzLgorICoKKyAqIG9uCUVuYWJsZSAoZGVmYXVsdCkKKyAqIG9mZglEaXNhYmxlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5vbnhfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgeworCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJZG9fbm90X254ID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgIm9mZiIsIDMpKSB7CisJCWRvX25vdF9ueCA9IDE7CisJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKKwl9CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibm9leGVjIiwgbm9ueF9zZXR1cCk7CisKK3ZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVmZXI7CisKKwlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOworCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkb19ub3RfbngpCisJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKK30KKworaW50IGZvcmNlX3BlcnNvbmFsaXR5MzI7CisKKy8qCisgKiBub2V4ZWMzMj1vbnxvZmYKKyAqIENvbnRyb2wgbm9uIGV4ZWN1dGFibGUgaGVhcCBmb3IgMzJiaXQgcHJvY2Vzc2VzLgorICogVG8gY29udHJvbCB0aGUgc3RhY2sgdG9vIHVzZSBub2V4ZWM9b2ZmCisgKgorICogb24JUFJPVF9SRUFEIGRvZXMgbm90IGltcGx5IFBST1RfRVhFQyBmb3IgMzItYml0IHByb2Nlc3NlcyAoZGVmYXVsdCkKKyAqIG9mZglQUk9UX1JFQUQgaW1wbGllcyBQUk9UX0VYRUMKKyAqLworc3RhdGljIGludCBfX2luaXQgbm9ueDMyX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvbiIpKQorCQlmb3JjZV9wZXJzb25hbGl0eTMyICY9IH5SRUFEX0lNUExJRVNfRVhFQzsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIm9mZiIpKQorCQlmb3JjZV9wZXJzb25hbGl0eTMyIHw9IFJFQURfSU1QTElFU19FWEVDOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9leGVjMzI9Iiwgbm9ueDMyX3NldHVwKTsKKwogLyoKICAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgbWFya2VkIF9fcmVmIGJlY2F1c2UgaXQgY2FsbHMgX19pbml0IGZ1bmN0aW9uCiAgKiAoYWxsb2NfYm9vdG1lbV9wYWdlcykuIEl0J3Mgc2FmZSB0byBkbyBpdCBPTkxZIHdoZW4gYWZ0ZXJfYm9vdG1lbSA9PSAwLgpAQCAtMTM5LDkgKzE5Niw2IEBACiAJfQogCiAJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCB2YWRkcik7Ci0JaWYgKCFwdGVfbm9uZSgqcHRlKSAmJiBwdGVfdmFsKG5ld19wdGUpICYmCi0JICAgIHB0ZV92YWwoKnB0ZSkgIT0gKHB0ZV92YWwobmV3X3B0ZSkgJiBfX3N1cHBvcnRlZF9wdGVfbWFzaykpCi0JCXB0ZV9FUlJPUigqcHRlKTsKIAlzZXRfcHRlKHB0ZSwgbmV3X3B0ZSk7CiAKIAkvKgpAQCAtMjI1LDcgKzI3OSw3IEBACiB2b2lkIF9faW5pdCBjbGVhbnVwX2hpZ2htYXAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gX19TVEFSVF9LRVJORUxfbWFwOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gcm91bmRfdXAoKHVuc2lnbmVkIGxvbmcpX2VuZCwgUE1EX1NJWkUpIC0gMTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpX2VuZCwgUE1EX1NJWkUpIC0gMTsKIAlwbWRfdCAqcG1kID0gbGV2ZWwyX2tlcm5lbF9wZ3Q7CiAJcG1kX3QgKmxhc3RfcG1kID0gcG1kICsgUFRSU19QRVJfUE1EOwogCkBAIC0yNTYsNyArMzEwLDcgQEAKIAlpZiAocGZuID49IHRhYmxlX3RvcCkKIAkJcGFuaWMoImFsbG9jX2xvd19wYWdlOiByYW4gb3V0IG9mIG1lbW9yeSIpOwogCi0JYWRyID0gZWFybHlfaW9yZW1hcChwZm4gKiBQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJYWRyID0gZWFybHlfbWVtcmVtYXAocGZuICogUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwogCW1lbXNldChhZHIsIDAsIFBBR0VfU0laRSk7CiAJKnBoeXMgID0gcGZuICogUEFHRV9TSVpFOwogCXJldHVybiBhZHI7CkBAIC0yNzEsNyArMzI1LDggQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0Ci1waHlzX3B0ZV9pbml0KHB0ZV90ICpwdGVfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCkKK3BoeXNfcHRlX2luaXQocHRlX3QgKnB0ZV9wYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCSAgICAgIHBncHJvdF90IHByb3QpCiB7CiAJdW5zaWduZWQgcGFnZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9tYXBfYWRkciA9IGVuZDsKQEAgLTI4OSwzNiArMzQ0LDQzIEBACiAJCQlicmVhazsKIAkJfQogCisJCS8qCisJCSAqIFdlIHdpbGwgcmUtdXNlIHRoZSBleGlzdGluZyBtYXBwaW5nLgorCQkgKiBYZW4gZm9yIGV4YW1wbGUgaGFzIHNvbWUgc3BlY2lhbCByZXF1aXJlbWVudHMsIGxpa2UgbWFwcGluZworCQkgKiBwYWdldGFibGUgcGFnZXMgYXMgUk8uIFNvIGFzc3VtZSBzb21lb25lIHdobyBwcmUtc2V0dXAKKwkJICogdGhlc2UgbWFwcGluZ3MgYXJlIG1vcmUgaW50ZWxsaWdlbnQuCisJCSAqLwogCQlpZiAocHRlX3ZhbCgqcHRlKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICgwKQogCQkJcHJpbnRrKCIgICBwdGU9JXAgYWRkcj0lbHggcHRlPSUwMTZseFxuIiwKIAkJCSAgICAgICBwdGUsIGFkZHIsIHBmbl9wdGUoYWRkciA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCkucHRlKTsKLQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUoYWRkciA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCkpOwotCQlsYXN0X21hcF9hZGRyID0gKGFkZHIgJiBQQUdFX01BU0spICsgUEFHRV9TSVpFOwogCQlwYWdlcysrOworCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShhZGRyID4+IFBBR0VfU0hJRlQsIHByb3QpKTsKKwkJbGFzdF9tYXBfYWRkciA9IChhZGRyICYgUEFHRV9NQVNLKSArIFBBR0VfU0laRTsKIAl9CisKIAl1cGRhdGVfcGFnZV9jb3VudChQR19MRVZFTF80SywgcGFnZXMpOwogCiAJcmV0dXJuIGxhc3RfbWFwX2FkZHI7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdAotcGh5c19wdGVfdXBkYXRlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQpCitwaHlzX3B0ZV91cGRhdGUocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJcGdwcm90X3QgcHJvdCkKIHsKIAlwdGVfdCAqcHRlID0gKHB0ZV90ICopcG1kX3BhZ2VfdmFkZHIoKnBtZCk7CiAKLQlyZXR1cm4gcGh5c19wdGVfaW5pdChwdGUsIGFkZHJlc3MsIGVuZCk7CisJcmV0dXJuIHBoeXNfcHRlX2luaXQocHRlLCBhZGRyZXNzLCBlbmQsIHByb3QpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXQKIHBoeXNfcG1kX2luaXQocG1kX3QgKnBtZF9wYWdlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplX21hc2spCisJICAgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemVfbWFzaywgcGdwcm90X3QgcHJvdCkKIHsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzID0gMDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfbWFwX2FkZHIgPSBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3M7CiAKIAlpbnQgaSA9IHBtZF9pbmRleChhZGRyZXNzKTsKIApAQCAtMzI2LDYgKzM4OCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgcHRlX3BoeXM7CiAJCXBtZF90ICpwbWQgPSBwbWRfcGFnZSArIHBtZF9pbmRleChhZGRyZXNzKTsKIAkJcHRlX3QgKnB0ZTsKKwkJcGdwcm90X3QgbmV3X3Byb3QgPSBwcm90OwogCiAJCWlmIChhZGRyZXNzID49IGVuZCkgewogCQkJaWYgKCFhZnRlcl9ib290bWVtKSB7CkBAIC0zMzksMjcgKzQwMiw0MCBAQAogCQkJaWYgKCFwbWRfbGFyZ2UoKnBtZCkpIHsKIAkJCQlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKIAkJCQlsYXN0X21hcF9hZGRyID0gcGh5c19wdGVfdXBkYXRlKHBtZCwgYWRkcmVzcywKLQkJCQkJCQkJZW5kKTsKKwkJCQkJCQkJZW5kLCBwcm90KTsKIAkJCQlzcGluX3VubG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOworCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJLyogQ291bnQgZW50cmllcyB3ZSdyZSB1c2luZyBmcm9tIGxldmVsMl9pZGVudF9wZ3QgKi8KLQkJCWlmIChzdGFydCA9PSAwKQotCQkJCXBhZ2VzKys7Ci0JCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgb2sgd2l0aCBQR19MRVZFTF8yTSBtYXBwaW5nLCB0aGVuIHdlIHdpbGwKKwkJCSAqIHVzZSB0aGUgZXhpc3RpbmcgbWFwcGluZywKKwkJCSAqCisJCQkgKiBPdGhlcndpc2UsIHdlIHdpbGwgc3BsaXQgdGhlIGxhcmdlIHBhZ2UgbWFwcGluZyBidXQKKwkJCSAqIHVzZSB0aGUgc2FtZSBleGlzdGluZyBwcm90ZWN0aW9uIGJpdHMgZXhjZXB0IGZvcgorCQkJICogbGFyZ2UgcGFnZSwgc28gdGhhdCB3ZSBkb24ndCB2aW9sYXRlIEludGVsJ3MgVExCCisJCQkgKiBBcHBsaWNhdGlvbiBub3RlICgzMTcwODApIHdoaWNoIHNheXMsIHdoaWxlIGNoYW5naW5nCisJCQkgKiB0aGUgcGFnZSBzaXplcywgbmV3IGFuZCBvbGQgdHJhbnNsYXRpb25zIHNob3VsZAorCQkJICogbm90IGRpZmZlciB3aXRoIHJlc3BlY3QgdG8gcGFnZSBmcmFtZSBhbmQKKwkJCSAqIGF0dHJpYnV0ZXMuCisJCQkgKi8KKwkJCWlmIChwYWdlX3NpemVfbWFzayAmICgxIDw8IFBHX0xFVkVMXzJNKSkKKwkJCQljb250aW51ZTsKKwkJCW5ld19wcm90ID0gcHRlX3BncHJvdChwdGVfY2xyaHVnZSgqKHB0ZV90ICopcG1kKSk7CiAJCX0KIAogCQlpZiAocGFnZV9zaXplX21hc2sgJiAoMTw8UEdfTEVWRUxfMk0pKSB7CiAJCQlwYWdlcysrOwogCQkJc3Bpbl9sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CiAJCQlzZXRfcHRlKChwdGVfdCAqKXBtZCwKLQkJCQlwZm5fcHRlKGFkZHJlc3MgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUxfTEFSR0UpKTsKKwkJCQlwZm5fcHRlKGFkZHJlc3MgPj4gUEFHRV9TSElGVCwKKwkJCQkJX19wZ3Byb3QocGdwcm90X3ZhbChwcm90KSB8IF9QQUdFX1BTRSkpKTsKIAkJCXNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CiAJCQlsYXN0X21hcF9hZGRyID0gKGFkZHJlc3MgJiBQTURfTUFTSykgKyBQTURfU0laRTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJcHRlID0gYWxsb2NfbG93X3BhZ2UoJnB0ZV9waHlzKTsKLQkJbGFzdF9tYXBfYWRkciA9IHBoeXNfcHRlX2luaXQocHRlLCBhZGRyZXNzLCBlbmQpOworCQlsYXN0X21hcF9hZGRyID0gcGh5c19wdGVfaW5pdChwdGUsIGFkZHJlc3MsIGVuZCwgbmV3X3Byb3QpOwogCQl1bm1hcF9sb3dfcGFnZShwdGUpOwogCiAJCXNwaW5fbG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOwpAQCAtMzcyLDEyICs0NDgsMTIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0CiBwaHlzX3BtZF91cGRhdGUocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCSB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZV9tYXNrKQorCQl1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZV9tYXNrLCBwZ3Byb3RfdCBwcm90KQogewogCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMCk7CiAJdW5zaWduZWQgbG9uZyBsYXN0X21hcF9hZGRyOwogCi0JbGFzdF9tYXBfYWRkciA9IHBoeXNfcG1kX2luaXQocG1kLCBhZGRyZXNzLCBlbmQsIHBhZ2Vfc2l6ZV9tYXNrKTsKKwlsYXN0X21hcF9hZGRyID0gcGh5c19wbWRfaW5pdChwbWQsIGFkZHJlc3MsIGVuZCwgcGFnZV9zaXplX21hc2ssIHByb3QpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwogCXJldHVybiBsYXN0X21hcF9hZGRyOwogfQpAQCAtMzk0LDYgKzQ3MCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgcG1kX3BoeXM7CiAJCXB1ZF90ICpwdWQgPSBwdWRfcGFnZSArIHB1ZF9pbmRleChhZGRyKTsKIAkJcG1kX3QgKnBtZDsKKwkJcGdwcm90X3QgcHJvdCA9IFBBR0VfS0VSTkVMOwogCiAJCWlmIChhZGRyID49IGVuZCkKIAkJCWJyZWFrOwpAQCAtNDA1LDEwICs0ODIsMjYgQEAKIAkJfQogCiAJCWlmIChwdWRfdmFsKCpwdWQpKSB7Ci0JCQlpZiAoIXB1ZF9sYXJnZSgqcHVkKSkKKwkJCWlmICghcHVkX2xhcmdlKCpwdWQpKSB7CiAJCQkJbGFzdF9tYXBfYWRkciA9IHBoeXNfcG1kX3VwZGF0ZShwdWQsIGFkZHIsIGVuZCwKLQkJCQkJCQkgcGFnZV9zaXplX21hc2spOwotCQkJY29udGludWU7CisJCQkJCQkJIHBhZ2Vfc2l6ZV9tYXNrLCBwcm90KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgb2sgd2l0aCBQR19MRVZFTF8xRyBtYXBwaW5nLCB0aGVuIHdlIHdpbGwKKwkJCSAqIHVzZSB0aGUgZXhpc3RpbmcgbWFwcGluZy4KKwkJCSAqCisJCQkgKiBPdGhlcndpc2UsIHdlIHdpbGwgc3BsaXQgdGhlIGdicGFnZSBtYXBwaW5nIGJ1dCB1c2UKKwkJCSAqIHRoZSBzYW1lIGV4aXN0aW5nIHByb3RlY3Rpb24gIGJpdHMgZXhjZXB0IGZvciBsYXJnZQorCQkJICogcGFnZSwgc28gdGhhdCB3ZSBkb24ndCB2aW9sYXRlIEludGVsJ3MgVExCCisJCQkgKiBBcHBsaWNhdGlvbiBub3RlICgzMTcwODApIHdoaWNoIHNheXMsIHdoaWxlIGNoYW5naW5nCisJCQkgKiB0aGUgcGFnZSBzaXplcywgbmV3IGFuZCBvbGQgdHJhbnNsYXRpb25zIHNob3VsZAorCQkJICogbm90IGRpZmZlciB3aXRoIHJlc3BlY3QgdG8gcGFnZSBmcmFtZSBhbmQKKwkJCSAqIGF0dHJpYnV0ZXMuCisJCQkgKi8KKwkJCWlmIChwYWdlX3NpemVfbWFzayAmICgxIDw8IFBHX0xFVkVMXzFHKSkKKwkJCQljb250aW51ZTsKKwkJCXByb3QgPSBwdGVfcGdwcm90KHB0ZV9jbHJodWdlKCoocHRlX3QgKilwdWQpKTsKIAkJfQogCiAJCWlmIChwYWdlX3NpemVfbWFzayAmICgxPDxQR19MRVZFTF8xRykpIHsKQEAgLTQyMiw3ICs1MTUsOCBAQAogCQl9CiAKIAkJcG1kID0gYWxsb2NfbG93X3BhZ2UoJnBtZF9waHlzKTsKLQkJbGFzdF9tYXBfYWRkciA9IHBoeXNfcG1kX2luaXQocG1kLCBhZGRyLCBlbmQsIHBhZ2Vfc2l6ZV9tYXNrKTsKKwkJbGFzdF9tYXBfYWRkciA9IHBoeXNfcG1kX2luaXQocG1kLCBhZGRyLCBlbmQsIHBhZ2Vfc2l6ZV9tYXNrLAorCQkJCQkgICAgICBwcm90KTsKIAkJdW5tYXBfbG93X3BhZ2UocG1kKTsKIAogCQlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKQEAgLTQzMCw2ICs1MjQsNyBAQAogCQlzcGluX3VubG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOwogCX0KIAlfX2ZsdXNoX3RsYl9hbGwoKTsKKwogCXVwZGF0ZV9wYWdlX2NvdW50KFBHX0xFVkVMXzFHLCBwYWdlcyk7CiAKIAlyZXR1cm4gbGFzdF9tYXBfYWRkcjsKQEAgLTQ0NiwyNyArNTQxLDI4IEBACiAJcmV0dXJuIHBoeXNfcHVkX2luaXQocHVkLCBhZGRyLCBlbmQsIHBhZ2Vfc2l6ZV9tYXNrKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGZpbmRfZWFybHlfdGFibGVfc3BhY2UodW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9lYXJseV90YWJsZV9zcGFjZSh1bnNpZ25lZCBsb25nIGVuZCwgaW50IHVzZV9wc2UsCisJCQkJCSAgaW50IHVzZV9nYnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgcHVkcywgcG1kcywgcHRlcywgdGFibGVzLCBzdGFydDsKIAogCXB1ZHMgPSAoZW5kICsgUFVEX1NJWkUgLSAxKSA+PiBQVURfU0hJRlQ7Ci0JdGFibGVzID0gcm91bmRfdXAocHVkcyAqIHNpemVvZihwdWRfdCksIFBBR0VfU0laRSk7Ci0JaWYgKGRpcmVjdF9nYnBhZ2VzKSB7CisJdGFibGVzID0gcm91bmR1cChwdWRzICogc2l6ZW9mKHB1ZF90KSwgUEFHRV9TSVpFKTsKKwlpZiAodXNlX2dicGFnZXMpIHsKIAkJdW5zaWduZWQgbG9uZyBleHRyYTsKIAkJZXh0cmEgPSBlbmQgLSAoKGVuZD4+UFVEX1NISUZUKSA8PCBQVURfU0hJRlQpOwogCQlwbWRzID0gKGV4dHJhICsgUE1EX1NJWkUgLSAxKSA+PiBQTURfU0hJRlQ7CiAJfSBlbHNlCiAJCXBtZHMgPSAoZW5kICsgUE1EX1NJWkUgLSAxKSA+PiBQTURfU0hJRlQ7Ci0JdGFibGVzICs9IHJvdW5kX3VwKHBtZHMgKiBzaXplb2YocG1kX3QpLCBQQUdFX1NJWkUpOworCXRhYmxlcyArPSByb3VuZHVwKHBtZHMgKiBzaXplb2YocG1kX3QpLCBQQUdFX1NJWkUpOwogCi0JaWYgKGNwdV9oYXNfcHNlKSB7CisJaWYgKHVzZV9wc2UpIHsKIAkJdW5zaWduZWQgbG9uZyBleHRyYTsKIAkJZXh0cmEgPSBlbmQgLSAoKGVuZD4+UE1EX1NISUZUKSA8PCBQTURfU0hJRlQpOwogCQlwdGVzID0gKGV4dHJhICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIAl9IGVsc2UKIAkJcHRlcyA9IChlbmQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXRhYmxlcyArPSByb3VuZF91cChwdGVzICogc2l6ZW9mKHB0ZV90KSwgUEFHRV9TSVpFKTsKKwl0YWJsZXMgKz0gcm91bmR1cChwdGVzICogc2l6ZW9mKHB0ZV90KSwgUEFHRV9TSVpFKTsKIAogCS8qCiAJICogUkVELVBFTiBwdXR0aW5nIHBhZ2UgdGFibGVzIG9ubHkgb24gbm9kZSAwIGNvdWxkCkBAIC01MjgsNiArNjI0LDcgQEAKIAkJcGdkX3BvcHVsYXRlKCZpbml0X21tLCBwZ2QsIF9fdmEocHVkX3BoeXMpKTsKIAkJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKIAl9CisJX19mbHVzaF90bGJfYWxsKCk7CiAKIAlyZXR1cm4gbGFzdF9tYXBfYWRkcjsKIH0KQEAgLTU3MSw2ICs2NjgsNyBAQAogCiAJc3RydWN0IG1hcF9yYW5nZSBtcltOUl9SQU5HRV9NUl07CiAJaW50IG5yX3JhbmdlLCBpOworCWludCB1c2VfcHNlLCB1c2VfZ2JwYWdlczsKIAogCXByaW50ayhLRVJOX0lORk8gImluaXRfbWVtb3J5X21hcHBpbmdcbiIpOwogCkBAIC01ODQsOSArNjgyLDIxIEBACiAJaWYgKCFhZnRlcl9ib290bWVtKQogCQlpbml0X2dicGFnZXMoKTsKIAotCWlmIChkaXJlY3RfZ2JwYWdlcykKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJLyoKKwkgKiBGb3IgQ09ORklHX0RFQlVHX1BBR0VBTExPQywgaWRlbnRpdHkgbWFwcGluZyB3aWxsIHVzZSBzbWFsbCBwYWdlcy4KKwkgKiBUaGlzIHdpbGwgc2ltcGxpZnkgY3BhKCksIHdoaWNoIG90aGVyd2lzZSBuZWVkcyB0byBzdXBwb3J0IHNwbGl0dGluZworCSAqIGxhcmdlIHBhZ2VzIGludG8gc21hbGwgaW4gaW50ZXJydXB0IGNvbnRleHQsIGV0Yy4KKwkgKi8KKwl1c2VfcHNlID0gdXNlX2dicGFnZXMgPSAwOworI2Vsc2UKKwl1c2VfcHNlID0gY3B1X2hhc19wc2U7CisJdXNlX2dicGFnZXMgPSBkaXJlY3RfZ2JwYWdlczsKKyNlbmRpZgorCisJaWYgKHVzZV9nYnBhZ2VzKQogCQlwYWdlX3NpemVfbWFzayB8PSAxIDw8IFBHX0xFVkVMXzFHOwotCWlmIChjcHVfaGFzX3BzZSkKKwlpZiAodXNlX3BzZSkKIAkJcGFnZV9zaXplX21hc2sgfD0gMSA8PCBQR19MRVZFTF8yTTsKIAogCW1lbXNldChtciwgMCwgc2l6ZW9mKG1yKSk7CkBAIC02MzYsNyArNzQ2LDcgQEAKIAkJb2xkX3N0YXJ0ID0gbXJbaV0uc3RhcnQ7CiAJCW1lbW1vdmUoJm1yW2ldLCAmbXJbaSsxXSwKIAkJCSAobnJfcmFuZ2UgLSAxIC0gaSkgKiBzaXplb2YgKHN0cnVjdCBtYXBfcmFuZ2UpKTsKLQkJbXJbaV0uc3RhcnQgPSBvbGRfc3RhcnQ7CisJCW1yW2ktLV0uc3RhcnQgPSBvbGRfc3RhcnQ7CiAJCW5yX3JhbmdlLS07CiAJfQogCkBAIC02NDcsNyArNzU3LDcgQEAKIAkJCSAobXJbaV0ucGFnZV9zaXplX21hc2sgJiAoMTw8UEdfTEVWRUxfMk0pKT8iMk0iOiI0ayIpKTsKIAogCWlmICghYWZ0ZXJfYm9vdG1lbSkKLQkJZmluZF9lYXJseV90YWJsZV9zcGFjZShlbmQpOworCQlmaW5kX2Vhcmx5X3RhYmxlX3NwYWNlKGVuZCwgdXNlX3BzZSwgdXNlX2dicGFnZXMpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX3JhbmdlOyBpKyspCiAJCWxhc3RfbWFwX2FkZHIgPSBrZXJuZWxfcGh5c2ljYWxfbWFwcGluZ19pbml0KApAQCAtNzY5LDYgKzg3OSw4IEBACiB7CiAJbG9uZyBjb2Rlc2l6ZSwgcmVzZXJ2ZWRwYWdlcywgZGF0YXNpemUsIGluaXRzaXplOwogCisJc3RhcnRfcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb24oKTsKKwogCXBjaV9pb21tdV9hbGxvYygpOwogCiAJLyogY2xlYXJfYnNzKCkgYWxyZWFkeSBjbGVhciB0aGUgZW1wdHlfemVyb19wYWdlICovCkBAIC04MDYsOCArOTE4LDYgQEAKIAkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWRhdGFzaXplID4+IDEwLAogCQlpbml0c2l6ZSA+PiAxMCk7Ci0KLQljcGFfaW5pdCgpOwogfQogCiB2b2lkIGZyZWVfaW5pdF9wYWdlcyhjaGFyICp3aGF0LCB1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2lvcmVtYXAuYyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwppbmRleCBkNGI2ZTZhLi5hZTcxZTExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vaW9yZW1hcC5jCkBAIC0yNCwxOSArMjQsNDggQEAKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIAotdW5zaWduZWQgbG9uZyBfX3BoeXNfYWRkcih1bnNpZ25lZCBsb25nIHgpCi17Ci0JaWYgKHggPj0gX19TVEFSVF9LRVJORUxfbWFwKQotCQlyZXR1cm4geCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIHBoeXNfYmFzZTsKLQlyZXR1cm4geCAtIFBBR0VfT0ZGU0VUOwotfQotRVhQT1JUX1NZTUJPTChfX3BoeXNfYWRkcik7Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHBoeXNfYWRkcl92YWxpZCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJcmV0dXJuIGFkZHIgPCAoMVVMIDw8IGJvb3RfY3B1X2RhdGEueDg2X3BoeXNfYml0cyk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgX19waHlzX2FkZHIodW5zaWduZWQgbG9uZyB4KQoreworCWlmICh4ID49IF9fU1RBUlRfS0VSTkVMX21hcCkgeworCQl4IC09IF9fU1RBUlRfS0VSTkVMX21hcDsKKwkJVklSVFVBTF9CVUdfT04oeCA+PSBLRVJORUxfSU1BR0VfU0laRSk7CisJCXggKz0gcGh5c19iYXNlOworCX0gZWxzZSB7CisJCVZJUlRVQUxfQlVHX09OKHggPCBQQUdFX09GRlNFVCk7CisJCXggLT0gUEFHRV9PRkZTRVQ7CisJCVZJUlRVQUxfQlVHX09OKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORyA/IHggPiBNQVhNRU0gOgorCQkJCQkhcGh5c19hZGRyX3ZhbGlkKHgpKTsKKwl9CisJcmV0dXJuIHg7Cit9CitFWFBPUlRfU1lNQk9MKF9fcGh5c19hZGRyKTsKKworYm9vbCBfX3ZpcnRfYWRkcl92YWxpZCh1bnNpZ25lZCBsb25nIHgpCit7CisJaWYgKHggPj0gX19TVEFSVF9LRVJORUxfbWFwKSB7CisJCXggLT0gX19TVEFSVF9LRVJORUxfbWFwOworCQlpZiAoeCA+PSBLRVJORUxfSU1BR0VfU0laRSkKKwkJCXJldHVybiBmYWxzZTsKKwkJeCArPSBwaHlzX2Jhc2U7CisJfSBlbHNlIHsKKwkJaWYgKHggPCBQQUdFX09GRlNFVCkKKwkJCXJldHVybiBmYWxzZTsKKwkJeCAtPSBQQUdFX09GRlNFVDsKKwkJaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORyA/CisJCQkJeCA+IE1BWE1FTSA6ICFwaHlzX2FkZHJfdmFsaWQoeCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiBwZm5fdmFsaWQoeCA+PiBQQUdFX1NISUZUKTsKK30KK0VYUE9SVF9TWU1CT0woX192aXJ0X2FkZHJfdmFsaWQpOworCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBwaHlzX2FkZHJfdmFsaWQodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtNDQsNiArNzMsMjggQEAKIAlyZXR1cm4gMTsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19WSVJUVUFMCit1bnNpZ25lZCBsb25nIF9fcGh5c19hZGRyKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwkvKiBWTUFMTE9DXyogYXJlbid0IGNvbnN0YW50czsgbm90IGF2YWlsYWJsZSBhdCB0aGUgYm9vdCB0aW1lICovCisJVklSVFVBTF9CVUdfT04oeCA8IFBBR0VfT0ZGU0VUKTsKKwlWSVJUVUFMX0JVR19PTihzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX0JPT1RJTkcgJiYKKwkJaXNfdm1hbGxvY19hZGRyKCh2b2lkICopIHgpKTsKKwlyZXR1cm4geCAtIFBBR0VfT0ZGU0VUOworfQorRVhQT1JUX1NZTUJPTChfX3BoeXNfYWRkcik7CisjZW5kaWYKKworYm9vbCBfX3ZpcnRfYWRkcl92YWxpZCh1bnNpZ25lZCBsb25nIHgpCit7CisJaWYgKHggPCBQQUdFX09GRlNFVCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX0JPT1RJTkcgJiYgaXNfdm1hbGxvY19hZGRyKCh2b2lkICopIHgpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHBmbl92YWxpZCgoeCAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKTsKK30KK0VYUE9SVF9TWU1CT0woX192aXJ0X2FkZHJfdmFsaWQpOworCiAjZW5kaWYKIAogaW50IHBhZ2VfaXNfcmFtKHVuc2lnbmVkIGxvbmcgcGFnZW5yKQpAQCAtODMsNiArMTM0LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBwYWdlcmFuZ2VfaXNfcmFtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWludCByYW1fcGFnZSA9IDAsIG5vdF9yYW1wYWdlID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbnI7CisKKwlmb3IgKHBhZ2VfbnIgPSAoc3RhcnQgPj4gUEFHRV9TSElGVCk7IHBhZ2VfbnIgPCAoZW5kID4+IFBBR0VfU0hJRlQpOworCSAgICAgKytwYWdlX25yKSB7CisJCWlmIChwYWdlX2lzX3JhbShwYWdlX25yKSkKKwkJCXJhbV9wYWdlID0gMTsKKwkJZWxzZQorCQkJbm90X3JhbXBhZ2UgPSAxOworCisJCWlmIChyYW1fcGFnZSA9PSBub3RfcmFtcGFnZSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmFtX3BhZ2U7Cit9CisKIC8qCiAgKiBGaXggdXAgdGhlIGxpbmVhciBkaXJlY3QgbWFwcGluZyBvZiB0aGUga2VybmVsIHRvIGF2b2lkIGNhY2hlIGF0dHJpYnV0ZQogICogY29uZmxpY3RzLgpAQCAtMTUwLDYgKzIyMCwxMiBAQAogCQlyZXR1cm4gKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAKIAkvKgorCSAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IHNwYW5zIG1vcmUgdGhhbiBhbnkgQkFSIGluIHRoZSBpb21lbSByZXNvdXJjZQorCSAqIHRyZWUuCisJICovCisJV0FSTl9PTihpb21lbV9tYXBfc2FuaXR5X2NoZWNrKHBoeXNfYWRkciwgc2l6ZSkpOworCisJLyoKIAkgKiBEb24ndCBhbGxvdyBhbnlib2R5IHRvIHJlbWFwIG5vcm1hbCBSQU0gdGhhdCB3ZSdyZSB1c2luZy4uCiAJICovCiAJZm9yIChwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKQEAgLTIwNCwxNiArMjgwLDE2IEBACiAJc3dpdGNoIChwcm90X3ZhbCkgewogCWNhc2UgX1BBR0VfQ0FDSEVfVUM6CiAJZGVmYXVsdDoKLQkJcHJvdCA9IFBBR0VfS0VSTkVMX05PQ0FDSEU7CisJCXByb3QgPSBQQUdFX0tFUk5FTF9JT19OT0NBQ0hFOwogCQlicmVhazsKIAljYXNlIF9QQUdFX0NBQ0hFX1VDX01JTlVTOgotCQlwcm90ID0gUEFHRV9LRVJORUxfVUNfTUlOVVM7CisJCXByb3QgPSBQQUdFX0tFUk5FTF9JT19VQ19NSU5VUzsKIAkJYnJlYWs7CiAJY2FzZSBfUEFHRV9DQUNIRV9XQzoKLQkJcHJvdCA9IFBBR0VfS0VSTkVMX1dDOworCQlwcm90ID0gUEFHRV9LRVJORUxfSU9fV0M7CiAJCWJyZWFrOwogCWNhc2UgX1BBR0VfQ0FDSEVfV0I6Ci0JCXByb3QgPSBQQUdFX0tFUk5FTDsKKwkJcHJvdCA9IFBBR0VfS0VSTkVMX0lPOwogCQlicmVhazsKIAl9CiAKQEAgLTQyMSw3ICs0OTcsNyBAQAogCXJldHVybjsKIH0KIAotaW50IF9faW5pdGRhdGEgZWFybHlfaW9yZW1hcF9kZWJ1ZzsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBlYXJseV9pb3JlbWFwX2RlYnVnOwogCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9pb3JlbWFwX2RlYnVnX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTUzMCwxMiArNjA2LDEyIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgZWFybHlfc2V0X2ZpeG1hcChlbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHgsCi0JCQkJCXVuc2lnbmVkIGxvbmcgcGh5cykKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBwaHlzLCBwZ3Byb3RfdCBwcm90KQogewogCWlmIChhZnRlcl9wYWdpbmdfaW5pdCkKLQkJc2V0X2ZpeG1hcChpZHgsIHBoeXMpOworCQlfX3NldF9maXhtYXAoaWR4LCBwaHlzLCBwcm90KTsKIAllbHNlCi0JCV9fZWFybHlfc2V0X2ZpeG1hcChpZHgsIHBoeXMsIFBBR0VfS0VSTkVMKTsKKwkJX19lYXJseV9zZXRfZml4bWFwKGlkeCwgcGh5cywgcHJvdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgZWFybHlfY2xlYXJfZml4bWFwKGVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeCkKQEAgLTU0NiwxNiArNjIyLDIyIEBACiAJCV9fZWFybHlfc2V0X2ZpeG1hcChpZHgsIDAsIF9fcGdwcm90KDApKTsKIH0KIAotCi1pbnQgX19pbml0ZGF0YSBlYXJseV9pb3JlbWFwX25lc3RlZDsKLQorc3RhdGljIHZvaWQgKnByZXZfbWFwW0ZJWF9CVE1BUFNfU0xPVFNdIF9faW5pdGRhdGE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X3NpemVbRklYX0JUTUFQU19TTE9UU10gX19pbml0ZGF0YTsKIHN0YXRpYyBpbnQgX19pbml0IGNoZWNrX2Vhcmx5X2lvcmVtYXBfbGVhayh2b2lkKQogewotCWlmICghZWFybHlfaW9yZW1hcF9uZXN0ZWQpCisJaW50IGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGSVhfQlRNQVBTX1NMT1RTOyBpKyspCisJCWlmIChwcmV2X21hcFtpXSkKKwkJCWNvdW50Kys7CisKKwlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAlXQVJOKDEsIEtFUk5fV0FSTklORwogCSAgICAgICAiRGVidWcgd2FybmluZzogZWFybHkgaW9yZW1hcCBsZWFrIG9mICVkIGFyZWFzIGRldGVjdGVkLlxuIiwKLQkJZWFybHlfaW9yZW1hcF9uZXN0ZWQpOworCQljb3VudCk7CiAJcHJpbnRrKEtFUk5fV0FSTklORwogCQkicGxlYXNlIGJvb3Qgd2l0aCBlYXJseV9pb3JlbWFwX2RlYnVnIGFuZCByZXBvcnQgdGhlIGRtZXNnLlxuIik7CiAKQEAgLTU2MywxOCArNjQ1LDMzIEBACiB9CiBsYXRlX2luaXRjYWxsKGNoZWNrX2Vhcmx5X2lvcmVtYXBfbGVhayk7CiAKLXZvaWQgX19pbml0ICplYXJseV9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgdm9pZCBfX2luaXQgKl9fZWFybHlfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90KQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7Ci0JdW5zaWduZWQgaW50IG5ycGFnZXMsIG5lc3Rpbmc7CisJdW5zaWduZWQgaW50IG5ycGFnZXM7CiAJZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4MCwgaWR4OworCWludCBpLCBzbG90OwogCiAJV0FSTl9PTihzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX0JPT1RJTkcpOwogCi0JbmVzdGluZyA9IGVhcmx5X2lvcmVtYXBfbmVzdGVkOworCXNsb3QgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgRklYX0JUTUFQU19TTE9UUzsgaSsrKSB7CisJCWlmICghcHJldl9tYXBbaV0pIHsKKwkJCXNsb3QgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2xvdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWFybHlfaW9tYXAoJTA4bHgsICUwOGx4KSBub3QgZm91bmQgc2xvdFxuIiwKKwkJCSBwaHlzX2FkZHIsIHNpemUpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAlpZiAoZWFybHlfaW9yZW1hcF9kZWJ1ZykgewogCQlwcmludGsoS0VSTl9JTkZPICJlYXJseV9pb3JlbWFwKCUwOGx4LCAlMDhseCkgWyVkXSA9PiAiLAotCQkgICAgICAgcGh5c19hZGRyLCBzaXplLCBuZXN0aW5nKTsKKwkJICAgICAgIHBoeXNfYWRkciwgc2l6ZSwgc2xvdCk7CiAJCWR1bXBfc3RhY2soKTsKIAl9CiAKQEAgLTU4NSwxNyArNjgyLDEzIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChuZXN0aW5nID49IEZJWF9CVE1BUFNfTkVTVElORykgewotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWFybHlfaW9yZW1hcF9uZXN0ZWQrKzsKKwlwcmV2X3NpemVbc2xvdF0gPSBzaXplOwogCS8qCiAJICogTWFwcGluZ3MgaGF2ZSB0byBiZSBwYWdlLWFsaWduZWQKIAkgKi8KIAlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOwogCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7Ci0Jc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyKSAtIHBoeXNfYWRkcjsKKwlzaXplID0gUEFHRV9BTElHTihsYXN0X2FkZHIgKyAxKSAtIHBoeXNfYWRkcjsKIAogCS8qCiAJICogTWFwcGluZ3MgaGF2ZSB0byBmaXQgaW4gdGhlIEZJWF9CVE1BUCBhcmVhLgpAQCAtNjA5LDEwICs3MDIsMTAgQEAKIAkvKgogCSAqIE9rLCBnbyBmb3IgaXQuLgogCSAqLwotCWlkeDAgPSBGSVhfQlRNQVBfQkVHSU4gLSBOUl9GSVhfQlRNQVBTKm5lc3Rpbmc7CisJaWR4MCA9IEZJWF9CVE1BUF9CRUdJTiAtIE5SX0ZJWF9CVE1BUFMqc2xvdDsKIAlpZHggPSBpZHgwOwogCXdoaWxlIChucnBhZ2VzID4gMCkgewotCQllYXJseV9zZXRfZml4bWFwKGlkeCwgcGh5c19hZGRyKTsKKwkJZWFybHlfc2V0X2ZpeG1hcChpZHgsIHBoeXNfYWRkciwgcHJvdCk7CiAJCXBoeXNfYWRkciArPSBQQUdFX1NJWkU7CiAJCS0taWR4OwogCQktLW5ycGFnZXM7CkBAIC02MjAsNyArNzEzLDIwIEBACiAJaWYgKGVhcmx5X2lvcmVtYXBfZGVidWcpCiAJCXByaW50ayhLRVJOX0NPTlQgIiUwOGx4ICsgJTA4bHhcbiIsIG9mZnNldCwgZml4X3RvX3ZpcnQoaWR4MCkpOwogCi0JcmV0dXJuICh2b2lkICopIChvZmZzZXQgKyBmaXhfdG9fdmlydChpZHgwKSk7CisJcHJldl9tYXBbc2xvdF0gPSAodm9pZCAqKSAob2Zmc2V0ICsgZml4X3RvX3ZpcnQoaWR4MCkpOworCXJldHVybiBwcmV2X21hcFtzbG90XTsKK30KKworLyogUmVtYXAgYW4gSU8gZGV2aWNlICovCit2b2lkIF9faW5pdCAqZWFybHlfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBfX2Vhcmx5X2lvcmVtYXAocGh5c19hZGRyLCBzaXplLCBQQUdFX0tFUk5FTF9JTyk7Cit9CisKKy8qIFJlbWFwIG1lbW9yeSAqLwordm9pZCBfX2luaXQgKmVhcmx5X21lbXJlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIF9fZWFybHlfaW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIFBBR0VfS0VSTkVMKTsKIH0KIAogdm9pZCBfX2luaXQgZWFybHlfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCkBAIC02MjksMTUgKzczNSwzMyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGludCBucnBhZ2VzOwogCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeDsKLQlpbnQgbmVzdGluZzsKKwlpbnQgaSwgc2xvdDsKIAotCW5lc3RpbmcgPSAtLWVhcmx5X2lvcmVtYXBfbmVzdGVkOwotCWlmIChXQVJOX09OKG5lc3RpbmcgPCAwKSkKKwlzbG90ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IEZJWF9CVE1BUFNfU0xPVFM7IGkrKykgeworCQlpZiAocHJldl9tYXBbaV0gPT0gYWRkcikgeworCQkJc2xvdCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzbG90IDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJlYXJseV9pb3VubWFwKCVwLCAlMDhseCkgbm90IGZvdW5kIHNsb3RcbiIsCisJCQkgYWRkciwgc2l6ZSk7CisJCVdBUk5fT04oMSk7CiAJCXJldHVybjsKKwl9CisKKwlpZiAocHJldl9zaXplW3Nsb3RdICE9IHNpemUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWFybHlfaW91bm1hcCglcCwgJTA4bHgpIFslZF0gc2l6ZSBub3QgY29uc2lzdGVudCAlMDhseFxuIiwKKwkJCSBhZGRyLCBzaXplLCBzbG90LCBwcmV2X3NpemVbc2xvdF0pOworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGVhcmx5X2lvcmVtYXBfZGVidWcpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiZWFybHlfaW91bm1hcCglcCwgJTA4bHgpIFslZF1cbiIsIGFkZHIsCi0JCSAgICAgICBzaXplLCBuZXN0aW5nKTsKKwkJICAgICAgIHNpemUsIHNsb3QpOwogCQlkdW1wX3N0YWNrKCk7CiAJfQogCkBAIC02NDksMTIgKzc3MywxMyBAQAogCW9mZnNldCA9IHZpcnRfYWRkciAmIH5QQUdFX01BU0s7CiAJbnJwYWdlcyA9IFBBR0VfQUxJR04ob2Zmc2V0ICsgc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAKLQlpZHggPSBGSVhfQlRNQVBfQkVHSU4gLSBOUl9GSVhfQlRNQVBTKm5lc3Rpbmc7CisJaWR4ID0gRklYX0JUTUFQX0JFR0lOIC0gTlJfRklYX0JUTUFQUypzbG90OwogCXdoaWxlIChucnBhZ2VzID4gMCkgewogCQllYXJseV9jbGVhcl9maXhtYXAoaWR4KTsKIAkJLS1pZHg7CiAJCS0tbnJwYWdlczsKIAl9CisJcHJldl9tYXBbc2xvdF0gPSAwOwogfQogCiB2b2lkIF9fdGhpc19maXhtYXBfZG9lc19ub3RfZXhpc3Qodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfMzIuYyBiL2FyY2gveDg2L21tL251bWFfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdjMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvbW0vbnVtYV8zMi5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorICogV3JpdHRlbiBieTogUGF0cmljaWEgR2F1Z2hlbiA8Z29uZUB1cy5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uCisgKiBBdWd1c3QgMjAwMjogYWRkZWQgcmVtb3RlIG5vZGUgS1ZBIHJlbWFwIC0gTWFydGluIEouIEJsaWdoIAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgSUJNIENvcnAuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21tem9uZS5oPgorI2luY2x1ZGUgPGFzbS9iaW9zX2ViZGEuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChub2RlX2RhdGEpOworCisvKgorICogbnVtYSBpbnRlcmZhY2UgLSB3ZSBleHBlY3QgdGhlIG51bWEgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUgdG8gaGF2ZQorICogICAgICAgICAgICAgICAgICBwb3B1bGF0ZWQgdGhlIGZvbGxvd2luZyBpbml0aWFsaXNhdGlvbi4KKyAqCisgKiAxKSBub2RlX29ubGluZV9tYXAgIC0gdGhlIG1hcCBvZiBhbGwgbm9kZXMgY29uZmlndXJlZCAob25saW5lKSBpbiB0aGUgc3lzdGVtCisgKiAyKSBub2RlX3N0YXJ0X3BmbiAgIC0gdGhlIHN0YXJ0aW5nIHBhZ2UgZnJhbWUgbnVtYmVyIGZvciBhIG5vZGUKKyAqIDMpIG5vZGVfZW5kX3BmbiAgICAgLSB0aGUgZW5kaW5nIHBhZ2UgZnJhbSBudW1iZXIgZm9yIGEgbm9kZQorICovCit1bnNpZ25lZCBsb25nIG5vZGVfc3RhcnRfcGZuW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKK3Vuc2lnbmVkIGxvbmcgbm9kZV9lbmRfcGZuW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKKworCisjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQorLyoKKyAqIDQpIHBoeXNub2RlX21hcCAgICAgLSB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgcGZuIGFuZCBvd25pbmcgbm9kZQorICogcGh5c25vZGVfbWFwIGtlZXBzIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgbGF5b3V0IG9mIGEgZ2VuZXJpYworICogbnVtYSBub2RlIG9uIGEgNjRNYiBicmVhayAoZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSB3aWxsCisgKiByZXByZXNlbnQgNjRNYiBvZiBtZW1vcnkgYW5kIHdpbGwgYmUgbWFya2VkIGJ5IHRoZSBub2RlIGlkLiAgc28sCisgKiBpZiB0aGUgZmlyc3QgZ2lnIGlzIG9uIG5vZGUgMCwgYW5kIHRoZSBzZWNvbmQgZ2lnIGlzIG9uIG5vZGUgMQorICogcGh5c25vZGVfbWFwIHdpbGwgY29udGFpbjoKKyAqCisgKiAgICAgcGh5c25vZGVfbWFwWzAtMTVdID0gMDsKKyAqICAgICBwaHlzbm9kZV9tYXBbMTYtMzFdID0gMTsKKyAqICAgICBwaHlzbm9kZV9tYXBbMzItIF0gPSAtMTsKKyAqLworczggcGh5c25vZGVfbWFwW01BWF9FTEVNRU5UU10gX19yZWFkX21vc3RseSA9IHsgWzAgLi4uIChNQVhfRUxFTUVOVFMgLSAxKV0gPSAtMX07CitFWFBPUlRfU1lNQk9MKHBoeXNub2RlX21hcCk7CisKK3ZvaWQgbWVtb3J5X3ByZXNlbnQoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwlwcmludGsoS0VSTl9JTkZPICJOb2RlOiAlZCwgc3RhcnRfcGZuOiAlbHgsIGVuZF9wZm46ICVseFxuIiwKKwkJCW5pZCwgc3RhcnQsIGVuZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgU2V0dGluZyBwaHlzbm9kZV9tYXAgYXJyYXkgdG8gbm9kZSAlZCBmb3IgcGZuczpcbiIsIG5pZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIik7CisJZm9yIChwZm4gPSBzdGFydDsgcGZuIDwgZW5kOyBwZm4gKz0gUEFHRVNfUEVSX0VMRU1FTlQpIHsKKwkJcGh5c25vZGVfbWFwW3BmbiAvIFBBR0VTX1BFUl9FTEVNRU5UXSA9IG5pZDsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiJWx4ICIsIHBmbik7CisJfQorCXByaW50ayhLRVJOX0NPTlQgIlxuIik7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbm9kZV9tZW1tYXBfc2l6ZV9ieXRlcyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQoreworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJaWYgKCFucl9wYWdlcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKG5yX3BhZ2VzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBhZ2UpOworfQorI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGZpbmRfbWF4X2xvd19wZm4odm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZW5kX3BmbiwgaGlnaHN0YXJ0X3BmbjsKKworI2RlZmluZSBMQVJHRV9QQUdFX0JZVEVTIChQVFJTX1BFUl9QVEUgKiBQQUdFX1NJWkUpCisKK3Vuc2lnbmVkIGxvbmcgbm9kZV9yZW1hcF9zaXplW01BWF9OVU1OT0RFU107CitzdGF0aWMgdm9pZCAqbm9kZV9yZW1hcF9zdGFydF92YWRkcltNQVhfTlVNTk9ERVNdOwordm9pZCBzZXRfcG1kX3Bmbih1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgZmxhZ3MpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBrdmFfc3RhcnRfcGZuOworc3RhdGljIHVuc2lnbmVkIGxvbmcga3ZhX3BhZ2VzOworLyoKKyAqIEZMQVQgLSBzdXBwb3J0IGZvciBiYXNpYyBQQyBtZW1vcnkgbW9kZWwgd2l0aCBkaXNjb250aWcgZW5hYmxlZCwgZXNzZW50aWFsbHkKKyAqICAgICAgICBhIHNpbmdsZSBub2RlIHdpdGggYWxsIGF2YWlsYWJsZSBwcm9jZXNzb3JzIGluIGl0IHdpdGggYSBmbGF0CisgKiAgICAgICAgbWVtb3J5IG1hcC4KKyAqLworaW50IF9faW5pdCBnZXRfbWVtY2ZnX251bWFfZmxhdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICJOVU1BIC0gc2luZ2xlIG5vZGUsIGZsYXQgbWVtb3J5IG1vZGVcbiIpOworCisJbm9kZV9zdGFydF9wZm5bMF0gPSAwOworCW5vZGVfZW5kX3BmblswXSA9IG1heF9wZm47CisJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucygwLCAwLCBtYXhfcGZuKTsKKwltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfcGZuKTsKKwlub2RlX3JlbWFwX3NpemVbMF0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKDAsIDAsIG1heF9wZm4pOworCisgICAgICAgIC8qIEluZGljYXRlIHRoZXJlIGlzIG9uZSBub2RlIGF2YWlsYWJsZS4gKi8KKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCW5vZGVfc2V0X29ubGluZSgwKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUgZm9yIHRoZSBub2RlCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwcm9wYWdhdGVfZTgyMF9tYXBfbm9kZShpbnQgbmlkKQoreworCWlmIChub2RlX2VuZF9wZm5bbmlkXSA+IG1heF9wZm4pCisJCW5vZGVfZW5kX3BmbltuaWRdID0gbWF4X3BmbjsKKwkvKgorCSAqIGlmIGEgdXNlciBoYXMgZ2l2ZW4gbWVtPVhYWFgsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgCisJICogdGhhdCB0aGUgbm9kZSBfc3RhcnRzXyBiZWZvcmUgdGhhdCwgdG9vLCBub3QganVzdCBlbmRzCisJICovCisJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBtYXhfcGZuKQorCQlub2RlX3N0YXJ0X3BmbltuaWRdID0gbWF4X3BmbjsKKwlCVUdfT04obm9kZV9zdGFydF9wZm5bbmlkXSA+IG5vZGVfZW5kX3BmbltuaWRdKTsKK30KKworLyogCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwZ19kYXRhX3QgZm9yIHRoaXMgbm9kZSB2aWEgYSBjcnVkZSBwcmUtYm9vdG1lbQorICogbWV0aG9kLiAgRm9yIG5vZGUgemVybyB0YWtlIHRoaXMgZnJvbSB0aGUgYm90dG9tIG9mIG1lbW9yeSwgZm9yCisgKiBzdWJzZXF1ZW50IG5vZGVzIHBsYWNlIHRoZW0gYXQgbm9kZV9yZW1hcF9zdGFydF92YWRkciB3aGljaCBjb250YWlucworICogbm9kZSBsb2NhbCBkYXRhIGluIHBoeXNpY2FsbHkgbm9kZSBsb2NhbCBtZW1vcnkuICBTZWUgc2V0dXBfbWVtb3J5KCkKKyAqIGZvciBkZXRhaWxzLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgYWxsb2NhdGVfcGdkYXQoaW50IG5pZCkKK3sKKwljaGFyIGJ1ZlsxNl07CisKKwlpZiAobm9kZV9oYXNfb25saW5lX21lbShuaWQpICYmIG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSkKKwkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIHBnZGF0X3BoeXM7CisJCXBnZGF0X3BoeXMgPSBmaW5kX2U4MjBfYXJlYShtaW5fbG93X3Bmbjw8UEFHRV9TSElGVCwKKwkJCQkgbWF4X3Bmbl9tYXBwZWQ8PFBBR0VfU0hJRlQsCisJCQkJIHNpemVvZihwZ19kYXRhX3QpLAorCQkJCSBQQUdFX1NJWkUpOworCQlOT0RFX0RBVEEobmlkKSA9IChwZ19kYXRhX3QgKikocGZuX3RvX2thZGRyKHBnZGF0X3BoeXM+PlBBR0VfU0hJRlQpKTsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzcHJpbnRmKGJ1ZiwgIk5PREVfREFUQSAlZCIsICBuaWQpOworCQlyZXNlcnZlX2Vhcmx5KHBnZGF0X3BoeXMsIHBnZGF0X3BoeXMgKyBzaXplb2YocGdfZGF0YV90KSwgYnVmKTsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImFsbG9jYXRlX3BnZGF0OiBub2RlICVkIE5PREVfREFUQSAlMDhseFxuIiwKKwkJbmlkLCAodW5zaWduZWQgbG9uZylOT0RFX0RBVEEobmlkKSk7Cit9CisKKy8qCisgKiBJbiB0aGUgRElTQ09OVElHTUVNIGFuZCBTUEFSU0VNRU0gbWVtb3J5IG1vZGVsLCBhIHBvcnRpb24gb2YgdGhlIGtlcm5lbAorICogdmlydHVhbCBhZGRyZXNzIHNwYWNlIChLVkEpIGlzIHJlc2VydmVkIGFuZCBwb3J0aW9ucyBvZiBub2RlcyBhcmUgbWFwcGVkCisgKiB1c2luZyBpdC4gVGhpcyBpcyB0byBhbGxvdyBub2RlLWxvY2FsIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBzdHJ1Y3R1cmVzIHRoYXQgd291bGQgbm9ybWFsbHkgcmVxdWlyZSBaT05FX05PUk1BTC4gVGhlIG1lbW9yeSBpcworICogYWxsb2NhdGVkIHdpdGggYWxsb2NfcmVtYXAoKSBhbmQgY2FsbGVycyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWxsb2NhdGUKKyAqIGZyb20gdGhlIGJvb3RtZW0gYWxsb2NhdG9yIGluc3RlYWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107CitzdGF0aWMgdm9pZCAqbm9kZV9yZW1hcF9lbmRfdmFkZHJbTUFYX05VTU5PREVTXTsKK3N0YXRpYyB2b2lkICpub2RlX3JlbWFwX2FsbG9jX3ZhZGRyW01BWF9OVU1OT0RFU107CitzdGF0aWMgdW5zaWduZWQgbG9uZyBub2RlX3JlbWFwX29mZnNldFtNQVhfTlVNTk9ERVNdOworCit2b2lkICphbGxvY19yZW1hcChpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqYWxsb2NhdGlvbiA9IG5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbbmlkXTsKKworCXNpemUgPSBBTElHTihzaXplLCBMMV9DQUNIRV9CWVRFUyk7CisKKwlpZiAoIWFsbG9jYXRpb24gfHwgKGFsbG9jYXRpb24gKyBzaXplKSA+PSBub2RlX3JlbWFwX2VuZF92YWRkcltuaWRdKQorCQlyZXR1cm4gMDsKKworCW5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbbmlkXSArPSBzaXplOworCW1lbXNldChhbGxvY2F0aW9uLCAwLCBzaXplKTsKKworCXJldHVybiBhbGxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcmVtYXBfbnVtYV9rdmEodm9pZCkKK3sKKwl2b2lkICp2YWRkcjsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlbWFwX251bWFfa3ZhOiBub2RlICVkXG4iLCBub2RlKTsKKwkJZm9yIChwZm49MDsgcGZuIDwgbm9kZV9yZW1hcF9zaXplW25vZGVdOyBwZm4gKz0gUFRSU19QRVJfUFRFKSB7CisJCQl2YWRkciA9IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbm9kZV0rKHBmbjw8UEFHRV9TSElGVCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAicmVtYXBfbnVtYV9rdmE6ICUwOGx4IHRvIHBmbiAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyl2YWRkciwKKwkJCQlub2RlX3JlbWFwX3N0YXJ0X3Bmbltub2RlXSArIHBmbik7CisJCQlzZXRfcG1kX3BmbigodWxvbmcpIHZhZGRyLCAKKwkJCQlub2RlX3JlbWFwX3N0YXJ0X3Bmbltub2RlXSArIHBmbiwgCisJCQkJUEFHRV9LRVJORUxfTEFSR0UpOworCQl9CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjdWxhdGVfbnVtYV9yZW1hcF9wYWdlcyh2b2lkKQoreworCWludCBuaWQ7CisJdW5zaWduZWQgbG9uZyBzaXplLCByZXNlcnZlX3BhZ2VzID0gMDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQl1NjQgbm9kZV9rdmFfdGFyZ2V0OworCQl1NjQgbm9kZV9rdmFfZmluYWw7CisKKwkJLyoKKwkJICogVGhlIGFjcGkvc3JhdCBub2RlIGluZm8gY2FuIHNob3cgaG90LWFkZCBtZW1yb3kgem9uZXMKKwkJICogd2hlcmUgbWVtb3J5IGNvdWxkIGJlIGFkZGVkIGJ1dCBub3QgY3VycmVudGx5IHByZXNlbnQuCisJCSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAibm9kZSAlZCBwZm46IFslbHggLSAlbHhdXG4iLAorCQkJbmlkLCBub2RlX3N0YXJ0X3BmbltuaWRdLCBub2RlX2VuZF9wZm5bbmlkXSk7CisJCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWF4X3BmbikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW5vZGVfZW5kX3BmbltuaWRdKQorCQkJY29udGludWU7CisJCWlmIChub2RlX2VuZF9wZm5bbmlkXSA+IG1heF9wZm4pCisJCQlub2RlX2VuZF9wZm5bbmlkXSA9IG1heF9wZm47CisKKwkJLyogZW5zdXJlIHRoZSByZW1hcCBpbmNsdWRlcyBzcGFjZSBmb3IgdGhlIHBnZGF0LiAqLworCQlzaXplID0gbm9kZV9yZW1hcF9zaXplW25pZF0gKyBzaXplb2YocGdfZGF0YV90KTsKKworCQkvKiBjb252ZXJ0IHNpemUgdG8gbGFyZ2UgKHBtZCBzaXplKSBwYWdlcywgcm91bmRpbmcgdXAgKi8KKwkJc2l6ZSA9IChzaXplICsgTEFSR0VfUEFHRV9CWVRFUyAtIDEpIC8gTEFSR0VfUEFHRV9CWVRFUzsKKwkJLyogbm93IHRoZSByb3VuZHVwIGlzIGNvcnJlY3QsIGNvbnZlcnQgdG8gUEFHRV9TSVpFIHBhZ2VzICovCisJCXNpemUgPSBzaXplICogUFRSU19QRVJfUFRFOworCisJCW5vZGVfa3ZhX3RhcmdldCA9IHJvdW5kX2Rvd24obm9kZV9lbmRfcGZuW25pZF0gLSBzaXplLAorCQkJCQkJIFBUUlNfUEVSX1BURSk7CisJCW5vZGVfa3ZhX3RhcmdldCA8PD0gUEFHRV9TSElGVDsKKwkJZG8geworCQkJbm9kZV9rdmFfZmluYWwgPSBmaW5kX2U4MjBfYXJlYShub2RlX2t2YV90YXJnZXQsCisJCQkJCSgodTY0KW5vZGVfZW5kX3BmbltuaWRdKTw8UEFHRV9TSElGVCwKKwkJCQkJCSgodTY0KXNpemUpPDxQQUdFX1NISUZULAorCQkJCQkJTEFSR0VfUEFHRV9CWVRFUyk7CisJCQlub2RlX2t2YV90YXJnZXQgLT0gTEFSR0VfUEFHRV9CWVRFUzsKKwkJfSB3aGlsZSAobm9kZV9rdmFfZmluYWwgPT0gLTFVTEwgJiYKKwkJCSAobm9kZV9rdmFfdGFyZ2V0Pj5QQUdFX1NISUZUKSA+IChub2RlX3N0YXJ0X3BmbltuaWRdKSk7CisKKwkJaWYgKG5vZGVfa3ZhX2ZpbmFsID09IC0xVUxMKQorCQkJcGFuaWMoIkNhbiBub3QgZ2V0IGt2YSByYW1cbiIpOworCisJCW5vZGVfcmVtYXBfc2l6ZVtuaWRdID0gc2l6ZTsKKwkJbm9kZV9yZW1hcF9vZmZzZXRbbmlkXSA9IHJlc2VydmVfcGFnZXM7CisJCXJlc2VydmVfcGFnZXMgKz0gc2l6ZTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJlc2VydmluZyAlbGQgcGFnZXMgb2YgS1ZBIGZvciBsbWVtX21hcCBvZiIKKwkJCQkgICIgbm9kZSAlZCBhdCAlbGx4XG4iLAorCQkJCXNpemUsIG5pZCwgbm9kZV9rdmFfZmluYWw+PlBBR0VfU0hJRlQpOworCisJCS8qCisJCSAqICBwcmV2ZW50IGt2YSBhZGRyZXNzIGJlbG93IG1heF9sb3dfcGZuIHdhbnQgaXQgb24gc3lzdGVtCisJCSAqICB3aXRoIGxlc3MgbWVtb3J5IGxhdGVyLgorCQkgKiAgbGF5b3V0IHdpbGwgYmU6IEtWQSBhZGRyZXNzICwgS1ZBIFJBTQorCQkgKgorCQkgKiAgd2UgYXJlIHN1cHBvc2VkIHRvIG9ubHkgcmVjb3JkIHRoZSBvbmUgbGVzcyB0aGVuIG1heF9sb3dfcGZuCisJCSAqICBidXQgd2UgY291bGQgaGF2ZSBzb21lIGhvbGUgaW4gaGlnaCBtZW1vcnksIGFuZCBpdCB3aWxsIG9ubHkKKwkJICogIGNoZWNrIHBhZ2VfaXNfcmFtKHBmbikgJiYgIXBhZ2VfaXNfcmVzZXJ2ZWRfZWFybHkocGZuKSB0byBkZWNpZGUKKwkJICogIHRvIHVzZSBpdCBhcyBmcmVlLgorCQkgKiAgU28gcmVzZXJ2ZV9lYXJseSBoZXJlLCBob3BlIHdlIGRvbid0IHJ1biBvdXQgb2YgdGhhdCBhcnJheQorCQkgKi8KKwkJcmVzZXJ2ZV9lYXJseShub2RlX2t2YV9maW5hbCwKKwkJCSAgICAgIG5vZGVfa3ZhX2ZpbmFsKygoKHU2NClzaXplKTw8UEFHRV9TSElGVCksCisJCQkgICAgICAiS1ZBIFJBTSIpOworCisJCW5vZGVfcmVtYXBfc3RhcnRfcGZuW25pZF0gPSBub2RlX2t2YV9maW5hbD4+UEFHRV9TSElGVDsKKwkJcmVtb3ZlX2FjdGl2ZV9yYW5nZShuaWQsIG5vZGVfcmVtYXBfc3RhcnRfcGZuW25pZF0sCisJCQkJCSBub2RlX3JlbWFwX3N0YXJ0X3BmbltuaWRdICsgc2l6ZSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIlJlc2VydmluZyB0b3RhbCBvZiAlbHggcGFnZXMgZm9yIG51bWEgS1ZBIHJlbWFwXG4iLAorCQkJcmVzZXJ2ZV9wYWdlcyk7CisJcmV0dXJuIHJlc2VydmVfcGFnZXM7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVtYXBfYWxsb2NhdG9yKGludCBuaWQpCit7CisJbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdID0gcGZuX3RvX2thZGRyKAorCQkJa3ZhX3N0YXJ0X3BmbiArIG5vZGVfcmVtYXBfb2Zmc2V0W25pZF0pOworCW5vZGVfcmVtYXBfZW5kX3ZhZGRyW25pZF0gPSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0gKworCQkobm9kZV9yZW1hcF9zaXplW25pZF0gKiBQQUdFX1NJWkUpOworCW5vZGVfcmVtYXBfYWxsb2NfdmFkZHJbbmlkXSA9IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXSArCisJCUFMSUdOKHNpemVvZihwZ19kYXRhX3QpLCBQQUdFX1NJWkUpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgJWQgd2lsbCByZW1hcCB0byB2YWRkciAlMDhseCAtICUwOGx4XG4iLCBuaWQsCisJCSh1bG9uZykgbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdLAorCQkodWxvbmcpIG5vZGVfcmVtYXBfZW5kX3ZhZGRyW25pZF0pOworfQorCit2b2lkIF9faW5pdCBpbml0bWVtX2luaXQodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCisJCQkJICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJaW50IG5pZDsKKwlsb25nIGt2YV90YXJnZXRfcGZuOworCisJLyoKKwkgKiBXaGVuIG1hcHBpbmcgYSBOVU1BIG1hY2hpbmUgd2UgYWxsb2NhdGUgdGhlIG5vZGVfbWVtX21hcCBhcnJheXMKKwkgKiBmcm9tIG5vZGUgbG9jYWwgbWVtb3J5LiAgVGhleSBhcmUgdGhlbiBtYXBwZWQgZGlyZWN0bHkgaW50byBLVkEKKwkgKiBiZXR3ZWVuIHpvbmUgbm9ybWFsIGFuZCB2bWFsbG9jIHNwYWNlLiAgQ2FsY3VsYXRlIHRoZSBzaXplIG9mCisJICogdGhpcyBzcGFjZSBhbmQgdXNlIGl0IHRvIGFkanVzdCB0aGUgYm91bmRhcnkgYmV0d2VlbiBaT05FX05PUk1BTAorCSAqIGFuZCBaT05FX0hJR0hNRU0uCisJICovCisKKwlnZXRfbWVtY2ZnX251bWEoKTsKKworCWt2YV9wYWdlcyA9IHJvdW5kdXAoY2FsY3VsYXRlX251bWFfcmVtYXBfcGFnZXMoKSwgUFRSU19QRVJfUFRFKTsKKworCWt2YV90YXJnZXRfcGZuID0gcm91bmRfZG93bihtYXhfbG93X3BmbiAtIGt2YV9wYWdlcywgUFRSU19QRVJfUFRFKTsKKwlkbyB7CisJCWt2YV9zdGFydF9wZm4gPSBmaW5kX2U4MjBfYXJlYShrdmFfdGFyZ2V0X3Bmbjw8UEFHRV9TSElGVCwKKwkJCQkJbWF4X2xvd19wZm48PFBBR0VfU0hJRlQsCisJCQkJCWt2YV9wYWdlczw8UEFHRV9TSElGVCwKKwkJCQkJUFRSU19QRVJfUFRFPDxQQUdFX1NISUZUKSA+PiBQQUdFX1NISUZUOworCQlrdmFfdGFyZ2V0X3BmbiAtPSBQVFJTX1BFUl9QVEU7CisJfSB3aGlsZSAoa3ZhX3N0YXJ0X3BmbiA9PSAtMVVMICYmIGt2YV90YXJnZXRfcGZuID4gbWluX2xvd19wZm4pOworCisJaWYgKGt2YV9zdGFydF9wZm4gPT0gLTFVTCkKKwkJcGFuaWMoIkNhbiBub3QgZ2V0IGt2YSBzcGFjZVxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJrdmFfc3RhcnRfcGZuIH4gJWx4IG1heF9sb3dfcGZuIH4gJWx4XG4iLAorCQlrdmFfc3RhcnRfcGZuLCBtYXhfbG93X3Bmbik7CisJcHJpbnRrKEtFUk5fSU5GTyAibWF4X3BmbiA9ICVseFxuIiwgbWF4X3Bmbik7CisKKwkvKiBhdm9pZCBjbGFzaCB3aXRoIGluaXRyZCAqLworCXJlc2VydmVfZWFybHkoa3ZhX3N0YXJ0X3Bmbjw8UEFHRV9TSElGVCwKKwkJICAgICAgKGt2YV9zdGFydF9wZm4gKyBrdmFfcGFnZXMpPDxQQUdFX1NISUZULAorCQkgICAgICJLVkEgUEciKTsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47CisJaWYgKG1heF9wZm4gPiBtYXhfbG93X3BmbikKKwkJaGlnaHN0YXJ0X3BmbiA9IG1heF9sb3dfcGZuOworCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgSElHSE1FTSBhdmFpbGFibGUuXG4iLAorCSAgICAgICBwYWdlc190b19tYihoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pKTsKKwludW1fcGh5c3BhZ2VzID0gaGlnaGVuZF9wZm47CisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKGhpZ2hzdGFydF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisjZWxzZQorCW51bV9waHlzcGFnZXMgPSBtYXhfbG93X3BmbjsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEobWF4X2xvd19wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisjZW5kaWYKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIExPV01FTSBhdmFpbGFibGUuXG4iLAorCQkJcGFnZXNfdG9fbWIobWF4X2xvd19wZm4pKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWF4X2xvd19wZm4gPSAlbHgsIGhpZ2hzdGFydF9wZm4gPSAlbHhcbiIsCisJCQltYXhfbG93X3BmbiwgaGlnaHN0YXJ0X3Bmbik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiTG93IG1lbW9yeSBlbmRzIGF0IHZhZGRyICUwOGx4XG4iLAorCQkJKHVsb25nKSBwZm5fdG9fa2FkZHIobWF4X2xvd19wZm4pKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJaW5pdF9yZW1hcF9hbGxvY2F0b3IobmlkKTsKKworCQlhbGxvY2F0ZV9wZ2RhdChuaWQpOworCX0KKwlyZW1hcF9udW1hX2t2YSgpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkhpZ2ggbWVtb3J5IHN0YXJ0cyBhdCB2YWRkciAlMDhseFxuIiwKKwkJCSh1bG9uZykgcGZuX3RvX2thZGRyKGhpZ2hzdGFydF9wZm4pKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpCisJCXByb3BhZ2F0ZV9lODIwX21hcF9ub2RlKG5pZCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpCisJCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCisJTk9ERV9EQVRBKDApLT5iZGF0YSA9ICZib290bWVtX25vZGVfZGF0YVswXTsKKwlzZXR1cF9ib290bWVtX2FsbG9jYXRvcigpOworfQorCit2b2lkIF9faW5pdCBzZXRfaGlnaG1lbV9wYWdlc19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlpbnQgbmlkOworCisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCXVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sIHpvbmVfZW5kX3BmbjsKKworCQlpZiAoIWlzX2hpZ2htZW0oem9uZSkpCisJCQljb250aW51ZTsKKworCQl6b25lX3N0YXJ0X3BmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOworCQl6b25lX2VuZF9wZm4gPSB6b25lX3N0YXJ0X3BmbiArIHpvbmUtPnNwYW5uZWRfcGFnZXM7CisKKwkJbmlkID0gem9uZV90b19uaWQoem9uZSk7CisJCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyAlcyBmb3Igbm9kZSAlZCAoJTA4bHg6JTA4bHgpXG4iLAorCQkJCXpvbmUtPm5hbWUsIG5pZCwgem9uZV9zdGFydF9wZm4sIHpvbmVfZW5kX3Bmbik7CisKKwkJYWRkX2hpZ2hwYWdlc193aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCwgem9uZV9zdGFydF9wZm4sCisJCQkJIHpvbmVfZW5kX3Bmbik7CisJfQorCXRvdGFscmFtX3BhZ2VzICs9IHRvdGFsaGlnaF9wYWdlczsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCitzdGF0aWMgaW50IHBhZGRyX3RvX25pZCh1NjQgYWRkcikKK3sKKwlpbnQgbmlkOworCXVuc2lnbmVkIGxvbmcgcGZuID0gUEZOX0RPV04oYWRkcik7CisKKwlmb3JfZWFjaF9ub2RlKG5pZCkKKwkJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPD0gcGZuICYmCisJCSAgICBwZm4gPCBub2RlX2VuZF9wZm5bbmlkXSkKKwkJCXJldHVybiBuaWQ7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXNrIG5vZGUgaWQgQkVGT1JFIG1lbW1hcCBhbmQgbWVtX3NlY3Rpb24ncworICogaW5pdGlhbGl6YXRpb24gKHBmbl90b19uaWQoKSBjYW4ndCBiZSB1c2VkIHlldCkuCisgKiBJZiBfUFhNIGlzIG5vdCBkZWZpbmVkIG9uIEFDUEkncyBEU0RULCBub2RlIGlkIG11c3QgYmUgZm91bmQgYnkgdGhpcy4KKyAqLworaW50IG1lbW9yeV9hZGRfcGh5c2FkZHJfdG9fbmlkKHU2NCBhZGRyKQoreworCWludCBuaWQgPSBwYWRkcl90b19uaWQoYWRkcik7CisJcmV0dXJuIChuaWQgPj0gMCkgPyBuaWQgOiAwOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYV82NC5jIGIvYXJjaC94ODYvbW0vbnVtYV82NC5jCmluZGV4IGE0ZGQ3OTMuLmNlYmNiZjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWFfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlhZGRyID0gMHg4MDAwOwotCW5vZGVtYXBfc2l6ZSA9IHJvdW5kX3VwKHNpemVvZihzMTYpICogbWVtbm9kZW1hcHNpemUsIEwxX0NBQ0hFX0JZVEVTKTsKKwlub2RlbWFwX3NpemUgPSByb3VuZHVwKHNpemVvZihzMTYpICogbWVtbm9kZW1hcHNpemUsIEwxX0NBQ0hFX0JZVEVTKTsKIAlub2RlbWFwX2FkZHIgPSBmaW5kX2U4MjBfYXJlYShhZGRyLCBtYXhfcGZuPDxQQUdFX1NISUZULAogCQkJCSAgICAgIG5vZGVtYXBfc2l6ZSwgTDFfQ0FDSEVfQllURVMpOwogCWlmIChub2RlbWFwX2FkZHIgPT0gLTFVTCkgewpAQCAtMTc2LDEwICsxNzYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgbGFzdF9wZm4sIGJvb3RtYXBfcGFnZXMsIGJvb3RtYXBfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc3RhcnQsIG5vZGVkYXRhX3BoeXM7CiAJdm9pZCAqYm9vdG1hcDsKLQljb25zdCBpbnQgcGdkYXRfc2l6ZSA9IHJvdW5kX3VwKHNpemVvZihwZ19kYXRhX3QpLCBQQUdFX1NJWkUpOworCWNvbnN0IGludCBwZ2RhdF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgUEFHRV9TSVpFKTsKIAlpbnQgbmlkOwogCi0Jc3RhcnQgPSByb3VuZF91cChzdGFydCwgWk9ORV9BTElHTik7CisJc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBaT05FX0FMSUdOKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkJvb3RtZW0gc2V0dXAgbm9kZSAlZCAlMDE2bHgtJTAxNmx4XG4iLCBub2RlaWQsCiAJICAgICAgIHN0YXJ0LCBlbmQpOwpAQCAtMjEwLDkgKzIxMCw5IEBACiAJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhsYXN0X3BmbiAtIHN0YXJ0X3Bmbik7CiAJbmlkID0gcGh5c190b19uaWQobm9kZWRhdGFfcGh5cyk7CiAJaWYgKG5pZCA9PSBub2RlaWQpCi0JCWJvb3RtYXBfc3RhcnQgPSByb3VuZF91cChub2RlZGF0YV9waHlzICsgcGdkYXRfc2l6ZSwgUEFHRV9TSVpFKTsKKwkJYm9vdG1hcF9zdGFydCA9IHJvdW5kdXAobm9kZWRhdGFfcGh5cyArIHBnZGF0X3NpemUsIFBBR0VfU0laRSk7CiAJZWxzZQotCQlib290bWFwX3N0YXJ0ID0gcm91bmRfdXAoc3RhcnQsIFBBR0VfU0laRSk7CisJCWJvb3RtYXBfc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBQQUdFX1NJWkUpOwogCS8qCiAJICogU01QX0NBQ0hFX0JZVEVTIGNvdWxkIGJlIGVub3VnaCwgYnV0IGluaXRfYm9vdG1lbV9ub2RlIGxpa2UKIAkgKiB0byB1c2UgdGhhdCB0byBhbGlnbiB0byBQQUdFX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLXRlc3QuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLXRlc3QuYwppbmRleCBkNGFhNTAzLi5lMWQxMDY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci10ZXN0LmMKKysrIGIvYXJjaC94ODYvbW0vcGFnZWF0dHItdGVzdC5jCkBAIC0zMiw3ICszMiw3IEBACiAJR1BTCQkJPSAoMTw8MzApCiB9OwogCi0jZGVmaW5lIFBBR0VfVEVTVEJJVAlfX3BncHJvdChfUEFHRV9VTlVTRUQxKQorI2RlZmluZSBQQUdFX0NQQV9URVNUCV9fcGdwcm90KF9QQUdFX0NQQV9URVNUKQogCiBzdGF0aWMgaW50IHB0ZV90ZXN0Yml0KHB0ZV90IHB0ZSkKIHsKQEAgLTExOCw2ICsxMTgsNyBAQAogCXVuc2lnbmVkIGludCBsZXZlbDsKIAlpbnQgaSwgazsKIAlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdGVzdF9hZGRyOwogCiAJaWYgKHByaW50KQogCQlwcmludGsoS0VSTl9JTkZPICJDUEEgc2VsZi10ZXN0OlxuIik7CkBAIC0xNzIsNyArMTczLDggQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZXJyID0gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoYWRkcltpXSwgbGVuW2ldLCBQQUdFX1RFU1RCSVQpOworCQl0ZXN0X2FkZHIgPSBhZGRyW2ldOworCQllcnIgPSBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmdGVzdF9hZGRyLCBsZW5baV0sIFBBR0VfQ1BBX1RFU1QsIDApOwogCQlpZiAoZXJyIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJDUEEgJWQgZmFpbGVkICVkXG4iLCBpLCBlcnIpOwogCQkJZmFpbGVkKys7CkBAIC0yMDQsNyArMjA2LDggQEAKIAkJCWZhaWxlZCsrOwogCQkJY29udGludWU7CiAJCX0KLQkJZXJyID0gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihhZGRyW2ldLCBsZW5baV0sIFBBR0VfVEVTVEJJVCk7CisJCXRlc3RfYWRkciA9IGFkZHJbaV07CisJCWVyciA9IGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIoJnRlc3RfYWRkciwgbGVuW2ldLCBQQUdFX0NQQV9URVNULCAwKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiQ1BBIHJldmVydGluZyBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQkJZmFpbGVkKys7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwppbmRleCA0M2UyZjg0Li5hOWVjODljIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKQEAgLTI1LDE1ICsyNSwyNyBAQAogICogVGhlIGN1cnJlbnQgZmx1c2hpbmcgY29udGV4dCAtIHdlIHBhc3MgaXQgaW5zdGVhZCBvZiA1IGFyZ3VtZW50czoKICAqLwogc3RydWN0IGNwYV9kYXRhIHsKLQl1bnNpZ25lZCBsb25nCXZhZGRyOworCXVuc2lnbmVkIGxvbmcJKnZhZGRyOwogCXBncHJvdF90CW1hc2tfc2V0OwogCXBncHJvdF90CW1hc2tfY2xyOwogCWludAkJbnVtcGFnZXM7Ci0JaW50CQlmbHVzaHRsYjsKKwlpbnQJCWZsYWdzOwogCXVuc2lnbmVkIGxvbmcJcGZuOwogCXVuc2lnbmVkCWZvcmNlX3NwbGl0IDogMTsKKwlpbnQJCWN1cnBhZ2U7CiB9OwogCisvKgorICogU2VyaWFsaXplIGNwYSgpIChmb3IgIURFQlVHX1BBR0VBTExPQyB3aGljaCB1c2VzIGxhcmdlIGlkZW50aXR5IG1hcHBpbmdzKQorICogdXNpbmcgY3BhX2xvY2suIFNvIHRoYXQgd2UgZG9uJ3QgYWxsb3cgYW55IG90aGVyIGNwdSwgd2l0aCBzdGFsZSBsYXJnZSB0bGIKKyAqIGVudHJpZXMgY2hhbmdlIHRoZSBwYWdlIGF0dHJpYnV0ZSBpbiBwYXJhbGxlbCB0byBzb21lIG90aGVyIGNwdQorICogc3BsaXR0aW5nIGEgbGFyZ2UgcGFnZSBlbnRyeSBhbG9uZyB3aXRoIGNoYW5naW5nIHRoZSBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spOworCisjZGVmaW5lIENQQV9GTFVTSFRMQiAxCisjZGVmaW5lIENQQV9BUlJBWSAyCisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMX05VTV07CiAKQEAgLTg0LDcgKzk2LDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhpZ2htYXBfZW5kX3Bmbih2b2lkKQogewotCXJldHVybiBfX3BhKHJvdW5kX3VwKCh1bnNpZ25lZCBsb25nKV9lbmQsIFBNRF9TSVpFKSkgPj4gUEFHRV9TSElGVDsKKwlyZXR1cm4gX19wYShyb3VuZHVwKCh1bnNpZ25lZCBsb25nKV9lbmQsIFBNRF9TSVpFKSkgPj4gUEFHRV9TSElGVDsKIH0KIAogI2VuZGlmCkBAIC0xOTAsNiArMjAyLDQxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBjcGFfZmx1c2hfYXJyYXkodW5zaWduZWQgbG9uZyAqc3RhcnQsIGludCBudW1wYWdlcywgaW50IGNhY2hlKQoreworCXVuc2lnbmVkIGludCBpLCBsZXZlbDsKKwl1bnNpZ25lZCBsb25nICphZGRyOworCisJQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwlvbl9lYWNoX2NwdShfX2NwYV9mbHVzaF9yYW5nZSwgTlVMTCwgMSk7CisKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm47CisKKwkvKiA0TSB0aHJlc2hvbGQgKi8KKwlpZiAobnVtcGFnZXMgPj0gMTAyNCkgeworCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gNCkKKwkJCXdiaW52ZCgpOworCQlyZXR1cm47CisJfQorCS8qCisJICogV2Ugb25seSBuZWVkIHRvIGZsdXNoIG9uIG9uZSBDUFUsCisJICogY2xmbHVzaCBpcyBhIE1FU0ktY29oZXJlbnQgaW5zdHJ1Y3Rpb24gdGhhdAorCSAqIHdpbGwgY2F1c2UgYWxsIG90aGVyIENQVXMgdG8gZmx1c2ggdGhlIHNhbWUKKwkgKiBjYWNoZWxpbmVzOgorCSAqLworCWZvciAoaSA9IDAsIGFkZHIgPSBzdGFydDsgaSA8IG51bXBhZ2VzOyBpKyssIGFkZHIrKykgeworCQlwdGVfdCAqcHRlID0gbG9va3VwX2FkZHJlc3MoKmFkZHIsICZsZXZlbCk7CisKKwkJLyoKKwkJICogT25seSBmbHVzaCBwcmVzZW50IGFkZHJlc3NlczoKKwkJICovCisJCWlmIChwdGUgJiYgKHB0ZV92YWwoKnB0ZSkgJiBfUEFHRV9QUkVTRU5UKSkKKwkJCWNsZmx1c2hfY2FjaGVfcmFuZ2UoKHZvaWQgKikgKmFkZHIsIFBBR0VfU0laRSk7CisJfQorfQorCiAvKgogICogQ2VydGFpbiBhcmVhcyBvZiBtZW1vcnkgb24geDg2IHJlcXVpcmUgdmVyeSBzcGVjaWZpYyBwcm90ZWN0aW9uIGZsYWdzLAogICogZm9yIGV4YW1wbGUgdGhlIEJJT1MgYXJlYSBvciBrZXJuZWwgdGV4dC4gQ2FsbGVycyBkb24ndCBhbHdheXMgZ2V0IHRoaXMKQEAgLTM5OCw3ICs0NDUsNyBAQAogCQkgKi8KIAkJbmV3X3B0ZSA9IHBmbl9wdGUocHRlX3BmbihvbGRfcHRlKSwgY2Fub25fcGdwcm90KG5ld19wcm90KSk7CiAJCV9fc2V0X3BtZF9wdGUoa3B0ZSwgYWRkcmVzcywgbmV3X3B0ZSk7Ci0JCWNwYS0+Zmx1c2h0bGIgPSAxOworCQljcGEtPmZsYWdzIHw9IENQQV9GTFVTSFRMQjsKIAkJZG9fc3BsaXQgPSAwOwogCX0KIApAQCAtNDA4LDg0ICs0NTUsNiBAQAogCXJldHVybiBkb19zcGxpdDsKIH0KIAotc3RhdGljIExJU1RfSEVBRChwYWdlX3Bvb2wpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9vbF9zaXplLCBwb29sX3BhZ2VzLCBwb29sX2xvdzsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvb2xfdXNlZCwgcG9vbF9mYWlsZWQ7Ci0KLXN0YXRpYyB2b2lkIGNwYV9maWxsX3Bvb2woc3RydWN0IHBhZ2UgKipyZXQpCi17Ci0JZ2ZwX3QgZ2ZwID0gR0ZQX0tFUk5FTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBwYWdlICpwOwotCi0JLyoKLQkgKiBBdm9pZCByZWN1cnNpb24gKG9uIGRlYnVnLXBhZ2VhbGxvYykgYW5kIGFsc28gc2lnbmFsCi0JICogb3VyIHByaW9yaXR5IHRvIGdldCB0byB0aGVzZSBwYWdldGFibGVzOgotCSAqLwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKQotCQlyZXR1cm47Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGF0b21pY2FsbHkgZnJvbSBhdG9taWMgY29udGV4dHM6Ci0JICovCi0JaWYgKGluX2F0b21pYygpIHx8IGlycXNfZGlzYWJsZWQoKSB8fCBkZWJ1Z19wYWdlYWxsb2MpCi0JCWdmcCA9ICBHRlBfQVRPTUlDIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PV0FSTjsKLQotCXdoaWxlIChwb29sX3BhZ2VzIDwgcG9vbF9zaXplIHx8IChyZXQgJiYgISpyZXQpKSB7Ci0JCXAgPSBhbGxvY19wYWdlcyhnZnAsIDApOwotCQlpZiAoIXApIHsKLQkJCXBvb2xfZmFpbGVkKys7Ci0JCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiBJZiB0aGUgY2FsbCBzaXRlIG5lZWRzIGEgcGFnZSByaWdodCBub3csIHByb3ZpZGUgaXQ6Ci0JCSAqLwotCQlpZiAocmV0ICYmICEqcmV0KSB7Ci0JCQkqcmV0ID0gcDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZCgmcC0+bHJ1LCAmcGFnZV9wb29sKTsKLQkJcG9vbF9wYWdlcysrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOwotCX0KLQotCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9NRU1BTExPQzsKLX0KLQotI2RlZmluZSBTSElGVF9NQgkJKDIwIC0gUEFHRV9TSElGVCkKLSNkZWZpbmUgUk9VTkRfTUJfR0IJCSgoMSA8PCAxMCkgLSAxKQotI2RlZmluZSBTSElGVF9NQl9HQgkJMTAKLSNkZWZpbmUgUE9PTF9QQUdFU19QRVJfR0IJMTYKLQotdm9pZCBfX2luaXQgY3BhX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzaW5mbyBzaTsKLQl1bnNpZ25lZCBsb25nIGdiOwotCi0Jc2lfbWVtaW5mbygmc2kpOwotCS8qCi0JICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcG9vbCBwYWdlczoKLQkgKgotCSAqIENvbnZlcnQgdG90YWxyYW0gKG5yIG9mIHBhZ2VzKSB0byBNaUIgYW5kIHJvdW5kIHRvIHRoZSBuZXh0Ci0JICogR2lCLiBTaGlmdCBNaUIgdG8gR2liIGFuZCBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5Ci0JICogUE9PTF9QQUdFU19QRVJfR0I6Ci0JICovCi0JaWYgKGRlYnVnX3BhZ2VhbGxvYykgewotCQlnYiA9ICgoc2kudG90YWxyYW0gPj4gU0hJRlRfTUIpICsgUk9VTkRfTUJfR0IpID4+IFNISUZUX01CX0dCOwotCQlwb29sX3NpemUgPSBQT09MX1BBR0VTX1BFUl9HQiAqIGdiOwotCX0gZWxzZSB7Ci0JCXBvb2xfc2l6ZSA9IDE7Ci0JfQotCXBvb2xfbG93ID0gcG9vbF9zaXplOwotCi0JY3BhX2ZpbGxfcG9vbChOVUxMKTsKLQlwcmludGsoS0VSTl9ERUJVRwotCSAgICAgICAiQ1BBOiBwYWdlIHBvb2wgaW5pdGlhbGl6ZWQgJWx1IG9mICVsdSBwYWdlcyBwcmVhbGxvY2F0ZWRcbiIsCi0JICAgICAgIHBvb2xfcGFnZXMsIHBvb2xfc2l6ZSk7Ci19Ci0KIHN0YXRpYyBpbnQgc3BsaXRfbGFyZ2VfcGFnZShwdGVfdCAqa3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHBmbiwgcGZuaW5jID0gMTsKQEAgLTQ5NCwyOCArNDYzLDE1IEBACiAJcGdwcm90X3QgcmVmX3Byb3Q7CiAJc3RydWN0IHBhZ2UgKmJhc2U7CiAKLQkvKgotCSAqIEdldCBhIHBhZ2UgZnJvbSB0aGUgcG9vbC4gVGhlIHBvb2wgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgdGhlCi0JICogcGdkX2xvY2ssIHdoaWNoIHdlIGhhdmUgdG8gdGFrZSBhbnl3YXkgZm9yIHRoZSBzcGxpdAotCSAqIG9wZXJhdGlvbjoKLQkgKi8KKwlpZiAoIWRlYnVnX3BhZ2VhbGxvYykKKwkJc3Bpbl91bmxvY2soJmNwYV9sb2NrKTsKKwliYXNlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJaWYgKCFkZWJ1Z19wYWdlYWxsb2MpCisJCXNwaW5fbG9jaygmY3BhX2xvY2spOworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGdkX2xvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmcGFnZV9wb29sKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOwotCQliYXNlID0gTlVMTDsKLQkJY3BhX2ZpbGxfcG9vbCgmYmFzZSk7Ci0JCWlmICghYmFzZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGdkX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQliYXNlID0gbGlzdF9maXJzdF9lbnRyeSgmcGFnZV9wb29sLCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKLQkJbGlzdF9kZWwoJmJhc2UtPmxydSk7Ci0JCXBvb2xfcGFnZXMtLTsKLQotCQlpZiAocG9vbF9wYWdlcyA8IHBvb2xfbG93KQotCQkJcG9vbF9sb3cgPSBwb29sX3BhZ2VzOwotCX0KLQogCS8qCiAJICogQ2hlY2sgZm9yIHJhY2VzLCBhbm90aGVyIENQVSBtaWdodCBoYXZlIHNwbGl0IHRoaXMgcGFnZQogCSAqIHVwIGZvciB1cyBhbHJlYWR5OgpAQCAtNTcyLDExICs1MjgsOCBAQAogCSAqIElmIHdlIGRyb3BwZWQgb3V0IHZpYSB0aGUgbG9va3VwX2FkZHJlc3MgY2hlY2sgdW5kZXIKIAkgKiBwZ2RfbG9jayB0aGVuIHN0aWNrIHRoZSBwYWdlIGJhY2sgaW50byB0aGUgcG9vbDoKIAkgKi8KLQlpZiAoYmFzZSkgewotCQlsaXN0X2FkZCgmYmFzZS0+bHJ1LCAmcGFnZV9wb29sKTsKLQkJcG9vbF9wYWdlcysrOwotCX0gZWxzZQotCQlwb29sX3VzZWQrKzsKKwlpZiAoYmFzZSkKKwkJX19mcmVlX3BhZ2UoYmFzZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtNTg0LDExICs1MzcsMTYgQEAKIAogc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IGNwYV9kYXRhICpjcGEsIGludCBwcmltYXJ5KQogewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IGNwYS0+dmFkZHI7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCWludCBkb19zcGxpdCwgZXJyOwogCXVuc2lnbmVkIGludCBsZXZlbDsKIAlwdGVfdCAqa3B0ZSwgb2xkX3B0ZTsKIAorCWlmIChjcGEtPmZsYWdzICYgQ1BBX0FSUkFZKQorCQlhZGRyZXNzID0gY3BhLT52YWRkcltjcGEtPmN1cnBhZ2VdOworCWVsc2UKKwkJYWRkcmVzcyA9ICpjcGEtPnZhZGRyOworCiByZXBlYXQ6CiAJa3B0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MsICZsZXZlbCk7CiAJaWYgKCFrcHRlKQpAQCAtNjAwLDcgKzU1OCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJV0FSTigxLCBLRVJOX1dBUk5JTkcgIkNQQTogY2FsbGVkIGZvciB6ZXJvIHB0ZS4gIgogCQkgICAgICAgInZhZGRyID0gJWx4IGNwYS0+dmFkZHIgPSAlbHhcbiIsIGFkZHJlc3MsCi0JCSAgICAgICBjcGEtPnZhZGRyKTsKKwkJICAgICAgICpjcGEtPnZhZGRyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02MjYsNyArNTg0LDcgQEAKIAkJICovCiAJCWlmIChwdGVfdmFsKG9sZF9wdGUpICE9IHB0ZV92YWwobmV3X3B0ZSkpIHsKIAkJCXNldF9wdGVfYXRvbWljKGtwdGUsIG5ld19wdGUpOwotCQkJY3BhLT5mbHVzaHRsYiA9IDE7CisJCQljcGEtPmZsYWdzIHw9IENQQV9GTFVTSFRMQjsKIAkJfQogCQljcGEtPm51bXBhZ2VzID0gMTsKIAkJcmV0dXJuIDA7CkBAIC02NTAsNyArNjA4LDI1IEBACiAJICovCiAJZXJyID0gc3BsaXRfbGFyZ2VfcGFnZShrcHRlLCBhZGRyZXNzKTsKIAlpZiAoIWVycikgewotCQljcGEtPmZsdXNodGxiID0gMTsKKwkJLyoKKwkgCSAqIERvIGEgZ2xvYmFsIGZsdXNoIHRsYiBhZnRlciBzcGxpdHRpbmcgdGhlIGxhcmdlIHBhZ2UKKwkgCSAqIGFuZCBiZWZvcmUgd2UgZG8gdGhlIGFjdHVhbCBjaGFuZ2UgcGFnZSBhdHRyaWJ1dGUgaW4gdGhlIFBURS4KKwkgCSAqCisJIAkgKiBXaXRoIG91dCB0aGlzLCB3ZSB2aW9sYXRlIHRoZSBUTEIgYXBwbGljYXRpb24gbm90ZSwgdGhhdCBzYXlzCisJIAkgKiAiVGhlIFRMQnMgbWF5IGNvbnRhaW4gYm90aCBvcmRpbmFyeSBhbmQgbGFyZ2UtcGFnZQorCQkgKiAgdHJhbnNsYXRpb25zIGZvciBhIDQtS0J5dGUgcmFuZ2Ugb2YgbGluZWFyIGFkZHJlc3Nlcy4gVGhpcworCQkgKiAgbWF5IG9jY3VyIGlmIHNvZnR3YXJlIG1vZGlmaWVzIHRoZSBwYWdpbmcgc3RydWN0dXJlcyBzbyB0aGF0CisJCSAqICB0aGUgcGFnZSBzaXplIHVzZWQgZm9yIHRoZSBhZGRyZXNzIHJhbmdlIGNoYW5nZXMuIElmIHRoZSB0d28KKwkJICogIHRyYW5zbGF0aW9ucyBkaWZmZXIgd2l0aCByZXNwZWN0IHRvIHBhZ2UgZnJhbWUgb3IgYXR0cmlidXRlcworCQkgKiAgKGUuZy4sIHBlcm1pc3Npb25zKSwgcHJvY2Vzc29yIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBhbmQgbWF5CisJCSAqICBiZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYy4iCisJIAkgKgorCSAJICogV2UgZG8gdGhpcyBnbG9iYWwgdGxiIGZsdXNoIGluc2lkZSB0aGUgY3BhX2xvY2ssIHNvIHRoYXQgd2UKKwkJICogZG9uJ3QgYWxsb3cgYW55IG90aGVyIGNwdSwgd2l0aCBzdGFsZSB0bGIgZW50cmllcyBjaGFuZ2UgdGhlCisJCSAqIHBhZ2UgYXR0cmlidXRlIGluIHBhcmFsbGVsLCB0aGF0IGFsc28gZmFsbHMgaW50byB0aGUKKwkJICoganVzdCBzcGxpdCBsYXJnZSBwYWdlIGVudHJ5LgorCSAJICovCisJCWZsdXNoX3RsYl9hbGwoKTsKIAkJZ290byByZXBlYXQ7CiAJfQogCkBAIC02NjMsNiArNjM5LDcgQEAKIHsKIAlzdHJ1Y3QgY3BhX2RhdGEgYWxpYXNfY3BhOwogCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGVtcF9jcGFfdmFkZHIsIHZhZGRyOwogCiAJaWYgKGNwYS0+cGZuID49IG1heF9wZm5fbWFwcGVkKQogCQlyZXR1cm4gMDsKQEAgLTY3NSwxNiArNjUyLDI0IEBACiAJICogTm8gbmVlZCB0byByZWRvLCB3aGVuIHRoZSBwcmltYXJ5IGNhbGwgdG91Y2hlZCB0aGUgZGlyZWN0CiAJICogbWFwcGluZyBhbHJlYWR5OgogCSAqLwotCWlmICghKHdpdGhpbihjcGEtPnZhZGRyLCBQQUdFX09GRlNFVCwKKwlpZiAoY3BhLT5mbGFncyAmIENQQV9BUlJBWSkKKwkJdmFkZHIgPSBjcGEtPnZhZGRyW2NwYS0+Y3VycGFnZV07CisJZWxzZQorCQl2YWRkciA9ICpjcGEtPnZhZGRyOworCisJaWYgKCEod2l0aGluKHZhZGRyLCBQQUdFX09GRlNFVCwKIAkJICAgIFBBR0VfT0ZGU0VUICsgKG1heF9sb3dfcGZuX21hcHBlZCA8PCBQQUdFX1NISUZUKSkKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JCXx8IHdpdGhpbihjcGEtPnZhZGRyLCBQQUdFX09GRlNFVCArICgxVUw8PDMyKSwKKwkJfHwgd2l0aGluKHZhZGRyLCBQQUdFX09GRlNFVCArICgxVUw8PDMyKSwKIAkJICAgIFBBR0VfT0ZGU0VUICsgKG1heF9wZm5fbWFwcGVkIDw8IFBBR0VfU0hJRlQpKQogI2VuZGlmCiAJKSkgewogCiAJCWFsaWFzX2NwYSA9ICpjcGE7Ci0JCWFsaWFzX2NwYS52YWRkciA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKGNwYS0+cGZuIDw8IFBBR0VfU0hJRlQpOworCQl0ZW1wX2NwYV92YWRkciA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKGNwYS0+cGZuIDw8IFBBR0VfU0hJRlQpOworCQlhbGlhc19jcGEudmFkZHIgPSAmdGVtcF9jcGFfdmFkZHI7CisJCWFsaWFzX2NwYS5mbGFncyAmPSB+Q1BBX0FSUkFZOworCiAKIAkJcmV0ID0gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmFsaWFzX2NwYSwgMCk7CiAJfQpAQCAtNjk2LDcgKzY4MSw3IEBACiAJICogTm8gbmVlZCB0byByZWRvLCB3aGVuIHRoZSBwcmltYXJ5IGNhbGwgdG91Y2hlZCB0aGUgaGlnaAogCSAqIG1hcHBpbmcgYWxyZWFkeToKIAkgKi8KLQlpZiAod2l0aGluKGNwYS0+dmFkZHIsICh1bnNpZ25lZCBsb25nKSBfdGV4dCwgKHVuc2lnbmVkIGxvbmcpIF9lbmQpKQorCWlmICh3aXRoaW4odmFkZHIsICh1bnNpZ25lZCBsb25nKSBfdGV4dCwgKHVuc2lnbmVkIGxvbmcpIF9lbmQpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC03MDcsOCArNjkyLDkgQEAKIAkJcmV0dXJuIDA7CiAKIAlhbGlhc19jcGEgPSAqY3BhOwotCWFsaWFzX2NwYS52YWRkciA9Ci0JCShjcGEtPnBmbiA8PCBQQUdFX1NISUZUKSArIF9fU1RBUlRfS0VSTkVMX21hcCAtIHBoeXNfYmFzZTsKKwl0ZW1wX2NwYV92YWRkciA9IChjcGEtPnBmbiA8PCBQQUdFX1NISUZUKSArIF9fU1RBUlRfS0VSTkVMX21hcCAtIHBoeXNfYmFzZTsKKwlhbGlhc19jcGEudmFkZHIgPSAmdGVtcF9jcGFfdmFkZHI7CisJYWxpYXNfY3BhLmZsYWdzICY9IH5DUEFfQVJSQVk7CiAKIAkvKgogCSAqIFRoZSBoaWdoIG1hcHBpbmcgcmFuZ2UgaXMgaW1wcmVjaXNlLCBzbyBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZS4KQEAgLTcyOCw4ICs3MTQsMTUgQEAKIAkJICogcHJlc2VydmF0aW9uIGNoZWNrLgogCQkgKi8KIAkJY3BhLT5udW1wYWdlcyA9IG51bXBhZ2VzOworCQkvKiBmb3IgYXJyYXkgY2hhbmdlcywgd2UgY2FuJ3QgdXNlIGxhcmdlIHBhZ2UgKi8KKwkJaWYgKGNwYS0+ZmxhZ3MgJiBDUEFfQVJSQVkpCisJCQljcGEtPm51bXBhZ2VzID0gMTsKIAorCQlpZiAoIWRlYnVnX3BhZ2VhbGxvYykKKwkJCXNwaW5fbG9jaygmY3BhX2xvY2spOwogCQlyZXQgPSBfX2NoYW5nZV9wYWdlX2F0dHIoY3BhLCBjaGVja2FsaWFzKTsKKwkJaWYgKCFkZWJ1Z19wYWdlYWxsb2MpCisJCQlzcGluX3VubG9jaygmY3BhX2xvY2spOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNzQ2LDcgKzczOSwxMSBAQAogCQkgKi8KIAkJQlVHX09OKGNwYS0+bnVtcGFnZXMgPiBudW1wYWdlcyk7CiAJCW51bXBhZ2VzIC09IGNwYS0+bnVtcGFnZXM7Ci0JCWNwYS0+dmFkZHIgKz0gY3BhLT5udW1wYWdlcyAqIFBBR0VfU0laRTsKKwkJaWYgKGNwYS0+ZmxhZ3MgJiBDUEFfQVJSQVkpCisJCQljcGEtPmN1cnBhZ2UrKzsKKwkJZWxzZQorCQkJKmNwYS0+dmFkZHIgKz0gY3BhLT5udW1wYWdlcyAqIFBBR0VfU0laRTsKKwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc1Nyw5ICs3NTQsOSBAQAogCQkoX1BBR0VfUEFUIHwgX1BBR0VfUEFUX0xBUkdFIHwgX1BBR0VfUFdUIHwgX1BBR0VfUENEKTsKIH0KIAotc3RhdGljIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsCitzdGF0aWMgaW50IGNoYW5nZV9wYWdlX2F0dHJfc2V0X2Nscih1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsCiAJCQkJICAgIHBncHJvdF90IG1hc2tfc2V0LCBwZ3Byb3RfdCBtYXNrX2NsciwKLQkJCQkgICAgaW50IGZvcmNlX3NwbGl0KQorCQkJCSAgICBpbnQgZm9yY2Vfc3BsaXQsIGludCBhcnJheSkKIHsKIAlzdHJ1Y3QgY3BhX2RhdGEgY3BhOwogCWludCByZXQsIGNhY2hlLCBjaGVja2FsaWFzOwpAQCAtNzc0LDIxICs3NzEsMzggQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBFbnN1cmUgd2UgYXJlIFBBR0VfU0laRSBhbGlnbmVkICovCi0JaWYgKGFkZHIgJiB+UEFHRV9NQVNLKSB7Ci0JCWFkZHIgJj0gUEFHRV9NQVNLOwotCQkvKgotCQkgKiBQZW9wbGUgc2hvdWxkIG5vdCBiZSBwYXNzaW5nIGluIHVuYWxpZ25lZCBhZGRyZXNzZXM6Ci0JCSAqLwotCQlXQVJOX09OX09OQ0UoMSk7CisJaWYgKCFhcnJheSkgeworCQlpZiAoKmFkZHIgJiB+UEFHRV9NQVNLKSB7CisJCQkqYWRkciAmPSBQQUdFX01BU0s7CisJCQkvKgorCQkJICogUGVvcGxlIHNob3VsZCBub3QgYmUgcGFzc2luZyBpbiB1bmFsaWduZWQgYWRkcmVzc2VzOgorCQkJICovCisJCQlXQVJOX09OX09OQ0UoMSk7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKKwkJCWlmIChhZGRyW2ldICYgflBBR0VfTUFTSykgeworCQkJCWFkZHJbaV0gJj0gUEFHRV9NQVNLOworCQkJCVdBUk5fT05fT05DRSgxKTsKKwkJCX0KKwkJfQogCX0KIAorCS8qIE11c3QgYXZvaWQgYWxpYXNpbmcgbWFwcGluZ3MgaW4gdGhlIGhpZ2htZW0gY29kZSAqLworCWttYXBfZmx1c2hfdW51c2VkKCk7CisKIAljcGEudmFkZHIgPSBhZGRyOwogCWNwYS5udW1wYWdlcyA9IG51bXBhZ2VzOwogCWNwYS5tYXNrX3NldCA9IG1hc2tfc2V0OwogCWNwYS5tYXNrX2NsciA9IG1hc2tfY2xyOwotCWNwYS5mbHVzaHRsYiA9IDA7CisJY3BhLmZsYWdzID0gMDsKKwljcGEuY3VycGFnZSA9IDA7CiAJY3BhLmZvcmNlX3NwbGl0ID0gZm9yY2Vfc3BsaXQ7CiAKKwlpZiAoYXJyYXkpCisJCWNwYS5mbGFncyB8PSBDUEFfQVJSQVk7CisKIAkvKiBObyBhbGlhcyBjaGVja2luZyBmb3IgX05YIGJpdCBtb2RpZmljYXRpb25zICovCiAJY2hlY2thbGlhcyA9IChwZ3Byb3RfdmFsKG1hc2tfc2V0KSB8IHBncHJvdF92YWwobWFza19jbHIpKSAhPSBfUEFHRV9OWDsKIApAQCAtNzk3LDcgKzgxMSw3IEBACiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHdlIHJlYWxseSBjaGFuZ2VkIHNvbWV0aGluZzoKIAkgKi8KLQlpZiAoIWNwYS5mbHVzaHRsYikKKwlpZiAoIShjcGEuZmxhZ3MgJiBDUEFfRkxVU0hUTEIpKQogCQlnb3RvIG91dDsKIAogCS8qCkBAIC04MTIsMjcgKzgyNiwzMCBAQAogCSAqIGVycm9yIGNhc2Ugd2UgZmFsbCBiYWNrIHRvIGNwYV9mbHVzaF9hbGwgKHdoaWNoIHVzZXMKIAkgKiB3YmluZHYpOgogCSAqLwotCWlmICghcmV0ICYmIGNwdV9oYXNfY2xmbHVzaCkKLQkJY3BhX2ZsdXNoX3JhbmdlKGFkZHIsIG51bXBhZ2VzLCBjYWNoZSk7Ci0JZWxzZQorCWlmICghcmV0ICYmIGNwdV9oYXNfY2xmbHVzaCkgeworCQlpZiAoY3BhLmZsYWdzICYgQ1BBX0FSUkFZKQorCQkJY3BhX2ZsdXNoX2FycmF5KGFkZHIsIG51bXBhZ2VzLCBjYWNoZSk7CisJCWVsc2UKKwkJCWNwYV9mbHVzaF9yYW5nZSgqYWRkciwgbnVtcGFnZXMsIGNhY2hlKTsKKwl9IGVsc2UKIAkJY3BhX2ZsdXNoX2FsbChjYWNoZSk7CiAKIG91dDoKLQljcGFfZmlsbF9wb29sKE5VTEwpOwotCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9zZXQodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMsCi0JCQkJICAgICAgIHBncHJvdF90IG1hc2spCitzdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX3NldCh1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnVtcGFnZXMsCisJCQkJICAgICAgIHBncHJvdF90IG1hc2ssIGludCBhcnJheSkKIHsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBtYXNrLCBfX3BncHJvdCgwKSwgMCk7CisJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgbWFzaywgX19wZ3Byb3QoMCksIDAsCisJCWFycmF5KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcywKLQkJCQkJIHBncHJvdF90IG1hc2spCitzdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBudW1wYWdlcywKKwkJCQkJIHBncHJvdF90IG1hc2ssIGludCBhcnJheSkKIHsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdCgwKSwgbWFzaywgMCk7CisJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksIG1hc2ssIDAsCisJCWFycmF5KTsKIH0KIAogaW50IF9zZXRfbWVtb3J5X3VjKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQpAQCAtODQwLDggKzg1Nyw4IEBACiAJLyoKIAkgKiBmb3Igbm93IFVDIE1JTlVTLiBzZWUgY29tbWVudHMgaW4gaW9yZW1hcF9ub2NhY2hlKCkKIAkgKi8KLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoYWRkciwgbnVtcGFnZXMsCi0JCQkJICAgIF9fcGdwcm90KF9QQUdFX0NBQ0hFX1VDX01JTlVTKSk7CisJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KCZhZGRyLCBudW1wYWdlcywKKwkJCQkgICAgX19wZ3Byb3QoX1BBR0VfQ0FDSEVfVUNfTUlOVVMpLCAwKTsKIH0KIAogaW50IHNldF9tZW1vcnlfdWModW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCkBAIC04NTcsMTAgKzg3NCw0OCBAQAogfQogRVhQT1JUX1NZTUJPTChzZXRfbWVtb3J5X3VjKTsKIAoraW50IHNldF9tZW1vcnlfYXJyYXlfdWModW5zaWduZWQgbG9uZyAqYWRkciwgaW50IGFkZHJpbmFycmF5KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IGk7CisJLyoKKwkgKiBmb3Igbm93IFVDIE1JTlVTLiBzZWUgY29tbWVudHMgaW4gaW9yZW1hcF9ub2NhY2hlKCkKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRkcmluYXJyYXk7IGkrKykgeworCQlzdGFydCA9IF9fcGEoYWRkcltpXSk7CisJCWZvciAoZW5kID0gc3RhcnQgKyBQQUdFX1NJWkU7IGkgPCBhZGRyaW5hcnJheSAtIDE7IGVuZCArPSBQQUdFX1NJWkUpIHsKKwkJCWlmIChlbmQgIT0gX19wYShhZGRyW2kgKyAxXSkpCisJCQkJYnJlYWs7CisJCQlpKys7CisJCX0KKwkJaWYgKHJlc2VydmVfbWVtdHlwZShzdGFydCwgZW5kLCBfUEFHRV9DQUNIRV9VQ19NSU5VUywgTlVMTCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoYWRkciwgYWRkcmluYXJyYXksCisJCQkJICAgIF9fcGdwcm90KF9QQUdFX0NBQ0hFX1VDX01JTlVTKSwgMSk7CitvdXQ6CisJZm9yIChpID0gMDsgaSA8IGFkZHJpbmFycmF5OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSBfX3BhKGFkZHJbaV0pOworCisJCWlmICh0bXAgPT0gc3RhcnQpCisJCQlicmVhazsKKwkJZm9yIChlbmQgPSB0bXAgKyBQQUdFX1NJWkU7IGkgPCBhZGRyaW5hcnJheSAtIDE7IGVuZCArPSBQQUdFX1NJWkUpIHsKKwkJCWlmIChlbmQgIT0gX19wYShhZGRyW2kgKyAxXSkpCisJCQkJYnJlYWs7CisJCQlpKys7CisJCX0KKwkJZnJlZV9tZW10eXBlKHRtcCwgZW5kKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHNldF9tZW1vcnlfYXJyYXlfdWMpOworCiBpbnQgX3NldF9tZW1vcnlfd2ModW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KGFkZHIsIG51bXBhZ2VzLAotCQkJCSAgICBfX3BncHJvdChfUEFHRV9DQUNIRV9XQykpOworCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmYWRkciwgbnVtcGFnZXMsCisJCQkJICAgIF9fcGdwcm90KF9QQUdFX0NBQ0hFX1dDKSwgMCk7CiB9CiAKIGludCBzZXRfbWVtb3J5X3djKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQpAQCAtODc4LDggKzkzMyw4IEBACiAKIGludCBfc2V0X21lbW9yeV93Yih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIHsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihhZGRyLCBudW1wYWdlcywKLQkJCQkgICAgICBfX3BncHJvdChfUEFHRV9DQUNIRV9NQVNLKSk7CisJcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIoJmFkZHIsIG51bXBhZ2VzLAorCQkJCSAgICAgIF9fcGdwcm90KF9QQUdFX0NBQ0hFX01BU0spLCAwKTsKIH0KIAogaW50IHNldF9tZW1vcnlfd2IodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCkBAIC04OTAsMzcgKzk0NSw1OSBAQAogfQogRVhQT1JUX1NZTUJPTChzZXRfbWVtb3J5X3diKTsKIAoraW50IHNldF9tZW1vcnlfYXJyYXlfd2IodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IGFkZHJpbmFycmF5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkZHJpbmFycmF5OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IF9fcGEoYWRkcltpXSk7CisJCXVuc2lnbmVkIGxvbmcgZW5kOworCisJCWZvciAoZW5kID0gc3RhcnQgKyBQQUdFX1NJWkU7IGkgPCBhZGRyaW5hcnJheSAtIDE7IGVuZCArPSBQQUdFX1NJWkUpIHsKKwkJCWlmIChlbmQgIT0gX19wYShhZGRyW2kgKyAxXSkpCisJCQkJYnJlYWs7CisJCQlpKys7CisJCX0KKwkJZnJlZV9tZW10eXBlKHN0YXJ0LCBlbmQpOworCX0KKwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihhZGRyLCBhZGRyaW5hcnJheSwKKwkJCQkgICAgICBfX3BncHJvdChfUEFHRV9DQUNIRV9NQVNLKSwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNldF9tZW1vcnlfYXJyYXlfd2IpOworCiBpbnQgc2V0X21lbW9yeV94KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogewotCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9OWCkpOworCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKCZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfTlgpLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X21lbW9yeV94KTsKIAogaW50IHNldF9tZW1vcnlfbngodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9OWCkpOworCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX05YKSwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNldF9tZW1vcnlfbngpOwogCiBpbnQgc2V0X21lbW9yeV9ybyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIHsKLQlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcihhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUlcpKTsKKwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcigmYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JXKSwgMCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfbWVtb3J5X3JvKTsKIAogaW50IHNldF9tZW1vcnlfcncodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0KGFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SVykpOworCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX3NldCgmYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1JXKSwgMCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfbWVtb3J5X3J3KTsKIAogaW50IHNldF9tZW1vcnlfbnAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfY2xlYXIoYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpKTsKKwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9jbGVhcigmYWRkciwgbnVtcGFnZXMsIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpLCAwKTsKIH0KIAogaW50IHNldF9tZW1vcnlfNGsodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbnVtcGFnZXMpCiB7Ci0JcmV0dXJuIGNoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksCi0JCQkJCV9fcGdwcm90KDApLCAxKTsKKwlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoMCksCisJCQkJCV9fcGdwcm90KDApLCAxLCAwKTsKIH0KIAogaW50IHNldF9wYWdlc191YyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzKQpAQCAtOTczLDIyICsxMDUwLDM4IEBACiAKIHN0YXRpYyBpbnQgX19zZXRfcGFnZXNfcChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzKQogewotCXN0cnVjdCBjcGFfZGF0YSBjcGEgPSB7IC52YWRkciA9ICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3MocGFnZSksCisJdW5zaWduZWQgbG9uZyB0ZW1wYWRkciA9ICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJc3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gJnRlbXBhZGRyLAogCQkJCS5udW1wYWdlcyA9IG51bXBhZ2VzLAogCQkJCS5tYXNrX3NldCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyksCi0JCQkJLm1hc2tfY2xyID0gX19wZ3Byb3QoMCl9OworCQkJCS5tYXNrX2NsciA9IF9fcGdwcm90KDApLAorCQkJCS5mbGFncyA9IDB9OwogCi0JcmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZjcGEsIDEpOworCS8qCisJICogTm8gYWxpYXMgY2hlY2tpbmcgbmVlZGVkIGZvciBzZXR0aW5nIHByZXNlbnQgZmxhZy4gb3RoZXJ3aXNlLAorCSAqIHdlIG1heSBuZWVkIHRvIGJyZWFrIGxhcmdlIHBhZ2VzIGZvciA2NC1iaXQga2VybmVsIHRleHQKKwkgKiBtYXBwaW5ncyAodGhpcyBhZGRzIHRvIGNvbXBsZXhpdHkgaWYgd2Ugd2FudCB0byBkbyB0aGlzIGZyb20KKwkgKiBhdG9taWMgY29udGV4dCBlc3BlY2lhbGx5KS4gTGV0J3Mga2VlcCBpdCBzaW1wbGUhCisJICovCisJcmV0dXJuIF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKCZjcGEsIDApOwogfQogCiBzdGF0aWMgaW50IF9fc2V0X3BhZ2VzX25wKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMpCiB7Ci0Jc3RydWN0IGNwYV9kYXRhIGNwYSA9IHsgLnZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwl1bnNpZ25lZCBsb25nIHRlbXBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlzdHJ1Y3QgY3BhX2RhdGEgY3BhID0geyAudmFkZHIgPSAmdGVtcGFkZHIsCiAJCQkJLm51bXBhZ2VzID0gbnVtcGFnZXMsCiAJCQkJLm1hc2tfc2V0ID0gX19wZ3Byb3QoMCksCi0JCQkJLm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXKX07CisJCQkJLm1hc2tfY2xyID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXKSwKKwkJCQkuZmxhZ3MgPSAwfTsKIAotCXJldHVybiBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscigmY3BhLCAxKTsKKwkvKgorCSAqIE5vIGFsaWFzIGNoZWNraW5nIG5lZWRlZCBmb3Igc2V0dGluZyBub3QgcHJlc2VudCBmbGFnLiBvdGhlcndpc2UsCisJICogd2UgbWF5IG5lZWQgdG8gYnJlYWsgbGFyZ2UgcGFnZXMgZm9yIDY0LWJpdCBrZXJuZWwgdGV4dAorCSAqIG1hcHBpbmdzICh0aGlzIGFkZHMgdG8gY29tcGxleGl0eSBpZiB3ZSB3YW50IHRvIGRvIHRoaXMgZnJvbQorCSAqIGF0b21pYyBjb250ZXh0IGVzcGVjaWFsbHkpLiBMZXQncyBrZWVwIGl0IHNpbXBsZSEKKwkgKi8KKwlyZXR1cm4gX19jaGFuZ2VfcGFnZV9hdHRyX3NldF9jbHIoJmNwYSwgMCk7CiB9CiAKIHZvaWQga2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKQpAQCAtMTAwOCwxMSArMTEwMSw4IEBACiAKIAkvKgogCSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZCBhcyB0aGUgY2FsbHMgY2Fubm90IGZhaWwuCi0JICogTGFyZ2UgcGFnZXMgYXJlIGtlcHQgZW5hYmxlZCBhdCBib290IHRpbWUsIGFuZCBhcmUKLQkgKiBzcGxpdCB1cCBxdWlja2x5IHdpdGggREVCVUdfUEFHRUFMTE9DLiBJZiBhIHNwbGl0dXAKLQkgKiBmYWlscyBoZXJlIChkdWUgdG8gdGVtcG9yYXJ5IG1lbW9yeSBzaG9ydGFnZSkgbm8gZGFtYWdlCi0JICogaXMgZG9uZSBiZWNhdXNlIHdlIGp1c3Qga2VlcCB0aGUgbGFyZ2VwYWdlIGludGFjdCB1cAotCSAqIHRvIHRoZSBuZXh0IGF0dGVtcHQgd2hlbiBpdCB3aWxsIGxpa2VseSBiZSBzcGxpdCB1cDoKKwkgKiBMYXJnZSBwYWdlcyBmb3IgaWRlbnRpdHkgbWFwcGluZ3MgYXJlIG5vdCB1c2VkIGF0IGJvb3QgdGltZQorCSAqIGFuZCBoZW5jZSBubyBtZW1vcnkgYWxsb2NhdGlvbnMgZHVyaW5nIGxhcmdlIHBhZ2Ugc3BsaXQuCiAJICovCiAJaWYgKGVuYWJsZSkKIAkJX19zZXRfcGFnZXNfcChwYWdlLCBudW1wYWdlcyk7CkBAIC0xMDI0LDUzICsxMTE0LDggQEAKIAkgKiBidXQgdGhhdCBjYW4gZGVhZGxvY2stPmZsdXNoIG9ubHkgY3VycmVudCBjcHU6CiAJICovCiAJX19mbHVzaF90bGJfYWxsKCk7Ci0KLQkvKgotCSAqIFRyeSB0byByZWZpbGwgdGhlIHBhZ2UgcG9vbCBoZXJlLiBXZSBjYW4gZG8gdGhpcyBvbmx5IGFmdGVyCi0JICogdGhlIHRsYiBmbHVzaC4KLQkgKi8KLQljcGFfZmlsbF9wb29sKE5VTEwpOwogfQogCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgaW50IGRwYV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlzZXFfcHV0cyhtLCAiREVCVUdfUEFHRUFMTE9DXG4iKTsKLQlzZXFfcHJpbnRmKG0sICJwb29sX3NpemUgICAgIDogJWx1XG4iLCBwb29sX3NpemUpOwotCXNlcV9wcmludGYobSwgInBvb2xfcGFnZXMgICAgOiAlbHVcbiIsIHBvb2xfcGFnZXMpOwotCXNlcV9wcmludGYobSwgInBvb2xfbG93ICAgICAgOiAlbHVcbiIsIHBvb2xfbG93KTsKLQlzZXFfcHJpbnRmKG0sICJwb29sX3VzZWQgICAgIDogJWx1XG4iLCBwb29sX3VzZWQpOwotCXNlcV9wcmludGYobSwgInBvb2xfZmFpbGVkICAgOiAlbHVcbiIsIHBvb2xfZmFpbGVkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRwYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCBkcGFfc2hvdywgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRwYV9mb3BzID0gewotCS5vcGVuCQk9IGRwYV9vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWJ1Z19wYWdlYWxsb2NfcHJvY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZGU7Ci0KLQlkZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRlYnVnX3BhZ2VhbGxvYyIsIDA2MDAsIE5VTEwsIE5VTEwsCi0JCQkJICZkcGFfZm9wcyk7Ci0JaWYgKCFkZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLV9faW5pdGNhbGwoZGVidWdfcGFnZWFsbG9jX3Byb2NfaW5pdCk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogCiBib29sIGtlcm5lbF9wYWdlX3ByZXNlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQuYyBiL2FyY2gveDg2L21tL3BhdC5jCmluZGV4IDJhNTBlMGYuLjczOGZkMGYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXQuYworKysgYi9hcmNoL3g4Ni9tbS9wYXQuYwpAQCAtNywyNCArNywyNCBAQAogICogTG9vc2VseSBiYXNlZCBvbiBlYXJsaWVyIFBBVCBwYXRjaHNldCBmcm9tIEVyaWMgQmllZGVybWFuIGFuZCBBbmRpIEtsZWVuLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCi0jaW5jbHVkZSA8YXNtL21zci5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhdC5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vZmNudGwuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3BhdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaWZkZWYgQ09ORklHX1g4Nl9QQVQKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogCiBzdGF0aWMgaW50IGRlYnVnX2VuYWJsZTsKKwogc3RhdGljIGludCBfX2luaXQgcGF0X2RlYnVnX3NldHVwKGNoYXIgKnN0cikKIHsKIAlkZWJ1Z19lbmFibGUgPSAxOwpAQCAtMTQ1LDE0ICsxNDYsMTQgQEAKICAqLwogCiBzdHJ1Y3QgbWVtdHlwZSB7Ci0JdTY0IHN0YXJ0OwotCXU2NCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyB0eXBlOwotCXN0cnVjdCBsaXN0X2hlYWQgbmQ7CisJdTY0CQkJc3RhcnQ7CisJdTY0CQkJZW5kOworCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJc3RydWN0IGxpc3RfaGVhZAluZDsKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQobWVtdHlwZV9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWVtdHlwZV9sb2NrKTsgCS8qIHByb3RlY3RzIG1lbXR5cGUgbGlzdCAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhtZW10eXBlX2xvY2spOwkvKiBwcm90ZWN0cyBtZW10eXBlIGxpc3QgKi8KIAogLyoKICAqIERvZXMgaW50ZXJzZWN0aW9uIG9mIFBBVCBtZW1vcnkgdHlwZSBhbmQgTVRSUiBtZW1vcnkgdHlwZSBhbmQgcmV0dXJucwpAQCAtMTgwLDggKzE4MSw4IEBACiAJcmV0dXJuIHJlcV90eXBlOwogfQogCi1zdGF0aWMgaW50IGNoa19jb25mbGljdChzdHJ1Y3QgbWVtdHlwZSAqbmV3LCBzdHJ1Y3QgbWVtdHlwZSAqZW50cnksCi0JCQl1bnNpZ25lZCBsb25nICp0eXBlKQorc3RhdGljIGludAorY2hrX2NvbmZsaWN0KHN0cnVjdCBtZW10eXBlICpuZXcsIHN0cnVjdCBtZW10eXBlICplbnRyeSwgdW5zaWduZWQgbG9uZyAqdHlwZSkKIHsKIAlpZiAobmV3LT50eXBlICE9IGVudHJ5LT50eXBlKSB7CiAJCWlmICh0eXBlKSB7CkBAIC0yMTEsNiArMjEyLDY2IEBACiBzdGF0aWMgdTY0IGNhY2hlZF9zdGFydDsKIAogLyoKKyAqIEZvciBSQU0gcGFnZXMsIG1hcmsgdGhlIHBhZ2VzIGFzIG5vbiBXQiBtZW1vcnkgdHlwZSB1c2luZworICogUGFnZU5vbldCIChQR19hcmNoXzEpLiBXZSBhbGxvdyBvbmx5IG9uZSBzZXRfbWVtb3J5X3VjKCkgb3IKKyAqIHNldF9tZW1vcnlfd2MoKSBvbiBhIFJBTSBwYWdlIGF0IGEgdGltZSBiZWZvcmUgbWFya2luZyBpdCBhcyBXQiBhZ2Fpbi4KKyAqIFRoaXMgaXMgb2ssIGJlY2F1c2Ugb25seSBvbmUgZHJpdmVyIHdpbGwgYmUgb3duaW5nIHRoZSBwYWdlIGFuZAorICogZG9pbmcgc2V0X21lbW9yeV8qKCkgY2FsbHMuCisgKgorICogRm9yIG5vdywgd2UgdXNlIFBhZ2VOb25XQiB0byB0cmFjayB0aGF0IHRoZSBSQU0gcGFnZSBpcyBiZWluZyBtYXBwZWQKKyAqIGFzIG5vbiBXQi4gSW4gZnV0dXJlLCB3ZSB3aWxsIGhhdmUgdG8gdXNlIG9uZSBtb3JlIGZsYWcKKyAqIChvciBzb21lIG90aGVyIG1lY2hhbmlzbSBpbiBwYWdlX3N0cnVjdCkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICogVUMgYW5kIFdDIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgcmVzZXJ2ZV9yYW1fcGFnZXNfdHlwZSh1NjQgc3RhcnQsIHU2NCBlbmQsIHVuc2lnbmVkIGxvbmcgcmVxX3R5cGUsCisJCQkJICB1bnNpZ25lZCBsb25nICpuZXdfdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1NjQgcGZuLCBlbmRfcGZuOworCisJZm9yIChwZm4gPSAoc3RhcnQgPj4gUEFHRV9TSElGVCk7IHBmbiA8IChlbmQgPj4gUEFHRV9TSElGVCk7ICsrcGZuKSB7CisJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQlpZiAocGFnZV9tYXBwZWQocGFnZSkgfHwgUGFnZU5vbldCKHBhZ2UpKQorCQkJZ290byBvdXQ7CisKKwkJU2V0UGFnZU5vbldCKHBhZ2UpOworCX0KKwlyZXR1cm4gMDsKKworb3V0OgorCWVuZF9wZm4gPSBwZm47CisJZm9yIChwZm4gPSAoc3RhcnQgPj4gUEFHRV9TSElGVCk7IHBmbiA8IGVuZF9wZm47ICsrcGZuKSB7CisJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQlDbGVhclBhZ2VOb25XQihwYWdlKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBmcmVlX3JhbV9wYWdlc190eXBlKHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1NjQgcGZuLCBlbmRfcGZuOworCisJZm9yIChwZm4gPSAoc3RhcnQgPj4gUEFHRV9TSElGVCk7IHBmbiA8IChlbmQgPj4gUEFHRV9TSElGVCk7ICsrcGZuKSB7CisJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQlpZiAocGFnZV9tYXBwZWQocGFnZSkgfHwgIVBhZ2VOb25XQihwYWdlKSkKKwkJCWdvdG8gb3V0OworCisJCUNsZWFyUGFnZU5vbldCKHBhZ2UpOworCX0KKwlyZXR1cm4gMDsKKworb3V0OgorCWVuZF9wZm4gPSBwZm47CisJZm9yIChwZm4gPSAoc3RhcnQgPj4gUEFHRV9TSElGVCk7IHBmbiA8IGVuZF9wZm47ICsrcGZuKSB7CisJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQlTZXRQYWdlTm9uV0IocGFnZSk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKgogICogcmVxX3R5cGUgdHlwaWNhbGx5IGhhcyBvbmUgb2YgdGhlOgogICogLSBfUEFHRV9DQUNIRV9XQgogICogLSBfUEFHRV9DQUNIRV9XQwpAQCAtMjI2LDE0ICsyODcsMTUgQEAKICAqIGl0IHdpbGwgcmV0dXJuIGEgbmVnYXRpdmUgcmV0dXJuIHZhbHVlLgogICovCiBpbnQgcmVzZXJ2ZV9tZW10eXBlKHU2NCBzdGFydCwgdTY0IGVuZCwgdW5zaWduZWQgbG9uZyByZXFfdHlwZSwKLQkJCXVuc2lnbmVkIGxvbmcgKm5ld190eXBlKQorCQkgICAgdW5zaWduZWQgbG9uZyAqbmV3X3R5cGUpCiB7CiAJc3RydWN0IG1lbXR5cGUgKm5ldywgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgYWN0dWFsX3R5cGU7CiAJc3RydWN0IGxpc3RfaGVhZCAqd2hlcmU7CisJaW50IGlzX3JhbmdlX3JhbTsKIAlpbnQgZXJyID0gMDsKIAotIAlCVUdfT04oc3RhcnQgPj0gZW5kKTsgLyogZW5kIGlzIGV4Y2x1c2l2ZSAqLworCUJVR19PTihzdGFydCA+PSBlbmQpOyAvKiBlbmQgaXMgZXhjbHVzaXZlICovCiAKIAlpZiAoIXBhdF9lbmFibGVkKSB7CiAJCS8qIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHBhZ2UgdGFibGUgc2V0dGluZyB3aXRob3V0IFBBVCAqLwpAQCAtMjY2LDE3ICszMjgsMjQgQEAKIAkJCWFjdHVhbF90eXBlID0gX1BBR0VfQ0FDSEVfV0I7CiAJCWVsc2UKIAkJCWFjdHVhbF90eXBlID0gX1BBR0VfQ0FDSEVfVUNfTUlOVVM7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJYWN0dWFsX3R5cGUgPSBwYXRfeF9tdHJyX3R5cGUoc3RhcnQsIGVuZCwKIAkJCQkJICAgICAgcmVxX3R5cGUgJiBfUEFHRV9DQUNIRV9NQVNLKTsKKwl9CisKKwlpc19yYW5nZV9yYW0gPSBwYWdlcmFuZ2VfaXNfcmFtKHN0YXJ0LCBlbmQpOworCWlmIChpc19yYW5nZV9yYW0gPT0gMSkKKwkJcmV0dXJuIHJlc2VydmVfcmFtX3BhZ2VzX3R5cGUoc3RhcnQsIGVuZCwgcmVxX3R5cGUsIG5ld190eXBlKTsKKwllbHNlIGlmIChpc19yYW5nZV9yYW0gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5ldyAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtdHlwZSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5ldy0+c3RhcnQgPSBzdGFydDsKLQluZXctPmVuZCA9IGVuZDsKLQluZXctPnR5cGUgPSBhY3R1YWxfdHlwZTsKKwluZXctPnN0YXJ0CT0gc3RhcnQ7CisJbmV3LT5lbmQJPSBlbmQ7CisJbmV3LT50eXBlCT0gYWN0dWFsX3R5cGU7CiAKIAlpZiAobmV3X3R5cGUpCiAJCSpuZXdfdHlwZSA9IGFjdHVhbF90eXBlOwpAQCAtMzM1LDYgKzQwNCw3IEBACiAJCSAgICAgICBzdGFydCwgZW5kLCBjYXR0cl9uYW1lKG5ldy0+dHlwZSksIGNhdHRyX25hbWUocmVxX3R5cGUpKTsKIAkJa2ZyZWUobmV3KTsKIAkJc3Bpbl91bmxvY2soJm1lbXR5cGVfbG9jayk7CisKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTM1OCw2ICs0MjgsNyBAQAogewogCXN0cnVjdCBtZW10eXBlICplbnRyeTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKKwlpbnQgaXNfcmFuZ2VfcmFtOwogCiAJaWYgKCFwYXRfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CkBAIC0zNjYsNiArNDM3LDEyIEBACiAJaWYgKGlzX0lTQV9yYW5nZShzdGFydCwgZW5kIC0gMSkpCiAJCXJldHVybiAwOwogCisJaXNfcmFuZ2VfcmFtID0gcGFnZXJhbmdlX2lzX3JhbShzdGFydCwgZW5kKTsKKwlpZiAoaXNfcmFuZ2VfcmFtID09IDEpCisJCXJldHVybiBmcmVlX3JhbV9wYWdlc190eXBlKHN0YXJ0LCBlbmQpOworCWVsc2UgaWYgKGlzX3JhbmdlX3JhbSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrKCZtZW10eXBlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtZW10eXBlX2xpc3QsIG5kKSB7CiAJCWlmIChlbnRyeS0+c3RhcnQgPT0gc3RhcnQgJiYgZW50cnktPmVuZCA9PSBlbmQpIHsKQEAgLTM4Niw2ICs0NjMsNyBAQAogCX0KIAogCWRwcmludGsoImZyZWVfbWVtdHlwZSByZXF1ZXN0IDB4JUx4LTB4JUx4XG4iLCBzdGFydCwgZW5kKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQ5Miw5ICs1NzAsOSBAQAogCiB2b2lkIG1hcF9kZXZtZW0odW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3Qgdm1hX3Byb3QpCiB7CisJdW5zaWduZWQgbG9uZyB3YW50X2ZsYWdzID0gKHBncHJvdF92YWwodm1hX3Byb3QpICYgX1BBR0VfQ0FDSEVfTUFTSyk7CiAJdTY0IGFkZHIgPSAodTY0KXBmbiA8PCBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB3YW50X2ZsYWdzID0gKHBncHJvdF92YWwodm1hX3Byb3QpICYgX1BBR0VfQ0FDSEVfTUFTSyk7CiAKIAlyZXNlcnZlX21lbXR5cGUoYWRkciwgYWRkciArIHNpemUsIHdhbnRfZmxhZ3MsICZmbGFncyk7CiAJaWYgKGZsYWdzICE9IHdhbnRfZmxhZ3MpIHsKQEAgLTUxNCw3ICs1OTIsNyBAQAogCWZyZWVfbWVtdHlwZShhZGRyLCBhZGRyICsgc2l6ZSk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfWDg2X1BBVCkKIAogLyogZ2V0IE50aCBlbGVtZW50IG9mIHRoZSBsaW5rZWQgbGlzdCAqLwogc3RhdGljIHN0cnVjdCBtZW10eXBlICptZW10eXBlX2dldF9pZHgobG9mZl90IHBvcykKQEAgLTUzNyw2ICs2MTUsNyBAQAogCX0KIAlzcGluX3VubG9jaygmbWVtdHlwZV9sb2NrKTsKIAlrZnJlZShwcmludF9lbnRyeSk7CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNTY3LDYgKzY0Niw3IEBACiAJc2VxX3ByaW50ZihzZXEsICIlcyBAIDB4JUx4LTB4JUx4XG4iLCBjYXR0cl9uYW1lKHByaW50X2VudHJ5LT50eXBlKSwKIAkJCXByaW50X2VudHJ5LT5zdGFydCwgcHJpbnRfZW50cnktPmVuZCk7CiAJa2ZyZWUocHJpbnRfZW50cnkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5OCw0ICs2NzgsNCBAQAogCiBsYXRlX2luaXRjYWxsKHBhdF9tZW10eXBlX2xpc3RfaW5pdCk7CiAKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgJiYgQ09ORklHX1g4Nl9QQVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BndGFibGUuYyBiL2FyY2gveDg2L21tL3BndGFibGUuYwppbmRleCBkNTAzMDI3Li44NmYyZmZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC94ODYvbW0vcGd0YWJsZS5jCkBAIC02MywxMCArNjMsOCBAQAogI2RlZmluZSBVTlNIQVJFRF9QVFJTX1BFUl9QR0QJCQkJXAogCShTSEFSRURfS0VSTkVMX1BNRCA/IEtFUk5FTF9QR0RfQk9VTkRBUlkgOiBQVFJTX1BFUl9QR0QpCiAKLXN0YXRpYyB2b2lkIHBnZF9jdG9yKHZvaWQgKnApCitzdGF0aWMgdm9pZCBwZ2RfY3RvcihwZ2RfdCAqcGdkKQogewotCXBnZF90ICpwZ2QgPSBwOwotCiAJLyogSWYgdGhlIHBnZCBwb2ludHMgdG8gYSBzaGFyZWQgcGFnZXRhYmxlIGxldmVsIChlaXRoZXIgdGhlCiAJICAgcHRlcyBpbiBub24tUEFFLCBvciBzaGFyZWQgUE1EIGluIFBBRSksIHRoZW4ganVzdCBjb3B5IHRoZQogCSAgIHJlZmVyZW5jZXMgZnJvbSBzd2FwcGVyX3BnX2Rpci4gKi8KQEAgLTg3LDcgKzg1LDcgQEAKIAkJcGdkX2xpc3RfYWRkKHBnZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBnZF9kdG9yKHZvaWQgKnBnZCkKK3N0YXRpYyB2b2lkIHBnZF9kdG9yKHBnZF90ICpwZ2QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsgLyogY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BndGFibGVfMzIuYyBiL2FyY2gveDg2L21tL3BndGFibGVfMzIuYwppbmRleCBjYWIwYWJiLi4wOTUxZGI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vcGd0YWJsZV8zMi5jCkBAIC0xMjMsNyArMTIzLDggQEAKIAlpZiAoIWFyZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlfX1ZNQUxMT0NfUkVTRVJWRSA9IG1lbXBhcnNlKGFyZywgJmFyZyk7CisJLyogQWRkIFZNQUxMT0NfT0ZGU0VUIHRvIHRoZSBwYXJzZWQgdmFsdWUgZHVlIHRvIHZtIGFyZWEgZ3VhcmQgaG9sZSovCisJX19WTUFMTE9DX1JFU0VSVkUgPSBtZW1wYXJzZShhcmcsICZhcmcpICsgVk1BTExPQ19PRkZTRVQ7CiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgidm1hbGxvYyIsIHBhcnNlX3ZtYWxsb2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vc3JhdF82NC5jIGIvYXJjaC94ODYvbW0vc3JhdF82NC5jCmluZGV4IDFiNDc2M2UuLjUxYzBhMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3NyYXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGlzX3V2X3N5c3RlbSgpKQorCWlmIChnZXRfdXZfc3lzdGVtX3R5cGUoKSA+PSBVVl9YMkFQSUMpCiAJCWFwaWNfaWQgPSAocGEtPmFwaWNfaWQgPDwgOCkgfCBwYS0+bG9jYWxfc2FwaWNfZWlkOwogCWVsc2UKIAkJYXBpY19pZCA9IHBhLT5hcGljX2lkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCAzMGYzZWIzLi40NDY5MDJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtNyw2ICs3LDYgQEAKIAkJdGltZXJfaW50Lm8gKQogCiBvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIGluaXQubyBiYWNrdHJhY2Uubwotb3Byb2ZpbGUtJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpIAkrPSBubWlfaW50Lm8gb3BfbW9kZWxfYXRobG9uLm8gXAorb3Byb2ZpbGUtJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpIAkrPSBubWlfaW50Lm8gb3BfbW9kZWxfYW1kLm8gXAogCQkJCQkgICBvcF9tb2RlbF9wcHJvLm8gb3BfbW9kZWxfcDQubwogb3Byb2ZpbGUtJChDT05GSUdfWDg2X0lPX0FQSUMpCQkrPSBubWlfdGltZXJfaW50Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwppbmRleCAwMjI3Njk0Li41N2Y2YzkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCkBAIC0xLDEwICsxLDExIEBACiAvKioKICAqIEBmaWxlIG5taV9pbnQuYwogICoKLSAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMi0yMDA4IE9Qcm9maWxlIGF1dGhvcnMKICAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCiAgKgogICogQGF1dGhvciBKb2huIExldm9uIDxsZXZvbkBtb3ZlbWVudGFyaWFuLm9yZz4KKyAqIEBhdXRob3IgUm9iZXJ0IFJpY2h0ZXIgPHJvYmVydC5yaWNodGVyQGFtZC5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI5NSwxMCArMjk2LDEyIEBACiAKIHN0YXRpYyB2b2lkIG5taV9zaHV0ZG93bih2b2lkKQogewotCXN0cnVjdCBvcF9tc3JzICptc3JzID0gJmdldF9jcHVfdmFyKGNwdV9tc3JzKTsKKwlzdHJ1Y3Qgb3BfbXNycyAqbXNyczsKKwogCW5taV9lbmFibGVkID0gMDsKIAlvbl9lYWNoX2NwdShubWlfY3B1X3NodXRkb3duLCBOVUxMLCAxKTsKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcHJvZmlsZV9leGNlcHRpb25zX25iKTsKKwltc3JzID0gJmdldF9jcHVfdmFyKGNwdV9tc3JzKTsKIAltb2RlbC0+c2h1dGRvd24obXNycyk7CiAJZnJlZV9tc3JzKCk7CiAJcHV0X2NwdV92YXIoY3B1X21zcnMpOwpAQCAtNDM3LDYgKzQ0MCw3IEBACiAJX191OCB2ZW5kb3IgPSBib290X2NwdV9kYXRhLng4Nl92ZW5kb3I7CiAJX191OCBmYW1pbHkgPSBib290X2NwdV9kYXRhLng4NjsKIAljaGFyICpjcHVfdHlwZTsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghY3B1X2hhc19hcGljKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ0OSwxOSArNDUzLDIzIEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJY2FzZSA2OgotCQkJbW9kZWwgPSAmb3BfYXRobG9uX3NwZWM7CisJCQltb2RlbCA9ICZvcF9hbWRfc3BlYzsKIAkJCWNwdV90eXBlID0gImkzODYvYXRobG9uIjsKIAkJCWJyZWFrOwogCQljYXNlIDB4ZjoKLQkJCW1vZGVsID0gJm9wX2F0aGxvbl9zcGVjOworCQkJbW9kZWwgPSAmb3BfYW1kX3NwZWM7CiAJCQkvKiBBY3R1YWxseSBpdCBjb3VsZCBiZSBpMzg2L2hhbW1lciB0b28sIGJ1dCBnaXZlCiAJCQkgdXNlciBzcGFjZSBhbiBjb25zaXN0ZW50IG5hbWUuICovCiAJCQljcHVfdHlwZSA9ICJ4ODYtNjQvaGFtbWVyIjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA6Ci0JCQltb2RlbCA9ICZvcF9hdGhsb25fc3BlYzsKKwkJCW1vZGVsID0gJm9wX2FtZF9zcGVjOwogCQkJY3B1X3R5cGUgPSAieDg2LTY0L2ZhbWlseTEwIjsKIAkJCWJyZWFrOworCQljYXNlIDB4MTE6CisJCQltb2RlbCA9ICZvcF9hbWRfc3BlYzsKKwkJCWNwdV90eXBlID0gIng4Ni02NC9mYW1pbHkxMWgiOworCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTQ4OCwxNyArNDk2LDI0IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWluaXRfc3lzZnMoKTsKICNpZmRlZiBDT05GSUdfU01QCiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbmIpOwogI2VuZGlmCi0JdXNpbmdfbm1pID0gMTsKKwkvKiBkZWZhdWx0IHZhbHVlcywgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IG1vZGVsICovCiAJb3BzLT5jcmVhdGVfZmlsZXMgPSBubWlfY3JlYXRlX2ZpbGVzOwogCW9wcy0+c2V0dXAgPSBubWlfc2V0dXA7CiAJb3BzLT5zaHV0ZG93biA9IG5taV9zaHV0ZG93bjsKIAlvcHMtPnN0YXJ0ID0gbm1pX3N0YXJ0OwogCW9wcy0+c3RvcCA9IG5taV9zdG9wOwogCW9wcy0+Y3B1X3R5cGUgPSBjcHVfdHlwZTsKKworCWlmIChtb2RlbC0+aW5pdCkKKwkJcmV0ID0gbW9kZWwtPmluaXQob3BzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW5pdF9zeXNmcygpOworCXVzaW5nX25taSA9IDE7CiAJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nIE5NSSBpbnRlcnJ1cHQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxMSw0ICs1MjYsNiBAQAogCQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25iKTsKICNlbmRpZgogCX0KKwlpZiAobW9kZWwtPmV4aXQpCisJCW1vZGVsLT5leGl0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmFmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYwpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIEBmaWxlIG9wX21vZGVsX2FtZC5jCisgKiBhdGhsb24gLyBLNyAvIEs4IC8gRmFtaWx5IDEwaCBtb2RlbC1zcGVjaWZpYyBNU1Igb3BlcmF0aW9ucworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDItMjAwOCBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbgorICogQGF1dGhvciBQaGlsaXBwZSBFbGllCisgKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKKyAqIEBhdXRob3IgUm9iZXJ0IFJpY2h0ZXIgPHJvYmVydC5yaWNodGVyQGFtZC5jb20+CisgKiBAYXV0aG9yIEJhcnJ5IEthc2luZG9yZgorKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKworI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgorI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKKworI2RlZmluZSBOVU1fQ09VTlRFUlMgNAorI2RlZmluZSBOVU1fQ09OVFJPTFMgNAorCisjZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyID8gMSA6IDApCisjZGVmaW5lIENUUl9SRUFEKGwsIGgsIG1zcnMsIGMpIGRvIHtyZG1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIChsKSwgKGgpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX1dSSVRFKGwsIG1zcnMsIGMpIGRvIHt3cm1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIC0odW5zaWduZWQgaW50KShsKSwgLTEpOyB9IHdoaWxlICgwKQorI2RlZmluZSBDVFJfT1ZFUkZMT1dFRChuKSAoISgobikgJiAoMVU8PDMxKSkpCisKKyNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCisjZGVmaW5lIENUUkxfUkVBRChsLCBoLCBtc3JzLCBjKSBkbyB7cmRtc3IobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyLCAobCksIChoKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIENUUkxfV1JJVEUobCwgaCwgbXNycywgYykgZG8ge3dybXNyKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciwgKGwpLCAoaCkpOyB9IHdoaWxlICgwKQorI2RlZmluZSBDVFJMX1NFVF9BQ1RJVkUobikgKG4gfD0gKDE8PDIyKSkKKyNkZWZpbmUgQ1RSTF9TRVRfSU5BQ1RJVkUobikgKG4gJj0gfigxPDwyMikpCisjZGVmaW5lIENUUkxfQ0xFQVJfTE8oeCkgKHggJj0gKDE8PDIxKSkKKyNkZWZpbmUgQ1RSTF9DTEVBUl9ISSh4KSAoeCAmPSAweGZmZmZmY2YwKQorI2RlZmluZSBDVFJMX1NFVF9FTkFCTEUodmFsKSAodmFsIHw9IDE8PDIwKQorI2RlZmluZSBDVFJMX1NFVF9VU1IodmFsLCB1KSAodmFsIHw9ICgodSAmIDEpIDw8IDE2KSkKKyNkZWZpbmUgQ1RSTF9TRVRfS0VSTih2YWwsIGspICh2YWwgfD0gKChrICYgMSkgPDwgMTcpKQorI2RlZmluZSBDVFJMX1NFVF9VTSh2YWwsIG0pICh2YWwgfD0gKG0gPDwgOCkpCisjZGVmaW5lIENUUkxfU0VUX0VWRU5UX0xPVyh2YWwsIGUpICh2YWwgfD0gKGUgJiAweGZmKSkKKyNkZWZpbmUgQ1RSTF9TRVRfRVZFTlRfSElHSCh2YWwsIGUpICh2YWwgfD0gKChlID4+IDgpICYgMHhmKSkKKyNkZWZpbmUgQ1RSTF9TRVRfSE9TVF9PTkxZKHZhbCwgaCkgKHZhbCB8PSAoKGggJiAxKSA8PCA5KSkKKyNkZWZpbmUgQ1RSTF9TRVRfR1VFU1RfT05MWSh2YWwsIGgpICh2YWwgfD0gKChoICYgMSkgPDwgOCkpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X3ZhbHVlW05VTV9DT1VOVEVSU107CisKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCisKKy8qIElic0ZldGNoQ3RsIGJpdHMvbWFza3MgKi8KKyNkZWZpbmUgSUJTX0ZFVENIX0hJR0hfVkFMSURfQklUCSgxVUwgPDwgMTcpCS8qIGJpdCA0OSAqLworI2RlZmluZSBJQlNfRkVUQ0hfSElHSF9FTkFCTEUJCSgxVUwgPDwgMTYpCS8qIGJpdCA0OCAqLworI2RlZmluZSBJQlNfRkVUQ0hfTE9XX01BWF9DTlRfTUFTSwkweDAwMDBGRkZGVUwJLyogTWF4Q250IG1hc2sgKi8KKworLypJYnNPcEN0bCBiaXRzICovCisjZGVmaW5lIElCU19PUF9MT1dfVkFMSURfQklUCQkoMVVMTDw8MTgpCS8qIGJpdCAxOCAqLworI2RlZmluZSBJQlNfT1BfTE9XX0VOQUJMRQkJKDFVTEw8PDE3KQkvKiBiaXQgMTcgKi8KKworLyogQ29kZXMgdXNlZCBpbiBjcHVfYnVmZmVyLmMgKi8KKy8qIFRoaXMgcHJvZHVjZXMgZHVwbGljYXRlIGNvZGUsIG5lZWQgdG8gYmUgZml4ZWQgKi8KKyNkZWZpbmUgSUJTX0ZFVENIX0JFR0lOIDMKKyNkZWZpbmUgSUJTX09QX0JFR0lOICAgIDQKKworLyogVGhlIGZ1bmN0aW9uIGludGVyZmFjZSBuZWVkcyB0byBiZSBmaXhlZCwgc29tZXRoaW5nIGxpa2UgYWRkCisgICBkYXRhLiBTaG91bGQgdGhlbiBiZSBhZGRlZCB0byBsaW51eC9vcHJvZmlsZS5oLiAqLworZXh0ZXJuIHZvaWQgb3Byb2ZpbGVfYWRkX2lic19zYW1wbGUoc3RydWN0IHB0X3JlZ3MgKmNvbnN0IHJlZ3MsCisJCQkJICAgIHVuc2lnbmVkIGludCAqIGNvbnN0IGlic19zYW1wbGUsIHU4IGNvZGUpOworCitzdHJ1Y3QgaWJzX2ZldGNoX3NhbXBsZSB7CisJLyogTVNSQzAwMV8xMDMxIElCUyBGZXRjaCBMaW5lYXIgQWRkcmVzcyBSZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBpYnNfZmV0Y2hfbGluX2FkZHJfbG93OworCXVuc2lnbmVkIGludCBpYnNfZmV0Y2hfbGluX2FkZHJfaGlnaDsKKwkvKiBNU1JDMDAxXzEwMzAgSUJTIEZldGNoIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaWJzX2ZldGNoX2N0bF9sb3c7CisJdW5zaWduZWQgaW50IGlic19mZXRjaF9jdGxfaGlnaDsKKwkvKiBNU1JDMDAxXzEwMzIgSUJTIEZldGNoIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaWJzX2ZldGNoX3BoeXNfYWRkcl9sb3c7CisJdW5zaWduZWQgaW50IGlic19mZXRjaF9waHlzX2FkZHJfaGlnaDsKK307CisKK3N0cnVjdCBpYnNfb3Bfc2FtcGxlIHsKKwkvKiBNU1JDMDAxXzEwMzQgSUJTIE9wIExvZ2ljYWwgQWRkcmVzcyBSZWdpc3RlciAoSWJzUklQKSAqLworCXVuc2lnbmVkIGludCBpYnNfb3BfcmlwX2xvdzsKKwl1bnNpZ25lZCBpbnQgaWJzX29wX3JpcF9oaWdoOworCS8qIE1TUkMwMDFfMTAzNSBJQlMgT3AgRGF0YSBSZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTFfbG93OworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTFfaGlnaDsKKwkvKiBNU1JDMDAxXzEwMzYgSUJTIE9wIERhdGEgMiBSZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTJfbG93OworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTJfaGlnaDsKKwkvKiBNU1JDMDAxXzEwMzcgSUJTIE9wIERhdGEgMyBSZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTNfbG93OworCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTNfaGlnaDsKKwkvKiBNU1JDMDAxXzEwMzggSUJTIERDIExpbmVhciBBZGRyZXNzIFJlZ2lzdGVyIChJYnNEY0xpbkFkKSAqLworCXVuc2lnbmVkIGludCBpYnNfZGNfbGluZWFyX2xvdzsKKwl1bnNpZ25lZCBpbnQgaWJzX2RjX2xpbmVhcl9oaWdoOworCS8qIE1TUkMwMDFfMTAzOSBJQlMgREMgUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAoSWJzRGNQaHlzQWQpICovCisJdW5zaWduZWQgaW50IGlic19kY19waHlzX2xvdzsKKwl1bnNpZ25lZCBpbnQgaWJzX2RjX3BoeXNfaGlnaDsKK307CisKKy8qCisgKiB1bml0aWFsaXplIHRoZSBBUElDIGZvciB0aGUgSUJTIGludGVycnVwdHMgaWYgbmVlZGVkIG9uIEFNRCBGYW1pbHkxMGgrCisqLworc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKTsKKworc3RhdGljIGludCBpYnNfYWxsb3dlZDsJLyogQU1EIEZhbWlseTEwaCBhbmQgbGF0ZXIgKi8KKworc3RydWN0IG9wX2lic19jb25maWcgeworCXVuc2lnbmVkIGxvbmcgb3BfZW5hYmxlZDsKKwl1bnNpZ25lZCBsb25nIGZldGNoX2VuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBtYXhfY250X2ZldGNoOworCXVuc2lnbmVkIGxvbmcgbWF4X2NudF9vcDsKKwl1bnNpZ25lZCBsb25nIHJhbmRfZW47CisJdW5zaWduZWQgbG9uZyBkaXNwYXRjaGVkX29wczsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3BfaWJzX2NvbmZpZyBpYnNfY29uZmlnOworCisjZW5kaWYKKworLyogZnVuY3Rpb25zIGZvciBvcF9hbWRfc3BlYyAqLworCitzdGF0aWMgdm9pZCBvcF9hbWRfZmlsbF9pbl9hZGRyZXNzZXMoc3RydWN0IG9wX21zcnMgKiBjb25zdCBtc3JzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChyZXNlcnZlX3BlcmZjdHJfbm1pKE1TUl9LN19QRVJGQ1RSMCArIGkpKQorCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IE1TUl9LN19QRVJGQ1RSMCArIGk7CisJCWVsc2UKKwkJCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09OVFJPTFM7IGkrKykgeworCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShNU1JfSzdfRVZOVFNFTDAgKyBpKSkKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBNU1JfSzdfRVZOVFNFTDAgKyBpOworCQllbHNlCisJCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gMDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgb3BfYW1kX3NldHVwX2N0cnMoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisKKwkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT05UUk9MUzsgKytpKSB7CisJCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkpCisJCQljb250aW51ZTsKKwkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCUNUUkxfQ0xFQVJfTE8obG93KTsKKwkJQ1RSTF9DTEVBUl9ISShoaWdoKTsKKwkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCX0KKworCS8qIGF2b2lkIGEgZmFsc2UgZGV0ZWN0aW9uIG9mIGN0ciBvdmVyZmxvd3MgaW4gTk1JIGhhbmRsZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJaWYgKHVubGlrZWx5KCFDVFJfSVNfUkVTRVJWRUQobXNycywgaSkpKQorCQkJY29udGludWU7CisJCUNUUl9XUklURSgxLCBtc3JzLCBpKTsKKwl9CisKKwkvKiBlbmFibGUgYWN0aXZlIGNvdW50ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CisJCWlmICgoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgJiYgKENUUl9JU19SRVNFUlZFRChtc3JzLCBpKSkpIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CisKKwkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgbXNycywgaSk7CisKKwkJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQkJQ1RSTF9DTEVBUl9MTyhsb3cpOworCQkJQ1RSTF9DTEVBUl9ISShoaWdoKTsKKwkJCUNUUkxfU0VUX0VOQUJMRShsb3cpOworCQkJQ1RSTF9TRVRfVVNSKGxvdywgY291bnRlcl9jb25maWdbaV0udXNlcik7CisJCQlDVFJMX1NFVF9LRVJOKGxvdywgY291bnRlcl9jb25maWdbaV0ua2VybmVsKTsKKwkJCUNUUkxfU0VUX1VNKGxvdywgY291bnRlcl9jb25maWdbaV0udW5pdF9tYXNrKTsKKwkJCUNUUkxfU0VUX0VWRU5UX0xPVyhsb3csIGNvdW50ZXJfY29uZmlnW2ldLmV2ZW50KTsKKwkJCUNUUkxfU0VUX0VWRU5UX0hJR0goaGlnaCwgY291bnRlcl9jb25maWdbaV0uZXZlbnQpOworCQkJQ1RSTF9TRVRfSE9TVF9PTkxZKGhpZ2gsIDApOworCQkJQ1RSTF9TRVRfR1VFU1RfT05MWShoaWdoLCAwKTsKKworCQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQl9IGVsc2UgeworCQkJcmVzZXRfdmFsdWVbaV0gPSAwOworCQl9CisJfQorfQorCisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUworCitzdGF0aWMgaW5saW5lIGludAorb3BfYW1kX2hhbmRsZV9pYnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXN0cnVjdCBpYnNfZmV0Y2hfc2FtcGxlIGlic19mZXRjaDsKKwlzdHJ1Y3QgaWJzX29wX3NhbXBsZSBpYnNfb3A7CisKKwlpZiAoIWlic19hbGxvd2VkKQorCQlyZXR1cm4gMTsKKworCWlmIChpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpIHsKKwkJcmRtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmIElCU19GRVRDSF9ISUdIX1ZBTElEX0JJVCkgeworCQkJaWJzX2ZldGNoLmlic19mZXRjaF9jdGxfaGlnaCA9IGhpZ2g7CisJCQlpYnNfZmV0Y2guaWJzX2ZldGNoX2N0bF9sb3cgPSBsb3c7CisJCQlyZG1zcihNU1JfQU1ENjRfSUJTRkVUQ0hMSU5BRCwgbG93LCBoaWdoKTsKKwkJCWlic19mZXRjaC5pYnNfZmV0Y2hfbGluX2FkZHJfaGlnaCA9IGhpZ2g7CisJCQlpYnNfZmV0Y2guaWJzX2ZldGNoX2xpbl9hZGRyX2xvdyA9IGxvdzsKKwkJCXJkbXNyKE1TUl9BTUQ2NF9JQlNGRVRDSFBIWVNBRCwgbG93LCBoaWdoKTsKKwkJCWlic19mZXRjaC5pYnNfZmV0Y2hfcGh5c19hZGRyX2hpZ2ggPSBoaWdoOworCQkJaWJzX2ZldGNoLmlic19mZXRjaF9waHlzX2FkZHJfbG93ID0gbG93OworCisJCQlvcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShyZWdzLAorCQkJCQkJKHVuc2lnbmVkIGludCAqKSZpYnNfZmV0Y2gsCisJCQkJCQlJQlNfRkVUQ0hfQkVHSU4pOworCisJCQkvKnJlZW5hYmxlIHRoZSBJUlEgKi8KKwkJCXJkbXNyKE1TUl9BTUQ2NF9JQlNGRVRDSENUTCwgbG93LCBoaWdoKTsKKwkJCWhpZ2ggJj0gfklCU19GRVRDSF9ISUdIX1ZBTElEX0JJVDsKKwkJCWhpZ2ggfD0gSUJTX0ZFVENIX0hJR0hfRU5BQkxFOworCQkJbG93ICY9IElCU19GRVRDSF9MT1dfTUFYX0NOVF9NQVNLOworCQkJd3Jtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOworCQl9CisJfQorCisJaWYgKGlic19jb25maWcub3BfZW5hYmxlZCkgeworCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BDVEwsIGxvdywgaGlnaCk7CisJCWlmIChsb3cgJiBJQlNfT1BfTE9XX1ZBTElEX0JJVCkgeworCQkJcmRtc3IoTVNSX0FNRDY0X0lCU09QUklQLCBsb3csIGhpZ2gpOworCQkJaWJzX29wLmlic19vcF9yaXBfbG93ID0gbG93OworCQkJaWJzX29wLmlic19vcF9yaXBfaGlnaCA9IGhpZ2g7CisJCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BEQVRBLCBsb3csIGhpZ2gpOworCQkJaWJzX29wLmlic19vcF9kYXRhMV9sb3cgPSBsb3c7CisJCQlpYnNfb3AuaWJzX29wX2RhdGExX2hpZ2ggPSBoaWdoOworCQkJcmRtc3IoTVNSX0FNRDY0X0lCU09QREFUQTIsIGxvdywgaGlnaCk7CisJCQlpYnNfb3AuaWJzX29wX2RhdGEyX2xvdyA9IGxvdzsKKwkJCWlic19vcC5pYnNfb3BfZGF0YTJfaGlnaCA9IGhpZ2g7CisJCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BEQVRBMywgbG93LCBoaWdoKTsKKwkJCWlic19vcC5pYnNfb3BfZGF0YTNfbG93ID0gbG93OworCQkJaWJzX29wLmlic19vcF9kYXRhM19oaWdoID0gaGlnaDsKKwkJCXJkbXNyKE1TUl9BTUQ2NF9JQlNEQ0xJTkFELCBsb3csIGhpZ2gpOworCQkJaWJzX29wLmlic19kY19saW5lYXJfbG93ID0gbG93OworCQkJaWJzX29wLmlic19kY19saW5lYXJfaGlnaCA9IGhpZ2g7CisJCQlyZG1zcihNU1JfQU1ENjRfSUJTRENQSFlTQUQsIGxvdywgaGlnaCk7CisJCQlpYnNfb3AuaWJzX2RjX3BoeXNfbG93ID0gbG93OworCQkJaWJzX29wLmlic19kY19waHlzX2hpZ2ggPSBoaWdoOworCisJCQkvKiByZWVuYWJsZSB0aGUgSVJRICovCisJCQlvcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShyZWdzLAorCQkJCQkJKHVuc2lnbmVkIGludCAqKSZpYnNfb3AsCisJCQkJCQlJQlNfT1BfQkVHSU4pOworCQkJcmRtc3IoTVNSX0FNRDY0X0lCU09QQ1RMLCBsb3csIGhpZ2gpOworCQkJaGlnaCA9IDA7CisJCQlsb3cgJj0gfklCU19PUF9MT1dfVkFMSURfQklUOworCQkJbG93IHw9IElCU19PUF9MT1dfRU5BQkxFOworCQkJd3Jtc3IoTVNSX0FNRDY0X0lCU09QQ1RMLCBsb3csIGhpZ2gpOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IG9wX2FtZF9jaGVja19jdHJzKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCSAgICAgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CisJCWlmICghcmVzZXRfdmFsdWVbaV0pCisJCQljb250aW51ZTsKKwkJQ1RSX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJaWYgKENUUl9PVkVSRkxPV0VEKGxvdykpIHsKKwkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7CisJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIG1zcnMsIGkpOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUworCW9wX2FtZF9oYW5kbGVfaWJzKHJlZ3MsIG1zcnMpOworI2VuZGlmCisKKwkvKiBTZWUgb3BfbW9kZWxfcHByby5jICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG9wX2FtZF9zdGFydChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUyA7ICsraSkgeworCQlpZiAocmVzZXRfdmFsdWVbaV0pIHsKKwkJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQkJQ1RSTF9TRVRfQUNUSVZFKGxvdyk7CisJCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCisJaWYgKGlic19hbGxvd2VkICYmIGlic19jb25maWcuZmV0Y2hfZW5hYmxlZCkgeworCQlsb3cgPSAoaWJzX2NvbmZpZy5tYXhfY250X2ZldGNoID4+IDQpICYgMHhGRkZGOworCQloaWdoID0gSUJTX0ZFVENIX0hJR0hfRU5BQkxFOworCQl3cm1zcihNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGxvdywgaGlnaCk7CisJfQorCisJaWYgKGlic19hbGxvd2VkICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgeworCQlsb3cgPSAoKGlic19jb25maWcubWF4X2NudF9vcCA+PiA0KSAmIDB4RkZGRikgKyBJQlNfT1BfTE9XX0VOQUJMRTsKKwkJaGlnaCA9IDA7CisJCXdybXNyKE1TUl9BTUQ2NF9JQlNPUENUTCwgbG93LCBoaWdoKTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBvcF9hbWRfc3RvcChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwlpbnQgaTsKKworCS8qIFN1YnRsZTogc3RvcCBvbiBhbGwgY291bnRlcnMgdG8gYXZvaWQgcmFjZSB3aXRoCisJICogc2V0dGluZyBvdXIgcG0gY2FsbGJhY2sgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUyA7ICsraSkgeworCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQorCQkJY29udGludWU7CisJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlDVFJMX1NFVF9JTkFDVElWRShsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJfQorCisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUworCWlmIChpYnNfYWxsb3dlZCAmJiBpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpIHsKKwkJbG93ID0gMDsJCS8qIGNsZWFyIG1heCBjb3VudCBhbmQgZW5hYmxlICovCisJCWhpZ2ggPSAwOworCQl3cm1zcihNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGxvdywgaGlnaCk7CisJfQorCisJaWYgKGlic19hbGxvd2VkICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgeworCQlsb3cgPSAwOwkJLyogY2xlYXIgbWF4IGNvdW50IGFuZCBlbmFibGUgKi8KKwkJaGlnaCA9IDA7CisJCXdybXNyKE1TUl9BTUQ2NF9JQlNPUENUTCwgbG93LCBoaWdoKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgb3BfYW1kX3NodXRkb3duKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7CisJCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycywgaSkpCisJCQlyZWxlYXNlX3BlcmZjdHJfbm1pKE1TUl9LN19QRVJGQ1RSMCArIGkpOworCX0KKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT05UUk9MUyA7ICsraSkgeworCQlpZiAoQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkKKwkJCXJlbGVhc2VfZXZudHNlbF9ubWkoTVNSX0s3X0VWTlRTRUwwICsgaSk7CisJfQorfQorCisjaWZuZGVmIENPTkZJR19PUFJPRklMRV9JQlMKKworLyogbm8gSUJTIHN1cHBvcnQgKi8KKworc3RhdGljIGludCBvcF9hbWRfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvcF9hbWRfZXhpdCh2b2lkKSB7fQorCisjZWxzZQorCitzdGF0aWMgdTggaWJzX2VpbHZ0X29mZjsKKworc3RhdGljIGlubGluZSB2b2lkIGFwaWNfaW5pdF9pYnNfbm1pX3Blcl9jcHUodm9pZCAqYXJnKQoreworCWlic19laWx2dF9vZmYgPSBzZXR1cF9BUElDX2VpbHZ0X2licygwLCBBUElDX0VJTFZUX01TR19OTUksIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXBpY19jbGVhcl9pYnNfbm1pX3Blcl9jcHUodm9pZCAqYXJnKQoreworCXNldHVwX0FQSUNfZWlsdnRfaWJzKDAsIEFQSUNfRUlMVlRfTVNHX0ZJWCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgcGZtX2FtZDY0X3NldHVwX2VpbHZ0KHZvaWQpCit7CisjZGVmaW5lIElCU0NUTF9MVlRPRkZTRVRWQUwJCSgxIDw8IDgpCisjZGVmaW5lIElCU0NUTAkJCQkweDFjYworCXN0cnVjdCBwY2lfZGV2ICpjcHVfY2ZnOworCWludCBub2RlczsKKwl1MzIgdmFsdWUgPSAwOworCisJLyogcGVyIENQVSBzZXR1cCAqLworCW9uX2VhY2hfY3B1KGFwaWNfaW5pdF9pYnNfbm1pX3Blcl9jcHUsIE5VTEwsIDEpOworCisJbm9kZXMgPSAwOworCWNwdV9jZmcgPSBOVUxMOworCWRvIHsKKwkJY3B1X2NmZyA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELAorCQkJCQkgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX01JU0MsCisJCQkJCSBjcHVfY2ZnKTsKKwkJaWYgKCFjcHVfY2ZnKQorCQkJYnJlYWs7CisJCSsrbm9kZXM7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY3B1X2NmZywgSUJTQ1RMLCBpYnNfZWlsdnRfb2ZmCisJCQkJICAgICAgIHwgSUJTQ1RMX0xWVE9GRlNFVFZBTCk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjcHVfY2ZnLCBJQlNDVEwsICZ2YWx1ZSk7CisJCWlmICh2YWx1ZSAhPSAoaWJzX2VpbHZ0X29mZiB8IElCU0NUTF9MVlRPRkZTRVRWQUwpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIHNldHVwIElCUyBMVlQgb2Zmc2V0LCAiCisJCQkJIklCU0NUTCA9IDB4JTA4eCIsIHZhbHVlKTsKKwkJCXJldHVybiAxOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoIW5vZGVzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJObyBDUFUgbm9kZSBjb25maWd1cmVkIGZvciBJQlMiKTsKKwkJcmV0dXJuIDE7CisJfQorCisjaWZkZWYgQ09ORklHX05VTUEKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwkvKiBXb3JrcyBvbmx5IGZvciA2NGJpdCB3aXRoIHByb3BlciBudW1hIGltcGxlbWVudGF0aW9uLiAqLworCWlmIChub2RlcyAhPSBudW1fcG9zc2libGVfbm9kZXMoKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIHNldHVwIENQVSBub2RlKHMpIGZvciBJQlMsICIKKwkJCSJmb3VuZDogJWQsIGV4cGVjdGVkICVkIiwKKwkJCW5vZGVzLCBudW1fcG9zc2libGVfbm9kZXMoKSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGl6ZSB0aGUgQVBJQyBmb3IgdGhlIElCUyBpbnRlcnJ1cHRzCisgKiBpZiBhdmFpbGFibGUgKEFNRCBGYW1pbHkxMGggcmV2IEIwIGFuZCBsYXRlcikKKyAqLworc3RhdGljIHZvaWQgc2V0dXBfaWJzKHZvaWQpCit7CisJaWJzX2FsbG93ZWQgPSBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSUJTKTsKKworCWlmICghaWJzX2FsbG93ZWQpCisJCXJldHVybjsKKworCWlmIChwZm1fYW1kNjRfc2V0dXBfZWlsdnQoKSkgeworCQlpYnNfYWxsb3dlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogQU1EIElCUyBkZXRlY3RlZFxuIik7Cit9CisKKworLyoKKyAqIHVuaXRpYWxpemUgdGhlIEFQSUMgZm9yIHRoZSBJQlMgaW50ZXJydXB0cyBpZiBuZWVkZWQgb24gQU1EIEZhbWlseTEwaAorICogcmV2IEIwIGFuZCBsYXRlciAqLworc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKQoreworCWlmIChpYnNfYWxsb3dlZCkKKwkJb25fZWFjaF9jcHUoYXBpY19jbGVhcl9pYnNfbm1pX3Blcl9jcHUsIE5VTEwsIDEpOworfQorCitzdGF0aWMgaW50ICgqY3JlYXRlX2FyY2hfZmlsZXMpKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgZGVudHJ5ICogcm9vdCk7CisKK3N0YXRpYyBpbnQgc2V0dXBfaWJzX2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgZGVudHJ5ICogcm9vdCkKK3sKKwljaGFyIGJ1ZlsxMl07CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCByZXQgPSAwOworCisJLyogYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzICovCisJaWYgKGNyZWF0ZV9hcmNoX2ZpbGVzKQorCQlyZXQgPSBjcmVhdGVfYXJjaF9maWxlcyhzYiwgcm9vdCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFpYnNfYWxsb3dlZCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG1vZGVsIHNwZWNpZmljIGZpbGVzICovCisKKwkvKiBzZXR1cCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdHMgKi8KKwlpYnNfY29uZmlnLm1heF9jbnRfZmV0Y2ggPSAyNTAwMDA7CisJaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkID0gMDsKKwlpYnNfY29uZmlnLm1heF9jbnRfb3AgPSAyNTAwMDA7CisJaWJzX2NvbmZpZy5vcF9lbmFibGVkID0gMDsKKwlpYnNfY29uZmlnLmRpc3BhdGNoZWRfb3BzID0gMTsKKwlzbnByaW50ZihidWYsICBzaXplb2YoYnVmKSwgImlic19mZXRjaCIpOworCWRpciA9IG9wcm9maWxlZnNfbWtkaXIoc2IsIHJvb3QsIGJ1Zik7CisJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInJhbmRfZW5hYmxlIiwKKwkJCQkmaWJzX2NvbmZpZy5yYW5kX2VuKTsKKwlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZW5hYmxlIiwKKwkJJmlic19jb25maWcuZmV0Y2hfZW5hYmxlZCk7CisJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgIm1heF9jb3VudCIsCisJCSZpYnNfY29uZmlnLm1heF9jbnRfZmV0Y2gpOworCXNucHJpbnRmKGJ1ZiwgIHNpemVvZihidWYpLCAiaWJzX3VvcHMiKTsKKwlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOworCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJlbmFibGUiLAorCQkmaWJzX2NvbmZpZy5vcF9lbmFibGVkKTsKKwlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAibWF4X2NvdW50IiwKKwkJJmlic19jb25maWcubWF4X2NudF9vcCk7CisJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImRpc3BhdGNoZWRfb3BzIiwKKwkJJmlic19jb25maWcuZGlzcGF0Y2hlZF9vcHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BfYW1kX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlzZXR1cF9pYnMoKTsKKwljcmVhdGVfYXJjaF9maWxlcyA9IG9wcy0+Y3JlYXRlX2ZpbGVzOworCW9wcy0+Y3JlYXRlX2ZpbGVzID0gc2V0dXBfaWJzX2ZpbGVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvcF9hbWRfZXhpdCh2b2lkKQoreworCWNsZWFyX2lic19ubWkoKTsKK30KKworI2VuZGlmCisKK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9hbWRfc3BlYyA9IHsKKwkuaW5pdCA9IG9wX2FtZF9pbml0LAorCS5leGl0ID0gb3BfYW1kX2V4aXQsCisJLm51bV9jb3VudGVycyA9IE5VTV9DT1VOVEVSUywKKwkubnVtX2NvbnRyb2xzID0gTlVNX0NPTlRST0xTLAorCS5maWxsX2luX2FkZHJlc3NlcyA9ICZvcF9hbWRfZmlsbF9pbl9hZGRyZXNzZXMsCisJLnNldHVwX2N0cnMgPSAmb3BfYW1kX3NldHVwX2N0cnMsCisJLmNoZWNrX2N0cnMgPSAmb3BfYW1kX2NoZWNrX2N0cnMsCisJLnN0YXJ0ID0gJm9wX2FtZF9zdGFydCwKKwkuc3RvcCA9ICZvcF9hbWRfc3RvcCwKKwkuc2h1dGRvd24gPSAmb3BfYW1kX3NodXRkb3duCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MzQ4Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQGZpbGUgb3BfbW9kZWxfYXRobG9uLmgKLSAqIGF0aGxvbiAvIEs3IC8gSzggLyBGYW1pbHkgMTBoIG1vZGVsLXNwZWNpZmljIE1TUiBvcGVyYXRpb25zCi0gKgotICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCi0gKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORwotICoKLSAqIEBhdXRob3IgSm9obiBMZXZvbgotICogQGF1dGhvciBQaGlsaXBwZSBFbGllCi0gKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21zci5oPgotI2luY2x1ZGUgPGFzbS9ubWkuaD4KLQotI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgotI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKLQotI2RlZmluZSBOVU1fQ09VTlRFUlMgNAotI2RlZmluZSBOVU1fQ09OVFJPTFMgNAotCi0jZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUl9SRUFEKGwsIGgsIG1zcnMsIGMpIGRvIHtyZG1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIChsKSwgKGgpKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSX1dSSVRFKGwsIG1zcnMsIGMpIGRvIHt3cm1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIC0odW5zaWduZWQgaW50KShsKSwgLTEpOyB9IHdoaWxlICgwKQotI2RlZmluZSBDVFJfT1ZFUkZMT1dFRChuKSAoISgobikgJiAoMVU8PDMxKSkpCi0KLSNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUkxfUkVBRChsLCBoLCBtc3JzLCBjKSBkbyB7cmRtc3IobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyLCAobCksIChoKSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIENUUkxfV1JJVEUobCwgaCwgbXNycywgYykgZG8ge3dybXNyKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciwgKGwpLCAoaCkpOyB9IHdoaWxlICgwKQotI2RlZmluZSBDVFJMX1NFVF9BQ1RJVkUobikgKG4gfD0gKDE8PDIyKSkKLSNkZWZpbmUgQ1RSTF9TRVRfSU5BQ1RJVkUobikgKG4gJj0gfigxPDwyMikpCi0jZGVmaW5lIENUUkxfQ0xFQVJfTE8oeCkgKHggJj0gKDE8PDIxKSkKLSNkZWZpbmUgQ1RSTF9DTEVBUl9ISSh4KSAoeCAmPSAweGZmZmZmY2YwKQotI2RlZmluZSBDVFJMX1NFVF9FTkFCTEUodmFsKSAodmFsIHw9IDE8PDIwKQotI2RlZmluZSBDVFJMX1NFVF9VU1IodmFsLCB1KSAodmFsIHw9ICgodSAmIDEpIDw8IDE2KSkKLSNkZWZpbmUgQ1RSTF9TRVRfS0VSTih2YWwsIGspICh2YWwgfD0gKChrICYgMSkgPDwgMTcpKQotI2RlZmluZSBDVFJMX1NFVF9VTSh2YWwsIG0pICh2YWwgfD0gKG0gPDwgOCkpCi0jZGVmaW5lIENUUkxfU0VUX0VWRU5UX0xPVyh2YWwsIGUpICh2YWwgfD0gKGUgJiAweGZmKSkKLSNkZWZpbmUgQ1RSTF9TRVRfRVZFTlRfSElHSCh2YWwsIGUpICh2YWwgfD0gKChlID4+IDgpICYgMHhmKSkKLSNkZWZpbmUgQ1RSTF9TRVRfSE9TVF9PTkxZKHZhbCwgaCkgKHZhbCB8PSAoKGggJiAxKSA8PCA5KSkKLSNkZWZpbmUgQ1RSTF9TRVRfR1VFU1RfT05MWSh2YWwsIGgpICh2YWwgfD0gKChoICYgMSkgPDwgOCkpCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X3ZhbHVlW05VTV9DT1VOVEVSU107Ci0KLXN0YXRpYyB2b2lkIGF0aGxvbl9maWxsX2luX2FkZHJlc3NlcyhzdHJ1Y3Qgb3BfbXNycyAqIGNvbnN0IG1zcnMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyBpKyspIHsKLQkJaWYgKHJlc2VydmVfcGVyZmN0cl9ubWkoTVNSX0s3X1BFUkZDVFIwICsgaSkpCi0JCQltc3JzLT5jb3VudGVyc1tpXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIwICsgaTsKLQkJZWxzZQotCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IDA7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9DT05UUk9MUzsgaSsrKSB7Ci0JCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKE1TUl9LN19FVk5UU0VMMCArIGkpKQotCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IE1TUl9LN19FVk5UU0VMMCArIGk7Ci0JCWVsc2UKLQkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSAwOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBhdGhsb25fc2V0dXBfY3RycyhzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCi17Ci0JdW5zaWduZWQgaW50IGxvdywgaGlnaDsKLQlpbnQgaTsKLQotCS8qIGNsZWFyIGFsbCBjb3VudGVycyAqLwotCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPTlRST0xTOyArK2kpIHsKLQkJaWYgKHVubGlrZWx5KCFDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkKLQkJCWNvbnRpbnVlOwotCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJQ1RSTF9DTEVBUl9MTyhsb3cpOwotCQlDVFJMX0NMRUFSX0hJKGhpZ2gpOwotCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JfQotCi0JLyogYXZvaWQgYSBmYWxzZSBkZXRlY3Rpb24gb2YgY3RyIG92ZXJmbG93cyBpbiBOTUkgaGFuZGxlciAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgewotCQlpZiAodW5saWtlbHkoIUNUUl9JU19SRVNFUlZFRChtc3JzLCBpKSkpCi0JCQljb250aW51ZTsKLQkJQ1RSX1dSSVRFKDEsIG1zcnMsIGkpOwotCX0KLQotCS8qIGVuYWJsZSBhY3RpdmUgY291bnRlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKLQkJaWYgKChjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKSAmJiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkgewotCQkJcmVzZXRfdmFsdWVbaV0gPSBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudDsKLQotCQkJQ1RSX1dSSVRFKGNvdW50ZXJfY29uZmlnW2ldLmNvdW50LCBtc3JzLCBpKTsKLQotCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCQlDVFJMX0NMRUFSX0xPKGxvdyk7Ci0JCQlDVFJMX0NMRUFSX0hJKGhpZ2gpOwotCQkJQ1RSTF9TRVRfRU5BQkxFKGxvdyk7Ci0JCQlDVFJMX1NFVF9VU1IobG93LCBjb3VudGVyX2NvbmZpZ1tpXS51c2VyKTsKLQkJCUNUUkxfU0VUX0tFUk4obG93LCBjb3VudGVyX2NvbmZpZ1tpXS5rZXJuZWwpOwotCQkJQ1RSTF9TRVRfVU0obG93LCBjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOwotCQkJQ1RSTF9TRVRfRVZFTlRfTE9XKGxvdywgY291bnRlcl9jb25maWdbaV0uZXZlbnQpOwotCQkJQ1RSTF9TRVRfRVZFTlRfSElHSChoaWdoLCBjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCk7Ci0JCQlDVFJMX1NFVF9IT1NUX09OTFkoaGlnaCwgMCk7Ci0JCQlDVFJMX1NFVF9HVUVTVF9PTkxZKGhpZ2gsIDApOwotCi0JCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldF92YWx1ZVtpXSA9IDA7Ci0JCX0KLQl9Ci19Ci0KLQotc3RhdGljIGludCBhdGhsb25fY2hlY2tfY3RycyhzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCi0JCQkgICAgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKLXsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOwotCWludCBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgewotCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQotCQkJY29udGludWU7Ci0JCUNUUl9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCWlmIChDVFJfT1ZFUkZMT1dFRChsb3cpKSB7Ci0JCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwotCQkJQ1RSX1dSSVRFKHJlc2V0X3ZhbHVlW2ldLCBtc3JzLCBpKTsKLQkJfQotCX0KLQotCS8qIFNlZSBvcF9tb2RlbF9wcHJvLmMgKi8KLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhdGhsb25fc3RhcnQoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQotewotCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7Ci0JaW50IGk7Ci0JZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKLQkJaWYgKHJlc2V0X3ZhbHVlW2ldKSB7Ci0JCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJCUNUUkxfU0VUX0FDVElWRShsb3cpOwotCQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOwotCQl9Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIGF0aGxvbl9zdG9wKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKLXsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOwotCWludCBpOwotCi0JLyogU3VidGxlOiBzdG9wIG9uIGFsbCBjb3VudGVycyB0byBhdm9pZCByYWNlIHdpdGgKLQkgKiBzZXR0aW5nIG91ciBwbSBjYWxsYmFjayAqLwotCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7Ci0JCWlmICghcmVzZXRfdmFsdWVbaV0pCi0JCQljb250aW51ZTsKLQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCUNUUkxfU0VUX0lOQUNUSVZFKGxvdyk7Ci0JCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aGxvbl9zaHV0ZG93bihzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUyA7ICsraSkgewotCQlpZiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGkpKQotCQkJcmVsZWFzZV9wZXJmY3RyX25taShNU1JfSzdfUEVSRkNUUjAgKyBpKTsKLQl9Ci0JZm9yIChpID0gMCA7IGkgPCBOVU1fQ09OVFJPTFMgOyArK2kpIHsKLQkJaWYgKENUUkxfSVNfUkVTRVJWRUQobXNycywgaSkpCi0JCQlyZWxlYXNlX2V2bnRzZWxfbm1pKE1TUl9LN19FVk5UU0VMMCArIGkpOwotCX0KLX0KLQotc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2F0aGxvbl9zcGVjID0gewotCS5udW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlMsCi0JLm51bV9jb250cm9scyA9IE5VTV9DT05UUk9MUywKLQkuZmlsbF9pbl9hZGRyZXNzZXMgPSAmYXRobG9uX2ZpbGxfaW5fYWRkcmVzc2VzLAotCS5zZXR1cF9jdHJzID0gJmF0aGxvbl9zZXR1cF9jdHJzLAotCS5jaGVja19jdHJzID0gJmF0aGxvbl9jaGVja19jdHJzLAotCS5zdGFydCA9ICZhdGhsb25fc3RhcnQsCi0JLnN0b3AgPSAmYXRobG9uX3N0b3AsCi0JLnNodXRkb3duID0gJmF0aGxvbl9zaHV0ZG93bgotfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3A0LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCmluZGV4IDU2YjQ3NTcuLjQzYWM1YWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYwpAQCAtMTAsMTEgKzEwLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL25taS5oPgorCiAKICNpbmNsdWRlICJvcF94ODZfbW9kZWwuaCIKICNpbmNsdWRlICJvcF9jb3VudGVyLmgiCkBAIC00MCw3ICs0MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfbnVtX2NvdW50ZXJzKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAotCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpeworCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpIHsKIAkJbnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTX0hUMjsKIAkJbnVtX2NvbnRyb2xzID0gTlVNX0NPTlRST0xTX0hUMjsKIAl9CkBAIC04Niw3ICs4Nyw3IEBACiAjZGVmaW5lIENUUl9GTEFNRV8yICAgICgxIDw8IDYpCiAjZGVmaW5lIENUUl9JUV81ICAgICAgICgxIDw8IDcpCiAKLXN0YXRpYyBzdHJ1Y3QgcDRfY291bnRlcl9iaW5kaW5nIHA0X2NvdW50ZXJzIFtOVU1fQ09VTlRFUlNfTk9OX0hUXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcDRfY291bnRlcl9iaW5kaW5nIHA0X2NvdW50ZXJzW05VTV9DT1VOVEVSU19OT05fSFRdID0gewogCXsgQ1RSX0JQVV8wLCAgIE1TUl9QNF9CUFVfUEVSRkNUUjAsICAgTVNSX1A0X0JQVV9DQ0NSMCB9LAogCXsgQ1RSX01TXzAsICAgIE1TUl9QNF9NU19QRVJGQ1RSMCwgICAgTVNSX1A0X01TX0NDQ1IwIH0sCiAJeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZMQU1FX1BFUkZDVFIwLCBNU1JfUDRfRkxBTUVfQ0NDUjAgfSwKQEAgLTk3LDMyICs5OCwzMiBAQAogCXsgQ1RSX0lRXzUsICAgIE1TUl9QNF9JUV9QRVJGQ1RSNSwgICAgTVNSX1A0X0lRX0NDQ1I1IH0KIH07CiAKLSNkZWZpbmUgTlVNX1VOVVNFRF9DQ0NSUwlOVU1fQ0NDUlNfTk9OX0hUIC0gTlVNX0NPVU5URVJTX05PTl9IVAorI2RlZmluZSBOVU1fVU5VU0VEX0NDQ1JTIChOVU1fQ0NDUlNfTk9OX0hUIC0gTlVNX0NPVU5URVJTX05PTl9IVCkKIAogLyogcDQgZXZlbnQgY29kZXMgaW4gbGlib3Avb3BfZXZlbnQuaCBhcmUgaW5kaWNlcyBpbnRvIHRoaXMgdGFibGUuICovCiAKIHN0YXRpYyBzdHJ1Y3QgcDRfZXZlbnRfYmluZGluZyBwNF9ldmVudHNbTlVNX0VWRU5UU10gPSB7Ci0JCisKIAl7IC8qIEJSQU5DSF9SRVRJUkVEICovCi0JCTB4MDUsIDB4MDYsIAorCQkweDA1LCAweDA2LAogCQl7IHtDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMn0sCiAJCSAge0NUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CiAJfSwKLQkKKwogCXsgLyogTUlTUFJFRF9CUkFOQ0hfUkVUSVJFRCAqLwotCQkweDA0LCAweDAzLCAKKwkJMHgwNCwgMHgwMywKIAkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IwfSwKIAkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IxfSB9CiAJfSwKLQkKKwogCXsgLyogVENfREVMSVZFUl9NT0RFICovCiAJCTB4MDEsIDB4MDEsCi0JCXsgeyBDVFJfTVNfMCwgTVNSX1A0X1RDX0VTQ1IwfSwgIAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9UQ19FU0NSMH0sCiAJCSAgeyBDVFJfTVNfMiwgTVNSX1A0X1RDX0VTQ1IxfSB9CiAJfSwKLQkKKwogCXsgLyogQlBVX0ZFVENIX1JFUVVFU1QgKi8KLQkJMHgwMCwgMHgwMywgCisJCTB4MDAsIDB4MDMsCiAJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9CUFVfRVNDUjB9LAogCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfQlBVX0VTQ1IxfSB9CiAJfSwKQEAgLTE0Niw3ICsxNDcsNyBAQAogCX0sCiAKIAl7IC8qIExPQURfUE9SVF9SRVBMQVkgKi8KLQkJMHgwMiwgMHgwNCwgCisJCTB4MDIsIDB4MDQsCiAJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X1NBQVRfRVNDUjB9LAogCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9TQUFUX0VTQ1IxfSB9CiAJfSwKQEAgLTE3MCw0MyArMTcxLDQzIEBACiAJfSwKIAogCXsgLyogQlNRX0NBQ0hFX1JFRkVSRU5DRSAqLwotCQkweDA3LCAweDBjLCAKKwkJMHgwNywgMHgwYywKIAkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0JTVV9FU0NSMH0sCiAJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9CU1VfRVNDUjF9IH0KIAl9LAogCiAJeyAvKiBJT1FfQUxMT0NBVElPTiAqLwotCQkweDA2LCAweDAzLCAKKwkJMHgwNiwgMHgwMywKIAkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0ZTQl9FU0NSMH0sCiAJCSAgeyAwLCAwIH0gfQogCX0sCiAKIAl7IC8qIElPUV9BQ1RJVkVfRU5UUklFUyAqLwotCQkweDA2LCAweDFhLCAKKwkJMHgwNiwgMHgxYSwKIAkJeyB7IENUUl9CUFVfMiwgTVNSX1A0X0ZTQl9FU0NSMX0sCiAJCSAgeyAwLCAwIH0gfQogCX0sCiAKIAl7IC8qIEZTQl9EQVRBX0FDVElWSVRZICovCi0JCTB4MDYsIDB4MTcsIAorCQkweDA2LCAweDE3LAogCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfRlNCX0VTQ1IwfSwKIAkJICB7IENUUl9CUFVfMiwgTVNSX1A0X0ZTQl9FU0NSMX0gfQogCX0sCiAKIAl7IC8qIEJTUV9BTExPQ0FUSU9OICovCi0JCTB4MDcsIDB4MDUsIAorCQkweDA3LCAweDA1LAogCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfQlNVX0VTQ1IwfSwKIAkJICB7IDAsIDAgfSB9CiAJfSwKIAogCXsgLyogQlNRX0FDVElWRV9FTlRSSUVTICovCiAJCTB4MDcsIDB4MDYsCi0JCXsgeyBDVFJfQlBVXzIsIE1TUl9QNF9CU1VfRVNDUjEgLyogZ3Vlc3MgKi99LCAgCisJCXsgeyBDVFJfQlBVXzIsIE1TUl9QNF9CU1VfRVNDUjEgLyogZ3Vlc3MgKi99LAogCQkgIHsgMCwgMCB9IH0KIAl9LAogCiAJeyAvKiBYODdfQVNTSVNUICovCi0JCTB4MDUsIDB4MDMsIAorCQkweDA1LCAweDAzLAogCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjJ9LAogCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjN9IH0KIAl9LApAQCAtMjE2LDIxICsyMTcsMjEgQEAKIAkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCiAJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KIAl9LAotICAKKwogCXsgLyogUEFDS0VEX1NQX1VPUCAqLwotCQkweDAxLCAweDA4LCAKKwkJMHgwMSwgMHgwOCwKIAkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCiAJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KIAl9LAotICAKKwogCXsgLyogUEFDS0VEX0RQX1VPUCAqLwotCQkweDAxLCAweDBjLCAKKwkJMHgwMSwgMHgwYywKIAkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCiAJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KIAl9LAogCiAJeyAvKiBTQ0FMQVJfU1BfVU9QICovCi0JCTB4MDEsIDB4MGEsIAorCQkweDAxLCAweDBhLAogCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKIAkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQogCX0sCkBAIC0yNDIsMzEgKzI0MywzMSBAQAogCX0sCiAKIAl7IC8qIDY0QklUX01NWF9VT1AgKi8KLQkJMHgwMSwgMHgwMiwgCisJCTB4MDEsIDB4MDIsCiAJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAogCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CiAJfSwKLSAgCisKIAl7IC8qIDEyOEJJVF9NTVhfVU9QICovCi0JCTB4MDEsIDB4MWEsIAorCQkweDAxLCAweDFhLAogCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKIAkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQogCX0sCiAKIAl7IC8qIFg4N19GUF9VT1AgKi8KLQkJMHgwMSwgMHgwNCwgCisJCTB4MDEsIDB4MDQsCiAJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAogCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CiAJfSwKLSAgCisKIAl7IC8qIFg4N19TSU1EX01PVkVTX1VPUCAqLwotCQkweDAxLCAweDJlLCAKKwkJMHgwMSwgMHgyZSwKIAkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCiAJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KIAl9LAotICAKKwogCXsgLyogTUFDSElORV9DTEVBUiAqLwotCQkweDA1LCAweDAyLCAKKwkJMHgwNSwgMHgwMiwKIAkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKIAkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CiAJfSwKQEAgLTI3Niw5ICsyNzcsOSBAQAogCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfRlNCX0VTQ1IwfSwKIAkJICB7IENUUl9CUFVfMiwgTVNSX1A0X0ZTQl9FU0NSMX0gfQogCX0sCi0gIAorCiAJeyAvKiBUQ19NU19YRkVSICovCi0JCTB4MDAsIDB4MDUsIAorCQkweDAwLCAweDA1LAogCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9NU19FU0NSMH0sCiAJCSAgeyBDVFJfTVNfMiwgTVNSX1A0X01TX0VTQ1IxfSB9CiAJfSwKQEAgLTMwOCw3ICszMDksNyBAQAogCX0sCiAKIAl7IC8qIElOU1RSX1JFVElSRUQgKi8KLQkJMHgwNCwgMHgwMiwgCisJCTB4MDQsIDB4MDIsCiAJCXsgeyBDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMH0sCiAJCSAgeyBDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSMX0gfQogCX0sCkBAIC0zMTksMTQgKzMyMCwxNCBAQAogCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjF9IH0KIAl9LAogCi0JeyAvKiBVT1BfVFlQRSAqLyAgICAKLQkJMHgwMiwgMHgwMiwgCisJeyAvKiBVT1BfVFlQRSAqLworCQkweDAyLCAweDAyLAogCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9SQVRfRVNDUjB9LAogCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9SQVRfRVNDUjF9IH0KIAl9LAogCiAJeyAvKiBSRVRJUkVEX01JU1BSRURfQlJBTkNIX1RZUEUgKi8KLQkJMHgwMiwgMHgwNSwgCisJCTB4MDIsIDB4MDUsCiAJCXsgeyBDVFJfTVNfMCwgTVNSX1A0X1RCUFVfRVNDUjB9LAogCQkgIHsgQ1RSX01TXzIsIE1TUl9QNF9UQlBVX0VTQ1IxfSB9CiAJfSwKQEAgLTM0OSw4ICszNTAsOCBAQAogI2RlZmluZSBFU0NSX1NFVF9PU18xKGVzY3IsIG9zKSAoKGVzY3IpIHw9ICgoKG9zKSAmIDEpIDw8IDEpKQogI2RlZmluZSBFU0NSX1NFVF9FVkVOVF9TRUxFQ1QoZXNjciwgc2VsKSAoKGVzY3IpIHw9ICgoKHNlbCkgJiAweDNmKSA8PCAyNSkpCiAjZGVmaW5lIEVTQ1JfU0VUX0VWRU5UX01BU0soZXNjciwgbWFzaykgKChlc2NyKSB8PSAoKChtYXNrKSAmIDB4ZmZmZikgPDwgOSkpCi0jZGVmaW5lIEVTQ1JfUkVBRChlc2NyLGhpZ2gsZXYsaSkgZG8ge3JkbXNyKGV2LT5iaW5kaW5nc1soaSldLmVzY3JfYWRkcmVzcywgKGVzY3IpLCAoaGlnaCkpO30gd2hpbGUgKDApCi0jZGVmaW5lIEVTQ1JfV1JJVEUoZXNjcixoaWdoLGV2LGkpIGRvIHt3cm1zcihldi0+YmluZGluZ3NbKGkpXS5lc2NyX2FkZHJlc3MsIChlc2NyKSwgKGhpZ2gpKTt9IHdoaWxlICgwKQorI2RlZmluZSBFU0NSX1JFQUQoZXNjciwgaGlnaCwgZXYsIGkpIGRvIHtyZG1zcihldi0+YmluZGluZ3NbKGkpXS5lc2NyX2FkZHJlc3MsIChlc2NyKSwgKGhpZ2gpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgRVNDUl9XUklURShlc2NyLCBoaWdoLCBldiwgaSkgZG8ge3dybXNyKGV2LT5iaW5kaW5nc1soaSldLmVzY3JfYWRkcmVzcywgKGVzY3IpLCAoaGlnaCkpOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIENDQ1JfUkVTRVJWRURfQklUUyAweDM4MDMwRkZGCiAjZGVmaW5lIENDQ1JfQ0xFQVIoY2NjcikgKChjY2NyKSAmPSBDQ0NSX1JFU0VSVkVEX0JJVFMpCkBAIC0zNjAsMTUgKzM2MSwxNSBAQAogI2RlZmluZSBDQ0NSX1NFVF9QTUlfT1ZGXzEoY2NjcikgKChjY2NyKSB8PSAoMTw8MjcpKQogI2RlZmluZSBDQ0NSX1NFVF9FTkFCTEUoY2NjcikgKChjY2NyKSB8PSAoMTw8MTIpKQogI2RlZmluZSBDQ0NSX1NFVF9ESVNBQkxFKGNjY3IpICgoY2NjcikgJj0gfigxPDwxMikpCi0jZGVmaW5lIENDQ1JfUkVBRChsb3csIGhpZ2gsIGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNjY3JfYWRkcmVzcywgKGxvdyksIChoaWdoKSk7fSB3aGlsZSAoMCkKLSNkZWZpbmUgQ0NDUl9XUklURShsb3csIGhpZ2gsIGkpIGRvIHt3cm1zcihwNF9jb3VudGVyc1soaSldLmNjY3JfYWRkcmVzcywgKGxvdyksIChoaWdoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ0NDUl9SRUFEKGxvdywgaGlnaCwgaSkgZG8ge3JkbXNyKHA0X2NvdW50ZXJzWyhpKV0uY2Njcl9hZGRyZXNzLCAobG93KSwgKGhpZ2gpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ0NDUl9XUklURShsb3csIGhpZ2gsIGkpIGRvIHt3cm1zcihwNF9jb3VudGVyc1soaSldLmNjY3JfYWRkcmVzcywgKGxvdyksIChoaWdoKSk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIENDQ1JfT1ZGX1AoY2NjcikgKChjY2NyKSAmICgxVTw8MzEpKQogI2RlZmluZSBDQ0NSX0NMRUFSX09WRihjY2NyKSAoKGNjY3IpICY9ICh+KDFVPDwzMSkpKQogCi0jZGVmaW5lIENUUkxfSVNfUkVTRVJWRUQobXNycyxjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLGMpIChtc3JzLT5jb3VudGVyc1soYyldLmFkZHIgPyAxIDogMCkKLSNkZWZpbmUgQ1RSX1JFQUQobCxoLGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgKGwpLCAoaCkpO30gd2hpbGUgKDApCi0jZGVmaW5lIENUUl9XUklURShsLGkpIGRvIHt3cm1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgLSh1MzIpKGwpLCAtMSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCisjZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyID8gMSA6IDApCisjZGVmaW5lIENUUl9SRUFEKGwsIGgsIGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgKGwpLCAoaCkpOyB9IHdoaWxlICgwKQorI2RlZmluZSBDVFJfV1JJVEUobCwgaSkgZG8ge3dybXNyKHA0X2NvdW50ZXJzWyhpKV0uY291bnRlcl9hZGRyZXNzLCAtKHUzMikobCksIC0xKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgQ1RSX09WRVJGTE9XX1AoY3RyKSAoISgoY3RyKSAmIDB4ODAwMDAwMDApKQogCiAKQEAgLTM4MCw3ICszODEsNyBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXJldHVybiAoY3B1ICE9IGZpcnN0X2NwdShwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkpOwotI2VuZGlmCQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5NSwyNSArMzk2LDIzIEBACiAKIHN0YXRpYyB2b2lkIHA0X2ZpbGxfaW5fYWRkcmVzc2VzKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgaTsgCisJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IGFkZHIsIGNjY3JhZGRyLCBzdGFnOwogCiAJc2V0dXBfbnVtX2NvdW50ZXJzKCk7CiAJc3RhZyA9IGdldF9zdGFnZ2VyKCk7CiAKIAkvKiBpbml0aWFsaXplIHNvbWUgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKQogCQltc3JzLT5jb3VudGVyc1tpXS5hZGRyID0gMDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG51bV9jb250cm9sczsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb250cm9sczsgKytpKQogCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gMDsKLQl9Ci0JCisKIAkvKiB0aGUgY291bnRlciAmIGNjY3IgcmVnaXN0ZXJzIHdlIHBheSBhdHRlbnRpb24gdG8gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKIAkJYWRkciA9IHA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jb3VudGVyX2FkZHJlc3M7CiAJCWNjY3JhZGRyID0gcDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzczsKLQkJaWYgKHJlc2VydmVfcGVyZmN0cl9ubWkoYWRkcikpeworCQlpZiAocmVzZXJ2ZV9wZXJmY3RyX25taShhZGRyKSkgewogCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IGFkZHI7CiAJCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gY2NjcmFkZHI7CiAJCX0KQEAgLTQ0NywyMiArNDQ2LDIyIEBACiAJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKGFkZHIpKQogCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CiAJfQotCQorCiAJZm9yIChhZGRyID0gTVNSX1A0X01TX0VTQ1IwICsgc3RhZzsKLQkgICAgIGFkZHIgPD0gTVNSX1A0X1RDX0VTQ1IxOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeyAKKwkgICAgIGFkZHIgPD0gTVNSX1A0X1RDX0VTQ1IxOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgewogCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShhZGRyKSkKIAkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOwogCX0KLQkKKwogCWZvciAoYWRkciA9IE1TUl9QNF9JWF9FU0NSMCArIHN0YWc7Ci0JICAgICBhZGRyIDw9IE1TUl9QNF9DUlVfRVNDUjM7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7IAorCSAgICAgYWRkciA8PSBNU1JfUDRfQ1JVX0VTQ1IzOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgewogCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShhZGRyKSkKIAkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOwogCX0KIAogCS8qIHRoZXJlIGFyZSAyIHJlbWFpbmluZyBub24tY29udGlndW91c2x5IGxvY2F0ZWQgRVNDUnMgKi8KIAotCWlmIChudW1fY291bnRlcnMgPT0gTlVNX0NPVU5URVJTX05PTl9IVCkgewkJCisJaWYgKG51bV9jb3VudGVycyA9PSBOVU1fQ09VTlRFUlNfTk9OX0hUKSB7CiAJCS8qIHN0YW5kYXJkIG5vbi1IVCBDUFVzIGhhbmRsZSBib3RoIHJlbWFpbmluZyBFU0NScyovCiAJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKE1TUl9QNF9DUlVfRVNDUjUpKQogCQkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNTsKQEAgLTQ5OCwyMCArNDk3LDIwIEBACiAJdW5zaWduZWQgaW50IHN0YWc7CiAKIAlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKLQkKKwogCS8qIGNvbnZlcnQgZnJvbSBjb3VudGVyICpudW1iZXIqIHRvIGNvdW50ZXIgKmJpdCogKi8KIAljb3VudGVyX2JpdCA9IDEgPDwgVklSVF9DVFIoc3RhZywgY3RyKTsKLQkKKwogCS8qIGZpbmQgb3VyIGV2ZW50IGJpbmRpbmcgc3RydWN0dXJlLiAqLwogCWlmIChjb3VudGVyX2NvbmZpZ1tjdHJdLmV2ZW50IDw9IDAgfHwgY291bnRlcl9jb25maWdbY3RyXS5ldmVudCA+IE5VTV9FVkVOVFMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIAotCQkgICAgICAgIm9wcm9maWxlOiBQNCBldmVudCBjb2RlIDB4JWx4IG91dCBvZiByYW5nZVxuIiwgCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm9wcm9maWxlOiBQNCBldmVudCBjb2RlIDB4JWx4IG91dCBvZiByYW5nZVxuIiwKIAkJICAgICAgIGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQpOwogCQlyZXR1cm47CiAJfQotCQorCiAJZXYgPSAmKHA0X2V2ZW50c1tjb3VudGVyX2NvbmZpZ1tjdHJdLmV2ZW50IC0gMV0pOwotCQorCiAJZm9yIChpID0gMDsgaSA8IG1heGJpbmQ7IGkrKykgewogCQlpZiAoZXYtPmJpbmRpbmdzW2ldLnZpcnRfY291bnRlciAmIGNvdW50ZXJfYml0KSB7CiAKQEAgLTUyNiwyNSArNTI1LDI0IEBACiAJCQkJRVNDUl9TRVRfT1NfMShlc2NyLCBjb3VudGVyX2NvbmZpZ1tjdHJdLmtlcm5lbCk7CiAJCQl9CiAJCQlFU0NSX1NFVF9FVkVOVF9TRUxFQ1QoZXNjciwgZXYtPmV2ZW50X3NlbGVjdCk7Ci0JCQlFU0NSX1NFVF9FVkVOVF9NQVNLKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0udW5pdF9tYXNrKTsJCQkKKwkJCUVTQ1JfU0VUX0VWRU5UX01BU0soZXNjciwgY291bnRlcl9jb25maWdbY3RyXS51bml0X21hc2spOwogCQkJRVNDUl9XUklURShlc2NyLCBoaWdoLCBldiwgaSk7Ci0JCSAgICAgICAKKwogCQkJLyogbW9kaWZ5IENDQ1IgKi8KIAkJCUNDQ1JfUkVBRChjY2NyLCBoaWdoLCBWSVJUX0NUUihzdGFnLCBjdHIpKTsKIAkJCUNDQ1JfQ0xFQVIoY2Njcik7CiAJCQlDQ0NSX1NFVF9SRVFVSVJFRF9CSVRTKGNjY3IpOwogCQkJQ0NDUl9TRVRfRVNDUl9TRUxFQ1QoY2NjciwgZXYtPmVzY3Jfc2VsZWN0KTsKLQkJCWlmIChzdGFnID09IDApIHsKKwkJCWlmIChzdGFnID09IDApCiAJCQkJQ0NDUl9TRVRfUE1JX09WRl8wKGNjY3IpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlDQ0NSX1NFVF9QTUlfT1ZGXzEoY2Njcik7Ci0JCQl9CiAJCQlDQ0NSX1dSSVRFKGNjY3IsIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGN0cikpOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fRVJSIAorCXByaW50ayhLRVJOX0VSUgogCSAgICAgICAib3Byb2ZpbGU6IFA0IGV2ZW50IGNvZGUgMHglbHggbm8gYmluZGluZywgc3RhZyAlZCBjdHIgJWRcbiIsCiAJICAgICAgIGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQsIHN0YWcsIGN0cik7CiB9CkBAIC01NTksMTQgKzU1NywxNCBAQAogCXN0YWcgPSBnZXRfc3RhZ2dlcigpOwogCiAJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGxvdywgaGlnaCk7Ci0JaWYgKCEgTUlTQ19QTUNfRU5BQkxFRF9QKGxvdykpIHsKKwlpZiAoIU1JU0NfUE1DX0VOQUJMRURfUChsb3cpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAib3Byb2ZpbGU6IFA0IFBNQyBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGNsZWFyIHRoZSBjY2NycyB3ZSB3aWxsIHVzZSAqLwogCWZvciAoaSA9IDAgOyBpIDwgbnVtX2NvdW50ZXJzIDsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLGkpKSkKKwkJaWYgKHVubGlrZWx5KCFDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkKIAkJCWNvbnRpbnVlOwogCQlyZG1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOwogCQlDQ0NSX0NMRUFSKGxvdyk7CkBAIC01NzYsMTQgKzU3NCwxNCBAQAogCiAJLyogY2xlYXIgYWxsIGVzY3JzIChpbmNsdWRpbmcgdGhvc2Ugb3V0c2lkZSBvdXIgY29uY2VybikgKi8KIAlmb3IgKGkgPSBudW1fY291bnRlcnM7IGkgPCBudW1fY29udHJvbHM7IGkrKykgewotCQlpZiAodW5saWtlbHkoIUNUUkxfSVNfUkVTRVJWRUQobXNycyxpKSkpCisJCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkpCiAJCQljb250aW51ZTsKIAkJd3Jtc3IobXNycy0+Y29udHJvbHNbaV0uYWRkciwgMCwgMCk7CiAJfQogCiAJLyogc2V0dXAgYWxsIGNvdW50ZXJzICovCiAJZm9yIChpID0gMCA7IGkgPCBudW1fY291bnRlcnMgOyArK2kpIHsKLQkJaWYgKChjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKSAmJiAoQ1RSTF9JU19SRVNFUlZFRChtc3JzLGkpKSkgeworCQlpZiAoKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpICYmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkgewogCQkJcmVzZXRfdmFsdWVbaV0gPSBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudDsKIAkJCXBtY19zZXR1cF9vbmVfcDRfY291bnRlcihpKTsKIAkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgVklSVF9DVFIoc3RhZywgaSkpOwpAQCAtNjAzLDExICs2MDEsMTEgQEAKIAlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgewotCQkKLQkJaWYgKCFyZXNldF92YWx1ZVtpXSkgCisKKwkJaWYgKCFyZXNldF92YWx1ZVtpXSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIAorCQkvKgogCQkgKiB0aGVyZSBpcyBzb21lIGVjY2VudHJpY2l0eSBpbiB0aGUgaGFyZHdhcmUgd2hpY2gKIAkJICogcmVxdWlyZXMgdGhhdCB3ZSBwZXJmb3JtIDIgZXh0cmEgY29ycmVjdGlvbnM6CiAJCSAqCkBAIC02MTYsMjQgKzYxNCwyNCBAQAogCQkgKgogCQkgKiAtIHdyaXRlIHRoZSBjb3VudGVyIGJhY2sgdHdpY2UgdG8gZW5zdXJlIGl0IGdldHMKIAkJICogICB1cGRhdGVkIHByb3Blcmx5LgotCQkgKiAKKwkJICoKIAkJICogdGhlIGZvcm1lciBzZWVtcyB0byBiZSByZWxhdGVkIHRvIGV4dHJhIE5NSXMgaGFwcGVuaW5nCiAJCSAqIGR1cmluZyB0aGUgY3VycmVudCBOTUk7IHRoZSBsYXR0ZXIgaXMgcmVwb3J0ZWQgYXMgZXJyYXRhCiAJCSAqIE4xNSBpbiBpbnRlbCBkb2MgMjQ5MTk5LTAyOSwgcGVudGl1bSA0IHNwZWNpZmljYXRpb24KIAkJICogdXBkYXRlLCB0aG91Z2ggdGhlaXIgc3VnZ2VzdGVkIHdvcmstYXJvdW5kIGRvZXMgbm90CiAJCSAqIGFwcGVhciB0byBzb2x2ZSB0aGUgcHJvYmxlbS4KIAkJICovCi0JCQorCiAJCXJlYWwgPSBWSVJUX0NUUihzdGFnLCBpKTsKIAogCQlDQ0NSX1JFQUQobG93LCBoaWdoLCByZWFsKTsKLSAJCUNUUl9SRUFEKGN0ciwgaGlnaCwgcmVhbCk7CisJCUNUUl9SRUFEKGN0ciwgaGlnaCwgcmVhbCk7CiAJCWlmIChDQ0NSX09WRl9QKGxvdykgfHwgQ1RSX09WRVJGTE9XX1AoY3RyKSkgewogCQkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCBpKTsKLSAJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIHJlYWwpOworCQkJQ1RSX1dSSVRFKHJlc2V0X3ZhbHVlW2ldLCByZWFsKTsKIAkJCUNDQ1JfQ0xFQVJfT1ZGKGxvdyk7CiAJCQlDQ0NSX1dSSVRFKGxvdywgaGlnaCwgcmVhbCk7Ci0gCQkJQ1RSX1dSSVRFKHJlc2V0X3ZhbHVlW2ldLCByZWFsKTsKKwkJCUNUUl9XUklURShyZXNldF92YWx1ZVtpXSwgcmVhbCk7CiAJCX0KIAl9CiAKQEAgLTY4MywxNSArNjgxLDE2IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgewotCQlpZiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycywgaSkpCiAJCQlyZWxlYXNlX3BlcmZjdHJfbm1pKG1zcnMtPmNvdW50ZXJzW2ldLmFkZHIpOwogCX0KLQkvKiBzb21lIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgc3BlY2lhbGx5IHJlc2VydmVkIGluCisJLyoKKwkgKiBzb21lIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgc3BlY2lhbGx5IHJlc2VydmVkIGluCiAJICogY29uanVuY3Rpb24gd2l0aCB0aGUgY291bnRlciByZWdpc3RlcnMgKGhlbmNlIHRoZSBzdGFydGluZyBvZmZzZXQpLgogCSAqIFRoaXMgc2F2ZXMgYSBmZXcgYml0cy4KIAkgKi8KIAlmb3IgKGkgPSBudW1fY291bnRlcnMgOyBpIDwgbnVtX2NvbnRyb2xzIDsgKytpKSB7Ci0JCWlmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCWlmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKQogCQkJcmVsZWFzZV9ldm50c2VsX25taShtc3JzLT5jb250cm9sc1tpXS5hZGRyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF94ODZfbW9kZWwuaCBiL2FyY2gveDg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCmluZGV4IDQ1YjYwNWYuLjA1YTAyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCkBAIC0zMiw2ICszMiw4IEBACiAgKiB2YXJpb3VzIHg4NiBDUFUgbW9kZWxzJyBwZXJmY3RyIHN1cHBvcnQuCiAgKi8KIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyB7CisJaW50ICgqaW5pdCkoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcyk7CisJdm9pZCAoKmV4aXQpKHZvaWQpOwogCXVuc2lnbmVkIGludCBjb25zdCBudW1fY291bnRlcnM7CiAJdW5zaWduZWQgaW50IGNvbnN0IG51bV9jb250cm9sczsKIAl2b2lkICgqZmlsbF9pbl9hZGRyZXNzZXMpKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycyk7CkBAIC00Niw2ICs0OCw2IEBACiBleHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX3Bwcm9fc3BlYzsKIGV4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfc3BlYzsKIGV4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfaHQyX3NwZWM7Ci1leHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2F0aGxvbl9zcGVjOworZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9hbWRfc3BlYzsKIAogI2VuZGlmIC8qIE9QX1g4Nl9NT0RFTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCAxOWFmMDY5Li4xZDg4ZDJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTI1MCwxMCArMjUwLDUgQEAKIAkJCWFjcGlfcGNpX2lycV9lbmFibGUoZGV2KTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlpZiAoYWNwaV9pb2FwaWMpCi0JCXByaW50X0lPX0FQSUMoKTsKLSNlbmRpZgotCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwppbmRleCA2YTBmY2E3Li4yMmUwNTc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCisrKyBiL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKQEAgLTU4MCw3ICs1ODAsNyBAQAogCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlpbnQgY3B1ID0gKGxvbmcpaGNwdTsKLQlzd2l0Y2goYWN0aW9uKSB7CisJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6CiAJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZW5hYmxlX3BjaV9pb19lY3MsIE5VTEwsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwppbmRleCA0YmRhYTU5Li4zYzI3YTgwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvZml4dXAuYworKysgYi9hcmNoL3g4Ni9wY2kvZml4dXAuYwpAQCAtNTExLDMgKzUxMSwzMSBAQAogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQU1ELCAweDEyMDIsIGZhbTEwaF9wY2lfY2ZnX3NwYWNlX3NpemUpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQU1ELCAweDEyMDMsIGZhbTEwaF9wY2lfY2ZnX3NwYWNlX3NpemUpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQU1ELCAweDEyMDQsIGZhbTEwaF9wY2lfY2ZnX3NwYWNlX3NpemUpOworCisvKgorICogU0I2MDA6IERpc2FibGUgQkFSMSBvbiBkZXZpY2UgMTQuMCB0byBhdm9pZCBIUEVUIHJlc291cmNlcyBmcm9tCisgKiBjb25mdXNpbmcgdGhlIFBDSSBlbmdpbmU6CisgKi8KK3N0YXRpYyB2b2lkIHNiNjAwX2Rpc2FibGVfaHBldF9iYXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCB2YWw7CisKKwkvKgorCSAqIFRoZSBTQjYwMCBhbmQgU0I3MDAgYm90aCBzaGFyZSB0aGUgc2FtZSBkZXZpY2UKKwkgKiBJRCwgYnV0IHRoZSBQTSByZWdpc3RlciAweDU1IGRvZXMgc29tZXRoaW5nIGRpZmZlcmVudAorCSAqIGZvciB0aGUgU0I3MDAsIHNvIG1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZQorCSAqIFNCNjAwIGJlZm9yZSB0b3VjaGluZyB0aGUgYml0OgorCSAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDA4LCAmdmFsKTsKKworCWlmICh2YWwgPCAweDJGKSB7CisJCW91dGIoMHg1NSwgMHhDRDYpOworCQl2YWwgPSBpbmIoMHhDRDcpOworCisJCS8qIFNldCBiaXQgNyBpbiBQTSByZWdpc3RlciAweDU1ICovCisJCW91dGIoMHg1NSwgMHhDRDYpOworCQlvdXRiKHZhbCB8IDB4ODAsIDB4Q0Q3KTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0FUSSwgMHg0Mzg1LCBzYjYwMF9kaXNhYmxlX2hwZXRfYmFyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pMzg2LmMgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCmluZGV4IDg3OTFmYzUuLjg0NGRmMGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pMzg2LmMKKysrIGIvYXJjaC94ODYvcGNpL2kzODYuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9wYXQuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgogCiAjaW5jbHVkZSAicGNpLmgiCiAKQEAgLTIyNyw2ICsyMjgsOCBAQAogCXBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcygmcGNpX3Jvb3RfYnVzZXMpOwogCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDApOwogCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDEpOworCisJZTgyMF9yZXNlcnZlX3Jlc291cmNlc19sYXRlKCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDhlMDc3MTguLjAwNjU5OWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTEwNDMsMzUgKzEwNDMsNDQgQEAKIAkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKSB7CiAJCQlpbnQgaXJxOwogCi0JCQlpZiAocGluKSB7Ci0JCQkJLyoKLQkJCQkgKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcKLQkJCQkgKiBmcm9tIDEKLQkJCQkgKi8KLQkJCQlwaW4tLTsKLQkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihkZXYtPmJ1cy0+bnVtYmVyLAotCQkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluKTsKLQkvKgotCSAqIEJ1c3NlcyBiZWhpbmQgYnJpZGdlcyBhcmUgdHlwaWNhbGx5IG5vdCBsaXN0ZWQgaW4gdGhlIE1QLXRhYmxlLgotCSAqIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUSBiYXNlZCBvbiB0aGUgcGFyZW50IGJ1cywKLQkgKiBwYXJlbnQgc2xvdCwgYW5kIHBpbiBudW1iZXIuIFRoZSBTTVAgY29kZSBkZXRlY3RzIHN1Y2ggYnJpZGdlZAotCSAqIGJ1c3NlcyBpdHNlbGYgc28gd2Ugc2hvdWxkIGdldCBpbnRvIHRoaXMgYnJhbmNoIHJlbGlhYmx5LgotCSAqLwotCQkJCWlmIChpcnEgPCAwICYmIGRldi0+YnVzLT5wYXJlbnQpIHsgLyogZ28gYmFjayB0byB0aGUgYnJpZGdlICovCi0JCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKKwkJCWlmICghcGluKQorCQkJCWNvbnRpbnVlOwogCi0JCQkJCXBpbiA9IChwaW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSkgJSA0OwotCQkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihicmlkZ2UtPmJ1cy0+bnVtYmVyLAotCQkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4pOwotCQkJCQlpZiAoaXJxID49IDApCi0JCQkJCQlkZXZfd2FybigmZGV2LT5kZXYsICJ1c2luZyBicmlkZ2UgJXMgSU5UICVjIHRvIGdldCBJUlEgJWRcbiIsCi0JCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksCi0JCQkJCQkJICdBJyArIHBpbiwgaXJxKTsKLQkJCQl9Ci0JCQkJaWYgKGlycSA+PSAwKSB7Ci0JCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiBJTlQgJWMgLT4gSVJRICVkXG4iLCAnQScgKyBwaW4sIGlycSk7Ci0JCQkJCWRldi0+aXJxID0gaXJxOwotCQkJCX0KKwkJCS8qCisJCQkgKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxCisJCQkgKi8KKwkJCXBpbi0tOworCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwKKwkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluKTsKKwkJCS8qCisJCQkgKiBCdXNzZXMgYmVoaW5kIGJyaWRnZXMgYXJlIHR5cGljYWxseSBub3QgbGlzdGVkIGluIHRoZQorCQkJICogTVAtdGFibGUuICBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEKKwkJCSAqIGJhc2VkIG9uIHRoZSBwYXJlbnQgYnVzLCBwYXJlbnQgc2xvdCwgYW5kIHBpbiBudW1iZXIuCisJCQkgKiBUaGUgU01QIGNvZGUgZGV0ZWN0cyBzdWNoIGJyaWRnZWQgYnVzc2VzIGl0c2VsZiBzbyB3ZQorCQkJICogc2hvdWxkIGdldCBpbnRvIHRoaXMgYnJhbmNoIHJlbGlhYmx5LgorCQkJICovCisJCQlpZiAoaXJxIDwgMCAmJiBkZXYtPmJ1cy0+cGFyZW50KSB7CisJCQkJLyogZ28gYmFjayB0byB0aGUgYnJpZGdlICovCisJCQkJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOworCQkJCWludCBidXM7CisKKwkJCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNDsKKwkJCQlidXMgPSBicmlkZ2UtPmJ1cy0+bnVtYmVyOworCQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGJ1cywKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4pOworCQkJCWlmIChpcnEgPj0gMCkKKwkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJCQkJInVzaW5nIGJyaWRnZSAlcyBJTlQgJWMgdG8gIgorCQkJCQkJCSJnZXQgSVJRICVkXG4iLAorCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksCisJCQkJCQkgJ0EnICsgcGluLCBpcnEpOworCQkJfQorCQkJaWYgKGlycSA+PSAwKSB7CisJCQkJZGV2X2luZm8oJmRldi0+ZGV2LAorCQkJCQkiUENJLT5BUElDIElSUSB0cmFuc2Zvcm06IElOVCAlYyAiCisJCQkJCQkiLT4gSVJRICVkXG4iLAorCQkJCQknQScgKyBwaW4sIGlycSk7CisJCQkJZGV2LT5pcnEgPSBpcnE7CiAJCQl9CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL21tY29uZmlnLXNoYXJlZC5jIGIvYXJjaC94ODYvcGNpL21tY29uZmlnLXNoYXJlZC5jCmluZGV4IGQ5NjM1NzYuLjY1NGEyMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZy1zaGFyZWQuYworKysgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCXJldHVybiBuYW1lICE9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcyh1bnNpZ25lZCBsb25nIHJlc291cmNlX2ZsYWdzKQorc3RhdGljIHZvaWQgX19pbml0IHBjaV9tbWNmZ19pbnNlcnRfcmVzb3VyY2VzKHZvaWQpCiB7CiAjZGVmaW5lIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiAxOQogCWludCBpOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkgY2ZnLT5wY2lfc2VnbWVudCk7CiAJCXJlcy0+c3RhcnQgPSBjZmctPmFkZHJlc3M7CiAJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIChudW1fYnVzZXMgPDwgMjApIC0gMTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgcmVzb3VyY2VfZmxhZ3M7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKIAkJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAkJbmFtZXMgKz0gUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOOwogCX0KQEAgLTQzNCwxMSArNDM0LDkgQEAKIAkgICAgKHBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcyA9PSAwKSkKIAkJcmV0dXJuOwogCi0JaWYgKHBjaV9tbWNmZ19hcmNoX2luaXQoKSkgewotCQlpZiAoa25vd25fYnJpZGdlKQotCQkJcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXMoSU9SRVNPVVJDRV9CVVNZKTsKKwlpZiAocGNpX21tY2ZnX2FyY2hfaW5pdCgpKQogCQlwY2lfcHJvYmUgPSAocGNpX3Byb2JlICYgflBDSV9QUk9CRV9NQVNLKSB8IFBDSV9QUk9CRV9NTUNPTkY7Ci0JfSBlbHNlIHsKKwllbHNlIHsKIAkJLyoKIAkJICogU2lnbmFsIG5vdCB0byBhdHRlbXB0IHRvIGluc2VydCBtbWNmZyByZXNvdXJjZXMgYmVjYXVzZQogCQkgKiB0aGUgYXJjaGl0ZWN0dXJlIG1tY2ZnIHNldHVwIGNvdWxkIG5vdCBpbml0aWFsaXplLgpAQCAtNDc1LDcgKzQ3Myw3IEBACiAJICogbWFya2VkIHNvIGl0IHdvbid0IGNhdXNlIHJlcXVlc3QgZXJyb3JzIHdoZW4gX19yZXF1ZXN0X3JlZ2lvbiBpcwogCSAqIGNhbGxlZC4KIAkgKi8KLQlwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcygwKTsKKwlwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcygpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wb3dlci9jcHVfMzIuYyBiL2FyY2gveDg2L3Bvd2VyL2NwdV8zMi5jCmluZGV4IGQzZTA4M2QuLjI3NGQwNjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Bvd2VyL2NwdV8zMi5jCisrKyBiL2FyY2gveDg2L3Bvd2VyL2NwdV8zMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL21jZS5oPgorI2luY2x1ZGUgPGFzbS94Y3IuaD4KIAogc3RhdGljIHN0cnVjdCBzYXZlZF9jb250ZXh0IHNhdmVkX2NvbnRleHQ7CiAKQEAgLTEyNiw2ICsxMjcsMTIgQEAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkpCiAJCWVuYWJsZV9zZXBfY3B1KCk7CiAKKwkvKgorCSAqIHJlc3RvcmUgWENSMCBmb3IgeHNhdmUgY2FwYWJsZSBjcHUncy4KKwkgKi8KKwlpZiAoY3B1X2hhc194c2F2ZSkKKwkJeHNldGJ2KFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0ssIHBjbnR4dF9tYXNrKTsKKwogCWZpeF9wcm9jZXNzb3JfY29udGV4dCgpOwogCWRvX2ZwdV9lbmQoKTsKIAltdHJyX2FwX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Bvd2VyL2NwdV82NC5jIGIvYXJjaC94ODYvcG93ZXIvY3B1XzY0LmMKaW5kZXggNjZiZGZiNS4uZTNiNmNmNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcG93ZXIvY3B1XzY0LmMKKysrIGIvYXJjaC94ODYvcG93ZXIvY3B1XzY0LmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20veGNyLmg+CiAKIHN0YXRpYyB2b2lkIGZpeF9wcm9jZXNzb3JfY29udGV4dCh2b2lkKTsKIApAQCAtMTIyLDYgKzEyMywxMiBAQAogCXdybXNybChNU1JfR1NfQkFTRSwgY3R4dC0+Z3NfYmFzZSk7CiAJd3Jtc3JsKE1TUl9LRVJORUxfR1NfQkFTRSwgY3R4dC0+Z3Nfa2VybmVsX2Jhc2UpOwogCisJLyoKKwkgKiByZXN0b3JlIFhDUjAgZm9yIHhzYXZlIGNhcGFibGUgY3B1J3MuCisJICovCisJaWYgKGNwdV9oYXNfeHNhdmUpCisJCXhzZXRidihYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLLCBwY250eHRfbWFzayk7CisKIAlmaXhfcHJvY2Vzc29yX2NvbnRleHQoKTsKIAogCWRvX2ZwdV9lbmQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV9hc21fMzIuUyBiL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV9hc21fMzIuUwppbmRleCA0ZmM3ZTg3Li5kMWU5YjUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9oaWJlcm5hdGVfYXNtXzMyLlMKKysrIGIvYXJjaC94ODYvcG93ZXIvaGliZXJuYXRlX2FzbV8zMi5TCkBAIC0xLDUgKzEsMyBAQAotLnRleHQKLQogLyoKICAqIFRoaXMgbWF5IG5vdCB1c2UgYW55IHN0YWNrLCBub3IgYW55IHZhcmlhYmxlIHRoYXQgaXMgbm90ICJOb1NhdmUiOgogICoKQEAgLTEyLDE3ICsxMCwxOCBAQAogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAKLQkudGV4dAorLnRleHQKIAogRU5UUlkoc3dzdXNwX2FyY2hfc3VzcGVuZCkKLQogCW1vdmwgJWVzcCwgc2F2ZWRfY29udGV4dF9lc3AKIAltb3ZsICVlYngsIHNhdmVkX2NvbnRleHRfZWJ4CiAJbW92bCAlZWJwLCBzYXZlZF9jb250ZXh0X2VicAogCW1vdmwgJWVzaSwgc2F2ZWRfY29udGV4dF9lc2kKIAltb3ZsICVlZGksIHNhdmVkX2NvbnRleHRfZWRpCi0JcHVzaGZsIDsgcG9wbCBzYXZlZF9jb250ZXh0X2VmbGFncworCXB1c2hmbAorCXBvcGwgc2F2ZWRfY29udGV4dF9lZmxhZ3MKIAogCWNhbGwgc3dzdXNwX3NhdmUKIAlyZXQKQEAgLTU5LDcgKzU4LDcgQEAKIAltb3ZsCW1tdV9jcjRfZmVhdHVyZXMsICVlY3gKIAlqZWN4egkxZgkjIGNyNCBQZW50aXVtIGFuZCBoaWdoZXIsIHNraXAgaWYgemVybwogCW1vdmwJJWVjeCwgJWVkeAotCWFuZGwJJH4oMTw8NyksICVlZHg7ICAjIFBHRQorCWFuZGwJJH4oWDg2X0NSNF9QR0UpLCAlZWR4CiAJbW92bAklZWR4LCAlY3I0OyAgIyB0dXJuIG9mZiBQR0UKIDE6CiAJbW92bAklY3IzLCAlZWF4OyAgIyBmbHVzaCBUTEIKQEAgLTc0LDcgKzczLDggQEAKIAltb3ZsIHNhdmVkX2NvbnRleHRfZXNpLCAlZXNpCiAJbW92bCBzYXZlZF9jb250ZXh0X2VkaSwgJWVkaQogCi0JcHVzaGwgc2F2ZWRfY29udGV4dF9lZmxhZ3MgOyBwb3BmbAorCXB1c2hsIHNhdmVkX2NvbnRleHRfZWZsYWdzCisJcG9wZmwKIAogCXhvcmwJJWVheCwgJWVheAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCmluZGV4IDM4MTVlNDIuLjg3YjlhYjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9LY29uZmlnCisrKyBiL2FyY2gveDg2L3hlbi9LY29uZmlnCkBAIC0yNiw1ICsyNiwxMyBAQAogCiBjb25maWcgWEVOX1NBVkVfUkVTVE9SRQogICAgICAgIGJvb2wKLSAgICAgICBkZXBlbmRzIG9uIFBNCi0gICAgICAgZGVmYXVsdCB5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgIGRlcGVuZHMgb24gWEVOICYmIFBNCisgICAgICAgZGVmYXVsdCB5CisKK2NvbmZpZyBYRU5fREVCVUdfRlMKKwlib29sICJFbmFibGUgWGVuIGRlYnVnIGFuZCB0dW5pbmcgcGFyYW1ldGVycyBpbiBkZWJ1Z2ZzIgorCWRlcGVuZHMgb24gWEVOICYmIERFQlVHX0ZTCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHN0YXRpc3RpY3Mgb3V0cHV0IGFuZCB2YXJpb3VzIHR1bmluZyBvcHRpb25zIGluIGRlYnVnZnMuCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgaW5jdXIgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBvdmVyaGVhZC4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZSBiL2FyY2gveDg2L3hlbi9NYWtlZmlsZQppbmRleCA1OWMxZTUzLi4zMTM5NDc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCkBAIC0xLDQgKzEsMTIgQEAKLW9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2FsbHMubyBtbXUubyBcCitpZmRlZiBDT05GSUdfRlRSQUNFCisjIERvIG5vdCBwcm9maWxlIGRlYnVnIGFuZCBsb3dsZXZlbCB1dGlsaXRpZXMKK0NGTEFHU19SRU1PVkVfc3BpbmxvY2subyA9IC1wZworQ0ZMQUdTX1JFTU9WRV90aW1lLm8gPSAtcGcKK0NGTEFHU19SRU1PVkVfaXJxLm8gPSAtcGcKK2VuZGlmCisKK29iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2FsbHMubyBtbXUubyBpcnEubyBcCiAJCQl0aW1lLm8geGVuLWFzbV8kKEJJVFMpLm8gZ3JhbnQtdGFibGUubyBzdXNwZW5kLm8KIAotb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KK29iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzcGlubG9jay5vCitvYmotJChDT05GSUdfWEVOX0RFQlVHX0ZTKQkrPSBkZWJ1Z2ZzLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZGVidWdmcy5jIGIvYXJjaC94ODYveGVuL2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMyMjVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYveGVuL2RlYnVnZnMuYwpAQCAtMCwwICsxLDEyMyBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX3hlbl9kZWJ1ZzsKKworc3RydWN0IGRlbnRyeSAqIF9faW5pdCB4ZW5faW5pdF9kZWJ1Z2ZzKHZvaWQpCit7CisJaWYgKCFkX3hlbl9kZWJ1ZykgeworCQlkX3hlbl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigieGVuIiwgTlVMTCk7CisKKwkJaWYgKCFkX3hlbl9kZWJ1ZykKKwkJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgJ3hlbicgZGVidWdmcyBkaXJlY3RvcnlcbiIpOworCX0KKworCXJldHVybiBkX3hlbl9kZWJ1ZzsKK30KKworc3RydWN0IGFycmF5X2RhdGEKK3sKKwl2b2lkICphcnJheTsKKwl1bnNpZ25lZCBlbGVtZW50czsKK307CisKK3N0YXRpYyBpbnQgdTMyX2FycmF5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZm9ybWF0X2FycmF5KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKmZtdCwKKwkJCSAgIHUzMiAqYXJyYXksIHVuc2lnbmVkIGFycmF5X3NpemUpCit7CisJc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgaTsKKworCWZvcihpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykgeworCQlzaXplX3QgbGVuOworCisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgZm10LCBhcnJheVtpXSk7CisJCWxlbisrOwkvKiAnICcgb3IgJ1xuJyAqLworCQlyZXQgKz0gbGVuOworCisJCWlmIChidWYpIHsKKwkJCWJ1ZiArPSBsZW47CisJCQlidWZzaXplIC09IGxlbjsKKwkJCWJ1ZlstMV0gPSAoaSA9PSBhcnJheV9zaXplLTEpID8gJ1xuJyA6ICcgJzsKKwkJfQorCX0KKworCXJldCsrOwkJLyogXDAgKi8KKwlpZiAoYnVmKQorCQkqYnVmID0gJ1wwJzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyICpmb3JtYXRfYXJyYXlfYWxsb2MoY29uc3QgY2hhciAqZm10LCB1MzIgKmFycmF5LCB1bnNpZ25lZCBhcnJheV9zaXplKQoreworCXNpemVfdCBsZW4gPSBmb3JtYXRfYXJyYXkoTlVMTCwgMCwgZm10LCBhcnJheSwgYXJyYXlfc2l6ZSk7CisJY2hhciAqcmV0OworCisJcmV0ID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JtYXRfYXJyYXkocmV0LCBsZW4sIGZtdCwgYXJyYXksIGFycmF5X3NpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHUzMl9hcnJheV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkJICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBhcnJheV9kYXRhICpkYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzaXplX3Qgc2l6ZTsKKworCWlmICgqcHBvcyA9PSAwKSB7CisJCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKKwkJCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQl9CisKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZm9ybWF0X2FycmF5X2FsbG9jKCIldSIsIGRhdGEtPmFycmF5LCBkYXRhLT5lbGVtZW50cyk7CisJfQorCisJc2l6ZSA9IDA7CisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkKKwkJc2l6ZSA9IHN0cmxlbihmaWxlLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBwcG9zLCBmaWxlLT5wcml2YXRlX2RhdGEsIHNpemUpOworfQorCitzdGF0aWMgaW50IHhlbl9hcnJheV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdTMyX2FycmF5X2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JPSB1MzJfYXJyYXlfb3BlbiwKKwkucmVsZWFzZT0geGVuX2FycmF5X3JlbGVhc2UsCisJLnJlYWQJPSB1MzJfYXJyYXlfcmVhZCwKK307CisKK3N0cnVjdCBkZW50cnkgKnhlbl9kZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJCSAgICB1MzIgKmFycmF5LCB1bnNpZ25lZCBlbGVtZW50cykKK3sKKwlzdHJ1Y3QgYXJyYXlfZGF0YSAqZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWRhdGEtPmFycmF5ID0gYXJyYXk7CisJZGF0YS0+ZWxlbWVudHMgPSBlbGVtZW50czsKKworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgZGF0YSwgJnUzMl9hcnJheV9mb3BzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9kZWJ1Z2ZzLmggYi9hcmNoL3g4Ni94ZW4vZGVidWdmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODEzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni94ZW4vZGVidWdmcy5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1hFTl9ERUJVR0ZTX0gKKyNkZWZpbmUgX1hFTl9ERUJVR0ZTX0gKKworc3RydWN0IGRlbnRyeSAqIF9faW5pdCB4ZW5faW5pdF9kZWJ1Z2ZzKHZvaWQpOworCitzdHJ1Y3QgZGVudHJ5ICp4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCQkgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCQkgICAgdTMyICphcnJheSwgdW5zaWduZWQgZWxlbWVudHMpOworCisjZW5kaWYgLyogX1hFTl9ERUJVR0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCA5ZmY2ZTNjLi4wMDEzYTcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0zMCwxMiArMzAsMTIgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvcGh5c2Rldi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmNwdS5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2Uvc2NoZWQuaD4KICNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CkBAIC01Nyw2ICs1Nyw5IEBACiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdmNwdV9pbmZvICosIHhlbl92Y3B1KTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2Y3B1X2luZm8sIHhlbl92Y3B1X2luZm8pOwogCitlbnVtIHhlbl9kb21haW5fdHlwZSB4ZW5fZG9tYWluX3R5cGUgPSBYRU5fTkFUSVZFOworRVhQT1JUX1NZTUJPTF9HUEwoeGVuX2RvbWFpbl90eXBlKTsKKwogLyoKICAqIElkZW50aXR5IG1hcCwgaW4gYWRkaXRpb24gdG8gcGxhaW4ga2VybmVsIG1hcC4gIFRoaXMgbmVlZHMgdG8gYmUKICAqIGxhcmdlIGVub3VnaCB0byBhbGxvY2F0ZSBwYWdlIHRhYmxlIHBhZ2VzIHRvIGFsbG9jYXRlIHRoZSByZXN0LgpAQCAtMTEwLDcgKzExMywxNCBAQAogICoKICAqIDA6IG5vdCBhdmFpbGFibGUsIDE6IGF2YWlsYWJsZQogICovCi1zdGF0aWMgaW50IGhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCA9IDE7CitzdGF0aWMgaW50IGhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCA9CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCTEKKyNlbHNlCisJMAorI2VuZGlmCisJOworCiAKIHN0YXRpYyB2b2lkIHhlbl92Y3B1X3NldHVwKGludCBjcHUpCiB7CkBAIC0yMjYsOTQgKzIzNiw2IEBACiAJcmV0dXJuIEhZUEVSVklTT1JfZ2V0X2RlYnVncmVnKHJlZyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9zYXZlX2ZsKHZvaWQpCi17Ci0Jc3RydWN0IHZjcHVfaW5mbyAqdmNwdTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JdmNwdSA9IHg4Nl9yZWFkX3BlcmNwdSh4ZW5fdmNwdSk7Ci0KLQkvKiBmbGFnIGhhcyBvcHBvc2l0ZSBzZW5zZSBvZiBtYXNrICovCi0JZmxhZ3MgPSAhdmNwdS0+ZXZ0Y2huX3VwY2FsbF9tYXNrOwotCi0JLyogY29udmVydCB0byBJRiB0eXBlIGZsYWcKLQkgICAtMCAtPiAweDAwMDAwMDAwCi0JICAgLTEgLT4gMHhmZmZmZmZmZgotCSovCi0JcmV0dXJuICgtZmxhZ3MpICYgWDg2X0VGTEFHU19JRjsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3Jlc3RvcmVfZmwodW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1OwotCi0JLyogY29udmVydCBmcm9tIElGIHR5cGUgZmxhZyAqLwotCWZsYWdzID0gIShmbGFncyAmIFg4Nl9FRkxBR1NfSUYpOwotCi0JLyogVGhlcmUncyBhIG9uZSBpbnN0cnVjdGlvbiBwcmVlbXB0IHdpbmRvdyBoZXJlLiAgV2UgbmVlZCB0bwotCSAgIG1ha2Ugc3VyZSB3ZSdyZSBkb24ndCBzd2l0Y2ggQ1BVcyBiZXR3ZWVuIGdldHRpbmcgdGhlIHZjcHUKLQkgICBwb2ludGVyIGFuZCB1cGRhdGluZyB0aGUgbWFzay4gKi8KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQl2Y3B1ID0geDg2X3JlYWRfcGVyY3B1KHhlbl92Y3B1KTsKLQl2Y3B1LT5ldnRjaG5fdXBjYWxsX21hc2sgPSBmbGFnczsKLQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7Ci0KLQkvKiBEb2Vzbid0IG1hdHRlciBpZiB3ZSBnZXQgcHJlZW1wdGVkIGhlcmUsIGJlY2F1c2UgYW55Ci0JICAgcGVuZGluZyBldmVudCB3aWxsIGdldCBkZWFsdCB3aXRoIGFueXdheS4gKi8KLQotCWlmIChmbGFncyA9PSAwKSB7Ci0JCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOwotCQliYXJyaWVyKCk7IC8qIHVubWFzayB0aGVuIGNoZWNrIChhdm9pZCByYWNlcykgKi8KLQkJaWYgKHVubGlrZWx5KHZjcHUtPmV2dGNobl91cGNhbGxfcGVuZGluZykpCi0JCQlmb3JjZV9ldnRjaG5fY2FsbGJhY2soKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9pcnFfZGlzYWJsZSh2b2lkKQotewotCS8qIFRoZXJlJ3MgYSBvbmUgaW5zdHJ1Y3Rpb24gcHJlZW1wdCB3aW5kb3cgaGVyZS4gIFdlIG5lZWQgdG8KLQkgICBtYWtlIHN1cmUgd2UncmUgZG9uJ3Qgc3dpdGNoIENQVXMgYmV0d2VlbiBnZXR0aW5nIHRoZSB2Y3B1Ci0JICAgcG9pbnRlciBhbmQgdXBkYXRpbmcgdGhlIG1hc2suICovCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JeDg2X3JlYWRfcGVyY3B1KHhlbl92Y3B1KS0+ZXZ0Y2huX3VwY2FsbF9tYXNrID0gMTsKLQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9pcnFfZW5hYmxlKHZvaWQpCi17Ci0Jc3RydWN0IHZjcHVfaW5mbyAqdmNwdTsKLQotCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYmVpbmcgcHJlZW1wdGVkIGhlcmUsIHNpbmNlCi0JICAgZWl0aGVyIGEpIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBzbyBubyBwcmVlbXB0aW9uLCBvciBiKQotCSAgIHRoZSBjYWxsZXIgaXMgY29uZnVzZWQgYW5kIGlzIHRyeWluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cwotCSAgIG9uIGFuIGluZGV0ZXJtaW5hdGUgcHJvY2Vzc29yLiAqLwotCi0JdmNwdSA9IHg4Nl9yZWFkX3BlcmNwdSh4ZW5fdmNwdSk7Ci0JdmNwdS0+ZXZ0Y2huX3VwY2FsbF9tYXNrID0gMDsKLQotCS8qIERvZXNuJ3QgbWF0dGVyIGlmIHdlIGdldCBwcmVlbXB0ZWQgaGVyZSwgYmVjYXVzZSBhbnkKLQkgICBwZW5kaW5nIGV2ZW50IHdpbGwgZ2V0IGRlYWx0IHdpdGggYW55d2F5LiAqLwotCi0JYmFycmllcigpOyAvKiB1bm1hc2sgdGhlbiBjaGVjayAoYXZvaWQgcmFjZXMpICovCi0JaWYgKHVubGlrZWx5KHZjcHUtPmV2dGNobl91cGNhbGxfcGVuZGluZykpCi0JCWZvcmNlX2V2dGNobl9jYWxsYmFjaygpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fc2FmZV9oYWx0KHZvaWQpCi17Ci0JLyogQmxvY2tpbmcgaW5jbHVkZXMgYW4gaW1wbGljaXQgbG9jYWxfaXJxX2VuYWJsZSgpLiAqLwotCWlmIChIWVBFUlZJU09SX3NjaGVkX29wKFNDSEVET1BfYmxvY2ssIE5VTEwpICE9IDApCi0JCUJVRygpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5faGFsdCh2b2lkKQotewotCWlmIChpcnFzX2Rpc2FibGVkKCkpCi0JCUhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93biwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBOVUxMKTsKLQllbHNlCi0JCXhlbl9zYWZlX2hhbHQoKTsKLX0KLQogc3RhdGljIHZvaWQgeGVuX2xlYXZlX2xhenkodm9pZCkKIHsKIAlwYXJhdmlydF9sZWF2ZV9sYXp5KHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSk7CkBAIC0zMjUsNiArMjQ3LDU5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBTZXQgdGhlIHBhZ2UgcGVybWlzc2lvbnMgZm9yIGEgcGFydGljdWxhciB2aXJ0dWFsIGFkZHJlc3MuICBJZiB0aGUKKyAqIGFkZHJlc3MgaXMgYSB2bWFsbG9jIG1hcHBpbmcgKG9yIG90aGVyIG5vbi1saW5lYXIgbWFwcGluZyksIHRoZW4KKyAqIGZpbmQgdGhlIGxpbmVhciBtYXBwaW5nIG9mIHRoZSBwYWdlIGFuZCBhbHNvIHNldCBpdHMgcHJvdGVjdGlvbnMgdG8KKyAqIG1hdGNoLgorICovCitzdGF0aWMgdm9pZCBzZXRfYWxpYXNlZF9wcm90KHZvaWQgKnYsIHBncHJvdF90IHByb3QpCit7CisJaW50IGxldmVsOworCXB0ZV90ICpwdGVwOworCXB0ZV90IHB0ZTsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXB0ZXAgPSBsb29rdXBfYWRkcmVzcygodW5zaWduZWQgbG9uZyl2LCAmbGV2ZWwpOworCUJVR19PTihwdGVwID09IE5VTEwpOworCisJcGZuID0gcHRlX3BmbigqcHRlcCk7CisJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKKwlwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7CisKKwlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygodW5zaWduZWQgbG9uZyl2LCBwdGUsIDApKQorCQlCVUcoKTsKKworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJdm9pZCAqYXYgPSBfX3ZhKFBGTl9QSFlTKHBmbikpOworCisJCWlmIChhdiAhPSB2KQorCQkJaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoKHVuc2lnbmVkIGxvbmcpYXYsIHB0ZSwgMCkpCisJCQkJQlVHKCk7CisJfSBlbHNlCisJCWttYXBfZmx1c2hfdW51c2VkKCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9hbGxvY19sZHQoc3RydWN0IGRlc2Nfc3RydWN0ICpsZHQsIHVuc2lnbmVkIGVudHJpZXMpCit7CisJY29uc3QgdW5zaWduZWQgZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIExEVF9FTlRSWV9TSVpFOworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgZW50cmllczsgaSArPSBlbnRyaWVzX3Blcl9wYWdlKQorCQlzZXRfYWxpYXNlZF9wcm90KGxkdCArIGksIFBBR0VfS0VSTkVMX1JPKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2ZyZWVfbGR0KHN0cnVjdCBkZXNjX3N0cnVjdCAqbGR0LCB1bnNpZ25lZCBlbnRyaWVzKQoreworCWNvbnN0IHVuc2lnbmVkIGVudHJpZXNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBMRFRfRU5UUllfU0laRTsKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0gZW50cmllc19wZXJfcGFnZSkKKwkJc2V0X2FsaWFzZWRfcHJvdChsZHQgKyBpLCBQQUdFX0tFUk5FTCk7Cit9CisKIHN0YXRpYyB2b2lkIHhlbl9zZXRfbGR0KGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGVudHJpZXMpCiB7CiAJc3RydWN0IG1tdWV4dF9vcCAqb3A7CkBAIC00MjUsOCArNDAwLDcgQEAKIHN0YXRpYyB2b2lkIHhlbl93cml0ZV9sZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5bnVtLAogCQkJCWNvbnN0IHZvaWQgKnB0cikKIHsKLQl1bnNpZ25lZCBsb25nIGxwID0gKHVuc2lnbmVkIGxvbmcpJmR0W2VudHJ5bnVtXTsKLQl4bWFkZHJfdCBtYWNoX2xwID0gdmlydF90b19tYWNoaW5lKGxwKTsKKwl4bWFkZHJfdCBtYWNoX2xwID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSgmZHRbZW50cnludW1dKTsKIAl1NjQgZW50cnkgPSAqKHU2NCAqKXB0cjsKIAogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtNTU5LDcgKzUzMyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHhlbl9sb2FkX3NwMChzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzLAotCQkJICBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkKQorCQkJIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCiB7CiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3MgPSB4ZW5fbWNfZW50cnkoMCk7CiAJTVVMVElfc3RhY2tfc3dpdGNoKG1jcy5tYywgX19LRVJORUxfRFMsIHRocmVhZC0+c3AwKTsKQEAgLTU4MCwxNiArNTU0LDQ3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLXN0YXRpYyB1MzIgeGVuX2FwaWNfcmVhZCh1bnNpZ25lZCBsb25nIHJlZykKK3N0YXRpYyB1MzIgeGVuX2FwaWNfcmVhZCh1MzIgcmVnKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5fYXBpY193cml0ZSh1bnNpZ25lZCBsb25nIHJlZywgdTMyIHZhbCkKK3N0YXRpYyB2b2lkIHhlbl9hcGljX3dyaXRlKHUzMiByZWcsIHUzMiB2YWwpCiB7CiAJLyogV2FybiB0byBzZWUgaWYgdGhlcmUncyBhbnkgc3RyYXkgcmVmZXJlbmNlcyAqLwogCVdBUk5fT04oMSk7CiB9CisKK3N0YXRpYyB1NjQgeGVuX2FwaWNfaWNyX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGVuX2FwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCkKK3sKKwkvKiBXYXJuIHRvIHNlZSBpZiB0aGVyZSdzIGFueSBzdHJheSByZWZlcmVuY2VzICovCisJV0FSTl9PTigxKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2FwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQoreworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB1MzIgeGVuX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlKHZvaWQpCit7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFwaWNfb3BzIHhlbl9iYXNpY19hcGljX29wcyA9IHsKKwkucmVhZCA9IHhlbl9hcGljX3JlYWQsCisJLndyaXRlID0geGVuX2FwaWNfd3JpdGUsCisJLmljcl9yZWFkID0geGVuX2FwaWNfaWNyX3JlYWQsCisJLmljcl93cml0ZSA9IHhlbl9hcGljX2ljcl93cml0ZSwKKwkud2FpdF9pY3JfaWRsZSA9IHhlbl9hcGljX3dhaXRfaWNyX2lkbGUsCisJLnNhZmVfd2FpdF9pY3JfaWRsZSA9IHhlbl9zYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSwKK307CisKICNlbmRpZgogCiBzdGF0aWMgdm9pZCB4ZW5fZmx1c2hfdGxiKHZvaWQpCkBAIC04MDMsNiArODA4LDE5IEBACiAJCQlyZXQgPSAtRUZBVUxUOwogCQlicmVhazsKICNlbmRpZgorCisJY2FzZSBNU1JfU1RBUjoKKwljYXNlIE1TUl9DU1RBUjoKKwljYXNlIE1TUl9MU1RBUjoKKwljYXNlIE1TUl9TWVNDQUxMX01BU0s6CisJY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9DUzoKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VTUDoKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VJUDoKKwkJLyogRmFzdCBzeXNjYWxsIHNldHVwIGlzIGFsbCBkb25lIGluIGh5cGVyY2FsbHMsIHNvCisJCSAgIHRoZXNlIGFyZSBhbGwgaWdub3JlZC4gIFN0dWIgdGhlbSBvdXQgaGVyZSB0byBzdG9wCisJCSAgIFhlbiBjb25zb2xlIG5vaXNlLiAqLworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldCA9IG5hdGl2ZV93cml0ZV9tc3Jfc2FmZShtc3IsIGxvdywgaGlnaCk7CiAJfQpAQCAtODEyLDcgKzgzMCw3IEBACiAKIC8qIEVhcmx5IGluIGJvb3QsIHdoaWxlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwgcGFnZXRhYmxlLCBhc3N1bWUKICAgIGV2ZXJ5dGhpbmcgaXMgcGlubmVkLiAqLwotc3RhdGljIF9faW5pdCB2b2lkIHhlbl9hbGxvY19wdGVfaW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKK3N0YXRpYyBfX2luaXQgdm9pZCB4ZW5fYWxsb2NfcHRlX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQogewogI2lmZGVmIENPTkZJR19GTEFUTUVNCiAJQlVHX09OKG1lbV9tYXApOwkvKiBzaG91bGQgb25seSBiZSB1c2VkIGVhcmx5ICovCkBAIC04MjIsNyArODQwLDcgQEAKIAogLyogRWFybHkgcmVsZWFzZV9wdGUgYXNzdW1lcyB0aGF0IGFsbCBwdHMgYXJlIHBpbm5lZCwgc2luY2UgdGhlcmUncwogICAgb25seSBpbml0X21tIGFuZCBhbnl0aGluZyBhdHRhY2hlZCB0byB0aGF0IGlzIHBpbm5lZC4gKi8KLXN0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0ZV9pbml0KHUzMiBwZm4pCitzdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKIH0KQEAgLTgzOCw3ICs4NTYsNyBAQAogCiAvKiBUaGlzIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgbmV3IHB0ZSBwYWdlIGlzIHBpbm5lZCBpZmYgaXRzIGJlaW5nCiAgICBhdHRhY2hlZCB0byBhIHBpbm5lZCBwYWdldGFibGUuICovCi1zdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcHRwYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuLCB1bnNpZ25lZCBsZXZlbCkKK3N0YXRpYyB2b2lkIHhlbl9hbGxvY19wdHBhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsZXZlbCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAKQEAgLTg0Niw4ICs4NjQsOCBAQAogCQlTZXRQYWdlUGlubmVkKHBhZ2UpOwogCiAJCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKLQkJCW1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkoX192YShQRk5fUEhZUyhwZm4pKSk7Ci0JCQlpZiAobGV2ZWwgPT0gUFRfUFRFKQorCQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKFBGTl9QSFlTKCh1bnNpZ25lZCBsb25nKXBmbikpKTsKKwkJCWlmIChsZXZlbCA9PSBQVF9QVEUgJiYgVVNFX1NQTElUX1BUTE9DS1MpCiAJCQkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MMV9UQUJMRSwgcGZuKTsKIAkJfSBlbHNlCiAJCQkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHN0cmF5IG1hcHBpbmdzIG9mCkBAIC04NTYsMTIgKzg3NCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgeGVuX2FsbG9jX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9hbGxvY19wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRfUFRFKTsKIH0KIAotc3RhdGljIHZvaWQgeGVuX2FsbG9jX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9hbGxvY19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRfUE1EKTsKIH0KQEAgLTkwOSwxMyArOTI3LDEzIEBACiB9CiAKIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bnRpbCB3ZSdyZSBPSyB0byB1c2Ugc3RydWN0IHBhZ2UgKi8KLXN0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0cGFnZSh1MzIgcGZuLCB1bnNpZ25lZCBsZXZlbCkKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0cGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbGV2ZWwpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwogCiAJaWYgKFBhZ2VQaW5uZWQocGFnZSkpIHsKIAkJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgewotCQkJaWYgKGxldmVsID09IFBUX1BURSkKKwkJCWlmIChsZXZlbCA9PSBQVF9QVEUgJiYgVVNFX1NQTElUX1BUTE9DS1MpCiAJCQkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1VOUElOX1RBQkxFLCBwZm4pOwogCQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192YShQRk5fUEhZUyhwZm4pKSk7CiAJCX0KQEAgLTkyMywyMyArOTQxLDIzIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wdGUodTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B0ZSh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl4ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QVEUpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wbWQodTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3BtZCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl4ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QTUQpOwogfQogCiAjaWYgUEFHRVRBQkxFX0xFVkVMUyA9PSA0Ci1zdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcHVkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKQorc3RhdGljIHZvaWQgeGVuX2FsbG9jX3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJeGVuX2FsbG9jX3B0cGFnZShtbSwgcGZuLCBQVF9QVUQpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wdWQodTMyIHBmbikKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNlX3B1ZCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl4ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9QVUQpOwogfQpAQCAtOTYyLDYgKzk4MCw3IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19YODZfMzIKIHN0YXRpYyBfX2luaXQgcHRlX3QgbWFza19yd19wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKIHsKIAkvKiBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHB0ZSwgdGhlbiBkb24ndCBhbGxvdyBfUEFHRV9SVyB0byBiZSBzZXQgKi8KQEAgLTk4MCw2ICs5OTksNyBAQAogCiAJeGVuX3NldF9wdGUocHRlcCwgcHRlKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgX19pbml0IHZvaWQgeGVuX3BhZ2V0YWJsZV9zZXR1cF9zdGFydChwZ2RfdCAqYmFzZSkKIHsKQEAgLTEwNDYsNyArMTA2Niw2IEBACiAKIAkvKiB4ZW5fdmNwdV9zZXR1cCBtYW5hZ2VkIHRvIHBsYWNlIHRoZSB2Y3B1X2luZm8gd2l0aGluIHRoZQogCSAgIHBlcmNwdSBhcmVhIGZvciBhbGwgY3B1cywgc28gbWFrZSB1c2Ugb2YgaXQgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMyCiAJaWYgKGhhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkgewogCQlwcmludGsoS0VSTl9JTkZPICJYZW46IHVzaW5nIHZjcHVfaW5mbyBwbGFjZW1lbnRcbiIpOwogCkBAIC0xMDU2LDcgKzEwNzUsNiBAQAogCQlwdl9pcnFfb3BzLmlycV9lbmFibGUgPSB4ZW5faXJxX2VuYWJsZV9kaXJlY3Q7CiAJCXB2X21tdV9vcHMucmVhZF9jcjIgPSB4ZW5fcmVhZF9jcjJfZGlyZWN0OwogCX0KLSNlbmRpZgogfQogCiBzdGF0aWMgdW5zaWduZWQgeGVuX3BhdGNoKHU4IHR5cGUsIHUxNiBjbG9iYmVycywgdm9pZCAqaW5zbmJ1ZiwKQEAgLTEwNzcsMTIgKzEwOTUsMTAgQEAKIAlnb3RvIHBhdGNoX3NpdGUKIAogCXN3aXRjaCAodHlwZSkgewotI2lmZGVmIENPTkZJR19YODZfMzIKIAkJU0lURShwdl9pcnFfb3BzLCBpcnFfZW5hYmxlKTsKIAkJU0lURShwdl9pcnFfb3BzLCBpcnFfZGlzYWJsZSk7CiAJCVNJVEUocHZfaXJxX29wcywgc2F2ZV9mbCk7CiAJCVNJVEUocHZfaXJxX29wcywgcmVzdG9yZV9mbCk7Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogI3VuZGVmIFNJVEUKIAogCXBhdGNoX3NpdGU6CkBAIC0xMjIwLDYgKzEyMzYsOSBAQAogCS5sb2FkX2dzX2luZGV4ID0geGVuX2xvYWRfZ3NfaW5kZXgsCiAjZW5kaWYKIAorCS5hbGxvY19sZHQgPSB4ZW5fYWxsb2NfbGR0LAorCS5mcmVlX2xkdCA9IHhlbl9mcmVlX2xkdCwKKwogCS5zdG9yZV9nZHQgPSBuYXRpdmVfc3RvcmVfZ2R0LAogCS5zdG9yZV9pZHQgPSBuYXRpdmVfc3RvcmVfaWR0LAogCS5zdG9yZV90ciA9IHhlbl9zdG9yZV90ciwKQEAgLTEyNDEsNDAgKzEyNjAsOCBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgX194ZW5faW5pdF9JUlEodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JaW50IGk7Ci0KLQkvKiBDcmVhdGUgaWRlbnRpdHkgdmVjdG9yLT5pcnEgbWFwICovCi0JZm9yKGkgPSAwOyBpIDwgTlJfVkVDVE9SUzsgaSsrKSB7Ci0JCWludCBjcHU7Ci0KLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJCXBlcl9jcHUodmVjdG9yX2lycSwgY3B1KVtpXSA9IGk7Ci0JfQotI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KLQotCXhlbl9pbml0X0lSUSgpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHB2X2lycV9vcHMgeGVuX2lycV9vcHMgX19pbml0ZGF0YSA9IHsKLQkuaW5pdF9JUlEgPSBfX3hlbl9pbml0X0lSUSwKLQkuc2F2ZV9mbCA9IHhlbl9zYXZlX2ZsLAotCS5yZXN0b3JlX2ZsID0geGVuX3Jlc3RvcmVfZmwsCi0JLmlycV9kaXNhYmxlID0geGVuX2lycV9kaXNhYmxlLAotCS5pcnFfZW5hYmxlID0geGVuX2lycV9lbmFibGUsCi0JLnNhZmVfaGFsdCA9IHhlbl9zYWZlX2hhbHQsCi0JLmhhbHQgPSB4ZW5faGFsdCwKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JLmFkanVzdF9leGNlcHRpb25fZnJhbWUgPSB4ZW5fYWRqdXN0X2V4Y2VwdGlvbl9mcmFtZSwKLSNlbmRpZgotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9hcGljX29wcyB4ZW5fYXBpY19vcHMgX19pbml0ZGF0YSA9IHsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQkuYXBpY193cml0ZSA9IHhlbl9hcGljX3dyaXRlLAotCS5hcGljX3JlYWQgPSB4ZW5fYXBpY19yZWFkLAogCS5zZXR1cF9ib290X2Nsb2NrID0gcGFyYXZpcnRfbm9wLAogCS5zZXR1cF9zZWNvbmRhcnlfY2xvY2sgPSBwYXJhdmlydF9ub3AsCiAJLnN0YXJ0dXBfaXBpX2hvb2sgPSBwYXJhdmlydF9ub3AsCkBAIC0xMzI0LDcgKzEzMTEsNyBAQAogCS5wdGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IF9fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQsCiAKIAkucHRlX3ZhbCA9IHhlbl9wdGVfdmFsLAotCS5wdGVfZmxhZ3MgPSBuYXRpdmVfcHRlX3ZhbCwKKwkucHRlX2ZsYWdzID0gbmF0aXZlX3B0ZV9mbGFncywKIAkucGdkX3ZhbCA9IHhlbl9wZ2RfdmFsLAogCiAJLm1ha2VfcHRlID0geGVuX21ha2VfcHRlLApAQCAtMTQxMyw3ICsxNDAwLDcgQEAKIAlpZiAoSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfcGxhdGZvcm1fcGFyYW1ldGVycywgJnBwKSA9PSAwKQogCQl0b3AgPSBwcC52aXJ0X3N0YXJ0OwogCi0JcmVzZXJ2ZV90b3BfYWRkcmVzcygtdG9wICsgMiAqIFBBR0VfU0laRSk7CisJcmVzZXJ2ZV90b3BfYWRkcmVzcygtdG9wKTsKICNlbmRpZgkvKiBDT05GSUdfWDg2XzMyICovCiB9CiAKQEAgLTE0NDcsNDggKzE0MzQsMTEgQEAKIAlyZXR1cm4gX19rYShtMnAobWFkZHIpKTsKIH0KIAotI2lmZGVmIENPTkZJR19YODZfNjQKLXN0YXRpYyB2b2lkIHdhbGsocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXVuc2lnbmVkIGw0aWR4ID0gcGdkX2luZGV4KGFkZHIpOwotCXVuc2lnbmVkIGwzaWR4ID0gcHVkX2luZGV4KGFkZHIpOwotCXVuc2lnbmVkIGwyaWR4ID0gcG1kX2luZGV4KGFkZHIpOwotCXVuc2lnbmVkIGwxaWR4ID0gcHRlX2luZGV4KGFkZHIpOwotCXBnZF90IGw0OwotCXB1ZF90IGwzOwotCXBtZF90IGwyOwotCXB0ZV90IGwxOwotCi0JeGVuX3Jhd19wcmludGsoIndhbGsgJXAsICVseCAtPiAlZCAlZCAlZCAlZFxuIiwKLQkJICAgICAgIHBnZCwgYWRkciwgbDRpZHgsIGwzaWR4LCBsMmlkeCwgbDFpZHgpOwotCi0JbDQgPSBwZ2RbbDRpZHhdOwotCXhlbl9yYXdfcHJpbnRrKCIgIGw0OiAlMDE2bHhcbiIsIGw0LnBnZCk7Ci0JeGVuX3Jhd19wcmludGsoIiAgICAgICUwMTZseFxuIiwgcGdkX3ZhbChsNCkpOwotCi0JbDMgPSAoKHB1ZF90ICopKG0ydihsNC5wZ2QpKSlbbDNpZHhdOwotCXhlbl9yYXdfcHJpbnRrKCIgIGwzOiAlMDE2bHhcbiIsIGwzLnB1ZCk7Ci0JeGVuX3Jhd19wcmludGsoIiAgICAgICUwMTZseFxuIiwgcHVkX3ZhbChsMykpOwotCi0JbDIgPSAoKHBtZF90ICopKG0ydihsMy5wdWQpKSlbbDJpZHhdOwotCXhlbl9yYXdfcHJpbnRrKCIgIGwyOiAlMDE2bHhcbiIsIGwyLnBtZCk7Ci0JeGVuX3Jhd19wcmludGsoIiAgICAgICUwMTZseFxuIiwgcG1kX3ZhbChsMikpOwotCi0JbDEgPSAoKHB0ZV90ICopKG0ydihsMi5wbWQpKSlbbDFpZHhdOwotCXhlbl9yYXdfcHJpbnRrKCIgIGwxOiAlMDE2bHhcbiIsIGwxLnB0ZSk7Ci0JeGVuX3Jhd19wcmludGsoIiAgICAgICUwMTZseFxuIiwgcHRlX3ZhbChsMSkpOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIHNldF9wYWdlX3Byb3Qodm9pZCAqYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IF9fcGEoYWRkcikgPj4gUEFHRV9TSElGVDsKIAlwdGVfdCBwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7CiAKLQl4ZW5fcmF3X3ByaW50aygiYWRkcj0lcCBwZm49JWx4IG1mbj0lbHggcHJvdD0lMDE2bGx4IHB0ZT0lMDE2bGx4XG4iLAotCQkgICAgICAgYWRkciwgcGZuLCBnZXRfcGh5c190b19tYWNoaW5lKHBmbiksCi0JCSAgICAgICBwZ3Byb3RfdmFsKHByb3QpLCBwdGUucHRlKTsKLQogCWlmIChIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKCh1bnNpZ25lZCBsb25nKWFkZHIsIHB0ZSwgMCkpCiAJCUJVRygpOwogfQpAQCAtMTY2NCw2ICsxNjE0LDggQEAKIAlpZiAoIXhlbl9zdGFydF9pbmZvKQogCQlyZXR1cm47CiAKKwl4ZW5fZG9tYWluX3R5cGUgPSBYRU5fUFZfRE9NQUlOOworCiAJQlVHX09OKG1lbWNtcCh4ZW5fc3RhcnRfaW5mby0+bWFnaWMsICJ4ZW4tMyIsIDUpICE9IDApOwogCiAJeGVuX3NldHVwX2ZlYXR1cmVzKCk7CkBAIC0xNjczLDEwICsxNjI1LDE4IEBACiAJcHZfaW5pdF9vcHMgPSB4ZW5faW5pdF9vcHM7CiAJcHZfdGltZV9vcHMgPSB4ZW5fdGltZV9vcHM7CiAJcHZfY3B1X29wcyA9IHhlbl9jcHVfb3BzOwotCXB2X2lycV9vcHMgPSB4ZW5faXJxX29wczsKIAlwdl9hcGljX29wcyA9IHhlbl9hcGljX29wczsKIAlwdl9tbXVfb3BzID0geGVuX21tdV9vcHM7CiAKKwl4ZW5faW5pdF9pcnFfb3BzKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkvKgorCSAqIHNldCB1cCB0aGUgYmFzaWMgYXBpYyBvcHMuCisJICovCisJYXBpY19vcHMgPSAmeGVuX2Jhc2ljX2FwaWNfb3BzOworI2VuZGlmCisKIAlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9tbXVfcHRfdXBkYXRlX3ByZXNlcnZlX2FkKSkgewogCQlwdl9tbXVfb3BzLnB0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQgPSB4ZW5fcHRlcF9tb2RpZnlfcHJvdF9zdGFydDsKIAkJcHZfbW11X29wcy5wdGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IHhlbl9wdGVwX21vZGlmeV9wcm90X2NvbW1pdDsKQEAgLTE3MDAsNyArMTY2MCw3IEBACiAKIAkvKiBQcmV2ZW50IHVud2FudGVkIGJpdHMgZnJvbSBiZWluZyBzZXQgaW4gUFRFcy4gKi8KIAlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfR0xPQkFMOwotCWlmICghaXNfaW5pdGlhbF94ZW5kb21haW4oKSkKKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQogCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+KF9QQUdFX1BXVCB8IF9QQUdFX1BDRCk7CiAKIAkvKiBEb24ndCBkbyB0aGUgZnVsbCB2Y3B1X2luZm8gcGxhY2VtZW50IHN0dWZmIHVudGlsIHdlIGhhdmUgYQpAQCAtMTczNSw3ICsxNjk1LDcgQEAKIAlib290X3BhcmFtcy5oZHIucmFtZGlza19zaXplID0geGVuX3N0YXJ0X2luZm8tPm1vZF9sZW47CiAJYm9vdF9wYXJhbXMuaGRyLmNtZF9saW5lX3B0ciA9IF9fcGEoeGVuX3N0YXJ0X2luZm8tPmNtZF9saW5lKTsKIAotCWlmICghaXNfaW5pdGlhbF94ZW5kb21haW4oKSkgeworCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpIHsKIAkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ4ZW5ib290IiwgMCwgTlVMTCk7CiAJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5IiwgMCwgTlVMTCk7CiAJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgiaHZjIiwgMCwgTlVMTCk7CkBAIC0xNzQzLDE1ICsxNzAzLDYgQEAKIAogCXhlbl9yYXdfY29uc29sZV93cml0ZSgiYWJvdXQgdG8gZ2V0IHN0YXJ0ZWQuLi5cbiIpOwogCi0jaWYgMAotCXhlbl9yYXdfcHJpbnRrKCImYm9vdF9wYXJhbXM9JXAgX19wYSgmYm9vdF9wYXJhbXMpPSVseCBfX3ZhKF9fcGEoJmJvb3RfcGFyYW1zKSk9JWx4XG4iLAotCQkgICAgICAgJmJvb3RfcGFyYW1zLCBfX3BhX3N5bWJvbCgmYm9vdF9wYXJhbXMpLAotCQkgICAgICAgX192YShfX3BhX3N5bWJvbCgmYm9vdF9wYXJhbXMpKSk7Ci0KLQl3YWxrKHBnZCwgJmJvb3RfcGFyYW1zKTsKLQl3YWxrKHBnZCwgX192YShfX3BhKCZib290X3BhcmFtcykpKTsKLSNlbmRpZgotCiAJLyogU3RhcnQgdGhlIHdvcmxkICovCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWkzODZfc3RhcnRfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vaXJxLmMgYi9hcmNoL3g4Ni94ZW4vaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODVhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi9pcnEuYwpAQCAtMCwwICsxLDE0MyBAQAorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9zY2hlZC5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmNwdS5oPgorCisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2luY2x1ZGUgInhlbi1vcHMuaCIKKworLyoKKyAqIEZvcmNlIGEgcHJvcGVyIGV2ZW50LWNoYW5uZWwgY2FsbGJhY2sgZnJvbSBYZW4gYWZ0ZXIgY2xlYXJpbmcgdGhlCisgKiBjYWxsYmFjayBtYXNrLiBXZSBkbyB0aGlzIGluIGEgdmVyeSBzaW1wbGUgbWFubmVyLCBieSBtYWtpbmcgYSBjYWxsCisgKiBkb3duIGludG8gWGVuLiBUaGUgcGVuZGluZyBmbGFnIHdpbGwgYmUgY2hlY2tlZCBieSBYZW4gb24gcmV0dXJuLgorICovCit2b2lkIHhlbl9mb3JjZV9ldnRjaG5fY2FsbGJhY2sodm9pZCkKK3sKKwkodm9pZClIWVBFUlZJU09SX3hlbl92ZXJzaW9uKDAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgX194ZW5faW5pdF9JUlEodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaW50IGk7CisKKwkvKiBDcmVhdGUgaWRlbnRpdHkgdmVjdG9yLT5pcnEgbWFwICovCisJZm9yKGkgPSAwOyBpIDwgTlJfVkVDVE9SUzsgaSsrKSB7CisJCWludCBjcHU7CisKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJCXBlcl9jcHUodmVjdG9yX2lycSwgY3B1KVtpXSA9IGk7CisJfQorI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KKworCXhlbl9pbml0X0lSUSgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc2F2ZV9mbCh2b2lkKQoreworCXN0cnVjdCB2Y3B1X2luZm8gKnZjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXZjcHUgPSB4ODZfcmVhZF9wZXJjcHUoeGVuX3ZjcHUpOworCisJLyogZmxhZyBoYXMgb3Bwb3NpdGUgc2Vuc2Ugb2YgbWFzayAqLworCWZsYWdzID0gIXZjcHUtPmV2dGNobl91cGNhbGxfbWFzazsKKworCS8qIGNvbnZlcnQgdG8gSUYgdHlwZSBmbGFnCisJICAgLTAgLT4gMHgwMDAwMDAwMAorCSAgIC0xIC0+IDB4ZmZmZmZmZmYKKwkqLworCXJldHVybiAoLWZsYWdzKSAmIFg4Nl9FRkxBR1NfSUY7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9yZXN0b3JlX2ZsKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHZjcHVfaW5mbyAqdmNwdTsKKworCS8qIGNvbnZlcnQgZnJvbSBJRiB0eXBlIGZsYWcgKi8KKwlmbGFncyA9ICEoZmxhZ3MgJiBYODZfRUZMQUdTX0lGKTsKKworCS8qIFRoZXJlJ3MgYSBvbmUgaW5zdHJ1Y3Rpb24gcHJlZW1wdCB3aW5kb3cgaGVyZS4gIFdlIG5lZWQgdG8KKwkgICBtYWtlIHN1cmUgd2UncmUgZG9uJ3Qgc3dpdGNoIENQVXMgYmV0d2VlbiBnZXR0aW5nIHRoZSB2Y3B1CisJICAgcG9pbnRlciBhbmQgdXBkYXRpbmcgdGhlIG1hc2suICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJdmNwdSA9IHg4Nl9yZWFkX3BlcmNwdSh4ZW5fdmNwdSk7CisJdmNwdS0+ZXZ0Y2huX3VwY2FsbF9tYXNrID0gZmxhZ3M7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisJLyogRG9lc24ndCBtYXR0ZXIgaWYgd2UgZ2V0IHByZWVtcHRlZCBoZXJlLCBiZWNhdXNlIGFueQorCSAgIHBlbmRpbmcgZXZlbnQgd2lsbCBnZXQgZGVhbHQgd2l0aCBhbnl3YXkuICovCisKKwlpZiAoZmxhZ3MgPT0gMCkgeworCQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKKwkJYmFycmllcigpOyAvKiB1bm1hc2sgdGhlbiBjaGVjayAoYXZvaWQgcmFjZXMpICovCisJCWlmICh1bmxpa2VseSh2Y3B1LT5ldnRjaG5fdXBjYWxsX3BlbmRpbmcpKQorCQkJeGVuX2ZvcmNlX2V2dGNobl9jYWxsYmFjaygpOworCX0KK30KKworc3RhdGljIHZvaWQgeGVuX2lycV9kaXNhYmxlKHZvaWQpCit7CisJLyogVGhlcmUncyBhIG9uZSBpbnN0cnVjdGlvbiBwcmVlbXB0IHdpbmRvdyBoZXJlLiAgV2UgbmVlZCB0bworCSAgIG1ha2Ugc3VyZSB3ZSdyZSBkb24ndCBzd2l0Y2ggQ1BVcyBiZXR3ZWVuIGdldHRpbmcgdGhlIHZjcHUKKwkgICBwb2ludGVyIGFuZCB1cGRhdGluZyB0aGUgbWFzay4gKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwl4ODZfcmVhZF9wZXJjcHUoeGVuX3ZjcHUpLT5ldnRjaG5fdXBjYWxsX21hc2sgPSAxOworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2lycV9lbmFibGUodm9pZCkKK3sKKwlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1OworCisJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBiZWluZyBwcmVlbXB0ZWQgaGVyZSwgc2luY2UKKwkgICBlaXRoZXIgYSkgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHNvIG5vIHByZWVtcHRpb24sIG9yIGIpCisJICAgdGhlIGNhbGxlciBpcyBjb25mdXNlZCBhbmQgaXMgdHJ5aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzCisJICAgb24gYW4gaW5kZXRlcm1pbmF0ZSBwcm9jZXNzb3IuICovCisKKwl2Y3B1ID0geDg2X3JlYWRfcGVyY3B1KHhlbl92Y3B1KTsKKwl2Y3B1LT5ldnRjaG5fdXBjYWxsX21hc2sgPSAwOworCisJLyogRG9lc24ndCBtYXR0ZXIgaWYgd2UgZ2V0IHByZWVtcHRlZCBoZXJlLCBiZWNhdXNlIGFueQorCSAgIHBlbmRpbmcgZXZlbnQgd2lsbCBnZXQgZGVhbHQgd2l0aCBhbnl3YXkuICovCisKKwliYXJyaWVyKCk7IC8qIHVubWFzayB0aGVuIGNoZWNrIChhdm9pZCByYWNlcykgKi8KKwlpZiAodW5saWtlbHkodmNwdS0+ZXZ0Y2huX3VwY2FsbF9wZW5kaW5nKSkKKwkJeGVuX2ZvcmNlX2V2dGNobl9jYWxsYmFjaygpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fc2FmZV9oYWx0KHZvaWQpCit7CisJLyogQmxvY2tpbmcgaW5jbHVkZXMgYW4gaW1wbGljaXQgbG9jYWxfaXJxX2VuYWJsZSgpLiAqLworCWlmIChIWVBFUlZJU09SX3NjaGVkX29wKFNDSEVET1BfYmxvY2ssIE5VTEwpICE9IDApCisJCUJVRygpOworfQorCitzdGF0aWMgdm9pZCB4ZW5faGFsdCh2b2lkKQoreworCWlmIChpcnFzX2Rpc2FibGVkKCkpCisJCUhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93biwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBOVUxMKTsKKwllbHNlCisJCXhlbl9zYWZlX2hhbHQoKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9pcnFfb3BzIHhlbl9pcnFfb3BzIF9faW5pdGRhdGEgPSB7CisJLmluaXRfSVJRID0gX194ZW5faW5pdF9JUlEsCisJLnNhdmVfZmwgPSB4ZW5fc2F2ZV9mbCwKKwkucmVzdG9yZV9mbCA9IHhlbl9yZXN0b3JlX2ZsLAorCS5pcnFfZGlzYWJsZSA9IHhlbl9pcnFfZGlzYWJsZSwKKwkuaXJxX2VuYWJsZSA9IHhlbl9pcnFfZW5hYmxlLAorCS5zYWZlX2hhbHQgPSB4ZW5fc2FmZV9oYWx0LAorCS5oYWx0ID0geGVuX2hhbHQsCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS5hZGp1c3RfZXhjZXB0aW9uX2ZyYW1lID0geGVuX2FkanVzdF9leGNlcHRpb25fZnJhbWUsCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IHhlbl9pbml0X2lycV9vcHMoKQoreworCXB2X2lycV9vcHMgPSB4ZW5faXJxX29wczsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCBhYTM3NDY5Li5hZTE3M2Y2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC00MCw2ICs0MCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtNTcsNiArNTgsNjEgQEAKIAogI2luY2x1ZGUgIm11bHRpY2FsbHMuaCIKICNpbmNsdWRlICJtbXUuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCisKKyNkZWZpbmUgTU1VX1VQREFURV9ISVNUTwkzMAorCisjaWZkZWYgQ09ORklHX1hFTl9ERUJVR19GUworCitzdGF0aWMgc3RydWN0IHsKKwl1MzIgcGdkX3VwZGF0ZTsKKwl1MzIgcGdkX3VwZGF0ZV9waW5uZWQ7CisJdTMyIHBnZF91cGRhdGVfYmF0Y2hlZDsKKworCXUzMiBwdWRfdXBkYXRlOworCXUzMiBwdWRfdXBkYXRlX3Bpbm5lZDsKKwl1MzIgcHVkX3VwZGF0ZV9iYXRjaGVkOworCisJdTMyIHBtZF91cGRhdGU7CisJdTMyIHBtZF91cGRhdGVfcGlubmVkOworCXUzMiBwbWRfdXBkYXRlX2JhdGNoZWQ7CisKKwl1MzIgcHRlX3VwZGF0ZTsKKwl1MzIgcHRlX3VwZGF0ZV9waW5uZWQ7CisJdTMyIHB0ZV91cGRhdGVfYmF0Y2hlZDsKKworCXUzMiBtbXVfdXBkYXRlOworCXUzMiBtbXVfdXBkYXRlX2V4dGVuZGVkOworCXUzMiBtbXVfdXBkYXRlX2hpc3RvW01NVV9VUERBVEVfSElTVE9dOworCisJdTMyIHByb3RfY29tbWl0OworCXUzMiBwcm90X2NvbW1pdF9iYXRjaGVkOworCisJdTMyIHNldF9wdGVfYXQ7CisJdTMyIHNldF9wdGVfYXRfYmF0Y2hlZDsKKwl1MzIgc2V0X3B0ZV9hdF9waW5uZWQ7CisJdTMyIHNldF9wdGVfYXRfY3VycmVudDsKKwl1MzIgc2V0X3B0ZV9hdF9rZXJuZWw7Cit9IG1tdV9zdGF0czsKKworc3RhdGljIHU4IHplcm9fc3RhdHM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja196ZXJvKHZvaWQpCit7CisJaWYgKHVubGlrZWx5KHplcm9fc3RhdHMpKSB7CisJCW1lbXNldCgmbW11X3N0YXRzLCAwLCBzaXplb2YobW11X3N0YXRzKSk7CisJCXplcm9fc3RhdHMgPSAwOworCX0KK30KKworI2RlZmluZSBBRERfU1RBVFMoZWxlbSwgdmFsKQkJCVwKKwlkbyB7IGNoZWNrX3plcm8oKTsgbW11X3N0YXRzLmVsZW0gKz0gKHZhbCk7IH0gd2hpbGUoMCkKKworI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RFQlVHX0ZTICovCisKKyNkZWZpbmUgQUREX1NUQVRTKGVsZW0sIHZhbCkJZG8geyAodm9pZCkodmFsKTsgfSB3aGlsZSgwKQorCisjZW5kaWYgLyogQ09ORklHX1hFTl9ERUJVR19GUyAqLwogCiAvKgogICogSnVzdCBiZXlvbmQgdGhlIGhpZ2hlc3QgdXNlcm1vZGUgYWRkcmVzcy4gIFNUQUNLX1RPUF9NQVggaGFzIGEKQEAgLTIyOSwyNSArMjg1LDM1IEBACiB9CiAKIAotc3RhdGljIGJvb2wgcGFnZV9waW5uZWQodm9pZCAqcHRyKQorc3RhdGljIGJvb2wgeGVuX3BhZ2VfcGlubmVkKHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShwdHIpOwogCiAJcmV0dXJuIFBhZ2VQaW5uZWQocGFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV4dGVuZF9tbXVfdXBkYXRlKGNvbnN0IHN0cnVjdCBtbXVfdXBkYXRlICp1cGRhdGUpCitzdGF0aWMgdm9pZCB4ZW5fZXh0ZW5kX21tdV91cGRhdGUoY29uc3Qgc3RydWN0IG1tdV91cGRhdGUgKnVwZGF0ZSkKIHsKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIAlzdHJ1Y3QgbW11X3VwZGF0ZSAqdTsKIAogCW1jcyA9IHhlbl9tY19leHRlbmRfYXJncyhfX0hZUEVSVklTT1JfbW11X3VwZGF0ZSwgc2l6ZW9mKCp1KSk7CiAKLQlpZiAobWNzLm1jICE9IE5VTEwpCisJaWYgKG1jcy5tYyAhPSBOVUxMKSB7CisJCUFERF9TVEFUUyhtbXVfdXBkYXRlX2V4dGVuZGVkLCAxKTsKKwkJQUREX1NUQVRTKG1tdV91cGRhdGVfaGlzdG9bbWNzLm1jLT5hcmdzWzFdXSwgLTEpOworCiAJCW1jcy5tYy0+YXJnc1sxXSsrOwotCWVsc2UgeworCisJCWlmIChtY3MubWMtPmFyZ3NbMV0gPCBNTVVfVVBEQVRFX0hJU1RPKQorCQkJQUREX1NUQVRTKG1tdV91cGRhdGVfaGlzdG9bbWNzLm1jLT5hcmdzWzFdXSwgMSk7CisJCWVsc2UKKwkJCUFERF9TVEFUUyhtbXVfdXBkYXRlX2hpc3RvWzBdLCAxKTsKKwl9IGVsc2UgeworCQlBRERfU1RBVFMobW11X3VwZGF0ZSwgMSk7CiAJCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqdSkpOwogCQlNVUxUSV9tbXVfdXBkYXRlKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5VTEwsIERPTUlEX1NFTEYpOworCQlBRERfU1RBVFMobW11X3VwZGF0ZV9oaXN0b1sxXSwgMSk7CiAJfQogCiAJdSA9IG1jcy5hcmdzOwpAQCAtMjY1LDcgKzMzMSw5IEBACiAJLyogcHRyIG1heSBiZSBpb3JlbWFwcGVkIGZvciA2NC1iaXQgcGFnZXRhYmxlIHNldHVwICovCiAJdS5wdHIgPSBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5lKHB0cikubWFkZHI7CiAJdS52YWwgPSBwbWRfdmFsX21hKHZhbCk7Ci0JZXh0ZW5kX21tdV91cGRhdGUoJnUpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7CisKKwlBRERfU1RBVFMocG1kX3VwZGF0ZV9iYXRjaGVkLCBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9NTVUpOwogCiAJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKIApAQCAtMjc0LDEzICszNDIsMTcgQEAKIAogdm9pZCB4ZW5fc2V0X3BtZChwbWRfdCAqcHRyLCBwbWRfdCB2YWwpCiB7CisJQUREX1NUQVRTKHBtZF91cGRhdGUsIDEpOworCiAJLyogSWYgcGFnZSBpcyBub3QgcGlubmVkLCB3ZSBjYW4ganVzdCB1cGRhdGUgdGhlIGVudHJ5CiAJICAgZGlyZWN0bHkgKi8KLQlpZiAoIXBhZ2VfcGlubmVkKHB0cikpIHsKKwlpZiAoIXhlbl9wYWdlX3Bpbm5lZChwdHIpKSB7CiAJCSpwdHIgPSB2YWw7CiAJCXJldHVybjsKIAl9CiAKKwlBRERfU1RBVFMocG1kX3VwZGF0ZV9waW5uZWQsIDEpOworCiAJeGVuX3NldF9wbWRfaHlwZXIocHRyLCB2YWwpOwogfQogCkBAIC0zMDAsMTIgKzM3MiwxOCBAQAogCWlmIChtbSA9PSAmaW5pdF9tbSkKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAKKwlBRERfU1RBVFMoc2V0X3B0ZV9hdCwgMSk7CisvLwlBRERfU1RBVFMoc2V0X3B0ZV9hdF9waW5uZWQsIHhlbl9wYWdlX3Bpbm5lZChwdGVwKSk7CisJQUREX1NUQVRTKHNldF9wdGVfYXRfY3VycmVudCwgbW0gPT0gY3VycmVudC0+bW0pOworCUFERF9TVEFUUyhzZXRfcHRlX2F0X2tlcm5lbCwgbW0gPT0gJmluaXRfbW0pOworCiAJaWYgKG1tID09IGN1cnJlbnQtPm1tIHx8IG1tID09ICZpbml0X21tKSB7CiAJCWlmIChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9NTVUpIHsKIAkJCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwogCQkJbWNzID0geGVuX21jX2VudHJ5KDApOwogCiAJCQlNVUxUSV91cGRhdGVfdmFfbWFwcGluZyhtY3MubWMsIGFkZHIsIHB0ZXZhbCwgMCk7CisJCQlBRERfU1RBVFMoc2V0X3B0ZV9hdF9iYXRjaGVkLCAxKTsKIAkJCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlCkBAIC0zMzQsNyArNDEyLDEwIEBACiAKIAl1LnB0ciA9IHZpcnRfdG9fbWFjaGluZShwdGVwKS5tYWRkciB8IE1NVV9QVF9VUERBVEVfUFJFU0VSVkVfQUQ7CiAJdS52YWwgPSBwdGVfdmFsX21hKHB0ZSk7Ci0JZXh0ZW5kX21tdV91cGRhdGUoJnUpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7CisKKwlBRERfU1RBVFMocHJvdF9jb21taXQsIDEpOworCUFERF9TVEFUUyhwcm90X2NvbW1pdF9iYXRjaGVkLCBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9NTVUpOwogCiAJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKIH0KQEAgLTQwMCw3ICs0ODEsOSBAQAogCS8qIHB0ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0YWJsZSBzZXR1cCAqLwogCXUucHRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRyOwogCXUudmFsID0gcHVkX3ZhbF9tYSh2YWwpOwotCWV4dGVuZF9tbXVfdXBkYXRlKCZ1KTsKKwl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOworCisJQUREX1NUQVRTKHB1ZF91cGRhdGVfYmF0Y2hlZCwgcGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpID09IFBBUkFWSVJUX0xBWllfTU1VKTsKIAogCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7CiAKQEAgLTQwOSwxOCArNDkyLDI2IEBACiAKIHZvaWQgeGVuX3NldF9wdWQocHVkX3QgKnB0ciwgcHVkX3QgdmFsKQogeworCUFERF9TVEFUUyhwdWRfdXBkYXRlLCAxKTsKKwogCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQogCSAgIGRpcmVjdGx5ICovCi0JaWYgKCFwYWdlX3Bpbm5lZChwdHIpKSB7CisJaWYgKCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgewogCQkqcHRyID0gdmFsOwogCQlyZXR1cm47CiAJfQogCisJQUREX1NUQVRTKHB1ZF91cGRhdGVfcGlubmVkLCAxKTsKKwogCXhlbl9zZXRfcHVkX2h5cGVyKHB0ciwgdmFsKTsKIH0KIAogdm9pZCB4ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQogeworCUFERF9TVEFUUyhwdGVfdXBkYXRlLCAxKTsKKy8vCUFERF9TVEFUUyhwdGVfdXBkYXRlX3Bpbm5lZCwgeGVuX3BhZ2VfcGlubmVkKHB0ZXApKTsKKwlBRERfU1RBVFMocHRlX3VwZGF0ZV9iYXRjaGVkLCBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9NTVUpOworCiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKIAlwdGVwLT5wdGVfaGlnaCA9IHB0ZS5wdGVfaGlnaDsKIAlzbXBfd21iKCk7CkBAIC00OTAsNyArNTgxLDcgQEAKIAogCXUucHRyID0gdmlydF90b19tYWNoaW5lKHB0cikubWFkZHI7CiAJdS52YWwgPSBwZ2RfdmFsX21hKHZhbCk7Ci0JZXh0ZW5kX21tdV91cGRhdGUoJnUpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7CiB9CiAKIC8qCkBAIC01MTcsMTcgKzYwOCwyMiBAQAogewogCXBnZF90ICp1c2VyX3B0ciA9IHhlbl9nZXRfdXNlcl9wZ2QocHRyKTsKIAorCUFERF9TVEFUUyhwZ2RfdXBkYXRlLCAxKTsKKwogCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQogCSAgIGRpcmVjdGx5ICovCi0JaWYgKCFwYWdlX3Bpbm5lZChwdHIpKSB7CisJaWYgKCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgewogCQkqcHRyID0gdmFsOwogCQlpZiAodXNlcl9wdHIpIHsKLQkJCVdBUk5fT04ocGFnZV9waW5uZWQodXNlcl9wdHIpKTsKKwkJCVdBUk5fT04oeGVuX3BhZ2VfcGlubmVkKHVzZXJfcHRyKSk7CiAJCQkqdXNlcl9wdHIgPSB2YWw7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAorCUFERF9TVEFUUyhwZ2RfdXBkYXRlX3Bpbm5lZCwgMSk7CisJQUREX1NUQVRTKHBnZF91cGRhdGVfYmF0Y2hlZCwgcGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpID09IFBBUkFWSVJUX0xBWllfTU1VKTsKKwogCS8qIElmIGl0J3MgcGlubmVkLCB0aGVuIHdlIGNhbiBhdCBsZWFzdCBiYXRjaCB0aGUga2VybmVsIGFuZAogCSAgIHVzZXIgdXBkYXRlcyB0b2dldGhlci4gKi8KIAl4ZW5fbWNfYmF0Y2goKTsKQEAgLTU1NSw5ICs2NTEsMTIgQEAKICAqIEZvciA2NC1iaXQsIHdlIG11c3Qgc2tpcCB0aGUgWGVuIGhvbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWRkcmVzcwogICogc3BhY2UsIGp1c3QgYWZ0ZXIgdGhlIGJpZyB4ODYtNjQgdmlydHVhbCBob2xlLgogICovCi1zdGF0aWMgaW50IHBnZF93YWxrKHBnZF90ICpwZ2QsIGludCAoKmZ1bmMpKHN0cnVjdCBwYWdlICosIGVudW0gcHRfbGV2ZWwpLAotCQkgICAgdW5zaWduZWQgbG9uZyBsaW1pdCkKK3N0YXRpYyBpbnQgeGVuX3BnZF93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJaW50ICgqZnVuYykoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICosCisJCQkJICAgIGVudW0gcHRfbGV2ZWwpLAorCQkJdW5zaWduZWQgbG9uZyBsaW1pdCkKIHsKKwlwZ2RfdCAqcGdkID0gbW0tPnBnZDsKIAlpbnQgZmx1c2ggPSAwOwogCXVuc2lnbmVkIGhvbGVfbG93LCBob2xlX2hpZ2g7CiAJdW5zaWduZWQgcGdkaWR4X2xpbWl0LCBwdWRpZHhfbGltaXQsIHBtZGlkeF9saW1pdDsKQEAgLTU5MCw4ICs2ODksNiBAQAogCXBtZGlkeF9saW1pdCA9IDA7CiAjZW5kaWYKIAotCWZsdXNoIHw9ICgqZnVuYykodmlydF90b19wYWdlKHBnZCksIFBUX1BHRCk7Ci0KIAlmb3IgKHBnZGlkeCA9IDA7IHBnZGlkeCA8PSBwZ2RpZHhfbGltaXQ7IHBnZGlkeCsrKSB7CiAJCXB1ZF90ICpwdWQ7CiAKQEAgLTYwNCw3ICs3MDEsNyBAQAogCQlwdWQgPSBwdWRfb2Zmc2V0KCZwZ2RbcGdkaWR4XSwgMCk7CiAKIAkJaWYgKFBUUlNfUEVSX1BVRCA+IDEpIC8qIG5vdCBmb2xkZWQgKi8KLQkJCWZsdXNoIHw9ICgqZnVuYykodmlydF90b19wYWdlKHB1ZCksIFBUX1BVRCk7CisJCQlmbHVzaCB8PSAoKmZ1bmMpKG1tLCB2aXJ0X3RvX3BhZ2UocHVkKSwgUFRfUFVEKTsKIAogCQlmb3IgKHB1ZGlkeCA9IDA7IHB1ZGlkeCA8IFBUUlNfUEVSX1BVRDsgcHVkaWR4KyspIHsKIAkJCXBtZF90ICpwbWQ7CkBAIC02MTksNyArNzE2LDcgQEAKIAkJCXBtZCA9IHBtZF9vZmZzZXQoJnB1ZFtwdWRpZHhdLCAwKTsKIAogCQkJaWYgKFBUUlNfUEVSX1BNRCA+IDEpIC8qIG5vdCBmb2xkZWQgKi8KLQkJCQlmbHVzaCB8PSAoKmZ1bmMpKHZpcnRfdG9fcGFnZShwbWQpLCBQVF9QTUQpOworCQkJCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwbWQpLCBQVF9QTUQpOwogCiAJCQlmb3IgKHBtZGlkeCA9IDA7IHBtZGlkeCA8IFBUUlNfUEVSX1BNRDsgcG1kaWR4KyspIHsKIAkJCQlzdHJ1Y3QgcGFnZSAqcHRlOwpAQCAtNjMzLDI4ICs3MzAsMzQgQEAKIAkJCQkJY29udGludWU7CiAKIAkJCQlwdGUgPSBwbWRfcGFnZShwbWRbcG1kaWR4XSk7Ci0JCQkJZmx1c2ggfD0gKCpmdW5jKShwdGUsIFBUX1BURSk7CisJCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwgcHRlLCBQVF9QVEUpOwogCQkJfQogCQl9CiAJfQorCiBvdXQ6CisJLyogRG8gdGhlIHRvcCBsZXZlbCBsYXN0LCBzbyB0aGF0IHRoZSBjYWxsYmFja3MgY2FuIHVzZSBpdCBhcworCSAgIGEgY3VlIHRvIGRvIGZpbmFsIHRoaW5ncyBsaWtlIHRsYiBmbHVzaGVzLiAqLworCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwZ2QpLCBQVF9QR0QpOwogCiAJcmV0dXJuIGZsdXNoOwogfQogCi1zdGF0aWMgc3BpbmxvY2tfdCAqbG9ja19wdGUoc3RydWN0IHBhZ2UgKnBhZ2UpCisvKiBJZiB3ZSdyZSB1c2luZyBzcGxpdCBwdGUgbG9ja3MsIHRoZW4gdGFrZSB0aGUgcGFnZSdzIGxvY2sgYW5kCisgICByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgT3RoZXJ3aXNlIHJldHVybiBOVUxMLiAqLworc3RhdGljIHNwaW5sb2NrX3QgKnhlbl9wdGVfbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3BpbmxvY2tfdCAqcHRsID0gTlVMTDsKIAotI2lmIE5SX0NQVVMgPj0gQ09ORklHX1NQTElUX1BUTE9DS19DUFVTCisjaWYgVVNFX1NQTElUX1BUTE9DS1MKIAlwdGwgPSBfX3B0ZV9sb2NrcHRyKHBhZ2UpOwotCXNwaW5fbG9jayhwdGwpOworCXNwaW5fbG9ja19uZXN0X2xvY2socHRsLCAmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAjZW5kaWYKIAogCXJldHVybiBwdGw7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3VubG9jayh2b2lkICp2KQorc3RhdGljIHZvaWQgeGVuX3B0ZV91bmxvY2sodm9pZCAqdikKIHsKIAlzcGlubG9ja190ICpwdGwgPSB2OwogCXNwaW5fdW5sb2NrKHB0bCk7CkBAIC02NzIsNyArNzc1LDggQEAKIAlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CiB9CiAKLXN0YXRpYyBpbnQgcGluX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gcHRfbGV2ZWwgbGV2ZWwpCitzdGF0aWMgaW50IHhlbl9waW5fcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQllbnVtIHB0X2xldmVsIGxldmVsKQogewogCXVuc2lnbmVkIHBnZmwgPSBUZXN0U2V0UGFnZVBpbm5lZChwYWdlKTsKIAlpbnQgZmx1c2g7CkBAIC02OTEsMjEgKzc5NSw0MCBAQAogCiAJCWZsdXNoID0gMDsKIAorCQkvKgorCQkgKiBXZSBuZWVkIHRvIGhvbGQgdGhlIHBhZ2V0YWJsZSBsb2NrIGJldHdlZW4gdGhlIHRpbWUKKwkJICogd2UgbWFrZSB0aGUgcGFnZXRhYmxlIFJPIGFuZCB3aGVuIHdlIGFjdHVhbGx5IHBpbgorCQkgKiBpdC4gIElmIHdlIGRvbid0LCB0aGVuIG90aGVyIHVzZXJzIG1heSBjb21lIGluIGFuZAorCQkgKiBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgcGFnZXRhYmxlIGJ5IHdyaXRpbmcgaXQsCisJCSAqIHdoaWNoIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBtZW1vcnkgaXMgUk8gYnV0IG5vdAorCQkgKiBwaW5uZWQsIHNvIFhlbiB3b24ndCBkbyB0aGUgdHJhcCduJ2VtdWxhdGUuCisJCSAqCisJCSAqIElmIHdlJ3JlIHVzaW5nIHNwbGl0IHB0ZSBsb2Nrcywgd2UgY2FuJ3QgaG9sZCB0aGUKKwkJICogZW50aXJlIHBhZ2V0YWJsZSdzIHdvcnRoIG9mIGxvY2tzIGR1cmluZyB0aGUKKwkJICogdHJhdmVyc2UsIGJlY2F1c2Ugd2UgbWF5IHdyYXAgdGhlIHByZWVtcHQgY291bnQgKDgKKwkJICogYml0cykuICBUaGUgc29sdXRpb24gaXMgdG8gbWFyayBSTyBhbmQgcGluIGVhY2ggUFRFCisJCSAqIHBhZ2Ugd2hpbGUgaG9sZGluZyB0aGUgbG9jay4gIFRoaXMgbWVhbnMgdGhlIG51bWJlcgorCQkgKiBvZiBsb2NrcyB3ZSBlbmQgdXAgaG9sZGluZyBpcyBuZXZlciBtb3JlIHRoYW4gYQorCQkgKiBiYXRjaCBzaXplICh+MzIgZW50cmllcywgYXQgcHJlc2VudCkuCisJCSAqCisJCSAqIElmIHdlJ3JlIG5vdCB1c2luZyBzcGxpdCBwdGUgbG9ja3MsIHdlIG5lZWRuJ3QgcGluCisJCSAqIHRoZSBQVEUgcGFnZXMgaW5kZXBlbmRlbnRseSwgYmVjYXVzZSB3ZSdyZQorCQkgKiBwcm90ZWN0ZWQgYnkgdGhlIG92ZXJhbGwgcGFnZXRhYmxlIGxvY2suCisJCSAqLwogCQlwdGwgPSBOVUxMOwogCQlpZiAobGV2ZWwgPT0gUFRfUFRFKQotCQkJcHRsID0gbG9ja19wdGUocGFnZSk7CisJCQlwdGwgPSB4ZW5fcHRlX2xvY2socGFnZSwgbW0pOwogCiAJCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywgKHVuc2lnbmVkIGxvbmcpcHQsCiAJCQkJCXBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9STyksCiAJCQkJCWxldmVsID09IFBUX1BHRCA/IFVWTUZfVExCX0ZMVVNIIDogMCk7CiAKLQkJaWYgKGxldmVsID09IFBUX1BURSkKKwkJaWYgKHB0bCkgewogCQkJeGVuX2RvX3BpbihNTVVFWFRfUElOX0wxX1RBQkxFLCBwZm4pOwogCi0JCWlmIChwdGwpIHsKIAkJCS8qIFF1ZXVlIGEgZGVmZXJyZWQgdW5sb2NrIGZvciB3aGVuIHRoaXMgYmF0Y2gKIAkJCSAgIGlzIGNvbXBsZXRlZC4gKi8KLQkJCXhlbl9tY19jYWxsYmFjayhkb191bmxvY2ssIHB0bCk7CisJCQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxvY2ssIHB0bCk7CiAJCX0KIAl9CiAKQEAgLTcxNSwxMSArODM4LDExIEBACiAvKiBUaGlzIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGEgbW0gaGFzIGJlZW4gY3JlYXRlZCwgYnV0IGl0IGhhcyBub3QKICAgIGJlZW4gdXNlZCB5ZXQuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0cyBwYWdldGFibGUgaXMgYWxsCiAgICByZWFkLW9ubHksIGFuZCBjYW4gYmUgcGlubmVkLiAqLwotdm9pZCB4ZW5fcGdkX3BpbihwZ2RfdCAqcGdkKQorc3RhdGljIHZvaWQgX194ZW5fcGdkX3BpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKIHsKIAl4ZW5fbWNfYmF0Y2goKTsKIAotCWlmIChwZ2Rfd2FsayhwZ2QsIHBpbl9wYWdlLCBVU0VSX0xJTUlUKSkgeworCWlmICh4ZW5fcGdkX3dhbGsobW0sIHhlbl9waW5fcGFnZSwgVVNFUl9MSU1JVCkpIHsKIAkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgZm9yIGttYXBfZmx1c2hfdW51c2VkICovCiAJCXhlbl9tY19pc3N1ZSgwKTsKIAkJa21hcF9mbHVzaF91bnVzZWQoKTsKQEAgLTczMywyNSArODU2LDM1IEBACiAJCXhlbl9kb19waW4oTU1VRVhUX1BJTl9MNF9UQUJMRSwgUEZOX0RPV04oX19wYShwZ2QpKSk7CiAKIAkJaWYgKHVzZXJfcGdkKSB7Ci0JCQlwaW5fcGFnZSh2aXJ0X3RvX3BhZ2UodXNlcl9wZ2QpLCBQVF9QR0QpOworCQkJeGVuX3Bpbl9wYWdlKG1tLCB2aXJ0X3RvX3BhZ2UodXNlcl9wZ2QpLCBQVF9QR0QpOwogCQkJeGVuX2RvX3BpbihNTVVFWFRfUElOX0w0X1RBQkxFLCBQRk5fRE9XTihfX3BhKHVzZXJfcGdkKSkpOwogCQl9CiAJfQogI2Vsc2UgLyogQ09ORklHX1g4Nl8zMiAqLwogI2lmZGVmIENPTkZJR19YODZfUEFFCiAJLyogTmVlZCB0byBtYWtlIHN1cmUgdW5zaGFyZWQga2VybmVsIFBNRCBpcyBwaW5uYWJsZSAqLwotCXBpbl9wYWdlKHZpcnRfdG9fcGFnZShwZ2RfcGFnZShwZ2RbcGdkX2luZGV4KFRBU0tfU0laRSldKSksIFBUX1BNRCk7CisJeGVuX3Bpbl9wYWdlKG1tLCB2aXJ0X3RvX3BhZ2UocGdkX3BhZ2UocGdkW3BnZF9pbmRleChUQVNLX1NJWkUpXSkpLAorCQkgICAgIFBUX1BNRCk7CiAjZW5kaWYKIAl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDNfVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOwogI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KIAl4ZW5fbWNfaXNzdWUoMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9wZ2RfcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCV9feGVuX3BnZF9waW4obW0sIG1tLT5wZ2QpOworfQorCiAvKgogICogT24gc2F2ZSwgd2UgbmVlZCB0byBwaW4gYWxsIHBhZ2V0YWJsZXMgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZWlyCiAgKiBtZm5zIHR1cm5lZCBpbnRvIHBmbnMuICBTZWFyY2ggdGhlIGxpc3QgZm9yIGFueSB1bnBpbm5lZCBwZ2RzIGFuZCBwaW4KICAqIHRoZW0gKHVucGlubmVkIHBnZHMgYXJlIG5vdCBjdXJyZW50bHkgaW4gdXNlLCBwcm9iYWJseSBiZWNhdXNlIHRoZQogICogcHJvY2VzcyBpcyB1bmRlciBjb25zdHJ1Y3Rpb24gb3IgZGVzdHJ1Y3Rpb24pLgorICoKKyAqIEV4cGVjdGVkIHRvIGJlIGNhbGxlZCBpbiBzdG9wX21hY2hpbmUoKSAoImVxdWl2YWxlbnQgdG8gdGFraW5nCisgKiBldmVyeSBzcGlubG9jayBpbiB0aGUgc3lzdGVtIiksIHNvIHRoZSBsb2NraW5nIGRvZXNuJ3QgcmVhbGx5CisgKiBtYXR0ZXIgYWxsIHRoYXQgbXVjaC4KICAqLwogdm9pZCB4ZW5fbW1fcGluX2FsbCh2b2lkKQogewpAQCAtNzYyLDcgKzg5NSw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZwZ2RfbGlzdCwgbHJ1KSB7CiAJCWlmICghUGFnZVBpbm5lZChwYWdlKSkgewotCQkJeGVuX3BnZF9waW4oKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCV9feGVuX3BnZF9waW4oJmluaXRfbW0sIChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAJCQlTZXRQYWdlU2F2ZVBpbm5lZChwYWdlKTsKIAkJfQogCX0KQEAgLTc3NSw3ICs5MDgsOCBAQAogICogdGhhdCdzIGJlZm9yZSB3ZSBoYXZlIHBhZ2Ugc3RydWN0dXJlcyB0byBzdG9yZSB0aGUgYml0cy4gIFNvIGRvIGFsbAogICogdGhlIGJvb2sta2VlcGluZyBub3cuCiAgKi8KLXN0YXRpYyBfX2luaXQgaW50IG1hcmtfcGlubmVkKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIHB0X2xldmVsIGxldmVsKQorc3RhdGljIF9faW5pdCBpbnQgeGVuX21hcmtfcGlubmVkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgIGVudW0gcHRfbGV2ZWwgbGV2ZWwpCiB7CiAJU2V0UGFnZVBpbm5lZChwYWdlKTsKIAlyZXR1cm4gMDsKQEAgLTc4MywxMCArOTE3LDExIEBACiAKIHZvaWQgX19pbml0IHhlbl9tYXJrX2luaXRfbW1fcGlubmVkKHZvaWQpCiB7Ci0JcGdkX3dhbGsoaW5pdF9tbS5wZ2QsIG1hcmtfcGlubmVkLCBGSVhBRERSX1RPUCk7CisJeGVuX3BnZF93YWxrKCZpbml0X21tLCB4ZW5fbWFya19waW5uZWQsIEZJWEFERFJfVE9QKTsKIH0KIAotc3RhdGljIGludCB1bnBpbl9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIHB0X2xldmVsIGxldmVsKQorc3RhdGljIGludCB4ZW5fdW5waW5fcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgIGVudW0gcHRfbGV2ZWwgbGV2ZWwpCiB7CiAJdW5zaWduZWQgcGdmbCA9IFRlc3RDbGVhclBhZ2VQaW5uZWQocGFnZSk7CiAKQEAgLTc5NiwxMCArOTMxLDE4IEBACiAJCXNwaW5sb2NrX3QgKnB0bCA9IE5VTEw7CiAJCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwogCisJCS8qCisJCSAqIERvIHRoZSBjb252ZXJzZSB0byBwaW5fcGFnZS4gIElmIHdlJ3JlIHVzaW5nIHNwbGl0CisJCSAqIHB0ZSBsb2Nrcywgd2UgbXVzdCBiZSBob2xkaW5nIHRoZSBsb2NrIGZvciB3aGlsZQorCQkgKiB0aGUgcHRlIHBhZ2UgaXMgdW5waW5uZWQgYnV0IHN0aWxsIFJPIHRvIHByZXZlbnQKKwkJICogY29uY3VycmVudCB1cGRhdGVzIGZyb20gc2VlaW5nIGl0IGluIHRoaXMKKwkJICogcGFydGlhbGx5LXBpbm5lZCBzdGF0ZS4KKwkJICovCiAJCWlmIChsZXZlbCA9PSBQVF9QVEUpIHsKLQkJCXB0bCA9IGxvY2tfcHRlKHBhZ2UpOworCQkJcHRsID0geGVuX3B0ZV9sb2NrKHBhZ2UsIG1tKTsKIAotCQkJeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7CisJCQlpZiAocHRsKQorCQkJCXhlbl9kb19waW4oTU1VRVhUX1VOUElOX1RBQkxFLCBwZm4pOwogCQl9CiAKIAkJbWNzID0gX194ZW5fbWNfZW50cnkoMCk7CkBAIC04MTAsNyArOTUzLDcgQEAKIAogCQlpZiAocHRsKSB7CiAJCQkvKiB1bmxvY2sgd2hlbiBiYXRjaCBjb21wbGV0ZWQgKi8KLQkJCXhlbl9tY19jYWxsYmFjayhkb191bmxvY2ssIHB0bCk7CisJCQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxvY2ssIHB0bCk7CiAJCX0KIAl9CiAKQEAgLTgxOCw3ICs5NjEsNyBAQAogfQogCiAvKiBSZWxlYXNlIGEgcGFnZXRhYmxlcyBwYWdlcyBiYWNrIGFzIG5vcm1hbCBSVyAqLwotc3RhdGljIHZvaWQgeGVuX3BnZF91bnBpbihwZ2RfdCAqcGdkKQorc3RhdGljIHZvaWQgX194ZW5fcGdkX3VucGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQogewogCXhlbl9tY19iYXRjaCgpOwogCkBAIC04MzAsMjEgKzk3MywyNyBAQAogCiAJCWlmICh1c2VyX3BnZCkgewogCQkJeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEodXNlcl9wZ2QpKSk7Ci0JCQl1bnBpbl9wYWdlKHZpcnRfdG9fcGFnZSh1c2VyX3BnZCksIFBUX1BHRCk7CisJCQl4ZW5fdW5waW5fcGFnZShtbSwgdmlydF90b19wYWdlKHVzZXJfcGdkKSwgUFRfUEdEKTsKIAkJfQogCX0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKIAkvKiBOZWVkIHRvIG1ha2Ugc3VyZSB1bnNoYXJlZCBrZXJuZWwgUE1EIGlzIHVucGlubmVkICovCi0JcGluX3BhZ2UodmlydF90b19wYWdlKHBnZF9wYWdlKHBnZFtwZ2RfaW5kZXgoVEFTS19TSVpFKV0pKSwgUFRfUE1EKTsKKwl4ZW5fdW5waW5fcGFnZShtbSwgdmlydF90b19wYWdlKHBnZF9wYWdlKHBnZFtwZ2RfaW5kZXgoVEFTS19TSVpFKV0pKSwKKwkJICAgICAgIFBUX1BNRCk7CiAjZW5kaWYKIAotCXBnZF93YWxrKHBnZCwgdW5waW5fcGFnZSwgVVNFUl9MSU1JVCk7CisJeGVuX3BnZF93YWxrKG1tLCB4ZW5fdW5waW5fcGFnZSwgVVNFUl9MSU1JVCk7CiAKIAl4ZW5fbWNfaXNzdWUoMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9wZ2RfdW5waW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJX194ZW5fcGdkX3VucGluKG1tLCBtbS0+cGdkKTsKK30KKwogLyoKICAqIE9uIHJlc3VtZSwgdW5kbyBhbnkgcGlubmluZyBkb25lIGF0IHNhdmUsIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlCiAgKiBrZXJuZWwgZG9lc24ndCBzZWUgYW55IHVuZXhwZWN0ZWQgcGlubmVkIHBhZ2V0YWJsZXMuCkBAIC04NTksNyArMTAwOCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmcGdkX2xpc3QsIGxydSkgewogCQlpZiAoUGFnZVNhdmVQaW5uZWQocGFnZSkpIHsKIAkJCUJVR19PTighUGFnZVBpbm5lZChwYWdlKSk7Ci0JCQl4ZW5fcGdkX3VucGluKChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQlfX3hlbl9wZ2RfdW5waW4oJmluaXRfbW0sIChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAJCQlDbGVhclBhZ2VTYXZlUGlubmVkKHBhZ2UpOwogCQl9CiAJfQpAQCAtODcwLDE0ICsxMDE5LDE0IEBACiB2b2lkIHhlbl9hY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0KQogewogCXNwaW5fbG9jaygmbmV4dC0+cGFnZV90YWJsZV9sb2NrKTsKLQl4ZW5fcGdkX3BpbihuZXh0LT5wZ2QpOworCXhlbl9wZ2RfcGluKG5leHQpOwogCXNwaW5fdW5sb2NrKCZuZXh0LT5wYWdlX3RhYmxlX2xvY2spOwogfQogCiB2b2lkIHhlbl9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQl4ZW5fcGdkX3BpbihtbS0+cGdkKTsKKwl4ZW5fcGdkX3BpbihtbSk7CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogfQogCkBAIC05MDcsNyArMTA1Niw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBkcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyB2b2lkIHhlbl9kcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAljcHVtYXNrX3QgbWFzazsKIAl1bnNpZ25lZCBjcHU7CkBAIC05MzcsNyArMTA4Niw3IEBACiAJCXNtcF9jYWxsX2Z1bmN0aW9uX21hc2sobWFzaywgZHJvcF9vdGhlcl9tbV9yZWYsIG1tLCAxKTsKIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBkcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyB2b2lkIHhlbl9kcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKQogCQlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CkBAIC05NjEsMTQgKzExMTAsNzcgQEAKIHZvaWQgeGVuX2V4aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlnZXRfY3B1KCk7CQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbW92ZSBhcm91bmQgKi8KLQlkcm9wX21tX3JlZihtbSk7CisJeGVuX2Ryb3BfbW1fcmVmKG1tKTsKIAlwdXRfY3B1KCk7CiAKIAlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCiAJLyogcGdkIG1heSBub3QgYmUgcGlubmVkIGluIHRoZSBlcnJvciBleGl0IHBhdGggb2YgZXhlY3ZlICovCi0JaWYgKHBhZ2VfcGlubmVkKG1tLT5wZ2QpKQotCQl4ZW5fcGdkX3VucGluKG1tLT5wZ2QpOworCWlmICh4ZW5fcGFnZV9waW5uZWQobW0tPnBnZCkpCisJCXhlbl9wZ2RfdW5waW4obW0pOwogCiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogfQorCisjaWZkZWYgQ09ORklHX1hFTl9ERUJVR19GUworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZF9tbXVfZGVidWc7CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9tbXVfZGVidWdmcyh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmRfeGVuID0geGVuX2luaXRfZGVidWdmcygpOworCisJaWYgKGRfeGVuID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZF9tbXVfZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm1tdSIsIGRfeGVuKTsKKworCWRlYnVnZnNfY3JlYXRlX3U4KCJ6ZXJvX3N0YXRzIiwgMDY0NCwgZF9tbXVfZGVidWcsICZ6ZXJvX3N0YXRzKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigicGdkX3VwZGF0ZSIsIDA0NDQsIGRfbW11X2RlYnVnLCAmbW11X3N0YXRzLnBnZF91cGRhdGUpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicGdkX3VwZGF0ZV9waW5uZWQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywKKwkJCSAgICZtbXVfc3RhdHMucGdkX3VwZGF0ZV9waW5uZWQpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicGdkX3VwZGF0ZV9iYXRjaGVkIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnBnZF91cGRhdGVfcGlubmVkKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigicHVkX3VwZGF0ZSIsIDA0NDQsIGRfbW11X2RlYnVnLCAmbW11X3N0YXRzLnB1ZF91cGRhdGUpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicHVkX3VwZGF0ZV9waW5uZWQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywKKwkJCSAgICZtbXVfc3RhdHMucHVkX3VwZGF0ZV9waW5uZWQpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicHVkX3VwZGF0ZV9iYXRjaGVkIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnB1ZF91cGRhdGVfcGlubmVkKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigicG1kX3VwZGF0ZSIsIDA0NDQsIGRfbW11X2RlYnVnLCAmbW11X3N0YXRzLnBtZF91cGRhdGUpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicG1kX3VwZGF0ZV9waW5uZWQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywKKwkJCSAgICZtbXVfc3RhdHMucG1kX3VwZGF0ZV9waW5uZWQpOworCWRlYnVnZnNfY3JlYXRlX3UzMigicG1kX3VwZGF0ZV9iYXRjaGVkIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnBtZF91cGRhdGVfcGlubmVkKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigicHRlX3VwZGF0ZSIsIDA0NDQsIGRfbW11X2RlYnVnLCAmbW11X3N0YXRzLnB0ZV91cGRhdGUpOworLy8JZGVidWdmc19jcmVhdGVfdTMyKCJwdGVfdXBkYXRlX3Bpbm5lZCIsIDA0NDQsIGRfbW11X2RlYnVnLAorLy8JCQkgICAmbW11X3N0YXRzLnB0ZV91cGRhdGVfcGlubmVkKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInB0ZV91cGRhdGVfYmF0Y2hlZCIsIDA0NDQsIGRfbW11X2RlYnVnLAorCQkJICAgJm1tdV9zdGF0cy5wdGVfdXBkYXRlX3Bpbm5lZCk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1tdV91cGRhdGUiLCAwNDQ0LCBkX21tdV9kZWJ1ZywgJm1tdV9zdGF0cy5tbXVfdXBkYXRlKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1tdV91cGRhdGVfZXh0ZW5kZWQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywKKwkJCSAgICZtbXVfc3RhdHMubW11X3VwZGF0ZV9leHRlbmRlZCk7CisJeGVuX2RlYnVnZnNfY3JlYXRlX3UzMl9hcnJheSgibW11X3VwZGF0ZV9oaXN0byIsIDA0NDQsIGRfbW11X2RlYnVnLAorCQkJCSAgICAgbW11X3N0YXRzLm1tdV91cGRhdGVfaGlzdG8sIDIwKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigic2V0X3B0ZV9hdCIsIDA0NDQsIGRfbW11X2RlYnVnLCAmbW11X3N0YXRzLnNldF9wdGVfYXQpOworCWRlYnVnZnNfY3JlYXRlX3UzMigic2V0X3B0ZV9hdF9iYXRjaGVkIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnNldF9wdGVfYXRfYmF0Y2hlZCk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJzZXRfcHRlX2F0X2N1cnJlbnQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywKKwkJCSAgICZtbXVfc3RhdHMuc2V0X3B0ZV9hdF9jdXJyZW50KTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInNldF9wdGVfYXRfa2VybmVsIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnNldF9wdGVfYXRfa2VybmVsKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigicHJvdF9jb21taXQiLCAwNDQ0LCBkX21tdV9kZWJ1ZywgJm1tdV9zdGF0cy5wcm90X2NvbW1pdCk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJwcm90X2NvbW1pdF9iYXRjaGVkIiwgMDQ0NCwgZF9tbXVfZGVidWcsCisJCQkgICAmbW11X3N0YXRzLnByb3RfY29tbWl0X2JhdGNoZWQpOworCisJcmV0dXJuIDA7Cit9Citmc19pbml0Y2FsbCh4ZW5fbW11X2RlYnVnZnMpOworCisjZW5kaWYJLyogQ09ORklHX1hFTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5oIGIvYXJjaC94ODYveGVuL21tdS5oCmluZGV4IDBmNTliZDAuLjk4ZDcxNjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuaAorKysgYi9hcmNoL3g4Ni94ZW4vbW11LmgKQEAgLTE4LDkgKzE4LDYgQEAKIHZvaWQgeGVuX2R1cF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiB2b2lkIHhlbl9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCi12b2lkIHhlbl9wZ2RfcGluKHBnZF90ICpwZ2QpOwotLy92b2lkIHhlbl9wZ2RfdW5waW4ocGdkX3QgKnBnZCk7Ci0KIHB0ZXZhbF90IHhlbl9wdGVfdmFsKHB0ZV90KTsKIHBtZHZhbF90IHhlbl9wbWRfdmFsKHBtZF90KTsKIHBnZHZhbF90IHhlbl9wZ2RfdmFsKHBnZF90KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMgYi9hcmNoL3g4Ni94ZW4vbXVsdGljYWxscy5jCmluZGV4IDllZmQxYzYuLjhlYThhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tdWx0aWNhbGxzLmMKKysrIGIvYXJjaC94ODYveGVuL211bHRpY2FsbHMuYwpAQCAtMjEsMTYgKzIxLDIwIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KIAogI2luY2x1ZGUgIm11bHRpY2FsbHMuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCisKKyNkZWZpbmUgTUNfQkFUQ0gJMzIKIAogI2RlZmluZSBNQ19ERUJVRwkxCiAKLSNkZWZpbmUgTUNfQkFUQ0gJMzIKICNkZWZpbmUgTUNfQVJHUwkJKE1DX0JBVENIICogMTYpCiAKKwogc3RydWN0IG1jX2J1ZmZlciB7CiAJc3RydWN0IG11bHRpY2FsbF9lbnRyeSBlbnRyaWVzW01DX0JBVENIXTsKICNpZiBNQ19ERUJVRwpAQCAtNDcsNiArNTEsNzYgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWNfYnVmZmVyLCBtY19idWZmZXIpOwogREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgeGVuX21jX2lycV9mbGFncyk7CiAKKy8qIGZsdXNoIHJlYXNvbnMgMC0gc2xvdHMsIDEtIGFyZ3MsIDItIGNhbGxiYWNrcyAqLworZW51bSBmbHVzaF9yZWFzb25zCit7CisJRkxfU0xPVFMsCisJRkxfQVJHUywKKwlGTF9DQUxMQkFDS1MsCisKKwlGTF9OX1JFQVNPTlMKK307CisKKyNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCisjZGVmaW5lIE5IWVBFUkNBTExTCTQwCQkvKiBub3QgcmVhbGx5ICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGhpc3RvW01DX0JBVENIKzFdOworCisJdW5zaWduZWQgaXNzdWVkOworCXVuc2lnbmVkIGFyZ190b3RhbDsKKwl1bnNpZ25lZCBoeXBlcmNhbGxzOworCXVuc2lnbmVkIGhpc3RvX2h5cGVyY2FsbHNbTkhZUEVSQ0FMTFNdOworCisJdW5zaWduZWQgZmx1c2hbRkxfTl9SRUFTT05TXTsKK30gbWNfc3RhdHM7CisKK3N0YXRpYyB1OCB6ZXJvX3N0YXRzOworCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfemVybyh2b2lkKQoreworCWlmICh1bmxpa2VseSh6ZXJvX3N0YXRzKSkgeworCQltZW1zZXQoJm1jX3N0YXRzLCAwLCBzaXplb2YobWNfc3RhdHMpKTsKKwkJemVyb19zdGF0cyA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtY19hZGRfc3RhdHMoY29uc3Qgc3RydWN0IG1jX2J1ZmZlciAqbWMpCit7CisJaW50IGk7CisKKwljaGVja196ZXJvKCk7CisKKwltY19zdGF0cy5pc3N1ZWQrKzsKKwltY19zdGF0cy5oeXBlcmNhbGxzICs9IG1jLT5tY2lkeDsKKwltY19zdGF0cy5hcmdfdG90YWwgKz0gbWMtPmFyZ2lkeDsKKworCW1jX3N0YXRzLmhpc3RvW21jLT5tY2lkeF0rKzsKKwlmb3IoaSA9IDA7IGkgPCBtYy0+bWNpZHg7IGkrKykgeworCQl1bnNpZ25lZCBvcCA9IG1jLT5lbnRyaWVzW2ldLm9wOworCQlpZiAob3AgPCBOSFlQRVJDQUxMUykKKwkJCW1jX3N0YXRzLmhpc3RvX2h5cGVyY2FsbHNbb3BdKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBtY19zdGF0c19mbHVzaChlbnVtIGZsdXNoX3JlYXNvbnMgaWR4KQoreworCWNoZWNrX3plcm8oKTsKKworCW1jX3N0YXRzLmZsdXNoW2lkeF0rKzsKK30KKworI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RFQlVHX0ZTICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY19hZGRfc3RhdHMoY29uc3Qgc3RydWN0IG1jX2J1ZmZlciAqbWMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY19zdGF0c19mbHVzaChlbnVtIGZsdXNoX3JlYXNvbnMgaWR4KQoreworfQorI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KKwogdm9pZCB4ZW5fbWNfZmx1c2godm9pZCkKIHsKIAlzdHJ1Y3QgbWNfYnVmZmVyICpiID0gJl9fZ2V0X2NwdV92YXIobWNfYnVmZmVyKTsKQEAgLTYwLDYgKzEzNCw4IEBACiAJICAgc29tZXRoaW5nIGluIHRoZSBtaWRkbGUgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKKwltY19hZGRfc3RhdHMoYik7CisKIAlpZiAoYi0+bWNpZHgpIHsKICNpZiBNQ19ERUJVRwogCQltZW1jcHkoYi0+ZGVidWcsIGItPmVudHJpZXMsCkBAIC0xMTUsNiArMTkxLDcgQEAKIAogCWlmIChiLT5tY2lkeCA9PSBNQ19CQVRDSCB8fAogCSAgICAoYXJnaWR4ICsgYXJncykgPiBNQ19BUkdTKSB7CisJCW1jX3N0YXRzX2ZsdXNoKGItPm1jaWR4ID09IE1DX0JBVENIID8gRkxfU0xPVFMgOiBGTF9BUkdTKTsKIAkJeGVuX21jX2ZsdXNoKCk7CiAJCWFyZ2lkeCA9IHJvdW5kdXAoYi0+YXJnaWR4LCBzaXplb2YodTY0KSk7CiAJfQpAQCAtMTU4LDEwICsyMzUsNDQgQEAKIAlzdHJ1Y3QgbWNfYnVmZmVyICpiID0gJl9fZ2V0X2NwdV92YXIobWNfYnVmZmVyKTsKIAlzdHJ1Y3QgY2FsbGJhY2sgKmNiOwogCi0JaWYgKGItPmNiaWR4ID09IE1DX0JBVENIKQorCWlmIChiLT5jYmlkeCA9PSBNQ19CQVRDSCkgeworCQltY19zdGF0c19mbHVzaChGTF9DQUxMQkFDS1MpOwogCQl4ZW5fbWNfZmx1c2goKTsKKwl9CiAKIAljYiA9ICZiLT5jYWxsYmFja3NbYi0+Y2JpZHgrK107CiAJY2ItPmZuID0gZm47CiAJY2ItPmRhdGEgPSBkYXRhOwogfQorCisjaWZkZWYgQ09ORklHX1hFTl9ERUJVR19GUworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZF9tY19kZWJ1ZzsKKworc3RhdGljIGludCBfX2luaXQgeGVuX21jX2RlYnVnZnModm9pZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkX3hlbiA9IHhlbl9pbml0X2RlYnVnZnMoKTsKKworCWlmIChkX3hlbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRfbWNfZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm11bHRpY2FsbHMiLCBkX3hlbik7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV91OCgiemVyb19zdGF0cyIsIDA2NDQsIGRfbWNfZGVidWcsICZ6ZXJvX3N0YXRzKTsKKworCWRlYnVnZnNfY3JlYXRlX3UzMigiYmF0Y2hlcyIsIDA0NDQsIGRfbWNfZGVidWcsICZtY19zdGF0cy5pc3N1ZWQpOworCWRlYnVnZnNfY3JlYXRlX3UzMigiaHlwZXJjYWxscyIsIDA0NDQsIGRfbWNfZGVidWcsICZtY19zdGF0cy5oeXBlcmNhbGxzKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoImFyZ190b3RhbCIsIDA0NDQsIGRfbWNfZGVidWcsICZtY19zdGF0cy5hcmdfdG90YWwpOworCisJeGVuX2RlYnVnZnNfY3JlYXRlX3UzMl9hcnJheSgiYmF0Y2hfaGlzdG8iLCAwNDQ0LCBkX21jX2RlYnVnLAorCQkJCSAgICAgbWNfc3RhdHMuaGlzdG8sIE1DX0JBVENIKTsKKwl4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJoeXBlcmNhbGxfaGlzdG8iLCAwNDQ0LCBkX21jX2RlYnVnLAorCQkJCSAgICAgbWNfc3RhdHMuaGlzdG9faHlwZXJjYWxscywgTkhZUEVSQ0FMTFMpOworCXhlbl9kZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoImZsdXNoX3JlYXNvbnMiLCAwNDQ0LCBkX21jX2RlYnVnLAorCQkJCSAgICAgbWNfc3RhdHMuZmx1c2gsIEZMX05fUkVBU09OUyk7CisKKwlyZXR1cm4gMDsKK30KK2ZzX2luaXRjYWxsKHhlbl9tY19kZWJ1Z2ZzKTsKKworI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zZXR1cC5jIGIvYXJjaC94ODYveGVuL3NldHVwLmMKaW5kZXggYjZhY2MzYS4uZDY3OTAxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NldHVwLmMKKysrIGIvYXJjaC94ODYveGVuL3NldHVwLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCWU4MjAubnJfbWFwID0gMDsKIAotCWU4MjBfYWRkX3JlZ2lvbigwLCBQRk5fUEhZUyhtYXhfcGZuKSwgRTgyMF9SQU0pOworCWU4MjBfYWRkX3JlZ2lvbigwLCBQRk5fUEhZUygodTY0KW1heF9wZm4pLCBFODIwX1JBTSk7CiAKIAkvKgogCSAqIEV2ZW4gdGhvdWdoIHRoaXMgaXMgbm9ybWFsLCB1c2FibGUgbWVtb3J5IHVuZGVyIFhlbiwgcmVzZXJ2ZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IGQ4ZmFmNzkuLmQ3N2RhNjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zbXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc21wLmMKQEAgLTExLDExICsxMSw4IEBACiAgKiB1c2VmdWwgdG9wb2xvZ3kgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXJuZWwgdG8gbWFrZSB1c2Ugb2YuICBBcyBhCiAgKiByZXN1bHQsIGFsbCBDUFVzIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkncmUgc2luZ2xlLWNvcmUgYW5kCiAgKiBzaW5nbGUtdGhyZWFkZWQuCi0gKgotICogVGhpcyBkb2VzIG5vdCBoYW5kbGUgSE9UUExVR19DUFUgeWV0LgogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCkBAIC0zNiw4ICszMyw2IEBACiAjaW5jbHVkZSAieGVuLW9wcy5oIgogI2luY2x1ZGUgIm1tdS5oIgogCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgeGVuX2luaXRfbG9ja19jcHUoaW50IGNwdSk7Ci0KIGNwdW1hc2tfdCB4ZW5fY3B1X2luaXRpYWxpemVkX21hcDsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcmVzY2hlZF9pcnEpOwpAQCAtNjQsMTEgKzU5LDEyIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgY3B1X2JyaW5ndXBfYW5kX2lkbGUodm9pZCkKK3N0YXRpYyBfX2NwdWluaXQgdm9pZCBjcHVfYnJpbmd1cCh2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAljcHVfaW5pdCgpOworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCXhlbl9lbmFibGVfc3lzZW50ZXIoKTsKQEAgLTg5LDYgKzg1LDExIEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJd21iKCk7CQkJLyogbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgb3V0ICovCit9CisKK3N0YXRpYyBfX2NwdWluaXQgdm9pZCBjcHVfYnJpbmd1cF9hbmRfaWRsZSh2b2lkKQoreworCWNwdV9icmluZ3VwKCk7CiAJY3B1X2lkbGUoKTsKIH0KIApAQCAtMjEyLDggKzIxMyw2IEBACiAKIAkJY3B1X3NldChjcHUsIGNwdV9wcmVzZW50X21hcCk7CiAJfQotCi0JLy9pbml0X3hlbmJ1c19hbGxvd2VkX2NwdW1hc2soKTsKIH0KIAogc3RhdGljIF9fY3B1aW5pdCBpbnQKQEAgLTI4MSwxMiArMjgwLDYgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUgPSBpZGxlX3Rhc2soY3B1KTsKIAlpbnQgcmM7CiAKLSNpZiAwCi0JcmMgPSBjcHVfdXBfY2hlY2soY3B1KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCS8qIEFsbG9jYXRlIG5vZGUgbG9jYWwgbWVtb3J5IGZvciBBUCBwZGFzICovCiAJV0FSTl9PTihjcHUgPT0gMCk7CkBAIC0zMzksNiArMzMyLDYwIEBACiB7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgeGVuX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoY3B1ID09IDApCisJCXJldHVybiAtRUJVU1k7CisKKwljcHVfZGlzYWJsZV9jb21tb24oKTsKKworCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGVuX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwl3aGlsZSAoSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9pc191cCwgY3B1LCBOVUxMKSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwl9CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHJlc2NoZWRfaXJxLCBjcHUpLCBOVUxMKTsKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoY2FsbGZ1bmNfaXJxLCBjcHUpLCBOVUxMKTsKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoZGVidWdfaXJxLCBjcHUpLCBOVUxMKTsKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoY2FsbGZ1bmNzaW5nbGVfaXJxLCBjcHUpLCBOVUxMKTsKKwl4ZW5fdW5pbml0X2xvY2tfY3B1KGNwdSk7CisJeGVuX3RlYXJkb3duX3RpbWVyKGNwdSk7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKKwkJYWx0ZXJuYXRpdmVzX3NtcF9zd2l0Y2goMCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wbGF5X2RlYWQodm9pZCkKK3sKKwlwbGF5X2RlYWRfY29tbW9uKCk7CisJSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9kb3duLCBzbXBfcHJvY2Vzc29yX2lkKCksIE5VTEwpOworCWNwdV9icmluZ3VwKCk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfSE9UUExVR19DUFUgKi8KK3N0YXRpYyBpbnQgeGVuX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJQlVHKCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wbGF5X2RlYWQodm9pZCkKK3sKKwlCVUcoKTsKK30KKworI2VuZGlmCiBzdGF0aWMgdm9pZCBzdG9wX3NlbGYodm9pZCAqdikKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtNDE5LDE3NiArNDY2LDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdHJ1Y3QgeGVuX3NwaW5sb2NrIHsKLQl1bnNpZ25lZCBjaGFyIGxvY2s7CQkvKiAwIC0+IGZyZWU7IDEgLT4gbG9ja2VkICovCi0JdW5zaWduZWQgc2hvcnQgc3Bpbm5lcnM7CS8qIGNvdW50IG9mIHdhaXRpbmcgY3B1cyAqLwotfTsKLQotc3RhdGljIGludCB4ZW5fc3Bpbl9pc19sb2NrZWQoc3RydWN0IHJhd19zcGlubG9jayAqbG9jaykKLXsKLQlzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCA9IChzdHJ1Y3QgeGVuX3NwaW5sb2NrICopbG9jazsKLQotCXJldHVybiB4bC0+bG9jayAhPSAwOwotfQotCi1zdGF0aWMgaW50IHhlbl9zcGluX2lzX2NvbnRlbmRlZChzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKQotewotCXN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsID0gKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKilsb2NrOwotCi0JLyogTm90IHN0cmljdGx5IHRydWU7IHRoaXMgaXMgb25seSB0aGUgY291bnQgb2YgY29udGVuZGVkCi0JICAgbG9jay10YWtlcnMgZW50ZXJpbmcgdGhlIHNsb3cgcGF0aC4gKi8KLQlyZXR1cm4geGwtPnNwaW5uZXJzICE9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgeGVuX3NwaW5fdHJ5bG9jayhzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKQotewotCXN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsID0gKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKilsb2NrOwotCXU4IG9sZCA9IDE7Ci0KLQlhc20oInhjaGdiICViMCwlMSIKLQkgICAgOiAiK3EiIChvbGQpLCAiK20iICh4bC0+bG9jaykgOiA6ICJtZW1vcnkiKTsKLQotCXJldHVybiBvbGQgPT0gMDsKLX0KLQotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgbG9ja19raWNrZXJfaXJxKSA9IC0xOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKiwgbG9ja19zcGlubmVycyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGlubmluZ19sb2NrKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsKQotewotCV9fZ2V0X2NwdV92YXIobG9ja19zcGlubmVycykgPSB4bDsKLQl3bWIoKTsJCQkvKiBzZXQgbG9jayBvZiBpbnRlcmVzdCBiZWZvcmUgY291bnQgKi8KLQlhc20oTE9DS19QUkVGSVggIiBpbmN3ICUwIgotCSAgICA6ICIrbSIgKHhsLT5zcGlubmVycykgOiA6ICJtZW1vcnkiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVuc3Bpbm5pbmdfbG9jayhzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCkKLXsKLQlhc20oTE9DS19QUkVGSVggIiBkZWN3ICUwIgotCSAgICA6ICIrbSIgKHhsLT5zcGlubmVycykgOiA6ICJtZW1vcnkiKTsKLQl3bWIoKTsJCQkvKiBkZWNyZW1lbnQgY291bnQgYmVmb3JlIGNsZWFyaW5nIGxvY2sgKi8KLQlfX2dldF9jcHVfdmFyKGxvY2tfc3Bpbm5lcnMpID0gTlVMTDsKLX0KLQotc3RhdGljIG5vaW5saW5lIGludCB4ZW5fc3Bpbl9sb2NrX3Nsb3coc3RydWN0IHJhd19zcGlubG9jayAqbG9jaykKLXsKLQlzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCA9IChzdHJ1Y3QgeGVuX3NwaW5sb2NrICopbG9jazsKLQlpbnQgaXJxID0gX19nZXRfY3B1X3Zhcihsb2NrX2tpY2tlcl9pcnEpOwotCWludCByZXQ7Ci0KLQkvKiBJZiBraWNrZXIgaW50ZXJydXB0cyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBqdXN0IHNwaW4gKi8KLQlpZiAoaXJxID09IC0xKQotCQlyZXR1cm4gMDsKLQotCS8qIGFubm91bmNlIHdlJ3JlIHNwaW5uaW5nICovCi0Jc3Bpbm5pbmdfbG9jayh4bCk7Ci0KLQkvKiBjbGVhciBwZW5kaW5nICovCi0JeGVuX2NsZWFyX2lycV9wZW5kaW5nKGlycSk7Ci0KLQkvKiBjaGVjayBhZ2FpbiBtYWtlIHN1cmUgaXQgZGlkbid0IGJlY29tZSBmcmVlIHdoaWxlCi0JICAgd2Ugd2VyZW4ndCBsb29raW5nICAqLwotCXJldCA9IHhlbl9zcGluX3RyeWxvY2sobG9jayk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBibG9jayB1bnRpbCBpcnEgYmVjb21lcyBwZW5kaW5nICovCi0JeGVuX3BvbGxfaXJxKGlycSk7Ci0Ja3N0YXRfdGhpc19jcHUuaXJxc1tpcnFdKys7Ci0KLW91dDoKLQl1bnNwaW5uaW5nX2xvY2soeGwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zcGluX2xvY2soc3RydWN0IHJhd19zcGlubG9jayAqbG9jaykKLXsKLQlzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCA9IChzdHJ1Y3QgeGVuX3NwaW5sb2NrICopbG9jazsKLQlpbnQgdGltZW91dDsKLQl1OCBvbGR2YWw7Ci0KLQlkbyB7Ci0JCXRpbWVvdXQgPSAxIDw8IDEwOwotCi0JCWFzbSgiMTogeGNoZ2IgJTEsJTBcbiIKLQkJICAgICIgICB0ZXN0YiAlMSwlMVxuIgotCQkgICAgIiAgIGp6IDNmXG4iCi0JCSAgICAiMjogcmVwO25vcFxuIgotCQkgICAgIiAgIGNtcGIgJDAsJTBcbiIKLQkJICAgICIgICBqZSAxYlxuIgotCQkgICAgIiAgIGRlYyAlMlxuIgotCQkgICAgIiAgIGpueiAyYlxuIgotCQkgICAgIjM6XG4iCi0JCSAgICA6ICIrbSIgKHhsLT5sb2NrKSwgIj1xIiAob2xkdmFsKSwgIityIiAodGltZW91dCkKLQkJICAgIDogIjEiICgxKQotCQkgICAgOiAibWVtb3J5Iik7Ci0KLQl9IHdoaWxlICh1bmxpa2VseShvbGR2YWwgIT0gMCAmJiAheGVuX3NwaW5fbG9ja19zbG93KGxvY2spKSk7Ci19Ci0KLXN0YXRpYyBub2lubGluZSB2b2lkIHhlbl9zcGluX3VubG9ja19zbG93KHN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsKQotewotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQkvKiBYWFggc2hvdWxkIG1peCB1cCBuZXh0IGNwdSBzZWxlY3Rpb24gKi8KLQkJaWYgKHBlcl9jcHUobG9ja19zcGlubmVycywgY3B1KSA9PSB4bCkgewotCQkJeGVuX3NlbmRfSVBJX29uZShjcHUsIFhFTl9TUElOX1VOTE9DS19WRUNUT1IpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zcGluX3VubG9jayhzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKQotewotCXN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsID0gKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKilsb2NrOwotCi0Jc21wX3dtYigpOwkJLyogbWFrZSBzdXJlIG5vIHdyaXRlcyBnZXQgbW92ZWQgYWZ0ZXIgdW5sb2NrICovCi0JeGwtPmxvY2sgPSAwOwkJLyogcmVsZWFzZSBsb2NrICovCi0KLQkvKiBtYWtlIHN1cmUgdW5sb2NrIGhhcHBlbnMgYmVmb3JlIGtpY2sgKi8KLQliYXJyaWVyKCk7Ci0KLQlpZiAodW5saWtlbHkoeGwtPnNwaW5uZXJzKSkKLQkJeGVuX3NwaW5fdW5sb2NrX3Nsb3coeGwpOwotfQotCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgeGVuX2luaXRfbG9ja19jcHUoaW50IGNwdSkKLXsKLQlpbnQgaXJxOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJzcGlubG9jayVkIiwgY3B1KTsKLQlpcnEgPSBiaW5kX2lwaV90b19pcnFoYW5kbGVyKFhFTl9TUElOX1VOTE9DS19WRUNUT1IsCi0JCQkJICAgICBjcHUsCi0JCQkJICAgICB4ZW5fcmVzY2hlZHVsZV9pbnRlcnJ1cHQsCi0JCQkJICAgICBJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVfElSUUZfTk9CQUxBTkNJTkcsCi0JCQkJICAgICBuYW1lLAotCQkJCSAgICAgTlVMTCk7Ci0KLQlpZiAoaXJxID49IDApIHsKLQkJZGlzYWJsZV9pcnEoaXJxKTsgLyogbWFrZSBzdXJlIGl0J3MgbmV2ZXIgZGVsaXZlcmVkICovCi0JCXBlcl9jcHUobG9ja19raWNrZXJfaXJxLCBjcHUpID0gaXJxOwotCX0KLQotCXByaW50aygiY3B1ICVkIHNwaW5sb2NrIGV2ZW50IGlycSAlZFxuIiwgY3B1LCBpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX2luaXRfc3BpbmxvY2tzKHZvaWQpCi17Ci0JcHZfbG9ja19vcHMuc3Bpbl9pc19sb2NrZWQgPSB4ZW5fc3Bpbl9pc19sb2NrZWQ7Ci0JcHZfbG9ja19vcHMuc3Bpbl9pc19jb250ZW5kZWQgPSB4ZW5fc3Bpbl9pc19jb250ZW5kZWQ7Ci0JcHZfbG9ja19vcHMuc3Bpbl9sb2NrID0geGVuX3NwaW5fbG9jazsKLQlwdl9sb2NrX29wcy5zcGluX3RyeWxvY2sgPSB4ZW5fc3Bpbl90cnlsb2NrOwotCXB2X2xvY2tfb3BzLnNwaW5fdW5sb2NrID0geGVuX3NwaW5fdW5sb2NrOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNtcF9vcHMgeGVuX3NtcF9vcHMgX19pbml0ZGF0YSA9IHsKIAkuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSB4ZW5fc21wX3ByZXBhcmVfYm9vdF9jcHUsCiAJLnNtcF9wcmVwYXJlX2NwdXMgPSB4ZW5fc21wX3ByZXBhcmVfY3B1cywKLQkuY3B1X3VwID0geGVuX2NwdV91cCwKIAkuc21wX2NwdXNfZG9uZSA9IHhlbl9zbXBfY3B1c19kb25lLAogCisJLmNwdV91cCA9IHhlbl9jcHVfdXAsCisJLmNwdV9kaWUgPSB4ZW5fY3B1X2RpZSwKKwkuY3B1X2Rpc2FibGUgPSB4ZW5fY3B1X2Rpc2FibGUsCisJLnBsYXlfZGVhZCA9IHhlbl9wbGF5X2RlYWQsCisKIAkuc21wX3NlbmRfc3RvcCA9IHhlbl9zbXBfc2VuZF9zdG9wLAogCS5zbXBfc2VuZF9yZXNjaGVkdWxlID0geGVuX3NtcF9zZW5kX3Jlc2NoZWR1bGUsCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zcGlubG9jay5jIGIvYXJjaC94ODYveGVuL3NwaW5sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3MWUzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogU3BsaXQgc3BpbmxvY2sgaW1wbGVtZW50YXRpb24gb3V0IGludG8gaXRzIG93biBmaWxlLCBzbyBpdCBjYW4gYmUKKyAqIGNvbXBpbGVkIGluIGEgRlRSQUNFLWNvbXBhdGlibGUgd2F5LgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisKKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgorCisjaW5jbHVkZSAieGVuLW9wcy5oIgorI2luY2x1ZGUgImRlYnVnZnMuaCIKKworI2lmZGVmIENPTkZJR19YRU5fREVCVUdfRlMKK3N0YXRpYyBzdHJ1Y3QgeGVuX3NwaW5sb2NrX3N0YXRzCit7CisJdTY0IHRha2VuOworCXUzMiB0YWtlbl9zbG93OworCXUzMiB0YWtlbl9zbG93X25lc3RlZDsKKwl1MzIgdGFrZW5fc2xvd19waWNrdXA7CisJdTMyIHRha2VuX3Nsb3dfc3B1cmlvdXM7CisJdTMyIHRha2VuX3Nsb3dfaXJxZW5hYmxlOworCisJdTY0IHJlbGVhc2VkOworCXUzMiByZWxlYXNlZF9zbG93OworCXUzMiByZWxlYXNlZF9zbG93X2tpY2tlZDsKKworI2RlZmluZSBISVNUT19CVUNLRVRTCTMwCisJdTMyIGhpc3RvX3NwaW5fdG90YWxbSElTVE9fQlVDS0VUUysxXTsKKwl1MzIgaGlzdG9fc3Bpbl9zcGlubmluZ1tISVNUT19CVUNLRVRTKzFdOworCXUzMiBoaXN0b19zcGluX2Jsb2NrZWRbSElTVE9fQlVDS0VUUysxXTsKKworCXU2NCB0aW1lX3RvdGFsOworCXU2NCB0aW1lX3NwaW5uaW5nOworCXU2NCB0aW1lX2Jsb2NrZWQ7Cit9IHNwaW5sb2NrX3N0YXRzOworCitzdGF0aWMgdTggemVyb19zdGF0czsKKworc3RhdGljIHVuc2lnbmVkIGxvY2tfdGltZW91dCA9IDEgPDwgMTA7CisjZGVmaW5lIFRJTUVPVVQgbG9ja190aW1lb3V0CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja196ZXJvKHZvaWQpCit7CisJaWYgKHVubGlrZWx5KHplcm9fc3RhdHMpKSB7CisJCW1lbXNldCgmc3BpbmxvY2tfc3RhdHMsIDAsIHNpemVvZihzcGlubG9ja19zdGF0cykpOworCQl6ZXJvX3N0YXRzID0gMDsKKwl9Cit9CisKKyNkZWZpbmUgQUREX1NUQVRTKGVsZW0sIHZhbCkJCQlcCisJZG8geyBjaGVja196ZXJvKCk7IHNwaW5sb2NrX3N0YXRzLmVsZW0gKz0gKHZhbCk7IH0gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB1NjQgc3Bpbl90aW1lX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIHhlbl9jbG9ja3NvdXJjZV9yZWFkKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc3Bpbl90aW1lX2FjY3VtKHU2NCBkZWx0YSwgdTMyICphcnJheSkKK3sKKwl1bnNpZ25lZCBpbmRleCA9IGlsb2cyKGRlbHRhKTsKKworCWNoZWNrX3plcm8oKTsKKworCWlmIChpbmRleCA8IEhJU1RPX0JVQ0tFVFMpCisJCWFycmF5W2luZGV4XSsrOworCWVsc2UKKwkJYXJyYXlbSElTVE9fQlVDS0VUU10rKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaW5fdGltZV9hY2N1bV9zcGlubmluZyh1NjQgc3RhcnQpCit7CisJdTMyIGRlbHRhID0geGVuX2Nsb2Nrc291cmNlX3JlYWQoKSAtIHN0YXJ0OworCisJX19zcGluX3RpbWVfYWNjdW0oZGVsdGEsIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fc3Bpbm5pbmcpOworCXNwaW5sb2NrX3N0YXRzLnRpbWVfc3Bpbm5pbmcgKz0gZGVsdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fdG90YWwodTY0IHN0YXJ0KQoreworCXUzMiBkZWx0YSA9IHhlbl9jbG9ja3NvdXJjZV9yZWFkKCkgLSBzdGFydDsKKworCV9fc3Bpbl90aW1lX2FjY3VtKGRlbHRhLCBzcGlubG9ja19zdGF0cy5oaXN0b19zcGluX3RvdGFsKTsKKwlzcGlubG9ja19zdGF0cy50aW1lX3RvdGFsICs9IGRlbHRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQoreworCXUzMiBkZWx0YSA9IHhlbl9jbG9ja3NvdXJjZV9yZWFkKCkgLSBzdGFydDsKKworCV9fc3Bpbl90aW1lX2FjY3VtKGRlbHRhLCBzcGlubG9ja19zdGF0cy5oaXN0b19zcGluX2Jsb2NrZWQpOworCXNwaW5sb2NrX3N0YXRzLnRpbWVfYmxvY2tlZCArPSBkZWx0YTsKK30KKyNlbHNlICAvKiAhQ09ORklHX1hFTl9ERUJVR19GUyAqLworI2RlZmluZSBUSU1FT1VUCQkJKDEgPDwgMTApCisjZGVmaW5lIEFERF9TVEFUUyhlbGVtLCB2YWwpCWRvIHsgKHZvaWQpKHZhbCk7IH0gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB1NjQgc3Bpbl90aW1lX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fdG90YWwodTY0IHN0YXJ0KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHNwaW5fdGltZV9hY2N1bV9zcGlubmluZyh1NjQgc3RhcnQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQoreworfQorI2VuZGlmICAvKiBDT05GSUdfWEVOX0RFQlVHX0ZTICovCisKK3N0cnVjdCB4ZW5fc3BpbmxvY2sgeworCXVuc2lnbmVkIGNoYXIgbG9jazsJCS8qIDAgLT4gZnJlZTsgMSAtPiBsb2NrZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzcGlubmVyczsJLyogY291bnQgb2Ygd2FpdGluZyBjcHVzICovCit9OworCitzdGF0aWMgaW50IHhlbl9zcGluX2lzX2xvY2tlZChzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKQoreworCXN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsID0gKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKilsb2NrOworCisJcmV0dXJuIHhsLT5sb2NrICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgeGVuX3NwaW5faXNfY29udGVuZGVkKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2spCit7CisJc3RydWN0IHhlbl9zcGlubG9jayAqeGwgPSAoc3RydWN0IHhlbl9zcGlubG9jayAqKWxvY2s7CisKKwkvKiBOb3Qgc3RyaWN0bHkgdHJ1ZTsgdGhpcyBpcyBvbmx5IHRoZSBjb3VudCBvZiBjb250ZW5kZWQKKwkgICBsb2NrLXRha2VycyBlbnRlcmluZyB0aGUgc2xvdyBwYXRoLiAqLworCXJldHVybiB4bC0+c3Bpbm5lcnMgIT0gMDsKK30KKworc3RhdGljIGludCB4ZW5fc3Bpbl90cnlsb2NrKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2spCit7CisJc3RydWN0IHhlbl9zcGlubG9jayAqeGwgPSAoc3RydWN0IHhlbl9zcGlubG9jayAqKWxvY2s7CisJdTggb2xkID0gMTsKKworCWFzbSgieGNoZ2IgJWIwLCUxIgorCSAgICA6ICIrcSIgKG9sZCksICIrbSIgKHhsLT5sb2NrKSA6IDogIm1lbW9yeSIpOworCisJcmV0dXJuIG9sZCA9PSAwOworfQorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBsb2NrX2tpY2tlcl9pcnEpID0gLTE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhlbl9zcGlubG9jayAqLCBsb2NrX3NwaW5uZXJzKTsKKworLyoKKyAqIE1hcmsgYSBjcHUgYXMgaW50ZXJlc3RlZCBpbiBhIGxvY2suICBSZXR1cm5zIHRoZSBDUFUncyBwcmV2aW91cworICogbG9jayBvZiBpbnRlcmVzdCwgaW4gY2FzZSB3ZSBnb3QgcHJlZW1wdGVkIGJ5IGFuIGludGVycnVwdC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgeGVuX3NwaW5sb2NrICpzcGlubmluZ19sb2NrKHN0cnVjdCB4ZW5fc3BpbmxvY2sgKnhsKQoreworCXN0cnVjdCB4ZW5fc3BpbmxvY2sgKnByZXY7CisKKwlwcmV2ID0gX19nZXRfY3B1X3Zhcihsb2NrX3NwaW5uZXJzKTsKKwlfX2dldF9jcHVfdmFyKGxvY2tfc3Bpbm5lcnMpID0geGw7CisKKwl3bWIoKTsJCQkvKiBzZXQgbG9jayBvZiBpbnRlcmVzdCBiZWZvcmUgY291bnQgKi8KKworCWFzbShMT0NLX1BSRUZJWCAiIGluY3cgJTAiCisJICAgIDogIittIiAoeGwtPnNwaW5uZXJzKSA6IDogIm1lbW9yeSIpOworCisJcmV0dXJuIHByZXY7Cit9CisKKy8qCisgKiBNYXJrIGEgY3B1IGFzIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIGEgbG9jay4gIFJlc3RvcmVzIHByZXZpb3VzCisgKiBsb2NrIG9mIGludGVyZXN0IChOVUxMIGZvciBub25lKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVuc3Bpbm5pbmdfbG9jayhzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCwgc3RydWN0IHhlbl9zcGlubG9jayAqcHJldikKK3sKKwlhc20oTE9DS19QUkVGSVggIiBkZWN3ICUwIgorCSAgICA6ICIrbSIgKHhsLT5zcGlubmVycykgOiA6ICJtZW1vcnkiKTsKKwl3bWIoKTsJCQkvKiBkZWNyZW1lbnQgY291bnQgYmVmb3JlIHJlc3RvcmluZyBsb2NrICovCisJX19nZXRfY3B1X3Zhcihsb2NrX3NwaW5uZXJzKSA9IHByZXY7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgeGVuX3NwaW5fbG9ja19zbG93KHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2ssIGJvb2wgaXJxX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCA9IChzdHJ1Y3QgeGVuX3NwaW5sb2NrICopbG9jazsKKwlzdHJ1Y3QgeGVuX3NwaW5sb2NrICpwcmV2OworCWludCBpcnEgPSBfX2dldF9jcHVfdmFyKGxvY2tfa2lja2VyX2lycSk7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCBzdGFydDsKKworCS8qIElmIGtpY2tlciBpbnRlcnJ1cHRzIG5vdCBpbml0aWFsaXplZCB5ZXQsIGp1c3Qgc3BpbiAqLworCWlmIChpcnEgPT0gLTEpCisJCXJldHVybiAwOworCisJc3RhcnQgPSBzcGluX3RpbWVfc3RhcnQoKTsKKworCS8qIGFubm91bmNlIHdlJ3JlIHNwaW5uaW5nICovCisJcHJldiA9IHNwaW5uaW5nX2xvY2soeGwpOworCisJZmxhZ3MgPSBfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKCk7CisJaWYgKGlycV9lbmFibGUpIHsKKwkJQUREX1NUQVRTKHRha2VuX3Nsb3dfaXJxZW5hYmxlLCAxKTsKKwkJcmF3X2xvY2FsX2lycV9lbmFibGUoKTsKKwl9CisKKwlBRERfU1RBVFModGFrZW5fc2xvdywgMSk7CisJQUREX1NUQVRTKHRha2VuX3Nsb3dfbmVzdGVkLCBwcmV2ICE9IE5VTEwpOworCisJZG8geworCQkvKiBjbGVhciBwZW5kaW5nICovCisJCXhlbl9jbGVhcl9pcnFfcGVuZGluZyhpcnEpOworCisJCS8qIGNoZWNrIGFnYWluIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgYmVjb21lIGZyZWUgd2hpbGUKKwkJICAgd2Ugd2VyZW4ndCBsb29raW5nICAqLworCQlyZXQgPSB4ZW5fc3Bpbl90cnlsb2NrKGxvY2spOworCQlpZiAocmV0KSB7CisJCQlBRERfU1RBVFModGFrZW5fc2xvd19waWNrdXAsIDEpOworCisJCQkvKgorCQkJICogSWYgd2UgaW50ZXJydXB0ZWQgYW5vdGhlciBzcGlubG9jayB3aGlsZSBpdAorCQkJICogd2FzIGJsb2NraW5nLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG9jaworCQkJICogd2l0aG91dCByZWNoZWNraW5nIHRoZSBsb2NrLgorCQkJICovCisJCQlpZiAocHJldiAhPSBOVUxMKQorCQkJCXhlbl9zZXRfaXJxX3BlbmRpbmcoaXJxKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogQmxvY2sgdW50aWwgaXJxIGJlY29tZXMgcGVuZGluZy4gIElmIHdlJ3JlCisJCSAqIGludGVycnVwdGVkIGF0IHRoaXMgcG9pbnQgKGFmdGVyIHRoZSB0cnlsb2NrIGJ1dAorCQkgKiBiZWZvcmUgZW50ZXJpbmcgdGhlIGJsb2NrKSwgdGhlbiB0aGUgbmVzdGVkIGxvY2sKKwkJICogaGFuZGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGlycSB3aWxsIGJlIGxlZnQKKwkJICogcGVuZGluZyBpZiB0aGVyZSdzIGFueSBjaGFuY2UgdGhlIGxvY2sgYmVjYW1lIGZyZWU7CisJCSAqIHhlbl9wb2xsX2lycSgpIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgdGhlIGlycSBpcworCQkgKiBwZW5kaW5nLgorCQkgKi8KKwkJeGVuX3BvbGxfaXJxKGlycSk7CisJCUFERF9TVEFUUyh0YWtlbl9zbG93X3NwdXJpb3VzLCAheGVuX3Rlc3RfaXJxX3BlbmRpbmcoaXJxKSk7CisJfSB3aGlsZSAoIXhlbl90ZXN0X2lycV9wZW5kaW5nKGlycSkpOyAvKiBjaGVjayBmb3Igc3B1cmlvdXMgd2FrZXVwcyAqLworCisJa3N0YXRfdGhpc19jcHUuaXJxc1tpcnFdKys7CisKK291dDoKKwlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXVuc3Bpbm5pbmdfbG9jayh4bCwgcHJldik7CisJc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQoc3RhcnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9feGVuX3NwaW5fbG9jayhzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrLCBib29sIGlycV9lbmFibGUpCit7CisJc3RydWN0IHhlbl9zcGlubG9jayAqeGwgPSAoc3RydWN0IHhlbl9zcGlubG9jayAqKWxvY2s7CisJdW5zaWduZWQgdGltZW91dDsKKwl1OCBvbGR2YWw7CisJdTY0IHN0YXJ0X3NwaW47CisKKwlBRERfU1RBVFModGFrZW4sIDEpOworCisJc3RhcnRfc3BpbiA9IHNwaW5fdGltZV9zdGFydCgpOworCisJZG8geworCQl1NjQgc3RhcnRfc3Bpbl9mYXN0ID0gc3Bpbl90aW1lX3N0YXJ0KCk7CisKKwkJdGltZW91dCA9IFRJTUVPVVQ7CisKKwkJYXNtKCIxOiB4Y2hnYiAlMSwlMFxuIgorCQkgICAgIiAgIHRlc3RiICUxLCUxXG4iCisJCSAgICAiICAganogM2ZcbiIKKwkJICAgICIyOiByZXA7bm9wXG4iCisJCSAgICAiICAgY21wYiAkMCwlMFxuIgorCQkgICAgIiAgIGplIDFiXG4iCisJCSAgICAiICAgZGVjICUyXG4iCisJCSAgICAiICAgam56IDJiXG4iCisJCSAgICAiMzpcbiIKKwkJICAgIDogIittIiAoeGwtPmxvY2spLCAiPXEiIChvbGR2YWwpLCAiK3IiICh0aW1lb3V0KQorCQkgICAgOiAiMSIgKDEpCisJCSAgICA6ICJtZW1vcnkiKTsKKworCQlzcGluX3RpbWVfYWNjdW1fc3Bpbm5pbmcoc3RhcnRfc3Bpbl9mYXN0KTsKKworCX0gd2hpbGUgKHVubGlrZWx5KG9sZHZhbCAhPSAwICYmCisJCQkgIChUSU1FT1VUID09IH4wIHx8ICF4ZW5fc3Bpbl9sb2NrX3Nsb3cobG9jaywgaXJxX2VuYWJsZSkpKSk7CisKKwlzcGluX3RpbWVfYWNjdW1fdG90YWwoc3RhcnRfc3Bpbik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zcGluX2xvY2soc3RydWN0IHJhd19zcGlubG9jayAqbG9jaykKK3sKKwlfX3hlbl9zcGluX2xvY2sobG9jaywgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fc3Bpbl9sb2NrX2ZsYWdzKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJX194ZW5fc3Bpbl9sb2NrKGxvY2ssICFyYXdfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncykpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCB4ZW5fc3Bpbl91bmxvY2tfc2xvdyhzdHJ1Y3QgeGVuX3NwaW5sb2NrICp4bCkKK3sKKwlpbnQgY3B1OworCisJQUREX1NUQVRTKHJlbGVhc2VkX3Nsb3csIDEpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJLyogWFhYIHNob3VsZCBtaXggdXAgbmV4dCBjcHUgc2VsZWN0aW9uICovCisJCWlmIChwZXJfY3B1KGxvY2tfc3Bpbm5lcnMsIGNwdSkgPT0geGwpIHsKKwkJCUFERF9TVEFUUyhyZWxlYXNlZF9zbG93X2tpY2tlZCwgMSk7CisJCQl4ZW5fc2VuZF9JUElfb25lKGNwdSwgWEVOX1NQSU5fVU5MT0NLX1ZFQ1RPUik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgeGVuX3NwaW5fdW5sb2NrKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2spCit7CisJc3RydWN0IHhlbl9zcGlubG9jayAqeGwgPSAoc3RydWN0IHhlbl9zcGlubG9jayAqKWxvY2s7CisKKwlBRERfU1RBVFMocmVsZWFzZWQsIDEpOworCisJc21wX3dtYigpOwkJLyogbWFrZSBzdXJlIG5vIHdyaXRlcyBnZXQgbW92ZWQgYWZ0ZXIgdW5sb2NrICovCisJeGwtPmxvY2sgPSAwOwkJLyogcmVsZWFzZSBsb2NrICovCisKKwkvKiBtYWtlIHN1cmUgdW5sb2NrIGhhcHBlbnMgYmVmb3JlIGtpY2sgKi8KKwliYXJyaWVyKCk7CisKKwlpZiAodW5saWtlbHkoeGwtPnNwaW5uZXJzKSkKKwkJeGVuX3NwaW5fdW5sb2NrX3Nsb3coeGwpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHVtbXlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJQlVHKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCit2b2lkIF9fY3B1aW5pdCB4ZW5faW5pdF9sb2NrX2NwdShpbnQgY3B1KQoreworCWludCBpcnE7CisJY29uc3QgY2hhciAqbmFtZTsKKworCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInNwaW5sb2NrJWQiLCBjcHUpOworCWlycSA9IGJpbmRfaXBpX3RvX2lycWhhbmRsZXIoWEVOX1NQSU5fVU5MT0NLX1ZFQ1RPUiwKKwkJCQkgICAgIGNwdSwKKwkJCQkgICAgIGR1bW15X2hhbmRsZXIsCisJCQkJICAgICBJUlFGX0RJU0FCTEVEfElSUUZfUEVSQ1BVfElSUUZfTk9CQUxBTkNJTkcsCisJCQkJICAgICBuYW1lLAorCQkJCSAgICAgTlVMTCk7CisKKwlpZiAoaXJxID49IDApIHsKKwkJZGlzYWJsZV9pcnEoaXJxKTsgLyogbWFrZSBzdXJlIGl0J3MgbmV2ZXIgZGVsaXZlcmVkICovCisJCXBlcl9jcHUobG9ja19raWNrZXJfaXJxLCBjcHUpID0gaXJxOworCX0KKworCXByaW50aygiY3B1ICVkIHNwaW5sb2NrIGV2ZW50IGlycSAlZFxuIiwgY3B1LCBpcnEpOworfQorCit2b2lkIHhlbl91bmluaXRfbG9ja19jcHUoaW50IGNwdSkKK3sKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUobG9ja19raWNrZXJfaXJxLCBjcHUpLCBOVUxMKTsKK30KKwordm9pZCBfX2luaXQgeGVuX2luaXRfc3BpbmxvY2tzKHZvaWQpCit7CisJcHZfbG9ja19vcHMuc3Bpbl9pc19sb2NrZWQgPSB4ZW5fc3Bpbl9pc19sb2NrZWQ7CisJcHZfbG9ja19vcHMuc3Bpbl9pc19jb250ZW5kZWQgPSB4ZW5fc3Bpbl9pc19jb250ZW5kZWQ7CisJcHZfbG9ja19vcHMuc3Bpbl9sb2NrID0geGVuX3NwaW5fbG9jazsKKwlwdl9sb2NrX29wcy5zcGluX2xvY2tfZmxhZ3MgPSB4ZW5fc3Bpbl9sb2NrX2ZsYWdzOworCXB2X2xvY2tfb3BzLnNwaW5fdHJ5bG9jayA9IHhlbl9zcGluX3RyeWxvY2s7CisJcHZfbG9ja19vcHMuc3Bpbl91bmxvY2sgPSB4ZW5fc3Bpbl91bmxvY2s7Cit9CisKKyNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX3NwaW5fZGVidWc7CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9zcGlubG9ja19kZWJ1Z2ZzKHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqZF94ZW4gPSB4ZW5faW5pdF9kZWJ1Z2ZzKCk7CisKKwlpZiAoZF94ZW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkX3NwaW5fZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInNwaW5sb2NrcyIsIGRfeGVuKTsKKworCWRlYnVnZnNfY3JlYXRlX3U4KCJ6ZXJvX3N0YXRzIiwgMDY0NCwgZF9zcGluX2RlYnVnLCAmemVyb19zdGF0cyk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRpbWVvdXQiLCAwNjQ0LCBkX3NwaW5fZGVidWcsICZsb2NrX3RpbWVvdXQpOworCisJZGVidWdmc19jcmVhdGVfdTY0KCJ0YWtlbiIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywgJnNwaW5sb2NrX3N0YXRzLnRha2VuKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRha2VuX3Nsb3ciLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMudGFrZW5fc2xvdyk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93X25lc3RlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKKwkJCSAgICZzcGlubG9ja19zdGF0cy50YWtlbl9zbG93X25lc3RlZCk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93X3BpY2t1cCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKKwkJCSAgICZzcGlubG9ja19zdGF0cy50YWtlbl9zbG93X3BpY2t1cCk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93X3NwdXJpb3VzIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAorCQkJICAgJnNwaW5sb2NrX3N0YXRzLnRha2VuX3Nsb3dfc3B1cmlvdXMpOworCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19pcnFlbmFibGUiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMudGFrZW5fc2xvd19pcnFlbmFibGUpOworCisJZGVidWdmc19jcmVhdGVfdTY0KCJyZWxlYXNlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywgJnNwaW5sb2NrX3N0YXRzLnJlbGVhc2VkKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJlbGVhc2VkX3Nsb3ciLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMucmVsZWFzZWRfc2xvdyk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJyZWxlYXNlZF9zbG93X2tpY2tlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKKwkJCSAgICZzcGlubG9ja19zdGF0cy5yZWxlYXNlZF9zbG93X2tpY2tlZCk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV91NjQoInRpbWVfc3Bpbm5pbmciLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMudGltZV9zcGlubmluZyk7CisJZGVidWdmc19jcmVhdGVfdTY0KCJ0aW1lX2Jsb2NrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMudGltZV9ibG9ja2VkKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91NjQoInRpbWVfdG90YWwiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCisJCQkgICAmc3BpbmxvY2tfc3RhdHMudGltZV90b3RhbCk7CisKKwl4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJoaXN0b190b3RhbCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKKwkJCQkgICAgIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fdG90YWwsIEhJU1RPX0JVQ0tFVFMgKyAxKTsKKwl4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJoaXN0b19zcGlubmluZyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKKwkJCQkgICAgIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fc3Bpbm5pbmcsIEhJU1RPX0JVQ0tFVFMgKyAxKTsKKwl4ZW5fZGVidWdmc19jcmVhdGVfdTMyX2FycmF5KCJoaXN0b19ibG9ja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAorCQkJCSAgICAgc3BpbmxvY2tfc3RhdHMuaGlzdG9fc3Bpbl9ibG9ja2VkLCBISVNUT19CVUNLRVRTICsgMSk7CisKKwlyZXR1cm4gMDsKK30KK2ZzX2luaXRjYWxsKHhlbl9zcGlubG9ja19kZWJ1Z2ZzKTsKKworI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi90aW1lLmMgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCmluZGV4IDY4NWI3NzQuLmM5ZjdjZGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi90aW1lLmMKKysrIGIvYXJjaC94ODYveGVuL3RpbWUuYwpAQCAtMzAsOCArMzAsNiBAQAogI2RlZmluZSBUSU1FUl9TTE9QCTEwMDAwMAogI2RlZmluZSBOU19QRVJfVElDSwkoMTAwMDAwMDAwMExMIC8gSFopCiAKLXN0YXRpYyBjeWNsZV90IHhlbl9jbG9ja3NvdXJjZV9yZWFkKHZvaWQpOwotCiAvKiBydW5zdGF0ZSBpbmZvIHVwZGF0ZWQgYnkgWGVuICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZjcHVfcnVuc3RhdGVfaW5mbywgcnVuc3RhdGUpOwogCkBAIC0yMDAsMjAgKzE5OCwxMyBAQAogLyogR2V0IHRoZSBUU0Mgc3BlZWQgZnJvbSBYZW4gKi8KIHVuc2lnbmVkIGxvbmcgeGVuX3RzY19raHoodm9pZCkKIHsKLQl1NjQgeGVuX2toeiA9IDEwMDAwMDBVTEwgPDwgMzI7Ci0JY29uc3Qgc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKmluZm8gPQorCXN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICppbmZvID0KIAkJJkhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPnZjcHVfaW5mb1swXS50aW1lOwogCi0JZG9fZGl2KHhlbl9raHosIGluZm8tPnRzY190b19zeXN0ZW1fbXVsKTsKLQlpZiAoaW5mby0+dHNjX3NoaWZ0IDwgMCkKLQkJeGVuX2toeiA8PD0gLWluZm8tPnRzY19zaGlmdDsKLQllbHNlCi0JCXhlbl9raHogPj49IGluZm8tPnRzY19zaGlmdDsKLQotCXJldHVybiB4ZW5fa2h6OworCXJldHVybiBwdmNsb2NrX3RzY19raHooaW5mbyk7CiB9CiAKLXN0YXRpYyBjeWNsZV90IHhlbl9jbG9ja3NvdXJjZV9yZWFkKHZvaWQpCitjeWNsZV90IHhlbl9jbG9ja3NvdXJjZV9yZWFkKHZvaWQpCiB7CiAgICAgICAgIHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICpzcmM7CiAJY3ljbGVfdCByZXQ7CkBAIC00NTIsNiArNDQzLDE0IEBACiAJc2V0dXBfcnVuc3RhdGVfaW5mbyhjcHUpOwogfQogCit2b2lkIHhlbl90ZWFyZG93bl90aW1lcihpbnQgY3B1KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dDsKKwlCVUdfT04oY3B1ID09IDApOworCWV2dCA9ICZwZXJfY3B1KHhlbl9jbG9ja19ldmVudHMsIGNwdSk7CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihldnQtPmlycSwgTlVMTCk7Cit9CisKIHZvaWQgeGVuX3NldHVwX2NwdV9jbG9ja2V2ZW50cyh2b2lkKQogewogCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi94ZW4tYXNtXzMyLlMgYi9hcmNoL3g4Ni94ZW4veGVuLWFzbV8zMi5TCmluZGV4IDI0OTdhMzAuLjQyNzg2ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi94ZW4tYXNtXzMyLlMKKysrIGIvYXJjaC94ODYveGVuL3hlbi1hc21fMzIuUwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJcHVzaCAlZWF4CiAJcHVzaCAlZWN4CiAJcHVzaCAlZWR4Ci0JY2FsbCBmb3JjZV9ldnRjaG5fY2FsbGJhY2sKKwljYWxsIHhlbl9mb3JjZV9ldnRjaG5fY2FsbGJhY2sKIAlwb3AgJWVkeAogCXBvcCAlZWN4CiAJcG9wICVlYXgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi94ZW4tYXNtXzY0LlMgYi9hcmNoL3g4Ni94ZW4veGVuLWFzbV82NC5TCmluZGV4IDdmNTgzMDQuLjA1Nzk0YzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi94ZW4tYXNtXzY0LlMKKysrIGIvYXJjaC94ODYveGVuL3hlbi1hc21fNjQuUwpAQCAtMjYsOCArMjYsMTUgQEAKIC8qIFBzZXVkby1mbGFnIHVzZWQgZm9yIHZpcnR1YWwgTk1JLCB3aGljaCB3ZSBkb24ndCBpbXBsZW1lbnQgeWV0ICovCiAjZGVmaW5lIFhFTl9FRkxBR1NfTk1JCTB4ODAwMDAwMDAKIAotI2lmIDAKLSNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CisjaWYgMQorLyoKKwl4ODYtNjQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyZWN0IGFjY2VzcyB0byBwZXJjcHUgdmFyaWFibGVzCisJdmlhIGEgc2VnbWVudCBvdmVycmlkZSwgc28gd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGNvZGUKKwluZXZlciBnZXRzIHVzZWQKKyAqLworI2RlZmluZSBCVUcJCQl1ZDJhCisjZGVmaW5lIFBFUl9DUFVfVkFSKHZhciwgb2ZmKQkweGRlYWRiZWVmCisjZW5kaWYKIAogLyoKIAlFbmFibGUgZXZlbnRzLiAgVGhpcyBjbGVhcnMgdGhlIGV2ZW50IG1hc2sgYW5kIHRlc3RzIHRoZSBwZW5kaW5nCkBAIC0zNSw2ICs0Miw4IEBACiAJZXZlbnRzLCB0aGVuIGVudGVyIHRoZSBoeXBlcnZpc29yIHRvIGdldCB0aGVtIGhhbmRsZWQuCiAgKi8KIEVOVFJZKHhlbl9pcnFfZW5hYmxlX2RpcmVjdCkKKwlCVUcKKwogCS8qIFVubWFzayBldmVudHMgKi8KIAltb3ZiICQwLCBQRVJfQ1BVX1ZBUih4ZW5fdmNwdV9pbmZvLCBYRU5fdmNwdV9pbmZvX21hc2spCiAKQEAgLTU4LDYgKzY3LDggQEAKIAlub24temVyby4KICAqLwogRU5UUlkoeGVuX2lycV9kaXNhYmxlX2RpcmVjdCkKKwlCVUcKKwogCW1vdmIgJDEsIFBFUl9DUFVfVkFSKHhlbl92Y3B1X2luZm8sIFhFTl92Y3B1X2luZm9fbWFzaykKIEVORFBBVENIKHhlbl9pcnFfZGlzYWJsZV9kaXJlY3QpCiAJcmV0CkBAIC03NCw2ICs4NSw4IEBACiAJWGVuIGFuZCB4ODYgdXNlIG9wcG9zaXRlIHNlbnNlcyAobWFzayB2cyBlbmFibGUpLgogICovCiBFTlRSWSh4ZW5fc2F2ZV9mbF9kaXJlY3QpCisJQlVHCisKIAl0ZXN0YiAkMHhmZiwgUEVSX0NQVV9WQVIoeGVuX3ZjcHVfaW5mbywgWEVOX3ZjcHVfaW5mb19tYXNrKQogCXNldHogJWFoCiAJYWRkYiAlYWgsJWFoCkBAIC05MSw2ICsxMDQsOCBAQAogCWlmIHNvLgogICovCiBFTlRSWSh4ZW5fcmVzdG9yZV9mbF9kaXJlY3QpCisJQlVHCisKIAl0ZXN0YiAkWDg2X0VGTEFHU19JRj4+OCwgJWFoCiAJc2V0eiBQRVJfQ1BVX1ZBUih4ZW5fdmNwdV9pbmZvLCBYRU5fdmNwdV9pbmZvX21hc2spCiAJLyogUHJlZW1wdCBoZXJlIGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgdGhhdCB3aWxsIGRlYWwgd2l0aApAQCAtMTIyLDcgKzEzNyw3IEBACiAJcHVzaCAlcjkKIAlwdXNoICVyMTAKIAlwdXNoICVyMTEKLQljYWxsIGZvcmNlX2V2dGNobl9jYWxsYmFjaworCWNhbGwgeGVuX2ZvcmNlX2V2dGNobl9jYWxsYmFjawogCXBvcCAlcjExCiAJcG9wICVyMTAKIAlwb3AgJXI5CkBAIC0xMzMsNyArMTQ4LDYgQEAKIAlwb3AgJXJjeAogCXBvcCAlcmF4CiAJcmV0Ci0jZW5kaWYKIAogRU5UUlkoeGVuX2FkanVzdF9leGNlcHRpb25fZnJhbWUpCiAJbW92IDgrMCglcnNwKSwlcmN4CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oIGIvYXJjaC94ODYveGVuL3hlbi1vcHMuaAppbmRleCBkZDNjMjMxLi5kNzQyMmRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCisrKyBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIFhFTl9PUFNfSAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8eGVuL3hlbi1vcHMuaD4KIApAQCAtMzEsNyArMzIsMTAgQEAKIAogdm9pZCBfX2luaXQgeGVuX2J1aWxkX2R5bmFtaWNfcGh5c190b19tYWNoaW5lKHZvaWQpOwogCit2b2lkIHhlbl9pbml0X2lycV9vcHModm9pZCk7CiB2b2lkIHhlbl9zZXR1cF90aW1lcihpbnQgY3B1KTsKK3ZvaWQgeGVuX3RlYXJkb3duX3RpbWVyKGludCBjcHUpOworY3ljbGVfdCB4ZW5fY2xvY2tzb3VyY2VfcmVhZCh2b2lkKTsKIHZvaWQgeGVuX3NldHVwX2NwdV9jbG9ja2V2ZW50cyh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgeGVuX3RzY19raHoodm9pZCk7CiB2b2lkIF9faW5pdCB4ZW5fdGltZV9pbml0KHZvaWQpOwpAQCAtNTAsNiArNTQsMTAgQEAKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIHhlbl9zbXBfaW5pdCh2b2lkKTsKIAordm9pZCBfX2luaXQgeGVuX2luaXRfc3BpbmxvY2tzKHZvaWQpOworX19jcHVpbml0IHZvaWQgeGVuX2luaXRfbG9ja19jcHUoaW50IGNwdSk7Cit2b2lkIHhlbl91bmluaXRfbG9ja19jcHUoaW50IGNwdSk7CisKIGV4dGVybiBjcHVtYXNrX3QgeGVuX2NwdV9pbml0aWFsaXplZF9tYXA7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHhlbl9zbXBfaW5pdCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYwppbmRleCBhMDAzNTllLi45NjA2ZDJiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYwpAQCAtNTMsMTEgKzUzLDYgQEAKIHN0cnVjdCBmZF9vcHMgKmZkX29wczsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREUpIHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFX01PRFVMRSkKLWV4dGVybiBzdHJ1Y3QgaWRlX29wcyBub19pZGVfb3BzOwotc3RydWN0IGlkZV9vcHMgKmlkZV9vcHM7Ci0jZW5kaWYKLQogZXh0ZXJuIHN0cnVjdCBydGNfb3BzIG5vX3J0Y19vcHM7CiBzdHJ1Y3QgcnRjX29wcyAqcnRjX29wczsKIApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCAyMDgwMDBiLi5iZmU3MzA0IDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQorKysgYi9ibG9jay9NYWtlZmlsZQpAQCAtNCw4ICs0LDggQEAKIAogb2JqLSQoQ09ORklHX0JMT0NLKSA6PSBlbGV2YXRvci5vIGJsay1jb3JlLm8gYmxrLXRhZy5vIGJsay1zeXNmcy5vIFwKIAkJCWJsay1iYXJyaWVyLm8gYmxrLXNldHRpbmdzLm8gYmxrLWlvYy5vIGJsay1tYXAubyBcCi0JCQlibGstZXhlYy5vIGJsay1tZXJnZS5vIGlvY3RsLm8gZ2VuaGQubyBzY3NpX2lvY3RsLm8gXAotCQkJY21kLWZpbHRlci5vCisJCQlibGstZXhlYy5vIGJsay1tZXJnZS5vIGJsay1zb2Z0aXJxLm8gYmxrLXRpbWVvdXQubyBcCisJCQlpb2N0bC5vIGdlbmhkLm8gc2NzaV9pb2N0bC5vIGNtZC1maWx0ZXIubwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9CU0cpCSs9IGJzZy5vCiBvYmotJChDT05GSUdfSU9TQ0hFRF9OT09QKQkrPSBub29wLWlvc2NoZWQubwpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IGNmNGViMGUuLjcxZjBhYmIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQkJZGVsX3RpbWVyKCZhZC0+YW50aWNfdGltZXIpOwogCQlhZC0+YW50aWNfc3RhdHVzID0gQU5USUNfRklOSVNIRUQ7CiAJCS8qIHNlZSBhc193b3JrX2hhbmRsZXIgKi8KLQkJa2Jsb2NrZF9zY2hlZHVsZV93b3JrKCZhZC0+YW50aWNfd29yayk7CisJCWtibG9ja2Rfc2NoZWR1bGVfd29yayhhZC0+cSwgJmFkLT5hbnRpY193b3JrKTsKIAl9CiB9CiAKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlhaWMgPSBhZC0+aW9fY29udGV4dC0+YWljOwogCiAJCWFkLT5hbnRpY19zdGF0dXMgPSBBTlRJQ19GSU5JU0hFRDsKLQkJa2Jsb2NrZF9zY2hlZHVsZV93b3JrKCZhZC0+YW50aWNfd29yayk7CisJCWtibG9ja2Rfc2NoZWR1bGVfd29yayhxLCAmYWQtPmFudGljX3dvcmspOwogCiAJCWlmIChhaWMtPnR0aW1lX3NhbXBsZXMgPT0gMCkgewogCQkJLyogcHJvY2VzcyBhbnRpY2lwYXRlZCBvbiBoYXMgZXhpdGVkIG9yIHRpbWVkIG91dCovCkBAIC03NDUsNiArNzQ1LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgYXNfY2FuX2FudGljaXBhdGUoc3RydWN0IGFzX2RhdGEgKmFkLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CisjaWYgMCAvKiBkaXNhYmxlIGZvciBub3csIHdlIG5lZWQgdG8gY2hlY2sgdGFnIGxldmVsIGFzIHdlbGwgKi8KKwkvKgorCSAqIFNTRCBkZXZpY2Ugd2l0aG91dCBzZWVrIHBlbmFsdHksIGRpc2FibGUgaWRsaW5nCisJICovCisJaWYgKGJsa19xdWV1ZV9ub25yb3QoYWQtPnEpKSBheG1hbgorCQlyZXR1cm4gMDsKKyNlbmRpZgorCiAJaWYgKCFhZC0+aW9fY29udGV4dCkKIAkJLyoKIAkJICogTGFzdCByZXF1ZXN0IHN1Ym1pdHRlZCB3YXMgYSB3cml0ZQpAQCAtODQ0LDcgKzg1Miw3IEBACiAJaWYgKGFkLT5jaGFuZ2VkX2JhdGNoICYmIGFkLT5ucl9kaXNwYXRjaGVkID09IDEpIHsKIAkJYWQtPmN1cnJlbnRfYmF0Y2hfZXhwaXJlcyA9IGppZmZpZXMgKwogCQkJCQlhZC0+YmF0Y2hfZXhwaXJlW2FkLT5iYXRjaF9kYXRhX2Rpcl07Ci0JCWtibG9ja2Rfc2NoZWR1bGVfd29yaygmYWQtPmFudGljX3dvcmspOworCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsocSwgJmFkLT5hbnRpY193b3JrKTsKIAkJYWQtPmNoYW5nZWRfYmF0Y2ggPSAwOwogCiAJCWlmIChhZC0+YmF0Y2hfZGF0YV9kaXIgPT0gUkVRX1NZTkMpCmRpZmYgLS1naXQgYS9ibG9jay9ibGstYmFycmllci5jIGIvYmxvY2svYmxrLWJhcnJpZXIuYwppbmRleCBhMDllYWQxLi41Yzk5ZmY4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstYmFycmllci5jCisrKyBiL2Jsb2NrL2Jsay1iYXJyaWVyLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9lbXB0eV9iYXJyaWVyOwogCWJpby0+YmlfcHJpdmF0ZSA9ICZ3YWl0OwogCWJpby0+YmlfYmRldiA9IGJkZXY7Ci0Jc3VibWl0X2JpbygxIDw8IEJJT19SV19CQVJSSUVSLCBiaW8pOworCXN1Ym1pdF9iaW8oV1JJVEVfQkFSUklFUiwgYmlvKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCkBAIC0zMTUsMyArMzE1LDczIEBACiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxrZGV2X2lzc3VlX2ZsdXNoKTsKKworc3RhdGljIHZvaWQgYmxrZGV2X2Rpc2NhcmRfZW5kX2lvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCisJCQlzZXRfYml0KEJJT19FT1BOT1RTVVBQLCAmYmlvLT5iaV9mbGFncyk7CisJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwl9CisKKwliaW9fcHV0KGJpbyk7Cit9CisKKy8qKgorICogYmxrZGV2X2lzc3VlX2Rpc2NhcmQgLSBxdWV1ZSBhIGRpc2NhcmQKKyAqIEBiZGV2OglibG9ja2RldiB0byBpc3N1ZSBkaXNjYXJkIGZvcgorICogQHNlY3RvcjoJc3RhcnQgc2VjdG9yCisgKiBAbnJfc2VjdHM6CW51bWJlciBvZiBzZWN0b3JzIHRvIGRpc2NhcmQKKyAqIEBnZnBfbWFzazoJbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKGZvciBiaW9fYWxsb2MpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBJc3N1ZSBhIGRpc2NhcmQgcmVxdWVzdCBmb3IgdGhlIHNlY3RvcnMgaW4gcXVlc3Rpb24uIERvZXMgbm90IHdhaXQuCisgKi8KK2ludCBibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJIHNlY3Rvcl90IHNlY3Rvciwgc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChiZGV2LT5iZF9kaXNrID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisJaWYgKCFxKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFxLT5wcmVwYXJlX2Rpc2NhcmRfZm4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXdoaWxlIChucl9zZWN0cyAmJiAhcmV0KSB7CisJCWJpbyA9IGJpb19hbGxvYyhnZnBfbWFzaywgMCk7CisJCWlmICghYmlvKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYmlvLT5iaV9lbmRfaW8gPSBibGtkZXZfZGlzY2FyZF9lbmRfaW87CisJCWJpby0+YmlfYmRldiA9IGJkZXY7CisKKwkJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CisKKwkJaWYgKG5yX3NlY3RzID4gcS0+bWF4X2h3X3NlY3RvcnMpIHsKKwkJCWJpby0+Ymlfc2l6ZSA9IHEtPm1heF9od19zZWN0b3JzIDw8IDk7CisJCQlucl9zZWN0cyAtPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJCXNlY3RvciArPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJfSBlbHNlIHsKKwkJCWJpby0+Ymlfc2l6ZSA9IG5yX3NlY3RzIDw8IDk7CisJCQlucl9zZWN0cyA9IDA7CisJCX0KKwkJYmlvX2dldChiaW8pOworCQlzdWJtaXRfYmlvKERJU0NBUkRfQkFSUklFUiwgYmlvKTsKKworCQkvKiBDaGVjayBpZiBpdCBmYWlsZWQgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkpCisJCQlyZXQgPSAtRUlPOworCQliaW9fcHV0KGJpbyk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGJsa2Rldl9pc3N1ZV9kaXNjYXJkKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDJjYmE1ZWYuLjJkMDUzYjUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMjYsOCArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+CiAjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CiAKQEAgLTUwLDI3ICs0OCwyNiBAQAogICovCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtibG9ja2Rfd29ya3F1ZXVlOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgYmxrX2NwdV9kb25lKTsKLQogc3RhdGljIHZvaWQgZHJpdmVfc3RhdF9hY2N0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IG5ld19pbykKIHsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwogCWludCBydyA9IHJxX2RhdGFfZGlyKHJxKTsKKwlpbnQgY3B1OwogCiAJaWYgKCFibGtfZnNfcmVxdWVzdChycSkgfHwgIXJxLT5ycV9kaXNrKQogCQlyZXR1cm47CiAKLQlwYXJ0ID0gZ2V0X3BhcnQocnEtPnJxX2Rpc2ssIHJxLT5zZWN0b3IpOworCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CisJcGFydCA9IGRpc2tfbWFwX3NlY3Rvcl9yY3UocnEtPnJxX2Rpc2ssIHJxLT5zZWN0b3IpOworCiAJaWYgKCFuZXdfaW8pCi0JCV9fYWxsX3N0YXRfaW5jKHJxLT5ycV9kaXNrLCBwYXJ0LCBtZXJnZXNbcnddLCBycS0+c2VjdG9yKTsKKwkJcGFydF9zdGF0X2luYyhjcHUsIHBhcnQsIG1lcmdlc1tyd10pOwogCWVsc2UgewotCQlkaXNrX3JvdW5kX3N0YXRzKHJxLT5ycV9kaXNrKTsKLQkJcnEtPnJxX2Rpc2stPmluX2ZsaWdodCsrOwotCQlpZiAocGFydCkgewotCQkJcGFydF9yb3VuZF9zdGF0cyhwYXJ0KTsKLQkJCXBhcnQtPmluX2ZsaWdodCsrOwotCQl9CisJCXBhcnRfcm91bmRfc3RhdHMoY3B1LCBwYXJ0KTsKKwkJcGFydF9pbmNfaW5fZmxpZ2h0KHBhcnQpOwogCX0KKworCXBhcnRfc3RhdF91bmxvY2soKTsKIH0KIAogdm9pZCBibGtfcXVldWVfY29uZ2VzdGlvbl90aHJlc2hvbGQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0xMTMsNyArMTEwLDggQEAKIAltZW1zZXQocnEsIDAsIHNpemVvZigqcnEpKTsKIAogCUlOSVRfTElTVF9IRUFEKCZycS0+cXVldWVsaXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcnEtPmRvbmVsaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcnEtPnRpbWVvdXRfbGlzdCk7CisJcnEtPmNwdSA9IC0xOwogCXJxLT5xID0gcTsKIAlycS0+c2VjdG9yID0gcnEtPmhhcmRfc2VjdG9yID0gKHNlY3Rvcl90KSAtMTsKIAlJTklUX0hMSVNUX05PREUoJnJxLT5oYXNoKTsKQEAgLTMwOCw3ICszMDYsNyBAQAogCWJsa19hZGRfdHJhY2VfcGR1X2ludChxLCBCTEtfVEFfVU5QTFVHX1RJTUVSLCBOVUxMLAogCQkJCXEtPnJxLmNvdW50W1JFQURdICsgcS0+cnEuY291bnRbV1JJVEVdKTsKIAotCWtibG9ja2Rfc2NoZWR1bGVfd29yaygmcS0+dW5wbHVnX3dvcmspOworCWtibG9ja2Rfc2NoZWR1bGVfd29yayhxLCAmcS0+dW5wbHVnX3dvcmspOwogfQogCiB2b2lkIGJsa191bnBsdWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0zMjUsNiArMzIzLDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa191bnBsdWcpOwogCitzdGF0aWMgdm9pZCBibGtfaW52b2tlX3JlcXVlc3RfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJLyoKKwkgKiBvbmUgbGV2ZWwgb2YgcmVjdXJzaW9uIGlzIG9rIGFuZCBpcyBtdWNoIGZhc3RlciB0aGFuIGtpY2tpbmcKKwkgKiB0aGUgdW5wbHVnIGhhbmRsaW5nCisJICovCisJaWYgKCFxdWV1ZV9mbGFnX3Rlc3RfYW5kX3NldChRVUVVRV9GTEFHX1JFRU5URVIsIHEpKSB7CisJCXEtPnJlcXVlc3RfZm4ocSk7CisJCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19SRUVOVEVSLCBxKTsKKwl9IGVsc2UgeworCQlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1BMVUdHRUQsIHEpOworCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsocSwgJnEtPnVucGx1Z193b3JrKTsKKwl9Cit9CisKIC8qKgogICogYmxrX3N0YXJ0X3F1ZXVlIC0gcmVzdGFydCBhIHByZXZpb3VzbHkgc3RvcHBlZCBxdWV1ZQogICogQHE6ICAgIFRoZSAmc3RydWN0IHJlcXVlc3RfcXVldWUgaW4gcXVlc3Rpb24KQEAgLTMzOSwxOCArMzUyLDcgQEAKIAlXQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJcXVldWVfZmxhZ19jbGVhcihRVUVVRV9GTEFHX1NUT1BQRUQsIHEpOwotCi0JLyoKLQkgKiBvbmUgbGV2ZWwgb2YgcmVjdXJzaW9uIGlzIG9rIGFuZCBpcyBtdWNoIGZhc3RlciB0aGFuIGtpY2tpbmcKLQkgKiB0aGUgdW5wbHVnIGhhbmRsaW5nCi0JICovCi0JaWYgKCFxdWV1ZV9mbGFnX3Rlc3RfYW5kX3NldChRVUVVRV9GTEFHX1JFRU5URVIsIHEpKSB7Ci0JCXEtPnJlcXVlc3RfZm4ocSk7Ci0JCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19SRUVOVEVSLCBxKTsKLQl9IGVsc2UgewotCQlibGtfcGx1Z19kZXZpY2UocSk7Ci0JCWtibG9ja2Rfc2NoZWR1bGVfd29yaygmcS0+dW5wbHVnX3dvcmspOwotCX0KKwlibGtfaW52b2tlX3JlcXVlc3RfZm4ocSk7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19zdGFydF9xdWV1ZSk7CiAKQEAgLTQwOCwxNSArNDEwLDggQEAKIAkgKiBPbmx5IHJlY3Vyc2Ugb25jZSB0byBhdm9pZCBvdmVycnVubmluZyB0aGUgc3RhY2ssIGxldCB0aGUgdW5wbHVnCiAJICogaGFuZGxpbmcgcmVpbnZva2UgdGhlIGhhbmRsZXIgc2hvcnRseSBpZiB3ZSBhbHJlYWR5IGdvdCB0aGVyZS4KIAkgKi8KLQlpZiAoIWVsdl9xdWV1ZV9lbXB0eShxKSkgewotCQlpZiAoIXF1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KFFVRVVFX0ZMQUdfUkVFTlRFUiwgcSkpIHsKLQkJCXEtPnJlcXVlc3RfZm4ocSk7Ci0JCQlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfUkVFTlRFUiwgcSk7Ci0JCX0gZWxzZSB7Ci0JCQlibGtfcGx1Z19kZXZpY2UocSk7Ci0JCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsoJnEtPnVucGx1Z193b3JrKTsKLQkJfQotCX0KKwlpZiAoIWVsdl9xdWV1ZV9lbXB0eShxKSkKKwkJYmxrX2ludm9rZV9yZXF1ZXN0X2ZuKHEpOwogfQogRVhQT1JUX1NZTUJPTChfX2Jsa19ydW5fcXVldWUpOwogCkBAIC00NDEsNiArNDM2LDE0IEBACiAKIHZvaWQgYmxrX2NsZWFudXBfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CisJLyoKKwkgKiBXZSBrbm93IHdlIGhhdmUgcHJvY2VzcyBjb250ZXh0IGhlcmUsIHNvIHdlIGNhbiBiZSBhIGxpdHRsZQorCSAqIGNhdXRpb3VzIGFuZCBlbnN1cmUgdGhhdCBwZW5kaW5nIGJsb2NrIGFjdGlvbnMgb24gdGhpcyBkZXZpY2UKKwkgKiBhcmUgZG9uZSBiZWZvcmUgbW92aW5nIG9uLiBHb2luZyBpbnRvIHRoaXMgZnVuY3Rpb24sIHdlIHNob3VsZAorCSAqIG5vdCBoYXZlIHByb2Nlc3NlcyBkb2luZyBJTyB0byB0aGlzIGRldmljZS4KKwkgKi8KKwlibGtfc3luY19xdWV1ZShxKTsKKwogCW11dGV4X2xvY2soJnEtPnN5c2ZzX2xvY2spOwogCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfREVBRCwgcSk7CiAJbXV0ZXhfdW5sb2NrKCZxLT5zeXNmc19sb2NrKTsKQEAgLTQ5Niw2ICs0OTksOCBAQAogCX0KIAogCWluaXRfdGltZXIoJnEtPnVucGx1Z190aW1lcik7CisJc2V0dXBfdGltZXIoJnEtPnRpbWVvdXQsIGJsa19ycV90aW1lZF9vdXRfdGltZXIsICh1bnNpZ25lZCBsb25nKSBxKTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+dGltZW91dF9saXN0KTsKIAogCWtvYmplY3RfaW5pdCgmcS0+a29iaiwgJmJsa19xdWV1ZV9rdHlwZSk7CiAKQEAgLTUzMSw3ICs1MzYsNyBAQAogICogICAgcmVxdWVzdCBxdWV1ZTsgdGhpcyBsb2NrIHdpbGwgYmUgdGFrZW4gYWxzbyBmcm9tIGludGVycnVwdCBjb250ZXh0LCBzbyBpcnEKICAqICAgIGRpc2FibGluZyBpcyBuZWVkZWQgZm9yIGl0LgogICoKLSAqICAgIEZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCByZXF1ZXN0IHF1ZXVlLCBvciBOVUxMIGlmCisgKiAgICBGdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgcmVxdWVzdCBxdWV1ZSwgb3IgJU5VTEwgaWYKICAqICAgIGl0IGRpZG4ndCBzdWNjZWVkLgogICoKICAqIE5vdGU6CkBAIC01NjksNyArNTc0LDggQEAKIAlxLT5yZXF1ZXN0X2ZuCQk9IHJmbjsKIAlxLT5wcmVwX3JxX2ZuCQk9IE5VTEw7CiAJcS0+dW5wbHVnX2ZuCQk9IGdlbmVyaWNfdW5wbHVnX2RldmljZTsKLQlxLT5xdWV1ZV9mbGFncwkJPSAoMSA8PCBRVUVVRV9GTEFHX0NMVVNURVIpOworCXEtPnF1ZXVlX2ZsYWdzCQk9ICgxIDw8IFFVRVVFX0ZMQUdfQ0xVU1RFUiB8CisJCQkJICAgMSA8PCBRVUVVRV9GTEFHX1NUQUNLQUJMRSk7CiAJcS0+cXVldWVfbG9jawkJPSBsb2NrOwogCiAJYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkocSwgMHhmZmZmZmZmZik7CkBAIC02MjQsMTAgKzYzMCw2IEBACiAKIAlibGtfcnFfaW5pdChxLCBycSk7CiAKLQkvKgotCSAqIGZpcnN0IHRocmVlIGJpdHMgYXJlIGlkZW50aWNhbCBpbiBycS0+Y21kX2ZsYWdzIGFuZCBiaW8tPmJpX3J3LAotCSAqIHNlZSBiaW8uaCBhbmQgYmxrZGV2LmgKLQkgKi8KIAlycS0+Y21kX2ZsYWdzID0gcncgfCBSRVFfQUxMT0NFRDsKIAogCWlmIChwcml2KSB7CkBAIC04ODgsOSArODkwLDExIEBACiAgKi8KIHZvaWQgYmxrX3N0YXJ0X3F1ZXVlaW5nKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCWlmICghYmxrX3F1ZXVlX3BsdWdnZWQocSkpCisJaWYgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkgeworCQlpZiAodW5saWtlbHkoYmxrX3F1ZXVlX3N0b3BwZWQocSkpKQorCQkJcmV0dXJuOwogCQlxLT5yZXF1ZXN0X2ZuKHEpOwotCWVsc2UKKwl9IGVsc2UKIAkJX19nZW5lcmljX3VucGx1Z19kZXZpY2UocSk7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19zdGFydF9xdWV1ZWluZyk7CkBAIC05MDcsNiArOTExLDggQEAKICAqLwogdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CisJYmxrX2RlbGV0ZV90aW1lcihycSk7CisJYmxrX2NsZWFyX3JxX2NvbXBsZXRlKHJxKTsKIAlibGtfYWRkX3RyYWNlX3JxKHEsIHJxLCBCTEtfVEFfUkVRVUVVRSk7CiAKIAlpZiAoYmxrX3JxX3RhZ2dlZChycSkpCkBAIC05MTcsNyArOTIzLDcgQEAKIEVYUE9SVF9TWU1CT0woYmxrX3JlcXVldWVfcmVxdWVzdCk7CiAKIC8qKgotICogYmxrX2luc2VydF9yZXF1ZXN0IC0gaW5zZXJ0IGEgc3BlY2lhbCByZXF1ZXN0IGluIHRvIGEgcmVxdWVzdCBxdWV1ZQorICogYmxrX2luc2VydF9yZXF1ZXN0IC0gaW5zZXJ0IGEgc3BlY2lhbCByZXF1ZXN0IGludG8gYSByZXF1ZXN0IHF1ZXVlCiAgKiBAcToJCXJlcXVlc3QgcXVldWUgd2hlcmUgcmVxdWVzdCBzaG91bGQgYmUgaW5zZXJ0ZWQKICAqIEBycToJCXJlcXVlc3QgdG8gYmUgaW5zZXJ0ZWQKICAqIEBhdF9oZWFkOglpbnNlcnQgcmVxdWVzdCBhdCBoZWFkIG9yIHRhaWwgb2YgcXVldWUKQEAgLTkyNyw4ICs5MzMsOCBAQAogICogICAgTWFueSBibG9jayBkZXZpY2VzIG5lZWQgdG8gZXhlY3V0ZSBjb21tYW5kcyBhc3luY2hyb25vdXNseSwgc28gdGhleSBkb24ndAogICogICAgYmxvY2sgdGhlIHdob2xlIGtlcm5lbCBmcm9tIHByZWVtcHRpb24gZHVyaW5nIHJlcXVlc3QgZXhlY3V0aW9uLiAgVGhpcyBpcwogICogICAgYWNjb21wbGlzaGVkIG5vcm1hbGx5IGJ5IGluc2VydGluZyBhcml0ZmljaWFsIHJlcXVlc3RzIHRhZ2dlZCBhcwotICogICAgUkVRX1NQRUNJQUwgaW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCBxdWV1ZSwgYW5kIGxldHRpbmcgdGhlbSBiZQotICogICAgc2NoZWR1bGVkIGZvciBhY3R1YWwgZXhlY3V0aW9uIGJ5IHRoZSByZXF1ZXN0IHF1ZXVlLgorICogICAgUkVRX1RZUEVfU1BFQ0lBTCBpbiB0byB0aGUgY29ycmVzcG9uZGluZyByZXF1ZXN0IHF1ZXVlLCBhbmQgbGV0dGluZyB0aGVtCisgKiAgICBiZSBzY2hlZHVsZWQgZm9yIGFjdHVhbCBleGVjdXRpb24gYnkgdGhlIHJlcXVlc3QgcXVldWUuCiAgKgogICogICAgV2UgaGF2ZSB0aGUgb3B0aW9uIG9mIGluc2VydGluZyB0aGUgaGVhZCBvciB0aGUgdGFpbCBvZiB0aGUgcXVldWUuCiAgKiAgICBUeXBpY2FsbHkgd2UgdXNlIHRoZSB0YWlsIGZvciBuZXcgaW9jdGxzIGFuZCBzbyBmb3J0aC4gIFdlIHVzZSB0aGUgaGVhZApAQCAtOTgyLDggKzk4OCwyMiBAQAogCV9fZWx2X2FkZF9yZXF1ZXN0KHEsIHJlcSwgRUxFVkFUT1JfSU5TRVJUX1NPUlQsIDApOwogfQogCi0vKgotICogZGlza19yb3VuZF9zdGF0cygpCS0gUm91bmQgb2ZmIHRoZSBwZXJmb3JtYW5jZSBzdGF0cyBvbiBhIHN0cnVjdAorc3RhdGljIHZvaWQgcGFydF9yb3VuZF9zdGF0c19zaW5nbGUoaW50IGNwdSwgc3RydWN0IGhkX3N0cnVjdCAqcGFydCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBub3cpCit7CisJaWYgKG5vdyA9PSBwYXJ0LT5zdGFtcCkKKwkJcmV0dXJuOworCisJaWYgKHBhcnQtPmluX2ZsaWdodCkgeworCQlfX3BhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCB0aW1lX2luX3F1ZXVlLAorCQkJCXBhcnQtPmluX2ZsaWdodCAqIChub3cgLSBwYXJ0LT5zdGFtcCkpOworCQlfX3BhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBpb190aWNrcywgKG5vdyAtIHBhcnQtPnN0YW1wKSk7CisJfQorCXBhcnQtPnN0YW1wID0gbm93OworfQorCisvKioKKyAqIHBhcnRfcm91bmRfc3RhdHMoKQktIFJvdW5kIG9mZiB0aGUgcGVyZm9ybWFuY2Ugc3RhdHMgb24gYSBzdHJ1Y3QKICAqIGRpc2tfc3RhdHMuCiAgKgogICogVGhlIGF2ZXJhZ2UgSU8gcXVldWUgbGVuZ3RoIGFuZCB1dGlsaXNhdGlvbiBzdGF0aXN0aWNzIGFyZSBtYWludGFpbmVkCkBAIC05OTcsMzYgKzEwMTcsMTUgQEAKICAqIC9wcm9jL2Rpc2tzdGF0cy4gIFRoaXMgYWNjb3VudHMgaW1tZWRpYXRlbHkgZm9yIGFsbCBxdWV1ZSB1c2FnZSB1cCB0bwogICogdGhlIGN1cnJlbnQgamlmZmllcyBhbmQgcmVzdGFydHMgdGhlIGNvdW50ZXJzIGFnYWluLgogICovCi12b2lkIGRpc2tfcm91bmRfc3RhdHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCit2b2lkIHBhcnRfcm91bmRfc3RhdHMoaW50IGNwdSwgc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAKLQlpZiAobm93ID09IGRpc2stPnN0YW1wKQotCQlyZXR1cm47Ci0KLQlpZiAoZGlzay0+aW5fZmxpZ2h0KSB7Ci0JCV9fZGlza19zdGF0X2FkZChkaXNrLCB0aW1lX2luX3F1ZXVlLAotCQkJCWRpc2stPmluX2ZsaWdodCAqIChub3cgLSBkaXNrLT5zdGFtcCkpOwotCQlfX2Rpc2tfc3RhdF9hZGQoZGlzaywgaW9fdGlja3MsIChub3cgLSBkaXNrLT5zdGFtcCkpOwotCX0KLQlkaXNrLT5zdGFtcCA9IG5vdzsKKwlpZiAocGFydC0+cGFydG5vKQorCQlwYXJ0X3JvdW5kX3N0YXRzX3NpbmdsZShjcHUsICZwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLCBub3cpOworCXBhcnRfcm91bmRfc3RhdHNfc2luZ2xlKGNwdSwgcGFydCwgbm93KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRpc2tfcm91bmRfc3RhdHMpOwotCi12b2lkIHBhcnRfcm91bmRfc3RhdHMoc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKLXsKLQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0KLQlpZiAobm93ID09IHBhcnQtPnN0YW1wKQotCQlyZXR1cm47Ci0KLQlpZiAocGFydC0+aW5fZmxpZ2h0KSB7Ci0JCV9fcGFydF9zdGF0X2FkZChwYXJ0LCB0aW1lX2luX3F1ZXVlLAotCQkJCXBhcnQtPmluX2ZsaWdodCAqIChub3cgLSBwYXJ0LT5zdGFtcCkpOwotCQlfX3BhcnRfc3RhdF9hZGQocGFydCwgaW9fdGlja3MsIChub3cgLSBwYXJ0LT5zdGFtcCkpOwotCX0KLQlwYXJ0LT5zdGFtcCA9IG5vdzsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHBhcnRfcm91bmRfc3RhdHMpOwogCiAvKgogICogcXVldWUgbG9jayBtdXN0IGJlIGhlbGQKQEAgLTEwNzAsNiArMTA2OSw3IEBACiAKIHZvaWQgaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBiaW8gKmJpbykKIHsKKwlyZXEtPmNwdSA9IGJpby0+YmlfY29tcF9jcHU7CiAJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0ZTOwogCiAJLyoKQEAgLTEwODEsNyArMTA4MSwxMiBAQAogCS8qCiAJICogUkVRX0JBUlJJRVIgaW1wbGllcyBubyBtZXJnaW5nLCBidXQgbGV0cyBtYWtlIGl0IGV4cGxpY2l0CiAJICovCi0JaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKQorCWlmICh1bmxpa2VseShiaW9fZGlzY2FyZChiaW8pKSkgeworCQlyZXEtPmNtZF9mbGFncyB8PSBSRVFfRElTQ0FSRDsKKwkJaWYgKGJpb19iYXJyaWVyKGJpbykpCisJCQlyZXEtPmNtZF9mbGFncyB8PSBSRVFfU09GVEJBUlJJRVI7CisJCXJlcS0+cS0+cHJlcGFyZV9kaXNjYXJkX2ZuKHJlcS0+cSwgcmVxKTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKQogCQlyZXEtPmNtZF9mbGFncyB8PSAoUkVRX0hBUkRCQVJSSUVSIHwgUkVRX05PTUVSR0UpOwogCiAJaWYgKGJpb19zeW5jKGJpbykpCkBAIC0xMDk5LDcgKzExMDQsNyBAQAogc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IGVsX3JldCwgbnJfc2VjdG9ycywgYmFycmllciwgZXJyOworCWludCBlbF9yZXQsIG5yX3NlY3RvcnMsIGJhcnJpZXIsIGRpc2NhcmQsIGVycjsKIAljb25zdCB1bnNpZ25lZCBzaG9ydCBwcmlvID0gYmlvX3ByaW8oYmlvKTsKIAljb25zdCBpbnQgc3luYyA9IGJpb19zeW5jKGJpbyk7CiAJaW50IHJ3X2ZsYWdzOwpAQCAtMTExNCw3ICsxMTE5LDE0IEBACiAJYmxrX3F1ZXVlX2JvdW5jZShxLCAmYmlvKTsKIAogCWJhcnJpZXIgPSBiaW9fYmFycmllcihiaW8pOwotCWlmICh1bmxpa2VseShiYXJyaWVyKSAmJiAocS0+bmV4dF9vcmRlcmVkID09IFFVRVVFX09SREVSRURfTk9ORSkpIHsKKwlpZiAodW5saWtlbHkoYmFycmllcikgJiYgYmlvX2hhc19kYXRhKGJpbykgJiYKKwkgICAgKHEtPm5leHRfb3JkZXJlZCA9PSBRVUVVRV9PUkRFUkVEX05PTkUpKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIGVuZF9pbzsKKwl9CisKKwlkaXNjYXJkID0gYmlvX2Rpc2NhcmQoYmlvKTsKKwlpZiAodW5saWtlbHkoZGlzY2FyZCkgJiYgIXEtPnByZXBhcmVfZGlzY2FyZF9mbikgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBlbmRfaW87CiAJfQpAQCAtMTEzOCw2ICsxMTUwLDggQEAKIAkJcmVxLT5iaW90YWlsID0gYmlvOwogCQlyZXEtPm5yX3NlY3RvcnMgPSByZXEtPmhhcmRfbnJfc2VjdG9ycyArPSBucl9zZWN0b3JzOwogCQlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBwcmlvKTsKKwkJaWYgKCFibGtfcnFfY3B1X3ZhbGlkKHJlcSkpCisJCQlyZXEtPmNwdSA9IGJpby0+YmlfY29tcF9jcHU7CiAJCWRyaXZlX3N0YXRfYWNjdChyZXEsIDApOwogCQlpZiAoIWF0dGVtcHRfYmFja19tZXJnZShxLCByZXEpKQogCQkJZWx2X21lcmdlZF9yZXF1ZXN0KHEsIHJlcSwgZWxfcmV0KTsKQEAgLTExNjUsNiArMTE3OSw4IEBACiAJCXJlcS0+c2VjdG9yID0gcmVxLT5oYXJkX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCQlyZXEtPm5yX3NlY3RvcnMgPSByZXEtPmhhcmRfbnJfc2VjdG9ycyArPSBucl9zZWN0b3JzOwogCQlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBwcmlvKTsKKwkJaWYgKCFibGtfcnFfY3B1X3ZhbGlkKHJlcSkpCisJCQlyZXEtPmNwdSA9IGJpby0+YmlfY29tcF9jcHU7CiAJCWRyaXZlX3N0YXRfYWNjdChyZXEsIDApOwogCQlpZiAoIWF0dGVtcHRfZnJvbnRfbWVyZ2UocSwgcmVxKSkKIAkJCWVsdl9tZXJnZWRfcmVxdWVzdChxLCByZXEsIGVsX3JldCk7CkBAIC0xMjAwLDEzICsxMjE2LDE1IEBACiAJaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHJlcSwgYmlvKTsKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpIHx8CisJICAgIGJpb19mbGFnZ2VkKGJpbywgQklPX0NQVV9BRkZJTkUpKQorCQlyZXEtPmNwdSA9IGJsa19jcHVfdG9fZ3JvdXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlpZiAoZWx2X3F1ZXVlX2VtcHR5KHEpKQogCQlibGtfcGx1Z19kZXZpY2UocSk7CiAJYWRkX3JlcXVlc3QocSwgcmVxKTsKIG91dDoKIAlpZiAoc3luYykKIAkJX19nZW5lcmljX3VucGx1Z19kZXZpY2UocSk7Ci0KIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJcmV0dXJuIDA7CiAKQEAgLTEyNjAsOCArMTI3OCw5IEBACiAKIHN0YXRpYyBpbnQgc2hvdWxkX2ZhaWxfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaWYgKChiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfRkFJTCkgfHwKLQkgICAgKGJpby0+YmlfYmRldi0+YmRfcGFydCAmJiBiaW8tPmJpX2JkZXYtPmJkX3BhcnQtPm1ha2VfaXRfZmFpbCkpCisJc3RydWN0IGhkX3N0cnVjdCAqcGFydCA9IGJpby0+YmlfYmRldi0+YmRfcGFydDsKKworCWlmIChwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLm1ha2VfaXRfZmFpbCB8fCBwYXJ0LT5tYWtlX2l0X2ZhaWwpCiAJCXJldHVybiBzaG91bGRfZmFpbCgmZmFpbF9tYWtlX3JlcXVlc3QsIGJpby0+Ymlfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMTQsNyArMTMzMyw3IEBACiB9CiAKIC8qKgotICogZ2VuZXJpY19tYWtlX3JlcXVlc3Q6IGhhbmQgYSBidWZmZXIgdG8gaXRzIGRldmljZSBkcml2ZXIgZm9yIEkvTworICogZ2VuZXJpY19tYWtlX3JlcXVlc3QgLSBoYW5kIGEgYnVmZmVyIHRvIGl0cyBkZXZpY2UgZHJpdmVyIGZvciBJL08KICAqIEBiaW86ICBUaGUgYmlvIGRlc2NyaWJpbmcgdGhlIGxvY2F0aW9uIGluIG1lbW9yeSBhbmQgb24gdGhlIGRldmljZS4KICAqCiAgKiBnZW5lcmljX21ha2VfcmVxdWVzdCgpIGlzIHVzZWQgdG8gbWFrZSBJL08gcmVxdWVzdHMgb2YgYmxvY2sKQEAgLTE0MDksNyArMTQyOCw4IEBACiAKIAkJaWYgKGJpb19jaGVja19lb2QoYmlvLCBucl9zZWN0b3JzKSkKIAkJCWdvdG8gZW5kX2lvOwotCQlpZiAoYmlvX2VtcHR5X2JhcnJpZXIoYmlvKSAmJiAhcS0+cHJlcGFyZV9mbHVzaF9mbikgeworCQlpZiAoKGJpb19lbXB0eV9iYXJyaWVyKGJpbykgJiYgIXEtPnByZXBhcmVfZmx1c2hfZm4pIHx8CisJCSAgICAoYmlvX2Rpc2NhcmQoYmlvKSAmJiAhcS0+cHJlcGFyZV9kaXNjYXJkX2ZuKSkgewogCQkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCQlnb3RvIGVuZF9pbzsKIAkJfQpAQCAtMTQ3MSwxMyArMTQ5MSwxMyBAQAogRVhQT1JUX1NZTUJPTChnZW5lcmljX21ha2VfcmVxdWVzdCk7CiAKIC8qKgotICogc3VibWl0X2Jpbzogc3VibWl0IGEgYmlvIHRvIHRoZSBibG9jayBkZXZpY2UgbGF5ZXIgZm9yIEkvTworICogc3VibWl0X2JpbyAtIHN1Ym1pdCBhIGJpbyB0byB0aGUgYmxvY2sgZGV2aWNlIGxheWVyIGZvciBJL08KICAqIEBydzogd2hldGhlciB0byAlUkVBRCBvciAlV1JJVEUsIG9yIG1heWJlIHRvICVSRUFEQSAocmVhZCBhaGVhZCkKICAqIEBiaW86IFRoZSAmc3RydWN0IGJpbyB3aGljaCBkZXNjcmliZXMgdGhlIEkvTwogICoKICAqIHN1Ym1pdF9iaW8oKSBpcyB2ZXJ5IHNpbWlsYXIgaW4gcHVycG9zZSB0byBnZW5lcmljX21ha2VfcmVxdWVzdCgpLCBhbmQKICAqIHVzZXMgdGhhdCBmdW5jdGlvbiB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLiBCb3RoIGFyZSBmYWlybHkgcm91Z2gKLSAqIGludGVyZmFjZXMsIEBiaW8gbXVzdCBiZSBwcmVzZXR1cCBhbmQgcmVhZHkgZm9yIEkvTy4KKyAqIGludGVyZmFjZXM7IEBiaW8gbXVzdCBiZSBwcmVzZXR1cCBhbmQgcmVhZHkgZm9yIEkvTy4KICAqCiAgKi8KIHZvaWQgc3VibWl0X2JpbyhpbnQgcncsIHN0cnVjdCBiaW8gKmJpbykKQEAgLTE0OTAsMTEgKzE1MTAsNyBAQAogCSAqIElmIGl0J3MgYSByZWd1bGFyIHJlYWQvd3JpdGUgb3IgYSBiYXJyaWVyIHdpdGggZGF0YSBhdHRhY2hlZCwKIAkgKiBnbyB0aHJvdWdoIHRoZSBub3JtYWwgYWNjb3VudGluZyBzdHVmZiBiZWZvcmUgc3VibWlzc2lvbi4KIAkgKi8KLQlpZiAoIWJpb19lbXB0eV9iYXJyaWVyKGJpbykpIHsKLQotCQlCSU9fQlVHX09OKCFiaW8tPmJpX3NpemUpOwotCQlCSU9fQlVHX09OKCFiaW8tPmJpX2lvX3ZlYyk7Ci0KKwlpZiAoYmlvX2hhc19kYXRhKGJpbykpIHsKIAkJaWYgKHJ3ICYgV1JJVEUpIHsKIAkJCWNvdW50X3ZtX2V2ZW50cyhQR1BHT1VULCBjb3VudCk7CiAJCX0gZWxzZSB7CkBAIC0xNTE3LDkgKzE1MzMsOTAgQEAKIEVYUE9SVF9TWU1CT0woc3VibWl0X2Jpbyk7CiAKIC8qKgorICogYmxrX3JxX2NoZWNrX2xpbWl0cyAtIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBhIHJlcXVlc3QgZm9yIHRoZSBxdWV1ZSBsaW1pdAorICogQHE6ICB0aGUgcXVldWUKKyAqIEBycTogdGhlIHJlcXVlc3QgYmVpbmcgY2hlY2tlZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgQHJxIG1heSBoYXZlIGJlZW4gbWFkZSBiYXNlZCBvbiB3ZWFrZXIgbGltaXRhdGlvbnMgb2YgdXBwZXItbGV2ZWwgcXVldWVzCisgKiAgICBpbiByZXF1ZXN0IHN0YWNraW5nIGRyaXZlcnMsIGFuZCBpdCBtYXkgdmlvbGF0ZSB0aGUgbGltaXRhdGlvbiBvZiBAcS4KKyAqICAgIFNpbmNlIHRoZSBibG9jayBsYXllciBhbmQgdGhlIHVuZGVybHlpbmcgZGV2aWNlIGRyaXZlciB0cnVzdCBAcnEKKyAqICAgIGFmdGVyIGl0IGlzIGluc2VydGVkIHRvIEBxLCBpdCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0IEBxIGJlZm9yZQorICogICAgdGhlIGluc2VydGlvbiB1c2luZyB0aGlzIGdlbmVyaWMgZnVuY3Rpb24uCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYWxzbyBiZSB1c2VmdWwgZm9yIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVycworICogICAgaW4gc29tZSBjYXNlcyBiZWxvdywgc28gZXhwb3J0IHRoaXMgZnVjdGlvbi4KKyAqICAgIFJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVycyBsaWtlIHJlcXVlc3QtYmFzZWQgZG0gbWF5IGNoYW5nZSB0aGUgcXVldWUKKyAqICAgIGxpbWl0cyB3aGlsZSByZXF1ZXN0cyBhcmUgaW4gdGhlIHF1ZXVlIChlLmcuIGRtJ3MgdGFibGUgc3dhcHBpbmcpLgorICogICAgU3VjaCByZXF1ZXN0IHN0YWNraW5nIGRyaXZlcnMgc2hvdWxkIGNoZWNrIHRob3NlIHJlcXVlc3RzIGFnYWlzdAorICogICAgdGhlIG5ldyBxdWV1ZSBsaW1pdHMgYWdhaW4gd2hlbiB0aGV5IGRpc3BhdGNoIHRob3NlIHJlcXVlc3RzLAorICogICAgYWx0aG91Z2ggc3VjaCBjaGVja2luZ3MgYXJlIGFsc28gZG9uZSBhZ2FpbnN0IHRoZSBvbGQgcXVldWUgbGltaXRzCisgKiAgICB3aGVuIHN1Ym1pdHRpbmcgcmVxdWVzdHMuCisgKi8KK2ludCBibGtfcnFfY2hlY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJaWYgKHJxLT5ucl9zZWN0b3JzID4gcS0+bWF4X3NlY3RvcnMgfHwKKwkgICAgcnEtPmRhdGFfbGVuID4gcS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdmVyIG1heCBzaXplIGxpbWl0LlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIHF1ZXVlJ3Mgc2V0dGluZ3MgcmVsYXRlZCB0byBzZWdtZW50IGNvdW50aW5nIGxpa2UgcS0+Ym91bmNlX3BmbgorCSAqIG1heSBkaWZmZXIgZnJvbSB0aGF0IG9mIG90aGVyIHN0YWNraW5nIHF1ZXVlcy4KKwkgKiBSZWNhbGN1bGF0ZSBpdCB0byBjaGVjayB0aGUgcmVxdWVzdCBjb3JyZWN0bHkgb24gdGhpcyBxdWV1ZSdzCisJICogbGltaXRhdGlvbi4KKwkgKi8KKwlibGtfcmVjYWxjX3JxX3NlZ21lbnRzKHJxKTsKKwlpZiAocnEtPm5yX3BoeXNfc2VnbWVudHMgPiBxLT5tYXhfcGh5c19zZWdtZW50cyB8fAorCSAgICBycS0+bnJfcGh5c19zZWdtZW50cyA+IHEtPm1heF9od19zZWdtZW50cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdmVyIG1heCBzZWdtZW50cyBsaW1pdC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfcnFfY2hlY2tfbGltaXRzKTsKKworLyoqCisgKiBibGtfaW5zZXJ0X2Nsb25lZF9yZXF1ZXN0IC0gSGVscGVyIGZvciBzdGFja2luZyBkcml2ZXJzIHRvIHN1Ym1pdCBhIHJlcXVlc3QKKyAqIEBxOiAgdGhlIHF1ZXVlIHRvIHN1Ym1pdCB0aGUgcmVxdWVzdAorICogQHJxOiB0aGUgcmVxdWVzdCBiZWluZyBxdWV1ZWQKKyAqLworaW50IGJsa19pbnNlcnRfY2xvbmVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJsa19ycV9jaGVja19saW1pdHMocSwgcnEpKQorCQlyZXR1cm4gLUVJTzsKKworI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAorCWlmIChycS0+cnFfZGlzayAmJiBycS0+cnFfZGlzay0+cGFydDAubWFrZV9pdF9mYWlsICYmCisJICAgIHNob3VsZF9mYWlsKCZmYWlsX21ha2VfcmVxdWVzdCwgYmxrX3JxX2J5dGVzKHJxKSkpCisJCXJldHVybiAtRUlPOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFN1Ym1pdHRpbmcgcmVxdWVzdCBtdXN0IGJlIGRlcXVldWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKwkgKiBiZWNhdXNlIGl0IHdpbGwgYmUgbGlua2VkIHRvIGFub3RoZXIgcmVxdWVzdF9xdWV1ZQorCSAqLworCUJVR19PTihibGtfcXVldWVkX3JxKHJxKSk7CisKKwlkcml2ZV9zdGF0X2FjY3QocnEsIDEpOworCV9fZWx2X2FkZF9yZXF1ZXN0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfQkFDSywgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2luc2VydF9jbG9uZWRfcmVxdWVzdCk7CisKKy8qKgogICogX19lbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0IC0gZW5kIEkvTyBvbiBhIHJlcXVlc3QKICAqIEByZXE6ICAgICAgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCi0gKiBAZXJyb3I6ICAgIDAgZm9yIHN1Y2Nlc3MsIDwgMCBmb3IgZXJyb3IKKyAqIEBlcnJvcjogICAgJTAgZm9yIHN1Y2Nlc3MsIDwgJTAgZm9yIGVycm9yCiAgKiBAbnJfYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byBjb21wbGV0ZQogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtMTUyNyw4ICsxNjI0LDggQEAKICAqICAgICBmb3IgdGhlIG5leHQgcmFuZ2Ugb2Ygc2VnbWVudHMgKGlmIGFueSkgaW4gdGhlIGNsdXN0ZXIuCiAgKgogICogUmV0dXJuOgotICogICAgIDAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdCwgY2FsbCBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKQotICogICAgIDEgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAorICogICAgICUwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QsIGNhbGwgZW5kX3RoYXRfcmVxdWVzdF9sYXN0KCkKKyAqICAgICAlMSAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CiAgKiovCiBzdGF0aWMgaW50IF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IsCiAJCQkJICAgIGludCBucl9ieXRlcykKQEAgLTE1MzksNyArMTYzNiw3IEBACiAJYmxrX2FkZF90cmFjZV9ycShyZXEtPnEsIHJlcSwgQkxLX1RBX0NPTVBMRVRFKTsKIAogCS8qCi0JICogZm9yIGEgUkVRX0JMT0NLX1BDIHJlcXVlc3QsIHdlIHdhbnQgdG8gY2FycnkgYW55IGV2ZW50dWFsCisJICogZm9yIGEgUkVRX1RZUEVfQkxPQ0tfUEMgcmVxdWVzdCwgd2Ugd2FudCB0byBjYXJyeSBhbnkgZXZlbnR1YWwKIAkgKiBzZW5zZSBrZXkgd2l0aCB1cyBhbGwgdGhlIHdheSB0aHJvdWdoCiAJICovCiAJaWYgKCFibGtfcGNfcmVxdWVzdChyZXEpKQpAQCAtMTU1MiwxMSArMTY0OSwxNCBAQAogCX0KIAogCWlmIChibGtfZnNfcmVxdWVzdChyZXEpICYmIHJlcS0+cnFfZGlzaykgewotCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gZ2V0X3BhcnQocmVxLT5ycV9kaXNrLCByZXEtPnNlY3Rvcik7CiAJCWNvbnN0IGludCBydyA9IHJxX2RhdGFfZGlyKHJlcSk7CisJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisJCWludCBjcHU7CiAKLQkJYWxsX3N0YXRfYWRkKHJlcS0+cnFfZGlzaywgcGFydCwgc2VjdG9yc1tyd10sCi0JCQkJbnJfYnl0ZXMgPj4gOSwgcmVxLT5zZWN0b3IpOworCQljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOworCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIHJlcS0+c2VjdG9yKTsKKwkJcGFydF9zdGF0X2FkZChjcHUsIHBhcnQsIHNlY3RvcnNbcnddLCBucl9ieXRlcyA+PiA5KTsKKwkJcGFydF9zdGF0X3VubG9jaygpOwogCX0KIAogCXRvdGFsX2J5dGVzID0gYmlvX25ieXRlcyA9IDA7CkBAIC0xNjQxLDg4ICsxNzQxLDE0IEBACiB9CiAKIC8qCi0gKiBzcGxpY2UgdGhlIGNvbXBsZXRpb24gZGF0YSB0byBhIGxvY2FsIHN0cnVjdHVyZSBhbmQgaGFuZCBvZmYgdG8KLSAqIHByb2Nlc3NfY29tcGxldGlvbl9xdWV1ZSgpIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0cwotICovCi1zdGF0aWMgdm9pZCBibGtfZG9uZV9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjcHVfbGlzdCwgbG9jYWxfbGlzdDsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JY3B1X2xpc3QgPSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpOwotCWxpc3RfcmVwbGFjZV9pbml0KGNwdV9saXN0LCAmbG9jYWxfbGlzdCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJcnEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCwgc3RydWN0IHJlcXVlc3QsIGRvbmVsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmcnEtPmRvbmVsaXN0KTsKLQkJcnEtPnEtPnNvZnRpcnFfZG9uZV9mbihycSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9fY3B1aW5pdCBibGtfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCS8qCi0JICogSWYgYSBDUFUgZ29lcyBhd2F5LCBzcGxpY2UgaXRzIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgQ1BVCi0JICogYW5kIHRyaWdnZXIgYSBydW4gb2YgdGhlIHNvZnRpcnEKLQkgKi8KLQlpZiAoYWN0aW9uID09IENQVV9ERUFEIHx8IGFjdGlvbiA9PSBDUFVfREVBRF9GUk9aRU4pIHsKLQkJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKSBoY3B1OwotCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBjcHUpLAotCQkJCSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpKTsKLQkJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYmxrX2NwdV9ub3RpZmllciBfX2NwdWluaXRkYXRhID0gewotCS5ub3RpZmllcl9jYWxsCT0gYmxrX2NwdV9ub3RpZnksCi19OwotCi0vKioKLSAqIGJsa19jb21wbGV0ZV9yZXF1ZXN0IC0gZW5kIEkvTyBvbiBhIHJlcXVlc3QKLSAqIEByZXE6ICAgICAgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICAgRW5kcyBhbGwgSS9PIG9uIGEgcmVxdWVzdC4gSXQgZG9lcyBub3QgaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbnMsCi0gKiAgICAgdW5sZXNzIHRoZSBkcml2ZXIgYWN0dWFsbHkgaW1wbGVtZW50cyB0aGlzIGluIGl0cyBjb21wbGV0aW9uIGNhbGxiYWNrCi0gKiAgICAgdGhyb3VnaCByZXF1ZXVlaW5nLiBUaGUgYWN0dWFsIGNvbXBsZXRpb24gaGFwcGVucyBvdXQtb2Ytb3JkZXIsCi0gKiAgICAgdGhyb3VnaCBhIHNvZnRpcnEgaGFuZGxlci4gVGhlIHVzZXIgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgYSBjb21wbGV0aW9uCi0gKiAgICAgY2FsbGJhY2sgdGhyb3VnaCBibGtfcXVldWVfc29mdGlycV9kb25lKCkuCi0gKiovCi0KLXZvaWQgYmxrX2NvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjcHVfbGlzdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JQlVHX09OKCFyZXEtPnEtPnNvZnRpcnFfZG9uZV9mbik7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljcHVfbGlzdCA9ICZfX2dldF9jcHVfdmFyKGJsa19jcHVfZG9uZSk7Ci0JbGlzdF9hZGRfdGFpbCgmcmVxLT5kb25lbGlzdCwgY3B1X2xpc3QpOwotCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKEJMT0NLX1NPRlRJUlEpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChibGtfY29tcGxldGVfcmVxdWVzdCk7Ci0KLS8qCiAgKiBxdWV1ZSBsb2NrIG11c3QgYmUgaGVsZAogICovCiBzdGF0aWMgdm9pZCBlbmRfdGhhdF9yZXF1ZXN0X2xhc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gcmVxLT5ycV9kaXNrOwogCisJYmxrX2RlbGV0ZV90aW1lcihyZXEpOworCiAJaWYgKGJsa19ycV90YWdnZWQocmVxKSkKIAkJYmxrX3F1ZXVlX2VuZF90YWcocmVxLT5xLCByZXEpOwogCkBAIC0xNzQwLDE2ICsxNzY2LDE4IEBACiAJaWYgKGRpc2sgJiYgYmxrX2ZzX3JlcXVlc3QocmVxKSAmJiByZXEgIT0gJnJlcS0+cS0+YmFyX3JxKSB7CiAJCXVuc2lnbmVkIGxvbmcgZHVyYXRpb24gPSBqaWZmaWVzIC0gcmVxLT5zdGFydF90aW1lOwogCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihyZXEpOwotCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gZ2V0X3BhcnQoZGlzaywgcmVxLT5zZWN0b3IpOworCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCQlpbnQgY3B1OwogCi0JCV9fYWxsX3N0YXRfaW5jKGRpc2ssIHBhcnQsIGlvc1tyd10sIHJlcS0+c2VjdG9yKTsKLQkJX19hbGxfc3RhdF9hZGQoZGlzaywgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbiwgcmVxLT5zZWN0b3IpOwotCQlkaXNrX3JvdW5kX3N0YXRzKGRpc2spOwotCQlkaXNrLT5pbl9mbGlnaHQtLTsKLQkJaWYgKHBhcnQpIHsKLQkJCXBhcnRfcm91bmRfc3RhdHMocGFydCk7Ci0JCQlwYXJ0LT5pbl9mbGlnaHQtLTsKLQkJfQorCQljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOworCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShkaXNrLCByZXEtPnNlY3Rvcik7CisKKwkJcGFydF9zdGF0X2luYyhjcHUsIHBhcnQsIGlvc1tyd10pOworCQlwYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbik7CisJCXBhcnRfcm91bmRfc3RhdHMoY3B1LCBwYXJ0KTsKKwkJcGFydF9kZWNfaW5fZmxpZ2h0KHBhcnQpOworCisJCXBhcnRfc3RhdF91bmxvY2soKTsKIAl9CiAKIAlpZiAocmVxLT5lbmRfaW8pCkBAIC0xNzYyLDE3ICsxNzkwLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlLAotCQkJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCi17Ci0JaW50IGVycm9yID0gMDsKLQotCWlmICh1cHRvZGF0ZSA8PSAwKQotCQllcnJvciA9IHVwdG9kYXRlID8gdXB0b2RhdGUgOiAtRUlPOwotCi0JX19ibGtfZW5kX3JlcXVlc3QocnEsIGVycm9yLCBucl9ieXRlcyk7Ci19Ci0KIC8qKgogICogYmxrX3JxX2J5dGVzIC0gUmV0dXJucyBieXRlcyBsZWZ0IHRvIGNvbXBsZXRlIGluIHRoZSBlbnRpcmUgcmVxdWVzdAogICogQHJxOiB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKQEAgLTE4MDMsOTIgKzE4MjAsMzYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGJsa19ycV9jdXJfYnl0ZXMpOwogCiAvKioKLSAqIGVuZF9xdWV1ZWRfcmVxdWVzdCAtIGVuZCBhbGwgSS9PIG9uIGEgcXVldWVkIHJlcXVlc3QKLSAqIEBycToJCXRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQHVwdG9kYXRlOgllcnJvciB2YWx1ZSBvciAwLzEgdXB0b2RhdGUgZmxhZwotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgYWxsIEkvTyBvbiBhIHJlcXVlc3QsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGJsb2NrIGxheWVyIHF1ZXVlcy4KLSAqICAgICBOb3Qgc3VpdGFibGUgZm9yIG5vcm1hbCBJTyBjb21wbGV0aW9uLCB1bmxlc3MgdGhlIGRyaXZlciBzdGlsbCBoYXMKLSAqICAgICB0aGUgcmVxdWVzdCBhdHRhY2hlZCB0byB0aGUgYmxvY2sgbGF5ZXIuCi0gKgotICoqLwotdm9pZCBlbmRfcXVldWVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUpCi17Ci0JX19lbmRfcmVxdWVzdChycSwgdXB0b2RhdGUsIGJsa19ycV9ieXRlcyhycSkpOwotfQotRVhQT1JUX1NZTUJPTChlbmRfcXVldWVkX3JlcXVlc3QpOwotCi0vKioKLSAqIGVuZF9kZXF1ZXVlZF9yZXF1ZXN0IC0gZW5kIGFsbCBJL08gb24gYSBkZXF1ZXVlZCByZXF1ZXN0Ci0gKiBAcnE6CQl0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEB1cHRvZGF0ZToJZXJyb3IgdmFsdWUgb3IgMC8xIHVwdG9kYXRlIGZsYWcKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgICBFbmRzIGFsbCBJL08gb24gYSByZXF1ZXN0LiBUaGUgcmVxdWVzdCBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuCi0gKiAgICAgZGVxdWV1ZWQgdXNpbmcgYmxrZGV2X2RlcXVldWVfcmVxdWVzdCgpLCBhcyBpcyBub3JtYWxseSB0aGUgY2FzZQotICogICAgIGZvciBtb3N0IGRyaXZlcnMuCi0gKgotICoqLwotdm9pZCBlbmRfZGVxdWV1ZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB1cHRvZGF0ZSkKLXsKLQlfX2VuZF9yZXF1ZXN0KHJxLCB1cHRvZGF0ZSwgYmxrX3JxX2J5dGVzKHJxKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVuZF9kZXF1ZXVlZF9yZXF1ZXN0KTsKLQotCi0vKioKICAqIGVuZF9yZXF1ZXN0IC0gZW5kIEkvTyBvbiB0aGUgY3VycmVudCBzZWdtZW50IG9mIHRoZSByZXF1ZXN0CiAgKiBAcmVxOgl0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEB1cHRvZGF0ZToJZXJyb3IgdmFsdWUgb3IgMC8xIHVwdG9kYXRlIGZsYWcKKyAqIEB1cHRvZGF0ZToJZXJyb3IgdmFsdWUgb3IgJTAvJTEgdXB0b2RhdGUgZmxhZwogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgIEVuZHMgSS9PIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQgb2YgYSByZXF1ZXN0LiBJZiB0aGF0IGlzIHRoZSBvbmx5CiAgKiAgICAgcmVtYWluaW5nIHNlZ21lbnQsIHRoZSByZXF1ZXN0IGlzIGFsc28gY29tcGxldGVkIGFuZCBmcmVlZC4KICAqCi0gKiAgICAgVGhpcyBpcyBhIHJlbW5hbnQgb2YgaG93IG9sZGVyIGJsb2NrIGRyaXZlcnMgaGFuZGxlZCBJTyBjb21wbGV0aW9ucy4KLSAqICAgICBNb2Rlcm4gZHJpdmVycyB0eXBpY2FsbHkgZW5kIElPIG9uIHRoZSBmdWxsIHJlcXVlc3QgaW4gb25lIGdvLCB1bmxlc3MKKyAqICAgICBUaGlzIGlzIGEgcmVtbmFudCBvZiBob3cgb2xkZXIgYmxvY2sgZHJpdmVycyBoYW5kbGVkIEkvTyBjb21wbGV0aW9ucy4KKyAqICAgICBNb2Rlcm4gZHJpdmVycyB0eXBpY2FsbHkgZW5kIEkvTyBvbiB0aGUgZnVsbCByZXF1ZXN0IGluIG9uZSBnbywgdW5sZXNzCiAgKiAgICAgdGhleSBoYXZlIGEgcmVzaWR1YWwgdmFsdWUgdG8gYWNjb3VudCBmb3IuIEZvciB0aGF0IGNhc2UgdGhpcyBmdW5jdGlvbgogICogICAgIGlzbid0IHJlYWxseSB1c2VmdWwsIHVubGVzcyB0aGUgcmVzaWR1YWwganVzdCBoYXBwZW5zIHRvIGJlIHRoZQogICogICAgIGZ1bGwgY3VycmVudCBzZWdtZW50LiBJbiBvdGhlciB3b3JkcywgZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaW4gbmV3Ci0gKiAgICAgY29kZS4gRWl0aGVyIHVzZSBlbmRfcmVxdWVzdF9jb21wbGV0ZWx5KCksIG9yIHRoZQotICogICAgIGVuZF90aGF0X3JlcXVlc3RfY2h1bmsoKSAoYWxvbmcgd2l0aCBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKSkgZm9yCi0gKiAgICAgcGFydGlhbCBjb21wbGV0aW9ucy4KLSAqCisgKiAgICAgY29kZS4gVXNlIGJsa19lbmRfcmVxdWVzdCgpIG9yIF9fYmxrX2VuZF9yZXF1ZXN0KCkgdG8gZW5kIGEgcmVxdWVzdC4KICAqKi8KIHZvaWQgZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlKQogewotCV9fZW5kX3JlcXVlc3QocmVxLCB1cHRvZGF0ZSwgcmVxLT5oYXJkX2N1cl9zZWN0b3JzIDw8IDkpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAodXB0b2RhdGUgPD0gMCkKKwkJZXJyb3IgPSB1cHRvZGF0ZSA/IHVwdG9kYXRlIDogLUVJTzsKKworCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIHJlcS0+aGFyZF9jdXJfc2VjdG9ycyA8PCA5KTsKIH0KIEVYUE9SVF9TWU1CT0woZW5kX3JlcXVlc3QpOwogCi0vKioKLSAqIGJsa19lbmRfaW8gLSBHZW5lcmljIGVuZF9pbyBmdW5jdGlvbiB0byBjb21wbGV0ZSBhIHJlcXVlc3QuCi0gKiBAcnE6ICAgICAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEBlcnJvcjogICAgICAgIDAgZm9yIHN1Y2Nlc3MsIDwgMCBmb3IgZXJyb3IKLSAqIEBucl9ieXRlczogICAgIG51bWJlciBvZiBieXRlcyB0byBjb21wbGV0ZSBAcnEKLSAqIEBiaWRpX2J5dGVzOiAgIG51bWJlciBvZiBieXRlcyB0byBjb21wbGV0ZSBAcnEtPm5leHRfcnEKLSAqIEBkcnZfY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxlZCBiZXR3ZWVuIGNvbXBsZXRpb24gb2YgYmlvcyBpbiB0aGUgcmVxdWVzdAotICogICAgICAgICAgICAgICAgYW5kIGNvbXBsZXRpb24gb2YgdGhlIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24gMCwgdGhpcyBoZWxwZXIgcmV0dXJucyB3aXRob3V0Ci0gKiAgICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIHRoZSByZXF1ZXN0LgotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycSBhbmQgQHJxLT5uZXh0X3JxLgotICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgotICoKLSAqIFJldHVybjoKLSAqICAgICAwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKLSAqICAgICAxIC0gdGhpcyByZXF1ZXN0IGlzIG5vdCBmcmVlZCB5ZXQsIGl0IHN0aWxsIGhhcyBwZW5kaW5nIGJ1ZmZlcnMuCi0gKiovCi1zdGF0aWMgaW50IGJsa19lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcywKLQkJICAgICAgdW5zaWduZWQgaW50IGJpZGlfYnl0ZXMsCi0JCSAgICAgIGludCAoZHJ2X2NhbGxiYWNrKShzdHJ1Y3QgcmVxdWVzdCAqKSkKK3N0YXRpYyBpbnQgZW5kX3RoYXRfcmVxdWVzdF9kYXRhKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAorCQkJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsIHVuc2lnbmVkIGludCBiaWRpX2J5dGVzKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDBVTDsKLQotCWlmIChibGtfZnNfcmVxdWVzdChycSkgfHwgYmxrX3BjX3JlcXVlc3QocnEpKSB7CisJaWYgKHJxLT5iaW8pIHsKIAkJaWYgKF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgZXJyb3IsIG5yX2J5dGVzKSkKIAkJCXJldHVybiAxOwogCkBAIC0xODk4LDYgKzE4NTksMzggQEAKIAkJCXJldHVybiAxOwogCX0KIAorCXJldHVybiAwOworfQorCisvKioKKyAqIGJsa19lbmRfaW8gLSBHZW5lcmljIGVuZF9pbyBmdW5jdGlvbiB0byBjb21wbGV0ZSBhIHJlcXVlc3QuCisgKiBAcnE6ICAgICAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAqIEBlcnJvcjogICAgICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgorICogQG5yX2J5dGVzOiAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycQorICogQGJpZGlfYnl0ZXM6ICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycS0+bmV4dF9ycQorICogQGRydl9jYWxsYmFjazogZnVuY3Rpb24gY2FsbGVkIGJldHdlZW4gY29tcGxldGlvbiBvZiBiaW9zIGluIHRoZSByZXF1ZXN0CisgKiAgICAgICAgICAgICAgICBhbmQgY29tcGxldGlvbiBvZiB0aGUgcmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbiAlMCwgdGhpcyBoZWxwZXIgcmV0dXJucyB3aXRob3V0CisgKiAgICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIHRoZSByZXF1ZXN0LgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycSBhbmQgQHJxLT5uZXh0X3JxLgorICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgorICoKKyAqIFJldHVybjoKKyAqICAgICAlMCAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0CisgKiAgICAgJTEgLSB0aGlzIHJlcXVlc3QgaXMgbm90IGZyZWVkIHlldCwgaXQgc3RpbGwgaGFzIHBlbmRpbmcgYnVmZmVycy4KKyAqKi8KK3N0YXRpYyBpbnQgYmxrX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwgdW5zaWduZWQgaW50IG5yX2J5dGVzLAorCQkgICAgICB1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcywKKwkJICAgICAgaW50IChkcnZfY2FsbGJhY2spKHN0cnVjdCByZXF1ZXN0ICopKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDBVTDsKKworCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2RhdGEocnEsIGVycm9yLCBucl9ieXRlcywgYmlkaV9ieXRlcykpCisJCXJldHVybiAxOworCiAJLyogU3BlY2lhbCBmZWF0dXJlIGZvciB0cmlja3kgZHJpdmVycyAqLwogCWlmIChkcnZfY2FsbGJhY2sgJiYgZHJ2X2NhbGxiYWNrKHJxKSkKIAkJcmV0dXJuIDE7CkBAIC0xOTE0LDcgKzE5MDcsNyBAQAogLyoqCiAgKiBibGtfZW5kX3JlcXVlc3QgLSBIZWxwZXIgZnVuY3Rpb24gZm9yIGRyaXZlcnMgdG8gY29tcGxldGUgdGhlIHJlcXVlc3QuCiAgKiBAcnE6ICAgICAgIHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAwIGZvciBzdWNjZXNzLCA8IDAgZm9yIGVycm9yCisgKiBAZXJyb3I6ICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgogICogQG5yX2J5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUKICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTE5MjIsOCArMTkxNSw4IEBACiAgKiAgICAgSWYgQHJxIGhhcyBsZWZ0b3Zlciwgc2V0cyBpdCB1cCBmb3IgdGhlIG5leHQgcmFuZ2Ugb2Ygc2VnbWVudHMuCiAgKgogICogUmV0dXJuOgotICogICAgIDAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAotICogICAgIDEgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAorICogICAgICUwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKKyAqICAgICAlMSAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CiAgKiovCiBpbnQgYmxrX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLCB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7CkBAIC0xOTM0LDIyICsxOTI3LDIwIEBACiAvKioKICAqIF9fYmxrX2VuZF9yZXF1ZXN0IC0gSGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXJzIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogICogQHJxOiAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEBlcnJvcjogICAgMCBmb3Igc3VjY2VzcywgPCAwIGZvciBlcnJvcgorICogQGVycm9yOiAgICAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKICAqIEBucl9ieXRlczogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlCiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgICAgTXVzdCBiZSBjYWxsZWQgd2l0aCBxdWV1ZSBsb2NrIGhlbGQgdW5saWtlIGJsa19lbmRfcmVxdWVzdCgpLgogICoKICAqIFJldHVybjoKLSAqICAgICAwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKLSAqICAgICAxIC0gc3RpbGwgYnVmZmVycyBwZW5kaW5nIGZvciB0aGlzIHJlcXVlc3QKKyAqICAgICAlMCAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0CisgKiAgICAgJTEgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAogICoqLwogaW50IF9fYmxrX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLCB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7Ci0JaWYgKGJsa19mc19yZXF1ZXN0KHJxKSB8fCBibGtfcGNfcmVxdWVzdChycSkpIHsKLQkJaWYgKF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgZXJyb3IsIG5yX2J5dGVzKSkKLQkJCXJldHVybiAxOwotCX0KKwlpZiAocnEtPmJpbyAmJiBfX2VuZF90aGF0X3JlcXVlc3RfZmlyc3QocnEsIGVycm9yLCBucl9ieXRlcykpCisJCXJldHVybiAxOwogCiAJYWRkX2Rpc2tfcmFuZG9tbmVzcyhycS0+cnFfZGlzayk7CiAKQEAgLTE5NjIsNyArMTk1Myw3IEBACiAvKioKICAqIGJsa19lbmRfYmlkaV9yZXF1ZXN0IC0gSGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXJzIHRvIGNvbXBsZXRlIGJpZGkgcmVxdWVzdC4KICAqIEBycTogICAgICAgICB0aGUgYmlkaSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAgIDAgZm9yIHN1Y2Nlc3MsIDwgMCBmb3IgZXJyb3IKKyAqIEBlcnJvcjogICAgICAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKICAqIEBucl9ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxCiAgKiBAYmlkaV9ieXRlczogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycS0+bmV4dF9ycQogICoKQEAgLTE5NzAsOCArMTk2MSw4IEBACiAgKiAgICAgRW5kcyBJL08gb24gYSBudW1iZXIgb2YgYnl0ZXMgYXR0YWNoZWQgdG8gQHJxIGFuZCBAcnEtPm5leHRfcnEuCiAgKgogICogUmV0dXJuOgotICogICAgIDAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAotICogICAgIDEgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAorICogICAgICUwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKKyAqICAgICAlMSAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CiAgKiovCiBpbnQgYmxrX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcywKIAkJCSB1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcykKQEAgLTE5ODEsMTMgKzE5NzIsNDMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGJsa19lbmRfYmlkaV9yZXF1ZXN0KTsKIAogLyoqCisgKiBibGtfdXBkYXRlX3JlcXVlc3QgLSBTcGVjaWFsIGhlbHBlciBmdW5jdGlvbiBmb3IgcmVxdWVzdCBzdGFja2luZyBkcml2ZXJzCisgKiBAcnE6ICAgICAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAqIEBlcnJvcjogICAgICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgorICogQG5yX2J5dGVzOiAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycSwgYnV0IGRvZXNuJ3QgY29tcGxldGUKKyAqICAgICB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgZXZlbiBpZiBAcnEgZG9lc24ndCBoYXZlIGxlZnRvdmVyLgorICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgorICoKKyAqICAgICBUaGlzIHNwZWNpYWwgaGVscGVyIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVycworICogICAgIChlLmcuIHJlcXVlc3QtYmFzZWQgZG0pIHNvIHRoYXQgdGhleSBjYW4gaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbi4KKyAqICAgICBBY3R1YWwgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIHVzZSBibGtfZW5kX3JlcXVlc3QgaW5zdGVhZC4KKyAqLwordm9pZCBibGtfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcykKK3sKKwlpZiAoIWVuZF90aGF0X3JlcXVlc3RfZGF0YShycSwgZXJyb3IsIG5yX2J5dGVzLCAwKSkgeworCQkvKgorCQkgKiBUaGVzZSBtZW1iZXJzIGFyZSBub3QgdXBkYXRlZCBpbiBlbmRfdGhhdF9yZXF1ZXN0X2RhdGEoKQorCQkgKiB3aGVuIGFsbCBiaW9zIGFyZSBjb21wbGV0ZWQuCisJCSAqIFVwZGF0ZSB0aGVtIHNvIHRoYXQgdGhlIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVyIGNhbiBmaW5kCisJCSAqIGhvdyBtYW55IGJ5dGVzIHJlbWFpbiBpbiB0aGUgcmVxdWVzdCBsYXRlci4KKwkJICovCisJCXJxLT5ucl9zZWN0b3JzID0gcnEtPmhhcmRfbnJfc2VjdG9ycyA9IDA7CisJCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBycS0+aGFyZF9jdXJfc2VjdG9ycyA9IDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3VwZGF0ZV9yZXF1ZXN0KTsKKworLyoqCiAgKiBibGtfZW5kX3JlcXVlc3RfY2FsbGJhY2sgLSBTcGVjaWFsIGhlbHBlciBmdW5jdGlvbiBmb3IgdHJpY2t5IGRyaXZlcnMKICAqIEBycTogICAgICAgICAgIHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAgICAgMCBmb3Igc3VjY2VzcywgPCAwIGZvciBlcnJvcgorICogQGVycm9yOiAgICAgICAgJTAgZm9yIHN1Y2Nlc3MsIDwgJTAgZm9yIGVycm9yCiAgKiBAbnJfYnl0ZXM6ICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUKICAqIEBkcnZfY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxlZCBiZXR3ZWVuIGNvbXBsZXRpb24gb2YgYmlvcyBpbiB0aGUgcmVxdWVzdAogICogICAgICAgICAgICAgICAgYW5kIGNvbXBsZXRpb24gb2YgdGhlIHJlcXVlc3QuCi0gKiAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24gMCwgdGhpcyBoZWxwZXIgcmV0dXJucyB3aXRob3V0CisgKiAgICAgICAgICAgICAgICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24gJTAsIHRoaXMgaGVscGVyIHJldHVybnMgd2l0aG91dAogICogICAgICAgICAgICAgICAgY29tcGxldGlvbiBvZiB0aGUgcmVxdWVzdC4KICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTIwMDAsMTAgKzIwMjEsMTAgQEAKICAqICAgICBEb24ndCB1c2UgdGhpcyBpbnRlcmZhY2UgaW4gb3RoZXIgcGxhY2VzIGFueW1vcmUuCiAgKgogICogUmV0dXJuOgotICogICAgIDAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAotICogICAgIDEgLSB0aGlzIHJlcXVlc3QgaXMgbm90IGZyZWVkIHlldC4KLSAqICAgICAgICAgdGhpcyByZXF1ZXN0IHN0aWxsIGhhcyBwZW5kaW5nIGJ1ZmZlcnMgb3IKLSAqICAgICAgICAgdGhlIGRyaXZlciBkb2Vzbid0IHdhbnQgdG8gZmluaXNoIHRoaXMgcmVxdWVzdCB5ZXQuCisgKiAgICAgJTAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAorICogICAgICUxIC0gdGhpcyByZXF1ZXN0IGlzIG5vdCBmcmVlZCB5ZXQuCisgKiAgICAgICAgICB0aGlzIHJlcXVlc3Qgc3RpbGwgaGFzIHBlbmRpbmcgYnVmZmVycyBvcgorICogICAgICAgICAgdGhlIGRyaXZlciBkb2Vzbid0IHdhbnQgdG8gZmluaXNoIHRoaXMgcmVxdWVzdCB5ZXQuCiAgKiovCiBpbnQgYmxrX2VuZF9yZXF1ZXN0X2NhbGxiYWNrKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAogCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsCkBAIC0yMDE2LDE1ICsyMDM3LDE3IEBACiB2b2lkIGJsa19ycV9iaW9fcHJlcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkgICAgIHN0cnVjdCBiaW8gKmJpbykKIHsKLQkvKiBmaXJzdCB0d28gYml0cyBhcmUgaWRlbnRpY2FsIGluIHJxLT5jbWRfZmxhZ3MgYW5kIGJpby0+YmlfcncgKi8KKwkvKiBCaXQgMCAoUi9XKSBpcyBpZGVudGljYWwgaW4gcnEtPmNtZF9mbGFncyBhbmQgYmlvLT5iaV9ydywgYW5kCisJICAgd2Ugd2FudCBCSU9fUldfQUhFQUQgKGJpdCAxKSB0byBpbXBseSBSRVFfRkFJTEZBU1QgKGJpdCAxKS4gKi8KIAlycS0+Y21kX2ZsYWdzIHw9IChiaW8tPmJpX3J3ICYgMyk7CiAKLQlycS0+bnJfcGh5c19zZWdtZW50cyA9IGJpb19waHlzX3NlZ21lbnRzKHEsIGJpbyk7Ci0JcnEtPm5yX2h3X3NlZ21lbnRzID0gYmlvX2h3X3NlZ21lbnRzKHEsIGJpbyk7CisJaWYgKGJpb19oYXNfZGF0YShiaW8pKSB7CisJCXJxLT5ucl9waHlzX3NlZ21lbnRzID0gYmlvX3BoeXNfc2VnbWVudHMocSwgYmlvKTsKKwkJcnEtPmJ1ZmZlciA9IGJpb19kYXRhKGJpbyk7CisJfQogCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBiaW9fY3VyX3NlY3RvcnMoYmlvKTsKIAlycS0+aGFyZF9jdXJfc2VjdG9ycyA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnM7CiAJcnEtPmhhcmRfbnJfc2VjdG9ycyA9IHJxLT5ucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQlycS0+YnVmZmVyID0gYmlvX2RhdGEoYmlvKTsKIAlycS0+ZGF0YV9sZW4gPSBiaW8tPmJpX3NpemU7CiAKIAlycS0+YmlvID0gcnEtPmJpb3RhaWwgPSBiaW87CkBAIC0yMDMzLDcgKzIwNTYsMzUgQEAKIAkJcnEtPnJxX2Rpc2sgPSBiaW8tPmJpX2JkZXYtPmJkX2Rpc2s7CiB9CiAKLWludCBrYmxvY2tkX3NjaGVkdWxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorLyoqCisgKiBibGtfbGxkX2J1c3kgLSBDaGVjayBpZiB1bmRlcmx5aW5nIGxvdy1sZXZlbCBkcml2ZXJzIG9mIGEgZGV2aWNlIGFyZSBidXN5CisgKiBAcSA6IHRoZSBxdWV1ZSBvZiB0aGUgZGV2aWNlIGJlaW5nIGNoZWNrZWQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIENoZWNrIGlmIHVuZGVybHlpbmcgbG93LWxldmVsIGRyaXZlcnMgb2YgYSBkZXZpY2UgYXJlIGJ1c3kuCisgKiAgICBJZiB0aGUgZHJpdmVycyB3YW50IHRvIGV4cG9ydCB0aGVpciBidXN5IHN0YXRlLCB0aGV5IG11c3Qgc2V0IG93bgorICogICAgZXhwb3J0aW5nIGZ1bmN0aW9uIHVzaW5nIGJsa19xdWV1ZV9sbGRfYnVzeSgpIGZpcnN0LgorICoKKyAqICAgIEJhc2ljYWxseSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgYnkgcmVxdWVzdCBzdGFja2luZyBkcml2ZXJzCisgKiAgICB0byBzdG9wIGRpc3BhdGNoaW5nIHJlcXVlc3RzIHRvIHVuZGVybHlpbmcgZGV2aWNlcyB3aGVuIHVuZGVybHlpbmcKKyAqICAgIGRldmljZXMgYXJlIGJ1c3kuICBUaGlzIGJlaGF2aW9yIGhlbHBzIG1vcmUgSS9PIG1lcmdpbmcgb24gdGhlIHF1ZXVlCisgKiAgICBvZiB0aGUgcmVxdWVzdCBzdGFja2luZyBkcml2ZXIgYW5kIHByZXZlbnRzIEkvTyB0aHJvdWdocHV0IHJlZ3Jlc3Npb24KKyAqICAgIG9uIGJ1cnN0IEkvTyBsb2FkLgorICoKKyAqIFJldHVybjoKKyAqICAgIDAgLSBOb3QgYnVzeSAoVGhlIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVyIHNob3VsZCBkaXNwYXRjaCByZXF1ZXN0KQorICogICAgMSAtIEJ1c3kgKFRoZSByZXF1ZXN0IHN0YWNraW5nIGRyaXZlciBzaG91bGQgc3RvcCBkaXNwYXRjaGluZyByZXF1ZXN0KQorICovCitpbnQgYmxrX2xsZF9idXN5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCWlmIChxLT5sbGRfYnVzeV9mbikKKwkJcmV0dXJuIHEtPmxsZF9idXN5X2ZuKHEpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfbGxkX2J1c3kpOworCitpbnQga2Jsb2NrZF9zY2hlZHVsZV93b3JrKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmV0dXJuIHF1ZXVlX3dvcmsoa2Jsb2NrZF93b3JrcXVldWUsIHdvcmspOwogfQpAQCAtMjA0Nyw4ICsyMDk4LDYgQEAKIAogaW50IF9faW5pdCBibGtfZGV2X2luaXQodm9pZCkKIHsKLQlpbnQgaTsKLQogCWtibG9ja2Rfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgia2Jsb2NrZCIpOwogCWlmICgha2Jsb2NrZF93b3JrcXVldWUpCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIGtibG9ja2RcbiIpOwpAQCAtMjA1OSwxMiArMjEwOCw2IEBACiAJYmxrX3JlcXVlc3RxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJibGtkZXZfcXVldWUiLAogCQkJc2l6ZW9mKHN0cnVjdCByZXF1ZXN0X3F1ZXVlKSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBpKSk7Ci0KLQlvcGVuX3NvZnRpcnEoQkxPQ0tfU09GVElSUSwgYmxrX2RvbmVfc29mdGlycSk7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZibGtfY3B1X25vdGlmaWVyKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstZXhlYy5jIGIvYmxvY2svYmxrLWV4ZWMuYwppbmRleCA5YmNlZmY3Li42YWY3MTZkIDEwMDY0NAotLS0gYS9ibG9jay9ibGstZXhlYy5jCisrKyBiL2Jsb2NrL2Jsay1leGVjLmMKQEAgLTE2LDcgKzE2LDcgQEAKIC8qKgogICogYmxrX2VuZF9zeW5jX3JxIC0gZXhlY3V0ZXMgYSBjb21wbGV0aW9uIGV2ZW50IG9uIGEgcmVxdWVzdAogICogQHJxOiByZXF1ZXN0IHRvIGNvbXBsZXRlCi0gKiBAZXJyb3I6IGVuZCBpbyBzdGF0dXMgb2YgdGhlIHJlcXVlc3QKKyAqIEBlcnJvcjogZW5kIEkvTyBzdGF0dXMgb2YgdGhlIHJlcXVlc3QKICAqLwogc3RhdGljIHZvaWQgYmxrX2VuZF9zeW5jX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQogewpAQCAtNDEsNyArNDEsNyBAQAogICogQGRvbmU6CUkvTyBjb21wbGV0aW9uIGhhbmRsZXIKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgIEluc2VydCBhIGZ1bGx5IHByZXBhcmVkIHJlcXVlc3QgYXQgdGhlIGJhY2sgb2YgdGhlIGlvIHNjaGVkdWxlciBxdWV1ZQorICogICAgSW5zZXJ0IGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdCBhdCB0aGUgYmFjayBvZiB0aGUgSS9PIHNjaGVkdWxlciBxdWV1ZQogICogICAgZm9yIGV4ZWN1dGlvbi4gIERvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24uCiAgKi8KIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywKQEAgLTcyLDcgKzcyLDcgQEAKICAqIEBhdF9oZWFkOiAgICBpbnNlcnQgcmVxdWVzdCBhdCBoZWFkIG9yIHRhaWwgb2YgcXVldWUKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgIEluc2VydCBhIGZ1bGx5IHByZXBhcmVkIHJlcXVlc3QgYXQgdGhlIGJhY2sgb2YgdGhlIGlvIHNjaGVkdWxlciBxdWV1ZQorICogICAgSW5zZXJ0IGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdCBhdCB0aGUgYmFjayBvZiB0aGUgSS9PIHNjaGVkdWxlciBxdWV1ZQogICogICAgZm9yIGV4ZWN1dGlvbiBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4KICAqLwogaW50IGJsa19leGVjdXRlX3JxKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYyBiL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYwppbmRleCAzZjFhODQ3Li42MWE4ZTJmIDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW50ZWdyaXR5LmMKKysrIGIvYmxvY2svYmxrLWludGVncml0eS5jCkBAIC0xMDgsNTEgKzEwOCw1MSBAQAogRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX2ludGVncml0eV9zZyk7CiAKIC8qKgotICogYmxrX2ludGVncml0eV9jb21wYXJlIC0gQ29tcGFyZSBpbnRlZ3JpdHkgcHJvZmlsZSBvZiB0d28gYmxvY2sgZGV2aWNlcwotICogQGIxOgkJRGV2aWNlIHRvIGNvbXBhcmUKLSAqIEBiMjoJCURldmljZSB0byBjb21wYXJlCisgKiBibGtfaW50ZWdyaXR5X2NvbXBhcmUgLSBDb21wYXJlIGludGVncml0eSBwcm9maWxlIG9mIHR3byBkaXNrcworICogQGdkMToJRGlzayB0byBjb21wYXJlCisgKiBAZ2QyOglEaXNrIHRvIGNvbXBhcmUKICAqCiAgKiBEZXNjcmlwdGlvbjogTWV0YS1kZXZpY2VzIGxpa2UgRE0gYW5kIE1EIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYWxsCiAgKiBzdWItZGV2aWNlcyB1c2UgdGhlIHNhbWUgaW50ZWdyaXR5IGZvcm1hdCBiZWZvcmUgYWR2ZXJ0aXNpbmcgdG8KICAqIHVwcGVyIGxheWVycyB0aGF0IHRoZXkgY2FuIHNlbmQvcmVjZWl2ZSBpbnRlZ3JpdHkgbWV0YWRhdGEuICBUaGlzCi0gKiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIHR3byBibG9jayBkZXZpY2VzIGhhdmUKKyAqIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdHdvIGdlbmRpc2sgZGV2aWNlcyBoYXZlCiAgKiBjb21wYXRpYmxlIGludGVncml0eSBmb3JtYXRzLgogICovCi1pbnQgYmxrX2ludGVncml0eV9jb21wYXJlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkMSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmQyKQoraW50IGJsa19pbnRlZ3JpdHlfY29tcGFyZShzdHJ1Y3QgZ2VuZGlzayAqZ2QxLCBzdHJ1Y3QgZ2VuZGlzayAqZ2QyKQogewotCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiMSA9IGJkMS0+YmRfZGlzay0+aW50ZWdyaXR5OwotCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiMiA9IGJkMi0+YmRfZGlzay0+aW50ZWdyaXR5OworCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiMSA9IGdkMS0+aW50ZWdyaXR5OworCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiMiA9IGdkMi0+aW50ZWdyaXR5OwogCi0JQlVHX09OKGJkMS0+YmRfZGlzayA9PSBOVUxMKTsKLQlCVUdfT04oYmQyLT5iZF9kaXNrID09IE5VTEwpOworCWlmICghYjEgJiYgIWIyKQorCQlyZXR1cm4gMDsKIAogCWlmICghYjEgfHwgIWIyKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGIxLT5zZWN0b3Jfc2l6ZSAhPSBiMi0+c2VjdG9yX3NpemUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMvJXMgc2VjdG9yIHN6ICV1ICE9ICV1XG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIGJkMS0+YmRfZGlzay0+ZGlza19uYW1lLCBiZDItPmJkX2Rpc2stPmRpc2tfbmFtZSwKKwkJICAgICAgIGdkMS0+ZGlza19uYW1lLCBnZDItPmRpc2tfbmFtZSwKIAkJICAgICAgIGIxLT5zZWN0b3Jfc2l6ZSwgYjItPnNlY3Rvcl9zaXplKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChiMS0+dHVwbGVfc2l6ZSAhPSBiMi0+dHVwbGVfc2l6ZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcy8lcyB0dXBsZSBzeiAldSAhPSAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgICBiZDEtPmJkX2Rpc2stPmRpc2tfbmFtZSwgYmQyLT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCSAgICAgICBnZDEtPmRpc2tfbmFtZSwgZ2QyLT5kaXNrX25hbWUsCiAJCSAgICAgICBiMS0+dHVwbGVfc2l6ZSwgYjItPnR1cGxlX3NpemUpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGIxLT50YWdfc2l6ZSAmJiBiMi0+dGFnX3NpemUgJiYgKGIxLT50YWdfc2l6ZSAhPSBiMi0+dGFnX3NpemUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzLyVzIHRhZyBzeiAldSAhPSAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgICBiZDEtPmJkX2Rpc2stPmRpc2tfbmFtZSwgYmQyLT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCSAgICAgICBnZDEtPmRpc2tfbmFtZSwgZ2QyLT5kaXNrX25hbWUsCiAJCSAgICAgICBiMS0+dGFnX3NpemUsIGIyLT50YWdfc2l6ZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoc3RyY21wKGIxLT5uYW1lLCBiMi0+bmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMvJXMgdHlwZSAlcyAhPSAlc1xuIiwgX19mdW5jX18sCi0JCSAgICAgICBiZDEtPmJkX2Rpc2stPmRpc2tfbmFtZSwgYmQyLT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCSAgICAgICBnZDEtPmRpc2tfbmFtZSwgZ2QyLT5kaXNrX25hbWUsCiAJCSAgICAgICBiMS0+bmFtZSwgYjItPm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzMxLDcgKzMzMSw4IEBACiAJCQlyZXR1cm4gLTE7CiAKIAkJaWYgKGtvYmplY3RfaW5pdF9hbmRfYWRkKCZiaS0+a29iaiwgJmludGVncml0eV9rdHlwZSwKLQkJCQkJICZkaXNrLT5kZXYua29iaiwgIiVzIiwgImludGVncml0eSIpKSB7CisJCQkJCSAmZGlza190b19kZXYoZGlzayktPmtvYmosCisJCQkJCSAiJXMiLCAiaW50ZWdyaXR5IikpIHsKIAkJCWttZW1fY2FjaGVfZnJlZShpbnRlZ3JpdHlfY2FjaGVwLCBiaSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTM3NSw3ICszNzYsNyBAQAogCiAJa29iamVjdF91ZXZlbnQoJmJpLT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJa29iamVjdF9kZWwoJmJpLT5rb2JqKTsKLQlrb2JqZWN0X3B1dCgmZGlzay0+ZGV2LmtvYmopOwogCWttZW1fY2FjaGVfZnJlZShpbnRlZ3JpdHlfY2FjaGVwLCBiaSk7CisJZGlzay0+aW50ZWdyaXR5ID0gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tYXAuYyBiL2Jsb2NrL2Jsay1tYXAuYwppbmRleCBhZjM3ZTRhLi40ODQ5ZmEzIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbWFwLmMKKysrIGIvYmxvY2svYmxrLW1hcC5jCkBAIC00MSwxMCArNDEsMTAgQEAKIH0KIAogc3RhdGljIGludCBfX2Jsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAotCQkJICAgICB2b2lkIF9fdXNlciAqdWJ1ZiwgdW5zaWduZWQgaW50IGxlbikKKwkJCSAgICAgc3RydWN0IHJxX21hcF9kYXRhICptYXBfZGF0YSwgdm9pZCBfX3VzZXIgKnVidWYsCisJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sIGludCBudWxsX21hcHBlZCwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyB1YWRkcjsKLQl1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwogCXN0cnVjdCBiaW8gKmJpbywgKm9yaWdfYmlvOwogCWludCByZWFkaW5nLCByZXQ7CiAKQEAgLTU1LDE1ICs1NSwxNyBAQAogCSAqIGRpcmVjdCBkbWEuIGVsc2UsIHNldCB1cCBrZXJuZWwgYm91bmNlIGJ1ZmZlcnMKIAkgKi8KIAl1YWRkciA9ICh1bnNpZ25lZCBsb25nKSB1YnVmOwotCWFsaWdubWVudCA9IHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkgfCBxLT5kbWFfcGFkX21hc2s7Ci0JaWYgKCEodWFkZHIgJiBhbGlnbm1lbnQpICYmICEobGVuICYgYWxpZ25tZW50KSkKLQkJYmlvID0gYmlvX21hcF91c2VyKHEsIE5VTEwsIHVhZGRyLCBsZW4sIHJlYWRpbmcpOworCWlmIChibGtfcnFfYWxpZ25lZChxLCB1YnVmLCBsZW4pICYmICFtYXBfZGF0YSkKKwkJYmlvID0gYmlvX21hcF91c2VyKHEsIE5VTEwsIHVhZGRyLCBsZW4sIHJlYWRpbmcsIGdmcF9tYXNrKTsKIAllbHNlCi0JCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgdWFkZHIsIGxlbiwgcmVhZGluZyk7CisJCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgbWFwX2RhdGEsIHVhZGRyLCBsZW4sIHJlYWRpbmcsIGdmcF9tYXNrKTsKIAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKIAorCWlmIChudWxsX21hcHBlZCkKKwkJYmlvLT5iaV9mbGFncyB8PSAoMSA8PCBCSU9fTlVMTF9NQVBQRUQpOworCiAJb3JpZ19iaW8gPSBiaW87CiAJYmxrX3F1ZXVlX2JvdW5jZShxLCAmYmlvKTsKIApAQCAtODUsMTcgKzg3LDE5IEBACiB9CiAKIC8qKgotICogYmxrX3JxX21hcF91c2VyIC0gbWFwIHVzZXIgZGF0YSB0byBhIHJlcXVlc3QsIGZvciBSRVFfQkxPQ0tfUEMgdXNhZ2UKKyAqIGJsa19ycV9tYXBfdXNlciAtIG1hcCB1c2VyIGRhdGEgdG8gYSByZXF1ZXN0LCBmb3IgUkVRX1RZUEVfQkxPQ0tfUEMgdXNhZ2UKICAqIEBxOgkJcmVxdWVzdCBxdWV1ZSB3aGVyZSByZXF1ZXN0IHNob3VsZCBiZSBpbnNlcnRlZAogICogQHJxOgkJcmVxdWVzdCBzdHJ1Y3R1cmUgdG8gZmlsbAorICogQG1hcF9kYXRhOiAgIHBvaW50ZXIgdG8gdGhlIHJxX21hcF9kYXRhIGhvbGRpbmcgcGFnZXMgKGlmIG5lY2Vzc2FyeSkKICAqIEB1YnVmOgl0aGUgdXNlciBidWZmZXIKICAqIEBsZW46CWxlbmd0aCBvZiB1c2VyIGRhdGEKKyAqIEBnZnBfbWFzazoJbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgIERhdGEgd2lsbCBiZSBtYXBwZWQgZGlyZWN0bHkgZm9yIHplcm8gY29weSBpbywgaWYgcG9zc2libGUuIE90aGVyd2lzZQorICogICAgRGF0YSB3aWxsIGJlIG1hcHBlZCBkaXJlY3RseSBmb3IgemVybyBjb3B5IEkvTywgaWYgcG9zc2libGUuIE90aGVyd2lzZQogICogICAgYSBrZXJuZWwgYm91bmNlIGJ1ZmZlciBpcyB1c2VkLgogICoKLSAqICAgIEEgbWF0Y2hpbmcgYmxrX3JxX3VubWFwX3VzZXIoKSBtdXN0IGJlIGlzc3VlZCBhdCB0aGUgZW5kIG9mIGlvLCB3aGlsZQorICogICAgQSBtYXRjaGluZyBibGtfcnFfdW5tYXBfdXNlcigpIG11c3QgYmUgaXNzdWVkIGF0IHRoZSBlbmQgb2YgSS9PLCB3aGlsZQogICogICAgc3RpbGwgaW4gcHJvY2VzcyBjb250ZXh0LgogICoKICAqICAgIE5vdGU6IFRoZSBtYXBwZWQgYmlvIG1heSBuZWVkIHRvIGJlIGJvdW5jZWQgdGhyb3VnaCBibGtfcXVldWVfYm91bmNlKCkKQEAgLTEwNSwxNiArMTA5LDIyIEBACiAgKiAgICB1bm1hcHBpbmcuCiAgKi8KIGludCBibGtfcnFfbWFwX3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKLQkJICAgIHZvaWQgX191c2VyICp1YnVmLCB1bnNpZ25lZCBsb25nIGxlbikKKwkJICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqbWFwX2RhdGEsIHZvaWQgX191c2VyICp1YnVmLAorCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sIGdmcF90IGdmcF9tYXNrKQogewogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZCA9IDA7CiAJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKLQlpbnQgcmV0OworCWludCByZXQsIG51bGxfbWFwcGVkID0gMDsKIAogCWlmIChsZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghbGVuIHx8ICF1YnVmKQorCWlmICghbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXVidWYpIHsKKwkJaWYgKCFtYXBfZGF0YSB8fCBycV9kYXRhX2RpcihycSkgIT0gUkVBRCkKKwkJCXJldHVybiAtRUlOVkFMOworCQludWxsX21hcHBlZCA9IDE7CisJfQogCiAJd2hpbGUgKGJ5dGVzX3JlYWQgIT0gbGVuKSB7CiAJCXVuc2lnbmVkIGxvbmcgbWFwX2xlbiwgZW5kLCBzdGFydDsKQEAgLTEzMiw3ICsxNDIsOCBAQAogCQlpZiAoZW5kIC0gc3RhcnQgPiBCSU9fTUFYX1BBR0VTKQogCQkJbWFwX2xlbiAtPSBQQUdFX1NJWkU7CiAKLQkJcmV0ID0gX19ibGtfcnFfbWFwX3VzZXIocSwgcnEsIHVidWYsIG1hcF9sZW4pOworCQlyZXQgPSBfX2Jsa19ycV9tYXBfdXNlcihxLCBycSwgbWFwX2RhdGEsIHVidWYsIG1hcF9sZW4sCisJCQkJCW51bGxfbWFwcGVkLCBnZnBfbWFzayk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byB1bm1hcF9ycTsKIAkJaWYgKCFiaW8pCkBAIC0xNTQsMTggKzE2NSwyMCBAQAogRVhQT1JUX1NZTUJPTChibGtfcnFfbWFwX3VzZXIpOwogCiAvKioKLSAqIGJsa19ycV9tYXBfdXNlcl9pb3YgLSBtYXAgdXNlciBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9CTE9DS19QQyB1c2FnZQorICogYmxrX3JxX21hcF91c2VyX2lvdiAtIG1hcCB1c2VyIGRhdGEgdG8gYSByZXF1ZXN0LCBmb3IgUkVRX1RZUEVfQkxPQ0tfUEMgdXNhZ2UKICAqIEBxOgkJcmVxdWVzdCBxdWV1ZSB3aGVyZSByZXF1ZXN0IHNob3VsZCBiZSBpbnNlcnRlZAogICogQHJxOgkJcmVxdWVzdCB0byBtYXAgZGF0YSB0bworICogQG1hcF9kYXRhOiAgIHBvaW50ZXIgdG8gdGhlIHJxX21hcF9kYXRhIGhvbGRpbmcgcGFnZXMgKGlmIG5lY2Vzc2FyeSkKICAqIEBpb3Y6CXBvaW50ZXIgdG8gdGhlIGlvdmVjCiAgKiBAaW92X2NvdW50OgludW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGlvdmVjCiAgKiBAbGVuOglJL08gYnl0ZSBjb3VudAorICogQGdmcF9tYXNrOgltZW1vcnkgYWxsb2NhdGlvbiBmbGFncwogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgRGF0YSB3aWxsIGJlIG1hcHBlZCBkaXJlY3RseSBmb3IgemVybyBjb3B5IGlvLCBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlCisgKiAgICBEYXRhIHdpbGwgYmUgbWFwcGVkIGRpcmVjdGx5IGZvciB6ZXJvIGNvcHkgSS9PLCBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlCiAgKiAgICBhIGtlcm5lbCBib3VuY2UgYnVmZmVyIGlzIHVzZWQuCiAgKgotICogICAgQSBtYXRjaGluZyBibGtfcnFfdW5tYXBfdXNlcigpIG11c3QgYmUgaXNzdWVkIGF0IHRoZSBlbmQgb2YgaW8sIHdoaWxlCisgKiAgICBBIG1hdGNoaW5nIGJsa19ycV91bm1hcF91c2VyKCkgbXVzdCBiZSBpc3N1ZWQgYXQgdGhlIGVuZCBvZiBJL08sIHdoaWxlCiAgKiAgICBzdGlsbCBpbiBwcm9jZXNzIGNvbnRleHQuCiAgKgogICogICAgTm90ZTogVGhlIG1hcHBlZCBiaW8gbWF5IG5lZWQgdG8gYmUgYm91bmNlZCB0aHJvdWdoIGJsa19xdWV1ZV9ib3VuY2UoKQpAQCAtMTc1LDcgKzE4OCw4IEBACiAgKiAgICB1bm1hcHBpbmcuCiAgKi8KIGludCBibGtfcnFfbWFwX3VzZXJfaW92KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCi0JCQlzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwgdW5zaWduZWQgaW50IGxlbikKKwkJCXN0cnVjdCBycV9tYXBfZGF0YSAqbWFwX2RhdGEsIHN0cnVjdCBzZ19pb3ZlYyAqaW92LAorCQkJaW50IGlvdl9jb3VudCwgdW5zaWduZWQgaW50IGxlbiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IGJpbyAqYmlvOwogCWludCBpLCByZWFkID0gcnFfZGF0YV9kaXIocnEpID09IFJFQUQ7CkBAIC0xOTMsMTAgKzIwNywxMSBAQAogCQl9CiAJfQogCi0JaWYgKHVuYWxpZ25lZCB8fCAocS0+ZG1hX3BhZF9tYXNrICYgbGVuKSkKLQkJYmlvID0gYmlvX2NvcHlfdXNlcl9pb3YocSwgaW92LCBpb3ZfY291bnQsIHJlYWQpOworCWlmICh1bmFsaWduZWQgfHwgKHEtPmRtYV9wYWRfbWFzayAmIGxlbikgfHwgbWFwX2RhdGEpCisJCWJpbyA9IGJpb19jb3B5X3VzZXJfaW92KHEsIG1hcF9kYXRhLCBpb3YsIGlvdl9jb3VudCwgcmVhZCwKKwkJCQkJZ2ZwX21hc2spOwogCWVsc2UKLQkJYmlvID0gYmlvX21hcF91c2VyX2lvdihxLCBOVUxMLCBpb3YsIGlvdl9jb3VudCwgcmVhZCk7CisJCWJpbyA9IGJpb19tYXBfdXNlcl9pb3YocSwgTlVMTCwgaW92LCBpb3ZfY291bnQsIHJlYWQsIGdmcF9tYXNrKTsKIAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKQEAgLTIxNiw2ICsyMzEsNyBAQAogCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGJsa19ycV9tYXBfdXNlcl9pb3YpOwogCiAvKioKICAqIGJsa19ycV91bm1hcF91c2VyIC0gdW5tYXAgYSByZXF1ZXN0IHdpdGggdXNlciBkYXRhCkBAIC0yMjQsNyArMjQwLDcgQEAKICAqIERlc2NyaXB0aW9uOgogICogICAgVW5tYXAgYSBycSBwcmV2aW91c2x5IG1hcHBlZCBieSBibGtfcnFfbWFwX3VzZXIoKS4gVGhlIGNhbGxlciBtdXN0CiAgKiAgICBzdXBwbHkgdGhlIG9yaWdpbmFsIHJxLT5iaW8gZnJvbSB0aGUgYmxrX3JxX21hcF91c2VyKCkgcmV0dXJuLCBzaW5jZQotICogICAgdGhlIGlvIGNvbXBsZXRpb24gbWF5IGhhdmUgY2hhbmdlZCBycS0+YmlvLgorICogICAgdGhlIEkvTyBjb21wbGV0aW9uIG1heSBoYXZlIGNoYW5nZWQgcnEtPmJpby4KICAqLwogaW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCBiaW8gKmJpbykKIHsKQEAgLTI1MCw3ICsyNjYsNyBAQAogRVhQT1JUX1NZTUJPTChibGtfcnFfdW5tYXBfdXNlcik7CiAKIC8qKgotICogYmxrX3JxX21hcF9rZXJuIC0gbWFwIGtlcm5lbCBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9CTE9DS19QQyB1c2FnZQorICogYmxrX3JxX21hcF9rZXJuIC0gbWFwIGtlcm5lbCBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9UWVBFX0JMT0NLX1BDIHVzYWdlCiAgKiBAcToJCXJlcXVlc3QgcXVldWUgd2hlcmUgcmVxdWVzdCBzaG91bGQgYmUgaW5zZXJ0ZWQKICAqIEBycToJCXJlcXVlc3QgdG8gZmlsbAogICogQGtidWY6CXRoZSBrZXJuZWwgYnVmZmVyCkBAIC0yNjQsOCArMjgwLDYgQEAKIGludCBibGtfcnFfbWFwX2tlcm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqa2J1ZiwKIAkJICAgIHVuc2lnbmVkIGludCBsZW4sIGdmcF90IGdmcF9tYXNrKQogewotCXVuc2lnbmVkIGxvbmcga2FkZHI7Ci0JdW5zaWduZWQgaW50IGFsaWdubWVudDsKIAlpbnQgcmVhZGluZyA9IHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEOwogCWludCBkb19jb3B5ID0gMDsKIAlzdHJ1Y3QgYmlvICpiaW87CkBAIC0yNzUsMTEgKzI4OSw3IEBACiAJaWYgKCFsZW4gfHwgIWtidWYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Ja2FkZHIgPSAodW5zaWduZWQgbG9uZylrYnVmOwotCWFsaWdubWVudCA9IHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkgfCBxLT5kbWFfcGFkX21hc2s7Ci0JZG9fY29weSA9ICgoa2FkZHIgJiBhbGlnbm1lbnQpIHx8IChsZW4gJiBhbGlnbm1lbnQpIHx8Ci0JCSAgIG9iamVjdF9pc19vbl9zdGFjayhrYnVmKSk7Ci0KKwlkb19jb3B5ID0gIWJsa19ycV9hbGlnbmVkKHEsIGtidWYsIGxlbikgfHwgb2JqZWN0X2lzX29uX3N0YWNrKGtidWYpOwogCWlmIChkb19jb3B5KQogCQliaW8gPSBiaW9fY29weV9rZXJuKHEsIGtidWYsIGxlbiwgZ2ZwX21hc2ssIHJlYWRpbmcpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tZXJnZS5jIGIvYmxvY2svYmxrLW1lcmdlLmMKaW5kZXggNWVmYzllNy4uOTA4ZDNlMSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1lcmdlLmMKKysrIGIvYmxvY2svYmxrLW1lcmdlLmMKQEAgLTExLDcgKzExLDcgQEAKIAogdm9pZCBibGtfcmVjYWxjX3JxX3NlY3RvcnMoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgbnNlY3QpCiB7Ci0JaWYgKGJsa19mc19yZXF1ZXN0KHJxKSkgeworCWlmIChibGtfZnNfcmVxdWVzdChycSkgfHwgYmxrX2Rpc2NhcmRfcnEocnEpKSB7CiAJCXJxLT5oYXJkX3NlY3RvciArPSBuc2VjdDsKIAkJcnEtPmhhcmRfbnJfc2VjdG9ycyAtPSBuc2VjdDsKIApAQCAtNDEsMTIgKzQxLDkgQEAKIHZvaWQgYmxrX3JlY2FsY19ycV9zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaW50IG5yX3BoeXNfc2VnczsKLQlpbnQgbnJfaHdfc2VnczsKIAl1bnNpZ25lZCBpbnQgcGh5c19zaXplOwotCXVuc2lnbmVkIGludCBod19zaXplOwogCXN0cnVjdCBiaW9fdmVjICpidiwgKmJ2cHJ2ID0gTlVMTDsKIAlpbnQgc2VnX3NpemU7Ci0JaW50IGh3X3NlZ19zaXplOwogCWludCBjbHVzdGVyOwogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKIAlpbnQgaGlnaCwgaGlnaHBydiA9IDE7CkBAIC01Niw4ICs1Myw4IEBACiAJCXJldHVybjsKIAogCWNsdXN0ZXIgPSB0ZXN0X2JpdChRVUVVRV9GTEFHX0NMVVNURVIsICZxLT5xdWV1ZV9mbGFncyk7Ci0JaHdfc2VnX3NpemUgPSBzZWdfc2l6ZSA9IDA7Ci0JcGh5c19zaXplID0gaHdfc2l6ZSA9IG5yX3BoeXNfc2VncyA9IG5yX2h3X3NlZ3MgPSAwOworCXNlZ19zaXplID0gMDsKKwlwaHlzX3NpemUgPSBucl9waHlzX3NlZ3MgPSAwOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJxLCBpdGVyKSB7CiAJCS8qCiAJCSAqIHRoZSB0cmljayBoZXJlIGlzIG1ha2luZyBzdXJlIHRoYXQgYSBoaWdoIHBhZ2UgaXMgbmV2ZXIKQEAgLTY2LDcgKzYzLDcgQEAKIAkJICovCiAJCWhpZ2ggPSBwYWdlX3RvX3Bmbihidi0+YnZfcGFnZSkgPiBxLT5ib3VuY2VfcGZuOwogCQlpZiAoaGlnaCB8fCBoaWdocHJ2KQotCQkJZ290byBuZXdfaHdfc2VnbWVudDsKKwkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAJCWlmIChjbHVzdGVyKSB7CiAJCQlpZiAoc2VnX3NpemUgKyBidi0+YnZfbGVuID4gcS0+bWF4X3NlZ21lbnRfc2l6ZSkKIAkJCQlnb3RvIG5ld19zZWdtZW50OwpAQCAtNzQsNDAgKzcxLDE5IEBACiAJCQkJZ290byBuZXdfc2VnbWVudDsKIAkJCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCBidnBydiwgYnYpKQogCQkJCWdvdG8gbmV3X3NlZ21lbnQ7Ci0JCQlpZiAoQklPVkVDX1ZJUlRfT1ZFUlNJWkUoaHdfc2VnX3NpemUgKyBidi0+YnZfbGVuKSkKLQkJCQlnb3RvIG5ld19od19zZWdtZW50OwogCiAJCQlzZWdfc2l6ZSArPSBidi0+YnZfbGVuOwotCQkJaHdfc2VnX3NpemUgKz0gYnYtPmJ2X2xlbjsKIAkJCWJ2cHJ2ID0gYnY7CiAJCQljb250aW51ZTsKIAkJfQogbmV3X3NlZ21lbnQ6Ci0JCWlmIChCSU9WRUNfVklSVF9NRVJHRUFCTEUoYnZwcnYsIGJ2KSAmJgotCQkgICAgIUJJT1ZFQ19WSVJUX09WRVJTSVpFKGh3X3NlZ19zaXplICsgYnYtPmJ2X2xlbikpCi0JCQlod19zZWdfc2l6ZSArPSBidi0+YnZfbGVuOwotCQllbHNlIHsKLW5ld19od19zZWdtZW50OgotCQkJaWYgKG5yX2h3X3NlZ3MgPT0gMSAmJgotCQkJICAgIGh3X3NlZ19zaXplID4gcnEtPmJpby0+YmlfaHdfZnJvbnRfc2l6ZSkKLQkJCQlycS0+YmlvLT5iaV9od19mcm9udF9zaXplID0gaHdfc2VnX3NpemU7Ci0JCQlod19zZWdfc2l6ZSA9IEJJT1ZFQ19WSVJUX1NUQVJUX1NJWkUoYnYpICsgYnYtPmJ2X2xlbjsKLQkJCW5yX2h3X3NlZ3MrKzsKLQkJfQotCiAJCW5yX3BoeXNfc2VncysrOwogCQlidnBydiA9IGJ2OwogCQlzZWdfc2l6ZSA9IGJ2LT5idl9sZW47CiAJCWhpZ2hwcnYgPSBoaWdoOwogCX0KIAotCWlmIChucl9od19zZWdzID09IDEgJiYKLQkgICAgaHdfc2VnX3NpemUgPiBycS0+YmlvLT5iaV9od19mcm9udF9zaXplKQotCQlycS0+YmlvLT5iaV9od19mcm9udF9zaXplID0gaHdfc2VnX3NpemU7Ci0JaWYgKGh3X3NlZ19zaXplID4gcnEtPmJpb3RhaWwtPmJpX2h3X2JhY2tfc2l6ZSkKLQkJcnEtPmJpb3RhaWwtPmJpX2h3X2JhY2tfc2l6ZSA9IGh3X3NlZ19zaXplOwogCXJxLT5ucl9waHlzX3NlZ21lbnRzID0gbnJfcGh5c19zZWdzOwotCXJxLT5ucl9od19zZWdtZW50cyA9IG5yX2h3X3NlZ3M7CiB9CiAKIHZvaWQgYmxrX3JlY291bnRfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKQEAgLTEyMCw3ICs5Niw2IEBACiAJYmxrX3JlY2FsY19ycV9zZWdtZW50cygmcnEpOwogCWJpby0+YmlfbmV4dCA9IG54dDsKIAliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSBycS5ucl9waHlzX3NlZ21lbnRzOwotCWJpby0+YmlfaHdfc2VnbWVudHMgPSBycS5ucl9od19zZWdtZW50czsKIAliaW8tPmJpX2ZsYWdzIHw9ICgxIDw8IEJJT19TRUdfVkFMSUQpOwogfQogRVhQT1JUX1NZTUJPTChibGtfcmVjb3VudF9zZWdtZW50cyk7CkBAIC0xMzEsMTMgKzEwNiwxNyBAQAogCWlmICghdGVzdF9iaXQoUVVFVUVfRkxBR19DTFVTVEVSLCAmcS0+cXVldWVfZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAotCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKF9fQlZFQ19FTkQoYmlvKSwgX19CVkVDX1NUQVJUKG54dCkpKQotCQlyZXR1cm4gMDsKIAlpZiAoYmlvLT5iaV9zaXplICsgbnh0LT5iaV9zaXplID4gcS0+bWF4X3NlZ21lbnRfc2l6ZSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoIWJpb19oYXNfZGF0YShiaW8pKQorCQlyZXR1cm4gMTsKKworCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKF9fQlZFQ19FTkQoYmlvKSwgX19CVkVDX1NUQVJUKG54dCkpKQorCQlyZXR1cm4gMDsKKwogCS8qCi0JICogYmlvIGFuZCBueHQgYXJlIGNvbnRpZ291cyBpbiBtZW1vcnksIGNoZWNrIGlmIHRoZSBxdWV1ZSBhbGxvd3MKKwkgKiBiaW8gYW5kIG54dCBhcmUgY29udGlndW91cyBpbiBtZW1vcnk7IGNoZWNrIGlmIHRoZSBxdWV1ZSBhbGxvd3MKIAkgKiB0aGVzZSB0d28gdG8gYmUgbWVyZ2VkIGludG8gb25lCiAJICovCiAJaWYgKEJJT19TRUdfQk9VTkRBUlkocSwgYmlvLCBueHQpKQpAQCAtMTQ2LDIyICsxMjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJsa19od19jb250aWdfc2VnbWVudChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLAotCQkJCSBzdHJ1Y3QgYmlvICpueHQpCi17Ci0JaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19TRUdfVkFMSUQpKQotCQlibGtfcmVjb3VudF9zZWdtZW50cyhxLCBiaW8pOwotCWlmICghYmlvX2ZsYWdnZWQobnh0LCBCSU9fU0VHX1ZBTElEKSkKLQkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgbnh0KTsKLQlpZiAoIUJJT1ZFQ19WSVJUX01FUkdFQUJMRShfX0JWRUNfRU5EKGJpbyksIF9fQlZFQ19TVEFSVChueHQpKSB8fAotCSAgICBCSU9WRUNfVklSVF9PVkVSU0laRShiaW8tPmJpX2h3X2JhY2tfc2l6ZSArIG54dC0+YmlfaHdfZnJvbnRfc2l6ZSkpCi0JCXJldHVybiAwOwotCWlmIChiaW8tPmJpX2h3X2JhY2tfc2l6ZSArIG54dC0+YmlfaHdfZnJvbnRfc2l6ZSA+IHEtPm1heF9zZWdtZW50X3NpemUpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KIC8qCiAgKiBtYXAgYSByZXF1ZXN0IHRvIHNjYXR0ZXJsaXN0LCByZXR1cm4gbnVtYmVyIG9mIHNnIGVudHJpZXMgc2V0dXAuIENhbGxlcgogICogbXVzdCBtYWtlIHN1cmUgc2cgY2FuIGhvbGQgcnEtPm5yX3BoeXNfc2VnbWVudHMgZW50cmllcwpAQCAtMjc1LDEwICsyMzgsOSBAQAogCQkJCSAgICBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAogCQkJCSAgICBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaW50IG5yX2h3X3NlZ3MgPSBiaW9faHdfc2VnbWVudHMocSwgYmlvKTsKIAlpbnQgbnJfcGh5c19zZWdzID0gYmlvX3BoeXNfc2VnbWVudHMocSwgYmlvKTsKIAotCWlmIChyZXEtPm5yX2h3X3NlZ21lbnRzICsgbnJfaHdfc2VncyA+IHEtPm1heF9od19zZWdtZW50cworCWlmIChyZXEtPm5yX3BoeXNfc2VnbWVudHMgKyBucl9waHlzX3NlZ3MgPiBxLT5tYXhfaHdfc2VnbWVudHMKIAkgICAgfHwgcmVxLT5ucl9waHlzX3NlZ21lbnRzICsgbnJfcGh5c19zZWdzID4gcS0+bWF4X3BoeXNfc2VnbWVudHMpIHsKIAkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX05PTUVSR0U7CiAJCWlmIChyZXEgPT0gcS0+bGFzdF9tZXJnZSkKQEAgLTI5MCw3ICsyNTIsNiBAQAogCSAqIFRoaXMgd2lsbCBmb3JtIHRoZSBzdGFydCBvZiBhIG5ldyBodyBzZWdtZW50LiAgQnVtcCBib3RoCiAJICogY291bnRlcnMuCiAJICovCi0JcmVxLT5ucl9od19zZWdtZW50cyArPSBucl9od19zZWdzOwogCXJlcS0+bnJfcGh5c19zZWdtZW50cyArPSBucl9waHlzX3NlZ3M7CiAJcmV0dXJuIDE7CiB9CkBAIC0yOTksNyArMjYwLDYgQEAKIAkJICAgICBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJdW5zaWduZWQgc2hvcnQgbWF4X3NlY3RvcnM7Ci0JaW50IGxlbjsKIAogCWlmICh1bmxpa2VseShibGtfcGNfcmVxdWVzdChyZXEpKSkKIAkJbWF4X3NlY3RvcnMgPSBxLT5tYXhfaHdfc2VjdG9yczsKQEAgLTMxNiwxOSArMjc2LDYgQEAKIAkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgcmVxLT5iaW90YWlsKTsKIAlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX1NFR19WQUxJRCkpCiAJCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpbyk7Ci0JbGVuID0gcmVxLT5iaW90YWlsLT5iaV9od19iYWNrX3NpemUgKyBiaW8tPmJpX2h3X2Zyb250X3NpemU7Ci0JaWYgKEJJT1ZFQ19WSVJUX01FUkdFQUJMRShfX0JWRUNfRU5EKHJlcS0+YmlvdGFpbCksIF9fQlZFQ19TVEFSVChiaW8pKQotCSAgICAmJiAhQklPVkVDX1ZJUlRfT1ZFUlNJWkUobGVuKSkgewotCQlpbnQgbWVyZ2VhYmxlID0gIGxsX25ld19tZXJnZWFibGUocSwgcmVxLCBiaW8pOwotCi0JCWlmIChtZXJnZWFibGUpIHsKLQkJCWlmIChyZXEtPm5yX2h3X3NlZ21lbnRzID09IDEpCi0JCQkJcmVxLT5iaW8tPmJpX2h3X2Zyb250X3NpemUgPSBsZW47Ci0JCQlpZiAoYmlvLT5iaV9od19zZWdtZW50cyA9PSAxKQotCQkJCWJpby0+YmlfaHdfYmFja19zaXplID0gbGVuOwotCQl9Ci0JCXJldHVybiBtZXJnZWFibGU7Ci0JfQogCiAJcmV0dXJuIGxsX25ld19od19zZWdtZW50KHEsIHJlcSwgYmlvKTsKIH0KQEAgLTMzNyw3ICsyODQsNiBAQAogCQkgICAgICBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJdW5zaWduZWQgc2hvcnQgbWF4X3NlY3RvcnM7Ci0JaW50IGxlbjsKIAogCWlmICh1bmxpa2VseShibGtfcGNfcmVxdWVzdChyZXEpKSkKIAkJbWF4X3NlY3RvcnMgPSBxLT5tYXhfaHdfc2VjdG9yczsKQEAgLTM1MSwyMyArMjk3LDEwIEBACiAJCQlxLT5sYXN0X21lcmdlID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQotCWxlbiA9IGJpby0+YmlfaHdfYmFja19zaXplICsgcmVxLT5iaW8tPmJpX2h3X2Zyb250X3NpemU7CiAJaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19TRUdfVkFMSUQpKQogCQlibGtfcmVjb3VudF9zZWdtZW50cyhxLCBiaW8pOwogCWlmICghYmlvX2ZsYWdnZWQocmVxLT5iaW8sIEJJT19TRUdfVkFMSUQpKQogCQlibGtfcmVjb3VudF9zZWdtZW50cyhxLCByZXEtPmJpbyk7Ci0JaWYgKEJJT1ZFQ19WSVJUX01FUkdFQUJMRShfX0JWRUNfRU5EKGJpbyksIF9fQlZFQ19TVEFSVChyZXEtPmJpbykpICYmCi0JICAgICFCSU9WRUNfVklSVF9PVkVSU0laRShsZW4pKSB7Ci0JCWludCBtZXJnZWFibGUgPSAgbGxfbmV3X21lcmdlYWJsZShxLCByZXEsIGJpbyk7Ci0KLQkJaWYgKG1lcmdlYWJsZSkgewotCQkJaWYgKGJpby0+YmlfaHdfc2VnbWVudHMgPT0gMSkKLQkJCQliaW8tPmJpX2h3X2Zyb250X3NpemUgPSBsZW47Ci0JCQlpZiAocmVxLT5ucl9od19zZWdtZW50cyA9PSAxKQotCQkJCXJlcS0+YmlvdGFpbC0+YmlfaHdfYmFja19zaXplID0gbGVuOwotCQl9Ci0JCXJldHVybiBtZXJnZWFibGU7Ci0JfQogCiAJcmV0dXJuIGxsX25ld19od19zZWdtZW50KHEsIHJlcSwgYmlvKTsKIH0KQEAgLTM3Niw3ICszMDksNiBAQAogCQkJCXN0cnVjdCByZXF1ZXN0ICpuZXh0KQogewogCWludCB0b3RhbF9waHlzX3NlZ21lbnRzOwotCWludCB0b3RhbF9od19zZWdtZW50czsKIAogCS8qCiAJICogRmlyc3QgY2hlY2sgaWYgdGhlIGVpdGhlciBvZiB0aGUgcmVxdWVzdHMgYXJlIHJlLXF1ZXVlZApAQCAtMzk4LDI2ICszMzAsMTEgQEAKIAlpZiAodG90YWxfcGh5c19zZWdtZW50cyA+IHEtPm1heF9waHlzX3NlZ21lbnRzKQogCQlyZXR1cm4gMDsKIAotCXRvdGFsX2h3X3NlZ21lbnRzID0gcmVxLT5ucl9od19zZWdtZW50cyArIG5leHQtPm5yX2h3X3NlZ21lbnRzOwotCWlmIChibGtfaHdfY29udGlnX3NlZ21lbnQocSwgcmVxLT5iaW90YWlsLCBuZXh0LT5iaW8pKSB7Ci0JCWludCBsZW4gPSByZXEtPmJpb3RhaWwtPmJpX2h3X2JhY2tfc2l6ZSArCi0JCQkJbmV4dC0+YmlvLT5iaV9od19mcm9udF9zaXplOwotCQkvKgotCQkgKiBwcm9wYWdhdGUgdGhlIGNvbWJpbmVkIGxlbmd0aCB0byB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0cwotCQkgKi8KLQkJaWYgKHJlcS0+bnJfaHdfc2VnbWVudHMgPT0gMSkKLQkJCXJlcS0+YmlvLT5iaV9od19mcm9udF9zaXplID0gbGVuOwotCQlpZiAobmV4dC0+bnJfaHdfc2VnbWVudHMgPT0gMSkKLQkJCW5leHQtPmJpb3RhaWwtPmJpX2h3X2JhY2tfc2l6ZSA9IGxlbjsKLQkJdG90YWxfaHdfc2VnbWVudHMtLTsKLQl9Ci0KLQlpZiAodG90YWxfaHdfc2VnbWVudHMgPiBxLT5tYXhfaHdfc2VnbWVudHMpCisJaWYgKHRvdGFsX3BoeXNfc2VnbWVudHMgPiBxLT5tYXhfaHdfc2VnbWVudHMpCiAJCXJldHVybiAwOwogCiAJLyogTWVyZ2UgaXMgT0suLi4gKi8KIAlyZXEtPm5yX3BoeXNfc2VnbWVudHMgPSB0b3RhbF9waHlzX3NlZ21lbnRzOwotCXJlcS0+bnJfaHdfc2VnbWVudHMgPSB0b3RhbF9od19zZWdtZW50czsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDcwLDE3ICszODcsMjEgQEAKIAllbHZfbWVyZ2VfcmVxdWVzdHMocSwgcmVxLCBuZXh0KTsKIAogCWlmIChyZXEtPnJxX2Rpc2spIHsKLQkJc3RydWN0IGhkX3N0cnVjdCAqcGFydAotCQkJPSBnZXRfcGFydChyZXEtPnJxX2Rpc2ssIHJlcS0+c2VjdG9yKTsKLQkJZGlza19yb3VuZF9zdGF0cyhyZXEtPnJxX2Rpc2spOwotCQlyZXEtPnJxX2Rpc2stPmluX2ZsaWdodC0tOwotCQlpZiAocGFydCkgewotCQkJcGFydF9yb3VuZF9zdGF0cyhwYXJ0KTsKLQkJCXBhcnQtPmluX2ZsaWdodC0tOwotCQl9CisJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisJCWludCBjcHU7CisKKwkJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwkJcGFydCA9IGRpc2tfbWFwX3NlY3Rvcl9yY3UocmVxLT5ycV9kaXNrLCByZXEtPnNlY3Rvcik7CisKKwkJcGFydF9yb3VuZF9zdGF0cyhjcHUsIHBhcnQpOworCQlwYXJ0X2RlY19pbl9mbGlnaHQocGFydCk7CisKKwkJcGFydF9zdGF0X3VubG9jaygpOwogCX0KIAogCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIG5leHQtPmlvcHJpbyk7CisJaWYgKGJsa19ycV9jcHVfdmFsaWQobmV4dCkpCisJCXJlcS0+Y3B1ID0gbmV4dC0+Y3B1OwogCiAJX19ibGtfcHV0X3JlcXVlc3QocSwgbmV4dCk7CiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGRmYzc3MDEuLmIyMWRjZGIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC0zMyw2ICszMywyMyBAQAogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfcHJlcF9ycSk7CiAKIC8qKgorICogYmxrX3F1ZXVlX3NldF9kaXNjYXJkIC0gc2V0IGEgZGlzY2FyZF9zZWN0b3JzIGZ1bmN0aW9uIGZvciBxdWV1ZQorICogQHE6CQlxdWV1ZQorICogQGRmbjoJcHJlcGFyZV9kaXNjYXJkIGZ1bmN0aW9uCisgKgorICogSXQncyBwb3NzaWJsZSBmb3IgYSBxdWV1ZSB0byByZWdpc3RlciBhIGRpc2NhcmQgY2FsbGJhY2sgd2hpY2ggaXMgdXNlZAorICogdG8gdHJhbnNmb3JtIGEgZGlzY2FyZCByZXF1ZXN0IGludG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZQorICogaGFyZHdhcmUuIElmIG5vbmUgaXMgcmVnaXN0ZXJlZCwgdGhlbiBkaXNjYXJkIHJlcXVlc3RzIGFyZSBmYWlsZWQKKyAqIHdpdGggJUVPUE5PVFNVUFAuCisgKgorICovCit2b2lkIGJsa19xdWV1ZV9zZXRfZGlzY2FyZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgcHJlcGFyZV9kaXNjYXJkX2ZuICpkZm4pCit7CisJcS0+cHJlcGFyZV9kaXNjYXJkX2ZuID0gZGZuOworfQorRVhQT1JUX1NZTUJPTChibGtfcXVldWVfc2V0X2Rpc2NhcmQpOworCisvKioKICAqIGJsa19xdWV1ZV9tZXJnZV9idmVjIC0gc2V0IGEgbWVyZ2VfYnZlYyBmdW5jdGlvbiBmb3IgcXVldWUKICAqIEBxOgkJcXVldWUKICAqIEBtYmZuOgltZXJnZV9idmVjX2ZuCkBAIC02MCw2ICs3NywyNCBAQAogfQogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfc29mdGlycV9kb25lKTsKIAordm9pZCBibGtfcXVldWVfcnFfdGltZW91dChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJcS0+cnFfdGltZW91dCA9IHRpbWVvdXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfcXVldWVfcnFfdGltZW91dCk7CisKK3ZvaWQgYmxrX3F1ZXVlX3JxX3RpbWVkX291dChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgcnFfdGltZWRfb3V0X2ZuICpmbikKK3sKKwlxLT5ycV90aW1lZF9vdXRfZm4gPSBmbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa19xdWV1ZV9ycV90aW1lZF9vdXQpOworCit2b2lkIGJsa19xdWV1ZV9sbGRfYnVzeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgbGxkX2J1c3lfZm4gKmZuKQoreworCXEtPmxsZF9idXN5X2ZuID0gZm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfcXVldWVfbGxkX2J1c3kpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3QgLSBkZWZpbmUgYW4gYWx0ZXJuYXRlIG1ha2VfcmVxdWVzdCBmdW5jdGlvbiBmb3IgYSBkZXZpY2UKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UgdG8gYmUgYWZmZWN0ZWQKQEAgLTEyNyw3ICsxNjIsNyBAQAogICogICAgRGlmZmVyZW50IGhhcmR3YXJlIGNhbiBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMgYXMgdG8gd2hhdCBwYWdlcwogICogICAgaXQgY2FuIGRvIEkvTyBkaXJlY3RseSB0by4gQSBsb3cgbGV2ZWwgZHJpdmVyIGNhbiBjYWxsCiAgKiAgICBibGtfcXVldWVfYm91bmNlX2xpbWl0IHRvIGhhdmUgbG93ZXIgbWVtb3J5IHBhZ2VzIGFsbG9jYXRlZCBhcyBib3VuY2UKLSAqICAgIGJ1ZmZlcnMgZm9yIGRvaW5nIEkvTyB0byBwYWdlcyByZXNpZGluZyBhYm92ZSBAcGFnZS4KKyAqICAgIGJ1ZmZlcnMgZm9yIGRvaW5nIEkvTyB0byBwYWdlcyByZXNpZGluZyBhYm92ZSBAZG1hX2FkZHIuCiAgKiovCiB2b2lkIGJsa19xdWV1ZV9ib3VuY2VfbGltaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHU2NCBkbWFfYWRkcikKIHsKQEAgLTIxMiw3ICsyNDcsNyBAQAogICogRGVzY3JpcHRpb246CiAgKiAgICBFbmFibGVzIGEgbG93IGxldmVsIGRyaXZlciB0byBzZXQgYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZgogICogICAgaHcgZGF0YSBzZWdtZW50cyBpbiBhIHJlcXVlc3QuICBUaGlzIHdvdWxkIGJlIHRoZSBsYXJnZXN0IG51bWJlciBvZgotICogICAgYWRkcmVzcy9sZW5ndGggcGFpcnMgdGhlIGhvc3QgYWRhcHRlciBjYW4gYWN0dWFsbHkgZ2l2ZSBhcyBvbmNlCisgKiAgICBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGUgaG9zdCBhZGFwdGVyIGNhbiBhY3R1YWxseSBnaXZlIGF0IG9uY2UKICAqICAgIHRvIHRoZSBkZXZpY2UuCiAgKiovCiB2b2lkIGJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCkBAIC0zOTMsNyArNDI4LDcgQEAKICAqIEBtYXNrOiAgYWxpZ25tZW50IG1hc2sKICAqCiAgKiBkZXNjcmlwdGlvbjoKLSAqICAgIHNldCByZXF1aXJlZCBtZW1vcnkgYW5kIGxlbmd0aCBhbGlnbWVudCBmb3IgZGlyZWN0IGRtYSB0cmFuc2FjdGlvbnMuCisgKiAgICBzZXQgcmVxdWlyZWQgbWVtb3J5IGFuZCBsZW5ndGggYWxpZ25tZW50IGZvciBkaXJlY3QgZG1hIHRyYW5zYWN0aW9ucy4KICAqICAgIHRoaXMgaXMgdXNlZCB3aGVuIGJ1aWRpbmcgZGlyZWN0IGlvIHJlcXVlc3RzIGZvciB0aGUgcXVldWUuCiAgKgogICoqLwpAQCAtNDA5LDcgKzQ0NCw3IEBACiAgKiBAbWFzazogIGFsaWdubWVudCBtYXNrCiAgKgogICogZGVzY3JpcHRpb246Ci0gKiAgICB1cGRhdGUgcmVxdWlyZWQgbWVtb3J5IGFuZCBsZW5ndGggYWxpZ21lbnQgZm9yIGRpcmVjdCBkbWEgdHJhbnNhY3Rpb25zLgorICogICAgdXBkYXRlIHJlcXVpcmVkIG1lbW9yeSBhbmQgbGVuZ3RoIGFsaWdubWVudCBmb3IgZGlyZWN0IGRtYSB0cmFuc2FjdGlvbnMuCiAgKiAgICBJZiB0aGUgcmVxdWVzdGVkIGFsaWdubWVudCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBhbGlnbm1lbnQsIHRoZW4KICAqICAgIHRoZSBjdXJyZW50IHF1ZXVlIGFsaWdubWVudCBpcyB1cGRhdGVkIHRvIHRoZSBuZXcgdmFsdWUsIG90aGVyd2lzZSBpdAogICogICAgaXMgbGVmdCBhbG9uZS4gIFRoZSBkZXNpZ24gb2YgdGhpcyBpcyB0byBhbGxvdyBtdWx0aXBsZSBvYmplY3RzCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc29mdGlycS5jIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYwZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHNvZnRpcnEgcnEgY29tcGxldGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgImJsay5oIgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgYmxrX2NwdV9kb25lKTsKKworLyoKKyAqIFNvZnRpcnEgYWN0aW9uIGhhbmRsZXIgLSBtb3ZlIGVudHJpZXMgdG8gbG9jYWwgbGlzdCBhbmQgbG9vcCBvdmVyIHRoZW0KKyAqIHdoaWxlIHBhc3NpbmcgdGhlbSB0byB0aGUgcXVldWUgcmVnaXN0ZXJlZCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBibGtfZG9uZV9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjcHVfbGlzdCwgbG9jYWxfbGlzdDsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJY3B1X2xpc3QgPSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpOworCWxpc3RfcmVwbGFjZV9pbml0KGNwdV9saXN0LCAmbG9jYWxfbGlzdCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisKKwkJcnEgPSBsaXN0X2VudHJ5KGxvY2FsX2xpc3QubmV4dCwgc3RydWN0IHJlcXVlc3QsIGNzZC5saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcnEtPmNzZC5saXN0KTsKKwkJcnEtPnEtPnNvZnRpcnFfZG9uZV9mbihycSk7CisJfQorfQorCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUykKK3N0YXRpYyB2b2lkIHRyaWdnZXJfc29mdGlycSh2b2lkICpkYXRhKQoreworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxpc3QgPSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpOworCWxpc3RfYWRkX3RhaWwoJnJxLT5jc2QubGlzdCwgbGlzdCk7CisKKwlpZiAobGlzdC0+bmV4dCA9PSAmcnEtPmNzZC5saXN0KQorCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIFNldHVwIGFuZCBpbnZva2UgYSBydW4gb2YgJ3RyaWdnZXJfc29mdGlycScgb24gdGhlIGdpdmVuIGNwdS4KKyAqLworc3RhdGljIGludCByYWlzZV9ibGtfaXJxKGludCBjcHUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZiAoY3B1X29ubGluZShjcHUpKSB7CisJCXN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpkYXRhID0gJnJxLT5jc2Q7CisKKwkJZGF0YS0+ZnVuYyA9IHRyaWdnZXJfc29mdGlycTsKKwkJZGF0YS0+aW5mbyA9IHJxOworCQlkYXRhLT5mbGFncyA9IDA7CisKKwkJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZWxzZSAvKiBDT05GSUdfU01QICYmIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUyAqLworc3RhdGljIGludCByYWlzZV9ibGtfaXJxKGludCBjcHUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fY3B1aW5pdCBibGtfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCS8qCisJICogSWYgYSBDUFUgZ29lcyBhd2F5LCBzcGxpY2UgaXRzIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgQ1BVCisJICogYW5kIHRyaWdnZXIgYSBydW4gb2YgdGhlIHNvZnRpcnEKKwkgKi8KKwlpZiAoYWN0aW9uID09IENQVV9ERUFEIHx8IGFjdGlvbiA9PSBDUFVfREVBRF9GUk9aRU4pIHsKKwkJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKSBoY3B1OworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBjcHUpLAorCQkJCSAmX19nZXRfY3B1X3ZhcihibGtfY3B1X2RvbmUpKTsKKwkJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgYmxrX2NwdV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGJsa19jcHVfbm90aWZ5LAorfTsKKwordm9pZCBfX2Jsa19jb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY2NwdSwgY3B1LCBncm91cF9jcHU7CisKKwlCVUdfT04oIXEtPnNvZnRpcnFfZG9uZV9mbik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWdyb3VwX2NwdSA9IGJsa19jcHVfdG9fZ3JvdXAoY3B1KTsKKworCS8qCisJICogU2VsZWN0IGNvbXBsZXRpb24gQ1BVCisJICovCisJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAmcS0+cXVldWVfZmxhZ3MpICYmIHJlcS0+Y3B1ICE9IC0xKQorCQljY3B1ID0gcmVxLT5jcHU7CisJZWxzZQorCQljY3B1ID0gY3B1OworCisJaWYgKGNjcHUgPT0gY3B1IHx8IGNjcHUgPT0gZ3JvdXBfY3B1KSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Citkb19sb2NhbDoKKwkJbGlzdCA9ICZfX2dldF9jcHVfdmFyKGJsa19jcHVfZG9uZSk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+Y3NkLmxpc3QsIGxpc3QpOworCisJCS8qCisJCSAqIGlmIHRoZSBsaXN0IG9ubHkgY29udGFpbnMgb3VyIGp1c3QgYWRkZWQgcmVxdWVzdCwKKwkJICogc2lnbmFsIGEgcmFpc2Ugb2YgdGhlIHNvZnRpcnEuIElmIHRoZXJlIGFyZSBhbHJlYWR5CisJCSAqIGVudHJpZXMgdGhlcmUsIHNvbWVvbmUgYWxyZWFkeSByYWlzZWQgdGhlIGlycSBidXQgaXQKKwkJICogaGFzbid0IHJ1biB5ZXQuCisJCSAqLworCQlpZiAobGlzdC0+bmV4dCA9PSAmcmVxLT5jc2QubGlzdCkKKwkJCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKEJMT0NLX1NPRlRJUlEpOworCX0gZWxzZSBpZiAocmFpc2VfYmxrX2lycShjY3B1LCByZXEpKQorCQlnb3RvIGRvX2xvY2FsOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIGJsa19jb21wbGV0ZV9yZXF1ZXN0IC0gZW5kIEkvTyBvbiBhIHJlcXVlc3QKKyAqIEByZXE6ICAgICAgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgRW5kcyBhbGwgSS9PIG9uIGEgcmVxdWVzdC4gSXQgZG9lcyBub3QgaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbnMsCisgKiAgICAgdW5sZXNzIHRoZSBkcml2ZXIgYWN0dWFsbHkgaW1wbGVtZW50cyB0aGlzIGluIGl0cyBjb21wbGV0aW9uIGNhbGxiYWNrCisgKiAgICAgdGhyb3VnaCByZXF1ZXVlaW5nLiBUaGUgYWN0dWFsIGNvbXBsZXRpb24gaGFwcGVucyBvdXQtb2Ytb3JkZXIsCisgKiAgICAgdGhyb3VnaCBhIHNvZnRpcnEgaGFuZGxlci4gVGhlIHVzZXIgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgYSBjb21wbGV0aW9uCisgKiAgICAgY2FsbGJhY2sgdGhyb3VnaCBibGtfcXVldWVfc29mdGlycV9kb25lKCkuCisgKiovCit2b2lkIGJsa19jb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJaWYgKHVubGlrZWx5KGJsa19zaG91bGRfZmFrZV90aW1lb3V0KHJlcS0+cSkpKQorCQlyZXR1cm47CisJaWYgKCFibGtfbWFya19ycV9jb21wbGV0ZShyZXEpKQorCQlfX2Jsa19jb21wbGV0ZV9yZXF1ZXN0KHJlcSk7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19jb21wbGV0ZV9yZXF1ZXN0KTsKKworX19pbml0IGludCBibGtfc29mdGlycV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKKwkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBpKSk7CisKKwlvcGVuX3NvZnRpcnEoQkxPQ0tfU09GVElSUSwgYmxrX2RvbmVfc29mdGlycSk7CisJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZibGtfY3B1X25vdGlmaWVyKTsKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChibGtfc29mdGlycV9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zeXNmcy5jIGIvYmxvY2svYmxrLXN5c2ZzLmMKaW5kZXggMzA0ZWM3My4uMjFlMjc1ZCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXN5c2ZzLmMKKysrIGIvYmxvY2svYmxrLXN5c2ZzLmMKQEAgLTE1Niw2ICsxNTYsMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3NpemVfdCBxdWV1ZV9ycV9hZmZpbml0eV9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpwYWdlKQoreworCXVuc2lnbmVkIGludCBzZXQgPSB0ZXN0X2JpdChRVUVVRV9GTEFHX1NBTUVfQ09NUCwgJnEtPnF1ZXVlX2ZsYWdzKTsKKworCXJldHVybiBxdWV1ZV92YXJfc2hvdyhzZXQgIT0gMCwgcGFnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxdWV1ZV9ycV9hZmZpbml0eV9zdG9yZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUykKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXJldCA9IHF1ZXVlX3Zhcl9zdG9yZSgmdmFsLCBwYWdlLCBjb3VudCk7CisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwlpZiAodmFsKQorCQlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NBTUVfQ09NUCwgcSk7CisJZWxzZQorCQlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfU0FNRV9DT01QLCAgcSk7CisJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIHN0cnVjdCBxdWV1ZV9zeXNmc19lbnRyeSBxdWV1ZV9yZXF1ZXN0c19lbnRyeSA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJucl9yZXF1ZXN0cyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKQEAgLTE5Nyw2ICsyMjEsMTIgQEAKIAkuc3RvcmUgPSBxdWV1ZV9ub21lcmdlc19zdG9yZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcXVldWVfc3lzZnNfZW50cnkgcXVldWVfcnFfYWZmaW5pdHlfZW50cnkgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAicnFfYWZmaW5pdHkiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisJLnNob3cgPSBxdWV1ZV9ycV9hZmZpbml0eV9zaG93LAorCS5zdG9yZSA9IHF1ZXVlX3JxX2FmZmluaXR5X3N0b3JlLAorfTsKKwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfYXR0cnNbXSA9IHsKIAkmcXVldWVfcmVxdWVzdHNfZW50cnkuYXR0ciwKIAkmcXVldWVfcmFfZW50cnkuYXR0ciwKQEAgLTIwNSw2ICsyMzUsNyBAQAogCSZxdWV1ZV9pb3NjaGVkX2VudHJ5LmF0dHIsCiAJJnF1ZXVlX2h3X3NlY3Rvcl9zaXplX2VudHJ5LmF0dHIsCiAJJnF1ZXVlX25vbWVyZ2VzX2VudHJ5LmF0dHIsCisJJnF1ZXVlX3JxX2FmZmluaXR5X2VudHJ5LmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTMxMCw3ICszNDEsNyBAQAogCWlmICghcS0+cmVxdWVzdF9mbikKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBrb2JqZWN0X2FkZCgmcS0+a29iaiwga29iamVjdF9nZXQoJmRpc2stPmRldi5rb2JqKSwKKwlyZXQgPSBrb2JqZWN0X2FkZCgmcS0+a29iaiwga29iamVjdF9nZXQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqKSwKIAkJCSAgIiVzIiwgInF1ZXVlIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0zMzksNiArMzcwLDYgQEAKIAogCQlrb2JqZWN0X3VldmVudCgmcS0+a29iaiwgS09CSl9SRU1PVkUpOwogCQlrb2JqZWN0X2RlbCgmcS0+a29iaik7Ci0JCWtvYmplY3RfcHV0KCZkaXNrLT5kZXYua29iaik7CisJCWtvYmplY3RfcHV0KCZkaXNrX3RvX2RldihkaXNrKS0+a29iaik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRhZy5jIGIvYmxvY2svYmxrLXRhZy5jCmluZGV4IGVkNTE2NmYuLmMwZDQxOWUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10YWcuYworKysgYi9ibG9jay9ibGstdGFnLmMKQEAgLTI5LDcgKzI5LDcgQEAKICAqIF9fYmxrX2ZyZWVfdGFncyAtIHJlbGVhc2UgYSBnaXZlbiBzZXQgb2YgdGFnIG1haW50ZW5hbmNlIGluZm8KICAqIEBicXQ6CXRoZSB0YWcgbWFwIHRvIGZyZWUKICAqCi0gKiBUcmllcyB0byBmcmVlIHRoZSBzcGVjaWZpZWQgQGJxdEAuICBSZXR1cm5zIHRydWUgaWYgaXQgd2FzCisgKiBUcmllcyB0byBmcmVlIHRoZSBzcGVjaWZpZWQgQGJxdC4gIFJldHVybnMgdHJ1ZSBpZiBpdCB3YXMKICAqIGFjdHVhbGx5IGZyZWVkIGFuZCBmYWxzZSBpZiB0aGVyZSBhcmUgc3RpbGwgcmVmZXJlbmNlcyB1c2luZyBpdAogICovCiBzdGF0aWMgaW50IF9fYmxrX2ZyZWVfdGFncyhzdHJ1Y3QgYmxrX3F1ZXVlX3RhZyAqYnF0KQpAQCAtNzgsNyArNzgsNyBAQAogICogYmxrX2ZyZWVfdGFncyAtIHJlbGVhc2UgYSBnaXZlbiBzZXQgb2YgdGFnIG1haW50ZW5hbmNlIGluZm8KICAqIEBicXQ6CXRoZSB0YWcgbWFwIHRvIGZyZWUKICAqCi0gKiBGb3IgZXh0ZXJuYWxseSBtYW5hZ2VkIEBicXRAIGZyZWVzIHRoZSBtYXAuICBDYWxsZXJzIG9mIHRoaXMKKyAqIEZvciBleHRlcm5hbGx5IG1hbmFnZWQgQGJxdCBmcmVlcyB0aGUgbWFwLiAgQ2FsbGVycyBvZiB0aGlzCiAgKiBmdW5jdGlvbiBtdXN0IGd1YXJhbnRlZSB0byBoYXZlIHJlbGVhc2VkIGFsbCB0aGUgcXVldWVzIHRoYXQKICAqIG1pZ2h0IGhhdmUgYmVlbiB1c2luZyB0aGlzIHRhZyBtYXAuCiAgKi8KQEAgLTk0LDcgKzk0LDcgQEAKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UKICAqCiAgKiAgTm90ZXM6Ci0gKglUaGlzIGlzIHVzZWQgdG8gZGlzYWJsZWQgdGFnZ2VkIHF1ZXVpbmcgdG8gYSBkZXZpY2UsIHlldCBsZWF2ZQorICoJVGhpcyBpcyB1c2VkIHRvIGRpc2FibGUgdGFnZ2VkIHF1ZXVpbmcgdG8gYSBkZXZpY2UsIHlldCBsZWF2ZQogICoJcXVldWUgaW4gZnVuY3Rpb24uCiAgKiovCiB2b2lkIGJsa19xdWV1ZV9mcmVlX3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0yNzEsNyArMjcxLDcgQEAKICAqIEBycTogdGhlIHJlcXVlc3QgdGhhdCBoYXMgY29tcGxldGVkCiAgKgogICogIERlc2NyaXB0aW9uOgotICogICAgVHlwaWNhbGx5IGNhbGxlZCB3aGVuIGVuZF90aGF0X3JlcXVlc3RfZmlyc3QoKSByZXR1cm5zIDAsIG1lYW5pbmcKKyAqICAgIFR5cGljYWxseSBjYWxsZWQgd2hlbiBlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KCkgcmV0dXJucyAlMCwgbWVhbmluZwogICogICAgYWxsIHRyYW5zZmVycyBoYXZlIGJlZW4gZG9uZSBmb3IgYSByZXF1ZXN0LiBJdCdzIGltcG9ydGFudCB0byBjYWxsCiAgKiAgICB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKSwgYXMgdGhhdCB3aWxsIHB1dCB0aGUKICAqICAgIHJlcXVlc3QgYmFjayBvbiB0aGUgZnJlZSBsaXN0IHRodXMgY29ycnVwdGluZyB0aGUgaW50ZXJuYWwgdGFnIGxpc3QuCkBAIC0zMzcsNiArMzM3LDcgQEAKIGludCBibGtfcXVldWVfc3RhcnRfdGFnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGJsa19xdWV1ZV90YWcgKmJxdCA9IHEtPnF1ZXVlX3RhZ3M7CisJdW5zaWduZWQgbWF4X2RlcHRoLCBvZmZzZXQ7CiAJaW50IHRhZzsKIAogCWlmICh1bmxpa2VseSgocnEtPmNtZF9mbGFncyAmIFJFUV9RVUVVRUQpKSkgewpAQCAtMzUwLDEwICszNTEsMTkgQEAKIAkvKgogCSAqIFByb3RlY3QgYWdhaW5zdCBzaGFyZWQgdGFnIG1hcHMsIGFzIHdlIG1heSBub3QgaGF2ZSBleGNsdXNpdmUKIAkgKiBhY2Nlc3MgdG8gdGhlIHRhZyBtYXAuCisJICoKKwkgKiBXZSByZXNlcnZlIGEgZmV3IHRhZ3MganVzdCBmb3Igc3luYyBJTywgc2luY2Ugd2UgZG9uJ3Qgd2FudAorCSAqIHRvIHN0YXJ2ZSBzeW5jIElPIG9uIGJlaGFsZiBvZiBmbG9vZGluZyBhc3luYyBJTy4KIAkgKi8KKwltYXhfZGVwdGggPSBicXQtPm1heF9kZXB0aDsKKwlpZiAocnFfaXNfc3luYyhycSkpCisJCW9mZnNldCA9IDA7CisJZWxzZQorCQlvZmZzZXQgPSBtYXhfZGVwdGggPj4gMjsKKwogCWRvIHsKLQkJdGFnID0gZmluZF9maXJzdF96ZXJvX2JpdChicXQtPnRhZ19tYXAsIGJxdC0+bWF4X2RlcHRoKTsKLQkJaWYgKHRhZyA+PSBicXQtPm1heF9kZXB0aCkKKwkJdGFnID0gZmluZF9uZXh0X3plcm9fYml0KGJxdC0+dGFnX21hcCwgbWF4X2RlcHRoLCBvZmZzZXQpOworCQlpZiAodGFnID49IG1heF9kZXB0aCkKIAkJCXJldHVybiAxOwogCiAJfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKHRhZywgYnF0LT50YWdfbWFwKSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGltZW91dC5jIGIvYmxvY2svYmxrLXRpbWVvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJhNjNmCi0tLSAvZGV2L251bGwKKysrIGIvYmxvY2svYmxrLXRpbWVvdXQuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGdlbmVyaWMgdGltZW91dCBoYW5kbGluZyBvZiByZXF1ZXN0cy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgorCisjaW5jbHVkZSAiYmxrLmgiCisKKyNpZmRlZiBDT05GSUdfRkFJTF9JT19USU1FT1VUCisKK3N0YXRpYyBERUNMQVJFX0ZBVUxUX0FUVFIoZmFpbF9pb190aW1lb3V0KTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfZmFpbF9pb190aW1lb3V0KGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc2V0dXBfZmF1bHRfYXR0cigmZmFpbF9pb190aW1lb3V0LCBzdHIpOworfQorX19zZXR1cCgiZmFpbF9pb190aW1lb3V0PSIsIHNldHVwX2ZhaWxfaW9fdGltZW91dCk7CisKK2ludCBibGtfc2hvdWxkX2Zha2VfdGltZW91dChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlpZiAoIXRlc3RfYml0KFFVRVVFX0ZMQUdfRkFJTF9JTywgJnEtPnF1ZXVlX2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2hvdWxkX2ZhaWwoJmZhaWxfaW9fdGltZW91dCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZhaWxfaW9fdGltZW91dF9kZWJ1Z2ZzKHZvaWQpCit7CisJcmV0dXJuIGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9pb190aW1lb3V0LCAiZmFpbF9pb190aW1lb3V0Iik7Cit9CisKK2xhdGVfaW5pdGNhbGwoZmFpbF9pb190aW1lb3V0X2RlYnVnZnMpOworCitzc2l6ZV90IHBhcnRfdGltZW91dF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJaW50IHNldCA9IHRlc3RfYml0KFFVRVVFX0ZMQUdfRkFJTF9JTywgJmRpc2stPnF1ZXVlLT5xdWV1ZV9mbGFncyk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc2V0ICE9IDApOworfQorCitzc2l6ZV90IHBhcnRfdGltZW91dF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCWludCB2YWw7CisKKwlpZiAoY291bnQpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkaXNrLT5xdWV1ZTsKKwkJY2hhciAqcCA9IChjaGFyICopIGJ1ZjsKKworCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOworCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCQlpZiAodmFsKQorCQkJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19GQUlMX0lPLCBxKTsKKwkJZWxzZQorCQkJcXVldWVfZmxhZ19jbGVhcihRVUVVRV9GTEFHX0ZBSUxfSU8sIHEpOworCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBSUxfSU9fVElNRU9VVCAqLworCisvKgorICogYmxrX2RlbGV0ZV90aW1lciAtIERlbGV0ZS9jYW5jZWwgdGltZXIgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgKiBAcmVxOglyZXF1ZXN0IHRoYXQgd2UgYXJlIGNhbmNlbGluZyB0aW1lciBmb3IKKyAqCisgKi8KK3ZvaWQgYmxrX2RlbGV0ZV90aW1lcihzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcmVxLT5xOworCisJLyoKKwkgKiBOb3RoaW5nIHRvIGRldGFjaAorCSAqLworCWlmICghcS0+cnFfdGltZWRfb3V0X2ZuIHx8ICFyZXEtPmRlYWRsaW5lKQorCQlyZXR1cm47CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnRpbWVvdXRfbGlzdCk7CisKKwlpZiAobGlzdF9lbXB0eSgmcS0+dGltZW91dF9saXN0KSkKKwkJZGVsX3RpbWVyKCZxLT50aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQgYmxrX3JxX3RpbWVkX291dChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcmVxLT5xOworCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiByZXQ7CisKKwlyZXQgPSBxLT5ycV90aW1lZF9vdXRfZm4ocmVxKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQkxLX0VIX0hBTkRMRUQ6CisJCV9fYmxrX2NvbXBsZXRlX3JlcXVlc3QocmVxKTsKKwkJYnJlYWs7CisJY2FzZSBCTEtfRUhfUkVTRVRfVElNRVI6CisJCWJsa19jbGVhcl9ycV9jb21wbGV0ZShyZXEpOworCQlibGtfYWRkX3RpbWVyKHJlcSk7CisJCWJyZWFrOworCWNhc2UgQkxLX0VIX05PVF9IQU5ETEVEOgorCQkvKgorCQkgKiBMTEQgaGFuZGxlcyB0aGlzIGZvciBub3cgYnV0IGluIHRoZSBmdXR1cmUKKwkJICogd2UgY2FuIHNlbmQgYSByZXF1ZXN0IG1zZyB0byBhYm9ydCB0aGUgY29tbWFuZAorCQkgKiBhbmQgd2UgY2FuIG1vdmUgbW9yZSBvZiB0aGUgZ2VuZXJpYyBzY3NpIGVoIGNvZGUgdG8KKwkJICogdGhlIGJsayBsYXllci4KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiYmxvY2s6IGJhZCBlaCByZXR1cm46ICVkXG4iLCByZXQpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgYmxrX3JxX3RpbWVkX291dF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKikgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB1bmluaXRpYWxpemVkX3ZhcihuZXh0KSwgbmV4dF9zZXQgPSAwOworCXN0cnVjdCByZXF1ZXN0ICpycSwgKnRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycSwgdG1wLCAmcS0+dGltZW91dF9saXN0LCB0aW1lb3V0X2xpc3QpIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnEtPmRlYWRsaW5lKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmcnEtPnRpbWVvdXRfbGlzdCk7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB3ZSByYWNlZCB3aXRoIGVuZCBpbyBjb21wbGV0aW9uCisJCQkgKi8KKwkJCWlmIChibGtfbWFya19ycV9jb21wbGV0ZShycSkpCisJCQkJY29udGludWU7CisJCQlibGtfcnFfdGltZWRfb3V0KHJxKTsKKwkJfQorCQlpZiAoIW5leHRfc2V0KSB7CisJCQluZXh0ID0gcnEtPmRlYWRsaW5lOworCQkJbmV4dF9zZXQgPSAxOworCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIobmV4dCwgcnEtPmRlYWRsaW5lKSkKKwkJCW5leHQgPSBycS0+ZGVhZGxpbmU7CisJfQorCisJaWYgKG5leHRfc2V0ICYmICFsaXN0X2VtcHR5KCZxLT50aW1lb3V0X2xpc3QpKQorCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIHJvdW5kX2ppZmZpZXMobmV4dCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogYmxrX2Fib3J0X3JlcXVlc3QgLS0gUmVxdWVzdCByZXF1ZXN0IHJlY292ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIGNvbW1hbmQKKyAqIEByZXE6CXBvaW50ZXIgdG8gdGhlIHJlcXVlc3Qgb2YgaW50ZXJlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIHRoYXQgdGhlIGJsb2NrIGxheWVyIHN0YXJ0IHJlY292ZXJ5IGZvciB0aGUKKyAqIHJlcXVlc3QgYnkgZGVsZXRpbmcgdGhlIHRpbWVyIGFuZCBjYWxsaW5nIHRoZSBxJ3MgdGltZW91dCBmdW5jdGlvbi4KKyAqIExMRERzIHdobyBpbXBsZW1lbnQgdGhlaXIgb3duIGVycm9yIHJlY292ZXJ5IE1BWSBpZ25vcmUgdGhlIHRpbWVvdXQKKyAqIGV2ZW50IGlmIHRoZXkgZ2VuZXJhdGVkIGJsa19hYm9ydF9yZXEuIE11c3QgaG9sZCBxdWV1ZSBsb2NrLgorICovCit2b2lkIGJsa19hYm9ydF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJaWYgKGJsa19tYXJrX3JxX2NvbXBsZXRlKHJlcSkpCisJCXJldHVybjsKKwlibGtfZGVsZXRlX3RpbWVyKHJlcSk7CisJYmxrX3JxX3RpbWVkX291dChyZXEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2Fib3J0X3JlcXVlc3QpOworCisvKioKKyAqIGJsa19hZGRfdGltZXIgLSBTdGFydCB0aW1lb3V0IHRpbWVyIGZvciBhIHNpbmdsZSByZXF1ZXN0CisgKiBAcmVxOglyZXF1ZXN0IHRoYXQgaXMgYWJvdXQgdG8gc3RhcnQgcnVubmluZy4KKyAqCisgKiBOb3RlczoKKyAqICAgIEVhY2ggcmVxdWVzdCBoYXMgaXRzIG93biB0aW1lciwgYW5kIGFzIGl0IGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgd2UKKyAqICAgIHNldCB1cCB0aGUgdGltZXIuIFdoZW4gdGhlIHJlcXVlc3QgY29tcGxldGVzLCB3ZSBjYW5jZWwgdGhlIHRpbWVyLgorICovCit2b2lkIGJsa19hZGRfdGltZXIoc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJlcS0+cTsKKwl1bnNpZ25lZCBsb25nIGV4cGlyeTsKKworCWlmICghcS0+cnFfdGltZWRfb3V0X2ZuKQorCQlyZXR1cm47CisKKwlCVUdfT04oIWxpc3RfZW1wdHkoJnJlcS0+dGltZW91dF9saXN0KSk7CisJQlVHX09OKHRlc3RfYml0KFJFUV9BVE9NX0NPTVBMRVRFLCAmcmVxLT5hdG9taWNfZmxhZ3MpKTsKKworCWlmIChyZXEtPnRpbWVvdXQpCisJCXJlcS0+ZGVhZGxpbmUgPSBqaWZmaWVzICsgcmVxLT50aW1lb3V0OworCWVsc2UgeworCQlyZXEtPmRlYWRsaW5lID0gamlmZmllcyArIHEtPnJxX3RpbWVvdXQ7CisJCS8qCisJCSAqIFNvbWUgTExEcywgbGlrZSBzY3NpLCBwZWVrIGF0IHRoZSB0aW1lb3V0IHRvIHByZXZlbnQKKwkJICogYSBjb21tYW5kIGZyb20gYmVpbmcgcmV0cmllZCBmb3JldmVyLgorCQkgKi8KKwkJcmVxLT50aW1lb3V0ID0gcS0+cnFfdGltZW91dDsKKwl9CisJbGlzdF9hZGRfdGFpbCgmcmVxLT50aW1lb3V0X2xpc3QsICZxLT50aW1lb3V0X2xpc3QpOworCisJLyoKKwkgKiBJZiB0aGUgdGltZXIgaXNuJ3QgYWxyZWFkeSBwZW5kaW5nIG9yIHRoaXMgdGltZW91dCBpcyBlYXJsaWVyCisJICogdGhhbiBhbiBleGlzdGluZyBvbmUsIG1vZGlmeSB0aGUgdGltZXIuIFJvdW5kIHRvIG5leHQgbmVhcmVzdAorCSAqIHNlY29uZC4KKwkgKi8KKwlleHBpcnkgPSByb3VuZF9qaWZmaWVzKHJlcS0+ZGVhZGxpbmUpOworCisJLyoKKwkgKiBXZSB1c2UgLT5kZWFkbGluZSA9PSAwIHRvIGRldGVjdCB3aGV0aGVyIGEgdGltZXIgd2FzIGFkZGVkIG9yCisJICogbm90LCBzbyBqdXN0IGluY3JlYXNlIHRvIG5leHQgamlmZnkgZm9yIHRoYXQgc3BlY2lmaWMgY2FzZQorCSAqLworCWlmICh1bmxpa2VseSghcmVxLT5kZWFkbGluZSkpCisJCXJlcS0+ZGVhZGxpbmUgPSAxOworCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZxLT50aW1lb3V0KSB8fAorCSAgICB0aW1lX2JlZm9yZShleHBpcnksIHEtPnRpbWVvdXQuZXhwaXJlcykpCisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgZXhwaXJ5KTsKK30KKworLyoqCisgKiBibGtfYWJvcnRfcXVldWUgLS0gQWJvcnQgYWxsIHJlcXVlc3Qgb24gZ2l2ZW4gcXVldWUKKyAqIEBxdWV1ZToJcG9pbnRlciB0byBxdWV1ZQorICoKKyAqLwordm9pZCBibGtfYWJvcnRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEsICp0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwllbHZfYWJvcnRfcXVldWUocSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnEsIHRtcCwgJnEtPnRpbWVvdXRfbGlzdCwgdGltZW91dF9saXN0KQorCQlibGtfYWJvcnRfcmVxdWVzdChycSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2Fib3J0X3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay5oIGIvYmxvY2svYmxrLmgKaW5kZXggYzc5ZjMwZS4uZTVjNTc5NyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLmgKKysrIGIvYmxvY2svYmxrLmgKQEAgLTE3LDYgKzE3LDQyIEBACiAKIHZvaWQgYmxrX3VucGx1Z193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGJsa191bnBsdWdfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOwordm9pZCBibGtfcnFfdGltZWRfb3V0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGJsa19kZWxldGVfdGltZXIoc3RydWN0IHJlcXVlc3QgKik7Cit2b2lkIGJsa19hZGRfdGltZXIoc3RydWN0IHJlcXVlc3QgKik7CisKKy8qCisgKiBJbnRlcm5hbCBhdG9taWMgZmxhZ3MgZm9yIHJlcXVlc3QgaGFuZGxpbmcKKyAqLworZW51bSBycV9hdG9taWNfZmxhZ3MgeworCVJFUV9BVE9NX0NPTVBMRVRFID0gMCwKK307CisKKy8qCisgKiBFSCB0aW1lciBhbmQgSU8gY29tcGxldGlvbiB3aWxsIGJvdGggYXR0ZW1wdCB0byAnZ3JhYicgdGhlIHJlcXVlc3QsIG1ha2UKKyAqIHN1cmUgdGhhdCBvbmx5IG9uZSBvZiB0aGVtIHN1Y2VlZHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgYmxrX21hcmtfcnFfY29tcGxldGUoc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KFJFUV9BVE9NX0NPTVBMRVRFLCAmcnEtPmF0b21pY19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibGtfY2xlYXJfcnFfY29tcGxldGUoc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWNsZWFyX2JpdChSRVFfQVRPTV9DT01QTEVURSwgJnJxLT5hdG9taWNfZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0ZBSUxfSU9fVElNRU9VVAoraW50IGJsa19zaG91bGRfZmFrZV90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworc3NpemVfdCBwYXJ0X3RpbWVvdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosIGNoYXIgKik7Citzc2l6ZV90IHBhcnRfdGltZW91dF9zdG9yZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosCisJCQkJY29uc3QgY2hhciAqLCBzaXplX3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGJsa19zaG91bGRfZmFrZV90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKIHN0cnVjdCBpb19jb250ZXh0ICpjdXJyZW50X2lvX2NvbnRleHQoZ2ZwX3QgZ2ZwX2ZsYWdzLCBpbnQgbm9kZSk7CiAKQEAgLTU5LDQgKzk1LDE2IEBACiAKICNlbmRpZiAvKiBCTEtfREVWX0lOVEVHUklUWSAqLwogCitzdGF0aWMgaW5saW5lIGludCBibGtfY3B1X3RvX2dyb3VwKGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisJY3B1bWFza190IG1hc2sgPSBjcHVfY29yZWdyb3VwX21hcChjcHUpOworCXJldHVybiBmaXJzdF9jcHUobWFzayk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCisJcmV0dXJuIGZpcnN0X2NwdShwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSk7CisjZWxzZQorCXJldHVybiBjcHU7CisjZW5kaWYKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9ibG9jay9ibGt0cmFjZS5jIGIvYmxvY2svYmxrdHJhY2UuYwppbmRleCBlYjk2NTFjLi44NTA0OWE3IDEwMDY0NAotLS0gYS9ibG9jay9ibGt0cmFjZS5jCisrKyBiL2Jsb2NrL2Jsa3RyYWNlLmMKQEAgLTExMSwyMyArMTExLDkgQEAKICAqLwogc3RhdGljIHUzMiBkZGlyX2FjdFsyXSBfX3JlYWRfbW9zdGx5ID0geyBCTEtfVENfQUNUKEJMS19UQ19SRUFEKSwgQkxLX1RDX0FDVChCTEtfVENfV1JJVEUpIH07CiAKLS8qCi0gKiBCaW8gYWN0aW9uIGJpdHMgb2YgaW50ZXJlc3QKLSAqLwotc3RhdGljIHUzMiBiaW9fYWN0WzldIF9fcmVhZF9tb3N0bHkgPSB7IDAsIEJMS19UQ19BQ1QoQkxLX1RDX0JBUlJJRVIpLCBCTEtfVENfQUNUKEJMS19UQ19TWU5DKSwgMCwgQkxLX1RDX0FDVChCTEtfVENfQUhFQUQpLCAwLCAwLCAwLCBCTEtfVENfQUNUKEJMS19UQ19NRVRBKSB9OwotCi0vKgotICogTW9yZSBjb3VsZCBiZSBhZGRlZCBhcyBuZWVkZWQsIHRha2luZyBjYXJlIHRvIGluY3JlbWVudCB0aGUgZGVjcmVtZW50ZXIKLSAqIHRvIGdldCBjb3JyZWN0IGluZGV4aW5nCi0gKi8KLSNkZWZpbmUgdHJhY2VfYmFycmllcl9iaXQocncpCVwKLQkoKChydykgJiAoMSA8PCBCSU9fUldfQkFSUklFUikpID4+IChCSU9fUldfQkFSUklFUiAtIDApKQotI2RlZmluZSB0cmFjZV9zeW5jX2JpdChydykJXAotCSgoKHJ3KSAmICgxIDw8IEJJT19SV19TWU5DKSkgPj4gKEJJT19SV19TWU5DIC0gMSkpCi0jZGVmaW5lIHRyYWNlX2FoZWFkX2JpdChydykJXAotCSgoKHJ3KSAmICgxIDw8IEJJT19SV19BSEVBRCkpIDw8ICgyIC0gQklPX1JXX0FIRUFEKSkKLSNkZWZpbmUgdHJhY2VfbWV0YV9iaXQocncpCVwKLQkoKChydykgJiAoMSA8PCBCSU9fUldfTUVUQSkpID4+IChCSU9fUldfTUVUQSAtIDMpKQorLyogVGhlIGlsb2cyKCkgY2FsbHMgZmFsbCBvdXQgYmVjYXVzZSB0aGV5J3JlIGNvbnN0YW50ICovCisjZGVmaW5lIE1BU0tfVENfQklUKHJ3LCBfX25hbWUpICggKHJ3ICYgKDEgPDwgQklPX1JXXyAjIyBfX25hbWUpKSA8PCBcCisJICAoaWxvZzIoQkxLX1RDXyAjIyBfX25hbWUpICsgQkxLX1RDX1NISUZUIC0gQklPX1JXXyAjIyBfX25hbWUpICkKIAogLyoKICAqIFRoZSB3b3JrZXIgZm9yIHRoZSB2YXJpb3VzIGJsa19hZGRfdHJhY2UqKCkgdHlwZXMuIEZpbGxzIG91dCBhCkBAIC0xNDcsMTAgKzEzMywxMSBAQAogCQlyZXR1cm47CiAKIAl3aGF0IHw9IGRkaXJfYWN0W3J3ICYgV1JJVEVdOwotCXdoYXQgfD0gYmlvX2FjdFt0cmFjZV9iYXJyaWVyX2JpdChydyldOwotCXdoYXQgfD0gYmlvX2FjdFt0cmFjZV9zeW5jX2JpdChydyldOwotCXdoYXQgfD0gYmlvX2FjdFt0cmFjZV9haGVhZF9iaXQocncpXTsKLQl3aGF0IHw9IGJpb19hY3RbdHJhY2VfbWV0YV9iaXQocncpXTsKKwl3aGF0IHw9IE1BU0tfVENfQklUKHJ3LCBCQVJSSUVSKTsKKwl3aGF0IHw9IE1BU0tfVENfQklUKHJ3LCBTWU5DKTsKKwl3aGF0IHw9IE1BU0tfVENfQklUKHJ3LCBBSEVBRCk7CisJd2hhdCB8PSBNQVNLX1RDX0JJVChydywgTUVUQSk7CisJd2hhdCB8PSBNQVNLX1RDX0JJVChydywgRElTQ0FSRCk7CiAKIAlwaWQgPSB0c2stPnBpZDsKIAlpZiAodW5saWtlbHkoYWN0X2xvZ19jaGVjayhidCwgd2hhdCwgc2VjdG9yLCBwaWQpKSkKQEAgLTM4Miw3ICszNjksOCBAQAogCWlmICghYnV0cy0+YnVmX3NpemUgfHwgIWJ1dHMtPmJ1Zl9ucikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdHJjcHkoYnV0cy0+bmFtZSwgbmFtZSk7CisJc3RybmNweShidXRzLT5uYW1lLCBuYW1lLCBCTEtUUkFDRV9CREVWX1NJWkUpOworCWJ1dHMtPm5hbWVbQkxLVFJBQ0VfQkRFVl9TSVpFIC0gMV0gPSAnXDAnOwogCiAJLyoKIAkgKiBzb21lIGRldmljZSBuYW1lcyBoYXZlIGxhcmdlciBwYXRocyAtIGNvbnZlcnQgdGhlIHNsYXNoZXMKZGlmZiAtLWdpdCBhL2Jsb2NrL2JzZy5jIGIvYmxvY2svYnNnLmMKaW5kZXggMGFhZThkNy4uMDM0MTEyYiAxMDA2NDQKLS0tIGEvYmxvY2svYnNnLmMKKysrIGIvYmxvY2svYnNnLmMKQEAgLTI4Myw3ICsyODMsOCBAQAogCQluZXh0X3JxLT5jbWRfdHlwZSA9IHJxLT5jbWRfdHlwZTsKIAogCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kaW5feGZlcnA7Ci0JCXJldCA9ICBibGtfcnFfbWFwX3VzZXIocSwgbmV4dF9ycSwgZHhmZXJwLCBoZHItPmRpbl94ZmVyX2xlbik7CisJCXJldCA9ICBibGtfcnFfbWFwX3VzZXIocSwgbmV4dF9ycSwgTlVMTCwgZHhmZXJwLAorCQkJCSAgICAgICBoZHItPmRpbl94ZmVyX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0yOTgsNyArMjk5LDggQEAKIAkJZHhmZXJfbGVuID0gMDsKIAogCWlmIChkeGZlcl9sZW4pIHsKLQkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBkeGZlcnAsIGR4ZmVyX2xlbik7CisJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgTlVMTCwgZHhmZXJwLCBkeGZlcl9sZW4sCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0xMDIyLDggKzEwMjQsNyBAQAogCWJjZC0+cmVsZWFzZSA9IHJlbGVhc2U7CiAJa3JlZl9pbml0KCZiY2QtPnJlZik7CiAJZGV2ID0gTUtERVYoYnNnX21ham9yLCBiY2QtPm1pbm9yKTsKLQljbGFzc19kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoYnNnX2NsYXNzLCBwYXJlbnQsIGRldiwgTlVMTCwKLQkJCQkJICAiJXMiLCBkZXZuYW1lKTsKKwljbGFzc19kZXYgPSBkZXZpY2VfY3JlYXRlKGJzZ19jbGFzcywgcGFyZW50LCBkZXYsIE5VTEwsICIlcyIsIGRldm5hbWUpOwogCWlmIChJU19FUlIoY2xhc3NfZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGNsYXNzX2Rldik7CiAJCWdvdG8gcHV0X2RldjsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDFlMmFmZjguLjZhMDYyZWUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMzksNiArMzksNyBAQAogI2RlZmluZSBDRlFfTUlOX1RUCQkoMikKIAogI2RlZmluZSBDRlFfU0xJQ0VfU0NBTEUJCSg1KQorI2RlZmluZSBDRlFfSFdfUVVFVUVfTUlOCSg1KQogCiAjZGVmaW5lIFJRX0NJQyhycSkJCVwKIAkoKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqKSAocnEpLT5lbGV2YXRvcl9wcml2YXRlKQpAQCAtODYsNyArODcsMTQgQEAKIAogCWludCBycV9pbl9kcml2ZXI7CiAJaW50IHN5bmNfZmxpZ2h0OworCisJLyoKKwkgKiBxdWV1ZS1kZXB0aCBkZXRlY3Rpb24KKwkgKi8KKwlpbnQgcnFfcXVldWVkOwogCWludCBod190YWc7CisJaW50IGh3X3RhZ19zYW1wbGVzOworCWludCBycV9pbl9kcml2ZXJfcGVhazsKIAogCS8qCiAJICogaWRsZSB3aW5kb3cgbWFuYWdlbWVudApAQCAtMjQ0LDcgKzI1Miw3IEBACiB7CiAJaWYgKGNmcWQtPmJ1c3lfcXVldWVzKSB7CiAJCWNmcV9sb2coY2ZxZCwgInNjaGVkdWxlIGRpc3BhdGNoIik7Ci0JCWtibG9ja2Rfc2NoZWR1bGVfd29yaygmY2ZxZC0+dW5wbHVnX3dvcmspOworCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsoY2ZxZC0+cXVldWUsICZjZnFkLT51bnBsdWdfd29yayk7CiAJfQogfQogCkBAIC02NTQsMTUgKzY2Miw2IEBACiAJY2ZxX2xvZ19jZnFxKGNmcWQsIFJRX0NGUVEocnEpLCAiYWN0aXZhdGUgcnEsIGRydj0lZCIsCiAJCQkJCQljZnFkLT5ycV9pbl9kcml2ZXIpOwogCi0JLyoKLQkgKiBJZiB0aGUgZGVwdGggaXMgbGFyZ2VyIDEsIGl0IHJlYWxseSBjb3VsZCBiZSBxdWV1ZWluZy4gQnV0IGxldHMKLQkgKiBtYWtlIHRoZSBtYXJrIGEgbGl0dGxlIGhpZ2hlciAtIGlkbGluZyBjb3VsZCBzdGlsbCBiZSBnb29kIGZvcgotCSAqIGxvdyBxdWV1ZWluZywgYW5kIGEgbG93IHF1ZXVlaW5nIG51bWJlciBjb3VsZCBhbHNvIGp1c3QgaW5kaWNhdGUKLQkgKiBhIFNDU0kgbWlkIGxheWVyIGxpa2UgYmVoYXZpb3VyIHdoZXJlIGxpbWl0KzEgaXMgb2Z0ZW4gc2Vlbi4KLQkgKi8KLQlpZiAoIWNmcWQtPmh3X3RhZyAmJiBjZnFkLT5ycV9pbl9kcml2ZXIgPiA0KQotCQljZnFkLT5od190YWcgPSAxOwotCiAJY2ZxZC0+bGFzdF9wb3NpdGlvbiA9IHJxLT5oYXJkX3NlY3RvciArIHJxLT5oYXJkX25yX3NlY3RvcnM7CiB9CiAKQEAgLTY4Niw2ICs2ODUsNyBAQAogCWxpc3RfZGVsX2luaXQoJnJxLT5xdWV1ZWxpc3QpOwogCWNmcV9kZWxfcnFfcmIocnEpOwogCisJY2ZxcS0+Y2ZxZC0+cnFfcXVldWVkLS07CiAJaWYgKHJxX2lzX21ldGEocnEpKSB7CiAJCVdBUk5fT04oIWNmcXEtPm1ldGFfcGVuZGluZyk7CiAJCWNmcXEtPm1ldGFfcGVuZGluZy0tOwpAQCAtODc4LDYgKzg3OCwxNCBAQAogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCXVuc2lnbmVkIGxvbmcgc2w7CiAKKwkvKgorCSAqIFNTRCBkZXZpY2Ugd2l0aG91dCBzZWVrIHBlbmFsdHksIGRpc2FibGUgaWRsaW5nLiBCdXQgb25seSBkbyBzbworCSAqIGZvciBkZXZpY2VzIHRoYXQgc3VwcG9ydCBxdWV1aW5nLCBvdGhlcndpc2Ugd2Ugc3RpbGwgaGF2ZSBhIHByb2JsZW0KKwkgKiB3aXRoIHN5bmMgdnMgYXN5bmMgd29ya2xvYWRzLgorCSAqLworCWlmIChibGtfcXVldWVfbm9ucm90KGNmcWQtPnF1ZXVlKSAmJiBjZnFkLT5od190YWcpCisJCXJldHVybjsKKwogCVdBUk5fT04oIVJCX0VNUFRZX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCkpOwogCVdBUk5fT04oY2ZxX2NmcXFfc2xpY2VfbmV3KGNmcXEpKTsKIApAQCAtMTgzMyw2ICsxODQxLDcgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYyA9IFJRX0NJQyhycSk7CiAKKwljZnFkLT5ycV9xdWV1ZWQrKzsKIAlpZiAocnFfaXNfbWV0YShycSkpCiAJCWNmcXEtPm1ldGFfcGVuZGluZysrOwogCkBAIC0xODgwLDYgKzE4ODksMzEgQEAKIAljZnFfcnFfZW5xdWV1ZWQoY2ZxZCwgY2ZxcSwgcnEpOwogfQogCisvKgorICogVXBkYXRlIGh3X3RhZyBiYXNlZCBvbiBwZWFrIHF1ZXVlIGRlcHRoIG92ZXIgNTAgc2FtcGxlcyB1bmRlcgorICogc3VmZmljaWVudCBsb2FkLgorICovCitzdGF0aWMgdm9pZCBjZnFfdXBkYXRlX2h3X3RhZyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCit7CisJaWYgKGNmcWQtPnJxX2luX2RyaXZlciA+IGNmcWQtPnJxX2luX2RyaXZlcl9wZWFrKQorCQljZnFkLT5ycV9pbl9kcml2ZXJfcGVhayA9IGNmcWQtPnJxX2luX2RyaXZlcjsKKworCWlmIChjZnFkLT5ycV9xdWV1ZWQgPD0gQ0ZRX0hXX1FVRVVFX01JTiAmJgorCSAgICBjZnFkLT5ycV9pbl9kcml2ZXIgPD0gQ0ZRX0hXX1FVRVVFX01JTikKKwkJcmV0dXJuOworCisJaWYgKGNmcWQtPmh3X3RhZ19zYW1wbGVzKysgPCA1MCkKKwkJcmV0dXJuOworCisJaWYgKGNmcWQtPnJxX2luX2RyaXZlcl9wZWFrID49IENGUV9IV19RVUVVRV9NSU4pCisJCWNmcWQtPmh3X3RhZyA9IDE7CisJZWxzZQorCQljZnFkLT5od190YWcgPSAwOworCisJY2ZxZC0+aHdfdGFnX3NhbXBsZXMgPSAwOworCWNmcWQtPnJxX2luX2RyaXZlcl9wZWFrID0gMDsKK30KKwogc3RhdGljIHZvaWQgY2ZxX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IFJRX0NGUVEocnEpOwpAQCAtMTg5MCw2ICsxOTI0LDggQEAKIAlub3cgPSBqaWZmaWVzOwogCWNmcV9sb2dfY2ZxcShjZnFkLCBjZnFxLCAiY29tcGxldGUiKTsKIAorCWNmcV91cGRhdGVfaHdfdGFnKGNmcWQpOworCiAJV0FSTl9PTighY2ZxZC0+cnFfaW5fZHJpdmVyKTsKIAlXQVJOX09OKCFjZnFxLT5kaXNwYXRjaGVkKTsKIAljZnFkLT5ycV9pbl9kcml2ZXItLTsKQEAgLTIyMDAsNiArMjIzNiw3IEBACiAJY2ZxZC0+Y2ZxX3NsaWNlWzFdID0gY2ZxX3NsaWNlX3N5bmM7CiAJY2ZxZC0+Y2ZxX3NsaWNlX2FzeW5jX3JxID0gY2ZxX3NsaWNlX2FzeW5jX3JxOwogCWNmcWQtPmNmcV9zbGljZV9pZGxlID0gY2ZxX3NsaWNlX2lkbGU7CisJY2ZxZC0+aHdfdGFnID0gMTsKIAogCXJldHVybiBjZnFkOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svY21kLWZpbHRlci5jIGIvYmxvY2svY21kLWZpbHRlci5jCmluZGV4IDIyOGI2NDQuLmU2NjlhZWQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NtZC1maWx0ZXIuYworKysgYi9ibG9jay9jbWQtZmlsdGVyLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3ZlcmlmeV9jb21tYW5kKTsKIAorI2lmIDAKIC8qIGFuZCBub3csIHRoZSBzeXNmcyBzdHVmZiAqLwogc3RhdGljIHNzaXplX3QgcmNmX2NtZHNfc2hvdyhzdHJ1Y3QgYmxrX2NtZF9maWx0ZXIgKmZpbHRlciwgY2hhciAqcGFnZSwKIAkJCSAgICAgaW50IHJ3KQpAQCAtMjEwLDE0ICsyMTEsMTAgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBibGtfY21kX2ZpbHRlciAqZmlsdGVyID0gJmRpc2stPnF1ZXVlLT5jbWRfZmlsdGVyOwotCXN0cnVjdCBrb2JqZWN0ICpwYXJlbnQgPSBrb2JqZWN0X2dldChkaXNrLT5ob2xkZXJfZGlyLT5wYXJlbnQpOwogCi0JaWYgKCFwYXJlbnQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmZpbHRlci0+a29iaiwgJnJjZl9rdHlwZSwgcGFyZW50LAorCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZmaWx0ZXItPmtvYmosICZyY2Zfa3R5cGUsCisJCQkJICAgJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLAogCQkJCSAgICIlcyIsICJjbWRfZmlsdGVyIik7Ci0KIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjMwLDYgKzIyNyw2IEBACiAJc3RydWN0IGJsa19jbWRfZmlsdGVyICpmaWx0ZXIgPSAmZGlzay0+cXVldWUtPmNtZF9maWx0ZXI7CiAKIAlrb2JqZWN0X3B1dCgmZmlsdGVyLT5rb2JqKTsKLQlrb2JqZWN0X3B1dChkaXNrLT5ob2xkZXJfZGlyLT5wYXJlbnQpOwogfQogRVhQT1JUX1NZTUJPTChibGtfdW5yZWdpc3Rlcl9maWx0ZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9ibG9jay9jb21wYXRfaW9jdGwuYyBiL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCmluZGV4IGMyMzE3N2UuLjFlNTU5ZmIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCisrKyBiL2Jsb2NrL2NvbXBhdF9pb2N0bC5jCkBAIC03ODgsNiArNzg4LDcgQEAKIAkJcmV0dXJuIGNvbXBhdF9oZGlvX2dldGdlbyhkaXNrLCBiZGV2LCBjb21wYXRfcHRyKGFyZykpOwogCWNhc2UgQkxLRkxTQlVGOgogCWNhc2UgQkxLUk9TRVQ6CisJY2FzZSBCTEtESVNDQVJEOgogCS8qCiAJICogdGhlIG9uZXMgYmVsb3cgYXJlIGltcGxlbWVudGVkIGluIGJsa2Rldl9sb2NrZWRfaW9jdGwsCiAJICogYnV0IHdlIGNhbGwgYmxrZGV2X2lvY3RsLCB3aGljaCBnZXRzIHRoZSBsb2NrIGZvciB1cwpkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IDM0MjQ0OGMuLmZkMzExMTcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAkgKi8KIAlzdHJ1Y3QgcmJfcm9vdCBzb3J0X2xpc3RbMl07CQogCXN0cnVjdCBsaXN0X2hlYWQgZmlmb19saXN0WzJdOwotCQorCiAJLyoKIAkgKiBuZXh0IGluIHNvcnQgb3JkZXIuIHJlYWQsIHdyaXRlIG9yIGJvdGggYXJlIE5VTEwKIAkgKi8KQEAgLTUzLDcgKzUzLDExIEBACiAKIHN0YXRpYyB2b2lkIGRlYWRsaW5lX21vdmVfcmVxdWVzdChzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAotI2RlZmluZSBSUV9SQl9ST09UKGRkLCBycSkJKCYoZGQpLT5zb3J0X2xpc3RbcnFfZGF0YV9kaXIoKHJxKSldKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmJfcm9vdCAqCitkZWFkbGluZV9yYl9yb290KHN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXJldHVybiAmZGQtPnNvcnRfbGlzdFtycV9kYXRhX2RpcihycSldOworfQogCiAvKgogICogZ2V0IHRoZSByZXF1ZXN0IGFmdGVyIGBycScgaW4gc2VjdG9yLXNvcnRlZCBvcmRlcgpAQCAtNzIsMTUgKzc2LDExIEBACiBzdGF0aWMgdm9pZAogZGVhZGxpbmVfYWRkX3JxX3JiKHN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCXN0cnVjdCByYl9yb290ICpyb290ID0gUlFfUkJfUk9PVChkZCwgcnEpOworCXN0cnVjdCByYl9yb290ICpyb290ID0gZGVhZGxpbmVfcmJfcm9vdChkZCwgcnEpOwogCXN0cnVjdCByZXF1ZXN0ICpfX2FsaWFzOwogCi1yZXRyeToKLQlfX2FsaWFzID0gZWx2X3JiX2FkZChyb290LCBycSk7Ci0JaWYgKHVubGlrZWx5KF9fYWxpYXMpKSB7CisJd2hpbGUgKHVubGlrZWx5KF9fYWxpYXMgPSBlbHZfcmJfYWRkKHJvb3QsIHJxKSkpCiAJCWRlYWRsaW5lX21vdmVfcmVxdWVzdChkZCwgX19hbGlhcyk7Ci0JCWdvdG8gcmV0cnk7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTkxLDcgKzkxLDcgQEAKIAlpZiAoZGQtPm5leHRfcnFbZGF0YV9kaXJdID09IHJxKQogCQlkZC0+bmV4dF9ycVtkYXRhX2Rpcl0gPSBkZWFkbGluZV9sYXR0ZXJfcmVxdWVzdChycSk7CiAKLQllbHZfcmJfZGVsKFJRX1JCX1JPT1QoZGQsIHJxKSwgcnEpOworCWVsdl9yYl9kZWwoZGVhZGxpbmVfcmJfcm9vdChkZCwgcnEpLCBycSk7CiB9CiAKIC8qCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlkZWFkbGluZV9hZGRfcnFfcmIoZGQsIHJxKTsKIAogCS8qCi0JICogc2V0IGV4cGlyZSB0aW1lIChvbmx5IHVzZWQgZm9yIHJlYWRzKSBhbmQgYWRkIHRvIGZpZm8gbGlzdAorCSAqIHNldCBleHBpcmUgdGltZSBhbmQgYWRkIHRvIGZpZm8gbGlzdAogCSAqLwogCXJxX3NldF9maWZvX3RpbWUocnEsIGppZmZpZXMgKyBkZC0+Zmlmb19leHBpcmVbZGF0YV9kaXJdKTsKIAlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmZGQtPmZpZm9fbGlzdFtkYXRhX2Rpcl0pOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJICogaWYgdGhlIG1lcmdlIHdhcyBhIGZyb250IG1lcmdlLCB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gcmVxdWVzdAogCSAqLwogCWlmICh0eXBlID09IEVMRVZBVE9SX0ZST05UX01FUkdFKSB7Ci0JCWVsdl9yYl9kZWwoUlFfUkJfUk9PVChkZCwgcmVxKSwgcmVxKTsKKwkJZWx2X3JiX2RlbChkZWFkbGluZV9yYl9yb290KGRkLCByZXEpLCByZXEpOwogCQlkZWFkbGluZV9hZGRfcnFfcmIoZGQsIHJlcSk7CiAJfQogfQpAQCAtMjEyLDcgKzIxMiw3IEBACiAJZGQtPm5leHRfcnFbV1JJVEVdID0gTlVMTDsKIAlkZC0+bmV4dF9ycVtkYXRhX2Rpcl0gPSBkZWFkbGluZV9sYXR0ZXJfcmVxdWVzdChycSk7CiAKLQlkZC0+bGFzdF9zZWN0b3IgPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7CisJZGQtPmxhc3Rfc2VjdG9yID0gcnFfZW5kX3NlY3RvcihycSk7CiAKIAkvKgogCSAqIHRha2UgaXQgb2ZmIHRoZSBzb3J0IGFuZCBmaWZvIGxpc3QsIG1vdmUKQEAgLTIyMiw3ICsyMjIsNyBAQAogfQogCiAvKgotICogZGVhZGxpbmVfY2hlY2tfZmlmbyByZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vIGV4cGlyZWQgcmVhZHMgb24gdGhlIGZpZm8sCisgKiBkZWFkbGluZV9jaGVja19maWZvIHJldHVybnMgMCBpZiB0aGVyZSBhcmUgbm8gZXhwaXJlZCByZXF1ZXN0cyBvbiB0aGUgZmlmbywKICAqIDEgb3RoZXJ3aXNlLiBSZXF1aXJlcyAhbGlzdF9lbXB0eSgmZGQtPmZpZm9fbGlzdFtkYXRhX2Rpcl0pCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGRlYWRsaW5lX2NoZWNrX2ZpZm8oc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkLCBpbnQgZGRpcikKQEAgLTI1OCwxNyArMjU4LDkgQEAKIAllbHNlCiAJCXJxID0gZGQtPm5leHRfcnFbUkVBRF07CiAKLQlpZiAocnEpIHsKLQkJLyogd2UgaGF2ZSBhICJuZXh0IHJlcXVlc3QiICovCi0JCQotCQlpZiAoZGQtPmxhc3Rfc2VjdG9yICE9IHJxLT5zZWN0b3IpCi0JCQkvKiBlbmQgdGhlIGJhdGNoIG9uIGEgbm9uIHNlcXVlbnRpYWwgcmVxdWVzdCAqLwotCQkJZGQtPmJhdGNoaW5nICs9IGRkLT5maWZvX2JhdGNoOwotCQkKLQkJaWYgKGRkLT5iYXRjaGluZyA8IGRkLT5maWZvX2JhdGNoKQotCQkJLyogd2UgYXJlIHN0aWxsIGVudGl0bGVkIHRvIGJhdGNoICovCi0JCQlnb3RvIGRpc3BhdGNoX3JlcXVlc3Q7Ci0JfQorCWlmIChycSAmJiBkZC0+YmF0Y2hpbmcgPCBkZC0+Zmlmb19iYXRjaCkKKwkJLyogd2UgaGF2ZSBhIG5leHQgcmVxdWVzdCBhcmUgc3RpbGwgZW50aXRsZWQgdG8gYmF0Y2ggKi8KKwkJZ290byBkaXNwYXRjaF9yZXF1ZXN0OwogCiAJLyoKIAkgKiBhdCB0aGlzIHBvaW50IHdlIGFyZSBub3QgcnVubmluZyBhIGJhdGNoLiBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlCmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCBlZDZmOGYzLi4wNDUxODkyIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTM0LDggKzM0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImJsay5oIgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVsdl9saXN0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRChlbHZfbGlzdCk7CkBAIC03NSw2ICs3NiwxMiBAQAogCQlyZXR1cm4gMDsKIAogCS8qCisJICogRG9uJ3QgbWVyZ2UgZmlsZSBzeXN0ZW0gcmVxdWVzdHMgYW5kIGRpc2NhcmQgcmVxdWVzdHMKKwkgKi8KKwlpZiAoYmlvX2Rpc2NhcmQoYmlvKSAhPSBiaW9fZGlzY2FyZChycS0+YmlvKSkKKwkJcmV0dXJuIDA7CisKKwkvKgogCSAqIGRpZmZlcmVudCBkYXRhIGRpcmVjdGlvbiBvciBhbHJlYWR5IHN0YXJ0ZWQsIGRvbid0IG1lcmdlCiAJICovCiAJaWYgKGJpb19kYXRhX2RpcihiaW8pICE9IHJxX2RhdGFfZGlyKHJxKSkKQEAgLTQzOCw2ICs0NDUsOCBAQAogCWxpc3RfZm9yX2VhY2hfcHJldihlbnRyeSwgJnEtPnF1ZXVlX2hlYWQpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnBvcyA9IGxpc3RfZW50cnlfcnEoZW50cnkpOwogCisJCWlmIChibGtfZGlzY2FyZF9ycShycSkgIT0gYmxrX2Rpc2NhcmRfcnEocG9zKSkKKwkJCWJyZWFrOwogCQlpZiAocnFfZGF0YV9kaXIocnEpICE9IHJxX2RhdGFfZGlyKHBvcykpCiAJCQlicmVhazsKIAkJaWYgKHBvcy0+Y21kX2ZsYWdzICYgc3RvcF9mbGFncykKQEAgLTYwNyw3ICs2MTYsNyBAQAogCQlicmVhazsKIAogCWNhc2UgRUxFVkFUT1JfSU5TRVJUX1NPUlQ6Ci0JCUJVR19PTighYmxrX2ZzX3JlcXVlc3QocnEpKTsKKwkJQlVHX09OKCFibGtfZnNfcmVxdWVzdChycSkgJiYgIWJsa19kaXNjYXJkX3JxKHJxKSk7CiAJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1NPUlRFRDsKIAkJcS0+bnJfc29ydGVkKys7CiAJCWlmIChycV9tZXJnZWFibGUocnEpKSB7CkBAIC02OTIsNyArNzAxLDcgQEAKIAkJICogdGhpcyByZXF1ZXN0IGlzIHNjaGVkdWxpbmcgYm91bmRhcnksIHVwZGF0ZQogCQkgKiBlbmRfc2VjdG9yCiAJCSAqLwotCQlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CisJCWlmIChibGtfZnNfcmVxdWVzdChycSkgfHwgYmxrX2Rpc2NhcmRfcnEocnEpKSB7CiAJCQlxLT5lbmRfc2VjdG9yID0gcnFfZW5kX3NlY3RvcihycSk7CiAJCQlxLT5ib3VuZGFyeV9ycSA9IHJxOwogCQl9CkBAIC03NDUsNyArNzU0LDcgQEAKIAkJICogbm90IGV2ZXIgc2VlIGl0LgogCQkgKi8KIAkJaWYgKGJsa19lbXB0eV9iYXJyaWVyKHJxKSkgewotCQkJZW5kX3F1ZXVlZF9yZXF1ZXN0KHJxLCAxKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCBibGtfcnFfYnl0ZXMocnEpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghKHJxLT5jbWRfZmxhZ3MgJiBSRVFfU1RBUlRFRCkpIHsKQEAgLTc2NCw2ICs3NzMsMTIgQEAKIAkJCSAqLwogCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfU1RBUlRFRDsKIAkJCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIEJMS19UQV9JU1NVRSk7CisKKwkJCS8qCisJCQkgKiBXZSBhcmUgbm93IGhhbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIGhhcmR3YXJlLAorCQkJICogYWRkIHRoZSB0aW1lb3V0IGhhbmRsZXIKKwkJCSAqLworCQkJYmxrX2FkZF90aW1lcihycSk7CiAJCX0KIAogCQlpZiAoIXEtPmJvdW5kYXJ5X3JxIHx8IHEtPmJvdW5kYXJ5X3JxID09IHJxKSB7CkBAIC03ODIsNyArNzk3LDYgQEAKIAkJCSAqIGRldmljZSBjYW4gaGFuZGxlCiAJCQkgKi8KIAkJCXJxLT5ucl9waHlzX3NlZ21lbnRzKys7Ci0JCQlycS0+bnJfaHdfc2VnbWVudHMrKzsKIAkJfQogCiAJCWlmICghcS0+cHJlcF9ycV9mbikKQEAgLTgwNSwxNCArODE5LDEzIEBACiAJCQkJICogc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgYWdhaW4KIAkJCQkgKi8KIAkJCQktLXJxLT5ucl9waHlzX3NlZ21lbnRzOwotCQkJCS0tcnEtPm5yX2h3X3NlZ21lbnRzOwogCQkJfQogCiAJCQlycSA9IE5VTEw7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChyZXQgPT0gQkxLUFJFUF9LSUxMKSB7CiAJCQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9RVUlFVDsKLQkJCWVuZF9xdWV1ZWRfcmVxdWVzdChycSwgMCk7CisJCQlfX2Jsa19lbmRfcmVxdWVzdChycSwgLUVJTywgYmxrX3JxX2J5dGVzKHJxKSk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgcmV0dXJuPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJCWJyZWFrOwpAQCAtOTAxLDYgKzkxNCwxOSBAQAogCXJldHVybiBFTFZfTVFVRVVFX01BWTsKIH0KIAordm9pZCBlbHZfYWJvcnRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZV9oZWFkKSkgeworCQlycSA9IGxpc3RfZW50cnlfcnEocS0+cXVldWVfaGVhZC5uZXh0KTsKKwkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUVVJRVQ7CisJCWJsa19hZGRfdHJhY2VfcnEocSwgcnEsIEJMS19UQV9BQk9SVCk7CisJCV9fYmxrX2VuZF9yZXF1ZXN0KHJxLCAtRUlPLCBibGtfcnFfYnl0ZXMocnEpKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGVsdl9hYm9ydF9xdWV1ZSk7CisKIHZvaWQgZWx2X2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOwpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZTBjZTIzYWMuLjRjZDM0MzMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmpfbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCiAjaW5jbHVkZSAiYmxrLmgiCiAKQEAgLTI0LDggKzI1LDE5NCBAQAogc3RydWN0IGtvYmplY3QgKmJsb2NrX2RlcHI7CiAjZW5kaWYKIAorLyogZm9yIGV4dGVuZGVkIGR5bmFtaWMgZGV2dCBhbGxvY2F0aW9uLCBjdXJyZW50bHkgb25seSBvbmUgbWFqb3IgaXMgdXNlZCAqLworI2RlZmluZSBNQVhfRVhUX0RFVlQJCSgxIDw8IE1JTk9SQklUUykKKworLyogRm9yIGV4dGVuZGVkIGRldnQgYWxsb2NhdGlvbi4gIGV4dF9kZXZ0X211dGV4IHByZXZlbnRzIGxvb2sgdXAKKyAqIHJlc3VsdHMgZnJvbSBnb2luZyBhd2F5IHVuZGVybmVhdGggaXRzIHVzZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoZXh0X2RldnRfbXV0ZXgpOworc3RhdGljIERFRklORV9JRFIoZXh0X2RldnRfaWRyKTsKKwogc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBkaXNrX3R5cGU7CiAKKy8qKgorICogZGlza19nZXRfcGFydCAtIGdldCBwYXJ0aXRpb24KKyAqIEBkaXNrOiBkaXNrIHRvIGxvb2sgcGFydGl0aW9uIGZyb20KKyAqIEBwYXJ0bm86IHBhcnRpdGlvbiBudW1iZXIKKyAqCisgKiBMb29rIGZvciBwYXJ0aXRpb24gQHBhcnRubyBmcm9tIEBkaXNrLiAgSWYgZm91bmQsIGluY3JlbWVudAorICogcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gaXQuCisgKgorICogQ09OVEVYVDoKKyAqIERvbid0IGNhcmUuCisgKgorICogUkVUVVJOUzoKKyAqIFBvaW50ZXIgdG8gdGhlIGZvdW5kIHBhcnRpdGlvbiBvbiBzdWNjZXNzLCBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RydWN0IGhkX3N0cnVjdCAqZGlza19nZXRfcGFydChzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IHBhcnRubykKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gTlVMTDsKKwlzdHJ1Y3QgZGlza19wYXJ0X3RibCAqcHRibDsKKworCWlmICh1bmxpa2VseShwYXJ0bm8gPCAwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlwdGJsID0gcmN1X2RlcmVmZXJlbmNlKGRpc2stPnBhcnRfdGJsKTsKKwlpZiAobGlrZWx5KHBhcnRubyA8IHB0YmwtPmxlbikpIHsKKwkJcGFydCA9IHJjdV9kZXJlZmVyZW5jZShwdGJsLT5wYXJ0W3BhcnRub10pOworCQlpZiAocGFydCkKKwkJCWdldF9kZXZpY2UocGFydF90b19kZXYocGFydCkpOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHBhcnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkaXNrX2dldF9wYXJ0KTsKKworLyoqCisgKiBkaXNrX3BhcnRfaXRlcl9pbml0IC0gaW5pdGlhbGl6ZSBwYXJ0aXRpb24gaXRlcmF0b3IKKyAqIEBwaXRlcjogaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICogQGRpc2s6IGRpc2sgdG8gaXRlcmF0ZSBvdmVyCisgKiBAZmxhZ3M6IERJU0tfUElURVJfKiBmbGFncworICoKKyAqIEluaXRpYWxpemUgQHBpdGVyIHNvIHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwYXJ0aXRpb25zIG9mIEBkaXNrLgorICoKKyAqIENPTlRFWFQ6CisgKiBEb24ndCBjYXJlLgorICovCit2b2lkIGRpc2tfcGFydF9pdGVyX2luaXQoc3RydWN0IGRpc2tfcGFydF9pdGVyICpwaXRlciwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCisJCQkgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZGlza19wYXJ0X3RibCAqcHRibDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwdGJsID0gcmN1X2RlcmVmZXJlbmNlKGRpc2stPnBhcnRfdGJsKTsKKworCXBpdGVyLT5kaXNrID0gZGlzazsKKwlwaXRlci0+cGFydCA9IE5VTEw7CisKKwlpZiAoZmxhZ3MgJiBESVNLX1BJVEVSX1JFVkVSU0UpCisJCXBpdGVyLT5pZHggPSBwdGJsLT5sZW4gLSAxOworCWVsc2UgaWYgKGZsYWdzICYgRElTS19QSVRFUl9JTkNMX1BBUlQwKQorCQlwaXRlci0+aWR4ID0gMDsKKwllbHNlCisJCXBpdGVyLT5pZHggPSAxOworCisJcGl0ZXItPmZsYWdzID0gZmxhZ3M7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRpc2tfcGFydF9pdGVyX2luaXQpOworCisvKioKKyAqIGRpc2tfcGFydF9pdGVyX25leHQgLSBwcm9jZWVkIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IHBhcnRpdGlvbiBhbmQgcmV0dXJuIGl0CisgKiBAcGl0ZXI6IGl0ZXJhdG9yIG9mIGludGVyZXN0CisgKgorICogUHJvY2VlZCBAcGl0ZXIgdG8gdGhlIG5leHQgcGFydGl0aW9uIGFuZCByZXR1cm4gaXQuCisgKgorICogQ09OVEVYVDoKKyAqIERvbid0IGNhcmUuCisgKi8KK3N0cnVjdCBoZF9zdHJ1Y3QgKmRpc2tfcGFydF9pdGVyX25leHQoc3RydWN0IGRpc2tfcGFydF9pdGVyICpwaXRlcikKK3sKKwlzdHJ1Y3QgZGlza19wYXJ0X3RibCAqcHRibDsKKwlpbnQgaW5jLCBlbmQ7CisKKwkvKiBwdXQgdGhlIGxhc3QgcGFydGl0aW9uICovCisJZGlza19wdXRfcGFydChwaXRlci0+cGFydCk7CisJcGl0ZXItPnBhcnQgPSBOVUxMOworCisJLyogZ2V0IHBhcnRfdGJsICovCisJcmN1X3JlYWRfbG9jaygpOworCXB0YmwgPSByY3VfZGVyZWZlcmVuY2UocGl0ZXItPmRpc2stPnBhcnRfdGJsKTsKKworCS8qIGRldGVybWluZSBpdGVyYXRpb24gcGFyYW1ldGVycyAqLworCWlmIChwaXRlci0+ZmxhZ3MgJiBESVNLX1BJVEVSX1JFVkVSU0UpIHsKKwkJaW5jID0gLTE7CisJCWlmIChwaXRlci0+ZmxhZ3MgJiBESVNLX1BJVEVSX0lOQ0xfUEFSVDApCisJCQllbmQgPSAtMTsKKwkJZWxzZQorCQkJZW5kID0gMDsKKwl9IGVsc2UgeworCQlpbmMgPSAxOworCQllbmQgPSBwdGJsLT5sZW47CisJfQorCisJLyogaXRlcmF0ZSB0byB0aGUgbmV4dCBwYXJ0aXRpb24gKi8KKwlmb3IgKDsgcGl0ZXItPmlkeCAhPSBlbmQ7IHBpdGVyLT5pZHggKz0gaW5jKSB7CisJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisKKwkJcGFydCA9IHJjdV9kZXJlZmVyZW5jZShwdGJsLT5wYXJ0W3BpdGVyLT5pZHhdKTsKKwkJaWYgKCFwYXJ0KQorCQkJY29udGludWU7CisJCWlmICghKHBpdGVyLT5mbGFncyAmIERJU0tfUElURVJfSU5DTF9FTVBUWSkgJiYgIXBhcnQtPm5yX3NlY3RzKQorCQkJY29udGludWU7CisKKwkJZ2V0X2RldmljZShwYXJ0X3RvX2RldihwYXJ0KSk7CisJCXBpdGVyLT5wYXJ0ID0gcGFydDsKKwkJcGl0ZXItPmlkeCArPSBpbmM7CisJCWJyZWFrOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHBpdGVyLT5wYXJ0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGlza19wYXJ0X2l0ZXJfbmV4dCk7CisKKy8qKgorICogZGlza19wYXJ0X2l0ZXJfZXhpdCAtIGZpbmlzaCB1cCBwYXJ0aXRpb24gaXRlcmF0aW9uCisgKiBAcGl0ZXI6IGl0ZXIgb2YgaW50ZXJlc3QKKyAqCisgKiBDYWxsZWQgd2hlbiBpdGVyYXRpb24gaXMgb3Zlci4gIENsZWFucyB1cCBAcGl0ZXIuCisgKgorICogQ09OVEVYVDoKKyAqIERvbid0IGNhcmUuCisgKi8KK3ZvaWQgZGlza19wYXJ0X2l0ZXJfZXhpdChzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgKnBpdGVyKQoreworCWRpc2tfcHV0X3BhcnQocGl0ZXItPnBhcnQpOworCXBpdGVyLT5wYXJ0ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRpc2tfcGFydF9pdGVyX2V4aXQpOworCisvKioKKyAqIGRpc2tfbWFwX3NlY3Rvcl9yY3UgLSBtYXAgc2VjdG9yIHRvIHBhcnRpdGlvbgorICogQGRpc2s6IGdlbmRpc2sgb2YgaW50ZXJlc3QKKyAqIEBzZWN0b3I6IHNlY3RvciB0byBtYXAKKyAqCisgKiBGaW5kIG91dCB3aGljaCBwYXJ0aXRpb24gQHNlY3RvciBtYXBzIHRvIG9uIEBkaXNrLiAgVGhpcyBpcworICogcHJpbWFyaWx5IHVzZWQgZm9yIHN0YXRzIGFjY291bnRpbmcuCisgKgorICogQ09OVEVYVDoKKyAqIFJDVSByZWFkIGxvY2tlZC4gIFRoZSByZXR1cm5lZCBwYXJ0aXRpb24gcG9pbnRlciBpcyB2YWxpZCBvbmx5CisgKiB3aGlsZSBwcmVlbXB0aW9uIGlzIGRpc2FibGVkLgorICoKKyAqIFJFVFVSTlM6CisgKiBGb3VuZCBwYXJ0aXRpb24gb24gc3VjY2VzcywgcGFydDAgaXMgcmV0dXJuZWQgaWYgbm8gcGFydGl0aW9uIG1hdGNoZXMKKyAqLworc3RydWN0IGhkX3N0cnVjdCAqZGlza19tYXBfc2VjdG9yX3JjdShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc2VjdG9yX3Qgc2VjdG9yKQoreworCXN0cnVjdCBkaXNrX3BhcnRfdGJsICpwdGJsOworCWludCBpOworCisJcHRibCA9IHJjdV9kZXJlZmVyZW5jZShkaXNrLT5wYXJ0X3RibCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgcHRibC0+bGVuOyBpKyspIHsKKwkJc3RydWN0IGhkX3N0cnVjdCAqcGFydCA9IHJjdV9kZXJlZmVyZW5jZShwdGJsLT5wYXJ0W2ldKTsKKworCQlpZiAocGFydCAmJiBwYXJ0LT5zdGFydF9zZWN0IDw9IHNlY3RvciAmJgorCQkgICAgc2VjdG9yIDwgcGFydC0+c3RhcnRfc2VjdCArIHBhcnQtPm5yX3NlY3RzKQorCQkJcmV0dXJuIHBhcnQ7CisJfQorCXJldHVybiAmZGlzay0+cGFydDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkaXNrX21hcF9zZWN0b3JfcmN1KTsKKwogLyoKICAqIENhbiBiZSBkZWxldGVkIGFsdG9nZXRoZXIuIExhdGVyLgogICoKQEAgLTQzLDE0ICsyMzAsMTQgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi12b2lkIGJsa2Rldl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgb2ZmX3Qgb2Zmc2V0KQordm9pZCBibGtkZXZfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcWYsIG9mZl90IG9mZnNldCkKIHsKIAlzdHJ1Y3QgYmxrX21ham9yX25hbWUgKmRwOwogCiAJaWYgKG9mZnNldCA8IEJMS0RFVl9NQUpPUl9IQVNIX1NJWkUpIHsKIAkJbXV0ZXhfbG9jaygmYmxvY2tfY2xhc3NfbG9jayk7CiAJCWZvciAoZHAgPSBtYWpvcl9uYW1lc1tvZmZzZXRdOyBkcDsgZHAgPSBkcC0+bmV4dCkKLQkJCXNlcV9wcmludGYoZiwgIiUzZCAlc1xuIiwgZHAtPm1ham9yLCBkcC0+bmFtZSk7CisJCQlzZXFfcHJpbnRmKHNlcWYsICIlM2QgJXNcbiIsIGRwLT5tYWpvciwgZHAtPm5hbWUpOwogCQltdXRleF91bmxvY2soJmJsb2NrX2NsYXNzX2xvY2spOwogCX0KIH0KQEAgLTEzNiw2ICszMjMsMTE4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga29ial9tYXAgKmJkZXZfbWFwOwogCisvKioKKyAqIGJsa19tYW5nbGVfbWlub3IgLSBzY2F0dGVyIG1pbm9yIG51bWJlcnMgYXBhcnQKKyAqIEBtaW5vcjogbWlub3IgbnVtYmVyIHRvIG1hbmdsZQorICoKKyAqIFNjYXR0ZXIgY29uc2VjdXRpdmVseSBhbGxvY2F0ZWQgQG1pbm9yIG51bWJlciBhcGFydCBpZiBNQU5HTEVfREVWVAorICogaXMgZW5hYmxlZC4gIE1hbmdsaW5nIHR3aWNlIGdpdmVzIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAqCisgKiBSRVRVUk5TOgorICogTWFuZ2xlZCB2YWx1ZS4KKyAqCisgKiBDT05URVhUOgorICogRG9uJ3QgY2FyZS4KKyAqLworc3RhdGljIGludCBibGtfbWFuZ2xlX21pbm9yKGludCBtaW5vcikKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNSU5PUkJJVFMgLyAyOyBpKyspIHsKKwkJaW50IGxvdyA9IG1pbm9yICYgKDEgPDwgaSk7CisJCWludCBoaWdoID0gbWlub3IgJiAoMSA8PCAoTUlOT1JCSVRTIC0gMSAtIGkpKTsKKwkJaW50IGRpc3RhbmNlID0gTUlOT1JCSVRTIC0gMSAtIDIgKiBpOworCisJCW1pbm9yIF49IGxvdyB8IGhpZ2g7CS8qIGNsZWFyIGJvdGggYml0cyAqLworCQlsb3cgPDw9IGRpc3RhbmNlOwkvKiBzd2FwIHRoZSBwb3NpdGlvbnMgKi8KKwkJaGlnaCA+Pj0gZGlzdGFuY2U7CisJCW1pbm9yIHw9IGxvdyB8IGhpZ2g7CS8qIGFuZCBzZXQgKi8KKwl9CisjZW5kaWYKKwlyZXR1cm4gbWlub3I7Cit9CisKKy8qKgorICogYmxrX2FsbG9jX2RldnQgLSBhbGxvY2F0ZSBhIGRldl90IGZvciBhIHBhcnRpdGlvbgorICogQHBhcnQ6IHBhcnRpdGlvbiB0byBhbGxvY2F0ZSBkZXZfdCBmb3IKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZworICogQGRldnQ6IG91dCBwYXJhbWV0ZXIgZm9yIHJlc3VsdGluZyBkZXZfdAorICoKKyAqIEFsbG9jYXRlIGEgZGV2X3QgZm9yIGJsb2NrIGRldmljZS4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCBhbGxvY2F0ZWQgZGV2X3QgaXMgcmV0dXJuZWQgaW4gKkBkZXZ0LiAgLWVycm5vIG9uCisgKiBmYWlsdXJlLgorICoKKyAqIENPTlRFWFQ6CisgKiBNaWdodCBzbGVlcC4KKyAqLworaW50IGJsa19hbGxvY19kZXZ0KHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQsIGRldl90ICpkZXZ0KQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gcGFydF90b19kaXNrKHBhcnQpOworCWludCBpZHgsIHJjOworCisJLyogaW4gY29uc2VjdXRpdmUgbWlub3IgcmFuZ2U/ICovCisJaWYgKHBhcnQtPnBhcnRubyA8IGRpc2stPm1pbm9ycykgeworCQkqZGV2dCA9IE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciArIHBhcnQtPnBhcnRubyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGFsbG9jYXRlIGV4dCBkZXZ0ICovCisJZG8geworCQlpZiAoIWlkcl9wcmVfZ2V0KCZleHRfZGV2dF9pZHIsIEdGUF9LRVJORUwpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJjID0gaWRyX2dldF9uZXcoJmV4dF9kZXZ0X2lkciwgcGFydCwgJmlkeCk7CisJfSB3aGlsZSAocmMgPT0gLUVBR0FJTik7CisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChpZHggPiBNQVhfRVhUX0RFVlQpIHsKKwkJaWRyX3JlbW92ZSgmZXh0X2RldnRfaWRyLCBpZHgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCSpkZXZ0ID0gTUtERVYoQkxPQ0tfRVhUX01BSk9SLCBibGtfbWFuZ2xlX21pbm9yKGlkeCkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJsa19mcmVlX2RldnQgLSBmcmVlIGEgZGV2X3QKKyAqIEBkZXZ0OiBkZXZfdCB0byBmcmVlCisgKgorICogRnJlZSBAZGV2dCB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGJsa19hbGxvY19kZXZ0KCkuCisgKgorICogQ09OVEVYVDoKKyAqIE1pZ2h0IHNsZWVwLgorICovCit2b2lkIGJsa19mcmVlX2RldnQoZGV2X3QgZGV2dCkKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKGRldnQgPT0gTUtERVYoMCwgMCkpCisJCXJldHVybjsKKworCWlmIChNQUpPUihkZXZ0KSA9PSBCTE9DS19FWFRfTUFKT1IpIHsKKwkJbXV0ZXhfbG9jaygmZXh0X2RldnRfbXV0ZXgpOworCQlpZHJfcmVtb3ZlKCZleHRfZGV2dF9pZHIsIGJsa19tYW5nbGVfbWlub3IoTUlOT1IoZGV2dCkpKTsKKwkJbXV0ZXhfdW5sb2NrKCZleHRfZGV2dF9tdXRleCk7CisJfQorfQorCitzdGF0aWMgY2hhciAqYmRldnRfc3RyKGRldl90IGRldnQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoTUFKT1IoZGV2dCkgPD0gMHhmZiAmJiBNSU5PUihkZXZ0KSA8PSAweGZmKSB7CisJCWNoYXIgdGJ1ZltCREVWVF9TSVpFXTsKKwkJc25wcmludGYodGJ1ZiwgQkRFVlRfU0laRSwgIiUwMnglMDJ4IiwgTUFKT1IoZGV2dCksIE1JTk9SKGRldnQpKTsKKwkJc25wcmludGYoYnVmLCBCREVWVF9TSVpFLCAiJS05cyIsIHRidWYpOworCX0gZWxzZQorCQlzbnByaW50ZihidWYsIEJERVZUX1NJWkUsICIlMDN4OiUwNXgiLCBNQUpPUihkZXZ0KSwgTUlOT1IoZGV2dCkpOworCisJcmV0dXJuIGJ1ZjsKK30KKwogLyoKICAqIFJlZ2lzdGVyIGRldmljZSBudW1iZXJzIGRldi4uKGRldityYW5nZS0xKQogICogcmFuZ2UgbXVzdCBiZSBub256ZXJvCkBAIC0xNTcsMTEgKzQ1NiwxMSBAQAogCiBFWFBPUlRfU1lNQk9MKGJsa191bnJlZ2lzdGVyX3JlZ2lvbik7CiAKLXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqZXhhY3RfbWF0Y2goZGV2X3QgZGV2dCwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQorc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpleGFjdF9tYXRjaChkZXZfdCBkZXZ0LCBpbnQgKnBhcnRubywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqcCA9IGRhdGE7CiAKLQlyZXR1cm4gJnAtPmRldi5rb2JqOworCXJldHVybiAmZGlza190b19kZXYocCktPmtvYmo7CiB9CiAKIHN0YXRpYyBpbnQgZXhhY3RfbG9jayhkZXZfdCBkZXZ0LCB2b2lkICpkYXRhKQpAQCAtMTc5LDIxICs0NzgsNDYgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIGluIEBkaXNrCiAgKiB3aXRoIHRoZSBrZXJuZWwuCisgKgorICogRklYTUU6IGVycm9yIGhhbmRsaW5nCiAgKi8KIHZvaWQgYWRkX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKwlkZXZfdCBkZXZ0OwogCWludCByZXR2YWw7CiAKKwkvKiBtaW5vcnMgPT0gMCBpbmRpY2F0ZXMgdG8gdXNlIGV4dCBkZXZ0IGZyb20gcGFydDAgYW5kIHNob3VsZAorCSAqIGJlIGFjY29tcGFuaWVkIHdpdGggRVhUX0RFVlQgZmxhZy4gIE1ha2Ugc3VyZSBhbGwKKwkgKiBwYXJhbWV0ZXJzIG1ha2Ugc2Vuc2UuCisJICovCisJV0FSTl9PTihkaXNrLT5taW5vcnMgJiYgIShkaXNrLT5tYWpvciB8fCBkaXNrLT5maXJzdF9taW5vcikpOworCVdBUk5fT04oIWRpc2stPm1pbm9ycyAmJiAhKGRpc2stPmZsYWdzICYgR0VOSERfRkxfRVhUX0RFVlQpKTsKKwogCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX1VQOwotCWJsa19yZWdpc3Rlcl9yZWdpb24oTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSwKLQkJCSAgICBkaXNrLT5taW5vcnMsIE5VTEwsIGV4YWN0X21hdGNoLCBleGFjdF9sb2NrLCBkaXNrKTsKKworCXJldHZhbCA9IGJsa19hbGxvY19kZXZ0KCZkaXNrLT5wYXJ0MCwgJmRldnQpOworCWlmIChyZXR2YWwpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKwlkaXNrX3RvX2RldihkaXNrKS0+ZGV2dCA9IGRldnQ7CisKKwkvKiAtPm1ham9yIGFuZCAtPmZpcnN0X21pbm9yIGFyZW4ndCBzdXBwb3NlZCB0byBiZQorCSAqIGRlcmVmZXJlbmNlZCBmcm9tIGhlcmUgb24sIGJ1dCBzZXQgdGhlbSBqdXN0IGluIGNhc2UuCisJICovCisJZGlzay0+bWFqb3IgPSBNQUpPUihkZXZ0KTsKKwlkaXNrLT5maXJzdF9taW5vciA9IE1JTk9SKGRldnQpOworCisJYmxrX3JlZ2lzdGVyX3JlZ2lvbihkaXNrX2RldnQoZGlzayksIGRpc2stPm1pbm9ycywgTlVMTCwKKwkJCSAgICBleGFjdF9tYXRjaCwgZXhhY3RfbG9jaywgZGlzayk7CiAJcmVnaXN0ZXJfZGlzayhkaXNrKTsKIAlibGtfcmVnaXN0ZXJfcXVldWUoZGlzayk7CiAKIAliZGkgPSAmZGlzay0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm87Ci0JYmRpX3JlZ2lzdGVyX2RldihiZGksIE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcikpOwotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkaXNrLT5kZXYua29iaiwgJmJkaS0+ZGV2LT5rb2JqLCAiYmRpIik7CisJYmRpX3JlZ2lzdGVyX2RldihiZGksIGRpc2tfZGV2dChkaXNrKSk7CisJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLCAmYmRpLT5kZXYtPmtvYmosCisJCQkJICAgImJkaSIpOwogCVdBUk5fT04ocmV0dmFsKTsKIH0KIApAQCAtMjAyLDc5ICs1MjYsNzIgQEAKIAogdm9pZCB1bmxpbmtfZ2VuZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKLQlzeXNmc19yZW1vdmVfbGluaygmZGlzay0+ZGV2LmtvYmosICJiZGkiKTsKKwlzeXNmc19yZW1vdmVfbGluaygmZGlza190b19kZXYoZGlzayktPmtvYmosICJiZGkiKTsKIAliZGlfdW5yZWdpc3RlcigmZGlzay0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8pOwogCWJsa191bnJlZ2lzdGVyX3F1ZXVlKGRpc2spOwotCWJsa191bnJlZ2lzdGVyX3JlZ2lvbihNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpLAotCQkJICAgICAgZGlzay0+bWlub3JzKTsKKwlibGtfdW5yZWdpc3Rlcl9yZWdpb24oZGlza19kZXZ0KGRpc2spLCBkaXNrLT5taW5vcnMpOwogfQogCiAvKioKICAqIGdldF9nZW5kaXNrIC0gZ2V0IHBhcnRpdGlvbmluZyBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBkZXZpY2UKLSAqIEBkZXY6IGRldmljZSB0byBnZXQgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIGZvcgorICogQGRldnQ6IGRldmljZSB0byBnZXQgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIGZvcgorICogQHBhcnQ6IHJldHVybmVkIHBhcnRpdGlvbiBpbmRleAogICoKICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgcGFydGl0aW9uaW5nCi0gKiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGRldmljZSBAZGV2LgorICogaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBkZXZpY2UgQGRldnQuCiAgKi8KLXN0cnVjdCBnZW5kaXNrICpnZXRfZ2VuZGlzayhkZXZfdCBkZXZ0LCBpbnQgKnBhcnQpCitzdHJ1Y3QgZ2VuZGlzayAqZ2V0X2dlbmRpc2soZGV2X3QgZGV2dCwgaW50ICpwYXJ0bm8pCiB7Ci0Jc3RydWN0IGtvYmplY3QgKmtvYmogPSBrb2JqX2xvb2t1cChiZGV2X21hcCwgZGV2dCwgcGFydCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0ga29ial90b19kZXYoa29iaik7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBOVUxMOwogCi0JcmV0dXJuICBrb2JqID8gZGV2X3RvX2Rpc2soZGV2KSA6IE5VTEw7Ci19CisJaWYgKE1BSk9SKGRldnQpICE9IEJMT0NLX0VYVF9NQUpPUikgeworCQlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAotLyoKLSAqIHByaW50IGEgcGFydGl0aW9ucyAtIGludGVuZGVkIGZvciBwbGFjZXMgd2hlcmUgdGhlIHJvb3QgZmlsZXN5c3RlbSBjYW4ndCBiZQotICogbW91bnRlZCBhbmQgdGh1cyB0byBnaXZlIHRoZSB2aWN0aW0gc29tZSBpZGVhIG9mIHdoYXQgd2VudCB3cm9uZwotICovCi1zdGF0aWMgaW50IHByaW50a19wYXJ0aXRpb24oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBnZW5kaXNrICpzZ3A7Ci0JY2hhciBidWZbQkRFVk5BTUVfU0laRV07Ci0JaW50IG47CisJCWtvYmogPSBrb2JqX2xvb2t1cChiZGV2X21hcCwgZGV2dCwgcGFydG5vKTsKKwkJaWYgKGtvYmopCisJCQlkaXNrID0gZGV2X3RvX2Rpc2soa29ial90b19kZXYoa29iaikpOworCX0gZWxzZSB7CisJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAKLQlpZiAoZGV2LT50eXBlICE9ICZkaXNrX3R5cGUpCi0JCWdvdG8gZXhpdDsKLQotCXNncCA9IGRldl90b19kaXNrKGRldik7Ci0JLyoKLQkgKiBEb24ndCBzaG93IGVtcHR5IGRldmljZXMgb3IgdGhpbmdzIHRoYXQgaGF2ZSBiZWVuIHN1cnByZXNzZWQKLQkgKi8KLQlpZiAoZ2V0X2NhcGFjaXR5KHNncCkgPT0gMCB8fAotCSAgICAoc2dwLT5mbGFncyAmIEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPKSkKLQkJZ290byBleGl0OwotCi0JLyoKLQkgKiBOb3RlLCB1bmxpa2UgL3Byb2MvcGFydGl0aW9ucywgSSBhbSBzaG93aW5nIHRoZSBudW1iZXJzIGluCi0JICogaGV4IC0gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSByb290PSBvcHRpb24gdGFrZXMuCi0JICovCi0JcHJpbnRrKCIlMDJ4JTAyeCAlMTBsbHUgJXMiLAotCQlzZ3AtPm1ham9yLCBzZ3AtPmZpcnN0X21pbm9yLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWdldF9jYXBhY2l0eShzZ3ApID4+IDEsCi0JCWRpc2tfbmFtZShzZ3AsIDAsIGJ1ZikpOwotCWlmIChzZ3AtPmRyaXZlcmZzX2RldiAhPSBOVUxMICYmCi0JICAgIHNncC0+ZHJpdmVyZnNfZGV2LT5kcml2ZXIgIT0gTlVMTCkKLQkJcHJpbnRrKCIgZHJpdmVyOiAlc1xuIiwKLQkJCXNncC0+ZHJpdmVyZnNfZGV2LT5kcml2ZXItPm5hbWUpOwotCWVsc2UKLQkJcHJpbnRrKCIgKGRyaXZlcj8pXG4iKTsKLQotCS8qIG5vdyBzaG93IHRoZSBwYXJ0aXRpb25zICovCi0JZm9yIChuID0gMDsgbiA8IHNncC0+bWlub3JzIC0gMTsgKytuKSB7Ci0JCWlmIChzZ3AtPnBhcnRbbl0gPT0gTlVMTCkKLQkJCWdvdG8gZXhpdDsKLQkJaWYgKHNncC0+cGFydFtuXS0+bnJfc2VjdHMgPT0gMCkKLQkJCWdvdG8gZXhpdDsKLQkJcHJpbnRrKCIgICUwMnglMDJ4ICUxMGxsdSAlc1xuIiwKLQkJCXNncC0+bWFqb3IsIG4gKyAxICsgc2dwLT5maXJzdF9taW5vciwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2dwLT5wYXJ0W25dLT5ucl9zZWN0cyA+PiAxLAotCQkJZGlza19uYW1lKHNncCwgbiArIDEsIGJ1ZikpOworCQltdXRleF9sb2NrKCZleHRfZGV2dF9tdXRleCk7CisJCXBhcnQgPSBpZHJfZmluZCgmZXh0X2RldnRfaWRyLCBibGtfbWFuZ2xlX21pbm9yKE1JTk9SKGRldnQpKSk7CisJCWlmIChwYXJ0ICYmIGdldF9kaXNrKHBhcnRfdG9fZGlzayhwYXJ0KSkpIHsKKwkJCSpwYXJ0bm8gPSBwYXJ0LT5wYXJ0bm87CisJCQlkaXNrID0gcGFydF90b19kaXNrKHBhcnQpOworCQl9CisJCW11dGV4X3VubG9jaygmZXh0X2RldnRfbXV0ZXgpOwogCX0KLWV4aXQ6Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gZGlzazsKIH0KIAorLyoqCisgKiBiZGdldF9kaXNrIC0gZG8gYmRnZXQoKSBieSBnZW5kaXNrIGFuZCBwYXJ0aXRpb24gbnVtYmVyCisgKiBAZGlzazogZ2VuZGlzayBvZiBpbnRlcmVzdAorICogQHBhcnRubzogcGFydGl0aW9uIG51bWJlcgorICoKKyAqIEZpbmQgcGFydGl0aW9uIEBwYXJ0bm8gZnJvbSBAZGlzaywgZG8gYmRnZXQoKSBvbiBpdC4KKyAqCisgKiBDT05URVhUOgorICogRG9uJ3QgY2FyZS4KKyAqCisgKiBSRVRVUk5TOgorICogUmVzdWx0aW5nIGJsb2NrX2RldmljZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBibG9ja19kZXZpY2UgKmJkZ2V0X2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pCit7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gTlVMTDsKKworCXBhcnQgPSBkaXNrX2dldF9wYXJ0KGRpc2ssIHBhcnRubyk7CisJaWYgKHBhcnQpCisJCWJkZXYgPSBiZGdldChwYXJ0X2RldnQocGFydCkpOworCWRpc2tfcHV0X3BhcnQocGFydCk7CisKKwlyZXR1cm4gYmRldjsKK30KK0VYUE9SVF9TWU1CT0woYmRnZXRfZGlzayk7CisKIC8qCiAgKiBwcmludCBhIGZ1bGwgbGlzdCBvZiBhbGwgcGFydGl0aW9ucyAtIGludGVuZGVkIGZvciBwbGFjZXMgd2hlcmUgdGhlIHJvb3QKICAqIGZpbGVzeXN0ZW0gY2FuJ3QgYmUgbW91bnRlZCBhbmQgdGh1cyB0byBnaXZlIHRoZSB2aWN0aW0gc29tZSBpZGVhIG9mIHdoYXQKQEAgLTI4MiwxMjAgKzU5OSwxNDUgQEAKICAqLwogdm9pZCBfX2luaXQgcHJpbnRrX2FsbF9wYXJ0aXRpb25zKHZvaWQpCiB7Ci0JbXV0ZXhfbG9jaygmYmxvY2tfY2xhc3NfbG9jayk7Ci0JY2xhc3NfZm9yX2VhY2hfZGV2aWNlKCZibG9ja19jbGFzcywgTlVMTCwgTlVMTCwgcHJpbnRrX3BhcnRpdGlvbik7Ci0JbXV0ZXhfdW5sb2NrKCZibG9ja19jbGFzc19sb2NrKTsKKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwljbGFzc19kZXZfaXRlcl9pbml0KCZpdGVyLCAmYmxvY2tfY2xhc3MsIE5VTEwsICZkaXNrX3R5cGUpOworCXdoaWxlICgoZGV2ID0gY2xhc3NfZGV2X2l0ZXJfbmV4dCgmaXRlcikpKSB7CisJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKKwkJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOworCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCQljaGFyIG5hbWVfYnVmW0JERVZOQU1FX1NJWkVdOworCQljaGFyIGRldnRfYnVmW0JERVZUX1NJWkVdOworCisJCS8qCisJCSAqIERvbid0IHNob3cgZW1wdHkgZGV2aWNlcyBvciB0aGluZ3MgdGhhdCBoYXZlIGJlZW4KKwkJICogc3VycHJlc3NlZAorCQkgKi8KKwkJaWYgKGdldF9jYXBhY2l0eShkaXNrKSA9PSAwIHx8CisJCSAgICAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9TVVBQUkVTU19QQVJUSVRJT05fSU5GTykpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBOb3RlLCB1bmxpa2UgL3Byb2MvcGFydGl0aW9ucywgSSBhbSBzaG93aW5nIHRoZQorCQkgKiBudW1iZXJzIGluIGhleCAtIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgcm9vdD0KKwkJICogb3B0aW9uIHRha2VzLgorCQkgKi8KKwkJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIERJU0tfUElURVJfSU5DTF9QQVJUMCk7CisJCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpIHsKKwkJCWJvb2wgaXNfcGFydDAgPSBwYXJ0ID09ICZkaXNrLT5wYXJ0MDsKKworCQkJcHJpbnRrKCIlcyVzICUxMGxsdSAlcyIsIGlzX3BhcnQwID8gIiIgOiAiICAiLAorCQkJICAgICAgIGJkZXZ0X3N0cihwYXJ0X2RldnQocGFydCksIGRldnRfYnVmKSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBhcnQtPm5yX3NlY3RzID4+IDEsCisJCQkgICAgICAgZGlza19uYW1lKGRpc2ssIHBhcnQtPnBhcnRubywgbmFtZV9idWYpKTsKKwkJCWlmIChpc19wYXJ0MCkgeworCQkJCWlmIChkaXNrLT5kcml2ZXJmc19kZXYgIT0gTlVMTCAmJgorCQkJCSAgICBkaXNrLT5kcml2ZXJmc19kZXYtPmRyaXZlciAhPSBOVUxMKQorCQkJCQlwcmludGsoIiBkcml2ZXI6ICVzXG4iLAorCQkJCQkgICAgICBkaXNrLT5kcml2ZXJmc19kZXYtPmRyaXZlci0+bmFtZSk7CisJCQkJZWxzZQorCQkJCQlwcmludGsoIiAoZHJpdmVyPylcbiIpOworCQkJfSBlbHNlCisJCQkJcHJpbnRrKCJcbiIpOworCQl9CisJCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKKwl9CisJY2xhc3NfZGV2X2l0ZXJfZXhpdCgmaXRlcik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyogaXRlcmF0b3IgKi8KLXN0YXRpYyBpbnQgZmluZF9zdGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCAqZGlza19zZXFmX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxZiwgbG9mZl90ICpwb3MpCiB7Ci0JbG9mZl90ICprID0gZGF0YTsKKwlsb2ZmX3Qgc2tpcCA9ICpwb3M7CisJc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCWlmIChkZXYtPnR5cGUgIT0gJmRpc2tfdHlwZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCEqaykKLQkJcmV0dXJuIDE7Ci0JKCprKS0tOwotCXJldHVybiAwOworCWl0ZXIgPSBrbWFsbG9jKHNpemVvZigqaXRlciksIEdGUF9LRVJORUwpOworCWlmICghaXRlcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzZXFmLT5wcml2YXRlID0gaXRlcjsKKwljbGFzc19kZXZfaXRlcl9pbml0KGl0ZXIsICZibG9ja19jbGFzcywgTlVMTCwgJmRpc2tfdHlwZSk7CisJZG8geworCQlkZXYgPSBjbGFzc19kZXZfaXRlcl9uZXh0KGl0ZXIpOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCX0gd2hpbGUgKHNraXAtLSk7CisKKwlyZXR1cm4gZGV2X3RvX2Rpc2soZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgKnBhcnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwYXJ0LCBsb2ZmX3QgKnBvcykKK3N0YXRpYyB2b2lkICpkaXNrX3NlcWZfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcWYsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlsb2ZmX3QgayA9ICpwb3M7CiAKLQlpZiAoIWspCi0JCXBhcnQtPnByaXZhdGUgPSAodm9pZCAqKTFMVTsJLyogdGVsbCBzaG93IHRvIHByaW50IGhlYWRlciAqLwotCi0JbXV0ZXhfbG9jaygmYmxvY2tfY2xhc3NfbG9jayk7Ci0JZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJmJsb2NrX2NsYXNzLCBOVUxMLCAmaywgZmluZF9zdGFydCk7Ci0JaWYgKGRldikgewotCQlwdXRfZGV2aWNlKGRldik7CisJKCpwb3MpKys7CisJZGV2ID0gY2xhc3NfZGV2X2l0ZXJfbmV4dChzZXFmLT5wcml2YXRlKTsKKwlpZiAoZGV2KQogCQlyZXR1cm4gZGV2X3RvX2Rpc2soZGV2KTsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBmaW5kX25leHQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZGlza19zZXFmX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXFmLCB2b2lkICp2KQogewotCWlmIChkZXYtPnR5cGUgPT0gJmRpc2tfdHlwZSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19CisJc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyID0gc2VxZi0+cHJpdmF0ZTsKIAotc3RhdGljIHZvaWQgKnBhcnRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnBhcnQsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBnZW5kaXNrICpncCA9IHY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCSsrKnBvczsKLQlkZXYgPSBjbGFzc19maW5kX2RldmljZSgmYmxvY2tfY2xhc3MsICZncC0+ZGV2LCBOVUxMLCBmaW5kX25leHQpOwotCWlmIChkZXYpIHsKLQkJcHV0X2RldmljZShkZXYpOwotCQlyZXR1cm4gZGV2X3RvX2Rpc2soZGV2KTsKKwkvKiBzdG9wIGlzIGNhbGxlZCBldmVuIGFmdGVyIHN0YXJ0IGZhaWxlZCA6LSggKi8KKwlpZiAoaXRlcikgeworCQljbGFzc19kZXZfaXRlcl9leGl0KGl0ZXIpOworCQlrZnJlZShpdGVyKTsKIAl9Ci0JcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBhcnRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnBhcnQsIHZvaWQgKnYpCitzdGF0aWMgdm9pZCAqc2hvd19wYXJ0aXRpb25fc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXFmLCBsb2ZmX3QgKnBvcykKIHsKLQltdXRleF91bmxvY2soJmJsb2NrX2NsYXNzX2xvY2spOworCXN0YXRpYyB2b2lkICpwOworCisJcCA9IGRpc2tfc2VxZl9zdGFydChzZXFmLCBwb3MpOworCWlmICghSVNfRVJSKHApICYmIHAgJiYgISpwb3MpCisJCXNlcV9wdXRzKHNlcWYsICJtYWpvciBtaW5vciAgI2Jsb2NrcyAgbmFtZVxuXG4iKTsKKwlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGludCBzaG93X3BhcnRpdGlvbihzdHJ1Y3Qgc2VxX2ZpbGUgKnBhcnQsIHZvaWQgKnYpCitzdGF0aWMgaW50IHNob3dfcGFydGl0aW9uKHN0cnVjdCBzZXFfZmlsZSAqc2VxZiwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqc2dwID0gdjsKLQlpbnQgbjsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAljaGFyIGJ1ZltCREVWTkFNRV9TSVpFXTsKIAotCS8qCi0JICogUHJpbnQgaGVhZGVyIGlmIHN0YXJ0IHRvbGQgdXMgdG8gZG8uICBUaGlzIGlzIHRvIHByZXNlcnZlCi0JICogdGhlIG9yaWdpbmFsIGJlaGF2aW9yIG9mIG5vdCBwcmludGluZyBoZWFkZXIgaWYgbm8KLQkgKiBwYXJ0aXRpb24gZXhpc3RzLiAgVGhpcyBoYWNrZXJ5IHdpbGwgYmUgcmVtb3ZlZCBsYXRlciB3aXRoCi0JICogY2xhc3MgaXRlcmF0aW9uIGNsZWFuIHVwLgotCSAqLwotCWlmIChwYXJ0LT5wcml2YXRlKSB7Ci0JCXNlcV9wdXRzKHBhcnQsICJtYWpvciBtaW5vciAgI2Jsb2NrcyAgbmFtZVxuXG4iKTsKLQkJcGFydC0+cHJpdmF0ZSA9IE5VTEw7Ci0JfQotCiAJLyogRG9uJ3Qgc2hvdyBub24tcGFydGl0aW9uYWJsZSByZW1vdmVhYmxlIGRldmljZXMgb3IgZW1wdHkgZGV2aWNlcyAqLwotCWlmICghZ2V0X2NhcGFjaXR5KHNncCkgfHwKLQkJCShzZ3AtPm1pbm9ycyA9PSAxICYmIChzZ3AtPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKSkpCisJaWYgKCFnZXRfY2FwYWNpdHkoc2dwKSB8fCAoIWRpc2tfcGFydGl0aW9uYWJsZShzZ3ApICYmCisJCQkJICAgKHNncC0+ZmxhZ3MgJiBHRU5IRF9GTF9SRU1PVkFCTEUpKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHNncC0+ZmxhZ3MgJiBHRU5IRF9GTF9TVVBQUkVTU19QQVJUSVRJT05fSU5GTykKIAkJcmV0dXJuIDA7CiAKIAkvKiBzaG93IHRoZSBmdWxsIGRpc2sgYW5kIGFsbCBub24tMCBzaXplIHBhcnRpdGlvbnMgb2YgaXQgKi8KLQlzZXFfcHJpbnRmKHBhcnQsICIlNGQgICU0ZCAlMTBsbHUgJXNcbiIsCi0JCXNncC0+bWFqb3IsIHNncC0+Zmlyc3RfbWlub3IsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpZ2V0X2NhcGFjaXR5KHNncCkgPj4gMSwKLQkJZGlza19uYW1lKHNncCwgMCwgYnVmKSk7Ci0JZm9yIChuID0gMDsgbiA8IHNncC0+bWlub3JzIC0gMTsgbisrKSB7Ci0JCWlmICghc2dwLT5wYXJ0W25dKQotCQkJY29udGludWU7Ci0JCWlmIChzZ3AtPnBhcnRbbl0tPm5yX3NlY3RzID09IDApCi0JCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihwYXJ0LCAiJTRkICAlNGQgJTEwbGx1ICVzXG4iLAotCQkJc2dwLT5tYWpvciwgbiArIDEgKyBzZ3AtPmZpcnN0X21pbm9yLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZ3AtPnBhcnRbbl0tPm5yX3NlY3RzID4+IDEgLAotCQkJZGlza19uYW1lKHNncCwgbiArIDEsIGJ1ZikpOwotCX0KKwlkaXNrX3BhcnRfaXRlcl9pbml0KCZwaXRlciwgc2dwLCBESVNLX1BJVEVSX0lOQ0xfUEFSVDApOworCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpCisJCXNlcV9wcmludGYoc2VxZiwgIiU0ZCAgJTdkICUxMGxsdSAlc1xuIiwKKwkJCSAgIE1BSk9SKHBhcnRfZGV2dChwYXJ0KSksIE1JTk9SKHBhcnRfZGV2dChwYXJ0KSksCisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBhcnQtPm5yX3NlY3RzID4+IDEsCisJCQkgICBkaXNrX25hbWUoc2dwLCBwYXJ0LT5wYXJ0bm8sIGJ1ZikpOworCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKIAogCXJldHVybiAwOwogfQogCiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcGFydGl0aW9uc19vcCA9IHsKLQkuc3RhcnQJPSBwYXJ0X3N0YXJ0LAotCS5uZXh0CT0gcGFydF9uZXh0LAotCS5zdG9wCT0gcGFydF9zdG9wLAorCS5zdGFydAk9IHNob3dfcGFydGl0aW9uX3N0YXJ0LAorCS5uZXh0CT0gZGlza19zZXFmX25leHQsCisJLnN0b3AJPSBkaXNrX3NlcWZfc3RvcCwKIAkuc2hvdwk9IHNob3dfcGFydGl0aW9uCiB9OwogI2VuZGlmCiAKIAotc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpiYXNlX3Byb2JlKGRldl90IGRldnQsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqYmFzZV9wcm9iZShkZXZfdCBkZXZ0LCBpbnQgKnBhcnRubywgdm9pZCAqZGF0YSkKIHsKIAlpZiAocmVxdWVzdF9tb2R1bGUoImJsb2NrLW1ham9yLSVkLSVkIiwgTUFKT1IoZGV2dCksIE1JTk9SKGRldnQpKSA+IDApCiAJCS8qIE1ha2Ugb2xkLXN0eWxlIDIuNCBhbGlhc2VzIHdvcmsgKi8KQEAgLTQzMSw2ICs3NzMsMTQgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGlzay0+bWlub3JzKTsKIH0KIAorc3RhdGljIHNzaXplX3QgZGlza19leHRfcmFuZ2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGlza19tYXhfcGFydHMoZGlzaykpOworfQorCiBzdGF0aWMgc3NpemVfdCBkaXNrX3JlbW92YWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNDQ1LDE1ICs3OTUsNyBAQAogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkaXNrLT5wb2xpY3kgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRpc2tfc2l6ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylnZXRfY2FwYWNpdHkoZGlzaykpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBnZXRfZGlza19ybyhkaXNrKSA/IDEgOiAwKTsKIH0KIAogc3RhdGljIHNzaXplX3QgZGlza19jYXBhYmlsaXR5X3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNDY0LDczICs4MDYsMjYgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgZGlzay0+ZmxhZ3MpOwogfQogCi1zdGF0aWMgc3NpemVfdCBkaXNrX3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCWRpc2tfcm91bmRfc3RhdHMoZGlzayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsCi0JCSIlOGx1ICU4bHUgJThsbHUgJTh1ICIKLQkJIiU4bHUgJThsdSAlOGxsdSAlOHUgIgotCQkiJTh1ICU4dSAlOHUiCi0JCSJcbiIsCi0JCWRpc2tfc3RhdF9yZWFkKGRpc2ssIGlvc1tSRUFEXSksCi0JCWRpc2tfc3RhdF9yZWFkKGRpc2ssIG1lcmdlc1tSRUFEXSksCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpZGlza19zdGF0X3JlYWQoZGlzaywgc2VjdG9yc1tSRUFEXSksCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZGlzaywgdGlja3NbUkVBRF0pKSwKLQkJZGlza19zdGF0X3JlYWQoZGlzaywgaW9zW1dSSVRFXSksCi0JCWRpc2tfc3RhdF9yZWFkKGRpc2ssIG1lcmdlc1tXUklURV0pLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWRpc2tfc3RhdF9yZWFkKGRpc2ssIHNlY3RvcnNbV1JJVEVdKSwKLQkJamlmZmllc190b19tc2VjcyhkaXNrX3N0YXRfcmVhZChkaXNrLCB0aWNrc1tXUklURV0pKSwKLQkJZGlzay0+aW5fZmxpZ2h0LAotCQlqaWZmaWVzX3RvX21zZWNzKGRpc2tfc3RhdF9yZWFkKGRpc2ssIGlvX3RpY2tzKSksCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZGlzaywgdGltZV9pbl9xdWV1ZSkpKTsKLX0KLQotI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAotc3RhdGljIHNzaXplX3QgZGlza19mYWlsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9GQUlMID8gMSA6IDApOwotfQotCi1zdGF0aWMgc3NpemVfdCBkaXNrX2ZhaWxfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKLQlpbnQgaTsKLQotCWlmIChjb3VudCA+IDAgJiYgc3NjYW5mKGJ1ZiwgIiVkIiwgJmkpID4gMCkgewotCQlpZiAoaSA9PSAwKQotCQkJZGlzay0+ZmxhZ3MgJj0gfkdFTkhEX0ZMX0ZBSUw7Ci0JCWVsc2UKLQkJCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX0ZBSUw7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0jZW5kaWYKLQogc3RhdGljIERFVklDRV9BVFRSKHJhbmdlLCBTX0lSVUdPLCBkaXNrX3JhbmdlX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGV4dF9yYW5nZSwgU19JUlVHTywgZGlza19leHRfcmFuZ2Vfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIocmVtb3ZhYmxlLCBTX0lSVUdPLCBkaXNrX3JlbW92YWJsZV9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihybywgU19JUlVHTywgZGlza19yb19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzaXplLCBTX0lSVUdPLCBkaXNrX3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2l6ZSwgU19JUlVHTywgcGFydF9zaXplX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGNhcGFiaWxpdHksIFNfSVJVR08sIGRpc2tfY2FwYWJpbGl0eV9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdGF0LCBTX0lSVUdPLCBkaXNrX3N0YXRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdCwgU19JUlVHTywgcGFydF9zdGF0X3Nob3csIE5VTEwpOwogI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2ZhaWwgPQotCV9fQVRUUihtYWtlLWl0LWZhaWwsIFNfSVJVR098U19JV1VTUiwgZGlza19mYWlsX3Nob3csIGRpc2tfZmFpbF9zdG9yZSk7CisJX19BVFRSKG1ha2UtaXQtZmFpbCwgU19JUlVHT3xTX0lXVVNSLCBwYXJ0X2ZhaWxfc2hvdywgcGFydF9mYWlsX3N0b3JlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQUlMX0lPX1RJTUVPVVQKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9mYWlsX3RpbWVvdXQgPQorCV9fQVRUUihpby10aW1lb3V0LWZhaWwsICBTX0lSVUdPfFNfSVdVU1IsIHBhcnRfdGltZW91dF9zaG93LAorCQlwYXJ0X3RpbWVvdXRfc3RvcmUpOwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkaXNrX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3JhbmdlLmF0dHIsCisJJmRldl9hdHRyX2V4dF9yYW5nZS5hdHRyLAogCSZkZXZfYXR0cl9yZW1vdmFibGUuYXR0ciwKIAkmZGV2X2F0dHJfcm8uYXR0ciwKIAkmZGV2X2F0dHJfc2l6ZS5hdHRyLApAQCAtNTM5LDYgKzgzNCw5IEBACiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCiAJJmRldl9hdHRyX2ZhaWwuYXR0ciwKICNlbmRpZgorI2lmZGVmIENPTkZJR19GQUlMX0lPX1RJTUVPVVQKKwkmZGV2X2F0dHJfZmFpbF90aW1lb3V0LmF0dHIsCisjZW5kaWYKIAlOVUxMCiB9OwogCkBAIC01NTEsMTMgKzg0OSw4NyBAQAogCU5VTEwKIH07CiAKK3N0YXRpYyB2b2lkIGRpc2tfZnJlZV9wdGJsX3JjdV9jYihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGRpc2tfcGFydF90YmwgKnB0YmwgPQorCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGRpc2tfcGFydF90YmwsIHJjdV9oZWFkKTsKKworCWtmcmVlKHB0YmwpOworfQorCisvKioKKyAqIGRpc2tfcmVwbGFjZV9wYXJ0X3RibCAtIHJlcGxhY2UgZGlzay0+cGFydF90YmwgaW4gUkNVLXNhZmUgd2F5CisgKiBAZGlzazogZGlzayB0byByZXBsYWNlIHBhcnRfdGJsIGZvcgorICogQG5ld19wdGJsOiBuZXcgcGFydF90YmwgdG8gaW5zdGFsbAorICoKKyAqIFJlcGxhY2UgZGlzay0+cGFydF90Ymwgd2l0aCBAbmV3X3B0YmwgaW4gUkNVLXNhZmUgd2F5LiAgVGhlCisgKiBvcmlnaW5hbCBwdGJsIGlzIGZyZWVkIHVzaW5nIFJDVSBjYWxsYmFjay4KKyAqCisgKiBMT0NLSU5HOgorICogTWF0Y2hpbmcgYmRfbXV0eCBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIGRpc2tfcmVwbGFjZV9wYXJ0X3RibChzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKKwkJCQkgIHN0cnVjdCBkaXNrX3BhcnRfdGJsICpuZXdfcHRibCkKK3sKKwlzdHJ1Y3QgZGlza19wYXJ0X3RibCAqb2xkX3B0YmwgPSBkaXNrLT5wYXJ0X3RibDsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihkaXNrLT5wYXJ0X3RibCwgbmV3X3B0YmwpOworCWlmIChvbGRfcHRibCkKKwkJY2FsbF9yY3UoJm9sZF9wdGJsLT5yY3VfaGVhZCwgZGlza19mcmVlX3B0YmxfcmN1X2NiKTsKK30KKworLyoqCisgKiBkaXNrX2V4cGFuZF9wYXJ0X3RibCAtIGV4cGFuZCBkaXNrLT5wYXJ0X3RibAorICogQGRpc2s6IGRpc2sgdG8gZXhwYW5kIHBhcnRfdGJsIGZvcgorICogQHBhcnRubzogZXhwYW5kIHN1Y2ggdGhhdCB0aGlzIHBhcnRubyBjYW4gZml0IGluCisgKgorICogRXhwYW5kIGRpc2stPnBhcnRfdGJsIHN1Y2ggdGhhdCBAcGFydG5vIGNhbiBmaXQgaW4uICBkaXNrLT5wYXJ0X3RibAorICogdXNlcyBSQ1UgdG8gYWxsb3cgdW5sb2NrZWQgZGVyZWZlcmVuY2luZyBmb3Igc3RhdHMgYW5kIG90aGVyIHN0dWZmLgorICoKKyAqIExPQ0tJTkc6CisgKiBNYXRjaGluZyBiZF9tdXRleCBsb2NrZWQsIG1pZ2h0IHNsZWVwLgorICoKKyAqIFJFVFVSTlM6CisgKiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgZGlza19leHBhbmRfcGFydF90Ymwoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pCit7CisJc3RydWN0IGRpc2tfcGFydF90YmwgKm9sZF9wdGJsID0gZGlzay0+cGFydF90Ymw7CisJc3RydWN0IGRpc2tfcGFydF90YmwgKm5ld19wdGJsOworCWludCBsZW4gPSBvbGRfcHRibCA/IG9sZF9wdGJsLT5sZW4gOiAwOworCWludCB0YXJnZXQgPSBwYXJ0bm8gKyAxOworCXNpemVfdCBzaXplOworCWludCBpOworCisJLyogZGlza19tYXhfcGFydHMoKSBpcyB6ZXJvIGR1cmluZyBpbml0aWFsaXphdGlvbiwgaWdub3JlIGlmIHNvICovCisJaWYgKGRpc2tfbWF4X3BhcnRzKGRpc2spICYmIHRhcmdldCA+IGRpc2tfbWF4X3BhcnRzKGRpc2spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YXJnZXQgPD0gbGVuKQorCQlyZXR1cm4gMDsKKworCXNpemUgPSBzaXplb2YoKm5ld19wdGJsKSArIHRhcmdldCAqIHNpemVvZihuZXdfcHRibC0+cGFydFswXSk7CisJbmV3X3B0YmwgPSBremFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCwgZGlzay0+bm9kZV9pZCk7CisJaWYgKCFuZXdfcHRibCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX1JDVV9IRUFEKCZuZXdfcHRibC0+cmN1X2hlYWQpOworCW5ld19wdGJsLT5sZW4gPSB0YXJnZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXdfcHRibC0+cGFydFtpXSwgb2xkX3B0YmwtPnBhcnRbaV0pOworCisJZGlza19yZXBsYWNlX3BhcnRfdGJsKGRpc2ssIG5ld19wdGJsKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgZGlza19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CiAKIAlrZnJlZShkaXNrLT5yYW5kb20pOwotCWtmcmVlKGRpc2stPnBhcnQpOwotCWZyZWVfZGlza19zdGF0cyhkaXNrKTsKKwlkaXNrX3JlcGxhY2VfcGFydF90YmwoZGlzaywgTlVMTCk7CisJZnJlZV9wYXJ0X3N0YXRzKCZkaXNrLT5wYXJ0MCk7CiAJa2ZyZWUoZGlzayk7CiB9CiBzdHJ1Y3QgY2xhc3MgYmxvY2tfY2xhc3MgPSB7CkBAIC01NzgsODMgKzk1MCwzMSBAQAogICogVGhlIG91dHB1dCBsb29rcyBzdXNwaWNpb3VzbHkgbGlrZSAvcHJvYy9wYXJ0aXRpb25zIHdpdGggYSBidW5jaCBvZgogICogZXh0cmEgZmllbGRzLgogICovCi0KLXN0YXRpYyB2b2lkICpkaXNrc3RhdHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwYXJ0LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JbG9mZl90IGsgPSAqcG9zOwotCi0JbXV0ZXhfbG9jaygmYmxvY2tfY2xhc3NfbG9jayk7Ci0JZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJmJsb2NrX2NsYXNzLCBOVUxMLCAmaywgZmluZF9zdGFydCk7Ci0JaWYgKGRldikgewotCQlwdXRfZGV2aWNlKGRldik7Ci0JCXJldHVybiBkZXZfdG9fZGlzayhkZXYpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgKmRpc2tzdGF0c19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcGFydCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCitzdGF0aWMgaW50IGRpc2tzdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxZiwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZ3AgPSB2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCSsrKnBvczsKLQlkZXYgPSBjbGFzc19maW5kX2RldmljZSgmYmxvY2tfY2xhc3MsICZncC0+ZGV2LCBOVUxMLCBmaW5kX25leHQpOwotCWlmIChkZXYpIHsKLQkJcHV0X2RldmljZShkZXYpOwotCQlyZXR1cm4gZGV2X3RvX2Rpc2soZGV2KTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2tzdGF0c19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcGFydCwgdm9pZCAqdikKLXsKLQltdXRleF91bmxvY2soJmJsb2NrX2NsYXNzX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGRpc2tzdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgZ2VuZGlzayAqZ3AgPSB2OworCXN0cnVjdCBkaXNrX3BhcnRfaXRlciBwaXRlcjsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpoZDsKIAljaGFyIGJ1ZltCREVWTkFNRV9TSVpFXTsKLQlpbnQgbiA9IDA7CisJaW50IGNwdTsKIAogCS8qCi0JaWYgKCZncC0+ZGV2LmtvYmouZW50cnkgPT0gYmxvY2tfY2xhc3MuZGV2aWNlcy5uZXh0KQotCQlzZXFfcHV0cyhzLAkibWFqb3IgbWlub3IgbmFtZSIKKwlpZiAoJmRpc2tfdG9fZGV2KGdwKS0+a29iai5lbnRyeSA9PSBibG9ja19jbGFzcy5kZXZpY2VzLm5leHQpCisJCXNlcV9wdXRzKHNlcWYsCSJtYWpvciBtaW5vciBuYW1lIgogCQkJCSIgICAgIHJpbyBybWVyZ2UgcnNlY3QgcnVzZSB3aW8gd21lcmdlICIKIAkJCQkid3NlY3Qgd3VzZSBydW5uaW5nIHVzZSBhdmVxIgogCQkJCSJcblxuIik7CiAJKi8KICAKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlkaXNrX3JvdW5kX3N0YXRzKGdwKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCXNlcV9wcmludGYocywgIiU0ZCAlNGQgJXMgJWx1ICVsdSAlbGx1ICV1ICVsdSAlbHUgJWxsdSAldSAldSAldSAldVxuIiwKLQkJZ3AtPm1ham9yLCBuICsgZ3AtPmZpcnN0X21pbm9yLCBkaXNrX25hbWUoZ3AsIG4sIGJ1ZiksCi0JCWRpc2tfc3RhdF9yZWFkKGdwLCBpb3NbMF0pLCBkaXNrX3N0YXRfcmVhZChncCwgbWVyZ2VzWzBdKSwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkaXNrX3N0YXRfcmVhZChncCwgc2VjdG9yc1swXSksCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZ3AsIHRpY2tzWzBdKSksCi0JCWRpc2tfc3RhdF9yZWFkKGdwLCBpb3NbMV0pLCBkaXNrX3N0YXRfcmVhZChncCwgbWVyZ2VzWzFdKSwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkaXNrX3N0YXRfcmVhZChncCwgc2VjdG9yc1sxXSksCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZ3AsIHRpY2tzWzFdKSksCi0JCWdwLT5pbl9mbGlnaHQsCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZ3AsIGlvX3RpY2tzKSksCi0JCWppZmZpZXNfdG9fbXNlY3MoZGlza19zdGF0X3JlYWQoZ3AsIHRpbWVfaW5fcXVldWUpKSk7Ci0KLQkvKiBub3cgc2hvdyBhbGwgbm9uLTAgc2l6ZSBwYXJ0aXRpb25zIG9mIGl0ICovCi0JZm9yIChuID0gMDsgbiA8IGdwLT5taW5vcnMgLSAxOyBuKyspIHsKLQkJc3RydWN0IGhkX3N0cnVjdCAqaGQgPSBncC0+cGFydFtuXTsKLQotCQlpZiAoIWhkIHx8ICFoZC0+bnJfc2VjdHMpCi0JCQljb250aW51ZTsKLQotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJcGFydF9yb3VuZF9zdGF0cyhoZCk7Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JCXNlcV9wcmludGYocywgIiU0ZCAlNGQgJXMgJWx1ICVsdSAlbGx1ICIKKwlkaXNrX3BhcnRfaXRlcl9pbml0KCZwaXRlciwgZ3AsIERJU0tfUElURVJfSU5DTF9QQVJUMCk7CisJd2hpbGUgKChoZCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpIHsKKwkJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwkJcGFydF9yb3VuZF9zdGF0cyhjcHUsIGhkKTsKKwkJcGFydF9zdGF0X3VubG9jaygpOworCQlzZXFfcHJpbnRmKHNlcWYsICIlNGQgJTdkICVzICVsdSAlbHUgJWxsdSAiCiAJCQkgICAiJXUgJWx1ICVsdSAlbGx1ICV1ICV1ICV1ICV1XG4iLAotCQkJICAgZ3AtPm1ham9yLCBuICsgZ3AtPmZpcnN0X21pbm9yICsgMSwKLQkJCSAgIGRpc2tfbmFtZShncCwgbiArIDEsIGJ1ZiksCisJCQkgICBNQUpPUihwYXJ0X2RldnQoaGQpKSwgTUlOT1IocGFydF9kZXZ0KGhkKSksCisJCQkgICBkaXNrX25hbWUoZ3AsIGhkLT5wYXJ0bm8sIGJ1ZiksCiAJCQkgICBwYXJ0X3N0YXRfcmVhZChoZCwgaW9zWzBdKSwKIAkJCSAgIHBhcnRfc3RhdF9yZWFkKGhkLCBtZXJnZXNbMF0pLAogCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwYXJ0X3N0YXRfcmVhZChoZCwgc2VjdG9yc1swXSksCkBAIC02NjgsMTQgKzk4OCwxNSBAQAogCQkJICAgamlmZmllc190b19tc2VjcyhwYXJ0X3N0YXRfcmVhZChoZCwgdGltZV9pbl9xdWV1ZSkpCiAJCQkpOwogCX0KKwlkaXNrX3BhcnRfaXRlcl9leGl0KCZwaXRlcik7CiAgCiAJcmV0dXJuIDA7CiB9CiAKIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkaXNrc3RhdHNfb3AgPSB7Ci0JLnN0YXJ0CT0gZGlza3N0YXRzX3N0YXJ0LAotCS5uZXh0CT0gZGlza3N0YXRzX25leHQsCi0JLnN0b3AJPSBkaXNrc3RhdHNfc3RvcCwKKwkuc3RhcnQJPSBkaXNrX3NlcWZfc3RhcnQsCisJLm5leHQJPSBkaXNrX3NlcWZfbmV4dCwKKwkuc3RvcAk9IGRpc2tfc2VxZl9zdG9wLAogCS5zaG93CT0gZGlza3N0YXRzX3Nob3cKIH07CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KQEAgLTY5MCw3ICsxMDExLDcgQEAKIAkgKiBzZXQgZW52aXJvbWVudCB2YXJzIHRvIGluZGljYXRlIHdoaWNoIGV2ZW50IHRoaXMgaXMgZm9yCiAJICogc28gdGhhdCB1c2VyIHNwYWNlIHdpbGwga25vdyB0byBnbyBjaGVjayB0aGUgbWVkaWEgc3RhdHVzLgogCSAqLwotCWtvYmplY3RfdWV2ZW50X2VudigmZ2QtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CisJa29iamVjdF91ZXZlbnRfZW52KCZkaXNrX3RvX2RldihnZCktPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKIAlwdXRfZGV2aWNlKGdkLT5kcml2ZXJmc19kZXYpOwogfQogCkBAIC03MDMsNDIgKzEwMjQsMjkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGdlbmhkX21lZGlhX2NoYW5nZV9ub3RpZnkpOwogI2VuZGlmICAvKiAgMCAgKi8KIAotc3RydWN0IGZpbmRfYmxvY2sgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IHBhcnQ7Ci19OwotCi1zdGF0aWMgaW50IG1hdGNoX2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK2Rldl90IGJsa19sb29rdXBfZGV2dChjb25zdCBjaGFyICpuYW1lLCBpbnQgcGFydG5vKQogewotCXN0cnVjdCBmaW5kX2Jsb2NrICpmaW5kID0gZGF0YTsKLQotCWlmIChkZXYtPnR5cGUgIT0gJmRpc2tfdHlwZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHN0cmNtcChkZXYtPmJ1c19pZCwgZmluZC0+bmFtZSkgPT0gMCkgewotCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7Ci0JCWlmIChmaW5kLT5wYXJ0IDwgZGlzay0+bWlub3JzKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1kZXZfdCBibGtfbG9va3VwX2RldnQoY29uc3QgY2hhciAqbmFtZSwgaW50IHBhcnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2OwogCWRldl90IGRldnQgPSBNS0RFVigwLCAwKTsKLQlzdHJ1Y3QgZmluZF9ibG9jayBmaW5kOworCXN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCW11dGV4X2xvY2soJmJsb2NrX2NsYXNzX2xvY2spOwotCWZpbmQubmFtZSA9IG5hbWU7Ci0JZmluZC5wYXJ0ID0gcGFydDsKLQlkZXYgPSBjbGFzc19maW5kX2RldmljZSgmYmxvY2tfY2xhc3MsIE5VTEwsICZmaW5kLCBtYXRjaF9pZCk7Ci0JaWYgKGRldikgewotCQlwdXRfZGV2aWNlKGRldik7Ci0JCWRldnQgPSBNS0RFVihNQUpPUihkZXYtPmRldnQpLAotCQkJICAgICBNSU5PUihkZXYtPmRldnQpICsgcGFydCk7CisJY2xhc3NfZGV2X2l0ZXJfaW5pdCgmaXRlciwgJmJsb2NrX2NsYXNzLCBOVUxMLCAmZGlza190eXBlKTsKKwl3aGlsZSAoKGRldiA9IGNsYXNzX2Rldl9pdGVyX25leHQoJml0ZXIpKSkgeworCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisKKwkJaWYgKHN0cmNtcChkZXYtPmJ1c19pZCwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlwYXJ0ID0gZGlza19nZXRfcGFydChkaXNrLCBwYXJ0bm8pOworCQlpZiAocGFydCkgeworCQkJZGV2dCA9IHBhcnRfZGV2dChwYXJ0KTsKKwkJCWRpc2tfcHV0X3BhcnQocGFydCk7CisJCQlicmVhazsKKwkJfQorCQlkaXNrX3B1dF9wYXJ0KHBhcnQpOwogCX0KLQltdXRleF91bmxvY2soJmJsb2NrX2NsYXNzX2xvY2spOwotCisJY2xhc3NfZGV2X2l0ZXJfZXhpdCgmaXRlcik7CiAJcmV0dXJuIGRldnQ7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19sb29rdXBfZGV2dCk7CkBAIC03NDcsNiArMTA1NSw3IEBACiB7CiAJcmV0dXJuIGFsbG9jX2Rpc2tfbm9kZShtaW5vcnMsIC0xKTsKIH0KK0VYUE9SVF9TWU1CT0woYWxsb2NfZGlzayk7CiAKIHN0cnVjdCBnZW5kaXNrICphbGxvY19kaXNrX25vZGUoaW50IG1pbm9ycywgaW50IG5vZGVfaWQpCiB7CkBAIC03NTUsMzIgKzEwNjQsMjggQEAKIAlkaXNrID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZ2VuZGlzayksCiAJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCWlmIChkaXNrKSB7Ci0JCWlmICghaW5pdF9kaXNrX3N0YXRzKGRpc2spKSB7CisJCWlmICghaW5pdF9wYXJ0X3N0YXRzKCZkaXNrLT5wYXJ0MCkpIHsKIAkJCWtmcmVlKGRpc2spOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJaWYgKG1pbm9ycyA+IDEpIHsKLQkJCWludCBzaXplID0gKG1pbm9ycyAtIDEpICogc2l6ZW9mKHN0cnVjdCBoZF9zdHJ1Y3QgKik7Ci0JCQlkaXNrLT5wYXJ0ID0ga21hbGxvY19ub2RlKHNpemUsCi0JCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwotCQkJaWYgKCFkaXNrLT5wYXJ0KSB7Ci0JCQkJZnJlZV9kaXNrX3N0YXRzKGRpc2spOwotCQkJCWtmcmVlKGRpc2spOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQorCQlpZiAoZGlza19leHBhbmRfcGFydF90YmwoZGlzaywgMCkpIHsKKwkJCWZyZWVfcGFydF9zdGF0cygmZGlzay0+cGFydDApOworCQkJa2ZyZWUoZGlzayk7CisJCQlyZXR1cm4gTlVMTDsKIAkJfQorCQlkaXNrLT5wYXJ0X3RibC0+cGFydFswXSA9ICZkaXNrLT5wYXJ0MDsKKwogCQlkaXNrLT5taW5vcnMgPSBtaW5vcnM7CiAJCXJhbmRfaW5pdGlhbGl6ZV9kaXNrKGRpc2spOwotCQlkaXNrLT5kZXYuY2xhc3MgPSAmYmxvY2tfY2xhc3M7Ci0JCWRpc2stPmRldi50eXBlID0gJmRpc2tfdHlwZTsKLQkJZGV2aWNlX2luaXRpYWxpemUoJmRpc2stPmRldik7CisJCWRpc2tfdG9fZGV2KGRpc2spLT5jbGFzcyA9ICZibG9ja19jbGFzczsKKwkJZGlza190b19kZXYoZGlzayktPnR5cGUgPSAmZGlza190eXBlOworCQlkZXZpY2VfaW5pdGlhbGl6ZShkaXNrX3RvX2RldihkaXNrKSk7CiAJCUlOSVRfV09SSygmZGlzay0+YXN5bmNfbm90aWZ5LAogCQkJbWVkaWFfY2hhbmdlX25vdGlmeV90aHJlYWQpOworCQlkaXNrLT5ub2RlX2lkID0gbm9kZV9pZDsKIAl9CiAJcmV0dXJuIGRpc2s7CiB9Ci0KLUVYUE9SVF9TWU1CT0woYWxsb2NfZGlzayk7CiBFWFBPUlRfU1lNQk9MKGFsbG9jX2Rpc2tfbm9kZSk7CiAKIHN0cnVjdCBrb2JqZWN0ICpnZXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKQEAgLTc5Myw3ICsxMDk4LDcgQEAKIAlvd25lciA9IGRpc2stPmZvcHMtPm93bmVyOwogCWlmIChvd25lciAmJiAhdHJ5X21vZHVsZV9nZXQob3duZXIpKQogCQlyZXR1cm4gTlVMTDsKLQlrb2JqID0ga29iamVjdF9nZXQoJmRpc2stPmRldi5rb2JqKTsKKwlrb2JqID0ga29iamVjdF9nZXQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqKTsKIAlpZiAoa29iaiA9PSBOVUxMKSB7CiAJCW1vZHVsZV9wdXQob3duZXIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTgwNywyNyArMTExMiwyOCBAQAogdm9pZCBwdXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIAlpZiAoZGlzaykKLQkJa29iamVjdF9wdXQoJmRpc2stPmRldi5rb2JqKTsKKwkJa29iamVjdF9wdXQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqKTsKIH0KIAogRVhQT1JUX1NZTUJPTChwdXRfZGlzayk7CiAKIHZvaWQgc2V0X2RldmljZV9ybyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgZmxhZykKIHsKLQlpZiAoYmRldi0+YmRfY29udGFpbnMgIT0gYmRldikKLQkJYmRldi0+YmRfcGFydC0+cG9saWN5ID0gZmxhZzsKLQllbHNlCi0JCWJkZXYtPmJkX2Rpc2stPnBvbGljeSA9IGZsYWc7CisJYmRldi0+YmRfcGFydC0+cG9saWN5ID0gZmxhZzsKIH0KIAogRVhQT1JUX1NZTUJPTChzZXRfZGV2aWNlX3JvKTsKIAogdm9pZCBzZXRfZGlza19ybyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IGZsYWcpCiB7Ci0JaW50IGk7Ci0JZGlzay0+cG9saWN5ID0gZmxhZzsKLQlmb3IgKGkgPSAwOyBpIDwgZGlzay0+bWlub3JzIC0gMTsgaSsrKQotCQlpZiAoZGlzay0+cGFydFtpXSkgZGlzay0+cGFydFtpXS0+cG9saWN5ID0gZmxhZzsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKKworCWRpc2tfcGFydF9pdGVyX2luaXQoJnBpdGVyLCBkaXNrLAorCQkJICAgIERJU0tfUElURVJfSU5DTF9FTVBUWSB8IERJU0tfUElURVJfSU5DTF9QQVJUMCk7CisJd2hpbGUgKChwYXJ0ID0gZGlza19wYXJ0X2l0ZXJfbmV4dCgmcGl0ZXIpKSkKKwkJcGFydC0+cG9saWN5ID0gZmxhZzsKKwlkaXNrX3BhcnRfaXRlcl9leGl0KCZwaXRlcik7CiB9CiAKIEVYUE9SVF9TWU1CT0woc2V0X2Rpc2tfcm8pOwpAQCAtODM2LDE4ICsxMTQyLDE1IEBACiB7CiAJaWYgKCFiZGV2KQogCQlyZXR1cm4gMDsKLQllbHNlIGlmIChiZGV2LT5iZF9jb250YWlucyAhPSBiZGV2KQotCQlyZXR1cm4gYmRldi0+YmRfcGFydC0+cG9saWN5OwotCWVsc2UKLQkJcmV0dXJuIGJkZXYtPmJkX2Rpc2stPnBvbGljeTsKKwlyZXR1cm4gYmRldi0+YmRfcGFydC0+cG9saWN5OwogfQogCiBFWFBPUlRfU1lNQk9MKGJkZXZfcmVhZF9vbmx5KTsKIAotaW50IGludmFsaWRhdGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgaW5kZXgpCitpbnQgaW52YWxpZGF0ZV9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pCiB7CiAJaW50IHJlcyA9IDA7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJkZ2V0X2Rpc2soZGlzaywgaW5kZXgpOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiZGdldF9kaXNrKGRpc2ssIHBhcnRubyk7CiAJaWYgKGJkZXYpIHsKIAkJZnN5bmNfYmRldihiZGV2KTsKIAkJcmVzID0gX19pbnZhbGlkYXRlX2RldmljZShiZGV2KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IDc3MTg1ZTUuLjM4YmVlMzIxIDEwMDY0NAotLS0gYS9ibG9jay9pb2N0bC5jCisrKyBiL2Jsb2NrL2lvY3RsLmMKQEAgLTEyLDExICsxMiwxMiBAQAogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXZwOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAJc3RydWN0IGJsa3BnX2lvY3RsX2FyZyBhOwogCXN0cnVjdCBibGtwZ19wYXJ0aXRpb24gcDsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CiAJbG9uZyBsb25nIHN0YXJ0LCBsZW5ndGg7Ci0JaW50IHBhcnQ7Ci0JaW50IGk7CisJaW50IHBhcnRubzsKIAlpbnQgZXJyOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtMjgsOCArMjksOCBAQAogCWRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwYXJ0ID0gcC5wbm87Ci0JaWYgKHBhcnQgPD0gMCB8fCBwYXJ0ID49IGRpc2stPm1pbm9ycykKKwlwYXJ0bm8gPSBwLnBubzsKKwlpZiAocGFydG5vIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCAoYS5vcCkgewogCQljYXNlIEJMS1BHX0FERF9QQVJUSVRJT046CkBAIC00MywzNiArNDQsMzcgQEAKIAkJCQkgICAgfHwgcHN0YXJ0IDwgMCB8fCBwbGVuZ3RoIDwgMCkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQkvKiBwYXJ0aXRpb24gbnVtYmVyIGluIHVzZT8gKi8KLQkJCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKLQkJCWlmIChkaXNrLT5wYXJ0W3BhcnQgLSAxXSkgewotCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwotCQkJCXJldHVybiAtRUJVU1k7Ci0JCQl9Ci0JCQkvKiBvdmVybGFwPyAqLwotCQkJZm9yIChpID0gMDsgaSA8IGRpc2stPm1pbm9ycyAtIDE7IGkrKykgewotCQkJCXN0cnVjdCBoZF9zdHJ1Y3QgKnMgPSBkaXNrLT5wYXJ0W2ldOwogCi0JCQkJaWYgKCFzKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIShzdGFydCtsZW5ndGggPD0gcy0+c3RhcnRfc2VjdCB8fAotCQkJCSAgICAgIHN0YXJ0ID49IHMtPnN0YXJ0X3NlY3QgKyBzLT5ucl9zZWN0cykpIHsKKwkJCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKKworCQkJLyogb3ZlcmxhcD8gKi8KKwkJCWRpc2tfcGFydF9pdGVyX2luaXQoJnBpdGVyLCBkaXNrLAorCQkJCQkgICAgRElTS19QSVRFUl9JTkNMX0VNUFRZKTsKKwkJCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpIHsKKwkJCQlpZiAoIShzdGFydCArIGxlbmd0aCA8PSBwYXJ0LT5zdGFydF9zZWN0IHx8CisJCQkJICAgICAgc3RhcnQgPj0gcGFydC0+c3RhcnRfc2VjdCArIHBhcnQtPm5yX3NlY3RzKSkgeworCQkJCQlkaXNrX3BhcnRfaXRlcl9leGl0KCZwaXRlcik7CiAJCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCQkJCQlyZXR1cm4gLUVCVVNZOwogCQkJCX0KIAkJCX0KKwkJCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKKwogCQkJLyogYWxsIHNlZW1zIE9LICovCi0JCQllcnIgPSBhZGRfcGFydGl0aW9uKGRpc2ssIHBhcnQsIHN0YXJ0LCBsZW5ndGgsIEFERFBBUlRfRkxBR19OT05FKTsKKwkJCWVyciA9IGFkZF9wYXJ0aXRpb24oZGlzaywgcGFydG5vLCBzdGFydCwgbGVuZ3RoLAorCQkJCQkgICAgQUREUEFSVF9GTEFHX05PTkUpOwogCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJCQlyZXR1cm4gZXJyOwogCQljYXNlIEJMS1BHX0RFTF9QQVJUSVRJT046Ci0JCQlpZiAoIWRpc2stPnBhcnRbcGFydC0xXSkKKwkJCXBhcnQgPSBkaXNrX2dldF9wYXJ0KGRpc2ssIHBhcnRubyk7CisJCQlpZiAoIXBhcnQpCiAJCQkJcmV0dXJuIC1FTlhJTzsKLQkJCWlmIChkaXNrLT5wYXJ0W3BhcnQgLSAxXS0+bnJfc2VjdHMgPT0gMCkKLQkJCQlyZXR1cm4gLUVOWElPOwotCQkJYmRldnAgPSBiZGdldF9kaXNrKGRpc2ssIHBhcnQpOworCisJCQliZGV2cCA9IGJkZ2V0KHBhcnRfZGV2dChwYXJ0KSk7CisJCQlkaXNrX3B1dF9wYXJ0KHBhcnQpOwogCQkJaWYgKCFiZGV2cCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKKwogCQkJbXV0ZXhfbG9jaygmYmRldnAtPmJkX211dGV4KTsKIAkJCWlmIChiZGV2cC0+YmRfb3BlbmVycykgewogCQkJCW11dGV4X3VubG9jaygmYmRldnAtPmJkX211dGV4KTsKQEAgLTg0LDcgKzg2LDcgQEAKIAkJCWludmFsaWRhdGVfYmRldihiZGV2cCk7CiAKIAkJCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2LT5iZF9tdXRleCwgMSk7Ci0JCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHBhcnQpOworCQkJZGVsZXRlX3BhcnRpdGlvbihkaXNrLCBwYXJ0bm8pOwogCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJCQltdXRleF91bmxvY2soJmJkZXZwLT5iZF9tdXRleCk7CiAJCQliZHB1dChiZGV2cCk7CkBAIC0xMDAsNyArMTAyLDcgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CiAJaW50IHJlczsKIAotCWlmIChkaXNrLT5taW5vcnMgPT0gMSB8fCBiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQorCWlmICghZGlza19wYXJ0aXRpb25hYmxlKGRpc2spIHx8IGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC0xMTEsNiArMTEzLDY5IEBACiAJcmV0dXJuIHJlczsKIH0KIAorc3RhdGljIHZvaWQgYmxrX2lvY19kaXNjYXJkX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCisJCQlzZXRfYml0KEJJT19FT1BOT1RTVVBQLCAmYmlvLT5iaV9mbGFncyk7CisJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwl9CisJY29tcGxldGUoYmlvLT5iaV9wcml2YXRlKTsKK30KKworc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1aW50NjRfdCBzdGFydCwKKwkJCSAgICAgdWludDY0X3QgbGVuKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3RhcnQgJiA1MTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChsZW4gJiA1MTEpCisJCXJldHVybiAtRUlOVkFMOworCXN0YXJ0ID4+PSA5OworCWxlbiA+Pj0gOTsKKworCWlmIChzdGFydCArIGxlbiA+IChiZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcS0+cHJlcGFyZV9kaXNjYXJkX2ZuKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3aGlsZSAobGVuICYmICFyZXQpIHsKKwkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7CisJCXN0cnVjdCBiaW8gKmJpbzsKKworCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgMCk7CisJCWlmICghYmlvKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYmlvLT5iaV9lbmRfaW8gPSBibGtfaW9jX2Rpc2NhcmRfZW5kaW87CisJCWJpby0+YmlfYmRldiA9IGJkZXY7CisJCWJpby0+YmlfcHJpdmF0ZSA9ICZ3YWl0OworCQliaW8tPmJpX3NlY3RvciA9IHN0YXJ0OworCisJCWlmIChsZW4gPiBxLT5tYXhfaHdfc2VjdG9ycykgeworCQkJYmlvLT5iaV9zaXplID0gcS0+bWF4X2h3X3NlY3RvcnMgPDwgOTsKKwkJCWxlbiAtPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJCXN0YXJ0ICs9IHEtPm1heF9od19zZWN0b3JzOworCQl9IGVsc2UgeworCQkJYmlvLT5iaV9zaXplID0gbGVuIDw8IDk7CisJCQlsZW4gPSAwOworCQl9CisJCXN1Ym1pdF9iaW8oRElTQ0FSRF9OT0JBUlJJRVIsIGJpbyk7CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7CisKKwkJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSkpCisJCQlyZXQgPSAtRUlPOworCQliaW9fcHV0KGJpbyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgcHV0X3VzaG9ydCh1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgc2hvcnQgdmFsKQogewogCXJldHVybiBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKilhcmcpOwpAQCAtMjU4LDYgKzMyMywxOSBAQAogCQlzZXRfZGV2aWNlX3JvKGJkZXYsIG4pOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAwOworCisJY2FzZSBCTEtESVNDQVJEOiB7CisJCXVpbnQ2NF90IHJhbmdlWzJdOworCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUJBREY7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJhbmdlLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihyYW5nZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGJsa19pb2N0bF9kaXNjYXJkKGJkZXYsIHJhbmdlWzBdLCByYW5nZVsxXSk7CisJfQorCiAJY2FzZSBIRElPX0dFVEdFTzogewogCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvOwogCmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggZWM0YjdmMi4uYzM0MjcyYSAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtMTg1LDYgKzE4NSw3IEBACiAJX19zZXRfYml0KEdQQ01EX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwsIGZpbHRlci0+d3JpdGVfb2spOwogCV9fc2V0X2JpdChHUENNRF9MT0FEX1VOTE9BRCwgZmlsdGVyLT53cml0ZV9vayk7CiAJX19zZXRfYml0KEdQQ01EX1NFVF9TVFJFQU1JTkcsIGZpbHRlci0+d3JpdGVfb2spOworCV9fc2V0X2JpdChHUENNRF9TRVRfUkVBRF9BSEVBRCwgZmlsdGVyLT53cml0ZV9vayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfc2V0X2NtZF9maWx0ZXJfZGVmYXVsdHMpOwogCkBAIC0zMTMsMTEgKzMxNCwxMiBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBpb3YsIGhkci0+aW92ZWNfY291bnQsCi0JCQkJCSAgaGRyLT5keGZlcl9sZW4pOworCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBOVUxMLCBpb3YsIGhkci0+aW92ZWNfY291bnQsCisJCQkJCSAgaGRyLT5keGZlcl9sZW4sIEdGUF9LRVJORUwpOwogCQlrZnJlZShpb3YpOwogCX0gZWxzZSBpZiAoaGRyLT5keGZlcl9sZW4pCi0JCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgaGRyLT5keGZlcnAsIGhkci0+ZHhmZXJfbGVuKTsKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBOVUxMLCBoZHItPmR4ZmVycCwgaGRyLT5keGZlcl9sZW4sCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2NyeXB0by9LY29uZmlnIGIvY3J5cHRvL0tjb25maWcKaW5kZXggZDgzMTg1OS4uMzlkYmQ4ZSAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKKysrIGIvY3J5cHRvL0tjb25maWcKQEAgLTIxLDYgKzIxLDE0IEBACiAKIGNvbW1lbnQgIkNyeXB0byBjb3JlIG9yIGhlbHBlciIKIAorY29uZmlnIENSWVBUT19GSVBTCisJYm9vbCAiRklQUyAyMDAgY29tcGxpYW5jZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbnMgZW5hYmxlcyB0aGUgZmlwcyBib290IG9wdGlvbiB3aGljaCBpcworCSAgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gc3lzdGVtIHRvIG9wZXJhdGUgaW4gYSBGSVBTIDIwMAorCSAgY2VydGlmaWNhdGlvbi4gIFlvdSBzaG91bGQgc2F5IG5vIHVubGVzcyB5b3Uga25vdyB3aGF0CisJICB0aGlzIGlzLgorCiBjb25maWcgQ1JZUFRPX0FMR0FQSQogCXRyaXN0YXRlCiAJaGVscApAQCAtMzMsMTQgKzQxLDIxIEBACiBjb25maWcgQ1JZUFRPX0JMS0NJUEhFUgogCXRyaXN0YXRlCiAJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX1JORwogCiBjb25maWcgQ1JZUFRPX0hBU0gKIAl0cmlzdGF0ZQogCXNlbGVjdCBDUllQVE9fQUxHQVBJCiAKK2NvbmZpZyBDUllQVE9fUk5HCisJdHJpc3RhdGUKKwlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCiBjb25maWcgQ1JZUFRPX01BTkFHRVIKIAl0cmlzdGF0ZSAiQ3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gbWFuYWdlciIKLQlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCXNlbGVjdCBDUllQVE9fQUVBRAorCXNlbGVjdCBDUllQVE9fSEFTSAorCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCiAJaGVscAogCSAgQ3JlYXRlIGRlZmF1bHQgY3J5cHRvZ3JhcGhpYyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyBzdWNoIGFzCiAJICBjYmMoYWVzKS4KQEAgLTg1LDkgKzEwMCw3IEBACiBjb25maWcgQ1JZUFRPX1RFU1QKIAl0cmlzdGF0ZSAiVGVzdGluZyBtb2R1bGUiCiAJZGVwZW5kcyBvbiBtCi0Jc2VsZWN0IENSWVBUT19BTEdBUEkKLQlzZWxlY3QgQ1JZUFRPX0FFQUQKLQlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgogCWhlbHAKIAkgIFF1aWNrICYgZGlydHkgY3J5cHRvIHRlc3QgbW9kdWxlLgogCkBAIC0xMTMsNiArMTI2LDcgQEAKIAl0cmlzdGF0ZSAiU2VxdWVuY2UgTnVtYmVyIElWIEdlbmVyYXRvciIKIAlzZWxlY3QgQ1JZUFRPX0FFQUQKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCXNlbGVjdCBDUllQVE9fUk5HCiAJaGVscAogCSAgVGhpcyBJViBnZW5lcmF0b3IgZ2VuZXJhdGVzIGFuIElWIGJhc2VkIG9uIGEgc2VxdWVuY2UgbnVtYmVyIGJ5CiAJICB4b3JpbmcgaXQgd2l0aCBhIHNhbHQuICBUaGlzIGFsZ29yaXRobSBpcyBtYWlubHkgdXNlZnVsIGZvciBDVFIKQEAgLTIxOSw3ICsyMzMsMTkgQEAKIAkgIENhc3RhZ25vbGksIGV0IGFsIEN5Y2xpYyBSZWR1bmRhbmN5LUNoZWNrIEFsZ29yaXRobS4gIFVzZWQKIAkgIGJ5IGlTQ1NJIGZvciBoZWFkZXIgYW5kIGRhdGEgZGlnZXN0cyBhbmQgYnkgb3RoZXJzLgogCSAgU2VlIENhc3RhZ25vbGk5My4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBsaWIvbGliY3JjMzJjLgotICAgICAgICAgIE1vZHVsZSB3aWxsIGJlIGNyYzMyYy4KKwkgIE1vZHVsZSB3aWxsIGJlIGNyYzMyYy4KKworY29uZmlnIENSWVBUT19DUkMzMkNfSU5URUwKKwl0cmlzdGF0ZSAiQ1JDMzJjIElOVEVMIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiIKKwlkZXBlbmRzIG9uIFg4NgorCXNlbGVjdCBDUllQVE9fSEFTSAorCWhlbHAKKwkgIEluIEludGVsIHByb2Nlc3NvciB3aXRoIFNTRTQuMiBzdXBwb3J0ZWQsIHRoZSBwcm9jZXNzb3Igd2lsbAorCSAgc3VwcG9ydCBDUkMzMkMgaW1wbGVtZW50YXRpb24gdXNpbmcgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgQ1JDMzIKKwkgIGluc3RydWN0aW9uLiBUaGlzIG9wdGlvbiB3aWxsIGNyZWF0ZSAnY3JjMzJjLWludGVsJyBtb2R1bGUsCisJICB3aGljaCB3aWxsIGVuYWJsZSBhbnkgcm91dGluZSB0byB1c2UgdGhlIENSQzMyIGluc3RydWN0aW9uIHRvCisJICBnYWluIHBlcmZvcm1hbmNlIGNvbXBhcmVkIHdpdGggc29mdHdhcmUgaW1wbGVtZW50YXRpb24uCisJICBNb2R1bGUgd2lsbCBiZSBjcmMzMmMtaW50ZWwuCiAKIGNvbmZpZyBDUllQVE9fTUQ0CiAJdHJpc3RhdGUgIk1ENCBkaWdlc3QgYWxnb3JpdGhtIgpAQCAtMjQzLDU1ICsyNjksNTggQEAKIAkgIG9mIHRoZSBhbGdvcml0aG0uCiAKIGNvbmZpZyBDUllQVE9fUk1EMTI4Ci0gIHRyaXN0YXRlICJSSVBFTUQtMTI4IGRpZ2VzdCBhbGdvcml0aG0iCi0gIHNlbGVjdCBDUllQVE9fQUxHQVBJCi0gIGhlbHAKLSAgICBSSVBFTUQtMTI4IChJU08vSUVDIDEwMTE4LTM6MjAwNCkuCisJdHJpc3RhdGUgIlJJUEVNRC0xMjggZGlnZXN0IGFsZ29yaXRobSIKKwlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCWhlbHAKKwkgIFJJUEVNRC0xMjggKElTTy9JRUMgMTAxMTgtMzoyMDA0KS4KIAotICAgIFJJUEVNRC0xMjggaXMgYSAxMjgtYml0IGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbi4gSXQgc2hvdWxkIG9ubHkKLSAgICB0byBiZSB1c2VkIGFzIGEgc2VjdXJlIHJlcGxhY2VtZW50IGZvciBSSVBFTUQuIEZvciBvdGhlciB1c2UgY2FzZXMKLSAgICBSSVBFTUQtMTYwIHNob3VsZCBiZSB1c2VkLgorCSAgUklQRU1ELTEyOCBpcyBhIDEyOC1iaXQgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJdCBzaG91bGQgb25seQorCSAgdG8gYmUgdXNlZCBhcyBhIHNlY3VyZSByZXBsYWNlbWVudCBmb3IgUklQRU1ELiBGb3Igb3RoZXIgdXNlIGNhc2VzCisJICBSSVBFTUQtMTYwIHNob3VsZCBiZSB1c2VkLgogCi0gICAgRGV2ZWxvcGVkIGJ5IEhhbnMgRG9iYmVydGluLCBBbnRvb24gQm9zc2VsYWVycyBhbmQgQmFydCBQcmVuZWVsLgotICAgIFNlZSA8aHR0cDovL2hvbWUuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWw+CisJICBEZXZlbG9wZWQgYnkgSGFucyBEb2JiZXJ0aW4sIEFudG9vbiBCb3NzZWxhZXJzIGFuZCBCYXJ0IFByZW5lZWwuCisJICBTZWUgPGh0dHA6Ly9ob21lLmVzYXQua3VsZXV2ZW4uYmUvfmJvc3NlbGFlL3JpcGVtZDE2MC5odG1sPgogCiBjb25maWcgQ1JZUFRPX1JNRDE2MAotICB0cmlzdGF0ZSAiUklQRU1ELTE2MCBkaWdlc3QgYWxnb3JpdGhtIgotICBzZWxlY3QgQ1JZUFRPX0FMR0FQSQotICBoZWxwCi0gICAgUklQRU1ELTE2MCAoSVNPL0lFQyAxMDExOC0zOjIwMDQpLgorCXRyaXN0YXRlICJSSVBFTUQtMTYwIGRpZ2VzdCBhbGdvcml0aG0iCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwloZWxwCisJICBSSVBFTUQtMTYwIChJU08vSUVDIDEwMTE4LTM6MjAwNCkuCiAKLSAgICBSSVBFTUQtMTYwIGlzIGEgMTYwLWJpdCBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24uIEl0IGlzIGludGVuZGVkCi0gICAgdG8gYmUgdXNlZCBhcyBhIHNlY3VyZSByZXBsYWNlbWVudCBmb3IgdGhlIDEyOC1iaXQgaGFzaCBmdW5jdGlvbnMKLSAgICBNRDQsIE1ENSBhbmQgaXQncyBwcmVkZWNlc3NvciBSSVBFTUQgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIFJJUEVNRC0xMjgpLgorCSAgUklQRU1ELTE2MCBpcyBhIDE2MC1iaXQgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJdCBpcyBpbnRlbmRlZAorCSAgdG8gYmUgdXNlZCBhcyBhIHNlY3VyZSByZXBsYWNlbWVudCBmb3IgdGhlIDEyOC1iaXQgaGFzaCBmdW5jdGlvbnMKKwkgIE1ENCwgTUQ1IGFuZCBpdCdzIHByZWRlY2Vzc29yIFJJUEVNRAorCSAgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIFJJUEVNRC0xMjgpLgogCi0gICAgSXQncyBzcGVlZCBpcyBjb21wYXJhYmxlIHRvIFNIQTEgYW5kIHRoZXJlIGFyZSBubyBrbm93biBhdHRhY2tzIGFnYWluc3QKLSAgICBSSVBFTUQtMTYwLgorCSAgSXQncyBzcGVlZCBpcyBjb21wYXJhYmxlIHRvIFNIQTEgYW5kIHRoZXJlIGFyZSBubyBrbm93biBhdHRhY2tzCisJICBhZ2FpbnN0IFJJUEVNRC0xNjAuCiAKLSAgICBEZXZlbG9wZWQgYnkgSGFucyBEb2JiZXJ0aW4sIEFudG9vbiBCb3NzZWxhZXJzIGFuZCBCYXJ0IFByZW5lZWwuCi0gICAgU2VlIDxodHRwOi8vaG9tZS5lc2F0Lmt1bGV1dmVuLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbD4KKwkgIERldmVsb3BlZCBieSBIYW5zIERvYmJlcnRpbiwgQW50b29uIEJvc3NlbGFlcnMgYW5kIEJhcnQgUHJlbmVlbC4KKwkgIFNlZSA8aHR0cDovL2hvbWUuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWw+CiAKIGNvbmZpZyBDUllQVE9fUk1EMjU2Ci0gIHRyaXN0YXRlICJSSVBFTUQtMjU2IGRpZ2VzdCBhbGdvcml0aG0iCi0gIHNlbGVjdCBDUllQVE9fQUxHQVBJCi0gIGhlbHAKLSAgICBSSVBFTUQtMjU2IGlzIGFuIG9wdGlvbmFsIGV4dGVuc2lvbiBvZiBSSVBFTUQtMTI4IHdpdGggYSAyNTYgYml0IGhhc2guCi0gICAgSXQgaXMgaW50ZW5kZWQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgbG9uZ2VyIGhhc2gtcmVzdWx0cywgd2l0aG91dAotICAgIG5lZWRpbmcgYSBsYXJnZXIgc2VjdXJpdHkgbGV2ZWwgKHRoYW4gUklQRU1ELTEyOCkuCisJdHJpc3RhdGUgIlJJUEVNRC0yNTYgZGlnZXN0IGFsZ29yaXRobSIKKwlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCWhlbHAKKwkgIFJJUEVNRC0yNTYgaXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIG9mIFJJUEVNRC0xMjggd2l0aCBhCisJICAyNTYgYml0IGhhc2guIEl0IGlzIGludGVuZGVkIGZvciBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlCisJICBsb25nZXIgaGFzaC1yZXN1bHRzLCB3aXRob3V0IG5lZWRpbmcgYSBsYXJnZXIgc2VjdXJpdHkgbGV2ZWwKKwkgICh0aGFuIFJJUEVNRC0xMjgpLgogCi0gICAgRGV2ZWxvcGVkIGJ5IEhhbnMgRG9iYmVydGluLCBBbnRvb24gQm9zc2VsYWVycyBhbmQgQmFydCBQcmVuZWVsLgotICAgIFNlZSA8aHR0cDovL2hvbWUuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWw+CisJICBEZXZlbG9wZWQgYnkgSGFucyBEb2JiZXJ0aW4sIEFudG9vbiBCb3NzZWxhZXJzIGFuZCBCYXJ0IFByZW5lZWwuCisJICBTZWUgPGh0dHA6Ly9ob21lLmVzYXQua3VsZXV2ZW4uYmUvfmJvc3NlbGFlL3JpcGVtZDE2MC5odG1sPgogCiBjb25maWcgQ1JZUFRPX1JNRDMyMAotICB0cmlzdGF0ZSAiUklQRU1ELTMyMCBkaWdlc3QgYWxnb3JpdGhtIgotICBzZWxlY3QgQ1JZUFRPX0FMR0FQSQotICBoZWxwCi0gICAgUklQRU1ELTMyMCBpcyBhbiBvcHRpb25hbCBleHRlbnNpb24gb2YgUklQRU1ELTE2MCB3aXRoIGEgMzIwIGJpdCBoYXNoLgotICAgIEl0IGlzIGludGVuZGVkIGZvciBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGxvbmdlciBoYXNoLXJlc3VsdHMsIHdpdGhvdXQKLSAgICBuZWVkaW5nIGEgbGFyZ2VyIHNlY3VyaXR5IGxldmVsICh0aGFuIFJJUEVNRC0xNjApLgorCXRyaXN0YXRlICJSSVBFTUQtMzIwIGRpZ2VzdCBhbGdvcml0aG0iCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwloZWxwCisJICBSSVBFTUQtMzIwIGlzIGFuIG9wdGlvbmFsIGV4dGVuc2lvbiBvZiBSSVBFTUQtMTYwIHdpdGggYQorCSAgMzIwIGJpdCBoYXNoLiBJdCBpcyBpbnRlbmRlZCBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZQorCSAgbG9uZ2VyIGhhc2gtcmVzdWx0cywgd2l0aG91dCBuZWVkaW5nIGEgbGFyZ2VyIHNlY3VyaXR5IGxldmVsCisJICAodGhhbiBSSVBFTUQtMTYwKS4KIAotICAgIERldmVsb3BlZCBieSBIYW5zIERvYmJlcnRpbiwgQW50b29uIEJvc3NlbGFlcnMgYW5kIEJhcnQgUHJlbmVlbC4KLSAgICBTZWUgPGh0dHA6Ly9ob21lLmVzYXQua3VsZXV2ZW4uYmUvfmJvc3NlbGFlL3JpcGVtZDE2MC5odG1sPgorCSAgRGV2ZWxvcGVkIGJ5IEhhbnMgRG9iYmVydGluLCBBbnRvb24gQm9zc2VsYWVycyBhbmQgQmFydCBQcmVuZWVsLgorCSAgU2VlIDxodHRwOi8vaG9tZS5lc2F0Lmt1bGV1dmVuLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbD4KIAogY29uZmlnIENSWVBUT19TSEExCiAJdHJpc3RhdGUgIlNIQTEgZGlnZXN0IGFsZ29yaXRobSIKQEAgLTMwOCw4ICszMzcsOCBAQAogCSAgVGhpcyB2ZXJzaW9uIG9mIFNIQSBpbXBsZW1lbnRzIGEgMjU2IGJpdCBoYXNoIHdpdGggMTI4IGJpdHMgb2YKIAkgIHNlY3VyaXR5IGFnYWluc3QgY29sbGlzaW9uIGF0dGFja3MuCiAKLSAgICAgICAgICBUaGlzIGNvZGUgYWxzbyBpbmNsdWRlcyBTSEEtMjI0LCBhIDIyNCBiaXQgaGFzaCB3aXRoIDExMiBiaXRzCi0gICAgICAgICAgb2Ygc2VjdXJpdHkgYWdhaW5zdCBjb2xsaXNpb24gYXR0YWNrcy4KKwkgIFRoaXMgY29kZSBhbHNvIGluY2x1ZGVzIFNIQS0yMjQsIGEgMjI0IGJpdCBoYXNoIHdpdGggMTEyIGJpdHMKKwkgIG9mIHNlY3VyaXR5IGFnYWluc3QgY29sbGlzaW9uIGF0dGFja3MuCiAKIGNvbmZpZyBDUllQVE9fU0hBNTEyCiAJdHJpc3RhdGUgIlNIQTM4NCBhbmQgU0hBNTEyIGRpZ2VzdCBhbGdvcml0aG1zIgpAQCAtNjY2LDYgKzY5NSwxOCBAQAogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIExaTyBhbGdvcml0aG0uCiAKK2NvbW1lbnQgIlJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbiIKKworY29uZmlnIENSWVBUT19BTlNJX0NQUk5HCisJdHJpc3RhdGUgIlBzZXVkbyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24gZm9yIENyeXB0b2dyYXBoaWMgbW9kdWxlcyIKKwlzZWxlY3QgQ1JZUFRPX0FFUworCXNlbGVjdCBDUllQVE9fUk5HCisJc2VsZWN0IENSWVBUT19GSVBTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJpYyBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKwkgIGZvciBjcnlwdG9ncmFwaGljIG1vZHVsZXMuICBVc2VzIHRoZSBBbGdvcml0aG0gc3BlY2lmaWVkIGluCisJICBBTlNJIFg5LjMxIEEuMi40CisKIHNvdXJjZSAiZHJpdmVycy9jcnlwdG8vS2NvbmZpZyIKIAogZW5kaWYJIyBpZiBDUllQVE8KZGlmZiAtLWdpdCBhL2NyeXB0by9NYWtlZmlsZSBiL2NyeXB0by9NYWtlZmlsZQppbmRleCBkNGYzZWQ4Li41ODYyYjgwIDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKKysrIGIvY3J5cHRvL01ha2VmaWxlCkBAIC01LDYgKzUsOCBAQAogb2JqLSQoQ09ORklHX0NSWVBUTykgKz0gY3J5cHRvLm8KIGNyeXB0by1vYmpzIDo9IGFwaS5vIGNpcGhlci5vIGRpZ2VzdC5vIGNvbXByZXNzLm8KIAorb2JqLSQoQ09ORklHX0NSWVBUT19GSVBTKSArPSBmaXBzLm8KKwogY3J5cHRvX2FsZ2FwaS0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KIGNyeXB0b19hbGdhcGktb2JqcyA6PSBhbGdhcGkubyBzY2F0dGVyd2Fsay5vICQoY3J5cHRvX2FsZ2FwaS15KQogb2JqLSQoQ09ORklHX0NSWVBUT19BTEdBUEkpICs9IGNyeXB0b19hbGdhcGkubwpAQCAtMTMsMTUgKzE1LDE3IEBACiAKIGNyeXB0b19ibGtjaXBoZXItb2JqcyA6PSBhYmxrY2lwaGVyLm8KIGNyeXB0b19ibGtjaXBoZXItb2JqcyArPSBibGtjaXBoZXIubwotY3J5cHRvX2Jsa2NpcGhlci1vYmpzICs9IGNoYWluaXYubwotY3J5cHRvX2Jsa2NpcGhlci1vYmpzICs9IGVzZXFpdi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUikgKz0gY3J5cHRvX2Jsa2NpcGhlci5vCitvYmotJChDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUikgKz0gY2hhaW5pdi5vCitvYmotJChDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUikgKz0gZXNlcWl2Lm8KIG9iai0kKENPTkZJR19DUllQVE9fU0VRSVYpICs9IHNlcWl2Lm8KIAogY3J5cHRvX2hhc2gtb2JqcyA6PSBoYXNoLm8KIGNyeXB0b19oYXNoLW9ianMgKz0gYWhhc2gubwogb2JqLSQoQ09ORklHX0NSWVBUT19IQVNIKSArPSBjcnlwdG9faGFzaC5vCiAKK2NyeXB0b21nci1vYmpzIDo9IGFsZ2Jvc3MubyB0ZXN0bWdyLm8KKwogb2JqLSQoQ09ORklHX0NSWVBUT19NQU5BR0VSKSArPSBjcnlwdG9tZ3Iubwogb2JqLSQoQ09ORklHX0NSWVBUT19ITUFDKSArPSBobWFjLm8KIG9iai0kKENPTkZJR19DUllQVE9fWENCQykgKz0geGNiYy5vCkBAIC02OSw3ICs3Myw5IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX0NSQzMyQykgKz0gY3JjMzJjLm8KIG9iai0kKENPTkZJR19DUllQVE9fQVVUSEVOQykgKz0gYXV0aGVuYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0xaTykgKz0gbHpvLm8KLQorb2JqLSQoQ09ORklHX0NSWVBUT19STkcpICs9IHJuZy5vCitvYmotJChDT05GSUdfQ1JZUFRPX1JORykgKz0ga3JuZy5vCitvYmotJChDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcpICs9IGFuc2lfY3Bybmcubwogb2JqLSQoQ09ORklHX0NSWVBUT19URVNUKSArPSB0Y3J5cHQubwogCiAjCmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnYXBpLmMgYi9jcnlwdG8vYWxnYXBpLmMKaW5kZXggZTY1Y2I1MC4uN2M0MWU3NDAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbGdhcGkuYworKysgYi9jcnlwdG8vYWxnYXBpLmMKQEAgLTIxLDE1ICsyMSwxNSBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorc3RhdGljIHZvaWQgY3J5cHRvX3JlbW92ZV9maW5hbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKKwogc3RhdGljIExJU1RfSEVBRChjcnlwdG9fdGVtcGxhdGVfbGlzdCk7CiAKIHZvaWQgY3J5cHRvX2xhcnZhbF9lcnJvcihjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAotCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwotCWFsZyA9IF9fY3J5cHRvX2FsZ19sb29rdXAobmFtZSwgdHlwZSwgbWFzayk7Ci0JdXBfcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCWFsZyA9IGNyeXB0b19hbGdfbG9va3VwKG5hbWUsIHR5cGUsIG1hc2spOwogCiAJaWYgKGFsZykgewogCQlpZiAoY3J5cHRvX2lzX2xhcnZhbChhbGcpKSB7CkBAIC0xMjgsMjMgKzEyOCw5NyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2NyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKLQkJCQkgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqX19jcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKnE7CisJc3RydWN0IGNyeXB0b19sYXJ2YWwgKmxhcnZhbDsKIAlpbnQgcmV0ID0gLUVBR0FJTjsKIAogCWlmIChjcnlwdG9faXNfZGVhZChhbGcpKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKIAlJTklUX0xJU1RfSEVBRCgmYWxnLT5jcmFfdXNlcnMpOwogCisJLyogTm8gY2hlYXRpbmchICovCisJYWxnLT5jcmFfZmxhZ3MgJj0gfkNSWVBUT19BTEdfVEVTVEVEOworCiAJcmV0ID0gLUVFWElTVDsKIAogCWF0b21pY19zZXQoJmFsZy0+Y3JhX3JlZmNudCwgMSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgewogCQlpZiAocSA9PSBhbGcpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyOworCisJCWlmIChjcnlwdG9faXNfbGFydmFsKHEpKSB7CisJCQlpZiAoIXN0cmNtcChhbGctPmNyYV9kcml2ZXJfbmFtZSwgcS0+Y3JhX2RyaXZlcl9uYW1lKSkKKwkJCQlnb3RvIGVycjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAocS0+Y3JhX2RyaXZlcl9uYW1lLCBhbGctPmNyYV9uYW1lKSB8fAorCQkgICAgIXN0cmNtcChxLT5jcmFfbmFtZSwgYWxnLT5jcmFfZHJpdmVyX25hbWUpKQorCQkJZ290byBlcnI7CisJfQorCisJbGFydmFsID0gY3J5cHRvX2xhcnZhbF9hbGxvYyhhbGctPmNyYV9uYW1lLAorCQkJCSAgICAgYWxnLT5jcmFfZmxhZ3MgfCBDUllQVE9fQUxHX1RFU1RFRCwgMCk7CisJaWYgKElTX0VSUihsYXJ2YWwpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9FTlQ7CisJbGFydmFsLT5hZHVsdCA9IGNyeXB0b19tb2RfZ2V0KGFsZyk7CisJaWYgKCFsYXJ2YWwtPmFkdWx0KQorCQlnb3RvIGZyZWVfbGFydmFsOworCisJYXRvbWljX3NldCgmbGFydmFsLT5hbGcuY3JhX3JlZmNudCwgMSk7CisJbWVtY3B5KGxhcnZhbC0+YWxnLmNyYV9kcml2ZXJfbmFtZSwgYWxnLT5jcmFfZHJpdmVyX25hbWUsCisJICAgICAgIENSWVBUT19NQVhfQUxHX05BTUUpOworCWxhcnZhbC0+YWxnLmNyYV9wcmlvcml0eSA9IGFsZy0+Y3JhX3ByaW9yaXR5OworCisJbGlzdF9hZGQoJmFsZy0+Y3JhX2xpc3QsICZjcnlwdG9fYWxnX2xpc3QpOworCWxpc3RfYWRkKCZsYXJ2YWwtPmFsZy5jcmFfbGlzdCwgJmNyeXB0b19hbGdfbGlzdCk7CisKK291dDoJCisJcmV0dXJuIGxhcnZhbDsKKworZnJlZV9sYXJ2YWw6CisJa2ZyZWUobGFydmFsKTsKK2VycjoKKwlsYXJ2YWwgPSBFUlJfUFRSKHJldCk7CisJZ290byBvdXQ7Cit9CisKK3ZvaWQgY3J5cHRvX2FsZ190ZXN0ZWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqdGVzdDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXN0cnVjdCBjcnlwdG9fYWxnICpxOworCUxJU1RfSEVBRChsaXN0KTsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWlmICghY3J5cHRvX2lzX2xhcnZhbChxKSkKKwkJCWNvbnRpbnVlOworCisJCXRlc3QgPSAoc3RydWN0IGNyeXB0b19sYXJ2YWwgKilxOworCisJCWlmICghc3RyY21wKHEtPmNyYV9kcml2ZXJfbmFtZSwgbmFtZSkpCisJCQlnb3RvIGZvdW5kOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiYWxnOiBVbmV4cGVjdGVkIHRlc3QgcmVzdWx0IGZvciAlczogJWRcbiIsIG5hbWUsIGVycik7CisJZ290byB1bmxvY2s7CisKK2ZvdW5kOgorCWFsZyA9IHRlc3QtPmFkdWx0OworCWlmIChlcnIgfHwgbGlzdF9lbXB0eSgmYWxnLT5jcmFfbGlzdCkpCisJCWdvdG8gY29tcGxldGU7CisKKwlhbGctPmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX1RFU1RFRDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKHEgPT0gYWxnKQorCQkJY29udGludWU7CiAKIAkJaWYgKGNyeXB0b19pc19tb3JpYnVuZChxKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTgwLDE3ICsyNTQsMTggQEAKIAkJICAgIHEtPmNyYV9wcmlvcml0eSA+IGFsZy0+Y3JhX3ByaW9yaXR5KQogCQkJY29udGludWU7CiAKLQkJY3J5cHRvX3JlbW92ZV9zcGF3bnMoJnEtPmNyYV91c2VycywgbGlzdCwgYWxnLT5jcmFfZmxhZ3MpOworCQljcnlwdG9fcmVtb3ZlX3NwYXducygmcS0+Y3JhX3VzZXJzLCAmbGlzdCwgYWxnLT5jcmFfZmxhZ3MpOwogCX0KLQkKLQlsaXN0X2FkZCgmYWxnLT5jcmFfbGlzdCwgJmNyeXB0b19hbGdfbGlzdCk7CiAKLQljcnlwdG9fbm90aWZ5KENSWVBUT19NU0dfQUxHX1JFR0lTVEVSLCBhbGcpOwotCXJldCA9IDA7Citjb21wbGV0ZToKKwljb21wbGV0ZV9hbGwoJnRlc3QtPmNvbXBsZXRpb24pOwogCi1vdXQ6CQotCXJldHVybiByZXQ7Cit1bmxvY2s6CisJdXBfd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKworCWNyeXB0b19yZW1vdmVfZmluYWwoJmxpc3QpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsZ190ZXN0ZWQpOwogCiBzdGF0aWMgdm9pZCBjcnlwdG9fcmVtb3ZlX2ZpbmFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CkBAIC0yMDMsOSArMjc4LDI3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBjcnlwdG9fd2FpdF9mb3JfdGVzdChzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqbGFydmFsKQoreworCWludCBlcnI7CisKKwllcnIgPSBjcnlwdG9fcHJvYmluZ19ub3RpZnkoQ1JZUFRPX01TR19BTEdfUkVHSVNURVIsIGxhcnZhbC0+YWR1bHQpOworCWlmIChlcnIgIT0gTk9USUZZX1NUT1ApIHsKKwkJaWYgKFdBUk5fT04oZXJyICE9IE5PVElGWV9ET05FKSkKKwkJCWdvdG8gb3V0OworCQljcnlwdG9fYWxnX3Rlc3RlZChsYXJ2YWwtPmFsZy5jcmFfZHJpdmVyX25hbWUsIDApOworCX0KKworCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmbGFydmFsLT5jb21wbGV0aW9uKTsKKwlXQVJOX09OKGVycik7CisKK291dDoKKwljcnlwdG9fbGFydmFsX2tpbGwoJmxhcnZhbC0+YWxnKTsKK30KKwogaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIHsKLQlMSVNUX0hFQUQobGlzdCk7CisJc3RydWN0IGNyeXB0b19sYXJ2YWwgKmxhcnZhbDsKIAlpbnQgZXJyOwogCiAJZXJyID0gY3J5cHRvX2NoZWNrX2FsZyhhbGcpOwpAQCAtMjEzLDExICszMDYsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKLQllcnIgPSBfX2NyeXB0b19yZWdpc3Rlcl9hbGcoYWxnLCAmbGlzdCk7CisJbGFydmFsID0gX19jcnlwdG9fcmVnaXN0ZXJfYWxnKGFsZyk7CiAJdXBfd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAotCWNyeXB0b19yZW1vdmVfZmluYWwoJmxpc3QpOwotCXJldHVybiBlcnI7CisJaWYgKElTX0VSUihsYXJ2YWwpKQorCQlyZXR1cm4gUFRSX0VSUihsYXJ2YWwpOworCisJY3J5cHRvX3dhaXRfZm9yX3Rlc3QobGFydmFsKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19yZWdpc3Rlcl9hbGcpOwogCkBAIC0zMzUsOCArNDMxLDggQEAKIGludCBjcnlwdG9fcmVnaXN0ZXJfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCwKIAkJCSAgICAgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCkKIHsKLQlMSVNUX0hFQUQobGlzdCk7Ci0JaW50IGVyciA9IC1FSU5WQUw7CisJc3RydWN0IGNyeXB0b19sYXJ2YWwgKmxhcnZhbDsKKwlpbnQgZXJyOwogCiAJZXJyID0gY3J5cHRvX2NoZWNrX2FsZygmaW5zdC0+YWxnKTsKIAlpZiAoZXJyKQpAQCAtMzQ2LDggKzQ0Miw4IEBACiAKIAlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CiAKLQllcnIgPSBfX2NyeXB0b19yZWdpc3Rlcl9hbGcoJmluc3QtPmFsZywgJmxpc3QpOwotCWlmIChlcnIpCisJbGFydmFsID0gX19jcnlwdG9fcmVnaXN0ZXJfYWxnKCZpbnN0LT5hbGcpOworCWlmIChJU19FUlIobGFydmFsKSkKIAkJZ290byB1bmxvY2s7CiAKIAlobGlzdF9hZGRfaGVhZCgmaW5zdC0+bGlzdCwgJnRtcGwtPmluc3RhbmNlcyk7CkBAIC0zNTYsNyArNDUyLDEyIEBACiB1bmxvY2s6CiAJdXBfd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAotCWNyeXB0b19yZW1vdmVfZmluYWwoJmxpc3QpOworCWVyciA9IFBUUl9FUlIobGFydmFsKTsKKwlpZiAoSVNfRVJSKGxhcnZhbCkpCisJCWdvdG8gZXJyOworCisJY3J5cHRvX3dhaXRfZm9yX3Rlc3QobGFydmFsKTsKKwllcnIgPSAwOwogCiBlcnI6CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2NyeXB0by9hbGdib3NzLmMgYi9jcnlwdG8vYWxnYm9zcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDFlNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FsZ2Jvc3MuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENyZWF0ZSBkZWZhdWx0IGNyeXB0byBhbGdvcml0aG0gaW5zdGFuY2VzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdHJ1Y3QgY3J5cHRvbWdyX3BhcmFtIHsKKwlzdHJ1Y3QgcnRhdHRyICp0YltDUllQVE9fTUFYX0FUVFJTICsgMl07CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7CisJCXN0cnVjdCBjcnlwdG9fYXR0cl90eXBlIGRhdGE7CisJfSB0eXBlOworCisJdW5pb24geworCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7CisJCQlzdHJ1Y3QgY3J5cHRvX2F0dHJfYWxnIGRhdGE7CisJCX0gYWxnOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ0YXR0ciBhdHRyOworCQkJc3RydWN0IGNyeXB0b19hdHRyX3UzMiBkYXRhOworCQl9IG51MzI7CisJfSBhdHRyc1tDUllQVE9fTUFYX0FUVFJTXTsKKworCWNoYXIgbGFydmFsW0NSWVBUT19NQVhfQUxHX05BTUVdOworCWNoYXIgdGVtcGxhdGVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisKKwl1MzIgb3R5cGU7CisJdTMyIG9tYXNrOworfTsKKworc3RydWN0IGNyeXB0b190ZXN0X3BhcmFtIHsKKwljaGFyIGRyaXZlcltDUllQVE9fTUFYX0FMR19OQU1FXTsKKwljaGFyIGFsZ1tDUllQVE9fTUFYX0FMR19OQU1FXTsKKwl1MzIgdHlwZTsKK307CisKK3N0YXRpYyBpbnQgY3J5cHRvbWdyX3Byb2JlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNyeXB0b21ncl9wYXJhbSAqcGFyYW0gPSBkYXRhOworCXN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGw7CisJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKKwlpbnQgZXJyOworCisJdG1wbCA9IGNyeXB0b19sb29rdXBfdGVtcGxhdGUocGFyYW0tPnRlbXBsYXRlKTsKKwlpZiAoIXRtcGwpCisJCWdvdG8gZXJyOworCisJZG8geworCQlpbnN0ID0gdG1wbC0+YWxsb2MocGFyYW0tPnRiKTsKKwkJaWYgKElTX0VSUihpbnN0KSkKKwkJCWVyciA9IFBUUl9FUlIoaW5zdCk7CisJCWVsc2UgaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfaW5zdGFuY2UodG1wbCwgaW5zdCkpKQorCQkJdG1wbC0+ZnJlZShpbnN0KTsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTiAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOworCisJY3J5cHRvX3RtcGxfcHV0KHRtcGwpOworCisJaWYgKGVycikKKwkJZ290byBlcnI7CisKK291dDoKKwlrZnJlZShwYXJhbSk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKKworZXJyOgorCWNyeXB0b19sYXJ2YWxfZXJyb3IocGFyYW0tPmxhcnZhbCwgcGFyYW0tPm90eXBlLCBwYXJhbS0+b21hc2spOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGNyeXB0b21ncl9zY2hlZHVsZV9wcm9iZShzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqbGFydmFsKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCBjcnlwdG9tZ3JfcGFyYW0gKnBhcmFtOworCWNvbnN0IGNoYXIgKm5hbWUgPSBsYXJ2YWwtPmFsZy5jcmFfbmFtZTsKKwljb25zdCBjaGFyICpwOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGk7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJZ290byBlcnI7CisKKwlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9LRVJORUwpOworCWlmICghcGFyYW0pCisJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisKKwlmb3IgKHAgPSBuYW1lOyBpc2FsbnVtKCpwKSB8fCAqcCA9PSAnLScgfHwgKnAgPT0gJ18nOyBwKyspCisJCTsKKworCWxlbiA9IHAgLSBuYW1lOworCWlmICghbGVuIHx8ICpwICE9ICcoJykKKwkJZ290byBlcnJfZnJlZV9wYXJhbTsKKworCW1lbWNweShwYXJhbS0+dGVtcGxhdGUsIG5hbWUsIGxlbik7CisKKwlpID0gMDsKKwlmb3IgKDs7KSB7CisJCWludCBub3RudW0gPSAwOworCisJCW5hbWUgPSArK3A7CisJCWxlbiA9IDA7CisKKwkJZm9yICg7IGlzYWxudW0oKnApIHx8ICpwID09ICctJyB8fCAqcCA9PSAnXyc7IHArKykKKwkJCW5vdG51bSB8PSAhaXNkaWdpdCgqcCk7CisKKwkJaWYgKCpwID09ICcoJykgeworCQkJaW50IHJlY3Vyc2lvbiA9IDA7CisKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoISorK3ApCisJCQkJCWdvdG8gZXJyX2ZyZWVfcGFyYW07CisJCQkJaWYgKCpwID09ICcoJykKKwkJCQkJcmVjdXJzaW9uKys7CisJCQkJZWxzZSBpZiAoKnAgPT0gJyknICYmICFyZWN1cnNpb24tLSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5vdG51bSA9IDE7CisJCQlwKys7CisJCX0KKworCQlsZW4gPSBwIC0gbmFtZTsKKwkJaWYgKCFsZW4pCisJCQlnb3RvIGVycl9mcmVlX3BhcmFtOworCisJCWlmIChub3RudW0pIHsKKwkJCXBhcmFtLT5hdHRyc1tpXS5hbGcuYXR0ci5ydGFfbGVuID0KKwkJCQlzaXplb2YocGFyYW0tPmF0dHJzW2ldLmFsZyk7CisJCQlwYXJhbS0+YXR0cnNbaV0uYWxnLmF0dHIucnRhX3R5cGUgPSBDUllQVE9BX0FMRzsKKwkJCW1lbWNweShwYXJhbS0+YXR0cnNbaV0uYWxnLmRhdGEubmFtZSwgbmFtZSwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmF0dHIucnRhX2xlbiA9CisJCQkJc2l6ZW9mKHBhcmFtLT5hdHRyc1tpXS5udTMyKTsKKwkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmF0dHIucnRhX3R5cGUgPSBDUllQVE9BX1UzMjsKKwkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmRhdGEubnVtID0KKwkJCQlzaW1wbGVfc3RydG9sKG5hbWUsIE5VTEwsIDApOworCQl9CisKKwkJcGFyYW0tPnRiW2kgKyAxXSA9ICZwYXJhbS0+YXR0cnNbaV0uYXR0cjsKKwkJaSsrOworCisJCWlmIChpID49IENSWVBUT19NQVhfQVRUUlMpCisJCQlnb3RvIGVycl9mcmVlX3BhcmFtOworCisJCWlmICgqcCA9PSAnKScpCisJCQlicmVhazsKKworCQlpZiAoKnAgIT0gJywnKQorCQkJZ290byBlcnJfZnJlZV9wYXJhbTsKKwl9CisKKwlpZiAoIWkpCisJCWdvdG8gZXJyX2ZyZWVfcGFyYW07CisKKwlwYXJhbS0+dGJbaSArIDFdID0gTlVMTDsKKworCXBhcmFtLT50eXBlLmF0dHIucnRhX2xlbiA9IHNpemVvZihwYXJhbS0+dHlwZSk7CisJcGFyYW0tPnR5cGUuYXR0ci5ydGFfdHlwZSA9IENSWVBUT0FfVFlQRTsKKwlwYXJhbS0+dHlwZS5kYXRhLnR5cGUgPSBsYXJ2YWwtPmFsZy5jcmFfZmxhZ3MgJiB+Q1JZUFRPX0FMR19URVNURUQ7CisJcGFyYW0tPnR5cGUuZGF0YS5tYXNrID0gbGFydmFsLT5tYXNrICYgfkNSWVBUT19BTEdfVEVTVEVEOworCXBhcmFtLT50YlswXSA9ICZwYXJhbS0+dHlwZS5hdHRyOworCisJcGFyYW0tPm90eXBlID0gbGFydmFsLT5hbGcuY3JhX2ZsYWdzOworCXBhcmFtLT5vbWFzayA9IGxhcnZhbC0+bWFzazsKKworCW1lbWNweShwYXJhbS0+bGFydmFsLCBsYXJ2YWwtPmFsZy5jcmFfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSk7CisKKwl0aHJlYWQgPSBrdGhyZWFkX3J1bihjcnlwdG9tZ3JfcHJvYmUsIHBhcmFtLCAiY3J5cHRvbWdyX3Byb2JlIik7CisJaWYgKElTX0VSUih0aHJlYWQpKQorCQlnb3RvIGVycl9mcmVlX3BhcmFtOworCisJcmV0dXJuIE5PVElGWV9TVE9QOworCitlcnJfZnJlZV9wYXJhbToKKwlrZnJlZShwYXJhbSk7CitlcnJfcHV0X21vZHVsZToKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK2VycjoKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IGNyeXB0b21ncl90ZXN0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNyeXB0b190ZXN0X3BhcmFtICpwYXJhbSA9IGRhdGE7CisJdTMyIHR5cGUgPSBwYXJhbS0+dHlwZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKCh0eXBlIF4gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUikgJgorCSAgICAgIENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVJfTUFTSykgJiYgISh0eXBlICYgQ1JZUFRPX0FMR19HRU5JVikpCisJCWdvdG8gc2tpcHRlc3Q7CisKKwllcnIgPSBhbGdfdGVzdChwYXJhbS0+ZHJpdmVyLCBwYXJhbS0+YWxnLCB0eXBlLCBDUllQVE9fQUxHX1RFU1RFRCk7CisKK3NraXB0ZXN0OgorCWNyeXB0b19hbGdfdGVzdGVkKHBhcmFtLT5kcml2ZXIsIGVycik7CisKKwlrZnJlZShwYXJhbSk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KKworc3RhdGljIGludCBjcnlwdG9tZ3Jfc2NoZWR1bGVfdGVzdChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOworCXN0cnVjdCBjcnlwdG9fdGVzdF9wYXJhbSAqcGFyYW07CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJZ290byBlcnI7CisKKwlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9LRVJORUwpOworCWlmICghcGFyYW0pCisJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisKKwltZW1jcHkocGFyYW0tPmRyaXZlciwgYWxnLT5jcmFfZHJpdmVyX25hbWUsIHNpemVvZihwYXJhbS0+ZHJpdmVyKSk7CisJbWVtY3B5KHBhcmFtLT5hbGcsIGFsZy0+Y3JhX25hbWUsIHNpemVvZihwYXJhbS0+YWxnKSk7CisJcGFyYW0tPnR5cGUgPSBhbGctPmNyYV9mbGFnczsKKworCXRocmVhZCA9IGt0aHJlYWRfcnVuKGNyeXB0b21ncl90ZXN0LCBwYXJhbSwgImNyeXB0b21ncl90ZXN0Iik7CisJaWYgKElTX0VSUih0aHJlYWQpKQorCQlnb3RvIGVycl9mcmVlX3BhcmFtOworCisJcmV0dXJuIE5PVElGWV9TVE9QOworCitlcnJfZnJlZV9wYXJhbToKKwlrZnJlZShwYXJhbSk7CitlcnJfcHV0X21vZHVsZToKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK2VycjoKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IGNyeXB0b21ncl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIG1zZywKKwkJCSAgICB2b2lkICpkYXRhKQoreworCXN3aXRjaCAobXNnKSB7CisJY2FzZSBDUllQVE9fTVNHX0FMR19SRVFVRVNUOgorCQlyZXR1cm4gY3J5cHRvbWdyX3NjaGVkdWxlX3Byb2JlKGRhdGEpOworCWNhc2UgQ1JZUFRPX01TR19BTEdfUkVHSVNURVI6CisJCXJldHVybiBjcnlwdG9tZ3Jfc2NoZWR1bGVfdGVzdChkYXRhKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3J5cHRvbWdyX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gY3J5cHRvbWdyX25vdGlmeSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNyeXB0b21ncl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHRlc3RtZ3JfaW5pdCgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfbm90aWZpZXIoJmNyeXB0b21ncl9ub3RpZmllcik7CisJaWYgKGVycikKKwkJZ290byBmcmVlX3Rlc3RtZ3I7CisKKwlyZXR1cm4gMDsKKworZnJlZV90ZXN0bWdyOgorCXRlc3RtZ3JfZXhpdCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcnlwdG9tZ3JfZXhpdCh2b2lkKQoreworCWludCBlcnIgPSBjcnlwdG9fdW5yZWdpc3Rlcl9ub3RpZmllcigmY3J5cHRvbWdyX25vdGlmaWVyKTsKKwlCVUdfT04oZXJyKTsKKworCXRlc3RtZ3JfZXhpdCgpOworfQorCitzdWJzeXNfaW5pdGNhbGwoY3J5cHRvbWdyX2luaXQpOworbW9kdWxlX2V4aXQoY3J5cHRvbWdyX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNyeXB0byBBbGdvcml0aG0gTWFuYWdlciIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Fuc2lfY3BybmcuYyBiL2NyeXB0by9hbnNpX2Nwcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkYjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9hbnNpX2Nwcm5nLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBQUk5HOiBQc2V1ZG8gUmFuZG9tIE51bWJlciBHZW5lcmF0b3IKKyAqICAgICAgIEJhc2VkIG9uIE5JU1QgUmVjb21tZW5kZWQgUFJORyBGcm9tIEFOU0kgWDkuMzEgQXBwZW5kaXggQS4yLjQgdXNpbmcKKyAqICAgICAgIEFFUyAxMjggY2lwaGVyCisgKgorICogIChDKSBOZWlsIEhvcm1hbiA8bmhvcm1hbkB0dXhkcml2ZXIuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvcm5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIERFRkFVTFRfUFJOR19LRVkgIjAxMjM0NTY3ODlhYmNkZWYiCisjZGVmaW5lIERFRkFVTFRfUFJOR19LU1ogMTYKKyNkZWZpbmUgREVGQVVMVF9CTEtfU1ogMTYKKyNkZWZpbmUgREVGQVVMVF9WX1NFRUQgInpheWJ4Y3dkdmV1ZnRnc2giCisKKy8qCisgKiBGbGFncyBmb3IgdGhlIHBybmdfY29udGV4dCBmbGFncyBmaWVsZAorICovCisKKyNkZWZpbmUgUFJOR19GSVhFRF9TSVpFIDB4MQorI2RlZmluZSBQUk5HX05FRURfUkVTRVQgMHgyCisKKy8qCisgKiBOb3RlOiBEVCBpcyBvdXIgY291bnRlciB2YWx1ZQorICoJIEkgaXMgb3VyIGludGVybWVkaWF0ZSB2YWx1ZQorICoJIFYgaXMgb3VyIHNlZWQgdmVjdG9yCisgKiBTZWUgaHR0cDovL2NzcmMubmlzdC5nb3YvZ3JvdXBzL1NUTS9jYXZwL2RvY3VtZW50cy9ybmcvOTMxcm5nZXh0LnBkZgorICogZm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAqLworCisKK3N0cnVjdCBwcm5nX2NvbnRleHQgeworCXNwaW5sb2NrX3QgcHJuZ19sb2NrOworCXVuc2lnbmVkIGNoYXIgcmFuZF9kYXRhW0RFRkFVTFRfQkxLX1NaXTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfcmFuZF9kYXRhW0RFRkFVTFRfQkxLX1NaXTsKKwl1bnNpZ25lZCBjaGFyIERUW0RFRkFVTFRfQkxLX1NaXTsKKwl1bnNpZ25lZCBjaGFyIElbREVGQVVMVF9CTEtfU1pdOworCXVuc2lnbmVkIGNoYXIgVltERUZBVUxUX0JMS19TWl07CisJdTMyIHJhbmRfZGF0YV92YWxpZDsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtOworCXUzMiBmbGFnczsKK307CisKK3N0YXRpYyBpbnQgZGJnOworCitzdGF0aWMgdm9pZCBoZXhkdW1wKGNoYXIgKm5vdGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpZiAoZGJnKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIiVzIiwgbm90ZSk7CisJCXByaW50X2hleF9kdW1wKEtFUk5fQ09OVCwgIiIsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCQkxNiwgMSwKKwkJCQlidWYsIGxlbiwgZmFsc2UpOworCX0KK30KKworI2RlZmluZSBkYmdwcmludChmb3JtYXQsIGFyZ3MuLi4pIGRvIHtcCitpZiAoZGJnKVwKKwlwcmludGsoZm9ybWF0LCAjI2FyZ3MpO1wKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHhvcl92ZWN0b3JzKHVuc2lnbmVkIGNoYXIgKmluMSwgdW5zaWduZWQgY2hhciAqaW4yLAorCQkJdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCW91dFtpXSA9IGluMVtpXSBeIGluMltpXTsKKworfQorLyoKKyAqIFJldHVybnMgREVGQVVMVF9CTEtfU1ogYnl0ZXMgb2YgcmFuZG9tIGRhdGEgcGVyIGNhbGwKKyAqIHJldHVybnMgMCBpZiBnZW5lcmF0aW9uIHN1Y2NlZGVkLCA8MCBpZiBzb21ldGhpbmcgd2VudCB3cm9uZworICovCitzdGF0aWMgaW50IF9nZXRfbW9yZV9wcm5nX2J5dGVzKHN0cnVjdCBwcm5nX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHRtcFtERUZBVUxUX0JMS19TWl07CisJdW5zaWduZWQgY2hhciAqb3V0cHV0ID0gTlVMTDsKKworCisJZGJncHJpbnQoS0VSTl9DUklUICJDYWxsaW5nIF9nZXRfbW9yZV9wcm5nX2J5dGVzIGZvciBjb250ZXh0ICVwXG4iLAorCQljdHgpOworCisJaGV4ZHVtcCgiSW5wdXQgRFQ6ICIsIGN0eC0+RFQsIERFRkFVTFRfQkxLX1NaKTsKKwloZXhkdW1wKCJJbnB1dCBJOiAiLCBjdHgtPkksIERFRkFVTFRfQkxLX1NaKTsKKwloZXhkdW1wKCJJbnB1dCBWOiAiLCBjdHgtPlYsIERFRkFVTFRfQkxLX1NaKTsKKworCS8qCisJICogVGhpcyBhbGdvcml0aG0gaXMgYSAzIHN0YWdlIHN0YXRlIG1hY2hpbmUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCS8qCisJCQkgKiBTdGFydCBieSBlbmNyeXB0aW5nIHRoZSBjb3VudGVyIHZhbHVlCisJCQkgKiBUaGlzIGdpdmVzIHVzIGFuIGludGVybWVkaWF0ZSB2YWx1ZSBJCisJCQkgKi8KKwkJCW1lbWNweSh0bXAsIGN0eC0+RFQsIERFRkFVTFRfQkxLX1NaKTsKKwkJCW91dHB1dCA9IGN0eC0+STsKKwkJCWhleGR1bXAoInRtcCBzdGFnZSAwOiAiLCB0bXAsIERFRkFVTFRfQkxLX1NaKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisKKwkJCS8qCisJCQkgKiBOZXh0IHhvciBJIHdpdGggb3VyIHNlY3JldCB2ZWN0b3IgVgorCQkJICogZW5jcnlwdCB0aGF0IHJlc3VsdCB0byBvYnRhaW4gb3VyCisJCQkgKiBwc2V1ZG8gcmFuZG9tIGRhdGEgd2hpY2ggd2Ugb3V0cHV0CisJCQkgKi8KKwkJCXhvcl92ZWN0b3JzKGN0eC0+SSwgY3R4LT5WLCB0bXAsIERFRkFVTFRfQkxLX1NaKTsKKwkJCWhleGR1bXAoInRtcCBzdGFnZSAxOiAiLCB0bXAsIERFRkFVTFRfQkxLX1NaKTsKKwkJCW91dHB1dCA9IGN0eC0+cmFuZF9kYXRhOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qCisJCQkgKiBGaXJzdCBjaGVjayB0aGF0IHdlIGRpZG4ndCBwcm9kdWNlIHRoZSBzYW1lCisJCQkgKiByYW5kb20gZGF0YSB0aGF0IHdlIGRpZCBsYXN0IHRpbWUgYXJvdW5kIHRocm91Z2ggdGhpcworCQkJICovCisJCQlpZiAoIW1lbWNtcChjdHgtPnJhbmRfZGF0YSwgY3R4LT5sYXN0X3JhbmRfZGF0YSwKKwkJCQkJREVGQVVMVF9CTEtfU1opKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjdHggJXAgRmFpbGVkIHJlcGV0aXRpb24gY2hlY2shXG4iLAorCQkJCQljdHgpOworCQkJCWN0eC0+ZmxhZ3MgfD0gUFJOR19ORUVEX1JFU0VUOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbWVtY3B5KGN0eC0+bGFzdF9yYW5kX2RhdGEsIGN0eC0+cmFuZF9kYXRhLAorCQkJCURFRkFVTFRfQkxLX1NaKTsKKworCQkJLyoKKwkJCSAqIExhc3RseSB4b3IgdGhlIHJhbmRvbSBkYXRhIHdpdGggSQorCQkJICogYW5kIGVuY3J5cHQgdGhhdCB0byBvYnRhaW4gYSBuZXcgc2VjcmV0IHZlY3RvciBWCisJCQkgKi8KKwkJCXhvcl92ZWN0b3JzKGN0eC0+cmFuZF9kYXRhLCBjdHgtPkksIHRtcCwKKwkJCQlERUZBVUxUX0JMS19TWik7CisJCQlvdXRwdXQgPSBjdHgtPlY7CisJCQloZXhkdW1wKCJ0bXAgc3RhZ2UgMjogIiwgdG1wLCBERUZBVUxUX0JMS19TWik7CisJCQlicmVhazsKKwkJfQorCisKKwkJLyogZG8gdGhlIGVuY3J5cHRpb24gKi8KKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShjdHgtPnRmbSwgb3V0cHV0LCB0bXApOworCisJfQorCisJLyoKKwkgKiBOb3cgdXBkYXRlIG91ciBEVCB2YWx1ZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBERUZBVUxUX0JMS19TWjsgaSsrKSB7CisJCWN0eC0+RFRbaV0gKz0gMTsKKwkJaWYgKGN0eC0+RFRbaV0gIT0gMCkKKwkJCWJyZWFrOworCX0KKworCWRiZ3ByaW50KCJSZXR1cm5pbmcgbmV3IGJsb2NrIGZvciBjb250ZXh0ICVwXG4iLCBjdHgpOworCWN0eC0+cmFuZF9kYXRhX3ZhbGlkID0gMDsKKworCWhleGR1bXAoIk91dHB1dCBEVDogIiwgY3R4LT5EVCwgREVGQVVMVF9CTEtfU1opOworCWhleGR1bXAoIk91dHB1dCBJOiAiLCBjdHgtPkksIERFRkFVTFRfQkxLX1NaKTsKKwloZXhkdW1wKCJPdXRwdXQgVjogIiwgY3R4LT5WLCBERUZBVUxUX0JMS19TWik7CisJaGV4ZHVtcCgiTmV3IFJhbmRvbSBEYXRhOiAiLCBjdHgtPnJhbmRfZGF0YSwgREVGQVVMVF9CTEtfU1opOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE91ciBleHBvcnRlZCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZ2V0X3BybmdfYnl0ZXMoY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBzdHJ1Y3QgcHJuZ19jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBidWY7CisJdW5zaWduZWQgaW50IGJ5dGVfY291bnQgPSAodW5zaWduZWQgaW50KW5ieXRlczsKKwlpbnQgZXJyOworCisKKwlpZiAobmJ5dGVzIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5wcm5nX2xvY2ssIGZsYWdzKTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGN0eC0+ZmxhZ3MgJiBQUk5HX05FRURfUkVTRVQpCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogSWYgdGhlIEZJWEVEX1NJWkUgZmxhZyBpcyBvbiwgb25seSByZXR1cm4gd2hvbGUgYmxvY2tzIG9mCisJICogcHNldWRvIHJhbmRvbSBkYXRhCisJICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoY3R4LT5mbGFncyAmIFBSTkdfRklYRURfU0laRSkgeworCQlpZiAobmJ5dGVzIDwgREVGQVVMVF9CTEtfU1opCisJCQlnb3RvIGRvbmU7CisJCWJ5dGVfY291bnQgPSBERUZBVUxUX0JMS19TWjsKKwl9CisKKwllcnIgPSBieXRlX2NvdW50OworCisJZGJncHJpbnQoS0VSTl9DUklUICJnZXR0aW5nICVkIHJhbmRvbSBieXRlcyBmb3IgY29udGV4dCAlcFxuIiwKKwkJYnl0ZV9jb3VudCwgY3R4KTsKKworCityZW1haW5kZXI6CisJaWYgKGN0eC0+cmFuZF9kYXRhX3ZhbGlkID09IERFRkFVTFRfQkxLX1NaKSB7CisJCWlmIChfZ2V0X21vcmVfcHJuZ19ieXRlcyhjdHgpIDwgMCkgeworCQkJbWVtc2V0KGJ1ZiwgMCwgbmJ5dGVzKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwkvKgorCSAqIENvcHkgdXAgdG8gdGhlIG5leHQgd2hvbGUgYmxvY2sgc2l6ZQorCSAqLworCWlmIChieXRlX2NvdW50IDwgREVGQVVMVF9CTEtfU1opIHsKKwkJZm9yICg7IGN0eC0+cmFuZF9kYXRhX3ZhbGlkIDwgREVGQVVMVF9CTEtfU1o7CisJCQljdHgtPnJhbmRfZGF0YV92YWxpZCsrKSB7CisJCQkqcHRyID0gY3R4LT5yYW5kX2RhdGFbY3R4LT5yYW5kX2RhdGFfdmFsaWRdOworCQkJcHRyKys7CisJCQlieXRlX2NvdW50LS07CisJCQlpZiAoYnl0ZV9jb3VudCA9PSAwKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qCisJICogTm93IGNvcHkgd2hvbGUgYmxvY2tzCisJICovCisJZm9yICg7IGJ5dGVfY291bnQgPj0gREVGQVVMVF9CTEtfU1o7IGJ5dGVfY291bnQgLT0gREVGQVVMVF9CTEtfU1opIHsKKwkJaWYgKF9nZXRfbW9yZV9wcm5nX2J5dGVzKGN0eCkgPCAwKSB7CisJCQltZW1zZXQoYnVmLCAwLCBuYnl0ZXMpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1jcHkocHRyLCBjdHgtPnJhbmRfZGF0YSwgREVGQVVMVF9CTEtfU1opOworCQljdHgtPnJhbmRfZGF0YV92YWxpZCArPSBERUZBVUxUX0JMS19TWjsKKwkJcHRyICs9IERFRkFVTFRfQkxLX1NaOworCX0KKworCS8qCisJICogTm93IGNvcHkgYW55IGV4dHJhIHBhcnRpYWwgZGF0YQorCSAqLworCWlmIChieXRlX2NvdW50KQorCQlnb3RvIHJlbWFpbmRlcjsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPnBybmdfbG9jaywgZmxhZ3MpOworCWRiZ3ByaW50KEtFUk5fQ1JJVCAicmV0dXJuaW5nICVkIGZyb20gZ2V0X3BybmdfYnl0ZXMgaW4gY29udGV4dCAlcFxuIiwKKwkJZXJyLCBjdHgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcHJuZ19jb250ZXh0KHN0cnVjdCBwcm5nX2NvbnRleHQgKmN0eCkKK3sKKwljcnlwdG9fZnJlZV9jaXBoZXIoY3R4LT50Zm0pOworfQorCitzdGF0aWMgaW50IHJlc2V0X3BybmdfY29udGV4dChzdHJ1Y3QgcHJuZ19jb250ZXh0ICpjdHgsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICprZXksIHNpemVfdCBrbGVuLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqViwgdW5zaWduZWQgY2hhciAqRFQpCit7CisJaW50IHJldDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCXVuc2lnbmVkIGNoYXIgKnBybmdfa2V5OworCisJc3Bpbl9sb2NrKCZjdHgtPnBybmdfbG9jayk7CisJY3R4LT5mbGFncyB8PSBQUk5HX05FRURfUkVTRVQ7CisKKwlwcm5nX2tleSA9IChrZXkgIT0gTlVMTCkgPyBrZXkgOiAodW5zaWduZWQgY2hhciAqKURFRkFVTFRfUFJOR19LRVk7CisKKwlpZiAoIWtleSkKKwkJa2xlbiA9IERFRkFVTFRfUFJOR19LU1o7CisKKwlpZiAoVikKKwkJbWVtY3B5KGN0eC0+ViwgViwgREVGQVVMVF9CTEtfU1opOworCWVsc2UKKwkJbWVtY3B5KGN0eC0+ViwgREVGQVVMVF9WX1NFRUQsIERFRkFVTFRfQkxLX1NaKTsKKworCWlmIChEVCkKKwkJbWVtY3B5KGN0eC0+RFQsIERULCBERUZBVUxUX0JMS19TWik7CisJZWxzZQorCQltZW1zZXQoY3R4LT5EVCwgMCwgREVGQVVMVF9CTEtfU1opOworCisJbWVtc2V0KGN0eC0+cmFuZF9kYXRhLCAwLCBERUZBVUxUX0JMS19TWik7CisJbWVtc2V0KGN0eC0+bGFzdF9yYW5kX2RhdGEsIDAsIERFRkFVTFRfQkxLX1NaKTsKKworCWlmIChjdHgtPnRmbSkKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKGN0eC0+dGZtKTsKKworCWN0eC0+dGZtID0gY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgMCk7CisJaWYgKElTX0VSUihjdHgtPnRmbSkpIHsKKwkJZGJncHJpbnQoS0VSTl9DUklUICJGYWlsZWQgdG8gYWxsb2MgdGZtIGZvciBjb250ZXh0ICVwXG4iLAorCQkJY3R4KTsKKwkJY3R4LT50Zm0gPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwljdHgtPnJhbmRfZGF0YV92YWxpZCA9IERFRkFVTFRfQkxLX1NaOworCisJcmV0ID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY3R4LT50Zm0sIHBybmdfa2V5LCBrbGVuKTsKKwlpZiAocmV0KSB7CisJCWRiZ3ByaW50KEtFUk5fQ1JJVCAiUFJORzogc2V0a2V5KCkgZmFpbGVkIGZsYWdzPSV4XG4iLAorCQkJY3J5cHRvX2NpcGhlcl9nZXRfZmxhZ3MoY3R4LT50Zm0pKTsKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKGN0eC0+dGZtKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSAwOworCWN0eC0+ZmxhZ3MgJj0gflBSTkdfTkVFRF9SRVNFVDsKK291dDoKKwlzcGluX3VubG9jaygmY3R4LT5wcm5nX2xvY2spOworCisJcmV0dXJuIHJjOworCit9CisKK3N0YXRpYyBpbnQgY3BybmdfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBwcm5nX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5wcm5nX2xvY2spOworCisJcmV0dXJuIHJlc2V0X3BybmdfY29udGV4dChjdHgsIE5VTEwsIERFRkFVTFRfUFJOR19LU1osIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjcHJuZ19leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJZnJlZV9wcm5nX2NvbnRleHQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyBpbnQgY3BybmdfZ2V0X3JhbmRvbShzdHJ1Y3QgY3J5cHRvX3JuZyAqdGZtLCB1OCAqcmRhdGEsCisJCQkgICAgdW5zaWduZWQgaW50IGRsZW4pCit7CisJc3RydWN0IHBybmdfY29udGV4dCAqcHJuZyA9IGNyeXB0b19ybmdfY3R4KHRmbSk7CisKKwlyZXR1cm4gZ2V0X3BybmdfYnl0ZXMocmRhdGEsIGRsZW4sIHBybmcpOworfQorCitzdGF0aWMgaW50IGNwcm5nX3Jlc2V0KHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbikKK3sKKwlzdHJ1Y3QgcHJuZ19jb250ZXh0ICpwcm5nID0gY3J5cHRvX3JuZ19jdHgodGZtKTsKKwl1OCAqa2V5ID0gc2VlZCArIERFRkFVTFRfUFJOR19LU1o7CisKKwlpZiAoc2xlbiA8IERFRkFVTFRfUFJOR19LU1ogKyBERUZBVUxUX0JMS19TWikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXNldF9wcm5nX2NvbnRleHQocHJuZywga2V5LCBERUZBVUxUX1BSTkdfS1NaLCBzZWVkLCBOVUxMKTsKKworCWlmIChwcm5nLT5mbGFncyAmIFBSTkdfTkVFRF9SRVNFVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBybmdfYWxnID0geworCS5jcmFfbmFtZQkJPSAic3Rkcm5nIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0gImFuc2lfY3BybmciLAorCS5jcmFfcHJpb3JpdHkJCT0gMTAwLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX1JORywKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBwcm5nX2NvbnRleHQpLAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX3JuZ190eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChybmdfYWxnLmNyYV9saXN0KSwKKwkuY3JhX2luaXQJCT0gY3BybmdfaW5pdCwKKwkuY3JhX2V4aXQJCT0gY3BybmdfZXhpdCwKKwkuY3JhX3UJCQk9IHsKKwkJLnJuZyA9IHsKKwkJCS5ybmdfbWFrZV9yYW5kb20JPSBjcHJuZ19nZXRfcmFuZG9tLAorCQkJLnJuZ19yZXNldAkJPSBjcHJuZ19yZXNldCwKKwkJCS5zZWVkc2l6ZSA9IERFRkFVTFRfUFJOR19LU1ogKyBERUZBVUxUX0JMS19TWiwKKwkJfQorCX0KK307CisKKworLyogTW9kdWxlIGluaXRhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IHBybmdfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmaXBzX2VuYWJsZWQpCisJCXJuZ19hbGcuY3JhX3ByaW9yaXR5ICs9IDIwMDsKKworCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJnJuZ19hbGcpOworCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcm5nX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZybmdfYWxnKTsKKwlyZXR1cm47Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU29mdHdhcmUgUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIik7CitNT0RVTEVfQVVUSE9SKCJOZWlsIEhvcm1hbiA8bmhvcm1hbkB0dXhkcml2ZXIuY29tPiIpOworbW9kdWxlX3BhcmFtKGRiZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGJnLCAiQm9vbGVhbiB0byBlbmFibGUgZGVidWdnaW5nICgwLzEgPT0gb2ZmL29uKSIpOworbW9kdWxlX2luaXQocHJuZ19tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChwcm5nX21vZF9maW5pKTsKK01PRFVMRV9BTElBUygic3Rkcm5nIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXBpLmMgYi9jcnlwdG8vYXBpLmMKaW5kZXggZDA2ZTMzMi4uMDQ0NGQyNCAxMDA2NDQKLS0tIGEvY3J5cHRvL2FwaS5jCisrKyBiL2NyeXB0by9hcGkuYwpAQCAtNTUsNyArNTUsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19tb2RfcHV0KTsKIAotc3RydWN0IGNyeXB0b19hbGcgKl9fY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQorc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2lzX3Rlc3RfbGFydmFsKHN0cnVjdCBjcnlwdG9fbGFydmFsICpsYXJ2YWwpCit7CisJcmV0dXJuIGxhcnZhbC0+YWxnLmNyYV9kcml2ZXJfbmFtZVswXTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpfX2NyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLAorCQkJCQkgICAgICB1MzIgbWFzaykKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqcSwgKmFsZyA9IE5VTEw7CiAJaW50IGJlc3QgPSAtMjsKQEAgLTcwLDYgKzc2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChjcnlwdG9faXNfbGFydmFsKHEpICYmCisJCSAgICAhY3J5cHRvX2lzX3Rlc3RfbGFydmFsKChzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqKXEpICYmCiAJCSAgICAoKHN0cnVjdCBjcnlwdG9fbGFydmFsICopcSktPm1hc2sgIT0gbWFzaykKIAkJCWNvbnRpbnVlOwogCkBAIC05Miw3ICs5OSw2IEBACiAKIAlyZXR1cm4gYWxnOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoX19jcnlwdG9fYWxnX2xvb2t1cCk7CiAKIHN0YXRpYyB2b2lkIGNyeXB0b19sYXJ2YWxfZGVzdHJveShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogewpAQCAtMTA0LDEwICsxMTAsOCBAQAogCWtmcmVlKGxhcnZhbCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2xhcnZhbF9hbGxvYyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwKLQkJCQkJICAgICAgdTMyIG1hc2spCitzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqY3J5cHRvX2xhcnZhbF9hbGxvYyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCiB7Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAlzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqbGFydmFsOwogCiAJbGFydmFsID0ga3phbGxvYyhzaXplb2YoKmxhcnZhbCksIEdGUF9LRVJORUwpOwpAQCAtMTE5LDEwICsxMjMsMjUgQEAKIAlsYXJ2YWwtPmFsZy5jcmFfcHJpb3JpdHkgPSAtMTsKIAlsYXJ2YWwtPmFsZy5jcmFfZGVzdHJveSA9IGNyeXB0b19sYXJ2YWxfZGVzdHJveTsKIAotCWF0b21pY19zZXQoJmxhcnZhbC0+YWxnLmNyYV9yZWZjbnQsIDIpOwogCXN0cmxjcHkobGFydmFsLT5hbGcuY3JhX25hbWUsIG5hbWUsIENSWVBUT19NQVhfQUxHX05BTUUpOwogCWluaXRfY29tcGxldGlvbigmbGFydmFsLT5jb21wbGV0aW9uKTsKIAorCXJldHVybiBsYXJ2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fbGFydmFsX2FsbG9jKTsKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fbGFydmFsX2FkZChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwKKwkJCQkJICAgIHUzMiBtYXNrKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJc3RydWN0IGNyeXB0b19sYXJ2YWwgKmxhcnZhbDsKKworCWxhcnZhbCA9IGNyeXB0b19sYXJ2YWxfYWxsb2MobmFtZSwgdHlwZSwgbWFzayk7CisJaWYgKElTX0VSUihsYXJ2YWwpKQorCQlyZXR1cm4gRVJSX0NBU1QobGFydmFsKTsKKworCWF0b21pY19zZXQoJmxhcnZhbC0+YWxnLmNyYV9yZWZjbnQsIDIpOworCiAJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCWFsZyA9IF9fY3J5cHRvX2FsZ19sb29rdXAobmFtZSwgdHlwZSwgbWFzayk7CiAJaWYgKCFhbGcpIHsKQEAgLTE1MiwyMSArMTcxLDI5IEBACiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19sYXJ2YWxfd2FpdChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogewogCXN0cnVjdCBjcnlwdG9fbGFydmFsICpsYXJ2YWwgPSAodm9pZCAqKWFsZzsKKwlsb25nIHRpbWVvdXQ7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmbGFydmFsLT5jb21wbGV0aW9uLCA2MCAqIEhaKTsKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCSZsYXJ2YWwtPmNvbXBsZXRpb24sIDYwICogSFopOworCiAJYWxnID0gbGFydmFsLT5hZHVsdDsKLQlpZiAoYWxnKSB7Ci0JCWlmICghY3J5cHRvX21vZF9nZXQoYWxnKSkKLQkJCWFsZyA9IEVSUl9QVFIoLUVBR0FJTik7Ci0JfSBlbHNlCisJaWYgKHRpbWVvdXQgPCAwKQorCQlhbGcgPSBFUlJfUFRSKC1FSU5UUik7CisJZWxzZSBpZiAoIXRpbWVvdXQpCisJCWFsZyA9IEVSUl9QVFIoLUVUSU1FRE9VVCk7CisJZWxzZSBpZiAoIWFsZykKIAkJYWxnID0gRVJSX1BUUigtRU5PRU5UKTsKKwllbHNlIGlmIChjcnlwdG9faXNfdGVzdF9sYXJ2YWwobGFydmFsKSAmJgorCQkgIShhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVEVTVEVEKSkKKwkJYWxnID0gRVJSX1BUUigtRUFHQUlOKTsKKwllbHNlIGlmICghY3J5cHRvX21vZF9nZXQoYWxnKSkKKwkJYWxnID0gRVJSX1BUUigtRUFHQUlOKTsKIAljcnlwdG9fbW9kX3B1dCgmbGFydmFsLT5hbGcpOwogCiAJcmV0dXJuIGFsZzsKIH0KIAotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwKLQkJCQkJICAgIHUzMiBtYXNrKQorc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOwogCkBAIC0xNzYsNiArMjAzLDcgQEAKIAogCXJldHVybiBhbGc7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxnX2xvb2t1cCk7CiAKIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fbGFydmFsX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCiB7CkBAIC0xOTIsMjUgKzIyMCw0MCBAQAogCWlmIChhbGcpCiAJCXJldHVybiBjcnlwdG9faXNfbGFydmFsKGFsZykgPyBjcnlwdG9fbGFydmFsX3dhaXQoYWxnKSA6IGFsZzsKIAotCXJldHVybiBjcnlwdG9fbGFydmFsX2FsbG9jKG5hbWUsIHR5cGUsIG1hc2spOworCXJldHVybiBjcnlwdG9fbGFydmFsX2FkZChuYW1lLCB0eXBlLCBtYXNrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19sYXJ2YWxfbG9va3VwKTsKIAoraW50IGNyeXB0b19wcm9iaW5nX25vdGlmeSh1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdikKK3sKKwlpbnQgb2s7CisKKwlvayA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNyeXB0b19jaGFpbiwgdmFsLCB2KTsKKwlpZiAob2sgPT0gTk9USUZZX0RPTkUpIHsKKwkJcmVxdWVzdF9tb2R1bGUoImNyeXB0b21nciIpOworCQlvayA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNyeXB0b19jaGFpbiwgdmFsLCB2KTsKKwl9CisKKwlyZXR1cm4gb2s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fcHJvYmluZ19ub3RpZnkpOworCiBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOwogCXN0cnVjdCBjcnlwdG9fYWxnICpsYXJ2YWw7CiAJaW50IG9rOwogCisJaWYgKCEobWFzayAmIENSWVBUT19BTEdfVEVTVEVEKSkgeworCQl0eXBlIHw9IENSWVBUT19BTEdfVEVTVEVEOworCQltYXNrIHw9IENSWVBUT19BTEdfVEVTVEVEOworCX0KKwogCWxhcnZhbCA9IGNyeXB0b19sYXJ2YWxfbG9va3VwKG5hbWUsIHR5cGUsIG1hc2spOwogCWlmIChJU19FUlIobGFydmFsKSB8fCAhY3J5cHRvX2lzX2xhcnZhbChsYXJ2YWwpKQogCQlyZXR1cm4gbGFydmFsOwogCi0Jb2sgPSBjcnlwdG9fbm90aWZ5KENSWVBUT19NU0dfQUxHX1JFUVVFU1QsIGxhcnZhbCk7Ci0JaWYgKG9rID09IE5PVElGWV9ET05FKSB7Ci0JCXJlcXVlc3RfbW9kdWxlKCJjcnlwdG9tZ3IiKTsKLQkJb2sgPSBjcnlwdG9fbm90aWZ5KENSWVBUT19NU0dfQUxHX1JFUVVFU1QsIGxhcnZhbCk7Ci0JfQorCW9rID0gY3J5cHRvX3Byb2Jpbmdfbm90aWZ5KENSWVBUT19NU0dfQUxHX1JFUVVFU1QsIGxhcnZhbCk7CiAKIAlpZiAob2sgPT0gTk9USUZZX1NUT1ApCiAJCWFsZyA9IGNyeXB0b19sYXJ2YWxfd2FpdChsYXJ2YWwpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsa2NpcGhlci5jIGIvY3J5cHRvL2Jsa2NpcGhlci5jCmluZGV4IDE4NWY5NTUuLjRhN2U2NWMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTY5NiwzNCArNjk2LDUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrY2lwaGVyX2dlbml2X2V4aXQpOwogCi1zdGF0aWMgaW50IF9faW5pdCBibGtjaXBoZXJfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gY2hhaW5pdl9tb2R1bGVfaW5pdCgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gZXNlcWl2X21vZHVsZV9pbml0KCk7Ci0JaWYgKGVycikKLQkJZ290byBlc2VxaXZfZXJyOwotCi1vdXQ6Ci0JcmV0dXJuIGVycjsKLQotZXNlcWl2X2VycjoKLQljaGFpbml2X21vZHVsZV9leGl0KCk7Ci0JZ290byBvdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBibGtjaXBoZXJfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQllc2VxaXZfbW9kdWxlX2V4aXQoKTsKLQljaGFpbml2X21vZHVsZV9leGl0KCk7Ci19Ci0KLW1vZHVsZV9pbml0KGJsa2NpcGhlcl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChibGtjaXBoZXJfbW9kdWxlX2V4aXQpOwotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgYmxvY2sgY2hhaW5pbmcgY2lwaGVyIHR5cGUiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jYW1lbGxpYS5jIGIvY3J5cHRvL2NhbWVsbGlhLmMKaW5kZXggYjFjYzRkZS4uNDkzZmVlNyAxMDA2NDQKLS0tIGEvY3J5cHRvL2NhbWVsbGlhLmMKKysrIGIvY3J5cHRvL2NhbWVsbGlhLmMKQEAgLTM1LDggKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiBzdGF0aWMgY29uc3QgdTMyIGNhbWVsbGlhX3NwMTExMFsyNTZdID0gewogCTB4NzA3MDcwMDAsMHg4MjgyODIwMCwweDJjMmMyYzAwLDB4ZWNlY2VjMDAsCkBAIC0zMzcsNiArMzM1LDIwIEBACiAvKgogICogIG1hY3JvcwogICovCisjZGVmaW5lIEdFVFUzMih2LCBwdCkgXAorICAgIGRvIHsgXAorCS8qIGxhdGVzdCBicmVlZCBvZiBnY2MgaXMgY2xldmVyIGVub3VnaCB0byB1c2UgbW92ZSAqLyBcCisJbWVtY3B5KCYodiksIChwdCksIDQpOyBcCisJKHYpID0gYmUzMl90b19jcHUodik7IFwKKyAgICB9IHdoaWxlKDApCisKKy8qIHJvdGF0aW9uIHJpZ2h0IHNoaWZ0IDFieXRlICovCisjZGVmaW5lIFJPUjgoeCkgKCgoeCkgPj4gOCkgKyAoKHgpIDw8IDI0KSkKKy8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMWJpdCAqLworI2RlZmluZSBST0wxKHgpICgoKHgpIDw8IDEpICsgKCh4KSA+PiAzMSkpCisvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDFieXRlICovCisjZGVmaW5lIFJPTDgoeCkgKCgoeCkgPDwgOCkgKyAoKHgpID4+IDI0KSkKKwogI2RlZmluZSBST0xEUShsbCwgbHIsIHJsLCByciwgdzAsIHcxLCBiaXRzKQkJXAogICAgIGRvIHsJCQkJCQlcCiAJdzAgPSBsbDsJCQkJCVwKQEAgLTM3MSw3ICszODMsNyBAQAogCSAgIF4gY2FtZWxsaWFfc3AzMDMzWyh1OCkoaWwgPj4gOCldCQkJXAogCSAgIF4gY2FtZWxsaWFfc3A0NDA0Wyh1OCkoaWwgICAgICldOwkJCVwKIAl5bCBePSB5cjsJCQkJCQlcCi0JeXIgPSByb3IzMih5ciwgOCk7CQkJCQlcCisJeXIgPSBST1I4KHlyKTsJCQkJCQlcCiAJeXIgXj0geWw7CQkJCQkJXAogICAgIH0gd2hpbGUoMCkKIApAQCAtMzkzLDcgKzQwNSw3IEBACiAJc3ViTFs3XSBePSBzdWJMWzFdOyBzdWJSWzddIF49IHN1YlJbMV07CiAJc3ViTFsxXSBePSBzdWJSWzFdICYgfnN1YlJbOV07CiAJZHcgPSBzdWJMWzFdICYgc3ViTFs5XSwKLQkJc3ViUlsxXSBePSByb2wzMihkdywgMSk7IC8qIG1vZGlmaWVkIGZvciBGTGludihrbDIpICovCisJCXN1YlJbMV0gXj0gUk9MMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTGludihrbDIpICovCiAJLyogcm91bmQgOCAqLwogCXN1YkxbMTFdIF49IHN1YkxbMV07IHN1YlJbMTFdIF49IHN1YlJbMV07CiAJLyogcm91bmQgMTAgKi8KQEAgLTQwMiw3ICs0MTQsNyBAQAogCXN1YkxbMTVdIF49IHN1YkxbMV07IHN1YlJbMTVdIF49IHN1YlJbMV07CiAJc3ViTFsxXSBePSBzdWJSWzFdICYgfnN1YlJbMTddOwogCWR3ID0gc3ViTFsxXSAmIHN1YkxbMTddLAotCQlzdWJSWzFdIF49IHJvbDMyKGR3LCAxKTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsNCkgKi8KKwkJc3ViUlsxXSBePSBST0wxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsNCkgKi8KIAkvKiByb3VuZCAxNCAqLwogCXN1YkxbMTldIF49IHN1YkxbMV07IHN1YlJbMTldIF49IHN1YlJbMV07CiAJLyogcm91bmQgMTYgKi8KQEAgLTQxOCw3ICs0MzAsNyBAQAogCX0gZWxzZSB7CiAJCXN1YkxbMV0gXj0gc3ViUlsxXSAmIH5zdWJSWzI1XTsKIAkJZHcgPSBzdWJMWzFdICYgc3ViTFsyNV0sCi0JCQlzdWJSWzFdIF49IHJvbDMyKGR3LCAxKTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsNikgKi8KKwkJCXN1YlJbMV0gXj0gUk9MMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTGludihrbDYpICovCiAJCS8qIHJvdW5kIDIwICovCiAJCXN1YkxbMjddIF49IHN1YkxbMV07IHN1YlJbMjddIF49IHN1YlJbMV07CiAJCS8qIHJvdW5kIDIyICovCkBAIC00MzgsNyArNDUwLDcgQEAKIAkJc3ViTFsyNl0gXj0ga3c0bDsgc3ViUlsyNl0gXj0ga3c0cjsKIAkJa3c0bCBePSBrdzRyICYgfnN1YlJbMjRdOwogCQlkdyA9IGt3NGwgJiBzdWJMWzI0XSwKLQkJCWt3NHIgXj0gcm9sMzIoZHcsIDEpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2w1KSAqLworCQkJa3c0ciBePSBST0wxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMKGtsNSkgKi8KIAl9CiAJLyogcm91bmQgMTcgKi8KIAlzdWJMWzIyXSBePSBrdzRsOyBzdWJSWzIyXSBePSBrdzRyOwpAQCAtNDQ4LDcgKzQ2MCw3IEBACiAJc3ViTFsxOF0gXj0ga3c0bDsgc3ViUlsxOF0gXj0ga3c0cjsKIAlrdzRsIF49IGt3NHIgJiB+c3ViUlsxNl07CiAJZHcgPSBrdzRsICYgc3ViTFsxNl0sCi0JCWt3NHIgXj0gcm9sMzIoZHcsIDEpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wzKSAqLworCQlrdzRyIF49IFJPTDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wzKSAqLwogCS8qIHJvdW5kIDExICovCiAJc3ViTFsxNF0gXj0ga3c0bDsgc3ViUlsxNF0gXj0ga3c0cjsKIAkvKiByb3VuZCA5ICovCkBAIC00NTcsNyArNDY5LDcgQEAKIAlzdWJMWzEwXSBePSBrdzRsOyBzdWJSWzEwXSBePSBrdzRyOwogCWt3NGwgXj0ga3c0ciAmIH5zdWJSWzhdOwogCWR3ID0ga3c0bCAmIHN1YkxbOF0sCi0JCWt3NHIgXj0gcm9sMzIoZHcsIDEpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wxKSAqLworCQlrdzRyIF49IFJPTDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wxKSAqLwogCS8qIHJvdW5kIDUgKi8KIAlzdWJMWzZdIF49IGt3NGw7IHN1YlJbNl0gXj0ga3c0cjsKIAkvKiByb3VuZCAzICovCkBAIC00ODIsNyArNDk0LDcgQEAKIAlTVUJLRVlfUig2KSA9IHN1YlJbNV0gXiBzdWJSWzddOwogCXRsID0gc3ViTFsxMF0gXiAoc3ViUlsxMF0gJiB+c3ViUls4XSk7CiAJZHcgPSB0bCAmIHN1YkxbOF0sICAvKiBGTChrbDEpICovCi0JCXRyID0gc3ViUlsxMF0gXiByb2wzMihkdywgMSk7CisJCXRyID0gc3ViUlsxMF0gXiBST0wxKGR3KTsKIAlTVUJLRVlfTCg3KSA9IHN1YkxbNl0gXiB0bDsgLyogcm91bmQgNiAqLwogCVNVQktFWV9SKDcpID0gc3ViUls2XSBeIHRyOwogCVNVQktFWV9MKDgpID0gc3ViTFs4XTsgICAgICAgLyogRkwoa2wxKSAqLwpAQCAtNDkxLDcgKzUwMyw3IEBACiAJU1VCS0VZX1IoOSkgPSBzdWJSWzldOwogCXRsID0gc3ViTFs3XSBeIChzdWJSWzddICYgfnN1YlJbOV0pOwogCWR3ID0gdGwgJiBzdWJMWzldLCAgLyogRkxpbnYoa2wyKSAqLwotCQl0ciA9IHN1YlJbN10gXiByb2wzMihkdywgMSk7CisJCXRyID0gc3ViUls3XSBeIFJPTDEoZHcpOwogCVNVQktFWV9MKDEwKSA9IHRsIF4gc3ViTFsxMV07IC8qIHJvdW5kIDcgKi8KIAlTVUJLRVlfUigxMCkgPSB0ciBeIHN1YlJbMTFdOwogCVNVQktFWV9MKDExKSA9IHN1YkxbMTBdIF4gc3ViTFsxMl07IC8qIHJvdW5kIDggKi8KQEAgLTUwNCw3ICs1MTYsNyBAQAogCVNVQktFWV9SKDE0KSA9IHN1YlJbMTNdIF4gc3ViUlsxNV07CiAJdGwgPSBzdWJMWzE4XSBeIChzdWJSWzE4XSAmIH5zdWJSWzE2XSk7CiAJZHcgPSB0bCAmIHN1YkxbMTZdLCAvKiBGTChrbDMpICovCi0JCXRyID0gc3ViUlsxOF0gXiByb2wzMihkdywgMSk7CisJCXRyID0gc3ViUlsxOF0gXiBST0wxKGR3KTsKIAlTVUJLRVlfTCgxNSkgPSBzdWJMWzE0XSBeIHRsOyAvKiByb3VuZCAxMiAqLwogCVNVQktFWV9SKDE1KSA9IHN1YlJbMTRdIF4gdHI7CiAJU1VCS0VZX0woMTYpID0gc3ViTFsxNl07ICAgICAvKiBGTChrbDMpICovCkBAIC01MTMsNyArNTI1LDcgQEAKIAlTVUJLRVlfUigxNykgPSBzdWJSWzE3XTsKIAl0bCA9IHN1YkxbMTVdIF4gKHN1YlJbMTVdICYgfnN1YlJbMTddKTsKIAlkdyA9IHRsICYgc3ViTFsxN10sIC8qIEZMaW52KGtsNCkgKi8KLQkJdHIgPSBzdWJSWzE1XSBeIHJvbDMyKGR3LCAxKTsKKwkJdHIgPSBzdWJSWzE1XSBeIFJPTDEoZHcpOwogCVNVQktFWV9MKDE4KSA9IHRsIF4gc3ViTFsxOV07IC8qIHJvdW5kIDEzICovCiAJU1VCS0VZX1IoMTgpID0gdHIgXiBzdWJSWzE5XTsKIAlTVUJLRVlfTCgxOSkgPSBzdWJMWzE4XSBeIHN1YkxbMjBdOyAvKiByb3VuZCAxNCAqLwpAQCAtNTMyLDcgKzU0NCw3IEBACiAJfSBlbHNlIHsKIAkJdGwgPSBzdWJMWzI2XSBeIChzdWJSWzI2XSAmIH5zdWJSWzI0XSk7CiAJCWR3ID0gdGwgJiBzdWJMWzI0XSwgLyogRkwoa2w1KSAqLwotCQkJdHIgPSBzdWJSWzI2XSBeIHJvbDMyKGR3LCAxKTsKKwkJCXRyID0gc3ViUlsyNl0gXiBST0wxKGR3KTsKIAkJU1VCS0VZX0woMjMpID0gc3ViTFsyMl0gXiB0bDsgLyogcm91bmQgMTggKi8KIAkJU1VCS0VZX1IoMjMpID0gc3ViUlsyMl0gXiB0cjsKIAkJU1VCS0VZX0woMjQpID0gc3ViTFsyNF07ICAgICAvKiBGTChrbDUpICovCkBAIC01NDEsNyArNTUzLDcgQEAKIAkJU1VCS0VZX1IoMjUpID0gc3ViUlsyNV07CiAJCXRsID0gc3ViTFsyM10gXiAoc3ViUlsyM10gJiB+c3ViUlsyNV0pOwogCQlkdyA9IHRsICYgc3ViTFsyNV0sIC8qIEZMaW52KGtsNikgKi8KLQkJCXRyID0gc3ViUlsyM10gXiByb2wzMihkdywgMSk7CisJCQl0ciA9IHN1YlJbMjNdIF4gUk9MMShkdyk7CiAJCVNVQktFWV9MKDI2KSA9IHRsIF4gc3ViTFsyN107IC8qIHJvdW5kIDE5ICovCiAJCVNVQktFWV9SKDI2KSA9IHRyIF4gc3ViUlsyN107CiAJCVNVQktFWV9MKDI3KSA9IHN1YkxbMjZdIF4gc3ViTFsyOF07IC8qIHJvdW5kIDIwICovCkBAIC01NjEsMTcgKzU3MywxNyBAQAogCS8qIGFwcGx5IHRoZSBpbnZlcnNlIG9mIHRoZSBsYXN0IGhhbGYgb2YgUC1mdW5jdGlvbiAqLwogCWkgPSAyOwogCWRvIHsKLQkJZHcgPSBTVUJLRVlfTChpICsgMCkgXiBTVUJLRVlfUihpICsgMCk7IGR3ID0gcm9sMzIoZHcsIDgpOy8qIHJvdW5kIDEgKi8KKwkJZHcgPSBTVUJLRVlfTChpICsgMCkgXiBTVUJLRVlfUihpICsgMCk7IGR3ID0gUk9MOChkdyk7Lyogcm91bmQgMSAqLwogCQlTVUJLRVlfUihpICsgMCkgPSBTVUJLRVlfTChpICsgMCkgXiBkdzsgU1VCS0VZX0woaSArIDApID0gZHc7Ci0JCWR3ID0gU1VCS0VZX0woaSArIDEpIF4gU1VCS0VZX1IoaSArIDEpOyBkdyA9IHJvbDMyKGR3LCA4KTsvKiByb3VuZCAyICovCisJCWR3ID0gU1VCS0VZX0woaSArIDEpIF4gU1VCS0VZX1IoaSArIDEpOyBkdyA9IFJPTDgoZHcpOy8qIHJvdW5kIDIgKi8KIAkJU1VCS0VZX1IoaSArIDEpID0gU1VCS0VZX0woaSArIDEpIF4gZHc7IFNVQktFWV9MKGkgKyAxKSA9IGR3OwotCQlkdyA9IFNVQktFWV9MKGkgKyAyKSBeIFNVQktFWV9SKGkgKyAyKTsgZHcgPSByb2wzMihkdywgOCk7Lyogcm91bmQgMyAqLworCQlkdyA9IFNVQktFWV9MKGkgKyAyKSBeIFNVQktFWV9SKGkgKyAyKTsgZHcgPSBST0w4KGR3KTsvKiByb3VuZCAzICovCiAJCVNVQktFWV9SKGkgKyAyKSA9IFNVQktFWV9MKGkgKyAyKSBeIGR3OyBTVUJLRVlfTChpICsgMikgPSBkdzsKLQkJZHcgPSBTVUJLRVlfTChpICsgMykgXiBTVUJLRVlfUihpICsgMyk7IGR3ID0gcm9sMzIoZHcsIDgpOy8qIHJvdW5kIDQgKi8KKwkJZHcgPSBTVUJLRVlfTChpICsgMykgXiBTVUJLRVlfUihpICsgMyk7IGR3ID0gUk9MOChkdyk7Lyogcm91bmQgNCAqLwogCQlTVUJLRVlfUihpICsgMykgPSBTVUJLRVlfTChpICsgMykgXiBkdzsgU1VCS0VZX0woaSArIDMpID0gZHc7Ci0JCWR3ID0gU1VCS0VZX0woaSArIDQpIF4gU1VCS0VZX1IoaSArIDQpOyBkdyA9IHJvbDMyKGR3LCA5KTsvKiByb3VuZCA1ICovCisJCWR3ID0gU1VCS0VZX0woaSArIDQpIF4gU1VCS0VZX1IoaSArIDQpOyBkdyA9IFJPTDgoZHcpOy8qIHJvdW5kIDUgKi8KIAkJU1VCS0VZX1IoaSArIDQpID0gU1VCS0VZX0woaSArIDQpIF4gZHc7IFNVQktFWV9MKGkgKyA0KSA9IGR3OwotCQlkdyA9IFNVQktFWV9MKGkgKyA1KSBeIFNVQktFWV9SKGkgKyA1KTsgZHcgPSByb2wzMihkdywgOCk7Lyogcm91bmQgNiAqLworCQlkdyA9IFNVQktFWV9MKGkgKyA1KSBeIFNVQktFWV9SKGkgKyA1KTsgZHcgPSBST0w4KGR3KTsvKiByb3VuZCA2ICovCiAJCVNVQktFWV9SKGkgKyA1KSA9IFNVQktFWV9MKGkgKyA1KSBeIGR3OyBTVUJLRVlfTChpICsgNSkgPSBkdzsKIAkJaSArPSA4OwogCX0gd2hpbGUgKGkgPCBtYXgpOwpAQCAtNTg3LDEwICs1OTksMTAgQEAKIAkvKioKIAkgKiAgayA9PSBrbGwgfHwga2xyIHx8IGtybCB8fCBrcnIgKHx8IGlzIGNvbmNhdGVuYXRpb24pCiAJICovCi0Ja2xsID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSk7Ci0Ja2xyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDQpOwotCWtybCA9IGdldF91bmFsaWduZWRfYmUzMihrZXkgKyA4KTsKLQlrcnIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoa2V5ICsgMTIpOworCUdFVFUzMihrbGwsIGtleSAgICAgKTsKKwlHRVRVMzIoa2xyLCBrZXkgKyAgNCk7CisJR0VUVTMyKGtybCwga2V5ICsgIDgpOworCUdFVFUzMihrcnIsIGtleSArIDEyKTsKIAogCS8qIGdlbmVyYXRlIEtMIGRlcGVuZGVudCBzdWJrZXlzICovCiAJLyoga3cxICovCkBAIC02OTUsMTQgKzcwNywxNCBAQAogCSAqICBrZXkgPSAoa2xsIHx8IGtsciB8fCBrcmwgfHwga3JyIHx8IGtybGwgfHwga3JsciB8fCBrcnJsIHx8IGtycnIpCiAJICogICh8fCBpcyBjb25jYXRlbmF0aW9uKQogCSAqLwotCWtsbCA9IGdldF91bmFsaWduZWRfYmUzMihrZXkpOwotCWtsciA9IGdldF91bmFsaWduZWRfYmUzMihrZXkgKyA0KTsKLQlrcmwgPSBnZXRfdW5hbGlnbmVkX2JlMzIoa2V5ICsgOCk7Ci0Ja3JyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDEyKTsKLQlrcmxsID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDE2KTsKLQlrcmxyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDIwKTsKLQlrcnJsID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDI0KTsKLQlrcnJyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGtleSArIDI4KTsKKwlHRVRVMzIoa2xsLCAga2V5ICAgICApOworCUdFVFUzMihrbHIsICBrZXkgKyAgNCk7CisJR0VUVTMyKGtybCwgIGtleSArICA4KTsKKwlHRVRVMzIoa3JyLCAga2V5ICsgMTIpOworCUdFVFUzMihrcmxsLCBrZXkgKyAxNik7CisJR0VUVTMyKGtybHIsIGtleSArIDIwKTsKKwlHRVRVMzIoa3JybCwga2V5ICsgMjQpOworCUdFVFUzMihrcnJyLCBrZXkgKyAyOCk7CiAKIAkvKiBnZW5lcmF0ZSBLTCBkZXBlbmRlbnQgc3Via2V5cyAqLwogCS8qIGt3MSAqLwpAQCAtODU4LDEzICs4NzAsMTMgQEAKIAl0MCAmPSBsbDsJCQkJCQkJXAogCXQyIHw9IHJyOwkJCQkJCQlcCiAJcmwgXj0gdDI7CQkJCQkJCVwKLQlsciBePSByb2wzMih0MCwgMSk7CQkJCQkJXAorCWxyIF49IFJPTDEodDApOwkJCQkJCQlcCiAJdDMgPSBrcmw7CQkJCQkJCVwKIAl0MSA9IGtscjsJCQkJCQkJXAogCXQzICY9IHJsOwkJCQkJCQlcCiAJdDEgfD0gbHI7CQkJCQkJCVwKIAlsbCBePSB0MTsJCQkJCQkJXAotCXJyIF49IHJvbDMyKHQzLCAxKTsJCQkJCQlcCisJcnIgXj0gUk9MMSh0Myk7CQkJCQkJCVwKICAgICB9IHdoaWxlKDApCiAKICNkZWZpbmUgQ0FNRUxMSUFfUk9VTkRTTSh4bCwgeHIsIGtsLCBrciwgeWwsIHlyLCBpbCwgaXIpCQlcCkBAIC04ODAsNyArODkyLDcgQEAKIAlpbCBePSBrbDsJCQkJCQkJXAogCWlyIF49IGlsIF4ga3I7CQkJCQkJCVwKIAl5bCBePSBpcjsJCQkJCQkJXAotCXlyIF49IHJvcjMyKGlsLCA4KSBeIGlyOwkJCQkJCVwKKwl5ciBePSBST1I4KGlsKSBeIGlyOwkJCQkJCVwKICAgICB9IHdoaWxlKDApCiAKIC8qIG1heCA9IDI0OiAxMjhiaXQgZW5jcnlwdCwgbWF4ID0gMzI6IDI1NmJpdCBlbmNyeXB0ICovCmRpZmYgLS1naXQgYS9jcnlwdG8vY2hhaW5pdi5jIGIvY3J5cHRvL2NoYWluaXYuYwppbmRleCA5YWZmYWRlLi43YzM3YTQ5IDEwMDY0NAotLS0gYS9jcnlwdG8vY2hhaW5pdi5jCisrKyBiL2NyeXB0by9jaGFpbml2LmMKQEAgLTE0LDExICsxNCwxMSBAQAogICovCiAKICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvc2tjaXBoZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vcm5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC04Myw2ICs4Myw3IEBACiB7CiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpnZW5pdiA9IHNrY2lwaGVyX2dpdmNyeXB0X3JlcXRmbShyZXEpOwogCXN0cnVjdCBjaGFpbml2X2N0eCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KGdlbml2KTsKKwlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9ja19iaCgmY3R4LT5sb2NrKTsKIAlpZiAoY3J5cHRvX2FibGtjaXBoZXJfY3J0KGdlbml2KS0+Z2l2ZW5jcnlwdCAhPQpAQCAtOTAsMTEgKzkxLDE1IEBACiAJCWdvdG8gdW5sb2NrOwogCiAJY3J5cHRvX2FibGtjaXBoZXJfY3J0KGdlbml2KS0+Z2l2ZW5jcnlwdCA9IGNoYWluaXZfZ2l2ZW5jcnlwdDsKLQlnZXRfcmFuZG9tX2J5dGVzKGN0eC0+aXYsIGNyeXB0b19hYmxrY2lwaGVyX2l2c2l6ZShnZW5pdikpOworCWVyciA9IGNyeXB0b19ybmdfZ2V0X2J5dGVzKGNyeXB0b19kZWZhdWx0X3JuZywgY3R4LT5pdiwKKwkJCQkgICBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoZ2VuaXYpKTsKIAogdW5sb2NrOgogCXNwaW5fdW5sb2NrX2JoKCZjdHgtPmxvY2spOwogCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCXJldHVybiBjaGFpbml2X2dpdmVuY3J5cHQocmVxKTsKIH0KIApAQCAtMjAzLDYgKzIwOCw3IEBACiB7CiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpnZW5pdiA9IHNrY2lwaGVyX2dpdmNyeXB0X3JlcXRmbShyZXEpOwogCXN0cnVjdCBhc3luY19jaGFpbml2X2N0eCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KGdlbml2KTsKKwlpbnQgZXJyID0gMDsKIAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KENIQUlOSVZfU1RBVEVfSU5VU0UsICZjdHgtPnN0YXRlKSkKIAkJZ290byBvdXQ7CkBAIC0yMTIsMTEgKzIxOCwxNSBAQAogCQlnb3RvIHVubG9jazsKIAogCWNyeXB0b19hYmxrY2lwaGVyX2NydChnZW5pdiktPmdpdmVuY3J5cHQgPSBhc3luY19jaGFpbml2X2dpdmVuY3J5cHQ7Ci0JZ2V0X3JhbmRvbV9ieXRlcyhjdHgtPml2LCBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoZ2VuaXYpKTsKKwllcnIgPSBjcnlwdG9fcm5nX2dldF9ieXRlcyhjcnlwdG9fZGVmYXVsdF9ybmcsIGN0eC0+aXYsCisJCQkJICAgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGdlbml2KSk7CiAKIHVubG9jazoKIAljbGVhcl9iaXQoQ0hBSU5JVl9TVEFURV9JTlVTRSwgJmN0eC0+c3RhdGUpOwogCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogb3V0OgogCXJldHVybiBhc3luY19jaGFpbml2X2dpdmVuY3J5cHQocmVxKTsKIH0KQEAgLTI4NCw5ICsyOTQsMTMgQEAKIAlpZiAoSVNfRVJSKGFsZ3QpKQogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCisJZXJyID0gY3J5cHRvX2dldF9kZWZhdWx0X3JuZygpOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKIAlpbnN0ID0gc2tjaXBoZXJfZ2VuaXZfYWxsb2MoJmNoYWluaXZfdG1wbCwgdGIsIDAsIDApOwogCWlmIChJU19FUlIoaW5zdCkpCi0JCWdvdG8gb3V0OworCQlnb3RvIHB1dF9ybmc7CiAKIAlpbnN0LT5hbGcuY3JhX2FibGtjaXBoZXIuZ2l2ZW5jcnlwdCA9IGNoYWluaXZfZ2l2ZW5jcnlwdF9maXJzdDsKIApAQCAtMzExLDIxICszMjUsMzcgQEAKIAogb3V0OgogCXJldHVybiBpbnN0OworCitwdXRfcm5nOgorCWNyeXB0b19wdXRfZGVmYXVsdF9ybmcoKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgY2hhaW5pdl9mcmVlKHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpCit7CisJc2tjaXBoZXJfZ2VuaXZfZnJlZShpbnN0KTsKKwljcnlwdG9fcHV0X2RlZmF1bHRfcm5nKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIGNoYWluaXZfdG1wbCA9IHsKIAkubmFtZSA9ICJjaGFpbml2IiwKIAkuYWxsb2MgPSBjaGFpbml2X2FsbG9jLAotCS5mcmVlID0gc2tjaXBoZXJfZ2VuaXZfZnJlZSwKKwkuZnJlZSA9IGNoYWluaXZfZnJlZSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCi1pbnQgX19pbml0IGNoYWluaXZfbW9kdWxlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNoYWluaXZfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3RlbXBsYXRlKCZjaGFpbml2X3RtcGwpOwogfQogCi12b2lkIGNoYWluaXZfbW9kdWxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIGNoYWluaXZfbW9kdWxlX2V4aXQodm9pZCkKIHsKIAljcnlwdG9fdW5yZWdpc3Rlcl90ZW1wbGF0ZSgmY2hhaW5pdl90bXBsKTsKIH0KKworbW9kdWxlX2luaXQoY2hhaW5pdl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChjaGFpbml2X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaGFpbiBJViBHZW5lcmF0b3IiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdG9tZ3IuYyBiL2NyeXB0by9jcnlwdG9tZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlM2NmOC4uMDAwMDAwMAotLS0gYS9jcnlwdG8vY3J5cHRvbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZSBkZWZhdWx0IGNyeXB0byBhbGdvcml0aG0gaW5zdGFuY2VzLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdHJ1Y3QgY3J5cHRvbWdyX3BhcmFtIHsKLQlzdHJ1Y3QgcnRhdHRyICp0YltDUllQVE9fTUFYX0FUVFJTICsgMl07Ci0KLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7Ci0JCXN0cnVjdCBjcnlwdG9fYXR0cl90eXBlIGRhdGE7Ci0JfSB0eXBlOwotCi0JdW5pb24gewotCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7Ci0JCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgcnRhdHRyIGF0dHI7Ci0JCQlzdHJ1Y3QgY3J5cHRvX2F0dHJfYWxnIGRhdGE7Ci0JCX0gYWxnOwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IHJ0YXR0ciBhdHRyOwotCQkJc3RydWN0IGNyeXB0b19hdHRyX3UzMiBkYXRhOwotCQl9IG51MzI7Ci0JfSBhdHRyc1tDUllQVE9fTUFYX0FUVFJTXTsKLQotCWNoYXIgbGFydmFsW0NSWVBUT19NQVhfQUxHX05BTUVdOwotCWNoYXIgdGVtcGxhdGVbQ1JZUFRPX01BWF9BTEdfTkFNRV07Ci19OwotCi1zdGF0aWMgaW50IGNyeXB0b21ncl9wcm9iZSh2b2lkICpkYXRhKQotewotCXN0cnVjdCBjcnlwdG9tZ3JfcGFyYW0gKnBhcmFtID0gZGF0YTsKLQlzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsOwotCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3Q7Ci0JaW50IGVycjsKLQotCXRtcGwgPSBjcnlwdG9fbG9va3VwX3RlbXBsYXRlKHBhcmFtLT50ZW1wbGF0ZSk7Ci0JaWYgKCF0bXBsKQotCQlnb3RvIGVycjsKLQotCWRvIHsKLQkJaW5zdCA9IHRtcGwtPmFsbG9jKHBhcmFtLT50Yik7Ci0JCWlmIChJU19FUlIoaW5zdCkpCi0JCQllcnIgPSBQVFJfRVJSKGluc3QpOwotCQllbHNlIGlmICgoZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2luc3RhbmNlKHRtcGwsIGluc3QpKSkKLQkJCXRtcGwtPmZyZWUoaW5zdCk7Ci0JfSB3aGlsZSAoZXJyID09IC1FQUdBSU4gJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKLQotCWNyeXB0b190bXBsX3B1dCh0bXBsKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gZXJyOwotCi1vdXQ6Ci0Ja2ZyZWUocGFyYW0pOwotCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7Ci0KLWVycjoKLQljcnlwdG9fbGFydmFsX2Vycm9yKHBhcmFtLT5sYXJ2YWwsIHBhcmFtLT50eXBlLmRhdGEudHlwZSwKLQkJCSAgICBwYXJhbS0+dHlwZS5kYXRhLm1hc2spOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgaW50IGNyeXB0b21ncl9zY2hlZHVsZV9wcm9iZShzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqbGFydmFsKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOwotCXN0cnVjdCBjcnlwdG9tZ3JfcGFyYW0gKnBhcmFtOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBsYXJ2YWwtPmFsZy5jcmFfbmFtZTsKLQljb25zdCBjaGFyICpwOwotCXVuc2lnbmVkIGludCBsZW47Ci0JaW50IGk7Ci0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKLQkJZ290byBlcnI7Ci0KLQlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9LRVJORUwpOwotCWlmICghcGFyYW0pCi0JCWdvdG8gZXJyX3B1dF9tb2R1bGU7Ci0KLQlmb3IgKHAgPSBuYW1lOyBpc2FsbnVtKCpwKSB8fCAqcCA9PSAnLScgfHwgKnAgPT0gJ18nOyBwKyspCi0JCTsKLQotCWxlbiA9IHAgLSBuYW1lOwotCWlmICghbGVuIHx8ICpwICE9ICcoJykKLQkJZ290byBlcnJfZnJlZV9wYXJhbTsKLQotCW1lbWNweShwYXJhbS0+dGVtcGxhdGUsIG5hbWUsIGxlbik7Ci0KLQlpID0gMDsKLQlmb3IgKDs7KSB7Ci0JCWludCBub3RudW0gPSAwOwotCi0JCW5hbWUgPSArK3A7Ci0JCWxlbiA9IDA7Ci0KLQkJZm9yICg7IGlzYWxudW0oKnApIHx8ICpwID09ICctJyB8fCAqcCA9PSAnXyc7IHArKykKLQkJCW5vdG51bSB8PSAhaXNkaWdpdCgqcCk7Ci0KLQkJaWYgKCpwID09ICcoJykgewotCQkJaW50IHJlY3Vyc2lvbiA9IDA7Ci0KLQkJCWZvciAoOzspIHsKLQkJCQlpZiAoISorK3ApCi0JCQkJCWdvdG8gZXJyX2ZyZWVfcGFyYW07Ci0JCQkJaWYgKCpwID09ICcoJykKLQkJCQkJcmVjdXJzaW9uKys7Ci0JCQkJZWxzZSBpZiAoKnAgPT0gJyknICYmICFyZWN1cnNpb24tLSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW5vdG51bSA9IDE7Ci0JCQlwKys7Ci0JCX0KLQotCQlsZW4gPSBwIC0gbmFtZTsKLQkJaWYgKCFsZW4pCi0JCQlnb3RvIGVycl9mcmVlX3BhcmFtOwotCi0JCWlmIChub3RudW0pIHsKLQkJCXBhcmFtLT5hdHRyc1tpXS5hbGcuYXR0ci5ydGFfbGVuID0KLQkJCQlzaXplb2YocGFyYW0tPmF0dHJzW2ldLmFsZyk7Ci0JCQlwYXJhbS0+YXR0cnNbaV0uYWxnLmF0dHIucnRhX3R5cGUgPSBDUllQVE9BX0FMRzsKLQkJCW1lbWNweShwYXJhbS0+YXR0cnNbaV0uYWxnLmRhdGEubmFtZSwgbmFtZSwgbGVuKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmF0dHIucnRhX2xlbiA9Ci0JCQkJc2l6ZW9mKHBhcmFtLT5hdHRyc1tpXS5udTMyKTsKLQkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmF0dHIucnRhX3R5cGUgPSBDUllQVE9BX1UzMjsKLQkJCXBhcmFtLT5hdHRyc1tpXS5udTMyLmRhdGEubnVtID0KLQkJCQlzaW1wbGVfc3RydG9sKG5hbWUsIE5VTEwsIDApOwotCQl9Ci0KLQkJcGFyYW0tPnRiW2kgKyAxXSA9ICZwYXJhbS0+YXR0cnNbaV0uYXR0cjsKLQkJaSsrOwotCi0JCWlmIChpID49IENSWVBUT19NQVhfQVRUUlMpCi0JCQlnb3RvIGVycl9mcmVlX3BhcmFtOwotCi0JCWlmICgqcCA9PSAnKScpCi0JCQlicmVhazsKLQotCQlpZiAoKnAgIT0gJywnKQotCQkJZ290byBlcnJfZnJlZV9wYXJhbTsKLQl9Ci0KLQlpZiAoIWkpCi0JCWdvdG8gZXJyX2ZyZWVfcGFyYW07Ci0KLQlwYXJhbS0+dGJbaSArIDFdID0gTlVMTDsKLQotCXBhcmFtLT50eXBlLmF0dHIucnRhX2xlbiA9IHNpemVvZihwYXJhbS0+dHlwZSk7Ci0JcGFyYW0tPnR5cGUuYXR0ci5ydGFfdHlwZSA9IENSWVBUT0FfVFlQRTsKLQlwYXJhbS0+dHlwZS5kYXRhLnR5cGUgPSBsYXJ2YWwtPmFsZy5jcmFfZmxhZ3M7Ci0JcGFyYW0tPnR5cGUuZGF0YS5tYXNrID0gbGFydmFsLT5tYXNrOwotCXBhcmFtLT50YlswXSA9ICZwYXJhbS0+dHlwZS5hdHRyOwotCi0JbWVtY3B5KHBhcmFtLT5sYXJ2YWwsIGxhcnZhbC0+YWxnLmNyYV9uYW1lLCBDUllQVE9fTUFYX0FMR19OQU1FKTsKLQotCXRocmVhZCA9IGt0aHJlYWRfcnVuKGNyeXB0b21ncl9wcm9iZSwgcGFyYW0sICJjcnlwdG9tZ3IiKTsKLQlpZiAoSVNfRVJSKHRocmVhZCkpCi0JCWdvdG8gZXJyX2ZyZWVfcGFyYW07Ci0KLQlyZXR1cm4gTk9USUZZX1NUT1A7Ci0KLWVycl9mcmVlX3BhcmFtOgotCWtmcmVlKHBhcmFtKTsKLWVycl9wdXRfbW9kdWxlOgotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotZXJyOgotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgY3J5cHRvbWdyX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgbXNnLAotCQkJICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIENSWVBUT19NU0dfQUxHX1JFUVVFU1Q6Ci0JCXJldHVybiBjcnlwdG9tZ3Jfc2NoZWR1bGVfcHJvYmUoZGF0YSk7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNyeXB0b21ncl9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGNyeXB0b21ncl9ub3RpZnksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG9tZ3JfaW5pdCh2b2lkKQotewotCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfbm90aWZpZXIoJmNyeXB0b21ncl9ub3RpZmllcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjcnlwdG9tZ3JfZXhpdCh2b2lkKQotewotCWludCBlcnIgPSBjcnlwdG9fdW5yZWdpc3Rlcl9ub3RpZmllcigmY3J5cHRvbWdyX25vdGlmaWVyKTsKLQlCVUdfT04oZXJyKTsKLX0KLQotbW9kdWxlX2luaXQoY3J5cHRvbWdyX2luaXQpOwotbW9kdWxlX2V4aXQoY3J5cHRvbWdyX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNyeXB0byBBbGdvcml0aG0gTWFuYWdlciIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VzZXFpdi5jIGIvY3J5cHRvL2VzZXFpdi5jCmluZGV4IDg4MWQzMDkuLjJhMzQyYzggMTAwNjQ0Ci0tLSBhL2NyeXB0by9lc2VxaXYuYworKysgYi9jcnlwdG8vZXNlcWl2LmMKQEAgLTE2LDEzICsxNiwxMyBAQAogICovCiAKICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvc2tjaXBoZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vcm5nLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NjYXR0ZXJ3YWxrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMTYzLDE3ICsxNjMsMjIgQEAKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmdlbml2ID0gc2tjaXBoZXJfZ2l2Y3J5cHRfcmVxdGZtKHJlcSk7CiAJc3RydWN0IGVzZXFpdl9jdHggKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eChnZW5pdik7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJmN0eC0+bG9jayk7CiAJaWYgKGNyeXB0b19hYmxrY2lwaGVyX2NydChnZW5pdiktPmdpdmVuY3J5cHQgIT0gZXNlcWl2X2dpdmVuY3J5cHRfZmlyc3QpCiAJCWdvdG8gdW5sb2NrOwogCiAJY3J5cHRvX2FibGtjaXBoZXJfY3J0KGdlbml2KS0+Z2l2ZW5jcnlwdCA9IGVzZXFpdl9naXZlbmNyeXB0OwotCWdldF9yYW5kb21fYnl0ZXMoY3R4LT5zYWx0LCBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoZ2VuaXYpKTsKKwllcnIgPSBjcnlwdG9fcm5nX2dldF9ieXRlcyhjcnlwdG9fZGVmYXVsdF9ybmcsIGN0eC0+c2FsdCwKKwkJCQkgICBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoZ2VuaXYpKTsKIAogdW5sb2NrOgogCXNwaW5fdW5sb2NrX2JoKCZjdHgtPmxvY2spOwogCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCXJldHVybiBlc2VxaXZfZ2l2ZW5jcnlwdChyZXEpOwogfQogCkBAIC0yMTYsOSArMjIxLDEzIEBACiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKIAlpbnQgZXJyOwogCisJZXJyID0gY3J5cHRvX2dldF9kZWZhdWx0X3JuZygpOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKIAlpbnN0ID0gc2tjaXBoZXJfZ2VuaXZfYWxsb2MoJmVzZXFpdl90bXBsLCB0YiwgMCwgMCk7CiAJaWYgKElTX0VSUihpbnN0KSkKLQkJZ290byBvdXQ7CisJCWdvdG8gcHV0X3JuZzsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKGluc3QtPmFsZy5jcmFfYWJsa2NpcGhlci5pdnNpemUgIT0gaW5zdC0+YWxnLmNyYV9ibG9ja3NpemUpCkBAIC0yMzgsMjIgKzI0NywzNiBAQAogZnJlZV9pbnN0OgogCXNrY2lwaGVyX2dlbml2X2ZyZWUoaW5zdCk7CiAJaW5zdCA9IEVSUl9QVFIoZXJyKTsKK3B1dF9ybmc6CisJY3J5cHRvX3B1dF9kZWZhdWx0X3JuZygpOwogCWdvdG8gb3V0OwogfQogCitzdGF0aWMgdm9pZCBlc2VxaXZfZnJlZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0KQoreworCXNrY2lwaGVyX2dlbml2X2ZyZWUoaW5zdCk7CisJY3J5cHRvX3B1dF9kZWZhdWx0X3JuZygpOworfQorCiBzdGF0aWMgc3RydWN0IGNyeXB0b190ZW1wbGF0ZSBlc2VxaXZfdG1wbCA9IHsKIAkubmFtZSA9ICJlc2VxaXYiLAogCS5hbGxvYyA9IGVzZXFpdl9hbGxvYywKLQkuZnJlZSA9IHNrY2lwaGVyX2dlbml2X2ZyZWUsCisJLmZyZWUgPSBlc2VxaXZfZnJlZSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCi1pbnQgX19pbml0IGVzZXFpdl9tb2R1bGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXNlcWl2X21vZHVsZV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZSgmZXNlcWl2X3RtcGwpOwogfQogCi12b2lkIF9fZXhpdCBlc2VxaXZfbW9kdWxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBlc2VxaXZfbW9kdWxlX2V4aXQodm9pZCkKIHsKIAljcnlwdG9fdW5yZWdpc3Rlcl90ZW1wbGF0ZSgmZXNlcWl2X3RtcGwpOwogfQorCittb2R1bGVfaW5pdChlc2VxaXZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoZXNlcWl2X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFbmNyeXB0ZWQgU2VxdWVuY2UgTnVtYmVyIElWIEdlbmVyYXRvciIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2ZpcHMuYyBiL2NyeXB0by9maXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzOTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9maXBzLmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIEZJUFMgMjAwIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE5laWwgSG9ybWFuIDxuaG9ybWFuQHR1eGRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKK2ludCBmaXBzX2VuYWJsZWQ7CitFWFBPUlRfU1lNQk9MX0dQTChmaXBzX2VuYWJsZWQpOworCisvKiBQcm9jZXNzIGtlcm5lbCBjb21tYW5kLWxpbmUgcGFyYW1ldGVyIGF0IGJvb3QgdGltZS4gZmlwcz0wIG9yIGZpcHM9MSAqLworc3RhdGljIGludCBmaXBzX2VuYWJsZShjaGFyICpzdHIpCit7CisJZmlwc19lbmFibGVkID0gISFzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZmlwcyBtb2RlOiAlc1xuIiwKKwkJZmlwc19lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImZpcHM9IiwgZmlwc19lbmFibGUpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCA2ODNmY2IyLi44ZWY3MmQ3IDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtMjYsNiArMjYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2lmZGVmIENPTkZJR19DUllQVE9fRklQUworZXh0ZXJuIGludCBmaXBzX2VuYWJsZWQ7CisjZWxzZQorI2RlZmluZSBmaXBzX2VuYWJsZWQgMAorI2VuZGlmCisKIC8qIENyeXB0byBub3RpZmljYXRpb24gZXZlbnRzLiAqLwogZW51bSB7CiAJQ1JZUFRPX01TR19BTEdfUkVRVUVTVCwKQEAgLTgyLDcgKzg4LDcgQEAKIH0KIAogc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19tb2RfZ2V0KHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOwotc3RydWN0IGNyeXB0b19hbGcgKl9fY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogCiBpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKQEAgLTk0LDkgKzEwMCwxMSBAQAogdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogdm9pZCBjcnlwdG9fZXhpdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CiAKK3N0cnVjdCBjcnlwdG9fbGFydmFsICpjcnlwdG9fbGFydmFsX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiB2b2lkIGNyeXB0b19sYXJ2YWxfa2lsbChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fbGFydmFsX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogdm9pZCBjcnlwdG9fbGFydmFsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7Cit2b2lkIGNyeXB0b19hbGdfdGVzdGVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlcnIpOwogCiB2b2lkIGNyeXB0b19zaG9vdF9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CiBzdHJ1Y3QgY3J5cHRvX3RmbSAqX19jcnlwdG9fYWxsb2NfdGZtKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiB0eXBlLApAQCAtMTA3LDYgKzExNSwxMCBAQAogCiBpbnQgY3J5cHRvX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogaW50IGNyeXB0b191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IGNyeXB0b19wcm9iaW5nX25vdGlmeSh1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdik7CisKK2ludCBfX2luaXQgdGVzdG1ncl9pbml0KHZvaWQpOwordm9pZCB0ZXN0bWdyX2V4aXQodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYWxnX3B1dChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogewpAQCAtMTM5LDkgKzE1MSw5IEBACiAJcmV0dXJuIGFsZy0+Y3JhX2ZsYWdzICYgKENSWVBUT19BTEdfREVBRCB8IENSWVBUT19BTEdfRFlJTkcpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fbm90aWZ5KHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQorc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19ub3RpZnkodW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpCiB7Ci0JcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNyeXB0b19jaGFpbiwgdmFsLCB2KTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcnlwdG9fY2hhaW4sIHZhbCwgdik7CiB9CiAKICNlbmRpZgkvKiBfQ1JZUFRPX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9rcm5nLmMgYi9jcnlwdG8va3JuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjhiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8va3JuZy5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBSTkcgaW1wbGVtZW50YXRpb24gdXNpbmcgc3RhbmRhcmQga2VybmVsIFJORy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL3JuZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworc3RhdGljIGludCBrcm5nX2dldF9yYW5kb20oc3RydWN0IGNyeXB0b19ybmcgKnRmbSwgdTggKnJkYXRhLCB1bnNpZ25lZCBpbnQgZGxlbikKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKHJkYXRhLCBkbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrcm5nX3Jlc2V0KHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGtybmdfYWxnID0geworCS5jcmFfbmFtZQkJPSAic3Rkcm5nIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0gImtybmciLAorCS5jcmFfcHJpb3JpdHkJCT0gMjAwLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX1JORywKKwkuY3JhX2N0eHNpemUJCT0gMCwKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ybmdfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0gTElTVF9IRUFEX0lOSVQoa3JuZ19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0geworCQkucm5nID0geworCQkJLnJuZ19tYWtlX3JhbmRvbQk9IGtybmdfZ2V0X3JhbmRvbSwKKwkJCS5ybmdfcmVzZXQJCT0ga3JuZ19yZXNldCwKKwkJCS5zZWVkc2l6ZQkJPSAwLAorCQl9CisJfQorfTsKKworCisvKiBNb2R1bGUgaW5pdGFsaXphdGlvbiAqLworc3RhdGljIGludCBfX2luaXQga3JuZ19tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZrcm5nX2FsZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrcm5nX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZrcm5nX2FsZyk7CisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdChrcm5nX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGtybmdfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIktlcm5lbCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciIpOworTU9EVUxFX0FMSUFTKCJzdGRybmciKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9wcm9jLmMgYi9jcnlwdG8vcHJvYy5jCmluZGV4IDAyZmY1NjcuLjM3YTEzZDAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9wcm9jLmMKKysrIGIvY3J5cHRvL3Byb2MuYwpAQCAtMTksOCArMTksNTMgQEAKICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0ZJUFMKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGNyeXB0b19zeXNjdGxfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSAgICAgICA9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUgICAgICAgPSAiZmlwc19lbmFibGVkIiwKKwkJLmRhdGEgICAgICAgICAgID0gJmZpcHNfZW5hYmxlZCwKKwkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICAgICAgICA9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGNyeXB0b19kaXJfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSAgICAgICA9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUgICAgICAgPSAiY3J5cHRvIiwKKwkJLm1vZGUgICAgICAgICAgID0gMDU1NSwKKwkJLmNoaWxkICAgICAgICAgID0gY3J5cHRvX3N5c2N0bF90YWJsZQorCX0sCisJeworCQkuY3RsX25hbWUgPSAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmNyeXB0b19zeXNjdGxzOworCitzdGF0aWMgdm9pZCBjcnlwdG9fcHJvY19maXBzX2luaXQodm9pZCkKK3sKKwljcnlwdG9fc3lzY3RscyA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShjcnlwdG9fZGlyX3RhYmxlKTsKK30KKworc3RhdGljIHZvaWQgY3J5cHRvX3Byb2NfZmlwc19leGl0KHZvaWQpCit7CisJaWYgKGNyeXB0b19zeXNjdGxzKQorCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShjcnlwdG9fc3lzY3Rscyk7Cit9CisjZWxzZQorI2RlZmluZSBjcnlwdG9fcHJvY19maXBzX2luaXQoKQorI2RlZmluZSBjcnlwdG9fcHJvY19maXBzX2V4aXQoKQorI2VuZGlmCisKIHN0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJZG93bl9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7CkBAIC00Niw4ICs5MSwxMSBAQAogCXNlcV9wcmludGYobSwgIm1vZHVsZSAgICAgICA6ICVzXG4iLCBtb2R1bGVfbmFtZShhbGctPmNyYV9tb2R1bGUpKTsKIAlzZXFfcHJpbnRmKG0sICJwcmlvcml0eSAgICAgOiAlZFxuIiwgYWxnLT5jcmFfcHJpb3JpdHkpOwogCXNlcV9wcmludGYobSwgInJlZmNudCAgICAgICA6ICVkXG4iLCBhdG9taWNfcmVhZCgmYWxnLT5jcmFfcmVmY250KSk7CisJc2VxX3ByaW50ZihtLCAic2VsZnRlc3QgICAgIDogJXNcbiIsCisJCSAgIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVEVTVEVEKSA/CisJCSAgICJwYXNzZWQiIDogInVua25vd24iKTsKIAkKLQlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgKENSWVBUT19BTEdfVFlQRV9NQVNLIHwgQ1JZUFRPX0FMR19MQVJWQUwpKSB7CiAJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgogCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBjaXBoZXJcbiIpOwogCQlzZXFfcHJpbnRmKG0sICJibG9ja3NpemUgICAgOiAldVxuIiwgYWxnLT5jcmFfYmxvY2tzaXplKTsKQEAgLTY3LDcgKzExNSwxMCBAQAogCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBjb21wcmVzc2lvblxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWlmIChhbGctPmNyYV90eXBlICYmIGFsZy0+Y3JhX3R5cGUtPnNob3cpCisJCWlmIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfTEFSVkFMKSB7CisJCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBsYXJ2YWxcbiIpOworCQkJc2VxX3ByaW50ZihtLCAiZmxhZ3MgICAgICAgIDogMHgleFxuIiwgYWxnLT5jcmFfZmxhZ3MpOworCQl9IGVsc2UgaWYgKGFsZy0+Y3JhX3R5cGUgJiYgYWxnLT5jcmFfdHlwZS0+c2hvdykKIAkJCWFsZy0+Y3JhX3R5cGUtPnNob3cobSwgYWxnKTsKIAkJZWxzZQogCQkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogdW5rbm93blxuIik7CkBAIC0xMDAsOSArMTUxLDExIEBACiB2b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCiB7CiAJcHJvY19jcmVhdGUoImNyeXB0byIsIDAsIE5VTEwsICZwcm9jX2NyeXB0b19vcHMpOworCWNyeXB0b19wcm9jX2ZpcHNfaW5pdCgpOwogfQogCiB2b2lkIF9fZXhpdCBjcnlwdG9fZXhpdF9wcm9jKHZvaWQpCiB7CisJY3J5cHRvX3Byb2NfZmlwc19leGl0KCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImNyeXB0byIsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JuZy5jIGIvY3J5cHRvL3JuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTRiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcm5nLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBSTkcgb3BlcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTmVpbCBIb3JtYW4gPG5ob3JtYW5AdHV4ZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9ybmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK3N0YXRpYyBERUZJTkVfTVVURVgoY3J5cHRvX2RlZmF1bHRfcm5nX2xvY2spOworc3RydWN0IGNyeXB0b19ybmcgKmNyeXB0b19kZWZhdWx0X3JuZzsKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19kZWZhdWx0X3JuZyk7CitzdGF0aWMgaW50IGNyeXB0b19kZWZhdWx0X3JuZ19yZWZjbnQ7CisKK3N0YXRpYyBpbnQgcm5nYXBpX3Jlc2V0KHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbikKK3sKKwl1OCAqYnVmID0gTlVMTDsKKwlpbnQgZXJyOworCisJaWYgKCFzZWVkICYmIHNsZW4pIHsKKwkJYnVmID0ga21hbGxvYyhzbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlnZXRfcmFuZG9tX2J5dGVzKGJ1Ziwgc2xlbik7CisJCXNlZWQgPSBidWY7CisJfQorCisJZXJyID0gY3J5cHRvX3JuZ19hbGcodGZtKS0+cm5nX3Jlc2V0KHRmbSwgc2VlZCwgc2xlbik7CisKKwlrZnJlZShidWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfcm5nX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJc3RydWN0IHJuZ19hbGcgKmFsZyA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX3JuZzsKKwlzdHJ1Y3Qgcm5nX3RmbSAqb3BzID0gJnRmbS0+Y3J0X3JuZzsKKworCW9wcy0+cm5nX2dlbl9yYW5kb20gPSBhbGctPnJuZ19tYWtlX3JhbmRvbTsKKwlvcHMtPnJuZ19yZXNldCA9IHJuZ2FwaV9yZXNldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcnlwdG9fcm5nX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQorCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKK3N0YXRpYyB2b2lkIGNyeXB0b19ybmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogcm5nXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJzZWVkc2l6ZSAgICAgOiAldVxuIiwgYWxnLT5jcmFfcm5nLnNlZWRzaXplKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fcm5nX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCisJCQkJICAgICAgIHUzMiBtYXNrKQoreworCXJldHVybiBhbGctPmNyYV9jdHhzaXplOworfQorCitjb25zdCBzdHJ1Y3QgY3J5cHRvX3R5cGUgY3J5cHRvX3JuZ190eXBlID0geworCS5jdHhzaXplID0gY3J5cHRvX3JuZ19jdHhzaXplLAorCS5pbml0ID0gY3J5cHRvX2luaXRfcm5nX29wcywKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCS5zaG93ID0gY3J5cHRvX3JuZ19zaG93LAorI2VuZGlmCit9OworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JuZ190eXBlKTsKKworaW50IGNyeXB0b19nZXRfZGVmYXVsdF9ybmcodm9pZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JuZyAqcm5nOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZjcnlwdG9fZGVmYXVsdF9ybmdfbG9jayk7CisJaWYgKCFjcnlwdG9fZGVmYXVsdF9ybmcpIHsKKwkJcm5nID0gY3J5cHRvX2FsbG9jX3JuZygic3Rkcm5nIiwgMCwgMCk7CisJCWVyciA9IFBUUl9FUlIocm5nKTsKKwkJaWYgKElTX0VSUihybmcpKQorCQkJZ290byB1bmxvY2s7CisKKwkJZXJyID0gY3J5cHRvX3JuZ19yZXNldChybmcsIE5VTEwsIGNyeXB0b19ybmdfc2VlZHNpemUocm5nKSk7CisJCWlmIChlcnIpIHsKKwkJCWNyeXB0b19mcmVlX3JuZyhybmcpOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQljcnlwdG9fZGVmYXVsdF9ybmcgPSBybmc7CisJfQorCisJY3J5cHRvX2RlZmF1bHRfcm5nX3JlZmNudCsrOworCWVyciA9IDA7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmNyeXB0b19kZWZhdWx0X3JuZ19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZ2V0X2RlZmF1bHRfcm5nKTsKKwordm9pZCBjcnlwdG9fcHV0X2RlZmF1bHRfcm5nKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmY3J5cHRvX2RlZmF1bHRfcm5nX2xvY2spOworCWlmICghLS1jcnlwdG9fZGVmYXVsdF9ybmdfcmVmY250KSB7CisJCWNyeXB0b19mcmVlX3JuZyhjcnlwdG9fZGVmYXVsdF9ybmcpOworCQljcnlwdG9fZGVmYXVsdF9ybmcgPSBOVUxMOworCX0KKwltdXRleF91bmxvY2soJmNyeXB0b19kZWZhdWx0X3JuZ19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19wdXRfZGVmYXVsdF9ybmcpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJhbmRvbSBOdW1iZXIgR2VuZXJ0b3IiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zZXFpdi5jIGIvY3J5cHRvL3NlcWl2LmMKaW5kZXggYjkwM2FhYi4uNWEwMTNhOCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NlcWl2LmMKKysrIGIvY3J5cHRvL3NlcWl2LmMKQEAgLTE1LDExICsxNSwxMSBAQAogCiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2FlYWQuaD4KICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvc2tjaXBoZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vcm5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKQEAgLTE4OSwxNyArMTg5LDIyIEBACiB7CiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpnZW5pdiA9IHNrY2lwaGVyX2dpdmNyeXB0X3JlcXRmbShyZXEpOwogCXN0cnVjdCBzZXFpdl9jdHggKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eChnZW5pdik7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJmN0eC0+bG9jayk7CiAJaWYgKGNyeXB0b19hYmxrY2lwaGVyX2NydChnZW5pdiktPmdpdmVuY3J5cHQgIT0gc2VxaXZfZ2l2ZW5jcnlwdF9maXJzdCkKIAkJZ290byB1bmxvY2s7CiAKIAljcnlwdG9fYWJsa2NpcGhlcl9jcnQoZ2VuaXYpLT5naXZlbmNyeXB0ID0gc2VxaXZfZ2l2ZW5jcnlwdDsKLQlnZXRfcmFuZG9tX2J5dGVzKGN0eC0+c2FsdCwgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGdlbml2KSk7CisJZXJyID0gY3J5cHRvX3JuZ19nZXRfYnl0ZXMoY3J5cHRvX2RlZmF1bHRfcm5nLCBjdHgtPnNhbHQsCisJCQkJICAgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGdlbml2KSk7CiAKIHVubG9jazoKIAlzcGluX3VubG9ja19iaCgmY3R4LT5sb2NrKTsKIAorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gc2VxaXZfZ2l2ZW5jcnlwdChyZXEpOwogfQogCkBAIC0yMDcsMTcgKzIxMiwyMiBAQAogewogCXN0cnVjdCBjcnlwdG9fYWVhZCAqZ2VuaXYgPSBhZWFkX2dpdmNyeXB0X3JlcXRmbShyZXEpOwogCXN0cnVjdCBzZXFpdl9jdHggKmN0eCA9IGNyeXB0b19hZWFkX2N0eChnZW5pdik7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJmN0eC0+bG9jayk7CiAJaWYgKGNyeXB0b19hZWFkX2NydChnZW5pdiktPmdpdmVuY3J5cHQgIT0gc2VxaXZfYWVhZF9naXZlbmNyeXB0X2ZpcnN0KQogCQlnb3RvIHVubG9jazsKIAogCWNyeXB0b19hZWFkX2NydChnZW5pdiktPmdpdmVuY3J5cHQgPSBzZXFpdl9hZWFkX2dpdmVuY3J5cHQ7Ci0JZ2V0X3JhbmRvbV9ieXRlcyhjdHgtPnNhbHQsIGNyeXB0b19hZWFkX2l2c2l6ZShnZW5pdikpOworCWVyciA9IGNyeXB0b19ybmdfZ2V0X2J5dGVzKGNyeXB0b19kZWZhdWx0X3JuZywgY3R4LT5zYWx0LAorCQkJCSAgIGNyeXB0b19hZWFkX2l2c2l6ZShnZW5pdikpOwogCiB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfYmgoJmN0eC0+bG9jayk7CiAKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJcmV0dXJuIHNlcWl2X2FlYWRfZ2l2ZW5jcnlwdChyZXEpOwogfQogCkBAIC0yOTgsMTkgKzMwOCwyNyBAQAogCWlmIChJU19FUlIoYWxndCkpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKKwllcnIgPSBjcnlwdG9fZ2V0X2RlZmF1bHRfcm5nKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwogCWlmICgoYWxndC0+dHlwZSBeIENSWVBUT19BTEdfVFlQRV9BRUFEKSAmIENSWVBUT19BTEdfVFlQRV9NQVNLKQogCQlpbnN0ID0gc2VxaXZfYWJsa2NpcGhlcl9hbGxvYyh0Yik7CiAJZWxzZQogCQlpbnN0ID0gc2VxaXZfYWVhZF9hbGxvYyh0Yik7CiAKIAlpZiAoSVNfRVJSKGluc3QpKQotCQlnb3RvIG91dDsKKwkJZ290byBwdXRfcm5nOwogCiAJaW5zdC0+YWxnLmNyYV9hbGlnbm1hc2sgfD0gX19hbGlnbm9mX18odTMyKSAtIDE7CiAJaW5zdC0+YWxnLmNyYV9jdHhzaXplICs9IHNpemVvZihzdHJ1Y3Qgc2VxaXZfY3R4KTsKIAogb3V0OgogCXJldHVybiBpbnN0OworCitwdXRfcm5nOgorCWNyeXB0b19wdXRfZGVmYXVsdF9ybmcoKTsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHZvaWQgc2VxaXZfZnJlZShzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0KQpAQCAtMzE5LDYgKzMzNyw3IEBACiAJCXNrY2lwaGVyX2dlbml2X2ZyZWUoaW5zdCk7CiAJZWxzZQogCQlhZWFkX2dlbml2X2ZyZWUoaW5zdCk7CisJY3J5cHRvX3B1dF9kZWZhdWx0X3JuZygpOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b190ZW1wbGF0ZSBzZXFpdl90bXBsID0gewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5jIGIvY3J5cHRvL3RjcnlwdC5jCmluZGV4IDY2MzY4MDIuLjI4YTQ1YTEgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuYworKysgYi9jcnlwdG8vdGNyeXB0LmMKQEAgLTE5LDExICsxOSw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KQEAgLTMxLDQ1ICsyOSwyMyBAQAogI2luY2x1ZGUgInRjcnlwdC5oIgogCiAvKgotICogTmVlZCB0byBrbWFsbG9jKCkgbWVtb3J5IGZvciB0ZXN0aW5nLgorICogTmVlZCBzbGFiIG1lbW9yeSBmb3IgdGVzdGluZyAoc2l6ZSBpbiBudW1iZXIgb2YgcGFnZXMpLgogICovCi0jZGVmaW5lIFRWTUVNU0laRQkxNjM4NAotI2RlZmluZSBYQlVGU0laRQkzMjc2OAorI2RlZmluZSBUVk1FTVNJWkUJNAogCiAvKgotICogSW5kZXhlcyBpbnRvIHRoZSB4YnVmIHRvIHNpbXVsYXRlIGNyb3NzLXBhZ2UgYWNjZXNzLgotICovCi0jZGVmaW5lIElEWDEJCTMyCi0jZGVmaW5lIElEWDIJCTMyNDAwCi0jZGVmaW5lIElEWDMJCTEKLSNkZWZpbmUgSURYNAkJODE5MwotI2RlZmluZSBJRFg1CQkyMjIyMgotI2RlZmluZSBJRFg2CQkxNzEwMQotI2RlZmluZSBJRFg3CQkyNzMzMwotI2RlZmluZSBJRFg4CQkzMDAwCi0KLS8qCi0qIFVzZWQgYnkgdGVzdF9jaXBoZXIoKQorKiBVc2VkIGJ5IHRlc3RfY2lwaGVyX3NwZWVkKCkKICovCiAjZGVmaW5lIEVOQ1JZUFQgMQogI2RlZmluZSBERUNSWVBUIDAKIAotc3RydWN0IHRjcnlwdF9yZXN1bHQgewotCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Ci0JaW50IGVycjsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgSURYWzhdID0geyBJRFgxLCBJRFgyLCBJRFgzLCBJRFg0LCBJRFg1LCBJRFg2LCBJRFg3LCBJRFg4IH07Ci0KIC8qCiAgKiBVc2VkIGJ5IHRlc3RfY2lwaGVyX3NwZWVkKCkKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBzZWM7CiAKIHN0YXRpYyBpbnQgbW9kZTsKLXN0YXRpYyBjaGFyICp4YnVmOwotc3RhdGljIGNoYXIgKmF4YnVmOwotc3RhdGljIGNoYXIgKnR2bWVtOworc3RhdGljIGNoYXIgKnR2bWVtW1RWTUVNU0laRV07CiAKIHN0YXRpYyBjaGFyICpjaGVja1tdID0gewogCSJkZXMiLCAibWQ1IiwgImRlczNfZWRlIiwgInJvdDEzIiwgInNoYTEiLCAic2hhMjI0IiwgInNoYTI1NiIsCkBAIC04MCw2NTUgKzU2LDEzIEBACiAJImx6byIsICJjdHMiLCBOVUxMCiB9OwogCi1zdGF0aWMgdm9pZCBoZXhkdW1wKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbnQgdGVzdF9jaXBoZXJfamlmZmllcyhzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGludCBlbmMsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IGJsZW4sIGludCBzZWMpCiB7Ci0JcHJpbnRfaGV4X2R1bXAoS0VSTl9DT05ULCAiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJMTYsIDEsCi0JCQlidWYsIGxlbiwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCB0Y3J5cHRfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCBlcnIpCi17Ci0Jc3RydWN0IHRjcnlwdF9yZXN1bHQgKnJlcyA9IHJlcS0+ZGF0YTsKLQotCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQotCQlyZXR1cm47Ci0KLQlyZXMtPmVyciA9IGVycjsKLQljb21wbGV0ZSgmcmVzLT5jb21wbGV0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQgdGVzdF9oYXNoKGNoYXIgKmFsZ28sIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgKnRlbXBsYXRlLAotCQkgICAgICB1bnNpZ25lZCBpbnQgdGNvdW50KQotewotCXVuc2lnbmVkIGludCBpLCBqLCBrLCB0ZW1wOwotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1s4XTsKLQljaGFyIHJlc3VsdFs2NF07Ci0Jc3RydWN0IGNyeXB0b19haGFzaCAqdGZtOwotCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IHRjcnlwdF9yZXN1bHQgdHJlc3VsdDsKLQlpbnQgcmV0OwotCXZvaWQgKmhhc2hfYnVmZjsKLQotCXByaW50aygiXG50ZXN0aW5nICVzXG4iLCBhbGdvKTsKLQotCWluaXRfY29tcGxldGlvbigmdHJlc3VsdC5jb21wbGV0aW9uKTsKLQotCXRmbSA9IGNyeXB0b19hbGxvY19haGFzaChhbGdvLCAwLCAwKTsKLQlpZiAoSVNfRVJSKHRmbSkpIHsKLQkJcHJpbnRrKCJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAlbGRcbiIsIGFsZ28sCi0JCSAgICAgICBQVFJfRVJSKHRmbSkpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVxID0gYWhhc2hfcmVxdWVzdF9hbGxvYyh0Zm0sIEdGUF9LRVJORUwpOwotCWlmICghcmVxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yICVzXG4iLCBhbGdvKTsKLQkJZ290byBvdXRfbm9yZXE7Ci0JfQotCWFoYXNoX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCi0JCQkJICAgdGNyeXB0X2NvbXBsZXRlLCAmdHJlc3VsdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdGNvdW50OyBpKyspIHsKLQkJcHJpbnRrKCJ0ZXN0ICV1OlxuIiwgaSArIDEpOwotCQltZW1zZXQocmVzdWx0LCAwLCA2NCk7Ci0KLQkJaGFzaF9idWZmID0ga3phbGxvYyh0ZW1wbGF0ZVtpXS5wc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaGFzaF9idWZmKQotCQkJY29udGludWU7Ci0KLQkJbWVtY3B5KGhhc2hfYnVmZiwgdGVtcGxhdGVbaV0ucGxhaW50ZXh0LCB0ZW1wbGF0ZVtpXS5wc2l6ZSk7Ci0JCXNnX2luaXRfb25lKCZzZ1swXSwgaGFzaF9idWZmLCB0ZW1wbGF0ZVtpXS5wc2l6ZSk7Ci0KLQkJaWYgKHRlbXBsYXRlW2ldLmtzaXplKSB7Ci0JCQljcnlwdG9fYWhhc2hfY2xlYXJfZmxhZ3ModGZtLCB+MCk7Ci0JCQlyZXQgPSBjcnlwdG9fYWhhc2hfc2V0a2V5KHRmbSwgdGVtcGxhdGVbaV0ua2V5LAotCQkJCQkJICB0ZW1wbGF0ZVtpXS5rc2l6ZSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKCJzZXRrZXkoKSBmYWlsZWQgcmV0PSVkXG4iLCByZXQpOwotCQkJCWtmcmVlKGhhc2hfYnVmZik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQotCQlhaGFzaF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCByZXN1bHQsIHRlbXBsYXRlW2ldLnBzaXplKTsKLQkJcmV0ID0gY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAtRUlOUFJPR1JFU1M6Ci0JCWNhc2UgLUVCVVNZOgotCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAotCQkJCSZ0cmVzdWx0LmNvbXBsZXRpb24pOwotCQkJaWYgKCFyZXQgJiYgIShyZXQgPSB0cmVzdWx0LmVycikpIHsKLQkJCQlJTklUX0NPTVBMRVRJT04odHJlc3VsdC5jb21wbGV0aW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJkaWdlc3QgKCkgZmFpbGVkIHJldD0lZFxuIiwgcmV0KTsKLQkJCWtmcmVlKGhhc2hfYnVmZik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWhleGR1bXAocmVzdWx0LCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pKTsKLQkJcHJpbnRrKCIlc1xuIiwKLQkJICAgICAgIG1lbWNtcChyZXN1bHQsIHRlbXBsYXRlW2ldLmRpZ2VzdCwKLQkJCSAgICAgIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSkpID8KLQkJICAgICAgICJmYWlsIiA6ICJwYXNzIik7Ci0JCWtmcmVlKGhhc2hfYnVmZik7Ci0JfQotCi0JcHJpbnRrKCJ0ZXN0aW5nICVzIGFjcm9zcyBwYWdlc1xuIiwgYWxnbyk7Ci0KLQkvKiBzZXR1cCB0aGUgZHVtbXkgYnVmZmVyIGZpcnN0ICovCi0JbWVtc2V0KHhidWYsIDAsIFhCVUZTSVpFKTsKLQotCWogPSAwOwotCWZvciAoaSA9IDA7IGkgPCB0Y291bnQ7IGkrKykgewotCQlpZiAodGVtcGxhdGVbaV0ubnApIHsKLQkJCWorKzsKLQkJCXByaW50aygidGVzdCAldTpcbiIsIGopOwotCQkJbWVtc2V0KHJlc3VsdCwgMCwgNjQpOwotCi0JCQl0ZW1wID0gMDsKLQkJCXNnX2luaXRfdGFibGUoc2csIHRlbXBsYXRlW2ldLm5wKTsKLQkJCWZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7Ci0JCQkJbWVtY3B5KCZ4YnVmW0lEWFtrXV0sCi0JCQkJICAgICAgIHRlbXBsYXRlW2ldLnBsYWludGV4dCArIHRlbXAsCi0JCQkJICAgICAgIHRlbXBsYXRlW2ldLnRhcFtrXSk7Ci0JCQkJdGVtcCArPSB0ZW1wbGF0ZVtpXS50YXBba107Ci0JCQkJc2dfc2V0X2J1Zigmc2dba10sICZ4YnVmW0lEWFtrXV0sCi0JCQkJCSAgICB0ZW1wbGF0ZVtpXS50YXBba10pOwotCQkJfQotCi0JCQlpZiAodGVtcGxhdGVbaV0ua3NpemUpIHsKLQkJCQljcnlwdG9fYWhhc2hfY2xlYXJfZmxhZ3ModGZtLCB+MCk7Ci0JCQkJcmV0ID0gY3J5cHRvX2FoYXNoX3NldGtleSh0Zm0sIHRlbXBsYXRlW2ldLmtleSwKLQkJCQkJCQkgIHRlbXBsYXRlW2ldLmtzaXplKTsKLQotCQkJCWlmIChyZXQpIHsKLQkJCQkJcHJpbnRrKCJzZXRrZXkoKSBmYWlsZWQgcmV0PSVkXG4iLCByZXQpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHJlc3VsdCwKLQkJCQkJCXRlbXBsYXRlW2ldLnBzaXplKTsKLQkJCXJldCA9IGNyeXB0b19haGFzaF9kaWdlc3QocmVxKTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCWNhc2UgLUVCVVNZOgotCQkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKLQkJCQkJJnRyZXN1bHQuY29tcGxldGlvbik7Ci0JCQkJaWYgKCFyZXQgJiYgIShyZXQgPSB0cmVzdWx0LmVycikpIHsKLQkJCQkJSU5JVF9DT01QTEVUSU9OKHRyZXN1bHQuY29tcGxldGlvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJkaWdlc3QgKCkgZmFpbGVkIHJldD0lZFxuIiwgcmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJaGV4ZHVtcChyZXN1bHQsIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSkpOwotCQkJcHJpbnRrKCIlc1xuIiwKLQkJCSAgICAgICBtZW1jbXAocmVzdWx0LCB0ZW1wbGF0ZVtpXS5kaWdlc3QsCi0JCQkJICAgICAgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKSkgPwotCQkJICAgICAgICJmYWlsIiA6ICJwYXNzIik7Ci0JCX0KLQl9Ci0KLW91dDoKLQlhaGFzaF9yZXF1ZXN0X2ZyZWUocmVxKTsKLW91dF9ub3JlcToKLQljcnlwdG9fZnJlZV9haGFzaCh0Zm0pOwotfQotCi1zdGF0aWMgdm9pZCB0ZXN0X2FlYWQoY2hhciAqYWxnbywgaW50IGVuYywgc3RydWN0IGFlYWRfdGVzdHZlYyAqdGVtcGxhdGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCB0Y291bnQpCi17Ci0JdW5zaWduZWQgaW50IHJldCwgaSwgaiwgaywgbiwgdGVtcDsKLQljaGFyICpxOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtOwotCWNoYXIgKmtleTsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzhdOwotCXN0cnVjdCBzY2F0dGVybGlzdCBhc2dbOF07Ci0JY29uc3QgY2hhciAqZTsKLQlzdHJ1Y3QgdGNyeXB0X3Jlc3VsdCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IGF1dGhzaXplOwotCXZvaWQgKmlucHV0OwotCXZvaWQgKmFzc29jOwotCWNoYXIgaXZbTUFYX0lWTEVOXTsKLQotCWlmIChlbmMgPT0gRU5DUllQVCkKLQkJZSA9ICJlbmNyeXB0aW9uIjsKLQllbHNlCi0JCWUgPSAiZGVjcnlwdGlvbiI7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJcbnRlc3RpbmcgJXMgJXNcbiIsIGFsZ28sIGUpOwotCi0JaW5pdF9jb21wbGV0aW9uKCZyZXN1bHQuY29tcGxldGlvbik7Ci0KLQl0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChhbGdvLCAwLCAwKTsKLQotCWlmIChJU19FUlIodGZtKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAlbGRcbiIsCi0JCSAgICAgICBhbGdvLCBQVFJfRVJSKHRmbSkpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlcXVlc3QgZm9yICVzXG4iLCBhbGdvKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAotCQkJCSAgdGNyeXB0X2NvbXBsZXRlLCAmcmVzdWx0KTsKLQotCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgdGNvdW50OyBpKyspIHsKLQkJaWYgKCF0ZW1wbGF0ZVtpXS5ucCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAidGVzdCAldSAoJWQgYml0IGtleSk6XG4iLAotCQkJICAgICAgICsraiwgdGVtcGxhdGVbaV0ua2xlbiAqIDgpOwotCi0JCQkvKiBzb21lIHRlcG1wbGF0ZXMgaGF2ZSBubyBpbnB1dCBkYXRhIGJ1dCB0aGV5IHdpbGwKLQkJCSAqIHRvdWNoIGlucHV0Ci0JCQkgKi8KLQkJCWlucHV0ID0ga3phbGxvYyh0ZW1wbGF0ZVtpXS5pbGVuICsgdGVtcGxhdGVbaV0ucmxlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWlucHV0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlhc3NvYyA9IGt6YWxsb2ModGVtcGxhdGVbaV0uYWxlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWFzc29jKSB7Ci0JCQkJa2ZyZWUoaW5wdXQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQltZW1jcHkoaW5wdXQsIHRlbXBsYXRlW2ldLmlucHV0LCB0ZW1wbGF0ZVtpXS5pbGVuKTsKLQkJCW1lbWNweShhc3NvYywgdGVtcGxhdGVbaV0uYXNzb2MsIHRlbXBsYXRlW2ldLmFsZW4pOwotCQkJaWYgKHRlbXBsYXRlW2ldLml2KQotCQkJCW1lbWNweShpdiwgdGVtcGxhdGVbaV0uaXYsIE1BWF9JVkxFTik7Ci0JCQllbHNlCi0JCQkJbWVtc2V0KGl2LCAwLCBNQVhfSVZMRU4pOwotCi0JCQljcnlwdG9fYWVhZF9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKLQkJCWlmICh0ZW1wbGF0ZVtpXS53aykKLQkJCQljcnlwdG9fYWVhZF9zZXRfZmxhZ3MoCi0JCQkJCXRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwotCi0JCQlpZiAodGVtcGxhdGVbaV0ua2V5KQotCQkJCWtleSA9IHRlbXBsYXRlW2ldLmtleTsKLQkJCWVsc2UKLQkJCQlrZXkgPSBremFsbG9jKHRlbXBsYXRlW2ldLmtsZW4sIEdGUF9LRVJORUwpOwotCi0JCQlyZXQgPSBjcnlwdG9fYWVhZF9zZXRrZXkodGZtLCBrZXksCi0JCQkJCQkgdGVtcGxhdGVbaV0ua2xlbik7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAic2V0a2V5KCkgZmFpbGVkIGZsYWdzPSV4XG4iLAotCQkJCSAgICAgICBjcnlwdG9fYWVhZF9nZXRfZmxhZ3ModGZtKSk7Ci0KLQkJCQlpZiAoIXRlbXBsYXRlW2ldLmZhaWwpCi0JCQkJCWdvdG8gbmV4dF9vbmU7Ci0JCQl9Ci0KLQkJCWF1dGhzaXplID0gYWJzKHRlbXBsYXRlW2ldLnJsZW4gLSB0ZW1wbGF0ZVtpXS5pbGVuKTsKLQkJCXJldCA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKHRmbSwgYXV0aHNpemUpOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgImZhaWxlZCB0byBzZXQgYXV0aHNpemUgPSAldVxuIiwKLQkJCQkgICAgICAgYXV0aHNpemUpOwotCQkJCWdvdG8gbmV4dF9vbmU7Ci0JCQl9Ci0KLQkJCXNnX2luaXRfb25lKCZzZ1swXSwgaW5wdXQsCi0JCQkJICAgIHRlbXBsYXRlW2ldLmlsZW4gKyAoZW5jID8gYXV0aHNpemUgOiAwKSk7Ci0KLQkJCXNnX2luaXRfb25lKCZhc2dbMF0sIGFzc29jLCB0ZW1wbGF0ZVtpXS5hbGVuKTsKLQotCQkJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywKLQkJCQkJICAgICAgIHRlbXBsYXRlW2ldLmlsZW4sIGl2KTsKLQotCQkJYWVhZF9yZXF1ZXN0X3NldF9hc3NvYyhyZXEsIGFzZywgdGVtcGxhdGVbaV0uYWxlbik7Ci0KLQkJCXJldCA9IGVuYyA/Ci0JCQkJY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpIDoKLQkJCQljcnlwdG9fYWVhZF9kZWNyeXB0KHJlcSk7Ci0KLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCWNhc2UgLUVCVVNZOgotCQkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKLQkJCQkJJnJlc3VsdC5jb21wbGV0aW9uKTsKLQkJCQlpZiAoIXJldCAmJiAhKHJldCA9IHJlc3VsdC5lcnIpKSB7Ci0JCQkJCUlOSVRfQ09NUExFVElPTihyZXN1bHQuY29tcGxldGlvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgKCkgZmFpbGVkIGVycj0lZFxuIiwKLQkJCQkgICAgICAgZSwgLXJldCk7Ci0JCQkJZ290byBuZXh0X29uZTsKLQkJCX0KLQotCQkJcSA9IGlucHV0OwotCQkJaGV4ZHVtcChxLCB0ZW1wbGF0ZVtpXS5ybGVuKTsKLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZW5jL2RlYzogJXNcbiIsCi0JCQkgICAgICAgbWVtY21wKHEsIHRlbXBsYXRlW2ldLnJlc3VsdCwKLQkJCQkgICAgICB0ZW1wbGF0ZVtpXS5ybGVuKSA/ICJmYWlsIiA6ICJwYXNzIik7Ci1uZXh0X29uZToKLQkJCWlmICghdGVtcGxhdGVbaV0ua2V5KQotCQkJCWtmcmVlKGtleSk7Ci0JCQlrZnJlZShhc3NvYyk7Ci0JCQlrZnJlZShpbnB1dCk7Ci0JCX0KLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJcbnRlc3RpbmcgJXMgJXMgYWNyb3NzIHBhZ2VzIChjaHVua2luZylcbiIsIGFsZ28sIGUpOwotCW1lbXNldChheGJ1ZiwgMCwgWEJVRlNJWkUpOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCB0Y291bnQ7IGkrKykgewotCQlpZiAodGVtcGxhdGVbaV0ubnApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInRlc3QgJXUgKCVkIGJpdCBrZXkpOlxuIiwKLQkJCSAgICAgICArK2osIHRlbXBsYXRlW2ldLmtsZW4gKiA4KTsKLQotCQkJaWYgKHRlbXBsYXRlW2ldLml2KQotCQkJCW1lbWNweShpdiwgdGVtcGxhdGVbaV0uaXYsIE1BWF9JVkxFTik7Ci0JCQllbHNlCi0JCQkJbWVtc2V0KGl2LCAwLCBNQVhfSVZMRU4pOwotCi0JCQljcnlwdG9fYWVhZF9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKLQkJCWlmICh0ZW1wbGF0ZVtpXS53aykKLQkJCQljcnlwdG9fYWVhZF9zZXRfZmxhZ3MoCi0JCQkJCXRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwotCQkJa2V5ID0gdGVtcGxhdGVbaV0ua2V5OwotCi0JCQlyZXQgPSBjcnlwdG9fYWVhZF9zZXRrZXkodGZtLCBrZXksIHRlbXBsYXRlW2ldLmtsZW4pOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0lORk8gInNldGtleSgpIGZhaWxlZCBmbGFncz0leFxuIiwKLQkJCQkgICAgICAgY3J5cHRvX2FlYWRfZ2V0X2ZsYWdzKHRmbSkpOwotCi0JCQkJaWYgKCF0ZW1wbGF0ZVtpXS5mYWlsKQotCQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJbWVtc2V0KHhidWYsIDAsIFhCVUZTSVpFKTsKLQkJCXNnX2luaXRfdGFibGUoc2csIHRlbXBsYXRlW2ldLm5wKTsKLQkJCWZvciAoayA9IDAsIHRlbXAgPSAwOyBrIDwgdGVtcGxhdGVbaV0ubnA7IGsrKykgewotCQkJCW1lbWNweSgmeGJ1ZltJRFhba11dLAotCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS5pbnB1dCArIHRlbXAsCi0JCQkJICAgICAgIHRlbXBsYXRlW2ldLnRhcFtrXSk7Ci0JCQkJdGVtcCArPSB0ZW1wbGF0ZVtpXS50YXBba107Ci0JCQkJc2dfc2V0X2J1Zigmc2dba10sICZ4YnVmW0lEWFtrXV0sCi0JCQkJCSAgIHRlbXBsYXRlW2ldLnRhcFtrXSk7Ci0JCQl9Ci0KLQkJCWF1dGhzaXplID0gYWJzKHRlbXBsYXRlW2ldLnJsZW4gLSB0ZW1wbGF0ZVtpXS5pbGVuKTsKLQkJCXJldCA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKHRmbSwgYXV0aHNpemUpOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgImZhaWxlZCB0byBzZXQgYXV0aHNpemUgPSAldVxuIiwKLQkJCQkgICAgICAgYXV0aHNpemUpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlpZiAoZW5jKQotCQkJCXNnW2sgLSAxXS5sZW5ndGggKz0gYXV0aHNpemU7Ci0KLQkJCXNnX2luaXRfdGFibGUoYXNnLCB0ZW1wbGF0ZVtpXS5hbnApOwotCQkJZm9yIChrID0gMCwgdGVtcCA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5hbnA7IGsrKykgewotCQkJCW1lbWNweSgmYXhidWZbSURYW2tdXSwKLQkJCQkgICAgICAgdGVtcGxhdGVbaV0uYXNzb2MgKyB0ZW1wLAotCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS5hdGFwW2tdKTsKLQkJCQl0ZW1wICs9IHRlbXBsYXRlW2ldLmF0YXBba107Ci0JCQkJc2dfc2V0X2J1ZigmYXNnW2tdLCAmYXhidWZbSURYW2tdXSwKLQkJCQkJICAgdGVtcGxhdGVbaV0uYXRhcFtrXSk7Ci0JCQl9Ci0KLQkJCWFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZywgc2csCi0JCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS5pbGVuLAotCQkJCQkgICAgICAgaXYpOwotCi0JCQlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKHJlcSwgYXNnLCB0ZW1wbGF0ZVtpXS5hbGVuKTsKLQotCQkJcmV0ID0gZW5jID8KLQkJCQljcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOgotCQkJCWNyeXB0b19hZWFkX2RlY3J5cHQocmVxKTsKLQotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgMDoKLQkJCQlicmVhazsKLQkJCWNhc2UgLUVJTlBST0dSRVNTOgotCQkJY2FzZSAtRUJVU1k6Ci0JCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAotCQkJCQkmcmVzdWx0LmNvbXBsZXRpb24pOwotCQkJCWlmICghcmV0ICYmICEocmV0ID0gcmVzdWx0LmVycikpIHsKLQkJCQkJSU5JVF9DT01QTEVUSU9OKHJlc3VsdC5jb21wbGV0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlcyAoKSBmYWlsZWQgZXJyPSVkXG4iLAotCQkJCSAgICAgICBlLCAtcmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJZm9yIChrID0gMCwgdGVtcCA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAicGFnZSAldVxuIiwgayk7Ci0JCQkJcSA9ICZ4YnVmW0lEWFtrXV07Ci0KLQkJCQluID0gdGVtcGxhdGVbaV0udGFwW2tdOwotCQkJCWlmIChrID09IHRlbXBsYXRlW2ldLm5wIC0gMSkKLQkJCQkJbiArPSBlbmMgPyBhdXRoc2l6ZSA6IC1hdXRoc2l6ZTsKLQkJCQloZXhkdW1wKHEsIG4pOwotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLAotCQkJCSAgICAgICBtZW1jbXAocSwgdGVtcGxhdGVbaV0ucmVzdWx0ICsgdGVtcCwgbikgPwotCQkJCSAgICAgICAiZmFpbCIgOiAicGFzcyIpOwotCi0JCQkJcSArPSBuOwotCQkJCWlmIChrID09IHRlbXBsYXRlW2ldLm5wIC0gMSAmJiAhZW5jKSB7Ci0JCQkJCWlmIChtZW1jbXAocSwgdGVtcGxhdGVbaV0uaW5wdXQgKwotCQkJCQkJICAgICAgdGVtcCArIG4sIGF1dGhzaXplKSkKLQkJCQkJCW4gPSBhdXRoc2l6ZTsKLQkJCQkJZWxzZQotCQkJCQkJbiA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChuID0gMDsgcVtuXTsgbisrKQotCQkJCQkJOwotCQkJCX0KLQkJCQlpZiAobikgewotCQkJCQlwcmludGsoIlJlc3VsdCBidWZmZXIgY29ycnVwdGlvbiAldSAiCi0JCQkJCSAgICAgICAiYnl0ZXM6XG4iLCBuKTsKLQkJCQkJaGV4ZHVtcChxLCBuKTsKLQkJCQl9Ci0KLQkJCQl0ZW1wICs9IHRlbXBsYXRlW2ldLnRhcFtrXTsKLQkJCX0KLQkJfQotCX0KLQotb3V0OgotCWNyeXB0b19mcmVlX2FlYWQodGZtKTsKLQlhZWFkX3JlcXVlc3RfZnJlZShyZXEpOwotfQotCi1zdGF0aWMgdm9pZCB0ZXN0X2NpcGhlcihjaGFyICphbGdvLCBpbnQgZW5jLAotCQkJc3RydWN0IGNpcGhlcl90ZXN0dmVjICp0ZW1wbGF0ZSwgdW5zaWduZWQgaW50IHRjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgcmV0LCBpLCBqLCBrLCBuLCB0ZW1wOwotCWNoYXIgKnE7Ci0Jc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm07Ci0Jc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxOwotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1s4XTsKLQljb25zdCBjaGFyICplOwotCXN0cnVjdCB0Y3J5cHRfcmVzdWx0IHJlc3VsdDsKLQl2b2lkICpkYXRhOwotCWNoYXIgaXZbTUFYX0lWTEVOXTsKLQotCWlmIChlbmMgPT0gRU5DUllQVCkKLQkgICAgICAgIGUgPSAiZW5jcnlwdGlvbiI7Ci0JZWxzZQotCQllID0gImRlY3J5cHRpb24iOwotCi0JcHJpbnRrKCJcbnRlc3RpbmcgJXMgJXNcbiIsIGFsZ28sIGUpOwotCi0JaW5pdF9jb21wbGV0aW9uKCZyZXN1bHQuY29tcGxldGlvbik7Ci0JdGZtID0gY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoYWxnbywgMCwgMCk7Ci0KLQlpZiAoSVNfRVJSKHRmbSkpIHsKLQkJcHJpbnRrKCJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAlbGRcbiIsIGFsZ28sCi0JCSAgICAgICBQVFJfRVJSKHRmbSkpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVxID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXEpIHsKLQkJcHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCBmb3IgJXNcbiIsIGFsZ28pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCi0JCQkJCXRjcnlwdF9jb21wbGV0ZSwgJnJlc3VsdCk7Ci0KLQlqID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgdGNvdW50OyBpKyspIHsKLQotCQlkYXRhID0ga3phbGxvYyh0ZW1wbGF0ZVtpXS5pbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFkYXRhKQotCQkJY29udGludWU7Ci0KLQkJbWVtY3B5KGRhdGEsIHRlbXBsYXRlW2ldLmlucHV0LCB0ZW1wbGF0ZVtpXS5pbGVuKTsKLQkJaWYgKHRlbXBsYXRlW2ldLml2KQotCQkJbWVtY3B5KGl2LCB0ZW1wbGF0ZVtpXS5pdiwgTUFYX0lWTEVOKTsKLQkJZWxzZQotCQkJbWVtc2V0KGl2LCAwLCBNQVhfSVZMRU4pOwotCi0JCWlmICghKHRlbXBsYXRlW2ldLm5wKSkgewotCQkJaisrOwotCQkJcHJpbnRrKCJ0ZXN0ICV1ICglZCBiaXQga2V5KTpcbiIsCi0JCQlqLCB0ZW1wbGF0ZVtpXS5rbGVuICogOCk7Ci0KLQkJCWNyeXB0b19hYmxrY2lwaGVyX2NsZWFyX2ZsYWdzKHRmbSwgfjApOwotCQkJaWYgKHRlbXBsYXRlW2ldLndrKQotCQkJCWNyeXB0b19hYmxrY2lwaGVyX3NldF9mbGFncygKLQkJCQkJdGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7Ci0KLQkJCXJldCA9IGNyeXB0b19hYmxrY2lwaGVyX3NldGtleSh0Zm0sIHRlbXBsYXRlW2ldLmtleSwKLQkJCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS5rbGVuKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcmludGsoInNldGtleSgpIGZhaWxlZCBmbGFncz0leFxuIiwKLQkJCQkgICAgICAgY3J5cHRvX2FibGtjaXBoZXJfZ2V0X2ZsYWdzKHRmbSkpOwotCi0JCQkJaWYgKCF0ZW1wbGF0ZVtpXS5mYWlsKSB7Ci0JCQkJCWtmcmVlKGRhdGEpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNnX2luaXRfb25lKCZzZ1swXSwgZGF0YSwgdGVtcGxhdGVbaV0uaWxlbik7Ci0KLQkJCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZywgc2csCi0JCQkJCQkgICAgIHRlbXBsYXRlW2ldLmlsZW4sIGl2KTsKLQkJCXJldCA9IGVuYyA/Ci0JCQkJY3J5cHRvX2FibGtjaXBoZXJfZW5jcnlwdChyZXEpIDoKLQkJCQljcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7Ci0KLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCWNhc2UgLUVCVVNZOgotCQkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKLQkJCQkJJnJlc3VsdC5jb21wbGV0aW9uKTsKLQkJCQlpZiAoIXJldCAmJiAhKChyZXQgPSByZXN1bHQuZXJyKSkpIHsKLQkJCQkJSU5JVF9DT01QTEVUSU9OKHJlc3VsdC5jb21wbGV0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoIiVzICgpIGZhaWxlZCBlcnI9JWRcbiIsIGUsIC1yZXQpOwotCQkJCWtmcmVlKGRhdGEpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlxID0gZGF0YTsKLQkJCWhleGR1bXAocSwgdGVtcGxhdGVbaV0ucmxlbik7Ci0KLQkJCXByaW50aygiJXNcbiIsCi0JCQkgICAgICAgbWVtY21wKHEsIHRlbXBsYXRlW2ldLnJlc3VsdCwKLQkJCQkgICAgICB0ZW1wbGF0ZVtpXS5ybGVuKSA/ICJmYWlsIiA6ICJwYXNzIik7Ci0JCX0KLQkJa2ZyZWUoZGF0YSk7Ci0JfQotCi0JcHJpbnRrKCJcbnRlc3RpbmcgJXMgJXMgYWNyb3NzIHBhZ2VzIChjaHVua2luZylcbiIsIGFsZ28sIGUpOwotCi0JaiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHRjb3VudDsgaSsrKSB7Ci0KLQkJaWYgKHRlbXBsYXRlW2ldLml2KQotCQkJbWVtY3B5KGl2LCB0ZW1wbGF0ZVtpXS5pdiwgTUFYX0lWTEVOKTsKLQkJZWxzZQotCQkJbWVtc2V0KGl2LCAwLCBNQVhfSVZMRU4pOwotCi0JCWlmICh0ZW1wbGF0ZVtpXS5ucCkgewotCQkJaisrOwotCQkJcHJpbnRrKCJ0ZXN0ICV1ICglZCBiaXQga2V5KTpcbiIsCi0JCQlqLCB0ZW1wbGF0ZVtpXS5rbGVuICogOCk7Ci0KLQkJCW1lbXNldCh4YnVmLCAwLCBYQlVGU0laRSk7Ci0JCQljcnlwdG9fYWJsa2NpcGhlcl9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKLQkJCWlmICh0ZW1wbGF0ZVtpXS53aykKLQkJCQljcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3MoCi0JCQkJCXRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwotCi0JCQlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCi0JCQkJCQkgICAgICAgdGVtcGxhdGVbaV0ua2xlbik7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKCJzZXRrZXkoKSBmYWlsZWQgZmxhZ3M9JXhcbiIsCi0JCQkJCQljcnlwdG9fYWJsa2NpcGhlcl9nZXRfZmxhZ3ModGZtKSk7Ci0KLQkJCQlpZiAoIXRlbXBsYXRlW2ldLmZhaWwpCi0JCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQl0ZW1wID0gMDsKLQkJCXNnX2luaXRfdGFibGUoc2csIHRlbXBsYXRlW2ldLm5wKTsKLQkJCWZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7Ci0JCQkJbWVtY3B5KCZ4YnVmW0lEWFtrXV0sCi0JCQkJCQl0ZW1wbGF0ZVtpXS5pbnB1dCArIHRlbXAsCi0JCQkJCQl0ZW1wbGF0ZVtpXS50YXBba10pOwotCQkJCXRlbXAgKz0gdGVtcGxhdGVbaV0udGFwW2tdOwotCQkJCXNnX3NldF9idWYoJnNnW2tdLCAmeGJ1ZltJRFhba11dLAotCQkJCQkJdGVtcGxhdGVbaV0udGFwW2tdKTsKLQkJCX0KLQotCQkJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywKLQkJCQkJdGVtcGxhdGVbaV0uaWxlbiwgaXYpOwotCi0JCQlyZXQgPSBlbmMgPwotCQkJCWNyeXB0b19hYmxrY2lwaGVyX2VuY3J5cHQocmVxKSA6Ci0JCQkJY3J5cHRvX2FibGtjaXBoZXJfZGVjcnlwdChyZXEpOwotCi0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgotCQkJCWJyZWFrOwotCQkJY2FzZSAtRUlOUFJPR1JFU1M6Ci0JCQljYXNlIC1FQlVTWToKLQkJCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCi0JCQkJCSZyZXN1bHQuY29tcGxldGlvbik7Ci0JCQkJaWYgKCFyZXQgJiYgISgocmV0ID0gcmVzdWx0LmVycikpKSB7Ci0JCQkJCUlOSVRfQ09NUExFVElPTihyZXN1bHQuY29tcGxldGlvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCIlcyAoKSBmYWlsZWQgZXJyPSVkXG4iLCBlLCAtcmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJdGVtcCA9IDA7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVbaV0ubnA7IGsrKykgewotCQkJCXByaW50aygicGFnZSAldVxuIiwgayk7Ci0JCQkJcSA9ICZ4YnVmW0lEWFtrXV07Ci0JCQkJaGV4ZHVtcChxLCB0ZW1wbGF0ZVtpXS50YXBba10pOwotCQkJCXByaW50aygiJXNcbiIsCi0JCQkJCW1lbWNtcChxLCB0ZW1wbGF0ZVtpXS5yZXN1bHQgKyB0ZW1wLAotCQkJCQkJdGVtcGxhdGVbaV0udGFwW2tdKSA/ICJmYWlsIiA6Ci0JCQkJCSJwYXNzIik7Ci0KLQkJCQlmb3IgKG4gPSAwOyBxW3RlbXBsYXRlW2ldLnRhcFtrXSArIG5dOyBuKyspCi0JCQkJCTsKLQkJCQlpZiAobikgewotCQkJCQlwcmludGsoIlJlc3VsdCBidWZmZXIgY29ycnVwdGlvbiAldSAiCi0JCQkJCSAgICAgICAiYnl0ZXM6XG4iLCBuKTsKLQkJCQkJaGV4ZHVtcCgmcVt0ZW1wbGF0ZVtpXS50YXBba11dLCBuKTsKLQkJCQl9Ci0JCQkJdGVtcCArPSB0ZW1wbGF0ZVtpXS50YXBba107Ci0JCQl9Ci0JCX0KLQl9Ci1vdXQ6Ci0JY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcih0Zm0pOwotCWFibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9jaXBoZXJfamlmZmllcyhzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGludCBlbmMsIGNoYXIgKnAsCi0JCQkgICAgICAgaW50IGJsZW4sIGludCBzZWMpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAlpbnQgYmNvdW50OwogCWludCByZXQ7CiAKLQlzZ19pbml0X29uZShzZywgcCwgYmxlbik7Ci0KIAlmb3IgKHN0YXJ0ID0gamlmZmllcywgZW5kID0gc3RhcnQgKyBzZWMgKiBIWiwgYmNvdW50ID0gMDsKIAkgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZCk7IGJjb3VudCsrKSB7CiAJCWlmIChlbmMpCkBAIC03NDUsMTYgKzc5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGVzdF9jaXBoZXJfY3ljbGVzKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgaW50IGVuYywgY2hhciAqcCwKLQkJCSAgICAgIGludCBibGVuKQorc3RhdGljIGludCB0ZXN0X2NpcGhlcl9jeWNsZXMoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBpbnQgZW5jLAorCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IGJsZW4pCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOwogCXVuc2lnbmVkIGxvbmcgY3ljbGVzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAotCXNnX2luaXRfb25lKHNnLCBwLCBibGVuKTsKLQogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCkBAIC03OTksMTIgKzEzMCwxMiBAQAogCiBzdGF0aWMgdTMyIGJsb2NrX3NpemVzW10gPSB7IDE2LCA2NCwgMjU2LCAxMDI0LCA4MTkyLCAwIH07CiAKLXN0YXRpYyB2b2lkIHRlc3RfY2lwaGVyX3NwZWVkKGNoYXIgKmFsZ28sIGludCBlbmMsIHVuc2lnbmVkIGludCBzZWMsCi0JCQkgICAgICBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgKnRlbXBsYXRlLAorc3RhdGljIHZvaWQgdGVzdF9jaXBoZXJfc3BlZWQoY29uc3QgY2hhciAqYWxnbywgaW50IGVuYywgdW5zaWduZWQgaW50IHNlYywKKwkJCSAgICAgIHN0cnVjdCBjaXBoZXJfc3BlZWRfdGVtcGxhdGUgKnRlbXBsYXRlLAogCQkJICAgICAgdW5zaWduZWQgaW50IHRjb3VudCwgdTggKmtleXNpemUpCiB7CiAJdW5zaWduZWQgaW50IHJldCwgaSwgaiwgaXZfbGVuOwotCXVuc2lnbmVkIGNoYXIgKmtleSwgKnAsIGl2WzEyOF07CisJY29uc3QgY2hhciAqa2V5LCBpdlsxMjhdOwogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CiAJY29uc3QgY2hhciAqZTsKQEAgLTgzMiwyNyArMTYzLDI4IEBACiAKIAkJYl9zaXplID0gYmxvY2tfc2l6ZXM7CiAJCWRvIHsKKwkJCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1tUVk1FTVNJWkVdOwogCi0JCQlpZiAoKCprZXlzaXplICsgKmJfc2l6ZSkgPiBUVk1FTVNJWkUpIHsKLQkJCQlwcmludGsoInRlbXBsYXRlICgldSkgdG9vIGJpZyBmb3IgdHZtZW0gKCV1KVxuIiwKLQkJCQkJCSprZXlzaXplICsgKmJfc2l6ZSwgVFZNRU1TSVpFKTsKKwkJCWlmICgoKmtleXNpemUgKyAqYl9zaXplKSA+IFRWTUVNU0laRSAqIFBBR0VfU0laRSkgeworCQkJCXByaW50aygidGVtcGxhdGUgKCV1KSB0b28gYmlnIGZvciAiCisJCQkJICAgICAgICJ0dm1lbSAoJWx1KVxuIiwgKmtleXNpemUgKyAqYl9zaXplLAorCQkJCSAgICAgICBUVk1FTVNJWkUgKiBQQUdFX1NJWkUpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCiAJCQlwcmludGsoInRlc3QgJXUgKCVkIGJpdCBrZXksICVkIGJ5dGUgYmxvY2tzKTogIiwgaSwKIAkJCQkJKmtleXNpemUgKiA4LCAqYl9zaXplKTsKIAotCQkJbWVtc2V0KHR2bWVtLCAweGZmLCAqa2V5c2l6ZSArICpiX3NpemUpOworCQkJbWVtc2V0KHR2bWVtWzBdLCAweGZmLCBQQUdFX1NJWkUpOwogCiAJCQkvKiBzZXQga2V5LCBwbGFpbiB0ZXh0IGFuZCBJViAqLwotCQkJa2V5ID0gKHVuc2lnbmVkIGNoYXIgKil0dm1lbTsKKwkJCWtleSA9IHR2bWVtWzBdOwogCQkJZm9yIChqID0gMDsgaiA8IHRjb3VudDsgaisrKSB7CiAJCQkJaWYgKHRlbXBsYXRlW2pdLmtsZW4gPT0gKmtleXNpemUpIHsKIAkJCQkJa2V5ID0gdGVtcGxhdGVbal0ua2V5OwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQlwID0gKHVuc2lnbmVkIGNoYXIgKil0dm1lbSArICprZXlzaXplOwogCiAJCQlyZXQgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0Zm0sIGtleSwgKmtleXNpemUpOwogCQkJaWYgKHJldCkgewpAQCAtODYxLDYgKzE5MywxNCBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCisJCQlzZ19pbml0X3RhYmxlKHNnLCBUVk1FTVNJWkUpOworCQkJc2dfc2V0X2J1ZihzZywgdHZtZW1bMF0gKyAqa2V5c2l6ZSwKKwkJCQkgICBQQUdFX1NJWkUgLSAqa2V5c2l6ZSk7CisJCQlmb3IgKGogPSAxOyBqIDwgVFZNRU1TSVpFOyBqKyspIHsKKwkJCQlzZ19zZXRfYnVmKHNnICsgaiwgdHZtZW1bal0sIFBBR0VfU0laRSk7CisJCQkJbWVtc2V0ICh0dm1lbVtqXSwgMHhmZiwgUEFHRV9TSVpFKTsKKwkJCX0KKwogCQkJaXZfbGVuID0gY3J5cHRvX2Jsa2NpcGhlcl9pdnNpemUodGZtKTsKIAkJCWlmIChpdl9sZW4pIHsKIAkJCQltZW1zZXQoJml2LCAweGZmLCBpdl9sZW4pOwpAQCAtODY4LDkgKzIwOCwxMSBAQAogCQkJfQogCiAJCQlpZiAoc2VjKQotCQkJCXJldCA9IHRlc3RfY2lwaGVyX2ppZmZpZXMoJmRlc2MsIGVuYywgcCwgKmJfc2l6ZSwgc2VjKTsKKwkJCQlyZXQgPSB0ZXN0X2NpcGhlcl9qaWZmaWVzKCZkZXNjLCBlbmMsIHNnLAorCQkJCQkJCSAgKmJfc2l6ZSwgc2VjKTsKIAkJCWVsc2UKLQkJCQlyZXQgPSB0ZXN0X2NpcGhlcl9jeWNsZXMoJmRlc2MsIGVuYywgcCwgKmJfc2l6ZSk7CisJCQkJcmV0ID0gdGVzdF9jaXBoZXJfY3ljbGVzKCZkZXNjLCBlbmMsIHNnLAorCQkJCQkJCSAqYl9zaXplKTsKIAogCQkJaWYgKHJldCkgewogCQkJCXByaW50aygiJXMoKSBmYWlsZWQgZmxhZ3M9JXhcbiIsIGUsIGRlc2MuZmxhZ3MpOwpAQCAtODg2LDE5ICsyMjgsMTYgQEAKIAljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtKTsKIH0KIAotc3RhdGljIGludCB0ZXN0X2hhc2hfamlmZmllc19kaWdlc3Qoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgY2hhciAqcCwgaW50IGJsZW4sCitzdGF0aWMgaW50IHRlc3RfaGFzaF9qaWZmaWVzX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgYmxlbiwKIAkJCQkgICAgY2hhciAqb3V0LCBpbnQgc2VjKQogewotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAJaW50IGJjb3VudDsKIAlpbnQgcmV0OwogCi0Jc2dfaW5pdF90YWJsZShzZywgMSk7Ci0KIAlmb3IgKHN0YXJ0ID0gamlmZmllcywgZW5kID0gc3RhcnQgKyBzZWMgKiBIWiwgYmNvdW50ID0gMDsKIAkgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZCk7IGJjb3VudCsrKSB7Ci0JCXNnX3NldF9idWYoc2csIHAsIGJsZW4pOwogCQlyZXQgPSBjcnlwdG9faGFzaF9kaWdlc3QoZGVzYywgc2csIGJsZW4sIG91dCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtOTEwLDE4ICsyNDksMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZXN0X2hhc2hfamlmZmllcyhzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCBjaGFyICpwLCBpbnQgYmxlbiwKLQkJCSAgICAgaW50IHBsZW4sIGNoYXIgKm91dCwgaW50IHNlYykKK3N0YXRpYyBpbnQgdGVzdF9oYXNoX2ppZmZpZXMoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IGJsZW4sIGludCBwbGVuLCBjaGFyICpvdXQsIGludCBzZWMpCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAlpbnQgYmNvdW50LCBwY291bnQ7CiAJaW50IHJldDsKIAogCWlmIChwbGVuID09IGJsZW4pCi0JCXJldHVybiB0ZXN0X2hhc2hfamlmZmllc19kaWdlc3QoZGVzYywgcCwgYmxlbiwgb3V0LCBzZWMpOwotCi0Jc2dfaW5pdF90YWJsZShzZywgMSk7CisJCXJldHVybiB0ZXN0X2hhc2hfamlmZmllc19kaWdlc3QoZGVzYywgc2csIGJsZW4sIG91dCwgc2VjKTsKIAogCWZvciAoc3RhcnQgPSBqaWZmaWVzLCBlbmQgPSBzdGFydCArIHNlYyAqIEhaLCBiY291bnQgPSAwOwogCSAgICAgdGltZV9iZWZvcmUoamlmZmllcywgZW5kKTsgYmNvdW50KyspIHsKQEAgLTkyOSw3ICsyNjUsNiBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJZm9yIChwY291bnQgPSAwOyBwY291bnQgPCBibGVuOyBwY291bnQgKz0gcGxlbikgewotCQkJc2dfc2V0X2J1ZihzZywgcCArIHBjb3VudCwgcGxlbik7CiAJCQlyZXQgPSBjcnlwdG9faGFzaF91cGRhdGUoZGVzYywgc2csIHBsZW4pOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtOTQ2LDIyICsyODEsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZXN0X2hhc2hfY3ljbGVzX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCBjaGFyICpwLCBpbnQgYmxlbiwKLQkJCQkgICBjaGFyICpvdXQpCitzdGF0aWMgaW50IHRlc3RfaGFzaF9jeWNsZXNfZGlnZXN0KHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCisJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IGJsZW4sIGNoYXIgKm91dCkKIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CiAJdW5zaWduZWQgbG9uZyBjeWNsZXMgPSAwOwogCWludCBpOwogCWludCByZXQ7CiAKLQlzZ19pbml0X3RhYmxlKHNnLCAxKTsKLQogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCiAJLyogV2FybS11cCBydW4uICovCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlzZ19zZXRfYnVmKHNnLCBwLCBibGVuKTsKIAkJcmV0ID0gY3J5cHRvX2hhc2hfZGlnZXN0KGRlc2MsIHNnLCBibGVuLCBvdXQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CkBAIC05NzMsNyArMzA0LDYgQEAKIAogCQlzdGFydCA9IGdldF9jeWNsZXMoKTsKIAotCQlzZ19zZXRfYnVmKHNnLCBwLCBibGVuKTsKIAkJcmV0ID0gY3J5cHRvX2hhc2hfZGlnZXN0KGRlc2MsIHNnLCBibGVuLCBvdXQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CkBAIC05OTYsMTggKzMyNiwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRlc3RfaGFzaF9jeWNsZXMoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgY2hhciAqcCwgaW50IGJsZW4sCi0JCQkgICAgaW50IHBsZW4sIGNoYXIgKm91dCkKK3N0YXRpYyBpbnQgdGVzdF9oYXNoX2N5Y2xlcyhzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgIGludCBibGVuLCBpbnQgcGxlbiwgY2hhciAqb3V0KQogewotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKIAl1bnNpZ25lZCBsb25nIGN5Y2xlcyA9IDA7CiAJaW50IGksIHBjb3VudDsKIAlpbnQgcmV0OwogCiAJaWYgKHBsZW4gPT0gYmxlbikKLQkJcmV0dXJuIHRlc3RfaGFzaF9jeWNsZXNfZGlnZXN0KGRlc2MsIHAsIGJsZW4sIG91dCk7Ci0KLQlzZ19pbml0X3RhYmxlKHNnLCAxKTsKKwkJcmV0dXJuIHRlc3RfaGFzaF9jeWNsZXNfZGlnZXN0KGRlc2MsIHNnLCBibGVuLCBvdXQpOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC0xMDE4LDcgKzM0NSw2IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAkJZm9yIChwY291bnQgPSAwOyBwY291bnQgPCBibGVuOyBwY291bnQgKz0gcGxlbikgewotCQkJc2dfc2V0X2J1ZihzZywgcCArIHBjb3VudCwgcGxlbik7CiAJCQlyZXQgPSBjcnlwdG9faGFzaF91cGRhdGUoZGVzYywgc2csIHBsZW4pOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDsKQEAgLTEwMzgsNyArMzY0LDYgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCQlmb3IgKHBjb3VudCA9IDA7IHBjb3VudCA8IGJsZW47IHBjb3VudCArPSBwbGVuKSB7Ci0JCQlzZ19zZXRfYnVmKHNnLCBwICsgcGNvdW50LCBwbGVuKTsKIAkJCXJldCA9IGNyeXB0b19oYXNoX3VwZGF0ZShkZXNjLCBzZywgcGxlbik7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwpAQCAtMTA2NSw5ICszOTAsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9oYXNoX3NwZWVkKGNoYXIgKmFsZ28sIHVuc2lnbmVkIGludCBzZWMsCi0JCQkgICAgICBzdHJ1Y3QgaGFzaF9zcGVlZCAqc3BlZWQpCitzdGF0aWMgdm9pZCB0ZXN0X2hhc2hfc3BlZWQoY29uc3QgY2hhciAqYWxnbywgdW5zaWduZWQgaW50IHNlYywKKwkJCSAgICBzdHJ1Y3QgaGFzaF9zcGVlZCAqc3BlZWQpCiB7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW1RWTUVNU0laRV07CiAJc3RydWN0IGNyeXB0b19oYXNoICp0Zm07CiAJc3RydWN0IGhhc2hfZGVzYyBkZXNjOwogCWNoYXIgb3V0cHV0WzEwMjRdOwpAQCAtMTA5MywyMyArNDE5LDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXNnX2luaXRfdGFibGUoc2csIFRWTUVNU0laRSk7CisJZm9yIChpID0gMDsgaSA8IFRWTUVNU0laRTsgaSsrKSB7CisJCXNnX3NldF9idWYoc2cgKyBpLCB0dm1lbVtpXSwgUEFHRV9TSVpFKTsKKwkJbWVtc2V0KHR2bWVtW2ldLCAweGZmLCBQQUdFX1NJWkUpOworCX0KKwogCWZvciAoaSA9IDA7IHNwZWVkW2ldLmJsZW4gIT0gMDsgaSsrKSB7Ci0JCWlmIChzcGVlZFtpXS5ibGVuID4gVFZNRU1TSVpFKSB7Ci0JCQlwcmludGsoInRlbXBsYXRlICgldSkgdG9vIGJpZyBmb3IgdHZtZW0gKCV1KVxuIiwKLQkJCSAgICAgICBzcGVlZFtpXS5ibGVuLCBUVk1FTVNJWkUpOworCQlpZiAoc3BlZWRbaV0uYmxlbiA+IFRWTUVNU0laRSAqIFBBR0VfU0laRSkgeworCQkJcHJpbnRrKCJ0ZW1wbGF0ZSAoJXUpIHRvbyBiaWcgZm9yIHR2bWVtICglbHUpXG4iLAorCQkJICAgICAgIHNwZWVkW2ldLmJsZW4sIFRWTUVNU0laRSAqIFBBR0VfU0laRSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCiAJCXByaW50aygidGVzdCUzdSAoJTV1IGJ5dGUgYmxvY2tzLCU1dSBieXRlcyBwZXIgdXBkYXRlLCU0dSB1cGRhdGVzKTogIiwKIAkJICAgICAgIGksIHNwZWVkW2ldLmJsZW4sIHNwZWVkW2ldLnBsZW4sIHNwZWVkW2ldLmJsZW4gLyBzcGVlZFtpXS5wbGVuKTsKIAotCQltZW1zZXQodHZtZW0sIDB4ZmYsIHNwZWVkW2ldLmJsZW4pOwotCiAJCWlmIChzZWMpCi0JCQlyZXQgPSB0ZXN0X2hhc2hfamlmZmllcygmZGVzYywgdHZtZW0sIHNwZWVkW2ldLmJsZW4sCisJCQlyZXQgPSB0ZXN0X2hhc2hfamlmZmllcygmZGVzYywgc2csIHNwZWVkW2ldLmJsZW4sCiAJCQkJCQlzcGVlZFtpXS5wbGVuLCBvdXRwdXQsIHNlYyk7CiAJCWVsc2UKLQkJCXJldCA9IHRlc3RfaGFzaF9jeWNsZXMoJmRlc2MsIHR2bWVtLCBzcGVlZFtpXS5ibGVuLAorCQkJcmV0ID0gdGVzdF9oYXNoX2N5Y2xlcygmZGVzYywgc2csIHNwZWVkW2ldLmJsZW4sCiAJCQkJCSAgICAgICBzcGVlZFtpXS5wbGVuLCBvdXRwdXQpOwogCiAJCWlmIChyZXQpIHsKQEAgLTExMjIsNzMgKzQ1Miw2IEBACiAJY3J5cHRvX2ZyZWVfaGFzaCh0Zm0pOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2NvbXAoY2hhciAqYWxnbywgc3RydWN0IGNvbXBfdGVzdHZlYyAqY3RlbXBsYXRlLAotCQkgICAgICAgc3RydWN0IGNvbXBfdGVzdHZlYyAqZHRlbXBsYXRlLCBpbnQgY3Rjb3VudCwgaW50IGR0Y291bnQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JY2hhciByZXN1bHRbQ09NUF9CVUZfU0laRV07Ci0Jc3RydWN0IGNyeXB0b19jb21wICp0Zm07Ci0JdW5zaWduZWQgaW50IHRzaXplOwotCi0JcHJpbnRrKCJcbnRlc3RpbmcgJXMgY29tcHJlc3Npb25cbiIsIGFsZ28pOwotCi0JdGZtID0gY3J5cHRvX2FsbG9jX2NvbXAoYWxnbywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0JaWYgKElTX0VSUih0Zm0pKSB7Ci0JCXByaW50aygiZmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciAlc1xuIiwgYWxnbyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY3Rjb3VudDsgaSsrKSB7Ci0JCWludCBpbGVuLCByZXQsIGRsZW4gPSBDT01QX0JVRl9TSVpFOwotCi0JCXByaW50aygidGVzdCAldTpcbiIsIGkgKyAxKTsKLQkJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mIChyZXN1bHQpKTsKLQotCQlpbGVuID0gY3RlbXBsYXRlW2ldLmlubGVuOwotCQlyZXQgPSBjcnlwdG9fY29tcF9jb21wcmVzcyh0Zm0sIGN0ZW1wbGF0ZVtpXS5pbnB1dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxlbiwgcmVzdWx0LCAmZGxlbik7Ci0JCWlmIChyZXQpIHsKLQkJCXByaW50aygiZmFpbDogcmV0PSVkXG4iLCByZXQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaGV4ZHVtcChyZXN1bHQsIGRsZW4pOwotCQlwcmludGsoIiVzIChyYXRpbyAlZDolZClcbiIsCi0JCSAgICAgICBtZW1jbXAocmVzdWx0LCBjdGVtcGxhdGVbaV0ub3V0cHV0LCBkbGVuKSA/ICJmYWlsIiA6ICJwYXNzIiwKLQkJICAgICAgIGlsZW4sIGRsZW4pOwotCX0KLQotCXByaW50aygiXG50ZXN0aW5nICVzIGRlY29tcHJlc3Npb25cbiIsIGFsZ28pOwotCi0JdHNpemUgPSBzaXplb2Yoc3RydWN0IGNvbXBfdGVzdHZlYyk7Ci0JdHNpemUgKj0gZHRjb3VudDsKLQlpZiAodHNpemUgPiBUVk1FTVNJWkUpIHsKLQkJcHJpbnRrKCJ0ZW1wbGF0ZSAoJXUpIHRvbyBiaWcgZm9yIHR2bWVtICgldSlcbiIsIHRzaXplLAotCQkgICAgICAgVFZNRU1TSVpFKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGR0Y291bnQ7IGkrKykgewotCQlpbnQgaWxlbiwgcmV0LCBkbGVuID0gQ09NUF9CVUZfU0laRTsKLQotCQlwcmludGsoInRlc3QgJXU6XG4iLCBpICsgMSk7Ci0JCW1lbXNldChyZXN1bHQsIDAsIHNpemVvZiAocmVzdWx0KSk7Ci0KLQkJaWxlbiA9IGR0ZW1wbGF0ZVtpXS5pbmxlbjsKLQkJcmV0ID0gY3J5cHRvX2NvbXBfZGVjb21wcmVzcyh0Zm0sIGR0ZW1wbGF0ZVtpXS5pbnB1dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbGVuLCByZXN1bHQsICZkbGVuKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKCJmYWlsOiByZXQ9JWRcbiIsIHJldCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQloZXhkdW1wKHJlc3VsdCwgZGxlbik7Ci0JCXByaW50aygiJXMgKHJhdGlvICVkOiVkKVxuIiwKLQkJICAgICAgIG1lbWNtcChyZXN1bHQsIGR0ZW1wbGF0ZVtpXS5vdXRwdXQsIGRsZW4pID8gImZhaWwiIDogInBhc3MiLAotCQkgICAgICAgaWxlbiwgZGxlbik7Ci0JfQotb3V0OgotCWNyeXB0b19mcmVlX2NvbXAodGZtKTsKLX0KLQogc3RhdGljIHZvaWQgdGVzdF9hdmFpbGFibGUodm9pZCkKIHsKIAljaGFyICoqbmFtZSA9IGNoZWNrOwpAQCAtMTIwMSw1NDkgKzQ2NCwyMzcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3Rlc3Qodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHRjcnlwdF90ZXN0KGNvbnN0IGNoYXIgKmFsZykKIHsKLQlzd2l0Y2ggKG1vZGUpIHsKKwlyZXR1cm4gYWxnX3Rlc3QoYWxnLCBhbGcsIDAsIDApOworfQogCitzdGF0aWMgdm9pZCBkb190ZXN0KGludCBtKQoreworCWludCBpOworCisJc3dpdGNoIChtKSB7CiAJY2FzZSAwOgotCQl0ZXN0X2hhc2goIm1kNSIsIG1kNV90dl90ZW1wbGF0ZSwgTUQ1X1RFU1RfVkVDVE9SUyk7Ci0KLQkJdGVzdF9oYXNoKCJzaGExIiwgc2hhMV90dl90ZW1wbGF0ZSwgU0hBMV9URVNUX1ZFQ1RPUlMpOwotCi0JCS8vREVTCi0JCXRlc3RfY2lwaGVyKCJlY2IoZGVzKSIsIEVOQ1JZUFQsIGRlc19lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGRlcykiLCBERUNSWVBULCBkZXNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIERFU19ERUNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImNiYyhkZXMpIiwgRU5DUllQVCwgZGVzX2NiY19lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTX0NCQ19FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImNiYyhkZXMpIiwgREVDUllQVCwgZGVzX2NiY19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL0RFUzNfRURFCi0JCXRlc3RfY2lwaGVyKCJlY2IoZGVzM19lZGUpIiwgRU5DUllQVCwgZGVzM19lZGVfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIERFUzNfRURFX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGRlczNfZWRlKSIsIERFQ1JZUFQsIGRlczNfZWRlX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVMzX0VERV9ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQl0ZXN0X2NpcGhlcigiY2JjKGRlczNfZWRlKSIsIEVOQ1JZUFQsCi0JCQkgICAgZGVzM19lZGVfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVMzX0VERV9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0KLQkJdGVzdF9jaXBoZXIoImNiYyhkZXMzX2VkZSkiLCBERUNSWVBULAotCQkJICAgIGRlczNfZWRlX2NiY19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTM19FREVfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMpOwotCi0JCXRlc3RfaGFzaCgibWQ0IiwgbWQ0X3R2X3RlbXBsYXRlLCBNRDRfVEVTVF9WRUNUT1JTKTsKLQotCQl0ZXN0X2hhc2goInNoYTIyNCIsIHNoYTIyNF90dl90ZW1wbGF0ZSwgU0hBMjI0X1RFU1RfVkVDVE9SUyk7Ci0KLQkJdGVzdF9oYXNoKCJzaGEyNTYiLCBzaGEyNTZfdHZfdGVtcGxhdGUsIFNIQTI1Nl9URVNUX1ZFQ1RPUlMpOwotCi0JCS8vQkxPV0ZJU0gKLQkJdGVzdF9jaXBoZXIoImVjYihibG93ZmlzaCkiLCBFTkNSWVBULCBiZl9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQkZfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoYmxvd2Zpc2gpIiwgREVDUllQVCwgYmZfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEJGX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGJsb3dmaXNoKSIsIEVOQ1JZUFQsIGJmX2NiY19lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQkZfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGJsb3dmaXNoKSIsIERFQ1JZUFQsIGJmX2NiY19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQkZfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMpOwotCi0JCS8vVFdPRklTSAotCQl0ZXN0X2NpcGhlcigiZWNiKHR3b2Zpc2gpIiwgRU5DUllQVCwgdGZfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKHR3b2Zpc2gpIiwgREVDUllQVCwgdGZfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKHR3b2Zpc2gpIiwgRU5DUllQVCwgdGZfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBURl9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmModHdvZmlzaCkiLCBERUNSWVBULCB0Zl9jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL1NFUlBFTlQKLQkJdGVzdF9jaXBoZXIoImVjYihzZXJwZW50KSIsIEVOQ1JZUFQsIHNlcnBlbnRfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFNFUlBFTlRfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2Ioc2VycGVudCkiLCBERUNSWVBULCBzZXJwZW50X2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBTRVJQRU5UX0RFQ19URVNUX1ZFQ1RPUlMpOwotCi0JCS8vVE5FUFJFUwotCQl0ZXN0X2NpcGhlcigiZWNiKHRuZXByZXMpIiwgRU5DUllQVCwgdG5lcHJlc19lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgVE5FUFJFU19FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYih0bmVwcmVzKSIsIERFQ1JZUFQsIHRuZXByZXNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFRORVBSRVNfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9BRVMKLQkJdGVzdF9jaXBoZXIoImVjYihhZXMpIiwgRU5DUllQVCwgYWVzX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoYWVzKSIsIERFQ1JZUFQsIGFlc19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQUVTX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGFlcykiLCBFTkNSWVBULCBhZXNfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGFlcykiLCBERUNSWVBULCBhZXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigibHJ3KGFlcykiLCBFTkNSWVBULCBhZXNfbHJ3X2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfTFJXX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigibHJ3KGFlcykiLCBERUNSWVBULCBhZXNfbHJ3X2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigieHRzKGFlcykiLCBFTkNSWVBULCBhZXNfeHRzX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfWFRTX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigieHRzKGFlcykiLCBERUNSWVBULCBhZXNfeHRzX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfWFRTX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigicmZjMzY4NihjdHIoYWVzKSkiLCBFTkNSWVBULCBhZXNfY3RyX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfQ1RSX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigicmZjMzY4NihjdHIoYWVzKSkiLCBERUNSWVBULCBhZXNfY3RyX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfQ1RSX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2FlYWQoImdjbShhZXMpIiwgRU5DUllQVCwgYWVzX2djbV9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgIEFFU19HQ01fRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfYWVhZCgiZ2NtKGFlcykiLCBERUNSWVBULCBhZXNfZ2NtX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgQUVTX0dDTV9ERUNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9hZWFkKCJjY20oYWVzKSIsIEVOQ1JZUFQsIGFlc19jY21fZW5jX3R2X3RlbXBsYXRlLAotCQkJICBBRVNfQ0NNX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2FlYWQoImNjbShhZXMpIiwgREVDUllQVCwgYWVzX2NjbV9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgIEFFU19DQ01fREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9DQVNUNQotCQl0ZXN0X2NpcGhlcigiZWNiKGNhc3Q1KSIsIEVOQ1JZUFQsIGNhc3Q1X2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQVNUNV9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihjYXN0NSkiLCBERUNSWVBULCBjYXN0NV9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQ0FTVDVfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9DQVNUNgotCQl0ZXN0X2NpcGhlcigiZWNiKGNhc3Q2KSIsIEVOQ1JZUFQsIGNhc3Q2X2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQVNUNl9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihjYXN0NikiLCBERUNSWVBULCBjYXN0Nl9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQ0FTVDZfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9BUkM0Ci0JCXRlc3RfY2lwaGVyKCJlY2IoYXJjNCkiLCBFTkNSWVBULCBhcmM0X2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBUkM0X0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGFyYzQpIiwgREVDUllQVCwgYXJjNF9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQVJDNF9ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL1RFQQotCQl0ZXN0X2NpcGhlcigiZWNiKHRlYSkiLCBFTkNSWVBULCB0ZWFfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFRFQV9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYih0ZWEpIiwgREVDUllQVCwgdGVhX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBURUFfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQotCQkvL1hURUEKLQkJdGVzdF9jaXBoZXIoImVjYih4dGVhKSIsIEVOQ1JZUFQsIHh0ZWFfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFhURUFfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoeHRlYSkiLCBERUNSWVBULCB4dGVhX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBYVEVBX0RFQ19URVNUX1ZFQ1RPUlMpOwotCi0JCS8vS0hBWkFECi0JCXRlc3RfY2lwaGVyKCJlY2Ioa2hhemFkKSIsIEVOQ1JZUFQsIGtoYXphZF9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgS0hBWkFEX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGtoYXphZCkiLCBERUNSWVBULCBraGF6YWRfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEtIQVpBRF9ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL0FOVUJJUwotCQl0ZXN0X2NpcGhlcigiZWNiKGFudWJpcykiLCBFTkNSWVBULCBhbnViaXNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFOVUJJU19FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihhbnViaXMpIiwgREVDUllQVCwgYW51YmlzX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBTlVCSVNfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYW51YmlzKSIsIEVOQ1JZUFQsIGFudWJpc19jYmNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFOVUJJU19DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYW51YmlzKSIsIERFQ1JZUFQsIGFudWJpc19jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEFOVUJJU19DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9YRVRBCi0JCXRlc3RfY2lwaGVyKCJlY2IoeGV0YSkiLCBFTkNSWVBULCB4ZXRhX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBYRVRBX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKHhldGEpIiwgREVDUllQVCwgeGV0YV9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgWEVUQV9ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL0ZDcnlwdAotCQl0ZXN0X2NpcGhlcigicGNiYyhmY3J5cHQpIiwgRU5DUllQVCwgZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoInBjYmMoZmNyeXB0KSIsIERFQ1JZUFQsIGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBGQ1JZUFRfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJLy9DQU1FTExJQQotCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoY2FtZWxsaWEpIiwgREVDUllQVCwKLQkJCSAgICBjYW1lbGxpYV9jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQkvL1NFRUQKLQkJdGVzdF9jaXBoZXIoImVjYihzZWVkKSIsIEVOQ1JZUFQsIHNlZWRfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFNFRURfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2Ioc2VlZCkiLCBERUNSWVBULCBzZWVkX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBTRUVEX0RFQ19URVNUX1ZFQ1RPUlMpOwotCi0JCS8vQ1RTCi0JCXRlc3RfY2lwaGVyKCJjdHMoY2JjKGFlcykpIiwgRU5DUllQVCwgY3RzX21vZGVfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIENUU19NT0RFX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY3RzKGNiYyhhZXMpKSIsIERFQ1JZUFQsIGN0c19tb2RlX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDVFNfTU9ERV9ERUNfVEVTVF9WRUNUT1JTKTsKLQotCQl0ZXN0X2hhc2goInNoYTM4NCIsIHNoYTM4NF90dl90ZW1wbGF0ZSwgU0hBMzg0X1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfaGFzaCgic2hhNTEyIiwgc2hhNTEyX3R2X3RlbXBsYXRlLCBTSEE1MTJfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJ3cDUxMiIsIHdwNTEyX3R2X3RlbXBsYXRlLCBXUDUxMl9URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2hhc2goIndwMzg0Iiwgd3AzODRfdHZfdGVtcGxhdGUsIFdQMzg0X1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfaGFzaCgid3AyNTYiLCB3cDI1Nl90dl90ZW1wbGF0ZSwgV1AyNTZfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJ0Z3IxOTIiLCB0Z3IxOTJfdHZfdGVtcGxhdGUsIFRHUjE5Ml9URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2hhc2goInRncjE2MCIsIHRncjE2MF90dl90ZW1wbGF0ZSwgVEdSMTYwX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfaGFzaCgidGdyMTI4IiwgdGdyMTI4X3R2X3RlbXBsYXRlLCBUR1IxMjhfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jb21wKCJkZWZsYXRlIiwgZGVmbGF0ZV9jb21wX3R2X3RlbXBsYXRlLAotCQkJICBkZWZsYXRlX2RlY29tcF90dl90ZW1wbGF0ZSwgREVGTEFURV9DT01QX1RFU1RfVkVDVE9SUywKLQkJCSAgREVGTEFURV9ERUNPTVBfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jb21wKCJsem8iLCBsem9fY29tcF90dl90ZW1wbGF0ZSwgbHpvX2RlY29tcF90dl90ZW1wbGF0ZSwKLQkJCSAgTFpPX0NPTVBfVEVTVF9WRUNUT1JTLCBMWk9fREVDT01QX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfaGFzaCgiY3JjMzJjIiwgY3JjMzJjX3R2X3RlbXBsYXRlLCBDUkMzMkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKG1kNSkiLCBobWFjX21kNV90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19NRDVfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTEpIiwgaG1hY19zaGExX3R2X3RlbXBsYXRlLAotCQkJICBITUFDX1NIQTFfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTIyNCkiLCBobWFjX3NoYTIyNF90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEEyMjRfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTI1NikiLCBobWFjX3NoYTI1Nl90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEEyNTZfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTM4NCkiLCBobWFjX3NoYTM4NF90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEEzODRfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTUxMikiLCBobWFjX3NoYTUxMl90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEE1MTJfVEVTVF9WRUNUT1JTKTsKLQotCQl0ZXN0X2hhc2goInhjYmMoYWVzKSIsIGFlc194Y2JjMTI4X3R2X3RlbXBsYXRlLAotCQkJICBYQ0JDX0FFU19URVNUX1ZFQ1RPUlMpOwotCi0JCXRlc3RfaGFzaCgibWljaGFlbF9taWMiLCBtaWNoYWVsX21pY190dl90ZW1wbGF0ZSwgTUlDSEFFTF9NSUNfVEVTVF9WRUNUT1JTKTsKKwkJZm9yIChpID0gMTsgaSA8IDIwMDsgaSsrKQorCQkJZG9fdGVzdChpKTsKIAkJYnJlYWs7CiAKIAljYXNlIDE6Ci0JCXRlc3RfaGFzaCgibWQ1IiwgbWQ1X3R2X3RlbXBsYXRlLCBNRDVfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoIm1kNSIpOwogCQlicmVhazsKIAogCWNhc2UgMjoKLQkJdGVzdF9oYXNoKCJzaGExIiwgc2hhMV90dl90ZW1wbGF0ZSwgU0hBMV9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgic2hhMSIpOwogCQlicmVhazsKIAogCWNhc2UgMzoKLQkJdGVzdF9jaXBoZXIoImVjYihkZXMpIiwgRU5DUllQVCwgZGVzX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoZGVzKSIsIERFQ1JZUFQsIGRlc19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGRlcykiLCBFTkNSWVBULCBkZXNfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGRlcykiLCBERUNSWVBULCBkZXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiZWNiKGRlcykiKTsKKwkJdGNyeXB0X3Rlc3QoImNiYyhkZXMpIik7CiAJCWJyZWFrOwogCiAJY2FzZSA0OgotCQl0ZXN0X2NpcGhlcigiZWNiKGRlczNfZWRlKSIsIEVOQ1JZUFQsIGRlczNfZWRlX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBERVMzX0VERV9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihkZXMzX2VkZSkiLCBERUNSWVBULCBkZXMzX2VkZV9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTM19FREVfREVDX1RFU1RfVkVDVE9SUyk7Ci0KLQkJdGVzdF9jaXBoZXIoImNiYyhkZXMzX2VkZSkiLCBFTkNSWVBULAotCQkJICAgIGRlczNfZWRlX2NiY19lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgREVTM19FREVfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwotCi0JCXRlc3RfY2lwaGVyKCJjYmMoZGVzM19lZGUpIiwgREVDUllQVCwKLQkJCSAgICBkZXMzX2VkZV9jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIERFUzNfRURFX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYihkZXMzX2VkZSkiKTsKKwkJdGNyeXB0X3Rlc3QoImNiYyhkZXMzX2VkZSkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDU6Ci0JCXRlc3RfaGFzaCgibWQ0IiwgbWQ0X3R2X3RlbXBsYXRlLCBNRDRfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoIm1kNCIpOwogCQlicmVhazsKIAogCWNhc2UgNjoKLQkJdGVzdF9oYXNoKCJzaGEyNTYiLCBzaGEyNTZfdHZfdGVtcGxhdGUsIFNIQTI1Nl9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgic2hhMjU2Iik7CiAJCWJyZWFrOwogCiAJY2FzZSA3OgotCQl0ZXN0X2NpcGhlcigiZWNiKGJsb3dmaXNoKSIsIEVOQ1JZUFQsIGJmX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBCRl9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihibG93ZmlzaCkiLCBERUNSWVBULCBiZl9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQkZfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYmxvd2Zpc2gpIiwgRU5DUllQVCwgYmZfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBCRl9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYmxvd2Zpc2gpIiwgREVDUllQVCwgYmZfY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBCRl9DQkNfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2IoYmxvd2Zpc2gpIik7CisJCXRjcnlwdF90ZXN0KCJjYmMoYmxvd2Zpc2gpIik7CiAJCWJyZWFrOwogCiAJY2FzZSA4OgotCQl0ZXN0X2NpcGhlcigiZWNiKHR3b2Zpc2gpIiwgRU5DUllQVCwgdGZfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKHR3b2Zpc2gpIiwgREVDUllQVCwgdGZfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKHR3b2Zpc2gpIiwgRU5DUllQVCwgdGZfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBURl9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmModHdvZmlzaCkiLCBERUNSWVBULCB0Zl9jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYih0d29maXNoKSIpOworCQl0Y3J5cHRfdGVzdCgiY2JjKHR3b2Zpc2gpIik7CiAJCWJyZWFrOwogCiAJY2FzZSA5OgotCQl0ZXN0X2NpcGhlcigiZWNiKHNlcnBlbnQpIiwgRU5DUllQVCwgc2VycGVudF9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgU0VSUEVOVF9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihzZXJwZW50KSIsIERFQ1JZUFQsIHNlcnBlbnRfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFNFUlBFTlRfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2Ioc2VycGVudCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDEwOgotCQl0ZXN0X2NpcGhlcigiZWNiKGFlcykiLCBFTkNSWVBULCBhZXNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihhZXMpIiwgREVDUllQVCwgYWVzX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBRVNfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYWVzKSIsIEVOQ1JZUFQsIGFlc19jYmNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoYWVzKSIsIERFQ1JZUFQsIGFlc19jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19DQkNfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJscncoYWVzKSIsIEVOQ1JZUFQsIGFlc19scndfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19MUldfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJscncoYWVzKSIsIERFQ1JZUFQsIGFlc19scndfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19MUldfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJ4dHMoYWVzKSIsIEVOQ1JZUFQsIGFlc194dHNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19YVFNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJ4dHMoYWVzKSIsIERFQ1JZUFQsIGFlc194dHNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19YVFNfREVDX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJyZmMzNjg2KGN0cihhZXMpKSIsIEVOQ1JZUFQsIGFlc19jdHJfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19DVFJfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJyZmMzNjg2KGN0cihhZXMpKSIsIERFQ1JZUFQsIGFlc19jdHJfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEFFU19DVFJfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2IoYWVzKSIpOworCQl0Y3J5cHRfdGVzdCgiY2JjKGFlcykiKTsKKwkJdGNyeXB0X3Rlc3QoImxydyhhZXMpIik7CisJCXRjcnlwdF90ZXN0KCJ4dHMoYWVzKSIpOworCQl0Y3J5cHRfdGVzdCgicmZjMzY4NihjdHIoYWVzKSkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDExOgotCQl0ZXN0X2hhc2goInNoYTM4NCIsIHNoYTM4NF90dl90ZW1wbGF0ZSwgU0hBMzg0X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJzaGEzODQiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDEyOgotCQl0ZXN0X2hhc2goInNoYTUxMiIsIHNoYTUxMl90dl90ZW1wbGF0ZSwgU0hBNTEyX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJzaGE1MTIiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDEzOgotCQl0ZXN0X2NvbXAoImRlZmxhdGUiLCBkZWZsYXRlX2NvbXBfdHZfdGVtcGxhdGUsCi0JCQkgIGRlZmxhdGVfZGVjb21wX3R2X3RlbXBsYXRlLCBERUZMQVRFX0NPTVBfVEVTVF9WRUNUT1JTLAotCQkJICBERUZMQVRFX0RFQ09NUF9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiZGVmbGF0ZSIpOwogCQlicmVhazsKIAogCWNhc2UgMTQ6Ci0JCXRlc3RfY2lwaGVyKCJlY2IoY2FzdDUpIiwgRU5DUllQVCwgY2FzdDVfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIENBU1Q1X0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGNhc3Q1KSIsIERFQ1JZUFQsIGNhc3Q1X2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQVNUNV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYihjYXN0NSkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDE1OgotCQl0ZXN0X2NpcGhlcigiZWNiKGNhc3Q2KSIsIEVOQ1JZUFQsIGNhc3Q2X2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQVNUNl9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYihjYXN0NikiLCBERUNSWVBULCBjYXN0Nl9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQ0FTVDZfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2IoY2FzdDYpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxNjoKLQkJdGVzdF9jaXBoZXIoImVjYihhcmM0KSIsIEVOQ1JZUFQsIGFyYzRfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEFSQzRfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoYXJjNCkiLCBERUNSWVBULCBhcmM0X2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBUkM0X0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiZWNiKGFyYzQpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxNzoKLQkJdGVzdF9oYXNoKCJtaWNoYWVsX21pYyIsIG1pY2hhZWxfbWljX3R2X3RlbXBsYXRlLCBNSUNIQUVMX01JQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgibWljaGFlbF9taWMiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDE4OgotCQl0ZXN0X2hhc2goImNyYzMyYyIsIGNyYzMyY190dl90ZW1wbGF0ZSwgQ1JDMzJDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJjcmMzMmMiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDE5OgotCQl0ZXN0X2NpcGhlcigiZWNiKHRlYSkiLCBFTkNSWVBULCB0ZWFfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFRFQV9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYih0ZWEpIiwgREVDUllQVCwgdGVhX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBURUFfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2IodGVhKSIpOwogCQlicmVhazsKIAogCWNhc2UgMjA6Ci0JCXRlc3RfY2lwaGVyKCJlY2IoeHRlYSkiLCBFTkNSWVBULCB4dGVhX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBYVEVBX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKHh0ZWEpIiwgREVDUllQVCwgeHRlYV9kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgWFRFQV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYih4dGVhKSIpOwogCQlicmVhazsKIAogCWNhc2UgMjE6Ci0JCXRlc3RfY2lwaGVyKCJlY2Ioa2hhemFkKSIsIEVOQ1JZUFQsIGtoYXphZF9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgS0hBWkFEX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGtoYXphZCkiLCBERUNSWVBULCBraGF6YWRfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIEtIQVpBRF9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYihraGF6YWQpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAyMjoKLQkJdGVzdF9oYXNoKCJ3cDUxMiIsIHdwNTEyX3R2X3RlbXBsYXRlLCBXUDUxMl9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgid3A1MTIiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDIzOgotCQl0ZXN0X2hhc2goIndwMzg0Iiwgd3AzODRfdHZfdGVtcGxhdGUsIFdQMzg0X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJ3cDM4NCIpOwogCQlicmVhazsKIAogCWNhc2UgMjQ6Ci0JCXRlc3RfaGFzaCgid3AyNTYiLCB3cDI1Nl90dl90ZW1wbGF0ZSwgV1AyNTZfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoIndwMjU2Iik7CiAJCWJyZWFrOwogCiAJY2FzZSAyNToKLQkJdGVzdF9jaXBoZXIoImVjYih0bmVwcmVzKSIsIEVOQ1JZUFQsIHRuZXByZXNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIFRORVBSRVNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IodG5lcHJlcykiLCBERUNSWVBULCB0bmVwcmVzX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBUTkVQUkVTX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiZWNiKHRuZXByZXMpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAyNjoKLQkJdGVzdF9jaXBoZXIoImVjYihhbnViaXMpIiwgRU5DUllQVCwgYW51YmlzX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBTlVCSVNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJlY2IoYW51YmlzKSIsIERFQ1JZUFQsIGFudWJpc19kZWNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQU5VQklTX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGFudWJpcykiLCBFTkNSWVBULCBhbnViaXNfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBTlVCSVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGFudWJpcykiLCBERUNSWVBULCBhbnViaXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBBTlVCSVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiZWNiKGFudWJpcykiKTsKKwkJdGNyeXB0X3Rlc3QoImNiYyhhbnViaXMpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAyNzoKLQkJdGVzdF9oYXNoKCJ0Z3IxOTIiLCB0Z3IxOTJfdHZfdGVtcGxhdGUsIFRHUjE5Ml9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgidGdyMTkyIik7CiAJCWJyZWFrOwogCiAJY2FzZSAyODoKIAotCQl0ZXN0X2hhc2goInRncjE2MCIsIHRncjE2MF90dl90ZW1wbGF0ZSwgVEdSMTYwX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJ0Z3IxNjAiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI5OgotCQl0ZXN0X2hhc2goInRncjEyOCIsIHRncjEyOF90dl90ZW1wbGF0ZSwgVEdSMTI4X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJ0Z3IxMjgiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDMwOgotCQl0ZXN0X2NpcGhlcigiZWNiKHhldGEpIiwgRU5DUllQVCwgeGV0YV9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgWEVUQV9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoImVjYih4ZXRhKSIsIERFQ1JZUFQsIHhldGFfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIFhFVEFfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJlY2IoeGV0YSkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDMxOgotCQl0ZXN0X2NpcGhlcigicGNiYyhmY3J5cHQpIiwgRU5DUllQVCwgZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTKTsKLQkJdGVzdF9jaXBoZXIoInBjYmMoZmNyeXB0KSIsIERFQ1JZUFQsIGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgICBGQ1JZUFRfREVDX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJwY2JjKGZjcnlwdCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDMyOgotCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfZW5jX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0VOQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMpOwotCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCi0JCQkgICAgY2FtZWxsaWFfY2JjX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjYmMoY2FtZWxsaWEpIiwgREVDUllQVCwKLQkJCSAgICBjYW1lbGxpYV9jYmNfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImVjYihjYW1lbGxpYSkiKTsKKwkJdGNyeXB0X3Rlc3QoImNiYyhjYW1lbGxpYSkiKTsKIAkJYnJlYWs7CiAJY2FzZSAzMzoKLQkJdGVzdF9oYXNoKCJzaGEyMjQiLCBzaGEyMjRfdHZfdGVtcGxhdGUsIFNIQTIyNF9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgic2hhMjI0Iik7CiAJCWJyZWFrOwogCiAJY2FzZSAzNDoKLQkJdGVzdF9jaXBoZXIoInNhbHNhMjAiLCBFTkNSWVBULAotCQkJICAgIHNhbHNhMjBfc3RyZWFtX2VuY190dl90ZW1wbGF0ZSwKLQkJCSAgICBTQUxTQTIwX1NUUkVBTV9FTkNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoInNhbHNhMjAiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDM1OgotCQl0ZXN0X2FlYWQoImdjbShhZXMpIiwgRU5DUllQVCwgYWVzX2djbV9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgIEFFU19HQ01fRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfYWVhZCgiZ2NtKGFlcykiLCBERUNSWVBULCBhZXNfZ2NtX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgQUVTX0dDTV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImdjbShhZXMpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAzNjoKLQkJdGVzdF9jb21wKCJsem8iLCBsem9fY29tcF90dl90ZW1wbGF0ZSwgbHpvX2RlY29tcF90dl90ZW1wbGF0ZSwKLQkJCSAgTFpPX0NPTVBfVEVTVF9WRUNUT1JTLCBMWk9fREVDT01QX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJsem8iKTsKIAkJYnJlYWs7CiAKIAljYXNlIDM3OgotCQl0ZXN0X2FlYWQoImNjbShhZXMpIiwgRU5DUllQVCwgYWVzX2NjbV9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgIEFFU19DQ01fRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfYWVhZCgiY2NtKGFlcykiLCBERUNSWVBULCBhZXNfY2NtX2RlY190dl90ZW1wbGF0ZSwKLQkJCSAgQUVTX0NDTV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImNjbShhZXMpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAzODoKLQkJdGVzdF9jaXBoZXIoImN0cyhjYmMoYWVzKSkiLCBFTkNSWVBULCBjdHNfbW9kZV9lbmNfdHZfdGVtcGxhdGUsCi0JCQkgICAgQ1RTX01PREVfRU5DX1RFU1RfVkVDVE9SUyk7Ci0JCXRlc3RfY2lwaGVyKCJjdHMoY2JjKGFlcykpIiwgREVDUllQVCwgY3RzX21vZGVfZGVjX3R2X3RlbXBsYXRlLAotCQkJICAgIENUU19NT0RFX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiY3RzKGNiYyhhZXMpKSIpOwogCQlicmVhazsKIAogICAgICAgICBjYXNlIDM5OgotCQl0ZXN0X2hhc2goInJtZDEyOCIsIHJtZDEyOF90dl90ZW1wbGF0ZSwgUk1EMTI4X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJybWQxMjgiKTsKIAkJYnJlYWs7CiAKICAgICAgICAgY2FzZSA0MDoKLQkJdGVzdF9oYXNoKCJybWQxNjAiLCBybWQxNjBfdHZfdGVtcGxhdGUsIFJNRDE2MF9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgicm1kMTYwIik7CiAJCWJyZWFrOwogCiAJY2FzZSA0MToKLQkJdGVzdF9oYXNoKCJybWQyNTYiLCBybWQyNTZfdHZfdGVtcGxhdGUsIFJNRDI1Nl9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgicm1kMjU2Iik7CiAJCWJyZWFrOwogCiAJY2FzZSA0MjoKLQkJdGVzdF9oYXNoKCJybWQzMjAiLCBybWQzMjBfdHZfdGVtcGxhdGUsIFJNRDMyMF9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgicm1kMzIwIik7CisJCWJyZWFrOworCisJY2FzZSA0MzoKKwkJdGNyeXB0X3Rlc3QoImVjYihzZWVkKSIpOwogCQlicmVhazsKIAogCWNhc2UgMTAwOgotCQl0ZXN0X2hhc2goImhtYWMobWQ1KSIsIGhtYWNfbWQ1X3R2X3RlbXBsYXRlLAotCQkJICBITUFDX01ENV9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiaG1hYyhtZDUpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxMDE6Ci0JCXRlc3RfaGFzaCgiaG1hYyhzaGExKSIsIGhtYWNfc2hhMV90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEExX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJobWFjKHNoYTEpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxMDI6Ci0JCXRlc3RfaGFzaCgiaG1hYyhzaGEyNTYpIiwgaG1hY19zaGEyNTZfdHZfdGVtcGxhdGUsCi0JCQkgIEhNQUNfU0hBMjU2X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJobWFjKHNoYTI1NikiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDEwMzoKLQkJdGVzdF9oYXNoKCJobWFjKHNoYTM4NCkiLCBobWFjX3NoYTM4NF90dl90ZW1wbGF0ZSwKLQkJCSAgSE1BQ19TSEEzODRfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoImhtYWMoc2hhMzg0KSIpOwogCQlicmVhazsKIAogCWNhc2UgMTA0OgotCQl0ZXN0X2hhc2goImhtYWMoc2hhNTEyKSIsIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlLAotCQkJICBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiaG1hYyhzaGE1MTIpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxMDU6Ci0JCXRlc3RfaGFzaCgiaG1hYyhzaGEyMjQpIiwgaG1hY19zaGEyMjRfdHZfdGVtcGxhdGUsCi0JCQkgIEhNQUNfU0hBMjI0X1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJobWFjKHNoYTIyNCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDEwNjoKLQkJdGVzdF9oYXNoKCJ4Y2JjKGFlcykiLCBhZXNfeGNiYzEyOF90dl90ZW1wbGF0ZSwKLQkJCSAgWENCQ19BRVNfVEVTVF9WRUNUT1JTKTsKKwkJdGNyeXB0X3Rlc3QoInhjYmMoYWVzKSIpOwogCQlicmVhazsKIAogCWNhc2UgMTA3OgotCQl0ZXN0X2hhc2goImhtYWMocm1kMTI4KSIsIGhtYWNfcm1kMTI4X3R2X3RlbXBsYXRlLAotCQkJICBITUFDX1JNRDEyOF9URVNUX1ZFQ1RPUlMpOworCQl0Y3J5cHRfdGVzdCgiaG1hYyhybWQxMjgpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxMDg6Ci0JCXRlc3RfaGFzaCgiaG1hYyhybWQxNjApIiwgaG1hY19ybWQxNjBfdHZfdGVtcGxhdGUsCi0JCQkgIEhNQUNfUk1EMTYwX1RFU1RfVkVDVE9SUyk7CisJCXRjcnlwdF90ZXN0KCJobWFjKHJtZDE2MCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDIwMDoKQEAgLTE3NjcsMTYgKzcxOCwxNiBAQAogCiAJY2FzZSAyMDE6CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJlY2IoZGVzM19lZGUpIiwgRU5DUllQVCwgc2VjLAotCQkJCWRlczNfZWRlX2VuY190dl90ZW1wbGF0ZSwgREVTM19FREVfRU5DX1RFU1RfVkVDVE9SUywKKwkJCQlkZXMzX3NwZWVkX3RlbXBsYXRlLCBERVMzX1NQRUVEX1ZFQ1RPUlMsCiAJCQkJc3BlZWRfdGVtcGxhdGVfMjQpOwogCQl0ZXN0X2NpcGhlcl9zcGVlZCgiZWNiKGRlczNfZWRlKSIsIERFQ1JZUFQsIHNlYywKLQkJCQlkZXMzX2VkZV9lbmNfdHZfdGVtcGxhdGUsIERFUzNfRURFX0VOQ19URVNUX1ZFQ1RPUlMsCisJCQkJZGVzM19zcGVlZF90ZW1wbGF0ZSwgREVTM19TUEVFRF9WRUNUT1JTLAogCQkJCXNwZWVkX3RlbXBsYXRlXzI0KTsKIAkJdGVzdF9jaXBoZXJfc3BlZWQoImNiYyhkZXMzX2VkZSkiLCBFTkNSWVBULCBzZWMsCi0JCQkJZGVzM19lZGVfZW5jX3R2X3RlbXBsYXRlLCBERVMzX0VERV9FTkNfVEVTVF9WRUNUT1JTLAorCQkJCWRlczNfc3BlZWRfdGVtcGxhdGUsIERFUzNfU1BFRURfVkVDVE9SUywKIAkJCQlzcGVlZF90ZW1wbGF0ZV8yNCk7CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJjYmMoZGVzM19lZGUpIiwgREVDUllQVCwgc2VjLAotCQkJCWRlczNfZWRlX2VuY190dl90ZW1wbGF0ZSwgREVTM19FREVfRU5DX1RFU1RfVkVDVE9SUywKKwkJCQlkZXMzX3NwZWVkX3RlbXBsYXRlLCBERVMzX1NQRUVEX1ZFQ1RPUlMsCiAJCQkJc3BlZWRfdGVtcGxhdGVfMjQpOwogCQlicmVhazsKIApAQCAtMTkwNiwzMSArODU3LDIxIEBACiAJY2FzZSAxMDAwOgogCQl0ZXN0X2F2YWlsYWJsZSgpOwogCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCi0JCXByaW50aygibm90IHRlc3RpbmcgYW55dGhpbmdcbiIpOwotCQlicmVhazsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHRjcnlwdF9tb2RfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAtRU5PTUVNOworCWludCBpOwogCi0JdHZtZW0gPSBrbWFsbG9jKFRWTUVNU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHR2bWVtID09IE5VTEwpCi0JCXJldHVybiBlcnI7CisJZm9yIChpID0gMDsgaSA8IFRWTUVNU0laRTsgaSsrKSB7CisJCXR2bWVtW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghdHZtZW1baV0pCisJCQlnb3RvIGVycl9mcmVlX3R2OworCX0KIAotCXhidWYgPSBrbWFsbG9jKFhCVUZTSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoeGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycl9mcmVlX3R2OwotCi0JYXhidWYgPSBrbWFsbG9jKFhCVUZTSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXhidWYgPT0gTlVMTCkKLQkJZ290byBlcnJfZnJlZV94YnVmOwotCi0JZG9fdGVzdCgpOworCWRvX3Rlc3QobW9kZSk7CiAKIAkvKiBXZSBpbnRlbnRpb25hbHkgcmV0dXJuIC1FQUdBSU4gdG8gcHJldmVudCBrZWVwaW5nCiAJICogdGhlIG1vZHVsZS4gSXQgZG9lcyBhbGwgaXRzIHdvcmsgZnJvbSBpbml0KCkKQEAgLTE5NDAsMTEgKzg4MSw5IEBACiAJICovCiAJZXJyID0gLUVBR0FJTjsKIAotCWtmcmVlKGF4YnVmKTsKLSBlcnJfZnJlZV94YnVmOgotCWtmcmVlKHhidWYpOwotIGVycl9mcmVlX3R2OgotCWtmcmVlKHR2bWVtKTsKK2Vycl9mcmVlX3R2OgorCWZvciAoaSA9IDA7IGkgPCBUVk1FTVNJWkUgJiYgdHZtZW1baV07IGkrKykKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXR2bWVtW2ldKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vdGNyeXB0LmggYi9jcnlwdG8vdGNyeXB0LmgKaW5kZXggODAxZTBjMi4uOTY2YmJmYSAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5oCisrKyBiL2NyeXB0by90Y3J5cHQuaApAQCAtMTcsNTMgKzE3LDkgQEAKICNpZm5kZWYgX0NSWVBUT19UQ1JZUFRfSAogI2RlZmluZSBfQ1JZUFRPX1RDUllQVF9ICiAKLSNkZWZpbmUgTUFYX0RJR0VTVF9TSVpFCQk2NAotI2RlZmluZSBNQVhfVEFQCQkJOAotCi0jZGVmaW5lIE1BWF9LRVlMRU4JCTU2Ci0jZGVmaW5lIE1BWF9JVkxFTgkJMzIKLQotc3RydWN0IGhhc2hfdGVzdHZlYyB7Ci0JLyogb25seSB1c2VkIHdpdGgga2V5ZWQgaGFzaCBhbGdvcml0aG1zICovCi0JY2hhciAqa2V5OwotCWNoYXIgKnBsYWludGV4dDsKLQljaGFyICpkaWdlc3Q7Ci0JdW5zaWduZWQgY2hhciB0YXBbTUFYX1RBUF07Ci0JdW5zaWduZWQgY2hhciBwc2l6ZTsKLQl1bnNpZ25lZCBjaGFyIG5wOwotCXVuc2lnbmVkIGNoYXIga3NpemU7Ci19OwotCi1zdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgewotCWNoYXIgKmtleTsKLQljaGFyICppdjsKLQljaGFyICppbnB1dDsKLQljaGFyICpyZXN1bHQ7Ci0JdW5zaWduZWQgY2hhciB0YXBbTUFYX1RBUF07Ci0JaW50IG5wOwotCXVuc2lnbmVkIGNoYXIgZmFpbDsKLQl1bnNpZ25lZCBjaGFyIHdrOyAvKiB3ZWFrIGtleSBmbGFnICovCi0JdW5zaWduZWQgY2hhciBrbGVuOwotCXVuc2lnbmVkIHNob3J0IGlsZW47Ci0JdW5zaWduZWQgc2hvcnQgcmxlbjsKLX07Ci0KLXN0cnVjdCBhZWFkX3Rlc3R2ZWMgewotCWNoYXIgKmtleTsKLQljaGFyICppdjsKLQljaGFyICppbnB1dDsKLQljaGFyICphc3NvYzsKLQljaGFyICpyZXN1bHQ7Ci0JdW5zaWduZWQgY2hhciB0YXBbTUFYX1RBUF07Ci0JdW5zaWduZWQgY2hhciBhdGFwW01BWF9UQVBdOwotCWludCBucDsKLQlpbnQgYW5wOwotCXVuc2lnbmVkIGNoYXIgZmFpbDsKLQl1bnNpZ25lZCBjaGFyIHdrOyAvKiB3ZWFrIGtleSBmbGFnICovCi0JdW5zaWduZWQgY2hhciBrbGVuOwotCXVuc2lnbmVkIHNob3J0IGlsZW47Ci0JdW5zaWduZWQgc2hvcnQgYWxlbjsKLQl1bnNpZ25lZCBzaG9ydCBybGVuOworc3RydWN0IGNpcGhlcl9zcGVlZF90ZW1wbGF0ZSB7CisJY29uc3QgY2hhciAqa2V5OworCXVuc2lnbmVkIGludCBrbGVuOwogfTsKIAogc3RydWN0IGhhc2hfc3BlZWQgewpAQCAtNzEsODY3MyArMjcsMjAgQEAKIAl1bnNpZ25lZCBpbnQgcGxlbjsJLyogcGVyLXVwZGF0ZSBsZW5ndGggKi8KIH07CiAKLXN0YXRpYyBjaGFyIHplcm9lZF9zdHJpbmdbNDhdOwotCi0vKgotICogTUQ0IHRlc3QgdmVjdG9ycyBmcm9tIFJGQzEzMjAKLSAqLwotI2RlZmluZSBNRDRfVEVTVF9WRUNUT1JTCTcKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgbWQ0X3R2X3RlbXBsYXRlIFtdID0gewotCXsKLQkJLnBsYWludGV4dCA9ICIiLAotCQkuZGlnZXN0CT0gIlx4MzFceGQ2XHhjZlx4ZTBceGQxXHg2YVx4ZTlceDMxIgotCQkJICAiXHhiN1x4M2NceDU5XHhkN1x4ZTBceGMwXHg4OVx4YzAiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhIiwKLQkJLnBzaXplCT0gMSwKLQkJLmRpZ2VzdAk9ICJceGJkXHhlNVx4MmNceGIzXHgxZFx4ZTNceDNlXHg0NiIKLQkJCSAgIlx4MjRceDVlXHgwNVx4ZmJceGRiXHhkNlx4ZmJceDI0IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceGE0XHg0OFx4MDFceDdhXHhhZlx4MjFceGQ4XHg1MiIKLQkJCSAgIlx4NWZceGMxXHgwYVx4ZThceDdhXHhhNlx4NzJceDlkIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAotCQkucHNpemUJPSAxNCwKLQkJLmRpZ2VzdAk9ICJceGQ5XHgxM1x4MGFceDgxXHg2NFx4NTRceDlmXHhlOCIKLQkJCSJceDE4XHg4N1x4NDhceDA2XHhlMVx4YzdceDAxXHg0YiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMjYsCi0JCS5kaWdlc3QJPSAiXHhkN1x4OWVceDFjXHgzMFx4OGFceGE1XHhiYlx4Y2QiCi0JCQkgICJceGVlXHhhOFx4ZWRceDYzXHhkZlx4NDFceDJkXHhhOSIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDEzLCAxMyB9LAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCi0JCS5wc2l6ZQk9IDYyLAotCQkuZGlnZXN0CT0gIlx4MDRceDNmXHg4NVx4ODJceGYyXHg0MVx4ZGJceDM1IgotCQkJICAiXHgxY1x4ZTZceDI3XHhlMVx4NTNceGU3XHhmMFx4ZTQiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JCQkgICAiNDU2Nzg5MDEyMzQ1Njc4OTAiLAotCQkucHNpemUJPSA4MCwKLQkJLmRpZ2VzdAk9ICJceGUzXHgzYlx4NGRceGRjXHg5Y1x4MzhceGYyXHgxOSIKLQkJCSAgIlx4OWNceDNlXHg3Ylx4MTZceDRmXHhjY1x4MDVceDM2IiwKLQl9LAotfTsKLQotLyoKLSAqIE1ENSB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMxMzIxCi0gKi8KLSNkZWZpbmUgTUQ1X1RFU1RfVkVDVE9SUwk3Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIG1kNV90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmRpZ2VzdAk9ICJceGQ0XHgxZFx4OGNceGQ5XHg4Zlx4MDBceGIyXHgwNCIKLQkJCSAgIlx4ZTlceDgwXHgwOVx4OThceGVjXHhmOFx4NDJceDdlIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYSIsCi0JCS5wc2l6ZQk9IDEsCi0JCS5kaWdlc3QJPSAiXHgwY1x4YzFceDc1XHhiOVx4YzBceGYxXHhiNlx4YTgiCi0JCQkgICJceDMxXHhjM1x4OTlceGUyXHg2OVx4NzdceDI2XHg2MSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5kaWdlc3QJPSAiXHg5MFx4MDFceDUwXHg5OFx4M2NceGQyXHg0Zlx4YjAiCi0JCQkgICJceGQ2XHg5Nlx4M2ZceDdkXHgyOFx4ZTFceDdmXHg3MiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIm1lc3NhZ2UgZGlnZXN0IiwKLQkJLnBzaXplCT0gMTQsCi0JCS5kaWdlc3QJPSAiXHhmOVx4NmJceDY5XHg3ZFx4N2NceGI3XHg5M1x4OGQiCi0JCQkgICJceDUyXHg1YVx4MmZceDMxXHhhYVx4ZjFceDYxXHhkMCIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMjYsCi0JCS5kaWdlc3QJPSAiXHhjM1x4ZmNceGQzXHhkN1x4NjFceDkyXHhlNFx4MDAiCi0JCQkgICJceDdkXHhmYlx4NDlceDZjXHhjYVx4NjdceGUxXHgzYiIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7MTMsIDEzfQotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCi0JCS5wc2l6ZQk9IDYyLAotCQkuZGlnZXN0CT0gIlx4ZDFceDc0XHhhYlx4OThceGQyXHg3N1x4ZDlceGY1IgotCQkJICAiXHhhNVx4NjFceDFjXHgyY1x4OWZceDQxXHg5ZFx4OWYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMiIKLQkJCSAgICIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAotCQkucHNpemUJPSA4MCwKLQkJLmRpZ2VzdAk9ICJceDU3XHhlZFx4ZjRceGEyXHgyYlx4ZTNceGM5XHg1NSIKLQkJCSAgIlx4YWNceDQ5XHhkYVx4MmVceDIxXHgwN1x4YjZceDdhIiwKLQl9Ci0KLX07Ci0KLS8qCi0gKiBSSVBFTUQtMTI4IHRlc3QgdmVjdG9ycyBmcm9tIElTTy9JRUMgMTAxMTgtMzoyMDA0KEUpCi0gKi8KLSNkZWZpbmUgUk1EMTI4X1RFU1RfVkVDVE9SUyAgICAgMTAKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcm1kMTI4X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkuZGlnZXN0CT0gIlx4Y2RceGYyXHg2Mlx4MTNceGExXHg1MFx4ZGNceDNlIgotCQkJICAiXHhjYlx4NjFceDBmXHgxOFx4ZjZceGIzXHg4Ylx4NDYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhIiwKLQkJLnBzaXplCT0gMSwKLQkJLmRpZ2VzdAk9ICJceDg2XHhiZVx4N2FceGZhXHgzM1x4OWRceDBmXHhjNyIKLQkJCSAgIlx4Y2ZceGM3XHg4NVx4ZTdceDJmXHg1N1x4OGRceDMzIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceGMxXHg0YVx4MTJceDE5XHg5Y1x4NjZceGU0XHhiYSIKLQkJCSAgIlx4ODRceDYzXHg2Ylx4MGZceDY5XHgxNFx4NGNceDc3IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAotCQkucHNpemUJPSAxNCwKLQkJLmRpZ2VzdAk9ICJceDllXHgzMlx4N2JceDNkXHg2ZVx4NTJceDMwXHg2MiIKLQkJCSAgIlx4YWZceGMxXHgxM1x4MmRceDdkXHhmOVx4ZDFceGI4IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAotCQkucHNpemUJPSAyNiwKLQkJLmRpZ2VzdAk9ICJceGZkXHgyYVx4YTZceDA3XHhmN1x4MWRceGM4XHhmNSIKLQkJCSAgIlx4MTBceDcxXHg0OVx4MjJceGIzXHg3MVx4ODNceDRlIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZSIKLQkJCSAgICAgImZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2MiwKLQkJLmRpZ2VzdAk9ICJceGQxXHhlOVx4NTlceGViXHgxN1x4OWNceDkxXHgxZiIKLQkJCSAgIlx4YWVceGE0XHg2Mlx4NGNceDYwXHhjNVx4YzdceDAyIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKLQkJCSAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAotCQkucHNpemUJPSA4MCwKLQkJLmRpZ2VzdAk9ICJceDNmXHg0NVx4ZWZceDE5XHg0N1x4MzJceGMyXHhkYiIKLQkJCSAgIlx4YjJceGM0XHhhMlx4YzdceDY5XHg3OVx4NWZceGEzIiwKLSAgICAgICAgfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWoiCi0JCQkgICAgICJoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKLQkJLnBzaXplCT0gNTYsCi0JCS5kaWdlc3QJPSAiXHhhMVx4YWFceDA2XHg4OVx4ZDBceGZhXHhmYVx4MmQiCi0JCQkgICJceGRjXHgyMlx4ZThceDhiXHg0OVx4MTNceDNhXHgwNiIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDI4LCAyOCB9LAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGJjZGVmZ2hpY2RlZmdoaWpkZWZnaGlqa2VmZ2hpamtsZmdoaSIKLQkJCSAgICAgImprbG1naGlqa2xtbmhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFyIgotCQkJICAgICAibG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwKLQkJLnBzaXplCT0gMTEyLAotCQkuZGlnZXN0CT0gIlx4ZDRceGVjXHhjOVx4MTNceGUxXHhkZlx4NzdceDZiIgotCQkJICAiXHhmNFx4OGRceGU5XHhkNVx4NWJceDFmXHgyNVx4NDYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqayIsCi0JCS5wc2l6ZQk9IDMyLAotCQkuZGlnZXN0CT0gIlx4MTNceGZjXHgxM1x4ZThceGVmXHhmZlx4MzRceDdkIgotCQkJICAiXHhlMVx4OTNceGZmXHg0Nlx4ZGJceGFjXHhjZlx4ZDQiLAotCX0KLX07Ci0KLS8qCi0gKiBSSVBFTUQtMTYwIHRlc3QgdmVjdG9ycyBmcm9tIElTTy9JRUMgMTAxMTgtMzoyMDA0KEUpCi0gKi8KLSNkZWZpbmUgUk1EMTYwX1RFU1RfVkVDVE9SUyAgICAgMTAKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcm1kMTYwX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkuZGlnZXN0CT0gIlx4OWNceDExXHg4NVx4YTVceGM1XHhlOVx4ZmNceDU0XHg2MVx4MjgiCi0JCQkgICJceDA4XHg5N1x4N2VceGU4XHhmNVx4NDhceGIyXHgyNVx4OGRceDMxIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYSIsCi0JCS5wc2l6ZQk9IDEsCi0JCS5kaWdlc3QJPSAiXHgwYlx4ZGNceDlkXHgyZFx4MjVceDZiXHgzZVx4ZTlceGRhXHhhZSIKLQkJCSAgIlx4MzRceDdiXHhlNlx4ZjRceGRjXHg4M1x4NWFceDQ2XHg3Zlx4ZmUiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmMiLAotCQkucHNpemUJPSAzLAotCQkuZGlnZXN0CT0gIlx4OGVceGIyXHgwOFx4ZjdceGUwXHg1ZFx4OThceDdhXHg5Ylx4MDQiCi0JCQkgICJceDRhXHg4ZVx4OThceGM2XHhiMFx4ODdceGYxXHg1YVx4MGJceGZjIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAotCQkucHNpemUJPSAxNCwKLQkJLmRpZ2VzdAk9ICJceDVkXHgwNlx4ODlceGVmXHg0OVx4ZDJceGZhXHhlNVx4NzJceGI4IgotCQkJICAiXHg4MVx4YjFceDIzXHhhOFx4NWZceGZhXHgyMVx4NTlceDVmXHgzNiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMjYsCi0JCS5kaWdlc3QJPSAiXHhmN1x4MWNceDI3XHgxMFx4OWNceDY5XHgyY1x4MWJceDU2XHhiYiIKLQkJCSAgIlx4ZGNceGViXHg1Ylx4OWRceDI4XHg2NVx4YjNceDcwXHg4ZFx4YmMiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlIgotCQkJICAgICAiZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCi0JCS5wc2l6ZQk9IDYyLAotCQkuZGlnZXN0CT0gIlx4YjBceGUyXHgwYlx4NmVceDMxXHgxNlx4NjRceDAyXHg4Nlx4ZWQiCi0JCQkgICJceDNhXHg4N1x4YTVceDcxXHgzMFx4NzlceGIyXHgxZlx4NTFceDg5IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKLQkJCSAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAotCQkucHNpemUJPSA4MCwKLQkJLmRpZ2VzdAk9ICJceDliXHg3NVx4MmVceDQ1XHg1N1x4M2RceDRiXHgzOVx4ZjRceGRiIgotCQkJICAiXHhkM1x4MzJceDNjXHhhYlx4ODJceGJmXHg2M1x4MzJceDZiXHhmYiIsCi0gICAgICAgIH0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqIgotCQkJICAgICAiaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZQk9IDU2LAotCQkuZGlnZXN0CT0gIlx4MTJceGEwXHg1M1x4MzhceDRhXHg5Y1x4MGNceDg4XHhlNFx4MDUiCi0JCQkgICJceGEwXHg2Y1x4MjdceGRjXHhmNFx4OWFceGRhXHg2Mlx4ZWJceDJiIiwKLQkJLm5wCT0gMiwKLQkJLnRhcAk9IHsgMjgsIDI4IH0sCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpIgotCQkJICAgICAiamtsbWdoaWprbG1uaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXIiCi0JCQkgICAgICJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLAotCQkucHNpemUJPSAxMTIsCi0JCS5kaWdlc3QJPSAiXHg2Zlx4M2ZceGEzXHg5Ylx4NmJceDUwXHgzY1x4MzhceDRmXHg5MSIKLQkJCSAgIlx4OWFceDQ5XHhhN1x4YWFceDVjXHgyY1x4MDhceGJkXHhmYlx4NDUiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqayIsCi0JCS5wc2l6ZQk9IDMyLAotCQkuZGlnZXN0CT0gIlx4OTRceGMyXHg2NFx4MTFceDU0XHgwNFx4ZTZceDMzXHg3OVx4MGQiCi0JCQkgICJceGZjXHhjOFx4N2JceDU4XHg3ZFx4MzZceDc3XHgwNlx4N2RceDlmIiwKLQl9Ci19OwotCi0vKgotICogUklQRU1ELTI1NiB0ZXN0IHZlY3RvcnMKLSAqLwotI2RlZmluZSBSTUQyNTZfVEVTVF9WRUNUT1JTICAgICA4Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHJtZDI1Nl90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmRpZ2VzdAk9ICJceDAyXHhiYVx4NGNceDRlXHg1Zlx4OGVceGNkXHgxOCIKLQkJCSAgIlx4NzdceGZjXHg1Mlx4ZDZceDRkXHgzMFx4ZTNceDdhIgotCQkJICAiXHgyZFx4OTdceDc0XHhmYlx4MWVceDVkXHgwMlx4NjMiCi0JCQkgICJceDgwXHhhZVx4MDFceDY4XHhlM1x4YzVceDUyXHgyZCIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImEiLAotCQkucHNpemUJPSAxLAotCQkuZGlnZXN0CT0gIlx4ZjlceDMzXHgzZVx4NDVceGQ4XHg1N1x4ZjVceGQ5IgotCQkJICAiXHgwYVx4OTFceGJhXHhiN1x4MGFceDFlXHhiYVx4MGMiCi0JCQkgICJceGZiXHgxYlx4ZTRceGIwXHg3OFx4M2NceDlhXHhjZiIKLQkJCSAgIlx4Y2RceDg4XHgzYVx4OTFceDM0XHg2OVx4MjlceDI1IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceGFmXHhiZFx4NmVceDIyXHg4Ylx4OWRceDhjXHhiYiIKLQkJCSAgIlx4Y2VceGY1XHhjYVx4MmRceDAzXHhlNlx4ZGJceGExIgotCQkJICAiXHgwYVx4YzBceGJjXHg3ZFx4Y2JceGU0XHg2OFx4MGUiCi0JCQkgICJceDFlXHg0Mlx4ZDJceGU5XHg3NVx4NDVceDliXHg2NSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIm1lc3NhZ2UgZGlnZXN0IiwKLQkJLnBzaXplCT0gMTQsCi0JCS5kaWdlc3QJPSAiXHg4N1x4ZTlceDcxXHg3NVx4OWFceDFjXHhlNFx4N2EiCi0JCQkgICJceDUxXHg0ZFx4NWNceDkxXHg0Y1x4MzlceDJjXHg5MCIKLQkJCSAgIlx4MThceGM3XHhjNFx4NmJceGMxXHg0NFx4NjVceDU1IgotCQkJICAiXHg0YVx4ZmNceGRmXHg1NFx4YTVceDA3XHgwY1x4MGUiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCi0JCS5wc2l6ZQk9IDI2LAotCQkuZGlnZXN0CT0gIlx4NjRceDlkXHgzMFx4MzRceDc1XHgxZVx4YTJceDE2IgotCQkJICAiXHg3N1x4NmJceGY5XHhhMVx4OGFceGNjXHg4MVx4YmMiCi0JCQkgICJceDc4XHg5Nlx4MTFceDhhXHg1MVx4OTdceDk2XHg4NyIKLQkJCSAgIlx4ODJceGRkXHgxZlx4ZDlceDdkXHg4ZFx4NTFceDMzIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZSIKLQkJCSAgICAgImZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2MiwKLQkJLmRpZ2VzdAk9ICJceDU3XHg0MFx4YTRceDA4XHhhY1x4MTZceGI3XHgyMCIKLQkJCSAgIlx4YjhceDQ0XHgyNFx4YWVceDkzXHgxY1x4YmJceDFmIgotCQkJICAiXHhlM1x4NjNceGQxXHhkMFx4YmZceDQwXHgxN1x4ZjEiCi0JCQkgICJceGE4XHg5Zlx4N2VceGE2XHhkZVx4NzdceGEwXHhiOCIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiCi0JCQkgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKLQkJLnBzaXplCT0gODAsCi0JCS5kaWdlc3QJPSAiXHgwNlx4ZmRceGNjXHg3YVx4NDBceDk1XHg0OFx4YWEiCi0JCQkgICJceGY5XHgxM1x4NjhceGMwXHg2YVx4NjJceDc1XHhiNSIKLQkJCSAgIlx4NTNceGUzXHhmMFx4OTlceGJmXHgwZVx4YTRceGVkIgotCQkJICAiXHhmZFx4NjdceDc4XHhkZlx4ODlceGE4XHg5MFx4ZGQiLAotICAgICAgICB9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpaiIKLQkJCSAgICAgImhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAotCQkucHNpemUJPSA1NiwKLQkJLmRpZ2VzdAk9ICJceDM4XHg0M1x4MDRceDU1XHg4M1x4YWFceGM2XHhjOCIKLQkJCSAgIlx4YzhceGQ5XHgxMlx4ODVceDczXHhlN1x4YTlceDgwIgotCQkJICAiXHg5YVx4ZmJceDJhXHgwZlx4MzRceGNjXHhjM1x4NmUiCi0JCQkgICJceGE5XHhlN1x4MmZceDE2XHhmNlx4MzZceDhlXHgzZiIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDI4LCAyOCB9LAotCX0KLX07Ci0KLS8qCi0gKiBSSVBFTUQtMzIwIHRlc3QgdmVjdG9ycwotICovCi0jZGVmaW5lIFJNRDMyMF9URVNUX1ZFQ1RPUlMgICAgIDgKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcm1kMzIwX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkuZGlnZXN0CT0gIlx4MjJceGQ2XHg1ZFx4NTZceDYxXHg1M1x4NmNceGRjXHg3NVx4YzEiCi0JCQkgICJceGZkXHhmNVx4YzZceGRlXHg3Ylx4NDFceGI5XHhmMlx4NzNceDI1IgotCQkJICAiXHhlYlx4YzZceDFlXHg4NVx4NTdceDE3XHg3ZFx4NzBceDVhXHgwZSIKLQkJCSAgIlx4YzhceDgwXHgxNVx4MWNceDNhXHgzMlx4YTBceDA4XHg5OVx4YjgiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhIiwKLQkJLnBzaXplCT0gMSwKLQkJLmRpZ2VzdAk9ICJceGNlXHg3OFx4ODVceDA2XHgzOFx4ZjlceDI2XHg1OFx4YTVceGE1IgotCQkJICAiXHg4NVx4MDlceDc1XHg3OVx4OTJceDZkXHhkYVx4NjZceDdhXHg1NyIKLQkJCSAgIlx4MTZceDU2XHgyY1x4ZmNceGY2XHhmYlx4ZTdceDdmXHg2M1x4NTQiCi0JCQkgICJceDJmXHg5OVx4YjBceDQ3XHgwNVx4ZDZceDk3XHgwZFx4ZmZceDVkIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceGRlXHg0Y1x4MDFceGIzXHgwNVx4NGZceDg5XHgzMFx4YTdceDlkIgotCQkJICAiXHgwOVx4YWVceDczXHg4ZVx4OTJceDMwXHgxZVx4NWFceDE3XHgwOCIKLQkJCSAgIlx4NWJceGVmXHhmZFx4YzFceGI4XHhkMVx4MTZceDcxXHgzZVx4NzQiCi0JCQkgICJceGY4XHgyZlx4YTlceDQyXHhkNlx4NGNceGRiXHhjNFx4NjhceDJkIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAotCQkucHNpemUJPSAxNCwKLQkJLmRpZ2VzdAk9ICJceDNhXHg4ZVx4MjhceDUwXHgyZVx4ZDRceDVkXHg0Mlx4MmZceDY4IgotCQkJICAiXHg4NFx4NGZceDlkXHhkM1x4MTZceGU3XHhiOVx4ODVceDMzXHhmYSIKLQkJCSAgIlx4M2ZceDJhXHg5MVx4ZDJceDlmXHg4NFx4ZDRceDI1XHhjOFx4OGQiCi0JCQkgICJceDZiXHg0ZVx4ZmZceDcyXHg3ZFx4ZjZceDZhXHg3Y1x4MDFceDk3IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAotCQkucHNpemUJPSAyNiwKLQkJLmRpZ2VzdAk9ICJceGNhXHhiZFx4YjFceDgxXHgwYlx4OTJceDQ3XHgwYVx4MjBceDkzIgotCQkJICAiXHhhYVx4NmJceGNlXHgwNVx4OTVceDJjXHgyOFx4MzRceDhjXHhmNCIKLQkJCSAgIlx4M2ZceGY2XHgwOFx4NDFceDk3XHg1MVx4NjZceGJiXHg0MFx4ZWQiCi0JCQkgICJceDIzXHg0MFx4MDRceGI4XHg4Mlx4NDRceDYzXHhlNlx4YjBceDA5IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZSIKLQkJCSAgICAgImZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2MiwKLQkJLmRpZ2VzdAk9ICJceGVkXHg1NFx4NDlceDQwXHhjOFx4NmRceDY3XHhmMlx4NTBceGQyIgotCQkJICAiXHgzMlx4YzNceDBiXHg3Ylx4M2VceDU3XHg3MFx4ZTBceGM2XHgwYyIKLQkJCSAgIlx4OGNceGI5XHhhNFx4Y2FceGZlXHgzYlx4MTFceDM4XHg4YVx4ZjkiCi0JCQkgICJceDkyXHgwZVx4MWJceDk5XHgyM1x4MGJceDg0XHgzY1x4ODZceGE0IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKLQkJCSAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAotCQkucHNpemUJPSA4MCwKLQkJLmRpZ2VzdAk9ICJceDU1XHg3OFx4ODhceGFmXHg1Zlx4NmRceDhlXHhkNlx4MmFceGI2IgotCQkJICAiXHg2OVx4NDVceGM2XHhkMlx4YTBceGE0XHg3ZVx4Y2RceDUzXHg0MSIKLQkJCSAgIlx4ZTlceDE1XHhlYlx4OGZceGVhXHgxZFx4MDVceDI0XHg5NVx4NWYiCi0JCQkgICJceDgyXHg1ZFx4YzdceDE3XHhlNFx4YTBceDA4XHhhYlx4MmRceDQyIiwKLSAgICAgICAgfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWoiCi0JCQkgICAgICJoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKLQkJLnBzaXplCT0gNTYsCi0JCS5kaWdlc3QJPSAiXHhkMFx4MzRceGE3XHg5NVx4MGNceGY3XHgyMlx4MDJceDFiXHhhNCIKLQkJCSAgIlx4YjhceDRkXHhmN1x4NjlceGE1XHhkZVx4MjBceDYwXHhlMlx4NTkiCi0JCQkgICJceGRmXHg0Y1x4OWJceGI0XHhhNFx4MjZceDhjXHgwZVx4OTNceDViIgotCQkJICAiXHhiY1x4NzRceDcwXHhhOVx4NjlceGM5XHhkMFx4NzJceGExXHhhYyIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDI4LCAyOCB9LAotCX0KLX07Ci0KLS8qCi0gKiBTSEExIHRlc3QgdmVjdG9ycyAgZnJvbSBmcm9tIEZJUFMgUFVCIDE4MC0xCi0gKi8KLSNkZWZpbmUgU0hBMV9URVNUX1ZFQ1RPUlMJMgotCi1zdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBzaGExX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5kaWdlc3QJPSAiXHhhOVx4OTlceDNlXHgzNlx4NDdceDA2XHg4MVx4NmFceGJhXHgzZSIKLQkJCSAgIlx4MjVceDcxXHg3OFx4NTBceGMyXHg2Y1x4OWNceGQwXHhkOFx4OWQiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZQk9IDU2LAotCQkuZGlnZXN0CT0gIlx4ODRceDk4XHgzZVx4NDRceDFjXHgzYlx4ZDJceDZlXHhiYVx4YWUiCi0JCQkgICJceDRhXHhhMVx4ZjlceDUxXHgyOVx4ZTVceGU1XHg0Nlx4NzBceGYxIiwKLQkJLm5wCT0gMiwKLQkJLnRhcAk9IHsgMjgsIDI4IH0KLQl9Ci19OwotCi0KLS8qCi0gKiBTSEEyMjQgdGVzdCB2ZWN0b3JzIGZyb20gZnJvbSBGSVBTIFBVQiAxODAtMgotICovCi0jZGVmaW5lIFNIQTIyNF9URVNUX1ZFQ1RPUlMgICAgIDIKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgc2hhMjI0X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZSAgPSAzLAotCQkuZGlnZXN0ID0gIlx4MjNceDA5XHg3RFx4MjJceDM0XHgwNVx4RDhceDIyIgotCQkJICAiXHg4Nlx4NDJceEE0XHg3N1x4QkRceEEyXHg1NVx4QjMiCi0JCQkgICJceDJBXHhBRFx4QkNceEU0XHhCRFx4QTBceEIzXHhGNyIKLQkJCSAgIlx4RTNceDZDXHg5RFx4QTciLAotCX0sIHsKLQkJLnBsYWludGV4dCA9Ci0JCSJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZSAgPSA1NiwKLQkJLmRpZ2VzdCA9ICJceDc1XHgzOFx4OEJceDE2XHg1MVx4MjdceDc2XHhDQyIKLQkJCSAgIlx4NURceEJBXHg1RFx4QTFceEZEXHg4OVx4MDFceDUwIgotCQkJICAiXHhCMFx4QzZceDQ1XHg1Q1x4QjRceEY1XHg4Qlx4MTkiCi0JCQkgICJceDUyXHg1Mlx4MjVceDI1IiwKLQkJLm5wICAgICA9IDIsCi0JCS50YXAgICAgPSB7IDI4LCAyOCB9Ci0JfQotfTsKLQotLyoKLSAqIFNIQTI1NiB0ZXN0IHZlY3RvcnMgZnJvbSBmcm9tIE5JU1QKLSAqLwotI2RlZmluZSBTSEEyNTZfVEVTVF9WRUNUT1JTCTIKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgc2hhMjU2X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5kaWdlc3QJPSAiXHhiYVx4NzhceDE2XHhiZlx4OGZceDAxXHhjZlx4ZWEiCi0JCQkgICJceDQxXHg0MVx4NDBceGRlXHg1ZFx4YWVceDIyXHgyMyIKLQkJCSAgIlx4YjBceDAzXHg2MVx4YTNceDk2XHgxN1x4N2FceDljIgotCQkJICAiXHhiNFx4MTBceGZmXHg2MVx4ZjJceDAwXHgxNVx4YWQiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZQk9IDU2LAotCQkuZGlnZXN0CT0gIlx4MjRceDhkXHg2YVx4NjFceGQyXHgwNlx4MzhceGI4IgotCQkJICAiXHhlNVx4YzBceDI2XHg5M1x4MGNceDNlXHg2MFx4MzkiCi0JCQkgICJceGEzXHgzY1x4ZTRceDU5XHg2NFx4ZmZceDIxXHg2NyIKLQkJCSAgIlx4ZjZceGVjXHhlZFx4ZDRceDE5XHhkYlx4MDZceGMxIiwKLQkJLm5wCT0gMiwKLQkJLnRhcAk9IHsgMjgsIDI4IH0KLQl9LAotfTsKLQotLyoKLSAqIFNIQTM4NCB0ZXN0IHZlY3RvcnMgZnJvbSBmcm9tIE5JU1QgYW5kIGtlcm5lbGkKLSAqLwotI2RlZmluZSBTSEEzODRfVEVTVF9WRUNUT1JTCTQKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgc2hhMzg0X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkucGxhaW50ZXh0PSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceGNiXHgwMFx4NzVceDNmXHg0NVx4YTNceDVlXHg4YiIKLQkJCSAgIlx4YjVceGEwXHgzZFx4NjlceDlhXHhjNlx4NTBceDA3IgotCQkJICAiXHgyN1x4MmNceDMyXHhhYlx4MGVceGRlXHhkMVx4NjMiCi0JCQkgICJceDFhXHg4Ylx4NjBceDVhXHg0M1x4ZmZceDViXHhlZCIKLQkJCSAgIlx4ODBceDg2XHgwN1x4MmJceGExXHhlN1x4Y2NceDIzIgotCQkJICAiXHg1OFx4YmFceGVjXHhhMVx4MzRceGM4XHgyNVx4YTciLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZQk9IDU2LAotCQkuZGlnZXN0CT0gIlx4MzNceDkxXHhmZFx4ZGRceGZjXHg4ZFx4YzdceDM5IgotCQkJICAiXHgzN1x4MDdceGE2XHg1Ylx4MWJceDQ3XHgwOVx4MzkiCi0JCQkgICJceDdjXHhmOFx4YjFceGQxXHg2Mlx4YWZceDA1XHhhYiIKLQkJCSAgIlx4ZmVceDhmXHg0NVx4MGRceGU1XHhmM1x4NmJceGM2IgotCQkJICAiXHhiMFx4NDVceDVhXHg4NVx4MjBceGJjXHg0ZVx4NmYiCi0JCQkgICJceDVmXHhlOVx4NWJceDFmXHhlM1x4YzhceDQ1XHgyYiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIgotCQkJICAgImhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwKLQkJLnBzaXplCT0gMTEyLAotCQkuZGlnZXN0CT0gIlx4MDlceDMzXHgwY1x4MzNceGY3XHgxMVx4NDdceGU4IgotCQkJICAiXHgzZFx4MTlceDJmXHhjN1x4ODJceGNkXHgxYlx4NDciCi0JCQkgICJceDUzXHgxMVx4MWJceDE3XHgzYlx4M2JceDA1XHhkMiIKLQkJCSAgIlx4MmZceGEwXHg4MFx4ODZceGUzXHhiMFx4ZjdceDEyIgotCQkJICAiXHhmY1x4YzdceGM3XHgxYVx4NTVceDdlXHgyZFx4YjkiCi0JCQkgICJceDY2XHhjM1x4ZTlceGZhXHg5MVx4NzRceDYwXHgzOSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkIgotCQkJICAgImVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCi0JCS5wc2l6ZQk9IDEwNCwKLQkJLmRpZ2VzdAk9ICJceDNkXHgyMFx4ODlceDczXHhhYlx4MzVceDA4XHhkYiIKLQkJCSAgIlx4YmRceDdlXHgyY1x4MjhceDYyXHhiYVx4MjlceDBhIgotCQkJICAiXHhkM1x4MDFceDBlXHg0OVx4NzhceGMxXHg5OFx4ZGMiCi0JCQkgICJceDRkXHg4Zlx4ZDBceDE0XHhlNVx4ODJceDgyXHgzYSIKLQkJCSAgIlx4ODlceGUxXHg2Zlx4OWJceDJhXHg3Ylx4YmNceDFhIgotCQkJICAiXHhjOVx4MzhceGUyXHhkMVx4OTlceGU4XHhiZVx4YTQiLAotCQkubnAJPSA0LAotCQkudGFwCT0geyAyNiwgMjYsIDI2LCAyNiB9Ci0JfSwKLX07Ci0KLS8qCi0gKiBTSEE1MTIgdGVzdCB2ZWN0b3JzIGZyb20gZnJvbSBOSVNUIGFuZCBrZXJuZWxpCi0gKi8KLSNkZWZpbmUgU0hBNTEyX1RFU1RfVkVDVE9SUwk0Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHNoYTUxMl90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLnBsYWludGV4dCA9ICJhYmMiLAotCQkucHNpemUJPSAzLAotCQkuZGlnZXN0CT0gIlx4ZGRceGFmXHgzNVx4YTFceDkzXHg2MVx4N2FceGJhIgotCQkJICAiXHhjY1x4NDFceDczXHg0OVx4YWVceDIwXHg0MVx4MzEiCi0JCQkgICJceDEyXHhlNlx4ZmFceDRlXHg4OVx4YTlceDdlXHhhMiIKLQkJCSAgIlx4MGFceDllXHhlZVx4ZTZceDRiXHg1NVx4ZDNceDlhIgotCQkJICAiXHgyMVx4OTJceDk5XHgyYVx4MjdceDRmXHhjMVx4YTgiCi0JCQkgICJceDM2XHhiYVx4M2NceDIzXHhhM1x4ZmVceGViXHhiZCIKLQkJCSAgIlx4NDVceDRkXHg0NFx4MjNceDY0XHgzY1x4ZThceDBlIgotCQkJICAiXHgyYVx4OWFceGM5XHg0Zlx4YTVceDRjXHhhNFx4OWYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCi0JCS5wc2l6ZQk9IDU2LAotCQkuZGlnZXN0CT0gIlx4MjBceDRhXHg4Zlx4YzZceGRkXHhhOFx4MmZceDBhIgotCQkJICAiXHgwY1x4ZWRceDdiXHhlYlx4OGVceDA4XHhhNFx4MTYiCi0JCQkgICJceDU3XHhjMVx4NmVceGY0XHg2OFx4YjJceDI4XHhhOCIKLQkJCSAgIlx4MjdceDliXHhlM1x4MzFceGE3XHgwM1x4YzNceDM1IgotCQkJICAiXHg5Nlx4ZmRceDE1XHhjMVx4M2JceDFiXHgwN1x4ZjkiCi0JCQkgICJceGFhXHgxZFx4M2JceGVhXHg1N1x4NzhceDljXHhhMCIKLQkJCSAgIlx4MzFceGFkXHg4NVx4YzdceGE3XHgxZFx4ZDdceDAzIgotCQkJICAiXHg1NFx4ZWNceDYzXHgxMlx4MzhceGNhXHgzNFx4NDUiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGJjZGVmZ2hpY2RlZmdoaWpkZWZnaGlqa2VmZ2hpamtsZmdoaWprbG1naGlqa2xtbiIKLQkJCSAgICJoaWprbG1ub2lqa2xtbm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzbW5vcHFyc3Rub3BxcnN0dSIsCi0JCS5wc2l6ZQk9IDExMiwKLQkJLmRpZ2VzdAk9ICJceDhlXHg5NVx4OWJceDc1XHhkYVx4ZTNceDEzXHhkYSIKLQkJCSAgIlx4OGNceGY0XHhmN1x4MjhceDE0XHhmY1x4MTRceDNmIgotCQkJICAiXHg4Zlx4NzdceDc5XHhjNlx4ZWJceDlmXHg3Zlx4YTEiCi0JCQkgICJceDcyXHg5OVx4YWVceGFkXHhiNlx4ODhceDkwXHgxOCIKLQkJCSAgIlx4NTBceDFkXHgyOFx4OWVceDQ5XHgwMFx4ZjdceGU0IgotCQkJICAiXHgzM1x4MWJceDk5XHhkZVx4YzRceGI1XHg0M1x4M2EiCi0JCQkgICJceGM3XHhkM1x4MjlceGVlXHhiNlx4ZGRceDI2XHg1NCIKLQkJCSAgIlx4NWVceDk2XHhlNVx4NWJceDg3XHg0Ylx4ZTlceDA5IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2QiCi0JCQkgICAiZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMTA0LAotCQkuZGlnZXN0CT0gIlx4OTNceDBkXHgwY1x4ZWZceGNiXHgzMFx4ZmZceDExIgotCQkJICAiXHgzM1x4YjZceDg5XHg4MVx4MjFceGYxXHhjZlx4M2QiCi0JCQkgICJceDI3XHg1N1x4OGFceGZjXHhhZlx4ZThceDY3XHg3YyIKLQkJCSAgIlx4NTJceDU3XHhjZlx4MDZceDk5XHgxMVx4ZjdceDVkIgotCQkJICAiXHg4Zlx4NThceDMxXHhiNVx4NmVceGJmXHhkYVx4NjciCi0JCQkgICJceGIyXHg3OFx4ZTZceDZkXHhmZlx4OGJceDg0XHhmZSIKLQkJCSAgIlx4MmJceDI4XHg3MFx4ZjdceDQyXHhhNVx4ODBceGQ4IgotCQkJICAiXHhlZFx4YjRceDE5XHg4N1x4MjNceDI4XHg1MFx4YzkiLAotCQkubnAJPSA0LAotCQkudGFwCT0geyAyNiwgMjYsIDI2LCAyNiB9Ci0JfSwKLX07Ci0KLQotLyoKLSAqIFdISVJMUE9PTCB0ZXN0IHZlY3RvcnMgZnJvbSBXaGlybHBvb2wgcGFja2FnZQotICogYnkgVmluY2VudCBSaWptZW4gYW5kIFBhdWxvIFMuIEwuIE0uIEJhcnJldG8gYXMgcGFydCBvZiB0aGUgTkVTU0lFCi0gKiBzdWJtaXNzaW9uCi0gKi8KLSNkZWZpbmUgV1A1MTJfVEVTVF9WRUNUT1JTCTgKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgd3A1MTJfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5wbGFpbnRleHQgPSAiIiwKLQkJLnBzaXplCT0gMCwKLQkJLmRpZ2VzdAk9ICJceDE5XHhGQVx4NjFceEQ3XHg1NVx4MjJceEE0XHg2NiIKLQkJCSAgIlx4OUJceDQ0XHhFM1x4OUNceDFEXHgyRVx4MTdceDI2IgotCQkJICAiXHhDNVx4MzBceDIzXHgyMVx4MzBceEQ0XHgwN1x4RjgiCi0JCQkgICJceDlBXHhGRVx4RTBceDk2XHg0OVx4OTdceEY3XHhBNyIKLQkJCSAgIlx4M0VceDgzXHhCRVx4NjlceDhCXHgyOFx4OEZceEVCIgotCQkJICAiXHhDRlx4ODhceEUzXHhFMFx4M0NceDRGXHgwN1x4NTciCi0JCQkgICJceEVBXHg4OVx4NjRceEU1XHg5Qlx4NjNceEQ5XHgzNyIKLQkJCSAgIlx4MDhceEIxXHgzOFx4Q0NceDQyXHhBNlx4NkVceEIzIiwKLQotCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImEiLAotCQkucHNpemUJPSAxLAotCQkuZGlnZXN0CT0gIlx4OEFceENBXHgyNlx4MDJceDc5XHgyQVx4RUNceDZGIgotCQkJICAiXHgxMVx4QTZceDcyXHgwNlx4NTNceDFGXHhCN1x4RDciCi0JCQkgICJceEYwXHhERlx4RjVceDk0XHgxM1x4MTRceDVFXHg2OSIKLQkJCSAgIlx4NzNceEM0XHg1MFx4MDFceEQwXHgwOFx4N0JceDQyIgotCQkJICAiXHhEMVx4MUJceEM2XHg0NVx4NDFceDNBXHhFRlx4RjYiCi0JCQkgICJceDNBXHg0Mlx4MzlceDFBXHgzOVx4MTRceDVBXHg1OSIKLQkJCSAgIlx4MUFceDkyXHgyMFx4MERceDU2XHgwMVx4OTVceEU1IgotCQkJICAiXHgzQlx4NDdceDg1XHg4NFx4RkRceEFFXHgyM1x4MUEiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmMiLAotCQkucHNpemUJPSAzLAotCQkuZGlnZXN0CT0gIlx4NEVceDI0XHg0OFx4QTRceEM2XHhGNFx4ODZceEJCIgotCQkJICAiXHgxNlx4QjZceDU2XHgyQ1x4NzNceEI0XHgwMlx4MEIiCi0JCQkgICJceEYzXHgwNFx4M0VceDNBXHg3M1x4MUJceENFXHg3MiIKLQkJCSAgIlx4MUFceEUxXHhCM1x4MDNceEQ5XHg3RVx4NkRceDRDIgotCQkJICAiXHg3MVx4ODFceEVFXHhCRFx4QjZceEM1XHg3RVx4MjciCi0JCQkgICJceDdEXHgwRVx4MzRceDk1XHg3MVx4MTRceENCXHhENiIKLQkJCSAgIlx4QzdceDk3XHhGQ1x4OURceDk1XHhEOFx4QjVceDgyIgotCQkJICAiXHhEMlx4MjVceDI5XHgyMFx4NzZceEQ0XHhFRVx4RjUiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJtZXNzYWdlIGRpZ2VzdCIsCi0JCS5wc2l6ZQk9IDE0LAotCQkuZGlnZXN0CT0gIlx4MzdceDhDXHg4NFx4QTRceDEyXHg2RVx4MkRceEM2IgotCQkJICAiXHhFNVx4NkRceENDXHg3NFx4NThceDM3XHg3QVx4QUMiCi0JCQkgICJceDgzXHg4RFx4MDBceDAzXHgyMlx4MzBceEY1XHgzQyIKLQkJCSAgIlx4RTFceEY1XHg3MFx4MENceDBGXHhGQlx4NERceDNCIgotCQkJICAiXHg4NFx4MjFceDU1XHg3Nlx4NTlceEVGXHg1NVx4QzEiCi0JCQkgICJceDA2XHhCNFx4QjVceDJBXHhDNVx4QTRceEFBXHhBNiIKLQkJCSAgIlx4OTJceEVEXHg5Mlx4MDBceDUyXHg4M1x4OEZceDMzIgotCQkJICAiXHg2Mlx4RThceDZEXHhCRFx4MzdceEE4XHg5MFx4M0UiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCi0JCS5wc2l6ZQk9IDI2LAotCQkuZGlnZXN0CT0gIlx4RjFceEQ3XHg1NFx4NjZceDI2XHgzNlx4RkZceEU5IgotCQkJICAiXHgyQ1x4ODJceEVCXHhCOVx4MjFceDJBXHg0OFx4NEEiCi0JCQkgICJceDhEXHgzOFx4NjNceDFFXHhBRFx4NDJceDM4XHhGNSIKLQkJCSAgIlx4NDRceDJFXHhFMVx4M0JceDgwXHg1NFx4RTRceDFCIgotCQkJICAiXHgwOFx4QkZceDJBXHg5Mlx4NTFceEMzXHgwQlx4NkEiCi0JCQkgICJceDBCXHg4QVx4QUVceDg2XHgxN1x4N0FceEI0XHhBNiIKLQkJCSAgIlx4RjZceDhGXHg2N1x4M0VceDcyXHgwN1x4ODZceDVEIgotCQkJICAiXHg1RFx4OThceDE5XHhBM1x4REJceEE0XHhFQlx4M0IiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKLQkJCSAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2MiwKLQkJLmRpZ2VzdAk9ICJceERDXHgzN1x4RTBceDA4XHhDRlx4OUVceEU2XHg5QiIKLQkJCSAgIlx4RjFceDFGXHgwMFx4RURceDlBXHhCQVx4MjZceDkwIgotCQkJICAiXHgxRFx4RDdceEMyXHg4Q1x4REVceEMwXHg2Nlx4Q0MiCi0JCQkgICJceDZBXHhGNFx4MkVceDQwXHhGOFx4MkZceDNBXHgxRSIKLQkJCSAgIlx4MDhceEVCXHhBMlx4NjZceDI5XHgxMlx4OURceDhGIgotCQkJICAiXHhCN1x4Q0JceDU3XHgyMVx4MUJceDkyXHg4MVx4QTYiCi0JCQkgICJceDU1XHgxN1x4Q0NceDg3XHg5RFx4N0JceDk2XHgyMSIKLQkJCSAgIlx4NDJceEM2XHg1Rlx4NUFceDdBXHhGMFx4MTRceDY3IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKLQkJCSAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKLQkJLnBzaXplCT0gODAsCi0JCS5kaWdlc3QJPSAiXHg0Nlx4NkVceEYxXHg4Qlx4QUJceEIwXHgxNVx4NEQiCi0JCQkgICJceDI1XHhCOVx4RDNceDhBXHg2NFx4MTRceEY1XHhDMCIKLQkJCSAgIlx4ODdceDg0XHgzN1x4MkJceENDXHhCMlx4MDRceEQ2IgotCQkJICAiXHg1NFx4OUNceDRBXHhGQVx4REJceDYwXHgxNFx4MjkiCi0JCQkgICJceDREXHg1Qlx4RDhceERGXHgyQVx4NkNceDQ0XHhFNSIKLQkJCSAgIlx4MzhceENEXHgwNFx4N0JceDI2XHg4MVx4QTVceDFBIgotCQkJICAiXHgyQ1x4NjBceDQ4XHgxRVx4ODhceEM1XHhBMlx4MEIiCi0JCQkgICJceDJDXHgyQVx4ODBceENGXHgzQVx4OUFceDA4XHgzQiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWprIiwKLQkJLnBzaXplCT0gMzIsCi0JCS5kaWdlc3QJPSAiXHgyQVx4OThceDdFXHhBNFx4MEZceDkxXHg3MFx4NjEiCi0JCQkgICJceEY1XHhENlx4RjBceEEwXHhFNFx4NjRceDRGXHg0OCIKLQkJCSAgIlx4OEFceDdBXHg1QVx4NTJceERFXHhFRVx4NjVceDYyIgotCQkJICAiXHgwN1x4QzVceDYyXHhGOVx4ODhceEU5XHg1Q1x4NjkiCi0JCQkgICJceDE2XHhCRFx4QzhceDAzXHgxQlx4QzVceEJFXHgxQiIKLQkJCSAgIlx4N0JceDk0XHg3Nlx4MzlceEZFXHgwNVx4MEJceDU2IgotCQkJICAiXHg5M1x4OUJceEFBXHhBMFx4QURceEZGXHg5QVx4RTYiCi0JCQkgICJceDc0XHg1Qlx4N0JceDE4XHgxQ1x4M0JceEUzXHhGRCIsCi0JfSwKLX07Ci0KLSNkZWZpbmUgV1AzODRfVEVTVF9WRUNUT1JTCTgKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgd3AzODRfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5wbGFpbnRleHQgPSAiIiwKLQkJLnBzaXplCT0gMCwKLQkJLmRpZ2VzdAk9ICJceDE5XHhGQVx4NjFceEQ3XHg1NVx4MjJceEE0XHg2NiIKLQkJCSAgIlx4OUJceDQ0XHhFM1x4OUNceDFEXHgyRVx4MTdceDI2IgotCQkJICAiXHhDNVx4MzBceDIzXHgyMVx4MzBceEQ0XHgwN1x4RjgiCi0JCQkgICJceDlBXHhGRVx4RTBceDk2XHg0OVx4OTdceEY3XHhBNyIKLQkJCSAgIlx4M0VceDgzXHhCRVx4NjlceDhCXHgyOFx4OEZceEVCIgotCQkJICAiXHhDRlx4ODhceEUzXHhFMFx4M0NceDRGXHgwN1x4NTciLAotCi0KLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYSIsCi0JCS5wc2l6ZQk9IDEsCi0JCS5kaWdlc3QJPSAiXHg4QVx4Q0FceDI2XHgwMlx4NzlceDJBXHhFQ1x4NkYiCi0JCQkgICJceDExXHhBNlx4NzJceDA2XHg1M1x4MUZceEI3XHhENyIKLQkJCSAgIlx4RjBceERGXHhGNVx4OTRceDEzXHgxNFx4NUVceDY5IgotCQkJICAiXHg3M1x4QzRceDUwXHgwMVx4RDBceDA4XHg3Qlx4NDIiCi0JCQkgICJceEQxXHgxQlx4QzZceDQ1XHg0MVx4M0FceEVGXHhGNiIKLQkJCSAgIlx4M0FceDQyXHgzOVx4MUFceDM5XHgxNFx4NUFceDU5IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdAk9ICJceDRFXHgyNFx4NDhceEE0XHhDNlx4RjRceDg2XHhCQiIKLQkJCSAgIlx4MTZceEI2XHg1Nlx4MkNceDczXHhCNFx4MDJceDBCIgotCQkJICAiXHhGM1x4MDRceDNFXHgzQVx4NzNceDFCXHhDRVx4NzIiCi0JCQkgICJceDFBXHhFMVx4QjNceDAzXHhEOVx4N0VceDZEXHg0QyIKLQkJCSAgIlx4NzFceDgxXHhFRVx4QkRceEI2XHhDNVx4N0VceDI3IgotCQkJICAiXHg3RFx4MEVceDM0XHg5NVx4NzFceDE0XHhDQlx4RDYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJtZXNzYWdlIGRpZ2VzdCIsCi0JCS5wc2l6ZQk9IDE0LAotCQkuZGlnZXN0CT0gIlx4MzdceDhDXHg4NFx4QTRceDEyXHg2RVx4MkRceEM2IgotCQkJICAiXHhFNVx4NkRceENDXHg3NFx4NThceDM3XHg3QVx4QUMiCi0JCQkgICJceDgzXHg4RFx4MDBceDAzXHgyMlx4MzBceEY1XHgzQyIKLQkJCSAgIlx4RTFceEY1XHg3MFx4MENceDBGXHhGQlx4NERceDNCIgotCQkJICAiXHg4NFx4MjFceDU1XHg3Nlx4NTlceEVGXHg1NVx4QzEiCi0JCQkgICJceDA2XHhCNFx4QjVceDJBXHhDNVx4QTRceEFBXHhBNiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMjYsCi0JCS5kaWdlc3QJPSAiXHhGMVx4RDdceDU0XHg2Nlx4MjZceDM2XHhGRlx4RTkiCi0JCQkgICJceDJDXHg4Mlx4RUJceEI5XHgyMVx4MkFceDQ4XHg0QSIKLQkJCSAgIlx4OERceDM4XHg2M1x4MUVceEFEXHg0Mlx4MzhceEY1IgotCQkJICAiXHg0NFx4MkVceEUxXHgzQlx4ODBceDU0XHhFNFx4MUIiCi0JCQkgICJceDA4XHhCRlx4MkFceDkyXHg1MVx4QzNceDBCXHg2QSIKLQkJCSAgIlx4MEJceDhBXHhBRVx4ODZceDE3XHg3QVx4QjRceEE2IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCi0JCQkgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKLQkJLnBzaXplCT0gNjIsCi0JCS5kaWdlc3QJPSAiXHhEQ1x4MzdceEUwXHgwOFx4Q0ZceDlFXHhFNlx4OUIiCi0JCQkgICJceEYxXHgxRlx4MDBceEVEXHg5QVx4QkFceDI2XHg5MCIKLQkJCSAgIlx4MURceEQ3XHhDMlx4OENceERFXHhDMFx4NjZceENDIgotCQkJICAiXHg2QVx4RjRceDJFXHg0MFx4RjhceDJGXHgzQVx4MUUiCi0JCQkgICJceDA4XHhFQlx4QTJceDY2XHgyOVx4MTJceDlEXHg4RiIKLQkJCSAgIlx4QjdceENCXHg1N1x4MjFceDFCXHg5Mlx4ODFceEE2IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKLQkJCSAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKLQkJLnBzaXplCT0gODAsCi0JCS5kaWdlc3QJPSAiXHg0Nlx4NkVceEYxXHg4Qlx4QUJceEIwXHgxNVx4NEQiCi0JCQkgICJceDI1XHhCOVx4RDNceDhBXHg2NFx4MTRceEY1XHhDMCIKLQkJCSAgIlx4ODdceDg0XHgzN1x4MkJceENDXHhCMlx4MDRceEQ2IgotCQkJICAiXHg1NFx4OUNceDRBXHhGQVx4REJceDYwXHgxNFx4MjkiCi0JCQkgICJceDREXHg1Qlx4RDhceERGXHgyQVx4NkNceDQ0XHhFNSIKLQkJCSAgIlx4MzhceENEXHgwNFx4N0JceDI2XHg4MVx4QTVceDFBIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamsiLAotCQkucHNpemUJPSAzMiwKLQkJLmRpZ2VzdAk9ICJceDJBXHg5OFx4N0VceEE0XHgwRlx4OTFceDcwXHg2MSIKLQkJCSAgIlx4RjVceEQ2XHhGMFx4QTBceEU0XHg2NFx4NEZceDQ4IgotCQkJICAiXHg4QVx4N0FceDVBXHg1Mlx4REVceEVFXHg2NVx4NjIiCi0JCQkgICJceDA3XHhDNVx4NjJceEY5XHg4OFx4RTlceDVDXHg2OSIKLQkJCSAgIlx4MTZceEJEXHhDOFx4MDNceDFCXHhDNVx4QkVceDFCIgotCQkJICAiXHg3Qlx4OTRceDc2XHgzOVx4RkVceDA1XHgwQlx4NTYiLAotCX0sCi19OwotCi0jZGVmaW5lIFdQMjU2X1RFU1RfVkVDVE9SUwk4Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHdwMjU2X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkucGxhaW50ZXh0ID0gIiIsCi0JCS5wc2l6ZQk9IDAsCi0JCS5kaWdlc3QJPSAiXHgxOVx4RkFceDYxXHhEN1x4NTVceDIyXHhBNFx4NjYiCi0JCQkgICJceDlCXHg0NFx4RTNceDlDXHgxRFx4MkVceDE3XHgyNiIKLQkJCSAgIlx4QzVceDMwXHgyM1x4MjFceDMwXHhENFx4MDdceEY4IgotCQkJICAiXHg5QVx4RkVceEUwXHg5Nlx4NDlceDk3XHhGN1x4QTciLAotCi0KLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYSIsCi0JCS5wc2l6ZQk9IDEsCi0JCS5kaWdlc3QJPSAiXHg4QVx4Q0FceDI2XHgwMlx4NzlceDJBXHhFQ1x4NkYiCi0JCQkgICJceDExXHhBNlx4NzJceDA2XHg1M1x4MUZceEI3XHhENyIKLQkJCSAgIlx4RjBceERGXHhGNVx4OTRceDEzXHgxNFx4NUVceDY5IgotCQkJICAiXHg3M1x4QzRceDUwXHgwMVx4RDBceDA4XHg3Qlx4NDIiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmMiLAotCQkucHNpemUJPSAzLAotCQkuZGlnZXN0CT0gIlx4NEVceDI0XHg0OFx4QTRceEM2XHhGNFx4ODZceEJCIgotCQkJICAiXHgxNlx4QjZceDU2XHgyQ1x4NzNceEI0XHgwMlx4MEIiCi0JCQkgICJceEYzXHgwNFx4M0VceDNBXHg3M1x4MUJceENFXHg3MiIKLQkJCSAgIlx4MUFceEUxXHhCM1x4MDNceEQ5XHg3RVx4NkRceDRDIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAotCQkucHNpemUJPSAxNCwKLQkJLmRpZ2VzdAk9ICJceDM3XHg4Q1x4ODRceEE0XHgxMlx4NkVceDJEXHhDNiIKLQkJCSAgIlx4RTVceDZEXHhDQ1x4NzRceDU4XHgzN1x4N0FceEFDIgotCQkJICAiXHg4M1x4OERceDAwXHgwM1x4MjJceDMwXHhGNVx4M0MiCi0JCQkgICJceEUxXHhGNVx4NzBceDBDXHgwRlx4RkJceDREXHgzQiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKLQkJLnBzaXplCT0gMjYsCi0JCS5kaWdlc3QJPSAiXHhGMVx4RDdceDU0XHg2Nlx4MjZceDM2XHhGRlx4RTkiCi0JCQkgICJceDJDXHg4Mlx4RUJceEI5XHgyMVx4MkFceDQ4XHg0QSIKLQkJCSAgIlx4OERceDM4XHg2M1x4MUVceEFEXHg0Mlx4MzhceEY1IgotCQkJICAiXHg0NFx4MkVceEUxXHgzQlx4ODBceDU0XHhFNFx4MUIiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKLQkJCSAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2MiwKLQkJLmRpZ2VzdAk9ICJceERDXHgzN1x4RTBceDA4XHhDRlx4OUVceEU2XHg5QiIKLQkJCSAgIlx4RjFceDFGXHgwMFx4RURceDlBXHhCQVx4MjZceDkwIgotCQkJICAiXHgxRFx4RDdceEMyXHg4Q1x4REVceEMwXHg2Nlx4Q0MiCi0JCQkgICJceDZBXHhGNFx4MkVceDQwXHhGOFx4MkZceDNBXHgxRSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiCi0JCQkgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCi0JCS5wc2l6ZQk9IDgwLAotCQkuZGlnZXN0CT0gIlx4NDZceDZFXHhGMVx4OEJceEFCXHhCMFx4MTVceDREIgotCQkJICAiXHgyNVx4QjlceEQzXHg4QVx4NjRceDE0XHhGNVx4QzAiCi0JCQkgICJceDg3XHg4NFx4MzdceDJCXHhDQ1x4QjJceDA0XHhENiIKLQkJCSAgIlx4NTRceDlDXHg0QVx4RkFceERCXHg2MFx4MTRceDI5IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamsiLAotCQkucHNpemUJPSAzMiwKLQkJLmRpZ2VzdAk9ICJceDJBXHg5OFx4N0VceEE0XHgwRlx4OTFceDcwXHg2MSIKLQkJCSAgIlx4RjVceEQ2XHhGMFx4QTBceEU0XHg2NFx4NEZceDQ4IgotCQkJICAiXHg4QVx4N0FceDVBXHg1Mlx4REVceEVFXHg2NVx4NjIiCi0JCQkgICJceDA3XHhDNVx4NjJceEY5XHg4OFx4RTlceDVDXHg2OSIsCi0JfSwKLX07Ci0KLS8qCi0gKiBUSUdFUiB0ZXN0IHZlY3RvcnMgZnJvbSBUaWdlciB3ZWJzaXRlCi0gKi8KLSNkZWZpbmUgVEdSMTkyX1RFU1RfVkVDVE9SUwk2Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHRncjE5Ml90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLnBsYWludGV4dCA9ICIiLAotCQkucHNpemUJPSAwLAotCQkuZGlnZXN0ID0gIlx4MjRceGYwXHgxM1x4MGNceDYzXHhhY1x4OTNceDMyIgotCQkJICAiXHgxNlx4MTZceDZlXHg3Nlx4YjFceGJiXHg5Mlx4NWYiCi0JCQkgICJceGYzXHg3M1x4ZGVceDJkXHg0OVx4NThceDRlXHg3YSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5kaWdlc3QgPSAiXHhmMlx4NThceGMxXHhlOFx4ODRceDE0XHhhYlx4MmEiCi0JCQkgICJceDUyXHg3YVx4YjVceDQxXHhmZlx4YzVceGI4XHhiZiIKLQkJCSAgIlx4OTNceDVmXHg3Ylx4OTVceDFjXHgxM1x4MjlceDUxIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiVGlnZXIiLAotCQkucHNpemUJPSA1LAotCQkuZGlnZXN0ID0gIlx4OWZceDAwXHhmNVx4OTlceDA3XHgyM1x4MDBceGRkIgotCQkJICAiXHgyN1x4NmFceGJiXHgzOFx4YzhceGViXHg2ZFx4ZWMiCi0JCQkgICJceDM3XHg3OVx4MGNceDExXHg2Zlx4OWRceDJiXHhkZiIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0iLAotCQkucHNpemUJPSA2NCwKLQkJLmRpZ2VzdCA9ICJceDg3XHhmYlx4MmFceDkwXHg4M1x4ODVceDFjXHhmNyIKLQkJCSAgIlx4NDdceDBkXHgyY1x4ZjhceDEwXHhlNlx4ZGZceDllIgotCQkJICAiXHhiNVx4ODZceDQ0XHg1MFx4MzRceGE1XHhhM1x4ODYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWj1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiswMTIzNDU2Nzg5IiwKLQkJLnBzaXplCT0gNjQsCi0JCS5kaWdlc3QgPSAiXHg0Nlx4N2RceGI4XHgwOFx4NjNceGViXHhjZVx4NDgiCi0JCQkgICJceDhkXHhmMVx4Y2RceDEyXHg2MVx4NjVceDVkXHhlOSIKLQkJCSAgIlx4NTdceDg5XHg2NVx4NjVceDk3XHg1Zlx4OTFceDk3IiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiVGlnZXIgLSBBIEZhc3QgTmV3IEhhc2ggRnVuY3Rpb24sICIKLQkJCSAgICJieSBSb3NzIEFuZGVyc29uIGFuZCBFbGkgQmloYW0sICIKLQkJCSAgICJwcm9jZWVkaW5ncyBvZiBGYXN0IFNvZnR3YXJlIEVuY3J5cHRpb24gMywgIgotCQkJICAgIkNhbWJyaWRnZSwgMTk5Ni4iLAotCQkucHNpemUgID0gMTI1LAotCQkuZGlnZXN0ID0gIlx4M2RceDlhXHhlYlx4MDNceGQxXHhiZFx4MWFceDYzIgotCQkJICAiXHg1N1x4YjJceDc3XHg0ZFx4ZmRceDZkXHg1Ylx4MjQiCi0JCQkgICJceGRkXHg2OFx4MTVceDFkXHg1MFx4MzlceDc0XHhmYyIsCi0JfSwKLX07Ci0KLSNkZWZpbmUgVEdSMTYwX1RFU1RfVkVDVE9SUwk2Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHRncjE2MF90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLnBsYWludGV4dCA9ICIiLAotCQkucHNpemUJPSAwLAotCQkuZGlnZXN0ID0gIlx4MjRceGYwXHgxM1x4MGNceDYzXHhhY1x4OTNceDMyIgotCQkJICAiXHgxNlx4MTZceDZlXHg3Nlx4YjFceGJiXHg5Mlx4NWYiCi0JCQkgICJceGYzXHg3M1x4ZGVceDJkIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiYWJjIiwKLQkJLnBzaXplCT0gMywKLQkJLmRpZ2VzdCA9ICJceGYyXHg1OFx4YzFceGU4XHg4NFx4MTRceGFiXHgyYSIKLQkJCSAgIlx4NTJceDdhXHhiNVx4NDFceGZmXHhjNVx4YjhceGJmIgotCQkJICAiXHg5M1x4NWZceDdiXHg5NSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIlRpZ2VyIiwKLQkJLnBzaXplCT0gNSwKLQkJLmRpZ2VzdCA9ICJceDlmXHgwMFx4ZjVceDk5XHgwN1x4MjNceDAwXHhkZCIKLQkJCSAgIlx4MjdceDZhXHhiYlx4MzhceGM4XHhlYlx4NmRceGVjIgotCQkJICAiXHgzN1x4NzlceDBjXHgxMSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0iLAotCQkucHNpemUJPSA2NCwKLQkJLmRpZ2VzdCA9ICJceDg3XHhmYlx4MmFceDkwXHg4M1x4ODVceDFjXHhmNyIKLQkJCSAgIlx4NDdceDBkXHgyY1x4ZjhceDEwXHhlNlx4ZGZceDllIgotCQkJICAiXHhiNVx4ODZceDQ0XHg1MCIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaPWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6KzAxMjM0NTY3ODkiLAotCQkucHNpemUJPSA2NCwKLQkJLmRpZ2VzdCA9ICJceDQ2XHg3ZFx4YjhceDA4XHg2M1x4ZWJceGNlXHg0OCIKLQkJCSAgIlx4OGRceGYxXHhjZFx4MTJceDYxXHg2NVx4NWRceGU5IgotCQkJICAiXHg1N1x4ODlceDY1XHg2NSIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIlRpZ2VyIC0gQSBGYXN0IE5ldyBIYXNoIEZ1bmN0aW9uLCAiCi0JCQkgICAiYnkgUm9zcyBBbmRlcnNvbiBhbmQgRWxpIEJpaGFtLCAiCi0JCQkgICAicHJvY2VlZGluZ3Mgb2YgRmFzdCBTb2Z0d2FyZSBFbmNyeXB0aW9uIDMsICIKLQkJCSAgICJDYW1icmlkZ2UsIDE5OTYuIiwKLQkJLnBzaXplICA9IDEyNSwKLQkJLmRpZ2VzdCA9ICJceDNkXHg5YVx4ZWJceDAzXHhkMVx4YmRceDFhXHg2MyIKLQkJCSAgIlx4NTdceGIyXHg3N1x4NGRceGZkXHg2ZFx4NWJceDI0IgotCQkJICAiXHhkZFx4NjhceDE1XHgxZCIsCi0JfSwKLX07Ci0KLSNkZWZpbmUgVEdSMTI4X1RFU1RfVkVDVE9SUwk2Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHRncjEyOF90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLnBsYWludGV4dCA9ICIiLAotCQkucHNpemUJPSAwLAotCQkuZGlnZXN0ID0gIlx4MjRceGYwXHgxM1x4MGNceDYzXHhhY1x4OTNceDMyIgotCQkJICAiXHgxNlx4MTZceDZlXHg3Nlx4YjFceGJiXHg5Mlx4NWYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJhYmMiLAotCQkucHNpemUJPSAzLAotCQkuZGlnZXN0ID0gIlx4ZjJceDU4XHhjMVx4ZThceDg0XHgxNFx4YWJceDJhIgotCQkJICAiXHg1Mlx4N2FceGI1XHg0MVx4ZmZceGM1XHhiOFx4YmYiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJUaWdlciIsCi0JCS5wc2l6ZQk9IDUsCi0JCS5kaWdlc3QgPSAiXHg5Zlx4MDBceGY1XHg5OVx4MDdceDIzXHgwMFx4ZGQiCi0JCQkgICJceDI3XHg2YVx4YmJceDM4XHhjOFx4ZWJceDZkXHhlYyIsCi0JfSwgewotCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0iLAotCQkucHNpemUJPSA2NCwKLQkJLmRpZ2VzdCA9ICJceDg3XHhmYlx4MmFceDkwXHg4M1x4ODVceDFjXHhmNyIKLQkJCSAgIlx4NDdceDBkXHgyY1x4ZjhceDEwXHhlNlx4ZGZceDllIiwKLQl9LCB7Ci0JCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo9YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXorMDEyMzQ1Njc4OSIsCi0JCS5wc2l6ZQk9IDY0LAotCQkuZGlnZXN0ID0gIlx4NDZceDdkXHhiOFx4MDhceDYzXHhlYlx4Y2VceDQ4IgotCQkJICAiXHg4ZFx4ZjFceGNkXHgxMlx4NjFceDY1XHg1ZFx4ZTkiLAotCX0sIHsKLQkJLnBsYWludGV4dCA9ICJUaWdlciAtIEEgRmFzdCBOZXcgSGFzaCBGdW5jdGlvbiwgIgotCQkJICAgImJ5IFJvc3MgQW5kZXJzb24gYW5kIEVsaSBCaWhhbSwgIgotCQkJICAgInByb2NlZWRpbmdzIG9mIEZhc3QgU29mdHdhcmUgRW5jcnlwdGlvbiAzLCAiCi0JCQkgICAiQ2FtYnJpZGdlLCAxOTk2LiIsCi0JCS5wc2l6ZSAgPSAxMjUsCi0JCS5kaWdlc3QgPSAiXHgzZFx4OWFceGViXHgwM1x4ZDFceGJkXHgxYVx4NjMiCi0JCQkgICJceDU3XHhiMlx4NzdceDRkXHhmZFx4NmRceDViXHgyNCIsCi0JfSwKLX07Ci0KLS8qCi0gKiBITUFDLU1ENSB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMyMjAyCi0gKiAoVGhlc2UgbmVlZCB0byBiZSBmaXhlZCB0byBub3QgdXNlIHN0cmxlbikuCi0gKi8KLSNkZWZpbmUgSE1BQ19NRDVfVEVTVF9WRUNUT1JTCTcKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgaG1hY19tZDVfdHZfdGVtcGxhdGVbXSA9Ci17Ci0JewotCQkua2V5CT0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiLAotCQkua3NpemUJPSAxNiwKLQkJLnBsYWludGV4dCA9ICJIaSBUaGVyZSIsCi0JCS5wc2l6ZQk9IDgsCi0JCS5kaWdlc3QJPSAiXHg5Mlx4OTRceDcyXHg3YVx4MzZceDM4XHhiYlx4MWMiCi0JCQkgICJceDEzXHhmNFx4OGVceGY4XHgxNVx4OGJceGZjXHg5ZCIsCi0JfSwgewotCQkua2V5CT0gIkplZmUiLAotCQkua3NpemUJPSA0LAotCQkucGxhaW50ZXh0ID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAotCQkucHNpemUJPSAyOCwKLQkJLmRpZ2VzdAk9ICJceDc1XHgwY1x4NzhceDNlXHg2YVx4YjBceGI1XHgwMyIKLQkJCSAgIlx4ZWFceGE4XHg2ZVx4MzFceDBhXHg1ZFx4YjdceDM4IiwKLQkJLm5wCT0gMiwKLQkJLnRhcAk9IHsxNCwgMTR9Ci0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAxNiwKLQkJLnBsYWludGV4dCA9ICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCi0JCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKLQkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgotCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCi0JCS5wc2l6ZQk9IDUwLAotCQkuZGlnZXN0CT0gIlx4NTZceGJlXHgzNFx4NTJceDFkXHgxNFx4NGNceDg4IgotCQkJICAiXHhkYlx4YjhceGM3XHgzM1x4ZjBceGU4XHhiM1x4ZjYiLAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKLQkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgotCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKLQkJLmtzaXplCT0gMjUsCi0JCS5wbGFpbnRleHQgPSAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgotCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCi0JCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKLQkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAotCQkucHNpemUJPSA1MCwKLQkJLmRpZ2VzdAk9ICJceDY5XHg3ZVx4YWZceDBhXHhjYVx4M2FceDNhXHhlYSIKLQkJCSAgIlx4M2FceDc1XHgxNlx4NDdceDQ2XHhmZlx4YWFceDc5IiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIsCi0JCS5rc2l6ZQk9IDE2LAotCQkucGxhaW50ZXh0ID0gIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKLQkJLnBzaXplCT0gMjAsCi0JCS5kaWdlc3QJPSAiXHg1Nlx4NDZceDFlXHhmMlx4MzRceDJlXHhkY1x4MDAiCi0JCQkgICJceGY5XHhiYVx4YjlceDk1XHg2OVx4MGVceGZkXHg0YyIsCi0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhIiwKLQkJLmtzaXplCT0gODAsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKLQkJLnBzaXplCT0gNTQsCi0JCS5kaWdlc3QJPSAiXHg2Ylx4MWFceGI3XHhmZVx4NGJceGQ3XHhiZlx4OGYiCi0JCQkgICJceDBiXHg2Mlx4ZTZceGNlXHg2MVx4YjlceGQwXHhjZCIsCi0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhIiwKLQkJLmtzaXplCT0gODAsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSBhbmQgTGFyZ2VyIFRoYW4gT25lICIKLQkJCSAgICJCbG9jay1TaXplIERhdGEiLAotCQkucHNpemUJPSA3MywKLQkJLmRpZ2VzdAk9ICJceDZmXHg2M1x4MGZceGFkXHg2N1x4Y2RceGEwXHhlZSIKLQkJCSAgIlx4MWZceGIxXHhmNVx4NjJceGRiXHgzYVx4YTVceDNlIiwKLQl9LAotfTsKLQotLyoKLSAqIEhNQUMtUklQRU1EMTI4IHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIyODYKLSAqLwotI2RlZmluZSBITUFDX1JNRDEyOF9URVNUX1ZFQ1RPUlMJNwotCi1zdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3JtZDEyOF90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIiwKLQkJLmtzaXplCT0gMTYsCi0JCS5wbGFpbnRleHQgPSAiSGkgVGhlcmUiLAotCQkucHNpemUJPSA4LAotCQkuZGlnZXN0CT0gIlx4ZmJceGY2XHgxZlx4OTRceDkyXHhhYVx4NGJceGJmIgotCQkJICAiXHg4MVx4YzFceDcyXHhlOFx4NGVceDA3XHgzNFx4ZGIiLAotCX0sIHsKLQkJLmtleQk9ICJKZWZlIiwKLQkJLmtzaXplCT0gNCwKLQkJLnBsYWludGV4dCA9ICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKLQkJLnBzaXplCT0gMjgsCi0JCS5kaWdlc3QJPSAiXHg4N1x4NWZceDgyXHg4OFx4NjJceGI2XHhiM1x4MzQiCi0JCQkgICJceGI0XHgyN1x4YzVceDVmXHg5Zlx4N2ZceGYwXHg5YiIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDE0LCAxNCB9LAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIiwKLQkJLmtzaXplCT0gMTYsCi0JCS5wbGFpbnRleHQgPSAiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgotCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCi0JCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKLQkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiLAotCQkucHNpemUJPSA1MCwKLQkJLmRpZ2VzdAk9ICJceDA5XHhmMFx4YjJceDg0XHg2ZFx4MmZceDU0XHgzZCIKLQkJCSAgIlx4YTNceDYzXHhjYlx4ZWNceDhkXHg2Mlx4YTNceDhkIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiCi0JCQkgICJceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKLQkJCSAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCi0JCS5rc2l6ZQk9IDI1LAotCQkucGxhaW50ZXh0ID0gIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKLQkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgotCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCi0JCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIiwKLQkJLnBzaXplCT0gNTAsCi0JCS5kaWdlc3QJPSAiXHhiZFx4YmJceGQ3XHhjZlx4MDNceGU0XHg0Ylx4NWEiCi0JCQkgICJceGE2XHgwYVx4ZjhceDE1XHhiZVx4NGRceDIyXHg5NCIsCi0JfSwgewotCQkua2V5CT0gIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiLAotCQkua3NpemUJPSAxNiwKLQkJLnBsYWludGV4dCA9ICJUZXN0IFdpdGggVHJ1bmNhdGlvbiIsCi0JCS5wc2l6ZQk9IDIwLAotCQkuZGlnZXN0CT0gIlx4ZTdceDk4XHgwOFx4ZjJceDRiXHgyNVx4ZmRceDAzIgotCQkJICAiXHgxY1x4MTVceDVmXHgwZFx4NTVceDFkXHg5YVx4M2EiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYSIsCi0JCS5rc2l6ZQk9IDgwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCi0JCS5wc2l6ZQk9IDU0LAotCQkuZGlnZXN0CT0gIlx4ZGNceDczXHgyOVx4MjhceGRlXHg5OFx4MTBceDRhIgotCQkJICAiXHgxZlx4NTlceGQzXHg3M1x4YzFceDUwXHhhY1x4YmIiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYSIsCi0JCS5rc2l6ZQk9IDgwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuIE9uZSAiCi0JCQkgICAiQmxvY2stU2l6ZSBEYXRhIiwKLQkJLnBzaXplCT0gNzMsCi0JCS5kaWdlc3QJPSAiXHg1Y1x4NmJceGVjXHg5Nlx4NzlceDNlXHgxNlx4ZDQiCi0JCQkgICJceDA2XHg5MFx4YzJceDM3XHg2M1x4NWZceDMwXHhjNSIsCi0JfSwKLX07Ci0KLS8qCi0gKiBITUFDLVJJUEVNRDE2MCB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMyMjg2Ci0gKi8KLSNkZWZpbmUgSE1BQ19STUQxNjBfVEVTVF9WRUNUT1JTCTcKLQotc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgaG1hY19ybWQxNjBfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5rZXkJPSAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiLAotCQkua3NpemUJPSAyMCwKLQkJLnBsYWludGV4dCA9ICJIaSBUaGVyZSIsCi0JCS5wc2l6ZQk9IDgsCi0JCS5kaWdlc3QJPSAiXHgyNFx4Y2JceDRiXHhkNlx4N2RceDIwXHhmY1x4MWFceDVkXHgyZSIKLQkJCSAgIlx4ZDdceDczXHgyZFx4Y2NceDM5XHgzN1x4N2ZceDBhXHg1Nlx4NjgiLAotCX0sIHsKLQkJLmtleQk9ICJKZWZlIiwKLQkJLmtzaXplCT0gNCwKLQkJLnBsYWludGV4dCA9ICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKLQkJLnBzaXplCT0gMjgsCi0JCS5kaWdlc3QJPSAiXHhkZFx4YTZceGMwXHgyMVx4M2FceDQ4XHg1YVx4OWVceDI0XHhmNCIKLQkJCSAgIlx4NzRceDIwXHg2NFx4YTdceGYwXHgzM1x4YjRceDNjXHg0MFx4NjkiLAotCQkubnAJPSAyLAotCQkudGFwCT0geyAxNCwgMTQgfSwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAyMCwKLQkJLnBsYWludGV4dCA9ICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCi0JCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKLQkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgotCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCi0JCS5wc2l6ZQk9IDUwLAotCQkuZGlnZXN0CT0gIlx4YjBceGIxXHgwNVx4MzZceDBkXHhlN1x4NTlceDk2XHgwYVx4YjQiCi0JCQkgICJceGYzXHg1Mlx4OThceGUxXHgxNlx4ZTJceDk1XHhkOFx4ZTdceGMxIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiCi0JCQkgICJceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKLQkJCSAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCi0JCS5rc2l6ZQk9IDI1LAotCQkucGxhaW50ZXh0ID0gIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKLQkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgotCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCi0JCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIiwKLQkJLnBzaXplCT0gNTAsCi0JCS5kaWdlc3QJPSAiXHhkNVx4Y2FceDg2XHgyZlx4NGRceDIxXHhkNVx4ZTZceDEwXHhlMSIKLQkJCSAgIlx4OGJceDRjXHhmMVx4YmVceGI5XHg3YVx4NDNceDY1XHhlY1x4ZjQiLAotCX0sIHsKLQkJLmtleQk9ICJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIsCi0JCS5rc2l6ZQk9IDIwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKLQkJLnBzaXplCT0gMjAsCi0JCS5kaWdlc3QJPSAiXHg3Nlx4MTlceDY5XHgzOVx4NzhceGY5XHgxZFx4OTBceDUzXHg5YSIKLQkJCSAgIlx4ZTdceDg2XHg1MFx4MGZceGYzXHhkOFx4ZTBceDUxXHg4ZVx4MzkiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYSIsCi0JCS5rc2l6ZQk9IDgwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCi0JCS5wc2l6ZQk9IDU0LAotCQkuZGlnZXN0CT0gIlx4NjRceDY2XHhjYVx4MDdceGFjXHg1ZVx4YWNceDI5XHhlMVx4YmQiCi0JCQkgICJceDUyXHgzZVx4NWFceGRhXHg3Nlx4MDVceGI3XHg5MVx4ZmRceDhiIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWEiLAotCQkua3NpemUJPSA4MCwKLQkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIgVGhhbiBPbmUgIgotCQkJICAgIkJsb2NrLVNpemUgRGF0YSIsCi0JCS5wc2l6ZQk9IDczLAotCQkuZGlnZXN0CT0gIlx4NjlceGVhXHg2MFx4NzlceDhkXHg3MVx4NjFceDZjXHhjZVx4NWYiCi0JCQkgICJceGQwXHg4N1x4MWVceDIzXHg3NVx4NGNceGQ3XHg1ZFx4NWFceDBhIiwKLQl9LAotfTsKLQotLyoKLSAqIEhNQUMtU0hBMSB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMyMjAyCi0gKi8KLSNkZWZpbmUgSE1BQ19TSEExX1RFU1RfVkVDVE9SUwk3Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhMV90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIsCi0JCS5rc2l6ZQk9IDIwLAotCQkucGxhaW50ZXh0ID0gIkhpIFRoZXJlIiwKLQkJLnBzaXplCT0gOCwKLQkJLmRpZ2VzdAk9ICJceGI2XHgxN1x4MzFceDg2XHg1NVx4MDVceDcyXHg2NCIKLQkJCSAgIlx4ZTJceDhiXHhjMFx4YjZceGZiXHgzN1x4OGNceDhlXHhmMSIKLQkJCSAgIlx4NDZceGJlIiwKLQl9LCB7Ci0JCS5rZXkJPSAiSmVmZSIsCi0JCS5rc2l6ZQk9IDQsCi0JCS5wbGFpbnRleHQgPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCi0JCS5wc2l6ZQk9IDI4LAotCQkuZGlnZXN0CT0gIlx4ZWZceGZjXHhkZlx4NmFceGU1XHhlYlx4MmZceGEyXHhkMlx4NzQiCi0JCQkgICJceDE2XHhkNVx4ZjFceDg0XHhkZlx4OWNceDI1XHg5YVx4N2NceDc5IiwKLQkJLm5wCT0gMiwKLQkJLnRhcAk9IHsgMTQsIDE0IH0KLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAyMCwKLQkJLnBsYWludGV4dCA9ICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCi0JCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKLQkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgotCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCi0JCS5wc2l6ZQk9IDUwLAotCQkuZGlnZXN0CT0gIlx4MTJceDVkXHg3M1x4NDJceGI5XHhhY1x4MTFceGNkXHg5MVx4YTMiCi0JCQkgICJceDlhXHhmNFx4OGFceGExXHg3Ylx4NGZceDYzXHhmMVx4NzVceGQzIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiCi0JCQkgICJceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKLQkJCSAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOSIsCi0JCS5rc2l6ZQk9IDI1LAotCQkucGxhaW50ZXh0ID0gIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKLQkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgotCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCi0JCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIiwKLQkJLnBzaXplCT0gNTAsCi0JCS5kaWdlc3QJPSAiXHg0Y1x4OTBceDA3XHhmNFx4MDJceDYyXHg1MFx4YzZceGJjXHg4NCIKLQkJCSAgIlx4MTRceGY5XHhiZlx4NTBceGM4XHg2Y1x4MmRceDcyXHgzNVx4ZGEiLAotCX0sIHsKLQkJLmtleQk9ICJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIsCi0JCS5rc2l6ZQk9IDIwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKLQkJLnBzaXplCT0gMjAsCi0JCS5kaWdlc3QJPSAiXHg0Y1x4MWFceDAzXHg0Mlx4NGJceDU1XHhlMFx4N2ZceGU3XHhmMiIKLQkJCSAgIlx4N2JceGUxXHhkNVx4OGJceGI5XHgzMlx4NGFceDlhXHg1YVx4MDQiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYSIsCi0JCS5rc2l6ZQk9IDgwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCi0JCS5wc2l6ZQk9IDU0LAotCQkuZGlnZXN0CT0gIlx4YWFceDRhXHhlNVx4ZTFceDUyXHg3Mlx4ZDBceDBlXHg5NVx4NzAiCi0JCQkgICJceDU2XHgzN1x4Y2VceDhhXHgzYlx4NTVceGVkXHg0MFx4MjFceDEyIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWEiLAotCQkua3NpemUJPSA4MCwKLQkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIgVGhhbiBPbmUgIgotCQkJICAgIkJsb2NrLVNpemUgRGF0YSIsCi0JCS5wc2l6ZQk9IDczLAotCQkuZGlnZXN0CT0gIlx4ZThceGU5XHg5ZFx4MGZceDQ1XHgyM1x4N2RceDc4XHg2ZFx4NmIiCi0JCQkgICJceGJhXHhhN1x4OTZceDVjXHg3OFx4MDhceGJiXHhmZlx4MWFceDkxIiwKLQl9LAotfTsKLQotCi0vKgotICogU0hBMjI0IEhNQUMgdGVzdCB2ZWN0b3JzIGZyb20gUkZDNDIzMQotICovCi0jZGVmaW5lIEhNQUNfU0hBMjI0X1RFU1RfVkVDVE9SUyAgICA0Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhMjI0X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgotCQkJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgotCQkJIlx4MGJceDBiXHgwYlx4MGIiLAotCQkua3NpemUgID0gMjAsCi0JCS8qICAoIkhpIFRoZXJlIikgKi8KLQkJLnBsYWludGV4dCA9ICJceDQ4XHg2OVx4MjBceDU0XHg2OFx4NjVceDcyXHg2NSIsCi0JCS5wc2l6ZSAgPSA4LAotCQkuZGlnZXN0ID0gIlx4ODlceDZmXHhiMVx4MTJceDhhXHhiYlx4ZGZceDE5IgotCQkJIlx4NjhceDMyXHgxMFx4N2NceGQ0XHg5ZFx4ZjNceDNmIgotCQkJIlx4NDdceGI0XHhiMVx4MTZceDk5XHgxMlx4YmFceDRmIgotCQkJIlx4NTNceDY4XHg0Ylx4MjIiLAotCX0sIHsKLQkJLmtleSAgICA9ICJKZWZlIiwKLQkJLmtzaXplICA9IDQsCi0JCS8qICgid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIpICovCi0JCS5wbGFpbnRleHQgPSAiXHg3N1x4NjhceDYxXHg3NFx4MjBceDY0XHg2Zlx4MjAiCi0JCQkiXHg3OVx4NjFceDIwXHg3N1x4NjFceDZlXHg3NFx4MjAiCi0JCQkiXHg2Nlx4NmZceDcyXHgyMFx4NmVceDZmXHg3NFx4NjgiCi0JCQkiXHg2OVx4NmVceDY3XHgzZiIsCi0JCS5wc2l6ZSAgPSAyOCwKLQkJLmRpZ2VzdCA9ICJceGEzXHgwZVx4MDFceDA5XHg4Ylx4YzZceGRiXHhiZiIKLQkJCSJceDQ1XHg2OVx4MGZceDNhXHg3ZVx4OWVceDZkXHgwZiIKLQkJCSJceDhiXHhiZVx4YTJceGEzXHg5ZVx4NjFceDQ4XHgwMCIKLQkJCSJceDhmXHhkMFx4NWVceDQ0IiwKLQkJLm5wID0gNCwKLQkJLnRhcCAgICA9IHsgNywgNywgNywgNyB9Ci0JfSwgewotCQkua2V5ICAgID0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYSIsCi0JCS5rc2l6ZSAgPSAxMzEsCi0JCS8qICgiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IikgKi8KLQkJLnBsYWludGV4dCA9ICJceDU0XHg2NVx4NzNceDc0XHgyMFx4NTVceDczXHg2OSIKLQkJCSJceDZlXHg2N1x4MjBceDRjXHg2MVx4NzJceDY3XHg2NSIKLQkJCSJceDcyXHgyMFx4NTRceDY4XHg2MVx4NmVceDIwXHg0MiIKLQkJCSJceDZjXHg2Zlx4NjNceDZiXHgyZFx4NTNceDY5XHg3YSIKLQkJCSJceDY1XHgyMFx4NGJceDY1XHg3OVx4MjBceDJkXHgyMCIKLQkJCSJceDQ4XHg2MVx4NzNceDY4XHgyMFx4NGJceDY1XHg3OSIKLQkJCSJceDIwXHg0Nlx4NjlceDcyXHg3M1x4NzQiLAotCQkucHNpemUgID0gNTQsCi0JCS5kaWdlc3QgPSAiXHg5NVx4ZTlceGEwXHhkYlx4OTZceDIwXHg5NVx4YWQiCi0JCQkiXHhhZVx4YmVceDliXHgyZFx4NmZceDBkXHhiY1x4ZTIiCi0JCQkiXHhkNFx4OTlceGYxXHgxMlx4ZjJceGQyXHhiN1x4MjciCi0JCQkiXHgzZlx4YTZceDg3XHgwZSIsCi0JfSwgewotCQkua2V5ICAgID0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYSIsCi0JCS5rc2l6ZSAgPSAxMzEsCi0JCS8qICgiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSIpCi0JCSgiIGxhcmdlciB0aGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWVkcyB0byBiZSIpCi0JCQkoIiBoYXNoZWQgYmVmb3JlIGJlaW5nIHVzZWQgYnkgdGhlIEhNQUMgYWxnb3JpdGhtLiIpICovCi0JCS5wbGFpbnRleHQgPSAiXHg1NFx4NjhceDY5XHg3M1x4MjBceDY5XHg3M1x4MjAiCi0JCQkiXHg2MVx4MjBceDc0XHg2NVx4NzNceDc0XHgyMFx4NzUiCi0JCQkiXHg3M1x4NjlceDZlXHg2N1x4MjBceDYxXHgyMFx4NmMiCi0JCQkiXHg2MVx4NzJceDY3XHg2NVx4NzJceDIwXHg3NFx4NjgiCi0JCQkiXHg2MVx4NmVceDIwXHg2Mlx4NmNceDZmXHg2M1x4NmIiCi0JCQkiXHgyZFx4NzNceDY5XHg3YVx4NjVceDIwXHg2Ylx4NjUiCi0JCQkiXHg3OVx4MjBceDYxXHg2ZVx4NjRceDIwXHg2MVx4MjAiCi0JCQkiXHg2Y1x4NjFceDcyXHg2N1x4NjVceDcyXHgyMFx4NzQiCi0JCQkiXHg2OFx4NjFceDZlXHgyMFx4NjJceDZjXHg2Zlx4NjMiCi0JCQkiXHg2Ylx4MmRceDczXHg2OVx4N2FceDY1XHgyMFx4NjQiCi0JCQkiXHg2MVx4NzRceDYxXHgyZVx4MjBceDU0XHg2OFx4NjUiCi0JCQkiXHgyMFx4NmJceDY1XHg3OVx4MjBceDZlXHg2NVx4NjUiCi0JCQkiXHg2NFx4NzNceDIwXHg3NFx4NmZceDIwXHg2Mlx4NjUiCi0JCQkiXHgyMFx4NjhceDYxXHg3M1x4NjhceDY1XHg2NFx4MjAiCi0JCQkiXHg2Mlx4NjVceDY2XHg2Zlx4NzJceDY1XHgyMFx4NjIiCi0JCQkiXHg2NVx4NjlceDZlXHg2N1x4MjBceDc1XHg3M1x4NjUiCi0JCQkiXHg2NFx4MjBceDYyXHg3OVx4MjBceDc0XHg2OFx4NjUiCi0JCQkiXHgyMFx4NDhceDRkXHg0MVx4NDNceDIwXHg2MVx4NmMiCi0JCQkiXHg2N1x4NmZceDcyXHg2OVx4NzRceDY4XHg2ZFx4MmUiLAotCQkucHNpemUgID0gMTUyLAotCQkuZGlnZXN0ID0gIlx4M2FceDg1XHg0MVx4NjZceGFjXHg1ZFx4OWZceDAyIgotCQkJIlx4M2ZceDU0XHhkNVx4MTdceGQwXHhiM1x4OWRceGJkIgotCQkJIlx4OTRceDY3XHg3MFx4ZGJceDljXHgyYlx4OTVceGM5IgotCQkJIlx4ZjZceGY1XHg2NVx4ZDEiLAotCX0sCi19OwotCi0vKgotICogSE1BQy1TSEEyNTYgdGVzdCB2ZWN0b3JzIGZyb20KLSAqIGRyYWZ0LWlldGYtaXBzZWMtY2lwaC1zaGEtMjU2LTAxLnR4dAotICovCi0jZGVmaW5lIEhNQUNfU0hBMjU2X1RFU1RfVkVDVE9SUwkxMAotCi1zdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3NoYTI1Nl90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKLQkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgotCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MTgiCi0JCQkgICJceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmXHgyMCIsCi0JCS5rc2l6ZQk9IDMyLAotCQkucGxhaW50ZXh0ID0gImFiYyIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5kaWdlc3QJPSAiXHhhMlx4MWJceDFmXHg1ZFx4NGNceGY0XHhmN1x4M2EiCi0JCQkgICJceDRkXHhkOVx4MzlceDc1XHgwZlx4N2FceDA2XHg2YSIKLQkJCSAgIlx4N2ZceDk4XHhjY1x4MTNceDFjXHhiMVx4NmFceDY2IgotCQkJICAiXHg5Mlx4NzVceDkwXHgyMVx4Y2ZceGFiXHg4MVx4ODEiLAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKLQkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgotCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MTgiCi0JCQkgICJceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmXHgyMCIsCi0JCS5rc2l6ZQk9IDMyLAotCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKLQkJLnBzaXplCT0gNTYsCi0JCS5kaWdlc3QJPSAiXHgxMFx4NGZceGRjXHgxMlx4NTdceDMyXHg4Zlx4MDgiCi0JCQkgICJceDE4XHg0Ylx4YTdceDMxXHgzMVx4YzVceDNjXHhhZSIKLQkJCSAgIlx4ZTZceDk4XHhlM1x4NjFceDE5XHg0Mlx4MTFceDQ5IgotCQkJICAiXHhlYVx4OGNceDcxXHgyNFx4NTZceDY5XHg3ZFx4MzAiLAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKLQkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgotCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MTgiCi0JCQkgICJceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmXHgyMCIsCi0JCS5rc2l6ZQk9IDMyLAotCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIgotCQkJICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKLQkJLnBzaXplCT0gMTEyLAotCQkuZGlnZXN0CT0gIlx4NDdceDAzXHgwNVx4ZmNceDdlXHg0MFx4ZmVceDM0IgotCQkJICAiXHhkM1x4ZWVceGIzXHhlN1x4NzNceGQ5XHg1YVx4YWIiCi0JCQkgICJceDczXHhhY1x4ZjBceGZkXHgwNlx4MDRceDQ3XHhhNSIKLQkJCSAgIlx4ZWJceDQ1XHg5NVx4YmZceDMzXHhhOVx4ZDFceGEzIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIKLQkJCSJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgotCQkJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIsCi0JCS5rc2l6ZQk9IDMyLAotCQkucGxhaW50ZXh0ID0gIkhpIFRoZXJlIiwKLQkJLnBzaXplCT0gOCwKLQkJLmRpZ2VzdAk9ICJceDE5XHg4YVx4NjBceDdlXHhiNFx4NGJceGZiXHhjNiIKLQkJCSAgIlx4OTlceDAzXHhhMFx4ZjFceGNmXHgyYlx4YmRceGM1IgotCQkJICAiXHhiYVx4MGFceGEzXHhmM1x4ZDlceGFlXHgzY1x4MWMiCi0JCQkgICJceDdhXHgzYlx4MTZceDk2XHhhMFx4YjZceDhjXHhmNyIsCi0JfSwgewotCQkua2V5CT0gIkplZmUiLAotCQkua3NpemUJPSA0LAotCQkucGxhaW50ZXh0ID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAotCQkucHNpemUJPSAyOCwKLQkJLmRpZ2VzdAk9ICJceDViXHhkY1x4YzFceDQ2XHhiZlx4NjBceDc1XHg0ZSIKLQkJCSAgIlx4NmFceDA0XHgyNFx4MjZceDA4XHg5NVx4NzVceGM3IgotCQkJICAiXHg1YVx4MDBceDNmXHgwOFx4OWRceDI3XHgzOVx4ODMiCi0JCQkgICJceDlkXHhlY1x4NThceGI5XHg2NFx4ZWNceDM4XHg0MyIsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDE0LCAxNCB9Ci0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAzMiwKLQkJLnBsYWludGV4dCA9ICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCi0JCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKLQkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgotCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCi0JCS5wc2l6ZQk9IDUwLAotCQkuZGlnZXN0CT0gIlx4Y2RceGNiXHgxMlx4MjBceGQxXHhlY1x4Y2NceGVhIgotCQkJICAiXHg5MVx4ZTVceDNhXHhiYVx4MzBceDkyXHhmOVx4NjIiCi0JCQkgICJceGU1XHg0OVx4ZmVceDZjXHhlOVx4ZWRceDdmXHhkYyIKLQkJCSAgIlx4NDNceDE5XHgxZlx4YmRceGU0XHg1Y1x4MzBceGIwIiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiCi0JCQkgICJceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKLQkJCSAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4IgotCQkJICAiXHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZlx4MjAiCi0JCQkgICJceDIxXHgyMlx4MjNceDI0XHgyNSIsCi0JCS5rc2l6ZQk9IDM3LAotCQkucGxhaW50ZXh0ID0gIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKLQkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgotCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCi0JCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIiwKLQkJLnBzaXplCT0gNTAsCi0JCS5kaWdlc3QJPSAiXHhkNFx4NjNceDNjXHgxN1x4ZjZceGZiXHg4ZFx4NzQiCi0JCQkgICJceDRjXHg2Nlx4ZGVceGUwXHhmOFx4ZjBceDc0XHg1NSIKLQkJCSAgIlx4NmVceGM0XHhhZlx4NTVceGVmXHgwN1x4OTlceDg1IgotCQkJICAiXHg0MVx4NDZceDhlXHhiNFx4OWJceGQyXHhlOVx4MTciLAotCX0sIHsKLQkJLmtleQk9ICJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIgotCQkJIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiCi0JCQkiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKLQkJLmtzaXplCT0gMzIsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAotCQkucHNpemUJPSAyMCwKLQkJLmRpZ2VzdAk9ICJceDc1XHg0Nlx4YWZceDAxXHg4NFx4MWZceGMwXHg5YiIKLQkJCSAgIlx4MWFceGI5XHhjM1x4NzRceDlhXHg1Zlx4MWNceDE3IgotCQkJICAiXHhkNFx4ZjVceDg5XHg2Nlx4OGFceDU4XHg3Ylx4MjciCi0JCQkgICJceDAwXHhhOVx4YzlceDdjXHgxMVx4OTNceGNmXHg0MiIsCi0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhIiwKLQkJLmtzaXplCT0gODAsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKLQkJLnBzaXplCT0gNTQsCi0JCS5kaWdlc3QJPSAiXHg2OVx4NTNceDAyXHg1ZVx4ZDlceDZmXHgwY1x4MDkiCi0JCQkgICJceGY4XHgwYVx4OTZceGY3XHg4ZVx4NjVceDM4XHhkYiIKLQkJCSAgIlx4ZTJceGU3XHhiOFx4MjBceGUzXHhkZFx4OTdceDBlIgotCQkJICAiXHg3ZFx4ZGRceDM5XHgwOVx4MWJceDMyXHgzNVx4MmYiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYSIsCi0JCS5rc2l6ZQk9IDgwLAotCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuICIKLQkJCSAgICJPbmUgQmxvY2stU2l6ZSBEYXRhIiwKLQkJLnBzaXplCT0gNzMsCi0JCS5kaWdlc3QJPSAiXHg2M1x4NTVceGFjXHgyMlx4ZThceDkwXHhkMFx4YTMiCi0JCQkgICJceGM4XHg0OFx4MWFceDVjXHhhNFx4ODJceDViXHhjOCIKLQkJCSAgIlx4ODRceGQzXHhlN1x4YTFceGZmXHg5OFx4YTJceGZjIgotCQkJICAiXHgyYVx4YzdceGQ4XHhlMFx4NjRceGMzXHhiMlx4ZTYiLAotCX0sCi19OwotCi0jZGVmaW5lIFhDQkNfQUVTX1RFU1RfVkVDVE9SUyA2Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGFlc194Y2JjMTI4X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkucGxhaW50ZXh0ID0gemVyb2VkX3N0cmluZywKLQkJLmRpZ2VzdCA9ICJceDc1XHhmMFx4MjVceDFkXHg1Mlx4OGFceGMwXHgxYyIKLQkJCSAgIlx4NDVceDczXHhkZlx4ZDVceDg0XHhkN1x4OWZceDI5IiwKLQkJLnBzaXplCT0gMCwKLQkJLmtzaXplCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkucGxhaW50ZXh0ID0gIlx4MDBceDAxXHgwMiIsCi0JCS5kaWdlc3QJPSAiXHg1Ylx4MzdceDY1XHg4MFx4YWVceDJmXHgxOVx4YWYiCi0JCQkgICJceGU3XHgyMVx4OWNceGVlXHhmMVx4NzJceDc1XHg2ZiIsCi0JCS5wc2l6ZQk9IDMsCi0JCS5rc2l6ZQk9IDE2LAotCX0gLCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5wbGFpbnRleHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICAgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5kaWdlc3QgPSAiXHhkMlx4YTJceDQ2XHhmYVx4MzRceDliXHg2OFx4YTciCi0JCQkgICJceDk5XHg5OFx4YTRceDM5XHg0Zlx4ZjdceGEyXHg2MyIsCi0JCS5wc2l6ZQk9IDE2LAotCQkua3NpemUJPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5wbGFpbnRleHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICAgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgICAgIlx4MTBceDExXHgxMlx4MTMiLAotCQkuZGlnZXN0ID0gIlx4NDdceGY1XHgxYlx4NDVceDY0XHg5Nlx4NjJceDE1IgotCQkJICAiXHhiOFx4OThceDVjXHg2M1x4MDVceDVlXHhkM1x4MDgiLAotCQkudGFwCT0geyAxMCwgMTAgfSwKLQkJLnBzaXplCT0gMjAsCi0JCS5ucAk9IDIsCi0JCS5rc2l6ZQk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLnBsYWludGV4dCA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgICAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICAgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5kaWdlc3QgPSAiXHhmNVx4NGZceDBlXHhjOFx4ZDJceGI5XHhmM1x4ZDMiCi0JCQkgICJceDY4XHgwN1x4NzNceDRiXHhkNVx4MjhceDNmXHhkNCIsCi0JCS5wc2l6ZQk9IDMyLAotCQkua3NpemUJPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5wbGFpbnRleHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICAgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgICAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAgICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCi0JCQkgICAgICJceDIwXHgyMSIsCi0JCS5kaWdlc3QgPSAiXHhiZVx4Y2JceGIzXHhiY1x4Y2RceGI1XHgxOFx4YTMiCi0JCQkgICJceDA2XHg3N1x4ZDVceDQ4XHgxZlx4YjZceGI0XHhkOCIsCi0JCS50YXAJPSB7IDE3LCAxNyB9LAotCQkucHNpemUJPSAzNCwKLQkJLm5wCT0gMiwKLQkJLmtzaXplCT0gMTYsCi0JfQotfTsKLQotLyoKLSAqIFNIQTM4NCBITUFDIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzQyMzEKLSAqLwotCi0jZGVmaW5lIEhNQUNfU0hBMzg0X1RFU1RfVkVDVE9SUwk0Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgotCQkJICAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCi0JCQkgICJceDBiXHgwYlx4MGJceDBiIiwKLQkJLmtzaXplCT0gMjAsCi0JCS5wbGFpbnRleHQgPSAiSGkgVGhlcmUiLAotCQkucHNpemUJPSA4LAotCQkuZGlnZXN0CT0gIlx4YWZceGQwXHgzOVx4NDRceGQ4XHg0OFx4OTVceDYyIgotCQkJICAiXHg2Ylx4MDhceDI1XHhmNFx4YWJceDQ2XHg5MFx4N2YiCi0JCQkgICJceDE1XHhmOVx4ZGFceGRiXHhlNFx4MTBceDFlXHhjNiIKLQkJCSAgIlx4ODJceGFhXHgwM1x4NGNceDdjXHhlYlx4YzVceDljIgotCQkJICAiXHhmYVx4ZWFceDllXHhhOVx4MDdceDZlXHhkZVx4N2YiCi0JCQkgICJceDRhXHhmMVx4NTJceGU4XHhiMlx4ZmFceDljXHhiNiIsCi0JfSwgewotCQkua2V5CT0gIkplZmUiLAotCQkua3NpemUJPSA0LAotCQkucGxhaW50ZXh0ID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAotCQkucHNpemUJPSAyOCwKLQkJLmRpZ2VzdAk9ICJceGFmXHg0NVx4ZDJceGUzXHg3Nlx4NDhceDQwXHgzMSIKLQkJCSAgIlx4NjFceDdmXHg3OFx4ZDJceGI1XHg4YVx4NmJceDFiIgotCQkJICAiXHg5Y1x4N2VceGY0XHg2NFx4ZjVceGEwXHgxYlx4NDciCi0JCQkgICJceGU0XHgyZVx4YzNceDczXHg2M1x4MjJceDQ0XHg1ZSIKLQkJCSAgIlx4OGVceDIyXHg0MFx4Y2FceDVlXHg2OVx4ZTJceGM3IgotCQkJICAiXHg4Ylx4MzJceDM5XHhlY1x4ZmFceGIyXHgxNlx4NDkiLAotCQkubnAJPSA0LAotCQkudGFwCT0geyA3LCA3LCA3LCA3IH0KLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAxMzEsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXoiCi0JCQkgICAiZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCi0JCS5wc2l6ZQk9IDU0LAotCQkuZGlnZXN0CT0gIlx4NGVceGNlXHgwOFx4NDRceDg1XHg4MVx4M2VceDkwIgotCQkJICAiXHg4OFx4ZDJceGM2XHgzYVx4MDRceDFiXHhjNVx4YjQiCi0JCQkgICJceDRmXHg5ZVx4ZjFceDAxXHgyYVx4MmJceDU4XHg4ZiIKLQkJCSAgIlx4M2NceGQxXHgxZlx4MDVceDAzXHgzYVx4YzRceGM2IgotCQkJICAiXHgwY1x4MmVceGY2XHhhYlx4NDBceDMwXHhmZVx4ODIiCi0JCQkgICJceDk2XHgyNFx4OGRceGYxXHg2M1x4ZjRceDQ5XHg1MiIsCi0JfSwgewotCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhIiwKLQkJLmtzaXplCT0gMTMxLAotCQkucGxhaW50ZXh0ID0gIlRoaXMgaXMgYSB0ZXN0IHUiCi0JCQkgICAic2luZyBhIGxhcmdlciB0aCIKLQkJCSAgICJhbiBibG9jay1zaXplIGtlIgotCQkJICAgInkgYW5kIGEgbGFyZ2VyIHQiCi0JCQkgICAiaGFuIGJsb2NrLXNpemUgZCIKLQkJCSAgICJhdGEuIFRoZSBrZXkgbmVlIgotCQkJICAgImRzIHRvIGJlIGhhc2hlZCAiCi0JCQkgICAiYmVmb3JlIGJlaW5nIHVzZSIKLQkJCSAgICJkIGJ5IHRoZSBITUFDIGFsIgotCQkJICAgImdvcml0aG0uIiwKLQkJLnBzaXplCT0gMTUyLAotCQkuZGlnZXN0CT0gIlx4NjZceDE3XHgxN1x4OGVceDk0XHgxZlx4MDJceDBkIgotCQkJICAiXHgzNVx4MWVceDJmXHgyNVx4NGVceDhmXHhkM1x4MmMiCi0JCQkgICJceDYwXHgyNFx4MjBceGZlXHhiMFx4YjhceGZiXHg5YSIKLQkJCSAgIlx4ZGNceGNlXHhiYlx4ODJceDQ2XHgxZVx4OTlceGM1IgotCQkJICAiXHhhNlx4NzhceGNjXHgzMVx4ZTdceDk5XHgxN1x4NmQiCi0JCQkgICJceDM4XHg2MFx4ZTZceDExXHgwY1x4NDZceDUyXHgzZSIsCi0JfSwKLX07Ci0KLS8qCi0gKiBTSEE1MTIgSE1BQyB0ZXN0IHZlY3RvcnMgZnJvbSBSRkM0MjMxCi0gKi8KLQotI2RlZmluZSBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMJNAotCi1zdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3NoYTUxMl90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIKLQkJCSAgIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgotCQkJICAiXHgwYlx4MGJceDBiXHgwYiIsCi0JCS5rc2l6ZQk9IDIwLAotCQkucGxhaW50ZXh0ID0gIkhpIFRoZXJlIiwKLQkJLnBzaXplCT0gOCwKLQkJLmRpZ2VzdAk9ICJceDg3XHhhYVx4N2NceGRlXHhhNVx4ZWZceDYxXHg5ZCIKLQkJCSAgIlx4NGZceGYwXHhiNFx4MjRceDFhXHgxZFx4NmNceGIwIgotCQkJICAiXHgyM1x4NzlceGY0XHhlMlx4Y2VceDRlXHhjMlx4NzgiCi0JCQkgICJceDdhXHhkMFx4YjNceDA1XHg0NVx4ZTFceDdjXHhkZSIKLQkJCSAgIlx4ZGFceGE4XHgzM1x4YjdceGQ2XHhiOFx4YTdceDAyIgotCQkJICAiXHgwM1x4OGJceDI3XHg0ZVx4YWVceGEzXHhmNFx4ZTQiCi0JCQkgICJceGJlXHg5ZFx4OTFceDRlXHhlYlx4NjFceGYxXHg3MCIKLQkJCSAgIlx4MmVceDY5XHg2Y1x4MjBceDNhXHgxMlx4NjhceDU0IiwKLQl9LCB7Ci0JCS5rZXkJPSAiSmVmZSIsCi0JCS5rc2l6ZQk9IDQsCi0JCS5wbGFpbnRleHQgPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCi0JCS5wc2l6ZQk9IDI4LAotCQkuZGlnZXN0CT0gIlx4MTZceDRiXHg3YVx4N2JceGZjXHhmOFx4MTlceGUyIgotCQkJICAiXHhlM1x4OTVceGZiXHhlN1x4M2JceDU2XHhlMFx4YTMiCi0JCQkgICJceDg3XHhiZFx4NjRceDIyXHgyZVx4ODNceDFmXHhkNiIKLQkJCSAgIlx4MTBceDI3XHgwY1x4ZDdceGVhXHgyNVx4MDVceDU0IgotCQkJICAiXHg5N1x4NThceGJmXHg3NVx4YzBceDVhXHg5OVx4NGEiCi0JCQkgICJceDZkXHgwM1x4NGZceDY1XHhmOFx4ZjBceGU2XHhmZCIKLQkJCSAgIlx4Y2FceGVhXHhiMVx4YTNceDRkXHg0YVx4NmJceDRiIgotCQkJICAiXHg2M1x4NmVceDA3XHgwYVx4MzhceGJjXHhlN1x4MzciLAotCQkubnAJPSA0LAotCQkudGFwCT0geyA3LCA3LCA3LCA3IH0KLQl9LCB7Ci0JCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgotCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCi0JCQkgICJceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAxMzEsCi0JCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZSIKLQkJCSAgICJyIFRoYW4gQmxvY2stU2l6IgotCQkJICAgImUgS2V5IC0gSGFzaCBLZXkiCi0JCQkgICAiIEZpcnN0IiwKLQkJLnBzaXplCT0gNTQsCi0JCS5kaWdlc3QJPSAiXHg4MFx4YjJceDQyXHg2M1x4YzdceGMxXHhhM1x4ZWIiCi0JCQkiXHhiN1x4MTRceDkzXHhjMVx4ZGRceDdiXHhlOFx4YjQiCi0JCQkiXHg5Ylx4NDZceGQxXHhmNFx4MWJceDRhXHhlZVx4YzEiCi0JCQkiXHgxMlx4MWJceDAxXHgzN1x4ODNceGY4XHhmM1x4NTIiCi0JCQkiXHg2Ylx4NTZceGQwXHgzN1x4ZTBceDVmXHgyNVx4OTgiCi0JCQkiXHhiZFx4MGZceGQyXHgyMVx4NWRceDZhXHgxZVx4NTIiCi0JCQkiXHg5NVx4ZTZceDRmXHg3M1x4ZjZceDNmXHgwYVx4ZWMiCi0JCQkiXHg4Ylx4OTFceDVhXHg5OFx4NWRceDc4XHg2NVx4OTgiLAotCX0sIHsKLQkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKLQkJCSJceGFhXHhhYVx4YWEiLAotCQkua3NpemUJPSAxMzEsCi0JCS5wbGFpbnRleHQgPQotCQkJICAiVGhpcyBpcyBhIHRlc3QgdSIKLQkJCSAgInNpbmcgYSBsYXJnZXIgdGgiCi0JCQkgICJhbiBibG9jay1zaXplIGtlIgotCQkJICAieSBhbmQgYSBsYXJnZXIgdCIKLQkJCSAgImhhbiBibG9jay1zaXplIGQiCi0JCQkgICJhdGEuIFRoZSBrZXkgbmVlIgotCQkJICAiZHMgdG8gYmUgaGFzaGVkICIKLQkJCSAgImJlZm9yZSBiZWluZyB1c2UiCi0JCQkgICJkIGJ5IHRoZSBITUFDIGFsIgotCQkJICAiZ29yaXRobS4iLAotCQkucHNpemUJPSAxNTIsCi0JCS5kaWdlc3QJPSAiXHhlM1x4N2JceDZhXHg3N1x4NWRceGM4XHg3ZFx4YmEiCi0JCQkiXHhhNFx4ZGZceGE5XHhmOVx4NmVceDVlXHgzZlx4ZmQiCi0JCQkiXHhkZVx4YmRceDcxXHhmOFx4ODZceDcyXHg4OVx4ODYiCi0JCQkiXHg1ZFx4ZjVceGEzXHgyZFx4MjBceGNkXHhjOVx4NDQiCi0JCQkiXHhiNlx4MDJceDJjXHhhY1x4M2NceDQ5XHg4Mlx4YjEiCi0JCQkiXHgwZFx4NWVceGViXHg1NVx4YzNceGU0XHhkZVx4MTUiCi0JCQkiXHgxM1x4NDZceDc2XHhmYlx4NmRceGUwXHg0NFx4NjAiCi0JCQkiXHg2NVx4YzlceDc0XHg0MFx4ZmFceDhjXHg2YVx4NTgiLAotCX0sCi19OwotCiAvKgogICogREVTIHRlc3QgdmVjdG9ycy4KICAqLwotI2RlZmluZSBERVNfRU5DX1RFU1RfVkVDVE9SUwkJMTAKLSNkZWZpbmUgREVTX0RFQ19URVNUX1ZFQ1RPUlMJCTQKLSNkZWZpbmUgREVTX0NCQ19FTkNfVEVTVF9WRUNUT1JTCTUKLSNkZWZpbmUgREVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTCTQKLSNkZWZpbmUgREVTM19FREVfRU5DX1RFU1RfVkVDVE9SUwkzCi0jZGVmaW5lIERFUzNfRURFX0RFQ19URVNUX1ZFQ1RPUlMJMwotI2RlZmluZSBERVMzX0VERV9DQkNfRU5DX1RFU1RfVkVDVE9SUwkxCi0jZGVmaW5lIERFUzNfRURFX0NCQ19ERUNfVEVTVF9WRUNUT1JTCTEKKyNkZWZpbmUgREVTM19TUEVFRF9WRUNUT1JTCTEKIAotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBkZXNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5ICovCi0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7IC8qIFNhbWUga2V5LCBkaWZmZXJlbnQgcGxhaW50ZXh0IGJsb2NrICovCi0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7IC8qIFNib3ggdGVzdCBmcm9tIE5CUyAqLwotCQkua2V5CT0gIlx4N2NceGExXHgxMFx4NDVceDRhXHgxYVx4NmVceDU3IiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHgwMVx4YTFceGQ2XHhkMFx4MzlceDc3XHg2N1x4NDIiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg2OVx4MGZceDViXHgwZFx4OWFceDI2XHg5M1x4OWIiLAotCQkucmxlbgk9IDgsCi0JfSwgeyAvKiBUaHJlZSBibG9ja3MgKi8KLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgotCQkJICAiXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTkiCi0JCQkgICJceGNhXHhmZVx4YmFceGJlXHhmZVx4ZWRceGJlXHhlZiIsCi0JCS5pbGVuCT0gMjQsCi0JCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCi0JCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIKLQkJCSAgIlx4YjRceDk5XHgyNlx4ZjdceDFmXHhlMVx4ZDRceDkwIiwKLQkJLnJsZW4JPSAyNCwKLQl9LCB7IC8qIFdlYWsga2V5ICovCi0JCS5mYWlsCT0gMSwKLQkJLndrCT0gMSwKLQkJLmtleQk9ICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsgLyogVHdvIGJsb2NrcyAtLSBmb3IgdGVzdGluZyBlbmNyeXB0aW9uIGFjcm9zcyBwYWdlcyAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciCi0JCQkgICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCi0JCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIsCi0JCS5ybGVuCT0gMTYsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDgsIDggfQotCX0sIHsgLyogRm91ciBibG9ja3MgLS0gZm9yIHRlc3RpbmcgZW5jcnlwdGlvbiB3aXRoIGNodW5raW5nICovCi0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIKLQkJCSAgIlx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5IgotCQkJICAiXHhjYVx4ZmVceGJhXHhiZVx4ZmVceGVkXHhiZVx4ZWYiCi0JCQkgICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCi0JCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIKLQkJCSAgIlx4YjRceDk5XHgyNlx4ZjdceDFmXHhlMVx4ZDRceDkwIgotCQkJICAiXHhmN1x4OWNceDg5XHgyYVx4MzNceDhmXHg0YVx4OGIiLAotCQkucmxlbgk9IDMyLAotCQkubnAJPSAzLAotCQkudGFwCT0geyAxNCwgMTAsIDggfQotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgotCQkJICAiXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTkiCi0JCQkgICJceGNhXHhmZVx4YmFceGJlXHhmZVx4ZWRceGJlXHhlZiIsCi0JCS5pbGVuCT0gMjQsCi0JCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCi0JCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIKLQkJCSAgIlx4YjRceDk5XHgyNlx4ZjdceDFmXHhlMVx4ZDRceDkwIiwKLQkJLnJsZW4JPSAyNCwKLQkJLm5wCT0gNCwKLQkJLnRhcAk9IHsgMiwgMSwgMywgMTggfQotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgotCQkJICAiXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTkiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIgotCQkJICAiXHhmN1x4OWNceDg5XHgyYVx4MzNceDhmXHg0YVx4OGIiLAotCQkucmxlbgk9IDE2LAotCQkubnAJPSA1LAotCQkudGFwCT0geyAyLCAyLCAyLCAyLCA4IH0KLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIsCi0JCS5ybGVuCT0gOCwKLQkJLm5wCT0gOCwKLQkJLnRhcAk9IHsgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9Ci0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogRnJvbSBBcHBsaWVkIENyeXB0b2dyYXBoeSAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciLAotCQkucmxlbgk9IDgsCi0JfSwgeyAvKiBTYm94IHRlc3QgZnJvbSBOQlMgKi8KLQkJLmtleQk9ICJceDdjXHhhMVx4MTBceDQ1XHg0YVx4MWFceDZlXHg1NyIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4NjlceDBmXHg1Ylx4MGRceDlhXHgyNlx4OTNceDliIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDFceGExXHhkNlx4ZDBceDM5XHg3N1x4NjdceDQyIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsgLyogVHdvIGJsb2NrcywgZm9yIGNodW5raW5nIHRlc3QgKi8KLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIgotCQkJICAiXHg2OVx4MGZceDViXHgwZFx4OWFceDI2XHg5M1x4OWIiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgotCQkJICAiXHhhM1x4OTlceDdiXHhjYVx4YWZceDY5XHhhMFx4ZjUiLAotCQkucmxlbgk9IDE2LAotCQkubnAJPSAyLAotCQkudGFwCT0geyA4LCA4IH0KLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIKLQkJCSAgIlx4NjlceDBmXHg1Ylx4MGRceDlhXHgyNlx4OTNceDliIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIKLQkJCSAgIlx4YTNceDk5XHg3Ylx4Y2FceGFmXHg2OVx4YTBceGY1IiwKLQkJLnJsZW4JPSAxNiwKLQkJLm5wCT0gMywKLQkJLnRhcAk9IHsgMywgMTIsIDEgfQotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlc19jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIE9wZW5TU0wgKi8KLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLmlucHV0CT0gIlx4MzdceDM2XHgzNVx4MzRceDMzXHgzMlx4MzFceDIwIgotCQkJICAiXHg0ZVx4NmZceDc3XHgyMFx4NjlceDczXHgyMFx4NzQiCi0JCQkgICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIsCi0JCS5pbGVuCT0gMjQsCi0JCS5yZXN1bHQJPSAiXHhjY1x4ZDFceDczXHhmZlx4YWJceDIwXHgzOVx4ZjQiCi0JCQkgICJceGFjXHhkOFx4YWVceGZkXHhkZlx4ZDhceGExXHhlYiIKLQkJCSAgIlx4NDZceDhlXHg5MVx4MTVceDc4XHg4OFx4YmFceDY4IiwKLQkJLnJsZW4JPSAyNCwKLQl9LCB7IC8qIEZJUFMgUHViIDgxICovCi0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pdgk9ICJceDEyXHgzNFx4NTZceDc4XHg5MFx4YWJceGNkXHhlZiIsCi0JCS5pbnB1dAk9ICJceDRlXHg2Zlx4NzdceDIwXHg2OVx4NzNceDIwXHg3NCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGU1XHhjN1x4Y2RceGRlXHg4N1x4MmJceGYyXHg3YyIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pdgk9ICJceGU1XHhjN1x4Y2RceGRlXHg4N1x4MmJceGYyXHg3YyIsCi0JCS5pbnB1dAk9ICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDQzXHhlOVx4MzRceDAwXHg4Y1x4MzhceDljXHgwZiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pdgk9ICJceDQzXHhlOVx4MzRceDAwXHg4Y1x4MzhceDljXHgwZiIsCi0JCS5pbnB1dAk9ICJceDY2XHg2Zlx4NzJceDIwXHg2MVx4NmNceDZjXHgyMCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDY4XHgzN1x4ODhceDQ5XHg5YVx4N2NceDA1XHhmNiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7IC8qIENvcHkgb2Ygb3BlbnNzbCB2ZWN0b3IgZm9yIGNodW5rIHRlc3RpbmcgKi8KLQkgICAgIC8qIEZyb20gT3BlblNTTCAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaXYJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkuaW5wdXQJPSAiXHgzN1x4MzZceDM1XHgzNFx4MzNceDMyXHgzMVx4MjAiCi0JCQkgICJceDRlXHg2Zlx4NzdceDIwXHg2OVx4NzNceDIwXHg3NCIKLQkJCSAgIlx4NjhceDY1XHgyMFx4NzRceDY5XHg2ZFx4NjVceDIwIiwKLQkJLmlsZW4JPSAyNCwKLQkJLnJlc3VsdAk9ICJceGNjXHhkMVx4NzNceGZmXHhhYlx4MjBceDM5XHhmNCIKLQkJCSAgIlx4YWNceGQ4XHhhZVx4ZmRceGRmXHhkOFx4YTFceGViIgotCQkJICAiXHg0Nlx4OGVceDkxXHgxNVx4NzhceDg4XHhiYVx4NjgiLAotCQkucmxlbgk9IDI0LAotCQkubnAJPSAyLAotCQkudGFwCT0geyAxMywgMTEgfQotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlc19jYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGSVBTIFB1YiA4MSAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaXYJPSAiXHgxMlx4MzRceDU2XHg3OFx4OTBceGFiXHhjZFx4ZWYiLAotCQkuaW5wdXQJPSAiXHhlNVx4YzdceGNkXHhkZVx4ODdceDJiXHhmMlx4N2MiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg0ZVx4NmZceDc3XHgyMFx4NjlceDczXHgyMFx4NzQiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaXYJPSAiXHhlNVx4YzdceGNkXHhkZVx4ODdceDJiXHhmMlx4N2MiLAotCQkuaW5wdXQJPSAiXHg0M1x4ZTlceDM0XHgwMFx4OGNceDM4XHg5Y1x4MGYiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg2OFx4NjVceDIwXHg3NFx4NjlceDZkXHg2NVx4MjAiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaXYJPSAiXHg0M1x4ZTlceDM0XHgwMFx4OGNceDM4XHg5Y1x4MGYiLAotCQkuaW5wdXQJPSAiXHg2OFx4MzdceDg4XHg0OVx4OWFceDdjXHgwNVx4ZjYiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg2Nlx4NmZceDcyXHgyMFx4NjFceDZjXHg2Y1x4MjAiLAotCQkucmxlbgk9IDgsCi0JfSwgeyAvKiBDb3B5IG9mIGFib3ZlLCBmb3IgY2h1bmsgdGVzdGluZyAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmtsZW4JPSA4LAotCQkuaXYJPSAiXHg0M1x4ZTlceDM0XHgwMFx4OGNceDM4XHg5Y1x4MGYiLAotCQkuaW5wdXQJPSAiXHg2OFx4MzdceDg4XHg0OVx4OWFceDdjXHgwNVx4ZjYiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg2Nlx4NmZceDcyXHgyMFx4NjFceDZjXHg2Y1x4MjAiLAotCQkucmxlbgk9IDgsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDQsIDQgfQotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlczNfZWRlX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogVGhlc2UgYXJlIGZyb20gb3BlbnNzbCAqLworc3RhdGljIHN0cnVjdCBjaXBoZXJfc3BlZWRfdGVtcGxhdGUgZGVzM19zcGVlZF90ZW1wbGF0ZVtdID0geworCXsKIAkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKIAkJCSAgIlx4NTVceDU1XHg1NVx4NTVceDU1XHg1NVx4NTVceDU1IgogCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAogCQkua2xlbgk9IDI0LAotCQkuaW5wdXQJPSAiXHg3M1x4NmZceDZkXHg2NVx4NjRceDYxXHg3NFx4NjEiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHgxOFx4ZDdceDQ4XHhlNVx4NjNceDYyXHgwNVx4NzIiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MDNceDUyXHgwMlx4MDdceDY3XHgyMFx4ODJceDE3IgotCQkJICAiXHg4Nlx4MDJceDg3XHg2Nlx4NTlceDA4XHgyMVx4OTgiCi0JCQkgICJceDY0XHgwNVx4NmFceGJkXHhmZVx4YTlceDM0XHg1NyIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pbnB1dAk9ICJceDczXHg3MVx4NzVceDY5XHg2N1x4NjdceDZjXHg2NSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGMwXHg3ZFx4MmFceDBmXHhhNVx4NjZceGZhXHgzMCIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgxMFx4NDZceDEwXHgzNFx4ODlceDk4XHg4MFx4MjAiCi0JCQkgICJceDkxXHgwN1x4ZDBceDE1XHg4OVx4MTlceDAxXHgwMSIKLQkJCSAgIlx4MTlceDA3XHg5Mlx4MTBceDk4XHgxYVx4MDFceDAxIiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4ZTFceGVmXHg2Mlx4YzNceDMyXHhmZVx4ODJceDViIiwKLQkJLnJsZW4JPSA4LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlczNfZWRlX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogVGhlc2UgYXJlIGZyb20gb3BlbnNzbCAqLwotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgotCQkJICAiXHg1NVx4NTVceDU1XHg1NVx4NTVceDU1XHg1NVx4NTUiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pbnB1dAk9ICJceDE4XHhkN1x4NDhceGU1XHg2M1x4NjJceDA1XHg3MiIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDczXHg2Zlx4NmRceDY1XHg2NFx4NjFceDc0XHg2MSIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwM1x4NTJceDAyXHgwN1x4NjdceDIwXHg4Mlx4MTciCi0JCQkgICJceDg2XHgwMlx4ODdceDY2XHg1OVx4MDhceDIxXHg5OCIKLQkJCSAgIlx4NjRceDA1XHg2YVx4YmRceGZlXHhhOVx4MzRceDU3IiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4YzBceDdkXHgyYVx4MGZceGE1XHg2Nlx4ZmFceDMwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4NzNceDcxXHg3NVx4NjlceDY3XHg2N1x4NmNceDY1IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDEwXHg0Nlx4MTBceDM0XHg4OVx4OThceDgwXHgyMCIKLQkJCSAgIlx4OTFceDA3XHhkMFx4MTVceDg5XHgxOVx4MDFceDAxIgotCQkJICAiXHgxOVx4MDdceDkyXHgxMFx4OThceDFhXHgwMVx4MDEiLAotCQkua2xlbgk9IDI0LAotCQkuaW5wdXQJPSAiXHhlMVx4ZWZceDYyXHhjM1x4MzJceGZlXHg4Mlx4NWIiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkucmxlbgk9IDgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzM19lZGVfY2JjX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogR2VuZXJhdGVkIGZyb20gb3BlbnNzbCAqLwotCQkua2V5CT0gIlx4RTlceEMwXHhGRlx4MkVceDc2XHgwQlx4NjRceDI0IgotCQkJICAiXHg0NFx4NERceDk5XHg1QVx4MTJceEQ2XHg0MFx4QzAiCi0JCQkgICJceEVBXHhDMlx4ODRceEU4XHgxNFx4OTVceERCXHhFOCIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pdgk9ICJceDdEXHgzM1x4ODhceDkzXHgwRlx4OTNceEIyXHg0MiIsCi0JCS5pbnB1dAk9ICJceDZmXHg1NFx4MjBceDZmXHg2MVx4NGRceDc5XHg2ZSIKLQkJCSAgIlx4NTNceDIwXHg2M1x4NjVceDY1XHg3Mlx4NzNceDc0IgotCQkJICAiXHg1NFx4MjBceDZmXHg2Zlx4NGRceDIwXHg2ZVx4NjEiCi0JCQkgICJceDIwXHg3OVx4NjVceDUzXHg3Mlx4NjNceDc0XHg2NSIKLQkJCSAgIlx4MjBceDczXHg2Zlx4NTRceDIwXHg2Zlx4NjFceDRkIgotCQkJICAiXHg3OVx4NmVceDUzXHgyMFx4NjNceDY1XHg2NVx4NzIiCi0JCQkgICJceDczXHg3NFx4NTRceDIwXHg2Zlx4NmZceDRkXHgyMCIKLQkJCSAgIlx4NmVceDYxXHgyMFx4NzlceDY1XHg1M1x4NzJceDYzIgotCQkJICAiXHg3NFx4NjVceDIwXHg3M1x4NmZceDU0XHgyMFx4NmYiCi0JCQkgICJceDYxXHg0ZFx4NzlceDZlXHg1M1x4MjBceDYzXHg2NSIKLQkJCSAgIlx4NjVceDcyXHg3M1x4NzRceDU0XHgyMFx4NmZceDZmIgotCQkJICAiXHg0ZFx4MjBceDZlXHg2MVx4MjBceDc5XHg2NVx4NTMiCi0JCQkgICJceDcyXHg2M1x4NzRceDY1XHgyMFx4NzNceDZmXHg1NCIKLQkJCSAgIlx4MjBceDZmXHg2MVx4NGRceDc5XHg2ZVx4NTNceDIwIgotCQkJICAiXHg2M1x4NjVceDY1XHg3Mlx4NzNceDc0XHg1NFx4MjAiCi0JCQkgICJceDZmXHg2Zlx4NGRceDIwXHg2ZVx4NjFceDBhXHg3OSIsCi0JCS5pbGVuCT0gMTI4LAotCQkucmVzdWx0CT0gIlx4MGVceDJkXHhiNlx4OTdceDNjXHg1Nlx4MzNceGY0IgotCQkJICAiXHg2N1x4MTdceDIxXHhjN1x4NmVceDhhXHhkNVx4NDkiCi0JCQkgICJceDc0XHhiM1x4NDlceDA1XHhjNVx4MWNceGQwXHhlZCIKLQkJCSAgIlx4MTJceDU2XHg1Y1x4NTNceDk2XHhiNlx4MDBceDdkIgotCQkJICAiXHg5MFx4NDhceGZjXHhmNVx4OGRceDI5XHgzOVx4Y2MiCi0JCQkgICJceDhhXHhkNVx4MzVceDE4XHgzNlx4MjNceDRlXHhkNyIKLQkJCSAgIlx4NzZceGQxXHhkYVx4MGNceDk0XHg2N1x4YmJceDA0IgotCQkJICAiXHg4Ylx4ZjJceDAzXHg2Y1x4YThceGNmXHhiNlx4ZWEiCi0JCQkgICJceDIyXHg2NFx4NDdceGFhXHg4Zlx4NzVceDEzXHhiZiIKLQkJCSAgIlx4OWZceGMyXHhjM1x4ZjBceGM5XHg1Nlx4YzVceDdhIgotCQkJICAiXHg3MVx4NjNceDJlXHg4OVx4N2JceDFlXHgxMlx4Y2EiCi0JCQkgICJceGUyXHg1Zlx4YWZceGQ4XHhhNFx4ZjhceGM5XHg3YSIKLQkJCSAgIlx4ZDZceGY5XHgyMVx4MzFceDYyXHg0NFx4NDVceGE2IgotCQkJICAiXHhkNlx4YmNceDVhXHhkM1x4MmRceDU0XHg0M1x4Y2MiCi0JCQkgICJceDlkXHhkZVx4YTVceDcwXHhlOVx4NDJceDQ1XHg4YSIKLQkJCSAgIlx4NmJceGZhXHhiMVx4OTFceDEzXHhiMFx4ZDlceDE5IiwKLQkJLnJsZW4JPSAxMjgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzM19lZGVfY2JjX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogR2VuZXJhdGVkIGZyb20gb3BlbnNzbCAqLwotCQkua2V5CT0gIlx4RTlceEMwXHhGRlx4MkVceDc2XHgwQlx4NjRceDI0IgotCQkJICAiXHg0NFx4NERceDk5XHg1QVx4MTJceEQ2XHg0MFx4QzAiCi0JCQkgICJceEVBXHhDMlx4ODRceEU4XHgxNFx4OTVceERCXHhFOCIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pdgk9ICJceDdEXHgzM1x4ODhceDkzXHgwRlx4OTNceEIyXHg0MiIsCi0JCS5pbnB1dAk9ICJceDBlXHgyZFx4YjZceDk3XHgzY1x4NTZceDMzXHhmNCIKLQkJCSAgIlx4NjdceDE3XHgyMVx4YzdceDZlXHg4YVx4ZDVceDQ5IgotCQkJICAiXHg3NFx4YjNceDQ5XHgwNVx4YzVceDFjXHhkMFx4ZWQiCi0JCQkgICJceDEyXHg1Nlx4NWNceDUzXHg5Nlx4YjZceDAwXHg3ZCIKLQkJCSAgIlx4OTBceDQ4XHhmY1x4ZjVceDhkXHgyOVx4MzlceGNjIgotCQkJICAiXHg4YVx4ZDVceDM1XHgxOFx4MzZceDIzXHg0ZVx4ZDciCi0JCQkgICJceDc2XHhkMVx4ZGFceDBjXHg5NFx4NjdceGJiXHgwNCIKLQkJCSAgIlx4OGJceGYyXHgwM1x4NmNceGE4XHhjZlx4YjZceGVhIgotCQkJICAiXHgyMlx4NjRceDQ3XHhhYVx4OGZceDc1XHgxM1x4YmYiCi0JCQkgICJceDlmXHhjMlx4YzNceGYwXHhjOVx4NTZceGM1XHg3YSIKLQkJCSAgIlx4NzFceDYzXHgyZVx4ODlceDdiXHgxZVx4MTJceGNhIgotCQkJICAiXHhlMlx4NWZceGFmXHhkOFx4YTRceGY4XHhjOVx4N2EiCi0JCQkgICJceGQ2XHhmOVx4MjFceDMxXHg2Mlx4NDRceDQ1XHhhNiIKLQkJCSAgIlx4ZDZceGJjXHg1YVx4ZDNceDJkXHg1NFx4NDNceGNjIgotCQkJICAiXHg5ZFx4ZGVceGE1XHg3MFx4ZTlceDQyXHg0NVx4OGEiCi0JCQkgICJceDZiXHhmYVx4YjFceDkxXHgxM1x4YjBceGQ5XHgxOSIsCi0JCS5pbGVuCT0gMTI4LAotCQkucmVzdWx0CT0gIlx4NmZceDU0XHgyMFx4NmZceDYxXHg0ZFx4NzlceDZlIgotCQkJICAiXHg1M1x4MjBceDYzXHg2NVx4NjVceDcyXHg3M1x4NzQiCi0JCQkgICJceDU0XHgyMFx4NmZceDZmXHg0ZFx4MjBceDZlXHg2MSIKLQkJCSAgIlx4MjBceDc5XHg2NVx4NTNceDcyXHg2M1x4NzRceDY1IgotCQkJICAiXHgyMFx4NzNceDZmXHg1NFx4MjBceDZmXHg2MVx4NGQiCi0JCQkgICJceDc5XHg2ZVx4NTNceDIwXHg2M1x4NjVceDY1XHg3MiIKLQkJCSAgIlx4NzNceDc0XHg1NFx4MjBceDZmXHg2Zlx4NGRceDIwIgotCQkJICAiXHg2ZVx4NjFceDIwXHg3OVx4NjVceDUzXHg3Mlx4NjMiCi0JCQkgICJceDc0XHg2NVx4MjBceDczXHg2Zlx4NTRceDIwXHg2ZiIKLQkJCSAgIlx4NjFceDRkXHg3OVx4NmVceDUzXHgyMFx4NjNceDY1IgotCQkJICAiXHg2NVx4NzJceDczXHg3NFx4NTRceDIwXHg2Zlx4NmYiCi0JCQkgICJceDRkXHgyMFx4NmVceDYxXHgyMFx4NzlceDY1XHg1MyIKLQkJCSAgIlx4NzJceDYzXHg3NFx4NjVceDIwXHg3M1x4NmZceDU0IgotCQkJICAiXHgyMFx4NmZceDYxXHg0ZFx4NzlceDZlXHg1M1x4MjAiCi0JCQkgICJceDYzXHg2NVx4NjVceDcyXHg3M1x4NzRceDU0XHgyMCIKLQkJCSAgIlx4NmZceDZmXHg0ZFx4MjBceDZlXHg2MVx4MGFceDc5IiwKLQkJLnJsZW4JPSAxMjgsCi0JfSwKLX07Ci0KLS8qCi0gKiBCbG93ZmlzaCB0ZXN0IHZlY3RvcnMuCi0gKi8KLSNkZWZpbmUgQkZfRU5DX1RFU1RfVkVDVE9SUwk2Ci0jZGVmaW5lIEJGX0RFQ19URVNUX1ZFQ1RPUlMJNgotI2RlZmluZSBCRl9DQkNfRU5DX1RFU1RfVkVDVE9SUwkxCi0jZGVmaW5lIEJGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCTEKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBiZl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7IC8qIERFUyB0ZXN0IHZlY3RvcnMgZnJvbSBPcGVuU1NMICovCi0JCS5rZXkJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDRlXHhmOVx4OTdceDQ1XHg2MVx4OThceGRkXHg3OCIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgxZlx4MWZceDFmXHgxZlx4MGVceDBlXHgwZVx4MGUiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGE3XHg5MFx4NzlceDUxXHgwOFx4ZWFceDNjXHhhZSIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGU4XHg3YVx4MjRceDRlXHgyY1x4YzhceDVlXHg4MiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7IC8qIFZhcnkgdGhlIGtleWxlbmd0aC4uLiAqLwotCQkua2V5CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IgotCQkJICAiXHg3OFx4NjlceDVhXHg0Ylx4M2NceDJkXHgxZVx4MGYiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg5M1x4MTRceDI4XHg4N1x4ZWVceDNiXHhlMVx4NWMiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IgotCQkJICAiXHg3OFx4NjlceDVhXHg0Ylx4M2NceDJkXHgxZVx4MGYiCi0JCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NCIsCi0JCS5rbGVuCT0gMjEsCi0JCS5pbnB1dAk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGU2XHhmNVx4MWVceGQ3XHg5Ylx4OWRceGIyXHgxZiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIGJmNDg4ICovCi0JCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciCi0JCQkgICJceDc4XHg2OVx4NWFceDRiXHgzY1x4MmRceDFlXHgwZiIKLQkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHgwNFx4NjhceDkxXHgwNFx4YzJceGZkXHgzYlx4MmYiCi0JCQkgICJceDU4XHg0MFx4MjNceDY0XHgxYVx4YmFceDYxXHg3NiIKLQkJCSAgIlx4MWZceDFmXHgxZlx4MWZceDBlXHgwZVx4MGVceDBlIgotCQkJICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLAotCQkua2xlbgk9IDU2LAotCQkuaW5wdXQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHhjMFx4NDVceDA0XHgwMVx4MmVceDRlXHgxZlx4NTMiLAotCQkucmxlbgk9IDgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBERVMgdGVzdCB2ZWN0b3JzIGZyb20gT3BlblNTTCAqLwotCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHg0ZVx4ZjlceDk3XHg0NVx4NjFceDk4XHhkZFx4NzgiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MWZceDFmXHgxZlx4MWZceDBlXHgwZVx4MGVceDBlIiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHhhN1x4OTBceDc5XHg1MVx4MDhceGVhXHgzY1x4YWUiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmtsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHhlOFx4N2FceDI0XHg0ZVx4MmNceGM4XHg1ZVx4ODIiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkucmxlbgk9IDgsCi0JfSwgeyAvKiBWYXJ5IHRoZSBrZXlsZW5ndGguLi4gKi8KLQkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIKLQkJCSAgIlx4NzhceDY5XHg1YVx4NGJceDNjXHgyZFx4MWVceDBmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4OTNceDE0XHgyOFx4ODdceGVlXHgzYlx4ZTFceDVjIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIKLQkJCSAgIlx4NzhceDY5XHg1YVx4NGJceDNjXHgyZFx4MWVceDBmIgotCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDQiLAotCQkua2xlbgk9IDIxLAotCQkuaW5wdXQJPSAiXHhlNlx4ZjVceDFlXHhkN1x4OWJceDlkXHhiMlx4MWYiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkucmxlbgk9IDgsCi0JfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBiZjQ4OCwgdXNpbmcgT3BlblNTTCwgTGliZ2NyeXB0IGFuZCBOZXR0bGUgKi8KLQkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIKLQkJCSAgIlx4NzhceDY5XHg1YVx4NGJceDNjXHgyZFx4MWVceDBmIgotCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkgICJceDA0XHg2OFx4OTFceDA0XHhjMlx4ZmRceDNiXHgyZiIKLQkJCSAgIlx4NThceDQwXHgyM1x4NjRceDFhXHhiYVx4NjFceDc2IgotCQkJICAiXHgxZlx4MWZceDFmXHgxZlx4MGVceDBlXHgwZVx4MGUiCi0JCQkgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsCi0JCS5rbGVuCT0gNTYsCi0JCS5pbnB1dAk9ICJceGMwXHg0NVx4MDRceDAxXHgyZVx4NGVceDFmXHg1MyIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5ybGVuCT0gOCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBiZl9jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIE9wZW5TU0wgKi8KLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLmlucHV0CT0gIlx4MzdceDM2XHgzNVx4MzRceDMzXHgzMlx4MzFceDIwIgotCQkJICAiXHg0ZVx4NmZceDc3XHgyMFx4NjlceDczXHgyMFx4NzQiCi0JCQkgICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIKLQkJCSAgIlx4NjZceDZmXHg3Mlx4MjBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDZiXHg3N1x4YjRceGQ2XHgzMFx4MDZceGRlXHhlNiIKLQkJCSAgIlx4MDVceGIxXHg1Nlx4ZTJceDc0XHgwM1x4OTdceDkzIgotCQkJICAiXHg1OFx4ZGVceGI5XHhlN1x4MTVceDQ2XHgxNlx4ZDkiCi0JCQkgICJceDU5XHhmMVx4NjVceDJiXHhkNVx4ZmZceDkyXHhjYyIsCi0JCS5ybGVuCT0gMzIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfY2JjX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogRnJvbSBPcGVuU1NMICovCi0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5pbnB1dAk9ICJceDZiXHg3N1x4YjRceGQ2XHgzMFx4MDZceGRlXHhlNiIKLQkJCSAgIlx4MDVceGIxXHg1Nlx4ZTJceDc0XHgwM1x4OTdceDkzIgotCQkJICAiXHg1OFx4ZGVceGI5XHhlN1x4MTVceDQ2XHgxNlx4ZDkiCi0JCQkgICJceDU5XHhmMVx4NjVceDJiXHhkNVx4ZmZceDkyXHhjYyIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQJPSAiXHgzN1x4MzZceDM1XHgzNFx4MzNceDMyXHgzMVx4MjAiCi0JCQkgICJceDRlXHg2Zlx4NzdceDIwXHg2OVx4NzNceDIwXHg3NCIKLQkJCSAgIlx4NjhceDY1XHgyMFx4NzRceDY5XHg2ZFx4NjVceDIwIgotCQkJICAiXHg2Nlx4NmZceDcyXHgyMFx4MDBceDAwXHgwMFx4MDAiLAotCQkucmxlbgk9IDMyLAotCX0sCi19OwotCi0vKgotICogVHdvZmlzaCB0ZXN0IHZlY3RvcnMuCi0gKi8KLSNkZWZpbmUgVEZfRU5DX1RFU1RfVkVDVE9SUwkJMwotI2RlZmluZSBURl9ERUNfVEVTVF9WRUNUT1JTCQkzCi0jZGVmaW5lIFRGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCQk0Ci0jZGVmaW5lIFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCQk0Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGZfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKLQkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIKLQkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceGNmXHhkMVx4ZDJceGU1XHhhOVx4YmVceDljXHhkZiIKLQkJCSAgIlx4NTBceDFmXHgxM1x4YjhceDkyXHhiZFx4MjJceDQ4IiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIKLQkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAotCQkua2xlbgk9IDMyLAotCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MzdceDUyXHg3Ylx4ZTBceDA1XHgyM1x4MzRceGI4IgotCQkJICAiXHg5Zlx4MGNceGZjXHhjYVx4ZThceDdjXHhmYVx4MjAiLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRmX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKLQkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgotCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCi0JCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pbnB1dAk9ICJceGNmXHhkMVx4ZDJceGU1XHhhOVx4YmVceDljXHhkZiIKLQkJCSAgIlx4NTBceDFmXHgxM1x4YjhceDkyXHhiZFx4MjJceDQ4IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgotCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCi0JCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKLQkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4MzdceDUyXHg3Ylx4ZTBceDA1XHgyM1x4MzRceGI4IgotCQkJICAiXHg5Zlx4MGNceGZjXHhjYVx4ZThceDdjXHhmYVx4MjAiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0Zl9jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBHZW5lcmF0ZWQgd2l0aCBOZXR0bGUgKi8KLQkJLmtleQk9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9IHplcm9lZF9zdHJpbmcsCi0JCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg5Zlx4NThceDlmXHg1Y1x4ZjZceDEyXHgyY1x4MzIiCi0JCQkgICJceGI2XHhiZlx4ZWNceDJmXHgyYVx4ZThceGMzXHg1YSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4OWZceDU4XHg5Zlx4NWNceGY2XHgxMlx4MmNceDMyIgotCQkJICAiXHhiNlx4YmZceGVjXHgyZlx4MmFceGU4XHhjM1x4NWEiLAotCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4ZDRceDkxXHhkYlx4MTZceGU3XHhiMVx4YzNceDllIgotCQkJICAiXHg4Nlx4Y2JceDA4XHg2Ylx4NzhceDlmXHg1NFx4MTkiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceGQ0XHg5MVx4ZGJceDE2XHhlN1x4YjFceGMzXHg5ZSIKLQkJCSAgIlx4ODZceGNiXHgwOFx4NmJceDc4XHg5Zlx4NTRceDE5IiwKLQkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDA1XHhlZlx4OGNceDYxXHhhOFx4MTFceDU4XHgyNiIKLQkJCSAgIlx4MzRceGJhXHg1Y1x4YjdceDEwXHg2YVx4YTZceDQxIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSB6ZXJvZWRfc3RyaW5nLAotCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDQ4LAotCQkucmVzdWx0CT0gIlx4OWZceDU4XHg5Zlx4NWNceGY2XHgxMlx4MmNceDMyIgotCQkJICAiXHhiNlx4YmZceGVjXHgyZlx4MmFceGU4XHhjM1x4NWEiCi0JCQkgICJceGQ0XHg5MVx4ZGJceDE2XHhlN1x4YjFceGMzXHg5ZSIKLQkJCSAgIlx4ODZceGNiXHgwOFx4NmJceDc4XHg5Zlx4NTRceDE5IgotCQkJICAiXHgwNVx4ZWZceDhjXHg2MVx4YThceDExXHg1OFx4MjYiCi0JCQkgICJceDM0XHhiYVx4NWNceGI3XHgxMFx4NmFceGE2XHg0MSIsCi0JCS5ybGVuCT0gNDgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGZfY2JjX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogUmV2ZXJzZSBvZiB0aGUgZmlyc3QgZm91ciBhYm92ZSAqLwotCQkua2V5CT0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gemVyb2VkX3N0cmluZywKLQkJLmlucHV0CT0gIlx4OWZceDU4XHg5Zlx4NWNceGY2XHgxMlx4MmNceDMyIgotCQkJICAiXHhiNlx4YmZceGVjXHgyZlx4MmFceGU4XHhjM1x4NWEiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHg5Zlx4NThceDlmXHg1Y1x4ZjZceDEyXHgyY1x4MzIiCi0JCQkgICJceGI2XHhiZlx4ZWNceDJmXHgyYVx4ZThceGMzXHg1YSIsCi0JCS5pbnB1dAk9ICJceGQ0XHg5MVx4ZGJceDE2XHhlN1x4YjFceGMzXHg5ZSIKLQkJCSAgIlx4ODZceGNiXHgwOFx4NmJceDc4XHg5Zlx4NTRceDE5IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4ZDRceDkxXHhkYlx4MTZceGU3XHhiMVx4YzNceDllIgotCQkJICAiXHg4Nlx4Y2JceDA4XHg2Ylx4NzhceDlmXHg1NFx4MTkiLAotCQkuaW5wdXQJPSAiXHgwNVx4ZWZceDhjXHg2MVx4YThceDExXHg1OFx4MjYiCi0JCQkgICJceDM0XHhiYVx4NWNceGI3XHgxMFx4NmFceGE2XHg0MSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9IHplcm9lZF9zdHJpbmcsCi0JCS5pbnB1dAk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKLQkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIgotCQkJICAiXHhkNFx4OTFceGRiXHgxNlx4ZTdceGIxXHhjM1x4OWUiCi0JCQkgICJceDg2XHhjYlx4MDhceDZiXHg3OFx4OWZceDU0XHgxOSIKLQkJCSAgIlx4MDVceGVmXHg4Y1x4NjFceGE4XHgxMVx4NThceDI2IgotCQkJICAiXHgzNFx4YmFceDVjXHhiN1x4MTBceDZhXHhhNlx4NDEiLAotCQkuaWxlbgk9IDQ4LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSA0OCwKLQl9LAotfTsKLQotLyoKLSAqIFNlcnBlbnQgdGVzdCB2ZWN0b3JzLiAgVGhlc2UgYXJlIGJhY2t3YXJkcyBiZWNhdXNlIFNlcnBlbnQgd3JpdGVzCi0gKiBvY3RldCBzZXF1ZW5jZXMgaW4gcmlnaHQtdG8tbGVmdCBtb2RlLgotICovCi0jZGVmaW5lIFNFUlBFTlRfRU5DX1RFU1RfVkVDVE9SUwk0Ci0jZGVmaW5lIFNFUlBFTlRfREVDX1RFU1RfVkVDVE9SUwk0Ci0KLSNkZWZpbmUgVE5FUFJFU19FTkNfVEVTVF9WRUNUT1JTCTQKLSNkZWZpbmUgVE5FUFJFU19ERUNfVEVTVF9WRUNUT1JTCTQKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBzZXJwZW50X2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmlucHV0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MTJceDA3XHhmY1x4Y2VceDliXHhkMFx4ZDZceDQ3IgotCQkJICAiXHg2YVx4ZTlceDhmXHhiZVx4ZDFceDQzXHhhMFx4ZTIiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NGNceDdkXHg4YVx4MzJceDgwXHg3Mlx4YTJceDJjIgotCQkJICAiXHg4Mlx4M2VceDRhXHgxZlx4M2FceGNkXHhhMVx4NmQiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceGRlXHgyNlx4OWZceGY4XHgzM1x4ZTRceDMyXHhiOCIKLQkJCSAgIlx4NWJceDJlXHg4OFx4ZDJceDcwXHgxY1x4ZTdceDVjIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg4MCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhkZFx4ZDJceDZiXHg5OFx4YTVceGZmXHhkOFx4MmMiCi0JCQkgICJceDA1XHgzNFx4NWFceDlkXHhhZFx4YmZceGFmXHg0OSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdG5lcHJlc19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7IC8qIEtleVNpemU9MTI4LCBQVD0wLCBJPTEgKi8KLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkua2V5ICAgID0gIlx4ODBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkua2xlbiAgID0gMTYsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg0OVx4YWZceGJmXHhhZFx4OWRceDVhXHgzNFx4MDUiCi0JCQkgICJceDJjXHhkOFx4ZmZceGE1XHg5OFx4NmJceGQyXHhkZCIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgeyAvKiBLZXlTaXplPTE5MiwgUFQ9MCwgST0xICovCi0JCS5rZXkJPSAiXHg4MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4ZTdceDhlXHg1NFx4MDJceGM3XHgxOVx4NTVceDY4IgotCQkJICAiXHhhY1x4MzZceDc4XHhmN1x4YTNceGY2XHgwY1x4NjYiLAotCQkucmxlbgk9IDE2LAotCX0sIHsgLyogS2V5U2l6ZT0yNTYsIFBUPTAsIEk9MSAqLwotCQkua2V5CT0gIlx4ODBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4YWJceGVkXHg5Nlx4ZTdceDY2XHhiZlx4MjhceGNiIgotCQkJICAiXHhjMFx4ZWJceGQyXHgxYVx4ODJceGVmXHgwOFx4MTkiLAotCQkucmxlbgk9IDE2LAotCX0sIHsgLyogS2V5U2l6ZT0yNTYsIEk9MjU3ICovCi0JCS5rZXkJPSAiXHgxZlx4MWVceDFkXHgxY1x4MWJceDFhXHgxOVx4MTgiCi0JCQkgICJceDE3XHgxNlx4MTVceDE0XHgxM1x4MTJceDExXHgxMCIKLQkJCSAgIlx4MGZceDBlXHgwZFx4MGNceDBiXHgwYVx4MDlceDA4IgotCQkJICAiXHgwN1x4MDZceDA1XHgwNFx4MDNceDAyXHgwMVx4MDAiLAotCQkua2xlbgk9IDMyLAotCQkuaW5wdXQJPSAiXHgwZlx4MGVceDBkXHgwY1x4MGJceDBhXHgwOVx4MDgiCi0JCQkgICJceDA3XHgwNlx4MDVceDA0XHgwM1x4MDJceDAxXHgwMCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg1Y1x4ZTdceDFjXHg3MFx4ZDJceDg4XHgyZVx4NWIiCi0JCQkgICJceGI4XHgzMlx4ZTRceDMzXHhmOFx4OWZceDI2XHhkZSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBzZXJwZW50X2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmlucHV0CT0gIlx4MTJceDA3XHhmY1x4Y2VceDliXHhkMFx4ZDZceDQ3IgotCQkJICAiXHg2YVx4ZTlceDhmXHhiZVx4ZDFceDQzXHhhMFx4ZTIiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NGNceDdkXHg4YVx4MzJceDgwXHg3Mlx4YTJceDJjIgotCQkJICAiXHg4Mlx4M2VceDRhXHgxZlx4M2FceGNkXHhhMVx4NmQiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pbnB1dAk9ICJceGRlXHgyNlx4OWZceGY4XHgzM1x4ZTRceDMyXHhiOCIKLQkJCSAgIlx4NWJceDJlXHg4OFx4ZDJceDcwXHgxY1x4ZTdceDVjIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg4MCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGRkXHhkMlx4NmJceDk4XHhhNVx4ZmZceGQ4XHgyYyIKLQkJCSAgIlx4MDVceDM0XHg1YVx4OWRceGFkXHhiZlx4YWZceDQ5IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gMTYsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdG5lcHJlc19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5pbnB1dAk9ICJceDQxXHhjY1x4NmJceDMxXHg1OVx4MzFceDQ1XHg5NyIKLQkJCSAgIlx4NmRceDZmXHhiYlx4MzhceDRiXHgzN1x4MjFceDI4IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGVhXHhmNFx4ZDdceGZjXHhkOFx4MDFceDM0XHg0NyIKLQkJCSAgIlx4ODFceDQ1XHgwYlx4ZmFceDBjXHhkNlx4YWRceDZlIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAotCQkua2xlbgk9IDMyLAotCQkuaW5wdXQJPSAiXHg2NFx4YTlceDFhXHgzN1x4ZWRceDlmXHhlN1x4NDkiCi0JCQkgICJceGE4XHg0ZVx4NzZceGQ2XHhmNVx4MGRceDc4XHhlZSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgeyAvKiBLZXlTaXplPTEyOCwgST0xMjEgKi8KLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDgwIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4M2RceGRhXHhiZlx4YzBceDA2XHhkYVx4YWJceDA2IgotCQkJICAiXHg0Nlx4MmFceGY0XHhlZlx4ODFceDU0XHg0ZVx4MjYiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotCi0vKiBDYXN0NiB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMgMjYxMiAqLwotI2RlZmluZSBDQVNUNl9FTkNfVEVTVF9WRUNUT1JTCTMKLSNkZWZpbmUgQ0FTVDZfREVDX1RFU1RfVkVDVE9SUyAgMwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q2X2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDIzXHg0Mlx4YmJceDllXHhmYVx4MzhceDU0XHgyYyIKLQkJCSAgIlx4MGFceGY3XHg1Nlx4NDdceGYyXHg5Zlx4NjFceDVkIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceGM4XHg0Mlx4YTBceDg5XHg3Mlx4YjRceDNkXHgyMCIKLQkJCSAgIlx4ODNceDZjXHg5MVx4ZDFceGI3XHg1M1x4MGZceDZiIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCi0JCQkgICJceGJlXHhkMFx4YWNceDgzXHg5NFx4MGFceGMyXHg5OCIKLQkJCSAgIlx4YmFceGM3XHg3YVx4NzdceDE3XHg5NFx4MjhceDYzIiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDFiXHgzOFx4NmNceDAyXHgxMFx4ZGNceGFkXHhjYiIKLQkJCSAgIlx4ZGRceDBlXHg0MVx4YWFceDA4XHhhN1x4YTdceGU4IiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCi0JCQkgICJceGJlXHhkMFx4YWNceDgzXHg5NFx4MGFceGMyXHg5OCIKLQkJCSAgIlx4OGRceDdjXHg0N1x4Y2VceDI2XHg0OVx4MDhceDQ2IgotCQkJICAiXHgxY1x4YzFceGI1XHgxM1x4N2FceGU2XHhiNlx4MDQiLAotCQkua2xlbgk9IDMyLAotCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NGZceDZhXHgyMFx4MzhceDI4XHg2OFx4OTdceGI5IgotCQkJICAiXHhjOVx4ODdceDAxXHgzNlx4NTVceDMzXHgxN1x4ZmEiLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q2X2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDIzXHg0Mlx4YmJceDllXHhmYVx4MzhceDU0XHgyYyIKLQkJCSAgIlx4MGFceGY3XHg1Nlx4NDdceGYyXHg5Zlx4NjFceDVkIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4YzhceDQyXHhhMFx4ODlceDcyXHhiNFx4M2RceDIwIgotCQkJICAiXHg4M1x4NmNceDkxXHhkMVx4YjdceDUzXHgwZlx4NmIiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCi0JCQkgICJceGJlXHhkMFx4YWNceDgzXHg5NFx4MGFceGMyXHg5OCIKLQkJCSAgIlx4YmFceGM3XHg3YVx4NzdceDE3XHg5NFx4MjhceDYzIiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4MWJceDM4XHg2Y1x4MDJceDEwXHhkY1x4YWRceGNiIgotCQkJICAiXHhkZFx4MGVceDQxXHhhYVx4MDhceGE3XHhhN1x4ZTgiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCi0JCQkgICJceGJlXHhkMFx4YWNceDgzXHg5NFx4MGFceGMyXHg5OCIKLQkJCSAgIlx4OGRceDdjXHg0N1x4Y2VceDI2XHg0OVx4MDhceDQ2IgotCQkJICAiXHgxY1x4YzFceGI1XHgxM1x4N2FceGU2XHhiNlx4MDQiLAotCQkua2xlbgk9IDMyLAotCQkuaW5wdXQJPSAiXHg0Zlx4NmFceDIwXHgzOFx4MjhceDY4XHg5N1x4YjkiCi0JCQkgICJceGM5XHg4N1x4MDFceDM2XHg1NVx4MzNceDE3XHhmYSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi0KLS8qCi0gKiBBRVMgdGVzdCB2ZWN0b3JzLgotICovCi0jZGVmaW5lIEFFU19FTkNfVEVTVF9WRUNUT1JTIDMKLSNkZWZpbmUgQUVTX0RFQ19URVNUX1ZFQ1RPUlMgMwotI2RlZmluZSBBRVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMgNAotI2RlZmluZSBBRVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMgNAotI2RlZmluZSBBRVNfTFJXX0VOQ19URVNUX1ZFQ1RPUlMgOAotI2RlZmluZSBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMgOAotI2RlZmluZSBBRVNfWFRTX0VOQ19URVNUX1ZFQ1RPUlMgNAotI2RlZmluZSBBRVNfWFRTX0RFQ19URVNUX1ZFQ1RPUlMgNAotI2RlZmluZSBBRVNfQ1RSX0VOQ19URVNUX1ZFQ1RPUlMgNwotI2RlZmluZSBBRVNfQ1RSX0RFQ19URVNUX1ZFQ1RPUlMgNgotI2RlZmluZSBBRVNfR0NNX0VOQ19URVNUX1ZFQ1RPUlMgOQotI2RlZmluZSBBRVNfR0NNX0RFQ19URVNUX1ZFQ1RPUlMgOAotI2RlZmluZSBBRVNfQ0NNX0VOQ19URVNUX1ZFQ1RPUlMgNwotI2RlZmluZSBBRVNfQ0NNX0RFQ19URVNUX1ZFQ1RPUlMgNwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7IC8qIEZyb20gRklQUy0xOTcgKi8KLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NjlceGM0XHhlMFx4ZDhceDZhXHg3Ylx4MDRceDMwIgotCQkJICAiXHhkOFx4Y2RceGI3XHg4MFx4NzBceGI0XHhjNVx4NWEiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciLAotCQkua2xlbgk9IDI0LAotCQkuaW5wdXQJPSAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhkZFx4YTlceDdjXHhhNFx4ODZceDRjXHhkZlx4ZTAiCi0JCQkgICJceDZlXHhhZlx4NzBceGEwXHhlY1x4MGRceDcxXHg5MSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4OGVceGEyXHhiN1x4Y2FceDUxXHg2N1x4NDVceGJmIgotCQkJICAiXHhlYVx4ZmNceDQ5XHg5MFx4NGJceDQ5XHg2MFx4ODkiLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7IC8qIEZyb20gRklQUy0xOTcgKi8KLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NjlceGM0XHhlMFx4ZDhceDZhXHg3Ylx4MDRceDMwIgotCQkJICAiXHhkOFx4Y2RceGI3XHg4MFx4NzBceGI0XHhjNVx4NWEiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciLAotCQkua2xlbgk9IDI0LAotCQkuaW5wdXQJPSAiXHhkZFx4YTlceDdjXHhhNFx4ODZceDRjXHhkZlx4ZTAiCi0JCQkgICJceDZlXHhhZlx4NzBceGEwXHhlY1x4MGRceDcxXHg5MSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4OGVceGEyXHhiN1x4Y2FceDUxXHg2N1x4NDVceGJmIgotCQkJICAiXHhlYVx4ZmNceDQ5XHg5MFx4NGJceDQ5XHg2MFx4ODkiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgotCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIFJGQyAzNjAyICovCi0JCS5rZXkgICAgPSAiXHgwNlx4YTlceDIxXHg0MFx4MzZceGI4XHhhMVx4NWIiCi0JCQkgICJceDUxXHgyZVx4MDNceGQ1XHgzNFx4MTJceDAwXHgwNiIsCi0JCS5rbGVuICAgPSAxNiwKLQkJLml2CT0gIlx4M2RceGFmXHhiYVx4NDJceDlkXHg5ZVx4YjRceDMwIgotCQkJICAiXHhiNFx4MjJceGRhXHg4MFx4MmNceDlmXHhhY1x4NDEiLAotCQkuaW5wdXQJPSAiU2luZ2xlIGJsb2NrIG1zZyIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceGUzXHg1M1x4NzdceDljXHgxMFx4NzlceGFlXHhiOCIKLQkJCSAgIlx4MjdceDA4XHg5NFx4MmRceGJlXHg3N1x4MThceDFhIiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsKLQkJLmtleSAgICA9ICJceGMyXHg4Nlx4NjlceDZkXHg4OFx4N2NceDlhXHhhMCIKLQkJCSAgIlx4NjFceDFiXHhiYlx4M2VceDIwXHgyNVx4YTRceDVhIiwKLQkJLmtsZW4gICA9IDE2LAotCQkuaXYgICAgID0gIlx4NTZceDJlXHgxN1x4OTlceDZkXHgwOVx4M2RceDI4IgotCQkJICAiXHhkZFx4YjNceGJhXHg2OVx4NWFceDJlXHg2Zlx4NTgiLAotCQkuaW5wdXQgID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmlsZW4gICA9IDMyLAotCQkucmVzdWx0ID0gIlx4ZDJceDk2XHhjZFx4OTRceGMyXHhjY1x4Y2ZceDhhIgotCQkJICAiXHgzYVx4ODZceDMwXHgyOFx4YjVceGUxXHhkY1x4MGEiCi0JCQkgICJceDc1XHg4Nlx4NjBceDJkXHgyNVx4M2NceGZmXHhmOSIKLQkJCSAgIlx4MWJceDgyXHg2Nlx4YmVceGE2XHhkNlx4MWFceGIxIiwKLQkJLnJsZW4gICA9IDMyLAotCX0sIHsgLyogRnJvbSBOSVNUIFNQODAwLTM4QSAqLwotCQkua2V5CT0gIlx4OGVceDczXHhiMFx4ZjdceGRhXHgwZVx4NjRceDUyIgotCQkJICAiXHhjOFx4MTBceGYzXHgyYlx4ODBceDkwXHg3OVx4ZTUiCi0JCQkgICJceDYyXHhmOFx4ZWFceGQyXHg1Mlx4MmNceDZiXHg3YiIsCi0JCS5rbGVuCT0gMjQsCi0JCS5pdgk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmlucHV0CT0gIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2IgotCQkJICAiXHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiCi0JCQkgICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5YyIKLQkJCSAgIlx4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIgotCQkJICAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTEiCi0JCQkgICJceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIKLQkJCSAgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3IgotCQkJICAiXHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAotCQkuaWxlbgk9IDY0LAotCQkucmVzdWx0CT0gIlx4NGZceDAyXHgxZFx4YjJceDQzXHhiY1x4NjNceDNkIgotCQkJICAiXHg3MVx4NzhceDE4XHgzYVx4OWZceGEwXHg3MVx4ZTgiCi0JCQkgICJceGI0XHhkOVx4YWRceGE5XHhhZFx4N2RceGVkXHhmNCIKLQkJCSAgIlx4ZTVceGU3XHgzOFx4NzZceDNmXHg2OVx4MTRceDVhIgotCQkJICAiXHg1N1x4MWJceDI0XHgyMFx4MTJceGZiXHg3YVx4ZTAiCi0JCQkgICJceDdmXHhhOVx4YmFceGFjXHgzZFx4ZjFceDAyXHhlMCIKLQkJCSAgIlx4MDhceGIwXHhlMlx4NzlceDg4XHg1OVx4ODhceDgxIgotCQkJICAiXHhkOVx4MjBceGE5XHhlNlx4NGZceDU2XHgxNVx4Y2QiLAotCQkucmxlbgk9IDY0LAotCX0sIHsKLQkJLmtleQk9ICJceDYwXHgzZFx4ZWJceDEwXHgxNVx4Y2FceDcxXHhiZSIKLQkJCSAgIlx4MmJceDczXHhhZVx4ZjBceDg1XHg3ZFx4NzdceDgxIgotCQkJICAiXHgxZlx4MzVceDJjXHgwN1x4M2JceDYxXHgwOFx4ZDciCi0JCQkgICJceDJkXHg5OFx4MTBceGEzXHgwOVx4MTRceGRmXHhmNCIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pdgk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmlucHV0CT0gIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2IgotCQkJICAiXHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiCi0JCQkgICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5YyIKLQkJCSAgIlx4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIgotCQkJICAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTEiCi0JCQkgICJceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIKLQkJCSAgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3IgotCQkJICAiXHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAotCQkuaWxlbgk9IDY0LAotCQkucmVzdWx0CT0gIlx4ZjVceDhjXHg0Y1x4MDRceGQ2XHhlNVx4ZjFceGJhIgotCQkJICAiXHg3N1x4OWVceGFiXHhmYlx4NWZceDdiXHhmYlx4ZDYiCi0JCQkgICJceDljXHhmY1x4NGVceDk2XHg3ZVx4ZGJceDgwXHg4ZCIKLQkJCSAgIlx4NjdceDlmXHg3N1x4N2JceGM2XHg3MFx4MmNceDdkIgotCQkJICAiXHgzOVx4ZjJceDMzXHg2OVx4YTlceGQ5XHhiYVx4Y2YiCi0JCQkgICJceGE1XHgzMFx4ZTJceDYzXHgwNFx4MjNceDE0XHg2MSIKLQkJCSAgIlx4YjJceGViXHgwNVx4ZTJceGMzXHg5Ylx4ZTlceGZjIgotCQkJICAiXHhkYVx4NmNceDE5XHgwN1x4OGNceDZhXHg5ZFx4MWIiLAotCQkucmxlbgk9IDY0LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19jYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIFJGQyAzNjAyICovCi0JCS5rZXkgICAgPSAiXHgwNlx4YTlceDIxXHg0MFx4MzZceGI4XHhhMVx4NWIiCi0JCQkgICJceDUxXHgyZVx4MDNceGQ1XHgzNFx4MTJceDAwXHgwNiIsCi0JCS5rbGVuICAgPSAxNiwKLQkJLml2ICAgICA9ICJceDNkXHhhZlx4YmFceDQyXHg5ZFx4OWVceGI0XHgzMCIKLQkJCSAgIlx4YjRceDIyXHhkYVx4ODBceDJjXHg5Zlx4YWNceDQxIiwKLQkJLmlucHV0ICA9ICJceGUzXHg1M1x4NzdceDljXHgxMFx4NzlceGFlXHhiOCIKLQkJCSAgIlx4MjdceDA4XHg5NFx4MmRceGJlXHg3N1x4MThceDFhIiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0ID0gIlNpbmdsZSBibG9jayBtc2ciLAotCQkucmxlbiAgID0gMTYsCi0JfSwgewotCQkua2V5ICAgID0gIlx4YzJceDg2XHg2OVx4NmRceDg4XHg3Y1x4OWFceGEwIgotCQkJICAiXHg2MVx4MWJceGJiXHgzZVx4MjBceDI1XHhhNFx4NWEiLAotCQkua2xlbiAgID0gMTYsCi0JCS5pdiAgICAgPSAiXHg1Nlx4MmVceDE3XHg5OVx4NmRceDA5XHgzZFx4MjgiCi0JCQkgICJceGRkXHhiM1x4YmFceDY5XHg1YVx4MmVceDZmXHg1OCIsCi0JCS5pbnB1dCAgPSAiXHhkMlx4OTZceGNkXHg5NFx4YzJceGNjXHhjZlx4OGEiCi0JCQkgICJceDNhXHg4Nlx4MzBceDI4XHhiNVx4ZTFceGRjXHgwYSIKLQkJCSAgIlx4NzVceDg2XHg2MFx4MmRceDI1XHgzY1x4ZmZceGY5IgotCQkJICAiXHgxYlx4ODJceDY2XHhiZVx4YTZceGQ2XHgxYVx4YjEiLAotCQkuaWxlbiAgID0gMzIsCi0JCS5yZXN1bHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAotCQkucmxlbiAgID0gMzIsCi0JfSwgeyAvKiBGcm9tIE5JU1QgU1A4MDAtMzhBICovCi0JCS5rZXkJPSAiXHg4ZVx4NzNceGIwXHhmN1x4ZGFceDBlXHg2NFx4NTIiCi0JCQkgICJceGM4XHgxMFx4ZjNceDJiXHg4MFx4OTBceDc5XHhlNSIKLQkJCSAgIlx4NjJceGY4XHhlYVx4ZDJceDUyXHgyY1x4NmJceDdiIiwKLQkJLmtsZW4JPSAyNCwKLQkJLml2CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkuaW5wdXQJPSAiXHg0Zlx4MDJceDFkXHhiMlx4NDNceGJjXHg2M1x4M2QiCi0JCQkgICJceDcxXHg3OFx4MThceDNhXHg5Zlx4YTBceDcxXHhlOCIKLQkJCSAgIlx4YjRceGQ5XHhhZFx4YTlceGFkXHg3ZFx4ZWRceGY0IgotCQkJICAiXHhlNVx4ZTdceDM4XHg3Nlx4M2ZceDY5XHgxNFx4NWEiCi0JCQkgICJceDU3XHgxYlx4MjRceDIwXHgxMlx4ZmJceDdhXHhlMCIKLQkJCSAgIlx4N2ZceGE5XHhiYVx4YWNceDNkXHhmMVx4MDJceGUwIgotCQkJICAiXHgwOFx4YjBceGUyXHg3OVx4ODhceDU5XHg4OFx4ODEiCi0JCQkgICJceGQ5XHgyMFx4YTlceGU2XHg0Zlx4NTZceDE1XHhjZCIsCi0JCS5pbGVuCT0gNjQsCi0JCS5yZXN1bHQJPSAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTYiCi0JCQkgICJceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIKLQkJCSAgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljIgotCQkJICAiXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiCi0JCQkgICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMSIKLQkJCSAgIlx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIgotCQkJICAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTciCi0JCQkgICJceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCi0JCS5ybGVuCT0gNjQsCi0JfSwgewotCQkua2V5CT0gIlx4NjBceDNkXHhlYlx4MTBceDE1XHhjYVx4NzFceGJlIgotCQkJICAiXHgyYlx4NzNceGFlXHhmMFx4ODVceDdkXHg3N1x4ODEiCi0JCQkgICJceDFmXHgzNVx4MmNceDA3XHgzYlx4NjFceDA4XHhkNyIKLQkJCSAgIlx4MmRceDk4XHgxMFx4YTNceDA5XHgxNFx4ZGZceGY0IiwKLQkJLmtsZW4JPSAzMiwKLQkJLml2CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAotCQkuaW5wdXQJPSAiXHhmNVx4OGNceDRjXHgwNFx4ZDZceGU1XHhmMVx4YmEiCi0JCQkgICJceDc3XHg5ZVx4YWJceGZiXHg1Zlx4N2JceGZiXHhkNiIKLQkJCSAgIlx4OWNceGZjXHg0ZVx4OTZceDdlXHhkYlx4ODBceDhkIgotCQkJICAiXHg2N1x4OWZceDc3XHg3Ylx4YzZceDcwXHgyY1x4N2QiCi0JCQkgICJceDM5XHhmMlx4MzNceDY5XHhhOVx4ZDlceGJhXHhjZiIKLQkJCSAgIlx4YTVceDMwXHhlMlx4NjNceDA0XHgyM1x4MTRceDYxIgotCQkJICAiXHhiMlx4ZWJceDA1XHhlMlx4YzNceDliXHhlOVx4ZmMiCi0JCQkgICJceGRhXHg2Y1x4MTlceDA3XHg4Y1x4NmFceDlkXHgxYiIsCi0JCS5pbGVuCT0gNjQsCi0JCS5yZXN1bHQJPSAiXHg2Ylx4YzFceGJlXHhlMlx4MmVceDQwXHg5Zlx4OTYiCi0JCQkgICJceGU5XHgzZFx4N2VceDExXHg3M1x4OTNceDE3XHgyYSIKLQkJCSAgIlx4YWVceDJkXHg4YVx4NTdceDFlXHgwM1x4YWNceDljIgotCQkJICAiXHg5ZVx4YjdceDZmXHhhY1x4NDVceGFmXHg4ZVx4NTEiCi0JCQkgICJceDMwXHhjOFx4MWNceDQ2XHhhM1x4NWNceGU0XHgxMSIKLQkJCSAgIlx4ZTVceGZiXHhjMVx4MTlceDFhXHgwYVx4NTJceGVmIgotCQkJICAiXHhmNlx4OWZceDI0XHg0NVx4ZGZceDRmXHg5Ylx4MTciCi0JCQkgICJceGFkXHgyYlx4NDFceDdiXHhlNlx4NmNceDM3XHgxMCIsCi0JCS5ybGVuCT0gNjQsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYWVzX2xyd19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQkvKiBmcm9tIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xNjE5L2VtYWlsL3BkZjAwMDE3LnBkZiAqLwotCXsgLyogTFJXLTMyLUFFUyAxICovCi0JCS5rZXkgICAgPSAiXHg0NVx4NjJceGFjXHgyNVx4ZjhceDI4XHgxN1x4NmQiCi0JCQkgICJceDRjXHgyNlx4ODRceDE0XHhiNVx4NjhceDAxXHg4NSIKLQkJCSAgIlx4MjVceDhlXHgyYVx4MDVceGU3XHgzZVx4OWRceDAzIgotCQkJICAiXHhlZVx4NWFceDgzXHgwY1x4Y2NceDA5XHg0Y1x4ODciLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCi0JCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceGYxXHhiMlx4NzNceGNkXHg2NVx4YTNceGRmXHg1ZiIKLQkJCSAgIlx4ZTlceDVkXHg0OFx4OTJceDU0XHg2M1x4NGVceGI4IiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsgLyogTFJXLTMyLUFFUyAyICovCi0JCS5rZXkgICAgPSAiXHg1OVx4NzBceDQ3XHgxNFx4ZjVceDU3XHg0N1x4OGMiCi0JCQkgICJceGQ3XHg3OVx4ZThceDBmXHg1NFx4ODhceDc5XHg0NCIKLQkJCSAgIlx4MGRceDQ4XHhmMFx4YjdceGIxXHg1YVx4NTNceGVhIgotCQkJICAiXHgxY1x4YWFceDZiXHgyOVx4YzJceGNhXHhmYlx4YWYiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMiIsCi0JCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceDAwXHhjOFx4MmJceGFlXHg5NVx4YmJceGNkXHhlNSIKLQkJCSAgIlx4MjdceDRmXHgwN1x4NjlceGIyXHg2MFx4ZTFceDM2IiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsgLyogTFJXLTMyLUFFUyAzICovCi0JCS5rZXkgICAgPSAiXHhkOFx4MmFceDkxXHgzNFx4YjJceDZhXHg1Nlx4NTAiCi0JCQkgICJceDMwXHhmZVx4NjlceGUyXHgzN1x4N2ZceDk4XHg0NyIKLQkJCSAgIlx4Y2RceGY5XHgwYlx4MTZceDBjXHg2NFx4OGZceGI2IgotCQkJICAiXHhiMFx4MGRceDBkXHgxYlx4YWVceDg1XHg4N1x4MWYiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceDc2XHgzMlx4MjFceDgzXHhlZFx4OGZceGYxXHg4MiIKLQkJCSAgIlx4ZjlceDU5XHg2Mlx4MDNceDY5XHgwZVx4NWVceDAxIiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsgLyogTFJXLTMyLUFFUyA0ICovCi0JCS5rZXkgICAgPSAiXHgwZlx4NmFceGVmXHhmOFx4ZDNceGQyXHhiYlx4MTUiCi0JCQkgICJceDI1XHg4M1x4ZjdceDNjXHgxZlx4MDFceDI4XHg3NCIKLQkJCSAgIlx4Y2FceGM2XHhiY1x4MzVceDRkXHg0YVx4NjVceDU0IgotCQkJICAiXHg5MFx4YWVceDYxXHhjZlx4N2JceGFlXHhiZFx4Y2MiCi0JCQkgICJceGFkXHhlNFx4OTRceGM1XHg0YVx4MjlceGFlXHg3MCIsCi0JCS5rbGVuICAgPSA0MCwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIiwKLQkJLmlucHV0ICA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKLQkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0ID0gIlx4OWNceDBmXHgxNVx4MmZceDU1XHhhMlx4ZDhceGYwIgotCQkJICAiXHhkNlx4N2JceDhmXHg5ZVx4MjhceDIyXHhiY1x4NDEiLAotCQkucmxlbiAgID0gMTYsCi0JfSwgeyAvKiBMUlctMzItQUVTIDUgKi8KLQkJLmtleSAgICA9ICJceDhhXHhkNFx4ZWVceDEwXHgyZlx4YmRceDgxXHhmZiIKLQkJCSAgIlx4ZjhceDg2XHhjZVx4YWNceDkzXHhjNVx4YWRceGM2IgotCQkJICAiXHhhMFx4MTlceDA3XHhjMFx4OWRceGY3XHhiYlx4ZGQiCi0JCQkgICJceDUyXHgxM1x4YjJceGI3XHhmMFx4ZmZceDExXHhkOCIKLQkJCSAgIlx4ZDZceDA4XHhkMFx4Y2RceDJlXHhiMVx4MTdceDZmIiwKLQkJLmtsZW4gICA9IDQwLAotCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDAiLAotCQkuaW5wdXQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgotCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAotCQkuaWxlbiAgID0gMTYsCi0JCS5yZXN1bHQgPSAiXHhkNFx4MjdceDZhXHg3Zlx4MTRceDkxXHgzZFx4NjUiCi0JCQkgICJceGM4XHg2MFx4NDhceDAyXHg4N1x4ZTNceDM0XHgwNiIsCi0JCS5ybGVuICAgPSAxNiwKLQl9LCB7IC8qIExSVy0zMi1BRVMgNiAqLwotCQkua2V5ICAgID0gIlx4ZjhceGQ0XHg3Nlx4ZmZceGQ2XHg0Nlx4ZWVceDZjIgotCQkJICAiXHgyM1x4ODRceGNiXHgxY1x4NzdceGQ2XHgxOVx4NWQiCi0JCQkgICJceGZlXHhmMVx4YTlceGYzXHg3Ylx4YmNceDhkXHgyMSIKLQkJCSAgIlx4YTdceDljXHgyMVx4ZjhceGNiXHg5MFx4MDJceDg5IgotCQkJICAiXHhhOFx4NDVceDM0XHg4ZVx4YzhceGM1XHhiNVx4ZjEiCi0JCQkgICJceDI2XHhmNVx4MGVceDc2XHhmZVx4ZmRceDFiXHgxZSIsCi0JCS5rbGVuICAgPSA0OCwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIiwKLQkJLmlucHV0ICA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKLQkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0ID0gIlx4YmRceDA2XHhiOFx4ZTFceGRiXHg5OFx4ODlceDllIgotCQkJICAiXHhjNFx4OThceGU0XHg5MVx4Y2ZceDFjXHg3MFx4MmIiLAotCQkucmxlbiAgID0gMTYsCi0JfSwgeyAvKiBMUlctMzItQUVTIDcgKi8KLQkJLmtleSAgICA9ICJceGZiXHg3Nlx4MTVceGIyXHgzZFx4ODBceDg5XHgxZCIKLQkJCSAgIlx4ZDRceDcwXHg5OFx4MGJceGM3XHg5NVx4ODRceGM4IgotCQkJICAiXHhiMlx4ZmJceDY0XHhjZVx4NjBceDk3XHg4N1x4OGQiCi0JCQkgICJceDE3XHhmY1x4ZTRceDVhXHg0OVx4ZThceDMwXHhiNyIKLQkJCSAgIlx4NmVceDc4XHgxN1x4ZTdceDJkXHg1ZVx4MTJceGQ0IgotCQkJICAiXHg2MFx4NjRceDA0XHg3YVx4ZjFceDJmXHg5ZVx4MGMiLAotCQkua2xlbiAgID0gNDgsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceDViXHg5MFx4OGVceGMxXHhhYlx4ZGRceDY3XHg1ZiIKLQkJCSAgIlx4M2RceDY5XHg4YVx4OTVceDUzXHhjOFx4OWNceGU1IiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsKLS8qIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9zdGRzLXAxNjE5QGxpc3RzZXJ2LmllZWUub3JnL21zZzAwMTczLmh0bWwgKi8KLQkJLmtleSAgICA9ICJceGY4XHhkNFx4NzZceGZmXHhkNlx4NDZceGVlXHg2YyIKLQkJCSAgIlx4MjNceDg0XHhjYlx4MWNceDc3XHhkNlx4MTlceDVkIgotCQkJICAiXHhmZVx4ZjFceGE5XHhmM1x4N2JceGJjXHg4ZFx4MjEiCi0JCQkgICJceGE3XHg5Y1x4MjFceGY4XHhjYlx4OTBceDAyXHg4OSIKLQkJCSAgIlx4YThceDQ1XHgzNFx4OGVceGM4XHhjNVx4YjVceGYxIgotCQkJICAiXHgyNlx4ZjVceDBlXHg3Nlx4ZmVceGZkXHgxYlx4MWUiLAotCQkua2xlbiAgID0gNDgsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCi0JCS5pbnB1dCAgPSAiXHgwNVx4MTFceGI3XHgxOFx4YWJceGM2XHgyZFx4YWMiCi0JCQkgICJceDcwXHg1ZFx4ZjZceDIyXHg5NFx4Y2RceGU1XHg2YyIKLQkJCSAgIlx4MTdceDZiXHhmNlx4MWNceGYwXHhmM1x4NmVceGY4IgotCQkJICAiXHg1MFx4MzhceDFmXHg3MVx4NDlceGI2XHg1N1x4ZDYiCi0JCQkgICJceDhmXHhjYlx4OGRceDZiXHhlM1x4YTZceDI5XHg5MCIKLQkJCSAgIlx4ZmVceDJhXHg2Mlx4ODJceGFlXHg2ZFx4OGJceGY2IgotCQkJICAiXHhhZFx4MWVceDllXHgyMFx4NWZceDM4XHhiZVx4MDQiCi0JCQkgICJceGRhXHgxMFx4OGVceGVkXHhhMlx4YTRceDg3XHhhYiIKLQkJCSAgIlx4ZGFceDZiXHhiNFx4MGNceDc1XHhiYVx4ZDNceDdjIgotCQkJICAiXHhjOVx4YWNceDQyXHgzMVx4OTVceDdjXHhjOVx4MDQiCi0JCQkgICJceGViXHhkNVx4NmVceDMyXHg2OVx4OGFceGRiXHhhNiIKLQkJCSAgIlx4MTVceGQ3XHgzZlx4NGZceDJmXHg2Nlx4NjlceDAzIgotCQkJICAiXHg5Y1x4MWZceDU0XHgwZlx4ZGVceDFmXHhmM1x4NjUiCi0JCQkgICJceDRjXHg5Nlx4MTJceGVkXHg3Y1x4OTJceDAzXHgwMSIKLQkJCSAgIlx4NmZceGJjXHgzNVx4OTNceGFjXHhmMVx4MjdceGYxIgotCQkJICAiXHhiNFx4OTZceDgyXHg1YVx4NWZceGIwXHhhMFx4NTAiCi0JCQkgICJceDg5XHhhNFx4OGVceDY2XHg0NFx4ODVceGNjXHhmZCIKLQkJCSAgIlx4MzNceDE0XHg3MFx4ZTNceDk2XHhiMlx4YzNceGQzIgotCQkJICAiXHhiYlx4NTRceDVhXHgxYVx4ZjlceDc0XHhhMlx4YzUiCi0JCQkgICJceDJkXHg2NFx4NzVceGRkXHhiNFx4NTRceGU2XHg3NCIKLQkJCSAgIlx4OGNceGQzXHg5ZFx4OWVceDg2XHhhYlx4NTFceDUzIgotCQkJICAiXHhiN1x4OTNceDNlXHg2Zlx4ZDBceDRlXHgyY1x4NDAiCi0JCQkgICJceGY2XHhhOFx4MmVceDNlXHg5ZFx4ZjRceDY2XHhhNSIKLQkJCSAgIlx4NzZceDEyXHg3M1x4NDRceDFhXHg1Nlx4ZDdceDcyIgotCQkJICAiXHg4OFx4Y2RceDIxXHg4Y1x4NGNceDBmXHhmZVx4ZGEiCi0JCQkgICJceDk1XHhlMFx4M2FceGE2XHhhNVx4ODRceDQ2XHhjZCIKLQkJCSAgIlx4ZDVceDNlXHg5ZFx4M2FceGUyXHg2N1x4ZTZceDYwIgotCQkJICAiXHgxYVx4ZTJceDcwXHg4NVx4NThceGMyXHgxYlx4MDkiCi0JCQkgICJceGUxXHhkN1x4MmNceGNhXHhhZFx4YThceDhmXHhmOSIKLQkJCSAgIlx4YWNceGIzXHgwZVx4ZGJceGNhXHgyZVx4ZTJceGI4IgotCQkJICAiXHg1MVx4NzFceGQ5XHgzY1x4NmNceGYxXHg1Nlx4ZjgiCi0JCQkgICJceGVhXHg5Y1x4ZjFceGZiXHgwY1x4ZTZceGI3XHgxMCIKLQkJCSAgIlx4MWNceGY4XHhhOVx4N2NceGU4XHg1M1x4MzVceGMxIgotCQkJICAiXHg5MFx4M2VceDc2XHg0YVx4NzRceGE0XHgyMVx4MmMiCi0JCQkgICJceGY2XHgyY1x4NGVceDBmXHg5NFx4M2FceDg4XHgyZSIKLQkJCSAgIlx4NDFceDA5XHg2YVx4MzNceDdkXHhmNlx4ZGRceDNmIgotCQkJICAiXHg4ZFx4MjNceDMxXHg3NFx4ODRceGViXHg4OFx4NmUiCi0JCQkgICJceGNjXHhiOVx4YmNceDIyXHg4M1x4MTlceDA3XHgyMiIKLQkJCSAgIlx4YTVceDJkXHhkZlx4YTVceGYzXHg4MFx4ODVceDc4IgotCQkJICAiXHg4NFx4MzlceDZhXHg2ZFx4NmFceDk5XHg0Zlx4YTUiCi0JCQkgICJceDE1XHhmZVx4NDZceGIwXHhlNFx4NmNceGE1XHg0MSIKLQkJCSAgIlx4M2NceGNlXHg4Zlx4NDJceDYwXHg3MVx4YTdceDc1IgotCQkJICAiXHgwOFx4NDBceDY1XHg4YVx4ODJceGJmXHhmNVx4NDMiCi0JCQkgICJceDcxXHg5Nlx4YTlceDRkXHg0NFx4OGFceDIwXHhiZSIKLQkJCSAgIlx4ZmFceDRkXHhiYlx4YzBceDdkXHgzMVx4OTZceDY1IgotCQkJICAiXHhlN1x4NzVceGU1XHgzZVx4ZmRceDkyXHgzYlx4YzkiCi0JCQkgICJceDU1XHhiYlx4MTZceDdlXHhmN1x4YzJceDhjXHhhNCIKLQkJCSAgIlx4NDBceDFkXHhlNVx4ZWZceDBlXHhkZlx4ZTRceDlhIgotCQkJICAiXHg2Mlx4NzNceDY1XHhmZFx4NDZceDYzXHgyNVx4M2QiCi0JCQkgICJceDJiXHhhZlx4ZTVceDY0XHhmZVx4YTVceDVjXHhjZiIKLQkJCSAgIlx4MjRceGYzXHhiNFx4YWNceDY0XHhiYVx4ZGZceDRiIgotCQkJICAiXHhjNlx4OTZceDdkXHg4MVx4MmRceDhkXHg5N1x4ZjciCi0JCQkgICJceGM1XHg2OFx4NzdceDg0XHgzMlx4MmJceGNjXHg4NSIKLQkJCSAgIlx4NzRceDk2XHhmMFx4MTJceDc3XHg2MVx4YjlceGViIgotCQkJICAiXHg3MVx4YWFceDgyXHhjYlx4MWNceGRiXHg4OVx4YzgiCi0JCQkgICJceGM2XHhiNVx4ZTNceDVjXHg3ZFx4MzlceDA3XHgyNCIKLQkJCSAgIlx4ZGFceDM5XHg4N1x4NDVceGMwXHgyYlx4YmJceDAxIgotCQkJICAiXHhhY1x4YmNceDJhXHg1Y1x4N2ZceGZjXHhlOFx4Y2UiCi0JCQkgICJceDZkXHg5Y1x4NmZceGVkXHhkM1x4YzFceGExXHhkNiIKLQkJCSAgIlx4YzVceDU1XHhhOVx4NjZceDJmXHhlMVx4YzhceDMyIgotCQkJICAiXHhhNlx4NWRceGE0XHgzYVx4OThceDczXHhlOFx4NDUiCi0JCQkgICJceGE0XHhjN1x4YThceGI0XHhmNlx4MTNceDAzXHhmNiIKLQkJCSAgIlx4ZTlceDJlXHhjNFx4MjlceDBmXHg4NFx4ZGJceGM0IgotCQkJICAiXHgyMVx4YzRceGMyXHg3NVx4NjdceDg5XHgzN1x4MGEiLAotCQkuaWxlbiAgID0gNTEyLAotCQkucmVzdWx0ID0gIlx4MWFceDFkXHhhOVx4MzBceGFkXHhmOVx4MmZceDliIgotCQkJICAiXHhiNlx4MWRceGFlXHhlZlx4ZjBceDJmXHhmOFx4NWEiCi0JCQkgICJceDM5XHgzY1x4YmZceDJhXHhiMlx4NDVceGIyXHgyMyIKLQkJCSAgIlx4MWJceDYzXHgzY1x4Y2ZceGFhXHhiZVx4Y2ZceDRlIgotCQkJICAiXHhmYVx4ZThceDI5XHhjMlx4MjBceDY4XHgyYlx4M2MiCi0JCQkgICJceDJlXHg4Ylx4ZjdceDZlXHgyNVx4YmRceGUzXHgzZCIKLQkJCSAgIlx4NjZceDI3XHhkNlx4YWZceGQ2XHg2NFx4M2VceGUzIgotCQkJICAiXHhlOFx4NThceDQ2XHg5N1x4MzlceDUxXHgwN1x4ZGUiCi0JCQkgICJceGNiXHgzN1x4YmNceGE5XHhjMFx4NWZceDc1XHhjMyIKLQkJCSAgIlx4MGVceDg0XHgyM1x4MWRceDE2XHhkNFx4MWNceDU5IgotCQkJICAiXHg5Y1x4MWFceDAyXHg1NVx4YWJceDNhXHg5N1x4MWQiCi0JCQkgICJceGRmXHhkZFx4YzdceDA2XHg1MVx4ZDdceDcwXHhhZSIKLQkJCSAgIlx4MjNceGM2XHg4Y1x4ZjVceDFlXHhhMFx4ZTVceDgyIgotCQkJICAiXHhiOFx4YjJceGJmXHgwNFx4YTBceDMyXHg4ZVx4NjgiCi0JCQkgICJceGViXHhhZlx4NmVceDJkXHg5NFx4MjJceDJmXHhjZSIKLQkJCSAgIlx4NGNceGI1XHg1OVx4ZTJceGEyXHgyZlx4YTBceDk4IgotCQkJICAiXHgxYVx4OTdceGM2XHhkNFx4YjVceDAwXHg1OVx4ZjIiCi0JCQkgICJceDg0XHgxNFx4NzJceGIxXHg5YVx4NmVceGEzXHg3ZiIKLQkJCSAgIlx4ZWFceDIwXHhlN1x4Y2JceDY1XHg3N1x4M2FceGRmIgotCQkJICAiXHhjOFx4OTdceDY3XHgxNVx4YzJceDJhXHgyN1x4Y2MiCi0JCQkgICJceDE4XHg1NVx4YTFceDI0XHgwYlx4MjRceDI0XHhhZiIKLQkJCSAgIlx4NWJceGVjXHg2OFx4YjhceGM4XHhmNVx4YmFceDYzIgotCQkJICAiXHhmZlx4ZWRceDg5XHhjZVx4ZDVceDNkXHg4OFx4ZjMiCi0JCQkgICJceDI1XHhlZlx4MDVceDdjXHgzYVx4ZWZceGViXHhkOCIKLQkJCSAgIlx4N2FceDMyXHgwZFx4ZDFceDFlXHg1OFx4NTlceDk5IgotCQkJICAiXHg5MFx4MjVceGI1XHgyNlx4YjBceGUzXHgyYlx4NmMiCi0JCQkgICJceDRjXHhhOVx4OGJceDg0XHg0Zlx4NWVceDAxXHg1MCIKLQkJCSAgIlx4NDFceDMwXHg1OFx4YzVceDYyXHg3NFx4NTJceDFkIgotCQkJICAiXHg0NVx4MjRceDZhXHg0Mlx4NjRceDRmXHg5N1x4MWMiCi0JCQkgICJceGE4XHg2Nlx4YjVceDZkXHg3OVx4ZDRceDBkXHg0OCIKLQkJCSAgIlx4YzVceDVmXHhmM1x4OTBceDMyXHhkZFx4ZGRceGUxIgotCQkJICAiXHhlNFx4YTlceDlmXHhmY1x4YzNceDUyXHg1YVx4NDYiCi0JCQkgICJceGU0XHg4MVx4ODRceDk1XHgzNlx4NTlceDdhXHg2YiIKLQkJCSAgIlx4YWFceGIzXHg2MFx4YWRceGNlXHg5Zlx4OWZceDI4IgotCQkJICAiXHhlMFx4MDFceDc1XHgyMlx4YzRceDRlXHhhOVx4NjIiCi0JCQkgICJceDVjXHg2Mlx4MGRceDAwXHhjYlx4MTNceGU4XHg0MyIKLQkJCSAgIlx4NzJceGQ0XHgyZFx4NTNceDQ2XHhiNVx4ZDFceDE2IgotCQkJICAiXHgyMlx4MThceGRmXHgzNFx4MzNceGY1XHhkNlx4MWMiCi0JCQkgICJceGI4XHg3OVx4NzhceDk3XHg5NFx4ZmZceDcyXHgxMyIKLQkJCSAgIlx4NGNceDI3XHhmY1x4Y2JceGJmXHgwMVx4NTNceGE2IgotCQkJICAiXHhiNFx4NTBceDZlXHhkZVx4ZGZceGI1XHg0M1x4YTQiCi0JCQkgICJceDU5XHhkZlx4NTJceGY5XHg3Y1x4ZTBceDExXHg2ZiIKLQkJCSAgIlx4MmRceDE0XHg4ZVx4MjRceDYxXHgyY1x4ZTFceDE3IgotCQkJICAiXHhjY1x4Y2VceDUxXHgwY1x4MTlceDhhXHg4Mlx4MzAiCi0JCQkgICJceDk0XHhkNVx4M2RceDZhXHg1M1x4MDZceDVlXHhiZCIKLQkJCSAgIlx4YjdceGViXHhmYVx4ZmRceDI3XHg1MVx4ZGVceDg1IgotCQkJICAiXHgxZVx4ODZceDUzXHgxMVx4NTNceDk0XHgwMFx4ZWUiCi0JCQkgICJceDJiXHg4Y1x4MDhceDJhXHhiZlx4ZGRceGFlXHgxMSIKLQkJCSAgIlx4Y2JceDFlXHhhMlx4MDdceDlhXHg4MFx4Y2ZceDYyIgotCQkJICAiXHg5Ylx4MDlceGRjXHg5NVx4M2NceDk2XHg4ZVx4YjEiCi0JCQkgICJceDA5XHhiZFx4ZTRceGViXHhkYlx4Y2FceDcwXHg3YSIKLQkJCSAgIlx4OWVceGZhXHgzMVx4MThceDQ1XHgzY1x4MjFceDMzIgotCQkJICAiXHhiMFx4YjNceDJiXHhlYVx4ZjNceDcxXHgyZFx4ZTEiCi0JCQkgICJceDAzXHhhZFx4MWJceDQ4XHhkNFx4NjdceDI3XHhmMCIKLQkJCSAgIlx4NjJceGU0XHgzZFx4ZmJceDliXHgwOFx4NzZceGU3IgotCQkJICAiXHhkZFx4MmJceDAxXHgzOVx4MDRceDVhXHg1OFx4N2EiCi0JCQkgICJceGY3XHgxMVx4OTBceGVjXHhiZFx4NTFceDVjXHgzMiIKLQkJCSAgIlx4NmJceGQ3XHgzNVx4MzlceDAyXHg2Ylx4ZjJceGE2IgotCQkJICAiXHhkMFx4MGRceDA3XHhlMVx4MDZceGM0XHg1Ylx4N2QiCi0JCQkgICJceGU0XHg2YVx4ZDdceGVlXHgxNVx4MWZceDgzXHhiNCIKLQkJCSAgIlx4YTNceGE3XHg1ZVx4YzNceDkwXHhiN1x4ZWZceGQzIgotCQkJICAiXHhiN1x4NGZceGY4XHg5Mlx4NGNceGI3XHgzY1x4MjkiCi0JCQkgICJceGNkXHg3ZVx4MmJceDVkXHg0M1x4ZWFceDQyXHhlNyIKLQkJCSAgIlx4NzRceDNmXHg3ZFx4NThceDg4XHg3NVx4ZGVceDNlIiwKLQkJLnJsZW4gICA9IDUxMiwKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19scndfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JLyogZnJvbSBodHRwOi8vZ3JvdXBlci5pZWVlLm9yZy9ncm91cHMvMTYxOS9lbWFpbC9wZGYwMDAxNy5wZGYgKi8KLQkvKiBzYW1lIGFzIGVuYyB2ZWN0b3JzIHdpdGggaW5wdXQgYW5kIHJlc3VsdCByZXZlcnNlZCAqLwotCXsgLyogTFJXLTMyLUFFUyAxICovCi0JCS5rZXkgICAgPSAiXHg0NVx4NjJceGFjXHgyNVx4ZjhceDI4XHgxN1x4NmQiCi0JCQkgICJceDRjXHgyNlx4ODRceDE0XHhiNVx4NjhceDAxXHg4NSIKLQkJCSAgIlx4MjVceDhlXHgyYVx4MDVceGU3XHgzZVx4OWRceDAzIgotCQkJICAiXHhlZVx4NWFceDgzXHgwY1x4Y2NceDA5XHg0Y1x4ODciLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCi0JCS5pbnB1dCAgPSAiXHhmMVx4YjJceDczXHhjZFx4NjVceGEzXHhkZlx4NWYiCi0JCQkgICJceGU5XHg1ZFx4NDhceDkyXHg1NFx4NjNceDRlXHhiOCIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKLQkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsgLyogTFJXLTMyLUFFUyAyICovCi0JCS5rZXkgICAgPSAiXHg1OVx4NzBceDQ3XHgxNFx4ZjVceDU3XHg0N1x4OGMiCi0JCQkgICJceGQ3XHg3OVx4ZThceDBmXHg1NFx4ODhceDc5XHg0NCIKLQkJCSAgIlx4MGRceDQ4XHhmMFx4YjdceGIxXHg1YVx4NTNceGVhIgotCQkJICAiXHgxY1x4YWFceDZiXHgyOVx4YzJceGNhXHhmYlx4YWYiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMiIsCi0JCS5pbnB1dCAgPSAiXHgwMFx4YzhceDJiXHhhZVx4OTVceGJiXHhjZFx4ZTUiCi0JCQkgICJceDI3XHg0Zlx4MDdceDY5XHhiMlx4NjBceGUxXHgzNiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAotCQkucmxlbiAgID0gMTYsCi0JfSwgeyAvKiBMUlctMzItQUVTIDMgKi8KLQkJLmtleSAgICA9ICJceGQ4XHgyYVx4OTFceDM0XHhiMlx4NmFceDU2XHg1MCIKLQkJCSAgIlx4MzBceGZlXHg2OVx4ZTJceDM3XHg3Zlx4OThceDQ3IgotCQkJICAiXHhjZFx4ZjlceDBiXHgxNlx4MGNceDY0XHg4Zlx4YjYiCi0JCQkgICJceGIwXHgwZFx4MGRceDFiXHhhZVx4ODVceDg3XHgxZiIsCi0JCS5rbGVuICAgPSAzMiwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ICA9ICJceDc2XHgzMlx4MjFceDgzXHhlZFx4OGZceGYxXHg4MiIKLQkJCSAgIlx4ZjlceDU5XHg2Mlx4MDNceDY5XHgwZVx4NWVceDAxIiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0ID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgotCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAotCQkucmxlbiAgID0gMTYsCi0JfSwgeyAvKiBMUlctMzItQUVTIDQgKi8KLQkJLmtleSAgICA9ICJceDBmXHg2YVx4ZWZceGY4XHhkM1x4ZDJceGJiXHgxNSIKLQkJCSAgIlx4MjVceDgzXHhmN1x4M2NceDFmXHgwMVx4MjhceDc0IgotCQkJICAiXHhjYVx4YzZceGJjXHgzNVx4NGRceDRhXHg2NVx4NTQiCi0JCQkgICJceDkwXHhhZVx4NjFceGNmXHg3Ylx4YWVceGJkXHhjYyIKLQkJCSAgIlx4YWRceGU0XHg5NFx4YzVceDRhXHgyOVx4YWVceDcwIiwKLQkJLmtsZW4gICA9IDQwLAotCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiLAotCQkuaW5wdXQgID0gIlx4OWNceDBmXHgxNVx4MmZceDU1XHhhMlx4ZDhceGYwIgotCQkJICAiXHhkNlx4N2JceDhmXHg5ZVx4MjhceDIyXHhiY1x4NDEiLAotCQkuaWxlbiAgID0gMTYsCi0JCS5yZXN1bHQgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5ybGVuICAgPSAxNiwKLQl9LCB7IC8qIExSVy0zMi1BRVMgNSAqLwotCQkua2V5ICAgID0gIlx4OGFceGQ0XHhlZVx4MTBceDJmXHhiZFx4ODFceGZmIgotCQkJICAiXHhmOFx4ODZceGNlXHhhY1x4OTNceGM1XHhhZFx4YzYiCi0JCQkgICJceGEwXHgxOVx4MDdceGMwXHg5ZFx4ZjdceGJiXHhkZCIKLQkJCSAgIlx4NTJceDEzXHhiMlx4YjdceGYwXHhmZlx4MTFceGQ4IgotCQkJICAiXHhkNlx4MDhceGQwXHhjZFx4MmVceGIxXHgxN1x4NmYiLAotCQkua2xlbiAgID0gNDAsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCAgPSAiXHhkNFx4MjdceDZhXHg3Zlx4MTRceDkxXHgzZFx4NjUiCi0JCQkgICJceGM4XHg2MFx4NDhceDAyXHg4N1x4ZTNceDM0XHgwNiIsCi0JCS5pbGVuICAgPSAxNiwKLQkJLnJlc3VsdCA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKLQkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKLQkJLnJsZW4gICA9IDE2LAotCX0sIHsgLyogTFJXLTMyLUFFUyA2ICovCi0JCS5rZXkgICAgPSAiXHhmOFx4ZDRceDc2XHhmZlx4ZDZceDQ2XHhlZVx4NmMiCi0JCQkgICJceDIzXHg4NFx4Y2JceDFjXHg3N1x4ZDZceDE5XHg1ZCIKLQkJCSAgIlx4ZmVceGYxXHhhOVx4ZjNceDdiXHhiY1x4OGRceDIxIgotCQkJICAiXHhhN1x4OWNceDIxXHhmOFx4Y2JceDkwXHgwMlx4ODkiCi0JCQkgICJceGE4XHg0NVx4MzRceDhlXHhjOFx4YzVceGI1XHhmMSIKLQkJCSAgIlx4MjZceGY1XHgwZVx4NzZceGZlXHhmZFx4MWJceDFlIiwKLQkJLmtsZW4gICA9IDQ4LAotCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiLAotCQkuaW5wdXQgID0gIlx4YmRceDA2XHhiOFx4ZTFceGRiXHg5OFx4ODlceDllIgotCQkJICAiXHhjNFx4OThceGU0XHg5MVx4Y2ZceDFjXHg3MFx4MmIiLAotCQkuaWxlbiAgID0gMTYsCi0JCS5yZXN1bHQgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCi0JCS5ybGVuICAgPSAxNiwKLQl9LCB7IC8qIExSVy0zMi1BRVMgNyAqLwotCQkua2V5ICAgID0gIlx4ZmJceDc2XHgxNVx4YjJceDNkXHg4MFx4ODlceDFkIgotCQkJICAiXHhkNFx4NzBceDk4XHgwYlx4YzdceDk1XHg4NFx4YzgiCi0JCQkgICJceGIyXHhmYlx4NjRceGNlXHg2MFx4OTdceDg3XHg4ZCIKLQkJCSAgIlx4MTdceGZjXHhlNFx4NWFceDQ5XHhlOFx4MzBceGI3IgotCQkJICAiXHg2ZVx4NzhceDE3XHhlN1x4MmRceDVlXHgxMlx4ZDQiCi0JCQkgICJceDYwXHg2NFx4MDRceDdhXHhmMVx4MmZceDllXHgwYyIsCi0JCS5rbGVuICAgPSA0OCwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ICA9ICJceDViXHg5MFx4OGVceGMxXHhhYlx4ZGRceDY3XHg1ZiIKLQkJCSAgIlx4M2RceDY5XHg4YVx4OTVceDUzXHhjOFx4OWNceGU1IiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0ID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgotCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAotCQkucmxlbiAgID0gMTYsCi0JfSwgewotLyogaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL3N0ZHMtcDE2MTlAbGlzdHNlcnYuaWVlZS5vcmcvbXNnMDAxNzMuaHRtbCAqLwotCQkua2V5ICAgID0gIlx4ZjhceGQ0XHg3Nlx4ZmZceGQ2XHg0Nlx4ZWVceDZjIgotCQkJICAiXHgyM1x4ODRceGNiXHgxY1x4NzdceGQ2XHgxOVx4NWQiCi0JCQkgICJceGZlXHhmMVx4YTlceGYzXHg3Ylx4YmNceDhkXHgyMSIKLQkJCSAgIlx4YTdceDljXHgyMVx4ZjhceGNiXHg5MFx4MDJceDg5IgotCQkJICAiXHhhOFx4NDVceDM0XHg4ZVx4YzhceGM1XHhiNVx4ZjEiCi0JCQkgICJceDI2XHhmNVx4MGVceDc2XHhmZVx4ZmRceDFiXHgxZSIsCi0JCS5rbGVuICAgPSA0OCwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIiwKLQkJLmlucHV0CT0gIlx4MWFceDFkXHhhOVx4MzBceGFkXHhmOVx4MmZceDliIgotCQkJICAiXHhiNlx4MWRceGFlXHhlZlx4ZjBceDJmXHhmOFx4NWEiCi0JCQkgICJceDM5XHgzY1x4YmZceDJhXHhiMlx4NDVceGIyXHgyMyIKLQkJCSAgIlx4MWJceDYzXHgzY1x4Y2ZceGFhXHhiZVx4Y2ZceDRlIgotCQkJICAiXHhmYVx4ZThceDI5XHhjMlx4MjBceDY4XHgyYlx4M2MiCi0JCQkgICJceDJlXHg4Ylx4ZjdceDZlXHgyNVx4YmRceGUzXHgzZCIKLQkJCSAgIlx4NjZceDI3XHhkNlx4YWZceGQ2XHg2NFx4M2VceGUzIgotCQkJICAiXHhlOFx4NThceDQ2XHg5N1x4MzlceDUxXHgwN1x4ZGUiCi0JCQkgICJceGNiXHgzN1x4YmNceGE5XHhjMFx4NWZceDc1XHhjMyIKLQkJCSAgIlx4MGVceDg0XHgyM1x4MWRceDE2XHhkNFx4MWNceDU5IgotCQkJICAiXHg5Y1x4MWFceDAyXHg1NVx4YWJceDNhXHg5N1x4MWQiCi0JCQkgICJceGRmXHhkZFx4YzdceDA2XHg1MVx4ZDdceDcwXHhhZSIKLQkJCSAgIlx4MjNceGM2XHg4Y1x4ZjVceDFlXHhhMFx4ZTVceDgyIgotCQkJICAiXHhiOFx4YjJceGJmXHgwNFx4YTBceDMyXHg4ZVx4NjgiCi0JCQkgICJceGViXHhhZlx4NmVceDJkXHg5NFx4MjJceDJmXHhjZSIKLQkJCSAgIlx4NGNceGI1XHg1OVx4ZTJceGEyXHgyZlx4YTBceDk4IgotCQkJICAiXHgxYVx4OTdceGM2XHhkNFx4YjVceDAwXHg1OVx4ZjIiCi0JCQkgICJceDg0XHgxNFx4NzJceGIxXHg5YVx4NmVceGEzXHg3ZiIKLQkJCSAgIlx4ZWFceDIwXHhlN1x4Y2JceDY1XHg3N1x4M2FceGRmIgotCQkJICAiXHhjOFx4OTdceDY3XHgxNVx4YzJceDJhXHgyN1x4Y2MiCi0JCQkgICJceDE4XHg1NVx4YTFceDI0XHgwYlx4MjRceDI0XHhhZiIKLQkJCSAgIlx4NWJceGVjXHg2OFx4YjhceGM4XHhmNVx4YmFceDYzIgotCQkJICAiXHhmZlx4ZWRceDg5XHhjZVx4ZDVceDNkXHg4OFx4ZjMiCi0JCQkgICJceDI1XHhlZlx4MDVceDdjXHgzYVx4ZWZceGViXHhkOCIKLQkJCSAgIlx4N2FceDMyXHgwZFx4ZDFceDFlXHg1OFx4NTlceDk5IgotCQkJICAiXHg5MFx4MjVceGI1XHgyNlx4YjBceGUzXHgyYlx4NmMiCi0JCQkgICJceDRjXHhhOVx4OGJceDg0XHg0Zlx4NWVceDAxXHg1MCIKLQkJCSAgIlx4NDFceDMwXHg1OFx4YzVceDYyXHg3NFx4NTJceDFkIgotCQkJICAiXHg0NVx4MjRceDZhXHg0Mlx4NjRceDRmXHg5N1x4MWMiCi0JCQkgICJceGE4XHg2Nlx4YjVceDZkXHg3OVx4ZDRceDBkXHg0OCIKLQkJCSAgIlx4YzVceDVmXHhmM1x4OTBceDMyXHhkZFx4ZGRceGUxIgotCQkJICAiXHhlNFx4YTlceDlmXHhmY1x4YzNceDUyXHg1YVx4NDYiCi0JCQkgICJceGU0XHg4MVx4ODRceDk1XHgzNlx4NTlceDdhXHg2YiIKLQkJCSAgIlx4YWFceGIzXHg2MFx4YWRceGNlXHg5Zlx4OWZceDI4IgotCQkJICAiXHhlMFx4MDFceDc1XHgyMlx4YzRceDRlXHhhOVx4NjIiCi0JCQkgICJceDVjXHg2Mlx4MGRceDAwXHhjYlx4MTNceGU4XHg0MyIKLQkJCSAgIlx4NzJceGQ0XHgyZFx4NTNceDQ2XHhiNVx4ZDFceDE2IgotCQkJICAiXHgyMlx4MThceGRmXHgzNFx4MzNceGY1XHhkNlx4MWMiCi0JCQkgICJceGI4XHg3OVx4NzhceDk3XHg5NFx4ZmZceDcyXHgxMyIKLQkJCSAgIlx4NGNceDI3XHhmY1x4Y2JceGJmXHgwMVx4NTNceGE2IgotCQkJICAiXHhiNFx4NTBceDZlXHhkZVx4ZGZceGI1XHg0M1x4YTQiCi0JCQkgICJceDU5XHhkZlx4NTJceGY5XHg3Y1x4ZTBceDExXHg2ZiIKLQkJCSAgIlx4MmRceDE0XHg4ZVx4MjRceDYxXHgyY1x4ZTFceDE3IgotCQkJICAiXHhjY1x4Y2VceDUxXHgwY1x4MTlceDhhXHg4Mlx4MzAiCi0JCQkgICJceDk0XHhkNVx4M2RceDZhXHg1M1x4MDZceDVlXHhiZCIKLQkJCSAgIlx4YjdceGViXHhmYVx4ZmRceDI3XHg1MVx4ZGVceDg1IgotCQkJICAiXHgxZVx4ODZceDUzXHgxMVx4NTNceDk0XHgwMFx4ZWUiCi0JCQkgICJceDJiXHg4Y1x4MDhceDJhXHhiZlx4ZGRceGFlXHgxMSIKLQkJCSAgIlx4Y2JceDFlXHhhMlx4MDdceDlhXHg4MFx4Y2ZceDYyIgotCQkJICAiXHg5Ylx4MDlceGRjXHg5NVx4M2NceDk2XHg4ZVx4YjEiCi0JCQkgICJceDA5XHhiZFx4ZTRceGViXHhkYlx4Y2FceDcwXHg3YSIKLQkJCSAgIlx4OWVceGZhXHgzMVx4MThceDQ1XHgzY1x4MjFceDMzIgotCQkJICAiXHhiMFx4YjNceDJiXHhlYVx4ZjNceDcxXHgyZFx4ZTEiCi0JCQkgICJceDAzXHhhZFx4MWJceDQ4XHhkNFx4NjdceDI3XHhmMCIKLQkJCSAgIlx4NjJceGU0XHgzZFx4ZmJceDliXHgwOFx4NzZceGU3IgotCQkJICAiXHhkZFx4MmJceDAxXHgzOVx4MDRceDVhXHg1OFx4N2EiCi0JCQkgICJceGY3XHgxMVx4OTBceGVjXHhiZFx4NTFceDVjXHgzMiIKLQkJCSAgIlx4NmJceGQ3XHgzNVx4MzlceDAyXHg2Ylx4ZjJceGE2IgotCQkJICAiXHhkMFx4MGRceDA3XHhlMVx4MDZceGM0XHg1Ylx4N2QiCi0JCQkgICJceGU0XHg2YVx4ZDdceGVlXHgxNVx4MWZceDgzXHhiNCIKLQkJCSAgIlx4YTNceGE3XHg1ZVx4YzNceDkwXHhiN1x4ZWZceGQzIgotCQkJICAiXHhiN1x4NGZceGY4XHg5Mlx4NGNceGI3XHgzY1x4MjkiCi0JCQkgICJceGNkXHg3ZVx4MmJceDVkXHg0M1x4ZWFceDQyXHhlNyIKLQkJCSAgIlx4NzRceDNmXHg3ZFx4NThceDg4XHg3NVx4ZGVceDNlIiwKLQkJLmlsZW4gICA9IDUxMiwKLQkJLnJlc3VsdAk9ICJceDA1XHgxMVx4YjdceDE4XHhhYlx4YzZceDJkXHhhYyIKLQkJCSAgIlx4NzBceDVkXHhmNlx4MjJceDk0XHhjZFx4ZTVceDZjIgotCQkJICAiXHgxN1x4NmJceGY2XHgxY1x4ZjBceGYzXHg2ZVx4ZjgiCi0JCQkgICJceDUwXHgzOFx4MWZceDcxXHg0OVx4YjZceDU3XHhkNiIKLQkJCSAgIlx4OGZceGNiXHg4ZFx4NmJceGUzXHhhNlx4MjlceDkwIgotCQkJICAiXHhmZVx4MmFceDYyXHg4Mlx4YWVceDZkXHg4Ylx4ZjYiCi0JCQkgICJceGFkXHgxZVx4OWVceDIwXHg1Zlx4MzhceGJlXHgwNCIKLQkJCSAgIlx4ZGFceDEwXHg4ZVx4ZWRceGEyXHhhNFx4ODdceGFiIgotCQkJICAiXHhkYVx4NmJceGI0XHgwY1x4NzVceGJhXHhkM1x4N2MiCi0JCQkgICJceGM5XHhhY1x4NDJceDMxXHg5NVx4N2NceGM5XHgwNCIKLQkJCSAgIlx4ZWJceGQ1XHg2ZVx4MzJceDY5XHg4YVx4ZGJceGE2IgotCQkJICAiXHgxNVx4ZDdceDNmXHg0Zlx4MmZceDY2XHg2OVx4MDMiCi0JCQkgICJceDljXHgxZlx4NTRceDBmXHhkZVx4MWZceGYzXHg2NSIKLQkJCSAgIlx4NGNceDk2XHgxMlx4ZWRceDdjXHg5Mlx4MDNceDAxIgotCQkJICAiXHg2Zlx4YmNceDM1XHg5M1x4YWNceGYxXHgyN1x4ZjEiCi0JCQkgICJceGI0XHg5Nlx4ODJceDVhXHg1Zlx4YjBceGEwXHg1MCIKLQkJCSAgIlx4ODlceGE0XHg4ZVx4NjZceDQ0XHg4NVx4Y2NceGZkIgotCQkJICAiXHgzM1x4MTRceDcwXHhlM1x4OTZceGIyXHhjM1x4ZDMiCi0JCQkgICJceGJiXHg1NFx4NWFceDFhXHhmOVx4NzRceGEyXHhjNSIKLQkJCSAgIlx4MmRceDY0XHg3NVx4ZGRceGI0XHg1NFx4ZTZceDc0IgotCQkJICAiXHg4Y1x4ZDNceDlkXHg5ZVx4ODZceGFiXHg1MVx4NTMiCi0JCQkgICJceGI3XHg5M1x4M2VceDZmXHhkMFx4NGVceDJjXHg0MCIKLQkJCSAgIlx4ZjZceGE4XHgyZVx4M2VceDlkXHhmNFx4NjZceGE1IgotCQkJICAiXHg3Nlx4MTJceDczXHg0NFx4MWFceDU2XHhkN1x4NzIiCi0JCQkgICJceDg4XHhjZFx4MjFceDhjXHg0Y1x4MGZceGZlXHhkYSIKLQkJCSAgIlx4OTVceGUwXHgzYVx4YTZceGE1XHg4NFx4NDZceGNkIgotCQkJICAiXHhkNVx4M2VceDlkXHgzYVx4ZTJceDY3XHhlNlx4NjAiCi0JCQkgICJceDFhXHhlMlx4NzBceDg1XHg1OFx4YzJceDFiXHgwOSIKLQkJCSAgIlx4ZTFceGQ3XHgyY1x4Y2FceGFkXHhhOFx4OGZceGY5IgotCQkJICAiXHhhY1x4YjNceDBlXHhkYlx4Y2FceDJlXHhlMlx4YjgiCi0JCQkgICJceDUxXHg3MVx4ZDlceDNjXHg2Y1x4ZjFceDU2XHhmOCIKLQkJCSAgIlx4ZWFceDljXHhmMVx4ZmJceDBjXHhlNlx4YjdceDEwIgotCQkJICAiXHgxY1x4ZjhceGE5XHg3Y1x4ZThceDUzXHgzNVx4YzEiCi0JCQkgICJceDkwXHgzZVx4NzZceDRhXHg3NFx4YTRceDIxXHgyYyIKLQkJCSAgIlx4ZjZceDJjXHg0ZVx4MGZceDk0XHgzYVx4ODhceDJlIgotCQkJICAiXHg0MVx4MDlceDZhXHgzM1x4N2RceGY2XHhkZFx4M2YiCi0JCQkgICJceDhkXHgyM1x4MzFceDc0XHg4NFx4ZWJceDg4XHg2ZSIKLQkJCSAgIlx4Y2NceGI5XHhiY1x4MjJceDgzXHgxOVx4MDdceDIyIgotCQkJICAiXHhhNVx4MmRceGRmXHhhNVx4ZjNceDgwXHg4NVx4NzgiCi0JCQkgICJceDg0XHgzOVx4NmFceDZkXHg2YVx4OTlceDRmXHhhNSIKLQkJCSAgIlx4MTVceGZlXHg0Nlx4YjBceGU0XHg2Y1x4YTVceDQxIgotCQkJICAiXHgzY1x4Y2VceDhmXHg0Mlx4NjBceDcxXHhhN1x4NzUiCi0JCQkgICJceDA4XHg0MFx4NjVceDhhXHg4Mlx4YmZceGY1XHg0MyIKLQkJCSAgIlx4NzFceDk2XHhhOVx4NGRceDQ0XHg4YVx4MjBceGJlIgotCQkJICAiXHhmYVx4NGRceGJiXHhjMFx4N2RceDMxXHg5Nlx4NjUiCi0JCQkgICJceGU3XHg3NVx4ZTVceDNlXHhmZFx4OTJceDNiXHhjOSIKLQkJCSAgIlx4NTVceGJiXHgxNlx4N2VceGY3XHhjMlx4OGNceGE0IgotCQkJICAiXHg0MFx4MWRceGU1XHhlZlx4MGVceGRmXHhlNFx4OWEiCi0JCQkgICJceDYyXHg3M1x4NjVceGZkXHg0Nlx4NjNceDI1XHgzZCIKLQkJCSAgIlx4MmJceGFmXHhlNVx4NjRceGZlXHhhNVx4NWNceGNmIgotCQkJICAiXHgyNFx4ZjNceGI0XHhhY1x4NjRceGJhXHhkZlx4NGIiCi0JCQkgICJceGM2XHg5Nlx4N2RceDgxXHgyZFx4OGRceDk3XHhmNyIKLQkJCSAgIlx4YzVceDY4XHg3N1x4ODRceDMyXHgyYlx4Y2NceDg1IgotCQkJICAiXHg3NFx4OTZceGYwXHgxMlx4NzdceDYxXHhiOVx4ZWIiCi0JCQkgICJceDcxXHhhYVx4ODJceGNiXHgxY1x4ZGJceDg5XHhjOCIKLQkJCSAgIlx4YzZceGI1XHhlM1x4NWNceDdkXHgzOVx4MDdceDI0IgotCQkJICAiXHhkYVx4MzlceDg3XHg0NVx4YzBceDJiXHhiYlx4MDEiCi0JCQkgICJceGFjXHhiY1x4MmFceDVjXHg3Zlx4ZmNceGU4XHhjZSIKLQkJCSAgIlx4NmRceDljXHg2Zlx4ZWRceGQzXHhjMVx4YTFceGQ2IgotCQkJICAiXHhjNVx4NTVceGE5XHg2Nlx4MmZceGUxXHhjOFx4MzIiCi0JCQkgICJceGE2XHg1ZFx4YTRceDNhXHg5OFx4NzNceGU4XHg0NSIKLQkJCSAgIlx4YTRceGM3XHhhOFx4YjRceGY2XHgxM1x4MDNceGY2IgotCQkJICAiXHhlOVx4MmVceGM0XHgyOVx4MGZceDg0XHhkYlx4YzQiCi0JCQkgICJceDIxXHhjNFx4YzJceDc1XHg2N1x4ODlceDM3XHgwYSIsCi0JCS5ybGVuICAgPSA1MTIsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfeHRzX2VuY190dl90ZW1wbGF0ZVtdID0gewotCS8qIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xNjE5L2VtYWlsL3BkZjAwMDg2LnBkZiAqLwotCXsgLyogWFRTLUFFUyAxICovCi0JCS5rZXkgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbiAgID0gMzIsCi0JCS5yZXN1bHQgPSAiXHg5MVx4N2NceGY2XHg5ZVx4YmRceDY4XHhiMlx4ZWMiCi0JCQkgICJceDliXHg5Zlx4ZTlceGEzXHhlYVx4ZGRceGE2XHg5MiIKLQkJCSAgIlx4Y2RceDQzXHhkMlx4ZjVceDk1XHg5OFx4ZWRceDg1IgotCQkJICAiXHg4Y1x4MDJceGMyXHg2NVx4MmZceGJmXHg5Mlx4MmUiLAotCQkucmxlbiAgID0gMzIsCi0JfSwgeyAvKiBYVFMtQUVTIDIgKi8KLQkJLmtleSAgICA9ICJceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMSIKLQkJCSAgIlx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExIgotCQkJICAiXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjIiCi0JCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIsCi0JCS5rbGVuICAgPSAzMiwKLQkJLml2ICAgICA9ICJceDMzXHgzM1x4MzNceDMzXHgzM1x4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ICA9ICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKLQkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgotCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCi0JCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIsCi0JCS5pbGVuICAgPSAzMiwKLQkJLnJlc3VsdCA9ICJceGM0XHg1NFx4MThceDVlXHg2YVx4MTZceDkzXHg2ZSIKLQkJCSAgIlx4MzlceDMzXHg0MFx4MzhceGFjXHhlZlx4ODNceDhiIgotCQkJICAiXHhmYlx4MThceDZmXHhmZlx4NzRceDgwXHhhZFx4YzQiCi0JCQkgICJceDI4XHg5M1x4ODJceGVjXHhkNlx4ZDNceDk0XHhmMCIsCi0JCS5ybGVuICAgPSAzMiwKLQl9LCB7IC8qIFhUUy1BRVMgMyAqLwotCQkua2V5ICAgID0gIlx4ZmZceGZlXHhmZFx4ZmNceGZiXHhmYVx4ZjlceGY4IgotCQkJICAiXHhmN1x4ZjZceGY1XHhmNFx4ZjNceGYyXHhmMVx4ZjAiCi0JCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIKLQkJCSAgIlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyIiwKLQkJLmtsZW4gICA9IDMyLAotCQkuaXYgICAgID0gIlx4MzNceDMzXHgzM1x4MzNceDMzXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaW5wdXQgID0gIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgotCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCi0JCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKLQkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IiwKLQkJLmlsZW4gICA9IDMyLAotCQkucmVzdWx0ID0gIlx4YWZceDg1XHgzM1x4NmJceDU5XHg3YVx4ZmNceDFhIgotCQkJICAiXHg5MFx4MGJceDJlXHhiMlx4MWVceGM5XHg0OVx4ZDIiCi0JCQkgICJceDkyXHhkZlx4NGNceDA0XHg3ZVx4MGJceDIxXHg1MyIKLQkJCSAgIlx4MjFceDg2XHhhNVx4OTdceDFhXHgyMlx4N2FceDg5IiwKLQkJLnJsZW4gICA9IDMyLAotCX0sIHsgLyogWFRTLUFFUyA0ICovCi0JCS5rZXkgICAgPSAiXHgyN1x4MThceDI4XHgxOFx4MjhceDQ1XHg5MFx4NDUiCi0JCQkgICJceDIzXHg1M1x4NjBceDI4XHg3NFx4NzFceDM1XHgyNiIKLQkJCSAgIlx4MzFceDQxXHg1OVx4MjZceDUzXHg1OFx4OTdceDkzIgotCQkJICAiXHgyM1x4ODRceDYyXHg2NFx4MzNceDgzXHgyN1x4OTUiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCAgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCi0JCQkgICJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyNyIKLQkJCSAgIlx4MjhceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmIgotCQkJICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKLQkJCSAgIlx4NDBceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3IgotCQkJICAiXHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCi0JCQkgICJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1NyIKLQkJCSAgIlx4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIgotCQkJICAiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjciCi0JCQkgICJceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKLQkJCSAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3IgotCQkJICAiXHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCi0JCQkgICJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4NyIKLQkJCSAgIlx4ODhceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmIgotCQkJICAiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTciCi0JCQkgICJceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3IgotCQkJICAiXHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCi0JCQkgICJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiNyIKLQkJCSAgIlx4YjhceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmIgotCQkJICAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKLQkJCSAgIlx4ZDBceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3IgotCQkJICAiXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYiCi0JCQkgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNyIKLQkJCSAgIlx4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgotCQkJICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCi0JCQkgICJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIKLQkJCSAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgotCQkJICAiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCi0JCQkgICJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKLQkJCSAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgotCQkJICAiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCi0JCQkgICJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKLQkJCSAgIlx4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgotCQkJICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCi0JCQkgICJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKLQkJCSAgIlx4NjBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3IgotCQkJICAiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCi0JCQkgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKLQkJCSAgIlx4NzhceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmIgotCQkJICAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCi0JCQkgICJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKLQkJCSAgIlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3IgotCQkJICAiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCi0JCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKLQkJCSAgIlx4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmIgotCQkJICAiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCi0JCQkgICJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKLQkJCSAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgotCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCi0JCQkgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKLQkJCSAgIlx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmIgotCQkJICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCi0JCQkgICJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKLQkJCSAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3IgotCQkJICAiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiLAotCQkuaWxlbiAgID0gNTEyLAotCQkucmVzdWx0ID0gIlx4MjdceGE3XHg0N1x4OWJceGVmXHhhMVx4ZDRceDc2IgotCQkJICAiXHg0OFx4OWZceDMwXHg4Y1x4ZDRceGNmXHhhNlx4ZTIiCi0JCQkgICJceGE5XHg2ZVx4NGJceGJlXHgzMlx4MDhceGZmXHgyNSIKLQkJCSAgIlx4MjhceDdkXHhkM1x4ODFceDk2XHgxNlx4ZThceDljIgotCQkJICAiXHhjN1x4OGNceGY3XHhmNVx4ZTVceDQzXHg0NFx4NWYiCi0JCQkgICJceDgzXHgzM1x4ZDhceGZhXHg3Zlx4NTZceDAwXHgwMCIKLQkJCSAgIlx4MDVceDI3XHg5Zlx4YTVceGQ4XHhiNVx4ZTRceGFkIgotCQkJICAiXHg0MFx4ZTdceDM2XHhkZFx4YjRceGQzXHg1NFx4MTIiCi0JCQkgICJceDMyXHg4MFx4NjNceGZkXHgyYVx4YWJceDUzXHhlNSIKLQkJCSAgIlx4ZWFceDFlXHgwYVx4OWZceDMzXHgyNVx4MDBceGE1IgotCQkJICAiXHhkZlx4OTRceDg3XHhkMFx4N2FceDVjXHg5Mlx4Y2MiCi0JCQkgICJceDUxXHgyY1x4ODhceDY2XHhjN1x4ZThceDYwXHhjZSIKLQkJCSAgIlx4OTNceGZkXHhmMVx4NjZceGEyXHg0OVx4MTJceGI0IgotCQkJICAiXHgyMlx4OTdceDYxXHg0Nlx4YWVceDIwXHhjZVx4ODQiCi0JCQkgICJceDZiXHhiN1x4ZGNceDliXHhhOVx4NGFceDc2XHg3YSIKLQkJCSAgIlx4YWVceGYyXHgwY1x4MGRceDYxXHhhZFx4MDJceDY1IgotCQkJICAiXHg1ZVx4YTlceDJkXHhjNFx4YzRceGU0XHgxYVx4ODkiCi0JCQkgICJceDUyXHhjNlx4NTFceGQzXHgzMVx4NzRceGJlXHg1MSIKLQkJCSAgIlx4YTFceDBjXHg0Mlx4MTFceDEwXHhlNlx4ZDhceDE1IgotCQkJICAiXHg4OFx4ZWRceGU4XHgyMVx4MDNceGEyXHg1Mlx4ZDgiCi0JCQkgICJceGE3XHg1MFx4ZThceDc2XHg4ZFx4ZWZceGZmXHhlZCIKLQkJCSAgIlx4OTFceDIyXHg4MVx4MGFceGFlXHhiOVx4OWZceDkxIgotCQkJICAiXHg3Mlx4YWZceDgyXHhiNlx4MDRceGRjXHg0Ylx4OGUiCi0JCQkgICJceDUxXHhiY1x4YjBceDgyXHgzNVx4YTZceGY0XHgzNCIKLQkJCSAgIlx4MTNceDMyXHhlNFx4Y2FceDYwXHg0OFx4MmFceDRiIgotCQkJICAiXHhhMVx4YTBceDNiXHgzZVx4NjVceDAwXHg4Zlx4YzUiCi0JCQkgICJceGRhXHg3Nlx4YjdceDBiXHhmMVx4NjlceDBkXHhiNCIKLQkJCSAgIlx4ZWFceGUyXHg5Y1x4NWZceDFiXHhhZFx4ZDBceDNjIgotCQkJICAiXHg1Y1x4Y2ZceDJhXHg1NVx4ZDdceDA1XHhkZFx4Y2QiCi0JCQkgICJceDg2XHhkNFx4NDlceDUxXHgxY1x4ZWJceDdlXHhjMyIKLQkJCSAgIlx4MGJceGYxXHgyYlx4MWZceGEzXHg1Ylx4OTFceDNmIgotCQkJICAiXHg5Zlx4NzRceDdhXHg4YVx4ZmRceDFiXHgxM1x4MGUiCi0JCQkgICJceDk0XHhiZlx4ZjlceDRlXHhmZlx4ZDBceDFhXHg5MSIKLQkJCSAgIlx4NzNceDVjXHhhMVx4NzJceDZhXHhjZFx4MGJceDE5IgotCQkJICAiXHg3Y1x4NGVceDViXHgwM1x4MzlceDM2XHg5N1x4ZTEiCi0JCQkgICJceDI2XHg4Mlx4NmZceGI2XHhiYlx4ZGVceDhlXHhjYyIKLQkJCSAgIlx4MWVceDA4XHgyOVx4ODVceDE2XHhlMlx4YzlceGVkIgotCQkJICAiXHgwM1x4ZmZceDNjXHgxYlx4NzhceDYwXHhmNlx4ZGUiCi0JCQkgICJceDc2XHhkNFx4Y2VceGNkXHg5NFx4YzhceDExXHg5OCIKLQkJCSAgIlx4NTVceGVmXHg1Mlx4OTdceGNhXHg2N1x4ZTlceGYzIgotCQkJICAiXHhlN1x4ZmZceDcyXHhiMVx4ZTlceDk3XHg4NVx4Y2EiCi0JCQkgICJceDBhXHg3ZVx4NzdceDIwXHhjNVx4YjNceDZkXHhjNiIKLQkJCSAgIlx4ZDdceDJjXHhhY1x4OTVceDc0XHhjOFx4Y2JceGJjIgotCQkJICAiXHgyZlx4ODBceDFlXHgyM1x4ZTVceDZmXHhkM1x4NDQiCi0JCQkgICJceGIwXHg3Zlx4MjJceDE1XHg0Ylx4ZWJceGEwXHhmMCIKLQkJCSAgIlx4OGNceGU4XHg4OVx4MWVceDY0XHgzZVx4ZDlceDk1IgotCQkJICAiXHhjOVx4NGRceDlhXHg2OVx4YzlceGYxXHhiNVx4ZjQiCi0JCQkgICJceDk5XHgwMlx4N2FceDc4XHg1N1x4MmFceGVlXHhiZCIKLQkJCSAgIlx4NzRceGQyXHgwY1x4YzNceDk4XHg4MVx4YzJceDEzIgotCQkJICAiXHhlZVx4NzdceDBiXHgxMFx4MTBceGU0XHhiZVx4YTciCi0JCQkgICJceDE4XHg4NFx4NjlceDc3XHhhZVx4MTFceDlmXHg3YSIKLQkJCSAgIlx4MDJceDNhXHhiNVx4OGNceGNhXHgwYVx4ZDdceDUyIgotCQkJICAiXHhhZlx4ZTZceDU2XHhiYlx4M2NceDE3XHgyNVx4NmEiCi0JCQkgICJceDlmXHg2ZVx4OWJceGYxXHg5Zlx4ZGRceDVhXHgzOCIKLQkJCSAgIlx4ZmNceDgyXHhiYlx4ZThceDcyXHhjNVx4NTNceDllIgotCQkJICAiXHhkYlx4NjBceDllXHhmNFx4ZjdceDljXHgyMFx4M2UiCi0JCQkgICJceGJiXHgxNFx4MGZceDJlXHg1OFx4M2NceGIyXHhhZCIKLQkJCSAgIlx4MTVceGI0XHhhYVx4NWJceDY1XHg1MFx4MTZceGE4IgotCQkJICAiXHg0NFx4OTJceDc3XHhkYlx4ZDRceDc3XHhlZlx4MmMiCi0JCQkgICJceDhkXHg2Y1x4MDFceDdkXHhiN1x4MzhceGIxXHg4ZCIKLQkJCSAgIlx4ZWJceDRhXHg0Mlx4N2RceDE5XHgyM1x4Y2VceDNmIgotCQkJICAiXHhmMlx4NjJceDczXHg1N1x4NzlceGE0XHgxOFx4ZjIiCi0JCQkgICJceDBhXHgyOFx4MmRceGY5XHgyMFx4MTRceDdiXHhlYSIKLQkJCSAgIlx4YmVceDQyXHgxZVx4ZTVceDMxXHg5ZFx4MDVceDY4IiwKLQkJLnJsZW4gICA9IDUxMiwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc194dHNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JLyogaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzE2MTkvZW1haWwvcGRmMDAwODYucGRmICovCi0JeyAvKiBYVFMtQUVTIDEgKi8KLQkJLmtleSAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuICAgPSAzMiwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ID0gIlx4OTFceDdjXHhmNlx4OWVceGJkXHg2OFx4YjJceGVjIgotCQkJICJceDliXHg5Zlx4ZTlceGEzXHhlYVx4ZGRceGE2XHg5MiIKLQkJCSAiXHhjZFx4NDNceGQyXHhmNVx4OTVceDk4XHhlZFx4ODUiCi0JCQkgIlx4OGNceDAyXHhjMlx4NjVceDJmXHhiZlx4OTJceDJlIiwKLQkJLmlsZW4gICA9IDMyLAotCQkucmVzdWx0ICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5ybGVuICAgPSAzMiwKLQl9LCB7IC8qIFhUUy1BRVMgMiAqLwotCQkua2V5ICAgID0gIlx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExIgotCQkJICAiXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTEiCi0JCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIKLQkJCSAgIlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyIiwKLQkJLmtsZW4gICA9IDMyLAotCQkuaXYgICAgID0gIlx4MzNceDMzXHgzM1x4MzNceDMzXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaW5wdXQgID0gIlx4YzRceDU0XHgxOFx4NWVceDZhXHgxNlx4OTNceDZlIgotCQkJICAiXHgzOVx4MzNceDQwXHgzOFx4YWNceGVmXHg4M1x4OGIiCi0JCQkgICJceGZiXHgxOFx4NmZceGZmXHg3NFx4ODBceGFkXHhjNCIKLQkJCSAgIlx4MjhceDkzXHg4Mlx4ZWNceGQ2XHhkM1x4OTRceGYwIiwKLQkJLmlsZW4gICA9IDMyLAotCQkucmVzdWx0ID0gIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgotCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCi0JCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKLQkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IiwKLQkJLnJsZW4gICA9IDMyLAotCX0sIHsgLyogWFRTLUFFUyAzICovCi0JCS5rZXkgICAgPSAiXHhmZlx4ZmVceGZkXHhmY1x4ZmJceGZhXHhmOVx4ZjgiCi0JCQkgICJceGY3XHhmNlx4ZjVceGY0XHhmM1x4ZjJceGYxXHhmMCIKLQkJCSAgIlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyIgotCQkJICAiXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjIiLAotCQkua2xlbiAgID0gMzIsCi0JCS5pdiAgICAgPSAiXHgzM1x4MzNceDMzXHgzM1x4MzNceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCA9ICJceGFmXHg4NVx4MzNceDZiXHg1OVx4N2FceGZjXHgxYSIKLQkJCSAgIlx4OTBceDBiXHgyZVx4YjJceDFlXHhjOVx4NDlceGQyIgotCQkJICAiXHg5Mlx4ZGZceDRjXHgwNFx4N2VceDBiXHgyMVx4NTMiCi0JCQkgICJceDIxXHg4Nlx4YTVceDk3XHgxYVx4MjJceDdhXHg4OSIsCi0JCS5pbGVuICAgPSAzMiwKLQkJLnJlc3VsdCAgPSAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCi0JCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKLQkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgotCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiLAotCQkucmxlbiAgID0gMzIsCi0JfSwgeyAvKiBYVFMtQUVTIDQgKi8KLQkJLmtleSAgICA9ICJceDI3XHgxOFx4MjhceDE4XHgyOFx4NDVceDkwXHg0NSIKLQkJCSAgIlx4MjNceDUzXHg2MFx4MjhceDc0XHg3MVx4MzVceDI2IgotCQkJICAiXHgzMVx4NDFceDU5XHgyNlx4NTNceDU4XHg5N1x4OTMiCi0JCQkgICJceDIzXHg4NFx4NjJceDY0XHgzM1x4ODNceDI3XHg5NSIsCi0JCS5rbGVuICAgPSAzMiwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ICA9ICJceDI3XHhhN1x4NDdceDliXHhlZlx4YTFceGQ0XHg3NiIKLQkJCSAgIlx4NDhceDlmXHgzMFx4OGNceGQ0XHhjZlx4YTZceGUyIgotCQkJICAiXHhhOVx4NmVceDRiXHhiZVx4MzJceDA4XHhmZlx4MjUiCi0JCQkgICJceDI4XHg3ZFx4ZDNceDgxXHg5Nlx4MTZceGU4XHg5YyIKLQkJCSAgIlx4YzdceDhjXHhmN1x4ZjVceGU1XHg0M1x4NDRceDVmIgotCQkJICAiXHg4M1x4MzNceGQ4XHhmYVx4N2ZceDU2XHgwMFx4MDAiCi0JCQkgICJceDA1XHgyN1x4OWZceGE1XHhkOFx4YjVceGU0XHhhZCIKLQkJCSAgIlx4NDBceGU3XHgzNlx4ZGRceGI0XHhkM1x4NTRceDEyIgotCQkJICAiXHgzMlx4ODBceDYzXHhmZFx4MmFceGFiXHg1M1x4ZTUiCi0JCQkgICJceGVhXHgxZVx4MGFceDlmXHgzM1x4MjVceDAwXHhhNSIKLQkJCSAgIlx4ZGZceDk0XHg4N1x4ZDBceDdhXHg1Y1x4OTJceGNjIgotCQkJICAiXHg1MVx4MmNceDg4XHg2Nlx4YzdceGU4XHg2MFx4Y2UiCi0JCQkgICJceDkzXHhmZFx4ZjFceDY2XHhhMlx4NDlceDEyXHhiNCIKLQkJCSAgIlx4MjJceDk3XHg2MVx4NDZceGFlXHgyMFx4Y2VceDg0IgotCQkJICAiXHg2Ylx4YjdceGRjXHg5Ylx4YTlceDRhXHg3Nlx4N2EiCi0JCQkgICJceGFlXHhmMlx4MGNceDBkXHg2MVx4YWRceDAyXHg2NSIKLQkJCSAgIlx4NWVceGE5XHgyZFx4YzRceGM0XHhlNFx4MWFceDg5IgotCQkJICAiXHg1Mlx4YzZceDUxXHhkM1x4MzFceDc0XHhiZVx4NTEiCi0JCQkgICJceGExXHgwY1x4NDJceDExXHgxMFx4ZTZceGQ4XHgxNSIKLQkJCSAgIlx4ODhceGVkXHhlOFx4MjFceDAzXHhhMlx4NTJceGQ4IgotCQkJICAiXHhhN1x4NTBceGU4XHg3Nlx4OGRceGVmXHhmZlx4ZWQiCi0JCQkgICJceDkxXHgyMlx4ODFceDBhXHhhZVx4YjlceDlmXHg5MSIKLQkJCSAgIlx4NzJceGFmXHg4Mlx4YjZceDA0XHhkY1x4NGJceDhlIgotCQkJICAiXHg1MVx4YmNceGIwXHg4Mlx4MzVceGE2XHhmNFx4MzQiCi0JCQkgICJceDEzXHgzMlx4ZTRceGNhXHg2MFx4NDhceDJhXHg0YiIKLQkJCSAgIlx4YTFceGEwXHgzYlx4M2VceDY1XHgwMFx4OGZceGM1IgotCQkJICAiXHhkYVx4NzZceGI3XHgwYlx4ZjFceDY5XHgwZFx4YjQiCi0JCQkgICJceGVhXHhlMlx4OWNceDVmXHgxYlx4YWRceGQwXHgzYyIKLQkJCSAgIlx4NWNceGNmXHgyYVx4NTVceGQ3XHgwNVx4ZGRceGNkIgotCQkJICAiXHg4Nlx4ZDRceDQ5XHg1MVx4MWNceGViXHg3ZVx4YzMiCi0JCQkgICJceDBiXHhmMVx4MmJceDFmXHhhM1x4NWJceDkxXHgzZiIKLQkJCSAgIlx4OWZceDc0XHg3YVx4OGFceGZkXHgxYlx4MTNceDBlIgotCQkJICAiXHg5NFx4YmZceGY5XHg0ZVx4ZmZceGQwXHgxYVx4OTEiCi0JCQkgICJceDczXHg1Y1x4YTFceDcyXHg2YVx4Y2RceDBiXHgxOSIKLQkJCSAgIlx4N2NceDRlXHg1Ylx4MDNceDM5XHgzNlx4OTdceGUxIgotCQkJICAiXHgyNlx4ODJceDZmXHhiNlx4YmJceGRlXHg4ZVx4Y2MiCi0JCQkgICJceDFlXHgwOFx4MjlceDg1XHgxNlx4ZTJceGM5XHhlZCIKLQkJCSAgIlx4MDNceGZmXHgzY1x4MWJceDc4XHg2MFx4ZjZceGRlIgotCQkJICAiXHg3Nlx4ZDRceGNlXHhjZFx4OTRceGM4XHgxMVx4OTgiCi0JCQkgICJceDU1XHhlZlx4NTJceDk3XHhjYVx4NjdceGU5XHhmMyIKLQkJCSAgIlx4ZTdceGZmXHg3Mlx4YjFceGU5XHg5N1x4ODVceGNhIgotCQkJICAiXHgwYVx4N2VceDc3XHgyMFx4YzVceGIzXHg2ZFx4YzYiCi0JCQkgICJceGQ3XHgyY1x4YWNceDk1XHg3NFx4YzhceGNiXHhiYyIKLQkJCSAgIlx4MmZceDgwXHgxZVx4MjNceGU1XHg2Zlx4ZDNceDQ0IgotCQkJICAiXHhiMFx4N2ZceDIyXHgxNVx4NGJceGViXHhhMFx4ZjAiCi0JCQkgICJceDhjXHhlOFx4ODlceDFlXHg2NFx4M2VceGQ5XHg5NSIKLQkJCSAgIlx4YzlceDRkXHg5YVx4NjlceGM5XHhmMVx4YjVceGY0IgotCQkJICAiXHg5OVx4MDJceDdhXHg3OFx4NTdceDJhXHhlZVx4YmQiCi0JCQkgICJceDc0XHhkMlx4MGNceGMzXHg5OFx4ODFceGMyXHgxMyIKLQkJCSAgIlx4ZWVceDc3XHgwYlx4MTBceDEwXHhlNFx4YmVceGE3IgotCQkJICAiXHgxOFx4ODRceDY5XHg3N1x4YWVceDExXHg5Zlx4N2EiCi0JCQkgICJceDAyXHgzYVx4YjVceDhjXHhjYVx4MGFceGQ3XHg1MiIKLQkJCSAgIlx4YWZceGU2XHg1Nlx4YmJceDNjXHgxN1x4MjVceDZhIgotCQkJICAiXHg5Zlx4NmVceDliXHhmMVx4OWZceGRkXHg1YVx4MzgiCi0JCQkgICJceGZjXHg4Mlx4YmJceGU4XHg3Mlx4YzVceDUzXHg5ZSIKLQkJCSAgIlx4ZGJceDYwXHg5ZVx4ZjRceGY3XHg5Y1x4MjBceDNlIgotCQkJICAiXHhiYlx4MTRceDBmXHgyZVx4NThceDNjXHhiMlx4YWQiCi0JCQkgICJceDE1XHhiNFx4YWFceDViXHg2NVx4NTBceDE2XHhhOCIKLQkJCSAgIlx4NDRceDkyXHg3N1x4ZGJceGQ0XHg3N1x4ZWZceDJjIgotCQkJICAiXHg4ZFx4NmNceDAxXHg3ZFx4YjdceDM4XHhiMVx4OGQiCi0JCQkgICJceGViXHg0YVx4NDJceDdkXHgxOVx4MjNceGNlXHgzZiIKLQkJCSAgIlx4ZjJceDYyXHg3M1x4NTdceDc5XHhhNFx4MThceGYyIgotCQkJICAiXHgwYVx4MjhceDJkXHhmOVx4MjBceDE0XHg3Ylx4ZWEiCi0JCQkgICJceGJlXHg0Mlx4MWVceGU1XHgzMVx4OWRceDA1XHg2OCIsCi0JCS5pbGVuICAgPSA1MTIsCi0JCS5yZXN1bHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCi0JCQkgICJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyNyIKLQkJCSAgIlx4MjhceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmIgotCQkJICAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkgICJceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKLQkJCSAgIlx4NDBceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3IgotCQkJICAiXHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCi0JCQkgICJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1NyIKLQkJCSAgIlx4NThceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmIgotCQkJICAiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjciCi0JCQkgICJceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKLQkJCSAgIlx4NzBceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3IgotCQkJICAiXHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCi0JCQkgICJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4NyIKLQkJCSAgIlx4ODhceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmIgotCQkJICAiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTciCi0JCQkgICJceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3IgotCQkJICAiXHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCi0JCQkgICJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiNyIKLQkJCSAgIlx4YjhceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmIgotCQkJICAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKLQkJCSAgIlx4ZDBceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3IgotCQkJICAiXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYiCi0JCQkgICJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNyIKLQkJCSAgIlx4ZThceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmIgotCQkJICAiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCi0JCQkgICJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIKLQkJCSAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgotCQkJICAiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCi0JCQkgICJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKLQkJCSAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgotCQkJICAiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCi0JCQkgICJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKLQkJCSAgIlx4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgotCQkJICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCi0JCQkgICJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKLQkJCSAgIlx4NjBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3IgotCQkJICAiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCi0JCQkgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKLQkJCSAgIlx4NzhceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmIgotCQkJICAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCi0JCQkgICJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKLQkJCSAgIlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3IgotCQkJICAiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCi0JCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKLQkJCSAgIlx4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmIgotCQkJICAiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCi0JCQkgICJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKLQkJCSAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgotCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCi0JCQkgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKLQkJCSAgIlx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmIgotCQkJICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCi0JCQkgICJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKLQkJCSAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3IgotCQkJICAiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiLAotCQkucmxlbiAgID0gNTEyLAotCX0KLX07Ci0KLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfY3RyX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogRnJvbSBSRkMgMzY4NiAqLwotCQkua2V5CT0gIlx4YWVceDY4XHg1Mlx4ZjhceDEyXHgxMFx4NjdceGNjIgotCQkJICAiXHg0Ylx4ZjdceGE1XHg3Nlx4NTVceDc3XHhmM1x4OWUiCi0JCQkgICJceDAwXHgwMFx4MDBceDMwIiwKLQkJLmtsZW4JPSAyMCwKLQkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlNpbmdsZSBibG9jayBtc2ciLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0ID0gIlx4ZTRceDA5XHg1ZFx4NGZceGI3XHhhN1x4YjNceDc5IgotCQkJICAiXHgyZFx4NjFceDc1XHhhM1x4MjZceDEzXHgxMVx4YjgiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDdlXHgyNFx4MDZceDc4XHgxN1x4ZmFceGUwXHhkNyIKLQkJCSAgIlx4NDNceGQ2XHhjZVx4MWZceDMyXHg1M1x4OTFceDYzIgotCQkJICAiXHgwMFx4NmNceGI2XHhkYiIsCi0JCS5rbGVuCT0gMjAsCi0JCS5pdgk9ICJceGMwXHg1NFx4M2JceDU5XHhkYVx4NDhceGQ5XHgwYiIsCi0JCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQgPSAiXHg1MVx4MDRceGExXHgwNlx4MTZceDhhXHg3Mlx4ZDkiCi0JCQkgICJceDc5XHgwZFx4NDFceGVlXHg4ZVx4ZGFceGQzXHg4OCIKLQkJCSAgIlx4ZWJceDJlXHgxZVx4ZmNceDQ2XHhkYVx4NTdceGM4IgotCQkJICAiXHhmY1x4ZTZceDMwXHhkZlx4OTFceDQxXHhiZVx4MjgiLAotCQkucmxlbgk9IDMyLAotCX0sIHsKLQkJLmtleQk9ICJceDE2XHhhZlx4NWJceDE0XHg1Zlx4YzlceGY1XHg3OSIKLQkJCSAgIlx4YzFceDc1XHhmOVx4M2VceDNiXHhmYlx4MGVceGVkIgotCQkJICAiXHg4Nlx4M2RceDA2XHhjY1x4ZmRceGI3XHg4NVx4MTUiCi0JCQkgICJceDAwXHgwMFx4MDBceDQ4IiwKLQkJLmtsZW4JPSAyOCwKLQkJLml2CT0gIlx4MzZceDczXHgzY1x4MTRceDdkXHg2ZFx4OTNceGNiIiwKLQkJLmlucHV0CT0gIlNpbmdsZSBibG9jayBtc2ciLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NGJceDU1XHgzOFx4NGZceGUyXHg1OVx4YzlceGM4IgotCQkJICAiXHg0ZVx4NzlceDM1XHhhMFx4MDNceGNiXHhlOVx4MjgiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDdjXHg1Y1x4YjJceDQwXHgxYlx4M2RceGMzXHgzYyIKLQkJCSAgIlx4MTlceGU3XHgzNFx4MDhceDE5XHhlMFx4ZjZceDljIgotCQkJICAiXHg2N1x4OGNceDNkXHhiOFx4ZTZceGY2XHhhOVx4MWEiCi0JCQkgICJceDAwXHg5Nlx4YjBceDNiIiwKLQkJLmtsZW4JPSAyOCwKLQkJLml2CT0gIlx4MDJceDBjXHg2ZVx4YWRceGMyXHhjYlx4NTBceDBkIiwKLQkJLmlucHV0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDQ1XHgzMlx4NDNceGZjXHg2MFx4OWJceDIzXHgzMiIKLQkJCSAgIlx4N2VceGRmXHhhYVx4ZmFceDcxXHgzMVx4Y2RceDlmIgotCQkJICAiXHg4NFx4OTBceDcwXHgxY1x4NWFceGQ0XHhhN1x4OWMiCi0JCQkgICJceGZjXHgxZlx4ZTBceGZmXHg0Mlx4ZjRceGZiXHgwMCIsCi0JCS5ybGVuCT0gMzIsCi0JfSwgewotCQkua2V5CT0gIlx4NzdceDZiXHhlZlx4ZjJceDg1XHgxZFx4YjBceDZmIgotCQkJICAiXHg0Y1x4OGFceDA1XHg0Mlx4YzhceDY5XHg2Zlx4NmMiCi0JCQkgICJceDZhXHg4MVx4YWZceDFlXHhlY1x4OTZceGI0XHhkMyIKLQkJCSAgIlx4N2ZceGMxXHhkNlx4ODlceGU2XHhjMVx4YzFceDA0IgotCQkJICAiXHgwMFx4MDBceDAwXHg2MCIsCi0JCS5rbGVuCT0gMzYsCi0JCS5pdgk9ICJceGRiXHg1Nlx4NzJceGM5XHg3YVx4YThceGYwXHhiMiIsCi0JCS5pbnB1dAk9ICJTaW5nbGUgYmxvY2sgbXNnIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdCA9ICJceDE0XHg1YVx4ZDBceDFkXHhiZlx4ODJceDRlXHhjNyIKLQkJCSAgIlx4NTZceDA4XHg2M1x4ZGNceDcxXHhlM1x4ZTBceGMwIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmNlx4ZDZceDZkXHg2Ylx4ZDVceDJkXHg1OVx4YmIiCi0JCQkgICJceDA3XHg5Nlx4MzZceDU4XHg3OVx4ZWZceGY4XHg4NiIKLQkJCSAgIlx4YzZceDZkXHhkNVx4MWFceDViXHg2YVx4OTlceDc0IgotCQkJICAiXHg0Ylx4NTBceDU5XHgwY1x4ODdceGEyXHgzOFx4ODQiCi0JCQkgICJceDAwXHhmYVx4YWNceDI0IiwKLQkJLmtsZW4JPSAzNiwKLQkJLml2CT0gIlx4YzFceDU4XHg1ZVx4ZjFceDVhXHg0M1x4ZDhceDc1IiwKLQkJLmlucHV0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdCA9ICJceGYwXHg1ZVx4MjNceDFiXHgzOFx4OTRceDYxXHgyYyIKLQkJCSAgIlx4NDlceGVlXHgwMFx4MGJceDgwXHg0ZVx4YjJceGE5IgotCQkJICAiXHhiOFx4MzBceDZiXHg1MFx4OGZceDgzXHg5ZFx4NmEiCi0JCQkgICJceDU1XHgzMFx4ODNceDFkXHg5M1x4NDRceGFmXHgxYyIsCi0JCS5ybGVuCT0gMzIsCi0JfSwgewotCS8vIGdlbmVyYXRlZCB1c2luZyBDcnlwdG8rKwotCQkua2V5ID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgotCQkJIlx4MDBceDAwXHgwMFx4MDAiLAotCQkua2xlbiA9IDMyICsgNCwKLQkJLml2ID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0ID0KLQkJCSJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKLQkJCSJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyNyIKLQkJCSJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKLQkJCSJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKLQkJCSJceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKLQkJCSJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKLQkJCSJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKLQkJCSJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1NyIKLQkJCSJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKLQkJCSJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKLQkJCSJceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKLQkJCSJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKLQkJCSJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKLQkJCSJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4NyIKLQkJCSJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKLQkJCSJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKLQkJCSJceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKLQkJCSJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKLQkJCSJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKLQkJCSJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiNyIKLQkJCSJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKLQkJCSJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKLQkJCSJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKLQkJCSJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKLQkJCSJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKLQkJCSJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNyIKLQkJCSJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKLQkJCSJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKLQkJCSJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIKLQkJCSJceDAwXHgwM1x4MDZceDA5XHgwY1x4MGZceDEyXHgxNSIKLQkJCSJceDE4XHgxYlx4MWVceDIxXHgyNFx4MjdceDJhXHgyZCIKLQkJCSJceDMwXHgzM1x4MzZceDM5XHgzY1x4M2ZceDQyXHg0NSIKLQkJCSJceDQ4XHg0Ylx4NGVceDUxXHg1NFx4NTdceDVhXHg1ZCIKLQkJCSJceDYwXHg2M1x4NjZceDY5XHg2Y1x4NmZceDcyXHg3NSIKLQkJCSJceDc4XHg3Ylx4N2VceDgxXHg4NFx4ODdceDhhXHg4ZCIKLQkJCSJceDkwXHg5M1x4OTZceDk5XHg5Y1x4OWZceGEyXHhhNSIKLQkJCSJceGE4XHhhYlx4YWVceGIxXHhiNFx4YjdceGJhXHhiZCIKLQkJCSJceGMwXHhjM1x4YzZceGM5XHhjY1x4Y2ZceGQyXHhkNSIKLQkJCSJceGQ4XHhkYlx4ZGVceGUxXHhlNFx4ZTdceGVhXHhlZCIKLQkJCSJceGYwXHhmM1x4ZjZceGY5XHhmY1x4ZmZceDAyXHgwNSIKLQkJCSJceDA4XHgwYlx4MGVceDExXHgxNFx4MTdceDFhXHgxZCIKLQkJCSJceDIwXHgyM1x4MjZceDI5XHgyY1x4MmZceDMyXHgzNSIKLQkJCSJceDM4XHgzYlx4M2VceDQxXHg0NFx4NDdceDRhXHg0ZCIKLQkJCSJceDUwXHg1M1x4NTZceDU5XHg1Y1x4NWZceDYyXHg2NSIKLQkJCSJceDY4XHg2Ylx4NmVceDcxXHg3NFx4NzdceDdhXHg3ZCIKLQkJCSJceDgwXHg4M1x4ODZceDg5XHg4Y1x4OGZceDkyXHg5NSIKLQkJCSJceDk4XHg5Ylx4OWVceGExXHhhNFx4YTdceGFhXHhhZCIKLQkJCSJceGIwXHhiM1x4YjZceGI5XHhiY1x4YmZceGMyXHhjNSIKLQkJCSJceGM4XHhjYlx4Y2VceGQxXHhkNFx4ZDdceGRhXHhkZCIKLQkJCSJceGUwXHhlM1x4ZTZceGU5XHhlY1x4ZWZceGYyXHhmNSIKLQkJCSJceGY4XHhmYlx4ZmVceDAxXHgwNFx4MDdceDBhXHgwZCIKLQkJCSJceDEwXHgxM1x4MTZceDE5XHgxY1x4MWZceDIyXHgyNSIKLQkJCSJceDI4XHgyYlx4MmVceDMxXHgzNFx4MzdceDNhXHgzZCIKLQkJCSJceDQwXHg0M1x4NDZceDQ5XHg0Y1x4NGZceDUyXHg1NSIKLQkJCSJceDU4XHg1Ylx4NWVceDYxXHg2NFx4NjdceDZhXHg2ZCIKLQkJCSJceDcwXHg3M1x4NzZceDc5XHg3Y1x4N2ZceDgyXHg4NSIKLQkJCSJceDg4XHg4Ylx4OGVceDkxXHg5NFx4OTdceDlhXHg5ZCIKLQkJCSJceGEwXHhhM1x4YTZceGE5XHhhY1x4YWZceGIyXHhiNSIKLQkJCSJceGI4XHhiYlx4YmVceGMxXHhjNFx4YzdceGNhXHhjZCIKLQkJCSJceGQwXHhkM1x4ZDZceGQ5XHhkY1x4ZGZceGUyXHhlNSIKLQkJCSJceGU4XHhlYlx4ZWVceGYxXHhmNFx4ZjdceGZhXHhmZCIKLQkJCSJceDAwXHgwNVx4MGFceDBmXHgxNFx4MTlceDFlXHgyMyIKLQkJCSJceDI4XHgyZFx4MzJceDM3XHgzY1x4NDFceDQ2XHg0YiIKLQkJCSJceDUwXHg1NVx4NWFceDVmXHg2NFx4NjlceDZlXHg3MyIKLQkJCSJceDc4XHg3ZFx4ODJceDg3XHg4Y1x4OTFceDk2XHg5YiIKLQkJCSJceGEwXHhhNVx4YWFceGFmXHhiNFx4YjlceGJlXHhjMyIKLQkJCSJceGM4XHhjZFx4ZDJceGQ3XHhkY1x4ZTFceGU2XHhlYiIKLQkJCSJceGYwXHhmNVx4ZmFceGZmXHgwNFx4MDlceDBlXHgxMyIKLQkJCSJceDE4XHgxZFx4MjJceDI3XHgyY1x4MzFceDM2XHgzYiIKLQkJCSJceDQwXHg0NVx4NGFceDRmXHg1NFx4NTlceDVlXHg2MyIKLQkJCSJceDY4XHg2ZFx4NzJceDc3XHg3Y1x4ODFceDg2XHg4YiIKLQkJCSJceDkwXHg5NVx4OWFceDlmXHhhNFx4YTlceGFlXHhiMyIKLQkJCSJceGI4XHhiZFx4YzJceGM3XHhjY1x4ZDFceGQ2XHhkYiIKLQkJCSJceGUwXHhlNVx4ZWFceGVmXHhmNFx4ZjlceGZlXHgwMyIKLQkJCSJceDA4XHgwZFx4MTJceDE3XHgxY1x4MjFceDI2XHgyYiIKLQkJCSJceDMwXHgzNVx4M2FceDNmXHg0NFx4NDlceDRlXHg1MyIKLQkJCSJceDU4XHg1ZFx4NjJceDY3XHg2Y1x4NzFceDc2XHg3YiIKLQkJCSJceDgwXHg4NVx4OGFceDhmXHg5NFx4OTlceDllXHhhMyIKLQkJCSJceGE4XHhhZFx4YjJceGI3XHhiY1x4YzFceGM2XHhjYiIKLQkJCSJceGQwXHhkNVx4ZGFceGRmXHhlNFx4ZTlceGVlXHhmMyIKLQkJCSJceGY4XHhmZFx4MDJceDA3XHgwY1x4MTFceDE2XHgxYiIKLQkJCSJceDIwXHgyNVx4MmFceDJmXHgzNFx4MzlceDNlXHg0MyIKLQkJCSJceDQ4XHg0ZFx4NTJceDU3XHg1Y1x4NjFceDY2XHg2YiIKLQkJCSJceDcwXHg3NVx4N2FceDdmXHg4NFx4ODlceDhlXHg5MyIKLQkJCSJceDk4XHg5ZFx4YTJceGE3XHhhY1x4YjFceGI2XHhiYiIKLQkJCSJceGMwXHhjNVx4Y2FceGNmXHhkNFx4ZDlceGRlXHhlMyIKLQkJCSJceGU4XHhlZFx4ZjJceGY3XHhmY1x4MDFceDA2XHgwYiIKLQkJCSJceDEwXHgxNVx4MWFceDFmXHgyNFx4MjlceDJlXHgzMyIKLQkJCSJceDM4XHgzZFx4NDJceDQ3XHg0Y1x4NTFceDU2XHg1YiIKLQkJCSJceDYwXHg2NVx4NmFceDZmXHg3NFx4NzlceDdlXHg4MyIKLQkJCSJceDg4XHg4ZFx4OTJceDk3XHg5Y1x4YTFceGE2XHhhYiIKLQkJCSJceGIwXHhiNVx4YmFceGJmXHhjNFx4YzlceGNlXHhkMyIKLQkJCSJceGQ4XHhkZFx4ZTJceGU3XHhlY1x4ZjFceGY2XHhmYiIKLQkJCSJceDAwXHgwN1x4MGVceDE1XHgxY1x4MjNceDJhXHgzMSIKLQkJCSJceDM4XHgzZlx4NDZceDRkXHg1NFx4NWJceDYyXHg2OSIKLQkJCSJceDcwXHg3N1x4N2VceDg1XHg4Y1x4OTNceDlhXHhhMSIKLQkJCSJceGE4XHhhZlx4YjZceGJkXHhjNFx4Y2JceGQyXHhkOSIKLQkJCSJceGUwXHhlN1x4ZWVceGY1XHhmY1x4MDNceDBhXHgxMSIKLQkJCSJceDE4XHgxZlx4MjZceDJkXHgzNFx4M2JceDQyXHg0OSIKLQkJCSJceDUwXHg1N1x4NWVceDY1XHg2Y1x4NzNceDdhXHg4MSIKLQkJCSJceDg4XHg4Zlx4OTZceDlkXHhhNFx4YWJceGIyXHhiOSIKLQkJCSJceGMwXHhjN1x4Y2VceGQ1XHhkY1x4ZTNceGVhXHhmMSIKLQkJCSJceGY4XHhmZlx4MDZceDBkXHgxNFx4MWJceDIyXHgyOSIKLQkJCSJceDMwXHgzN1x4M2VceDQ1XHg0Y1x4NTNceDVhXHg2MSIKLQkJCSJceDY4XHg2Zlx4NzZceDdkXHg4NFx4OGJceDkyXHg5OSIKLQkJCSJceGEwXHhhN1x4YWVceGI1XHhiY1x4YzNceGNhXHhkMSIKLQkJCSJceGQ4XHhkZlx4ZTZceGVkXHhmNFx4ZmJceDAyXHgwOSIKLQkJCSJceDEwXHgxN1x4MWVceDI1XHgyY1x4MzNceDNhXHg0MSIKLQkJCSJceDQ4XHg0Zlx4NTZceDVkXHg2NFx4NmJceDcyXHg3OSIKLQkJCSJceDgwXHg4N1x4OGVceDk1XHg5Y1x4YTNceGFhXHhiMSIKLQkJCSJceGI4XHhiZlx4YzZceGNkXHhkNFx4ZGJceGUyXHhlOSIKLQkJCSJceGYwXHhmN1x4ZmVceDA1XHgwY1x4MTNceDFhXHgyMSIKLQkJCSJceDI4XHgyZlx4MzZceDNkXHg0NFx4NGJceDUyXHg1OSIKLQkJCSJceDYwXHg2N1x4NmVceDc1XHg3Y1x4ODNceDhhXHg5MSIKLQkJCSJceDk4XHg5Zlx4YTZceGFkXHhiNFx4YmJceGMyXHhjOSIKLQkJCSJceGQwXHhkN1x4ZGVceGU1XHhlY1x4ZjNceGZhXHgwMSIKLQkJCSJceDA4XHgwZlx4MTZceDFkXHgyNFx4MmJceDMyXHgzOSIKLQkJCSJceDQwXHg0N1x4NGVceDU1XHg1Y1x4NjNceDZhXHg3MSIKLQkJCSJceDc4XHg3Zlx4ODZceDhkXHg5NFx4OWJceGEyXHhhOSIKLQkJCSJceGIwXHhiN1x4YmVceGM1XHhjY1x4ZDNceGRhXHhlMSIKLQkJCSJceGU4XHhlZlx4ZjZceGZkXHgwNFx4MGJceDEyXHgxOSIKLQkJCSJceDIwXHgyN1x4MmVceDM1XHgzY1x4NDNceDRhXHg1MSIKLQkJCSJceDU4XHg1Zlx4NjZceDZkXHg3NFx4N2JceDgyXHg4OSIKLQkJCSJceDkwXHg5N1x4OWVceGE1XHhhY1x4YjNceGJhXHhjMSIKLQkJCSJceGM4XHhjZlx4ZDZceGRkXHhlNFx4ZWJceGYyXHhmOSIKLQkJCSJceDAwXHgwOVx4MTJceDFiXHgyNFx4MmRceDM2XHgzZiIKLQkJCSJceDQ4XHg1MVx4NWFceDYzXHg2Y1x4NzVceDdlXHg4NyIKLQkJCSJceDkwXHg5OVx4YTJceGFiXHhiNFx4YmRceGM2XHhjZiIKLQkJCSJceGQ4XHhlMVx4ZWFceGYzXHhmY1x4MDVceDBlXHgxNyIKLQkJCSJceDIwXHgyOVx4MzJceDNiXHg0NFx4NGRceDU2XHg1ZiIKLQkJCSJceDY4XHg3MVx4N2FceDgzXHg4Y1x4OTVceDllXHhhNyIKLQkJCSJceGIwXHhiOVx4YzJceGNiXHhkNFx4ZGRceGU2XHhlZiIKLQkJCSJceGY4XHgwMVx4MGFceDEzXHgxY1x4MjVceDJlXHgzNyIKLQkJCSJceDQwXHg0OVx4NTJceDViXHg2NFx4NmRceDc2XHg3ZiIKLQkJCSJceDg4XHg5MVx4OWFceGEzXHhhY1x4YjVceGJlXHhjNyIKLQkJCSJceGQwXHhkOVx4ZTJceGViXHhmNFx4ZmRceDA2XHgwZiIKLQkJCSJceDE4XHgyMVx4MmFceDMzXHgzY1x4NDVceDRlXHg1NyIKLQkJCSJceDYwXHg2OVx4NzJceDdiXHg4NFx4OGRceDk2XHg5ZiIKLQkJCSJceGE4XHhiMVx4YmFceGMzXHhjY1x4ZDVceGRlXHhlNyIKLQkJCSJceGYwXHhmOVx4MDJceDBiXHgxNFx4MWRceDI2XHgyZiIKLQkJCSJceDM4XHg0MVx4NGFceDUzXHg1Y1x4NjVceDZlXHg3NyIKLQkJCSJceDgwXHg4OVx4OTJceDliXHhhNFx4YWRceGI2XHhiZiIKLQkJCSJceGM4XHhkMVx4ZGFceGUzXHhlY1x4ZjVceGZlXHgwNyIKLQkJCSJceDEwXHgxOVx4MjJceDJiXHgzNFx4M2RceDQ2XHg0ZiIKLQkJCSJceDU4XHg2MVx4NmFceDczXHg3Y1x4ODVceDhlXHg5NyIKLQkJCSJceGEwXHhhOVx4YjJceGJiXHhjNFx4Y2RceGQ2XHhkZiIKLQkJCSJceGU4XHhmMVx4ZmFceDAzXHgwY1x4MTVceDFlXHgyNyIKLQkJCSJceDMwXHgzOVx4NDJceDRiXHg1NFx4NWRceDY2XHg2ZiIKLQkJCSJceDc4XHg4MVx4OGFceDkzXHg5Y1x4YTVceGFlXHhiNyIKLQkJCSJceGMwXHhjOVx4ZDJceGRiXHhlNFx4ZWRceGY2XHhmZiIKLQkJCSJceDA4XHgxMVx4MWFceDIzXHgyY1x4MzVceDNlXHg0NyIKLQkJCSJceDUwXHg1OVx4NjJceDZiXHg3NFx4N2RceDg2XHg4ZiIKLQkJCSJceDk4XHhhMVx4YWFceGIzXHhiY1x4YzVceGNlXHhkNyIKLQkJCSJceGUwXHhlOVx4ZjJceGZiXHgwNFx4MGRceDE2XHgxZiIKLQkJCSJceDI4XHgzMVx4M2FceDQzXHg0Y1x4NTVceDVlXHg2NyIKLQkJCSJceDcwXHg3OVx4ODJceDhiXHg5NFx4OWRceGE2XHhhZiIKLQkJCSJceGI4XHhjMVx4Y2FceGQzXHhkY1x4ZTVceGVlXHhmNyIKLQkJCSJceDAwXHgwYlx4MTZceDIxXHgyY1x4MzdceDQyXHg0ZCIKLQkJCSJceDU4XHg2M1x4NmVceDc5XHg4NFx4OGZceDlhXHhhNSIKLQkJCSJceGIwXHhiYlx4YzZceGQxXHhkY1x4ZTdceGYyXHhmZCIKLQkJCSJceDA4XHgxM1x4MWVceDI5XHgzNFx4M2ZceDRhXHg1NSIKLQkJCSJceDYwXHg2Ylx4NzZceDgxXHg4Y1x4OTdceGEyXHhhZCIKLQkJCSJceGI4XHhjM1x4Y2VceGQ5XHhlNFx4ZWZceGZhXHgwNSIKLQkJCSJceDEwXHgxYlx4MjZceDMxXHgzY1x4NDdceDUyXHg1ZCIKLQkJCSJceDY4XHg3M1x4N2VceDg5XHg5NFx4OWZceGFhXHhiNSIKLQkJCSJceGMwXHhjYlx4ZDZceGUxXHhlY1x4ZjdceDAyXHgwZCIKLQkJCSJceDE4XHgyM1x4MmVceDM5XHg0NFx4NGZceDVhXHg2NSIKLQkJCSJceDcwXHg3Ylx4ODZceDkxXHg5Y1x4YTdceGIyXHhiZCIKLQkJCSJceGM4XHhkM1x4ZGVceGU5XHhmNFx4ZmZceDBhXHgxNSIKLQkJCSJceDIwXHgyYlx4MzZceDQxXHg0Y1x4NTdceDYyXHg2ZCIKLQkJCSJceDc4XHg4M1x4OGVceDk5XHhhNFx4YWZceGJhXHhjNSIKLQkJCSJceGQwXHhkYlx4ZTZceGYxXHhmY1x4MDdceDEyXHgxZCIKLQkJCSJceDI4XHgzM1x4M2VceDQ5XHg1NFx4NWZceDZhXHg3NSIKLQkJCSJceDgwXHg4Ylx4OTZceGExXHhhY1x4YjdceGMyXHhjZCIKLQkJCSJceGQ4XHhlM1x4ZWVceGY5XHgwNFx4MGZceDFhXHgyNSIKLQkJCSJceDMwXHgzYlx4NDZceDUxXHg1Y1x4NjdceDcyXHg3ZCIKLQkJCSJceDg4XHg5M1x4OWVceGE5XHhiNFx4YmZceGNhXHhkNSIKLQkJCSJceGUwXHhlYlx4ZjZceDAxXHgwY1x4MTdceDIyXHgyZCIKLQkJCSJceDM4XHg0M1x4NGVceDU5XHg2NFx4NmZceDdhXHg4NSIKLQkJCSJceDkwXHg5Ylx4YTZceGIxXHhiY1x4YzdceGQyXHhkZCIKLQkJCSJceGU4XHhmM1x4ZmVceDA5XHgxNFx4MWZceDJhXHgzNSIKLQkJCSJceDQwXHg0Ylx4NTZceDYxXHg2Y1x4NzdceDgyXHg4ZCIKLQkJCSJceDk4XHhhM1x4YWVceGI5XHhjNFx4Y2ZceGRhXHhlNSIKLQkJCSJceGYwXHhmYlx4MDZceDExXHgxY1x4MjdceDMyXHgzZCIKLQkJCSJceDQ4XHg1M1x4NWVceDY5XHg3NFx4N2ZceDhhXHg5NSIKLQkJCSJceGEwXHhhYlx4YjZceGMxXHhjY1x4ZDdceGUyXHhlZCIKLQkJCSJceGY4XHgwM1x4MGVceDE5XHgyNFx4MmZceDNhXHg0NSIKLQkJCSJceDUwXHg1Ylx4NjZceDcxXHg3Y1x4ODdceDkyXHg5ZCIKLQkJCSJceGE4XHhiM1x4YmVceGM5XHhkNFx4ZGZceGVhXHhmNSIKLQkJCSJceDAwXHgwZFx4MWFceDI3XHgzNFx4NDFceDRlXHg1YiIKLQkJCSJceDY4XHg3NVx4ODJceDhmXHg5Y1x4YTlceGI2XHhjMyIKLQkJCSJceGQwXHhkZFx4ZWFceGY3XHgwNFx4MTFceDFlXHgyYiIKLQkJCSJceDM4XHg0NVx4NTJceDVmXHg2Y1x4NzlceDg2XHg5MyIKLQkJCSJceGEwXHhhZFx4YmFceGM3XHhkNFx4ZTFceGVlXHhmYiIKLQkJCSJceDA4XHgxNVx4MjJceDJmXHgzY1x4NDlceDU2XHg2MyIKLQkJCSJceDcwXHg3ZFx4OGFceDk3XHhhNFx4YjFceGJlXHhjYiIKLQkJCSJceGQ4XHhlNVx4ZjJceGZmXHgwY1x4MTlceDI2XHgzMyIKLQkJCSJceDQwXHg0ZFx4NWFceDY3XHg3NFx4ODFceDhlXHg5YiIKLQkJCSJceGE4XHhiNVx4YzJceGNmXHhkY1x4ZTlceGY2XHgwMyIKLQkJCSJceDEwXHgxZFx4MmFceDM3XHg0NFx4NTFceDVlXHg2YiIKLQkJCSJceDc4XHg4NVx4OTJceDlmXHhhY1x4YjlceGM2XHhkMyIKLQkJCSJceGUwXHhlZFx4ZmFceDA3XHgxNFx4MjFceDJlXHgzYiIKLQkJCSJceDQ4XHg1NVx4NjJceDZmXHg3Y1x4ODlceDk2XHhhMyIKLQkJCSJceGIwXHhiZFx4Y2FceGQ3XHhlNFx4ZjFceGZlXHgwYiIKLQkJCSJceDE4XHgyNVx4MzJceDNmXHg0Y1x4NTlceDY2XHg3MyIKLQkJCSJceDgwXHg4ZFx4OWFceGE3XHhiNFx4YzFceGNlXHhkYiIKLQkJCSJceGU4XHhmNVx4MDJceDBmXHgxY1x4MjlceDM2XHg0MyIKLQkJCSJceDUwXHg1ZFx4NmFceDc3XHg4NFx4OTFceDllXHhhYiIKLQkJCSJceGI4XHhjNVx4ZDJceGRmXHhlY1x4ZjlceDA2XHgxMyIKLQkJCSJceDIwXHgyZFx4M2FceDQ3XHg1NFx4NjFceDZlXHg3YiIKLQkJCSJceDg4XHg5NVx4YTJceGFmXHhiY1x4YzlceGQ2XHhlMyIKLQkJCSJceGYwXHhmZFx4MGFceDE3XHgyNFx4MzFceDNlXHg0YiIKLQkJCSJceDU4XHg2NVx4NzJceDdmXHg4Y1x4OTlceGE2XHhiMyIKLQkJCSJceGMwXHhjZFx4ZGFceGU3XHhmNFx4MDFceDBlXHgxYiIKLQkJCSJceDI4XHgzNVx4NDJceDRmXHg1Y1x4NjlceDc2XHg4MyIKLQkJCSJceDkwXHg5ZFx4YWFceGI3XHhjNFx4ZDFceGRlXHhlYiIKLQkJCSJceGY4XHgwNVx4MTJceDFmXHgyY1x4MzlceDQ2XHg1MyIKLQkJCSJceDYwXHg2ZFx4N2FceDg3XHg5NFx4YTFceGFlXHhiYiIKLQkJCSJceGM4XHhkNVx4ZTJceGVmXHhmY1x4MDlceDE2XHgyMyIKLQkJCSJceDMwXHgzZFx4NGFceDU3XHg2NFx4NzFceDdlXHg4YiIKLQkJCSJceDk4XHhhNVx4YjJceGJmXHhjY1x4ZDlceGU2XHhmMyIKLQkJCSJceDAwXHgwZlx4MWVceDJkXHgzY1x4NGJceDVhXHg2OSIKLQkJCSJceDc4XHg4N1x4OTZceGE1XHhiNFx4YzNceGQyXHhlMSIKLQkJCSJceGYwXHhmZlx4MGVceDFkXHgyY1x4M2JceDRhXHg1OSIKLQkJCSJceDY4XHg3N1x4ODZceDk1XHhhNFx4YjNceGMyXHhkMSIKLQkJCSJceGUwXHhlZlx4ZmVceDBkXHgxY1x4MmJceDNhXHg0OSIKLQkJCSJceDU4XHg2N1x4NzZceDg1XHg5NFx4YTNceGIyXHhjMSIKLQkJCSJceGQwXHhkZlx4ZWVceGZkXHgwY1x4MWJceDJhXHgzOSIKLQkJCSJceDQ4XHg1N1x4NjZceDc1XHg4NFx4OTNceGEyXHhiMSIKLQkJCSJceGMwXHhjZlx4ZGVceGVkXHhmY1x4MGJceDFhXHgyOSIKLQkJCSJceDM4XHg0N1x4NTZceDY1XHg3NFx4ODNceDkyXHhhMSIKLQkJCSJceGIwXHhiZlx4Y2VceGRkXHhlY1x4ZmJceDBhXHgxOSIKLQkJCSJceDI4XHgzN1x4NDZceDU1XHg2NFx4NzNceDgyXHg5MSIKLQkJCSJceGEwXHhhZlx4YmVceGNkXHhkY1x4ZWJceGZhXHgwOSIKLQkJCSJceDE4XHgyN1x4MzZceDQ1XHg1NFx4NjNceDcyXHg4MSIKLQkJCSJceDkwXHg5Zlx4YWVceGJkXHhjY1x4ZGJceGVhXHhmOSIKLQkJCSJceDA4XHgxN1x4MjZceDM1XHg0NFx4NTNceDYyXHg3MSIKLQkJCSJceDgwXHg4Zlx4OWVceGFkXHhiY1x4Y2JceGRhXHhlOSIKLQkJCSJceGY4XHgwN1x4MTZceDI1XHgzNFx4NDNceDUyXHg2MSIKLQkJCSJceDcwXHg3Zlx4OGVceDlkXHhhY1x4YmJceGNhXHhkOSIKLQkJCSJceGU4XHhmN1x4MDZceDE1XHgyNFx4MzNceDQyXHg1MSIKLQkJCSJceDYwXHg2Zlx4N2VceDhkXHg5Y1x4YWJceGJhXHhjOSIKLQkJCSJceGQ4XHhlN1x4ZjZceDA1XHgxNFx4MjNceDMyXHg0MSIKLQkJCSJceDUwXHg1Zlx4NmVceDdkXHg4Y1x4OWJceGFhXHhiOSIKLQkJCSJceGM4XHhkN1x4ZTZceGY1XHgwNFx4MTNceDIyXHgzMSIKLQkJCSJceDQwXHg0Zlx4NWVceDZkXHg3Y1x4OGJceDlhXHhhOSIKLQkJCSJceGI4XHhjN1x4ZDZceGU1XHhmNFx4MDNceDEyXHgyMSIKLQkJCSJceDMwXHgzZlx4NGVceDVkXHg2Y1x4N2JceDhhXHg5OSIKLQkJCSJceGE4XHhiN1x4YzZceGQ1XHhlNFx4ZjNceDAyXHgxMSIKLQkJCSJceDIwXHgyZlx4M2VceDRkXHg1Y1x4NmJceDdhXHg4OSIKLQkJCSJceDk4XHhhN1x4YjZceGM1XHhkNFx4ZTNceGYyXHgwMSIKLQkJCSJceDEwXHgxZlx4MmVceDNkXHg0Y1x4NWJceDZhXHg3OSIKLQkJCSJceDg4XHg5N1x4YTZceGI1XHhjNFx4ZDNceGUyXHhmMSIKLQkJCSJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKLQkJCSJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIKLQkJCSJceDEwXHgyMVx4MzJceDQzXHg1NFx4NjVceDc2XHg4NyIKLQkJCSJceDk4XHhhOVx4YmFceGNiXHhkY1x4ZWRceGZlXHgwZiIKLQkJCSJceDIwXHgzMVx4NDJceDUzXHg2NFx4NzVceDg2XHg5NyIKLQkJCSJceGE4XHhiOVx4Y2FceGRiXHhlY1x4ZmRceDBlXHgxZiIKLQkJCSJceDMwXHg0MVx4NTJceDYzXHg3NFx4ODVceDk2XHhhNyIKLQkJCSJceGI4XHhjOVx4ZGFceGViXHhmY1x4MGRceDFlXHgyZiIKLQkJCSJceDQwXHg1MVx4NjJceDczXHg4NFx4OTVceGE2XHhiNyIKLQkJCSJceGM4XHhkOVx4ZWFceGZiXHgwY1x4MWRceDJlXHgzZiIKLQkJCSJceDUwXHg2MVx4NzJceDgzXHg5NFx4YTVceGI2XHhjNyIKLQkJCSJceGQ4XHhlOVx4ZmFceDBiXHgxY1x4MmRceDNlXHg0ZiIKLQkJCSJceDYwXHg3MVx4ODJceDkzXHhhNFx4YjVceGM2XHhkNyIKLQkJCSJceGU4XHhmOVx4MGFceDFiXHgyY1x4M2RceDRlXHg1ZiIKLQkJCSJceDcwXHg4MVx4OTJceGEzXHhiNFx4YzVceGQ2XHhlNyIKLQkJCSJceGY4XHgwOVx4MWFceDJiXHgzY1x4NGRceDVlXHg2ZiIKLQkJCSJceDgwXHg5MVx4YTJceGIzXHhjNFx4ZDVceGU2XHhmNyIKLQkJCSJceDA4XHgxOVx4MmFceDNiXHg0Y1x4NWRceDZlXHg3ZiIKLQkJCSJceDkwXHhhMVx4YjJceGMzXHhkNFx4ZTVceGY2XHgwNyIKLQkJCSJceDE4XHgyOVx4M2FceDRiXHg1Y1x4NmRceDdlXHg4ZiIKLQkJCSJceGEwXHhiMVx4YzJceGQzXHhlNFx4ZjVceDA2XHgxNyIKLQkJCSJceDI4XHgzOVx4NGFceDViXHg2Y1x4N2RceDhlXHg5ZiIKLQkJCSJceGIwXHhjMVx4ZDJceGUzXHhmNFx4MDVceDE2XHgyNyIKLQkJCSJceDM4XHg0OVx4NWFceDZiXHg3Y1x4OGRceDllXHhhZiIKLQkJCSJceGMwXHhkMVx4ZTJceGYzXHgwNFx4MTVceDI2XHgzNyIKLQkJCSJceDQ4XHg1OVx4NmFceDdiXHg4Y1x4OWRceGFlXHhiZiIKLQkJCSJceGQwXHhlMVx4ZjJceDAzXHgxNFx4MjVceDM2XHg0NyIKLQkJCSJceDU4XHg2OVx4N2FceDhiXHg5Y1x4YWRceGJlXHhjZiIKLQkJCSJceGUwXHhmMVx4MDJceDEzXHgyNFx4MzVceDQ2XHg1NyIKLQkJCSJceDY4XHg3OVx4OGFceDliXHhhY1x4YmRceGNlXHhkZiIKLQkJCSJceGYwXHgwMVx4MTJceDIzXHgzNFx4NDVceDU2XHg2NyIKLQkJCSJceDc4XHg4OVx4OWFceGFiXHhiY1x4Y2RceGRlXHhlZiIKLQkJCSJceDAwXHgxM1x4MjZceDM5XHg0Y1x4NWZceDcyXHg4NSIKLQkJCSJceDk4XHhhYlx4YmVceGQxXHhlNFx4ZjdceDBhXHgxZCIKLQkJCSJceDMwXHg0M1x4NTZceDY5XHg3Y1x4OGZceGEyXHhiNSIKLQkJCSJceGM4XHhkYlx4ZWVceDAxXHgxNFx4MjdceDNhXHg0ZCIKLQkJCSJceDYwXHg3M1x4ODZceDk5XHhhY1x4YmZceGQyXHhlNSIKLQkJCSJceGY4XHgwYlx4MWVceDMxXHg0NFx4NTdceDZhXHg3ZCIKLQkJCSJceDkwXHhhM1x4YjZceGM5XHhkY1x4ZWZceDAyXHgxNSIKLQkJCSJceDI4XHgzYlx4NGVceDYxXHg3NFx4ODdceDlhXHhhZCIKLQkJCSJceGMwXHhkM1x4ZTZceGY5XHgwY1x4MWZceDMyXHg0NSIKLQkJCSJceDU4XHg2Ylx4N2VceDkxXHhhNFx4YjdceGNhXHhkZCIKLQkJCSJceGYwXHgwM1x4MTZceDI5XHgzY1x4NGZceDYyXHg3NSIKLQkJCSJceDg4XHg5Ylx4YWVceGMxXHhkNFx4ZTdceGZhXHgwZCIKLQkJCSJceDIwXHgzM1x4NDZceDU5XHg2Y1x4N2ZceDkyXHhhNSIKLQkJCSJceGI4XHhjYlx4ZGVceGYxXHgwNFx4MTdceDJhXHgzZCIKLQkJCSJceDUwXHg2M1x4NzZceDg5XHg5Y1x4YWZceGMyXHhkNSIKLQkJCSJceGU4XHhmYlx4MGVceDIxXHgzNFx4NDdceDVhXHg2ZCIKLQkJCSJceDgwXHg5M1x4YTZceGI5XHhjY1x4ZGZceGYyXHgwNSIKLQkJCSJceDE4XHgyYlx4M2VceDUxXHg2NFx4NzdceDhhXHg5ZCIKLQkJCSJceGIwXHhjM1x4ZDZceGU5XHhmY1x4MGZceDIyXHgzNSIKLQkJCSJceDQ4XHg1Ylx4NmVceDgxXHg5NFx4YTdceGJhXHhjZCIKLQkJCSJceGUwXHhmM1x4MDZceDE5XHgyY1x4M2ZceDUyXHg2NSIKLQkJCSJceDc4XHg4Ylx4OWVceGIxXHhjNFx4ZDdceGVhXHhmZCIKLQkJCSJceDEwXHgyM1x4MzZceDQ5XHg1Y1x4NmZceDgyXHg5NSIKLQkJCSJceGE4XHhiYlx4Y2VceGUxXHhmNFx4MDdceDFhXHgyZCIKLQkJCSJceDQwXHg1M1x4NjZceDc5XHg4Y1x4OWZceGIyXHhjNSIKLQkJCSJceGQ4XHhlYlx4ZmVceDExXHgyNFx4MzdceDRhXHg1ZCIKLQkJCSJceDcwXHg4M1x4OTZceGE5XHhiY1x4Y2ZceGUyXHhmNSIKLQkJCSJceDA4XHgxYlx4MmVceDQxXHg1NFx4NjdceDdhXHg4ZCIKLQkJCSJceGEwXHhiM1x4YzZceGQ5XHhlY1x4ZmZceDEyXHgyNSIKLQkJCSJceDM4XHg0Ylx4NWVceDcxXHg4NFx4OTdceGFhXHhiZCIKLQkJCSJceGQwXHhlM1x4ZjZceDA5XHgxY1x4MmZceDQyXHg1NSIKLQkJCSJceDY4XHg3Ylx4OGVceGExXHhiNFx4YzdceGRhXHhlZCIKLQkJCSJceDAwXHgxNVx4MmFceDNmXHg1NFx4NjlceDdlXHg5MyIKLQkJCSJceGE4XHhiZFx4ZDJceGU3XHhmY1x4MTFceDI2XHgzYiIKLQkJCSJceDUwXHg2NVx4N2FceDhmXHhhNFx4YjlceGNlXHhlMyIKLQkJCSJceGY4XHgwZFx4MjJceDM3XHg0Y1x4NjFceDc2XHg4YiIKLQkJCSJceGEwXHhiNVx4Y2FceGRmXHhmNFx4MDlceDFlXHgzMyIKLQkJCSJceDQ4XHg1ZFx4NzJceDg3XHg5Y1x4YjFceGM2XHhkYiIKLQkJCSJceGYwXHgwNVx4MWFceDJmXHg0NFx4NTlceDZlXHg4MyIKLQkJCSJceDk4XHhhZFx4YzJceGQ3XHhlY1x4MDFceDE2XHgyYiIKLQkJCSJceDQwXHg1NVx4NmFceDdmXHg5NFx4YTlceGJlXHhkMyIKLQkJCSJceGU4XHhmZFx4MTJceDI3XHgzY1x4NTFceDY2XHg3YiIKLQkJCSJceDkwXHhhNVx4YmFceGNmXHhlNFx4ZjlceDBlXHgyMyIKLQkJCSJceDM4XHg0ZFx4NjJceDc3XHg4Y1x4YTFceGI2XHhjYiIKLQkJCSJceGUwXHhmNVx4MGFceDFmXHgzNFx4NDlceDVlXHg3MyIKLQkJCSJceDg4XHg5ZFx4YjJceGM3XHhkY1x4ZjFceDA2XHgxYiIKLQkJCSJceDMwXHg0NVx4NWFceDZmXHg4NFx4OTlceGFlXHhjMyIKLQkJCSJceGQ4XHhlZFx4MDJceDE3XHgyY1x4NDFceDU2XHg2YiIKLQkJCSJceDgwXHg5NVx4YWFceGJmXHhkNFx4ZTlceGZlXHgxMyIKLQkJCSJceDI4XHgzZFx4NTJceDY3XHg3Y1x4OTFceGE2XHhiYiIKLQkJCSJceGQwXHhlNVx4ZmFceDBmXHgyNFx4MzlceDRlXHg2MyIKLQkJCSJceDc4XHg4ZFx4YTJceGI3XHhjY1x4ZTFceGY2XHgwYiIKLQkJCSJceDIwXHgzNVx4NGFceDVmXHg3NFx4ODlceDllXHhiMyIKLQkJCSJceGM4XHhkZFx4ZjJceDA3XHgxY1x4MzFceDQ2XHg1YiIKLQkJCSJceDcwXHg4NVx4OWFceGFmXHhjNFx4ZDlceGVlXHgwMyIKLQkJCSJceDE4XHgyZFx4NDJceDU3XHg2Y1x4ODFceDk2XHhhYiIKLQkJCSJceGMwXHhkNVx4ZWFceGZmXHgxNFx4MjlceDNlXHg1MyIKLQkJCSJceDY4XHg3ZFx4OTJceGE3XHhiY1x4ZDFceGU2XHhmYiIKLQkJCSJceDEwXHgyNVx4M2FceDRmXHg2NFx4NzlceDhlXHhhMyIKLQkJCSJceGI4XHhjZFx4ZTJceGY3XHgwY1x4MjFceDM2XHg0YiIKLQkJCSJceDYwXHg3NVx4OGFceDlmXHhiNFx4YzlceGRlXHhmMyIKLQkJCSJceDA4XHgxZFx4MzJceDQ3XHg1Y1x4NzFceDg2XHg5YiIKLQkJCSJceGIwXHhjNVx4ZGFceGVmXHgwNFx4MTlceDJlXHg0MyIKLQkJCSJceDU4XHg2ZFx4ODJceDk3XHhhY1x4YzFceGQ2XHhlYiIKLQkJCSJceDAwXHgxN1x4MmVceDQ1XHg1Y1x4NzNceDhhXHhhMSIKLQkJCSJceGI4XHhjZlx4ZTZceGZkXHgxNFx4MmJceDQyXHg1OSIKLQkJCSJceDcwXHg4N1x4OWVceGI1XHhjY1x4ZTNceGZhXHgxMSIKLQkJCSJceDI4XHgzZlx4NTZceDZkXHg4NFx4OWJceGIyXHhjOSIKLQkJCSJceGUwXHhmN1x4MGVceDI1XHgzY1x4NTNceDZhXHg4MSIKLQkJCSJceDk4XHhhZlx4YzZceGRkXHhmNFx4MGJceDIyXHgzOSIKLQkJCSJceDUwXHg2N1x4N2VceDk1XHhhY1x4YzNceGRhXHhmMSIKLQkJCSJceDA4XHgxZlx4MzZceDRkXHg2NFx4N2JceDkyXHhhOSIKLQkJCSJceGMwXHhkN1x4ZWVceDA1XHgxY1x4MzNceDRhXHg2MSIKLQkJCSJceDc4XHg4Zlx4YTZceGJkXHhkNFx4ZWJceDAyXHgxOSIKLQkJCSJceDMwXHg0N1x4NWVceDc1XHg4Y1x4YTNceGJhXHhkMSIKLQkJCSJceGU4XHhmZlx4MTZceDJkXHg0NFx4NWJceDcyXHg4OSIKLQkJCSJceGEwXHhiN1x4Y2VceGU1XHhmY1x4MTNceDJhXHg0MSIKLQkJCSJceDU4XHg2Zlx4ODZceDlkXHhiNFx4Y2JceGUyXHhmOSIKLQkJCSJceDEwXHgyN1x4M2VceDU1XHg2Y1x4ODNceDlhXHhiMSIKLQkJCSJceGM4XHhkZlx4ZjZceDBkXHgyNFx4M2JceDUyXHg2OSIKLQkJCSJceDgwXHg5N1x4YWVceGM1XHhkY1x4ZjNceDBhXHgyMSIKLQkJCSJceDM4XHg0Zlx4NjZceDdkXHg5NFx4YWJceGMyXHhkOSIKLQkJCSJceGYwXHgwN1x4MWVceDM1XHg0Y1x4NjNceDdhXHg5MSIKLQkJCSJceGE4XHhiZlx4ZDZceGVkXHgwNFx4MWJceDMyXHg0OSIKLQkJCSJceDYwXHg3N1x4OGVceGE1XHhiY1x4ZDNceGVhXHgwMSIKLQkJCSJceDE4XHgyZlx4NDZceDVkXHg3NFx4OGJceGEyXHhiOSIKLQkJCSJceGQwXHhlN1x4ZmVceDE1XHgyY1x4NDNceDVhXHg3MSIKLQkJCSJceDg4XHg5Zlx4YjZceGNkXHhlNFx4ZmJceDEyXHgyOSIKLQkJCSJceDQwXHg1N1x4NmVceDg1XHg5Y1x4YjNceGNhXHhlMSIKLQkJCSJceGY4XHgwZlx4MjZceDNkXHg1NFx4NmJceDgyXHg5OSIKLQkJCSJceGIwXHhjN1x4ZGVceGY1XHgwY1x4MjNceDNhXHg1MSIKLQkJCSJceDY4XHg3Zlx4OTZceGFkXHhjNFx4ZGJceGYyXHgwOSIKLQkJCSJceDIwXHgzN1x4NGVceDY1XHg3Y1x4OTNceGFhXHhjMSIKLQkJCSJceGQ4XHhlZlx4MDZceDFkXHgzNFx4NGJceDYyXHg3OSIKLQkJCSJceDkwXHhhN1x4YmVceGQ1XHhlY1x4MDNceDFhXHgzMSIKLQkJCSJceDQ4XHg1Zlx4NzZceDhkXHhhNFx4YmJceGQyXHhlOSIKLQkJCSJceDAwXHgxOVx4MzJceDRiXHg2NFx4N2RceDk2XHhhZiIKLQkJCSJceGM4XHhlMVx4ZmFceDEzXHgyY1x4NDVceDVlXHg3NyIKLQkJCSJceDkwXHhhOVx4YzJceGRiXHhmNFx4MGRceDI2XHgzZiIKLQkJCSJceDU4XHg3MVx4OGFceGEzXHhiY1x4ZDVceGVlXHgwNyIKLQkJCSJceDIwXHgzOVx4NTJceDZiXHg4NFx4OWRceGI2XHhjZiIKLQkJCSJceGU4XHgwMVx4MWFceDMzXHg0Y1x4NjVceDdlXHg5NyIKLQkJCSJceGIwXHhjOVx4ZTJceGZiXHgxNFx4MmRceDQ2XHg1ZiIKLQkJCSJceDc4XHg5MVx4YWFceGMzXHhkY1x4ZjVceDBlXHgyNyIKLQkJCSJceDQwXHg1OVx4NzJceDhiXHhhNFx4YmRceGQ2XHhlZiIKLQkJCSJceDA4XHgyMVx4M2FceDUzXHg2Y1x4ODVceDllXHhiNyIKLQkJCSJceGQwXHhlOVx4MDJceDFiXHgzNFx4NGRceDY2XHg3ZiIKLQkJCSJceDk4XHhiMVx4Y2FceGUzXHhmY1x4MTVceDJlXHg0NyIKLQkJCSJceDYwXHg3OVx4OTJceGFiXHhjNFx4ZGRceGY2XHgwZiIKLQkJCSJceDI4XHg0MVx4NWFceDczXHg4Y1x4YTVceGJlXHhkNyIKLQkJCSJceGYwXHgwOVx4MjJceDNiXHg1NFx4NmRceDg2XHg5ZiIKLQkJCSJceGI4XHhkMVx4ZWFceDAzXHgxY1x4MzVceDRlXHg2NyIKLQkJCSJceDgwXHg5OVx4YjJceGNiXHhlNFx4ZmRceDE2XHgyZiIKLQkJCSJceDQ4XHg2MVx4N2FceDkzXHhhY1x4YzVceGRlXHhmNyIKLQkJCSJceDEwXHgyOVx4NDJceDViXHg3NFx4OGRceGE2XHhiZiIKLQkJCSJceGQ4XHhmMVx4MGFceDIzXHgzY1x4NTVceDZlXHg4NyIKLQkJCSJceGEwXHhiOVx4ZDJceGViXHgwNFx4MWRceDM2XHg0ZiIKLQkJCSJceDY4XHg4MVx4OWFceGIzXHhjY1x4ZTVceGZlXHgxNyIKLQkJCSJceDMwXHg0OVx4NjJceDdiXHg5NFx4YWRceGM2XHhkZiIKLQkJCSJceGY4XHgxMVx4MmFceDQzXHg1Y1x4NzVceDhlXHhhNyIKLQkJCSJceGMwXHhkOVx4ZjJceDBiXHgyNFx4M2RceDU2XHg2ZiIKLQkJCSJceDg4XHhhMVx4YmFceGQzXHhlY1x4MDVceDFlXHgzNyIKLQkJCSJceDUwXHg2OVx4ODJceDliXHhiNFx4Y2RceGU2XHhmZiIKLQkJCSJceDE4XHgzMVx4NGFceDYzXHg3Y1x4OTVceGFlXHhjNyIKLQkJCSJceGUwXHhmOVx4MTJceDJiXHg0NFx4NWRceDc2XHg4ZiIKLQkJCSJceGE4XHhjMVx4ZGFceGYzXHgwY1x4MjVceDNlXHg1NyIKLQkJCSJceDcwXHg4OVx4YTJceGJiXHhkNFx4ZWRceDA2XHgxZiIKLQkJCSJceDM4XHg1MVx4NmFceDgzXHg5Y1x4YjVceGNlXHhlNyIKLQkJCSJceDAwXHgxYlx4MzZceDUxXHg2Y1x4ODdceGEyXHhiZCIKLQkJCSJceGQ4XHhmM1x4MGVceDI5XHg0NFx4NWZceDdhXHg5NSIKLQkJCSJceGIwXHhjYlx4ZTZceDAxXHgxY1x4MzdceDUyXHg2ZCIKLQkJCSJceDg4XHhhM1x4YmVceGQ5XHhmNFx4MGZceDJhXHg0NSIKLQkJCSJceDYwXHg3Ylx4OTZceGIxXHhjY1x4ZTdceDAyXHgxZCIKLQkJCSJceDM4XHg1M1x4NmVceDg5XHhhNFx4YmZceGRhXHhmNSIKLQkJCSJceDEwXHgyYlx4NDZceDYxXHg3Y1x4OTdceGIyXHhjZCIKLQkJCSJceGU4XHgwM1x4MWVceDM5XHg1NFx4NmZceDhhXHhhNSIKLQkJCSJceGMwXHhkYlx4ZjZceDExXHgyY1x4NDdceDYyXHg3ZCIKLQkJCSJceDk4XHhiM1x4Y2VceGU5XHgwNFx4MWZceDNhXHg1NSIKLQkJCSJceDcwXHg4Ylx4YTZceGMxXHhkY1x4ZjdceDEyXHgyZCIKLQkJCSJceDQ4XHg2M1x4N2VceDk5XHhiNFx4Y2ZceGVhXHgwNSIKLQkJCSJceDIwXHgzYlx4NTZceDcxXHg4Y1x4YTdceGMyXHhkZCIKLQkJCSJceGY4XHgxM1x4MmVceDQ5XHg2NFx4N2ZceDlhXHhiNSIKLQkJCSJceGQwXHhlYlx4MDZceDIxXHgzY1x4NTdceDcyXHg4ZCIKLQkJCSJceGE4XHhjM1x4ZGVceGY5XHgxNFx4MmZceDRhXHg2NSIKLQkJCSJceDgwXHg5Ylx4YjZceGQxXHhlY1x4MDdceDIyXHgzZCIKLQkJCSJceDU4XHg3M1x4OGVceGE5XHhjNFx4ZGZceGZhXHgxNSIKLQkJCSJceDMwXHg0Ylx4NjZceDgxXHg5Y1x4YjdceGQyXHhlZCIKLQkJCSJceDA4XHgyM1x4M2VceDU5XHg3NFx4OGZceGFhXHhjNSIKLQkJCSJceGUwXHhmYlx4MTZceDMxXHg0Y1x4NjdceDgyXHg5ZCIKLQkJCSJceGI4XHhkM1x4ZWVceDA5XHgyNFx4M2ZceDVhXHg3NSIKLQkJCSJceDkwXHhhYlx4YzZceGUxXHhmY1x4MTdceDMyXHg0ZCIKLQkJCSJceDY4XHg4M1x4OWVceGI5XHhkNFx4ZWZceDBhXHgyNSIKLQkJCSJceDQwXHg1Ylx4NzZceDkxXHhhY1x4YzdceGUyXHhmZCIKLQkJCSJceDE4XHgzM1x4NGVceDY5XHg4NFx4OWZceGJhXHhkNSIKLQkJCSJceGYwXHgwYlx4MjZceDQxXHg1Y1x4NzdceDkyXHhhZCIKLQkJCSJceGM4XHhlM1x4ZmVceDE5XHgzNFx4NGZceDZhXHg4NSIKLQkJCSJceGEwXHhiYlx4ZDZceGYxXHgwY1x4MjdceDQyXHg1ZCIKLQkJCSJceDc4XHg5M1x4YWVceGM5XHhlNFx4ZmZceDFhXHgzNSIKLQkJCSJceDUwXHg2Ylx4ODZceGExXHhiY1x4ZDdceGYyXHgwZCIKLQkJCSJceDI4XHg0M1x4NWVceDc5XHg5NFx4YWZceGNhXHhlNSIKLQkJCSJceDAwXHgxZFx4M2FceDU3XHg3NFx4OTFceGFlXHhjYiIKLQkJCSJceGU4XHgwNVx4MjJceDNmXHg1Y1x4NzlceDk2XHhiMyIKLQkJCSJceGQwXHhlZFx4MGFceDI3XHg0NFx4NjFceDdlXHg5YiIKLQkJCSJceGI4XHhkNVx4ZjJceDBmXHgyY1x4NDlceDY2XHg4MyIKLQkJCSJceGEwXHhiZFx4ZGFceGY3XHgxNFx4MzFceDRlXHg2YiIKLQkJCSJceDg4XHhhNVx4YzJceGRmXHhmY1x4MTlceDM2XHg1MyIKLQkJCSJceDcwXHg4ZFx4YWFceGM3XHhlNFx4MDFceDFlXHgzYiIKLQkJCSJceDU4XHg3NVx4OTJceGFmXHhjY1x4ZTlceDA2XHgyMyIKLQkJCSJceDQwXHg1ZFx4N2FceDk3XHhiNFx4ZDFceGVlXHgwYiIKLQkJCSJceDI4XHg0NVx4NjJceDdmXHg5Y1x4YjlceGQ2XHhmMyIKLQkJCSJceDEwXHgyZFx4NGFceDY3XHg4NFx4YTFceGJlXHhkYiIKLQkJCSJceGY4XHgxNVx4MzJceDRmXHg2Y1x4ODlceGE2XHhjMyIKLQkJCSJceGUwXHhmZFx4MWFceDM3XHg1NFx4NzFceDhlXHhhYiIKLQkJCSJceGM4XHhlNVx4MDJceDFmXHgzY1x4NTlceDc2XHg5MyIKLQkJCSJceGIwXHhjZFx4ZWFceDA3XHgyNFx4NDFceDVlXHg3YiIKLQkJCSJceDk4XHhiNVx4ZDJceGVmXHgwY1x4MjlceDQ2XHg2MyIKLQkJCSJceDgwXHg5ZFx4YmFceGQ3XHhmNFx4MTFceDJlXHg0YiIKLQkJCSJceDY4XHg4NVx4YTJceGJmXHhkY1x4ZjlceDE2XHgzMyIKLQkJCSJceDUwXHg2ZFx4OGFceGE3XHhjNFx4ZTFceGZlXHgxYiIKLQkJCSJceDM4XHg1NVx4NzJceDhmXHhhY1x4YzlceGU2XHgwMyIKLQkJCSJceDIwXHgzZFx4NWFceDc3XHg5NFx4YjFceGNlXHhlYiIKLQkJCSJceDA4XHgyNVx4NDJceDVmXHg3Y1x4OTlceGI2XHhkMyIKLQkJCSJceGYwXHgwZFx4MmFceDQ3XHg2NFx4ODFceDllXHhiYiIKLQkJCSJceGQ4XHhmNVx4MTJceDJmXHg0Y1x4NjlceDg2XHhhMyIKLQkJCSJceGMwXHhkZFx4ZmFceDE3XHgzNFx4NTFceDZlXHg4YiIKLQkJCSJceGE4XHhjNVx4ZTJceGZmXHgxY1x4MzlceDU2XHg3MyIKLQkJCSJceDkwXHhhZFx4Y2FceGU3XHgwNFx4MjFceDNlXHg1YiIKLQkJCSJceDc4XHg5NVx4YjJceGNmXHhlY1x4MDlceDI2XHg0MyIKLQkJCSJceDYwXHg3ZFx4OWFceGI3XHhkNFx4ZjFceDBlXHgyYiIKLQkJCSJceDQ4XHg2NVx4ODJceDlmXHhiY1x4ZDlceGY2XHgxMyIKLQkJCSJceDMwXHg0ZFx4NmFceDg3XHhhNFx4YzFceGRlXHhmYiIKLQkJCSJceDE4XHgzNVx4NTJceDZmXHg4Y1x4YTlceGM2XHhlMyIKLQkJCSJceDAwXHgxZlx4M2VceDVkXHg3Y1x4OWJceGJhXHhkOSIKLQkJCSJceGY4XHgxN1x4MzZceDU1XHg3NFx4OTNceGIyXHhkMSIKLQkJCSJceGYwXHgwZlx4MmVceDRkXHg2Y1x4OGJceGFhXHhjOSIKLQkJCSJceGU4XHgwN1x4MjZceDQ1XHg2NFx4ODNceGEyXHhjMSIKLQkJCSJceGUwXHhmZlx4MWVceDNkXHg1Y1x4N2JceDlhXHhiOSIKLQkJCSJceGQ4XHhmN1x4MTZceDM1XHg1NFx4NzNceDkyXHhiMSIKLQkJCSJceGQwXHhlZlx4MGVceDJkXHg0Y1x4NmJceDhhXHhhOSIKLQkJCSJceGM4XHhlN1x4MDZceDI1XHg0NFx4NjNceDgyXHhhMSIKLQkJCSJceGMwXHhkZlx4ZmVceDFkXHgzY1x4NWJceDdhXHg5OSIKLQkJCSJceGI4XHhkN1x4ZjZceDE1XHgzNFx4NTNceDcyXHg5MSIKLQkJCSJceGIwXHhjZlx4ZWVceDBkXHgyY1x4NGJceDZhXHg4OSIKLQkJCSJceGE4XHhjN1x4ZTZceDA1XHgyNFx4NDNceDYyXHg4MSIKLQkJCSJceGEwXHhiZlx4ZGVceGZkXHgxY1x4M2JceDVhXHg3OSIKLQkJCSJceDk4XHhiN1x4ZDZceGY1XHgxNFx4MzNceDUyXHg3MSIKLQkJCSJceDkwXHhhZlx4Y2VceGVkXHgwY1x4MmJceDRhXHg2OSIKLQkJCSJceDg4XHhhN1x4YzZceGU1XHgwNFx4MjNceDQyXHg2MSIKLQkJCSJceDgwXHg5Zlx4YmVceGRkXHhmY1x4MWJceDNhXHg1OSIKLQkJCSJceDc4XHg5N1x4YjZceGQ1XHhmNFx4MTNceDMyXHg1MSIKLQkJCSJceDcwXHg4Zlx4YWVceGNkXHhlY1x4MGJceDJhXHg0OSIKLQkJCSJceDY4XHg4N1x4YTZceGM1XHhlNFx4MDNceDIyXHg0MSIKLQkJCSJceDYwXHg3Zlx4OWVceGJkXHhkY1x4ZmJceDFhXHgzOSIKLQkJCSJceDU4XHg3N1x4OTZceGI1XHhkNFx4ZjNceDEyXHgzMSIKLQkJCSJceDUwXHg2Zlx4OGVceGFkXHhjY1x4ZWJceDBhXHgyOSIKLQkJCSJceDQ4XHg2N1x4ODZceGE1XHhjNFx4ZTNceDAyXHgyMSIKLQkJCSJceDQwXHg1Zlx4N2VceDlkXHhiY1x4ZGJceGZhXHgxOSIKLQkJCSJceDM4XHg1N1x4NzZceDk1XHhiNFx4ZDNceGYyXHgxMSIKLQkJCSJceDMwXHg0Zlx4NmVceDhkXHhhY1x4Y2JceGVhXHgwOSIKLQkJCSJceDI4XHg0N1x4NjZceDg1XHhhNFx4YzNceGUyXHgwMSIKLQkJCSJceDIwXHgzZlx4NWVceDdkXHg5Y1x4YmJceGRhXHhmOSIKLQkJCSJceDE4XHgzN1x4NTZceDc1XHg5NFx4YjNceGQyXHhmMSIKLQkJCSJceDEwXHgyZlx4NGVceDZkXHg4Y1x4YWJceGNhXHhlOSIKLQkJCSJceDA4XHgyN1x4NDZceDY1XHg4NFx4YTNceGMyXHhlMSIKLQkJCSJceDAwXHgyMVx4NDJceDYzIiwKLQkJLmlsZW4gPSA0MTAwLAotCQkucmVzdWx0ID0KLQkJCSJceGYwXHg1Y1x4NzRceGFkXHg0ZVx4YmNceDk5XHhlMiIKLQkJCSJceGFlXHhmZlx4OTFceDNhXHg0NFx4Y2ZceDM4XHgzMiIKLQkJCSJceDFlXHhhZFx4YTdceGNkXHhhMVx4MzlceDk1XHhhYSIKLQkJCSJceDEwXHhiMVx4YjNceDJlXHgwNFx4MzFceDhmXHg4NiIKLQkJCSJceGYyXHg2Mlx4NzRceDcwXHgwY1x4YTRceDQ2XHgwOCIKLQkJCSJceGE4XHhiN1x4OTlceGE4XHhlOVx4ZDJceDczXHg3OSIKLQkJCSJceDdlXHg2ZVx4ZDRceDhmXHgxZVx4YzdceDhlXHgzMSIKLQkJCSJceDBiXHhmYVx4NGJceGNlXHhmZFx4ZjNceDU3XHg3MSIKLQkJCSJceGU5XHg0Nlx4MDNceGE1XHgzZFx4MzRceDAwXHhlMiIKLQkJCSJceDE4XHhmZlx4NzVceDZkXHgwNlx4MmRceDAwXHhhYiIKLQkJCSJceGI5XHgzZVx4NmNceDU5XHhjNVx4ODRceDA2XHhiNSIKLQkJCSJceDhiXHhkMFx4ODlceDljXHg0YVx4NzlceDE2XHhjNiIKLQkJCSJceDNkXHg3NFx4NTRceGZhXHg0NFx4Y2RceDIzXHgyNiIKLQkJCSJceDVjXHhjZlx4N2VceDI4XHg5Mlx4MzJceGJmXHhkZiIKLQkJCSJceGE3XHgyMFx4M2NceDc0XHg1OFx4MmFceDlhXHhkZSIKLQkJCSJceDYxXHgwMFx4MWNceDRmXHhmZlx4NTlceGM0XHgyMiIKLQkJCSJceGFjXHgzY1x4ZDBceGU4XHg2Y1x4ZjlceDk3XHgxYiIKLQkJCSJceDU4XHg5Ylx4YWRceDcxXHhlOFx4YTlceGI1XHgwZCIKLQkJCSJceGVlXHgyZlx4MDRceDFmXHg3Zlx4YmNceDk5XHhlZSIKLQkJCSJceDg0XHhmZlx4NDJceDYwXHhkY1x4M2FceDE4XHhhNSIKLQkJCSJceDgxXHhmOVx4ZWZceGRjXHg3YVx4MGZceDY1XHg0MSIKLQkJCSJceDJmXHhhM1x4ZDNceGY5XHhjMlx4Y2JceGMwXHg0ZCIKLQkJCSJceDhmXHhkM1x4NzZceDk2XHhhZFx4NDlceDZkXHgzOCIKLQkJCSJceDNkXHgzOVx4MGJceDZjXHg4MFx4YjdceDU0XHg2OSIKLQkJCSJceGYwXHgyY1x4OTBceDAyXHgyOVx4MGRceDFjXHgxMiIKLQkJCSJceGFkXHg1NVx4YzNceDhiXHg2OFx4ZDlceGNjXHhiMyIKLQkJCSJceGIyXHg2NFx4MzNceDkwXHg1ZVx4Y2FceDRiXHhlMiIKLQkJCSJceGZiXHg3NVx4ZGNceDYzXHhmN1x4OWZceDgyXHg3NCIKLQkJCSJceGYwXHhjOVx4YWFceDdmXHhlOVx4MmFceDliXHgzMyIKLQkJCSJceGJjXHg4OFx4MDBceDdmXHhjYVx4YjJceDFmXHgxNCIKLQkJCSJceGRiXHhjNVx4OGVceDdiXHgxMVx4M2NceDNlXHgwOCIKLQkJCSJceGYzXHg4M1x4ZThceGUwXHg5NFx4ODZceDJlXHg5MiIKLQkJCSJceDc4XHg2Ylx4MDFceGM5XHhjN1x4ODNceGJhXHgyMSIKLQkJCSJceDZhXHgyNVx4MTVceDMzXHg0ZVx4NDVceDA4XHhlYyIKLQkJCSJceDM1XHhkYlx4ZTBceDZlXHgzMVx4NTFceDc5XHhhOSIKLQkJCSJceDQyXHg0NFx4NjVceGMxXHhhMFx4ZjFceGY5XHgyYSIKLQkJCSJceDcwXHhkNVx4YjZceGM2XHhjMVx4OGNceDM5XHhmYyIKLQkJCSJceDI1XHhhNlx4NTVceGQ5XHhkZFx4MmRceDRjXHhlYyIKLQkJCSJceDQ5XHhjNlx4ZWJceDBlXHhhOFx4MjVceDJhXHgxNiIKLQkJCSJceDFiXHg2Nlx4ODRceGRhXHhlMlx4OTJceGU1XHhjMCIKLQkJCSJceGM4XHg1M1x4MDdceGFmXHg4MFx4ODRceGVjXHhmZCIKLQkJCSJceGNkXHhkMVx4NmVceGNkXHg2Zlx4NmFceGY1XHgzNiIKLQkJCSJceGM1XHgxNVx4ZTVceDI1XHg3ZFx4NzdceGQxXHgxYSIKLQkJCSJceDkzXHgzNlx4YTlceGNmXHg3Y1x4YTRceDU0XHg0YSIKLQkJCSJceDA2XHg1MVx4NDhceDRlXHhmNlx4NTlceDg3XHhkMiIKLQkJCSJceDA0XHgwMlx4ZWZceGQzXHg0NFx4ZGVceDc2XHgzMSIKLQkJCSJceGIzXHgzNFx4MTdceDFiXHg5ZFx4NjZceDExXHg5ZiIKLQkJCSJceDFlXHhjY1x4MTdceGU5XHhjN1x4M2NceDFiXHhlNyIKLQkJCSJceGNiXHg1MFx4MDhceGZjXHhkY1x4MmJceDI0XHhkYiIKLQkJCSJceDY1XHg4M1x4ZDBceDNiXHhlM1x4MzBceGVhXHg5NCIKLQkJCSJceDZjXHhlN1x4ZThceDM1XHgzMlx4YzdceGRiXHg2NCIKLQkJCSJceGI0XHgwMVx4YWJceDM2XHgyY1x4NzdceDEzXHhhZiIKLQkJCSJceGY4XHgyYlx4ODhceDNmXHg1NFx4MzlceGM0XHg0NCIKLQkJCSJceGZlXHhlZlx4NmZceDY4XHgzNFx4YmVceDBmXHgwNSIKLQkJCSJceDE2XHg2ZFx4ZjZceDBhXHgzMFx4ZTdceGUzXHhlZCIKLQkJCSJceGM0XHhkZVx4M2NceDFiXHgxM1x4ZDhceGRiXHhmZSIKLQkJCSJceDQxXHg2Mlx4ZTVceDI4XHhkNFx4OGRceGEzXHhjNyIKLQkJCSJceDkzXHg5N1x4YzZceDQ4XHg0NVx4MWRceDlmXHg4MyIKLQkJCSJceGRmXHg0Ylx4NDBceDNlXHg0Mlx4MjVceDg3XHg4MCIKLQkJCSJceDRjXHg3ZFx4YThceGQ0XHg5OFx4MjNceDk1XHg3NSIKLQkJCSJceDQxXHg4Y1x4ZGFceDQxXHg5Ylx4ZDRceGE3XHgwNiIKLQkJCSJceGI1XHhmMVx4NzFceDA5XHg1M1x4YmVceGNhXHhiZiIKLQkJCSJceDMyXHgwM1x4ZWRceGYwXHg1MFx4MWNceDU2XHgzOSIKLQkJCSJceDViXHhhNFx4NzVceDE4XHhmN1x4OWJceDU4XHhlZiIKLQkJCSJceDUzXHhmY1x4MmFceDM4XHgyM1x4MTVceDc1XHhjZCIKLQkJCSJceDQ1XHhlNVx4NWFceDgyXHg1NVx4YmFceDIxXHhmYSIKLQkJCSJceGQ0XHhiZFx4YzZceDk0XHg3Y1x4YzVceDgwXHgxMiIKLQkJCSJceGY3XHg0Ylx4MzJceGM0XHg5YVx4ODJceGQ4XHgyOCIKLQkJCSJceDhmXHhkOVx4YzJceDBmXHg2MFx4MDNceGJlXHg1ZSIKLQkJCSJceDIxXHhkNlx4NWZceDU4XHhiZlx4NWNceGIxXHgzMiIKLQkJCSJceDgyXHg4ZFx4YTlceGU1XHhmMlx4NjZceDFhXHhjMCIKLQkJCSJceGEwXHhiY1x4NThceDJmXHg3MVx4ZjVceDJmXHhlZCIKLQkJCSJceGQxXHgyNlx4YjlceGQ4XHg0OVx4NWFceDA3XHgxOSIKLQkJCSJceDAxXHg3Y1x4NTlceGIwXHhmOFx4YTRceGI3XHhkMyIKLQkJCSJceDdiXHgxYVx4OGNceDM4XHhmNFx4NTBceGE0XHg1OSIKLQkJCSJceGIwXHhjY1x4NDFceDBiXHg4OFx4N2ZceGU1XHgzMSIKLQkJCSJceGIzXHg0Mlx4YmFceGEyXHg3ZVx4ZDRceDMyXHg3MSIKLQkJCSJceDQ1XHg4N1x4NDhceGE5XHhjMlx4ZjJceDg5XHhiMyIKLQkJCSJceGU0XHhhN1x4N2VceDUyXHgxNVx4NjFceGZhXHhmZSIKLQkJCSJceGM5XHhkZFx4ODFceGViXHgxM1x4YWJceGFiXHhjMyIKLQkJCSJceDk4XHg1OVx4ZDhceDE2XHgzZFx4MTRceDdhXHgxYyIKLQkJCSJceDNjXHg0MVx4OWFceDE2XHgxNlx4OWJceGQyXHhkMiIKLQkJCSJceDY5XHgzYVx4MjlceDIzXHhhY1x4ODZceDMyXHhhNSIKLQkJCSJceDQ4XHg5Y1x4OWVceGYzXHg0N1x4NzdceDgxXHg3MCIKLQkJCSJceDI0XHhlOFx4ODVceGQyXHhmNVx4YjVceGZhXHhmZiIKLQkJCSJceDU5XHg2YVx4ZDNceDUwXHg1OVx4NDNceDU5XHhkZSIKLQkJCSJceGQ5XHhmMVx4NTVceGE1XHgwY1x4YzNceDFhXHgxYSIKLQkJCSJceDE4XHgzNFx4MGRceDFhXHg2M1x4MzNceGVkXHgxMCIKLQkJCSJceGUwXHgxZFx4MmFceDE4XHhkMlx4YzBceDU0XHhhOCIKLQkJCSJceGNhXHhiNVx4OWFceGQzXHhkZFx4Y2FceDQ1XHg4NCIKLQkJCSJceDUwXHhlN1x4MGZceGZlXHhhNFx4OTlceDVhXHhiZSIKLQkJCSJceDQzXHgyZFx4OWFceGNiXHg5Mlx4M2ZceDVhXHgxZCIKLQkJCSJceDg1XHhkOFx4YzlceGRmXHg2OFx4YzlceDEyXHg4MCIKLQkJCSJceDU2XHgwY1x4ZGNceDAwXHhkY1x4M2FceDdkXHg5ZCIKLQkJCSJceGEzXHhhMlx4ZThceDRkXHhiZlx4ZjlceDcwXHhhMCIKLQkJCSJceGE0XHgxM1x4NGZceDZiXHhhZlx4MGFceDg5XHg3ZiIKLQkJCSJceGRhXHhmMFx4YmZceDliXHhjOFx4MWRceGU1XHhmOCIKLQkJCSJceDJlXHg4Ylx4MDdceGI1XHg3M1x4MWJceGNjXHhhMiIKLQkJCSJceGE2XHhhZFx4MzBceGJjXHg3OFx4M2NceDViXHgxMCIKLQkJCSJceGZhXHg1ZVx4NjJceDJkXHg5ZVx4NjRceGIzXHgzMyIKLQkJCSJceGNlXHhmOVx4MWZceDg2XHhlN1x4OGJceGEyXHhiOCIKLQkJCSJceGU4XHg5OVx4NTdceDhjXHgxMVx4ZWRceDY2XHhkOSIKLQkJCSJceDNjXHg3Mlx4YjlceGMzXHhlNlx4NGVceDE3XHgzYSIKLQkJCSJceDZhXHhjYlx4NDJceDI0XHgwNlx4ZWRceDNlXHg0ZSIKLQkJCSJceGEzXHhlOFx4NmFceDk0XHhkYVx4MGRceDRlXHhkNSIKLQkJCSJceDE0XHgxOVx4Y2ZceGI2XHgyNlx4ZDhceDJlXHhjYyIKLQkJCSJceDY0XHg3Nlx4MzhceDQ5XHg0ZFx4ZmVceDMwXHg2ZCIKLQkJCSJceGU0XHhjOFx4OGNceDdiXHhjNFx4ZTBceDM1XHhiYSIKLQkJCSJceDIyXHg2ZVx4NzZceGUxXHgxYVx4ZjJceDUzXHhjMyIKLQkJCSJceDI4XHhhMlx4ODJceDFmXHg2MVx4NjlceGFkXHhjMSIKLQkJCSJceDdiXHgyOFx4NGJceDFlXHg2Y1x4ODVceDk1XHg5YiIKLQkJCSJceDUxXHhiNVx4MTdceDdmXHgxMlx4NjlceDhjXHgyNCIKLQkJCSJceGQ1XHhjN1x4NWFceDVhXHgxMVx4NTRceGZmXHg1YSIKLQkJCSJceGY3XHgxNlx4YzNceDkxXHhhNlx4ZjBceGRjXHgwYSIKLQkJCSJceGI2XHhhN1x4NGFceDBkXHg3YVx4NThceGZlXHhhNSIKLQkJCSJceGY1XHhjYlx4OGZceDdiXHgwZVx4ZWFceDU3XHhlNyIKLQkJCSJceGJkXHg3OVx4ZDZceDFjXHg4OFx4MjNceDZjXHhmMiIKLQkJCSJceDRkXHgyOVx4NzdceDUzXHgzNVx4NmFceDAwXHg4ZCIKLQkJCSJceGNkXHhhM1x4NThceGJlXHg3N1x4OTlceDE4XHhmOCIKLQkJCSJceGU2XHhlMVx4OGZceGU5XHgzN1x4OGZceGUzXHhlMiIKLQkJCSJceDVhXHg4YVx4OTNceDI1XHhhZlx4ZjNceDc4XHg4MCIKLQkJCSJceGJlXHhhNlx4MWJceGM2XHhhY1x4OGJceDFjXHg5MSIKLQkJCSJceDU4XHhlMVx4OWZceDg5XHgzNVx4OWRceDFkXHgyMSIKLQkJCSJceDI5XHg5Zlx4ZjRceDk5XHgwMlx4MjdceDBmXHhhOCIKLQkJCSJceDRmXHg3OVx4OTRceDJiXHgzM1x4MmNceGRhXHhhMiIKLQkJCSJceDI2XHgzOVx4ODNceDk0XHhlZlx4MjdceGQ4XHg1MyIKLQkJCSJceDhmXHg2Nlx4MGRceGU0XHg0MVx4N2RceDM0XHhjZCIKLQkJCSJceDQzXHg3Y1x4OTVceDBhXHg1M1x4ZWZceDY2XHhkYSIKLQkJCSJceDdlXHg5Ylx4ZjNceDkzXHhhZlx4ZDBceDczXHg3MSIKLQkJCSJceGJhXHg0MFx4OWJceDc0XHhmOFx4ZDdceGQ3XHg0MSIKLQkJCSJceDZkXHhhZlx4NzJceDljXHg4ZFx4MjFceDg3XHgzYyIKLQkJCSJceGZkXHgwYVx4OTBceGE5XHg0N1x4OTZceDllXHhkMyIKLQkJCSJceDg4XHhlZVx4NzNceGNmXHg2Nlx4MmZceDUyXHg1NiIKLQkJCSJceDZkXHhhOVx4ODBceDRjXHhlMlx4NmZceDYyXHg4OCIKLQkJCSJceDNmXHgwZVx4NTRceDE3XHg0OFx4ODBceDVkXHhkMyIKLQkJCSJceGMzXHhkYVx4MjVceDNkXHhhMVx4YzhceGNiXHg5ZiIKLQkJCSJceDliXHg3MFx4YjNceGExXHhlYlx4MDRceDUyXHhhMSIKLQkJCSJceGYyXHgyMlx4MGZceGZjXHhjOFx4MThceGZhXHhmOSIKLQkJCSJceDg1XHg5Y1x4ZjFceGFjXHhlYlx4MGNceDAyXHg0NiIKLQkJCSJceDc1XHhkMlx4ZjVceDJjXHhlM1x4ZDJceDU5XHg5NCIKLQkJCSJceDEyXHhmM1x4M2NceGZjXHhkN1x4OTJceGZhXHgzNiIKLQkJCSJceGJhXHg2MVx4MzRceDM4XHg3Y1x4ZGFceDQ4XHgzZSIKLQkJCSJceDA4XHhjOVx4MzlceDIzXHg1ZVx4MDJceDJjXHgxYSIKLQkJCSJceDE4XHg3ZVx4YjRceGQ5XHhmZFx4OWVceDQwXHgwMiIKLQkJCSJceGIxXHgzM1x4MzdceDMyXHhlN1x4ZGVceGQ2XHhkMCIKLQkJCSJceDdjXHg1OFx4NjVceDRiXHhmOFx4MzRceDI3XHg5YyIKLQkJCSJceDQ0XHhiNFx4YmRceGU5XHhlOVx4NGNceDc4XHg3ZCIKLQkJCSJceDRiXHg5Zlx4Y2VceGIxXHhjZFx4NDdceGE1XHgzNyIKLQkJCSJceGU1XHg2ZFx4YmRceGI5XHg0M1x4OTRceDBhXHhkNCIKLQkJCSJceGQ2XHhmOVx4MDRceDVmXHhiNVx4NjZceDZjXHgxYSIKLQkJCSJceDM1XHgxMlx4ZTNceDM2XHgyOFx4MjdceDM2XHg1OCIKLQkJCSJceDAxXHgyYlx4NzlceGU0XHhiYVx4NmRceDEwXHg3ZCIKLQkJCSJceDY1XHhkZlx4ODRceDk1XHhmNFx4ZDVceGI2XHg4ZiIKLQkJCSJceDJiXHg5Zlx4OTZceDAwXHg4Nlx4NjBceGYwXHgyMSIKLQkJCSJceDc2XHhhOFx4NmFceDhjXHgyOFx4MWNceGIzXHg2YiIKLQkJCSJceDk3XHhkN1x4YjZceDUzXHgyYVx4Y2NceGFiXHg0MCIKLQkJCSJceDlkXHg2Mlx4NzlceDU4XHg1Mlx4ZTZceDY1XHhiNyIKLQkJCSJceGFiXHg1NVx4NjdceDljXHg4OVx4N2NceDAzXHhiMCIKLQkJCSJceDczXHg1OVx4YzVceDgxXHhmNVx4MThceDE3XHg1YyIKLQkJCSJceDg5XHhmM1x4NzhceDM1XHg0NFx4NjJceDc4XHg3MiIKLQkJCSJceGQwXHg5Nlx4ZWJceDMxXHhlN1x4ODdceDc3XHgxNCIKLQkJCSJceDk5XHg1MVx4ZjJceDU5XHgyNlx4OWVceGI1XHhhNiIKLQkJCSJceDQ1XHhmZVx4NmVceGJkXHgwN1x4NGNceDk0XHg1YSIKLQkJCSJceGE1XHg3ZFx4ZmNceGYxXHgyYlx4NzdceGUyXHhmZSIKLQkJCSJceDE3XHhkNFx4ODRceGEwXHhhY1x4YjVceGM3XHhkYSIKLQkJCSJceGE5XHgxYVx4YjZceGYzXHg3NFx4MTFceGI0XHg5ZCIKLQkJCSJceGZiXHg3OVx4MmVceDA0XHgyZFx4NTBceDI4XHg4MyIKLQkJCSJceGJmXHhjNlx4NTJceGQzXHgzNFx4ZDZceGU4XHg3YSIKLQkJCSJceGI2XHhlYVx4ZTdceGE4XHg2Y1x4MTVceDFlXHgyYyIKLQkJCSJceDU3XHhiY1x4NDhceDRlXHg1Zlx4NWNceGI2XHg5MiIKLQkJCSJceGQyXHg0OVx4NzdceDgxXHg2ZFx4OTBceDcwXHhhZSIKLQkJCSJceDk4XHhhMVx4MDNceDBkXHg2Ylx4YjlceDc3XHgxNCIKLQkJCSJceGYxXHg0ZVx4MjNceGQzXHhmOFx4NjhceGJkXHhjMiIKLQkJCSJceGZlXHgwNFx4YjdceDVjXHhjNVx4MTdceDYwXHg4ZiIKLQkJCSJceDY1XHg1NFx4YTRceDdhXHg0Mlx4ZGNceDE4XHgwZCIKLQkJCSJceGI1XHhjZlx4MGZceGQzXHhjN1x4OTFceDY2XHgxYiIKLQkJCSJceDQ1XHg0Mlx4MjdceDc1XHg1MFx4ZTVceGVlXHhiOCIKLQkJCSJceDdmXHgzM1x4MmNceGJhXHg0YVx4OTJceDRkXHgyYyIKLQkJCSJceDNjXHhlM1x4MGRceDgwXHgwMVx4YmFceDBkXHgyOSIKLQkJCSJceGQ4XHgzY1x4ZTlceDEzXHgxNlx4NTdceGU2XHhlYSIKLQkJCSJceDk0XHg1Mlx4ZTdceDAwXHg0ZFx4MzBceGIwXHgwZiIKLQkJCSJceDM1XHhiOFx4YjhceGE3XHhiMVx4YjVceDNiXHg0NCIKLQkJCSJceGUxXHgyZlx4ZmRceDg4XHhlZFx4NDNceGU3XHg1MiIKLQkJCSJceDEwXHg5M1x4YjNceDhhXHgzMFx4NmJceDBhXHhmNyIKLQkJCSJceDIzXHhjNlx4NTBceDlkXHg0YVx4YjBceGRlXHhjMyIKLQkJCSJceGRjXHg5Ylx4MmZceDAxXHg1Nlx4MzZceDA5XHhjNSIKLQkJCSJceDJmXHg2Ylx4ZmVceGYxXHhkOFx4MjdceDQ1XHgwMyIKLQkJCSJceDMwXHg1ZVx4NWNceDViXHhiNFx4NjJceDBlXHgxYSIKLQkJCSJceGE5XHgyMVx4MmJceDkyXHg5NFx4ODdceDYyXHg1NyIKLQkJCSJceDRjXHgxMFx4NzRceDFhXHhmMVx4MGFceGM1XHg4NCIKLQkJCSJceDNiXHg5ZVx4NzJceDAyXHhkN1x4Y2NceDA5XHg1NiIKLQkJCSJceGJkXHg1NFx4YzFceGYwXHhjM1x4ZTNceGIzXHhmOCIKLQkJCSJceGQyXHgwZFx4NjFceGNiXHhlZlx4Y2VceDBkXHgwNSIKLQkJCSJceGIwXHg5OFx4ZDlceDhlXHg0Zlx4ZjlceGJjXHg5MyIKLQkJCSJceGE2XHhlYVx4YzhceGNmXHgxMFx4NTNceDRiXHhmMSIKLQkJCSJceGVjXHhmY1x4ODlceGY5XHg2NFx4YjBceDIyXHhiZiIKLQkJCSJceDllXHg1NVx4NDZceDlmXHg3Y1x4NTBceDhlXHg4NCIKLQkJCSJceDU0XHgyMFx4OThceGQ3XHg2Y1x4NDBceDFlXHhkYiIKLQkJCSJceDY5XHgzNFx4NzhceDYxXHgyNFx4MjFceDljXHg4YSIKLQkJCSJceGIzXHg2Mlx4MzFceDhiXHg2ZVx4ZjVceDJhXHgzNSIKLQkJCSJceDg2XHgxM1x4YjFceDZjXHg2NFx4MmVceDQxXHhhNSIKLQkJCSJceDA1XHhmMlx4NDJceGJhXHhkMlx4M2FceDBkXHg4ZSIKLQkJCSJceDhhXHg1OVx4OTRceDNjXHhjZlx4MzZceDI3XHg4MiIKLQkJCSJceGMyXHg0NVx4ZWVceDU4XHhjZFx4ODhceGI0XHhlYyIKLQkJCSJceGRlXHhiMlx4OTZceDBhXHhhZlx4MzhceDZmXHg4OCIKLQkJCSJceGQ3XHhkOFx4ZTFceGRmXHhiOVx4OTZceGE5XHgwYSIKLQkJCSJceGIxXHg5NVx4MjhceDg2XHgyMFx4ZTlceDE3XHg0OSIKLQkJCSJceGEyXHgyOVx4MzhceGFhXHhhNVx4ZTlceDZlXHhmMSIKLQkJCSJceDE5XHgyN1x4YzBceGQ1XHgyYVx4MjJceGMzXHgwYiIKLQkJCSJceGRiXHg3Y1x4NzNceDEwXHhiOVx4YmFceDg5XHg3NiIKLQkJCSJceDU0XHhhZVx4N2RceDcxXHhiM1x4OTNceGY2XHgzMiIKLQkJCSJceGU2XHg0N1x4NDNceDU1XHhhY1x4YTBceDBkXHhjMiIKLQkJCSJceDkzXHgyN1x4NGFceDhlXHgwZVx4NzRceDE1XHhjNyIKLQkJCSJceDBiXHg4NVx4ZDlceDBjXHhhOVx4MzBceDdhXHgzZSIKLQkJCSJceGVhXHg4Zlx4ODVceDZkXHgzYVx4MTJceDRmXHg3MiIKLQkJCSJceDY5XHg1OFx4N2FceDgwXHhiYlx4YjVceDk3XHhmMyIKLQkJCSJceGNmXHg3MFx4ZDJceDVkXHhkZFx4NGRceDIxXHg3OSIKLQkJCSJceDU0XHg0ZFx4ZTRceDA1XHhlOFx4YmRceGMyXHg2MiIKLQkJCSJceGIxXHgzYlx4NzdceDFjXHhkNlx4NWNceGYzXHhhMCIKLQkJCSJceDc5XHgwMFx4YThceDZjXHgyOVx4ZDlceDE4XHgyNCIKLQkJCSJceDM2XHhhMlx4NDZceGMwXHg5Nlx4NjVceDdmXHhiZCIKLQkJCSJceDJhXHhlZFx4MzZceDE2XHgwY1x4YWFceDlmXHhmNCIKLQkJCSJceGM1XHhiNFx4ZTJceDEyXHhlZFx4NjlceGVkXHg0ZiIKLQkJCSJceDI2XHgyY1x4MzlceDUyXHg4OVx4OThceGU3XHgyYyIKLQkJCSJceDk5XHhhNFx4OWVceGEzXHg5Ylx4OTlceDQ2XHg3YSIKLQkJCSJceDNhXHhkY1x4YThceDU5XHhhM1x4ZGJceGMzXHgzYiIKLQkJCSJceDk1XHgwZFx4M2JceDA5XHg2ZVx4ZWVceDgzXHg1ZCIKLQkJCSJceDMyXHg0ZFx4ZWRceGFiXHhmYVx4OThceDE0XHg0ZSIKLQkJCSJceGMzXHgxNVx4NDVceDUzXHg2MVx4YzRceDkzXHhiZCIKLQkJCSJceDkwXHhmNFx4OTlceDk1XHg0Y1x4ZTZceDc2XHg5MiIKLQkJCSJceDI5XHg5MFx4NDZceDMwXHg5Mlx4NjlceDdkXHgxMyIKLQkJCSJceGYyXHhhNVx4Y2RceDY5XHg0OVx4NDRceGIyXHgwZiIKLQkJCSJceDYzXHg0MFx4MzZceDVmXHgwOVx4ZTJceDc4XHhmOCIKLQkJCSJceDkxXHhlM1x4ZTJceGZhXHgxMFx4ZjdceGM4XHgyNCIKLQkJCSJceGE4XHg4OVx4MzJceDVjXHgzN1x4MjVceDFkXHhiMiIKLQkJCSJceGVhXHgxN1x4OGFceDBhXHhhOVx4NjRceGMzXHg3YyIKLQkJCSJceDNjXHg3Y1x4YmRceGM2XHg3OVx4MzRceGU3XHhlMiIKLQkJCSJceDg1XHg4ZVx4YmZceGY4XHhkZVx4OTJceGEwXHhhZSIKLQkJCSJceDIwXHhjNFx4ZjZceGJiXHgxZlx4MzhceDE5XHgwZSIKLQkJCSJceGU4XHg3OVx4OWNceGExXHgyM1x4ZTlceDU0XHg3ZSIKLQkJCSJceDM3XHgyZlx4ZTJceDk0XHgzMlx4YWZceGEwXHgyMyIKLQkJCSJceDQ5XHhlNFx4YzBceGIzXHhhY1x4MDBceDhmXHgzNiIKLQkJCSJceDA1XHhjNFx4YTZceDk2XHhlY1x4MDVceDk4XHg0ZiIKLQkJCSJceDk2XHg2N1x4NTdceDFmXHgyMFx4ODZceDFiXHgyZCIKLQkJCSJceDY5XHhlNFx4MjlceDkzXHg2Nlx4NWZceGFmXHg2YiIKLQkJCSJceDg4XHgyNlx4MmNceDY3XHgwMlx4NGJceDUyXHhkMCIKLQkJCSJceDgzXHg3YVx4NDNceDFmXHhjMFx4NzFceDE1XHgyNSIKLQkJCSJceDc3XHg2NVx4MDhceDYwXHgxMVx4NzZceDRjXHg4ZCIKLQkJCSJceGVkXHhhOVx4MjdceGM2XHhiMVx4MmFceDJjXHg2YSIKLQkJCSJceDRhXHg5N1x4ZjVceGM2XHhiN1x4NzBceDQyXHhkMyIKLQkJCSJceDAzXHhkMVx4MjRceDk1XHhlY1x4NmRceGFiXHgzOCIKLQkJCSJceDcyXHhjZVx4ZTJceDhiXHgzM1x4ZDdceDUxXHgwOSIKLQkJCSJceGRjXHg0NVx4ZTBceDA5XHg5Nlx4MzJceGYzXHhjNCIKLQkJCSJceDg0XHhkY1x4NzNceDczXHgyZFx4MWJceDExXHg5OCIKLQkJCSJceGM1XHgwZVx4NjlceDI4XHg5NFx4YzdceGI1XHg0ZCIKLQkJCSJceGM4XHg4YVx4ZDBceGFhXHgxM1x4MmVceDE4XHg3NCIKLQkJCSJceGRkXHhkMVx4MWVceGYzXHg5MFx4ZThceGZjXHg5YSIKLQkJCSJceDcyXHg0YVx4MGVceGQxXHhlNFx4ZmJceDBkXHg5NiIKLQkJCSJceGQxXHgwY1x4NzlceDg1XHgxYlx4MWNceGZlXHhlMSIKLQkJCSJceDYyXHg4Zlx4N2FceDczXHgzMlx4YWJceGM4XHgxOCIKLQkJCSJceDY5XHhlM1x4MzRceDMwXHhkZlx4MTNceGE2XHhlNSIKLQkJCSJceGU4XHgwZVx4NjdceDdmXHg4MVx4MTFceGI0XHg2MCIKLQkJCSJceGM3XHhiZFx4NzlceDY1XHg1MFx4ZGNceGM0XHg1YiIKLQkJCSJceGRlXHgzOVx4YTRceDAxXHg3Mlx4NjNceGYzXHhkMSIKLQkJCSJceDY0XHg0ZVx4ZGZceGZjXHgyN1x4OTJceDM3XHgwZCIKLQkJCSJceDU3XHhjZFx4MTFceDRmXHgxMVx4MDRceDhlXHgxZCIKLQkJCSJceDE2XHhmN1x4Y2RceDkyXHg5YVx4OTlceDMwXHgxNCIKLQkJCSJceGYxXHg3Y1x4NjdceDFiXHgxZlx4NDFceDBiXHhlOCIKLQkJCSJceDMyXHhlOFx4YjhceGMxXHg0Zlx4NTRceDg2XHg0ZiIKLQkJCSJceGU1XHg3OVx4ODFceDczXHhjZFx4NDNceDU5XHg2OCIKLQkJCSJceDczXHgwMlx4M2JceDc4XHgyMVx4NzJceDQzXHgwMCIKLQkJCSJceDQ5XHgxN1x4ZjdceDAwXHhhZlx4NjhceDI0XHg1MyIKLQkJCSJceDA1XHgwYVx4YzNceDMzXHhlMFx4MzNceDNmXHg2OSIKLQkJCSJceGQyXHg4NFx4MmZceDBiXHhlZFx4ZGVceDA0XHhmNCIKLQkJCSJceDExXHg5NFx4MTNceDY5XHg1MVx4MDlceDI4XHhkZSIKLQkJCSJceDU3XHg1Y1x4ZWZceGRjXHg5YVx4NDlceDFjXHgxNyIKLQkJCSJceDk3XHhmM1x4OTZceGMxXHg3Zlx4NWRceDJlXHg3ZCIKLQkJCSJceDU1XHhiOFx4YjNceDAyXHgwOVx4YjNceDFmXHhlNyIKLQkJCSJceGM5XHg4ZFx4YTNceDM2XHgzNFx4OGFceDc3XHgxMyIKLQkJCSJceDMwXHg2M1x4NGNceGE1XHhjZFx4YzNceGUwXHg3ZSIKLQkJCSJceDA1XHhhMVx4N2JceDBjXHhjYlx4NzRceDQ3XHgzMSIKLQkJCSJceDYyXHgwM1x4NDNceGYxXHg4N1x4YjRceGIwXHg4NSIKLQkJCSJceDg3XHg4ZVx4NGJceDI1XHhjN1x4Y2ZceGFlXHg0YiIKLQkJCSJceDM2XHg0Nlx4M2VceDYyXHhiY1x4NmZceGViXHg1ZiIKLQkJCSJceDczXHhhY1x4ZTZceDA3XHhlZVx4YzFceGExXHhkNiIKLQkJCSJceGM0XHhhYlx4YzlceGQ2XHg4OVx4NDVceGUxXHhmMSIKLQkJCSJceDA0XHg0ZVx4MWFceDZmXHhiYlx4NGZceDNhXHhhMyIKLQkJCSJceGEwXHhjYlx4YTNceDBhXHhkOFx4NzFceDM1XHg1NSIKLQkJCSJceGU0XHhiY1x4MmVceDA0XHgwNlx4ZTZceGZmXHg1YiIKLQkJCSJceDFjXHhjMFx4MTFceDdjXHhjNVx4MTdceGYzXHgzOCIKLQkJCSJceGNmXHhlOVx4YmFceDBmXHgwZVx4ZWZceDAyXHhjMiIKLQkJCSJceDhkXHhjNlx4YmNceDRiXHg2N1x4MjBceDk1XHhkNyIKLQkJCSJceDJjXHg0NVx4NWJceDg2XHg0NFx4OGNceDZmXHgyZSIKLQkJCSJceDdlXHg5Zlx4MWNceDc3XHhiYVx4NmJceDBlXHhhMyIKLQkJCSJceDY5XHhkY1x4YWJceDI0XHg1N1x4NjBceDQ3XHhjMSIKLQkJCSJceGQxXHhhNVx4OWRceDIzXHhlNlx4YjFceDM3XHhmZSIKLQkJCSJceDkzXHhkMlx4NGNceDQ2XHhmOVx4MGNceGM2XHhmYiIKLQkJCSJceGQ2XHg5ZFx4OTlceDY5XHhhYlx4N2FceDA3XHgwYyIKLQkJCSJceDY1XHhlN1x4YzRceDA4XHg5Nlx4ZTJceGE1XHgwMSIKLQkJCSJceDNmXHg0Nlx4MDdceDA1XHg3ZVx4ZThceDlhXHg5MCIKLQkJCSJceDUwXHhkY1x4ZTlceDdhXHhlYVx4YTFceDM5XHg2ZSIKLQkJCSJceDY2XHhlNFx4NmZceGE1XHg1Zlx4YjJceGQ5XHg1YiIKLQkJCSJceGY1XHhkYlx4MmFceDMyXHhmMFx4MTFceDZmXHg3YyIKLQkJCSJceDI2XHgxMFx4OGZceDNkXHg4MFx4ZTlceDU4XHhmNyIKLQkJCSJceGUwXHhhOFx4NTdceGY4XHhkYlx4MGVceGNlXHg5OSIKLQkJCSJceDYzXHgxOVx4M2RceGQ1XHhlY1x4MWJceDc3XHg2OSIKLQkJCSJceDk4XHhmNlx4ZTRceDVmXHg2N1x4MTdceDRiXHgwOSIKLQkJCSJceDg1XHg2Mlx4ODJceDcwXHgxOFx4ZTJceDlhXHg3OCIKLQkJCSJceGUyXHg2Mlx4YmRceGI0XHhmMVx4NDJceGM2XHhmYiIKLQkJCSJceDA4XHhkMFx4YmRceGViXHg0ZVx4MDlceGYyXHhjOCIKLQkJCSJceDFlXHhkY1x4M2RceDMyXHgyMVx4NTZceDljXHg0ZiIKLQkJCSJceDM1XHhmM1x4NjFceDA2XHg3Mlx4ODRceGM0XHgzMiIKLQkJCSJceGYyXHhmMVx4ZmFceDBiXHgyZlx4YzNceGRiXHgwMiIKLQkJCSJceDA0XHhjMlx4ZGVceDU3XHg2NFx4NjBceDhkXHhjZiIKLQkJCSJceGNiXHg4Nlx4NWRceDk3XHgzZVx4YjFceDljXHgwMSIKLQkJCSJceGQ2XHgyOFx4OGZceDk5XHhiY1x4NDZceGViXHgwNSIKLQkJCSJceGFmXHg3ZVx4YjhceDIxXHgyYVx4NTZceDg1XHgxYyIKLQkJCSJceGIzXHg3MVx4YTBceGRlXHhjYVx4OTZceGYxXHg3OCIKLQkJCSJceDQ5XHhhMlx4OTlceDgxXHg4MFx4NWNceDAxXHhmNSIKLQkJCSJceGEwXHhhMlx4NTZceDYzXHhlMlx4NzBceDA3XHhhNSIKLQkJCSJceDk1XHhkNlx4ODVceGViXHgzNlx4OWVceGE5XHg1MSIKLQkJCSJceDY2XHg1Nlx4NWZceDFkXHgwMlx4MTlceGUyXHhmNiIKLQkJCSJceDRmXHg3M1x4MzhceDA5XHg3NVx4NjRceDQ4XHhlMCIKLQkJCSJceGYxXHg3ZVx4MGVceGU4XHg5ZFx4ZjlceGVkXHg5NCIKLQkJCSJceGZlXHgxNlx4MjZceDYyXHg0OVx4NzRceGY0XHhiMCIKLQkJCSJceGQ0XHhhOVx4NmNceGIwXHhmZFx4NTNceGU5XHg4MSIKLQkJCSJceGUwXHg3YVx4YmZceGNmXHhiNVx4YzRceDAxXHg4MSIKLQkJCSJceDc5XHg5OVx4NzdceDAxXHgzYlx4ZTlceGEyXHhiNiIKLQkJCSJceGU2XHg2YVx4OGFceDllXHg1Nlx4MWNceDhkXHgxZSIKLQkJCSJceDhmXHgwNlx4NTVceDJjXHg2Y1x4ZGNceDkyXHg4NyIKLQkJCSJceDY0XHgzYlx4NGJceDE5XHhhMVx4MTNceDY0XHgxZCIKLQkJCSJceDRhXHhlOVx4YzBceDAwXHhiOFx4OTVceGVmXHg2YiIKLQkJCSJceDFhXHg4Nlx4NmRceDM3XHg1Mlx4MDJceGMyXHhlMCIKLQkJCSJceGM4XHhiYlx4NDJceDBjXHgwMlx4MjFceDRhXHhjOSIKLQkJCSJceGVmXHhhMFx4NTRceGU0XHg1ZVx4MTZceDUzXHg4MSIKLQkJCSJceDcwXHg2Mlx4MTBceGFmXHhkZVx4YjhceGI1XHhkMyIKLQkJCSJceGU4XHg1ZVx4NmNceGMzXHg4YVx4M2VceDE4XHgwNyIKLQkJCSJceGYyXHgyZlx4N2RceGE3XHhlMVx4M2RceDRlXHhiNCIKLQkJCSJceDI2XHhhN1x4YTNceDkzXHg4Nlx4YjJceDA0XHgxZSIKLQkJCSJceDUzXHg1ZFx4ODZceGQ2XHhkZVx4NjVceGNhXHhlMyIKLQkJCSJceDRlXHhjMVx4Y2ZceGVmXHhjOFx4NzBceDFiXHg4MyIKLQkJCSJceDEzXHhkZFx4MThceDhiXHgwZFx4NzZceGQyXHhmNiIKLQkJCSJceDM3XHg3YVx4OTNceDdhXHg1MFx4MTFceDlmXHg5NiIKLQkJCSJceDg2XHgyNVx4ZmRceGFjXHhkY1x4YmVceDE4XHg5MyIKLQkJCSJceDE5XHg2Ylx4ZWNceDU4XHg0Zlx4YjlceDc1XHhhNyIKLQkJCSJceGRkXHgzZlx4MmZceGVjXHhjOFx4NWFceDg0XHhhYiIKLQkJCSJceGQ1XHhlNFx4OGFceDA3XHhmNlx4NGRceDIzXHhkNiIKLQkJCSJceDAzXHhmYlx4MDNceDZhXHhlYVx4NjZceGJmXHhkNCIKLQkJCSJceGIxXHgzNFx4ZmJceDc4XHhlOVx4NTVceGRjXHg3YyIKLQkJCSJceDNkXHg5Y1x4ZTVceDlhXHhhY1x4YzNceDdhXHg4MCIKLQkJCSJceDI0XHg2ZFx4YTBceGVmXHgyNVx4N2NceGI3XHhlYSIKLQkJCSJceGNlXHg0ZFx4NWZceDE4XHg2MFx4Y2VceDg3XHgyMiIKLQkJCSJceDY2XHgyZlx4ZDVceGRkXHhkZFx4MDJceDIxXHg3NSIKLQkJCSJceDgyXHhhMFx4MWZceDU4XHhjNlx4ZDNceDYyXHhmNyIKLQkJCSJceDMyXHhkOFx4YWZceDFlXHgwN1x4NzdceDUxXHg5NiIKLQkJCSJceGQ1XHg2Ylx4MWVceDdlXHg4MFx4MDJceGU4XHg2NyIKLQkJCSJceGVhXHgxN1x4MGJceDEwXHhkMlx4M2ZceDI4XHgyNSIKLQkJCSJceDRmXHgwNVx4NzdceDAyXHgxNFx4NjlceGYwXHgyYyIKLQkJCSJceGJlXHgwY1x4ZjFceDc0XHgzMFx4ZDFceGI5XHg5YiIKLQkJCSJceGZjXHg4Y1x4YmJceDA0XHgxNlx4ZDlceGJhXHhjMyIKLQkJCSJceGJjXHg5MVx4OGFceGM0XHgzMFx4YTRceGIwXHgxMiIKLQkJCSJceDRjXHgyMVx4ODdceGNiXHhjOVx4MWRceDE2XHg5NiIKLQkJCSJceDA3XHg2Zlx4MjNceDU0XHhiOVx4NmZceDc5XHhlNSIKLQkJCSJceDY0XHhjMFx4NjRceGRhXHhiMVx4YWVceGRkXHg2MCIKLQkJCSJceDZjXHgxYVx4OWRceGQzXHgwNFx4OGVceDQ1XHhiMCIKLQkJCSJceDkyXHg2MVx4ZDBceDQ4XHg4MVx4ZWRceDVlXHgxZCIKLQkJCSJceGEwXHhjOVx4YTRceDMzXHhjN1x4MTNceDUxXHg1ZCIKLQkJCSJceDdmXHg4M1x4NzNceGI2XHg3MFx4MThceDY1XHgzZSIKLQkJCSJceDJmXHgwZVx4N2FceDEyXHgzOVx4OThceGFiXHhkOCIKLQkJCSJceDdlXHg2Zlx4YTNceGQxXHhiYVx4NTZceGFkXHhiZCIKLQkJCSJceGYwXHgwM1x4MDFceDFjXHg4NVx4MzVceDlmXHhlYiIKLQkJCSJceDE5XHg2M1x4YTFceGFmXHhmZVx4MmRceDM1XHg1MCIKLQkJCSJceDM5XHhhMFx4NjVceDdjXHg5NVx4N2VceDZiXHhmZSIKLQkJCSJceGMxXHhhY1x4MDdceDdjXHg5OFx4NGZceGJlXHg1NyIKLQkJCSJceGE3XHgyMlx4ZWNceGUyXHg3ZVx4MjlceDA5XHg1MyIKLQkJCSJceGU4XHhiZlx4YjRceDdlXHgzZlx4OGZceGZjXHgxNCIKLQkJCSJceGNlXHg1NFx4ZjlceDE4XHg1OFx4YjVceGZmXHg0NCIKLQkJCSJceDA1XHg5ZFx4Y2VceDFiXHhiNlx4ODJceDIzXHhjOCIKLQkJCSJceDJlXHhiY1x4NjlceGJiXHg0YVx4MjlceDBmXHg2NSIKLQkJCSJceDk0XHhmMFx4NjNceDA2XHgwZVx4ZWZceDhjXHhiZCIKLQkJCSJceGZmXHhmZFx4YjBceDIxXHg2ZVx4NTdceDA1XHg3NSIKLQkJCSJceGRhXHhkNVx4YzRceGViXHg4ZFx4MzJceGY3XHg1MCIKLQkJCSJceGQzXHg2Zlx4MjJceGVkXHg1Zlx4OGVceGEyXHg1YiIKLQkJCSJceDgwXHg4Y1x4YzhceDc4XHg0MFx4MjRceDRiXHg4OSIKLQkJCSJceDMwXHhjZVx4N2FceDk3XHgwZVx4YzRceGFmXHhlZiIKLQkJCSJceDliXHhiNFx4Y2RceDY2XHg3NFx4MTRceDA0XHgyYiIKLQkJCSJceGY3XHhjZVx4MGJceDFjXHg2ZVx4YzJceDc4XHg4YyIKLQkJCSJceGNhXHhjNVx4ZDBceDFjXHg5NVx4NGFceDkxXHgyZCIKLQkJCSJceGE3XHgyMFx4ZWJceDg2XHg1Mlx4YjdceDY3XHhkOCIKLQkJCSJceDBjXHhkNlx4MDRceDE0XHhkZVx4NTFceDc0XHg3NSIKLQkJCSJceGU3XHgxMVx4YjRceDg3XHhhM1x4M2RceDJkXHhhZCIKLQkJCSJceDRmXHhlZlx4YTBceDBmXHg3MFx4MDBceDZkXHgxMyIKLQkJCSJceDE5XHgxZFx4NDFceDUwXHhlOVx4ZDhceGYwXHgzMiIKLQkJCSJceDcxXHhiY1x4ZDNceDExXHhmMlx4YWNceGJlXHhhZiIKLQkJCSJceDc1XHg0Nlx4NjVceDRlXHgwN1x4MzRceDM3XHhhMyIKLQkJCSJceDg5XHhmZVx4NzVceGQ0XHg3MFx4NGNceGM2XHgzZiIKLQkJCSJceDY5XHgyNFx4MGVceDM4XHg2N1x4NDNceDhjXHhkZSIKLQkJCSJceDA2XHhiNVx4YjhceGU3XHhjNFx4ZjBceDQxXHg4ZiIKLQkJCSJceGYwXHhiZFx4MmZceDBiXHhiOVx4MThceGY4XHhkZSIKLQkJCSJceDY0XHhiMVx4ZGJceGVlXHgwMFx4NTBceDc3XHhlMSIKLQkJCSJceGM3XHhmZlx4YTZceGZhXHhkZFx4NzBceGY0XHhlMyIKLQkJCSJceDkzXHhlOVx4NzdceDM1XHgzZFx4NGJceDJmXHgyYiIKLQkJCSJceDZkXHg1NVx4ZjBceGZjXHg4OFx4NTRceDRlXHg4OSIKLQkJCSJceGMxXHg4YVx4MjNceDMxXHgyZFx4MTRceDJhXHhiOCIKLQkJCSJceDFiXHgxNVx4ZGRceDllXHg2ZVx4N2JceGRhXHgwNSIKLQkJCSJceDkxXHg3ZFx4NjJceDY0XHg5Nlx4NzJceGRlXHhmYyIKLQkJCSJceGMxXHhlY1x4ZjBceDIzXHg1MVx4NmZceGRiXHg1YiIKLQkJCSJceDFkXHgwOFx4NTdceGNlXHgwOVx4YjhceGY2XHhjZCIKLQkJCSJceDhkXHg5NVx4ZjJceDIwXHhiZlx4MGZceDIwXHg1NyIKLQkJCSJceDk4XHg4MVx4ODRceDRmXHgxNVx4NWNceDc2XHhlNyIKLQkJCSJceDNlXHgwYVx4M2FceDZjXHhjNFx4OGFceGJlXHg3OCIKLQkJCSJceDc0XHg3N1x4YzNceDA5XHg0Ylx4NWRceDQ4XHhlNCIKLQkJCSJceGM4XHhjYlx4MGJceGVhXHgxN1x4MjhceGNmXHhjZiIKLQkJCSJceDMxXHgzMlx4NDRceGE0XHhlNVx4MGVceDFhXHg5OCIKLQkJCSJceDk0XHhjNFx4ZjBceGZmXHhhZVx4M2VceDQ0XHhlOCIKLQkJCSJceGE1XHhiM1x4YjVceDM3XHgyZlx4ZThceGFmXHg2ZiIKLQkJCSJceDI4XHhjMVx4MzdceDVmXHgzMVx4ZDJceGI5XHgzMyIKLQkJCSJceGIxXHhiMlx4NTJceDk0XHg3NVx4MmNceDI5XHg1OSIKLQkJCSJceDA2XHhjMlx4MjVceGU4XHg3MVx4NjVceDRlXHhlZCIKLQkJCSJceGMwXHg5Y1x4YjFceGJiXHgyNVx4ZGNceDZjXHhlNyIKLQkJCSJceDRiXHhhNVx4N2FceDU0XHg3YVx4NjBceGZmXHg3YSIKLQkJCSJceGUwXHg1MFx4NDBceDk2XHgzNVx4NjNceGU0XHgwYiIKLQkJCSJceDc2XHhiZFx4YTRceDY1XHgwMFx4MWJceDU3XHg4OCIKLQkJCSJceGFlXHhlZFx4MzlceDg4XHg0Mlx4MTFceDNjXHhlZCIKLQkJCSJceDg1XHg2N1x4N2RceGI5XHg2OFx4ODJceGU5XHg0MyIKLQkJCSJceDNjXHg0N1x4NTNceGZhXHhlOFx4ZjhceDlmXHgxZiIKLQkJCSJceDlmXHhlZlx4MGZceGY3XHgzMFx4ZDlceDMwXHgwZSIKLQkJCSJceGI5XHg5Zlx4NjlceDE4XHgyZlx4N2VceGY4XHhmOCIKLQkJCSJceGY4XHg4Y1x4MGZceGQ0XHgwMlx4NGRceGVhXHhjZCIKLQkJCSJceDBhXHg5Y1x4NmZceDcxXHg2ZFx4NWFceDRjXHg2MCIKLQkJCSJceGNlXHgyMFx4NTZceDMyXHhjNlx4YzVceDk5XHgxZiIKLQkJCSJceDA5XHhlNlx4NGVceDE4XHgxYVx4MTVceDEzXHhhOCIKLQkJCSJceDdkXHhiMVx4NmJceGMwXHhiMlx4NmRceGY4XHgyNiIKLQkJCSJceDY2XHhmOFx4M2RceDE4XHg3NFx4NzBceDY2XHg3YSIKLQkJCSJceDM0XHgxN1x4ZGVceGJhXHg0N1x4ZjFceDA2XHgxOCIKLQkJCSJceGNiXHhhZlx4ZWJceDRhXHgxZVx4OGZceGE3XHg3NyIKLQkJCSJceGUwXHgzYlx4NzhceDYyXHg2Nlx4YzlceDEwXHhlYSIKLQkJCSJceDFmXHhiN1x4MjlceDBhXHg0NVx4YTFceDFkXHgxZSIKLQkJCSJceDFkXHhlMlx4NjVceDYxXHg1MFx4OWNceGQ3XHgwNSIKLQkJCSJceGYyXHgwYlx4NWJceDEyXHg2MVx4MDJceGM4XHhlNSIKLQkJCSJceDYzXHg0Zlx4MjBceDBjXHgwN1x4MTdceDMzXHg1ZSIKLQkJCSJceDAzXHg5YVx4NTNceDBmXHgyZVx4NTVceGZlXHg1MCIKLQkJCSJceDQzXHg3ZFx4ZDBceGI2XHg3ZVx4NWFceGRhXHhhZSIKLQkJCSJceDU4XHhlZlx4MTVceGE5XHg4M1x4ZDlceDQ2XHhiMSIKLQkJCSJceDQyXHhhYVx4ZjVceDAyXHg2Y1x4Y2VceDkyXHgwNiIKLQkJCSJceDFiXHhkYlx4NjZceDQ1XHg5MVx4NzlceGMyXHgyZCIKLQkJCSJceGU2XHg1M1x4ZDNceDE0XHhmZFx4YmJceDQ0XHg2MyIKLQkJCSJceGM2XHhkN1x4M2RceDdhXHgwY1x4NzVceDc4XHg5ZCIKLQkJCSJceDVjXHhhNlx4MzlceGIzXHhlNVx4NjNceGNhXHg4YiIKLQkJCSJceGZlXHhkM1x4ZWZceDYwXHg4M1x4ZjZceDhlXHg3MCIKLQkJCSJceGI2XHg2N1x4YzdceDc3XHhlZFx4MjNceGVmXHg0YyIKLQkJCSJceGYwXHhlZFx4MmRceDA3XHg1OVx4NmZceGMxXHgwMSIKLQkJCSJceDM0XHgzN1x4MDhceGFiXHhkOVx4MWZceDA5XHhiMSIKLQkJCSJceGNlXHg1Ylx4MTdceGZmXHg3NFx4ZjhceDljXHhkNSIKLQkJCSJceDJjXHg1Nlx4MzlceDc5XHgwZlx4NjlceDQ0XHg3NSIKLQkJCSJceDU4XHgyN1x4MDFceGM0XHhiZlx4YTdceGExXHgxZCIKLQkJCSJceDkwXHgxN1x4NzdceDg2XHg1YVx4M2ZceGQ5XHhkMSIKLQkJCSJceDBlXHhhMFx4MTBceGY4XHhlY1x4MWVceGE1XHg3ZiIKLQkJCSJceDVlXHgzNlx4ZDFceGUzXHgwNFx4MmNceDcwXHhmNyIKLQkJCSJceDhlXHhjMFx4OThceDJmXHg2Y1x4OTRceDJiXHg0MSIKLQkJCSJceGI3XHg2MFx4MDBceGI3XHgyZVx4YjhceDAyXHg4ZCIKLQkJCSJceGI4XHhiMFx4ZDNceDg2XHhiYVx4MWRceGQ3XHg5MCIKLQkJCSJceGQ2XHhiNlx4ZTFceGZjXHhkN1x4ZDhceDI4XHgwNiIKLQkJCSJceDYzXHg5Ylx4Y2VceDYxXHgyNFx4NzlceGMwXHg3MCIKLQkJCSJceDUyXHhkMFx4YjZceGQ0XHgyOFx4OTVceDI0XHg4NyIKLQkJCSJceDAzXHgxZlx4YjdceDlhXHhkYVx4YTNceGZiXHg1MiIKLQkJCSJceDViXHg2OFx4ZTdceDRjXHg4Y1x4MjRceGUxXHg0MiIKLQkJCSJceGY3XHhkNVx4ZmRceGFkXHgwNlx4MzJceDlmXHhiYSIKLQkJCSJceGMxXHhmY1x4ZGRceGM2XHhmY1x4ZmNceGIzXHgzOCIKLQkJCSJceDc0XHg1Nlx4NThceDQwXHgwMlx4MzdceDUyXHgyYyIKLQkJCSJceDU1XHhjY1x4YjNceDllXHg3YVx4ZTlceGQ0XHgzOCIKLQkJCSJceDQxXHg1ZVx4MGNceDM1XHhlMlx4MTFceGQxXHgxMyIKLQkJCSJceGY4XHhiN1x4OGRceDcyXHg2Ylx4MjJceDJhXHhiMCIKLQkJCSJceGRiXHgwOFx4YmFceDM1XHhiOVx4M2ZceGM4XHhkMyIKLQkJCSJceDI0XHg5MFx4ZWNceDU4XHhkMlx4MDlceGM3XHgyZCIKLQkJCSJceGVkXHgzOFx4ODBceDM2XHg3Mlx4NDNceDI3XHg0OSIKLQkJCSJceDRhXHg4MFx4OGFceGEyXHhlOFx4ZDNceGRhXHgzMCIKLQkJCSJceDdkXHhiNlx4ODJceDM3XHg4Nlx4OTJceDg2XHgzZSIKLQkJCSJceDA4XHhiMlx4MjhceDVhXHg1NVx4NDRceDI0XHg3ZCIKLQkJCSJceDQwXHg0OFx4OGFceGI2XHg4OVx4NThceDA4XHhhMCIKLQkJCSJceGQ2XHg2ZFx4M2FceDE3XHhiZlx4ZjZceDU0XHhhMiIKLQkJCSJceGY1XHhkM1x4OGNceDBmXHg3OFx4MTJceDU3XHg4YiIKLQkJCSJceGQ1XHhjMlx4ZmRceDU4XHg1Ylx4N2ZceDM4XHhlMyIKLQkJCSJceGNjXHhiN1x4N2NceDQ4XHhiM1x4MjBceGU4XHg4MSIKLQkJCSJceDE0XHgzMlx4NDVceDA1XHhlMFx4ZGJceDlmXHg3NSIKLQkJCSJceDg1XHhiNFx4NmFceGZjXHg5NVx4ZTNceDU0XHgyMiIKLQkJCSJceDEyXHhlZVx4MzBceGZlXHhkOFx4MzBceGVmXHgzNCIKLQkJCSJceDUwXHhhYlx4NDZceDMwXHg5OFx4MmZceGI3XHhjMCIKLQkJCSJceDE1XHhhMlx4ODNceGI2XHhmMlx4MDZceDIxXHhhMiIKLQkJCSJceGMzXHgyNlx4MzdceDE0XHhkMVx4NGRceGI1XHgxMCIKLQkJCSJceDUyXHg3Nlx4NGRceDZhXHhlZVx4YjVceDJiXHgxNSIKLQkJCSJceGI3XHhmOVx4NTFceGU4XHgyYVx4YWZceGM3XHhmYSIKLQkJCSJceDc3XHhhZlx4YjBceDA1XHg0ZFx4ZDFceDY4XHg4ZSIKLQkJCSJceDc0XHgwNVx4OWZceDlkXHg5M1x4YTVceDNlXHg3ZiIKLQkJCSJceDRlXHg1Zlx4OWRceGNiXHgwOVx4YzdceDgzXHhlMyIKLQkJCSJceDAyXHg5ZFx4MjdceDFmXHhlZlx4ODVceDA1XHg4ZCIKLQkJCSJceGVjXHg1NVx4ODhceDBmXHgwZFx4N2NceDRjXHhlOCIKLQkJCSJceGExXHg3NVx4YTBceGQ4XHgwNlx4NDdceDE0XHhlZiIKLQkJCSJceGFhXHg2MVx4Y2ZceDI2XHgxNVx4YWRceGQ4XHhhMyIKLQkJCSJceGFhXHg3NVx4ZjJceDc4XHg0YVx4NWFceDYxXHhkZiIKLQkJCSJceDhiXHhjN1x4MDRceGJjXHhiMlx4MzJceGQyXHg3ZSIKLQkJCSJceDQyXHhlZVx4YjRceDJmXHg1MVx4ZmZceDdiXHgyZSIKLQkJCSJceGQzXHgwMlx4ZThceGRjXHg1ZFx4MGRceDUwXHhkYyIKLQkJCSJceGFlXHhiN1x4NDZceGY5XHhhOFx4ZTZceGQwXHgxNiIKLQkJCSJceGNjXHhlNlx4MmNceDgxXHhjN1x4YWRceGU5XHhmMCIKLQkJCSJceDA1XHg3Mlx4NmRceDNkXHgwYVx4N2FceGE5XHgwMiIKLQkJCSJceGFjXHg4Mlx4OTNceDZlXHhiNlx4MWNceDI4XHhmYyIKLQkJCSJceDQ0XHgxMlx4ZmJceDczXHg3N1x4ZDRceDEzXHgzOSIKLQkJCSJceDI5XHg4OFx4OGFceGYzXHg1Y1x4YTZceDM2XHhhMCIKLQkJCSJceDJhXHhlZFx4N2VceGIxXHgxZFx4ZDZceDRjXHg2YiIKLQkJCSJceDQxXHgwMVx4MThceDVkXHg1ZFx4MDdceDk3XHhhNiIKLQkJCSJceDRiXHhlZlx4MzFceDE4XHhlYVx4YWNceGIxXHg4NCIKLQkJCSJceDIxXHhlZFx4ZGFceDg2IiwKLQkJLnJsZW4gPSA0MTAwLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19jdHJfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIFJGQyAzNjg2ICovCi0JCS5rZXkJPSAiXHhhZVx4NjhceDUyXHhmOFx4MTJceDEwXHg2N1x4Y2MiCi0JCQkgICJceDRiXHhmN1x4YTVceDc2XHg1NVx4NzdceGYzXHg5ZSIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MzAiLAotCQkua2xlbgk9IDIwLAotCQkuaXYJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaW5wdXQJPSAiXHhlNFx4MDlceDVkXHg0Zlx4YjdceGE3XHhiM1x4NzkiCi0JCQkgICJceDJkXHg2MVx4NzVceGEzXHgyNlx4MTNceDExXHhiOCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiU2luZ2xlIGJsb2NrIG1zZyIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4N2VceDI0XHgwNlx4NzhceDE3XHhmYVx4ZTBceGQ3IgotCQkJICAiXHg0M1x4ZDZceGNlXHgxZlx4MzJceDUzXHg5MVx4NjMiCi0JCQkgICJceDAwXHg2Y1x4YjZceGRiIiwKLQkJLmtsZW4JPSAyMCwKLQkJLml2CT0gIlx4YzBceDU0XHgzYlx4NTlceGRhXHg0OFx4ZDlceDBiIiwKLQkJLmlucHV0CT0gIlx4NTFceDA0XHhhMVx4MDZceDE2XHg4YVx4NzJceGQ5IgotCQkJICAiXHg3OVx4MGRceDQxXHhlZVx4OGVceGRhXHhkM1x4ODgiCi0JCQkgICJceGViXHgyZVx4MWVceGZjXHg0Nlx4ZGFceDU3XHhjOCIKLQkJCSAgIlx4ZmNceGU2XHgzMFx4ZGZceDkxXHg0MVx4YmVceDI4IiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5ybGVuCT0gMzIsCi0JfSwgewotCQkua2V5CT0gIlx4MTZceGFmXHg1Ylx4MTRceDVmXHhjOVx4ZjVceDc5IgotCQkJICAiXHhjMVx4NzVceGY5XHgzZVx4M2JceGZiXHgwZVx4ZWQiCi0JCQkgICJceDg2XHgzZFx4MDZceGNjXHhmZFx4YjdceDg1XHgxNSIKLQkJCSAgIlx4MDBceDAwXHgwMFx4NDgiLAotCQkua2xlbgk9IDI4LAotCQkuaXYJPSAiXHgzNlx4NzNceDNjXHgxNFx4N2RceDZkXHg5M1x4Y2IiLAotCQkuaW5wdXQJPSAiXHg0Ylx4NTVceDM4XHg0Zlx4ZTJceDU5XHhjOVx4YzgiCi0JCQkgICJceDRlXHg3OVx4MzVceGEwXHgwM1x4Y2JceGU5XHgyOCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiU2luZ2xlIGJsb2NrIG1zZyIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4N2NceDVjXHhiMlx4NDBceDFiXHgzZFx4YzNceDNjIgotCQkJICAiXHgxOVx4ZTdceDM0XHgwOFx4MTlceGUwXHhmNlx4OWMiCi0JCQkgICJceDY3XHg4Y1x4M2RceGI4XHhlNlx4ZjZceGE5XHgxYSIKLQkJCSAgIlx4MDBceDk2XHhiMFx4M2IiLAotCQkua2xlbgk9IDI4LAotCQkuaXYJPSAiXHgwMlx4MGNceDZlXHhhZFx4YzJceGNiXHg1MFx4MGQiLAotCQkuaW5wdXQJPSAiXHg0NVx4MzJceDQzXHhmY1x4NjBceDliXHgyM1x4MzIiCi0JCQkgICJceDdlXHhkZlx4YWFceGZhXHg3MVx4MzFceGNkXHg5ZiIKLQkJCSAgIlx4ODRceDkwXHg3MFx4MWNceDVhXHhkNFx4YTdceDljIgotCQkJICAiXHhmY1x4MWZceGUwXHhmZlx4NDJceGY0XHhmYlx4MDAiLAotCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLnJsZW4JPSAzMiwKLQl9LCB7IAotCQkua2V5CT0gIlx4NzdceDZiXHhlZlx4ZjJceDg1XHgxZFx4YjBceDZmIgotCQkJICAiXHg0Y1x4OGFceDA1XHg0Mlx4YzhceDY5XHg2Zlx4NmMiCi0JCQkgICJceDZhXHg4MVx4YWZceDFlXHhlY1x4OTZceGI0XHhkMyIKLQkJCSAgIlx4N2ZceGMxXHhkNlx4ODlceGU2XHhjMVx4YzFceDA0IgotCQkJICAiXHgwMFx4MDBceDAwXHg2MCIsCi0JCS5rbGVuCT0gMzYsCi0JCS5pdgk9ICJceGRiXHg1Nlx4NzJceGM5XHg3YVx4YThceGYwXHhiMiIsCi0JCS5pbnB1dAk9ICJceDE0XHg1YVx4ZDBceDFkXHhiZlx4ODJceDRlXHhjNyIKLQkJCSAgIlx4NTZceDA4XHg2M1x4ZGNceDcxXHhlM1x4ZTBceGMwIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJTaW5nbGUgYmxvY2sgbXNnIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmNlx4ZDZceDZkXHg2Ylx4ZDVceDJkXHg1OVx4YmIiCi0JCQkgICJceDA3XHg5Nlx4MzZceDU4XHg3OVx4ZWZceGY4XHg4NiIKLQkJCSAgIlx4YzZceDZkXHhkNVx4MWFceDViXHg2YVx4OTlceDc0IgotCQkJICAiXHg0Ylx4NTBceDU5XHgwY1x4ODdceGEyXHgzOFx4ODQiCi0JCQkgICJceDAwXHhmYVx4YWNceDI0IiwKLQkJLmtsZW4JPSAzNiwKLQkJLml2CT0gIlx4YzFceDU4XHg1ZVx4ZjFceDVhXHg0M1x4ZDhceDc1IiwKLQkJLmlucHV0CT0gIlx4ZjBceDVlXHgyM1x4MWJceDM4XHg5NFx4NjFceDJjIgotCQkJICAiXHg0OVx4ZWVceDAwXHgwYlx4ODBceDRlXHhiMlx4YTkiCi0JCQkgICJceGI4XHgzMFx4NmJceDUwXHg4Zlx4ODNceDlkXHg2YSIKLQkJCSAgIlx4NTVceDMwXHg4M1x4MWRceDkzXHg0NFx4YWZceDFjIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5ybGVuCT0gMzIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19nY21fZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIE1jR3JldyAmIFZpZWdhIC0gaHR0cDovL2NpdGVzZWVyLmlzdC5wc3UuZWR1LzY1Njk4OS5odG1sICovCi0JCS5rZXkgICAgPSB6ZXJvZWRfc3RyaW5nLAotCQkua2xlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NThceGUyXHhmY1x4Y2VceGZhXHg3ZVx4MzBceDYxIgotCQkJICAiXHgzNlx4N2ZceDFkXHg1N1x4YTRceGU3XHg0NVx4NWEiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dCAgPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0ID0gIlx4MDNceDg4XHhkYVx4Y2VceDYwXHhiNlx4YTNceDkyIgotCQkJICAiXHhmM1x4MjhceGMyXHhiOVx4NzFceGIyXHhmZVx4NzgiCi0JCQkgICJceGFiXHg2ZVx4NDdceGQ0XHgyY1x4ZWNceDEzXHhiZCIKLQkJCSAgIlx4ZjVceDNhXHg2N1x4YjJceDEyXHg1N1x4YmRceGRmIiwKLQkJLnJsZW4JPSAzMiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCi0JCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKLQkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAotCQkuaW5wdXQJPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCi0JCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKLQkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgotCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCi0JCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKLQkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgotCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCi0JCQkgICJceGJhXHg2M1x4N2JceDM5XHgxYVx4YWZceGQyXHg1NSIsCi0JCS5pbGVuCT0gNjQsCi0JCS5yZXN1bHQgPSAiXHg0Mlx4ODNceDFlXHhjMlx4MjFceDc3XHg3NFx4MjQiCi0JCQkgICJceDRiXHg3Mlx4MjFceGI3XHg4NFx4ZDBceGQ0XHg5YyIKLQkJCSAgIlx4ZTNceGFhXHgyMVx4MmZceDJjXHgwMlx4YTRceGUwIgotCQkJICAiXHgzNVx4YzFceDdlXHgyM1x4MjlceGFjXHhhMVx4MmUiCi0JCQkgICJceDIxXHhkNVx4MTRceGIyXHg1NFx4NjZceDkzXHgxYyIKLQkJCSAgIlx4N2RceDhmXHg2YVx4NWFceGFjXHg4NFx4YWFceDA1IgotCQkJICAiXHgxYlx4YTNceDBiXHgzOVx4NmFceDBhXHhhY1x4OTciCi0JCQkgICJceDNkXHg1OFx4ZTBceDkxXHg0N1x4M2ZceDU5XHg4NSIKLQkJCSAgIlx4NGRceDVjXHgyYVx4ZjNceDI3XHhjZFx4NjRceGE2IgotCQkJICAiXHgyY1x4ZjNceDVhXHhiZFx4MmJceGE2XHhmYVx4YjQiLAotCQkucmxlbgk9IDgwLAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgotCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCi0JCS5pbnB1dAk9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKLQkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgotCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCi0JCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKLQkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgotCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCi0JCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKLQkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAotCQkuaWxlbgk9IDYwLAotCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCi0JCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKLQkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAotCQkuYWxlbgk9IDIwLAotCQkucmVzdWx0ID0gIlx4NDJceDgzXHgxZVx4YzJceDIxXHg3N1x4NzRceDI0IgotCQkJICAiXHg0Ylx4NzJceDIxXHhiN1x4ODRceGQwXHhkNFx4OWMiCi0JCQkgICJceGUzXHhhYVx4MjFceDJmXHgyY1x4MDJceGE0XHhlMCIKLQkJCSAgIlx4MzVceGMxXHg3ZVx4MjNceDI5XHhhY1x4YTFceDJlIgotCQkJICAiXHgyMVx4ZDVceDE0XHhiMlx4NTRceDY2XHg5M1x4MWMiCi0JCQkgICJceDdkXHg4Zlx4NmFceDVhXHhhY1x4ODRceGFhXHgwNSIKLQkJCSAgIlx4MWJceGEzXHgwYlx4MzlceDZhXHgwYVx4YWNceDk3IgotCQkJICAiXHgzZFx4NThceGUwXHg5MSIKLQkJCSAgIlx4NWJceGM5XHg0Zlx4YmNceDMyXHgyMVx4YTVceGRiIgotCQkJICAiXHg5NFx4ZmFceGU5XHg1YVx4ZTdceDEyXHgxYVx4NDciLAotCQkucmxlbgk9IDc2LAotCX0sIHsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMjQsCi0JCS5yZXN1bHQJPSAiXHhjZFx4MzNceGIyXHg4YVx4YzdceDczXHhmN1x4NGIiCi0JCQkgICJceGEwXHgwZVx4ZDFceGYzXHgxMlx4NTdceDI0XHgzNSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQgPSAiXHg5OFx4ZTdceDI0XHg3Y1x4MDdceGYwXHhmZVx4NDEiCi0JCQkgICJceDFjXHgyNlx4N2VceDQzXHg4NFx4YjBceGY2XHgwMCIKLQkJCSAgIlx4MmZceGY1XHg4ZFx4ODBceDAzXHgzOVx4MjdceGFiIgotCQkJICAiXHg4ZVx4ZjRceGQ0XHg1OFx4NzVceDE0XHhmMFx4ZmIiLAotCQkucmxlbgk9IDMyLAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgotCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiLAotCQkua2xlbgk9IDI0LAotCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCi0JCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKLQkJLmlucHV0CT0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgotCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCi0JCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKLQkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgotCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCi0JCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKLQkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgotCQkJICAiXHhiYVx4NjNceDdiXHgzOVx4MWFceGFmXHhkMlx4NTUiLAotCQkuaWxlbgk9IDY0LAotCQkucmVzdWx0ID0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgotCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCi0JCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKLQkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgotCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCi0JCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKLQkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgotCQkJICAiXHhjY1x4ZGFceDI3XHgxMFx4YWNceGFkXHhlMlx4NTYiCi0JCQkgICJceDk5XHgyNFx4YTdceGM4XHg1OFx4NzNceDM2XHhiZiIKLQkJCSAgIlx4YjFceDE4XHgwMlx4NGRceGI4XHg2N1x4NGFceDE0IiwKLQkJLnJsZW4JPSA4MCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCi0JCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKLQkJCSAgIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIiwKLQkJLmtsZW4JPSAyNCwKLQkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgotCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCi0JCS5pbnB1dAk9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKLQkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgotCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCi0JCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKLQkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgotCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCi0JCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKLQkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAotCQkuaWxlbgk9IDYwLAotCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCi0JCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKLQkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAotCQkuYWxlbgk9IDIwLAotCQkucmVzdWx0ID0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgotCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCi0JCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKLQkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgotCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCi0JCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKLQkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgotCQkJICAiXHhjY1x4ZGFceDI3XHgxMCIKLQkJCSAgIlx4MjVceDE5XHg0OVx4OGVceDgwXHhmMVx4NDdceDhmIgotCQkJICAiXHgzN1x4YmFceDU1XHhiZFx4NmRceDI3XHg2MVx4OGMiLAotCQkucmxlbgk9IDc2LAotCQkubnAJPSAyLAotCQkudGFwCT0geyAzMiwgMjggfSwKLQkJLmFucAk9IDIsCi0JCS5hdGFwCT0geyA4LCAxMiB9Ci0JfSwgewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDUzXHgwZlx4OGFceGZiXHhjN1x4NDVceDM2XHhiOSIKLQkJCSAgIlx4YTlceDYzXHhiNFx4ZjFceGM0XHhjYlx4NzNceDhiIiwKLQkJLnJsZW4JPSAxNiwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFlYWRfdGVzdHZlYyBhZXNfZ2NtX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogRnJvbSBNY0dyZXcgJiBWaWVnYSAtIGh0dHA6Ly9jaXRlc2Vlci5pc3QucHN1LmVkdS82NTY5ODkuaHRtbCAqLwotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4Y2VceGE3XHg0MFx4M2RceDRkXHg2MFx4NmJceDZlIgotCQkJICAiXHgwN1x4NGVceGM1XHhkM1x4YmFceGYzXHg5ZFx4MTgiCi0JCQkgICJceGQwXHhkMVx4YzhceGE3XHg5OVx4OTlceDZiXHhmMCIKLQkJCSAgIlx4MjZceDViXHg5OFx4YjVceGQ0XHg4YVx4YjlceDE5IiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdCAgPSB6ZXJvZWRfc3RyaW5nLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgotCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCi0JCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKLQkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAotCQkuaW5wdXQJPSAiXHg1Mlx4MmRceGMxXHhmMFx4OTlceDU2XHg3ZFx4MDciCi0JCQkgICJceGY0XHg3Zlx4MzdceGEzXHgyYVx4ODRceDQyXHg3ZCIKLQkJCSAgIlx4NjRceDNhXHg4Y1x4ZGNceGJmXHhlNVx4YzBceGM5IgotCQkJICAiXHg3NVx4OThceGEyXHhiZFx4MjVceDU1XHhkMVx4YWEiCi0JCQkgICJceDhjXHhiMFx4OGVceDQ4XHg1OVx4MGRceGJiXHgzZCIKLQkJCSAgIlx4YTdceGIwXHg4Ylx4MTBceDU2XHg4Mlx4ODhceDM4IgotCQkJICAiXHhjNVx4ZjZceDFlXHg2M1x4OTNceGJhXHg3YVx4MGEiCi0JCQkgICJceGJjXHhjOVx4ZjZceDYyXHg4OVx4ODBceDE1XHhhZCIKLQkJCSAgIlx4YjBceDk0XHhkYVx4YzVceGQ5XHgzNFx4NzFceGJkIgotCQkJICAiXHhlY1x4MWFceDUwXHgyMlx4NzBceGUzXHhjY1x4NmMiLAotCQkuaWxlbgk9IDgwLAotCQkucmVzdWx0ID0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgotCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCi0JCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKLQkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgotCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCi0JCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKLQkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgotCQkJICAiXHhiYVx4NjNceDdiXHgzOVx4MWFceGFmXHhkMlx4NTUiLAotCQkucmxlbgk9IDY0LAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgotCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCi0JCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKLQkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAotCQkuaW5wdXQJPSAiXHg1Mlx4MmRceGMxXHhmMFx4OTlceDU2XHg3ZFx4MDciCi0JCQkgICJceGY0XHg3Zlx4MzdceGEzXHgyYVx4ODRceDQyXHg3ZCIKLQkJCSAgIlx4NjRceDNhXHg4Y1x4ZGNceGJmXHhlNVx4YzBceGM5IgotCQkJICAiXHg3NVx4OThceGEyXHhiZFx4MjVceDU1XHhkMVx4YWEiCi0JCQkgICJceDhjXHhiMFx4OGVceDQ4XHg1OVx4MGRceGJiXHgzZCIKLQkJCSAgIlx4YTdceGIwXHg4Ylx4MTBceDU2XHg4Mlx4ODhceDM4IgotCQkJICAiXHhjNVx4ZjZceDFlXHg2M1x4OTNceGJhXHg3YVx4MGEiCi0JCQkgICJceGJjXHhjOVx4ZjZceDYyIgotCQkJICAiXHg3Nlx4ZmNceDZlXHhjZVx4MGZceDRlXHgxN1x4NjgiCi0JCQkgICJceGNkXHhkZlx4ODhceDUzXHhiYlx4MmRceDU1XHgxYiIsCi0JCS5pbGVuCT0gNzYsCi0JCS5hc3NvYwk9ICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKLQkJCSAgIlx4ZmVceGVkXHhmYVx4Y2VceGRlXHhhZFx4YmVceGVmIgotCQkJICAiXHhhYlx4YWRceGRhXHhkMiIsCi0JCS5hbGVuCT0gMjAsCi0JCS5yZXN1bHQgPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCi0JCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKLQkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgotCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCi0JCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKLQkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgotCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCi0JCQkgICJceGJhXHg2M1x4N2JceDM5IiwKLQkJLnJsZW4JPSA2MCwKLQkJLm5wICAgICA9IDIsCi0JCS50YXAgICAgPSB7IDQ4LCAyOCB9LAotCQkuYW5wCT0gMywKLQkJLmF0YXAJPSB7IDgsIDgsIDQgfQotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgotCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCi0JCS5pbnB1dAk9ICJceDQyXHg4M1x4MWVceGMyXHgyMVx4NzdceDc0XHgyNCIKLQkJCSAgIlx4NGJceDcyXHgyMVx4YjdceDg0XHhkMFx4ZDRceDljIgotCQkJICAiXHhlM1x4YWFceDIxXHgyZlx4MmNceDAyXHhhNFx4ZTAiCi0JCQkgICJceDM1XHhjMVx4N2VceDIzXHgyOVx4YWNceGExXHgyZSIKLQkJCSAgIlx4MjFceGQ1XHgxNFx4YjJceDU0XHg2Nlx4OTNceDFjIgotCQkJICAiXHg3ZFx4OGZceDZhXHg1YVx4YWNceDg0XHhhYVx4MDUiCi0JCQkgICJceDFiXHhhM1x4MGJceDM5XHg2YVx4MGFceGFjXHg5NyIKLQkJCSAgIlx4M2RceDU4XHhlMFx4OTFceDQ3XHgzZlx4NTlceDg1IgotCQkJICAiXHg0ZFx4NWNceDJhXHhmM1x4MjdceGNkXHg2NFx4YTYiCi0JCQkgICJceDJjXHhmM1x4NWFceGJkXHgyYlx4YTZceGZhXHhiNCIsCi0JCS5pbGVuCT0gODAsCi0JCS5yZXN1bHQgPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCi0JCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKLQkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgotCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCi0JCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKLQkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgotCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCi0JCQkgICJceGJhXHg2M1x4N2JceDM5XHgxYVx4YWZceGQyXHg1NSIsCi0JCS5ybGVuCT0gNjQsCi0JfSwgewotCQkua2V5CT0gIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIgotCQkJICAiXHg2ZFx4NmFceDhmXHg5NFx4NjdceDMwXHg4M1x4MDgiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCi0JCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKLQkJLmlucHV0CT0gIlx4NDJceDgzXHgxZVx4YzJceDIxXHg3N1x4NzRceDI0IgotCQkJICAiXHg0Ylx4NzJceDIxXHhiN1x4ODRceGQwXHhkNFx4OWMiCi0JCQkgICJceGUzXHhhYVx4MjFceDJmXHgyY1x4MDJceGE0XHhlMCIKLQkJCSAgIlx4MzVceGMxXHg3ZVx4MjNceDI5XHhhY1x4YTFceDJlIgotCQkJICAiXHgyMVx4ZDVceDE0XHhiMlx4NTRceDY2XHg5M1x4MWMiCi0JCQkgICJceDdkXHg4Zlx4NmFceDVhXHhhY1x4ODRceGFhXHgwNSIKLQkJCSAgIlx4MWJceGEzXHgwYlx4MzlceDZhXHgwYVx4YWNceDk3IgotCQkJICAiXHgzZFx4NThceGUwXHg5MSIKLQkJCSAgIlx4NWJceGM5XHg0Zlx4YmNceDMyXHgyMVx4YTVceGRiIgotCQkJICAiXHg5NFx4ZmFceGU5XHg1YVx4ZTdceDEyXHgxYVx4NDciLAotCQkuaWxlbgk9IDc2LAotCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCi0JCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKLQkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAotCQkuYWxlbgk9IDIwLAotCQkucmVzdWx0ID0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgotCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCi0JCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKLQkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgotCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCi0JCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKLQkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgotCQkJICAiXHhiYVx4NjNceDdiXHgzOSIsCi0JCS5ybGVuCT0gNjAsCi0JfSwgewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4OThceGU3XHgyNFx4N2NceDA3XHhmMFx4ZmVceDQxIgotCQkJICAiXHgxY1x4MjZceDdlXHg0M1x4ODRceGIwXHhmNlx4MDAiCi0JCQkgICJceDJmXHhmNVx4OGRceDgwXHgwM1x4MzlceDI3XHhhYiIKLQkJCSAgIlx4OGVceGY0XHhkNFx4NThceDc1XHgxNFx4ZjBceGZiIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdCAgPSB6ZXJvZWRfc3RyaW5nLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKLQkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgotCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiLAotCQkua2xlbgk9IDI0LAotCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCi0JCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKLQkJLmlucHV0CT0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgotCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCi0JCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKLQkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgotCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCi0JCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKLQkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgotCQkJICAiXHhjY1x4ZGFceDI3XHgxMFx4YWNceGFkXHhlMlx4NTYiCi0JCQkgICJceDk5XHgyNFx4YTdceGM4XHg1OFx4NzNceDM2XHhiZiIKLQkJCSAgIlx4YjFceDE4XHgwMlx4NGRceGI4XHg2N1x4NGFceDE0IiwKLQkJLmlsZW4JPSA4MCwKLQkJLnJlc3VsdCA9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKLQkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgotCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCi0JCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKLQkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgotCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCi0JCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKLQkJCSAgIlx4YmFceDYzXHg3Ylx4MzlceDFhXHhhZlx4ZDJceDU1IiwKLQkJLnJsZW4JPSA2NCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCi0JCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKLQkJCSAgIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIiwKLQkJLmtsZW4JPSAyNCwKLQkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgotCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCi0JCS5pbnB1dAk9ICJceDM5XHg4MFx4Y2FceDBiXHgzY1x4MDBceGU4XHg0MSIKLQkJCSAgIlx4ZWJceDA2XHhmYVx4YzRceDg3XHgyYVx4MjdceDU3IgotCQkJICAiXHg4NVx4OWVceDFjXHhlYVx4YTZceGVmXHhkOVx4ODQiCi0JCQkgICJceDYyXHg4NVx4OTNceGI0XHgwY1x4YTFceGUxXHg5YyIKLQkJCSAgIlx4N2RceDc3XHgzZFx4MDBceGMxXHg0NFx4YzVceDI1IgotCQkJICAiXHhhY1x4NjFceDlkXHgxOFx4YzhceDRhXHgzZlx4NDciCi0JCQkgICJceDE4XHhlMlx4NDRceDhiXHgyZlx4ZTNceDI0XHhkOSIKLQkJCSAgIlx4Y2NceGRhXHgyN1x4MTAiCi0JCQkgICJceDI1XHgxOVx4NDlceDhlXHg4MFx4ZjFceDQ3XHg4ZiIKLQkJCSAgIlx4MzdceGJhXHg1NVx4YmRceDZkXHgyN1x4NjFceDhjIiwKLQkJLmlsZW4JPSA3NiwKLQkJLmFzc29jCT0gIlx4ZmVceGVkXHhmYVx4Y2VceGRlXHhhZFx4YmVceGVmIgotCQkJICAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCi0JCQkgICJceGFiXHhhZFx4ZGFceGQyIiwKLQkJLmFsZW4JPSAyMCwKLQkJLnJlc3VsdCA9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKLQkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgotCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCi0JCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKLQkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgotCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCi0JCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKLQkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAotCQkucmxlbgk9IDYwLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19jY21fZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBGcm9tIFJGQyAzNjEwICovCi0JCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwM1x4MDJceDAxXHgwMCIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKLQkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwKLQkJLmFsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWUiLAotCQkuaWxlbgk9IDIzLAotCQkucmVzdWx0CT0gIlx4NThceDhjXHg5N1x4OWFceDYxXHhjNlx4NjNceGQyIgotCQkJICAiXHhmMFx4NjZceGQwXHhjMlx4YzBceGY5XHg4OVx4ODAiCi0JCQkgICJceDZkXHg1Zlx4NmJceDYxXHhkYVx4YzNceDg0XHgxNyIKLQkJCSAgIlx4ZThceGQxXHgyY1x4ZmRceGY5XHgyNlx4ZTAiLAotCQkucmxlbgk9IDMxLAotCX0sIHsKLQkJLmtleQk9ICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKLQkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4MDFceDAwXHgwMFx4MDBceDA3XHgwNlx4MDVceDA0IgotCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHgwMFx4MDAiLAotCQkuYXNzb2MJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiIiwKLQkJLmFsZW4JPSAxMiwKLQkJLmlucHV0CT0gIlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzIgotCQkJICAiXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWIiCi0JCQkgICJceDFjXHgxZFx4MWVceDFmIiwKLQkJLmlsZW4JPSAyMCwKLQkJLnJlc3VsdAk9ICJceGRjXHhmMVx4ZmJceDdiXHg1ZFx4OWVceDIzXHhmYiIKLQkJCSAgIlx4OWRceDRlXHgxM1x4MTJceDUzXHg2NVx4OGFceGQ4IgotCQkJICAiXHg2ZVx4YmRceGNhXHgzZVx4NTFceGU4XHgzZlx4MDciCi0JCQkgICJceDdkXHg5Y1x4MmRceDkzIiwKLQkJLnJsZW4JPSAyOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwYlx4MGFceDA5XHgwOCIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKLQkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwKLQkJLmFsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgotCQkJICAiXHgyMCIsCi0JCS5pbGVuCT0gMjUsCi0JCS5yZXN1bHQJPSAiXHg4Mlx4NTNceDFhXHg2MFx4Y2NceDI0XHg5NFx4NWEiCi0JCQkgICJceDRiXHg4Mlx4NzlceDE4XHgxYVx4YjVceGM4XHg0ZCIKLQkJCSAgIlx4ZjJceDFjXHhlN1x4ZjlceGI3XHgzZlx4NDJceGUxIgotCQkJICAiXHg5N1x4ZWFceDljXHgwN1x4ZTVceDZiXHg1ZVx4YjEiCi0JCQkgICJceDdlXHg1Zlx4NGUiLAotCQkucmxlbgk9IDM1LAotCX0sIHsKLQkJLmtleQk9ICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKLQkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4MDFceDAwXHgwMFx4MDBceDBjXHgwYlx4MGFceDA5IgotCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHgwMFx4MDAiLAotCQkuYXNzb2MJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiIiwKLQkJLmFsZW4JPSAxMiwKLQkJLmlucHV0CT0gIlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzIgotCQkJICAiXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWIiCi0JCQkgICJceDFjXHgxZFx4MWUiLAotCQkuaWxlbgk9IDE5LAotCQkucmVzdWx0CT0gIlx4MDdceDM0XHgyNVx4OTRceDE1XHg3N1x4ODVceDE1IgotCQkJICAiXHgyYlx4MDdceDQwXHg5OFx4MzNceDBhXHhiYlx4MTQiCi0JCQkgICJceDFiXHg5NFx4N2JceDU2XHg2YVx4YTlceDQwXHg2YiIKLQkJCSAgIlx4NGRceDk5XHg5OVx4ODhceGRkIiwKLQkJLnJsZW4JPSAyOSwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhkN1x4ODJceDhkXHgxM1x4YjJceGIwXHhiZFx4YzMiCi0JCQkgICJceDI1XHhhN1x4NjJceDM2XHhkZlx4OTNceGNjXHg2YiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceDAxXHgwMFx4MzNceDU2XHg4ZVx4ZjdceGIyXHg2MyIKLQkJCSAgIlx4M2NceDk2XHg5Nlx4NzZceDZjXHhmYVx4MDBceDAwIiwKLQkJLmFzc29jCT0gIlx4NjNceDAxXHg4Zlx4NzZceGRjXHg4YVx4MWJceGNiIiwKLQkJLmFsZW4JPSA4LAotCQkuaW5wdXQJPSAiXHg5MFx4MjBceGVhXHg2Zlx4OTFceGJkXHhkOFx4NWEiCi0JCQkgICJceGZhXHgwMFx4MzlceGJhXHg0Ylx4YWZceGY5XHhiZiIKLQkJCSAgIlx4YjdceDljXHg3MFx4MjhceDk0XHg5Y1x4ZDBceGVjIiwKLQkJLmlsZW4JPSAyNCwKLQkJLnJlc3VsdAk9ICJceDRjXHhjYlx4MWVceDdjXHhhOVx4ODFceGJlXHhmYSIKLQkJCSAgIlx4YTBceDcyXHg2Y1x4NTVceGQzXHg3OFx4MDZceDEyIgotCQkJICAiXHg5OFx4YzhceDVjXHg5Mlx4ODFceDRhXHhiY1x4MzMiCi0JCQkgICJceGM1XHgyZVx4ZThceDFkXHg3ZFx4NzdceGMwXHg4YSIsCi0JCS5ybGVuCT0gMzIsCi0JfSwgewotCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgotCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHgwMVx4MDBceGQ1XHg2MFx4OTFceDJkXHgzZlx4NzAiCi0JCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCi0JCS5hc3NvYwk9ICJceGNkXHg5MFx4NDRceGQyXHhiN1x4MWZceGRiXHg4MSIKLQkJCSAgIlx4MjBceGVhXHg2MFx4YzAiLAotCQkuYWxlbgk9IDEyLAotCQkuaW5wdXQJPSAiXHg2NFx4MzVceGFjXHhiYVx4ZmJceDExXHhhOFx4MmUiCi0JCQkgICJceDJmXHgwN1x4MWRceDdjXHhhNFx4YTVceGViXHhkOSIKLQkJCSAgIlx4M2FceDgwXHgzYlx4YThceDdmIiwKLQkJLmlsZW4JPSAyMSwKLQkJLnJlc3VsdAk9ICJceDAwXHg5N1x4NjlceGVjXHhhYlx4ZGZceDQ4XHg2MiIKLQkJCSAgIlx4NTVceDk0XHhjNVx4OTJceDUxXHhlNlx4MDNceDU3IgotCQkJICAiXHgyMlx4NjdceDVlXHgwNFx4YzhceDQ3XHgwOVx4OWUiCi0JCQkgICJceDVhXHhlMFx4NzBceDQ1XHg1MSIsCi0JCS5ybGVuCT0gMjksCi0JfSwgewotCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgotCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHgwMVx4MDBceDQyXHhmZlx4ZjhceGYxXHg5NVx4MWMiCi0JCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCi0JCS5hc3NvYwk9ICJceGQ4XHg1Ylx4YzdceGU2XHg5Zlx4OTRceDRmXHhiOCIsCi0JCS5hbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4OGFceDE5XHhiOVx4NTBceGJjXHhmN1x4MWFceDAxIgotCQkJICAiXHg4ZVx4NWVceDY3XHgwMVx4YzlceDE3XHg4N1x4NjUiCi0JCQkgICJceDk4XHgwOVx4ZDZceDdkXHhiZVx4ZGRceDE4IiwKLQkJLmlsZW4JPSAyMywKLQkJLnJlc3VsdAk9ICJceGJjXHgyMVx4OGRceGFhXHg5NFx4NzRceDI3XHhiNiIKLQkJCSAgIlx4ZGJceDM4XHg2YVx4OTlceGFjXHgxYVx4ZWZceDIzIgotCQkJICAiXHhhZFx4ZTBceGI1XHgyOVx4MzlceGNiXHg2YVx4NjMiCi0JCQkgICJceDdjXHhmOVx4YmVceGMyXHg0MFx4ODhceDk3XHhjNiIKLQkJCSAgIlx4YmEiLAotCQkucmxlbgk9IDMzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFlYWRfdGVzdHZlYyBhZXNfY2NtX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogRnJvbSBSRkMgMzYxMCAqLwotCQkua2V5CT0gIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgotCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHgwMVx4MDBceDAwXHgwMFx4MDNceDAyXHgwMVx4MDAiCi0JCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceDAwXHgwMCIsCi0JCS5hc3NvYwk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIsCi0JCS5hbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4NThceDhjXHg5N1x4OWFceDYxXHhjNlx4NjNceGQyIgotCQkJICAiXHhmMFx4NjZceGQwXHhjMlx4YzBceGY5XHg4OVx4ODAiCi0JCQkgICJceDZkXHg1Zlx4NmJceDYxXHhkYVx4YzNceDg0XHgxNyIKLQkJCSAgIlx4ZThceGQxXHgyY1x4ZmRceGY5XHgyNlx4ZTAiLAotCQkuaWxlbgk9IDMxLAotCQkucmVzdWx0CT0gIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlIiwKLQkJLnJsZW4JPSAyMywKLQl9LCB7Ci0JCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwN1x4MDZceDA1XHgwNCIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKLQkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYiIsCi0JCS5hbGVuCT0gMTIsCi0JCS5pbnB1dAk9ICJceGRjXHhmMVx4ZmJceDdiXHg1ZFx4OWVceDIzXHhmYiIKLQkJCSAgIlx4OWRceDRlXHgxM1x4MTJceDUzXHg2NVx4OGFceGQ4IgotCQkJICAiXHg2ZVx4YmRceGNhXHgzZVx4NTFceGU4XHgzZlx4MDciCi0JCQkgICJceDdkXHg5Y1x4MmRceDkzIiwKLQkJLmlsZW4JPSAyOCwKLQkJLnJlc3VsdAk9ICJceDBjXHgwZFx4MGVceDBmXHgxMFx4MTFceDEyXHgxMyIKLQkJCSAgIlx4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiIgotCQkJICAiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5ybGVuCT0gMjAsCi0JfSwgewotCQkua2V5CT0gIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgotCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHgwMVx4MDBceDAwXHgwMFx4MGJceDBhXHgwOVx4MDgiCi0JCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceDAwXHgwMCIsCi0JCS5hc3NvYwk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIsCi0JCS5hbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4ODJceDUzXHgxYVx4NjBceGNjXHgyNFx4OTRceDVhIgotCQkJICAiXHg0Ylx4ODJceDc5XHgxOFx4MWFceGI1XHhjOFx4NGQiCi0JCQkgICJceGYyXHgxY1x4ZTdceGY5XHhiN1x4M2ZceDQyXHhlMSIKLQkJCSAgIlx4OTdceGVhXHg5Y1x4MDdceGU1XHg2Ylx4NWVceGIxIgotCQkJICAiXHg3ZVx4NWZceDRlIiwKLQkJLmlsZW4JPSAzNSwKLQkJLnJlc3VsdAk9ICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgotCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCi0JCQkgICJceDIwIiwKLQkJLnJsZW4JPSAyNSwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwY1x4MGJceDBhXHgwOSIKLQkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKLQkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYiIsCi0JCS5hbGVuCT0gMTIsCi0JCS5pbnB1dAk9ICJceDA3XHgzNFx4MjVceDk0XHgxNVx4NzdceDg1XHgxNSIKLQkJCSAgIlx4MmJceDA3XHg0MFx4OThceDMzXHgwYVx4YmJceDE0IgotCQkJICAiXHgxYlx4OTRceDdiXHg1Nlx4NmFceGE5XHg0MFx4NmIiCi0JCQkgICJceDRkXHg5OVx4OTlceDg4XHhkZCIsCi0JCS5pbGVuCT0gMjksCi0JCS5yZXN1bHQJPSAiXHgwY1x4MGRceDBlXHgwZlx4MTBceDExXHgxMlx4MTMiCi0JCQkgICJceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYiIKLQkJCSAgIlx4MWNceDFkXHgxZSIsCi0JCS5ybGVuCT0gMTksCi0JfSwgewotCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgotCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAotCQkua2xlbgk9IDE2LAotCQkuaXYJPSAiXHgwMVx4MDBceDMzXHg1Nlx4OGVceGY3XHhiMlx4NjMiCi0JCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCi0JCS5hc3NvYwk9ICJceDYzXHgwMVx4OGZceDc2XHhkY1x4OGFceDFiXHhjYiIsCi0JCS5hbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4NGNceGNiXHgxZVx4N2NceGE5XHg4MVx4YmVceGZhIgotCQkJICAiXHhhMFx4NzJceDZjXHg1NVx4ZDNceDc4XHgwNlx4MTIiCi0JCQkgICJceDk4XHhjOFx4NWNceDkyXHg4MVx4NGFceGJjXHgzMyIKLQkJCSAgIlx4YzVceDJlXHhlOFx4MWRceDdkXHg3N1x4YzBceDhhIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDkwXHgyMFx4ZWFceDZmXHg5MVx4YmRceGQ4XHg1YSIKLQkJCSAgIlx4ZmFceDAwXHgzOVx4YmFceDRiXHhhZlx4ZjlceGJmIgotCQkJICAiXHhiN1x4OWNceDcwXHgyOFx4OTRceDljXHhkMFx4ZWMiLAotCQkucmxlbgk9IDI0LAotCX0sIHsKLQkJLmtleQk9ICJceGQ3XHg4Mlx4OGRceDEzXHhiMlx4YjBceGJkXHhjMyIKLQkJCSAgIlx4MjVceGE3XHg2Mlx4MzZceGRmXHg5M1x4Y2NceDZiIiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4MDFceDAwXHhkNVx4NjBceDkxXHgyZFx4M2ZceDcwIgotCQkJICAiXHgzY1x4OTZceDk2XHg3Nlx4NmNceGZhXHgwMFx4MDAiLAotCQkuYXNzb2MJPSAiXHhjZFx4OTBceDQ0XHhkMlx4YjdceDFmXHhkYlx4ODEiCi0JCQkgICJceDIwXHhlYVx4NjBceGMwIiwKLQkJLmFsZW4JPSAxMiwKLQkJLmlucHV0CT0gIlx4MDBceDk3XHg2OVx4ZWNceGFiXHhkZlx4NDhceDYyIgotCQkJICAiXHg1NVx4OTRceGM1XHg5Mlx4NTFceGU2XHgwM1x4NTciCi0JCQkgICJceDIyXHg2N1x4NWVceDA0XHhjOFx4NDdceDA5XHg5ZSIKLQkJCSAgIlx4NWFceGUwXHg3MFx4NDVceDUxIiwKLQkJLmlsZW4JPSAyOSwKLQkJLnJlc3VsdAk9ICJceDY0XHgzNVx4YWNceGJhXHhmYlx4MTFceGE4XHgyZSIKLQkJCSAgIlx4MmZceDA3XHgxZFx4N2NceGE0XHhhNVx4ZWJceGQ5IgotCQkJICAiXHgzYVx4ODBceDNiXHhhOFx4N2YiLAotCQkucmxlbgk9IDIxLAotCX0sIHsKLQkJLmtleQk9ICJceGQ3XHg4Mlx4OGRceDEzXHhiMlx4YjBceGJkXHhjMyIKLQkJCSAgIlx4MjVceGE3XHg2Mlx4MzZceGRmXHg5M1x4Y2NceDZiIiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2CT0gIlx4MDFceDAwXHg0Mlx4ZmZceGY4XHhmMVx4OTVceDFjIgotCQkJICAiXHgzY1x4OTZceDk2XHg3Nlx4NmNceGZhXHgwMFx4MDAiLAotCQkuYXNzb2MJPSAiXHhkOFx4NWJceGM3XHhlNlx4OWZceDk0XHg0Zlx4YjgiLAotCQkuYWxlbgk9IDgsCi0JCS5pbnB1dAk9ICJceGJjXHgyMVx4OGRceGFhXHg5NFx4NzRceDI3XHhiNiIKLQkJCSAgIlx4ZGJceDM4XHg2YVx4OTlceGFjXHgxYVx4ZWZceDIzIgotCQkJICAiXHhhZFx4ZTBceGI1XHgyOVx4MzlceGNiXHg2YVx4NjMiCi0JCQkgICJceDdjXHhmOVx4YmVceGMyXHg0MFx4ODhceDk3XHhjNiIKLQkJCSAgIlx4YmEiLAotCQkuaWxlbgk9IDMzLAotCQkucmVzdWx0CT0gIlx4OGFceDE5XHhiOVx4NTBceGJjXHhmN1x4MWFceDAxIgotCQkJICAiXHg4ZVx4NWVceDY3XHgwMVx4YzlceDE3XHg4N1x4NjUiCi0JCQkgICJceDk4XHgwOVx4ZDZceDdkXHhiZVx4ZGRceDE4IiwKLQkJLnJsZW4JPSAyMywKLQl9LAotfTsKLQotLyogQ2FzdDUgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDIxNDQgKi8KLSNkZWZpbmUgQ0FTVDVfRU5DX1RFU1RfVkVDVE9SUwkzCi0jZGVmaW5lIENBU1Q1X0RFQ19URVNUX1ZFQ1RPUlMJMwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q1X2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKLQkJCSAgIlx4MjNceDQ1XHg2N1x4ODlceDM0XHg1Nlx4NzhceDlhIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MjNceDhiXHg0Zlx4ZTVceDg0XHg3ZVx4NDRceGIyIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKLQkJCSAgIlx4MjNceDQ1IiwKLQkJLmtsZW4JPSAxMCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4ZWJceDZhXHg3MVx4MWFceDJjXHgwMlx4MjdceDFiIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMiIsCi0JCS5rbGVuCT0gNSwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4N2FceGM4XHgxNlx4ZDFceDZlXHg5Ylx4MzBceDJlIiwKLQkJLnJsZW4JPSA4LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q1X2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKLQkJCSAgIlx4MjNceDQ1XHg2N1x4ODlceDM0XHg1Nlx4NzhceDlhIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MjNceDhiXHg0Zlx4ZTVceDg0XHg3ZVx4NDRceGIyIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKLQkJCSAgIlx4MjNceDQ1IiwKLQkJLmtsZW4JPSAxMCwKLQkJLmlucHV0CT0gIlx4ZWJceDZhXHg3MVx4MWFceDJjXHgwMlx4MjdceDFiIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMiIsCi0JCS5rbGVuCT0gNSwKLQkJLmlucHV0CT0gIlx4N2FceGM4XHgxNlx4ZDFceDZlXHg5Ylx4MzBceDJlIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLnJsZW4JPSA4LAotCX0sCi19OwotCi0vKgotICogQVJDNCB0ZXN0IHZlY3RvcnMgZnJvbSBPcGVuU1NMCi0gKi8KLSNkZWZpbmUgQVJDNF9FTkNfVEVTVF9WRUNUT1JTCTcKLSNkZWZpbmUgQVJDNF9ERUNfVEVTVF9WRUNUT1JTCTcKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhcmM0X2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4NzVceGI3XHg4N1x4ODBceDk5XHhlMFx4YzVceDk2IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4NzRceDk0XHhjMlx4ZTdceDEwXHg0Ylx4MDhceDc5IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4ZGVceDE4XHg4OVx4NDFceGEzXHgzN1x4NWRceDNhIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceGVmXHgwMVx4MjNceDQ1IiwKLQkJLmtsZW4JPSA0LAotCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbgk9IDIwLAotCQkucmVzdWx0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgotCQkJICAiXHhiZFx4NjFceDVhXHgxMVx4NjJceGUxXHhjN1x4YmEiCi0JCQkgICJceDM2XHhiNlx4NzhceDU4IiwKLQkJLnJsZW4JPSAyMCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDEyXHgzNFx4NTZceDc4XHg5QVx4QkNceERFXHhGMCIKLQkJCSAgIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIgotCQkJICAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiCi0JCQkgICJceDEyXHgzNFx4NTZceDc4IiwKLQkJLmlsZW4JPSAyOCwKLQkJLnJlc3VsdAk9ICJceDY2XHhhMFx4OTRceDlmXHg4YVx4ZjdceGQ2XHg4OSIKLQkJCSAgIlx4MWZceDdmXHg4M1x4MmJceGE4XHgzM1x4YzBceDBjIgotCQkJICAiXHg4OVx4MmVceGJlXHgzMFx4MTRceDNjXHhlMlx4ODciCi0JCQkgICJceDQwXHgwMVx4MWVceGNmIiwKLQkJLnJsZW4JPSAyOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhlZlx4MDFceDIzXHg0NSIsCi0JCS5rbGVuCT0gNCwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDAiLAotCQkuaWxlbgk9IDEwLAotCQkucmVzdWx0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgotCQkJICAiXHhiZFx4NjEiLAotCQkucmxlbgk9IDEwLAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDY5XHg3Mlx4MzZceDU5XHgxQlx4NTJceDQyXHhCMSIsCi0JCS5ybGVuCT0gOCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhcmM0X2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4NzVceGI3XHg4N1x4ODBceDk5XHhlMFx4YzVceDk2IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4NzRceDk0XHhjMlx4ZTdceDEwXHg0Ylx4MDhceDc5IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gOCwKLQkJLmlucHV0CT0gIlx4ZGVceDE4XHg4OVx4NDFceGEzXHgzN1x4NWRceDNhIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceGVmXHgwMVx4MjNceDQ1IiwKLQkJLmtsZW4JPSA0LAotCQkuaW5wdXQJPSAiXHhkNlx4YTFceDQxXHhhN1x4ZWNceDNjXHgzOFx4ZGYiCi0JCQkgICJceGJkXHg2MVx4NWFceDExXHg2Mlx4ZTFceGM3XHhiYSIKLQkJCSAgIlx4MzZceGI2XHg3OFx4NTgiLAotCQkuaWxlbgk9IDIwLAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkgICJceDAwXHgwMFx4MDBceDAwIiwKLQkJLnJsZW4JPSAyMCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAotCQkua2xlbgk9IDgsCi0JCS5pbnB1dAk9ICJceDY2XHhhMFx4OTRceDlmXHg4YVx4ZjdceGQ2XHg4OSIKLQkJCSAgIlx4MWZceDdmXHg4M1x4MmJceGE4XHgzM1x4YzBceDBjIgotCQkJICAiXHg4OVx4MmVceGJlXHgzMFx4MTRceDNjXHhlMlx4ODciCi0JCQkgICJceDQwXHgwMVx4MWVceGNmIiwKLQkJLmlsZW4JPSAyOCwKLQkJLnJlc3VsdAk9ICJceDEyXHgzNFx4NTZceDc4XHg5QVx4QkNceERFXHhGMCIKLQkJCSAgIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIgotCQkJICAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiCi0JCQkgICJceDEyXHgzNFx4NTZceDc4IiwKLQkJLnJsZW4JPSAyOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHhlZlx4MDFceDIzXHg0NSIsCi0JCS5rbGVuCT0gNCwKLQkJLmlucHV0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgotCQkJICAiXHhiZFx4NjEiLAotCQkuaWxlbgk9IDEwLAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJICAiXHgwMFx4MDAiLAotCQkucmxlbgk9IDEwLAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDY5XHg3Mlx4MzZceDU5XHgxQlx4NTJceDQyXHhCMSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIsCi0JCS5ybGVuCT0gOCwKLQl9LAotfTsKLQotLyoKLSAqIFRFQSB0ZXN0IHZlY3RvcnMKLSAqLwotI2RlZmluZSBURUFfRU5DX1RFU1RfVkVDVE9SUwk0Ci0jZGVmaW5lIFRFQV9ERUNfVEVTVF9WRUNUT1JTCTQKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0ZWFfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDBhXHgzYVx4ZWFceDQxXHg0MFx4YTlceGJhXHg5NCIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCi0JCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDc3XHg1ZFx4MmFceDZhXHhmNlx4Y2VceDkyXHgwOSIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCi0JCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDZjXHg2Zlx4NmVceDY3XHg2NVx4NzJceDVmXHg3NCIKLQkJCSAgIlx4NjVceDczXHg3NFx4NWZceDc2XHg2NVx4NjNceDc0IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceGJlXHg3YVx4YmJceDgxXHg5NVx4MmRceDFmXHgxZSIKLQkJCSAgIlx4ZGRceDg5XHhhMVx4MjVceDA0XHgyMVx4ZGZceDk1IiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHg0ZFx4NzZceDMyXHgxN1x4MDVceDNmXHg3NVx4MmMiCi0JCQkgICJceDVkXHgwNFx4MTZceDM2XHgxNVx4NzJceDYzXHgyZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKLQkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgotCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCi0JCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQJPSAiXHhlMFx4NGRceDVkXHgzY1x4YjdceDhjXHgzNlx4NDciCi0JCQkgICJceDk0XHgxOFx4OTVceDkxXHhhOVx4ZmNceDQ5XHhmOCIKLQkJCSAgIlx4NDRceGQxXHgyZFx4YzJceDk5XHhiOFx4MDhceDJhIgotCQkJICAiXHgwN1x4ODlceDczXHhjMlx4NDVceDkyXHhjNlx4OTAiLAotCQkucmxlbgk9IDMyLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGVhX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDBhXHgzYVx4ZWFceDQxXHg0MFx4YTlceGJhXHg5NCIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdCA9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCi0JCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDc3XHg1ZFx4MmFceDZhXHhmNlx4Y2VceDkyXHgwOSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCi0JCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGJlXHg3YVx4YmJceDgxXHg5NVx4MmRceDFmXHgxZSIKLQkJCSAgIlx4ZGRceDg5XHhhMVx4MjVceDA0XHgyMVx4ZGZceDk1IiwKLQkJLmlsZW4gICA9IDE2LAotCQkucmVzdWx0CT0gIlx4NmNceDZmXHg2ZVx4NjdceDY1XHg3Mlx4NWZceDc0IgotCQkJICAiXHg2NVx4NzNceDc0XHg1Zlx4NzZceDY1XHg2M1x4NzQiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDRkXHg3Nlx4MzJceDE3XHgwNVx4M2ZceDc1XHgyYyIKLQkJCSAgIlx4NWRceDA0XHgxNlx4MzZceDE1XHg3Mlx4NjNceDJmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4ZTBceDRkXHg1ZFx4M2NceGI3XHg4Y1x4MzZceDQ3IgotCQkJICAiXHg5NFx4MThceDk1XHg5MVx4YTlceGZjXHg0OVx4ZjgiCi0JCQkgICJceDQ0XHhkMVx4MmRceGMyXHg5OVx4YjhceDA4XHgyYSIKLQkJCSAgIlx4MDdceDg5XHg3M1x4YzJceDQ1XHg5Mlx4YzZceDkwIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKLQkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgotCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCi0JCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCi0JCS5ybGVuCT0gMzIsCi0JfQotfTsKLQotLyoKLSAqIFhURUEgdGVzdCB2ZWN0b3JzCi0gKi8KLSNkZWZpbmUgWFRFQV9FTkNfVEVTVF9WRUNUT1JTCTQKLSNkZWZpbmUgWFRFQV9ERUNfVEVTVF9WRUNUT1JTCTQKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB4dGVhX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dCAgPSB6ZXJvZWRfc3RyaW5nLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHhkOFx4ZDRceGU5XHhkZVx4ZDlceDFlXHgxM1x4ZjciLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MmJceDAyXHgwNVx4NjhceDA2XHgxNFx4NDlceDc2IgotCQkJICAiXHg3N1x4NWRceDBlXHgyNlx4NmNceDI4XHg3OFx4NDMiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg3NFx4NjVceDczXHg3NFx4MjBceDZkXHg2NVx4MmUiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQJPSAiXHg5NFx4ZWJceGM4XHg5Nlx4ODRceDZhXHg0OVx4YTgiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MDlceDY1XHg0M1x4MTFceDY2XHg0NFx4MzlceDI1IgotCQkJICAiXHg1MVx4M2FceDE2XHgxMFx4MGFceDA4XHgxMlx4NmUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg2Y1x4NmZceDZlXHg2N1x4NjVceDcyXHg1Zlx4NzQiCi0JCQkgICJceDY1XHg3M1x4NzRceDVmXHg3Nlx4NjVceDYzXHg3NCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHgzZVx4Y2VceGFlXHgyMlx4NjBceDU2XHhhOFx4OWQiCi0JCQkgICJceDc3XHg0ZFx4ZDRceGI0XHg4N1x4MjRceGUzXHg5YSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4NGRceDc2XHgzMlx4MTdceDA1XHgzZlx4NzVceDJjIgotCQkJICAiXHg1ZFx4MDRceDE2XHgzNlx4MTVceDcyXHg2M1x4MmYiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg1NFx4NjVceDYxXHgyMFx4NjlceDczXHgyMFx4NjciCi0JCQkgICJceDZmXHg2Zlx4NjRceDIwXHg2Nlx4NmZceDcyXHgyMCIKLQkJCSAgIlx4NzlceDZmXHg3NVx4MjFceDIxXHgyMVx4MjBceDcyIgotCQkJICAiXHg2NVx4NjFceDZjXHg2Y1x4NzlceDIxXHgyMVx4MjEiLAotCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0gIlx4OTlceDgxXHg5Zlx4NWRceDZmXHg0Ylx4MzFceDNhIgotCQkJICAiXHg4Nlx4ZmZceDZmXHhkMFx4ZTNceDg3XHg3MFx4MDciCi0JCQkgICJceDRkXHhiOFx4Y2ZceGYzXHg5OVx4NTBceGIzXHhkNCIKLQkJCSAgIlx4NzNceGEyXHhmYVx4YzlceDE2XHg1OVx4NWRceDgxIiwKLQkJLnJsZW4JPSAzMiwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHh0ZWFfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4ZDhceGQ0XHhlOVx4ZGVceGQ5XHgxZVx4MTNceGY3IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0ID0gemVyb2VkX3N0cmluZywKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDJiXHgwMlx4MDVceDY4XHgwNlx4MTRceDQ5XHg3NiIKLQkJCSAgIlx4NzdceDVkXHgwZVx4MjZceDZjXHgyOFx4NzhceDQzIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4OTRceGViXHhjOFx4OTZceDg0XHg2YVx4NDlceGE4IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4NzRceDY1XHg3M1x4NzRceDIwXHg2ZFx4NjVceDJlIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDA5XHg2NVx4NDNceDExXHg2Nlx4NDRceDM5XHgyNSIKLQkJCSAgIlx4NTFceDNhXHgxNlx4MTBceDBhXHgwOFx4MTJceDZlIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4M2VceGNlXHhhZVx4MjJceDYwXHg1Nlx4YThceDlkIgotCQkJICAiXHg3N1x4NGRceGQ0XHhiNFx4ODdceDI0XHhlM1x4OWEiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4NmNceDZmXHg2ZVx4NjdceDY1XHg3Mlx4NWZceDc0IgotCQkJICAiXHg2NVx4NzNceDc0XHg1Zlx4NzZceDY1XHg2M1x4NzQiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDRkXHg3Nlx4MzJceDE3XHgwNVx4M2ZceDc1XHgyYyIKLQkJCSAgIlx4NWRceDA0XHgxNlx4MzZceDE1XHg3Mlx4NjNceDJmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4OTlceDgxXHg5Zlx4NWRceDZmXHg0Ylx4MzFceDNhIgotCQkJICAiXHg4Nlx4ZmZceDZmXHhkMFx4ZTNceDg3XHg3MFx4MDciCi0JCQkgICJceDRkXHhiOFx4Y2ZceGYzXHg5OVx4NTBceGIzXHhkNCIKLQkJCSAgIlx4NzNceGEyXHhmYVx4YzlceDE2XHg1OVx4NWRceDgxIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKLQkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgotCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCi0JCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCi0JCS5ybGVuCT0gMzIsCi0JfQotfTsKLQotLyoKLSAqIEtIQVpBRCB0ZXN0IHZlY3RvcnMuCi0gKi8KLSNkZWZpbmUgS0hBWkFEX0VOQ19URVNUX1ZFQ1RPUlMgNQotI2RlZmluZSBLSEFaQURfREVDX1RFU1RfVkVDVE9SUyA1Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMga2hhemFkX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4NDlceGE0XHhjZVx4MzJceGFjXHgxOVx4MGVceDNmIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4XHgzOCIKLQkJCSAgIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4N2VceDgyXHgxMlx4YTFceGQ5XHg1Ylx4ZTRceGY5IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIKLQkJCSJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGFhXHhiZVx4YzFceDk1XHhjNVx4OTRceDFhXHg5YyIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiCi0JCQkiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAotCQkuaWxlbgk9IDgsCi0JCS5yZXN1bHQgPSAiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiLAotCQkucmxlbgk9IDgsCi0JfSwgewotCQkua2V5CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgotCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgotCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdCA9ICJceDA0XHg3NFx4ZjVceDcwXHg1MFx4MTZceGQzXHhiOCIKLQkJCSJceDA0XHg3NFx4ZjVceDcwXHg1MFx4MTZceGQzXHhiOCIsCi0JCS5ybGVuCT0gMTYsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMga2hhemFkX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleQk9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NDlceGE0XHhjZVx4MzJceGFjXHgxOVx4MGVceDNmIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4XHgzOCIKLQkJCSAgIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4N2VceDgyXHgxMlx4YTFceGQ5XHg1Ylx4ZTRceGY5IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIKLQkJCSJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGFhXHhiZVx4YzFceDk1XHhjNVx4OTRceDFhXHg5YyIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiCi0JCQkiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQgID0gIlx4MDRceDc0XHhmNVx4NzBceDUwXHgxNlx4ZDNceGI4IiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZiIKLQkJCSJceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dCAgPSAiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiCi0JCQkiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgotCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotLyoKLSAqIEFudWJpcyB0ZXN0IHZlY3RvcnMuCi0gKi8KLQotI2RlZmluZSBBTlVCSVNfRU5DX1RFU1RfVkVDVE9SUwkJCTUKLSNkZWZpbmUgQU5VQklTX0RFQ19URVNUX1ZFQ1RPUlMJCQk1Ci0jZGVmaW5lIEFOVUJJU19DQkNfRU5DX1RFU1RfVkVDVE9SUwkJMgotI2RlZmluZSBBTlVCSVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJCTIKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhbnViaXNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCi0JCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCi0JCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCi0JCS5rZXkJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCi0JCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIKLQkJCSAgIlx4MDNceDAzXHgwM1x4MDMiLAotCQkua2xlbgk9IDIwLAotCQkuaW5wdXQJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCi0JCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhkYlx4ZjFceDQyXHhmNFx4ZDFceDhhXHhjN1x4NDkiCi0JCQkgICJceDg3XHg0MVx4NmZceDgyXHgwYVx4OThceDY0XHhhZSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0IgotCQkJICAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCi0JCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIKLQkJCSAgIlx4MjRceDI0XHgyNFx4MjQiLAotCQkua2xlbgk9IDI4LAotCQkuaW5wdXQJPSAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCi0JCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhmZFx4MWJceDRhXHhlM1x4YmZceGYwXHhhZFx4M2QiCi0JCQkgICJceDA2XHhkM1x4NjFceDI3XHhmZFx4MTNceDllXHhkZSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgotCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiCi0JCQkgICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKLQkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgotCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MWFceDkxXHhmYlx4MmJceGI3XHg3OFx4NmJceGM0IgotCQkJIlx4MTdceGQ5XHhmZlx4NDBceDNiXHgwZVx4ZTVceGZlIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCi0JCS5rbGVuCT0gNDAsCi0JCS5pbnB1dAk9ICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKLQkJCSAgIlx4OWVceGM2XHg4NFx4MGZceDE3XHgyMVx4MDdceGVlIiwKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhbnViaXNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCi0JCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCi0JCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCi0JCS5rZXkJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCi0JCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIKLQkJCSAgIlx4MDNceDAzXHgwM1x4MDMiLAotCQkua2xlbgk9IDIwLAotCQkuaW5wdXQJPSAiXHhkYlx4ZjFceDQyXHhmNFx4ZDFceDhhXHhjN1x4NDkiCi0JCQkgICJceDg3XHg0MVx4NmZceDgyXHgwYVx4OThceDY0XHhhZSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCi0JCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0IgotCQkJICAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCi0JCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIKLQkJCSAgIlx4MjRceDI0XHgyNFx4MjQiLAotCQkua2xlbgk9IDI4LAotCQkuaW5wdXQJPSAiXHhmZFx4MWJceDRhXHhlM1x4YmZceGYwXHhhZFx4M2QiCi0JCQkgICJceDA2XHhkM1x4NjFceDI3XHhmZFx4MTNceDllXHhkZSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCi0JCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgotCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiCi0JCQkgICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKLQkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKLQkJLmtsZW4JPSAzMiwKLQkJLmlucHV0CT0gIlx4MWFceDkxXHhmYlx4MmJceGI3XHg3OFx4NmJceGM0IgotCQkJIlx4MTdceGQ5XHhmZlx4NDBceDNiXHgwZVx4ZTVceGZlIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKLQkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCi0JCS5pbnB1dCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKLQkJCSAiXHg5ZVx4YzZceDg0XHgwZlx4MTdceDIxXHgwN1x4ZWUiLAotCQkua2xlbgk9IDQwLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiLAotCQkucmxlbgk9IDE2LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFudWJpc19jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCi0JCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIKLQkJCSAgIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAotCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0gIlx4NmRceGM1XHhkYVx4YTJceDI2XHg3ZFx4NjJceDZmIgotCQkJICAiXHgwOFx4YjdceDUyXHg4ZVx4NmVceDZlXHg4Nlx4OTAiCi0JCQkgICJceDg2XHhkOFx4YjVceDZmXHg5OFx4NWVceDhhXHg2NiIKLQkJCSAgIlx4NGZceDFmXHg3OFx4YTFceGJiXHgzN1x4ZjFceGJlIiwKLQkJLnJsZW4JPSAzMiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCi0JCS5rbGVuCT0gNDAsCi0JCS5pbnB1dAk9ICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQgPSAiXHhhNVx4MmNceDg1XHg2Zlx4OWNceGJhXHhhMFx4OTciCi0JCQkgICJceDllXHhjNlx4ODRceDBmXHgxN1x4MjFceDA3XHhlZSIKLQkJCSAgIlx4YTJceGJjXHgwNlx4OThceGM2XHg0Ylx4ZGFceDc1IgotCQkJICAiXHgyZVx4YWFceGJlXHg1OFx4Y2VceDAxXHg1Ylx4YzciLAotCQkucmxlbgk9IDMyLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFudWJpc19jYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCi0JCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIKLQkJCSAgIlx4ODZceGQ4XHhiNVx4NmZceDk4XHg1ZVx4OGFceDY2IgotCQkJICAiXHg0Zlx4MWZceDc4XHhhMVx4YmJceDM3XHhmMVx4YmUiLAotCQkuaWxlbgk9IDMyLAotCQkucmVzdWx0CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgotCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCi0JCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIKLQkJCSAgIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIiwKLQkJLnJsZW4JPSAzMiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCi0JCS5rbGVuCT0gNDAsCi0JCS5pbnB1dCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKLQkJCSAgIlx4OWVceGM2XHg4NFx4MGZceDE3XHgyMVx4MDdceGVlIgotCQkJICAiXHhhMlx4YmNceDA2XHg5OFx4YzZceDRiXHhkYVx4NzUiCi0JCQkgICJceDJlXHhhYVx4YmVceDU4XHhjZVx4MDFceDViXHhjNyIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCi0JCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKLQkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgotCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiLAotCQkucmxlbgk9IDMyLAotCX0sCi19OwotCi0vKiAKLSAqIFhFVEEgdGVzdCB2ZWN0b3JzIAotICovCi0jZGVmaW5lIFhFVEFfRU5DX1RFU1RfVkVDVE9SUwk0Ci0jZGVmaW5lIFhFVEFfREVDX1RFU1RfVkVDVE9SUwk0Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgeGV0YV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5rZXkgICAgPSB6ZXJvZWRfc3RyaW5nLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQgID0gemVyb2VkX3N0cmluZywKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4YWFceDIyXHg5Nlx4ZTVceDZjXHg2MVx4ZjNceDQ1IiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDJiXHgwMlx4MDVceDY4XHgwNlx4MTRceDQ5XHg3NiIKLQkJCSAgIlx4NzdceDVkXHgwZVx4MjZceDZjXHgyOFx4NzhceDQzIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NzRceDY1XHg3M1x4NzRceDIwXHg2ZFx4NjVceDJlIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4ODJceDNlXHhlYlx4MzVceGRjXHhkZFx4ZDlceGMzIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDA5XHg2NVx4NDNceDExXHg2Nlx4NDRceDM5XHgyNSIKLQkJCSAgIlx4NTFceDNhXHgxNlx4MTBceDBhXHgwOFx4MTJceDZlIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NmNceDZmXHg2ZVx4NjdceDY1XHg3Mlx4NWZceDc0IgotCQkJICAiXHg2NVx4NzNceDc0XHg1Zlx4NzZceDY1XHg2M1x4NzQiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4ZTJceDA0XHhkYlx4ZjJceDg5XHg4NVx4OWVceGVhIgotCQkJICAiXHg2MVx4MzVceGFhXHhlZFx4YjVceGNiXHg3MVx4MmMiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDRkXHg3Nlx4MzJceDE3XHgwNVx4M2ZceDc1XHgyYyIKLQkJCSAgIlx4NWRceDA0XHgxNlx4MzZceDE1XHg3Mlx4NjNceDJmIiwKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0CT0gIlx4NTRceDY1XHg2MVx4MjBceDY5XHg3M1x4MjBceDY3IgotCQkJICAiXHg2Zlx4NmZceDY0XHgyMFx4NjZceDZmXHg3Mlx4MjAiCi0JCQkgICJceDc5XHg2Zlx4NzVceDIxXHgyMVx4MjFceDIwXHg3MiIKLQkJCSAgIlx4NjVceDYxXHg2Y1x4NmNceDc5XHgyMVx4MjFceDIxIiwKLQkJLmlsZW4JPSAzMiwKLQkJLnJlc3VsdAk9ICJceDBiXHgwM1x4Y2RceDhhXHhiZVx4OTVceGZkXHhiMSIKLQkJCSAgIlx4YzFceDQ0XHg5MVx4MGJceGE1XHhjOVx4MWJceGI0IgotCQkJICAiXHhhOVx4ZGFceDFlXHg5ZVx4YjFceDNlXHgyYVx4OGYiCi0JCQkgICJceGVhXHhhNVx4NmFceDg1XHhkMVx4ZjRceGE4XHhhNSIsCi0JCS5ybGVuCT0gMzIsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB4ZXRhX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGFhXHgyMlx4OTZceGU1XHg2Y1x4NjFceGYzXHg0NSIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdCA9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCi0JCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDgyXHgzZVx4ZWJceDM1XHhkY1x4ZGRceGQ5XHhjMyIsCi0JCS5pbGVuCT0gOCwKLQkJLnJlc3VsdAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCi0JCS5ybGVuCT0gOCwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCi0JCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGUyXHgwNFx4ZGJceGYyXHg4OVx4ODVceDllXHhlYSIKLQkJCSAgIlx4NjFceDM1XHhhYVx4ZWRceGI1XHhjYlx4NzFceDJjIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDZjXHg2Zlx4NmVceDY3XHg2NVx4NzJceDVmXHg3NCIKLQkJCSAgIlx4NjVceDczXHg3NFx4NWZceDc2XHg2NVx4NjNceDc0IiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHg0ZFx4NzZceDMyXHgxN1x4MDVceDNmXHg3NVx4MmMiCi0JCQkgICJceDVkXHgwNFx4MTZceDM2XHgxNVx4NzJceDYzXHgyZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDBiXHgwM1x4Y2RceDhhXHhiZVx4OTVceGZkXHhiMSIKLQkJCSAgIlx4YzFceDQ0XHg5MVx4MGJceGE1XHhjOVx4MWJceGI0IgotCQkJICAiXHhhOVx4ZGFceDFlXHg5ZVx4YjFceDNlXHgyYVx4OGYiCi0JCQkgICJceGVhXHhhNVx4NmFceDg1XHhkMVx4ZjRceGE4XHhhNSIsCi0JCS5pbGVuCT0gMzIsCi0JCS5yZXN1bHQJPSAiXHg1NFx4NjVceDYxXHgyMFx4NjlceDczXHgyMFx4NjciCi0JCQkgICJceDZmXHg2Zlx4NjRceDIwXHg2Nlx4NmZceDcyXHgyMCIKLQkJCSAgIlx4NzlceDZmXHg3NVx4MjFceDIxXHgyMVx4MjBceDcyIgotCQkJICAiXHg2NVx4NjFceDZjXHg2Y1x4NzlceDIxXHgyMVx4MjEiLAotCQkucmxlbgk9IDMyLAotCX0KLX07Ci0KLS8qIAotICogRkNyeXB0IHRlc3QgdmVjdG9ycyAKLSAqLwotI2RlZmluZSBGQ1JZUFRfRU5DX1RFU1RfVkVDVE9SUwlBUlJBWV9TSVpFKGZjcnlwdF9wY2JjX2VuY190dl90ZW1wbGF0ZSkKLSNkZWZpbmUgRkNSWVBUX0RFQ19URVNUX1ZFQ1RPUlMJQVJSQVlfU0laRShmY3J5cHRfcGNiY19kZWNfdHZfdGVtcGxhdGUpCi0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBodHRwOi8vd3d3Lm9wZW5hZnMub3JnL3BpcGVybWFpbC9vcGVuYWZzLWRldmVsLzIwMDAtRGVjZW1iZXIvMDA1MzIwLmh0bWwgKi8KLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MEVceDA5XHgwMFx4QzdceDNFXHhGN1x4RURceDQxIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDExXHg0NFx4NzdceEFBXHhERFx4MDBceDMzXHg2NiIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4RDhceEVEXHg3OFx4NzRceDc3XHhFQ1x4MDZceDgwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsgLyogRnJvbSBBcmxhICovCi0JCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAotCQkua2xlbgk9IDgsCi0JCS5pdgk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5pbnB1dAk9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9ncy5cMFwwIiwKLQkJLmlsZW4JPSA0OCwKLQkJLnJlc3VsdAk9ICJceDAwXHhmMFx4MGVceDExXHg3NVx4ZTZceDIzXHg4MiIKLQkJCSAgIlx4ZWVceGFjXHg5OFx4NjJceDQ0XHg1MVx4ZTRceDg0IgotCQkJICAiXHhjM1x4NTlceGQ4XHhhYVx4NjRceDYwXHhhZVx4ZjciCi0JCQkgICJceGQyXHhkOVx4MTNceDc5XHg3Mlx4YTNceDQ1XHgwMyIKLQkJCSAgIlx4MjNceGI1XHg2Mlx4ZDdceDBjXHhmNVx4MjdceGQxIgotCQkJICAiXHhmOFx4OTFceDNjXHhhY1x4NDRceDIyXHg5Mlx4ZWYiLAotCQkucmxlbgk9IDQ4LAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAotCQkuaWxlbgk9IDQ4LAotCQkucmVzdWx0CT0gIlx4Y2FceDkwXHhmNVx4OWRceGNiXHhkNFx4ZDJceDNjIgotCQkJICAiXHgwMVx4ODhceDdmXHgzZVx4MzFceDZlXHg2Mlx4OWQiCi0JCQkgICJceGQ4XHhlMFx4NTdceGEzXHgwNlx4M2FceDQyXHg1OCIKLQkJCSAgIlx4MmFceDI4XHhmZVx4NzJceDUyXHgyZlx4ZGRceGUwIgotCQkJICAiXHgxOVx4ODlceDA5XHgxY1x4MmFceDhlXHg4Y1x4OTQiCi0JCQkgICJceGZjXHhjN1x4NjhceGU0XHg4OFx4YWFceGRlXHgwZiIsCi0JCS5ybGVuCT0gNDgsCi0JfSwgeyAvKiBzcGxpdC1wYWdlIHZlcnNpb24gKi8KLQkJLmtleQk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAotCQkuaWxlbgk9IDQ4LAotCQkucmVzdWx0CT0gIlx4Y2FceDkwXHhmNVx4OWRceGNiXHhkNFx4ZDJceDNjIgotCQkJICAiXHgwMVx4ODhceDdmXHgzZVx4MzFceDZlXHg2Mlx4OWQiCi0JCQkgICJceGQ4XHhlMFx4NTdceGEzXHgwNlx4M2FceDQyXHg1OCIKLQkJCSAgIlx4MmFceDI4XHhmZVx4NzJceDUyXHgyZlx4ZGRceGUwIgotCQkJICAiXHgxOVx4ODlceDA5XHgxY1x4MmFceDhlXHg4Y1x4OTQiCi0JCQkgICJceGZjXHhjN1x4NjhceGU0XHg4OFx4YWFceGRlXHgwZiIsCi0JCS5ybGVuCT0gNDgsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDIwLCAyOCB9LAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZmNyeXB0X3BjYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JeyAvKiBodHRwOi8vd3d3Lm9wZW5hZnMub3JnL3BpcGVybWFpbC9vcGVuYWZzLWRldmVsLzIwMDAtRGVjZW1iZXIvMDA1MzIwLmh0bWwgKi8KLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlx4MEVceDA5XHgwMFx4QzdceDNFXHhGN1x4RURceDQxIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsKLQkJLmtleQk9ICJceDExXHg0NFx4NzdceEFBXHhERFx4MDBceDMzXHg2NiIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlx4RDhceEVEXHg3OFx4NzRceDc3XHhFQ1x4MDZceDgwIiwKLQkJLmlsZW4JPSA4LAotCQkucmVzdWx0CT0gIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIiwKLQkJLnJsZW4JPSA4LAotCX0sIHsgLyogRnJvbSBBcmxhICovCi0JCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAotCQkua2xlbgk9IDgsCi0JCS5pdgk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5pbnB1dAk9ICJceDAwXHhmMFx4MGVceDExXHg3NVx4ZTZceDIzXHg4MiIKLQkJCSAgIlx4ZWVceGFjXHg5OFx4NjJceDQ0XHg1MVx4ZTRceDg0IgotCQkJICAiXHhjM1x4NTlceGQ4XHhhYVx4NjRceDYwXHhhZVx4ZjciCi0JCQkgICJceGQyXHhkOVx4MTNceDc5XHg3Mlx4YTNceDQ1XHgwMyIKLQkJCSAgIlx4MjNceGI1XHg2Mlx4ZDdceDBjXHhmNVx4MjdceGQxIgotCQkJICAiXHhmOFx4OTFceDNjXHhhY1x4NDRceDIyXHg5Mlx4ZWYiLAotCQkuaWxlbgk9IDQ4LAotCQkucmVzdWx0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAotCQkucmxlbgk9IDQ4LAotCX0sIHsKLQkJLmtleQk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmlucHV0CT0gIlx4Y2FceDkwXHhmNVx4OWRceGNiXHhkNFx4ZDJceDNjIgotCQkJICAiXHgwMVx4ODhceDdmXHgzZVx4MzFceDZlXHg2Mlx4OWQiCi0JCQkgICJceGQ4XHhlMFx4NTdceGEzXHgwNlx4M2FceDQyXHg1OCIKLQkJCSAgIlx4MmFceDI4XHhmZVx4NzJceDUyXHgyZlx4ZGRceGUwIgotCQkJICAiXHgxOVx4ODlceDA5XHgxY1x4MmFceDhlXHg4Y1x4OTQiCi0JCQkgICJceGZjXHhjN1x4NjhceGU0XHg4OFx4YWFceGRlXHgwZiIsCi0JCS5pbGVuCT0gNDgsCi0JCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCi0JCS5ybGVuCT0gNDgsCi0JfSwgeyAvKiBzcGxpdC1wYWdlIHZlcnNpb24gKi8KLQkJLmtleQk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gOCwKLQkJLml2CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKLQkJLmlucHV0CT0gIlx4Y2FceDkwXHhmNVx4OWRceGNiXHhkNFx4ZDJceDNjIgotCQkJICAiXHgwMVx4ODhceDdmXHgzZVx4MzFceDZlXHg2Mlx4OWQiCi0JCQkgICJceGQ4XHhlMFx4NTdceGEzXHgwNlx4M2FceDQyXHg1OCIKLQkJCSAgIlx4MmFceDI4XHhmZVx4NzJceDUyXHgyZlx4ZGRceGUwIgotCQkJICAiXHgxOVx4ODlceDA5XHgxY1x4MmFceDhlXHg4Y1x4OTQiCi0JCQkgICJceGZjXHhjN1x4NjhceGU0XHg4OFx4YWFceGRlXHgwZiIsCi0JCS5pbGVuCT0gNDgsCi0JCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCi0JCS5ybGVuCT0gNDgsCi0JCS5ucAk9IDIsCi0JCS50YXAJPSB7IDIwLCAyOCB9LAotCX0KLX07Ci0KLS8qCi0gKiBDQU1FTExJQSB0ZXN0IHZlY3RvcnMuCi0gKi8KLSNkZWZpbmUgQ0FNRUxMSUFfRU5DX1RFU1RfVkVDVE9SUyAzCi0jZGVmaW5lIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMgMwotI2RlZmluZSBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyAyCi0jZGVmaW5lIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTIDIKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDY3XHg2N1x4MzFceDM4XHg1NFx4OTZceDY5XHg3MyIKLQkJCSAgIlx4MDhceDU3XHgwNlx4NTZceDQ4XHhlYVx4YmVceDQzIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIKLQkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgotCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4YjRceDk5XHgzNFx4MDFceGIzXHhlOVx4OTZceGY4IgotCQkJICAiXHg0ZVx4ZTVceGNlXHhlN1x4ZDdceDliXHgwOVx4YjkiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgotCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDlhXHhjY1x4MjNceDdkXHhmZlx4MTZceGQ3XHg2YyIKLQkJCSAgIlx4MjBceGVmXHg3Y1x4OTFceDllXHgzYVx4NzVceDA5IiwKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDY3XHg2N1x4MzFceDM4XHg1NFx4OTZceDY5XHg3MyIKLQkJCSAgIlx4MDhceDU3XHgwNlx4NTZceDQ4XHhlYVx4YmVceDQzIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCi0JCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIKLQkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IiwKLQkJLmtsZW4JPSAyNCwKLQkJLmlucHV0CT0gIlx4YjRceDk5XHgzNFx4MDFceGIzXHhlOVx4OTZceGY4IgotCQkJICAiXHg0ZVx4ZTVceGNlXHhlN1x4ZDdceDliXHgwOVx4YjkiLAotCQkuaWxlbgk9IDE2LAotCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgotCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAotCQkucmxlbgk9IDE2LAotCX0sIHsKLQkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgotCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCi0JCS5rbGVuCT0gMzIsCi0JCS5pbnB1dAk9ICJceDlhXHhjY1x4MjNceDdkXHhmZlx4MTZceGQ3XHg2YyIKLQkJCSAgIlx4MjBceGVmXHg3Y1x4OTFceDllXHgzYVx4NzVceDA5IiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKLQkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKLQkJLnJsZW4JPSAxNiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gIlx4MDZceGE5XHgyMVx4NDBceDM2XHhiOFx4YTFceDViIgotCQkJICAiXHg1MVx4MmVceDAzXHhkNVx4MzRceDEyXHgwMFx4MDYiLAotCQkua2xlbiAgID0gMTYsCi0JCS5pdgk9ICJceDNkXHhhZlx4YmFceDQyXHg5ZFx4OWVceGI0XHgzMCIKLQkJCSAgIlx4YjRceDIyXHhkYVx4ODBceDJjXHg5Zlx4YWNceDQxIiwKLQkJLmlucHV0CT0gIlNpbmdsZSBibG9jayBtc2ciLAotCQkuaWxlbiAgID0gMTYsCi0JCS5yZXN1bHQgPSAiXHhlYVx4MzJceDEyXHg3Nlx4M2JceDUwXHgxMFx4ZTciCi0JCQkgICJceDE4XHhmNlx4ZmRceDVkXHhmNlx4OGZceDEzXHg1MSIsCi0JCS5ybGVuICAgPSAxNiwKLQl9LCB7Ci0JCS5rZXkgICAgPSAiXHhjMlx4ODZceDY5XHg2ZFx4ODhceDdjXHg5YVx4YTAiCi0JCQkgICJceDYxXHgxYlx4YmJceDNlXHgyMFx4MjVceGE0XHg1YSIsCi0JCS5rbGVuICAgPSAxNiwKLQkJLml2ICAgICA9ICJceDU2XHgyZVx4MTdceDk5XHg2ZFx4MDlceDNkXHgyOCIKLQkJCSAgIlx4ZGRceGIzXHhiYVx4NjlceDVhXHgyZVx4NmZceDU4IiwKLQkJLmlucHV0ICA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgotCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5pbGVuICAgPSAzMiwKLQkJLnJlc3VsdCA9ICJceGE1XHhkZlx4NmVceDUwXHhkYVx4NzBceDZjXHgwMSIKLQkJCSAgIlx4NGFceGFiXHhmM1x4ZjJceGQ2XHhmY1x4NmNceGZkIgotCQkJICAiXHgxOVx4YjRceDNlXHg1N1x4MWNceDAyXHg1ZVx4YTAiCi0JCQkgICJceDE1XHg3OFx4ZTBceDVlXHhmMlx4Y2JceDg3XHgxNiIsCi0JCS5ybGVuICAgPSAzMiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9jYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gIlx4MDZceGE5XHgyMVx4NDBceDM2XHhiOFx4YTFceDViIgotCQkJICAiXHg1MVx4MmVceDAzXHhkNVx4MzRceDEyXHgwMFx4MDYiLAotCQkua2xlbiAgID0gMTYsCi0JCS5pdgk9ICJceDNkXHhhZlx4YmFceDQyXHg5ZFx4OWVceGI0XHgzMCIKLQkJCSAgIlx4YjRceDIyXHhkYVx4ODBceDJjXHg5Zlx4YWNceDQxIiwKLQkJLmlucHV0CT0gIlx4ZWFceDMyXHgxMlx4NzZceDNiXHg1MFx4MTBceGU3IgotCQkJICAiXHgxOFx4ZjZceGZkXHg1ZFx4ZjZceDhmXHgxM1x4NTEiLAotCQkuaWxlbiAgID0gMTYsCi0JCS5yZXN1bHQgPSAiU2luZ2xlIGJsb2NrIG1zZyIsCi0JCS5ybGVuICAgPSAxNiwKLQl9LCB7Ci0JCS5rZXkgICAgPSAiXHhjMlx4ODZceDY5XHg2ZFx4ODhceDdjXHg5YVx4YTAiCi0JCQkgICJceDYxXHgxYlx4YmJceDNlXHgyMFx4MjVceGE0XHg1YSIsCi0JCS5rbGVuICAgPSAxNiwKLQkJLml2ICAgICA9ICJceDU2XHgyZVx4MTdceDk5XHg2ZFx4MDlceDNkXHgyOCIKLQkJCSAgIlx4ZGRceGIzXHhiYVx4NjlceDVhXHgyZVx4NmZceDU4IiwKLQkJLmlucHV0ID0gIlx4YTVceGRmXHg2ZVx4NTBceGRhXHg3MFx4NmNceDAxIgotCQkJICAiXHg0YVx4YWJceGYzXHhmMlx4ZDZceGZjXHg2Y1x4ZmQiCi0JCQkgICJceDE5XHhiNFx4M2VceDU3XHgxY1x4MDJceDVlXHhhMCIKLQkJCSAgIlx4MTVceDc4XHhlMFx4NWVceGYyXHhjYlx4ODdceDE2IiwKLQkJLmlsZW4gICA9IDMyLAotCQkucmVzdWx0ID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKLQkJLnJsZW4gICA9IDMyLAotCX0sCi19OwotCi0vKgotICogU0VFRCB0ZXN0IHZlY3RvcnMKLSAqLwotI2RlZmluZSBTRUVEX0VOQ19URVNUX1ZFQ1RPUlMJNAotI2RlZmluZSBTRUVEX0RFQ19URVNUX1ZFQ1RPUlMJNAotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHNlZWRfZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKLQkJLmtsZW4JPSAxNiwKLQkJLmlucHV0ICA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDVlXHhiYVx4YzZceGUwXHgwNVx4NGVceDE2XHg2OCIKLQkJCSAgIlx4MTlceGFmXHhmMVx4Y2NceDZkXHgzNFx4NmNceGRiIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhjMVx4MWZceDIyXHhmMlx4MDFceDQwXHg1MFx4NTAiCi0JCQkgICJceDg0XHg0OFx4MzVceDk3XHhlNFx4MzdceDBmXHg0MyIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4NDdceDA2XHg0OFx4MDhceDUxXHhlNlx4MWJceGU4IgotCQkJICAiXHg1ZFx4NzRceGJmXHhiM1x4ZmRceDk1XHg2MVx4ODUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg4M1x4YTJceGY4XHhhMlx4ODhceDY0XHgxZlx4YjkiCi0JCQkgICJceGE0XHhlOVx4YTVceGNjXHgyZlx4MTNceDFjXHg3ZCIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhlZVx4NTRceGQxXHgzZVx4YmNceGFlXHg3MFx4NmQiCi0JCQkgICJceDIyXHg2Ylx4YzNceDE0XHgyY1x4ZDRceDBkXHg0YSIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjhceGRiXHhjM1x4YmNceDQ5XHhmZlx4ZDhceDdkIgotCQkJICAiXHhjZlx4YTVceDA5XHhiMVx4MWRceDQyXHgyYlx4ZTciLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHhiNFx4MWVceDZiXHhlMlx4ZWJceGE4XHg0YVx4MTQiCi0JCQkgICJceDhlXHgyZVx4ZWRceDg0XHg1OVx4M2NceDVlXHhjNyIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg5Ylx4OWJceDdiXHhmY1x4ZDFceDgxXHgzY1x4YjkiCi0JCQkgICJceDVkXHgwYlx4MzZceDE4XHhmNFx4MGZceDUxXHgyMiIsCi0JCS5ybGVuCT0gMTYsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBzZWVkX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceDVlXHhiYVx4YzZceGUwXHgwNVx4NGVceDE2XHg2OCIKLQkJCSAgIlx4MTlceGFmXHhmMVx4Y2NceDZkXHgzNFx4NmNceGRiIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKLQkJLnJsZW4JPSAxNiwKLQl9LCB7Ci0JCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pbnB1dAk9ICJceGMxXHgxZlx4MjJceGYyXHgwMVx4NDBceDUwXHg1MCIKLQkJCSAgIlx4ODRceDQ4XHgzNVx4OTdceGU0XHgzN1x4MGZceDQzIiwKLQkJLmlsZW4JPSAxNiwKLQkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4NDdceDA2XHg0OFx4MDhceDUxXHhlNlx4MWJceGU4IgotCQkJICAiXHg1ZFx4NzRceGJmXHhiM1x4ZmRceDk1XHg2MVx4ODUiLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHhlZVx4NTRceGQxXHgzZVx4YmNceGFlXHg3MFx4NmQiCi0JCQkgICJceDIyXHg2Ylx4YzNceDE0XHgyY1x4ZDRceDBkXHg0YSIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHg4M1x4YTJceGY4XHhhMlx4ODhceDY0XHgxZlx4YjkiCi0JCQkgICJceGE0XHhlOVx4YTVceGNjXHgyZlx4MTNceDFjXHg3ZCIsCi0JCS5ybGVuCT0gMTYsCi0JfSwgewotCQkua2V5CT0gIlx4MjhceGRiXHhjM1x4YmNceDQ5XHhmZlx4ZDhceDdkIgotCQkJICAiXHhjZlx4YTVceDA5XHhiMVx4MWRceDQyXHgyYlx4ZTciLAotCQkua2xlbgk9IDE2LAotCQkuaW5wdXQJPSAiXHg5Ylx4OWJceDdiXHhmY1x4ZDFceDgxXHgzY1x4YjkiCi0JCQkgICJceDVkXHgwYlx4MzZceDE4XHhmNFx4MGZceDUxXHgyMiIsCi0JCS5pbGVuCT0gMTYsCi0JCS5yZXN1bHQJPSAiXHhiNFx4MWVceDZiXHhlMlx4ZWJceGE4XHg0YVx4MTQiCi0JCQkgICJceDhlXHgyZVx4ZWRceDg0XHg1OVx4M2NceDVlXHhjNyIsCi0JCS5ybGVuCT0gMTYsCi0JfQotfTsKLQotI2RlZmluZSBTQUxTQTIwX1NUUkVBTV9FTkNfVEVTVF9WRUNUT1JTIDUKLXN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgc2Fsc2EyMF9zdHJlYW1fZW5jX3R2X3RlbXBsYXRlW10gPSB7Ci0JLyoKLQkqIFRlc3R2ZWN0b3JzIGZyb20gdmVyaWZpZWQudGVzdC12ZWN0b3JzIHN1Ym1pdHRlZCB0byBFQ1JZUFQuCi0JKiBUaGV5IGFyZSB0cnVuY2F0ZWQgdG8gc2l6ZSAzOSwgNjQsIDExMSwgMTI5IHRvIHRlc3QgYSB2YXJpZXR5Ci0JKiBvZiBpbnB1dCBsZW5ndGguCi0JKi8KLQl7IC8qIFNldCAzLCB2ZWN0b3IgMCAqLwotCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgotCQkJIlx4MDhceDA5XHgwQVx4MEJceDBDXHgwRFx4MEVceDBGIiwKLQkJLmtsZW4JPSAxNiwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlsZW4JPSAzOSwKLQkJLnJlc3VsdAk9ICJceDJEXHhENVx4QzNceEY3XHhCQVx4MkJceDIwXHhGNyIKLQkJCSAiXHg2OFx4MDJceDQxXHgwQ1x4NjhceDg2XHg4OFx4ODkiCi0JCQkgIlx4NUFceEQ4XHhDMVx4QkRceDRFXHhBNlx4QzlceEIxIgotCQkJICJceDQwXHhGQlx4OUJceDkwXHhFMlx4MTBceDQ5XHhCRiIKLQkJCSAiXHg1OFx4M0ZceDUyXHg3OVx4NzBceEVCXHhDMSIsCi0JCS5ybGVuCT0gMzksCi0JfSwgeyAvKiBTZXQgNSwgdmVjdG9yIDAgKi8KLQkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rbGVuCT0gMTYsCi0JCS5pdiAgICAgPSAiXHg4MFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0JCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbgk9IDY0LAotCQkucmVzdWx0CT0gIlx4QjZceDZDXHgxRVx4NDRceDQ2XHhERFx4OTVceDU3IgotCQkJICJceEU1XHg3OFx4RTJceDIzXHhCMFx4QjdceDY4XHgwMSIKLQkJCSAiXHg3Qlx4MjNceEIyXHg2N1x4QkJceDAyXHgzNFx4QUUiCi0JCQkgIlx4NDZceDI2XHhCRlx4NDRceDNGXHgyMVx4OTdceDc2IgotCQkJICJceDQzXHg2Rlx4QjFceDlGXHhEMFx4RThceDg2XHg2RiIKLQkJCSAiXHhDRFx4MERceEU5XHhBOVx4NTNceDhGXHg0QVx4MDkiCi0JCQkgIlx4Q0FceDlBXHhDMFx4NzNceDJFXHgzMFx4QkNceEY5IgotCQkJICJceDhFXHg0Rlx4MTNceEU0XHhCOVx4RTJceDAxXHhEOSIsCi0JCS5ybGVuCT0gNjQsCi0JfSwgeyAvKiBTZXQgMywgdmVjdG9yIDI3ICovCi0JCS5rZXkJPSAiXHgxQlx4MUNceDFEXHgxRVx4MUZceDIwXHgyMVx4MjIiCi0JCQkiXHgyM1x4MjRceDI1XHgyNlx4MjdceDI4XHgyOVx4MkEiCi0JCQkiXHgyQlx4MkNceDJEXHgyRVx4MkZceDMwXHgzMVx4MzIiCi0JCQkiXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4XHgzOVx4M0EiLAotCQkua2xlbgk9IDMyLAotCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAotCQkuaWxlbgk9IDExMSwKLQkJLnJlc3VsdAk9ICJceEFFXHgzOVx4NTBceDhFXHhBQ1x4OUFceEVDXHhFNyIKLQkJCSAiXHhCRlx4OTdceEJCXHgyMFx4QjlceERFXHhFNFx4MUYiCi0JCQkgIlx4ODdceEQ5XHg0N1x4RjhceDI4XHg5MVx4MzVceDk4IgotCQkJICJceERCXHg3Mlx4Q0NceDIzXHgyOVx4NDhceDU2XHg1RSIKLQkJCSAiXHg4M1x4N0VceDBCXHhGM1x4N0RceDVEXHgzOFx4N0IiCi0JCQkgIlx4MkRceDcxXHgwMlx4QjRceDNCXHhCNVx4RDhceDIzIgotCQkJICJceEIwXHg0QVx4REZceDNDXHhFQ1x4QjZceEQ5XHgzQiIKLQkJCSAiXHg5Qlx4QTdceDUyXHhCRVx4QzVceEQ0XHg1MFx4NTkiCi0JCQkgIlx4MTVceDE0XHhCNFx4MEVceDQwXHhFNlx4NTNceEQxIgotCQkJICJceDgzXHg5Q1x4NUJceEEwXHg5Mlx4MjlceDZCXHg1RSIKLQkJCSAiXHg5Nlx4NUJceDFFXHgyRlx4RDNceEFDXHhDMVx4OTIiCi0JCQkgIlx4QjFceDQxXHgzRlx4MTlceDJGXHhDNFx4M0JceEM2IgotCQkJICJceDk1XHg0Nlx4NDVceDU0XHhFOVx4NzVceDAzXHgwOCIKLQkJCSAiXHg0NFx4QUZceEU1XHg4QVx4ODFceDEyXHgwOSIsCi0JCS5ybGVuCT0gMTExLAotCX0sIHsgLyogU2V0IDUsIHZlY3RvciAyNyAqLwotCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKLQkJLmtsZW4JPSAzMiwKLQkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDEwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwIiwKLQkJLmlsZW4JPSAxMjksCi0JCS5yZXN1bHQJPSAiXHhEMlx4REJceDFBXHg1Q1x4RjFceEMxXHhBQ1x4REIiCi0JCQkgIlx4RThceDFBXHg3QVx4NDNceDQwXHhFRlx4NTNceDQzIgotCQkJICJceDVFXHg3Rlx4NEJceDFBXHg1MFx4NTJceDNGXHg4RCIKLQkJCSAiXHgyOFx4M0RceENGXHg4NVx4MURceDY5XHg2RVx4NjAiCi0JCQkgIlx4RjJceERFXHg3NFx4NTZceDE4XHgxQlx4ODRceDEwIgotCQkJICJceEQ0XHg2Mlx4QkFceDYwXHg1MFx4RjBceDYxXHhGMiIKLQkJCSAiXHgxQ1x4NzhceDdGXHhDMVx4MjRceDM0XHhBRlx4NTgiCi0JCQkgIlx4QkZceDJDXHg1OVx4Q0FceDkwXHg3N1x4RjNceEIwIgotCQkJICJceDVCXHg0QVx4REZceDg5XHhDRVx4MkNceDJGXHhGQyIKLQkJCSAiXHg2N1x4RjBceEUzXHg0NVx4RThceEIzXHhCM1x4NzUiCi0JCQkgIlx4QTBceDk1XHg3MVx4QTFceDI5XHgzOVx4OTRceENBIgotCQkJICJceDQ1XHgyRlx4QkRceENCXHgxMFx4QjZceEJFXHg5RiIKLQkJCSAiXHg4RVx4RjlceEIyXHgwMVx4MEFceDVBXHgwQVx4QjciCi0JCQkgIlx4NkJceDlEXHg3MFx4OEVceDRCXHhENlx4MkZceENEIgotCQkJICJceDJFXHg0MFx4NDhceDc1XHhFOVx4RTJceDIxXHg0NSIKLQkJCSAiXHgwQlx4QzlceEI2XHhCNVx4NjZceEJDXHg5QVx4NTkiCi0JCQkgIlx4NUEiLAotCQkucmxlbgk9IDEyOSwKLQl9LCB7IC8qIGxhcmdlIHRlc3QgdmVjdG9yIGdlbmVyYXRlZCB1c2luZyBDcnlwdG8rKyAqLwotCQkua2V5ID0gICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKLQkJCSJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKLQkJCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKLQkJCSJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCi0JCS5rbGVuID0gMzIsCi0JCS5pdiA9CSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLQkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5pbnB1dCA9Ci0JCQkiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCi0JCQkiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCi0JCQkiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCi0JCQkiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCi0JCQkiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCi0JCQkiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCi0JCQkiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCi0JCQkiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCi0JCQkiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCi0JCQkiXHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCi0JCQkiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCi0JCQkiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCi0JCQkiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjciCi0JCQkiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCi0JCQkiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCi0JCQkiXHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCi0JCQkiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCi0JCQkiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCi0JCQkiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTciCi0JCQkiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCi0JCQkiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCi0JCQkiXHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCi0JCQkiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCi0JCQkiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCi0JCQkiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCi0JCQkiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCi0JCQkiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCi0JCQkiXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYiCi0JCQkiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCi0JCQkiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCi0JCQkiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCi0JCQkiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiCi0JCQkiXHgwMFx4MDNceDA2XHgwOVx4MGNceDBmXHgxMlx4MTUiCi0JCQkiXHgxOFx4MWJceDFlXHgyMVx4MjRceDI3XHgyYVx4MmQiCi0JCQkiXHgzMFx4MzNceDM2XHgzOVx4M2NceDNmXHg0Mlx4NDUiCi0JCQkiXHg0OFx4NGJceDRlXHg1MVx4NTRceDU3XHg1YVx4NWQiCi0JCQkiXHg2MFx4NjNceDY2XHg2OVx4NmNceDZmXHg3Mlx4NzUiCi0JCQkiXHg3OFx4N2JceDdlXHg4MVx4ODRceDg3XHg4YVx4OGQiCi0JCQkiXHg5MFx4OTNceDk2XHg5OVx4OWNceDlmXHhhMlx4YTUiCi0JCQkiXHhhOFx4YWJceGFlXHhiMVx4YjRceGI3XHhiYVx4YmQiCi0JCQkiXHhjMFx4YzNceGM2XHhjOVx4Y2NceGNmXHhkMlx4ZDUiCi0JCQkiXHhkOFx4ZGJceGRlXHhlMVx4ZTRceGU3XHhlYVx4ZWQiCi0JCQkiXHhmMFx4ZjNceGY2XHhmOVx4ZmNceGZmXHgwMlx4MDUiCi0JCQkiXHgwOFx4MGJceDBlXHgxMVx4MTRceDE3XHgxYVx4MWQiCi0JCQkiXHgyMFx4MjNceDI2XHgyOVx4MmNceDJmXHgzMlx4MzUiCi0JCQkiXHgzOFx4M2JceDNlXHg0MVx4NDRceDQ3XHg0YVx4NGQiCi0JCQkiXHg1MFx4NTNceDU2XHg1OVx4NWNceDVmXHg2Mlx4NjUiCi0JCQkiXHg2OFx4NmJceDZlXHg3MVx4NzRceDc3XHg3YVx4N2QiCi0JCQkiXHg4MFx4ODNceDg2XHg4OVx4OGNceDhmXHg5Mlx4OTUiCi0JCQkiXHg5OFx4OWJceDllXHhhMVx4YTRceGE3XHhhYVx4YWQiCi0JCQkiXHhiMFx4YjNceGI2XHhiOVx4YmNceGJmXHhjMlx4YzUiCi0JCQkiXHhjOFx4Y2JceGNlXHhkMVx4ZDRceGQ3XHhkYVx4ZGQiCi0JCQkiXHhlMFx4ZTNceGU2XHhlOVx4ZWNceGVmXHhmMlx4ZjUiCi0JCQkiXHhmOFx4ZmJceGZlXHgwMVx4MDRceDA3XHgwYVx4MGQiCi0JCQkiXHgxMFx4MTNceDE2XHgxOVx4MWNceDFmXHgyMlx4MjUiCi0JCQkiXHgyOFx4MmJceDJlXHgzMVx4MzRceDM3XHgzYVx4M2QiCi0JCQkiXHg0MFx4NDNceDQ2XHg0OVx4NGNceDRmXHg1Mlx4NTUiCi0JCQkiXHg1OFx4NWJceDVlXHg2MVx4NjRceDY3XHg2YVx4NmQiCi0JCQkiXHg3MFx4NzNceDc2XHg3OVx4N2NceDdmXHg4Mlx4ODUiCi0JCQkiXHg4OFx4OGJceDhlXHg5MVx4OTRceDk3XHg5YVx4OWQiCi0JCQkiXHhhMFx4YTNceGE2XHhhOVx4YWNceGFmXHhiMlx4YjUiCi0JCQkiXHhiOFx4YmJceGJlXHhjMVx4YzRceGM3XHhjYVx4Y2QiCi0JCQkiXHhkMFx4ZDNceGQ2XHhkOVx4ZGNceGRmXHhlMlx4ZTUiCi0JCQkiXHhlOFx4ZWJceGVlXHhmMVx4ZjRceGY3XHhmYVx4ZmQiCi0JCQkiXHgwMFx4MDVceDBhXHgwZlx4MTRceDE5XHgxZVx4MjMiCi0JCQkiXHgyOFx4MmRceDMyXHgzN1x4M2NceDQxXHg0Nlx4NGIiCi0JCQkiXHg1MFx4NTVceDVhXHg1Zlx4NjRceDY5XHg2ZVx4NzMiCi0JCQkiXHg3OFx4N2RceDgyXHg4N1x4OGNceDkxXHg5Nlx4OWIiCi0JCQkiXHhhMFx4YTVceGFhXHhhZlx4YjRceGI5XHhiZVx4YzMiCi0JCQkiXHhjOFx4Y2RceGQyXHhkN1x4ZGNceGUxXHhlNlx4ZWIiCi0JCQkiXHhmMFx4ZjVceGZhXHhmZlx4MDRceDA5XHgwZVx4MTMiCi0JCQkiXHgxOFx4MWRceDIyXHgyN1x4MmNceDMxXHgzNlx4M2IiCi0JCQkiXHg0MFx4NDVceDRhXHg0Zlx4NTRceDU5XHg1ZVx4NjMiCi0JCQkiXHg2OFx4NmRceDcyXHg3N1x4N2NceDgxXHg4Nlx4OGIiCi0JCQkiXHg5MFx4OTVceDlhXHg5Zlx4YTRceGE5XHhhZVx4YjMiCi0JCQkiXHhiOFx4YmRceGMyXHhjN1x4Y2NceGQxXHhkNlx4ZGIiCi0JCQkiXHhlMFx4ZTVceGVhXHhlZlx4ZjRceGY5XHhmZVx4MDMiCi0JCQkiXHgwOFx4MGRceDEyXHgxN1x4MWNceDIxXHgyNlx4MmIiCi0JCQkiXHgzMFx4MzVceDNhXHgzZlx4NDRceDQ5XHg0ZVx4NTMiCi0JCQkiXHg1OFx4NWRceDYyXHg2N1x4NmNceDcxXHg3Nlx4N2IiCi0JCQkiXHg4MFx4ODVceDhhXHg4Zlx4OTRceDk5XHg5ZVx4YTMiCi0JCQkiXHhhOFx4YWRceGIyXHhiN1x4YmNceGMxXHhjNlx4Y2IiCi0JCQkiXHhkMFx4ZDVceGRhXHhkZlx4ZTRceGU5XHhlZVx4ZjMiCi0JCQkiXHhmOFx4ZmRceDAyXHgwN1x4MGNceDExXHgxNlx4MWIiCi0JCQkiXHgyMFx4MjVceDJhXHgyZlx4MzRceDM5XHgzZVx4NDMiCi0JCQkiXHg0OFx4NGRceDUyXHg1N1x4NWNceDYxXHg2Nlx4NmIiCi0JCQkiXHg3MFx4NzVceDdhXHg3Zlx4ODRceDg5XHg4ZVx4OTMiCi0JCQkiXHg5OFx4OWRceGEyXHhhN1x4YWNceGIxXHhiNlx4YmIiCi0JCQkiXHhjMFx4YzVceGNhXHhjZlx4ZDRceGQ5XHhkZVx4ZTMiCi0JCQkiXHhlOFx4ZWRceGYyXHhmN1x4ZmNceDAxXHgwNlx4MGIiCi0JCQkiXHgxMFx4MTVceDFhXHgxZlx4MjRceDI5XHgyZVx4MzMiCi0JCQkiXHgzOFx4M2RceDQyXHg0N1x4NGNceDUxXHg1Nlx4NWIiCi0JCQkiXHg2MFx4NjVceDZhXHg2Zlx4NzRceDc5XHg3ZVx4ODMiCi0JCQkiXHg4OFx4OGRceDkyXHg5N1x4OWNceGExXHhhNlx4YWIiCi0JCQkiXHhiMFx4YjVceGJhXHhiZlx4YzRceGM5XHhjZVx4ZDMiCi0JCQkiXHhkOFx4ZGRceGUyXHhlN1x4ZWNceGYxXHhmNlx4ZmIiCi0JCQkiXHgwMFx4MDdceDBlXHgxNVx4MWNceDIzXHgyYVx4MzEiCi0JCQkiXHgzOFx4M2ZceDQ2XHg0ZFx4NTRceDViXHg2Mlx4NjkiCi0JCQkiXHg3MFx4NzdceDdlXHg4NVx4OGNceDkzXHg5YVx4YTEiCi0JCQkiXHhhOFx4YWZceGI2XHhiZFx4YzRceGNiXHhkMlx4ZDkiCi0JCQkiXHhlMFx4ZTdceGVlXHhmNVx4ZmNceDAzXHgwYVx4MTEiCi0JCQkiXHgxOFx4MWZceDI2XHgyZFx4MzRceDNiXHg0Mlx4NDkiCi0JCQkiXHg1MFx4NTdceDVlXHg2NVx4NmNceDczXHg3YVx4ODEiCi0JCQkiXHg4OFx4OGZceDk2XHg5ZFx4YTRceGFiXHhiMlx4YjkiCi0JCQkiXHhjMFx4YzdceGNlXHhkNVx4ZGNceGUzXHhlYVx4ZjEiCi0JCQkiXHhmOFx4ZmZceDA2XHgwZFx4MTRceDFiXHgyMlx4MjkiCi0JCQkiXHgzMFx4MzdceDNlXHg0NVx4NGNceDUzXHg1YVx4NjEiCi0JCQkiXHg2OFx4NmZceDc2XHg3ZFx4ODRceDhiXHg5Mlx4OTkiCi0JCQkiXHhhMFx4YTdceGFlXHhiNVx4YmNceGMzXHhjYVx4ZDEiCi0JCQkiXHhkOFx4ZGZceGU2XHhlZFx4ZjRceGZiXHgwMlx4MDkiCi0JCQkiXHgxMFx4MTdceDFlXHgyNVx4MmNceDMzXHgzYVx4NDEiCi0JCQkiXHg0OFx4NGZceDU2XHg1ZFx4NjRceDZiXHg3Mlx4NzkiCi0JCQkiXHg4MFx4ODdceDhlXHg5NVx4OWNceGEzXHhhYVx4YjEiCi0JCQkiXHhiOFx4YmZceGM2XHhjZFx4ZDRceGRiXHhlMlx4ZTkiCi0JCQkiXHhmMFx4ZjdceGZlXHgwNVx4MGNceDEzXHgxYVx4MjEiCi0JCQkiXHgyOFx4MmZceDM2XHgzZFx4NDRceDRiXHg1Mlx4NTkiCi0JCQkiXHg2MFx4NjdceDZlXHg3NVx4N2NceDgzXHg4YVx4OTEiCi0JCQkiXHg5OFx4OWZceGE2XHhhZFx4YjRceGJiXHhjMlx4YzkiCi0JCQkiXHhkMFx4ZDdceGRlXHhlNVx4ZWNceGYzXHhmYVx4MDEiCi0JCQkiXHgwOFx4MGZceDE2XHgxZFx4MjRceDJiXHgzMlx4MzkiCi0JCQkiXHg0MFx4NDdceDRlXHg1NVx4NWNceDYzXHg2YVx4NzEiCi0JCQkiXHg3OFx4N2ZceDg2XHg4ZFx4OTRceDliXHhhMlx4YTkiCi0JCQkiXHhiMFx4YjdceGJlXHhjNVx4Y2NceGQzXHhkYVx4ZTEiCi0JCQkiXHhlOFx4ZWZceGY2XHhmZFx4MDRceDBiXHgxMlx4MTkiCi0JCQkiXHgyMFx4MjdceDJlXHgzNVx4M2NceDQzXHg0YVx4NTEiCi0JCQkiXHg1OFx4NWZceDY2XHg2ZFx4NzRceDdiXHg4Mlx4ODkiCi0JCQkiXHg5MFx4OTdceDllXHhhNVx4YWNceGIzXHhiYVx4YzEiCi0JCQkiXHhjOFx4Y2ZceGQ2XHhkZFx4ZTRceGViXHhmMlx4ZjkiCi0JCQkiXHgwMFx4MDlceDEyXHgxYlx4MjRceDJkXHgzNlx4M2YiCi0JCQkiXHg0OFx4NTFceDVhXHg2M1x4NmNceDc1XHg3ZVx4ODciCi0JCQkiXHg5MFx4OTlceGEyXHhhYlx4YjRceGJkXHhjNlx4Y2YiCi0JCQkiXHhkOFx4ZTFceGVhXHhmM1x4ZmNceDA1XHgwZVx4MTciCi0JCQkiXHgyMFx4MjlceDMyXHgzYlx4NDRceDRkXHg1Nlx4NWYiCi0JCQkiXHg2OFx4NzFceDdhXHg4M1x4OGNceDk1XHg5ZVx4YTciCi0JCQkiXHhiMFx4YjlceGMyXHhjYlx4ZDRceGRkXHhlNlx4ZWYiCi0JCQkiXHhmOFx4MDFceDBhXHgxM1x4MWNceDI1XHgyZVx4MzciCi0JCQkiXHg0MFx4NDlceDUyXHg1Ylx4NjRceDZkXHg3Nlx4N2YiCi0JCQkiXHg4OFx4OTFceDlhXHhhM1x4YWNceGI1XHhiZVx4YzciCi0JCQkiXHhkMFx4ZDlceGUyXHhlYlx4ZjRceGZkXHgwNlx4MGYiCi0JCQkiXHgxOFx4MjFceDJhXHgzM1x4M2NceDQ1XHg0ZVx4NTciCi0JCQkiXHg2MFx4NjlceDcyXHg3Ylx4ODRceDhkXHg5Nlx4OWYiCi0JCQkiXHhhOFx4YjFceGJhXHhjM1x4Y2NceGQ1XHhkZVx4ZTciCi0JCQkiXHhmMFx4ZjlceDAyXHgwYlx4MTRceDFkXHgyNlx4MmYiCi0JCQkiXHgzOFx4NDFceDRhXHg1M1x4NWNceDY1XHg2ZVx4NzciCi0JCQkiXHg4MFx4ODlceDkyXHg5Ylx4YTRceGFkXHhiNlx4YmYiCi0JCQkiXHhjOFx4ZDFceGRhXHhlM1x4ZWNceGY1XHhmZVx4MDciCi0JCQkiXHgxMFx4MTlceDIyXHgyYlx4MzRceDNkXHg0Nlx4NGYiCi0JCQkiXHg1OFx4NjFceDZhXHg3M1x4N2NceDg1XHg4ZVx4OTciCi0JCQkiXHhhMFx4YTlceGIyXHhiYlx4YzRceGNkXHhkNlx4ZGYiCi0JCQkiXHhlOFx4ZjFceGZhXHgwM1x4MGNceDE1XHgxZVx4MjciCi0JCQkiXHgzMFx4MzlceDQyXHg0Ylx4NTRceDVkXHg2Nlx4NmYiCi0JCQkiXHg3OFx4ODFceDhhXHg5M1x4OWNceGE1XHhhZVx4YjciCi0JCQkiXHhjMFx4YzlceGQyXHhkYlx4ZTRceGVkXHhmNlx4ZmYiCi0JCQkiXHgwOFx4MTFceDFhXHgyM1x4MmNceDM1XHgzZVx4NDciCi0JCQkiXHg1MFx4NTlceDYyXHg2Ylx4NzRceDdkXHg4Nlx4OGYiCi0JCQkiXHg5OFx4YTFceGFhXHhiM1x4YmNceGM1XHhjZVx4ZDciCi0JCQkiXHhlMFx4ZTlceGYyXHhmYlx4MDRceDBkXHgxNlx4MWYiCi0JCQkiXHgyOFx4MzFceDNhXHg0M1x4NGNceDU1XHg1ZVx4NjciCi0JCQkiXHg3MFx4NzlceDgyXHg4Ylx4OTRceDlkXHhhNlx4YWYiCi0JCQkiXHhiOFx4YzFceGNhXHhkM1x4ZGNceGU1XHhlZVx4ZjciCi0JCQkiXHgwMFx4MGJceDE2XHgyMVx4MmNceDM3XHg0Mlx4NGQiCi0JCQkiXHg1OFx4NjNceDZlXHg3OVx4ODRceDhmXHg5YVx4YTUiCi0JCQkiXHhiMFx4YmJceGM2XHhkMVx4ZGNceGU3XHhmMlx4ZmQiCi0JCQkiXHgwOFx4MTNceDFlXHgyOVx4MzRceDNmXHg0YVx4NTUiCi0JCQkiXHg2MFx4NmJceDc2XHg4MVx4OGNceDk3XHhhMlx4YWQiCi0JCQkiXHhiOFx4YzNceGNlXHhkOVx4ZTRceGVmXHhmYVx4MDUiCi0JCQkiXHgxMFx4MWJceDI2XHgzMVx4M2NceDQ3XHg1Mlx4NWQiCi0JCQkiXHg2OFx4NzNceDdlXHg4OVx4OTRceDlmXHhhYVx4YjUiCi0JCQkiXHhjMFx4Y2JceGQ2XHhlMVx4ZWNceGY3XHgwMlx4MGQiCi0JCQkiXHgxOFx4MjNceDJlXHgzOVx4NDRceDRmXHg1YVx4NjUiCi0JCQkiXHg3MFx4N2JceDg2XHg5MVx4OWNceGE3XHhiMlx4YmQiCi0JCQkiXHhjOFx4ZDNceGRlXHhlOVx4ZjRceGZmXHgwYVx4MTUiCi0JCQkiXHgyMFx4MmJceDM2XHg0MVx4NGNceDU3XHg2Mlx4NmQiCi0JCQkiXHg3OFx4ODNceDhlXHg5OVx4YTRceGFmXHhiYVx4YzUiCi0JCQkiXHhkMFx4ZGJceGU2XHhmMVx4ZmNceDA3XHgxMlx4MWQiCi0JCQkiXHgyOFx4MzNceDNlXHg0OVx4NTRceDVmXHg2YVx4NzUiCi0JCQkiXHg4MFx4OGJceDk2XHhhMVx4YWNceGI3XHhjMlx4Y2QiCi0JCQkiXHhkOFx4ZTNceGVlXHhmOVx4MDRceDBmXHgxYVx4MjUiCi0JCQkiXHgzMFx4M2JceDQ2XHg1MVx4NWNceDY3XHg3Mlx4N2QiCi0JCQkiXHg4OFx4OTNceDllXHhhOVx4YjRceGJmXHhjYVx4ZDUiCi0JCQkiXHhlMFx4ZWJceGY2XHgwMVx4MGNceDE3XHgyMlx4MmQiCi0JCQkiXHgzOFx4NDNceDRlXHg1OVx4NjRceDZmXHg3YVx4ODUiCi0JCQkiXHg5MFx4OWJceGE2XHhiMVx4YmNceGM3XHhkMlx4ZGQiCi0JCQkiXHhlOFx4ZjNceGZlXHgwOVx4MTRceDFmXHgyYVx4MzUiCi0JCQkiXHg0MFx4NGJceDU2XHg2MVx4NmNceDc3XHg4Mlx4OGQiCi0JCQkiXHg5OFx4YTNceGFlXHhiOVx4YzRceGNmXHhkYVx4ZTUiCi0JCQkiXHhmMFx4ZmJceDA2XHgxMVx4MWNceDI3XHgzMlx4M2QiCi0JCQkiXHg0OFx4NTNceDVlXHg2OVx4NzRceDdmXHg4YVx4OTUiCi0JCQkiXHhhMFx4YWJceGI2XHhjMVx4Y2NceGQ3XHhlMlx4ZWQiCi0JCQkiXHhmOFx4MDNceDBlXHgxOVx4MjRceDJmXHgzYVx4NDUiCi0JCQkiXHg1MFx4NWJceDY2XHg3MVx4N2NceDg3XHg5Mlx4OWQiCi0JCQkiXHhhOFx4YjNceGJlXHhjOVx4ZDRceGRmXHhlYVx4ZjUiCi0JCQkiXHgwMFx4MGRceDFhXHgyN1x4MzRceDQxXHg0ZVx4NWIiCi0JCQkiXHg2OFx4NzVceDgyXHg4Zlx4OWNceGE5XHhiNlx4YzMiCi0JCQkiXHhkMFx4ZGRceGVhXHhmN1x4MDRceDExXHgxZVx4MmIiCi0JCQkiXHgzOFx4NDVceDUyXHg1Zlx4NmNceDc5XHg4Nlx4OTMiCi0JCQkiXHhhMFx4YWRceGJhXHhjN1x4ZDRceGUxXHhlZVx4ZmIiCi0JCQkiXHgwOFx4MTVceDIyXHgyZlx4M2NceDQ5XHg1Nlx4NjMiCi0JCQkiXHg3MFx4N2RceDhhXHg5N1x4YTRceGIxXHhiZVx4Y2IiCi0JCQkiXHhkOFx4ZTVceGYyXHhmZlx4MGNceDE5XHgyNlx4MzMiCi0JCQkiXHg0MFx4NGRceDVhXHg2N1x4NzRceDgxXHg4ZVx4OWIiCi0JCQkiXHhhOFx4YjVceGMyXHhjZlx4ZGNceGU5XHhmNlx4MDMiCi0JCQkiXHgxMFx4MWRceDJhXHgzN1x4NDRceDUxXHg1ZVx4NmIiCi0JCQkiXHg3OFx4ODVceDkyXHg5Zlx4YWNceGI5XHhjNlx4ZDMiCi0JCQkiXHhlMFx4ZWRceGZhXHgwN1x4MTRceDIxXHgyZVx4M2IiCi0JCQkiXHg0OFx4NTVceDYyXHg2Zlx4N2NceDg5XHg5Nlx4YTMiCi0JCQkiXHhiMFx4YmRceGNhXHhkN1x4ZTRceGYxXHhmZVx4MGIiCi0JCQkiXHgxOFx4MjVceDMyXHgzZlx4NGNceDU5XHg2Nlx4NzMiCi0JCQkiXHg4MFx4OGRceDlhXHhhN1x4YjRceGMxXHhjZVx4ZGIiCi0JCQkiXHhlOFx4ZjVceDAyXHgwZlx4MWNceDI5XHgzNlx4NDMiCi0JCQkiXHg1MFx4NWRceDZhXHg3N1x4ODRceDkxXHg5ZVx4YWIiCi0JCQkiXHhiOFx4YzVceGQyXHhkZlx4ZWNceGY5XHgwNlx4MTMiCi0JCQkiXHgyMFx4MmRceDNhXHg0N1x4NTRceDYxXHg2ZVx4N2IiCi0JCQkiXHg4OFx4OTVceGEyXHhhZlx4YmNceGM5XHhkNlx4ZTMiCi0JCQkiXHhmMFx4ZmRceDBhXHgxN1x4MjRceDMxXHgzZVx4NGIiCi0JCQkiXHg1OFx4NjVceDcyXHg3Zlx4OGNceDk5XHhhNlx4YjMiCi0JCQkiXHhjMFx4Y2RceGRhXHhlN1x4ZjRceDAxXHgwZVx4MWIiCi0JCQkiXHgyOFx4MzVceDQyXHg0Zlx4NWNceDY5XHg3Nlx4ODMiCi0JCQkiXHg5MFx4OWRceGFhXHhiN1x4YzRceGQxXHhkZVx4ZWIiCi0JCQkiXHhmOFx4MDVceDEyXHgxZlx4MmNceDM5XHg0Nlx4NTMiCi0JCQkiXHg2MFx4NmRceDdhXHg4N1x4OTRceGExXHhhZVx4YmIiCi0JCQkiXHhjOFx4ZDVceGUyXHhlZlx4ZmNceDA5XHgxNlx4MjMiCi0JCQkiXHgzMFx4M2RceDRhXHg1N1x4NjRceDcxXHg3ZVx4OGIiCi0JCQkiXHg5OFx4YTVceGIyXHhiZlx4Y2NceGQ5XHhlNlx4ZjMiCi0JCQkiXHgwMFx4MGZceDFlXHgyZFx4M2NceDRiXHg1YVx4NjkiCi0JCQkiXHg3OFx4ODdceDk2XHhhNVx4YjRceGMzXHhkMlx4ZTEiCi0JCQkiXHhmMFx4ZmZceDBlXHgxZFx4MmNceDNiXHg0YVx4NTkiCi0JCQkiXHg2OFx4NzdceDg2XHg5NVx4YTRceGIzXHhjMlx4ZDEiCi0JCQkiXHhlMFx4ZWZceGZlXHgwZFx4MWNceDJiXHgzYVx4NDkiCi0JCQkiXHg1OFx4NjdceDc2XHg4NVx4OTRceGEzXHhiMlx4YzEiCi0JCQkiXHhkMFx4ZGZceGVlXHhmZFx4MGNceDFiXHgyYVx4MzkiCi0JCQkiXHg0OFx4NTdceDY2XHg3NVx4ODRceDkzXHhhMlx4YjEiCi0JCQkiXHhjMFx4Y2ZceGRlXHhlZFx4ZmNceDBiXHgxYVx4MjkiCi0JCQkiXHgzOFx4NDdceDU2XHg2NVx4NzRceDgzXHg5Mlx4YTEiCi0JCQkiXHhiMFx4YmZceGNlXHhkZFx4ZWNceGZiXHgwYVx4MTkiCi0JCQkiXHgyOFx4MzdceDQ2XHg1NVx4NjRceDczXHg4Mlx4OTEiCi0JCQkiXHhhMFx4YWZceGJlXHhjZFx4ZGNceGViXHhmYVx4MDkiCi0JCQkiXHgxOFx4MjdceDM2XHg0NVx4NTRceDYzXHg3Mlx4ODEiCi0JCQkiXHg5MFx4OWZceGFlXHhiZFx4Y2NceGRiXHhlYVx4ZjkiCi0JCQkiXHgwOFx4MTdceDI2XHgzNVx4NDRceDUzXHg2Mlx4NzEiCi0JCQkiXHg4MFx4OGZceDllXHhhZFx4YmNceGNiXHhkYVx4ZTkiCi0JCQkiXHhmOFx4MDdceDE2XHgyNVx4MzRceDQzXHg1Mlx4NjEiCi0JCQkiXHg3MFx4N2ZceDhlXHg5ZFx4YWNceGJiXHhjYVx4ZDkiCi0JCQkiXHhlOFx4ZjdceDA2XHgxNVx4MjRceDMzXHg0Mlx4NTEiCi0JCQkiXHg2MFx4NmZceDdlXHg4ZFx4OWNceGFiXHhiYVx4YzkiCi0JCQkiXHhkOFx4ZTdceGY2XHgwNVx4MTRceDIzXHgzMlx4NDEiCi0JCQkiXHg1MFx4NWZceDZlXHg3ZFx4OGNceDliXHhhYVx4YjkiCi0JCQkiXHhjOFx4ZDdceGU2XHhmNVx4MDRceDEzXHgyMlx4MzEiCi0JCQkiXHg0MFx4NGZceDVlXHg2ZFx4N2NceDhiXHg5YVx4YTkiCi0JCQkiXHhiOFx4YzdceGQ2XHhlNVx4ZjRceDAzXHgxMlx4MjEiCi0JCQkiXHgzMFx4M2ZceDRlXHg1ZFx4NmNceDdiXHg4YVx4OTkiCi0JCQkiXHhhOFx4YjdceGM2XHhkNVx4ZTRceGYzXHgwMlx4MTEiCi0JCQkiXHgyMFx4MmZceDNlXHg0ZFx4NWNceDZiXHg3YVx4ODkiCi0JCQkiXHg5OFx4YTdceGI2XHhjNVx4ZDRceGUzXHhmMlx4MDEiCi0JCQkiXHgxMFx4MWZceDJlXHgzZFx4NGNceDViXHg2YVx4NzkiCi0JCQkiXHg4OFx4OTdceGE2XHhiNVx4YzRceGQzXHhlMlx4ZjEiCi0JCQkiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCi0JCQkiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiCi0JCQkiXHgxMFx4MjFceDMyXHg0M1x4NTRceDY1XHg3Nlx4ODciCi0JCQkiXHg5OFx4YTlceGJhXHhjYlx4ZGNceGVkXHhmZVx4MGYiCi0JCQkiXHgyMFx4MzFceDQyXHg1M1x4NjRceDc1XHg4Nlx4OTciCi0JCQkiXHhhOFx4YjlceGNhXHhkYlx4ZWNceGZkXHgwZVx4MWYiCi0JCQkiXHgzMFx4NDFceDUyXHg2M1x4NzRceDg1XHg5Nlx4YTciCi0JCQkiXHhiOFx4YzlceGRhXHhlYlx4ZmNceDBkXHgxZVx4MmYiCi0JCQkiXHg0MFx4NTFceDYyXHg3M1x4ODRceDk1XHhhNlx4YjciCi0JCQkiXHhjOFx4ZDlceGVhXHhmYlx4MGNceDFkXHgyZVx4M2YiCi0JCQkiXHg1MFx4NjFceDcyXHg4M1x4OTRceGE1XHhiNlx4YzciCi0JCQkiXHhkOFx4ZTlceGZhXHgwYlx4MWNceDJkXHgzZVx4NGYiCi0JCQkiXHg2MFx4NzFceDgyXHg5M1x4YTRceGI1XHhjNlx4ZDciCi0JCQkiXHhlOFx4ZjlceDBhXHgxYlx4MmNceDNkXHg0ZVx4NWYiCi0JCQkiXHg3MFx4ODFceDkyXHhhM1x4YjRceGM1XHhkNlx4ZTciCi0JCQkiXHhmOFx4MDlceDFhXHgyYlx4M2NceDRkXHg1ZVx4NmYiCi0JCQkiXHg4MFx4OTFceGEyXHhiM1x4YzRceGQ1XHhlNlx4ZjciCi0JCQkiXHgwOFx4MTlceDJhXHgzYlx4NGNceDVkXHg2ZVx4N2YiCi0JCQkiXHg5MFx4YTFceGIyXHhjM1x4ZDRceGU1XHhmNlx4MDciCi0JCQkiXHgxOFx4MjlceDNhXHg0Ylx4NWNceDZkXHg3ZVx4OGYiCi0JCQkiXHhhMFx4YjFceGMyXHhkM1x4ZTRceGY1XHgwNlx4MTciCi0JCQkiXHgyOFx4MzlceDRhXHg1Ylx4NmNceDdkXHg4ZVx4OWYiCi0JCQkiXHhiMFx4YzFceGQyXHhlM1x4ZjRceDA1XHgxNlx4MjciCi0JCQkiXHgzOFx4NDlceDVhXHg2Ylx4N2NceDhkXHg5ZVx4YWYiCi0JCQkiXHhjMFx4ZDFceGUyXHhmM1x4MDRceDE1XHgyNlx4MzciCi0JCQkiXHg0OFx4NTlceDZhXHg3Ylx4OGNceDlkXHhhZVx4YmYiCi0JCQkiXHhkMFx4ZTFceGYyXHgwM1x4MTRceDI1XHgzNlx4NDciCi0JCQkiXHg1OFx4NjlceDdhXHg4Ylx4OWNceGFkXHhiZVx4Y2YiCi0JCQkiXHhlMFx4ZjFceDAyXHgxM1x4MjRceDM1XHg0Nlx4NTciCi0JCQkiXHg2OFx4NzlceDhhXHg5Ylx4YWNceGJkXHhjZVx4ZGYiCi0JCQkiXHhmMFx4MDFceDEyXHgyM1x4MzRceDQ1XHg1Nlx4NjciCi0JCQkiXHg3OFx4ODlceDlhXHhhYlx4YmNceGNkXHhkZVx4ZWYiCi0JCQkiXHgwMFx4MTNceDI2XHgzOVx4NGNceDVmXHg3Mlx4ODUiCi0JCQkiXHg5OFx4YWJceGJlXHhkMVx4ZTRceGY3XHgwYVx4MWQiCi0JCQkiXHgzMFx4NDNceDU2XHg2OVx4N2NceDhmXHhhMlx4YjUiCi0JCQkiXHhjOFx4ZGJceGVlXHgwMVx4MTRceDI3XHgzYVx4NGQiCi0JCQkiXHg2MFx4NzNceDg2XHg5OVx4YWNceGJmXHhkMlx4ZTUiCi0JCQkiXHhmOFx4MGJceDFlXHgzMVx4NDRceDU3XHg2YVx4N2QiCi0JCQkiXHg5MFx4YTNceGI2XHhjOVx4ZGNceGVmXHgwMlx4MTUiCi0JCQkiXHgyOFx4M2JceDRlXHg2MVx4NzRceDg3XHg5YVx4YWQiCi0JCQkiXHhjMFx4ZDNceGU2XHhmOVx4MGNceDFmXHgzMlx4NDUiCi0JCQkiXHg1OFx4NmJceDdlXHg5MVx4YTRceGI3XHhjYVx4ZGQiCi0JCQkiXHhmMFx4MDNceDE2XHgyOVx4M2NceDRmXHg2Mlx4NzUiCi0JCQkiXHg4OFx4OWJceGFlXHhjMVx4ZDRceGU3XHhmYVx4MGQiCi0JCQkiXHgyMFx4MzNceDQ2XHg1OVx4NmNceDdmXHg5Mlx4YTUiCi0JCQkiXHhiOFx4Y2JceGRlXHhmMVx4MDRceDE3XHgyYVx4M2QiCi0JCQkiXHg1MFx4NjNceDc2XHg4OVx4OWNceGFmXHhjMlx4ZDUiCi0JCQkiXHhlOFx4ZmJceDBlXHgyMVx4MzRceDQ3XHg1YVx4NmQiCi0JCQkiXHg4MFx4OTNceGE2XHhiOVx4Y2NceGRmXHhmMlx4MDUiCi0JCQkiXHgxOFx4MmJceDNlXHg1MVx4NjRceDc3XHg4YVx4OWQiCi0JCQkiXHhiMFx4YzNceGQ2XHhlOVx4ZmNceDBmXHgyMlx4MzUiCi0JCQkiXHg0OFx4NWJceDZlXHg4MVx4OTRceGE3XHhiYVx4Y2QiCi0JCQkiXHhlMFx4ZjNceDA2XHgxOVx4MmNceDNmXHg1Mlx4NjUiCi0JCQkiXHg3OFx4OGJceDllXHhiMVx4YzRceGQ3XHhlYVx4ZmQiCi0JCQkiXHgxMFx4MjNceDM2XHg0OVx4NWNceDZmXHg4Mlx4OTUiCi0JCQkiXHhhOFx4YmJceGNlXHhlMVx4ZjRceDA3XHgxYVx4MmQiCi0JCQkiXHg0MFx4NTNceDY2XHg3OVx4OGNceDlmXHhiMlx4YzUiCi0JCQkiXHhkOFx4ZWJceGZlXHgxMVx4MjRceDM3XHg0YVx4NWQiCi0JCQkiXHg3MFx4ODNceDk2XHhhOVx4YmNceGNmXHhlMlx4ZjUiCi0JCQkiXHgwOFx4MWJceDJlXHg0MVx4NTRceDY3XHg3YVx4OGQiCi0JCQkiXHhhMFx4YjNceGM2XHhkOVx4ZWNceGZmXHgxMlx4MjUiCi0JCQkiXHgzOFx4NGJceDVlXHg3MVx4ODRceDk3XHhhYVx4YmQiCi0JCQkiXHhkMFx4ZTNceGY2XHgwOVx4MWNceDJmXHg0Mlx4NTUiCi0JCQkiXHg2OFx4N2JceDhlXHhhMVx4YjRceGM3XHhkYVx4ZWQiCi0JCQkiXHgwMFx4MTVceDJhXHgzZlx4NTRceDY5XHg3ZVx4OTMiCi0JCQkiXHhhOFx4YmRceGQyXHhlN1x4ZmNceDExXHgyNlx4M2IiCi0JCQkiXHg1MFx4NjVceDdhXHg4Zlx4YTRceGI5XHhjZVx4ZTMiCi0JCQkiXHhmOFx4MGRceDIyXHgzN1x4NGNceDYxXHg3Nlx4OGIiCi0JCQkiXHhhMFx4YjVceGNhXHhkZlx4ZjRceDA5XHgxZVx4MzMiCi0JCQkiXHg0OFx4NWRceDcyXHg4N1x4OWNceGIxXHhjNlx4ZGIiCi0JCQkiXHhmMFx4MDVceDFhXHgyZlx4NDRceDU5XHg2ZVx4ODMiCi0JCQkiXHg5OFx4YWRceGMyXHhkN1x4ZWNceDAxXHgxNlx4MmIiCi0JCQkiXHg0MFx4NTVceDZhXHg3Zlx4OTRceGE5XHhiZVx4ZDMiCi0JCQkiXHhlOFx4ZmRceDEyXHgyN1x4M2NceDUxXHg2Nlx4N2IiCi0JCQkiXHg5MFx4YTVceGJhXHhjZlx4ZTRceGY5XHgwZVx4MjMiCi0JCQkiXHgzOFx4NGRceDYyXHg3N1x4OGNceGExXHhiNlx4Y2IiCi0JCQkiXHhlMFx4ZjVceDBhXHgxZlx4MzRceDQ5XHg1ZVx4NzMiCi0JCQkiXHg4OFx4OWRceGIyXHhjN1x4ZGNceGYxXHgwNlx4MWIiCi0JCQkiXHgzMFx4NDVceDVhXHg2Zlx4ODRceDk5XHhhZVx4YzMiCi0JCQkiXHhkOFx4ZWRceDAyXHgxN1x4MmNceDQxXHg1Nlx4NmIiCi0JCQkiXHg4MFx4OTVceGFhXHhiZlx4ZDRceGU5XHhmZVx4MTMiCi0JCQkiXHgyOFx4M2RceDUyXHg2N1x4N2NceDkxXHhhNlx4YmIiCi0JCQkiXHhkMFx4ZTVceGZhXHgwZlx4MjRceDM5XHg0ZVx4NjMiCi0JCQkiXHg3OFx4OGRceGEyXHhiN1x4Y2NceGUxXHhmNlx4MGIiCi0JCQkiXHgyMFx4MzVceDRhXHg1Zlx4NzRceDg5XHg5ZVx4YjMiCi0JCQkiXHhjOFx4ZGRceGYyXHgwN1x4MWNceDMxXHg0Nlx4NWIiCi0JCQkiXHg3MFx4ODVceDlhXHhhZlx4YzRceGQ5XHhlZVx4MDMiCi0JCQkiXHgxOFx4MmRceDQyXHg1N1x4NmNceDgxXHg5Nlx4YWIiCi0JCQkiXHhjMFx4ZDVceGVhXHhmZlx4MTRceDI5XHgzZVx4NTMiCi0JCQkiXHg2OFx4N2RceDkyXHhhN1x4YmNceGQxXHhlNlx4ZmIiCi0JCQkiXHgxMFx4MjVceDNhXHg0Zlx4NjRceDc5XHg4ZVx4YTMiCi0JCQkiXHhiOFx4Y2RceGUyXHhmN1x4MGNceDIxXHgzNlx4NGIiCi0JCQkiXHg2MFx4NzVceDhhXHg5Zlx4YjRceGM5XHhkZVx4ZjMiCi0JCQkiXHgwOFx4MWRceDMyXHg0N1x4NWNceDcxXHg4Nlx4OWIiCi0JCQkiXHhiMFx4YzVceGRhXHhlZlx4MDRceDE5XHgyZVx4NDMiCi0JCQkiXHg1OFx4NmRceDgyXHg5N1x4YWNceGMxXHhkNlx4ZWIiCi0JCQkiXHgwMFx4MTdceDJlXHg0NVx4NWNceDczXHg4YVx4YTEiCi0JCQkiXHhiOFx4Y2ZceGU2XHhmZFx4MTRceDJiXHg0Mlx4NTkiCi0JCQkiXHg3MFx4ODdceDllXHhiNVx4Y2NceGUzXHhmYVx4MTEiCi0JCQkiXHgyOFx4M2ZceDU2XHg2ZFx4ODRceDliXHhiMlx4YzkiCi0JCQkiXHhlMFx4ZjdceDBlXHgyNVx4M2NceDUzXHg2YVx4ODEiCi0JCQkiXHg5OFx4YWZceGM2XHhkZFx4ZjRceDBiXHgyMlx4MzkiCi0JCQkiXHg1MFx4NjdceDdlXHg5NVx4YWNceGMzXHhkYVx4ZjEiCi0JCQkiXHgwOFx4MWZceDM2XHg0ZFx4NjRceDdiXHg5Mlx4YTkiCi0JCQkiXHhjMFx4ZDdceGVlXHgwNVx4MWNceDMzXHg0YVx4NjEiCi0JCQkiXHg3OFx4OGZceGE2XHhiZFx4ZDRceGViXHgwMlx4MTkiCi0JCQkiXHgzMFx4NDdceDVlXHg3NVx4OGNceGEzXHhiYVx4ZDEiCi0JCQkiXHhlOFx4ZmZceDE2XHgyZFx4NDRceDViXHg3Mlx4ODkiCi0JCQkiXHhhMFx4YjdceGNlXHhlNVx4ZmNceDEzXHgyYVx4NDEiCi0JCQkiXHg1OFx4NmZceDg2XHg5ZFx4YjRceGNiXHhlMlx4ZjkiCi0JCQkiXHgxMFx4MjdceDNlXHg1NVx4NmNceDgzXHg5YVx4YjEiCi0JCQkiXHhjOFx4ZGZceGY2XHgwZFx4MjRceDNiXHg1Mlx4NjkiCi0JCQkiXHg4MFx4OTdceGFlXHhjNVx4ZGNceGYzXHgwYVx4MjEiCi0JCQkiXHgzOFx4NGZceDY2XHg3ZFx4OTRceGFiXHhjMlx4ZDkiCi0JCQkiXHhmMFx4MDdceDFlXHgzNVx4NGNceDYzXHg3YVx4OTEiCi0JCQkiXHhhOFx4YmZceGQ2XHhlZFx4MDRceDFiXHgzMlx4NDkiCi0JCQkiXHg2MFx4NzdceDhlXHhhNVx4YmNceGQzXHhlYVx4MDEiCi0JCQkiXHgxOFx4MmZceDQ2XHg1ZFx4NzRceDhiXHhhMlx4YjkiCi0JCQkiXHhkMFx4ZTdceGZlXHgxNVx4MmNceDQzXHg1YVx4NzEiCi0JCQkiXHg4OFx4OWZceGI2XHhjZFx4ZTRceGZiXHgxMlx4MjkiCi0JCQkiXHg0MFx4NTdceDZlXHg4NVx4OWNceGIzXHhjYVx4ZTEiCi0JCQkiXHhmOFx4MGZceDI2XHgzZFx4NTRceDZiXHg4Mlx4OTkiCi0JCQkiXHhiMFx4YzdceGRlXHhmNVx4MGNceDIzXHgzYVx4NTEiCi0JCQkiXHg2OFx4N2ZceDk2XHhhZFx4YzRceGRiXHhmMlx4MDkiCi0JCQkiXHgyMFx4MzdceDRlXHg2NVx4N2NceDkzXHhhYVx4YzEiCi0JCQkiXHhkOFx4ZWZceDA2XHgxZFx4MzRceDRiXHg2Mlx4NzkiCi0JCQkiXHg5MFx4YTdceGJlXHhkNVx4ZWNceDAzXHgxYVx4MzEiCi0JCQkiXHg0OFx4NWZceDc2XHg4ZFx4YTRceGJiXHhkMlx4ZTkiCi0JCQkiXHgwMFx4MTlceDMyXHg0Ylx4NjRceDdkXHg5Nlx4YWYiCi0JCQkiXHhjOFx4ZTFceGZhXHgxM1x4MmNceDQ1XHg1ZVx4NzciCi0JCQkiXHg5MFx4YTlceGMyXHhkYlx4ZjRceDBkXHgyNlx4M2YiCi0JCQkiXHg1OFx4NzFceDhhXHhhM1x4YmNceGQ1XHhlZVx4MDciCi0JCQkiXHgyMFx4MzlceDUyXHg2Ylx4ODRceDlkXHhiNlx4Y2YiCi0JCQkiXHhlOFx4MDFceDFhXHgzM1x4NGNceDY1XHg3ZVx4OTciCi0JCQkiXHhiMFx4YzlceGUyXHhmYlx4MTRceDJkXHg0Nlx4NWYiCi0JCQkiXHg3OFx4OTFceGFhXHhjM1x4ZGNceGY1XHgwZVx4MjciCi0JCQkiXHg0MFx4NTlceDcyXHg4Ylx4YTRceGJkXHhkNlx4ZWYiCi0JCQkiXHgwOFx4MjFceDNhXHg1M1x4NmNceDg1XHg5ZVx4YjciCi0JCQkiXHhkMFx4ZTlceDAyXHgxYlx4MzRceDRkXHg2Nlx4N2YiCi0JCQkiXHg5OFx4YjFceGNhXHhlM1x4ZmNceDE1XHgyZVx4NDciCi0JCQkiXHg2MFx4NzlceDkyXHhhYlx4YzRceGRkXHhmNlx4MGYiCi0JCQkiXHgyOFx4NDFceDVhXHg3M1x4OGNceGE1XHhiZVx4ZDciCi0JCQkiXHhmMFx4MDlceDIyXHgzYlx4NTRceDZkXHg4Nlx4OWYiCi0JCQkiXHhiOFx4ZDFceGVhXHgwM1x4MWNceDM1XHg0ZVx4NjciCi0JCQkiXHg4MFx4OTlceGIyXHhjYlx4ZTRceGZkXHgxNlx4MmYiCi0JCQkiXHg0OFx4NjFceDdhXHg5M1x4YWNceGM1XHhkZVx4ZjciCi0JCQkiXHgxMFx4MjlceDQyXHg1Ylx4NzRceDhkXHhhNlx4YmYiCi0JCQkiXHhkOFx4ZjFceDBhXHgyM1x4M2NceDU1XHg2ZVx4ODciCi0JCQkiXHhhMFx4YjlceGQyXHhlYlx4MDRceDFkXHgzNlx4NGYiCi0JCQkiXHg2OFx4ODFceDlhXHhiM1x4Y2NceGU1XHhmZVx4MTciCi0JCQkiXHgzMFx4NDlceDYyXHg3Ylx4OTRceGFkXHhjNlx4ZGYiCi0JCQkiXHhmOFx4MTFceDJhXHg0M1x4NWNceDc1XHg4ZVx4YTciCi0JCQkiXHhjMFx4ZDlceGYyXHgwYlx4MjRceDNkXHg1Nlx4NmYiCi0JCQkiXHg4OFx4YTFceGJhXHhkM1x4ZWNceDA1XHgxZVx4MzciCi0JCQkiXHg1MFx4NjlceDgyXHg5Ylx4YjRceGNkXHhlNlx4ZmYiCi0JCQkiXHgxOFx4MzFceDRhXHg2M1x4N2NceDk1XHhhZVx4YzciCi0JCQkiXHhlMFx4ZjlceDEyXHgyYlx4NDRceDVkXHg3Nlx4OGYiCi0JCQkiXHhhOFx4YzFceGRhXHhmM1x4MGNceDI1XHgzZVx4NTciCi0JCQkiXHg3MFx4ODlceGEyXHhiYlx4ZDRceGVkXHgwNlx4MWYiCi0JCQkiXHgzOFx4NTFceDZhXHg4M1x4OWNceGI1XHhjZVx4ZTciCi0JCQkiXHgwMFx4MWJceDM2XHg1MVx4NmNceDg3XHhhMlx4YmQiCi0JCQkiXHhkOFx4ZjNceDBlXHgyOVx4NDRceDVmXHg3YVx4OTUiCi0JCQkiXHhiMFx4Y2JceGU2XHgwMVx4MWNceDM3XHg1Mlx4NmQiCi0JCQkiXHg4OFx4YTNceGJlXHhkOVx4ZjRceDBmXHgyYVx4NDUiCi0JCQkiXHg2MFx4N2JceDk2XHhiMVx4Y2NceGU3XHgwMlx4MWQiCi0JCQkiXHgzOFx4NTNceDZlXHg4OVx4YTRceGJmXHhkYVx4ZjUiCi0JCQkiXHgxMFx4MmJceDQ2XHg2MVx4N2NceDk3XHhiMlx4Y2QiCi0JCQkiXHhlOFx4MDNceDFlXHgzOVx4NTRceDZmXHg4YVx4YTUiCi0JCQkiXHhjMFx4ZGJceGY2XHgxMVx4MmNceDQ3XHg2Mlx4N2QiCi0JCQkiXHg5OFx4YjNceGNlXHhlOVx4MDRceDFmXHgzYVx4NTUiCi0JCQkiXHg3MFx4OGJceGE2XHhjMVx4ZGNceGY3XHgxMlx4MmQiCi0JCQkiXHg0OFx4NjNceDdlXHg5OVx4YjRceGNmXHhlYVx4MDUiCi0JCQkiXHgyMFx4M2JceDU2XHg3MVx4OGNceGE3XHhjMlx4ZGQiCi0JCQkiXHhmOFx4MTNceDJlXHg0OVx4NjRceDdmXHg5YVx4YjUiCi0JCQkiXHhkMFx4ZWJceDA2XHgyMVx4M2NceDU3XHg3Mlx4OGQiCi0JCQkiXHhhOFx4YzNceGRlXHhmOVx4MTRceDJmXHg0YVx4NjUiCi0JCQkiXHg4MFx4OWJceGI2XHhkMVx4ZWNceDA3XHgyMlx4M2QiCi0JCQkiXHg1OFx4NzNceDhlXHhhOVx4YzRceGRmXHhmYVx4MTUiCi0JCQkiXHgzMFx4NGJceDY2XHg4MVx4OWNceGI3XHhkMlx4ZWQiCi0JCQkiXHgwOFx4MjNceDNlXHg1OVx4NzRceDhmXHhhYVx4YzUiCi0JCQkiXHhlMFx4ZmJceDE2XHgzMVx4NGNceDY3XHg4Mlx4OWQiCi0JCQkiXHhiOFx4ZDNceGVlXHgwOVx4MjRceDNmXHg1YVx4NzUiCi0JCQkiXHg5MFx4YWJceGM2XHhlMVx4ZmNceDE3XHgzMlx4NGQiCi0JCQkiXHg2OFx4ODNceDllXHhiOVx4ZDRceGVmXHgwYVx4MjUiCi0JCQkiXHg0MFx4NWJceDc2XHg5MVx4YWNceGM3XHhlMlx4ZmQiCi0JCQkiXHgxOFx4MzNceDRlXHg2OVx4ODRceDlmXHhiYVx4ZDUiCi0JCQkiXHhmMFx4MGJceDI2XHg0MVx4NWNceDc3XHg5Mlx4YWQiCi0JCQkiXHhjOFx4ZTNceGZlXHgxOVx4MzRceDRmXHg2YVx4ODUiCi0JCQkiXHhhMFx4YmJceGQ2XHhmMVx4MGNceDI3XHg0Mlx4NWQiCi0JCQkiXHg3OFx4OTNceGFlXHhjOVx4ZTRceGZmXHgxYVx4MzUiCi0JCQkiXHg1MFx4NmJceDg2XHhhMVx4YmNceGQ3XHhmMlx4MGQiCi0JCQkiXHgyOFx4NDNceDVlXHg3OVx4OTRceGFmXHhjYVx4ZTUiCi0JCQkiXHgwMFx4MWRceDNhXHg1N1x4NzRceDkxXHhhZVx4Y2IiCi0JCQkiXHhlOFx4MDVceDIyXHgzZlx4NWNceDc5XHg5Nlx4YjMiCi0JCQkiXHhkMFx4ZWRceDBhXHgyN1x4NDRceDYxXHg3ZVx4OWIiCi0JCQkiXHhiOFx4ZDVceGYyXHgwZlx4MmNceDQ5XHg2Nlx4ODMiCi0JCQkiXHhhMFx4YmRceGRhXHhmN1x4MTRceDMxXHg0ZVx4NmIiCi0JCQkiXHg4OFx4YTVceGMyXHhkZlx4ZmNceDE5XHgzNlx4NTMiCi0JCQkiXHg3MFx4OGRceGFhXHhjN1x4ZTRceDAxXHgxZVx4M2IiCi0JCQkiXHg1OFx4NzVceDkyXHhhZlx4Y2NceGU5XHgwNlx4MjMiCi0JCQkiXHg0MFx4NWRceDdhXHg5N1x4YjRceGQxXHhlZVx4MGIiCi0JCQkiXHgyOFx4NDVceDYyXHg3Zlx4OWNceGI5XHhkNlx4ZjMiCi0JCQkiXHgxMFx4MmRceDRhXHg2N1x4ODRceGExXHhiZVx4ZGIiCi0JCQkiXHhmOFx4MTVceDMyXHg0Zlx4NmNceDg5XHhhNlx4YzMiCi0JCQkiXHhlMFx4ZmRceDFhXHgzN1x4NTRceDcxXHg4ZVx4YWIiCi0JCQkiXHhjOFx4ZTVceDAyXHgxZlx4M2NceDU5XHg3Nlx4OTMiCi0JCQkiXHhiMFx4Y2RceGVhXHgwN1x4MjRceDQxXHg1ZVx4N2IiCi0JCQkiXHg5OFx4YjVceGQyXHhlZlx4MGNceDI5XHg0Nlx4NjMiCi0JCQkiXHg4MFx4OWRceGJhXHhkN1x4ZjRceDExXHgyZVx4NGIiCi0JCQkiXHg2OFx4ODVceGEyXHhiZlx4ZGNceGY5XHgxNlx4MzMiCi0JCQkiXHg1MFx4NmRceDhhXHhhN1x4YzRceGUxXHhmZVx4MWIiCi0JCQkiXHgzOFx4NTVceDcyXHg4Zlx4YWNceGM5XHhlNlx4MDMiCi0JCQkiXHgyMFx4M2RceDVhXHg3N1x4OTRceGIxXHhjZVx4ZWIiCi0JCQkiXHgwOFx4MjVceDQyXHg1Zlx4N2NceDk5XHhiNlx4ZDMiCi0JCQkiXHhmMFx4MGRceDJhXHg0N1x4NjRceDgxXHg5ZVx4YmIiCi0JCQkiXHhkOFx4ZjVceDEyXHgyZlx4NGNceDY5XHg4Nlx4YTMiCi0JCQkiXHhjMFx4ZGRceGZhXHgxN1x4MzRceDUxXHg2ZVx4OGIiCi0JCQkiXHhhOFx4YzVceGUyXHhmZlx4MWNceDM5XHg1Nlx4NzMiCi0JCQkiXHg5MFx4YWRceGNhXHhlN1x4MDRceDIxXHgzZVx4NWIiCi0JCQkiXHg3OFx4OTVceGIyXHhjZlx4ZWNceDA5XHgyNlx4NDMiCi0JCQkiXHg2MFx4N2RceDlhXHhiN1x4ZDRceGYxXHgwZVx4MmIiCi0JCQkiXHg0OFx4NjVceDgyXHg5Zlx4YmNceGQ5XHhmNlx4MTMiCi0JCQkiXHgzMFx4NGRceDZhXHg4N1x4YTRceGMxXHhkZVx4ZmIiCi0JCQkiXHgxOFx4MzVceDUyXHg2Zlx4OGNceGE5XHhjNlx4ZTMiCi0JCQkiXHgwMFx4MWZceDNlXHg1ZFx4N2NceDliXHhiYVx4ZDkiCi0JCQkiXHhmOFx4MTdceDM2XHg1NVx4NzRceDkzXHhiMlx4ZDEiCi0JCQkiXHhmMFx4MGZceDJlXHg0ZFx4NmNceDhiXHhhYVx4YzkiCi0JCQkiXHhlOFx4MDdceDI2XHg0NVx4NjRceDgzXHhhMlx4YzEiCi0JCQkiXHhlMFx4ZmZceDFlXHgzZFx4NWNceDdiXHg5YVx4YjkiCi0JCQkiXHhkOFx4ZjdceDE2XHgzNVx4NTRceDczXHg5Mlx4YjEiCi0JCQkiXHhkMFx4ZWZceDBlXHgyZFx4NGNceDZiXHg4YVx4YTkiCi0JCQkiXHhjOFx4ZTdceDA2XHgyNVx4NDRceDYzXHg4Mlx4YTEiCi0JCQkiXHhjMFx4ZGZceGZlXHgxZFx4M2NceDViXHg3YVx4OTkiCi0JCQkiXHhiOFx4ZDdceGY2XHgxNVx4MzRceDUzXHg3Mlx4OTEiCi0JCQkiXHhiMFx4Y2ZceGVlXHgwZFx4MmNceDRiXHg2YVx4ODkiCi0JCQkiXHhhOFx4YzdceGU2XHgwNVx4MjRceDQzXHg2Mlx4ODEiCi0JCQkiXHhhMFx4YmZceGRlXHhmZFx4MWNceDNiXHg1YVx4NzkiCi0JCQkiXHg5OFx4YjdceGQ2XHhmNVx4MTRceDMzXHg1Mlx4NzEiCi0JCQkiXHg5MFx4YWZceGNlXHhlZFx4MGNceDJiXHg0YVx4NjkiCi0JCQkiXHg4OFx4YTdceGM2XHhlNVx4MDRceDIzXHg0Mlx4NjEiCi0JCQkiXHg4MFx4OWZceGJlXHhkZFx4ZmNceDFiXHgzYVx4NTkiCi0JCQkiXHg3OFx4OTdceGI2XHhkNVx4ZjRceDEzXHgzMlx4NTEiCi0JCQkiXHg3MFx4OGZceGFlXHhjZFx4ZWNceDBiXHgyYVx4NDkiCi0JCQkiXHg2OFx4ODdceGE2XHhjNVx4ZTRceDAzXHgyMlx4NDEiCi0JCQkiXHg2MFx4N2ZceDllXHhiZFx4ZGNceGZiXHgxYVx4MzkiCi0JCQkiXHg1OFx4NzdceDk2XHhiNVx4ZDRceGYzXHgxMlx4MzEiCi0JCQkiXHg1MFx4NmZceDhlXHhhZFx4Y2NceGViXHgwYVx4MjkiCi0JCQkiXHg0OFx4NjdceDg2XHhhNVx4YzRceGUzXHgwMlx4MjEiCi0JCQkiXHg0MFx4NWZceDdlXHg5ZFx4YmNceGRiXHhmYVx4MTkiCi0JCQkiXHgzOFx4NTdceDc2XHg5NVx4YjRceGQzXHhmMlx4MTEiCi0JCQkiXHgzMFx4NGZceDZlXHg4ZFx4YWNceGNiXHhlYVx4MDkiCi0JCQkiXHgyOFx4NDdceDY2XHg4NVx4YTRceGMzXHhlMlx4MDEiCi0JCQkiXHgyMFx4M2ZceDVlXHg3ZFx4OWNceGJiXHhkYVx4ZjkiCi0JCQkiXHgxOFx4MzdceDU2XHg3NVx4OTRceGIzXHhkMlx4ZjEiCi0JCQkiXHgxMFx4MmZceDRlXHg2ZFx4OGNceGFiXHhjYVx4ZTkiCi0JCQkiXHgwOFx4MjdceDQ2XHg2NVx4ODRceGEzXHhjMlx4ZTEiCi0JCQkiXHgwMFx4MjFceDQyXHg2MyIsCi0JCS5pbGVuID0gNDEwMCwKLQkJLnJlc3VsdCA9Ci0JCQkiXHhiNVx4ODFceGY1XHg2NFx4MThceDczXHhlM1x4ZjAiCi0JCQkiXHg0Y1x4MTNceGYyXHg3N1x4MThceDYwXHg2NVx4NWUiCi0JCQkiXHgyOVx4MDFceGNlXHg5OFx4NTVceDUzXHhmOVx4MGMiCi0JCQkiXHgyYVx4MDhceGQ1XHgwOVx4YjNceDU3XHg1NVx4NTYiCi0JCQkiXHhjNVx4ZTlceDU2XHg5MFx4Y2JceDZhXHhhM1x4YzAiCi0JCQkiXHhmZlx4YzRceDc5XHhiNFx4ZDJceDk3XHg1ZFx4YzQiCi0JCQkiXHg0M1x4ZDFceGZlXHg5NFx4N2JceDg4XHgwNlx4NWEiCi0JCQkiXHhiMlx4OWVceDJjXHhmY1x4NDRceDAzXHhiN1x4OTAiCi0JCQkiXHhhMFx4YzFceGJhXHg2YVx4MzNceGI4XHhjN1x4YjIiCi0JCQkiXHg5ZFx4ZTFceDEyXHg0Zlx4YzBceDY0XHhkNFx4MDEiCi0JCQkiXHhmZVx4OGNceDdhXHg2Nlx4ZjdceGU2XHg1YVx4OTEiCi0JCQkiXHhiYlx4ZGVceDU2XHg4Nlx4YWJceDY1XHgyMVx4MzAiCi0JCQkiXHgwMFx4ODRceDY1XHgyNFx4YTVceDdkXHg4NVx4YjQiCi0JCQkiXHhlM1x4MTdceGVkXHgzYVx4YjdceDZmXHhiNFx4MGIiCi0JCQkiXHgwYlx4YWZceDE1XHhhZVx4NWFceDhmXHhmMlx4MGMiCi0JCQkiXHgyZlx4MjdceGY0XHgwOVx4ZDhceGQyXHg5Nlx4YjciCi0JCQkiXHg3MVx4ZjJceGM1XHg5OVx4NGRceDdlXHg3Zlx4NzUiCi0JCQkiXHg3N1x4ODlceDMwXHg4Ylx4NTlceGRiXHhhMlx4YjIiCi0JCQkiXHhhMFx4ZjNceDE5XHgzOVx4MmJceGM1XHg3ZVx4M2YiCi0JCQkiXHg0Zlx4ZDlceGQzXHg1Nlx4MjhceDk3XHg0NFx4ZGMiCi0JCQkiXHhjMFx4OGJceDc3XHgyNFx4ZDlceDUyXHhlN1x4YzUiCi0JCQkiXHhhZlx4ZjZceDdkXHg1OVx4YjJceDQ0XHgwNVx4MWQiCi0JCQkiXHhiMVx4YjBceDExXHhhNVx4MGZceGVjXHgzM1x4ZTEiCi0JCQkiXHg2ZFx4MWJceDRlXHgxZlx4ZmZceDU3XHg5MVx4YjQiCi0JCQkiXHg1Ylx4OWFceDk2XHhjNVx4NTNceGJjXHhhZVx4MjAiCi0JCQkiXHgzY1x4YmJceDE0XHhlMlx4ZThceDIyXHgzM1x4YzEiCi0JCQkiXHg1ZVx4NzZceDllXHg0Nlx4OTlceGY2XHgyYVx4MTUiCi0JCQkiXHhjNlx4OTdceDAyXHhhMFx4NjZceDQzXHhkMVx4YTYiCi0JCQkiXHgzMVx4YTZceDlmXHhmYlx4ZjRceGQzXHg2OVx4ZTUiCi0JCQkiXHhjZFx4NzZceDk1XHhiOFx4N2FceDgyXHg3Zlx4MjEiCi0JCQkiXHg0NVx4ZmZceDNmXHhjZVx4NTVceGY2XHg5NVx4MTAiCi0JCQkiXHgwOFx4NzdceDEwXHg0M1x4YzZceGYzXHgwOVx4ZTUiCi0JCQkiXHg2OFx4ZTdceDNjXHhhZFx4MDBceDUyXHg0NVx4MGQiCi0JCQkiXHhmZVx4MmRceGM2XHhjMlx4OTRceDhjXHgxMlx4MWQiCi0JCQkiXHhlNlx4MjVceGFlXHg5OFx4MTJceDhlXHgxOVx4OWMiCi0JCQkiXHg4MVx4NjhceGIxXHgxMVx4ZjZceDY5XHhkYVx4ZTMiCi0JCQkiXHg2Mlx4MDhceDE4XHg3YVx4MjVceDQ5XHgyOFx4YWMiCi0JCQkiXHhiYVx4NzFceDEyXHgwYlx4ZTRceGEyXHhlNVx4YzciCi0JCQkiXHg1ZFx4OGVceGVjXHg0OVx4NDBceDIxXHhiZlx4NWEiCi0JCQkiXHg5OFx4ZjNceDAyXHg2OFx4NTVceDAzXHg3Zlx4OGEiCi0JCQkiXHhlNVx4OTRceDBjXHgzMlx4NWNceDA3XHg4Mlx4NjMiCi0JCQkiXHhhZlx4NmZceDkxXHg0MFx4ODRceDhlXHg1Mlx4MjUiCi0JCQkiXHhkMFx4YjBceDI5XHg1M1x4MDVceGUyXHg1MFx4N2EiCi0JCQkiXHgzNFx4ZWJceGM5XHg0Nlx4MjBceGE4XHgzZFx4ZGUiCi0JCQkiXHg3Zlx4MTZceDVmXHgzNlx4YzVceDJlXHhkY1x4ZDEiCi0JCQkiXHgxNVx4NDdceGM3XHg1MFx4NDBceDZkXHg5MVx4YzUiCi0JCQkiXHhlN1x4OTNceDk1XHgxYVx4ZDNceDU3XHhiY1x4NTIiCi0JCQkiXHgzM1x4ZWVceDE0XHgxOVx4MjJceDUyXHg4OVx4YTciCi0JCQkiXHg0YVx4MjVceDU2XHg3N1x4NGJceGNhXHhjZlx4MGEiCi0JCQkiXHhlMVx4ZjVceDM1XHg4NVx4MzBceDdlXHg1OVx4NGEiCi0JCQkiXHhiZFx4MTRceDViXHhkZlx4ZTNceDQ2XHhjYlx4YWMiCi0JCQkiXHgxZlx4NmNceDk2XHgwZVx4ZjRceDgxXHhkMVx4OTkiCi0JCQkiXHhjYVx4ODhceDYzXHgzZFx4MDJceDU4XHg2Ylx4YTkiCi0JCQkiXHhlNVx4OWZceGIzXHgwMFx4YjJceDU0XHhjNlx4NzQiCi0JCQkiXHgxY1x4YmZceDQ2XHhhYlx4OTdceGNjXHhmOFx4NTQiCi0JCQkiXHgwNFx4MDdceDA4XHg1Mlx4ZTZceGMwXHhkYVx4OTMiCi0JCQkiXHg3NFx4N2RceDkzXHg5OVx4NWRceDc4XHg2OFx4YTYiCi0JCQkiXHgyZVx4NmJceGQzXHg2YVx4NjlceGNjXHgxMlx4NmIiCi0JCQkiXHhkNFx4YzdceGE1XHhjNlx4ZTdceGY2XHgwM1x4MDQiCi0JCQkiXHg1ZFx4Y2RceDYxXHg1ZVx4MTdceDQwXHhkY1x4ZDEiCi0JCQkiXHg1Y1x4ZjVceDA4XHhkZlx4NWNceDkwXHg4NVx4YTQiCi0JCQkiXHhhZlx4ZjZceDc4XHhiYlx4MGRceGYxXHhmNFx4YTQiCi0JCQkiXHg1NFx4MjZceDcyXHg5ZVx4NjFceGZhXHg4Nlx4Y2YiCi0JCQkiXHhlOFx4OWVceGExXHhlMFx4YzdceDQ4XHgyM1x4YWUiCi0JCQkiXHg1YVx4OTBceGFlXHg3NVx4MGFceDc0XHgxOFx4ODkiCi0JCQkiXHgwNVx4YjFceDkyXHhiMlx4N2ZceGQwXHgxYlx4YTYiCi0JCQkiXHg2Mlx4MDdceDI1XHgwMVx4YzdceGMyXHg0Zlx4ZjkiCi0JCQkiXHhlOFx4ZmVceDYzXHg5NVx4ODBceDA3XHhiNFx4MjYiCi0JCQkiXHhjY1x4ZDFceDI2XHhiNlx4YzRceDNmXHg5ZVx4Y2IiCi0JCQkiXHg4ZVx4M2JceDJlXHg0NFx4MTZceGQzXHgxMFx4OWEiCi0JCQkiXHg5NVx4MDhceGViXHhjOFx4Y2JceGViXHhiZlx4NmYiCi0JCQkiXHgwYlx4Y2RceDFmXHhjOFx4Y2FceDg2XHhhYVx4ZWMiCi0JCQkiXHgzM1x4ZTZceDY5XHhmNFx4NDVceDI1XHg4Nlx4M2EiCi0JCQkiXHgyMlx4OTRceDRmXHgwMFx4MjNceDZhXHg0NFx4YzIiCi0JCQkiXHg0OVx4OTdceDMzXHhhYlx4MzZceDE0XHgwYVx4NzAiCi0JCQkiXHgyNFx4YzNceGJlXHgwNFx4M2JceDc5XHhhMFx4ZjkiCi0JCQkiXHhiOFx4ZTdceDc2XHgyOVx4MjJceDgzXHhkN1x4ZjIiCi0JCQkiXHg5NFx4ZjRceDQxXHg0OVx4YmFceDVmXHg3Ylx4MDciCi0JCQkiXHhiNVx4ZmJceGRiXHgwM1x4MWFceDlmXHhiNlx4NGMiCi0JCQkiXHhjMlx4MmVceDM3XHg0MFx4NDlceGMzXHgzOFx4MTYiCi0JCQkiXHhlMlx4NGZceDc3XHg4Mlx4YjBceDY4XHg0Y1x4NzEiCi0JCQkiXHgxZFx4NTdceDYxXHg5Y1x4ZDlceDRlXHg1NFx4OTkiCi0JCQkiXHg0N1x4MTNceDI4XHg3M1x4M2NceGJiXHgwMFx4OTAiCi0JCQkiXHhmM1x4NGRceGM5XHgwZVx4ZmRceGU3XHhiMVx4NzEiCi0JCQkiXHhkM1x4MTVceDc5XHhiZlx4Y2NceDI2XHgyZlx4YmQiCi0JCQkiXHhhZFx4NmNceDUwXHg2OVx4NmNceDNlXHg2ZFx4ODAiCi0JCQkiXHg5YVx4ZWFceDc4XHhhZlx4MTlceGIyXHgwZFx4NGQiCi0JCQkiXHhhZFx4MDRceDA3XHhhZVx4MjJceDkwXHg0YVx4OTMiCi0JCQkiXHgzMlx4MGVceDM2XHg5Ylx4MWJceDQ2XHhiYVx4M2IiCi0JCQkiXHhiNFx4YWNceGM2XHhkMVx4YTJceDMxXHg1M1x4M2IiCi0JCQkiXHgyYVx4M2RceDQ1XHhmZVx4MDNceDYxXHgxMFx4ODUiCi0JCQkiXHgxN1x4NjlceGE2XHg3OFx4Y2NceDZjXHg4N1x4NDkiCi0JCQkiXHg1M1x4ZjlceDgwXHgxMFx4ZGVceDgwXHhhMlx4NDEiCi0JCQkiXHg2YVx4YzNceDMyXHgwMlx4YWRceDZkXHgzY1x4NTYiCi0JCQkiXHgwMFx4NzFceDUxXHgwNlx4YTdceGJkXHhmYlx4ZWYiCi0JCQkiXHgzY1x4YjVceDlmXHhmY1x4NDhceDdkXHg1M1x4N2MiCi0JCQkiXHg2Nlx4YjBceDQ5XHgyM1x4YzRceDQ3XHgxMFx4MGUiCi0JCQkiXHhlNVx4NmNceDc0XHgxM1x4ZTZceGM1XHgzZlx4YWEiCi0JCQkiXHhkZVx4ZmZceDA3XHg0NFx4ZGRceDU2XHgxYlx4YWQiCi0JCQkiXHgwOVx4NzdceGZiXHg1Ylx4MTJceGI4XHgwZFx4MzgiCi0JCQkiXHgxN1x4MzdceDM1XHg3Ylx4OWJceGJjXHhmZVx4ZDQiCi0JCQkiXHg3ZVx4OGJceGRhXHg3ZVx4NWJceDA0XHhhN1x4MjIiCi0JCQkiXHhhN1x4MzFceGExXHgyMFx4ODZceGM3XHgxYlx4OTkiCi0JCQkiXHhkYlx4ZDFceDg5XHhmNFx4OTRceGEzXHg1M1x4NjkiCi0JCQkiXHg4ZFx4ZTdceGU4XHg3NFx4MTFceDhkXHg3NFx4ZDYiCi0JCQkiXHgwN1x4MzdceDkxXHg5Zlx4ZmRceDY3XHg1MFx4M2EiCi0JCQkiXHhjOVx4ZTFceGY0XHgzNlx4ZDVceGEwXHg0N1x4ZDEiCi0JCQkiXHhmOVx4ZTVceDM5XHhhM1x4MzFceGFjXHgwN1x4MzYiCi0JCQkiXHgyM1x4ZjhceDY2XHgxOFx4MTRceDI4XHgzNFx4MGYiCi0JCQkiXHhiOFx4ZDBceGU3XHgyOVx4YjNceDA0XHg0Ylx4NTUiCi0JCQkiXHgwMVx4NDFceGIyXHg3NVx4OGRceGNiXHg5Nlx4ODUiCi0JCQkiXHgzYVx4ZmJceGFiXHgyYlx4OWVceGZhXHg1OFx4MjAiCi0JCQkiXHg0NFx4MWZceGMwXHgxNFx4MjJceDc1XHg2MVx4ZTgiCi0JCQkiXHhhYVx4MTlceGNmXHhmMVx4ODJceDU2XHhmNFx4ZDciCi0JCQkiXHg3OFx4N2JceDNkXHg1Zlx4YjNceDllXHgwYlx4OGEiCi0JCQkiXHg1N1x4NTBceGRiXHgxN1x4NDFceDY1XHg0ZFx4YTMiCi0JCQkiXHgwMlx4YzlceDljXHg5Y1x4NTNceGZiXHgzOVx4MzkiCi0JCQkiXHg5Ylx4MWRceDcyXHgyNFx4ZGFceGI3XHgzOVx4YmUiCi0JCQkiXHgxM1x4M2JceGZhXHgyOVx4ZGFceDllXHg1NFx4NjQiCi0JCQkiXHg2ZVx4YmFceGQ4XHhhMVx4Y2JceGIzXHgzNlx4ZmEiCi0JCQkiXHhjYlx4NDdceDg1XHhlOVx4NjFceDM4XHhiY1x4YmUiCi0JCQkiXHhjNVx4MDBceDM4XHgyYVx4NTRceGY3XHhjNFx4YjkiCi0JCQkiXHhiM1x4ZDNceDdiXHhhMFx4YTBceGY4XHg3Mlx4N2YiCi0JCQkiXHg4Y1x4OGVceDgyXHgwZVx4YzZceDFjXHg3NVx4OWQiCi0JCQkiXHhjYVx4OGVceDYxXHg4N1x4ZGVceGFkXHg4MFx4ZDIiCi0JCQkiXHhmNVx4ZjlceDgwXHhlZlx4MTVceDc1XHhhZlx4ZjUiCi0JCQkiXHg4MFx4ZmJceGZmXHg2ZFx4MWVceDI1XHhiN1x4NDAiCi0JCQkiXHg2MVx4NmFceDM5XHg1YVx4NmFceGI1XHgzMVx4YWIiCi0JCQkiXHg5N1x4OGFceDE5XHg4OVx4NDRceDQwXHhjMFx4YTYiCi0JCQkiXHhiNFx4NGVceDMwXHgzMlx4N2JceDEzXHhlN1x4NjciCi0JCQkiXHhhOVx4OGJceDU3XHgwNFx4YzJceDAxXHhhNlx4ZjQiCi0JCQkiXHgyOFx4OTlceGFkXHgyY1x4NzZceGEzXHg3OFx4YzIiCi0JCQkiXHg0YVx4ZTZceGNhXHg1Y1x4NTBceDZhXHhjMVx4YjAiCi0JCQkiXHg2Mlx4NGJceDEwXHg4ZVx4N2NceDE3XHg0M1x4YjMiCi0JCQkiXHgxN1x4NjZceDFjXHgzZVx4OGRceDY5XHhmMFx4NWEiCi0JCQkiXHg3MVx4ZjVceDk3XHhkY1x4ZDFceDQ1XHhkZFx4MjgiCi0JCQkiXHhmM1x4NWRceGRmXHg1M1x4N2JceDExXHhlNVx4YmMiCi0JCQkiXHg0Y1x4ZGJceDFiXHg1MVx4NmJceGU5XHhmYlx4M2QiCi0JCQkiXHhjMVx4YzNceDJjXHhiOVx4NzFceGY1XHhiNlx4YjIiCi0JCQkiXHgxM1x4MzZceDc5XHg4MFx4NTNceGU4XHhkM1x4YTYiCi0JCQkiXHgwYVx4YWZceGZkXHg1Nlx4OTdceGY3XHg0MFx4OGUiCi0JCQkiXHg0NVx4Y2VceGY4XHhiMFx4OWVceDVjXHgzM1x4ODIiCi0JCQkiXHhiMFx4NDRceDU2XHhmY1x4MDVceDA5XHhlOVx4MmEiCi0JCQkiXHhhY1x4MjZceDgwXHgxNFx4MWRceGM4XHgzYVx4MzUiCi0JCQkiXHg0Y1x4ODJceDk3XHhmZFx4NzZceGI3XHhhOVx4MGEiCi0JCQkiXHgzNVx4NThceDc5XHg4ZVx4MGZceDY2XHhlYVx4YWYiCi0JCQkiXHg1MVx4NmNceDA5XHhhOVx4NmVceDliXHhjYlx4OWEiCi0JCQkiXHgzMVx4NDdceGEwXHgyZlx4N2NceDcxXHhiNFx4NGEiCi0JCQkiXHgxMVx4YWFceDhjXHg2Nlx4YzVceDY0XHhlNlx4M2EiCi0JCQkiXHg1NFx4ZGFceDI0XHg2YVx4YzRceDQxXHg2NVx4NDYiCi0JCQkiXHg4Mlx4YTBceDBhXHgwZlx4NWZceGZiXHgyNVx4ZDAiCi0JCQkiXHgyY1x4OTFceGE3XHhlZVx4YzRceDgxXHgwN1x4ODYiCi0JCQkiXHg3NVx4NWVceDMzXHg2OVx4OTdceGU0XHgyY1x4YTgiCi0JCQkiXHg5ZFx4OWZceDBiXHg2YVx4YmVceGFkXHg5OFx4ZGEiCi0JCQkiXHg2ZFx4OTRceDQxXHhkYVx4MmNceDFlXHg4OVx4YzQiCi0JCQkiXHhjMlx4YWZceDFlXHgwMFx4MDVceDBiXHg4M1x4NjAiCi0JCQkiXHhiZFx4NDNceGVhXHgxNVx4MjNceDdmXHhiOVx4YWMiCi0JCQkiXHhlZVx4NGZceDJjXHhhZlx4MmFceGYzXHhkZlx4ZDAiCi0JCQkiXHhmM1x4MTlceDMxXHhiYlx4NGFceDc0XHg4NFx4MTciCi0JCQkiXHg1Mlx4MzJceDJjXHg3ZFx4NjFceGU0XHhjYlx4ZWIiCi0JCQkiXHg4MFx4MzhceDE1XHg1Mlx4Y2JceDZmXHhlYVx4ZTUiCi0JCQkiXHg3M1x4OWNceGQ5XHgyNFx4NjlceGM2XHg5NVx4MzIiCi0JCQkiXHgyMVx4YzhceDExXHhlNFx4ZGNceDM2XHhkN1x4OTMiCi0JCQkiXHgzOFx4NjZceGZiXHhiMlx4N2ZceDNhXHhiOVx4YWYiCi0JCQkiXHgzMVx4ZGRceDkzXHg3NVx4NzhceDhhXHgyY1x4OTQiCi0JCQkiXHg4N1x4MWFceDU4XHhlY1x4OWVceDdkXHg0ZFx4YmEiCi0JCQkiXHhlMVx4ZTVceDRkXHhmY1x4YmNceGE0XHgyYVx4MTQiCi0JCQkiXHhlZlx4Y2NceGE3XHhlY1x4YWJceDQzXHgwOVx4MTgiCi0JCQkiXHhkM1x4YWJceDY4XHhkMVx4MDdceDk5XHg0NFx4NDciCi0JCQkiXHhkNlx4ODNceDg1XHgzYlx4MzBceGVhXHhhOVx4NmIiCi0JCQkiXHg2M1x4ZWFceGM0XHgwN1x4ZmJceDQzXHgyZlx4YTQiCi0JCQkiXHhhYVx4YjBceGFiXHgwM1x4ODlceGNlXHgzZlx4OGMiCi0JCQkiXHgwMlx4N2NceDg2XHg1NFx4YmNceDg4XHhhZlx4NzUiCi0JCQkiXHhkMlx4ZGNceDYzXHgxN1x4ZDNceDI2XHhmNlx4OTYiCi0JCQkiXHhhOVx4M2NceGYxXHg2MVx4OGNceDExXHgxOFx4Y2MiCi0JCQkiXHhkNlx4ZWFceDViXHhlMlx4Y2RceGYwXHhmMVx4YjIiCi0JCQkiXHhlNVx4MzVceDkwXHgxZlx4ODVceDRjXHg3Nlx4NWIiCi0JCQkiXHg2Nlx4Y2VceDQ0XHhhNFx4MzJceDlmXHhlNlx4N2IiCi0JCQkiXHg3MVx4NmVceDlmXHg1OFx4MTVceDY3XHg3Mlx4ODciCi0JCQkiXHg2NFx4OGVceDNhXHg0NFx4NDVceGQ0XHg3Nlx4ZmEiCi0JCQkiXHhjMlx4ZjZceGVmXHg4NVx4MDVceDE4XHg3YVx4OWIiCi0JCQkiXHhiYVx4NDFceDU0XHhhY1x4ZjBceGZjXHg1OVx4MTIiCi0JCQkiXHgzZlx4ZGZceGEwXHhlNVx4OGFceDY1XHhmZFx4M2EiCi0JCQkiXHg2Mlx4OGRceDgzXHgyY1x4MDNceGJlXHgwNVx4NzYiCi0JCQkiXHgyZVx4NTNceDQ5XHg5N1x4OTRceDMzXHhhZVx4NDAiCi0JCQkiXHg4MVx4MTVceGRiXHg2ZVx4YWRceGFhXHhmNVx4NGIiCi0JCQkiXHhlM1x4OThceDcwXHhkZlx4ZTBceDdjXHhjZFx4ZGIiCi0JCQkiXHgwMlx4ZDRceDdkXHgyZlx4YzFceGU2XHhiNFx4ZjMiCi0JCQkiXHhkN1x4MGRceDdhXHhkOVx4MjNceDllXHg4N1x4MmQiCi0JCQkiXHhjZVx4ODdceGFkXHhjY1x4NzJceDA1XHgwMFx4MjkiCi0JCQkiXHhkY1x4NzNceDdmXHg2NFx4YzFceDE1XHgwZVx4YzIiCi0JCQkiXHhkZlx4YTdceDVmXHhlYlx4NDFceGExXHhjZFx4ZWYiCi0JCQkiXHg1Y1x4NTBceDc5XHgyYVx4NTZceDU2XHg3MVx4OGMiCi0JCQkiXHhhY1x4YzBceDc5XHg1MFx4NjlceGNhXHg1OVx4MzIiCi0JCQkiXHg2NVx4ZjJceDU0XHhlNFx4NTJceDM4XHg3Nlx4ZDEiCi0JCQkiXHg1ZVx4ZGVceDI2XHg5ZVx4ZmJceDc1XHgyZVx4MTEiCi0JCQkiXHhiNVx4MTBceGY0XHgxN1x4NzNceGY1XHg4OVx4YzciCi0JCQkiXHg0Zlx4NDNceDVjXHg4ZVx4N2NceGI5XHgwNVx4NTIiCi0JCQkiXHgyNFx4NDBceDk5XHhmZVx4OWJceDg1XHgwYlx4NmMiCi0JCQkiXHgyMlx4M2VceDhiXHhhZVx4ODZceGExXHhkMlx4NzkiCi0JCQkiXHgwNVx4NjhceDZiXHhhYlx4ZTNceDQxXHg0OVx4ZWQiCi0JCQkiXHgxNVx4YTFceDhkXHg0MFx4MmRceDYxXHhkZlx4MWEiCi0JCQkiXHg1OVx4YzlceDI2XHg4Ylx4ZWZceDMwXHg0Y1x4ODgiCi0JCQkiXHg0Ylx4MTBceGY4XHg4ZFx4YTZceDkyXHg5Zlx4NGIiCi0JCQkiXHhmM1x4YzRceDUzXHgwYlx4ODlceDVkXHgyOFx4OTIiCi0JCQkiXHhjZlx4NzhceGIyXHhjMFx4NWRceGVkXHg3ZVx4ZmMiCi0JCQkiXHhjMFx4MTJceDIzXHg1Zlx4NWFceDc4XHg4Nlx4NDMiCi0JCQkiXHg2ZVx4MjdceGY3XHg1YVx4YTdceDZhXHhlZFx4MTkiCi0JCQkiXHgwNFx4ZjBceGIzXHgxMlx4ZDFceGJkXHgwZVx4ODkiCi0JCQkiXHg2ZVx4YmNceDk2XHhhOFx4ZDhceDQ5XHgzOVx4OWYiCi0JCQkiXHg3ZVx4NjdceGYwXHgyZVx4M2VceDAxXHhhOVx4YmEiCi0JCQkiXHhlY1x4OGJceDYyXHg4ZVx4Y2JceDRhXHg3MFx4NDMiCi0JCQkiXHhjN1x4YzJceGM0XHhjYVx4ODJceDAzXHg3M1x4ZTkiCi0JCQkiXHgxMVx4ZGZceGNmXHg1NFx4ZWFceGM5XHhiMFx4OTUiCi0JCQkiXHg1MVx4YzBceDEzXHgzZFx4OTJceDA1XHhmYVx4ZjQiCi0JCQkiXHhhOVx4MzRceGM4XHhjZVx4NmNceDNkXHg1NFx4Y2MiCi0JCQkiXHhjNFx4YWZceGYxXHhkY1x4MTFceDQ0XHgyNlx4YTIiCi0JCQkiXHhhZlx4ZjFceDg1XHg3NVx4N2RceDAzXHg2MVx4NjgiCi0JCQkiXHg0ZVx4NzhceGM2XHg5Mlx4N2RceDg2XHg3ZFx4NzciCi0JCQkiXHhkY1x4NzFceDcyXHhkYlx4YzZceGFlXHhhMVx4Y2IiCi0JCQkiXHg3MFx4OWFceDBiXHgxOVx4YmVceDRhXHg2Y1x4MmEiCi0JCQkiXHhlMlx4YmFceDZjXHg2NFx4OWFceDEzXHgyOFx4ZGYiCi0JCQkiXHg4NVx4NzVceGU2XHg0M1x4ZjZceDg3XHgwOFx4NjgiCi0JCQkiXHg2ZVx4YmFceDZlXHg3OVx4OWZceDA0XHhiY1x4MjMiCi0JCQkiXHg1MFx4ZjZceDMzXHg1Y1x4MWZceDI0XHgyNVx4YmUiCi0JCQkiXHgzM1x4NDdceDgwXHg0NVx4NTZceGEzXHhhN1x4ZDciCi0JCQkiXHg3YVx4YjFceDM0XHgwYlx4OTBceDNjXHg5Y1x4YWQiCi0JCQkiXHg0NFx4NWZceDllXHgwZVx4OWRceGQ0XHhiZFx4OTMiCi0JCQkiXHg1ZVx4ZmFceDNjXHhlMFx4YjBceGQ5XHhlZFx4ZjMiCi0JCQkiXHhkNlx4MmVceGZmXHgyNFx4ZDhceDcxXHg2Y1x4ZWQiCi0JCQkiXHhhZlx4NTVceGViXHgyMlx4YWNceDkzXHg2OFx4MzIiCi0JCQkiXHgwNVx4NWJceDQ3XHhkZFx4YzZceDRhXHhjYlx4YzciCi0JCQkiXHgxMFx4ZTFceDNjXHg5Mlx4MWFceGYzXHgyM1x4NzgiCi0JCQkiXHgyYlx4YTFceGQyXHg4MFx4ZjRceDEyXHhiMVx4MjAiCi0JCQkiXHg4Zlx4ZmZceDI2XHgzNVx4ZGRceGZiXHhjN1x4NGUiCi0JCQkiXHg3OFx4ZjFceDJkXHg1MFx4MTJceDc3XHhhOFx4NjAiCi0JCQkiXHg3Y1x4MGZceGY1XHgxNlx4MmZceDYzXHg3MFx4MmEiCi0JCQkiXHhjMFx4OTZceDgwXHg0ZVx4MGFceGI0XHg5M1x4MzUiCi0JCQkiXHg1ZFx4MWRceDNmXHg1Nlx4ZjdceDJmXHhiYlx4OTAiCi0JCQkiXHgxMVx4MTZceDhmXHhhMlx4ZWNceDQ3XHhiZVx4YWMiCi0JCQkiXHg1Nlx4MDFceDI2XHg1Nlx4YjFceDhjXHhiMlx4MTAiCi0JCQkiXHhmOVx4MWFceGNhXHhmNVx4ZDFceGI3XHgzOVx4MjAiCi0JCQkiXHg2M1x4ZjFceDY5XHgyMFx4NGZceDEzXHgxMlx4MWYiCi0JCQkiXHg1Ylx4NjVceGZjXHg5OFx4ZjdceGM0XHg3YVx4YmUiCi0JCQkiXHhmN1x4MjZceDRkXHgyYlx4ODRceDdiXHg0Mlx4YWQiCi0JCQkiXHhkOFx4N2FceDBhXHhiNFx4ZDhceDc0XHhiZlx4YzEiCi0JCQkiXHhmMFx4NmVceGI0XHgyOVx4YTNceGJiXHhjYVx4NDYiCi0JCQkiXHg2N1x4NzBceDZhXHgyZFx4Y2VceDBlXHhhMlx4OGEiCi0JCQkiXHhhOVx4ODdceGJmXHgwNVx4YzRceGMxXHgwNFx4YTMiCi0JCQkiXHhhYlx4ZDRceDQ1XHg0M1x4OGNceGI2XHgwMlx4YjAiCi0JCQkiXHg0MVx4YzhceGZjXHg0NFx4M2RceDU5XHhhYVx4MmUiCi0JCQkiXHg0NFx4MjFceDJhXHg4ZFx4ODhceDlkXHg1N1x4ZjQiCi0JCQkiXHhhMFx4MDJceDc3XHhiOFx4YTZceGEwXHhlNlx4NzUiCi0JCQkiXHg1Y1x4ODJceDY1XHgzZVx4MDNceDVjXHgyOVx4OGYiCi0JCQkiXHgzOFx4NTVceGFiXHgzM1x4MjZceGVmXHg5Zlx4NDMiCi0JCQkiXHg1Mlx4ZmRceDY4XHhhZlx4MzZceGI0XHhiYlx4OWEiCi0JCQkiXHg1OFx4MDlceDA5XHgxYlx4YzNceDY1XHg0Nlx4NDYiCi0JCQkiXHgxZFx4YTdceDk0XHgxOFx4MjNceDUwXHgyY1x4Y2EiCi0JCQkiXHgyY1x4NTVceDE5XHg5N1x4MDFceDlkXHg5M1x4M2IiCi0JCQkiXHg2M1x4ODZceGYyXHgwM1x4NjdceDQ1XHhkMlx4NzIiCi0JCQkiXHgyOFx4NTJceDZjXHhmNFx4ZTNceDFjXHhiNVx4MTEiCi0JCQkiXHgxM1x4ZjFceGViXHgyMVx4YzdceGQ5XHg1Nlx4ODIiCi0JCQkiXHgyYlx4ODJceDM5XHhiZFx4NjlceDU0XHhlZFx4NjIiCi0JCQkiXHhjM1x4ZTJceGRlXHg3M1x4ZDRceDZhXHgxMlx4YWUiCi0JCQkiXHgxM1x4MjFceDdmXHg0Ylx4NWJceGZjXHhiZlx4ZTgiCi0JCQkiXHgyYlx4YmVceDU2XHhiYVx4NjhceDhiXHg5YVx4YjEiCi0JCQkiXHg2ZVx4ZmFceGJmXHg3ZVx4NWFceDRiXHhmMVx4YWMiCi0JCQkiXHg5OFx4NjVceDg1XHhkMVx4OTNceDUzXHhkM1x4N2IiCi0JCQkiXHgwOVx4ZGRceDRiXHgxMFx4NmRceDg0XHhiMFx4MTMiCi0JCQkiXHg2NVx4YmRceGNmXHg1Mlx4MDlceGM0XHg4NVx4ZTIiCi0JCQkiXHg4NFx4NzRceDE1XHg2NVx4YjdceGY3XHg1MVx4YWYiCi0JCQkiXHg1NVx4YWRceGE0XHhkMVx4MjJceDU0XHg3MFx4OTQiCi0JCQkiXHhhMFx4MWNceDkwXHg0MVx4ZmRceDk5XHhkN1x4NWEiCi0JCQkiXHgzMVx4ZWZceGFhXHgyNVx4ZDBceDdmXHg0Zlx4ZWEiCi0JCQkiXHgxZFx4NTVceDQyXHhlNVx4NDlceGIwXHhkMFx4NDYiCi0JCQkiXHg2Mlx4MzZceDQzXHhiMlx4ODJceDE1XHg3NVx4NTAiCi0JCQkiXHhhNFx4NzJceGViXHg1NFx4MjdceDFmXHg4YVx4ZTQiCi0JCQkiXHg3ZFx4ZTlceDY2XHhjNVx4ZjFceDUzXHhhNFx4ZDEiCi0JCQkiXHgwY1x4ZWJceGI4XHhmOFx4YmNceGQ0XHhlMlx4ZTciCi0JCQkiXHhlMVx4ZjhceDRiXHhjYlx4YTlceGExXHhhZlx4MTUiCi0JCQkiXHg4M1x4Y2JceDcyXHhkMFx4MzNceDc5XHgwMFx4MmQiCi0JCQkiXHg5Zlx4ZDdceGYxXHgyZVx4MWVceDEwXHhlNFx4NDUiCi0JCQkiXHhjMFx4NzVceDNhXHgzOVx4ZWFceDY4XHhmN1x4NWQiCi0JCQkiXHgxYlx4NzNceDhmXHhlOVx4OGVceDBmXHg3Mlx4NDciCi0JCQkiXHhhZVx4MzVceDBhXHgzMVx4N2FceDE0XHg0ZFx4NGEiCi0JCQkiXHg2Zlx4NDdceGY3XHg3ZVx4OTFceDZlXHg3NFx4OGIiCi0JCQkiXHgyNlx4NDdceGY5XHhjM1x4ZjlceGRlXHg3MFx4ZjUiCi0JCQkiXHg2MVx4YWJceGE5XHgyN1x4OWZceDgyXHhlNFx4OWMiCi0JCQkiXHg4OVx4OTFceDNmXHgyZVx4NmFceGZkXHhiNVx4NDkiCi0JCQkiXHhlOVx4ZmRceDU5XHgxNFx4MzZceDQ5XHg0MFx4NmQiCi0JCQkiXHgzMlx4ZDhceDg1XHg0Mlx4ZjNceGE1XHhkZlx4MGMiCi0JCQkiXHhhOFx4MjdceGQ3XHg1NFx4ZTJceDYzXHgyZlx4ZjIiCi0JCQkiXHg3ZVx4OGJceDhiXHhlN1x4ZjFceDlhXHg5NVx4MzUiCi0JCQkiXHg0M1x4ZGNceDNhXHhlNFx4YjZceGY0XHhkMFx4ZGYiCi0JCQkiXHg5Y1x4Y2JceDk0XHhmM1x4MjFceGEwXHg3N1x4NTAiCi0JCQkiXHhlMlx4YzZceGM0XHhjNlx4NWZceDA5XHg2NFx4NWIiCi0JCQkiXHg5Mlx4OTBceGQ4XHhlMVx4ZDFceGVkXHg0Ylx4NDIiCi0JCQkiXHhkN1x4MzdceGFmXHg2NVx4M2RceDExXHgzOVx4YjYiCi0JCQkiXHgyNFx4OGFceDYwXHhhZVx4ZDZceDFlXHhiZlx4MGUiCi0JCQkiXHgwZFx4ZDdceGRjXHg5Nlx4MGVceDY1XHg3NVx4NGUiCi0JCQkiXHgyOVx4MDZceDlkXHhhNFx4NTFceDNhXHgxMFx4NjMiCi0JCQkiXHg4Zlx4MTdceDA3XHhkNVx4OGVceDNjXHhmNFx4MjgiCi0JCQkiXHgwMFx4NWFceDViXHgwNVx4MTlceGQ4XHhjMFx4NmMiCi0JCQkiXHhlNVx4MTVceGU0XHg5Y1x4OWRceDcxXHg5ZFx4NWUiCi0JCQkiXHg5NFx4MjlceDFhXHhhN1x4ODBceGZhXHgwZVx4MzMiCi0JCQkiXHgwM1x4ZGRceGI3XHgzZVx4OWFceGE5XHgyNlx4MTgiCi0JCQkiXHgzN1x4YTlceDY0XHgwOFx4NGRceDk0XHg1YVx4ODgiCi0JCQkiXHhjYVx4MzVceGNlXHg4MVx4MDJceGUzXHgxZlx4MWIiCi0JCQkiXHg4OVx4MWFceDc3XHg4NVx4ZTNceDQxXHg2ZFx4MzIiCi0JCQkiXHg0Mlx4MTlceDIzXHg3ZFx4YzhceDczXHhlZVx4MjUiCi0JCQkiXHg4NVx4MGRceGY4XHgzMVx4MjVceDc5XHgxYlx4NmYiCi0JCQkiXHg3OVx4MjVceGQyXHhkOFx4ZDRceDIzXHhmZFx4ZjciCi0JCQkiXHg4Mlx4MzZceDZhXHgwY1x4NDZceDIyXHgxNVx4ZTkiCi0JCQkiXHhmZlx4NzJceDQxXHg5MVx4OTFceDdkXHgzYVx4YjciCi0JCQkiXHhkZFx4NjVceDk5XHg3MFx4ZjZceDhkXHg4NFx4ZjgiCi0JCQkiXHg2N1x4MTVceDIwXHgxMVx4ZDZceGIyXHg1NVx4N2IiCi0JCQkiXHhkYlx4ODdceGVlXHhlZlx4NTVceDg5XHgyYVx4NTkiCi0JCQkiXHgyYlx4MDdceDhmXHg0M1x4OGFceDU5XHgzY1x4MDEiCi0JCQkiXHg4Ylx4NjVceDU0XHhhMVx4NjZceGQ1XHgzOFx4YmQiCi0JCQkiXHhjNlx4MzBceGE5XHhjY1x4NDlceGI2XHhhOFx4MWIiCi0JCQkiXHhiOFx4YzBceDBlXHhlM1x4NDVceDI4XHhlMlx4ZmYiCi0JCQkiXHg0MVx4OWZceDdlXHg3Y1x4ZDFceGFlXHg5ZVx4MjUiCi0JCQkiXHgzZlx4NGNceDdjXHg3Y1x4ZjRceGE4XHgyNlx4NGQiCi0JCQkiXHg1Y1x4ZmRceDRiXHgyN1x4MThceGY5XHg2MVx4NzYiCi0JCQkiXHg0OFx4YmFceDBjXHg2Ylx4YTlceDRkXHhmY1x4ZjUiCi0JCQkiXHgzYlx4MzVceDdlXHgyZlx4NGFceGE5XHhjMlx4OWEiCi0JCQkiXHhhZVx4YWJceDg2XHgwOVx4ODlceGM5XHhjMlx4NDAiCi0JCQkiXHgzOVx4MmNceDgxXHhiM1x4YjhceDE3XHg2N1x4YzIiCi0JCQkiXHgwZFx4MzJceDRhXHgzYVx4NjdceDgxXHhkN1x4MWEiCi0JCQkiXHgzNFx4NTJceGM1XHhkYlx4MGFceGY1XHg2M1x4MzkiCi0JCQkiXHhlYVx4MWZceGUxXHg3Y1x4YTFceDllXHhjMVx4MzUiCi0JCQkiXHhlM1x4YjFceDE4XHg0NVx4NjdceGY5XHgyMlx4MzgiCi0JCQkiXHg5NVx4ZDlceDM0XHgzNFx4ODZceGM2XHg0MVx4OTQiCi0JCQkiXHgxNVx4ZjlceDViXHg0MVx4YTZceDg3XHg4Ylx4ZjgiCi0JCQkiXHhkNVx4ZTFceDFiXHhlMlx4NWJceGYzXHg4Nlx4MTAiCi0JCQkiXHhmZlx4ZTZceGFlXHg2OVx4NzZceGJjXHgwZFx4YjQiCi0JCQkiXHgwOVx4OTBceDBjXHhhMlx4NjVceDBjXHhhZFx4NzQiCi0JCQkiXHhmNVx4ZDdceGZmXHhkYVx4YzFceGNlXHg4NVx4YmUiCi0JCQkiXHgwMFx4YTdceGZmXHg0ZFx4MmZceDY1XHhkM1x4OGMiCi0JCQkiXHg4Nlx4MmRceDA1XHhlOFx4ZWRceDNlXHg2Ylx4OGIiCi0JCQkiXHgwZlx4M2RceDgzXHg4Y1x4ZjFceDFkXHg1Ylx4OTYiCi0JCQkiXHgyZVx4YjFceDljXHhjMlx4OThceGUxXHg3MFx4YjkiCi0JCQkiXHhiYVx4NWNceDhhXHg0M1x4ZDZceDM0XHhhN1x4MmQiCi0JCQkiXHhjOVx4OTJceGFlXHhmMlx4YTVceDdiXHgwNVx4NDkiCi0JCQkiXHhhN1x4MzNceDM0XHg4Nlx4Y2FceGU0XHg5Nlx4MjMiCi0JCQkiXHg3Nlx4NWJceGYyXHhjNlx4ZjFceDUxXHgyOFx4NDIiCi0JCQkiXHg3Ylx4Y2NceDc2XHg4Zlx4ZmFceGEyXHhhZFx4MzEiCi0JCQkiXHhkNFx4ZDZceDdhXHg2ZFx4MjVceDI1XHg1NFx4ZTQiCi0JCQkiXHgzZlx4NTBceDU5XHhlMVx4NWNceDA1XHhiN1x4MjciCi0JCQkiXHg0OFx4YmZceDA3XHhlY1x4MWJceDEzXHhiZVx4MmIiCi0JCQkiXHhhMVx4NTdceDJiXHhkNVx4YWJceGQ3XHhkMFx4NGMiCi0JCQkiXHgxZVx4Y2JceDcxXHg5Ylx4YzVceDkwXHg4NVx4ZDMiCi0JCQkiXHhkZVx4NTlceGVjXHg3MVx4ZWJceDg5XHhiYlx4ZDAiCi0JCQkiXHgwOVx4NTBceGUxXHgxNlx4M2ZceGZkXHgxY1x4MzQiCi0JCQkiXHhjM1x4MWNceGExXHgxMFx4NzdceDUzXHg5OFx4ZWYiCi0JCQkiXHhmMlx4ZmRceGE1XHgwMVx4NTlceGMyXHg5Ylx4MjYiCi0JCQkiXHhjN1x4NDJceGQ5XHg0OVx4ZGFceDU4XHgyYlx4NmUiCi0JCQkiXHg5Zlx4NTNceDE5XHg3Nlx4N2VceGQ5XHhjOVx4MGUiCi0JCQkiXHg2OFx4YzhceDdmXHg1MVx4MjJceDQyXHhlZlx4NDkiCi0JCQkiXHhhNFx4NTVceGI2XHgzNlx4YWNceDA5XHhjN1x4MzEiCi0JCQkiXHg4OFx4MTVceDRiXHgyZVx4OGZceDNhXHgwOFx4ZjciCi0JCQkiXHhkOFx4ZjdceGE4XHhjNVx4YTlceDMzXHhhNlx4NDUiCi0JCQkiXHhlNFx4YzRceDk0XHg3Nlx4ZjNceDBkXHg4Zlx4N2UiCi0JCQkiXHhjOFx4ZjZceGJjXHgyM1x4MGFceGI2XHg0Y1x4ZDMiCi0JCQkiXHg2YVx4Y2RceDM2XHhjMlx4OTBceDVjXHg1Y1x4M2MiCi0JCQkiXHg2NVx4N2JceGMyXHhkNlx4Y2NceGU2XHgwZFx4ODciCi0JCQkiXHg3M1x4MmVceDcxXHg3OVx4MTZceDA2XHg2M1x4MjgiCi0JCQkiXHgwOVx4MTVceGQ4XHg4OVx4MzhceDM4XHgzZFx4YjUiCi0JCQkiXHg0Mlx4MWNceDA4XHgyNFx4ZjdceDJhXHhkMlx4OWQiCi0JCQkiXHhjOFx4Y2FceGVmXHhmOVx4MjdceGQ4XHgwN1x4ODYiCi0JCQkiXHhmN1x4NDNceDBiXHg1NVx4MTVceDNmXHg5Zlx4ODMiCi0JCQkiXHhlZlx4ZGNceDQ5XHg5ZFx4MmFceGMxXHg1NFx4NjIiCi0JCQkiXHhiZFx4OWJceDY2XHg1NVx4OWZceGI3XHgxMlx4ZjMiCi0JCQkiXHgxYlx4NGRceDlkXHgyYVx4NWNceGVkXHg4N1x4NzUiCi0JCQkiXHg4N1x4MjZceGVjXHg2MVx4MmNceGI0XHgwZlx4ODkiCi0JCQkiXHhiMFx4ZmJceDJlXHg2OFx4NWRceDE1XHhjN1x4OGQiCi0JCQkiXHgyZVx4YzBceGQ5XHhlY1x4YWZceDRmXHhkMlx4MjUiCi0JCQkiXHgyOVx4ZThceGQyXHgyNlx4MmJceDY3XHhlOVx4ZmMiCi0JCQkiXHgyYlx4YThceDY3XHg5Nlx4MTJceDFmXHg1Ylx4OTYiCi0JCQkiXHhjNlx4MTRceDUzXHhhZlx4NDRceGVhXHhkNlx4ZTIiCi0JCQkiXHg5NFx4OThceGU0XHgxMlx4OTNceDRjXHg5Mlx4ZTAiCi0JCQkiXHgxOFx4YTVceDhkXHgyZFx4ZTRceDcxXHgzY1x4NDciCi0JCQkiXHg0Y1x4ZjdceGU2XHg0N1x4OWVceGMwXHg2OFx4ZGYiCi0JCQkiXHhkNFx4ZjVceDVhXHg3NFx4YjFceDJiXHgyOVx4MDMiCi0JCQkiXHgxOVx4MDdceGFmXHg5MFx4NjJceDVjXHg2OFx4OTgiCi0JCQkiXHg0OFx4MTZceDExXHgwMlx4OWRceGVlXHhiNFx4OWIiCi0JCQkiXHhlNVx4NDJceDdmXHgwOFx4ZmRceDE2XHgzMlx4MGIiCi0JCQkiXHhkMFx4YjNceGZhXHgyYlx4YjdceDk5XHhmOVx4MjkiCi0JCQkiXHhjZFx4MjBceDQ1XHg5Zlx4YjNceDFhXHg1ZFx4YTIiCi0JCQkiXHhhZlx4NGRceGUwXHhiZFx4NDJceDBkXHhiY1x4NzQiCi0JCQkiXHg5OVx4OWNceDhlXHg1M1x4MWFceGI0XHgzZVx4YmQiCi0JCQkiXHhhMlx4OWFceDJkXHhmN1x4ZjhceDM5XHgwZlx4NjciCi0JCQkiXHg2M1x4ZmNceDZiXHhjMFx4YWZceGIzXHg0Ylx4NGYiCi0JCQkiXHg1NVx4YzRceGNmXHhhN1x4YzhceDA0XHgxMVx4M2UiCi0JCQkiXHgxNFx4MzJceGJiXHgxYlx4MzhceDc3XHhkNlx4N2YiCi0JCQkiXHg1NFx4NGNceGRmXHg3NVx4ZjNceDA3XHgyZFx4MzMiCi0JCQkiXHg5Ylx4YThceDIwXHhlMVx4N2JceDEyXHhiNVx4ZjMiCi0JCQkiXHhlZlx4MmZceGNlXHg3Mlx4ZTVceDI0XHg2MFx4YzEiCi0JCQkiXHgzMFx4ZTJceGFiXHhhMVx4OGVceDExXHgwOVx4YTgiCi0JCQkiXHgyMVx4MzNceDQ0XHhmZVx4N2ZceDM1XHgzMlx4OTMiCi0JCQkiXHgzOVx4YTdceGFkXHg4Ylx4NzlceDA2XHhiMlx4Y2IiCi0JCQkiXHg0ZVx4YTlceDVmXHhjN1x4YmFceDc0XHgyOVx4ZWMiCi0JCQkiXHg5M1x4YTBceDRlXHg1NFx4OTNceGMwXHhiY1x4NTUiCi0JCQkiXHg2NFx4ZjBceDQ4XHhlNVx4NTdceDk5XHhlZVx4NzUiCi0JCQkiXHhkNlx4NzlceDBmXHg2Nlx4YjdceGM2XHg1N1x4NzYiCi0JCQkiXHhmN1x4YjdceGYzXHg5Y1x4YzVceDYwXHhlOFx4N2YiCi0JCQkiXHg4M1x4NzZceGQ2XHgwZVx4YWFceGU2XHg5MFx4MzkiCi0JCQkiXHgxZFx4YTZceDMyXHg2YVx4MzRceGUzXHg1NVx4ZjgiCi0JCQkiXHg1OFx4YTBceDU4XHg3ZFx4MzNceGUwXHgyMlx4MzkiCi0JCQkiXHg0NFx4NjRceDg3XHg4Nlx4NWFceDJmXHhhN1x4N2UiCi0JCQkiXHgwZlx4MzhceGVhXHhiMFx4MzBceGNjXHg2MVx4YTUiCi0JCQkiXHg2YVx4MzJceGFlXHgxZVx4ZjdceGU5XHhkMFx4YTkiCi0JCQkiXHgwY1x4MzJceDRiXHhiNVx4NDlceDI4XHhhYlx4ODUiCi0JCQkiXHgyZlx4OGVceDAxXHgzNlx4MzhceDUyXHhkMFx4YmEiCi0JCQkiXHhkNlx4MDJceDc4XHhmOFx4MGVceDNlXHg5Y1x4OGIiCi0JCQkiXHg2Ylx4NDVceDk5XHgzZlx4NWNceGZlXHg1OFx4ZjEiCi0JCQkiXHg1Y1x4OTRceDA0XHhlMVx4ZjVceDE4XHg2ZFx4NTEiCi0JCQkiXHhiMlx4NWRceDE4XHgyMFx4YjZceGMyXHg5YVx4NDIiCi0JCQkiXHgxZFx4YjNceGFiXHgzY1x4YjZceDNhXHgxM1x4MDMiCi0JCQkiXHhiMlx4NDZceDgyXHg0Zlx4ZmNceDY0XHhiY1x4NGYiCi0JCQkiXHhjYVx4ZmFceDljXHhjMFx4ZDVceGE3XHhiZFx4MTEiCi0JCQkiXHhiN1x4ZTRceDVhXHhmNlx4NmZceDRkXHg0ZFx4NTQiCi0JCQkiXHhlYVx4YTRceDk4XHg2Nlx4ZDRceDIyXHgzYlx4ZDMiCi0JCQkiXHg4Zlx4MzRceDQ3XHhkOVx4N2NceGY0XHg3Mlx4M2IiCi0JCQkiXHg0ZFx4MDJceDc3XHhmNlx4ZDZceGRkXHgwOFx4MGEiCi0JCQkiXHg4MVx4ZTFceDg2XHg4OVx4M2VceDU2XHgxMFx4M2MiCi0JCQkiXHhiYVx4ZDdceDgxXHg4Y1x4MDhceGJjXHg4Ylx4ZTIiCi0JCQkiXHg1M1x4ZWNceGE3XHg4OVx4ZWVceGM4XHg1Nlx4YjUiCi0JCQkiXHgzNlx4MmNceGIyXHgwM1x4YmFceDk5XHhkZFx4N2MiCi0JCQkiXHg0OFx4YTBceGIwXHhiY1x4OTFceDMzXHhlOVx4YTgiCi0JCQkiXHhjYlx4Y2RceGNmXHg1OVx4NWZceDFmXHgxNVx4ZTIiCi0JCQkiXHg1Nlx4ZjVceDRlXHgwMVx4MzVceDI3XHg0NVx4NzciCi0JCQkiXHg0N1x4YzhceGJjXHhjYlx4N2VceDM5XHhjMVx4OTciCi0JCQkiXHgyOFx4ZDNceDg0XHhmY1x4MmNceDNlXHhjOFx4YWQiCi0JCQkiXHg5Y1x4ZjhceDhhXHg2MVx4OWNceDI4XHhhYVx4YzUiCi0JCQkiXHg5OVx4MjBceDQzXHg4NVx4OWRceGE1XHhlMlx4OGIiCi0JCQkiXHhiOFx4YWVceGViXHhkMFx4MzJceDBkXHg1Mlx4NzgiCi0JCQkiXHgwOVx4NTZceDNmXHhjN1x4ZDhceDdlXHgyNlx4ZmMiCi0JCQkiXHgzN1x4ZmJceDZmXHgwNFx4ZmNceGZhXHg5Mlx4MTAiCi0JCQkiXHhhY1x4ZjhceDNlXHgyMVx4ZGNceDhjXHgyMVx4MTYiCi0JCQkiXHg3ZFx4NjdceDZlXHhmNlx4Y2RceGRhXHhiNlx4OTgiCi0JCQkiXHgyM1x4YWJceDIzXHgzY1x4YjJceDEwXHhhMFx4NTMiCi0JCQkiXHg1YVx4NTZceDlmXHhjNVx4ZDBceGZmXHhiYlx4ZTQiCi0JCQkiXHg5OFx4M2NceDY5XHgxZVx4ZGJceDM4XHg4Zlx4N2UiCi0JCQkiXHgwZlx4ZDJceDk4XHg4OFx4ODFceDhiXHg0NVx4NjciCi0JCQkiXHhlYVx4MzNceGYxXHhlYlx4ZTlceDk3XHg1NVx4MmUiCi0JCQkiXHhkOVx4YWFceGViXHg1YVx4ZWNceGRhXHhlMVx4NjgiCi0JCQkiXHhhOFx4OWRceDNjXHg4NFx4N2NceDA1XHgzZFx4NjIiCi0JCQkiXHg4N1x4OGZceDAzXHgyMVx4MjhceDk1XHgwY1x4ODkiCi0JCQkiXHgyNVx4MjJceDRhXHhiMFx4OTNceGE5XHg1MFx4YTIiCi0JCQkiXHgyZlx4NTdceDZlXHgxOFx4NDJceDE5XHg1NFx4MGMiCi0JCQkiXHg1NVx4NjdceGM2XHgxMVx4NDlceGY0XHg1Y1x4ZDIiCi0JCQkiXHhlOVx4M2RceGRkXHg4Ylx4NDhceDcxXHgyMVx4MDAiCi0JCQkiXHhjM1x4OWFceDZjXHg4NVx4NzRceDI4XHg4M1x4NGEiCi0JCQkiXHgxYlx4MzFceDA1XHhlMVx4MDZceDkyXHhlN1x4ZGEiCi0JCQkiXHg4NVx4NzNceDc4XHg0NVx4MjBceDdmXHhhZVx4MTMiCi0JCQkiXHg3Y1x4MzNceDA2XHgyMlx4ZjRceDgzXHhmOVx4MzUiCi0JCQkiXHgzZlx4NmNceDcxXHhhOFx4NGVceDQ4XHhiZVx4OWIiCi0JCQkiXHhjZVx4OGFceGJhXHhkYVx4YmVceDI4XHgwOFx4ZjciCi0JCQkiXHhlMlx4MTRceDhjXHg3MVx4ZWFceDcyXHhmOVx4MzMiCi0JCQkiXHhmMlx4ODhceDNmXHhkN1x4YmJceDY5XHg2Y1x4MjkiCi0JCQkiXHgxOVx4ZGNceDg0XHhjZVx4MWZceDEyXHg0Zlx4YzgiCi0JCQkiXHhhZlx4YTVceDA0XHhiYVx4NWFceGFiXHhiMFx4ZDkiCi0JCQkiXHgxNFx4MWZceDZjXHg2OFx4OThceDM5XHg4OVx4N2EiCi0JCQkiXHhkOVx4ZDhceDJmXHhkZlx4YThceDQ3XHg0YVx4MjUiCi0JCQkiXHhlMlx4ZmJceDMzXHhmNFx4NTlceDc4XHhlMVx4NjgiCi0JCQkiXHg4NVx4Y2ZceGZlXHg1OVx4MjBceGQ0XHgwNVx4MWQiCi0JCQkiXHg4MFx4OTlceGFlXHhiY1x4Y2FceGFlXHgwZlx4MmYiCi0JCQkiXHg2NVx4NDNceDM0XHg4ZVx4N2VceGFjXHhkM1x4OTMiCi0JCQkiXHgyZlx4YWNceDZkXHgxNFx4M2RceDAyXHgwN1x4NzAiCi0JCQkiXHg5ZFx4YTRceGYzXHgxYlx4NWNceDM2XHhmY1x4MDEiCi0JCQkiXHg3M1x4MzRceDg1XHgwY1x4NmNceGQ2XHhmMVx4YmQiCi0JCQkiXHgzZlx4ZGZceGVlXHhmNVx4ZDlceGJhXHg1Nlx4ZWYiCi0JCQkiXHhmNFx4OWJceDZiXHhlZVx4OWZceDVhXHg3OFx4NmQiCi0JCQkiXHgzMlx4MTlceGY0XHhmN1x4ZjhceDRjXHg2OVx4MGIiCi0JCQkiXHg0Ylx4YmNceGJiXHhiN1x4ZjJceDg1XHhhZlx4NzAiCi0JCQkiXHg3NVx4MjRceDZjXHg1NFx4YTdceDBlXHg0ZFx4MWQiCi0JCQkiXHgwMVx4YmZceDA4XHhhY1x4Y2ZceDdmXHgyY1x4ZTMiCi0JCQkiXHgxNFx4ODlceDVlXHg3MFx4NWFceDk5XHg5Mlx4Y2QiCi0JCQkiXHgwMVx4ODRceGM4XHhkMlx4YWJceGU1XHg0Zlx4NTgiCi0JCQkiXHhlN1x4MGZceDJmXHgwZVx4ZmZceDY4XHhlYVx4ZmQiCi0JCQkiXHgxNVx4YjNceDE3XHhlNlx4YjBceGU3XHg4NVx4ZDgiCi0JCQkiXHgyM1x4MmVceDA1XHhjN1x4YzlceGM0XHg0Nlx4MWYiCi0JCQkiXHhlMVx4OWVceDQ5XHgyMFx4MjNceDI0XHg0ZFx4N2UiCi0JCQkiXHgyOVx4NjVceGZmXHhmNFx4YjZceGZkXHgxYVx4ODUiCi0JCQkiXHhjNFx4MTZceGVjXHhmY1x4ZWFceDdiXHhkNlx4MmMiCi0JCQkiXHg0M1x4ZjhceGI3XHhiZlx4NzlceGMwXHg4NVx4Y2QiCi0JCQkiXHhlZlx4ZTFceDk4XHhkM1x4YTVceGY3XHg5MFx4OGMiCi0JCQkiXHhlOVx4N2ZceDgwXHg2Ylx4ZDJceGFjXHg0Y1x4MzAiCi0JCQkiXHhhN1x4YzZceDYxXHg2Y1x4ZDJceGY5XHgyY1x4ZmYiCi0JCQkiXHgzMFx4YmNceDIyXHg4MVx4N2RceDkzXHgxMlx4ZTQiCi0JCQkiXHgwYVx4Y2RceGFmXHhkZFx4ZThceGFiXHgwYVx4MWUiCi0JCQkiXHgxM1x4YTRceDI3XHhjM1x4NWZceGY3XHg0Ylx4YmIiCi0JCQkiXHgzN1x4MDlceDRiXHg5MVx4NmZceDkyXHg0Zlx4YWYiCi0JCQkiXHg1Mlx4ZWVceGRmXHhlZlx4MDlceDZmXHhmN1x4NWMiCi0JCQkiXHg2ZVx4MTJceDE3XHg3Mlx4NjNceDU3XHhjN1x4YmEiCi0JCQkiXHgzYlx4NmJceDM4XHgzMlx4NzNceDFiXHg5Y1x4ODAiCi0JCQkiXHhjMVx4N2FceGM2XHhjZlx4Y2RceDM1XHhjMFx4NmIiCi0JCQkiXHgzMVx4MWFceDZiXHhlOVx4ZDhceDJjXHgyOVx4M2YiCi0JCQkiXHg5Nlx4ZmJceGI2XHhjZFx4MTNceDkxXHgzYlx4YzIiCi0JCQkiXHhkMlx4YTNceDMxXHg4ZFx4YTRceGNkXHg1N1x4Y2QiCi0JCQkiXHgxM1x4M2RceDY0XHhmZFx4MDZceGNlXHhlNlx4ZGMiCi0JCQkiXHgwY1x4MjRceDQzXHgzMVx4NDBceDU3XHhmMVx4NzIiCi0JCQkiXHgxN1x4ZTNceDNhXHg2M1x4NmRceDM1XHhjZlx4NWQiCi0JCQkiXHg5N1x4NDBceDU5XHhkZFx4ZjdceDNjXHgwMlx4ZjciCi0JCQkiXHgxY1x4N2VceDA1XHhiYlx4YTlceDBkXHgwMVx4YjEiCi0JCQkiXHg4ZVx4YzBceDMwXHhhOVx4NTNceDI0XHhjOVx4ODkiCi0JCQkiXHg4NFx4NmRceGFhXHhkMFx4Y2RceDkxXHhjMlx4NGQiCi0JCQkiXHg5MVx4YjBceDg5XHhlMlx4YmZceDgzXHg0NFx4YWEiCi0JCQkiXHgyOFx4NzJceDIzXHhhMFx4YzJceGFkXHhhZFx4MWMiCi0JCQkiXHhmY1x4M2ZceDA5XHg3YVx4MGJceGRjXHhjNVx4MWIiCi0JCQkiXHg4N1x4MTNceGM2XHg1Ylx4NTlceDhkXHhmMlx4YzgiCi0JCQkiXHhhZlx4ZGZceDExXHg5NSIsCi0JCS5ybGVuID0gNDEwMCwKLQl9LAotfTsKLQotLyoKLSAqIENUUyAoQ2lwaGVyIFRleHQgU3RlYWxpbmcpIG1vZGUgdGVzdHMKLSAqLwotI2RlZmluZSBDVFNfTU9ERV9FTkNfVEVTVF9WRUNUT1JTIDYKLSNkZWZpbmUgQ1RTX01PREVfREVDX1RFU1RfVkVDVE9SUyA2Ci1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGN0c19tb2RlX2VuY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogZnJvbSByZmMzOTYyICovCi0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5pbGVuCT0gMTcsCi0JCS5pbnB1dCAgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCi0JCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKLQkJCSAgIlx4MjAiLAotCQkucmxlbgk9IDE3LAotCQkucmVzdWx0CT0gIlx4YzZceDM1XHgzNVx4NjhceGYyXHhiZlx4OGNceGI0IgotCQkJICAiXHhkOFx4YTVceDgwXHgzNlx4MmRceGE3XHhmZlx4N2YiCi0JCQkgICJceDk3IiwKLQl9LCB7Ci0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5pbGVuICAgPSAzMSwKLQkJLmlucHV0ICA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKLQkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgotCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCi0JCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwIiwKLQkJLnJsZW4gICA9IDMxLAotCQkucmVzdWx0ID0gIlx4ZmNceDAwXHg3OFx4M2VceDBlXHhmZFx4YjJceGMxIgotCQkJICAiXHhkNFx4NDVceGQ0XHhjOFx4ZWZceGY3XHhlZFx4MjIiCi0JCQkgICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMCIKLQkJCSAgIlx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTUiLAotCX0sIHsKLQkJLmtsZW4JPSAxNiwKLQkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKLQkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKLQkJLmlsZW4gICA9IDMyLAotCQkuaW5wdXQgID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgotCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCi0JCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKLQkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjBceDQzIiwKLQkJLnJsZW4gICA9IDMyLAotCQkucmVzdWx0ID0gIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1IgotCQkJICAiXHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNVx4YTgiCi0JCQkgICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMCIKLQkJCSAgIlx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTVceDg0IiwKLQl9LCB7Ci0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5pbGVuICAgPSA0NywKLQkJLmlucHV0ICA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKLQkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgotCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCi0JCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIKLQkJCSAgIlx4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MmNceDIwIgotCQkJICAiXHg3MFx4NmNceDY1XHg2MVx4NzNceDY1XHgyYyIsCi0JCS5ybGVuICAgPSA0NywKLQkJLnJlc3VsdCA9ICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMCIKLQkJCSAgIlx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTVceDg0IgotCQkJICAiXHhiM1x4ZmZceGZkXHg5NFx4MGNceDE2XHhhMVx4OGMiCi0JCQkgICJceDFiXHg1NVx4NDlceGQyXHhmOFx4MzhceDAyXHg5ZSIKLQkJCSAgIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1IgotCQkJICAiXHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNSIsCi0JfSwgewotCQkua2xlbgk9IDE2LAotCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgotCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAotCQkuaWxlbiAgID0gNDgsCi0JCS5pbnB1dCAgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCi0JCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKLQkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgotCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMFx4NDMiCi0JCQkgICJceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDJjXHgyMCIKLQkJCSAgIlx4NzBceDZjXHg2NVx4NjFceDczXHg2NVx4MmNceDIwIiwKLQkJLnJsZW4gICA9IDQ4LAotCQkucmVzdWx0ID0gIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgotCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCi0JCQkgICJceDlkXHhhZFx4OGJceGJiXHg5Nlx4YzRceGNkXHhjMCIKLQkJCSAgIlx4M2JceGMxXHgwM1x4ZTFceGExXHg5NFx4YmJceGQ4IgotCQkJICAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCi0JCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1XHhhOCIsCi0JfSwgewotCQkua2xlbgk9IDE2LAotCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgotCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAotCQkuaWxlbiAgID0gNjQsCi0JCS5pbnB1dCAgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCi0JCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKLQkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgotCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMFx4NDMiCi0JCQkgICJceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDJjXHgyMCIKLQkJCSAgIlx4NzBceDZjXHg2NVx4NjFceDczXHg2NVx4MmNceDIwIgotCQkJICAiXHg2MVx4NmVceDY0XHgyMFx4NzdceDZmXHg2ZVx4NzQiCi0JCQkgICJceDZmXHg2ZVx4MjBceDczXHg2Zlx4NzVceDcwXHgyZSIsCi0JCS5ybGVuICAgPSA2NCwKLQkJLnJlc3VsdCA9ICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMCIKLQkJCSAgIlx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTVceDg0IgotCQkJICAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCi0JCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1XHhhOCIKLQkJCSAgIlx4NDhceDA3XHhlZlx4ZThceDM2XHhlZVx4ODlceGE1IgotCQkJICAiXHgyNlx4NzNceDBkXHhiY1x4MmZceDdiXHhjOFx4NDAiCi0JCQkgICJceDlkXHhhZFx4OGJceGJiXHg5Nlx4YzRceGNkXHhjMCIKLQkJCSAgIlx4M2JceGMxXHgwM1x4ZTFceGExXHg5NFx4YmJceGQ4IiwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGN0c19tb2RlX2RlY190dl90ZW1wbGF0ZVtdID0gewotCXsgLyogZnJvbSByZmMzOTYyICovCi0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5ybGVuCT0gMTcsCi0JCS5yZXN1bHQgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCi0JCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKLQkJCSAgIlx4MjAiLAotCQkuaWxlbgk9IDE3LAotCQkuaW5wdXQJPSAiXHhjNlx4MzVceDM1XHg2OFx4ZjJceGJmXHg4Y1x4YjQiCi0JCQkgICJceGQ4XHhhNVx4ODBceDM2XHgyZFx4YTdceGZmXHg3ZiIKLQkJCSAgIlx4OTciLAotCX0sIHsKLQkJLmtsZW4JPSAxNiwKLQkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKLQkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKLQkJLnJsZW4gICA9IDMxLAotCQkucmVzdWx0ID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgotCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCi0JCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKLQkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjAiLAotCQkuaWxlbiAgID0gMzEsCi0JCS5pbnB1dCAgPSAiXHhmY1x4MDBceDc4XHgzZVx4MGVceGZkXHhiMlx4YzEiCi0JCQkgICJceGQ0XHg0NVx4ZDRceGM4XHhlZlx4ZjdceGVkXHgyMiIKLQkJCSAgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgotCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNSIsCi0JfSwgewotCQkua2xlbgk9IDE2LAotCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgotCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAotCQkucmxlbiAgID0gMzIsCi0JCS5yZXN1bHQgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCi0JCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKLQkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgotCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMFx4NDMiLAotCQkuaWxlbiAgID0gMzIsCi0JCS5pbnB1dCAgPSAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCi0JCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1XHhhOCIKLQkJCSAgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgotCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiLAotCX0sIHsKLQkJLmtsZW4JPSAxNiwKLQkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKLQkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKLQkJLnJsZW4gICA9IDQ3LAotCQkucmVzdWx0ID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgotCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCi0JCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKLQkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjBceDQzIgotCQkJICAiXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyY1x4MjAiCi0JCQkgICJceDcwXHg2Y1x4NjVceDYxXHg3M1x4NjVceDJjIiwKLQkJLmlsZW4gICA9IDQ3LAotCQkuaW5wdXQgID0gIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgotCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCi0JCQkgICJceGIzXHhmZlx4ZmRceDk0XHgwY1x4MTZceGExXHg4YyIKLQkJCSAgIlx4MWJceDU1XHg0OVx4ZDJceGY4XHgzOFx4MDJceDllIgotCQkJICAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCi0JCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1IiwKLQl9LCB7Ci0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5ybGVuICAgPSA0OCwKLQkJLnJlc3VsdCA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKLQkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgotCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCi0JCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIKLQkJCSAgIlx4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MmNceDIwIgotCQkJICAiXHg3MFx4NmNceDY1XHg2MVx4NzNceDY1XHgyY1x4MjAiLAotCQkuaWxlbiAgID0gNDgsCi0JCS5pbnB1dCAgPSAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCi0JCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIKLQkJCSAgIlx4OWRceGFkXHg4Ylx4YmJceDk2XHhjNFx4Y2RceGMwIgotCQkJICAiXHgzYlx4YzFceDAzXHhlMVx4YTFceDk0XHhiYlx4ZDgiCi0JCQkgICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKLQkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IiwKLQl9LCB7Ci0JCS5rbGVuCT0gMTYsCi0JCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCi0JCS5ybGVuICAgPSA2NCwKLQkJLnJlc3VsdCA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKLQkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgotCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCi0JCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIKLQkJCSAgIlx4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MmNceDIwIgotCQkJICAiXHg3MFx4NmNceDY1XHg2MVx4NzNceDY1XHgyY1x4MjAiCi0JCQkgICJceDYxXHg2ZVx4NjRceDIwXHg3N1x4NmZceDZlXHg3NCIKLQkJCSAgIlx4NmZceDZlXHgyMFx4NzNceDZmXHg3NVx4NzBceDJlIiwKLQkJLmlsZW4gICA9IDY0LAotCQkuaW5wdXQgID0gIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgotCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCi0JCQkgICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKLQkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IgotCQkJICAiXHg0OFx4MDdceGVmXHhlOFx4MzZceGVlXHg4OVx4YTUiCi0JCQkgICJceDI2XHg3M1x4MGRceGJjXHgyZlx4N2JceGM4XHg0MCIKLQkJCSAgIlx4OWRceGFkXHg4Ylx4YmJceDk2XHhjNFx4Y2RceGMwIgotCQkJICAiXHgzYlx4YzFceDAzXHhlMVx4YTFceDk0XHhiYlx4ZDgiLAotCX0KLX07Ci0KLS8qCi0gKiBDb21wcmVzc2lvbiBzdHVmZi4KLSAqLwotI2RlZmluZSBDT01QX0JVRl9TSVpFICAgICAgICAgICA1MTIKLQotc3RydWN0IGNvbXBfdGVzdHZlYyB7Ci0JaW50IGlubGVuLCBvdXRsZW47Ci0JY2hhciBpbnB1dFtDT01QX0JVRl9TSVpFXTsKLQljaGFyIG91dHB1dFtDT01QX0JVRl9TSVpFXTsKLX07Ci0KLS8qCi0gKiBEZWZsYXRlIHRlc3QgdmVjdG9ycyAobnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MpLgotICogUGFyYW1zOiB3aW5iaXRzPTExLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIE1BWF9NRU1fTEVWRUwuCi0gKi8KLSNkZWZpbmUgREVGTEFURV9DT01QX1RFU1RfVkVDVE9SUyAyCi0jZGVmaW5lIERFRkxBVEVfREVDT01QX1RFU1RfVkVDVE9SUyAyCi0KLXN0YXRpYyBzdHJ1Y3QgY29tcF90ZXN0dmVjIGRlZmxhdGVfY29tcF90dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmlubGVuCT0gNzAsCi0JCS5vdXRsZW4JPSAzOCwKLQkJLmlucHV0CT0gIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIgotCQkJIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIiwKLQkJLm91dHB1dAk9ICJceGYzXHhjYVx4Y2ZceGNjXHg1M1x4MjhceDJkXHg1NiIKLQkJCSAgIlx4YzhceGNiXHgyZlx4NTdceDQ4XHhjY1x4NGJceDUxIgotCQkJICAiXHgyOFx4Y2VceDQ4XHgyY1x4NGFceDU1XHgyOFx4YzkiCi0JCQkgICJceDQ4XHg1NVx4MjhceGNlXHg0Zlx4MmJceDI5XHgwNyIKLQkJCSAgIlx4NzFceGJjXHgwOFx4MmJceDAxXHgwMCIsCi0JfSwgewotCQkuaW5sZW4JPSAxOTEsCi0JCS5vdXRsZW4JPSAxMjIsCi0JCS5pbnB1dAk9ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhIGNvbXByZXNzaW9uIG1ldGhvZCBiYXNlZCBvbiB0aGUgREVGTEFURSIKLQkJCSJjb21wcmVzc2lvbiBhbGdvcml0aG0uICBUaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG9mICIKLQkJCSJ0aGUgREVGTEFURSBhbGdvcml0aG0gdG8gdGhlIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wuIiwKLQkJLm91dHB1dAk9ICJceDVkXHg4ZFx4MzFceDBlXHhjMlx4MzBceDEwXHgwNCIKLQkJCSAgIlx4YmZceGIyXHgyZlx4YzhceDFmXHgxMFx4MDRceDA5IgotCQkJICAiXHg4OVx4YzJceDg1XHgzZlx4NzBceGIxXHgyZlx4ZjgiCi0JCQkgICJceDI0XHhkYlx4NjdceGQ5XHg0N1x4YzFceGVmXHg0OSIKLQkJCSAgIlx4NjhceDEyXHg1MVx4YWVceDc2XHg2N1x4ZDZceDI3IgotCQkJICAiXHgxOVx4ODhceDFhXHhkZVx4ODVceGFiXHgyMVx4ZjIiCi0JCQkgICJceDA4XHg1ZFx4MTZceDFlXHgyMFx4MDRceDJkXHhhZCIKLQkJCSAgIlx4ZjNceDE4XHhhMlx4MTVceDg1XHgyZFx4NjlceGM0IgotCQkJICAiXHg0Mlx4ODNceDIzXHhiNlx4NmNceDg5XHg3MVx4OWIiCi0JCQkgICJceGVmXHhjZlx4OGJceDlmXHhjZlx4MzNceGNhXHgyZiIKLQkJCSAgIlx4ZWRceDYyXHhhOVx4NGNceDgwXHhmZlx4MTNceGFmIgotCQkJICAiXHg1Mlx4MzdceGVkXHgwZVx4NTJceDZiXHg1OVx4MDIiCi0JCQkgICJceGQ5XHg0ZVx4ZThceDdhXHg3Nlx4MWRceDAyXHg5OCIKLQkJCSAgIlx4ZmVceDhhXHg4N1x4ODNceGEzXHg0Zlx4NTZceDhhIgotCQkJICAiXHhiOFx4OWVceDhlXHg1Y1x4NTdceGQzXHhhMFx4NzkiCi0JCQkgICJceGZhXHgwMiIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY29tcF90ZXN0dmVjIGRlZmxhdGVfZGVjb21wX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkuaW5sZW4JPSAxMjIsCi0JCS5vdXRsZW4JPSAxOTEsCi0JCS5pbnB1dAk9ICJceDVkXHg4ZFx4MzFceDBlXHhjMlx4MzBceDEwXHgwNCIKLQkJCSAgIlx4YmZceGIyXHgyZlx4YzhceDFmXHgxMFx4MDRceDA5IgotCQkJICAiXHg4OVx4YzJceDg1XHgzZlx4NzBceGIxXHgyZlx4ZjgiCi0JCQkgICJceDI0XHhkYlx4NjdceGQ5XHg0N1x4YzFceGVmXHg0OSIKLQkJCSAgIlx4NjhceDEyXHg1MVx4YWVceDc2XHg2N1x4ZDZceDI3IgotCQkJICAiXHgxOVx4ODhceDFhXHhkZVx4ODVceGFiXHgyMVx4ZjIiCi0JCQkgICJceDA4XHg1ZFx4MTZceDFlXHgyMFx4MDRceDJkXHhhZCIKLQkJCSAgIlx4ZjNceDE4XHhhMlx4MTVceDg1XHgyZFx4NjlceGM0IgotCQkJICAiXHg0Mlx4ODNceDIzXHhiNlx4NmNceDg5XHg3MVx4OWIiCi0JCQkgICJceGVmXHhjZlx4OGJceDlmXHhjZlx4MzNceGNhXHgyZiIKLQkJCSAgIlx4ZWRceDYyXHhhOVx4NGNceDgwXHhmZlx4MTNceGFmIgotCQkJICAiXHg1Mlx4MzdceGVkXHgwZVx4NTJceDZiXHg1OVx4MDIiCi0JCQkgICJceGQ5XHg0ZVx4ZThceDdhXHg3Nlx4MWRceDAyXHg5OCIKLQkJCSAgIlx4ZmVceDhhXHg4N1x4ODNceGEzXHg0Zlx4NTZceDhhIgotCQkJICAiXHhiOFx4OWVceDhlXHg1Y1x4NTdceGQzXHhhMFx4NzkiCi0JCQkgICJceGZhXHgwMiIsCi0JCS5vdXRwdXQJPSAiVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYSBjb21wcmVzc2lvbiBtZXRob2QgYmFzZWQgb24gdGhlIERFRkxBVEUiCi0JCQkiY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBvZiAiCi0JCQkidGhlIERFRkxBVEUgYWxnb3JpdGhtIHRvIHRoZSBJUCBQYXlsb2FkIENvbXByZXNzaW9uIFByb3RvY29sLiIsCi0JfSwgewotCQkuaW5sZW4JPSAzOCwKLQkJLm91dGxlbgk9IDcwLAotCQkuaW5wdXQJPSAiXHhmM1x4Y2FceGNmXHhjY1x4NTNceDI4XHgyZFx4NTYiCi0JCQkgICJceGM4XHhjYlx4MmZceDU3XHg0OFx4Y2NceDRiXHg1MSIKLQkJCSAgIlx4MjhceGNlXHg0OFx4MmNceDRhXHg1NVx4MjhceGM5IgotCQkJICAiXHg0OFx4NTVceDI4XHhjZVx4NGZceDJiXHgyOVx4MDciCi0JCQkgICJceDcxXHhiY1x4MDhceDJiXHgwMVx4MDAiLAotCQkub3V0cHV0CT0gIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIgotCQkJIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIiwKLQl9LAotfTsKLQotLyoKLSAqIExaTyB0ZXN0IHZlY3RvcnMgKG51bGwtdGVybWluYXRlZCBzdHJpbmdzKS4KLSAqLwotI2RlZmluZSBMWk9fQ09NUF9URVNUX1ZFQ1RPUlMgMgotI2RlZmluZSBMWk9fREVDT01QX1RFU1RfVkVDVE9SUyAyCi0KLXN0YXRpYyBzdHJ1Y3QgY29tcF90ZXN0dmVjIGx6b19jb21wX3R2X3RlbXBsYXRlW10gPSB7Ci0JewotCQkuaW5sZW4JPSA3MCwKLQkJLm91dGxlbgk9IDQ2LAotCQkuaW5wdXQJPSAiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiCi0JCQkiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiLAotCQkub3V0cHV0CT0gIlx4MDBceDBkXHg0YVx4NmZceDY5XHg2ZVx4MjBceDc1IgotCQkJIlx4NzNceDIwXHg2ZVx4NmZceDc3XHgyMFx4NjFceDZlIgotCQkJIlx4NjRceDIwXHg3M1x4NjhceDYxXHg3Mlx4NjVceDIwIgotCQkJIlx4NzRceDY4XHg2NVx4MjBceDczXHg2Zlx4NjZceDc0IgotCQkJIlx4NzdceDcwXHgwMVx4MDFceDRhXHg2Zlx4NjlceDZlIgotCQkJIlx4M2RceDg4XHgwMFx4MTFceDAwXHgwMCIsCi0JfSwgewotCQkuaW5sZW4JPSAxNTksCi0JCS5vdXRsZW4JPSAxMzMsCi0JCS5pbnB1dAk9ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhIGNvbXByZXNzaW9uIG1ldGhvZCBiYXNlZCBvbiB0aGUgTFpPICIKLQkJCSJjb21wcmVzc2lvbiBhbGdvcml0aG0uICBUaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG9mICIKLQkJCSJ0aGUgTFpPIGFsZ29yaXRobSB1c2VkIGluIFVCSUZTLiIsCi0JCS5vdXRwdXQJPSAiXHgwMFx4MmJceDU0XHg2OFx4NjlceDczXHgyMFx4NjQiCi0JCQkgICJceDZmXHg2M1x4NzVceDZkXHg2NVx4NmVceDc0XHgyMCIKLQkJCSAgIlx4NjRceDY1XHg3M1x4NjNceDcyXHg2OVx4NjJceDY1IgotCQkJICAiXHg3M1x4MjBceDYxXHgyMFx4NjNceDZmXHg2ZFx4NzAiCi0JCQkgICJceDcyXHg2NVx4NzNceDczXHg2OVx4NmZceDZlXHgyMCIKLQkJCSAgIlx4NmRceDY1XHg3NFx4NjhceDZmXHg2NFx4MjBceDYyIgotCQkJICAiXHg2MVx4NzNceDY1XHg2NFx4MjBceDZmXHg2ZVx4MjAiCi0JCQkgICJceDc0XHg2OFx4NjVceDIwXHg0Y1x4NWFceDRmXHgyYiIKLQkJCSAgIlx4OGNceDAwXHgwZFx4NjFceDZjXHg2N1x4NmZceDcyIgotCQkJICAiXHg2OVx4NzRceDY4XHg2ZFx4MmVceDIwXHgyMFx4NTQiCi0JCQkgICJceDY4XHg2OVx4NzNceDJhXHg1NFx4MDFceDAyXHg2NiIKLQkJCSAgIlx4NjlceDZlXHg2NVx4NzNceDk0XHgwNlx4MDVceDYxIgotCQkJICAiXHg3MFx4NzBceDZjXHg2OVx4NjNceDYxXHg3NFx4NzYiCi0JCQkgICJceDBhXHg2Zlx4NjZceDg4XHgwMlx4NjBceDA5XHgyNyIKLQkJCSAgIlx4ZjBceDAwXHgwY1x4MjBceDc1XHg3M1x4NjVceDY0IgotCQkJICAiXHgyMFx4NjlceDZlXHgyMFx4NTVceDQyXHg0OVx4NDYiCi0JCQkgICJceDUzXHgyZVx4MTFceDAwXHgwMCIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY29tcF90ZXN0dmVjIGx6b19kZWNvbXBfdHZfdGVtcGxhdGVbXSA9IHsKLQl7Ci0JCS5pbmxlbgk9IDEzMywKLQkJLm91dGxlbgk9IDE1OSwKLQkJLmlucHV0CT0gIlx4MDBceDJiXHg1NFx4NjhceDY5XHg3M1x4MjBceDY0IgotCQkJICAiXHg2Zlx4NjNceDc1XHg2ZFx4NjVceDZlXHg3NFx4MjAiCi0JCQkgICJceDY0XHg2NVx4NzNceDYzXHg3Mlx4NjlceDYyXHg2NSIKLQkJCSAgIlx4NzNceDIwXHg2MVx4MjBceDYzXHg2Zlx4NmRceDcwIgotCQkJICAiXHg3Mlx4NjVceDczXHg3M1x4NjlceDZmXHg2ZVx4MjAiCi0JCQkgICJceDZkXHg2NVx4NzRceDY4XHg2Zlx4NjRceDIwXHg2MiIKLQkJCSAgIlx4NjFceDczXHg2NVx4NjRceDIwXHg2Zlx4NmVceDIwIgotCQkJICAiXHg3NFx4NjhceDY1XHgyMFx4NGNceDVhXHg0Zlx4MmIiCi0JCQkgICJceDhjXHgwMFx4MGRceDYxXHg2Y1x4NjdceDZmXHg3MiIKLQkJCSAgIlx4NjlceDc0XHg2OFx4NmRceDJlXHgyMFx4MjBceDU0IgotCQkJICAiXHg2OFx4NjlceDczXHgyYVx4NTRceDAxXHgwMlx4NjYiCi0JCQkgICJceDY5XHg2ZVx4NjVceDczXHg5NFx4MDZceDA1XHg2MSIKLQkJCSAgIlx4NzBceDcwXHg2Y1x4NjlceDYzXHg2MVx4NzRceDc2IgotCQkJICAiXHgwYVx4NmZceDY2XHg4OFx4MDJceDYwXHgwOVx4MjciCi0JCQkgICJceGYwXHgwMFx4MGNceDIwXHg3NVx4NzNceDY1XHg2NCIKLQkJCSAgIlx4MjBceDY5XHg2ZVx4MjBceDU1XHg0Mlx4NDlceDQ2IgotCQkJICAiXHg1M1x4MmVceDExXHgwMFx4MDAiLAotCQkub3V0cHV0CT0gIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGJhc2VkIG9uIHRoZSBMWk8gIgotCQkJImNvbXByZXNzaW9uIGFsZ29yaXRobS4gIFRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gb2YgIgotCQkJInRoZSBMWk8gYWxnb3JpdGhtIHVzZWQgaW4gVUJJRlMuIiwKLQl9LCB7Ci0JCS5pbmxlbgk9IDQ2LAotCQkub3V0bGVuCT0gNzAsCi0JCS5pbnB1dAk9ICJceDAwXHgwZFx4NGFceDZmXHg2OVx4NmVceDIwXHg3NSIKLQkJCSAgIlx4NzNceDIwXHg2ZVx4NmZceDc3XHgyMFx4NjFceDZlIgotCQkJICAiXHg2NFx4MjBceDczXHg2OFx4NjFceDcyXHg2NVx4MjAiCi0JCQkgICJceDc0XHg2OFx4NjVceDIwXHg3M1x4NmZceDY2XHg3NCIKLQkJCSAgIlx4NzdceDcwXHgwMVx4MDFceDRhXHg2Zlx4NjlceDZlIgotCQkJICAiXHgzZFx4ODhceDAwXHgxMVx4MDBceDAwIiwKLQkJLm91dHB1dAk9ICJKb2luIHVzIG5vdyBhbmQgc2hhcmUgdGhlIHNvZnR3YXJlICIKLQkJCSJKb2luIHVzIG5vdyBhbmQgc2hhcmUgdGhlIHNvZnR3YXJlICIsCi0JfSwKLX07Ci0KLS8qCi0gKiBNaWNoYWVsIE1JQyB0ZXN0IHZlY3RvcnMgZnJvbSBJRUVFIDgwMi4xMWkKLSAqLwotI2RlZmluZSBNSUNIQUVMX01JQ19URVNUX1ZFQ1RPUlMgNgotCi1zdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBtaWNoYWVsX21pY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLmtleSA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCi0JCS5rc2l6ZSA9IDgsCi0JCS5wbGFpbnRleHQgPSB6ZXJvZWRfc3RyaW5nLAotCQkucHNpemUgPSAwLAotCQkuZGlnZXN0ID0gIlx4ODJceDkyXHg1Y1x4MWNceGExXHhkMVx4MzBceGI4IiwKLQl9LAotCXsKLQkJLmtleSA9ICJceDgyXHg5Mlx4NWNceDFjXHhhMVx4ZDFceDMwXHhiOCIsCi0JCS5rc2l6ZSA9IDgsCi0JCS5wbGFpbnRleHQgPSAiTSIsCi0JCS5wc2l6ZSA9IDEsCi0JCS5kaWdlc3QgPSAiXHg0M1x4NDdceDIxXHhjYVx4NDBceDYzXHg5Ylx4M2YiLAotCX0sCi0JewotCQkua2V5ID0gIlx4NDNceDQ3XHgyMVx4Y2FceDQwXHg2M1x4OWJceDNmIiwKLQkJLmtzaXplID0gOCwKLQkJLnBsYWludGV4dCA9ICJNaSIsCi0JCS5wc2l6ZSA9IDIsCi0JCS5kaWdlc3QgPSAiXHhlOFx4ZjlceGJlXHhjYVx4ZTlceDdlXHg1ZFx4MjkiLAotCX0sCi0JewotCQkua2V5ID0gIlx4ZThceGY5XHhiZVx4Y2FceGU5XHg3ZVx4NWRceDI5IiwKLQkJLmtzaXplID0gOCwKLQkJLnBsYWludGV4dCA9ICJNaWMiLAotCQkucHNpemUgPSAzLAotCQkuZGlnZXN0ID0gIlx4OTBceDAzXHg4Zlx4YzZceGNmXHgxM1x4YzFceGRiIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceDkwXHgwM1x4OGZceGM2XHhjZlx4MTNceGMxXHhkYiIsCi0JCS5rc2l6ZSA9IDgsCi0JCS5wbGFpbnRleHQgPSAiTWljaCIsCi0JCS5wc2l6ZSA9IDQsCi0JCS5kaWdlc3QgPSAiXHhkNVx4NWVceDEwXHgwNVx4MTBceDEyXHg4OVx4ODYiLAotCX0sCi0JewotCQkua2V5ID0gIlx4ZDVceDVlXHgxMFx4MDVceDEwXHgxMlx4ODlceDg2IiwKLQkJLmtzaXplID0gOCwKLQkJLnBsYWludGV4dCA9ICJNaWNoYWVsIiwKLQkJLnBzaXplID0gNywKLQkJLmRpZ2VzdCA9ICJceDBhXHg5NFx4MmJceDEyXHg0ZVx4Y2FceGE1XHg0NiIsCi0JfQotfTsKLQotLyoKLSAqIENSQzMyQyB0ZXN0IHZlY3RvcnMKLSAqLwotI2RlZmluZSBDUkMzMkNfVEVTVF9WRUNUT1JTIDE0Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGNyYzMyY190dl90ZW1wbGF0ZVtdID0gewotCXsKLQkJLnBzaXplID0gMCwKLQkJLmRpZ2VzdCA9ICJceDAwXHgwMFx4MDBceDAwIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceDg3XHhhOVx4Y2JceGVkIiwKLQkJLmtzaXplID0gNCwKLQkJLnBzaXplID0gMCwKLQkJLmRpZ2VzdCA9ICJceDc4XHg1Nlx4MzRceDEyIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceGZmXHhmZlx4ZmZceGZmIiwKLQkJLmtzaXplID0gNCwKLQkJLnBsYWludGV4dCA9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKLQkJCSAgICAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgotCQkJICAgICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MTgiCi0JCQkgICAgICJceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmXHgyMCIKLQkJCSAgICAgIlx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjdceDI4IiwKLQkJLnBzaXplID0gNDAsCi0JCS5kaWdlc3QgPSAiXHg3Zlx4MTVceDJjXHgwZSIsCi0JfSwKLQl7Ci0JCS5rZXkgPSAiXHhmZlx4ZmZceGZmXHhmZiIsCi0JCS5rc2l6ZSA9IDQsCi0JCS5wbGFpbnRleHQgPSAiXHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZlx4MzAiCi0JCQkgICAgICJceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3XHgzOCIKLQkJCSAgICAgIlx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2ZceDQwIgotCQkJICAgICAiXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0N1x4NDgiCi0JCQkgICAgICJceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmXHg1MCIsCi0JCS5wc2l6ZSA9IDQwLAotCQkuZGlnZXN0ID0gIlx4ZjZceGViXHg4MFx4ZTkiLAotCX0sCi0JewotCQkua2V5ID0gIlx4ZmZceGZmXHhmZlx4ZmYiLAotCQkua3NpemUgPSA0LAotCQkucGxhaW50ZXh0ID0gIlx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTdceDU4IgotCQkJICAgICAiXHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1Zlx4NjAiCi0JCQkgICAgICJceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3XHg2OCIKLQkJCSAgICAgIlx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmZceDcwIgotCQkJICAgICAiXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3N1x4NzgiLAotCQkucHNpemUgPSA0MCwKLQkJLmRpZ2VzdCA9ICJceGVkXHhiZFx4NzRceGRlIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceGZmXHhmZlx4ZmZceGZmIiwKLQkJLmtzaXplID0gNCwKLQkJLnBsYWludGV4dCA9ICJceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmXHg4MCIKLQkJCSAgICAgIlx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODdceDg4IgotCQkJICAgICAiXHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4Zlx4OTAiCi0JCQkgICAgICJceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3XHg5OCIKLQkJCSAgICAgIlx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWZceGEwIiwKLQkJLnBzaXplID0gNDAsCi0JCS5kaWdlc3QgPSAiXHg2Mlx4YzhceDc5XHhkNSIsCi0JfSwKLQl7Ci0JCS5rZXkgPSAiXHhmZlx4ZmZceGZmXHhmZiIsCi0JCS5rc2l6ZSA9IDQsCi0JCS5wbGFpbnRleHQgPSAiXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhN1x4YTgiCi0JCQkgICAgICJceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmXHhiMCIKLQkJCSAgICAgIlx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjdceGI4IgotCQkJICAgICAiXHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZlx4YzAiCi0JCQkgICAgICJceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3XHhjOCIsCi0JCS5wc2l6ZSA9IDQwLAotCQkuZGlnZXN0ID0gIlx4ZDBceDlhXHg5N1x4YmEiLAotCX0sCi0JewotCQkua2V5ID0gIlx4ZmZceGZmXHhmZlx4ZmYiLAotCQkua3NpemUgPSA0LAotCQkucGxhaW50ZXh0ID0gIlx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2ZceGQwIgotCQkJICAgICAiXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkN1x4ZDgiCi0JCQkgICAgICJceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmXHhlMCIKLQkJCSAgICAgIlx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTdceGU4IgotCQkJICAgICAiXHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZlx4ZjAiLAotCQkucHNpemUgPSA0MCwKLQkJLmRpZ2VzdCA9ICJceDEzXHhkOVx4MjlceDJiIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceDgwXHhlYVx4ZDNceGYxIiwKLQkJLmtzaXplID0gNCwKLQkJLnBsYWludGV4dCA9ICJceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmXHgzMCIKLQkJCSAgICAgIlx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4IgotCQkJICAgICAiXHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZlx4NDAiCi0JCQkgICAgICJceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3XHg0OCIKLQkJCSAgICAgIlx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGZceDUwIiwKLQkJLnBzaXplID0gNDAsCi0JCS5kaWdlc3QgPSAiXHgwY1x4YjVceGUyXHhhMiIsCi0JfSwKLQl7Ci0JCS5rZXkgPSAiXHhmM1x4NGFceDFkXHg1ZCIsCi0JCS5rc2l6ZSA9IDQsCi0JCS5wbGFpbnRleHQgPSAiXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NTgiCi0JCQkgICAgICJceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmXHg2MCIKLQkJCSAgICAgIlx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4IgotCQkJICAgICAiXHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2Zlx4NzAiCi0JCQkgICAgICJceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OCIsCi0JCS5wc2l6ZSA9IDQwLAotCQkuZGlnZXN0ID0gIlx4ZDFceDdmXHhmYlx4YTYiLAotCX0sCi0JewotCQkua2V5ID0gIlx4MmVceDgwXHgwNFx4NTkiLAotCQkua3NpemUgPSA0LAotCQkucGxhaW50ZXh0ID0gIlx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2ZceDgwIgotCQkJICAgICAiXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4N1x4ODgiCi0JCQkgICAgICJceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmXHg5MCIKLQkJCSAgICAgIlx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTdceDk4IgotCQkJICAgICAiXHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5Zlx4YTAiLAotCQkucHNpemUgPSA0MCwKLQkJLmRpZ2VzdCA9ICJceDU5XHgzM1x4ZTZceDdhIiwKLQl9LAotCXsKLQkJLmtleSA9ICJceGE2XHhjY1x4MTlceDg1IiwKLQkJLmtzaXplID0gNCwKLQkJLnBsYWludGV4dCA9ICJceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOCIKLQkJCSAgICAgIlx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWZceGIwIgotCQkJICAgICAiXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiN1x4YjgiCi0JCQkgICAgICJceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmXHhjMCIKLQkJCSAgICAgIlx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzdceGM4IiwKLQkJLnBzaXplID0gNDAsCi0JCS5kaWdlc3QgPSAiXHhiZVx4MDNceDAxXHhkMiIsCi0JfSwKLQl7Ci0JCS5rZXkgPSAiXHg0MVx4ZmNceGZlXHgyZCIsCi0JCS5rc2l6ZSA9IDQsCi0JCS5wbGFpbnRleHQgPSAiXHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZlx4ZDAiCi0JCQkgICAgICJceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3XHhkOCIKLQkJCSAgICAgIlx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGZceGUwIgotCQkJICAgICAiXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZTgiCi0JCQkgICAgICJceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmXHhmMCIsCi0JCS5wc2l6ZSA9IDQwLAotCQkuZGlnZXN0ID0gIlx4NzVceGQzXHhjNVx4MjQiLAotCX0sCi0JewotCQkua2V5ID0gIlx4ZmZceGZmXHhmZlx4ZmYiLAotCQkua3NpemUgPSA0LAotCQkucGxhaW50ZXh0ID0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgotCQkJICAgICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCi0JCQkgICAgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOCIKLQkJCSAgICAgIlx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZceDIwIgotCQkJICAgICAiXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyN1x4MjgiCi0JCQkgICAgICJceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmXHgzMCIKLQkJCSAgICAgIlx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4IgotCQkJICAgICAiXHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZlx4NDAiCi0JCQkgICAgICJceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3XHg0OCIKLQkJCSAgICAgIlx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGZceDUwIgotCQkJICAgICAiXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NTgiCi0JCQkgICAgICJceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmXHg2MCIKLQkJCSAgICAgIlx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4IgotCQkJICAgICAiXHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2Zlx4NzAiCi0JCQkgICAgICJceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OCIKLQkJCSAgICAgIlx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2ZceDgwIgotCQkJICAgICAiXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4N1x4ODgiCi0JCQkgICAgICJceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmXHg5MCIKLQkJCSAgICAgIlx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTdceDk4IgotCQkJICAgICAiXHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5Zlx4YTAiCi0JCQkgICAgICJceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOCIKLQkJCSAgICAgIlx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWZceGIwIgotCQkJICAgICAiXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiN1x4YjgiCi0JCQkgICAgICJceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmXHhjMCIKLQkJCSAgICAgIlx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzdceGM4IgotCQkJICAgICAiXHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZlx4ZDAiCi0JCQkgICAgICJceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3XHhkOCIKLQkJCSAgICAgIlx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGZceGUwIgotCQkJICAgICAiXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZTgiCi0JCQkgICAgICJceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmXHhmMCIsCi0JCS5wc2l6ZSA9IDI0MCwKLQkJLmRpZ2VzdCA9ICJceDc1XHhkM1x4YzVceDI0IiwKLQkJLm5wID0gMiwKLQkJLnRhcCA9IHsgMzEsIDIwOSB9Ci0JfSwKLX07Ci0KIC8qCiAgKiBDaXBoZXIgc3BlZWQgdGVzdHMKICAqLwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuYyBiL2NyeXB0by90ZXN0bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyOGM2YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by90ZXN0bWdyLmMKQEAgLTAsMCArMSwxODY4IEBACisvKgorICogQWxnb3JpdGhtIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCB0ZXN0cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmVhbi1GcmFuY29pcyBEaXZlIDxqZWZAbGludXhiZS5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTm9raWEgU2llbWVucyBOZXR3b3JrcworICogQ29weXJpZ2h0IChjKSAyMDA4IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGVzdG1nci5oIgorCisvKgorICogTmVlZCBzbGFiIG1lbW9yeSBmb3IgdGVzdGluZyAoc2l6ZSBpbiBudW1iZXIgb2YgcGFnZXMpLgorICovCisjZGVmaW5lIFhCVUZTSVpFCTgKKworLyoKKyAqIEluZGV4ZXMgaW50byB0aGUgeGJ1ZiB0byBzaW11bGF0ZSBjcm9zcy1wYWdlIGFjY2Vzcy4KKyAqLworI2RlZmluZSBJRFgxCQkzMgorI2RlZmluZSBJRFgyCQkzMjQwMAorI2RlZmluZSBJRFgzCQkxCisjZGVmaW5lIElEWDQJCTgxOTMKKyNkZWZpbmUgSURYNQkJMjIyMjIKKyNkZWZpbmUgSURYNgkJMTcxMDEKKyNkZWZpbmUgSURYNwkJMjczMzMKKyNkZWZpbmUgSURYOAkJMzAwMAorCisvKgorKiBVc2VkIGJ5IHRlc3RfY2lwaGVyKCkKKyovCisjZGVmaW5lIEVOQ1JZUFQgMQorI2RlZmluZSBERUNSWVBUIDAKKworc3RydWN0IHRjcnlwdF9yZXN1bHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IGVycjsKK307CisKK3N0cnVjdCBhZWFkX3Rlc3Rfc3VpdGUgeworCXN0cnVjdCB7CisJCXN0cnVjdCBhZWFkX3Rlc3R2ZWMgKnZlY3M7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKwl9IGVuYywgZGVjOworfTsKKworc3RydWN0IGNpcGhlcl90ZXN0X3N1aXRlIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgKnZlY3M7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKwl9IGVuYywgZGVjOworfTsKKworc3RydWN0IGNvbXBfdGVzdF9zdWl0ZSB7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvbXBfdGVzdHZlYyAqdmVjczsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCX0gY29tcCwgZGVjb21wOworfTsKKworc3RydWN0IGhhc2hfdGVzdF9zdWl0ZSB7CisJc3RydWN0IGhhc2hfdGVzdHZlYyAqdmVjczsKKwl1bnNpZ25lZCBpbnQgY291bnQ7Cit9OworCitzdHJ1Y3QgYWxnX3Rlc3RfZGVzYyB7CisJY29uc3QgY2hhciAqYWxnOworCWludCAoKnRlc3QpKGNvbnN0IHN0cnVjdCBhbGdfdGVzdF9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpkcml2ZXIsCisJCSAgICB1MzIgdHlwZSwgdTMyIG1hc2spOworCisJdW5pb24geworCQlzdHJ1Y3QgYWVhZF90ZXN0X3N1aXRlIGFlYWQ7CisJCXN0cnVjdCBjaXBoZXJfdGVzdF9zdWl0ZSBjaXBoZXI7CisJCXN0cnVjdCBjb21wX3Rlc3Rfc3VpdGUgY29tcDsKKwkJc3RydWN0IGhhc2hfdGVzdF9zdWl0ZSBoYXNoOworCX0gc3VpdGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IElEWFs4XSA9IHsgSURYMSwgSURYMiwgSURYMywgSURYNCwgSURYNSwgSURYNiwgSURYNywgSURYOCB9OworCitzdGF0aWMgY2hhciAqeGJ1ZltYQlVGU0laRV07CitzdGF0aWMgY2hhciAqYXhidWZbWEJVRlNJWkVdOworCitzdGF0aWMgdm9pZCBoZXhkdW1wKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0NPTlQsICIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkxNiwgMSwKKwkJCWJ1ZiwgbGVuLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcnlwdF9jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgdGNyeXB0X3Jlc3VsdCAqcmVzID0gcmVxLT5kYXRhOworCisJaWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpCisJCXJldHVybjsKKworCXJlcy0+ZXJyID0gZXJyOworCWNvbXBsZXRlKCZyZXMtPmNvbXBsZXRpb24pOworfQorCitzdGF0aWMgaW50IHRlc3RfaGFzaChzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0sIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgKnRlbXBsYXRlLAorCQkgICAgIHVuc2lnbmVkIGludCB0Y291bnQpCit7CisJY29uc3QgY2hhciAqYWxnbyA9IGNyeXB0b190Zm1fYWxnX2RyaXZlcl9uYW1lKGNyeXB0b19haGFzaF90Zm0odGZtKSk7CisJdW5zaWduZWQgaW50IGksIGosIGssIHRlbXA7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzhdOworCWNoYXIgcmVzdWx0WzY0XTsKKwlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxOworCXN0cnVjdCB0Y3J5cHRfcmVzdWx0IHRyZXN1bHQ7CisJaW50IHJldDsKKwl2b2lkICpoYXNoX2J1ZmY7CisKKwlpbml0X2NvbXBsZXRpb24oJnRyZXN1bHQuY29tcGxldGlvbik7CisKKwlyZXEgPSBhaGFzaF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGhhc2g6IEZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciAiCisJCSAgICAgICAiJXNcbiIsIGFsZ28pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub3JlcTsKKwl9CisJYWhhc2hfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRywKKwkJCQkgICB0Y3J5cHRfY29tcGxldGUsICZ0cmVzdWx0KTsKKworCWZvciAoaSA9IDA7IGkgPCB0Y291bnQ7IGkrKykgeworCQltZW1zZXQocmVzdWx0LCAwLCA2NCk7CisKKwkJaGFzaF9idWZmID0geGJ1ZlswXTsKKworCQltZW1jcHkoaGFzaF9idWZmLCB0ZW1wbGF0ZVtpXS5wbGFpbnRleHQsIHRlbXBsYXRlW2ldLnBzaXplKTsKKwkJc2dfaW5pdF9vbmUoJnNnWzBdLCBoYXNoX2J1ZmYsIHRlbXBsYXRlW2ldLnBzaXplKTsKKworCQlpZiAodGVtcGxhdGVbaV0ua3NpemUpIHsKKwkJCWNyeXB0b19haGFzaF9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKKwkJCXJldCA9IGNyeXB0b19haGFzaF9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCisJCQkJCQkgIHRlbXBsYXRlW2ldLmtzaXplKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogaGFzaDogc2V0a2V5IGZhaWxlZCBvbiAiCisJCQkJICAgICAgICJ0ZXN0ICVkIGZvciAlczogcmV0PSVkXG4iLCBpICsgMSwgYWxnbywKKwkJCQkgICAgICAgLXJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlhaGFzaF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCByZXN1bHQsIHRlbXBsYXRlW2ldLnBzaXplKTsKKwkJcmV0ID0gY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCWNhc2UgLUVCVVNZOgorCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAorCQkJCSZ0cmVzdWx0LmNvbXBsZXRpb24pOworCQkJaWYgKCFyZXQgJiYgIShyZXQgPSB0cmVzdWx0LmVycikpIHsKKwkJCQlJTklUX0NPTVBMRVRJT04odHJlc3VsdC5jb21wbGV0aW9uKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGhhc2g6IGRpZ2VzdCBmYWlsZWQgb24gdGVzdCAlZCAiCisJCQkgICAgICAgImZvciAlczogcmV0PSVkXG4iLCBpICsgMSwgYWxnbywgLXJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChtZW1jbXAocmVzdWx0LCB0ZW1wbGF0ZVtpXS5kaWdlc3QsCisJCQkgICBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGhhc2g6IFRlc3QgJWQgZmFpbGVkIGZvciAlc1xuIiwKKwkJCSAgICAgICBpICsgMSwgYWxnbyk7CisJCQloZXhkdW1wKHJlc3VsdCwgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdGNvdW50OyBpKyspIHsKKwkJaWYgKHRlbXBsYXRlW2ldLm5wKSB7CisJCQlqKys7CisJCQltZW1zZXQocmVzdWx0LCAwLCA2NCk7CisKKwkJCXRlbXAgPSAwOworCQkJc2dfaW5pdF90YWJsZShzZywgdGVtcGxhdGVbaV0ubnApOworCQkJZm9yIChrID0gMDsgayA8IHRlbXBsYXRlW2ldLm5wOyBrKyspIHsKKwkJCQlzZ19zZXRfYnVmKCZzZ1trXSwKKwkJCQkJICAgbWVtY3B5KHhidWZbSURYW2tdID4+IFBBR0VfU0hJRlRdICsKKwkJCQkJCSAgb2Zmc2V0X2luX3BhZ2UoSURYW2tdKSwKKwkJCQkJCSAgdGVtcGxhdGVbaV0ucGxhaW50ZXh0ICsgdGVtcCwKKwkJCQkJCSAgdGVtcGxhdGVbaV0udGFwW2tdKSwKKwkJCQkJICAgdGVtcGxhdGVbaV0udGFwW2tdKTsKKwkJCQl0ZW1wICs9IHRlbXBsYXRlW2ldLnRhcFtrXTsKKwkJCX0KKworCQkJaWYgKHRlbXBsYXRlW2ldLmtzaXplKSB7CisJCQkJY3J5cHRvX2FoYXNoX2NsZWFyX2ZsYWdzKHRmbSwgfjApOworCQkJCXJldCA9IGNyeXB0b19haGFzaF9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCisJCQkJCQkJICB0ZW1wbGF0ZVtpXS5rc2l6ZSk7CisKKwkJCQlpZiAocmV0KSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBoYXNoOiBzZXRrZXkgIgorCQkJCQkgICAgICAgImZhaWxlZCBvbiBjaHVua2luZyB0ZXN0ICVkICIKKwkJCQkJICAgICAgICJmb3IgJXM6IHJldD0lZFxuIiwgaiwgYWxnbywKKwkJCQkJICAgICAgIC1yZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisKKwkJCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHJlc3VsdCwKKwkJCQkJCXRlbXBsYXRlW2ldLnBzaXplKTsKKwkJCXJldCA9IGNyeXB0b19haGFzaF9kaWdlc3QocmVxKTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJCWNhc2UgLUVCVVNZOgorCQkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKKwkJCQkJJnRyZXN1bHQuY29tcGxldGlvbik7CisJCQkJaWYgKCFyZXQgJiYgIShyZXQgPSB0cmVzdWx0LmVycikpIHsKKwkJCQkJSU5JVF9DT01QTEVUSU9OKHRyZXN1bHQuY29tcGxldGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGhhc2g6IGRpZ2VzdCBmYWlsZWQgIgorCQkJCSAgICAgICAib24gY2h1bmtpbmcgdGVzdCAlZCBmb3IgJXM6ICIKKwkJCQkgICAgICAgInJldD0lZFxuIiwgaiwgYWxnbywgLXJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmIChtZW1jbXAocmVzdWx0LCB0ZW1wbGF0ZVtpXS5kaWdlc3QsCisJCQkJICAgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogaGFzaDogQ2h1bmtpbmcgdGVzdCAlZCAiCisJCQkJICAgICAgICJmYWlsZWQgZm9yICVzXG4iLCBqLCBhbGdvKTsKKwkJCQloZXhkdW1wKHJlc3VsdCwgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKSk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IDA7CisKK291dDoKKwlhaGFzaF9yZXF1ZXN0X2ZyZWUocmVxKTsKK291dF9ub3JlcToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlc3RfYWVhZChzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSwgaW50IGVuYywKKwkJICAgICBzdHJ1Y3QgYWVhZF90ZXN0dmVjICp0ZW1wbGF0ZSwgdW5zaWduZWQgaW50IHRjb3VudCkKK3sKKwljb25zdCBjaGFyICphbGdvID0gY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoY3J5cHRvX2FlYWRfdGZtKHRmbSkpOworCXVuc2lnbmVkIGludCBpLCBqLCBrLCBuLCB0ZW1wOworCWludCByZXQgPSAwOworCWNoYXIgKnE7CisJY2hhciAqa2V5OworCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbOF07CisJc3RydWN0IHNjYXR0ZXJsaXN0IGFzZ1s4XTsKKwljb25zdCBjaGFyICplOworCXN0cnVjdCB0Y3J5cHRfcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgYXV0aHNpemU7CisJdm9pZCAqaW5wdXQ7CisJdm9pZCAqYXNzb2M7CisJY2hhciBpdltNQVhfSVZMRU5dOworCisJaWYgKGVuYyA9PSBFTkNSWVBUKQorCQllID0gImVuY3J5cHRpb24iOworCWVsc2UKKwkJZSA9ICJkZWNyeXB0aW9uIjsKKworCWluaXRfY29tcGxldGlvbigmcmVzdWx0LmNvbXBsZXRpb24pOworCisJcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGFlYWQ6IEZhaWxlZCB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciAiCisJCSAgICAgICAiJXNcbiIsIGFsZ28pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisJCQkJICB0Y3J5cHRfY29tcGxldGUsICZyZXN1bHQpOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCB0Y291bnQ7IGkrKykgeworCQlpZiAoIXRlbXBsYXRlW2ldLm5wKSB7CisJCQlqKys7CisKKwkJCS8qIHNvbWUgdGVwbXBsYXRlcyBoYXZlIG5vIGlucHV0IGRhdGEgYnV0IHRoZXkgd2lsbAorCQkJICogdG91Y2ggaW5wdXQKKwkJCSAqLworCQkJaW5wdXQgPSB4YnVmWzBdOworCQkJYXNzb2MgPSBheGJ1ZlswXTsKKworCQkJbWVtY3B5KGlucHV0LCB0ZW1wbGF0ZVtpXS5pbnB1dCwgdGVtcGxhdGVbaV0uaWxlbik7CisJCQltZW1jcHkoYXNzb2MsIHRlbXBsYXRlW2ldLmFzc29jLCB0ZW1wbGF0ZVtpXS5hbGVuKTsKKwkJCWlmICh0ZW1wbGF0ZVtpXS5pdikKKwkJCQltZW1jcHkoaXYsIHRlbXBsYXRlW2ldLml2LCBNQVhfSVZMRU4pOworCQkJZWxzZQorCQkJCW1lbXNldChpdiwgMCwgTUFYX0lWTEVOKTsKKworCQkJY3J5cHRvX2FlYWRfY2xlYXJfZmxhZ3ModGZtLCB+MCk7CisJCQlpZiAodGVtcGxhdGVbaV0ud2spCisJCQkJY3J5cHRvX2FlYWRfc2V0X2ZsYWdzKAorCQkJCQl0Zm0sIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKKworCQkJa2V5ID0gdGVtcGxhdGVbaV0ua2V5OworCisJCQlyZXQgPSBjcnlwdG9fYWVhZF9zZXRrZXkodGZtLCBrZXksCisJCQkJCQkgdGVtcGxhdGVbaV0ua2xlbik7CisJCQlpZiAoIXJldCA9PSB0ZW1wbGF0ZVtpXS5mYWlsKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGFlYWQ6IHNldGtleSBmYWlsZWQgb24gIgorCQkJCSAgICAgICAidGVzdCAlZCBmb3IgJXM6IGZsYWdzPSV4XG4iLCBqLCBhbGdvLAorCQkJCSAgICAgICBjcnlwdG9fYWVhZF9nZXRfZmxhZ3ModGZtKSk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHJldCkKKwkJCQljb250aW51ZTsKKworCQkJYXV0aHNpemUgPSBhYnModGVtcGxhdGVbaV0ucmxlbiAtIHRlbXBsYXRlW2ldLmlsZW4pOworCQkJcmV0ID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBhdXRoc2l6ZSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGFlYWQ6IEZhaWxlZCB0byBzZXQgIgorCQkJCSAgICAgICAiYXV0aHNpemUgdG8gJXUgb24gdGVzdCAlZCBmb3IgJXNcbiIsCisJCQkJICAgICAgIGF1dGhzaXplLCBqLCBhbGdvKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJc2dfaW5pdF9vbmUoJnNnWzBdLCBpbnB1dCwKKwkJCQkgICAgdGVtcGxhdGVbaV0uaWxlbiArIChlbmMgPyBhdXRoc2l6ZSA6IDApKTsKKworCQkJc2dfaW5pdF9vbmUoJmFzZ1swXSwgYXNzb2MsIHRlbXBsYXRlW2ldLmFsZW4pOworCisJCQlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHNnLAorCQkJCQkgICAgICAgdGVtcGxhdGVbaV0uaWxlbiwgaXYpOworCisJCQlhZWFkX3JlcXVlc3Rfc2V0X2Fzc29jKHJlcSwgYXNnLCB0ZW1wbGF0ZVtpXS5hbGVuKTsKKworCQkJcmV0ID0gZW5jID8KKwkJCQljcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOgorCQkJCWNyeXB0b19hZWFkX2RlY3J5cHQocmVxKTsKKworCQkJc3dpdGNoIChyZXQpIHsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJY2FzZSAtRUJVU1k6CisJCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAorCQkJCQkmcmVzdWx0LmNvbXBsZXRpb24pOworCQkJCWlmICghcmV0ICYmICEocmV0ID0gcmVzdWx0LmVycikpIHsKKwkJCQkJSU5JVF9DT01QTEVUSU9OKHJlc3VsdC5jb21wbGV0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogYWVhZDogJXMgZmFpbGVkIG9uIHRlc3QgIgorCQkJCSAgICAgICAiJWQgZm9yICVzOiByZXQ9JWRcbiIsIGUsIGosIGFsZ28sIC1yZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlxID0gaW5wdXQ7CisJCQlpZiAobWVtY21wKHEsIHRlbXBsYXRlW2ldLnJlc3VsdCwgdGVtcGxhdGVbaV0ucmxlbikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogYWVhZDogVGVzdCAlZCBmYWlsZWQgb24gIgorCQkJCSAgICAgICAiJXMgZm9yICVzXG4iLCBqLCBlLCBhbGdvKTsKKwkJCQloZXhkdW1wKHEsIHRlbXBsYXRlW2ldLnJsZW4pOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHRjb3VudDsgaSsrKSB7CisJCWlmICh0ZW1wbGF0ZVtpXS5ucCkgeworCQkJaisrOworCisJCQlpZiAodGVtcGxhdGVbaV0uaXYpCisJCQkJbWVtY3B5KGl2LCB0ZW1wbGF0ZVtpXS5pdiwgTUFYX0lWTEVOKTsKKwkJCWVsc2UKKwkJCQltZW1zZXQoaXYsIDAsIE1BWF9JVkxFTik7CisKKwkJCWNyeXB0b19hZWFkX2NsZWFyX2ZsYWdzKHRmbSwgfjApOworCQkJaWYgKHRlbXBsYXRlW2ldLndrKQorCQkJCWNyeXB0b19hZWFkX3NldF9mbGFncygKKwkJCQkJdGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CisJCQlrZXkgPSB0ZW1wbGF0ZVtpXS5rZXk7CisKKwkJCXJldCA9IGNyeXB0b19hZWFkX3NldGtleSh0Zm0sIGtleSwgdGVtcGxhdGVbaV0ua2xlbik7CisJCQlpZiAoIXJldCA9PSB0ZW1wbGF0ZVtpXS5mYWlsKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGFlYWQ6IHNldGtleSBmYWlsZWQgb24gIgorCQkJCSAgICAgICAiY2h1bmsgdGVzdCAlZCBmb3IgJXM6IGZsYWdzPSV4XG4iLCBqLAorCQkJCSAgICAgICBhbGdvLCBjcnlwdG9fYWVhZF9nZXRfZmxhZ3ModGZtKSk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHJldCkKKwkJCQljb250aW51ZTsKKworCQkJYXV0aHNpemUgPSBhYnModGVtcGxhdGVbaV0ucmxlbiAtIHRlbXBsYXRlW2ldLmlsZW4pOworCisJCQlyZXQgPSAtRUlOVkFMOworCQkJc2dfaW5pdF90YWJsZShzZywgdGVtcGxhdGVbaV0ubnApOworCQkJZm9yIChrID0gMCwgdGVtcCA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7CisJCQkJaWYgKFdBUk5fT04ob2Zmc2V0X2luX3BhZ2UoSURYW2tdKSArCisJCQkJCSAgICB0ZW1wbGF0ZVtpXS50YXBba10gPiBQQUdFX1NJWkUpKQorCQkJCQlnb3RvIG91dDsKKworCQkJCXEgPSB4YnVmW0lEWFtrXSA+PiBQQUdFX1NISUZUXSArCisJCQkJICAgIG9mZnNldF9pbl9wYWdlKElEWFtrXSk7CisKKwkJCQltZW1jcHkocSwgdGVtcGxhdGVbaV0uaW5wdXQgKyB0ZW1wLAorCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS50YXBba10pOworCisJCQkJbiA9IHRlbXBsYXRlW2ldLnRhcFtrXTsKKwkJCQlpZiAoayA9PSB0ZW1wbGF0ZVtpXS5ucCAtIDEgJiYgZW5jKQorCQkJCQluICs9IGF1dGhzaXplOworCQkJCWlmIChvZmZzZXRfaW5fcGFnZShxKSArIG4gPCBQQUdFX1NJWkUpCisJCQkJCXFbbl0gPSAwOworCisJCQkJc2dfc2V0X2J1Zigmc2dba10sIHEsIHRlbXBsYXRlW2ldLnRhcFtrXSk7CisJCQkJdGVtcCArPSB0ZW1wbGF0ZVtpXS50YXBba107CisJCQl9CisKKwkJCXJldCA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKHRmbSwgYXV0aHNpemUpOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBhZWFkOiBGYWlsZWQgdG8gc2V0ICIKKwkJCQkgICAgICAgImF1dGhzaXplIHRvICV1IG9uIGNodW5rIHRlc3QgJWQgZm9yICIKKwkJCQkgICAgICAgIiVzXG4iLCBhdXRoc2l6ZSwgaiwgYWxnbyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWlmIChlbmMpIHsKKwkJCQlpZiAoV0FSTl9PTihzZ1trIC0gMV0ub2Zmc2V0ICsKKwkJCQkJICAgIHNnW2sgLSAxXS5sZW5ndGggKyBhdXRoc2l6ZSA+CisJCQkJCSAgICBQQUdFX1NJWkUpKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXNnW2sgLSAxXS5sZW5ndGggKz0gYXV0aHNpemU7CisJCQl9CisKKwkJCXNnX2luaXRfdGFibGUoYXNnLCB0ZW1wbGF0ZVtpXS5hbnApOworCQkJZm9yIChrID0gMCwgdGVtcCA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5hbnA7IGsrKykgeworCQkJCXNnX3NldF9idWYoJmFzZ1trXSwKKwkJCQkJICAgbWVtY3B5KGF4YnVmW0lEWFtrXSA+PiBQQUdFX1NISUZUXSArCisJCQkJCQkgIG9mZnNldF9pbl9wYWdlKElEWFtrXSksCisJCQkJCQkgIHRlbXBsYXRlW2ldLmFzc29jICsgdGVtcCwKKwkJCQkJCSAgdGVtcGxhdGVbaV0uYXRhcFtrXSksCisJCQkJCSAgIHRlbXBsYXRlW2ldLmF0YXBba10pOworCQkJCXRlbXAgKz0gdGVtcGxhdGVbaV0uYXRhcFtrXTsKKwkJCX0KKworCQkJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywKKwkJCQkJICAgICAgIHRlbXBsYXRlW2ldLmlsZW4sCisJCQkJCSAgICAgICBpdik7CisKKwkJCWFlYWRfcmVxdWVzdF9zZXRfYXNzb2MocmVxLCBhc2csIHRlbXBsYXRlW2ldLmFsZW4pOworCisJCQlyZXQgPSBlbmMgPworCQkJCWNyeXB0b19hZWFkX2VuY3J5cHQocmVxKSA6CisJCQkJY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpOworCisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCQljYXNlIC1FQlVTWToKKwkJCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCisJCQkJCSZyZXN1bHQuY29tcGxldGlvbik7CisJCQkJaWYgKCFyZXQgJiYgIShyZXQgPSByZXN1bHQuZXJyKSkgeworCQkJCQlJTklUX0NPTVBMRVRJT04ocmVzdWx0LmNvbXBsZXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBhZWFkOiAlcyBmYWlsZWQgb24gIgorCQkJCSAgICAgICAiY2h1bmsgdGVzdCAlZCBmb3IgJXM6IHJldD0lZFxuIiwgZSwgaiwKKwkJCQkgICAgICAgYWxnbywgLXJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlmb3IgKGsgPSAwLCB0ZW1wID0gMDsgayA8IHRlbXBsYXRlW2ldLm5wOyBrKyspIHsKKwkJCQlxID0geGJ1ZltJRFhba10gPj4gUEFHRV9TSElGVF0gKworCQkJCSAgICBvZmZzZXRfaW5fcGFnZShJRFhba10pOworCisJCQkJbiA9IHRlbXBsYXRlW2ldLnRhcFtrXTsKKwkJCQlpZiAoayA9PSB0ZW1wbGF0ZVtpXS5ucCAtIDEpCisJCQkJCW4gKz0gZW5jID8gYXV0aHNpemUgOiAtYXV0aHNpemU7CisKKwkJCQlpZiAobWVtY21wKHEsIHRlbXBsYXRlW2ldLnJlc3VsdCArIHRlbXAsIG4pKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBhZWFkOiBDaHVuayAiCisJCQkJCSAgICAgICAidGVzdCAlZCBmYWlsZWQgb24gJXMgYXQgcGFnZSAiCisJCQkJCSAgICAgICAiJXUgZm9yICVzXG4iLCBqLCBlLCBrLCBhbGdvKTsKKwkJCQkJaGV4ZHVtcChxLCBuKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJcSArPSBuOworCQkJCWlmIChrID09IHRlbXBsYXRlW2ldLm5wIC0gMSAmJiAhZW5jKSB7CisJCQkJCWlmIChtZW1jbXAocSwgdGVtcGxhdGVbaV0uaW5wdXQgKworCQkJCQkJICAgICAgdGVtcCArIG4sIGF1dGhzaXplKSkKKwkJCQkJCW4gPSBhdXRoc2l6ZTsKKwkJCQkJZWxzZQorCQkJCQkJbiA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJZm9yIChuID0gMDsgb2Zmc2V0X2luX3BhZ2UocSArIG4pICYmCisJCQkJCQkgICAgcVtuXTsgbisrKQorCQkJCQkJOworCQkJCX0KKwkJCQlpZiAobikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogYWVhZDogUmVzdWx0ICIKKwkJCQkJICAgICAgICJidWZmZXIgY29ycnVwdGlvbiBpbiBjaHVuayAiCisJCQkJCSAgICAgICAidGVzdCAlZCBvbiAlcyBhdCBwYWdlICV1IGZvciAiCisJCQkJCSAgICAgICAiJXM6ICV1IGJ5dGVzOlxuIiwgaiwgZSwgaywKKwkJCQkJICAgICAgIGFsZ28sIG4pOworCQkJCQloZXhkdW1wKHEsIG4pOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQl0ZW1wICs9IHRlbXBsYXRlW2ldLnRhcFtrXTsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IDA7CisKK291dDoKKwlhZWFkX3JlcXVlc3RfZnJlZShyZXEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jaXBoZXIoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwgaW50IGVuYywKKwkJICAgICAgIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyAqdGVtcGxhdGUsIHVuc2lnbmVkIGludCB0Y291bnQpCit7CisJY29uc3QgY2hhciAqYWxnbyA9IGNyeXB0b190Zm1fYWxnX2RyaXZlcl9uYW1lKGNyeXB0b19jaXBoZXJfdGZtKHRmbSkpOworCXVuc2lnbmVkIGludCBpLCBqLCBrOworCWludCByZXQ7CisJY2hhciAqcTsKKwljb25zdCBjaGFyICplOworCXZvaWQgKmRhdGE7CisKKwlpZiAoZW5jID09IEVOQ1JZUFQpCisJICAgICAgICBlID0gImVuY3J5cHRpb24iOworCWVsc2UKKwkJZSA9ICJkZWNyeXB0aW9uIjsKKworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCB0Y291bnQ7IGkrKykgeworCQlpZiAodGVtcGxhdGVbaV0ubnApCisJCQljb250aW51ZTsKKworCQlqKys7CisKKwkJZGF0YSA9IHhidWZbMF07CisJCW1lbWNweShkYXRhLCB0ZW1wbGF0ZVtpXS5pbnB1dCwgdGVtcGxhdGVbaV0uaWxlbik7CisKKwkJY3J5cHRvX2NpcGhlcl9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKKwkJaWYgKHRlbXBsYXRlW2ldLndrKQorCQkJY3J5cHRvX2NpcGhlcl9zZXRfZmxhZ3ModGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CisKKwkJcmV0ID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCisJCQkJCSAgIHRlbXBsYXRlW2ldLmtsZW4pOworCQlpZiAoIXJldCA9PSB0ZW1wbGF0ZVtpXS5mYWlsKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsZzogY2lwaGVyOiBzZXRrZXkgZmFpbGVkICIKKwkJCSAgICAgICAib24gdGVzdCAlZCBmb3IgJXM6IGZsYWdzPSV4XG4iLCBqLAorCQkJICAgICAgIGFsZ28sIGNyeXB0b19jaXBoZXJfZ2V0X2ZsYWdzKHRmbSkpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAocmV0KQorCQkJY29udGludWU7CisKKwkJZm9yIChrID0gMDsgayA8IHRlbXBsYXRlW2ldLmlsZW47CisJCSAgICAgayArPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pKSB7CisJCQlpZiAoZW5jKQorCQkJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBkYXRhICsgaywKKwkJCQkJCQkgIGRhdGEgKyBrKTsKKwkJCWVsc2UKKwkJCQljcnlwdG9fY2lwaGVyX2RlY3J5cHRfb25lKHRmbSwgZGF0YSArIGssCisJCQkJCQkJICBkYXRhICsgayk7CisJCX0KKworCQlxID0gZGF0YTsKKwkJaWYgKG1lbWNtcChxLCB0ZW1wbGF0ZVtpXS5yZXN1bHQsIHRlbXBsYXRlW2ldLnJsZW4pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsZzogY2lwaGVyOiBUZXN0ICVkIGZhaWxlZCAiCisJCQkgICAgICAgIm9uICVzIGZvciAlc1xuIiwgaiwgZSwgYWxnbyk7CisJCQloZXhkdW1wKHEsIHRlbXBsYXRlW2ldLnJsZW4pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9za2NpcGhlcihzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSwgaW50IGVuYywKKwkJCSBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgKnRlbXBsYXRlLCB1bnNpZ25lZCBpbnQgdGNvdW50KQoreworCWNvbnN0IGNoYXIgKmFsZ28gPQorCQljcnlwdG9fdGZtX2FsZ19kcml2ZXJfbmFtZShjcnlwdG9fYWJsa2NpcGhlcl90Zm0odGZtKSk7CisJdW5zaWduZWQgaW50IGksIGosIGssIG4sIHRlbXA7CisJaW50IHJldDsKKwljaGFyICpxOworCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbOF07CisJY29uc3QgY2hhciAqZTsKKwlzdHJ1Y3QgdGNyeXB0X3Jlc3VsdCByZXN1bHQ7CisJdm9pZCAqZGF0YTsKKwljaGFyIGl2W01BWF9JVkxFTl07CisKKwlpZiAoZW5jID09IEVOQ1JZUFQpCisJICAgICAgICBlID0gImVuY3J5cHRpb24iOworCWVsc2UKKwkJZSA9ICJkZWNyeXB0aW9uIjsKKworCWluaXRfY29tcGxldGlvbigmcmVzdWx0LmNvbXBsZXRpb24pOworCisJcmVxID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IHNrY2lwaGVyOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCAiCisJCSAgICAgICAiZm9yICVzXG4iLCBhbGdvKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorCQkJCQl0Y3J5cHRfY29tcGxldGUsICZyZXN1bHQpOworCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHRjb3VudDsgaSsrKSB7CisJCWlmICh0ZW1wbGF0ZVtpXS5pdikKKwkJCW1lbWNweShpdiwgdGVtcGxhdGVbaV0uaXYsIE1BWF9JVkxFTik7CisJCWVsc2UKKwkJCW1lbXNldChpdiwgMCwgTUFYX0lWTEVOKTsKKworCQlpZiAoISh0ZW1wbGF0ZVtpXS5ucCkpIHsKKwkJCWorKzsKKworCQkJZGF0YSA9IHhidWZbMF07CisJCQltZW1jcHkoZGF0YSwgdGVtcGxhdGVbaV0uaW5wdXQsIHRlbXBsYXRlW2ldLmlsZW4pOworCisJCQljcnlwdG9fYWJsa2NpcGhlcl9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKKwkJCWlmICh0ZW1wbGF0ZVtpXS53aykKKwkJCQljcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3MoCisJCQkJCXRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOworCisJCQlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCisJCQkJCQkgICAgICAgdGVtcGxhdGVbaV0ua2xlbik7CisJCQlpZiAoIXJldCA9PSB0ZW1wbGF0ZVtpXS5mYWlsKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IHNrY2lwaGVyOiBzZXRrZXkgZmFpbGVkICIKKwkJCQkgICAgICAgIm9uIHRlc3QgJWQgZm9yICVzOiBmbGFncz0leFxuIiwgaiwKKwkJCQkgICAgICAgYWxnbywgY3J5cHRvX2FibGtjaXBoZXJfZ2V0X2ZsYWdzKHRmbSkpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIGlmIChyZXQpCisJCQkJY29udGludWU7CisKKwkJCXNnX2luaXRfb25lKCZzZ1swXSwgZGF0YSwgdGVtcGxhdGVbaV0uaWxlbik7CisKKwkJCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZywgc2csCisJCQkJCQkgICAgIHRlbXBsYXRlW2ldLmlsZW4sIGl2KTsKKwkJCXJldCA9IGVuYyA/CisJCQkJY3J5cHRvX2FibGtjaXBoZXJfZW5jcnlwdChyZXEpIDoKKwkJCQljcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7CisKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJCWNhc2UgLUVCVVNZOgorCQkJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKKwkJCQkJJnJlc3VsdC5jb21wbGV0aW9uKTsKKwkJCQlpZiAoIXJldCAmJiAhKChyZXQgPSByZXN1bHQuZXJyKSkpIHsKKwkJCQkJSU5JVF9DT01QTEVUSU9OKHJlc3VsdC5jb21wbGV0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogc2tjaXBoZXI6ICVzIGZhaWxlZCBvbiAiCisJCQkJICAgICAgICJ0ZXN0ICVkIGZvciAlczogcmV0PSVkXG4iLCBlLCBqLCBhbGdvLAorCQkJCSAgICAgICAtcmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcSA9IGRhdGE7CisJCQlpZiAobWVtY21wKHEsIHRlbXBsYXRlW2ldLnJlc3VsdCwgdGVtcGxhdGVbaV0ucmxlbikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogc2tjaXBoZXI6IFRlc3QgJWQgIgorCQkJCSAgICAgICAiZmFpbGVkIG9uICVzIGZvciAlc1xuIiwgaiwgZSwgYWxnbyk7CisJCQkJaGV4ZHVtcChxLCB0ZW1wbGF0ZVtpXS5ybGVuKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHRjb3VudDsgaSsrKSB7CisKKwkJaWYgKHRlbXBsYXRlW2ldLml2KQorCQkJbWVtY3B5KGl2LCB0ZW1wbGF0ZVtpXS5pdiwgTUFYX0lWTEVOKTsKKwkJZWxzZQorCQkJbWVtc2V0KGl2LCAwLCBNQVhfSVZMRU4pOworCisJCWlmICh0ZW1wbGF0ZVtpXS5ucCkgeworCQkJaisrOworCisJCQljcnlwdG9fYWJsa2NpcGhlcl9jbGVhcl9mbGFncyh0Zm0sIH4wKTsKKwkJCWlmICh0ZW1wbGF0ZVtpXS53aykKKwkJCQljcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3MoCisJCQkJCXRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOworCisJCQlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkodGZtLCB0ZW1wbGF0ZVtpXS5rZXksCisJCQkJCQkgICAgICAgdGVtcGxhdGVbaV0ua2xlbik7CisJCQlpZiAoIXJldCA9PSB0ZW1wbGF0ZVtpXS5mYWlsKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IHNrY2lwaGVyOiBzZXRrZXkgZmFpbGVkICIKKwkJCQkgICAgICAgIm9uIGNodW5rIHRlc3QgJWQgZm9yICVzOiBmbGFncz0leFxuIiwKKwkJCQkgICAgICAgaiwgYWxnbywKKwkJCQkgICAgICAgY3J5cHRvX2FibGtjaXBoZXJfZ2V0X2ZsYWdzKHRmbSkpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIGlmIChyZXQpCisJCQkJY29udGludWU7CisKKwkJCXRlbXAgPSAwOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCXNnX2luaXRfdGFibGUoc2csIHRlbXBsYXRlW2ldLm5wKTsKKwkJCWZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7CisJCQkJaWYgKFdBUk5fT04ob2Zmc2V0X2luX3BhZ2UoSURYW2tdKSArCisJCQkJCSAgICB0ZW1wbGF0ZVtpXS50YXBba10gPiBQQUdFX1NJWkUpKQorCQkJCQlnb3RvIG91dDsKKworCQkJCXEgPSB4YnVmW0lEWFtrXSA+PiBQQUdFX1NISUZUXSArCisJCQkJICAgIG9mZnNldF9pbl9wYWdlKElEWFtrXSk7CisKKwkJCQltZW1jcHkocSwgdGVtcGxhdGVbaV0uaW5wdXQgKyB0ZW1wLAorCQkJCSAgICAgICB0ZW1wbGF0ZVtpXS50YXBba10pOworCisJCQkJaWYgKG9mZnNldF9pbl9wYWdlKHEpICsgdGVtcGxhdGVbaV0udGFwW2tdIDwKKwkJCQkgICAgUEFHRV9TSVpFKQorCQkJCQlxW3RlbXBsYXRlW2ldLnRhcFtrXV0gPSAwOworCisJCQkJc2dfc2V0X2J1Zigmc2dba10sIHEsIHRlbXBsYXRlW2ldLnRhcFtrXSk7CisKKwkJCQl0ZW1wICs9IHRlbXBsYXRlW2ldLnRhcFtrXTsKKwkJCX0KKworCQkJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywKKwkJCQkJdGVtcGxhdGVbaV0uaWxlbiwgaXYpOworCisJCQlyZXQgPSBlbmMgPworCQkJCWNyeXB0b19hYmxrY2lwaGVyX2VuY3J5cHQocmVxKSA6CisJCQkJY3J5cHRvX2FibGtjaXBoZXJfZGVjcnlwdChyZXEpOworCisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCQljYXNlIC1FQlVTWToKKwkJCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCisJCQkJCSZyZXN1bHQuY29tcGxldGlvbik7CisJCQkJaWYgKCFyZXQgJiYgISgocmV0ID0gcmVzdWx0LmVycikpKSB7CisJCQkJCUlOSVRfQ09NUExFVElPTihyZXN1bHQuY29tcGxldGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IHNrY2lwaGVyOiAlcyBmYWlsZWQgb24gIgorCQkJCSAgICAgICAiY2h1bmsgdGVzdCAlZCBmb3IgJXM6IHJldD0lZFxuIiwgZSwgaiwKKwkJCQkgICAgICAgYWxnbywgLXJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXRlbXAgPSAwOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZVtpXS5ucDsgaysrKSB7CisJCQkJcSA9IHhidWZbSURYW2tdID4+IFBBR0VfU0hJRlRdICsKKwkJCQkgICAgb2Zmc2V0X2luX3BhZ2UoSURYW2tdKTsKKworCQkJCWlmIChtZW1jbXAocSwgdGVtcGxhdGVbaV0ucmVzdWx0ICsgdGVtcCwKKwkJCQkJICAgdGVtcGxhdGVbaV0udGFwW2tdKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogc2tjaXBoZXI6IENodW5rICIKKwkJCQkJICAgICAgICJ0ZXN0ICVkIGZhaWxlZCBvbiAlcyBhdCBwYWdlICIKKwkJCQkJICAgICAgICIldSBmb3IgJXNcbiIsIGosIGUsIGssIGFsZ28pOworCQkJCQloZXhkdW1wKHEsIHRlbXBsYXRlW2ldLnRhcFtrXSk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXEgKz0gdGVtcGxhdGVbaV0udGFwW2tdOworCQkJCWZvciAobiA9IDA7IG9mZnNldF9pbl9wYWdlKHEgKyBuKSAmJiBxW25dOyBuKyspCisJCQkJCTsKKwkJCQlpZiAobikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgImFsZzogc2tjaXBoZXI6ICIKKwkJCQkJICAgICAgICJSZXN1bHQgYnVmZmVyIGNvcnJ1cHRpb24gaW4gIgorCQkJCQkgICAgICAgImNodW5rIHRlc3QgJWQgb24gJXMgYXQgcGFnZSAiCisJCQkJCSAgICAgICAiJXUgZm9yICVzOiAldSBieXRlczpcbiIsIGosIGUsCisJCQkJCSAgICAgICBrLCBhbGdvLCBuKTsKKwkJCQkJaGV4ZHVtcChxLCBuKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXRlbXAgKz0gdGVtcGxhdGVbaV0udGFwW2tdOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gMDsKKworb3V0OgorCWFibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZXN0X2NvbXAoc3RydWN0IGNyeXB0b19jb21wICp0Zm0sIHN0cnVjdCBjb21wX3Rlc3R2ZWMgKmN0ZW1wbGF0ZSwKKwkJICAgICBzdHJ1Y3QgY29tcF90ZXN0dmVjICpkdGVtcGxhdGUsIGludCBjdGNvdW50LCBpbnQgZHRjb3VudCkKK3sKKwljb25zdCBjaGFyICphbGdvID0gY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoY3J5cHRvX2NvbXBfdGZtKHRmbSkpOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgcmVzdWx0W0NPTVBfQlVGX1NJWkVdOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3Rjb3VudDsgaSsrKSB7CisJCWludCBpbGVuLCBkbGVuID0gQ09NUF9CVUZfU0laRTsKKworCQltZW1zZXQocmVzdWx0LCAwLCBzaXplb2YgKHJlc3VsdCkpOworCisJCWlsZW4gPSBjdGVtcGxhdGVbaV0uaW5sZW47CisJCXJldCA9IGNyeXB0b19jb21wX2NvbXByZXNzKHRmbSwgY3RlbXBsYXRlW2ldLmlucHV0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbGVuLCByZXN1bHQsICZkbGVuKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGNvbXA6IGNvbXByZXNzaW9uIGZhaWxlZCAiCisJCQkgICAgICAgIm9uIHRlc3QgJWQgZm9yICVzOiByZXQ9JWRcbiIsIGkgKyAxLCBhbGdvLAorCQkJICAgICAgIC1yZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobWVtY21wKHJlc3VsdCwgY3RlbXBsYXRlW2ldLm91dHB1dCwgZGxlbikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjb21wOiBDb21wcmVzc2lvbiB0ZXN0ICVkICIKKwkJCSAgICAgICAiZmFpbGVkIGZvciAlc1xuIiwgaSArIDEsIGFsZ28pOworCQkJaGV4ZHVtcChyZXN1bHQsIGRsZW4pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGR0Y291bnQ7IGkrKykgeworCQlpbnQgaWxlbiwgcmV0LCBkbGVuID0gQ09NUF9CVUZfU0laRTsKKworCQltZW1zZXQocmVzdWx0LCAwLCBzaXplb2YgKHJlc3VsdCkpOworCisJCWlsZW4gPSBkdGVtcGxhdGVbaV0uaW5sZW47CisJCXJldCA9IGNyeXB0b19jb21wX2RlY29tcHJlc3ModGZtLCBkdGVtcGxhdGVbaV0uaW5wdXQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxlbiwgcmVzdWx0LCAmZGxlbik7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjb21wOiBkZWNvbXByZXNzaW9uIGZhaWxlZCAiCisJCQkgICAgICAgIm9uIHRlc3QgJWQgZm9yICVzOiByZXQ9JWRcbiIsIGkgKyAxLCBhbGdvLAorCQkJICAgICAgIC1yZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobWVtY21wKHJlc3VsdCwgZHRlbXBsYXRlW2ldLm91dHB1dCwgZGxlbikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjb21wOiBEZWNvbXByZXNzaW9uIHRlc3QgJWQgIgorCQkJICAgICAgICJmYWlsZWQgZm9yICVzXG4iLCBpICsgMSwgYWxnbyk7CisJCQloZXhkdW1wKHJlc3VsdCwgZGxlbik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXQgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbGdfdGVzdF9hZWFkKGNvbnN0IHN0cnVjdCBhbGdfdGVzdF9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpkcml2ZXIsCisJCQkgdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtOworCWludCBlcnIgPSAwOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2FlYWQoZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGFlYWQ6IEZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgJXM6ICIKKwkJICAgICAgICIlbGRcbiIsIGRyaXZlciwgUFRSX0VSUih0Zm0pKTsKKwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwl9CisKKwlpZiAoZGVzYy0+c3VpdGUuYWVhZC5lbmMudmVjcykgeworCQllcnIgPSB0ZXN0X2FlYWQodGZtLCBFTkNSWVBULCBkZXNjLT5zdWl0ZS5hZWFkLmVuYy52ZWNzLAorCQkJCWRlc2MtPnN1aXRlLmFlYWQuZW5jLmNvdW50KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmICghZXJyICYmIGRlc2MtPnN1aXRlLmFlYWQuZGVjLnZlY3MpCisJCWVyciA9IHRlc3RfYWVhZCh0Zm0sIERFQ1JZUFQsIGRlc2MtPnN1aXRlLmFlYWQuZGVjLnZlY3MsCisJCQkJZGVzYy0+c3VpdGUuYWVhZC5kZWMuY291bnQpOworCitvdXQ6CisJY3J5cHRvX2ZyZWVfYWVhZCh0Zm0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWxnX3Rlc3RfY2lwaGVyKGNvbnN0IHN0cnVjdCBhbGdfdGVzdF9kZXNjICpkZXNjLAorCQkJICAgY29uc3QgY2hhciAqZHJpdmVyLCB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbTsKKwlpbnQgZXJyID0gMDsKKworCXRmbSA9IGNyeXB0b19hbGxvY19jaXBoZXIoZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGNpcGhlcjogRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciAiCisJCSAgICAgICAiJXM6ICVsZFxuIiwgZHJpdmVyLCBQVFJfRVJSKHRmbSkpOworCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCX0KKworCWlmIChkZXNjLT5zdWl0ZS5jaXBoZXIuZW5jLnZlY3MpIHsKKwkJZXJyID0gdGVzdF9jaXBoZXIodGZtLCBFTkNSWVBULCBkZXNjLT5zdWl0ZS5jaXBoZXIuZW5jLnZlY3MsCisJCQkJICBkZXNjLT5zdWl0ZS5jaXBoZXIuZW5jLmNvdW50KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChkZXNjLT5zdWl0ZS5jaXBoZXIuZGVjLnZlY3MpCisJCWVyciA9IHRlc3RfY2lwaGVyKHRmbSwgREVDUllQVCwgZGVzYy0+c3VpdGUuY2lwaGVyLmRlYy52ZWNzLAorCQkJCSAgZGVzYy0+c3VpdGUuY2lwaGVyLmRlYy5jb3VudCk7CisKK291dDoKKwljcnlwdG9fZnJlZV9jaXBoZXIodGZtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFsZ190ZXN0X3NrY2lwaGVyKGNvbnN0IHN0cnVjdCBhbGdfdGVzdF9kZXNjICpkZXNjLAorCQkJICAgICBjb25zdCBjaGFyICpkcml2ZXIsIHUzMiB0eXBlLCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbTsKKwlpbnQgZXJyID0gMDsKKworCXRmbSA9IGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKGRyaXZlciwgdHlwZSwgbWFzayk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBza2NpcGhlcjogRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciAiCisJCSAgICAgICAiJXM6ICVsZFxuIiwgZHJpdmVyLCBQVFJfRVJSKHRmbSkpOworCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCX0KKworCWlmIChkZXNjLT5zdWl0ZS5jaXBoZXIuZW5jLnZlY3MpIHsKKwkJZXJyID0gdGVzdF9za2NpcGhlcih0Zm0sIEVOQ1JZUFQsIGRlc2MtPnN1aXRlLmNpcGhlci5lbmMudmVjcywKKwkJCQkgICAgZGVzYy0+c3VpdGUuY2lwaGVyLmVuYy5jb3VudCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGVzYy0+c3VpdGUuY2lwaGVyLmRlYy52ZWNzKQorCQllcnIgPSB0ZXN0X3NrY2lwaGVyKHRmbSwgREVDUllQVCwgZGVzYy0+c3VpdGUuY2lwaGVyLmRlYy52ZWNzLAorCQkJCSAgICBkZXNjLT5zdWl0ZS5jaXBoZXIuZGVjLmNvdW50KTsKKworb3V0OgorCWNyeXB0b19mcmVlX2FibGtjaXBoZXIodGZtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFsZ190ZXN0X2NvbXAoY29uc3Qgc3RydWN0IGFsZ190ZXN0X2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKmRyaXZlciwKKwkJCSB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJc3RydWN0IGNyeXB0b19jb21wICp0Zm07CisJaW50IGVycjsKKworCXRmbSA9IGNyeXB0b19hbGxvY19jb21wKGRyaXZlciwgdHlwZSwgbWFzayk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjb21wOiBGYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAiCisJCSAgICAgICAiJWxkXG4iLCBkcml2ZXIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiBQVFJfRVJSKHRmbSk7CisJfQorCisJZXJyID0gdGVzdF9jb21wKHRmbSwgZGVzYy0+c3VpdGUuY29tcC5jb21wLnZlY3MsCisJCQlkZXNjLT5zdWl0ZS5jb21wLmRlY29tcC52ZWNzLAorCQkJZGVzYy0+c3VpdGUuY29tcC5jb21wLmNvdW50LAorCQkJZGVzYy0+c3VpdGUuY29tcC5kZWNvbXAuY291bnQpOworCisJY3J5cHRvX2ZyZWVfY29tcCh0Zm0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWxnX3Rlc3RfaGFzaChjb25zdCBzdHJ1Y3QgYWxnX3Rlc3RfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqZHJpdmVyLAorCQkJIHUzMiB0eXBlLCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm07CisJaW50IGVycjsKKworCXRmbSA9IGNyeXB0b19hbGxvY19haGFzaChkcml2ZXIsIHR5cGUsIG1hc2spOworCWlmIChJU19FUlIodGZtKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFsZzogaGFzaDogRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciAlczogIgorCQkgICAgICAgIiVsZFxuIiwgZHJpdmVyLCBQVFJfRVJSKHRmbSkpOworCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCX0KKworCWVyciA9IHRlc3RfaGFzaCh0Zm0sIGRlc2MtPnN1aXRlLmhhc2gudmVjcywgZGVzYy0+c3VpdGUuaGFzaC5jb3VudCk7CisKKwljcnlwdG9fZnJlZV9haGFzaCh0Zm0pOworCXJldHVybiBlcnI7Cit9CisKKy8qIFBsZWFzZSBrZWVwIHRoaXMgbGlzdCBzb3J0ZWQgYnkgYWxnb3JpdGhtIG5hbWUuICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ190ZXN0X2Rlc2MgYWxnX3Rlc3RfZGVzY3NbXSA9IHsKKwl7CisJCS5hbGcgPSAiY2JjKGFlcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gYWVzX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFFU19DQkNfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBhZXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImNiYyhhbnViaXMpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGFudWJpc19jYmNfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBTlVCSVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gYW51YmlzX2NiY19kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFOVUJJU19DQkNfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJjYmMoYmxvd2Zpc2gpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGJmX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEJGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGJmX2NiY19kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEJGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImNiYyhjYW1lbGxpYSkiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gY2FtZWxsaWFfY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQ0FNRUxMSUFfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gY2FtZWxsaWFfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQ0FNRUxMSUFfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiY2JjKGRlcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gZGVzX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IERFU19DQkNfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBkZXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gREVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImNiYyhkZXMzX2VkZSkiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gZGVzM19lZGVfY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gREVTM19FREVfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gZGVzM19lZGVfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gREVTM19FREVfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiY2JjKHR3b2Zpc2gpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IHRmX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFRGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IHRmX2NiY19kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImNjbShhZXMpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9hZWFkLAorCQkuc3VpdGUgPSB7CisJCQkuYWVhZCA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGFlc19jY21fZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBRVNfQ0NNX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gYWVzX2NjbV9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFFU19DQ01fREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJjcmMzMmMiLAorCQkudGVzdCA9IGFsZ190ZXN0X2hhc2gsCisJCS5zdWl0ZSA9IHsKKwkJCS5oYXNoID0geworCQkJCS52ZWNzID0gY3JjMzJjX3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IENSQzMyQ19URVNUX1ZFQ1RPUlMKKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJjdHMoY2JjKGFlcykpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGN0c19tb2RlX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQ1RTX01PREVfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBjdHNfbW9kZV9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IENUU19NT0RFX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZGVmbGF0ZSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfY29tcCwKKwkJLnN1aXRlID0geworCQkJLmNvbXAgPSB7CisJCQkJLmNvbXAgPSB7CisJCQkJCS52ZWNzID0gZGVmbGF0ZV9jb21wX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBERUZMQVRFX0NPTVBfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjb21wID0geworCQkJCQkudmVjcyA9IGRlZmxhdGVfZGVjb21wX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBERUZMQVRFX0RFQ09NUF9URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGFlcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gYWVzX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gYWVzX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGFudWJpcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gYW51YmlzX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQU5VQklTX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gYW51YmlzX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQU5VQklTX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGFyYzQpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGFyYzRfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBUkM0X0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gYXJjNF9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFSQzRfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJlY2IoYmxvd2Zpc2gpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGJmX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQkZfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBiZl9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEJGX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGNhbWVsbGlhKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBjYW1lbGxpYV9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IENBTUVMTElBX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gY2FtZWxsaWFfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBDQU1FTExJQV9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImVjYihjYXN0NSkiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gY2FzdDVfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBDQVNUNV9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGNhc3Q1X2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQ0FTVDVfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJlY2IoY2FzdDYpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGNhc3Q2X2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQ0FTVDZfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBjYXN0Nl9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IENBU1Q2X0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGRlcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gZGVzX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gREVTX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gZGVzX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gREVTX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKGRlczNfZWRlKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBkZXMzX2VkZV9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IERFUzNfRURFX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gZGVzM19lZGVfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBERVMzX0VERV9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImVjYihraGF6YWQpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGtoYXphZF9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEtIQVpBRF9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGtoYXphZF9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEtIQVpBRF9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImVjYihzZWVkKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBzZWVkX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gU0VFRF9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IHNlZWRfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBTRUVEX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKHNlcnBlbnQpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IHNlcnBlbnRfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBTRVJQRU5UX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gc2VycGVudF9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFNFUlBFTlRfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJlY2IodGVhKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSB0ZWFfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBURUFfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSB0ZWFfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBURUFfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJlY2IodG5lcHJlcykiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gdG5lcHJlc19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFRORVBSRVNfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSB0bmVwcmVzX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gVE5FUFJFU19ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImVjYih0d29maXNoKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSB0Zl9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFRGX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0gdGZfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBURl9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImVjYih4ZXRhKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSB4ZXRhX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gWEVUQV9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IHhldGFfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBYRVRBX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiZWNiKHh0ZWEpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IHh0ZWFfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBYVEVBX0VOQ19URVNUX1ZFQ1RPUlMKKwkJCQl9LAorCQkJCS5kZWMgPSB7CisJCQkJCS52ZWNzID0geHRlYV9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IFhURUFfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJnY20oYWVzKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfYWVhZCwKKwkJLnN1aXRlID0geworCQkJLmFlYWQgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBhZXNfZ2NtX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0dDTV9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGFlc19nY21fZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBRVNfR0NNX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiaG1hYyhtZDUpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IGhtYWNfbWQ1X3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IEhNQUNfTUQ1X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImhtYWMocm1kMTI4KSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBobWFjX3JtZDEyOF90dl90ZW1wbGF0ZSwKKwkJCQkuY291bnQgPSBITUFDX1JNRDEyOF9URVNUX1ZFQ1RPUlMKKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJobWFjKHJtZDE2MCkiLAorCQkudGVzdCA9IGFsZ190ZXN0X2hhc2gsCisJCS5zdWl0ZSA9IHsKKwkJCS5oYXNoID0geworCQkJCS52ZWNzID0gaG1hY19ybWQxNjBfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gSE1BQ19STUQxNjBfVEVTVF9WRUNUT1JTCisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiaG1hYyhzaGExKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBobWFjX3NoYTFfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gSE1BQ19TSEExX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImhtYWMoc2hhMjI0KSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBobWFjX3NoYTIyNF90dl90ZW1wbGF0ZSwKKwkJCQkuY291bnQgPSBITUFDX1NIQTIyNF9URVNUX1ZFQ1RPUlMKKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJobWFjKHNoYTI1NikiLAorCQkudGVzdCA9IGFsZ190ZXN0X2hhc2gsCisJCS5zdWl0ZSA9IHsKKwkJCS5oYXNoID0geworCQkJCS52ZWNzID0gaG1hY19zaGEyNTZfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gSE1BQ19TSEEyNTZfVEVTVF9WRUNUT1JTCisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAiaG1hYyhzaGEzODQpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IEhNQUNfU0hBMzg0X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImhtYWMoc2hhNTEyKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBobWFjX3NoYTUxMl90dl90ZW1wbGF0ZSwKKwkJCQkuY291bnQgPSBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMKKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJscncoYWVzKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBhZXNfbHJ3X2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0xSV19FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGFlc19scndfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAibHpvIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9jb21wLAorCQkuc3VpdGUgPSB7CisJCQkuY29tcCA9IHsKKwkJCQkuY29tcCA9IHsKKwkJCQkJLnZlY3MgPSBsem9fY29tcF90dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gTFpPX0NPTVBfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjb21wID0geworCQkJCQkudmVjcyA9IGx6b19kZWNvbXBfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IExaT19ERUNPTVBfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIm1kNCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBtZDRfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gTUQ0X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIm1kNSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBtZDVfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gTUQ1X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIm1pY2hhZWxfbWljIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IG1pY2hhZWxfbWljX3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IE1JQ0hBRUxfTUlDX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInBjYmMoZmNyeXB0KSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gRkNSWVBUX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9LCB7CisJCS5hbGcgPSAicmZjMzY4NihjdHIoYWVzKSkiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gYWVzX2N0cl9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFFU19DVFJfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSBhZXNfY3RyX2RlY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX0NUUl9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInJtZDEyOCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBybWQxMjhfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gUk1EMTI4X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInJtZDE2MCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBybWQxNjBfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gUk1EMTYwX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInJtZDI1NiIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBybWQyNTZfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gUk1EMjU2X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInJtZDMyMCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBybWQzMjBfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gUk1EMzIwX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNhbHNhMjAiLAorCQkudGVzdCA9IGFsZ190ZXN0X3NrY2lwaGVyLAorCQkuc3VpdGUgPSB7CisJCQkuY2lwaGVyID0geworCQkJCS5lbmMgPSB7CisJCQkJCS52ZWNzID0gc2Fsc2EyMF9zdHJlYW1fZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBTQUxTQTIwX1NUUkVBTV9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNoYTEiLAorCQkudGVzdCA9IGFsZ190ZXN0X2hhc2gsCisJCS5zdWl0ZSA9IHsKKwkJCS5oYXNoID0geworCQkJCS52ZWNzID0gc2hhMV90dl90ZW1wbGF0ZSwKKwkJCQkuY291bnQgPSBTSEExX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNoYTIyNCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBzaGEyMjRfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gU0hBMjI0X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNoYTI1NiIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBzaGEyNTZfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gU0hBMjU2X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNoYTM4NCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBzaGEzODRfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gU0hBMzg0X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInNoYTUxMiIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBzaGE1MTJfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gU0hBNTEyX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInRncjEyOCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSB0Z3IxMjhfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gVEdSMTI4X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInRncjE2MCIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSB0Z3IxNjBfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gVEdSMTYwX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInRncjE5MiIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSB0Z3IxOTJfdHZfdGVtcGxhdGUsCisJCQkJLmNvdW50ID0gVEdSMTkyX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIndwMjU2IiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IHdwMjU2X3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IFdQMjU2X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIndwMzg0IiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IHdwMzg0X3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IFdQMzg0X1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gIndwNTEyIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9oYXNoLAorCQkuc3VpdGUgPSB7CisJCQkuaGFzaCA9IHsKKwkJCQkudmVjcyA9IHdwNTEyX3R2X3RlbXBsYXRlLAorCQkJCS5jb3VudCA9IFdQNTEyX1RFU1RfVkVDVE9SUworCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gInhjYmMoYWVzKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3RfaGFzaCwKKwkJLnN1aXRlID0geworCQkJLmhhc2ggPSB7CisJCQkJLnZlY3MgPSBhZXNfeGNiYzEyOF90dl90ZW1wbGF0ZSwKKwkJCQkuY291bnQgPSBYQ0JDX0FFU19URVNUX1ZFQ1RPUlMKKwkJCX0KKwkJfQorCX0sIHsKKwkJLmFsZyA9ICJ4dHMoYWVzKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSBhZXNfeHRzX2VuY190dl90ZW1wbGF0ZSwKKwkJCQkJLmNvdW50ID0gQUVTX1hUU19FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGFlc194dHNfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBBRVNfWFRTX0RFQ19URVNUX1ZFQ1RPUlMKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCitzdGF0aWMgaW50IGFsZ19maW5kX3Rlc3QoY29uc3QgY2hhciAqYWxnKQoreworCWludCBzdGFydCA9IDA7CisJaW50IGVuZCA9IEFSUkFZX1NJWkUoYWxnX3Rlc3RfZGVzY3MpOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCWludCBpID0gKHN0YXJ0ICsgZW5kKSAvIDI7CisJCWludCBkaWZmID0gc3RyY21wKGFsZ190ZXN0X2Rlc2NzW2ldLmFsZywgYWxnKTsKKworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWVuZCA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChkaWZmIDwgMCkgeworCQkJc3RhcnQgPSBpICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgYWxnX3Rlc3QoY29uc3QgY2hhciAqZHJpdmVyLCBjb25zdCBjaGFyICphbGcsIHUzMiB0eXBlLCB1MzIgbWFzaykKK3sKKwlpbnQgaTsKKworCWlmICgodHlwZSAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSA9PSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKSB7CisJCWNoYXIgbmFsZ1tDUllQVE9fTUFYX0FMR19OQU1FXTsKKworCQlpZiAoc25wcmludGYobmFsZywgc2l6ZW9mKG5hbGcpLCAiZWNiKCVzKSIsIGFsZykgPj0KKwkJICAgIHNpemVvZihuYWxnKSkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJCWkgPSBhbGdfZmluZF90ZXN0KG5hbGcpOworCQlpZiAoaSA8IDApCisJCQlnb3RvIG5vdGVzdDsKKworCQlyZXR1cm4gYWxnX3Rlc3RfY2lwaGVyKGFsZ190ZXN0X2Rlc2NzICsgaSwgZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwl9CisKKwlpID0gYWxnX2ZpbmRfdGVzdChhbGcpOworCWlmIChpIDwgMCkKKwkJZ290byBub3Rlc3Q7CisKKwlyZXR1cm4gYWxnX3Rlc3RfZGVzY3NbaV0udGVzdChhbGdfdGVzdF9kZXNjcyArIGksIGRyaXZlciwKKwkJCQkgICAgICB0eXBlLCBtYXNrKTsKKworbm90ZXN0OgorCXByaW50ayhLRVJOX0lORk8gImFsZzogTm8gdGVzdCBmb3IgJXMgKCVzKVxuIiwgYWxnLCBkcml2ZXIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWxnX3Rlc3QpOworCitpbnQgX19pbml0IHRlc3RtZ3JfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFhCVUZTSVpFOyBpKyspIHsKKwkJeGJ1ZltpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXhidWZbaV0pCisJCQlnb3RvIGVycl9mcmVlX3hidWY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFhCVUZTSVpFOyBpKyspIHsKKwkJYXhidWZbaV0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFheGJ1ZltpXSkKKwkJCWdvdG8gZXJyX2ZyZWVfYXhidWY7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2F4YnVmOgorCWZvciAoaSA9IDA7IGkgPCBYQlVGU0laRSAmJiBheGJ1ZltpXTsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXhidWZbaV0pOworZXJyX2ZyZWVfeGJ1ZjoKKwlmb3IgKGkgPSAwOyBpIDwgWEJVRlNJWkUgJiYgeGJ1ZltpXTsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpeGJ1ZltpXSk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCB0ZXN0bWdyX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYQlVGU0laRTsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXhidWZbaV0pOworCWZvciAoaSA9IDA7IGkgPCBYQlVGU0laRTsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpeGJ1ZltpXSk7Cit9CmRpZmYgLS1naXQgYS9jcnlwdG8vdGVzdG1nci5oIGIvY3J5cHRvL3Rlc3RtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL3Rlc3RtZ3IuaApAQCAtMCwwICsxLDg3MzggQEAKKy8qCisgKiBBbGdvcml0aG0gdGVzdGluZyBmcmFtZXdvcmsgYW5kIHRlc3RzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBKZWFuLUZyYW5jb2lzIERpdmUgPGplZkBsaW51eGJlLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBOb2tpYSBTaWVtZW5zIE5ldHdvcmtzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9DUllQVE9fVEVTVE1HUl9ICisjZGVmaW5lIF9DUllQVE9fVEVTVE1HUl9ICisKKyNkZWZpbmUgTUFYX0RJR0VTVF9TSVpFCQk2NAorI2RlZmluZSBNQVhfVEFQCQkJOAorCisjZGVmaW5lIE1BWF9LRVlMRU4JCTU2CisjZGVmaW5lIE1BWF9JVkxFTgkJMzIKKworc3RydWN0IGhhc2hfdGVzdHZlYyB7CisJLyogb25seSB1c2VkIHdpdGgga2V5ZWQgaGFzaCBhbGdvcml0aG1zICovCisJY2hhciAqa2V5OworCWNoYXIgKnBsYWludGV4dDsKKwljaGFyICpkaWdlc3Q7CisJdW5zaWduZWQgY2hhciB0YXBbTUFYX1RBUF07CisJdW5zaWduZWQgY2hhciBwc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIG5wOworCXVuc2lnbmVkIGNoYXIga3NpemU7Cit9OworCitzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgeworCWNoYXIgKmtleTsKKwljaGFyICppdjsKKwljaGFyICppbnB1dDsKKwljaGFyICpyZXN1bHQ7CisJdW5zaWduZWQgc2hvcnQgdGFwW01BWF9UQVBdOworCWludCBucDsKKwl1bnNpZ25lZCBjaGFyIGZhaWw7CisJdW5zaWduZWQgY2hhciB3azsgLyogd2VhayBrZXkgZmxhZyAqLworCXVuc2lnbmVkIGNoYXIga2xlbjsKKwl1bnNpZ25lZCBzaG9ydCBpbGVuOworCXVuc2lnbmVkIHNob3J0IHJsZW47Cit9OworCitzdHJ1Y3QgYWVhZF90ZXN0dmVjIHsKKwljaGFyICprZXk7CisJY2hhciAqaXY7CisJY2hhciAqaW5wdXQ7CisJY2hhciAqYXNzb2M7CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgdGFwW01BWF9UQVBdOworCXVuc2lnbmVkIGNoYXIgYXRhcFtNQVhfVEFQXTsKKwlpbnQgbnA7CisJaW50IGFucDsKKwl1bnNpZ25lZCBjaGFyIGZhaWw7CisJdW5zaWduZWQgY2hhciB3azsgLyogd2VhayBrZXkgZmxhZyAqLworCXVuc2lnbmVkIGNoYXIga2xlbjsKKwl1bnNpZ25lZCBzaG9ydCBpbGVuOworCXVuc2lnbmVkIHNob3J0IGFsZW47CisJdW5zaWduZWQgc2hvcnQgcmxlbjsKK307CisKK3N0YXRpYyBjaGFyIHplcm9lZF9zdHJpbmdbNDhdOworCisvKgorICogTUQ0IHRlc3QgdmVjdG9ycyBmcm9tIFJGQzEzMjAKKyAqLworI2RlZmluZSBNRDRfVEVTVF9WRUNUT1JTCTcKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgbWQ0X3R2X3RlbXBsYXRlIFtdID0geworCXsKKwkJLnBsYWludGV4dCA9ICIiLAorCQkuZGlnZXN0CT0gIlx4MzFceGQ2XHhjZlx4ZTBceGQxXHg2YVx4ZTlceDMxIgorCQkJICAiXHhiN1x4M2NceDU5XHhkN1x4ZTBceGMwXHg4OVx4YzAiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceGJkXHhlNVx4MmNceGIzXHgxZFx4ZTNceDNlXHg0NiIKKwkJCSAgIlx4MjRceDVlXHgwNVx4ZmJceGRiXHhkNlx4ZmJceDI0IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGE0XHg0OFx4MDFceDdhXHhhZlx4MjFceGQ4XHg1MiIKKwkJCSAgIlx4NWZceGMxXHgwYVx4ZThceDdhXHhhNlx4NzJceDlkIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAorCQkucHNpemUJPSAxNCwKKwkJLmRpZ2VzdAk9ICJceGQ5XHgxM1x4MGFceDgxXHg2NFx4NTRceDlmXHhlOCIKKwkJCSJceDE4XHg4N1x4NDhceDA2XHhlMVx4YzdceDAxXHg0YiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJLnBzaXplCT0gMjYsCisJCS5kaWdlc3QJPSAiXHhkN1x4OWVceDFjXHgzMFx4OGFceGE1XHhiYlx4Y2QiCisJCQkgICJceGVlXHhhOFx4ZWRceDYzXHhkZlx4NDFceDJkXHhhOSIsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDEzLCAxMyB9LAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisJCS5wc2l6ZQk9IDYyLAorCQkuZGlnZXN0CT0gIlx4MDRceDNmXHg4NVx4ODJceGYyXHg0MVx4ZGJceDM1IgorCQkJICAiXHgxY1x4ZTZceDI3XHhlMVx4NTNceGU3XHhmMFx4ZTQiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCisJCQkgICAiNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceGUzXHgzYlx4NGRceGRjXHg5Y1x4MzhceGYyXHgxOSIKKwkJCSAgIlx4OWNceDNlXHg3Ylx4MTZceDRmXHhjY1x4MDVceDM2IiwKKwl9LAorfTsKKworLyoKKyAqIE1ENSB0ZXN0IHZlY3RvcnMgZnJvbSBSRkMxMzIxCisgKi8KKyNkZWZpbmUgTUQ1X1RFU1RfVkVDVE9SUwk3CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIG1kNV90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmRpZ2VzdAk9ICJceGQ0XHgxZFx4OGNceGQ5XHg4Zlx4MDBceGIyXHgwNCIKKwkJCSAgIlx4ZTlceDgwXHgwOVx4OThceGVjXHhmOFx4NDJceDdlIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYSIsCisJCS5wc2l6ZQk9IDEsCisJCS5kaWdlc3QJPSAiXHgwY1x4YzFceDc1XHhiOVx4YzBceGYxXHhiNlx4YTgiCisJCQkgICJceDMxXHhjM1x4OTlceGUyXHg2OVx4NzdceDI2XHg2MSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHg5MFx4MDFceDUwXHg5OFx4M2NceGQyXHg0Zlx4YjAiCisJCQkgICJceGQ2XHg5Nlx4M2ZceDdkXHgyOFx4ZTFceDdmXHg3MiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIm1lc3NhZ2UgZGlnZXN0IiwKKwkJLnBzaXplCT0gMTQsCisJCS5kaWdlc3QJPSAiXHhmOVx4NmJceDY5XHg3ZFx4N2NceGI3XHg5M1x4OGQiCisJCQkgICJceDUyXHg1YVx4MmZceDMxXHhhYVx4ZjFceDYxXHhkMCIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJLnBzaXplCT0gMjYsCisJCS5kaWdlc3QJPSAiXHhjM1x4ZmNceGQzXHhkN1x4NjFceDkyXHhlNFx4MDAiCisJCQkgICJceDdkXHhmYlx4NDlceDZjXHhjYVx4NjdceGUxXHgzYiIsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7MTMsIDEzfQorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisJCS5wc2l6ZQk9IDYyLAorCQkuZGlnZXN0CT0gIlx4ZDFceDc0XHhhYlx4OThceGQyXHg3N1x4ZDlceGY1IgorCQkJICAiXHhhNVx4NjFceDFjXHgyY1x4OWZceDQxXHg5ZFx4OWYiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMiIKKwkJCSAgICIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceDU3XHhlZFx4ZjRceGEyXHgyYlx4ZTNceGM5XHg1NSIKKwkJCSAgIlx4YWNceDQ5XHhkYVx4MmVceDIxXHgwN1x4YjZceDdhIiwKKwl9CisKK307CisKKy8qCisgKiBSSVBFTUQtMTI4IHRlc3QgdmVjdG9ycyBmcm9tIElTTy9JRUMgMTAxMTgtMzoyMDA0KEUpCisgKi8KKyNkZWZpbmUgUk1EMTI4X1RFU1RfVkVDVE9SUyAgICAgMTAKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcm1kMTI4X3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkuZGlnZXN0CT0gIlx4Y2RceGYyXHg2Mlx4MTNceGExXHg1MFx4ZGNceDNlIgorCQkJICAiXHhjYlx4NjFceDBmXHgxOFx4ZjZceGIzXHg4Ylx4NDYiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceDg2XHhiZVx4N2FceGZhXHgzM1x4OWRceDBmXHhjNyIKKwkJCSAgIlx4Y2ZceGM3XHg4NVx4ZTdceDJmXHg1N1x4OGRceDMzIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGMxXHg0YVx4MTJceDE5XHg5Y1x4NjZceGU0XHhiYSIKKwkJCSAgIlx4ODRceDYzXHg2Ylx4MGZceDY5XHgxNFx4NGNceDc3IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAorCQkucHNpemUJPSAxNCwKKwkJLmRpZ2VzdAk9ICJceDllXHgzMlx4N2JceDNkXHg2ZVx4NTJceDMwXHg2MiIKKwkJCSAgIlx4YWZceGMxXHgxM1x4MmRceDdkXHhmOVx4ZDFceGI4IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceGZkXHgyYVx4YTZceDA3XHhmN1x4MWRceGM4XHhmNSIKKwkJCSAgIlx4MTBceDcxXHg0OVx4MjJceGIzXHg3MVx4ODNceDRlIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZSIKKwkJCSAgICAgImZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCQkucHNpemUJPSA2MiwKKwkJLmRpZ2VzdAk9ICJceGQxXHhlOVx4NTlceGViXHgxN1x4OWNceDkxXHgxZiIKKwkJCSAgIlx4YWVceGE0XHg2Mlx4NGNceDYwXHhjNVx4YzdceDAyIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKwkJCSAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceDNmXHg0NVx4ZWZceDE5XHg0N1x4MzJceGMyXHhkYiIKKwkJCSAgIlx4YjJceGM0XHhhMlx4YzdceDY5XHg3OVx4NWZceGEzIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpaiIKKwkJCSAgICAgImhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSA1NiwKKwkJLmRpZ2VzdAk9ICJceGExXHhhYVx4MDZceDg5XHhkMFx4ZmFceGZhXHgyZCIKKwkJCSAgIlx4ZGNceDIyXHhlOFx4OGJceDQ5XHgxM1x4M2FceDA2IiwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMjgsIDI4IH0sCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpIgorCQkJICAgICAiamtsbWdoaWprbG1uaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXIiCisJCQkgICAgICJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLAorCQkucHNpemUJPSAxMTIsCisJCS5kaWdlc3QJPSAiXHhkNFx4ZWNceGM5XHgxM1x4ZTFceGRmXHg3N1x4NmIiCisJCQkgICJceGY0XHg4ZFx4ZTlceGQ1XHg1Ylx4MWZceDI1XHg0NiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWprIiwKKwkJLnBzaXplCT0gMzIsCisJCS5kaWdlc3QJPSAiXHgxM1x4ZmNceDEzXHhlOFx4ZWZceGZmXHgzNFx4N2QiCisJCQkgICJceGUxXHg5M1x4ZmZceDQ2XHhkYlx4YWNceGNmXHhkNCIsCisJfQorfTsKKworLyoKKyAqIFJJUEVNRC0xNjAgdGVzdCB2ZWN0b3JzIGZyb20gSVNPL0lFQyAxMDExOC0zOjIwMDQoRSkKKyAqLworI2RlZmluZSBSTUQxNjBfVEVTVF9WRUNUT1JTICAgICAxMAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBybWQxNjBfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5kaWdlc3QJPSAiXHg5Y1x4MTFceDg1XHhhNVx4YzVceGU5XHhmY1x4NTRceDYxXHgyOCIKKwkJCSAgIlx4MDhceDk3XHg3ZVx4ZThceGY1XHg0OFx4YjJceDI1XHg4ZFx4MzEiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceDBiXHhkY1x4OWRceDJkXHgyNVx4NmJceDNlXHhlOVx4ZGFceGFlIgorCQkJICAiXHgzNFx4N2JceGU2XHhmNFx4ZGNceDgzXHg1YVx4NDZceDdmXHhmZSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHg4ZVx4YjJceDA4XHhmN1x4ZTBceDVkXHg5OFx4N2FceDliXHgwNCIKKwkJCSAgIlx4NGFceDhlXHg5OFx4YzZceGIwXHg4N1x4ZjFceDVhXHgwYlx4ZmMiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJtZXNzYWdlIGRpZ2VzdCIsCisJCS5wc2l6ZQk9IDE0LAorCQkuZGlnZXN0CT0gIlx4NWRceDA2XHg4OVx4ZWZceDQ5XHhkMlx4ZmFceGU1XHg3Mlx4YjgiCisJCQkgICJceDgxXHhiMVx4MjNceGE4XHg1Zlx4ZmFceDIxXHg1OVx4NWZceDM2IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceGY3XHgxY1x4MjdceDEwXHg5Y1x4NjlceDJjXHgxYlx4NTZceGJiIgorCQkJICAiXHhkY1x4ZWJceDViXHg5ZFx4MjhceDY1XHhiM1x4NzBceDhkXHhiYyIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGUiCisJCQkgICAgICJmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkJLnBzaXplCT0gNjIsCisJCS5kaWdlc3QJPSAiXHhiMFx4ZTJceDBiXHg2ZVx4MzFceDE2XHg2NFx4MDJceDg2XHhlZCIKKwkJCSAgIlx4M2FceDg3XHhhNVx4NzFceDMwXHg3OVx4YjJceDFmXHg1MVx4ODkiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorCQkJICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisJCS5wc2l6ZQk9IDgwLAorCQkuZGlnZXN0CT0gIlx4OWJceDc1XHgyZVx4NDVceDU3XHgzZFx4NGJceDM5XHhmNFx4ZGIiCisJCQkgICJceGQzXHgzMlx4M2NceGFiXHg4Mlx4YmZceDYzXHgzMlx4NmJceGZiIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpaiIKKwkJCSAgICAgImhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSA1NiwKKwkJLmRpZ2VzdAk9ICJceDEyXHhhMFx4NTNceDM4XHg0YVx4OWNceDBjXHg4OFx4ZTRceDA1IgorCQkJICAiXHhhMFx4NmNceDI3XHhkY1x4ZjRceDlhXHhkYVx4NjJceGViXHgyYiIsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDI4LCAyOCB9LAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGJjZGVmZ2hpY2RlZmdoaWpkZWZnaGlqa2VmZ2hpamtsZmdoaSIKKwkJCSAgICAgImprbG1naGlqa2xtbmhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFyIgorCQkJICAgICAibG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwKKwkJLnBzaXplCT0gMTEyLAorCQkuZGlnZXN0CT0gIlx4NmZceDNmXHhhM1x4OWJceDZiXHg1MFx4M2NceDM4XHg0Zlx4OTEiCisJCQkgICJceDlhXHg0OVx4YTdceGFhXHg1Y1x4MmNceDA4XHhiZFx4ZmJceDQ1IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamsiLAorCQkucHNpemUJPSAzMiwKKwkJLmRpZ2VzdAk9ICJceDk0XHhjMlx4NjRceDExXHg1NFx4MDRceGU2XHgzM1x4NzlceDBkIgorCQkJICAiXHhmY1x4YzhceDdiXHg1OFx4N2RceDM2XHg3N1x4MDZceDdkXHg5ZiIsCisJfQorfTsKKworLyoKKyAqIFJJUEVNRC0yNTYgdGVzdCB2ZWN0b3JzCisgKi8KKyNkZWZpbmUgUk1EMjU2X1RFU1RfVkVDVE9SUyAgICAgOAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBybWQyNTZfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5kaWdlc3QJPSAiXHgwMlx4YmFceDRjXHg0ZVx4NWZceDhlXHhjZFx4MTgiCisJCQkgICJceDc3XHhmY1x4NTJceGQ2XHg0ZFx4MzBceGUzXHg3YSIKKwkJCSAgIlx4MmRceDk3XHg3NFx4ZmJceDFlXHg1ZFx4MDJceDYzIgorCQkJICAiXHg4MFx4YWVceDAxXHg2OFx4ZTNceGM1XHg1Mlx4MmQiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceGY5XHgzM1x4M2VceDQ1XHhkOFx4NTdceGY1XHhkOSIKKwkJCSAgIlx4MGFceDkxXHhiYVx4YjdceDBhXHgxZVx4YmFceDBjIgorCQkJICAiXHhmYlx4MWJceGU0XHhiMFx4NzhceDNjXHg5YVx4Y2YiCisJCQkgICJceGNkXHg4OFx4M2FceDkxXHgzNFx4NjlceDI5XHgyNSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHhhZlx4YmRceDZlXHgyMlx4OGJceDlkXHg4Y1x4YmIiCisJCQkgICJceGNlXHhmNVx4Y2FceDJkXHgwM1x4ZTZceGRiXHhhMSIKKwkJCSAgIlx4MGFceGMwXHhiY1x4N2RceGNiXHhlNFx4NjhceDBlIgorCQkJICAiXHgxZVx4NDJceGQyXHhlOVx4NzVceDQ1XHg5Ylx4NjUiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJtZXNzYWdlIGRpZ2VzdCIsCisJCS5wc2l6ZQk9IDE0LAorCQkuZGlnZXN0CT0gIlx4ODdceGU5XHg3MVx4NzVceDlhXHgxY1x4ZTRceDdhIgorCQkJICAiXHg1MVx4NGRceDVjXHg5MVx4NGNceDM5XHgyY1x4OTAiCisJCQkgICJceDE4XHhjN1x4YzRceDZiXHhjMVx4NDRceDY1XHg1NSIKKwkJCSAgIlx4NGFceGZjXHhkZlx4NTRceGE1XHgwN1x4MGNceDBlIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceDY0XHg5ZFx4MzBceDM0XHg3NVx4MWVceGEyXHgxNiIKKwkJCSAgIlx4NzdceDZiXHhmOVx4YTFceDhhXHhjY1x4ODFceGJjIgorCQkJICAiXHg3OFx4OTZceDExXHg4YVx4NTFceDk3XHg5Nlx4ODciCisJCQkgICJceDgyXHhkZFx4MWZceGQ5XHg3ZFx4OGRceDUxXHgzMyIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGUiCisJCQkgICAgICJmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkJLnBzaXplCT0gNjIsCisJCS5kaWdlc3QJPSAiXHg1N1x4NDBceGE0XHgwOFx4YWNceDE2XHhiN1x4MjAiCisJCQkgICJceGI4XHg0NFx4MjRceGFlXHg5M1x4MWNceGJiXHgxZiIKKwkJCSAgIlx4ZTNceDYzXHhkMVx4ZDBceGJmXHg0MFx4MTdceGYxIgorCQkJICAiXHhhOFx4OWZceDdlXHhhNlx4ZGVceDc3XHhhMFx4YjgiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorCQkJICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisJCS5wc2l6ZQk9IDgwLAorCQkuZGlnZXN0CT0gIlx4MDZceGZkXHhjY1x4N2FceDQwXHg5NVx4NDhceGFhIgorCQkJICAiXHhmOVx4MTNceDY4XHhjMFx4NmFceDYyXHg3NVx4YjUiCisJCQkgICJceDUzXHhlM1x4ZjBceDk5XHhiZlx4MGVceGE0XHhlZCIKKwkJCSAgIlx4ZmRceDY3XHg3OFx4ZGZceDg5XHhhOFx4OTBceGRkIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpaiIKKwkJCSAgICAgImhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSA1NiwKKwkJLmRpZ2VzdAk9ICJceDM4XHg0M1x4MDRceDU1XHg4M1x4YWFceGM2XHhjOCIKKwkJCSAgIlx4YzhceGQ5XHgxMlx4ODVceDczXHhlN1x4YTlceDgwIgorCQkJICAiXHg5YVx4ZmJceDJhXHgwZlx4MzRceGNjXHhjM1x4NmUiCisJCQkgICJceGE5XHhlN1x4MmZceDE2XHhmNlx4MzZceDhlXHgzZiIsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDI4LCAyOCB9LAorCX0KK307CisKKy8qCisgKiBSSVBFTUQtMzIwIHRlc3QgdmVjdG9ycworICovCisjZGVmaW5lIFJNRDMyMF9URVNUX1ZFQ1RPUlMgICAgIDgKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgcm1kMzIwX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkuZGlnZXN0CT0gIlx4MjJceGQ2XHg1ZFx4NTZceDYxXHg1M1x4NmNceGRjXHg3NVx4YzEiCisJCQkgICJceGZkXHhmNVx4YzZceGRlXHg3Ylx4NDFceGI5XHhmMlx4NzNceDI1IgorCQkJICAiXHhlYlx4YzZceDFlXHg4NVx4NTdceDE3XHg3ZFx4NzBceDVhXHgwZSIKKwkJCSAgIlx4YzhceDgwXHgxNVx4MWNceDNhXHgzMlx4YTBceDA4XHg5OVx4YjgiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceGNlXHg3OFx4ODVceDA2XHgzOFx4ZjlceDI2XHg1OFx4YTVceGE1IgorCQkJICAiXHg4NVx4MDlceDc1XHg3OVx4OTJceDZkXHhkYVx4NjZceDdhXHg1NyIKKwkJCSAgIlx4MTZceDU2XHgyY1x4ZmNceGY2XHhmYlx4ZTdceDdmXHg2M1x4NTQiCisJCQkgICJceDJmXHg5OVx4YjBceDQ3XHgwNVx4ZDZceDk3XHgwZFx4ZmZceDVkIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGRlXHg0Y1x4MDFceGIzXHgwNVx4NGZceDg5XHgzMFx4YTdceDlkIgorCQkJICAiXHgwOVx4YWVceDczXHg4ZVx4OTJceDMwXHgxZVx4NWFceDE3XHgwOCIKKwkJCSAgIlx4NWJceGVmXHhmZFx4YzFceGI4XHhkMVx4MTZceDcxXHgzZVx4NzQiCisJCQkgICJceGY4XHgyZlx4YTlceDQyXHhkNlx4NGNceGRiXHhjNFx4NjhceDJkIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAibWVzc2FnZSBkaWdlc3QiLAorCQkucHNpemUJPSAxNCwKKwkJLmRpZ2VzdAk9ICJceDNhXHg4ZVx4MjhceDUwXHgyZVx4ZDRceDVkXHg0Mlx4MmZceDY4IgorCQkJICAiXHg4NFx4NGZceDlkXHhkM1x4MTZceGU3XHhiOVx4ODVceDMzXHhmYSIKKwkJCSAgIlx4M2ZceDJhXHg5MVx4ZDJceDlmXHg4NFx4ZDRceDI1XHhjOFx4OGQiCisJCQkgICJceDZiXHg0ZVx4ZmZceDcyXHg3ZFx4ZjZceDZhXHg3Y1x4MDFceDk3IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceGNhXHhiZFx4YjFceDgxXHgwYlx4OTJceDQ3XHgwYVx4MjBceDkzIgorCQkJICAiXHhhYVx4NmJceGNlXHgwNVx4OTVceDJjXHgyOFx4MzRceDhjXHhmNCIKKwkJCSAgIlx4M2ZceGY2XHgwOFx4NDFceDk3XHg1MVx4NjZceGJiXHg0MFx4ZWQiCisJCQkgICJceDIzXHg0MFx4MDRceGI4XHg4Mlx4NDRceDYzXHhlNlx4YjBceDA5IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZSIKKwkJCSAgICAgImZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCQkucHNpemUJPSA2MiwKKwkJLmRpZ2VzdAk9ICJceGVkXHg1NFx4NDlceDQwXHhjOFx4NmRceDY3XHhmMlx4NTBceGQyIgorCQkJICAiXHgzMlx4YzNceDBiXHg3Ylx4M2VceDU3XHg3MFx4ZTBceGM2XHgwYyIKKwkJCSAgIlx4OGNceGI5XHhhNFx4Y2FceGZlXHgzYlx4MTFceDM4XHg4YVx4ZjkiCisJCQkgICJceDkyXHgwZVx4MWJceDk5XHgyM1x4MGJceDg0XHgzY1x4ODZceGE0IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKwkJCSAgICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceDU1XHg3OFx4ODhceGFmXHg1Zlx4NmRceDhlXHhkNlx4MmFceGI2IgorCQkJICAiXHg2OVx4NDVceGM2XHhkMlx4YTBceGE0XHg3ZVx4Y2RceDUzXHg0MSIKKwkJCSAgIlx4ZTlceDE1XHhlYlx4OGZceGVhXHgxZFx4MDVceDI0XHg5NVx4NWYiCisJCQkgICJceDgyXHg1ZFx4YzdceDE3XHhlNFx4YTBceDA4XHhhYlx4MmRceDQyIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpaiIKKwkJCSAgICAgImhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSA1NiwKKwkJLmRpZ2VzdAk9ICJceGQwXHgzNFx4YTdceDk1XHgwY1x4ZjdceDIyXHgwMlx4MWJceGE0IgorCQkJICAiXHhiOFx4NGRceGY3XHg2OVx4YTVceGRlXHgyMFx4NjBceGUyXHg1OSIKKwkJCSAgIlx4ZGZceDRjXHg5Ylx4YjRceGE0XHgyNlx4OGNceDBlXHg5M1x4NWIiCisJCQkgICJceGJjXHg3NFx4NzBceGE5XHg2OVx4YzlceGQwXHg3Mlx4YTFceGFjIiwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMjgsIDI4IH0sCisJfQorfTsKKworLyoKKyAqIFNIQTEgdGVzdCB2ZWN0b3JzICBmcm9tIGZyb20gRklQUyBQVUIgMTgwLTEKKyAqLworI2RlZmluZSBTSEExX1RFU1RfVkVDVE9SUwkyCisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIHNoYTFfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGE5XHg5OVx4M2VceDM2XHg0N1x4MDZceDgxXHg2YVx4YmFceDNlIgorCQkJICAiXHgyNVx4NzFceDc4XHg1MFx4YzJceDZjXHg5Y1x4ZDBceGQ4XHg5ZCIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkJLnBzaXplCT0gNTYsCisJCS5kaWdlc3QJPSAiXHg4NFx4OThceDNlXHg0NFx4MWNceDNiXHhkMlx4NmVceGJhXHhhZSIKKwkJCSAgIlx4NGFceGExXHhmOVx4NTFceDI5XHhlNVx4ZTVceDQ2XHg3MFx4ZjEiLAorCQkubnAJPSAyLAorCQkudGFwCT0geyAyOCwgMjggfQorCX0KK307CisKKworLyoKKyAqIFNIQTIyNCB0ZXN0IHZlY3RvcnMgZnJvbSBmcm9tIEZJUFMgUFVCIDE4MC0yCisgKi8KKyNkZWZpbmUgU0hBMjI0X1RFU1RfVkVDVE9SUyAgICAgMgorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBzaGEyMjRfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplICA9IDMsCisJCS5kaWdlc3QgPSAiXHgyM1x4MDlceDdEXHgyMlx4MzRceDA1XHhEOFx4MjIiCisJCQkgICJceDg2XHg0Mlx4QTRceDc3XHhCRFx4QTJceDU1XHhCMyIKKwkJCSAgIlx4MkFceEFEXHhCQ1x4RTRceEJEXHhBMFx4QjNceEY3IgorCQkJICAiXHhFM1x4NkNceDlEXHhBNyIsCisJfSwgeworCQkucGxhaW50ZXh0ID0KKwkJImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkJLnBzaXplICA9IDU2LAorCQkuZGlnZXN0ID0gIlx4NzVceDM4XHg4Qlx4MTZceDUxXHgyN1x4NzZceENDIgorCQkJICAiXHg1RFx4QkFceDVEXHhBMVx4RkRceDg5XHgwMVx4NTAiCisJCQkgICJceEIwXHhDNlx4NDVceDVDXHhCNFx4RjVceDhCXHgxOSIKKwkJCSAgIlx4NTJceDUyXHgyNVx4MjUiLAorCQkubnAgICAgID0gMiwKKwkJLnRhcCAgICA9IHsgMjgsIDI4IH0KKwl9Cit9OworCisvKgorICogU0hBMjU2IHRlc3QgdmVjdG9ycyBmcm9tIGZyb20gTklTVAorICovCisjZGVmaW5lIFNIQTI1Nl9URVNUX1ZFQ1RPUlMJMgorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBzaGEyNTZfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGJhXHg3OFx4MTZceGJmXHg4Zlx4MDFceGNmXHhlYSIKKwkJCSAgIlx4NDFceDQxXHg0MFx4ZGVceDVkXHhhZVx4MjJceDIzIgorCQkJICAiXHhiMFx4MDNceDYxXHhhM1x4OTZceDE3XHg3YVx4OWMiCisJCQkgICJceGI0XHgxMFx4ZmZceDYxXHhmMlx4MDBceDE1XHhhZCIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkJLnBzaXplCT0gNTYsCisJCS5kaWdlc3QJPSAiXHgyNFx4OGRceDZhXHg2MVx4ZDJceDA2XHgzOFx4YjgiCisJCQkgICJceGU1XHhjMFx4MjZceDkzXHgwY1x4M2VceDYwXHgzOSIKKwkJCSAgIlx4YTNceDNjXHhlNFx4NTlceDY0XHhmZlx4MjFceDY3IgorCQkJICAiXHhmNlx4ZWNceGVkXHhkNFx4MTlceGRiXHgwNlx4YzEiLAorCQkubnAJPSAyLAorCQkudGFwCT0geyAyOCwgMjggfQorCX0sCit9OworCisvKgorICogU0hBMzg0IHRlc3QgdmVjdG9ycyBmcm9tIGZyb20gTklTVCBhbmQga2VybmVsaQorICovCisjZGVmaW5lIFNIQTM4NF9URVNUX1ZFQ1RPUlMJNAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBzaGEzODRfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5wbGFpbnRleHQ9ICJhYmMiLAorCQkucHNpemUJPSAzLAorCQkuZGlnZXN0CT0gIlx4Y2JceDAwXHg3NVx4M2ZceDQ1XHhhM1x4NWVceDhiIgorCQkJICAiXHhiNVx4YTBceDNkXHg2OVx4OWFceGM2XHg1MFx4MDciCisJCQkgICJceDI3XHgyY1x4MzJceGFiXHgwZVx4ZGVceGQxXHg2MyIKKwkJCSAgIlx4MWFceDhiXHg2MFx4NWFceDQzXHhmZlx4NWJceGVkIgorCQkJICAiXHg4MFx4ODZceDA3XHgyYlx4YTFceGU3XHhjY1x4MjMiCisJCQkgICJceDU4XHhiYVx4ZWNceGExXHgzNFx4YzhceDI1XHhhNyIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkJLnBzaXplCT0gNTYsCisJCS5kaWdlc3QJPSAiXHgzM1x4OTFceGZkXHhkZFx4ZmNceDhkXHhjN1x4MzkiCisJCQkgICJceDM3XHgwN1x4YTZceDViXHgxYlx4NDdceDA5XHgzOSIKKwkJCSAgIlx4N2NceGY4XHhiMVx4ZDFceDYyXHhhZlx4MDVceGFiIgorCQkJICAiXHhmZVx4OGZceDQ1XHgwZFx4ZTVceGYzXHg2Ylx4YzYiCisJCQkgICJceGIwXHg0NVx4NWFceDg1XHgyMFx4YmNceDRlXHg2ZiIKKwkJCSAgIlx4NWZceGU5XHg1Ylx4MWZceGUzXHhjOFx4NDVceDJiIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iCisJCQkgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLAorCQkucHNpemUJPSAxMTIsCisJCS5kaWdlc3QJPSAiXHgwOVx4MzNceDBjXHgzM1x4ZjdceDExXHg0N1x4ZTgiCisJCQkgICJceDNkXHgxOVx4MmZceGM3XHg4Mlx4Y2RceDFiXHg0NyIKKwkJCSAgIlx4NTNceDExXHgxYlx4MTdceDNiXHgzYlx4MDVceGQyIgorCQkJICAiXHgyZlx4YTBceDgwXHg4Nlx4ZTNceGIwXHhmN1x4MTIiCisJCQkgICJceGZjXHhjN1x4YzdceDFhXHg1NVx4N2VceDJkXHhiOSIKKwkJCSAgIlx4NjZceGMzXHhlOVx4ZmFceDkxXHg3NFx4NjBceDM5IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2QiCisJCQkgICAiZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJLnBzaXplCT0gMTA0LAorCQkuZGlnZXN0CT0gIlx4M2RceDIwXHg4OVx4NzNceGFiXHgzNVx4MDhceGRiIgorCQkJICAiXHhiZFx4N2VceDJjXHgyOFx4NjJceGJhXHgyOVx4MGEiCisJCQkgICJceGQzXHgwMVx4MGVceDQ5XHg3OFx4YzFceDk4XHhkYyIKKwkJCSAgIlx4NGRceDhmXHhkMFx4MTRceGU1XHg4Mlx4ODJceDNhIgorCQkJICAiXHg4OVx4ZTFceDZmXHg5Ylx4MmFceDdiXHhiY1x4MWEiCisJCQkgICJceGM5XHgzOFx4ZTJceGQxXHg5OVx4ZThceGJlXHhhNCIsCisJCS5ucAk9IDQsCisJCS50YXAJPSB7IDI2LCAyNiwgMjYsIDI2IH0KKwl9LAorfTsKKworLyoKKyAqIFNIQTUxMiB0ZXN0IHZlY3RvcnMgZnJvbSBmcm9tIE5JU1QgYW5kIGtlcm5lbGkKKyAqLworI2RlZmluZSBTSEE1MTJfVEVTVF9WRUNUT1JTCTQKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgc2hhNTEyX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHhkZFx4YWZceDM1XHhhMVx4OTNceDYxXHg3YVx4YmEiCisJCQkgICJceGNjXHg0MVx4NzNceDQ5XHhhZVx4MjBceDQxXHgzMSIKKwkJCSAgIlx4MTJceGU2XHhmYVx4NGVceDg5XHhhOVx4N2VceGEyIgorCQkJICAiXHgwYVx4OWVceGVlXHhlNlx4NGJceDU1XHhkM1x4OWEiCisJCQkgICJceDIxXHg5Mlx4OTlceDJhXHgyN1x4NGZceGMxXHhhOCIKKwkJCSAgIlx4MzZceGJhXHgzY1x4MjNceGEzXHhmZVx4ZWJceGJkIgorCQkJICAiXHg0NVx4NGRceDQ0XHgyM1x4NjRceDNjXHhlOFx4MGUiCisJCQkgICJceDJhXHg5YVx4YzlceDRmXHhhNVx4NGNceGE0XHg5ZiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkJLnBzaXplCT0gNTYsCisJCS5kaWdlc3QJPSAiXHgyMFx4NGFceDhmXHhjNlx4ZGRceGE4XHgyZlx4MGEiCisJCQkgICJceDBjXHhlZFx4N2JceGViXHg4ZVx4MDhceGE0XHgxNiIKKwkJCSAgIlx4NTdceGMxXHg2ZVx4ZjRceDY4XHhiMlx4MjhceGE4IgorCQkJICAiXHgyN1x4OWJceGUzXHgzMVx4YTdceDAzXHhjM1x4MzUiCisJCQkgICJceDk2XHhmZFx4MTVceGMxXHgzYlx4MWJceDA3XHhmOSIKKwkJCSAgIlx4YWFceDFkXHgzYlx4ZWFceDU3XHg3OFx4OWNceGEwIgorCQkJICAiXHgzMVx4YWRceDg1XHhjN1x4YTdceDFkXHhkN1x4MDMiCisJCQkgICJceDU0XHhlY1x4NjNceDEyXHgzOFx4Y2FceDM0XHg0NSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIgorCQkJICAgImhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwKKwkJLnBzaXplCT0gMTEyLAorCQkuZGlnZXN0CT0gIlx4OGVceDk1XHg5Ylx4NzVceGRhXHhlM1x4MTNceGRhIgorCQkJICAiXHg4Y1x4ZjRceGY3XHgyOFx4MTRceGZjXHgxNFx4M2YiCisJCQkgICJceDhmXHg3N1x4NzlceGM2XHhlYlx4OWZceDdmXHhhMSIKKwkJCSAgIlx4NzJceDk5XHhhZVx4YWRceGI2XHg4OFx4OTBceDE4IgorCQkJICAiXHg1MFx4MWRceDI4XHg5ZVx4NDlceDAwXHhmN1x4ZTQiCisJCQkgICJceDMzXHgxYlx4OTlceGRlXHhjNFx4YjVceDQzXHgzYSIKKwkJCSAgIlx4YzdceGQzXHgyOVx4ZWVceGI2XHhkZFx4MjZceDU0IgorCQkJICAiXHg1ZVx4OTZceGU1XHg1Ylx4ODdceDRiXHhlOVx4MDkiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5emFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZCIKKwkJCSAgICJlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAxMDQsCisJCS5kaWdlc3QJPSAiXHg5M1x4MGRceDBjXHhlZlx4Y2JceDMwXHhmZlx4MTEiCisJCQkgICJceDMzXHhiNlx4ODlceDgxXHgyMVx4ZjFceGNmXHgzZCIKKwkJCSAgIlx4MjdceDU3XHg4YVx4ZmNceGFmXHhlOFx4NjdceDdjIgorCQkJICAiXHg1Mlx4NTdceGNmXHgwNlx4OTlceDExXHhmN1x4NWQiCisJCQkgICJceDhmXHg1OFx4MzFceGI1XHg2ZVx4YmZceGRhXHg2NyIKKwkJCSAgIlx4YjJceDc4XHhlNlx4NmRceGZmXHg4Ylx4ODRceGZlIgorCQkJICAiXHgyYlx4MjhceDcwXHhmN1x4NDJceGE1XHg4MFx4ZDgiCisJCQkgICJceGVkXHhiNFx4MTlceDg3XHgyM1x4MjhceDUwXHhjOSIsCisJCS5ucAk9IDQsCisJCS50YXAJPSB7IDI2LCAyNiwgMjYsIDI2IH0KKwl9LAorfTsKKworCisvKgorICogV0hJUkxQT09MIHRlc3QgdmVjdG9ycyBmcm9tIFdoaXJscG9vbCBwYWNrYWdlCisgKiBieSBWaW5jZW50IFJpam1lbiBhbmQgUGF1bG8gUy4gTC4gTS4gQmFycmV0byBhcyBwYXJ0IG9mIHRoZSBORVNTSUUKKyAqIHN1Ym1pc3Npb24KKyAqLworI2RlZmluZSBXUDUxMl9URVNUX1ZFQ1RPUlMJOAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyB3cDUxMl90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLnBsYWludGV4dCA9ICIiLAorCQkucHNpemUJPSAwLAorCQkuZGlnZXN0CT0gIlx4MTlceEZBXHg2MVx4RDdceDU1XHgyMlx4QTRceDY2IgorCQkJICAiXHg5Qlx4NDRceEUzXHg5Q1x4MURceDJFXHgxN1x4MjYiCisJCQkgICJceEM1XHgzMFx4MjNceDIxXHgzMFx4RDRceDA3XHhGOCIKKwkJCSAgIlx4OUFceEZFXHhFMFx4OTZceDQ5XHg5N1x4RjdceEE3IgorCQkJICAiXHgzRVx4ODNceEJFXHg2OVx4OEJceDI4XHg4Rlx4RUIiCisJCQkgICJceENGXHg4OFx4RTNceEUwXHgzQ1x4NEZceDA3XHg1NyIKKwkJCSAgIlx4RUFceDg5XHg2NFx4RTVceDlCXHg2M1x4RDlceDM3IgorCQkJICAiXHgwOFx4QjFceDM4XHhDQ1x4NDJceEE2XHg2RVx4QjMiLAorCisKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYSIsCisJCS5wc2l6ZQk9IDEsCisJCS5kaWdlc3QJPSAiXHg4QVx4Q0FceDI2XHgwMlx4NzlceDJBXHhFQ1x4NkYiCisJCQkgICJceDExXHhBNlx4NzJceDA2XHg1M1x4MUZceEI3XHhENyIKKwkJCSAgIlx4RjBceERGXHhGNVx4OTRceDEzXHgxNFx4NUVceDY5IgorCQkJICAiXHg3M1x4QzRceDUwXHgwMVx4RDBceDA4XHg3Qlx4NDIiCisJCQkgICJceEQxXHgxQlx4QzZceDQ1XHg0MVx4M0FceEVGXHhGNiIKKwkJCSAgIlx4M0FceDQyXHgzOVx4MUFceDM5XHgxNFx4NUFceDU5IgorCQkJICAiXHgxQVx4OTJceDIwXHgwRFx4NTZceDAxXHg5NVx4RTUiCisJCQkgICJceDNCXHg0N1x4ODVceDg0XHhGRFx4QUVceDIzXHgxQSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHg0RVx4MjRceDQ4XHhBNFx4QzZceEY0XHg4Nlx4QkIiCisJCQkgICJceDE2XHhCNlx4NTZceDJDXHg3M1x4QjRceDAyXHgwQiIKKwkJCSAgIlx4RjNceDA0XHgzRVx4M0FceDczXHgxQlx4Q0VceDcyIgorCQkJICAiXHgxQVx4RTFceEIzXHgwM1x4RDlceDdFXHg2RFx4NEMiCisJCQkgICJceDcxXHg4MVx4RUVceEJEXHhCNlx4QzVceDdFXHgyNyIKKwkJCSAgIlx4N0RceDBFXHgzNFx4OTVceDcxXHgxNFx4Q0JceEQ2IgorCQkJICAiXHhDN1x4OTdceEZDXHg5RFx4OTVceEQ4XHhCNVx4ODIiCisJCQkgICJceEQyXHgyNVx4MjlceDIwXHg3Nlx4RDRceEVFXHhGNSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIm1lc3NhZ2UgZGlnZXN0IiwKKwkJLnBzaXplCT0gMTQsCisJCS5kaWdlc3QJPSAiXHgzN1x4OENceDg0XHhBNFx4MTJceDZFXHgyRFx4QzYiCisJCQkgICJceEU1XHg2RFx4Q0NceDc0XHg1OFx4MzdceDdBXHhBQyIKKwkJCSAgIlx4ODNceDhEXHgwMFx4MDNceDIyXHgzMFx4RjVceDNDIgorCQkJICAiXHhFMVx4RjVceDcwXHgwQ1x4MEZceEZCXHg0RFx4M0IiCisJCQkgICJceDg0XHgyMVx4NTVceDc2XHg1OVx4RUZceDU1XHhDMSIKKwkJCSAgIlx4MDZceEI0XHhCNVx4MkFceEM1XHhBNFx4QUFceEE2IgorCQkJICAiXHg5Mlx4RURceDkyXHgwMFx4NTJceDgzXHg4Rlx4MzMiCisJCQkgICJceDYyXHhFOFx4NkRceEJEXHgzN1x4QThceDkwXHgzRSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJLnBzaXplCT0gMjYsCisJCS5kaWdlc3QJPSAiXHhGMVx4RDdceDU0XHg2Nlx4MjZceDM2XHhGRlx4RTkiCisJCQkgICJceDJDXHg4Mlx4RUJceEI5XHgyMVx4MkFceDQ4XHg0QSIKKwkJCSAgIlx4OERceDM4XHg2M1x4MUVceEFEXHg0Mlx4MzhceEY1IgorCQkJICAiXHg0NFx4MkVceEUxXHgzQlx4ODBceDU0XHhFNFx4MUIiCisJCQkgICJceDA4XHhCRlx4MkFceDkyXHg1MVx4QzNceDBCXHg2QSIKKwkJCSAgIlx4MEJceDhBXHhBRVx4ODZceDE3XHg3QVx4QjRceEE2IgorCQkJICAiXHhGNlx4OEZceDY3XHgzRVx4NzJceDA3XHg4Nlx4NUQiCisJCQkgICJceDVEXHg5OFx4MTlceEEzXHhEQlx4QTRceEVCXHgzQiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorCQkJICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisJCS5wc2l6ZQk9IDYyLAorCQkuZGlnZXN0CT0gIlx4RENceDM3XHhFMFx4MDhceENGXHg5RVx4RTZceDlCIgorCQkJICAiXHhGMVx4MUZceDAwXHhFRFx4OUFceEJBXHgyNlx4OTAiCisJCQkgICJceDFEXHhEN1x4QzJceDhDXHhERVx4QzBceDY2XHhDQyIKKwkJCSAgIlx4NkFceEY0XHgyRVx4NDBceEY4XHgyRlx4M0FceDFFIgorCQkJICAiXHgwOFx4RUJceEEyXHg2Nlx4MjlceDEyXHg5RFx4OEYiCisJCQkgICJceEI3XHhDQlx4NTdceDIxXHgxQlx4OTJceDgxXHhBNiIKKwkJCSAgIlx4NTVceDE3XHhDQ1x4ODdceDlEXHg3Qlx4OTZceDIxIgorCQkJICAiXHg0Mlx4QzZceDVGXHg1QVx4N0FceEYwXHgxNFx4NjciLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorCQkJICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceDQ2XHg2RVx4RjFceDhCXHhBQlx4QjBceDE1XHg0RCIKKwkJCSAgIlx4MjVceEI5XHhEM1x4OEFceDY0XHgxNFx4RjVceEMwIgorCQkJICAiXHg4N1x4ODRceDM3XHgyQlx4Q0NceEIyXHgwNFx4RDYiCisJCQkgICJceDU0XHg5Q1x4NEFceEZBXHhEQlx4NjBceDE0XHgyOSIKKwkJCSAgIlx4NERceDVCXHhEOFx4REZceDJBXHg2Q1x4NDRceEU1IgorCQkJICAiXHgzOFx4Q0RceDA0XHg3Qlx4MjZceDgxXHhBNVx4MUEiCisJCQkgICJceDJDXHg2MFx4NDhceDFFXHg4OFx4QzVceEEyXHgwQiIKKwkJCSAgIlx4MkNceDJBXHg4MFx4Q0ZceDNBXHg5QVx4MDhceDNCIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamsiLAorCQkucHNpemUJPSAzMiwKKwkJLmRpZ2VzdAk9ICJceDJBXHg5OFx4N0VceEE0XHgwRlx4OTFceDcwXHg2MSIKKwkJCSAgIlx4RjVceEQ2XHhGMFx4QTBceEU0XHg2NFx4NEZceDQ4IgorCQkJICAiXHg4QVx4N0FceDVBXHg1Mlx4REVceEVFXHg2NVx4NjIiCisJCQkgICJceDA3XHhDNVx4NjJceEY5XHg4OFx4RTlceDVDXHg2OSIKKwkJCSAgIlx4MTZceEJEXHhDOFx4MDNceDFCXHhDNVx4QkVceDFCIgorCQkJICAiXHg3Qlx4OTRceDc2XHgzOVx4RkVceDA1XHgwQlx4NTYiCisJCQkgICJceDkzXHg5Qlx4QUFceEEwXHhBRFx4RkZceDlBXHhFNiIKKwkJCSAgIlx4NzRceDVCXHg3Qlx4MThceDFDXHgzQlx4RTNceEZEIiwKKwl9LAorfTsKKworI2RlZmluZSBXUDM4NF9URVNUX1ZFQ1RPUlMJOAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyB3cDM4NF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLnBsYWludGV4dCA9ICIiLAorCQkucHNpemUJPSAwLAorCQkuZGlnZXN0CT0gIlx4MTlceEZBXHg2MVx4RDdceDU1XHgyMlx4QTRceDY2IgorCQkJICAiXHg5Qlx4NDRceEUzXHg5Q1x4MURceDJFXHgxN1x4MjYiCisJCQkgICJceEM1XHgzMFx4MjNceDIxXHgzMFx4RDRceDA3XHhGOCIKKwkJCSAgIlx4OUFceEZFXHhFMFx4OTZceDQ5XHg5N1x4RjdceEE3IgorCQkJICAiXHgzRVx4ODNceEJFXHg2OVx4OEJceDI4XHg4Rlx4RUIiCisJCQkgICJceENGXHg4OFx4RTNceEUwXHgzQ1x4NEZceDA3XHg1NyIsCisKKworCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceDhBXHhDQVx4MjZceDAyXHg3OVx4MkFceEVDXHg2RiIKKwkJCSAgIlx4MTFceEE2XHg3Mlx4MDZceDUzXHgxRlx4QjdceEQ3IgorCQkJICAiXHhGMFx4REZceEY1XHg5NFx4MTNceDE0XHg1RVx4NjkiCisJCQkgICJceDczXHhDNFx4NTBceDAxXHhEMFx4MDhceDdCXHg0MiIKKwkJCSAgIlx4RDFceDFCXHhDNlx4NDVceDQxXHgzQVx4RUZceEY2IgorCQkJICAiXHgzQVx4NDJceDM5XHgxQVx4MzlceDE0XHg1QVx4NTkiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmMiLAorCQkucHNpemUJPSAzLAorCQkuZGlnZXN0CT0gIlx4NEVceDI0XHg0OFx4QTRceEM2XHhGNFx4ODZceEJCIgorCQkJICAiXHgxNlx4QjZceDU2XHgyQ1x4NzNceEI0XHgwMlx4MEIiCisJCQkgICJceEYzXHgwNFx4M0VceDNBXHg3M1x4MUJceENFXHg3MiIKKwkJCSAgIlx4MUFceEUxXHhCM1x4MDNceEQ5XHg3RVx4NkRceDRDIgorCQkJICAiXHg3MVx4ODFceEVFXHhCRFx4QjZceEM1XHg3RVx4MjciCisJCQkgICJceDdEXHgwRVx4MzRceDk1XHg3MVx4MTRceENCXHhENiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIm1lc3NhZ2UgZGlnZXN0IiwKKwkJLnBzaXplCT0gMTQsCisJCS5kaWdlc3QJPSAiXHgzN1x4OENceDg0XHhBNFx4MTJceDZFXHgyRFx4QzYiCisJCQkgICJceEU1XHg2RFx4Q0NceDc0XHg1OFx4MzdceDdBXHhBQyIKKwkJCSAgIlx4ODNceDhEXHgwMFx4MDNceDIyXHgzMFx4RjVceDNDIgorCQkJICAiXHhFMVx4RjVceDcwXHgwQ1x4MEZceEZCXHg0RFx4M0IiCisJCQkgICJceDg0XHgyMVx4NTVceDc2XHg1OVx4RUZceDU1XHhDMSIKKwkJCSAgIlx4MDZceEI0XHhCNVx4MkFceEM1XHhBNFx4QUFceEE2IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceEYxXHhEN1x4NTRceDY2XHgyNlx4MzZceEZGXHhFOSIKKwkJCSAgIlx4MkNceDgyXHhFQlx4QjlceDIxXHgyQVx4NDhceDRBIgorCQkJICAiXHg4RFx4MzhceDYzXHgxRVx4QURceDQyXHgzOFx4RjUiCisJCQkgICJceDQ0XHgyRVx4RTFceDNCXHg4MFx4NTRceEU0XHgxQiIKKwkJCSAgIlx4MDhceEJGXHgyQVx4OTJceDUxXHhDM1x4MEJceDZBIgorCQkJICAiXHgwQlx4OEFceEFFXHg4Nlx4MTdceDdBXHhCNFx4QTYiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKwkJCSAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCQkucHNpemUJPSA2MiwKKwkJLmRpZ2VzdAk9ICJceERDXHgzN1x4RTBceDA4XHhDRlx4OUVceEU2XHg5QiIKKwkJCSAgIlx4RjFceDFGXHgwMFx4RURceDlBXHhCQVx4MjZceDkwIgorCQkJICAiXHgxRFx4RDdceEMyXHg4Q1x4REVceEMwXHg2Nlx4Q0MiCisJCQkgICJceDZBXHhGNFx4MkVceDQwXHhGOFx4MkZceDNBXHgxRSIKKwkJCSAgIlx4MDhceEVCXHhBMlx4NjZceDI5XHgxMlx4OURceDhGIgorCQkJICAiXHhCN1x4Q0JceDU3XHgyMVx4MUJceDkyXHg4MVx4QTYiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorCQkJICAgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCQkucHNpemUJPSA4MCwKKwkJLmRpZ2VzdAk9ICJceDQ2XHg2RVx4RjFceDhCXHhBQlx4QjBceDE1XHg0RCIKKwkJCSAgIlx4MjVceEI5XHhEM1x4OEFceDY0XHgxNFx4RjVceEMwIgorCQkJICAiXHg4N1x4ODRceDM3XHgyQlx4Q0NceEIyXHgwNFx4RDYiCisJCQkgICJceDU0XHg5Q1x4NEFceEZBXHhEQlx4NjBceDE0XHgyOSIKKwkJCSAgIlx4NERceDVCXHhEOFx4REZceDJBXHg2Q1x4NDRceEU1IgorCQkJICAiXHgzOFx4Q0RceDA0XHg3Qlx4MjZceDgxXHhBNVx4MUEiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqayIsCisJCS5wc2l6ZQk9IDMyLAorCQkuZGlnZXN0CT0gIlx4MkFceDk4XHg3RVx4QTRceDBGXHg5MVx4NzBceDYxIgorCQkJICAiXHhGNVx4RDZceEYwXHhBMFx4RTRceDY0XHg0Rlx4NDgiCisJCQkgICJceDhBXHg3QVx4NUFceDUyXHhERVx4RUVceDY1XHg2MiIKKwkJCSAgIlx4MDdceEM1XHg2Mlx4RjlceDg4XHhFOVx4NUNceDY5IgorCQkJICAiXHgxNlx4QkRceEM4XHgwM1x4MUJceEM1XHhCRVx4MUIiCisJCQkgICJceDdCXHg5NFx4NzZceDM5XHhGRVx4MDVceDBCXHg1NiIsCisJfSwKK307CisKKyNkZWZpbmUgV1AyNTZfVEVTVF9WRUNUT1JTCTgKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgd3AyNTZfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5wbGFpbnRleHQgPSAiIiwKKwkJLnBzaXplCT0gMCwKKwkJLmRpZ2VzdAk9ICJceDE5XHhGQVx4NjFceEQ3XHg1NVx4MjJceEE0XHg2NiIKKwkJCSAgIlx4OUJceDQ0XHhFM1x4OUNceDFEXHgyRVx4MTdceDI2IgorCQkJICAiXHhDNVx4MzBceDIzXHgyMVx4MzBceEQ0XHgwN1x4RjgiCisJCQkgICJceDlBXHhGRVx4RTBceDk2XHg0OVx4OTdceEY3XHhBNyIsCisKKworCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhIiwKKwkJLnBzaXplCT0gMSwKKwkJLmRpZ2VzdAk9ICJceDhBXHhDQVx4MjZceDAyXHg3OVx4MkFceEVDXHg2RiIKKwkJCSAgIlx4MTFceEE2XHg3Mlx4MDZceDUzXHgxRlx4QjdceEQ3IgorCQkJICAiXHhGMFx4REZceEY1XHg5NFx4MTNceDE0XHg1RVx4NjkiCisJCQkgICJceDczXHhDNFx4NTBceDAxXHhEMFx4MDhceDdCXHg0MiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QJPSAiXHg0RVx4MjRceDQ4XHhBNFx4QzZceEY0XHg4Nlx4QkIiCisJCQkgICJceDE2XHhCNlx4NTZceDJDXHg3M1x4QjRceDAyXHgwQiIKKwkJCSAgIlx4RjNceDA0XHgzRVx4M0FceDczXHgxQlx4Q0VceDcyIgorCQkJICAiXHgxQVx4RTFceEIzXHgwM1x4RDlceDdFXHg2RFx4NEMiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJtZXNzYWdlIGRpZ2VzdCIsCisJCS5wc2l6ZQk9IDE0LAorCQkuZGlnZXN0CT0gIlx4MzdceDhDXHg4NFx4QTRceDEyXHg2RVx4MkRceEM2IgorCQkJICAiXHhFNVx4NkRceENDXHg3NFx4NThceDM3XHg3QVx4QUMiCisJCQkgICJceDgzXHg4RFx4MDBceDAzXHgyMlx4MzBceEY1XHgzQyIKKwkJCSAgIlx4RTFceEY1XHg3MFx4MENceDBGXHhGQlx4NERceDNCIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkucHNpemUJPSAyNiwKKwkJLmRpZ2VzdAk9ICJceEYxXHhEN1x4NTRceDY2XHgyNlx4MzZceEZGXHhFOSIKKwkJCSAgIlx4MkNceDgyXHhFQlx4QjlceDIxXHgyQVx4NDhceDRBIgorCQkJICAiXHg4RFx4MzhceDYzXHgxRVx4QURceDQyXHgzOFx4RjUiCisJCQkgICJceDQ0XHgyRVx4RTFceDNCXHg4MFx4NTRceEU0XHgxQiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorCQkJICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsCisJCS5wc2l6ZQk9IDYyLAorCQkuZGlnZXN0CT0gIlx4RENceDM3XHhFMFx4MDhceENGXHg5RVx4RTZceDlCIgorCQkJICAiXHhGMVx4MUZceDAwXHhFRFx4OUFceEJBXHgyNlx4OTAiCisJCQkgICJceDFEXHhEN1x4QzJceDhDXHhERVx4QzBceDY2XHhDQyIKKwkJCSAgIlx4NkFceEY0XHgyRVx4NDBceEY4XHgyRlx4M0FceDFFIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKwkJCSAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKwkJLnBzaXplCT0gODAsCisJCS5kaWdlc3QJPSAiXHg0Nlx4NkVceEYxXHg4Qlx4QUJceEIwXHgxNVx4NEQiCisJCQkgICJceDI1XHhCOVx4RDNceDhBXHg2NFx4MTRceEY1XHhDMCIKKwkJCSAgIlx4ODdceDg0XHgzN1x4MkJceENDXHhCMlx4MDRceEQ2IgorCQkJICAiXHg1NFx4OUNceDRBXHhGQVx4REJceDYwXHgxNFx4MjkiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqayIsCisJCS5wc2l6ZQk9IDMyLAorCQkuZGlnZXN0CT0gIlx4MkFceDk4XHg3RVx4QTRceDBGXHg5MVx4NzBceDYxIgorCQkJICAiXHhGNVx4RDZceEYwXHhBMFx4RTRceDY0XHg0Rlx4NDgiCisJCQkgICJceDhBXHg3QVx4NUFceDUyXHhERVx4RUVceDY1XHg2MiIKKwkJCSAgIlx4MDdceEM1XHg2Mlx4RjlceDg4XHhFOVx4NUNceDY5IiwKKwl9LAorfTsKKworLyoKKyAqIFRJR0VSIHRlc3QgdmVjdG9ycyBmcm9tIFRpZ2VyIHdlYnNpdGUKKyAqLworI2RlZmluZSBUR1IxOTJfVEVTVF9WRUNUT1JTCTYKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgdGdyMTkyX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkucGxhaW50ZXh0ID0gIiIsCisJCS5wc2l6ZQk9IDAsCisJCS5kaWdlc3QgPSAiXHgyNFx4ZjBceDEzXHgwY1x4NjNceGFjXHg5M1x4MzIiCisJCQkgICJceDE2XHgxNlx4NmVceDc2XHhiMVx4YmJceDkyXHg1ZiIKKwkJCSAgIlx4ZjNceDczXHhkZVx4MmRceDQ5XHg1OFx4NGVceDdhIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdCA9ICJceGYyXHg1OFx4YzFceGU4XHg4NFx4MTRceGFiXHgyYSIKKwkJCSAgIlx4NTJceDdhXHhiNVx4NDFceGZmXHhjNVx4YjhceGJmIgorCQkJICAiXHg5M1x4NWZceDdiXHg5NVx4MWNceDEzXHgyOVx4NTEiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJUaWdlciIsCisJCS5wc2l6ZQk9IDUsCisJCS5kaWdlc3QgPSAiXHg5Zlx4MDBceGY1XHg5OVx4MDdceDIzXHgwMFx4ZGQiCisJCQkgICJceDI3XHg2YVx4YmJceDM4XHhjOFx4ZWJceDZkXHhlYyIKKwkJCSAgIlx4MzdceDc5XHgwY1x4MTFceDZmXHg5ZFx4MmJceGRmIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLSIsCisJCS5wc2l6ZQk9IDY0LAorCQkuZGlnZXN0ID0gIlx4ODdceGZiXHgyYVx4OTBceDgzXHg4NVx4MWNceGY3IgorCQkJICAiXHg0N1x4MGRceDJjXHhmOFx4MTBceGU2XHhkZlx4OWUiCisJCQkgICJceGI1XHg4Nlx4NDRceDUwXHgzNFx4YTVceGEzXHg4NiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaPWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6KzAxMjM0NTY3ODkiLAorCQkucHNpemUJPSA2NCwKKwkJLmRpZ2VzdCA9ICJceDQ2XHg3ZFx4YjhceDA4XHg2M1x4ZWJceGNlXHg0OCIKKwkJCSAgIlx4OGRceGYxXHhjZFx4MTJceDYxXHg2NVx4NWRceGU5IgorCQkJICAiXHg1N1x4ODlceDY1XHg2NVx4OTdceDVmXHg5MVx4OTciLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJUaWdlciAtIEEgRmFzdCBOZXcgSGFzaCBGdW5jdGlvbiwgIgorCQkJICAgImJ5IFJvc3MgQW5kZXJzb24gYW5kIEVsaSBCaWhhbSwgIgorCQkJICAgInByb2NlZWRpbmdzIG9mIEZhc3QgU29mdHdhcmUgRW5jcnlwdGlvbiAzLCAiCisJCQkgICAiQ2FtYnJpZGdlLCAxOTk2LiIsCisJCS5wc2l6ZSAgPSAxMjUsCisJCS5kaWdlc3QgPSAiXHgzZFx4OWFceGViXHgwM1x4ZDFceGJkXHgxYVx4NjMiCisJCQkgICJceDU3XHhiMlx4NzdceDRkXHhmZFx4NmRceDViXHgyNCIKKwkJCSAgIlx4ZGRceDY4XHgxNVx4MWRceDUwXHgzOVx4NzRceGZjIiwKKwl9LAorfTsKKworI2RlZmluZSBUR1IxNjBfVEVTVF9WRUNUT1JTCTYKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgdGdyMTYwX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkucGxhaW50ZXh0ID0gIiIsCisJCS5wc2l6ZQk9IDAsCisJCS5kaWdlc3QgPSAiXHgyNFx4ZjBceDEzXHgwY1x4NjNceGFjXHg5M1x4MzIiCisJCQkgICJceDE2XHgxNlx4NmVceDc2XHhiMVx4YmJceDkyXHg1ZiIKKwkJCSAgIlx4ZjNceDczXHhkZVx4MmQiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJhYmMiLAorCQkucHNpemUJPSAzLAorCQkuZGlnZXN0ID0gIlx4ZjJceDU4XHhjMVx4ZThceDg0XHgxNFx4YWJceDJhIgorCQkJICAiXHg1Mlx4N2FceGI1XHg0MVx4ZmZceGM1XHhiOFx4YmYiCisJCQkgICJceDkzXHg1Zlx4N2JceDk1IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiVGlnZXIiLAorCQkucHNpemUJPSA1LAorCQkuZGlnZXN0ID0gIlx4OWZceDAwXHhmNVx4OTlceDA3XHgyM1x4MDBceGRkIgorCQkJICAiXHgyN1x4NmFceGJiXHgzOFx4YzhceGViXHg2ZFx4ZWMiCisJCQkgICJceDM3XHg3OVx4MGNceDExIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLSIsCisJCS5wc2l6ZQk9IDY0LAorCQkuZGlnZXN0ID0gIlx4ODdceGZiXHgyYVx4OTBceDgzXHg4NVx4MWNceGY3IgorCQkJICAiXHg0N1x4MGRceDJjXHhmOFx4MTBceGU2XHhkZlx4OWUiCisJCQkgICJceGI1XHg4Nlx4NDRceDUwIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo9YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXorMDEyMzQ1Njc4OSIsCisJCS5wc2l6ZQk9IDY0LAorCQkuZGlnZXN0ID0gIlx4NDZceDdkXHhiOFx4MDhceDYzXHhlYlx4Y2VceDQ4IgorCQkJICAiXHg4ZFx4ZjFceGNkXHgxMlx4NjFceDY1XHg1ZFx4ZTkiCisJCQkgICJceDU3XHg4OVx4NjVceDY1IiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiVGlnZXIgLSBBIEZhc3QgTmV3IEhhc2ggRnVuY3Rpb24sICIKKwkJCSAgICJieSBSb3NzIEFuZGVyc29uIGFuZCBFbGkgQmloYW0sICIKKwkJCSAgICJwcm9jZWVkaW5ncyBvZiBGYXN0IFNvZnR3YXJlIEVuY3J5cHRpb24gMywgIgorCQkJICAgIkNhbWJyaWRnZSwgMTk5Ni4iLAorCQkucHNpemUgID0gMTI1LAorCQkuZGlnZXN0ID0gIlx4M2RceDlhXHhlYlx4MDNceGQxXHhiZFx4MWFceDYzIgorCQkJICAiXHg1N1x4YjJceDc3XHg0ZFx4ZmRceDZkXHg1Ylx4MjQiCisJCQkgICJceGRkXHg2OFx4MTVceDFkIiwKKwl9LAorfTsKKworI2RlZmluZSBUR1IxMjhfVEVTVF9WRUNUT1JTCTYKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgdGdyMTI4X3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkucGxhaW50ZXh0ID0gIiIsCisJCS5wc2l6ZQk9IDAsCisJCS5kaWdlc3QgPSAiXHgyNFx4ZjBceDEzXHgwY1x4NjNceGFjXHg5M1x4MzIiCisJCQkgICJceDE2XHgxNlx4NmVceDc2XHhiMVx4YmJceDkyXHg1ZiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gImFiYyIsCisJCS5wc2l6ZQk9IDMsCisJCS5kaWdlc3QgPSAiXHhmMlx4NThceGMxXHhlOFx4ODRceDE0XHhhYlx4MmEiCisJCQkgICJceDUyXHg3YVx4YjVceDQxXHhmZlx4YzVceGI4XHhiZiIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIlRpZ2VyIiwKKwkJLnBzaXplCT0gNSwKKwkJLmRpZ2VzdCA9ICJceDlmXHgwMFx4ZjVceDk5XHgwN1x4MjNceDAwXHhkZCIKKwkJCSAgIlx4MjdceDZhXHhiYlx4MzhceGM4XHhlYlx4NmRceGVjIiwKKwl9LCB7CisJCS5wbGFpbnRleHQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLSIsCisJCS5wc2l6ZQk9IDY0LAorCQkuZGlnZXN0ID0gIlx4ODdceGZiXHgyYVx4OTBceDgzXHg4NVx4MWNceGY3IgorCQkJICAiXHg0N1x4MGRceDJjXHhmOFx4MTBceGU2XHhkZlx4OWUiLAorCX0sIHsKKwkJLnBsYWludGV4dCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWj1hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiswMTIzNDU2Nzg5IiwKKwkJLnBzaXplCT0gNjQsCisJCS5kaWdlc3QgPSAiXHg0Nlx4N2RceGI4XHgwOFx4NjNceGViXHhjZVx4NDgiCisJCQkgICJceDhkXHhmMVx4Y2RceDEyXHg2MVx4NjVceDVkXHhlOSIsCisJfSwgeworCQkucGxhaW50ZXh0ID0gIlRpZ2VyIC0gQSBGYXN0IE5ldyBIYXNoIEZ1bmN0aW9uLCAiCisJCQkgICAiYnkgUm9zcyBBbmRlcnNvbiBhbmQgRWxpIEJpaGFtLCAiCisJCQkgICAicHJvY2VlZGluZ3Mgb2YgRmFzdCBTb2Z0d2FyZSBFbmNyeXB0aW9uIDMsICIKKwkJCSAgICJDYW1icmlkZ2UsIDE5OTYuIiwKKwkJLnBzaXplICA9IDEyNSwKKwkJLmRpZ2VzdCA9ICJceDNkXHg5YVx4ZWJceDAzXHhkMVx4YmRceDFhXHg2MyIKKwkJCSAgIlx4NTdceGIyXHg3N1x4NGRceGZkXHg2ZFx4NWJceDI0IiwKKwl9LAorfTsKKworLyoKKyAqIEhNQUMtTUQ1IHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIyMDIKKyAqIChUaGVzZSBuZWVkIHRvIGJlIGZpeGVkIHRvIG5vdCB1c2Ugc3RybGVuKS4KKyAqLworI2RlZmluZSBITUFDX01ENV9URVNUX1ZFQ1RPUlMJNworCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX21kNV90dl90ZW1wbGF0ZVtdID0KK3sKKwl7CisJCS5rZXkJPSAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIsCisJCS5rc2l6ZQk9IDE2LAorCQkucGxhaW50ZXh0ID0gIkhpIFRoZXJlIiwKKwkJLnBzaXplCT0gOCwKKwkJLmRpZ2VzdAk9ICJceDkyXHg5NFx4NzJceDdhXHgzNlx4MzhceGJiXHgxYyIKKwkJCSAgIlx4MTNceGY0XHg4ZVx4ZjhceDE1XHg4Ylx4ZmNceDlkIiwKKwl9LCB7CisJCS5rZXkJPSAiSmVmZSIsCisJCS5rc2l6ZQk9IDQsCisJCS5wbGFpbnRleHQgPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0gIlx4NzVceDBjXHg3OFx4M2VceDZhXHhiMFx4YjVceDAzIgorCQkJICAiXHhlYVx4YThceDZlXHgzMVx4MGFceDVkXHhiN1x4MzgiLAorCQkubnAJPSAyLAorCQkudGFwCT0gezE0LCAxNH0KKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDE2LAorCQkucGxhaW50ZXh0ID0gIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIiwKKwkJLnBzaXplCT0gNTAsCisJCS5kaWdlc3QJPSAiXHg1Nlx4YmVceDM0XHg1Mlx4MWRceDE0XHg0Y1x4ODgiCisJCQkgICJceGRiXHhiOFx4YzdceDMzXHhmMFx4ZThceGIzXHhmNiIsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgorCQkJICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisJCQkgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTkiLAorCQkua3NpemUJPSAyNSwKKwkJLnBsYWludGV4dCA9ICJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIsCisJCS5wc2l6ZQk9IDUwLAorCQkuZGlnZXN0CT0gIlx4NjlceDdlXHhhZlx4MGFceGNhXHgzYVx4M2FceGVhIgorCQkJICAiXHgzYVx4NzVceDE2XHg0N1x4NDZceGZmXHhhYVx4NzkiLAorCX0sIHsKKwkJLmtleQk9ICJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKKwkJLmtzaXplCT0gMTYsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorCQkucHNpemUJPSAyMCwKKwkJLmRpZ2VzdAk9ICJceDU2XHg0Nlx4MWVceGYyXHgzNFx4MmVceGRjXHgwMCIKKwkJCSAgIlx4ZjlceGJhXHhiOVx4OTVceDY5XHgwZVx4ZmRceDRjIiwKKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWEiLAorCQkua3NpemUJPSA4MCwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCQkucHNpemUJPSA1NCwKKwkJLmRpZ2VzdAk9ICJceDZiXHgxYVx4YjdceGZlXHg0Ylx4ZDdceGJmXHg4ZiIKKwkJCSAgIlx4MGJceDYyXHhlNlx4Y2VceDYxXHhiOVx4ZDBceGNkIiwKKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWEiLAorCQkua3NpemUJPSA4MCwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IGFuZCBMYXJnZXIgVGhhbiBPbmUgIgorCQkJICAgIkJsb2NrLVNpemUgRGF0YSIsCisJCS5wc2l6ZQk9IDczLAorCQkuZGlnZXN0CT0gIlx4NmZceDYzXHgwZlx4YWRceDY3XHhjZFx4YTBceGVlIgorCQkJICAiXHgxZlx4YjFceGY1XHg2Mlx4ZGJceDNhXHhhNVx4M2UiLAorCX0sCit9OworCisvKgorICogSE1BQy1SSVBFTUQxMjggdGVzdCB2ZWN0b3JzIGZyb20gUkZDMjI4NgorICovCisjZGVmaW5lIEhNQUNfUk1EMTI4X1RFU1RfVkVDVE9SUwk3CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfcm1kMTI4X3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiLAorCQkua3NpemUJPSAxNiwKKwkJLnBsYWludGV4dCA9ICJIaSBUaGVyZSIsCisJCS5wc2l6ZQk9IDgsCisJCS5kaWdlc3QJPSAiXHhmYlx4ZjZceDFmXHg5NFx4OTJceGFhXHg0Ylx4YmYiCisJCQkgICJceDgxXHhjMVx4NzJceGU4XHg0ZVx4MDdceDM0XHhkYiIsCisJfSwgeworCQkua2V5CT0gIkplZmUiLAorCQkua3NpemUJPSA0LAorCQkucGxhaW50ZXh0ID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAorCQkucHNpemUJPSAyOCwKKwkJLmRpZ2VzdAk9ICJceDg3XHg1Zlx4ODJceDg4XHg2Mlx4YjZceGIzXHgzNCIKKwkJCSAgIlx4YjRceDI3XHhjNVx4NWZceDlmXHg3Zlx4ZjBceDliIiwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMTQsIDE0IH0sCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiLAorCQkua3NpemUJPSAxNiwKKwkJLnBsYWludGV4dCA9ICJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIsCisJCS5wc2l6ZQk9IDUwLAorCQkuZGlnZXN0CT0gIlx4MDlceGYwXHhiMlx4ODRceDZkXHgyZlx4NTRceDNkIgorCQkJICAiXHhhM1x4NjNceGNiXHhlY1x4OGRceDYyXHhhM1x4OGQiLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKKwkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwkJLmtzaXplCT0gMjUsCisJCS5wbGFpbnRleHQgPSAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAorCQkucHNpemUJPSA1MCwKKwkJLmRpZ2VzdAk9ICJceGJkXHhiYlx4ZDdceGNmXHgwM1x4ZTRceDRiXHg1YSIKKwkJCSAgIlx4YTZceDBhXHhmOFx4MTVceGJlXHg0ZFx4MjJceDk0IiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIsCisJCS5rc2l6ZQk9IDE2LAorCQkucGxhaW50ZXh0ID0gIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKKwkJLnBzaXplCT0gMjAsCisJCS5kaWdlc3QJPSAiXHhlN1x4OThceDA4XHhmMlx4NGJceDI1XHhmZFx4MDMiCisJCQkgICJceDFjXHgxNVx4NWZceDBkXHg1NVx4MWRceDlhXHgzYSIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhIiwKKwkJLmtzaXplCT0gODAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSAiXHhkY1x4NzNceDI5XHgyOFx4ZGVceDk4XHgxMFx4NGEiCisJCQkgICJceDFmXHg1OVx4ZDNceDczXHhjMVx4NTBceGFjXHhiYiIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhIiwKKwkJLmtzaXplCT0gODAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSBhbmQgTGFyZ2VyIFRoYW4gT25lICIKKwkJCSAgICJCbG9jay1TaXplIERhdGEiLAorCQkucHNpemUJPSA3MywKKwkJLmRpZ2VzdAk9ICJceDVjXHg2Ylx4ZWNceDk2XHg3OVx4M2VceDE2XHhkNCIKKwkJCSAgIlx4MDZceDkwXHhjMlx4MzdceDYzXHg1Zlx4MzBceGM1IiwKKwl9LAorfTsKKworLyoKKyAqIEhNQUMtUklQRU1EMTYwIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIyODYKKyAqLworI2RlZmluZSBITUFDX1JNRDE2MF9URVNUX1ZFQ1RPUlMJNworCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3JtZDE2MF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIsCisJCS5rc2l6ZQk9IDIwLAorCQkucGxhaW50ZXh0ID0gIkhpIFRoZXJlIiwKKwkJLnBzaXplCT0gOCwKKwkJLmRpZ2VzdAk9ICJceDI0XHhjYlx4NGJceGQ2XHg3ZFx4MjBceGZjXHgxYVx4NWRceDJlIgorCQkJICAiXHhkN1x4NzNceDJkXHhjY1x4MzlceDM3XHg3Zlx4MGFceDU2XHg2OCIsCisJfSwgeworCQkua2V5CT0gIkplZmUiLAorCQkua3NpemUJPSA0LAorCQkucGxhaW50ZXh0ID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAorCQkucHNpemUJPSAyOCwKKwkJLmRpZ2VzdAk9ICJceGRkXHhhNlx4YzBceDIxXHgzYVx4NDhceDVhXHg5ZVx4MjRceGY0IgorCQkJICAiXHg3NFx4MjBceDY0XHhhN1x4ZjBceDMzXHhiNFx4M2NceDQwXHg2OSIsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDE0LCAxNCB9LAorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDIwLAorCQkucGxhaW50ZXh0ID0gIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIiwKKwkJLnBzaXplCT0gNTAsCisJCS5kaWdlc3QJPSAiXHhiMFx4YjFceDA1XHgzNlx4MGRceGU3XHg1OVx4OTZceDBhXHhiNCIKKwkJCSAgIlx4ZjNceDUyXHg5OFx4ZTFceDE2XHhlMlx4OTVceGQ4XHhlN1x4YzEiLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKKwkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwkJLmtzaXplCT0gMjUsCisJCS5wbGFpbnRleHQgPSAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAorCQkucHNpemUJPSA1MCwKKwkJLmRpZ2VzdAk9ICJceGQ1XHhjYVx4ODZceDJmXHg0ZFx4MjFceGQ1XHhlNlx4MTBceGUxIgorCQkJICAiXHg4Ylx4NGNceGYxXHhiZVx4YjlceDdhXHg0M1x4NjVceGVjXHhmNCIsCisJfSwgeworCQkua2V5CT0gIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKKwkJLmtzaXplCT0gMjAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorCQkucHNpemUJPSAyMCwKKwkJLmRpZ2VzdAk9ICJceDc2XHgxOVx4NjlceDM5XHg3OFx4ZjlceDFkXHg5MFx4NTNceDlhIgorCQkJICAiXHhlN1x4ODZceDUwXHgwZlx4ZjNceGQ4XHhlMFx4NTFceDhlXHgzOSIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhIiwKKwkJLmtzaXplCT0gODAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSAiXHg2NFx4NjZceGNhXHgwN1x4YWNceDVlXHhhY1x4MjlceGUxXHhiZCIKKwkJCSAgIlx4NTJceDNlXHg1YVx4ZGFceDc2XHgwNVx4YjdceDkxXHhmZFx4OGIiLAorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDgwLAorCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuIE9uZSAiCisJCQkgICAiQmxvY2stU2l6ZSBEYXRhIiwKKwkJLnBzaXplCT0gNzMsCisJCS5kaWdlc3QJPSAiXHg2OVx4ZWFceDYwXHg3OVx4OGRceDcxXHg2MVx4NmNceGNlXHg1ZiIKKwkJCSAgIlx4ZDBceDg3XHgxZVx4MjNceDc1XHg0Y1x4ZDdceDVkXHg1YVx4MGEiLAorCX0sCit9OworCisvKgorICogSE1BQy1TSEExIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIyMDIKKyAqLworI2RlZmluZSBITUFDX1NIQTFfVEVTVF9WRUNUT1JTCTcKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgaG1hY19zaGExX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIiwKKwkJLmtzaXplCT0gMjAsCisJCS5wbGFpbnRleHQgPSAiSGkgVGhlcmUiLAorCQkucHNpemUJPSA4LAorCQkuZGlnZXN0CT0gIlx4YjZceDE3XHgzMVx4ODZceDU1XHgwNVx4NzJceDY0IgorCQkJICAiXHhlMlx4OGJceGMwXHhiNlx4ZmJceDM3XHg4Y1x4OGVceGYxIgorCQkJICAiXHg0Nlx4YmUiLAorCX0sIHsKKwkJLmtleQk9ICJKZWZlIiwKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9ICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKKwkJLnBzaXplCT0gMjgsCisJCS5kaWdlc3QJPSAiXHhlZlx4ZmNceGRmXHg2YVx4ZTVceGViXHgyZlx4YTJceGQyXHg3NCIKKwkJCSAgIlx4MTZceGQ1XHhmMVx4ODRceGRmXHg5Y1x4MjVceDlhXHg3Y1x4NzkiLAorCQkubnAJPSAyLAorCQkudGFwCT0geyAxNCwgMTQgfQorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDIwLAorCQkucGxhaW50ZXh0ID0gIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIiwKKwkJLnBzaXplCT0gNTAsCisJCS5kaWdlc3QJPSAiXHgxMlx4NWRceDczXHg0Mlx4YjlceGFjXHgxMVx4Y2RceDkxXHhhMyIKKwkJCSAgIlx4OWFceGY0XHg4YVx4YTFceDdiXHg0Zlx4NjNceGYxXHg3NVx4ZDMiLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKKwkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5IiwKKwkJLmtzaXplCT0gMjUsCisJCS5wbGFpbnRleHQgPSAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAorCQkucHNpemUJPSA1MCwKKwkJLmRpZ2VzdAk9ICJceDRjXHg5MFx4MDdceGY0XHgwMlx4NjJceDUwXHhjNlx4YmNceDg0IgorCQkJICAiXHgxNFx4ZjlceGJmXHg1MFx4YzhceDZjXHgyZFx4NzJceDM1XHhkYSIsCisJfSwgeworCQkua2V5CT0gIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjIiwKKwkJLmtzaXplCT0gMjAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorCQkucHNpemUJPSAyMCwKKwkJLmRpZ2VzdAk9ICJceDRjXHgxYVx4MDNceDQyXHg0Ylx4NTVceGUwXHg3Zlx4ZTdceGYyIgorCQkJICAiXHg3Ylx4ZTFceGQ1XHg4Ylx4YjlceDMyXHg0YVx4OWFceDVhXHgwNCIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhIiwKKwkJLmtzaXplCT0gODAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSAiXHhhYVx4NGFceGU1XHhlMVx4NTJceDcyXHhkMFx4MGVceDk1XHg3MCIKKwkJCSAgIlx4NTZceDM3XHhjZVx4OGFceDNiXHg1NVx4ZWRceDQwXHgyMVx4MTIiLAorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDgwLAorCQkucGxhaW50ZXh0ID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuIE9uZSAiCisJCQkgICAiQmxvY2stU2l6ZSBEYXRhIiwKKwkJLnBzaXplCT0gNzMsCisJCS5kaWdlc3QJPSAiXHhlOFx4ZTlceDlkXHgwZlx4NDVceDIzXHg3ZFx4NzhceDZkXHg2YiIKKwkJCSAgIlx4YmFceGE3XHg5Nlx4NWNceDc4XHgwOFx4YmJceGZmXHgxYVx4OTEiLAorCX0sCit9OworCisKKy8qCisgKiBTSEEyMjQgSE1BQyB0ZXN0IHZlY3RvcnMgZnJvbSBSRkM0MjMxCisgKi8KKyNkZWZpbmUgSE1BQ19TSEEyMjRfVEVTVF9WRUNUT1JTICAgIDQKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgaG1hY19zaGEyMjRfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJCQkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJCQkiXHgwYlx4MGJceDBiXHgwYiIsCisJCS5rc2l6ZSAgPSAyMCwKKwkJLyogICgiSGkgVGhlcmUiKSAqLworCQkucGxhaW50ZXh0ID0gIlx4NDhceDY5XHgyMFx4NTRceDY4XHg2NVx4NzJceDY1IiwKKwkJLnBzaXplICA9IDgsCisJCS5kaWdlc3QgPSAiXHg4OVx4NmZceGIxXHgxMlx4OGFceGJiXHhkZlx4MTkiCisJCQkiXHg2OFx4MzJceDEwXHg3Y1x4ZDRceDlkXHhmM1x4M2YiCisJCQkiXHg0N1x4YjRceGIxXHgxNlx4OTlceDEyXHhiYVx4NGYiCisJCQkiXHg1M1x4NjhceDRiXHgyMiIsCisJfSwgeworCQkua2V5ICAgID0gIkplZmUiLAorCQkua3NpemUgID0gNCwKKwkJLyogKCJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IikgKi8KKwkJLnBsYWludGV4dCA9ICJceDc3XHg2OFx4NjFceDc0XHgyMFx4NjRceDZmXHgyMCIKKwkJCSJceDc5XHg2MVx4MjBceDc3XHg2MVx4NmVceDc0XHgyMCIKKwkJCSJceDY2XHg2Zlx4NzJceDIwXHg2ZVx4NmZceDc0XHg2OCIKKwkJCSJceDY5XHg2ZVx4NjdceDNmIiwKKwkJLnBzaXplICA9IDI4LAorCQkuZGlnZXN0ID0gIlx4YTNceDBlXHgwMVx4MDlceDhiXHhjNlx4ZGJceGJmIgorCQkJIlx4NDVceDY5XHgwZlx4M2FceDdlXHg5ZVx4NmRceDBmIgorCQkJIlx4OGJceGJlXHhhMlx4YTNceDllXHg2MVx4NDhceDAwIgorCQkJIlx4OGZceGQwXHg1ZVx4NDQiLAorCQkubnAgPSA0LAorCQkudGFwICAgID0geyA3LCA3LCA3LCA3IH0KKwl9LCB7CisJCS5rZXkgICAgPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhIiwKKwkJLmtzaXplICA9IDEzMSwKKwkJLyogKCJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiKSAqLworCQkucGxhaW50ZXh0ID0gIlx4NTRceDY1XHg3M1x4NzRceDIwXHg1NVx4NzNceDY5IgorCQkJIlx4NmVceDY3XHgyMFx4NGNceDYxXHg3Mlx4NjdceDY1IgorCQkJIlx4NzJceDIwXHg1NFx4NjhceDYxXHg2ZVx4MjBceDQyIgorCQkJIlx4NmNceDZmXHg2M1x4NmJceDJkXHg1M1x4NjlceDdhIgorCQkJIlx4NjVceDIwXHg0Ylx4NjVceDc5XHgyMFx4MmRceDIwIgorCQkJIlx4NDhceDYxXHg3M1x4NjhceDIwXHg0Ylx4NjVceDc5IgorCQkJIlx4MjBceDQ2XHg2OVx4NzJceDczXHg3NCIsCisJCS5wc2l6ZSAgPSA1NCwKKwkJLmRpZ2VzdCA9ICJceDk1XHhlOVx4YTBceGRiXHg5Nlx4MjBceDk1XHhhZCIKKwkJCSJceGFlXHhiZVx4OWJceDJkXHg2Zlx4MGRceGJjXHhlMiIKKwkJCSJceGQ0XHg5OVx4ZjFceDEyXHhmMlx4ZDJceGI3XHgyNyIKKwkJCSJceDNmXHhhNlx4ODdceDBlIiwKKwl9LCB7CisJCS5rZXkgICAgPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhIiwKKwkJLmtzaXplICA9IDEzMSwKKwkJLyogKCJUaGlzIGlzIGEgdGVzdCB1c2luZyBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUga2V5IGFuZCBhIikKKwkJKCIgbGFyZ2VyIHRoYW4gYmxvY2stc2l6ZSBkYXRhLiBUaGUga2V5IG5lZWRzIHRvIGJlIikKKwkJCSgiIGhhc2hlZCBiZWZvcmUgYmVpbmcgdXNlZCBieSB0aGUgSE1BQyBhbGdvcml0aG0uIikgKi8KKwkJLnBsYWludGV4dCA9ICJceDU0XHg2OFx4NjlceDczXHgyMFx4NjlceDczXHgyMCIKKwkJCSJceDYxXHgyMFx4NzRceDY1XHg3M1x4NzRceDIwXHg3NSIKKwkJCSJceDczXHg2OVx4NmVceDY3XHgyMFx4NjFceDIwXHg2YyIKKwkJCSJceDYxXHg3Mlx4NjdceDY1XHg3Mlx4MjBceDc0XHg2OCIKKwkJCSJceDYxXHg2ZVx4MjBceDYyXHg2Y1x4NmZceDYzXHg2YiIKKwkJCSJceDJkXHg3M1x4NjlceDdhXHg2NVx4MjBceDZiXHg2NSIKKwkJCSJceDc5XHgyMFx4NjFceDZlXHg2NFx4MjBceDYxXHgyMCIKKwkJCSJceDZjXHg2MVx4NzJceDY3XHg2NVx4NzJceDIwXHg3NCIKKwkJCSJceDY4XHg2MVx4NmVceDIwXHg2Mlx4NmNceDZmXHg2MyIKKwkJCSJceDZiXHgyZFx4NzNceDY5XHg3YVx4NjVceDIwXHg2NCIKKwkJCSJceDYxXHg3NFx4NjFceDJlXHgyMFx4NTRceDY4XHg2NSIKKwkJCSJceDIwXHg2Ylx4NjVceDc5XHgyMFx4NmVceDY1XHg2NSIKKwkJCSJceDY0XHg3M1x4MjBceDc0XHg2Zlx4MjBceDYyXHg2NSIKKwkJCSJceDIwXHg2OFx4NjFceDczXHg2OFx4NjVceDY0XHgyMCIKKwkJCSJceDYyXHg2NVx4NjZceDZmXHg3Mlx4NjVceDIwXHg2MiIKKwkJCSJceDY1XHg2OVx4NmVceDY3XHgyMFx4NzVceDczXHg2NSIKKwkJCSJceDY0XHgyMFx4NjJceDc5XHgyMFx4NzRceDY4XHg2NSIKKwkJCSJceDIwXHg0OFx4NGRceDQxXHg0M1x4MjBceDYxXHg2YyIKKwkJCSJceDY3XHg2Zlx4NzJceDY5XHg3NFx4NjhceDZkXHgyZSIsCisJCS5wc2l6ZSAgPSAxNTIsCisJCS5kaWdlc3QgPSAiXHgzYVx4ODVceDQxXHg2Nlx4YWNceDVkXHg5Zlx4MDIiCisJCQkiXHgzZlx4NTRceGQ1XHgxN1x4ZDBceGIzXHg5ZFx4YmQiCisJCQkiXHg5NFx4NjdceDcwXHhkYlx4OWNceDJiXHg5NVx4YzkiCisJCQkiXHhmNlx4ZjVceDY1XHhkMSIsCisJfSwKK307CisKKy8qCisgKiBITUFDLVNIQTI1NiB0ZXN0IHZlY3RvcnMgZnJvbQorICogZHJhZnQtaWV0Zi1pcHNlYy1jaXBoLXNoYS0yNTYtMDEudHh0CisgKi8KKyNkZWZpbmUgSE1BQ19TSEEyNTZfVEVTVF9WRUNUT1JTCTEwCisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhMjU2X3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgorCQkJICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisJCQkgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOCIKKwkJCSAgIlx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZceDIwIiwKKwkJLmtzaXplCT0gMzIsCisJCS5wbGFpbnRleHQgPSAiYWJjIiwKKwkJLnBzaXplCT0gMywKKwkJLmRpZ2VzdAk9ICJceGEyXHgxYlx4MWZceDVkXHg0Y1x4ZjRceGY3XHgzYSIKKwkJCSAgIlx4NGRceGQ5XHgzOVx4NzVceDBmXHg3YVx4MDZceDZhIgorCQkJICAiXHg3Zlx4OThceGNjXHgxM1x4MWNceGIxXHg2YVx4NjYiCisJCQkgICJceDkyXHg3NVx4OTBceDIxXHhjZlx4YWJceDgxXHg4MSIsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgorCQkJICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisJCQkgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOCIKKwkJCSAgIlx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZceDIwIiwKKwkJLmtzaXplCT0gMzIsCisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSA1NiwKKwkJLmRpZ2VzdAk9ICJceDEwXHg0Zlx4ZGNceDEyXHg1N1x4MzJceDhmXHgwOCIKKwkJCSAgIlx4MThceDRiXHhhN1x4MzFceDMxXHhjNVx4M2NceGFlIgorCQkJICAiXHhlNlx4OThceGUzXHg2MVx4MTlceDQyXHgxMVx4NDkiCisJCQkgICJceGVhXHg4Y1x4NzFceDI0XHg1Nlx4NjlceDdkXHgzMCIsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgorCQkJICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisJCQkgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOCIKKwkJCSAgIlx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZceDIwIiwKKwkJLmtzaXplCT0gMzIsCisJCS5wbGFpbnRleHQgPSAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiCisJCQkgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorCQkucHNpemUJPSAxMTIsCisJCS5kaWdlc3QJPSAiXHg0N1x4MDNceDA1XHhmY1x4N2VceDQwXHhmZVx4MzQiCisJCQkgICJceGQzXHhlZVx4YjNceGU3XHg3M1x4ZDlceDVhXHhhYiIKKwkJCSAgIlx4NzNceGFjXHhmMFx4ZmRceDA2XHgwNFx4NDdceGE1IgorCQkJICAiXHhlYlx4NDVceDk1XHhiZlx4MzNceGE5XHhkMVx4YTMiLAorCX0sIHsKKwkJLmtleQk9ICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorCQkJIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJCQkiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIiwKKwkJLmtzaXplCT0gMzIsCisJCS5wbGFpbnRleHQgPSAiSGkgVGhlcmUiLAorCQkucHNpemUJPSA4LAorCQkuZGlnZXN0CT0gIlx4MTlceDhhXHg2MFx4N2VceGI0XHg0Ylx4ZmJceGM2IgorCQkJICAiXHg5OVx4MDNceGEwXHhmMVx4Y2ZceDJiXHhiZFx4YzUiCisJCQkgICJceGJhXHgwYVx4YTNceGYzXHhkOVx4YWVceDNjXHgxYyIKKwkJCSAgIlx4N2FceDNiXHgxNlx4OTZceGEwXHhiNlx4OGNceGY3IiwKKwl9LCB7CisJCS5rZXkJPSAiSmVmZSIsCisJCS5rc2l6ZQk9IDQsCisJCS5wbGFpbnRleHQgPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0gIlx4NWJceGRjXHhjMVx4NDZceGJmXHg2MFx4NzVceDRlIgorCQkJICAiXHg2YVx4MDRceDI0XHgyNlx4MDhceDk1XHg3NVx4YzciCisJCQkgICJceDVhXHgwMFx4M2ZceDA4XHg5ZFx4MjdceDM5XHg4MyIKKwkJCSAgIlx4OWRceGVjXHg1OFx4YjlceDY0XHhlY1x4MzhceDQzIiwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMTQsIDE0IH0KKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDMyLAorCQkucGxhaW50ZXh0ID0gIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZCIKKwkJCSJceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIgorCQkJIlx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGQiCisJCQkiXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkXHhkZFx4ZGRceGRkIiwKKwkJLnBzaXplCT0gNTAsCisJCS5kaWdlc3QJPSAiXHhjZFx4Y2JceDEyXHgyMFx4ZDFceGVjXHhjY1x4ZWEiCisJCQkgICJceDkxXHhlNVx4M2FceGJhXHgzMFx4OTJceGY5XHg2MiIKKwkJCSAgIlx4ZTVceDQ5XHhmZVx4NmNceGU5XHhlZFx4N2ZceGRjIgorCQkJICAiXHg0M1x4MTlceDFmXHhiZFx4ZTRceDVjXHgzMFx4YjAiLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIKKwkJCSAgIlx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGZceDEwIgorCQkJICAiXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MTgiCisJCQkgICJceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmXHgyMCIKKwkJCSAgIlx4MjFceDIyXHgyM1x4MjRceDI1IiwKKwkJLmtzaXplCT0gMzcsCisJCS5wbGFpbnRleHQgPSAiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkIgorCQkJIlx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiCisJCQkiXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZCIKKwkJCSJceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2RceGNkXHhjZFx4Y2QiLAorCQkucHNpemUJPSA1MCwKKwkJLmRpZ2VzdAk9ICJceGQ0XHg2M1x4M2NceDE3XHhmNlx4ZmJceDhkXHg3NCIKKwkJCSAgIlx4NGNceDY2XHhkZVx4ZTBceGY4XHhmMFx4NzRceDU1IgorCQkJICAiXHg2ZVx4YzRceGFmXHg1NVx4ZWZceDA3XHg5OVx4ODUiCisJCQkgICJceDQxXHg0Nlx4OGVceGI0XHg5Ylx4ZDJceGU5XHgxNyIsCisJfSwgeworCQkua2V5CT0gIlx4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiCisJCQkiXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwY1x4MGNceDBjXHgwYyIKKwkJCSJceDBjXHgwY1x4MGNceDBjXHgwY1x4MGMiLAorCQkua3NpemUJPSAzMiwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFdpdGggVHJ1bmNhdGlvbiIsCisJCS5wc2l6ZQk9IDIwLAorCQkuZGlnZXN0CT0gIlx4NzVceDQ2XHhhZlx4MDFceDg0XHgxZlx4YzBceDliIgorCQkJICAiXHgxYVx4YjlceGMzXHg3NFx4OWFceDVmXHgxY1x4MTciCisJCQkgICJceGQ0XHhmNVx4ODlceDY2XHg4YVx4NThceDdiXHgyNyIKKwkJCSAgIlx4MDBceGE5XHhjOVx4N2NceDExXHg5M1x4Y2ZceDQyIiwKKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWEiLAorCQkua3NpemUJPSA4MCwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorCQkucHNpemUJPSA1NCwKKwkJLmRpZ2VzdAk9ICJceDY5XHg1M1x4MDJceDVlXHhkOVx4NmZceDBjXHgwOSIKKwkJCSAgIlx4ZjhceDBhXHg5Nlx4ZjdceDhlXHg2NVx4MzhceGRiIgorCQkJICAiXHhlMlx4ZTdceGI4XHgyMFx4ZTNceGRkXHg5N1x4MGUiCisJCQkgICJceDdkXHhkZFx4MzlceDA5XHgxYlx4MzJceDM1XHgyZiIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhIiwKKwkJLmtzaXplCT0gODAsCisJCS5wbGFpbnRleHQgPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSBhbmQgTGFyZ2VyIFRoYW4gIgorCQkJICAgIk9uZSBCbG9jay1TaXplIERhdGEiLAorCQkucHNpemUJPSA3MywKKwkJLmRpZ2VzdAk9ICJceDYzXHg1NVx4YWNceDIyXHhlOFx4OTBceGQwXHhhMyIKKwkJCSAgIlx4YzhceDQ4XHgxYVx4NWNceGE0XHg4Mlx4NWJceGM4IgorCQkJICAiXHg4NFx4ZDNceGU3XHhhMVx4ZmZceDk4XHhhMlx4ZmMiCisJCQkgICJceDJhXHhjN1x4ZDhceGUwXHg2NFx4YzNceGIyXHhlNiIsCisJfSwKK307CisKKyNkZWZpbmUgWENCQ19BRVNfVEVTVF9WRUNUT1JTIDYKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgYWVzX3hjYmMxMjhfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5wbGFpbnRleHQgPSB6ZXJvZWRfc3RyaW5nLAorCQkuZGlnZXN0ID0gIlx4NzVceGYwXHgyNVx4MWRceDUyXHg4YVx4YzBceDFjIgorCQkJICAiXHg0NVx4NzNceGRmXHhkNVx4ODRceGQ3XHg5Zlx4MjkiLAorCQkucHNpemUJPSAwLAorCQkua3NpemUJPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5wbGFpbnRleHQgPSAiXHgwMFx4MDFceDAyIiwKKwkJLmRpZ2VzdAk9ICJceDViXHgzN1x4NjVceDgwXHhhZVx4MmZceDE5XHhhZiIKKwkJCSAgIlx4ZTdceDIxXHg5Y1x4ZWVceGYxXHg3Mlx4NzVceDZmIiwKKwkJLnBzaXplCT0gMywKKwkJLmtzaXplCT0gMTYsCisJfSAsIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLnBsYWludGV4dCA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgICAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmRpZ2VzdCA9ICJceGQyXHhhMlx4NDZceGZhXHgzNFx4OWJceDY4XHhhNyIKKwkJCSAgIlx4OTlceDk4XHhhNFx4MzlceDRmXHhmN1x4YTJceDYzIiwKKwkJLnBzaXplCT0gMTYsCisJCS5rc2l6ZQk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLnBsYWludGV4dCA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgICAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAgICAiXHgxMFx4MTFceDEyXHgxMyIsCisJCS5kaWdlc3QgPSAiXHg0N1x4ZjVceDFiXHg0NVx4NjRceDk2XHg2Mlx4MTUiCisJCQkgICJceGI4XHg5OFx4NWNceDYzXHgwNVx4NWVceGQzXHgwOCIsCisJCS50YXAJPSB7IDEwLCAxMCB9LAorCQkucHNpemUJPSAyMCwKKwkJLm5wCT0gMiwKKwkJLmtzaXplCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorCQkucGxhaW50ZXh0ID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAgICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgICAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKwkJLmRpZ2VzdCA9ICJceGY1XHg0Zlx4MGVceGM4XHhkMlx4YjlceGYzXHhkMyIKKwkJCSAgIlx4NjhceDA3XHg3M1x4NGJceGQ1XHgyOFx4M2ZceGQ0IiwKKwkJLnBzaXplCT0gMzIsCisJCS5rc2l6ZQk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLnBsYWludGV4dCA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgICAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAgICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICAgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSAgICAgIlx4MjBceDIxIiwKKwkJLmRpZ2VzdCA9ICJceGJlXHhjYlx4YjNceGJjXHhjZFx4YjVceDE4XHhhMyIKKwkJCSAgIlx4MDZceDc3XHhkNVx4NDhceDFmXHhiNlx4YjRceGQ4IiwKKwkJLnRhcAk9IHsgMTcsIDE3IH0sCisJCS5wc2l6ZQk9IDM0LAorCQkubnAJPSAyLAorCQkua3NpemUJPSAxNiwKKwl9Cit9OworCisvKgorICogU0hBMzg0IEhNQUMgdGVzdCB2ZWN0b3JzIGZyb20gUkZDNDIzMQorICovCisKKyNkZWZpbmUgSE1BQ19TSEEzODRfVEVTVF9WRUNUT1JTCTQKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgaG1hY19zaGEzODRfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJCQkgICJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYiIKKwkJCSAgIlx4MGJceDBiXHgwYlx4MGIiLAorCQkua3NpemUJPSAyMCwKKwkJLnBsYWludGV4dCA9ICJIaSBUaGVyZSIsCisJCS5wc2l6ZQk9IDgsCisJCS5kaWdlc3QJPSAiXHhhZlx4ZDBceDM5XHg0NFx4ZDhceDQ4XHg5NVx4NjIiCisJCQkgICJceDZiXHgwOFx4MjVceGY0XHhhYlx4NDZceDkwXHg3ZiIKKwkJCSAgIlx4MTVceGY5XHhkYVx4ZGJceGU0XHgxMFx4MWVceGM2IgorCQkJICAiXHg4Mlx4YWFceDAzXHg0Y1x4N2NceGViXHhjNVx4OWMiCisJCQkgICJceGZhXHhlYVx4OWVceGE5XHgwN1x4NmVceGRlXHg3ZiIKKwkJCSAgIlx4NGFceGYxXHg1Mlx4ZThceGIyXHhmYVx4OWNceGI2IiwKKwl9LCB7CisJCS5rZXkJPSAiSmVmZSIsCisJCS5rc2l6ZQk9IDQsCisJCS5wbGFpbnRleHQgPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0gIlx4YWZceDQ1XHhkMlx4ZTNceDc2XHg0OFx4NDBceDMxIgorCQkJICAiXHg2MVx4N2ZceDc4XHhkMlx4YjVceDhhXHg2Ylx4MWIiCisJCQkgICJceDljXHg3ZVx4ZjRceDY0XHhmNVx4YTBceDFiXHg0NyIKKwkJCSAgIlx4ZTRceDJlXHhjM1x4NzNceDYzXHgyMlx4NDRceDVlIgorCQkJICAiXHg4ZVx4MjJceDQwXHhjYVx4NWVceDY5XHhlMlx4YzciCisJCQkgICJceDhiXHgzMlx4MzlceGVjXHhmYVx4YjJceDE2XHg0OSIsCisJCS5ucAk9IDQsCisJCS50YXAJPSB7IDcsIDcsIDcsIDcgfQorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDEzMSwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpeiIKKwkJCSAgICJlIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSAiXHg0ZVx4Y2VceDA4XHg0NFx4ODVceDgxXHgzZVx4OTAiCisJCQkgICJceDg4XHhkMlx4YzZceDNhXHgwNFx4MWJceGM1XHhiNCIKKwkJCSAgIlx4NGZceDllXHhmMVx4MDFceDJhXHgyYlx4NThceDhmIgorCQkJICAiXHgzY1x4ZDFceDFmXHgwNVx4MDNceDNhXHhjNFx4YzYiCisJCQkgICJceDBjXHgyZVx4ZjZceGFiXHg0MFx4MzBceGZlXHg4MiIKKwkJCSAgIlx4OTZceDI0XHg4ZFx4ZjFceDYzXHhmNFx4NDlceDUyIiwKKwl9LCB7CisJCS5rZXkJPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWEiLAorCQkua3NpemUJPSAxMzEsCisJCS5wbGFpbnRleHQgPSAiVGhpcyBpcyBhIHRlc3QgdSIKKwkJCSAgICJzaW5nIGEgbGFyZ2VyIHRoIgorCQkJICAgImFuIGJsb2NrLXNpemUga2UiCisJCQkgICAieSBhbmQgYSBsYXJnZXIgdCIKKwkJCSAgICJoYW4gYmxvY2stc2l6ZSBkIgorCQkJICAgImF0YS4gVGhlIGtleSBuZWUiCisJCQkgICAiZHMgdG8gYmUgaGFzaGVkICIKKwkJCSAgICJiZWZvcmUgYmVpbmcgdXNlIgorCQkJICAgImQgYnkgdGhlIEhNQUMgYWwiCisJCQkgICAiZ29yaXRobS4iLAorCQkucHNpemUJPSAxNTIsCisJCS5kaWdlc3QJPSAiXHg2Nlx4MTdceDE3XHg4ZVx4OTRceDFmXHgwMlx4MGQiCisJCQkgICJceDM1XHgxZVx4MmZceDI1XHg0ZVx4OGZceGQzXHgyYyIKKwkJCSAgIlx4NjBceDI0XHgyMFx4ZmVceGIwXHhiOFx4ZmJceDlhIgorCQkJICAiXHhkY1x4Y2VceGJiXHg4Mlx4NDZceDFlXHg5OVx4YzUiCisJCQkgICJceGE2XHg3OFx4Y2NceDMxXHhlN1x4OTlceDE3XHg2ZCIKKwkJCSAgIlx4MzhceDYwXHhlNlx4MTFceDBjXHg0Nlx4NTJceDNlIiwKKwl9LAorfTsKKworLyoKKyAqIFNIQTUxMiBITUFDIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzQyMzEKKyAqLworCisjZGVmaW5lIEhNQUNfU0hBNTEyX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiIgorCQkJICAiXHgwYlx4MGJceDBiXHgwYlx4MGJceDBiXHgwYlx4MGIiCisJCQkgICJceDBiXHgwYlx4MGJceDBiIiwKKwkJLmtzaXplCT0gMjAsCisJCS5wbGFpbnRleHQgPSAiSGkgVGhlcmUiLAorCQkucHNpemUJPSA4LAorCQkuZGlnZXN0CT0gIlx4ODdceGFhXHg3Y1x4ZGVceGE1XHhlZlx4NjFceDlkIgorCQkJICAiXHg0Zlx4ZjBceGI0XHgyNFx4MWFceDFkXHg2Y1x4YjAiCisJCQkgICJceDIzXHg3OVx4ZjRceGUyXHhjZVx4NGVceGMyXHg3OCIKKwkJCSAgIlx4N2FceGQwXHhiM1x4MDVceDQ1XHhlMVx4N2NceGRlIgorCQkJICAiXHhkYVx4YThceDMzXHhiN1x4ZDZceGI4XHhhN1x4MDIiCisJCQkgICJceDAzXHg4Ylx4MjdceDRlXHhhZVx4YTNceGY0XHhlNCIKKwkJCSAgIlx4YmVceDlkXHg5MVx4NGVceGViXHg2MVx4ZjFceDcwIgorCQkJICAiXHgyZVx4NjlceDZjXHgyMFx4M2FceDEyXHg2OFx4NTQiLAorCX0sIHsKKwkJLmtleQk9ICJKZWZlIiwKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9ICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKKwkJLnBzaXplCT0gMjgsCisJCS5kaWdlc3QJPSAiXHgxNlx4NGJceDdhXHg3Ylx4ZmNceGY4XHgxOVx4ZTIiCisJCQkgICJceGUzXHg5NVx4ZmJceGU3XHgzYlx4NTZceGUwXHhhMyIKKwkJCSAgIlx4ODdceGJkXHg2NFx4MjJceDJlXHg4M1x4MWZceGQ2IgorCQkJICAiXHgxMFx4MjdceDBjXHhkN1x4ZWFceDI1XHgwNVx4NTQiCisJCQkgICJceDk3XHg1OFx4YmZceDc1XHhjMFx4NWFceDk5XHg0YSIKKwkJCSAgIlx4NmRceDAzXHg0Zlx4NjVceGY4XHhmMFx4ZTZceGZkIgorCQkJICAiXHhjYVx4ZWFceGIxXHhhM1x4NGRceDRhXHg2Ylx4NGIiCisJCQkgICJceDYzXHg2ZVx4MDdceDBhXHgzOFx4YmNceGU3XHgzNyIsCisJCS5ucAk9IDQsCisJCS50YXAJPSB7IDcsIDcsIDcsIDcgfQorCX0sIHsKKwkJLmtleQk9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJICAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisJCQkgICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKwkJCSAgIlx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDEzMSwKKwkJLnBsYWludGV4dCA9ICJUZXN0IFVzaW5nIExhcmdlIgorCQkJICAgInIgVGhhbiBCbG9jay1TaXoiCisJCQkgICAiZSBLZXkgLSBIYXNoIEtleSIKKwkJCSAgICIgRmlyc3QiLAorCQkucHNpemUJPSA1NCwKKwkJLmRpZ2VzdAk9ICJceDgwXHhiMlx4NDJceDYzXHhjN1x4YzFceGEzXHhlYiIKKwkJCSJceGI3XHgxNFx4OTNceGMxXHhkZFx4N2JceGU4XHhiNCIKKwkJCSJceDliXHg0Nlx4ZDFceGY0XHgxYlx4NGFceGVlXHhjMSIKKwkJCSJceDEyXHgxYlx4MDFceDM3XHg4M1x4ZjhceGYzXHg1MiIKKwkJCSJceDZiXHg1Nlx4ZDBceDM3XHhlMFx4NWZceDI1XHg5OCIKKwkJCSJceGJkXHgwZlx4ZDJceDIxXHg1ZFx4NmFceDFlXHg1MiIKKwkJCSJceDk1XHhlNlx4NGZceDczXHhmNlx4M2ZceDBhXHhlYyIKKwkJCSJceDhiXHg5MVx4NWFceDk4XHg1ZFx4NzhceDY1XHg5OCIsCisJfSwgeworCQkua2V5CT0gIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhIgorCQkJIlx4YWFceGFhXHhhYSIsCisJCS5rc2l6ZQk9IDEzMSwKKwkJLnBsYWludGV4dCA9CisJCQkgICJUaGlzIGlzIGEgdGVzdCB1IgorCQkJICAic2luZyBhIGxhcmdlciB0aCIKKwkJCSAgImFuIGJsb2NrLXNpemUga2UiCisJCQkgICJ5IGFuZCBhIGxhcmdlciB0IgorCQkJICAiaGFuIGJsb2NrLXNpemUgZCIKKwkJCSAgImF0YS4gVGhlIGtleSBuZWUiCisJCQkgICJkcyB0byBiZSBoYXNoZWQgIgorCQkJICAiYmVmb3JlIGJlaW5nIHVzZSIKKwkJCSAgImQgYnkgdGhlIEhNQUMgYWwiCisJCQkgICJnb3JpdGhtLiIsCisJCS5wc2l6ZQk9IDE1MiwKKwkJLmRpZ2VzdAk9ICJceGUzXHg3Ylx4NmFceDc3XHg1ZFx4YzhceDdkXHhiYSIKKwkJCSJceGE0XHhkZlx4YTlceGY5XHg2ZVx4NWVceDNmXHhmZCIKKwkJCSJceGRlXHhiZFx4NzFceGY4XHg4Nlx4NzJceDg5XHg4NiIKKwkJCSJceDVkXHhmNVx4YTNceDJkXHgyMFx4Y2RceGM5XHg0NCIKKwkJCSJceGI2XHgwMlx4MmNceGFjXHgzY1x4NDlceDgyXHhiMSIKKwkJCSJceDBkXHg1ZVx4ZWJceDU1XHhjM1x4ZTRceGRlXHgxNSIKKwkJCSJceDEzXHg0Nlx4NzZceGZiXHg2ZFx4ZTBceDQ0XHg2MCIKKwkJCSJceDY1XHhjOVx4NzRceDQwXHhmYVx4OGNceDZhXHg1OCIsCisJfSwKK307CisKKy8qCisgKiBERVMgdGVzdCB2ZWN0b3JzLgorICovCisjZGVmaW5lIERFU19FTkNfVEVTVF9WRUNUT1JTCQkxMAorI2RlZmluZSBERVNfREVDX1RFU1RfVkVDVE9SUwkJNAorI2RlZmluZSBERVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMJNQorI2RlZmluZSBERVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJNAorI2RlZmluZSBERVMzX0VERV9FTkNfVEVTVF9WRUNUT1JTCTMKKyNkZWZpbmUgREVTM19FREVfREVDX1RFU1RfVkVDVE9SUwkzCisjZGVmaW5lIERFUzNfRURFX0NCQ19FTkNfVEVTVF9WRUNUT1JTCTEKKyNkZWZpbmUgREVTM19FREVfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJMQorCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlc19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEZyb20gQXBwbGllZCBDcnlwdG9ncmFwaHkgKi8KKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogU2FtZSBrZXksIGRpZmZlcmVudCBwbGFpbnRleHQgYmxvY2sgKi8KKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZjdceDljXHg4OVx4MmFceDMzXHg4Zlx4NGFceDhiIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogU2JveCB0ZXN0IGZyb20gTkJTICovCisJCS5rZXkJPSAiXHg3Y1x4YTFceDEwXHg0NVx4NGFceDFhXHg2ZVx4NTciLAorCQkua2xlbgk9IDgsCisJCS5pbnB1dAk9ICJceDAxXHhhMVx4ZDZceGQwXHgzOVx4NzdceDY3XHg0MiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDY5XHgwZlx4NWJceDBkXHg5YVx4MjZceDkzXHg5YiIsCisJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIFRocmVlIGJsb2NrcyAqLworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciCisJCQkgICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIKKwkJCSAgIlx4Y2FceGZlXHhiYVx4YmVceGZlXHhlZFx4YmVceGVmIiwKKwkJLmlsZW4JPSAyNCwKKwkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIKKwkJCSAgIlx4ZjdceDljXHg4OVx4MmFceDMzXHg4Zlx4NGFceDhiIgorCQkJICAiXHhiNFx4OTlceDI2XHhmN1x4MWZceGUxXHhkNFx4OTAiLAorCQkucmxlbgk9IDI0LAorCX0sIHsgLyogV2VhayBrZXkgKi8KKwkJLmZhaWwJPSAxLAorCQkud2sJPSAxLAorCQkua2V5CT0gIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBUd28gYmxvY2tzIC0tIGZvciB0ZXN0aW5nIGVuY3J5cHRpb24gYWNyb3NzIHBhZ2VzICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIKKwkJCSAgIlx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIKKwkJCSAgIlx4ZjdceDljXHg4OVx4MmFceDMzXHg4Zlx4NGFceDhiIiwKKwkJLnJsZW4JPSAxNiwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgOCwgOCB9CisJfSwgeyAvKiBGb3VyIGJsb2NrcyAtLSBmb3IgdGVzdGluZyBlbmNyeXB0aW9uIHdpdGggY2h1bmtpbmcgKi8KKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgorCQkJICAiXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3XHg4OFx4OTkiCisJCQkgICJceGNhXHhmZVx4YmFceGJlXHhmZVx4ZWRceGJlXHhlZiIKKwkJCSAgIlx4MjJceDMzXHg0NFx4NTVceDY2XHg3N1x4ODhceDk5IiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIKKwkJCSAgIlx4ZjdceDljXHg4OVx4MmFceDMzXHg4Zlx4NGFceDhiIgorCQkJICAiXHhiNFx4OTlceDI2XHhmN1x4MWZceGUxXHhkNFx4OTAiCisJCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIsCisJCS5ybGVuCT0gMzIsCisJCS5ucAk9IDMsCisJCS50YXAJPSB7IDE0LCAxMCwgOCB9CisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciCisJCQkgICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIKKwkJCSAgIlx4Y2FceGZlXHhiYVx4YmVceGZlXHhlZFx4YmVceGVmIiwKKwkJLmlsZW4JPSAyNCwKKwkJLnJlc3VsdAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIKKwkJCSAgIlx4ZjdceDljXHg4OVx4MmFceDMzXHg4Zlx4NGFceDhiIgorCQkJICAiXHhiNFx4OTlceDI2XHhmN1x4MWZceGUxXHhkNFx4OTAiLAorCQkucmxlbgk9IDI0LAorCQkubnAJPSA0LAorCQkudGFwCT0geyAyLCAxLCAzLCAxOCB9CisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciCisJCQkgICJceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzdceDg4XHg5OSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCisJCQkgICJceGY3XHg5Y1x4ODlceDJhXHgzM1x4OGZceDRhXHg4YiIsCisJCS5ybGVuCT0gMTYsCisJCS5ucAk9IDUsCisJCS50YXAJPSB7IDIsIDIsIDIsIDIsIDggfQorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIiwKKwkJLnJsZW4JPSA4LAorCQkubnAJPSA4LAorCQkudGFwCT0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBkZXNfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBGcm9tIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5ICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pbnB1dAk9ICJceGM5XHg1N1x4NDRceDI1XHg2YVx4NWVceGQzXHgxZCIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlNyIsCisJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIFNib3ggdGVzdCBmcm9tIE5CUyAqLworCQkua2V5CT0gIlx4N2NceGExXHgxMFx4NDVceDRhXHgxYVx4NmVceDU3IiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHg2OVx4MGZceDViXHgwZFx4OWFceDI2XHg5M1x4OWIiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHgwMVx4YTFceGQ2XHhkMFx4MzlceDc3XHg2N1x4NDIiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBUd28gYmxvY2tzLCBmb3IgY2h1bmtpbmcgdGVzdCAqLworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHhjOVx4NTdceDQ0XHgyNVx4NmFceDVlXHhkM1x4MWQiCisJCQkgICJceDY5XHgwZlx4NWJceDBkXHg5YVx4MjZceDkzXHg5YiIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZTciCisJCQkgICJceGEzXHg5OVx4N2JceGNhXHhhZlx4NjlceGEwXHhmNSIsCisJCS5ybGVuCT0gMTYsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDgsIDggfQorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4YzlceDU3XHg0NFx4MjVceDZhXHg1ZVx4ZDNceDFkIgorCQkJICAiXHg2OVx4MGZceDViXHgwZFx4OWFceDI2XHg5M1x4OWIiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGU3IgorCQkJICAiXHhhM1x4OTlceDdiXHhjYVx4YWZceDY5XHhhMFx4ZjUiLAorCQkucmxlbgk9IDE2LAorCQkubnAJPSAzLAorCQkudGFwCT0geyAzLCAxMiwgMSB9CisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzX2NiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEZyb20gT3BlblNTTCAqLworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaW5wdXQJPSAiXHgzN1x4MzZceDM1XHgzNFx4MzNceDMyXHgzMVx4MjAiCisJCQkgICJceDRlXHg2Zlx4NzdceDIwXHg2OVx4NzNceDIwXHg3NCIKKwkJCSAgIlx4NjhceDY1XHgyMFx4NzRceDY5XHg2ZFx4NjVceDIwIiwKKwkJLmlsZW4JPSAyNCwKKwkJLnJlc3VsdAk9ICJceGNjXHhkMVx4NzNceGZmXHhhYlx4MjBceDM5XHhmNCIKKwkJCSAgIlx4YWNceGQ4XHhhZVx4ZmRceGRmXHhkOFx4YTFceGViIgorCQkJICAiXHg0Nlx4OGVceDkxXHgxNVx4NzhceDg4XHhiYVx4NjgiLAorCQkucmxlbgk9IDI0LAorCX0sIHsgLyogRklQUyBQdWIgODEgKi8KKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLml2CT0gIlx4MTJceDM0XHg1Nlx4NzhceDkwXHhhYlx4Y2RceGVmIiwKKwkJLmlucHV0CT0gIlx4NGVceDZmXHg3N1x4MjBceDY5XHg3M1x4MjBceDc0IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZTVceGM3XHhjZFx4ZGVceDg3XHgyYlx4ZjJceDdjIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLml2CT0gIlx4ZTVceGM3XHhjZFx4ZGVceDg3XHgyYlx4ZjJceDdjIiwKKwkJLmlucHV0CT0gIlx4NjhceDY1XHgyMFx4NzRceDY5XHg2ZFx4NjVceDIwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NDNceGU5XHgzNFx4MDBceDhjXHgzOFx4OWNceDBmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLml2CT0gIlx4NDNceGU5XHgzNFx4MDBceDhjXHgzOFx4OWNceDBmIiwKKwkJLmlucHV0CT0gIlx4NjZceDZmXHg3Mlx4MjBceDYxXHg2Y1x4NmNceDIwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NjhceDM3XHg4OFx4NDlceDlhXHg3Y1x4MDVceGY2IiwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogQ29weSBvZiBvcGVuc3NsIHZlY3RvciBmb3IgY2h1bmsgdGVzdGluZyAqLworCSAgICAgLyogRnJvbSBPcGVuU1NMICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pdgk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCisJCS5pbnB1dAk9ICJceDM3XHgzNlx4MzVceDM0XHgzM1x4MzJceDMxXHgyMCIKKwkJCSAgIlx4NGVceDZmXHg3N1x4MjBceDY5XHg3M1x4MjBceDc0IgorCQkJICAiXHg2OFx4NjVceDIwXHg3NFx4NjlceDZkXHg2NVx4MjAiLAorCQkuaWxlbgk9IDI0LAorCQkucmVzdWx0CT0gIlx4Y2NceGQxXHg3M1x4ZmZceGFiXHgyMFx4MzlceGY0IgorCQkJICAiXHhhY1x4ZDhceGFlXHhmZFx4ZGZceGQ4XHhhMVx4ZWIiCisJCQkgICJceDQ2XHg4ZVx4OTFceDE1XHg3OFx4ODhceGJhXHg2OCIsCisJCS5ybGVuCT0gMjQsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDEzLCAxMSB9CisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEZJUFMgUHViIDgxICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pdgk9ICJceDEyXHgzNFx4NTZceDc4XHg5MFx4YWJceGNkXHhlZiIsCisJCS5pbnB1dAk9ICJceGU1XHhjN1x4Y2RceGRlXHg4N1x4MmJceGYyXHg3YyIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDRlXHg2Zlx4NzdceDIwXHg2OVx4NzNceDIwXHg3NCIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pdgk9ICJceGU1XHhjN1x4Y2RceGRlXHg4N1x4MmJceGYyXHg3YyIsCisJCS5pbnB1dAk9ICJceDQzXHhlOVx4MzRceDAwXHg4Y1x4MzhceDljXHgwZiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pdgk9ICJceDQzXHhlOVx4MzRceDAwXHg4Y1x4MzhceDljXHgwZiIsCisJCS5pbnB1dAk9ICJceDY4XHgzN1x4ODhceDQ5XHg5YVx4N2NceDA1XHhmNiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDY2XHg2Zlx4NzJceDIwXHg2MVx4NmNceDZjXHgyMCIsCisJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIENvcHkgb2YgYWJvdmUsIGZvciBjaHVuayB0ZXN0aW5nICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pdgk9ICJceDQzXHhlOVx4MzRceDAwXHg4Y1x4MzhceDljXHgwZiIsCisJCS5pbnB1dAk9ICJceDY4XHgzN1x4ODhceDQ5XHg5YVx4N2NceDA1XHhmNiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDY2XHg2Zlx4NzJceDIwXHg2MVx4NmNceDZjXHgyMCIsCisJCS5ybGVuCT0gOCwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgNCwgNCB9CisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgZGVzM19lZGVfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBUaGVzZSBhcmUgZnJvbSBvcGVuc3NsICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCisJCQkgICJceDU1XHg1NVx4NTVceDU1XHg1NVx4NTVceDU1XHg1NSIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0CT0gIlx4NzNceDZmXHg2ZFx4NjVceDY0XHg2MVx4NzRceDYxIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MThceGQ3XHg0OFx4ZTVceDYzXHg2Mlx4MDVceDcyIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAzXHg1Mlx4MDJceDA3XHg2N1x4MjBceDgyXHgxNyIKKwkJCSAgIlx4ODZceDAyXHg4N1x4NjZceDU5XHgwOFx4MjFceDk4IgorCQkJICAiXHg2NFx4MDVceDZhXHhiZFx4ZmVceGE5XHgzNFx4NTciLAorCQkua2xlbgk9IDI0LAorCQkuaW5wdXQJPSAiXHg3M1x4NzFceDc1XHg2OVx4NjdceDY3XHg2Y1x4NjUiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhjMFx4N2RceDJhXHgwZlx4YTVceDY2XHhmYVx4MzAiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MTBceDQ2XHgxMFx4MzRceDg5XHg5OFx4ODBceDIwIgorCQkJICAiXHg5MVx4MDdceGQwXHgxNVx4ODlceDE5XHgwMVx4MDEiCisJCQkgICJceDE5XHgwN1x4OTJceDEwXHg5OFx4MWFceDAxXHgwMSIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceGUxXHhlZlx4NjJceGMzXHgzMlx4ZmVceDgyXHg1YiIsCisJCS5ybGVuCT0gOCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBkZXMzX2VkZV9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIFRoZXNlIGFyZSBmcm9tIG9wZW5zc2wgKi8KKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4NTVceDU1XHg1NVx4NTVceDU1XHg1NVx4NTVceDU1IgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkua2xlbgk9IDI0LAorCQkuaW5wdXQJPSAiXHgxOFx4ZDdceDQ4XHhlNVx4NjNceDYyXHgwNVx4NzIiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHg3M1x4NmZceDZkXHg2NVx4NjRceDYxXHg3NFx4NjEiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MDNceDUyXHgwMlx4MDdceDY3XHgyMFx4ODJceDE3IgorCQkJICAiXHg4Nlx4MDJceDg3XHg2Nlx4NTlceDA4XHgyMVx4OTgiCisJCQkgICJceDY0XHgwNVx4NmFceGJkXHhmZVx4YTlceDM0XHg1NyIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9ICJceGMwXHg3ZFx4MmFceDBmXHhhNVx4NjZceGZhXHgzMCIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDczXHg3MVx4NzVceDY5XHg2N1x4NjdceDZjXHg2NSIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgxMFx4NDZceDEwXHgzNFx4ODlceDk4XHg4MFx4MjAiCisJCQkgICJceDkxXHgwN1x4ZDBceDE1XHg4OVx4MTlceDAxXHgwMSIKKwkJCSAgIlx4MTlceDA3XHg5Mlx4MTBceDk4XHgxYVx4MDFceDAxIiwKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0CT0gIlx4ZTFceGVmXHg2Mlx4YzNceDMyXHhmZVx4ODJceDViIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSA4LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlczNfZWRlX2NiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEdlbmVyYXRlZCBmcm9tIG9wZW5zc2wgKi8KKwkJLmtleQk9ICJceEU5XHhDMFx4RkZceDJFXHg3Nlx4MEJceDY0XHgyNCIKKwkJCSAgIlx4NDRceDREXHg5OVx4NUFceDEyXHhENlx4NDBceEMwIgorCQkJICAiXHhFQVx4QzJceDg0XHhFOFx4MTRceDk1XHhEQlx4RTgiLAorCQkua2xlbgk9IDI0LAorCQkuaXYJPSAiXHg3RFx4MzNceDg4XHg5M1x4MEZceDkzXHhCMlx4NDIiLAorCQkuaW5wdXQJPSAiXHg2Zlx4NTRceDIwXHg2Zlx4NjFceDRkXHg3OVx4NmUiCisJCQkgICJceDUzXHgyMFx4NjNceDY1XHg2NVx4NzJceDczXHg3NCIKKwkJCSAgIlx4NTRceDIwXHg2Zlx4NmZceDRkXHgyMFx4NmVceDYxIgorCQkJICAiXHgyMFx4NzlceDY1XHg1M1x4NzJceDYzXHg3NFx4NjUiCisJCQkgICJceDIwXHg3M1x4NmZceDU0XHgyMFx4NmZceDYxXHg0ZCIKKwkJCSAgIlx4NzlceDZlXHg1M1x4MjBceDYzXHg2NVx4NjVceDcyIgorCQkJICAiXHg3M1x4NzRceDU0XHgyMFx4NmZceDZmXHg0ZFx4MjAiCisJCQkgICJceDZlXHg2MVx4MjBceDc5XHg2NVx4NTNceDcyXHg2MyIKKwkJCSAgIlx4NzRceDY1XHgyMFx4NzNceDZmXHg1NFx4MjBceDZmIgorCQkJICAiXHg2MVx4NGRceDc5XHg2ZVx4NTNceDIwXHg2M1x4NjUiCisJCQkgICJceDY1XHg3Mlx4NzNceDc0XHg1NFx4MjBceDZmXHg2ZiIKKwkJCSAgIlx4NGRceDIwXHg2ZVx4NjFceDIwXHg3OVx4NjVceDUzIgorCQkJICAiXHg3Mlx4NjNceDc0XHg2NVx4MjBceDczXHg2Zlx4NTQiCisJCQkgICJceDIwXHg2Zlx4NjFceDRkXHg3OVx4NmVceDUzXHgyMCIKKwkJCSAgIlx4NjNceDY1XHg2NVx4NzJceDczXHg3NFx4NTRceDIwIgorCQkJICAiXHg2Zlx4NmZceDRkXHgyMFx4NmVceDYxXHgwYVx4NzkiLAorCQkuaWxlbgk9IDEyOCwKKwkJLnJlc3VsdAk9ICJceDBlXHgyZFx4YjZceDk3XHgzY1x4NTZceDMzXHhmNCIKKwkJCSAgIlx4NjdceDE3XHgyMVx4YzdceDZlXHg4YVx4ZDVceDQ5IgorCQkJICAiXHg3NFx4YjNceDQ5XHgwNVx4YzVceDFjXHhkMFx4ZWQiCisJCQkgICJceDEyXHg1Nlx4NWNceDUzXHg5Nlx4YjZceDAwXHg3ZCIKKwkJCSAgIlx4OTBceDQ4XHhmY1x4ZjVceDhkXHgyOVx4MzlceGNjIgorCQkJICAiXHg4YVx4ZDVceDM1XHgxOFx4MzZceDIzXHg0ZVx4ZDciCisJCQkgICJceDc2XHhkMVx4ZGFceDBjXHg5NFx4NjdceGJiXHgwNCIKKwkJCSAgIlx4OGJceGYyXHgwM1x4NmNceGE4XHhjZlx4YjZceGVhIgorCQkJICAiXHgyMlx4NjRceDQ3XHhhYVx4OGZceDc1XHgxM1x4YmYiCisJCQkgICJceDlmXHhjMlx4YzNceGYwXHhjOVx4NTZceGM1XHg3YSIKKwkJCSAgIlx4NzFceDYzXHgyZVx4ODlceDdiXHgxZVx4MTJceGNhIgorCQkJICAiXHhlMlx4NWZceGFmXHhkOFx4YTRceGY4XHhjOVx4N2EiCisJCQkgICJceGQ2XHhmOVx4MjFceDMxXHg2Mlx4NDRceDQ1XHhhNiIKKwkJCSAgIlx4ZDZceGJjXHg1YVx4ZDNceDJkXHg1NFx4NDNceGNjIgorCQkJICAiXHg5ZFx4ZGVceGE1XHg3MFx4ZTlceDQyXHg0NVx4OGEiCisJCQkgICJceDZiXHhmYVx4YjFceDkxXHgxM1x4YjBceGQ5XHgxOSIsCisJCS5ybGVuCT0gMTI4LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGRlczNfZWRlX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEdlbmVyYXRlZCBmcm9tIG9wZW5zc2wgKi8KKwkJLmtleQk9ICJceEU5XHhDMFx4RkZceDJFXHg3Nlx4MEJceDY0XHgyNCIKKwkJCSAgIlx4NDRceDREXHg5OVx4NUFceDEyXHhENlx4NDBceEMwIgorCQkJICAiXHhFQVx4QzJceDg0XHhFOFx4MTRceDk1XHhEQlx4RTgiLAorCQkua2xlbgk9IDI0LAorCQkuaXYJPSAiXHg3RFx4MzNceDg4XHg5M1x4MEZceDkzXHhCMlx4NDIiLAorCQkuaW5wdXQJPSAiXHgwZVx4MmRceGI2XHg5N1x4M2NceDU2XHgzM1x4ZjQiCisJCQkgICJceDY3XHgxN1x4MjFceGM3XHg2ZVx4OGFceGQ1XHg0OSIKKwkJCSAgIlx4NzRceGIzXHg0OVx4MDVceGM1XHgxY1x4ZDBceGVkIgorCQkJICAiXHgxMlx4NTZceDVjXHg1M1x4OTZceGI2XHgwMFx4N2QiCisJCQkgICJceDkwXHg0OFx4ZmNceGY1XHg4ZFx4MjlceDM5XHhjYyIKKwkJCSAgIlx4OGFceGQ1XHgzNVx4MThceDM2XHgyM1x4NGVceGQ3IgorCQkJICAiXHg3Nlx4ZDFceGRhXHgwY1x4OTRceDY3XHhiYlx4MDQiCisJCQkgICJceDhiXHhmMlx4MDNceDZjXHhhOFx4Y2ZceGI2XHhlYSIKKwkJCSAgIlx4MjJceDY0XHg0N1x4YWFceDhmXHg3NVx4MTNceGJmIgorCQkJICAiXHg5Zlx4YzJceGMzXHhmMFx4YzlceDU2XHhjNVx4N2EiCisJCQkgICJceDcxXHg2M1x4MmVceDg5XHg3Ylx4MWVceDEyXHhjYSIKKwkJCSAgIlx4ZTJceDVmXHhhZlx4ZDhceGE0XHhmOFx4YzlceDdhIgorCQkJICAiXHhkNlx4ZjlceDIxXHgzMVx4NjJceDQ0XHg0NVx4YTYiCisJCQkgICJceGQ2XHhiY1x4NWFceGQzXHgyZFx4NTRceDQzXHhjYyIKKwkJCSAgIlx4OWRceGRlXHhhNVx4NzBceGU5XHg0Mlx4NDVceDhhIgorCQkJICAiXHg2Ylx4ZmFceGIxXHg5MVx4MTNceGIwXHhkOVx4MTkiLAorCQkuaWxlbgk9IDEyOCwKKwkJLnJlc3VsdAk9ICJceDZmXHg1NFx4MjBceDZmXHg2MVx4NGRceDc5XHg2ZSIKKwkJCSAgIlx4NTNceDIwXHg2M1x4NjVceDY1XHg3Mlx4NzNceDc0IgorCQkJICAiXHg1NFx4MjBceDZmXHg2Zlx4NGRceDIwXHg2ZVx4NjEiCisJCQkgICJceDIwXHg3OVx4NjVceDUzXHg3Mlx4NjNceDc0XHg2NSIKKwkJCSAgIlx4MjBceDczXHg2Zlx4NTRceDIwXHg2Zlx4NjFceDRkIgorCQkJICAiXHg3OVx4NmVceDUzXHgyMFx4NjNceDY1XHg2NVx4NzIiCisJCQkgICJceDczXHg3NFx4NTRceDIwXHg2Zlx4NmZceDRkXHgyMCIKKwkJCSAgIlx4NmVceDYxXHgyMFx4NzlceDY1XHg1M1x4NzJceDYzIgorCQkJICAiXHg3NFx4NjVceDIwXHg3M1x4NmZceDU0XHgyMFx4NmYiCisJCQkgICJceDYxXHg0ZFx4NzlceDZlXHg1M1x4MjBceDYzXHg2NSIKKwkJCSAgIlx4NjVceDcyXHg3M1x4NzRceDU0XHgyMFx4NmZceDZmIgorCQkJICAiXHg0ZFx4MjBceDZlXHg2MVx4MjBceDc5XHg2NVx4NTMiCisJCQkgICJceDcyXHg2M1x4NzRceDY1XHgyMFx4NzNceDZmXHg1NCIKKwkJCSAgIlx4MjBceDZmXHg2MVx4NGRceDc5XHg2ZVx4NTNceDIwIgorCQkJICAiXHg2M1x4NjVceDY1XHg3Mlx4NzNceDc0XHg1NFx4MjAiCisJCQkgICJceDZmXHg2Zlx4NGRceDIwXHg2ZVx4NjFceDBhXHg3OSIsCisJCS5ybGVuCT0gMTI4LAorCX0sCit9OworCisvKgorICogQmxvd2Zpc2ggdGVzdCB2ZWN0b3JzLgorICovCisjZGVmaW5lIEJGX0VOQ19URVNUX1ZFQ1RPUlMJNgorI2RlZmluZSBCRl9ERUNfVEVTVF9WRUNUT1JTCTYKKyNkZWZpbmUgQkZfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMJMQorI2RlZmluZSBCRl9DQkNfREVDX1RFU1RfVkVDVE9SUwkxCisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBERVMgdGVzdCB2ZWN0b3JzIGZyb20gT3BlblNTTCAqLworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHg0ZVx4ZjlceDk3XHg0NVx4NjFceDk4XHhkZFx4NzgiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MWZceDFmXHgxZlx4MWZceDBlXHgwZVx4MGVceDBlIiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhhN1x4OTBceDc5XHg1MVx4MDhceGVhXHgzY1x4YWUiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IiwKKwkJLmtsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhlOFx4N2FceDI0XHg0ZVx4MmNceGM4XHg1ZVx4ODIiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBWYXJ5IHRoZSBrZXlsZW5ndGguLi4gKi8KKwkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIKKwkJCSAgIlx4NzhceDY5XHg1YVx4NGJceDNjXHgyZFx4MWVceDBmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4OTNceDE0XHgyOFx4ODdceGVlXHgzYlx4ZTFceDVjIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIKKwkJCSAgIlx4NzhceDY5XHg1YVx4NGJceDNjXHgyZFx4MWVceDBmIgorCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDQiLAorCQkua2xlbgk9IDIxLAorCQkuaW5wdXQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhlNlx4ZjVceDFlXHhkN1x4OWJceDlkXHhiMlx4MWYiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBiZjQ4OCAqLworCQkua2V5CT0gIlx4ZjBceGUxXHhkMlx4YzNceGI0XHhhNVx4OTZceDg3IgorCQkJICAiXHg3OFx4NjlceDVhXHg0Ylx4M2NceDJkXHgxZVx4MGYiCisJCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4MDRceDY4XHg5MVx4MDRceGMyXHhmZFx4M2JceDJmIgorCQkJICAiXHg1OFx4NDBceDIzXHg2NFx4MWFceGJhXHg2MVx4NzYiCisJCQkgICJceDFmXHgxZlx4MWZceDFmXHgwZVx4MGVceDBlXHgwZSIKKwkJCSAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwKKwkJLmtsZW4JPSA1NiwKKwkJLmlucHV0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4YzBceDQ1XHgwNFx4MDFceDJlXHg0ZVx4MWZceDUzIiwKKwkJLnJsZW4JPSA4LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGJmX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogREVTIHRlc3QgdmVjdG9ycyBmcm9tIE9wZW5TU0wgKi8KKwkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4NGVceGY5XHg5N1x4NDVceDYxXHg5OFx4ZGRceDc4IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDFmXHgxZlx4MWZceDFmXHgwZVx4MGVceDBlXHgwZSIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4YTdceDkwXHg3OVx4NTFceDA4XHhlYVx4M2NceGFlIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4ZThceDdhXHgyNFx4NGVceDJjXHhjOFx4NWVceDgyIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogVmFyeSB0aGUga2V5bGVuZ3RoLi4uICovCisJCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciCisJCQkgICJceDc4XHg2OVx4NWFceDRiXHgzY1x4MmRceDFlXHgwZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDkzXHgxNFx4MjhceDg3XHhlZVx4M2JceGUxXHg1YyIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciCisJCQkgICJceDc4XHg2OVx4NWFceDRiXHgzY1x4MmRceDFlXHgwZiIKKwkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0IiwKKwkJLmtsZW4JPSAyMSwKKwkJLmlucHV0CT0gIlx4ZTZceGY1XHgxZVx4ZDdceDliXHg5ZFx4YjJceDFmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggYmY0ODgsIHVzaW5nIE9wZW5TU0wsIExpYmdjcnlwdCBhbmQgTmV0dGxlICovCisJCS5rZXkJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciCisJCQkgICJceDc4XHg2OVx4NWFceDRiXHgzY1x4MmRceDFlXHgwZiIKKwkJCSAgIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgorCQkJICAiXHgwNFx4NjhceDkxXHgwNFx4YzJceGZkXHgzYlx4MmYiCisJCQkgICJceDU4XHg0MFx4MjNceDY0XHgxYVx4YmFceDYxXHg3NiIKKwkJCSAgIlx4MWZceDFmXHgxZlx4MWZceDBlXHgwZVx4MGVceDBlIgorCQkJICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLAorCQkua2xlbgk9IDU2LAorCQkuaW5wdXQJPSAiXHhjMFx4NDVceDA0XHgwMVx4MmVceDRlXHgxZlx4NTMiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkucmxlbgk9IDgsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfY2JjX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBPcGVuU1NMICovCisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCisJCQkgICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCisJCS5pbnB1dAk9ICJceDM3XHgzNlx4MzVceDM0XHgzM1x4MzJceDMxXHgyMCIKKwkJCSAgIlx4NGVceDZmXHg3N1x4MjBceDY5XHg3M1x4MjBceDc0IgorCQkJICAiXHg2OFx4NjVceDIwXHg3NFx4NjlceDZkXHg2NVx4MjAiCisJCQkgICJceDY2XHg2Zlx4NzJceDIwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHg2Ylx4NzdceGI0XHhkNlx4MzBceDA2XHhkZVx4ZTYiCisJCQkgICJceDA1XHhiMVx4NTZceGUyXHg3NFx4MDNceDk3XHg5MyIKKwkJCSAgIlx4NThceGRlXHhiOVx4ZTdceDE1XHg0Nlx4MTZceGQ5IgorCQkJICAiXHg1OVx4ZjFceDY1XHgyYlx4ZDVceGZmXHg5Mlx4Y2MiLAorCQkucmxlbgk9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGJmX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEZyb20gT3BlblNTTCAqLworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaW5wdXQJPSAiXHg2Ylx4NzdceGI0XHhkNlx4MzBceDA2XHhkZVx4ZTYiCisJCQkgICJceDA1XHhiMVx4NTZceGUyXHg3NFx4MDNceDk3XHg5MyIKKwkJCSAgIlx4NThceGRlXHhiOVx4ZTdceDE1XHg0Nlx4MTZceGQ5IgorCQkJICAiXHg1OVx4ZjFceDY1XHgyYlx4ZDVceGZmXHg5Mlx4Y2MiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0gIlx4MzdceDM2XHgzNVx4MzRceDMzXHgzMlx4MzFceDIwIgorCQkJICAiXHg0ZVx4NmZceDc3XHgyMFx4NjlceDczXHgyMFx4NzQiCisJCQkgICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIKKwkJCSAgIlx4NjZceDZmXHg3Mlx4MjBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSAzMiwKKwl9LAorfTsKKworLyoKKyAqIFR3b2Zpc2ggdGVzdCB2ZWN0b3JzLgorICovCisjZGVmaW5lIFRGX0VOQ19URVNUX1ZFQ1RPUlMJCTMKKyNkZWZpbmUgVEZfREVDX1RFU1RfVkVDVE9SUwkJMworI2RlZmluZSBURl9DQkNfRU5DX1RFU1RfVkVDVE9SUwkJNAorI2RlZmluZSBURl9DQkNfREVDX1RFU1RfVkVDVE9SUwkJNAorCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRmX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHg5Zlx4NThceDlmXHg1Y1x4ZjZceDEyXHgyY1x4MzIiCisJCQkgICJceGI2XHhiZlx4ZWNceDJmXHgyYVx4ZThceGMzXHg1YSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCisJCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhjZlx4ZDFceGQyXHhlNVx4YTlceGJlXHg5Y1x4ZGYiCisJCQkgICJceDUwXHgxZlx4MTNceGI4XHg5Mlx4YmRceDIyXHg0OCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCisJCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDM3XHg1Mlx4N2JceGUwXHgwNVx4MjNceDM0XHhiOCIKKwkJCSAgIlx4OWZceDBjXHhmY1x4Y2FceGU4XHg3Y1x4ZmFceDIwIiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0Zl9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg5Zlx4NThceDlmXHg1Y1x4ZjZceDEyXHgyY1x4MzIiCisJCQkgICJceGI2XHhiZlx4ZWNceDJmXHgyYVx4ZThceGMzXHg1YSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgorCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciLAorCQkua2xlbgk9IDI0LAorCQkuaW5wdXQJPSAiXHhjZlx4ZDFceGQyXHhlNVx4YTlceGJlXHg5Y1x4ZGYiCisJCQkgICJceDUwXHgxZlx4MTNceGI4XHg5Mlx4YmRceDIyXHg0OCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgorCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCisJCQkgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDM3XHg1Mlx4N2JceGUwXHgwNVx4MjNceDM0XHhiOCIKKwkJCSAgIlx4OWZceDBjXHhmY1x4Y2FceGU4XHg3Y1x4ZmFceDIwIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gMTYsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGZfY2JjX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogR2VuZXJhdGVkIHdpdGggTmV0dGxlICovCisJCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSB6ZXJvZWRfc3RyaW5nLAorCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4OWZceDU4XHg5Zlx4NWNceGY2XHgxMlx4MmNceDMyIgorCQkJICAiXHhiNlx4YmZceGVjXHgyZlx4MmFceGU4XHhjM1x4NWEiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKKwkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIiwKKwkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGQ0XHg5MVx4ZGJceDE2XHhlN1x4YjFceGMzXHg5ZSIKKwkJCSAgIlx4ODZceGNiXHgwOFx4NmJceDc4XHg5Zlx4NTRceDE5IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHhkNFx4OTFceGRiXHgxNlx4ZTdceGIxXHhjM1x4OWUiCisJCQkgICJceDg2XHhjYlx4MDhceDZiXHg3OFx4OWZceDU0XHgxOSIsCisJCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwNVx4ZWZceDhjXHg2MVx4YThceDExXHg1OFx4MjYiCisJCQkgICJceDM0XHhiYVx4NWNceGI3XHgxMFx4NmFceGE2XHg0MSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gemVyb2VkX3N0cmluZywKKwkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKKwkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIgorCQkJICAiXHhkNFx4OTFceGRiXHgxNlx4ZTdceGIxXHhjM1x4OWUiCisJCQkgICJceDg2XHhjYlx4MDhceDZiXHg3OFx4OWZceDU0XHgxOSIKKwkJCSAgIlx4MDVceGVmXHg4Y1x4NjFceGE4XHgxMVx4NThceDI2IgorCQkJICAiXHgzNFx4YmFceDVjXHhiN1x4MTBceDZhXHhhNlx4NDEiLAorCQkucmxlbgk9IDQ4LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRmX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIFJldmVyc2Ugb2YgdGhlIGZpcnN0IGZvdXIgYWJvdmUgKi8KKwkJLmtleQk9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9IHplcm9lZF9zdHJpbmcsCisJCS5pbnB1dAk9ICJceDlmXHg1OFx4OWZceDVjXHhmNlx4MTJceDJjXHgzMiIKKwkJCSAgIlx4YjZceGJmXHhlY1x4MmZceDJhXHhlOFx4YzNceDVhIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4OWZceDU4XHg5Zlx4NWNceGY2XHgxMlx4MmNceDMyIgorCQkJICAiXHhiNlx4YmZceGVjXHgyZlx4MmFceGU4XHhjM1x4NWEiLAorCQkuaW5wdXQJPSAiXHhkNFx4OTFceGRiXHgxNlx4ZTdceGIxXHhjM1x4OWUiCisJCQkgICJceDg2XHhjYlx4MDhceDZiXHg3OFx4OWZceDU0XHgxOSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceGQ0XHg5MVx4ZGJceDE2XHhlN1x4YjFceGMzXHg5ZSIKKwkJCSAgIlx4ODZceGNiXHgwOFx4NmJceDc4XHg5Zlx4NTRceDE5IiwKKwkJLmlucHV0CT0gIlx4MDVceGVmXHg4Y1x4NjFceGE4XHgxMVx4NThceDI2IgorCQkJICAiXHgzNFx4YmFceDVjXHhiN1x4MTBceDZhXHhhNlx4NDEiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSB6ZXJvZWRfc3RyaW5nLAorCQkuaW5wdXQJPSAiXHg5Zlx4NThceDlmXHg1Y1x4ZjZceDEyXHgyY1x4MzIiCisJCQkgICJceGI2XHhiZlx4ZWNceDJmXHgyYVx4ZThceGMzXHg1YSIKKwkJCSAgIlx4ZDRceDkxXHhkYlx4MTZceGU3XHhiMVx4YzNceDllIgorCQkJICAiXHg4Nlx4Y2JceDA4XHg2Ylx4NzhceDlmXHg1NFx4MTkiCisJCQkgICJceDA1XHhlZlx4OGNceDYxXHhhOFx4MTFceDU4XHgyNiIKKwkJCSAgIlx4MzRceGJhXHg1Y1x4YjdceDEwXHg2YVx4YTZceDQxIiwKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gNDgsCisJfSwKK307CisKKy8qCisgKiBTZXJwZW50IHRlc3QgdmVjdG9ycy4gIFRoZXNlIGFyZSBiYWNrd2FyZHMgYmVjYXVzZSBTZXJwZW50IHdyaXRlcworICogb2N0ZXQgc2VxdWVuY2VzIGluIHJpZ2h0LXRvLWxlZnQgbW9kZS4KKyAqLworI2RlZmluZSBTRVJQRU5UX0VOQ19URVNUX1ZFQ1RPUlMJNAorI2RlZmluZSBTRVJQRU5UX0RFQ19URVNUX1ZFQ1RPUlMJNAorCisjZGVmaW5lIFRORVBSRVNfRU5DX1RFU1RfVkVDVE9SUwk0CisjZGVmaW5lIFRORVBSRVNfREVDX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgc2VycGVudF9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDEyXHgwN1x4ZmNceGNlXHg5Ylx4ZDBceGQ2XHg0NyIKKwkJCSAgIlx4NmFceGU5XHg4Zlx4YmVceGQxXHg0M1x4YTBceGUyIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDRjXHg3ZFx4OGFceDMyXHg4MFx4NzJceGEyXHgyYyIKKwkJCSAgIlx4ODJceDNlXHg0YVx4MWZceDNhXHhjZFx4YTFceDZkIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhkZVx4MjZceDlmXHhmOFx4MzNceGU0XHgzMlx4YjgiCisJCQkgICJceDViXHgyZVx4ODhceGQyXHg3MFx4MWNceGU3XHg1YyIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ODAiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB6ZXJvZWRfc3RyaW5nLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4ZGRceGQyXHg2Ylx4OThceGE1XHhmZlx4ZDhceDJjIgorCQkJICAiXHgwNVx4MzRceDVhXHg5ZFx4YWRceGJmXHhhZlx4NDkiLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRuZXByZXNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBLZXlTaXplPTEyOCwgUFQ9MCwgST0xICovCisJCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtleSAgICA9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4gICA9IDE2LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NDlceGFmXHhiZlx4YWRceDlkXHg1YVx4MzRceDA1IgorCQkJICAiXHgyY1x4ZDhceGZmXHhhNVx4OThceDZiXHhkMlx4ZGQiLAorCQkucmxlbgk9IDE2LAorCX0sIHsgLyogS2V5U2l6ZT0xOTIsIFBUPTAsIEk9MSAqLworCQkua2V5CT0gIlx4ODBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGU3XHg4ZVx4NTRceDAyXHhjN1x4MTlceDU1XHg2OCIKKwkJCSAgIlx4YWNceDM2XHg3OFx4ZjdceGEzXHhmNlx4MGNceDY2IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7IC8qIEtleVNpemU9MjU2LCBQVD0wLCBJPTEgKi8KKwkJLmtleQk9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGFiXHhlZFx4OTZceGU3XHg2Nlx4YmZceDI4XHhjYiIKKwkJCSAgIlx4YzBceGViXHhkMlx4MWFceDgyXHhlZlx4MDhceDE5IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7IC8qIEtleVNpemU9MjU2LCBJPTI1NyAqLworCQkua2V5CT0gIlx4MWZceDFlXHgxZFx4MWNceDFiXHgxYVx4MTlceDE4IgorCQkJICAiXHgxN1x4MTZceDE1XHgxNFx4MTNceDEyXHgxMVx4MTAiCisJCQkgICJceDBmXHgwZVx4MGRceDBjXHgwYlx4MGFceDA5XHgwOCIKKwkJCSAgIlx4MDdceDA2XHgwNVx4MDRceDAzXHgwMlx4MDFceDAwIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4MGZceDBlXHgwZFx4MGNceDBiXHgwYVx4MDlceDA4IgorCQkJICAiXHgwN1x4MDZceDA1XHgwNFx4MDNceDAyXHgwMVx4MDAiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NWNceGU3XHgxY1x4NzBceGQyXHg4OFx4MmVceDViIgorCQkJICAiXHhiOFx4MzJceGU0XHgzM1x4ZjhceDlmXHgyNlx4ZGUiLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgc2VycGVudF9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5pbnB1dAk9ICJceDEyXHgwN1x4ZmNceGNlXHg5Ylx4ZDBceGQ2XHg0NyIKKwkJCSAgIlx4NmFceGU5XHg4Zlx4YmVceGQxXHg0M1x4YTBceGUyIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDRjXHg3ZFx4OGFceDMyXHg4MFx4NzJceGEyXHgyYyIKKwkJCSAgIlx4ODJceDNlXHg0YVx4MWZceDNhXHhjZFx4YTFceDZkIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSAiXHhkZVx4MjZceDlmXHhmOFx4MzNceGU0XHgzMlx4YjgiCisJCQkgICJceDViXHgyZVx4ODhceGQyXHg3MFx4MWNceGU3XHg1YyIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ODAiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhkZFx4ZDJceDZiXHg5OFx4YTVceGZmXHhkOFx4MmMiCisJCQkgICJceDA1XHgzNFx4NWFceDlkXHhhZFx4YmZceGFmXHg0OSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRuZXByZXNfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkuaW5wdXQJPSAiXHg0MVx4Y2NceDZiXHgzMVx4NTlceDMxXHg0NVx4OTciCisJCQkgICJceDZkXHg2Zlx4YmJceDM4XHg0Ylx4MzdceDIxXHgyOCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhlYVx4ZjRceGQ3XHhmY1x4ZDhceDAxXHgzNFx4NDciCisJCQkgICJceDgxXHg0NVx4MGJceGZhXHgwY1x4ZDZceGFkXHg2ZSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4NjRceGE5XHgxYVx4MzdceGVkXHg5Zlx4ZTdceDQ5IgorCQkJICAiXHhhOFx4NGVceDc2XHhkNlx4ZjVceDBkXHg3OFx4ZWUiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorCQkucmxlbgk9IDE2LAorCX0sIHsgLyogS2V5U2l6ZT0xMjgsIEk9MTIxICovCisJCS5rZXkJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg4MCIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDNkXHhkYVx4YmZceGMwXHgwNlx4ZGFceGFiXHgwNiIKKwkJCSAgIlx4NDZceDJhXHhmNFx4ZWZceDgxXHg1NFx4NGVceDI2IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gMTYsCisJfSwKK307CisKKworLyogQ2FzdDYgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDI2MTIgKi8KKyNkZWZpbmUgQ0FTVDZfRU5DX1RFU1RfVkVDVE9SUwkzCisjZGVmaW5lIENBU1Q2X0RFQ19URVNUX1ZFQ1RPUlMgIDMKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYXN0Nl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCisJCQkgICJceDBhXHhmN1x4NTZceDQ3XHhmMlx4OWZceDYxXHg1ZCIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhjOFx4NDJceGEwXHg4OVx4NzJceGI0XHgzZFx4MjAiCisJCQkgICJceDgzXHg2Y1x4OTFceGQxXHhiN1x4NTNceDBmXHg2YiIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjNceDQyXHhiYlx4OWVceGZhXHgzOFx4NTRceDJjIgorCQkJICAiXHhiZVx4ZDBceGFjXHg4M1x4OTRceDBhXHhjMlx4OTgiCisJCQkgICJceGJhXHhjN1x4N2FceDc3XHgxN1x4OTRceDI4XHg2MyIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgxYlx4MzhceDZjXHgwMlx4MTBceGRjXHhhZFx4Y2IiCisJCQkgICJceGRkXHgwZVx4NDFceGFhXHgwOFx4YTdceGE3XHhlOCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjNceDQyXHhiYlx4OWVceGZhXHgzOFx4NTRceDJjIgorCQkJICAiXHhiZVx4ZDBceGFjXHg4M1x4OTRceDBhXHhjMlx4OTgiCisJCQkgICJceDhkXHg3Y1x4NDdceGNlXHgyNlx4NDlceDA4XHg0NiIKKwkJCSAgIlx4MWNceGMxXHhiNVx4MTNceDdhXHhlNlx4YjZceDA0IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDRmXHg2YVx4MjBceDM4XHgyOFx4NjhceDk3XHhiOSIKKwkJCSAgIlx4YzlceDg3XHgwMVx4MzZceDU1XHgzM1x4MTdceGZhIiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYXN0Nl9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSAiXHgyM1x4NDJceGJiXHg5ZVx4ZmFceDM4XHg1NFx4MmMiCisJCQkgICJceDBhXHhmN1x4NTZceDQ3XHhmMlx4OWZceDYxXHg1ZCIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGM4XHg0Mlx4YTBceDg5XHg3Mlx4YjRceDNkXHgyMCIKKwkJCSAgIlx4ODNceDZjXHg5MVx4ZDFceGI3XHg1M1x4MGZceDZiIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjNceDQyXHhiYlx4OWVceGZhXHgzOFx4NTRceDJjIgorCQkJICAiXHhiZVx4ZDBceGFjXHg4M1x4OTRceDBhXHhjMlx4OTgiCisJCQkgICJceGJhXHhjN1x4N2FceDc3XHgxN1x4OTRceDI4XHg2MyIsCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9ICJceDFiXHgzOFx4NmNceDAyXHgxMFx4ZGNceGFkXHhjYiIKKwkJCSAgIlx4ZGRceDBlXHg0MVx4YWFceDA4XHhhN1x4YTdceGU4IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjNceDQyXHhiYlx4OWVceGZhXHgzOFx4NTRceDJjIgorCQkJICAiXHhiZVx4ZDBceGFjXHg4M1x4OTRceDBhXHhjMlx4OTgiCisJCQkgICJceDhkXHg3Y1x4NDdceGNlXHgyNlx4NDlceDA4XHg0NiIKKwkJCSAgIlx4MWNceGMxXHhiNVx4MTNceDdhXHhlNlx4YjZceDA0IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4NGZceDZhXHgyMFx4MzhceDI4XHg2OFx4OTdceGI5IgorCQkJICAiXHhjOVx4ODdceDAxXHgzNlx4NTVceDMzXHgxN1x4ZmEiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworCisvKgorICogQUVTIHRlc3QgdmVjdG9ycy4KKyAqLworI2RlZmluZSBBRVNfRU5DX1RFU1RfVkVDVE9SUyAzCisjZGVmaW5lIEFFU19ERUNfVEVTVF9WRUNUT1JTIDMKKyNkZWZpbmUgQUVTX0NCQ19FTkNfVEVTVF9WRUNUT1JTIDQKKyNkZWZpbmUgQUVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTIDQKKyNkZWZpbmUgQUVTX0xSV19FTkNfVEVTVF9WRUNUT1JTIDgKKyNkZWZpbmUgQUVTX0xSV19ERUNfVEVTVF9WRUNUT1JTIDgKKyNkZWZpbmUgQUVTX1hUU19FTkNfVEVTVF9WRUNUT1JTIDQKKyNkZWZpbmUgQUVTX1hUU19ERUNfVEVTVF9WRUNUT1JTIDQKKyNkZWZpbmUgQUVTX0NUUl9FTkNfVEVTVF9WRUNUT1JTIDcKKyNkZWZpbmUgQUVTX0NUUl9ERUNfVEVTVF9WRUNUT1JTIDYKKyNkZWZpbmUgQUVTX0dDTV9FTkNfVEVTVF9WRUNUT1JTIDkKKyNkZWZpbmUgQUVTX0dDTV9ERUNfVEVTVF9WRUNUT1JTIDgKKyNkZWZpbmUgQUVTX0NDTV9FTkNfVEVTVF9WRUNUT1JTIDcKKyNkZWZpbmUgQUVTX0NDTV9ERUNfVEVTVF9WRUNUT1JTIDcKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBGcm9tIEZJUFMtMTk3ICovCisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDY5XHhjNFx4ZTBceGQ4XHg2YVx4N2JceDA0XHgzMCIKKwkJCSAgIlx4ZDhceGNkXHhiN1x4ODBceDcwXHhiNFx4YzVceDVhIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IiwKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgorCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4ZGRceGE5XHg3Y1x4YTRceDg2XHg0Y1x4ZGZceGUwIgorCQkJICAiXHg2ZVx4YWZceDcwXHhhMFx4ZWNceDBkXHg3MVx4OTEiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDhlXHhhMlx4YjdceGNhXHg1MVx4NjdceDQ1XHhiZiIKKwkJCSAgIlx4ZWFceGZjXHg0OVx4OTBceDRiXHg0OVx4NjBceDg5IiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBGcm9tIEZJUFMtMTk3ICovCisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDY5XHhjNFx4ZTBceGQ4XHg2YVx4N2JceDA0XHgzMCIKKwkJCSAgIlx4ZDhceGNkXHhiN1x4ODBceDcwXHhiNFx4YzVceDVhIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IiwKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0CT0gIlx4ZGRceGE5XHg3Y1x4YTRceDg2XHg0Y1x4ZGZceGUwIgorCQkJICAiXHg2ZVx4YWZceDcwXHhhMFx4ZWNceDBkXHg3MVx4OTEiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDBceDExXHgyMlx4MzNceDQ0XHg1NVx4NjZceDc3IgorCQkJICAiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDhlXHhhMlx4YjdceGNhXHg1MVx4NjdceDQ1XHhiZiIKKwkJCSAgIlx4ZWFceGZjXHg0OVx4OTBceDRiXHg0OVx4NjBceDg5IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfY2JjX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBSRkMgMzYwMiAqLworCQkua2V5ICAgID0gIlx4MDZceGE5XHgyMVx4NDBceDM2XHhiOFx4YTFceDViIgorCQkJICAiXHg1MVx4MmVceDAzXHhkNVx4MzRceDEyXHgwMFx4MDYiLAorCQkua2xlbiAgID0gMTYsCisJCS5pdgk9ICJceDNkXHhhZlx4YmFceDQyXHg5ZFx4OWVceGI0XHgzMCIKKwkJCSAgIlx4YjRceDIyXHhkYVx4ODBceDJjXHg5Zlx4YWNceDQxIiwKKwkJLmlucHV0CT0gIlNpbmdsZSBibG9jayBtc2ciLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHhlM1x4NTNceDc3XHg5Y1x4MTBceDc5XHhhZVx4YjgiCisJCQkgICJceDI3XHgwOFx4OTRceDJkXHhiZVx4NzdceDE4XHgxYSIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7CisJCS5rZXkgICAgPSAiXHhjMlx4ODZceDY5XHg2ZFx4ODhceDdjXHg5YVx4YTAiCisJCQkgICJceDYxXHgxYlx4YmJceDNlXHgyMFx4MjVceGE0XHg1YSIsCisJCS5rbGVuICAgPSAxNiwKKwkJLml2ICAgICA9ICJceDU2XHgyZVx4MTdceDk5XHg2ZFx4MDlceDNkXHgyOCIKKwkJCSAgIlx4ZGRceGIzXHhiYVx4NjlceDVhXHgyZVx4NmZceDU4IiwKKwkJLmlucHV0ICA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5pbGVuICAgPSAzMiwKKwkJLnJlc3VsdCA9ICJceGQyXHg5Nlx4Y2RceDk0XHhjMlx4Y2NceGNmXHg4YSIKKwkJCSAgIlx4M2FceDg2XHgzMFx4MjhceGI1XHhlMVx4ZGNceDBhIgorCQkJICAiXHg3NVx4ODZceDYwXHgyZFx4MjVceDNjXHhmZlx4ZjkiCisJCQkgICJceDFiXHg4Mlx4NjZceGJlXHhhNlx4ZDZceDFhXHhiMSIsCisJCS5ybGVuICAgPSAzMiwKKwl9LCB7IC8qIEZyb20gTklTVCBTUDgwMC0zOEEgKi8KKwkJLmtleQk9ICJceDhlXHg3M1x4YjBceGY3XHhkYVx4MGVceDY0XHg1MiIKKwkJCSAgIlx4YzhceDEwXHhmM1x4MmJceDgwXHg5MFx4NzlceGU1IgorCQkJICAiXHg2Mlx4ZjhceGVhXHhkMlx4NTJceDJjXHg2Ylx4N2IiLAorCQkua2xlbgk9IDI0LAorCQkuaXYJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5pbnB1dAk9ICJceDZiXHhjMVx4YmVceGUyXHgyZVx4NDBceDlmXHg5NiIKKwkJCSAgIlx4ZTlceDNkXHg3ZVx4MTFceDczXHg5M1x4MTdceDJhIgorCQkJICAiXHhhZVx4MmRceDhhXHg1N1x4MWVceDAzXHhhY1x4OWMiCisJCQkgICJceDllXHhiN1x4NmZceGFjXHg0NVx4YWZceDhlXHg1MSIKKwkJCSAgIlx4MzBceGM4XHgxY1x4NDZceGEzXHg1Y1x4ZTRceDExIgorCQkJICAiXHhlNVx4ZmJceGMxXHgxOVx4MWFceDBhXHg1Mlx4ZWYiCisJCQkgICJceGY2XHg5Zlx4MjRceDQ1XHhkZlx4NGZceDliXHgxNyIKKwkJCSAgIlx4YWRceDJiXHg0MVx4N2JceGU2XHg2Y1x4MzdceDEwIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceDRmXHgwMlx4MWRceGIyXHg0M1x4YmNceDYzXHgzZCIKKwkJCSAgIlx4NzFceDc4XHgxOFx4M2FceDlmXHhhMFx4NzFceGU4IgorCQkJICAiXHhiNFx4ZDlceGFkXHhhOVx4YWRceDdkXHhlZFx4ZjQiCisJCQkgICJceGU1XHhlN1x4MzhceDc2XHgzZlx4NjlceDE0XHg1YSIKKwkJCSAgIlx4NTdceDFiXHgyNFx4MjBceDEyXHhmYlx4N2FceGUwIgorCQkJICAiXHg3Zlx4YTlceGJhXHhhY1x4M2RceGYxXHgwMlx4ZTAiCisJCQkgICJceDA4XHhiMFx4ZTJceDc5XHg4OFx4NTlceDg4XHg4MSIKKwkJCSAgIlx4ZDlceDIwXHhhOVx4ZTZceDRmXHg1Nlx4MTVceGNkIiwKKwkJLnJsZW4JPSA2NCwKKwl9LCB7CisJCS5rZXkJPSAiXHg2MFx4M2RceGViXHgxMFx4MTVceGNhXHg3MVx4YmUiCisJCQkgICJceDJiXHg3M1x4YWVceGYwXHg4NVx4N2RceDc3XHg4MSIKKwkJCSAgIlx4MWZceDM1XHgyY1x4MDdceDNiXHg2MVx4MDhceGQ3IgorCQkJICAiXHgyZFx4OThceDEwXHhhM1x4MDlceDE0XHhkZlx4ZjQiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisJCS5pbnB1dAk9ICJceDZiXHhjMVx4YmVceGUyXHgyZVx4NDBceDlmXHg5NiIKKwkJCSAgIlx4ZTlceDNkXHg3ZVx4MTFceDczXHg5M1x4MTdceDJhIgorCQkJICAiXHhhZVx4MmRceDhhXHg1N1x4MWVceDAzXHhhY1x4OWMiCisJCQkgICJceDllXHhiN1x4NmZceGFjXHg0NVx4YWZceDhlXHg1MSIKKwkJCSAgIlx4MzBceGM4XHgxY1x4NDZceGEzXHg1Y1x4ZTRceDExIgorCQkJICAiXHhlNVx4ZmJceGMxXHgxOVx4MWFceDBhXHg1Mlx4ZWYiCisJCQkgICJceGY2XHg5Zlx4MjRceDQ1XHhkZlx4NGZceDliXHgxNyIKKwkJCSAgIlx4YWRceDJiXHg0MVx4N2JceGU2XHg2Y1x4MzdceDEwIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceGY1XHg4Y1x4NGNceDA0XHhkNlx4ZTVceGYxXHhiYSIKKwkJCSAgIlx4NzdceDllXHhhYlx4ZmJceDVmXHg3Ylx4ZmJceGQ2IgorCQkJICAiXHg5Y1x4ZmNceDRlXHg5Nlx4N2VceGRiXHg4MFx4OGQiCisJCQkgICJceDY3XHg5Zlx4NzdceDdiXHhjNlx4NzBceDJjXHg3ZCIKKwkJCSAgIlx4MzlceGYyXHgzM1x4NjlceGE5XHhkOVx4YmFceGNmIgorCQkJICAiXHhhNVx4MzBceGUyXHg2M1x4MDRceDIzXHgxNFx4NjEiCisJCQkgICJceGIyXHhlYlx4MDVceGUyXHhjM1x4OWJceGU5XHhmYyIKKwkJCSAgIlx4ZGFceDZjXHgxOVx4MDdceDhjXHg2YVx4OWRceDFiIiwKKwkJLnJsZW4JPSA2NCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfY2JjX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBSRkMgMzYwMiAqLworCQkua2V5ICAgID0gIlx4MDZceGE5XHgyMVx4NDBceDM2XHhiOFx4YTFceDViIgorCQkJICAiXHg1MVx4MmVceDAzXHhkNVx4MzRceDEyXHgwMFx4MDYiLAorCQkua2xlbiAgID0gMTYsCisJCS5pdiAgICAgPSAiXHgzZFx4YWZceGJhXHg0Mlx4OWRceDllXHhiNFx4MzAiCisJCQkgICJceGI0XHgyMlx4ZGFceDgwXHgyY1x4OWZceGFjXHg0MSIsCisJCS5pbnB1dCAgPSAiXHhlM1x4NTNceDc3XHg5Y1x4MTBceDc5XHhhZVx4YjgiCisJCQkgICJceDI3XHgwOFx4OTRceDJkXHhiZVx4NzdceDE4XHgxYSIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJTaW5nbGUgYmxvY2sgbXNnIiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsKKwkJLmtleSAgICA9ICJceGMyXHg4Nlx4NjlceDZkXHg4OFx4N2NceDlhXHhhMCIKKwkJCSAgIlx4NjFceDFiXHhiYlx4M2VceDIwXHgyNVx4YTRceDVhIiwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYgICAgID0gIlx4NTZceDJlXHgxN1x4OTlceDZkXHgwOVx4M2RceDI4IgorCQkJICAiXHhkZFx4YjNceGJhXHg2OVx4NWFceDJlXHg2Zlx4NTgiLAorCQkuaW5wdXQgID0gIlx4ZDJceDk2XHhjZFx4OTRceGMyXHhjY1x4Y2ZceDhhIgorCQkJICAiXHgzYVx4ODZceDMwXHgyOFx4YjVceGUxXHhkY1x4MGEiCisJCQkgICJceDc1XHg4Nlx4NjBceDJkXHgyNVx4M2NceGZmXHhmOSIKKwkJCSAgIlx4MWJceDgyXHg2Nlx4YmVceGE2XHhkNlx4MWFceGIxIiwKKwkJLmlsZW4gICA9IDMyLAorCQkucmVzdWx0ID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKwkJLnJsZW4gICA9IDMyLAorCX0sIHsgLyogRnJvbSBOSVNUIFNQODAwLTM4QSAqLworCQkua2V5CT0gIlx4OGVceDczXHhiMFx4ZjdceGRhXHgwZVx4NjRceDUyIgorCQkJICAiXHhjOFx4MTBceGYzXHgyYlx4ODBceDkwXHg3OVx4ZTUiCisJCQkgICJceDYyXHhmOFx4ZWFceGQyXHg1Mlx4MmNceDZiXHg3YiIsCisJCS5rbGVuCT0gMjQsCisJCS5pdgk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmlucHV0CT0gIlx4NGZceDAyXHgxZFx4YjJceDQzXHhiY1x4NjNceDNkIgorCQkJICAiXHg3MVx4NzhceDE4XHgzYVx4OWZceGEwXHg3MVx4ZTgiCisJCQkgICJceGI0XHhkOVx4YWRceGE5XHhhZFx4N2RceGVkXHhmNCIKKwkJCSAgIlx4ZTVceGU3XHgzOFx4NzZceDNmXHg2OVx4MTRceDVhIgorCQkJICAiXHg1N1x4MWJceDI0XHgyMFx4MTJceGZiXHg3YVx4ZTAiCisJCQkgICJceDdmXHhhOVx4YmFceGFjXHgzZFx4ZjFceDAyXHhlMCIKKwkJCSAgIlx4MDhceGIwXHhlMlx4NzlceDg4XHg1OVx4ODhceDgxIgorCQkJICAiXHhkOVx4MjBceGE5XHhlNlx4NGZceDU2XHgxNVx4Y2QiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2IgorCQkJICAiXHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiCisJCQkgICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5YyIKKwkJCSAgIlx4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIgorCQkJICAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTEiCisJCQkgICJceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIKKwkJCSAgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3IgorCQkJICAiXHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAorCQkucmxlbgk9IDY0LAorCX0sIHsKKwkJLmtleQk9ICJceDYwXHgzZFx4ZWJceDEwXHgxNVx4Y2FceDcxXHhiZSIKKwkJCSAgIlx4MmJceDczXHhhZVx4ZjBceDg1XHg3ZFx4NzdceDgxIgorCQkJICAiXHgxZlx4MzVceDJjXHgwN1x4M2JceDYxXHgwOFx4ZDciCisJCQkgICJceDJkXHg5OFx4MTBceGEzXHgwOVx4MTRceGRmXHhmNCIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmlucHV0CT0gIlx4ZjVceDhjXHg0Y1x4MDRceGQ2XHhlNVx4ZjFceGJhIgorCQkJICAiXHg3N1x4OWVceGFiXHhmYlx4NWZceDdiXHhmYlx4ZDYiCisJCQkgICJceDljXHhmY1x4NGVceDk2XHg3ZVx4ZGJceDgwXHg4ZCIKKwkJCSAgIlx4NjdceDlmXHg3N1x4N2JceGM2XHg3MFx4MmNceDdkIgorCQkJICAiXHgzOVx4ZjJceDMzXHg2OVx4YTlceGQ5XHhiYVx4Y2YiCisJCQkgICJceGE1XHgzMFx4ZTJceDYzXHgwNFx4MjNceDE0XHg2MSIKKwkJCSAgIlx4YjJceGViXHgwNVx4ZTJceGMzXHg5Ylx4ZTlceGZjIgorCQkJICAiXHhkYVx4NmNceDE5XHgwN1x4OGNceDZhXHg5ZFx4MWIiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4NmJceGMxXHhiZVx4ZTJceDJlXHg0MFx4OWZceDk2IgorCQkJICAiXHhlOVx4M2RceDdlXHgxMVx4NzNceDkzXHgxN1x4MmEiCisJCQkgICJceGFlXHgyZFx4OGFceDU3XHgxZVx4MDNceGFjXHg5YyIKKwkJCSAgIlx4OWVceGI3XHg2Zlx4YWNceDQ1XHhhZlx4OGVceDUxIgorCQkJICAiXHgzMFx4YzhceDFjXHg0Nlx4YTNceDVjXHhlNFx4MTEiCisJCQkgICJceGU1XHhmYlx4YzFceDE5XHgxYVx4MGFceDUyXHhlZiIKKwkJCSAgIlx4ZjZceDlmXHgyNFx4NDVceGRmXHg0Zlx4OWJceDE3IgorCQkJICAiXHhhZFx4MmJceDQxXHg3Ylx4ZTZceDZjXHgzN1x4MTAiLAorCQkucmxlbgk9IDY0LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19scndfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJLyogZnJvbSBodHRwOi8vZ3JvdXBlci5pZWVlLm9yZy9ncm91cHMvMTYxOS9lbWFpbC9wZGYwMDAxNy5wZGYgKi8KKwl7IC8qIExSVy0zMi1BRVMgMSAqLworCQkua2V5ICAgID0gIlx4NDVceDYyXHhhY1x4MjVceGY4XHgyOFx4MTdceDZkIgorCQkJICAiXHg0Y1x4MjZceDg0XHgxNFx4YjVceDY4XHgwMVx4ODUiCisJCQkgICJceDI1XHg4ZVx4MmFceDA1XHhlN1x4M2VceDlkXHgwMyIKKwkJCSAgIlx4ZWVceDVhXHg4M1x4MGNceGNjXHgwOVx4NGNceDg3IiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiLAorCQkuaW5wdXQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHhmMVx4YjJceDczXHhjZFx4NjVceGEzXHhkZlx4NWYiCisJCQkgICJceGU5XHg1ZFx4NDhceDkyXHg1NFx4NjNceDRlXHhiOCIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgMiAqLworCQkua2V5ICAgID0gIlx4NTlceDcwXHg0N1x4MTRceGY1XHg1N1x4NDdceDhjIgorCQkJICAiXHhkN1x4NzlceGU4XHgwZlx4NTRceDg4XHg3OVx4NDQiCisJCQkgICJceDBkXHg0OFx4ZjBceGI3XHhiMVx4NWFceDUzXHhlYSIKKwkJCSAgIlx4MWNceGFhXHg2Ylx4MjlceGMyXHhjYVx4ZmJceGFmIiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDIiLAorCQkuaW5wdXQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHgwMFx4YzhceDJiXHhhZVx4OTVceGJiXHhjZFx4ZTUiCisJCQkgICJceDI3XHg0Zlx4MDdceDY5XHhiMlx4NjBceGUxXHgzNiIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgMyAqLworCQkua2V5ICAgID0gIlx4ZDhceDJhXHg5MVx4MzRceGIyXHg2YVx4NTZceDUwIgorCQkJICAiXHgzMFx4ZmVceDY5XHhlMlx4MzdceDdmXHg5OFx4NDciCisJCQkgICJceGNkXHhmOVx4MGJceDE2XHgwY1x4NjRceDhmXHhiNiIKKwkJCSAgIlx4YjBceDBkXHgwZFx4MWJceGFlXHg4NVx4ODdceDFmIiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHg3Nlx4MzJceDIxXHg4M1x4ZWRceDhmXHhmMVx4ODIiCisJCQkgICJceGY5XHg1OVx4NjJceDAzXHg2OVx4MGVceDVlXHgwMSIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgNCAqLworCQkua2V5ICAgID0gIlx4MGZceDZhXHhlZlx4ZjhceGQzXHhkMlx4YmJceDE1IgorCQkJICAiXHgyNVx4ODNceGY3XHgzY1x4MWZceDAxXHgyOFx4NzQiCisJCQkgICJceGNhXHhjNlx4YmNceDM1XHg0ZFx4NGFceDY1XHg1NCIKKwkJCSAgIlx4OTBceGFlXHg2MVx4Y2ZceDdiXHhhZVx4YmRceGNjIgorCQkJICAiXHhhZFx4ZTRceDk0XHhjNVx4NGFceDI5XHhhZVx4NzAiLAorCQkua2xlbiAgID0gNDAsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCisJCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJceDljXHgwZlx4MTVceDJmXHg1NVx4YTJceGQ4XHhmMCIKKwkJCSAgIlx4ZDZceDdiXHg4Zlx4OWVceDI4XHgyMlx4YmNceDQxIiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA1ICovCisJCS5rZXkgICAgPSAiXHg4YVx4ZDRceGVlXHgxMFx4MmZceGJkXHg4MVx4ZmYiCisJCQkgICJceGY4XHg4Nlx4Y2VceGFjXHg5M1x4YzVceGFkXHhjNiIKKwkJCSAgIlx4YTBceDE5XHgwN1x4YzBceDlkXHhmN1x4YmJceGRkIgorCQkJICAiXHg1Mlx4MTNceGIyXHhiN1x4ZjBceGZmXHgxMVx4ZDgiCisJCQkgICJceGQ2XHgwOFx4ZDBceGNkXHgyZVx4YjFceDE3XHg2ZiIsCisJCS5rbGVuICAgPSA0MCwKKwkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0ICA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0gIlx4ZDRceDI3XHg2YVx4N2ZceDE0XHg5MVx4M2RceDY1IgorCQkJICAiXHhjOFx4NjBceDQ4XHgwMlx4ODdceGUzXHgzNFx4MDYiLAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDYgKi8KKwkJLmtleSAgICA9ICJceGY4XHhkNFx4NzZceGZmXHhkNlx4NDZceGVlXHg2YyIKKwkJCSAgIlx4MjNceDg0XHhjYlx4MWNceDc3XHhkNlx4MTlceDVkIgorCQkJICAiXHhmZVx4ZjFceGE5XHhmM1x4N2JceGJjXHg4ZFx4MjEiCisJCQkgICJceGE3XHg5Y1x4MjFceGY4XHhjYlx4OTBceDAyXHg4OSIKKwkJCSAgIlx4YThceDQ1XHgzNFx4OGVceGM4XHhjNVx4YjVceGYxIgorCQkJICAiXHgyNlx4ZjVceDBlXHg3Nlx4ZmVceGZkXHgxYlx4MWUiLAorCQkua2xlbiAgID0gNDgsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCisJCS5pbnB1dCAgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJceGJkXHgwNlx4YjhceGUxXHhkYlx4OThceDg5XHg5ZSIKKwkJCSAgIlx4YzRceDk4XHhlNFx4OTFceGNmXHgxY1x4NzBceDJiIiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA3ICovCisJCS5rZXkgICAgPSAiXHhmYlx4NzZceDE1XHhiMlx4M2RceDgwXHg4OVx4MWQiCisJCQkgICJceGQ0XHg3MFx4OThceDBiXHhjN1x4OTVceDg0XHhjOCIKKwkJCSAgIlx4YjJceGZiXHg2NFx4Y2VceDYwXHg5N1x4ODdceDhkIgorCQkJICAiXHgxN1x4ZmNceGU0XHg1YVx4NDlceGU4XHgzMFx4YjciCisJCQkgICJceDZlXHg3OFx4MTdceGU3XHgyZFx4NWVceDEyXHhkNCIKKwkJCSAgIlx4NjBceDY0XHgwNFx4N2FceGYxXHgyZlx4OWVceDBjIiwKKwkJLmtsZW4gICA9IDQ4LAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHg1Ylx4OTBceDhlXHhjMVx4YWJceGRkXHg2N1x4NWYiCisJCQkgICJceDNkXHg2OVx4OGFceDk1XHg1M1x4YzhceDljXHhlNSIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7CisvKiBodHRwOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vc3Rkcy1wMTYxOUBsaXN0c2Vydi5pZWVlLm9yZy9tc2cwMDE3My5odG1sICovCisJCS5rZXkgICAgPSAiXHhmOFx4ZDRceDc2XHhmZlx4ZDZceDQ2XHhlZVx4NmMiCisJCQkgICJceDIzXHg4NFx4Y2JceDFjXHg3N1x4ZDZceDE5XHg1ZCIKKwkJCSAgIlx4ZmVceGYxXHhhOVx4ZjNceDdiXHhiY1x4OGRceDIxIgorCQkJICAiXHhhN1x4OWNceDIxXHhmOFx4Y2JceDkwXHgwMlx4ODkiCisJCQkgICJceGE4XHg0NVx4MzRceDhlXHhjOFx4YzVceGI1XHhmMSIKKwkJCSAgIlx4MjZceGY1XHgwZVx4NzZceGZlXHhmZFx4MWJceDFlIiwKKwkJLmtsZW4gICA9IDQ4LAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiLAorCQkuaW5wdXQgID0gIlx4MDVceDExXHhiN1x4MThceGFiXHhjNlx4MmRceGFjIgorCQkJICAiXHg3MFx4NWRceGY2XHgyMlx4OTRceGNkXHhlNVx4NmMiCisJCQkgICJceDE3XHg2Ylx4ZjZceDFjXHhmMFx4ZjNceDZlXHhmOCIKKwkJCSAgIlx4NTBceDM4XHgxZlx4NzFceDQ5XHhiNlx4NTdceGQ2IgorCQkJICAiXHg4Zlx4Y2JceDhkXHg2Ylx4ZTNceGE2XHgyOVx4OTAiCisJCQkgICJceGZlXHgyYVx4NjJceDgyXHhhZVx4NmRceDhiXHhmNiIKKwkJCSAgIlx4YWRceDFlXHg5ZVx4MjBceDVmXHgzOFx4YmVceDA0IgorCQkJICAiXHhkYVx4MTBceDhlXHhlZFx4YTJceGE0XHg4N1x4YWIiCisJCQkgICJceGRhXHg2Ylx4YjRceDBjXHg3NVx4YmFceGQzXHg3YyIKKwkJCSAgIlx4YzlceGFjXHg0Mlx4MzFceDk1XHg3Y1x4YzlceDA0IgorCQkJICAiXHhlYlx4ZDVceDZlXHgzMlx4NjlceDhhXHhkYlx4YTYiCisJCQkgICJceDE1XHhkN1x4M2ZceDRmXHgyZlx4NjZceDY5XHgwMyIKKwkJCSAgIlx4OWNceDFmXHg1NFx4MGZceGRlXHgxZlx4ZjNceDY1IgorCQkJICAiXHg0Y1x4OTZceDEyXHhlZFx4N2NceDkyXHgwM1x4MDEiCisJCQkgICJceDZmXHhiY1x4MzVceDkzXHhhY1x4ZjFceDI3XHhmMSIKKwkJCSAgIlx4YjRceDk2XHg4Mlx4NWFceDVmXHhiMFx4YTBceDUwIgorCQkJICAiXHg4OVx4YTRceDhlXHg2Nlx4NDRceDg1XHhjY1x4ZmQiCisJCQkgICJceDMzXHgxNFx4NzBceGUzXHg5Nlx4YjJceGMzXHhkMyIKKwkJCSAgIlx4YmJceDU0XHg1YVx4MWFceGY5XHg3NFx4YTJceGM1IgorCQkJICAiXHgyZFx4NjRceDc1XHhkZFx4YjRceDU0XHhlNlx4NzQiCisJCQkgICJceDhjXHhkM1x4OWRceDllXHg4Nlx4YWJceDUxXHg1MyIKKwkJCSAgIlx4YjdceDkzXHgzZVx4NmZceGQwXHg0ZVx4MmNceDQwIgorCQkJICAiXHhmNlx4YThceDJlXHgzZVx4OWRceGY0XHg2Nlx4YTUiCisJCQkgICJceDc2XHgxMlx4NzNceDQ0XHgxYVx4NTZceGQ3XHg3MiIKKwkJCSAgIlx4ODhceGNkXHgyMVx4OGNceDRjXHgwZlx4ZmVceGRhIgorCQkJICAiXHg5NVx4ZTBceDNhXHhhNlx4YTVceDg0XHg0Nlx4Y2QiCisJCQkgICJceGQ1XHgzZVx4OWRceDNhXHhlMlx4NjdceGU2XHg2MCIKKwkJCSAgIlx4MWFceGUyXHg3MFx4ODVceDU4XHhjMlx4MWJceDA5IgorCQkJICAiXHhlMVx4ZDdceDJjXHhjYVx4YWRceGE4XHg4Zlx4ZjkiCisJCQkgICJceGFjXHhiM1x4MGVceGRiXHhjYVx4MmVceGUyXHhiOCIKKwkJCSAgIlx4NTFceDcxXHhkOVx4M2NceDZjXHhmMVx4NTZceGY4IgorCQkJICAiXHhlYVx4OWNceGYxXHhmYlx4MGNceGU2XHhiN1x4MTAiCisJCQkgICJceDFjXHhmOFx4YTlceDdjXHhlOFx4NTNceDM1XHhjMSIKKwkJCSAgIlx4OTBceDNlXHg3Nlx4NGFceDc0XHhhNFx4MjFceDJjIgorCQkJICAiXHhmNlx4MmNceDRlXHgwZlx4OTRceDNhXHg4OFx4MmUiCisJCQkgICJceDQxXHgwOVx4NmFceDMzXHg3ZFx4ZjZceGRkXHgzZiIKKwkJCSAgIlx4OGRceDIzXHgzMVx4NzRceDg0XHhlYlx4ODhceDZlIgorCQkJICAiXHhjY1x4YjlceGJjXHgyMlx4ODNceDE5XHgwN1x4MjIiCisJCQkgICJceGE1XHgyZFx4ZGZceGE1XHhmM1x4ODBceDg1XHg3OCIKKwkJCSAgIlx4ODRceDM5XHg2YVx4NmRceDZhXHg5OVx4NGZceGE1IgorCQkJICAiXHgxNVx4ZmVceDQ2XHhiMFx4ZTRceDZjXHhhNVx4NDEiCisJCQkgICJceDNjXHhjZVx4OGZceDQyXHg2MFx4NzFceGE3XHg3NSIKKwkJCSAgIlx4MDhceDQwXHg2NVx4OGFceDgyXHhiZlx4ZjVceDQzIgorCQkJICAiXHg3MVx4OTZceGE5XHg0ZFx4NDRceDhhXHgyMFx4YmUiCisJCQkgICJceGZhXHg0ZFx4YmJceGMwXHg3ZFx4MzFceDk2XHg2NSIKKwkJCSAgIlx4ZTdceDc1XHhlNVx4M2VceGZkXHg5Mlx4M2JceGM5IgorCQkJICAiXHg1NVx4YmJceDE2XHg3ZVx4ZjdceGMyXHg4Y1x4YTQiCisJCQkgICJceDQwXHgxZFx4ZTVceGVmXHgwZVx4ZGZceGU0XHg5YSIKKwkJCSAgIlx4NjJceDczXHg2NVx4ZmRceDQ2XHg2M1x4MjVceDNkIgorCQkJICAiXHgyYlx4YWZceGU1XHg2NFx4ZmVceGE1XHg1Y1x4Y2YiCisJCQkgICJceDI0XHhmM1x4YjRceGFjXHg2NFx4YmFceGRmXHg0YiIKKwkJCSAgIlx4YzZceDk2XHg3ZFx4ODFceDJkXHg4ZFx4OTdceGY3IgorCQkJICAiXHhjNVx4NjhceDc3XHg4NFx4MzJceDJiXHhjY1x4ODUiCisJCQkgICJceDc0XHg5Nlx4ZjBceDEyXHg3N1x4NjFceGI5XHhlYiIKKwkJCSAgIlx4NzFceGFhXHg4Mlx4Y2JceDFjXHhkYlx4ODlceGM4IgorCQkJICAiXHhjNlx4YjVceGUzXHg1Y1x4N2RceDM5XHgwN1x4MjQiCisJCQkgICJceGRhXHgzOVx4ODdceDQ1XHhjMFx4MmJceGJiXHgwMSIKKwkJCSAgIlx4YWNceGJjXHgyYVx4NWNceDdmXHhmY1x4ZThceGNlIgorCQkJICAiXHg2ZFx4OWNceDZmXHhlZFx4ZDNceGMxXHhhMVx4ZDYiCisJCQkgICJceGM1XHg1NVx4YTlceDY2XHgyZlx4ZTFceGM4XHgzMiIKKwkJCSAgIlx4YTZceDVkXHhhNFx4M2FceDk4XHg3M1x4ZThceDQ1IgorCQkJICAiXHhhNFx4YzdceGE4XHhiNFx4ZjZceDEzXHgwM1x4ZjYiCisJCQkgICJceGU5XHgyZVx4YzRceDI5XHgwZlx4ODRceGRiXHhjNCIKKwkJCSAgIlx4MjFceGM0XHhjMlx4NzVceDY3XHg4OVx4MzdceDBhIiwKKwkJLmlsZW4gICA9IDUxMiwKKwkJLnJlc3VsdCA9ICJceDFhXHgxZFx4YTlceDMwXHhhZFx4ZjlceDJmXHg5YiIKKwkJCSAgIlx4YjZceDFkXHhhZVx4ZWZceGYwXHgyZlx4ZjhceDVhIgorCQkJICAiXHgzOVx4M2NceGJmXHgyYVx4YjJceDQ1XHhiMlx4MjMiCisJCQkgICJceDFiXHg2M1x4M2NceGNmXHhhYVx4YmVceGNmXHg0ZSIKKwkJCSAgIlx4ZmFceGU4XHgyOVx4YzJceDIwXHg2OFx4MmJceDNjIgorCQkJICAiXHgyZVx4OGJceGY3XHg2ZVx4MjVceGJkXHhlM1x4M2QiCisJCQkgICJceDY2XHgyN1x4ZDZceGFmXHhkNlx4NjRceDNlXHhlMyIKKwkJCSAgIlx4ZThceDU4XHg0Nlx4OTdceDM5XHg1MVx4MDdceGRlIgorCQkJICAiXHhjYlx4MzdceGJjXHhhOVx4YzBceDVmXHg3NVx4YzMiCisJCQkgICJceDBlXHg4NFx4MjNceDFkXHgxNlx4ZDRceDFjXHg1OSIKKwkJCSAgIlx4OWNceDFhXHgwMlx4NTVceGFiXHgzYVx4OTdceDFkIgorCQkJICAiXHhkZlx4ZGRceGM3XHgwNlx4NTFceGQ3XHg3MFx4YWUiCisJCQkgICJceDIzXHhjNlx4OGNceGY1XHgxZVx4YTBceGU1XHg4MiIKKwkJCSAgIlx4YjhceGIyXHhiZlx4MDRceGEwXHgzMlx4OGVceDY4IgorCQkJICAiXHhlYlx4YWZceDZlXHgyZFx4OTRceDIyXHgyZlx4Y2UiCisJCQkgICJceDRjXHhiNVx4NTlceGUyXHhhMlx4MmZceGEwXHg5OCIKKwkJCSAgIlx4MWFceDk3XHhjNlx4ZDRceGI1XHgwMFx4NTlceGYyIgorCQkJICAiXHg4NFx4MTRceDcyXHhiMVx4OWFceDZlXHhhM1x4N2YiCisJCQkgICJceGVhXHgyMFx4ZTdceGNiXHg2NVx4NzdceDNhXHhkZiIKKwkJCSAgIlx4YzhceDk3XHg2N1x4MTVceGMyXHgyYVx4MjdceGNjIgorCQkJICAiXHgxOFx4NTVceGExXHgyNFx4MGJceDI0XHgyNFx4YWYiCisJCQkgICJceDViXHhlY1x4NjhceGI4XHhjOFx4ZjVceGJhXHg2MyIKKwkJCSAgIlx4ZmZceGVkXHg4OVx4Y2VceGQ1XHgzZFx4ODhceGYzIgorCQkJICAiXHgyNVx4ZWZceDA1XHg3Y1x4M2FceGVmXHhlYlx4ZDgiCisJCQkgICJceDdhXHgzMlx4MGRceGQxXHgxZVx4NThceDU5XHg5OSIKKwkJCSAgIlx4OTBceDI1XHhiNVx4MjZceGIwXHhlM1x4MmJceDZjIgorCQkJICAiXHg0Y1x4YTlceDhiXHg4NFx4NGZceDVlXHgwMVx4NTAiCisJCQkgICJceDQxXHgzMFx4NThceGM1XHg2Mlx4NzRceDUyXHgxZCIKKwkJCSAgIlx4NDVceDI0XHg2YVx4NDJceDY0XHg0Zlx4OTdceDFjIgorCQkJICAiXHhhOFx4NjZceGI1XHg2ZFx4NzlceGQ0XHgwZFx4NDgiCisJCQkgICJceGM1XHg1Zlx4ZjNceDkwXHgzMlx4ZGRceGRkXHhlMSIKKwkJCSAgIlx4ZTRceGE5XHg5Zlx4ZmNceGMzXHg1Mlx4NWFceDQ2IgorCQkJICAiXHhlNFx4ODFceDg0XHg5NVx4MzZceDU5XHg3YVx4NmIiCisJCQkgICJceGFhXHhiM1x4NjBceGFkXHhjZVx4OWZceDlmXHgyOCIKKwkJCSAgIlx4ZTBceDAxXHg3NVx4MjJceGM0XHg0ZVx4YTlceDYyIgorCQkJICAiXHg1Y1x4NjJceDBkXHgwMFx4Y2JceDEzXHhlOFx4NDMiCisJCQkgICJceDcyXHhkNFx4MmRceDUzXHg0Nlx4YjVceGQxXHgxNiIKKwkJCSAgIlx4MjJceDE4XHhkZlx4MzRceDMzXHhmNVx4ZDZceDFjIgorCQkJICAiXHhiOFx4NzlceDc4XHg5N1x4OTRceGZmXHg3Mlx4MTMiCisJCQkgICJceDRjXHgyN1x4ZmNceGNiXHhiZlx4MDFceDUzXHhhNiIKKwkJCSAgIlx4YjRceDUwXHg2ZVx4ZGVceGRmXHhiNVx4NDNceGE0IgorCQkJICAiXHg1OVx4ZGZceDUyXHhmOVx4N2NceGUwXHgxMVx4NmYiCisJCQkgICJceDJkXHgxNFx4OGVceDI0XHg2MVx4MmNceGUxXHgxNyIKKwkJCSAgIlx4Y2NceGNlXHg1MVx4MGNceDE5XHg4YVx4ODJceDMwIgorCQkJICAiXHg5NFx4ZDVceDNkXHg2YVx4NTNceDA2XHg1ZVx4YmQiCisJCQkgICJceGI3XHhlYlx4ZmFceGZkXHgyN1x4NTFceGRlXHg4NSIKKwkJCSAgIlx4MWVceDg2XHg1M1x4MTFceDUzXHg5NFx4MDBceGVlIgorCQkJICAiXHgyYlx4OGNceDA4XHgyYVx4YmZceGRkXHhhZVx4MTEiCisJCQkgICJceGNiXHgxZVx4YTJceDA3XHg5YVx4ODBceGNmXHg2MiIKKwkJCSAgIlx4OWJceDA5XHhkY1x4OTVceDNjXHg5Nlx4OGVceGIxIgorCQkJICAiXHgwOVx4YmRceGU0XHhlYlx4ZGJceGNhXHg3MFx4N2EiCisJCQkgICJceDllXHhmYVx4MzFceDE4XHg0NVx4M2NceDIxXHgzMyIKKwkJCSAgIlx4YjBceGIzXHgyYlx4ZWFceGYzXHg3MVx4MmRceGUxIgorCQkJICAiXHgwM1x4YWRceDFiXHg0OFx4ZDRceDY3XHgyN1x4ZjAiCisJCQkgICJceDYyXHhlNFx4M2RceGZiXHg5Ylx4MDhceDc2XHhlNyIKKwkJCSAgIlx4ZGRceDJiXHgwMVx4MzlceDA0XHg1YVx4NThceDdhIgorCQkJICAiXHhmN1x4MTFceDkwXHhlY1x4YmRceDUxXHg1Y1x4MzIiCisJCQkgICJceDZiXHhkN1x4MzVceDM5XHgwMlx4NmJceGYyXHhhNiIKKwkJCSAgIlx4ZDBceDBkXHgwN1x4ZTFceDA2XHhjNFx4NWJceDdkIgorCQkJICAiXHhlNFx4NmFceGQ3XHhlZVx4MTVceDFmXHg4M1x4YjQiCisJCQkgICJceGEzXHhhN1x4NWVceGMzXHg5MFx4YjdceGVmXHhkMyIKKwkJCSAgIlx4YjdceDRmXHhmOFx4OTJceDRjXHhiN1x4M2NceDI5IgorCQkJICAiXHhjZFx4N2VceDJiXHg1ZFx4NDNceGVhXHg0Mlx4ZTciCisJCQkgICJceDc0XHgzZlx4N2RceDU4XHg4OFx4NzVceGRlXHgzZSIsCisJCS5ybGVuICAgPSA1MTIsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfbHJ3X2RlY190dl90ZW1wbGF0ZVtdID0geworCS8qIGZyb20gaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzE2MTkvZW1haWwvcGRmMDAwMTcucGRmICovCisJLyogc2FtZSBhcyBlbmMgdmVjdG9ycyB3aXRoIGlucHV0IGFuZCByZXN1bHQgcmV2ZXJzZWQgKi8KKwl7IC8qIExSVy0zMi1BRVMgMSAqLworCQkua2V5ICAgID0gIlx4NDVceDYyXHhhY1x4MjVceGY4XHgyOFx4MTdceDZkIgorCQkJICAiXHg0Y1x4MjZceDg0XHgxNFx4YjVceDY4XHgwMVx4ODUiCisJCQkgICJceDI1XHg4ZVx4MmFceDA1XHhlN1x4M2VceDlkXHgwMyIKKwkJCSAgIlx4ZWVceDVhXHg4M1x4MGNceGNjXHgwOVx4NGNceDg3IiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiLAorCQkuaW5wdXQgID0gIlx4ZjFceGIyXHg3M1x4Y2RceDY1XHhhM1x4ZGZceDVmIgorCQkJICAiXHhlOVx4NWRceDQ4XHg5Mlx4NTRceDYzXHg0ZVx4YjgiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgMiAqLworCQkua2V5ICAgID0gIlx4NTlceDcwXHg0N1x4MTRceGY1XHg1N1x4NDdceDhjIgorCQkJICAiXHhkN1x4NzlceGU4XHgwZlx4NTRceDg4XHg3OVx4NDQiCisJCQkgICJceDBkXHg0OFx4ZjBceGI3XHhiMVx4NWFceDUzXHhlYSIKKwkJCSAgIlx4MWNceGFhXHg2Ylx4MjlceGMyXHhjYVx4ZmJceGFmIiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDIiLAorCQkuaW5wdXQgID0gIlx4MDBceGM4XHgyYlx4YWVceDk1XHhiYlx4Y2RceGU1IgorCQkJICAiXHgyN1x4NGZceDA3XHg2OVx4YjJceDYwXHhlMVx4MzYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyAzICovCisJCS5rZXkgICAgPSAiXHhkOFx4MmFceDkxXHgzNFx4YjJceDZhXHg1Nlx4NTAiCisJCQkgICJceDMwXHhmZVx4NjlceGUyXHgzN1x4N2ZceDk4XHg0NyIKKwkJCSAgIlx4Y2RceGY5XHgwYlx4MTZceDBjXHg2NFx4OGZceGI2IgorCQkJICAiXHhiMFx4MGRceDBkXHgxYlx4YWVceDg1XHg4N1x4MWYiLAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCAgPSAiXHg3Nlx4MzJceDIxXHg4M1x4ZWRceDhmXHhmMVx4ODIiCisJCQkgICJceGY5XHg1OVx4NjJceDAzXHg2OVx4MGVceDVlXHgwMSIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA0ICovCisJCS5rZXkgICAgPSAiXHgwZlx4NmFceGVmXHhmOFx4ZDNceGQyXHhiYlx4MTUiCisJCQkgICJceDI1XHg4M1x4ZjdceDNjXHgxZlx4MDFceDI4XHg3NCIKKwkJCSAgIlx4Y2FceGM2XHhiY1x4MzVceDRkXHg0YVx4NjVceDU0IgorCQkJICAiXHg5MFx4YWVceDYxXHhjZlx4N2JceGFlXHhiZFx4Y2MiCisJCQkgICJceGFkXHhlNFx4OTRceGM1XHg0YVx4MjlceGFlXHg3MCIsCisJCS5rbGVuICAgPSA0MCwKKwkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIiwKKwkJLmlucHV0ICA9ICJceDljXHgwZlx4MTVceDJmXHg1NVx4YTJceGQ4XHhmMCIKKwkJCSAgIlx4ZDZceDdiXHg4Zlx4OWVceDI4XHgyMlx4YmNceDQxIiwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDUgKi8KKwkJLmtleSAgICA9ICJceDhhXHhkNFx4ZWVceDEwXHgyZlx4YmRceDgxXHhmZiIKKwkJCSAgIlx4ZjhceDg2XHhjZVx4YWNceDkzXHhjNVx4YWRceGM2IgorCQkJICAiXHhhMFx4MTlceDA3XHhjMFx4OWRceGY3XHhiYlx4ZGQiCisJCQkgICJceDUyXHgxM1x4YjJceGI3XHhmMFx4ZmZceDExXHhkOCIKKwkJCSAgIlx4ZDZceDA4XHhkMFx4Y2RceDJlXHhiMVx4MTdceDZmIiwKKwkJLmtsZW4gICA9IDQwLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgID0gIlx4ZDRceDI3XHg2YVx4N2ZceDE0XHg5MVx4M2RceDY1IgorCQkJICAiXHhjOFx4NjBceDQ4XHgwMlx4ODdceGUzXHgzNFx4MDYiLAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSAiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkgICJceDM4XHgzOVx4NDFceDQyXHg0M1x4NDRceDQ1XHg0NiIsCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgNiAqLworCQkua2V5ICAgID0gIlx4ZjhceGQ0XHg3Nlx4ZmZceGQ2XHg0Nlx4ZWVceDZjIgorCQkJICAiXHgyM1x4ODRceGNiXHgxY1x4NzdceGQ2XHgxOVx4NWQiCisJCQkgICJceGZlXHhmMVx4YTlceGYzXHg3Ylx4YmNceDhkXHgyMSIKKwkJCSAgIlx4YTdceDljXHgyMVx4ZjhceGNiXHg5MFx4MDJceDg5IgorCQkJICAiXHhhOFx4NDVceDM0XHg4ZVx4YzhceGM1XHhiNVx4ZjEiCisJCQkgICJceDI2XHhmNVx4MGVceDc2XHhmZVx4ZmRceDFiXHgxZSIsCisJCS5rbGVuICAgPSA0OCwKKwkJLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIiwKKwkJLmlucHV0ICA9ICJceGJkXHgwNlx4YjhceGUxXHhkYlx4OThceDg5XHg5ZSIKKwkJCSAgIlx4YzRceDk4XHhlNFx4OTFceGNmXHgxY1x4NzBceDJiIiwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0gIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDYiLAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDcgKi8KKwkJLmtleSAgICA9ICJceGZiXHg3Nlx4MTVceGIyXHgzZFx4ODBceDg5XHgxZCIKKwkJCSAgIlx4ZDRceDcwXHg5OFx4MGJceGM3XHg5NVx4ODRceGM4IgorCQkJICAiXHhiMlx4ZmJceDY0XHhjZVx4NjBceDk3XHg4N1x4OGQiCisJCQkgICJceDE3XHhmY1x4ZTRceDVhXHg0OVx4ZThceDMwXHhiNyIKKwkJCSAgIlx4NmVceDc4XHgxN1x4ZTdceDJkXHg1ZVx4MTJceGQ0IgorCQkJICAiXHg2MFx4NjRceDA0XHg3YVx4ZjFceDJmXHg5ZVx4MGMiLAorCQkua2xlbiAgID0gNDgsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCAgPSAiXHg1Ylx4OTBceDhlXHhjMVx4YWJceGRkXHg2N1x4NWYiCisJCQkgICJceDNkXHg2OVx4OGFceDk1XHg1M1x4YzhceDljXHhlNSIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2IiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsKKy8qIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9zdGRzLXAxNjE5QGxpc3RzZXJ2LmllZWUub3JnL21zZzAwMTczLmh0bWwgKi8KKwkJLmtleSAgICA9ICJceGY4XHhkNFx4NzZceGZmXHhkNlx4NDZceGVlXHg2YyIKKwkJCSAgIlx4MjNceDg0XHhjYlx4MWNceDc3XHhkNlx4MTlceDVkIgorCQkJICAiXHhmZVx4ZjFceGE5XHhmM1x4N2JceGJjXHg4ZFx4MjEiCisJCQkgICJceGE3XHg5Y1x4MjFceGY4XHhjYlx4OTBceDAyXHg4OSIKKwkJCSAgIlx4YThceDQ1XHgzNFx4OGVceGM4XHhjNVx4YjVceGYxIgorCQkJICAiXHgyNlx4ZjVceDBlXHg3Nlx4ZmVceGZkXHgxYlx4MWUiLAorCQkua2xlbiAgID0gNDgsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIsCisJCS5pbnB1dAk9ICJceDFhXHgxZFx4YTlceDMwXHhhZFx4ZjlceDJmXHg5YiIKKwkJCSAgIlx4YjZceDFkXHhhZVx4ZWZceGYwXHgyZlx4ZjhceDVhIgorCQkJICAiXHgzOVx4M2NceGJmXHgyYVx4YjJceDQ1XHhiMlx4MjMiCisJCQkgICJceDFiXHg2M1x4M2NceGNmXHhhYVx4YmVceGNmXHg0ZSIKKwkJCSAgIlx4ZmFceGU4XHgyOVx4YzJceDIwXHg2OFx4MmJceDNjIgorCQkJICAiXHgyZVx4OGJceGY3XHg2ZVx4MjVceGJkXHhlM1x4M2QiCisJCQkgICJceDY2XHgyN1x4ZDZceGFmXHhkNlx4NjRceDNlXHhlMyIKKwkJCSAgIlx4ZThceDU4XHg0Nlx4OTdceDM5XHg1MVx4MDdceGRlIgorCQkJICAiXHhjYlx4MzdceGJjXHhhOVx4YzBceDVmXHg3NVx4YzMiCisJCQkgICJceDBlXHg4NFx4MjNceDFkXHgxNlx4ZDRceDFjXHg1OSIKKwkJCSAgIlx4OWNceDFhXHgwMlx4NTVceGFiXHgzYVx4OTdceDFkIgorCQkJICAiXHhkZlx4ZGRceGM3XHgwNlx4NTFceGQ3XHg3MFx4YWUiCisJCQkgICJceDIzXHhjNlx4OGNceGY1XHgxZVx4YTBceGU1XHg4MiIKKwkJCSAgIlx4YjhceGIyXHhiZlx4MDRceGEwXHgzMlx4OGVceDY4IgorCQkJICAiXHhlYlx4YWZceDZlXHgyZFx4OTRceDIyXHgyZlx4Y2UiCisJCQkgICJceDRjXHhiNVx4NTlceGUyXHhhMlx4MmZceGEwXHg5OCIKKwkJCSAgIlx4MWFceDk3XHhjNlx4ZDRceGI1XHgwMFx4NTlceGYyIgorCQkJICAiXHg4NFx4MTRceDcyXHhiMVx4OWFceDZlXHhhM1x4N2YiCisJCQkgICJceGVhXHgyMFx4ZTdceGNiXHg2NVx4NzdceDNhXHhkZiIKKwkJCSAgIlx4YzhceDk3XHg2N1x4MTVceGMyXHgyYVx4MjdceGNjIgorCQkJICAiXHgxOFx4NTVceGExXHgyNFx4MGJceDI0XHgyNFx4YWYiCisJCQkgICJceDViXHhlY1x4NjhceGI4XHhjOFx4ZjVceGJhXHg2MyIKKwkJCSAgIlx4ZmZceGVkXHg4OVx4Y2VceGQ1XHgzZFx4ODhceGYzIgorCQkJICAiXHgyNVx4ZWZceDA1XHg3Y1x4M2FceGVmXHhlYlx4ZDgiCisJCQkgICJceDdhXHgzMlx4MGRceGQxXHgxZVx4NThceDU5XHg5OSIKKwkJCSAgIlx4OTBceDI1XHhiNVx4MjZceGIwXHhlM1x4MmJceDZjIgorCQkJICAiXHg0Y1x4YTlceDhiXHg4NFx4NGZceDVlXHgwMVx4NTAiCisJCQkgICJceDQxXHgzMFx4NThceGM1XHg2Mlx4NzRceDUyXHgxZCIKKwkJCSAgIlx4NDVceDI0XHg2YVx4NDJceDY0XHg0Zlx4OTdceDFjIgorCQkJICAiXHhhOFx4NjZceGI1XHg2ZFx4NzlceGQ0XHgwZFx4NDgiCisJCQkgICJceGM1XHg1Zlx4ZjNceDkwXHgzMlx4ZGRceGRkXHhlMSIKKwkJCSAgIlx4ZTRceGE5XHg5Zlx4ZmNceGMzXHg1Mlx4NWFceDQ2IgorCQkJICAiXHhlNFx4ODFceDg0XHg5NVx4MzZceDU5XHg3YVx4NmIiCisJCQkgICJceGFhXHhiM1x4NjBceGFkXHhjZVx4OWZceDlmXHgyOCIKKwkJCSAgIlx4ZTBceDAxXHg3NVx4MjJceGM0XHg0ZVx4YTlceDYyIgorCQkJICAiXHg1Y1x4NjJceDBkXHgwMFx4Y2JceDEzXHhlOFx4NDMiCisJCQkgICJceDcyXHhkNFx4MmRceDUzXHg0Nlx4YjVceGQxXHgxNiIKKwkJCSAgIlx4MjJceDE4XHhkZlx4MzRceDMzXHhmNVx4ZDZceDFjIgorCQkJICAiXHhiOFx4NzlceDc4XHg5N1x4OTRceGZmXHg3Mlx4MTMiCisJCQkgICJceDRjXHgyN1x4ZmNceGNiXHhiZlx4MDFceDUzXHhhNiIKKwkJCSAgIlx4YjRceDUwXHg2ZVx4ZGVceGRmXHhiNVx4NDNceGE0IgorCQkJICAiXHg1OVx4ZGZceDUyXHhmOVx4N2NceGUwXHgxMVx4NmYiCisJCQkgICJceDJkXHgxNFx4OGVceDI0XHg2MVx4MmNceGUxXHgxNyIKKwkJCSAgIlx4Y2NceGNlXHg1MVx4MGNceDE5XHg4YVx4ODJceDMwIgorCQkJICAiXHg5NFx4ZDVceDNkXHg2YVx4NTNceDA2XHg1ZVx4YmQiCisJCQkgICJceGI3XHhlYlx4ZmFceGZkXHgyN1x4NTFceGRlXHg4NSIKKwkJCSAgIlx4MWVceDg2XHg1M1x4MTFceDUzXHg5NFx4MDBceGVlIgorCQkJICAiXHgyYlx4OGNceDA4XHgyYVx4YmZceGRkXHhhZVx4MTEiCisJCQkgICJceGNiXHgxZVx4YTJceDA3XHg5YVx4ODBceGNmXHg2MiIKKwkJCSAgIlx4OWJceDA5XHhkY1x4OTVceDNjXHg5Nlx4OGVceGIxIgorCQkJICAiXHgwOVx4YmRceGU0XHhlYlx4ZGJceGNhXHg3MFx4N2EiCisJCQkgICJceDllXHhmYVx4MzFceDE4XHg0NVx4M2NceDIxXHgzMyIKKwkJCSAgIlx4YjBceGIzXHgyYlx4ZWFceGYzXHg3MVx4MmRceGUxIgorCQkJICAiXHgwM1x4YWRceDFiXHg0OFx4ZDRceDY3XHgyN1x4ZjAiCisJCQkgICJceDYyXHhlNFx4M2RceGZiXHg5Ylx4MDhceDc2XHhlNyIKKwkJCSAgIlx4ZGRceDJiXHgwMVx4MzlceDA0XHg1YVx4NThceDdhIgorCQkJICAiXHhmN1x4MTFceDkwXHhlY1x4YmRceDUxXHg1Y1x4MzIiCisJCQkgICJceDZiXHhkN1x4MzVceDM5XHgwMlx4NmJceGYyXHhhNiIKKwkJCSAgIlx4ZDBceDBkXHgwN1x4ZTFceDA2XHhjNFx4NWJceDdkIgorCQkJICAiXHhlNFx4NmFceGQ3XHhlZVx4MTVceDFmXHg4M1x4YjQiCisJCQkgICJceGEzXHhhN1x4NWVceGMzXHg5MFx4YjdceGVmXHhkMyIKKwkJCSAgIlx4YjdceDRmXHhmOFx4OTJceDRjXHhiN1x4M2NceDI5IgorCQkJICAiXHhjZFx4N2VceDJiXHg1ZFx4NDNceGVhXHg0Mlx4ZTciCisJCQkgICJceDc0XHgzZlx4N2RceDU4XHg4OFx4NzVceGRlXHgzZSIsCisJCS5pbGVuICAgPSA1MTIsCisJCS5yZXN1bHQJPSAiXHgwNVx4MTFceGI3XHgxOFx4YWJceGM2XHgyZFx4YWMiCisJCQkgICJceDcwXHg1ZFx4ZjZceDIyXHg5NFx4Y2RceGU1XHg2YyIKKwkJCSAgIlx4MTdceDZiXHhmNlx4MWNceGYwXHhmM1x4NmVceGY4IgorCQkJICAiXHg1MFx4MzhceDFmXHg3MVx4NDlceGI2XHg1N1x4ZDYiCisJCQkgICJceDhmXHhjYlx4OGRceDZiXHhlM1x4YTZceDI5XHg5MCIKKwkJCSAgIlx4ZmVceDJhXHg2Mlx4ODJceGFlXHg2ZFx4OGJceGY2IgorCQkJICAiXHhhZFx4MWVceDllXHgyMFx4NWZceDM4XHhiZVx4MDQiCisJCQkgICJceGRhXHgxMFx4OGVceGVkXHhhMlx4YTRceDg3XHhhYiIKKwkJCSAgIlx4ZGFceDZiXHhiNFx4MGNceDc1XHhiYVx4ZDNceDdjIgorCQkJICAiXHhjOVx4YWNceDQyXHgzMVx4OTVceDdjXHhjOVx4MDQiCisJCQkgICJceGViXHhkNVx4NmVceDMyXHg2OVx4OGFceGRiXHhhNiIKKwkJCSAgIlx4MTVceGQ3XHgzZlx4NGZceDJmXHg2Nlx4NjlceDAzIgorCQkJICAiXHg5Y1x4MWZceDU0XHgwZlx4ZGVceDFmXHhmM1x4NjUiCisJCQkgICJceDRjXHg5Nlx4MTJceGVkXHg3Y1x4OTJceDAzXHgwMSIKKwkJCSAgIlx4NmZceGJjXHgzNVx4OTNceGFjXHhmMVx4MjdceGYxIgorCQkJICAiXHhiNFx4OTZceDgyXHg1YVx4NWZceGIwXHhhMFx4NTAiCisJCQkgICJceDg5XHhhNFx4OGVceDY2XHg0NFx4ODVceGNjXHhmZCIKKwkJCSAgIlx4MzNceDE0XHg3MFx4ZTNceDk2XHhiMlx4YzNceGQzIgorCQkJICAiXHhiYlx4NTRceDVhXHgxYVx4ZjlceDc0XHhhMlx4YzUiCisJCQkgICJceDJkXHg2NFx4NzVceGRkXHhiNFx4NTRceGU2XHg3NCIKKwkJCSAgIlx4OGNceGQzXHg5ZFx4OWVceDg2XHhhYlx4NTFceDUzIgorCQkJICAiXHhiN1x4OTNceDNlXHg2Zlx4ZDBceDRlXHgyY1x4NDAiCisJCQkgICJceGY2XHhhOFx4MmVceDNlXHg5ZFx4ZjRceDY2XHhhNSIKKwkJCSAgIlx4NzZceDEyXHg3M1x4NDRceDFhXHg1Nlx4ZDdceDcyIgorCQkJICAiXHg4OFx4Y2RceDIxXHg4Y1x4NGNceDBmXHhmZVx4ZGEiCisJCQkgICJceDk1XHhlMFx4M2FceGE2XHhhNVx4ODRceDQ2XHhjZCIKKwkJCSAgIlx4ZDVceDNlXHg5ZFx4M2FceGUyXHg2N1x4ZTZceDYwIgorCQkJICAiXHgxYVx4ZTJceDcwXHg4NVx4NThceGMyXHgxYlx4MDkiCisJCQkgICJceGUxXHhkN1x4MmNceGNhXHhhZFx4YThceDhmXHhmOSIKKwkJCSAgIlx4YWNceGIzXHgwZVx4ZGJceGNhXHgyZVx4ZTJceGI4IgorCQkJICAiXHg1MVx4NzFceGQ5XHgzY1x4NmNceGYxXHg1Nlx4ZjgiCisJCQkgICJceGVhXHg5Y1x4ZjFceGZiXHgwY1x4ZTZceGI3XHgxMCIKKwkJCSAgIlx4MWNceGY4XHhhOVx4N2NceGU4XHg1M1x4MzVceGMxIgorCQkJICAiXHg5MFx4M2VceDc2XHg0YVx4NzRceGE0XHgyMVx4MmMiCisJCQkgICJceGY2XHgyY1x4NGVceDBmXHg5NFx4M2FceDg4XHgyZSIKKwkJCSAgIlx4NDFceDA5XHg2YVx4MzNceDdkXHhmNlx4ZGRceDNmIgorCQkJICAiXHg4ZFx4MjNceDMxXHg3NFx4ODRceGViXHg4OFx4NmUiCisJCQkgICJceGNjXHhiOVx4YmNceDIyXHg4M1x4MTlceDA3XHgyMiIKKwkJCSAgIlx4YTVceDJkXHhkZlx4YTVceGYzXHg4MFx4ODVceDc4IgorCQkJICAiXHg4NFx4MzlceDZhXHg2ZFx4NmFceDk5XHg0Zlx4YTUiCisJCQkgICJceDE1XHhmZVx4NDZceGIwXHhlNFx4NmNceGE1XHg0MSIKKwkJCSAgIlx4M2NceGNlXHg4Zlx4NDJceDYwXHg3MVx4YTdceDc1IgorCQkJICAiXHgwOFx4NDBceDY1XHg4YVx4ODJceGJmXHhmNVx4NDMiCisJCQkgICJceDcxXHg5Nlx4YTlceDRkXHg0NFx4OGFceDIwXHhiZSIKKwkJCSAgIlx4ZmFceDRkXHhiYlx4YzBceDdkXHgzMVx4OTZceDY1IgorCQkJICAiXHhlN1x4NzVceGU1XHgzZVx4ZmRceDkyXHgzYlx4YzkiCisJCQkgICJceDU1XHhiYlx4MTZceDdlXHhmN1x4YzJceDhjXHhhNCIKKwkJCSAgIlx4NDBceDFkXHhlNVx4ZWZceDBlXHhkZlx4ZTRceDlhIgorCQkJICAiXHg2Mlx4NzNceDY1XHhmZFx4NDZceDYzXHgyNVx4M2QiCisJCQkgICJceDJiXHhhZlx4ZTVceDY0XHhmZVx4YTVceDVjXHhjZiIKKwkJCSAgIlx4MjRceGYzXHhiNFx4YWNceDY0XHhiYVx4ZGZceDRiIgorCQkJICAiXHhjNlx4OTZceDdkXHg4MVx4MmRceDhkXHg5N1x4ZjciCisJCQkgICJceGM1XHg2OFx4NzdceDg0XHgzMlx4MmJceGNjXHg4NSIKKwkJCSAgIlx4NzRceDk2XHhmMFx4MTJceDc3XHg2MVx4YjlceGViIgorCQkJICAiXHg3MVx4YWFceDgyXHhjYlx4MWNceGRiXHg4OVx4YzgiCisJCQkgICJceGM2XHhiNVx4ZTNceDVjXHg3ZFx4MzlceDA3XHgyNCIKKwkJCSAgIlx4ZGFceDM5XHg4N1x4NDVceGMwXHgyYlx4YmJceDAxIgorCQkJICAiXHhhY1x4YmNceDJhXHg1Y1x4N2ZceGZjXHhlOFx4Y2UiCisJCQkgICJceDZkXHg5Y1x4NmZceGVkXHhkM1x4YzFceGExXHhkNiIKKwkJCSAgIlx4YzVceDU1XHhhOVx4NjZceDJmXHhlMVx4YzhceDMyIgorCQkJICAiXHhhNlx4NWRceGE0XHgzYVx4OThceDczXHhlOFx4NDUiCisJCQkgICJceGE0XHhjN1x4YThceGI0XHhmNlx4MTNceDAzXHhmNiIKKwkJCSAgIlx4ZTlceDJlXHhjNFx4MjlceDBmXHg4NFx4ZGJceGM0IgorCQkJICAiXHgyMVx4YzRceGMyXHg3NVx4NjdceDg5XHgzN1x4MGEiLAorCQkucmxlbiAgID0gNTEyLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYWVzX3h0c19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwkvKiBodHRwOi8vZ3JvdXBlci5pZWVlLm9yZy9ncm91cHMvMTYxOS9lbWFpbC9wZGYwMDA4Ni5wZGYgKi8KKwl7IC8qIFhUUy1BRVMgMSAqLworCQkua2V5ICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4gICA9IDMyLAorCQkucmVzdWx0ID0gIlx4OTFceDdjXHhmNlx4OWVceGJkXHg2OFx4YjJceGVjIgorCQkJICAiXHg5Ylx4OWZceGU5XHhhM1x4ZWFceGRkXHhhNlx4OTIiCisJCQkgICJceGNkXHg0M1x4ZDJceGY1XHg5NVx4OThceGVkXHg4NSIKKwkJCSAgIlx4OGNceDAyXHhjMlx4NjVceDJmXHhiZlx4OTJceDJlIiwKKwkJLnJsZW4gICA9IDMyLAorCX0sIHsgLyogWFRTLUFFUyAyICovCisJCS5rZXkgICAgPSAiXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTEiCisJCQkgICJceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMSIKKwkJCSAgIlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyIgorCQkJICAiXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjIiLAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSAiXHgzM1x4MzNceDMzXHgzM1x4MzNceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCAgPSAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCisJCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKKwkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgorCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiLAorCQkuaWxlbiAgID0gMzIsCisJCS5yZXN1bHQgPSAiXHhjNFx4NTRceDE4XHg1ZVx4NmFceDE2XHg5M1x4NmUiCisJCQkgICJceDM5XHgzM1x4NDBceDM4XHhhY1x4ZWZceDgzXHg4YiIKKwkJCSAgIlx4ZmJceDE4XHg2Zlx4ZmZceDc0XHg4MFx4YWRceGM0IgorCQkJICAiXHgyOFx4OTNceDgyXHhlY1x4ZDZceGQzXHg5NFx4ZjAiLAorCQkucmxlbiAgID0gMzIsCisJfSwgeyAvKiBYVFMtQUVTIDMgKi8KKwkJLmtleSAgICA9ICJceGZmXHhmZVx4ZmRceGZjXHhmYlx4ZmFceGY5XHhmOCIKKwkJCSAgIlx4ZjdceGY2XHhmNVx4ZjRceGYzXHhmMlx4ZjFceGYwIgorCQkJICAiXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjIiCisJCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIsCisJCS5rbGVuICAgPSAzMiwKKwkJLml2ICAgICA9ICJceDMzXHgzM1x4MzNceDMzXHgzM1x4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0ICA9ICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKKwkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgorCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCisJCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIsCisJCS5pbGVuICAgPSAzMiwKKwkJLnJlc3VsdCA9ICJceGFmXHg4NVx4MzNceDZiXHg1OVx4N2FceGZjXHgxYSIKKwkJCSAgIlx4OTBceDBiXHgyZVx4YjJceDFlXHhjOVx4NDlceGQyIgorCQkJICAiXHg5Mlx4ZGZceDRjXHgwNFx4N2VceDBiXHgyMVx4NTMiCisJCQkgICJceDIxXHg4Nlx4YTVceDk3XHgxYVx4MjJceDdhXHg4OSIsCisJCS5ybGVuICAgPSAzMiwKKwl9LCB7IC8qIFhUUy1BRVMgNCAqLworCQkua2V5ICAgID0gIlx4MjdceDE4XHgyOFx4MThceDI4XHg0NVx4OTBceDQ1IgorCQkJICAiXHgyM1x4NTNceDYwXHgyOFx4NzRceDcxXHgzNVx4MjYiCisJCQkgICJceDMxXHg0MVx4NTlceDI2XHg1M1x4NThceDk3XHg5MyIKKwkJCSAgIlx4MjNceDg0XHg2Mlx4NjRceDMzXHg4M1x4MjdceDk1IiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCQkJICAiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCisJCQkgICJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKKwkJCSAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCisJCQkgICJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKKwkJCSAgIlx4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgorCQkJICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCisJCQkgICJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKKwkJCSAgIlx4NjBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3IgorCQkJICAiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCisJCQkgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKKwkJCSAgIlx4NzhceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmIgorCQkJICAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCisJCQkgICJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKKwkJCSAgIlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3IgorCQkJICAiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCisJCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKKwkJCSAgIlx4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmIgorCQkJICAiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCisJCQkgICJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKKwkJCSAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgorCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCisJCQkgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKKwkJCSAgIlx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmIgorCQkJICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCisJCQkgICJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKKwkJCSAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3IgorCQkJICAiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiCisJCQkgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3IgorCQkJICAiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCisJCQkgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgorCQkJICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCisJCQkgICJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKKwkJCSAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3IgorCQkJICAiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCisJCQkgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKKwkJCSAgIlx4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgorCQkJICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCisJCQkgICJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKKwkJCSAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3IgorCQkJICAiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCisJCQkgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKKwkJCSAgIlx4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCisJCQkgICJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKKwkJCSAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3IgorCQkJICAiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCisJCQkgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgorCQkJICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCisJCQkgICJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKKwkJCSAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3IgorCQkJICAiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCisJCQkgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKKwkJCSAgIlx4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIiwKKwkJLmlsZW4gICA9IDUxMiwKKwkJLnJlc3VsdCA9ICJceDI3XHhhN1x4NDdceDliXHhlZlx4YTFceGQ0XHg3NiIKKwkJCSAgIlx4NDhceDlmXHgzMFx4OGNceGQ0XHhjZlx4YTZceGUyIgorCQkJICAiXHhhOVx4NmVceDRiXHhiZVx4MzJceDA4XHhmZlx4MjUiCisJCQkgICJceDI4XHg3ZFx4ZDNceDgxXHg5Nlx4MTZceGU4XHg5YyIKKwkJCSAgIlx4YzdceDhjXHhmN1x4ZjVceGU1XHg0M1x4NDRceDVmIgorCQkJICAiXHg4M1x4MzNceGQ4XHhmYVx4N2ZceDU2XHgwMFx4MDAiCisJCQkgICJceDA1XHgyN1x4OWZceGE1XHhkOFx4YjVceGU0XHhhZCIKKwkJCSAgIlx4NDBceGU3XHgzNlx4ZGRceGI0XHhkM1x4NTRceDEyIgorCQkJICAiXHgzMlx4ODBceDYzXHhmZFx4MmFceGFiXHg1M1x4ZTUiCisJCQkgICJceGVhXHgxZVx4MGFceDlmXHgzM1x4MjVceDAwXHhhNSIKKwkJCSAgIlx4ZGZceDk0XHg4N1x4ZDBceDdhXHg1Y1x4OTJceGNjIgorCQkJICAiXHg1MVx4MmNceDg4XHg2Nlx4YzdceGU4XHg2MFx4Y2UiCisJCQkgICJceDkzXHhmZFx4ZjFceDY2XHhhMlx4NDlceDEyXHhiNCIKKwkJCSAgIlx4MjJceDk3XHg2MVx4NDZceGFlXHgyMFx4Y2VceDg0IgorCQkJICAiXHg2Ylx4YjdceGRjXHg5Ylx4YTlceDRhXHg3Nlx4N2EiCisJCQkgICJceGFlXHhmMlx4MGNceDBkXHg2MVx4YWRceDAyXHg2NSIKKwkJCSAgIlx4NWVceGE5XHgyZFx4YzRceGM0XHhlNFx4MWFceDg5IgorCQkJICAiXHg1Mlx4YzZceDUxXHhkM1x4MzFceDc0XHhiZVx4NTEiCisJCQkgICJceGExXHgwY1x4NDJceDExXHgxMFx4ZTZceGQ4XHgxNSIKKwkJCSAgIlx4ODhceGVkXHhlOFx4MjFceDAzXHhhMlx4NTJceGQ4IgorCQkJICAiXHhhN1x4NTBceGU4XHg3Nlx4OGRceGVmXHhmZlx4ZWQiCisJCQkgICJceDkxXHgyMlx4ODFceDBhXHhhZVx4YjlceDlmXHg5MSIKKwkJCSAgIlx4NzJceGFmXHg4Mlx4YjZceDA0XHhkY1x4NGJceDhlIgorCQkJICAiXHg1MVx4YmNceGIwXHg4Mlx4MzVceGE2XHhmNFx4MzQiCisJCQkgICJceDEzXHgzMlx4ZTRceGNhXHg2MFx4NDhceDJhXHg0YiIKKwkJCSAgIlx4YTFceGEwXHgzYlx4M2VceDY1XHgwMFx4OGZceGM1IgorCQkJICAiXHhkYVx4NzZceGI3XHgwYlx4ZjFceDY5XHgwZFx4YjQiCisJCQkgICJceGVhXHhlMlx4OWNceDVmXHgxYlx4YWRceGQwXHgzYyIKKwkJCSAgIlx4NWNceGNmXHgyYVx4NTVceGQ3XHgwNVx4ZGRceGNkIgorCQkJICAiXHg4Nlx4ZDRceDQ5XHg1MVx4MWNceGViXHg3ZVx4YzMiCisJCQkgICJceDBiXHhmMVx4MmJceDFmXHhhM1x4NWJceDkxXHgzZiIKKwkJCSAgIlx4OWZceDc0XHg3YVx4OGFceGZkXHgxYlx4MTNceDBlIgorCQkJICAiXHg5NFx4YmZceGY5XHg0ZVx4ZmZceGQwXHgxYVx4OTEiCisJCQkgICJceDczXHg1Y1x4YTFceDcyXHg2YVx4Y2RceDBiXHgxOSIKKwkJCSAgIlx4N2NceDRlXHg1Ylx4MDNceDM5XHgzNlx4OTdceGUxIgorCQkJICAiXHgyNlx4ODJceDZmXHhiNlx4YmJceGRlXHg4ZVx4Y2MiCisJCQkgICJceDFlXHgwOFx4MjlceDg1XHgxNlx4ZTJceGM5XHhlZCIKKwkJCSAgIlx4MDNceGZmXHgzY1x4MWJceDc4XHg2MFx4ZjZceGRlIgorCQkJICAiXHg3Nlx4ZDRceGNlXHhjZFx4OTRceGM4XHgxMVx4OTgiCisJCQkgICJceDU1XHhlZlx4NTJceDk3XHhjYVx4NjdceGU5XHhmMyIKKwkJCSAgIlx4ZTdceGZmXHg3Mlx4YjFceGU5XHg5N1x4ODVceGNhIgorCQkJICAiXHgwYVx4N2VceDc3XHgyMFx4YzVceGIzXHg2ZFx4YzYiCisJCQkgICJceGQ3XHgyY1x4YWNceDk1XHg3NFx4YzhceGNiXHhiYyIKKwkJCSAgIlx4MmZceDgwXHgxZVx4MjNceGU1XHg2Zlx4ZDNceDQ0IgorCQkJICAiXHhiMFx4N2ZceDIyXHgxNVx4NGJceGViXHhhMFx4ZjAiCisJCQkgICJceDhjXHhlOFx4ODlceDFlXHg2NFx4M2VceGQ5XHg5NSIKKwkJCSAgIlx4YzlceDRkXHg5YVx4NjlceGM5XHhmMVx4YjVceGY0IgorCQkJICAiXHg5OVx4MDJceDdhXHg3OFx4NTdceDJhXHhlZVx4YmQiCisJCQkgICJceDc0XHhkMlx4MGNceGMzXHg5OFx4ODFceGMyXHgxMyIKKwkJCSAgIlx4ZWVceDc3XHgwYlx4MTBceDEwXHhlNFx4YmVceGE3IgorCQkJICAiXHgxOFx4ODRceDY5XHg3N1x4YWVceDExXHg5Zlx4N2EiCisJCQkgICJceDAyXHgzYVx4YjVceDhjXHhjYVx4MGFceGQ3XHg1MiIKKwkJCSAgIlx4YWZceGU2XHg1Nlx4YmJceDNjXHgxN1x4MjVceDZhIgorCQkJICAiXHg5Zlx4NmVceDliXHhmMVx4OWZceGRkXHg1YVx4MzgiCisJCQkgICJceGZjXHg4Mlx4YmJceGU4XHg3Mlx4YzVceDUzXHg5ZSIKKwkJCSAgIlx4ZGJceDYwXHg5ZVx4ZjRceGY3XHg5Y1x4MjBceDNlIgorCQkJICAiXHhiYlx4MTRceDBmXHgyZVx4NThceDNjXHhiMlx4YWQiCisJCQkgICJceDE1XHhiNFx4YWFceDViXHg2NVx4NTBceDE2XHhhOCIKKwkJCSAgIlx4NDRceDkyXHg3N1x4ZGJceGQ0XHg3N1x4ZWZceDJjIgorCQkJICAiXHg4ZFx4NmNceDAxXHg3ZFx4YjdceDM4XHhiMVx4OGQiCisJCQkgICJceGViXHg0YVx4NDJceDdkXHgxOVx4MjNceGNlXHgzZiIKKwkJCSAgIlx4ZjJceDYyXHg3M1x4NTdceDc5XHhhNFx4MThceGYyIgorCQkJICAiXHgwYVx4MjhceDJkXHhmOVx4MjBceDE0XHg3Ylx4ZWEiCisJCQkgICJceGJlXHg0Mlx4MWVceGU1XHgzMVx4OWRceDA1XHg2OCIsCisJCS5ybGVuICAgPSA1MTIsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfeHRzX2RlY190dl90ZW1wbGF0ZVtdID0geworCS8qIGh0dHA6Ly9ncm91cGVyLmllZWUub3JnL2dyb3Vwcy8xNjE5L2VtYWlsL3BkZjAwMDg2LnBkZiAqLworCXsgLyogWFRTLUFFUyAxICovCisJCS5rZXkgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCA9ICJceDkxXHg3Y1x4ZjZceDllXHhiZFx4NjhceGIyXHhlYyIKKwkJCSAiXHg5Ylx4OWZceGU5XHhhM1x4ZWFceGRkXHhhNlx4OTIiCisJCQkgIlx4Y2RceDQzXHhkMlx4ZjVceDk1XHg5OFx4ZWRceDg1IgorCQkJICJceDhjXHgwMlx4YzJceDY1XHgyZlx4YmZceDkyXHgyZSIsCisJCS5pbGVuICAgPSAzMiwKKwkJLnJlc3VsdCAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkucmxlbiAgID0gMzIsCisJfSwgeyAvKiBYVFMtQUVTIDIgKi8KKwkJLmtleSAgICA9ICJceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMSIKKwkJCSAgIlx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExIgorCQkJICAiXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjIiCisJCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIsCisJCS5rbGVuICAgPSAzMiwKKwkJLml2ICAgICA9ICJceDMzXHgzM1x4MzNceDMzXHgzM1x4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0ICA9ICJceGM0XHg1NFx4MThceDVlXHg2YVx4MTZceDkzXHg2ZSIKKwkJCSAgIlx4MzlceDMzXHg0MFx4MzhceGFjXHhlZlx4ODNceDhiIgorCQkJICAiXHhmYlx4MThceDZmXHhmZlx4NzRceDgwXHhhZFx4YzQiCisJCQkgICJceDI4XHg5M1x4ODJceGVjXHhkNlx4ZDNceDk0XHhmMCIsCisJCS5pbGVuICAgPSAzMiwKKwkJLnJlc3VsdCA9ICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKKwkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgorCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCisJCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIsCisJCS5ybGVuICAgPSAzMiwKKwl9LCB7IC8qIFhUUy1BRVMgMyAqLworCQkua2V5ICAgID0gIlx4ZmZceGZlXHhmZFx4ZmNceGZiXHhmYVx4ZjlceGY4IgorCQkJICAiXHhmN1x4ZjZceGY1XHhmNFx4ZjNceGYyXHhmMVx4ZjAiCisJCQkgICJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMiIKKwkJCSAgIlx4MjJceDIyXHgyMlx4MjJceDIyXHgyMlx4MjJceDIyIiwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0gIlx4MzNceDMzXHgzM1x4MzNceDMzXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQgPSAiXHhhZlx4ODVceDMzXHg2Ylx4NTlceDdhXHhmY1x4MWEiCisJCQkgICJceDkwXHgwYlx4MmVceGIyXHgxZVx4YzlceDQ5XHhkMiIKKwkJCSAgIlx4OTJceGRmXHg0Y1x4MDRceDdlXHgwYlx4MjFceDUzIgorCQkJICAiXHgyMVx4ODZceGE1XHg5N1x4MWFceDIyXHg3YVx4ODkiLAorCQkuaWxlbiAgID0gMzIsCisJCS5yZXN1bHQgID0gIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IgorCQkJICAiXHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDQiCisJCQkgICJceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NCIKKwkJCSAgIlx4NDRceDQ0XHg0NFx4NDRceDQ0XHg0NFx4NDRceDQ0IiwKKwkJLnJsZW4gICA9IDMyLAorCX0sIHsgLyogWFRTLUFFUyA0ICovCisJCS5rZXkgICAgPSAiXHgyN1x4MThceDI4XHgxOFx4MjhceDQ1XHg5MFx4NDUiCisJCQkgICJceDIzXHg1M1x4NjBceDI4XHg3NFx4NzFceDM1XHgyNiIKKwkJCSAgIlx4MzFceDQxXHg1OVx4MjZceDUzXHg1OFx4OTdceDkzIgorCQkJICAiXHgyM1x4ODRceDYyXHg2NFx4MzNceDgzXHgyN1x4OTUiLAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCAgPSAiXHgyN1x4YTdceDQ3XHg5Ylx4ZWZceGExXHhkNFx4NzYiCisJCQkgICJceDQ4XHg5Zlx4MzBceDhjXHhkNFx4Y2ZceGE2XHhlMiIKKwkJCSAgIlx4YTlceDZlXHg0Ylx4YmVceDMyXHgwOFx4ZmZceDI1IgorCQkJICAiXHgyOFx4N2RceGQzXHg4MVx4OTZceDE2XHhlOFx4OWMiCisJCQkgICJceGM3XHg4Y1x4ZjdceGY1XHhlNVx4NDNceDQ0XHg1ZiIKKwkJCSAgIlx4ODNceDMzXHhkOFx4ZmFceDdmXHg1Nlx4MDBceDAwIgorCQkJICAiXHgwNVx4MjdceDlmXHhhNVx4ZDhceGI1XHhlNFx4YWQiCisJCQkgICJceDQwXHhlN1x4MzZceGRkXHhiNFx4ZDNceDU0XHgxMiIKKwkJCSAgIlx4MzJceDgwXHg2M1x4ZmRceDJhXHhhYlx4NTNceGU1IgorCQkJICAiXHhlYVx4MWVceDBhXHg5Zlx4MzNceDI1XHgwMFx4YTUiCisJCQkgICJceGRmXHg5NFx4ODdceGQwXHg3YVx4NWNceDkyXHhjYyIKKwkJCSAgIlx4NTFceDJjXHg4OFx4NjZceGM3XHhlOFx4NjBceGNlIgorCQkJICAiXHg5M1x4ZmRceGYxXHg2Nlx4YTJceDQ5XHgxMlx4YjQiCisJCQkgICJceDIyXHg5N1x4NjFceDQ2XHhhZVx4MjBceGNlXHg4NCIKKwkJCSAgIlx4NmJceGI3XHhkY1x4OWJceGE5XHg0YVx4NzZceDdhIgorCQkJICAiXHhhZVx4ZjJceDBjXHgwZFx4NjFceGFkXHgwMlx4NjUiCisJCQkgICJceDVlXHhhOVx4MmRceGM0XHhjNFx4ZTRceDFhXHg4OSIKKwkJCSAgIlx4NTJceGM2XHg1MVx4ZDNceDMxXHg3NFx4YmVceDUxIgorCQkJICAiXHhhMVx4MGNceDQyXHgxMVx4MTBceGU2XHhkOFx4MTUiCisJCQkgICJceDg4XHhlZFx4ZThceDIxXHgwM1x4YTJceDUyXHhkOCIKKwkJCSAgIlx4YTdceDUwXHhlOFx4NzZceDhkXHhlZlx4ZmZceGVkIgorCQkJICAiXHg5MVx4MjJceDgxXHgwYVx4YWVceGI5XHg5Zlx4OTEiCisJCQkgICJceDcyXHhhZlx4ODJceGI2XHgwNFx4ZGNceDRiXHg4ZSIKKwkJCSAgIlx4NTFceGJjXHhiMFx4ODJceDM1XHhhNlx4ZjRceDM0IgorCQkJICAiXHgxM1x4MzJceGU0XHhjYVx4NjBceDQ4XHgyYVx4NGIiCisJCQkgICJceGExXHhhMFx4M2JceDNlXHg2NVx4MDBceDhmXHhjNSIKKwkJCSAgIlx4ZGFceDc2XHhiN1x4MGJceGYxXHg2OVx4MGRceGI0IgorCQkJICAiXHhlYVx4ZTJceDljXHg1Zlx4MWJceGFkXHhkMFx4M2MiCisJCQkgICJceDVjXHhjZlx4MmFceDU1XHhkN1x4MDVceGRkXHhjZCIKKwkJCSAgIlx4ODZceGQ0XHg0OVx4NTFceDFjXHhlYlx4N2VceGMzIgorCQkJICAiXHgwYlx4ZjFceDJiXHgxZlx4YTNceDViXHg5MVx4M2YiCisJCQkgICJceDlmXHg3NFx4N2FceDhhXHhmZFx4MWJceDEzXHgwZSIKKwkJCSAgIlx4OTRceGJmXHhmOVx4NGVceGZmXHhkMFx4MWFceDkxIgorCQkJICAiXHg3M1x4NWNceGExXHg3Mlx4NmFceGNkXHgwYlx4MTkiCisJCQkgICJceDdjXHg0ZVx4NWJceDAzXHgzOVx4MzZceDk3XHhlMSIKKwkJCSAgIlx4MjZceDgyXHg2Zlx4YjZceGJiXHhkZVx4OGVceGNjIgorCQkJICAiXHgxZVx4MDhceDI5XHg4NVx4MTZceGUyXHhjOVx4ZWQiCisJCQkgICJceDAzXHhmZlx4M2NceDFiXHg3OFx4NjBceGY2XHhkZSIKKwkJCSAgIlx4NzZceGQ0XHhjZVx4Y2RceDk0XHhjOFx4MTFceDk4IgorCQkJICAiXHg1NVx4ZWZceDUyXHg5N1x4Y2FceDY3XHhlOVx4ZjMiCisJCQkgICJceGU3XHhmZlx4NzJceGIxXHhlOVx4OTdceDg1XHhjYSIKKwkJCSAgIlx4MGFceDdlXHg3N1x4MjBceGM1XHhiM1x4NmRceGM2IgorCQkJICAiXHhkN1x4MmNceGFjXHg5NVx4NzRceGM4XHhjYlx4YmMiCisJCQkgICJceDJmXHg4MFx4MWVceDIzXHhlNVx4NmZceGQzXHg0NCIKKwkJCSAgIlx4YjBceDdmXHgyMlx4MTVceDRiXHhlYlx4YTBceGYwIgorCQkJICAiXHg4Y1x4ZThceDg5XHgxZVx4NjRceDNlXHhkOVx4OTUiCisJCQkgICJceGM5XHg0ZFx4OWFceDY5XHhjOVx4ZjFceGI1XHhmNCIKKwkJCSAgIlx4OTlceDAyXHg3YVx4NzhceDU3XHgyYVx4ZWVceGJkIgorCQkJICAiXHg3NFx4ZDJceDBjXHhjM1x4OThceDgxXHhjMlx4MTMiCisJCQkgICJceGVlXHg3N1x4MGJceDEwXHgxMFx4ZTRceGJlXHhhNyIKKwkJCSAgIlx4MThceDg0XHg2OVx4NzdceGFlXHgxMVx4OWZceDdhIgorCQkJICAiXHgwMlx4M2FceGI1XHg4Y1x4Y2FceDBhXHhkN1x4NTIiCisJCQkgICJceGFmXHhlNlx4NTZceGJiXHgzY1x4MTdceDI1XHg2YSIKKwkJCSAgIlx4OWZceDZlXHg5Ylx4ZjFceDlmXHhkZFx4NWFceDM4IgorCQkJICAiXHhmY1x4ODJceGJiXHhlOFx4NzJceGM1XHg1M1x4OWUiCisJCQkgICJceGRiXHg2MFx4OWVceGY0XHhmN1x4OWNceDIwXHgzZSIKKwkJCSAgIlx4YmJceDE0XHgwZlx4MmVceDU4XHgzY1x4YjJceGFkIgorCQkJICAiXHgxNVx4YjRceGFhXHg1Ylx4NjVceDUwXHgxNlx4YTgiCisJCQkgICJceDQ0XHg5Mlx4NzdceGRiXHhkNFx4NzdceGVmXHgyYyIKKwkJCSAgIlx4OGRceDZjXHgwMVx4N2RceGI3XHgzOFx4YjFceDhkIgorCQkJICAiXHhlYlx4NGFceDQyXHg3ZFx4MTlceDIzXHhjZVx4M2YiCisJCQkgICJceGYyXHg2Mlx4NzNceDU3XHg3OVx4YTRceDE4XHhmMiIKKwkJCSAgIlx4MGFceDI4XHgyZFx4ZjlceDIwXHgxNFx4N2JceGVhIgorCQkJICAiXHhiZVx4NDJceDFlXHhlNVx4MzFceDlkXHgwNVx4NjgiLAorCQkuaWxlbiAgID0gNTEyLAorCQkucmVzdWx0ID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCQkJICAiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCisJCQkgICJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKKwkJCSAgIlx4MzBceDMxXHgzMlx4MzNceDM0XHgzNVx4MzZceDM3IgorCQkJICAiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCisJCQkgICJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKKwkJCSAgIlx4NDhceDQ5XHg0YVx4NGJceDRjXHg0ZFx4NGVceDRmIgorCQkJICAiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCisJCQkgICJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKKwkJCSAgIlx4NjBceDYxXHg2Mlx4NjNceDY0XHg2NVx4NjZceDY3IgorCQkJICAiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCisJCQkgICJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKKwkJCSAgIlx4NzhceDc5XHg3YVx4N2JceDdjXHg3ZFx4N2VceDdmIgorCQkJICAiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCisJCQkgICJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKKwkJCSAgIlx4OTBceDkxXHg5Mlx4OTNceDk0XHg5NVx4OTZceDk3IgorCQkJICAiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCisJCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKKwkJCSAgIlx4YThceGE5XHhhYVx4YWJceGFjXHhhZFx4YWVceGFmIgorCQkJICAiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCisJCQkgICJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKKwkJCSAgIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgorCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCisJCQkgICJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKKwkJCSAgIlx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmIgorCQkJICAiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCisJCQkgICJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKKwkJCSAgIlx4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3IgorCQkJICAiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiCisJCQkgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSAgIlx4MjBceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3IgorCQkJICAiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCisJCQkgICJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSAgIlx4MzhceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmIgorCQkJICAiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCisJCQkgICJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKKwkJCSAgIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3IgorCQkJICAiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCisJCQkgICJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKKwkJCSAgIlx4NjhceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmIgorCQkJICAiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCisJCQkgICJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKKwkJCSAgIlx4ODBceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3IgorCQkJICAiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCisJCQkgICJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKKwkJCSAgIlx4OThceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmIgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCisJCQkgICJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKKwkJCSAgIlx4YjBceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3IgorCQkJICAiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCisJCQkgICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIgorCQkJICAiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCisJCQkgICJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKKwkJCSAgIlx4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3IgorCQkJICAiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCisJCQkgICJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKKwkJCSAgIlx4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmIiwKKwkJLnJsZW4gICA9IDUxMiwKKwl9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYWVzX2N0cl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEZyb20gUkZDIDM2ODYgKi8KKwkJLmtleQk9ICJceGFlXHg2OFx4NTJceGY4XHgxMlx4MTBceDY3XHhjYyIKKwkJCSAgIlx4NGJceGY3XHhhNVx4NzZceDU1XHg3N1x4ZjNceDllIgorCQkJICAiXHgwMFx4MDBceDAwXHgzMCIsCisJCS5rbGVuCT0gMjAsCisJCS5pdgk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJTaW5nbGUgYmxvY2sgbXNnIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdCA9ICJceGU0XHgwOVx4NWRceDRmXHhiN1x4YTdceGIzXHg3OSIKKwkJCSAgIlx4MmRceDYxXHg3NVx4YTNceDI2XHgxM1x4MTFceGI4IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg3ZVx4MjRceDA2XHg3OFx4MTdceGZhXHhlMFx4ZDciCisJCQkgICJceDQzXHhkNlx4Y2VceDFmXHgzMlx4NTNceDkxXHg2MyIKKwkJCSAgIlx4MDBceDZjXHhiNlx4ZGIiLAorCQkua2xlbgk9IDIwLAorCQkuaXYJPSAiXHhjMFx4NTRceDNiXHg1OVx4ZGFceDQ4XHhkOVx4MGIiLAorCQkuaW5wdXQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0ID0gIlx4NTFceDA0XHhhMVx4MDZceDE2XHg4YVx4NzJceGQ5IgorCQkJICAiXHg3OVx4MGRceDQxXHhlZVx4OGVceGRhXHhkM1x4ODgiCisJCQkgICJceGViXHgyZVx4MWVceGZjXHg0Nlx4ZGFceDU3XHhjOCIKKwkJCSAgIlx4ZmNceGU2XHgzMFx4ZGZceDkxXHg0MVx4YmVceDI4IiwKKwkJLnJsZW4JPSAzMiwKKwl9LCB7CisJCS5rZXkJPSAiXHgxNlx4YWZceDViXHgxNFx4NWZceGM5XHhmNVx4NzkiCisJCQkgICJceGMxXHg3NVx4ZjlceDNlXHgzYlx4ZmJceDBlXHhlZCIKKwkJCSAgIlx4ODZceDNkXHgwNlx4Y2NceGZkXHhiN1x4ODVceDE1IgorCQkJICAiXHgwMFx4MDBceDAwXHg0OCIsCisJCS5rbGVuCT0gMjgsCisJCS5pdgk9ICJceDM2XHg3M1x4M2NceDE0XHg3ZFx4NmRceDkzXHhjYiIsCisJCS5pbnB1dAk9ICJTaW5nbGUgYmxvY2sgbXNnIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDRiXHg1NVx4MzhceDRmXHhlMlx4NTlceGM5XHhjOCIKKwkJCSAgIlx4NGVceDc5XHgzNVx4YTBceDAzXHhjYlx4ZTlceDI4IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg3Y1x4NWNceGIyXHg0MFx4MWJceDNkXHhjM1x4M2MiCisJCQkgICJceDE5XHhlN1x4MzRceDA4XHgxOVx4ZTBceGY2XHg5YyIKKwkJCSAgIlx4NjdceDhjXHgzZFx4YjhceGU2XHhmNlx4YTlceDFhIgorCQkJICAiXHgwMFx4OTZceGIwXHgzYiIsCisJCS5rbGVuCT0gMjgsCisJCS5pdgk9ICJceDAyXHgwY1x4NmVceGFkXHhjMlx4Y2JceDUwXHgwZCIsCisJCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHg0NVx4MzJceDQzXHhmY1x4NjBceDliXHgyM1x4MzIiCisJCQkgICJceDdlXHhkZlx4YWFceGZhXHg3MVx4MzFceGNkXHg5ZiIKKwkJCSAgIlx4ODRceDkwXHg3MFx4MWNceDVhXHhkNFx4YTdceDljIgorCQkJICAiXHhmY1x4MWZceGUwXHhmZlx4NDJceGY0XHhmYlx4MDAiLAorCQkucmxlbgk9IDMyLAorCX0sIHsKKwkJLmtleQk9ICJceDc3XHg2Ylx4ZWZceGYyXHg4NVx4MWRceGIwXHg2ZiIKKwkJCSAgIlx4NGNceDhhXHgwNVx4NDJceGM4XHg2OVx4NmZceDZjIgorCQkJICAiXHg2YVx4ODFceGFmXHgxZVx4ZWNceDk2XHhiNFx4ZDMiCisJCQkgICJceDdmXHhjMVx4ZDZceDg5XHhlNlx4YzFceGMxXHgwNCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4NjAiLAorCQkua2xlbgk9IDM2LAorCQkuaXYJPSAiXHhkYlx4NTZceDcyXHhjOVx4N2FceGE4XHhmMFx4YjIiLAorCQkuaW5wdXQJPSAiU2luZ2xlIGJsb2NrIG1zZyIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQgPSAiXHgxNFx4NWFceGQwXHgxZFx4YmZceDgyXHg0ZVx4YzciCisJCQkgICJceDU2XHgwOFx4NjNceGRjXHg3MVx4ZTNceGUwXHhjMCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4ZjZceGQ2XHg2ZFx4NmJceGQ1XHgyZFx4NTlceGJiIgorCQkJICAiXHgwN1x4OTZceDM2XHg1OFx4NzlceGVmXHhmOFx4ODYiCisJCQkgICJceGM2XHg2ZFx4ZDVceDFhXHg1Ylx4NmFceDk5XHg3NCIKKwkJCSAgIlx4NGJceDUwXHg1OVx4MGNceDg3XHhhMlx4MzhceDg0IgorCQkJICAiXHgwMFx4ZmFceGFjXHgyNCIsCisJCS5rbGVuCT0gMzYsCisJCS5pdgk9ICJceGMxXHg1OFx4NWVceGYxXHg1YVx4NDNceGQ4XHg3NSIsCisJCS5pbnB1dAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQgPSAiXHhmMFx4NWVceDIzXHgxYlx4MzhceDk0XHg2MVx4MmMiCisJCQkgICJceDQ5XHhlZVx4MDBceDBiXHg4MFx4NGVceGIyXHhhOSIKKwkJCSAgIlx4YjhceDMwXHg2Ylx4NTBceDhmXHg4M1x4OWRceDZhIgorCQkJICAiXHg1NVx4MzBceDgzXHgxZFx4OTNceDQ0XHhhZlx4MWMiLAorCQkucmxlbgk9IDMyLAorCX0sIHsKKwkvLyBnZW5lcmF0ZWQgdXNpbmcgQ3J5cHRvKysKKwkJLmtleSA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4gPSAzMiArIDQsCisJCS5pdiA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dCA9CisJCQkiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCisJCQkiXHgyMFx4MjFceDIyXHgyM1x4MjRceDI1XHgyNlx4MjciCisJCQkiXHgyOFx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmYiCisJCQkiXHgzMFx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzciCisJCQkiXHgzOFx4MzlceDNhXHgzYlx4M2NceDNkXHgzZVx4M2YiCisJCQkiXHg0MFx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDciCisJCQkiXHg0OFx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCisJCQkiXHg1MFx4NTFceDUyXHg1M1x4NTRceDU1XHg1Nlx4NTciCisJCQkiXHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiCisJCQkiXHg2MFx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjciCisJCQkiXHg2OFx4NjlceDZhXHg2Ylx4NmNceDZkXHg2ZVx4NmYiCisJCQkiXHg3MFx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzciCisJCQkiXHg3OFx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2YiCisJCQkiXHg4MFx4ODFceDgyXHg4M1x4ODRceDg1XHg4Nlx4ODciCisJCQkiXHg4OFx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGYiCisJCQkiXHg5MFx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTciCisJCQkiXHg5OFx4OTlceDlhXHg5Ylx4OWNceDlkXHg5ZVx4OWYiCisJCQkiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTciCisJCQkiXHhhOFx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWYiCisJCQkiXHhiMFx4YjFceGIyXHhiM1x4YjRceGI1XHhiNlx4YjciCisJCQkiXHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmYiCisJCQkiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiCisJCQkiXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDciCisJCQkiXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYiCisJCQkiXHhlMFx4ZTFceGUyXHhlM1x4ZTRceGU1XHhlNlx4ZTciCisJCQkiXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYiCisJCQkiXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjciCisJCQkiXHhmOFx4ZjlceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYiCisJCQkiXHgwMFx4MDNceDA2XHgwOVx4MGNceDBmXHgxMlx4MTUiCisJCQkiXHgxOFx4MWJceDFlXHgyMVx4MjRceDI3XHgyYVx4MmQiCisJCQkiXHgzMFx4MzNceDM2XHgzOVx4M2NceDNmXHg0Mlx4NDUiCisJCQkiXHg0OFx4NGJceDRlXHg1MVx4NTRceDU3XHg1YVx4NWQiCisJCQkiXHg2MFx4NjNceDY2XHg2OVx4NmNceDZmXHg3Mlx4NzUiCisJCQkiXHg3OFx4N2JceDdlXHg4MVx4ODRceDg3XHg4YVx4OGQiCisJCQkiXHg5MFx4OTNceDk2XHg5OVx4OWNceDlmXHhhMlx4YTUiCisJCQkiXHhhOFx4YWJceGFlXHhiMVx4YjRceGI3XHhiYVx4YmQiCisJCQkiXHhjMFx4YzNceGM2XHhjOVx4Y2NceGNmXHhkMlx4ZDUiCisJCQkiXHhkOFx4ZGJceGRlXHhlMVx4ZTRceGU3XHhlYVx4ZWQiCisJCQkiXHhmMFx4ZjNceGY2XHhmOVx4ZmNceGZmXHgwMlx4MDUiCisJCQkiXHgwOFx4MGJceDBlXHgxMVx4MTRceDE3XHgxYVx4MWQiCisJCQkiXHgyMFx4MjNceDI2XHgyOVx4MmNceDJmXHgzMlx4MzUiCisJCQkiXHgzOFx4M2JceDNlXHg0MVx4NDRceDQ3XHg0YVx4NGQiCisJCQkiXHg1MFx4NTNceDU2XHg1OVx4NWNceDVmXHg2Mlx4NjUiCisJCQkiXHg2OFx4NmJceDZlXHg3MVx4NzRceDc3XHg3YVx4N2QiCisJCQkiXHg4MFx4ODNceDg2XHg4OVx4OGNceDhmXHg5Mlx4OTUiCisJCQkiXHg5OFx4OWJceDllXHhhMVx4YTRceGE3XHhhYVx4YWQiCisJCQkiXHhiMFx4YjNceGI2XHhiOVx4YmNceGJmXHhjMlx4YzUiCisJCQkiXHhjOFx4Y2JceGNlXHhkMVx4ZDRceGQ3XHhkYVx4ZGQiCisJCQkiXHhlMFx4ZTNceGU2XHhlOVx4ZWNceGVmXHhmMlx4ZjUiCisJCQkiXHhmOFx4ZmJceGZlXHgwMVx4MDRceDA3XHgwYVx4MGQiCisJCQkiXHgxMFx4MTNceDE2XHgxOVx4MWNceDFmXHgyMlx4MjUiCisJCQkiXHgyOFx4MmJceDJlXHgzMVx4MzRceDM3XHgzYVx4M2QiCisJCQkiXHg0MFx4NDNceDQ2XHg0OVx4NGNceDRmXHg1Mlx4NTUiCisJCQkiXHg1OFx4NWJceDVlXHg2MVx4NjRceDY3XHg2YVx4NmQiCisJCQkiXHg3MFx4NzNceDc2XHg3OVx4N2NceDdmXHg4Mlx4ODUiCisJCQkiXHg4OFx4OGJceDhlXHg5MVx4OTRceDk3XHg5YVx4OWQiCisJCQkiXHhhMFx4YTNceGE2XHhhOVx4YWNceGFmXHhiMlx4YjUiCisJCQkiXHhiOFx4YmJceGJlXHhjMVx4YzRceGM3XHhjYVx4Y2QiCisJCQkiXHhkMFx4ZDNceGQ2XHhkOVx4ZGNceGRmXHhlMlx4ZTUiCisJCQkiXHhlOFx4ZWJceGVlXHhmMVx4ZjRceGY3XHhmYVx4ZmQiCisJCQkiXHgwMFx4MDVceDBhXHgwZlx4MTRceDE5XHgxZVx4MjMiCisJCQkiXHgyOFx4MmRceDMyXHgzN1x4M2NceDQxXHg0Nlx4NGIiCisJCQkiXHg1MFx4NTVceDVhXHg1Zlx4NjRceDY5XHg2ZVx4NzMiCisJCQkiXHg3OFx4N2RceDgyXHg4N1x4OGNceDkxXHg5Nlx4OWIiCisJCQkiXHhhMFx4YTVceGFhXHhhZlx4YjRceGI5XHhiZVx4YzMiCisJCQkiXHhjOFx4Y2RceGQyXHhkN1x4ZGNceGUxXHhlNlx4ZWIiCisJCQkiXHhmMFx4ZjVceGZhXHhmZlx4MDRceDA5XHgwZVx4MTMiCisJCQkiXHgxOFx4MWRceDIyXHgyN1x4MmNceDMxXHgzNlx4M2IiCisJCQkiXHg0MFx4NDVceDRhXHg0Zlx4NTRceDU5XHg1ZVx4NjMiCisJCQkiXHg2OFx4NmRceDcyXHg3N1x4N2NceDgxXHg4Nlx4OGIiCisJCQkiXHg5MFx4OTVceDlhXHg5Zlx4YTRceGE5XHhhZVx4YjMiCisJCQkiXHhiOFx4YmRceGMyXHhjN1x4Y2NceGQxXHhkNlx4ZGIiCisJCQkiXHhlMFx4ZTVceGVhXHhlZlx4ZjRceGY5XHhmZVx4MDMiCisJCQkiXHgwOFx4MGRceDEyXHgxN1x4MWNceDIxXHgyNlx4MmIiCisJCQkiXHgzMFx4MzVceDNhXHgzZlx4NDRceDQ5XHg0ZVx4NTMiCisJCQkiXHg1OFx4NWRceDYyXHg2N1x4NmNceDcxXHg3Nlx4N2IiCisJCQkiXHg4MFx4ODVceDhhXHg4Zlx4OTRceDk5XHg5ZVx4YTMiCisJCQkiXHhhOFx4YWRceGIyXHhiN1x4YmNceGMxXHhjNlx4Y2IiCisJCQkiXHhkMFx4ZDVceGRhXHhkZlx4ZTRceGU5XHhlZVx4ZjMiCisJCQkiXHhmOFx4ZmRceDAyXHgwN1x4MGNceDExXHgxNlx4MWIiCisJCQkiXHgyMFx4MjVceDJhXHgyZlx4MzRceDM5XHgzZVx4NDMiCisJCQkiXHg0OFx4NGRceDUyXHg1N1x4NWNceDYxXHg2Nlx4NmIiCisJCQkiXHg3MFx4NzVceDdhXHg3Zlx4ODRceDg5XHg4ZVx4OTMiCisJCQkiXHg5OFx4OWRceGEyXHhhN1x4YWNceGIxXHhiNlx4YmIiCisJCQkiXHhjMFx4YzVceGNhXHhjZlx4ZDRceGQ5XHhkZVx4ZTMiCisJCQkiXHhlOFx4ZWRceGYyXHhmN1x4ZmNceDAxXHgwNlx4MGIiCisJCQkiXHgxMFx4MTVceDFhXHgxZlx4MjRceDI5XHgyZVx4MzMiCisJCQkiXHgzOFx4M2RceDQyXHg0N1x4NGNceDUxXHg1Nlx4NWIiCisJCQkiXHg2MFx4NjVceDZhXHg2Zlx4NzRceDc5XHg3ZVx4ODMiCisJCQkiXHg4OFx4OGRceDkyXHg5N1x4OWNceGExXHhhNlx4YWIiCisJCQkiXHhiMFx4YjVceGJhXHhiZlx4YzRceGM5XHhjZVx4ZDMiCisJCQkiXHhkOFx4ZGRceGUyXHhlN1x4ZWNceGYxXHhmNlx4ZmIiCisJCQkiXHgwMFx4MDdceDBlXHgxNVx4MWNceDIzXHgyYVx4MzEiCisJCQkiXHgzOFx4M2ZceDQ2XHg0ZFx4NTRceDViXHg2Mlx4NjkiCisJCQkiXHg3MFx4NzdceDdlXHg4NVx4OGNceDkzXHg5YVx4YTEiCisJCQkiXHhhOFx4YWZceGI2XHhiZFx4YzRceGNiXHhkMlx4ZDkiCisJCQkiXHhlMFx4ZTdceGVlXHhmNVx4ZmNceDAzXHgwYVx4MTEiCisJCQkiXHgxOFx4MWZceDI2XHgyZFx4MzRceDNiXHg0Mlx4NDkiCisJCQkiXHg1MFx4NTdceDVlXHg2NVx4NmNceDczXHg3YVx4ODEiCisJCQkiXHg4OFx4OGZceDk2XHg5ZFx4YTRceGFiXHhiMlx4YjkiCisJCQkiXHhjMFx4YzdceGNlXHhkNVx4ZGNceGUzXHhlYVx4ZjEiCisJCQkiXHhmOFx4ZmZceDA2XHgwZFx4MTRceDFiXHgyMlx4MjkiCisJCQkiXHgzMFx4MzdceDNlXHg0NVx4NGNceDUzXHg1YVx4NjEiCisJCQkiXHg2OFx4NmZceDc2XHg3ZFx4ODRceDhiXHg5Mlx4OTkiCisJCQkiXHhhMFx4YTdceGFlXHhiNVx4YmNceGMzXHhjYVx4ZDEiCisJCQkiXHhkOFx4ZGZceGU2XHhlZFx4ZjRceGZiXHgwMlx4MDkiCisJCQkiXHgxMFx4MTdceDFlXHgyNVx4MmNceDMzXHgzYVx4NDEiCisJCQkiXHg0OFx4NGZceDU2XHg1ZFx4NjRceDZiXHg3Mlx4NzkiCisJCQkiXHg4MFx4ODdceDhlXHg5NVx4OWNceGEzXHhhYVx4YjEiCisJCQkiXHhiOFx4YmZceGM2XHhjZFx4ZDRceGRiXHhlMlx4ZTkiCisJCQkiXHhmMFx4ZjdceGZlXHgwNVx4MGNceDEzXHgxYVx4MjEiCisJCQkiXHgyOFx4MmZceDM2XHgzZFx4NDRceDRiXHg1Mlx4NTkiCisJCQkiXHg2MFx4NjdceDZlXHg3NVx4N2NceDgzXHg4YVx4OTEiCisJCQkiXHg5OFx4OWZceGE2XHhhZFx4YjRceGJiXHhjMlx4YzkiCisJCQkiXHhkMFx4ZDdceGRlXHhlNVx4ZWNceGYzXHhmYVx4MDEiCisJCQkiXHgwOFx4MGZceDE2XHgxZFx4MjRceDJiXHgzMlx4MzkiCisJCQkiXHg0MFx4NDdceDRlXHg1NVx4NWNceDYzXHg2YVx4NzEiCisJCQkiXHg3OFx4N2ZceDg2XHg4ZFx4OTRceDliXHhhMlx4YTkiCisJCQkiXHhiMFx4YjdceGJlXHhjNVx4Y2NceGQzXHhkYVx4ZTEiCisJCQkiXHhlOFx4ZWZceGY2XHhmZFx4MDRceDBiXHgxMlx4MTkiCisJCQkiXHgyMFx4MjdceDJlXHgzNVx4M2NceDQzXHg0YVx4NTEiCisJCQkiXHg1OFx4NWZceDY2XHg2ZFx4NzRceDdiXHg4Mlx4ODkiCisJCQkiXHg5MFx4OTdceDllXHhhNVx4YWNceGIzXHhiYVx4YzEiCisJCQkiXHhjOFx4Y2ZceGQ2XHhkZFx4ZTRceGViXHhmMlx4ZjkiCisJCQkiXHgwMFx4MDlceDEyXHgxYlx4MjRceDJkXHgzNlx4M2YiCisJCQkiXHg0OFx4NTFceDVhXHg2M1x4NmNceDc1XHg3ZVx4ODciCisJCQkiXHg5MFx4OTlceGEyXHhhYlx4YjRceGJkXHhjNlx4Y2YiCisJCQkiXHhkOFx4ZTFceGVhXHhmM1x4ZmNceDA1XHgwZVx4MTciCisJCQkiXHgyMFx4MjlceDMyXHgzYlx4NDRceDRkXHg1Nlx4NWYiCisJCQkiXHg2OFx4NzFceDdhXHg4M1x4OGNceDk1XHg5ZVx4YTciCisJCQkiXHhiMFx4YjlceGMyXHhjYlx4ZDRceGRkXHhlNlx4ZWYiCisJCQkiXHhmOFx4MDFceDBhXHgxM1x4MWNceDI1XHgyZVx4MzciCisJCQkiXHg0MFx4NDlceDUyXHg1Ylx4NjRceDZkXHg3Nlx4N2YiCisJCQkiXHg4OFx4OTFceDlhXHhhM1x4YWNceGI1XHhiZVx4YzciCisJCQkiXHhkMFx4ZDlceGUyXHhlYlx4ZjRceGZkXHgwNlx4MGYiCisJCQkiXHgxOFx4MjFceDJhXHgzM1x4M2NceDQ1XHg0ZVx4NTciCisJCQkiXHg2MFx4NjlceDcyXHg3Ylx4ODRceDhkXHg5Nlx4OWYiCisJCQkiXHhhOFx4YjFceGJhXHhjM1x4Y2NceGQ1XHhkZVx4ZTciCisJCQkiXHhmMFx4ZjlceDAyXHgwYlx4MTRceDFkXHgyNlx4MmYiCisJCQkiXHgzOFx4NDFceDRhXHg1M1x4NWNceDY1XHg2ZVx4NzciCisJCQkiXHg4MFx4ODlceDkyXHg5Ylx4YTRceGFkXHhiNlx4YmYiCisJCQkiXHhjOFx4ZDFceGRhXHhlM1x4ZWNceGY1XHhmZVx4MDciCisJCQkiXHgxMFx4MTlceDIyXHgyYlx4MzRceDNkXHg0Nlx4NGYiCisJCQkiXHg1OFx4NjFceDZhXHg3M1x4N2NceDg1XHg4ZVx4OTciCisJCQkiXHhhMFx4YTlceGIyXHhiYlx4YzRceGNkXHhkNlx4ZGYiCisJCQkiXHhlOFx4ZjFceGZhXHgwM1x4MGNceDE1XHgxZVx4MjciCisJCQkiXHgzMFx4MzlceDQyXHg0Ylx4NTRceDVkXHg2Nlx4NmYiCisJCQkiXHg3OFx4ODFceDhhXHg5M1x4OWNceGE1XHhhZVx4YjciCisJCQkiXHhjMFx4YzlceGQyXHhkYlx4ZTRceGVkXHhmNlx4ZmYiCisJCQkiXHgwOFx4MTFceDFhXHgyM1x4MmNceDM1XHgzZVx4NDciCisJCQkiXHg1MFx4NTlceDYyXHg2Ylx4NzRceDdkXHg4Nlx4OGYiCisJCQkiXHg5OFx4YTFceGFhXHhiM1x4YmNceGM1XHhjZVx4ZDciCisJCQkiXHhlMFx4ZTlceGYyXHhmYlx4MDRceDBkXHgxNlx4MWYiCisJCQkiXHgyOFx4MzFceDNhXHg0M1x4NGNceDU1XHg1ZVx4NjciCisJCQkiXHg3MFx4NzlceDgyXHg4Ylx4OTRceDlkXHhhNlx4YWYiCisJCQkiXHhiOFx4YzFceGNhXHhkM1x4ZGNceGU1XHhlZVx4ZjciCisJCQkiXHgwMFx4MGJceDE2XHgyMVx4MmNceDM3XHg0Mlx4NGQiCisJCQkiXHg1OFx4NjNceDZlXHg3OVx4ODRceDhmXHg5YVx4YTUiCisJCQkiXHhiMFx4YmJceGM2XHhkMVx4ZGNceGU3XHhmMlx4ZmQiCisJCQkiXHgwOFx4MTNceDFlXHgyOVx4MzRceDNmXHg0YVx4NTUiCisJCQkiXHg2MFx4NmJceDc2XHg4MVx4OGNceDk3XHhhMlx4YWQiCisJCQkiXHhiOFx4YzNceGNlXHhkOVx4ZTRceGVmXHhmYVx4MDUiCisJCQkiXHgxMFx4MWJceDI2XHgzMVx4M2NceDQ3XHg1Mlx4NWQiCisJCQkiXHg2OFx4NzNceDdlXHg4OVx4OTRceDlmXHhhYVx4YjUiCisJCQkiXHhjMFx4Y2JceGQ2XHhlMVx4ZWNceGY3XHgwMlx4MGQiCisJCQkiXHgxOFx4MjNceDJlXHgzOVx4NDRceDRmXHg1YVx4NjUiCisJCQkiXHg3MFx4N2JceDg2XHg5MVx4OWNceGE3XHhiMlx4YmQiCisJCQkiXHhjOFx4ZDNceGRlXHhlOVx4ZjRceGZmXHgwYVx4MTUiCisJCQkiXHgyMFx4MmJceDM2XHg0MVx4NGNceDU3XHg2Mlx4NmQiCisJCQkiXHg3OFx4ODNceDhlXHg5OVx4YTRceGFmXHhiYVx4YzUiCisJCQkiXHhkMFx4ZGJceGU2XHhmMVx4ZmNceDA3XHgxMlx4MWQiCisJCQkiXHgyOFx4MzNceDNlXHg0OVx4NTRceDVmXHg2YVx4NzUiCisJCQkiXHg4MFx4OGJceDk2XHhhMVx4YWNceGI3XHhjMlx4Y2QiCisJCQkiXHhkOFx4ZTNceGVlXHhmOVx4MDRceDBmXHgxYVx4MjUiCisJCQkiXHgzMFx4M2JceDQ2XHg1MVx4NWNceDY3XHg3Mlx4N2QiCisJCQkiXHg4OFx4OTNceDllXHhhOVx4YjRceGJmXHhjYVx4ZDUiCisJCQkiXHhlMFx4ZWJceGY2XHgwMVx4MGNceDE3XHgyMlx4MmQiCisJCQkiXHgzOFx4NDNceDRlXHg1OVx4NjRceDZmXHg3YVx4ODUiCisJCQkiXHg5MFx4OWJceGE2XHhiMVx4YmNceGM3XHhkMlx4ZGQiCisJCQkiXHhlOFx4ZjNceGZlXHgwOVx4MTRceDFmXHgyYVx4MzUiCisJCQkiXHg0MFx4NGJceDU2XHg2MVx4NmNceDc3XHg4Mlx4OGQiCisJCQkiXHg5OFx4YTNceGFlXHhiOVx4YzRceGNmXHhkYVx4ZTUiCisJCQkiXHhmMFx4ZmJceDA2XHgxMVx4MWNceDI3XHgzMlx4M2QiCisJCQkiXHg0OFx4NTNceDVlXHg2OVx4NzRceDdmXHg4YVx4OTUiCisJCQkiXHhhMFx4YWJceGI2XHhjMVx4Y2NceGQ3XHhlMlx4ZWQiCisJCQkiXHhmOFx4MDNceDBlXHgxOVx4MjRceDJmXHgzYVx4NDUiCisJCQkiXHg1MFx4NWJceDY2XHg3MVx4N2NceDg3XHg5Mlx4OWQiCisJCQkiXHhhOFx4YjNceGJlXHhjOVx4ZDRceGRmXHhlYVx4ZjUiCisJCQkiXHgwMFx4MGRceDFhXHgyN1x4MzRceDQxXHg0ZVx4NWIiCisJCQkiXHg2OFx4NzVceDgyXHg4Zlx4OWNceGE5XHhiNlx4YzMiCisJCQkiXHhkMFx4ZGRceGVhXHhmN1x4MDRceDExXHgxZVx4MmIiCisJCQkiXHgzOFx4NDVceDUyXHg1Zlx4NmNceDc5XHg4Nlx4OTMiCisJCQkiXHhhMFx4YWRceGJhXHhjN1x4ZDRceGUxXHhlZVx4ZmIiCisJCQkiXHgwOFx4MTVceDIyXHgyZlx4M2NceDQ5XHg1Nlx4NjMiCisJCQkiXHg3MFx4N2RceDhhXHg5N1x4YTRceGIxXHhiZVx4Y2IiCisJCQkiXHhkOFx4ZTVceGYyXHhmZlx4MGNceDE5XHgyNlx4MzMiCisJCQkiXHg0MFx4NGRceDVhXHg2N1x4NzRceDgxXHg4ZVx4OWIiCisJCQkiXHhhOFx4YjVceGMyXHhjZlx4ZGNceGU5XHhmNlx4MDMiCisJCQkiXHgxMFx4MWRceDJhXHgzN1x4NDRceDUxXHg1ZVx4NmIiCisJCQkiXHg3OFx4ODVceDkyXHg5Zlx4YWNceGI5XHhjNlx4ZDMiCisJCQkiXHhlMFx4ZWRceGZhXHgwN1x4MTRceDIxXHgyZVx4M2IiCisJCQkiXHg0OFx4NTVceDYyXHg2Zlx4N2NceDg5XHg5Nlx4YTMiCisJCQkiXHhiMFx4YmRceGNhXHhkN1x4ZTRceGYxXHhmZVx4MGIiCisJCQkiXHgxOFx4MjVceDMyXHgzZlx4NGNceDU5XHg2Nlx4NzMiCisJCQkiXHg4MFx4OGRceDlhXHhhN1x4YjRceGMxXHhjZVx4ZGIiCisJCQkiXHhlOFx4ZjVceDAyXHgwZlx4MWNceDI5XHgzNlx4NDMiCisJCQkiXHg1MFx4NWRceDZhXHg3N1x4ODRceDkxXHg5ZVx4YWIiCisJCQkiXHhiOFx4YzVceGQyXHhkZlx4ZWNceGY5XHgwNlx4MTMiCisJCQkiXHgyMFx4MmRceDNhXHg0N1x4NTRceDYxXHg2ZVx4N2IiCisJCQkiXHg4OFx4OTVceGEyXHhhZlx4YmNceGM5XHhkNlx4ZTMiCisJCQkiXHhmMFx4ZmRceDBhXHgxN1x4MjRceDMxXHgzZVx4NGIiCisJCQkiXHg1OFx4NjVceDcyXHg3Zlx4OGNceDk5XHhhNlx4YjMiCisJCQkiXHhjMFx4Y2RceGRhXHhlN1x4ZjRceDAxXHgwZVx4MWIiCisJCQkiXHgyOFx4MzVceDQyXHg0Zlx4NWNceDY5XHg3Nlx4ODMiCisJCQkiXHg5MFx4OWRceGFhXHhiN1x4YzRceGQxXHhkZVx4ZWIiCisJCQkiXHhmOFx4MDVceDEyXHgxZlx4MmNceDM5XHg0Nlx4NTMiCisJCQkiXHg2MFx4NmRceDdhXHg4N1x4OTRceGExXHhhZVx4YmIiCisJCQkiXHhjOFx4ZDVceGUyXHhlZlx4ZmNceDA5XHgxNlx4MjMiCisJCQkiXHgzMFx4M2RceDRhXHg1N1x4NjRceDcxXHg3ZVx4OGIiCisJCQkiXHg5OFx4YTVceGIyXHhiZlx4Y2NceGQ5XHhlNlx4ZjMiCisJCQkiXHgwMFx4MGZceDFlXHgyZFx4M2NceDRiXHg1YVx4NjkiCisJCQkiXHg3OFx4ODdceDk2XHhhNVx4YjRceGMzXHhkMlx4ZTEiCisJCQkiXHhmMFx4ZmZceDBlXHgxZFx4MmNceDNiXHg0YVx4NTkiCisJCQkiXHg2OFx4NzdceDg2XHg5NVx4YTRceGIzXHhjMlx4ZDEiCisJCQkiXHhlMFx4ZWZceGZlXHgwZFx4MWNceDJiXHgzYVx4NDkiCisJCQkiXHg1OFx4NjdceDc2XHg4NVx4OTRceGEzXHhiMlx4YzEiCisJCQkiXHhkMFx4ZGZceGVlXHhmZFx4MGNceDFiXHgyYVx4MzkiCisJCQkiXHg0OFx4NTdceDY2XHg3NVx4ODRceDkzXHhhMlx4YjEiCisJCQkiXHhjMFx4Y2ZceGRlXHhlZFx4ZmNceDBiXHgxYVx4MjkiCisJCQkiXHgzOFx4NDdceDU2XHg2NVx4NzRceDgzXHg5Mlx4YTEiCisJCQkiXHhiMFx4YmZceGNlXHhkZFx4ZWNceGZiXHgwYVx4MTkiCisJCQkiXHgyOFx4MzdceDQ2XHg1NVx4NjRceDczXHg4Mlx4OTEiCisJCQkiXHhhMFx4YWZceGJlXHhjZFx4ZGNceGViXHhmYVx4MDkiCisJCQkiXHgxOFx4MjdceDM2XHg0NVx4NTRceDYzXHg3Mlx4ODEiCisJCQkiXHg5MFx4OWZceGFlXHhiZFx4Y2NceGRiXHhlYVx4ZjkiCisJCQkiXHgwOFx4MTdceDI2XHgzNVx4NDRceDUzXHg2Mlx4NzEiCisJCQkiXHg4MFx4OGZceDllXHhhZFx4YmNceGNiXHhkYVx4ZTkiCisJCQkiXHhmOFx4MDdceDE2XHgyNVx4MzRceDQzXHg1Mlx4NjEiCisJCQkiXHg3MFx4N2ZceDhlXHg5ZFx4YWNceGJiXHhjYVx4ZDkiCisJCQkiXHhlOFx4ZjdceDA2XHgxNVx4MjRceDMzXHg0Mlx4NTEiCisJCQkiXHg2MFx4NmZceDdlXHg4ZFx4OWNceGFiXHhiYVx4YzkiCisJCQkiXHhkOFx4ZTdceGY2XHgwNVx4MTRceDIzXHgzMlx4NDEiCisJCQkiXHg1MFx4NWZceDZlXHg3ZFx4OGNceDliXHhhYVx4YjkiCisJCQkiXHhjOFx4ZDdceGU2XHhmNVx4MDRceDEzXHgyMlx4MzEiCisJCQkiXHg0MFx4NGZceDVlXHg2ZFx4N2NceDhiXHg5YVx4YTkiCisJCQkiXHhiOFx4YzdceGQ2XHhlNVx4ZjRceDAzXHgxMlx4MjEiCisJCQkiXHgzMFx4M2ZceDRlXHg1ZFx4NmNceDdiXHg4YVx4OTkiCisJCQkiXHhhOFx4YjdceGM2XHhkNVx4ZTRceGYzXHgwMlx4MTEiCisJCQkiXHgyMFx4MmZceDNlXHg0ZFx4NWNceDZiXHg3YVx4ODkiCisJCQkiXHg5OFx4YTdceGI2XHhjNVx4ZDRceGUzXHhmMlx4MDEiCisJCQkiXHgxMFx4MWZceDJlXHgzZFx4NGNceDViXHg2YVx4NzkiCisJCQkiXHg4OFx4OTdceGE2XHhiNVx4YzRceGQzXHhlMlx4ZjEiCisJCQkiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCisJCQkiXHg4OFx4OTlceGFhXHhiYlx4Y2NceGRkXHhlZVx4ZmYiCisJCQkiXHgxMFx4MjFceDMyXHg0M1x4NTRceDY1XHg3Nlx4ODciCisJCQkiXHg5OFx4YTlceGJhXHhjYlx4ZGNceGVkXHhmZVx4MGYiCisJCQkiXHgyMFx4MzFceDQyXHg1M1x4NjRceDc1XHg4Nlx4OTciCisJCQkiXHhhOFx4YjlceGNhXHhkYlx4ZWNceGZkXHgwZVx4MWYiCisJCQkiXHgzMFx4NDFceDUyXHg2M1x4NzRceDg1XHg5Nlx4YTciCisJCQkiXHhiOFx4YzlceGRhXHhlYlx4ZmNceDBkXHgxZVx4MmYiCisJCQkiXHg0MFx4NTFceDYyXHg3M1x4ODRceDk1XHhhNlx4YjciCisJCQkiXHhjOFx4ZDlceGVhXHhmYlx4MGNceDFkXHgyZVx4M2YiCisJCQkiXHg1MFx4NjFceDcyXHg4M1x4OTRceGE1XHhiNlx4YzciCisJCQkiXHhkOFx4ZTlceGZhXHgwYlx4MWNceDJkXHgzZVx4NGYiCisJCQkiXHg2MFx4NzFceDgyXHg5M1x4YTRceGI1XHhjNlx4ZDciCisJCQkiXHhlOFx4ZjlceDBhXHgxYlx4MmNceDNkXHg0ZVx4NWYiCisJCQkiXHg3MFx4ODFceDkyXHhhM1x4YjRceGM1XHhkNlx4ZTciCisJCQkiXHhmOFx4MDlceDFhXHgyYlx4M2NceDRkXHg1ZVx4NmYiCisJCQkiXHg4MFx4OTFceGEyXHhiM1x4YzRceGQ1XHhlNlx4ZjciCisJCQkiXHgwOFx4MTlceDJhXHgzYlx4NGNceDVkXHg2ZVx4N2YiCisJCQkiXHg5MFx4YTFceGIyXHhjM1x4ZDRceGU1XHhmNlx4MDciCisJCQkiXHgxOFx4MjlceDNhXHg0Ylx4NWNceDZkXHg3ZVx4OGYiCisJCQkiXHhhMFx4YjFceGMyXHhkM1x4ZTRceGY1XHgwNlx4MTciCisJCQkiXHgyOFx4MzlceDRhXHg1Ylx4NmNceDdkXHg4ZVx4OWYiCisJCQkiXHhiMFx4YzFceGQyXHhlM1x4ZjRceDA1XHgxNlx4MjciCisJCQkiXHgzOFx4NDlceDVhXHg2Ylx4N2NceDhkXHg5ZVx4YWYiCisJCQkiXHhjMFx4ZDFceGUyXHhmM1x4MDRceDE1XHgyNlx4MzciCisJCQkiXHg0OFx4NTlceDZhXHg3Ylx4OGNceDlkXHhhZVx4YmYiCisJCQkiXHhkMFx4ZTFceGYyXHgwM1x4MTRceDI1XHgzNlx4NDciCisJCQkiXHg1OFx4NjlceDdhXHg4Ylx4OWNceGFkXHhiZVx4Y2YiCisJCQkiXHhlMFx4ZjFceDAyXHgxM1x4MjRceDM1XHg0Nlx4NTciCisJCQkiXHg2OFx4NzlceDhhXHg5Ylx4YWNceGJkXHhjZVx4ZGYiCisJCQkiXHhmMFx4MDFceDEyXHgyM1x4MzRceDQ1XHg1Nlx4NjciCisJCQkiXHg3OFx4ODlceDlhXHhhYlx4YmNceGNkXHhkZVx4ZWYiCisJCQkiXHgwMFx4MTNceDI2XHgzOVx4NGNceDVmXHg3Mlx4ODUiCisJCQkiXHg5OFx4YWJceGJlXHhkMVx4ZTRceGY3XHgwYVx4MWQiCisJCQkiXHgzMFx4NDNceDU2XHg2OVx4N2NceDhmXHhhMlx4YjUiCisJCQkiXHhjOFx4ZGJceGVlXHgwMVx4MTRceDI3XHgzYVx4NGQiCisJCQkiXHg2MFx4NzNceDg2XHg5OVx4YWNceGJmXHhkMlx4ZTUiCisJCQkiXHhmOFx4MGJceDFlXHgzMVx4NDRceDU3XHg2YVx4N2QiCisJCQkiXHg5MFx4YTNceGI2XHhjOVx4ZGNceGVmXHgwMlx4MTUiCisJCQkiXHgyOFx4M2JceDRlXHg2MVx4NzRceDg3XHg5YVx4YWQiCisJCQkiXHhjMFx4ZDNceGU2XHhmOVx4MGNceDFmXHgzMlx4NDUiCisJCQkiXHg1OFx4NmJceDdlXHg5MVx4YTRceGI3XHhjYVx4ZGQiCisJCQkiXHhmMFx4MDNceDE2XHgyOVx4M2NceDRmXHg2Mlx4NzUiCisJCQkiXHg4OFx4OWJceGFlXHhjMVx4ZDRceGU3XHhmYVx4MGQiCisJCQkiXHgyMFx4MzNceDQ2XHg1OVx4NmNceDdmXHg5Mlx4YTUiCisJCQkiXHhiOFx4Y2JceGRlXHhmMVx4MDRceDE3XHgyYVx4M2QiCisJCQkiXHg1MFx4NjNceDc2XHg4OVx4OWNceGFmXHhjMlx4ZDUiCisJCQkiXHhlOFx4ZmJceDBlXHgyMVx4MzRceDQ3XHg1YVx4NmQiCisJCQkiXHg4MFx4OTNceGE2XHhiOVx4Y2NceGRmXHhmMlx4MDUiCisJCQkiXHgxOFx4MmJceDNlXHg1MVx4NjRceDc3XHg4YVx4OWQiCisJCQkiXHhiMFx4YzNceGQ2XHhlOVx4ZmNceDBmXHgyMlx4MzUiCisJCQkiXHg0OFx4NWJceDZlXHg4MVx4OTRceGE3XHhiYVx4Y2QiCisJCQkiXHhlMFx4ZjNceDA2XHgxOVx4MmNceDNmXHg1Mlx4NjUiCisJCQkiXHg3OFx4OGJceDllXHhiMVx4YzRceGQ3XHhlYVx4ZmQiCisJCQkiXHgxMFx4MjNceDM2XHg0OVx4NWNceDZmXHg4Mlx4OTUiCisJCQkiXHhhOFx4YmJceGNlXHhlMVx4ZjRceDA3XHgxYVx4MmQiCisJCQkiXHg0MFx4NTNceDY2XHg3OVx4OGNceDlmXHhiMlx4YzUiCisJCQkiXHhkOFx4ZWJceGZlXHgxMVx4MjRceDM3XHg0YVx4NWQiCisJCQkiXHg3MFx4ODNceDk2XHhhOVx4YmNceGNmXHhlMlx4ZjUiCisJCQkiXHgwOFx4MWJceDJlXHg0MVx4NTRceDY3XHg3YVx4OGQiCisJCQkiXHhhMFx4YjNceGM2XHhkOVx4ZWNceGZmXHgxMlx4MjUiCisJCQkiXHgzOFx4NGJceDVlXHg3MVx4ODRceDk3XHhhYVx4YmQiCisJCQkiXHhkMFx4ZTNceGY2XHgwOVx4MWNceDJmXHg0Mlx4NTUiCisJCQkiXHg2OFx4N2JceDhlXHhhMVx4YjRceGM3XHhkYVx4ZWQiCisJCQkiXHgwMFx4MTVceDJhXHgzZlx4NTRceDY5XHg3ZVx4OTMiCisJCQkiXHhhOFx4YmRceGQyXHhlN1x4ZmNceDExXHgyNlx4M2IiCisJCQkiXHg1MFx4NjVceDdhXHg4Zlx4YTRceGI5XHhjZVx4ZTMiCisJCQkiXHhmOFx4MGRceDIyXHgzN1x4NGNceDYxXHg3Nlx4OGIiCisJCQkiXHhhMFx4YjVceGNhXHhkZlx4ZjRceDA5XHgxZVx4MzMiCisJCQkiXHg0OFx4NWRceDcyXHg4N1x4OWNceGIxXHhjNlx4ZGIiCisJCQkiXHhmMFx4MDVceDFhXHgyZlx4NDRceDU5XHg2ZVx4ODMiCisJCQkiXHg5OFx4YWRceGMyXHhkN1x4ZWNceDAxXHgxNlx4MmIiCisJCQkiXHg0MFx4NTVceDZhXHg3Zlx4OTRceGE5XHhiZVx4ZDMiCisJCQkiXHhlOFx4ZmRceDEyXHgyN1x4M2NceDUxXHg2Nlx4N2IiCisJCQkiXHg5MFx4YTVceGJhXHhjZlx4ZTRceGY5XHgwZVx4MjMiCisJCQkiXHgzOFx4NGRceDYyXHg3N1x4OGNceGExXHhiNlx4Y2IiCisJCQkiXHhlMFx4ZjVceDBhXHgxZlx4MzRceDQ5XHg1ZVx4NzMiCisJCQkiXHg4OFx4OWRceGIyXHhjN1x4ZGNceGYxXHgwNlx4MWIiCisJCQkiXHgzMFx4NDVceDVhXHg2Zlx4ODRceDk5XHhhZVx4YzMiCisJCQkiXHhkOFx4ZWRceDAyXHgxN1x4MmNceDQxXHg1Nlx4NmIiCisJCQkiXHg4MFx4OTVceGFhXHhiZlx4ZDRceGU5XHhmZVx4MTMiCisJCQkiXHgyOFx4M2RceDUyXHg2N1x4N2NceDkxXHhhNlx4YmIiCisJCQkiXHhkMFx4ZTVceGZhXHgwZlx4MjRceDM5XHg0ZVx4NjMiCisJCQkiXHg3OFx4OGRceGEyXHhiN1x4Y2NceGUxXHhmNlx4MGIiCisJCQkiXHgyMFx4MzVceDRhXHg1Zlx4NzRceDg5XHg5ZVx4YjMiCisJCQkiXHhjOFx4ZGRceGYyXHgwN1x4MWNceDMxXHg0Nlx4NWIiCisJCQkiXHg3MFx4ODVceDlhXHhhZlx4YzRceGQ5XHhlZVx4MDMiCisJCQkiXHgxOFx4MmRceDQyXHg1N1x4NmNceDgxXHg5Nlx4YWIiCisJCQkiXHhjMFx4ZDVceGVhXHhmZlx4MTRceDI5XHgzZVx4NTMiCisJCQkiXHg2OFx4N2RceDkyXHhhN1x4YmNceGQxXHhlNlx4ZmIiCisJCQkiXHgxMFx4MjVceDNhXHg0Zlx4NjRceDc5XHg4ZVx4YTMiCisJCQkiXHhiOFx4Y2RceGUyXHhmN1x4MGNceDIxXHgzNlx4NGIiCisJCQkiXHg2MFx4NzVceDhhXHg5Zlx4YjRceGM5XHhkZVx4ZjMiCisJCQkiXHgwOFx4MWRceDMyXHg0N1x4NWNceDcxXHg4Nlx4OWIiCisJCQkiXHhiMFx4YzVceGRhXHhlZlx4MDRceDE5XHgyZVx4NDMiCisJCQkiXHg1OFx4NmRceDgyXHg5N1x4YWNceGMxXHhkNlx4ZWIiCisJCQkiXHgwMFx4MTdceDJlXHg0NVx4NWNceDczXHg4YVx4YTEiCisJCQkiXHhiOFx4Y2ZceGU2XHhmZFx4MTRceDJiXHg0Mlx4NTkiCisJCQkiXHg3MFx4ODdceDllXHhiNVx4Y2NceGUzXHhmYVx4MTEiCisJCQkiXHgyOFx4M2ZceDU2XHg2ZFx4ODRceDliXHhiMlx4YzkiCisJCQkiXHhlMFx4ZjdceDBlXHgyNVx4M2NceDUzXHg2YVx4ODEiCisJCQkiXHg5OFx4YWZceGM2XHhkZFx4ZjRceDBiXHgyMlx4MzkiCisJCQkiXHg1MFx4NjdceDdlXHg5NVx4YWNceGMzXHhkYVx4ZjEiCisJCQkiXHgwOFx4MWZceDM2XHg0ZFx4NjRceDdiXHg5Mlx4YTkiCisJCQkiXHhjMFx4ZDdceGVlXHgwNVx4MWNceDMzXHg0YVx4NjEiCisJCQkiXHg3OFx4OGZceGE2XHhiZFx4ZDRceGViXHgwMlx4MTkiCisJCQkiXHgzMFx4NDdceDVlXHg3NVx4OGNceGEzXHhiYVx4ZDEiCisJCQkiXHhlOFx4ZmZceDE2XHgyZFx4NDRceDViXHg3Mlx4ODkiCisJCQkiXHhhMFx4YjdceGNlXHhlNVx4ZmNceDEzXHgyYVx4NDEiCisJCQkiXHg1OFx4NmZceDg2XHg5ZFx4YjRceGNiXHhlMlx4ZjkiCisJCQkiXHgxMFx4MjdceDNlXHg1NVx4NmNceDgzXHg5YVx4YjEiCisJCQkiXHhjOFx4ZGZceGY2XHgwZFx4MjRceDNiXHg1Mlx4NjkiCisJCQkiXHg4MFx4OTdceGFlXHhjNVx4ZGNceGYzXHgwYVx4MjEiCisJCQkiXHgzOFx4NGZceDY2XHg3ZFx4OTRceGFiXHhjMlx4ZDkiCisJCQkiXHhmMFx4MDdceDFlXHgzNVx4NGNceDYzXHg3YVx4OTEiCisJCQkiXHhhOFx4YmZceGQ2XHhlZFx4MDRceDFiXHgzMlx4NDkiCisJCQkiXHg2MFx4NzdceDhlXHhhNVx4YmNceGQzXHhlYVx4MDEiCisJCQkiXHgxOFx4MmZceDQ2XHg1ZFx4NzRceDhiXHhhMlx4YjkiCisJCQkiXHhkMFx4ZTdceGZlXHgxNVx4MmNceDQzXHg1YVx4NzEiCisJCQkiXHg4OFx4OWZceGI2XHhjZFx4ZTRceGZiXHgxMlx4MjkiCisJCQkiXHg0MFx4NTdceDZlXHg4NVx4OWNceGIzXHhjYVx4ZTEiCisJCQkiXHhmOFx4MGZceDI2XHgzZFx4NTRceDZiXHg4Mlx4OTkiCisJCQkiXHhiMFx4YzdceGRlXHhmNVx4MGNceDIzXHgzYVx4NTEiCisJCQkiXHg2OFx4N2ZceDk2XHhhZFx4YzRceGRiXHhmMlx4MDkiCisJCQkiXHgyMFx4MzdceDRlXHg2NVx4N2NceDkzXHhhYVx4YzEiCisJCQkiXHhkOFx4ZWZceDA2XHgxZFx4MzRceDRiXHg2Mlx4NzkiCisJCQkiXHg5MFx4YTdceGJlXHhkNVx4ZWNceDAzXHgxYVx4MzEiCisJCQkiXHg0OFx4NWZceDc2XHg4ZFx4YTRceGJiXHhkMlx4ZTkiCisJCQkiXHgwMFx4MTlceDMyXHg0Ylx4NjRceDdkXHg5Nlx4YWYiCisJCQkiXHhjOFx4ZTFceGZhXHgxM1x4MmNceDQ1XHg1ZVx4NzciCisJCQkiXHg5MFx4YTlceGMyXHhkYlx4ZjRceDBkXHgyNlx4M2YiCisJCQkiXHg1OFx4NzFceDhhXHhhM1x4YmNceGQ1XHhlZVx4MDciCisJCQkiXHgyMFx4MzlceDUyXHg2Ylx4ODRceDlkXHhiNlx4Y2YiCisJCQkiXHhlOFx4MDFceDFhXHgzM1x4NGNceDY1XHg3ZVx4OTciCisJCQkiXHhiMFx4YzlceGUyXHhmYlx4MTRceDJkXHg0Nlx4NWYiCisJCQkiXHg3OFx4OTFceGFhXHhjM1x4ZGNceGY1XHgwZVx4MjciCisJCQkiXHg0MFx4NTlceDcyXHg4Ylx4YTRceGJkXHhkNlx4ZWYiCisJCQkiXHgwOFx4MjFceDNhXHg1M1x4NmNceDg1XHg5ZVx4YjciCisJCQkiXHhkMFx4ZTlceDAyXHgxYlx4MzRceDRkXHg2Nlx4N2YiCisJCQkiXHg5OFx4YjFceGNhXHhlM1x4ZmNceDE1XHgyZVx4NDciCisJCQkiXHg2MFx4NzlceDkyXHhhYlx4YzRceGRkXHhmNlx4MGYiCisJCQkiXHgyOFx4NDFceDVhXHg3M1x4OGNceGE1XHhiZVx4ZDciCisJCQkiXHhmMFx4MDlceDIyXHgzYlx4NTRceDZkXHg4Nlx4OWYiCisJCQkiXHhiOFx4ZDFceGVhXHgwM1x4MWNceDM1XHg0ZVx4NjciCisJCQkiXHg4MFx4OTlceGIyXHhjYlx4ZTRceGZkXHgxNlx4MmYiCisJCQkiXHg0OFx4NjFceDdhXHg5M1x4YWNceGM1XHhkZVx4ZjciCisJCQkiXHgxMFx4MjlceDQyXHg1Ylx4NzRceDhkXHhhNlx4YmYiCisJCQkiXHhkOFx4ZjFceDBhXHgyM1x4M2NceDU1XHg2ZVx4ODciCisJCQkiXHhhMFx4YjlceGQyXHhlYlx4MDRceDFkXHgzNlx4NGYiCisJCQkiXHg2OFx4ODFceDlhXHhiM1x4Y2NceGU1XHhmZVx4MTciCisJCQkiXHgzMFx4NDlceDYyXHg3Ylx4OTRceGFkXHhjNlx4ZGYiCisJCQkiXHhmOFx4MTFceDJhXHg0M1x4NWNceDc1XHg4ZVx4YTciCisJCQkiXHhjMFx4ZDlceGYyXHgwYlx4MjRceDNkXHg1Nlx4NmYiCisJCQkiXHg4OFx4YTFceGJhXHhkM1x4ZWNceDA1XHgxZVx4MzciCisJCQkiXHg1MFx4NjlceDgyXHg5Ylx4YjRceGNkXHhlNlx4ZmYiCisJCQkiXHgxOFx4MzFceDRhXHg2M1x4N2NceDk1XHhhZVx4YzciCisJCQkiXHhlMFx4ZjlceDEyXHgyYlx4NDRceDVkXHg3Nlx4OGYiCisJCQkiXHhhOFx4YzFceGRhXHhmM1x4MGNceDI1XHgzZVx4NTciCisJCQkiXHg3MFx4ODlceGEyXHhiYlx4ZDRceGVkXHgwNlx4MWYiCisJCQkiXHgzOFx4NTFceDZhXHg4M1x4OWNceGI1XHhjZVx4ZTciCisJCQkiXHgwMFx4MWJceDM2XHg1MVx4NmNceDg3XHhhMlx4YmQiCisJCQkiXHhkOFx4ZjNceDBlXHgyOVx4NDRceDVmXHg3YVx4OTUiCisJCQkiXHhiMFx4Y2JceGU2XHgwMVx4MWNceDM3XHg1Mlx4NmQiCisJCQkiXHg4OFx4YTNceGJlXHhkOVx4ZjRceDBmXHgyYVx4NDUiCisJCQkiXHg2MFx4N2JceDk2XHhiMVx4Y2NceGU3XHgwMlx4MWQiCisJCQkiXHgzOFx4NTNceDZlXHg4OVx4YTRceGJmXHhkYVx4ZjUiCisJCQkiXHgxMFx4MmJceDQ2XHg2MVx4N2NceDk3XHhiMlx4Y2QiCisJCQkiXHhlOFx4MDNceDFlXHgzOVx4NTRceDZmXHg4YVx4YTUiCisJCQkiXHhjMFx4ZGJceGY2XHgxMVx4MmNceDQ3XHg2Mlx4N2QiCisJCQkiXHg5OFx4YjNceGNlXHhlOVx4MDRceDFmXHgzYVx4NTUiCisJCQkiXHg3MFx4OGJceGE2XHhjMVx4ZGNceGY3XHgxMlx4MmQiCisJCQkiXHg0OFx4NjNceDdlXHg5OVx4YjRceGNmXHhlYVx4MDUiCisJCQkiXHgyMFx4M2JceDU2XHg3MVx4OGNceGE3XHhjMlx4ZGQiCisJCQkiXHhmOFx4MTNceDJlXHg0OVx4NjRceDdmXHg5YVx4YjUiCisJCQkiXHhkMFx4ZWJceDA2XHgyMVx4M2NceDU3XHg3Mlx4OGQiCisJCQkiXHhhOFx4YzNceGRlXHhmOVx4MTRceDJmXHg0YVx4NjUiCisJCQkiXHg4MFx4OWJceGI2XHhkMVx4ZWNceDA3XHgyMlx4M2QiCisJCQkiXHg1OFx4NzNceDhlXHhhOVx4YzRceGRmXHhmYVx4MTUiCisJCQkiXHgzMFx4NGJceDY2XHg4MVx4OWNceGI3XHhkMlx4ZWQiCisJCQkiXHgwOFx4MjNceDNlXHg1OVx4NzRceDhmXHhhYVx4YzUiCisJCQkiXHhlMFx4ZmJceDE2XHgzMVx4NGNceDY3XHg4Mlx4OWQiCisJCQkiXHhiOFx4ZDNceGVlXHgwOVx4MjRceDNmXHg1YVx4NzUiCisJCQkiXHg5MFx4YWJceGM2XHhlMVx4ZmNceDE3XHgzMlx4NGQiCisJCQkiXHg2OFx4ODNceDllXHhiOVx4ZDRceGVmXHgwYVx4MjUiCisJCQkiXHg0MFx4NWJceDc2XHg5MVx4YWNceGM3XHhlMlx4ZmQiCisJCQkiXHgxOFx4MzNceDRlXHg2OVx4ODRceDlmXHhiYVx4ZDUiCisJCQkiXHhmMFx4MGJceDI2XHg0MVx4NWNceDc3XHg5Mlx4YWQiCisJCQkiXHhjOFx4ZTNceGZlXHgxOVx4MzRceDRmXHg2YVx4ODUiCisJCQkiXHhhMFx4YmJceGQ2XHhmMVx4MGNceDI3XHg0Mlx4NWQiCisJCQkiXHg3OFx4OTNceGFlXHhjOVx4ZTRceGZmXHgxYVx4MzUiCisJCQkiXHg1MFx4NmJceDg2XHhhMVx4YmNceGQ3XHhmMlx4MGQiCisJCQkiXHgyOFx4NDNceDVlXHg3OVx4OTRceGFmXHhjYVx4ZTUiCisJCQkiXHgwMFx4MWRceDNhXHg1N1x4NzRceDkxXHhhZVx4Y2IiCisJCQkiXHhlOFx4MDVceDIyXHgzZlx4NWNceDc5XHg5Nlx4YjMiCisJCQkiXHhkMFx4ZWRceDBhXHgyN1x4NDRceDYxXHg3ZVx4OWIiCisJCQkiXHhiOFx4ZDVceGYyXHgwZlx4MmNceDQ5XHg2Nlx4ODMiCisJCQkiXHhhMFx4YmRceGRhXHhmN1x4MTRceDMxXHg0ZVx4NmIiCisJCQkiXHg4OFx4YTVceGMyXHhkZlx4ZmNceDE5XHgzNlx4NTMiCisJCQkiXHg3MFx4OGRceGFhXHhjN1x4ZTRceDAxXHgxZVx4M2IiCisJCQkiXHg1OFx4NzVceDkyXHhhZlx4Y2NceGU5XHgwNlx4MjMiCisJCQkiXHg0MFx4NWRceDdhXHg5N1x4YjRceGQxXHhlZVx4MGIiCisJCQkiXHgyOFx4NDVceDYyXHg3Zlx4OWNceGI5XHhkNlx4ZjMiCisJCQkiXHgxMFx4MmRceDRhXHg2N1x4ODRceGExXHhiZVx4ZGIiCisJCQkiXHhmOFx4MTVceDMyXHg0Zlx4NmNceDg5XHhhNlx4YzMiCisJCQkiXHhlMFx4ZmRceDFhXHgzN1x4NTRceDcxXHg4ZVx4YWIiCisJCQkiXHhjOFx4ZTVceDAyXHgxZlx4M2NceDU5XHg3Nlx4OTMiCisJCQkiXHhiMFx4Y2RceGVhXHgwN1x4MjRceDQxXHg1ZVx4N2IiCisJCQkiXHg5OFx4YjVceGQyXHhlZlx4MGNceDI5XHg0Nlx4NjMiCisJCQkiXHg4MFx4OWRceGJhXHhkN1x4ZjRceDExXHgyZVx4NGIiCisJCQkiXHg2OFx4ODVceGEyXHhiZlx4ZGNceGY5XHgxNlx4MzMiCisJCQkiXHg1MFx4NmRceDhhXHhhN1x4YzRceGUxXHhmZVx4MWIiCisJCQkiXHgzOFx4NTVceDcyXHg4Zlx4YWNceGM5XHhlNlx4MDMiCisJCQkiXHgyMFx4M2RceDVhXHg3N1x4OTRceGIxXHhjZVx4ZWIiCisJCQkiXHgwOFx4MjVceDQyXHg1Zlx4N2NceDk5XHhiNlx4ZDMiCisJCQkiXHhmMFx4MGRceDJhXHg0N1x4NjRceDgxXHg5ZVx4YmIiCisJCQkiXHhkOFx4ZjVceDEyXHgyZlx4NGNceDY5XHg4Nlx4YTMiCisJCQkiXHhjMFx4ZGRceGZhXHgxN1x4MzRceDUxXHg2ZVx4OGIiCisJCQkiXHhhOFx4YzVceGUyXHhmZlx4MWNceDM5XHg1Nlx4NzMiCisJCQkiXHg5MFx4YWRceGNhXHhlN1x4MDRceDIxXHgzZVx4NWIiCisJCQkiXHg3OFx4OTVceGIyXHhjZlx4ZWNceDA5XHgyNlx4NDMiCisJCQkiXHg2MFx4N2RceDlhXHhiN1x4ZDRceGYxXHgwZVx4MmIiCisJCQkiXHg0OFx4NjVceDgyXHg5Zlx4YmNceGQ5XHhmNlx4MTMiCisJCQkiXHgzMFx4NGRceDZhXHg4N1x4YTRceGMxXHhkZVx4ZmIiCisJCQkiXHgxOFx4MzVceDUyXHg2Zlx4OGNceGE5XHhjNlx4ZTMiCisJCQkiXHgwMFx4MWZceDNlXHg1ZFx4N2NceDliXHhiYVx4ZDkiCisJCQkiXHhmOFx4MTdceDM2XHg1NVx4NzRceDkzXHhiMlx4ZDEiCisJCQkiXHhmMFx4MGZceDJlXHg0ZFx4NmNceDhiXHhhYVx4YzkiCisJCQkiXHhlOFx4MDdceDI2XHg0NVx4NjRceDgzXHhhMlx4YzEiCisJCQkiXHhlMFx4ZmZceDFlXHgzZFx4NWNceDdiXHg5YVx4YjkiCisJCQkiXHhkOFx4ZjdceDE2XHgzNVx4NTRceDczXHg5Mlx4YjEiCisJCQkiXHhkMFx4ZWZceDBlXHgyZFx4NGNceDZiXHg4YVx4YTkiCisJCQkiXHhjOFx4ZTdceDA2XHgyNVx4NDRceDYzXHg4Mlx4YTEiCisJCQkiXHhjMFx4ZGZceGZlXHgxZFx4M2NceDViXHg3YVx4OTkiCisJCQkiXHhiOFx4ZDdceGY2XHgxNVx4MzRceDUzXHg3Mlx4OTEiCisJCQkiXHhiMFx4Y2ZceGVlXHgwZFx4MmNceDRiXHg2YVx4ODkiCisJCQkiXHhhOFx4YzdceGU2XHgwNVx4MjRceDQzXHg2Mlx4ODEiCisJCQkiXHhhMFx4YmZceGRlXHhmZFx4MWNceDNiXHg1YVx4NzkiCisJCQkiXHg5OFx4YjdceGQ2XHhmNVx4MTRceDMzXHg1Mlx4NzEiCisJCQkiXHg5MFx4YWZceGNlXHhlZFx4MGNceDJiXHg0YVx4NjkiCisJCQkiXHg4OFx4YTdceGM2XHhlNVx4MDRceDIzXHg0Mlx4NjEiCisJCQkiXHg4MFx4OWZceGJlXHhkZFx4ZmNceDFiXHgzYVx4NTkiCisJCQkiXHg3OFx4OTdceGI2XHhkNVx4ZjRceDEzXHgzMlx4NTEiCisJCQkiXHg3MFx4OGZceGFlXHhjZFx4ZWNceDBiXHgyYVx4NDkiCisJCQkiXHg2OFx4ODdceGE2XHhjNVx4ZTRceDAzXHgyMlx4NDEiCisJCQkiXHg2MFx4N2ZceDllXHhiZFx4ZGNceGZiXHgxYVx4MzkiCisJCQkiXHg1OFx4NzdceDk2XHhiNVx4ZDRceGYzXHgxMlx4MzEiCisJCQkiXHg1MFx4NmZceDhlXHhhZFx4Y2NceGViXHgwYVx4MjkiCisJCQkiXHg0OFx4NjdceDg2XHhhNVx4YzRceGUzXHgwMlx4MjEiCisJCQkiXHg0MFx4NWZceDdlXHg5ZFx4YmNceGRiXHhmYVx4MTkiCisJCQkiXHgzOFx4NTdceDc2XHg5NVx4YjRceGQzXHhmMlx4MTEiCisJCQkiXHgzMFx4NGZceDZlXHg4ZFx4YWNceGNiXHhlYVx4MDkiCisJCQkiXHgyOFx4NDdceDY2XHg4NVx4YTRceGMzXHhlMlx4MDEiCisJCQkiXHgyMFx4M2ZceDVlXHg3ZFx4OWNceGJiXHhkYVx4ZjkiCisJCQkiXHgxOFx4MzdceDU2XHg3NVx4OTRceGIzXHhkMlx4ZjEiCisJCQkiXHgxMFx4MmZceDRlXHg2ZFx4OGNceGFiXHhjYVx4ZTkiCisJCQkiXHgwOFx4MjdceDQ2XHg2NVx4ODRceGEzXHhjMlx4ZTEiCisJCQkiXHgwMFx4MjFceDQyXHg2MyIsCisJCS5pbGVuID0gNDEwMCwKKwkJLnJlc3VsdCA9CisJCQkiXHhmMFx4NWNceDc0XHhhZFx4NGVceGJjXHg5OVx4ZTIiCisJCQkiXHhhZVx4ZmZceDkxXHgzYVx4NDRceGNmXHgzOFx4MzIiCisJCQkiXHgxZVx4YWRceGE3XHhjZFx4YTFceDM5XHg5NVx4YWEiCisJCQkiXHgxMFx4YjFceGIzXHgyZVx4MDRceDMxXHg4Zlx4ODYiCisJCQkiXHhmMlx4NjJceDc0XHg3MFx4MGNceGE0XHg0Nlx4MDgiCisJCQkiXHhhOFx4YjdceDk5XHhhOFx4ZTlceGQyXHg3M1x4NzkiCisJCQkiXHg3ZVx4NmVceGQ0XHg4Zlx4MWVceGM3XHg4ZVx4MzEiCisJCQkiXHgwYlx4ZmFceDRiXHhjZVx4ZmRceGYzXHg1N1x4NzEiCisJCQkiXHhlOVx4NDZceDAzXHhhNVx4M2RceDM0XHgwMFx4ZTIiCisJCQkiXHgxOFx4ZmZceDc1XHg2ZFx4MDZceDJkXHgwMFx4YWIiCisJCQkiXHhiOVx4M2VceDZjXHg1OVx4YzVceDg0XHgwNlx4YjUiCisJCQkiXHg4Ylx4ZDBceDg5XHg5Y1x4NGFceDc5XHgxNlx4YzYiCisJCQkiXHgzZFx4NzRceDU0XHhmYVx4NDRceGNkXHgyM1x4MjYiCisJCQkiXHg1Y1x4Y2ZceDdlXHgyOFx4OTJceDMyXHhiZlx4ZGYiCisJCQkiXHhhN1x4MjBceDNjXHg3NFx4NThceDJhXHg5YVx4ZGUiCisJCQkiXHg2MVx4MDBceDFjXHg0Zlx4ZmZceDU5XHhjNFx4MjIiCisJCQkiXHhhY1x4M2NceGQwXHhlOFx4NmNceGY5XHg5N1x4MWIiCisJCQkiXHg1OFx4OWJceGFkXHg3MVx4ZThceGE5XHhiNVx4MGQiCisJCQkiXHhlZVx4MmZceDA0XHgxZlx4N2ZceGJjXHg5OVx4ZWUiCisJCQkiXHg4NFx4ZmZceDQyXHg2MFx4ZGNceDNhXHgxOFx4YTUiCisJCQkiXHg4MVx4ZjlceGVmXHhkY1x4N2FceDBmXHg2NVx4NDEiCisJCQkiXHgyZlx4YTNceGQzXHhmOVx4YzJceGNiXHhjMFx4NGQiCisJCQkiXHg4Zlx4ZDNceDc2XHg5Nlx4YWRceDQ5XHg2ZFx4MzgiCisJCQkiXHgzZFx4MzlceDBiXHg2Y1x4ODBceGI3XHg1NFx4NjkiCisJCQkiXHhmMFx4MmNceDkwXHgwMlx4MjlceDBkXHgxY1x4MTIiCisJCQkiXHhhZFx4NTVceGMzXHg4Ylx4NjhceGQ5XHhjY1x4YjMiCisJCQkiXHhiMlx4NjRceDMzXHg5MFx4NWVceGNhXHg0Ylx4ZTIiCisJCQkiXHhmYlx4NzVceGRjXHg2M1x4ZjdceDlmXHg4Mlx4NzQiCisJCQkiXHhmMFx4YzlceGFhXHg3Zlx4ZTlceDJhXHg5Ylx4MzMiCisJCQkiXHhiY1x4ODhceDAwXHg3Zlx4Y2FceGIyXHgxZlx4MTQiCisJCQkiXHhkYlx4YzVceDhlXHg3Ylx4MTFceDNjXHgzZVx4MDgiCisJCQkiXHhmM1x4ODNceGU4XHhlMFx4OTRceDg2XHgyZVx4OTIiCisJCQkiXHg3OFx4NmJceDAxXHhjOVx4YzdceDgzXHhiYVx4MjEiCisJCQkiXHg2YVx4MjVceDE1XHgzM1x4NGVceDQ1XHgwOFx4ZWMiCisJCQkiXHgzNVx4ZGJceGUwXHg2ZVx4MzFceDUxXHg3OVx4YTkiCisJCQkiXHg0Mlx4NDRceDY1XHhjMVx4YTBceGYxXHhmOVx4MmEiCisJCQkiXHg3MFx4ZDVceGI2XHhjNlx4YzFceDhjXHgzOVx4ZmMiCisJCQkiXHgyNVx4YTZceDU1XHhkOVx4ZGRceDJkXHg0Y1x4ZWMiCisJCQkiXHg0OVx4YzZceGViXHgwZVx4YThceDI1XHgyYVx4MTYiCisJCQkiXHgxYlx4NjZceDg0XHhkYVx4ZTJceDkyXHhlNVx4YzAiCisJCQkiXHhjOFx4NTNceDA3XHhhZlx4ODBceDg0XHhlY1x4ZmQiCisJCQkiXHhjZFx4ZDFceDZlXHhjZFx4NmZceDZhXHhmNVx4MzYiCisJCQkiXHhjNVx4MTVceGU1XHgyNVx4N2RceDc3XHhkMVx4MWEiCisJCQkiXHg5M1x4MzZceGE5XHhjZlx4N2NceGE0XHg1NFx4NGEiCisJCQkiXHgwNlx4NTFceDQ4XHg0ZVx4ZjZceDU5XHg4N1x4ZDIiCisJCQkiXHgwNFx4MDJceGVmXHhkM1x4NDRceGRlXHg3Nlx4MzEiCisJCQkiXHhiM1x4MzRceDE3XHgxYlx4OWRceDY2XHgxMVx4OWYiCisJCQkiXHgxZVx4Y2NceDE3XHhlOVx4YzdceDNjXHgxYlx4ZTciCisJCQkiXHhjYlx4NTBceDA4XHhmY1x4ZGNceDJiXHgyNFx4ZGIiCisJCQkiXHg2NVx4ODNceGQwXHgzYlx4ZTNceDMwXHhlYVx4OTQiCisJCQkiXHg2Y1x4ZTdceGU4XHgzNVx4MzJceGM3XHhkYlx4NjQiCisJCQkiXHhiNFx4MDFceGFiXHgzNlx4MmNceDc3XHgxM1x4YWYiCisJCQkiXHhmOFx4MmJceDg4XHgzZlx4NTRceDM5XHhjNFx4NDQiCisJCQkiXHhmZVx4ZWZceDZmXHg2OFx4MzRceGJlXHgwZlx4MDUiCisJCQkiXHgxNlx4NmRceGY2XHgwYVx4MzBceGU3XHhlM1x4ZWQiCisJCQkiXHhjNFx4ZGVceDNjXHgxYlx4MTNceGQ4XHhkYlx4ZmUiCisJCQkiXHg0MVx4NjJceGU1XHgyOFx4ZDRceDhkXHhhM1x4YzciCisJCQkiXHg5M1x4OTdceGM2XHg0OFx4NDVceDFkXHg5Zlx4ODMiCisJCQkiXHhkZlx4NGJceDQwXHgzZVx4NDJceDI1XHg4N1x4ODAiCisJCQkiXHg0Y1x4N2RceGE4XHhkNFx4OThceDIzXHg5NVx4NzUiCisJCQkiXHg0MVx4OGNceGRhXHg0MVx4OWJceGQ0XHhhN1x4MDYiCisJCQkiXHhiNVx4ZjFceDcxXHgwOVx4NTNceGJlXHhjYVx4YmYiCisJCQkiXHgzMlx4MDNceGVkXHhmMFx4NTBceDFjXHg1Nlx4MzkiCisJCQkiXHg1Ylx4YTRceDc1XHgxOFx4ZjdceDliXHg1OFx4ZWYiCisJCQkiXHg1M1x4ZmNceDJhXHgzOFx4MjNceDE1XHg3NVx4Y2QiCisJCQkiXHg0NVx4ZTVceDVhXHg4Mlx4NTVceGJhXHgyMVx4ZmEiCisJCQkiXHhkNFx4YmRceGM2XHg5NFx4N2NceGM1XHg4MFx4MTIiCisJCQkiXHhmN1x4NGJceDMyXHhjNFx4OWFceDgyXHhkOFx4MjgiCisJCQkiXHg4Zlx4ZDlceGMyXHgwZlx4NjBceDAzXHhiZVx4NWUiCisJCQkiXHgyMVx4ZDZceDVmXHg1OFx4YmZceDVjXHhiMVx4MzIiCisJCQkiXHg4Mlx4OGRceGE5XHhlNVx4ZjJceDY2XHgxYVx4YzAiCisJCQkiXHhhMFx4YmNceDU4XHgyZlx4NzFceGY1XHgyZlx4ZWQiCisJCQkiXHhkMVx4MjZceGI5XHhkOFx4NDlceDVhXHgwN1x4MTkiCisJCQkiXHgwMVx4N2NceDU5XHhiMFx4ZjhceGE0XHhiN1x4ZDMiCisJCQkiXHg3Ylx4MWFceDhjXHgzOFx4ZjRceDUwXHhhNFx4NTkiCisJCQkiXHhiMFx4Y2NceDQxXHgwYlx4ODhceDdmXHhlNVx4MzEiCisJCQkiXHhiM1x4NDJceGJhXHhhMlx4N2VceGQ0XHgzMlx4NzEiCisJCQkiXHg0NVx4ODdceDQ4XHhhOVx4YzJceGYyXHg4OVx4YjMiCisJCQkiXHhlNFx4YTdceDdlXHg1Mlx4MTVceDYxXHhmYVx4ZmUiCisJCQkiXHhjOVx4ZGRceDgxXHhlYlx4MTNceGFiXHhhYlx4YzMiCisJCQkiXHg5OFx4NTlceGQ4XHgxNlx4M2RceDE0XHg3YVx4MWMiCisJCQkiXHgzY1x4NDFceDlhXHgxNlx4MTZceDliXHhkMlx4ZDIiCisJCQkiXHg2OVx4M2FceDI5XHgyM1x4YWNceDg2XHgzMlx4YTUiCisJCQkiXHg0OFx4OWNceDllXHhmM1x4NDdceDc3XHg4MVx4NzAiCisJCQkiXHgyNFx4ZThceDg1XHhkMlx4ZjVceGI1XHhmYVx4ZmYiCisJCQkiXHg1OVx4NmFceGQzXHg1MFx4NTlceDQzXHg1OVx4ZGUiCisJCQkiXHhkOVx4ZjFceDU1XHhhNVx4MGNceGMzXHgxYVx4MWEiCisJCQkiXHgxOFx4MzRceDBkXHgxYVx4NjNceDMzXHhlZFx4MTAiCisJCQkiXHhlMFx4MWRceDJhXHgxOFx4ZDJceGMwXHg1NFx4YTgiCisJCQkiXHhjYVx4YjVceDlhXHhkM1x4ZGRceGNhXHg0NVx4ODQiCisJCQkiXHg1MFx4ZTdceDBmXHhmZVx4YTRceDk5XHg1YVx4YmUiCisJCQkiXHg0M1x4MmRceDlhXHhjYlx4OTJceDNmXHg1YVx4MWQiCisJCQkiXHg4NVx4ZDhceGM5XHhkZlx4NjhceGM5XHgxMlx4ODAiCisJCQkiXHg1Nlx4MGNceGRjXHgwMFx4ZGNceDNhXHg3ZFx4OWQiCisJCQkiXHhhM1x4YTJceGU4XHg0ZFx4YmZceGY5XHg3MFx4YTAiCisJCQkiXHhhNFx4MTNceDRmXHg2Ylx4YWZceDBhXHg4OVx4N2YiCisJCQkiXHhkYVx4ZjBceGJmXHg5Ylx4YzhceDFkXHhlNVx4ZjgiCisJCQkiXHgyZVx4OGJceDA3XHhiNVx4NzNceDFiXHhjY1x4YTIiCisJCQkiXHhhNlx4YWRceDMwXHhiY1x4NzhceDNjXHg1Ylx4MTAiCisJCQkiXHhmYVx4NWVceDYyXHgyZFx4OWVceDY0XHhiM1x4MzMiCisJCQkiXHhjZVx4ZjlceDFmXHg4Nlx4ZTdceDhiXHhhMlx4YjgiCisJCQkiXHhlOFx4OTlceDU3XHg4Y1x4MTFceGVkXHg2Nlx4ZDkiCisJCQkiXHgzY1x4NzJceGI5XHhjM1x4ZTZceDRlXHgxN1x4M2EiCisJCQkiXHg2YVx4Y2JceDQyXHgyNFx4MDZceGVkXHgzZVx4NGUiCisJCQkiXHhhM1x4ZThceDZhXHg5NFx4ZGFceDBkXHg0ZVx4ZDUiCisJCQkiXHgxNFx4MTlceGNmXHhiNlx4MjZceGQ4XHgyZVx4Y2MiCisJCQkiXHg2NFx4NzZceDM4XHg0OVx4NGRceGZlXHgzMFx4NmQiCisJCQkiXHhlNFx4YzhceDhjXHg3Ylx4YzRceGUwXHgzNVx4YmEiCisJCQkiXHgyMlx4NmVceDc2XHhlMVx4MWFceGYyXHg1M1x4YzMiCisJCQkiXHgyOFx4YTJceDgyXHgxZlx4NjFceDY5XHhhZFx4YzEiCisJCQkiXHg3Ylx4MjhceDRiXHgxZVx4NmNceDg1XHg5NVx4OWIiCisJCQkiXHg1MVx4YjVceDE3XHg3Zlx4MTJceDY5XHg4Y1x4MjQiCisJCQkiXHhkNVx4YzdceDVhXHg1YVx4MTFceDU0XHhmZlx4NWEiCisJCQkiXHhmN1x4MTZceGMzXHg5MVx4YTZceGYwXHhkY1x4MGEiCisJCQkiXHhiNlx4YTdceDRhXHgwZFx4N2FceDU4XHhmZVx4YTUiCisJCQkiXHhmNVx4Y2JceDhmXHg3Ylx4MGVceGVhXHg1N1x4ZTciCisJCQkiXHhiZFx4NzlceGQ2XHgxY1x4ODhceDIzXHg2Y1x4ZjIiCisJCQkiXHg0ZFx4MjlceDc3XHg1M1x4MzVceDZhXHgwMFx4OGQiCisJCQkiXHhjZFx4YTNceDU4XHhiZVx4NzdceDk5XHgxOFx4ZjgiCisJCQkiXHhlNlx4ZTFceDhmXHhlOVx4MzdceDhmXHhlM1x4ZTIiCisJCQkiXHg1YVx4OGFceDkzXHgyNVx4YWZceGYzXHg3OFx4ODAiCisJCQkiXHhiZVx4YTZceDFiXHhjNlx4YWNceDhiXHgxY1x4OTEiCisJCQkiXHg1OFx4ZTFceDlmXHg4OVx4MzVceDlkXHgxZFx4MjEiCisJCQkiXHgyOVx4OWZceGY0XHg5OVx4MDJceDI3XHgwZlx4YTgiCisJCQkiXHg0Zlx4NzlceDk0XHgyYlx4MzNceDJjXHhkYVx4YTIiCisJCQkiXHgyNlx4MzlceDgzXHg5NFx4ZWZceDI3XHhkOFx4NTMiCisJCQkiXHg4Zlx4NjZceDBkXHhlNFx4NDFceDdkXHgzNFx4Y2QiCisJCQkiXHg0M1x4N2NceDk1XHgwYVx4NTNceGVmXHg2Nlx4ZGEiCisJCQkiXHg3ZVx4OWJceGYzXHg5M1x4YWZceGQwXHg3M1x4NzEiCisJCQkiXHhiYVx4NDBceDliXHg3NFx4ZjhceGQ3XHhkN1x4NDEiCisJCQkiXHg2ZFx4YWZceDcyXHg5Y1x4OGRceDIxXHg4N1x4M2MiCisJCQkiXHhmZFx4MGFceDkwXHhhOVx4NDdceDk2XHg5ZVx4ZDMiCisJCQkiXHg4OFx4ZWVceDczXHhjZlx4NjZceDJmXHg1Mlx4NTYiCisJCQkiXHg2ZFx4YTlceDgwXHg0Y1x4ZTJceDZmXHg2Mlx4ODgiCisJCQkiXHgzZlx4MGVceDU0XHgxN1x4NDhceDgwXHg1ZFx4ZDMiCisJCQkiXHhjM1x4ZGFceDI1XHgzZFx4YTFceGM4XHhjYlx4OWYiCisJCQkiXHg5Ylx4NzBceGIzXHhhMVx4ZWJceDA0XHg1Mlx4YTEiCisJCQkiXHhmMlx4MjJceDBmXHhmY1x4YzhceDE4XHhmYVx4ZjkiCisJCQkiXHg4NVx4OWNceGYxXHhhY1x4ZWJceDBjXHgwMlx4NDYiCisJCQkiXHg3NVx4ZDJceGY1XHgyY1x4ZTNceGQyXHg1OVx4OTQiCisJCQkiXHgxMlx4ZjNceDNjXHhmY1x4ZDdceDkyXHhmYVx4MzYiCisJCQkiXHhiYVx4NjFceDM0XHgzOFx4N2NceGRhXHg0OFx4M2UiCisJCQkiXHgwOFx4YzlceDM5XHgyM1x4NWVceDAyXHgyY1x4MWEiCisJCQkiXHgxOFx4N2VceGI0XHhkOVx4ZmRceDllXHg0MFx4MDIiCisJCQkiXHhiMVx4MzNceDM3XHgzMlx4ZTdceGRlXHhkNlx4ZDAiCisJCQkiXHg3Y1x4NThceDY1XHg0Ylx4ZjhceDM0XHgyN1x4OWMiCisJCQkiXHg0NFx4YjRceGJkXHhlOVx4ZTlceDRjXHg3OFx4N2QiCisJCQkiXHg0Ylx4OWZceGNlXHhiMVx4Y2RceDQ3XHhhNVx4MzciCisJCQkiXHhlNVx4NmRceGJkXHhiOVx4NDNceDk0XHgwYVx4ZDQiCisJCQkiXHhkNlx4ZjlceDA0XHg1Zlx4YjVceDY2XHg2Y1x4MWEiCisJCQkiXHgzNVx4MTJceGUzXHgzNlx4MjhceDI3XHgzNlx4NTgiCisJCQkiXHgwMVx4MmJceDc5XHhlNFx4YmFceDZkXHgxMFx4N2QiCisJCQkiXHg2NVx4ZGZceDg0XHg5NVx4ZjRceGQ1XHhiNlx4OGYiCisJCQkiXHgyYlx4OWZceDk2XHgwMFx4ODZceDYwXHhmMFx4MjEiCisJCQkiXHg3Nlx4YThceDZhXHg4Y1x4MjhceDFjXHhiM1x4NmIiCisJCQkiXHg5N1x4ZDdceGI2XHg1M1x4MmFceGNjXHhhYlx4NDAiCisJCQkiXHg5ZFx4NjJceDc5XHg1OFx4NTJceGU2XHg2NVx4YjciCisJCQkiXHhhYlx4NTVceDY3XHg5Y1x4ODlceDdjXHgwM1x4YjAiCisJCQkiXHg3M1x4NTlceGM1XHg4MVx4ZjVceDE4XHgxN1x4NWMiCisJCQkiXHg4OVx4ZjNceDc4XHgzNVx4NDRceDYyXHg3OFx4NzIiCisJCQkiXHhkMFx4OTZceGViXHgzMVx4ZTdceDg3XHg3N1x4MTQiCisJCQkiXHg5OVx4NTFceGYyXHg1OVx4MjZceDllXHhiNVx4YTYiCisJCQkiXHg0NVx4ZmVceDZlXHhiZFx4MDdceDRjXHg5NFx4NWEiCisJCQkiXHhhNVx4N2RceGZjXHhmMVx4MmJceDc3XHhlMlx4ZmUiCisJCQkiXHgxN1x4ZDRceDg0XHhhMFx4YWNceGI1XHhjN1x4ZGEiCisJCQkiXHhhOVx4MWFceGI2XHhmM1x4NzRceDExXHhiNFx4OWQiCisJCQkiXHhmYlx4NzlceDJlXHgwNFx4MmRceDUwXHgyOFx4ODMiCisJCQkiXHhiZlx4YzZceDUyXHhkM1x4MzRceGQ2XHhlOFx4N2EiCisJCQkiXHhiNlx4ZWFceGU3XHhhOFx4NmNceDE1XHgxZVx4MmMiCisJCQkiXHg1N1x4YmNceDQ4XHg0ZVx4NWZceDVjXHhiNlx4OTIiCisJCQkiXHhkMlx4NDlceDc3XHg4MVx4NmRceDkwXHg3MFx4YWUiCisJCQkiXHg5OFx4YTFceDAzXHgwZFx4NmJceGI5XHg3N1x4MTQiCisJCQkiXHhmMVx4NGVceDIzXHhkM1x4ZjhceDY4XHhiZFx4YzIiCisJCQkiXHhmZVx4MDRceGI3XHg1Y1x4YzVceDE3XHg2MFx4OGYiCisJCQkiXHg2NVx4NTRceGE0XHg3YVx4NDJceGRjXHgxOFx4MGQiCisJCQkiXHhiNVx4Y2ZceDBmXHhkM1x4YzdceDkxXHg2Nlx4MWIiCisJCQkiXHg0NVx4NDJceDI3XHg3NVx4NTBceGU1XHhlZVx4YjgiCisJCQkiXHg3Zlx4MzNceDJjXHhiYVx4NGFceDkyXHg0ZFx4MmMiCisJCQkiXHgzY1x4ZTNceDBkXHg4MFx4MDFceGJhXHgwZFx4MjkiCisJCQkiXHhkOFx4M2NceGU5XHgxM1x4MTZceDU3XHhlNlx4ZWEiCisJCQkiXHg5NFx4NTJceGU3XHgwMFx4NGRceDMwXHhiMFx4MGYiCisJCQkiXHgzNVx4YjhceGI4XHhhN1x4YjFceGI1XHgzYlx4NDQiCisJCQkiXHhlMVx4MmZceGZkXHg4OFx4ZWRceDQzXHhlN1x4NTIiCisJCQkiXHgxMFx4OTNceGIzXHg4YVx4MzBceDZiXHgwYVx4ZjciCisJCQkiXHgyM1x4YzZceDUwXHg5ZFx4NGFceGIwXHhkZVx4YzMiCisJCQkiXHhkY1x4OWJceDJmXHgwMVx4NTZceDM2XHgwOVx4YzUiCisJCQkiXHgyZlx4NmJceGZlXHhmMVx4ZDhceDI3XHg0NVx4MDMiCisJCQkiXHgzMFx4NWVceDVjXHg1Ylx4YjRceDYyXHgwZVx4MWEiCisJCQkiXHhhOVx4MjFceDJiXHg5Mlx4OTRceDg3XHg2Mlx4NTciCisJCQkiXHg0Y1x4MTBceDc0XHgxYVx4ZjFceDBhXHhjNVx4ODQiCisJCQkiXHgzYlx4OWVceDcyXHgwMlx4ZDdceGNjXHgwOVx4NTYiCisJCQkiXHhiZFx4NTRceGMxXHhmMFx4YzNceGUzXHhiM1x4ZjgiCisJCQkiXHhkMlx4MGRceDYxXHhjYlx4ZWZceGNlXHgwZFx4MDUiCisJCQkiXHhiMFx4OThceGQ5XHg4ZVx4NGZceGY5XHhiY1x4OTMiCisJCQkiXHhhNlx4ZWFceGM4XHhjZlx4MTBceDUzXHg0Ylx4ZjEiCisJCQkiXHhlY1x4ZmNceDg5XHhmOVx4NjRceGIwXHgyMlx4YmYiCisJCQkiXHg5ZVx4NTVceDQ2XHg5Zlx4N2NceDUwXHg4ZVx4ODQiCisJCQkiXHg1NFx4MjBceDk4XHhkN1x4NmNceDQwXHgxZVx4ZGIiCisJCQkiXHg2OVx4MzRceDc4XHg2MVx4MjRceDIxXHg5Y1x4OGEiCisJCQkiXHhiM1x4NjJceDMxXHg4Ylx4NmVceGY1XHgyYVx4MzUiCisJCQkiXHg4Nlx4MTNceGIxXHg2Y1x4NjRceDJlXHg0MVx4YTUiCisJCQkiXHgwNVx4ZjJceDQyXHhiYVx4ZDJceDNhXHgwZFx4OGUiCisJCQkiXHg4YVx4NTlceDk0XHgzY1x4Y2ZceDM2XHgyN1x4ODIiCisJCQkiXHhjMlx4NDVceGVlXHg1OFx4Y2RceDg4XHhiNFx4ZWMiCisJCQkiXHhkZVx4YjJceDk2XHgwYVx4YWZceDM4XHg2Zlx4ODgiCisJCQkiXHhkN1x4ZDhceGUxXHhkZlx4YjlceDk2XHhhOVx4MGEiCisJCQkiXHhiMVx4OTVceDI4XHg4Nlx4MjBceGU5XHgxN1x4NDkiCisJCQkiXHhhMlx4MjlceDM4XHhhYVx4YTVceGU5XHg2ZVx4ZjEiCisJCQkiXHgxOVx4MjdceGMwXHhkNVx4MmFceDIyXHhjM1x4MGIiCisJCQkiXHhkYlx4N2NceDczXHgxMFx4YjlceGJhXHg4OVx4NzYiCisJCQkiXHg1NFx4YWVceDdkXHg3MVx4YjNceDkzXHhmNlx4MzIiCisJCQkiXHhlNlx4NDdceDQzXHg1NVx4YWNceGEwXHgwZFx4YzIiCisJCQkiXHg5M1x4MjdceDRhXHg4ZVx4MGVceDc0XHgxNVx4YzciCisJCQkiXHgwYlx4ODVceGQ5XHgwY1x4YTlceDMwXHg3YVx4M2UiCisJCQkiXHhlYVx4OGZceDg1XHg2ZFx4M2FceDEyXHg0Zlx4NzIiCisJCQkiXHg2OVx4NThceDdhXHg4MFx4YmJceGI1XHg5N1x4ZjMiCisJCQkiXHhjZlx4NzBceGQyXHg1ZFx4ZGRceDRkXHgyMVx4NzkiCisJCQkiXHg1NFx4NGRceGU0XHgwNVx4ZThceGJkXHhjMlx4NjIiCisJCQkiXHhiMVx4M2JceDc3XHgxY1x4ZDZceDVjXHhmM1x4YTAiCisJCQkiXHg3OVx4MDBceGE4XHg2Y1x4MjlceGQ5XHgxOFx4MjQiCisJCQkiXHgzNlx4YTJceDQ2XHhjMFx4OTZceDY1XHg3Zlx4YmQiCisJCQkiXHgyYVx4ZWRceDM2XHgxNlx4MGNceGFhXHg5Zlx4ZjQiCisJCQkiXHhjNVx4YjRceGUyXHgxMlx4ZWRceDY5XHhlZFx4NGYiCisJCQkiXHgyNlx4MmNceDM5XHg1Mlx4ODlceDk4XHhlN1x4MmMiCisJCQkiXHg5OVx4YTRceDllXHhhM1x4OWJceDk5XHg0Nlx4N2EiCisJCQkiXHgzYVx4ZGNceGE4XHg1OVx4YTNceGRiXHhjM1x4M2IiCisJCQkiXHg5NVx4MGRceDNiXHgwOVx4NmVceGVlXHg4M1x4NWQiCisJCQkiXHgzMlx4NGRceGVkXHhhYlx4ZmFceDk4XHgxNFx4NGUiCisJCQkiXHhjM1x4MTVceDQ1XHg1M1x4NjFceGM0XHg5M1x4YmQiCisJCQkiXHg5MFx4ZjRceDk5XHg5NVx4NGNceGU2XHg3Nlx4OTIiCisJCQkiXHgyOVx4OTBceDQ2XHgzMFx4OTJceDY5XHg3ZFx4MTMiCisJCQkiXHhmMlx4YTVceGNkXHg2OVx4NDlceDQ0XHhiMlx4MGYiCisJCQkiXHg2M1x4NDBceDM2XHg1Zlx4MDlceGUyXHg3OFx4ZjgiCisJCQkiXHg5MVx4ZTNceGUyXHhmYVx4MTBceGY3XHhjOFx4MjQiCisJCQkiXHhhOFx4ODlceDMyXHg1Y1x4MzdceDI1XHgxZFx4YjIiCisJCQkiXHhlYVx4MTdceDhhXHgwYVx4YTlceDY0XHhjM1x4N2MiCisJCQkiXHgzY1x4N2NceGJkXHhjNlx4NzlceDM0XHhlN1x4ZTIiCisJCQkiXHg4NVx4OGVceGJmXHhmOFx4ZGVceDkyXHhhMFx4YWUiCisJCQkiXHgyMFx4YzRceGY2XHhiYlx4MWZceDM4XHgxOVx4MGUiCisJCQkiXHhlOFx4NzlceDljXHhhMVx4MjNceGU5XHg1NFx4N2UiCisJCQkiXHgzN1x4MmZceGUyXHg5NFx4MzJceGFmXHhhMFx4MjMiCisJCQkiXHg0OVx4ZTRceGMwXHhiM1x4YWNceDAwXHg4Zlx4MzYiCisJCQkiXHgwNVx4YzRceGE2XHg5Nlx4ZWNceDA1XHg5OFx4NGYiCisJCQkiXHg5Nlx4NjdceDU3XHgxZlx4MjBceDg2XHgxYlx4MmQiCisJCQkiXHg2OVx4ZTRceDI5XHg5M1x4NjZceDVmXHhhZlx4NmIiCisJCQkiXHg4OFx4MjZceDJjXHg2N1x4MDJceDRiXHg1Mlx4ZDAiCisJCQkiXHg4M1x4N2FceDQzXHgxZlx4YzBceDcxXHgxNVx4MjUiCisJCQkiXHg3N1x4NjVceDA4XHg2MFx4MTFceDc2XHg0Y1x4OGQiCisJCQkiXHhlZFx4YTlceDI3XHhjNlx4YjFceDJhXHgyY1x4NmEiCisJCQkiXHg0YVx4OTdceGY1XHhjNlx4YjdceDcwXHg0Mlx4ZDMiCisJCQkiXHgwM1x4ZDFceDI0XHg5NVx4ZWNceDZkXHhhYlx4MzgiCisJCQkiXHg3Mlx4Y2VceGUyXHg4Ylx4MzNceGQ3XHg1MVx4MDkiCisJCQkiXHhkY1x4NDVceGUwXHgwOVx4OTZceDMyXHhmM1x4YzQiCisJCQkiXHg4NFx4ZGNceDczXHg3M1x4MmRceDFiXHgxMVx4OTgiCisJCQkiXHhjNVx4MGVceDY5XHgyOFx4OTRceGM3XHhiNVx4NGQiCisJCQkiXHhjOFx4OGFceGQwXHhhYVx4MTNceDJlXHgxOFx4NzQiCisJCQkiXHhkZFx4ZDFceDFlXHhmM1x4OTBceGU4XHhmY1x4OWEiCisJCQkiXHg3Mlx4NGFceDBlXHhkMVx4ZTRceGZiXHgwZFx4OTYiCisJCQkiXHhkMVx4MGNceDc5XHg4NVx4MWJceDFjXHhmZVx4ZTEiCisJCQkiXHg2Mlx4OGZceDdhXHg3M1x4MzJceGFiXHhjOFx4MTgiCisJCQkiXHg2OVx4ZTNceDM0XHgzMFx4ZGZceDEzXHhhNlx4ZTUiCisJCQkiXHhlOFx4MGVceDY3XHg3Zlx4ODFceDExXHhiNFx4NjAiCisJCQkiXHhjN1x4YmRceDc5XHg2NVx4NTBceGRjXHhjNFx4NWIiCisJCQkiXHhkZVx4MzlceGE0XHgwMVx4NzJceDYzXHhmM1x4ZDEiCisJCQkiXHg2NFx4NGVceGRmXHhmY1x4MjdceDkyXHgzN1x4MGQiCisJCQkiXHg1N1x4Y2RceDExXHg0Zlx4MTFceDA0XHg4ZVx4MWQiCisJCQkiXHgxNlx4ZjdceGNkXHg5Mlx4OWFceDk5XHgzMFx4MTQiCisJCQkiXHhmMVx4N2NceDY3XHgxYlx4MWZceDQxXHgwYlx4ZTgiCisJCQkiXHgzMlx4ZThceGI4XHhjMVx4NGZceDU0XHg4Nlx4NGYiCisJCQkiXHhlNVx4NzlceDgxXHg3M1x4Y2RceDQzXHg1OVx4NjgiCisJCQkiXHg3M1x4MDJceDNiXHg3OFx4MjFceDcyXHg0M1x4MDAiCisJCQkiXHg0OVx4MTdceGY3XHgwMFx4YWZceDY4XHgyNFx4NTMiCisJCQkiXHgwNVx4MGFceGMzXHgzM1x4ZTBceDMzXHgzZlx4NjkiCisJCQkiXHhkMlx4ODRceDJmXHgwYlx4ZWRceGRlXHgwNFx4ZjQiCisJCQkiXHgxMVx4OTRceDEzXHg2OVx4NTFceDA5XHgyOFx4ZGUiCisJCQkiXHg1N1x4NWNceGVmXHhkY1x4OWFceDQ5XHgxY1x4MTciCisJCQkiXHg5N1x4ZjNceDk2XHhjMVx4N2ZceDVkXHgyZVx4N2QiCisJCQkiXHg1NVx4YjhceGIzXHgwMlx4MDlceGIzXHgxZlx4ZTciCisJCQkiXHhjOVx4OGRceGEzXHgzNlx4MzRceDhhXHg3N1x4MTMiCisJCQkiXHgzMFx4NjNceDRjXHhhNVx4Y2RceGMzXHhlMFx4N2UiCisJCQkiXHgwNVx4YTFceDdiXHgwY1x4Y2JceDc0XHg0N1x4MzEiCisJCQkiXHg2Mlx4MDNceDQzXHhmMVx4ODdceGI0XHhiMFx4ODUiCisJCQkiXHg4N1x4OGVceDRiXHgyNVx4YzdceGNmXHhhZVx4NGIiCisJCQkiXHgzNlx4NDZceDNlXHg2Mlx4YmNceDZmXHhlYlx4NWYiCisJCQkiXHg3M1x4YWNceGU2XHgwN1x4ZWVceGMxXHhhMVx4ZDYiCisJCQkiXHhjNFx4YWJceGM5XHhkNlx4ODlceDQ1XHhlMVx4ZjEiCisJCQkiXHgwNFx4NGVceDFhXHg2Zlx4YmJceDRmXHgzYVx4YTMiCisJCQkiXHhhMFx4Y2JceGEzXHgwYVx4ZDhceDcxXHgzNVx4NTUiCisJCQkiXHhlNFx4YmNceDJlXHgwNFx4MDZceGU2XHhmZlx4NWIiCisJCQkiXHgxY1x4YzBceDExXHg3Y1x4YzVceDE3XHhmM1x4MzgiCisJCQkiXHhjZlx4ZTlceGJhXHgwZlx4MGVceGVmXHgwMlx4YzIiCisJCQkiXHg4ZFx4YzZceGJjXHg0Ylx4NjdceDIwXHg5NVx4ZDciCisJCQkiXHgyY1x4NDVceDViXHg4Nlx4NDRceDhjXHg2Zlx4MmUiCisJCQkiXHg3ZVx4OWZceDFjXHg3N1x4YmFceDZiXHgwZVx4YTMiCisJCQkiXHg2OVx4ZGNceGFiXHgyNFx4NTdceDYwXHg0N1x4YzEiCisJCQkiXHhkMVx4YTVceDlkXHgyM1x4ZTZceGIxXHgzN1x4ZmUiCisJCQkiXHg5M1x4ZDJceDRjXHg0Nlx4ZjlceDBjXHhjNlx4ZmIiCisJCQkiXHhkNlx4OWRceDk5XHg2OVx4YWJceDdhXHgwN1x4MGMiCisJCQkiXHg2NVx4ZTdceGM0XHgwOFx4OTZceGUyXHhhNVx4MDEiCisJCQkiXHgzZlx4NDZceDA3XHgwNVx4N2VceGU4XHg5YVx4OTAiCisJCQkiXHg1MFx4ZGNceGU5XHg3YVx4ZWFceGExXHgzOVx4NmUiCisJCQkiXHg2Nlx4ZTRceDZmXHhhNVx4NWZceGIyXHhkOVx4NWIiCisJCQkiXHhmNVx4ZGJceDJhXHgzMlx4ZjBceDExXHg2Zlx4N2MiCisJCQkiXHgyNlx4MTBceDhmXHgzZFx4ODBceGU5XHg1OFx4ZjciCisJCQkiXHhlMFx4YThceDU3XHhmOFx4ZGJceDBlXHhjZVx4OTkiCisJCQkiXHg2M1x4MTlceDNkXHhkNVx4ZWNceDFiXHg3N1x4NjkiCisJCQkiXHg5OFx4ZjZceGU0XHg1Zlx4NjdceDE3XHg0Ylx4MDkiCisJCQkiXHg4NVx4NjJceDgyXHg3MFx4MThceGUyXHg5YVx4NzgiCisJCQkiXHhlMlx4NjJceGJkXHhiNFx4ZjFceDQyXHhjNlx4ZmIiCisJCQkiXHgwOFx4ZDBceGJkXHhlYlx4NGVceDA5XHhmMlx4YzgiCisJCQkiXHgxZVx4ZGNceDNkXHgzMlx4MjFceDU2XHg5Y1x4NGYiCisJCQkiXHgzNVx4ZjNceDYxXHgwNlx4NzJceDg0XHhjNFx4MzIiCisJCQkiXHhmMlx4ZjFceGZhXHgwYlx4MmZceGMzXHhkYlx4MDIiCisJCQkiXHgwNFx4YzJceGRlXHg1N1x4NjRceDYwXHg4ZFx4Y2YiCisJCQkiXHhjYlx4ODZceDVkXHg5N1x4M2VceGIxXHg5Y1x4MDEiCisJCQkiXHhkNlx4MjhceDhmXHg5OVx4YmNceDQ2XHhlYlx4MDUiCisJCQkiXHhhZlx4N2VceGI4XHgyMVx4MmFceDU2XHg4NVx4MWMiCisJCQkiXHhiM1x4NzFceGEwXHhkZVx4Y2FceDk2XHhmMVx4NzgiCisJCQkiXHg0OVx4YTJceDk5XHg4MVx4ODBceDVjXHgwMVx4ZjUiCisJCQkiXHhhMFx4YTJceDU2XHg2M1x4ZTJceDcwXHgwN1x4YTUiCisJCQkiXHg5NVx4ZDZceDg1XHhlYlx4MzZceDllXHhhOVx4NTEiCisJCQkiXHg2Nlx4NTZceDVmXHgxZFx4MDJceDE5XHhlMlx4ZjYiCisJCQkiXHg0Zlx4NzNceDM4XHgwOVx4NzVceDY0XHg0OFx4ZTAiCisJCQkiXHhmMVx4N2VceDBlXHhlOFx4OWRceGY5XHhlZFx4OTQiCisJCQkiXHhmZVx4MTZceDI2XHg2Mlx4NDlceDc0XHhmNFx4YjAiCisJCQkiXHhkNFx4YTlceDZjXHhiMFx4ZmRceDUzXHhlOVx4ODEiCisJCQkiXHhlMFx4N2FceGJmXHhjZlx4YjVceGM0XHgwMVx4ODEiCisJCQkiXHg3OVx4OTlceDc3XHgwMVx4M2JceGU5XHhhMlx4YjYiCisJCQkiXHhlNlx4NmFceDhhXHg5ZVx4NTZceDFjXHg4ZFx4MWUiCisJCQkiXHg4Zlx4MDZceDU1XHgyY1x4NmNceGRjXHg5Mlx4ODciCisJCQkiXHg2NFx4M2JceDRiXHgxOVx4YTFceDEzXHg2NFx4MWQiCisJCQkiXHg0YVx4ZTlceGMwXHgwMFx4YjhceDk1XHhlZlx4NmIiCisJCQkiXHgxYVx4ODZceDZkXHgzN1x4NTJceDAyXHhjMlx4ZTAiCisJCQkiXHhjOFx4YmJceDQyXHgwY1x4MDJceDIxXHg0YVx4YzkiCisJCQkiXHhlZlx4YTBceDU0XHhlNFx4NWVceDE2XHg1M1x4ODEiCisJCQkiXHg3MFx4NjJceDEwXHhhZlx4ZGVceGI4XHhiNVx4ZDMiCisJCQkiXHhlOFx4NWVceDZjXHhjM1x4OGFceDNlXHgxOFx4MDciCisJCQkiXHhmMlx4MmZceDdkXHhhN1x4ZTFceDNkXHg0ZVx4YjQiCisJCQkiXHgyNlx4YTdceGEzXHg5M1x4ODZceGIyXHgwNFx4MWUiCisJCQkiXHg1M1x4NWRceDg2XHhkNlx4ZGVceDY1XHhjYVx4ZTMiCisJCQkiXHg0ZVx4YzFceGNmXHhlZlx4YzhceDcwXHgxYlx4ODMiCisJCQkiXHgxM1x4ZGRceDE4XHg4Ylx4MGRceDc2XHhkMlx4ZjYiCisJCQkiXHgzN1x4N2FceDkzXHg3YVx4NTBceDExXHg5Zlx4OTYiCisJCQkiXHg4Nlx4MjVceGZkXHhhY1x4ZGNceGJlXHgxOFx4OTMiCisJCQkiXHgxOVx4NmJceGVjXHg1OFx4NGZceGI5XHg3NVx4YTciCisJCQkiXHhkZFx4M2ZceDJmXHhlY1x4YzhceDVhXHg4NFx4YWIiCisJCQkiXHhkNVx4ZTRceDhhXHgwN1x4ZjZceDRkXHgyM1x4ZDYiCisJCQkiXHgwM1x4ZmJceDAzXHg2YVx4ZWFceDY2XHhiZlx4ZDQiCisJCQkiXHhiMVx4MzRceGZiXHg3OFx4ZTlceDU1XHhkY1x4N2MiCisJCQkiXHgzZFx4OWNceGU1XHg5YVx4YWNceGMzXHg3YVx4ODAiCisJCQkiXHgyNFx4NmRceGEwXHhlZlx4MjVceDdjXHhiN1x4ZWEiCisJCQkiXHhjZVx4NGRceDVmXHgxOFx4NjBceGNlXHg4N1x4MjIiCisJCQkiXHg2Nlx4MmZceGQ1XHhkZFx4ZGRceDAyXHgyMVx4NzUiCisJCQkiXHg4Mlx4YTBceDFmXHg1OFx4YzZceGQzXHg2Mlx4ZjciCisJCQkiXHgzMlx4ZDhceGFmXHgxZVx4MDdceDc3XHg1MVx4OTYiCisJCQkiXHhkNVx4NmJceDFlXHg3ZVx4ODBceDAyXHhlOFx4NjciCisJCQkiXHhlYVx4MTdceDBiXHgxMFx4ZDJceDNmXHgyOFx4MjUiCisJCQkiXHg0Zlx4MDVceDc3XHgwMlx4MTRceDY5XHhmMFx4MmMiCisJCQkiXHhiZVx4MGNceGYxXHg3NFx4MzBceGQxXHhiOVx4OWIiCisJCQkiXHhmY1x4OGNceGJiXHgwNFx4MTZceGQ5XHhiYVx4YzMiCisJCQkiXHhiY1x4OTFceDhhXHhjNFx4MzBceGE0XHhiMFx4MTIiCisJCQkiXHg0Y1x4MjFceDg3XHhjYlx4YzlceDFkXHgxNlx4OTYiCisJCQkiXHgwN1x4NmZceDIzXHg1NFx4YjlceDZmXHg3OVx4ZTUiCisJCQkiXHg2NFx4YzBceDY0XHhkYVx4YjFceGFlXHhkZFx4NjAiCisJCQkiXHg2Y1x4MWFceDlkXHhkM1x4MDRceDhlXHg0NVx4YjAiCisJCQkiXHg5Mlx4NjFceGQwXHg0OFx4ODFceGVkXHg1ZVx4MWQiCisJCQkiXHhhMFx4YzlceGE0XHgzM1x4YzdceDEzXHg1MVx4NWQiCisJCQkiXHg3Zlx4ODNceDczXHhiNlx4NzBceDE4XHg2NVx4M2UiCisJCQkiXHgyZlx4MGVceDdhXHgxMlx4MzlceDk4XHhhYlx4ZDgiCisJCQkiXHg3ZVx4NmZceGEzXHhkMVx4YmFceDU2XHhhZFx4YmQiCisJCQkiXHhmMFx4MDNceDAxXHgxY1x4ODVceDM1XHg5Zlx4ZWIiCisJCQkiXHgxOVx4NjNceGExXHhhZlx4ZmVceDJkXHgzNVx4NTAiCisJCQkiXHgzOVx4YTBceDY1XHg3Y1x4OTVceDdlXHg2Ylx4ZmUiCisJCQkiXHhjMVx4YWNceDA3XHg3Y1x4OThceDRmXHhiZVx4NTciCisJCQkiXHhhN1x4MjJceGVjXHhlMlx4N2VceDI5XHgwOVx4NTMiCisJCQkiXHhlOFx4YmZceGI0XHg3ZVx4M2ZceDhmXHhmY1x4MTQiCisJCQkiXHhjZVx4NTRceGY5XHgxOFx4NThceGI1XHhmZlx4NDQiCisJCQkiXHgwNVx4OWRceGNlXHgxYlx4YjZceDgyXHgyM1x4YzgiCisJCQkiXHgyZVx4YmNceDY5XHhiYlx4NGFceDI5XHgwZlx4NjUiCisJCQkiXHg5NFx4ZjBceDYzXHgwNlx4MGVceGVmXHg4Y1x4YmQiCisJCQkiXHhmZlx4ZmRceGIwXHgyMVx4NmVceDU3XHgwNVx4NzUiCisJCQkiXHhkYVx4ZDVceGM0XHhlYlx4OGRceDMyXHhmN1x4NTAiCisJCQkiXHhkM1x4NmZceDIyXHhlZFx4NWZceDhlXHhhMlx4NWIiCisJCQkiXHg4MFx4OGNceGM4XHg3OFx4NDBceDI0XHg0Ylx4ODkiCisJCQkiXHgzMFx4Y2VceDdhXHg5N1x4MGVceGM0XHhhZlx4ZWYiCisJCQkiXHg5Ylx4YjRceGNkXHg2Nlx4NzRceDE0XHgwNFx4MmIiCisJCQkiXHhmN1x4Y2VceDBiXHgxY1x4NmVceGMyXHg3OFx4OGMiCisJCQkiXHhjYVx4YzVceGQwXHgxY1x4OTVceDRhXHg5MVx4MmQiCisJCQkiXHhhN1x4MjBceGViXHg4Nlx4NTJceGI3XHg2N1x4ZDgiCisJCQkiXHgwY1x4ZDZceDA0XHgxNFx4ZGVceDUxXHg3NFx4NzUiCisJCQkiXHhlN1x4MTFceGI0XHg4N1x4YTNceDNkXHgyZFx4YWQiCisJCQkiXHg0Zlx4ZWZceGEwXHgwZlx4NzBceDAwXHg2ZFx4MTMiCisJCQkiXHgxOVx4MWRceDQxXHg1MFx4ZTlceGQ4XHhmMFx4MzIiCisJCQkiXHg3MVx4YmNceGQzXHgxMVx4ZjJceGFjXHhiZVx4YWYiCisJCQkiXHg3NVx4NDZceDY1XHg0ZVx4MDdceDM0XHgzN1x4YTMiCisJCQkiXHg4OVx4ZmVceDc1XHhkNFx4NzBceDRjXHhjNlx4M2YiCisJCQkiXHg2OVx4MjRceDBlXHgzOFx4NjdceDQzXHg4Y1x4ZGUiCisJCQkiXHgwNlx4YjVceGI4XHhlN1x4YzRceGYwXHg0MVx4OGYiCisJCQkiXHhmMFx4YmRceDJmXHgwYlx4YjlceDE4XHhmOFx4ZGUiCisJCQkiXHg2NFx4YjFceGRiXHhlZVx4MDBceDUwXHg3N1x4ZTEiCisJCQkiXHhjN1x4ZmZceGE2XHhmYVx4ZGRceDcwXHhmNFx4ZTMiCisJCQkiXHg5M1x4ZTlceDc3XHgzNVx4M2RceDRiXHgyZlx4MmIiCisJCQkiXHg2ZFx4NTVceGYwXHhmY1x4ODhceDU0XHg0ZVx4ODkiCisJCQkiXHhjMVx4OGFceDIzXHgzMVx4MmRceDE0XHgyYVx4YjgiCisJCQkiXHgxYlx4MTVceGRkXHg5ZVx4NmVceDdiXHhkYVx4MDUiCisJCQkiXHg5MVx4N2RceDYyXHg2NFx4OTZceDcyXHhkZVx4ZmMiCisJCQkiXHhjMVx4ZWNceGYwXHgyM1x4NTFceDZmXHhkYlx4NWIiCisJCQkiXHgxZFx4MDhceDU3XHhjZVx4MDlceGI4XHhmNlx4Y2QiCisJCQkiXHg4ZFx4OTVceGYyXHgyMFx4YmZceDBmXHgyMFx4NTciCisJCQkiXHg5OFx4ODFceDg0XHg0Zlx4MTVceDVjXHg3Nlx4ZTciCisJCQkiXHgzZVx4MGFceDNhXHg2Y1x4YzRceDhhXHhiZVx4NzgiCisJCQkiXHg3NFx4NzdceGMzXHgwOVx4NGJceDVkXHg0OFx4ZTQiCisJCQkiXHhjOFx4Y2JceDBiXHhlYVx4MTdceDI4XHhjZlx4Y2YiCisJCQkiXHgzMVx4MzJceDQ0XHhhNFx4ZTVceDBlXHgxYVx4OTgiCisJCQkiXHg5NFx4YzRceGYwXHhmZlx4YWVceDNlXHg0NFx4ZTgiCisJCQkiXHhhNVx4YjNceGI1XHgzN1x4MmZceGU4XHhhZlx4NmYiCisJCQkiXHgyOFx4YzFceDM3XHg1Zlx4MzFceGQyXHhiOVx4MzMiCisJCQkiXHhiMVx4YjJceDUyXHg5NFx4NzVceDJjXHgyOVx4NTkiCisJCQkiXHgwNlx4YzJceDI1XHhlOFx4NzFceDY1XHg0ZVx4ZWQiCisJCQkiXHhjMFx4OWNceGIxXHhiYlx4MjVceGRjXHg2Y1x4ZTciCisJCQkiXHg0Ylx4YTVceDdhXHg1NFx4N2FceDYwXHhmZlx4N2EiCisJCQkiXHhlMFx4NTBceDQwXHg5Nlx4MzVceDYzXHhlNFx4MGIiCisJCQkiXHg3Nlx4YmRceGE0XHg2NVx4MDBceDFiXHg1N1x4ODgiCisJCQkiXHhhZVx4ZWRceDM5XHg4OFx4NDJceDExXHgzY1x4ZWQiCisJCQkiXHg4NVx4NjdceDdkXHhiOVx4NjhceDgyXHhlOVx4NDMiCisJCQkiXHgzY1x4NDdceDUzXHhmYVx4ZThceGY4XHg5Zlx4MWYiCisJCQkiXHg5Zlx4ZWZceDBmXHhmN1x4MzBceGQ5XHgzMFx4MGUiCisJCQkiXHhiOVx4OWZceDY5XHgxOFx4MmZceDdlXHhmOFx4ZjgiCisJCQkiXHhmOFx4OGNceDBmXHhkNFx4MDJceDRkXHhlYVx4Y2QiCisJCQkiXHgwYVx4OWNceDZmXHg3MVx4NmRceDVhXHg0Y1x4NjAiCisJCQkiXHhjZVx4MjBceDU2XHgzMlx4YzZceGM1XHg5OVx4MWYiCisJCQkiXHgwOVx4ZTZceDRlXHgxOFx4MWFceDE1XHgxM1x4YTgiCisJCQkiXHg3ZFx4YjFceDZiXHhjMFx4YjJceDZkXHhmOFx4MjYiCisJCQkiXHg2Nlx4ZjhceDNkXHgxOFx4NzRceDcwXHg2Nlx4N2EiCisJCQkiXHgzNFx4MTdceGRlXHhiYVx4NDdceGYxXHgwNlx4MTgiCisJCQkiXHhjYlx4YWZceGViXHg0YVx4MWVceDhmXHhhN1x4NzciCisJCQkiXHhlMFx4M2JceDc4XHg2Mlx4NjZceGM5XHgxMFx4ZWEiCisJCQkiXHgxZlx4YjdceDI5XHgwYVx4NDVceGExXHgxZFx4MWUiCisJCQkiXHgxZFx4ZTJceDY1XHg2MVx4NTBceDljXHhkN1x4MDUiCisJCQkiXHhmMlx4MGJceDViXHgxMlx4NjFceDAyXHhjOFx4ZTUiCisJCQkiXHg2M1x4NGZceDIwXHgwY1x4MDdceDE3XHgzM1x4NWUiCisJCQkiXHgwM1x4OWFceDUzXHgwZlx4MmVceDU1XHhmZVx4NTAiCisJCQkiXHg0M1x4N2RceGQwXHhiNlx4N2VceDVhXHhkYVx4YWUiCisJCQkiXHg1OFx4ZWZceDE1XHhhOVx4ODNceGQ5XHg0Nlx4YjEiCisJCQkiXHg0Mlx4YWFceGY1XHgwMlx4NmNceGNlXHg5Mlx4MDYiCisJCQkiXHgxYlx4ZGJceDY2XHg0NVx4OTFceDc5XHhjMlx4MmQiCisJCQkiXHhlNlx4NTNceGQzXHgxNFx4ZmRceGJiXHg0NFx4NjMiCisJCQkiXHhjNlx4ZDdceDNkXHg3YVx4MGNceDc1XHg3OFx4OWQiCisJCQkiXHg1Y1x4YTZceDM5XHhiM1x4ZTVceDYzXHhjYVx4OGIiCisJCQkiXHhmZVx4ZDNceGVmXHg2MFx4ODNceGY2XHg4ZVx4NzAiCisJCQkiXHhiNlx4NjdceGM3XHg3N1x4ZWRceDIzXHhlZlx4NGMiCisJCQkiXHhmMFx4ZWRceDJkXHgwN1x4NTlceDZmXHhjMVx4MDEiCisJCQkiXHgzNFx4MzdceDA4XHhhYlx4ZDlceDFmXHgwOVx4YjEiCisJCQkiXHhjZVx4NWJceDE3XHhmZlx4NzRceGY4XHg5Y1x4ZDUiCisJCQkiXHgyY1x4NTZceDM5XHg3OVx4MGZceDY5XHg0NFx4NzUiCisJCQkiXHg1OFx4MjdceDAxXHhjNFx4YmZceGE3XHhhMVx4MWQiCisJCQkiXHg5MFx4MTdceDc3XHg4Nlx4NWFceDNmXHhkOVx4ZDEiCisJCQkiXHgwZVx4YTBceDEwXHhmOFx4ZWNceDFlXHhhNVx4N2YiCisJCQkiXHg1ZVx4MzZceGQxXHhlM1x4MDRceDJjXHg3MFx4ZjciCisJCQkiXHg4ZVx4YzBceDk4XHgyZlx4NmNceDk0XHgyYlx4NDEiCisJCQkiXHhiN1x4NjBceDAwXHhiN1x4MmVceGI4XHgwMlx4OGQiCisJCQkiXHhiOFx4YjBceGQzXHg4Nlx4YmFceDFkXHhkN1x4OTAiCisJCQkiXHhkNlx4YjZceGUxXHhmY1x4ZDdceGQ4XHgyOFx4MDYiCisJCQkiXHg2M1x4OWJceGNlXHg2MVx4MjRceDc5XHhjMFx4NzAiCisJCQkiXHg1Mlx4ZDBceGI2XHhkNFx4MjhceDk1XHgyNFx4ODciCisJCQkiXHgwM1x4MWZceGI3XHg5YVx4ZGFceGEzXHhmYlx4NTIiCisJCQkiXHg1Ylx4NjhceGU3XHg0Y1x4OGNceDI0XHhlMVx4NDIiCisJCQkiXHhmN1x4ZDVceGZkXHhhZFx4MDZceDMyXHg5Zlx4YmEiCisJCQkiXHhjMVx4ZmNceGRkXHhjNlx4ZmNceGZjXHhiM1x4MzgiCisJCQkiXHg3NFx4NTZceDU4XHg0MFx4MDJceDM3XHg1Mlx4MmMiCisJCQkiXHg1NVx4Y2NceGIzXHg5ZVx4N2FceGU5XHhkNFx4MzgiCisJCQkiXHg0MVx4NWVceDBjXHgzNVx4ZTJceDExXHhkMVx4MTMiCisJCQkiXHhmOFx4YjdceDhkXHg3Mlx4NmJceDIyXHgyYVx4YjAiCisJCQkiXHhkYlx4MDhceGJhXHgzNVx4YjlceDNmXHhjOFx4ZDMiCisJCQkiXHgyNFx4OTBceGVjXHg1OFx4ZDJceDA5XHhjN1x4MmQiCisJCQkiXHhlZFx4MzhceDgwXHgzNlx4NzJceDQzXHgyN1x4NDkiCisJCQkiXHg0YVx4ODBceDhhXHhhMlx4ZThceGQzXHhkYVx4MzAiCisJCQkiXHg3ZFx4YjZceDgyXHgzN1x4ODZceDkyXHg4Nlx4M2UiCisJCQkiXHgwOFx4YjJceDI4XHg1YVx4NTVceDQ0XHgyNFx4N2QiCisJCQkiXHg0MFx4NDhceDhhXHhiNlx4ODlceDU4XHgwOFx4YTAiCisJCQkiXHhkNlx4NmRceDNhXHgxN1x4YmZceGY2XHg1NFx4YTIiCisJCQkiXHhmNVx4ZDNceDhjXHgwZlx4NzhceDEyXHg1N1x4OGIiCisJCQkiXHhkNVx4YzJceGZkXHg1OFx4NWJceDdmXHgzOFx4ZTMiCisJCQkiXHhjY1x4YjdceDdjXHg0OFx4YjNceDIwXHhlOFx4ODEiCisJCQkiXHgxNFx4MzJceDQ1XHgwNVx4ZTBceGRiXHg5Zlx4NzUiCisJCQkiXHg4NVx4YjRceDZhXHhmY1x4OTVceGUzXHg1NFx4MjIiCisJCQkiXHgxMlx4ZWVceDMwXHhmZVx4ZDhceDMwXHhlZlx4MzQiCisJCQkiXHg1MFx4YWJceDQ2XHgzMFx4OThceDJmXHhiN1x4YzAiCisJCQkiXHgxNVx4YTJceDgzXHhiNlx4ZjJceDA2XHgyMVx4YTIiCisJCQkiXHhjM1x4MjZceDM3XHgxNFx4ZDFceDRkXHhiNVx4MTAiCisJCQkiXHg1Mlx4NzZceDRkXHg2YVx4ZWVceGI1XHgyYlx4MTUiCisJCQkiXHhiN1x4ZjlceDUxXHhlOFx4MmFceGFmXHhjN1x4ZmEiCisJCQkiXHg3N1x4YWZceGIwXHgwNVx4NGRceGQxXHg2OFx4OGUiCisJCQkiXHg3NFx4MDVceDlmXHg5ZFx4OTNceGE1XHgzZVx4N2YiCisJCQkiXHg0ZVx4NWZceDlkXHhjYlx4MDlceGM3XHg4M1x4ZTMiCisJCQkiXHgwMlx4OWRceDI3XHgxZlx4ZWZceDg1XHgwNVx4OGQiCisJCQkiXHhlY1x4NTVceDg4XHgwZlx4MGRceDdjXHg0Y1x4ZTgiCisJCQkiXHhhMVx4NzVceGEwXHhkOFx4MDZceDQ3XHgxNFx4ZWYiCisJCQkiXHhhYVx4NjFceGNmXHgyNlx4MTVceGFkXHhkOFx4YTMiCisJCQkiXHhhYVx4NzVceGYyXHg3OFx4NGFceDVhXHg2MVx4ZGYiCisJCQkiXHg4Ylx4YzdceDA0XHhiY1x4YjJceDMyXHhkMlx4N2UiCisJCQkiXHg0Mlx4ZWVceGI0XHgyZlx4NTFceGZmXHg3Ylx4MmUiCisJCQkiXHhkM1x4MDJceGU4XHhkY1x4NWRceDBkXHg1MFx4ZGMiCisJCQkiXHhhZVx4YjdceDQ2XHhmOVx4YThceGU2XHhkMFx4MTYiCisJCQkiXHhjY1x4ZTZceDJjXHg4MVx4YzdceGFkXHhlOVx4ZjAiCisJCQkiXHgwNVx4NzJceDZkXHgzZFx4MGFceDdhXHhhOVx4MDIiCisJCQkiXHhhY1x4ODJceDkzXHg2ZVx4YjZceDFjXHgyOFx4ZmMiCisJCQkiXHg0NFx4MTJceGZiXHg3M1x4NzdceGQ0XHgxM1x4MzkiCisJCQkiXHgyOVx4ODhceDhhXHhmM1x4NWNceGE2XHgzNlx4YTAiCisJCQkiXHgyYVx4ZWRceDdlXHhiMVx4MWRceGQ2XHg0Y1x4NmIiCisJCQkiXHg0MVx4MDFceDE4XHg1ZFx4NWRceDA3XHg5N1x4YTYiCisJCQkiXHg0Ylx4ZWZceDMxXHgxOFx4ZWFceGFjXHhiMVx4ODQiCisJCQkiXHgyMVx4ZWRceGRhXHg4NiIsCisJCS5ybGVuID0gNDEwMCwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgNDA2NCwgMzYgfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfY3RyX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBSRkMgMzY4NiAqLworCQkua2V5CT0gIlx4YWVceDY4XHg1Mlx4ZjhceDEyXHgxMFx4NjdceGNjIgorCQkJICAiXHg0Ylx4ZjdceGE1XHg3Nlx4NTVceDc3XHhmM1x4OWUiCisJCQkgICJceDAwXHgwMFx4MDBceDMwIiwKKwkJLmtsZW4JPSAyMCwKKwkJLml2CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0CT0gIlx4ZTRceDA5XHg1ZFx4NGZceGI3XHhhN1x4YjNceDc5IgorCQkJICAiXHgyZFx4NjFceDc1XHhhM1x4MjZceDEzXHgxMVx4YjgiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlNpbmdsZSBibG9jayBtc2ciLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDdlXHgyNFx4MDZceDc4XHgxN1x4ZmFceGUwXHhkNyIKKwkJCSAgIlx4NDNceGQ2XHhjZVx4MWZceDMyXHg1M1x4OTFceDYzIgorCQkJICAiXHgwMFx4NmNceGI2XHhkYiIsCisJCS5rbGVuCT0gMjAsCisJCS5pdgk9ICJceGMwXHg1NFx4M2JceDU5XHhkYVx4NDhceGQ5XHgwYiIsCisJCS5pbnB1dAk9ICJceDUxXHgwNFx4YTFceDA2XHgxNlx4OGFceDcyXHhkOSIKKwkJCSAgIlx4NzlceDBkXHg0MVx4ZWVceDhlXHhkYVx4ZDNceDg4IgorCQkJICAiXHhlYlx4MmVceDFlXHhmY1x4NDZceGRhXHg1N1x4YzgiCisJCQkgICJceGZjXHhlNlx4MzBceGRmXHg5MVx4NDFceGJlXHgyOCIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAorCQkucmxlbgk9IDMyLAorCX0sIHsKKwkJLmtleQk9ICJceDE2XHhhZlx4NWJceDE0XHg1Zlx4YzlceGY1XHg3OSIKKwkJCSAgIlx4YzFceDc1XHhmOVx4M2VceDNiXHhmYlx4MGVceGVkIgorCQkJICAiXHg4Nlx4M2RceDA2XHhjY1x4ZmRceGI3XHg4NVx4MTUiCisJCQkgICJceDAwXHgwMFx4MDBceDQ4IiwKKwkJLmtsZW4JPSAyOCwKKwkJLml2CT0gIlx4MzZceDczXHgzY1x4MTRceDdkXHg2ZFx4OTNceGNiIiwKKwkJLmlucHV0CT0gIlx4NGJceDU1XHgzOFx4NGZceGUyXHg1OVx4YzlceGM4IgorCQkJICAiXHg0ZVx4NzlceDM1XHhhMFx4MDNceGNiXHhlOVx4MjgiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlNpbmdsZSBibG9jayBtc2ciLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDdjXHg1Y1x4YjJceDQwXHgxYlx4M2RceGMzXHgzYyIKKwkJCSAgIlx4MTlceGU3XHgzNFx4MDhceDE5XHhlMFx4ZjZceDljIgorCQkJICAiXHg2N1x4OGNceDNkXHhiOFx4ZTZceGY2XHhhOVx4MWEiCisJCQkgICJceDAwXHg5Nlx4YjBceDNiIiwKKwkJLmtsZW4JPSAyOCwKKwkJLml2CT0gIlx4MDJceDBjXHg2ZVx4YWRceGMyXHhjYlx4NTBceDBkIiwKKwkJLmlucHV0CT0gIlx4NDVceDMyXHg0M1x4ZmNceDYwXHg5Ylx4MjNceDMyIgorCQkJICAiXHg3ZVx4ZGZceGFhXHhmYVx4NzFceDMxXHhjZFx4OWYiCisJCQkgICJceDg0XHg5MFx4NzBceDFjXHg1YVx4ZDRceGE3XHg5YyIKKwkJCSAgIlx4ZmNceDFmXHhlMFx4ZmZceDQyXHhmNFx4ZmJceDAwIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5ybGVuCT0gMzIsCisJfSwgeworCQkua2V5CT0gIlx4NzdceDZiXHhlZlx4ZjJceDg1XHgxZFx4YjBceDZmIgorCQkJICAiXHg0Y1x4OGFceDA1XHg0Mlx4YzhceDY5XHg2Zlx4NmMiCisJCQkgICJceDZhXHg4MVx4YWZceDFlXHhlY1x4OTZceGI0XHhkMyIKKwkJCSAgIlx4N2ZceGMxXHhkNlx4ODlceGU2XHhjMVx4YzFceDA0IgorCQkJICAiXHgwMFx4MDBceDAwXHg2MCIsCisJCS5rbGVuCT0gMzYsCisJCS5pdgk9ICJceGRiXHg1Nlx4NzJceGM5XHg3YVx4YThceGYwXHhiMiIsCisJCS5pbnB1dAk9ICJceDE0XHg1YVx4ZDBceDFkXHhiZlx4ODJceDRlXHhjNyIKKwkJCSAgIlx4NTZceDA4XHg2M1x4ZGNceDcxXHhlM1x4ZTBceGMwIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJTaW5nbGUgYmxvY2sgbXNnIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHhmNlx4ZDZceDZkXHg2Ylx4ZDVceDJkXHg1OVx4YmIiCisJCQkgICJceDA3XHg5Nlx4MzZceDU4XHg3OVx4ZWZceGY4XHg4NiIKKwkJCSAgIlx4YzZceDZkXHhkNVx4MWFceDViXHg2YVx4OTlceDc0IgorCQkJICAiXHg0Ylx4NTBceDU5XHgwY1x4ODdceGEyXHgzOFx4ODQiCisJCQkgICJceDAwXHhmYVx4YWNceDI0IiwKKwkJLmtsZW4JPSAzNiwKKwkJLml2CT0gIlx4YzFceDU4XHg1ZVx4ZjFceDVhXHg0M1x4ZDhceDc1IiwKKwkJLmlucHV0CT0gIlx4ZjBceDVlXHgyM1x4MWJceDM4XHg5NFx4NjFceDJjIgorCQkJICAiXHg0OVx4ZWVceDAwXHgwYlx4ODBceDRlXHhiMlx4YTkiCisJCQkgICJceGI4XHgzMFx4NmJceDUwXHg4Zlx4ODNceDlkXHg2YSIKKwkJCSAgIlx4NTVceDMwXHg4M1x4MWRceDkzXHg0NFx4YWZceDFjIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5ybGVuCT0gMzIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19nY21fZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBGcm9tIE1jR3JldyAmIFZpZWdhIC0gaHR0cDovL2NpdGVzZWVyLmlzdC5wc3UuZWR1LzY1Njk4OS5odG1sICovCisJCS5rZXkgICAgPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NThceGUyXHhmY1x4Y2VceGZhXHg3ZVx4MzBceDYxIgorCQkJICAiXHgzNlx4N2ZceDFkXHg1N1x4YTRceGU3XHg0NVx4NWEiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dCAgPSB6ZXJvZWRfc3RyaW5nLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0ID0gIlx4MDNceDg4XHhkYVx4Y2VceDYwXHhiNlx4YTNceDkyIgorCQkJICAiXHhmM1x4MjhceGMyXHhiOVx4NzFceGIyXHhmZVx4NzgiCisJCQkgICJceGFiXHg2ZVx4NDdceGQ0XHgyY1x4ZWNceDEzXHhiZCIKKwkJCSAgIlx4ZjVceDNhXHg2N1x4YjJceDEyXHg1N1x4YmRceGRmIiwKKwkJLnJsZW4JPSAzMiwKKwl9LCB7CisJCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKKwkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAorCQkuaW5wdXQJPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCisJCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKKwkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgorCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCisJCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKKwkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgorCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCisJCQkgICJceGJhXHg2M1x4N2JceDM5XHgxYVx4YWZceGQyXHg1NSIsCisJCS5pbGVuCT0gNjQsCisJCS5yZXN1bHQgPSAiXHg0Mlx4ODNceDFlXHhjMlx4MjFceDc3XHg3NFx4MjQiCisJCQkgICJceDRiXHg3Mlx4MjFceGI3XHg4NFx4ZDBceGQ0XHg5YyIKKwkJCSAgIlx4ZTNceGFhXHgyMVx4MmZceDJjXHgwMlx4YTRceGUwIgorCQkJICAiXHgzNVx4YzFceDdlXHgyM1x4MjlceGFjXHhhMVx4MmUiCisJCQkgICJceDIxXHhkNVx4MTRceGIyXHg1NFx4NjZceDkzXHgxYyIKKwkJCSAgIlx4N2RceDhmXHg2YVx4NWFceGFjXHg4NFx4YWFceDA1IgorCQkJICAiXHgxYlx4YTNceDBiXHgzOVx4NmFceDBhXHhhY1x4OTciCisJCQkgICJceDNkXHg1OFx4ZTBceDkxXHg0N1x4M2ZceDU5XHg4NSIKKwkJCSAgIlx4NGRceDVjXHgyYVx4ZjNceDI3XHhjZFx4NjRceGE2IgorCQkJICAiXHgyY1x4ZjNceDVhXHhiZFx4MmJceGE2XHhmYVx4YjQiLAorCQkucmxlbgk9IDgwLAorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgorCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCisJCS5pbnB1dAk9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKKwkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgorCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCisJCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKKwkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgorCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCisJCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKKwkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAorCQkuaWxlbgk9IDYwLAorCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCisJCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKKwkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAorCQkuYWxlbgk9IDIwLAorCQkucmVzdWx0ID0gIlx4NDJceDgzXHgxZVx4YzJceDIxXHg3N1x4NzRceDI0IgorCQkJICAiXHg0Ylx4NzJceDIxXHhiN1x4ODRceGQwXHhkNFx4OWMiCisJCQkgICJceGUzXHhhYVx4MjFceDJmXHgyY1x4MDJceGE0XHhlMCIKKwkJCSAgIlx4MzVceGMxXHg3ZVx4MjNceDI5XHhhY1x4YTFceDJlIgorCQkJICAiXHgyMVx4ZDVceDE0XHhiMlx4NTRceDY2XHg5M1x4MWMiCisJCQkgICJceDdkXHg4Zlx4NmFceDVhXHhhY1x4ODRceGFhXHgwNSIKKwkJCSAgIlx4MWJceGEzXHgwYlx4MzlceDZhXHgwYVx4YWNceDk3IgorCQkJICAiXHgzZFx4NThceGUwXHg5MSIKKwkJCSAgIlx4NWJceGM5XHg0Zlx4YmNceDMyXHgyMVx4YTVceGRiIgorCQkJICAiXHg5NFx4ZmFceGU5XHg1YVx4ZTdceDEyXHgxYVx4NDciLAorCQkucmxlbgk9IDc2LAorCX0sIHsKKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMjQsCisJCS5yZXN1bHQJPSAiXHhjZFx4MzNceGIyXHg4YVx4YzdceDczXHhmN1x4NGIiCisJCQkgICJceGEwXHgwZVx4ZDFceGYzXHgxMlx4NTdceDI0XHgzNSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQgPSAiXHg5OFx4ZTdceDI0XHg3Y1x4MDdceGYwXHhmZVx4NDEiCisJCQkgICJceDFjXHgyNlx4N2VceDQzXHg4NFx4YjBceGY2XHgwMCIKKwkJCSAgIlx4MmZceGY1XHg4ZFx4ODBceDAzXHgzOVx4MjdceGFiIgorCQkJICAiXHg4ZVx4ZjRceGQ0XHg1OFx4NzVceDE0XHhmMFx4ZmIiLAorCQkucmxlbgk9IDMyLAorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiLAorCQkua2xlbgk9IDI0LAorCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCisJCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKKwkJLmlucHV0CT0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgorCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCisJCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKKwkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgorCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCisJCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKKwkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgorCQkJICAiXHhiYVx4NjNceDdiXHgzOVx4MWFceGFmXHhkMlx4NTUiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0ID0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgorCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCisJCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKKwkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgorCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCisJCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKKwkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgorCQkJICAiXHhjY1x4ZGFceDI3XHgxMFx4YWNceGFkXHhlMlx4NTYiCisJCQkgICJceDk5XHgyNFx4YTdceGM4XHg1OFx4NzNceDM2XHhiZiIKKwkJCSAgIlx4YjFceDE4XHgwMlx4NGRceGI4XHg2N1x4NGFceDE0IiwKKwkJLnJsZW4JPSA4MCwKKwl9LCB7CisJCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKwkJCSAgIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIiwKKwkJLmtsZW4JPSAyNCwKKwkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgorCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCisJCS5pbnB1dAk9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKKwkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgorCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCisJCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKKwkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgorCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCisJCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKKwkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAorCQkuaWxlbgk9IDYwLAorCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCisJCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKKwkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAorCQkuYWxlbgk9IDIwLAorCQkucmVzdWx0ID0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgorCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCisJCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKKwkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgorCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCisJCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKKwkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgorCQkJICAiXHhjY1x4ZGFceDI3XHgxMCIKKwkJCSAgIlx4MjVceDE5XHg0OVx4OGVceDgwXHhmMVx4NDdceDhmIgorCQkJICAiXHgzN1x4YmFceDU1XHhiZFx4NmRceDI3XHg2MVx4OGMiLAorCQkucmxlbgk9IDc2LAorCQkubnAJPSAyLAorCQkudGFwCT0geyAzMiwgMjggfSwKKwkJLmFucAk9IDIsCisJCS5hdGFwCT0geyA4LCAxMiB9CisJfSwgeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDUzXHgwZlx4OGFceGZiXHhjN1x4NDVceDM2XHhiOSIKKwkJCSAgIlx4YTlceDYzXHhiNFx4ZjFceGM0XHhjYlx4NzNceDhiIiwKKwkJLnJsZW4JPSAxNiwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGFlYWRfdGVzdHZlYyBhZXNfZ2NtX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBNY0dyZXcgJiBWaWVnYSAtIGh0dHA6Ly9jaXRlc2Vlci5pc3QucHN1LmVkdS82NTY5ODkuaHRtbCAqLworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4Y2VceGE3XHg0MFx4M2RceDRkXHg2MFx4NmJceDZlIgorCQkJICAiXHgwN1x4NGVceGM1XHhkM1x4YmFceGYzXHg5ZFx4MTgiCisJCQkgICJceGQwXHhkMVx4YzhceGE3XHg5OVx4OTlceDZiXHhmMCIKKwkJCSAgIlx4MjZceDViXHg5OFx4YjVceGQ0XHg4YVx4YjlceDE5IiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdCAgPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKKwkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAorCQkuaW5wdXQJPSAiXHg1Mlx4MmRceGMxXHhmMFx4OTlceDU2XHg3ZFx4MDciCisJCQkgICJceGY0XHg3Zlx4MzdceGEzXHgyYVx4ODRceDQyXHg3ZCIKKwkJCSAgIlx4NjRceDNhXHg4Y1x4ZGNceGJmXHhlNVx4YzBceGM5IgorCQkJICAiXHg3NVx4OThceGEyXHhiZFx4MjVceDU1XHhkMVx4YWEiCisJCQkgICJceDhjXHhiMFx4OGVceDQ4XHg1OVx4MGRceGJiXHgzZCIKKwkJCSAgIlx4YTdceGIwXHg4Ylx4MTBceDU2XHg4Mlx4ODhceDM4IgorCQkJICAiXHhjNVx4ZjZceDFlXHg2M1x4OTNceGJhXHg3YVx4MGEiCisJCQkgICJceGJjXHhjOVx4ZjZceDYyXHg4OVx4ODBceDE1XHhhZCIKKwkJCSAgIlx4YjBceDk0XHhkYVx4YzVceGQ5XHgzNFx4NzFceGJkIgorCQkJICAiXHhlY1x4MWFceDUwXHgyMlx4NzBceGUzXHhjY1x4NmMiLAorCQkuaWxlbgk9IDgwLAorCQkucmVzdWx0ID0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgorCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCisJCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKKwkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgorCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCisJCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKKwkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgorCQkJICAiXHhiYVx4NjNceDdiXHgzOVx4MWFceGFmXHhkMlx4NTUiLAorCQkucmxlbgk9IDY0LAorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceGNhXHhmZVx4YmFceGJlXHhmYVx4Y2VceGRiXHhhZCIKKwkJCSAgIlx4ZGVceGNhXHhmOFx4ODgiLAorCQkuaW5wdXQJPSAiXHg1Mlx4MmRceGMxXHhmMFx4OTlceDU2XHg3ZFx4MDciCisJCQkgICJceGY0XHg3Zlx4MzdceGEzXHgyYVx4ODRceDQyXHg3ZCIKKwkJCSAgIlx4NjRceDNhXHg4Y1x4ZGNceGJmXHhlNVx4YzBceGM5IgorCQkJICAiXHg3NVx4OThceGEyXHhiZFx4MjVceDU1XHhkMVx4YWEiCisJCQkgICJceDhjXHhiMFx4OGVceDQ4XHg1OVx4MGRceGJiXHgzZCIKKwkJCSAgIlx4YTdceGIwXHg4Ylx4MTBceDU2XHg4Mlx4ODhceDM4IgorCQkJICAiXHhjNVx4ZjZceDFlXHg2M1x4OTNceGJhXHg3YVx4MGEiCisJCQkgICJceGJjXHhjOVx4ZjZceDYyIgorCQkJICAiXHg3Nlx4ZmNceDZlXHhjZVx4MGZceDRlXHgxN1x4NjgiCisJCQkgICJceGNkXHhkZlx4ODhceDUzXHhiYlx4MmRceDU1XHgxYiIsCisJCS5pbGVuCT0gNzYsCisJCS5hc3NvYwk9ICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKKwkJCSAgIlx4ZmVceGVkXHhmYVx4Y2VceGRlXHhhZFx4YmVceGVmIgorCQkJICAiXHhhYlx4YWRceGRhXHhkMiIsCisJCS5hbGVuCT0gMjAsCisJCS5yZXN1bHQgPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCisJCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKKwkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgorCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCisJCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKKwkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgorCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCisJCQkgICJceGJhXHg2M1x4N2JceDM5IiwKKwkJLnJsZW4JPSA2MCwKKwkJLm5wICAgICA9IDIsCisJCS50YXAgICAgPSB7IDQ4LCAyOCB9LAorCQkuYW5wCT0gMywKKwkJLmF0YXAJPSB7IDgsIDgsIDQgfQorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgorCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCisJCS5pbnB1dAk9ICJceDQyXHg4M1x4MWVceGMyXHgyMVx4NzdceDc0XHgyNCIKKwkJCSAgIlx4NGJceDcyXHgyMVx4YjdceDg0XHhkMFx4ZDRceDljIgorCQkJICAiXHhlM1x4YWFceDIxXHgyZlx4MmNceDAyXHhhNFx4ZTAiCisJCQkgICJceDM1XHhjMVx4N2VceDIzXHgyOVx4YWNceGExXHgyZSIKKwkJCSAgIlx4MjFceGQ1XHgxNFx4YjJceDU0XHg2Nlx4OTNceDFjIgorCQkJICAiXHg3ZFx4OGZceDZhXHg1YVx4YWNceDg0XHhhYVx4MDUiCisJCQkgICJceDFiXHhhM1x4MGJceDM5XHg2YVx4MGFceGFjXHg5NyIKKwkJCSAgIlx4M2RceDU4XHhlMFx4OTFceDQ3XHgzZlx4NTlceDg1IgorCQkJICAiXHg0ZFx4NWNceDJhXHhmM1x4MjdceGNkXHg2NFx4YTYiCisJCQkgICJceDJjXHhmM1x4NWFceGJkXHgyYlx4YTZceGZhXHhiNCIsCisJCS5pbGVuCT0gODAsCisJCS5yZXN1bHQgPSAiXHhkOVx4MzFceDMyXHgyNVx4ZjhceDg0XHgwNlx4ZTUiCisJCQkgICJceGE1XHg1OVx4MDlceGM1XHhhZlx4ZjVceDI2XHg5YSIKKwkJCSAgIlx4ODZceGE3XHhhOVx4NTNceDE1XHgzNFx4ZjdceGRhIgorCQkJICAiXHgyZVx4NGNceDMwXHgzZFx4OGFceDMxXHg4YVx4NzIiCisJCQkgICJceDFjXHgzY1x4MGNceDk1XHg5NVx4NjhceDA5XHg1MyIKKwkJCSAgIlx4MmZceGNmXHgwZVx4MjRceDQ5XHhhNlx4YjVceDI1IgorCQkJICAiXHhiMVx4NmFceGVkXHhmNVx4YWFceDBkXHhlNlx4NTciCisJCQkgICJceGJhXHg2M1x4N2JceDM5XHgxYVx4YWZceGQyXHg1NSIsCisJCS5ybGVuCT0gNjQsCisJfSwgeworCQkua2V5CT0gIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIgorCQkJICAiXHg2ZFx4NmFceDhmXHg5NFx4NjdceDMwXHg4M1x4MDgiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCisJCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKKwkJLmlucHV0CT0gIlx4NDJceDgzXHgxZVx4YzJceDIxXHg3N1x4NzRceDI0IgorCQkJICAiXHg0Ylx4NzJceDIxXHhiN1x4ODRceGQwXHhkNFx4OWMiCisJCQkgICJceGUzXHhhYVx4MjFceDJmXHgyY1x4MDJceGE0XHhlMCIKKwkJCSAgIlx4MzVceGMxXHg3ZVx4MjNceDI5XHhhY1x4YTFceDJlIgorCQkJICAiXHgyMVx4ZDVceDE0XHhiMlx4NTRceDY2XHg5M1x4MWMiCisJCQkgICJceDdkXHg4Zlx4NmFceDVhXHhhY1x4ODRceGFhXHgwNSIKKwkJCSAgIlx4MWJceGEzXHgwYlx4MzlceDZhXHgwYVx4YWNceDk3IgorCQkJICAiXHgzZFx4NThceGUwXHg5MSIKKwkJCSAgIlx4NWJceGM5XHg0Zlx4YmNceDMyXHgyMVx4YTVceGRiIgorCQkJICAiXHg5NFx4ZmFceGU5XHg1YVx4ZTdceDEyXHgxYVx4NDciLAorCQkuaWxlbgk9IDc2LAorCQkuYXNzb2MJPSAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCisJCQkgICJceGZlXHhlZFx4ZmFceGNlXHhkZVx4YWRceGJlXHhlZiIKKwkJCSAgIlx4YWJceGFkXHhkYVx4ZDIiLAorCQkuYWxlbgk9IDIwLAorCQkucmVzdWx0ID0gIlx4ZDlceDMxXHgzMlx4MjVceGY4XHg4NFx4MDZceGU1IgorCQkJICAiXHhhNVx4NTlceDA5XHhjNVx4YWZceGY1XHgyNlx4OWEiCisJCQkgICJceDg2XHhhN1x4YTlceDUzXHgxNVx4MzRceGY3XHhkYSIKKwkJCSAgIlx4MmVceDRjXHgzMFx4M2RceDhhXHgzMVx4OGFceDcyIgorCQkJICAiXHgxY1x4M2NceDBjXHg5NVx4OTVceDY4XHgwOVx4NTMiCisJCQkgICJceDJmXHhjZlx4MGVceDI0XHg0OVx4YTZceGI1XHgyNSIKKwkJCSAgIlx4YjFceDZhXHhlZFx4ZjVceGFhXHgwZFx4ZTZceDU3IgorCQkJICAiXHhiYVx4NjNceDdiXHgzOSIsCisJCS5ybGVuCT0gNjAsCisJfSwgeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAyNCwKKwkJLmlucHV0CT0gIlx4OThceGU3XHgyNFx4N2NceDA3XHhmMFx4ZmVceDQxIgorCQkJICAiXHgxY1x4MjZceDdlXHg0M1x4ODRceGIwXHhmNlx4MDAiCisJCQkgICJceDJmXHhmNVx4OGRceDgwXHgwM1x4MzlceDI3XHhhYiIKKwkJCSAgIlx4OGVceGY0XHhkNFx4NThceDc1XHgxNFx4ZjBceGZiIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdCAgPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorCQkJICAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiLAorCQkua2xlbgk9IDI0LAorCQkuaXYJPSAiXHhjYVx4ZmVceGJhXHhiZVx4ZmFceGNlXHhkYlx4YWQiCisJCQkgICJceGRlXHhjYVx4ZjhceDg4IiwKKwkJLmlucHV0CT0gIlx4MzlceDgwXHhjYVx4MGJceDNjXHgwMFx4ZThceDQxIgorCQkJICAiXHhlYlx4MDZceGZhXHhjNFx4ODdceDJhXHgyN1x4NTciCisJCQkgICJceDg1XHg5ZVx4MWNceGVhXHhhNlx4ZWZceGQ5XHg4NCIKKwkJCSAgIlx4NjJceDg1XHg5M1x4YjRceDBjXHhhMVx4ZTFceDljIgorCQkJICAiXHg3ZFx4NzdceDNkXHgwMFx4YzFceDQ0XHhjNVx4MjUiCisJCQkgICJceGFjXHg2MVx4OWRceDE4XHhjOFx4NGFceDNmXHg0NyIKKwkJCSAgIlx4MThceGUyXHg0NFx4OGJceDJmXHhlM1x4MjRceGQ5IgorCQkJICAiXHhjY1x4ZGFceDI3XHgxMFx4YWNceGFkXHhlMlx4NTYiCisJCQkgICJceDk5XHgyNFx4YTdceGM4XHg1OFx4NzNceDM2XHhiZiIKKwkJCSAgIlx4YjFceDE4XHgwMlx4NGRceGI4XHg2N1x4NGFceDE0IiwKKwkJLmlsZW4JPSA4MCwKKwkJLnJlc3VsdCA9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKKwkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgorCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCisJCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKKwkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgorCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCisJCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKKwkJCSAgIlx4YmFceDYzXHg3Ylx4MzlceDFhXHhhZlx4ZDJceDU1IiwKKwkJLnJsZW4JPSA2NCwKKwl9LCB7CisJCS5rZXkJPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKwkJCSAgIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIiwKKwkJLmtsZW4JPSAyNCwKKwkJLml2CT0gIlx4Y2FceGZlXHhiYVx4YmVceGZhXHhjZVx4ZGJceGFkIgorCQkJICAiXHhkZVx4Y2FceGY4XHg4OCIsCisJCS5pbnB1dAk9ICJceDM5XHg4MFx4Y2FceDBiXHgzY1x4MDBceGU4XHg0MSIKKwkJCSAgIlx4ZWJceDA2XHhmYVx4YzRceDg3XHgyYVx4MjdceDU3IgorCQkJICAiXHg4NVx4OWVceDFjXHhlYVx4YTZceGVmXHhkOVx4ODQiCisJCQkgICJceDYyXHg4NVx4OTNceGI0XHgwY1x4YTFceGUxXHg5YyIKKwkJCSAgIlx4N2RceDc3XHgzZFx4MDBceGMxXHg0NFx4YzVceDI1IgorCQkJICAiXHhhY1x4NjFceDlkXHgxOFx4YzhceDRhXHgzZlx4NDciCisJCQkgICJceDE4XHhlMlx4NDRceDhiXHgyZlx4ZTNceDI0XHhkOSIKKwkJCSAgIlx4Y2NceGRhXHgyN1x4MTAiCisJCQkgICJceDI1XHgxOVx4NDlceDhlXHg4MFx4ZjFceDQ3XHg4ZiIKKwkJCSAgIlx4MzdceGJhXHg1NVx4YmRceDZkXHgyN1x4NjFceDhjIiwKKwkJLmlsZW4JPSA3NiwKKwkJLmFzc29jCT0gIlx4ZmVceGVkXHhmYVx4Y2VceGRlXHhhZFx4YmVceGVmIgorCQkJICAiXHhmZVx4ZWRceGZhXHhjZVx4ZGVceGFkXHhiZVx4ZWYiCisJCQkgICJceGFiXHhhZFx4ZGFceGQyIiwKKwkJLmFsZW4JPSAyMCwKKwkJLnJlc3VsdCA9ICJceGQ5XHgzMVx4MzJceDI1XHhmOFx4ODRceDA2XHhlNSIKKwkJCSAgIlx4YTVceDU5XHgwOVx4YzVceGFmXHhmNVx4MjZceDlhIgorCQkJICAiXHg4Nlx4YTdceGE5XHg1M1x4MTVceDM0XHhmN1x4ZGEiCisJCQkgICJceDJlXHg0Y1x4MzBceDNkXHg4YVx4MzFceDhhXHg3MiIKKwkJCSAgIlx4MWNceDNjXHgwY1x4OTVceDk1XHg2OFx4MDlceDUzIgorCQkJICAiXHgyZlx4Y2ZceDBlXHgyNFx4NDlceGE2XHhiNVx4MjUiCisJCQkgICJceGIxXHg2YVx4ZWRceGY1XHhhYVx4MGRceGU2XHg1NyIKKwkJCSAgIlx4YmFceDYzXHg3Ylx4MzkiLAorCQkucmxlbgk9IDYwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19jY21fZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBGcm9tIFJGQyAzNjEwICovCisJCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwM1x4MDJceDAxXHgwMCIKKwkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKKwkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwKKwkJLmFsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWUiLAorCQkuaWxlbgk9IDIzLAorCQkucmVzdWx0CT0gIlx4NThceDhjXHg5N1x4OWFceDYxXHhjNlx4NjNceGQyIgorCQkJICAiXHhmMFx4NjZceGQwXHhjMlx4YzBceGY5XHg4OVx4ODAiCisJCQkgICJceDZkXHg1Zlx4NmJceDYxXHhkYVx4YzNceDg0XHgxNyIKKwkJCSAgIlx4ZThceGQxXHgyY1x4ZmRceGY5XHgyNlx4ZTAiLAorCQkucmxlbgk9IDMxLAorCX0sIHsKKwkJLmtleQk9ICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4MDFceDAwXHgwMFx4MDBceDA3XHgwNlx4MDVceDA0IgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHgwMFx4MDAiLAorCQkuYXNzb2MJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiIiwKKwkJLmFsZW4JPSAxMiwKKwkJLmlucHV0CT0gIlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzIgorCQkJICAiXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWIiCisJCQkgICJceDFjXHgxZFx4MWVceDFmIiwKKwkJLmlsZW4JPSAyMCwKKwkJLnJlc3VsdAk9ICJceGRjXHhmMVx4ZmJceDdiXHg1ZFx4OWVceDIzXHhmYiIKKwkJCSAgIlx4OWRceDRlXHgxM1x4MTJceDUzXHg2NVx4OGFceGQ4IgorCQkJICAiXHg2ZVx4YmRceGNhXHgzZVx4NTFceGU4XHgzZlx4MDciCisJCQkgICJceDdkXHg5Y1x4MmRceDkzIiwKKwkJLnJsZW4JPSAyOCwKKwl9LCB7CisJCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwYlx4MGFceDA5XHgwOCIKKwkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKKwkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IiwKKwkJLmFsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIgorCQkJICAiXHgyMCIsCisJCS5pbGVuCT0gMjUsCisJCS5yZXN1bHQJPSAiXHg4Mlx4NTNceDFhXHg2MFx4Y2NceDI0XHg5NFx4NWEiCisJCQkgICJceDRiXHg4Mlx4NzlceDE4XHgxYVx4YjVceGM4XHg0ZCIKKwkJCSAgIlx4ZjJceDFjXHhlN1x4ZjlceGI3XHgzZlx4NDJceGUxIgorCQkJICAiXHg5N1x4ZWFceDljXHgwN1x4ZTVceDZiXHg1ZVx4YjEiCisJCQkgICJceDdlXHg1Zlx4NGUiLAorCQkucmxlbgk9IDM1LAorCX0sIHsKKwkJLmtleQk9ICJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSAgIlx4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4MDFceDAwXHgwMFx4MDBceDBjXHgwYlx4MGFceDA5IgorCQkJICAiXHhhMFx4YTFceGEyXHhhM1x4YTRceGE1XHgwMFx4MDAiLAorCQkuYXNzb2MJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiIiwKKwkJLmFsZW4JPSAxMiwKKwkJLmlucHV0CT0gIlx4MGNceDBkXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzIgorCQkJICAiXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxYVx4MWIiCisJCQkgICJceDFjXHgxZFx4MWUiLAorCQkuaWxlbgk9IDE5LAorCQkucmVzdWx0CT0gIlx4MDdceDM0XHgyNVx4OTRceDE1XHg3N1x4ODVceDE1IgorCQkJICAiXHgyYlx4MDdceDQwXHg5OFx4MzNceDBhXHhiYlx4MTQiCisJCQkgICJceDFiXHg5NFx4N2JceDU2XHg2YVx4YTlceDQwXHg2YiIKKwkJCSAgIlx4NGRceDk5XHg5OVx4ODhceGRkIiwKKwkJLnJsZW4JPSAyOSwKKwl9LCB7CisJCS5rZXkJPSAiXHhkN1x4ODJceDhkXHgxM1x4YjJceGIwXHhiZFx4YzMiCisJCQkgICJceDI1XHhhN1x4NjJceDM2XHhkZlx4OTNceGNjXHg2YiIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDAxXHgwMFx4MzNceDU2XHg4ZVx4ZjdceGIyXHg2MyIKKwkJCSAgIlx4M2NceDk2XHg5Nlx4NzZceDZjXHhmYVx4MDBceDAwIiwKKwkJLmFzc29jCT0gIlx4NjNceDAxXHg4Zlx4NzZceGRjXHg4YVx4MWJceGNiIiwKKwkJLmFsZW4JPSA4LAorCQkuaW5wdXQJPSAiXHg5MFx4MjBceGVhXHg2Zlx4OTFceGJkXHhkOFx4NWEiCisJCQkgICJceGZhXHgwMFx4MzlceGJhXHg0Ylx4YWZceGY5XHhiZiIKKwkJCSAgIlx4YjdceDljXHg3MFx4MjhceDk0XHg5Y1x4ZDBceGVjIiwKKwkJLmlsZW4JPSAyNCwKKwkJLnJlc3VsdAk9ICJceDRjXHhjYlx4MWVceDdjXHhhOVx4ODFceGJlXHhmYSIKKwkJCSAgIlx4YTBceDcyXHg2Y1x4NTVceGQzXHg3OFx4MDZceDEyIgorCQkJICAiXHg5OFx4YzhceDVjXHg5Mlx4ODFceDRhXHhiY1x4MzMiCisJCQkgICJceGM1XHgyZVx4ZThceDFkXHg3ZFx4NzdceGMwXHg4YSIsCisJCS5ybGVuCT0gMzIsCisJfSwgeworCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgorCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHgwMVx4MDBceGQ1XHg2MFx4OTFceDJkXHgzZlx4NzAiCisJCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCisJCS5hc3NvYwk9ICJceGNkXHg5MFx4NDRceGQyXHhiN1x4MWZceGRiXHg4MSIKKwkJCSAgIlx4MjBceGVhXHg2MFx4YzAiLAorCQkuYWxlbgk9IDEyLAorCQkuaW5wdXQJPSAiXHg2NFx4MzVceGFjXHhiYVx4ZmJceDExXHhhOFx4MmUiCisJCQkgICJceDJmXHgwN1x4MWRceDdjXHhhNFx4YTVceGViXHhkOSIKKwkJCSAgIlx4M2FceDgwXHgzYlx4YThceDdmIiwKKwkJLmlsZW4JPSAyMSwKKwkJLnJlc3VsdAk9ICJceDAwXHg5N1x4NjlceGVjXHhhYlx4ZGZceDQ4XHg2MiIKKwkJCSAgIlx4NTVceDk0XHhjNVx4OTJceDUxXHhlNlx4MDNceDU3IgorCQkJICAiXHgyMlx4NjdceDVlXHgwNFx4YzhceDQ3XHgwOVx4OWUiCisJCQkgICJceDVhXHhlMFx4NzBceDQ1XHg1MSIsCisJCS5ybGVuCT0gMjksCisJfSwgeworCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgorCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHgwMVx4MDBceDQyXHhmZlx4ZjhceGYxXHg5NVx4MWMiCisJCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCisJCS5hc3NvYwk9ICJceGQ4XHg1Ylx4YzdceGU2XHg5Zlx4OTRceDRmXHhiOCIsCisJCS5hbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4OGFceDE5XHhiOVx4NTBceGJjXHhmN1x4MWFceDAxIgorCQkJICAiXHg4ZVx4NWVceDY3XHgwMVx4YzlceDE3XHg4N1x4NjUiCisJCQkgICJceDk4XHgwOVx4ZDZceDdkXHhiZVx4ZGRceDE4IiwKKwkJLmlsZW4JPSAyMywKKwkJLnJlc3VsdAk9ICJceGJjXHgyMVx4OGRceGFhXHg5NFx4NzRceDI3XHhiNiIKKwkJCSAgIlx4ZGJceDM4XHg2YVx4OTlceGFjXHgxYVx4ZWZceDIzIgorCQkJICAiXHhhZFx4ZTBceGI1XHgyOVx4MzlceGNiXHg2YVx4NjMiCisJCQkgICJceDdjXHhmOVx4YmVceGMyXHg0MFx4ODhceDk3XHhjNiIKKwkJCSAgIlx4YmEiLAorCQkucmxlbgk9IDMzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFlYWRfdGVzdHZlYyBhZXNfY2NtX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogRnJvbSBSRkMgMzYxMCAqLworCQkua2V5CT0gIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgorCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHgwMVx4MDBceDAwXHgwMFx4MDNceDAyXHgwMVx4MDAiCisJCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceDAwXHgwMCIsCisJCS5hc3NvYwk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIsCisJCS5hbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4NThceDhjXHg5N1x4OWFceDYxXHhjNlx4NjNceGQyIgorCQkJICAiXHhmMFx4NjZceGQwXHhjMlx4YzBceGY5XHg4OVx4ODAiCisJCQkgICJceDZkXHg1Zlx4NmJceDYxXHhkYVx4YzNceDg0XHgxNyIKKwkJCSAgIlx4ZThceGQxXHgyY1x4ZmRceGY5XHgyNlx4ZTAiLAorCQkuaWxlbgk9IDMxLAorCQkucmVzdWx0CT0gIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJICAiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTciCisJCQkgICJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlIiwKKwkJLnJsZW4JPSAyMywKKwl9LCB7CisJCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwN1x4MDZceDA1XHgwNCIKKwkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKKwkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYiIsCisJCS5hbGVuCT0gMTIsCisJCS5pbnB1dAk9ICJceGRjXHhmMVx4ZmJceDdiXHg1ZFx4OWVceDIzXHhmYiIKKwkJCSAgIlx4OWRceDRlXHgxM1x4MTJceDUzXHg2NVx4OGFceGQ4IgorCQkJICAiXHg2ZVx4YmRceGNhXHgzZVx4NTFceGU4XHgzZlx4MDciCisJCQkgICJceDdkXHg5Y1x4MmRceDkzIiwKKwkJLmlsZW4JPSAyOCwKKwkJLnJlc3VsdAk9ICJceDBjXHgwZFx4MGVceDBmXHgxMFx4MTFceDEyXHgxMyIKKwkJCSAgIlx4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiIgorCQkJICAiXHgxY1x4MWRceDFlXHgxZiIsCisJCS5ybGVuCT0gMjAsCisJfSwgeworCQkua2V5CT0gIlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzZceGM3IgorCQkJICAiXHhjOFx4YzlceGNhXHhjYlx4Y2NceGNkXHhjZVx4Y2YiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHgwMVx4MDBceDAwXHgwMFx4MGJceDBhXHgwOVx4MDgiCisJCQkgICJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceDAwXHgwMCIsCisJCS5hc3NvYwk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIsCisJCS5hbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4ODJceDUzXHgxYVx4NjBceGNjXHgyNFx4OTRceDVhIgorCQkJICAiXHg0Ylx4ODJceDc5XHgxOFx4MWFceGI1XHhjOFx4NGQiCisJCQkgICJceGYyXHgxY1x4ZTdceGY5XHhiN1x4M2ZceDQyXHhlMSIKKwkJCSAgIlx4OTdceGVhXHg5Y1x4MDdceGU1XHg2Ylx4NWVceGIxIgorCQkJICAiXHg3ZVx4NWZceDRlIiwKKwkJLmlsZW4JPSAzNSwKKwkJLnJlc3VsdAk9ICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCisJCQkgICJceDIwIiwKKwkJLnJsZW4JPSAyNSwKKwl9LCB7CisJCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCisJCQkgICJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pdgk9ICJceDAxXHgwMFx4MDBceDAwXHgwY1x4MGJceDBhXHgwOSIKKwkJCSAgIlx4YTBceGExXHhhMlx4YTNceGE0XHhhNVx4MDBceDAwIiwKKwkJLmFzc29jCT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYiIsCisJCS5hbGVuCT0gMTIsCisJCS5pbnB1dAk9ICJceDA3XHgzNFx4MjVceDk0XHgxNVx4NzdceDg1XHgxNSIKKwkJCSAgIlx4MmJceDA3XHg0MFx4OThceDMzXHgwYVx4YmJceDE0IgorCQkJICAiXHgxYlx4OTRceDdiXHg1Nlx4NmFceGE5XHg0MFx4NmIiCisJCQkgICJceDRkXHg5OVx4OTlceDg4XHhkZCIsCisJCS5pbGVuCT0gMjksCisJCS5yZXN1bHQJPSAiXHgwY1x4MGRceDBlXHgwZlx4MTBceDExXHgxMlx4MTMiCisJCQkgICJceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYiIKKwkJCSAgIlx4MWNceDFkXHgxZSIsCisJCS5ybGVuCT0gMTksCisJfSwgeworCQkua2V5CT0gIlx4ZDdceDgyXHg4ZFx4MTNceGIyXHhiMFx4YmRceGMzIgorCQkJICAiXHgyNVx4YTdceDYyXHgzNlx4ZGZceDkzXHhjY1x4NmIiLAorCQkua2xlbgk9IDE2LAorCQkuaXYJPSAiXHgwMVx4MDBceDMzXHg1Nlx4OGVceGY3XHhiMlx4NjMiCisJCQkgICJceDNjXHg5Nlx4OTZceDc2XHg2Y1x4ZmFceDAwXHgwMCIsCisJCS5hc3NvYwk9ICJceDYzXHgwMVx4OGZceDc2XHhkY1x4OGFceDFiXHhjYiIsCisJCS5hbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4NGNceGNiXHgxZVx4N2NceGE5XHg4MVx4YmVceGZhIgorCQkJICAiXHhhMFx4NzJceDZjXHg1NVx4ZDNceDc4XHgwNlx4MTIiCisJCQkgICJceDk4XHhjOFx4NWNceDkyXHg4MVx4NGFceGJjXHgzMyIKKwkJCSAgIlx4YzVceDJlXHhlOFx4MWRceDdkXHg3N1x4YzBceDhhIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDkwXHgyMFx4ZWFceDZmXHg5MVx4YmRceGQ4XHg1YSIKKwkJCSAgIlx4ZmFceDAwXHgzOVx4YmFceDRiXHhhZlx4ZjlceGJmIgorCQkJICAiXHhiN1x4OWNceDcwXHgyOFx4OTRceDljXHhkMFx4ZWMiLAorCQkucmxlbgk9IDI0LAorCX0sIHsKKwkJLmtleQk9ICJceGQ3XHg4Mlx4OGRceDEzXHhiMlx4YjBceGJkXHhjMyIKKwkJCSAgIlx4MjVceGE3XHg2Mlx4MzZceGRmXHg5M1x4Y2NceDZiIiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4MDFceDAwXHhkNVx4NjBceDkxXHgyZFx4M2ZceDcwIgorCQkJICAiXHgzY1x4OTZceDk2XHg3Nlx4NmNceGZhXHgwMFx4MDAiLAorCQkuYXNzb2MJPSAiXHhjZFx4OTBceDQ0XHhkMlx4YjdceDFmXHhkYlx4ODEiCisJCQkgICJceDIwXHhlYVx4NjBceGMwIiwKKwkJLmFsZW4JPSAxMiwKKwkJLmlucHV0CT0gIlx4MDBceDk3XHg2OVx4ZWNceGFiXHhkZlx4NDhceDYyIgorCQkJICAiXHg1NVx4OTRceGM1XHg5Mlx4NTFceGU2XHgwM1x4NTciCisJCQkgICJceDIyXHg2N1x4NWVceDA0XHhjOFx4NDdceDA5XHg5ZSIKKwkJCSAgIlx4NWFceGUwXHg3MFx4NDVceDUxIiwKKwkJLmlsZW4JPSAyOSwKKwkJLnJlc3VsdAk9ICJceDY0XHgzNVx4YWNceGJhXHhmYlx4MTFceGE4XHgyZSIKKwkJCSAgIlx4MmZceDA3XHgxZFx4N2NceGE0XHhhNVx4ZWJceGQ5IgorCQkJICAiXHgzYVx4ODBceDNiXHhhOFx4N2YiLAorCQkucmxlbgk9IDIxLAorCX0sIHsKKwkJLmtleQk9ICJceGQ3XHg4Mlx4OGRceDEzXHhiMlx4YjBceGJkXHhjMyIKKwkJCSAgIlx4MjVceGE3XHg2Mlx4MzZceGRmXHg5M1x4Y2NceDZiIiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2CT0gIlx4MDFceDAwXHg0Mlx4ZmZceGY4XHhmMVx4OTVceDFjIgorCQkJICAiXHgzY1x4OTZceDk2XHg3Nlx4NmNceGZhXHgwMFx4MDAiLAorCQkuYXNzb2MJPSAiXHhkOFx4NWJceGM3XHhlNlx4OWZceDk0XHg0Zlx4YjgiLAorCQkuYWxlbgk9IDgsCisJCS5pbnB1dAk9ICJceGJjXHgyMVx4OGRceGFhXHg5NFx4NzRceDI3XHhiNiIKKwkJCSAgIlx4ZGJceDM4XHg2YVx4OTlceGFjXHgxYVx4ZWZceDIzIgorCQkJICAiXHhhZFx4ZTBceGI1XHgyOVx4MzlceGNiXHg2YVx4NjMiCisJCQkgICJceDdjXHhmOVx4YmVceGMyXHg0MFx4ODhceDk3XHhjNiIKKwkJCSAgIlx4YmEiLAorCQkuaWxlbgk9IDMzLAorCQkucmVzdWx0CT0gIlx4OGFceDE5XHhiOVx4NTBceGJjXHhmN1x4MWFceDAxIgorCQkJICAiXHg4ZVx4NWVceDY3XHgwMVx4YzlceDE3XHg4N1x4NjUiCisJCQkgICJceDk4XHgwOVx4ZDZceDdkXHhiZVx4ZGRceDE4IiwKKwkJLnJsZW4JPSAyMywKKwl9LAorfTsKKworLyogQ2FzdDUgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDIxNDQgKi8KKyNkZWZpbmUgQ0FTVDVfRU5DX1RFU1RfVkVDVE9SUwkzCisjZGVmaW5lIENBU1Q1X0RFQ19URVNUX1ZFQ1RPUlMJMworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q1X2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKKwkJCSAgIlx4MjNceDQ1XHg2N1x4ODlceDM0XHg1Nlx4NzhceDlhIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MjNceDhiXHg0Zlx4ZTVceDg0XHg3ZVx4NDRceGIyIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKKwkJCSAgIlx4MjNceDQ1IiwKKwkJLmtsZW4JPSAxMCwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZWJceDZhXHg3MVx4MWFceDJjXHgwMlx4MjdceDFiIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMiIsCisJCS5rbGVuCT0gNSwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4N2FceGM4XHgxNlx4ZDFceDZlXHg5Ylx4MzBceDJlIiwKKwkJLnJsZW4JPSA4LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhc3Q1X2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKKwkJCSAgIlx4MjNceDQ1XHg2N1x4ODlceDM0XHg1Nlx4NzhceDlhIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MjNceDhiXHg0Zlx4ZTVceDg0XHg3ZVx4NDRceGIyIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMlx4MzRceDU2XHg3OCIKKwkJCSAgIlx4MjNceDQ1IiwKKwkJLmtsZW4JPSAxMCwKKwkJLmlucHV0CT0gIlx4ZWJceDZhXHg3MVx4MWFceDJjXHgwMlx4MjdceDFiIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHgxMiIsCisJCS5rbGVuCT0gNSwKKwkJLmlucHV0CT0gIlx4N2FceGM4XHgxNlx4ZDFceDZlXHg5Ylx4MzBceDJlIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLnJsZW4JPSA4LAorCX0sCit9OworCisvKgorICogQVJDNCB0ZXN0IHZlY3RvcnMgZnJvbSBPcGVuU1NMCisgKi8KKyNkZWZpbmUgQVJDNF9FTkNfVEVTVF9WRUNUT1JTCTcKKyNkZWZpbmUgQVJDNF9ERUNfVEVTVF9WRUNUT1JTCTcKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhcmM0X2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NzVceGI3XHg4N1x4ODBceDk5XHhlMFx4YzVceDk2IiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NzRceDk0XHhjMlx4ZTdceDEwXHg0Ylx4MDhceDc5IiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4ZGVceDE4XHg4OVx4NDFceGEzXHgzN1x4NWRceDNhIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGVmXHgwMVx4MjNceDQ1IiwKKwkJLmtsZW4JPSA0LAorCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkuaWxlbgk9IDIwLAorCQkucmVzdWx0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgorCQkJICAiXHhiZFx4NjFceDVhXHgxMVx4NjJceGUxXHhjN1x4YmEiCisJCQkgICJceDM2XHhiNlx4NzhceDU4IiwKKwkJLnJsZW4JPSAyMCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pbnB1dAk9ICJceDEyXHgzNFx4NTZceDc4XHg5QVx4QkNceERFXHhGMCIKKwkJCSAgIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIgorCQkJICAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiCisJCQkgICJceDEyXHgzNFx4NTZceDc4IiwKKwkJLmlsZW4JPSAyOCwKKwkJLnJlc3VsdAk9ICJceDY2XHhhMFx4OTRceDlmXHg4YVx4ZjdceGQ2XHg4OSIKKwkJCSAgIlx4MWZceDdmXHg4M1x4MmJceGE4XHgzM1x4YzBceDBjIgorCQkJICAiXHg4OVx4MmVceGJlXHgzMFx4MTRceDNjXHhlMlx4ODciCisJCQkgICJceDQwXHgwMVx4MWVceGNmIiwKKwkJLnJsZW4JPSAyOCwKKwl9LCB7CisJCS5rZXkJPSAiXHhlZlx4MDFceDIzXHg0NSIsCisJCS5rbGVuCT0gNCwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDAiLAorCQkuaWxlbgk9IDEwLAorCQkucmVzdWx0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgorCQkJICAiXHhiZFx4NjEiLAorCQkucmxlbgk9IDEwLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDY5XHg3Mlx4MzZceDU5XHgxQlx4NTJceDQyXHhCMSIsCisJCS5ybGVuCT0gOCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhcmM0X2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4NzVceGI3XHg4N1x4ODBceDk5XHhlMFx4YzVceDk2IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4NzRceDk0XHhjMlx4ZTdceDEwXHg0Ylx4MDhceDc5IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gOCwKKwkJLmlucHV0CT0gIlx4ZGVceDE4XHg4OVx4NDFceGEzXHgzN1x4NWRceDNhIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGVmXHgwMVx4MjNceDQ1IiwKKwkJLmtsZW4JPSA0LAorCQkuaW5wdXQJPSAiXHhkNlx4YTFceDQxXHhhN1x4ZWNceDNjXHgzOFx4ZGYiCisJCQkgICJceGJkXHg2MVx4NWFceDExXHg2Mlx4ZTFceGM3XHhiYSIKKwkJCSAgIlx4MzZceGI2XHg3OFx4NTgiLAorCQkuaWxlbgk9IDIwLAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkgICJceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSAyMCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiLAorCQkua2xlbgk9IDgsCisJCS5pbnB1dAk9ICJceDY2XHhhMFx4OTRceDlmXHg4YVx4ZjdceGQ2XHg4OSIKKwkJCSAgIlx4MWZceDdmXHg4M1x4MmJceGE4XHgzM1x4YzBceDBjIgorCQkJICAiXHg4OVx4MmVceGJlXHgzMFx4MTRceDNjXHhlMlx4ODciCisJCQkgICJceDQwXHgwMVx4MWVceGNmIiwKKwkJLmlsZW4JPSAyOCwKKwkJLnJlc3VsdAk9ICJceDEyXHgzNFx4NTZceDc4XHg5QVx4QkNceERFXHhGMCIKKwkJCSAgIlx4MTJceDM0XHg1Nlx4NzhceDlBXHhCQ1x4REVceEYwIgorCQkJICAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiCisJCQkgICJceDEyXHgzNFx4NTZceDc4IiwKKwkJLnJsZW4JPSAyOCwKKwl9LCB7CisJCS5rZXkJPSAiXHhlZlx4MDFceDIzXHg0NSIsCisJCS5rbGVuCT0gNCwKKwkJLmlucHV0CT0gIlx4ZDZceGExXHg0MVx4YTdceGVjXHgzY1x4MzhceGRmIgorCQkJICAiXHhiZFx4NjEiLAorCQkuaWxlbgk9IDEwLAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJICAiXHgwMFx4MDAiLAorCQkucmxlbgk9IDEwLAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDY5XHg3Mlx4MzZceDU5XHgxQlx4NTJceDQyXHhCMSIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4QUJceENEXHhFRiIsCisJCS5ybGVuCT0gOCwKKwl9LAorfTsKKworLyoKKyAqIFRFQSB0ZXN0IHZlY3RvcnMKKyAqLworI2RlZmluZSBURUFfRU5DX1RFU1RfVkVDVE9SUwk0CisjZGVmaW5lIFRFQV9ERUNfVEVTVF9WRUNUT1JTCTQKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0ZWFfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDBhXHgzYVx4ZWFceDQxXHg0MFx4YTlceGJhXHg5NCIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCisJCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDc3XHg1ZFx4MmFceDZhXHhmNlx4Y2VceDkyXHgwOSIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCisJCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDZjXHg2Zlx4NmVceDY3XHg2NVx4NzJceDVmXHg3NCIKKwkJCSAgIlx4NjVceDczXHg3NFx4NWZceDc2XHg2NVx4NjNceDc0IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGJlXHg3YVx4YmJceDgxXHg5NVx4MmRceDFmXHgxZSIKKwkJCSAgIlx4ZGRceDg5XHhhMVx4MjVceDA0XHgyMVx4ZGZceDk1IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg0ZFx4NzZceDMyXHgxN1x4MDVceDNmXHg3NVx4MmMiCisJCQkgICJceDVkXHgwNFx4MTZceDM2XHgxNVx4NzJceDYzXHgyZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKKwkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgorCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCisJCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHhlMFx4NGRceDVkXHgzY1x4YjdceDhjXHgzNlx4NDciCisJCQkgICJceDk0XHgxOFx4OTVceDkxXHhhOVx4ZmNceDQ5XHhmOCIKKwkJCSAgIlx4NDRceGQxXHgyZFx4YzJceDk5XHhiOFx4MDhceDJhIgorCQkJICAiXHgwN1x4ODlceDczXHhjMlx4NDVceDkyXHhjNlx4OTAiLAorCQkucmxlbgk9IDMyLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGVhX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDBhXHgzYVx4ZWFceDQxXHg0MFx4YTlceGJhXHg5NCIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdCA9IHplcm9lZF9zdHJpbmcsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCisJCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDc3XHg1ZFx4MmFceDZhXHhmNlx4Y2VceDkyXHgwOSIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCisJCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGJlXHg3YVx4YmJceDgxXHg5NVx4MmRceDFmXHgxZSIKKwkJCSAgIlx4ZGRceDg5XHhhMVx4MjVceDA0XHgyMVx4ZGZceDk1IiwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0CT0gIlx4NmNceDZmXHg2ZVx4NjdceDY1XHg3Mlx4NWZceDc0IgorCQkJICAiXHg2NVx4NzNceDc0XHg1Zlx4NzZceDY1XHg2M1x4NzQiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDRkXHg3Nlx4MzJceDE3XHgwNVx4M2ZceDc1XHgyYyIKKwkJCSAgIlx4NWRceDA0XHgxNlx4MzZceDE1XHg3Mlx4NjNceDJmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4ZTBceDRkXHg1ZFx4M2NceGI3XHg4Y1x4MzZceDQ3IgorCQkJICAiXHg5NFx4MThceDk1XHg5MVx4YTlceGZjXHg0OVx4ZjgiCisJCQkgICJceDQ0XHhkMVx4MmRceGMyXHg5OVx4YjhceDA4XHgyYSIKKwkJCSAgIlx4MDdceDg5XHg3M1x4YzJceDQ1XHg5Mlx4YzZceDkwIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKKwkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgorCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCisJCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCisJCS5ybGVuCT0gMzIsCisJfQorfTsKKworLyoKKyAqIFhURUEgdGVzdCB2ZWN0b3JzCisgKi8KKyNkZWZpbmUgWFRFQV9FTkNfVEVTVF9WRUNUT1JTCTQKKyNkZWZpbmUgWFRFQV9ERUNfVEVTVF9WRUNUT1JTCTQKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB4dGVhX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dCAgPSB6ZXJvZWRfc3RyaW5nLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhkOFx4ZDRceGU5XHhkZVx4ZDlceDFlXHgxM1x4ZjciLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MmJceDAyXHgwNVx4NjhceDA2XHgxNFx4NDlceDc2IgorCQkJICAiXHg3N1x4NWRceDBlXHgyNlx4NmNceDI4XHg3OFx4NDMiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg3NFx4NjVceDczXHg3NFx4MjBceDZkXHg2NVx4MmUiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHg5NFx4ZWJceGM4XHg5Nlx4ODRceDZhXHg0OVx4YTgiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MDlceDY1XHg0M1x4MTFceDY2XHg0NFx4MzlceDI1IgorCQkJICAiXHg1MVx4M2FceDE2XHgxMFx4MGFceDA4XHgxMlx4NmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg2Y1x4NmZceDZlXHg2N1x4NjVceDcyXHg1Zlx4NzQiCisJCQkgICJceDY1XHg3M1x4NzRceDVmXHg3Nlx4NjVceDYzXHg3NCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgzZVx4Y2VceGFlXHgyMlx4NjBceDU2XHhhOFx4OWQiCisJCQkgICJceDc3XHg0ZFx4ZDRceGI0XHg4N1x4MjRceGUzXHg5YSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4NGRceDc2XHgzMlx4MTdceDA1XHgzZlx4NzVceDJjIgorCQkJICAiXHg1ZFx4MDRceDE2XHgzNlx4MTVceDcyXHg2M1x4MmYiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg1NFx4NjVceDYxXHgyMFx4NjlceDczXHgyMFx4NjciCisJCQkgICJceDZmXHg2Zlx4NjRceDIwXHg2Nlx4NmZceDcyXHgyMCIKKwkJCSAgIlx4NzlceDZmXHg3NVx4MjFceDIxXHgyMVx4MjBceDcyIgorCQkJICAiXHg2NVx4NjFceDZjXHg2Y1x4NzlceDIxXHgyMVx4MjEiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0gIlx4OTlceDgxXHg5Zlx4NWRceDZmXHg0Ylx4MzFceDNhIgorCQkJICAiXHg4Nlx4ZmZceDZmXHhkMFx4ZTNceDg3XHg3MFx4MDciCisJCQkgICJceDRkXHhiOFx4Y2ZceGYzXHg5OVx4NTBceGIzXHhkNCIKKwkJCSAgIlx4NzNceGEyXHhmYVx4YzlceDE2XHg1OVx4NWRceDgxIiwKKwkJLnJsZW4JPSAzMiwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHh0ZWFfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4ZDhceGQ0XHhlOVx4ZGVceGQ5XHgxZVx4MTNceGY3IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0ID0gemVyb2VkX3N0cmluZywKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDJiXHgwMlx4MDVceDY4XHgwNlx4MTRceDQ5XHg3NiIKKwkJCSAgIlx4NzdceDVkXHgwZVx4MjZceDZjXHgyOFx4NzhceDQzIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4OTRceGViXHhjOFx4OTZceDg0XHg2YVx4NDlceGE4IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NzRceDY1XHg3M1x4NzRceDIwXHg2ZFx4NjVceDJlIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDA5XHg2NVx4NDNceDExXHg2Nlx4NDRceDM5XHgyNSIKKwkJCSAgIlx4NTFceDNhXHgxNlx4MTBceDBhXHgwOFx4MTJceDZlIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4M2VceGNlXHhhZVx4MjJceDYwXHg1Nlx4YThceDlkIgorCQkJICAiXHg3N1x4NGRceGQ0XHhiNFx4ODdceDI0XHhlM1x4OWEiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NmNceDZmXHg2ZVx4NjdceDY1XHg3Mlx4NWZceDc0IgorCQkJICAiXHg2NVx4NzNceDc0XHg1Zlx4NzZceDY1XHg2M1x4NzQiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDRkXHg3Nlx4MzJceDE3XHgwNVx4M2ZceDc1XHgyYyIKKwkJCSAgIlx4NWRceDA0XHgxNlx4MzZceDE1XHg3Mlx4NjNceDJmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4OTlceDgxXHg5Zlx4NWRceDZmXHg0Ylx4MzFceDNhIgorCQkJICAiXHg4Nlx4ZmZceDZmXHhkMFx4ZTNceDg3XHg3MFx4MDciCisJCQkgICJceDRkXHhiOFx4Y2ZceGYzXHg5OVx4NTBceGIzXHhkNCIKKwkJCSAgIlx4NzNceGEyXHhmYVx4YzlceDE2XHg1OVx4NWRceDgxIiwKKwkJLmlsZW4JPSAzMiwKKwkJLnJlc3VsdAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKKwkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgorCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCisJCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCisJCS5ybGVuCT0gMzIsCisJfQorfTsKKworLyoKKyAqIEtIQVpBRCB0ZXN0IHZlY3RvcnMuCisgKi8KKyNkZWZpbmUgS0hBWkFEX0VOQ19URVNUX1ZFQ1RPUlMgNQorI2RlZmluZSBLSEFaQURfREVDX1RFU1RfVkVDVE9SUyA1CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMga2hhemFkX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4NDlceGE0XHhjZVx4MzJceGFjXHgxOVx4MGVceDNmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4XHgzOCIKKwkJCSAgIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4N2VceDgyXHgxMlx4YTFceGQ5XHg1Ylx4ZTRceGY5IiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIKKwkJCSJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceGFhXHhiZVx4YzFceDk1XHhjNVx4OTRceDFhXHg5YyIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiCisJCQkiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQgPSAiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgorCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgorCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdCA9ICJceDA0XHg3NFx4ZjVceDcwXHg1MFx4MTZceGQzXHhiOCIKKwkJCSJceDA0XHg3NFx4ZjVceDcwXHg1MFx4MTZceGQzXHhiOCIsCisJCS5ybGVuCT0gMTYsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMga2hhemFkX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4NDlceGE0XHhjZVx4MzJceGFjXHgxOVx4MGVceDNmIiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4XHgzOCIKKwkJCSAgIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4N2VceDgyXHgxMlx4YTFceGQ5XHg1Ylx4ZTRceGY5IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MzhceDM4XHgzOFx4MzhceDM4XHgzOFx4MzhceDM4IiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIKKwkJCSJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGFhXHhiZVx4YzFceDk1XHhjNVx4OTRceDFhXHg5YyIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceGEyXHhhMlx4YTJceGEyXHhhMlx4YTJceGEyXHhhMiIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiCisJCQkiXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmYiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQgID0gIlx4MDRceDc0XHhmNVx4NzBceDUwXHgxNlx4ZDNceGI4IiwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9ICJceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZiIKKwkJCSJceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dCAgPSAiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiCisJCQkiXHgwNFx4NzRceGY1XHg3MFx4NTBceDE2XHhkM1x4YjgiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIgorCQkJIlx4MmZceDJmXHgyZlx4MmZceDJmXHgyZlx4MmZceDJmIiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworLyoKKyAqIEFudWJpcyB0ZXN0IHZlY3RvcnMuCisgKi8KKworI2RlZmluZSBBTlVCSVNfRU5DX1RFU1RfVkVDVE9SUwkJCTUKKyNkZWZpbmUgQU5VQklTX0RFQ19URVNUX1ZFQ1RPUlMJCQk1CisjZGVmaW5lIEFOVUJJU19DQkNfRU5DX1RFU1RfVkVDVE9SUwkJMgorI2RlZmluZSBBTlVCSVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJCTIKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhbnViaXNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCisJCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCisJCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCisJCS5rZXkJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCisJCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIKKwkJCSAgIlx4MDNceDAzXHgwM1x4MDMiLAorCQkua2xlbgk9IDIwLAorCQkuaW5wdXQJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCisJCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhkYlx4ZjFceDQyXHhmNFx4ZDFceDhhXHhjN1x4NDkiCisJCQkgICJceDg3XHg0MVx4NmZceDgyXHgwYVx4OThceDY0XHhhZSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0IgorCQkJICAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCisJCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIKKwkJCSAgIlx4MjRceDI0XHgyNFx4MjQiLAorCQkua2xlbgk9IDI4LAorCQkuaW5wdXQJPSAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCisJCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhmZFx4MWJceDRhXHhlM1x4YmZceGYwXHhhZFx4M2QiCisJCQkgICJceDA2XHhkM1x4NjFceDI3XHhmZFx4MTNceDllXHhkZSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgorCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiCisJCQkgICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKKwkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgorCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MWFceDkxXHhmYlx4MmJceGI3XHg3OFx4NmJceGM0IgorCQkJIlx4MTdceGQ5XHhmZlx4NDBceDNiXHgwZVx4ZTVceGZlIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCisJCS5rbGVuCT0gNDAsCisJCS5pbnB1dAk9ICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKKwkJCSAgIlx4OWVceGM2XHg4NFx4MGZceDE3XHgyMVx4MDdceGVlIiwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhbnViaXNfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCisJCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCisJCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCisJCS5rZXkJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCisJCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIKKwkJCSAgIlx4MDNceDAzXHgwM1x4MDMiLAorCQkua2xlbgk9IDIwLAorCQkuaW5wdXQJPSAiXHhkYlx4ZjFceDQyXHhmNFx4ZDFceDhhXHhjN1x4NDkiCisJCQkgICJceDg3XHg0MVx4NmZceDgyXHgwYVx4OThceDY0XHhhZSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwM1x4MDMiCisJCQkgICJceDAzXHgwM1x4MDNceDAzXHgwM1x4MDNceDAzXHgwMyIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0IgorCQkJICAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCisJCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIKKwkJCSAgIlx4MjRceDI0XHgyNFx4MjQiLAorCQkua2xlbgk9IDI4LAorCQkuaW5wdXQJPSAiXHhmZFx4MWJceDRhXHhlM1x4YmZceGYwXHhhZFx4M2QiCisJCQkgICJceDA2XHhkM1x4NjFceDI3XHhmZFx4MTNceDllXHhkZSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNFx4MjQiCisJCQkgICJceDI0XHgyNFx4MjRceDI0XHgyNFx4MjRceDI0XHgyNCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IgorCQkJICAiXHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjUiCisJCQkgICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKKwkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4MWFceDkxXHhmYlx4MmJceGI3XHg3OFx4NmJceGM0IgorCQkJIlx4MTdceGQ5XHhmZlx4NDBceDNiXHgwZVx4ZTVceGZlIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1XHgyNSIKKwkJCSAgIlx4MjVceDI1XHgyNVx4MjVceDI1XHgyNVx4MjVceDI1IiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCisJCS5pbnB1dCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKKwkJCSAiXHg5ZVx4YzZceDg0XHgwZlx4MTdceDIxXHgwN1x4ZWUiLAorCQkua2xlbgk9IDQwLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFudWJpc19jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCisJCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIKKwkJCSAgIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0gIlx4NmRceGM1XHhkYVx4YTJceDI2XHg3ZFx4NjJceDZmIgorCQkJICAiXHgwOFx4YjdceDUyXHg4ZVx4NmVceDZlXHg4Nlx4OTAiCisJCQkgICJceDg2XHhkOFx4YjVceDZmXHg5OFx4NWVceDhhXHg2NiIKKwkJCSAgIlx4NGZceDFmXHg3OFx4YTFceGJiXHgzN1x4ZjFceGJlIiwKKwkJLnJsZW4JPSAzMiwKKwl9LCB7CisJCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCisJCS5rbGVuCT0gNDAsCisJCS5pbnB1dAk9ICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQgPSAiXHhhNVx4MmNceDg1XHg2Zlx4OWNceGJhXHhhMFx4OTciCisJCQkgICJceDllXHhjNlx4ODRceDBmXHgxN1x4MjFceDA3XHhlZSIKKwkJCSAgIlx4YTJceGJjXHgwNlx4OThceGM2XHg0Ylx4ZGFceDc1IgorCQkJICAiXHgyZVx4YWFceGJlXHg1OFx4Y2VceDAxXHg1Ylx4YzciLAorCQkucmxlbgk9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFudWJpc19jYmNfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg2ZFx4YzVceGRhXHhhMlx4MjZceDdkXHg2Mlx4NmYiCisJCQkgICJceDA4XHhiN1x4NTJceDhlXHg2ZVx4NmVceDg2XHg5MCIKKwkJCSAgIlx4ODZceGQ4XHhiNVx4NmZceDk4XHg1ZVx4OGFceDY2IgorCQkJICAiXHg0Zlx4MWZceDc4XHhhMVx4YmJceDM3XHhmMVx4YmUiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0gIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIgorCQkJICAiXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmUiCisJCQkgICJceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZSIKKwkJCSAgIlx4ZmVceGZlXHhmZVx4ZmVceGZlXHhmZVx4ZmVceGZlIiwKKwkJLnJsZW4JPSAzMiwKKwl9LCB7CisJCS5rZXkJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIsCisJCS5rbGVuCT0gNDAsCisJCS5pbnB1dCA9ICJceGE1XHgyY1x4ODVceDZmXHg5Y1x4YmFceGEwXHg5NyIKKwkJCSAgIlx4OWVceGM2XHg4NFx4MGZceDE3XHgyMVx4MDdceGVlIgorCQkJICAiXHhhMlx4YmNceDA2XHg5OFx4YzZceDRiXHhkYVx4NzUiCisJCQkgICJceDJlXHhhYVx4YmVceDU4XHhjZVx4MDFceDViXHhjNyIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiCisJCQkgICJceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNSIKKwkJCSAgIlx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzVceDM1IgorCQkJICAiXHgzNVx4MzVceDM1XHgzNVx4MzVceDM1XHgzNVx4MzUiLAorCQkucmxlbgk9IDMyLAorCX0sCit9OworCisvKgorICogWEVUQSB0ZXN0IHZlY3RvcnMKKyAqLworI2RlZmluZSBYRVRBX0VOQ19URVNUX1ZFQ1RPUlMJNAorI2RlZmluZSBYRVRBX0RFQ19URVNUX1ZFQ1RPUlMJNAorCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHhldGFfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceGFhXHgyMlx4OTZceGU1XHg2Y1x4NjFceGYzXHg0NSIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgyYlx4MDJceDA1XHg2OFx4MDZceDE0XHg0OVx4NzYiCisJCQkgICJceDc3XHg1ZFx4MGVceDI2XHg2Y1x4MjhceDc4XHg0MyIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDc0XHg2NVx4NzNceDc0XHgyMFx4NmRceDY1XHgyZSIsCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9ICJceDgyXHgzZVx4ZWJceDM1XHhkY1x4ZGRceGQ5XHhjMyIsCisJCS5ybGVuCT0gOCwKKwl9LCB7CisJCS5rZXkJPSAiXHgwOVx4NjVceDQzXHgxMVx4NjZceDQ0XHgzOVx4MjUiCisJCQkgICJceDUxXHgzYVx4MTZceDEwXHgwYVx4MDhceDEyXHg2ZSIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDZjXHg2Zlx4NmVceDY3XHg2NVx4NzJceDVmXHg3NCIKKwkJCSAgIlx4NjVceDczXHg3NFx4NWZceDc2XHg2NVx4NjNceDc0IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGUyXHgwNFx4ZGJceGYyXHg4OVx4ODVceDllXHhlYSIKKwkJCSAgIlx4NjFceDM1XHhhYVx4ZWRceGI1XHhjYlx4NzFceDJjIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg0ZFx4NzZceDMyXHgxN1x4MDVceDNmXHg3NVx4MmMiCisJCQkgICJceDVkXHgwNFx4MTZceDM2XHgxNVx4NzJceDYzXHgyZiIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDU0XHg2NVx4NjFceDIwXHg2OVx4NzNceDIwXHg2NyIKKwkJCSAgIlx4NmZceDZmXHg2NFx4MjBceDY2XHg2Zlx4NzJceDIwIgorCQkJICAiXHg3OVx4NmZceDc1XHgyMVx4MjFceDIxXHgyMFx4NzIiCisJCQkgICJceDY1XHg2MVx4NmNceDZjXHg3OVx4MjFceDIxXHgyMSIsCisJCS5pbGVuCT0gMzIsCisJCS5yZXN1bHQJPSAiXHgwYlx4MDNceGNkXHg4YVx4YmVceDk1XHhmZFx4YjEiCisJCQkgICJceGMxXHg0NFx4OTFceDBiXHhhNVx4YzlceDFiXHhiNCIKKwkJCSAgIlx4YTlceGRhXHgxZVx4OWVceGIxXHgzZVx4MmFceDhmIgorCQkJICAiXHhlYVx4YTVceDZhXHg4NVx4ZDFceGY0XHhhOFx4YTUiLAorCQkucmxlbgk9IDMyLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgeGV0YV9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhhYVx4MjJceDk2XHhlNVx4NmNceDYxXHhmM1x4NDUiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQgPSB6ZXJvZWRfc3RyaW5nLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MmJceDAyXHgwNVx4NjhceDA2XHgxNFx4NDlceDc2IgorCQkJICAiXHg3N1x4NWRceDBlXHgyNlx4NmNceDI4XHg3OFx4NDMiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHg4Mlx4M2VceGViXHgzNVx4ZGNceGRkXHhkOVx4YzMiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHg3NFx4NjVceDczXHg3NFx4MjBceDZkXHg2NVx4MmUiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MDlceDY1XHg0M1x4MTFceDY2XHg0NFx4MzlceDI1IgorCQkJICAiXHg1MVx4M2FceDE2XHgxMFx4MGFceDA4XHgxMlx4NmUiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHhlMlx4MDRceGRiXHhmMlx4ODlceDg1XHg5ZVx4ZWEiCisJCQkgICJceDYxXHgzNVx4YWFceGVkXHhiNVx4Y2JceDcxXHgyYyIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHg2Y1x4NmZceDZlXHg2N1x4NjVceDcyXHg1Zlx4NzQiCisJCQkgICJceDY1XHg3M1x4NzRceDVmXHg3Nlx4NjVceDYzXHg3NCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4NGRceDc2XHgzMlx4MTdceDA1XHgzZlx4NzVceDJjIgorCQkJICAiXHg1ZFx4MDRceDE2XHgzNlx4MTVceDcyXHg2M1x4MmYiLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSAiXHgwYlx4MDNceGNkXHg4YVx4YmVceDk1XHhmZFx4YjEiCisJCQkgICJceGMxXHg0NFx4OTFceDBiXHhhNVx4YzlceDFiXHhiNCIKKwkJCSAgIlx4YTlceGRhXHgxZVx4OWVceGIxXHgzZVx4MmFceDhmIgorCQkJICAiXHhlYVx4YTVceDZhXHg4NVx4ZDFceGY0XHhhOFx4YTUiLAorCQkuaWxlbgk9IDMyLAorCQkucmVzdWx0CT0gIlx4NTRceDY1XHg2MVx4MjBceDY5XHg3M1x4MjBceDY3IgorCQkJICAiXHg2Zlx4NmZceDY0XHgyMFx4NjZceDZmXHg3Mlx4MjAiCisJCQkgICJceDc5XHg2Zlx4NzVceDIxXHgyMVx4MjFceDIwXHg3MiIKKwkJCSAgIlx4NjVceDYxXHg2Y1x4NmNceDc5XHgyMVx4MjFceDIxIiwKKwkJLnJsZW4JPSAzMiwKKwl9Cit9OworCisvKgorICogRkNyeXB0IHRlc3QgdmVjdG9ycworICovCisjZGVmaW5lIEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTCUFSUkFZX1NJWkUoZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlKQorI2RlZmluZSBGQ1JZUFRfREVDX1RFU1RfVkVDVE9SUwlBUlJBWV9TSVpFKGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSkKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIGh0dHA6Ly93d3cub3BlbmFmcy5vcmcvcGlwZXJtYWlsL29wZW5hZnMtZGV2ZWwvMjAwMC1EZWNlbWJlci8wMDUzMjAuaHRtbCAqLworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHgwRVx4MDlceDAwXHhDN1x4M0VceEY3XHhFRFx4NDEiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MTFceDQ0XHg3N1x4QUFceEREXHgwMFx4MzNceDY2IiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHhEOFx4RURceDc4XHg3NFx4NzdceEVDXHgwNlx4ODAiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBGcm9tIEFybGEgKi8KKwkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIsCisJCS5rbGVuCT0gOCwKKwkJLml2CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0gIlx4MDBceGYwXHgwZVx4MTFceDc1XHhlNlx4MjNceDgyIgorCQkJICAiXHhlZVx4YWNceDk4XHg2Mlx4NDRceDUxXHhlNFx4ODQiCisJCQkgICJceGMzXHg1OVx4ZDhceGFhXHg2NFx4NjBceGFlXHhmNyIKKwkJCSAgIlx4ZDJceGQ5XHgxM1x4NzlceDcyXHhhM1x4NDVceDAzIgorCQkJICAiXHgyM1x4YjVceDYyXHhkN1x4MGNceGY1XHgyN1x4ZDEiCisJCQkgICJceGY4XHg5MVx4M2NceGFjXHg0NFx4MjJceDkyXHhlZiIsCisJCS5ybGVuCT0gNDgsCisJfSwgeworCQkua2V5CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAorCQkuaW5wdXQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiXHhjYVx4OTBceGY1XHg5ZFx4Y2JceGQ0XHhkMlx4M2MiCisJCQkgICJceDAxXHg4OFx4N2ZceDNlXHgzMVx4NmVceDYyXHg5ZCIKKwkJCSAgIlx4ZDhceGUwXHg1N1x4YTNceDA2XHgzYVx4NDJceDU4IgorCQkJICAiXHgyYVx4MjhceGZlXHg3Mlx4NTJceDJmXHhkZFx4ZTAiCisJCQkgICJceDE5XHg4OVx4MDlceDFjXHgyYVx4OGVceDhjXHg5NCIKKwkJCSAgIlx4ZmNceGM3XHg2OFx4ZTRceDg4XHhhYVx4ZGVceDBmIiwKKwkJLnJsZW4JPSA0OCwKKwl9LCB7IC8qIHNwbGl0LXBhZ2UgdmVyc2lvbiAqLworCQkua2V5CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAorCQkuaW5wdXQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiXHhjYVx4OTBceGY1XHg5ZFx4Y2JceGQ0XHhkMlx4M2MiCisJCQkgICJceDAxXHg4OFx4N2ZceDNlXHgzMVx4NmVceDYyXHg5ZCIKKwkJCSAgIlx4ZDhceGUwXHg1N1x4YTNceDA2XHgzYVx4NDJceDU4IgorCQkJICAiXHgyYVx4MjhceGZlXHg3Mlx4NTJceDJmXHhkZFx4ZTAiCisJCQkgICJceDE5XHg4OVx4MDlceDFjXHgyYVx4OGVceDhjXHg5NCIKKwkJCSAgIlx4ZmNceGM3XHg2OFx4ZTRceDg4XHhhYVx4ZGVceDBmIiwKKwkJLnJsZW4JPSA0OCwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMjAsIDI4IH0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBmY3J5cHRfcGNiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIGh0dHA6Ly93d3cub3BlbmFmcy5vcmcvcGlwZXJtYWlsL29wZW5hZnMtZGV2ZWwvMjAwMC1EZWNlbWJlci8wMDUzMjAuaHRtbCAqLworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHgwRVx4MDlceDAwXHhDN1x4M0VceEY3XHhFRFx4NDEiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0gIlx4MTFceDQ0XHg3N1x4QUFceEREXHgwMFx4MzNceDY2IiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHhEOFx4RURceDc4XHg3NFx4NzdceEVDXHgwNlx4ODAiLAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSAiXHgxMlx4MzRceDU2XHg3OFx4OUFceEJDXHhERVx4RjAiLAorCQkucmxlbgk9IDgsCisJfSwgeyAvKiBGcm9tIEFybGEgKi8KKwkJLmtleQk9ICJceGYwXHhlMVx4ZDJceGMzXHhiNFx4YTVceDk2XHg4NyIsCisJCS5rbGVuCT0gOCwKKwkJLml2CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmlucHV0CT0gIlx4MDBceGYwXHgwZVx4MTFceDc1XHhlNlx4MjNceDgyIgorCQkJICAiXHhlZVx4YWNceDk4XHg2Mlx4NDRceDUxXHhlNFx4ODQiCisJCQkgICJceGMzXHg1OVx4ZDhceGFhXHg2NFx4NjBceGFlXHhmNyIKKwkJCSAgIlx4ZDJceGQ5XHgxM1x4NzlceDcyXHhhM1x4NDVceDAzIgorCQkJICAiXHgyM1x4YjVceDYyXHhkN1x4MGNceGY1XHgyN1x4ZDEiCisJCQkgICJceGY4XHg5MVx4M2NceGFjXHg0NFx4MjJceDkyXHhlZiIsCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5ybGVuCT0gNDgsCisJfSwgeworCQkua2V5CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAorCQkuaW5wdXQJPSAiXHhjYVx4OTBceGY1XHg5ZFx4Y2JceGQ0XHhkMlx4M2MiCisJCQkgICJceDAxXHg4OFx4N2ZceDNlXHgzMVx4NmVceDYyXHg5ZCIKKwkJCSAgIlx4ZDhceGUwXHg1N1x4YTNceDA2XHgzYVx4NDJceDU4IgorCQkJICAiXHgyYVx4MjhceGZlXHg3Mlx4NTJceDJmXHhkZFx4ZTAiCisJCQkgICJceDE5XHg4OVx4MDlceDFjXHgyYVx4OGVceDhjXHg5NCIKKwkJCSAgIlx4ZmNceGM3XHg2OFx4ZTRceDg4XHhhYVx4ZGVceDBmIiwKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9ncy5cMFwwIiwKKwkJLnJsZW4JPSA0OCwKKwl9LCB7IC8qIHNwbGl0LXBhZ2UgdmVyc2lvbiAqLworCQkua2V5CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSAiXHhmMFx4ZTFceGQyXHhjM1x4YjRceGE1XHg5Nlx4ODciLAorCQkuaW5wdXQJPSAiXHhjYVx4OTBceGY1XHg5ZFx4Y2JceGQ0XHhkMlx4M2MiCisJCQkgICJceDAxXHg4OFx4N2ZceDNlXHgzMVx4NmVceDYyXHg5ZCIKKwkJCSAgIlx4ZDhceGUwXHg1N1x4YTNceDA2XHgzYVx4NDJceDU4IgorCQkJICAiXHgyYVx4MjhceGZlXHg3Mlx4NTJceDJmXHhkZFx4ZTAiCisJCQkgICJceDE5XHg4OVx4MDlceDFjXHgyYVx4OGVceDhjXHg5NCIKKwkJCSAgIlx4ZmNceGM3XHg2OFx4ZTRceDg4XHhhYVx4ZGVceDBmIiwKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9ncy5cMFwwIiwKKwkJLnJsZW4JPSA0OCwKKwkJLm5wCT0gMiwKKwkJLnRhcAk9IHsgMjAsIDI4IH0sCisJfQorfTsKKworLyoKKyAqIENBTUVMTElBIHRlc3QgdmVjdG9ycy4KKyAqLworI2RlZmluZSBDQU1FTExJQV9FTkNfVEVTVF9WRUNUT1JTIDMKKyNkZWZpbmUgQ0FNRUxMSUFfREVDX1RFU1RfVkVDVE9SUyAzCisjZGVmaW5lIENBTUVMTElBX0NCQ19FTkNfVEVTVF9WRUNUT1JTIDIKKyNkZWZpbmUgQ0FNRUxMSUFfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMgMgorCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NjdceDY3XHgzMVx4MzhceDU0XHg5Nlx4NjlceDczIgorCQkJICAiXHgwOFx4NTdceDA2XHg1Nlx4NDhceGVhXHhiZVx4NDMiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgorCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciLAorCQkua2xlbgk9IDI0LAorCQkuaW5wdXQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCisJCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHhiNFx4OTlceDM0XHgwMVx4YjNceGU5XHg5Nlx4ZjgiCisJCQkgICJceDRlXHhlNVx4Y2VceGU3XHhkN1x4OWJceDA5XHhiOSIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCisJCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4OWFceGNjXHgyM1x4N2RceGZmXHgxNlx4ZDdceDZjIgorCQkJICAiXHgyMFx4ZWZceDdjXHg5MVx4OWVceDNhXHg3NVx4MDkiLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4NjdceDY3XHgzMVx4MzhceDU0XHg5Nlx4NjlceDczIgorCQkJICAiXHgwOFx4NTdceDA2XHg1Nlx4NDhceGVhXHhiZVx4NDMiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAxXHgyM1x4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKwkJCSAgIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIgorCQkJICAiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciLAorCQkua2xlbgk9IDI0LAorCQkuaW5wdXQJPSAiXHhiNFx4OTlceDM0XHgwMVx4YjNceGU5XHg5Nlx4ZjgiCisJCQkgICJceDRlXHhlNVx4Y2VceGU3XHhkN1x4OWJceDA5XHhiOSIsCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSAiXHgwMVx4MjNceDQ1XHg2N1x4ODlceGFiXHhjZFx4ZWYiCisJCQkgICJceGZlXHhkY1x4YmFceDk4XHg3Nlx4NTRceDMyXHgxMCIsCisJCS5ybGVuCT0gMTYsCisJfSwgeworCQkua2V5CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiCisJCQkgICJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4OWFceGNjXHgyM1x4N2RceGZmXHgxNlx4ZDdceDZjIgorCQkJICAiXHgyMFx4ZWZceDdjXHg5MVx4OWVceDNhXHg3NVx4MDkiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDFceDIzXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorCQkJICAiXHhmZVx4ZGNceGJhXHg5OFx4NzZceDU0XHgzMlx4MTAiLAorCQkucmxlbgk9IDE2LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2NiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSAiXHgwNlx4YTlceDIxXHg0MFx4MzZceGI4XHhhMVx4NWIiCisJCQkgICJceDUxXHgyZVx4MDNceGQ1XHgzNFx4MTJceDAwXHgwNiIsCisJCS5rbGVuICAgPSAxNiwKKwkJLml2CT0gIlx4M2RceGFmXHhiYVx4NDJceDlkXHg5ZVx4YjRceDMwIgorCQkJICAiXHhiNFx4MjJceGRhXHg4MFx4MmNceDlmXHhhY1x4NDEiLAorCQkuaW5wdXQJPSAiU2luZ2xlIGJsb2NrIG1zZyIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJceGVhXHgzMlx4MTJceDc2XHgzYlx4NTBceDEwXHhlNyIKKwkJCSAgIlx4MThceGY2XHhmZFx4NWRceGY2XHg4Zlx4MTNceDUxIiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsKKwkJLmtleSAgICA9ICJceGMyXHg4Nlx4NjlceDZkXHg4OFx4N2NceDlhXHhhMCIKKwkJCSAgIlx4NjFceDFiXHhiYlx4M2VceDIwXHgyNVx4YTRceDVhIiwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYgICAgID0gIlx4NTZceDJlXHgxN1x4OTlceDZkXHgwOVx4M2RceDI4IgorCQkJICAiXHhkZFx4YjNceGJhXHg2OVx4NWFceDJlXHg2Zlx4NTgiLAorCQkuaW5wdXQgID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJCQkgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKwkJLmlsZW4gICA9IDMyLAorCQkucmVzdWx0ID0gIlx4YTVceGRmXHg2ZVx4NTBceGRhXHg3MFx4NmNceDAxIgorCQkJICAiXHg0YVx4YWJceGYzXHhmMlx4ZDZceGZjXHg2Y1x4ZmQiCisJCQkgICJceDE5XHhiNFx4M2VceDU3XHgxY1x4MDJceDVlXHhhMCIKKwkJCSAgIlx4MTVceDc4XHhlMFx4NWVceGYyXHhjYlx4ODdceDE2IiwKKwkJLnJsZW4gICA9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSAiXHgwNlx4YTlceDIxXHg0MFx4MzZceGI4XHhhMVx4NWIiCisJCQkgICJceDUxXHgyZVx4MDNceGQ1XHgzNFx4MTJceDAwXHgwNiIsCisJCS5rbGVuICAgPSAxNiwKKwkJLml2CT0gIlx4M2RceGFmXHhiYVx4NDJceDlkXHg5ZVx4YjRceDMwIgorCQkJICAiXHhiNFx4MjJceGRhXHg4MFx4MmNceDlmXHhhY1x4NDEiLAorCQkuaW5wdXQJPSAiXHhlYVx4MzJceDEyXHg3Nlx4M2JceDUwXHgxMFx4ZTciCisJCQkgICJceDE4XHhmNlx4ZmRceDVkXHhmNlx4OGZceDEzXHg1MSIsCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9ICJTaW5nbGUgYmxvY2sgbXNnIiwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsKKwkJLmtleSAgICA9ICJceGMyXHg4Nlx4NjlceDZkXHg4OFx4N2NceDlhXHhhMCIKKwkJCSAgIlx4NjFceDFiXHhiYlx4M2VceDIwXHgyNVx4YTRceDVhIiwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYgICAgID0gIlx4NTZceDJlXHgxN1x4OTlceDZkXHgwOVx4M2RceDI4IgorCQkJICAiXHhkZFx4YjNceGJhXHg2OVx4NWFceDJlXHg2Zlx4NTgiLAorCQkuaW5wdXQgPSAiXHhhNVx4ZGZceDZlXHg1MFx4ZGFceDcwXHg2Y1x4MDEiCisJCQkgICJceDRhXHhhYlx4ZjNceGYyXHhkNlx4ZmNceDZjXHhmZCIKKwkJCSAgIlx4MTlceGI0XHgzZVx4NTdceDFjXHgwMlx4NWVceGEwIgorCQkJICAiXHgxNVx4NzhceGUwXHg1ZVx4ZjJceGNiXHg4N1x4MTYiLAorCQkuaWxlbiAgID0gMzIsCisJCS5yZXN1bHQgPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSAgIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJICAiXHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiLAorCQkucmxlbiAgID0gMzIsCisJfSwKK307CisKKy8qCisgKiBTRUVEIHRlc3QgdmVjdG9ycworICovCisjZGVmaW5lIFNFRURfRU5DX1RFU1RfVkVDVE9SUwk0CisjZGVmaW5lIFNFRURfREVDX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgc2VlZF9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSB6ZXJvZWRfc3RyaW5nLAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQgID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4NWVceGJhXHhjNlx4ZTBceDA1XHg0ZVx4MTZceDY4IgorCQkJICAiXHgxOVx4YWZceGYxXHhjY1x4NmRceDM0XHg2Y1x4ZGIiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gemVyb2VkX3N0cmluZywKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGMxXHgxZlx4MjJceGYyXHgwMVx4NDBceDUwXHg1MCIKKwkJCSAgIlx4ODRceDQ4XHgzNVx4OTdceGU0XHgzN1x4MGZceDQzIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg0N1x4MDZceDQ4XHgwOFx4NTFceGU2XHgxYlx4ZTgiCisJCQkgICJceDVkXHg3NFx4YmZceGIzXHhmZFx4OTVceDYxXHg4NSIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDgzXHhhMlx4ZjhceGEyXHg4OFx4NjRceDFmXHhiOSIKKwkJCSAgIlx4YTRceGU5XHhhNVx4Y2NceDJmXHgxM1x4MWNceDdkIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGVlXHg1NFx4ZDFceDNlXHhiY1x4YWVceDcwXHg2ZCIKKwkJCSAgIlx4MjJceDZiXHhjM1x4MTRceDJjXHhkNFx4MGRceDRhIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgyOFx4ZGJceGMzXHhiY1x4NDlceGZmXHhkOFx4N2QiCisJCQkgICJceGNmXHhhNVx4MDlceGIxXHgxZFx4NDJceDJiXHhlNyIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGI0XHgxZVx4NmJceGUyXHhlYlx4YThceDRhXHgxNCIKKwkJCSAgIlx4OGVceDJlXHhlZFx4ODRceDU5XHgzY1x4NWVceGM3IiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDliXHg5Ylx4N2JceGZjXHhkMVx4ODFceDNjXHhiOSIKKwkJCSAgIlx4NWRceDBiXHgzNlx4MThceGY0XHgwZlx4NTFceDIyIiwKKwkJLnJsZW4JPSAxNiwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHNlZWRfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0gemVyb2VkX3N0cmluZywKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4NWVceGJhXHhjNlx4ZTBceDA1XHg0ZVx4MTZceDY4IgorCQkJICAiXHgxOVx4YWZceGYxXHhjY1x4NmRceDM0XHg2Y1x4ZGIiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiLAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIiwKKwkJLmtsZW4JPSAxNiwKKwkJLmlucHV0CT0gIlx4YzFceDFmXHgyMlx4ZjJceDAxXHg0MFx4NTBceDUwIgorCQkJICAiXHg4NFx4NDhceDM1XHg5N1x4ZTRceDM3XHgwZlx4NDMiLAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0gemVyb2VkX3N0cmluZywKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHg0N1x4MDZceDQ4XHgwOFx4NTFceGU2XHgxYlx4ZTgiCisJCQkgICJceDVkXHg3NFx4YmZceGIzXHhmZFx4OTVceDYxXHg4NSIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceGVlXHg1NFx4ZDFceDNlXHhiY1x4YWVceDcwXHg2ZCIKKwkJCSAgIlx4MjJceDZiXHhjM1x4MTRceDJjXHhkNFx4MGRceDRhIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceDgzXHhhMlx4ZjhceGEyXHg4OFx4NjRceDFmXHhiOSIKKwkJCSAgIlx4YTRceGU5XHhhNVx4Y2NceDJmXHgxM1x4MWNceDdkIiwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSAiXHgyOFx4ZGJceGMzXHhiY1x4NDlceGZmXHhkOFx4N2QiCisJCQkgICJceGNmXHhhNVx4MDlceGIxXHgxZFx4NDJceDJiXHhlNyIsCisJCS5rbGVuCT0gMTYsCisJCS5pbnB1dAk9ICJceDliXHg5Ylx4N2JceGZjXHhkMVx4ODFceDNjXHhiOSIKKwkJCSAgIlx4NWRceDBiXHgzNlx4MThceGY0XHgwZlx4NTFceDIyIiwKKwkJLmlsZW4JPSAxNiwKKwkJLnJlc3VsdAk9ICJceGI0XHgxZVx4NmJceGUyXHhlYlx4YThceDRhXHgxNCIKKwkJCSAgIlx4OGVceDJlXHhlZFx4ODRceDU5XHgzY1x4NWVceGM3IiwKKwkJLnJsZW4JPSAxNiwKKwl9Cit9OworCisjZGVmaW5lIFNBTFNBMjBfU1RSRUFNX0VOQ19URVNUX1ZFQ1RPUlMgNQorc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBzYWxzYTIwX3N0cmVhbV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwkvKgorCSogVGVzdHZlY3RvcnMgZnJvbSB2ZXJpZmllZC50ZXN0LXZlY3RvcnMgc3VibWl0dGVkIHRvIEVDUllQVC4KKwkqIFRoZXkgYXJlIHRydW5jYXRlZCB0byBzaXplIDM5LCA2NCwgMTExLCAxMjkgdG8gdGVzdCBhIHZhcmlldHkKKwkqIG9mIGlucHV0IGxlbmd0aC4KKwkqLworCXsgLyogU2V0IDMsIHZlY3RvciAwICovCisJCS5rZXkJPSAiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisJCQkiXHgwOFx4MDlceDBBXHgwQlx4MENceDBEXHgwRVx4MEYiLAorCQkua2xlbgk9IDE2LAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaWxlbgk9IDM5LAorCQkucmVzdWx0CT0gIlx4MkRceEQ1XHhDM1x4RjdceEJBXHgyQlx4MjBceEY3IgorCQkJICJceDY4XHgwMlx4NDFceDBDXHg2OFx4ODZceDg4XHg4OSIKKwkJCSAiXHg1QVx4RDhceEMxXHhCRFx4NEVceEE2XHhDOVx4QjEiCisJCQkgIlx4NDBceEZCXHg5Qlx4OTBceEUyXHgxMFx4NDlceEJGIgorCQkJICJceDU4XHgzRlx4NTJceDc5XHg3MFx4RUJceEMxIiwKKwkJLnJsZW4JPSAzOSwKKwl9LCB7IC8qIFNldCA1LCB2ZWN0b3IgMCAqLworCQkua2V5CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAxNiwKKwkJLml2ICAgICA9ICJceDgwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJCSJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbGVuCT0gNjQsCisJCS5yZXN1bHQJPSAiXHhCNlx4NkNceDFFXHg0NFx4NDZceEREXHg5NVx4NTciCisJCQkgIlx4RTVceDc4XHhFMlx4MjNceEIwXHhCN1x4NjhceDAxIgorCQkJICJceDdCXHgyM1x4QjJceDY3XHhCQlx4MDJceDM0XHhBRSIKKwkJCSAiXHg0Nlx4MjZceEJGXHg0NFx4M0ZceDIxXHg5N1x4NzYiCisJCQkgIlx4NDNceDZGXHhCMVx4OUZceEQwXHhFOFx4ODZceDZGIgorCQkJICJceENEXHgwRFx4RTlceEE5XHg1M1x4OEZceDRBXHgwOSIKKwkJCSAiXHhDQVx4OUFceEMwXHg3M1x4MkVceDMwXHhCQ1x4RjkiCisJCQkgIlx4OEVceDRGXHgxM1x4RTRceEI5XHhFMlx4MDFceEQ5IiwKKwkJLnJsZW4JPSA2NCwKKwl9LCB7IC8qIFNldCAzLCB2ZWN0b3IgMjcgKi8KKwkJLmtleQk9ICJceDFCXHgxQ1x4MURceDFFXHgxRlx4MjBceDIxXHgyMiIKKwkJCSJceDIzXHgyNFx4MjVceDI2XHgyN1x4MjhceDI5XHgyQSIKKwkJCSJceDJCXHgyQ1x4MkRceDJFXHgyRlx4MzBceDMxXHgzMiIKKwkJCSJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzhceDM5XHgzQSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbGVuCT0gMTExLAorCQkucmVzdWx0CT0gIlx4QUVceDM5XHg1MFx4OEVceEFDXHg5QVx4RUNceEU3IgorCQkJICJceEJGXHg5N1x4QkJceDIwXHhCOVx4REVceEU0XHgxRiIKKwkJCSAiXHg4N1x4RDlceDQ3XHhGOFx4MjhceDkxXHgzNVx4OTgiCisJCQkgIlx4REJceDcyXHhDQ1x4MjNceDI5XHg0OFx4NTZceDVFIgorCQkJICJceDgzXHg3RVx4MEJceEYzXHg3RFx4NURceDM4XHg3QiIKKwkJCSAiXHgyRFx4NzFceDAyXHhCNFx4M0JceEI1XHhEOFx4MjMiCisJCQkgIlx4QjBceDRBXHhERlx4M0NceEVDXHhCNlx4RDlceDNCIgorCQkJICJceDlCXHhBN1x4NTJceEJFXHhDNVx4RDRceDUwXHg1OSIKKwkJCSAiXHgxNVx4MTRceEI0XHgwRVx4NDBceEU2XHg1M1x4RDEiCisJCQkgIlx4ODNceDlDXHg1Qlx4QTBceDkyXHgyOVx4NkJceDVFIgorCQkJICJceDk2XHg1Qlx4MUVceDJGXHhEM1x4QUNceEMxXHg5MiIKKwkJCSAiXHhCMVx4NDFceDNGXHgxOVx4MkZceEM0XHgzQlx4QzYiCisJCQkgIlx4OTVceDQ2XHg0NVx4NTRceEU5XHg3NVx4MDNceDA4IgorCQkJICJceDQ0XHhBRlx4RTVceDhBXHg4MVx4MTJceDA5IiwKKwkJLnJsZW4JPSAxMTEsCisJfSwgeyAvKiBTZXQgNSwgdmVjdG9yIDI3ICovCisJCS5rZXkJPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCQkiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDMyLAorCQkuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MTBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0CT0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDAiLAorCQkuaWxlbgk9IDEyOSwKKwkJLnJlc3VsdAk9ICJceEQyXHhEQlx4MUFceDVDXHhGMVx4QzFceEFDXHhEQiIKKwkJCSAiXHhFOFx4MUFceDdBXHg0M1x4NDBceEVGXHg1M1x4NDMiCisJCQkgIlx4NUVceDdGXHg0Qlx4MUFceDUwXHg1Mlx4M0ZceDhEIgorCQkJICJceDI4XHgzRFx4Q0ZceDg1XHgxRFx4NjlceDZFXHg2MCIKKwkJCSAiXHhGMlx4REVceDc0XHg1Nlx4MThceDFCXHg4NFx4MTAiCisJCQkgIlx4RDRceDYyXHhCQVx4NjBceDUwXHhGMFx4NjFceEYyIgorCQkJICJceDFDXHg3OFx4N0ZceEMxXHgyNFx4MzRceEFGXHg1OCIKKwkJCSAiXHhCRlx4MkNceDU5XHhDQVx4OTBceDc3XHhGM1x4QjAiCisJCQkgIlx4NUJceDRBXHhERlx4ODlceENFXHgyQ1x4MkZceEZDIgorCQkJICJceDY3XHhGMFx4RTNceDQ1XHhFOFx4QjNceEIzXHg3NSIKKwkJCSAiXHhBMFx4OTVceDcxXHhBMVx4MjlceDM5XHg5NFx4Q0EiCisJCQkgIlx4NDVceDJGXHhCRFx4Q0JceDEwXHhCNlx4QkVceDlGIgorCQkJICJceDhFXHhGOVx4QjJceDAxXHgwQVx4NUFceDBBXHhCNyIKKwkJCSAiXHg2Qlx4OURceDcwXHg4RVx4NEJceEQ2XHgyRlx4Q0QiCisJCQkgIlx4MkVceDQwXHg0OFx4NzVceEU5XHhFMlx4MjFceDQ1IgorCQkJICJceDBCXHhDOVx4QjZceEI1XHg2Nlx4QkNceDlBXHg1OSIKKwkJCSAiXHg1QSIsCisJCS5ybGVuCT0gMTI5LAorCX0sIHsgLyogbGFyZ2UgdGVzdCB2ZWN0b3IgZ2VuZXJhdGVkIHVzaW5nIENyeXB0bysrICovCisJCS5rZXkgPSAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorCQkJIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3IgorCQkJIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKwkJLmtsZW4gPSAzMiwKKwkJLml2ID0JIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkJIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0ID0KKwkJCSJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIKKwkJCSJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKwkJCSJceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKKwkJCSJceDIwXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyNyIKKwkJCSJceDI4XHgyOVx4MmFceDJiXHgyY1x4MmRceDJlXHgyZiIKKwkJCSJceDMwXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzNyIKKwkJCSJceDM4XHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZiIKKwkJCSJceDQwXHg0MVx4NDJceDQzXHg0NFx4NDVceDQ2XHg0NyIKKwkJCSJceDQ4XHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0ZiIKKwkJCSJceDUwXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1NyIKKwkJCSJceDU4XHg1OVx4NWFceDViXHg1Y1x4NWRceDVlXHg1ZiIKKwkJCSJceDYwXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2NyIKKwkJCSJceDY4XHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2ZiIKKwkJCSJceDcwXHg3MVx4NzJceDczXHg3NFx4NzVceDc2XHg3NyIKKwkJCSJceDc4XHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3ZiIKKwkJCSJceDgwXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4NyIKKwkJCSJceDg4XHg4OVx4OGFceDhiXHg4Y1x4OGRceDhlXHg4ZiIKKwkJCSJceDkwXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5NyIKKwkJCSJceDk4XHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5ZiIKKwkJCSJceGEwXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhNyIKKwkJCSJceGE4XHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZiIKKwkJCSJceGIwXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiNyIKKwkJCSJceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlXHhiZiIKKwkJCSJceGMwXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjNyIKKwkJCSJceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZiIKKwkJCSJceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNyIKKwkJCSJceGQ4XHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZiIKKwkJCSJceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNyIKKwkJCSJceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZiIKKwkJCSJceGYwXHhmMVx4ZjJceGYzXHhmNFx4ZjVceGY2XHhmNyIKKwkJCSJceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZiIKKwkJCSJceDAwXHgwM1x4MDZceDA5XHgwY1x4MGZceDEyXHgxNSIKKwkJCSJceDE4XHgxYlx4MWVceDIxXHgyNFx4MjdceDJhXHgyZCIKKwkJCSJceDMwXHgzM1x4MzZceDM5XHgzY1x4M2ZceDQyXHg0NSIKKwkJCSJceDQ4XHg0Ylx4NGVceDUxXHg1NFx4NTdceDVhXHg1ZCIKKwkJCSJceDYwXHg2M1x4NjZceDY5XHg2Y1x4NmZceDcyXHg3NSIKKwkJCSJceDc4XHg3Ylx4N2VceDgxXHg4NFx4ODdceDhhXHg4ZCIKKwkJCSJceDkwXHg5M1x4OTZceDk5XHg5Y1x4OWZceGEyXHhhNSIKKwkJCSJceGE4XHhhYlx4YWVceGIxXHhiNFx4YjdceGJhXHhiZCIKKwkJCSJceGMwXHhjM1x4YzZceGM5XHhjY1x4Y2ZceGQyXHhkNSIKKwkJCSJceGQ4XHhkYlx4ZGVceGUxXHhlNFx4ZTdceGVhXHhlZCIKKwkJCSJceGYwXHhmM1x4ZjZceGY5XHhmY1x4ZmZceDAyXHgwNSIKKwkJCSJceDA4XHgwYlx4MGVceDExXHgxNFx4MTdceDFhXHgxZCIKKwkJCSJceDIwXHgyM1x4MjZceDI5XHgyY1x4MmZceDMyXHgzNSIKKwkJCSJceDM4XHgzYlx4M2VceDQxXHg0NFx4NDdceDRhXHg0ZCIKKwkJCSJceDUwXHg1M1x4NTZceDU5XHg1Y1x4NWZceDYyXHg2NSIKKwkJCSJceDY4XHg2Ylx4NmVceDcxXHg3NFx4NzdceDdhXHg3ZCIKKwkJCSJceDgwXHg4M1x4ODZceDg5XHg4Y1x4OGZceDkyXHg5NSIKKwkJCSJceDk4XHg5Ylx4OWVceGExXHhhNFx4YTdceGFhXHhhZCIKKwkJCSJceGIwXHhiM1x4YjZceGI5XHhiY1x4YmZceGMyXHhjNSIKKwkJCSJceGM4XHhjYlx4Y2VceGQxXHhkNFx4ZDdceGRhXHhkZCIKKwkJCSJceGUwXHhlM1x4ZTZceGU5XHhlY1x4ZWZceGYyXHhmNSIKKwkJCSJceGY4XHhmYlx4ZmVceDAxXHgwNFx4MDdceDBhXHgwZCIKKwkJCSJceDEwXHgxM1x4MTZceDE5XHgxY1x4MWZceDIyXHgyNSIKKwkJCSJceDI4XHgyYlx4MmVceDMxXHgzNFx4MzdceDNhXHgzZCIKKwkJCSJceDQwXHg0M1x4NDZceDQ5XHg0Y1x4NGZceDUyXHg1NSIKKwkJCSJceDU4XHg1Ylx4NWVceDYxXHg2NFx4NjdceDZhXHg2ZCIKKwkJCSJceDcwXHg3M1x4NzZceDc5XHg3Y1x4N2ZceDgyXHg4NSIKKwkJCSJceDg4XHg4Ylx4OGVceDkxXHg5NFx4OTdceDlhXHg5ZCIKKwkJCSJceGEwXHhhM1x4YTZceGE5XHhhY1x4YWZceGIyXHhiNSIKKwkJCSJceGI4XHhiYlx4YmVceGMxXHhjNFx4YzdceGNhXHhjZCIKKwkJCSJceGQwXHhkM1x4ZDZceGQ5XHhkY1x4ZGZceGUyXHhlNSIKKwkJCSJceGU4XHhlYlx4ZWVceGYxXHhmNFx4ZjdceGZhXHhmZCIKKwkJCSJceDAwXHgwNVx4MGFceDBmXHgxNFx4MTlceDFlXHgyMyIKKwkJCSJceDI4XHgyZFx4MzJceDM3XHgzY1x4NDFceDQ2XHg0YiIKKwkJCSJceDUwXHg1NVx4NWFceDVmXHg2NFx4NjlceDZlXHg3MyIKKwkJCSJceDc4XHg3ZFx4ODJceDg3XHg4Y1x4OTFceDk2XHg5YiIKKwkJCSJceGEwXHhhNVx4YWFceGFmXHhiNFx4YjlceGJlXHhjMyIKKwkJCSJceGM4XHhjZFx4ZDJceGQ3XHhkY1x4ZTFceGU2XHhlYiIKKwkJCSJceGYwXHhmNVx4ZmFceGZmXHgwNFx4MDlceDBlXHgxMyIKKwkJCSJceDE4XHgxZFx4MjJceDI3XHgyY1x4MzFceDM2XHgzYiIKKwkJCSJceDQwXHg0NVx4NGFceDRmXHg1NFx4NTlceDVlXHg2MyIKKwkJCSJceDY4XHg2ZFx4NzJceDc3XHg3Y1x4ODFceDg2XHg4YiIKKwkJCSJceDkwXHg5NVx4OWFceDlmXHhhNFx4YTlceGFlXHhiMyIKKwkJCSJceGI4XHhiZFx4YzJceGM3XHhjY1x4ZDFceGQ2XHhkYiIKKwkJCSJceGUwXHhlNVx4ZWFceGVmXHhmNFx4ZjlceGZlXHgwMyIKKwkJCSJceDA4XHgwZFx4MTJceDE3XHgxY1x4MjFceDI2XHgyYiIKKwkJCSJceDMwXHgzNVx4M2FceDNmXHg0NFx4NDlceDRlXHg1MyIKKwkJCSJceDU4XHg1ZFx4NjJceDY3XHg2Y1x4NzFceDc2XHg3YiIKKwkJCSJceDgwXHg4NVx4OGFceDhmXHg5NFx4OTlceDllXHhhMyIKKwkJCSJceGE4XHhhZFx4YjJceGI3XHhiY1x4YzFceGM2XHhjYiIKKwkJCSJceGQwXHhkNVx4ZGFceGRmXHhlNFx4ZTlceGVlXHhmMyIKKwkJCSJceGY4XHhmZFx4MDJceDA3XHgwY1x4MTFceDE2XHgxYiIKKwkJCSJceDIwXHgyNVx4MmFceDJmXHgzNFx4MzlceDNlXHg0MyIKKwkJCSJceDQ4XHg0ZFx4NTJceDU3XHg1Y1x4NjFceDY2XHg2YiIKKwkJCSJceDcwXHg3NVx4N2FceDdmXHg4NFx4ODlceDhlXHg5MyIKKwkJCSJceDk4XHg5ZFx4YTJceGE3XHhhY1x4YjFceGI2XHhiYiIKKwkJCSJceGMwXHhjNVx4Y2FceGNmXHhkNFx4ZDlceGRlXHhlMyIKKwkJCSJceGU4XHhlZFx4ZjJceGY3XHhmY1x4MDFceDA2XHgwYiIKKwkJCSJceDEwXHgxNVx4MWFceDFmXHgyNFx4MjlceDJlXHgzMyIKKwkJCSJceDM4XHgzZFx4NDJceDQ3XHg0Y1x4NTFceDU2XHg1YiIKKwkJCSJceDYwXHg2NVx4NmFceDZmXHg3NFx4NzlceDdlXHg4MyIKKwkJCSJceDg4XHg4ZFx4OTJceDk3XHg5Y1x4YTFceGE2XHhhYiIKKwkJCSJceGIwXHhiNVx4YmFceGJmXHhjNFx4YzlceGNlXHhkMyIKKwkJCSJceGQ4XHhkZFx4ZTJceGU3XHhlY1x4ZjFceGY2XHhmYiIKKwkJCSJceDAwXHgwN1x4MGVceDE1XHgxY1x4MjNceDJhXHgzMSIKKwkJCSJceDM4XHgzZlx4NDZceDRkXHg1NFx4NWJceDYyXHg2OSIKKwkJCSJceDcwXHg3N1x4N2VceDg1XHg4Y1x4OTNceDlhXHhhMSIKKwkJCSJceGE4XHhhZlx4YjZceGJkXHhjNFx4Y2JceGQyXHhkOSIKKwkJCSJceGUwXHhlN1x4ZWVceGY1XHhmY1x4MDNceDBhXHgxMSIKKwkJCSJceDE4XHgxZlx4MjZceDJkXHgzNFx4M2JceDQyXHg0OSIKKwkJCSJceDUwXHg1N1x4NWVceDY1XHg2Y1x4NzNceDdhXHg4MSIKKwkJCSJceDg4XHg4Zlx4OTZceDlkXHhhNFx4YWJceGIyXHhiOSIKKwkJCSJceGMwXHhjN1x4Y2VceGQ1XHhkY1x4ZTNceGVhXHhmMSIKKwkJCSJceGY4XHhmZlx4MDZceDBkXHgxNFx4MWJceDIyXHgyOSIKKwkJCSJceDMwXHgzN1x4M2VceDQ1XHg0Y1x4NTNceDVhXHg2MSIKKwkJCSJceDY4XHg2Zlx4NzZceDdkXHg4NFx4OGJceDkyXHg5OSIKKwkJCSJceGEwXHhhN1x4YWVceGI1XHhiY1x4YzNceGNhXHhkMSIKKwkJCSJceGQ4XHhkZlx4ZTZceGVkXHhmNFx4ZmJceDAyXHgwOSIKKwkJCSJceDEwXHgxN1x4MWVceDI1XHgyY1x4MzNceDNhXHg0MSIKKwkJCSJceDQ4XHg0Zlx4NTZceDVkXHg2NFx4NmJceDcyXHg3OSIKKwkJCSJceDgwXHg4N1x4OGVceDk1XHg5Y1x4YTNceGFhXHhiMSIKKwkJCSJceGI4XHhiZlx4YzZceGNkXHhkNFx4ZGJceGUyXHhlOSIKKwkJCSJceGYwXHhmN1x4ZmVceDA1XHgwY1x4MTNceDFhXHgyMSIKKwkJCSJceDI4XHgyZlx4MzZceDNkXHg0NFx4NGJceDUyXHg1OSIKKwkJCSJceDYwXHg2N1x4NmVceDc1XHg3Y1x4ODNceDhhXHg5MSIKKwkJCSJceDk4XHg5Zlx4YTZceGFkXHhiNFx4YmJceGMyXHhjOSIKKwkJCSJceGQwXHhkN1x4ZGVceGU1XHhlY1x4ZjNceGZhXHgwMSIKKwkJCSJceDA4XHgwZlx4MTZceDFkXHgyNFx4MmJceDMyXHgzOSIKKwkJCSJceDQwXHg0N1x4NGVceDU1XHg1Y1x4NjNceDZhXHg3MSIKKwkJCSJceDc4XHg3Zlx4ODZceDhkXHg5NFx4OWJceGEyXHhhOSIKKwkJCSJceGIwXHhiN1x4YmVceGM1XHhjY1x4ZDNceGRhXHhlMSIKKwkJCSJceGU4XHhlZlx4ZjZceGZkXHgwNFx4MGJceDEyXHgxOSIKKwkJCSJceDIwXHgyN1x4MmVceDM1XHgzY1x4NDNceDRhXHg1MSIKKwkJCSJceDU4XHg1Zlx4NjZceDZkXHg3NFx4N2JceDgyXHg4OSIKKwkJCSJceDkwXHg5N1x4OWVceGE1XHhhY1x4YjNceGJhXHhjMSIKKwkJCSJceGM4XHhjZlx4ZDZceGRkXHhlNFx4ZWJceGYyXHhmOSIKKwkJCSJceDAwXHgwOVx4MTJceDFiXHgyNFx4MmRceDM2XHgzZiIKKwkJCSJceDQ4XHg1MVx4NWFceDYzXHg2Y1x4NzVceDdlXHg4NyIKKwkJCSJceDkwXHg5OVx4YTJceGFiXHhiNFx4YmRceGM2XHhjZiIKKwkJCSJceGQ4XHhlMVx4ZWFceGYzXHhmY1x4MDVceDBlXHgxNyIKKwkJCSJceDIwXHgyOVx4MzJceDNiXHg0NFx4NGRceDU2XHg1ZiIKKwkJCSJceDY4XHg3MVx4N2FceDgzXHg4Y1x4OTVceDllXHhhNyIKKwkJCSJceGIwXHhiOVx4YzJceGNiXHhkNFx4ZGRceGU2XHhlZiIKKwkJCSJceGY4XHgwMVx4MGFceDEzXHgxY1x4MjVceDJlXHgzNyIKKwkJCSJceDQwXHg0OVx4NTJceDViXHg2NFx4NmRceDc2XHg3ZiIKKwkJCSJceDg4XHg5MVx4OWFceGEzXHhhY1x4YjVceGJlXHhjNyIKKwkJCSJceGQwXHhkOVx4ZTJceGViXHhmNFx4ZmRceDA2XHgwZiIKKwkJCSJceDE4XHgyMVx4MmFceDMzXHgzY1x4NDVceDRlXHg1NyIKKwkJCSJceDYwXHg2OVx4NzJceDdiXHg4NFx4OGRceDk2XHg5ZiIKKwkJCSJceGE4XHhiMVx4YmFceGMzXHhjY1x4ZDVceGRlXHhlNyIKKwkJCSJceGYwXHhmOVx4MDJceDBiXHgxNFx4MWRceDI2XHgyZiIKKwkJCSJceDM4XHg0MVx4NGFceDUzXHg1Y1x4NjVceDZlXHg3NyIKKwkJCSJceDgwXHg4OVx4OTJceDliXHhhNFx4YWRceGI2XHhiZiIKKwkJCSJceGM4XHhkMVx4ZGFceGUzXHhlY1x4ZjVceGZlXHgwNyIKKwkJCSJceDEwXHgxOVx4MjJceDJiXHgzNFx4M2RceDQ2XHg0ZiIKKwkJCSJceDU4XHg2MVx4NmFceDczXHg3Y1x4ODVceDhlXHg5NyIKKwkJCSJceGEwXHhhOVx4YjJceGJiXHhjNFx4Y2RceGQ2XHhkZiIKKwkJCSJceGU4XHhmMVx4ZmFceDAzXHgwY1x4MTVceDFlXHgyNyIKKwkJCSJceDMwXHgzOVx4NDJceDRiXHg1NFx4NWRceDY2XHg2ZiIKKwkJCSJceDc4XHg4MVx4OGFceDkzXHg5Y1x4YTVceGFlXHhiNyIKKwkJCSJceGMwXHhjOVx4ZDJceGRiXHhlNFx4ZWRceGY2XHhmZiIKKwkJCSJceDA4XHgxMVx4MWFceDIzXHgyY1x4MzVceDNlXHg0NyIKKwkJCSJceDUwXHg1OVx4NjJceDZiXHg3NFx4N2RceDg2XHg4ZiIKKwkJCSJceDk4XHhhMVx4YWFceGIzXHhiY1x4YzVceGNlXHhkNyIKKwkJCSJceGUwXHhlOVx4ZjJceGZiXHgwNFx4MGRceDE2XHgxZiIKKwkJCSJceDI4XHgzMVx4M2FceDQzXHg0Y1x4NTVceDVlXHg2NyIKKwkJCSJceDcwXHg3OVx4ODJceDhiXHg5NFx4OWRceGE2XHhhZiIKKwkJCSJceGI4XHhjMVx4Y2FceGQzXHhkY1x4ZTVceGVlXHhmNyIKKwkJCSJceDAwXHgwYlx4MTZceDIxXHgyY1x4MzdceDQyXHg0ZCIKKwkJCSJceDU4XHg2M1x4NmVceDc5XHg4NFx4OGZceDlhXHhhNSIKKwkJCSJceGIwXHhiYlx4YzZceGQxXHhkY1x4ZTdceGYyXHhmZCIKKwkJCSJceDA4XHgxM1x4MWVceDI5XHgzNFx4M2ZceDRhXHg1NSIKKwkJCSJceDYwXHg2Ylx4NzZceDgxXHg4Y1x4OTdceGEyXHhhZCIKKwkJCSJceGI4XHhjM1x4Y2VceGQ5XHhlNFx4ZWZceGZhXHgwNSIKKwkJCSJceDEwXHgxYlx4MjZceDMxXHgzY1x4NDdceDUyXHg1ZCIKKwkJCSJceDY4XHg3M1x4N2VceDg5XHg5NFx4OWZceGFhXHhiNSIKKwkJCSJceGMwXHhjYlx4ZDZceGUxXHhlY1x4ZjdceDAyXHgwZCIKKwkJCSJceDE4XHgyM1x4MmVceDM5XHg0NFx4NGZceDVhXHg2NSIKKwkJCSJceDcwXHg3Ylx4ODZceDkxXHg5Y1x4YTdceGIyXHhiZCIKKwkJCSJceGM4XHhkM1x4ZGVceGU5XHhmNFx4ZmZceDBhXHgxNSIKKwkJCSJceDIwXHgyYlx4MzZceDQxXHg0Y1x4NTdceDYyXHg2ZCIKKwkJCSJceDc4XHg4M1x4OGVceDk5XHhhNFx4YWZceGJhXHhjNSIKKwkJCSJceGQwXHhkYlx4ZTZceGYxXHhmY1x4MDdceDEyXHgxZCIKKwkJCSJceDI4XHgzM1x4M2VceDQ5XHg1NFx4NWZceDZhXHg3NSIKKwkJCSJceDgwXHg4Ylx4OTZceGExXHhhY1x4YjdceGMyXHhjZCIKKwkJCSJceGQ4XHhlM1x4ZWVceGY5XHgwNFx4MGZceDFhXHgyNSIKKwkJCSJceDMwXHgzYlx4NDZceDUxXHg1Y1x4NjdceDcyXHg3ZCIKKwkJCSJceDg4XHg5M1x4OWVceGE5XHhiNFx4YmZceGNhXHhkNSIKKwkJCSJceGUwXHhlYlx4ZjZceDAxXHgwY1x4MTdceDIyXHgyZCIKKwkJCSJceDM4XHg0M1x4NGVceDU5XHg2NFx4NmZceDdhXHg4NSIKKwkJCSJceDkwXHg5Ylx4YTZceGIxXHhiY1x4YzdceGQyXHhkZCIKKwkJCSJceGU4XHhmM1x4ZmVceDA5XHgxNFx4MWZceDJhXHgzNSIKKwkJCSJceDQwXHg0Ylx4NTZceDYxXHg2Y1x4NzdceDgyXHg4ZCIKKwkJCSJceDk4XHhhM1x4YWVceGI5XHhjNFx4Y2ZceGRhXHhlNSIKKwkJCSJceGYwXHhmYlx4MDZceDExXHgxY1x4MjdceDMyXHgzZCIKKwkJCSJceDQ4XHg1M1x4NWVceDY5XHg3NFx4N2ZceDhhXHg5NSIKKwkJCSJceGEwXHhhYlx4YjZceGMxXHhjY1x4ZDdceGUyXHhlZCIKKwkJCSJceGY4XHgwM1x4MGVceDE5XHgyNFx4MmZceDNhXHg0NSIKKwkJCSJceDUwXHg1Ylx4NjZceDcxXHg3Y1x4ODdceDkyXHg5ZCIKKwkJCSJceGE4XHhiM1x4YmVceGM5XHhkNFx4ZGZceGVhXHhmNSIKKwkJCSJceDAwXHgwZFx4MWFceDI3XHgzNFx4NDFceDRlXHg1YiIKKwkJCSJceDY4XHg3NVx4ODJceDhmXHg5Y1x4YTlceGI2XHhjMyIKKwkJCSJceGQwXHhkZFx4ZWFceGY3XHgwNFx4MTFceDFlXHgyYiIKKwkJCSJceDM4XHg0NVx4NTJceDVmXHg2Y1x4NzlceDg2XHg5MyIKKwkJCSJceGEwXHhhZFx4YmFceGM3XHhkNFx4ZTFceGVlXHhmYiIKKwkJCSJceDA4XHgxNVx4MjJceDJmXHgzY1x4NDlceDU2XHg2MyIKKwkJCSJceDcwXHg3ZFx4OGFceDk3XHhhNFx4YjFceGJlXHhjYiIKKwkJCSJceGQ4XHhlNVx4ZjJceGZmXHgwY1x4MTlceDI2XHgzMyIKKwkJCSJceDQwXHg0ZFx4NWFceDY3XHg3NFx4ODFceDhlXHg5YiIKKwkJCSJceGE4XHhiNVx4YzJceGNmXHhkY1x4ZTlceGY2XHgwMyIKKwkJCSJceDEwXHgxZFx4MmFceDM3XHg0NFx4NTFceDVlXHg2YiIKKwkJCSJceDc4XHg4NVx4OTJceDlmXHhhY1x4YjlceGM2XHhkMyIKKwkJCSJceGUwXHhlZFx4ZmFceDA3XHgxNFx4MjFceDJlXHgzYiIKKwkJCSJceDQ4XHg1NVx4NjJceDZmXHg3Y1x4ODlceDk2XHhhMyIKKwkJCSJceGIwXHhiZFx4Y2FceGQ3XHhlNFx4ZjFceGZlXHgwYiIKKwkJCSJceDE4XHgyNVx4MzJceDNmXHg0Y1x4NTlceDY2XHg3MyIKKwkJCSJceDgwXHg4ZFx4OWFceGE3XHhiNFx4YzFceGNlXHhkYiIKKwkJCSJceGU4XHhmNVx4MDJceDBmXHgxY1x4MjlceDM2XHg0MyIKKwkJCSJceDUwXHg1ZFx4NmFceDc3XHg4NFx4OTFceDllXHhhYiIKKwkJCSJceGI4XHhjNVx4ZDJceGRmXHhlY1x4ZjlceDA2XHgxMyIKKwkJCSJceDIwXHgyZFx4M2FceDQ3XHg1NFx4NjFceDZlXHg3YiIKKwkJCSJceDg4XHg5NVx4YTJceGFmXHhiY1x4YzlceGQ2XHhlMyIKKwkJCSJceGYwXHhmZFx4MGFceDE3XHgyNFx4MzFceDNlXHg0YiIKKwkJCSJceDU4XHg2NVx4NzJceDdmXHg4Y1x4OTlceGE2XHhiMyIKKwkJCSJceGMwXHhjZFx4ZGFceGU3XHhmNFx4MDFceDBlXHgxYiIKKwkJCSJceDI4XHgzNVx4NDJceDRmXHg1Y1x4NjlceDc2XHg4MyIKKwkJCSJceDkwXHg5ZFx4YWFceGI3XHhjNFx4ZDFceGRlXHhlYiIKKwkJCSJceGY4XHgwNVx4MTJceDFmXHgyY1x4MzlceDQ2XHg1MyIKKwkJCSJceDYwXHg2ZFx4N2FceDg3XHg5NFx4YTFceGFlXHhiYiIKKwkJCSJceGM4XHhkNVx4ZTJceGVmXHhmY1x4MDlceDE2XHgyMyIKKwkJCSJceDMwXHgzZFx4NGFceDU3XHg2NFx4NzFceDdlXHg4YiIKKwkJCSJceDk4XHhhNVx4YjJceGJmXHhjY1x4ZDlceGU2XHhmMyIKKwkJCSJceDAwXHgwZlx4MWVceDJkXHgzY1x4NGJceDVhXHg2OSIKKwkJCSJceDc4XHg4N1x4OTZceGE1XHhiNFx4YzNceGQyXHhlMSIKKwkJCSJceGYwXHhmZlx4MGVceDFkXHgyY1x4M2JceDRhXHg1OSIKKwkJCSJceDY4XHg3N1x4ODZceDk1XHhhNFx4YjNceGMyXHhkMSIKKwkJCSJceGUwXHhlZlx4ZmVceDBkXHgxY1x4MmJceDNhXHg0OSIKKwkJCSJceDU4XHg2N1x4NzZceDg1XHg5NFx4YTNceGIyXHhjMSIKKwkJCSJceGQwXHhkZlx4ZWVceGZkXHgwY1x4MWJceDJhXHgzOSIKKwkJCSJceDQ4XHg1N1x4NjZceDc1XHg4NFx4OTNceGEyXHhiMSIKKwkJCSJceGMwXHhjZlx4ZGVceGVkXHhmY1x4MGJceDFhXHgyOSIKKwkJCSJceDM4XHg0N1x4NTZceDY1XHg3NFx4ODNceDkyXHhhMSIKKwkJCSJceGIwXHhiZlx4Y2VceGRkXHhlY1x4ZmJceDBhXHgxOSIKKwkJCSJceDI4XHgzN1x4NDZceDU1XHg2NFx4NzNceDgyXHg5MSIKKwkJCSJceGEwXHhhZlx4YmVceGNkXHhkY1x4ZWJceGZhXHgwOSIKKwkJCSJceDE4XHgyN1x4MzZceDQ1XHg1NFx4NjNceDcyXHg4MSIKKwkJCSJceDkwXHg5Zlx4YWVceGJkXHhjY1x4ZGJceGVhXHhmOSIKKwkJCSJceDA4XHgxN1x4MjZceDM1XHg0NFx4NTNceDYyXHg3MSIKKwkJCSJceDgwXHg4Zlx4OWVceGFkXHhiY1x4Y2JceGRhXHhlOSIKKwkJCSJceGY4XHgwN1x4MTZceDI1XHgzNFx4NDNceDUyXHg2MSIKKwkJCSJceDcwXHg3Zlx4OGVceDlkXHhhY1x4YmJceGNhXHhkOSIKKwkJCSJceGU4XHhmN1x4MDZceDE1XHgyNFx4MzNceDQyXHg1MSIKKwkJCSJceDYwXHg2Zlx4N2VceDhkXHg5Y1x4YWJceGJhXHhjOSIKKwkJCSJceGQ4XHhlN1x4ZjZceDA1XHgxNFx4MjNceDMyXHg0MSIKKwkJCSJceDUwXHg1Zlx4NmVceDdkXHg4Y1x4OWJceGFhXHhiOSIKKwkJCSJceGM4XHhkN1x4ZTZceGY1XHgwNFx4MTNceDIyXHgzMSIKKwkJCSJceDQwXHg0Zlx4NWVceDZkXHg3Y1x4OGJceDlhXHhhOSIKKwkJCSJceGI4XHhjN1x4ZDZceGU1XHhmNFx4MDNceDEyXHgyMSIKKwkJCSJceDMwXHgzZlx4NGVceDVkXHg2Y1x4N2JceDhhXHg5OSIKKwkJCSJceGE4XHhiN1x4YzZceGQ1XHhlNFx4ZjNceDAyXHgxMSIKKwkJCSJceDIwXHgyZlx4M2VceDRkXHg1Y1x4NmJceDdhXHg4OSIKKwkJCSJceDk4XHhhN1x4YjZceGM1XHhkNFx4ZTNceGYyXHgwMSIKKwkJCSJceDEwXHgxZlx4MmVceDNkXHg0Y1x4NWJceDZhXHg3OSIKKwkJCSJceDg4XHg5N1x4YTZceGI1XHhjNFx4ZDNceGUyXHhmMSIKKwkJCSJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKwkJCSJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIKKwkJCSJceDEwXHgyMVx4MzJceDQzXHg1NFx4NjVceDc2XHg4NyIKKwkJCSJceDk4XHhhOVx4YmFceGNiXHhkY1x4ZWRceGZlXHgwZiIKKwkJCSJceDIwXHgzMVx4NDJceDUzXHg2NFx4NzVceDg2XHg5NyIKKwkJCSJceGE4XHhiOVx4Y2FceGRiXHhlY1x4ZmRceDBlXHgxZiIKKwkJCSJceDMwXHg0MVx4NTJceDYzXHg3NFx4ODVceDk2XHhhNyIKKwkJCSJceGI4XHhjOVx4ZGFceGViXHhmY1x4MGRceDFlXHgyZiIKKwkJCSJceDQwXHg1MVx4NjJceDczXHg4NFx4OTVceGE2XHhiNyIKKwkJCSJceGM4XHhkOVx4ZWFceGZiXHgwY1x4MWRceDJlXHgzZiIKKwkJCSJceDUwXHg2MVx4NzJceDgzXHg5NFx4YTVceGI2XHhjNyIKKwkJCSJceGQ4XHhlOVx4ZmFceDBiXHgxY1x4MmRceDNlXHg0ZiIKKwkJCSJceDYwXHg3MVx4ODJceDkzXHhhNFx4YjVceGM2XHhkNyIKKwkJCSJceGU4XHhmOVx4MGFceDFiXHgyY1x4M2RceDRlXHg1ZiIKKwkJCSJceDcwXHg4MVx4OTJceGEzXHhiNFx4YzVceGQ2XHhlNyIKKwkJCSJceGY4XHgwOVx4MWFceDJiXHgzY1x4NGRceDVlXHg2ZiIKKwkJCSJceDgwXHg5MVx4YTJceGIzXHhjNFx4ZDVceGU2XHhmNyIKKwkJCSJceDA4XHgxOVx4MmFceDNiXHg0Y1x4NWRceDZlXHg3ZiIKKwkJCSJceDkwXHhhMVx4YjJceGMzXHhkNFx4ZTVceGY2XHgwNyIKKwkJCSJceDE4XHgyOVx4M2FceDRiXHg1Y1x4NmRceDdlXHg4ZiIKKwkJCSJceGEwXHhiMVx4YzJceGQzXHhlNFx4ZjVceDA2XHgxNyIKKwkJCSJceDI4XHgzOVx4NGFceDViXHg2Y1x4N2RceDhlXHg5ZiIKKwkJCSJceGIwXHhjMVx4ZDJceGUzXHhmNFx4MDVceDE2XHgyNyIKKwkJCSJceDM4XHg0OVx4NWFceDZiXHg3Y1x4OGRceDllXHhhZiIKKwkJCSJceGMwXHhkMVx4ZTJceGYzXHgwNFx4MTVceDI2XHgzNyIKKwkJCSJceDQ4XHg1OVx4NmFceDdiXHg4Y1x4OWRceGFlXHhiZiIKKwkJCSJceGQwXHhlMVx4ZjJceDAzXHgxNFx4MjVceDM2XHg0NyIKKwkJCSJceDU4XHg2OVx4N2FceDhiXHg5Y1x4YWRceGJlXHhjZiIKKwkJCSJceGUwXHhmMVx4MDJceDEzXHgyNFx4MzVceDQ2XHg1NyIKKwkJCSJceDY4XHg3OVx4OGFceDliXHhhY1x4YmRceGNlXHhkZiIKKwkJCSJceGYwXHgwMVx4MTJceDIzXHgzNFx4NDVceDU2XHg2NyIKKwkJCSJceDc4XHg4OVx4OWFceGFiXHhiY1x4Y2RceGRlXHhlZiIKKwkJCSJceDAwXHgxM1x4MjZceDM5XHg0Y1x4NWZceDcyXHg4NSIKKwkJCSJceDk4XHhhYlx4YmVceGQxXHhlNFx4ZjdceDBhXHgxZCIKKwkJCSJceDMwXHg0M1x4NTZceDY5XHg3Y1x4OGZceGEyXHhiNSIKKwkJCSJceGM4XHhkYlx4ZWVceDAxXHgxNFx4MjdceDNhXHg0ZCIKKwkJCSJceDYwXHg3M1x4ODZceDk5XHhhY1x4YmZceGQyXHhlNSIKKwkJCSJceGY4XHgwYlx4MWVceDMxXHg0NFx4NTdceDZhXHg3ZCIKKwkJCSJceDkwXHhhM1x4YjZceGM5XHhkY1x4ZWZceDAyXHgxNSIKKwkJCSJceDI4XHgzYlx4NGVceDYxXHg3NFx4ODdceDlhXHhhZCIKKwkJCSJceGMwXHhkM1x4ZTZceGY5XHgwY1x4MWZceDMyXHg0NSIKKwkJCSJceDU4XHg2Ylx4N2VceDkxXHhhNFx4YjdceGNhXHhkZCIKKwkJCSJceGYwXHgwM1x4MTZceDI5XHgzY1x4NGZceDYyXHg3NSIKKwkJCSJceDg4XHg5Ylx4YWVceGMxXHhkNFx4ZTdceGZhXHgwZCIKKwkJCSJceDIwXHgzM1x4NDZceDU5XHg2Y1x4N2ZceDkyXHhhNSIKKwkJCSJceGI4XHhjYlx4ZGVceGYxXHgwNFx4MTdceDJhXHgzZCIKKwkJCSJceDUwXHg2M1x4NzZceDg5XHg5Y1x4YWZceGMyXHhkNSIKKwkJCSJceGU4XHhmYlx4MGVceDIxXHgzNFx4NDdceDVhXHg2ZCIKKwkJCSJceDgwXHg5M1x4YTZceGI5XHhjY1x4ZGZceGYyXHgwNSIKKwkJCSJceDE4XHgyYlx4M2VceDUxXHg2NFx4NzdceDhhXHg5ZCIKKwkJCSJceGIwXHhjM1x4ZDZceGU5XHhmY1x4MGZceDIyXHgzNSIKKwkJCSJceDQ4XHg1Ylx4NmVceDgxXHg5NFx4YTdceGJhXHhjZCIKKwkJCSJceGUwXHhmM1x4MDZceDE5XHgyY1x4M2ZceDUyXHg2NSIKKwkJCSJceDc4XHg4Ylx4OWVceGIxXHhjNFx4ZDdceGVhXHhmZCIKKwkJCSJceDEwXHgyM1x4MzZceDQ5XHg1Y1x4NmZceDgyXHg5NSIKKwkJCSJceGE4XHhiYlx4Y2VceGUxXHhmNFx4MDdceDFhXHgyZCIKKwkJCSJceDQwXHg1M1x4NjZceDc5XHg4Y1x4OWZceGIyXHhjNSIKKwkJCSJceGQ4XHhlYlx4ZmVceDExXHgyNFx4MzdceDRhXHg1ZCIKKwkJCSJceDcwXHg4M1x4OTZceGE5XHhiY1x4Y2ZceGUyXHhmNSIKKwkJCSJceDA4XHgxYlx4MmVceDQxXHg1NFx4NjdceDdhXHg4ZCIKKwkJCSJceGEwXHhiM1x4YzZceGQ5XHhlY1x4ZmZceDEyXHgyNSIKKwkJCSJceDM4XHg0Ylx4NWVceDcxXHg4NFx4OTdceGFhXHhiZCIKKwkJCSJceGQwXHhlM1x4ZjZceDA5XHgxY1x4MmZceDQyXHg1NSIKKwkJCSJceDY4XHg3Ylx4OGVceGExXHhiNFx4YzdceGRhXHhlZCIKKwkJCSJceDAwXHgxNVx4MmFceDNmXHg1NFx4NjlceDdlXHg5MyIKKwkJCSJceGE4XHhiZFx4ZDJceGU3XHhmY1x4MTFceDI2XHgzYiIKKwkJCSJceDUwXHg2NVx4N2FceDhmXHhhNFx4YjlceGNlXHhlMyIKKwkJCSJceGY4XHgwZFx4MjJceDM3XHg0Y1x4NjFceDc2XHg4YiIKKwkJCSJceGEwXHhiNVx4Y2FceGRmXHhmNFx4MDlceDFlXHgzMyIKKwkJCSJceDQ4XHg1ZFx4NzJceDg3XHg5Y1x4YjFceGM2XHhkYiIKKwkJCSJceGYwXHgwNVx4MWFceDJmXHg0NFx4NTlceDZlXHg4MyIKKwkJCSJceDk4XHhhZFx4YzJceGQ3XHhlY1x4MDFceDE2XHgyYiIKKwkJCSJceDQwXHg1NVx4NmFceDdmXHg5NFx4YTlceGJlXHhkMyIKKwkJCSJceGU4XHhmZFx4MTJceDI3XHgzY1x4NTFceDY2XHg3YiIKKwkJCSJceDkwXHhhNVx4YmFceGNmXHhlNFx4ZjlceDBlXHgyMyIKKwkJCSJceDM4XHg0ZFx4NjJceDc3XHg4Y1x4YTFceGI2XHhjYiIKKwkJCSJceGUwXHhmNVx4MGFceDFmXHgzNFx4NDlceDVlXHg3MyIKKwkJCSJceDg4XHg5ZFx4YjJceGM3XHhkY1x4ZjFceDA2XHgxYiIKKwkJCSJceDMwXHg0NVx4NWFceDZmXHg4NFx4OTlceGFlXHhjMyIKKwkJCSJceGQ4XHhlZFx4MDJceDE3XHgyY1x4NDFceDU2XHg2YiIKKwkJCSJceDgwXHg5NVx4YWFceGJmXHhkNFx4ZTlceGZlXHgxMyIKKwkJCSJceDI4XHgzZFx4NTJceDY3XHg3Y1x4OTFceGE2XHhiYiIKKwkJCSJceGQwXHhlNVx4ZmFceDBmXHgyNFx4MzlceDRlXHg2MyIKKwkJCSJceDc4XHg4ZFx4YTJceGI3XHhjY1x4ZTFceGY2XHgwYiIKKwkJCSJceDIwXHgzNVx4NGFceDVmXHg3NFx4ODlceDllXHhiMyIKKwkJCSJceGM4XHhkZFx4ZjJceDA3XHgxY1x4MzFceDQ2XHg1YiIKKwkJCSJceDcwXHg4NVx4OWFceGFmXHhjNFx4ZDlceGVlXHgwMyIKKwkJCSJceDE4XHgyZFx4NDJceDU3XHg2Y1x4ODFceDk2XHhhYiIKKwkJCSJceGMwXHhkNVx4ZWFceGZmXHgxNFx4MjlceDNlXHg1MyIKKwkJCSJceDY4XHg3ZFx4OTJceGE3XHhiY1x4ZDFceGU2XHhmYiIKKwkJCSJceDEwXHgyNVx4M2FceDRmXHg2NFx4NzlceDhlXHhhMyIKKwkJCSJceGI4XHhjZFx4ZTJceGY3XHgwY1x4MjFceDM2XHg0YiIKKwkJCSJceDYwXHg3NVx4OGFceDlmXHhiNFx4YzlceGRlXHhmMyIKKwkJCSJceDA4XHgxZFx4MzJceDQ3XHg1Y1x4NzFceDg2XHg5YiIKKwkJCSJceGIwXHhjNVx4ZGFceGVmXHgwNFx4MTlceDJlXHg0MyIKKwkJCSJceDU4XHg2ZFx4ODJceDk3XHhhY1x4YzFceGQ2XHhlYiIKKwkJCSJceDAwXHgxN1x4MmVceDQ1XHg1Y1x4NzNceDhhXHhhMSIKKwkJCSJceGI4XHhjZlx4ZTZceGZkXHgxNFx4MmJceDQyXHg1OSIKKwkJCSJceDcwXHg4N1x4OWVceGI1XHhjY1x4ZTNceGZhXHgxMSIKKwkJCSJceDI4XHgzZlx4NTZceDZkXHg4NFx4OWJceGIyXHhjOSIKKwkJCSJceGUwXHhmN1x4MGVceDI1XHgzY1x4NTNceDZhXHg4MSIKKwkJCSJceDk4XHhhZlx4YzZceGRkXHhmNFx4MGJceDIyXHgzOSIKKwkJCSJceDUwXHg2N1x4N2VceDk1XHhhY1x4YzNceGRhXHhmMSIKKwkJCSJceDA4XHgxZlx4MzZceDRkXHg2NFx4N2JceDkyXHhhOSIKKwkJCSJceGMwXHhkN1x4ZWVceDA1XHgxY1x4MzNceDRhXHg2MSIKKwkJCSJceDc4XHg4Zlx4YTZceGJkXHhkNFx4ZWJceDAyXHgxOSIKKwkJCSJceDMwXHg0N1x4NWVceDc1XHg4Y1x4YTNceGJhXHhkMSIKKwkJCSJceGU4XHhmZlx4MTZceDJkXHg0NFx4NWJceDcyXHg4OSIKKwkJCSJceGEwXHhiN1x4Y2VceGU1XHhmY1x4MTNceDJhXHg0MSIKKwkJCSJceDU4XHg2Zlx4ODZceDlkXHhiNFx4Y2JceGUyXHhmOSIKKwkJCSJceDEwXHgyN1x4M2VceDU1XHg2Y1x4ODNceDlhXHhiMSIKKwkJCSJceGM4XHhkZlx4ZjZceDBkXHgyNFx4M2JceDUyXHg2OSIKKwkJCSJceDgwXHg5N1x4YWVceGM1XHhkY1x4ZjNceDBhXHgyMSIKKwkJCSJceDM4XHg0Zlx4NjZceDdkXHg5NFx4YWJceGMyXHhkOSIKKwkJCSJceGYwXHgwN1x4MWVceDM1XHg0Y1x4NjNceDdhXHg5MSIKKwkJCSJceGE4XHhiZlx4ZDZceGVkXHgwNFx4MWJceDMyXHg0OSIKKwkJCSJceDYwXHg3N1x4OGVceGE1XHhiY1x4ZDNceGVhXHgwMSIKKwkJCSJceDE4XHgyZlx4NDZceDVkXHg3NFx4OGJceGEyXHhiOSIKKwkJCSJceGQwXHhlN1x4ZmVceDE1XHgyY1x4NDNceDVhXHg3MSIKKwkJCSJceDg4XHg5Zlx4YjZceGNkXHhlNFx4ZmJceDEyXHgyOSIKKwkJCSJceDQwXHg1N1x4NmVceDg1XHg5Y1x4YjNceGNhXHhlMSIKKwkJCSJceGY4XHgwZlx4MjZceDNkXHg1NFx4NmJceDgyXHg5OSIKKwkJCSJceGIwXHhjN1x4ZGVceGY1XHgwY1x4MjNceDNhXHg1MSIKKwkJCSJceDY4XHg3Zlx4OTZceGFkXHhjNFx4ZGJceGYyXHgwOSIKKwkJCSJceDIwXHgzN1x4NGVceDY1XHg3Y1x4OTNceGFhXHhjMSIKKwkJCSJceGQ4XHhlZlx4MDZceDFkXHgzNFx4NGJceDYyXHg3OSIKKwkJCSJceDkwXHhhN1x4YmVceGQ1XHhlY1x4MDNceDFhXHgzMSIKKwkJCSJceDQ4XHg1Zlx4NzZceDhkXHhhNFx4YmJceGQyXHhlOSIKKwkJCSJceDAwXHgxOVx4MzJceDRiXHg2NFx4N2RceDk2XHhhZiIKKwkJCSJceGM4XHhlMVx4ZmFceDEzXHgyY1x4NDVceDVlXHg3NyIKKwkJCSJceDkwXHhhOVx4YzJceGRiXHhmNFx4MGRceDI2XHgzZiIKKwkJCSJceDU4XHg3MVx4OGFceGEzXHhiY1x4ZDVceGVlXHgwNyIKKwkJCSJceDIwXHgzOVx4NTJceDZiXHg4NFx4OWRceGI2XHhjZiIKKwkJCSJceGU4XHgwMVx4MWFceDMzXHg0Y1x4NjVceDdlXHg5NyIKKwkJCSJceGIwXHhjOVx4ZTJceGZiXHgxNFx4MmRceDQ2XHg1ZiIKKwkJCSJceDc4XHg5MVx4YWFceGMzXHhkY1x4ZjVceDBlXHgyNyIKKwkJCSJceDQwXHg1OVx4NzJceDhiXHhhNFx4YmRceGQ2XHhlZiIKKwkJCSJceDA4XHgyMVx4M2FceDUzXHg2Y1x4ODVceDllXHhiNyIKKwkJCSJceGQwXHhlOVx4MDJceDFiXHgzNFx4NGRceDY2XHg3ZiIKKwkJCSJceDk4XHhiMVx4Y2FceGUzXHhmY1x4MTVceDJlXHg0NyIKKwkJCSJceDYwXHg3OVx4OTJceGFiXHhjNFx4ZGRceGY2XHgwZiIKKwkJCSJceDI4XHg0MVx4NWFceDczXHg4Y1x4YTVceGJlXHhkNyIKKwkJCSJceGYwXHgwOVx4MjJceDNiXHg1NFx4NmRceDg2XHg5ZiIKKwkJCSJceGI4XHhkMVx4ZWFceDAzXHgxY1x4MzVceDRlXHg2NyIKKwkJCSJceDgwXHg5OVx4YjJceGNiXHhlNFx4ZmRceDE2XHgyZiIKKwkJCSJceDQ4XHg2MVx4N2FceDkzXHhhY1x4YzVceGRlXHhmNyIKKwkJCSJceDEwXHgyOVx4NDJceDViXHg3NFx4OGRceGE2XHhiZiIKKwkJCSJceGQ4XHhmMVx4MGFceDIzXHgzY1x4NTVceDZlXHg4NyIKKwkJCSJceGEwXHhiOVx4ZDJceGViXHgwNFx4MWRceDM2XHg0ZiIKKwkJCSJceDY4XHg4MVx4OWFceGIzXHhjY1x4ZTVceGZlXHgxNyIKKwkJCSJceDMwXHg0OVx4NjJceDdiXHg5NFx4YWRceGM2XHhkZiIKKwkJCSJceGY4XHgxMVx4MmFceDQzXHg1Y1x4NzVceDhlXHhhNyIKKwkJCSJceGMwXHhkOVx4ZjJceDBiXHgyNFx4M2RceDU2XHg2ZiIKKwkJCSJceDg4XHhhMVx4YmFceGQzXHhlY1x4MDVceDFlXHgzNyIKKwkJCSJceDUwXHg2OVx4ODJceDliXHhiNFx4Y2RceGU2XHhmZiIKKwkJCSJceDE4XHgzMVx4NGFceDYzXHg3Y1x4OTVceGFlXHhjNyIKKwkJCSJceGUwXHhmOVx4MTJceDJiXHg0NFx4NWRceDc2XHg4ZiIKKwkJCSJceGE4XHhjMVx4ZGFceGYzXHgwY1x4MjVceDNlXHg1NyIKKwkJCSJceDcwXHg4OVx4YTJceGJiXHhkNFx4ZWRceDA2XHgxZiIKKwkJCSJceDM4XHg1MVx4NmFceDgzXHg5Y1x4YjVceGNlXHhlNyIKKwkJCSJceDAwXHgxYlx4MzZceDUxXHg2Y1x4ODdceGEyXHhiZCIKKwkJCSJceGQ4XHhmM1x4MGVceDI5XHg0NFx4NWZceDdhXHg5NSIKKwkJCSJceGIwXHhjYlx4ZTZceDAxXHgxY1x4MzdceDUyXHg2ZCIKKwkJCSJceDg4XHhhM1x4YmVceGQ5XHhmNFx4MGZceDJhXHg0NSIKKwkJCSJceDYwXHg3Ylx4OTZceGIxXHhjY1x4ZTdceDAyXHgxZCIKKwkJCSJceDM4XHg1M1x4NmVceDg5XHhhNFx4YmZceGRhXHhmNSIKKwkJCSJceDEwXHgyYlx4NDZceDYxXHg3Y1x4OTdceGIyXHhjZCIKKwkJCSJceGU4XHgwM1x4MWVceDM5XHg1NFx4NmZceDhhXHhhNSIKKwkJCSJceGMwXHhkYlx4ZjZceDExXHgyY1x4NDdceDYyXHg3ZCIKKwkJCSJceDk4XHhiM1x4Y2VceGU5XHgwNFx4MWZceDNhXHg1NSIKKwkJCSJceDcwXHg4Ylx4YTZceGMxXHhkY1x4ZjdceDEyXHgyZCIKKwkJCSJceDQ4XHg2M1x4N2VceDk5XHhiNFx4Y2ZceGVhXHgwNSIKKwkJCSJceDIwXHgzYlx4NTZceDcxXHg4Y1x4YTdceGMyXHhkZCIKKwkJCSJceGY4XHgxM1x4MmVceDQ5XHg2NFx4N2ZceDlhXHhiNSIKKwkJCSJceGQwXHhlYlx4MDZceDIxXHgzY1x4NTdceDcyXHg4ZCIKKwkJCSJceGE4XHhjM1x4ZGVceGY5XHgxNFx4MmZceDRhXHg2NSIKKwkJCSJceDgwXHg5Ylx4YjZceGQxXHhlY1x4MDdceDIyXHgzZCIKKwkJCSJceDU4XHg3M1x4OGVceGE5XHhjNFx4ZGZceGZhXHgxNSIKKwkJCSJceDMwXHg0Ylx4NjZceDgxXHg5Y1x4YjdceGQyXHhlZCIKKwkJCSJceDA4XHgyM1x4M2VceDU5XHg3NFx4OGZceGFhXHhjNSIKKwkJCSJceGUwXHhmYlx4MTZceDMxXHg0Y1x4NjdceDgyXHg5ZCIKKwkJCSJceGI4XHhkM1x4ZWVceDA5XHgyNFx4M2ZceDVhXHg3NSIKKwkJCSJceDkwXHhhYlx4YzZceGUxXHhmY1x4MTdceDMyXHg0ZCIKKwkJCSJceDY4XHg4M1x4OWVceGI5XHhkNFx4ZWZceDBhXHgyNSIKKwkJCSJceDQwXHg1Ylx4NzZceDkxXHhhY1x4YzdceGUyXHhmZCIKKwkJCSJceDE4XHgzM1x4NGVceDY5XHg4NFx4OWZceGJhXHhkNSIKKwkJCSJceGYwXHgwYlx4MjZceDQxXHg1Y1x4NzdceDkyXHhhZCIKKwkJCSJceGM4XHhlM1x4ZmVceDE5XHgzNFx4NGZceDZhXHg4NSIKKwkJCSJceGEwXHhiYlx4ZDZceGYxXHgwY1x4MjdceDQyXHg1ZCIKKwkJCSJceDc4XHg5M1x4YWVceGM5XHhlNFx4ZmZceDFhXHgzNSIKKwkJCSJceDUwXHg2Ylx4ODZceGExXHhiY1x4ZDdceGYyXHgwZCIKKwkJCSJceDI4XHg0M1x4NWVceDc5XHg5NFx4YWZceGNhXHhlNSIKKwkJCSJceDAwXHgxZFx4M2FceDU3XHg3NFx4OTFceGFlXHhjYiIKKwkJCSJceGU4XHgwNVx4MjJceDNmXHg1Y1x4NzlceDk2XHhiMyIKKwkJCSJceGQwXHhlZFx4MGFceDI3XHg0NFx4NjFceDdlXHg5YiIKKwkJCSJceGI4XHhkNVx4ZjJceDBmXHgyY1x4NDlceDY2XHg4MyIKKwkJCSJceGEwXHhiZFx4ZGFceGY3XHgxNFx4MzFceDRlXHg2YiIKKwkJCSJceDg4XHhhNVx4YzJceGRmXHhmY1x4MTlceDM2XHg1MyIKKwkJCSJceDcwXHg4ZFx4YWFceGM3XHhlNFx4MDFceDFlXHgzYiIKKwkJCSJceDU4XHg3NVx4OTJceGFmXHhjY1x4ZTlceDA2XHgyMyIKKwkJCSJceDQwXHg1ZFx4N2FceDk3XHhiNFx4ZDFceGVlXHgwYiIKKwkJCSJceDI4XHg0NVx4NjJceDdmXHg5Y1x4YjlceGQ2XHhmMyIKKwkJCSJceDEwXHgyZFx4NGFceDY3XHg4NFx4YTFceGJlXHhkYiIKKwkJCSJceGY4XHgxNVx4MzJceDRmXHg2Y1x4ODlceGE2XHhjMyIKKwkJCSJceGUwXHhmZFx4MWFceDM3XHg1NFx4NzFceDhlXHhhYiIKKwkJCSJceGM4XHhlNVx4MDJceDFmXHgzY1x4NTlceDc2XHg5MyIKKwkJCSJceGIwXHhjZFx4ZWFceDA3XHgyNFx4NDFceDVlXHg3YiIKKwkJCSJceDk4XHhiNVx4ZDJceGVmXHgwY1x4MjlceDQ2XHg2MyIKKwkJCSJceDgwXHg5ZFx4YmFceGQ3XHhmNFx4MTFceDJlXHg0YiIKKwkJCSJceDY4XHg4NVx4YTJceGJmXHhkY1x4ZjlceDE2XHgzMyIKKwkJCSJceDUwXHg2ZFx4OGFceGE3XHhjNFx4ZTFceGZlXHgxYiIKKwkJCSJceDM4XHg1NVx4NzJceDhmXHhhY1x4YzlceGU2XHgwMyIKKwkJCSJceDIwXHgzZFx4NWFceDc3XHg5NFx4YjFceGNlXHhlYiIKKwkJCSJceDA4XHgyNVx4NDJceDVmXHg3Y1x4OTlceGI2XHhkMyIKKwkJCSJceGYwXHgwZFx4MmFceDQ3XHg2NFx4ODFceDllXHhiYiIKKwkJCSJceGQ4XHhmNVx4MTJceDJmXHg0Y1x4NjlceDg2XHhhMyIKKwkJCSJceGMwXHhkZFx4ZmFceDE3XHgzNFx4NTFceDZlXHg4YiIKKwkJCSJceGE4XHhjNVx4ZTJceGZmXHgxY1x4MzlceDU2XHg3MyIKKwkJCSJceDkwXHhhZFx4Y2FceGU3XHgwNFx4MjFceDNlXHg1YiIKKwkJCSJceDc4XHg5NVx4YjJceGNmXHhlY1x4MDlceDI2XHg0MyIKKwkJCSJceDYwXHg3ZFx4OWFceGI3XHhkNFx4ZjFceDBlXHgyYiIKKwkJCSJceDQ4XHg2NVx4ODJceDlmXHhiY1x4ZDlceGY2XHgxMyIKKwkJCSJceDMwXHg0ZFx4NmFceDg3XHhhNFx4YzFceGRlXHhmYiIKKwkJCSJceDE4XHgzNVx4NTJceDZmXHg4Y1x4YTlceGM2XHhlMyIKKwkJCSJceDAwXHgxZlx4M2VceDVkXHg3Y1x4OWJceGJhXHhkOSIKKwkJCSJceGY4XHgxN1x4MzZceDU1XHg3NFx4OTNceGIyXHhkMSIKKwkJCSJceGYwXHgwZlx4MmVceDRkXHg2Y1x4OGJceGFhXHhjOSIKKwkJCSJceGU4XHgwN1x4MjZceDQ1XHg2NFx4ODNceGEyXHhjMSIKKwkJCSJceGUwXHhmZlx4MWVceDNkXHg1Y1x4N2JceDlhXHhiOSIKKwkJCSJceGQ4XHhmN1x4MTZceDM1XHg1NFx4NzNceDkyXHhiMSIKKwkJCSJceGQwXHhlZlx4MGVceDJkXHg0Y1x4NmJceDhhXHhhOSIKKwkJCSJceGM4XHhlN1x4MDZceDI1XHg0NFx4NjNceDgyXHhhMSIKKwkJCSJceGMwXHhkZlx4ZmVceDFkXHgzY1x4NWJceDdhXHg5OSIKKwkJCSJceGI4XHhkN1x4ZjZceDE1XHgzNFx4NTNceDcyXHg5MSIKKwkJCSJceGIwXHhjZlx4ZWVceDBkXHgyY1x4NGJceDZhXHg4OSIKKwkJCSJceGE4XHhjN1x4ZTZceDA1XHgyNFx4NDNceDYyXHg4MSIKKwkJCSJceGEwXHhiZlx4ZGVceGZkXHgxY1x4M2JceDVhXHg3OSIKKwkJCSJceDk4XHhiN1x4ZDZceGY1XHgxNFx4MzNceDUyXHg3MSIKKwkJCSJceDkwXHhhZlx4Y2VceGVkXHgwY1x4MmJceDRhXHg2OSIKKwkJCSJceDg4XHhhN1x4YzZceGU1XHgwNFx4MjNceDQyXHg2MSIKKwkJCSJceDgwXHg5Zlx4YmVceGRkXHhmY1x4MWJceDNhXHg1OSIKKwkJCSJceDc4XHg5N1x4YjZceGQ1XHhmNFx4MTNceDMyXHg1MSIKKwkJCSJceDcwXHg4Zlx4YWVceGNkXHhlY1x4MGJceDJhXHg0OSIKKwkJCSJceDY4XHg4N1x4YTZceGM1XHhlNFx4MDNceDIyXHg0MSIKKwkJCSJceDYwXHg3Zlx4OWVceGJkXHhkY1x4ZmJceDFhXHgzOSIKKwkJCSJceDU4XHg3N1x4OTZceGI1XHhkNFx4ZjNceDEyXHgzMSIKKwkJCSJceDUwXHg2Zlx4OGVceGFkXHhjY1x4ZWJceDBhXHgyOSIKKwkJCSJceDQ4XHg2N1x4ODZceGE1XHhjNFx4ZTNceDAyXHgyMSIKKwkJCSJceDQwXHg1Zlx4N2VceDlkXHhiY1x4ZGJceGZhXHgxOSIKKwkJCSJceDM4XHg1N1x4NzZceDk1XHhiNFx4ZDNceGYyXHgxMSIKKwkJCSJceDMwXHg0Zlx4NmVceDhkXHhhY1x4Y2JceGVhXHgwOSIKKwkJCSJceDI4XHg0N1x4NjZceDg1XHhhNFx4YzNceGUyXHgwMSIKKwkJCSJceDIwXHgzZlx4NWVceDdkXHg5Y1x4YmJceGRhXHhmOSIKKwkJCSJceDE4XHgzN1x4NTZceDc1XHg5NFx4YjNceGQyXHhmMSIKKwkJCSJceDEwXHgyZlx4NGVceDZkXHg4Y1x4YWJceGNhXHhlOSIKKwkJCSJceDA4XHgyN1x4NDZceDY1XHg4NFx4YTNceGMyXHhlMSIKKwkJCSJceDAwXHgyMVx4NDJceDYzIiwKKwkJLmlsZW4gPSA0MTAwLAorCQkucmVzdWx0ID0KKwkJCSJceGI1XHg4MVx4ZjVceDY0XHgxOFx4NzNceGUzXHhmMCIKKwkJCSJceDRjXHgxM1x4ZjJceDc3XHgxOFx4NjBceDY1XHg1ZSIKKwkJCSJceDI5XHgwMVx4Y2VceDk4XHg1NVx4NTNceGY5XHgwYyIKKwkJCSJceDJhXHgwOFx4ZDVceDA5XHhiM1x4NTdceDU1XHg1NiIKKwkJCSJceGM1XHhlOVx4NTZceDkwXHhjYlx4NmFceGEzXHhjMCIKKwkJCSJceGZmXHhjNFx4NzlceGI0XHhkMlx4OTdceDVkXHhjNCIKKwkJCSJceDQzXHhkMVx4ZmVceDk0XHg3Ylx4ODhceDA2XHg1YSIKKwkJCSJceGIyXHg5ZVx4MmNceGZjXHg0NFx4MDNceGI3XHg5MCIKKwkJCSJceGEwXHhjMVx4YmFceDZhXHgzM1x4YjhceGM3XHhiMiIKKwkJCSJceDlkXHhlMVx4MTJceDRmXHhjMFx4NjRceGQ0XHgwMSIKKwkJCSJceGZlXHg4Y1x4N2FceDY2XHhmN1x4ZTZceDVhXHg5MSIKKwkJCSJceGJiXHhkZVx4NTZceDg2XHhhYlx4NjVceDIxXHgzMCIKKwkJCSJceDAwXHg4NFx4NjVceDI0XHhhNVx4N2RceDg1XHhiNCIKKwkJCSJceGUzXHgxN1x4ZWRceDNhXHhiN1x4NmZceGI0XHgwYiIKKwkJCSJceDBiXHhhZlx4MTVceGFlXHg1YVx4OGZceGYyXHgwYyIKKwkJCSJceDJmXHgyN1x4ZjRceDA5XHhkOFx4ZDJceDk2XHhiNyIKKwkJCSJceDcxXHhmMlx4YzVceDk5XHg0ZFx4N2VceDdmXHg3NSIKKwkJCSJceDc3XHg4OVx4MzBceDhiXHg1OVx4ZGJceGEyXHhiMiIKKwkJCSJceGEwXHhmM1x4MTlceDM5XHgyYlx4YzVceDdlXHgzZiIKKwkJCSJceDRmXHhkOVx4ZDNceDU2XHgyOFx4OTdceDQ0XHhkYyIKKwkJCSJceGMwXHg4Ylx4NzdceDI0XHhkOVx4NTJceGU3XHhjNSIKKwkJCSJceGFmXHhmNlx4N2RceDU5XHhiMlx4NDRceDA1XHgxZCIKKwkJCSJceGIxXHhiMFx4MTFceGE1XHgwZlx4ZWNceDMzXHhlMSIKKwkJCSJceDZkXHgxYlx4NGVceDFmXHhmZlx4NTdceDkxXHhiNCIKKwkJCSJceDViXHg5YVx4OTZceGM1XHg1M1x4YmNceGFlXHgyMCIKKwkJCSJceDNjXHhiYlx4MTRceGUyXHhlOFx4MjJceDMzXHhjMSIKKwkJCSJceDVlXHg3Nlx4OWVceDQ2XHg5OVx4ZjZceDJhXHgxNSIKKwkJCSJceGM2XHg5N1x4MDJceGEwXHg2Nlx4NDNceGQxXHhhNiIKKwkJCSJceDMxXHhhNlx4OWZceGZiXHhmNFx4ZDNceDY5XHhlNSIKKwkJCSJceGNkXHg3Nlx4OTVceGI4XHg3YVx4ODJceDdmXHgyMSIKKwkJCSJceDQ1XHhmZlx4M2ZceGNlXHg1NVx4ZjZceDk1XHgxMCIKKwkJCSJceDA4XHg3N1x4MTBceDQzXHhjNlx4ZjNceDA5XHhlNSIKKwkJCSJceDY4XHhlN1x4M2NceGFkXHgwMFx4NTJceDQ1XHgwZCIKKwkJCSJceGZlXHgyZFx4YzZceGMyXHg5NFx4OGNceDEyXHgxZCIKKwkJCSJceGU2XHgyNVx4YWVceDk4XHgxMlx4OGVceDE5XHg5YyIKKwkJCSJceDgxXHg2OFx4YjFceDExXHhmNlx4NjlceGRhXHhlMyIKKwkJCSJceDYyXHgwOFx4MThceDdhXHgyNVx4NDlceDI4XHhhYyIKKwkJCSJceGJhXHg3MVx4MTJceDBiXHhlNFx4YTJceGU1XHhjNyIKKwkJCSJceDVkXHg4ZVx4ZWNceDQ5XHg0MFx4MjFceGJmXHg1YSIKKwkJCSJceDk4XHhmM1x4MDJceDY4XHg1NVx4MDNceDdmXHg4YSIKKwkJCSJceGU1XHg5NFx4MGNceDMyXHg1Y1x4MDdceDgyXHg2MyIKKwkJCSJceGFmXHg2Zlx4OTFceDQwXHg4NFx4OGVceDUyXHgyNSIKKwkJCSJceGQwXHhiMFx4MjlceDUzXHgwNVx4ZTJceDUwXHg3YSIKKwkJCSJceDM0XHhlYlx4YzlceDQ2XHgyMFx4YThceDNkXHhkZSIKKwkJCSJceDdmXHgxNlx4NWZceDM2XHhjNVx4MmVceGRjXHhkMSIKKwkJCSJceDE1XHg0N1x4YzdceDUwXHg0MFx4NmRceDkxXHhjNSIKKwkJCSJceGU3XHg5M1x4OTVceDFhXHhkM1x4NTdceGJjXHg1MiIKKwkJCSJceDMzXHhlZVx4MTRceDE5XHgyMlx4NTJceDg5XHhhNyIKKwkJCSJceDRhXHgyNVx4NTZceDc3XHg0Ylx4Y2FceGNmXHgwYSIKKwkJCSJceGUxXHhmNVx4MzVceDg1XHgzMFx4N2VceDU5XHg0YSIKKwkJCSJceGJkXHgxNFx4NWJceGRmXHhlM1x4NDZceGNiXHhhYyIKKwkJCSJceDFmXHg2Y1x4OTZceDBlXHhmNFx4ODFceGQxXHg5OSIKKwkJCSJceGNhXHg4OFx4NjNceDNkXHgwMlx4NThceDZiXHhhOSIKKwkJCSJceGU1XHg5Zlx4YjNceDAwXHhiMlx4NTRceGM2XHg3NCIKKwkJCSJceDFjXHhiZlx4NDZceGFiXHg5N1x4Y2NceGY4XHg1NCIKKwkJCSJceDA0XHgwN1x4MDhceDUyXHhlNlx4YzBceGRhXHg5MyIKKwkJCSJceDc0XHg3ZFx4OTNceDk5XHg1ZFx4NzhceDY4XHhhNiIKKwkJCSJceDJlXHg2Ylx4ZDNceDZhXHg2OVx4Y2NceDEyXHg2YiIKKwkJCSJceGQ0XHhjN1x4YTVceGM2XHhlN1x4ZjZceDAzXHgwNCIKKwkJCSJceDVkXHhjZFx4NjFceDVlXHgxN1x4NDBceGRjXHhkMSIKKwkJCSJceDVjXHhmNVx4MDhceGRmXHg1Y1x4OTBceDg1XHhhNCIKKwkJCSJceGFmXHhmNlx4NzhceGJiXHgwZFx4ZjFceGY0XHhhNCIKKwkJCSJceDU0XHgyNlx4NzJceDllXHg2MVx4ZmFceDg2XHhjZiIKKwkJCSJceGU4XHg5ZVx4YTFceGUwXHhjN1x4NDhceDIzXHhhZSIKKwkJCSJceDVhXHg5MFx4YWVceDc1XHgwYVx4NzRceDE4XHg4OSIKKwkJCSJceDA1XHhiMVx4OTJceGIyXHg3Zlx4ZDBceDFiXHhhNiIKKwkJCSJceDYyXHgwN1x4MjVceDAxXHhjN1x4YzJceDRmXHhmOSIKKwkJCSJceGU4XHhmZVx4NjNceDk1XHg4MFx4MDdceGI0XHgyNiIKKwkJCSJceGNjXHhkMVx4MjZceGI2XHhjNFx4M2ZceDllXHhjYiIKKwkJCSJceDhlXHgzYlx4MmVceDQ0XHgxNlx4ZDNceDEwXHg5YSIKKwkJCSJceDk1XHgwOFx4ZWJceGM4XHhjYlx4ZWJceGJmXHg2ZiIKKwkJCSJceDBiXHhjZFx4MWZceGM4XHhjYVx4ODZceGFhXHhlYyIKKwkJCSJceDMzXHhlNlx4NjlceGY0XHg0NVx4MjVceDg2XHgzYSIKKwkJCSJceDIyXHg5NFx4NGZceDAwXHgyM1x4NmFceDQ0XHhjMiIKKwkJCSJceDQ5XHg5N1x4MzNceGFiXHgzNlx4MTRceDBhXHg3MCIKKwkJCSJceDI0XHhjM1x4YmVceDA0XHgzYlx4NzlceGEwXHhmOSIKKwkJCSJceGI4XHhlN1x4NzZceDI5XHgyMlx4ODNceGQ3XHhmMiIKKwkJCSJceDk0XHhmNFx4NDFceDQ5XHhiYVx4NWZceDdiXHgwNyIKKwkJCSJceGI1XHhmYlx4ZGJceDAzXHgxYVx4OWZceGI2XHg0YyIKKwkJCSJceGMyXHgyZVx4MzdceDQwXHg0OVx4YzNceDM4XHgxNiIKKwkJCSJceGUyXHg0Zlx4NzdceDgyXHhiMFx4NjhceDRjXHg3MSIKKwkJCSJceDFkXHg1N1x4NjFceDljXHhkOVx4NGVceDU0XHg5OSIKKwkJCSJceDQ3XHgxM1x4MjhceDczXHgzY1x4YmJceDAwXHg5MCIKKwkJCSJceGYzXHg0ZFx4YzlceDBlXHhmZFx4ZTdceGIxXHg3MSIKKwkJCSJceGQzXHgxNVx4NzlceGJmXHhjY1x4MjZceDJmXHhiZCIKKwkJCSJceGFkXHg2Y1x4NTBceDY5XHg2Y1x4M2VceDZkXHg4MCIKKwkJCSJceDlhXHhlYVx4NzhceGFmXHgxOVx4YjJceDBkXHg0ZCIKKwkJCSJceGFkXHgwNFx4MDdceGFlXHgyMlx4OTBceDRhXHg5MyIKKwkJCSJceDMyXHgwZVx4MzZceDliXHgxYlx4NDZceGJhXHgzYiIKKwkJCSJceGI0XHhhY1x4YzZceGQxXHhhMlx4MzFceDUzXHgzYiIKKwkJCSJceDJhXHgzZFx4NDVceGZlXHgwM1x4NjFceDEwXHg4NSIKKwkJCSJceDE3XHg2OVx4YTZceDc4XHhjY1x4NmNceDg3XHg0OSIKKwkJCSJceDUzXHhmOVx4ODBceDEwXHhkZVx4ODBceGEyXHg0MSIKKwkJCSJceDZhXHhjM1x4MzJceDAyXHhhZFx4NmRceDNjXHg1NiIKKwkJCSJceDAwXHg3MVx4NTFceDA2XHhhN1x4YmRceGZiXHhlZiIKKwkJCSJceDNjXHhiNVx4OWZceGZjXHg0OFx4N2RceDUzXHg3YyIKKwkJCSJceDY2XHhiMFx4NDlceDIzXHhjNFx4NDdceDEwXHgwZSIKKwkJCSJceGU1XHg2Y1x4NzRceDEzXHhlNlx4YzVceDNmXHhhYSIKKwkJCSJceGRlXHhmZlx4MDdceDQ0XHhkZFx4NTZceDFiXHhhZCIKKwkJCSJceDA5XHg3N1x4ZmJceDViXHgxMlx4YjhceDBkXHgzOCIKKwkJCSJceDE3XHgzN1x4MzVceDdiXHg5Ylx4YmNceGZlXHhkNCIKKwkJCSJceDdlXHg4Ylx4ZGFceDdlXHg1Ylx4MDRceGE3XHgyMiIKKwkJCSJceGE3XHgzMVx4YTFceDIwXHg4Nlx4YzdceDFiXHg5OSIKKwkJCSJceGRiXHhkMVx4ODlceGY0XHg5NFx4YTNceDUzXHg2OSIKKwkJCSJceDhkXHhlN1x4ZThceDc0XHgxMVx4OGRceDc0XHhkNiIKKwkJCSJceDA3XHgzN1x4OTFceDlmXHhmZFx4NjdceDUwXHgzYSIKKwkJCSJceGM5XHhlMVx4ZjRceDM2XHhkNVx4YTBceDQ3XHhkMSIKKwkJCSJceGY5XHhlNVx4MzlceGEzXHgzMVx4YWNceDA3XHgzNiIKKwkJCSJceDIzXHhmOFx4NjZceDE4XHgxNFx4MjhceDM0XHgwZiIKKwkJCSJceGI4XHhkMFx4ZTdceDI5XHhiM1x4MDRceDRiXHg1NSIKKwkJCSJceDAxXHg0MVx4YjJceDc1XHg4ZFx4Y2JceDk2XHg4NSIKKwkJCSJceDNhXHhmYlx4YWJceDJiXHg5ZVx4ZmFceDU4XHgyMCIKKwkJCSJceDQ0XHgxZlx4YzBceDE0XHgyMlx4NzVceDYxXHhlOCIKKwkJCSJceGFhXHgxOVx4Y2ZceGYxXHg4Mlx4NTZceGY0XHhkNyIKKwkJCSJceDc4XHg3Ylx4M2RceDVmXHhiM1x4OWVceDBiXHg4YSIKKwkJCSJceDU3XHg1MFx4ZGJceDE3XHg0MVx4NjVceDRkXHhhMyIKKwkJCSJceDAyXHhjOVx4OWNceDljXHg1M1x4ZmJceDM5XHgzOSIKKwkJCSJceDliXHgxZFx4NzJceDI0XHhkYVx4YjdceDM5XHhiZSIKKwkJCSJceDEzXHgzYlx4ZmFceDI5XHhkYVx4OWVceDU0XHg2NCIKKwkJCSJceDZlXHhiYVx4ZDhceGExXHhjYlx4YjNceDM2XHhmYSIKKwkJCSJceGNiXHg0N1x4ODVceGU5XHg2MVx4MzhceGJjXHhiZSIKKwkJCSJceGM1XHgwMFx4MzhceDJhXHg1NFx4ZjdceGM0XHhiOSIKKwkJCSJceGIzXHhkM1x4N2JceGEwXHhhMFx4ZjhceDcyXHg3ZiIKKwkJCSJceDhjXHg4ZVx4ODJceDBlXHhjNlx4MWNceDc1XHg5ZCIKKwkJCSJceGNhXHg4ZVx4NjFceDg3XHhkZVx4YWRceDgwXHhkMiIKKwkJCSJceGY1XHhmOVx4ODBceGVmXHgxNVx4NzVceGFmXHhmNSIKKwkJCSJceDgwXHhmYlx4ZmZceDZkXHgxZVx4MjVceGI3XHg0MCIKKwkJCSJceDYxXHg2YVx4MzlceDVhXHg2YVx4YjVceDMxXHhhYiIKKwkJCSJceDk3XHg4YVx4MTlceDg5XHg0NFx4NDBceGMwXHhhNiIKKwkJCSJceGI0XHg0ZVx4MzBceDMyXHg3Ylx4MTNceGU3XHg2NyIKKwkJCSJceGE5XHg4Ylx4NTdceDA0XHhjMlx4MDFceGE2XHhmNCIKKwkJCSJceDI4XHg5OVx4YWRceDJjXHg3Nlx4YTNceDc4XHhjMiIKKwkJCSJceDRhXHhlNlx4Y2FceDVjXHg1MFx4NmFceGMxXHhiMCIKKwkJCSJceDYyXHg0Ylx4MTBceDhlXHg3Y1x4MTdceDQzXHhiMyIKKwkJCSJceDE3XHg2Nlx4MWNceDNlXHg4ZFx4NjlceGYwXHg1YSIKKwkJCSJceDcxXHhmNVx4OTdceGRjXHhkMVx4NDVceGRkXHgyOCIKKwkJCSJceGYzXHg1ZFx4ZGZceDUzXHg3Ylx4MTFceGU1XHhiYyIKKwkJCSJceDRjXHhkYlx4MWJceDUxXHg2Ylx4ZTlceGZiXHgzZCIKKwkJCSJceGMxXHhjM1x4MmNceGI5XHg3MVx4ZjVceGI2XHhiMiIKKwkJCSJceDEzXHgzNlx4NzlceDgwXHg1M1x4ZThceGQzXHhhNiIKKwkJCSJceDBhXHhhZlx4ZmRceDU2XHg5N1x4ZjdceDQwXHg4ZSIKKwkJCSJceDQ1XHhjZVx4ZjhceGIwXHg5ZVx4NWNceDMzXHg4MiIKKwkJCSJceGIwXHg0NFx4NTZceGZjXHgwNVx4MDlceGU5XHgyYSIKKwkJCSJceGFjXHgyNlx4ODBceDE0XHgxZFx4YzhceDNhXHgzNSIKKwkJCSJceDRjXHg4Mlx4OTdceGZkXHg3Nlx4YjdceGE5XHgwYSIKKwkJCSJceDM1XHg1OFx4NzlceDhlXHgwZlx4NjZceGVhXHhhZiIKKwkJCSJceDUxXHg2Y1x4MDlceGE5XHg2ZVx4OWJceGNiXHg5YSIKKwkJCSJceDMxXHg0N1x4YTBceDJmXHg3Y1x4NzFceGI0XHg0YSIKKwkJCSJceDExXHhhYVx4OGNceDY2XHhjNVx4NjRceGU2XHgzYSIKKwkJCSJceDU0XHhkYVx4MjRceDZhXHhjNFx4NDFceDY1XHg0NiIKKwkJCSJceDgyXHhhMFx4MGFceDBmXHg1Zlx4ZmJceDI1XHhkMCIKKwkJCSJceDJjXHg5MVx4YTdceGVlXHhjNFx4ODFceDA3XHg4NiIKKwkJCSJceDc1XHg1ZVx4MzNceDY5XHg5N1x4ZTRceDJjXHhhOCIKKwkJCSJceDlkXHg5Zlx4MGJceDZhXHhiZVx4YWRceDk4XHhkYSIKKwkJCSJceDZkXHg5NFx4NDFceGRhXHgyY1x4MWVceDg5XHhjNCIKKwkJCSJceGMyXHhhZlx4MWVceDAwXHgwNVx4MGJceDgzXHg2MCIKKwkJCSJceGJkXHg0M1x4ZWFceDE1XHgyM1x4N2ZceGI5XHhhYyIKKwkJCSJceGVlXHg0Zlx4MmNceGFmXHgyYVx4ZjNceGRmXHhkMCIKKwkJCSJceGYzXHgxOVx4MzFceGJiXHg0YVx4NzRceDg0XHgxNyIKKwkJCSJceDUyXHgzMlx4MmNceDdkXHg2MVx4ZTRceGNiXHhlYiIKKwkJCSJceDgwXHgzOFx4MTVceDUyXHhjYlx4NmZceGVhXHhlNSIKKwkJCSJceDczXHg5Y1x4ZDlceDI0XHg2OVx4YzZceDk1XHgzMiIKKwkJCSJceDIxXHhjOFx4MTFceGU0XHhkY1x4MzZceGQ3XHg5MyIKKwkJCSJceDM4XHg2Nlx4ZmJceGIyXHg3Zlx4M2FceGI5XHhhZiIKKwkJCSJceDMxXHhkZFx4OTNceDc1XHg3OFx4OGFceDJjXHg5NCIKKwkJCSJceDg3XHgxYVx4NThceGVjXHg5ZVx4N2RceDRkXHhiYSIKKwkJCSJceGUxXHhlNVx4NGRceGZjXHhiY1x4YTRceDJhXHgxNCIKKwkJCSJceGVmXHhjY1x4YTdceGVjXHhhYlx4NDNceDA5XHgxOCIKKwkJCSJceGQzXHhhYlx4NjhceGQxXHgwN1x4OTlceDQ0XHg0NyIKKwkJCSJceGQ2XHg4M1x4ODVceDNiXHgzMFx4ZWFceGE5XHg2YiIKKwkJCSJceDYzXHhlYVx4YzRceDA3XHhmYlx4NDNceDJmXHhhNCIKKwkJCSJceGFhXHhiMFx4YWJceDAzXHg4OVx4Y2VceDNmXHg4YyIKKwkJCSJceDAyXHg3Y1x4ODZceDU0XHhiY1x4ODhceGFmXHg3NSIKKwkJCSJceGQyXHhkY1x4NjNceDE3XHhkM1x4MjZceGY2XHg5NiIKKwkJCSJceGE5XHgzY1x4ZjFceDYxXHg4Y1x4MTFceDE4XHhjYyIKKwkJCSJceGQ2XHhlYVx4NWJceGUyXHhjZFx4ZjBceGYxXHhiMiIKKwkJCSJceGU1XHgzNVx4OTBceDFmXHg4NVx4NGNceDc2XHg1YiIKKwkJCSJceDY2XHhjZVx4NDRceGE0XHgzMlx4OWZceGU2XHg3YiIKKwkJCSJceDcxXHg2ZVx4OWZceDU4XHgxNVx4NjdceDcyXHg4NyIKKwkJCSJceDY0XHg4ZVx4M2FceDQ0XHg0NVx4ZDRceDc2XHhmYSIKKwkJCSJceGMyXHhmNlx4ZWZceDg1XHgwNVx4MThceDdhXHg5YiIKKwkJCSJceGJhXHg0MVx4NTRceGFjXHhmMFx4ZmNceDU5XHgxMiIKKwkJCSJceDNmXHhkZlx4YTBceGU1XHg4YVx4NjVceGZkXHgzYSIKKwkJCSJceDYyXHg4ZFx4ODNceDJjXHgwM1x4YmVceDA1XHg3NiIKKwkJCSJceDJlXHg1M1x4NDlceDk3XHg5NFx4MzNceGFlXHg0MCIKKwkJCSJceDgxXHgxNVx4ZGJceDZlXHhhZFx4YWFceGY1XHg0YiIKKwkJCSJceGUzXHg5OFx4NzBceGRmXHhlMFx4N2NceGNkXHhkYiIKKwkJCSJceDAyXHhkNFx4N2RceDJmXHhjMVx4ZTZceGI0XHhmMyIKKwkJCSJceGQ3XHgwZFx4N2FceGQ5XHgyM1x4OWVceDg3XHgyZCIKKwkJCSJceGNlXHg4N1x4YWRceGNjXHg3Mlx4MDVceDAwXHgyOSIKKwkJCSJceGRjXHg3M1x4N2ZceDY0XHhjMVx4MTVceDBlXHhjMiIKKwkJCSJceGRmXHhhN1x4NWZceGViXHg0MVx4YTFceGNkXHhlZiIKKwkJCSJceDVjXHg1MFx4NzlceDJhXHg1Nlx4NTZceDcxXHg4YyIKKwkJCSJceGFjXHhjMFx4NzlceDUwXHg2OVx4Y2FceDU5XHgzMiIKKwkJCSJceDY1XHhmMlx4NTRceGU0XHg1Mlx4MzhceDc2XHhkMSIKKwkJCSJceDVlXHhkZVx4MjZceDllXHhmYlx4NzVceDJlXHgxMSIKKwkJCSJceGI1XHgxMFx4ZjRceDE3XHg3M1x4ZjVceDg5XHhjNyIKKwkJCSJceDRmXHg0M1x4NWNceDhlXHg3Y1x4YjlceDA1XHg1MiIKKwkJCSJceDI0XHg0MFx4OTlceGZlXHg5Ylx4ODVceDBiXHg2YyIKKwkJCSJceDIyXHgzZVx4OGJceGFlXHg4Nlx4YTFceGQyXHg3OSIKKwkJCSJceDA1XHg2OFx4NmJceGFiXHhlM1x4NDFceDQ5XHhlZCIKKwkJCSJceDE1XHhhMVx4OGRceDQwXHgyZFx4NjFceGRmXHgxYSIKKwkJCSJceDU5XHhjOVx4MjZceDhiXHhlZlx4MzBceDRjXHg4OCIKKwkJCSJceDRiXHgxMFx4ZjhceDhkXHhhNlx4OTJceDlmXHg0YiIKKwkJCSJceGYzXHhjNFx4NTNceDBiXHg4OVx4NWRceDI4XHg5MiIKKwkJCSJceGNmXHg3OFx4YjJceGMwXHg1ZFx4ZWRceDdlXHhmYyIKKwkJCSJceGMwXHgxMlx4MjNceDVmXHg1YVx4NzhceDg2XHg0MyIKKwkJCSJceDZlXHgyN1x4ZjdceDVhXHhhN1x4NmFceGVkXHgxOSIKKwkJCSJceDA0XHhmMFx4YjNceDEyXHhkMVx4YmRceDBlXHg4OSIKKwkJCSJceDZlXHhiY1x4OTZceGE4XHhkOFx4NDlceDM5XHg5ZiIKKwkJCSJceDdlXHg2N1x4ZjBceDJlXHgzZVx4MDFceGE5XHhiYSIKKwkJCSJceGVjXHg4Ylx4NjJceDhlXHhjYlx4NGFceDcwXHg0MyIKKwkJCSJceGM3XHhjMlx4YzRceGNhXHg4Mlx4MDNceDczXHhlOSIKKwkJCSJceDExXHhkZlx4Y2ZceDU0XHhlYVx4YzlceGIwXHg5NSIKKwkJCSJceDUxXHhjMFx4MTNceDNkXHg5Mlx4MDVceGZhXHhmNCIKKwkJCSJceGE5XHgzNFx4YzhceGNlXHg2Y1x4M2RceDU0XHhjYyIKKwkJCSJceGM0XHhhZlx4ZjFceGRjXHgxMVx4NDRceDI2XHhhMiIKKwkJCSJceGFmXHhmMVx4ODVceDc1XHg3ZFx4MDNceDYxXHg2OCIKKwkJCSJceDRlXHg3OFx4YzZceDkyXHg3ZFx4ODZceDdkXHg3NyIKKwkJCSJceGRjXHg3MVx4NzJceGRiXHhjNlx4YWVceGExXHhjYiIKKwkJCSJceDcwXHg5YVx4MGJceDE5XHhiZVx4NGFceDZjXHgyYSIKKwkJCSJceGUyXHhiYVx4NmNceDY0XHg5YVx4MTNceDI4XHhkZiIKKwkJCSJceDg1XHg3NVx4ZTZceDQzXHhmNlx4ODdceDA4XHg2OCIKKwkJCSJceDZlXHhiYVx4NmVceDc5XHg5Zlx4MDRceGJjXHgyMyIKKwkJCSJceDUwXHhmNlx4MzNceDVjXHgxZlx4MjRceDI1XHhiZSIKKwkJCSJceDMzXHg0N1x4ODBceDQ1XHg1Nlx4YTNceGE3XHhkNyIKKwkJCSJceDdhXHhiMVx4MzRceDBiXHg5MFx4M2NceDljXHhhZCIKKwkJCSJceDQ0XHg1Zlx4OWVceDBlXHg5ZFx4ZDRceGJkXHg5MyIKKwkJCSJceDVlXHhmYVx4M2NceGUwXHhiMFx4ZDlceGVkXHhmMyIKKwkJCSJceGQ2XHgyZVx4ZmZceDI0XHhkOFx4NzFceDZjXHhlZCIKKwkJCSJceGFmXHg1NVx4ZWJceDIyXHhhY1x4OTNceDY4XHgzMiIKKwkJCSJceDA1XHg1Ylx4NDdceGRkXHhjNlx4NGFceGNiXHhjNyIKKwkJCSJceDEwXHhlMVx4M2NceDkyXHgxYVx4ZjNceDIzXHg3OCIKKwkJCSJceDJiXHhhMVx4ZDJceDgwXHhmNFx4MTJceGIxXHgyMCIKKwkJCSJceDhmXHhmZlx4MjZceDM1XHhkZFx4ZmJceGM3XHg0ZSIKKwkJCSJceDc4XHhmMVx4MmRceDUwXHgxMlx4NzdceGE4XHg2MCIKKwkJCSJceDdjXHgwZlx4ZjVceDE2XHgyZlx4NjNceDcwXHgyYSIKKwkJCSJceGMwXHg5Nlx4ODBceDRlXHgwYVx4YjRceDkzXHgzNSIKKwkJCSJceDVkXHgxZFx4M2ZceDU2XHhmN1x4MmZceGJiXHg5MCIKKwkJCSJceDExXHgxNlx4OGZceGEyXHhlY1x4NDdceGJlXHhhYyIKKwkJCSJceDU2XHgwMVx4MjZceDU2XHhiMVx4OGNceGIyXHgxMCIKKwkJCSJceGY5XHgxYVx4Y2FceGY1XHhkMVx4YjdceDM5XHgyMCIKKwkJCSJceDYzXHhmMVx4NjlceDIwXHg0Zlx4MTNceDEyXHgxZiIKKwkJCSJceDViXHg2NVx4ZmNceDk4XHhmN1x4YzRceDdhXHhiZSIKKwkJCSJceGY3XHgyNlx4NGRceDJiXHg4NFx4N2JceDQyXHhhZCIKKwkJCSJceGQ4XHg3YVx4MGFceGI0XHhkOFx4NzRceGJmXHhjMSIKKwkJCSJceGYwXHg2ZVx4YjRceDI5XHhhM1x4YmJceGNhXHg0NiIKKwkJCSJceDY3XHg3MFx4NmFceDJkXHhjZVx4MGVceGEyXHg4YSIKKwkJCSJceGE5XHg4N1x4YmZceDA1XHhjNFx4YzFceDA0XHhhMyIKKwkJCSJceGFiXHhkNFx4NDVceDQzXHg4Y1x4YjZceDAyXHhiMCIKKwkJCSJceDQxXHhjOFx4ZmNceDQ0XHgzZFx4NTlceGFhXHgyZSIKKwkJCSJceDQ0XHgyMVx4MmFceDhkXHg4OFx4OWRceDU3XHhmNCIKKwkJCSJceGEwXHgwMlx4NzdceGI4XHhhNlx4YTBceGU2XHg3NSIKKwkJCSJceDVjXHg4Mlx4NjVceDNlXHgwM1x4NWNceDI5XHg4ZiIKKwkJCSJceDM4XHg1NVx4YWJceDMzXHgyNlx4ZWZceDlmXHg0MyIKKwkJCSJceDUyXHhmZFx4NjhceGFmXHgzNlx4YjRceGJiXHg5YSIKKwkJCSJceDU4XHgwOVx4MDlceDFiXHhjM1x4NjVceDQ2XHg0NiIKKwkJCSJceDFkXHhhN1x4OTRceDE4XHgyM1x4NTBceDJjXHhjYSIKKwkJCSJceDJjXHg1NVx4MTlceDk3XHgwMVx4OWRceDkzXHgzYiIKKwkJCSJceDYzXHg4Nlx4ZjJceDAzXHg2N1x4NDVceGQyXHg3MiIKKwkJCSJceDI4XHg1Mlx4NmNceGY0XHhlM1x4MWNceGI1XHgxMSIKKwkJCSJceDEzXHhmMVx4ZWJceDIxXHhjN1x4ZDlceDU2XHg4MiIKKwkJCSJceDJiXHg4Mlx4MzlceGJkXHg2OVx4NTRceGVkXHg2MiIKKwkJCSJceGMzXHhlMlx4ZGVceDczXHhkNFx4NmFceDEyXHhhZSIKKwkJCSJceDEzXHgyMVx4N2ZceDRiXHg1Ylx4ZmNceGJmXHhlOCIKKwkJCSJceDJiXHhiZVx4NTZceGJhXHg2OFx4OGJceDlhXHhiMSIKKwkJCSJceDZlXHhmYVx4YmZceDdlXHg1YVx4NGJceGYxXHhhYyIKKwkJCSJceDk4XHg2NVx4ODVceGQxXHg5M1x4NTNceGQzXHg3YiIKKwkJCSJceDA5XHhkZFx4NGJceDEwXHg2ZFx4ODRceGIwXHgxMyIKKwkJCSJceDY1XHhiZFx4Y2ZceDUyXHgwOVx4YzRceDg1XHhlMiIKKwkJCSJceDg0XHg3NFx4MTVceDY1XHhiN1x4ZjdceDUxXHhhZiIKKwkJCSJceDU1XHhhZFx4YTRceGQxXHgyMlx4NTRceDcwXHg5NCIKKwkJCSJceGEwXHgxY1x4OTBceDQxXHhmZFx4OTlceGQ3XHg1YSIKKwkJCSJceDMxXHhlZlx4YWFceDI1XHhkMFx4N2ZceDRmXHhlYSIKKwkJCSJceDFkXHg1NVx4NDJceGU1XHg0OVx4YjBceGQwXHg0NiIKKwkJCSJceDYyXHgzNlx4NDNceGIyXHg4Mlx4MTVceDc1XHg1MCIKKwkJCSJceGE0XHg3Mlx4ZWJceDU0XHgyN1x4MWZceDhhXHhlNCIKKwkJCSJceDdkXHhlOVx4NjZceGM1XHhmMVx4NTNceGE0XHhkMSIKKwkJCSJceDBjXHhlYlx4YjhceGY4XHhiY1x4ZDRceGUyXHhlNyIKKwkJCSJceGUxXHhmOFx4NGJceGNiXHhhOVx4YTFceGFmXHgxNSIKKwkJCSJceDgzXHhjYlx4NzJceGQwXHgzM1x4NzlceDAwXHgyZCIKKwkJCSJceDlmXHhkN1x4ZjFceDJlXHgxZVx4MTBceGU0XHg0NSIKKwkJCSJceGMwXHg3NVx4M2FceDM5XHhlYVx4NjhceGY3XHg1ZCIKKwkJCSJceDFiXHg3M1x4OGZceGU5XHg4ZVx4MGZceDcyXHg0NyIKKwkJCSJceGFlXHgzNVx4MGFceDMxXHg3YVx4MTRceDRkXHg0YSIKKwkJCSJceDZmXHg0N1x4ZjdceDdlXHg5MVx4NmVceDc0XHg4YiIKKwkJCSJceDI2XHg0N1x4ZjlceGMzXHhmOVx4ZGVceDcwXHhmNSIKKwkJCSJceDYxXHhhYlx4YTlceDI3XHg5Zlx4ODJceGU0XHg5YyIKKwkJCSJceDg5XHg5MVx4M2ZceDJlXHg2YVx4ZmRceGI1XHg0OSIKKwkJCSJceGU5XHhmZFx4NTlceDE0XHgzNlx4NDlceDQwXHg2ZCIKKwkJCSJceDMyXHhkOFx4ODVceDQyXHhmM1x4YTVceGRmXHgwYyIKKwkJCSJceGE4XHgyN1x4ZDdceDU0XHhlMlx4NjNceDJmXHhmMiIKKwkJCSJceDdlXHg4Ylx4OGJceGU3XHhmMVx4OWFceDk1XHgzNSIKKwkJCSJceDQzXHhkY1x4M2FceGU0XHhiNlx4ZjRceGQwXHhkZiIKKwkJCSJceDljXHhjYlx4OTRceGYzXHgyMVx4YTBceDc3XHg1MCIKKwkJCSJceGUyXHhjNlx4YzRceGM2XHg1Zlx4MDlceDY0XHg1YiIKKwkJCSJceDkyXHg5MFx4ZDhceGUxXHhkMVx4ZWRceDRiXHg0MiIKKwkJCSJceGQ3XHgzN1x4YWZceDY1XHgzZFx4MTFceDM5XHhiNiIKKwkJCSJceDI0XHg4YVx4NjBceGFlXHhkNlx4MWVceGJmXHgwZSIKKwkJCSJceDBkXHhkN1x4ZGNceDk2XHgwZVx4NjVceDc1XHg0ZSIKKwkJCSJceDI5XHgwNlx4OWRceGE0XHg1MVx4M2FceDEwXHg2MyIKKwkJCSJceDhmXHgxN1x4MDdceGQ1XHg4ZVx4M2NceGY0XHgyOCIKKwkJCSJceDAwXHg1YVx4NWJceDA1XHgxOVx4ZDhceGMwXHg2YyIKKwkJCSJceGU1XHgxNVx4ZTRceDljXHg5ZFx4NzFceDlkXHg1ZSIKKwkJCSJceDk0XHgyOVx4MWFceGE3XHg4MFx4ZmFceDBlXHgzMyIKKwkJCSJceDAzXHhkZFx4YjdceDNlXHg5YVx4YTlceDI2XHgxOCIKKwkJCSJceDM3XHhhOVx4NjRceDA4XHg0ZFx4OTRceDVhXHg4OCIKKwkJCSJceGNhXHgzNVx4Y2VceDgxXHgwMlx4ZTNceDFmXHgxYiIKKwkJCSJceDg5XHgxYVx4NzdceDg1XHhlM1x4NDFceDZkXHgzMiIKKwkJCSJceDQyXHgxOVx4MjNceDdkXHhjOFx4NzNceGVlXHgyNSIKKwkJCSJceDg1XHgwZFx4ZjhceDMxXHgyNVx4NzlceDFiXHg2ZiIKKwkJCSJceDc5XHgyNVx4ZDJceGQ4XHhkNFx4MjNceGZkXHhmNyIKKwkJCSJceDgyXHgzNlx4NmFceDBjXHg0Nlx4MjJceDE1XHhlOSIKKwkJCSJceGZmXHg3Mlx4NDFceDkxXHg5MVx4N2RceDNhXHhiNyIKKwkJCSJceGRkXHg2NVx4OTlceDcwXHhmNlx4OGRceDg0XHhmOCIKKwkJCSJceDY3XHgxNVx4MjBceDExXHhkNlx4YjJceDU1XHg3YiIKKwkJCSJceGRiXHg4N1x4ZWVceGVmXHg1NVx4ODlceDJhXHg1OSIKKwkJCSJceDJiXHgwN1x4OGZceDQzXHg4YVx4NTlceDNjXHgwMSIKKwkJCSJceDhiXHg2NVx4NTRceGExXHg2Nlx4ZDVceDM4XHhiZCIKKwkJCSJceGM2XHgzMFx4YTlceGNjXHg0OVx4YjZceGE4XHgxYiIKKwkJCSJceGI4XHhjMFx4MGVceGUzXHg0NVx4MjhceGUyXHhmZiIKKwkJCSJceDQxXHg5Zlx4N2VceDdjXHhkMVx4YWVceDllXHgyNSIKKwkJCSJceDNmXHg0Y1x4N2NceDdjXHhmNFx4YThceDI2XHg0ZCIKKwkJCSJceDVjXHhmZFx4NGJceDI3XHgxOFx4ZjlceDYxXHg3NiIKKwkJCSJceDQ4XHhiYVx4MGNceDZiXHhhOVx4NGRceGZjXHhmNSIKKwkJCSJceDNiXHgzNVx4N2VceDJmXHg0YVx4YTlceGMyXHg5YSIKKwkJCSJceGFlXHhhYlx4ODZceDA5XHg4OVx4YzlceGMyXHg0MCIKKwkJCSJceDM5XHgyY1x4ODFceGIzXHhiOFx4MTdceDY3XHhjMiIKKwkJCSJceDBkXHgzMlx4NGFceDNhXHg2N1x4ODFceGQ3XHgxYSIKKwkJCSJceDM0XHg1Mlx4YzVceGRiXHgwYVx4ZjVceDYzXHgzOSIKKwkJCSJceGVhXHgxZlx4ZTFceDdjXHhhMVx4OWVceGMxXHgzNSIKKwkJCSJceGUzXHhiMVx4MThceDQ1XHg2N1x4ZjlceDIyXHgzOCIKKwkJCSJceDk1XHhkOVx4MzRceDM0XHg4Nlx4YzZceDQxXHg5NCIKKwkJCSJceDE1XHhmOVx4NWJceDQxXHhhNlx4ODdceDhiXHhmOCIKKwkJCSJceGQ1XHhlMVx4MWJceGUyXHg1Ylx4ZjNceDg2XHgxMCIKKwkJCSJceGZmXHhlNlx4YWVceDY5XHg3Nlx4YmNceDBkXHhiNCIKKwkJCSJceDA5XHg5MFx4MGNceGEyXHg2NVx4MGNceGFkXHg3NCIKKwkJCSJceGY1XHhkN1x4ZmZceGRhXHhjMVx4Y2VceDg1XHhiZSIKKwkJCSJceDAwXHhhN1x4ZmZceDRkXHgyZlx4NjVceGQzXHg4YyIKKwkJCSJceDg2XHgyZFx4MDVceGU4XHhlZFx4M2VceDZiXHg4YiIKKwkJCSJceDBmXHgzZFx4ODNceDhjXHhmMVx4MWRceDViXHg5NiIKKwkJCSJceDJlXHhiMVx4OWNceGMyXHg5OFx4ZTFceDcwXHhiOSIKKwkJCSJceGJhXHg1Y1x4OGFceDQzXHhkNlx4MzRceGE3XHgyZCIKKwkJCSJceGM5XHg5Mlx4YWVceGYyXHhhNVx4N2JceDA1XHg0OSIKKwkJCSJceGE3XHgzM1x4MzRceDg2XHhjYVx4ZTRceDk2XHgyMyIKKwkJCSJceDc2XHg1Ylx4ZjJceGM2XHhmMVx4NTFceDI4XHg0MiIKKwkJCSJceDdiXHhjY1x4NzZceDhmXHhmYVx4YTJceGFkXHgzMSIKKwkJCSJceGQ0XHhkNlx4N2FceDZkXHgyNVx4MjVceDU0XHhlNCIKKwkJCSJceDNmXHg1MFx4NTlceGUxXHg1Y1x4MDVceGI3XHgyNyIKKwkJCSJceDQ4XHhiZlx4MDdceGVjXHgxYlx4MTNceGJlXHgyYiIKKwkJCSJceGExXHg1N1x4MmJceGQ1XHhhYlx4ZDdceGQwXHg0YyIKKwkJCSJceDFlXHhjYlx4NzFceDliXHhjNVx4OTBceDg1XHhkMyIKKwkJCSJceGRlXHg1OVx4ZWNceDcxXHhlYlx4ODlceGJiXHhkMCIKKwkJCSJceDA5XHg1MFx4ZTFceDE2XHgzZlx4ZmRceDFjXHgzNCIKKwkJCSJceGMzXHgxY1x4YTFceDEwXHg3N1x4NTNceDk4XHhlZiIKKwkJCSJceGYyXHhmZFx4YTVceDAxXHg1OVx4YzJceDliXHgyNiIKKwkJCSJceGM3XHg0Mlx4ZDlceDQ5XHhkYVx4NThceDJiXHg2ZSIKKwkJCSJceDlmXHg1M1x4MTlceDc2XHg3ZVx4ZDlceGM5XHgwZSIKKwkJCSJceDY4XHhjOFx4N2ZceDUxXHgyMlx4NDJceGVmXHg0OSIKKwkJCSJceGE0XHg1NVx4YjZceDM2XHhhY1x4MDlceGM3XHgzMSIKKwkJCSJceDg4XHgxNVx4NGJceDJlXHg4Zlx4M2FceDA4XHhmNyIKKwkJCSJceGQ4XHhmN1x4YThceGM1XHhhOVx4MzNceGE2XHg0NSIKKwkJCSJceGU0XHhjNFx4OTRceDc2XHhmM1x4MGRceDhmXHg3ZSIKKwkJCSJceGM4XHhmNlx4YmNceDIzXHgwYVx4YjZceDRjXHhkMyIKKwkJCSJceDZhXHhjZFx4MzZceGMyXHg5MFx4NWNceDVjXHgzYyIKKwkJCSJceDY1XHg3Ylx4YzJceGQ2XHhjY1x4ZTZceDBkXHg4NyIKKwkJCSJceDczXHgyZVx4NzFceDc5XHgxNlx4MDZceDYzXHgyOCIKKwkJCSJceDA5XHgxNVx4ZDhceDg5XHgzOFx4MzhceDNkXHhiNSIKKwkJCSJceDQyXHgxY1x4MDhceDI0XHhmN1x4MmFceGQyXHg5ZCIKKwkJCSJceGM4XHhjYVx4ZWZceGY5XHgyN1x4ZDhceDA3XHg4NiIKKwkJCSJceGY3XHg0M1x4MGJceDU1XHgxNVx4M2ZceDlmXHg4MyIKKwkJCSJceGVmXHhkY1x4NDlceDlkXHgyYVx4YzFceDU0XHg2MiIKKwkJCSJceGJkXHg5Ylx4NjZceDU1XHg5Zlx4YjdceDEyXHhmMyIKKwkJCSJceDFiXHg0ZFx4OWRceDJhXHg1Y1x4ZWRceDg3XHg3NSIKKwkJCSJceDg3XHgyNlx4ZWNceDYxXHgyY1x4YjRceDBmXHg4OSIKKwkJCSJceGIwXHhmYlx4MmVceDY4XHg1ZFx4MTVceGM3XHg4ZCIKKwkJCSJceDJlXHhjMFx4ZDlceGVjXHhhZlx4NGZceGQyXHgyNSIKKwkJCSJceDI5XHhlOFx4ZDJceDI2XHgyYlx4NjdceGU5XHhmYyIKKwkJCSJceDJiXHhhOFx4NjdceDk2XHgxMlx4MWZceDViXHg5NiIKKwkJCSJceGM2XHgxNFx4NTNceGFmXHg0NFx4ZWFceGQ2XHhlMiIKKwkJCSJceDk0XHg5OFx4ZTRceDEyXHg5M1x4NGNceDkyXHhlMCIKKwkJCSJceDE4XHhhNVx4OGRceDJkXHhlNFx4NzFceDNjXHg0NyIKKwkJCSJceDRjXHhmN1x4ZTZceDQ3XHg5ZVx4YzBceDY4XHhkZiIKKwkJCSJceGQ0XHhmNVx4NWFceDc0XHhiMVx4MmJceDI5XHgwMyIKKwkJCSJceDE5XHgwN1x4YWZceDkwXHg2Mlx4NWNceDY4XHg5OCIKKwkJCSJceDQ4XHgxNlx4MTFceDAyXHg5ZFx4ZWVceGI0XHg5YiIKKwkJCSJceGU1XHg0Mlx4N2ZceDA4XHhmZFx4MTZceDMyXHgwYiIKKwkJCSJceGQwXHhiM1x4ZmFceDJiXHhiN1x4OTlceGY5XHgyOSIKKwkJCSJceGNkXHgyMFx4NDVceDlmXHhiM1x4MWFceDVkXHhhMiIKKwkJCSJceGFmXHg0ZFx4ZTBceGJkXHg0Mlx4MGRceGJjXHg3NCIKKwkJCSJceDk5XHg5Y1x4OGVceDUzXHgxYVx4YjRceDNlXHhiZCIKKwkJCSJceGEyXHg5YVx4MmRceGY3XHhmOFx4MzlceDBmXHg2NyIKKwkJCSJceDYzXHhmY1x4NmJceGMwXHhhZlx4YjNceDRiXHg0ZiIKKwkJCSJceDU1XHhjNFx4Y2ZceGE3XHhjOFx4MDRceDExXHgzZSIKKwkJCSJceDE0XHgzMlx4YmJceDFiXHgzOFx4NzdceGQ2XHg3ZiIKKwkJCSJceDU0XHg0Y1x4ZGZceDc1XHhmM1x4MDdceDJkXHgzMyIKKwkJCSJceDliXHhhOFx4MjBceGUxXHg3Ylx4MTJceGI1XHhmMyIKKwkJCSJceGVmXHgyZlx4Y2VceDcyXHhlNVx4MjRceDYwXHhjMSIKKwkJCSJceDMwXHhlMlx4YWJceGExXHg4ZVx4MTFceDA5XHhhOCIKKwkJCSJceDIxXHgzM1x4NDRceGZlXHg3Zlx4MzVceDMyXHg5MyIKKwkJCSJceDM5XHhhN1x4YWRceDhiXHg3OVx4MDZceGIyXHhjYiIKKwkJCSJceDRlXHhhOVx4NWZceGM3XHhiYVx4NzRceDI5XHhlYyIKKwkJCSJceDkzXHhhMFx4NGVceDU0XHg5M1x4YzBceGJjXHg1NSIKKwkJCSJceDY0XHhmMFx4NDhceGU1XHg1N1x4OTlceGVlXHg3NSIKKwkJCSJceGQ2XHg3OVx4MGZceDY2XHhiN1x4YzZceDU3XHg3NiIKKwkJCSJceGY3XHhiN1x4ZjNceDljXHhjNVx4NjBceGU4XHg3ZiIKKwkJCSJceDgzXHg3Nlx4ZDZceDBlXHhhYVx4ZTZceDkwXHgzOSIKKwkJCSJceDFkXHhhNlx4MzJceDZhXHgzNFx4ZTNceDU1XHhmOCIKKwkJCSJceDU4XHhhMFx4NThceDdkXHgzM1x4ZTBceDIyXHgzOSIKKwkJCSJceDQ0XHg2NFx4ODdceDg2XHg1YVx4MmZceGE3XHg3ZSIKKwkJCSJceDBmXHgzOFx4ZWFceGIwXHgzMFx4Y2NceDYxXHhhNSIKKwkJCSJceDZhXHgzMlx4YWVceDFlXHhmN1x4ZTlceGQwXHhhOSIKKwkJCSJceDBjXHgzMlx4NGJceGI1XHg0OVx4MjhceGFiXHg4NSIKKwkJCSJceDJmXHg4ZVx4MDFceDM2XHgzOFx4NTJceGQwXHhiYSIKKwkJCSJceGQ2XHgwMlx4NzhceGY4XHgwZVx4M2VceDljXHg4YiIKKwkJCSJceDZiXHg0NVx4OTlceDNmXHg1Y1x4ZmVceDU4XHhmMSIKKwkJCSJceDVjXHg5NFx4MDRceGUxXHhmNVx4MThceDZkXHg1MSIKKwkJCSJceGIyXHg1ZFx4MThceDIwXHhiNlx4YzJceDlhXHg0MiIKKwkJCSJceDFkXHhiM1x4YWJceDNjXHhiNlx4M2FceDEzXHgwMyIKKwkJCSJceGIyXHg0Nlx4ODJceDRmXHhmY1x4NjRceGJjXHg0ZiIKKwkJCSJceGNhXHhmYVx4OWNceGMwXHhkNVx4YTdceGJkXHgxMSIKKwkJCSJceGI3XHhlNFx4NWFceGY2XHg2Zlx4NGRceDRkXHg1NCIKKwkJCSJceGVhXHhhNFx4OThceDY2XHhkNFx4MjJceDNiXHhkMyIKKwkJCSJceDhmXHgzNFx4NDdceGQ5XHg3Y1x4ZjRceDcyXHgzYiIKKwkJCSJceDRkXHgwMlx4NzdceGY2XHhkNlx4ZGRceDA4XHgwYSIKKwkJCSJceDgxXHhlMVx4ODZceDg5XHgzZVx4NTZceDEwXHgzYyIKKwkJCSJceGJhXHhkN1x4ODFceDhjXHgwOFx4YmNceDhiXHhlMiIKKwkJCSJceDUzXHhlY1x4YTdceDg5XHhlZVx4YzhceDU2XHhiNSIKKwkJCSJceDM2XHgyY1x4YjJceDAzXHhiYVx4OTlceGRkXHg3YyIKKwkJCSJceDQ4XHhhMFx4YjBceGJjXHg5MVx4MzNceGU5XHhhOCIKKwkJCSJceGNiXHhjZFx4Y2ZceDU5XHg1Zlx4MWZceDE1XHhlMiIKKwkJCSJceDU2XHhmNVx4NGVceDAxXHgzNVx4MjdceDQ1XHg3NyIKKwkJCSJceDQ3XHhjOFx4YmNceGNiXHg3ZVx4MzlceGMxXHg5NyIKKwkJCSJceDI4XHhkM1x4ODRceGZjXHgyY1x4M2VceGM4XHhhZCIKKwkJCSJceDljXHhmOFx4OGFceDYxXHg5Y1x4MjhceGFhXHhjNSIKKwkJCSJceDk5XHgyMFx4NDNceDg1XHg5ZFx4YTVceGUyXHg4YiIKKwkJCSJceGI4XHhhZVx4ZWJceGQwXHgzMlx4MGRceDUyXHg3OCIKKwkJCSJceDA5XHg1Nlx4M2ZceGM3XHhkOFx4N2VceDI2XHhmYyIKKwkJCSJceDM3XHhmYlx4NmZceDA0XHhmY1x4ZmFceDkyXHgxMCIKKwkJCSJceGFjXHhmOFx4M2VceDIxXHhkY1x4OGNceDIxXHgxNiIKKwkJCSJceDdkXHg2N1x4NmVceGY2XHhjZFx4ZGFceGI2XHg5OCIKKwkJCSJceDIzXHhhYlx4MjNceDNjXHhiMlx4MTBceGEwXHg1MyIKKwkJCSJceDVhXHg1Nlx4OWZceGM1XHhkMFx4ZmZceGJiXHhlNCIKKwkJCSJceDk4XHgzY1x4NjlceDFlXHhkYlx4MzhceDhmXHg3ZSIKKwkJCSJceDBmXHhkMlx4OThceDg4XHg4MVx4OGJceDQ1XHg2NyIKKwkJCSJceGVhXHgzM1x4ZjFceGViXHhlOVx4OTdceDU1XHgyZSIKKwkJCSJceGQ5XHhhYVx4ZWJceDVhXHhlY1x4ZGFceGUxXHg2OCIKKwkJCSJceGE4XHg5ZFx4M2NceDg0XHg3Y1x4MDVceDNkXHg2MiIKKwkJCSJceDg3XHg4Zlx4MDNceDIxXHgyOFx4OTVceDBjXHg4OSIKKwkJCSJceDI1XHgyMlx4NGFceGIwXHg5M1x4YTlceDUwXHhhMiIKKwkJCSJceDJmXHg1N1x4NmVceDE4XHg0Mlx4MTlceDU0XHgwYyIKKwkJCSJceDU1XHg2N1x4YzZceDExXHg0OVx4ZjRceDVjXHhkMiIKKwkJCSJceGU5XHgzZFx4ZGRceDhiXHg0OFx4NzFceDIxXHgwMCIKKwkJCSJceGMzXHg5YVx4NmNceDg1XHg3NFx4MjhceDgzXHg0YSIKKwkJCSJceDFiXHgzMVx4MDVceGUxXHgwNlx4OTJceGU3XHhkYSIKKwkJCSJceDg1XHg3M1x4NzhceDQ1XHgyMFx4N2ZceGFlXHgxMyIKKwkJCSJceDdjXHgzM1x4MDZceDIyXHhmNFx4ODNceGY5XHgzNSIKKwkJCSJceDNmXHg2Y1x4NzFceGE4XHg0ZVx4NDhceGJlXHg5YiIKKwkJCSJceGNlXHg4YVx4YmFceGRhXHhiZVx4MjhceDA4XHhmNyIKKwkJCSJceGUyXHgxNFx4OGNceDcxXHhlYVx4NzJceGY5XHgzMyIKKwkJCSJceGYyXHg4OFx4M2ZceGQ3XHhiYlx4NjlceDZjXHgyOSIKKwkJCSJceDE5XHhkY1x4ODRceGNlXHgxZlx4MTJceDRmXHhjOCIKKwkJCSJceGFmXHhhNVx4MDRceGJhXHg1YVx4YWJceGIwXHhkOSIKKwkJCSJceDE0XHgxZlx4NmNceDY4XHg5OFx4MzlceDg5XHg3YSIKKwkJCSJceGQ5XHhkOFx4MmZceGRmXHhhOFx4NDdceDRhXHgyNSIKKwkJCSJceGUyXHhmYlx4MzNceGY0XHg1OVx4NzhceGUxXHg2OCIKKwkJCSJceDg1XHhjZlx4ZmVceDU5XHgyMFx4ZDRceDA1XHgxZCIKKwkJCSJceDgwXHg5OVx4YWVceGJjXHhjYVx4YWVceDBmXHgyZiIKKwkJCSJceDY1XHg0M1x4MzRceDhlXHg3ZVx4YWNceGQzXHg5MyIKKwkJCSJceDJmXHhhY1x4NmRceDE0XHgzZFx4MDJceDA3XHg3MCIKKwkJCSJceDlkXHhhNFx4ZjNceDFiXHg1Y1x4MzZceGZjXHgwMSIKKwkJCSJceDczXHgzNFx4ODVceDBjXHg2Y1x4ZDZceGYxXHhiZCIKKwkJCSJceDNmXHhkZlx4ZWVceGY1XHhkOVx4YmFceDU2XHhlZiIKKwkJCSJceGY0XHg5Ylx4NmJceGVlXHg5Zlx4NWFceDc4XHg2ZCIKKwkJCSJceDMyXHgxOVx4ZjRceGY3XHhmOFx4NGNceDY5XHgwYiIKKwkJCSJceDRiXHhiY1x4YmJceGI3XHhmMlx4ODVceGFmXHg3MCIKKwkJCSJceDc1XHgyNFx4NmNceDU0XHhhN1x4MGVceDRkXHgxZCIKKwkJCSJceDAxXHhiZlx4MDhceGFjXHhjZlx4N2ZceDJjXHhlMyIKKwkJCSJceDE0XHg4OVx4NWVceDcwXHg1YVx4OTlceDkyXHhjZCIKKwkJCSJceDAxXHg4NFx4YzhceGQyXHhhYlx4ZTVceDRmXHg1OCIKKwkJCSJceGU3XHgwZlx4MmZceDBlXHhmZlx4NjhceGVhXHhmZCIKKwkJCSJceDE1XHhiM1x4MTdceGU2XHhiMFx4ZTdceDg1XHhkOCIKKwkJCSJceDIzXHgyZVx4MDVceGM3XHhjOVx4YzRceDQ2XHgxZiIKKwkJCSJceGUxXHg5ZVx4NDlceDIwXHgyM1x4MjRceDRkXHg3ZSIKKwkJCSJceDI5XHg2NVx4ZmZceGY0XHhiNlx4ZmRceDFhXHg4NSIKKwkJCSJceGM0XHgxNlx4ZWNceGZjXHhlYVx4N2JceGQ2XHgyYyIKKwkJCSJceDQzXHhmOFx4YjdceGJmXHg3OVx4YzBceDg1XHhjZCIKKwkJCSJceGVmXHhlMVx4OThceGQzXHhhNVx4ZjdceDkwXHg4YyIKKwkJCSJceGU5XHg3Zlx4ODBceDZiXHhkMlx4YWNceDRjXHgzMCIKKwkJCSJceGE3XHhjNlx4NjFceDZjXHhkMlx4ZjlceDJjXHhmZiIKKwkJCSJceDMwXHhiY1x4MjJceDgxXHg3ZFx4OTNceDEyXHhlNCIKKwkJCSJceDBhXHhjZFx4YWZceGRkXHhlOFx4YWJceDBhXHgxZSIKKwkJCSJceDEzXHhhNFx4MjdceGMzXHg1Zlx4ZjdceDRiXHhiYiIKKwkJCSJceDM3XHgwOVx4NGJceDkxXHg2Zlx4OTJceDRmXHhhZiIKKwkJCSJceDUyXHhlZVx4ZGZceGVmXHgwOVx4NmZceGY3XHg1YyIKKwkJCSJceDZlXHgxMlx4MTdceDcyXHg2M1x4NTdceGM3XHhiYSIKKwkJCSJceDNiXHg2Ylx4MzhceDMyXHg3M1x4MWJceDljXHg4MCIKKwkJCSJceGMxXHg3YVx4YzZceGNmXHhjZFx4MzVceGMwXHg2YiIKKwkJCSJceDMxXHgxYVx4NmJceGU5XHhkOFx4MmNceDI5XHgzZiIKKwkJCSJceDk2XHhmYlx4YjZceGNkXHgxM1x4OTFceDNiXHhjMiIKKwkJCSJceGQyXHhhM1x4MzFceDhkXHhhNFx4Y2RceDU3XHhjZCIKKwkJCSJceDEzXHgzZFx4NjRceGZkXHgwNlx4Y2VceGU2XHhkYyIKKwkJCSJceDBjXHgyNFx4NDNceDMxXHg0MFx4NTdceGYxXHg3MiIKKwkJCSJceDE3XHhlM1x4M2FceDYzXHg2ZFx4MzVceGNmXHg1ZCIKKwkJCSJceDk3XHg0MFx4NTlceGRkXHhmN1x4M2NceDAyXHhmNyIKKwkJCSJceDFjXHg3ZVx4MDVceGJiXHhhOVx4MGRceDAxXHhiMSIKKwkJCSJceDhlXHhjMFx4MzBceGE5XHg1M1x4MjRceGM5XHg4OSIKKwkJCSJceDg0XHg2ZFx4YWFceGQwXHhjZFx4OTFceGMyXHg0ZCIKKwkJCSJceDkxXHhiMFx4ODlceGUyXHhiZlx4ODNceDQ0XHhhYSIKKwkJCSJceDI4XHg3Mlx4MjNceGEwXHhjMlx4YWRceGFkXHgxYyIKKwkJCSJceGZjXHgzZlx4MDlceDdhXHgwYlx4ZGNceGM1XHgxYiIKKwkJCSJceDg3XHgxM1x4YzZceDViXHg1OVx4OGRceGYyXHhjOCIKKwkJCSJceGFmXHhkZlx4MTFceDk1IiwKKwkJLnJsZW4JPSA0MTAwLAorCQkubnAJPSAyLAorCQkudGFwCT0geyA0MDY0LCAzNiB9LAorCX0sCit9OworCisvKgorICogQ1RTIChDaXBoZXIgVGV4dCBTdGVhbGluZykgbW9kZSB0ZXN0cworICovCisjZGVmaW5lIENUU19NT0RFX0VOQ19URVNUX1ZFQ1RPUlMgNgorI2RlZmluZSBDVFNfTU9ERV9ERUNfVEVTVF9WRUNUT1JTIDYKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgY3RzX21vZGVfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBmcm9tIHJmYzM5NjIgKi8KKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLmlsZW4JPSAxNywKKwkJLmlucHV0ICA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKKwkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgorCQkJICAiXHgyMCIsCisJCS5ybGVuCT0gMTcsCisJCS5yZXN1bHQJPSAiXHhjNlx4MzVceDM1XHg2OFx4ZjJceGJmXHg4Y1x4YjQiCisJCQkgICJceGQ4XHhhNVx4ODBceDM2XHgyZFx4YTdceGZmXHg3ZiIKKwkJCSAgIlx4OTciLAorCX0sIHsKKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLmlsZW4gICA9IDMxLAorCQkuaW5wdXQgID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgorCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCisJCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKKwkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjAiLAorCQkucmxlbiAgID0gMzEsCisJCS5yZXN1bHQgPSAiXHhmY1x4MDBceDc4XHgzZVx4MGVceGZkXHhiMlx4YzEiCisJCQkgICJceGQ0XHg0NVx4ZDRceGM4XHhlZlx4ZjdceGVkXHgyMiIKKwkJCSAgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgorCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNSIsCisJfSwgeworCQkua2xlbgk9IDE2LAorCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgorCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAorCQkuaWxlbiAgID0gMzIsCisJCS5pbnB1dCAgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCisJCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKKwkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgorCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMFx4NDMiLAorCQkucmxlbiAgID0gMzIsCisJCS5yZXN1bHQgPSAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCisJCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1XHhhOCIKKwkJCSAgIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgorCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiLAorCX0sIHsKKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLmlsZW4gICA9IDQ3LAorCQkuaW5wdXQgID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgorCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCisJCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKKwkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjBceDQzIgorCQkJICAiXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyY1x4MjAiCisJCQkgICJceDcwXHg2Y1x4NjVceDYxXHg3M1x4NjVceDJjIiwKKwkJLnJsZW4gICA9IDQ3LAorCQkucmVzdWx0ID0gIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgorCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCisJCQkgICJceGIzXHhmZlx4ZmRceDk0XHgwY1x4MTZceGExXHg4YyIKKwkJCSAgIlx4MWJceDU1XHg0OVx4ZDJceGY4XHgzOFx4MDJceDllIgorCQkJICAiXHgzOVx4MzFceDI1XHgyM1x4YTdceDg2XHg2Mlx4ZDUiCisJCQkgICJceGJlXHg3Zlx4Y2JceGNjXHg5OFx4ZWJceGY1IiwKKwl9LCB7CisJCS5rbGVuCT0gMTYsCisJCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCisJCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCisJCS5pbGVuICAgPSA0OCwKKwkJLmlucHV0ICA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKKwkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgorCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCisJCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIKKwkJCSAgIlx4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MmNceDIwIgorCQkJICAiXHg3MFx4NmNceDY1XHg2MVx4NzNceDY1XHgyY1x4MjAiLAorCQkucmxlbiAgID0gNDgsCisJCS5yZXN1bHQgPSAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCisJCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIKKwkJCSAgIlx4OWRceGFkXHg4Ylx4YmJceDk2XHhjNFx4Y2RceGMwIgorCQkJICAiXHgzYlx4YzFceDAzXHhlMVx4YTFceDk0XHhiYlx4ZDgiCisJCQkgICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKKwkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IiwKKwl9LCB7CisJCS5rbGVuCT0gMTYsCisJCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCisJCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCisJCS5pbGVuICAgPSA2NCwKKwkJLmlucHV0ICA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKKwkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgorCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCisJCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIKKwkJCSAgIlx4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MmNceDIwIgorCQkJICAiXHg3MFx4NmNceDY1XHg2MVx4NzNceDY1XHgyY1x4MjAiCisJCQkgICJceDYxXHg2ZVx4NjRceDIwXHg3N1x4NmZceDZlXHg3NCIKKwkJCSAgIlx4NmZceDZlXHgyMFx4NzNceDZmXHg3NVx4NzBceDJlIiwKKwkJLnJsZW4gICA9IDY0LAorCQkucmVzdWx0ID0gIlx4OTdceDY4XHg3Mlx4NjhceGQ2XHhlY1x4Y2NceGMwIgorCQkJICAiXHhjMFx4N2JceDI1XHhlMlx4NWVceGNmXHhlNVx4ODQiCisJCQkgICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKKwkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IgorCQkJICAiXHg0OFx4MDdceGVmXHhlOFx4MzZceGVlXHg4OVx4YTUiCisJCQkgICJceDI2XHg3M1x4MGRceGJjXHgyZlx4N2JceGM4XHg0MCIKKwkJCSAgIlx4OWRceGFkXHg4Ylx4YmJceDk2XHhjNFx4Y2RceGMwIgorCQkJICAiXHgzYlx4YzFceDAzXHhlMVx4YTFceDk0XHhiYlx4ZDgiLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgY3RzX21vZGVfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBmcm9tIHJmYzM5NjIgKi8KKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLnJsZW4JPSAxNywKKwkJLnJlc3VsdCA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKKwkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgorCQkJICAiXHgyMCIsCisJCS5pbGVuCT0gMTcsCisJCS5pbnB1dAk9ICJceGM2XHgzNVx4MzVceDY4XHhmMlx4YmZceDhjXHhiNCIKKwkJCSAgIlx4ZDhceGE1XHg4MFx4MzZceDJkXHhhN1x4ZmZceDdmIgorCQkJICAiXHg5NyIsCisJfSwgeworCQkua2xlbgk9IDE2LAorCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgorCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAorCQkucmxlbiAgID0gMzEsCisJCS5yZXN1bHQgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCisJCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKKwkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgorCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMCIsCisJCS5pbGVuICAgPSAzMSwKKwkJLmlucHV0ICA9ICJceGZjXHgwMFx4NzhceDNlXHgwZVx4ZmRceGIyXHhjMSIKKwkJCSAgIlx4ZDRceDQ1XHhkNFx4YzhceGVmXHhmN1x4ZWRceDIyIgorCQkJICAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCisJCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1IiwKKwl9LCB7CisJCS5rbGVuCT0gMTYsCisJCS5rZXkgICAgPSAiXHg2M1x4NjhceDY5XHg2M1x4NmJceDY1XHg2ZVx4MjAiCisJCQkgICJceDc0XHg2NVx4NzJceDY5XHg3OVx4NjFceDZiXHg2OSIsCisJCS5ybGVuICAgPSAzMiwKKwkJLnJlc3VsdCA9ICJceDQ5XHgyMFx4NzdceDZmXHg3NVx4NmNceDY0XHgyMCIKKwkJCSAgIlx4NmNceDY5XHg2Ylx4NjVceDIwXHg3NFx4NjhceDY1IgorCQkJICAiXHgyMFx4NDdceDY1XHg2ZVx4NjVceDcyXHg2MVx4NmMiCisJCQkgICJceDIwXHg0N1x4NjFceDc1XHgyN1x4NzNceDIwXHg0MyIsCisJCS5pbGVuICAgPSAzMiwKKwkJLmlucHV0ICA9ICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKKwkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjVceGE4IgorCQkJICAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCisJCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIsCisJfSwgeworCQkua2xlbgk9IDE2LAorCQkua2V5ICAgID0gIlx4NjNceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDIwIgorCQkJICAiXHg3NFx4NjVceDcyXHg2OVx4NzlceDYxXHg2Ylx4NjkiLAorCQkucmxlbiAgID0gNDcsCisJCS5yZXN1bHQgPSAiXHg0OVx4MjBceDc3XHg2Zlx4NzVceDZjXHg2NFx4MjAiCisJCQkgICJceDZjXHg2OVx4NmJceDY1XHgyMFx4NzRceDY4XHg2NSIKKwkJCSAgIlx4MjBceDQ3XHg2NVx4NmVceDY1XHg3Mlx4NjFceDZjIgorCQkJICAiXHgyMFx4NDdceDYxXHg3NVx4MjdceDczXHgyMFx4NDMiCisJCQkgICJceDY4XHg2OVx4NjNceDZiXHg2NVx4NmVceDJjXHgyMCIKKwkJCSAgIlx4NzBceDZjXHg2NVx4NjFceDczXHg2NVx4MmMiLAorCQkuaWxlbiAgID0gNDcsCisJCS5pbnB1dCAgPSAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCisJCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIKKwkJCSAgIlx4YjNceGZmXHhmZFx4OTRceDBjXHgxNlx4YTFceDhjIgorCQkJICAiXHgxYlx4NTVceDQ5XHhkMlx4ZjhceDM4XHgwMlx4OWUiCisJCQkgICJceDM5XHgzMVx4MjVceDIzXHhhN1x4ODZceDYyXHhkNSIKKwkJCSAgIlx4YmVceDdmXHhjYlx4Y2NceDk4XHhlYlx4ZjUiLAorCX0sIHsKKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLnJsZW4gICA9IDQ4LAorCQkucmVzdWx0ID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgorCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCisJCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKKwkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjBceDQzIgorCQkJICAiXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyY1x4MjAiCisJCQkgICJceDcwXHg2Y1x4NjVceDYxXHg3M1x4NjVceDJjXHgyMCIsCisJCS5pbGVuICAgPSA0OCwKKwkJLmlucHV0ICA9ICJceDk3XHg2OFx4NzJceDY4XHhkNlx4ZWNceGNjXHhjMCIKKwkJCSAgIlx4YzBceDdiXHgyNVx4ZTJceDVlXHhjZlx4ZTVceDg0IgorCQkJICAiXHg5ZFx4YWRceDhiXHhiYlx4OTZceGM0XHhjZFx4YzAiCisJCQkgICJceDNiXHhjMVx4MDNceGUxXHhhMVx4OTRceGJiXHhkOCIKKwkJCSAgIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1IgorCQkJICAiXHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNVx4YTgiLAorCX0sIHsKKwkJLmtsZW4JPSAxNiwKKwkJLmtleSAgICA9ICJceDYzXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY1XHg3Mlx4NjlceDc5XHg2MVx4NmJceDY5IiwKKwkJLnJsZW4gICA9IDY0LAorCQkucmVzdWx0ID0gIlx4NDlceDIwXHg3N1x4NmZceDc1XHg2Y1x4NjRceDIwIgorCQkJICAiXHg2Y1x4NjlceDZiXHg2NVx4MjBceDc0XHg2OFx4NjUiCisJCQkgICJceDIwXHg0N1x4NjVceDZlXHg2NVx4NzJceDYxXHg2YyIKKwkJCSAgIlx4MjBceDQ3XHg2MVx4NzVceDI3XHg3M1x4MjBceDQzIgorCQkJICAiXHg2OFx4NjlceDYzXHg2Ylx4NjVceDZlXHgyY1x4MjAiCisJCQkgICJceDcwXHg2Y1x4NjVceDYxXHg3M1x4NjVceDJjXHgyMCIKKwkJCSAgIlx4NjFceDZlXHg2NFx4MjBceDc3XHg2Zlx4NmVceDc0IgorCQkJICAiXHg2Zlx4NmVceDIwXHg3M1x4NmZceDc1XHg3MFx4MmUiLAorCQkuaWxlbiAgID0gNjQsCisJCS5pbnB1dCAgPSAiXHg5N1x4NjhceDcyXHg2OFx4ZDZceGVjXHhjY1x4YzAiCisJCQkgICJceGMwXHg3Ylx4MjVceGUyXHg1ZVx4Y2ZceGU1XHg4NCIKKwkJCSAgIlx4MzlceDMxXHgyNVx4MjNceGE3XHg4Nlx4NjJceGQ1IgorCQkJICAiXHhiZVx4N2ZceGNiXHhjY1x4OThceGViXHhmNVx4YTgiCisJCQkgICJceDQ4XHgwN1x4ZWZceGU4XHgzNlx4ZWVceDg5XHhhNSIKKwkJCSAgIlx4MjZceDczXHgwZFx4YmNceDJmXHg3Ylx4YzhceDQwIgorCQkJICAiXHg5ZFx4YWRceDhiXHhiYlx4OTZceGM0XHhjZFx4YzAiCisJCQkgICJceDNiXHhjMVx4MDNceGUxXHhhMVx4OTRceGJiXHhkOCIsCisJfQorfTsKKworLyoKKyAqIENvbXByZXNzaW9uIHN0dWZmLgorICovCisjZGVmaW5lIENPTVBfQlVGX1NJWkUgICAgICAgICAgIDUxMgorCitzdHJ1Y3QgY29tcF90ZXN0dmVjIHsKKwlpbnQgaW5sZW4sIG91dGxlbjsKKwljaGFyIGlucHV0W0NPTVBfQlVGX1NJWkVdOworCWNoYXIgb3V0cHV0W0NPTVBfQlVGX1NJWkVdOworfTsKKworLyoKKyAqIERlZmxhdGUgdGVzdCB2ZWN0b3JzIChudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncykuCisgKiBQYXJhbXM6IHdpbmJpdHM9MTEsIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgTUFYX01FTV9MRVZFTC4KKyAqLworI2RlZmluZSBERUZMQVRFX0NPTVBfVEVTVF9WRUNUT1JTIDIKKyNkZWZpbmUgREVGTEFURV9ERUNPTVBfVEVTVF9WRUNUT1JTIDIKKworc3RhdGljIHN0cnVjdCBjb21wX3Rlc3R2ZWMgZGVmbGF0ZV9jb21wX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkuaW5sZW4JPSA3MCwKKwkJLm91dGxlbgk9IDM4LAorCQkuaW5wdXQJPSAiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiCisJCQkiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiLAorCQkub3V0cHV0CT0gIlx4ZjNceGNhXHhjZlx4Y2NceDUzXHgyOFx4MmRceDU2IgorCQkJICAiXHhjOFx4Y2JceDJmXHg1N1x4NDhceGNjXHg0Ylx4NTEiCisJCQkgICJceDI4XHhjZVx4NDhceDJjXHg0YVx4NTVceDI4XHhjOSIKKwkJCSAgIlx4NDhceDU1XHgyOFx4Y2VceDRmXHgyYlx4MjlceDA3IgorCQkJICAiXHg3MVx4YmNceDA4XHgyYlx4MDFceDAwIiwKKwl9LCB7CisJCS5pbmxlbgk9IDE5MSwKKwkJLm91dGxlbgk9IDEyMiwKKwkJLmlucHV0CT0gIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGJhc2VkIG9uIHRoZSBERUZMQVRFIgorCQkJImNvbXByZXNzaW9uIGFsZ29yaXRobS4gIFRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gb2YgIgorCQkJInRoZSBERUZMQVRFIGFsZ29yaXRobSB0byB0aGUgSVAgUGF5bG9hZCBDb21wcmVzc2lvbiBQcm90b2NvbC4iLAorCQkub3V0cHV0CT0gIlx4NWRceDhkXHgzMVx4MGVceGMyXHgzMFx4MTBceDA0IgorCQkJICAiXHhiZlx4YjJceDJmXHhjOFx4MWZceDEwXHgwNFx4MDkiCisJCQkgICJceDg5XHhjMlx4ODVceDNmXHg3MFx4YjFceDJmXHhmOCIKKwkJCSAgIlx4MjRceGRiXHg2N1x4ZDlceDQ3XHhjMVx4ZWZceDQ5IgorCQkJICAiXHg2OFx4MTJceDUxXHhhZVx4NzZceDY3XHhkNlx4MjciCisJCQkgICJceDE5XHg4OFx4MWFceGRlXHg4NVx4YWJceDIxXHhmMiIKKwkJCSAgIlx4MDhceDVkXHgxNlx4MWVceDIwXHgwNFx4MmRceGFkIgorCQkJICAiXHhmM1x4MThceGEyXHgxNVx4ODVceDJkXHg2OVx4YzQiCisJCQkgICJceDQyXHg4M1x4MjNceGI2XHg2Y1x4ODlceDcxXHg5YiIKKwkJCSAgIlx4ZWZceGNmXHg4Ylx4OWZceGNmXHgzM1x4Y2FceDJmIgorCQkJICAiXHhlZFx4NjJceGE5XHg0Y1x4ODBceGZmXHgxM1x4YWYiCisJCQkgICJceDUyXHgzN1x4ZWRceDBlXHg1Mlx4NmJceDU5XHgwMiIKKwkJCSAgIlx4ZDlceDRlXHhlOFx4N2FceDc2XHgxZFx4MDJceDk4IgorCQkJICAiXHhmZVx4OGFceDg3XHg4M1x4YTNceDRmXHg1Nlx4OGEiCisJCQkgICJceGI4XHg5ZVx4OGVceDVjXHg1N1x4ZDNceGEwXHg3OSIKKwkJCSAgIlx4ZmFceDAyIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjb21wX3Rlc3R2ZWMgZGVmbGF0ZV9kZWNvbXBfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5pbmxlbgk9IDEyMiwKKwkJLm91dGxlbgk9IDE5MSwKKwkJLmlucHV0CT0gIlx4NWRceDhkXHgzMVx4MGVceGMyXHgzMFx4MTBceDA0IgorCQkJICAiXHhiZlx4YjJceDJmXHhjOFx4MWZceDEwXHgwNFx4MDkiCisJCQkgICJceDg5XHhjMlx4ODVceDNmXHg3MFx4YjFceDJmXHhmOCIKKwkJCSAgIlx4MjRceGRiXHg2N1x4ZDlceDQ3XHhjMVx4ZWZceDQ5IgorCQkJICAiXHg2OFx4MTJceDUxXHhhZVx4NzZceDY3XHhkNlx4MjciCisJCQkgICJceDE5XHg4OFx4MWFceGRlXHg4NVx4YWJceDIxXHhmMiIKKwkJCSAgIlx4MDhceDVkXHgxNlx4MWVceDIwXHgwNFx4MmRceGFkIgorCQkJICAiXHhmM1x4MThceGEyXHgxNVx4ODVceDJkXHg2OVx4YzQiCisJCQkgICJceDQyXHg4M1x4MjNceGI2XHg2Y1x4ODlceDcxXHg5YiIKKwkJCSAgIlx4ZWZceGNmXHg4Ylx4OWZceGNmXHgzM1x4Y2FceDJmIgorCQkJICAiXHhlZFx4NjJceGE5XHg0Y1x4ODBceGZmXHgxM1x4YWYiCisJCQkgICJceDUyXHgzN1x4ZWRceDBlXHg1Mlx4NmJceDU5XHgwMiIKKwkJCSAgIlx4ZDlceDRlXHhlOFx4N2FceDc2XHgxZFx4MDJceDk4IgorCQkJICAiXHhmZVx4OGFceDg3XHg4M1x4YTNceDRmXHg1Nlx4OGEiCisJCQkgICJceGI4XHg5ZVx4OGVceDVjXHg1N1x4ZDNceGEwXHg3OSIKKwkJCSAgIlx4ZmFceDAyIiwKKwkJLm91dHB1dAk9ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBhIGNvbXByZXNzaW9uIG1ldGhvZCBiYXNlZCBvbiB0aGUgREVGTEFURSIKKwkJCSJjb21wcmVzc2lvbiBhbGdvcml0aG0uICBUaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG9mICIKKwkJCSJ0aGUgREVGTEFURSBhbGdvcml0aG0gdG8gdGhlIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wuIiwKKwl9LCB7CisJCS5pbmxlbgk9IDM4LAorCQkub3V0bGVuCT0gNzAsCisJCS5pbnB1dAk9ICJceGYzXHhjYVx4Y2ZceGNjXHg1M1x4MjhceDJkXHg1NiIKKwkJCSAgIlx4YzhceGNiXHgyZlx4NTdceDQ4XHhjY1x4NGJceDUxIgorCQkJICAiXHgyOFx4Y2VceDQ4XHgyY1x4NGFceDU1XHgyOFx4YzkiCisJCQkgICJceDQ4XHg1NVx4MjhceGNlXHg0Zlx4MmJceDI5XHgwNyIKKwkJCSAgIlx4NzFceGJjXHgwOFx4MmJceDAxXHgwMCIsCisJCS5vdXRwdXQJPSAiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiCisJCQkiSm9pbiB1cyBub3cgYW5kIHNoYXJlIHRoZSBzb2Z0d2FyZSAiLAorCX0sCit9OworCisvKgorICogTFpPIHRlc3QgdmVjdG9ycyAobnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MpLgorICovCisjZGVmaW5lIExaT19DT01QX1RFU1RfVkVDVE9SUyAyCisjZGVmaW5lIExaT19ERUNPTVBfVEVTVF9WRUNUT1JTIDIKKworc3RhdGljIHN0cnVjdCBjb21wX3Rlc3R2ZWMgbHpvX2NvbXBfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5pbmxlbgk9IDcwLAorCQkub3V0bGVuCT0gNDYsCisJCS5pbnB1dAk9ICJKb2luIHVzIG5vdyBhbmQgc2hhcmUgdGhlIHNvZnR3YXJlICIKKwkJCSJKb2luIHVzIG5vdyBhbmQgc2hhcmUgdGhlIHNvZnR3YXJlICIsCisJCS5vdXRwdXQJPSAiXHgwMFx4MGRceDRhXHg2Zlx4NjlceDZlXHgyMFx4NzUiCisJCQkiXHg3M1x4MjBceDZlXHg2Zlx4NzdceDIwXHg2MVx4NmUiCisJCQkiXHg2NFx4MjBceDczXHg2OFx4NjFceDcyXHg2NVx4MjAiCisJCQkiXHg3NFx4NjhceDY1XHgyMFx4NzNceDZmXHg2Nlx4NzQiCisJCQkiXHg3N1x4NzBceDAxXHgwMVx4NGFceDZmXHg2OVx4NmUiCisJCQkiXHgzZFx4ODhceDAwXHgxMVx4MDBceDAwIiwKKwl9LCB7CisJCS5pbmxlbgk9IDE1OSwKKwkJLm91dGxlbgk9IDEzMywKKwkJLmlucHV0CT0gIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGJhc2VkIG9uIHRoZSBMWk8gIgorCQkJImNvbXByZXNzaW9uIGFsZ29yaXRobS4gIFRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gb2YgIgorCQkJInRoZSBMWk8gYWxnb3JpdGhtIHVzZWQgaW4gVUJJRlMuIiwKKwkJLm91dHB1dAk9ICJceDAwXHgyYlx4NTRceDY4XHg2OVx4NzNceDIwXHg2NCIKKwkJCSAgIlx4NmZceDYzXHg3NVx4NmRceDY1XHg2ZVx4NzRceDIwIgorCQkJICAiXHg2NFx4NjVceDczXHg2M1x4NzJceDY5XHg2Mlx4NjUiCisJCQkgICJceDczXHgyMFx4NjFceDIwXHg2M1x4NmZceDZkXHg3MCIKKwkJCSAgIlx4NzJceDY1XHg3M1x4NzNceDY5XHg2Zlx4NmVceDIwIgorCQkJICAiXHg2ZFx4NjVceDc0XHg2OFx4NmZceDY0XHgyMFx4NjIiCisJCQkgICJceDYxXHg3M1x4NjVceDY0XHgyMFx4NmZceDZlXHgyMCIKKwkJCSAgIlx4NzRceDY4XHg2NVx4MjBceDRjXHg1YVx4NGZceDJiIgorCQkJICAiXHg4Y1x4MDBceDBkXHg2MVx4NmNceDY3XHg2Zlx4NzIiCisJCQkgICJceDY5XHg3NFx4NjhceDZkXHgyZVx4MjBceDIwXHg1NCIKKwkJCSAgIlx4NjhceDY5XHg3M1x4MmFceDU0XHgwMVx4MDJceDY2IgorCQkJICAiXHg2OVx4NmVceDY1XHg3M1x4OTRceDA2XHgwNVx4NjEiCisJCQkgICJceDcwXHg3MFx4NmNceDY5XHg2M1x4NjFceDc0XHg3NiIKKwkJCSAgIlx4MGFceDZmXHg2Nlx4ODhceDAyXHg2MFx4MDlceDI3IgorCQkJICAiXHhmMFx4MDBceDBjXHgyMFx4NzVceDczXHg2NVx4NjQiCisJCQkgICJceDIwXHg2OVx4NmVceDIwXHg1NVx4NDJceDQ5XHg0NiIKKwkJCSAgIlx4NTNceDJlXHgxMVx4MDBceDAwIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjb21wX3Rlc3R2ZWMgbHpvX2RlY29tcF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmlubGVuCT0gMTMzLAorCQkub3V0bGVuCT0gMTU5LAorCQkuaW5wdXQJPSAiXHgwMFx4MmJceDU0XHg2OFx4NjlceDczXHgyMFx4NjQiCisJCQkgICJceDZmXHg2M1x4NzVceDZkXHg2NVx4NmVceDc0XHgyMCIKKwkJCSAgIlx4NjRceDY1XHg3M1x4NjNceDcyXHg2OVx4NjJceDY1IgorCQkJICAiXHg3M1x4MjBceDYxXHgyMFx4NjNceDZmXHg2ZFx4NzAiCisJCQkgICJceDcyXHg2NVx4NzNceDczXHg2OVx4NmZceDZlXHgyMCIKKwkJCSAgIlx4NmRceDY1XHg3NFx4NjhceDZmXHg2NFx4MjBceDYyIgorCQkJICAiXHg2MVx4NzNceDY1XHg2NFx4MjBceDZmXHg2ZVx4MjAiCisJCQkgICJceDc0XHg2OFx4NjVceDIwXHg0Y1x4NWFceDRmXHgyYiIKKwkJCSAgIlx4OGNceDAwXHgwZFx4NjFceDZjXHg2N1x4NmZceDcyIgorCQkJICAiXHg2OVx4NzRceDY4XHg2ZFx4MmVceDIwXHgyMFx4NTQiCisJCQkgICJceDY4XHg2OVx4NzNceDJhXHg1NFx4MDFceDAyXHg2NiIKKwkJCSAgIlx4NjlceDZlXHg2NVx4NzNceDk0XHgwNlx4MDVceDYxIgorCQkJICAiXHg3MFx4NzBceDZjXHg2OVx4NjNceDYxXHg3NFx4NzYiCisJCQkgICJceDBhXHg2Zlx4NjZceDg4XHgwMlx4NjBceDA5XHgyNyIKKwkJCSAgIlx4ZjBceDAwXHgwY1x4MjBceDc1XHg3M1x4NjVceDY0IgorCQkJICAiXHgyMFx4NjlceDZlXHgyMFx4NTVceDQyXHg0OVx4NDYiCisJCQkgICJceDUzXHgyZVx4MTFceDAwXHgwMCIsCisJCS5vdXRwdXQJPSAiVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgYSBjb21wcmVzc2lvbiBtZXRob2QgYmFzZWQgb24gdGhlIExaTyAiCisJCQkiY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBvZiAiCisJCQkidGhlIExaTyBhbGdvcml0aG0gdXNlZCBpbiBVQklGUy4iLAorCX0sIHsKKwkJLmlubGVuCT0gNDYsCisJCS5vdXRsZW4JPSA3MCwKKwkJLmlucHV0CT0gIlx4MDBceDBkXHg0YVx4NmZceDY5XHg2ZVx4MjBceDc1IgorCQkJICAiXHg3M1x4MjBceDZlXHg2Zlx4NzdceDIwXHg2MVx4NmUiCisJCQkgICJceDY0XHgyMFx4NzNceDY4XHg2MVx4NzJceDY1XHgyMCIKKwkJCSAgIlx4NzRceDY4XHg2NVx4MjBceDczXHg2Zlx4NjZceDc0IgorCQkJICAiXHg3N1x4NzBceDAxXHgwMVx4NGFceDZmXHg2OVx4NmUiCisJCQkgICJceDNkXHg4OFx4MDBceDExXHgwMFx4MDAiLAorCQkub3V0cHV0CT0gIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIgorCQkJIkpvaW4gdXMgbm93IGFuZCBzaGFyZSB0aGUgc29mdHdhcmUgIiwKKwl9LAorfTsKKworLyoKKyAqIE1pY2hhZWwgTUlDIHRlc3QgdmVjdG9ycyBmcm9tIElFRUUgODAyLjExaQorICovCisjZGVmaW5lIE1JQ0hBRUxfTUlDX1RFU1RfVkVDVE9SUyA2CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIG1pY2hhZWxfbWljX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtzaXplID0gOCwKKwkJLnBsYWludGV4dCA9IHplcm9lZF9zdHJpbmcsCisJCS5wc2l6ZSA9IDAsCisJCS5kaWdlc3QgPSAiXHg4Mlx4OTJceDVjXHgxY1x4YTFceGQxXHgzMFx4YjgiLAorCX0sCisJeworCQkua2V5ID0gIlx4ODJceDkyXHg1Y1x4MWNceGExXHhkMVx4MzBceGI4IiwKKwkJLmtzaXplID0gOCwKKwkJLnBsYWludGV4dCA9ICJNIiwKKwkJLnBzaXplID0gMSwKKwkJLmRpZ2VzdCA9ICJceDQzXHg0N1x4MjFceGNhXHg0MFx4NjNceDliXHgzZiIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHg0M1x4NDdceDIxXHhjYVx4NDBceDYzXHg5Ylx4M2YiLAorCQkua3NpemUgPSA4LAorCQkucGxhaW50ZXh0ID0gIk1pIiwKKwkJLnBzaXplID0gMiwKKwkJLmRpZ2VzdCA9ICJceGU4XHhmOVx4YmVceGNhXHhlOVx4N2VceDVkXHgyOSIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHhlOFx4ZjlceGJlXHhjYVx4ZTlceDdlXHg1ZFx4MjkiLAorCQkua3NpemUgPSA4LAorCQkucGxhaW50ZXh0ID0gIk1pYyIsCisJCS5wc2l6ZSA9IDMsCisJCS5kaWdlc3QgPSAiXHg5MFx4MDNceDhmXHhjNlx4Y2ZceDEzXHhjMVx4ZGIiLAorCX0sCisJeworCQkua2V5ID0gIlx4OTBceDAzXHg4Zlx4YzZceGNmXHgxM1x4YzFceGRiIiwKKwkJLmtzaXplID0gOCwKKwkJLnBsYWludGV4dCA9ICJNaWNoIiwKKwkJLnBzaXplID0gNCwKKwkJLmRpZ2VzdCA9ICJceGQ1XHg1ZVx4MTBceDA1XHgxMFx4MTJceDg5XHg4NiIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHhkNVx4NWVceDEwXHgwNVx4MTBceDEyXHg4OVx4ODYiLAorCQkua3NpemUgPSA4LAorCQkucGxhaW50ZXh0ID0gIk1pY2hhZWwiLAorCQkucHNpemUgPSA3LAorCQkuZGlnZXN0ID0gIlx4MGFceDk0XHgyYlx4MTJceDRlXHhjYVx4YTVceDQ2IiwKKwl9Cit9OworCisvKgorICogQ1JDMzJDIHRlc3QgdmVjdG9ycworICovCisjZGVmaW5lIENSQzMyQ19URVNUX1ZFQ1RPUlMgMTQKKworc3RhdGljIHN0cnVjdCBoYXNoX3Rlc3R2ZWMgY3JjMzJjX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkucHNpemUgPSAwLAorCQkuZGlnZXN0ID0gIlx4MDBceDAwXHgwMFx4MDAiLAorCX0sCisJeworCQkua2V5ID0gIlx4ODdceGE5XHhjYlx4ZWQiLAorCQkua3NpemUgPSA0LAorCQkucHNpemUgPSAwLAorCQkuZGlnZXN0ID0gIlx4NzhceDU2XHgzNFx4MTIiLAorCX0sCisJeworCQkua2V5ID0gIlx4ZmZceGZmXHhmZlx4ZmYiLAorCQkua3NpemUgPSA0LAorCQkucGxhaW50ZXh0ID0gIlx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4IgorCQkJICAgICAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZlx4MTAiCisJCQkgICAgICJceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOCIKKwkJCSAgICAgIlx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZceDIwIgorCQkJICAgICAiXHgyMVx4MjJceDIzXHgyNFx4MjVceDI2XHgyN1x4MjgiLAorCQkucHNpemUgPSA0MCwKKwkJLmRpZ2VzdCA9ICJceDdmXHgxNVx4MmNceDBlIiwKKwl9LAorCXsKKwkJLmtleSA9ICJceGZmXHhmZlx4ZmZceGZmIiwKKwkJLmtzaXplID0gNCwKKwkJLnBsYWludGV4dCA9ICJceDI5XHgyYVx4MmJceDJjXHgyZFx4MmVceDJmXHgzMCIKKwkJCSAgICAgIlx4MzFceDMyXHgzM1x4MzRceDM1XHgzNlx4MzdceDM4IgorCQkJICAgICAiXHgzOVx4M2FceDNiXHgzY1x4M2RceDNlXHgzZlx4NDAiCisJCQkgICAgICJceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3XHg0OCIKKwkJCSAgICAgIlx4NDlceDRhXHg0Ylx4NGNceDRkXHg0ZVx4NGZceDUwIiwKKwkJLnBzaXplID0gNDAsCisJCS5kaWdlc3QgPSAiXHhmNlx4ZWJceDgwXHhlOSIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHhmZlx4ZmZceGZmXHhmZiIsCisJCS5rc2l6ZSA9IDQsCisJCS5wbGFpbnRleHQgPSAiXHg1MVx4NTJceDUzXHg1NFx4NTVceDU2XHg1N1x4NTgiCisJCQkgICAgICJceDU5XHg1YVx4NWJceDVjXHg1ZFx4NWVceDVmXHg2MCIKKwkJCSAgICAgIlx4NjFceDYyXHg2M1x4NjRceDY1XHg2Nlx4NjdceDY4IgorCQkJICAgICAiXHg2OVx4NmFceDZiXHg2Y1x4NmRceDZlXHg2Zlx4NzAiCisJCQkgICAgICJceDcxXHg3Mlx4NzNceDc0XHg3NVx4NzZceDc3XHg3OCIsCisJCS5wc2l6ZSA9IDQwLAorCQkuZGlnZXN0ID0gIlx4ZWRceGJkXHg3NFx4ZGUiLAorCX0sCisJeworCQkua2V5ID0gIlx4ZmZceGZmXHhmZlx4ZmYiLAorCQkua3NpemUgPSA0LAorCQkucGxhaW50ZXh0ID0gIlx4NzlceDdhXHg3Ylx4N2NceDdkXHg3ZVx4N2ZceDgwIgorCQkJICAgICAiXHg4MVx4ODJceDgzXHg4NFx4ODVceDg2XHg4N1x4ODgiCisJCQkgICAgICJceDg5XHg4YVx4OGJceDhjXHg4ZFx4OGVceDhmXHg5MCIKKwkJCSAgICAgIlx4OTFceDkyXHg5M1x4OTRceDk1XHg5Nlx4OTdceDk4IgorCQkJICAgICAiXHg5OVx4OWFceDliXHg5Y1x4OWRceDllXHg5Zlx4YTAiLAorCQkucHNpemUgPSA0MCwKKwkJLmRpZ2VzdCA9ICJceDYyXHhjOFx4NzlceGQ1IiwKKwl9LAorCXsKKwkJLmtleSA9ICJceGZmXHhmZlx4ZmZceGZmIiwKKwkJLmtzaXplID0gNCwKKwkJLnBsYWludGV4dCA9ICJceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOCIKKwkJCSAgICAgIlx4YTlceGFhXHhhYlx4YWNceGFkXHhhZVx4YWZceGIwIgorCQkJICAgICAiXHhiMVx4YjJceGIzXHhiNFx4YjVceGI2XHhiN1x4YjgiCisJCQkgICAgICJceGI5XHhiYVx4YmJceGJjXHhiZFx4YmVceGJmXHhjMCIKKwkJCSAgICAgIlx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzdceGM4IiwKKwkJLnBzaXplID0gNDAsCisJCS5kaWdlc3QgPSAiXHhkMFx4OWFceDk3XHhiYSIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHhmZlx4ZmZceGZmXHhmZiIsCisJCS5rc2l6ZSA9IDQsCisJCS5wbGFpbnRleHQgPSAiXHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZlx4ZDAiCisJCQkgICAgICJceGQxXHhkMlx4ZDNceGQ0XHhkNVx4ZDZceGQ3XHhkOCIKKwkJCSAgICAgIlx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGZceGUwIgorCQkJICAgICAiXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlN1x4ZTgiCisJCQkgICAgICJceGU5XHhlYVx4ZWJceGVjXHhlZFx4ZWVceGVmXHhmMCIsCisJCS5wc2l6ZSA9IDQwLAorCQkuZGlnZXN0ID0gIlx4MTNceGQ5XHgyOVx4MmIiLAorCX0sCisJeworCQkua2V5ID0gIlx4ODBceGVhXHhkM1x4ZjEiLAorCQkua3NpemUgPSA0LAorCQkucGxhaW50ZXh0ID0gIlx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmZceDMwIgorCQkJICAgICAiXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzgiCisJCQkgICAgICJceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmXHg0MCIKKwkJCSAgICAgIlx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4IgorCQkJICAgICAiXHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0Zlx4NTAiLAorCQkucHNpemUgPSA0MCwKKwkJLmRpZ2VzdCA9ICJceDBjXHhiNVx4ZTJceGEyIiwKKwl9LAorCXsKKwkJLmtleSA9ICJceGYzXHg0YVx4MWRceDVkIiwKKwkJLmtzaXplID0gNCwKKwkJLnBsYWludGV4dCA9ICJceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OCIKKwkJCSAgICAgIlx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWZceDYwIgorCQkJICAgICAiXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2N1x4NjgiCisJCQkgICAgICJceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmXHg3MCIKKwkJCSAgICAgIlx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzdceDc4IiwKKwkJLnBzaXplID0gNDAsCisJCS5kaWdlc3QgPSAiXHhkMVx4N2ZceGZiXHhhNiIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHgyZVx4ODBceDA0XHg1OSIsCisJCS5rc2l6ZSA9IDQsCisJCS5wbGFpbnRleHQgPSAiXHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3Zlx4ODAiCisJCQkgICAgICJceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OCIKKwkJCSAgICAgIlx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGZceDkwIgorCQkJICAgICAiXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OTgiCisJCQkgICAgICJceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmXHhhMCIsCisJCS5wc2l6ZSA9IDQwLAorCQkuZGlnZXN0ID0gIlx4NTlceDMzXHhlNlx4N2EiLAorCX0sCisJeworCQkua2V5ID0gIlx4YTZceGNjXHgxOVx4ODUiLAorCQkua3NpemUgPSA0LAorCQkucGxhaW50ZXh0ID0gIlx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4IgorCQkJICAgICAiXHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZlx4YjAiCisJCQkgICAgICJceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3XHhiOCIKKwkJCSAgICAgIlx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmZceGMwIgorCQkJICAgICAiXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjN1x4YzgiLAorCQkucHNpemUgPSA0MCwKKwkJLmRpZ2VzdCA9ICJceGJlXHgwM1x4MDFceGQyIiwKKwl9LAorCXsKKwkJLmtleSA9ICJceDQxXHhmY1x4ZmVceDJkIiwKKwkJLmtzaXplID0gNCwKKwkJLnBsYWludGV4dCA9ICJceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmXHhkMCIKKwkJCSAgICAgIlx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDdceGQ4IgorCQkJICAgICAiXHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZlx4ZTAiCisJCQkgICAgICJceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3XHhlOCIKKwkJCSAgICAgIlx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWZceGYwIiwKKwkJLnBzaXplID0gNDAsCisJCS5kaWdlc3QgPSAiXHg3NVx4ZDNceGM1XHgyNCIsCisJfSwKKwl7CisJCS5rZXkgPSAiXHhmZlx4ZmZceGZmXHhmZiIsCisJCS5rc2l6ZSA9IDQsCisJCS5wbGFpbnRleHQgPSAiXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiCisJCQkgICAgICJceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmXHgxMCIKKwkJCSAgICAgIlx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4IgorCQkJICAgICAiXHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZlx4MjAiCisJCQkgICAgICJceDIxXHgyMlx4MjNceDI0XHgyNVx4MjZceDI3XHgyOCIKKwkJCSAgICAgIlx4MjlceDJhXHgyYlx4MmNceDJkXHgyZVx4MmZceDMwIgorCQkJICAgICAiXHgzMVx4MzJceDMzXHgzNFx4MzVceDM2XHgzN1x4MzgiCisJCQkgICAgICJceDM5XHgzYVx4M2JceDNjXHgzZFx4M2VceDNmXHg0MCIKKwkJCSAgICAgIlx4NDFceDQyXHg0M1x4NDRceDQ1XHg0Nlx4NDdceDQ4IgorCQkJICAgICAiXHg0OVx4NGFceDRiXHg0Y1x4NGRceDRlXHg0Zlx4NTAiCisJCQkgICAgICJceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OCIKKwkJCSAgICAgIlx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWZceDYwIgorCQkJICAgICAiXHg2MVx4NjJceDYzXHg2NFx4NjVceDY2XHg2N1x4NjgiCisJCQkgICAgICJceDY5XHg2YVx4NmJceDZjXHg2ZFx4NmVceDZmXHg3MCIKKwkJCSAgICAgIlx4NzFceDcyXHg3M1x4NzRceDc1XHg3Nlx4NzdceDc4IgorCQkJICAgICAiXHg3OVx4N2FceDdiXHg3Y1x4N2RceDdlXHg3Zlx4ODAiCisJCQkgICAgICJceDgxXHg4Mlx4ODNceDg0XHg4NVx4ODZceDg3XHg4OCIKKwkJCSAgICAgIlx4ODlceDhhXHg4Ylx4OGNceDhkXHg4ZVx4OGZceDkwIgorCQkJICAgICAiXHg5MVx4OTJceDkzXHg5NFx4OTVceDk2XHg5N1x4OTgiCisJCQkgICAgICJceDk5XHg5YVx4OWJceDljXHg5ZFx4OWVceDlmXHhhMCIKKwkJCSAgICAgIlx4YTFceGEyXHhhM1x4YTRceGE1XHhhNlx4YTdceGE4IgorCQkJICAgICAiXHhhOVx4YWFceGFiXHhhY1x4YWRceGFlXHhhZlx4YjAiCisJCQkgICAgICJceGIxXHhiMlx4YjNceGI0XHhiNVx4YjZceGI3XHhiOCIKKwkJCSAgICAgIlx4YjlceGJhXHhiYlx4YmNceGJkXHhiZVx4YmZceGMwIgorCQkJICAgICAiXHhjMVx4YzJceGMzXHhjNFx4YzVceGM2XHhjN1x4YzgiCisJCQkgICAgICJceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmXHhkMCIKKwkJCSAgICAgIlx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDdceGQ4IgorCQkJICAgICAiXHhkOVx4ZGFceGRiXHhkY1x4ZGRceGRlXHhkZlx4ZTAiCisJCQkgICAgICJceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3XHhlOCIKKwkJCSAgICAgIlx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWZceGYwIiwKKwkJLnBzaXplID0gMjQwLAorCQkuZGlnZXN0ID0gIlx4NzVceGQzXHhjNVx4MjQiLAorCQkubnAgPSAyLAorCQkudGFwID0geyAzMSwgMjA5IH0KKwl9LAorfTsKKworI2VuZGlmCS8qIF9DUllQVE9fVEVTVE1HUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjY2Vzc2liaWxpdHkvYnJhaWxsZS9icmFpbGxlX2NvbnNvbGUuYyBiL2RyaXZlcnMvYWNjZXNzaWJpbGl0eS9icmFpbGxlL2JyYWlsbGVfY29uc29sZS5jCmluZGV4IDBhNWY2YjIuLmQ2NzJjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNjZXNzaWJpbGl0eS9icmFpbGxlL2JyYWlsbGVfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvYWNjZXNzaWJpbGl0eS9icmFpbGxlL2JyYWlsbGVfY29uc29sZS5jCkBAIC0zNzYsNiArMzc2LDggQEAKIAljb25zb2xlLT5mbGFncyB8PSBDT05fRU5BQkxFRDsKIAljb25zb2xlLT5pbmRleCA9IGluZGV4OwogCWJyYWlsbGVfY28gPSBjb25zb2xlOworCXJlZ2lzdGVyX2tleWJvYXJkX25vdGlmaWVyKCZrZXlib2FyZF9ub3RpZmllcl9ibG9jayk7CisJcmVnaXN0ZXJfdnRfbm90aWZpZXIoJnZ0X25vdGlmaWVyX2Jsb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgzLDE1ICszODUsOCBAQAogewogCWlmIChicmFpbGxlX2NvICE9IGNvbnNvbGUpCiAJCXJldHVybiAtRUlOVkFMOworCXVucmVnaXN0ZXJfa2V5Ym9hcmRfbm90aWZpZXIoJmtleWJvYXJkX25vdGlmaWVyX2Jsb2NrKTsKKwl1bnJlZ2lzdGVyX3Z0X25vdGlmaWVyKCZ2dF9ub3RpZmllcl9ibG9jayk7CiAJYnJhaWxsZV9jbyA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJyYWlsbGVfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX2tleWJvYXJkX25vdGlmaWVyKCZrZXlib2FyZF9ub3RpZmllcl9ibG9jayk7Ci0JcmVnaXN0ZXJfdnRfbm90aWZpZXIoJnZ0X25vdGlmaWVyX2Jsb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotY29uc29sZV9pbml0Y2FsbChicmFpbGxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCA3MzVmNWVhLi5kYTQ5YjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtMjU5LDcgKzI1OSwxMCBAQAogCiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKLQlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gWDg2ICYmIElOUFVUCisJc2VsZWN0IElOUFVUX1BPTExERVYKKwlzZWxlY3QgTkVUCisJc2VsZWN0IFJGS0lMTAogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBhY2Nlc3MgdG8gY2VydGFpbiBzeXN0ZW0gc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDA4NDEwOTUuLjI0NjQ5YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMTY1LDggKzE2NSwxMSBAQAogCQkJCSJmaXJtd2FyZV9ub2RlIik7CiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZhY3BpX2Rldi0+ZGV2LmtvYmosICZkZXYtPmtvYmosCiAJCQkJInBoeXNpY2FsX25vZGUiKTsKLQkJaWYgKGFjcGlfZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCisJCWlmIChhY3BpX2Rldi0+d2FrZXVwLmZsYWdzLnZhbGlkKSB7CiAJCQlkZXZpY2Vfc2V0X3dha2V1cF9jYXBhYmxlKGRldiwgdHJ1ZSk7CisJCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoZGV2LAorCQkJCQkJYWNwaV9kZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMjU3LDExNiArMjYwLDMgQEAKIH0KIAogYXJjaF9pbml0Y2FsbChpbml0X2FjcGlfZGV2aWNlX25vdGlmeSk7Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PUykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TX01PRFVMRSkKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHUzMiBydGNfaGFuZGxlcih2b2lkICpjb250ZXh0KQotewotCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwotCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci0JcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBydGNfd2FrZV9zZXR1cCh2b2lkKQotewotCWFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUlRDLCBydGNfaGFuZGxlciwgTlVMTCk7Ci0JLyoKLQkgKiBBZnRlciB0aGUgUlRDIGhhbmRsZXIgaXMgaW5zdGFsbGVkLCB0aGUgRml4ZWRfUlRDIGV2ZW50IHNob3VsZAotCSAqIGJlIGRpc2FibGVkLiBPbmx5IHdoZW4gdGhlIFJUQyBhbGFybSBpcyBzZXQgd2lsbCBpdCBiZSBlbmFibGVkLgotCSAqLwotCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwotCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0Y193YWtlX29uKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKLQlhY3BpX2VuYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0Y193YWtlX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJ0Y193YWtlX3NldHVwKCkJZG97fXdoaWxlKDApCi0jZGVmaW5lIHJ0Y193YWtlX29uCQlOVUxMCi0jZGVmaW5lIHJ0Y193YWtlX29mZgkJTlVMTAotI2VuZGlmCi0KLS8qIEV2ZXJ5IEFDUEkgcGxhdGZvcm0gaGFzIGEgbWMxNDY4MTggY29tcGF0aWJsZSAiY21vcyBydGMiLiAgSGVyZSB3ZSBmaW5kCi0gKiBpdHMgZGV2aWNlIG5vZGUgYW5kIHBhc3MgZXh0cmEgY29uZmlnIGRhdGEuICBUaGlzIGhlbHBzIGl0cyBkcml2ZXIgdXNlCi0gKiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgbm93LW9ic29sZXRlIG1jMTQ2ODE4IGRpZG4ndCBoYXZlLCBhbmQgaW5mb3JtcyBpdAotICogdGhhdCB0aGlzIGJvYXJkJ3MgUlRDIGlzIHdha2V1cC1jYXBhYmxlIChwZXIgQUNQSSBzcGVjKS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY21vc19ydGNfYm9hcmRfaW5mbyBydGNfaW5mbzsKLQotCi0vKiBQTlAgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCBpbiBhIHN1YnN5c19pbml0Y2FsbCgpOwotICogQUNQSSBzcGVjaWZpZXMgdGhlIFBOUCBJRHMgdG8gdXNlLgotICovCi0jaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBucF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmlkc1tdID0geyAiUE5QMGIwMCIsICJQTlAwYjAxIiwgIlBOUDBiMDIiLCB9OwotCXN0cnVjdCBwbnBfZGV2ICpwbnAgPSB0b19wbnBfZGV2KGRldik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZHMpOyBpKyspIHsKLQkJaWYgKGNvbXBhcmVfcG5wX2lkKHBucC0+aWQsIGlkc1tpXSkgIT0gMCkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9faW5pdCBnZXRfcnRjX2Rldih2b2lkKQotewotCXJldHVybiBidXNfZmluZF9kZXZpY2UoJnBucF9idXNfdHlwZSwgTlVMTCwgTlVMTCwgcG5wX21hdGNoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9ydGNfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9ydGNfZGV2KCk7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2KSB7Ci0JCXJ0Y193YWtlX3NldHVwKCk7Ci0JCXJ0Y19pbmZvLndha2Vfb24gPSBydGNfd2FrZV9vbjsKLQkJcnRjX2luZm8ud2FrZV9vZmYgPSBydGNfd2FrZV9vZmY7Ci0KLQkJLyogd29ya2Fyb3VuZCBidWcgaW4gc29tZSBBQ1BJIHRhYmxlcyAqLwotCQlpZiAoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSAmJiAhYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pIHsKLQkJCURCRygiYm9ndXMgRkFEVCBtb250aF9hbGFybVxuIik7Ci0JCQlhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtID0gMDsKLQkJfQotCi0JCXJ0Y19pbmZvLnJ0Y19kYXlfYWxhcm0gPSBhY3BpX2dibF9GQURULmRheV9hbGFybTsKLQkJcnRjX2luZm8ucnRjX21vbl9hbGFybSA9IGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm07Ci0JCXJ0Y19pbmZvLnJ0Y19jZW50dXJ5ID0gYWNwaV9nYmxfRkFEVC5jZW50dXJ5OwotCi0JCS8qIE5PVEU6ICBTNF9SVENfV0FLRSBpcyBOT1QgY3VycmVudGx5IHVzZWZ1bCB0byBMaW51eCAqLwotCQlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9TNF9SVENfV0FLRSkKLQkJCXByaW50ayhQUkVGSVggIlJUQyBjYW4gd2FrZSBmcm9tIFM0XG4iKTsKLQotCi0JCWRldi0+cGxhdGZvcm1fZGF0YSA9ICZydGNfaW5mbzsKLQotCQkvKiBSVEMgYWx3YXlzIHdha2VzIGZyb20gUzEvUzIvUzMsIGFuZCBvZnRlbiBTNC9TVEQgKi8KLQkJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7Ci0KLQkJcHV0X2RldmljZShkZXYpOwotCX0gZWxzZQotCQlEQkcoIlJUQyB1bmF2YWlsYWJsZT9cbiIpOwotCXJldHVybiAwOwotfQotLyogZG8gdGhpcyBiZXR3ZWVuIFJUQyBzdWJzeXNfaW5pdGNhbGwoKSBhbmQgcnRjX2Ntb3MgZHJpdmVyX2luaXRjYWxsKCkgKi8KLWZzX2luaXRjYWxsKGFjcGlfcnRjX2luaXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCmluZGV4IDRlYmJiYTIuLmJmNWIwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYwpAQCAtMzc3LDYgKzM3NywxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFkZXYtPmhhbmRsZSk7CisKKwlpZiAoZGV2ICYmIGRldmljZV9jYW5fd2FrZXVwKGRldikpCisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShkZXYsIGFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKTsKK30KKwogc3RhdGljIHNzaXplX3QKIGFjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2Uoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCkBAIC00MTEsNiArNDE5LDcgQEAKIAkJfQogCX0KIAlpZiAoZm91bmRfZGV2KSB7CisJCXBoeXNpY2FsX2RldmljZV9lbmFibGVfd2FrZXVwKGZvdW5kX2Rldik7CiAJCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKIAkJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCiAJCQkJCQkJICAgICAgIHN0cnVjdApAQCAtNDI4LDYgKzQzNyw3IEBACiAJCQkJICAgICAgIGRldi0+cG5wLmJ1c19pZCwgZm91bmRfZGV2LT5wbnAuYnVzX2lkKTsKIAkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KIAkJCQkgICAgZm91bmRfZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZDsKKwkJCQlwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChkZXYpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jIGIvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCmluZGV4IDBhNDNjOGUuLjhhNjQ5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBKb2huIEJlbG1vbnRlCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFBoaWxpcCBMYW5nZGFsZQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zMyw3ICszNCw3IEBACiAgKgogICovCiAKLSNkZWZpbmUgVE9TSElCQV9BQ1BJX1ZFUlNJT04JIjAuMTgiCisjZGVmaW5lIFRPU0hJQkFfQUNQSV9WRVJTSU9OCSIwLjE5IgogI2RlZmluZSBQUk9DX0lOVEVSRkFDRV9WRVJTSU9OCTEKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDIsNiArNDMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTkwLDYgKzk0LDcgQEAKICNkZWZpbmUgSENJX1ZJREVPX09VVAkJCTB4MDAxYwogI2RlZmluZSBIQ0lfSE9US0VZX0VWRU5UCQkweDAwMWUKICNkZWZpbmUgSENJX0xDRF9CUklHSFRORVNTCQkweDAwMmEKKyNkZWZpbmUgSENJX1dJUkVMRVNTCQkJMHgwMDU2CiAKIC8qIGZpZWxkIGRlZmluaXRpb25zICovCiAjZGVmaW5lIEhDSV9MQ0RfQlJJR0hUTkVTU19CSVRTCQkzCkBAIC05OCw5ICsxMDMsMTQgQEAKICNkZWZpbmUgSENJX1ZJREVPX09VVF9MQ0QJCTB4MQogI2RlZmluZSBIQ0lfVklERU9fT1VUX0NSVAkJMHgyCiAjZGVmaW5lIEhDSV9WSURFT19PVVRfVFYJCTB4NAorI2RlZmluZSBIQ0lfV0lSRUxFU1NfS0lMTF9TV0lUQ0gJMHgwMQorI2RlZmluZSBIQ0lfV0lSRUxFU1NfQlRfUFJFU0VOVAkJMHgwZgorI2RlZmluZSBIQ0lfV0lSRUxFU1NfQlRfQVRUQUNICQkweDQwCisjZGVmaW5lIEhDSV9XSVJFTEVTU19CVF9QT1dFUgkJMHg4MAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHRvc2hpYmFfZGV2aWNlX2lkc1tdID0gewogCXsiVE9TNjIwMCIsIDB9LAorCXsiVE9TNjIwOCIsIDB9LAogCXsiVE9TMTkwMCIsIDB9LAogCXsiIiwgMH0sCiB9OwpAQCAtMTkzLDcgKzIwMyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyogY29tbW9uIGhjaSB0YXNrcyAoZ2V0IG9yIHNldCBvbmUgdmFsdWUpCisvKiBjb21tb24gaGNpIHRhc2tzIChnZXQgb3Igc2V0IG9uZSBvciB0d28gdmFsdWUpCiAgKgogICogSW4gYWRkaXRpb24gdG8gdGhlIEFDUEkgc3RhdHVzLCB0aGUgSENJIHN5c3RlbSByZXR1cm5zIGEgcmVzdWx0IHdoaWNoCiAgKiBtYXkgYmUgdXNlZnVsIChzdWNoIGFzICJub3Qgc3VwcG9ydGVkIikuCkBAIC0yMTgsNiArMjI4LDE1MiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfd3JpdGUyKHUzMiByZWcsIHUzMiBpbjEsIHUzMiBpbjIsIHUzMiAqcmVzdWx0KQoreworCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfU0VULCByZWcsIGluMSwgaW4yLCAwLCAwIH07CisJdTMyIG91dFtIQ0lfV09SRFNdOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJKnJlc3VsdCA9IChzdGF0dXMgPT0gQUVfT0spID8gb3V0WzBdIDogSENJX0ZBSUxVUkU7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yZWFkMih1MzIgcmVnLCB1MzIgKm91dDEsIHUzMiAqb3V0MiwgdTMyICpyZXN1bHQpCit7CisJdTMyIGluW0hDSV9XT1JEU10gPSB7IEhDSV9HRVQsIHJlZywgKm91dDEsICpvdXQyLCAwLCAwIH07CisJdTMyIG91dFtIQ0lfV09SRFNdOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJKm91dDEgPSBvdXRbMl07CisJKm91dDIgPSBvdXRbM107CisJKnJlc3VsdCA9IChzdGF0dXMgPT0gQUVfT0spID8gb3V0WzBdIDogSENJX0ZBSUxVUkU7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBfZGV2OworCXN0cnVjdCByZmtpbGwgKnJma19kZXY7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBvbGxfZGV2OworCisJY29uc3QgY2hhciAqYnRfbmFtZTsKKwljb25zdCBjaGFyICpyZmtfbmFtZTsKKworCWJvb2wgbGFzdF9yZmtfc3RhdGU7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Cit9OworCitzdGF0aWMgc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgdG9zaGliYV9hY3BpID0geworCS5idF9uYW1lID0gIlRvc2hpYmEgQmx1ZXRvb3RoIiwKKwkucmZrX25hbWUgPSAiVG9zaGliYSBSRktpbGwgU3dpdGNoIiwKKwkubGFzdF9yZmtfc3RhdGUgPSBmYWxzZSwKK307CisKKy8qIEJsdWV0b290aCByZmtpbGwgaGFuZGxlcnMgKi8KKworc3RhdGljIHUzMiBoY2lfZ2V0X2J0X3ByZXNlbnQoYm9vbCAqcHJlc2VudCkKK3sKKwl1MzIgaGNpX3Jlc3VsdDsKKwl1MzIgdmFsdWUsIHZhbHVlMjsKKworCXZhbHVlID0gMDsKKwl2YWx1ZTIgPSAwOworCWhjaV9yZWFkMihIQ0lfV0lSRUxFU1MsICZ2YWx1ZSwgJnZhbHVlMiwgJmhjaV9yZXN1bHQpOworCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKQorCQkqcHJlc2VudCA9ICh2YWx1ZSAmIEhDSV9XSVJFTEVTU19CVF9QUkVTRU5UKSA/IHRydWUgOiBmYWxzZTsKKworCXJldHVybiBoY2lfcmVzdWx0OworfQorCitzdGF0aWMgdTMyIGhjaV9nZXRfYnRfb24oYm9vbCAqb24pCit7CisJdTMyIGhjaV9yZXN1bHQ7CisJdTMyIHZhbHVlLCB2YWx1ZTI7CisKKwl2YWx1ZSA9IDA7CisJdmFsdWUyID0gMHgwMDAxOworCWhjaV9yZWFkMihIQ0lfV0lSRUxFU1MsICZ2YWx1ZSwgJnZhbHVlMiwgJmhjaV9yZXN1bHQpOworCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKQorCQkqb24gPSAodmFsdWUgJiBIQ0lfV0lSRUxFU1NfQlRfUE9XRVIpICYmCisJCSAgICAgICh2YWx1ZSAmIEhDSV9XSVJFTEVTU19CVF9BVFRBQ0gpOworCisJcmV0dXJuIGhjaV9yZXN1bHQ7Cit9CisKK3N0YXRpYyB1MzIgaGNpX2dldF9yYWRpb19zdGF0ZShib29sICpyYWRpb19zdGF0ZSkKK3sKKwl1MzIgaGNpX3Jlc3VsdDsKKwl1MzIgdmFsdWUsIHZhbHVlMjsKKworCXZhbHVlID0gMDsKKwl2YWx1ZTIgPSAweDAwMDE7CisJaGNpX3JlYWQyKEhDSV9XSVJFTEVTUywgJnZhbHVlLCAmdmFsdWUyLCAmaGNpX3Jlc3VsdCk7CisKKwkqcmFkaW9fc3RhdGUgPSB2YWx1ZSAmIEhDSV9XSVJFTEVTU19LSUxMX1NXSVRDSDsKKwlyZXR1cm4gaGNpX3Jlc3VsdDsKK30KKworc3RhdGljIGludCBidF9yZmtpbGxfdG9nZ2xlX3JhZGlvKHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCXUzMiByZXN1bHQxLCByZXN1bHQyOworCXUzMiB2YWx1ZTsKKwlib29sIHJhZGlvX3N0YXRlOworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBkYXRhOworCisJdmFsdWUgPSAoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCk7CisKKwlpZiAoaGNpX2dldF9yYWRpb19zdGF0ZSgmcmFkaW9fc3RhdGUpICE9IEhDSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ6CisJCWlmICghcmFkaW9fc3RhdGUpCisJCQlyZXR1cm4gLUVQRVJNOworCQlicmVhazsKKwljYXNlIFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWhjaV93cml0ZTIoSENJX1dJUkVMRVNTLCB2YWx1ZSwgSENJX1dJUkVMRVNTX0JUX1BPV0VSLCAmcmVzdWx0MSk7CisJaGNpX3dyaXRlMihIQ0lfV0lSRUxFU1MsIHZhbHVlLCBIQ0lfV0lSRUxFU1NfQlRfQVRUQUNILCAmcmVzdWx0Mik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKworCWlmIChyZXN1bHQxICE9IEhDSV9TVUNDRVNTIHx8IHJlc3VsdDIgIT0gSENJX1NVQ0NFU1MpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ0X3BvbGxfcmZraWxsKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldikKK3sKKwlib29sIHN0YXRlX2NoYW5nZWQ7CisJYm9vbCBuZXdfcmZrX3N0YXRlOworCWJvb2wgdmFsdWU7CisJdTMyIGhjaV9yZXN1bHQ7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IHBvbGxfZGV2LT5wcml2YXRlOworCisJaGNpX3Jlc3VsdCA9IGhjaV9nZXRfcmFkaW9fc3RhdGUoJnZhbHVlKTsKKwlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykKKwkJcmV0dXJuOyAvKiBDYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgKi8KKworCW5ld19yZmtfc3RhdGUgPSB2YWx1ZTsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCXN0YXRlX2NoYW5nZWQgPSBuZXdfcmZrX3N0YXRlICE9IGRldi0+bGFzdF9yZmtfc3RhdGU7CisJZGV2LT5sYXN0X3Jma19zdGF0ZSA9IG5ld19yZmtfc3RhdGU7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKworCWlmICh1bmxpa2VseShzdGF0ZV9jaGFuZ2VkKSkgeworCQlyZmtpbGxfZm9yY2Vfc3RhdGUoZGV2LT5yZmtfZGV2LAorCQkJCSAgIG5ld19yZmtfc3RhdGUgPworCQkJCSAgIFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQgOgorCQkJCSAgIFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQpOworCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHBvbGxfZGV2LT5pbnB1dCwgU1dfUkZLSUxMX0FMTCwKKwkJCQkgICAgbmV3X3Jma19zdGF0ZSk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0b3NoaWJhX3Byb2NfZGlyIC8qPSAwKi8gOwogc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2U7CiBzdGF0aWMgaW50IGZvcmNlX2ZhbjsKQEAgLTU0Nyw2ICs3MDMsMTQgQEAKIAogc3RhdGljIHZvaWQgdG9zaGliYV9hY3BpX2V4aXQodm9pZCkKIHsKKwlpZiAodG9zaGliYV9hY3BpLnBvbGxfZGV2KSB7CisJCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZSh0b3NoaWJhX2FjcGkucG9sbF9kZXYpOworCQlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UodG9zaGliYV9hY3BpLnBvbGxfZGV2KTsKKwl9CisKKwlpZiAodG9zaGliYV9hY3BpLnJma19kZXYpCisJCXJma2lsbF91bnJlZ2lzdGVyKHRvc2hpYmFfYWNwaS5yZmtfZGV2KTsKKwogCWlmICh0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UpCiAJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcih0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UpOwogCkBAIC01NTUsNiArNzE5LDggQEAKIAlpZiAodG9zaGliYV9wcm9jX2RpcikKIAkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKIAorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRvc2hpYmFfYWNwaS5wX2Rldik7CisKIAlyZXR1cm47CiB9CiAKQEAgLTU2Miw2ICs3MjgsMTAgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1MzIgaGNpX3Jlc3VsdDsKKwlib29sIGJ0X3ByZXNlbnQ7CisJYm9vbCBidF9vbjsKKwlib29sIHJhZGlvX29uOworCWludCByZXQgPSAwOwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTc4LDYgKzc0OCwxOCBAQAogCSAgICAgICBUT1NISUJBX0FDUElfVkVSU0lPTik7CiAJcHJpbnRrKE1ZX0lORk8gIiAgICBIQ0kgbWV0aG9kOiAlc1xuIiwgbWV0aG9kX2hjaSk7CiAKKwltdXRleF9pbml0KCZ0b3NoaWJhX2FjcGkubXV0ZXgpOworCisJdG9zaGliYV9hY3BpLnBfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidG9zaGliYV9hY3BpIiwKKwkJCQkJCQkgICAgICAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUih0b3NoaWJhX2FjcGkucF9kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIodG9zaGliYV9hY3BpLnBfZGV2KTsKKwkJcHJpbnRrKE1ZX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZVxuIik7CisJCXRvc2hpYmFfYWNwaS5wX2RldiA9IE5VTEw7CisJCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJZm9yY2VfZmFuID0gMDsKIAlrZXlfZXZlbnRfdmFsaWQgPSAwOwogCkBAIC01ODYsMTkgKzc2OCwyMyBAQAogCiAJdG9zaGliYV9wcm9jX2RpciA9IHByb2NfbWtkaXIoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIXRvc2hpYmFfcHJvY19kaXIpIHsKLQkJc3RhdHVzID0gQUVfRVJST1I7CisJCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7CiAJCXRvc2hpYmFfcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CiAJCXN0YXR1cyA9IGFkZF9kZXZpY2UoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQl0b3NoaWJhX2FjcGlfZXhpdCgpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KIAl9CiAKLQl0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJ0b3NoaWJhIixOVUxMLAorCXRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInRvc2hpYmEiLAorCQkJCQkJJnRvc2hpYmFfYWNwaS5wX2Rldi0+ZGV2LAogCQkJCQkJTlVMTCwKIAkJCQkJCSZ0b3NoaWJhX2JhY2tsaWdodF9kYXRhKTsKICAgICAgICAgaWYgKElTX0VSUih0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UpKSB7Ci0JCWludCByZXQgPSBQVFJfRVJSKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSk7CisJCXJldCA9IFBUUl9FUlIodG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlKTsKIAogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciB0b3NoaWJhIGJhY2tsaWdodCBkZXZpY2VcbiIpOwogCQl0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOwpAQCAtNjA3LDcgKzc5Myw2NiBAQAogCX0KICAgICAgICAgdG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMgLSAxOwogCi0JcmV0dXJuIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgPyAwIDogLUVOT0RFVjsKKwkvKiBSZWdpc3RlciByZmtpbGwgc3dpdGNoIGZvciBCbHVldG9vdGggKi8KKwlpZiAoaGNpX2dldF9idF9wcmVzZW50KCZidF9wcmVzZW50KSA9PSBIQ0lfU1VDQ0VTUyAmJiBidF9wcmVzZW50KSB7CisJCXRvc2hpYmFfYWNwaS5yZmtfZGV2ID0gcmZraWxsX2FsbG9jYXRlKCZ0b3NoaWJhX2FjcGkucF9kZXYtPmRldiwKKwkJCQkJCQlSRktJTExfVFlQRV9CTFVFVE9PVEgpOworCQlpZiAoIXRvc2hpYmFfYWNwaS5yZmtfZGV2KSB7CisJCQlwcmludGsoTVlfRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgcmZraWxsIGRldmljZVxuIik7CisJCQl0b3NoaWJhX2FjcGlfZXhpdCgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl0b3NoaWJhX2FjcGkucmZrX2Rldi0+bmFtZSA9IHRvc2hpYmFfYWNwaS5idF9uYW1lOworCQl0b3NoaWJhX2FjcGkucmZrX2Rldi0+dG9nZ2xlX3JhZGlvID0gYnRfcmZraWxsX3RvZ2dsZV9yYWRpbzsKKwkJdG9zaGliYV9hY3BpLnJma19kZXYtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQgPSAxOworCQl0b3NoaWJhX2FjcGkucmZrX2Rldi0+ZGF0YSA9ICZ0b3NoaWJhX2FjcGk7CisKKwkJaWYgKGhjaV9nZXRfYnRfb24oJmJ0X29uKSA9PSBIQ0lfU1VDQ0VTUyAmJiBidF9vbikgeworCQkJdG9zaGliYV9hY3BpLnJma19kZXYtPnN0YXRlID0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwkJfSBlbHNlIGlmIChoY2lfZ2V0X3JhZGlvX3N0YXRlKCZyYWRpb19vbikgPT0gSENJX1NVQ0NFU1MgJiYKKwkJCSAgIHJhZGlvX29uKSB7CisJCQl0b3NoaWJhX2FjcGkucmZrX2Rldi0+c3RhdGUgPSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworCQl9IGVsc2UgeworCQkJdG9zaGliYV9hY3BpLnJma19kZXYtPnN0YXRlID0gUkZLSUxMX1NUQVRFX0hBUkRfQkxPQ0tFRDsKKwkJfQorCisJCXJldCA9IHJma2lsbF9yZWdpc3Rlcih0b3NoaWJhX2FjcGkucmZrX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhNWV9FUlIgInVuYWJsZSB0byByZWdpc3RlciByZmtpbGwgZGV2aWNlXG4iKTsKKwkJCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCS8qIFJlZ2lzdGVyIGlucHV0IGRldmljZSBmb3Iga2lsbCBzd2l0Y2ggKi8KKwl0b3NoaWJhX2FjcGkucG9sbF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCk7CisJaWYgKCF0b3NoaWJhX2FjcGkucG9sbF9kZXYpIHsKKwkJcHJpbnRrKE1ZX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIGtpbGwtc3dpdGNoIGlucHV0IGRldmljZVxuIik7CisJCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0b3NoaWJhX2FjcGkucG9sbF9kZXYtPnByaXZhdGUgPSAmdG9zaGliYV9hY3BpOworCXRvc2hpYmFfYWNwaS5wb2xsX2Rldi0+cG9sbCA9IGJ0X3BvbGxfcmZraWxsOworCXRvc2hpYmFfYWNwaS5wb2xsX2Rldi0+cG9sbF9pbnRlcnZhbCA9IDEwMDA7IC8qIG1zZWNzICovCisKKwl0b3NoaWJhX2FjcGkucG9sbF9kZXYtPmlucHV0LT5uYW1lID0gdG9zaGliYV9hY3BpLnJma19uYW1lOworCXRvc2hpYmFfYWNwaS5wb2xsX2Rldi0+aW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwl0b3NoaWJhX2FjcGkucG9sbF9kZXYtPmlucHV0LT5pZC52ZW5kb3IgPSAweDA5MzA7IC8qIFRvc2hpYmEgVVNCIElEICovCisJc2V0X2JpdChFVl9TVywgdG9zaGliYV9hY3BpLnBvbGxfZGV2LT5pbnB1dC0+ZXZiaXQpOworCXNldF9iaXQoU1dfUkZLSUxMX0FMTCwgdG9zaGliYV9hY3BpLnBvbGxfZGV2LT5pbnB1dC0+c3diaXQpOworCWlucHV0X3JlcG9ydF9zd2l0Y2godG9zaGliYV9hY3BpLnBvbGxfZGV2LT5pbnB1dCwgU1dfUkZLSUxMX0FMTCwgVFJVRSk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKHRvc2hpYmFfYWNwaS5wb2xsX2Rldik7CisJaWYgKHJldCkgeworCQlwcmludGsoTVlfRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIga2lsbC1zd2l0Y2ggaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmZraWxsX2ZyZWUodG9zaGliYV9hY3BpLnJma19kZXYpOworCQl0b3NoaWJhX2FjcGkucmZrX2RldiA9IE5VTEw7CisJCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIG1vZHVsZV9pbml0KHRvc2hpYmFfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IGFlODQ5NDkuLjc4ZmJlYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtNyw3ICs3LDYgQEAKIAlkZXBlbmRzIG9uIEhBU19JT01FTQogCWRlcGVuZHMgb24gQkxPQ0sKIAlkZXBlbmRzIG9uICEoTTMyUiB8fCBNNjhLKSB8fCBCUk9LRU4KLQlkZXBlbmRzIG9uICFTVU40IHx8IEJST0tFTgogCXNlbGVjdCBTQ1NJCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgQVRBIGhhcmQgZGlzaywgQVRBIHRhcGUgZHJpdmUsIEFUQSBDRC1ST00gb3IKQEAgLTQ0OCw4ICs0NDcsMTAgQEAKIAl0cmlzdGF0ZSAiTWFydmVsbCBQQVRBIHN1cHBvcnQgdmlhIGxlZ2FjeSBtb2RlIgogCWRlcGVuZHMgb24gUENJCiAJaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBsaW1pdGVkIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIDg4U0U2MTQ1IEFUQQotCSAgY29udHJvbGxlci4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGltaXRlZCBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OFNFNjF4eCBBVEEKKwkgIGNvbnRyb2xsZXJzLiBJZiB5b3Ugd2lzaCB0byB1c2Ugb25seSB0aGUgU0FUQSBwb3J0cyB0aGVuIHNlbGVjdAorCSAgdGhlIEFIQ0kgZHJpdmVyIGFsb25lLiBJZiB5b3Ugd2lzaCB0byB0aGUgdXNlIHRoZSBQQVRBIHBvcnQgb3IKKwkgIGJvdGggU0FUQSBhbmQgUEFUQSBpbmNsdWRlIHRoaXMgZHJpdmVyLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC02NjEsNyArNjYyLDcgQEAKIAogY29uZmlnIFBBVEFfUExBVEZPUk0KIAl0cmlzdGF0ZSAiR2VuZXJpYyBwbGF0Zm9ybSBkZXZpY2UgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gRU1CRURERUQgfHwgQVJDSF9SUEMgfHwgUFBDIHx8IEhBVkVfUEFUQV9QTEFURk9STQorCWRlcGVuZHMgb24gRU1CRURERUQgfHwgUFBDIHx8IEhBVkVfUEFUQV9QTEFURk9STQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZ2VuZXJpYyBkaXJlY3RseSBjb25uZWN0ZWQgQVRBCiAJICBkZXZpY2VzIGNvbW1vbmx5IGZvdW5kIG9uIGVtYmVkZGVkIHN5c3RlbXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggYzcyOWU2OS4uYWVhZGQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMjY3LDggKzI2Nyw4IEBACiAJCQkJCSAJICogcGVyIFBNIHNsb3QgKi8KIH07CiAKLXN0YXRpYyBpbnQgYWhjaV9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7Ci1zdGF0aWMgaW50IGFoY2lfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIGludCBhaGNpX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOworc3RhdGljIGludCBhaGNpX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBhaGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyBib29sIGFoY2lfcWNfZmlsbF9ydGYoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CkBAIC0zMTYsNiArMzE2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphaGNpX3NkZXZfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfc3dfYWN0aXZpdHksCisJJmRldl9hdHRyX3VubG9hZF9oZWFkcywKIAlOVUxMCiB9OwogCkBAIC00MjAsNyArNDIxLDcgQEAKIAkvKiBib2FyZF9haGNpX212ICovCiAJewogCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19OT19OQ1EgfCBBSENJX0hGTEFHX05PX01TSSB8Ci0JCQkJIEFIQ0lfSEZMQUdfTVZfUEFUQSksCisJCQkJIEFIQ0lfSEZMQUdfTVZfUEFUQSB8IEFIQ0lfSEZMQUdfTk9fUE1QKSwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAogCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEsCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwpAQCAtNDg3LDcgKzQ4OCw5IEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYTA1KSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0gxMCAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2EyNSksIGJvYXJkX2FoY2kgfSwgLyogSUNIMTAgKi8KIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMjQpLCBib2FyZF9haGNpIH0sIC8qIFBDSCBSQUlEICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjI1KSwgYm9hcmRfYWhjaSB9LCAvKiBQQ0ggUkFJRCAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IyYiksIGJvYXJkX2FoY2kgfSwgLyogUENIIFJBSUQgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMmMpLCBib2FyZF9haGNpIH0sIC8qIFBDSCBSQUlEICovCiAKIAkvKiBKTWljcm9uIDM2MC8xLzMvNS82LCBtYXRjaCBjbGFzcyB0byBhdm9pZCBJREUgZnVuY3Rpb24gKi8KIAl7IFBDSV9WRU5ET1JfSURfSk1JQ1JPTiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKQEAgLTYxMCw2ICs2MTMsMTUgQEAKIE1PRFVMRV9QQVJNX0RFU0MoYWhjaV9lbV9tZXNzYWdlcywKIAkiU2V0IEFIQ0kgRW5jbG9zdXJlIE1hbmFnZW1lbnQgTWVzc2FnZSB0eXBlICgwID0gZGlzYWJsZWQsIDEgPSBMRUQiKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfTUFSVkVMTCkgfHwgZGVmaW5lZChDT05GSUdfUEFUQV9NQVJWRUxMX01PRFVMRSkKK3N0YXRpYyBpbnQgbWFydmVsbF9lbmFibGU7CisjZWxzZQorc3RhdGljIGludCBtYXJ2ZWxsX2VuYWJsZSA9IDE7CisjZW5kaWYKK21vZHVsZV9wYXJhbShtYXJ2ZWxsX2VuYWJsZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWFydmVsbF9lbmFibGUsICJNYXJ2ZWxsIFNBVEEgdmlhIEFIQ0kgKDEgPSBlbmFibGVkKSIpOworCisKIHN0YXRpYyBpbmxpbmUgaW50IGFoY2lfbnJfcG9ydHModTMyIGNhcCkKIHsKIAlyZXR1cm4gKGNhcCAmIDB4MWYpICsgMTsKQEAgLTczMiw2ICs3NDQsOCBAQAogCQkJICAgIk1WX0FIQ0kgSEFDSzogcG9ydF9tYXAgJXggLT4gJXhcbiIsCiAJCQkgICBwb3J0X21hcCwKIAkJCSAgIHBvcnRfbWFwICYgbXYpOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJICAiRGlzYWJsaW5nIHlvdXIgUEFUQSBwb3J0LiBVc2UgdGhlIGJvb3Qgb3B0aW9uICdhaGNpLm1hcnZlbGxfZW5hYmxlPTAnIHRvIGF2b2lkIHRoaXMuXG4iKTsKIAogCQlwb3J0X21hcCAmPSBtdjsKIAl9CkBAIC04MDcsMTAgKzgyMSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFoY2lfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IGFoY2lfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKIHsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKLQlpbnQgb2Zmc2V0ID0gYWhjaV9zY3Jfb2Zmc2V0KGFwLCBzY19yZWcpOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobGluay0+YXApOworCWludCBvZmZzZXQgPSBhaGNpX3Njcl9vZmZzZXQobGluay0+YXAsIHNjX3JlZyk7CiAKIAlpZiAob2Zmc2V0KSB7CiAJCSp2YWwgPSByZWFkbChwb3J0X21taW8gKyBvZmZzZXQpOwpAQCAtODE5LDEwICs4MzMsMTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBhaGNpX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBhaGNpX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCiB7Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7Ci0JaW50IG9mZnNldCA9IGFoY2lfc2NyX29mZnNldChhcCwgc2NfcmVnKTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGxpbmstPmFwKTsKKwlpbnQgb2Zmc2V0ID0gYWhjaV9zY3Jfb2Zmc2V0KGxpbmstPmFwLCBzY19yZWcpOwogCiAJaWYgKG9mZnNldCkgewogCQl3cml0ZWwodmFsLCBwb3J0X21taW8gKyBvZmZzZXQpOwpAQCAtOTYwLDcgKzk3NCw3IEBACiAJd3JpdGVsKFBPUlRfSVJRX1BIWVJEWSwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CiAKIAkvKiBnbyBhaGVhZCBhbmQgY2xlYW4gb3V0IFBoeVJkeSBDaGFuZ2UgZnJvbSBTZXJyb3IgdG9vICovCi0JYWhjaV9zY3Jfd3JpdGUoYXAsIFNDUl9FUlJPUiwgKCgxIDw8IDE2KSB8ICgxIDw8IDE4KSkpOworCWFoY2lfc2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0VSUk9SLCAoKDEgPDwgMTYpIHwgKDEgPDwgMTgpKSk7CiAKIAkvKgogIAkgKiBDbGVhciBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGlnbm9yZSBhbGwgUGh5UmR5CkBAIC0xOTI0LDggKzE5MzgsOCBAQAogCWF0YV9laGlfcHVzaF9kZXNjKGhvc3RfZWhpLCAiaXJxX3N0YXQgMHglMDh4IiwgaXJxX3N0YXQpOwogCiAJLyogQUhDSSBuZWVkcyBTRXJyb3IgY2xlYXJlZDsgb3RoZXJ3aXNlLCBpdCBtaWdodCBsb2NrIHVwICovCi0JYWhjaV9zY3JfcmVhZChhcCwgU0NSX0VSUk9SLCAmc2Vycm9yKTsKLQlhaGNpX3Njcl93cml0ZShhcCwgU0NSX0VSUk9SLCBzZXJyb3IpOworCWFoY2lfc2NyX3JlYWQoJmFwLT5saW5rLCBTQ1JfRVJST1IsICZzZXJyb3IpOworCWFoY2lfc2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0VSUk9SLCBzZXJyb3IpOwogCWhvc3RfZWhpLT5zZXJyb3IgfD0gc2Vycm9yOwogCiAJLyogc29tZSBjb250cm9sbGVycyBzZXQgSVJRX0lGX0VSUiBvbiBkZXZpY2UgZXJyb3JzLCBpZ25vcmUgaXQgKi8KQEAgLTIwMTQsNyArMjAyOCw3IEBACiAJaWYgKChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX0hPVFBMVUcpICYmCiAJCShzdGF0dXMgJiBQT1JUX0lSUV9QSFlSRFkpKSB7CiAJCXN0YXR1cyAmPSB+UE9SVF9JUlFfUEhZUkRZOwotCQlhaGNpX3Njcl93cml0ZShhcCwgU0NSX0VSUk9SLCAoKDEgPDwgMTYpIHwgKDEgPDwgMTgpKSk7CisJCWFoY2lfc2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0VSUk9SLCAoKDEgPDwgMTYpIHwgKDEgPDwgMTgpKSk7CiAJfQogCiAJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFBPUlRfSVJRX0VSUk9SKSkgewpAQCAtMjUzMyw2ICsyNTQ3LDEyIEBACiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCisJLyogVGhlIEFIQ0kgZHJpdmVyIGNhbiBvbmx5IGRyaXZlIHRoZSBTQVRBIHBvcnRzLCB0aGUgUEFUQSBkcml2ZXIKKwkgICBjYW4gZHJpdmUgdGhlbSBhbGwgc28gaWYgYm90aCBkcml2ZXJzIGFyZSBzZWxlY3RlZCBtYWtlIHN1cmUKKwkgICBBSENJIHN0YXlzIG91dCBvZiB0aGUgd2F5ICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX01BUlZFTEwgJiYgIW1hcnZlbGxfZW5hYmxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggYjFkMDhhOC4uZTllMzJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xNjUsOCArMTY1LDEwIEBACiBzdGF0aWMgdm9pZCBpY2hfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIGludCBpY2hfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdTggcGlpeF92bXdfYm1kbWFfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotc3RhdGljIGludCBwaWl4X3NpZHByX3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCByZWcsIHUzMiAqdmFsKTsKLXN0YXRpYyBpbnQgcGlpeF9zaWRwcl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHJlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IHBpaXhfc2lkcHJfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcsIHUzMiAqdmFsKTsKK3N0YXRpYyBpbnQgcGlpeF9zaWRwcl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJCXVuc2lnbmVkIGludCByZWcsIHUzMiB2YWwpOwogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpOwogc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKQEAgLTI3OCwxMiArMjgwLDE1IEBACiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUENIKSAqLwogCXsgMHg4MDg2LCAweDNiMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBDSCkgKi8KKwl7IDB4ODA4NiwgMHgzYjIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4XzJwb3J0X3NhdGEgfSwKKwkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChQQ0gpICovCiAJeyAweDgwODYsIDB4M2IyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF8ycG9ydF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUENIKSAqLworCXsgMHg4MDg2LCAweDNiMjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAorCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKFBDSCkgKi8KIAl7IDB4ODA4NiwgMHgzYjJkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4XzJwb3J0X3NhdGEgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChQQ0gpICovCiAJeyAweDgwODYsIDB4M2IyZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhIH0sCi0KIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiAKQEAgLTU4Miw2ICs1ODcsNyBAQAogCXsgMHgyN0RGLCAweDEwMjUsIDB4MDExMCB9LAkvKiBJQ0g3IG9uIEFjZXIgMzY4MldMTWkgKi8KIAl7IDB4MjdERiwgMHgxMDQzLCAweDEyNjcgfSwJLyogSUNINyBvbiBBc3VzIFc1RiAqLwogCXsgMHgyN0RGLCAweDEwM0MsIDB4MzBBMSB9LAkvKiBJQ0g3IG9uIEhQIENvbXBhcSBuYzI0MDAgKi8KKwl7IDB4MjdERiwgMHgxMDcxLCAweEQyMjEgfSwJLyogSUNINyBvbiBIZXJjdWxlcyBFQy05MDAgKi8KIAl7IDB4MjRDQSwgMHgxMDI1LCAweDAwNjEgfSwJLyogSUNINCBvbiBBQ0VSIEFzcGlyZSAyMDIzV0xNaSAqLwogCXsgMHgyNENBLCAweDEwMjUsIDB4MDAzZCB9LAkvKiBJQ0g0IG9uIEFDRVIgVE0yOTAgKi8KIAl7IDB4MjY2RiwgMHgxMDI1LCAweDAwNjYgfSwJLyogSUNINiBvbiBBQ0VSIEFzcGlyZSAxNjk0V0xNaSAqLwpAQCAtODg1LDIzICs4OTEsOSBAQAogICogU2VyaWFsIEFUQSBJbmRleC9EYXRhIFBhaXIgU3VwZXJzZXQgUmVnaXN0ZXJzIGFjY2VzcwogICoKICAqIEJlZ2lubmluZyBmcm9tIElDSDgsIHRoZXJlJ3MgYSBzYW5lIHdheSB0byBhY2Nlc3MgU0NScyB1c2luZyBpbmRleAotICogYW5kIGRhdGEgcmVnaXN0ZXIgcGFpciBsb2NhdGVkIGF0IEJBUjUuICBUaGlzIGNyZWF0ZXMgYW4KLSAqIGludGVyZXN0aW5nIHByb2JsZW0gb2YgbWFwcGluZyB0d28gU0NScyB0byBvbmUgcG9ydC4KLSAqCi0gKiBBbHRob3VnaCB0aGV5IGhhdmUgc2VwYXJhdGUgU0NScywgdGhlIG1hc3RlciBhbmQgc2xhdmUgYXJlbid0Ci0gKiBpbmRlcGVuZGVudCBlbm91Z2ggdG8gYmUgdHJlYXRlZCBhcyBzZXBhcmF0ZSBsaW5rcyAtIGUuZy4gc29mdHJlc2V0Ci0gKiByZXNldHMgYm90aC4gIEFsc28sIHRoZXJlJ3Mgbm8gcHJvdG9jb2wgZGVmaW5lZCBmb3IgaGFyZCByZXNldHRpbmcKLSAqIHNpbmdsZWQgZGV2aWNlIHNoYXJpbmcgdGhlIHZpcnR1YWwgcG9ydCAobm8gZGVmaW5lZCB3YXkgdG8gYWNxdWlyZQotICogZGV2aWNlIHNpZ25hdHVyZSkuICBUaGlzIGlzIHdvcmtlZCBhcm91bmQgYnkgbWVyZ2luZyB0aGUgU0NSIHZhbHVlcwotICogaW50byBvbmUgc2Vuc2libGUgdmFsdWUgYW5kIHJlcXVlc3RpbmcgZm9sbG93LXVwIFNSU1QgYWZ0ZXIKLSAqIGhhcmRyZXNldC4KLSAqCi0gKiBTQ1IgbWVyZ2luZyBpcyBwZXJmb21lZCBpbiBuaWJibGVzIHdoaWNoIGlzIHRoZSB1bml0IGNvbnRlbnRzIGluCi0gKiBTQ1JzIGFyZSBvcmdhbml6ZWQuICBJZiB0d28gdmFsdWVzIGFyZSBlcXVhbCwgdGhlIHZhbHVlIGlzIHVzZWQuCi0gKiBXaGVuIHRoZXkgZGlmZmVyLCBtZXJnZSB0YWJsZSB3aGljaCBsaXN0cyBwcmVjZWRlbmNlIG9mIHBvc3NpYmxlCi0gKiB2YWx1ZXMgaXMgY29uc3VsdGVkIGFuZCB0aGUgZmlyc3QgbWF0Y2ggb3IgdGhlIGxhc3QgZW50cnkgd2hlbgotICogbm90aGluZyBtYXRjaGVzIGlzIHVzZWQuICBXaGVuIHRoZXJlJ3Mgbm8gbWVyZ2UgdGFibGUgZm9yIHRoZQotICogc3BlY2lmaWMgbmliYmxlLCB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBwb3J0IGlzIHVzZWQuCisgKiBhbmQgZGF0YSByZWdpc3RlciBwYWlyIGxvY2F0ZWQgYXQgQkFSNSB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUKKyAqIHNlcGFyYXRlIFNDUnMgZm9yIG1hc3RlciBhbmQgc2xhdmUuICBUaGlzIGlzIGhhbmRsZWQgdXNpbmcgbGliYXRhCisgKiBzbGF2ZV9saW5rIGZhY2lsaXR5LgogICovCiBzdGF0aWMgY29uc3QgaW50IHBpaXhfc2lkeF9tYXBbXSA9IHsKIAlbU0NSX1NUQVRVU10JPSAwLApAQCAtOTA5LDEyMCArOTAxLDM4IEBACiAJW1NDUl9DT05UUk9MXQk9IDEsCiB9OwogCi1zdGF0aWMgdm9pZCBwaWl4X3NpZHByX3NlbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQorc3RhdGljIHZvaWQgcGlpeF9zaWRwcl9zZWwoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgcmVnKQogewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmxpbmstPmFwOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAotCWlvd3JpdGUzMigoKGFwLT5wb3J0X25vICogMiArIGRldi0+ZGV2bm8pIDw8IDgpIHwgcGlpeF9zaWR4X21hcFtyZWddLAorCWlvd3JpdGUzMigoKGFwLT5wb3J0X25vICogMiArIGxpbmstPnBtcCkgPDwgOCkgfCBwaWl4X3NpZHhfbWFwW3JlZ10sCiAJCSAgaHByaXYtPnNpZHByICsgUElJWF9TSURQUl9JRFgpOwogfQogCi1zdGF0aWMgaW50IHBpaXhfc2lkcHJfcmVhZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQorc3RhdGljIGludCBwaWl4X3NpZHByX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgKnZhbCkKIHsKLQlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gZGV2LT5saW5rLT5hcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwotCi0JcGlpeF9zaWRwcl9zZWwoZGV2LCByZWcpOwotCXJldHVybiBpb3JlYWQzMihocHJpdi0+c2lkcHIgKyBQSUlYX1NJRFBSX0RBVEEpOwotfQotCi1zdGF0aWMgdm9pZCBwaWl4X3NpZHByX3dyaXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGRldi0+bGluay0+YXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQotCXBpaXhfc2lkcHJfc2VsKGRldiwgcmVnKTsKLQlpb3dyaXRlMzIodmFsLCBocHJpdi0+c2lkcHIgKyBQSUlYX1NJRFBSX0RBVEEpOwotfQotCi1zdGF0aWMgdTMyIHBpaXhfbWVyZ2Vfc2NyKHUzMiB2YWwwLCB1MzIgdmFsMSwgY29uc3QgaW50ICogY29uc3QgKm1lcmdlX3RibCkKLXsKLQl1MzIgdmFsID0gMDsKLQlpbnQgaSwgbWk7Ci0KLQlmb3IgKGkgPSAwLCBtaSA9IDA7IGkgPCAzMiAvIDQ7IGkrKykgewotCQl1OCBjMCA9ICh2YWwwID4+IChpICogNCkpICYgMHhmOwotCQl1OCBjMSA9ICh2YWwxID4+IChpICogNCkpICYgMHhmOwotCQl1OCBtZXJnZWQgPSBjMDsKLQkJY29uc3QgaW50ICpjdXI7Ci0KLQkJLyogaWYgbm8gbWVyZ2UgcHJlZmVyZW5jZSwgYXNzdW1lIHRoZSBmaXJzdCB2YWx1ZSAqLwotCQljdXIgPSBtZXJnZV90YmxbbWldOwotCQlpZiAoIWN1cikKLQkJCWdvdG8gZG9uZTsKLQkJbWkrKzsKLQotCQkvKiBpZiB0d28gdmFsdWVzIGVxdWFsLCB1c2UgaXQgKi8KLQkJaWYgKGMwID09IGMxKQotCQkJZ290byBkb25lOwotCi0JCS8qIGNob29zZSB0aGUgZmlyc3QgbWF0Y2ggb3IgdGhlIGxhc3QgZnJvbSB0aGUgbWVyZ2UgdGFibGUgKi8KLQkJd2hpbGUgKCpjdXIgIT0gLTEpIHsKLQkJCWlmIChjMCA9PSAqY3VyIHx8IGMxID09ICpjdXIpCi0JCQkJYnJlYWs7Ci0JCQljdXIrKzsKLQkJfQotCQlpZiAoKmN1ciA9PSAtMSkKLQkJCWN1ci0tOwotCQltZXJnZWQgPSAqY3VyOwotCWRvbmU6Ci0JCXZhbCB8PSBtZXJnZWQgPDwgKGkgKiA0KTsKLQl9Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW50IHBpaXhfc2lkcHJfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHJlZywgdTMyICp2YWwpCi17Ci0JY29uc3QgaW50ICogY29uc3Qgc3N0YXR1c19tZXJnZV90YmxbXSA9IHsKLQkJLyogREVUICovIChjb25zdCBpbnQgW10peyAxLCAzLCAwLCA0LCAzLCAtMSB9LAotCQkvKiBTUEQgKi8gKGNvbnN0IGludCBbXSl7IDIsIDEsIDAsIC0xIH0sCi0JCS8qIElQTSAqLyAoY29uc3QgaW50IFtdKXsgNiwgMiwgMSwgMCwgLTEgfSwKLQkJTlVMTCwKLQl9OwotCWNvbnN0IGludCAqIGNvbnN0IHNjb250cm9sX21lcmdlX3RibFtdID0gewotCQkvKiBERVQgKi8gKGNvbnN0IGludCBbXSl7IDEsIDAsIDQsIDAsIC0xIH0sCi0JCS8qIFNQRCAqLyAoY29uc3QgaW50IFtdKXsgMCwgMiwgMSwgMCwgLTEgfSwKLQkJLyogSVBNICovIChjb25zdCBpbnQgW10peyAwLCAxLCAyLCAzLCAwLCAtMSB9LAotCQlOVUxMLAotCX07Ci0JdTMyIHYwLCB2MTsKKwlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gbGluay0+YXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAogCWlmIChyZWcgPj0gQVJSQVlfU0laRShwaWl4X3NpZHhfbWFwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TTEFWRV9QT1NTKSkgewotCQkqdmFsID0gcGlpeF9zaWRwcl9yZWFkKCZhcC0+bGluay5kZXZpY2VbMF0sIHJlZyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXYwID0gcGlpeF9zaWRwcl9yZWFkKCZhcC0+bGluay5kZXZpY2VbMF0sIHJlZyk7Ci0JdjEgPSBwaWl4X3NpZHByX3JlYWQoJmFwLT5saW5rLmRldmljZVsxXSwgcmVnKTsKLQotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBTQ1JfU1RBVFVTOgotCQkqdmFsID0gcGlpeF9tZXJnZV9zY3IodjAsIHYxLCBzc3RhdHVzX21lcmdlX3RibCk7Ci0JCWJyZWFrOwotCWNhc2UgU0NSX0VSUk9SOgotCQkqdmFsID0gdjAgfCB2MTsKLQkJYnJlYWs7Ci0JY2FzZSBTQ1JfQ09OVFJPTDoKLQkJKnZhbCA9IHBpaXhfbWVyZ2Vfc2NyKHYwLCB2MSwgc2NvbnRyb2xfbWVyZ2VfdGJsKTsKLQkJYnJlYWs7Ci0JfQotCisJcGlpeF9zaWRwcl9zZWwobGluaywgcmVnKTsKKwkqdmFsID0gaW9yZWFkMzIoaHByaXYtPnNpZHByICsgUElJWF9TSURQUl9EQVRBKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaWl4X3NpZHByX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBwaWl4X3NpZHByX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCisJCQkJdW5zaWduZWQgaW50IHJlZywgdTMyIHZhbCkKIHsKKwlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gbGluay0+YXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwogCWlmIChyZWcgPj0gQVJSQVlfU0laRShwaWl4X3NpZHhfbWFwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwaWl4X3NpZHByX3dyaXRlKCZhcC0+bGluay5kZXZpY2VbMF0sIHJlZywgdmFsKTsKLQotCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TTEFWRV9QT1NTKQotCQlwaWl4X3NpZHByX3dyaXRlKCZhcC0+bGluay5kZXZpY2VbMV0sIHJlZywgdmFsKTsKLQorCXBpaXhfc2lkcHJfc2VsKGxpbmssIHJlZyk7CisJaW93cml0ZTMyKHZhbCwgaHByaXYtPnNpZHByICsgUElJWF9TSURQUl9EQVRBKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2MywyOCArMTI3MywyOCBAQAogCXJldHVybiBtYXA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwaWl4X2luaXRfc2lkcHIoc3RydWN0IGF0YV9ob3N0ICpob3N0KQorc3RhdGljIGludCBfX2RldmluaXQgcGlpeF9pbml0X3NpZHByKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdC0+ZGV2KTsKIAlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYwID0gJmhvc3QtPnBvcnRzWzBdLT5saW5rLmRldmljZVswXTsKKwlzdHJ1Y3QgYXRhX2xpbmsgKmxpbmswID0gJmhvc3QtPnBvcnRzWzBdLT5saW5rOwogCXUzMiBzY29udHJvbDsKLQlpbnQgaTsKKwlpbnQgaSwgcmM7CiAKIAkvKiBjaGVjayBmb3IgYXZhaWxhYmlsaXR5ICovCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJaWYgKGhwcml2LT5tYXBbaV0gPT0gSURFKQotCQkJcmV0dXJuOworCQkJcmV0dXJuIDA7CiAKIAlpZiAoIShob3N0LT5wb3J0c1swXS0+ZmxhZ3MgJiBQSUlYX0ZMQUdfU0lEUFIpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQSUlYX1NJRFBSX0JBUikgPT0gMCB8fAogCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFBJSVhfU0lEUFJfQkFSKSAhPSBQSUlYX1NJRFBSX0xFTikKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCWlmIChwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCBQSUlYX1NJRFBSX0JBUiwgRFJWX05BTUUpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaHByaXYtPnNpZHByID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtQSUlYX1NJRFBSX0JBUl07CiAKQEAgLTEzOTIsNyArMTMwMiw3IEBACiAJICogR2l2ZSBpdCBhIHRlc3QgZHJpdmUgYnkgaW5oaWJpdGluZyBwb3dlciBzYXZlIG1vZGVzIHdoaWNoCiAJICogd2UnbGwgZG8gYW55d2F5LgogCSAqLwotCXNjb250cm9sID0gcGlpeF9zaWRwcl9yZWFkKGRldjAsIFNDUl9DT05UUk9MKTsKKwlwaWl4X3NpZHByX3Njcl9yZWFkKGxpbmswLCBTQ1JfQ09OVFJPTCwgJnNjb250cm9sKTsKIAogCS8qIGlmIElQTSBpcyBhbHJlYWR5IDMsIFNDUiBhY2Nlc3MgaXMgcHJvYmFibHkgd29ya2luZy4gIERvbid0CiAJICogdW4taW5oaWJpdCBwb3dlciBzYXZlIG1vZGVzIGFzIEJJT1MgbWlnaHQgaGF2ZSBpbmhpYml0ZWQKQEAgLTE0MDAsMTggKzEzMTAsMzAgQEAKIAkgKi8KIAlpZiAoKHNjb250cm9sICYgMHhmMDApICE9IDB4MzAwKSB7CiAJCXNjb250cm9sIHw9IDB4MzAwOwotCQlwaWl4X3NpZHByX3dyaXRlKGRldjAsIFNDUl9DT05UUk9MLCBzY29udHJvbCk7Ci0JCXNjb250cm9sID0gcGlpeF9zaWRwcl9yZWFkKGRldjAsIFNDUl9DT05UUk9MKTsKKwkJcGlpeF9zaWRwcl9zY3Jfd3JpdGUobGluazAsIFNDUl9DT05UUk9MLCBzY29udHJvbCk7CisJCXBpaXhfc2lkcHJfc2NyX3JlYWQobGluazAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpOwogCiAJCWlmICgoc2NvbnRyb2wgJiAweGYwMCkgIT0gMHgzMDApIHsKIAkJCWRldl9wcmludGsoS0VSTl9JTkZPLCBob3N0LT5kZXYsICJTQ1IgYWNjZXNzIHZpYSAiCiAJCQkJICAgIlNJRFBSIGlzIGF2YWlsYWJsZSBidXQgZG9lc24ndCB3b3JrXG4iKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCi0JaG9zdC0+cG9ydHNbMF0tPm9wcyA9ICZwaWl4X3NpZHByX3NhdGFfb3BzOwotCWhvc3QtPnBvcnRzWzFdLT5vcHMgPSAmcGlpeF9zaWRwcl9zYXRhX29wczsKKwkvKiBva2F5LCBTQ1JzIGF2YWlsYWJsZSwgc2V0IG9wcyBhbmQgYXNrIGxpYmF0YSBmb3Igc2xhdmVfbGluayAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWFwLT5vcHMgPSAmcGlpeF9zaWRwcl9zYXRhX29wczsKKworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0xBVkVfUE9TUykgeworCQkJcmMgPSBhdGFfc2xhdmVfbGlua19pbml0KGFwKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcGlpeF9pb2NmZ19iaXQxOF9xdWlyayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTE0OTksNyArMTQyMSw3IEBACiAJICogb2ZmLgogCSAqLwogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJiBwZGV2LT5kZXZpY2UgPT0gMHgyNjUyKSB7Ci0JCWludCByYyA9IHBpaXhfZGlzYWJsZV9haGNpKHBkZXYpOworCQlyYyA9IHBpaXhfZGlzYWJsZV9haGNpKHBkZXYpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfQpAQCAtMTUyMSw3ICsxNDQzLDkgQEAKIAkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgKi8KIAlpZiAocG9ydF9mbGFncyAmIEFUQV9GTEFHX1NBVEEpIHsKIAkJcGlpeF9pbml0X3Bjcyhob3N0LCBwaWl4X21hcF9kYl90YWJsZVtlbnQtPmRyaXZlcl9kYXRhXSk7Ci0JCXBpaXhfaW5pdF9zaWRwcihob3N0KTsKKwkJcmMgPSBwaWl4X2luaXRfc2lkcHIoaG9zdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAl9CiAKIAkvKiBhcHBseSBJT0NGRyBiaXQxOCBxdWlyayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggNzllM2E4ZS4uMWVlOTQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC0xNjMsNiArMTYzLDY3IEBACiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKIAorLyoKKyAqIEl0ZXJhdG9yIGhlbHBlcnMuICBEb24ndCB1c2UgZGlyZWN0bHkuCisgKgorICogTE9DS0lORzoKKyAqIEhvc3QgbG9jayBvciBFSCBjb250ZXh0LgorICovCitzdHJ1Y3QgYXRhX2xpbmsgKl9fYXRhX3BvcnRfbmV4dF9saW5rKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJICAgICAgc3RydWN0IGF0YV9saW5rICpsaW5rLCBib29sIGRldl9vbmx5KQoreworCS8qIE5VTEwgbGluayBpbmRpY2F0ZXMgc3RhcnQgb2YgaXRlcmF0aW9uICovCisJaWYgKCFsaW5rKSB7CisJCWlmIChkZXZfb25seSAmJiBzYXRhX3BtcF9hdHRhY2hlZChhcCkpCisJCQlyZXR1cm4gYXAtPnBtcF9saW5rOworCQlyZXR1cm4gJmFwLT5saW5rOworCX0KKworCS8qIHdlIGp1c3QgaXRlcmF0ZWQgb3ZlciB0aGUgaG9zdCBtYXN0ZXIgbGluaywgd2hhdCdzIG5leHQ/ICovCisJaWYgKGxpbmsgPT0gJmFwLT5saW5rKSB7CisJCWlmICghc2F0YV9wbXBfYXR0YWNoZWQoYXApKSB7CisJCQlpZiAodW5saWtlbHkoYXAtPnNsYXZlX2xpbmspICYmICFkZXZfb25seSkKKwkJCQlyZXR1cm4gYXAtPnNsYXZlX2xpbms7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZXR1cm4gYXAtPnBtcF9saW5rOworCX0KKworCS8qIHNsYXZlX2xpbmsgZXhjbHVkZXMgUE1QICovCisJaWYgKHVubGlrZWx5KGxpbmsgPT0gYXAtPnNsYXZlX2xpbmspKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGl0ZXJhdGUgdG8gdGhlIG5leHQgUE1QIGxpbmsgKi8KKwlpZiAoKytsaW5rIDwgYXAtPnBtcF9saW5rICsgYXAtPm5yX3BtcF9saW5rcykKKwkJcmV0dXJuIGxpbms7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJYXRhX2Rldl9waHlzX2xpbmsgLSBmaW5kIHBoeXNpY2FsIGxpbmsgZm9yIGEgZGV2aWNlCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIGxvb2sgdXAgcGh5c2ljYWwgbGluayBmb3IKKyAqCisgKglMb29rIHVwIHBoeXNpY2FsIGxpbmsgd2hpY2ggQGRldiBpcyBhdHRhY2hlZCB0by4gIE5vdGUgdGhhdAorICoJdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBAZGV2LT5saW5rIG9ubHkgd2hlbiBAZGV2IGlzIG9uIHNsYXZlCisgKglsaW5rLiAgRm9yIGFsbCBvdGhlciBjYXNlcywgaXQncyB0aGUgc2FtZSBhcyBAZGV2LT5saW5rLgorICoKKyAqCUxPQ0tJTkc6CisgKglEb24ndCBjYXJlLgorICoKKyAqCVJFVFVSTlM6CisgKglQb2ludGVyIHRvIHRoZSBmb3VuZCBwaHlzaWNhbCBsaW5rLgorICovCitzdHJ1Y3QgYXRhX2xpbmsgKmF0YV9kZXZfcGh5c19saW5rKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+bGluay0+YXA7CisKKwlpZiAoIWFwLT5zbGF2ZV9saW5rKQorCQlyZXR1cm4gZGV2LT5saW5rOworCWlmICghZGV2LT5kZXZubykKKwkJcmV0dXJuICZhcC0+bGluazsKKwlyZXR1cm4gYXAtPnNsYXZlX2xpbms7Cit9CisKIC8qKgogICoJYXRhX2ZvcmNlX2NibCAtIGZvcmNlIGNhYmxlIHR5cGUgYWNjb3JkaW5nIHRvIGxpYmF0YS5mb3JjZQogICoJQGFwOiBBVEEgcG9ydCBvZiBpbnRlcmVzdApAQCAtMjA2LDcgKzI2Nyw4IEBACiAgKgl0aGUgaG9zdCBsaW5rIGFuZCBhbGwgZmFuLW91dCBwb3J0cyBjb25uZWN0ZWQgdmlhIFBNUC4gIElmIHRoZQogICoJZGV2aWNlIHBhcnQgaXMgc3BlY2lmaWVkIGFzIDAgKGUuZy4gMS4wMDopLCBpdCBzcGVjaWZpZXMgdGhlCiAgKglmaXJzdCBmYW4tb3V0IGxpbmsgbm90IHRoZSBob3N0IGxpbmsuICBEZXZpY2UgbnVtYmVyIDE1IGFsd2F5cwotICoJcG9pbnRzIHRvIHRoZSBob3N0IGxpbmsgd2hldGhlciBQTVAgaXMgYXR0YWNoZWQgb3Igbm90LgorICoJcG9pbnRzIHRvIHRoZSBob3N0IGxpbmsgd2hldGhlciBQTVAgaXMgYXR0YWNoZWQgb3Igbm90LiAgSWYgdGhlCisgKgljb250cm9sbGVyIGhhcyBzbGF2ZSBsaW5rLCBkZXZpY2UgbnVtYmVyIDE2IHBvaW50cyB0byBpdC4KICAqCiAgKglMT0NLSU5HOgogICoJRUggY29udGV4dC4KQEAgLTIxNCwxMiArMjc2LDExIEBACiBzdGF0aWMgdm9pZCBhdGFfZm9yY2VfbGlua19saW1pdHMoc3RydWN0IGF0YV9saW5rICpsaW5rKQogewogCWJvb2wgZGlkX3NwZCA9IGZhbHNlOwotCWludCBsaW5rbm8sIGk7CisJaW50IGxpbmtubyA9IGxpbmstPnBtcDsKKwlpbnQgaTsKIAogCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKQotCQlsaW5rbm8gPSAxNTsKLQllbHNlCi0JCWxpbmtubyA9IGxpbmstPnBtcDsKKwkJbGlua25vICs9IDE1OwogCiAJZm9yIChpID0gYXRhX2ZvcmNlX3RibF9zaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJY29uc3Qgc3RydWN0IGF0YV9mb3JjZV9lbnQgKmZlID0gJmF0YV9mb3JjZV90YmxbaV07CkBAIC0yNjYsOSArMzI3LDkgQEAKIAlpbnQgYWx0X2Rldm5vID0gZGV2bm87CiAJaW50IGk7CiAKLQkvKiBhbGxvdyBuLjE1IGZvciB0aGUgZmlyc3QgZGV2aWNlIGF0dGFjaGVkIHRvIGhvc3QgcG9ydCAqLwotCWlmIChhdGFfaXNfaG9zdF9saW5rKGRldi0+bGluaykgJiYgZGV2bm8gPT0gMCkKLQkJYWx0X2Rldm5vID0gMTU7CisJLyogYWxsb3cgbi4xNS8xNiBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0byBob3N0IHBvcnQgKi8KKwlpZiAoYXRhX2lzX2hvc3RfbGluayhkZXYtPmxpbmspKQorCQlhbHRfZGV2bm8gKz0gMTU7CiAKIAlmb3IgKGkgPSBhdGFfZm9yY2VfdGJsX3NpemUgLSAxOyBpID49IDA7IGktLSkgewogCQljb25zdCBzdHJ1Y3QgYXRhX2ZvcmNlX2VudCAqZmUgPSAmYXRhX2ZvcmNlX3RibFtpXTsKQEAgLTMyMCw5ICszODEsOSBAQAogCWludCBhbHRfZGV2bm8gPSBkZXZubzsKIAlpbnQgaTsKIAotCS8qIGFsbG93IG4uMTUgZm9yIHRoZSBmaXJzdCBkZXZpY2UgYXR0YWNoZWQgdG8gaG9zdCBwb3J0ICovCi0JaWYgKGF0YV9pc19ob3N0X2xpbmsoZGV2LT5saW5rKSAmJiBkZXZubyA9PSAwKQotCQlhbHRfZGV2bm8gPSAxNTsKKwkvKiBhbGxvdyBuLjE1LzE2IGZvciBkZXZpY2VzIGF0dGFjaGVkIHRvIGhvc3QgcG9ydCAqLworCWlmIChhdGFfaXNfaG9zdF9saW5rKGRldi0+bGluaykpCisJCWFsdF9kZXZubyArPSAxNTsKIAogCWZvciAoaSA9IDA7IGkgPCBhdGFfZm9yY2VfdGJsX3NpemU7IGkrKykgewogCQljb25zdCBzdHJ1Y3QgYXRhX2ZvcmNlX2VudCAqZmUgPSAmYXRhX2ZvcmNlX3RibFtpXTsKQEAgLTI2ODEsNyArMjc0Miw3IEBACiAJCXJldHVybjsKIAlzYXRhX3Njcl9yZWFkKGxpbmssIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpOwogCi0JaWYgKGF0YV9saW5rX29ubGluZShsaW5rKSkgeworCWlmIChhdGFfcGh5c19saW5rX29ubGluZShsaW5rKSkgewogCQl0bXAgPSAoc3N0YXR1cyA+PiA0KSAmIDB4ZjsKIAkJYXRhX2xpbmtfcHJpbnRrKGxpbmssIEtFUk5fSU5GTywKIAkJCQkiU0FUQSBsaW5rIHVwICVzIChTU3RhdHVzICVYIFNDb250cm9sICVYKVxuIiwKQEAgLTMzNzIsNiArMzQzMywxMiBAQAogCXVuc2lnbmVkIGxvbmcgbm9kZXZfZGVhZGxpbmUgPSBhdGFfZGVhZGxpbmUoc3RhcnQsIEFUQV9UTU9VVF9GRl9XQUlUKTsKIAlpbnQgd2FybmVkID0gMDsKIAorCS8qIFNsYXZlIHJlYWRpbmVzcyBjYW4ndCBiZSB0ZXN0ZWQgc2VwYXJhdGVseSBmcm9tIG1hc3Rlci4gIE9uCisJICogTS9TIGVtdWxhdGlvbiBjb25maWd1cmF0aW9uLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQKKwkgKiBvbmx5IG9uIHRoZSBtYXN0ZXIgYW5kIGl0IHdpbGwgaGFuZGxlIGJvdGggbWFzdGVyIGFuZCBzbGF2ZS4KKwkgKi8KKwlXQVJOX09OKGxpbmsgPT0gbGluay0+YXAtPnNsYXZlX2xpbmspOworCiAJaWYgKHRpbWVfYWZ0ZXIobm9kZXZfZGVhZGxpbmUsIGRlYWRsaW5lKSkKIAkJbm9kZXZfZGVhZGxpbmUgPSBkZWFkbGluZTsKIApAQCAtMzU5Myw3ICszNjYwLDcgQEAKIAl9CiAKIAkvKiBubyBwb2ludCBpbiB0cnlpbmcgc29mdHJlc2V0IG9uIG9mZmxpbmUgbGluayAqLwotCWlmIChhdGFfbGlua19vZmZsaW5lKGxpbmspKQorCWlmIChhdGFfcGh5c19saW5rX29mZmxpbmUobGluaykpCiAJCWVoYy0+aS5hY3Rpb24gJj0gfkFUQV9FSF9TT0ZUUkVTRVQ7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NzEsNyArMzczOCw3IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIAkvKiBpZiBsaW5rIGlzIG9mZmxpbmUgbm90aGluZyBtb3JlIHRvIGRvICovCi0JaWYgKGF0YV9saW5rX29mZmxpbmUobGluaykpCisJaWYgKGF0YV9waHlzX2xpbmtfb2ZmbGluZShsaW5rKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBMaW5rIGlzIG9ubGluZS4gIEZyb20gdGhpcyBwb2ludCwgLUVOT0RFViB0b28gaXMgYW4gZXJyb3IuICovCkBAIC00ODY4LDEwICs0OTM1LDggQEAKIGludCBzYXRhX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyICp2YWwpCiB7CiAJaWYgKGF0YV9pc19ob3N0X2xpbmsobGluaykpIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwotCiAJCWlmIChzYXRhX3Njcl92YWxpZChsaW5rKSkKLQkJCXJldHVybiBhcC0+b3BzLT5zY3JfcmVhZChhcCwgcmVnLCB2YWwpOworCQkJcmV0dXJuIGxpbmstPmFwLT5vcHMtPnNjcl9yZWFkKGxpbmssIHJlZywgdmFsKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtNDg5NywxMCArNDk2Miw4IEBACiBpbnQgc2F0YV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcmVnLCB1MzIgdmFsKQogewogCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKSB7Ci0JCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKLQogCQlpZiAoc2F0YV9zY3JfdmFsaWQobGluaykpCi0JCQlyZXR1cm4gYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCByZWcsIHZhbCk7CisJCQlyZXR1cm4gbGluay0+YXAtPm9wcy0+c2NyX3dyaXRlKGxpbmssIHJlZywgdmFsKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtNDkyNSwxMyArNDk4OCwxMiBAQAogaW50IHNhdGFfc2NyX3dyaXRlX2ZsdXNoKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyIHZhbCkKIHsKIAlpZiAoYXRhX2lzX2hvc3RfbGluayhsaW5rKSkgewotCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJCWludCByYzsKIAogCQlpZiAoc2F0YV9zY3JfdmFsaWQobGluaykpIHsKLQkJCXJjID0gYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCByZWcsIHZhbCk7CisJCQlyYyA9IGxpbmstPmFwLT5vcHMtPnNjcl93cml0ZShsaW5rLCByZWcsIHZhbCk7CiAJCQlpZiAocmMgPT0gMCkKLQkJCQlyYyA9IGFwLT5vcHMtPnNjcl9yZWFkKGFwLCByZWcsICZ2YWwpOworCQkJCXJjID0gbGluay0+YXAtPm9wcy0+c2NyX3JlYWQobGluaywgcmVnLCAmdmFsKTsKIAkJCXJldHVybiByYzsKIAkJfQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC00OTQxLDcgKzUwMDMsNyBAQAogfQogCiAvKioKLSAqCWF0YV9saW5rX29ubGluZSAtIHRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gbGluayBpcyBvbmxpbmUKKyAqCWF0YV9waHlzX2xpbmtfb25saW5lIC0gdGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rIGlzIG9ubGluZQogICoJQGxpbms6IEFUQSBsaW5rIHRvIHRlc3QKICAqCiAgKglUZXN0IHdoZXRoZXIgQGxpbmsgaXMgb25saW5lLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucwpAQCAtNDk1MiwyMCArNTAxNCwyMCBAQAogICoJTm9uZS4KICAqCiAgKglSRVRVUk5TOgotICoJMSBpZiB0aGUgcG9ydCBvbmxpbmUgc3RhdHVzIGlzIGF2YWlsYWJsZSBhbmQgb25saW5lLgorICoJVHJ1ZSBpZiB0aGUgcG9ydCBvbmxpbmUgc3RhdHVzIGlzIGF2YWlsYWJsZSBhbmQgb25saW5lLgogICovCi1pbnQgYXRhX2xpbmtfb25saW5lKHN0cnVjdCBhdGFfbGluayAqbGluaykKK2Jvb2wgYXRhX3BoeXNfbGlua19vbmxpbmUoc3RydWN0IGF0YV9saW5rICpsaW5rKQogewogCXUzMiBzc3RhdHVzOwogCiAJaWYgKHNhdGFfc2NyX3JlYWQobGluaywgU0NSX1NUQVRVUywgJnNzdGF0dXMpID09IDAgJiYKIAkgICAgKHNzdGF0dXMgJiAweGYpID09IDB4MykKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogLyoqCi0gKglhdGFfbGlua19vZmZsaW5lIC0gdGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rIGlzIG9mZmxpbmUKKyAqCWF0YV9waHlzX2xpbmtfb2ZmbGluZSAtIHRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gbGluayBpcyBvZmZsaW5lCiAgKglAbGluazogQVRBIGxpbmsgdG8gdGVzdAogICoKICAqCVRlc3Qgd2hldGhlciBAbGluayBpcyBvZmZsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KQEAgLTQ5NzYsMTYgKzUwMzgsNjggQEAKICAqCU5vbmUuCiAgKgogICoJUkVUVVJOUzoKLSAqCTEgaWYgdGhlIHBvcnQgb2ZmbGluZSBzdGF0dXMgaXMgYXZhaWxhYmxlIGFuZCBvZmZsaW5lLgorICoJVHJ1ZSBpZiB0aGUgcG9ydCBvZmZsaW5lIHN0YXR1cyBpcyBhdmFpbGFibGUgYW5kIG9mZmxpbmUuCiAgKi8KLWludCBhdGFfbGlua19vZmZsaW5lKHN0cnVjdCBhdGFfbGluayAqbGluaykKK2Jvb2wgYXRhX3BoeXNfbGlua19vZmZsaW5lKHN0cnVjdCBhdGFfbGluayAqbGluaykKIHsKIAl1MzIgc3N0YXR1czsKIAogCWlmIChzYXRhX3Njcl9yZWFkKGxpbmssIFNDUl9TVEFUVVMsICZzc3RhdHVzKSA9PSAwICYmCiAJICAgIChzc3RhdHVzICYgMHhmKSAhPSAweDMpCi0JCXJldHVybiAxOwotCXJldHVybiAwOworCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICoJYXRhX2xpbmtfb25saW5lIC0gdGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBsaW5rIGlzIG9ubGluZQorICoJQGxpbms6IEFUQSBsaW5rIHRvIHRlc3QKKyAqCisgKglUZXN0IHdoZXRoZXIgQGxpbmsgaXMgb25saW5lLiAgVGhpcyBpcyBpZGVudGljYWwgdG8KKyAqCWF0YV9waHlzX2xpbmtfb25saW5lKCkgd2hlbiB0aGVyZSdzIG5vIHNsYXZlIGxpbmsuICBXaGVuCisgKgl0aGVyZSdzIGEgc2xhdmUgbGluaywgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24KKyAqCXRoZSBtYXN0ZXIgbGluayBhbmQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgTS9TIGxpbmtzIGlzCisgKglvbmxpbmUuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCVRydWUgaWYgdGhlIHBvcnQgb25saW5lIHN0YXR1cyBpcyBhdmFpbGFibGUgYW5kIG9ubGluZS4KKyAqLworYm9vbCBhdGFfbGlua19vbmxpbmUoc3RydWN0IGF0YV9saW5rICpsaW5rKQoreworCXN0cnVjdCBhdGFfbGluayAqc2xhdmUgPSBsaW5rLT5hcC0+c2xhdmVfbGluazsKKworCVdBUk5fT04obGluayA9PSBzbGF2ZSk7CS8qIHNob3VsZG4ndCBiZSBjYWxsZWQgb24gc2xhdmUgbGluayAqLworCisJcmV0dXJuIGF0YV9waHlzX2xpbmtfb25saW5lKGxpbmspIHx8CisJCShzbGF2ZSAmJiBhdGFfcGh5c19saW5rX29ubGluZShzbGF2ZSkpOworfQorCisvKioKKyAqCWF0YV9saW5rX29mZmxpbmUgLSB0ZXN0IHdoZXRoZXIgdGhlIGdpdmVuIGxpbmsgaXMgb2ZmbGluZQorICoJQGxpbms6IEFUQSBsaW5rIHRvIHRlc3QKKyAqCisgKglUZXN0IHdoZXRoZXIgQGxpbmsgaXMgb2ZmbGluZS4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvCisgKglhdGFfcGh5c19saW5rX29mZmxpbmUoKSB3aGVuIHRoZXJlJ3Mgbm8gc2xhdmUgbGluay4gIFdoZW4KKyAqCXRoZXJlJ3MgYSBzbGF2ZSBsaW5rLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbgorICoJdGhlIG1hc3RlciBsaW5rIGFuZCB3aWxsIHJldHVybiB0cnVlIGlmIGJvdGggTS9TIGxpbmtzIGFyZQorICoJb2ZmbGluZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglSRVRVUk5TOgorICoJVHJ1ZSBpZiB0aGUgcG9ydCBvZmZsaW5lIHN0YXR1cyBpcyBhdmFpbGFibGUgYW5kIG9mZmxpbmUuCisgKi8KK2Jvb2wgYXRhX2xpbmtfb2ZmbGluZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmspCit7CisJc3RydWN0IGF0YV9saW5rICpzbGF2ZSA9IGxpbmstPmFwLT5zbGF2ZV9saW5rOworCisJV0FSTl9PTihsaW5rID09IHNsYXZlKTsJLyogc2hvdWxkbid0IGJlIGNhbGxlZCBvbiBzbGF2ZSBsaW5rICovCisKKwlyZXR1cm4gYXRhX3BoeXNfbGlua19vZmZsaW5lKGxpbmspICYmCisJCSghc2xhdmUgfHwgYXRhX3BoeXNfbGlua19vZmZsaW5lKHNsYXZlKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTUxMjcsMTEgKzUyNDEsMTEgQEAKICAqLwogdm9pZCBhdGFfZGV2X2luaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRhX2xpbmsgKmxpbmsgPSBkZXYtPmxpbms7CisJc3RydWN0IGF0YV9saW5rICpsaW5rID0gYXRhX2Rldl9waHlzX2xpbmsoZGV2KTsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIFNBVEEgc3BkIGxpbWl0IGlzIGJvdW5kIHRvIHRoZSBmaXJzdCBkZXZpY2UgKi8KKwkvKiBTQVRBIHNwZCBsaW1pdCBpcyBib3VuZCB0byB0aGUgYXR0YWNoZWQgZGV2aWNlLCByZXNldCB0b2dldGhlciAqLwogCWxpbmstPnNhdGFfc3BkX2xpbWl0ID0gbGluay0+aHdfc2F0YV9zcGRfbGltaXQ7CiAJbGluay0+c2F0YV9zcGQgPSAwOwogCkBAIC01MjY0LDYgKzUzNzgsNyBAQAogCUlOSVRfV09SSygmYXAtPnNjc2lfcmVzY2FuX3Rhc2ssIGF0YV9zY3NpX2Rldl9yZXNjYW4pOwogCUlOSVRfTElTVF9IRUFEKCZhcC0+ZWhfZG9uZV9xKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcC0+ZWhfd2FpdF9xKTsKKwlpbml0X2NvbXBsZXRpb24oJmFwLT5wYXJrX3JlcV9wZW5kaW5nKTsKIAlpbml0X3RpbWVyX2RlZmVycmFibGUoJmFwLT5mYXN0ZHJhaW5fdGltZXIpOwogCWFwLT5mYXN0ZHJhaW5fdGltZXIuZnVuY3Rpb24gPSBhdGFfZWhfZmFzdGRyYWluX3RpbWVyZm47CiAJYXAtPmZhc3RkcmFpbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYXA7CkBAIC01Mjk0LDYgKzU0MDksNyBAQAogCQkJc2NzaV9ob3N0X3B1dChhcC0+c2NzaV9ob3N0KTsKIAogCQlrZnJlZShhcC0+cG1wX2xpbmspOworCQlrZnJlZShhcC0+c2xhdmVfbGluayk7CiAJCWtmcmVlKGFwKTsKIAkJaG9zdC0+cG9ydHNbaV0gPSBOVUxMOwogCX0KQEAgLTU0MTQsNiArNTUzMCw2OCBAQAogCXJldHVybiBob3N0OwogfQogCisvKioKKyAqCWF0YV9zbGF2ZV9saW5rX2luaXQgLSBpbml0aWFsaXplIHNsYXZlIGxpbmsKKyAqCUBhcDogcG9ydCB0byBpbml0aWFsaXplIHNsYXZlIGxpbmsgZm9yCisgKgorICoJQ3JlYXRlIGFuZCBpbml0aWFsaXplIHNsYXZlIGxpbmsgZm9yIEBhcC4gIFRoaXMgZW5hYmxlcyBzbGF2ZQorICoJbGluayBoYW5kbGluZyBvbiB0aGUgcG9ydC4KKyAqCisgKglJbiBsaWJhdGEsIGEgcG9ydCBjb250YWlucyBsaW5rcyBhbmQgYSBsaW5rIGNvbnRhaW5zIGRldmljZXMuCisgKglUaGVyZSBpcyBzaW5nbGUgaG9zdCBsaW5rIGJ1dCBpZiBhIFBNUCBpcyBhdHRhY2hlZCB0byBpdCwKKyAqCXRoZXJlIGNhbiBiZSBtdWx0aXBsZSBmYW4tb3V0IGxpbmtzLiAgT24gU0FUQSwgdGhlcmUncyB1c3VhbGx5CisgKglhIHNpbmdsZSBkZXZpY2UgY29ubmVjdGVkIHRvIGEgbGluayBidXQgUEFUQSBhbmQgU0FUQQorICoJY29udHJvbGxlcnMgZW11bGF0aW5nIFRGIGJhc2VkIGludGVyZmFjZSBjYW4gaGF2ZSB0d28gLSBtYXN0ZXIKKyAqCWFuZCBzbGF2ZS4KKyAqCisgKglIb3dldmVyLCB0aGVyZSBhcmUgYSBmZXcgY29udHJvbGxlcnMgd2hpY2ggZG9uJ3QgZml0IGludG8gdGhpcworICoJYWJzdHJhY3Rpb24gdG9vIHdlbGwgLSBTQVRBIGNvbnRyb2xsZXJzIHdoaWNoIGVtdWxhdGUgVEYKKyAqCWludGVyZmFjZSB3aXRoIGJvdGggbWFzdGVyIGFuZCBzbGF2ZSBkZXZpY2VzIGJ1dCBhbHNvIGhhdmUKKyAqCXNlcGFyYXRlIFNDUiByZWdpc3RlciBzZXRzIGZvciBlYWNoIGRldmljZS4gIFRoZXNlIGNvbnRyb2xsZXJzCisgKgluZWVkIHNlcGFyYXRlIGxpbmtzIGZvciBwaHlzaWNhbCBsaW5rIGhhbmRsaW5nCisgKgkoZS5nLiBvbmxpbmVuZXNzLCBsaW5rIHNwZWVkKSBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhCisgKgl0cmFkaXRpb25hbCBNL1MgY29udHJvbGxlciBmb3IgZXZlcnl0aGluZyBlbHNlIChlLmcuIGNvbW1hbmQKKyAqCWlzc3VlLCBzb2Z0cmVzZXQpLgorICoKKyAqCXNsYXZlX2xpbmsgaXMgbGliYXRhJ3Mgd2F5IG9mIGhhbmRsaW5nIHRoaXMgY2xhc3Mgb2YKKyAqCWNvbnRyb2xsZXJzIHdpdGhvdXQgaW1wYWN0aW5nIGNvcmUgbGF5ZXIgdG9vIG11Y2guICBGb3IKKyAqCWFueXRoaW5nIG90aGVyIHRoYW4gcGh5c2ljYWwgbGluayBoYW5kbGluZywgdGhlIGRlZmF1bHQgaG9zdAorICoJbGluayBpcyB1c2VkIGZvciBib3RoIG1hc3RlciBhbmQgc2xhdmUuICBGb3IgcGh5c2ljYWwgbGluaworICoJaGFuZGxpbmcsIHNlcGFyYXRlIEBhcC0+c2xhdmVfbGluayBpcyB1c2VkLiAgQWxsIGRpcnR5IGRldGFpbHMKKyAqCWFyZSBpbXBsZW1lbnRlZCBpbnNpZGUgbGliYXRhIGNvcmUgbGF5ZXIuICBGcm9tIExMRCdzIFBPViwgdGhlCisgKglvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBwcmVyZXNldCwgaGFyZHJlc2V0IGFuZCBwb3N0cmVzZXQgYXJlCisgKgljYWxsZWQgb25jZSBtb3JlIGZvciB0aGUgc2xhdmUgbGluaywgc28gdGhlIHJlc2V0IHNlcXVlbmNlCisgKglsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCisgKgorICoJcHJlcmVzZXQoTSkgLT4gcHJlcmVzZXQoUykgLT4gaGFyZHJlc2V0KE0pIC0+IGhhcmRyZXNldChTKSAtPgorICoJc29mdHJlc2V0KE0pIC0+IHBvc3RyZXNldChNKSAtPiBwb3N0cmVzZXQoUykKKyAqCisgKglOb3RlIHRoYXQgc29mdHJlc2V0IGlzIGNhbGxlZCBvbmx5IGZvciB0aGUgbWFzdGVyLiAgU29mdHJlc2V0CisgKglyZXNldHMgYm90aCBNL1MgYnkgZGVmaW5pdGlvbiwgc28gU1JTVCBvbiBtYXN0ZXIgc2hvdWxkIGhhbmRsZQorICoJYm90aCAodGhlIHN0YW5kYXJkIG1ldGhvZCB3aWxsIHdvcmsganVzdCBmaW5lKS4KKyAqCisgKglMT0NLSU5HOgorICoJU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaG9zdCBpcyByZWdpc3RlcmVkLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgYXRhX3NsYXZlX2xpbmtfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfbGluayAqbGluazsKKworCVdBUk5fT04oYXAtPnNsYXZlX2xpbmspOworCVdBUk5fT04oYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE1QKTsKKworCWxpbmsgPSBremFsbG9jKHNpemVvZigqbGluayksIEdGUF9LRVJORUwpOworCWlmICghbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdGFfbGlua19pbml0KGFwLCBsaW5rLCAxKTsKKwlhcC0+c2xhdmVfbGluayA9IGxpbms7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGF0YV9ob3N0X3N0b3Aoc3RydWN0IGRldmljZSAqZ2VuZGV2LCB2b2lkICpyZXMpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGdlbmRldik7CkBAIC01NjQwLDYgKzU4MTgsOCBAQAogCiAJCS8qIGluaXQgc2F0YV9zcGRfbGltaXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgKi8KIAkJc2F0YV9saW5rX2luaXRfc3BkKCZhcC0+bGluayk7CisJCWlmIChhcC0+c2xhdmVfbGluaykKKwkJCXNhdGFfbGlua19pbml0X3NwZChhcC0+c2xhdmVfbGluayk7CiAKIAkJLyogcHJpbnQgcGVyLXBvcnQgaW5mbyB0byBkbWVzZyAqLwogCQl4ZmVyX21hc2sgPSBhdGFfcGFja194ZmVybWFzayhhcC0+cGlvX21hc2ssIGFwLT5td2RtYV9tYXNrLApAQCAtNjI2MCwxMCArNjQ0MCwxMiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9wb3J0X29wcyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfZHVtbXlfcG9ydF9vcHMpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2R1bW15X3BvcnRfaW5mbyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2F0YV9wb3J0X25leHRfbGluayk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX2Jpb3NfcGFyYW0pOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2hvc3RfaW5pdCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9hbGxvYyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9hbGxvY19waW5mbyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2xhdmVfbGlua19pbml0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X3N0YXJ0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X3JlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X2FjdGl2YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKaW5kZXggYzFkYjJmMi4uYTkzMjQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTc5LDYgKzgwLDggQEAKIAkgKi8KIAlBVEFfRUhfUFJFUkVTRVRfVElNRU9VVAkJPSAxMDAwMCwKIAlBVEFfRUhfRkFTVERSQUlOX0lOVEVSVkFMCT0gIDMwMDAsCisKKwlBVEFfRUhfVUFfVFJJRVMJCQk9IDUsCiB9OwogCiAvKiBUaGUgZm9sbG93aW5nIHRhYmxlIGRldGVybWluZXMgaG93IHdlIHNlcXVlbmNlIHJlc2V0cy4gIEVhY2ggZW50cnkKQEAgLTQ1NywyOSArNDYwLDI5IEBACiAgKglSRVRVUk5TOgogICoJRUhfSEFORExFRCBvciBFSF9OT1RfSEFORExFRAogICovCi1lbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuIGF0YV9zY3NpX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCitlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gYXRhX3Njc2lfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KGhvc3QpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKLQllbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuIHJldDsKKwllbnVtIGJsa19laF90aW1lcl9yZXR1cm4gcmV0OwogCiAJRFBSSU5USygiRU5URVJcbiIpOwogCiAJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKLQkJcmV0ID0gRUhfTk9UX0hBTkRMRUQ7CisJCXJldCA9IEJMS19FSF9OT1RfSEFORExFRDsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gRUhfSEFORExFRDsKKwlyZXQgPSBCTEtfRUhfSEFORExFRDsKIAlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwogCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+bGluay5hY3RpdmVfdGFnKTsKIAlpZiAocWMpIHsKIAkJV0FSTl9PTihxYy0+c2NzaWNtZCAhPSBjbWQpOwogCQlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19FSF9TQ0hFRFVMRUQ7CiAJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfVElNRU9VVDsKLQkJcmV0ID0gRUhfTk9UX0hBTkRMRUQ7CisJCXJldCA9IEJMS19FSF9OT1RfSEFORExFRDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCkBAIC04MzEsNyArODM0LDcgQEAKIAkgKiBOb3RlIHRoYXQgQVRBX1FDRkxBR19GQUlMRUQgaXMgdW5jb25kaXRpb25hbGx5IHNldCBhZnRlcgogCSAqIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzLgogCSAqLwotCXNjc2lfcmVxX2Fib3J0X2NtZChxYy0+c2NzaWNtZCk7CisJYmxrX2Fib3J0X3JlcXVlc3QocWMtPnNjc2ljbWQtPnJlcXVlc3QpOwogfQogCiAvKioKQEAgLTEzNTcsNiArMTM2MCwzNyBAQAogfQogCiAvKioKKyAqCWF0YXBpX2VoX3R1ciAtIHBlcmZvcm0gQVRBUEkgVEVTVF9VTklUX1JFQURZCisgKglAZGV2OiB0YXJnZXQgQVRBUEkgZGV2aWNlCisgKglAcl9zZW5zZV9rZXk6IG91dCBwYXJhbWV0ZXIgZm9yIHNlbnNlX2tleQorICoKKyAqCVBlcmZvcm0gQVRBUEkgVEVTVF9VTklUX1JFQURZLgorICoKKyAqCUxPQ0tJTkc6CisgKglFSCBjb250ZXh0IChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIEFDX0VSUl8qIG1hc2sgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdGFwaV9laF90dXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdTggKnJfc2Vuc2Vfa2V5KQoreworCXU4IGNkYltBVEFQSV9DREJfTEVOXSA9IHsgVEVTVF9VTklUX1JFQURZLCAwLCAwLCAwLCAwLCAwIH07CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2s7CisKKwlhdGFfdGZfaW5pdChkZXYsICZ0Zik7CisKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi5jb21tYW5kID0gQVRBX0NNRF9QQUNLRVQ7CisJdGYucHJvdG9jb2wgPSBBVEFQSV9QUk9UX05PREFUQTsKKworCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIGNkYiwgRE1BX05PTkUsIE5VTEwsIDAsIDApOworCWlmIChlcnJfbWFzayA9PSBBQ19FUlJfREVWKQorCQkqcl9zZW5zZV9rZXkgPSB0Zi5mZWF0dXJlID4+IDQ7CisJcmV0dXJuIGVycl9tYXNrOworfQorCisvKioKICAqCWF0YXBpX2VoX3JlcXVlc3Rfc2Vuc2UgLSBwZXJmb3JtIEFUQVBJIFJFUVVFU1RfU0VOU0UKICAqCUBkZXY6IGRldmljZSB0byBwZXJmb3JtIFJFUVVFU1RfU0VOU0UgdG8KICAqCUBzZW5zZV9idWY6IHJlc3VsdCBzZW5zZSBkYXRhIGJ1ZmZlciAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFIGJ5dGVzIGxvbmcpCkBAIC0xNzU2LDcgKzE3OTAsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZWhfc3BlZWRfZG93bihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJCXVuc2lnbmVkIGludCBlZmxhZ3MsIHVuc2lnbmVkIGludCBlcnJfbWFzaykKIHsKLQlzdHJ1Y3QgYXRhX2xpbmsgKmxpbmsgPSBkZXYtPmxpbms7CisJc3RydWN0IGF0YV9saW5rICpsaW5rID0gYXRhX2Rldl9waHlzX2xpbmsoZGV2KTsKIAlpbnQgeGZlcl9vayA9IDA7CiAJdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAJdW5zaWduZWQgaW50IGFjdGlvbiA9IDA7CkBAIC0xODgwLDcgKzE5MTQsOCBAQAogCWZvciAodGFnID0gMDsgdGFnIDwgQVRBX01BWF9RVUVVRTsgdGFnKyspIHsKIAkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOwogCi0JCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fCBxYy0+ZGV2LT5saW5rICE9IGxpbmspCisJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fAorCQkgICAgYXRhX2Rldl9waHlzX2xpbmsocWMtPmRldikgIT0gbGluaykKIAkJCWNvbnRpbnVlOwogCiAJCS8qIGluaGVyaXQgdXBwZXIgbGV2ZWwgZXJyX21hc2sgKi8KQEAgLTE5NjcsNiArMjAwMiwyMyBAQAogCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApCiAJCWF0YV9laF9saW5rX2F1dG9wc3kobGluayk7CiAKKwkvKiBIYW5kbGUgdGhlIGZyaWdnaW5nIHNsYXZlIGxpbmsuICBBdXRvcHN5IGlzIGRvbmUgc2ltaWxhcmx5CisJICogYnV0IGFjdGlvbnMgYW5kIGZsYWdzIGFyZSB0cmFuc2ZlcnJlZCBvdmVyIHRvIHRoZSBtYXN0ZXIKKwkgKiBsaW5rIGFuZCBoYW5kbGVkIGZyb20gdGhlcmUuCisJICovCisJaWYgKGFwLT5zbGF2ZV9saW5rKSB7CisJCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqbWVoYyA9ICZhcC0+bGluay5laF9jb250ZXh0OworCQlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKnNlaGMgPSAmYXAtPnNsYXZlX2xpbmstPmVoX2NvbnRleHQ7CisKKwkJYXRhX2VoX2xpbmtfYXV0b3BzeShhcC0+c2xhdmVfbGluayk7CisKKwkJYXRhX2VoX2Fib3V0X3RvX2RvKGFwLT5zbGF2ZV9saW5rLCBOVUxMLCBBVEFfRUhfQUxMX0FDVElPTlMpOworCQltZWhjLT5pLmFjdGlvbgkJfD0gc2VoYy0+aS5hY3Rpb247CisJCW1laGMtPmkuZGV2X2FjdGlvblsxXQl8PSBzZWhjLT5pLmRldl9hY3Rpb25bMV07CisJCW1laGMtPmkuZmxhZ3MJCXw9IHNlaGMtPmkuZmxhZ3M7CisJCWF0YV9laF9kb25lKGFwLT5zbGF2ZV9saW5rLCBOVUxMLCBBVEFfRUhfQUxMX0FDVElPTlMpOworCX0KKwogCS8qIEF1dG9wc3kgb2YgZmFub3V0IHBvcnRzIGNhbiBhZmZlY3QgaG9zdCBsaW5rIGF1dG9wc3kuCiAJICogUGVyZm9ybSBob3N0IGxpbmsgYXV0b3BzeSBsYXN0LgogCSAqLwpAQCAtMjAwMSw3ICsyMDUzLDggQEAKIAlmb3IgKHRhZyA9IDA7IHRhZyA8IEFUQV9NQVhfUVVFVUU7IHRhZysrKSB7CiAJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBfX2F0YV9xY19mcm9tX3RhZyhhcCwgdGFnKTsKIAotCQlpZiAoIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkgfHwgcWMtPmRldi0+bGluayAhPSBsaW5rIHx8CisJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fAorCQkgICAgYXRhX2Rldl9waHlzX2xpbmsocWMtPmRldikgIT0gbGluayB8fAogCQkgICAgKChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1FVSUVUKSAmJgogCQkgICAgIHFjLT5lcnJfbWFzayA9PSBBQ19FUlJfREVWKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjA2OCw3ICsyMTIxLDcgQEAKIAkJY2hhciBjZGJfYnVmWzcwXSA9ICIiOwogCiAJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fAotCQkgICAgcWMtPmRldi0+bGluayAhPSBsaW5rIHx8ICFxYy0+ZXJyX21hc2spCisJCSAgICBhdGFfZGV2X3BoeXNfbGluayhxYy0+ZGV2KSAhPSBsaW5rIHx8ICFxYy0+ZXJyX21hc2spCiAJCQljb250aW51ZTsKIAogCQlpZiAocWMtPmRtYV9kaXIgIT0gRE1BX05PTkUpIHsKQEAgLTIxNjAsMTIgKzIyMTMsMTQgQEAKIH0KIAogc3RhdGljIGludCBhdGFfZG9fcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCBhdGFfcmVzZXRfZm5fdCByZXNldCwKLQkJCXVuc2lnbmVkIGludCAqY2xhc3NlcywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKKwkJCXVuc2lnbmVkIGludCAqY2xhc3NlcywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSwKKwkJCWJvb2wgY2xlYXJfY2xhc3NlcykKIHsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCi0JYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKLQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IEFUQV9ERVZfVU5LTk9XTjsKKwlpZiAoY2xlYXJfY2xhc3NlcykKKwkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykKKwkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX1VOS05PV047CiAKIAlyZXR1cm4gcmVzZXQobGluaywgY2xhc3NlcywgZGVhZGxpbmUpOwogfQpAQCAtMjE4NywxNyArMjI0MiwyMCBAQAogCQkgYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0LCBhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0KQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKKwlzdHJ1Y3QgYXRhX2xpbmsgKnNsYXZlID0gYXAtPnNsYXZlX2xpbms7CiAJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKnNlaGMgPSAmc2xhdmUtPmVoX2NvbnRleHQ7CiAJdW5zaWduZWQgaW50ICpjbGFzc2VzID0gZWhjLT5jbGFzc2VzOwogCXVuc2lnbmVkIGludCBsZmxhZ3MgPSBsaW5rLT5mbGFnczsKIAlpbnQgdmVyYm9zZSA9ICEoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9RVUlFVCk7CiAJaW50IG1heF90cmllcyA9IDAsIHRyeSA9IDA7CisJc3RydWN0IGF0YV9saW5rICpmYWlsZWRfbGluazsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUsIG5vdzsKIAlhdGFfcmVzZXRfZm5fdCByZXNldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBzc3RhdHVzOwotCWludCBucl9rbm93biwgcmM7CisJaW50IG5yX3Vua25vd24sIHJjOwogCiAJLyoKIAkgKiBQcmVwYXJlIHRvIHJlc2V0CkBAIC0yMjUyLDggKzIzMTAsMzAgQEAKIAl9CiAKIAlpZiAocHJlcmVzZXQpIHsKLQkJcmMgPSBwcmVyZXNldChsaW5rLAotCQkJICAgICAgYXRhX2RlYWRsaW5lKGppZmZpZXMsIEFUQV9FSF9QUkVSRVNFVF9USU1FT1VUKSk7CisJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUgPSBhdGFfZGVhZGxpbmUoamlmZmllcywKKwkJCQkJCSAgICAgIEFUQV9FSF9QUkVSRVNFVF9USU1FT1VUKTsKKworCQlpZiAoc2xhdmUpIHsKKwkJCXNlaGMtPmkuYWN0aW9uICY9IH5BVEFfRUhfUkVTRVQ7CisJCQlzZWhjLT5pLmFjdGlvbiB8PSBlaGMtPmkuYWN0aW9uOworCQl9CisKKwkJcmMgPSBwcmVyZXNldChsaW5rLCBkZWFkbGluZSk7CisKKwkJLyogSWYgcHJlc2VudCwgZG8gcHJlcmVzZXQgb24gc2xhdmUgbGluayB0b28uICBSZXNldAorCQkgKiBpcyBza2lwcGVkIGlmZiBib3RoIG1hc3RlciBhbmQgc2xhdmUgbGlua3MgcmVwb3J0CisJCSAqIC1FTk9FTlQgb3IgY2xlYXIgQVRBX0VIX1JFU0VULgorCQkgKi8KKwkJaWYgKHNsYXZlICYmIChyYyA9PSAwIHx8IHJjID09IC1FTk9FTlQpKSB7CisJCQlpbnQgdG1wOworCisJCQl0bXAgPSBwcmVyZXNldChzbGF2ZSwgZGVhZGxpbmUpOworCQkJaWYgKHRtcCAhPSAtRU5PRU5UKQorCQkJCXJjID0gdG1wOworCisJCQllaGMtPmkuYWN0aW9uIHw9IHNlaGMtPmkuYWN0aW9uOworCQl9CisKIAkJaWYgKHJjKSB7CiAJCQlpZiAocmMgPT0gLUVOT0VOVCkgewogCQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0RFQlVHLApAQCAtMjMwMiwyNSArMjM4Miw1MSBAQAogCQllbHNlCiAJCQllaGMtPmkuZmxhZ3MgfD0gQVRBX0VISV9ESURfU09GVFJFU0VUOwogCi0JCXJjID0gYXRhX2RvX3Jlc2V0KGxpbmssIHJlc2V0LCBjbGFzc2VzLCBkZWFkbGluZSk7Ci0JCWlmIChyYyAmJiByYyAhPSAtRUFHQUlOKQorCQlyYyA9IGF0YV9kb19yZXNldChsaW5rLCByZXNldCwgY2xhc3NlcywgZGVhZGxpbmUsIHRydWUpOworCQlpZiAocmMgJiYgcmMgIT0gLUVBR0FJTikgeworCQkJZmFpbGVkX2xpbmsgPSBsaW5rOwogCQkJZ290byBmYWlsOworCQl9CiAKKwkJLyogaGFyZHJlc2V0IHNsYXZlIGxpbmsgaWYgZXhpc3RlbnQgKi8KKwkJaWYgKHNsYXZlICYmIHJlc2V0ID09IGhhcmRyZXNldCkgeworCQkJaW50IHRtcDsKKworCQkJaWYgKHZlcmJvc2UpCisJCQkJYXRhX2xpbmtfcHJpbnRrKHNsYXZlLCBLRVJOX0lORk8sCisJCQkJCQkiaGFyZCByZXNldHRpbmcgbGlua1xuIik7CisKKwkJCWF0YV9laF9hYm91dF90b19kbyhzbGF2ZSwgTlVMTCwgQVRBX0VIX1JFU0VUKTsKKwkJCXRtcCA9IGF0YV9kb19yZXNldChzbGF2ZSwgcmVzZXQsIGNsYXNzZXMsIGRlYWRsaW5lLAorCQkJCQkgICBmYWxzZSk7CisJCQlzd2l0Y2ggKHRtcCkgeworCQkJY2FzZSAtRUFHQUlOOgorCQkJCXJjID0gLUVBR0FJTjsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZmFpbGVkX2xpbmsgPSBzbGF2ZTsKKwkJCQlyYyA9IHRtcDsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKworCQkvKiBwZXJmb3JtIGZvbGxvdy11cCBTUlNUIGlmIG5lY2Vzc2FyeSAqLwogCQlpZiAocmVzZXQgPT0gaGFyZHJlc2V0ICYmCiAJCSAgICBhdGFfZWhfZm9sbG93dXBfc3JzdF9uZWVkZWQobGluaywgcmMsIGNsYXNzZXMpKSB7Ci0JCQkvKiBva2F5LCBsZXQncyBkbyBmb2xsb3ctdXAgc29mdHJlc2V0ICovCiAJCQlyZXNldCA9IHNvZnRyZXNldDsKIAogCQkJaWYgKCFyZXNldCkgewogCQkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwKIAkJCQkJCSJmb2xsb3ctdXAgc29mdHJlc2V0IHJlcXVpcmVkICIKIAkJCQkJCSJidXQgbm8gc29mdHJlc2V0IGF2YWxpYWJsZVxuIik7CisJCQkJZmFpbGVkX2xpbmsgPSBsaW5rOwogCQkJCXJjID0gLUVJTlZBTDsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CiAKIAkJCWF0YV9laF9hYm91dF90b19kbyhsaW5rLCBOVUxMLCBBVEFfRUhfUkVTRVQpOwotCQkJcmMgPSBhdGFfZG9fcmVzZXQobGluaywgcmVzZXQsIGNsYXNzZXMsIGRlYWRsaW5lKTsKKwkJCXJjID0gYXRhX2RvX3Jlc2V0KGxpbmssIHJlc2V0LCBjbGFzc2VzLCBkZWFkbGluZSwgdHJ1ZSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAodmVyYm9zZSkKQEAgLTIzNDEsNyArMjQ0Nyw3IEBACiAJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwogCQlkZXYtPmZsYWdzICY9IH5BVEFfREZMQUdfU0xFRVBJTkc7CiAKLQkJaWYgKGF0YV9saW5rX29mZmxpbmUobGluaykpCisJCWlmIChhdGFfcGh5c19saW5rX29mZmxpbmUoYXRhX2Rldl9waHlzX2xpbmsoZGV2KSkpCiAJCQljb250aW51ZTsKIAogCQkvKiBhcHBseSBjbGFzcyBvdmVycmlkZSAqLwpAQCAtMjM1NCw2ICsyNDYwLDggQEAKIAkvKiByZWNvcmQgY3VycmVudCBsaW5rIHNwZWVkICovCiAJaWYgKHNhdGFfc2NyX3JlYWQobGluaywgU0NSX1NUQVRVUywgJnNzdGF0dXMpID09IDApCiAJCWxpbmstPnNhdGFfc3BkID0gKHNzdGF0dXMgPj4gNCkgJiAweGY7CisJaWYgKHNsYXZlICYmIHNhdGFfc2NyX3JlYWQoc2xhdmUsIFNDUl9TVEFUVVMsICZzc3RhdHVzKSA9PSAwKQorCQlzbGF2ZS0+c2F0YV9zcGQgPSAoc3N0YXR1cyA+PiA0KSAmIDB4ZjsKIAogCS8qIHRoYXcgdGhlIHBvcnQgKi8KIAlpZiAoYXRhX2lzX2hvc3RfbGluayhsaW5rKSkKQEAgLTIzNjYsMTIgKzI0NzQsMTcgQEAKIAkgKiByZXNldCBhbmQgaGVyZS4gIFRoaXMgcmFjZSBpcyBtZWRpYXRlZCBieSBjcm9zcyBjaGVja2luZwogCSAqIGxpbmsgb25saW5lbmVzcyBhbmQgY2xhc3NpZmljYXRpb24gcmVzdWx0IGxhdGVyLgogCSAqLwotCWlmIChwb3N0cmVzZXQpCisJaWYgKHBvc3RyZXNldCkgewogCQlwb3N0cmVzZXQobGluaywgY2xhc3Nlcyk7CisJCWlmIChzbGF2ZSkKKwkJCXBvc3RyZXNldChzbGF2ZSwgY2xhc3Nlcyk7CisJfQogCiAJLyogY2xlYXIgY2FjaGVkIFNFcnJvciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKGxpbmstPmFwLT5sb2NrLCBmbGFncyk7CiAJbGluay0+ZWhfaW5mby5zZXJyb3IgPSAwOworCWlmIChzbGF2ZSkKKwkJc2xhdmUtPmVoX2luZm8uc2Vycm9yID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxpbmstPmFwLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBNYWtlIHN1cmUgb25saW5lbmVzcyBhbmQgY2xhc3NpZmljYXRpb24gcmVzdWx0IGNvcnJlc3BvbmQuCkBAIC0yMzgxLDE5ICsyNDk0LDIxIEBACiAJICogbGluayBvbmxpbmVuZXNzIGFuZCBjbGFzc2lmaWNhdGlvbiByZXN1bHQsIHRob3NlIGNvbmRpdGlvbnMKIAkgKiBjYW4gYmUgcmVsaWFibHkgZGV0ZWN0ZWQgYW5kIHJldHJpZWQuCiAJICovCi0JbnJfa25vd24gPSAwOworCW5yX3Vua25vd24gPSAwOwogCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKIAkJLyogY29udmVydCBhbGwgQVRBX0RFVl9VTktOT1dOIHRvIEFUQV9ERVZfTk9ORSAqLwotCQlpZiAoY2xhc3Nlc1tkZXYtPmRldm5vXSA9PSBBVEFfREVWX1VOS05PV04pCisJCWlmIChjbGFzc2VzW2Rldi0+ZGV2bm9dID09IEFUQV9ERVZfVU5LTk9XTikgewogCQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IEFUQV9ERVZfTk9ORTsKLQkJZWxzZQotCQkJbnJfa25vd24rKzsKKwkJCWlmIChhdGFfcGh5c19saW5rX29ubGluZShhdGFfZGV2X3BoeXNfbGluayhkZXYpKSkKKwkJCQlucl91bmtub3duKys7CisJCX0KIAl9CiAKLQlpZiAoY2xhc3NpZnkgJiYgIW5yX2tub3duICYmIGF0YV9saW5rX29ubGluZShsaW5rKSkgeworCWlmIChjbGFzc2lmeSAmJiBucl91bmtub3duKSB7CiAJCWlmICh0cnkgPCBtYXhfdHJpZXMpIHsKIAkJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsICJsaW5rIG9ubGluZSBidXQgIgogCQkJCSAgICAgICAiZGV2aWNlIG1pc2NsYXNzaWZpZWQsIHJldHJ5aW5nXG4iKTsKKwkJCWZhaWxlZF9saW5rID0gbGluazsKIAkJCXJjID0gLUVBR0FJTjsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtMjQwNCw2ICsyNTE5LDggQEAKIAogCS8qIHJlc2V0IHN1Y2Nlc3NmdWwsIHNjaGVkdWxlIHJldmFsaWRhdGlvbiAqLwogCWF0YV9laF9kb25lKGxpbmssIE5VTEwsIEFUQV9FSF9SRVNFVCk7CisJaWYgKHNsYXZlKQorCQlhdGFfZWhfZG9uZShzbGF2ZSwgTlVMTCwgQVRBX0VIX1JFU0VUKTsKIAllaGMtPmxhc3RfcmVzZXQgPSBqaWZmaWVzOwogCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX1JFVkFMSURBVEU7CiAKQEAgLTI0MTEsNiArMjUyOCw4IEBACiAgb3V0OgogCS8qIGNsZWFyIGhvdHBsdWcgZmxhZyAqLwogCWVoYy0+aS5mbGFncyAmPSB+QVRBX0VISV9IT1RQTFVHR0VEOworCWlmIChzbGF2ZSkKKwkJc2VoYy0+aS5mbGFncyAmPSB+QVRBX0VISV9IT1RQTFVHR0VEOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfUkVTRVRUSU5HOwpAQCAtMjQzMSw3ICsyNTUwLDcgQEAKIAlpZiAodGltZV9iZWZvcmUobm93LCBkZWFkbGluZSkpIHsKIAkJdW5zaWduZWQgbG9uZyBkZWx0YSA9IGRlYWRsaW5lIC0gbm93OwogCi0JCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX1dBUk5JTkcsCisJCWF0YV9saW5rX3ByaW50ayhmYWlsZWRfbGluaywgS0VSTl9XQVJOSU5HLAogCQkJInJlc2V0IGZhaWxlZCAoZXJybm89JWQpLCByZXRyeWluZyBpbiAldSBzZWNzXG4iLAogCQkJcmMsIERJVl9ST1VORF9VUChqaWZmaWVzX3RvX21zZWNzKGRlbHRhKSwgMTAwMCkpOwogCkBAIC0yNDM5LDEzICsyNTU4LDkyIEBACiAJCQlkZWx0YSA9IHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKGRlbHRhKTsKIAl9CiAKLQlpZiAocmMgPT0gLUVQSVBFIHx8IHRyeSA9PSBtYXhfdHJpZXMgLSAxKQorCWlmICh0cnkgPT0gbWF4X3RyaWVzIC0gMSkgewogCQlzYXRhX2Rvd25fc3BkX2xpbWl0KGxpbmspOworCQlpZiAoc2xhdmUpCisJCQlzYXRhX2Rvd25fc3BkX2xpbWl0KHNsYXZlKTsKKwl9IGVsc2UgaWYgKHJjID09IC1FUElQRSkKKwkJc2F0YV9kb3duX3NwZF9saW1pdChmYWlsZWRfbGluayk7CisKIAlpZiAoaGFyZHJlc2V0KQogCQlyZXNldCA9IGhhcmRyZXNldDsKIAlnb3RvIHJldHJ5OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgYXRhX2VoX3B1bGxfcGFya19hY3Rpb24oc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2xpbmsgKmxpbms7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFuIGV4dGVuZGVkIHZlcnNpb24gb2YKKwkgKiBhdGFfZWhfYWJvdXRfdG9fZG8oKSBzcGVjaWFsbHkgY3JhZnRlZCB0byBhY2NvbW1vZGF0ZSB0aGUKKwkgKiByZXF1aXJlbWVudHMgb2YgQVRBX0VIX1BBUksgaGFuZGxpbmcuIFNpbmNlIHRoZSBFSCB0aHJlYWQKKwkgKiBkb2VzIG5vdCBsZWF2ZSB0aGUgZG8ge30gd2hpbGUgKCkgbG9vcCBpbiBhdGFfZWhfcmVjb3ZlciBhcworCSAqIGxvbmcgYXMgdGhlIHRpbWVvdXQgZm9yIGEgcGFyayByZXF1ZXN0IHRvICpvbmUqIGRldmljZSBvbgorCSAqIHRoZSBwb3J0IGhhcyBub3QgZXhwaXJlZCwgYW5kIHNpbmNlIHdlIHN0aWxsIHdhbnQgdG8gcGljaworCSAqIHVwIHBhcmsgcmVxdWVzdHMgdG8gb3RoZXIgZGV2aWNlcyBvbiB0aGUgc2FtZSBwb3J0IG9yCisJICogdGltZW91dCB1cGRhdGVzIGZvciB0aGUgc2FtZSBkZXZpY2UsIHdlIGhhdmUgdG8gcHVsbAorCSAqIEFUQV9FSF9QQVJLIGFjdGlvbnMgZnJvbSBlaF9pbmZvIGludG8gZWhfY29udGV4dC5pCisJICogb3Vyc2VsdmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzIG92ZXIgdGhlIGxvb3AuCisJICoKKwkgKiBBZGRpdGlvbmFsbHksIGFsbCB3cml0ZSBhY2Nlc3NlcyB0byAmYXAtPnBhcmtfcmVxX3BlbmRpbmcKKwkgKiB0aHJvdWdoIElOSVRfQ09NUExFVElPTigpIChzZWUgYmVsb3cpIG9yIGNvbXBsZXRlX2FsbCgpCisJICogKHNlZSBhdGFfc2NzaV9wYXJrX3N0b3JlKCkpIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGhvc3QgbG9jay4KKwkgKiBBcyBhIHJlc3VsdCB3ZSBoYXZlIHRoYXQgcGFya19yZXFfcGVuZGluZy5kb25lIGlzIHplcm8gb24KKwkgKiBleGl0IGZyb20gdGhpcyBmdW5jdGlvbiwgaS5lLiB3aGVuIEFUQV9FSF9QQVJLIGFjdGlvbnMgZm9yCisJICogKmFsbCogZGV2aWNlcyBvbiBwb3J0IGFwIGhhdmUgYmVlbiBwdWxsZWQgaW50byB0aGUKKwkgKiByZXNwZWN0aXZlIGVoX2NvbnRleHQgc3RydWN0cy4gSWYsIGFuZCBvbmx5IGlmLAorCSAqIHBhcmtfcmVxX3BlbmRpbmcuZG9uZSBpcyBub24temVybyBieSB0aGUgdGltZSB3ZSByZWFjaAorCSAqIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgpLCBhbm90aGVyIEFUQV9FSF9QQVJLIGFjdGlvbgorCSAqIGhhcyBiZWVuIHNjaGVkdWxlZCBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBkZXZpY2VzIG9uIHBvcnQKKwkgKiBhcCBhbmQgd2UgaGF2ZSB0byBjeWNsZSBvdmVyIHRoZSBkbyB7fSB3aGlsZSAoKSBsb29wIGluCisJICogYXRhX2VoX3JlY292ZXIoKSBhZ2Fpbi4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisJSU5JVF9DT01QTEVUSU9OKGFwLT5wYXJrX3JlcV9wZW5kaW5nKTsKKwlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJCWF0YV9saW5rX2Zvcl9lYWNoX2RldihkZXYsIGxpbmspIHsKKwkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmxpbmstPmVoX2luZm87CisKKwkJCWxpbmstPmVoX2NvbnRleHQuaS5kZXZfYWN0aW9uW2Rldi0+ZGV2bm9dIHw9CisJCQkJZWhpLT5kZXZfYWN0aW9uW2Rldi0+ZGV2bm9dICYgQVRBX0VIX1BBUks7CisJCQlhdGFfZWhfY2xlYXJfYWN0aW9uKGxpbmssIGRldiwgZWhpLCBBVEFfRUhfUEFSSyk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGFfZWhfcGFya19pc3N1ZV9jbWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgaW50IHBhcmspCit7CisJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmZGV2LT5saW5rLT5laF9jb250ZXh0OworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisJdW5zaWduZWQgaW50IGVycl9tYXNrOworCisJYXRhX3RmX2luaXQoZGV2LCAmdGYpOworCWlmIChwYXJrKSB7CisJCWVoYy0+dW5sb2FkZWRfbWFzayB8PSAxIDw8IGRldi0+ZGV2bm87CisJCXRmLmNvbW1hbmQgPSBBVEFfQ01EX0lETEVJTU1FRElBVEU7CisJCXRmLmZlYXR1cmUgPSAweDQ0OworCQl0Zi5sYmFsID0gMHg0YzsKKwkJdGYubGJhbSA9IDB4NGU7CisJCXRmLmxiYWggPSAweDU1OworCX0gZWxzZSB7CisJCWVoYy0+dW5sb2FkZWRfbWFzayAmPSB+KDEgPDwgZGV2LT5kZXZubyk7CisJCXRmLmNvbW1hbmQgPSBBVEFfQ01EX0NIS19QT1dFUjsKKwl9CisKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfREVWSUNFIHwgQVRBX1RGTEFHX0lTQUREUjsKKwl0Zi5wcm90b2NvbCB8PSBBVEFfUFJPVF9OT0RBVEE7CisJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDAsIDApOworCWlmIChwYXJrICYmIChlcnJfbWFzayB8fCB0Zi5sYmFsICE9IDB4YzQpKSB7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJoZWFkIHVubG9hZCBmYWlsZWQhXG4iKTsKKwkJZWhjLT51bmxvYWRlZF9tYXNrICY9IH4oMSA8PCBkZXYtPmRldm5vKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYXRhX2VoX3JldmFsaWRhdGVfYW5kX2F0dGFjaChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCiAJCQkJCXN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KQogewpAQCAtMjQ3Miw3ICsyNjcwLDcgQEAKIAkJaWYgKChhY3Rpb24gJiBBVEFfRUhfUkVWQUxJREFURSkgJiYgYXRhX2Rldl9lbmFibGVkKGRldikpIHsKIAkJCVdBUk5fT04oZGV2LT5jbGFzcyA9PSBBVEFfREVWX1BNUCk7CiAKLQkJCWlmIChhdGFfbGlua19vZmZsaW5lKGxpbmspKSB7CisJCQlpZiAoYXRhX3BoeXNfbGlua19vZmZsaW5lKGF0YV9kZXZfcGh5c19saW5rKGRldikpKSB7CiAJCQkJcmMgPSAtRUlPOwogCQkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjYxMCw2ICsyODA4LDUzIEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqCWF0YXBpX2VoX2NsZWFyX3VhIC0gQ2xlYXIgQVRBUEkgVU5JVCBBVFRFTlRJT04gYWZ0ZXIgcmVzZXQKKyAqCUBkZXY6IEFUQVBJIGRldmljZSB0byBjbGVhciBVQSBmb3IKKyAqCisgKglSZXNldHMgYW5kIG90aGVyIG9wZXJhdGlvbnMgY2FuIG1ha2UgYW4gQVRBUEkgZGV2aWNlIHJhaXNlCisgKglVTklUIEFUVEVOVElPTiB3aGljaCBjYXVzZXMgdGhlIG5leHQgb3BlcmF0aW9uIHRvIGZhaWwuICBUaGlzCisgKglmdW5jdGlvbiBjbGVhcnMgVUEuCisgKgorICoJTE9DS0lORzoKKyAqCUVIIGNvbnRleHQgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgYXRhcGlfZWhfY2xlYXJfdWEoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVEFfRUhfVUFfVFJJRVM7IGkrKykgeworCQl1OCBzZW5zZV9idWZmZXJbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKKwkJdTggc2Vuc2Vfa2V5ID0gMDsKKwkJdW5zaWduZWQgaW50IGVycl9tYXNrOworCisJCWVycl9tYXNrID0gYXRhcGlfZWhfdHVyKGRldiwgJnNlbnNlX2tleSk7CisJCWlmIChlcnJfbWFzayAhPSAwICYmIGVycl9tYXNrICE9IEFDX0VSUl9ERVYpIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiVEVTVF9VTklUX1JFQURZICIKKwkJCQkiZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoIWVycl9tYXNrIHx8IHNlbnNlX2tleSAhPSBVTklUX0FUVEVOVElPTikKKwkJCXJldHVybiAwOworCisJCWVycl9tYXNrID0gYXRhcGlfZWhfcmVxdWVzdF9zZW5zZShkZXYsIHNlbnNlX2J1ZmZlciwgc2Vuc2Vfa2V5KTsKKwkJaWYgKGVycl9tYXNrKSB7CisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgImZhaWxlZCB0byBjbGVhciAiCisJCQkJIlVOSVQgQVRURU5USU9OIChlcnJfbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKKwkJIlVOSVQgQVRURU5USU9OIHBlcnNpc3RzIGFmdGVyICVkIHRyaWVzXG4iLCBBVEFfRUhfVUFfVFJJRVMpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYXRhX2xpbmtfbnJfZW5hYmxlZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmspCiB7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKQEAgLTI2OTcsNyArMjk0Miw3IEBACiAJCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGNoYW5jZSwgYmV0dGVyIHRvIHNsb3cKIAkJCSAqIGRvd24gdGhhbiBsb3NlIGl0LgogCQkJICovCi0JCQlzYXRhX2Rvd25fc3BkX2xpbWl0KGRldi0+bGluayk7CisJCQlzYXRhX2Rvd25fc3BkX2xpbWl0KGF0YV9kZXZfcGh5c19saW5rKGRldikpOwogCQkJYXRhX2Rvd25feGZlcm1hc2tfbGltaXQoZGV2LCBBVEFfRE5YRkVSX1BJTyk7CiAJCX0KIAl9CkBAIC0yNzA3LDcgKzI5NTIsNyBAQAogCQlhdGFfZGV2X2Rpc2FibGUoZGV2KTsKIAogCQkvKiBkZXRhY2ggaWYgb2ZmbGluZSAqLwotCQlpZiAoYXRhX2xpbmtfb2ZmbGluZShkZXYtPmxpbmspKQorCQlpZiAoYXRhX3BoeXNfbGlua19vZmZsaW5lKGF0YV9kZXZfcGh5c19saW5rKGRldikpKQogCQkJYXRhX2VoX2RldGFjaF9kZXYoZGV2KTsKIAogCQkvKiBzY2hlZHVsZSBwcm9iZSBpZiBuZWNlc3NhcnkgKi8KQEAgLTI3NTUsNyArMzAwMCw3IEBACiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAlpbnQgbnJfZmFpbGVkX2RldnM7CiAJaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZGVhZGxpbmU7CiAKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKQEAgLTI4MjksNiArMzA3NCw1NiBAQAogCQl9CiAJfQogCisJZG8geworCQl1bnNpZ25lZCBsb25nIG5vdzsKKworCQkvKgorCQkgKiBjbGVhcnMgQVRBX0VIX1BBUksgaW4gZWhfaW5mbyBhbmQgcmVzZXRzCisJCSAqIGFwLT5wYXJrX3JlcV9wZW5kaW5nCisJCSAqLworCQlhdGFfZWhfcHVsbF9wYXJrX2FjdGlvbihhcCk7CisKKwkJZGVhZGxpbmUgPSBqaWZmaWVzOworCQlhdGFfcG9ydF9mb3JfZWFjaF9saW5rKGxpbmssIGFwKSB7CisJCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJCQkJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmbGluay0+ZWhfY29udGV4dDsKKwkJCQl1bnNpZ25lZCBsb25nIHRtcDsKKworCQkJCWlmIChkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIShlaGMtPmkuZGV2X2FjdGlvbltkZXYtPmRldm5vXSAmCisJCQkJICAgICAgQVRBX0VIX1BBUkspKQorCQkJCQljb250aW51ZTsKKwkJCQl0bXAgPSBkZXYtPnVucGFya19kZWFkbGluZTsKKwkJCQlpZiAodGltZV9iZWZvcmUoZGVhZGxpbmUsIHRtcCkpCisJCQkJCWRlYWRsaW5lID0gdG1wOworCQkJCWVsc2UgaWYgKHRpbWVfYmVmb3JlX2VxKHRtcCwgamlmZmllcykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChlaGMtPnVubG9hZGVkX21hc2sgJiAoMSA8PCBkZXYtPmRldm5vKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlhdGFfZWhfcGFya19pc3N1ZV9jbWQoZGV2LCAxKTsKKwkJCX0KKwkJfQorCisJCW5vdyA9IGppZmZpZXM7CisJCWlmICh0aW1lX2JlZm9yZV9lcShkZWFkbGluZSwgbm93KSkKKwkJCWJyZWFrOworCisJCWRlYWRsaW5lID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhcC0+cGFya19yZXFfcGVuZGluZywKKwkJCQkJCSAgICAgICBkZWFkbGluZSAtIG5vdyk7CisJfSB3aGlsZSAoZGVhZGxpbmUpOworCWF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIHsKKwkJYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgeworCQkJaWYgKCEobGluay0+ZWhfY29udGV4dC51bmxvYWRlZF9tYXNrICYKKwkJCSAgICAgICgxIDw8IGRldi0+ZGV2bm8pKSkKKwkJCQljb250aW51ZTsKKworCQkJYXRhX2VoX3BhcmtfaXNzdWVfY21kKGRldiwgMCk7CisJCQlhdGFfZWhfZG9uZShsaW5rLCBkZXYsIEFUQV9FSF9QQVJLKTsKKwkJfQorCX0KKwogCS8qIHRoZSByZXN0ICovCiAJYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgewogCQlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZsaW5rLT5laF9jb250ZXh0OwpAQCAtMjg1Miw2ICszMTQ3LDIwIEBACiAJCQllaGMtPmkuZmxhZ3MgJj0gfkFUQV9FSElfU0VUTU9ERTsKIAkJfQogCisJCS8qIElmIHJlc2V0IGhhcyBiZWVuIGlzc3VlZCwgY2xlYXIgVUEgdG8gYXZvaWQKKwkJICogZGlzcnVwdGluZyB0aGUgY3VycmVudCB1c2VycyBvZiB0aGUgZGV2aWNlLgorCQkgKi8KKwkJaWYgKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfRElEX1JFU0VUKSB7CisJCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKSB7CisJCQkJaWYgKGRldi0+Y2xhc3MgIT0gQVRBX0RFVl9BVEFQSSkKKwkJCQkJY29udGludWU7CisJCQkJcmMgPSBhdGFwaV9laF9jbGVhcl91YShkZXYpOworCQkJCWlmIChyYykKKwkJCQkJZ290byBkZXZfZmFpbDsKKwkJCX0KKwkJfQorCisJCS8qIGNvbmZpZ3VyZSBsaW5rIHBvd2VyIHNhdmluZyAqLwogCQlpZiAoZWhjLT5pLmFjdGlvbiAmIEFUQV9FSF9MUE0pCiAJCQlhdGFfbGlua19mb3JfZWFjaF9kZXYoZGV2LCBsaW5rKQogCQkJCWF0YV9kZXZfZW5hYmxlX3BtKGRldiwgYXAtPnBtX3BvbGljeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCBiOWQzYmE0Li41ZDMxMmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTE4Myw2ICsxODMsMTA1IEBACiAJCWF0YV9zY3NpX2xwbV9zaG93LCBhdGFfc2NzaV9scG1fcHV0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRldl9hdHRyX2xpbmtfcG93ZXJfbWFuYWdlbWVudF9wb2xpY3kpOwogCitzdGF0aWMgc3NpemVfdCBhdGFfc2NzaV9wYXJrX3Nob3coc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGF0YV9saW5rICpsaW5rOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdW5pbml0aWFsaXplZF92YXIobXNlY3MpOworCWludCByYyA9IDA7CisKKwlhcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2Rldik7CisJaWYgKCFkZXYpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIHVubG9jazsKKwl9CisJaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTk9fVU5MT0FEKSB7CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWxpbmsgPSBkZXYtPmxpbms7CisJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRUhfSU5fUFJPR1JFU1MgJiYKKwkgICAgbGluay0+ZWhfY29udGV4dC51bmxvYWRlZF9tYXNrICYgKDEgPDwgZGV2LT5kZXZubykgJiYKKwkgICAgdGltZV9hZnRlcihkZXYtPnVucGFya19kZWFkbGluZSwgamlmZmllcykpCisJCW1zZWNzID0gamlmZmllc190b19tc2VjcyhkZXYtPnVucGFya19kZWFkbGluZSAtIGppZmZpZXMpOworCWVsc2UKKwkJbXNlY3MgPSAwOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxKGFwLT5sb2NrKTsKKworCXJldHVybiByYyA/IHJjIDogc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLCBtc2Vjcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0YV9zY3NpX3Bhcmtfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlsb25nIGludCBpbnB1dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXJjID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmaW5wdXQpOworCWlmIChyYyB8fCBpbnB1dCA8IC0yKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5wdXQgPiBBVEFfVE1PVVRfTUFYX1BBUkspIHsKKwkJcmMgPSAtRU9WRVJGTE9XOworCQlpbnB1dCA9IEFUQV9UTU9VVF9NQVhfUEFSSzsKKwl9CisKKwlhcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2Rldik7CisJaWYgKHVubGlrZWx5KCFkZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmIChkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKSB7CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChpbnB1dCA+PSAwKSB7CisJCWlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX05PX1VOTE9BRCkgeworCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisKKwkJZGV2LT51bnBhcmtfZGVhZGxpbmUgPSBhdGFfZGVhZGxpbmUoamlmZmllcywgaW5wdXQpOworCQlkZXYtPmxpbmstPmVoX2luZm8uZGV2X2FjdGlvbltkZXYtPmRldm5vXSB8PSBBVEFfRUhfUEFSSzsKKwkJYXRhX3BvcnRfc2NoZWR1bGVfZWgoYXApOworCQljb21wbGV0ZSgmYXAtPnBhcmtfcmVxX3BlbmRpbmcpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoaW5wdXQpIHsKKwkJY2FzZSAtMToKKwkJCWRldi0+ZmxhZ3MgJj0gfkFUQV9ERkxBR19OT19VTkxPQUQ7CisJCQlicmVhazsKKwkJY2FzZSAtMjoKKwkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05PX1VOTE9BRDsKKwkJCWJyZWFrOworCQl9CisJfQordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYyA/IHJjIDogbGVuOworfQorREVWSUNFX0FUVFIodW5sb2FkX2hlYWRzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkgICAgYXRhX3Njc2lfcGFya19zaG93LCBhdGFfc2NzaV9wYXJrX3N0b3JlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRldl9hdHRyX3VubG9hZF9oZWFkcyk7CisKIHN0YXRpYyB2b2lkIGF0YV9zY3NpX3NldF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4IHNrLCB1OCBhc2MsIHU4IGFzY3EpCiB7CiAJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKQEAgLTI2OSw2ICszNjgsMTIgQEAKIAkJCWF0YV9zY3NpX2FjdGl2aXR5X3N0b3JlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRldl9hdHRyX3N3X2FjdGl2aXR5KTsKIAorc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0YV9jb21tb25fc2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl91bmxvYWRfaGVhZHMsCisJTlVMTAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9jb21tb25fc2Rldl9hdHRycyk7CisKIHN0YXRpYyB2b2lkIGF0YV9zY3NpX2ludmFsaWRfZmllbGQoc3RydWN0IHNjc2lfY21uZCAqY21kLAogCQkJCSAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewpAQCAtMzk4LDcgKzUwMyw3IEBACiAJc2NzaV9jbWRbMF0gPSBBVEFfMTY7CiAKIAlzY3NpX2NtZFs0XSA9IGFyZ3NbMl07Ci0JaWYgKGFyZ3NbMF0gPT0gV0lOX1NNQVJUKSB7IC8qIGhhY2sgLS0gaWRlIGRyaXZlciBkb2VzIHRoaXMgdG9vLi4uICovCisJaWYgKGFyZ3NbMF0gPT0gQVRBX0NNRF9TTUFSVCkgeyAvKiBoYWNrIC0tIGlkZSBkcml2ZXIgZG9lcyB0aGlzIHRvbyAqLwogCQlzY3NpX2NtZFs2XSAgPSBhcmdzWzNdOwogCQlzY3NpX2NtZFs4XSAgPSBhcmdzWzFdOwogCQlzY3NpX2NtZFsxMF0gPSAweDRmOwpAQCAtOTU0LDYgKzEwNTksOSBAQAogc3RhdGljIGludCBhdGFfc2NzaV9kZXZfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCSAgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogeworCWlmICghYXRhX2lkX2hhc191bmxvYWQoZGV2LT5pZCkpCisJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05PX1VOTE9BRDsKKwogCS8qIGNvbmZpZ3VyZSBtYXggc2VjdG9ycyAqLwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBkZXYtPm1heF9zZWN0b3JzKTsKIApAQCAtOTc3LDYgKzEwODUsMTAgQEAKIAogCQlibGtfcXVldWVfZG1hX2RyYWluKHEsIGF0YXBpX2RyYWluX25lZWRlZCwgYnVmLCBBVEFQSV9NQVhfRFJBSU4pOwogCX0gZWxzZSB7CisJCWlmIChhdGFfaWRfaXNfc3NkKGRldi0+aWQpKQorCQkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsCisJCQkJCQlzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKKwogCQkvKiBBVEEgZGV2aWNlcyBtdXN0IGJlIHNlY3RvciBhbGlnbmVkICovCiAJCWJsa19xdWV1ZV91cGRhdGVfZG1hX2FsaWdubWVudChzZGV2LT5yZXF1ZXN0X3F1ZXVlLAogCQkJCQkgICAgICAgQVRBX1NFQ1RfU0laRSAtIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IDMwNGZkYzYuLjJhNGM1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTEzMTUsMTEgKzEzMTUsNiBAQAogCQlicmVhazsKIAogCWNhc2UgSFNNX1NUX0VSUjoKLQkJLyogbWFrZSBzdXJlIHFjLT5lcnJfbWFzayBpcyBhdmFpbGFibGUgdG8KLQkJICoga25vdyB3aGF0J3Mgd3JvbmcgYW5kIHJlY292ZXIKLQkJICovCi0JCVdBUk5fT04oIShxYy0+ZXJyX21hc2sgJiAoQUNfRVJSX0RFViB8IEFDX0VSUl9IU00pKSk7Ci0KIAkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7CiAKIAkJLyogY29tcGxldGUgdGFza2ZpbGUgdHJhbnNhY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKaW5kZXggYWRlNWM3NS4uZmUyODM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLmgKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKQEAgLTcwLDYgKzcwLDcgQEAKIGV4dGVybiBpbnQgbGliYXRhX2Z1YTsKIGV4dGVybiBpbnQgbGliYXRhX25vYWNwaTsKIGV4dGVybiBpbnQgbGliYXRhX2FsbG93X3RwbTsKK2V4dGVybiBzdHJ1Y3QgYXRhX2xpbmsgKmF0YV9kZXZfcGh5c19saW5rKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX2ZvcmNlX2NibChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB1NjQgYXRhX3RmX3RvX2xiYShjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CiBleHRlcm4gdTY0IGF0YV90Zl90b19sYmE0OChjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CkBAIC0xMDcsNiArMTA4LDggQEAKIGV4dGVybiB2b2lkIF9fYXRhX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIGludCBhdGFwaV9jaGVja19kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBzd2FwX2J1Zl9sZTE2KHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX3dvcmRzKTsKK2V4dGVybiBib29sIGF0YV9waHlzX2xpbmtfb25saW5lKHN0cnVjdCBhdGFfbGluayAqbGluayk7CitleHRlcm4gYm9vbCBhdGFfcGh5c19saW5rX29mZmxpbmUoc3RydWN0IGF0YV9saW5rICpsaW5rKTsKIGV4dGVybiB2b2lkIGF0YV9kZXZfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGF0YV9saW5rX2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcG1wKTsKIGV4dGVybiBpbnQgc2F0YV9saW5rX2luaXRfc3BkKHN0cnVjdCBhdGFfbGluayAqbGluayk7CkBAIC0xNTIsNyArMTU1LDcgQEAKIC8qIGxpYmF0YS1laC5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBhdGFfaW50ZXJuYWxfY21kX3RpbWVvdXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdTggY21kKTsKIGV4dGVybiB2b2lkIGF0YV9pbnRlcm5hbF9jbWRfdGltZWRfb3V0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU4IGNtZCk7Ci1leHRlcm4gZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBhdGFfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gYXRhX3Njc2lfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gdm9pZCBhdGFfc2NzaV9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKIGV4dGVybiB2b2lkIGF0YV9wb3J0X3dhaXRfZWgoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfZWhfZmFzdGRyYWluX3RpbWVyZm4odW5zaWduZWQgbG9uZyBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9iZjU0eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9iZjU0eC5jCmluZGV4IGQzOTMyOTAuLjEyNjY5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYmY1NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2JmNTR4LmMKQEAgLTE2MzIsNiArMTYzMiw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBob3N0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjQ4LDYgKzE2NTAsNyBAQAogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJYXRhX2hvc3RfZGV0YWNoKGhvc3QpOworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKIAogCXBlcmlwaGVyYWxfZnJlZV9saXN0KGF0YXBpX2lvX3BvcnQpOwogCkBAIC0xNjU1LDI3ICsxNjU4LDQ0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLWludCBiZmluX2F0YXBpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBiZmluX2F0YXBpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiAwOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoaG9zdCkKKwkJcmV0dXJuIGF0YV9ob3N0X3N1c3BlbmQoaG9zdCwgc3RhdGUpOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKLWludCBiZmluX2F0YXBpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBiZmluX2F0YXBpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKGhvc3QpIHsKKwkJcmV0ID0gYmZpbl9yZXNldF9jb250cm9sbGVyKGhvc3QpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogRXJyb3IgZHVyaW5nIEhXIGluaXRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CisjZWxzZQorI2RlZmluZSBiZmluX2F0YXBpX3N1c3BlbmQgTlVMTAorI2RlZmluZSBiZmluX2F0YXBpX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9hdGFwaV9kcml2ZXIgPSB7CiAJLnByb2JlCQkJPSBiZmluX2F0YXBpX3Byb2JlLAogCS5yZW1vdmUJCQk9IF9fZGV2ZXhpdF9wKGJmaW5fYXRhcGlfcmVtb3ZlKSwKKwkuc3VzcGVuZAkJPSBiZmluX2F0YXBpX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gYmZpbl9hdGFwaV9yZXN1bWUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJCT0gRFJWX05BTUUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KLQkJLnN1c3BlbmQJPSBiZmluX2F0YXBpX3N1c3BlbmQsCi0JCS5yZXN1bWUJCT0gYmZpbl9hdGFwaV9yZXN1bWUsCi0jZW5kaWYKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwppbmRleCAyNGEwMTFiLi4wZDg3ZWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwpAQCAtMjAsNyArMjAsNDIgQEAKICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9tYXJ2ZWxsIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEuNiIKKworLyoqCisgKgltYXJ2ZWxsX3BhdGFfYWN0aXZlCS0JY2hlY2sgaWYgUEFUQSBpcyBhY3RpdmUKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlCisgKgorICoJUmV0dXJucyAxIGlmIHRoZSBQQVRBIHBvcnQgbWF5IGJlIGFjdGl2ZS4gV2Uga25vdyBob3cgdG8gY2hlY2sgdGhpcworICoJZm9yIHRoZSA2MTQ1IGJ1dCBub3QgdGhlIG90aGVyIGRldmljZXMKKyAqLworCitzdGF0aWMgaW50IG1hcnZlbGxfcGF0YV9hY3RpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisJdTMyIGRldmljZXM7CisJdm9pZCBfX2lvbWVtICpiYXJwOworCisJLyogV2UgZG9uJ3QgeWV0IGtub3cgaG93IHRvIGRvIHRoaXMgZm9yIG90aGVyIGRldmljZXMgKi8KKwlpZiAocGRldi0+ZGV2aWNlICE9IDB4NjE0NSkKKwkJcmV0dXJuIDE7CQorCisJYmFycCA9IHBjaV9pb21hcChwZGV2LCA1LCAweDEwKTsKKwlpZiAoYmFycCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50aygiQkFSNToiKTsKKwlmb3IoaSA9IDA7IGkgPD0gMHgwRjsgaSsrKQorCQlwcmludGsoIiUwMlg6JTAyWCAiLCBpLCBpb3JlYWQ4KGJhcnAgKyBpKSk7CisJcHJpbnRrKCJcbiIpOworCisJZGV2aWNlcyA9IGlvcmVhZDMyKGJhcnAgKyAweDBDKTsKKwlwY2lfaW91bm1hcChwZGV2LCBiYXJwKTsKKworCWlmIChkZXZpY2VzICYgMHgxMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICoJbWFydmVsbF9wcmVfcmVzZXQJLQljaGVjayBmb3IgNDAvODAgcGluCkBAIC0zNCwyNiArNjksMTAgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXUzMiBkZXZpY2VzOwotCXZvaWQgX19pb21lbSAqYmFycDsKLQlpbnQgaTsKIAotCS8qIENoZWNrIGlmIG91ciBwb3J0IGlzIGVuYWJsZWQgKi8KLQotCWJhcnAgPSBwY2lfaW9tYXAocGRldiwgNSwgMHgxMCk7Ci0JaWYgKGJhcnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcHJpbnRrKCJCQVI1OiIpOwotCWZvcihpID0gMDsgaSA8PSAweDBGOyBpKyspCi0JCXByaW50aygiJTAyWDolMDJYICIsIGksIGlvcmVhZDgoYmFycCArIGkpKTsKLQlwcmludGsoIlxuIik7Ci0KLQlkZXZpY2VzID0gaW9yZWFkMzIoYmFycCArIDB4MEMpOwotCXBjaV9pb3VubWFwKHBkZXYsIGJhcnApOwotCi0JaWYgKChwZGV2LT5kZXZpY2UgPT0gMHg2MTQ1KSAmJiAoYXAtPnBvcnRfbm8gPT0gMCkgJiYKLQkgICAgKCEoZGV2aWNlcyAmIDB4MTApKSkJLyogUEFUQSBlbmFibGUgPyAqLwotCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAocGRldi0+ZGV2aWNlID09IDB4NjE0NSAmJiBhcC0+cG9ydF9ubyA9PSAwICYmCisJCSFtYXJ2ZWxsX3BhdGFfYWN0aXZlKHBkZXYpKQkvKiBQQVRBIGVuYWJsZSA/ICovCisJCQlyZXR1cm4gLUVOT0VOVDsKIAogCXJldHVybiBhdGFfc2ZmX3ByZXJlc2V0KGxpbmssIGRlYWRsaW5lKTsKIH0KQEAgLTEyOCw2ICsxNDcsMTIgQEAKIAlpZiAocGRldi0+ZGV2aWNlID09IDB4NjEwMSkKIAkJcHBpWzFdID0gJmF0YV9kdW1teV9wb3J0X2luZm87CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BSENJKSB8fCBkZWZpbmVkKENPTkZJR19BSENJX01PRFVMRSkKKwlpZiAoIW1hcnZlbGxfcGF0YV9hY3RpdmUocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBQQVRBIHBvcnQgbm90IGFjdGl2ZSwgZGVmZXJyaW5nIHRvIEFIQ0kgZHJpdmVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNlbmRpZgogCXJldHVybiBhdGFfcGNpX3NmZl9pbml0X29uZShwZGV2LCBwcGksICZtYXJ2ZWxsX3NodCwgTlVMTCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb2ZfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfb2ZfcGxhdGZvcm0uYwppbmRleCA0MDhkYTMwLi4xZjE4YWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29mX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9vZl9wbGF0Zm9ybS5jCkBAIC01Miw3ICs1Miw3IEBACiAKIAlyZXQgPSBvZl9pcnFfdG9fcmVzb3VyY2UoZG4sIDAsICZpcnFfcmVzKTsKIAlpZiAocmV0ID09IE5PX0lSUSkKLQkJaXJxX3Jlcy5zdGFydCA9IGlycV9yZXMuZW5kID0gLTE7CisJCWlycV9yZXMuc3RhcnQgPSBpcnFfcmVzLmVuZCA9IDA7CiAJZWxzZQogCQlpcnFfcmVzLmZsYWdzID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKaW5kZXggNDFiNDM2MS4uMDJiNTk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCkBAIC0xNDgsNiArMTQ4LDY0IEBACiAjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKIGRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCiAKKworc3RydWN0IHBjbWNpYV9jb25maWdfY2hlY2sgeworCXVuc2lnbmVkIGxvbmcgY3RsX2Jhc2U7CisJaW50IHNraXBfdmNjOworCWludCBpc19rbWU7Cit9OworCitzdGF0aWMgaW50IHBjbWNpYV9jaGVja19vbmVfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2LAorCQkJCSAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZywKKwkJCQkgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJCSAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkJICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwY21jaWFfY29uZmlnX2NoZWNrICpzdGsgPSBwcml2X2RhdGE7CisKKwkvKiBDaGVjayBmb3IgbWF0Y2hpbmcgVmNjLCB1bmxlc3Mgd2UncmUgZGVzcGVyYXRlICovCisJaWYgKCFzdGstPnNraXBfdmNjKSB7CisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAodmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQl9IGVsc2UgaWYgKGRmbHQtPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAodmNjICE9IGRmbHQtPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcGRldi0+Y29uZi5WcHAgPSBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisJZWxzZSBpZiAoZGZsdC0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQorCQlwZGV2LT5jb25mLlZwcCA9IGRmbHQtPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisKKwlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKKwkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKKwkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQlwZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJaWYgKGlvLT5ud2luID09IDIpIHsKKwkJCXBkZXYtPmlvLk51bVBvcnRzMSA9IDg7CisJCQlwZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSAoc3RrLT5pc19rbWUpID8gMiA6IDE7CisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSAhPSAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJc3RrLT5jdGxfYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MjsKKwkJfSBlbHNlIGlmICgoaW8tPm53aW4gPT0gMSkgJiYgKGlvLT53aW5bMF0ubGVuID49IDE2KSkgeworCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZwZGV2LT5pbykgIT0gMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXN0ay0+Y3RsX2Jhc2UgPSBwZGV2LT5pby5CYXNlUG9ydDEgKyAweDBlOworCQl9IGVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCQkvKiBJZiB3ZSd2ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGRvbmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCiAvKioKICAqCXBjbWNpYV9pbml0X29uZQkJLQlhdHRhY2ggYSBQQ01DSUEgaW50ZXJmYWNlCiAgKglAcGRldjogcGNtY2lhIGRldmljZQpAQCAtMTYxLDE5ICsyMTksMTEgQEAKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IGF0YV9wb3J0ICphcDsKIAlzdHJ1Y3QgYXRhX3BjbWNpYV9pbmZvICppbmZvOwotCXR1cGxlX3QgdHVwbGU7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgc2hvcnQgYnVmWzEyOF07Ci0JCWNpc3BhcnNlX3QgcGFyc2U7Ci0JCWNvbmZpZ19pbmZvX3QgY29uZjsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0OwotCX0gKnN0ayA9IE5VTEw7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnOwotCWludCBwYXNzLCBsYXN0X3JldCA9IDAsIGxhc3RfZm4gPSAwLCBpc19rbWUgPSAwLCByZXQgPSAtRU5PTUVNLCBwOworCXN0cnVjdCBwY21jaWFfY29uZmlnX2NoZWNrICpzdGsgPSBOVUxMOworCWludCBsYXN0X3JldCA9IDAsIGxhc3RfZm4gPSAwLCBpc19rbWUgPSAwLCByZXQgPSAtRU5PTUVNLCBwOwogCXVuc2lnbmVkIGxvbmcgaW9fYmFzZSwgY3RsX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICppb19hZGRyLCAqY3RsX2FkZHI7CiAJaW50IG5fcG9ydHMgPSAxOwotCiAJc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgKm9wcyA9ICZwY21jaWFfcG9ydF9vcHM7CiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKQEAgLTE5Myw5NiArMjQzLDI3IEBACiAJcGRldi0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogCXBkZXYtPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwogCi0JLyogQWxsb2NhdGUgcmVzb3VyZSBwcm9iaW5nIHN0cnVjdHVyZXMgKi8KLQotCXN0ayA9IGt6YWxsb2Moc2l6ZW9mKCpzdGspLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0aykKLQkJZ290byBvdXQxOwotCi0JY2ZnID0gJnN0ay0+cGFyc2UuY2Z0YWJsZV9lbnRyeTsKLQotCS8qIFR1cGxlcyB3ZSBhcmUgd2Fsa2luZyAqLwotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikmc3RrLT5idWY7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQogCS8qIFNlZSBpZiB3ZSBoYXZlIGEgbWFudWZhY3R1cmVyIGlkZW50aWZpZXIuIFVzZSBpdCB0byBzZXQgaXNfa21lIGZvcgogCSAgIHZlbmRvciBxdWlya3MgKi8KIAlpc19rbWUgPSAoKHBkZXYtPm1hbmZfaWQgPT0gTUFORklEX0tNRSkgJiYKIAkJICAoKHBkZXYtPmNhcmRfaWQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0EpIHx8CiAJCSAgIChwZGV2LT5jYXJkX2lkID09IFBST0RJRF9LTUVfS1hMQzAwNV9CKSkpOwogCi0JLyogTm90IHN1cmUgaWYgdGhpcyBpcyByaWdodC4uLiBsb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwotCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhwZGV2LCAmc3RrLT5jb25mKSk7Ci0vKglsaW5rLT5jb25mLlZjYyA9IHN0ay0+Y29uZi5WY2M7ICovCisJLyogQWxsb2NhdGUgcmVzb3VyZSBwcm9iaW5nIHN0cnVjdHVyZXMgKi8KIAotCXBhc3MgPSBpb19iYXNlID0gY3RsX2Jhc2UgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocGRldiwgJnR1cGxlKSk7CisJc3RrID0ga3phbGxvYyhzaXplb2YoKnN0ayksIEdGUF9LRVJORUwpOworCWlmICghc3RrKQorCQlnb3RvIG91dDE7CisJc3RrLT5pc19rbWUgPSBpc19rbWU7CisJc3RrLT5za2lwX3ZjYyA9IGlvX2Jhc2UgPSBjdGxfYmFzZSA9IDA7CiAKLQkvKiBOb3cgbXVuY2ggdGhlIHJlc291cmNlcyBsb29raW5nIGZvciBhIHN1aXRhYmxlIHNldCAqLwotCXdoaWxlICgxKSB7Ci0JCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEocGRldiwgJnR1cGxlKSAhPSAwKQotCQkJZ290byBuZXh0X2VudHJ5OwotCQlpZiAocGNtY2lhX3BhcnNlX3R1cGxlKHBkZXYsICZ0dXBsZSwgJnN0ay0+cGFyc2UpICE9IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0JCS8qIENoZWNrIGZvciBtYXRjaGluZyBWY2MsIHVubGVzcyB3ZSdyZSBkZXNwZXJhdGUgKi8KLQkJaWYgKCFwYXNzKSB7Ci0JCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJCWlmIChzdGstPmNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKQotCQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQl9IGVsc2UgaWYgKHN0ay0+ZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJCWlmIChzdGstPmNvbmYuVmNjICE9IHN0ay0+ZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApCi0JCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJCX0KLQkJfQotCi0JCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKLQkJCXBkZXYtPmNvbmYuVnBwID0gY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQllbHNlIGlmIChzdGstPmRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJcGRldi0+Y29uZi5WcHAgPSBzdGstPmRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLQotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChzdGstPmRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJnN0ay0+ZGZsdC5pbzsKLQkJCXBkZXYtPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCQkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJcGRldi0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWlmIChpby0+bndpbiA9PSAyKSB7Ci0JCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gODsKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJcGRldi0+aW8uTnVtUG9ydHMyID0gKGlzX2ttZSkgPyAyIDogMTsKLQkJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSAhPSAwKQotCQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQkJaW9fYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MTsKLQkJCQljdGxfYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MjsKLQkJCX0gZWxzZSBpZiAoKGlvLT5ud2luID09IDEpICYmIChpby0+d2luWzBdLmxlbiA+PSAxNikpIHsKLQkJCQlwZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSAwOwotCQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwZGV2LCAmcGRldi0+aW8pICE9IDApCi0JCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJCQlpb19iYXNlID0gcGRldi0+aW8uQmFzZVBvcnQxOwotCQkJCWN0bF9iYXNlID0gcGRldi0+aW8uQmFzZVBvcnQxICsgMHgwZTsKLQkJCX0gZWxzZQotCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJCS8qIElmIHdlJ3ZlIGdvdCB0aGlzIGZhciwgd2UncmUgZG9uZSAqLwotCQkJYnJlYWs7Ci0JCX0KLW5leHRfZW50cnk6Ci0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCW1lbWNweSgmc3RrLT5kZmx0LCBjZmcsIHNpemVvZihzdGstPmRmbHQpKTsKLQkJaWYgKHBhc3MpIHsKLQkJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotCQl9IGVsc2UgaWYgKHBjbWNpYV9nZXRfbmV4dF90dXBsZShwZGV2LCAmdHVwbGUpICE9IDApIHsKLQkJCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocGRldiwgJnR1cGxlKSk7Ci0JCQltZW1zZXQoJnN0ay0+ZGZsdCwgMCwgc2l6ZW9mKHN0ay0+ZGZsdCkpOwotCQkJcGFzcysrOwotCQl9CisJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhwZGV2LCBwY21jaWFfY2hlY2tfb25lX2NvbmZpZywgc3RrKSkgeworCQlzdGstPnNraXBfdmNjID0gMTsKKwkJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhwZGV2LCBwY21jaWFfY2hlY2tfb25lX2NvbmZpZywgc3RrKSkKKwkJCWdvdG8gZmFpbGVkOyAvKiBObyBzdWl0YWJsZSBjb25maWcgZm91bmQgKi8KIAl9Ci0KKwlpb19iYXNlID0gcGRldi0+aW8uQmFzZVBvcnQxOworCWN0bF9iYXNlID0gc3RrLT5jdGxfYmFzZTsKIAlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEocGRldiwgJnBkZXYtPmlycSkpOwogCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHBkZXYsICZwZGV2LT5jb25mKSk7CiAKQEAgLTM4NCw2ICszNjUsNyBAQAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAzMiwgMHgwNzA0KSwKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwMzIsIDB4MjkwNCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDQ1LCAweDA0MDEpLAkvKiBTYW5EaXNrIENGQSAqLworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA0ZiwgMHgwMDAwKSwJLyogS2luZ3N0b24gKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwOTcsIDB4MTYyMCksIAkvKiBUSSBlbXVsYXRlZCAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA5OCwgMHgwMDAwKSwJLyogVG9zaGliYSAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDBhNCwgMHgwMDJkKSwKQEAgLTQwNCw5ICszODYsOSBAQAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFWFAgICAiLCAiQ0QtUk9NIiwgMHgwYTVjNTJmZCwgMHg2NjUzNjU5MSksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVYUCAgICIsICJQblBJREUiLCAweDBhNWM1MmZkLCAweDBjNjk0NzI4KSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRlJFRUNPTSIsICJQQ0NBUkQtSURFIiwgMHg1NzE0Y2JmNywgMHg0OGUwYWI4ZSksCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkh5cGVyc3RvbmUiLCAiTW9kZWwxIiwgMHgzZDViOWVmNSwgMHhjYTZhYjQyMCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkhJVEFDSEkiLCAiRkxBU0giLCAweGY0ZjQzOTQ5LCAweDllYjg2YWFlKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSElUQUNISSIsICJtaWNyb2RyaXZlIiwgMHhmNGY0Mzk0OSwgMHhhNmQ3NjE3OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkh5cGVyc3RvbmUiLCAiTW9kZWwxIiwgMHgzZDViOWVmNSwgMHhjYTZhYjQyMCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICJtaWNyb2RyaXZlIiwgMHhiNTY5YTZlNSwgMHhhNmQ3NjE3OCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICJJQk0xN0pTU0ZQMjAiLCAweGI1NjlhNmU1LCAweGYyNTA4NzUzKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS0lOR1NUT04iLCAiQ0Y4R0IiLCAweDJlNmQxODI5LCAweGFjYmU2ODJlKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCmluZGV4IDcyMGI4NjQuLmE1OThiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCXRtcGJ5dGUgJiAxLCB0bXBieXRlICYgMHgzMCk7CiAKIAkqdHJ5X21taW8gPSAwOwotI2lmZGVmIENPTkZJR19QUENfTUVSR0UKKyNpZmRlZiBDT05GSUdfUFBDCiAJaWYgKG1hY2hpbmVfaXMoY2VsbCkpCiAJCSp0cnlfbW1pbyA9ICh0bXBieXRlICYgMSkgfHwgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpOwogI2VuZGlmCkBAIC0zMjIsOSArMzIyLDYgQEAKIAkvKiBUcnkgdG8gYWNxdWlyZSBNTUlPIHJlc291cmNlcyBhbmQgZmFsbGJhY2sgdG8gUElPIGlmCiAJICogdGhhdCBmYWlscwogCSAqLwotCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwogCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgU0lMNjgwX01NSU9fQkFSLCBEUlZfTkFNRSk7CiAJaWYgKHJjKQogCQlnb3RvIHVzZV9pb3BvcnRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYyBiL2RyaXZlcnMvYXRhL3NhdGFfZnNsLmMKaW5kZXggMzkyNGU3Mi4uMWE1NmRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jCkBAIC00NjksMTAgKzQ2OSwxMCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHNhdGFfZnNsX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLAotCQkJICAgICAgIHUzMiB2YWwpCitzdGF0aWMgaW50IHNhdGFfZnNsX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCisJCQkgICAgICB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgdmFsKQogewotCXN0cnVjdCBzYXRhX2ZzbF9ob3N0X3ByaXYgKmhvc3RfcHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNhdGFfZnNsX2hvc3RfcHJpdiAqaG9zdF9wcml2ID0gbGluay0+YXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKnNzcl9iYXNlID0gaG9zdF9wcml2LT5zc3JfYmFzZTsKIAl1bnNpZ25lZCBpbnQgc2NfcmVnOwogCkBAIC00OTMsMTAgKzQ5MywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhdGFfZnNsX3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4sCi0JCQl1MzIgKnZhbCkKK3N0YXRpYyBpbnQgc2F0YV9mc2xfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgKnZhbCkKIHsKLQlzdHJ1Y3Qgc2F0YV9mc2xfaG9zdF9wcml2ICpob3N0X3ByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzYXRhX2ZzbF9ob3N0X3ByaXYgKmhvc3RfcHJpdiA9IGxpbmstPmFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpzc3JfYmFzZSA9IGhvc3RfcHJpdi0+c3NyX2Jhc2U7CiAJdW5zaWduZWQgaW50IHNjX3JlZzsKIApAQCAtNjQ1LDEyICs2NDUsMTIgQEAKIAkgKiBXb3JrYXJvdW5kIGZvciA4MzE1RFMgYm9hcmQgM2dicHMgbGluay11cCBpc3N1ZSwKIAkgKiBjdXJyZW50bHkgbGltaXQgU0FUQSBwb3J0IHRvIEdFTjEgc3BlZWQKIAkgKi8KLQlzYXRhX2ZzbF9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wsICZ0ZW1wKTsKKwlzYXRhX2ZzbF9zY3JfcmVhZCgmYXAtPmxpbmssIFNDUl9DT05UUk9MLCAmdGVtcCk7CiAJdGVtcCAmPSB+KDB4RiA8PCA0KTsKIAl0ZW1wIHw9ICgweDEgPDwgNCk7Ci0Jc2F0YV9mc2xfc2NyX3dyaXRlKGFwLCBTQ1JfQ09OVFJPTCwgdGVtcCk7CisJc2F0YV9mc2xfc2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0NPTlRST0wsIHRlbXApOwogCi0Jc2F0YV9mc2xfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmdGVtcCk7CisJc2F0YV9mc2xfc2NyX3JlYWQoJmFwLT5saW5rLCBTQ1JfQ09OVFJPTCwgJnRlbXApOwogCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsICJzY3JfY29udHJvbCwgc3BlZWQgbGltaXRlZCB0byAleFxuIiwKIAkJCXRlbXApOwogI2VuZGlmCkBAIC04NjgsNyArODY4LDcgQEAKIAkJCWlvcmVhZDMyKENRICsgaGNyX2Jhc2UpLAogCQkJaW9yZWFkMzIoQ0EgKyBoY3JfYmFzZSksIGlvcmVhZDMyKENDICsgaGNyX2Jhc2UpKTsKIAotCQlzYXRhX2ZzbF9zY3JfcmVhZChhcCwgU0NSX0VSUk9SLCAmU2Vycm9yKTsKKwkJc2F0YV9mc2xfc2NyX3JlYWQoJmFwLT5saW5rLCBTQ1JfRVJST1IsICZTZXJyb3IpOwogCiAJCURQUklOVEsoIkhTdGF0dXMgPSAweCV4XG4iLCBpb3JlYWQzMihoY3JfYmFzZSArIEhTVEFUVVMpKTsKIAkJRFBSSU5USygiSENvbnRyb2wgPSAweCV4XG4iLCBpb3JlYWQzMihoY3JfYmFzZSArIEhDT05UUk9MKSk7CkBAIC05NzIsOSArOTcyLDkgQEAKIAkgKiBIYW5kbGUgJiBDbGVhciBTRXJyb3IKIAkgKi8KIAotCXNhdGFfZnNsX3Njcl9yZWFkKGFwLCBTQ1JfRVJST1IsICZTRXJyb3IpOworCXNhdGFfZnNsX3Njcl9yZWFkKCZhcC0+bGluaywgU0NSX0VSUk9SLCAmU0Vycm9yKTsKIAlpZiAodW5saWtlbHkoU0Vycm9yICYgMHhGRkZGMDAwMCkpIHsKLQkJc2F0YV9mc2xfc2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIFNFcnJvcik7CisJCXNhdGFfZnNsX3Njcl93cml0ZSgmYXAtPmxpbmssIFNDUl9FUlJPUiwgU0Vycm9yKTsKIAl9CiAKIAlEUFJJTlRLKCJlcnJvcl9pbnRyLGhTdGF0PTB4JXgsQ0U9MHgleCxERSA9MHgleCxTRXJyPTB4JXhcbiIsCkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCiAJaHN0YXR1cyA9IGlvcmVhZDMyKGhjcl9iYXNlICsgSFNUQVRVUyk7CiAKLQlzYXRhX2ZzbF9zY3JfcmVhZChhcCwgU0NSX0VSUk9SLCAmU0Vycm9yKTsKKwlzYXRhX2ZzbF9zY3JfcmVhZCgmYXAtPmxpbmssIFNDUl9FUlJPUiwgJlNFcnJvcik7CiAKIAlpZiAodW5saWtlbHkoU0Vycm9yICYgMHhGRkZGMDAwMCkpIHsKIAkJRFBSSU5USygic2Vycm9yIEBob3N0X2ludHIgOiAweCV4XG4iLCBTRXJyb3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jIGIvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jCmluZGV4IDNlYWQwMmYuLmZiYmQ4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2luaWMxNjJ4LmMKQEAgLTk2LDYgKzk2LDcgQEAKIAlQT1JUX1NDUgkJPSAweDIwLAogCiAJLyogSE9TVF9DVEwgYml0cyAqLworCUhDVExfTEVERU4JCT0gKDEgPDwgMyksICAvKiBlbmFibGUgTEVEIG9wZXJhdGlvbiAqLwogCUhDVExfSVJRT0ZGCQk9ICgxIDw8IDgpLCAgLyogZ2xvYmFsIElSUSBvZmYgKi8KIAlIQ1RMX0ZUSEQwCQk9ICgxIDw8IDEwKSwgLyogZmlmbyB0aHJlc2hvbGQgMCAqLwogCUhDVExfRlRIRDEJCT0gKDEgPDwgMTEpLCAvKiBmaWZvIHRocmVzaG9sZCAxKi8KQEAgLTI2OCw5ICsyNjksOSBAQAogCXdyaXRlYigweGZmLCBwb3J0X2Jhc2UgKyBQT1JUX0lSUV9TVEFUKTsKIH0KIAotc3RhdGljIGludCBpbmljX3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IGluaWNfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBzY19yZWcsIHUzMiAqdmFsKQogewotCXZvaWQgX19pb21lbSAqc2NyX2FkZHIgPSBpbmljX3BvcnRfYmFzZShhcCkgKyBQT1JUX1NDUjsKKwl2b2lkIF9faW9tZW0gKnNjcl9hZGRyID0gaW5pY19wb3J0X2Jhc2UobGluay0+YXApICsgUE9SVF9TQ1I7CiAJdm9pZCBfX2lvbWVtICphZGRyOwogCiAJaWYgKHVubGlrZWx5KHNjX3JlZyA+PSBBUlJBWV9TSVpFKHNjcl9tYXApKSkKQEAgLTI4NSw5ICsyODYsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaWNfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIHNjX3JlZywgdTMyIHZhbCkKK3N0YXRpYyBpbnQgaW5pY19zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBzY19yZWcsIHUzMiB2YWwpCiB7Ci0Jdm9pZCBfX2lvbWVtICpzY3JfYWRkciA9IGluaWNfcG9ydF9iYXNlKGFwKSArIFBPUlRfU0NSOworCXZvaWQgX19pb21lbSAqc2NyX2FkZHIgPSBpbmljX3BvcnRfYmFzZShsaW5rLT5hcCkgKyBQT1JUX1NDUjsKIAogCWlmICh1bmxpa2VseShzY19yZWcgPj0gQVJSQVlfU0laRShzY3JfbWFwKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTQwLDcgKzU0MSw3IEBACiAJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBpbmljX3BvcnRfYmFzZShhcCk7CiAKIAkvKiBmaXJlIHVwIHRoZSBBRE1BIGVuZ2luZSAqLwotCXdyaXRldyhIQ1RMX0ZUSEQwLCBwb3J0X2Jhc2UgKyBIT1NUX0NUTCk7CisJd3JpdGV3KEhDVExfRlRIRDAgfCBIQ1RMX0xFREVOLCBwb3J0X2Jhc2UgKyBIT1NUX0NUTCk7CiAJd3JpdGV3KElETUFfQ1RMX0dPLCBwb3J0X2Jhc2UgKyBQT1JUX0lETUFfQ1RMKTsKIAl3cml0ZWIoMCwgcG9ydF9iYXNlICsgUE9SVF9DUEJfUFRRRklGTyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwppbmRleCAxM2MxZDJhLi4yYjI0YWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCkBAIC00OTMsMTAgKzQ5MywxMCBAQAogCXZvaWQgKCpyZXNldF9idXMpKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgdm9pZCBfX2lvbWVtICptbWlvKTsKIH07CiAKLXN0YXRpYyBpbnQgbXZfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyICp2YWwpOwotc3RhdGljIGludCBtdl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCk7Ci1zdGF0aWMgaW50IG12NV9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgKnZhbCk7Ci1zdGF0aWMgaW50IG12NV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCk7CitzdGF0aWMgaW50IG12X3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyICp2YWwpOworc3RhdGljIGludCBtdl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgdmFsKTsKK3N0YXRpYyBpbnQgbXY1X3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyICp2YWwpOworc3RhdGljIGludCBtdjVfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCk7CiBzdGF0aWMgaW50IG12X3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBtdl9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgaW50IG12X3FjX2RlZmVyKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwpAQCAtNjY3LDcgKzY2Nyw4IEBACiAJeyBQQ0lfVkRFVklDRShNQVJWRUxMLCAweDUwNDEpLCBjaGlwXzUwNHggfSwKIAl7IFBDSV9WREVWSUNFKE1BUlZFTEwsIDB4NTA4MCksIGNoaXBfNTA4MCB9LAogCXsgUENJX1ZERVZJQ0UoTUFSVkVMTCwgMHg1MDgxKSwgY2hpcF81MDh4IH0sCi0JLyogUm9ja2V0UkFJRCAxNzQwLzE3NHggaGF2ZSBkaWZmZXJlbnQgaWRlbnRpZmllcnMgKi8KKwkvKiBSb2NrZXRSQUlEIDE3MjAvMTc0eCBoYXZlIGRpZmZlcmVudCBpZGVudGlmaWVycyAqLworCXsgUENJX1ZERVZJQ0UoVFRJLCAweDE3MjApLCBjaGlwXzYwNDIgfSwKIAl7IFBDSV9WREVWSUNFKFRUSSwgMHgxNzQwKSwgY2hpcF81MDh4IH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIDB4MTc0MiksIGNoaXBfNTA4eCB9LAogCkBAIC0xMDY5LDIzICsxMDcwLDIzIEBACiAJcmV0dXJuIG9mczsKIH0KIAotc3RhdGljIGludCBtdl9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgbXZfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgKnZhbCkKIHsKIAl1bnNpZ25lZCBpbnQgb2ZzID0gbXZfc2NyX29mZnNldChzY19yZWdfaW4pOwogCiAJaWYgKG9mcyAhPSAweGZmZmZmZmZmVSkgewotCQkqdmFsID0gcmVhZGwobXZfYXBfYmFzZShhcCkgKyBvZnMpOworCQkqdmFsID0gcmVhZGwobXZfYXBfYmFzZShsaW5rLT5hcCkgKyBvZnMpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgbXZfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4sIHUzMiB2YWwpCitzdGF0aWMgaW50IG12X3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWdfaW4sIHUzMiB2YWwpCiB7CiAJdW5zaWduZWQgaW50IG9mcyA9IG12X3Njcl9vZmZzZXQoc2NfcmVnX2luKTsKIAogCWlmIChvZnMgIT0gMHhmZmZmZmZmZlUpIHsKLQkJd3JpdGVsZmwodmFsLCBtdl9hcF9iYXNlKGFwKSArIG9mcyk7CisJCXdyaXRlbGZsKHZhbCwgbXZfYXBfYmFzZShsaW5rLT5hcCkgKyBvZnMpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjUwLDExICsyMjUxLDExIEBACiAJcmV0dXJuIG9mczsKIH0KIAotc3RhdGljIGludCBtdjVfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyICp2YWwpCitzdGF0aWMgaW50IG12NV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWdfaW4sIHUzMiAqdmFsKQogewotCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXZfaG9zdF9wcml2ICpocHJpdiA9IGxpbmstPmFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICptbWlvID0gaHByaXYtPmJhc2U7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gbXY1X3BoeV9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBtdjVfcGh5X2Jhc2UobW1pbywgbGluay0+YXAtPnBvcnRfbm8pOwogCXVuc2lnbmVkIGludCBvZnMgPSBtdjVfc2NyX29mZnNldChzY19yZWdfaW4pOwogCiAJaWYgKG9mcyAhPSAweGZmZmZmZmZmVSkgewpAQCAtMjI2NCwxMSArMjI2NSwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBtdjVfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4sIHUzMiB2YWwpCitzdGF0aWMgaW50IG12NV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnX2luLCB1MzIgdmFsKQogewotCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXZfaG9zdF9wcml2ICpocHJpdiA9IGxpbmstPmFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICptbWlvID0gaHByaXYtPmJhc2U7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gbXY1X3BoeV9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBtdjVfcGh5X2Jhc2UobW1pbywgbGluay0+YXAtPnBvcnRfbm8pOwogCXVuc2lnbmVkIGludCBvZnMgPSBtdjVfc2NyX29mZnNldChzY19yZWdfaW4pOwogCiAJaWYgKG9mcyAhPSAweGZmZmZmZmZmVSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IDg1OGY3MDYuLmZhZTM4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTMwMiw4ICszMDIsOCBAQAogc3RhdGljIGlycXJldHVybl90IG52X2dlbmVyaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgbnZfbmYyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwogc3RhdGljIGlycXJldHVybl90IG52X2NrODA0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwotc3RhdGljIGludCBudl9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7Ci1zdGF0aWMgaW50IG52X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKK3N0YXRpYyBpbnQgbnZfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7CitzdGF0aWMgaW50IG52X3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogCiBzdGF0aWMgdm9pZCBudl9uZjJfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgbnZfbmYyX3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC00MDUsMjggKzQwNSw0NSBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBudl9zd25jcV9zbGF2ZV9jb25maWcsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfZ2VuZXJpY19vcHMgPSB7CisvKiBPU0RMIGJ6MzM1MiByZXBvcnRzIHRoYXQgc29tZSBudiBjb250cm9sbGVycyBjYW4ndCBkZXRlcm1pbmUgZGV2aWNlCisgKiBzaWduYXR1cmUgcmVsaWFibHkgYW5kIG52X2hhcmRyZXNldCBpcyBpbXBsZW1lbnRlZCB0byB3b3JrIGFyb3VuZAorICogdGhlIHByb2JsZW0uICBUaGlzIHdhcyByZXBvcnRlZCBvbiBuZjMgYW5kIGl0J3MgdW5jbGVhciB3aGV0aGVyIGFueQorICogb3RoZXIgY29udHJvbGxlcnMgYXJlIGFmZmVjdGVkLiAgSG93ZXZlciwgdGhlIHdvcmthcm91bmQgaGFzIGJlZW4KKyAqIGFwcGxpZWQgdG8gYWxsIHZhcmlhbnRzIGFuZCB0aGVyZSBpc24ndCBtdWNoIHRvIGdhaW4gYnkgdHJ5aW5nIHRvCisgKiBmaW5kIG91dCBleGFjdGx5IHdoaWNoIG9uZXMgYXJlIGFmZmVjdGVkIGF0IHRoaXMgcG9pbnQgZXNwZWNpYWxseQorICogYmVjYXVzZSBOViBoYXMgbW92ZWQgb3ZlciB0byBhaGNpIGZvciBuZXdlciBjb250cm9sbGVycy4KKyAqLworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2NvbW1vbl9vcHMgPSB7CiAJLmluaGVyaXRzCQk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCiAJLmhhcmRyZXNldAkJPSBudl9oYXJkcmVzZXQsCiAJLnNjcl9yZWFkCQk9IG52X3Njcl9yZWFkLAogCS5zY3Jfd3JpdGUJCT0gbnZfc2NyX3dyaXRlLAogfTsKIAorLyogT1NETCBiejExMTk1IHJlcG9ydHMgdGhhdCBsaW5rIGRvZXNuJ3QgY29tZSBvbmxpbmUgYWZ0ZXIgaGFyZHJlc2V0CisgKiBvbiBnZW5lcmljIG52J3MgYW5kIHRoZXJlIGhhdmUgYmVlbiBzZXZlcmFsIG90aGVyIHNpbWlsYXIgcmVwb3J0cworICogb24gbGludXgtaWRlLiAgRGlzYWJsZSBoYXJkcmVzZXQgZm9yIGdlbmVyaWMgbnYncy4KKyAqLworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2dlbmVyaWNfb3BzID0geworCS5pbmhlcml0cwkJPSAmbnZfY29tbW9uX29wcywKKwkuaGFyZHJlc2V0CQk9IEFUQV9PUF9OVUxMLAorfTsKKwogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X25mMl9vcHMgPSB7Ci0JLmluaGVyaXRzCQk9ICZudl9nZW5lcmljX29wcywKKwkuaW5oZXJpdHMJCT0gJm52X2NvbW1vbl9vcHMsCiAJLmZyZWV6ZQkJCT0gbnZfbmYyX2ZyZWV6ZSwKIAkudGhhdwkJCT0gbnZfbmYyX3RoYXcsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfY2s4MDRfb3BzID0gewotCS5pbmhlcml0cwkJPSAmbnZfZ2VuZXJpY19vcHMsCisJLmluaGVyaXRzCQk9ICZudl9jb21tb25fb3BzLAogCS5mcmVlemUJCQk9IG52X2NrODA0X2ZyZWV6ZSwKIAkudGhhdwkJCT0gbnZfY2s4MDRfdGhhdywKIAkuaG9zdF9zdG9wCQk9IG52X2NrODA0X2hvc3Rfc3RvcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9hZG1hX29wcyA9IHsKLQkuaW5oZXJpdHMJCT0gJm52X2dlbmVyaWNfb3BzLAorCS5pbmhlcml0cwkJPSAmbnZfY29tbW9uX29wcywKIAogCS5jaGVja19hdGFwaV9kbWEJPSBudl9hZG1hX2NoZWNrX2F0YXBpX2RtYSwKIAkuc2ZmX3RmX3JlYWQJCT0gbnZfYWRtYV90Zl9yZWFkLApAQCAtNDUwLDcgKzQ2Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfc3duY3Ffb3BzID0gewotCS5pbmhlcml0cwkJPSAmbnZfZ2VuZXJpY19vcHMsCisJLmluaGVyaXRzCQk9ICZudl9jb21tb25fb3BzLAogCiAJLnFjX2RlZmVyCQk9IGF0YV9zdGRfcWNfZGVmZXIsCiAJLnFjX3ByZXAJCT0gbnZfc3duY3FfcWNfcHJlcCwKQEAgLTE0OTQsMjEgKzE1MTEsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG52X3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQorc3RhdGljIGludCBudl9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQogewogCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqdmFsID0gaW9yZWFkMzIoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisJKnZhbCA9IGlvcmVhZDMyKGxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG52X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBudl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQogewogCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpb3dyaXRlMzIodmFsLCBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKKwlpb3dyaXRlMzIodmFsLCBsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIwMSw5ICsyMjE4LDkgQEAKIAlpZiAoIXBwLT5xY19hY3RpdmUpCiAJCXJldHVybjsKIAotCWlmIChhcC0+b3BzLT5zY3JfcmVhZChhcCwgU0NSX0VSUk9SLCAmc2Vycm9yKSkKKwlpZiAoYXAtPm9wcy0+c2NyX3JlYWQoJmFwLT5saW5rLCBTQ1JfRVJST1IsICZzZXJyb3IpKQogCQlyZXR1cm47Ci0JYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIHNlcnJvcik7CisJYXAtPm9wcy0+c2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0VSUk9SLCBzZXJyb3IpOwogCiAJaWYgKGF0YV9zdGF0ICYgQVRBX0VSUikgewogCQlhdGFfZWhpX2NsZWFyX2Rlc2MoZWhpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggMDMwNjY1Yi4uNzUwZDhjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTEzNyw4ICsxMzcsOCBAQAogCWRtYV9hZGRyX3QJCXBrdF9kbWE7CiB9OwogCi1zdGF0aWMgaW50IHBkY19zYXRhX3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKLXN0YXRpYyBpbnQgcGRjX3NhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIGludCBwZGNfc2F0YV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKK3N0YXRpYyBpbnQgcGRjX3NhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiBzdGF0aWMgaW50IHBkY19hdGFfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIGludCBwZGNfY29tbW9uX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgaW50IHBkY19zYXRhX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC0zODYsMTkgKzM4NiwyMSBAQAogCXJldHVybiBBVEFfQ0JMX1NBVEE7CiB9CiAKLXN0YXRpYyBpbnQgcGRjX3NhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IHBkY19zYXRhX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICAgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkqdmFsID0gcmVhZGwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CisJKnZhbCA9IHJlYWRsKGxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBkY19zYXRhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBwZGNfc2F0YV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKIHsKIAlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCiAJCXJldHVybiAtRUlOVkFMOwotCXdyaXRlbCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCXdyaXRlbCh2YWwsIGxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogCXJldHVybiAwOwogfQogCkBAIC03MzEsNyArNzMzLDcgQEAKIAlpZiAoc2F0YV9zY3JfdmFsaWQoJmFwLT5saW5rKSkgewogCQl1MzIgc2Vycm9yOwogCi0JCXBkY19zYXRhX3Njcl9yZWFkKGFwLCBTQ1JfRVJST1IsICZzZXJyb3IpOworCQlwZGNfc2F0YV9zY3JfcmVhZCgmYXAtPmxpbmssIFNDUl9FUlJPUiwgJnNlcnJvcik7CiAJCWVoaS0+c2Vycm9yIHw9IHNlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYyBiL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYwppbmRleCAxNjAwMTA3Li5hMDAwYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCkBAIC0xMTEsOCArMTExLDggQEAKIAlxc19zdGF0ZV90CQlzdGF0ZTsKIH07CiAKLXN0YXRpYyBpbnQgcXNfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOwotc3RhdGljIGludCBxc19zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IHFzX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOworc3RhdGljIGludCBxc19zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyBpbnQgcXNfYXRhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyBpbnQgcXNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHFzX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwpAQCAtMjQyLDExICsyNDIsMTEgQEAKIAlyZXR1cm4gYXRhX3NmZl9wcmVyZXNldChsaW5rLCBkZWFkbGluZSk7CiB9CiAKLXN0YXRpYyBpbnQgcXNfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IHFzX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkqdmFsID0gcmVhZGwoYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA4KSk7CisJKnZhbCA9IHJlYWRsKGxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogOCkpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogCWF0YV9zdGRfZXJyb3JfaGFuZGxlcihhcCk7CiB9CiAKLXN0YXRpYyBpbnQgcXNfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCitzdGF0aWMgaW50IHFzX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl3cml0ZWwodmFsLCBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDgpKTsKKwl3cml0ZWwodmFsLCBsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDgpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKaW5kZXggODhiZjQyMS4uMDMxZDdiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCkBAIC0xMTUsOCArMTE1LDggQEAKIHN0YXRpYyBpbnQgc2lsX3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZgogc3RhdGljIHZvaWQgc2lsX2Rldl9jb25maWcoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHNpbF9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNpbF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CitzdGF0aWMgaW50IHNpbF9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc2lsX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBzaWxfc2V0X21vZGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkKTsKIHN0YXRpYyB2b2lkIHNpbF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBzaWxfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKQEAgLTMxNyw5ICszMTcsOSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHNpbF9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgc2lsX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gc2lsX3Njcl9hZGRyKGFwLCBzY19yZWcpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHNpbF9zY3JfYWRkcihsaW5rLT5hcCwgc2NfcmVnKTsKIAogCWlmIChtbWlvKSB7CiAJCSp2YWwgPSByZWFkbChtbWlvKTsKQEAgLTMyOCw5ICszMjgsOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHNpbF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKK3N0YXRpYyBpbnQgc2lsX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gc2lsX3Njcl9hZGRyKGFwLCBzY19yZWcpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IHNpbF9zY3JfYWRkcihsaW5rLT5hcCwgc2NfcmVnKTsKIAogCWlmIChtbWlvKSB7CiAJCXdyaXRlbCh2YWwsIG1taW8pOwpAQCAtMzUyLDggKzM1Miw4IEBACiAJCSAqIGNvbnRyb2xsZXJzIGNvbnRpbnVlIHRvIGFzc2VydCBJUlEgYXMgbG9uZyBhcwogCQkgKiBTRXJyb3IgYml0cyBhcmUgcGVuZGluZy4gIENsZWFyIFNFcnJvciBpbW1lZGlhdGVseS4KIAkJICovCi0JCXNpbF9zY3JfcmVhZChhcCwgU0NSX0VSUk9SLCAmc2Vycm9yKTsKLQkJc2lsX3Njcl93cml0ZShhcCwgU0NSX0VSUk9SLCBzZXJyb3IpOworCQlzaWxfc2NyX3JlYWQoJmFwLT5saW5rLCBTQ1JfRVJST1IsICZzZXJyb3IpOworCQlzaWxfc2NyX3dyaXRlKCZhcC0+bGluaywgU0NSX0VSUk9SLCBzZXJyb3IpOwogCiAJCS8qIFNvbWV0aW1lcyBzcHVyaW91cyBpbnRlcnJ1cHRzIG9jY3VyLCBkb3VibGUgY2hlY2sKIAkJICogaXQncyBQSFlSRFkgQ0hHLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCmluZGV4IDg0ZmZjYzIuLjQ2MjE4MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKQEAgLTM0MCw4ICszNDAsOCBAQAogfTsKIAogc3RhdGljIHZvaWQgc2lsMjRfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgc2lsMjRfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgc2NfcmVnLCB1MzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNpbDI0X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIGludCBzaWwyNF9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIHNjX3JlZywgdTMyICp2YWwpOworc3RhdGljIGludCBzaWwyNF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBzaWwyNF9xY19kZWZlcihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHNpbDI0X3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNpbDI0X3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwpAQCAtNTA0LDkgKzUwNCw5IEBACiAJW1NDUl9BQ1RJVkVdCT0gMywKIH07CiAKLXN0YXRpYyBpbnQgc2lsMjRfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgc2NfcmVnLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgc2lsMjRfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBzY19yZWcsIHUzMiAqdmFsKQogewotCXZvaWQgX19pb21lbSAqc2NyX2FkZHIgPSBzaWwyNF9wb3J0X2Jhc2UoYXApICsgUE9SVF9TQ09OVFJPTDsKKwl2b2lkIF9faW9tZW0gKnNjcl9hZGRyID0gc2lsMjRfcG9ydF9iYXNlKGxpbmstPmFwKSArIFBPUlRfU0NPTlRST0w7CiAKIAlpZiAoc2NfcmVnIDwgQVJSQVlfU0laRShzaWwyNF9zY3JfbWFwKSkgewogCQl2b2lkIF9faW9tZW0gKmFkZHI7CkBAIC01MTcsOSArNTE3LDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBzaWwyNF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBzaWwyNF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBzY19yZWcsIHUzMiB2YWwpCiB7Ci0Jdm9pZCBfX2lvbWVtICpzY3JfYWRkciA9IHNpbDI0X3BvcnRfYmFzZShhcCkgKyBQT1JUX1NDT05UUk9MOworCXZvaWQgX19pb21lbSAqc2NyX2FkZHIgPSBzaWwyNF9wb3J0X2Jhc2UobGluay0+YXApICsgUE9SVF9TQ09OVFJPTDsKIAogCWlmIChzY19yZWcgPCBBUlJBWV9TSVpFKHNpbDI0X3Njcl9tYXApKSB7CiAJCXZvaWQgX19pb21lbSAqYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCmluZGV4IDEwMTBiMzAuLjljNDNiNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwpAQCAtNjQsOCArNjQsOCBAQAogfTsKIAogc3RhdGljIGludCBzaXNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIGludCBzaXNfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOwotc3RhdGljIGludCBzaXNfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOworc3RhdGljIGludCBzaXNfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7CitzdGF0aWMgaW50IHNpc19zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpc19wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShTSSwgMHgwMTgwKSwgc2lzXzE4MCB9LAkvKiBTaVMgOTY0LzE4MCAqLwpAQCAtMTM0LDEwICsxMzQsMTEgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIHUzMiBzaXNfc2NyX2NmZ19yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQorc3RhdGljIHUzMiBzaXNfc2NyX2NmZ19yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcCwgc2NfcmVnKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYobGluay0+YXAtPmhvc3QtPmRldik7CisJdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihsaW5rLT5hcCwgc2NfcmVnKTsKIAl1MzIgdmFsMiA9IDA7CiAJdTggcG1yOwogCkBAIC0xNTgsMTAgKzE1OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNpc19zY3JfY2ZnX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCitzdGF0aWMgaW50IHNpc19zY3JfY2ZnX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICAgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihhcCwgc2NfcmVnKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYobGluay0+YXAtPmhvc3QtPmRldik7CisJdW5zaWduZWQgaW50IGNmZ19hZGRyID0gZ2V0X3Njcl9jZmdfYWRkcihsaW5rLT5hcCwgc2NfcmVnKTsKIAl1OCBwbXI7CiAKIAlpZiAoc2NfcmVnID09IFNDUl9FUlJPUikgLyogZG9lc24ndCBleGlzdCBpbiBQQ0kgY2ZnIHNwYWNlICovCkBAIC0xNzgsOCArMTgwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaXNfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IHNpc19zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTggcG1yOwogCkBAIC0xODcsNyArMTkwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQotCQlyZXR1cm4gc2lzX3Njcl9jZmdfcmVhZChhcCwgc2NfcmVnLCB2YWwpOworCQlyZXR1cm4gc2lzX3Njcl9jZmdfcmVhZChsaW5rLCBzY19yZWcsIHZhbCk7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBTSVNfUE1SLCAmcG1yKTsKIApAQCAtMjAyLDggKzIwNSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2lzX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBzaXNfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKIHsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXU4IHBtcjsKIApAQCAtMjEzLDcgKzIxNyw3IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgU0lTX1BNUiwgJnBtcik7CiAKIAlpZiAoYXAtPmZsYWdzICYgU0lTX0ZMQUdfQ0ZHU0NSKQotCQlyZXR1cm4gc2lzX3Njcl9jZmdfd3JpdGUoYXAsIHNjX3JlZywgdmFsKTsKKwkJcmV0dXJuIHNpc19zY3JfY2ZnX3dyaXRlKGxpbmssIHNjX3JlZywgdmFsKTsKIAllbHNlIHsKIAkJaW93cml0ZTMyKHZhbCwgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CiAJCWlmICgocGRldi0+ZGV2aWNlID09IDB4MDE4MikgfHwgKHBkZXYtPmRldmljZSA9PSAweDAxODMpIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zdncuYwppbmRleCBmYjEzYjgyLi42MDlkMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKQEAgLTEyMywyMCArMTIzLDIyIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGsyX3NhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCitzdGF0aWMgaW50IGsyX3NhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJICAgIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQogewogCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JKnZhbCA9IHJlYWRsKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCSp2YWwgPSByZWFkbChsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW50IGsyX3NhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCitzdGF0aWMgaW50IGsyX3NhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICAgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKIHsKIAlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCiAJCXJldHVybiAtRUlOVkFMOwotCXdyaXRlbCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCXdyaXRlbCh2YWwsIGxpbmstPmFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jIGIvZHJpdmVycy9hdGEvc2F0YV91bGkuYwppbmRleCBkYjUyOWI4Li4wMTk1NzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKQEAgLTU3LDggKzU3LDggQEAKIH07CiAKIHN0YXRpYyBpbnQgdWxpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyBpbnQgdWxpX3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKLXN0YXRpYyBpbnQgdWxpX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKK3N0YXRpYyBpbnQgdWxpX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOworc3RhdGljIGludCB1bGlfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB1bGlfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoQUwsIDB4NTI4OSksIHVsaV81Mjg5IH0sCkBAIC0xMDcsMzkgKzEwNywzOSBAQAogCXJldHVybiBocHJpdi0+c2NyX2NmZ19hZGRyW2FwLT5wb3J0X25vXSArICg0ICogc2NfcmVnKTsKIH0KIAotc3RhdGljIHUzMiB1bGlfc2NyX2NmZ19yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCitzdGF0aWMgdTMyIHVsaV9zY3JfY2ZnX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnKQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGFwLCBzY19yZWcpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihsaW5rLT5hcC0+aG9zdC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2FkZHIgPSBnZXRfc2NyX2NmZ19hZGRyKGxpbmstPmFwLCBzY19yZWcpOwogCXUzMiB2YWw7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIsICZ2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHVsaV9zY3JfY2ZnX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY3IsIHUzMiB2YWwpCitzdGF0aWMgdm9pZCB1bGlfc2NyX2NmZ193cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY3IsIHUzMiB2YWwpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIoYXAsIHNjcik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGxpbmstPmFwLT5ob3N0LT5kZXYpOworCXVuc2lnbmVkIGludCBjZmdfYWRkciA9IGdldF9zY3JfY2ZnX2FkZHIobGluay0+YXAsIHNjcik7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNmZ19hZGRyLCB2YWwpOwogfQogCi1zdGF0aWMgaW50IHVsaV9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgdWxpX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSp2YWwgPSB1bGlfc2NyX2NmZ19yZWFkKGFwLCBzY19yZWcpOworCSp2YWwgPSB1bGlfc2NyX2NmZ19yZWFkKGxpbmssIHNjX3JlZyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWxpX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCB1bGlfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKIHsKIAlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpIC8vU0NSX0NPTlRST0w9MiwgU0NSX0VSUk9SPTEsIFNDUl9TVEFUVVM9MAogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXVsaV9zY3JfY2ZnX3dyaXRlKGFwLCBzY19yZWcsIHZhbCk7CisJdWxpX3Njcl9jZmdfd3JpdGUobGluaywgc2NfcmVnLCB2YWwpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwppbmRleCA5NmRlZWIzLi4xY2ZhNzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKQEAgLTY4LDggKzY4LDggQEAKIH07CiAKIHN0YXRpYyBpbnQgc3ZpYV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgaW50IHN2aWFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOwotc3RhdGljIGludCBzdmlhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKK3N0YXRpYyBpbnQgc3ZpYV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKK3N0YXRpYyBpbnQgc3ZpYV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyB2b2lkIHN2aWFfbm9vcF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgaW50IHZ0NjQyMF9wcmVyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpOwogc3RhdGljIGludCB2dDY0MjFfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC0xNTIsMTkgKzE1MiwxOSBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN2aWFfcGNpX3RibCk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKLXN0YXRpYyBpbnQgc3ZpYV9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgc3ZpYV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKQogewogCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JKnZhbCA9IGlvcmVhZDMyKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoNCAqIHNjX3JlZykpOworCSp2YWwgPSBpb3JlYWQzMihsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKDQgKiBzY19yZWcpKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdmlhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKQorc3RhdGljIGludCBzdmlhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpb3dyaXRlMzIodmFsLCBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKDQgKiBzY19yZWcpKTsKKwlpb3dyaXRlMzIodmFsLCBsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKDQgKiBzY19yZWcpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEwLDIwICsyMTAsMjAgQEAKIAkJZ290byBza2lwX3NjcjsKIAogCS8qIFJlc3VtZSBwaHkuICBUaGlzIGlzIHRoZSBvbGQgU0FUQSByZXN1bWUgc2VxdWVuY2UgKi8KLQlzdmlhX3Njcl93cml0ZShhcCwgU0NSX0NPTlRST0wsIDB4MzAwKTsKLQlzdmlhX3Njcl9yZWFkKGFwLCBTQ1JfQ09OVFJPTCwgJnNjb250cm9sKTsgLyogZmx1c2ggKi8KKwlzdmlhX3Njcl93cml0ZShsaW5rLCBTQ1JfQ09OVFJPTCwgMHgzMDApOworCXN2aWFfc2NyX3JlYWQobGluaywgU0NSX0NPTlRST0wsICZzY29udHJvbCk7IC8qIGZsdXNoICovCiAKIAkvKiB3YWl0IGZvciBwaHkgdG8gYmVjb21lIHJlYWR5LCBpZiBuZWNlc3NhcnkgKi8KIAlkbyB7CiAJCW1zbGVlcCgyMDApOwotCQlzdmlhX3Njcl9yZWFkKGFwLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cyk7CisJCXN2aWFfc2NyX3JlYWQobGluaywgU0NSX1NUQVRVUywgJnNzdGF0dXMpOwogCQlpZiAoKHNzdGF0dXMgJiAweGYpICE9IDEpCiAJCQlicmVhazsKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CiAKIAkvKiBvcGVuIGNvZGUgc2F0YV9wcmludF9saW5rX3N0YXR1cygpICovCi0Jc3ZpYV9zY3JfcmVhZChhcCwgU0NSX1NUQVRVUywgJnNzdGF0dXMpOwotCXN2aWFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpOworCXN2aWFfc2NyX3JlYWQobGluaywgU0NSX1NUQVRVUywgJnNzdGF0dXMpOworCXN2aWFfc2NyX3JlYWQobGluaywgU0NSX0NPTlRST0wsICZzY29udHJvbCk7CiAKIAlvbmxpbmUgPSAoc3N0YXR1cyAmIDB4ZikgPT0gMHgzOwogCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJCW9ubGluZSA/ICJ1cCIgOiAiZG93biIsIHNzdGF0dXMsIHNjb250cm9sKTsKIAogCS8qIFNTdGF0dXMgaXMgcmVhZCBvbmUgbW9yZSB0aW1lICovCi0Jc3ZpYV9zY3JfcmVhZChhcCwgU0NSX1NUQVRVUywgJnNzdGF0dXMpOworCXN2aWFfc2NyX3JlYWQobGluaywgU0NSX1NUQVRVUywgJnNzdGF0dXMpOwogCiAJaWYgKCFvbmxpbmUpIHsKIAkJLyogdGVsbCBFSCB0byBiYWlsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCBmM2Q2MzVjLi5jNTdjZGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTk4LDIwICs5OCwyMiBAQAogCQkJICAgICAgVlNDX1NBVEFfSU5UX1BIWV9DSEFOR0UpLAogfTsKIAotc3RhdGljIGludCB2c2Nfc2F0YV9zY3JfcmVhZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKK3N0YXRpYyBpbnQgdnNjX3NhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCkKIHsKIAlpZiAoc2NfcmVnID4gU0NSX0NPTlRST0wpCiAJCXJldHVybiAtRUlOVkFMOwotCSp2YWwgPSByZWFkbChhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKKwkqdmFsID0gcmVhZGwobGluay0+YXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CiAJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIGludCB2c2Nfc2F0YV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKK3N0YXRpYyBpbnQgdnNjX3NhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl3cml0ZWwodmFsLCBhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKKwl3cml0ZWwodmFsLCBsaW5rLT5hcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA0MWIyMjA0Li41NTAzYmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtMTI3MCw3ICsxMjcwLDcgQEAKIAkJCWlmICgqcHJlIDwgMykgKCpwcmUpKys7IC8qIGVsc2UgZmFpbCBsYXRlciAqLwogCQkJZGl2ID0gcHJlX2RpdlsqcHJlXSotKnBjcjsKIAkJCURQUklOVEsoIm1heCBkaXYgJWRcbiIsZGl2KTsKLQkJCSpyZXMgPSAoVFNfQ0xPQ0srZGl2LTEpL2Rpdi0xOworCQkJKnJlcyA9IERJVl9ST1VORF9VUChUU19DTE9DSywgZGl2KS0xOwogCQl9CiAJCWlmICgqcmVzIDwgMCkgKnJlcyA9IDA7CiAJCWlmICgqcmVzID4gTUlEX1NFR19NQVhfUkFURSkgKnJlcyA9IE1JRF9TRUdfTUFYX1JBVEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuYwppbmRleCA3MzMzOGQyLi45MzdjOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCisrKyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKQEAgLTQ3LDggKzQ3LDkgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpZmRlZiBDT05GSUdfU0JVUworI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTY2MSwyNDkgKzY2MiwxODkgQEAKIAogI2lmZGVmIENPTkZJR19TQlVTCiAKLXN0YXRpYyB1MzIKLWZvcmUyMDBlX3NiYV9yZWFkKHZvbGF0aWxlIHUzMiBfX2lvbWVtICphZGRyKQorc3RhdGljIHUzMiBmb3JlMjAwZV9zYmFfcmVhZCh2b2xhdGlsZSB1MzIgX19pb21lbSAqYWRkcikKIHsKICAgICByZXR1cm4gc2J1c19yZWFkbChhZGRyKTsKIH0KIAotCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX3dyaXRlKHUzMiB2YWwsIHZvbGF0aWxlIHUzMiBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgZm9yZTIwMGVfc2JhX3dyaXRlKHUzMiB2YWwsIHZvbGF0aWxlIHUzMiBfX2lvbWVtICphZGRyKQogewogICAgIHNidXNfd3JpdGVsKHZhbCwgYWRkcik7CiB9CiAKLQotc3RhdGljIHUzMgotZm9yZTIwMGVfc2JhX2RtYV9tYXAoc3RydWN0IGZvcmUyMDBlKiBmb3JlMjAwZSwgdm9pZCogdmlydF9hZGRyLCBpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3N0YXRpYyB1MzIgZm9yZTIwMGVfc2JhX2RtYV9tYXAoc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSwgdm9pZCogdmlydF9hZGRyLCBpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKLSAgICB1MzIgZG1hX2FkZHIgPSBzYnVzX21hcF9zaW5nbGUoKHN0cnVjdCBzYnVzX2RldiopZm9yZTIwMGUtPmJ1c19kZXYsIHZpcnRfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGZvcmUyMDBlLT5idXNfZGV2OworCXUzMiBkbWFfYWRkcjsKIAotICAgIERQUklOVEsoMywgIlNCVVMgRFZNQSBtYXBwaW5nOiB2aXJ0X2FkZHIgPSAweCVwLCBzaXplID0gJWQsIGRpcmVjdGlvbiA9ICVkIC0tPiBkbWFfYWRkciA9IDB4JTA4eFxuIiwKLQkgICAgdmlydF9hZGRyLCBzaXplLCBkaXJlY3Rpb24sIGRtYV9hZGRyKTsKKwlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZvcC0+ZGV2LCB2aXJ0X2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisKKwlEUFJJTlRLKDMsICJTQlVTIERWTUEgbWFwcGluZzogdmlydF9hZGRyID0gMHglcCwgc2l6ZSA9ICVkLCBkaXJlY3Rpb24gPSAlZCAtLT4gZG1hX2FkZHIgPSAweCUwOHhcbiIsCisJCXZpcnRfYWRkciwgc2l6ZSwgZGlyZWN0aW9uLCBkbWFfYWRkcik7CiAgICAgCi0gICAgcmV0dXJuIGRtYV9hZGRyOworCXJldHVybiBkbWFfYWRkcjsKIH0KIAotCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX2RtYV91bm1hcChzdHJ1Y3QgZm9yZTIwMGUqIGZvcmUyMDBlLCB1MzIgZG1hX2FkZHIsIGludCBzaXplLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgZm9yZTIwMGVfc2JhX2RtYV91bm1hcChzdHJ1Y3QgZm9yZTIwMGUgKmZvcmUyMDBlLCB1MzIgZG1hX2FkZHIsIGludCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewotICAgIERQUklOVEsoMywgIlNCVVMgRFZNQSB1bm1hcHBpbmc6IGRtYV9hZGRyID0gMHglMDh4LCBzaXplID0gJWQsIGRpcmVjdGlvbiA9ICVkLFxuIiwKLQkgICAgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKIAotICAgIHNidXNfdW5tYXBfc2luZ2xlKChzdHJ1Y3Qgc2J1c19kZXYqKWZvcmUyMDBlLT5idXNfZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlEUFJJTlRLKDMsICJTQlVTIERWTUEgdW5tYXBwaW5nOiBkbWFfYWRkciA9IDB4JTA4eCwgc2l6ZSA9ICVkLCBkaXJlY3Rpb24gPSAlZCxcbiIsCisJCWRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCisJZG1hX3VubWFwX3NpbmdsZSgmb3AtPmRldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKLQotc3RhdGljIHZvaWQKLWZvcmUyMDBlX3NiYV9kbWFfc3luY19mb3JfY3B1KHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUsIHUzMiBkbWFfYWRkciwgaW50IHNpemUsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBmb3JlMjAwZV9zYmFfZG1hX3N5bmNfZm9yX2NwdShzdHJ1Y3QgZm9yZTIwMGUgKmZvcmUyMDBlLCB1MzIgZG1hX2FkZHIsIGludCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewotICAgIERQUklOVEsoMywgIlNCVVMgRFZNQSBzeW5jOiBkbWFfYWRkciA9IDB4JTA4eCwgc2l6ZSA9ICVkLCBkaXJlY3Rpb24gPSAlZFxuIiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKKworCURQUklOVEsoMywgIlNCVVMgRFZNQSBzeW5jOiBkbWFfYWRkciA9IDB4JTA4eCwgc2l6ZSA9ICVkLCBkaXJlY3Rpb24gPSAlZFxuIiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CiAgICAgCi0gICAgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgoc3RydWN0IHNidXNfZGV2Kilmb3JlMjAwZS0+YnVzX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJm9wLT5kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX2RtYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGZvcmUyMDBlKiBmb3JlMjAwZSwgdTMyIGRtYV9hZGRyLCBpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIGZvcmUyMDBlX3NiYV9kbWFfc3luY19mb3JfZGV2aWNlKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUsIHUzMiBkbWFfYWRkciwgaW50IHNpemUsIGludCBkaXJlY3Rpb24pCiB7Ci0gICAgRFBSSU5USygzLCAiU0JVUyBEVk1BIHN5bmM6IGRtYV9hZGRyID0gMHglMDh4LCBzaXplID0gJWQsIGRpcmVjdGlvbiA9ICVkXG4iLCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGZvcmUyMDBlLT5idXNfZGV2OwogCi0gICAgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgoc3RydWN0IHNidXNfZGV2Kilmb3JlMjAwZS0+YnVzX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJRFBSSU5USygzLCAiU0JVUyBEVk1BIHN5bmM6IGRtYV9hZGRyID0gMHglMDh4LCBzaXplID0gJWQsIGRpcmVjdGlvbiA9ICVkXG4iLCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKworCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZvcC0+ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KIAotCi0vKiBhbGxvY2F0ZSBhIERWTUEgY29uc2lzdGVudCBjaHVuayBvZiBtZW1vcnkgaW50ZW5kZWQgdG8gYWN0IGFzIGEgY29tbXVuaWNhdGlvbiBtZWNoYW5pc20KLSAgICh0byBob2xkIGRlc2NyaXB0b3JzLCBzdGF0dXMsIHF1ZXVlcywgZXRjLikgc2hhcmVkIGJ5IHRoZSBkcml2ZXIgYW5kIHRoZSBhZGFwdGVyICovCi0KLXN0YXRpYyBpbnQKLWZvcmUyMDBlX3NiYV9kbWFfY2h1bmtfYWxsb2Moc3RydWN0IGZvcmUyMDBlKiBmb3JlMjAwZSwgc3RydWN0IGNodW5rKiBjaHVuaywKLQkJCSAgICAgaW50IHNpemUsIGludCBuYnIsIGludCBhbGlnbm1lbnQpCisvKiBBbGxvY2F0ZSBhIERWTUEgY29uc2lzdGVudCBjaHVuayBvZiBtZW1vcnkgaW50ZW5kZWQgdG8gYWN0IGFzIGEgY29tbXVuaWNhdGlvbiBtZWNoYW5pc20KKyAqICh0byBob2xkIGRlc2NyaXB0b3JzLCBzdGF0dXMsIHF1ZXVlcywgZXRjLikgc2hhcmVkIGJ5IHRoZSBkcml2ZXIgYW5kIHRoZSBhZGFwdGVyLgorICovCitzdGF0aWMgaW50IGZvcmUyMDBlX3NiYV9kbWFfY2h1bmtfYWxsb2Moc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSwgc3RydWN0IGNodW5rICpjaHVuaywKKwkJCQkJaW50IHNpemUsIGludCBuYnIsIGludCBhbGlnbm1lbnQpCiB7Ci0gICAgY2h1bmstPmFsbG9jX3NpemUgPSBjaHVuay0+YWxpZ25fc2l6ZSA9IHNpemUgKiBuYnI7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKIAotICAgIC8qIHJldHVybmVkIGNodW5rcyBhcmUgcGFnZS1hbGlnbmVkICovCi0gICAgY2h1bmstPmFsbG9jX2FkZHIgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoKHN0cnVjdCBzYnVzX2RldiopZm9yZTIwMGUtPmJ1c19kZXYsCi0JCQkJCSAgICAgIGNodW5rLT5hbGxvY19zaXplLAotCQkJCQkgICAgICAmY2h1bmstPmRtYV9hZGRyKTsKKwljaHVuay0+YWxsb2Nfc2l6ZSA9IGNodW5rLT5hbGlnbl9zaXplID0gc2l6ZSAqIG5icjsKIAotICAgIGlmICgoY2h1bmstPmFsbG9jX2FkZHIgPT0gTlVMTCkgfHwgKGNodW5rLT5kbWFfYWRkciA9PSAwKSkKLQlyZXR1cm4gLUVOT01FTTsKKwkvKiByZXR1cm5lZCBjaHVua3MgYXJlIHBhZ2UtYWxpZ25lZCAqLworCWNodW5rLT5hbGxvY19hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvcC0+ZGV2LCBjaHVuay0+YWxsb2Nfc2l6ZSwKKwkJCQkJICAgICAgICZjaHVuay0+ZG1hX2FkZHIsIEdGUF9BVE9NSUMpOwogCi0gICAgY2h1bmstPmFsaWduX2FkZHIgPSBjaHVuay0+YWxsb2NfYWRkcjsKKwlpZiAoKGNodW5rLT5hbGxvY19hZGRyID09IE5VTEwpIHx8IChjaHVuay0+ZG1hX2FkZHIgPT0gMCkpCisJCXJldHVybiAtRU5PTUVNOworCisJY2h1bmstPmFsaWduX2FkZHIgPSBjaHVuay0+YWxsb2NfYWRkcjsKICAgICAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotCiAvKiBmcmVlIGEgRFZNQSBjb25zaXN0ZW50IGNodW5rIG9mIG1lbW9yeSAqLwotCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX2RtYV9jaHVua19mcmVlKHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUsIHN0cnVjdCBjaHVuayogY2h1bmspCitzdGF0aWMgdm9pZCBmb3JlMjAwZV9zYmFfZG1hX2NodW5rX2ZyZWUoc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSwgc3RydWN0IGNodW5rICpjaHVuaykKIHsKLSAgICBzYnVzX2ZyZWVfY29uc2lzdGVudCgoc3RydWN0IHNidXNfZGV2Kilmb3JlMjAwZS0+YnVzX2RldiwKLQkJCSBjaHVuay0+YWxsb2Nfc2l6ZSwKLQkJCSBjaHVuay0+YWxsb2NfYWRkciwKLQkJCSBjaHVuay0+ZG1hX2FkZHIpOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZm9yZTIwMGUtPmJ1c19kZXY7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmb3AtPmRldiwgY2h1bmstPmFsbG9jX3NpemUsCisJCQkgIGNodW5rLT5hbGxvY19hZGRyLCBjaHVuay0+ZG1hX2FkZHIpOwogfQogCi0KLXN0YXRpYyB2b2lkCi1mb3JlMjAwZV9zYmFfaXJxX2VuYWJsZShzdHJ1Y3QgZm9yZTIwMGUqIGZvcmUyMDBlKQorc3RhdGljIHZvaWQgZm9yZTIwMGVfc2JhX2lycV9lbmFibGUoc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSkKIHsKLSAgICB1MzIgaGNyID0gZm9yZTIwMGUtPmJ1cy0+cmVhZChmb3JlMjAwZS0+cmVncy5zYmEuaGNyKSAmIFNCQTIwMEVfSENSX1NUSUNLWTsKLSAgICBmb3JlMjAwZS0+YnVzLT53cml0ZShoY3IgfCBTQkEyMDBFX0hDUl9JTlRSX0VOQSwgZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcik7CisJdTMyIGhjciA9IGZvcmUyMDBlLT5idXMtPnJlYWQoZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcikgJiBTQkEyMDBFX0hDUl9TVElDS1k7CisJZm9yZTIwMGUtPmJ1cy0+d3JpdGUoaGNyIHwgU0JBMjAwRV9IQ1JfSU5UUl9FTkEsIGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpOwogfQogCi0KLXN0YXRpYyBpbnQKLWZvcmUyMDBlX3NiYV9pcnFfY2hlY2soc3RydWN0IGZvcmUyMDBlKiBmb3JlMjAwZSkKK3N0YXRpYyBpbnQgZm9yZTIwMGVfc2JhX2lycV9jaGVjayhzdHJ1Y3QgZm9yZTIwMGUgKmZvcmUyMDBlKQogewotICAgIHJldHVybiBmb3JlMjAwZS0+YnVzLT5yZWFkKGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpICYgU0JBMjAwRV9IQ1JfSU5UUl9SRVE7CisJcmV0dXJuIGZvcmUyMDBlLT5idXMtPnJlYWQoZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcikgJiBTQkEyMDBFX0hDUl9JTlRSX1JFUTsKIH0KIAotCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX2lycV9hY2soc3RydWN0IGZvcmUyMDBlKiBmb3JlMjAwZSkKK3N0YXRpYyB2b2lkIGZvcmUyMDBlX3NiYV9pcnFfYWNrKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUpCiB7Ci0gICAgdTMyIGhjciA9IGZvcmUyMDBlLT5idXMtPnJlYWQoZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcikgJiBTQkEyMDBFX0hDUl9TVElDS1k7Ci0gICAgZm9yZTIwMGUtPmJ1cy0+d3JpdGUoaGNyIHwgU0JBMjAwRV9IQ1JfSU5UUl9DTFIsIGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpOworCXUzMiBoY3IgPSBmb3JlMjAwZS0+YnVzLT5yZWFkKGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpICYgU0JBMjAwRV9IQ1JfU1RJQ0tZOworCWZvcmUyMDBlLT5idXMtPndyaXRlKGhjciB8IFNCQTIwMEVfSENSX0lOVFJfQ0xSLCBmb3JlMjAwZS0+cmVncy5zYmEuaGNyKTsKIH0KIAotCi1zdGF0aWMgdm9pZAotZm9yZTIwMGVfc2JhX3Jlc2V0KHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUpCitzdGF0aWMgdm9pZCBmb3JlMjAwZV9zYmFfcmVzZXQoc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSkKIHsKLSAgICBmb3JlMjAwZS0+YnVzLT53cml0ZShTQkEyMDBFX0hDUl9SRVNFVCwgZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcik7Ci0gICAgZm9yZTIwMGVfc3BpbigxMCk7Ci0gICAgZm9yZTIwMGUtPmJ1cy0+d3JpdGUoMCwgZm9yZTIwMGUtPnJlZ3Muc2JhLmhjcik7CisJZm9yZTIwMGUtPmJ1cy0+d3JpdGUoU0JBMjAwRV9IQ1JfUkVTRVQsIGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpOworCWZvcmUyMDBlX3NwaW4oMTApOworCWZvcmUyMDBlLT5idXMtPndyaXRlKDAsIGZvcmUyMDBlLT5yZWdzLnNiYS5oY3IpOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1mb3JlMjAwZV9zYmFfbWFwKHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUpCitzdGF0aWMgaW50IF9faW5pdCBmb3JlMjAwZV9zYmFfbWFwKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUpCiB7Ci0gICAgc3RydWN0IHNidXNfZGV2KiBzYnVzX2RldiA9IChzdHJ1Y3Qgc2J1c19kZXYqKWZvcmUyMDBlLT5idXNfZGV2OwotICAgIHVuc2lnbmVkIGludCBidXJzdHM7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKKwl1bnNpZ25lZCBpbnQgYnVyc3RzOwogCi0gICAgLyogZ2FpbiBhY2Nlc3MgdG8gdGhlIFNCQSBzcGVjaWZpYyByZWdpc3RlcnMgICovCi0gICAgZm9yZTIwMGUtPnJlZ3Muc2JhLmhjciA9IHNidXNfaW9yZW1hcCgmc2J1c19kZXYtPnJlc291cmNlWzBdLCAwLCBTQkEyMDBFX0hDUl9MRU5HVEgsICJTQkEgSENSIik7Ci0gICAgZm9yZTIwMGUtPnJlZ3Muc2JhLmJzciA9IHNidXNfaW9yZW1hcCgmc2J1c19kZXYtPnJlc291cmNlWzFdLCAwLCBTQkEyMDBFX0JTUl9MRU5HVEgsICJTQkEgQlNSIik7Ci0gICAgZm9yZTIwMGUtPnJlZ3Muc2JhLmlzciA9IHNidXNfaW9yZW1hcCgmc2J1c19kZXYtPnJlc291cmNlWzJdLCAwLCBTQkEyMDBFX0lTUl9MRU5HVEgsICJTQkEgSVNSIik7Ci0gICAgZm9yZTIwMGUtPnZpcnRfYmFzZSAgICA9IHNidXNfaW9yZW1hcCgmc2J1c19kZXYtPnJlc291cmNlWzNdLCAwLCBTQkEyMDBFX1JBTV9MRU5HVEgsICJTQkEgUkFNIik7CisJLyogZ2FpbiBhY2Nlc3MgdG8gdGhlIFNCQSBzcGVjaWZpYyByZWdpc3RlcnMgICovCisJZm9yZTIwMGUtPnJlZ3Muc2JhLmhjciA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwgU0JBMjAwRV9IQ1JfTEVOR1RILCAiU0JBIEhDUiIpOworCWZvcmUyMDBlLT5yZWdzLnNiYS5ic3IgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsIFNCQTIwMEVfQlNSX0xFTkdUSCwgIlNCQSBCU1IiKTsKKwlmb3JlMjAwZS0+cmVncy5zYmEuaXNyID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLCBTQkEyMDBFX0lTUl9MRU5HVEgsICJTQkEgSVNSIik7CisJZm9yZTIwMGUtPnZpcnRfYmFzZSAgICA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVszXSwgMCwgU0JBMjAwRV9SQU1fTEVOR1RILCAiU0JBIFJBTSIpOwogCi0gICAgaWYgKGZvcmUyMDBlLT52aXJ0X2Jhc2UgPT0gTlVMTCkgewotCXByaW50ayhGT1JFMjAwRSAidW5hYmxlIHRvIG1hcCBSQU0gb2YgZGV2aWNlICVzXG4iLCBmb3JlMjAwZS0+bmFtZSk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci0gICAgfQotCi0gICAgRFBSSU5USygxLCAiZGV2aWNlICVzIG1hcHBlZCB0byAweCVwXG4iLCBmb3JlMjAwZS0+bmFtZSwgZm9yZTIwMGUtPnZpcnRfYmFzZSk7Ci0gICAgCi0gICAgZm9yZTIwMGUtPmJ1cy0+d3JpdGUoMHgwMiwgZm9yZTIwMGUtPnJlZ3Muc2JhLmlzcik7IC8qIFhYWCBoYXJkd2lyZWQgaW50ZXJydXB0IGxldmVsICovCi0KLSAgICAvKiBnZXQgdGhlIHN1cHBvcnRlZCBEVk1BIGJ1cnN0IHNpemVzICovCi0gICAgYnVyc3RzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNidXNfZGV2LT5idXMtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHgwMCk7Ci0KLSAgICBpZiAoc2J1c19jYW5fZG1hXzY0Yml0KHNidXNfZGV2KSkKLQlzYnVzX3NldF9zYnVzNjQoc2J1c19kZXYsIGJ1cnN0cyk7Ci0KLSAgICBmb3JlMjAwZS0+c3RhdGUgPSBGT1JFMjAwRV9TVEFURV9NQVA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWZvcmUyMDBlX3NiYV91bm1hcChzdHJ1Y3QgZm9yZTIwMGUqIGZvcmUyMDBlKQotewotICAgIHNidXNfaW91bm1hcChmb3JlMjAwZS0+cmVncy5zYmEuaGNyLCBTQkEyMDBFX0hDUl9MRU5HVEgpOwotICAgIHNidXNfaW91bm1hcChmb3JlMjAwZS0+cmVncy5zYmEuYnNyLCBTQkEyMDBFX0JTUl9MRU5HVEgpOwotICAgIHNidXNfaW91bm1hcChmb3JlMjAwZS0+cmVncy5zYmEuaXNyLCBTQkEyMDBFX0lTUl9MRU5HVEgpOwotICAgIHNidXNfaW91bm1hcChmb3JlMjAwZS0+dmlydF9iYXNlLCAgICBTQkEyMDBFX1JBTV9MRU5HVEgpOwotfQotCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1mb3JlMjAwZV9zYmFfY29uZmlndXJlKHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUpCi17Ci0gICAgZm9yZTIwMGUtPnN0YXRlID0gRk9SRTIwMEVfU1RBVEVfQ09ORklHVVJFOwotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgZm9yZTIwMGUqIF9faW5pdAotZm9yZTIwMGVfc2JhX2RldGVjdChjb25zdCBzdHJ1Y3QgZm9yZTIwMGVfYnVzKiBidXMsIGludCBpbmRleCkKLXsKLSAgICBzdHJ1Y3QgZm9yZTIwMGUqICAgICAgICAgIGZvcmUyMDBlOwotICAgIHN0cnVjdCBzYnVzX2J1cyogc2J1c19idXM7Ci0gICAgc3RydWN0IHNidXNfZGV2KiBzYnVzX2RldiA9IE5VTEw7Ci0gICAgCi0gICAgdW5zaWduZWQgaW50ICAgICBjb3VudCA9IDA7Ci0gICAgCi0gICAgZm9yX2VhY2hfc2J1cyAoc2J1c19idXMpIHsKLQlmb3JfZWFjaF9zYnVzZGV2IChzYnVzX2Rldiwgc2J1c19idXMpIHsKLQkgICAgaWYgKHN0cmNtcChzYnVzX2Rldi0+cHJvbV9uYW1lLCBTQkEyMDBFX1BST01fTkFNRSkgPT0gMCkgewotCQlpZiAoY291bnQgPj0gaW5kZXgpCi0JCSAgICBnb3RvIGZvdW5kOwotCQljb3VudCsrOwotCSAgICB9CisJaWYgKCFmb3JlMjAwZS0+dmlydF9iYXNlKSB7CisJCXByaW50ayhGT1JFMjAwRSAidW5hYmxlIHRvIG1hcCBSQU0gb2YgZGV2aWNlICVzXG4iLCBmb3JlMjAwZS0+bmFtZSk7CisJCXJldHVybiAtRUZBVUxUOwogCX0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisKKwlEUFJJTlRLKDEsICJkZXZpY2UgJXMgbWFwcGVkIHRvIDB4JXBcbiIsIGZvcmUyMDBlLT5uYW1lLCBmb3JlMjAwZS0+dmlydF9iYXNlKTsKICAgICAKLSAgZm91bmQ6Ci0gICAgaWYgKHNidXNfZGV2LT5udW1fcmVnaXN0ZXJzICE9IDQpIHsKLQlwcmludGsoRk9SRTIwMEUgInRoaXMgJXMgZGV2aWNlIGhhcyAlZCBpbnN0ZWFkIG9mIDQgcmVnaXN0ZXJzXG4iLAotCSAgICAgICBidXMtPm1vZGVsX25hbWUsIHNidXNfZGV2LT5udW1fcmVnaXN0ZXJzKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9CisJZm9yZTIwMGUtPmJ1cy0+d3JpdGUoMHgwMiwgZm9yZTIwMGUtPnJlZ3Muc2JhLmlzcik7IC8qIFhYWCBoYXJkd2lyZWQgaW50ZXJydXB0IGxldmVsICovCiAKLSAgICBmb3JlMjAwZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3JlMjAwZSksIEdGUF9LRVJORUwpOwotICAgIGlmIChmb3JlMjAwZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOworCS8qIGdldCB0aGUgc3VwcG9ydGVkIERWTUEgYnVyc3Qgc2l6ZXMgKi8KKwlidXJzdHMgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQob3AtPm5vZGUtPnBhcmVudCwgImJ1cnN0LXNpemVzIiwgMHgwMCk7CiAKLSAgICBmb3JlMjAwZS0+YnVzICAgICA9IGJ1czsKLSAgICBmb3JlMjAwZS0+YnVzX2RldiA9IHNidXNfZGV2OwotICAgIGZvcmUyMDBlLT5pcnEgICAgID0gc2J1c19kZXYtPmlycXNbIDAgXTsKKwlpZiAoc2J1c19jYW5fZG1hXzY0Yml0KCkpCisJCXNidXNfc2V0X3NidXM2NCgmb3AtPmRldiwgYnVyc3RzKTsKIAotICAgIGZvcmUyMDBlLT5waHlzX2Jhc2UgPSAodW5zaWduZWQgbG9uZylzYnVzX2RldjsKLQotICAgIHNwcmludGYoZm9yZTIwMGUtPm5hbWUsICIlcy0lZCIsIGJ1cy0+bW9kZWxfbmFtZSwgaW5kZXggLSAxKTsKLSAgICAKLSAgICByZXR1cm4gZm9yZTIwMGU7CisJZm9yZTIwMGUtPnN0YXRlID0gRk9SRTIwMEVfU1RBVEVfTUFQOworCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1mb3JlMjAwZV9zYmFfcHJvbV9yZWFkKHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUsIHN0cnVjdCBwcm9tX2RhdGEqIHByb20pCitzdGF0aWMgdm9pZCBmb3JlMjAwZV9zYmFfdW5tYXAoc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSkKIHsKLSAgICBzdHJ1Y3Qgc2J1c19kZXYqIHNidXNfZGV2ID0gKHN0cnVjdCBzYnVzX2RldiopIGZvcmUyMDBlLT5idXNfZGV2OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgbGVuOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZm9yZTIwMGUtPmJ1c19kZXY7CiAKLSAgICBsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNidXNfZGV2LT5wcm9tX25vZGUsICJtYWNhZGRybG8yIiwgJnByb20tPm1hY19hZGRyWyA0IF0sIDQpOwotICAgIGlmIChsZW4gPCAwKQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICBsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNidXNfZGV2LT5wcm9tX25vZGUsICJtYWNhZGRyaGk0IiwgJnByb20tPm1hY19hZGRyWyAyIF0sIDQpOwotICAgIGlmIChsZW4gPCAwKQotCXJldHVybiAtRUJVU1k7Ci0gICAgCi0gICAgcHJvbV9nZXRwcm9wZXJ0eShzYnVzX2Rldi0+cHJvbV9ub2RlLCAic2VyaWFsbnVtYmVyIiwKLQkJICAgICAoY2hhciopJnByb20tPnNlcmlhbF9udW1iZXIsIHNpemVvZihwcm9tLT5zZXJpYWxfbnVtYmVyKSk7Ci0gICAgCi0gICAgcHJvbV9nZXRwcm9wZXJ0eShzYnVzX2Rldi0+cHJvbV9ub2RlLCAicHJvbXZlcnNpb24iLAotCQkgICAgIChjaGFyKikmcHJvbS0+aHdfcmV2aXNpb24sIHNpemVvZihwcm9tLT5od19yZXZpc2lvbikpOwotICAgIAotICAgIHJldHVybiAwOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgZm9yZTIwMGUtPnJlZ3Muc2JhLmhjciwgU0JBMjAwRV9IQ1JfTEVOR1RIKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMV0sIGZvcmUyMDBlLT5yZWdzLnNiYS5ic3IsIFNCQTIwMEVfQlNSX0xFTkdUSCk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBmb3JlMjAwZS0+cmVncy5zYmEuaXNyLCBTQkEyMDBFX0lTUl9MRU5HVEgpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVszXSwgZm9yZTIwMGUtPnZpcnRfYmFzZSwgICAgU0JBMjAwRV9SQU1fTEVOR1RIKTsKIH0KIAotCi1zdGF0aWMgaW50Ci1mb3JlMjAwZV9zYmFfcHJvY19yZWFkKHN0cnVjdCBmb3JlMjAwZSogZm9yZTIwMGUsIGNoYXIgKnBhZ2UpCitzdGF0aWMgaW50IF9faW5pdCBmb3JlMjAwZV9zYmFfY29uZmlndXJlKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUpCiB7Ci0gICAgc3RydWN0IHNidXNfZGV2KiBzYnVzX2RldiA9IChzdHJ1Y3Qgc2J1c19kZXYqKWZvcmUyMDBlLT5idXNfZGV2OworCWZvcmUyMDBlLT5zdGF0ZSA9IEZPUkUyMDBFX1NUQVRFX0NPTkZJR1VSRTsKKwlyZXR1cm4gMDsKK30KIAotICAgIHJldHVybiBzcHJpbnRmKHBhZ2UsICIgICBTQlVTIHNsb3QvZGV2aWNlOlx0XHQlZC8nJXMnXG4iLCBzYnVzX2Rldi0+c2xvdCwgc2J1c19kZXYtPnByb21fbmFtZSk7CitzdGF0aWMgaW50IF9faW5pdCBmb3JlMjAwZV9zYmFfcHJvbV9yZWFkKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUsIHN0cnVjdCBwcm9tX2RhdGEgKnByb20pCit7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKKwljb25zdCB1OCAqcHJvcDsKKwlpbnQgbGVuOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgIm1hZGFkZHJsbzIiLCAmbGVuKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PREVWOworCW1lbWNweSgmcHJvbS0+bWFjX2FkZHJbNF0sIHByb3AsIDQpOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgIm1hZGFkZHJoaTQiLCAmbGVuKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PREVWOworCW1lbWNweSgmcHJvbS0+bWFjX2FkZHJbMl0sIHByb3AsIDQpOworCisJcHJvbS0+c2VyaWFsX251bWJlciA9IG9mX2dldGludHByb3BfZGVmYXVsdChvcC0+bm9kZSwgInNlcmlhbG51bWJlciIsIDApOworCXByb20tPmh3X3JldmlzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KG9wLT5ub2RlLCAicHJvbXZlcnNpb24iLCAwKTsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3JlMjAwZV9zYmFfcHJvY19yZWFkKHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUsIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBmb3JlMjAwZS0+YnVzX2RldjsKKwljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KG9wLT5ub2RlLCAicmVnIiwgTlVMTCk7CisKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiICAgU0JVUyBzbG90L2RldmljZTpcdFx0JWQvJyVzJ1xuIiwKKwkJICAgICAgIChyZWdzID8gcmVncy0+d2hpY2hfaW8gOiAwKSwgb3AtPm5vZGUtPm5hbWUpOwogfQogI2VuZGlmIC8qIENPTkZJR19TQlVTICovCiAKQEAgLTI1NzIsNyArMjUxMyw3IEBACiAJZGV2aWNlID0gJigoc3RydWN0IHBjaV9kZXYgKikgZm9yZTIwMGUtPmJ1c19kZXYpLT5kZXY7CiAjaWZkZWYgQ09ORklHX1NCVVMKICAgICBlbHNlIGlmIChzdHJjbXAoZm9yZTIwMGUtPmJ1cy0+bW9kZWxfbmFtZSwgIlNCQS0yMDBFIikgPT0gMCkKLQlkZXZpY2UgPSAmKChzdHJ1Y3Qgc2J1c19kZXYgKikgZm9yZTIwMGUtPmJ1c19kZXYpLT5vZmRldi5kZXY7CisJZGV2aWNlID0gJigoc3RydWN0IG9mX2RldmljZSAqKSBmb3JlMjAwZS0+YnVzX2RldiktPmRldjsKICNlbmRpZgogICAgIGVsc2UKIAlyZXR1cm4gZXJyOwpAQCAtMjcwMSw2ICsyNjQyLDY2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIGludCBfX2RldmluaXQgZm9yZTIwMGVfc2JhX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwljb25zdCBzdHJ1Y3QgZm9yZTIwMGVfYnVzICpidXMgPSBtYXRjaC0+ZGF0YTsKKwlzdHJ1Y3QgZm9yZTIwMGUgKmZvcmUyMDBlOworCXN0YXRpYyBpbnQgaW5kZXggPSAwOworCWludCBlcnI7CisKKwlmb3JlMjAwZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3JlMjAwZSksIEdGUF9LRVJORUwpOworCWlmICghZm9yZTIwMGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yZTIwMGUtPmJ1cyA9IGJ1czsKKwlmb3JlMjAwZS0+YnVzX2RldiA9IG9wOworCWZvcmUyMDBlLT5pcnEgPSBvcC0+aXJxc1swXTsKKwlmb3JlMjAwZS0+cGh5c19iYXNlID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCisJc3ByaW50Zihmb3JlMjAwZS0+bmFtZSwgIiVzLSVkIiwgYnVzLT5tb2RlbF9uYW1lLCBpbmRleCk7CisKKwllcnIgPSBmb3JlMjAwZV9pbml0KGZvcmUyMDBlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlmb3JlMjAwZV9zaHV0ZG93bihmb3JlMjAwZSk7CisJCWtmcmVlKGZvcmUyMDBlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbmRleCsrOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgZm9yZTIwMGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGZvcmUyMDBlX3NiYV9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJc3RydWN0IGZvcmUyMDBlICpmb3JlMjAwZSA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisKKwlmb3JlMjAwZV9zaHV0ZG93bihmb3JlMjAwZSk7CisJa2ZyZWUoZm9yZTIwMGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZvcmUyMDBlX3NiYV9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSBTQkEyMDBFX1BST01fTkFNRSwKKwkJLmRhdGEgPSAodm9pZCAqKSAmZm9yZTIwMGVfYnVzWzFdLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZm9yZTIwMGVfc2JhX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZm9yZTIwMGVfc2JhX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZm9yZV8yMDBlIiwKKwkubWF0Y2hfdGFibGUJPSBmb3JlMjAwZV9zYmFfbWF0Y2gsCisJLnByb2JlCQk9IGZvcmUyMDBlX3NiYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGZvcmUyMDBlX3NiYV9yZW1vdmUpLAorfTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIGludCBfX2RldmluaXQKIGZvcmUyMDBlX3BjYV9kZXRlY3Qoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfZW50KQpAQCAtMjc4NCw2NiArMjc4NSwzOSBAQAogfTsKICNlbmRpZgogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1mb3JlMjAwZV9tb2R1bGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZm9yZTIwMGVfbW9kdWxlX2luaXQodm9pZCkKIHsKLSAgICBjb25zdCBzdHJ1Y3QgZm9yZTIwMGVfYnVzKiBidXM7Ci0gICAgc3RydWN0ICAgICAgIGZvcmUyMDBlKiAgICAgZm9yZTIwMGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJaW50IGVycjsKIAotICAgIHByaW50ayhGT1JFMjAwRSAiRk9SRSBTeXN0ZW1zIDIwMEUtc2VyaWVzIEFUTSBkcml2ZXIgLSB2ZXJzaW9uICIgRk9SRTIwMEVfVkVSU0lPTiAiXG4iKTsKKwlwcmludGsoRk9SRTIwMEUgIkZPUkUgU3lzdGVtcyAyMDBFLXNlcmllcyBBVE0gZHJpdmVyIC0gdmVyc2lvbiAiIEZPUkUyMDBFX1ZFUlNJT04gIlxuIik7CiAKLSAgICAvKiBmb3IgZWFjaCBjb25maWd1cmVkIGJ1cyBpbnRlcmZhY2UgKi8KLSAgICBmb3IgKGJ1cyA9IGZvcmUyMDBlX2J1czsgYnVzLT5tb2RlbF9uYW1lOyBidXMrKykgewotCi0JLyogZGV0ZWN0IGFsbCBib2FyZHMgcHJlc2VudCBvbiB0aGF0IGJ1cyAqLwotCWZvciAoaW5kZXggPSAwOyBidXMtPmRldGVjdCAmJiAoZm9yZTIwMGUgPSBidXMtPmRldGVjdChidXMsIGluZGV4KSk7IGluZGV4KyspIHsKLQkgICAgCi0JICAgIHByaW50ayhGT1JFMjAwRSAiZGV2aWNlICVzIGZvdW5kIGF0IDB4JWx4LCBJUlEgJXNcbiIsCi0JCSAgIGZvcmUyMDBlLT5idXMtPm1vZGVsX25hbWUsIAotCQkgICBmb3JlMjAwZS0+cGh5c19iYXNlLCBmb3JlMjAwZV9pcnFfaXRvYShmb3JlMjAwZS0+aXJxKSk7Ci0KLQkgICAgc3ByaW50Zihmb3JlMjAwZS0+bmFtZSwgIiVzLSVkIiwgYnVzLT5tb2RlbF9uYW1lLCBpbmRleCk7Ci0KLQkgICAgaWYgKGZvcmUyMDBlX2luaXQoZm9yZTIwMGUpIDwgMCkgewotCi0JCWZvcmUyMDBlX3NodXRkb3duKGZvcmUyMDBlKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBsaXN0X2FkZCgmZm9yZTIwMGUtPmVudHJ5LCAmZm9yZTIwMGVfYm9hcmRzKTsKLQl9Ci0gICAgfQotCi0jaWZkZWYgQ09ORklHX1BDSQotICAgIGlmICghcGNpX3JlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfcGNhX2RyaXZlcikpCi0JcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX1NCVVMKKwllcnIgPSBvZl9yZWdpc3Rlcl9kcml2ZXIoJmZvcmUyMDBlX3NiYV9kcml2ZXIsICZvZl9idXNfdHlwZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKICNlbmRpZgogCi0gICAgaWYgKCFsaXN0X2VtcHR5KCZmb3JlMjAwZV9ib2FyZHMpKQotCXJldHVybiAwOwotCi0gICAgcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1mb3JlMjAwZV9tb2R1bGVfY2xlYW51cCh2b2lkKQotewotICAgIHN0cnVjdCBmb3JlMjAwZSAqZm9yZTIwMGUsICpuZXh0OwotCiAjaWZkZWYgQ09ORklHX1BDSQotICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfcGNhX2RyaXZlcik7CisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfcGNhX2RyaXZlcik7CiAjZW5kaWYKIAotICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmb3JlMjAwZSwgbmV4dCwgJmZvcmUyMDBlX2JvYXJkcywgZW50cnkpIHsKLQlmb3JlMjAwZV9zaHV0ZG93bihmb3JlMjAwZSk7Ci0Ja2ZyZWUoZm9yZTIwMGUpOwotICAgIH0KLSAgICBEUFJJTlRLKDEsICJtb2R1bGUgYmVpbmcgcmVtb3ZlZFxuIik7CisjaWZkZWYgQ09ORklHX1NCVVMKKwlpZiAoZXJyKQorCQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfc2JhX2RyaXZlcik7CisjZW5kaWYKKworCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZXhpdCBmb3JlMjAwZV9tb2R1bGVfY2xlYW51cCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZvcmUyMDBlX3BjYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NCVVMKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZm9yZTIwMGVfc2JhX2RyaXZlcik7CisjZW5kaWYKK30KIAogc3RhdGljIGludAogZm9yZTIwMGVfcHJvY19yZWFkKHN0cnVjdCBhdG1fZGV2ICpkZXYsIGxvZmZfdCogcG9zLCBjaGFyKiBwYWdlKQpAQCAtMzE2Myw3ICszMTM3LDYgQEAKICAgICAgIGZvcmUyMDBlX3BjYV9kbWFfc3luY19mb3JfZGV2aWNlLAogICAgICAgZm9yZTIwMGVfcGNhX2RtYV9jaHVua19hbGxvYywKICAgICAgIGZvcmUyMDBlX3BjYV9kbWFfY2h1bmtfZnJlZSwKLSAgICAgIE5VTEwsCiAgICAgICBmb3JlMjAwZV9wY2FfY29uZmlndXJlLAogICAgICAgZm9yZTIwMGVfcGNhX21hcCwKICAgICAgIGZvcmUyMDBlX3BjYV9yZXNldCwKQEAgLTMxODUsNyArMzE1OCw2IEBACiAgICAgICBmb3JlMjAwZV9zYmFfZG1hX3N5bmNfZm9yX2RldmljZSwKICAgICAgIGZvcmUyMDBlX3NiYV9kbWFfY2h1bmtfYWxsb2MsCiAgICAgICBmb3JlMjAwZV9zYmFfZG1hX2NodW5rX2ZyZWUsCi0gICAgICBmb3JlMjAwZV9zYmFfZGV0ZWN0LCAKICAgICAgIGZvcmUyMDBlX3NiYV9jb25maWd1cmUsCiAgICAgICBmb3JlMjAwZV9zYmFfbWFwLAogICAgICAgZm9yZTIwMGVfc2JhX3Jlc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuaCBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmgKaW5kZXggNWM2ZTdhZC4uN2Y5N2MwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuaAorKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5oCkBAIC03NzgsOSArNzc4LDkgQEAKIC8qIFNCQS0yMDBFIHJlZ2lzdGVycyAqLwogCiB0eXBlZGVmIHN0cnVjdCBmb3JlMjAwZV9zYmFfcmVncyB7Ci0gICAgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmhjcjsgICAgLyogYWRkcmVzcyBvZiBob3N0IGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0gICAgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmJzcjsgICAgLyogYWRkcmVzcyBvZiBidXJzdCB0cmFuc2ZlciBzaXplIHJlZ2lzdGVyICAgICAgICovCi0gICAgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmlzcjsgICAgLyogYWRkcmVzcyBvZiBpbnRlcnJ1cHQgbGV2ZWwgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisgICAgdTMyIF9faW9tZW0gKmhjcjsgICAgLyogYWRkcmVzcyBvZiBob3N0IGNvbnRyb2wgcmVnaXN0ZXIgICAgICAgICAgICAgICovCisgICAgdTMyIF9faW9tZW0gKmJzcjsgICAgLyogYWRkcmVzcyBvZiBidXJzdCB0cmFuc2ZlciBzaXplIHJlZ2lzdGVyICAgICAgICovCisgICAgdTMyIF9faW9tZW0gKmlzcjsgICAgLyogYWRkcmVzcyBvZiBpbnRlcnJ1cHQgbGV2ZWwgc2VsZWN0aW9uIHJlZ2lzdGVyICovCiB9IGZvcmUyMDBlX3NiYV9yZWdzX3Q7CiAKIApAQCAtODEwLDcgKzgxMCw2IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICAgKCpkbWFfc3luY19mb3JfZGV2aWNlKShzdHJ1Y3QgZm9yZTIwMGUqLCB1MzIsIGludCwgaW50KTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAoKmRtYV9jaHVua19hbGxvYykoc3RydWN0IGZvcmUyMDBlKiwgc3RydWN0IGNodW5rKiwgaW50LCBpbnQsIGludCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgKCpkbWFfY2h1bmtfZnJlZSkoc3RydWN0IGZvcmUyMDBlKiwgc3RydWN0IGNodW5rKik7Ci0gICAgc3RydWN0IGZvcmUyMDBlKiAgICAgKCpkZXRlY3QpKGNvbnN0IHN0cnVjdCBmb3JlMjAwZV9idXMqLCBpbnQpOwogICAgIGludCAgICAgICAgICAgICAgICAgICgqY29uZmlndXJlKShzdHJ1Y3QgZm9yZTIwMGUqKTsgCiAgICAgaW50ICAgICAgICAgICAgICAgICAgKCptYXApKHN0cnVjdCBmb3JlMjAwZSopOyAKICAgICB2b2lkICAgICAgICAgICAgICAgICAoKnJlc2V0KShzdHJ1Y3QgZm9yZTIwMGUqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2hvcml6b24uYyBiL2RyaXZlcnMvYXRtL2hvcml6b24uYwppbmRleCBjMGFjNzI4Li42MTU0MTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9ob3Jpem9uLmMKKysrIGIvZHJpdmVycy9hdG0vaG9yaXpvbi5jCkBAIC02MzUsNyArNjM1LDcgQEAKIAkJLy8gdGFrZSBjYXJlIG9mIHJvdW5kaW5nCiAJCXN3aXRjaCAocikgewogCQkJY2FzZSByb3VuZF9kb3duOgotCQkJCXByZSA9IChicisoYzw8ZGl2KS0xKS8oYzw8ZGl2KTsKKwkJCQlwcmUgPSBESVZfUk9VTkRfVVAoYnIsIGM8PGRpdik7CiAJCQkJLy8gYnV0IHAgbXVzdCBiZSBub24temVybwogCQkJCWlmICghcHJlKQogCQkJCQlwcmUgPSAxOwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJCQkvLyB0YWtlIGNhcmUgb2Ygcm91bmRpbmcKIAkJCXN3aXRjaCAocikgewogCQkJCWNhc2Ugcm91bmRfZG93bjoKLQkJCQkJcHJlID0gKGJyKyhjPDxkaXYpLTEpLyhjPDxkaXYpOworCQkJCQlwcmUgPSBESVZfUk9VTkRfVVAoYnIsIGM8PGRpdik7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2Ugcm91bmRfbmVhcmVzdDoKIAkJCQkJcHJlID0gKGJyKyhjPDxkaXYpLzIpLyhjPDxkaXYpOwpAQCAtNjk4LDcgKzY5OCw3IEBACiAJCWlmIChiaXRzKQogCQkJKmJpdHMgPSAoZGl2PDxDTE9DS19TRUxFQ1RfU0hJRlQpIHwgKHByZS0xKTsKIAkJaWYgKGFjdHVhbCkgewotCQkJKmFjdHVhbCA9IChiciArIChwcmU8PGRpdikgLSAxKSAvIChwcmU8PGRpdik7CisJCQkqYWN0dWFsID0gRElWX1JPVU5EX1VQKGJyLCBwcmU8PGRpdik7CiAJCQlQUklOVEQgKERCR19RT1MsICJhY3R1YWwgcmF0ZTogJXUiLCAqYWN0dWFsKTsKIAkJfQogCQlyZXR1cm4gMDsKQEAgLTE5NjcsNyArMTk2Nyw3IEBACiAgIC8vIFNldCB0aGUgbWF4IEFBTDUgY2VsbCBjb3VudCB0byBiZSBqdXN0IGVub3VnaCB0byBjb250YWluIHRoZQogICAvLyBsYXJnZXN0IEFBTDUgZnJhbWUgdGhhdCB0aGUgdXNlciB3YW50cyB0byByZWNlaXZlCiAgIHdyX3JlZ3cgKGRldiwgTUFYX0FBTDVfQ0VMTF9DT1VOVF9PRkYsCi0JICAgKG1heF9yeF9zaXplICsgQVRNX0FBTDVfVFJBSUxFUiArIEFUTV9DRUxMX1BBWUxPQUQgLSAxKSAvIEFUTV9DRUxMX1BBWUxPQUQpOworCSAgIERJVl9ST1VORF9VUChtYXhfcnhfc2l6ZSArIEFUTV9BQUw1X1RSQUlMRVIsIEFUTV9DRUxMX1BBWUxPQUQpKTsKICAgCiAgIC8vIEVuYWJsZSByZWNlaXZlCiAgIHdyX3JlZ3cgKGRldiwgUlhfQ09ORklHX09GRiwgcmRfcmVndyAoZGV2LCBSWF9DT05GSUdfT0ZGKSB8IFJYX0VOQUJMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwppbmRleCAzYTUwNGU5Li5lMzNhZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCisrKyBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKQEAgLTExMTQsMTEgKzExMTQsOCBAQAogCiAJcnBwID0gJnZjLT5yY3YucnhfcG9vbDsKIAorCV9fc2tiX3F1ZXVlX3RhaWwoJnJwcC0+cXVldWUsIHNrYik7CiAJcnBwLT5sZW4gKz0gc2tiLT5sZW47Ci0JaWYgKCFycHAtPmNvdW50KyspCi0JCXJwcC0+Zmlyc3QgPSBza2I7Ci0JKnJwcC0+bGFzdCA9IHNrYjsKLQlycHAtPmxhc3QgPSAmc2tiLT5uZXh0OwogCiAJaWYgKHN0YXQgJiBTQVJfUlNRRV9FUERVKSB7CiAJCXVuc2lnbmVkIGNoYXIgKmwxbDI7CkBAIC0xMTQ1LDcgKzExNDIsNyBAQAogCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAocnBwLT5jb3VudCA+IDEpIHsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnJwcC0+cXVldWUpID4gMSkgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNiOwogCiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJwcC0+bGVuKTsKQEAgLTExNjEsMTIgKzExNTgsOSBAQAogCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQlzYiA9IHJwcC0+Zmlyc3Q7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcnBwLT5jb3VudDsgaSsrKSB7CisJCQlza2JfcXVldWVfd2FsaygmcnBwLT5xdWV1ZSwgc2IpCiAJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBzYi0+bGVuKSwKIAkJCQkgICAgICAgc2ItPmRhdGEsIHNiLT5sZW4pOwotCQkJCXNiID0gc2ItPm5leHQ7Ci0JCQl9CiAKIAkJCXJlY3ljbGVfcnhfcG9vbF9za2IoY2FyZCwgcnBwKTsKIApAQCAtMTE4MCw3ICsxMTc0LDYgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXNrYi0+bmV4dCA9IE5VTEw7CiAJCWZsdXNoX3J4X3Bvb2woY2FyZCwgcnBwKTsKIAogCQlpZiAoIWF0bV9jaGFyZ2UodmNjLCBza2ItPnRydWVzaXplKSkgewpAQCAtMTkxOCwyNSArMTkxMSwxOCBAQAogc3RhdGljIHZvaWQKIGZsdXNoX3J4X3Bvb2woc3RydWN0IGlkdDc3MjUyX2RldiAqY2FyZCwgc3RydWN0IHJ4X3Bvb2wgKnJwcCkKIHsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZycHAtPnF1ZXVlKTsKIAlycHAtPmxlbiA9IDA7Ci0JcnBwLT5jb3VudCA9IDA7Ci0JcnBwLT5maXJzdCA9IE5VTEw7Ci0JcnBwLT5sYXN0ID0gJnJwcC0+Zmlyc3Q7CiB9CiAKIHN0YXRpYyB2b2lkCiByZWN5Y2xlX3J4X3Bvb2xfc2tiKHN0cnVjdCBpZHQ3NzI1Ml9kZXYgKmNhcmQsIHN0cnVjdCByeF9wb29sICpycHApCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHQ7Ci0JaW50IGk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKIAotCXNrYiA9IHJwcC0+Zmlyc3Q7Ci0JZm9yIChpID0gMDsgaSA8IHJwcC0+Y291bnQ7IGkrKykgewotCQluZXh0ID0gc2tiLT5uZXh0OwotCQlza2ItPm5leHQgPSBOVUxMOworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnJwcC0+cXVldWUsIHNrYiwgdG1wKQogCQlyZWN5Y2xlX3J4X3NrYihjYXJkLCBza2IpOwotCQlza2IgPSBuZXh0OwotCX0KKwogCWZsdXNoX3J4X3Bvb2woY2FyZCwgcnBwKTsKIH0KIApAQCAtMjUzNyw3ICsyNTIzLDcgQEAKIAkJd2FpdGZvcl9pZGxlKGNhcmQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jbWRfbG9jaywgZmxhZ3MpOwogCi0JCWlmICh2Yy0+cmN2LnJ4X3Bvb2wuY291bnQpIHsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnZjLT5yY3YucnhfcG9vbC5xdWV1ZSkgIT0gMCkgewogCQkJRFBSSU5USygiJXM6IGNsb3NpbmcgYSBWQyB3aXRoIHBlbmRpbmcgcnggYnVmZmVycy5cbiIsCiAJCQkJY2FyZC0+bmFtZSk7CiAKQEAgLTI5NzAsNyArMjk1Niw3IEBACiAJCQl3YWl0Zm9yX2lkbGUoY2FyZCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jbWRfbG9jaywgZmxhZ3MpOwogCi0JCQlpZiAodmMtPnJjdi5yeF9wb29sLmNvdW50KSB7CisJCQlpZiAoc2tiX3F1ZXVlX2xlbigmdmMtPnJjdi5yeF9wb29sLnF1ZXVlKSAhPSAwKSB7CiAJCQkJRFBSSU5USygiJXM6IGNsb3NpbmcgYSBWQyAiCiAJCQkJCSJ3aXRoIHBlbmRpbmcgcnggYnVmZmVycy5cbiIsCiAJCQkJCWNhcmQtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuaCBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmgKaW5kZXggZTgzZWFmMS4uNTA0MmJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuaAorKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5oCkBAIC0xNzMsMTAgKzE3Myw4IEBACiB9OwogCiBzdHJ1Y3QgcnhfcG9vbCB7Ci0Jc3RydWN0IHNrX2J1ZmYJCSpmaXJzdDsKLQlzdHJ1Y3Qgc2tfYnVmZgkJKipsYXN0OworCXN0cnVjdCBza19idWZmX2hlYWQJcXVldWU7CiAJdW5zaWduZWQgaW50CQlsZW47Ci0JdW5zaWduZWQgaW50CQljb3VudDsKIH07CiAKIHN0cnVjdCBhYWwxIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL3phdG0uYyBiL2RyaXZlcnMvYXRtL3phdG0uYwppbmRleCA1ODU4M2M2Li43NTJiMWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS96YXRtLmMKKysrIGIvZHJpdmVycy9hdG0vemF0bS5jCkBAIC00OTYsOCArNDk2LDggQEAKIAkJCXZjYy0+cW9zLnJ4dHAubWF4X3NkdSA9IDY1NDY0OwogCQkJLyogZml4IHRoaXMgLSB3ZSBtYXkgd2FudCB0byByZWNlaXZlIDY0a0IgU0RVcwogCQkJICAgbGF0ZXIgKi8KLQkJY2VsbHMgPSAodmNjLT5xb3Mucnh0cC5tYXhfc2R1K0FUTV9BQUw1X1RSQUlMRVIrCi0JCSAgICBBVE1fQ0VMTF9QQVlMT0FELTEpL0FUTV9DRUxMX1BBWUxPQUQ7CisJCWNlbGxzID0gRElWX1JPVU5EX1VQKHZjYy0+cW9zLnJ4dHAubWF4X3NkdSArIEFUTV9BQUw1X1RSQUlMRVIsCisJCQkJQVRNX0NFTExfUEFZTE9BRCk7CiAJCXphdG1fdmNjLT5wb29sID0gcG9vbF9pbmRleChjZWxscypBVE1fQ0VMTF9QQVlMT0FEKTsKIAl9CiAJZWxzZSB7CkBAIC04MjAsNyArODIwLDcgQEAKIAkJCX0KIAkJCWVsc2UgewogCQkJCWkgPSAyNTU7Ci0JCQkJbSA9IChBVE1fT0MzX1BDUioyNTUrbWF4LTEpL21heDsKKwkJCQltID0gRElWX1JPVU5EX1VQKEFUTV9PQzNfUENSKjI1NSwgbWF4KTsKIAkJCX0KIAkJfQogCQlpZiAoaSA+IG0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9LY29uZmlnIGIvZHJpdmVycy9iYXNlL0tjb25maWcKaW5kZXggNjMxOGY2Yi4uZDhlOGM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL0tjb25maWcKKysrIGIvZHJpdmVycy9iYXNlL0tjb25maWcKQEAgLTU0LDcgKzU0LDcgQEAKIAkgIHN1Y2ggZmlybXdhcmUsIGFuZCBkbyBub3Qgd2lzaCB0byB1c2UgYW4gaW5pdHJkLgogCiAJICBUaGlzIHNpbmdsZSBvcHRpb24gY29udHJvbHMgdGhlIGluY2x1c2lvbiBvZiBmaXJtd2FyZSBmb3IKLQkgIGV2ZXJ5IGRyaXZlciB3aGljaCB1c2VlcyByZXF1ZXN0X2Zpcm1hcmUoKSBhbmQgc2hpcHMgaXRzCisJICBldmVyeSBkcml2ZXIgd2hpY2ggdXNlcyByZXF1ZXN0X2Zpcm1hcmUoKSBhbmQgc2hpcHMgaXRzCiAJICBmaXJtd2FyZSBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCB0byBhdm9pZCBhIHByb2xpZmVyYXRpb24KIAkgIG9mICdJbmNsdWRlIGZpcm13YXJlIGZvciB4eHggZGV2aWNlJyBvcHRpb25zLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCAzMWRjMGNkLi4wYTVmMDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTU0LDcgKzU0LDcgQEAKICAqLwogc3RydWN0IGNsYXNzX3ByaXZhdGUgewogCXN0cnVjdCBrc2V0IGNsYXNzX3N1YnN5czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNsYXNzX2RldmljZXM7CisJc3RydWN0IGtsaXN0IGNsYXNzX2RldmljZXM7CiAJc3RydWN0IGxpc3RfaGVhZCBjbGFzc19pbnRlcmZhY2VzOwogCXN0cnVjdCBrc2V0IGNsYXNzX2RpcnM7CiAJc3RydWN0IG11dGV4IGNsYXNzX211dGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IGVmNTIyYWUuLjVhZWUxYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTMzMyw5ICszMzMsNyBAQAogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOwogCi0JaWYgKHN0cmNtcChuYW1lLCBkZXYtPmJ1c19pZCkgPT0gMCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHN5c2ZzX3N0cmVxKG5hbWUsIGRldi0+YnVzX2lkKTsKIH0KIAogLyoqCkBAIC05ODIsNiArOTgwLDU2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChidXNfZ2V0X2RldmljZV9rbGlzdCk7CiAKKy8qCisgKiBZZXMsIHRoaXMgZm9yY2FibHkgYnJlYWtzIHRoZSBrbGlzdCBhYnN0cmFjdGlvbiB0ZW1wb3JhcmlseS4gIEl0CisgKiBqdXN0IHdhbnRzIHRvIHNvcnQgdGhlIGtsaXN0LCBub3QgY2hhbmdlIHJlZmVyZW5jZSBjb3VudHMgYW5kCisgKiB0YWtlL2Ryb3AgbG9ja3MgcmFwaWRseSBpbiB0aGUgcHJvY2Vzcy4gIEl0IGRvZXMgYWxsIHRoaXMgd2hpbGUKKyAqIGhvbGRpbmcgdGhlIGxvY2sgZm9yIHRoZSBsaXN0LCBzbyBvYmplY3RzIGNhbid0IG90aGVyd2lzZSBiZQorICogYWRkZWQvcmVtb3ZlZCB3aGlsZSB3ZSdyZSBzd2l6emxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGRldmljZV9pbnNlcnRpb25fc29ydF9rbGlzdChzdHJ1Y3QgZGV2aWNlICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCQlpbnQgKCpjb21wYXJlKShjb25zdCBzdHJ1Y3QgZGV2aWNlICphLAorCQkJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmIpKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3QgZGV2aWNlICpiOworCisJbGlzdF9mb3JfZWFjaChwb3MsIGxpc3QpIHsKKwkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOworCQliID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisJCWlmIChjb21wYXJlKGEsIGIpIDw9IDApIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5rbm9kZV9idXMubl9ub2RlLAorCQkJCSAgICAgICAmYi0+a25vZGVfYnVzLm5fbm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsIGxpc3QpOworfQorCit2b2lkIGJ1c19zb3J0X2JyZWFkdGhmaXJzdChzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywKKwkJCSAgIGludCAoKmNvbXBhcmUpKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmEsCisJCQkJCSAgY29uc3Qgc3RydWN0IGRldmljZSAqYikpCit7CisJTElTVF9IRUFEKHNvcnRlZF9kZXZpY2VzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7CisJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBrbGlzdCAqZGV2aWNlX2tsaXN0OworCisJZGV2aWNlX2tsaXN0ID0gYnVzX2dldF9kZXZpY2Vfa2xpc3QoYnVzKTsKKworCXNwaW5fbG9jaygmZGV2aWNlX2tsaXN0LT5rX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJmRldmljZV9rbGlzdC0+a19saXN0KSB7CisJCW4gPSBjb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9ub2RlKTsKKwkJZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisJCWRldmljZV9pbnNlcnRpb25fc29ydF9rbGlzdChkZXYsICZzb3J0ZWRfZGV2aWNlcywgY29tcGFyZSk7CisJfQorCWxpc3Rfc3BsaWNlKCZzb3J0ZWRfZGV2aWNlcywgJmRldmljZV9rbGlzdC0+a19saXN0KTsKKwlzcGluX3VubG9jaygmZGV2aWNlX2tsaXN0LT5rX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnVzX3NvcnRfYnJlYWR0aGZpcnN0KTsKKwogaW50IF9faW5pdCBidXNlc19pbml0KHZvaWQpCiB7CiAJYnVzX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJidXMiLCAmYnVzX3VldmVudF9vcHMsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvY2xhc3MuYwppbmRleCBjYzVlMjhjLi5lYjg1ZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvY2xhc3MuYwpAQCAtMTM1LDYgKzEzNSwyMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQga2xpc3RfY2xhc3NfZGV2X2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfY2xhc3MpOworCisJZ2V0X2RldmljZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBrbGlzdF9jbGFzc19kZXZfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9jbGFzcyk7CisKKwlwdXRfZGV2aWNlKGRldik7Cit9CisKIGludCBfX2NsYXNzX3JlZ2lzdGVyKHN0cnVjdCBjbGFzcyAqY2xzLCBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSkKIHsKIAlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqY3A7CkBAIC0xNDUsNyArMTU5LDcgQEAKIAljcCA9IGt6YWxsb2Moc2l6ZW9mKCpjcCksIEdGUF9LRVJORUwpOwogCWlmICghY3ApCiAJCXJldHVybiAtRU5PTUVNOwotCUlOSVRfTElTVF9IRUFEKCZjcC0+Y2xhc3NfZGV2aWNlcyk7CisJa2xpc3RfaW5pdCgmY3AtPmNsYXNzX2RldmljZXMsIGtsaXN0X2NsYXNzX2Rldl9nZXQsIGtsaXN0X2NsYXNzX2Rldl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZjcC0+Y2xhc3NfaW50ZXJmYWNlcyk7CiAJa3NldF9pbml0KCZjcC0+Y2xhc3NfZGlycyk7CiAJX19tdXRleF9pbml0KCZjcC0+Y2xhc3NfbXV0ZXgsICJzdHJ1Y3QgY2xhc3MgbXV0ZXgiLCBrZXkpOwpAQCAtMjY5LDYgKzI4Myw3MSBAQAogI2VuZGlmCiAKIC8qKgorICogY2xhc3NfZGV2X2l0ZXJfaW5pdCAtIGluaXRpYWxpemUgY2xhc3MgZGV2aWNlIGl0ZXJhdG9yCisgKiBAaXRlcjogY2xhc3MgaXRlcmF0b3IgdG8gaW5pdGlhbGl6ZQorICogQGNsYXNzOiB0aGUgY2xhc3Mgd2Ugd2FubmEgaXRlcmF0ZSBvdmVyCisgKiBAc3RhcnQ6IHRoZSBkZXZpY2UgdG8gc3RhcnQgaXRlcmF0aW5nIGZyb20sIGlmIGFueQorICogQHR5cGU6IGRldmljZV90eXBlIG9mIHRoZSBkZXZpY2VzIHRvIGl0ZXJhdGUgb3ZlciwgTlVMTCBmb3IgYWxsCisgKgorICogSW5pdGlhbGl6ZSBjbGFzcyBpdGVyYXRvciBAaXRlciBzdWNoIHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBkZXZpY2VzCisgKiBvZiBAY2xhc3MuICBJZiBAc3RhcnQgaXMgc2V0LCB0aGUgbGlzdCBpdGVyYXRpb24gd2lsbCBzdGFydCB0aGVyZSwKKyAqIG90aGVyd2lzZSBpZiBpdCBpcyBOVUxMLCB0aGUgaXRlcmF0aW9uIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mCisgKiB0aGUgbGlzdC4KKyAqLwordm9pZCBjbGFzc19kZXZfaXRlcl9pbml0KHN0cnVjdCBjbGFzc19kZXZfaXRlciAqaXRlciwgc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCSBzdHJ1Y3QgZGV2aWNlICpzdGFydCwgY29uc3Qgc3RydWN0IGRldmljZV90eXBlICp0eXBlKQoreworCXN0cnVjdCBrbGlzdF9ub2RlICpzdGFydF9rbm9kZSA9IE5VTEw7CisKKwlpZiAoc3RhcnQpCisJCXN0YXJ0X2tub2RlID0gJnN0YXJ0LT5rbm9kZV9jbGFzczsKKwlrbGlzdF9pdGVyX2luaXRfbm9kZSgmY2xhc3MtPnAtPmNsYXNzX2RldmljZXMsICZpdGVyLT5raSwgc3RhcnRfa25vZGUpOworCWl0ZXItPnR5cGUgPSB0eXBlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xhc3NfZGV2X2l0ZXJfaW5pdCk7CisKKy8qKgorICogY2xhc3NfZGV2X2l0ZXJfbmV4dCAtIGl0ZXJhdGUgdG8gdGhlIG5leHQgZGV2aWNlCisgKiBAaXRlcjogY2xhc3MgaXRlcmF0b3IgdG8gcHJvY2VlZAorICoKKyAqIFByb2NlZWQgQGl0ZXIgdG8gdGhlIG5leHQgZGV2aWNlIGFuZCByZXR1cm4gaXQuICBSZXR1cm5zIE5VTEwgaWYKKyAqIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgZGV2aWNlIGlzIHJlZmVyZW5jZWQgYW5kIHdvbid0IGJlIHJlbGVhc2VkIHRpbGwKKyAqIGl0ZXJhdG9yIGlzIHByb2NlZWQgdG8gdGhlIG5leHQgZGV2aWNlIG9yIGV4aXRlZC4gIFRoZSBjYWxsZXIgaXMKKyAqIGZyZWUgdG8gZG8gd2hhdGV2ZXIgaXQgd2FudHMgdG8gZG8gd2l0aCB0aGUgZGV2aWNlIGluY2x1ZGluZworICogY2FsbGluZyBiYWNrIGludG8gY2xhc3MgY29kZS4KKyAqLworc3RydWN0IGRldmljZSAqY2xhc3NfZGV2X2l0ZXJfbmV4dChzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIpCit7CisJc3RydWN0IGtsaXN0X25vZGUgKmtub2RlOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXdoaWxlICgxKSB7CisJCWtub2RlID0ga2xpc3RfbmV4dCgmaXRlci0+a2kpOworCQlpZiAoIWtub2RlKQorCQkJcmV0dXJuIE5VTEw7CisJCWRldiA9IGNvbnRhaW5lcl9vZihrbm9kZSwgc3RydWN0IGRldmljZSwga25vZGVfY2xhc3MpOworCQlpZiAoIWl0ZXItPnR5cGUgfHwgaXRlci0+dHlwZSA9PSBkZXYtPnR5cGUpCisJCQlyZXR1cm4gZGV2OworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsYXNzX2Rldl9pdGVyX25leHQpOworCisvKioKKyAqIGNsYXNzX2Rldl9pdGVyX2V4aXQgLSBmaW5pc2ggaXRlcmF0aW9uCisgKiBAaXRlcjogY2xhc3MgaXRlcmF0b3IgdG8gZmluaXNoCisgKgorICogRmluaXNoIGFuIGl0ZXJhdGlvbi4gIEFsd2F5cyBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgaXRlcmF0aW9uIGlzCisgKiBjb21wbGV0ZSB3aGV0aGVyIHRoZSBpdGVyYXRpb24gcmFuIHRpbGwgdGhlIGVuZCBvciBub3QuCisgKi8KK3ZvaWQgY2xhc3NfZGV2X2l0ZXJfZXhpdChzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIpCit7CisJa2xpc3RfaXRlcl9leGl0KCZpdGVyLT5raSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjbGFzc19kZXZfaXRlcl9leGl0KTsKKworLyoqCiAgKiBjbGFzc19mb3JfZWFjaF9kZXZpY2UgLSBkZXZpY2UgaXRlcmF0b3IKICAqIEBjbGFzczogdGhlIGNsYXNzIHdlJ3JlIGl0ZXJhdGluZwogICogQHN0YXJ0OiB0aGUgZGV2aWNlIHRvIHN0YXJ0IHdpdGggaW4gdGhlIGxpc3QsIGlmIGFueS4KQEAgLTI4MywxMyArMzYyLDEzIEBACiAgKiBXZSBjaGVjayB0aGUgcmV0dXJuIG9mIEBmbiBlYWNoIHRpbWUuIElmIGl0IHJldHVybnMgYW55dGhpbmcKICAqIG90aGVyIHRoYW4gMCwgd2UgYnJlYWsgb3V0IGFuZCByZXR1cm4gdGhhdCB2YWx1ZS4KICAqCi0gKiBOb3RlLCB3ZSBob2xkIGNsYXNzLT5jbGFzc19tdXRleCBpbiB0aGlzIGZ1bmN0aW9uLCBzbyBpdCBjYW4gbm90IGJlCi0gKiByZS1hY3F1aXJlZCBpbiBAZm4sIG90aGVyd2lzZSBpdCB3aWxsIHNlbGYtZGVhZGxvY2tpbmcuIEZvcgotICogZXhhbXBsZSwgY2FsbHMgdG8gYWRkIG9yIHJlbW92ZSBjbGFzcyBtZW1iZXJzIHdvdWxkIGJlIHZlcmJvdGVuLgorICogQGZuIGlzIGFsbG93ZWQgdG8gZG8gYW55dGhpbmcgaW5jbHVkaW5nIGNhbGxpbmcgYmFjayBpbnRvIGNsYXNzCisgKiBjb2RlLiAgVGhlcmUncyBubyBsb2NraW5nIHJlc3RyaWN0aW9uLgogICovCiBpbnQgY2xhc3NfZm9yX2VhY2hfZGV2aWNlKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBkZXZpY2UgKnN0YXJ0LAogCQkJICB2b2lkICpkYXRhLCBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKQogeworCXN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0zMDEsMjAgKzM4MCwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdXRleF9sb2NrKCZjbGFzcy0+cC0+Y2xhc3NfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2xhc3MtPnAtPmNsYXNzX2RldmljZXMsIG5vZGUpIHsKLQkJaWYgKHN0YXJ0KSB7Ci0JCQlpZiAoc3RhcnQgPT0gZGV2KQotCQkJCXN0YXJ0ID0gTlVMTDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldiA9IGdldF9kZXZpY2UoZGV2KTsKKwljbGFzc19kZXZfaXRlcl9pbml0KCZpdGVyLCBjbGFzcywgc3RhcnQsIE5VTEwpOworCXdoaWxlICgoZGV2ID0gY2xhc3NfZGV2X2l0ZXJfbmV4dCgmaXRlcikpKSB7CiAJCWVycm9yID0gZm4oZGV2LCBkYXRhKTsKLQkJcHV0X2RldmljZShkZXYpOwogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZjbGFzcy0+cC0+Y2xhc3NfbXV0ZXgpOworCWNsYXNzX2Rldl9pdGVyX2V4aXQoJml0ZXIpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzM3LDE2ICs0MDksMTUgQEAKICAqCiAgKiBOb3RlLCB5b3Ugd2lsbCBuZWVkIHRvIGRyb3AgdGhlIHJlZmVyZW5jZSB3aXRoIHB1dF9kZXZpY2UoKSBhZnRlciB1c2UuCiAgKgotICogV2UgaG9sZCBjbGFzcy0+Y2xhc3NfbXV0ZXggaW4gdGhpcyBmdW5jdGlvbiwgc28gaXQgY2FuIG5vdCBiZQotICogcmUtYWNxdWlyZWQgaW4gQG1hdGNoLCBvdGhlcndpc2UgaXQgd2lsbCBzZWxmLWRlYWRsb2NraW5nLiBGb3IKLSAqIGV4YW1wbGUsIGNhbGxzIHRvIGFkZCBvciByZW1vdmUgY2xhc3MgbWVtYmVycyB3b3VsZCBiZSB2ZXJib3Rlbi4KKyAqIEBmbiBpcyBhbGxvd2VkIHRvIGRvIGFueXRoaW5nIGluY2x1ZGluZyBjYWxsaW5nIGJhY2sgaW50byBjbGFzcworICogY29kZS4gIFRoZXJlJ3Mgbm8gbG9ja2luZyByZXN0cmljdGlvbi4KICAqLwogc3RydWN0IGRldmljZSAqY2xhc3NfZmluZF9kZXZpY2Uoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGRldmljZSAqc3RhcnQsCiAJCQkJIHZvaWQgKmRhdGEsCiAJCQkJIGludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCiB7CisJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWludCBmb3VuZCA9IDA7CiAKIAlpZiAoIWNsYXNzKQogCQlyZXR1cm4gTlVMTDsKQEAgLTM1NiwyOSArNDI3LDIzIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCW11dGV4X2xvY2soJmNsYXNzLT5wLT5jbGFzc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjbGFzcy0+cC0+Y2xhc3NfZGV2aWNlcywgbm9kZSkgewotCQlpZiAoc3RhcnQpIHsKLQkJCWlmIChzdGFydCA9PSBkZXYpCi0JCQkJc3RhcnQgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQkJZGV2ID0gZ2V0X2RldmljZShkZXYpOworCWNsYXNzX2Rldl9pdGVyX2luaXQoJml0ZXIsIGNsYXNzLCBzdGFydCwgTlVMTCk7CisJd2hpbGUgKChkZXYgPSBjbGFzc19kZXZfaXRlcl9uZXh0KCZpdGVyKSkpIHsKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkpIHsKLQkJCWZvdW5kID0gMTsKKwkJCWdldF9kZXZpY2UoZGV2KTsKIAkJCWJyZWFrOwotCQl9IGVsc2UKLQkJCXB1dF9kZXZpY2UoZGV2KTsKKwkJfQogCX0KLQltdXRleF91bmxvY2soJmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CisJY2xhc3NfZGV2X2l0ZXJfZXhpdCgmaXRlcik7CiAKLQlyZXR1cm4gZm91bmQgPyBkZXYgOiBOVUxMOworCXJldHVybiBkZXY7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbGFzc19maW5kX2RldmljZSk7CiAKIGludCBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZikKIHsKIAlzdHJ1Y3QgY2xhc3MgKnBhcmVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgaXRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlpZiAoIWNsYXNzX2ludGYgfHwgIWNsYXNzX2ludGYtPmNsYXNzKQpAQCAtMzkxLDggKzQ1NiwxMCBAQAogCW11dGV4X2xvY2soJnBhcmVudC0+cC0+Y2xhc3NfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJmNsYXNzX2ludGYtPm5vZGUsICZwYXJlbnQtPnAtPmNsYXNzX2ludGVyZmFjZXMpOwogCWlmIChjbGFzc19pbnRmLT5hZGRfZGV2KSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGFyZW50LT5wLT5jbGFzc19kZXZpY2VzLCBub2RlKQorCQljbGFzc19kZXZfaXRlcl9pbml0KCZpdGVyLCBwYXJlbnQsIE5VTEwsIE5VTEwpOworCQl3aGlsZSAoKGRldiA9IGNsYXNzX2Rldl9pdGVyX25leHQoJml0ZXIpKSkKIAkJCWNsYXNzX2ludGYtPmFkZF9kZXYoZGV2LCBjbGFzc19pbnRmKTsKKwkJY2xhc3NfZGV2X2l0ZXJfZXhpdCgmaXRlcik7CiAJfQogCW11dGV4X3VubG9jaygmcGFyZW50LT5wLT5jbGFzc19tdXRleCk7CiAKQEAgLTQwMiw2ICs0NjksNyBAQAogdm9pZCBjbGFzc19pbnRlcmZhY2VfdW5yZWdpc3RlcihzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmKQogewogCXN0cnVjdCBjbGFzcyAqcGFyZW50ID0gY2xhc3NfaW50Zi0+Y2xhc3M7CisJc3RydWN0IGNsYXNzX2Rldl9pdGVyIGl0ZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJaWYgKCFwYXJlbnQpCkBAIC00MTAsOCArNDc4LDEwIEBACiAJbXV0ZXhfbG9jaygmcGFyZW50LT5wLT5jbGFzc19tdXRleCk7CiAJbGlzdF9kZWxfaW5pdCgmY2xhc3NfaW50Zi0+bm9kZSk7CiAJaWYgKGNsYXNzX2ludGYtPnJlbW92ZV9kZXYpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwYXJlbnQtPnAtPmNsYXNzX2RldmljZXMsIG5vZGUpCisJCWNsYXNzX2Rldl9pdGVyX2luaXQoJml0ZXIsIHBhcmVudCwgTlVMTCwgTlVMTCk7CisJCXdoaWxlICgoZGV2ID0gY2xhc3NfZGV2X2l0ZXJfbmV4dCgmaXRlcikpKQogCQkJY2xhc3NfaW50Zi0+cmVtb3ZlX2RldihkZXYsIGNsYXNzX2ludGYpOworCQljbGFzc19kZXZfaXRlcl9leGl0KCZpdGVyKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPnAtPmNsYXNzX211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggZDAyMWM5OC4uOGMyY2MyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC01MjMsMTEgKzUyMywxNiBAQAogICogZGV2aWNlX2luaXRpYWxpemUgLSBpbml0IGRldmljZSBzdHJ1Y3R1cmUuCiAgKiBAZGV2OiBkZXZpY2UuCiAgKgotICogVGhpcyBwcmVwYXJlcyB0aGUgZGV2aWNlIGZvciB1c2UgYnkgb3RoZXIgbGF5ZXJzLAotICogaW5jbHVkaW5nIGFkZGluZyBpdCB0byB0aGUgZGV2aWNlIGhpZXJhcmNoeS4KKyAqIFRoaXMgcHJlcGFyZXMgdGhlIGRldmljZSBmb3IgdXNlIGJ5IG90aGVyIGxheWVycyBieSBpbml0aWFsaXppbmcKKyAqIGl0cyBmaWVsZHMuCiAgKiBJdCBpcyB0aGUgZmlyc3QgaGFsZiBvZiBkZXZpY2VfcmVnaXN0ZXIoKSwgaWYgY2FsbGVkIGJ5Ci0gKiB0aGF0LCB0aG91Z2ggaXQgY2FuIGFsc28gYmUgY2FsbGVkIHNlcGFyYXRlbHksIHNvIG9uZQotICogbWF5IHVzZSBAZGV2J3MgZmllbGRzIChlLmcuIHRoZSByZWZjb3VudCkuCisgKiB0aGF0IGZ1bmN0aW9uLCB0aG91Z2ggaXQgY2FuIGFsc28gYmUgY2FsbGVkIHNlcGFyYXRlbHksIHNvIG9uZQorICogbWF5IHVzZSBAZGV2J3MgZmllbGRzLiBJbiBwYXJ0aWN1bGFyLCBnZXRfZGV2aWNlKCkvcHV0X2RldmljZSgpCisgKiBtYXkgYmUgdXNlZCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nIG9mIEBkZXYgYWZ0ZXIgY2FsbGluZyB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBOT1RFOiBVc2UgcHV0X2RldmljZSgpIHRvIGdpdmUgdXAgeW91ciByZWZlcmVuY2UgaW5zdGVhZCBvZiBmcmVlaW5nCisgKiBAZGV2IGRpcmVjdGx5IG9uY2UgeW91IGhhdmUgY2FsbGVkIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHZvaWQgZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNTM2LDcgKzU0MSw2IEBACiAJa2xpc3RfaW5pdCgmZGV2LT5rbGlzdF9jaGlsZHJlbiwga2xpc3RfY2hpbGRyZW5fZ2V0LAogCQkgICBrbGlzdF9jaGlsZHJlbl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRtYV9wb29scyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+bm9kZSk7CiAJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldnJlc19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kZXZyZXNfaGVhZCk7CkBAIC04MzYsOSArODQwLDEzIEBACiAgKiBUaGlzIGlzIHBhcnQgMiBvZiBkZXZpY2VfcmVnaXN0ZXIoKSwgdGhvdWdoIG1heSBiZSBjYWxsZWQKICAqIHNlcGFyYXRlbHkgX2lmZl8gZGV2aWNlX2luaXRpYWxpemUoKSBoYXMgYmVlbiBjYWxsZWQgc2VwYXJhdGVseS4KICAqCi0gKiBUaGlzIGFkZHMgaXQgdG8gdGhlIGtvYmplY3QgaGllcmFyY2h5IHZpYSBrb2JqZWN0X2FkZCgpLCBhZGRzIGl0CisgKiBUaGlzIGFkZHMgQGRldiB0byB0aGUga29iamVjdCBoaWVyYXJjaHkgdmlhIGtvYmplY3RfYWRkKCksIGFkZHMgaXQKICAqIHRvIHRoZSBnbG9iYWwgYW5kIHNpYmxpbmcgbGlzdHMgZm9yIHRoZSBkZXZpY2UsIHRoZW4KICAqIGFkZHMgaXQgdG8gdGhlIG90aGVyIHJlbGV2YW50IHN1YnN5c3RlbXMgb2YgdGhlIGRyaXZlciBtb2RlbC4KKyAqCisgKiBOT1RFOiBfTmV2ZXJfIGRpcmVjdGx5IGZyZWUgQGRldiBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGV2ZW4KKyAqIGlmIGl0IHJldHVybmVkIGFuIGVycm9yISBBbHdheXMgdXNlIHB1dF9kZXZpY2UoKSB0byBnaXZlIHVwIHlvdXIKKyAqIHJlZmVyZW5jZSBpbnN0ZWFkLgogICovCiBpbnQgZGV2aWNlX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC05MTYsNyArOTI0LDggQEAKIAlpZiAoZGV2LT5jbGFzcykgewogCQltdXRleF9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CiAJCS8qIHRpZSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZSAqLwotCQlsaXN0X2FkZF90YWlsKCZkZXYtPm5vZGUsICZkZXYtPmNsYXNzLT5wLT5jbGFzc19kZXZpY2VzKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfY2xhc3MsCisJCQkgICAgICAgJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RldmljZXMpOwogCiAJCS8qIG5vdGlmeSBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgaXMgaGVyZSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2ludGYsCkBAIC05NjUsNiArOTc0LDEwIEBACiAgKiBJLmUuIHlvdSBzaG91bGQgb25seSBjYWxsIHRoZSB0d28gaGVscGVycyBzZXBhcmF0ZWx5IGlmCiAgKiBoYXZlIGEgY2xlYXJseSBkZWZpbmVkIG5lZWQgdG8gdXNlIGFuZCByZWZjb3VudCB0aGUgZGV2aWNlCiAgKiBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIGhpZXJhcmNoeS4KKyAqCisgKiBOT1RFOiBfTmV2ZXJfIGRpcmVjdGx5IGZyZWUgQGRldiBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGV2ZW4KKyAqIGlmIGl0IHJldHVybmVkIGFuIGVycm9yISBBbHdheXMgdXNlIHB1dF9kZXZpY2UoKSB0byBnaXZlIHVwIHRoZQorICogcmVmZXJlbmNlIGluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24gaW5zdGVhZC4KICAqLwogaW50IGRldmljZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xMDMyLDcgKzEwNDUsNyBAQAogCQkJaWYgKGNsYXNzX2ludGYtPnJlbW92ZV9kZXYpCiAJCQkJY2xhc3NfaW50Zi0+cmVtb3ZlX2RldihkZXYsIGNsYXNzX2ludGYpOwogCQkvKiByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBjbGFzcyBsaXN0ICovCi0JCWxpc3RfZGVsX2luaXQoJmRldi0+bm9kZSk7CisJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9jbGFzcyk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfbXV0ZXgpOwogCX0KIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdWV2ZW50X2F0dHIpOwpAQCAtMTI0Myw3ICsxMjU2LDcgQEAKIAlyZXR1cm4gZGV2OwogCiBlcnJvcjoKLQlrZnJlZShkZXYpOworCXB1dF9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2NyZWF0ZV92YXJncyk7CkBAIC0xMzE0LDYgKzEzMjcsMTEgQEAKICAqIGRldmljZV9yZW5hbWUgLSByZW5hbWVzIGEgZGV2aWNlCiAgKiBAZGV2OiB0aGUgcG9pbnRlciB0byB0aGUgc3RydWN0IGRldmljZSB0byBiZSByZW5hbWVkCiAgKiBAbmV3X25hbWU6IHRoZSBuZXcgbmFtZSBvZiB0aGUgZGV2aWNlCisgKgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gcHJvdmlkZSBtdXR1YWwKKyAqIGV4Y2x1c2lvbiBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgY2FsbHMgb2YgZGV2aWNlX3JlbmFtZQorICogb24gdGhlIHNhbWUgZGV2aWNlIHRvIGVuc3VyZSB0aGF0IG5ld19uYW1lIGlzIHZhbGlkIGFuZAorICogd29uJ3QgY29uZmxpY3Qgd2l0aCBvdGhlciBkZXZpY2VzLgogICovCiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm5ld19uYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCAzYWM0NDNiLi4yMGZlYmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtMjU3LDYgKzI1Nyw5IEBACiAJICogaXMgYW4gZXJyb3IuCiAJICovCiAKKwlpZiAoZHJ2LT5idXMtPm1hdGNoICYmICFkcnYtPmJ1cy0+bWF0Y2goZGV2LCBkcnYpKQorCQlyZXR1cm4gMDsKKwogCWlmIChkZXYtPnBhcmVudCkJLyogTmVlZGVkIGZvciBVU0IgKi8KIAkJZG93bigmZGV2LT5wYXJlbnQtPnNlbSk7CiAJZG93bigmZGV2LT5zZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCBjOWM5MmIwLi5iN2U1NzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtMTY0LDggKzE2NCw3IEBACiAJCX0KIAkJLyogZmFsbHRocm91Z2ggKi8KIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIHZhbHVlICglZClcbiIsIF9fZnVuY19fLAotCQkgICAgICAgbG9hZGluZyk7CisJCWRldl9lcnIoZGV2LCAiJXM6IHVuZXhwZWN0ZWQgdmFsdWUgKCVkKVxuIiwgX19mdW5jX18sIGxvYWRpbmcpOwogCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgLTE6CiAJCWZ3X2xvYWRfYWJvcnQoZndfcHJpdik7CkBAIC0zMDksNyArMzA4LDcgQEAKIAkqZGV2X3AgPSBOVUxMOwogCiAJaWYgKCFmd19wcml2IHx8ICFmX2RldikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGRldmljZSwgIiVzOiBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX2tmcmVlOwogCX0KQEAgLTMyOSw4ICszMjgsNyBAQAogCWZfZGV2LT51ZXZlbnRfc3VwcHJlc3MgPSAxOwogCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcihmX2Rldik7CiAJaWYgKHJldHZhbCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlkZXZfZXJyKGRldmljZSwgIiVzOiBkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyb3Jfa2ZyZWU7CiAJfQogCSpkZXZfcCA9IGZfZGV2OwpAQCAtMzYzLDE1ICszNjEsMTMgQEAKIAlmd19wcml2LT5mdyA9IGZ3OwogCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZl9kZXYtPmtvYmosICZmd19wcml2LT5hdHRyX2RhdGEpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc3lzZnNfY3JlYXRlX2Jpbl9maWxlIGZhaWxlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJZGV2X2VycihkZXZpY2UsICIlczogc3lzZnNfY3JlYXRlX2Jpbl9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3VucmVnOwogCX0KIAogCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShmX2RldiwgJmRldl9hdHRyX2xvYWRpbmcpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJZGV2X2VycihkZXZpY2UsICIlczogZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycm9yX3VucmVnOwogCX0KIApAQCAtNDAxLDggKzM5Nyw4IEBACiAKIAkqZmlybXdhcmVfcCA9IGZpcm13YXJlID0ga3phbGxvYyhzaXplb2YoKmZpcm13YXJlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmaXJtd2FyZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBrbWFsbG9jKHN0cnVjdCBmaXJtd2FyZSkgZmFpbGVkXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlkZXZfZXJyKGRldmljZSwgIiVzOiBrbWFsbG9jKHN0cnVjdCBmaXJtd2FyZSkgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MTEsMTUgKzQwNywxNSBAQAogCSAgICAgYnVpbHRpbisrKSB7CiAJCWlmIChzdHJjbXAobmFtZSwgYnVpbHRpbi0+bmFtZSkpCiAJCQljb250aW51ZTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZmlybXdhcmU6IHVzaW5nIGJ1aWx0LWluIGZpcm13YXJlICVzXG4iLAotCQkgICAgICAgbmFtZSk7CisJCWRldl9pbmZvKGRldmljZSwgImZpcm13YXJlOiB1c2luZyBidWlsdC1pbiBmaXJtd2FyZSAlc1xuIiwKKwkJCSBuYW1lKTsKIAkJZmlybXdhcmUtPnNpemUgPSBidWlsdGluLT5zaXplOwogCQlmaXJtd2FyZS0+ZGF0YSA9IGJ1aWx0aW4tPmRhdGE7CiAJCXJldHVybiAwOwogCX0KIAogCWlmICh1ZXZlbnQpCi0JCXByaW50ayhLRVJOX0lORk8gImZpcm13YXJlOiByZXF1ZXN0aW5nICVzXG4iLCBuYW1lKTsKKwkJZGV2X2luZm8oZGV2aWNlLCAiZmlybXdhcmU6IHJlcXVlc3RpbmcgJXNcbiIsIG5hbWUpOwogCiAJcmV0dmFsID0gZndfc2V0dXBfZGV2aWNlKGZpcm13YXJlLCAmZl9kZXYsIG5hbWUsIGRldmljZSwgdWV2ZW50KTsKIAlpZiAocmV0dmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwppbmRleCAzZjk0MDM5Li5kZmNiZmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwpAQCAtNDIsMTAgKzQyLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fcmVzb3VyY2VzOyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07CiAKLQkJaWYgKChyLT5mbGFncyAmIChJT1JFU09VUkNFX0lPfElPUkVTT1VSQ0VfTUVNfAotCQkJCSBJT1JFU09VUkNFX0lSUXxJT1JFU09VUkNFX0RNQSkpID09IHR5cGUpCi0JCQlpZiAobnVtLS0gPT0gMCkKLQkJCQlyZXR1cm4gcjsKKwkJaWYgKHR5cGUgPT0gcmVzb3VyY2VfdHlwZShyKSAmJiBudW0tLSA9PSAwKQorCQkJcmV0dXJuIHI7CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtNzgsMTAgKzc2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fcmVzb3VyY2VzOyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07CiAKLQkJaWYgKChyLT5mbGFncyAmIChJT1JFU09VUkNFX0lPfElPUkVTT1VSQ0VfTUVNfAotCQkJCSBJT1JFU09VUkNFX0lSUXxJT1JFU09VUkNFX0RNQSkpID09IHR5cGUpCi0JCQlpZiAoIXN0cmNtcChyLT5uYW1lLCBuYW1lKSkKLQkJCQlyZXR1cm4gcjsKKwkJaWYgKHR5cGUgPT0gcmVzb3VyY2VfdHlwZShyKSAmJiAhc3RyY21wKHItPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIHI7CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMjU5LDkgKzI1NSw5IEBACiAKIAkJcCA9IHItPnBhcmVudDsKIAkJaWYgKCFwKSB7Ci0JCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCWlmIChyZXNvdXJjZV90eXBlKHIpID09IElPUkVTT1VSQ0VfTUVNKQogCQkJCXAgPSAmaW9tZW1fcmVzb3VyY2U7Ci0JCQllbHNlIGlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQllbHNlIGlmIChyZXNvdXJjZV90eXBlKHIpID09IElPUkVTT1VSQ0VfSU8pCiAJCQkJcCA9ICZpb3BvcnRfcmVzb3VyY2U7CiAJCX0KIApAQCAtMjgyLDkgKzI3OCwxNCBAQAogCQlyZXR1cm4gcmV0OwogCiAgZmFpbGVkOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJaWYgKHBkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgKElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfSU8pKQotCQkJcmVsZWFzZV9yZXNvdXJjZSgmcGRldi0+cmVzb3VyY2VbaV0pOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmcGRldi0+cmVzb3VyY2VbaV07CisJCXVuc2lnbmVkIGxvbmcgdHlwZSA9IHJlc291cmNlX3R5cGUocik7CisKKwkJaWYgKHR5cGUgPT0gSU9SRVNPVVJDRV9NRU0gfHwgdHlwZSA9PSBJT1JFU09VUkNFX0lPKQorCQkJcmVsZWFzZV9yZXNvdXJjZShyKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fZGV2aWNlX2FkZCk7CkBAIC0zMDYsNyArMzA3LDkgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgcGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpZiAoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU18SU9SRVNPVVJDRV9JTykpCisJCQl1bnNpZ25lZCBsb25nIHR5cGUgPSByZXNvdXJjZV90eXBlKHIpOworCisJCQlpZiAodHlwZSA9PSBJT1JFU09VUkNFX01FTSB8fCB0eXBlID09IElPUkVTT1VSQ0VfSU8pCiAJCQkJcmVsZWFzZV9yZXNvdXJjZShyKTsKIAkJfQogCX0KQEAgLTM5MSw2ICszOTQsNTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUpOwogCisvKioKKyAqIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhCisgKiBAcGFyZW50OiBwYXJlbnQgZGV2aWNlIGZvciB0aGUgZGV2aWNlIHdlJ3JlIGFkZGluZworICogQG5hbWU6IGJhc2UgbmFtZSBvZiB0aGUgZGV2aWNlIHdlJ3JlIGFkZGluZworICogQGlkOiBpbnN0YW5jZSBpZAorICogQGRhdGE6IHBsYXRmb3JtIHNwZWNpZmljIGRhdGEgZm9yIHRoaXMgcGxhdGZvcm0gZGV2aWNlCisgKiBAc2l6ZTogc2l6ZSBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc2ltcGxlIHBsYXRmb3JtIGRldmljZSB0aGF0IHJlcXVpcmVzIG1pbmltYWwKKyAqIHJlc291cmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudC4gQ2FubmVkIHJlbGVhc2UgZnVuY3Rpb24gZnJlZWluZyBtZW1vcnkKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIGRldmljZSBhbGxvd3MgZHJpdmVycyB1c2luZyBzdWNoIGRldmljZXMgdG8gYmUKKyAqIHVubG9hZGVkIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2UgdG8gYmUKKyAqIGRyb3BwZWQuCisgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKAorCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCwKKwkJY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgcmV0dmFsOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhuYW1lLCBpZCk7CisJaWYgKCFwZGV2KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcGRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKworCWlmIChzaXplKSB7CisJCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBkYXRhLCBzaXplKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIHBkZXY7CisKK2Vycm9yOgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKK30KKwogc3RhdGljIGludCBwbGF0Zm9ybV9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKQEAgLTg2Miw3ICs5MTIsNyBAQAogCiAjZW5kaWYgLyogIUNPTkZJR19ISUJFUk5BVElPTiAqLwogCi1zdHJ1Y3QgcG1fZXh0X29wcyBwbGF0Zm9ybV9wbV9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHBtX2V4dF9vcHMgcGxhdGZvcm1fcG1fb3BzID0gewogCS5iYXNlID0gewogCQkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCiAJCS5jb21wbGV0ZSA9IHBsYXRmb3JtX3BtX2NvbXBsZXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggMjczYTk0NC4uNjkyYzIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC04Myw3ICs4Myw3IEBACiAJCSAqIHRyYW5zaXRpb24gaXMgaW4gcHJvZ3Jlc3MgaW4gb3JkZXIgdG8gYXZvaWQgbGVhdmluZyB0aGVtCiAJCSAqIHVuaGFuZGxlZCBkb3duIHRoZSByb2FkCiAJCSAqLwotCQlXQVJOX09OKHRydWUpOworCQlkZXZfV0FSTihkZXYsICJQYXJlbnRsZXNzIGRldmljZSByZWdpc3RlcmVkIGR1cmluZyBhIFBNIHRyYW5zYWN0aW9uXG4iKTsKIAl9CiAKIAlsaXN0X2FkZF90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xpc3QpOwpAQCAtNzc4LDEwICs3NzgsNyBAQAogCiB2b2lkIF9fc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCB2b2lkICpmbiwgaW50IHJldCkKIHsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKTogIiwgZnVuY3Rpb24pOwotCQlwcmludF9mbl9kZXNjcmlwdG9yX3N5bWJvbCgiJXMgcmV0dXJucyAiLCBmbik7Ci0JCXByaW50aygiJWRcbiIsIHJldCk7Ci0JfQorCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiJXMoKTogJXBGIHJldHVybnMgJWRcbiIsIGZ1bmN0aW9uLCBmbiwgcmV0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fc3VzcGVuZF9yZXBvcnRfcmVzdWx0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKaW5kZXggNWI0YzZlNi4uOTNmMzY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKQEAgLTE1OSwxMSArMTU5LDggQEAKIAlzZWN0b3JfdCBzc2l6ZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNlbmRxX2hkOyAvKiBwYWNrZXRzIG5lZWRpbmcgdG8gYmUgc2VudCwgbGlzdCBoZWFkICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNlbmRxX3RsOwotCXN0cnVjdCBza19idWZmICpza2Jwb29sX2hkOwotCXN0cnVjdCBza19idWZmICpza2Jwb29sX3RsOwotCWludCBuc2ticG9vbDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNlbmRxOworCXN0cnVjdCBza19idWZmX2hlYWQgc2ticG9vbDsKIAltZW1wb29sX3QgKmJ1ZnBvb2w7CS8qIGZvciBkZWFkbG9jay1mcmVlIEJ1ZiBhbGxvY2F0aW9uICovCiAJc3RydWN0IGxpc3RfaGVhZCBidWZxOwkvKiBxdWV1ZSBvZiBiaW9zIHRvIHdvcmsgb24gKi8KIAlzdHJ1Y3QgYnVmICppbnByb2Nlc3M7CS8qIHRoZSBvbmUgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24gKi8KQEAgLTE5OSw3ICsxOTYsNyBAQAogCiBpbnQgYW9lbmV0X2luaXQodm9pZCk7CiB2b2lkIGFvZW5ldF9leGl0KHZvaWQpOwotdm9pZCBhb2VuZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqKTsKK3ZvaWQgYW9lbmV0X3htaXQoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKTsKIGludCBpc19hb2VfbmV0aWYoc3RydWN0IG5ldF9kZXZpY2UgKmlmcCk7CiBpbnQgc2V0X2FvZV9pZmxpc3QoY29uc3QgY2hhciBfX3VzZXIgKnN0ciwgc2l6ZV90IHNpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCmluZGV4IDBjMzk3ODIuLmI4MjY1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogc3RhdGljIGludAogYW9lZGlza19hZGRfc3lzZnMoc3RydWN0IGFvZWRldiAqZCkKIHsKLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZkLT5nZC0+ZGV2LmtvYmosICZhdHRyX2dyb3VwKTsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZkaXNrX3RvX2RldihkLT5nZCktPmtvYmosICZhdHRyX2dyb3VwKTsKIH0KIHZvaWQKIGFvZWRpc2tfcm1fc3lzZnMoc3RydWN0IGFvZWRldiAqZCkKIHsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmQtPmdkLT5kZXYua29iaiwgJmF0dHJfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGlza190b19kZXYoZC0+Z2QpLT5rb2JqLCAmYXR0cl9ncm91cCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE1OCw5ICsxNTgsOSBAQAogc3RhdGljIGludAogYW9lYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogeworCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CiAJc3RydWN0IGFvZWRldiAqZDsKIAlzdHJ1Y3QgYnVmICpidWY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNsOwogCXVsb25nIGZsYWdzOwogCiAJYmxrX3F1ZXVlX2JvdW5jZShxLCAmYmlvKTsKQEAgLTIxMywxMSArMjEzLDExIEBACiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5idWZzLCAmZC0+YnVmcSk7CiAKIAlhb2VjbWRfd29yayhkKTsKLQlzbCA9IGQtPnNlbmRxX2hkOwotCWQtPnNlbmRxX2hkID0gZC0+c2VuZHFfdGwgPSBOVUxMOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcXVldWUpOworCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmZC0+c2VuZHEsICZxdWV1ZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7Ci0JYW9lbmV0X3htaXQoc2wpOworCWFvZW5ldF94bWl0KCZxdWV1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3Niw3ICsyNzYsNyBAQAogCWdkLT5maXJzdF9taW5vciA9IGQtPnN5c21pbm9yICogQU9FX1BBUlRJVElPTlM7CiAJZ2QtPmZvcHMgPSAmYW9lX2Jkb3BzOwogCWdkLT5wcml2YXRlX2RhdGEgPSBkOwotCWdkLT5jYXBhY2l0eSA9IGQtPnNzaXplOworCXNldF9jYXBhY2l0eShnZCwgZC0+c3NpemUpOwogCXNucHJpbnRmKGdkLT5kaXNrX25hbWUsIHNpemVvZiBnZC0+ZGlza19uYW1lLCAiZXRoZXJkL2UlbGQuJWQiLAogCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjaHIuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCmluZGV4IDE4MWViYjguLjIwMGVmYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSAiYW9lLmgiCiAKIGVudW0gewpAQCAtMTAzLDcgKzEwNCwxMiBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCQlnb3RvIGxvb3A7CiAJfQotCWFvZW5ldF94bWl0KHNrYik7CisJaWYgKHNrYikgeworCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOworCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlKTsKKwkJX19za2JfcXVldWVfdGFpbCgmcXVldWUsIHNrYik7CisJCWFvZW5ldF94bWl0KCZxdWV1ZSk7CisJfQogCWFvZWNtZF9jZmcobWFqb3IsIG1pbm9yKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI3OCw5ICsyODQsOSBAQAogCQlyZXR1cm4gUFRSX0VSUihhb2VfY2xhc3MpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFyZGV2cyk7ICsraSkKLQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGFvZV9jbGFzcywgTlVMTCwKLQkJCQkgICAgICBNS0RFVihBT0VfTUFKT1IsIGNoYXJkZXZzW2ldLm1pbm9yKSwKLQkJCQkgICAgICBOVUxMLCBjaGFyZGV2c1tpXS5uYW1lKTsKKwkJZGV2aWNlX2NyZWF0ZShhb2VfY2xhc3MsIE5VTEwsCisJCQkgICAgICBNS0RFVihBT0VfTUFKT1IsIGNoYXJkZXZzW2ldLm1pbm9yKSwgTlVMTCwKKwkJCSAgICAgIGNoYXJkZXZzW2ldLm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCmluZGV4IDJmMTc0NjIuLjcxZmY3OGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwpAQCAtMTE0LDI5ICsxMTQsMjIgQEAKIHN0YXRpYyB2b2lkCiBza2JfcG9vbF9wdXQoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoIWQtPnNrYnBvb2xfaGQpCi0JCWQtPnNrYnBvb2xfaGQgPSBza2I7Ci0JZWxzZQotCQlkLT5za2Jwb29sX3RsLT5uZXh0ID0gc2tiOwotCWQtPnNrYnBvb2xfdGwgPSBza2I7CisJX19za2JfcXVldWVfdGFpbCgmZC0+c2ticG9vbCwgc2tiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKIHNrYl9wb29sX2dldChzdHJ1Y3QgYW9lZGV2ICpkKQogewotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKCZkLT5za2Jwb29sKTsKIAotCXNrYiA9IGQtPnNrYnBvb2xfaGQ7CiAJaWYgKHNrYiAmJiBhdG9taWNfcmVhZCgmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSA9PSAxKSB7Ci0JCWQtPnNrYnBvb2xfaGQgPSBza2ItPm5leHQ7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7CisJCV9fc2tiX3VubGluayhza2IsICZkLT5za2Jwb29sKTsKIAkJcmV0dXJuIHNrYjsKIAl9Ci0JaWYgKGQtPm5za2Jwb29sIDwgTlNLQlBPT0xNQVgKLQkmJiAoc2tiID0gbmV3X3NrYihFVEhfWkxFTikpKSB7Ci0JCWQtPm5za2Jwb29sKys7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJmQtPnNrYnBvb2wpIDwgTlNLQlBPT0xNQVggJiYKKwkgICAgKHNrYiA9IG5ld19za2IoRVRIX1pMRU4pKSkKIAkJcmV0dXJuIHNrYjsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjkzLDI5ICsyODYsMjIgQEAKIAogCXNrYi0+ZGV2ID0gdC0+aWZwLT5uZDsKIAlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiKSB7Ci0JCWlmIChkLT5zZW5kcV9oZCkKLQkJCWQtPnNlbmRxX3RsLT5uZXh0ID0gc2tiOwotCQllbHNlCi0JCQlkLT5zZW5kcV9oZCA9IHNrYjsKLQkJZC0+c2VuZHFfdGwgPSBza2I7Ci0JfQorCWlmIChza2IpCisJCV9fc2tiX3F1ZXVlX3RhaWwoJmQtPnNlbmRxLCBza2IpOwogCXJldHVybiAxOwogfQogCiAvKiBzb21lIGNhbGxlcnMgY2Fubm90IHNsZWVwLCBhbmQgdGhleSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLAogICogdHJhbnNtaXR0aW5nIHRoZSBwYWNrZXRzIGxhdGVyLCB3aGVuIGludGVycnVwdHMgYXJlIG9uCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hb2VjbWRfY2ZnX3BrdHModXNob3J0IGFvZW1ham9yLCB1bnNpZ25lZCBjaGFyIGFvZW1pbm9yLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRhaWwpCitzdGF0aWMgdm9pZAorYW9lY21kX2NmZ19wa3RzKHVzaG9ydCBhb2VtYWpvciwgdW5zaWduZWQgY2hhciBhb2VtaW5vciwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWUpCiB7CiAJc3RydWN0IGFvZV9oZHIgKmg7CiAJc3RydWN0IGFvZV9jZmdoZHIgKmNoOwotCXN0cnVjdCBza19idWZmICpza2IsICpzbCwgKnNsX3RhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaWZwOwogCi0Jc2wgPSBzbF90YWlsID0gTlVMTDsKLQogCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJZm9yX2VhY2hfbmV0ZGV2KCZpbml0X25ldCwgaWZwKSB7CiAJCWRldl9ob2xkKGlmcCk7CkBAIC0zMjksOCArMzE1LDcgQEAKIAkJfQogCQlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICpjaCk7CiAJCXNrYi0+ZGV2ID0gaWZwOwotCQlpZiAoc2xfdGFpbCA9PSBOVUxMKQotCQkJc2xfdGFpbCA9IHNrYjsKKwkJX19za2JfcXVldWVfdGFpbChxdWV1ZSwgc2tiKTsKIAkJaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2JfbWFjX2hlYWRlcihza2IpOwogCQltZW1zZXQoaCwgMCwgc2l6ZW9mICpoICsgc2l6ZW9mICpjaCk7CiAKQEAgLTM0MiwxNiArMzI3LDEwIEBACiAJCWgtPm1pbm9yID0gYW9lbWlub3I7CiAJCWgtPmNtZCA9IEFPRUNNRF9DRkc7CiAKLQkJc2tiLT5uZXh0ID0gc2w7Ci0JCXNsID0gc2tiOwogY29udDoKIAkJZGV2X3B1dChpZnApOwogCX0KIAlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Ci0KLQlpZiAodGFpbCAhPSBOVUxMKQotCQkqdGFpbCA9IHNsX3RhaWw7Ci0JcmV0dXJuIHNsOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDA2LDExICszODUsNyBAQAogCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWlmIChkLT5zZW5kcV9oZCkKLQkJZC0+c2VuZHFfdGwtPm5leHQgPSBza2I7Ci0JZWxzZQotCQlkLT5zZW5kcV9oZCA9IHNrYjsKLQlkLT5zZW5kcV90bCA9IHNrYjsKKwlfX3NrYl9xdWV1ZV90YWlsKCZkLT5zZW5kcSwgc2tiKTsKIH0KIAogc3RhdGljIGludApAQCAtNTA4LDE2ICs0ODMsMTUgQEAKIHN0YXRpYyB2b2lkCiByZXhtaXRfdGltZXIodWxvbmcgdnApCiB7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBxdWV1ZTsKIAlzdHJ1Y3QgYW9lZGV2ICpkOwogCXN0cnVjdCBhb2V0Z3QgKnQsICoqdHQsICoqdGU7CiAJc3RydWN0IGFvZWlmICppZnA7CiAJc3RydWN0IGZyYW1lICpmLCAqZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2w7CiAJcmVnaXN0ZXIgbG9uZyB0aW1lb3V0OwogCXVsb25nIGZsYWdzLCBuOwogCiAJZCA9IChzdHJ1Y3QgYW9lZGV2ICopIHZwOwotCXNsID0gTlVMTDsKIAogCS8qIHRpbWVvdXQgaXMgYWx3YXlzIH4xNTAlIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZSAqLwogCXRpbWVvdXQgPSBkLT5ydHRhdmc7CkBAIC01ODksNyArNTYzLDcgQEAKIAkJfQogCX0KIAotCWlmIChkLT5zZW5kcV9oZCkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZkLT5zZW5kcSkpIHsKIAkJbiA9IGQtPnJ0dGF2ZyA8PD0gMTsKIAkJaWYgKG4gPiBNQVhUSU1FUikKIAkJCWQtPnJ0dGF2ZyA9IE1BWFRJTUVSOwpAQCAtNjAwLDE1ICs1NzQsMTUgQEAKIAkJYW9lY21kX3dvcmsoZCk7CiAJfQogCi0Jc2wgPSBkLT5zZW5kcV9oZDsKLQlkLT5zZW5kcV9oZCA9IGQtPnNlbmRxX3RsID0gTlVMTDsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlKTsKKwlza2JfcXVldWVfc3BsaWNlX2luaXQoJmQtPnNlbmRxLCAmcXVldWUpOwogCiAJZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUSU1FUlRJQ0s7CiAJYWRkX3RpbWVyKCZkLT50aW1lcik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CiAKLQlhb2VuZXRfeG1pdChzbCk7CisJYW9lbmV0X3htaXQoJnF1ZXVlKTsKIH0KIAogLyogZW50ZXJzIHdpdGggZC0+bG9jayBoZWxkICovCkBAIC02NDUsNyArNjE5LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJdTY0IHNzaXplOwogCi0JCXNzaXplID0gZC0+Z2QtPmNhcGFjaXR5OworCQlzc2l6ZSA9IGdldF9jYXBhY2l0eShkLT5nZCk7CiAJCWJkID0gYmRnZXRfZGlzayhkLT5nZCwgMCk7CiAKIAkJaWYgKGJkKSB7CkBAIC03MDcsNyArNjgxLDcgQEAKIAlpZiAoZC0+ZmxhZ3MgJiAoREVWRkxfR0RBTExPQ3xERVZGTF9ORVdTSVpFKSkKIAkJcmV0dXJuOwogCWlmIChkLT5nZCAhPSBOVUxMKSB7Ci0JCWQtPmdkLT5jYXBhY2l0eSA9IHNzaXplOworCQlzZXRfY2FwYWNpdHkoZC0+Z2QsIHNzaXplKTsKIAkJZC0+ZmxhZ3MgfD0gREVWRkxfTkVXU0laRTsKIAl9IGVsc2UKIAkJZC0+ZmxhZ3MgfD0gREVWRkxfR0RBTExPQzsKQEAgLTc1NiwyMyArNzMwLDI4IEBACiAJdW5zaWduZWQgbG9uZyBuX3NlY3QgPSBiaW8tPmJpX3NpemUgPj4gOTsKIAljb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCWludCBjcHU7CiAKLQlwYXJ0ID0gZ2V0X3BhcnQoZGlzaywgc2VjdG9yKTsKLQlhbGxfc3RhdF9pbmMoZGlzaywgcGFydCwgaW9zW3J3XSwgc2VjdG9yKTsKLQlhbGxfc3RhdF9hZGQoZGlzaywgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbiwgc2VjdG9yKTsKLQlhbGxfc3RhdF9hZGQoZGlzaywgcGFydCwgc2VjdG9yc1tyd10sIG5fc2VjdCwgc2VjdG9yKTsKLQlhbGxfc3RhdF9hZGQoZGlzaywgcGFydCwgaW9fdGlja3MsIGR1cmF0aW9uLCBzZWN0b3IpOworCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CisJcGFydCA9IGRpc2tfbWFwX3NlY3Rvcl9yY3UoZGlzaywgc2VjdG9yKTsKKworCXBhcnRfc3RhdF9pbmMoY3B1LCBwYXJ0LCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbik7CisJcGFydF9zdGF0X2FkZChjcHUsIHBhcnQsIHNlY3RvcnNbcnddLCBuX3NlY3QpOworCXBhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBpb190aWNrcywgZHVyYXRpb24pOworCisJcGFydF9zdGF0X3VubG9jaygpOwogfQogCiB2b2lkCiBhb2VjbWRfYXRhX3JzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CiAJc3RydWN0IGFvZWRldiAqZDsKIAlzdHJ1Y3QgYW9lX2hkciAqaGluLCAqaG91dDsKIAlzdHJ1Y3QgYW9lX2F0YWhkciAqYWhpbiwgKmFob3V0OwogCXN0cnVjdCBmcmFtZSAqZjsKIAlzdHJ1Y3QgYnVmICpidWY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNsOwogCXN0cnVjdCBhb2V0Z3QgKnQ7CiAJc3RydWN0IGFvZWlmICppZnA7CiAJcmVnaXN0ZXIgbG9uZyBuOwpAQCAtODkzLDIxICs4NzIsMjEgQEAKIAogCWFvZWNtZF93b3JrKGQpOwogeG1pdDoKLQlzbCA9IGQtPnNlbmRxX2hkOwotCWQtPnNlbmRxX2hkID0gZC0+c2VuZHFfdGwgPSBOVUxMOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcXVldWUpOworCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmZC0+c2VuZHEsICZxdWV1ZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7Ci0JYW9lbmV0X3htaXQoc2wpOworCWFvZW5ldF94bWl0KCZxdWV1ZSk7CiB9CiAKIHZvaWQKIGFvZWNtZF9jZmcodXNob3J0IGFvZW1ham9yLCB1bnNpZ25lZCBjaGFyIGFvZW1pbm9yKQogewotCXN0cnVjdCBza19idWZmICpzbDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOwogCi0Jc2wgPSBhb2VjbWRfY2ZnX3BrdHMoYW9lbWFqb3IsIGFvZW1pbm9yLCBOVUxMKTsKLQotCWFvZW5ldF94bWl0KHNsKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlKTsKKwlhb2VjbWRfY2ZnX3BrdHMoYW9lbWFqb3IsIGFvZW1pbm9yLCAmcXVldWUpOworCWFvZW5ldF94bWl0KCZxdWV1ZSk7CiB9CiAgCiBzdHJ1Y3Qgc2tfYnVmZiAqCkBAIC0xMDc2LDcgKzEwNTUsMTIgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAotCWFvZW5ldF94bWl0KHNsKTsKKwlpZiAoc2wpIHsKKwkJc3RydWN0IHNrX2J1ZmZfaGVhZCBxdWV1ZTsKKwkJX19za2JfcXVldWVfaGVhZF9pbml0KCZxdWV1ZSk7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnF1ZXVlLCBzbCk7CisJCWFvZW5ldF94bWl0KCZxdWV1ZSk7CisJfQogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCmluZGV4IGExZDgxM2EuLmNjMjUwNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCkBAIC05MSw3ICs5MSw3IEBACiAJfQogCiAJaWYgKGQtPmdkKQotCQlkLT5nZC0+Y2FwYWNpdHkgPSAwOworCQlzZXRfY2FwYWNpdHkoZC0+Z2QsIDApOwogCiAJZC0+ZmxhZ3MgJj0gfkRFVkZMX1VQOwogfQpAQCAtMTg4LDE0ICsxODgsMTIgQEAKIHN0YXRpYyB2b2lkCiBza2Jwb29sZnJlZShzdHJ1Y3QgYW9lZGV2ICpkKQogewotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKIAotCXdoaWxlICgoc2tiID0gZC0+c2ticG9vbF9oZCkpIHsKLQkJZC0+c2ticG9vbF9oZCA9IHNrYi0+bmV4dDsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZkLT5za2Jwb29sLCBza2IsIHRtcCkKIAkJc2tiZnJlZShza2IpOwotCX0KLQlkLT5za2Jwb29sX3RsID0gTlVMTDsKKworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZC0+c2ticG9vbCk7CiB9CiAKIC8qIGZpbmQgaXQgb3IgbWFsbG9jIGl0ICovCkBAIC0yMTcsNiArMjE1LDggQEAKIAkJZ290byBvdXQ7CiAJSU5JVF9XT1JLKCZkLT53b3JrLCBhb2VjbWRfc2xlZXB3b3JrKTsKIAlzcGluX2xvY2tfaW5pdCgmZC0+bG9jayk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZC0+c2VuZHEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmQtPnNrYnBvb2wpOwogCWluaXRfdGltZXIoJmQtPnRpbWVyKTsKIAlkLT50aW1lci5kYXRhID0gKHVsb25nKSBkOwogCWQtPnRpbWVyLmZ1bmN0aW9uID0gZHVtbXlfdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMKaW5kZXggN2IxNWE1ZS4uN2Y4M2FkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW1haW4uYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgImFvZS5oIgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCmluZGV4IDBjODFjYTcuLjkxNTdkNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCkBAIC05NSwxMyArOTUsMTIgQEAKIH0KIAogdm9pZAotYW9lbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNsKQorYW9lbmV0X3htaXQoc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwogCi0Jd2hpbGUgKChza2IgPSBzbCkpIHsKLQkJc2wgPSBzbC0+bmV4dDsKLQkJc2tiLT5uZXh0ID0gc2tiLT5wcmV2ID0gTlVMTDsKKwlza2JfcXVldWVfd2Fsa19zYWZlKHF1ZXVlLCBza2IsIHRtcCkgeworCQlfX3NrYl91bmxpbmsoc2tiLCBxdWV1ZSk7CiAJCWRldl9xdWV1ZV94bWl0KHNrYik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCA0OWYyNzQxLi40MzJjZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMTg4MiwxMCArMTg4Miw2IEBACiAJCS8qIEFtaWdhLCBNYWMsIC4uLiBkb24ndCBoYXZlIEF0YXJpLWNvbXBhdGlibGUgZmxvcHB5IDotKSAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChNQUNIX0lTX0hBREVTKQotCQkvKiBIYWRlcyBkb2Vzbid0IGhhdmUgQXRhcmktY29tcGF0aWJsZSBmbG9wcHkgKi8KLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlpZiAocmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwiZmQiKSkKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5jIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCmluZGV4IGI3MzExNmUuLjFlMWY5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKQEAgLTM0NjAsOCArMzQ2MCw4IEBACiAJICAgICAgIGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkYWMgPyAiIiA6ICIgbm90Iik7CiAKIAloYmFbaV0tPmNtZF9wb29sX2JpdHMgPQotCSAgICBrbWFsbG9jKCgoaGJhW2ldLT5ucl9jbWRzICsgQklUU19QRVJfTE9ORyAtCi0JCSAgICAgIDEpIC8gQklUU19QRVJfTE9ORykgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCSAgICBrbWFsbG9jKERJVl9ST1VORF9VUChoYmFbaV0tPm5yX2NtZHMsIEJJVFNfUEVSX0xPTkcpCisJCQkqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CiAJaGJhW2ldLT5jbWRfcG9vbCA9IChDb21tYW5kTGlzdF9zdHJ1Y3QgKikKIAkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAogCQkgICAgaGJhW2ldLT5ucl9jbWRzICogc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksCkBAIC0zNDkzLDggKzM0OTMsOCBAQAogCS8qIGNvbW1hbmQgYW5kIGVycm9yIGluZm8gcmVjcyB6ZXJvZWQgb3V0IGJlZm9yZQogCSAgIHRoZXkgYXJlIHVzZWQgKi8KIAltZW1zZXQoaGJhW2ldLT5jbWRfcG9vbF9iaXRzLCAwLAotCSAgICAgICAoKGhiYVtpXS0+bnJfY21kcyArIEJJVFNfUEVSX0xPTkcgLQotCQkgMSkgLyBCSVRTX1BFUl9MT05HKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJICAgICAgIERJVl9ST1VORF9VUChoYmFbaV0tPm5yX2NtZHMsIEJJVFNfUEVSX0xPTkcpCisJCQkqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKIAloYmFbaV0tPm51bV9sdW5zID0gMDsKIAloYmFbaV0tPmhpZ2hlc3RfbHVuID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3Nfc2NzaS5jCmluZGV4IGUxMjMzYWEuLmEzZmQ4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3Nfc2NzaS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3Nfc2NzaS5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogc3RhdGljIGludCAKIGNjaXNzX3Njc2lfYWRkX2VudHJ5KGludCBjdGxyLCBpbnQgaG9zdG5vLCAKLQkJdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCBpbnQgZGV2dHlwZSwKKwkJc3RydWN0IGNjaXNzX3Njc2lfZGV2X3QgKmRldmljZSwKIAkJc3RydWN0IHNjc2kybWFwICphZGRlZCwgaW50ICpuYWRkZWQpCiB7CiAJLyogYXNzdW1lcyBoYmFbY3Rscl0tPnNjc2lfY3Rsci0+bG9jayBpcyBoZWxkICovIApAQCAtMzg0LDEyICszODQsMTIgQEAKIAlsdW4gPSAwOwogCS8qIElzIHRoaXMgZGV2aWNlIGEgbm9uLXplcm8gbHVuIG9mIGEgbXVsdGktbHVuIGRldmljZSAqLwogCS8qIGJ5dGUgNCBvZiB0aGUgOC1ieXRlIExVTiBhZGRyIHdpbGwgY29udGFpbiB0aGUgbG9naWNhbCB1bml0IG5vLiAqLwotCWlmIChzY3NpM2FkZHJbNF0gIT0gMCkgeworCWlmIChkZXZpY2UtPnNjc2kzYWRkcls0XSAhPSAwKSB7CiAJCS8qIFNlYXJjaCB0aHJvdWdoIG91ciBsaXN0IGFuZCBmaW5kIHRoZSBkZXZpY2Ugd2hpY2ggKi8KIAkJLyogaGFzIHRoZSBzYW1lIDggYnl0ZSBMVU4gYWRkcmVzcywgZXhjZXB0aW5nIGJ5dGUgNC4gKi8KIAkJLyogQXNzaWduIHRoZSBzYW1lIGJ1cyBhbmQgdGFyZ2V0IGZvciB0aGlzIG5ldyBMVU4uICovCiAJCS8qIFVzZSB0aGUgbG9naWNhbCB1bml0IG51bWJlciBmcm9tIHRoZSBmaXJtd2FyZS4gKi8KLQkJbWVtY3B5KGFkZHIxLCBzY3NpM2FkZHIsIDgpOworCQltZW1jcHkoYWRkcjEsIGRldmljZS0+c2NzaTNhZGRyLCA4KTsKIAkJYWRkcjFbNF0gPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCQlzZCA9ICZjY2lzc3Njc2lbY3Rscl0uZGV2W2ldOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJCQlpZiAobWVtY21wKGFkZHIxLCBhZGRyMiwgOCkgPT0gMCkgewogCQkJCWJ1cyA9IHNkLT5idXM7CiAJCQkJdGFyZ2V0ID0gc2QtPnRhcmdldDsKLQkJCQlsdW4gPSBzY3NpM2FkZHJbNF07CisJCQkJbHVuID0gZGV2aWNlLT5zY3NpM2FkZHJbNF07CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTQyMCw4ICs0MjAsMTIgQEAKIAlhZGRlZFsqbmFkZGVkXS5sdW4gPSBzZC0+bHVuOwogCSgqbmFkZGVkKSsrOwogCi0JbWVtY3B5KCZzZC0+c2NzaTNhZGRyWzBdLCBzY3NpM2FkZHIsIDgpOwotCXNkLT5kZXZ0eXBlID0gZGV2dHlwZTsKKwltZW1jcHkoc2QtPnNjc2kzYWRkciwgZGV2aWNlLT5zY3NpM2FkZHIsIDgpOworCW1lbWNweShzZC0+dmVuZG9yLCBkZXZpY2UtPnZlbmRvciwgc2l6ZW9mKHNkLT52ZW5kb3IpKTsKKwltZW1jcHkoc2QtPnJldmlzaW9uLCBkZXZpY2UtPnJldmlzaW9uLCBzaXplb2Yoc2QtPnJldmlzaW9uKSk7CisJbWVtY3B5KHNkLT5kZXZpY2VfaWQsIGRldmljZS0+ZGV2aWNlX2lkLCBzaXplb2Yoc2QtPmRldmljZV9pZCkpOworCXNkLT5kZXZ0eXBlID0gZGV2aWNlLT5kZXZ0eXBlOworCiAJY2Npc3NzY3NpW2N0bHJdLm5kZXZpY2VzKys7CiAKIAkvKiBpbml0aWFsbHksIChiZWZvcmUgcmVnaXN0ZXJpbmcgd2l0aCBzY3NpIGxheWVyKSB3ZSBkb24ndCAKQEAgLTQ4Nyw2ICs0OTEsMjIgQEAKIAlDUFFfVEFQRV9VTkxPQ0soY3RsciwgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGRldmljZV9pc190aGVfc2FtZShzdHJ1Y3QgY2Npc3Nfc2NzaV9kZXZfdCAqZGV2MSwKKwlzdHJ1Y3QgY2Npc3Nfc2NzaV9kZXZfdCAqZGV2MikKK3sKKwlyZXR1cm4gZGV2MS0+ZGV2dHlwZSA9PSBkZXYyLT5kZXZ0eXBlICYmCisJCW1lbWNtcChkZXYxLT5zY3NpM2FkZHIsIGRldjItPnNjc2kzYWRkciwKKwkJCXNpemVvZihkZXYxLT5zY3NpM2FkZHIpKSA9PSAwICYmCisJCW1lbWNtcChkZXYxLT5kZXZpY2VfaWQsIGRldjItPmRldmljZV9pZCwKKwkJCXNpemVvZihkZXYxLT5kZXZpY2VfaWQpKSA9PSAwICYmCisJCW1lbWNtcChkZXYxLT52ZW5kb3IsIGRldjItPnZlbmRvciwKKwkJCXNpemVvZihkZXYxLT52ZW5kb3IpKSA9PSAwICYmCisJCW1lbWNtcChkZXYxLT5tb2RlbCwgZGV2Mi0+bW9kZWwsCisJCQlzaXplb2YoZGV2MS0+bW9kZWwpKSA9PSAwICYmCisJCW1lbWNtcChkZXYxLT5yZXZpc2lvbiwgZGV2Mi0+cmV2aXNpb24sCisJCQlzaXplb2YoZGV2MS0+cmV2aXNpb24pKSA9PSAwOworfQorCiBzdGF0aWMgaW50CiBhZGp1c3RfY2Npc3Nfc2NzaV90YWJsZShpbnQgY3RsciwgaW50IGhvc3RubywKIAlzdHJ1Y3QgY2Npc3Nfc2NzaV9kZXZfdCBzZFtdLCBpbnQgbnNkcykKQEAgLTUzMiw3ICs1NTIsNyBAQAogCQlmb3IgKGo9MDtqPG5zZHM7aisrKSB7CiAJCQlpZiAoU0NTSTNBRERSX0VRKHNkW2pdLnNjc2kzYWRkciwKIAkJCQljc2QtPnNjc2kzYWRkcikpIHsKLQkJCQlpZiAoc2Rbal0uZGV2dHlwZSA9PSBjc2QtPmRldnR5cGUpCisJCQkJaWYgKGRldmljZV9pc190aGVfc2FtZSgmc2Rbal0sIGNzZCkpCiAJCQkJCWZvdW5kPTI7CiAJCQkJZWxzZQogCQkJCQlmb3VuZD0xOwpAQCAtNTQ4LDIyICs1NjgsMjYgQEAKIAkJCWNjaXNzX3Njc2lfcmVtb3ZlX2VudHJ5KGN0bHIsIGhvc3RubywgaSwKIAkJCQlyZW1vdmVkLCAmbnJlbW92ZWQpOwogCQkJLyogcmVtb3ZlIF5eXiwgaGVuY2UgaSBub3QgaW5jcmVtZW50ZWQgKi8KLQkJfSAKLQkJZWxzZSBpZiAoZm91bmQgPT0gMSkgeyAvKiBkZXZpY2UgaXMgZGlmZmVyZW50IGtpbmQgKi8KKwkJfSBlbHNlIGlmIChmb3VuZCA9PSAxKSB7IC8qIGRldmljZSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXkgKi8KIAkJCWNoYW5nZXMrKzsKLQkJCXByaW50aygiY2Npc3MlZDogZGV2aWNlIGMlZGIlZHQlZGwlZCB0eXBlIGNoYW5nZWQgIgotCQkJCSIoZGV2aWNlIHR5cGUgbm93ICVzKS5cbiIsCi0JCQkJY3RsciwgaG9zdG5vLCBjc2QtPmJ1cywgY3NkLT50YXJnZXQsIGNzZC0+bHVuLAotCQkJCQlzY3NpX2RldmljZV90eXBlKGNzZC0+ZGV2dHlwZSkpOworCQkJcHJpbnRrKCJjY2lzcyVkOiBkZXZpY2UgYyVkYiVkdCVkbCVkIGhhcyBjaGFuZ2VkLlxuIiwKKwkJCQljdGxyLCBob3N0bm8sIGNzZC0+YnVzLCBjc2QtPnRhcmdldCwgY3NkLT5sdW4pOwogCQkJY2Npc3Nfc2NzaV9yZW1vdmVfZW50cnkoY3RsciwgaG9zdG5vLCBpLAogCQkJCXJlbW92ZWQsICZucmVtb3ZlZCk7CiAJCQkvKiByZW1vdmUgXl5eLCBoZW5jZSBpIG5vdCBpbmNyZW1lbnRlZCAqLwotCQkJaWYgKGNjaXNzX3Njc2lfYWRkX2VudHJ5KGN0bHIsIGhvc3RubywKLQkJCQkmc2Rbal0uc2NzaTNhZGRyWzBdLCBzZFtqXS5kZXZ0eXBlLAorCQkJaWYgKGNjaXNzX3Njc2lfYWRkX2VudHJ5KGN0bHIsIGhvc3RubywgJnNkW2pdLAogCQkJCWFkZGVkLCAmbmFkZGVkKSAhPSAwKQogCQkJCS8qIHdlIGp1c3QgcmVtb3ZlZCBvbmUsIHNvIGFkZCBjYW4ndCBmYWlsLiAqLwogCQkJCQlCVUcoKTsKIAkJCWNzZC0+ZGV2dHlwZSA9IHNkW2pdLmRldnR5cGU7CisJCQltZW1jcHkoY3NkLT5kZXZpY2VfaWQsIHNkW2pdLmRldmljZV9pZCwKKwkJCQlzaXplb2YoY3NkLT5kZXZpY2VfaWQpKTsKKwkJCW1lbWNweShjc2QtPnZlbmRvciwgc2Rbal0udmVuZG9yLAorCQkJCXNpemVvZihjc2QtPnZlbmRvcikpOworCQkJbWVtY3B5KGNzZC0+bW9kZWwsIHNkW2pdLm1vZGVsLAorCQkJCXNpemVvZihjc2QtPm1vZGVsKSk7CisJCQltZW1jcHkoY3NkLT5yZXZpc2lvbiwgc2Rbal0ucmV2aXNpb24sCisJCQkJc2l6ZW9mKGNzZC0+cmV2aXNpb24pKTsKIAkJfSBlbHNlIAkJLyogZGV2aWNlIGlzIHNhbWUgYXMgaXQgZXZlciB3YXMsICovCiAJCQlpKys7CS8qIHNvIGp1c3QgbW92ZSBhbG9uZy4gKi8KIAl9CkBAIC01NzcsNyArNjAxLDcgQEAKIAkJCWNzZCA9ICZjY2lzc3Njc2lbY3Rscl0uZGV2W2pdOwogCQkJaWYgKFNDU0kzQUREUl9FUShzZFtpXS5zY3NpM2FkZHIsCiAJCQkJY3NkLT5zY3NpM2FkZHIpKSB7Ci0JCQkJaWYgKHNkW2ldLmRldnR5cGUgPT0gY3NkLT5kZXZ0eXBlKQorCQkJCWlmIChkZXZpY2VfaXNfdGhlX3NhbWUoJnNkW2ldLCBjc2QpKQogCQkJCQlmb3VuZD0yOwkvKiBmb3VuZCBkZXZpY2UgKi8KIAkJCQllbHNlCiAJCQkJCWZvdW5kPTE7IAkvKiBmb3VuZCBhIGJ1Zy4gKi8KQEAgLTU4NiwxNiArNjEwLDE0IEBACiAJCX0KIAkJaWYgKCFmb3VuZCkgewogCQkJY2hhbmdlcysrOwotCQkJaWYgKGNjaXNzX3Njc2lfYWRkX2VudHJ5KGN0bHIsIGhvc3RubywgCi0KLQkJCQkmc2RbaV0uc2NzaTNhZGRyWzBdLCBzZFtpXS5kZXZ0eXBlLAorCQkJaWYgKGNjaXNzX3Njc2lfYWRkX2VudHJ5KGN0bHIsIGhvc3RubywgJnNkW2ldLAogCQkJCWFkZGVkLCAmbmFkZGVkKSAhPSAwKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGZvdW5kID09IDEpIHsKIAkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KIAkJCWNoYW5nZXMrKzsKLQkJCXByaW50aygiY2Npc3MlZDogZGV2aWNlIHVuZXhwZWN0ZWRseSBjaGFuZ2VkIHR5cGVcbiIsCi0JCQkJY3Rscik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBkZXZpY2UgIgorCQkJCSJ1bmV4cGVjdGVkbHkgY2hhbmdlZFxuIiwgY3Rscik7CiAJCQkvKiBidXQgaWYgaXQgZG9lcyBoYXBwZW4sIHdlIGp1c3QgaWdub3JlIHRoYXQgZGV2aWNlICovCiAJCX0KIAl9CkBAIC0xMDEyLDcgKzEwMzQsOCBAQAogCiBzdGF0aWMgaW50CiBjY2lzc19zY3NpX2RvX2lucXVpcnkoY3Rscl9pbmZvX3QgKmMsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgCi0JCSB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgYnVmc2l6ZSkKKwl1bnNpZ25lZCBjaGFyIHBhZ2UsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwl1bnNpZ25lZCBjaGFyIGJ1ZnNpemUpCiB7CiAJaW50IHJjOwogCUNvbW1hbmRMaXN0X3N0cnVjdCAqY3A7CkBAIC0xMDMyLDggKzEwNTUsOCBAQAogCWVpID0gY3AtPmVycl9pbmZvOyAKIAogCWNkYlswXSA9IENJU1NfSU5RVUlSWTsKLQljZGJbMV0gPSAwOwotCWNkYlsyXSA9IDA7CisJY2RiWzFdID0gKHBhZ2UgIT0gMCk7CisJY2RiWzJdID0gcGFnZTsKIAljZGJbM10gPSAwOwogCWNkYls0XSA9IGJ1ZnNpemU7CiAJY2RiWzVdID0gMDsKQEAgLTEwNTMsNiArMTA3NiwyNSBAQAogCXJldHVybiByYzsJCiB9CiAKKy8qIEdldCB0aGUgZGV2aWNlIGlkIGZyb20gaW5xdWlyeSBwYWdlIDB4ODMgKi8KK3N0YXRpYyBpbnQgY2Npc3Nfc2NzaV9nZXRfZGV2aWNlX2lkKGN0bHJfaW5mb190ICpjLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJdW5zaWduZWQgY2hhciAqZGV2aWNlX2lkLCBpbnQgYnVmbGVuKQoreworCWludCByYzsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlpZiAoYnVmbGVuID4gMTYpCisJCWJ1ZmxlbiA9IDE2OworCWJ1ZiA9IGt6YWxsb2MoNjQsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLTE7CisJcmMgPSBjY2lzc19zY3NpX2RvX2lucXVpcnkoYywgc2NzaTNhZGRyLCAweDgzLCBidWYsIDY0KTsKKwlpZiAocmMgPT0gMCkKKwkJbWVtY3B5KGRldmljZV9pZCwgJmJ1Zls4XSwgYnVmbGVuKTsKKwlrZnJlZShidWYpOworCXJldHVybiByYyAhPSAwOworfQorCiBzdGF0aWMgaW50CiBjY2lzc19zY3NpX2RvX3JlcG9ydF9waHlzX2x1bnMoY3Rscl9pbmZvX3QgKmMsIAogCQlSZXBvcnRMdW5EYXRhX3N0cnVjdCAqYnVmLCBpbnQgYnVmc2l6ZSkKQEAgLTExNDIsMjUgKzExODQsMjEgQEAKIAljdGxyX2luZm9fdCAqYzsKIAlfX3UzMiBudW1fbHVucz0wOwogCXVuc2lnbmVkIGNoYXIgKmNoOwotCS8qIHVuc2lnbmVkIGNoYXIgZm91bmRbQ0NJU1NfTUFYX1NDU0lfREVWU19QRVJfSEJBXTsgKi8KLQlzdHJ1Y3QgY2Npc3Nfc2NzaV9kZXZfdCBjdXJyZW50c2RbQ0NJU1NfTUFYX1NDU0lfREVWU19QRVJfSEJBXTsKKwlzdHJ1Y3QgY2Npc3Nfc2NzaV9kZXZfdCAqY3VycmVudHNkLCAqdGhpc19kZXZpY2U7CiAJaW50IG5jdXJyZW50PTA7CiAJaW50IHJlcG9ydGx1bnNpemUgPSBzaXplb2YoKmxkX2J1ZmYpICsgQ0lTU19NQVhfUEhZU19MVU4gKiA4OwogCWludCBpOwogCiAJYyA9IChjdGxyX2luZm9fdCAqKSBoYmFbY250bF9udW1dOwkKIAlsZF9idWZmID0ga3phbGxvYyhyZXBvcnRsdW5zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRfYnVmZiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm47Ci0JfQogCWlucV9idWZmID0ga21hbGxvYyhPQkRSX1RBUEVfSU5RX1NJWkUsIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoaW5xX2J1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgIGtmcmVlKGxkX2J1ZmYpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKwljdXJyZW50c2QgPSBremFsbG9jKHNpemVvZigqY3VycmVudHNkKSAqCisJCQkoQ0NJU1NfTUFYX1NDU0lfREVWU19QRVJfSEJBKzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAobGRfYnVmZiA9PSBOVUxMIHx8IGlucV9idWZmID09IE5VTEwgfHwgY3VycmVudHNkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OwogCX0KLQorCXRoaXNfZGV2aWNlID0gJmN1cnJlbnRzZFtDQ0lTU19NQVhfU0NTSV9ERVZTX1BFUl9IQkFdOwogCWlmIChjY2lzc19zY3NpX2RvX3JlcG9ydF9waHlzX2x1bnMoYywgbGRfYnVmZiwgcmVwb3J0bHVuc2l6ZSkgPT0gMCkgewogCQljaCA9ICZsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzBdOwogCQludW1fbHVucyA9ICgoY2hbMF08PDI0KSB8IChjaFsxXTw8MTYpIHwgKGNoWzJdPDw4KSB8IGNoWzNdKSAvIDg7CkBAIC0xMTc5LDIzICsxMjE3LDM0IEBACiAKIAogCS8qIGFkanVzdCBvdXIgdGFibGUgb2YgZGV2aWNlcyAqLwkKLQlmb3IoaT0wOyBpPG51bV9sdW5zOyBpKyspCi0JewotCQlpbnQgZGV2dHlwZTsKLQorCWZvciAoaSA9IDA7IGkgPCBudW1fbHVuczsgaSsrKSB7CiAJCS8qIGZvciBlYWNoIHBoeXNpY2FsIGx1biwgZG8gYW4gaW5xdWlyeSAqLwogCQlpZiAobGRfYnVmZi0+TFVOW2ldWzNdICYgMHhDMCkgY29udGludWU7CiAJCW1lbXNldChpbnFfYnVmZiwgMCwgT0JEUl9UQVBFX0lOUV9TSVpFKTsKIAkJbWVtY3B5KCZzY3NpM2FkZHJbMF0sICZsZF9idWZmLT5MVU5baV1bMF0sIDgpOwogCi0JCWlmIChjY2lzc19zY3NpX2RvX2lucXVpcnkoaGJhW2NudGxfbnVtXSwgc2NzaTNhZGRyLCBpbnFfYnVmZiwKLQkJCSh1bnNpZ25lZCBjaGFyKSBPQkRSX1RBUEVfSU5RX1NJWkUpICE9IDApIHsKKwkJaWYgKGNjaXNzX3Njc2lfZG9faW5xdWlyeShoYmFbY250bF9udW1dLCBzY3NpM2FkZHIsIDAsIGlucV9idWZmLAorCQkJKHVuc2lnbmVkIGNoYXIpIE9CRFJfVEFQRV9JTlFfU0laRSkgIT0gMCkKIAkJCS8qIElucXVpcnkgZmFpbGVkIChtc2cgcHJpbnRlZCBhbHJlYWR5KSAqLwotCQkJZGV2dHlwZSA9IDA7IC8qIHNvIHdlIHdpbGwgc2tpcCB0aGlzIGRldmljZS4gKi8KLQkJfSBlbHNlIC8qIHdoYXQga2luZCBvZiBkZXZpY2UgaXMgdGhpcz8gKi8KLQkJCWRldnR5cGUgPSAoaW5xX2J1ZmZbMF0gJiAweDFmKTsKKwkJCWNvbnRpbnVlOyAvKiBzbyB3ZSB3aWxsIHNraXAgdGhpcyBkZXZpY2UuICovCiAKLQkJc3dpdGNoIChkZXZ0eXBlKQorCQl0aGlzX2RldmljZS0+ZGV2dHlwZSA9IChpbnFfYnVmZlswXSAmIDB4MWYpOworCQl0aGlzX2RldmljZS0+YnVzID0gLTE7CisJCXRoaXNfZGV2aWNlLT50YXJnZXQgPSAtMTsKKwkJdGhpc19kZXZpY2UtPmx1biA9IC0xOworCQltZW1jcHkodGhpc19kZXZpY2UtPnNjc2kzYWRkciwgc2NzaTNhZGRyLCA4KTsKKwkJbWVtY3B5KHRoaXNfZGV2aWNlLT52ZW5kb3IsICZpbnFfYnVmZls4XSwKKwkJCXNpemVvZih0aGlzX2RldmljZS0+dmVuZG9yKSk7CisJCW1lbWNweSh0aGlzX2RldmljZS0+bW9kZWwsICZpbnFfYnVmZlsxNl0sCisJCQlzaXplb2YodGhpc19kZXZpY2UtPm1vZGVsKSk7CisJCW1lbWNweSh0aGlzX2RldmljZS0+cmV2aXNpb24sICZpbnFfYnVmZlszMl0sCisJCQlzaXplb2YodGhpc19kZXZpY2UtPnJldmlzaW9uKSk7CisJCW1lbXNldCh0aGlzX2RldmljZS0+ZGV2aWNlX2lkLCAwLAorCQkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5kZXZpY2VfaWQpKTsKKwkJY2Npc3Nfc2NzaV9nZXRfZGV2aWNlX2lkKGhiYVtjbnRsX251bV0sIHNjc2kzYWRkciwKKwkJCXRoaXNfZGV2aWNlLT5kZXZpY2VfaWQsIHNpemVvZih0aGlzX2RldmljZS0+ZGV2aWNlX2lkKSk7CisKKwkJc3dpdGNoICh0aGlzX2RldmljZS0+ZGV2dHlwZSkKIAkJewogCQkgIGNhc2UgMHgwNTogLyogQ0QtUk9NICovIHsKIApAQCAtMTIyMCwxNSArMTI2OSwxMCBAQAogCQkJaWYgKG5jdXJyZW50ID49IENDSVNTX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSkgewogCQkJCXByaW50ayhLRVJOX0lORk8gImNjaXNzJWQ6ICVzIGlnbm9yZWQsICIKIAkJCQkJInRvbyBtYW55IGRldmljZXMuXG4iLCBjbnRsX251bSwKLQkJCQkJc2NzaV9kZXZpY2VfdHlwZShkZXZ0eXBlKSk7CisJCQkJCXNjc2lfZGV2aWNlX3R5cGUodGhpc19kZXZpY2UtPmRldnR5cGUpKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCW1lbWNweSgmY3VycmVudHNkW25jdXJyZW50XS5zY3NpM2FkZHJbMF0sIAotCQkJCSZzY3NpM2FkZHJbMF0sIDgpOwotCQkJY3VycmVudHNkW25jdXJyZW50XS5kZXZ0eXBlID0gZGV2dHlwZTsKLQkJCWN1cnJlbnRzZFtuY3VycmVudF0uYnVzID0gLTE7Ci0JCQljdXJyZW50c2RbbmN1cnJlbnRdLnRhcmdldCA9IC0xOwotCQkJY3VycmVudHNkW25jdXJyZW50XS5sdW4gPSAtMTsKKwkJCWN1cnJlbnRzZFtuY3VycmVudF0gPSAqdGhpc19kZXZpY2U7CiAJCQluY3VycmVudCsrOwogCQkJYnJlYWs7CiAJCSAgZGVmYXVsdDogCkBAIC0xMjQwLDYgKzEyODQsNyBAQAogb3V0OgogCWtmcmVlKGlucV9idWZmKTsKIAlrZnJlZShsZF9idWZmKTsKKwlrZnJlZShjdXJyZW50c2QpOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzc19zY3NpLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuaAppbmRleCBkOWMyYzU4Li43Yjc1MDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuaApAQCAtNjYsNiArNjYsMTAgQEAKIAlpbnQgZGV2dHlwZTsKIAlpbnQgYnVzLCB0YXJnZXQsIGx1bjsJCS8qIGFzIHByZXNlbnRlZCB0byB0aGUgT1MgKi8KIAl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcls4XTsJLyogYXMgcHJlc2VudGVkIHRvIHRoZSBIVyAqLworCXVuc2lnbmVkIGNoYXIgZGV2aWNlX2lkWzE2XTsJLyogZnJvbSBpbnF1aXJ5IHBnLiAweDgzICovCisJdW5zaWduZWQgY2hhciB2ZW5kb3JbOF07CS8qIGJ5dGVzIDgtMTUgb2YgaW5xdWlyeSBkYXRhICovCisJdW5zaWduZWQgY2hhciBtb2RlbFsxNl07CS8qIGJ5dGVzIDE2LTMxIG9mIGlucXVpcnkgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb25bNF07CS8qIGJ5dGVzIDMyLTM1IG9mIGlucXVpcnkgZGF0YSAqLwogfTsKIAogc3RydWN0IGNjaXNzX3Njc2lfaGJhX3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IDA5YzE0MzQuLjNkOTY3NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTQyNCw3ICs0MjQsNyBAQAogCQloYmFbaV0tPnBjaV9kZXYsIE5SX0NNRFMgKiBzaXplb2YoY21kbGlzdF90KSwKIAkJJihoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpKTsKIAloYmFbaV0tPmNtZF9wb29sX2JpdHMgPSBrY2FsbG9jKAotCQkoTlJfQ01EUytCSVRTX1BFUl9MT05HLTEpL0JJVFNfUEVSX0xPTkcsIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJRElWX1JPVU5EX1VQKE5SX0NNRFMsIEJJVFNfUEVSX0xPTkcpLCBzaXplb2YodW5zaWduZWQgbG9uZyksCiAJCUdGUF9LRVJORUwpOwogCiAJaWYgKCFoYmFbaV0tPmNtZF9wb29sX2JpdHMgfHwgIWhiYVtpXS0+Y21kX3Bvb2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwppbmRleCAzOTVmOGVhLi4yY2VhMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKQEAgLTQyMyw4ICs0MjMsMTUgQEAKICAqIDE1ODEncyBsb2dpY2FsIHNpZGUgMCBpcyBvbiBwaHlzaWNhbCBzaWRlIDEsIHdoZXJlYXMgdGhlIFNoYXJwJ3MgbG9naWNhbAogICogc2lkZSAwIGlzIG9uIHBoeXNpY2FsIHNpZGUgMCAoYnV0IHdpdGggdGhlIG1pc25hbWVkIHNlY3RvciBJRHMpLgogICogJ3N0cmV0Y2gnIHNob3VsZCBwcm9iYWJseSBiZSByZW5hbWVkIHRvIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwsIGxpa2UKLSAqICdvcHRpb25zJy4gIE90aGVyIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkgKHNlZSBhbHNvCi0gKiBzZXRmZHBybSg4KSkuCisgKiAnb3B0aW9ucycuCisgKgorICogQml0cyAyIHRocm91Z2ggOSBvZiAnc3RyZXRjaCcgdGVsbCB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBzZWN0b3IuCisgKiBUaGUgTFNCIChiaXQgMikgaXMgZmxpcHBlZC4gRm9yIG1vc3QgZGlza3MsIHRoZSBmaXJzdCBzZWN0b3IKKyAqIGlzIDEgKHJlcHJlc2VudGVkIGJ5IDB4MDA8PDIpLiAgRm9yIHNvbWUgQ1AvTSBhbmQgbXVzaWMgc2FtcGxlcgorICogZGlza3MgKHN1Y2ggYXMgRW5zb25pcSBFUFMgMTZwbHVzKSBpdCBpcyAwIChyZXByZXNlbnRlZCBhcyAweDAxPDwyKS4KKyAqIEZvciBBbXN0cmFkIENQQyBkaXNrcyBpdCBpcyAweEMxIChyZXByZXNlbnRlZCBhcyAweEMwPDwyKS4KKyAqCisgKiBPdGhlciBwYXJhbWV0ZXJzIHNob3VsZCBiZSBzZWxmLWV4cGxhbmF0b3J5IChzZWUgYWxzbyBzZXRmZHBybSg4KSkuCiAgKi8KIC8qCiAJICAgIFNpemUKQEAgLTEzNTUsMjAgKzEzNjIsMjAgQEAKIAl9CiAKIAkvKiBDb252ZXJ0IHN0ZXAgcmF0ZSBmcm9tIG1pY3Jvc2Vjb25kcyB0byBtaWxsaXNlY29uZHMgYW5kIDQgYml0cyAqLwotCXNydCA9IDE2IC0gKERQLT5zcnQgKiBzY2FsZV9kdHIgLyAxMDAwICsgTk9NSU5BTF9EVFIgLSAxKSAvIE5PTUlOQUxfRFRSOworCXNydCA9IDE2IC0gRElWX1JPVU5EX1VQKERQLT5zcnQgKiBzY2FsZV9kdHIgLyAxMDAwLCBOT01JTkFMX0RUUik7CiAJaWYgKHNsb3dfZmxvcHB5KSB7CiAJCXNydCA9IHNydCAvIDQ7CiAJfQogCVNVUEJPVU5EKHNydCwgMHhmKTsKIAlJTkZCT1VORChzcnQsIDApOwogCi0JaGx0ID0gKERQLT5obHQgKiBzY2FsZV9kdHIgLyAyICsgTk9NSU5BTF9EVFIgLSAxKSAvIE5PTUlOQUxfRFRSOworCWhsdCA9IERJVl9ST1VORF9VUChEUC0+aGx0ICogc2NhbGVfZHRyIC8gMiwgTk9NSU5BTF9EVFIpOwogCWlmIChobHQgPCAweDAxKQogCQlobHQgPSAweDAxOwogCWVsc2UgaWYgKGhsdCA+IDB4N2YpCiAJCWhsdCA9IGhsdF9tYXhfY29kZTsKIAotCWh1dCA9IChEUC0+aHV0ICogc2NhbGVfZHRyIC8gMTYgKyBOT01JTkFMX0RUUiAtIDEpIC8gTk9NSU5BTF9EVFI7CisJaHV0ID0gRElWX1JPVU5EX1VQKERQLT5odXQgKiBzY2FsZV9kdHIgLyAxNiwgTk9NSU5BTF9EVFIpOwogCWlmIChodXQgPCAweDEpCiAJCWh1dCA9IDB4MTsKIAllbHNlIGlmIChodXQgPiAweGYpCkBAIC0yMjM2LDkgKzIyNDMsOSBAQAogCQkJfQogCQl9CiAJfQotCWlmIChfZmxvcHB5LT5zdHJldGNoICYgRkRfWkVST0JBU0VEKSB7CisJaWYgKF9mbG9wcHktPnN0cmV0Y2ggJiBGRF9TRUNUQkFTRU1BU0spIHsKIAkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgRl9TRUNUX1BFUl9UUkFDSzsgY291bnQrKykKLQkJCWhlcmVbY291bnRdLnNlY3QtLTsKKwkJCWhlcmVbY291bnRdLnNlY3QgKz0gRkRfU0VDVEJBU0UoX2Zsb3BweSkgLSAxOwogCX0KIH0KIApAQCAtMjM4NSw3ICsyMzkyLDcgQEAKIAogI2lmZGVmIEZMT1BQWV9TQU5JVFlfQ0hFQ0sKIAlpZiAobnJfc2VjdG9ycyAvIHNzaXplID4KLQkgICAgKGluX3NlY3Rvcl9vZmZzZXQgKyBjdXJyZW50X2NvdW50X3NlY3RvcnMgKyBzc2l6ZSAtIDEpIC8gc3NpemUpIHsKKwkgICAgRElWX1JPVU5EX1VQKGluX3NlY3Rvcl9vZmZzZXQgKyBjdXJyZW50X2NvdW50X3NlY3RvcnMsIHNzaXplKSkgewogCQlEUFJJTlQoImxvbmcgcnc6ICV4IGluc3RlYWQgb2YgJWx4XG4iLAogCQkgICAgICAgbnJfc2VjdG9ycywgY3VycmVudF9jb3VudF9zZWN0b3JzKTsKIAkJcHJpbnRrKCJycz0lZCBzPSVkXG4iLCBSX1NFQ1RPUiwgU0VDVE9SKTsKQEAgLTI2NDksNyArMjY1Niw3IEBACiAJfQogCUhFQUQgPSBmc2VjdG9yX3QgLyBfZmxvcHB5LT5zZWN0OwogCi0JaWYgKCgoX2Zsb3BweS0+c3RyZXRjaCAmIChGRF9TV0FQU0lERVMgfCBGRF9aRVJPQkFTRUQpKSB8fAorCWlmICgoKF9mbG9wcHktPnN0cmV0Y2ggJiAoRkRfU1dBUFNJREVTIHwgRkRfU0VDVEJBU0VNQVNLKSkgfHwKIAkgICAgIFRFU1RGKEZEX05FRURfVFdBRERMRSkpICYmIGZzZWN0b3JfdCA8IF9mbG9wcHktPnNlY3QpCiAJCW1heF9zZWN0b3IgPSBfZmxvcHB5LT5zZWN0OwogCkBAIC0yNjc5LDcgKzI2ODYsNyBAQAogCUNPREUyU0laRTsKIAlTRUNUX1BFUl9UUkFDSyA9IF9mbG9wcHktPnNlY3QgPDwgMiA+PiBTSVpFQ09ERTsKIAlTRUNUT1IgPSAoKGZzZWN0b3JfdCAlIF9mbG9wcHktPnNlY3QpIDw8IDIgPj4gU0laRUNPREUpICsKLQkgICAgKChfZmxvcHB5LT5zdHJldGNoICYgRkRfWkVST0JBU0VEKSA/IDAgOiAxKTsKKwkgICAgRkRfU0VDVEJBU0UoX2Zsb3BweSk7CiAKIAkvKiB0cmFja3NpemUgZGVzY3JpYmVzIHRoZSBzaXplIHdoaWNoIGNhbiBiZSBmaWxsZWQgdXAgd2l0aCBzZWN0b3JzCiAJICogb2Ygc2l6ZSBzc2l6ZS4KQEAgLTMzMTEsNyArMzMxOCw3IEBACiAJICAgIGctPmhlYWQgPD0gMCB8fAogCSAgICBnLT50cmFjayA8PSAwIHx8IGctPnRyYWNrID4gVURQLT50cmFja3MgPj4gU1RSRVRDSChnKSB8fAogCSAgICAvKiBjaGVjayBpZiByZXNlcnZlZCBiaXRzIGFyZSBzZXQgKi8KLQkgICAgKGctPnN0cmV0Y2ggJiB+KEZEX1NUUkVUQ0ggfCBGRF9TV0FQU0lERVMgfCBGRF9aRVJPQkFTRUQpKSAhPSAwKQorCSAgICAoZy0+c3RyZXRjaCAmIH4oRkRfU1RSRVRDSCB8IEZEX1NXQVBTSURFUyB8IEZEX1NFQ1RCQVNFTUFTSykpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICh0eXBlKSB7CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKQEAgLTMzNTYsNyArMzM2Myw3IEBACiAJCWlmIChEUlMtPm1heGJsb2NrID4gdXNlcl9wYXJhbXNbZHJpdmVdLnNlY3QgfHwKIAkJICAgIERSUy0+bWF4dHJhY2sgfHwKIAkJICAgICgodXNlcl9wYXJhbXNbZHJpdmVdLnNlY3QgXiBvbGRTdHJldGNoKSAmCi0JCSAgICAgKEZEX1NXQVBTSURFUyB8IEZEX1pFUk9CQVNFRCkpKQorCQkgICAgIChGRF9TV0FQU0lERVMgfCBGRF9TRUNUQkFTRU1BU0spKSkKIAkJCWludmFsaWRhdGVfZHJpdmUoYmRldik7CiAJCWVsc2UKIAkJCXByb2Nlc3NfZmRfcmVxdWVzdCgpOwpAQCAtNDE2NSw3ICs0MTcyLDcgQEAKIAlpbnQgaSwgdW5pdCwgZHJpdmU7CiAJaW50IGVyciwgZHI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQogCWlmIChjaGVja19sZWdhY3lfaW9wb3J0KEZEQzEpKQogCQlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9oZC5jIGIvZHJpdmVycy9ibG9jay9oZC5jCmluZGV4IDY4MjI0M2IuLjQ4MmMwYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svaGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2hkLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGEuaD4KICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogCiAjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCkBAIC0zNzAsNyArMzcxLDcgQEAKIAkJc3RydWN0IGhkX2lfc3RydWN0ICpkaXNrID0gJmhkX2luZm9baV07CiAJCWRpc2stPnNwZWNpYWxfb3AgPSBkaXNrLT5yZWNhbGlicmF0ZSA9IDE7CiAJCWhkX291dChkaXNrLCBkaXNrLT5zZWN0LCBkaXNrLT5zZWN0LCBkaXNrLT5oZWFkLTEsCi0JCQlkaXNrLT5jeWwsIFdJTl9TUEVDSUZZLCAmcmVzZXRfaGQpOworCQkJZGlzay0+Y3lsLCBBVEFfQ01EX0lOSVRfREVWX1BBUkFNUywgJnJlc2V0X2hkKTsKIAkJaWYgKHJlc2V0KQogCQkJZ290byByZXBlYXQ7CiAJfSBlbHNlCkBAIC01NTgsNyArNTU5LDcgQEAKIHsKIAlpZiAoZGlzay0+cmVjYWxpYnJhdGUpIHsKIAkJZGlzay0+cmVjYWxpYnJhdGUgPSAwOwotCQloZF9vdXQoZGlzaywgZGlzay0+c2VjdCwgMCwgMCwgMCwgV0lOX1JFU1RPUkUsICZyZWNhbF9pbnRyKTsKKwkJaGRfb3V0KGRpc2ssIGRpc2stPnNlY3QsIDAsIDAsIDAsIEFUQV9DTURfUkVTVE9SRSwgJnJlY2FsX2ludHIpOwogCQlyZXR1cm4gcmVzZXQ7CiAJfQogCWlmIChkaXNrLT5oZWFkID4gMTYpIHsKQEAgLTYzMSwxMyArNjMyLDEzIEBACiAJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpIHsKIAkJc3dpdGNoIChycV9kYXRhX2RpcihyZXEpKSB7CiAJCWNhc2UgUkVBRDoKLQkJCWhkX291dChkaXNrLCBuc2VjdCwgc2VjLCBoZWFkLCBjeWwsIFdJTl9SRUFELAorCQkJaGRfb3V0KGRpc2ssIG5zZWN0LCBzZWMsIGhlYWQsIGN5bCwgQVRBX0NNRF9QSU9fUkVBRCwKIAkJCQkmcmVhZF9pbnRyKTsKIAkJCWlmIChyZXNldCkKIAkJCQlnb3RvIHJlcGVhdDsKIAkJCWJyZWFrOwogCQljYXNlIFdSSVRFOgotCQkJaGRfb3V0KGRpc2ssIG5zZWN0LCBzZWMsIGhlYWQsIGN5bCwgV0lOX1dSSVRFLAorCQkJaGRfb3V0KGRpc2ssIG5zZWN0LCBzZWMsIGhlYWQsIGN5bCwgQVRBX0NNRF9QSU9fV1JJVEUsCiAJCQkJJndyaXRlX2ludHIpOwogCQkJaWYgKHJlc2V0KQogCQkJCWdvdG8gcmVwZWF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggMTc3OGU0YS4uN2IzMzUxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC00MDMsNyArNDAzLDcgQEAKIAlCVUdfT04obG8tPm1hZ2ljICE9IExPX01BR0lDKTsKIAogCWxvLT5waWQgPSBjdXJyZW50LT5waWQ7Ci0JcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmxvLT5kaXNrLT5kZXYua29iaiwgJnBpZF9hdHRyLmF0dHIpOworCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkaXNrX3RvX2Rldihsby0+ZGlzayktPmtvYmosICZwaWRfYXR0ci5hdHRyKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAibmJkOiBzeXNmc19jcmVhdGVfZmlsZSBmYWlsZWQhIik7CiAJCXJldHVybiByZXQ7CkBAIC00MTIsNyArNDEyLDcgQEAKIAl3aGlsZSAoKHJlcSA9IG5iZF9yZWFkX3N0YXQobG8pKSAhPSBOVUxMKQogCQluYmRfZW5kX3JlcXVlc3QocmVxKTsKIAotCXN5c2ZzX3JlbW92ZV9maWxlKCZsby0+ZGlzay0+ZGV2LmtvYmosICZwaWRfYXR0ci5hdHRyKTsKKwlzeXNmc19yZW1vdmVfZmlsZSgmZGlza190b19kZXYobG8tPmRpc2spLT5rb2JqLCAmcGlkX2F0dHIuYXR0cik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCmluZGV4IGQ3MzFjYTQuLjlkZmEyNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYwpAQCAtNjg2LDkgKzY4Niw4IEBACiAJZm9yICh1bml0ID0gMDsgdW5pdCA8IFBHX1VOSVRTOyB1bml0KyspIHsKIAkJc3RydWN0IHBnICpkZXYgPSAmZGV2aWNlc1t1bml0XTsKIAkJaWYgKGRldi0+cHJlc2VudCkKLQkJCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShwZ19jbGFzcywgTlVMTCwKLQkJCQkJICAgICAgTUtERVYobWFqb3IsIHVuaXQpLCBOVUxMLAotCQkJCQkgICAgICAicGcldSIsIHVuaXQpOworCQkJZGV2aWNlX2NyZWF0ZShwZ19jbGFzcywgTlVMTCwgTUtERVYobWFqb3IsIHVuaXQpLCBOVUxMLAorCQkJCSAgICAgICJwZyV1IiwgdW5pdCk7CiAJfQogCWVyciA9IDA7CiAJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcHQuYwppbmRleCA2NzNiOGIyLi41YWUyMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3B0LmMKQEAgLTk3OSwxMiArOTc5LDEwIEBACiAKIAlmb3IgKHVuaXQgPSAwOyB1bml0IDwgUFRfVU5JVFM7IHVuaXQrKykKIAkJaWYgKHB0W3VuaXRdLnByZXNlbnQpIHsKLQkJCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShwdF9jbGFzcywgTlVMTCwKLQkJCQkJICAgICAgTUtERVYobWFqb3IsIHVuaXQpLCBOVUxMLAotCQkJCQkgICAgICAicHQlZCIsIHVuaXQpOwotCQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHB0X2NsYXNzLCBOVUxMLAotCQkJCQkgICAgICBNS0RFVihtYWpvciwgdW5pdCArIDEyOCksIE5VTEwsCi0JCQkJCSAgICAgICJwdCVkbiIsIHVuaXQpOworCQkJZGV2aWNlX2NyZWF0ZShwdF9jbGFzcywgTlVMTCwgTUtERVYobWFqb3IsIHVuaXQpLCBOVUxMLAorCQkJCSAgICAgICJwdCVkIiwgdW5pdCk7CisJCQlkZXZpY2VfY3JlYXRlKHB0X2NsYXNzLCBOVUxMLCBNS0RFVihtYWpvciwgdW5pdCArIDEyOCksCisJCQkJICAgICAgTlVMTCwgInB0JWRuIiwgdW5pdCk7CiAJCX0KIAlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwppbmRleCAyOWI3YTY0Li4xOTVjYTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwpAQCAtMzAyLDkgKzMwMiw4IEBACiBzdGF0aWMgdm9pZCBwa3Rfc3lzZnNfZGV2X25ldyhzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkKQogewogCWlmIChjbGFzc19wa3RjZHZkKSB7Ci0JCXBkLT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoY2xhc3NfcGt0Y2R2ZCwgTlVMTCwKLQkJCQkJCXBkLT5wa3RfZGV2LCBOVUxMLAotCQkJCQkJIiVzIiwgcGQtPm5hbWUpOworCQlwZC0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShjbGFzc19wa3RjZHZkLCBOVUxMLCBwZC0+cGt0X2RldiwgTlVMTCwKKwkJCQkJIiVzIiwgcGQtPm5hbWUpOwogCQlpZiAoSVNfRVJSKHBkLT5kZXYpKQogCQkJcGQtPmRldiA9IE5VTEw7CiAJfQpAQCAtMjU0NCw3ICsyNTQzLDcgQEAKIAkJaWYgKGxhc3Rfem9uZSAhPSB6b25lKSB7CiAJCQlCVUdfT04obGFzdF96b25lICE9IHpvbmUgKyBwZC0+c2V0dGluZ3Muc2l6ZSk7CiAJCQlmaXJzdF9zZWN0b3JzID0gbGFzdF96b25lIC0gYmlvLT5iaV9zZWN0b3I7Ci0JCQlicCA9IGJpb19zcGxpdChiaW8sIGJpb19zcGxpdF9wb29sLCBmaXJzdF9zZWN0b3JzKTsKKwkJCWJwID0gYmlvX3NwbGl0KGJpbywgZmlyc3Rfc2VjdG9ycyk7CiAJCQlCVUdfT04oIWJwKTsKIAkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKTsKIAkJCXBrdF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8yKTsKQEAgLTI5MTEsNyArMjkxMCw3IEBACiAJaWYgKCFkaXNrLT5xdWV1ZSkKIAkJZ290byBvdXRfbWVtMjsKIAotCXBkLT5wa3RfZGV2ID0gTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKTsKKwlwZC0+cGt0X2RldiA9IE1LREVWKHBrdGRldl9tYWpvciwgaWR4KTsKIAlyZXQgPSBwa3RfbmV3X2RldihwZCwgZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9uZXdfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wczNkaXNrLmMgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwppbmRleCBkNzk3ZTIwLi45MzY0NjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYworKysgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwpAQCAtMTk5LDcgKzE5OSw4IEBACiAJCWlmIChibGtfZnNfcmVxdWVzdChyZXEpKSB7CiAJCQlpZiAocHMzZGlza19zdWJtaXRfcmVxdWVzdF9zZyhkZXYsIHJlcSkpCiAJCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocmVxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9GTFVTSCkgeworCQl9IGVsc2UgaWYgKHJlcS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfTElOVVhfQkxPQ0sgJiYKKwkJCSAgIHJlcS0+Y21kWzBdID09IFJFUV9MQl9PUF9GTFVTSCkgewogCQkJaWYgKHBzM2Rpc2tfc3VibWl0X2ZsdXNoX3JlcXVlc3QoZGV2LCByZXEpKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgewpAQCAtMjU3LDcgKzI1OCw4IEBACiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKLQlpZiAocmVxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9GTFVTSCkgeworCWlmIChyZXEtPmNtZF90eXBlID09IFJFUV9UWVBFX0xJTlVYX0JMT0NLICYmCisJICAgIHJlcS0+Y21kWzBdID09IFJFUV9MQl9PUF9GTFVTSCkgewogCQlyZWFkID0gMDsKIAkJbnVtX3NlY3RvcnMgPSByZXEtPmhhcmRfY3VyX3NlY3RvcnM7CiAJCW9wID0gImZsdXNoIjsKQEAgLTQwNSw3ICs0MDcsOCBAQAogCiAJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0ZMVVNIOworCXJlcS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9MSU5VWF9CTE9DSzsKKwlyZXEtPmNtZFswXSA9IFJFUV9MQl9PUF9GTFVTSDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHMzZGlza19tYXNrOwpAQCAtNTM4LDcgKzU0MSw3IEBACiAJc3RydWN0IHBzM2Rpc2tfcHJpdmF0ZSAqcHJpdiA9IGRldi0+c2JkLmNvcmUuZHJpdmVyX2RhdGE7CiAKIAltdXRleF9sb2NrKCZwczNkaXNrX21hc2tfbXV0ZXgpOwotCV9fY2xlYXJfYml0KHByaXYtPmdlbmRpc2stPmZpcnN0X21pbm9yIC8gUFMzRElTS19NSU5PUlMsCisJX19jbGVhcl9iaXQoTUlOT1IoZGlza19kZXZ0KHByaXYtPmdlbmRpc2spKSAvIFBTM0RJU0tfTUlOT1JTLAogCQkgICAgJnBzM2Rpc2tfbWFzayk7CiAJbXV0ZXhfdW5sb2NrKCZwczNkaXNrX21hc2tfbXV0ZXgpOwogCWRlbF9nZW5kaXNrKHByaXYtPmdlbmRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKaW5kZXggYThkZTAzNy4uOTUzYzBiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCkBAIC0xLDYgKzEsNiBAQAogLyogc3VudmRjLmM6IFN1biBMRE9NIFZpcnR1YWwgRGlzayBDbGllbnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtODM0LDcgKzgzNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2ZGNfcG9ydF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZkY19wb3J0X21hdGNoW10gPSB7CiAJewogCQkudHlwZSA9ICJ2ZGMtcG9ydCIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggZjFjOGZlYi4uMTczMGQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKKysrIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKQEAgLTI0OSw3ICsyNDksNiBAQAogCXN0cnVjdCBIdkxwRXZlbnQgKmhldjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbVklPTUFYQkxPQ0tETUFdOwogCWludCBzZ2luZGV4OwotCWludCBzdGF0aW5kZXg7CiAJc3RydWN0IHZpb2Rhc2RfZGV2aWNlICpkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI1OCwxMSArMjU3LDkgQEAKIAlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CiAJCWRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAkJdmlvY21kID0gdmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8gfCB2aW9ibG9ja3JlYWQ7Ci0JCXN0YXRpbmRleCA9IDA7CiAJfSBlbHNlIHsKIAkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAkJdmlvY21kID0gdmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8gfCB2aW9ibG9ja3dyaXRlOwotCQlzdGF0aW5kZXggPSAxOwogCX0KIAogICAgICAgICBkID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCmluZGV4IDQyMjUxMDkuLjZlYzVmYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCkBAIC00NywyMCArNDcsMjAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2YmxrLT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCh2YnIgPSB2YmxrLT52cS0+dnFfb3BzLT5nZXRfYnVmKHZibGstPnZxLCAmbGVuKSkgIT0gTlVMTCkgewotCQlpbnQgdXB0b2RhdGU7CisJCWludCBlcnJvcjsKIAkJc3dpdGNoICh2YnItPnN0YXR1cykgewogCQljYXNlIFZJUlRJT19CTEtfU19PSzoKLQkJCXVwdG9kYXRlID0gMTsKKwkJCWVycm9yID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIFZJUlRJT19CTEtfU19VTlNVUFA6Ci0JCQl1cHRvZGF0ZSA9IC1FTk9UVFk7CisJCQllcnJvciA9IC1FTk9UVFk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXVwdG9kYXRlID0gMDsKKwkJCWVycm9yID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJZW5kX2RlcXVldWVkX3JlcXVlc3QodmJyLT5yZXEsIHVwdG9kYXRlKTsKKwkJX19ibGtfZW5kX3JlcXVlc3QodmJyLT5yZXEsIGVycm9yLCBibGtfcnFfYnl0ZXModmJyLT5yZXEpKTsKIAkJbGlzdF9kZWwoJnZici0+bGlzdCk7CiAJCW1lbXBvb2xfZnJlZSh2YnIsIHZibGstPnBvb2wpOwogCX0KQEAgLTg0LDExICs4NCwxMSBAQAogCWlmIChibGtfZnNfcmVxdWVzdCh2YnItPnJlcSkpIHsKIAkJdmJyLT5vdXRfaGRyLnR5cGUgPSAwOwogCQl2YnItPm91dF9oZHIuc2VjdG9yID0gdmJyLT5yZXEtPnNlY3RvcjsKLQkJdmJyLT5vdXRfaGRyLmlvcHJpbyA9IHZici0+cmVxLT5pb3ByaW87CisJCXZici0+b3V0X2hkci5pb3ByaW8gPSByZXFfZ2V0X2lvcHJpbyh2YnItPnJlcSk7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdCh2YnItPnJlcSkpIHsKIAkJdmJyLT5vdXRfaGRyLnR5cGUgPSBWSVJUSU9fQkxLX1RfU0NTSV9DTUQ7CiAJCXZici0+b3V0X2hkci5zZWN0b3IgPSAwOwotCQl2YnItPm91dF9oZHIuaW9wcmlvID0gdmJyLT5yZXEtPmlvcHJpbzsKKwkJdmJyLT5vdXRfaGRyLmlvcHJpbyA9IHJlcV9nZXRfaW9wcmlvKHZici0+cmVxKTsKIAl9IGVsc2UgewogCQkvKiBXZSBkb24ndCBwdXQgYW55dGhpbmcgZWxzZSBpbiB0aGUgcXVldWUuICovCiAJCUJVRygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggM2NhNjQzYy4uMWE1MGFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCkBAIC0xMDUsMTUgKzEwNSwxNyBAQAogI2RlZmluZSBHUkFOVF9JTlZBTElEX1JFRgkwCiAKICNkZWZpbmUgUEFSVFNfUEVSX0RJU0sJCTE2CisjZGVmaW5lIFBBUlRTX1BFUl9FWFRfRElTSyAgICAgIDI1NgogCiAjZGVmaW5lIEJMS0lGX01BSk9SKGRldikgKChkZXYpPj44KQogI2RlZmluZSBCTEtJRl9NSU5PUihkZXYpICgoZGV2KSAmIDB4ZmYpCiAKLSNkZWZpbmUgREVWX05BTUUJInh2ZCIJLyogbmFtZSBpbiAvZGV2ICovCisjZGVmaW5lIEVYVF9TSElGVCAyOAorI2RlZmluZSBFWFRFTkRFRCAoMTw8RVhUX1NISUZUKQorI2RlZmluZSBWREVWX0lTX0VYVEVOREVEKGRldikgKChkZXYpJihFWFRFTkRFRCkpCisjZGVmaW5lIEJMS0lGX01JTk9SX0VYVChkZXYpICgoZGV2KSYofkVYVEVOREVEKSkKIAotLyogSW5mb3JtYXRpb24gYWJvdXQgb3VyIFZCRHMuICovCi0jZGVmaW5lIE1BWF9WQkRTIDY0Ci1zdGF0aWMgTElTVF9IRUFEKHZiZHNfbGlzdCk7CisjZGVmaW5lIERFVl9OQU1FCSJ4dmQiCS8qIG5hbWUgaW4gL2RldiAqLwogCiBzdGF0aWMgaW50IGdldF9pZF9mcm9tX2ZyZWVsaXN0KHN0cnVjdCBibGtmcm9udF9pbmZvICppbmZvKQogewpAQCAtMzg2LDMxICszODgsNjAgQEAKIH0KIAogCi1zdGF0aWMgaW50IHhsdmJkX2FsbG9jX2dlbmRpc2soaW50IG1pbm9yLCBibGtpZl9zZWN0b3JfdCBjYXBhY2l0eSwKLQkJCSAgICAgICBpbnQgdmRldmljZSwgdTE2IHZkaXNrX2luZm8sIHUxNiBzZWN0b3Jfc2l6ZSwKLQkJCSAgICAgICBzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgeGx2YmRfYWxsb2NfZ2VuZGlzayhibGtpZl9zZWN0b3JfdCBjYXBhY2l0eSwKKwkJCSAgICAgICBzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1MTYgdmRpc2tfaW5mbywgdTE2IHNlY3Rvcl9zaXplKQogewogCXN0cnVjdCBnZW5kaXNrICpnZDsKIAlpbnQgbnJfbWlub3JzID0gMTsKIAlpbnQgZXJyID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBtaW5vcjsKKwlpbnQgbnJfcGFydHM7CiAKIAlCVUdfT04oaW5mby0+Z2QgIT0gTlVMTCk7CiAJQlVHX09OKGluZm8tPnJxICE9IE5VTEwpOwogCi0JaWYgKChtaW5vciAlIFBBUlRTX1BFUl9ESVNLKSA9PSAwKQotCQlucl9taW5vcnMgPSBQQVJUU19QRVJfRElTSzsKKwlpZiAoKGluZm8tPnZkZXZpY2U+PkVYVF9TSElGVCkgPiAxKSB7CisJCS8qIHRoaXMgaXMgYWJvdmUgdGhlIGV4dGVuZGVkIHJhbmdlOyBzb21ldGhpbmcgaXMgd3JvbmcgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmxrZnJvbnQ6IHZkZXZpY2UgMHgleCBpcyBhYm92ZSB0aGUgZXh0ZW5kZWQgcmFuZ2U7IGlnbm9yaW5nXG4iLCBpbmZvLT52ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFWREVWX0lTX0VYVEVOREVEKGluZm8tPnZkZXZpY2UpKSB7CisJCW1pbm9yID0gQkxLSUZfTUlOT1IoaW5mby0+dmRldmljZSk7CisJCW5yX3BhcnRzID0gUEFSVFNfUEVSX0RJU0s7CisJfSBlbHNlIHsKKwkJbWlub3IgPSBCTEtJRl9NSU5PUl9FWFQoaW5mby0+dmRldmljZSk7CisJCW5yX3BhcnRzID0gUEFSVFNfUEVSX0VYVF9ESVNLOworCX0KKworCWlmICgobWlub3IgJSBucl9wYXJ0cykgPT0gMCkKKwkJbnJfbWlub3JzID0gbnJfcGFydHM7CiAKIAlnZCA9IGFsbG9jX2Rpc2sobnJfbWlub3JzKTsKIAlpZiAoZ2QgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlpZiAobnJfbWlub3JzID4gMSkKLQkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAiJXMlYyIsIERFVl9OQU1FLAotCQkJJ2EnICsgbWlub3IgLyBQQVJUU19QRVJfRElTSyk7Ci0JZWxzZQotCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICIlcyVjJWQiLCBERVZfTkFNRSwKLQkJCSdhJyArIG1pbm9yIC8gUEFSVFNfUEVSX0RJU0ssCi0JCQltaW5vciAlIFBBUlRTX1BFUl9ESVNLKTsKKwlvZmZzZXQgPSBtaW5vciAvIG5yX3BhcnRzOworCisJaWYgKG5yX21pbm9ycyA+IDEpIHsKKwkJaWYgKG9mZnNldCA8IDI2KQorCQkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAiJXMlYyIsIERFVl9OQU1FLCAnYScgKyBvZmZzZXQpOworCQllbHNlCisJCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICIlcyVjJWMiLCBERVZfTkFNRSwKKwkJCQknYScgKyAoKG9mZnNldCAvIDI2KS0xKSwgJ2EnICsgKG9mZnNldCAlIDI2KSk7CisJfSBlbHNlIHsKKwkJaWYgKG9mZnNldCA8IDI2KQorCQkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAiJXMlYyVkIiwgREVWX05BTUUsCisJCQkJJ2EnICsgb2Zmc2V0LAorCQkJCW1pbm9yICYgKG5yX3BhcnRzIC0gMSkpOworCQllbHNlCisJCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICIlcyVjJWMlZCIsIERFVl9OQU1FLAorCQkJCSdhJyArICgob2Zmc2V0IC8gMjYpIC0gMSksCisJCQkJJ2EnICsgKG9mZnNldCAlIDI2KSwKKwkJCQltaW5vciAmIChucl9wYXJ0cyAtIDEpKTsKKwl9CiAKIAlnZC0+bWFqb3IgPSBYRU5WQkRfTUFKT1I7CiAJZ2QtPmZpcnN0X21pbm9yID0gbWlub3I7CkBAIC02OTksOCArNzMwLDEzIEBACiAJZXJyID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIGRldi0+bm9kZW5hbWUsCiAJCQkgICAidmlydHVhbC1kZXZpY2UiLCAiJWkiLCAmdmRldmljZSk7CiAJaWYgKGVyciAhPSAxKSB7Ci0JCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJyZWFkaW5nIHZpcnR1YWwtZGV2aWNlIik7Ci0JCXJldHVybiBlcnI7CisJCS8qIGdvIGxvb2tpbmcgaW4gdGhlIGV4dGVuZGVkIGFyZWEgaW5zdGVhZCAqLworCQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgZGV2LT5ub2RlbmFtZSwgInZpcnR1YWwtZGV2aWNlLWV4dCIsCisJCQkJICAgIiVpIiwgJnZkZXZpY2UpOworCQlpZiAoZXJyICE9IDEpIHsKKwkJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJyZWFkaW5nIHZpcnR1YWwtZGV2aWNlIik7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CkBAIC04NjEsOSArODk3LDcgQEAKIAlpZiAoZXJyKQogCQlpbmZvLT5mZWF0dXJlX2JhcnJpZXIgPSAwOwogCi0JZXJyID0geGx2YmRfYWxsb2NfZ2VuZGlzayhCTEtJRl9NSU5PUihpbmZvLT52ZGV2aWNlKSwKLQkJCQkgIHNlY3RvcnMsIGluZm8tPnZkZXZpY2UsCi0JCQkJICBiaW5mbywgc2VjdG9yX3NpemUsIGluZm8pOworCWVyciA9IHhsdmJkX2FsbG9jX2dlbmRpc2soc2VjdG9ycywgaW5mbywgYmluZm8sIHNlY3Rvcl9zaXplKTsKIAlpZiAoZXJyKSB7CiAJCXhlbmJ1c19kZXZfZmF0YWwoaW5mby0+eGJkZXYsIGVyciwgInhsdmJkX2FkZCBhdCAlcyIsCiAJCQkJIGluZm8tPnhiZGV2LT5vdGhlcmVuZCk7CkBAIC0xMDMyLDcgKzEwNjYsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4bGJsa19pbml0KHZvaWQpCiB7Ci0JaWYgKCFpc19ydW5uaW5nX29uX3hlbigpKQorCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChyZWdpc3Rlcl9ibGtkZXYoWEVOVkJEX01BSk9SLCBERVZfTkFNRSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCmluZGV4IGJjZjU3OTIuLmU2ZWUyMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtOTAxLDIzICs5MDEsMjMgQEAKIAlmb3IgKG4gPSAwOyBuIDwgMHg0MDA7IG4gKz0gMHg0MCkgewogCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBuIF4gMHgzMDA7CiAJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCQlpZiAoaSA9PSBDU19TVUNDRVNTKQorCQlpZiAoaSA9PSAwKQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SVJRLCBpKTsKIAkJbGluay0+aXJxLkFzc2lnbmVkSVJRID0gMDsKIAl9CiAKIAlpID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdENvbmZpZ3VyYXRpb24sIGkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9icGExMHguYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCmluZGV4IDFlNTVhNjUuLjMyZjNhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jCkBAIC0yNTYsNyArMjU2LDYgQEAKIAkJQlRfRVJSKCIlcyB1cmIgJXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKSIsCiAJCQkJCQloZGV2LT5uYW1lLCB1cmIsIC1lcnIpOwogCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7Ci0JCWtmcmVlKGJ1Zik7CiAJfQogCiAJdXNiX2ZyZWVfdXJiKHVyYik7CkBAIC0yOTgsNyArMjk3LDYgQEAKIAkJQlRfRVJSKCIlcyB1cmIgJXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKSIsCiAJCQkJCQloZGV2LT5uYW1lLCB1cmIsIC1lcnIpOwogCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7Ci0JCWtmcmVlKGJ1Zik7CiAJfQogCiAJdXNiX2ZyZWVfdXJiKHVyYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggMjcwNTg0Ny4uMmNiZTcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNjc4LDEwMSArNjc4LDc4IEBACiAJa2ZyZWUoaW5mbyk7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKK3N0YXRpYyBpbnQgYnQzY19jaGVja19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJCSAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHZjYywKKwkJCSAgICAgdm9pZCAqcHJpdl9kYXRhKQogewotCWludCBpOworCXVuc2lnbmVkIGxvbmcgdHJ5ID0gKHVuc2lnbmVkIGxvbmcpIHByaXZfZGF0YTsKIAotCWkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKKwlpZiAoY2YtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0gY2YtPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIChjZi0+aW8ud2luWzBdLmxlbiA9PSA4KSAmJgorCSAgICAoY2YtPmlvLndpblswXS5iYXNlICE9IDApKSB7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9ICh0cnkgPT0gMCkgPyAxNiA6CisJCQljZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQgZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQorc3RhdGljIGludCBidDNjX2NoZWNrX2NvbmZpZ19ub3RwaWNreShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YsCisJCQkJICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSkKIHsKLQlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSAhPSBDU19TVUNDRVNTKQotCQlyZXR1cm4gQ1NfTk9fTU9SRV9JVEVNUzsKLQlyZXR1cm4gZ2V0X3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKLX0KKwlzdGF0aWMgdW5zaWduZWQgaW50IGJhc2VbNV0gPSB7IDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4LCAweDAgfTsKKwlpbnQgajsKIAotc3RhdGljIGludCBuZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKLXsKLQlpZiAocGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgdHVwbGUpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBDU19OT19NT1JFX0lURU1TOwotCXJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoKGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLKSA8PSAzKSkgeworCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gYmFzZVtqXTsKKwkJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGJhc2Vbal0gPyAxNiA6IDM7CisJCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIGludCBidDNjX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGJhc2VbNV0gPSB7IDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4LCAweDAgfTsKIAlidDNjX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7Ci0JdHVwbGVfdCB0dXBsZTsKLQl1X3Nob3J0IGJ1ZlsyNTZdOwotCWNpc3BhcnNlX3QgcGFyc2U7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKLQlpbnQgaSwgaiwgdHJ5OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgdHJ5OwogCi0JLyogRmlyc3QgcGFzczogbG9vayBmb3IgYSBjb25maWcgZW50cnkgdGhhdCBsb29rcyBub3JtYWwuICovCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCS8qIFR3byB0cmllczogd2l0aG91dCBJTyBhbGlhc2VzLCB0aGVuIHdpdGggYWxpYXNlcyAqLwotCWZvciAodHJ5ID0gMDsgdHJ5IDwgMjsgdHJ5KyspIHsKLQkJaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQkJd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewotCQkJaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQlpZiAoY2YtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKLQkJCQlsaW5rLT5jb25mLlZwcCA9IGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQkJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIChjZi0+aW8ud2luWzBdLmxlbiA9PSA4KSAmJiAoY2YtPmlvLndpblswXS5iYXNlICE9IDApKSB7Ci0JCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSAodHJ5ID09IDApID8gMTYgOiBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJCQlpZiAoaSA9PSBDU19TVUNDRVNTKQotCQkJCQlnb3RvIGZvdW5kX3BvcnQ7Ci0JCQl9Ci1uZXh0X2VudHJ5OgotCQkJaSA9IG5leHRfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCQl9Ci0JfQorCS8qIEZpcnN0IHBhc3M6IGxvb2sgZm9yIGEgY29uZmlnIGVudHJ5IHRoYXQgbG9va3Mgbm9ybWFsLgorCSAgIFR3byB0cmllczogd2l0aG91dCBJTyBhbGlhc2VzLCB0aGVuIHdpdGggYWxpYXNlcyAqLworCWZvciAodHJ5ID0gMDsgdHJ5IDwgMjsgdHJ5KyspCisJCWlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIGJ0M2NfY2hlY2tfY29uZmlnLCAodm9pZCAqKSB0cnkpKQorCQkJZ290byBmb3VuZF9wb3J0OwogCiAJLyogU2Vjb25kIHBhc3M6IHRyeSB0byBmaW5kIGFuIGVudHJ5IHRoYXQgaXNuJ3QgcGlja3kgYWJvdXQKIAkgICBpdHMgYmFzZSBhZGRyZXNzLCB0aGVuIHRyeSB0byBncmFiIGFueSBzdGFuZGFyZCBzZXJpYWwgcG9ydAogCSAgIGFkZHJlc3MsIGFuZCBmaW5hbGx5IHRyeSB0byBnZXQgYW55IGZyZWUgcG9ydC4gKi8KLQlpID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCXdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKLQkJaWYgKChpID09IENTX1NVQ0NFU1MpICYmIChjZi0+aW8ubndpbiA+IDApICYmICgoY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0spIDw9IDMpKSB7Ci0JCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OwotCQkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgewotCQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGJhc2Vbal07Ci0JCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSBiYXNlW2pdID8gMTYgOiAzOwotCQkJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCQkJCWlmIChpID09IENTX1NVQ0NFU1MpCi0JCQkJCWdvdG8gZm91bmRfcG9ydDsKLQkJCX0KLQkJfQotCQlpID0gbmV4dF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JfQorCWlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIGJ0M2NfY2hlY2tfY29uZmlnX25vdHBpY2t5LCBOVUxMKSkKKwkJZ290byBmb3VuZF9wb3J0OworCisJQlRfRVJSKCJObyB1c2FibGUgcG9ydCByYW5nZSBmb3VuZCIpOworCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgLUVOT0RFVik7CisJZ290byBmYWlsZWQ7CiAKIGZvdW5kX3BvcnQ6Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgewotCQlCVF9FUlIoIk5vIHVzYWJsZSBwb3J0IHJhbmdlIGZvdW5kIik7Ci0JCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgaSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQogCWkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdElSUSwgaSk7CiAJCWxpbmstPmlycS5Bc3NpZ25lZElSUSA9IDA7CiAJfQogCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAoaSAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwppbmRleCA2OGQxZDI1Li44ZTU1NmI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKQEAgLTYwNywxMDIgKzYwNyw3OCBAQAogCWtmcmVlKGluZm8pOwogfQogCi1zdGF0aWMgaW50IGdldF90dXBsZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCitzdGF0aWMgaW50IGJ0dWFydF9jaGVja19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHZjYywKKwkJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCiB7Ci0JaW50IGk7CisJaW50ICp0cnkgPSBwcml2X2RhdGE7CiAKLQlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBpOwotCi0JcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJaWYgKGNmLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9IGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPT0gOCkgJiYKKwkgICAgKGNmLT5pby53aW5bMF0uYmFzZSAhPSAwKSkgeworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAoKnRyeSA9PSAwKSA/IDE2IDoKKwkJCWNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBmaXJzdF90dXBsZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCitzdGF0aWMgaW50IGJ0dWFydF9jaGVja19jb25maWdfbm90cGlja3koc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkJdW5zaWduZWQgaW50IHZjYywKKwkJCQkJdm9pZCAqcHJpdl9kYXRhKQogewotCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBDU19OT19NT1JFX0lURU1TOwotCXJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQorCXN0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZVs1XSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgsIDB4MCB9OworCWludCBqOwogCi1zdGF0aWMgaW50IG5leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQotewotCWlmIChwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7Ci0JcmV0dXJuIGdldF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJaWYgKChjZi0+aW8ubndpbiA+IDApICYmICgoY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0spIDw9IDMpKSB7CisJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKwkJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBiYXNlW2pdOworCQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gYmFzZVtqXSA/IDE2IDogMzsKKwkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50IGJ0dWFydF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBiYXNlWzVdID0geyAweDNmOCwgMHgyZjgsIDB4M2U4LCAweDJlOCwgMHgwIH07CiAJYnR1YXJ0X2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7Ci0JdHVwbGVfdCB0dXBsZTsKLQl1X3Nob3J0IGJ1ZlsyNTZdOwotCWNpc3BhcnNlX3QgcGFyc2U7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKLQlpbnQgaSwgaiwgdHJ5OworCWludCBpOworCWludCB0cnk7CiAKLQkvKiBGaXJzdCBwYXNzOiBsb29rIGZvciBhIGNvbmZpZyBlbnRyeSB0aGF0IGxvb2tzIG5vcm1hbC4gKi8KLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCS8qIFR3byB0cmllczogd2l0aG91dCBJTyBhbGlhc2VzLCB0aGVuIHdpdGggYWxpYXNlcyAqLwotCWZvciAodHJ5ID0gMDsgdHJ5IDwgMjsgdHJ5KyspIHsKLQkJaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQkJd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewotCQkJaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQlpZiAoY2YtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKLQkJCQlsaW5rLT5jb25mLlZwcCA9IGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQkJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIChjZi0+aW8ud2luWzBdLmxlbiA9PSA4KSAmJiAoY2YtPmlvLndpblswXS5iYXNlICE9IDApKSB7Ci0JCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSAodHJ5ID09IDApID8gMTYgOiBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJCQlpZiAoaSA9PSBDU19TVUNDRVNTKQotCQkJCQlnb3RvIGZvdW5kX3BvcnQ7Ci0JCQl9Ci1uZXh0X2VudHJ5OgotCQkJaSA9IG5leHRfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCQl9Ci0JfQorCS8qIEZpcnN0IHBhc3M6IGxvb2sgZm9yIGEgY29uZmlnIGVudHJ5IHRoYXQgbG9va3Mgbm9ybWFsLgorCSAgIFR3byB0cmllczogd2l0aG91dCBJTyBhbGlhc2VzLCB0aGVuIHdpdGggYWxpYXNlcyAqLworCWZvciAodHJ5ID0gMDsgdHJ5IDwgMjsgdHJ5KyspCisJCWlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIGJ0dWFydF9jaGVja19jb25maWcsICZ0cnkpKQorCQkJZ290byBmb3VuZF9wb3J0OwogCiAJLyogU2Vjb25kIHBhc3M6IHRyeSB0byBmaW5kIGFuIGVudHJ5IHRoYXQgaXNuJ3QgcGlja3kgYWJvdXQKIAkgICBpdHMgYmFzZSBhZGRyZXNzLCB0aGVuIHRyeSB0byBncmFiIGFueSBzdGFuZGFyZCBzZXJpYWwgcG9ydAogCSAgIGFkZHJlc3MsIGFuZCBmaW5hbGx5IHRyeSB0byBnZXQgYW55IGZyZWUgcG9ydC4gKi8KLQlpID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCXdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKLQkJaWYgKChpID09IENTX1NVQ0NFU1MpICYmIChjZi0+aW8ubndpbiA+IDApCi0JCSAgICAmJiAoKGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLKSA8PSAzKSkgewotCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBiYXNlW2pdOwotCQkJCWxpbmstPmlvLklPQWRkckxpbmVzID0gYmFzZVtqXSA/IDE2IDogMzsKLQkJCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJCQlpZiAoaSA9PSBDU19TVUNDRVNTKQotCQkJCQlnb3RvIGZvdW5kX3BvcnQ7Ci0JCQl9Ci0JCX0KLQkJaSA9IG5leHRfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCX0KKwlpZiAoIXBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBidHVhcnRfY2hlY2tfY29uZmlnX25vdHBpY2t5LCBOVUxMKSkKKwkJZ290byBmb3VuZF9wb3J0OworCisJQlRfRVJSKCJObyB1c2FibGUgcG9ydCByYW5nZSBmb3VuZCIpOworCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgLUVOT0RFVik7CisJZ290byBmYWlsZWQ7CiAKIGZvdW5kX3BvcnQ6Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgewotCQlCVF9FUlIoIk5vIHVzYWJsZSBwb3J0IHJhbmdlIGZvdW5kIik7Ci0JCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgaSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQogCWkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdElSUSwgaSk7CiAJCWxpbmstPmlycS5Bc3NpZ25lZElSUSA9IDA7CiAJfQogCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAoaSAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggNmEwMTA2OC4uYWY0NzJlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC0xMDIsMTQgKzEwMiwxOSBAQAogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjEwMSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIHwgQlRVU0JfV1JPTkdfU0NPX01UVSB9LAogCiAJLyogQnJvYWRjb20gQkNNMjA0NiAqLworCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjE0NiksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIH0sCiAJeyBVU0JfREVWSUNFKDB4MGE1YywgMHgyMTUxKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUkVTRVQgfSwKIAorCS8qIEFwcGxlIE1hY0Jvb2sgUHJvIHdpdGggQnJvYWRjb20gY2hpcCAqLworCXsgVVNCX0RFVklDRSgweDA1YWMsIDB4ODIwZiksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIH0sCisKIAkvKiBJQk0vTGVub3ZvIFRoaW5rUGFkIHdpdGggQnJvYWRjb20gY2hpcCAqLwogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAxZSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIHwgQlRVU0JfV1JPTkdfU0NPX01UVSB9LAogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjExMCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIHwgQlRVU0JfV1JPTkdfU0NPX01UVSB9LAogCiAJLyogVGFyZ3VzIEFDQjEwVVMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIxMDApLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9SRVNFVCB9LAorCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjE1NCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIH0sCiAKIAkvKiBBTllDT00gQmx1ZXRvb3RoIFVTQi0yMDAgYW5kIFVTQi0yNTAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIxMTEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9SRVNFVCB9LApAQCAtMTQ3LDYgKzE1Miw5IEBACiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDEyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUkVTRVQgfCBCVFVTQl9XUk9OR19TQ09fTVRVIH0sCiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDEzKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUkVTRVQgfCBCVFVTQl9XUk9OR19TQ09fTVRVIH0sCiAKKwkvKiBCZWxraW4gRjhUMDE2IGRldmljZSAqLworCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDE2YSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFU0VUIH0sCisKIAkvKiBEaWdpYW5zd2VyIGRldmljZXMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwOGZkLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9ESUdJQU5TV0VSIH0sCiAJeyBVU0JfREVWSUNFKDB4MDhmZCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfSUdOT1JFIH0sCkBAIC0xNjksNiArMTc3LDcgQEAKIHN0cnVjdCBidHVzYl9kYXRhIHsKIAlzdHJ1Y3QgaGNpX2RldiAgICAgICAqaGRldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAgICAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaXNvYzsKIAogCXNwaW5sb2NrX3QgbG9jazsKQEAgLTI2Nyw3ICsyNzYsNiBAQAogCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKLQkJa2ZyZWUoYnVmKTsKIAl9CiAKIAl1c2JfZnJlZV91cmIodXJiKTsKQEAgLTM1MCw3ICszNTgsNiBAQAogCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKLQkJa2ZyZWUoYnVmKTsKIAl9CiAKIAl1c2JfZnJlZV91cmIodXJiKTsKQEAgLTQ3MSw3ICs0NzgsNiBAQAogCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKLQkJa2ZyZWUoYnVmKTsKIAl9CiAKIAl1c2JfZnJlZV91cmIodXJiKTsKQEAgLTUxNiw3ICs1MjIsNyBAQAogCiAJZXJyID0gYnR1c2Jfc3VibWl0X2ludHJfdXJiKGhkZXYpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWNsZWFyX2JpdChCVFVTQl9JTlRSX1JVTk5JTkcsICZoZGV2LT5mbGFncyk7CisJCWNsZWFyX2JpdChCVFVTQl9JTlRSX1JVTk5JTkcsICZkYXRhLT5mbGFncyk7CiAJCWNsZWFyX2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKTsKIAl9CiAKQEAgLTUzMiw4ICs1MzgsMTAgQEAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfUlVOTklORywgJmhkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKKwljYW5jZWxfd29ya19zeW5jKCZkYXRhLT53b3JrKTsKKwogCWNsZWFyX2JpdChCVFVTQl9JU09DX1JVTk5JTkcsICZkYXRhLT5mbGFncyk7Ci0JdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGF0YS0+aW50cl9hbmNob3IpOworCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJmRhdGEtPmlzb2NfYW5jaG9yKTsKIAogCWNsZWFyX2JpdChCVFVTQl9CVUxLX1JVTk5JTkcsICZkYXRhLT5mbGFncyk7CiAJdXNiX2tpbGxfYW5jaG9yZWRfdXJicygmZGF0YS0+YnVsa19hbmNob3IpOwpAQCAtODIxLDYgKzgyOSw3IEBACiAJfQogCiAJZGF0YS0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJZGF0YS0+aW50ZiA9IGludGY7CiAKIAlzcGluX2xvY2tfaW5pdCgmZGF0YS0+bG9jayk7CiAKQEAgLTg4OSw3ICs4OTgsNyBAQAogCiAJaWYgKGRhdGEtPmlzb2MpIHsKIAkJZXJyID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoJmJ0dXNiX2RyaXZlciwKLQkJCQkJCQlkYXRhLT5pc29jLCBOVUxMKTsKKwkJCQkJCQlkYXRhLT5pc29jLCBkYXRhKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWhjaV9mcmVlX2RldihoZGV2KTsKIAkJCWtmcmVlKGRhdGEpOwpAQCAtOTIxLDEzICs5MzAsMjIgQEAKIAogCWhkZXYgPSBkYXRhLT5oZGV2OwogCi0JaWYgKGRhdGEtPmlzb2MpCi0JCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJmJ0dXNiX2RyaXZlciwgZGF0YS0+aXNvYyk7CisJX19oY2lfZGV2X2hvbGQoaGRldik7CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVzYl9zZXRfaW50ZmRhdGEoZGF0YS0+aW50ZiwgTlVMTCk7CisKKwlpZiAoZGF0YS0+aXNvYykKKwkJdXNiX3NldF9pbnRmZGF0YShkYXRhLT5pc29jLCBOVUxMKTsKIAogCWhjaV91bnJlZ2lzdGVyX2RldihoZGV2KTsKIAorCWlmIChpbnRmID09IGRhdGEtPmlzb2MpCisJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJmJ0dXNiX2RyaXZlciwgZGF0YS0+aW50Zik7CisJZWxzZSBpZiAoZGF0YS0+aXNvYykKKwkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmYnR1c2JfZHJpdmVyLCBkYXRhLT5pc29jKTsKKworCV9faGNpX2Rldl9wdXQoaGRldik7CisKIAloY2lfZnJlZV9kZXYoaGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwppbmRleCBkYWU0NWNkZi4uZTZlNmIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwpAQCAtNTkwLDc1ICs1OTAsNDAgQEAKIAlrZnJlZShpbmZvKTsKIH0KIAotc3RhdGljIGludCBnZXRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQorc3RhdGljIGludCBkdGwxX2NvbmZjaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICB2b2lkICpwcml2X2RhdGEpCiB7Ci0JaW50IGk7Ci0KLQlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBpOwotCi0JcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQotewotCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBDU19OT19NT1JFX0lURU1TOwotCXJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQotCi1zdGF0aWMgaW50IG5leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQotewotCWlmIChwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7Ci0JcmV0dXJuIGdldF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJaWYgKChjZi0+aW8ubndpbiA9PSAxKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPiA4KSkgeworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2YtPmlvLndpblswXS5sZW47CS8qeW8gKi8KKwkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50IGR0bDFfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogCWR0bDFfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKLQl0dXBsZV90IHR1cGxlOwotCXVfc2hvcnQgYnVmWzI1Nl07Ci0JY2lzcGFyc2VfdCBwYXJzZTsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OwogCWludCBpOwogCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCiAJLyogTG9vayBmb3IgYSBnZW5lcmljIGZ1bGwtc2l6ZWQgd2luZG93ICovCiAJbGluay0+aW8uTnVtUG9ydHMxID0gODsKLQlpID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCXdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKLQkJaWYgKChpID09IENTX1NVQ0NFU1MpICYmIChjZi0+aW8ubndpbiA9PSAxKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPiA4KSkgewotCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGNmLT5pby53aW5bMF0ubGVuOwkvKnlvICovCi0JCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JCQlpZiAoaSA9PSBDU19TVUNDRVNTKQotCQkJCWJyZWFrOwotCQl9Ci0JCWkgPSBuZXh0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQl9Ci0KLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7Ci0JCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgaSk7CisJaWYgKCFwY21jaWFfbG9vcF9jb25maWcobGluaywgZHRsMV9jb25mY2hlY2ssIE5VTEwpKQogCQlnb3RvIGZhaWxlZDsKLQl9CiAKIAlpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAoaSAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJUlEsIGkpOwogCQlsaW5rLT5pcnEuQXNzaWduZWRJUlEgPSAwOwogCX0KIAogCWkgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCmluZGV4IDRkMzdiYjMuLjc5MzgwNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwpAQCAtMzUyLDE0ICszNTIsMTQgQEAKIC8qIFJlbW92ZSBhY2snZWQgcGFja2V0cyAqLwogc3RhdGljIHZvaWQgYmNzcF9wa3RfY3VsbChzdHJ1Y3QgYmNzcF9zdHJ1Y3QgKmJjc3ApCiB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGksIHBrdHNfdG9fYmVfcmVtb3ZlZDsKIAl1OCBzZXFubzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiY3NwLT51bmFjay5sb2NrLCBmbGFncyk7CiAKLQlwa3RzX3RvX2JlX3JlbW92ZWQgPSBiY3NwLT51bmFjay5xbGVuOworCXBrdHNfdG9fYmVfcmVtb3ZlZCA9IHNrYl9xdWV1ZV9sZW4oJmJjc3AtPnVuYWNrKTsKIAlzZXFubyA9IGJjc3AtPm1zZ3FfdHhzZXE7CiAKIAl3aGlsZSAocGt0c190b19iZV9yZW1vdmVkKSB7CkBAIC0zNzMsMTkgKzM3MywxOSBAQAogCQlCVF9FUlIoIlBlZXIgYWNrZWQgaW52YWxpZCBwYWNrZXQiKTsKIAogCUJUX0RCRygiUmVtb3ZpbmcgJXUgcGt0cyBvdXQgb2YgJXUsIHVwIHRvIHNlcW5vICV1IiwKLQkJcGt0c190b19iZV9yZW1vdmVkLCBiY3NwLT51bmFjay5xbGVuLCAoc2Vxbm8gLSAxKSAmIDB4MDcpOworCSAgICAgICBwa3RzX3RvX2JlX3JlbW92ZWQsIHNrYl9xdWV1ZV9sZW4oJmJjc3AtPnVuYWNrKSwKKwkgICAgICAgKHNlcW5vIC0gMSkgJiAweDA3KTsKIAotCWZvciAoaSA9IDAsIHNrYiA9ICgoc3RydWN0IHNrX2J1ZmYgKikgJmJjc3AtPnVuYWNrKS0+bmV4dDsgaSA8IHBrdHNfdG9fYmVfcmVtb3ZlZAotCQkJJiYgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAmYmNzcC0+dW5hY2s7IGkrKykgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKwlpID0gMDsKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZiY3NwLT51bmFjaywgc2tiLCB0bXApIHsKKwkJaWYgKGkrKyA+PSBwa3RzX3RvX2JlX3JlbW92ZWQpCisJCQlicmVhazsKIAotCQluc2tiID0gc2tiLT5uZXh0OwogCQlfX3NrYl91bmxpbmsoc2tiLCAmYmNzcC0+dW5hY2spOwogCQlrZnJlZV9za2Ioc2tiKTsKLQkJc2tiID0gbnNrYjsKIAl9CiAKLQlpZiAoYmNzcC0+dW5hY2sucWxlbiA9PSAwKQorCWlmIChza2JfcXVldWVfZW1wdHkoJmJjc3AtPnVuYWNrKSkKIAkJZGVsX3RpbWVyKCZiY3NwLT50YmNzcCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY3NwLT51bmFjay5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCmluZGV4IDhkZmNmNzcuLjQ0MjZiYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCkBAIC00ODQsNyArNDg0LDcgQEAKIAkJcmV0dXJuIC1FVU5BVENIOwogCiAJZGVmYXVsdDoKLQkJZXJyID0gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWVyciA9IG5fdHR5X2lvY3RsX2hlbHBlcih0dHksIGZpbGUsIGNtZCwgYXJnKTsKIAkJYnJlYWs7CiAJfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VzYi5oIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VzYi5oCmluZGV4IDE3OTBjYzguLjhlNjU5OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91c2IuaAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdXNiLmgKQEAgLTcwLDggKzcwLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7Ci0JLyogX3VyYl91bmxpbmsgbmVlZHMgdG8ga25vdyB3aGljaCBzcGlubG9jayB0byB1c2UsIHRodXMgbWIoKS4gKi8KLQlfdXJiLT5xdWV1ZSA9IHE7IG1iKCk7IGxpc3RfYWRkKCZfdXJiLT5saXN0LCAmcS0+aGVhZCk7CisJLyogX3VyYl91bmxpbmsgbmVlZHMgdG8ga25vdyB3aGljaCBzcGlubG9jayB0byB1c2UsIHRodXMgc21wX21iKCkuICovCisJX3VyYi0+cXVldWUgPSBxOyBzbXBfbWIoKTsgbGlzdF9hZGQoJl91cmItPmxpc3QsICZxLT5oZWFkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTc5LDggKzc5LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7Ci0JLyogX3VyYl91bmxpbmsgbmVlZHMgdG8ga25vdyB3aGljaCBzcGlubG9jayB0byB1c2UsIHRodXMgbWIoKS4gKi8KLQlfdXJiLT5xdWV1ZSA9IHE7IG1iKCk7IGxpc3RfYWRkX3RhaWwoJl91cmItPmxpc3QsICZxLT5oZWFkKTsKKwkvKiBfdXJiX3VubGluayBuZWVkcyB0byBrbm93IHdoaWNoIHNwaW5sb2NrIHRvIHVzZSwgdGh1cyBzbXBfbWIoKS4gKi8KKwlfdXJiLT5xdWV1ZSA9IHE7IHNtcF9tYigpOyBsaXN0X2FkZF90YWlsKCZfdXJiLT5saXN0LCAmcS0+aGVhZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC04OSw3ICs4OSw3IEBACiAJc3RydWN0IF91cmJfcXVldWUgKnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW1iKCk7CisJc21wX21iKCk7CiAJcSA9IF91cmItPnF1ZXVlOwogCS8qIElmIHEgaXMgTlVMTCwgaXQgd2lsbCBkaWUgYXQgZWFzeS10by1kZWJ1ZyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuCiAJICAgTm8gbmVlZCB0byBCVUcoKS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwppbmRleCA3NDAzMWRlLi5kNDdmMmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKKysrIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogCiAJCWxlbiA9IG5yICogQ0RfRlJBTUVTSVpFX1JBVzsKIAotCQlyZXQgPSBibGtfcnFfbWFwX3VzZXIocSwgcnEsIHVidWYsIGxlbik7CisJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgTlVMTCwgdWJ1ZiwgbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMKaW5kZXggMTIzMWQ5NS4uZDZiYTc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9nZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vZ2Ryb20uYwpAQCAtNjI0LDE0ICs2MjQsMTQgQEAKIAkJY3RybF9vdXRiKDEsIEdEUk9NX0RNQV9TVEFUVVNfUkVHKTsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmVxdWVzdF9xdWV1ZSwKIAkJCWdkLnRyYW5zZmVyID09IDAsIEdEUk9NX0RFRkFVTFRfVElNRU9VVCk7Ci0JCWVyciA9IGdkLnRyYW5zZmVyOworCQllcnIgPSBnZC50cmFuc2ZlciA/IC1FSU8gOiAwOwogCQlnZC50cmFuc2ZlciA9IDA7CiAJCWdkLnBlbmRpbmcgPSAwOwogCQkvKiBub3cgc2VlayB0byB0YWtlIHRoZSByZXF1ZXN0IHNwaW5sb2NrCiAJCSogYmVmb3JlIGhhbmRsaW5nIGVuZGluZyB0aGUgcmVxdWVzdCAqLwogCQlzcGluX2xvY2soJmdkcm9tX2xvY2spOwogCQlsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlbGlzdCk7Ci0JCWVuZF9kZXF1ZXVlZF9yZXF1ZXN0KHJlcSwgMSAtIGVycik7CisJCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyLCBibGtfcnFfYnl0ZXMocmVxKSk7CiAJfQogCXNwaW5fdW5sb2NrKCZnZHJvbV9sb2NrKTsKIAlrZnJlZShyZWFkX2NvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCBjYWZmODUxLi4xMjIyNTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMzUwLDcgKzM1MCw3IEBACiAKIGNvbmZpZyBTVEFMTElPTgogCXRyaXN0YXRlICJTdGFsbGlvbiBFYXN5SU8gb3IgRUM4LzMyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgKElTQSB8fCBFSVNBIHx8IFBDSSkKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhbiBFYXN5SU8gb3IgRWFzeUNvbm5lY3Rpb24gOC8zMiBtdWx0aXBvcnQgU3RhbGxpb24KIAkgIGNhcmQsIHRoZW4gdGhpcyBpcyBmb3IgeW91OyBzYXkgWS4gIE1ha2Ugc3VyZSB0byByZWFkCkBAIC0zNjEsNyArMzYxLDcgQEAKIAogY29uZmlnIElTVEFMTElPTgogCXRyaXN0YXRlICJTdGFsbGlvbiBFQzgvNjQsIE9OYm9hcmQsIEJydW1ieSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1RBTERSViAmJiBCUk9LRU5fT05fU01QICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCisJZGVwZW5kcyBvbiBTVEFMRFJWICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYW4gRWFzeUNvbm5lY3Rpb24gOC82NCwgT05ib2FyZCwgQnJ1bWJ5IG9yIFN0YWxsaW9uCiAJICBzZXJpYWwgbXVsdGlwb3J0IGNhcmQsIHNheSBZIGhlcmUuIE1ha2Ugc3VyZSB0byByZWFkCkBAIC0xMDQzLDE1ICsxMDQzLDYgQEAKIAkgIG9wZW4gc2VsZWN0cyBvbmUgb2YgdGhlIHRpbWVycyBzdXBwb3J0ZWQgYnkgdGhlIEhQRVQuICBUaGUgdGltZXJzIGFyZQogCSAgbm9uLXBlcmlvZGljIGFuZC9vciBwZXJpb2RpYy4KIAotY29uZmlnIEhQRVRfUlRDX0lSUQotCWJvb2wKLQlkZWZhdWx0IEhQRVRfRU1VTEFURV9SVEMKLQlkZXBlbmRzIG9uIFJUQyAmJiBIUEVUCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGRpc2FibGUgUlRDX0lSUSBpbiBkcml2ZXJzL2NoYXIvcnRjLmMuIEl0Ci0JICBpcyBhc3N1bWVkIHRoZSBwbGF0Zm9ybSBjYWxsZWQgaHBldF9hbGxvYyB3aXRoIHRoZSBSVEMgSVJRIHZhbHVlcyBmb3IKLQkgIHRoZSBIUEVUIHRpbWVycy4KLQogY29uZmlnIEhQRVRfTU1BUAogCWJvb2wgIkFsbG93IG1tYXAgb2YgSFBFVCIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCA2ODUwZjZkLi4xYTQyNDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC03LDcgKzcsNyBAQAogIwogRk9OVE1BUEZJTEUgPSBjcDQzNy51bmkKIAotb2JqLXkJICs9IG1lbS5vIHJhbmRvbS5vIHR0eV9pby5vIG5fdHR5Lm8gdHR5X2lvY3RsLm8gdHR5X2xkaXNjLm8gCitvYmoteQkgKz0gbWVtLm8gcmFuZG9tLm8gdHR5X2lvLm8gbl90dHkubyB0dHlfaW9jdGwubyB0dHlfbGRpc2MubyB0dHlfYnVmZmVyLm8gdHR5X3BvcnQubwogCiBvYmotJChDT05GSUdfTEVHQUNZX1BUWVMpCSs9IHB0eS5vCiBvYmotJChDT05GSUdfVU5JWDk4X1BUWVMpCSs9IHB0eS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAppbmRleCA0YmFkYTBlLi40NmY1MDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKQEAgLTExNiw3ICsxMTYsOSBAQAogCXN0cnVjdCBhZ3BfbWVtb3J5ICooKmFsbG9jX2J5X3R5cGUpIChzaXplX3QsIGludCk7CiAJdm9pZCAoKmZyZWVfYnlfdHlwZSkoc3RydWN0IGFncF9tZW1vcnkgKik7CiAJdm9pZCAqKCphZ3BfYWxsb2NfcGFnZSkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKKwlpbnQgKCphZ3BfYWxsb2NfcGFnZXMpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgc3RydWN0IGFncF9tZW1vcnkgKiwgc2l6ZV90KTsKIAl2b2lkICgqYWdwX2Rlc3Ryb3lfcGFnZSkodm9pZCAqLCBpbnQgZmxhZ3MpOworCXZvaWQgKCphZ3BfZGVzdHJveV9wYWdlcykoc3RydWN0IGFncF9tZW1vcnkgKik7CiAJaW50ICgqYWdwX3R5cGVfdG9fbWFza190eXBlKSAoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqLCBpbnQpOwogCXZvaWQgKCpjaGlwc2V0X2ZsdXNoKShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOwogfTsKQEAgLTI3Nyw3ICsyNzksMTAgQEAKIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlKHNpemVfdCBwYWdlX2NvdW50LCBpbnQgdHlwZSk7CiB2b2lkIGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZShzdHJ1Y3QgYWdwX21lbW9yeSAqY3Vycik7CiB2b2lkICphZ3BfZ2VuZXJpY19hbGxvY19wYWdlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSk7CitpbnQgYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWdwX2JyaWRnZSwKKwkJCSAgICBzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtb3J5LCBzaXplX3QgcGFnZV9jb3VudCk7CiB2b2lkIGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSh2b2lkICphZGRyLCBpbnQgZmxhZ3MpOwordm9pZCBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnkpOwogdm9pZCBhZ3BfZnJlZV9rZXkoaW50IGtleSk7CiBpbnQgYWdwX251bV9lbnRyaWVzKHZvaWQpOwogdTMyIGFncF9jb2xsZWN0X2RldmljZV9zdGF0dXMoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLCB1MzIgbW9kZSwgdTMyIGNvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMKaW5kZXggNWRhODlmNi4uNWVhNGRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCkBAIC0xNDMsNyArMTQzLDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kLWs3LWFncC5jCmluZGV4IGUyODA1MzEuLjNmOTgyNTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwpAQCAtMjIzLDEyICsyMjMsMTQgQEAKIAogCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9MVkwyKGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSk7CiAKLQkvKiBHZXQgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX01NQkFTRSwgJnRlbXApOwotCXRlbXAgPSAodGVtcCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOwotCWFtZF9pcm9uZ2F0ZV9wcml2YXRlLnJlZ2lzdGVycyA9ICh2b2xhdGlsZSB1OCBfX2lvbWVtICopIGlvcmVtYXAodGVtcCwgNDA5Nik7Ci0JaWYgKCFhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzKSB7CisJCS8qIEdldCB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFncF9icmlkZ2UtPmRldiwgQU1EX01NQkFTRSwgJnRlbXApOworCQl0ZW1wID0gKHRlbXAgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKTsKKwkJYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzID0gKHZvbGF0aWxlIHU4IF9faW9tZW0gKikgaW9yZW1hcCh0ZW1wLCA0MDk2KTsKKwkJaWYgKCFhbWRfaXJvbmdhdGVfcHJpdmF0ZS5yZWdpc3RlcnMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAkvKiBXcml0ZSBvdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdhdHQgdGFibGUgKi8KIAl3cml0ZWwoYWdwX2JyaWRnZS0+Z2F0dF9idXNfYWRkciwgYW1kX2lyb25nYXRlX3ByaXZhdGUucmVnaXN0ZXJzK0FNRF9BVFRCQVNFKTsKQEAgLTM4Niw3ICszODgsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcwk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcwk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKQEAgLTQ5MCw2ICs0OTQsMjYgQEAKIAlhZ3BfcHV0X2JyaWRnZShicmlkZ2UpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWdwX2FtZGs3X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFncF9hbWRrN19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJcmV0dXJuIGFtZF9pcm9uZ2F0ZV9kcml2ZXIuY29uZmlndXJlKCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwogLyogbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyBuYW1lIHRhYmxlIGFib3ZlICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdwX2FtZGs3X3BjaV90YWJsZVtdID0gewogCXsKQEAgLTUyNiw2ICs1NTAsMTAgQEAKIAkuaWRfdGFibGUJPSBhZ3BfYW1kazdfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBhZ3BfYW1kazdfcHJvYmUsCiAJLnJlbW92ZQkJPSBhZ3BfYW1kazdfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gYWdwX2FtZGs3X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZ3BfYW1kazdfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhZ3BfYW1kazdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKaW5kZXggNzQ5NWM1Mi4uMjgxMmVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCkBAIC0yMjQsNyArMjI0LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2F0aS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCmluZGV4IDZlY2JjYWYuLmFlMjc5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC00MTgsNyArNDE4LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYwppbmRleCA4Y2E2ZjI2Li40NTM1NDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKQEAgLTMzNSw3ICszMzUsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcwk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcwk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKaW5kZXggMTE4ZGJkZS4uMTBkNmNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKQEAgLTIwMSwxNCArMjAxLDIyIEBACiAJCXJldHVybjsKIAl9CiAJaWYgKGN1cnItPnBhZ2VfY291bnQgIT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY3Vyci0+cGFnZV9jb3VudDsgaSsrKSB7Ci0JCQljdXJyLT5tZW1vcnlbaV0gPSAodW5zaWduZWQgbG9uZylnYXJ0X3RvX3ZpcnQoY3Vyci0+bWVtb3J5W2ldKTsKLQkJCWN1cnItPmJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlKCh2b2lkICopY3Vyci0+bWVtb3J5W2ldLAotCQkJCQkJCSAgICAgICBBR1BfUEFHRV9ERVNUUk9ZX1VOTUFQKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgY3Vyci0+cGFnZV9jb3VudDsgaSsrKSB7Ci0JCQljdXJyLT5icmlkZ2UtPmRyaXZlci0+YWdwX2Rlc3Ryb3lfcGFnZSgodm9pZCAqKWN1cnItPm1lbW9yeVtpXSwKLQkJCQkJCQkgICAgICAgQUdQX1BBR0VfREVTVFJPWV9GUkVFKTsKKwkJaWYgKGN1cnItPmJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlcykgeworCQkJY3Vyci0+YnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2VzKGN1cnIpOworCQl9IGVsc2UgeworCisJCQlmb3IgKGkgPSAwOyBpIDwgY3Vyci0+cGFnZV9jb3VudDsgaSsrKSB7CisJCQkJY3Vyci0+bWVtb3J5W2ldID0gKHVuc2lnbmVkIGxvbmcpZ2FydF90b192aXJ0KAorCQkJCQljdXJyLT5tZW1vcnlbaV0pOworCQkJCWN1cnItPmJyaWRnZS0+ZHJpdmVyLT5hZ3BfZGVzdHJveV9wYWdlKAorCQkJCQkodm9pZCAqKWN1cnItPm1lbW9yeVtpXSwKKwkJCQkJQUdQX1BBR0VfREVTVFJPWV9VTk1BUCk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgY3Vyci0+cGFnZV9jb3VudDsgaSsrKSB7CisJCQkJY3Vyci0+YnJpZGdlLT5kcml2ZXItPmFncF9kZXN0cm95X3BhZ2UoCisJCQkJCSh2b2lkICopY3Vyci0+bWVtb3J5W2ldLAorCQkJCQlBR1BfUEFHRV9ERVNUUk9ZX0ZSRUUpOworCQkJfQogCQl9CiAJfQogCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOwpAQCAtMjY0LDYgKzI3MiwxNSBAQAogCWlmIChuZXcgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlpZiAoYnJpZGdlLT5kcml2ZXItPmFncF9hbGxvY19wYWdlcykgeworCQlpZiAoYnJpZGdlLT5kcml2ZXItPmFncF9hbGxvY19wYWdlcyhicmlkZ2UsIG5ldywgcGFnZV9jb3VudCkpIHsKKwkJCWFncF9mcmVlX21lbW9yeShuZXcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbmV3LT5icmlkZ2UgPSBicmlkZ2U7CisJCXJldHVybiBuZXc7CisJfQorCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewogCQl2b2lkICphZGRyID0gYnJpZGdlLT5kcml2ZXItPmFncF9hbGxvY19wYWdlKGJyaWRnZSk7CiAKQEAgLTEyMDMsNiArMTIyMCwzOSBAQAogICogYWdhaW5zdCBhIG1heGltdW0gdmFsdWUuCiAgKi8KIAoraW50IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgc2l6ZV90IG51bV9wYWdlcykKK3sKKwlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CisJaW50IGksIHJldCA9IC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEzMik7CisJCS8qIGFncF9mcmVlX21lbW9yeSgpIG5lZWRzIGdhcnQgYWRkcmVzcyAqLworCQlpZiAocGFnZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisKKyNpZm5kZWYgQ09ORklHX1g4NgorCQltYXBfcGFnZV9pbnRvX2FncChwYWdlKTsKKyNlbmRpZgorCQlnZXRfcGFnZShwYWdlKTsKKwkJYXRvbWljX2luYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKworCQkvKiBzZXRfbWVtb3J5X2FycmF5X3VjKCkgbmVlZHMgdmlydHVhbCBhZGRyZXNzICovCisJCW1lbS0+bWVtb3J5W2ldID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOworCQltZW0tPnBhZ2VfY291bnQrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2CisJc2V0X21lbW9yeV9hcnJheV91YyhtZW0tPm1lbW9yeSwgbnVtX3BhZ2VzKTsKKyNlbmRpZgorCXJldCA9IDA7CitvdXQ6CisJZm9yIChpID0gMDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrKQorCQltZW0tPm1lbW9yeVtpXSA9IHZpcnRfdG9fZ2FydCgodm9pZCAqKW1lbS0+bWVtb3J5W2ldKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcyk7CisKIHZvaWQgKmFncF9nZW5lcmljX2FsbG9jX3BhZ2Uoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQogewogCXN0cnVjdCBwYWdlICogcGFnZTsKQEAgLTEyMTksNiArMTI2OSwzNyBAQAogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19hbGxvY19wYWdlKTsKIAordm9pZCBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJaW50IGk7CisJdm9pZCAqYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspCisJCW1lbS0+bWVtb3J5W2ldID0gKHVuc2lnbmVkIGxvbmcpZ2FydF90b192aXJ0KG1lbS0+bWVtb3J5W2ldKTsKKworI2lmZGVmIENPTkZJR19YODYKKwlzZXRfbWVtb3J5X2FycmF5X3diKG1lbS0+bWVtb3J5LCBtZW0tPnBhZ2VfY291bnQpOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJYWRkciA9ICh2b2lkICopbWVtLT5tZW1vcnlbaV07CisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisKKyNpZm5kZWYgQ09ORklHX1g4NgorCQl1bm1hcF9wYWdlX2Zyb21fYWdwKHBhZ2UpOworI2VuZGlmCisKKwkJcHV0X3BhZ2UocGFnZSk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsKKwkJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKKwkJbWVtLT5tZW1vcnlbaV0gPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcyk7CiAKIHZvaWQgYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlKHZvaWQgKmFkZHIsIGludCBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCmluZGV4IDgwZDczMTcuLjE4M2FjM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYwpAQCAtNDM1LDcgKzQzNSw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IHRydWUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pNDYwLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pNDYwLWFncC5jCmluZGV4IGU1ODdlZWIuLjEwZGE2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKQEAgLTU3NSw3ICs1NzUsOSBAQAogCS5pbnNlcnRfbWVtb3J5CQk9IGk0NjBfaW5zZXJ0X21lbW9yeV9zbWFsbF9pb19wYWdlLAogCS5yZW1vdmVfbWVtb3J5CQk9IGk0NjBfcmVtb3ZlX21lbW9yeV9zbWFsbF9pb19wYWdlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogI2VuZGlmCiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IDAxNmZkZjAuLjExMDg2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtNTQsOCArNTQsNyBAQAogCQkgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NVFfSEIgfHwgXAogCQkgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSEIgfHwgXAogCQkgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNX0hCIHx8IFwKLQkJIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTUVfSEIgfHwgXAotCQkgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCKQorCQkgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNRV9IQikKIAogI2RlZmluZSBJU19HMzMgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSEIgfHwgXApAQCAtNjMsNyArNjIsOCBAQAogCiAjZGVmaW5lIElTX0c0WCAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JR0RfRV9IQiB8fCBcCiAJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfUTQ1X0hCIHx8IFwKLQkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSEIpCisJCWFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRzQ1X0hCIHx8IFwKKwkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0hCKQogCiBleHRlcm4gaW50IGFncF9tZW1vcnlfcmVzZXJ2ZWQ7CiAKQEAgLTIxNCw4ICsyMTQsOCBAQAogCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgewogCQlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zaXplLT5udW1fZW50cmllczsgaSsrKSB7CiAJCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsKLQkJCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwkvKiBQQ0kgcG9zdGluZy4gKi8KIAkJfQorCQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoaS0xKSo0KSk7CS8qIFBDSSBwb3N0aW5nLiAqLwogCX0KIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsKIAlyZXR1cm4gMDsKQEAgLTUyNSw4ICs1MjUsMTAgQEAKIAkJc2l6ZSArPSA0OwogCX0gZWxzZSBpZiAoSVNfRzRYKSB7CiAJCS8qIE9uIDQgc2VyaWVzIGhhcmR3YXJlLCBHVFQgc3RvbGVuIGlzIHNlcGFyYXRlIGZyb20gZ3JhcGhpY3MKLQkJICogc3RvbGVuLCBpZ25vcmUgaXQgaW4gc3RvbGVuIGd0dCBlbnRyaWVzIGNvdW50aW5nICovCi0JCXNpemUgPSAwOworCQkgKiBzdG9sZW4sIGlnbm9yZSBpdCBpbiBzdG9sZW4gZ3R0IGVudHJpZXMgY291bnRpbmcuICBIb3dldmVyLAorCQkgKiA0S0Igb2YgdGhlIHN0b2xlbiBtZW1vcnkgZG9lc24ndCBnZXQgbWFwcGVkIHRvIHRoZSBHVFQuCisJCSAqLworCQlzaXplID0gNDsKIAl9IGVsc2UgewogCQkvKiBPbiBwcmV2aW91cyBoYXJkd2FyZSwgdGhlIEdUVCBzaXplIHdhcyBqdXN0IHdoYXQgd2FzCiAJCSAqIHJlcXVpcmVkIHRvIG1hcCB0aGUgYXBlcnR1cmUuCkBAIC03NzMsOCArNzc1LDggQEAKIAlpZiAoYWdwX2JyaWRnZS0+ZHJpdmVyLT5uZWVkc19zY3JhdGNoX3BhZ2UpIHsKIAkJZm9yIChpID0gaW50ZWxfcHJpdmF0ZS5ndHRfZW50cmllczsgaSA8IGN1cnJlbnRfc2l6ZS0+bnVtX2VudHJpZXM7IGkrKykgewogCQkJd3JpdGVsKGFncF9icmlkZ2UtPnNjcmF0Y2hfcGFnZSwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7Ci0JCQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsJLyogUENJIFBvc3RpbmcuICovCiAJCX0KKwkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAl9CiAKIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsKQEAgLTk4OSw4ICs5OTEsOCBAQAogCWlmIChhZ3BfYnJpZGdlLT5kcml2ZXItPm5lZWRzX3NjcmF0Y2hfcGFnZSkgewogCQlmb3IgKGkgPSBpbnRlbF9wcml2YXRlLmd0dF9lbnRyaWVzOyBpIDwgY3VycmVudF9zaXplLT5udW1fZW50cmllczsgaSsrKSB7CiAJCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9wcml2YXRlLmd0dCtpKTsKLQkJCXJlYWRsKGludGVsX3ByaXZhdGUuZ3R0K2kpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAkJfQorCQlyZWFkbChpbnRlbF9wcml2YXRlLmd0dCtpLTEpOwkvKiBQQ0kgUG9zdGluZy4gKi8KIAl9CiAKIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsKQEAgLTE3MTEsNyArMTcxMyw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIApAQCAtMTczNiw3ICsxNzQwLDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIApAQCAtMTc2MCw3ICsxNzY2LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMgICAgICAgID0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUJPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKQEAgLTE3ODUsNyArMTc5Myw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gaW50ZWxfaTgzMF9hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogCS5jaGlwc2V0X2ZsdXNoCQk9IGludGVsX2k4MzBfY2hpcHNldF9mbHVzaCwKIH07CkBAIC0xODEwLDcgKzE4MjAsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKQEAgLTE4MzQsNyArMTg0Niw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIApAQCAtMTg1OCw3ICsxODcyLDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMgICAgICAgID0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCkBAIC0xODgyLDcgKzE4OTgsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2hpcHNldF9mbHVzaAkJPSBpbnRlbF9pODMwX2NoaXBzZXRfZmx1c2gsCiB9OwpAQCAtMTkwNyw3ICsxOTI1LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMgICAgICAgID0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCkBAIC0xOTMxLDcgKzE5NTEsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKQEAgLTE5NTYsNyArMTk3OCw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gaW50ZWxfaTgzMF9hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogCS5jaGlwc2V0X2ZsdXNoCQk9IGludGVsX2k5MTVfY2hpcHNldF9mbHVzaCwKIH07CkBAIC0xOTgyLDcgKzIwMDYsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGludGVsX2k4MzBfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMgICAgICAgID0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUJPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogCS5jaGlwc2V0X2ZsdXNoCQk9IGludGVsX2k5MTVfY2hpcHNldF9mbHVzaCwKIH07CkBAIC0yMDA3LDcgKzIwMzMsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKQEAgLTIwMzIsNyArMjA2MCw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gaW50ZWxfaTgzMF9hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZQk9IGludGVsX2k4MzBfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNoaXBzZXRfZmx1c2gJCT0gaW50ZWxfaTkxNV9jaGlwc2V0X2ZsdXNoLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9udmlkaWEtYWdwLmMKaW5kZXggZWFjZWI2MS4uNWJiZWQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9udmlkaWEtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9udmlkaWEtYWdwLmMKQEAgLTIwMSwxMCArMjAxLDE1IEBACiBzdGF0aWMgaW50IG52aWRpYV9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKIHsKIAlpbnQgaSwgajsKKwlpbnQgbWFza190eXBlOwogCi0JaWYgKCh0eXBlICE9IDApIHx8IChtZW0tPnR5cGUgIT0gMCkpCisJbWFza190eXBlID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUobWVtLT5icmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCB8fCB0eXBlICE9IG1lbS0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCisJCXJldHVybiAwOworCiAJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPgogCQkobnZpZGlhX3ByaXZhdGUubnVtX2FjdGl2ZV9lbnRyaWVzIC0gYWdwX21lbW9yeV9yZXNlcnZlZC9QQUdFX1NJWkUpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyMCwxMCArMjI1LDEzIEBACiAJfQogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAorCQkJbWVtLT5tZW1vcnlbaV0sIG1hc2tfdHlwZSksCiAJCQlhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK252aWRpYV9wcml2YXRlLnBnX29mZnNldCtqKTsKLQkJcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStudmlkaWFfcHJpdmF0ZS5wZ19vZmZzZXQraik7CS8qIFBDSSBQb3N0aW5nLiAqLwogCX0KKworCS8qIFBDSSBQb3N0aW5nLiAqLworCXJlYWRsKGFncF9icmlkZ2UtPmdhdHRfdGFibGUrbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0K2ogLSAxKTsKKwogCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzMsOSArMjQxLDE1IEBACiB7CiAJaW50IGk7CiAKLQlpZiAoKHR5cGUgIT0gMCkgfHwgKG1lbS0+dHlwZSAhPSAwKSkKKwlpbnQgbWFza190eXBlOworCisJbWFza190eXBlID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUobWVtLT5icmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCB8fCB0eXBlICE9IG1lbS0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCisJCXJldHVybiAwOworCiAJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspCiAJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGFncF9icmlkZ2UtPmdhdHRfdGFibGUrbnZpZGlhX3ByaXZhdGUucGdfb2Zmc2V0K2kpOwogCkBAIC0zMTIsNyArMzI2LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3BhcmlzYy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCmluZGV4IDhjNDJkY2MuLmYyNDkyZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jCkBAIC0yMjQsNyArMjI0LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gdHJ1ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jCmluZGV4IDI1ODdlZjkuLjZjMzgzN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc2lzLWFncC5jCkBAIC0xNDAsNyArMTQwLDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCmluZGV4IDJmYjI3ZmUuLjYyMjRkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCkBAIC00MzcsNyArNDM3LDkgQEAKIAkuYWxsb2NfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlLAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAorCS5hZ3BfYWxsb2NfcGFnZXMJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX2Rlc3Ryb3lfcGFnZXMJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2VzLAogCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYwppbmRleCBlZWY3MjcwLi4wZjAwNGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKQEAgLTUwOSw3ICs1MDksOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcwk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcwk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSB0cnVlLAogfTsKQEAgLTUzNCw3ICs1MzYsOSBAQAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCisJLmFncF9hbGxvY19wYWdlcwk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfZGVzdHJveV9wYWdlcwk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCiAJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSB0cnVlLAogCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSB0cnVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3ZpYS1hZ3AuYwppbmRleCA3YjM2NDc2Li45ZjRkNDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3ZpYS1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3ZpYS1hZ3AuYwpAQCAtMTkwLDcgKzE5MCw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIApAQCAtMjE0LDcgKzIxNiw5IEBACiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKKwkuYWdwX2FsbG9jX3BhZ2VzCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZXMsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF9kZXN0cm95X3BhZ2VzCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKIAkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCmluZGV4IDZlNzYzZTMuLjk4ODIxZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKQEAgLTgzNyw5ICs4MzcsNiBAQAogCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghdHR5KQotCQlyZXR1cm4gMDsKLQogCWluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19wdXRfY2hhciIpKQpAQCAtODkyLDkgKzg4OSw2IEBACiAJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCF0dHkpCi0JCXJldHVybiAwOwotCiAJaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dyaXRlIikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYXBwbGljb20uYyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCmluZGV4IDMxZDA4YjYuLjA1Njc0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCkBAIC00NzgsNyArNDc4LDcgQEAKIAkJc3RydWN0IHN0X3JhbV9pbyAqc3RfbG9jLCBzdHJ1Y3QgbWFpbGJveCAqbWFpbGJveCkKIHsKIAl2b2lkIF9faW9tZW0gKmZyb20gPSBhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBSQU1fVE9fUEM7Ci0JdW5zaWduZWQgY2hhciAqdG8gPSAodW5zaWduZWQgY2hhciAqKSZtYWlsYm94OworCXVuc2lnbmVkIGNoYXIgKnRvID0gKHVuc2lnbmVkIGNoYXIgKiltYWlsYm94OwogI2lmZGVmIERFQlVHCiAJaW50IGM7CiAjZW5kaWYKQEAgLTcxMiw4ICs3MTIsNyBAQAogCQogCUluZGV4Q2FyZCA9IGFkZ2wtPm51bV9jYXJkLTE7CiAJIAotCWlmKGNtZCAhPSAwICYmIGNtZCAhPSA2ICYmCi0JICAgKChJbmRleENhcmQgPj0gTUFYX0JPQVJEKSB8fCAhYXBic1tJbmRleENhcmRdLlJhbUlPKSkgeworCWlmKGNtZCAhPSA2ICYmICgoSW5kZXhDYXJkID49IE1BWF9CT0FSRCkgfHwgIWFwYnNbSW5kZXhDYXJkXS5SYW1JTykpIHsKIAkJc3RhdGljIGludCB3YXJuY291bnQgPSAxMDsKIAkJaWYgKHdhcm5jb3VudCkgewogCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIkFQUExJQ09NIGRyaXZlciBJT0NUTCwgYmFkIGJvYXJkIG51bWJlciAlZFxuIiwoaW50KUluZGV4Q2FyZCsxKTsKQEAgLTgzMiw4ICs4MzEsNyBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gIkFQUExJQ09NIGRyaXZlciBpb2N0bCwgdW5rbm93biBmdW5jdGlvbiBjb2RlICVkXG4iLGNtZCkgOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRU5PVFRZOwogCQlicmVhazsKIAl9CiAJRHVtbXkgPSByZWFkYihhcGJzW0luZGV4Q2FyZF0uUmFtSU8gKyBWRVJTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ic3IuYyBiL2RyaXZlcnMvY2hhci9ic3IuYwppbmRleCBiNjUwYjRlLi40NTZmNTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYnNyLmMKKysrIGIvZHJpdmVycy9jaGFyL2Jzci5jCkBAIC0yMjksOSArMjI5LDggQEAKIAkJaWYgKHJlc3VsdCkKIAkJCWdvdG8gb3V0X2VycjsKIAotCQljdXItPmJzcl9kZXZpY2UgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoYnNyX2NsYXNzLCBOVUxMLAotCQkJCQkJCWN1ci0+YnNyX2RldiwKLQkJCQkJCQljdXIsIGN1ci0+YnNyX25hbWUpOworCQljdXItPmJzcl9kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGJzcl9jbGFzcywgTlVMTCwgY3VyLT5ic3JfZGV2LAorCQkJCQkJY3VyLCBjdXItPmJzcl9uYW1lKTsKIAkJaWYgKCFjdXItPmJzcl9kZXZpY2UpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZGV2aWNlX2NyZWF0ZSBmYWlsZWQgZm9yICVzXG4iLAogCQkJICAgICAgIGN1ci0+YnNyX25hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwppbmRleCBmZTZkNzc0Li41ZTViMWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYworKysgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwpAQCAtNDk5MywxMiArNDk5MywxNCBAQAogCQkJZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGkpIHsKIAkJY2FyZF9uYW1lID0gIkN5Y2xvbS1ZIjsKIAotCQlhZGRyMCA9IHBjaV9pb21hcChwZGV2LCAwLCBDeVBDSV9ZY3RsKTsKKwkJYWRkcjAgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJCUN5UENJX1ljdGwpOwogCQlpZiAoYWRkcjAgPT0gTlVMTCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVtYXAgY3RsIHJlZ2lvblxuIik7CiAJCQlnb3RvIGVycl9yZWc7CiAJCX0KLQkJYWRkcjIgPSBwY2lfaW9tYXAocGRldiwgMiwgQ3lQQ0lfWXdpbik7CisJCWFkZHIyID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKKwkJCQlDeVBDSV9Zd2luKTsKIAkJaWYgKGFkZHIyID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlbWFwIGJhc2UgcmVnaW9uXG4iKTsKIAkJCWdvdG8gZXJyX3VubWFwOwpAQCAtNTAxMyw3ICs1MDE1LDggQEAKIAl9IGVsc2UgaWYgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0hpKSB7CiAJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqY3RsX2FkZHI7CiAKLQkJY3RsX2FkZHIgPSBhZGRyMCA9IHBjaV9pb21hcChwZGV2LCAwLCBDeVBDSV9aY3RsKTsKKwkJY3RsX2FkZHIgPSBhZGRyMCA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJCQkJQ3lQQ0lfWmN0bCk7CiAJCWlmIChhZGRyMCA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZW1hcCBjdGwgcmVnaW9uXG4iKTsKIAkJCWdvdG8gZXJyX3JlZzsKQEAgLTUwMjYsOCArNTAyOSw4IEBACiAKIAkJbWFpbGJveCA9ICh1MzIpcmVhZGwoJmN0bF9hZGRyLT5tYWlsX2JveF8wKTsKIAotCQlhZGRyMiA9IHBjaV9pb21hcChwZGV2LCAyLCBtYWlsYm94ID09IFpFX1YxID8KLQkJCQlDeVBDSV9aZV93aW4gOiBDeVBDSV9ad2luKTsKKwkJYWRkcjIgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAorCQkJCW1haWxib3ggPT0gWkVfVjEgPyBDeVBDSV9aZV93aW4gOiBDeVBDSV9ad2luKTsKIAkJaWYgKGFkZHIyID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlbWFwIGJhc2UgcmVnaW9uXG4iKTsKIAkJCWdvdG8gZXJyX3VubWFwOwpAQCAtNTE1OSw5ICs1MTYyLDkgQEAKIAljeV9jYXJkW2NhcmRfbm9dLmJhc2VfYWRkciA9IE5VTEw7CiAJZnJlZV9pcnEoaXJxLCAmY3lfY2FyZFtjYXJkX25vXSk7CiBlcnJfdW5tYXA6Ci0JcGNpX2lvdW5tYXAocGRldiwgYWRkcjApOworCWlvdW5tYXAoYWRkcjApOwogCWlmIChhZGRyMikKLQkJcGNpX2lvdW5tYXAocGRldiwgYWRkcjIpOworCQlpb3VubWFwKGFkZHIyKTsKIGVycl9yZWc6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIGVycl9kaXM6CkBAIC01MTg2LDkgKzUxODksOSBAQAogCQljeV93cml0ZXcoY2luZm8tPmN0bF9hZGRyICsgMHg2OCwKIAkJCQlyZWFkdyhjaW5mby0+Y3RsX2FkZHIgKyAweDY4KSAmIH4weDA5MDApOwogCi0JcGNpX2lvdW5tYXAocGRldiwgY2luZm8tPmJhc2VfYWRkcik7CisJaW91bm1hcChjaW5mby0+YmFzZV9hZGRyKTsKIAlpZiAoY2luZm8tPmN0bF9hZGRyKQotCQlwY2lfaW91bm1hcChwZGV2LCBjaW5mby0+Y3RsX2FkZHIpOworCQlpb3VubWFwKGNpbmZvLT5jdGxfYWRkcik7CiAJaWYgKGNpbmZvLT5pcnEKICNpZm5kZWYgQ09ORklHX0NZWl9JTlRSCiAJCSYmICFJU19DWUNfWigqY2luZm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxMjg2LmMgYi9kcml2ZXJzL2NoYXIvZHMxMjg2LmMKaW5kZXggZmI1ODQ5MzguLjUzMjlkNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kczEyODYuYworKysgYi9kcml2ZXJzL2NoYXIvZHMxMjg2LmMKQEAgLTQ0Myw3ICs0NDMsNiBAQAogewogCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOwogCiAJLyoKIAkgKiByZWFkIFJUQyBvbmNlIGFueSB1cGRhdGUgaW4gcHJvZ3Jlc3MgaXMgZG9uZS4gVGhlIHVwZGF0ZQpAQCAtNDU2LDggKzQ1NSw3IEBACiAJICovCiAKIAlpZiAoZHMxMjg2X2lzX3VwZGF0aW5nKCkgIT0gMCkKLQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHVpcF93YXRjaGRvZyArIDIqSFovMTAwKSkKLQkJCWJhcnJpZXIoKTsKKwkJbXNsZWVwKDIwKTsKIAogCS8qCiAJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gV2UgbGVhdmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kc3A1NmsuYyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwppbmRleCBjYTdjNzJhLi44NTgzMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RzcDU2ay5jCkBAIC01MDgsOCArNTA4LDggQEAKIAkJZXJyID0gUFRSX0VSUihkc3A1NmtfY2xhc3MpOwogCQlnb3RvIG91dF9jaHJkZXY7CiAJfQotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShkc3A1NmtfY2xhc3MsIE5VTEwsIE1LREVWKERTUDU2S19NQUpPUiwgMCksCi0JCQkgICAgICBOVUxMLCAiZHNwNTZrIik7CisJZGV2aWNlX2NyZWF0ZShkc3A1NmtfY2xhc3MsIE5VTEwsIE1LREVWKERTUDU2S19NQUpPUiwgMCksIE5VTEwsCisJCSAgICAgICJkc3A1NmsiKTsKIAogCXByaW50ayhiYW5uZXIpOwogCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuYyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKaW5kZXggNDU2ZTRlZC4uNDk5OGIyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuYworKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC0xMzc2LDYgKzEzNzYsNyBAQAogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1MTYgdHNlZywgcnNlZzsKIAorCQl0dHlfcG9ydF9pbml0KCZjaC0+cG9ydCk7CiAJCWNoLT5icmRjaGFuID0gYmM7CiAJCWNoLT5tYWlsYm94ID0gZ2Q7CiAJCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fc29mdGludCk7CkBAIC0xNTEwLDEwICsxNTExLDYgQEAKIAkJY2gtPmZlcHN0b3BjYSA9IDA7CiAKIAkJY2gtPmNsb3NlX2RlbGF5ID0gNTA7Ci0JCWNoLT5wb3J0LmNvdW50ID0gMDsKLQkJY2gtPnBvcnQuYmxvY2tlZF9vcGVuID0gMDsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPnBvcnQub3Blbl93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPnBvcnQuY2xvc2Vfd2FpdCk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXBjYV9sb2NrLCBmbGFncyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwppbmRleCAxOWQzYWZiLi5jNjA5MGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtNTQsOCArNTQsNiBAQAogCiAJZnVuY19lbnRlciAoKTsgCiAKLQlpZiAoIXR0eSkgcmV0dXJuIDA7Ci0KIAlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydCkgcmV0dXJuIDA7CkBAIC05Nyw4ICs5NSw2IEBACiAKIAlmdW5jX2VudGVyICgpOwogCi0JaWYgKCF0dHkpIHJldHVybiAwOwotCiAJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIXBvcnQpIHJldHVybiAwOwpAQCAtMTg1LDcgKzE4MSw2IEBACiAJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CiAJZnVuY19lbnRlciAoKTsKIAotCWlmICghdHR5KSByZXR1cm4gMDsKIAlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydC0+cmQpIHJldHVybiAwOwpAQCAtMjc0LDggKzI2OSw2IEBACiAKIAlmdW5jX2VudGVyICgpOwogCi0JaWYgKCF0dHkpIHJldHVybjsKLQogCXBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaWYgKCFwb3J0KSByZXR1cm47CkBAIC0yOTYsOCArMjg5LDYgQEAKIAogCWZ1bmNfZW50ZXIgKCk7CiAKLQlpZiAoIXR0eSkgcmV0dXJuOwotCiAJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIXBvcnQpIHJldHVybjsKQEAgLTMyMSw4ICszMTIsNiBAQAogCiAJZnVuY19lbnRlciAoKTsKIAotCWlmICghdHR5KSByZXR1cm47Ci0KIAlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydCkgcmV0dXJuOwpAQCAtMzQxLDggKzMzMCw2IEBACiB7CiAJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CiAKLQlpZiAoIXR0eSkgcmV0dXJuOwotCiAJcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIXBvcnQpIHJldHVybjsKQEAgLTM5Myw4ICszODAsNiBAQAogCiAJZnVuY19lbnRlciAoKTsKIAotCWlmICghdHR5KSByZXR1cm47Ci0KIAlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKIAlpZiAoIXR0eSkgCkBAIC00MjYsOCArNDExLDYgQEAKIAogCXR0eSA9IHBvcnQtPnBvcnQudHR5OwogCi0JaWYgKCF0dHkpIHJldHVybiAwOwotCiAJZ3NfZHByaW50ayAoR1NfREVCVUdfQlRSLCAiRW50ZXJpbmcgZ3NfYmxvY2tfdGlsbF9yZWFkeS5cbiIpOyAKIAkvKgogCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKQEAgLTUyMyw4ICs1MDYsNiBAQAogCQogCWZ1bmNfZW50ZXIgKCk7CiAKLQlpZiAoIXR0eSkgcmV0dXJuOwotCiAJcG9ydCA9IChzdHJ1Y3QgZ3NfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaWYgKCFwb3J0KSByZXR1cm47CkBAIC02MjEsOCArNjAyLDYgQEAKIAogCWZ1bmNfZW50ZXIoKTsKIAotCWlmICghdHR5KSByZXR1cm47Ci0KIAlwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCWlmICghcG9ydCkgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggYjNmNWRiYy4uZjNjZmI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC01Myw2ICs1MywxMSBAQAogCiAjZGVmaW5lIEhQRVRfUkFOR0VfU0laRQkJMTAyNAkvKiBmcm9tIEhQRVQgc3BlYyAqLwogCisKKy8qIFdBUk5JTkcgLS0gZG9uJ3QgZ2V0IGNvbmZ1c2VkLiAgVGhlc2UgbWFjcm9zIGFyZSBuZXZlciB1c2VkCisgKiB0byB3cml0ZSB0aGUgKHNpbmdsZSkgY291bnRlciwgYW5kIHJhcmVseSB0byByZWFkIGl0LgorICogVGhleSdyZSBiYWRseSBuYW1lZDsgdG8gZml4LCBzb21lZGF5LgorICovCiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAogI2RlZmluZQl3cml0ZV9jb3VudGVyKFYsIE1DKQl3cml0ZXEoViwgTUMpCiAjZGVmaW5lCXJlYWRfY291bnRlcihNQykJcmVhZHEoTUMpCkBAIC03Nyw3ICs4Miw3IEBACiAgICAgICAgIC5yYXRpbmcgICAgICAgICA9IDI1MCwKICAgICAgICAgLnJlYWQgICAgICAgICAgID0gcmVhZF9ocGV0LAogICAgICAgICAubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKLSAgICAgICAgLm11bHQgICAgICAgICAgID0gMCwgLyp0byBiZSBjYWx1Y2xhdGVkKi8KKwkubXVsdAkJPSAwLCAvKiB0byBiZSBjYWxjdWxhdGVkICovCiAgICAgICAgIC5zaGlmdCAgICAgICAgICA9IDEwLAogICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CkBAIC04Niw4ICs5MSw2IEBACiAKIC8qIEEgbG9jayBmb3IgY29uY3VycmVudCBhY2Nlc3MgYnkgYXBwIGFuZCBpc3IgaHBldCBhY3Rpdml0eS4gKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaHBldF9sb2NrKTsKLS8qIEEgbG9jayBmb3IgY29uY3VycmVudCBpbnRlcm1vZHVsZSBhY2Nlc3MgdG8gaHBldCBhbmQgaXNyIGhwZXQgYWN0aXZpdHkuICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhwZXRfdGFza19sb2NrKTsKIAogI2RlZmluZQlIUEVUX0RFVl9OQU1FCSg3KQogCkBAIC05OSw3ICsxMDIsNiBAQAogCXVuc2lnbmVkIGxvbmcgaGRfaXJxZGF0YTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBoZF93YWl0cXVldWU7CiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmhkX2FzeW5jX3F1ZXVlOwotCXN0cnVjdCBocGV0X3Rhc2sgKmhkX3Rhc2s7CiAJdW5zaWduZWQgaW50IGhkX2ZsYWdzOwogCXVuc2lnbmVkIGludCBoZF9pcnE7CiAJdW5zaWduZWQgaW50IGhkX2hkd2lycTsKQEAgLTE3MywxMSArMTc1LDYgQEAKIAkJd3JpdGVsKGlzciwgJmRldnAtPmhkX2hwZXQtPmhwZXRfaXNyKTsKIAlzcGluX3VubG9jaygmaHBldF9sb2NrKTsKIAotCXNwaW5fbG9jaygmaHBldF90YXNrX2xvY2spOwotCWlmIChkZXZwLT5oZF90YXNrKQotCQlkZXZwLT5oZF90YXNrLT5odF9mdW5jKGRldnAtPmhkX3Rhc2stPmh0X2RhdGEpOwotCXNwaW5fdW5sb2NrKCZocGV0X3Rhc2tfbG9jayk7Ci0KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldnAtPmhkX3dhaXRxdWV1ZSk7CiAKIAlraWxsX2Zhc3luYygmZGV2cC0+aGRfYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKQEAgLTE4NSw2ICsxODIsNjcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGhwZXRfdGltZXJfc2V0X2lycShzdHJ1Y3QgaHBldF9kZXYgKmRldnApCit7CisJdW5zaWduZWQgbG9uZyB2OworCWludCBpcnEsIGdzaTsKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lcjsKKworCXNwaW5fbG9ja19pcnEoJmhwZXRfbG9jayk7CisJaWYgKGRldnAtPmhkX2hkd2lycSkgeworCQlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwl0aW1lciA9IGRldnAtPmhkX3RpbWVyOworCisJLyogd2UgcHJlZmVyIGxldmVsIHRyaWdnZXJlZCBtb2RlICovCisJdiA9IHJlYWRsKCZ0aW1lci0+aHBldF9jb25maWcpOworCWlmICghKHYgJiBUbl9JTlRfVFlQRV9DTkZfTUFTSykpIHsKKwkJdiB8PSBUbl9JTlRfVFlQRV9DTkZfTUFTSzsKKwkJd3JpdGVsKHYsICZ0aW1lci0+aHBldF9jb25maWcpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmhwZXRfbG9jayk7CisKKwl2ID0gKHJlYWRxKCZ0aW1lci0+aHBldF9jb25maWcpICYgVG5fSU5UX1JPVVRFX0NBUF9NQVNLKSA+PgorCQkJCSBUbl9JTlRfUk9VVEVfQ0FQX1NISUZUOworCisJLyoKKwkgKiBJbiBQSUMgbW9kZSwgc2tpcCBJUlEwLTQsIElSUTYtOSwgSVJRMTItMTUgd2hpY2ggaXMgYWx3YXlzIHVzZWQgYnkKKwkgKiBsZWdhY3kgZGV2aWNlLiBJbiBJTyBBUElDIG1vZGUsIHdlIHNraXAgYWxsIHRoZSBsZWdhY3kgSVJRUy4KKwkgKi8KKwlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKQorCQl2ICY9IH4weGYzZGY7CisJZWxzZQorCQl2ICY9IH4weGZmZmY7CisKKwlmb3IgKGlycSA9IGZpbmRfZmlyc3RfYml0KCZ2LCBIUEVUX01BWF9JUlEpOyBpcnEgPCBIUEVUX01BWF9JUlE7CisJCWlycSA9IGZpbmRfbmV4dF9iaXQoJnYsIEhQRVRfTUFYX0lSUSwgMSArIGlycSkpIHsKKworCQlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwkJCWlycSA9IEhQRVRfTUFYX0lSUTsKKwkJCWJyZWFrOworCQl9CisKKwkJZ3NpID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKKwkJCQkJQUNQSV9BQ1RJVkVfTE9XKTsKKwkJaWYgKGdzaSA+IDApCisJCQlicmVhazsKKworCQkvKiBGSVhNRTogU2V0dXAgaW50ZXJydXB0IHNvdXJjZSB0YWJsZSAqLworCX0KKworCWlmIChpcnEgPCBIUEVUX01BWF9JUlEpIHsKKwkJc3Bpbl9sb2NrX2lycSgmaHBldF9sb2NrKTsKKwkJdiA9IHJlYWRsKCZ0aW1lci0+aHBldF9jb25maWcpOworCQl2IHw9IGlycSA8PCBUbl9JTlRfUk9VVEVfQ05GX1NISUZUOworCQl3cml0ZWwodiwgJnRpbWVyLT5ocGV0X2NvbmZpZyk7CisJCWRldnAtPmhkX2hkd2lycSA9IGdzaTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKIHN0YXRpYyBpbnQgaHBldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKQEAgLTE5OSw4ICsyNTcsNyBAQAogCiAJZm9yIChkZXZwID0gTlVMTCwgaHBldHAgPSBocGV0czsgaHBldHAgJiYgIWRldnA7IGhwZXRwID0gaHBldHAtPmhwX25leHQpCiAJCWZvciAoaSA9IDA7IGkgPCBocGV0cC0+aHBfbnRpbWVyOyBpKyspCi0JCQlpZiAoaHBldHAtPmhwX2RldltpXS5oZF9mbGFncyAmIEhQRVRfT1BFTgotCQkJICAgIHx8IGhwZXRwLT5ocF9kZXZbaV0uaGRfdGFzaykKKwkJCWlmIChocGV0cC0+aHBfZGV2W2ldLmhkX2ZsYWdzICYgSFBFVF9PUEVOKQogCQkJCWNvbnRpbnVlOwogCQkJZWxzZSB7CiAJCQkJZGV2cCA9ICZocGV0cC0+aHBfZGV2W2ldOwpAQCAtMjE5LDYgKzI3Niw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZocGV0X2xvY2spOwogCXVubG9ja19rZXJuZWwoKTsKIAorCWhwZXRfdGltZXJfc2V0X2lycShkZXZwKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NDEsNyArNTAwLDExIEBACiAJZGV2cC0+aGRfaXJxID0gaXJxOwogCXQgPSBkZXZwLT5oZF9pcmVxZnJlcTsKIAl2ID0gcmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZyk7Ci0JZyA9IHYgfCBUbl9JTlRfRU5CX0NORl9NQVNLOworCisJLyogNjQtYml0IGNvbXBhcmF0b3JzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBpb2N0bHMsCisJICogc28gZm9yY2UgdGhpcyBpbnRvIDMyLWJpdCBtb2RlIGlmIGl0IHN1cHBvcnRzIGJvdGggbW9kZXMKKwkgKi8KKwlnID0gdiB8IFRuXzMyTU9ERV9DTkZfTUFTSyB8IFRuX0lOVF9FTkJfQ05GX01BU0s7CiAKIAlpZiAoZGV2cC0+aGRfZmxhZ3MgJiBIUEVUX1BFUklPRElDKSB7CiAJCXdyaXRlX2NvdW50ZXIodCwgJnRpbWVyLT5ocGV0X2NvbXBhcmUpOwpAQCAtNDUxLDYgKzUxNCwxMiBAQAogCQl2IHw9IFRuX1ZBTF9TRVRfQ05GX01BU0s7CiAJCXdyaXRlcSh2LCAmdGltZXItPmhwZXRfY29uZmlnKTsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCS8qIE5PVEU6ICB3aGF0IHdlIG1vZGlmeSBoZXJlIGlzIGEgaGlkZGVuIGFjY3VtdWxhdG9yCisJCSAqIHJlZ2lzdGVyIHN1cHBvcnRlZCBieSBwZXJpb2RpYy1jYXBhYmxlIGNvbXBhcmF0b3JzLgorCQkgKiBXZSBuZXZlciB3YW50IHRvIG1vZGlmeSB0aGUgKHNpbmdsZSkgY291bnRlcjsgdGhhdAorCQkgKiB3b3VsZCBhZmZlY3QgYWxsIHRoZSBjb21wYXJhdG9ycy4KKwkJICovCiAJCW0gPSByZWFkX2NvdW50ZXIoJmhwZXQtPmhwZXRfbWMpOwogCQl3cml0ZV9jb3VudGVyKHQgKyBtICsgaHBldHAtPmhwX2RlbHRhLCAmdGltZXItPmhwZXRfY29tcGFyZSk7CiAJfSBlbHNlIHsKQEAgLTYwNCw1NyArNjczLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaHBldF90cGNoZWNrKHN0cnVjdCBocGV0X3Rhc2sgKnRwKQotewotCXN0cnVjdCBocGV0X2RldiAqZGV2cDsKLQlzdHJ1Y3QgaHBldHMgKmhwZXRwOwotCi0JZGV2cCA9IHRwLT5odF9vcGFxdWU7Ci0KLQlpZiAoIWRldnApCi0JCXJldHVybiAtRU5YSU87Ci0KLQlmb3IgKGhwZXRwID0gaHBldHM7IGhwZXRwOyBocGV0cCA9IGhwZXRwLT5ocF9uZXh0KQotCQlpZiAoZGV2cCA+PSBocGV0cC0+aHBfZGV2Ci0JCSAgICAmJiBkZXZwIDwgKGhwZXRwLT5ocF9kZXYgKyBocGV0cC0+aHBfbnRpbWVyKQotCQkgICAgJiYgZGV2cC0+aGRfaHBldCA9PSBocGV0cC0+aHBfaHBldCkKLQkJCXJldHVybiAwOwotCi0JcmV0dXJuIC1FTlhJTzsKLX0KLQotI2lmIDAKLWludCBocGV0X3VucmVnaXN0ZXIoc3RydWN0IGhwZXRfdGFzayAqdHApCi17Ci0Jc3RydWN0IGhwZXRfZGV2ICpkZXZwOwotCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOwotCWludCBlcnI7Ci0KLQlpZiAoKGVyciA9IGhwZXRfdHBjaGVjayh0cCkpKQotCQlyZXR1cm4gZXJyOwotCi0Jc3Bpbl9sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOwotCXNwaW5fbG9jaygmaHBldF9sb2NrKTsKLQotCWRldnAgPSB0cC0+aHRfb3BhcXVlOwotCWlmIChkZXZwLT5oZF90YXNrICE9IHRwKSB7Ci0JCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOwotCQlzcGluX3VubG9ja19pcnEoJmhwZXRfdGFza19sb2NrKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQl0aW1lciA9IGRldnAtPmhkX3RpbWVyOwotCXdyaXRlcSgocmVhZHEoJnRpbWVyLT5ocGV0X2NvbmZpZykgJiB+VG5fSU5UX0VOQl9DTkZfTUFTSyksCi0JICAgICAgICZ0aW1lci0+aHBldF9jb25maWcpOwotCWRldnAtPmhkX2ZsYWdzICY9IH4oSFBFVF9JRSB8IEhQRVRfUEVSSU9ESUMpOwotCWRldnAtPmhkX3Rhc2sgPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZocGV0X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmaHBldF90YXNrX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgIC8qICAwICAqLwotCiBzdGF0aWMgY3RsX3RhYmxlIGhwZXRfdGFibGVbXSA9IHsKIAl7CiAJIC5jdGxfbmFtZSA9IENUTF9VTk5VTUJFUkVELApAQCAtNzQ2LDYgKzc2NCw3IEBACiAJc3RhdGljIHN0cnVjdCBocGV0cyAqbGFzdCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwZXJpb2Q7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisJdTMyIHJlbWFpbmRlcjsKIAogCS8qCiAJICogaHBldF9hbGxvYyBjYW4gYmUgY2FsbGVkIGJ5IHBsYXRmb3JtIGRlcGVuZGVudCBjb2RlLgpAQCAtODA5LDkgKzgyOCwxMyBAQAogCQlwcmludGsoIiVzICVkIiwgaSA+IDAgPyAiLCIgOiAiIiwgaGRwLT5oZF9pcnFbaV0pOwogCXByaW50aygiXG4iKTsKIAotCXByaW50ayhLRVJOX0lORk8gImhwZXQldTogJXUgJWQtYml0IHRpbWVycywgJUx1IEh6XG4iLAotCSAgICAgICBocGV0cC0+aHBfd2hpY2gsIGhwZXRwLT5ocF9udGltZXIsCi0JICAgICAgIGNhcCAmIEhQRVRfQ09VTlRFUl9TSVpFX01BU0sgPyA2NCA6IDMyLCBocGV0cC0+aHBfdGlja19mcmVxKTsKKwl0ZW1wID0gaHBldHAtPmhwX3RpY2tfZnJlcTsKKwlyZW1haW5kZXIgPSBkb19kaXYodGVtcCwgMTAwMDAwMCk7CisJcHJpbnRrKEtFUk5fSU5GTworCQkiaHBldCV1OiAldSBjb21wYXJhdG9ycywgJWQtYml0ICV1LiUwNnUgTUh6IGNvdW50ZXJcbiIsCisJCWhwZXRwLT5ocF93aGljaCwgaHBldHAtPmhwX250aW1lciwKKwkJY2FwICYgSFBFVF9DT1VOVEVSX1NJWkVfTUFTSyA/IDY0IDogMzIsCisJCSh1bnNpZ25lZCkgdGVtcCwgcmVtYWluZGVyKTsKIAogCW1jZmcgPSByZWFkcSgmaHBldC0+aHBldF9jb25maWcpOwogCWlmICgobWNmZyAmIEhQRVRfRU5BQkxFX0NORl9NQVNLKSA9PSAwKSB7CkBAIC04NzQsOCArODk3LDYgQEAKIAkJaGRwLT5oZF9hZGRyZXNzID0gaW9yZW1hcChhZGRyLm1pbmltdW0sIGFkZHIuYWRkcmVzc19sZW5ndGgpOwogCiAJCWlmIChocGV0X2lzX2tub3duKGhkcCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogMHglbHggaXMgYnVzeVxuIiwKLQkJCQlfX2Z1bmNfXywgaGRwLT5oZF9waHlzX2FkZHJlc3MpOwogCQkJaW91bm1hcChoZHAtPmhkX2FkZHJlc3MpOwogCQkJcmV0dXJuIEFFX0FMUkVBRFlfRVhJU1RTOwogCQl9CkBAIC04OTEsOCArOTEyLDYgQEAKIAkJCQkJCUhQRVRfUkFOR0VfU0laRSk7CiAKIAkJaWYgKGhwZXRfaXNfa25vd24oaGRwKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAweCVseCBpcyBidXN5XG4iLAotCQkJCV9fZnVuY19fLCBoZHAtPmhkX3BoeXNfYWRkcmVzcyk7CiAJCQlpb3VubWFwKGhkcC0+aGRfYWRkcmVzcyk7CiAJCQlyZXR1cm4gQUVfQUxSRUFEWV9FWElTVFM7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKaW5kZXggZmQ2NDEzNy4uYmY3MDQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTM2NywxMyArMzY3LDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoLS1ocC0+Y291bnQgPT0gMCkgewotCQlpZiAoaHAtPm9wcy0+bm90aWZpZXJfZGVsKQotCQkJaHAtPm9wcy0+bm90aWZpZXJfZGVsKGhwLCBocC0+ZGF0YSk7Ci0KIAkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgdHR5IHBvaW50ZXIgbm93LiAqLwogCQlocC0+dHR5ID0gTlVMTDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKIAorCQlpZiAoaHAtPm9wcy0+bm90aWZpZXJfZGVsKQorCQkJaHAtPm9wcy0+bm90aWZpZXJfZGVsKGhwLCBocC0+ZGF0YSk7CisKIAkJLyoKIAkJICogQ2hhaW4gY2FsbHMgY2hhcnNfaW5fYnVmZmVyKCkgYW5kIHJldHVybnMgaW1tZWRpYXRlbHkgaWYKIAkJICogdGhlcmUgaXMgbm8gYnVmZmVyZWQgZGF0YSBvdGhlcndpc2Ugc2xlZXBzIG9uIGEgd2FpdCBxdWV1ZQpAQCAtNDE2LDExICs0MTYsMTEgQEAKIAlocC0+bl9vdXRidWYgPSAwOwogCWhwLT50dHkgPSBOVUxMOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHAtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChocC0+b3BzLT5ub3RpZmllcl9kZWwpCiAJCQlocC0+b3BzLT5ub3RpZmllcl9kZWwoaHAsIGhwLT5kYXRhKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhwLT5sb2NrLCBmbGFncyk7Ci0KIAl3aGlsZSh0ZW1wX29wZW5fY291bnQpIHsKIAkJLS10ZW1wX29wZW5fY291bnQ7CiAJCWtyZWZfcHV0KCZocC0+a3JlZiwgZGVzdHJveV9odmNfc3RydWN0KTsKQEAgLTgxOSwxMSArODE5LDExIEBACiAJaHZjX2RyaXZlciA9IGRydjsKIAlyZXR1cm4gMDsKIAotcHV0X3R0eToKLQlwdXRfdHR5X2RyaXZlcihodmNfZHJpdmVyKTsKIHN0b3BfdGhyZWFkOgogCWt0aHJlYWRfc3RvcChodmNfdGFzayk7CiAJaHZjX3Rhc2sgPSBOVUxMOworcHV0X3R0eToKKwlwdXRfdHR5X2RyaXZlcihkcnYpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX3hlbi5jIGIvZHJpdmVycy9jaGFyL2h2Y194ZW4uYwppbmRleCA2YjcwYWE2Li41MzhjZWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX3hlbi5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfeGVuLmMKQEAgLTEwOCw4ICsxMDgsOCBAQAogewogCXN0cnVjdCBodmNfc3RydWN0ICpocDsKIAotCWlmICghaXNfcnVubmluZ19vbl94ZW4oKSB8fAotCSAgICBpc19pbml0aWFsX3hlbmRvbWFpbigpIHx8CisJaWYgKCF4ZW5fcHZfZG9tYWluKCkgfHwKKwkgICAgeGVuX2luaXRpYWxfZG9tYWluKCkgfHwKIAkgICAgIXhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbVUuZXZ0Y2huKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTQyLDcgKzE0Miw3IEBACiAKIHN0YXRpYyBpbnQgeGVuX2NvbnNfaW5pdCh2b2lkKQogewotCWlmICghaXNfcnVubmluZ19vbl94ZW4oKSkKKwlpZiAoIXhlbl9wdl9kb21haW4oKSkKIAkJcmV0dXJuIDA7CiAKIAlodmNfaW5zdGFudGlhdGUoSFZDX0NPT0tJRSwgMCwgJmh2Y19vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKaW5kZXggNTIyMGY1NC4uODg1OWFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCkBAIC03MzYsNyArNzM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbjJybmdfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG4ycm5nX21hdGNoW10gPSB7CiAJewogCQkubmFtZQkJPSAicmFuZG9tLW51bWJlci1nZW5lcmF0b3IiLAogCQkuY29tcGF0aWJsZQk9ICJTVU5XLG4yLXJuZyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMKaW5kZXggNTE3MzhiZC4uZDRlN2RjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb21hcC1ybmcuYwpAQCAtMTE4LDE4ICsxMTgsMjEgQEAKIAogCW1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLAogCQkJCSBwZGV2LT5uYW1lKTsKLQlpZiAobWVtID09IE5VTEwpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKG1lbSA9PSBOVUxMKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KIAogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtZW0pOwotCXJuZ19iYXNlID0gKHUzMiBfX2ZvcmNlIF9faW9tZW0gKilpb19wMnYocmVzLT5zdGFydCk7CisJcm5nX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmICghcm5nX2Jhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CiAKIAlyZXQgPSBod3JuZ19yZWdpc3Rlcigmb21hcF9ybmdfb3BzKTsKLQlpZiAocmV0KSB7Ci0JCXJlbGVhc2VfcmVzb3VyY2UobWVtKTsKLQkJcm5nX2Jhc2UgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWdpc3RlcjsKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJPTUFQIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHZlci4gJTAyeFxuIiwKIAkJb21hcF9ybmdfcmVhZF9yZWcoUk5HX1JFVl9SRUcpKTsKQEAgLTEzOCw2ICsxNDEsMTggQEAKIAlybmdfZGV2ID0gcGRldjsKIAogCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXI6CisJaW91bm1hcChybmdfYmFzZSk7CisJcm5nX2Jhc2UgPSBOVUxMOworZXJyX2lvcmVtYXA6CisJcmVsZWFzZV9yZXNvdXJjZShtZW0pOworZXJyX3JlZ2lvbjoKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJY2xrX2Rpc2FibGUocm5nX2ljayk7CisJCWNsa19wdXQocm5nX2ljayk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19leGl0IG9tYXBfcm5nX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTQ4LDYgKzE2Myw4IEBACiAKIAlvbWFwX3JuZ193cml0ZV9yZWcoUk5HX01BU0tfUkVHLCAweDApOwogCisJaW91bm1hcChybmdfYmFzZSk7CisKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJY2xrX2Rpc2FibGUocm5nX2ljayk7CiAJCWNsa19wdXQocm5nX2ljayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2lwMi9NYWtlZmlsZQppbmRleCA5Mzk2MThmLi5iYzM5N2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvTWFrZWZpbGUKQEAgLTQsNSArNCw1IEBACiAKIG9iai0kKENPTkZJR19DT01QVVRPTkUpICAgICAgICAgKz0gaXAyLm8KIAotaXAyLW9ianMJCQk6PSBpcDJiYXNlLm8gaXAybWFpbi5vCitpcDItb2JqcwkJCTo9IGlwMm1haW4ubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuYyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCmluZGV4IDM2MDEwMTcuLjI5ZGI0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jCkBAIC02OSwzOCArNjksNiBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBGdW5jdGlvbjogICBpaUVsbGlzSW5pdCgpCi0vLyBQYXJhbWV0ZXJzOiBOb25lCi0vLwotLy8gUmV0dXJuczogICAgTm90aGluZwotLy8KLS8vIERlc2NyaXB0aW9uOgotLy8KLS8vIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGlpRWxsaXMgc3Vic3lzdGVtLgotLy8KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1zdGF0aWMgdm9pZAotaWlFbGxpc0luaXQodm9pZCkKLXsKLX0KLQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIEZ1bmN0aW9uOiAgIGlpRWxsaXNDbGVhbnVwKCkKLS8vIFBhcmFtZXRlcnM6IE5vbmUKLS8vCi0vLyBSZXR1cm5zOiAgICBOb3RoaW5nCi0vLwotLy8gRGVzY3JpcHRpb246Ci0vLwotLy8gVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSByZXF1aXJlZCBjbGVhbnVwIG9mIHRoZSBpaUVsbGlzIHN1YnN5c3RlbS4KLS8vCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotc3RhdGljIHZvaWQKLWlpRWxsaXNDbGVhbnVwKHZvaWQpCi17Ci19Ci0KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyBGdW5jdGlvbjogICBpaVNldEFkZHJlc3MocEIsIGFkZHJlc3MsIGRlbGF5KQogLy8gUGFyYW1ldGVyczogcEIgICAgICAtIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZQogLy8gICAgICAgICAgICAgYWRkcmVzcyAtIHRoZSBwdXJwb3J0ZWQgSS9PIGFkZHJlc3Mgb2YgdGhlIGJvYXJkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyZWxsaXMuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5oCmluZGV4IGM4OGE2NGUuLmZiNmRmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5oCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5oCkBAIC01MTEsNyArNTExLDYgQEAKIC8vCiAvLyBJbml0aWFsaXphdGlvbiBvZiBhIGJvYXJkICYgc3RydWN0dXJlIGlzIGluIGZvdXIgKGZpdmUhKSBwYXJ0czoKIC8vCi0vLyAwKSBpaUVsbGlzSW5pdCgpICAtIEluaXRpYWxpemUgaWlFbGxpcyBzdWJzeXN0ZW0uCiAvLyAxKSBpaVNldEFkZHJlc3MoKSAtIERlZmluZSB0aGUgYm9hcmQgYWRkcmVzcyAmIGRlbGF5IGZ1bmN0aW9uIGZvciBhIGJvYXJkLgogLy8gMikgaWlSZXNldCgpICAgICAgLSBSZXNldCB0aGUgYm9hcmQgICAocHJvdmlkZWQgaXQgZXhpc3RzKQogLy8gICAgICAgLS0gTm90ZSB5b3UgbWF5IGRvIHRoaXMgdG8gc2V2ZXJhbCBib2FyZHMgLS0KQEAgLTUyMyw3ICs1MjIsNiBAQAogLy8gbG9hZHdhcmUuICBUbyBjaGFuZ2UgbG9hZHdhcmUsIHlvdSBtdXN0IGJlZ2luIGFnYWluIHdpdGggc3RlcCAyLCByZXNldHRpbmcKIC8vIHRoZSBib2FyZCBhZ2FpbiAoc3RlcCAxIG5vdCBuZWVkZWQpLgogCi1zdGF0aWMgdm9pZCBpaUVsbGlzSW5pdCh2b2lkKTsKIHN0YXRpYyBpbnQgaWlTZXRBZGRyZXNzKGkyZUJvcmRTdHJQdHIsIGludCwgZGVsYXlGdW5jX3QgKTsKIHN0YXRpYyBpbnQgaWlSZXNldChpMmVCb3JkU3RyUHRyKTsKIHN0YXRpYyBpbnQgaWlSZXNldERlbGF5KGkyZUJvcmRTdHJQdHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJiYXNlLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMmJhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NWUyNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMmJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLyBpcDIuYwotLy8gVGhpcyBpcyBhIGR1bW15IG1vZHVsZSB0byBtYWtlIHRoZSBmaXJtd2FyZSBhdmFpbGFibGUgd2hlbiBuZWVkZWQKLS8vIGFuZCBhbGxvd3MgaXQgdG8gYmUgdW5sb2FkZWQgd2hlbiBub3QuIFJ1bW9yIGlzIHRoZSBfX2luaXRkYXRhIAotLy8gbWFjcm8gZG9lc24ndCBhbHdheXMgd29ya3Mgb24gYWxsIHBsYXRmb3JtcyBzbyB3ZSB1c2UgdGhpcyBrbHVkZ2UuCi0vLyBJZiBub3QgY29tcGlsZWQgYXMgYSBtb2R1bGUgaXQganVzdCBtYWtlcyBmaXBfZmlybSBhdmFsaWFibGUgdGhlbgotLy8gIF9faW5pdGRhdGEgc2hvdWxkIHdvcmsgYXMgYWR2ZXJ0aXplZAotLy8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpZm5kZWYgX19pbml0Ci0jZGVmaW5lIF9faW5pdAotI2VuZGlmCi0jaWZuZGVmIF9faW5pdGZ1bmMKLSNkZWZpbmUgX19pbml0ZnVuYyhhKSBhCi0jZW5kaWYKLSNpZm5kZWYgX19pbml0ZGF0YQotI2RlZmluZSBfX2luaXRkYXRhCi0jZW5kaWYKLQotI2luY2x1ZGUgImlwMnR5cGVzLmgiCQkKLQotaW50Ci1pcDJfbG9hZG1haW4oaW50ICosIGludCAqKTsgLy8gcmVmIGludG8gaXAybWFpbi5jCi0KLS8qIE5vdGU6IEFkZCBjb21waWxlZCBpbiBkZWZhdWx0cyB0byB0aGVzZSBhcnJheXMsIG5vdCB0byB0aGUgc3RydWN0dXJlCi0JaW4gaXAyLmggYW55IGxvbmdlci4gIFRoYXQgc3RydWN0dXJlIFdJTEwgZ2V0IG92ZXJyaWRkZW4KLQlieSB0aGVzZSB2YWx1ZXMsIG9yIGNvbW1hbmQgbGluZSB2YWx1ZXMsIG9yIGluc21vZCB2YWx1ZXMhISEgID1taHc9Ci0qLwotc3RhdGljIGludCBpb1tJUDJfTUFYX0JPQVJEU109IHsgMCwgMCwgMCwgMCB9Owotc3RhdGljIGludCBpcnFbSVAyX01BWF9CT0FSRFNdID0geyAtMSwgLTEsIC0xLCAtMSB9OyAKLQotc3RhdGljIGludCBwb2xsX29ubHkgPSAwOwotCi1NT0RVTEVfQVVUSE9SKCJEb3VnIE1jTmFzaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBEcml2ZXIiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlycSwiSW50ZXJydXB0cyBmb3IgSW50ZWxsaVBvcnQgQ2FyZHMiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sIkkvTyBwb3J0cyBmb3IgSW50ZWxsaVBvcnQgQ2FyZHMiKTsKLW1vZHVsZV9wYXJhbShwb2xsX29ubHksIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhwb2xsX29ubHksIkRvIG5vdCB1c2UgY2FyZCBpbnRlcnJ1cHRzIik7Ci0KLQotc3RhdGljIGludCBfX2luaXQgaXAyX2luaXQodm9pZCkKLXsKLQlpZiggcG9sbF9vbmx5ICkgewotCQkvKiBIYXJkIGxvY2sgdGhlIGludGVycnVwdHMgdG8gemVybyAqLwotCQlpcnFbMF0gPSBpcnFbMV0gPSBpcnFbMl0gPSBpcnFbM10gPSAwOwotCX0KLQotCXJldHVybiBpcDJfbG9hZG1haW4oaW8sIGlycSk7Ci19Ci1tb2R1bGVfaW5pdChpcDJfaW5pdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2lmbmRlZiBNT0RVTEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCWlwMl9zZXR1cDoKLSAqCQlzdHI6IGtlcm5lbCBjb21tYW5kIGxpbmUgc3RyaW5nCi0gKgotICoJQ2FuJ3QgYXV0b3Byb2JlIHRoZSBib2FyZHMgc28gdXNlciBtdXN0IHNwZWNpZnkgY29uZmlndXJhdGlvbiBvbgotICoJa2VybmVsIGNvbW1hbmQgbGluZS4gIFNhbmUgcGVvcGxlIGJ1aWxkIGl0IG1vZHVsYXIgYnV0IHRoZSBvdGhlcnMKLSAqCWNvbWUgaGVyZS4KLSAqCi0gKglBbHRlcm5hdGluZyBwYWlycyBvZiBpbyxpcnEgZm9yIHVwIHRvIDQgYm9hcmRzLgotICoJCWlwMj1pbzAsaXJxMCxpbzEsaXJxMSxpbzIsaXJxMixpbzMsaXJxMwotICoKLSAqCQlpbz0wID0+IE5vIGJvYXJkCi0gKgkJaW89MSA9PiBQQ0kKLSAqCQlpbz0yID0+IEVJU0EKLSAqCQllbHNlID0+IElTQSBJL08gYWRkcmVzcwotICoKLSAqCQlpcnE9MCBvciBpbnZhbGlkIGZvciBJU0Egd2lsbCByZXZlcnQgdG8gcG9sbGluZyBtb2RlCi0gKgotICoJCUFueSB2YWx1ZSA9IC0xLCBkbyBub3Qgb3ZlcndyaXRlIGNvbXBpbGVkIGluIHZhbHVlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IF9faW5pdCBpcDJfc2V0dXAoY2hhciAqc3RyKQotewotCWludAlpbnRzWzEwXTsJLyogNCBib2FyZHMsIDIgcGFyYW1ldGVycyArIDIgKi8KLQlpbnQJaSwgajsKLQotCXN0ciA9IGdldF9vcHRpb25zIChzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCi0JZm9yKCBpID0gMCwgaiA9IDE7IGkgPCA0OyBpKysgKSB7Ci0JCWlmKCBqID4gaW50c1swXSApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmKCBpbnRzW2pdID49IDAgKSB7Ci0JCQlpb1tpXSA9IGludHNbal07Ci0JCX0KLQkJaisrOwotCQlpZiggaiA+IGludHNbMF0gKSB7Ci0JCQlicmVhazsKLQkJfQotCQlpZiggaW50c1tqXSA+PSAwICkgewotCQkJaXJxW2ldID0gaW50c1tqXTsKLQkJfQotCQlqKys7Ci0JfQotCXJldHVybiAxOwotfQotX19zZXR1cCgiaXAyPSIsIGlwMl9zZXR1cCk7Ci0jZW5kaWYgLyogIU1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwppbmRleCA2ODlmOWRjLi43MGUwZWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMTUwLDE1ICsxNTAsMTIgQEAKIC8qKioqKioqKioqKioqLwogCiAvKiBTdHJpbmcgY29uc3RhbnRzIHRvIGlkZW50aWZ5IG91cnNlbHZlcyAqLwotc3RhdGljIGNoYXIgKnBjTmFtZSAgICA9ICJDb21wdXRvbmUgSW50ZWxsaVBvcnQgUGx1cyBtdWx0aXBvcnQgZHJpdmVyIjsKLXN0YXRpYyBjaGFyICpwY1ZlcnNpb24gPSAiMS4yLjE0IjsKK3N0YXRpYyBjb25zdCBjaGFyIHBjTmFtZVtdID0gIkNvbXB1dG9uZSBJbnRlbGxpUG9ydCBQbHVzIG11bHRpcG9ydCBkcml2ZXIiOworc3RhdGljIGNvbnN0IGNoYXIgcGNWZXJzaW9uW10gPSAiMS4yLjE0IjsKIAogLyogU3RyaW5nIGNvbnN0YW50cyBmb3IgcG9ydCBuYW1lcyAqLwotc3RhdGljIGNoYXIgKnBjRHJpdmVyX25hbWUgICA9ICJpcDIiOwotc3RhdGljIGNoYXIgKnBjSXBsICAgIAkJID0gImlwMmlwbCI7Ci0KLS8vIGNoZWV6eSBrbHVkZ2Ugb3IgZ2VuaXVzIC0geW91IGRlY2lkZT8KLWludCBpcDJfbG9hZG1haW4oaW50ICosIGludCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyIHBjRHJpdmVyX25hbWVbXSA9ICJpcDIiOworc3RhdGljIGNvbnN0IGNoYXIgcGNJcGxbXSA9ICJpcDJpcGwiOwogCiAvKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCkBAIC0yNDAsOCArMjM3LDggQEAKIAkub3BlbgkJPSBpcDJfaXBsX29wZW4sCiB9OyAKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX2NvdW50ZXIgPSAwOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmhfY291bnRlciA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfY291bnRlcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJoX2NvdW50ZXI7CiAKIC8vIFVzZSBpbW1lZGlhdGUgcXVldWUgdG8gc2VydmljZSBpbnRlcnJ1cHRzCiAjZGVmaW5lIFVTRV9JUUkKQEAgLTI1Miw3ICsyNDksNiBAQAogICovCiAjZGVmaW5lICBQT0xMX1RJTUVPVVQgICAoamlmZmllcyArIDEpCiBzdGF0aWMgREVGSU5FX1RJTUVSKFBvbGxUaW1lciwgaXAyX3BvbGwsIDAsIDApOwotc3RhdGljIGNoYXIgIFRpbWVyT247CiAKICNpZmRlZiBJUDJERUJVR19UUkFDRQogLyogVHJhY2UgKGRlYnVnKSBidWZmZXIgZGF0YSAqLwpAQCAtMjY4LDggKzI2NCw4IEBACiAvKioqKioqKioqKi8KIAogI2lmIGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKElQMkRFQlVHX09QRU4pCi0jZGVmaW5lIERCR19DTlQocykgcHJpbnRrKEtFUk5fREVCVUcgIiglcyk6IFsleF0gcmVmYz0lZCwgdHR5Yz0lZCwgbW9kYz0leCAtPiAlc1xuIiwgXAotCQkgICAgdHR5LT5uYW1lLChwQ2gtPmZsYWdzKSxpcDJfdHR5X2RyaXZlci0+cmVmY291bnQsIFwKKyNkZWZpbmUgREJHX0NOVChzKSBwcmludGsoS0VSTl9ERUJVRyAiKCVzKTogWyV4XSB0dHljPSVkLCBtb2RjPSV4IC0+ICVzXG4iLCBcCisJCSAgICB0dHktPm5hbWUsKHBDaC0+ZmxhZ3MpLCBcCiAJCSAgICB0dHktPmNvdW50LC8qR0VUX1VTRV9DT1VOVChtb2R1bGUpKi8wLHMpCiAjZWxzZQogI2RlZmluZSBEQkdfQ05UKHMpCkBAIC0yODcsOCArMjgzLDkgQEAKIAogTU9EVUxFX0FVVEhPUigiRG91ZyBNY05hc2giKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgcG9sbF9vbmx5ID0gMDsKK3N0YXRpYyBpbnQgcG9sbF9vbmx5OwogCiBzdGF0aWMgaW50IEVpc2FfaXJxOwogc3RhdGljIGludCBFaXNhX3Nsb3Q7CkBAIC0yOTcsMzQgKzI5NCw0NiBAQAogc3RhdGljIGNoYXIgcmlycXNbSVAyX01BWF9CT0FSRFNdOwogc3RhdGljIGludCBWYWxpZF9JcnFzW10gPSB7IDMsIDQsIDUsIDcsIDEwLCAxMSwgMTIsIDE1LCAwfTsKIAorLyogTm90ZTogQWRkIGNvbXBpbGVkIGluIGRlZmF1bHRzIHRvIHRoZXNlIGFycmF5cywgbm90IHRvIHRoZSBzdHJ1Y3R1cmUKKwlpbiBpcDIuaCBhbnkgbG9uZ2VyLiAgVGhhdCBzdHJ1Y3R1cmUgV0lMTCBnZXQgb3ZlcnJpZGRlbgorCWJ5IHRoZXNlIHZhbHVlcywgb3IgY29tbWFuZCBsaW5lIHZhbHVlcywgb3IgaW5zbW9kIHZhbHVlcyEhISAgPW1odz0KKyovCitzdGF0aWMgaW50IGlvW0lQMl9NQVhfQk9BUkRTXTsKK3N0YXRpYyBpbnQgaXJxW0lQMl9NQVhfQk9BUkRTXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKKworTU9EVUxFX0FVVEhPUigiRG91ZyBNY05hc2giKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgRHJpdmVyIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJbnRlcnJ1cHRzIGZvciBJbnRlbGxpUG9ydCBDYXJkcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBwb3J0cyBmb3IgSW50ZWxsaVBvcnQgQ2FyZHMiKTsKK21vZHVsZV9wYXJhbShwb2xsX29ubHksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb2xsX29ubHksICJEbyBub3QgdXNlIGNhcmQgaW50ZXJydXB0cyIpOworCiAvKiBmb3Igc3lzZnMgY2xhc3Mgc3VwcG9ydCAqLwogc3RhdGljIHN0cnVjdCBjbGFzcyAqaXAyX2NsYXNzOwogCi0vLyBTb21lIGZ1bmN0aW9ucyB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaXJxJ3Mgd2UgaGF2ZQorLyogU29tZSBmdW5jdGlvbnMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGlycXMgd2UgaGF2ZSAqLwogCi1zdGF0aWMgaW50Ci1pc192YWxpZF9pcnEoaW50IGlycSkKK3N0YXRpYyBpbnQgX19pbml0IGlzX3ZhbGlkX2lycShpbnQgaXJxKQogewogCWludCAqaSA9IFZhbGlkX0lycXM7CiAJCi0Jd2hpbGUgKCgqaSAhPSAwKSAmJiAoKmkgIT0gaXJxKSkgeworCXdoaWxlICgqaSAhPSAwICYmICppICE9IGlycSkKIAkJaSsrOwotCX0KLQlyZXR1cm4gKCppKTsKKworCXJldHVybiAqaTsKIH0KIAotc3RhdGljIHZvaWQKLW1hcmtfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQorc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcmVxdWVzdGVkX2lycShjaGFyIGlycSkKIHsKIAlyaXJxc1tpaW5keCsrXSA9IGlycTsKIH0KIAotI2lmZGVmIE1PRFVMRQotc3RhdGljIGludAotY2xlYXJfcmVxdWVzdGVkX2lycSggY2hhciBpcnEgKQorc3RhdGljIGludCBfX2V4aXQgY2xlYXJfcmVxdWVzdGVkX2lycShjaGFyIGlycSkKIHsKIAlpbnQgaTsKLQlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKIAkJaWYgKHJpcnFzW2ldID09IGlycSkgewogCQkJcmlycXNbaV0gPSAwOwogCQkJcmV0dXJuIDE7CkBAIC0zMzIsMTcgKzM0MSwxNSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCi1zdGF0aWMgaW50Ci1oYXZlX3JlcXVlc3RlZF9pcnEoIGNoYXIgaXJxICkKK3N0YXRpYyBpbnQgaGF2ZV9yZXF1ZXN0ZWRfaXJxKGNoYXIgaXJxKQogewotCS8vIGFycmF5IGluaXQgdG8gemVyb3Mgc28gMCBpcnEgd2lsbCBub3QgYmUgcmVxdWVzdGVkIGFzIGEgc2lkZSBlZmZlY3QKKwkvKiBhcnJheSBpbml0IHRvIHplcm9zIHNvIDAgaXJxIHdpbGwgbm90IGJlIHJlcXVlc3RlZCBhcyBhIHNpZGUKKwkgKiBlZmZlY3QgKi8KIAlpbnQgaTsKLQlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpCiAJCWlmIChyaXJxc1tpXSA9PSBpcnEpCiAJCQlyZXR1cm4gMTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2MSw1MyArMzY4LDQ1IEBACiAvKiBoYW5kbGUgc3Vic2VxdWVudCBpbnN0YWxsYXRpb25zIG9mIHRoZSBkcml2ZXIuIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSAqLwogLyogZHJpdmVyIHNob3VsZCBiZSByZXR1cm5lZCBzaW5jZSBpdCBtYXkgYmUgdW5sb2FkZWQgZnJvbSBtZW1vcnkuICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgTU9EVUxFCi12b2lkIF9fZXhpdAotaXAyX2NsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgaXAyX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IGVycjsKIAlpbnQgaTsKIAotI2lmZGVmIElQMkRFQlVHX0lOSVQKLQlwcmludGsgKEtFUk5fREVCVUcgIlVubG9hZGluZyAlczogdmVyc2lvbiAlc1xuIiwgcGNOYW1lLCBwY1ZlcnNpb24gKTsKLSNlbmRpZgotCS8qIFN0b3AgcG9sbCB0aW1lciBpZiB3ZSBoYWQgb25lLiAqLwotCWlmICggVGltZXJPbiApIHsKLQkJZGVsX3RpbWVyICggJlBvbGxUaW1lciApOwotCQlUaW1lck9uID0gMDsKLQl9CisJZGVsX3RpbWVyX3N5bmMoJlBvbGxUaW1lcik7CiAKIAkvKiBSZXNldCB0aGUgYm9hcmRzIHdlIGhhdmUuICovCi0JZm9yKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7Ci0JCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgewotCQkJaWlSZXNldCggaTJCb2FyZFB0clRhYmxlW2ldICk7Ci0JCX0KLQl9CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyBpKyspCisJCWlmIChpMkJvYXJkUHRyVGFibGVbaV0pCisJCQlpaVJlc2V0KGkyQm9hcmRQdHJUYWJsZVtpXSk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgYXQgbW9zdCBvbmNlLCBpZiBhbnkgYm9hcmRzIHdlcmUgaW5zdGFsbGVkLiAqLwotCWZvciAoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKLQkJaWYgKCBpMkJvYXJkUHRyVGFibGVbaV0gKSB7Ci0JCQlpaVJlc2V0RGVsYXkoIGkyQm9hcmRQdHJUYWJsZVtpXSApOworCWZvciAoaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgaSsrKSB7CisJCWlmIChpMkJvYXJkUHRyVGFibGVbaV0pIHsKKwkJCWlpUmVzZXREZWxheShpMkJvYXJkUHRyVGFibGVbaV0pOwogCQkJLyogZnJlZSBpbyBhZGRyZXNzZXMgYW5kIFRpYmV0ICovCi0JCQlyZWxlYXNlX3JlZ2lvbiggaXAyY29uZmlnLmFkZHJbaV0sIDggKTsKKwkJCXJlbGVhc2VfcmVnaW9uKGlwMmNvbmZpZy5hZGRyW2ldLCA4KTsKIAkJCWRldmljZV9kZXN0cm95KGlwMl9jbGFzcywgTUtERVYoSVAyX0lQTF9NQUpPUiwgNCAqIGkpKTsKLQkJCWRldmljZV9kZXN0cm95KGlwMl9jbGFzcywgTUtERVYoSVAyX0lQTF9NQUpPUiwgNCAqIGkgKyAxKSk7CisJCQlkZXZpY2VfZGVzdHJveShpcDJfY2xhc3MsIE1LREVWKElQMl9JUExfTUFKT1IsCisJCQkJCQk0ICogaSArIDEpKTsKIAkJfQogCQkvKiBEaXNhYmxlIGFuZCByZW1vdmUgaW50ZXJydXB0IGhhbmRsZXIuICovCi0JCWlmICggKGlwMmNvbmZpZy5pcnFbaV0gPiAwKSAmJiBoYXZlX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSkgKSB7CQotCQkJZnJlZV9pcnEgKCBpcDJjb25maWcuaXJxW2ldLCAodm9pZCAqKSZwY05hbWUpOwotCQkJY2xlYXJfcmVxdWVzdGVkX2lycSggaXAyY29uZmlnLmlycVtpXSk7CisJCWlmIChpcDJjb25maWcuaXJxW2ldID4gMCAmJgorCQkJCWhhdmVfcmVxdWVzdGVkX2lycShpcDJjb25maWcuaXJxW2ldKSkgeworCQkJZnJlZV9pcnEoaXAyY29uZmlnLmlycVtpXSwgKHZvaWQgKikmcGNOYW1lKTsKKwkJCWNsZWFyX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSk7CiAJCX0KIAl9CiAJY2xhc3NfZGVzdHJveShpcDJfY2xhc3MpOwotCWlmICggKCBlcnIgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIgKCBpcDJfdHR5X2RyaXZlciApICkgKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVAyOiBmYWlsZWQgdG8gdW5yZWdpc3RlciB0dHkgZHJpdmVyICglZClcbiIsIGVycik7Ci0JfQorCWVyciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihpcDJfdHR5X2RyaXZlcik7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHR0eSBkcml2ZXIgKCVkKVxuIiwKKwkJCQllcnIpOwogCXB1dF90dHlfZHJpdmVyKGlwMl90dHlfZHJpdmVyKTsKIAl1bnJlZ2lzdGVyX2NocmRldihJUDJfSVBMX01BSk9SLCBwY0lwbCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImlwMm1lbSIsIE5VTEwpOwogCi0JLy8gZnJlZSBtZW1vcnkKKwkvKiBmcmVlIG1lbW9yeSAqLwogCWZvciAoaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgaSsrKSB7CiAJCXZvaWQgKnBCOwogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTQxNywyNCArNDE2LDE4IEBACiAJCQlpcDJjb25maWcucGNpX2RldltpXSA9IE5VTEw7CiAJCX0KICNlbmRpZgotCQlpZiAoKHBCID0gaTJCb2FyZFB0clRhYmxlW2ldKSAhPSAwICkgewotCQkJa2ZyZWUgKCBwQiApOworCQlwQiA9IGkyQm9hcmRQdHJUYWJsZVtpXTsKKwkJaWYgKHBCICE9IE5VTEwpIHsKKwkJCWtmcmVlKHBCKTsKIAkJCWkyQm9hcmRQdHJUYWJsZVtpXSA9IE5VTEw7CiAJCX0KLQkJaWYgKChEZXZUYWJsZU1lbVtpXSkgIT0gTlVMTCApIHsKLQkJCWtmcmVlICggRGV2VGFibGVNZW1baV0gICk7CisJCWlmIChEZXZUYWJsZU1lbVtpXSAhPSBOVUxMKSB7CisJCQlrZnJlZShEZXZUYWJsZU1lbVtpXSk7CiAJCQlEZXZUYWJsZU1lbVtpXSA9IE5VTEw7CiAJCX0KIAl9Ci0KLQkvKiBDbGVhbnVwIHRoZSBpaUVsbGlzIHN1YnN5c3RlbS4gKi8KLQlpaUVsbGlzQ2xlYW51cCgpOwotI2lmZGVmIElQMkRFQlVHX0lOSVQKLQlwcmludGsgKEtFUk5fREVCVUcgIklQMiBVbmxvYWRlZFxuIiApOwotI2VuZGlmCiB9CiBtb2R1bGVfZXhpdChpcDJfY2xlYW51cF9tb2R1bGUpOwotI2VuZGlmIC8qIE1PRFVMRSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGlwMl9vcHMgPSB7CiAJLm9wZW4gICAgICAgICAgICA9IGlwMl9vcGVuLApAQCAtNDk0LDEzOSArNDg3LDE2OCBAQAogCXJldHVybiBmdzsKIH0KIAotaW50Ci1pcDJfbG9hZG1haW4oaW50ICppb3AsIGludCAqaXJxcCkKKyNpZm5kZWYgTU9EVUxFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglpcDJfc2V0dXA6CisgKgkJc3RyOiBrZXJuZWwgY29tbWFuZCBsaW5lIHN0cmluZworICoKKyAqCUNhbid0IGF1dG9wcm9iZSB0aGUgYm9hcmRzIHNvIHVzZXIgbXVzdCBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gb24KKyAqCWtlcm5lbCBjb21tYW5kIGxpbmUuICBTYW5lIHBlb3BsZSBidWlsZCBpdCBtb2R1bGFyIGJ1dCB0aGUgb3RoZXJzCisgKgljb21lIGhlcmUuCisgKgorICoJQWx0ZXJuYXRpbmcgcGFpcnMgb2YgaW8saXJxIGZvciB1cCB0byA0IGJvYXJkcy4KKyAqCQlpcDI9aW8wLGlycTAsaW8xLGlycTEsaW8yLGlycTIsaW8zLGlycTMKKyAqCisgKgkJaW89MCA9PiBObyBib2FyZAorICoJCWlvPTEgPT4gUENJCisgKgkJaW89MiA9PiBFSVNBCisgKgkJZWxzZSA9PiBJU0EgSS9PIGFkZHJlc3MKKyAqCisgKgkJaXJxPTAgb3IgaW52YWxpZCBmb3IgSVNBIHdpbGwgcmV2ZXJ0IHRvIHBvbGxpbmcgbW9kZQorICoKKyAqCQlBbnkgdmFsdWUgPSAtMSwgZG8gbm90IG92ZXJ3cml0ZSBjb21waWxlZCBpbiB2YWx1ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgaXAyX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaiwgaW50c1sxMF07CS8qIDQgYm9hcmRzLCAyIHBhcmFtZXRlcnMgKyAyICovCisJdW5zaWduZWQgaW50IGk7CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yIChpID0gMCwgaiA9IDE7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGogPiBpbnRzWzBdKQorCQkJYnJlYWs7CisJCWlmIChpbnRzW2pdID49IDApCisJCQlpb1tpXSA9IGludHNbal07CisJCWorKzsKKwkJaWYgKGogPiBpbnRzWzBdKQorCQkJYnJlYWs7CisJCWlmIChpbnRzW2pdID49IDApCisJCQlpcnFbaV0gPSBpbnRzW2pdOworCQlqKys7CisJfQorCXJldHVybiAxOworfQorX19zZXR1cCgiaXAyPSIsIGlwMl9zZXR1cCk7CisjZW5kaWYgLyogIU1PRFVMRSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpcDJfbG9hZG1haW4odm9pZCkKIHsKIAlpbnQgaSwgaiwgYm94OwogCWludCBlcnIgPSAwOwotCXN0YXRpYyBpbnQgbG9hZGVkOwogCWkyZUJvcmRTdHJQdHIgcEIgPSBOVUxMOwogCWludCByYyA9IC0xOwotCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9pID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CiAKLQlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIElUUkNfRU5URVIsIDAgKTsKKwlpZiAocG9sbF9vbmx5KSB7CisJCS8qIEhhcmQgbG9jayB0aGUgaW50ZXJydXB0cyB0byB6ZXJvICovCisJCWlycVswXSA9IGlycVsxXSA9IGlycVsyXSA9IGlycVszXSA9IHBvbGxfb25seSA9IDA7CisJfQorCisJaXAydHJhY2UoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIElUUkNfRU5URVIsIDApOwogCiAJLyogcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIG1vZHByb2JlIG9yCiAJCWluc21vZCBpLmUuIGlvcCAmIGlycXAgKi8KIAkvKiBpcnFwIGFuZCBpb3Agc2hvdWxkIEFMV0FZUyBiZSBzcGVjaWZpZWQgbm93Li4uICBCdXQgd2UgY2hlY2sKIAkJdGhlbSBpbmRpdmlkdWFsbHkganVzdCB0byBiZSBzdXJlLCBhbnl3YXlzLi4uICovCi0JZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgewotCQlpZiAoaW9wKSB7Ci0JCQlpcDJjb25maWcuYWRkcltpXSA9IGlvcFtpXTsKLQkJCWlmIChpcnFwKSB7Ci0JCQkJaWYoIGlycXBbaV0gPj0gMCApIHsKLQkJCQkJaXAyY29uZmlnLmlycVtpXSA9IGlycXBbaV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXAyY29uZmlnLmlycVtpXSA9IDA7Ci0JCQkJfQotCS8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIGEgaGFjay4gIElmIHBvbGxfb25seT0xIG9uIGNvbW1hbmQKLQkvLyBsaW5lIGJhY2sgaW4gaXAyLmMgT1IgYWxsIElSUXMgb24gYWxsIHNwZWNpZmllZCBib2FyZHMgYXJlCi0JLy8gZXhwbGljaXRseSBzZXQgdG8gMCwgdGhlbiBkcm9wIHRvIHBvbGwgb25seSBtb2RlIGFuZCBvdmVycmlkZQotCS8vIFBDSSBvciBFSVNBIGludGVycnVwdHMuICBUaGlzIHN1cGVyY2VlZHMgdGhlIG9sZCBoYWNrIG9mCi0JLy8gdHJpZ2dlcmluZyBpZiBhbGwgaW50ZXJydXB0cyB3ZXJlIHplcm8gKGxpa2UgZGEgZGVmYXVsdCkuCi0JLy8gU3RpbGwgYSBoYWNrIGJ1dCBsZXNzIHByb25lIHRvIHJhbmRvbSBhY3RzIG9mIHRlcnJvcmlzbS4KLQkvLwotCS8vIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbywgbm93IHRoYXQgdGhlIElSUSBkZWZhdWx0IGlzIHNldAotCS8vIHRvIC0xLCBpcyB0byB1c2UgMCBhcyBhIGhhcmQgY29kZWQsIGRvIG5vdCBwcm9iZS4KLQkvLwotCS8vCS9cL1x8PW1odz18XC9cLwotCQkJCXBvbGxfb25seSB8PSBpcnFwW2ldOwotCQkJfQotCQl9CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKKwkJaXAyY29uZmlnLmFkZHJbaV0gPSBpb1tpXTsKKwkJaWYgKGlycVtpXSA+PSAwKQorCQkJaXAyY29uZmlnLmlycVtpXSA9IGlycVtpXTsKKwkJZWxzZQorCQkJaXAyY29uZmlnLmlycVtpXSA9IDA7CisJLyogVGhpcyBpcyBhIGxpdHRsZSBiaXQgb2YgYSBoYWNrLiAgSWYgcG9sbF9vbmx5PTEgb24gY29tbWFuZAorCSAgIGxpbmUgYmFjayBpbiBpcDIuYyBPUiBhbGwgSVJRcyBvbiBhbGwgc3BlY2lmaWVkIGJvYXJkcyBhcmUKKwkgICBleHBsaWNpdGx5IHNldCB0byAwLCB0aGVuIGRyb3AgdG8gcG9sbCBvbmx5IG1vZGUgYW5kIG92ZXJyaWRlCisJICAgUENJIG9yIEVJU0EgaW50ZXJydXB0cy4gIFRoaXMgc3VwZXJjZWVkcyB0aGUgb2xkIGhhY2sgb2YKKwkgICB0cmlnZ2VyaW5nIGlmIGFsbCBpbnRlcnJ1cHRzIHdlcmUgemVybyAobGlrZSBkYSBkZWZhdWx0KS4KKwkgICBTdGlsbCBhIGhhY2sgYnV0IGxlc3MgcHJvbmUgdG8gcmFuZG9tIGFjdHMgb2YgdGVycm9yaXNtLgorCisJICAgV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvLCBub3cgdGhhdCB0aGUgSVJRIGRlZmF1bHQgaXMgc2V0CisJICAgdG8gLTEsIGlzIHRvIHVzZSAwIGFzIGEgaGFyZCBjb2RlZCwgZG8gbm90IHByb2JlLgorCisJCS9cL1x8PW1odz18XC9cLworCSovCisJCXBvbGxfb25seSB8PSBpcnFbaV07CiAJfQogCXBvbGxfb25seSA9ICFwb2xsX29ubHk7CiAKIAkvKiBBbm5vdW5jZSBvdXIgcHJlc2VuY2UgKi8KLQlwcmludGsoIEtFUk5fSU5GTyAiJXMgdmVyc2lvbiAlc1xuIiwgcGNOYW1lLCBwY1ZlcnNpb24gKTsKLQotCS8vIGlwMiBjYW4gYmUgdW5sb2FkZWQgYW5kIHJlbG9hZGVkIGZvciBubyBnb29kIHJlYXNvbgotCS8vIHdlIGNhbid0IGxldCB0aGF0IGhhcHBlbiBoZXJlIG9yIGJhZCB0aGluZ3MgaGFwcGVuCi0JLy8gc2Vjb25kIGxvYWQgaG9zZXMgYm9hcmQgYnV0IG5vdCBzeXN0ZW0gLSBmaXhtZSBsYXRlcgotCWlmIChsb2FkZWQpIHsKLQkJcHJpbnRrKCBLRVJOX0lORk8gIlN0aWxsIGxvYWRlZFxuIiApOwotCQlyZXR1cm4gMDsKLQl9Ci0JbG9hZGVkKys7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdmVyc2lvbiAlc1xuIiwgcGNOYW1lLCBwY1ZlcnNpb24pOwogCiAJaXAyX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKElQMl9NQVhfUE9SVFMpOwogCWlmICghaXAyX3R0eV9kcml2ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogSW5pdGlhbGlzZSB0aGUgaWlFbGxpcyBzdWJzeXN0ZW0uICovCi0JaWlFbGxpc0luaXQoKTsKLQotCS8qIEluaXRpYWxpemUgYXJyYXlzLiAqLwotCW1lbXNldCggaTJCb2FyZFB0clRhYmxlLCAwLCBzaXplb2YgaTJCb2FyZFB0clRhYmxlICk7Ci0JbWVtc2V0KCBEZXZUYWJsZSwgMCwgc2l6ZW9mIERldlRhYmxlICk7Ci0KIAkvKiBJbml0aWFsaXNlIGFsbCB0aGUgYm9hcmRzIHdlIGNhbiBmaW5kICh1cCB0byB0aGUgbWF4aW11bSkuICovCi0JZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgewotCQlzd2l0Y2ggKCBpcDJjb25maWcuYWRkcltpXSApIHsgCisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKKwkJc3dpdGNoIChpcDJjb25maWcuYWRkcltpXSkgewogCQljYXNlIDA6CS8qIHNraXAgdGhpcyBzbG90IGV2ZW4gaWYgY2FyZCBpcyBwcmVzZW50ICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDogLyogSVNBICovCiAJCSAgIC8qIElTQSBhZGRyZXNzIG11c3QgYmUgc3BlY2lmaWVkICovCi0JCQlpZiAoIChpcDJjb25maWcuYWRkcltpXSA8IDB4MTAwKSB8fCAoaXAyY29uZmlnLmFkZHJbaV0gPiAweDNmOCkgKSB7Ci0JCQkJcHJpbnRrICggS0VSTl9FUlIgIklQMjogQmFkIElTQSBib2FyZCAlZCBhZGRyZXNzICV4XG4iLAotCQkJCQkJCSBpLCBpcDJjb25maWcuYWRkcltpXSApOworCQkJaWYgKGlwMmNvbmZpZy5hZGRyW2ldIDwgMHgxMDAgfHwKKwkJCQkJaXAyY29uZmlnLmFkZHJbaV0gPiAweDNmOCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBCYWQgSVNBIGJvYXJkICVkICIKKwkJCQkJCSJhZGRyZXNzICV4XG4iLCBpLAorCQkJCQkJaXAyY29uZmlnLmFkZHJbaV0pOwogCQkJCWlwMmNvbmZpZy5hZGRyW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaXAyY29uZmlnLnR5cGVbaV0gPSBJU0E7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpcDJjb25maWcudHlwZVtpXSA9IElTQTsKIAotCQkJCS8qIENoZWNrIGZvciB2YWxpZCBpcnEgYXJndW1lbnQsIHNldCBmb3IgcG9sbGluZyBpZiBpbnZhbGlkICovCi0JCQkJaWYgKGlwMmNvbmZpZy5pcnFbaV0gJiYgIWlzX3ZhbGlkX2lycShpcDJjb25maWcuaXJxW2ldKSkgewotCQkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogQmFkIElSUSglZCkgc3BlY2lmaWVkXG4iLGlwMmNvbmZpZy5pcnFbaV0pOwotCQkJCQlpcDJjb25maWcuaXJxW2ldID0gMDsvLyAwIGlzIHBvbGxpbmcgYW5kIGlzIHZhbGlkIGluIHRoYXQgc2Vuc2UKLQkJCQl9CisJCQkvKiBDaGVjayBmb3IgdmFsaWQgaXJxIGFyZ3VtZW50LCBzZXQgZm9yIHBvbGxpbmcgaWYKKwkJCSAqIGludmFsaWQgKi8KKwkJCWlmIChpcDJjb25maWcuaXJxW2ldICYmCisJCQkJCSFpc192YWxpZF9pcnEoaXAyY29uZmlnLmlycVtpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogQmFkIElSUSglZCkgc3BlY2lmaWVkXG4iLAorCQkJCQkJaXAyY29uZmlnLmlycVtpXSk7CisJCQkJLyogMCBpcyBwb2xsaW5nIGFuZCBpcyB2YWxpZCBpbiB0aGF0IHNlbnNlICovCisJCQkJaXAyY29uZmlnLmlycVtpXSA9IDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQQ0k6CiAjaWZkZWYgQ09ORklHX1BDSQotCQkJewotCQkJCWludCBzdGF0dXM7CisJCXsKKwkJCXUzMiBhZGRyOworCQkJaW50IHN0YXR1czsKIAotCQkJCXBjaV9kZXZfaSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQ09NUFVUT05FLAotCQkJCQkJCSAgUENJX0RFVklDRV9JRF9DT01QVVRPTkVfSVAyRVgsIHBjaV9kZXZfaSk7Ci0JCQkJaWYgKHBjaV9kZXZfaSAhPSBOVUxMKSB7Ci0JCQkJCXVuc2lnbmVkIGludCBhZGRyOwotCi0JCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2X2kpKSB7Ci0JCQkJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IGNhbid0IGVuYWJsZSBQQ0kgZGV2aWNlIGF0ICVzXG4iLAotCQkJCQkJCXBjaV9uYW1lKHBjaV9kZXZfaSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaXAyY29uZmlnLnR5cGVbaV0gPSBQQ0k7Ci0JCQkJCWlwMmNvbmZpZy5wY2lfZGV2W2ldID0gcGNpX2Rldl9nZXQocGNpX2Rldl9pKTsKLQkJCQkJc3RhdHVzID0KLQkJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZfaSwgUENJX0JBU0VfQUREUkVTU18xLCAmYWRkcik7Ci0JCQkJCWlmICggYWRkciAmIDEgKSB7Ci0JCQkJCQlpcDJjb25maWcuYWRkcltpXT0oVVNIT1JUKShhZGRyJjB4ZmZmZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBJL08gYWRkcmVzcyBlcnJvclxuIik7Ci0JCQkJCX0KLQotLy8JCUlmIHRoZSBQQ0kgQklPUyBhc3NpZ25lZCBpdCwgbGV0cyB0cnkgYW5kIHVzZSBpdC4gIElmIHdlCi0vLwkJY2FuJ3QgYWNxdWlyZSBpdCBvciBpdCBzY3Jld3MgdXAsIGRlYWwgd2l0aCBpdCB0aGVuLgotCi0vLwkJCQkJaWYgKCFpc192YWxpZF9pcnEocGNpX2lycSkpIHsKLS8vCQkJCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBCYWQgUENJIEJJT1MgSVJRKCVkKVxuIixwY2lfaXJxKTsKLS8vCQkJCQkJcGNpX2lycSA9IDA7Ci0vLwkJCQkJfQotCQkJCQlpcDJjb25maWcuaXJxW2ldID0gcGNpX2Rldl9pLT5pcnE7Ci0JCQkJfSBlbHNlIHsJLy8gYW5uIGVycm9yCi0JCQkJCWlwMmNvbmZpZy5hZGRyW2ldID0gMDsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IFBDSSBib2FyZCAlZCBub3QgZm91bmRcbiIsIGkpOwotCQkJCX0gCisJCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9DT01QVVRPTkUsCisJCQkJCVBDSV9ERVZJQ0VfSURfQ09NUFVUT05FX0lQMkVYLCBwZGV2KTsKKwkJCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJCQlpcDJjb25maWcuYWRkcltpXSA9IDA7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IFBDSSBib2FyZCAlZCBub3QgIgorCQkJCQkJImZvdW5kXG4iLCBpKTsKKwkJCQlicmVhazsKIAkJCX0KKworCQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIGRldmljZVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpcDJjb25maWcudHlwZVtpXSA9IFBDSTsKKwkJCWlwMmNvbmZpZy5wY2lfZGV2W2ldID0gcGNpX2Rldl9nZXQocGRldik7CisJCQlzdGF0dXMgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18xLAorCQkJCQkmYWRkcik7CisJCQlpZiAoYWRkciAmIDEpCisJCQkJaXAyY29uZmlnLmFkZHJbaV0gPSAoVVNIT1JUKShhZGRyICYgMHhmZmZlKTsKKwkJCWVsc2UKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJL08gYWRkcmVzcyBlcnJvclxuIik7CisKKwkJCWlwMmNvbmZpZy5pcnFbaV0gPSBwZGV2LT5pcnE7CisJCX0KICNlbHNlCi0JCQlwcmludGsoIEtFUk5fRVJSICJJUDI6IFBDSSBjYXJkIHNwZWNpZmllZCBidXQgUENJIHN1cHBvcnQgbm90XG4iKTsKLQkJCXByaW50ayggS0VSTl9FUlIgIklQMjogY29uZmlndXJlZCBpbiB0aGlzIGtlcm5lbC5cbiIpOwotCQkJcHJpbnRrKCBLRVJOX0VSUiAiSVAyOiBSZWNvbXBpbGUga2VybmVsIHdpdGggQ09ORklHX1BDSSBkZWZpbmVkIVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIklQMjogUENJIGNhcmQgc3BlY2lmaWVkIGJ1dCBQQ0kgIgorCQkJCQkic3VwcG9ydCBub3QgZW5hYmxlZC5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IFJlY29tcGlsZSBrZXJuZWwgd2l0aCBDT05GSUdfUENJICIKKwkJCQkJImRlZmluZWQhXG4iKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAJCQlicmVhazsKIAkJY2FzZSBFSVNBOgotCQkJaWYgKCAoaXAyY29uZmlnLmFkZHJbaV0gPSBmaW5kX2Vpc2FfYm9hcmQoIEVpc2Ffc2xvdCArIDEgKSkgIT0gMCkgeworCQkJaXAyY29uZmlnLmFkZHJbaV0gPSBmaW5kX2Vpc2FfYm9hcmQoRWlzYV9zbG90ICsgMSk7CisJCQlpZiAoaXAyY29uZmlnLmFkZHJbaV0gIT0gMCkgewogCQkJCS8qIEVpc2FfaXJxIHNldCBhcyBzaWRlIGVmZmVjdCwgYm9vICovCiAJCQkJaXAyY29uZmlnLnR5cGVbaV0gPSBFSVNBOwogCQkJfSAKQEAgLTYzNCwzMSArNjU2LDMyIEBACiAJCQlicmVhazsKIAkJfQkvKiBzd2l0Y2ggKi8KIAl9CS8qIGZvciAqLwotCWlmIChwY2lfZGV2X2kpCi0JCXBjaV9kZXZfcHV0KHBjaV9kZXZfaSk7CisJcGNpX2Rldl9wdXQocGRldik7CiAKLQlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7Ci0JCWlmICggaXAyY29uZmlnLmFkZHJbaV0gKSB7CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKKwkJaWYgKGlwMmNvbmZpZy5hZGRyW2ldKSB7CiAJCQlwQiA9IGt6YWxsb2Moc2l6ZW9mKGkyZUJvcmRTdHIpLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChwQikgewogCQkJCWkyQm9hcmRQdHJUYWJsZVtpXSA9IHBCOwotCQkJCWlpU2V0QWRkcmVzcyggcEIsIGlwMmNvbmZpZy5hZGRyW2ldLCBpaTJEZWxheVRpbWVyICk7Ci0JCQkJaWlSZXNldCggcEIgKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGJvYXJkIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKLQkJCX0KKwkJCQlpaVNldEFkZHJlc3MocEIsIGlwMmNvbmZpZy5hZGRyW2ldLAorCQkJCQkJaWkyRGVsYXlUaW1lcik7CisJCQkJaWlSZXNldChwQik7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogYm9hcmQgbWVtb3J5IGFsbG9jYXRpb24gIgorCQkJCQkJImVycm9yXG4iKTsKIAkJfQogCX0KLQlmb3IgKCBpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kgKSB7Ci0JCWlmICggKCBwQiA9IGkyQm9hcmRQdHJUYWJsZVtpXSApICE9IE5VTEwgKSB7Ci0JCQlpaVJlc2V0RGVsYXkoIHBCICk7CisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKKwkJcEIgPSBpMkJvYXJkUHRyVGFibGVbaV07CisJCWlmIChwQiAhPSBOVUxMKSB7CisJCQlpaVJlc2V0RGVsYXkocEIpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JZm9yICggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgeworCWZvciAoaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpKSB7CiAJCS8qIFdlIGRvbid0IHdhbnQgdG8gcmVxdWVzdCB0aGUgZmlybXdhcmUgdW5sZXNzIHdlIGhhdmUgYXQKIAkJICAgbGVhc3Qgb25lIGJvYXJkICovCi0JCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICE9IE5VTEwgKSB7CisJCWlmIChpMkJvYXJkUHRyVGFibGVbaV0gIT0gTlVMTCkgewogCQkJaWYgKCFmdykKIAkJCQlmdyA9IGlwMl9yZXF1ZXN0X2Zpcm13YXJlKCk7CiAJCQlpZiAoIWZ3KQpAQCAtNjY5LDcgKzY5Miw3IEBACiAJaWYgKGZ3KQogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAotCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMiwgMCApOworCWlwMnRyYWNlKElUUkNfTk9fUE9SVCwgSVRSQ19JTklULCAyLCAwKTsKIAogCWlwMl90dHlfZHJpdmVyLT5vd25lcgkJICAgID0gVEhJU19NT0RVTEU7CiAJaXAyX3R0eV9kcml2ZXItPm5hbWUgICAgICAgICAgICAgICAgID0gInR0eUYiOwpAQCAtNjgwLDIwICs3MDMsMjMgQEAKIAlpcDJfdHR5X2RyaXZlci0+c3VidHlwZSAgICAgICAgICAgICAgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CiAJaXAyX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyAgICAgICAgID0gdHR5X3N0ZF90ZXJtaW9zOwogCWlwMl90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwfENTOHxDUkVBRHxIVVBDTHxDTE9DQUw7Ci0JaXAyX3R0eV9kcml2ZXItPmZsYWdzICAgICAgICAgICAgICAgID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CisJaXAyX3R0eV9kcml2ZXItPmZsYWdzICAgICAgICAgICAgICAgID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCVRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CiAJdHR5X3NldF9vcGVyYXRpb25zKGlwMl90dHlfZHJpdmVyLCAmaXAyX29wcyk7CiAKLQlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIDMsIDAgKTsKKwlpcDJ0cmFjZShJVFJDX05PX1BPUlQsIElUUkNfSU5JVCwgMywgMCk7CiAKLQkvKiBSZWdpc3RlciB0aGUgdHR5IGRldmljZXMuICovCi0JaWYgKCAoIGVyciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIgKCBpcDJfdHR5X2RyaXZlciApICkgKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVAyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgdHR5IGRyaXZlciAoJWQpXG4iLCBlcnIpOworCWVyciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciB0dHkgZHJpdmVyXG4iKTsKIAkJcHV0X3R0eV9kcml2ZXIoaXAyX3R0eV9kcml2ZXIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UKLQkvKiBSZWdpc3RlciB0aGUgSVBMIGRyaXZlci4gKi8KLQlpZiAoICggZXJyID0gcmVnaXN0ZXJfY2hyZGV2ICggSVAyX0lQTF9NQUpPUiwgcGNJcGwsICZpcDJfaXBsICkgKSApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciBJUEwgZGV2aWNlICglZClcbiIsIGVyciApOworCQlyZXR1cm4gZXJyOyAvKiBsZWFraW5nIHJlc291cmNlcyAqLworCX0KKworCWVyciA9IHJlZ2lzdGVyX2NocmRldihJUDJfSVBMX01BSk9SLCBwY0lwbCwgJmlwMl9pcGwpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGZhaWxlZCB0byByZWdpc3RlciBJUEwgZGV2aWNlICglZClcbiIsCisJCQkJZXJyKTsKIAl9IGVsc2UgewogCQkvKiBjcmVhdGUgdGhlIHN5c2ZzIGNsYXNzICovCiAJCWlwMl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImlwMiIpOwpAQCAtNzA1LDg0ICs3MzEsODYgQEAKIAkvKiBSZWdpc3RlciB0aGUgcmVhZF9wcm9jbWVtIHRoaW5nICovCiAJaWYgKCFwcm9jX2NyZWF0ZSgiaXAybWVtIiwwLE5VTEwsJmlwMm1lbV9wcm9jX2ZvcHMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSVAyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgcmVhZF9wcm9jbWVtXG4iKTsKLQl9IGVsc2UgeworCQlyZXR1cm4gLUVJTzsgLyogbGVha2luZyByZXNvdXJjZXMgKi8KKwl9CiAKLQlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIDQsIDAgKTsKLQkJLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyIG9yIHBvbGwgaGFuZGxlciwgZGVwZW5kaW5nIHVwb24gdGhlCi0JCSAqIHNwZWNpZmllZCBpbnRlcnJ1cHQuCi0JCSAqLworCWlwMnRyYWNlKElUUkNfTk9fUE9SVCwgSVRSQ19JTklULCA0LCAwKTsKKwkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgb3IgcG9sbCBoYW5kbGVyLCBkZXBlbmRpbmcgdXBvbiB0aGUKKwkgKiBzcGVjaWZpZWQgaW50ZXJydXB0LgorCSAqLwogCi0JCWZvciggaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpICkgewotCQkJaWYgKCAwID09IGlwMmNvbmZpZy5hZGRyW2ldICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBJUDJfTUFYX0JPQVJEUzsgKytpKSB7CisJCWlmIChpcDJjb25maWcuYWRkcltpXSA9PSAwKQorCQkJY29udGludWU7CiAKLQkJCWlmICggTlVMTCAhPSAoIHBCID0gaTJCb2FyZFB0clRhYmxlW2ldICkgKSB7Ci0JCQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGlwMl9jbGFzcywgTlVMTCwKLQkJCQkJCSAgICAgIE1LREVWKElQMl9JUExfTUFKT1IsIDQgKiBpKSwKLQkJCQkJCSAgICAgIE5VTEwsICJpcGwlZCIsIGkpOwotCQkJCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShpcDJfY2xhc3MsIE5VTEwsCi0JCQkJCQkgICAgICBNS0RFVihJUDJfSVBMX01BSk9SLCA0ICogaSArIDEpLAotCQkJCQkJICAgICAgTlVMTCwgInN0YXQlZCIsIGkpOworCQlwQiA9IGkyQm9hcmRQdHJUYWJsZVtpXTsKKwkJaWYgKHBCICE9IE5VTEwpIHsKKwkJCWRldmljZV9jcmVhdGUoaXAyX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgIE1LREVWKElQMl9JUExfTUFKT1IsIDQgKiBpKSwKKwkJCQkgICAgICBOVUxMLCAiaXBsJWQiLCBpKTsKKwkJCWRldmljZV9jcmVhdGUoaXAyX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgIE1LREVWKElQMl9JUExfTUFKT1IsIDQgKiBpICsgMSksCisJCQkJICAgICAgTlVMTCwgInN0YXQlZCIsIGkpOwogCi0JCQkgICAgZm9yICggYm94ID0gMDsgYm94IDwgQUJTX01BWF9CT1hFUzsgKytib3ggKQotCQkJICAgIHsKLQkJCSAgICAgICAgZm9yICggaiA9IDA7IGogPCBBQlNfQklHR0VTVF9CT1g7ICsraiApCi0JCQkgICAgICAgIHsKLQkJCQkgICAgaWYgKCBwQi0+aTJlQ2hhbm5lbE1hcFtib3hdICYgKDEgPDwgaikgKQotCQkJCSAgICB7Ci0JCQkJICAgICAgICB0dHlfcmVnaXN0ZXJfZGV2aWNlKGlwMl90dHlfZHJpdmVyLAotCQkJCQkgICAgaiArIEFCU19CSUdHRVNUX0JPWCAqCi0JCQkJCQkgICAgKGJveCtpKkFCU19NQVhfQk9YRVMpLCBOVUxMKTsKLQkJCSAgICAJICAgIH0KLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0KLQotCQkJaWYgKHBvbGxfb25seSkgewotLy8JCVBvbGwgb25seSBmb3JjZXMgZHJpdmVyIHRvIG9ubHkgdXNlIHBvbGxpbmcgYW5kCi0vLwkJdG8gaWdub3JlIHRoZSBwcm9iZWQgUENJIG9yIEVJU0EgaW50ZXJydXB0cy4KLQkJCQlpcDJjb25maWcuaXJxW2ldID0gQ0lSX1BPTEw7Ci0JCQl9Ci0JCQlpZiAoIGlwMmNvbmZpZy5pcnFbaV0gPT0gQ0lSX1BPTEwgKSB7Ci1yZXRyeToKLQkJCQlpZiAoIVRpbWVyT24pIHsKLQkJCQkJUG9sbFRpbWVyLmV4cGlyZXMgPSBQT0xMX1RJTUVPVVQ7Ci0JCQkJCWFkZF90aW1lciAoICZQb2xsVGltZXIgKTsKLQkJCQkJVGltZXJPbiA9IDE7Ci0JCQkJCXByaW50ayggS0VSTl9JTkZPICJJUDI6IHBvbGxpbmdcbiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhhdmVfcmVxdWVzdGVkX2lycShpcDJjb25maWcuaXJxW2ldKSkKLQkJCQkJY29udGludWU7Ci0JCQkJcmMgPSByZXF1ZXN0X2lycSggaXAyY29uZmlnLmlycVtpXSwgaXAyX2ludGVycnVwdCwKLQkJCQkJSVAyX1NBX0ZMQUdTIHwgKGlwMmNvbmZpZy50eXBlW2ldID09IFBDSSA/IElSUUZfU0hBUkVEIDogMCksCi0JCQkJCXBjTmFtZSwgaTJCb2FyZFB0clRhYmxlW2ldKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJJUDI6IGFuIHJlcXVlc3RfaXJxIGZhaWxlZDogZXJyb3IgJWRcbiIscmMpOwotCQkJCQlpcDJjb25maWcuaXJxW2ldID0gQ0lSX1BPTEw7Ci0JCQkJCXByaW50ayggS0VSTl9JTkZPICJJUDI6IFBvbGxpbmcgJWxkL3NlYy5cbiIsCi0JCQkJCQkJKFBPTExfVElNRU9VVCAtIGppZmZpZXMpKTsKLQkJCQkJZ290byByZXRyeTsKLQkJCQl9IAotCQkJCW1hcmtfcmVxdWVzdGVkX2lycShpcDJjb25maWcuaXJxW2ldKTsKLQkJCQkvKiBJbml0aWFsaXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBib3R0b20gaGFsZiAoYWthIHNsaWgpLiAqLwotCQkJfQorCQkJZm9yIChib3ggPSAwOyBib3ggPCBBQlNfTUFYX0JPWEVTOyBib3grKykKKwkJCQlmb3IgKGogPSAwOyBqIDwgQUJTX0JJR0dFU1RfQk9YOyBqKyspCisJCQkJCWlmIChwQi0+aTJlQ2hhbm5lbE1hcFtib3hdICYgKDEgPDwgaikpCisJCQkJCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKAorCQkJCQkJCWlwMl90dHlfZHJpdmVyLAorCQkJCQkJCWogKyBBQlNfQklHR0VTVF9CT1ggKgorCQkJCQkJCShib3graSpBQlNfTUFYX0JPWEVTKSwKKwkJCQkJCQlOVUxMKTsKIAkJfQotCQlmb3IoIGkgPSAwOyBpIDwgSVAyX01BWF9CT0FSRFM7ICsraSApIHsKLQkJCWlmICggaTJCb2FyZFB0clRhYmxlW2ldICkgewotCQkJCXNldF9pcnEoIGksIGlwMmNvbmZpZy5pcnFbaV0gKTsgLyogc2V0IGFuZCBlbmFibGUgYm9hcmQgaW50ZXJydXB0ICovCisKKwkJaWYgKHBvbGxfb25seSkgeworCQkJLyogUG9sbCBvbmx5IGZvcmNlcyBkcml2ZXIgdG8gb25seSB1c2UgcG9sbGluZyBhbmQKKwkJCSAgIHRvIGlnbm9yZSB0aGUgcHJvYmVkIFBDSSBvciBFSVNBIGludGVycnVwdHMuICovCisJCQlpcDJjb25maWcuaXJxW2ldID0gQ0lSX1BPTEw7CisJCX0KKwkJaWYgKGlwMmNvbmZpZy5pcnFbaV0gPT0gQ0lSX1BPTEwpIHsKK3JldHJ5OgorCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZQb2xsVGltZXIpKSB7CisJCQkJbW9kX3RpbWVyKCZQb2xsVGltZXIsIFBPTExfVElNRU9VVCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBwb2xsaW5nXG4iKTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChoYXZlX3JlcXVlc3RlZF9pcnEoaXAyY29uZmlnLmlycVtpXSkpCisJCQkJY29udGludWU7CisJCQlyYyA9IHJlcXVlc3RfaXJxKGlwMmNvbmZpZy5pcnFbaV0sIGlwMl9pbnRlcnJ1cHQsCisJCQkJSVAyX1NBX0ZMQUdTIHwKKwkJCQkoaXAyY29uZmlnLnR5cGVbaV0gPT0gUENJID8gSVJRRl9TSEFSRUQgOiAwKSwKKwkJCQlwY05hbWUsIGkyQm9hcmRQdHJUYWJsZVtpXSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIklQMjogcmVxdWVzdF9pcnEgZmFpbGVkOiAiCisJCQkJCQkiZXJyb3IgJWRcbiIsIHJjKTsKKwkJCQlpcDJjb25maWcuaXJxW2ldID0gQ0lSX1BPTEw7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVAyOiBQb2xsaW5nICVsZC9zZWMuXG4iLAorCQkJCQkJKFBPTExfVElNRU9VVCAtIGppZmZpZXMpKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJbWFya19yZXF1ZXN0ZWRfaXJxKGlwMmNvbmZpZy5pcnFbaV0pOworCQkJLyogSW5pdGlhbGlzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYm90dG9tIGhhbGYKKwkJCSAqIChha2Egc2xpaCkuICovCiAJCX0KIAl9Ci0JaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTklULCBJVFJDX1JFVFVSTiwgMCApOwotCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IElQMl9NQVhfQk9BUkRTOyArK2kpIHsKKwkJaWYgKGkyQm9hcmRQdHJUYWJsZVtpXSkgeworCQkJLyogc2V0IGFuZCBlbmFibGUgYm9hcmQgaW50ZXJydXB0ICovCisJCQlzZXRfaXJxKGksIGlwMmNvbmZpZy5pcnFbaV0pOworCQl9CisJfQorCisJaXAydHJhY2UoSVRSQ19OT19QT1JULCBJVFJDX0lOSVQsIElUUkNfUkVUVVJOLCAwKTsKKworCXJldHVybiAwOwogCiBvdXRfY2hyZGV2OgogCXVucmVnaXN0ZXJfY2hyZGV2KElQMl9JUExfTUFKT1IsICJpcDIiKTsKLW91dDoKKwkvKiB1bnJlZ2lzdGVyIGFuZCBwdXQgdHR5IGhlcmUgKi8KIAlyZXR1cm4gZXJyOwogfQorbW9kdWxlX2luaXQoaXAyX2xvYWRtYWluKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZ1bmN0aW9uOiAgIGlwMl9pbml0X2JvYXJkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTk5LDkgKzEyMjcsOCBAQAogewogCWludCBpOwogCWkyZUJvcmRTdHJQdHIgIHBCOwotCWNvbnN0IGludCBpcnEgPSAwOwogCi0JaXAydHJhY2UgKElUUkNfTk9fUE9SVCwgSVRSQ19JTlRSLCA5OSwgMSwgaXJxICk7CisJaXAydHJhY2UoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIDk5LCAxLCAwKTsKIAogCS8qIFNlcnZpY2UganVzdCB0aGUgYm9hcmRzIG9uIHRoZSBsaXN0IHVzaW5nIHRoaXMgaXJxICovCiAJZm9yKCBpID0gMDsgaSA8IGkybkJvYXJkczsgKytpICkgewpAQCAtMTIxMCw5ICsxMjM3LDggQEAKIC8vCQlPbmx5IHByb2Nlc3MgdGhvc2UgYm9hcmRzIHdoaWNoIG1hdGNoIG91ciBJUlEuCiAvLwkJCUlSUSA9IDAgZm9yIHBvbGxlZCBib2FyZHMsIHdlIHdvbid0IHBvbGwgIklSUSIgYm9hcmRzCiAKLQkJaWYgKCBwQiAmJiAocEItPmkyZVVzaW5nSXJxID09IGlycSkgKSB7CisJCWlmIChwQiAmJiBwQi0+aTJlVXNpbmdJcnEgPT0gMCkKIAkJCWlwMl9pcnFfd29yayhwQik7Ci0JCX0KIAl9CiAKIAkrK2lycV9jb3VudGVyOwpAQCAtMTI1MCwxNiArMTI3NiwxMiBAQAogewogCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgMTAwLCAwICk7CiAKLQlUaW1lck9uID0gMDsgLy8gaXQncyB0aGUgdHJ1dGggYnV0IG5vdCBjaGVja2VkIGluIHNlcnZpY2UKLQogCS8vIEp1c3QgcG9sbGVkIGJvYXJkcywgSVJRID0gMCB3aWxsIGhpdCBhbGwgbm9uLWludGVycnVwdCBib2FyZHMuCiAJLy8gSXQgd2lsbCBOT1QgcG9sbCBib2FyZHMgaGFuZGxlZCBieSBoYXJkIGludGVycnVwdHMuCiAJLy8gVGhlIGlzc3VlIG9mIHF1ZXVlZCBCSCBpbnRlcnJ1cHRzIGlzIGhhbmRsZWQgaW4gaXAyX2ludGVycnVwdCgpLgogCWlwMl9wb2xsZWRfaW50ZXJydXB0KCk7CiAKLQlQb2xsVGltZXIuZXhwaXJlcyA9IFBPTExfVElNRU9VVDsKLQlhZGRfdGltZXIoICZQb2xsVGltZXIgKTsKLQlUaW1lck9uID0gMTsKKwltb2RfdGltZXIoJlBvbGxUaW1lciwgUE9MTF9USU1FT1VUKTsKIAogCWlwMnRyYWNlIChJVFJDX05PX1BPUlQsIElUUkNfSU5UUiwgSVRSQ19SRVRVUk4sIDAgKTsKIH0KQEAgLTI4NzEsNyArMjg5Myw3IEBACiAJY2FzZSAxMzoKIAkJc3dpdGNoICggY21kICkgewogCQljYXNlIDY0OgkvKiBEcml2ZXIgLSBpcDJzdGF0ICovCi0JCQlyYyA9IHB1dF91c2VyKGlwMl90dHlfZHJpdmVyLT5yZWZjb3VudCwgcEluZGV4KysgKTsKKwkJCXJjID0gcHV0X3VzZXIoLTEsIHBJbmRleCsrICk7CiAJCQlyYyA9IHB1dF91c2VyKGlycV9jb3VudGVyLCBwSW5kZXgrKyAgKTsKIAkJCXJjID0gcHV0X3VzZXIoYmhfY291bnRlciwgcEluZGV4KysgICk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKaW5kZXggNjRlMWMxNi4uODM1YTMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKQEAgLTg3MSw3ICs4NzEsNyBAQAogCWVudHJ5LT5kZXYgPSBkZXY7CiAKIAltdXRleF9sb2NrKCZyZWdfbGlzdF9tdXRleCk7Ci0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGlwbWlfY2xhc3MsIGRldmljZSwgZGV2LCBOVUxMLCAiaXBtaSVkIiwgaWZfbnVtKTsKKwlkZXZpY2VfY3JlYXRlKGlwbWlfY2xhc3MsIGRldmljZSwgZGV2LCBOVUxMLCAiaXBtaSVkIiwgaWZfbnVtKTsKIAlsaXN0X2FkZCgmZW50cnktPmxpbmssICZyZWdfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZyZWdfbGlzdF9tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IDhlOGFmYjYuLjMxMjNiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0yNjk1LDcgKzI2OTUsNyBAQAogCWZvciAoaSA9IDA7IDsgaSsrKSB7CiAJCWlmICghaXBtaV9kZWZhdWx0c1tpXS5wb3J0KQogCQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1BQQ19NRVJHRQorI2lmZGVmIENPTkZJR19QUEMKIAkJaWYgKGNoZWNrX2xlZ2FjeV9pb3BvcnQoaXBtaV9kZWZhdWx0c1tpXS5wb3J0KSkKIAkJCWNvbnRpbnVlOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggOGY3Y2MxOS4uN2QzMGVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtNDIxLDE3ICs0MjEsMTYgQEAKIAlpZiAocmV0cmllcyA+PSAxMDApCiAJCWdvdG8gdW5sb2NrOwogCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJaWYgKHR0eSA9PSBOVUxMKQorCQlnb3RvIHB1dF91bmxvY2s7CisKIAlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tLCBwb3J0KyspIHsKIAkJLyogcG9ydCBub3QgYWN0aXZlIG9yIHR4IGRpc2FibGVkIHRvIGZvcmNlIGZsb3cgY29udHJvbCAqLwogCQlpZiAoIShwb3J0LT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHx8CiAJCQkJIShwb3J0LT5zdGF0dXMgJiBJU0lfVFhPSykpCiAJCQljb250aW51ZTsKIAotCQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKLQotCQlpZiAodHR5ID09IE5VTEwpCi0JCQljb250aW51ZTsKLQogCQl0eGNvdW50ID0gbWluX3Qoc2hvcnQsIFRYX1NJWkUsIHBvcnQtPnhtaXRfY250KTsKIAkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKQogCQkJY29udGludWU7CkBAIC00ODksNiArNDg4LDggQEAKIAkJCXR0eV93YWtldXAodHR5KTsKIAl9CiAKK3B1dF91bmxvY2s6CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNpX2NhcmRbY2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7CiAJLyoJc2NoZWR1bGUgYW5vdGhlciB0eCBmb3IgaG9wZWZ1bGx5IGluIGFib3V0IDEwbXMJKi8KQEAgLTU0Nyw3ICs1NDgsNyBAQAogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSA9PSBOVUxMKSB7CiAJCXdvcmRfY291bnQgPSBieXRlX2NvdW50ID4+IDE7CiAJCXdoaWxlIChieXRlX2NvdW50ID4gMSkgewpAQCAtNTg4LDcgKzU4OSw3IEBACiAJCQl9CiAKIAkJCWlmIChwb3J0LT5wb3J0LmZsYWdzICYgQVNZTkNfQ1RTX0ZMT1cpIHsKLQkJCQlpZiAocG9ydC0+cG9ydC50dHktPmh3X3N0b3BwZWQpIHsKKwkJCQlpZiAodHR5LT5od19zdG9wcGVkKSB7CiAJCQkJCWlmIChoZWFkZXIgJiBJU0lfQ1RTKSB7CiAJCQkJCQlwb3J0LT5wb3J0LnR0eS0+aHdfc3RvcHBlZCA9IDA7CiAJCQkJCQkvKiBzdGFydCB0eCBpbmcgKi8KQEAgLTU5Nyw3ICs1OTgsNyBAQAogCQkJCQkJdHR5X3dha2V1cCh0dHkpOwogCQkJCQl9CiAJCQkJfSBlbHNlIGlmICghKGhlYWRlciAmIElTSV9DVFMpKSB7Ci0JCQkJCXBvcnQtPnBvcnQudHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJdHR5LT5od19zdG9wcGVkID0gMTsKIAkJCQkJLyogc3RvcCB0eCBpbmcgKi8KIAkJCQkJcG9ydC0+c3RhdHVzICY9IH4oSVNJX1RYT0sgfCBJU0lfQ1RTKTsKIAkJCQl9CkBAIC02NjAsMjQgKzY2MSwyMSBAQAogCX0KIAlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAlzcGluX3VubG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgaXNpY29tX2NvbmZpZ19wb3J0KHN0cnVjdCBpc2lfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGlzaWNvbV9jb25maWdfcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogeworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBsb25nIGJhdWQ7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKIAl1MTYgY2hhbm5lbF9zZXR1cCwgY2hhbm5lbCA9IHBvcnQtPmNoYW5uZWwsCiAJCXNoaWZ0X2NvdW50ID0gY2FyZC0+c2hpZnRfY291bnQ7CiAJdW5zaWduZWQgY2hhciBmbG93X2N0cmw7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKLQotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwogCS8qIEZJWE1FOiBTd2l0Y2ggdG8gbmV3IHR0eSBiYXVkIEFQSSAqLwogCWJhdWQgPSBDX0JBVUQodHR5KTsKIAlpZiAoYmF1ZCAmIENCQVVERVgpIHsKQEAgLTY5MCw3ICs2ODgsNyBAQAogCiAJCS8qIDEsMiwzLDQgPT4gNTcuNiwgMTE1LjIsIDIzMCwgNDYwIGticHMgcmVzcC4gKi8KIAkJaWYgKGJhdWQgPCAxIHx8IGJhdWQgPiA0KQotCQkJcG9ydC0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CiAJCWVsc2UKIAkJCWJhdWQgKz0gMTU7CiAJfQpAQCAtNzk3LDggKzc5NSw5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IGlzaWNvbV9zZXR1cF9wb3J0KHN0cnVjdCBpc2lfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgaXNpY29tX3NldHVwX3BvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKKwlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTgwOCw4ICs4MDcsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQlpZiAocG9ydC0+cG9ydC50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT5wb3J0LnR0eS0+ZmxhZ3MpOworCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAlpZiAocG9ydC0+cG9ydC5jb3VudCA9PSAxKQogCQljYXJkLT5jb3VudCsrOwogCkBAIC04MjMsNyArODIxLDcgQEAKIAkJSW50ZXJydXB0VGhlQ2FyZChjYXJkLT5iYXNlKTsKIAl9CiAKLQlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJaXNpY29tX2NvbmZpZ19wb3J0KHR0eSk7CiAJcG9ydC0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKIApAQCAtOTM0LDggKzkzMiw4IEBACiAKIAlwb3J0LT5wb3J0LmNvdW50Kys7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7Ci0JcG9ydC0+cG9ydC50dHkgPSB0dHk7Ci0JZXJyb3IgPSBpc2ljb21fc2V0dXBfcG9ydChwb3J0KTsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCB0dHkpOworCWVycm9yID0gaXNpY29tX3NldHVwX3BvcnQodHR5KTsKIAlpZiAoZXJyb3IgPT0gMCkKIAkJZXJyb3IgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBwb3J0KTsKIAlyZXR1cm4gZXJyb3I7CkBAIC05NTUsMTUgKzk1MywxNyBAQAogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAotCWlmICghKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJaWYgKCEocG9ydC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAkJcmV0dXJuOworCX0KIAogCXR0eV9wb3J0X2ZyZWVfeG1pdF9idWYoJnBvcnQtPnBvcnQpOwogCXBvcnQtPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwogCS8qIDNyZCBPY3RvYmVyIDIwMDAgOiBWaW5heWFrIFAgUmlzYnVkICovCi0JcG9ydC0+cG9ydC50dHkgPSBOVUxMOworCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwogCiAJLypGaXggZG9uZSBieSBBbmlsIC5TIG9uIDMwLTA0LTIwMDEKIAlyZW1vdGUgbG9naW4gdGhyb3VnaCBpc2kgcG9ydCBoYXMgZHRyIHRvZ2dsZSBwcm9ibGVtCkBAIC0xMjQzLDkgKzEyNDMsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpc2ljb21fc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBpc2lfcG9ydCAqcG9ydCwKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKmluZm8pCitzdGF0aWMgaW50IGlzaWNvbV9zZXRfc2VyaWFsX2luZm8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICppbmZvKQogeworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3aW5mbzsKIAlpbnQgcmVjb25maWdfcG9ydDsKIApAQCAtMTI3Niw3ICsxMjc3LDcgQEAKIAlpZiAocmVjb25maWdfcG9ydCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JCWlzaWNvbV9jb25maWdfcG9ydChwb3J0KTsKKwkJaXNpY29tX2NvbmZpZ19wb3J0KHR0eSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCX0KIAl1bmxvY2tfa2VybmVsKCk7CkBAIC0xMzE4LDcgKzEzMTksNyBAQAogCQlyZXR1cm4gaXNpY29tX2dldF9zZXJpYWxfaW5mbyhwb3J0LCBhcmdwKTsKIAogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCXJldHVybiBpc2ljb21fc2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZ3ApOworCQlyZXR1cm4gaXNpY29tX3NldF9zZXJpYWxfaW5mbyh0dHksIGFyZ3ApOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKQEAgLTEzNDEsNyArMTM0Miw3IEBACiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5jYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQlpc2ljb21fY29uZmlnX3BvcnQocG9ydCk7CisJaXNpY29tX2NvbmZpZ19wb3J0KHR0eSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKQEAgLTE0MTksNyArMTQyMCw3IEBACiAKIAlwb3J0LT5wb3J0LmNvdW50ID0gMDsKIAlwb3J0LT5wb3J0LmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotCXBvcnQtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPnBvcnQub3Blbl93YWl0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCmluZGV4IDg0M2EyYWYuLjQ0ZTVkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKQEAgLTYyMywyNCArNjIzLDI1IEBACiBzdGF0aWMgdm9pZAlzdGxpX2JyZHBvbGwoc3RydWN0IHN0bGlicmQgKmJyZHAsIGNka2hkcl90IF9faW9tZW0gKmhkcnApOwogc3RhdGljIHZvaWQJc3RsaV9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQJc3RsaV9ob3N0Y21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKLXN0YXRpYyBpbnQJc3RsaV9pbml0b3BlbihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfaW5pdG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApOwogc3RhdGljIGludAlzdGxpX3Jhd29wZW4oc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCk7CiBzdGF0aWMgaW50CXN0bGlfcmF3Y2xvc2Uoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgd2FpdCk7Ci1zdGF0aWMgaW50CXN0bGlfd2FpdGNhcnJpZXIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyBpbnQJc3RsaV9zZXRwb3J0KHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApOworc3RhdGljIGludAlzdGxpX3dhaXRjYXJyaWVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxpYnJkICpicmRwLAorCQkJCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQJc3RsaV9zZXRwb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIGludAlzdGxpX2NtZHdhaXQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spOwogc3RhdGljIHZvaWQJc3RsaV9zZW5kY21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKIHN0YXRpYyB2b2lkCV9fc3RsaV9zZW5kY21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKIHN0YXRpYyB2b2lkCXN0bGlfZG9kZWxheWNtZChzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCBjZGtjdHJsX3QgX19pb21lbSAqY3ApOwotc3RhdGljIHZvaWQJc3RsaV9ta2FzeXBvcnQoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IGt0ZXJtaW9zICp0aW9zcCk7CitzdGF0aWMgdm9pZAlzdGxpX21rYXN5cG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCBhc3lwb3J0X3QgKnBwLCBzdHJ1Y3Qga3Rlcm1pb3MgKnRpb3NwKTsKIHN0YXRpYyB2b2lkCXN0bGlfbWthc3lzaWdzKGFzeXNpZ3NfdCAqc3AsIGludCBkdHIsIGludCBydHMpOwogc3RhdGljIGxvbmcJc3RsaV9ta3Rpb2NtKHVuc2lnbmVkIGxvbmcgc2lndmFsdWUpOwogc3RhdGljIHZvaWQJc3RsaV9yZWFkKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKIHN0YXRpYyBpbnQJc3RsaV9nZXRzZXJpYWwoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7Ci1zdGF0aWMgaW50CXN0bGlfc2V0c2VyaWFsKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOworc3RhdGljIGludAlzdGxpX3NldHNlcmlhbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKIHN0YXRpYyBpbnQJc3RsaV9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKTsKLXN0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKLXN0YXRpYyBpbnQJc3RsaV9wb3J0Y21kc3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfZ2V0cG9ydHN0YXRzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGNtZHN0YXRzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApOwogc3RhdGljIGludAlzdGxpX2NscnBvcnRzdGF0cyhzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApOwogc3RhdGljIGludAlzdGxpX2dldHBvcnRzdHJ1Y3Qoc3RydWN0IHN0bGlwb3J0IF9fdXNlciAqYXJnKTsKIHN0YXRpYyBpbnQJc3RsaV9nZXRicmRzdHJ1Y3Qoc3RydWN0IHN0bGlicmQgX191c2VyICphcmcpOwpAQCAtNzMxLDEyICs3MzIsMTYgQEAKIHsKIAlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOwogCXVuc2lnbmVkIGludCBqOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlmb3IgKGogPSAwOyBqIDwgU1RMX01BWFBPUlRTOyBqKyspIHsKIAkJcG9ydHAgPSBicmRwLT5wb3J0c1tqXTsKIAkJaWYgKHBvcnRwICE9IE5VTEwpIHsKLQkJCWlmIChwb3J0cC0+cG9ydC50dHkgIT0gTlVMTCkKLQkJCQl0dHlfaGFuZ3VwKHBvcnRwLT5wb3J0LnR0eSk7CisJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0cC0+cG9ydCk7CisJCQlpZiAodHR5ICE9IE5VTEwpIHsKKwkJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCQl9CiAJCQlrZnJlZShwb3J0cCk7CiAJCX0KIAl9CkBAIC04MjQsNyArODI5LDcgQEAKICAqCXJlcXVpcmVzIHNldmVyYWwgY29tbWFuZHMgdG8gdGhlIGJvYXJkIHdlIHdpbGwgbmVlZCB0byB3YWl0IGZvciBhbnkKICAqCW90aGVyIG9wZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemluZyB0aGUgcG9ydC4KICAqLwotCXBvcnRwLT5wb3J0LnR0eSA9IHR0eTsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0cC0+cG9ydCwgdHR5KTsKIAl0dHktPmRyaXZlcl9kYXRhID0gcG9ydHA7CiAJcG9ydHAtPnBvcnQuY291bnQrKzsKIApAQCAtODM1LDcgKzg0MCw3IEBACiAKIAlpZiAoKHBvcnRwLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApIHsKIAkJc2V0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpOwotCQlpZiAoKHJjID0gc3RsaV9pbml0b3BlbihicmRwLCBwb3J0cCkpID49IDApIHsKKwkJaWYgKChyYyA9IHN0bGlfaW5pdG9wZW4odHR5LCBicmRwLCBwb3J0cCkpID49IDApIHsKIAkJCXBvcnRwLT5wb3J0LmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwogCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCQl9CkBAIC04NjQsNyArODY5LDcgQEAKICAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCiAgKi8KIAlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQkJaWYgKChyYyA9IHN0bGlfd2FpdGNhcnJpZXIoYnJkcCwgcG9ydHAsIGZpbHApKSAhPSAwKQorCQlpZiAoKHJjID0gc3RsaV93YWl0Y2Fycmllcih0dHksIGJyZHAsIHBvcnRwLCBmaWxwKSkgIT0gMCkKIAkJCXJldHVybiByYzsKIAl9CiAJcG9ydHAtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKQEAgLTkzMCw3ICs5MzUsNyBAQAogCXN0bGlfZmx1c2hidWZmZXIodHR5KTsKIAogCXR0eS0+Y2xvc2luZyA9IDA7Ci0JcG9ydHAtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0cC0+cG9ydCwgTlVMTCk7CiAKIAlpZiAocG9ydHAtPm9wZW53YWl0Y250KSB7CiAJCWlmIChwb3J0cC0+Y2xvc2VfZGVsYXkpCkBAIC05NTIsOSArOTU3LDkgQEAKICAqCXRoaXMgc3RpbGwgYWxsIGhhcHBlbnMgcHJldHR5IHF1aWNrbHkuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX2luaXRvcGVuKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKQorc3RhdGljIGludCBzdGxpX2luaXRvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApCiB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlhc3lub3RpZnlfdCBudDsKIAlhc3lwb3J0X3QgYXBvcnQ7CiAJaW50IHJjOwpAQCAtOTY5LDEwICs5NzQsNyBAQAogCSAgICBzaXplb2YoYXN5bm90aWZ5X3QpLCAwKSkgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQl0dHkgPSBwb3J0cC0+cG9ydC50dHk7Ci0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCB0dHktPnRlcm1pb3MpOworCXN0bGlfbWthc3lwb3J0KHR0eSwgcG9ydHAsICZhcG9ydCwgdHR5LT50ZXJtaW9zKTsKIAlpZiAoKHJjID0gc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFBPUlQsICZhcG9ydCwKIAkgICAgc2l6ZW9mKGFzeXBvcnRfdCksIDApKSA8IDApCiAJCXJldHVybiByYzsKQEAgLTExNjEsMjIgKzExNjMsMjEgQEAKICAqCXdhaXRpbmcgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlIC0gc28gbXVzdCBoYXZlIHVzZXIgY29udGV4dC4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfc2V0cG9ydChzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKQorc3RhdGljIGludCBzdGxpX3NldHBvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlhc3lwb3J0X3QgYXBvcnQ7CiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHBvcnRwLT5wb3J0LnR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CiAJaWYgKGJyZHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzdGxpX21rYXN5cG9ydChwb3J0cCwgJmFwb3J0LCBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MpOworCXN0bGlfbWthc3lwb3J0KHR0eSwgcG9ydHAsICZhcG9ydCwgdHR5LT50ZXJtaW9zKTsKIAlyZXR1cm4oc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFBPUlQsICZhcG9ydCwgc2l6ZW9mKGFzeXBvcnRfdCksIDApKTsKIH0KIApAQCAtMTE4Nyw3ICsxMTg4LDggQEAKICAqCW1heWJlIGJlY2F1c2UgaWYgd2UgYXJlIGNsb2NhbCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gd2FpdC4uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV93YWl0Y2FycmllcihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IHN0bGlfd2FpdGNhcnJpZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bGlicmQgKmJyZHAsCisJCQkJc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMsIGRvY2xvY2FsOwpAQCAtMTE5NSw3ICsxMTk3LDcgQEAKIAlyYyA9IDA7CiAJZG9jbG9jYWwgPSAwOwogCi0JaWYgKHBvcnRwLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQogCQlkb2Nsb2NhbCsrOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN0bGlfbG9jaywgZmxhZ3MpOwpAQCAtMTM3Myw4ICsxMzc1LDYgQEAKIAlzdGxpX3R4Y29va3JlYWxzaXplID0gMDsKIAlzdGxpX3R4Y29va3R0eSA9IE5VTEw7CiAKLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybjsKIAlpZiAoY29va3R0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAJaWYgKHR0eSAhPSBjb29rdHR5KQpAQCAtMTU3MiwxMCArMTU3MiwxMSBAQAogICoJanVzdCBxdWlldGx5IGlnbm9yZSBhbnkgcmVxdWVzdHMgdG8gY2hhbmdlIGlycSwgZXRjLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9zZXRzZXJpYWwoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3N0YXRpYyBpbnQgc3RsaV9zZXRzZXJpYWwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzaW87CiAJaW50IHJjOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZzaW8sIHNwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNTk0LDcgKzE1OTUsNyBAQAogCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSBzaW8uY2xvc2luZ193YWl0OwogCXBvcnRwLT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKIAotCWlmICgocmMgPSBzdGxpX3NldHBvcnQocG9ydHApKSA8IDApCisJaWYgKChyYyA9IHN0bGlfc2V0cG9ydCh0dHkpKSA8IDApCiAJCXJldHVybiByYzsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2ODUsMTcgKzE2ODYsMTcgQEAKIAkJcmMgPSBzdGxpX2dldHNlcmlhbChwb3J0cCwgYXJncCk7CiAJCWJyZWFrOwogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCXJjID0gc3RsaV9zZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlyYyA9IHN0bGlfc2V0c2VyaWFsKHR0eSwgYXJncCk7CiAJCWJyZWFrOwogCWNhc2UgU1RMX0dFVFBGTEFHOgogCQlyYyA9IHB1dF91c2VyKHBvcnRwLT5wZmxhZywgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApOwogCQlicmVhazsKIAljYXNlIFNUTF9TRVRQRkxBRzoKIAkJaWYgKChyYyA9IGdldF91c2VyKHBvcnRwLT5wZmxhZywgKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApKSA9PSAwKQotCQkJc3RsaV9zZXRwb3J0KHBvcnRwKTsKKwkJCXN0bGlfc2V0cG9ydCh0dHkpOwogCQlicmVhazsKIAljYXNlIENPTV9HRVRQT1JUU1RBVFM6Ci0JCXJjID0gc3RsaV9nZXRwb3J0c3RhdHMocG9ydHAsIGFyZ3ApOworCQlyYyA9IHN0bGlfZ2V0cG9ydHN0YXRzKHR0eSwgcG9ydHAsIGFyZ3ApOwogCQlicmVhazsKIAljYXNlIENPTV9DTFJQT1JUU1RBVFM6CiAJCXJjID0gc3RsaV9jbHJwb3J0c3RhdHMocG9ydHAsIGFyZ3ApOwpAQCAtMTcyOSw4ICsxNzMwLDYgQEAKIAlzdHJ1Y3Qga3Rlcm1pb3MgKnRpb3NwOwogCWFzeXBvcnRfdCBhcG9ydDsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTc0Miw3ICsxNzQxLDcgQEAKIAogCXRpb3NwID0gdHR5LT50ZXJtaW9zOwogCi0Jc3RsaV9ta2FzeXBvcnQocG9ydHAsICZhcG9ydCwgdGlvc3ApOworCXN0bGlfbWthc3lwb3J0KHR0eSwgcG9ydHAsICZhcG9ydCwgdGlvc3ApOwogCXN0bGlfY21kd2FpdChicmRwLCBwb3J0cCwgQV9TRVRQT1JULCAmYXBvcnQsIHNpemVvZihhc3lwb3J0X3QpLCAwKTsKIAlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsICgodGlvc3AtPmNfY2ZsYWcgJiBDQkFVRCkgPyAxIDogMCksIC0xKTsKIAlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLApAQCAtMTg1NCw3ICsxODUzLDcgQEAKIAljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKIAljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKIAlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCXBvcnRwLT5wb3J0LnR0eSA9IE5VTEw7CisJdHR5X3BvcnRfdHR5X3NldCgmcG9ydHAtPnBvcnQsIE5VTEwpOwogCXBvcnRwLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwogCXBvcnRwLT5wb3J0LmNvdW50ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGxpX2xvY2ssIGZsYWdzKTsKQEAgLTE5MzUsOCArMTkzNCw2IEBACiAJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKIAl1bnNpZ25lZCBsb25nIHRlbmQ7CiAKLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTE5OTgsNyArMTk5NSw3IEBACiAJY2hhciAqc3AsICp1YXJ0OwogCWludCByYywgY250OwogCi0JcmMgPSBzdGxpX3BvcnRjbWRzdGF0cyhwb3J0cCk7CisJcmMgPSBzdGxpX3BvcnRjbWRzdGF0cyhOVUxMLCBwb3J0cCk7CiAKIAl1YXJ0ID0gIlVOS05PV04iOwogCWlmIChicmRwLT5zdGF0ZSAmIEJTVF9TVEFSVEVEKSB7CkBAIC0yMTg4LDcgKzIxODUsNyBAQAogCiAJaWYgKHRlc3RfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSkpCiAJCXJldHVybjsKLQl0dHkgPSBwb3J0cC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydHAtPnBvcnQpOwogCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCkBAIC0yMjMwLDYgKzIyMjcsNyBAQAogCQlzZXRfYml0KFNUX1JYSU5HLCAmcG9ydHAtPnN0YXRlKTsKIAogCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzNjIsNyArMjM2MCw3IEBACiAJaWYgKGFwLT5ub3RpZnkpIHsKIAkJbnQgPSBhcC0+Y2hhbmdlZDsKIAkJYXAtPm5vdGlmeSA9IDA7Ci0JCXR0eSA9IHBvcnRwLT5wb3J0LnR0eTsKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydHAtPnBvcnQpOwogCiAJCWlmIChudC5zaWduYWwgJiBTR19EQ0QpIHsKIAkJCW9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKQEAgLTIzOTksNiArMjM5Nyw3IEBACiAJCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKIAkJCX0KIAkJfQorCQl0dHlfa3JlZl9wdXQodHR5KTsKIAogCQlpZiAobnQuZGF0YSAmIERUX1JYQlVTWSkgewogCQkJZG9uZXJ4Kys7CkBAIC0yNTM1LDE0ICsyNTM0LDE1IEBACiAgKgl0aGUgc2xhdmUuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9ta2FzeXBvcnQoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IGt0ZXJtaW9zICp0aW9zcCkKK3N0YXRpYyB2b2lkIHN0bGlfbWthc3lwb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsCisJCQkJYXN5cG9ydF90ICpwcCwgc3RydWN0IGt0ZXJtaW9zICp0aW9zcCkKIHsKIAltZW1zZXQocHAsIDAsIHNpemVvZihhc3lwb3J0X3QpKTsKIAogLyoKICAqCVN0YXJ0IG9mIGJ5IHNldHRpbmcgdGhlIGJhdWQsIGNoYXIgc2l6ZSwgcGFyaXR5IGFuZCBzdG9wIGJpdCBpbmZvLgogICovCi0JcHAtPmJhdWRvdXQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0cC0+cG9ydC50dHkpOworCXBwLT5iYXVkb3V0ID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKIAlpZiAoKHRpb3NwLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCkgewogCQlpZiAoKHBvcnRwLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKIAkJCXBwLT5iYXVkb3V0ID0gNTc2MDA7CkBAIC0yNjk1LDcgKzI2OTUsNyBAQAogCQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIHBvcnQgc3RydWN0dXJlXG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0KKwkJdHR5X3BvcnRfaW5pdCgmcG9ydHAtPnBvcnQpOwogCQlwb3J0cC0+bWFnaWMgPSBTVExJX1BPUlRNQUdJQzsKIAkJcG9ydHAtPnBvcnRuciA9IGk7CiAJCXBvcnRwLT5icmRuciA9IGJyZHAtPmJyZG5yOwpAQCAtNDIyMCw3ICs0MjIwLDcgQEAKICAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9wb3J0Y21kc3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCkKK3N0YXRpYyBpbnQgc3RsaV9wb3J0Y21kc3RhdHMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCkKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXN0cnVjdCBzdGxpYnJkCSpicmRwOwpAQCAtNDI0OSwxNSArNDI0OSwxNSBAQAogCXN0bGlfY29tc3RhdHMuZmxhZ3MgPSBwb3J0cC0+cG9ydC5mbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwotCWlmIChwb3J0cC0+cG9ydC50dHkgIT0gTlVMTCkgewotCQlpZiAocG9ydHAtPnBvcnQudHR5LT5kcml2ZXJfZGF0YSA9PSBwb3J0cCkgewotCQkJc3RsaV9jb21zdGF0cy50dHlzdGF0ZSA9IHBvcnRwLT5wb3J0LnR0eS0+ZmxhZ3M7CisJaWYgKHR0eSAhPSBOVUxMKSB7CisJCWlmIChwb3J0cC0+cG9ydC50dHkgPT0gdHR5KSB7CisJCQlzdGxpX2NvbXN0YXRzLnR0eXN0YXRlID0gdHR5LT5mbGFnczsKIAkJCXN0bGlfY29tc3RhdHMucnhidWZmZXJlZCA9IC0xOwotCQkJaWYgKHBvcnRwLT5wb3J0LnR0eS0+dGVybWlvcyAhPSBOVUxMKSB7Ci0JCQkJc3RsaV9jb21zdGF0cy5jZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCQkJc3RsaV9jb21zdGF0cy5pZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfaWZsYWc7Ci0JCQkJc3RsaV9jb21zdGF0cy5vZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfb2ZsYWc7Ci0JCQkJc3RsaV9jb21zdGF0cy5sZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfbGZsYWc7CisJCQlpZiAodHR5LT50ZXJtaW9zICE9IE5VTEwpIHsKKwkJCQlzdGxpX2NvbXN0YXRzLmNmbGFncyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLmlmbGFncyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLm9mbGFncyA9IHR0eS0+dGVybWlvcy0+Y19vZmxhZzsKKwkJCQlzdGxpX2NvbXN0YXRzLmxmbGFncyA9IHR0eS0+dGVybWlvcy0+Y19sZmxhZzsKIAkJCX0KIAkJfQogCX0KQEAgLTQyOTQsNyArNDI5NCw4IEBACiAgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0YXRzKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3N0YXRpYyBpbnQgc3RsaV9nZXRwb3J0c3RhdHMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwKKwkJCQkJCQljb21zdGF0c190IF9fdXNlciAqY3ApCiB7CiAJc3RydWN0IHN0bGlicmQgKmJyZHA7CiAJaW50IHJjOwpAQCAtNDMxMiw3ICs0MzEzLDcgQEAKIAlpZiAoIWJyZHApCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChyYyA9IHN0bGlfcG9ydGNtZHN0YXRzKHBvcnRwKSkgPCAwKQorCWlmICgocmMgPSBzdGxpX3BvcnRjbWRzdGF0cyh0dHksIHBvcnRwKSkgPCAwKQogCQlyZXR1cm4gcmM7CiAKIAlyZXR1cm4gY29weV90b191c2VyKGNwLCAmc3RsaV9jb21zdGF0cywgc2l6ZW9mKGNvbXN0YXRzX3QpKSA/CkBAIC00NDI3LDcgKzQ0MjgsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENPTV9HRVRQT1JUU1RBVFM6Ci0JCXJjID0gc3RsaV9nZXRwb3J0c3RhdHMoTlVMTCwgYXJncCk7CisJCXJjID0gc3RsaV9nZXRwb3J0c3RhdHMoTlVMTCwgTlVMTCwgYXJncCk7CiAJCWRvbmUrKzsKIAkJYnJlYWs7CiAJY2FzZSBDT01fQ0xSUE9SVFNUQVRTOgpAQCAtNDU5OSw5ICs0NjAwLDggQEAKIAogCWlzdGFsbGlvbl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInN0YWxpb21lbSIpOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShpc3RhbGxpb25fY2xhc3MsIE5VTEwsCi0JCQkJICAgICAgTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSwKLQkJCQkgICAgICBOVUxMLCAic3RhbGlvbWVtJWQiLCBpKTsKKwkJZGV2aWNlX2NyZWF0ZShpc3RhbGxpb25fY2xhc3MsIE5VTEwsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSksCisJCQkgICAgICBOVUxMLCAic3RhbGlvbWVtJWQiLCBpKTsKIAogCXJldHVybiAwOwogZXJyX2RlaW5pdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggN2IzYTIxMi4uZGUyNmE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTEyNDksNyArMTI0OSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoa2V5Y29kZSA+IE5SX0tFWVMpCisJaWYgKGtleWNvZGUgPj0gTlJfS0VZUykKIAkJaWYgKGtleWNvZGUgPj0gS0VZX0JSTF9ET1QxICYmIGtleWNvZGUgPD0gS0VZX0JSTF9ET1Q4KQogCQkJa2V5c3ltID0gSyhLVF9CUkwsIGtleWNvZGUgLSBLRVlfQlJMX0RPVDEgKyAxKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xwLmMgYi9kcml2ZXJzL2NoYXIvbHAuYwppbmRleCAzZjI3MTliLi5lNDQ0YzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbHAuYworKysgYi9kcml2ZXJzL2NoYXIvbHAuYwpAQCAtODEzLDggKzgxMyw4IEBACiAJaWYgKHJlc2V0KQogCQlscF9yZXNldChucik7CiAKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEobHBfY2xhc3MsIHBvcnQtPmRldiwgTUtERVYoTFBfTUFKT1IsIG5yKSwgTlVMTCwKLQkJCSAgICAgICJscCVkIiwgbnIpOworCWRldmljZV9jcmVhdGUobHBfY2xhc3MsIHBvcnQtPmRldiwgTUtERVYoTFBfTUFKT1IsIG5yKSwgTlVMTCwKKwkJICAgICAgImxwJWQiLCBucik7CiAKIAlwcmludGsoS0VSTl9JTkZPICJscCVkOiB1c2luZyAlcyAoJXMpLlxuIiwgbnIsIHBvcnQtPm5hbWUsIAogCSAgICAgICAocG9ydC0+aXJxID09IFBBUlBPUlRfSVJRX05PTkUpPyJwb2xsaW5nIjoiaW50ZXJydXB0LWRyaXZlbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDY3MmIwOGUuLjY0MzFmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTk5Miw5ICs5OTIsOSBAQAogCiAJbWVtX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibWVtIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2bGlzdCk7IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKG1lbV9jbGFzcywgTlVMTCwKLQkJCQkgICAgICBNS0RFVihNRU1fTUFKT1IsIGRldmxpc3RbaV0ubWlub3IpLAotCQkJCSAgICAgIE5VTEwsIGRldmxpc3RbaV0ubmFtZSk7CisJCWRldmljZV9jcmVhdGUobWVtX2NsYXNzLCBOVUxMLAorCQkJICAgICAgTUtERVYoTUVNX01BSk9SLCBkZXZsaXN0W2ldLm1pbm9yKSwgTlVMTCwKKwkJCSAgICAgIGRldmxpc3RbaV0ubmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9taXNjLmMgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCmluZGV4IDk5OWFhNzcuLmE1ZTBkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9taXNjLmMKKysrIGIvZHJpdmVycy9jaGFyL21pc2MuYwpAQCAtMjE3LDggKzIxNyw4IEBACiAJCW1pc2NfbWlub3JzW21pc2MtPm1pbm9yID4+IDNdIHw9IDEgPDwgKG1pc2MtPm1pbm9yICYgNyk7CiAJZGV2ID0gTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpOwogCi0JbWlzYy0+dGhpc19kZXZpY2UgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEobWlzY19jbGFzcywgbWlzYy0+cGFyZW50LAotCQkJCQkJICBkZXYsIE5VTEwsICIlcyIsIG1pc2MtPm5hbWUpOworCW1pc2MtPnRoaXNfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShtaXNjX2NsYXNzLCBtaXNjLT5wYXJlbnQsIGRldiwgTlVMTCwKKwkJCQkJICAiJXMiLCBtaXNjLT5uYW1lKTsKIAlpZiAoSVNfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKSkgewogCQllcnIgPSBQVFJfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKTsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCBkM2Q3ODY0ZS4uMTJkMzI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIHN0YXRpYyB2b2lkIG1veGFfcG9sbCh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIG1veGFfc2V0X3R0eV9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3Qga3Rlcm1pb3MgKik7CiBzdGF0aWMgdm9pZCBtb3hhX3NldHVwX2VtcHR5X2V2ZW50KHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbW94YV9zaHV0X2Rvd24oc3RydWN0IG1veGFfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfc2h1dF9kb3duKHN0cnVjdCB0dHlfc3RydWN0ICopOwogLyoKICAqIG1veGEgYm9hcmQgaW50ZXJmYWNlIGZ1bmN0aW9uczoKICAqLwpAQCAtMjE3LDcgKzIxNyw3IEBACiBzdGF0aWMgdm9pZCBNb3hhUG9ydEZsb3dDdHJsKHN0cnVjdCBtb3hhX3BvcnQgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOwogc3RhdGljIGludCBNb3hhUG9ydExpbmVTdGF0dXMoc3RydWN0IG1veGFfcG9ydCAqKTsKIHN0YXRpYyB2b2lkIE1veGFQb3J0Rmx1c2hEYXRhKHN0cnVjdCBtb3hhX3BvcnQgKiwgaW50KTsKLXN0YXRpYyBpbnQgTW94YVBvcnRXcml0ZURhdGEoc3RydWN0IG1veGFfcG9ydCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIHN0YXRpYyBpbnQgTW94YVBvcnRSZWFkRGF0YShzdHJ1Y3QgbW94YV9wb3J0ICopOwogc3RhdGljIGludCBNb3hhUG9ydFR4UXVldWUoc3RydWN0IG1veGFfcG9ydCAqKTsKIHN0YXRpYyBpbnQgTW94YVBvcnRSeFF1ZXVlKHN0cnVjdCBtb3hhX3BvcnQgKik7CkBAIC0zMzIsNiArMzMyLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CT0FSRFM7IGkrKykgewogCQkJcCA9IG1veGFfYm9hcmRzW2ldLnBvcnRzOwogCQkJZm9yIChqID0gMDsgaiA8IE1BWF9QT1JUU19QRVJfQk9BUkQ7IGorKywgcCsrLCBhcmdtKyspIHsKKwkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5cDsKIAkJCQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwogCQkJCWlmICghbW94YV9ib2FyZHNbaV0ucmVhZHkpCiAJCQkJCWdvdG8gY29weTsKQEAgLTM0NCwxMCArMzQ1LDEyIEBACiAJCQkJaWYgKHN0YXR1cyAmIDQpCiAJCQkJCXRtcC5kY2QgPSAxOwogCi0JCQkJaWYgKCFwLT5wb3J0LnR0eSB8fCAhcC0+cG9ydC50dHktPnRlcm1pb3MpCisJCQkJdHR5cCA9IHR0eV9wb3J0X3R0eV9nZXQoJnAtPnBvcnQpOworCQkJCWlmICghdHR5cCB8fCAhdHR5cC0+dGVybWlvcykKIAkJCQkJdG1wLmNmbGFnID0gcC0+Y2ZsYWc7CiAJCQkJZWxzZQotCQkJCQl0bXAuY2ZsYWcgPSBwLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQkJdG1wLmNmbGFnID0gdHR5cC0+dGVybWlvcy0+Y19jZmxhZzsKKwkJCQl0dHlfa3JlZl9wdXQodHR5KTsKIGNvcHk6CiAJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdtLCAmdG1wLCBzaXplb2YodG1wKSkpIHsKIAkJCQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKQEAgLTUxMCw3ICs1MTMsNyBAQAogCQlzaXplX3QgbGVuKQogewogCXZvaWQgX19pb21lbSAqYmFzZUFkZHIgPSBicmQtPmJhc2VtZW07Ci0JY29uc3QgdTE2ICp1cHRyID0gcHRyOworCWNvbnN0IF9fbGUxNiAqdXB0ciA9IHB0cjsKIAlzaXplX3Qgd2xlbiwgbGVuMiwgajsKIAl1bnNpZ25lZCBsb25nIGtleSwgbG9hZGJ1ZiwgbG9hZGxlbiwgY2hlY2tzdW0sIGNoZWNrc3VtX29rOwogCXVuc2lnbmVkIGludCBpLCByZXRyeTsKQEAgLTg4MCw4ICs4ODMsMTQgQEAKIAogCS8qIHBjaSBob3QtdW4tcGx1ZyBzdXBwb3J0ICovCiAJZm9yIChhID0gMDsgYSA8IGJyZC0+bnVtUG9ydHM7IGErKykKLQkJaWYgKGJyZC0+cG9ydHNbYV0ucG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQotCQkJdHR5X2hhbmd1cChicmQtPnBvcnRzW2FdLnBvcnQudHR5KTsKKwkJaWYgKGJyZC0+cG9ydHNbYV0ucG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgKKwkJCQkJCSZicmQtPnBvcnRzW2FdLnBvcnQpOworCQkJaWYgKHR0eSkgeworCQkJCXR0eV9oYW5ndXAodHR5KTsKKwkJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJCX0KKwkJfQogCXdoaWxlICgxKSB7CiAJCW9wZW5lZCA9IDA7CiAJCWZvciAoYSA9IDA7IGEgPCBicmQtPm51bVBvcnRzOyBhKyspCkBAIC0xMDk2LDEzICsxMTA1LDE0IEBACiBtb2R1bGVfaW5pdChtb3hhX2luaXQpOwogbW9kdWxlX2V4aXQobW94YV9leGl0KTsKIAotc3RhdGljIHZvaWQgbW94YV9jbG9zZV9wb3J0KHN0cnVjdCBtb3hhX3BvcnQgKmNoKQorc3RhdGljIHZvaWQgbW94YV9jbG9zZV9wb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JbW94YV9zaHV0X2Rvd24oY2gpOworCXN0cnVjdCBtb3hhX3BvcnQgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKKwltb3hhX3NodXRfZG93bih0dHkpOwogCU1veGFQb3J0Rmx1c2hEYXRhKGNoLCAyKTsKIAljaC0+cG9ydC5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKLQljaC0+cG9ydC50dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQljaC0+cG9ydC50dHkgPSBOVUxMOworCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCXR0eV9wb3J0X3R0eV9zZXQoJmNoLT5wb3J0LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBtb3hhX2Jsb2NrX3RpbGxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0xMTYxLDcgKzExNzEsNyBAQAogCWNoID0gJmJyZC0+cG9ydHNbcG9ydCAlIE1BWF9QT1JUU19QRVJfQk9BUkRdOwogCWNoLT5wb3J0LmNvdW50Kys7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGNoOwotCWNoLT5wb3J0LnR0eSA9IHR0eTsKKwl0dHlfcG9ydF90dHlfc2V0KCZjaC0+cG9ydCwgdHR5KTsKIAlpZiAoIShjaC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgewogCQljaC0+c3RhdHVzZmxhZ3MgPSAwOwogCQltb3hhX3NldF90dHlfcGFyYW0odHR5LCB0dHktPnRlcm1pb3MpOwpAQCAtMTE3OSw3ICsxMTg5LDcgQEAKIAlpZiAocmV0dmFsKSB7CiAJCWlmIChjaC0+cG9ydC5jb3VudCkgLyogMCBtZWFucyBhbHJlYWR5IGh1bmcgdXAuLi4gKi8KIAkJCWlmICgtLWNoLT5wb3J0LmNvdW50ID09IDApCi0JCQkJbW94YV9jbG9zZV9wb3J0KGNoKTsKKwkJCQltb3hhX2Nsb3NlX3BvcnQodHR5KTsKIAl9IGVsc2UKIAkJY2gtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKIAltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOwpAQCAtMTIxOSw3ICsxMjI5LDcgQEAKIAkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDMwICogSFopOwkvKiAzMCBzZWNvbmRzIHRpbWVvdXQgKi8KIAl9CiAKLQltb3hhX2Nsb3NlX3BvcnQoY2gpOworCW1veGFfY2xvc2VfcG9ydCh0dHkpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7CiB9CkBAIC0xMjM0LDcgKzEyNDQsNyBAQAogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKLQlsZW4gPSBNb3hhUG9ydFdyaXRlRGF0YShjaCwgYnVmLCBjb3VudCk7CisJbGVuID0gTW94YVBvcnRXcml0ZURhdGEodHR5LCBidWYsIGNvdW50KTsKIAlzcGluX3VubG9ja19iaCgmbW94YV9sb2NrKTsKIAogCWNoLT5zdGF0dXNmbGFncyB8PSBMT1dXQUlUOwpAQCAtMTQwOSw3ICsxNDE5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAljaC0+cG9ydC5jb3VudCA9IDA7Ci0JbW94YV9jbG9zZV9wb3J0KGNoKTsKKwltb3hhX2Nsb3NlX3BvcnQodHR5KTsKIAltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOwogCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaC0+cG9ydC5vcGVuX3dhaXQpOwpAQCAtMTQxNywxMSArMTQyNywxNCBAQAogCiBzdGF0aWMgdm9pZCBtb3hhX25ld19kY2RzdGF0ZShzdHJ1Y3QgbW94YV9wb3J0ICpwLCB1OCBkY2QpCiB7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlkY2QgPSAhIWRjZDsKIAotCWlmIChkY2QgIT0gcC0+RENEU3RhdGUgJiYgcC0+cG9ydC50dHkgJiYgQ19DTE9DQUwocC0+cG9ydC50dHkpKSB7Ci0JCWlmICghZGNkKQotCQkJdHR5X2hhbmd1cChwLT5wb3J0LnR0eSk7CisJaWYgKGRjZCAhPSBwLT5EQ0RTdGF0ZSkgeworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwLT5wb3J0KTsKKwkJaWYgKHR0eSAmJiBDX0NMT0NBTCh0dHkpICYmICFkY2QpCisJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCX0KIAlwLT5EQ0RTdGF0ZSA9IGRjZDsKIH0KQEAgLTE0MjksNyArMTQ0Miw3IEBACiBzdGF0aWMgaW50IG1veGFfcG9sbF9wb3J0KHN0cnVjdCBtb3hhX3BvcnQgKnAsIHVuc2lnbmVkIGludCBoYW5kbGUsCiAJCXUxNiBfX2lvbWVtICppcCkKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcC0+cG9ydC50dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnAtPnBvcnQpOwogCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKIAl1bnNpZ25lZCBpbnQgaW5pdGVkID0gcC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEOwogCXUxNiBpbnRyOwpAQCAtMTQ3Niw2ICsxNDg5LDcgQEAKIAkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspOwogCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCWlmIChpbnRyICYgSW50ckxpbmUpCiAJCW1veGFfbmV3X2RjZHN0YXRlKHAsIHJlYWRiKG9mc0FkZHIgKyBGbGFnU3RhdCkgJiBEQ0Rfc3RhdGUpOwpAQCAtMTU2MCw5ICsxNTc0LDkgQEAKIAlzcGluX3VubG9ja19iaCgmbW94YV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbW94YV9zaHV0X2Rvd24oc3RydWN0IG1veGFfcG9ydCAqY2gpCitzdGF0aWMgdm9pZCBtb3hhX3NodXRfZG93bihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCB0dHlfc3RydWN0ICp0cCA9IGNoLT5wb3J0LnR0eTsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIShjaC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKIAkJcmV0dXJuOwpAQCAtMTU3Miw3ICsxNTg2LDcgQEAKIAkvKgogCSAqIElmIHdlJ3JlIGEgbW9kZW0gY29udHJvbCBkZXZpY2UgYW5kIEhVUENMIGlzIG9uLCBkcm9wIFJUUyAmIERUUi4KIAkgKi8KLQlpZiAoQ19IVVBDTCh0cCkpCisJaWYgKENfSFVQQ0wodHR5KSkKIAkJTW94YVBvcnRMaW5lQ3RybChjaCwgMCwgMCk7CiAKIAlzcGluX2xvY2tfYmgoJm1veGFfbG9jayk7CkBAIC0xOTUzLDkgKzE5NjcsMTAgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKHN0cnVjdCBtb3hhX3BvcnQgKnBvcnQsCitzdGF0aWMgaW50IE1veGFQb3J0V3JpdGVEYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKIHsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl2b2lkIF9faW9tZW0gKmJhc2VBZGRyLCAqb2ZzQWRkciwgKm9mczsKIAl1bnNpZ25lZCBpbnQgYywgdG90YWw7CiAJdTE2IGhlYWQsIHRhaWwsIHR4X21hc2ssIHNwYWdlLCBlcGFnZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKaW5kZXggYjYzODQwMy4uOGJlZWY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTYxMCwxNSArNjEwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWQoc3RydWN0IG14c2VyX3BvcnQgKmluZm8sIGxvbmcgbmV3c3BkKQorc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBsb25nIG5ld3NwZCkKIHsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHF1b3QgPSAwLCBiYXVkOwogCXVuc2lnbmVkIGNoYXIgY3ZhbDsKIAotCWlmICghaW5mby0+cG9ydC50dHkgfHwgIWluZm8tPnBvcnQudHR5LT50ZXJtaW9zKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIShpbmZvLT5pb2FkZHIpKQorCWlmICghaW5mby0+aW9hZGRyKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAobmV3c3BkID4gaW5mby0+bWF4X2JhdWQpCkBAIC02MjYsMTMgKzYyNCwxMyBAQAogCiAJaWYgKG5ld3NwZCA9PSAxMzQpIHsKIAkJcXVvdCA9IDIgKiBpbmZvLT5iYXVkX2Jhc2UgLyAyNjk7Ci0JCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKGluZm8tPnBvcnQudHR5LCAxMzQsIDEzNCk7CisJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgMTM0LCAxMzQpOwogCX0gZWxzZSBpZiAobmV3c3BkKSB7CiAJCXF1b3QgPSBpbmZvLT5iYXVkX2Jhc2UgLyBuZXdzcGQ7CiAJCWlmIChxdW90ID09IDApCiAJCQlxdW90ID0gMTsKIAkJYmF1ZCA9IGluZm8tPmJhdWRfYmFzZS9xdW90OwotCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZShpbmZvLT5wb3J0LnR0eSwgYmF1ZCwgYmF1ZCk7CisJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAJfSBlbHNlIHsKIAkJcXVvdCA9IDA7CiAJfQpAQCAtNjU4LDcgKzY1Niw3IEBACiAJb3V0YihjdmFsLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KIAogI2lmZGVmIEJPVEhFUgotCWlmIChDX0JBVUQoaW5mby0+cG9ydC50dHkpID09IEJPVEhFUikgeworCWlmIChDX0JBVUQodHR5KSA9PSBCT1RIRVIpIHsKIAkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAlIG5ld3NwZDsKIAkJcXVvdCAqPSA4OwogCQlpZiAocXVvdCAlIG5ld3NwZCA+IG5ld3NwZCAvIDIpIHsKQEAgLTY3OSwyMSArNjc3LDIwIEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNldCB0aGUgVUFSVCBkaXZpc29yIHJlZ2lzdGVycyB0byBtYXRjaAogICogdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUgZm9yIGEgc2VyaWFsIHBvcnQuCiAgKi8KLXN0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvLAotCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIGludCBteHNlcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAotCWlmICghaW5mby0+cG9ydC50dHkgfHwgIWluZm8tPnBvcnQudHR5LT50ZXJtaW9zKQotCQlyZXR1cm4gcmV0OwotCWNmbGFnID0gaW5mby0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JaWYgKCEoaW5mby0+aW9hZGRyKSkKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoIWluZm8tPmlvYWRkcikKIAkJcmV0dXJuIHJldDsKIAotCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydC50dHktPmluZGV4XSA9PSAwKQotCQlteHNlcl9zZXRfYmF1ZChpbmZvLCB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT5wb3J0LnR0eSkpOworCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbdHR5LT5pbmRleF0gPT0gMCkKKwkJbXhzZXJfc2V0X2JhdWQodHR5LCB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpKTsKIAogCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCiAJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CkBAIC03NjIsOSArNzU5LDkgQEAKIAkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9BRkU7CiAJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwotCQkJaWYgKGluZm8tPnBvcnQudHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAodHR5LT5od19zdG9wcGVkKSB7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgewotCQkJCQlpbmZvLT5wb3J0LnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CiAJCQkJCWlmIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBICYmCiAJCQkJCQkJIWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKIAkJCQkJCW91dGIoaW5mby0+SUVSICYgflVBUlRfSUVSX1RIUkksCkBAIC03NzQsMTEgKzc3MSwxMSBAQAogCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArCiAJCQkJCQkJCVVBUlRfSUVSKTsKIAkJCQkJfQotCQkJCQl0dHlfd2FrZXVwKGluZm8tPnBvcnQudHR5KTsKKwkJCQkJdHR5X3dha2V1cCh0dHkpOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgewotCQkJCQlpbmZvLT5wb3J0LnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKIAkJCQkJCQkoIWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpKSB7CiAJCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CkBAIC04MDQsMjEgKzgwMSwyMSBAQAogCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwogCSAqLwogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKLQlpZiAoSV9JTlBDSyhpbmZvLT5wb3J0LnR0eSkpCisJaWYgKElfSU5QQ0sodHR5KSkKIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwotCWlmIChJX0JSS0lOVChpbmZvLT5wb3J0LnR0eSkgfHwgSV9QQVJNUksoaW5mby0+cG9ydC50dHkpKQorCWlmIChJX0JSS0lOVCh0dHkpIHx8IElfUEFSTVJLKHR0eSkpCiAJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CiAKIAlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOwogCi0JaWYgKElfSUdOQlJLKGluZm8tPnBvcnQudHR5KSkgeworCWlmIChJX0lHTkJSSyh0dHkpKSB7CiAJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKIAkJLyoKIAkJICogSWYgd2UncmUgaWdub3JlIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywgaWdub3JlCiAJCSAqIG92ZXJydW5zIHRvby4gIChGb3IgcmVhbCByYXcgc3VwcG9ydCkuCiAJCSAqLwotCQlpZiAoSV9JR05QQVIoaW5mby0+cG9ydC50dHkpKSB7CisJCWlmIChJX0lHTlBBUih0dHkpKSB7CiAJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0KIAkJCQkJCVVBUlRfTFNSX09FIHwKIAkJCQkJCVVBUlRfTFNSX1BFIHwKQEAgLTgzMCwxNiArODI3LDE2IEBACiAJCX0KIAl9CiAJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKLQkJbXhzZXJfc2V0X211c3RfeG9uMV92YWx1ZShpbmZvLT5pb2FkZHIsIFNUQVJUX0NIQVIoaW5mby0+cG9ydC50dHkpKTsKLQkJbXhzZXJfc2V0X211c3RfeG9mZjFfdmFsdWUoaW5mby0+aW9hZGRyLCBTVE9QX0NIQVIoaW5mby0+cG9ydC50dHkpKTsKLQkJaWYgKElfSVhPTihpbmZvLT5wb3J0LnR0eSkpIHsKKwkJbXhzZXJfc2V0X211c3RfeG9uMV92YWx1ZShpbmZvLT5pb2FkZHIsIFNUQVJUX0NIQVIodHR5KSk7CisJCW14c2VyX3NldF9tdXN0X3hvZmYxX3ZhbHVlKGluZm8tPmlvYWRkciwgU1RPUF9DSEFSKHR0eSkpOworCQlpZiAoSV9JWE9OKHR0eSkpIHsKIAkJCW14c2VyX2VuYWJsZV9tdXN0X3J4X3NvZnR3YXJlX2Zsb3dfY29udHJvbCgKIAkJCQkJaW5mby0+aW9hZGRyKTsKIAkJfSBlbHNlIHsKIAkJCW14c2VyX2Rpc2FibGVfbXVzdF9yeF9zb2Z0d2FyZV9mbG93X2NvbnRyb2woCiAJCQkJCWluZm8tPmlvYWRkcik7CiAJCX0KLQkJaWYgKElfSVhPRkYoaW5mby0+cG9ydC50dHkpKSB7CisJCWlmIChJX0lYT0ZGKHR0eSkpIHsKIAkJCW14c2VyX2VuYWJsZV9tdXN0X3R4X3NvZnR3YXJlX2Zsb3dfY29udHJvbCgKIAkJCQkJaW5mby0+aW9hZGRyKTsKIAkJfSBlbHNlIHsKQEAgLTg1NSw3ICs4NTIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCwgaW50IHN0YXR1cykKK3N0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKQogewogCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCkBAIC04NzQsMTAgKzg3MiwxMSBAQAogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5wb3J0Lm9wZW5fd2FpdCk7CiAJfQogCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgewotCQlpZiAocG9ydC0+cG9ydC50dHktPmh3X3N0b3BwZWQpIHsKKwkJaWYgKHR0eS0+aHdfc3RvcHBlZCkgewogCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgewotCQkJCXBvcnQtPnBvcnQudHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCiAJCQkJaWYgKChwb3J0LT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgogCQkJCQkJKCFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSkgewpAQCAtODg3LDExICs4ODYsMTEgQEAKIAkJCQkJb3V0Yihwb3J0LT5JRVIsIHBvcnQtPmlvYWRkciArCiAJCQkJCQkJVUFSVF9JRVIpOwogCQkJCX0KLQkJCQl0dHlfd2FrZXVwKHBvcnQtPnBvcnQudHR5KTsKKwkJCQl0dHlfd2FrZXVwKHR0eSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7Ci0JCQkJcG9ydC0+cG9ydC50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQkJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF8xNjU1MEEgJiYKIAkJCQkJCSFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSB7CiAJCQkJCXBvcnQtPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKQEAgLTkwMyw4ICs5MDIsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvKQorc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC05MjEsOCArOTIxLDcgQEAKIAl9CiAKIAlpZiAoIWluZm8tPmlvYWRkciB8fCAhaW5mby0+dHlwZSkgewotCQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnBvcnQudHR5LT5mbGFncyk7CisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAJCWZyZWVfcGFnZShwYWdlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CkBAIC05NTIsOCArOTUxLDggQEAKIAlpZiAoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSA9PSAweGZmKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOworCQkJaWYgKHR0eSkKKwkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC05OTEsMTQgKzk5MCwxMyBAQAogCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JSVIpOwogCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwogCi0JaWYgKGluZm8tPnBvcnQudHR5KQotCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+cG9ydC50dHktPmZsYWdzKTsKKwljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwogCiAJLyoKIAkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKIAkgKi8KLQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisJbXhzZXJfY2hhbmdlX3NwZWVkKHR0eSwgTlVMTCk7CiAJaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCkBAIC0xMDA5LDggKzEwMDcsOSBAQAogICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBtYXliZSBkaXNhYmxlZCwgYW5kCiAgKiBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgogICovCi1zdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbykKK3N0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIShpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQpAQCAtMTAzNSw3ICsxMDM0LDcgQEAKIAlpbmZvLT5JRVIgPSAwOwogCW91dGIoMHgwMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCi0JaWYgKCFpbmZvLT5wb3J0LnR0eSB8fCAoaW5mby0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQogCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOwogCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CiAKQEAgLTEwNTEsOCArMTA1MCw3IEBACiAJLyogcmVhZCBkYXRhIHBvcnQgdG8gcmVzZXQgdGhpbmdzICovCiAJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX1JYKTsKIAotCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOworCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAKIAlpbmZvLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKIApAQCAtMTA4NCwxNCArMTA4MiwxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotCWluZm8tPnBvcnQudHR5ID0gdHR5OworCXR0eV9wb3J0X3R0eV9zZXQoJmluZm8tPnBvcnQsIHR0eSk7CiAJLyoKIAkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCWluZm8tPnBvcnQuY291bnQrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJcmV0dmFsID0gbXhzZXJfc3RhcnR1cCh0dHkpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKQEAgLTEyMDksMTMgKzEyMDcsMTMgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQlteHNlcl9zaHV0ZG93bihpbmZvKTsKKwlteHNlcl9zaHV0ZG93bih0dHkpOwogCiAJbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7CiAJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAKIAl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZpbmZvLT5wb3J0LCBOVUxMKTsKIAlpZiAoaW5mby0+cG9ydC5ibG9ja2VkX29wZW4pIHsKIAkJaWYgKGluZm8tPnBvcnQuY2xvc2VfZGVsYXkpCiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoaW5mby0+cG9ydC5jbG9zZV9kZWxheSk7CkBAIC0xMzM3LDEyICsxMzM1LDEzIEBACiAgKiBmcmllbmRzIG9mIG14c2VyX2lvY3RsKCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1zdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKK3N0YXRpYyBpbnQgbXhzZXJfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKIHsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wID0gewogCQkudHlwZSA9IGluZm8tPnR5cGUsCi0JCS5saW5lID0gaW5mby0+cG9ydC50dHktPmluZGV4LAorCQkubGluZSA9IHR0eS0+aW5kZXgsCiAJCS5wb3J0ID0gaW5mby0+aW9hZGRyLAogCQkuaXJxID0gaW5mby0+Ym9hcmQtPmlycSwKIAkJLmZsYWdzID0gaW5mby0+cG9ydC5mbGFncywKQEAgLTEzNTcsOSArMTM1NiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3X2luZm8pCiB7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CiAJc3BlZWRfdCBiYXVkOwogCXVuc2lnbmVkIGxvbmcgc2xfZmxhZ3M7CkBAIC0xMzkzLDE0ICsxMzkzLDE0IEBACiAJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwogCQlpbmZvLT5wb3J0LmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOwogCQlpbmZvLT5wb3J0LmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7Ci0JCWluZm8tPnBvcnQudHR5LT5sb3dfbGF0ZW5jeSA9Ci0JCQkJKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKwkJdHR5LT5sb3dfbGF0ZW5jeSA9IChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpCisJCQkJCQkJCT8gMSA6IDA7CiAJCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCAmJgogCQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UgfHwKIAkJCQluZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9CiAJCQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IpKSB7CiAJCQliYXVkID0gbmV3X3NlcmlhbC5iYXVkX2Jhc2UgLyBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCQkJdHR5X2VuY29kZV9iYXVkX3JhdGUoaW5mby0+cG9ydC50dHksIGJhdWQsIGJhdWQpOworCQkJdHR5X2VuY29kZV9iYXVkX3JhdGUodHR5LCBiYXVkLCBiYXVkKTsKIAkJfQogCX0KIApAQCAtMTQxMSwxMSArMTQxMSwxMSBAQAogCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKIAkJaWYgKGZsYWdzICE9IChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIHNsX2ZsYWdzKTsKLQkJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKKwkJCW14c2VyX2NoYW5nZV9zcGVlZCh0dHksIE5VTEwpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIHNsX2ZsYWdzKTsKIAkJfQogCX0gZWxzZQotCQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOworCQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKHR0eSk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTQ2MSw3ICsxNDYxLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwogCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpCi0JCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXModHR5LCBpbmZvLCBzdGF0dXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8CiAJCSAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkgfApAQCAtMTYwNiw2ICsxNjA2LDcgQEAKIHN0YXRpYyBpbnQgbXhzZXJfaW9jdGxfc3BlY2lhbCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJncCkKIHsKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXN1bHQsIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgcmV0ID0gMDsKQEAgLTE2NDMsMTIgKzE2NDQsMTQgQEAKIAogCQkJCWlmICghcG9ydC0+aW9hZGRyKQogCQkJCQlnb3RvIGNvcHk7CisJCQkJCisJCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAKLQkJCQlpZiAoIXBvcnQtPnBvcnQudHR5IHx8ICFwb3J0LT5wb3J0LnR0eS0+dGVybWlvcykKKwkJCQlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKQogCQkJCQltcy5jZmxhZyA9IHBvcnQtPm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CiAJCQkJZWxzZQotCQkJCQltcy5jZmxhZyA9IHBvcnQtPnBvcnQudHR5LT50ZXJtaW9zLT5jX2NmbGFnOwotCisJCQkJCW1zLmNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCXR0eV9rcmVmX3B1dCh0dHkpOwogCQkJCXN0YXR1cyA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKIAkJCQkJbXMuZGNkID0gMTsKQEAgLTE3MDQsMTUgKzE3MDcsMTggQEAKIAkJCQltZS0+dXBfdHhjbnRbcF0gPSBwb3J0LT5tb25fZGF0YS51cF90eGNudDsKIAkJCQltZS0+bW9kZW1fc3RhdHVzW3BdID0KIAkJCQkJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzOwotCQkJCW1lLT5iYXVkcmF0ZVtwXSA9IHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnBvcnQudHR5KTsKKwkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAotCQkJCWlmICghcG9ydC0+cG9ydC50dHkgfHwgIXBvcnQtPnBvcnQudHR5LT50ZXJtaW9zKSB7CisJCQkJaWYgKCF0dHkgfHwgIXR0eS0+dGVybWlvcykgewogCQkJCQljZmxhZyA9IHBvcnQtPm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CiAJCQkJCWlmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19pZmxhZzsKKwkJCQkJbWUtPmJhdWRyYXRlW3BdID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKCZwb3J0LT5ub3JtYWxfdGVybWlvcyk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJY2ZsYWcgPSBwb3J0LT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQkJCQkJaWZsYWcgPSBwb3J0LT5wb3J0LnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQkJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCQkJCWlmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2lmbGFnOworCQkJCQltZS0+YmF1ZHJhdGVbcF0gPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOwogCQkJCX0KKwkJCQl0dHlfa3JlZl9wdXQodHR5KTsKIAogCQkJCW1lLT5kYXRhYml0c1twXSA9IGNmbGFnICYgQ1NJWkU7CiAJCQkJbWUtPnN0b3BiaXRzW3BdID0gY2ZsYWcgJiBDU1RPUEI7CkBAIC0xODIyLDEyICsxODI4LDEyIEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFRJT0NHU0VSSUFMOgogCQlsb2NrX2tlcm5lbCgpOwotCQlyZXR2YWwgPSBteHNlcl9nZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CisJCXJldHZhbCA9IG14c2VyX2dldF9zZXJpYWxfaW5mbyh0dHksIGFyZ3ApOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiByZXR2YWw7CiAJY2FzZSBUSU9DU1NFUklBTDoKIAkJbG9ja19rZXJuZWwoKTsKLQkJcmV0dmFsID0gbXhzZXJfc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQlyZXR2YWwgPSBteHNlcl9zZXRfc2VyaWFsX2luZm8odHR5LCBhcmdwKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcmV0dmFsOwogCWNhc2UgVElPQ1NFUkdFVExTUjoJLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCkBAIC0xODk2LDcgKzE5MDIsNyBAQAogCiAJCWxvY2tfa2VybmVsKCk7CiAJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+aW9hZGRyLCAxLCB0dHktPmluZGV4KTsKLQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyh0dHksIGluZm8sIHN0YXR1cyk7CiAKIAkJbWNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKIAkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfWE9OX0ZMQUcpCkBAIC0xOTA5LDcgKzE5MTUsNyBAQAogCQllbHNlCiAJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGWEVOVDsKIAotCQlpZiAoaW5mby0+cG9ydC50dHktPmh3X3N0b3BwZWQpCisJCWlmICh0dHktPmh3X3N0b3BwZWQpCiAJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9DVFNIT0xEOwogCQllbHNlCiAJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiAmPSB+TlBQSV9OT1RJRllfQ1RTSE9MRDsKQEAgLTE5NTgsNyArMTk2NCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoaW5mby0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKIAkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7CiAJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CiAJfQpAQCAtMTk5NSw3ICsyMDAxLDcgQEAKIAkJfQogCX0KIAotCWlmIChpbmZvLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgewogCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwogCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwogCX0KQEAgLTIwNDAsNyArMjA0Niw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisJbXhzZXJfY2hhbmdlX3NwZWVkKHR0eSwgb2xkX3Rlcm1pb3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKIAlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKQEAgLTIxMzgsMTAgKzIxNDQsMTAgQEAKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlteHNlcl9mbHVzaF9idWZmZXIodHR5KTsKLQlteHNlcl9zaHV0ZG93bihpbmZvKTsKKwlteHNlcl9zaHV0ZG93bih0dHkpOwogCWluZm8tPnBvcnQuY291bnQgPSAwOwogCWluZm8tPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JaW5mby0+cG9ydC50dHkgPSBOVUxMOworCXR0eV9wb3J0X3R0eV9zZXQoJmluZm8tPnBvcnQsIE5VTEwpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+cG9ydC5vcGVuX3dhaXQpOwogfQogCkBAIC0yMTY0LDkgKzIxNzAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBteHNlcl9yZWNlaXZlX2NoYXJzKHN0cnVjdCBteHNlcl9wb3J0ICpwb3J0LCBpbnQgKnN0YXR1cykKK3N0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQlzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCwgaW50ICpzdGF0dXMpCiB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnBvcnQudHR5OwogCXVuc2lnbmVkIGNoYXIgY2gsIGdkbDsKIAlpbnQgaWdub3JlZCA9IDA7CiAJaW50IGNudCA9IDA7CkBAIC0yMTc0LDkgKzIxODAsOCBAQAogCWludCBtYXggPSAyNTY7CiAKIAlyZWN2X3Jvb20gPSB0dHktPnJlY2VpdmVfcm9vbTsKLQlpZiAoKHJlY3Zfcm9vbSA9PSAwKSAmJiAoIXBvcnQtPmxkaXNjX3N0b3BfcngpKQorCWlmIChyZWN2X3Jvb20gPT0gMCAmJiAhcG9ydC0+bGRpc2Nfc3RvcF9yeCkKIAkJbXhzZXJfc3RvcHJ4KHR0eSk7Ci0KIAlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZyAhPSBNT1hBX09USEVSX1VBUlQpIHsKIAogCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1NQRUNJQUwpCkBAIC0yMjUzLDcgKzIyNTgsNyBAQAogCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7CiAKIGVuZF9pbnRyOgotCW14dmFyX2xvZy5yeGNudFtwb3J0LT5wb3J0LnR0eS0+aW5kZXhdICs9IGNudDsKKwlteHZhcl9sb2cucnhjbnRbdHR5LT5pbmRleF0gKz0gY250OwogCXBvcnQtPm1vbl9kYXRhLnJ4Y250ICs9IGNudDsKIAlwb3J0LT5tb25fZGF0YS51cF9yeGNudCArPSBjbnQ7CiAKQEAgLTIyNjcsMTQgKzIyNzIsMTQgQEAKIAlzcGluX2xvY2soJnBvcnQtPnNsb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbXhzZXJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IG14c2VyX3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCkKIHsKIAlpbnQgY291bnQsIGNudDsKIAogCWlmIChwb3J0LT54X2NoYXIpIHsKIAkJb3V0Yihwb3J0LT54X2NoYXIsIHBvcnQtPmlvYWRkciArIFVBUlRfVFgpOwogCQlwb3J0LT54X2NoYXIgPSAwOwotCQlteHZhcl9sb2cudHhjbnRbcG9ydC0+cG9ydC50dHktPmluZGV4XSsrOworCQlteHZhcl9sb2cudHhjbnRbdHR5LT5pbmRleF0rKzsKIAkJcG9ydC0+bW9uX2RhdGEudHhjbnQrKzsKIAkJcG9ydC0+bW9uX2RhdGEudXBfdHhjbnQrKzsKIAkJcG9ydC0+aWNvdW50LnR4Kys7CkBAIC0yMjg0LDggKzIyODksOCBAQAogCWlmIChwb3J0LT5wb3J0LnhtaXRfYnVmID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmICgocG9ydC0+eG1pdF9jbnQgPD0gMCkgfHwgcG9ydC0+cG9ydC50dHktPnN0b3BwZWQgfHwKLQkJCShwb3J0LT5wb3J0LnR0eS0+aHdfc3RvcHBlZCAmJgorCWlmIChwb3J0LT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fAorCQkJKHR0eS0+aHdfc3RvcHBlZCAmJgogCQkJKHBvcnQtPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCiAJCQkoIXBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpKSkgewogCQlwb3J0LT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CkBAIC0yMzAyLDE0ICsyMzA3LDE0IEBACiAJCWlmICgtLXBvcnQtPnhtaXRfY250IDw9IDApCiAJCQlicmVhazsKIAl9IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0JbXh2YXJfbG9nLnR4Y250W3BvcnQtPnBvcnQudHR5LT5pbmRleF0gKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKKwlteHZhcl9sb2cudHhjbnRbdHR5LT5pbmRleF0gKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKIAogCXBvcnQtPm1vbl9kYXRhLnR4Y250ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7CiAJcG9ydC0+bW9uX2RhdGEudXBfdHhjbnQgKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKIAlwb3J0LT5pY291bnQudHggKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKIAotCWlmIChwb3J0LT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykKLQkJdHR5X3dha2V1cChwb3J0LT5wb3J0LnR0eSk7CisJaWYgKHBvcnQtPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTICYmIHR0eSkKKwkJdHR5X3dha2V1cCh0dHkpOwogCiAJaWYgKHBvcnQtPnhtaXRfY250IDw9IDApIHsKIAkJcG9ydC0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwpAQCAtMjMyOCw2ICsyMzMzLDcgQEAKIAlpbnQgbWF4LCBpcnFiaXRzLCBiaXRzLCBtc3I7CiAJdW5zaWduZWQgaW50IGludF9jbnQsIHBhc3NfY291bnRlciA9IDA7CiAJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQogCQlpZiAoZGV2X2lkID09ICZteHNlcl9ib2FyZHNbaV0pIHsKQEAgLTIzNjAsMTMgKzIzNjYsMTUgQEAKIAkJCQlpZiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKQogCQkJCQlicmVhazsKIAkJCQlpaXIgJj0gTU9YQV9NVVNUX0lJUl9NQVNLOwotCQkJCWlmICghcG9ydC0+cG9ydC50dHkgfHwKKwkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJCQlpZiAoIXR0eSB8fAogCQkJCQkJKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB8fAogCQkJCQkJIShwb3J0LT5wb3J0LmZsYWdzICYKIAkJCQkJCQlBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTFNSKTsKIAkJCQkJb3V0YigweDI3LCBwb3J0LT5pb2FkZHIgKyBVQVJUX0ZDUik7CiAJCQkJCWluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQkJCXR0eV9rcmVmX3B1dCh0dHkpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTIzODcsMjcgKzIzOTUsMjggQEAKIAkJCQkJICAgIGlpciA9PSBNT1hBX01VU1RfSUlSX1JEQSB8fAogCQkJCQkgICAgaWlyID09IE1PWEFfTVVTVF9JSVJfUlRPIHx8CiAJCQkJCSAgICBpaXIgPT0gTU9YQV9NVVNUX0lJUl9MU1IpCi0JCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKHBvcnQsCisJCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKHR0eSwgcG9ydCwKIAkJCQkJCQkJJnN0YXR1cyk7CiAKIAkJCQl9IGVsc2UgewogCQkJCQlzdGF0dXMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKIAkJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0RSKQotCQkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhwb3J0LAorCQkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyh0dHksIHBvcnQsCiAJCQkJCQkJCSZzdGF0dXMpOwogCQkJCX0KIAkJCQltc3IgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NU1IpOwogCQkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpCi0JCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhwb3J0LCBtc3IpOworCQkJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXModHR5LCBwb3J0LCBtc3IpOwogCiAJCQkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpIHsKIAkJCQkJaWYgKGlpciA9PSAweDAyICYmIChzdGF0dXMgJgogCQkJCQkJCQlVQVJUX0xTUl9USFJFKSkKLQkJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworCQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnModHR5LCBwb3J0KTsKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkKLQkJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworCQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnModHR5LCBwb3J0KTsKIAkJCQl9CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCQl9IHdoaWxlIChpbnRfY250KysgPCBNWFNFUl9JU1JfUEFTU19MSU1JVCk7CiAJCQlzcGluX3VubG9jaygmcG9ydC0+c2xvY2spOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKaW5kZXggNjllYzYzOS4uYmFjYjNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25faGRsYy5jCisrKyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpAQCAtNzY0LDcgKzc2NCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZXJyb3IgPSBuX3R0eV9pb2N0bCAodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWVycm9yID0gbl90dHlfaW9jdGxfaGVscGVyKHR0eSwgZmlsZSwgY21kLCBhcmcpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKaW5kZXggYWUzNzdhYTQuLjRhODIxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtMzcyLDE0ICszNzIsOCBAQAogc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCB1bnNpZ25lZCBjaGFyIGNoKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwSW5mby0+dHR5OwotCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KIAkvKiBGSVhNRTogcHV0X2NoYXIgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBhbiBJUlEgKi8KLQlpZiAodHR5LT5vcHMtPnB1dF9jaGFyKSB7Ci0JCXR0eS0+b3BzLT5wdXRfY2hhcih0dHksIGNoKTsKLQl9CisJdHR5X3B1dF9jaGFyKHR0eSwgY2gpOwogCXBJbmZvLT5iY2MgXj0gY2g7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggNzA4YzJiMS4uZWZiZmU5NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC0yNiw3ICsyNiw3IEBACiAgKgogICogMjAwMi8wMy8xOCAgIEltcGxlbWVudGVkIG5fdHR5X3dha2V1cCB0byBzZW5kIFNJR0lPIFBPTExfT1VUcyB0bwogICoJCXdhaXRpbmcgd3JpdGluZyBwcm9jZXNzZXMtU2FwYW4gQmhhdGlhIDxzYXBhbkBjb3Jld2Fycy5vcmc+LgotICoJCUFsc28gZml4ZWQgYSBidWcgaW4gQkxPQ0tJTkcgbW9kZSB3aGVyZSB3cml0ZV9jaGFuIHJldHVybnMKKyAqCQlBbHNvIGZpeGVkIGEgYnVnIGluIEJMT0NLSU5HIG1vZGUgd2hlcmUgbl90dHlfd3JpdGUgcmV0dXJucwogICoJCUVBR0FJTgogICovCiAKQEAgLTk5LDYgKzk5LDcgQEAKIAogc3RhdGljIHZvaWQgbl90dHlfc2V0X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKKwkvKiB0dHktPnJlYWRfY250IGlzIG5vdCByZWFkIGxvY2tlZCA/ICovCiAJaW50CWxlZnQgPSBOX1RUWV9CVUZfU0laRSAtIHR0eS0+cmVhZF9jbnQgLSAxOwogCiAJLyoKQEAgLTEyMSw2ICsxMjIsMTYgQEAKIAl9CiB9CiAKKy8qKgorICoJcHV0X3R0eV9xdWV1ZQkJLQlhZGQgY2hhcmFjdGVyIHRvIHR0eQorICoJQGM6IGNoYXJhY3RlcgorICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCUFkZCBhIGNoYXJhY3RlciB0byB0aGUgdHR5IHJlYWRfYnVmIHF1ZXVlLiBUaGlzIGlzIGRvbmUgdW5kZXIgdGhlCisgKglyZWFkX2xvY2sgdG8gc2VyaWFsaXplIGNoYXJhY3RlciBhZGRpdGlvbiBhbmQgYWxzbyB0byBwcm90ZWN0IHVzCisgKglhZ2FpbnN0IHBhcmFsbGVsIHJlYWRzIG9yIGZsdXNoZXMKKyAqLworCiBzdGF0aWMgdm9pZCBwdXRfdHR5X3F1ZXVlKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTM3LDE0ICsxNDgsMTEgQEAKICAqCWNoZWNrX3VudGhyb3R0bGUJLQlhbGxvdyBuZXcgcmVjZWl2ZSBkYXRhCiAgKglAdHR5OyB0dHkgZGV2aWNlCiAgKgotICoJQ2hlY2sgd2hldGhlciB0byBjYWxsIHRoZSBkcml2ZXIudW50aHJvdHRsZSBmdW5jdGlvbi4KLSAqCVdlIHRlc3QgdGhlIFRUWV9USFJPVFRMRUQgYml0IGZpcnN0IHNvIHRoYXQgaXQgYWx3YXlzCi0gKglpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyCi0gKglpdCBpcyB3b3J0aCBhbGxvd2luZyBtb3JlIGlucHV0IGhhcyBiZWVuIHRha2VuIGJ5IHRoZSBjYWxsZXIuCisgKglDaGVjayB3aGV0aGVyIHRvIGNhbGwgdGhlIGRyaXZlciB1bnRocm90dGxlIGZ1bmN0aW9ucworICoKICAqCUNhbiBzbGVlcCwgbWF5IGJlIGNhbGxlZCB1bmRlciB0aGUgYXRvbWljX3JlYWRfbG9jayBtdXRleCBidXQKICAqCXRoaXMgaXMgbm90IGd1YXJhbnRlZWQuCiAgKi8KLQogc3RhdGljIHZvaWQgY2hlY2tfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWlmICh0dHktPmNvdW50KQpAQCAtMTU4LDYgKzE2Niw4IEBACiAgKglSZXNldCB0aGUgcmVhZCBidWZmZXIgY291bnRlcnMsIGNsZWFyIHRoZSBmbGFncywKICAqCWFuZCBtYWtlIHN1cmUgdGhlIGRyaXZlciBpcyB1bnRocm90dGxlZC4gQ2FsbGVkCiAgKglmcm9tIG5fdHR5X29wZW4oKSBhbmQgbl90dHlfZmx1c2hfYnVmZmVyKCkuCisgKgorICoJTG9ja2luZzogdHR5X3JlYWRfbG9jayBmb3IgcmVhZCBmaWVsZHMuCiAgKi8KIHN0YXRpYyB2b2lkIHJlc2V0X2J1ZmZlcl9mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewpAQCAtMTgxLDcgKzE5MSw3IEBACiAgKglhdCBoYW5ndXApIG9yIHdoZW4gdGhlIE5fVFRZIGxpbmUgZGlzY2lwbGluZSBpbnRlcm5hbGx5IGhhcyB0bwogICoJY2xlYW4gdGhlIHBlbmRpbmcgcXVldWUgKGZvciBleGFtcGxlIHNvbWUgc2lnbmFscykuCiAgKgotICoJTG9ja2luZzogY3RybF9sb2NrCisgKglMb2NraW5nOiBjdHJsX2xvY2ssIHJlYWRfbG9jay4KICAqLwogCiBzdGF0aWMgdm9pZCBuX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTIwNyw2ICsyMTcsOCBAQAogICoKICAqCVJlcG9ydCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnVmZmVyZWQgdG8gYmUgZGVsaXZlcmVkIHRvIHVzZXIKICAqCWF0IHRoaXMgaW5zdGFudCBpbiB0aW1lLgorICoKKyAqCUxvY2tpbmc6IHJlYWRfbG9jawogICovCiAKIHN0YXRpYyBzc2l6ZV90IG5fdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtMzQ2LDcgKzM1OCw3IEBACiAgKgl0aGUgc2ltcGxlIGNhc2VzIG5vcm1hbGx5IGZvdW5kIGFuZCBoZWxwcyB0byBnZW5lcmF0ZSBibG9ja3Mgb2YKICAqCXN5bWJvbHMgZm9yIHRoZSBjb25zb2xlIGRyaXZlciBhbmQgdGh1cyBpbXByb3ZlIHBlcmZvcm1hbmNlLgogICoKLSAqCUNhbGxlZCBmcm9tIHdyaXRlX2NoYW4gdW5kZXIgdGhlIHR0eSBsYXllciB3cml0ZSBsb2NrLiBSZWxpZXMKKyAqCUNhbGxlZCBmcm9tIG5fdHR5X3dyaXRlIHVuZGVyIHRoZSB0dHkgbGF5ZXIgd3JpdGUgbG9jay4gUmVsaWVzCiAgKglvbiBsb2NrX2tlcm5lbCBmb3IgdGhlIHR0eS0+Y29sdW1uIHN0YXRlLgogICovCiAKQEAgLTQxMCw2ICs0MjIsOCBAQAogICoKICAqCUVjaG8gdXNlciBpbnB1dCBiYWNrIG9udG8gdGhlIHNjcmVlbi4gVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4KICAqCUxfRUNITyh0dHkpIGlzIHRydWUuIENhbGxlZCBmcm9tIHRoZSBkcml2ZXIgcmVjZWl2ZV9idWYgcGF0aC4KKyAqCisgKglSZWxpZXMgb24gQktMIGZvciB0dHkgY29sdW1uIGxvY2tpbmcKICAqLwogCiBzdGF0aWMgdm9pZCBlY2hvX2NoYXIodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtNDIyLDYgKzQzNiwxMiBAQAogCQlvcG9zdChjLCB0dHkpOwogfQogCisvKioKKyAqCWZpbnNoX2VyYXNpbmcJCS0JY29tcGxldGUgZXJhc2UKKyAqCUB0dHk6IHR0eSBkb2luZyB0aGUgZXJhc2UKKyAqCisgKglSZWxpZXMgb24gQktMIGZvciB0dHkgY29sdW1uIGxvY2tpbmcKKyAqLwogc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9lcmFzaW5nKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaWYgKHR0eS0+ZXJhc2luZykgewpAQCAtNDM5LDYgKzQ1OSw4IEBACiAgKglQZXJmb3JtIGVyYXNlIGFuZCBuZWNlc3Nhcnkgb3V0cHV0IHdoZW4gYW4gZXJhc2UgY2hhcmFjdGVyIGlzCiAgKglwcmVzZW50IGluIHRoZSBzdHJlYW0gZnJvbSB0aGUgZHJpdmVyIGxheWVyLiBIYW5kbGVzIHRoZSBjb21wbGV4aXRpZXMKICAqCW9mIFVURi04IG11bHRpYnl0ZSBzeW1ib2xzLgorICoKKyAqCUxvY2tpbmc6IHJlYWRfbG9jayBmb3IgdHR5IGJ1ZmZlcnMsIEJLTCBmb3IgY29sdW1uL2VyYXNpbmcgc3RhdGUKICAqLwogCiBzdGF0aWMgdm9pZCBlcmFzZXIodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtNDQ3LDYgKzQ2OSw3IEBACiAJaW50IGhlYWQsIHNlZW5fYWxudW1zLCBjbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCS8qIEZJWE1FOiBsb2NraW5nIG5lZWRlZCA/ICovCiAJaWYgKHR0eS0+cmVhZF9oZWFkID09IHR0eS0+Y2Fub25faGVhZCkgewogCQkvKiBvcG9zdCgnXGEnLCB0dHkpOyAqLwkJLyogd2hhdCBkbyB5b3UgdGhpbms/ICovCiAJCXJldHVybjsKQEAgLTQ4MSw2ICs1MDQsNyBAQAogCX0KIAogCXNlZW5fYWxudW1zID0gMDsKKwkvKiBGSVhNRTogTG9ja2luZyA/PyAqLwogCXdoaWxlICh0dHktPnJlYWRfaGVhZCAhPSB0dHktPmNhbm9uX2hlYWQpIHsKIAkJaGVhZCA9IHR0eS0+cmVhZF9oZWFkOwogCkBAIC01ODMsNiArNjA3LDggQEAKICAqCW1heSBjYXVzIHRlcm1pbmFsIGZsdXNoaW5nIHRvIHRha2UgcGxhY2UgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtaW9zCiAgKglzZXR0aW5ncyBhbmQgY2hhcmFjdGVyIHVzZWQuIENhbGxlZCBmcm9tIHRoZSBkcml2ZXIgcmVjZWl2ZV9idWYKICAqCXBhdGggc28gc2VyaWFsaXplZC4KKyAqCisgKglMb2NraW5nOiBjdHJsX2xvY2ssIHJlYWRfbG9jayAoYm90aCB2aWEgZmx1c2ggYnVmZmVyKQogICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpc2lnKGludCBzaWcsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBmbHVzaCkKQEAgLTEwMDcsMTIgKzEwMzMsMjYgQEAKICAqCWFuZCBpcyBwcm90ZWN0ZWQgZnJvbSByZS1lbnRyeSBieSB0aGUgdHR5IGxheWVyLiBUaGUgdXNlciBpcwogICoJZ3VhcmFudGVlZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgcmUtZW50ZXJlZCBvciBpbiBwcm9ncmVzcwogICoJd2hlbiB0aGUgbGRpc2MgaXMgY2xvc2VkLgorICoKKyAqCUxvY2tpbmc6IENhbGxlciBob2xkcyB0dHktPnRlcm1pb3NfbXV0ZXgKICAqLwogCiBzdGF0aWMgdm9pZCBuX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKLQlpZiAoIXR0eSkKLQkJcmV0dXJuOworCWludCBjYW5vbl9jaGFuZ2UgPSAxOworCUJVR19PTighdHR5KTsKKworCWlmIChvbGQpCisJCWNhbm9uX2NoYW5nZSA9IChvbGQtPmNfbGZsYWcgXiB0dHktPnRlcm1pb3MtPmNfbGZsYWcpICYgSUNBTk9OOworCWlmIChjYW5vbl9jaGFuZ2UpIHsKKwkJbWVtc2V0KCZ0dHktPnJlYWRfZmxhZ3MsIDAsIHNpemVvZiB0dHktPnJlYWRfZmxhZ3MpOworCQl0dHktPmNhbm9uX2hlYWQgPSB0dHktPnJlYWRfdGFpbDsKKwkJdHR5LT5jYW5vbl9kYXRhID0gMDsKKwkJdHR5LT5lcmFzaW5nID0gMDsKKwl9CisKKwlpZiAoY2Fub25fY2hhbmdlICYmICFMX0lDQU5PTih0dHkpICYmIHR0eS0+cmVhZF9jbnQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5yZWFkX3dhaXQpOwogCiAJdHR5LT5pY2Fub24gPSAoTF9JQ0FOT04odHR5KSAhPSAwKTsKIAlpZiAodGVzdF9iaXQoVFRZX0hXX0NPT0tfSU4sICZ0dHktPmZsYWdzKSkgewpAQCAtMTE0Myw3ICsxMTgzLDcgQEAKICAqCUBiOiB1c2VyIGRhdGEKICAqCUBucjogc2l6ZSBvZiBkYXRhCiAgKgotICoJSGVscGVyIGZ1bmN0aW9uIHRvIHNwZWVkIHVwIHJlYWRfY2hhbi4gIEl0IGlzIG9ubHkgY2FsbGVkIHdoZW4KKyAqCUhlbHBlciBmdW5jdGlvbiB0byBzcGVlZCB1cCBuX3R0eV9yZWFkLiAgSXQgaXMgb25seSBjYWxsZWQgd2hlbgogICoJSUNBTk9OIGlzIG9mZjsgaXQgY29waWVzIGNoYXJhY3RlcnMgc3RyYWlnaHQgZnJvbSB0aGUgdHR5IHF1ZXVlIHRvCiAgKgl1c2VyIHNwYWNlIGRpcmVjdGx5LiAgSXQgY2FuIGJlIHByb2ZpdGFibHkgY2FsbGVkIHR3aWNlOyBvbmNlIHRvCiAgKglkcmFpbiB0aGUgc3BhY2UgZnJvbSB0aGUgdGFpbCBwb2ludGVyIHRvIHRoZSAocGh5c2ljYWwpIGVuZCBvZiB0aGUKQEAgLTEyMTAsNyArMTI1MCw3IEBACiAJaWYgKGZpbGUtPmZfb3AtPndyaXRlICE9IHJlZGlyZWN0ZWRfdHR5X3dyaXRlICYmCiAJICAgIGN1cnJlbnQtPnNpZ25hbC0+dHR5ID09IHR0eSkgewogCQlpZiAoIXR0eS0+cGdycCkKLQkJCXByaW50ayhLRVJOX0VSUiAicmVhZF9jaGFuOiBubyB0dHktPnBncnAhXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAibl90dHlfcmVhZDogbm8gdHR5LT5wZ3JwIVxuIik7CiAJCWVsc2UgaWYgKHRhc2tfcGdycChjdXJyZW50KSAhPSB0dHktPnBncnApIHsKIAkJCWlmIChpc19pZ25vcmVkKFNJR1RUSU4pIHx8CiAJCQkgICAgaXNfY3VycmVudF9wZ3JwX29ycGhhbmVkKCkpCkBAIC0xMjI1LDcgKzEyNjUsNyBAQAogCiAKIC8qKgotICoJcmVhZF9jaGFuCQktCXJlYWQgZnVuY3Rpb24gZm9yIHR0eQorICoJbl90dHlfcmVhZAkJLQlyZWFkIGZ1bmN0aW9uIGZvciB0dHkKICAqCUB0dHk6IHR0eSBkZXZpY2UKICAqCUBmaWxlOiBmaWxlIG9iamVjdAogICoJQGJ1ZjogdXNlcnNwYWNlIGJ1ZmZlciBwb2ludGVyCkBAIC0xMjM5LDcgKzEyNzksNyBAQAogICoJVGhpcyBjb2RlIG11c3QgYmUgc3VyZSBuZXZlciB0byBzbGVlcCB0aHJvdWdoIGEgaGFuZ3VwLgogICovCiAKLXN0YXRpYyBzc2l6ZV90IHJlYWRfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBzc2l6ZV90IG5fdHR5X3JlYWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5yKQogewogCXVuc2lnbmVkIGNoYXIgX191c2VyICpiID0gYnVmOwpAQCAtMTI1NCwxMCArMTI5NCw3IEBACiAKIGRvX2l0X2FnYWluOgogCi0JaWYgKCF0dHktPnJlYWRfYnVmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibl90dHlfcmVhZF9jaGFuOiByZWFkX2J1ZiA9PSBOVUxMPyE/XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCUJVR19PTighdHR5LT5yZWFkX2J1Zik7CiAKIAljID0gam9iX2NvbnRyb2wodHR5LCBmaWxlKTsKIAlpZiAoYyA8IDApCkBAIC0xNDQ0LDcgKzE0ODEsNyBAQAogfQogCiAvKioKLSAqCXdyaXRlX2NoYW4JCS0Jd3JpdGUgZnVuY3Rpb24gZm9yIHR0eQorICoJbl90dHlfd3JpdGUJCS0Jd3JpdGUgZnVuY3Rpb24gZm9yIHR0eQogICoJQHR0eTogdHR5IGRldmljZQogICoJQGZpbGU6IGZpbGUgb2JqZWN0CiAgKglAYnVmOiB1c2Vyc3BhY2UgYnVmZmVyIHBvaW50ZXIKQEAgLTE0NTgsNyArMTQ5NSw3IEBACiAgKglUaGlzIGNvZGUgbXVzdCBiZSBzdXJlIG5ldmVyIHRvIHNsZWVwIHRocm91Z2ggYSBoYW5ndXAuCiAgKi8KIAotc3RhdGljIHNzaXplX3Qgd3JpdGVfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBzc2l6ZV90IG5fdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBucikKIHsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpiID0gYnVmOwpAQCAtMTUzMiw3ICsxNTY5LDcgQEAKIH0KIAogLyoqCi0gKglub3JtYWxfcG9sbAkJLQlwb2xsIG1ldGhvZCBmb3IgTl9UVFkKKyAqCW5fdHR5X3BvbGwJCS0JcG9sbCBtZXRob2QgZm9yIE5fVFRZCiAgKglAdHR5OiB0ZXJtaW5hbCBkZXZpY2UKICAqCUBmaWxlOiBmaWxlIGFjY2Vzc2luZyBpdAogICoJQHdhaXQ6IHBvbGwgdGFibGUKQEAgLTE1NDUsNyArMTU4Miw3IEBACiAgKglDYWxsZWQgd2l0aG91dCB0aGUga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIHVuc2lnbmVkIGludCBuX3R0eV9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCQkJCXBvbGxfdGFibGUgKndhaXQpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwpAQCAtMTU3Myw2ICsxNjEwLDQ0IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlucV9jYW5vbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBuciwgaGVhZCwgdGFpbDsKKworCWlmICghdHR5LT5jYW5vbl9kYXRhKQorCQlyZXR1cm4gMDsKKwloZWFkID0gdHR5LT5jYW5vbl9oZWFkOworCXRhaWwgPSB0dHktPnJlYWRfdGFpbDsKKwluciA9IChoZWFkIC0gdGFpbCkgJiAoTl9UVFlfQlVGX1NJWkUtMSk7CisJLyogU2tpcCBFT0YtY2hhcnMuLiAqLworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJaWYgKHRlc3RfYml0KHRhaWwsIHR0eS0+cmVhZF9mbGFncykgJiYKKwkJICAgIHR0eS0+cmVhZF9idWZbdGFpbF0gPT0gX19ESVNBQkxFRF9DSEFSKQorCQkJbnItLTsKKwkJdGFpbCA9ICh0YWlsKzEpICYgKE5fVFRZX0JVRl9TSVpFLTEpOworCX0KKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyBpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0dmFsOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NPVVRROgorCQlyZXR1cm4gcHV0X3VzZXIodHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpLCAoaW50IF9fdXNlciAqKSBhcmcpOworCWNhc2UgVElPQ0lOUToKKwkJLyogRklYTUU6IExvY2tpbmcgKi8KKwkJcmV0dmFsID0gdHR5LT5yZWFkX2NudDsKKwkJaWYgKExfSUNBTk9OKHR0eSkpCisJCQlyZXR2YWwgPSBpbnFfY2Fub24odHR5KTsKKwkJcmV0dXJuIHB1dF91c2VyKHJldHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbl90dHlfaW9jdGxfaGVscGVyKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCX0KK30KKwogc3RydWN0IHR0eV9sZGlzY19vcHMgdHR5X2xkaXNjX05fVFRZID0gewogCS5tYWdpYyAgICAgICAgICAgPSBUVFlfTERJU0NfTUFHSUMsCiAJLm5hbWUgICAgICAgICAgICA9ICJuX3R0eSIsCkBAIC0xNTgwLDExICsxNjU1LDExIEBACiAJLmNsb3NlICAgICAgICAgICA9IG5fdHR5X2Nsb3NlLAogCS5mbHVzaF9idWZmZXIgICAgPSBuX3R0eV9mbHVzaF9idWZmZXIsCiAJLmNoYXJzX2luX2J1ZmZlciA9IG5fdHR5X2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZCAgICAgICAgICAgID0gcmVhZF9jaGFuLAotCS53cml0ZSAgICAgICAgICAgPSB3cml0ZV9jaGFuLAorCS5yZWFkICAgICAgICAgICAgPSBuX3R0eV9yZWFkLAorCS53cml0ZSAgICAgICAgICAgPSBuX3R0eV93cml0ZSwKIAkuaW9jdGwgICAgICAgICAgID0gbl90dHlfaW9jdGwsCiAJLnNldF90ZXJtaW9zICAgICA9IG5fdHR5X3NldF90ZXJtaW9zLAotCS5wb2xsICAgICAgICAgICAgPSBub3JtYWxfcG9sbCwKKwkucG9sbCAgICAgICAgICAgID0gbl90dHlfcG9sbCwKIAkucmVjZWl2ZV9idWYgICAgID0gbl90dHlfcmVjZWl2ZV9idWYsCiAJLndyaXRlX3dha2V1cCAgICA9IG5fdHR5X3dyaXRlX3dha2V1cAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ub3pvbWkuYyBiL2RyaXZlcnMvY2hhci9ub3pvbWkuYwppbmRleCA2NmEwZjkzLi45YTM0YTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbm96b21pLmMKKysrIGIvZHJpdmVycy9jaGFyL25vem9taS5jCkBAIC0xNTk5LDcgKzE1OTksMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdGhlIHVzZXJzcGFjZSBwcm9jZXNzIGNsb3NlIHRoZSB0dHksIC9kZXYvbm96Ki4gKi8KKy8qIENhbGxlZCB3aGVuIHRoZSB1c2Vyc3BhY2UgcHJvY2VzcyBjbG9zZSB0aGUgdHR5LCAvZGV2L25veiouIEFsc28KKyAgIGNhbGxlZCBpbW1lZGlhdGVseSBpZiBudHR5X29wZW4gZmFpbHMgaW4gd2hpY2ggY2FzZSB0dHktPmRyaXZlcl9kYXRhCisgICB3aWxsIGJlIE5VTEwgYW4gd2UgZXhpdCBieSB0aGUgZmlyc3QgcmV0dXJuICovCisKIHN0YXRpYyB2b2lkIG50dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IG5vem9taSAqZGMgPSBnZXRfZGNfYnlfdHR5KHR0eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDAwMF9jcy5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYwppbmRleCBmMDcwYWU3Li5kYmI5MTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDAwMF9jcy5jCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDAwX2NzLmMKQEAgLTE3NTksNjUgKzE3NTksNDAgQEAKIAogLyo9PT09IEludGVyZmFjZSB0byBQQ01DSUEgTGF5ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAorc3RhdGljIGludCBjbTQwMDBfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpZiAoIWNmZy0+aW8ubndpbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgdGhlIElPYWRkciAqLworCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZmctPmlvLndpblswXS5sZW47CisJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJaWYgKCEoY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCWlmICghKGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSBjZmctPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworfQorCiBzdGF0aWMgaW50IGNtNDAwMF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBsaW5rLCBpbnQgZGV2bm8pCiB7CiAJc3RydWN0IGNtNDAwMF9kZXYgKmRldjsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7Ci0JdV9jaGFyIGJ1Zls2NF07Ci0JaW50IGZhaWxfZm4sIGZhaWxfcmM7Ci0JaW50IHJjOwogCiAJLyogcmVhZCB0aGUgY29uZmlnLXR1cGxlcyAqLwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0KLQlsaW5rLT5pby5CYXNlUG9ydDIgPSAwOwotCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JbGluay0+aW8uQXR0cmlidXRlczIgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCWZvciAocmMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7Ci0JICAgICByYyA9PSBDU19TVUNDRVNTOyByYyA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKSB7Ci0KLQkJcmMgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKLQkJaWYgKHJjICE9IENTX1NVQ0NFU1MpCi0JCQljb250aW51ZTsKLQkJcmMgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCQlpZiAocmMgIT0gQ1NfU1VDQ0VTUykKLQkJCWNvbnRpbnVlOwotCi0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OwotCi0JCWlmICghcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby5ud2luKQotCQkJY29udGludWU7Ci0KLQkJLyogR2V0IHRoZSBJT2FkZHIgKi8KLQkJbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuOwotCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQlpZiAoIShwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCWlmICghKHBhcnNlLmNmdGFibGVfZW50cnkuaW8uZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLmZsYWdzCi0JCSAgICAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCi0JCXJjID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJaWYgKHJjID09IENTX1NVQ0NFU1MpCi0JCQlicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQl9Ci0JaWYgKHJjICE9IENTX1NVQ0NFU1MpCisJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBjbTQwMDBfY29uZmlnX2NoZWNrLCBOVUxMKSkKIAkJZ290byBjc19yZWxlYXNlOwogCiAJbGluay0+Y29uZi5JbnRUeXBlID0gMDAwMDAwMDI7CiAKLQlpZiAoKGZhaWxfcmMgPQotCSAgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpICE9IENTX1NVQ0NFU1MpIHsKLQkJZmFpbF9mbiA9IFJlcXVlc3RDb25maWd1cmF0aW9uOworCWlmIChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSkKIAkJZ290byBjc19yZWxlYXNlOwotCX0KIAogCWRldiA9IGxpbmstPnByaXY7CiAJc3ByaW50ZihkZXYtPm5vZGUuZGV2X25hbWUsIERFVklDRV9OQU1FICIlZCIsIGRldm5vKTsKQEAgLTE4OTYsNyArMTg3MSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGNtbV9jbGFzcywgTlVMTCwgTUtERVYobWFqb3IsIGkpLCBOVUxMLCAiY21tJWQiLCBpKTsKKwlkZXZpY2VfY3JlYXRlKGNtbV9jbGFzcywgTlVMTCwgTUtERVYobWFqb3IsIGkpLCBOVUxMLCAiY21tJWQiLCBpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDQwX2NzLmMKaW5kZXggMGI1OTM0Yi4uNGYwNzIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDA0MF9jcy5jCkBAIC01MjYsNjUgKzUyNiw0OSBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBjbTQwNDBfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpbnQgcmM7CisJaWYgKCFjZmctPmlvLm53aW4pCisJCXJldHVybiAtRU5PREVWOworCisJLyogR2V0IHRoZSBJT2FkZHIgKi8KKwlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2ZnLT5pby53aW5bMF0ubGVuOworCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWlmICghKGNmZy0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwlpZiAoIShjZmctPmlvLmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2ZnLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCisJcmMgPSBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZoYW5kbGVfdG9fZGV2KHBfZGV2KSwKKwkJICAgInBjbWNpYV9yZXF1ZXN0X2lvIHJldHVybmVkIDB4JXhcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKwogc3RhdGljIGludCByZWFkZXJfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rLCBpbnQgZGV2bm8pCiB7CiAJc3RydWN0IHJlYWRlcl9kZXYgKmRldjsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7Ci0JdV9jaGFyIGJ1Zls2NF07Ci0JaW50IGZhaWxfZm4sIGZhaWxfcmM7Ci0JaW50IHJjOwotCi0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJaW50IGZhaWxfcmM7CiAKIAlsaW5rLT5pby5CYXNlUG9ydDIgPSAwOwogCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7CiAJbGluay0+aW8uQXR0cmlidXRlczIgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCWZvciAocmMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7Ci0JICAgICByYyA9PSBDU19TVUNDRVNTOwotCSAgICAgcmMgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKSkgewotCQlyYyA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwotCQlpZiAocmMgIT0gQ1NfU1VDQ0VTUykKLQkJCWNvbnRpbnVlOwotCQlyYyA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JCWlmIChyYyAhPSBDU19TVUNDRVNTKQotCQkJY29udGludWU7CiAKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7Ci0KLQkJaWYgKCFwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLm53aW4pCi0JCQljb250aW51ZTsKLQotCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5sZW47Ci0JCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCWlmICghKHBhcnNlLmNmdGFibGVfZW50cnkuaW8uZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJaWYgKCEocGFyc2UuY2Z0YWJsZV9lbnRyeS5pby5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8uZmxhZ3MKLQkJCQkJCSYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCXJjID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQotCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmhhbmRsZV90b19kZXYobGluayksICJmb28iKTsKLQkJaWYgKHJjID09IENTX1NVQ0NFU1MpCi0JCQlicmVhazsKLQkJZWxzZQotCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZoYW5kbGVfdG9fZGV2KGxpbmspLAotCQkJCSAgICJwY21jaWFfcmVxdWVzdF9pbyBmYWlsZWQgMHgleFxuIiwgcmMpOwotCX0KLQlpZiAocmMgIT0gQ1NfU1VDQ0VTUykKKwlpZiAocGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIGNtNDA0MF9jb25maWdfY2hlY2ssIE5VTEwpKQogCQlnb3RvIGNzX3JlbGVhc2U7CiAKIAlsaW5rLT5jb25mLkludFR5cGUgPSAwMDAwMDAwMjsKIAotCWlmICgoZmFpbF9yYyA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywmbGluay0+Y29uZikpCi0JCQkJCQkJCSE9Q1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gUmVxdWVzdENvbmZpZ3VyYXRpb247CisJZmFpbF9yYyA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOworCWlmIChmYWlsX3JjICE9IDApIHsKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZoYW5kbGVfdG9fZGV2KGxpbmspLAogCQkJICAgInBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24gZmFpbGVkIDB4JXhcbiIsCiAJCQkgICBmYWlsX3JjKTsKQEAgLTY1Myw4ICs2MzcsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShjbXhfY2xhc3MsIE5VTEwsIE1LREVWKG1ham9yLCBpKSwgTlVMTCwKLQkJCSAgICAgICJjbXglZCIsIGkpOworCWRldmljZV9jcmVhdGUoY214X2NsYXNzLCBOVUxMLCBNS0RFVihtYWpvciwgaSksIE5VTEwsICJjbXglZCIsIGkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL21haW4uYwppbmRleCA1ZWNhN2E5Li41MjE2ZmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5jCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9tYWluLmMKQEAgLTY1LDkgKzY1LDkgQEAKIAlzdHJ1Y3QgaXB3X2RldiAqaXB3ID0gY29udGFpbmVyX29mKHdvcmtfcmVib290LCBzdHJ1Y3QgaXB3X2RldiwKIAkJCXdvcmtfcmVib290KTsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGlwdy0+bGluazsKLQlpbnQgcmV0ID0gcGNjYXJkX3Jlc2V0X2NhcmQobGluay0+c29ja2V0KTsKKwlpbnQgcmV0ID0gcGNtY2lhX3Jlc2V0X2NhcmQobGluay0+c29ja2V0KTsKIAotCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykKKwlpZiAocmV0ICE9IDApCiAJCWNzX2Vycm9yKGxpbmssIFJlc2V0Q2FyZCwgcmV0KTsKIH0KIApAQCAtODMsNyArODMsNiBAQAogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gaXB3LT5saW5rOwogCWludCByZXQ7Ci0JY29uZmlnX2luZm9fdCBjb25mOwogCXR1cGxlX3QgdHVwbGU7CiAJdW5zaWduZWQgc2hvcnQgYnVmWzY0XTsKIAljaXNwYXJzZV90IHBhcnNlOwpAQCAtMTA1LDcgKzEwNCw3IEBACiAJd2hpbGUgKHJldCA9PSAwKSB7CiAJCXJldCA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwogCi0JCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQlpZiAocmV0ICE9IDApIHsKIAkJCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKIAkJCWdvdG8gZXhpdDA7CiAJCX0KQEAgLTExNiwyMSArMTE1LDIxIEBACiAKIAlyZXQgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7CiAKLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmV0ICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgR2V0Rmlyc3RUdXBsZSwgcmV0KTsKIAkJZ290byBleGl0MDsKIAl9CiAKIAlyZXQgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKIAotCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXQgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBHZXRUdXBsZURhdGEsIHJldCk7CiAJCWdvdG8gZXhpdDA7CiAJfQogCi0JcmV0ID0gcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKKwlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUoJnR1cGxlLCAmcGFyc2UpOwogCi0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFBhcnNlVHVwbGUsIHJldCk7CiAJCWdvdG8gZXhpdDA7CiAJfQpAQCAtMTUyLDIxICsxNTEsMjEgQEAKIAogCXJldCA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKTsKIAotCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXQgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBHZXRGaXJzdFR1cGxlLCByZXQpOwogCQlnb3RvIGV4aXQwOwogCX0KIAogCXJldCA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwogCi0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKIAkJZ290byBleGl0MDsKIAl9CiAKLQlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOworCXJldCA9IHBjbWNpYV9wYXJzZV90dXBsZSgmdHVwbGUsICZwYXJzZSk7CiAKLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmV0ICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgR2V0VHVwbGVEYXRhLCByZXQpOwogCQlnb3RvIGV4aXQwOwogCX0KQEAgLTE4MSw3ICsxODAsNyBAQAogCiAJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKIAotCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXQgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIHJldCk7CiAJCWdvdG8gZXhpdDA7CiAJfQpAQCAtMTk1LDIxICsxOTQsMjEgQEAKIAogCXJldCA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKTsKIAotCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXQgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBHZXRGaXJzdFR1cGxlLCByZXQpOwogCQlnb3RvIGV4aXQxOwogCX0KIAogCXJldCA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwogCi0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKIAkJZ290byBleGl0MTsKIAl9CiAKLQlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOworCXJldCA9IHBjbWNpYV9wYXJzZV90dXBsZSgmdHVwbGUsICZwYXJzZSk7CiAKLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmV0ICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgcmV0KTsKIAkJZ290byBleGl0MTsKIAl9CkBAIC0yMjcsNyArMjI2LDcgQEAKIAkJcmV0ID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLCAmaXB3LT5yZXF1ZXN0X2NvbW1vbl9tZW1vcnksCiAJCQkJJmlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnkpOwogCi0JCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQlpZiAocmV0ICE9IDApIHsKIAkJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RXaW5kb3csIHJldCk7CiAJCQlnb3RvIGV4aXQxOwogCQl9CkBAIC0yMzksNyArMjM4LDcgQEAKIAkJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZShpcHctPmhhbmRsZV9jb21tb25fbWVtb3J5LAogCQkJCSZtZW1yZXFfY29tbW9uX21lbW9yeSk7CiAKLQkJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWlmIChyZXQgIT0gMCkgewogCQkJY3NfZXJyb3IobGluaywgTWFwTWVtUGFnZSwgcmV0KTsKIAkJCWdvdG8gZXhpdDE7CiAJCX0KQEAgLTI2MSw3ICsyNjAsNyBAQAogCQlyZXQgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmssICZpcHctPnJlcXVlc3RfYXR0cl9tZW1vcnksCiAJCQkJJmlwdy0+aGFuZGxlX2F0dHJfbWVtb3J5KTsKIAotCQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJaWYgKHJldCAhPSAwKSB7CiAJCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0V2luZG93LCByZXQpOwogCQkJZ290byBleGl0MjsKIAkJfQpAQCAtMjcyLDcgKzI3MSw3IEBACiAJCXJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UoaXB3LT5oYW5kbGVfYXR0cl9tZW1vcnksCiAJCQkJJm1lbXJlcV9hdHRyX21lbW9yeSk7CiAKLQkJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWlmIChyZXQgIT0gMCkgewogCQkJY3NfZXJyb3IobGluaywgTWFwTWVtUGFnZSwgcmV0KTsKIAkJCWdvdG8gZXhpdDI7CiAJCX0KQEAgLTI5MiwyMCArMjkxLDExIEBACiAKIAlyZXQgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7CiAKLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmV0ICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdElSUSwgcmV0KTsKIAkJZ290byBleGl0MzsKIAl9CiAKLQkvKiBMb29rIHVwIGN1cnJlbnQgVmNjICovCi0KLQlyZXQgPSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZik7Ci0KLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKLQkJY3NfZXJyb3IobGluaywgR2V0Q29uZmlndXJhdGlvbkluZm8sIHJldCk7Ci0JCWdvdG8gZXhpdDQ7Ci0JfQotCiAJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FICI6IENhcmQgdHlwZSAlc1xuIiwKIAkJCWlwdy0+aXNfdjJfY2FyZCA/ICJWMi9WMyIgOiAiVjEiKTsKIAlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUKQEAgLTM0MSw3ICszMzEsNyBAQAogCSAqLwogCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwogCi0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCByZXQpOwogCQlnb3RvIGV4aXQ0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYwppbmRleCAzYTIzZTc2Li41NjlmMmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5jCkBAIC0yNzYsNiArMjc2LDcgQEAKIAlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcm9vbTsKIAorCS8qIEZJWE1FOiBFeGFjdGx5IGhvdyBpcyB0aGUgdHR5IG9iamVjdCBsb2NrZWQgaGVyZSAuLiAqLwogCWlmICghdHR5KQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMzk3LDYgKzM5OCw3IEBACiBzdGF0aWMgaW50IGlwd190aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiBGSVhNRTogRXhhY3RseSBob3cgaXMgdGhlIHR0eSBvYmplY3QgbG9ja2VkIGhlcmUgLi4gKi8KIAogCWlmICghdHR5KQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQxMiw2ICs0MTQsNyBAQAogCSAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewogCXN0cnVjdCBpcHdfdHR5ICp0dHkgPSBsaW51eF90dHktPmRyaXZlcl9kYXRhOworCS8qIEZJWE1FOiBFeGFjdGx5IGhvdyBpcyB0aGUgdHR5IG9iamVjdCBsb2NrZWQgaGVyZSAuLiAqLwogCiAJaWYgKCF0dHkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDMzLDYgKzQzNiw4IEBACiAJaWYgKCF0dHktPm9wZW5fY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogRklYTUU6IEV4YWN0bHkgaG93IGlzIHRoZSB0dHkgb2JqZWN0IGxvY2tlZCBoZXJlIC4uICovCisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVElPQ0dTRVJJQUw6CiAJCXJldHVybiBpcHdpcmVsZXNzX2dldF9zZXJpYWxfaW5mbyh0dHksICh2b2lkIF9fdXNlciAqKSBhcmcpOwpAQCAtNDY3LDEzICs0NzIsNiBAQAogCQkJfQogCQkJcmV0dXJuIDA7CiAKLQkJY2FzZSBUQ0dFVFM6Ci0JCWNhc2UgVENHRVRBOgotCQkJcmV0dXJuIG5fdHR5X2lvY3RsKGxpbnV4X3R0eSwgZmlsZSwgY21kLCBhcmcpOwotCi0JCWNhc2UgVENGTFNIOgotCQkJcmV0dXJuIG5fdHR5X2lvY3RsKGxpbnV4X3R0eSwgZmlsZSwgY21kLCBhcmcpOwotCiAJCWNhc2UgRklPTlJFQUQ6CiAJCQl7CiAJCQkJaW50IHZhbCA9IDA7CkBAIC00ODIsMTAgKzQ4MCwxMSBAQAogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCXJldHVybiAwOworCQljYXNlIFRDRkxTSDoKKwkJCXJldHVybiB0dHlfcGVyZm9ybV9mbHVzaChsaW51eF90dHksIGFyZyk7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXJldHVybiB0dHlfbW9kZV9pb2N0bChsaW51eF90dHksIGZpbGUsIGNtZCAsIGFyZyk7CiB9CiAKIHN0YXRpYyBpbnQgYWRkX3R0eShkZXZfbm9kZV90ICpub2Rlc3AsIGludCBqLApAQCAtNTg4LDYgKzU4Nyw4IEBACiAJCQkJdHR5X2hhbmd1cCh0dHlqLT5saW51eF90dHkpOwogCQkJCS8qIFdhaXQgdGlsbCB0aGUgdHR5X2hhbmd1cCBoYXMgY29tcGxldGVkICovCiAJCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJCQkvKiBGSVhNRTogRXhhY3RseSBob3cgaXMgdGhlIHR0eSBvYmplY3QgbG9ja2VkIGhlcmUKKwkJCQkgICBhZ2FpbnN0IGEgcGFyYWxsZWwgaW9jdGwgZXRjICovCiAJCQkJbXV0ZXhfbG9jaygmdHR5ai0+aXB3X3R0eV9tdXRleCk7CiAJCQl9CiAJCQl3aGlsZSAodHR5ai0+b3Blbl9jb3VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCBjMjQwNTYyLi45YTYyNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC02MDEsNyArNjAxLDcgQEAKIAogICAgIGNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CiAgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKCZ0dXBsZSwgJnBhcnNlKSk7CiAKICAgICBpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOwogICAgIGlmIChjZmctPmluZGV4ID09IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHBkZXYuYyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCmluZGV4IGJlZTM5ZmQuLmM4NGMzNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wcGRldi5jCisrKyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCkBAIC03NjAsOSArNzYwLDggQEAKIAogc3RhdGljIHZvaWQgcHBfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQogewotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShwcGRldl9jbGFzcywgcG9ydC0+ZGV2LAotCQkJICAgICAgTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlciksCi0JCQkgICAgICBOVUxMLCAicGFycG9ydCVkIiwgcG9ydC0+bnVtYmVyKTsKKwlkZXZpY2VfY3JlYXRlKHBwZGV2X2NsYXNzLCBwb3J0LT5kZXYsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpLAorCQkgICAgICBOVUxMLCAicGFycG9ydCVkIiwgcG9ydC0+bnVtYmVyKTsKIH0KIAogc3RhdGljIHZvaWQgcHBfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCmluZGV4IDc2YjI3OTMuLjZkNDU4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wdHkuYworKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTgsMTAgKzgsMTIgQEAKICAqICBBZGRlZCBUVFlfRE9fV1JJVEVfV0FLRVVQIHRvIGVuYWJsZSBuX3R0eSB0byBzZW5kIFBPTExfT1VUIHRvCiAgKiAgICAgIHdhaXRpbmcgd3JpdGVycyAtLSBTYXBhbiBCaGF0aWEgPHNhcGFuQGNvcmV3YXJzLm9yZz4KICAqCi0gKgorICogIFdoZW4gcmVhZGluZyB0aGlzIGNvZGUgc2VlIGFsc28gZnMvZGV2cHRzLiBJbiBwYXJ0aWN1bGFyIG5vdGUgdGhhdCB0aGUKKyAqICBkcml2ZXJfZGF0YSBmaWVsZCBpcyB1c2VkIGJ5IHRoZSBkZXZwdHMgc2lkZSBhcyBhIGJpbmRpbmcgdG8gdGhlIGRldnB0cworICogIGlub2RlLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogRm9yIEVYUE9SVF9TWU1CT0wgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMywyNiArMjUsMjUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZwdHNfZnMuaD4KIAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKwogLyogVGhlc2UgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIGFjY2Vzc2VkIGluIHR0eV9pby5jICovCiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCiBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBwdHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyB2b2lkIHB0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpZiAoIXR0eSkKLQkJcmV0dXJuOwotCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpIHsKLQkJaWYgKHR0eS0+Y291bnQgPiAxKQotCQkJcHJpbnRrKCJtYXN0ZXIgcHR5X2Nsb3NlOiBjb3VudCA9ICVkISFcbiIsIHR0eS0+Y291bnQpOwotCX0gZWxzZSB7CisJQlVHX09OKCF0dHkpOworCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCisJCVdBUk5fT04odHR5LT5jb3VudCA+IDEpOworCWVsc2UgewogCQlpZiAodHR5LT5jb3VudCA+IDIpCiAJCQlyZXR1cm47CiAJfQpAQCAtNTksNyArNjAsNyBAQAogCQlzZXRfYml0KFRUWV9PVEhFUl9DTE9TRUQsICZ0dHktPmZsYWdzKTsKICNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKIAkJaWYgKHR0eS0+ZHJpdmVyID09IHB0bV9kcml2ZXIpCi0JCQlkZXZwdHNfcHR5X2tpbGwodHR5LT5pbmRleCk7CisJCQlkZXZwdHNfcHR5X2tpbGwodHR5LT5saW5rKTsKICNlbmRpZgogCQl0dHlfdmhhbmd1cCh0dHktPmxpbmspOwogCX0KQEAgLTY5LDEzICs3MCwxMyBAQAogICogVGhlIHVudGhyb3R0bGUgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBzaWduYWwKICAqIHRoYXQgaXQgY2FuIHJlY2VpdmUgbW9yZSBjaGFyYWN0ZXJzLiAgRm9yIFBUWSdzLCB0aGUgVFRZX1RIUk9UVExFRAogICogZmxhZyBpcyBhbHdheXMgc2V0LCB0byBmb3JjZSB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGFsd2F5cyBjYWxsIHRoZQotICogdW50aHJvdHRsZSByb3V0aW5lIHdoZW4gdGhlcmUgYXJlIGZld2VyIHRoYW4gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFIAorICogdW50aHJvdHRsZSByb3V0aW5lIHdoZW4gdGhlcmUgYXJlIGZld2VyIHRoYW4gVFRZX1RIUkVTSE9MRF9VTlRIUk9UVExFCiAgKiBjaGFyYWN0ZXJzIGluIHRoZSBxdWV1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGVhY2ggdGltZSB0aGlzCiAgKiBoYXBwZW5zLCB3ZSBuZWVkIHRvIHdha2UgdXAgYW55IHNsZWVwaW5nIHByb2Nlc3NlcyB0aGF0IGNvdWxkIGJlCiAgKiAoMSkgdHJ5aW5nIHRvIHNlbmQgZGF0YSB0byB0aGUgcHR5LCBvciAoMikgd2FpdGluZyBpbiB3YWl0X3VudGlsX3NlbnQoKQogICogZm9yIHRoZSBwdHkgYnVmZmVyIHRvIGJlIGRyYWluZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHB0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIHZvaWQgcHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHkgPSB0dHktPmxpbms7CiAKQEAgLTg3LDcgKzg4LDcgQEAKIH0KIAogLyoKLSAqIFdTSCAwNS8yNC85NzogbW9kaWZpZWQgdG8gCisgKiBXU0ggMDUvMjQvOTc6IG1vZGlmaWVkIHRvCiAgKiAgICgxKSB1c2Ugc3BhY2UgaW4gdHR5LT5mbGlwIGluc3RlYWQgb2YgYSBzaGFyZWQgdGVtcCBidWZmZXIKICAqCSBUaGUgZmxpcCBidWZmZXJzIGFyZW4ndCBiZWluZyB1c2VkIGZvciBhIHB0eSwgc28gdGhlcmUncyBsb3RzCiAgKgkgb2Ygc3BhY2UgYXZhaWxhYmxlLiAgVGhlIGJ1ZmZlciBpcyBwcm90ZWN0ZWQgYnkgYSBwZXItcHR5CkBAIC0xMDAsNyArMTAxLDggQEAKICAqIG5vdCBvdXIgcGFydG5lcnMuIFdlIGNhbid0IGp1c3QgdGFrZSB0aGUgb3RoZXIgb25lIGJsaW5kbHkgd2l0aG91dAogICogcmlza2luZyBkZWFkbG9ja3MuCiAgKi8KLXN0YXRpYyBpbnQgcHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgcHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkJCQkJaW50IGNvdW50KQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0byA9IHR0eS0+bGluazsKIAlpbnQJYzsKQEAgLTExMiw3ICsxMTQsNyBAQAogCWlmIChjID4gY291bnQpCiAJCWMgPSBjb3VudDsKIAl0by0+bGRpc2Mub3BzLT5yZWNlaXZlX2J1Zih0bywgYnVmLCBOVUxMLCBjKTsKLQkKKwogCXJldHVybiBjOwogfQogCkBAIC0xMjgsMTcgKzEzMCwxNyBAQAogCiAvKgogICoJV1NIIDA1LzI0Lzk3OiAgTW9kaWZpZWQgZm9yIGFzeW1tZXRyaWMgTUFTVEVSL1NMQVZFIGJlaGF2aW9yCi0gKglUaGUgY2hhcnNfaW5fYnVmZmVyKCkgdmFsdWUgaXMgdXNlZCBieSB0aGUgbGRpc2Mgc2VsZWN0KCkgZnVuY3Rpb24gCisgKglUaGUgY2hhcnNfaW5fYnVmZmVyKCkgdmFsdWUgaXMgdXNlZCBieSB0aGUgbGRpc2Mgc2VsZWN0KCkgZnVuY3Rpb24KICAqCXRvIGhvbGQgb2ZmIHdyaXRpbmcgd2hlbiBjaGFyc19pbl9idWZmZXIgPiBXQUtFVVBfQ0hBUlMgKD09IDI1NikuCiAgKglUaGUgcHR5IGRyaXZlciBjaGFyc19pbl9idWZmZXIoKSBNYXN0ZXIvU2xhdmUgbXVzdCBiZWhhdmUgZGlmZmVyZW50bHk6CiAgKgogICogICAgICBUaGUgTWFzdGVyIHNpZGUgbmVlZHMgdG8gYWxsb3cgdHlwZWQtYWhlYWQgY29tbWFuZHMgdG8gYWNjdW11bGF0ZQogICogICAgICB3aGlsZSBiZWluZyBjYW5vbmljYWxpemVkLCBzbyB3ZSByZXBvcnQgIm91ciBidWZmZXIiIGFzIGVtcHR5IHVudGlsCiAgKglzb21lIHRocmVzaG9sZCBpcyByZWFjaGVkLCBhbmQgdGhlbiByZXBvcnQgdGhlIGNvdW50LiAoQW55IGNvdW50ID4KLSAqCVdBS0VVUF9DSEFSUyBpcyByZWdhcmRlZCBieSBzZWxlY3QoKSBhcyAiZnVsbCIuKSAgVG8gYXZvaWQgZGVhZGxvY2sgCi0gKgl0aGUgY291bnQgcmV0dXJuZWQgbXVzdCBiZSAwIGlmIG5vIGNhbm9uaWNhbCBkYXRhIGlzIGF2YWlsYWJsZSB0byBiZSAKKyAqCVdBS0VVUF9DSEFSUyBpcyByZWdhcmRlZCBieSBzZWxlY3QoKSBhcyAiZnVsbCIuKSAgVG8gYXZvaWQgZGVhZGxvY2sKKyAqCXRoZSBjb3VudCByZXR1cm5lZCBtdXN0IGJlIDAgaWYgbm8gY2Fub25pY2FsIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlCiAgKglyZWFkLiAoVGhlIE5fVFRZIGxkaXNjLmNoYXJzX2luX2J1ZmZlciBub3cga25vd3MgdGhpcy4pCi0gKiAgCisgKgogICoJVGhlIFNsYXZlIHNpZGUgcGFzc2VzIGFsbCBjaGFyYWN0ZXJzIGluIHJhdyBtb2RlIHRvIHRoZSBNYXN0ZXIgc2lkZSdzCiAgKglidWZmZXIgd2hlcmUgdGhleSBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseSwgc28gaW4gdGhpcyBjYXNlIHdlIGNhbgogICoJcmV0dXJuIHRoZSB0cnVlIGNvdW50IGluIHRoZSBidWZmZXIuCkBAIC0xNTUsMjEgKzE1NywyMiBAQAogCS8qIFRoZSBsZGlzYyBtdXN0IHJlcG9ydCAwIGlmIG5vIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KIAljb3VudCA9IHRvLT5sZGlzYy5vcHMtPmNoYXJzX2luX2J1ZmZlcih0byk7CiAKLQlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpIHJldHVybiBjb3VudDsKKwlpZiAodHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUpCisJCXJldHVybiBjb3VudDsKIAotCS8qIE1hc3RlciBzaWRlIGRyaXZlciAuLi4gaWYgdGhlIG90aGVyIHNpZGUncyByZWFkIGJ1ZmZlciBpcyBsZXNzIHRoYW4gCisJLyogTWFzdGVyIHNpZGUgZHJpdmVyIC4uLiBpZiB0aGUgb3RoZXIgc2lkZSdzIHJlYWQgYnVmZmVyIGlzIGxlc3MgdGhhbgogCSAqIGhhbGYgZnVsbCwgcmV0dXJuIDAgdG8gYWxsb3cgd3JpdGVycyB0byBwcm9jZWVkOyBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIGNvdW50LiAgVGhpcyBsZWF2ZXMgYSBjb21mb3J0YWJsZSBtYXJnaW4gdG8gYXZvaWQgb3ZlcmZsb3csIAorCSAqIHRoZSBjb3VudC4gIFRoaXMgbGVhdmVzIGEgY29tZm9ydGFibGUgbWFyZ2luIHRvIGF2b2lkIG92ZXJmbG93LAogCSAqIGFuZCBzdGlsbCBhbGxvd3MgaGFsZiBhIGJ1ZmZlcidzIHdvcnRoIG9mIHR5cGVkLWFoZWFkIGNvbW1hbmRzLgogCSAqLwotCXJldHVybiAoKGNvdW50IDwgTl9UVFlfQlVGX1NJWkUvMikgPyAwIDogY291bnQpOworCXJldHVybiAoY291bnQgPCBOX1RUWV9CVUZfU0laRS8yKSA/IDAgOiBjb3VudDsKIH0KIAogLyogU2V0IHRoZSBsb2NrIGZsYWcgb24gYSBwdHkgKi8KLXN0YXRpYyBpbnQgcHR5X3NldF9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKiBhcmcpCitzdGF0aWMgaW50IHB0eV9zZXRfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICphcmcpCiB7CiAJaW50IHZhbDsKLQlpZiAoZ2V0X3VzZXIodmFsLGFyZykpCisJaWYgKGdldF91c2VyKHZhbCwgYXJnKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKHZhbCkKIAkJc2V0X2JpdChUVFlfUFRZX0xPQ0ssICZ0dHktPmZsYWdzKTsKQEAgLTE4MiwxMyArMTg1LDEzIEBACiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnRvID0gdHR5LT5saW5rOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCisKIAlpZiAoIXRvKQogCQlyZXR1cm47Ci0JCisKIAlpZiAodG8tPmxkaXNjLm9wcy0+Zmx1c2hfYnVmZmVyKQogCQl0by0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIodG8pOwotCQorCiAJaWYgKHRvLT5wYWNrZXQpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+Y3RybF9sb2NrLCBmbGFncyk7CiAJCXR0eS0+Y3RybF9zdGF0dXMgfD0gVElPQ1BLVF9GTFVTSFdSSVRFOwpAQCAtMTk3LDcgKzIwMCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHB0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgcHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50CXJldHZhbCA9IC1FTk9ERVY7CiAKQEAgLTIyMCwxMyArMjIzLDY1IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgcHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBwdHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKLSAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oQ1NJWkUgfCBQQVJFTkIpOwotICAgICAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKENTOCB8IENSRUFEKTsKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfihDU0laRSB8IFBBUkVOQik7CisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChDUzggfCBDUkVBRCk7CiB9CiAKK3N0YXRpYyBpbnQgcHR5X2luc3RhbGwoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHk7CisJaW50IGlkeCA9IHR0eS0+aW5kZXg7CisJaW50IHJldHZhbDsKKworCW9fdHR5ID0gYWxsb2NfdHR5X3N0cnVjdCgpOworCWlmICghb190dHkpCisJCXJldHVybiAtRU5PTUVNOworCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdmVyLT5vdGhlci0+b3duZXIpKSB7CisJCS8qIFRoaXMgY2Fubm90IGluIGZhY3QgY3VycmVudGx5IGhhcHBlbiAqLworCQlmcmVlX3R0eV9zdHJ1Y3Qob190dHkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaW5pdGlhbGl6ZV90dHlfc3RydWN0KG9fdHR5LCBkcml2ZXItPm90aGVyLCBpZHgpOworCisJLyogV2UgYWx3YXlzIHVzZSBuZXcgdHR5IHRlcm1pb3MgZGF0YSBzbyB3ZSBjYW4gZG8gdGhpcworCSAgIHRoZSBlYXN5IHdheSAuLiAqLworCXJldHZhbCA9IHR0eV9pbml0X3Rlcm1pb3ModHR5KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZyZWVfbWVtX291dDsKKworCXJldHZhbCA9IHR0eV9pbml0X3Rlcm1pb3Mob190dHkpOworCWlmIChyZXR2YWwpIHsKKwkJdHR5X2ZyZWVfdGVybWlvcyh0dHkpOworCQlnb3RvIGZyZWVfbWVtX291dDsKKwl9CisKKwkvKgorCSAqIEV2ZXJ5dGhpbmcgYWxsb2NhdGVkIC4uLiBzZXQgdXAgdGhlIG9fdHR5IHN0cnVjdHVyZS4KKwkgKi8KKwlkcml2ZXItPm90aGVyLT50dHlzW2lkeF0gPSBvX3R0eTsKKwl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlci0+b3RoZXIpOworCWlmIChkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQlvX3R0eS0+Y291bnQrKzsKKwkvKiBFc3RhYmxpc2ggdGhlIGxpbmtzIGluIGJvdGggZGlyZWN0aW9ucyAqLworCXR0eS0+bGluayAgID0gb190dHk7CisJb190dHktPmxpbmsgPSB0dHk7CisKKwl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlcik7CisJdHR5LT5jb3VudCsrOworCWRyaXZlci0+dHR5c1tpZHhdID0gdHR5OworCXJldHVybiAwOworZnJlZV9tZW1fb3V0OgorCW1vZHVsZV9wdXQob190dHktPmRyaXZlci0+b3duZXIpOworCWZyZWVfdHR5X3N0cnVjdChvX3R0eSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBwdHlfb3BzID0geworCS5pbnN0YWxsID0gcHR5X2luc3RhbGwsCiAJLm9wZW4gPSBwdHlfb3BlbiwKIAkuY2xvc2UgPSBwdHlfY2xvc2UsCiAJLndyaXRlID0gcHR5X3dyaXRlLApAQCAtMzI5LDggKzM4NCwxMSBAQAogICogT3RoZXJ3aXNlIG9uZSBjYW4gZWF0IHVwIGFsbCBrZXJuZWwgbWVtb3J5IGJ5IG9wZW5pbmcgL2Rldi9wdG14IHJlcGVhdGVkbHkuCiAgKi8KIGludCBwdHlfbGltaXQgPSBOUl9VTklYOThfUFRZX0RFRkFVTFQ7Ci1zdGF0aWMgaW50IHB0eV9saW1pdF9taW4gPSAwOworc3RhdGljIGludCBwdHlfbGltaXRfbWluOwogc3RhdGljIGludCBwdHlfbGltaXRfbWF4ID0gTlJfVU5JWDk4X1BUWV9NQVg7CitzdGF0aWMgaW50IHB0eV9jb3VudDsKKworc3RhdGljIHN0cnVjdCBjZGV2IHB0bXhfY2RldjsKIAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgcHR5X3RhYmxlW10gPSB7CiAJewpAQCAtMzQ4LDYgKzQwNiw3IEBACiAJCS5wcm9jbmFtZQk9ICJuciIsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA0NDQsCisJCS5kYXRhCQk9ICZwdHlfY291bnQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LCB7CiAJCS5jdGxfbmFtZQk9IDAKQEAgLTM4OCw3ICs0NDcsMTExIEBACiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBwdHlfdW5peDk4X29wcyA9IHsKKy8qKgorICoJcHRtX3VuaXg5OF9sb29rdXAJLQlmaW5kIGEgcHR5IG1hc3RlcgorICoJQGRyaXZlcjogcHRtIGRyaXZlcgorICoJQGlkeDogdHR5IGluZGV4CisgKgorICoJTG9vayB1cCBhIHB0eSBtYXN0ZXIgZGV2aWNlLiBDYWxsZWQgdW5kZXIgdGhlIHR0eV9tdXRleCBmb3Igbm93LgorICoJVGhpcyBwcm92aWRlcyBvdXIgbG9ja2luZy4KKyAqLworCitzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnB0bV91bml4OThfbG9va3VwKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCisJCXN0cnVjdCBpbm9kZSAqcHRtX2lub2RlLCBpbnQgaWR4KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBkZXZwdHNfZ2V0X3R0eShwdG1faW5vZGUsIGlkeCk7CisJaWYgKHR0eSkKKwkJdHR5ID0gdHR5LT5saW5rOworCXJldHVybiB0dHk7Cit9CisKKy8qKgorICoJcHRzX3VuaXg5OF9sb29rdXAJLQlmaW5kIGEgcHR5IHNsYXZlCisgKglAZHJpdmVyOiBwdHMgZHJpdmVyCisgKglAaWR4OiB0dHkgaW5kZXgKKyAqCisgKglMb29rIHVwIGEgcHR5IG1hc3RlciBkZXZpY2UuIENhbGxlZCB1bmRlciB0aGUgdHR5X211dGV4IGZvciBub3cuCisgKglUaGlzIHByb3ZpZGVzIG91ciBsb2NraW5nLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqcHRzX3VuaXg5OF9sb29rdXAoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKKwkJc3RydWN0IGlub2RlICpwdHNfaW5vZGUsIGludCBpZHgpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGRldnB0c19nZXRfdHR5KHB0c19pbm9kZSwgaWR4KTsKKwkvKiBNYXN0ZXIgbXVzdCBiZSBvcGVuIGJlZm9yZSBzbGF2ZSAqLworCWlmICghdHR5KQorCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwlyZXR1cm4gdHR5OworfQorCitzdGF0aWMgdm9pZCBwdHlfdW5peDk4X3NodXRkb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyogV2UgaGF2ZSBvdXIgb3duIG1ldGhvZCBhcyB3ZSBkb24ndCB1c2UgdGhlIHR0eSBpbmRleCAqLworCWtmcmVlKHR0eS0+dGVybWlvcyk7Cit9CisKKy8qIFdlIGhhdmUgbm8gbmVlZCB0byBpbnN0YWxsIGFuZCByZW1vdmUgb3VyIHR0eSBvYmplY3RzIGFzIGRldnB0cyBkb2VzIGFsbAorICAgdGhlIHdvcmsgZm9yIHVzICovCisKK3N0YXRpYyBpbnQgcHR5X3VuaXg5OF9pbnN0YWxsKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5OworCWludCBpZHggPSB0dHktPmluZGV4OworCisJb190dHkgPSBhbGxvY190dHlfc3RydWN0KCk7CisJaWYgKCFvX3R0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2ZXItPm90aGVyLT5vd25lcikpIHsKKwkJLyogVGhpcyBjYW5ub3QgaW4gZmFjdCBjdXJyZW50bHkgaGFwcGVuICovCisJCWZyZWVfdHR5X3N0cnVjdChvX3R0eSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpbml0aWFsaXplX3R0eV9zdHJ1Y3Qob190dHksIGRyaXZlci0+b3RoZXIsIGlkeCk7CisKKwl0dHktPnRlcm1pb3MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3NbMl0pLCBHRlBfS0VSTkVMKTsKKwlpZiAodHR5LT50ZXJtaW9zID09IE5VTEwpCisJCWdvdG8gZnJlZV9tZW1fb3V0OworCSp0dHktPnRlcm1pb3MgPSBkcml2ZXItPmluaXRfdGVybWlvczsKKwl0dHktPnRlcm1pb3NfbG9ja2VkID0gdHR5LT50ZXJtaW9zICsgMTsKKworCW9fdHR5LT50ZXJtaW9zID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zWzJdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG9fdHR5LT50ZXJtaW9zID09IE5VTEwpCisJCWdvdG8gZnJlZV9tZW1fb3V0OworCSpvX3R0eS0+dGVybWlvcyA9IGRyaXZlci0+b3RoZXItPmluaXRfdGVybWlvczsKKwlvX3R0eS0+dGVybWlvc19sb2NrZWQgPSBvX3R0eS0+dGVybWlvcyArIDE7CisKKwl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlci0+b3RoZXIpOworCWlmIChkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQlvX3R0eS0+Y291bnQrKzsKKwkvKiBFc3RhYmxpc2ggdGhlIGxpbmtzIGluIGJvdGggZGlyZWN0aW9ucyAqLworCXR0eS0+bGluayAgID0gb190dHk7CisJb190dHktPmxpbmsgPSB0dHk7CisJLyoKKwkgKiBBbGwgc3RydWN0dXJlcyBoYXZlIGJlZW4gYWxsb2NhdGVkLCBzbyBub3cgd2UgaW5zdGFsbCB0aGVtLgorCSAqIEZhaWx1cmVzIGFmdGVyIHRoaXMgcG9pbnQgdXNlIHJlbGVhc2VfdHR5IHRvIGNsZWFuIHVwLCBzbworCSAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBudWxsIG91dCB0aGUgbG9jYWwgcG9pbnRlcnMuCisJICovCisJdHR5X2RyaXZlcl9rcmVmX2dldChkcml2ZXIpOworCXR0eS0+Y291bnQrKzsKKwlwdHlfY291bnQrKzsKKwlyZXR1cm4gMDsKK2ZyZWVfbWVtX291dDoKKwlrZnJlZShvX3R0eS0+dGVybWlvcyk7CisJbW9kdWxlX3B1dChvX3R0eS0+ZHJpdmVyLT5vd25lcik7CisJZnJlZV90dHlfc3RydWN0KG9fdHR5KTsKKwlrZnJlZSh0dHktPnRlcm1pb3MpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBwdHlfdW5peDk4X3JlbW92ZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXB0eV9jb3VudC0tOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHB0bV91bml4OThfb3BzID0geworCS5sb29rdXAgPSBwdG1fdW5peDk4X2xvb2t1cCwKKwkuaW5zdGFsbCA9IHB0eV91bml4OThfaW5zdGFsbCwKKwkucmVtb3ZlID0gcHR5X3VuaXg5OF9yZW1vdmUsCiAJLm9wZW4gPSBwdHlfb3BlbiwKIAkuY2xvc2UgPSBwdHlfY2xvc2UsCiAJLndyaXRlID0gcHR5X3dyaXRlLApAQCAtMzk3LDkgKzU2MCw4OSBAQAogCS5jaGFyc19pbl9idWZmZXIgPSBwdHlfY2hhcnNfaW5fYnVmZmVyLAogCS51bnRocm90dGxlID0gcHR5X3VudGhyb3R0bGUsCiAJLnNldF90ZXJtaW9zID0gcHR5X3NldF90ZXJtaW9zLAotCS5pb2N0bCA9IHB0eV91bml4OThfaW9jdGwKKwkuaW9jdGwgPSBwdHlfdW5peDk4X2lvY3RsLAorCS5zaHV0ZG93biA9IHB0eV91bml4OThfc2h1dGRvd24KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcHR5X3VuaXg5OF9vcHMgPSB7CisJLmxvb2t1cCA9IHB0c191bml4OThfbG9va3VwLAorCS5pbnN0YWxsID0gcHR5X3VuaXg5OF9pbnN0YWxsLAorCS5yZW1vdmUgPSBwdHlfdW5peDk4X3JlbW92ZSwKKwkub3BlbiA9IHB0eV9vcGVuLAorCS5jbG9zZSA9IHB0eV9jbG9zZSwKKwkud3JpdGUgPSBwdHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPSBwdHlfd3JpdGVfcm9vbSwKKwkuZmx1c2hfYnVmZmVyID0gcHR5X2ZsdXNoX2J1ZmZlciwKKwkuY2hhcnNfaW5fYnVmZmVyID0gcHR5X2NoYXJzX2luX2J1ZmZlciwKKwkudW50aHJvdHRsZSA9IHB0eV91bnRocm90dGxlLAorCS5zZXRfdGVybWlvcyA9IHB0eV9zZXRfdGVybWlvcywKKwkuc2h1dGRvd24gPSBwdHlfdW5peDk4X3NodXRkb3duCit9OworCisvKioKKyAqCXB0bXhfb3BlbgkJLQlvcGVuIGEgdW5peCA5OCBwdHkgbWFzdGVyCisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZSBmaWxlCisgKglAZmlscDogZmlsZSBwb2ludGVyIHRvIHR0eQorICoKKyAqCUFsbG9jYXRlIGEgdW5peDk4IHB0eSBtYXN0ZXIgZGV2aWNlIGZyb20gdGhlIHB0bXggZHJpdmVyLgorICoKKyAqCUxvY2tpbmc6IHR0eV9tdXRleCBwcm90ZWN0cyB0aGUgaW5pdF9kZXYgd29yay4gdHR5LT5jb3VudCBzaG91bGQKKyAqIAkJcHJvdGVjdCB0aGUgcmVzdC4KKyAqCQlhbGxvY2F0ZWRfcHR5c19sb2NrIGhhbmRsZXMgdGhlIGxpc3Qgb2YgZnJlZSBwdHkgbnVtYmVycworICovCisKK3N0YXRpYyBpbnQgX19wdG14X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgcmV0dmFsOworCWludCBpbmRleDsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOworCisJLyogZmluZCBhIGRldmljZSB0aGF0IGlzIG5vdCBpbiB1c2UuICovCisJaW5kZXggPSBkZXZwdHNfbmV3X2luZGV4KGlub2RlKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOworCXR0eSA9IHR0eV9pbml0X2RldihwdG1fZHJpdmVyLCBpbmRleCwgMSk7CisJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOworCisJaWYgKElTX0VSUih0dHkpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIodHR5KTsKKwkJZ290byBvdXQ7CisJfQorCisJc2V0X2JpdChUVFlfUFRZX0xPQ0ssICZ0dHktPmZsYWdzKTsgLyogTE9DSyBUSEUgU0xBVkUgKi8KKwlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7CisJZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7CisKKwlyZXR2YWwgPSBkZXZwdHNfcHR5X25ldyhpbm9kZSwgdHR5LT5saW5rKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDE7CisKKwlyZXR2YWwgPSBwdG1fZHJpdmVyLT5vcHMtPm9wZW4odHR5LCBmaWxwKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dXJuIDA7CitvdXQxOgorCXR0eV9yZWxlYXNlX2RldihmaWxwKTsKKwlyZXR1cm4gcmV0dmFsOworb3V0OgorCWRldnB0c19raWxsX2luZGV4KGlub2RlLCBpbmRleCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBwdG14X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisJcmV0ID0gX19wdG14X29wZW4oaW5vZGUsIGZpbHApOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwdG14X2ZvcHM7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB1bml4OThfcHR5X2luaXQodm9pZCkKIHsKQEAgLTQyNyw3ICs2NzAsNyBAQAogCXB0bV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TIHwgVFRZX0RSSVZFUl9SRUFMX1JBVyB8CiAJCVRUWV9EUklWRVJfRFlOQU1JQ19ERVYgfCBUVFlfRFJJVkVSX0RFVlBUU19NRU07CiAJcHRtX2RyaXZlci0+b3RoZXIgPSBwdHNfZHJpdmVyOwotCXR0eV9zZXRfb3BlcmF0aW9ucyhwdG1fZHJpdmVyLCAmcHR5X3VuaXg5OF9vcHMpOworCXR0eV9zZXRfb3BlcmF0aW9ucyhwdG1fZHJpdmVyLCAmcHRtX3VuaXg5OF9vcHMpOwogCiAJcHRzX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwdHNfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJwdHlfc2xhdmUiOwpAQCAtNDQzLDE2ICs2ODYsMjYgQEAKIAlwdHNfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVcgfAogCQlUVFlfRFJJVkVSX0RZTkFNSUNfREVWIHwgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOwogCXB0c19kcml2ZXItPm90aGVyID0gcHRtX2RyaXZlcjsKLQl0dHlfc2V0X29wZXJhdGlvbnMocHRzX2RyaXZlciwgJnB0eV9vcHMpOwotCQorCXR0eV9zZXRfb3BlcmF0aW9ucyhwdHNfZHJpdmVyLCAmcHR5X3VuaXg5OF9vcHMpOworCiAJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocHRtX2RyaXZlcikpCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBVbml4OTggcHRtIGRyaXZlciIpOwogCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHB0c19kcml2ZXIpKQogCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgVW5peDk4IHB0cyBkcml2ZXIiKTsKIAotCXB0eV90YWJsZVsxXS5kYXRhID0gJnB0bV9kcml2ZXItPnJlZmNvdW50OwogCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShwdHlfcm9vdF90YWJsZSk7CisKKwkvKiBOb3cgY3JlYXRlIHRoZSAvZGV2L3B0bXggc3BlY2lhbCBkZXZpY2UgKi8KKwl0dHlfZGVmYXVsdF9mb3BzKCZwdG14X2ZvcHMpOworCXB0bXhfZm9wcy5vcGVuID0gcHRteF9vcGVuOworCisJY2Rldl9pbml0KCZwdG14X2NkZXYsICZwdG14X2ZvcHMpOworCWlmIChjZGV2X2FkZCgmcHRteF9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCAxKSB8fAorCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIDEsICIvZGV2L3B0bXgiKSA8IDApCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3B0bXggZHJpdmVyXG4iKTsKKwlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgTlVMTCwgInB0bXgiKTsKIH0KKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB1bml4OThfcHR5X2luaXQodm9pZCkgeyB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCA3Y2UxYWM0Li5jODc1MmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC02NjEsMTAgKzY2MSwxMCBAQAogCWlmICghZGlzayB8fCAhZGlzay0+cmFuZG9tKQogCQlyZXR1cm47CiAJLyogZmlyc3QgbWFqb3IgaXMgMSwgc28gd2UgZ2V0ID49IDB4MjAwIGhlcmUgKi8KLQlERUJVR19FTlQoImRpc2sgZXZlbnQgJWQ6JWRcbiIsIGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcik7CisJREVCVUdfRU5UKCJkaXNrIGV2ZW50ICVkOiVkXG4iLAorCQkgIE1BSk9SKGRpc2tfZGV2dChkaXNrKSksIE1JTk9SKGRpc2tfZGV2dChkaXNrKSkpOwogCi0JYWRkX3RpbWVyX3JhbmRvbW5lc3MoZGlzay0+cmFuZG9tLAotCQkJICAgICAweDEwMCArIE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcikpOworCWFkZF90aW1lcl9yYW5kb21uZXNzKGRpc2stPnJhbmRvbSwgMHgxMDAgKyBkaXNrX2RldnQoZGlzaykpOwogfQogI2VuZGlmCiAKQEAgLTEyMDUsNyArMTIwNSw3IEBACiAJcmV0dXJuIHByb2NfZG9zdHJpbmcoJmZha2VfdGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogfQogCi1zdGF0aWMgaW50IHV1aWRfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgaW50IHV1aWRfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwKIAkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmF3LmMgYi9kcml2ZXJzL2NoYXIvcmF3LmMKaW5kZXggNDdiOGNmMi4uZTEzOTM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jhdy5jCisrKyBiL2RyaXZlcnMvY2hhci9yYXcuYwpAQCAtMTMxLDggKzEzMSw4IEBACiBzdGF0aWMgdm9pZCBiaW5kX2RldmljZShzdHJ1Y3QgcmF3X2NvbmZpZ19yZXF1ZXN0ICpycSkKIHsKIAlkZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vcikpOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShyYXdfY2xhc3MsIE5VTEwsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vciksCi0JCQkgICAgICBOVUxMLCAicmF3JWQiLCBycS0+cmF3X21pbm9yKTsKKwlkZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCBycS0+cmF3X21pbm9yKSwgTlVMTCwKKwkJICAgICAgInJhdyVkIiwgcnEtPnJhd19taW5vcik7CiB9CiAKIC8qCkBAIC0yODMsOCArMjgzLDcgQEAKIAkJcmV0ID0gUFRSX0VSUihyYXdfY2xhc3MpOwogCQlnb3RvIGVycm9yX3JlZ2lvbjsKIAl9Ci0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCAwKSwgTlVMTCwKLQkJCSAgICAgICJyYXdjdGwiKTsKKwlkZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCAwKSwgTlVMTCwgInJhd2N0bCIpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ydGMuYyBiL2RyaXZlcnMvY2hhci9ydGMuYwppbmRleCBmNTNkNGQwLi4xNzY4M2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3J0Yy5jCkBAIC04OCwxNSArODgsMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NQQVJDMzIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8YXNtL2VidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfcG9ydDsKLXN0YXRpYyBpbnQgcnRjX2lycSA9IFBDSV9JUlFfTk9ORTsKK3N0YXRpYyBpbnQgcnRjX2lycTsKICNlbmRpZgogCi0jaWZkZWYJQ09ORklHX0hQRVRfUlRDX0lSUQorI2lmZGVmCUNPTkZJR19IUEVUX0VNVUxBVEVfUlRDCiAjdW5kZWYJUlRDX0lSUQogI2VuZGlmCiAKQEAgLTk3Myw4ICs5NzMsOCBAQAogCWNoYXIgKmd1ZXNzID0gTlVMTDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TUEFSQzMyCi0Jc3RydWN0IGxpbnV4X2VidXMgKmVidXM7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZWJ1c19kcDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcDsKICNlbHNlCiAJdm9pZCAqcjsKICNpZmRlZiBSVENfSVJRCkBAIC05ODMsMTIgKzk4MywxNiBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU1BBUkMzMgotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmIChzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAicnRjIikgPT0gMCkgewotCQkJCXJ0Y19wb3J0ID0gZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JCQkJcnRjX2lycSA9IGVkZXYtPmlycXNbMF07Ci0JCQkJZ290byBmb3VuZDsKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZWJ1c19kcCwgImVidXMiKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJCWZvciAoZHAgPSBlYnVzX2RwOyBkcDsgZHAgPSBkcC0+c2libGluZykgeworCQkJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJydGMiKSkgeworCQkJCW9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisJCQkJaWYgKG9wKSB7CisJCQkJCXJ0Y19wb3J0ID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCQkJCQlydGNfaXJxID0gb3AtPmlycXNbMF07CisJCQkJCWdvdG8gZm91bmQ7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtOTk3LDcgKzEwMDEsNyBAQAogCXJldHVybiAtRUlPOwogCiBmb3VuZDoKLQlpZiAocnRjX2lycSA9PSBQQ0lfSVJRX05PTkUpIHsKKwlpZiAoIXJ0Y19pcnEpIHsKIAkJcnRjX2hhc19pcnEgPSAwOwogCQlnb3RvIG5vX2lycTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5jIGIvZHJpdmVycy9jaGFyL3Nuc2MuYwppbmRleCAzY2U2MGRmLi4zMmI3NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc25zYy5jCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjLmMKQEAgLTQ0NCw4ICs0NDQsOCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlkZXZpY2VfY3JlYXRlX2RydmRhdGEoc25zY19jbGFzcywgTlVMTCwgZGV2LCBOVUxMLAotCQkJCQkgICAgICAiJXMiLCBkZXZuYW1lKTsKKwkJCWRldmljZV9jcmVhdGUoc25zY19jbGFzcywgTlVMTCwgZGV2LCBOVUxMLAorCQkJCSAgICAgICIlcyIsIGRldm5hbWUpOwogCiAJCQlpYTY0X3NuX2lydHJfaW50cl9lbmFibGUoc2NkLT5zY2RfbmFzaWQsCiAJCQkJCQkgMCAvKmlnbm9yZWQgKi8gLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCAxOWRiMWViLi45NjNiMDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtNDA1LDkgKzQwNSw5IEBACiAKIHN0YXRpYyBpbnQJc3RsX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludAlzdGxfYnJkaW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwKTsKLXN0YXRpYyBpbnQJc3RsX2dldHBvcnRzdGF0cyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bF9nZXRwb3J0c3RhdHMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApOwogc3RhdGljIGludAlzdGxfY2xycG9ydHN0YXRzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKLXN0YXRpYyBpbnQJc3RsX3dhaXRjYXJyaWVyKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIGludAlzdGxfd2FpdGNhcnJpZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIC8qCiAgKglDRDE0MDAgdWFydCBzcGVjaWZpYyBoYW5kbGluZyBmdW5jdGlvbnMuCkBAIC02MTIsOCArNjEyLDkgQEAKIHN0YXRpYyB2b2lkIHN0bF9jZF9jaGFuZ2Uoc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGludCBvbGRzaWdzID0gcG9ydHAtPnNpZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKIAotCWlmICghcG9ydHAtPnBvcnQudHR5KQorCWlmICghdHR5KQogCQlyZXR1cm47CiAKIAlwb3J0cC0+c2lncyA9IHN0bF9nZXRzaWduYWxzKHBvcnRwKTsKQEAgLTYyMyw3ICs2MjQsOCBAQAogCiAJaWYgKChvbGRzaWdzICYgVElPQ01fQ0QpICYmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCiAJCWlmIChwb3J0cC0+cG9ydC5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKQotCQkJdHR5X2hhbmd1cChwb3J0cC0+cG9ydC50dHkpOworCQkJdHR5X2hhbmd1cCh0dHkpOworCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCiAvKgpAQCAtNzM0LDcgKzczNiw3IEBACiAgKglPbiB0aGUgZmlyc3Qgb3BlbiBvZiB0aGUgZGV2aWNlIHNldHVwIHRoZSBwb3J0IGhhcmR3YXJlLCBhbmQKICAqCWluaXRpYWxpemUgdGhlIHBlciBwb3J0IGRhdGEgc3RydWN0dXJlLgogICovCi0JcG9ydHAtPnBvcnQudHR5ID0gdHR5OworCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnRwLT5wb3J0LCB0dHkpOwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0cDsKIAlwb3J0cC0+cG9ydC5jb3VudCsrOwogCkBAIC03NzQsNyArNzc2LDcgQEAKICAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCiAgKi8KIAlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCi0JCWlmICgocmMgPSBzdGxfd2FpdGNhcnJpZXIocG9ydHAsIGZpbHApKSAhPSAwKQorCQlpZiAoKHJjID0gc3RsX3dhaXRjYXJyaWVyKHR0eSwgcG9ydHAsIGZpbHApKSAhPSAwKQogCQkJcmV0dXJuIHJjOwogCiAJcG9ydHAtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKQEAgLTc4OSw3ICs3OTEsOCBAQAogICoJbWF5YmUgYmVjYXVzZSBpZiB3ZSBhcmUgY2xvY2FsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byB3YWl0Li4uCiAgKi8KIAotc3RhdGljIGludCBzdGxfd2FpdGNhcnJpZXIoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgc3RsX3dhaXRjYXJyaWVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwKKwkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCWludAkJcmMsIGRvY2xvY2FsOwpAQCAtODAxLDcgKzgwNCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhbGxpb25fbG9jaywgZmxhZ3MpOwogCi0JaWYgKHBvcnRwLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQogCQlkb2Nsb2NhbCsrOwogCiAJcG9ydHAtPm9wZW53YWl0Y250Kys7CkBAIC04NDYsOCArODQ5LDYgQEAKIAogCXByX2RlYnVnKCJzdGxfZmx1c2hidWZmZXIodHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtODY1LDggKzg2Niw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX3dhaXR1bnRpbHNlbnQodHR5PSVwLHRpbWVvdXQ9JWQpXG4iLCB0dHksIHRpbWVvdXQpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC05NDksNyArOTQ4LDcgQEAKIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAogCXR0eS0+Y2xvc2luZyA9IDA7Ci0JcG9ydHAtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0cC0+cG9ydCwgTlVMTCk7CiAKIAlpZiAocG9ydHAtPm9wZW53YWl0Y250KSB7CiAJCWlmIChwb3J0cC0+Y2xvc2VfZGVsYXkpCkBAIC0xMDMzLDggKzEwMzIsNiBAQAogCiAJcHJfZGVidWcoInN0bF9wdXRjaGFyKHR0eT0lcCxjaD0leClcbiIsIHR0eSwgY2gpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA3MCw4ICsxMDY3LDYgQEAKIAogCXByX2RlYnVnKCJzdGxfZmx1c2hjaGFycyh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xMDkwLDggKzEwODUsNiBAQAogCiAJcHJfZGVidWcoInN0bF93cml0ZXJvb20odHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKQEAgLTExMjIsOCArMTExNSw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX2NoYXJzaW5idWZmZXIodHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKQEAgLTExODMsOCArMTE3NCw5IEBACiAgKglqdXN0IHF1aWV0bHkgaWdub3JlIGFueSByZXF1ZXN0cyB0byBjaGFuZ2UgaXJxLCBldGMuCiAgKi8KIAotc3RhdGljIGludCBzdGxfc2V0c2VyaWFsKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3N0YXRpYyBpbnQgc3RsX3NldHNlcmlhbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQogeworCXN0cnVjdCBzdGxwb3J0ICoJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBzZXJpYWxfc3RydWN0CXNpbzsKIAogCXByX2RlYnVnKCJzdGxfc2V0c2VyaWFsKHBvcnRwPSVwLHNwPSVwKVxuIiwgcG9ydHAsIHNwKTsKQEAgLTEyMDUsNyArMTE5Nyw3IEBACiAJcG9ydHAtPmNsb3NlX2RlbGF5ID0gc2lvLmNsb3NlX2RlbGF5OwogCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSBzaW8uY2xvc2luZ193YWl0OwogCXBvcnRwLT5jdXN0b21fZGl2aXNvciA9IHNpby5jdXN0b21fZGl2aXNvcjsKLQlzdGxfc2V0cG9ydChwb3J0cCwgcG9ydHAtPnBvcnQudHR5LT50ZXJtaW9zKTsKKwlzdGxfc2V0cG9ydChwb3J0cCwgdHR5LT50ZXJtaW9zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxNSw4ICsxMjA3LDYgQEAKIHsKIAlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMjMyLDggKzEyMjIsNiBAQAogCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKIAlpbnQgcnRzID0gLTEsIGR0ciA9IC0xOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI2Miw4ICsxMjUwLDYgQEAKIAlwcl9kZWJ1Zygic3RsX2lvY3RsKHR0eT0lcCxmaWxlPSVwLGNtZD0leCxhcmc9JWx4KVxuIiwgdHR5LCBmaWxlLCBjbWQsCiAJCQlhcmcpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI4MiwxMCArMTI2OCwxMCBAQAogCQlyYyA9IHN0bF9nZXRzZXJpYWwocG9ydHAsIGFyZ3ApOwogCQlicmVhazsKIAljYXNlIFRJT0NTU0VSSUFMOgotCQlyYyA9IHN0bF9zZXRzZXJpYWwocG9ydHAsIGFyZ3ApOworCQlyYyA9IHN0bF9zZXRzZXJpYWwodHR5LCBhcmdwKTsKIAkJYnJlYWs7CiAJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgotCQlyYyA9IHN0bF9nZXRwb3J0c3RhdHMocG9ydHAsIGFyZ3ApOworCQlyYyA9IHN0bF9nZXRwb3J0c3RhdHModHR5LCBwb3J0cCwgYXJncCk7CiAJCWJyZWFrOwogCWNhc2UgQ09NX0NMUlBPUlRTVEFUUzoKIAkJcmMgPSBzdGxfY2xycG9ydHN0YXRzKHBvcnRwLCBhcmdwKTsKQEAgLTEzMTcsOCArMTMwMyw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX3N0YXJ0KHR0eT0lcClcbiIsIHR0eSk7CiAKLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTEzMzQsOCArMTMxOCw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX3NldHRlcm1pb3ModHR5PSVwLG9sZD0lcClcbiIsIHR0eSwgb2xkKTsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTM2OSw4ICsxMzUxLDYgQEAKIAogCXByX2RlYnVnKCJzdGxfdGhyb3R0bGUodHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTM4OSw4ICsxMzY5LDYgQEAKIAogCXByX2RlYnVnKCJzdGxfdW50aHJvdHRsZSh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNDEwLDggKzEzODgsNiBAQAogCiAJcHJfZGVidWcoInN0bF9zdG9wKHR0eT0lcClcbiIsIHR0eSk7CiAKLQlpZiAodHR5ID09IE5VTEwpCi0JCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTE0MzIsOCArMTQwOCw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX2hhbmd1cCh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNDUyLDcgKzE0MjYsNyBAQAogCQlwb3J0cC0+dHguaGVhZCA9IE5VTEw7CiAJCXBvcnRwLT50eC50YWlsID0gTlVMTDsKIAl9Ci0JcG9ydHAtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0cC0+cG9ydCwgTlVMTCk7CiAJcG9ydHAtPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CiAJcG9ydHAtPnBvcnQuY291bnQgPSAwOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPnBvcnQub3Blbl93YWl0KTsKQEAgLTE0NjYsOCArMTQ0MCw2IEBACiAKIAlwcl9kZWJ1Zygic3RsX2JyZWFrY3RsKHR0eT0lcCxzdGF0ZT0lZClcbiIsIHR0eSwgc3RhdGUpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ4NCw4ICsxNDU2LDYgQEAKIAogCXByX2RlYnVnKCJzdGxfc2VuZHhjaGFyKHR0eT0lcCxjaD0leClcbiIsIHR0eSwgY2gpOwogCi0JaWYgKHR0eSA9PSBOVUxMKQotCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xODA1LDcgKzE3NzUsNyBAQAogCQkJCSIoc2l6ZT0lWmQpXG4iLCBzaXplb2Yoc3RydWN0IHN0bHBvcnQpKTsKIAkJCWJyZWFrOwogCQl9Ci0KKwkJdHR5X3BvcnRfaW5pdCgmcG9ydHAtPnBvcnQpOwogCQlwb3J0cC0+bWFnaWMgPSBTVExfUE9SVE1BR0lDOwogCQlwb3J0cC0+cG9ydG5yID0gaTsKIAkJcG9ydHAtPmJyZG5yID0gcGFuZWxwLT5icmRucjsKQEAgLTE4MzIsNiArMTgwMiw3IEBACiAJc3RydWN0IHN0bHBhbmVsICpwYW5lbHA7CiAJc3RydWN0IHN0bHBvcnQgKnBvcnRwOwogCXVuc2lnbmVkIGludCBqLCBrOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlmb3IgKGogPSAwOyBqIDwgU1RMX01BWFBBTkVMUzsgaisrKSB7CiAJCXBhbmVscCA9IGJyZHAtPnBhbmVsc1tqXTsKQEAgLTE4NDEsOCArMTgxMiwxMSBAQAogCQkJcG9ydHAgPSBwYW5lbHAtPnBvcnRzW2tdOwogCQkJaWYgKHBvcnRwID09IE5VTEwpCiAJCQkJY29udGludWU7Ci0JCQlpZiAocG9ydHAtPnBvcnQudHR5ICE9IE5VTEwpCi0JCQkJc3RsX2hhbmd1cChwb3J0cC0+cG9ydC50dHkpOworCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydHAtPnBvcnQpOworCQkJaWYgKHR0eSAhPSBOVUxMKSB7CisJCQkJc3RsX2hhbmd1cCh0dHkpOworCQkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQkJfQogCQkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7CiAJCQlrZnJlZShwb3J0cCk7CiAJCX0KQEAgLTI0OTgsNyArMjQ3Miw3IEBACiAgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RhdHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCitzdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RhdHMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCiB7CiAJY29tc3RhdHNfdAlzdGxfY29tc3RhdHM7CiAJdW5zaWduZWQgY2hhcgkqaGVhZCwgKnRhaWw7CkBAIC0yNTI1LDE4ICsyNDk5LDE3IEBACiAJcG9ydHAtPnN0YXRzLnJ4YnVmZmVyZWQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YWxsaW9uX2xvY2ssIGZsYWdzKTsKLQlpZiAocG9ydHAtPnBvcnQudHR5ICE9IE5VTEwpCi0JCWlmIChwb3J0cC0+cG9ydC50dHktPmRyaXZlcl9kYXRhID09IHBvcnRwKSB7Ci0JCQlwb3J0cC0+c3RhdHMudHR5c3RhdGUgPSBwb3J0cC0+cG9ydC50dHktPmZsYWdzOwotCQkJLyogTm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBhIHN0YXRpc3RpYyAqLwotCQkJcG9ydHAtPnN0YXRzLnJ4YnVmZmVyZWQgPSAxOyAvKnBvcnRwLT5wb3J0LnR0eS0+ZmxpcC5jb3VudDsgKi8KLQkJCWlmIChwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MgIT0gTlVMTCkgewotCQkJCXBvcnRwLT5zdGF0cy5jZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCQkJcG9ydHAtPnN0YXRzLmlmbGFncyA9IHBvcnRwLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKLQkJCQlwb3J0cC0+c3RhdHMub2ZsYWdzID0gcG9ydHAtPnBvcnQudHR5LT50ZXJtaW9zLT5jX29mbGFnOwotCQkJCXBvcnRwLT5zdGF0cy5sZmxhZ3MgPSBwb3J0cC0+cG9ydC50dHktPnRlcm1pb3MtPmNfbGZsYWc7Ci0JCQl9CisJaWYgKHR0eSAhPSBOVUxMICYmIHBvcnRwLT5wb3J0LnR0eSA9PSB0dHkpIHsKKwkJcG9ydHAtPnN0YXRzLnR0eXN0YXRlID0gdHR5LT5mbGFnczsKKwkJLyogTm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBhIHN0YXRpc3RpYyAqLworCQlwb3J0cC0+c3RhdHMucnhidWZmZXJlZCA9IDE7IC8qdHR5LT5mbGlwLmNvdW50OyAqLworCQlpZiAodHR5LT50ZXJtaW9zICE9IE5VTEwpIHsKKwkJCXBvcnRwLT5zdGF0cy5jZmxhZ3MgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJCQlwb3J0cC0+c3RhdHMuaWZsYWdzID0gdHR5LT50ZXJtaW9zLT5jX2lmbGFnOworCQkJcG9ydHAtPnN0YXRzLm9mbGFncyA9IHR0eS0+dGVybWlvcy0+Y19vZmxhZzsKKwkJCXBvcnRwLT5zdGF0cy5sZmxhZ3MgPSB0dHktPnRlcm1pb3MtPmNfbGZsYWc7CiAJCX0KKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhbGxpb25fbG9jaywgZmxhZ3MpOwogCiAJaGVhZCA9IHBvcnRwLT50eC5oZWFkOwpAQCAtMjY0MCw3ICsyNjEzLDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDT01fR0VUUE9SVFNUQVRTOgotCQlyYyA9IHN0bF9nZXRwb3J0c3RhdHMoTlVMTCwgYXJncCk7CisJCXJjID0gc3RsX2dldHBvcnRzdGF0cyhOVUxMLCBOVUxMLCBhcmdwKTsKIAkJYnJlYWs7CiAJY2FzZSBDT01fQ0xSUE9SVFNUQVRTOgogCQlyYyA9IHN0bF9jbHJwb3J0c3RhdHMoTlVMTCwgYXJncCk7CkBAIC0zMjQzLDcgKzMyMTYsNyBAQAogCiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQl0dHkgPSBwb3J0cC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydHAtPnBvcnQpOwogCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCkBAIC0zMjg4LDYgKzMyNjEsNyBAQAogCiAJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMDUsNyArMzI3OSw3IEBACiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXR0eSA9IHBvcnRwLT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0cC0+cG9ydCk7CiAJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAKQEAgLTMzMjUsNiArMzI5OSw3IEBACiAJfQogCUJSRERJU0FCTEUocG9ydHAtPmJyZG5yKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmRfbG9jaywgZmxhZ3MpOworCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNDc4LDYgKzM0NTMsNyBAQAogCWludAkJbGVuLCBzdGxlbjsKIAljaGFyCQkqaGVhZCwgKnRhaWw7CiAJdW5zaWduZWQgY2hhcglpb2Fjaywgc3JlcjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJcHJfZGVidWcoInN0bF9jZDE0MDB0eGlzcihwYW5lbHA9JXAsaW9hZGRyPSV4KVxuIiwgcGFuZWxwLCBpb2FkZHIpOwogCkBAIC0zNTA0LDggKzM0ODAsMTEgQEAKIAlpZiAoKGxlbiA9PSAwKSB8fCAoKGxlbiA8IFNUTF9UWEJVRkxPVykgJiYKIAkgICAgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSA9PSAwKSkpIHsKIAkJc2V0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7Ci0JCWlmIChwb3J0cC0+cG9ydC50dHkpCi0JCQl0dHlfd2FrZXVwKHBvcnRwLT5wb3J0LnR0eSk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKKwkJaWYgKHR0eSkgeworCQkJdHR5X3dha2V1cCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCX0KIAl9CiAKIAlpZiAobGVuID09IDApIHsKQEAgLTM1NjksNyArMzU0OCw3IEBACiAJCXJldHVybjsKIAl9CiAJcG9ydHAgPSBwYW5lbHAtPnBvcnRzWyhpb2FjayA+PiAzKV07Ci0JdHR5ID0gcG9ydHAtPnBvcnQudHR5OworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKIAogCWlmICgoaW9hY2sgJiBBQ0tfVFlQTUFTSykgPT0gQUNLX1RZUFJYR09PRCkgewogCQlvdXRiKChSRENSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKQEAgLTM2MzMsMTAgKzM2MTIsMTIgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXByaW50aygiU1RBTExJT046IGJhZCBSWCBpbnRlcnJ1cHQgYWNrIHZhbHVlPSV4XG4iLCBpb2Fjayk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCQlyZXR1cm47CiAJfQogCiBzdGxfcnhhbGxkb25lOgorCXR0eV9rcmVmX3B1dCh0dHkpOwogCW91dGIoKEVPU1JSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKIAlvdXRiKDAsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKIH0KQEAgLTQxNzUsNyArNDE1Niw3IEBACiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXR0eSA9IHBvcnRwLT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0cC0+cG9ydCk7CiAJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAKQEAgLTQyMjYsNiArNDIwNyw3IEBACiAKIAlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkX2xvY2ssIGZsYWdzKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDI0NCw3ICs0MjI2LDcgQEAKIAogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JdHR5ID0gcG9ydHAtPnBvcnQudHR5OworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKIAlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIApAQCAtNDI2OSw2ICs0MjUxLDcgQEAKIAl9CiAJQlJERElTQUJMRShwb3J0cC0+YnJkbnIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ0MDgsNiArNDM5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4dHhpc3Ioc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogeworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJdW5zaWduZWQgaW50CWlvYWRkcjsKIAl1bnNpZ25lZCBjaGFyCW1yMDsKIAlpbnQJCWxlbiwgc3RsZW47CkBAIC00NDIyLDggKzQ0MDYsMTEgQEAKIAlpZiAoKGxlbiA9PSAwKSB8fCAoKGxlbiA8IFNUTF9UWEJVRkxPVykgJiYKIAkgICAgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSA9PSAwKSkpIHsKIAkJc2V0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7Ci0JCWlmIChwb3J0cC0+cG9ydC50dHkpCi0JCQl0dHlfd2FrZXVwKHBvcnRwLT5wb3J0LnR0eSk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKKwkJaWYgKHR0eSkgeworCQkJdHR5X3dha2V1cCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCX0KIAl9CiAKIAlpZiAobGVuID09IDApIHsKQEAgLTQ0NzYsNyArNDQ2Myw3IEBACiAKIAlwcl9kZWJ1Zygic3RsX3NjMjYxOThyeGlzcihwb3J0cD0lcCxpYWNrPSV4KVxuIiwgcG9ydHAsIGlhY2spOwogCi0JdHR5ID0gcG9ydHAtPnBvcnQudHR5OworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnRwLT5wb3J0KTsKIAlpb2FkZHIgPSBwb3J0cC0+aW9hZGRyOwogCW91dGIoR0lCQ1IsIChpb2FkZHIgKyBYUF9BRERSKSk7CiAJbGVuID0gaW5iKGlvYWRkciArIFhQX0RBVEEpICsgMTsKQEAgLTQ1MTUsNiArNDUwMiw3IEBACiAJCQlzdGxfc2MyNjE5OHR4dW5mbG93KHBvcnRwLCB0dHkpOwogCQl9CiAJfQorCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NTI4LDcgKzQ1MTYsNyBAQAogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJdW5zaWduZWQgaW50CQlpb2FkZHI7CiAKLQl0dHkgPSBwb3J0cC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydHAtPnBvcnQpOwogCWlvYWRkciA9IHBvcnRwLT5pb2FkZHI7CiAKIAlpZiAoc3RhdHVzICYgU1JfUlhQQVJJVFkpCkBAIC00NTY2LDYgKzQ1NTQsNyBAQAogCQlpZiAoc3RhdHVzID09IDApCiAJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCsrOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDc1NCw4ICs0NzQzLDggQEAKIAlpZiAoSVNfRVJSKHN0YWxsaW9uX2NsYXNzKSkKIAkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIGNyZWF0ZSBjbGFzc1xuIik7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHN0YWxsaW9uX2NsYXNzLCBOVUxMLCBNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAotCQkJCSAgICAgIE5VTEwsICJzdGFsaW9tZW0lZCIsIGkpOworCQlkZXZpY2VfY3JlYXRlKHN0YWxsaW9uX2NsYXNzLCBOVUxMLCBNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAorCQkJICAgICAgTlVMTCwgInN0YWxpb21lbSVkIiwgaSk7CiAKIAlyZXR1cm4gMDsKIGVycl91bnJ0dHk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3guYyBiL2RyaXZlcnMvY2hhci9zeC5jCmluZGV4IGMzODUyMDYuLjViOGQ3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeC5jCkBAIC0yNTA0LDcgKzI1MDQsNyBAQAogCQlkZWxfdGltZXIoJmJvYXJkLT50aW1lcik7CiAJCWlmIChwZGV2KSB7CiAjaWZkZWYgQ09ORklHX1BDSQotCQkJcGNpX2lvdW5tYXAocGRldiwgYm9hcmQtPmJhc2UpOworCQkJcGNpX2lvdW5tYXAocGRldiwgYm9hcmQtPmJhc2UyKTsKIAkJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBJU19DRl9CT0FSRChib2FyZCkgPyAzIDogMik7CiAjZW5kaWYKIAkJfSBlbHNlIHsKQEAgLTI3MDMsNyArMjcwMyw3IEBACiAKIAlyZXR1cm4gMDsKIGVycl91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBib2FyZC0+YmFzZSk7CisJcGNpX2lvdW5tYXAocGRldiwgYm9hcmQtPmJhc2UyKTsKIGVycl9yZWc6CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIHJlZyk7CiBlcnJfZmxhZzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggOGZkZmU5Yy4uZGNlNGNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5c3JxLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMjYsNiArMzI3LDcgQEAKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9tb29tLAogCS5oZWxwX21zZwk9ICJGdWxsIiwKIAkuYWN0aW9uX21zZwk9ICJNYW51YWwgT09NIGV4ZWN1dGlvbiIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CiAKIHN0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9raWxsKGludCBrZXksIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC01MzMsMyArNTM1LDMyIEBACiAJcmV0dXJuIF9fc3lzcnFfc3dhcF9rZXlfb3BzKGtleSwgTlVMTCwgb3BfcCk7CiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfc3lzcnFfa2V5KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKgorICogd3JpdGluZyAnQycgdG8gL3Byb2Mvc3lzcnEtdHJpZ2dlciBpcyBsaWtlIHN5c3JxLUMKKyAqLworc3RhdGljIHNzaXplX3Qgd3JpdGVfc3lzcnFfdHJpZ2dlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJY2hhciBjOworCisJCWlmIChnZXRfdXNlcihjLCBidWYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9faGFuZGxlX3N5c3JxKGMsIE5VTEwsIDApOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzcnFfdHJpZ2dlcl9vcGVyYXRpb25zID0geworCS53cml0ZQkJPSB3cml0ZV9zeXNycV90cmlnZ2VyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3lzcnFfaW5pdCh2b2lkKQoreworCXByb2NfY3JlYXRlKCJzeXNycS10cmlnZ2VyIiwgU19JV1VTUiwgTlVMTCwgJnByb2Nfc3lzcnFfdHJpZ2dlcl9vcGVyYXRpb25zKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHN5c3JxX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKaW5kZXggMzczOGNmYS4uZjVmYzY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAl0cmlzdGF0ZSAiVFBNIEhhcmR3YXJlIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTRUNVUklUWUZTCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBpbiB5b3VyIHN5c3RlbSwgd2hpY2gKIAkgIGltcGxlbWVudHMgdGhlIFRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwJ3Mgc3BlY2lmaWNhdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCmluZGV4IGFlNzY2ZDguLmU3MGQxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwpAQCAtNTI1LDE5ICs1MjUsMTkgQEAKIAl0aW1lb3V0ID0KIAkgICAgYmUzMl90b19jcHUoKigoX19iZTMyICopIChkYXRhICsgVFBNX0dFVF9DQVBfUkVUX1VJTlQzMl8xX0lEWCkpKTsKIAlpZiAodGltZW91dCkKLQkJY2hpcC0+dmVuZG9yLnRpbWVvdXRfYSA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJCWNoaXAtPnZlbmRvci50aW1lb3V0X2EgPSB1c2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOwogCXRpbWVvdXQgPQogCSAgICBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgKGRhdGEgKyBUUE1fR0VUX0NBUF9SRVRfVUlOVDMyXzJfSURYKSkpOwogCWlmICh0aW1lb3V0KQotCQljaGlwLT52ZW5kb3IudGltZW91dF9iID0gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwkJY2hpcC0+dmVuZG9yLnRpbWVvdXRfYiA9IHVzZWNzX3RvX2ppZmZpZXModGltZW91dCk7CiAJdGltZW91dCA9CiAJICAgIGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAoZGF0YSArIFRQTV9HRVRfQ0FQX1JFVF9VSU5UMzJfM19JRFgpKSk7CiAJaWYgKHRpbWVvdXQpCi0JCWNoaXAtPnZlbmRvci50aW1lb3V0X2MgPSBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCQljaGlwLT52ZW5kb3IudGltZW91dF9jID0gdXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKIAl0aW1lb3V0ID0KIAkgICAgYmUzMl90b19jcHUoKigoX19iZTMyICopIChkYXRhICsgVFBNX0dFVF9DQVBfUkVUX1VJTlQzMl80X0lEWCkpKTsKIAlpZiAodGltZW91dCkKLQkJY2hpcC0+dmVuZG9yLnRpbWVvdXRfZCA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJCWNoaXAtPnZlbmRvci50aW1lb3V0X2QgPSB1c2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOwogCiBkdXJhdGlvbjoKIAltZW1jcHkoZGF0YSwgdHBtX2NhcCwgc2l6ZW9mKHRwbV9jYXApKTsKQEAgLTU1NCwxNSArNTU0LDIyIEBACiAJCXJldHVybjsKIAogCWNoaXAtPnZlbmRvci5kdXJhdGlvbltUUE1fU0hPUlRdID0KLQkgICAgbXNlY3NfdG9famlmZmllcyhiZTMyX3RvX2NwdQorCSAgICB1c2Vjc190b19qaWZmaWVzKGJlMzJfdG9fY3B1CiAJCQkgICAgICgqKChfX2JlMzIgKikgKGRhdGEgKwogCQkJCQkgICAgVFBNX0dFVF9DQVBfUkVUX1VJTlQzMl8xX0lEWCkpKSk7CisJLyogVGhlIEJyb2FkY29tIEJDTTAxMDIgY2hpcHNldCBpbiBhIERlbGwgTGF0aXR1ZGUgRDgyMCBnZXRzIHRoZSBhYm92ZQorCSAqIHZhbHVlIHdyb25nIGFuZCBhcHBhcmVudGx5IHJlcG9ydHMgbXNlY3MgcmF0aGVyIHRoYW4gdXNlY3MuIFNvIHdlCisJICogZml4IHVwIHRoZSByZXN1bHRpbmcgdG9vLXNtYWxsIFRQTV9TSE9SVCB2YWx1ZSB0byBtYWtlIHRoaW5ncyB3b3JrLgorCSAqLworCWlmIChjaGlwLT52ZW5kb3IuZHVyYXRpb25bVFBNX1NIT1JUXSA8IChIWi8xMDApKQorCQljaGlwLT52ZW5kb3IuZHVyYXRpb25bVFBNX1NIT1JUXSA9IEhaOworCiAJY2hpcC0+dmVuZG9yLmR1cmF0aW9uW1RQTV9NRURJVU1dID0KLQkgICAgbXNlY3NfdG9famlmZmllcyhiZTMyX3RvX2NwdQorCSAgICB1c2Vjc190b19qaWZmaWVzKGJlMzJfdG9fY3B1CiAJCQkgICAgICgqKChfX2JlMzIgKikgKGRhdGEgKwogCQkJCQkgICAgVFBNX0dFVF9DQVBfUkVUX1VJTlQzMl8yX0lEWCkpKSk7CiAJY2hpcC0+dmVuZG9yLmR1cmF0aW9uW1RQTV9MT05HXSA9Ci0JICAgIG1zZWNzX3RvX2ppZmZpZXMoYmUzMl90b19jcHUKKwkgICAgdXNlY3NfdG9famlmZmllcyhiZTMyX3RvX2NwdQogCQkJICAgICAoKigoX19iZTMyICopIChkYXRhICsKIAkJCQkJICAgIFRQTV9HRVRfQ0FQX1JFVF9VSU5UMzJfM19JRFgpKSkpOwogfQpAQCAtOTU0LDcyICs5NjEsNjMgQEAKIAogLyoKICAqIERldmljZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdG8gdGhlIFRQTQorICoKKyAqIEl0J3MgYXNzdXJlZCB0aGF0IHRoZSBjaGlwIHdpbGwgYmUgb3BlbmVkIGp1c3Qgb25jZSwKKyAqIGJ5IHRoZSBjaGVjayBvZiBpc19vcGVuIHZhcmlhYmxlLCB3aGljaCBpcyBwcm90ZWN0ZWQKKyAqIGJ5IGRyaXZlcl9sb2NrLgogICovCiBpbnQgdHBtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IHJjID0gMCwgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gTlVMTCwgKnBvczsKIAotCWxvY2tfa2VybmVsKCk7Ci0Jc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnRwbV9jaGlwX2xpc3QsIGxpc3QpIHsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG9zLCAmdHBtX2NoaXBfbGlzdCwgbGlzdCkgewogCQlpZiAocG9zLT52ZW5kb3IubWlzY2Rldi5taW5vciA9PSBtaW5vcikgewogCQkJY2hpcCA9IHBvczsKKwkJCWdldF9kZXZpY2UoY2hpcC0+ZGV2KTsKIAkJCWJyZWFrOwogCQl9CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKGNoaXAgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dDsKLQl9CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjaGlwLT5udW1fb3BlbnMpIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmY2hpcC0+aXNfb3BlbikpIHsKIAkJZGV2X2RiZyhjaGlwLT5kZXYsICJBbm90aGVyIHByb2Nlc3Mgb3ducyB0aGlzIFRQTVxuIik7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGVycl9vdXQ7CisJCXB1dF9kZXZpY2UoY2hpcC0+ZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQljaGlwLT5udW1fb3BlbnMrKzsKLQlnZXRfZGV2aWNlKGNoaXAtPmRldik7Ci0KLQlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOwotCiAJY2hpcC0+ZGF0YV9idWZmZXIgPSBrbWFsbG9jKFRQTV9CVUZTSVpFICogc2l6ZW9mKHU4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNoaXAtPmRhdGFfYnVmZmVyID09IE5VTEwpIHsKLQkJY2hpcC0+bnVtX29wZW5zLS07CisJCWNsZWFyX2JpdCgwLCAmY2hpcC0+aXNfb3Blbik7CiAJCXB1dF9kZXZpY2UoY2hpcC0+ZGV2KTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIDApOwogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0Jc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHBtX29wZW4pOwogCisvKgorICogQ2FsbGVkIG9uIGZpbGUgY2xvc2UKKyAqLwogaW50IHRwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0Jc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIDApOwotCWNoaXAtPm51bV9vcGVucy0tOwotCXB1dF9kZXZpY2UoY2hpcC0+ZGV2KTsKIAlrZnJlZShjaGlwLT5kYXRhX2J1ZmZlcik7Ci0Jc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKKwljbGVhcl9iaXQoMCwgJmNoaXAtPmlzX29wZW4pOworCXB1dF9kZXZpY2UoY2hpcC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9yZWxlYXNlKTsKQEAgLTEwOTMsMTMgKzEwOTEsMTEgQEAKIAl9CiAKIAlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKLQotCWxpc3RfZGVsKCZjaGlwLT5saXN0KTsKLQorCWxpc3RfZGVsX3JjdSgmY2hpcC0+bGlzdCk7CiAJc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCW1pc2NfZGVyZWdpc3RlcigmY2hpcC0+dmVuZG9yLm1pc2NkZXYpOwotCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosIGNoaXAtPnZlbmRvci5hdHRyX2dyb3VwKTsKIAl0cG1fYmlvc19sb2dfdGVhcmRvd24oY2hpcC0+Ymlvc19kaXIpOwogCkBAIC0xMTQ0LDI1ICsxMTQwLDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcG1fcmVzdW1lKTsKIAorLyogSW4gY2FzZSB2ZW5kb3IgcHJvdmlkZWQgcmVsZWFzZSBmdW5jdGlvbiwgY2FsbCBpdCB0b28uKi8KKwordm9pZCB0cG1fZGV2X3ZlbmRvcl9yZWxlYXNlKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+dmVuZG9yLnJlbGVhc2UpCisJCWNoaXAtPnZlbmRvci5yZWxlYXNlKGNoaXAtPmRldik7CisKKwljbGVhcl9iaXQoY2hpcC0+ZGV2X251bSwgZGV2X21hc2spOworCWtmcmVlKGNoaXAtPnZlbmRvci5taXNjZGV2Lm5hbWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBtX2Rldl92ZW5kb3JfcmVsZWFzZSk7CisKKwogLyoKICAqIE9uY2UgYWxsIHJlZmVyZW5jZXMgdG8gcGxhdGZvcm0gZGV2aWNlIGFyZSBkb3duIHRvIDAsCiAgKiByZWxlYXNlIGFsbCBhbGxvY2F0ZWQgc3RydWN0dXJlcy4KLSAqIEluIGNhc2UgdmVuZG9yIHByb3ZpZGVkIHJlbGVhc2UgZnVuY3Rpb24sCi0gKiBjYWxsIGl0IHRvby4KICAqLwogc3RhdGljIHZvaWQgdHBtX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmIChjaGlwLT52ZW5kb3IucmVsZWFzZSkKLQkJY2hpcC0+dmVuZG9yLnJlbGVhc2UoZGV2KTsKKwl0cG1fZGV2X3ZlbmRvcl9yZWxlYXNlKGNoaXApOwogCiAJY2hpcC0+cmVsZWFzZShkZXYpOwotCi0JY2xlYXJfYml0KGNoaXAtPmRldl9udW0sIGRldl9tYXNrKTsKLQlrZnJlZShjaGlwLT52ZW5kb3IubWlzY2Rldi5uYW1lKTsKIAlrZnJlZShjaGlwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9kZXZfcmVsZWFzZSk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0cG1fPHNwZWNpZmljPi5jIHByb2JlIGZ1bmN0aW9uIG9ubHkgZm9yIGRldmljZXMgCkBAIC0xMTcxLDggKzExNzUsOCBAQAogICogdXBvbiBlcnJhbnQgZXhpdCBmcm9tIHRoaXMgZnVuY3Rpb24gc3BlY2lmaWMgcHJvYmUgZnVuY3Rpb24gc2hvdWxkIGNhbGwKICAqIHBjaV9kaXNhYmxlX2RldmljZQogICovCi1zdHJ1Y3QgdHBtX2NoaXAgKnRwbV9yZWdpc3Rlcl9oYXJkd2FyZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljCi0JCQkJICAgICAgICplbnRyeSkKK3N0cnVjdCB0cG1fY2hpcCAqdHBtX3JlZ2lzdGVyX2hhcmR3YXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgKmVudHJ5KQogewogI2RlZmluZSBERVZOQU1FX1NJWkUgNwogCkBAIC0xMTgzLDExICsxMTg3LDggQEAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlkZXZuYW1lID0ga21hbGxvYyhERVZOQU1FX1NJWkUsIEdGUF9LRVJORUwpOwogCi0JaWYgKGNoaXAgPT0gTlVMTCB8fCBkZXZuYW1lID09IE5VTEwpIHsKLQkJa2ZyZWUoY2hpcCk7Ci0JCWtmcmVlKGRldm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKGNoaXAgPT0gTlVMTCB8fCBkZXZuYW1lID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CiAKIAltdXRleF9pbml0KCZjaGlwLT5idWZmZXJfbXV0ZXgpOwogCW11dGV4X2luaXQoJmNoaXAtPnRwbV9tdXRleCk7CkBAIC0xMjA0LDggKzEyMDUsNyBAQAogCiAJaWYgKGNoaXAtPmRldl9udW0gPj0gVFBNX05VTV9ERVZJQ0VTKSB7CiAJCWRldl9lcnIoZGV2LCAiTm8gYXZhaWxhYmxlIHRwbSBkZXZpY2UgbnVtYmVyc1xuIik7Ci0JCWtmcmVlKGNoaXApOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBvdXRfZnJlZTsKIAl9IGVsc2UgaWYgKGNoaXAtPmRldl9udW0gPT0gMCkKIAkJY2hpcC0+dmVuZG9yLm1pc2NkZXYubWlub3IgPSBUUE1fTUlOT1I7CiAJZWxzZQpAQCAtMTIzMSwyMiArMTIzMSwyNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKLQotCWxpc3RfYWRkKCZjaGlwLT5saXN0LCAmdHBtX2NoaXBfbGlzdCk7Ci0KLQlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOwotCiAJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCBjaGlwLT52ZW5kb3IuYXR0cl9ncm91cCkpIHsKLQkJbGlzdF9kZWwoJmNoaXAtPmxpc3QpOwogCQltaXNjX2RlcmVnaXN0ZXIoJmNoaXAtPnZlbmRvci5taXNjZGV2KTsKIAkJcHV0X2RldmljZShjaGlwLT5kZXYpOworCiAJCXJldHVybiBOVUxMOwogCX0KIAogCWNoaXAtPmJpb3NfZGlyID0gdHBtX2Jpb3NfbG9nX3NldHVwKGRldm5hbWUpOwogCisJLyogTWFrZSBjaGlwIGF2YWlsYWJsZSAqLworCXNwaW5fbG9jaygmZHJpdmVyX2xvY2spOworCWxpc3RfYWRkX3JjdSgmY2hpcC0+bGlzdCwgJnRwbV9jaGlwX2xpc3QpOworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKIAlyZXR1cm4gY2hpcDsKKworb3V0X2ZyZWU6CisJa2ZyZWUoY2hpcCk7CisJa2ZyZWUoZGV2bmFtZSk7CisJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcmVnaXN0ZXJfaGFyZHdhcmUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCBlODg1MTQ4Li44ZTMwZGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTkwLDcgKzkwLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIERldmljZSBzdHVmZiAqLwogCiAJaW50IGRldl9udW07CQkvKiAvZGV2L3RwbSMgKi8KLQlpbnQgbnVtX29wZW5zOwkJLyogb25seSBvbmUgYWxsb3dlZCAqLworCXVuc2lnbmVkIGxvbmcgaXNfb3BlbjsJLyogb25seSBvbmUgYWxsb3dlZCAqLwogCWludCB0aW1lX2V4cGlyZWQ7CiAKIAkvKiBEYXRhIHBhc3NlZCB0byBhbmQgZnJvbSB0aGUgdHBtIHZpYSB0aGUgcmVhZC93cml0ZSBjYWxscyAqLwpAQCAtMTMyLDYgKzEzMiw3IEBACiAJCQkJIGNvbnN0IHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljICopOwogZXh0ZXJuIGludCB0cG1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBleHRlcm4gaW50IHRwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK2V4dGVybiB2b2lkIHRwbV9kZXZfdmVuZG9yX3JlbGVhc2Uoc3RydWN0IHRwbV9jaGlwICopOwogZXh0ZXJuIHNzaXplX3QgdHBtX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwKIAkJCSBsb2ZmX3QgKik7CiBleHRlcm4gc3NpemVfdCB0cG1fcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpcy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKaW5kZXggZWQxODc5Yy4uNzE3YWY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKQEAgLTYzMCwxMiArNjMwLDIzIEBACiAJeyIiLCAwfQkJCS8qIFRlcm1pbmF0b3IgKi8KIH07CiAKK3N0YXRpYyBfX2RldmV4aXQgdm9pZCB0cG1fdGlzX3BucF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBwbnBfZ2V0X2RydmRhdGEoZGV2KTsKKworCXRwbV9kZXZfdmVuZG9yX3JlbGVhc2UoY2hpcCk7CisKKwlrZnJlZShjaGlwKTsKK30KKworCiBzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgdGlzX3BucF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAidHBtX3RpcyIsCiAJLmlkX3RhYmxlID0gdHBtX3BucF90YmwsCiAJLnByb2JlID0gdHBtX3Rpc19wbnBfaW5pdCwKIAkuc3VzcGVuZCA9IHRwbV90aXNfcG5wX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHRwbV90aXNfcG5wX3Jlc3VtZSwKKwkucmVtb3ZlID0gdHBtX3Rpc19wbnBfcmVtb3ZlLAogfTsKIAogI2RlZmluZSBUSVNfSElEX1VTUl9JRFggc2l6ZW9mKHRwbV9wbnBfdGJsKS9zaXplb2Yoc3RydWN0IHBucF9kZXZpY2VfaWQpIC0yCkBAIC02ODMsNiArNjk0LDcgQEAKIAlzcGluX2xvY2soJnRpc19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaSwgaiwgJnRpc19jaGlwcywgbGlzdCkgewogCQljaGlwID0gdG9fdHBtX2NoaXAoaSk7CisJCXRwbV9yZW1vdmVfaGFyZHdhcmUoY2hpcC0+ZGV2KTsKIAkJaW93cml0ZTMyKH5UUE1fR0xPQkFMX0lOVF9FTkFCTEUgJgogCQkJICBpb3JlYWQzMihjaGlwLT52ZW5kb3IuaW9iYXNlICsKIAkJCQkgICBUUE1fSU5UX0VOQUJMRShjaGlwLT52ZW5kb3IuCkBAIC02OTQsOSArNzA2LDkgQEAKIAkJCWZyZWVfaXJxKGNoaXAtPnZlbmRvci5pcnEsIGNoaXApOwogCQlpb3VubWFwKGktPmlvYmFzZSk7CiAJCWxpc3RfZGVsKCZpLT5saXN0KTsKLQkJdHBtX3JlbW92ZV9oYXJkd2FyZShjaGlwLT5kZXYpOwogCX0KIAlzcGluX3VubG9jaygmdGlzX2xvY2spOworCiAJaWYgKGZvcmNlKSB7CiAJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogCQlkcml2ZXJfdW5yZWdpc3RlcigmdGlzX2Rydik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKaW5kZXggMzU4MmY0My4uNTc4NzI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYwpAQCAtOTMsNyArOTMsNyBAQAogCQlnZXRfdGFza19jb21tKG5hbWUsIHRzayk7CiAJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIG5hbWUpOwogCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGRhdGE9Iik7Ci0JCWF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyhhYiwgYnVmLT5kYXRhLCBidWYtPnZhbGlkKTsKKwkJYXVkaXRfbG9nX25faGV4KGFiLCBidWYtPmRhdGEsIGJ1Zi0+dmFsaWQpOwogCQlhdWRpdF9sb2dfZW5kKGFiKTsKIAl9CiAJYnVmLT52YWxpZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2J1ZmZlci5jIGIvZHJpdmVycy9jaGFyL3R0eV9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBlZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9idWZmZXIuYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIFR0eSBidWZmZXIgYWxsb2NhdGlvbiBtYW5hZ2VtZW50CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoqCisgKgl0dHlfYnVmZmVyX2ZyZWVfYWxsCQktCWZyZWUgYnVmZmVycyB1c2VkIGJ5IGEgdHR5CisgKglAdHR5OiB0dHkgdG8gZnJlZSBmcm9tCisgKgorICoJUmVtb3ZlIGFsbCB0aGUgYnVmZmVycyBwZW5kaW5nIG9uIGEgdHR5IHdoZXRoZXIgcXVldWVkIHdpdGggZGF0YQorICoJb3IgaW4gdGhlIGZyZWUgcmluZy4gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgdHR5IGlzIG5vIGxvbmdlciBpbiB1c2UKKyAqCisgKglMb2NraW5nOiBub25lCisgKi8KKwordm9pZCB0dHlfYnVmZmVyX2ZyZWVfYWxsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9idWZmZXIgKnRoZWFkOworCXdoaWxlICgodGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CisJCXR0eS0+YnVmLmhlYWQgPSB0aGVhZC0+bmV4dDsKKwkJa2ZyZWUodGhlYWQpOworCX0KKwl3aGlsZSAoKHRoZWFkID0gdHR5LT5idWYuZnJlZSkgIT0gTlVMTCkgeworCQl0dHktPmJ1Zi5mcmVlID0gdGhlYWQtPm5leHQ7CisJCWtmcmVlKHRoZWFkKTsKKwl9CisJdHR5LT5idWYudGFpbCA9IE5VTEw7CisJdHR5LT5idWYubWVtb3J5X3VzZWQgPSAwOworfQorCisvKioKKyAqCXR0eV9idWZmZXJfYWxsb2MJLQlhbGxvY2F0ZSBhIHR0eSBidWZmZXIKKyAqCUB0dHk6IHR0eSBkZXZpY2UKKyAqCUBzaXplOiBkZXNpcmVkIHNpemUgKGNoYXJhY3RlcnMpCisgKgorICoJQWxsb2NhdGUgYSBuZXcgdHR5IGJ1ZmZlciB0byBob2xkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICoJUmV0dXJuIE5VTEwgaWYgb3V0IG9mIG1lbW9yeSBvciB0aGUgYWxsb2NhdGlvbiB3b3VsZCBleGNlZWQgdGhlCisgKglwZXIgZGV2aWNlIHF1ZXVlCisgKgorICoJTG9ja2luZzogQ2FsbGVyIG11c3QgaG9sZCB0dHktPmJ1Zi5sb2NrCisgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfYnVmZmVyICp0dHlfYnVmZmVyX2FsbG9jKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB0dHlfYnVmZmVyICpwOworCisJaWYgKHR0eS0+YnVmLm1lbW9yeV91c2VkICsgc2l6ZSA+IDY1NTM2KQorCQlyZXR1cm4gTlVMTDsKKwlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9idWZmZXIpICsgMiAqIHNpemUsIEdGUF9BVE9NSUMpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXAtPnVzZWQgPSAwOworCXAtPnNpemUgPSBzaXplOworCXAtPm5leHQgPSBOVUxMOworCXAtPmNvbW1pdCA9IDA7CisJcC0+cmVhZCA9IDA7CisJcC0+Y2hhcl9idWZfcHRyID0gKGNoYXIgKikocC0+ZGF0YSk7CisJcC0+ZmxhZ19idWZfcHRyID0gKHVuc2lnbmVkIGNoYXIgKilwLT5jaGFyX2J1Zl9wdHIgKyBzaXplOworCXR0eS0+YnVmLm1lbW9yeV91c2VkICs9IHNpemU7CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICoJdHR5X2J1ZmZlcl9mcmVlCQktCWZyZWUgYSB0dHkgYnVmZmVyCisgKglAdHR5OiB0dHkgb3duaW5nIHRoZSBidWZmZXIKKyAqCUBiOiB0aGUgYnVmZmVyIHRvIGZyZWUKKyAqCisgKglGcmVlIGEgdHR5IGJ1ZmZlciwgb3IgYWRkIGl0IHRvIHRoZSBmcmVlIGxpc3QgYWNjb3JkaW5nIHRvIG91cgorICoJaW50ZXJuYWwgc3RyYXRlZ3kKKyAqCisgKglMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHR0eS0+YnVmLmxvY2sKKyAqLworCitzdGF0aWMgdm9pZCB0dHlfYnVmZmVyX2ZyZWUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9idWZmZXIgKmIpCit7CisJLyogRHVtYiBzdHJhdGVneSBmb3Igbm93IC0gc2hvdWxkIGtlZXAgc29tZSBzdGF0cyAqLworCXR0eS0+YnVmLm1lbW9yeV91c2VkIC09IGItPnNpemU7CisJV0FSTl9PTih0dHktPmJ1Zi5tZW1vcnlfdXNlZCA8IDApOworCisJaWYgKGItPnNpemUgPj0gNTEyKQorCQlrZnJlZShiKTsKKwllbHNlIHsKKwkJYi0+bmV4dCA9IHR0eS0+YnVmLmZyZWU7CisJCXR0eS0+YnVmLmZyZWUgPSBiOworCX0KK30KKworLyoqCisgKglfX3R0eV9idWZmZXJfZmx1c2gJCS0JZmx1c2ggZnVsbCB0dHkgYnVmZmVycworICoJQHR0eTogdHR5IHRvIGZsdXNoCisgKgorICoJZmx1c2ggYWxsIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgcmVjZWl2ZSBkYXRhLiBDYWxsZXIgbXVzdAorICoJaG9sZCB0aGUgYnVmZmVyIGxvY2sgYW5kIG11c3QgaGF2ZSBlbnN1cmVkIG5vIHBhcmFsbGVsIGZsdXNoIHRvCisgKglsZGlzYyBpcyBydW5uaW5nLgorICoKKyAqCUxvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdHR5LT5idWYubG9jaworICovCisKK3N0YXRpYyB2b2lkIF9fdHR5X2J1ZmZlcl9mbHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfYnVmZmVyICp0aGVhZDsKKworCXdoaWxlICgodGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CisJCXR0eS0+YnVmLmhlYWQgPSB0aGVhZC0+bmV4dDsKKwkJdHR5X2J1ZmZlcl9mcmVlKHR0eSwgdGhlYWQpOworCX0KKwl0dHktPmJ1Zi50YWlsID0gTlVMTDsKK30KKworLyoqCisgKgl0dHlfYnVmZmVyX2ZsdXNoCQktCWZsdXNoIGZ1bGwgdHR5IGJ1ZmZlcnMKKyAqCUB0dHk6IHR0eSB0byBmbHVzaAorICoKKyAqCWZsdXNoIGFsbCB0aGUgYnVmZmVycyBjb250YWluaW5nIHJlY2VpdmUgZGF0YS4gSWYgdGhlIGJ1ZmZlciBpcworICoJYmVpbmcgcHJvY2Vzc2VkIGJ5IGZsdXNoX3RvX2xkaXNjIHRoZW4gd2UgZGVmZXIgdGhlIHByb2Nlc3NpbmcKKyAqCXRvIHRoYXQgZnVuY3Rpb24KKyAqCisgKglMb2NraW5nOiBub25lCisgKi8KKwordm9pZCB0dHlfYnVmZmVyX2ZsdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlIGRhdGEgaXMgYmVpbmcgcHVzaGVkIHRvIHRoZSB0dHkgbGF5ZXIgdGhlbiB3ZSBjYW4ndAorCSAgIHByb2Nlc3MgaXQgaGVyZS4gSW5zdGVhZCBzZXQgYSBmbGFnIGFuZCB0aGUgZmx1c2hfdG9fbGRpc2MKKwkgICBwYXRoIHdpbGwgcHJvY2VzcyB0aGUgZmx1c2ggcmVxdWVzdCBiZWZvcmUgaXQgZXhpdHMgKi8KKwlpZiAodGVzdF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncykpIHsKKwkJc2V0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKKwkJd2FpdF9ldmVudCh0dHktPnJlYWRfd2FpdCwKKwkJCQl0ZXN0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncykgPT0gMCk7CisJCXJldHVybjsKKwl9IGVsc2UKKwkJX190dHlfYnVmZmVyX2ZsdXNoKHR0eSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCXR0eV9idWZmZXJfZmluZAkJLQlmaW5kIGEgZnJlZSB0dHkgYnVmZmVyCisgKglAdHR5OiB0dHkgb3duaW5nIHRoZSBidWZmZXIKKyAqCUBzaXplOiBjaGFyYWN0ZXJzIHdhbnRlZAorICoKKyAqCUxvY2F0ZSBhbiBleGlzdGluZyBzdWl0YWJsZSB0dHkgYnVmZmVyIG9yIGlmIHdlIGFyZSBsYWNraW5nIG9uZSB0aGVuCisgKglhbGxvY2F0ZSBhIG5ldyBvbmUuIFdlIHJvdW5kIG91ciBidWZmZXJzIG9mZiBpbiAyNTYgY2hhcmFjdGVyIGNodW5rcworICoJdG8gZ2V0IGJldHRlciBhbGxvY2F0aW9uIGJlaGF2aW91ci4KKyAqCisgKglMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHR0eS0+YnVmLmxvY2sKKyAqLworCitzdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfZmluZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqKnRiaCA9ICZ0dHktPmJ1Zi5mcmVlOworCXdoaWxlICgoKnRiaCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgdHR5X2J1ZmZlciAqdCA9ICp0Ymg7CisJCWlmICh0LT5zaXplID49IHNpemUpIHsKKwkJCSp0YmggPSB0LT5uZXh0OworCQkJdC0+bmV4dCA9IE5VTEw7CisJCQl0LT51c2VkID0gMDsKKwkJCXQtPmNvbW1pdCA9IDA7CisJCQl0LT5yZWFkID0gMDsKKwkJCXR0eS0+YnVmLm1lbW9yeV91c2VkICs9IHQtPnNpemU7CisJCQlyZXR1cm4gdDsKKwkJfQorCQl0YmggPSAmKCgqdGJoKS0+bmV4dCk7CisJfQorCS8qIFJvdW5kIHRoZSBidWZmZXIgc2l6ZSBvdXQgKi8KKwlzaXplID0gKHNpemUgKyAweEZGKSAmIH4weEZGOworCXJldHVybiB0dHlfYnVmZmVyX2FsbG9jKHR0eSwgc2l6ZSk7CisJLyogU2hvdWxkIHBvc3NpYmx5IGNoZWNrIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBsYXJnZXN0IGJ1ZmZlciB3ZQorCSAgIGhhdmUgcXVldWVkIGFuZCByZWN5Y2xlIHRoYXQgPyAqLworfQorCisvKioKKyAqCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tCQktCWdyb3cgdHR5IGJ1ZmZlciBpZiBuZWVkZWQKKyAqCUB0dHk6IHR0eSBzdHJ1Y3R1cmUKKyAqCUBzaXplOiBzaXplIGRlc2lyZWQKKyAqCisgKglNYWtlIGF0IGxlYXN0IHNpemUgYnl0ZXMgb2YgbGluZWFyIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIHR0eQorICoJYnVmZmVyLiBJZiB3ZSBmYWlsIHJldHVybiB0aGUgc2l6ZSB3ZSBtYW5hZ2VkIHRvIGZpbmQuCisgKgorICoJTG9ja2luZzogVGFrZXMgdHR5LT5idWYubG9jaworICovCitpbnQgdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHR0eV9idWZmZXIgKmIsICpuOworCWludCBsZWZ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCisJLyogT1BUSU1JU0FUSU9OOiBXZSBjb3VsZCBrZWVwIGEgcGVyIHR0eSAiemVybyIgc2l6ZWQgYnVmZmVyIHRvCisJICAgcmVtb3ZlIHRoaXMgY29uZGl0aW9uYWwgaWYgaXRzIHdvcnRoIGl0LiBUaGlzIHdvdWxkIGJlIGludmlzaWJsZQorCSAgIHRvIHRoZSBjYWxsZXJzICovCisJaWYgKChiID0gdHR5LT5idWYudGFpbCkgIT0gTlVMTCkKKwkJbGVmdCA9IGItPnNpemUgLSBiLT51c2VkOworCWVsc2UKKwkJbGVmdCA9IDA7CisKKwlpZiAobGVmdCA8IHNpemUpIHsKKwkJLyogVGhpcyBpcyB0aGUgc2xvdyBwYXRoIC0gbG9va2luZyBmb3IgbmV3IGJ1ZmZlcnMgdG8gdXNlICovCisJCWlmICgobiA9IHR0eV9idWZmZXJfZmluZCh0dHksIHNpemUpKSAhPSBOVUxMKSB7CisJCQlpZiAoYiAhPSBOVUxMKSB7CisJCQkJYi0+bmV4dCA9IG47CisJCQkJYi0+Y29tbWl0ID0gYi0+dXNlZDsKKwkJCX0gZWxzZQorCQkJCXR0eS0+YnVmLmhlYWQgPSBuOworCQkJdHR5LT5idWYudGFpbCA9IG47CisJCX0gZWxzZQorCQkJc2l6ZSA9IGxlZnQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCXJldHVybiBzaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20pOworCisvKioKKyAqCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcJLQlBZGQgY2hhcmFjdGVycyB0byB0aGUgdHR5IGJ1ZmZlcgorICoJQHR0eTogdHR5IHN0cnVjdHVyZQorICoJQGNoYXJzOiBjaGFyYWN0ZXJzCisgKglAc2l6ZTogc2l6ZQorICoKKyAqCVF1ZXVlIGEgc2VyaWVzIG9mIGJ5dGVzIHRvIHRoZSB0dHkgYnVmZmVyaW5nLiBBbGwgdGhlIGNoYXJhY3RlcnMKKyAqCXBhc3NlZCBhcmUgbWFya2VkIGFzIHdpdGhvdXQgZXJyb3IuIFJldHVybnMgdGhlIG51bWJlciBhZGRlZC4KKyAqCisgKglMb2NraW5nOiBDYWxsZWQgZnVuY3Rpb25zIG1heSB0YWtlIHR0eS0+YnVmLmxvY2sKKyAqLworCitpbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaGFycywKKwkJCQlzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgY29waWVkID0gMDsKKwlkbyB7CisJCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSAtIGNvcGllZCk7CisJCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7CisJCS8qIElmIHRoZXJlIGlzIG5vIHNwYWNlIHRoZW4gdGIgbWF5IGJlIE5VTEwgKi8KKwkJaWYgKHVubGlrZWx5KHNwYWNlID09IDApKQorCQkJYnJlYWs7CisJCW1lbWNweSh0Yi0+Y2hhcl9idWZfcHRyICsgdGItPnVzZWQsIGNoYXJzLCBzcGFjZSk7CisJCW1lbXNldCh0Yi0+ZmxhZ19idWZfcHRyICsgdGItPnVzZWQsIFRUWV9OT1JNQUwsIHNwYWNlKTsKKwkJdGItPnVzZWQgKz0gc3BhY2U7CisJCWNvcGllZCArPSBzcGFjZTsKKwkJY2hhcnMgKz0gc3BhY2U7CisJCS8qIFRoZXJlIGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgd2UgbmVlZCB0byBzcGxpdCB0aGUgZGF0YSBvdmVyCisJCSAgIHNldmVyYWwgYnVmZmVycy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBtdXN0IGxvb3AgKi8KKwl9IHdoaWxlICh1bmxpa2VseShzaXplID4gY29waWVkKSk7CisJcmV0dXJuIGNvcGllZDsKK30KK0VYUE9SVF9TWU1CT0wodHR5X2luc2VydF9mbGlwX3N0cmluZyk7CisKKy8qKgorICoJdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncwktCUFkZCBjaGFyYWN0ZXJzIHRvIHRoZSB0dHkgYnVmZmVyCisgKglAdHR5OiB0dHkgc3RydWN0dXJlCisgKglAY2hhcnM6IGNoYXJhY3RlcnMKKyAqCUBmbGFnczogZmxhZyBieXRlcworICoJQHNpemU6IHNpemUKKyAqCisgKglRdWV1ZSBhIHNlcmllcyBvZiBieXRlcyB0byB0aGUgdHR5IGJ1ZmZlcmluZy4gRm9yIGVhY2ggY2hhcmFjdGVyCisgKgl0aGUgZmxhZ3MgYXJyYXkgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIGNoYXJhY3Rlci4gUmV0dXJucyB0aGUKKyAqCW51bWJlciBhZGRlZC4KKyAqCisgKglMb2NraW5nOiBDYWxsZWQgZnVuY3Rpb25zIG1heSB0YWtlIHR0eS0+YnVmLmxvY2sKKyAqLworCitpbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpjaGFycywgY29uc3QgY2hhciAqZmxhZ3MsIHNpemVfdCBzaXplKQoreworCWludCBjb3BpZWQgPSAwOworCWRvIHsKKwkJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplIC0gY29waWVkKTsKKwkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKKwkJLyogSWYgdGhlcmUgaXMgbm8gc3BhY2UgdGhlbiB0YiBtYXkgYmUgTlVMTCAqLworCQlpZiAodW5saWtlbHkoc3BhY2UgPT0gMCkpCisJCQlicmVhazsKKwkJbWVtY3B5KHRiLT5jaGFyX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgY2hhcnMsIHNwYWNlKTsKKwkJbWVtY3B5KHRiLT5mbGFnX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgZmxhZ3MsIHNwYWNlKTsKKwkJdGItPnVzZWQgKz0gc3BhY2U7CisJCWNvcGllZCArPSBzcGFjZTsKKwkJY2hhcnMgKz0gc3BhY2U7CisJCWZsYWdzICs9IHNwYWNlOworCQkvKiBUaGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IHdlIG5lZWQgdG8gc3BsaXQgdGhlIGRhdGEgb3ZlcgorCQkgICBzZXZlcmFsIGJ1ZmZlcnMuIElmIHRoaXMgaXMgdGhlIGNhc2Ugd2UgbXVzdCBsb29wICovCisJfSB3aGlsZSAodW5saWtlbHkoc2l6ZSA+IGNvcGllZCkpOworCXJldHVybiBjb3BpZWQ7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZmxhZ3MpOworCisvKioKKyAqCXR0eV9zY2hlZHVsZV9mbGlwCS0JcHVzaCBjaGFyYWN0ZXJzIHRvIGxkaXNjCisgKglAdHR5OiB0dHkgdG8gcHVzaCBmcm9tCisgKgorICoJVGFrZXMgYW55IHBlbmRpbmcgYnVmZmVycyBhbmQgdHJhbnNmZXJzIHRoZWlyIG93bmVyc2hpcCB0byB0aGUKKyAqCWxkaXNjIHNpZGUgb2YgdGhlIHF1ZXVlLiBJdCB0aGVuIHNjaGVkdWxlcyB0aG9zZSBjaGFyYWN0ZXJzIGZvcgorICoJcHJvY2Vzc2luZyBieSB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqCUxvY2tpbmc6IFRha2VzIHR0eS0+YnVmLmxvY2sKKyAqLworCit2b2lkIHR0eV9zY2hlZHVsZV9mbGlwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCWlmICh0dHktPmJ1Zi50YWlsICE9IE5VTEwpCisJCXR0eS0+YnVmLnRhaWwtPmNvbW1pdCA9IHR0eS0+YnVmLnRhaWwtPnVzZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9zY2hlZHVsZV9mbGlwKTsKKworLyoqCisgKgl0dHlfcHJlcGFyZV9mbGlwX3N0cmluZwkJLQltYWtlIHJvb20gZm9yIGNoYXJhY3RlcnMKKyAqCUB0dHk6IHR0eQorICoJQGNoYXJzOiByZXR1cm4gcG9pbnRlciBmb3IgY2hhcmFjdGVyIHdyaXRlIGFyZWEKKyAqCUBzaXplOiBkZXNpcmVkIHNpemUKKyAqCisgKglQcmVwYXJlIGEgYmxvY2sgb2Ygc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgZGF0YS4gUmV0dXJucyB0aGUgbGVuZ3RoCisgKglhdmFpbGFibGUgYW5kIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBzcGFjZSB3aGljaCBpcyBub3cgYWxsb2NhdGVkIGFuZAorICoJYWNjb3VudGVkIGZvciBhcyByZWFkeSBmb3Igbm9ybWFsIGNoYXJhY3RlcnMuIFRoaXMgaXMgdXNlZCBmb3IgZHJpdmVycworICoJdGhhdCBuZWVkIHRoZWlyIG93biBibG9jayBjb3B5IHJvdXRpbmVzIGludG8gdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8KKyAqCWd1YXJhbnRlZSB0aGUgYnVmZmVyIGlzIGEgRE1BIHRhcmdldCEKKyAqCisgKglMb2NraW5nOiBNYXkgY2FsbCBmdW5jdGlvbnMgdGFraW5nIHR0eS0+YnVmLmxvY2sKKyAqLworCitpbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqKmNoYXJzLAorCQkJCQkJCQlzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgc3BhY2UgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHNpemUpOworCWlmIChsaWtlbHkoc3BhY2UpKSB7CisJCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7CisJCSpjaGFycyA9IHRiLT5jaGFyX2J1Zl9wdHIgKyB0Yi0+dXNlZDsKKwkJbWVtc2V0KHRiLT5mbGFnX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgVFRZX05PUk1BTCwgc3BhY2UpOworCQl0Yi0+dXNlZCArPSBzcGFjZTsKKwl9CisJcmV0dXJuIHNwYWNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcpOworCisvKioKKyAqCXR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzCS0JbWFrZSByb29tIGZvciBjaGFyYWN0ZXJzCisgKglAdHR5OiB0dHkKKyAqCUBjaGFyczogcmV0dXJuIHBvaW50ZXIgZm9yIGNoYXJhY3RlciB3cml0ZSBhcmVhCisgKglAZmxhZ3M6IHJldHVybiBwb2ludGVyIGZvciBzdGF0dXMgZmxhZyB3cml0ZSBhcmVhCisgKglAc2l6ZTogZGVzaXJlZCBzaXplCisgKgorICoJUHJlcGFyZSBhIGJsb2NrIG9mIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIGRhdGEuIFJldHVybnMgdGhlIGxlbmd0aAorICoJYXZhaWxhYmxlIGFuZCBidWZmZXIgcG9pbnRlciB0byB0aGUgc3BhY2Ugd2hpY2ggaXMgbm93IGFsbG9jYXRlZCBhbmQKKyAqCWFjY291bnRlZCBmb3IgYXMgcmVhZHkgZm9yIGNoYXJhY3RlcnMuIFRoaXMgaXMgdXNlZCBmb3IgZHJpdmVycworICoJdGhhdCBuZWVkIHRoZWlyIG93biBibG9jayBjb3B5IHJvdXRpbmVzIGludG8gdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8KKyAqCWd1YXJhbnRlZSB0aGUgYnVmZmVyIGlzIGEgRE1BIHRhcmdldCEKKyAqCisgKglMb2NraW5nOiBNYXkgY2FsbCBmdW5jdGlvbnMgdGFraW5nIHR0eS0+YnVmLmxvY2sKKyAqLworCitpbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCXVuc2lnbmVkIGNoYXIgKipjaGFycywgY2hhciAqKmZsYWdzLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgc3BhY2UgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHNpemUpOworCWlmIChsaWtlbHkoc3BhY2UpKSB7CisJCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7CisJCSpjaGFycyA9IHRiLT5jaGFyX2J1Zl9wdHIgKyB0Yi0+dXNlZDsKKwkJKmZsYWdzID0gdGItPmZsYWdfYnVmX3B0ciArIHRiLT51c2VkOworCQl0Yi0+dXNlZCArPSBzcGFjZTsKKwl9CisJcmV0dXJuIHNwYWNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3MpOworCisKKworLyoqCisgKglmbHVzaF90b19sZGlzYworICoJQHdvcms6IHR0eSBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gd29yayBxdWV1ZS4KKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG91dCBvZiB0aGUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGZsdXNoIGRhdGEKKyAqCWZyb20gdGhlIGJ1ZmZlciBjaGFpbiB0byB0aGUgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqCUxvY2tpbmc6IGhvbGRzIHR0eS0+YnVmLmxvY2sgdG8gZ3VhcmQgYnVmZmVyIGxpc3QuIERyb3BzIHRoZSBsb2NrCisgKgl3aGlsZSBpbnZva2luZyB0aGUgbGluZSBkaXNjaXBsaW5lIHJlY2VpdmVfYnVmIG1ldGhvZC4gVGhlCisgKglyZWNlaXZlX2J1ZiBtZXRob2QgaXMgc2luZ2xlIHRocmVhZGVkIGZvciBlYWNoIHR0eSBpbnN0YW5jZS4KKyAqLworCitzdGF0aWMgdm9pZCBmbHVzaF90b19sZGlzYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHR5X3N0cnVjdCwgYnVmLndvcmsud29yayk7CisJdW5zaWduZWQgbG9uZyAJZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKKwlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGJ1ZiwgKmhlYWQ7CisJY2hhciAqY2hhcl9idWY7CisJdW5zaWduZWQgY2hhciAqZmxhZ19idWY7CisKKwlkaXNjID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChkaXNjID09IE5VTEwpCS8qICAhVFRZX0xESVNDICovCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7CisJLyogU28gd2Uga25vdyBhIGZsdXNoIGlzIHJ1bm5pbmcgKi8KKwlzZXRfYml0KFRUWV9GTFVTSElORywgJnR0eS0+ZmxhZ3MpOworCWhlYWQgPSB0dHktPmJ1Zi5oZWFkOworCWlmIChoZWFkICE9IE5VTEwpIHsKKwkJdHR5LT5idWYuaGVhZCA9IE5VTEw7CisJCWZvciAoOzspIHsKKwkJCWludCBjb3VudCA9IGhlYWQtPmNvbW1pdCAtIGhlYWQtPnJlYWQ7CisJCQlpZiAoIWNvdW50KSB7CisJCQkJaWYgKGhlYWQtPm5leHQgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJdGJ1ZiA9IGhlYWQ7CisJCQkJaGVhZCA9IGhlYWQtPm5leHQ7CisJCQkJdHR5X2J1ZmZlcl9mcmVlKHR0eSwgdGJ1Zik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBMZGlzYyBvciB1c2VyIGlzIHRyeWluZyB0byBmbHVzaCB0aGUgYnVmZmVycworCQkJICAgd2UgYXJlIGZlZWRpbmcgdG8gdGhlIGxkaXNjLCBzdG9wIGZlZWRpbmcgdGhlCisJCQkgICBsaW5lIGRpc2NpcGxpbmUgYXMgd2Ugd2FudCB0byBlbXB0eSB0aGUgcXVldWUgKi8KKwkJCWlmICh0ZXN0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncykpCisJCQkJYnJlYWs7CisJCQlpZiAoIXR0eS0+cmVjZWl2ZV9yb29tKSB7CisJCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjb3VudCA+IHR0eS0+cmVjZWl2ZV9yb29tKQorCQkJCWNvdW50ID0gdHR5LT5yZWNlaXZlX3Jvb207CisJCQljaGFyX2J1ZiA9IGhlYWQtPmNoYXJfYnVmX3B0ciArIGhlYWQtPnJlYWQ7CisJCQlmbGFnX2J1ZiA9IGhlYWQtPmZsYWdfYnVmX3B0ciArIGhlYWQtPnJlYWQ7CisJCQloZWFkLT5yZWFkICs9IGNvdW50OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCQkJZGlzYy0+b3BzLT5yZWNlaXZlX2J1Zih0dHksIGNoYXJfYnVmLAorCQkJCQkJCWZsYWdfYnVmLCBjb3VudCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOworCQl9CisJCS8qIFJlc3RvcmUgdGhlIHF1ZXVlIGhlYWQgKi8KKwkJdHR5LT5idWYuaGVhZCA9IGhlYWQ7CisJfQorCS8qIFdlIG1heSBoYXZlIGEgZGVmZXJyZWQgcmVxdWVzdCB0byBmbHVzaCB0aGUgaW5wdXQgYnVmZmVyLAorCSAgIGlmIHNvIHB1bGwgdGhlIGNoYWluIHVuZGVyIHRoZSBsb2NrIGFuZCBlbXB0eSB0aGUgcXVldWUgKi8KKwlpZiAodGVzdF9iaXQoVFRZX0ZMVVNIUEVORElORywgJnR0eS0+ZmxhZ3MpKSB7CisJCV9fdHR5X2J1ZmZlcl9mbHVzaCh0dHkpOworCQljbGVhcl9iaXQoVFRZX0ZMVVNIUEVORElORywgJnR0eS0+ZmxhZ3MpOworCQl3YWtlX3VwKCZ0dHktPnJlYWRfd2FpdCk7CisJfQorCWNsZWFyX2JpdChUVFlfRkxVU0hJTkcsICZ0dHktPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7CisKKwl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7Cit9CisKKy8qKgorICoJdHR5X2ZsaXBfYnVmZmVyX3B1c2gJLQl0ZXJtaW5hbAorICoJQHR0eTogdHR5IHRvIHB1c2gKKyAqCisgKglRdWV1ZSBhIHB1c2ggb2YgdGhlIHRlcm1pbmFsIGZsaXAgYnVmZmVycyB0byB0aGUgbGluZSBkaXNjaXBsaW5lLiBUaGlzCisgKglmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dCBpZiB0dHktPmxvd19sYXRlbmN5IGlzIHNldC4KKyAqCisgKglJbiB0aGUgZXZlbnQgb2YgdGhlIHF1ZXVlIGJlaW5nIGJ1c3kgZm9yIGZsaXBwaW5nIHRoZSB3b3JrIHdpbGwgYmUKKyAqCWhlbGQgb2ZmIGFuZCByZXRyaWVkIGxhdGVyLgorICoKKyAqCUxvY2tpbmc6IHR0eSBidWZmZXIgbG9jay4gRHJpdmVyIGxvY2tzIGluIGxvdyBsYXRlbmN5IG1vZGUuCisgKi8KKwordm9pZCB0dHlfZmxpcF9idWZmZXJfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKKwlpZiAodHR5LT5idWYudGFpbCAhPSBOVUxMKQorCQl0dHktPmJ1Zi50YWlsLT5jb21taXQgPSB0dHktPmJ1Zi50YWlsLT51c2VkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKKworCWlmICh0dHktPmxvd19sYXRlbmN5KQorCQlmbHVzaF90b19sZGlzYygmdHR5LT5idWYud29yay53b3JrKTsKKwllbHNlCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9mbGlwX2J1ZmZlcl9wdXNoKTsKKworLyoqCisgKgl0dHlfYnVmZmVyX2luaXQJCS0JcHJlcGFyZSBhIHR0eSBidWZmZXIgc3RydWN0dXJlCisgKglAdHR5OiB0dHkgdG8gaW5pdGlhbGlzZQorICoKKyAqCVNldCB1cCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgZm9yIGEgdHR5IGRldmljZS4KKyAqCU11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgb3RoZXIgdHR5IGJ1ZmZlciBmdW5jdGlvbnMgYXJlIHVzZWQuCisgKgorICoJTG9ja2luZzogbm9uZQorICovCisKK3ZvaWQgdHR5X2J1ZmZlcl9pbml0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3Bpbl9sb2NrX2luaXQoJnR0eS0+YnVmLmxvY2spOworCXR0eS0+YnVmLmhlYWQgPSBOVUxMOworCXR0eS0+YnVmLnRhaWwgPSBOVUxMOworCXR0eS0+YnVmLmZyZWUgPSBOVUxMOworCXR0eS0+YnVmLm1lbW9yeV91c2VkID0gMDsKKwlJTklUX0RFTEFZRURfV09SSygmdHR5LT5idWYud29yaywgZmx1c2hfdG9fbGRpc2MpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggZGFlYjhmNy4uNTlmNDcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtNDksNyArNDksNyBAQAogICogaW1wbGVtZW50IENPTkZJR19WVCBhbmQgZ2VuZXJhbGl6ZSBjb25zb2xlIGRldmljZSBpbnRlcmZhY2UuCiAgKgktLSBNYXJrbyBLb2h0YWxhIDxNYXJrby5Lb2h0YWxhQGh1dC5maT4sIE1hcmNoIDk3CiAgKgotICogUmV3cm90ZSBpbml0X2RldiBhbmQgcmVsZWFzZV9kZXYgdG8gZWxpbWluYXRlIHJhY2VzLgorICogUmV3cm90ZSB0dHlfaW5pdF9kZXYgYW5kIHR0eV9yZWxlYXNlX2RldiB0byBlbGltaW5hdGUgcmFjZXMuCiAgKgktLSBCaWxsIEhhd2VzIDx3aGF3ZXNAc3Rhci5uZXQ+LCBKdW5lIDk3CiAgKgogICogQWRkZWQgZGV2ZnMgc3VwcG9ydC4KQEAgLTEzNiwxMyArMTM2LDYgQEAKIERFRklORV9NVVRFWCh0dHlfbXV0ZXgpOwogRVhQT1JUX1NZTUJPTCh0dHlfbXV0ZXgpOwogCi0jaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCi1leHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKnB0bV9kcml2ZXI7CS8qIFVuaXg5OCBwdHkgbWFzdGVyczsgZm9yIC9kZXYvcHRteCAqLwotc3RhdGljIGludCBwdG14X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfdHR5X3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLQogc3RhdGljIHNzaXplX3QgdHR5X3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBzdGF0aWMgc3NpemVfdCB0dHlfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBzc2l6ZV90IHJlZGlyZWN0ZWRfdHR5X3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosCkBAIC0xNzEsMTMgKzE2NCwxMSBAQAogICoJTG9ja2luZzogbm9uZQogICovCiAKLXN0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqYWxsb2NfdHR5X3N0cnVjdCh2b2lkKQorc3RydWN0IHR0eV9zdHJ1Y3QgKmFsbG9jX3R0eV9zdHJ1Y3Qodm9pZCkKIHsKIAlyZXR1cm4ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIH0KIAotc3RhdGljIHZvaWQgdHR5X2J1ZmZlcl9mcmVlX2FsbChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLQogLyoqCiAgKglmcmVlX3R0eV9zdHJ1Y3QJCS0JZnJlZSBhIGRpc3VzZWQgdHR5CiAgKglAdHR5OiB0dHkgc3RydWN0IHRvIGZyZWUKQEAgLTE4Nyw3ICsxNzgsNyBAQAogICoJTG9ja2luZzogbm9uZS4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdHR5IGlzIGRlZmluaXRlbHkgdW51c2VkCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdHR5X3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQordm9pZCBmcmVlX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlrZnJlZSh0dHktPndyaXRlX2J1Zik7CiAJdHR5X2J1ZmZlcl9mcmVlX2FsbCh0dHkpOwpAQCAtMjYzLDM5OCArMjU0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFR0eSBidWZmZXIgYWxsb2NhdGlvbiBtYW5hZ2VtZW50Ci0gKi8KLQotLyoqCi0gKgl0dHlfYnVmZmVyX2ZyZWVfYWxsCQktCWZyZWUgYnVmZmVycyB1c2VkIGJ5IGEgdHR5Ci0gKglAdHR5OiB0dHkgdG8gZnJlZSBmcm9tCi0gKgotICoJUmVtb3ZlIGFsbCB0aGUgYnVmZmVycyBwZW5kaW5nIG9uIGEgdHR5IHdoZXRoZXIgcXVldWVkIHdpdGggZGF0YQotICoJb3IgaW4gdGhlIGZyZWUgcmluZy4gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgdHR5IGlzIG5vIGxvbmdlciBpbiB1c2UKLSAqCi0gKglMb2NraW5nOiBub25lCi0gKi8KLQotc3RhdGljIHZvaWQgdHR5X2J1ZmZlcl9mcmVlX2FsbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCB0dHlfYnVmZmVyICp0aGVhZDsKLQl3aGlsZSAoKHRoZWFkID0gdHR5LT5idWYuaGVhZCkgIT0gTlVMTCkgewotCQl0dHktPmJ1Zi5oZWFkID0gdGhlYWQtPm5leHQ7Ci0JCWtmcmVlKHRoZWFkKTsKLQl9Ci0Jd2hpbGUgKCh0aGVhZCA9IHR0eS0+YnVmLmZyZWUpICE9IE5VTEwpIHsKLQkJdHR5LT5idWYuZnJlZSA9IHRoZWFkLT5uZXh0OwotCQlrZnJlZSh0aGVhZCk7Ci0JfQotCXR0eS0+YnVmLnRhaWwgPSBOVUxMOwotCXR0eS0+YnVmLm1lbW9yeV91c2VkID0gMDsKLX0KLQotLyoqCi0gKgl0dHlfYnVmZmVyX2luaXQJCS0JcHJlcGFyZSBhIHR0eSBidWZmZXIgc3RydWN0dXJlCi0gKglAdHR5OiB0dHkgdG8gaW5pdGlhbGlzZQotICoKLSAqCVNldCB1cCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgZm9yIGEgdHR5IGRldmljZS4KLSAqCU11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgb3RoZXIgdHR5IGJ1ZmZlciBmdW5jdGlvbnMgYXJlIHVzZWQuCi0gKgotICoJTG9ja2luZzogbm9uZQotICovCi0KLXN0YXRpYyB2b2lkIHR0eV9idWZmZXJfaW5pdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXNwaW5fbG9ja19pbml0KCZ0dHktPmJ1Zi5sb2NrKTsKLQl0dHktPmJ1Zi5oZWFkID0gTlVMTDsKLQl0dHktPmJ1Zi50YWlsID0gTlVMTDsKLQl0dHktPmJ1Zi5mcmVlID0gTlVMTDsKLQl0dHktPmJ1Zi5tZW1vcnlfdXNlZCA9IDA7Ci19Ci0KLS8qKgotICoJdHR5X2J1ZmZlcl9hbGxvYwktCWFsbG9jYXRlIGEgdHR5IGJ1ZmZlcgotICoJQHR0eTogdHR5IGRldmljZQotICoJQHNpemU6IGRlc2lyZWQgc2l6ZSAoY2hhcmFjdGVycykKLSAqCi0gKglBbGxvY2F0ZSBhIG5ldyB0dHkgYnVmZmVyIHRvIGhvbGQgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gKglSZXR1cm4gTlVMTCBpZiBvdXQgb2YgbWVtb3J5IG9yIHRoZSBhbGxvY2F0aW9uIHdvdWxkIGV4Y2VlZCB0aGUKLSAqCXBlciBkZXZpY2UgcXVldWUKLSAqCi0gKglMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHR0eS0+YnVmLmxvY2sKLSAqLwotCi1zdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfYWxsb2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IHR0eV9idWZmZXIgKnA7Ci0KLQlpZiAodHR5LT5idWYubWVtb3J5X3VzZWQgKyBzaXplID4gNjU1MzYpCi0JCXJldHVybiBOVUxMOwotCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2J1ZmZlcikgKyAyICogc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcC0+dXNlZCA9IDA7Ci0JcC0+c2l6ZSA9IHNpemU7Ci0JcC0+bmV4dCA9IE5VTEw7Ci0JcC0+Y29tbWl0ID0gMDsKLQlwLT5yZWFkID0gMDsKLQlwLT5jaGFyX2J1Zl9wdHIgPSAoY2hhciAqKShwLT5kYXRhKTsKLQlwLT5mbGFnX2J1Zl9wdHIgPSAodW5zaWduZWQgY2hhciAqKXAtPmNoYXJfYnVmX3B0ciArIHNpemU7Ci0JdHR5LT5idWYubWVtb3J5X3VzZWQgKz0gc2l6ZTsKLQlyZXR1cm4gcDsKLX0KLQotLyoqCi0gKgl0dHlfYnVmZmVyX2ZyZWUJCS0JZnJlZSBhIHR0eSBidWZmZXIKLSAqCUB0dHk6IHR0eSBvd25pbmcgdGhlIGJ1ZmZlcgotICoJQGI6IHRoZSBidWZmZXIgdG8gZnJlZQotICoKLSAqCUZyZWUgYSB0dHkgYnVmZmVyLCBvciBhZGQgaXQgdG8gdGhlIGZyZWUgbGlzdCBhY2NvcmRpbmcgdG8gb3VyCi0gKglpbnRlcm5hbCBzdHJhdGVneQotICoKLSAqCUxvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdHR5LT5idWYubG9jawotICovCi0KLXN0YXRpYyB2b2lkIHR0eV9idWZmZXJfZnJlZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X2J1ZmZlciAqYikKLXsKLQkvKiBEdW1iIHN0cmF0ZWd5IGZvciBub3cgLSBzaG91bGQga2VlcCBzb21lIHN0YXRzICovCi0JdHR5LT5idWYubWVtb3J5X3VzZWQgLT0gYi0+c2l6ZTsKLQlXQVJOX09OKHR0eS0+YnVmLm1lbW9yeV91c2VkIDwgMCk7Ci0KLQlpZiAoYi0+c2l6ZSA+PSA1MTIpCi0JCWtmcmVlKGIpOwotCWVsc2UgewotCQliLT5uZXh0ID0gdHR5LT5idWYuZnJlZTsKLQkJdHR5LT5idWYuZnJlZSA9IGI7Ci0JfQotfQotCi0vKioKLSAqCV9fdHR5X2J1ZmZlcl9mbHVzaAkJLQlmbHVzaCBmdWxsIHR0eSBidWZmZXJzCi0gKglAdHR5OiB0dHkgdG8gZmx1c2gKLSAqCi0gKglmbHVzaCBhbGwgdGhlIGJ1ZmZlcnMgY29udGFpbmluZyByZWNlaXZlIGRhdGEuIENhbGxlciBtdXN0Ci0gKglob2xkIHRoZSBidWZmZXIgbG9jayBhbmQgbXVzdCBoYXZlIGVuc3VyZWQgbm8gcGFyYWxsZWwgZmx1c2ggdG8KLSAqCWxkaXNjIGlzIHJ1bm5pbmcuCi0gKgotICoJTG9ja2luZzogQ2FsbGVyIG11c3QgaG9sZCB0dHktPmJ1Zi5sb2NrCi0gKi8KLQotc3RhdGljIHZvaWQgX190dHlfYnVmZmVyX2ZsdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHR0eV9idWZmZXIgKnRoZWFkOwotCi0Jd2hpbGUgKCh0aGVhZCA9IHR0eS0+YnVmLmhlYWQpICE9IE5VTEwpIHsKLQkJdHR5LT5idWYuaGVhZCA9IHRoZWFkLT5uZXh0OwotCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCB0aGVhZCk7Ci0JfQotCXR0eS0+YnVmLnRhaWwgPSBOVUxMOwotfQotCi0vKioKLSAqCXR0eV9idWZmZXJfZmx1c2gJCS0JZmx1c2ggZnVsbCB0dHkgYnVmZmVycwotICoJQHR0eTogdHR5IHRvIGZsdXNoCi0gKgotICoJZmx1c2ggYWxsIHRoZSBidWZmZXJzIGNvbnRhaW5pbmcgcmVjZWl2ZSBkYXRhLiBJZiB0aGUgYnVmZmVyIGlzCi0gKgliZWluZyBwcm9jZXNzZWQgYnkgZmx1c2hfdG9fbGRpc2MgdGhlbiB3ZSBkZWZlciB0aGUgcHJvY2Vzc2luZwotICoJdG8gdGhhdCBmdW5jdGlvbgotICoKLSAqCUxvY2tpbmc6IG5vbmUKLSAqLwotCi1zdGF0aWMgdm9pZCB0dHlfYnVmZmVyX2ZsdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCi0JLyogSWYgdGhlIGRhdGEgaXMgYmVpbmcgcHVzaGVkIHRvIHRoZSB0dHkgbGF5ZXIgdGhlbiB3ZSBjYW4ndAotCSAgIHByb2Nlc3MgaXQgaGVyZS4gSW5zdGVhZCBzZXQgYSBmbGFnIGFuZCB0aGUgZmx1c2hfdG9fbGRpc2MKLQkgICBwYXRoIHdpbGwgcHJvY2VzcyB0aGUgZmx1c2ggcmVxdWVzdCBiZWZvcmUgaXQgZXhpdHMgKi8KLQlpZiAodGVzdF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncykpIHsKLQkJc2V0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKLQkJd2FpdF9ldmVudCh0dHktPnJlYWRfd2FpdCwKLQkJCQl0ZXN0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncykgPT0gMCk7Ci0JCXJldHVybjsKLQl9IGVsc2UKLQkJX190dHlfYnVmZmVyX2ZsdXNoKHR0eSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqCXR0eV9idWZmZXJfZmluZAkJLQlmaW5kIGEgZnJlZSB0dHkgYnVmZmVyCi0gKglAdHR5OiB0dHkgb3duaW5nIHRoZSBidWZmZXIKLSAqCUBzaXplOiBjaGFyYWN0ZXJzIHdhbnRlZAotICoKLSAqCUxvY2F0ZSBhbiBleGlzdGluZyBzdWl0YWJsZSB0dHkgYnVmZmVyIG9yIGlmIHdlIGFyZSBsYWNraW5nIG9uZSB0aGVuCi0gKglhbGxvY2F0ZSBhIG5ldyBvbmUuIFdlIHJvdW5kIG91ciBidWZmZXJzIG9mZiBpbiAyNTYgY2hhcmFjdGVyIGNodW5rcwotICoJdG8gZ2V0IGJldHRlciBhbGxvY2F0aW9uIGJlaGF2aW91ci4KLSAqCi0gKglMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHR0eS0+YnVmLmxvY2sKLSAqLwotCi1zdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfZmluZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgdHR5X2J1ZmZlciAqKnRiaCA9ICZ0dHktPmJ1Zi5mcmVlOwotCXdoaWxlICgoKnRiaCkgIT0gTlVMTCkgewotCQlzdHJ1Y3QgdHR5X2J1ZmZlciAqdCA9ICp0Ymg7Ci0JCWlmICh0LT5zaXplID49IHNpemUpIHsKLQkJCSp0YmggPSB0LT5uZXh0OwotCQkJdC0+bmV4dCA9IE5VTEw7Ci0JCQl0LT51c2VkID0gMDsKLQkJCXQtPmNvbW1pdCA9IDA7Ci0JCQl0LT5yZWFkID0gMDsKLQkJCXR0eS0+YnVmLm1lbW9yeV91c2VkICs9IHQtPnNpemU7Ci0JCQlyZXR1cm4gdDsKLQkJfQotCQl0YmggPSAmKCgqdGJoKS0+bmV4dCk7Ci0JfQotCS8qIFJvdW5kIHRoZSBidWZmZXIgc2l6ZSBvdXQgKi8KLQlzaXplID0gKHNpemUgKyAweEZGKSAmIH4weEZGOwotCXJldHVybiB0dHlfYnVmZmVyX2FsbG9jKHR0eSwgc2l6ZSk7Ci0JLyogU2hvdWxkIHBvc3NpYmx5IGNoZWNrIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBsYXJnZXN0IGJ1ZmZlciB3ZQotCSAgIGhhdmUgcXVldWVkIGFuZCByZWN5Y2xlIHRoYXQgPyAqLwotfQotCi0vKioKLSAqCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tCQktCWdyb3cgdHR5IGJ1ZmZlciBpZiBuZWVkZWQKLSAqCUB0dHk6IHR0eSBzdHJ1Y3R1cmUKLSAqCUBzaXplOiBzaXplIGRlc2lyZWQKLSAqCi0gKglNYWtlIGF0IGxlYXN0IHNpemUgYnl0ZXMgb2YgbGluZWFyIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIHR0eQotICoJYnVmZmVyLiBJZiB3ZSBmYWlsIHJldHVybiB0aGUgc2l6ZSB3ZSBtYW5hZ2VkIHRvIGZpbmQuCi0gKgotICoJTG9ja2luZzogVGFrZXMgdHR5LT5idWYubG9jawotICovCi1pbnQgdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IHR0eV9idWZmZXIgKmIsICpuOwotCWludCBsZWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCi0JLyogT1BUSU1JU0FUSU9OOiBXZSBjb3VsZCBrZWVwIGEgcGVyIHR0eSAiemVybyIgc2l6ZWQgYnVmZmVyIHRvCi0JICAgcmVtb3ZlIHRoaXMgY29uZGl0aW9uYWwgaWYgaXRzIHdvcnRoIGl0LiBUaGlzIHdvdWxkIGJlIGludmlzaWJsZQotCSAgIHRvIHRoZSBjYWxsZXJzICovCi0JaWYgKChiID0gdHR5LT5idWYudGFpbCkgIT0gTlVMTCkKLQkJbGVmdCA9IGItPnNpemUgLSBiLT51c2VkOwotCWVsc2UKLQkJbGVmdCA9IDA7Ci0KLQlpZiAobGVmdCA8IHNpemUpIHsKLQkJLyogVGhpcyBpcyB0aGUgc2xvdyBwYXRoIC0gbG9va2luZyBmb3IgbmV3IGJ1ZmZlcnMgdG8gdXNlICovCi0JCWlmICgobiA9IHR0eV9idWZmZXJfZmluZCh0dHksIHNpemUpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoYiAhPSBOVUxMKSB7Ci0JCQkJYi0+bmV4dCA9IG47Ci0JCQkJYi0+Y29tbWl0ID0gYi0+dXNlZDsKLQkJCX0gZWxzZQotCQkJCXR0eS0+YnVmLmhlYWQgPSBuOwotCQkJdHR5LT5idWYudGFpbCA9IG47Ci0JCX0gZWxzZQotCQkJc2l6ZSA9IGxlZnQ7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCXJldHVybiBzaXplOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20pOwotCi0vKioKLSAqCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcJLQlBZGQgY2hhcmFjdGVycyB0byB0aGUgdHR5IGJ1ZmZlcgotICoJQHR0eTogdHR5IHN0cnVjdHVyZQotICoJQGNoYXJzOiBjaGFyYWN0ZXJzCi0gKglAc2l6ZTogc2l6ZQotICoKLSAqCVF1ZXVlIGEgc2VyaWVzIG9mIGJ5dGVzIHRvIHRoZSB0dHkgYnVmZmVyaW5nLiBBbGwgdGhlIGNoYXJhY3RlcnMKLSAqCXBhc3NlZCBhcmUgbWFya2VkIGFzIHdpdGhvdXQgZXJyb3IuIFJldHVybnMgdGhlIG51bWJlciBhZGRlZC4KLSAqCi0gKglMb2NraW5nOiBDYWxsZWQgZnVuY3Rpb25zIG1heSB0YWtlIHR0eS0+YnVmLmxvY2sKLSAqLwotCi1pbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaGFycywKLQkJCQlzaXplX3Qgc2l6ZSkKLXsKLQlpbnQgY29waWVkID0gMDsKLQlkbyB7Ci0JCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSAtIGNvcGllZCk7Ci0JCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7Ci0JCS8qIElmIHRoZXJlIGlzIG5vIHNwYWNlIHRoZW4gdGIgbWF5IGJlIE5VTEwgKi8KLQkJaWYgKHVubGlrZWx5KHNwYWNlID09IDApKQotCQkJYnJlYWs7Ci0JCW1lbWNweSh0Yi0+Y2hhcl9idWZfcHRyICsgdGItPnVzZWQsIGNoYXJzLCBzcGFjZSk7Ci0JCW1lbXNldCh0Yi0+ZmxhZ19idWZfcHRyICsgdGItPnVzZWQsIFRUWV9OT1JNQUwsIHNwYWNlKTsKLQkJdGItPnVzZWQgKz0gc3BhY2U7Ci0JCWNvcGllZCArPSBzcGFjZTsKLQkJY2hhcnMgKz0gc3BhY2U7Ci0JCS8qIFRoZXJlIGlzIGEgc21hbGwgY2hhbmNlIHRoYXQgd2UgbmVlZCB0byBzcGxpdCB0aGUgZGF0YSBvdmVyCi0JCSAgIHNldmVyYWwgYnVmZmVycy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB3ZSBtdXN0IGxvb3AgKi8KLQl9IHdoaWxlICh1bmxpa2VseShzaXplID4gY29waWVkKSk7Ci0JcmV0dXJuIGNvcGllZDsKLX0KLUVYUE9SVF9TWU1CT0wodHR5X2luc2VydF9mbGlwX3N0cmluZyk7Ci0KLS8qKgotICoJdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncwktCUFkZCBjaGFyYWN0ZXJzIHRvIHRoZSB0dHkgYnVmZmVyCi0gKglAdHR5OiB0dHkgc3RydWN0dXJlCi0gKglAY2hhcnM6IGNoYXJhY3RlcnMKLSAqCUBmbGFnczogZmxhZyBieXRlcwotICoJQHNpemU6IHNpemUKLSAqCi0gKglRdWV1ZSBhIHNlcmllcyBvZiBieXRlcyB0byB0aGUgdHR5IGJ1ZmZlcmluZy4gRm9yIGVhY2ggY2hhcmFjdGVyCi0gKgl0aGUgZmxhZ3MgYXJyYXkgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIGNoYXJhY3Rlci4gUmV0dXJucyB0aGUKLSAqCW51bWJlciBhZGRlZC4KLSAqCi0gKglMb2NraW5nOiBDYWxsZWQgZnVuY3Rpb25zIG1heSB0YWtlIHR0eS0+YnVmLmxvY2sKLSAqLwotCi1pbnQgdHR5X2luc2VydF9mbGlwX3N0cmluZ19mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQljb25zdCB1bnNpZ25lZCBjaGFyICpjaGFycywgY29uc3QgY2hhciAqZmxhZ3MsIHNpemVfdCBzaXplKQotewotCWludCBjb3BpZWQgPSAwOwotCWRvIHsKLQkJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplIC0gY29waWVkKTsKLQkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKLQkJLyogSWYgdGhlcmUgaXMgbm8gc3BhY2UgdGhlbiB0YiBtYXkgYmUgTlVMTCAqLwotCQlpZiAodW5saWtlbHkoc3BhY2UgPT0gMCkpCi0JCQlicmVhazsKLQkJbWVtY3B5KHRiLT5jaGFyX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgY2hhcnMsIHNwYWNlKTsKLQkJbWVtY3B5KHRiLT5mbGFnX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgZmxhZ3MsIHNwYWNlKTsKLQkJdGItPnVzZWQgKz0gc3BhY2U7Ci0JCWNvcGllZCArPSBzcGFjZTsKLQkJY2hhcnMgKz0gc3BhY2U7Ci0JCWZsYWdzICs9IHNwYWNlOwotCQkvKiBUaGVyZSBpcyBhIHNtYWxsIGNoYW5jZSB0aGF0IHdlIG5lZWQgdG8gc3BsaXQgdGhlIGRhdGEgb3ZlcgotCQkgICBzZXZlcmFsIGJ1ZmZlcnMuIElmIHRoaXMgaXMgdGhlIGNhc2Ugd2UgbXVzdCBsb29wICovCi0JfSB3aGlsZSAodW5saWtlbHkoc2l6ZSA+IGNvcGllZCkpOwotCXJldHVybiBjb3BpZWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0eV9pbnNlcnRfZmxpcF9zdHJpbmdfZmxhZ3MpOwotCi0vKioKLSAqCXR0eV9zY2hlZHVsZV9mbGlwCS0JcHVzaCBjaGFyYWN0ZXJzIHRvIGxkaXNjCi0gKglAdHR5OiB0dHkgdG8gcHVzaCBmcm9tCi0gKgotICoJVGFrZXMgYW55IHBlbmRpbmcgYnVmZmVycyBhbmQgdHJhbnNmZXJzIHRoZWlyIG93bmVyc2hpcCB0byB0aGUKLSAqCWxkaXNjIHNpZGUgb2YgdGhlIHF1ZXVlLiBJdCB0aGVuIHNjaGVkdWxlcyB0aG9zZSBjaGFyYWN0ZXJzIGZvcgotICoJcHJvY2Vzc2luZyBieSB0aGUgbGluZSBkaXNjaXBsaW5lLgotICoKLSAqCUxvY2tpbmc6IFRha2VzIHR0eS0+YnVmLmxvY2sKLSAqLwotCi12b2lkIHR0eV9zY2hlZHVsZV9mbGlwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCWlmICh0dHktPmJ1Zi50YWlsICE9IE5VTEwpCi0JCXR0eS0+YnVmLnRhaWwtPmNvbW1pdCA9IHR0eS0+YnVmLnRhaWwtPnVzZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0eV9zY2hlZHVsZV9mbGlwKTsKLQotLyoqCi0gKgl0dHlfcHJlcGFyZV9mbGlwX3N0cmluZwkJLQltYWtlIHJvb20gZm9yIGNoYXJhY3RlcnMKLSAqCUB0dHk6IHR0eQotICoJQGNoYXJzOiByZXR1cm4gcG9pbnRlciBmb3IgY2hhcmFjdGVyIHdyaXRlIGFyZWEKLSAqCUBzaXplOiBkZXNpcmVkIHNpemUKLSAqCi0gKglQcmVwYXJlIGEgYmxvY2sgb2Ygc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgZGF0YS4gUmV0dXJucyB0aGUgbGVuZ3RoCi0gKglhdmFpbGFibGUgYW5kIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBzcGFjZSB3aGljaCBpcyBub3cgYWxsb2NhdGVkIGFuZAotICoJYWNjb3VudGVkIGZvciBhcyByZWFkeSBmb3Igbm9ybWFsIGNoYXJhY3RlcnMuIFRoaXMgaXMgdXNlZCBmb3IgZHJpdmVycwotICoJdGhhdCBuZWVkIHRoZWlyIG93biBibG9jayBjb3B5IHJvdXRpbmVzIGludG8gdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8KLSAqCWd1YXJhbnRlZSB0aGUgYnVmZmVyIGlzIGEgRE1BIHRhcmdldCEKLSAqCi0gKglMb2NraW5nOiBNYXkgY2FsbCBmdW5jdGlvbnMgdGFraW5nIHR0eS0+YnVmLmxvY2sKLSAqLwotCi1pbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqKmNoYXJzLAotCQkJCQkJCQlzaXplX3Qgc2l6ZSkKLXsKLQlpbnQgc3BhY2UgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHNpemUpOwotCWlmIChsaWtlbHkoc3BhY2UpKSB7Ci0JCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7Ci0JCSpjaGFycyA9IHRiLT5jaGFyX2J1Zl9wdHIgKyB0Yi0+dXNlZDsKLQkJbWVtc2V0KHRiLT5mbGFnX2J1Zl9wdHIgKyB0Yi0+dXNlZCwgVFRZX05PUk1BTCwgc3BhY2UpOwotCQl0Yi0+dXNlZCArPSBzcGFjZTsKLQl9Ci0JcmV0dXJuIHNwYWNlOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfcHJlcGFyZV9mbGlwX3N0cmluZyk7Ci0KLS8qKgotICoJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3MJLQltYWtlIHJvb20gZm9yIGNoYXJhY3RlcnMKLSAqCUB0dHk6IHR0eQotICoJQGNoYXJzOiByZXR1cm4gcG9pbnRlciBmb3IgY2hhcmFjdGVyIHdyaXRlIGFyZWEKLSAqCUBmbGFnczogcmV0dXJuIHBvaW50ZXIgZm9yIHN0YXR1cyBmbGFnIHdyaXRlIGFyZWEKLSAqCUBzaXplOiBkZXNpcmVkIHNpemUKLSAqCi0gKglQcmVwYXJlIGEgYmxvY2sgb2Ygc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgZGF0YS4gUmV0dXJucyB0aGUgbGVuZ3RoCi0gKglhdmFpbGFibGUgYW5kIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBzcGFjZSB3aGljaCBpcyBub3cgYWxsb2NhdGVkIGFuZAotICoJYWNjb3VudGVkIGZvciBhcyByZWFkeSBmb3IgY2hhcmFjdGVycy4gVGhpcyBpcyB1c2VkIGZvciBkcml2ZXJzCi0gKgl0aGF0IG5lZWQgdGhlaXIgb3duIGJsb2NrIGNvcHkgcm91dGluZXMgaW50byB0aGUgYnVmZmVyLiBUaGVyZSBpcyBubwotICoJZ3VhcmFudGVlIHRoZSBidWZmZXIgaXMgYSBETUEgdGFyZ2V0IQotICoKLSAqCUxvY2tpbmc6IE1heSBjYWxsIGZ1bmN0aW9ucyB0YWtpbmcgdHR5LT5idWYubG9jawotICovCi0KLWludCB0dHlfcHJlcGFyZV9mbGlwX3N0cmluZ19mbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJdW5zaWduZWQgY2hhciAqKmNoYXJzLCBjaGFyICoqZmxhZ3MsIHNpemVfdCBzaXplKQotewotCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSk7Ci0JaWYgKGxpa2VseShzcGFjZSkpIHsKLQkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKLQkJKmNoYXJzID0gdGItPmNoYXJfYnVmX3B0ciArIHRiLT51c2VkOwotCQkqZmxhZ3MgPSB0Yi0+ZmxhZ19idWZfcHRyICsgdGItPnVzZWQ7Ci0JCXRiLT51c2VkICs9IHNwYWNlOwotCX0KLQlyZXR1cm4gc3BhY2U7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzKTsKLQotCi0KIC8qKgogICoJZ2V0X3R0eV9kcml2ZXIJCS0JZmluZCBkZXZpY2Ugb2YgYSB0dHkKICAqCUBkZXZfdDogZGV2aWNlIGlkZW50aWZpZXIKQEAgLTY3NSw3ICsyNzQsNyBAQAogCQlpZiAoZGV2aWNlIDwgYmFzZSB8fCBkZXZpY2UgPj0gYmFzZSArIHAtPm51bSkKIAkJCWNvbnRpbnVlOwogCQkqaW5kZXggPSBkZXZpY2UgLSBiYXNlOwotCQlyZXR1cm4gcDsKKwkJcmV0dXJuIHR0eV9kcml2ZXJfa3JlZl9nZXQocCk7CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtNjk1LDEzICsyOTQsMjMgQEAKIHsKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqcCwgKnJlcyA9IE5VTEw7CiAJaW50IHR0eV9saW5lID0gMDsKKwlpbnQgbGVuOwogCWNoYXIgKnN0cjsKIAorCWZvciAoc3RyID0gbmFtZTsgKnN0cjsgc3RyKyspCisJCWlmICgoKnN0ciA+PSAnMCcgJiYgKnN0ciA8PSAnOScpIHx8ICpzdHIgPT0gJywnKQorCQkJYnJlYWs7CisJaWYgKCEqc3RyKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN0ciAtIG5hbWU7CisJdHR5X2xpbmUgPSBzaW1wbGVfc3RydG91bChzdHIsICZzdHIsIDEwKTsKKwogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJLyogU2VhcmNoIHRocm91Z2ggdGhlIHR0eSBkZXZpY2VzIHRvIGxvb2sgZm9yIGEgbWF0Y2ggKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0dHlfZHJpdmVycywgdHR5X2RyaXZlcnMpIHsKLQkJc3RyID0gbmFtZSArIHN0cmxlbihwLT5uYW1lKTsKLQkJdHR5X2xpbmUgPSBzaW1wbGVfc3RydG91bChzdHIsICZzdHIsIDEwKTsKKwkJaWYgKHN0cm5jbXAobmFtZSwgcC0+bmFtZSwgbGVuKSAhPSAwKQorCQkJY29udGludWU7CiAJCWlmICgqc3RyID09ICcsJykKIAkJCXN0cisrOwogCQlpZiAoKnN0ciA9PSAnXDAnKQpAQCAtNzA5LDcgKzMxOCw3IEBACiAKIAkJaWYgKHR0eV9saW5lID49IDAgJiYgdHR5X2xpbmUgPD0gcC0+bnVtICYmIHAtPm9wcyAmJgogCQkgICAgcC0+b3BzLT5wb2xsX2luaXQgJiYgIXAtPm9wcy0+cG9sbF9pbml0KHAsIHR0eV9saW5lLCBzdHIpKSB7Ci0JCQlyZXMgPSBwOworCQkJcmVzID0gdHR5X2RyaXZlcl9rcmVmX2dldChwKTsKIAkJCSpsaW5lID0gdHR5X2xpbmU7CiAJCQlicmVhazsKIAkJfQpAQCAtODA5LDIwICs0MTgsNiBAQAogCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKIH07CiAKLSNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB0bXhfZm9wcyA9IHsKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSB0dHlfcmVhZCwKLQkud3JpdGUJCT0gdHR5X3dyaXRlLAotCS5wb2xsCQk9IHR0eV9wb2xsLAotCS51bmxvY2tlZF9pb2N0bAk9IHR0eV9pb2N0bCwKLQkuY29tcGF0X2lvY3RsCT0gdHR5X2NvbXBhdF9pb2N0bCwKLQkub3BlbgkJPSBwdG14X29wZW4sCi0JLnJlbGVhc2UJPSB0dHlfcmVsZWFzZSwKLQkuZmFzeW5jCQk9IHR0eV9mYXN5bmMsCi19OwotI2VuZGlmCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbnNvbGVfZm9wcyA9IHsKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIAkucmVhZAkJPSB0dHlfcmVhZCwKQEAgLTk0Myw2ICs1MzgsNyBAQAogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCWludCAgICBjbG9zZWNvdW50ID0gMCwgbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZWZzID0gMDsKIAogCWlmICghdHR5KQogCQlyZXR1cm47CkBAIC0xMDA5LDggKzYwNSwxMiBAQAogCWlmICh0dHktPnNlc3Npb24pIHsKIAkJZG9fZWFjaF9waWRfdGFzayh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CiAJCQlzcGluX2xvY2tfaXJxKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJCWlmIChwLT5zaWduYWwtPnR0eSA9PSB0dHkpCisJCQlpZiAocC0+c2lnbmFsLT50dHkgPT0gdHR5KSB7CiAJCQkJcC0+c2lnbmFsLT50dHkgPSBOVUxMOworCQkJCS8qIFdlIGRlZmVyIHRoZSBkZXJlZmVyZW5jZXMgb3V0c2lkZSBmbworCQkJCSAgIHRoZSB0YXNrbGlzdCBsb2NrICovCisJCQkJcmVmcysrOworCQkJfQogCQkJaWYgKCFwLT5zaWduYWwtPmxlYWRlcikgewogCQkJCXNwaW5fdW5sb2NrX2lycSgmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCQkJY29udGludWU7CkBAIC0xMDM2LDYgKzYzNiwxMCBAQAogCXR0eS0+Y3RybF9zdGF0dXMgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+Y3RybF9sb2NrLCBmbGFncyk7CiAKKwkvKiBBY2NvdW50IGZvciB0aGUgcC0+c2lnbmFsIHJlZmVyZW5jZXMgd2Uga2lsbGVkICovCisJd2hpbGUgKHJlZnMtLSkKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CisKIAkvKgogCSAqIElmIG9uZSBvZiB0aGUgZGV2aWNlcyBtYXRjaGVzIGEgY29uc29sZSBwb2ludGVyLCB3ZQogCSAqIGNhbm5vdCBqdXN0IGNhbGwgaGFuZ3VwKCkgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKQEAgLTExMDUsNiArNzA5LDIzIEBACiBFWFBPUlRfU1lNQk9MKHR0eV92aGFuZ3VwKTsKIAogLyoqCisgKgl0dHlfdmhhbmd1cF9zZWxmCS0JcHJvY2VzcyB2aGFuZ3VwIGZvciBvd24gY3R0eQorICoKKyAqCVBlcmZvcm0gYSB2aGFuZ3VwIG9uIHRoZSBjdXJyZW50IGNvbnRyb2xsaW5nIHR0eQorICovCisKK3ZvaWQgdHR5X3ZoYW5ndXBfc2VsZih2b2lkKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKKwlpZiAodHR5KSB7CisJCXR0eV92aGFuZ3VwKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KK30KKworLyoqCiAgKgl0dHlfaHVuZ191cF9wCQktCXdhcyB0dHkgaHVuZyB1cAogICoJQGZpbHA6IGZpbGUgcG9pbnRlciBvZiB0dHkKICAqCkBAIC0xMTU3LDE2ICs3NzgsMTQgQEAKIAlzdHJ1Y3QgcGlkICp0dHlfcGdycCA9IE5VTEw7CiAKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CiAJaWYgKHR0eSkgewogCQl0dHlfcGdycCA9IGdldF9waWQodHR5LT5wZ3JwKTsKIAkJbG9ja19rZXJuZWwoKTsKLQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwotCQkvKiBYWFg6IGhlcmUgd2UgcmFjZSwgdGhlcmUgaXMgbm90aGluZyBwcm90ZWN0aW5nIHR0eSAqLwogCQlpZiAob25fZXhpdCAmJiB0dHktPmRyaXZlci0+dHlwZSAhPSBUVFlfRFJJVkVSX1RZUEVfUFRZKQogCQkJdHR5X3ZoYW5ndXAodHR5KTsKIAkJdW5sb2NrX2tlcm5lbCgpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9IGVsc2UgaWYgKG9uX2V4aXQpIHsKIAkJc3RydWN0IHBpZCAqb2xkX3BncnA7CiAJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwpAQCAtMTE3OCw3ICs3OTcsNiBAQAogCQkJa2lsbF9wZ3JwKG9sZF9wZ3JwLCBTSUdDT05ULCBvbl9leGl0KTsKIAkJCXB1dF9waWQob2xkX3BncnApOwogCQl9Ci0JCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJcmV0dXJuOwogCX0KIAlpZiAodHR5X3BncnApIHsKQEAgLTExOTMsOCArODExLDYgQEAKIAljdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JLyogSXQgaXMgcG9zc2libGUgdGhhdCBkb190dHlfaGFuZ3VwIGhhcyBmcmVlJ2QgdGhpcyB0dHkgKi8KIAl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKIAlpZiAodHR5KSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMjA0LDEzICs4MjAsMTMgQEAKIAkJdHR5LT5zZXNzaW9uID0gTlVMTDsKIAkJdHR5LT5wZ3JwID0gTlVMTDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5jdHJsX2xvY2ssIGZsYWdzKTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfSBlbHNlIHsKICNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCiAJCXByaW50ayhLRVJOX0RFQlVHICJlcnJvciBhdHRlbXB0ZWQgdG8gd3JpdGUgdG8gdHR5IFsweCVwXSIKIAkJICAgICAgICIgPSBOVUxMIiwgdHR5KTsKICNlbmRpZgogCX0KLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAKIAkvKiBOb3cgY2xlYXIgc2lnbmFsLT50dHkgdW5kZXIgdGhlIGxvY2sgKi8KIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtMTQxMCwxOSArMTAyNiwxOSBAQAogCiAJLyogd3JpdGVfYnVmL3dyaXRlX2NudCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGF0b21pY193cml0ZV9sb2NrIG11dGV4ICovCiAJaWYgKHR0eS0+d3JpdGVfY250IDwgY2h1bmspIHsKLQkJdW5zaWduZWQgY2hhciAqYnVmOworCQl1bnNpZ25lZCBjaGFyICpidWZfY2h1bms7CiAKIAkJaWYgKGNodW5rIDwgMTAyNCkKIAkJCWNodW5rID0gMTAyNDsKIAotCQlidWYgPSBrbWFsbG9jKGNodW5rLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpIHsKKwkJYnVmX2NodW5rID0ga21hbGxvYyhjaHVuaywgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmX2NodW5rKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJa2ZyZWUodHR5LT53cml0ZV9idWYpOwogCQl0dHktPndyaXRlX2NudCA9IGNodW5rOwotCQl0dHktPndyaXRlX2J1ZiA9IGJ1ZjsKKwkJdHR5LT53cml0ZV9idWYgPSBidWZfY2h1bms7CiAJfQogCiAJLyogRG8gdGhlIHdyaXRlIC4uICovCkBAIC0xNDU2LDYgKzEwNzIsMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIHR0eV93cml0ZV9tZXNzYWdlIC0gd3JpdGUgYSBtZXNzYWdlIHRvIGEgY2VydGFpbiB0dHksIG5vdCBqdXN0IHRoZSBjb25zb2xlLgorICogQHR0eTogdGhlIGRlc3RpbmF0aW9uIHR0eV9zdHJ1Y3QKKyAqIEBtc2c6IHRoZSBtZXNzYWdlIHRvIHdyaXRlCisgKgorICogVGhpcyBpcyB1c2VkIGZvciBtZXNzYWdlcyB0aGF0IG5lZWQgdG8gYmUgcmVkaXJlY3RlZCB0byBhIHNwZWNpZmljIHR0eS4KKyAqIFdlIGRvbid0IHB1dCBpdCBpbnRvIHRoZSBzeXNsb2cgcXVldWUgcmlnaHQgbm93IG1heWJlIGluIHRoZSBmdXR1cmUgaWYKKyAqIHJlYWxseSBuZWVkZWQuCisgKgorICogV2UgbXVzdCBzdGlsbCBob2xkIHRoZSBCS0wgYW5kIHRlc3QgdGhlIENMT1NJTkcgZmxhZyBmb3IgdGhlIG1vbWVudC4KKyAqLworCit2b2lkIHR0eV93cml0ZV9tZXNzYWdlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgKm1zZykKK3sKKwlsb2NrX2tlcm5lbCgpOworCWlmICh0dHkpIHsKKwkJbXV0ZXhfbG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7CisJCWlmICh0dHktPm9wcy0+d3JpdGUgJiYgIXRlc3RfYml0KFRUWV9DTE9TSU5HLCAmdHR5LT5mbGFncykpCisJCQl0dHktPm9wcy0+d3JpdGUodHR5LCBtc2csIHN0cmxlbihtc2cpKTsKKwkJdHR5X3dyaXRlX3VubG9jayh0dHkpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuOworfQorCiAKIC8qKgogICoJdHR5X3dyaXRlCQktCXdyaXRlIG1ldGhvZCBmb3IgdHR5IGRldmljZSBmaWxlCkBAIC0xNTIzLDQyICsxMTY0LDYgQEAKIAlyZXR1cm4gdHR5X3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwogfQogCi12b2lkIHR0eV9wb3J0X2luaXQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQotewotCW1lbXNldChwb3J0LCAwLCBzaXplb2YoKnBvcnQpKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5vcGVuX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmNsb3NlX3dhaXQpOwotCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKLQlwb3J0LT5jbG9zZV9kZWxheSA9ICg1MCAqIEhaKSAvIDEwMDsKLQlwb3J0LT5jbG9zaW5nX3dhaXQgPSAoMzAwMCAqIEhaKSAvIDEwMDsKLX0KLUVYUE9SVF9TWU1CT0wodHR5X3BvcnRfaW5pdCk7Ci0KLWludCB0dHlfcG9ydF9hbGxvY194bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCi17Ci0JLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCi0JbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwotCWlmIChwb3J0LT54bWl0X2J1ZiA9PSBOVUxMKQotCQlwb3J0LT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwotCWlmIChwb3J0LT54bWl0X2J1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodHR5X3BvcnRfYWxsb2NfeG1pdF9idWYpOwotCi12b2lkIHR0eV9wb3J0X2ZyZWVfeG1pdF9idWYoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQotewotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKLQlpZiAocG9ydC0+eG1pdF9idWYgIT0gTlVMTCkgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcG9ydC0+eG1pdF9idWYpOwotCQlwb3J0LT54bWl0X2J1ZiA9IE5VTEw7Ci0JfQotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF9mcmVlX3htaXRfYnVmKTsKLQotCiBzdGF0aWMgY2hhciBwdHljaGFyW10gPSAicHFyc3R1dnd4eXphYmNkZSI7CiAKIC8qKgpAQCAtMTU4Miw3ICsxMTg3LDcgQEAKIH0KIAogLyoqCi0gKglwdHlfbGluZV9uYW1lCS0JZ2VuZXJhdGUgbmFtZSBmb3IgYSB0dHkKKyAqCXR0eV9saW5lX25hbWUJLQlnZW5lcmF0ZSBuYW1lIGZvciBhIHR0eQogICoJQGRyaXZlcjogdGhlIHR0eSBkcml2ZXIgaW4gdXNlCiAgKglAaW5kZXg6IHRoZSBtaW5vciBudW1iZXIKICAqCUBwOiBvdXRwdXQgYnVmZmVyIG9mIGF0IGxlYXN0IDcgYnl0ZXMKQEAgLTE1OTgsMTAgKzEyMDMsMTQ4IEBACiB9CiAKIC8qKgotICoJaW5pdF9kZXYJCS0JaW5pdGlhbGlzZSBhIHR0eSBkZXZpY2UKKyAqCXR0eV9kcml2ZXJfbG9va3VwX3R0eSgpIC0gZmluZCBhbiBleGlzdGluZyB0dHksIGlmIGFueQorICoJQGRyaXZlcjogdGhlIGRyaXZlciBmb3IgdGhlIHR0eQorICoJQGlkeDoJIHRoZSBtaW5vciBudW1iZXIKKyAqCisgKglSZXR1cm4gdGhlIHR0eSwgaWYgZm91bmQgb3IgRVJSX1BUUigpIG90aGVyd2lzZS4KKyAqCisgKglMb2NraW5nOiB0dHlfbXV0ZXggbXVzdCBiZSBoZWxkLiBJZiB0dHkgaXMgZm91bmQsIHRoZSBtdXRleCBtdXN0CisgKgliZSBoZWxkIHVudGlsIHRoZSAnZmFzdC1vcGVuJyBpcyBhbHNvIGRvbmUuIFdpbGwgY2hhbmdlIG9uY2Ugd2UKKyAqCWhhdmUgcmVmY291bnRpbmcgaW4gdGhlIGRyaXZlciBhbmQgcGVyIGRyaXZlciBsb2NraW5nCisgKi8KK3N0cnVjdCB0dHlfc3RydWN0ICp0dHlfZHJpdmVyX2xvb2t1cF90dHkoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKKwkJc3RydWN0IGlub2RlICppbm9kZSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKGRyaXZlci0+b3BzLT5sb29rdXApCisJCXJldHVybiBkcml2ZXItPm9wcy0+bG9va3VwKGRyaXZlciwgaW5vZGUsIGlkeCk7CisKKwl0dHkgPSBkcml2ZXItPnR0eXNbaWR4XTsKKwlyZXR1cm4gdHR5OworfQorCisvKioKKyAqCXR0eV9pbml0X3Rlcm1pb3MJLSAgaGVscGVyIGZvciB0ZXJtaW9zIHNldHVwCisgKglAdHR5OiB0aGUgdHR5IHRvIHNldCB1cAorICoKKyAqCUluaXRpYWxpc2UgdGhlIHRlcm1pb3Mgc3RydWN0dXJlcyBmb3IgdGhpcyB0dHkuIFRodXMgcnVucyB1bmRlcgorICoJdGhlIHR0eV9tdXRleCBjdXJyZW50bHkgc28gd2UgY2FuIGJlIHJlbGF4ZWQgYWJvdXQgb3JkZXJpbmcuCisgKi8KKworaW50IHR0eV9pbml0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRwOworCWludCBpZHggPSB0dHktPmluZGV4OworCisJdHAgPSB0dHktPmRyaXZlci0+dGVybWlvc1tpZHhdOworCWlmICh0cCA9PSBOVUxMKSB7CisJCXRwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zWzJdKSwgR0ZQX0tFUk5FTCk7CisJCWlmICh0cCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweSh0cCwgJnR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3MsCisJCQkJCQlzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CisJCXR0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF0gPSB0cDsKKwl9CisJdHR5LT50ZXJtaW9zID0gdHA7CisJdHR5LT50ZXJtaW9zX2xvY2tlZCA9IHRwICsgMTsKKworCS8qIENvbXBhdGliaWxpdHkgdW50aWwgZHJpdmVycyBhbHdheXMgc2V0IHRoaXMgKi8KKwl0dHktPnRlcm1pb3MtPmNfaXNwZWVkID0gdHR5X3Rlcm1pb3NfaW5wdXRfYmF1ZF9yYXRlKHR0eS0+dGVybWlvcyk7CisJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXR0eV9kcml2ZXJfaW5zdGFsbF90dHkoKSAtIGluc3RhbGwgYSB0dHkgZW50cnkgaW4gdGhlIGRyaXZlcgorICoJQGRyaXZlcjogdGhlIGRyaXZlciBmb3IgdGhlIHR0eQorICoJQHR0eTogdGhlIHR0eQorICoKKyAqCUluc3RhbGwgYSB0dHkgb2JqZWN0IGludG8gdGhlIGRyaXZlciB0YWJsZXMuIFRoZSB0dHktPmluZGV4IGZpZWxkCisgKgl3aWxsIGJlIHNldCBieSB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZC4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKKyAqCWZvciBlbnN1cmluZyBhbnkgbmVlZCBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBhbmQKKyAqCWNvbmZpZ3VyZWQuCisgKgorICoJTG9ja2luZzogdHR5X211dGV4IGZvciBub3cKKyAqLworc3RhdGljIGludCB0dHlfZHJpdmVyX2luc3RhbGxfdHR5KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCisJCQkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBpZHggPSB0dHktPmluZGV4OworCisJaWYgKGRyaXZlci0+b3BzLT5pbnN0YWxsKQorCQlyZXR1cm4gZHJpdmVyLT5vcHMtPmluc3RhbGwoZHJpdmVyLCB0dHkpOworCisJaWYgKHR0eV9pbml0X3Rlcm1pb3ModHR5KSA9PSAwKSB7CisJCXR0eV9kcml2ZXJfa3JlZl9nZXQoZHJpdmVyKTsKKwkJdHR5LT5jb3VudCsrOworCQlkcml2ZXItPnR0eXNbaWR4XSA9IHR0eTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqCXR0eV9kcml2ZXJfcmVtb3ZlX3R0eSgpIC0gcmVtb3ZlIGEgdHR5IGZyb20gdGhlIGRyaXZlciB0YWJsZXMKKyAqCUBkcml2ZXI6IHRoZSBkcml2ZXIgZm9yIHRoZSB0dHkKKyAqCUBpZHg6CSB0aGUgbWlub3IgbnVtYmVyCisgKgorICoJUmVtdm9lIGEgdHR5IG9iamVjdCBmcm9tIHRoZSBkcml2ZXIgdGFibGVzLiBUaGUgdHR5LT5pbmRleCBmaWVsZAorICoJd2lsbCBiZSBzZXQgYnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQuCisgKgorICoJTG9ja2luZzogdHR5X211dGV4IGZvciBub3cKKyAqLworc3RhdGljIHZvaWQgdHR5X2RyaXZlcl9yZW1vdmVfdHR5KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCisJCQkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmIChkcml2ZXItPm9wcy0+cmVtb3ZlKQorCQlkcml2ZXItPm9wcy0+cmVtb3ZlKGRyaXZlciwgdHR5KTsKKwllbHNlCisJCWRyaXZlci0+dHR5c1t0dHktPmluZGV4XSA9IE5VTEw7Cit9CisKKy8qCisgKiAJdHR5X3Jlb3BlbigpCS0gZmFzdCByZS1vcGVuIG9mIGFuIG9wZW4gdHR5CisgKiAJQHR0eQktIHRoZSB0dHkgdG8gb3BlbgorICoKKyAqCVJldHVybiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKglMb2NraW5nOiB0dHlfbXV0ZXggbXVzdCBiZSBoZWxkIGZyb20gdGhlIHRpbWUgdGhlIHR0eSB3YXMgZm91bmQKKyAqCQkgdGlsbCB0aGlzIG9wZW4gY29tcGxldGVzLgorICovCitzdGF0aWMgaW50IHR0eV9yZW9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gdHR5LT5kcml2ZXI7CisKKwlpZiAodGVzdF9iaXQoVFRZX0NMT1NJTkcsICZ0dHktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKKwkgICAgZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikgeworCQkvKgorCQkgKiBzcGVjaWFsIGNhc2UgZm9yIFBUWSBtYXN0ZXJzOiBvbmx5IG9uZSBvcGVuIHBlcm1pdHRlZCwKKwkJICogYW5kIHRoZSBzbGF2ZSBzaWRlIG9wZW4gY291bnQgaXMgaW5jcmVtZW50ZWQgYXMgd2VsbC4KKwkJICovCisJCWlmICh0dHktPmNvdW50KQorCQkJcmV0dXJuIC1FSU87CisKKwkJdHR5LT5saW5rLT5jb3VudCsrOworCX0KKwl0dHktPmNvdW50Kys7CisJdHR5LT5kcml2ZXIgPSBkcml2ZXI7IC8qIE4uQi4gd2h5IGRvIHRoaXMgZXZlcnkgdGltZT8/ICovCisKKwlXQVJOX09OKCF0ZXN0X2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0dHlfaW5pdF9kZXYJCS0JaW5pdGlhbGlzZSBhIHR0eSBkZXZpY2UKICAqCUBkcml2ZXI6IHR0eSBkcml2ZXIgd2UgYXJlIG9wZW5pbmcgYSBkZXZpY2Ugb24KICAqCUBpZHg6IGRldmljZSBpbmRleAotICoJQHR0eTogcmV0dXJuZWQgdHR5IHN0cnVjdHVyZQorICoJQHJldF90dHk6IHJldHVybmVkIHR0eSBzdHJ1Y3R1cmUKKyAqCUBmaXJzdF9vazogb2sgdG8gb3BlbiBhIG5ldyBkZXZpY2UgKHVzZWQgYnkgcHRteCkKICAqCiAgKglQcmVwYXJlIGEgdHR5IGRldmljZS4gVGhpcyBtYXkgbm90IGJlIGEgIm5ldyIgY2xlYW4gZGV2aWNlIGJ1dAogICoJY291bGQgYWxzbyBiZSBhbiBhY3RpdmUgZGV2aWNlLiBUaGUgcHR5IGRyaXZlcnMgcmVxdWlyZSBzcGVjaWFsCkBAIC0xNjIxLDM3ICsxMzY0LDE2IEBACiAgKiByZWxheGVkIGZvciB0aGUgKG1vc3QgY29tbW9uKSBjYXNlIG9mIHJlb3BlbmluZyBhIHR0eS4KICAqLwogCi1zdGF0aWMgaW50IGluaXRfZGV2KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpZHgsCi0Jc3RydWN0IHR0eV9zdHJ1Y3QgKipyZXRfdHR5KQorc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9pbml0X2RldihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaWR4LAorCQkJCQkJCQlpbnQgZmlyc3Rfb2spCiB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgKm9fdHR5OwotCXN0cnVjdCBrdGVybWlvcyAqdHAsICoqdHBfbG9jLCAqb190cCwgKipvX3RwX2xvYzsKLQlzdHJ1Y3Qga3Rlcm1pb3MgKmx0cCwgKipsdHBfbG9jLCAqb19sdHAsICoqb19sdHBfbG9jOwotCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IHJldHZhbDsKIAotCS8qIGNoZWNrIHdoZXRoZXIgd2UncmUgcmVvcGVuaW5nIGFuIGV4aXN0aW5nIHR0eSAqLwotCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSB7Ci0JCXR0eSA9IGRldnB0c19nZXRfdHR5KGlkeCk7Ci0JCS8qCi0JCSAqIElmIHdlIGRvbid0IGhhdmUgYSB0dHkgaGVyZSBvbiBhIHNsYXZlIG9wZW4sIGl0J3MgYmVjYXVzZQotCQkgKiB0aGUgbWFzdGVyIGFscmVhZHkgc3RhcnRlZCB0aGUgY2xvc2UgcHJvY2VzcyBhbmQgdGhlcmUncwotCQkgKiBubyByZWxhdGlvbiBiZXR3ZWVuIGRldnB0cyBmaWxlIGFuZCB0dHkgYW55bW9yZS4KLQkJICovCi0JCWlmICghdHR5ICYmIGRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9TTEFWRSkgewotCQkJcmV0dmFsID0gLUVJTzsKLQkJCWdvdG8gZW5kX2luaXQ7Ci0JCX0KLQkJLyoKLQkJICogSXQncyBzYWZlIGZyb20gbm93IG9uIGJlY2F1c2UgaW5pdF9kZXYoKSBpcyBjYWxsZWQgd2l0aAotCQkgKiB0dHlfbXV0ZXggaGVsZCBhbmQgcmVsZWFzZV9kZXYoKSB3b24ndCBjaGFuZ2UgdHR5LT5jb3VudAotCQkgKiBvciB0dHktPmZsYWdzIHdpdGhvdXQgaGF2aW5nIHRvIGdyYWIgdHR5X211dGV4Ci0JCSAqLwotCQlpZiAodHR5ICYmIGRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCi0JCQl0dHkgPSB0dHktPmxpbms7Ci0JfSBlbHNlIHsKLQkJdHR5ID0gZHJpdmVyLT50dHlzW2lkeF07Ci0JfQotCWlmICh0dHkpIGdvdG8gZmFzdF90cmFjazsKKwkvKiBDaGVjayBpZiBwdHkgbWFzdGVyIGlzIGJlaW5nIG9wZW5lZCBtdWx0aXBsZSB0aW1lcyAqLworCWlmIChkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSICYmCisJCShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSAmJiAhZmlyc3Rfb2spCisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCiAJLyoKIAkgKiBGaXJzdCB0aW1lIG9wZW4gaXMgY29tcGxleCwgZXNwZWNpYWxseSBmb3IgUFRZIGRldmljZXMuCkBAIC0xNjYxLDE4OSArMTM4Myw2OSBAQAogCSAqIGFuZCBsb2NrZWQgdGVybWlvcyBtYXkgYmUgcmV0YWluZWQuKQogCSAqLwogCi0JaWYgKCF0cnlfbW9kdWxlX2dldChkcml2ZXItPm93bmVyKSkgewotCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIGVuZF9pbml0OwotCX0KLQotCW9fdHR5ID0gTlVMTDsKLQl0cCA9IG9fdHAgPSBOVUxMOwotCWx0cCA9IG9fbHRwID0gTlVMTDsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRyaXZlci0+b3duZXIpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAogCXR0eSA9IGFsbG9jX3R0eV9zdHJ1Y3QoKTsKIAlpZiAoIXR0eSkKIAkJZ290byBmYWlsX25vX21lbTsKLQlpbml0aWFsaXplX3R0eV9zdHJ1Y3QodHR5KTsKLQl0dHktPmRyaXZlciA9IGRyaXZlcjsKLQl0dHktPm9wcyA9IGRyaXZlci0+b3BzOwotCXR0eS0+aW5kZXggPSBpZHg7Ci0JdHR5X2xpbmVfbmFtZShkcml2ZXIsIGlkeCwgdHR5LT5uYW1lKTsKKwlpbml0aWFsaXplX3R0eV9zdHJ1Y3QodHR5LCBkcml2ZXIsIGlkeCk7CiAKLQlpZiAoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkgewotCQl0cF9sb2MgPSAmdHR5LT50ZXJtaW9zOwotCQlsdHBfbG9jID0gJnR0eS0+dGVybWlvc19sb2NrZWQ7Ci0JfSBlbHNlIHsKLQkJdHBfbG9jID0gJmRyaXZlci0+dGVybWlvc1tpZHhdOwotCQlsdHBfbG9jID0gJmRyaXZlci0+dGVybWlvc19sb2NrZWRbaWR4XTsKKwlyZXR2YWwgPSB0dHlfZHJpdmVyX2luc3RhbGxfdHR5KGRyaXZlciwgdHR5KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlmcmVlX3R0eV9zdHJ1Y3QodHR5KTsKKwkJbW9kdWxlX3B1dChkcml2ZXItPm93bmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIAl9CiAKLQlpZiAoISp0cF9sb2MpIHsKLQkJdHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0cCkKLQkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCQkqdHAgPSBkcml2ZXItPmluaXRfdGVybWlvczsKLQl9Ci0KLQlpZiAoISpsdHBfbG9jKSB7Ci0JCWx0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWx0cCkKLQkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCX0KLQotCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkgewotCQlvX3R0eSA9IGFsbG9jX3R0eV9zdHJ1Y3QoKTsKLQkJaWYgKCFvX3R0eSkKLQkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCQlpbml0aWFsaXplX3R0eV9zdHJ1Y3Qob190dHkpOwotCQlvX3R0eS0+ZHJpdmVyID0gZHJpdmVyLT5vdGhlcjsKLQkJb190dHktPm9wcyA9IGRyaXZlci0+b3BzOwotCQlvX3R0eS0+aW5kZXggPSBpZHg7Ci0JCXR0eV9saW5lX25hbWUoZHJpdmVyLT5vdGhlciwgaWR4LCBvX3R0eS0+bmFtZSk7Ci0KLQkJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pIHsKLQkJCW9fdHBfbG9jID0gJm9fdHR5LT50ZXJtaW9zOwotCQkJb19sdHBfbG9jID0gJm9fdHR5LT50ZXJtaW9zX2xvY2tlZDsKLQkJfSBlbHNlIHsKLQkJCW9fdHBfbG9jID0gJmRyaXZlci0+b3RoZXItPnRlcm1pb3NbaWR4XTsKLQkJCW9fbHRwX2xvYyA9ICZkcml2ZXItPm90aGVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdOwotCQl9Ci0KLQkJaWYgKCEqb190cF9sb2MpIHsKLQkJCW9fdHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghb190cCkKLQkJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJCSpvX3RwID0gZHJpdmVyLT5vdGhlci0+aW5pdF90ZXJtaW9zOwotCQl9Ci0KLQkJaWYgKCEqb19sdHBfbG9jKSB7Ci0JCQlvX2x0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFvX2x0cCkKLQkJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJfQotCi0JCS8qCi0JCSAqIEV2ZXJ5dGhpbmcgYWxsb2NhdGVkIC4uLiBzZXQgdXAgdGhlIG9fdHR5IHN0cnVjdHVyZS4KLQkJICovCi0JCWlmICghKGRyaXZlci0+b3RoZXItPmZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkKLQkJCWRyaXZlci0+b3RoZXItPnR0eXNbaWR4XSA9IG9fdHR5OwotCQlpZiAoISpvX3RwX2xvYykKLQkJCSpvX3RwX2xvYyA9IG9fdHA7Ci0JCWlmICghKm9fbHRwX2xvYykKLQkJCSpvX2x0cF9sb2MgPSBvX2x0cDsKLQkJb190dHktPnRlcm1pb3MgPSAqb190cF9sb2M7Ci0JCW9fdHR5LT50ZXJtaW9zX2xvY2tlZCA9ICpvX2x0cF9sb2M7Ci0JCWRyaXZlci0+b3RoZXItPnJlZmNvdW50Kys7Ci0JCWlmIChkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQotCQkJb190dHktPmNvdW50Kys7Ci0KLQkJLyogRXN0YWJsaXNoIHRoZSBsaW5rcyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KLQkJdHR5LT5saW5rICAgPSBvX3R0eTsKLQkJb190dHktPmxpbmsgPSB0dHk7Ci0JfQotCi0JLyoKLQkgKiBBbGwgc3RydWN0dXJlcyBoYXZlIGJlZW4gYWxsb2NhdGVkLCBzbyBub3cgd2UgaW5zdGFsbCB0aGVtLgotCSAqIEZhaWx1cmVzIGFmdGVyIHRoaXMgcG9pbnQgdXNlIHJlbGVhc2VfdHR5IHRvIGNsZWFuIHVwLCBzbwotCSAqIHRoZXJlJ3Mgbm8gbmVlZCB0byBudWxsIG91dCB0aGUgbG9jYWwgcG9pbnRlcnMuCi0JICovCi0JaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkpCi0JCWRyaXZlci0+dHR5c1tpZHhdID0gdHR5OwotCi0JaWYgKCEqdHBfbG9jKQotCQkqdHBfbG9jID0gdHA7Ci0JaWYgKCEqbHRwX2xvYykKLQkJKmx0cF9sb2MgPSBsdHA7Ci0JdHR5LT50ZXJtaW9zID0gKnRwX2xvYzsKLQl0dHktPnRlcm1pb3NfbG9ja2VkID0gKmx0cF9sb2M7Ci0JLyogQ29tcGF0aWJpbGl0eSB1bnRpbCBkcml2ZXJzIGFsd2F5cyBzZXQgdGhpcyAqLwotCXR0eS0+dGVybWlvcy0+Y19pc3BlZWQgPSB0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKLQl0dHktPnRlcm1pb3MtPmNfb3NwZWVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHR0eS0+dGVybWlvcyk7Ci0JZHJpdmVyLT5yZWZjb3VudCsrOwotCXR0eS0+Y291bnQrKzsKLQogCS8qCiAJICogU3RydWN0dXJlcyBhbGwgaW5zdGFsbGVkIC4uLiBjYWxsIHRoZSBsZGlzYyBvcGVuIHJvdXRpbmVzLgogCSAqIElmIHdlIGZhaWwgaGVyZSBqdXN0IGNhbGwgcmVsZWFzZV90dHkgdG8gY2xlYW4gdXAuICBObyBuZWVkCiAJICogdG8gZGVjcmVtZW50IHRoZSB1c2UgY291bnRzLCBhcyByZWxlYXNlX3R0eSBkb2Vzbid0IGNhcmUuCiAJICovCiAKLQlyZXR2YWwgPSB0dHlfbGRpc2Nfc2V0dXAodHR5LCBvX3R0eSk7Ci0KKwlyZXR2YWwgPSB0dHlfbGRpc2Nfc2V0dXAodHR5LCB0dHktPmxpbmspOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gcmVsZWFzZV9tZW1fb3V0OwotCSBnb3RvIHN1Y2Nlc3M7Ci0KLQkvKgotCSAqIFRoaXMgZmFzdCBvcGVuIGNhbiBiZSB1c2VkIGlmIHRoZSB0dHkgaXMgYWxyZWFkeSBvcGVuLgotCSAqIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIGFuZCB0aGUgb25seSBmYWlsdXJlcyBhcmUgZnJvbQotCSAqIGF0dGVtcHRpbmcgdG8gb3BlbiBhIGNsb3NpbmcgdHR5IG9yIGF0dGVtcHRpbmcgbXVsdGlwbGUKLQkgKiBvcGVucyBvbiBhIHB0eSBtYXN0ZXIuCi0JICovCi1mYXN0X3RyYWNrOgotCWlmICh0ZXN0X2JpdChUVFlfQ0xPU0lORywgJnR0eS0+ZmxhZ3MpKSB7Ci0JCXJldHZhbCA9IC1FSU87Ci0JCWdvdG8gZW5kX2luaXQ7Ci0JfQotCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgotCSAgICBkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKSB7Ci0JCS8qCi0JCSAqIHNwZWNpYWwgY2FzZSBmb3IgUFRZIG1hc3RlcnM6IG9ubHkgb25lIG9wZW4gcGVybWl0dGVkLAotCQkgKiBhbmQgdGhlIHNsYXZlIHNpZGUgb3BlbiBjb3VudCBpcyBpbmNyZW1lbnRlZCBhcyB3ZWxsLgotCQkgKi8KLQkJaWYgKHR0eS0+Y291bnQpIHsKLQkJCXJldHZhbCA9IC1FSU87Ci0JCQlnb3RvIGVuZF9pbml0OwotCQl9Ci0JCXR0eS0+bGluay0+Y291bnQrKzsKLQl9Ci0JdHR5LT5jb3VudCsrOwotCXR0eS0+ZHJpdmVyID0gZHJpdmVyOyAvKiBOLkIuIHdoeSBkbyB0aGlzIGV2ZXJ5IHRpbWU/PyAqLwotCi0JLyogRklYTUUgKi8KLQlpZiAoIXRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKQotCQlwcmludGsoS0VSTl9FUlIgImluaXRfZGV2IGJ1dCBubyBsZGlzY1xuIik7Ci1zdWNjZXNzOgotCSpyZXRfdHR5ID0gdHR5OwotCi0JLyogQWxsIHBhdGhzIGNvbWUgdGhyb3VnaCBoZXJlIHRvIHJlbGVhc2UgdGhlIG11dGV4ICovCi1lbmRfaW5pdDoKLQlyZXR1cm4gcmV0dmFsOwotCi0JLyogUmVsZWFzZSBsb2NhbGx5IGFsbG9jYXRlZCBtZW1vcnkgLi4uIG5vdGhpbmcgcGxhY2VkIGluIHNsb3RzICovCi1mcmVlX21lbV9vdXQ6Ci0Ja2ZyZWUob190cCk7Ci0JaWYgKG9fdHR5KQotCQlmcmVlX3R0eV9zdHJ1Y3Qob190dHkpOwotCWtmcmVlKGx0cCk7Ci0Ja2ZyZWUodHApOwotCWZyZWVfdHR5X3N0cnVjdCh0dHkpOworCXJldHVybiB0dHk7CiAKIGZhaWxfbm9fbWVtOgogCW1vZHVsZV9wdXQoZHJpdmVyLT5vd25lcik7Ci0JcmV0dmFsID0gLUVOT01FTTsKLQlnb3RvIGVuZF9pbml0OworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJLyogY2FsbCB0aGUgdHR5IHJlbGVhc2VfdHR5IHJvdXRpbmUgdG8gY2xlYW4gb3V0IHRoaXMgc2xvdCAqLwogcmVsZWFzZV9tZW1fb3V0OgogCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0lORk8gImluaXRfZGV2OiBsZGlzYyBvcGVuIGZhaWxlZCwgIgorCQlwcmludGsoS0VSTl9JTkZPICJ0dHlfaW5pdF9kZXY6IGxkaXNjIG9wZW4gZmFpbGVkLCAiCiAJCQkJICJjbGVhcmluZyBzbG90ICVkXG4iLCBpZHgpOwogCXJlbGVhc2VfdHR5KHR0eSwgaWR4KTsKLQlnb3RvIGVuZF9pbml0OworCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CiB9CiAKK3ZvaWQgdHR5X2ZyZWVfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBrdGVybWlvcyAqdHA7CisJaW50IGlkeCA9IHR0eS0+aW5kZXg7CisJLyogS2lsbCB0aGlzIGZsYWcgYW5kIHB1c2ggaW50byBkcml2ZXJzIGZvciBsb2NraW5nIGV0YyAqLworCWlmICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MpIHsKKwkJLyogRklYTUU6IExvY2tpbmcgb24gLT50ZXJtaW9zIGFycmF5ICovCisJCXRwID0gdHR5LT50ZXJtaW9zOworCQl0dHktPmRyaXZlci0+dGVybWlvc1tpZHhdID0gTlVMTDsKKwkJa2ZyZWUodHApOworCX0KK30KK0VYUE9SVF9TWU1CT0wodHR5X2ZyZWVfdGVybWlvcyk7CisKK3ZvaWQgdHR5X3NodXRkb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJdHR5X2RyaXZlcl9yZW1vdmVfdHR5KHR0eS0+ZHJpdmVyLCB0dHkpOworCXR0eV9mcmVlX3Rlcm1pb3ModHR5KTsKK30KK0VYUE9SVF9TWU1CT0wodHR5X3NodXRkb3duKTsKKwogLyoqCiAgKglyZWxlYXNlX29uZV90dHkJCS0JcmVsZWFzZSB0dHkgc3RydWN0dXJlIG1lbW9yeQorICoJQGtyZWY6IGtyZWYgb2YgdHR5IHdlIGFyZSBvYmxpdGVyYXRpbmcKICAqCiAgKglSZWxlYXNlcyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgdHR5IHN0cnVjdHVyZSwgYW5kIGNsZWFycyBvdXQgdGhlCiAgKglkcml2ZXIgdGFibGUgc2xvdHMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgbm8gbG9uZ2VyCkBAIC0xODUzLDMxICsxNDU1LDE5IEBACiAgKgkJdHR5X211dGV4IC0gc29tZXRpbWVzIG9ubHkKICAqCQl0YWtlcyB0aGUgZmlsZSBsaXN0IGxvY2sgaW50ZXJuYWxseSB3aGVuIHdvcmtpbmcgb24gdGhlIGxpc3QKICAqCW9mIHR0eXMgdGhhdCB0aGUgZHJpdmVyIGtlZXBzLgotICoJCUZJWE1FOiBzaG91bGQgd2UgcmVxdWlyZSB0dHlfbXV0ZXggaXMgaGVsZCBoZXJlID8/CiAgKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2Vfb25lX3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KQorc3RhdGljIHZvaWQgcmVsZWFzZV9vbmVfdHR5KHN0cnVjdCBrcmVmICprcmVmKQogewotCWludCBkZXZwdHMgPSB0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU07Ci0Jc3RydWN0IGt0ZXJtaW9zICp0cDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB0dHlfc3RydWN0LCBrcmVmKTsKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gdHR5LT5kcml2ZXI7CiAKLQlpZiAoIWRldnB0cykKLQkJdHR5LT5kcml2ZXItPnR0eXNbaWR4XSA9IE5VTEw7Ci0KLQlpZiAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TKSB7Ci0JCXRwID0gdHR5LT50ZXJtaW9zOwotCQlpZiAoIWRldnB0cykKLQkJCXR0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF0gPSBOVUxMOwotCQlrZnJlZSh0cCk7Ci0KLQkJdHAgPSB0dHktPnRlcm1pb3NfbG9ja2VkOwotCQlpZiAoIWRldnB0cykKLQkJCXR0eS0+ZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdID0gTlVMTDsKLQkJa2ZyZWUodHApOwotCX0KLQotCisJaWYgKHR0eS0+b3BzLT5zaHV0ZG93bikKKwkJdHR5LT5vcHMtPnNodXRkb3duKHR0eSk7CisJZWxzZQorCQl0dHlfc2h1dGRvd24odHR5KTsKIAl0dHktPm1hZ2ljID0gMDsKLQl0dHktPmRyaXZlci0+cmVmY291bnQtLTsKKwl0dHlfZHJpdmVyX2tyZWZfcHV0KGRyaXZlcik7CisJbW9kdWxlX3B1dChkcml2ZXItPm93bmVyKTsKIAogCWZpbGVfbGlzdF9sb2NrKCk7CiAJbGlzdF9kZWxfaW5pdCgmdHR5LT50dHlfZmlsZXMpOwpAQCAtMTg4Nyw2ICsxNDc3LDIxIEBACiB9CiAKIC8qKgorICoJdHR5X2tyZWZfcHV0CQktCXJlbGVhc2UgYSB0dHkga3JlZgorICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYSB0dHkgZGV2aWNlIGFuZCBpZiBuZWVkIGJlIGxldCB0aGUga3JlZgorICoJbGF5ZXIgZGVzdHJ1Y3QgdGhlIG9iamVjdCBmb3IgdXMKKyAqLworCit2b2lkIHR0eV9rcmVmX3B1dChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHkpCisJCWtyZWZfcHV0KCZ0dHktPmtyZWYsIHJlbGVhc2Vfb25lX3R0eSk7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9rcmVmX3B1dCk7CisKKy8qKgogICoJcmVsZWFzZV90dHkJCS0JcmVsZWFzZSB0dHkgc3RydWN0dXJlIG1lbW9yeQogICoKICAqCVJlbGVhc2UgYm90aCBAdHR5IGFuZCBhIHBvc3NpYmxlIGxpbmtlZCBwYXJ0bmVyICh0aGluayBwdHkgcGFpciksCkBAIC0xODk3LDE1ICsxNTAyLDE2IEBACiAgKgkJdGFrZXMgdGhlIGZpbGUgbGlzdCBsb2NrIGludGVybmFsbHkgd2hlbiB3b3JraW5nIG9uIHRoZSBsaXN0CiAgKglvZiB0dHlzIHRoYXQgdGhlIGRyaXZlciBrZWVwcy4KICAqCQlGSVhNRTogc2hvdWxkIHdlIHJlcXVpcmUgdHR5X211dGV4IGlzIGhlbGQgaGVyZSA/PworICoKICAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCkKIHsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gdHR5LT5kcml2ZXI7CisJLyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUgYnV0IGNoZWNrIGZvciB0aGUgbW9tZW50ICovCisJV0FSTl9PTih0dHktPmluZGV4ICE9IGlkeCk7CiAKIAlpZiAodHR5LT5saW5rKQotCQlyZWxlYXNlX29uZV90dHkodHR5LT5saW5rLCBpZHgpOwotCXJlbGVhc2Vfb25lX3R0eSh0dHksIGlkeCk7Ci0JbW9kdWxlX3B1dChkcml2ZXItPm93bmVyKTsKKwkJdHR5X2tyZWZfcHV0KHR0eS0+bGluayk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIC8qCkBAIC0xOTE2LDIwICsxNTIyLDIxIEBACiAgKiBXU0ggMDkvMDkvOTc6IHJld3JpdHRlbiB0byBhdm9pZCBzb21lIG5hc3R5IHJhY2UgY29uZGl0aW9ucyB0aGF0IGNvdWxkCiAgKiBsZWFkIHRvIGRvdWJsZSBmcmVlcyBvciByZWxlYXNpbmcgbWVtb3J5IHN0aWxsIGluIHVzZS4KICAqLwotc3RhdGljIHZvaWQgcmVsZWFzZV9kZXYoc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIHR0eV9yZWxlYXNlX2RldihzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAqb190dHk7CiAJaW50CXB0eV9tYXN0ZXIsIHR0eV9jbG9zaW5nLCBvX3R0eV9jbG9zaW5nLCBkb19zbGVlcDsKIAlpbnQJZGV2cHRzOwogCWludAlpZHg7CiAJY2hhcglidWZbNjRdOworCXN0cnVjdCAJaW5vZGUgKmlub2RlOwogCisJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKLQlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJCQkicmVsZWFzZV9kZXYiKSkKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfcmVsZWFzZV9kZXYiKSkKIAkJcmV0dXJuOwogCi0JY2hlY2tfdHR5X2NvdW50KHR0eSwgInJlbGVhc2VfZGV2Iik7CisJY2hlY2tfdHR5X2NvdW50KHR0eSwgInR0eV9yZWxlYXNlX2RldiIpOwogCiAJdHR5X2Zhc3luYygtMSwgZmlscCwgMCk7CiAKQEAgLTE5NDEsMzMgKzE1NDgsMjcgQEAKIAogI2lmZGVmIFRUWV9QQVJBTk9JQV9DSEVDSwogCWlmIChpZHggPCAwIHx8IGlkeCA+PSB0dHktPmRyaXZlci0+bnVtKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2RldjogYmFkIGlkeCB3aGVuIHRyeWluZyB0byAiCisJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IGJhZCBpZHggd2hlbiB0cnlpbmcgdG8gIgogCQkJCSAgImZyZWUgKCVzKVxuIiwgdHR5LT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoISh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJaWYgKCFkZXZwdHMpIHsKIAkJaWYgKHR0eSAhPSB0dHktPmRyaXZlci0+dHR5c1tpZHhdKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGRyaXZlci50YWJsZVslZF0gbm90IHR0eSAiCisJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBkcml2ZXIudGFibGVbJWRdIG5vdCB0dHkgIgogCQkJICAgICAgICJmb3IgKCVzKVxuIiwgaWR4LCB0dHktPm5hbWUpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmICh0dHktPnRlcm1pb3MgIT0gdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBkcml2ZXIudGVybWlvc1slZF0gbm90IHRlcm1pb3MgIgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInR0eV9yZWxlYXNlX2RldjogZHJpdmVyLnRlcm1pb3NbJWRdIG5vdCB0ZXJtaW9zICIKIAkJCSAgICAgICAiZm9yICglcylcbiIsCiAJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmICh0dHktPnRlcm1pb3NfbG9ja2VkICE9IHR0eS0+ZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpZHhdKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGRyaXZlci50ZXJtaW9zX2xvY2tlZFslZF0gbm90ICIKLQkJCSAgICAgICAidGVybWlvc19sb2NrZWQgZm9yICglcylcbiIsCi0JCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOwotCQkJcmV0dXJuOwotCQl9CiAJfQogI2VuZGlmCiAKICNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCi0JcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2IG9mICVzICh0dHkgY291bnQ9JWQpLi4uIiwKKwlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2IG9mICVzICh0dHkgY291bnQ9JWQpLi4uIiwKIAkgICAgICAgdHR5X25hbWUodHR5LCBidWYpLCB0dHktPmNvdW50KTsKICNlbmRpZgogCkBAIC0xOTc1LDI2ICsxNTc2LDE5IEBACiAJaWYgKHR0eS0+ZHJpdmVyLT5vdGhlciAmJgogCSAgICAgISh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CiAJCWlmIChvX3R0eSAhPSB0dHktPmRyaXZlci0+b3RoZXItPnR0eXNbaWR4XSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBvdGhlci0+dGFibGVbJWRdICIKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IG90aGVyLT50YWJsZVslZF0gIgogCQkJCQkgICJub3Qgb190dHkgZm9yICglcylcbiIsCiAJCQkgICAgICAgaWR4LCB0dHktPm5hbWUpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChvX3R0eS0+dGVybWlvcyAhPSB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NbaWR4XSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInJlbGVhc2VfZGV2OiBvdGhlci0+dGVybWlvc1slZF0gIgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInR0eV9yZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NbJWRdICIKIAkJCQkJICAibm90IG9fdGVybWlvcyBmb3IgKCVzKVxuIiwKIAkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKG9fdHR5LT50ZXJtaW9zX2xvY2tlZCAhPQotCQkgICAgICB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0pIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NfbG9ja2VkWyIKLQkJCQkJICAiJWRdIG5vdCBvX3Rlcm1pb3NfbG9ja2VkIGZvciAoJXMpXG4iLAotCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKLQkJCXJldHVybjsKLQkJfQogCQlpZiAob190dHktPmxpbmsgIT0gdHR5KSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZV9kZXY6IGJhZCBwdHkgcG9pbnRlcnNcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInR0eV9yZWxlYXNlX2RldjogYmFkIHB0eSBwb2ludGVyc1xuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0yMDUyLDcgKzE2NDYsNyBAQAogCQlpZiAoIWRvX3NsZWVwKQogCQkJYnJlYWs7CiAKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVsZWFzZV9kZXY6ICVzOiByZWFkL3dyaXRlIHdhaXQgcXVldWUgIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0dHlfcmVsZWFzZV9kZXY6ICVzOiByZWFkL3dyaXRlIHdhaXQgcXVldWUgIgogCQkJCSAgICAiYWN0aXZlIVxuIiwgdHR5X25hbWUodHR5LCBidWYpKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwpAQCAtMjA2NSwxNCArMTY1OSwxNCBAQAogCSAqLwogCWlmIChwdHlfbWFzdGVyKSB7CiAJCWlmICgtLW9fdHR5LT5jb3VudCA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGVhc2VfZGV2OiBiYWQgcHR5IHNsYXZlIGNvdW50ICIKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInR0eV9yZWxlYXNlX2RldjogYmFkIHB0eSBzbGF2ZSBjb3VudCAiCiAJCQkJCSAgICAiKCVkKSBmb3IgJXNcbiIsCiAJCQkgICAgICAgb190dHktPmNvdW50LCB0dHlfbmFtZShvX3R0eSwgYnVmKSk7CiAJCQlvX3R0eS0+Y291bnQgPSAwOwogCQl9CiAJfQogCWlmICgtLXR0eS0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGVhc2VfZGV2OiBiYWQgdHR5LT5jb3VudCAoJWQpIGZvciAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHR5X3JlbGVhc2VfZGV2OiBiYWQgdHR5LT5jb3VudCAoJWQpIGZvciAlc1xuIiwKIAkJICAgICAgIHR0eS0+Y291bnQsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CiAJCXR0eS0+Y291bnQgPSAwOwogCX0KQEAgLTIxMzUsMTEgKzE3MjksMTEgQEAKIAogCS8qIE1ha2UgdGhpcyBwdHkgbnVtYmVyIGF2YWlsYWJsZSBmb3IgcmVhbGxvY2F0aW9uICovCiAJaWYgKGRldnB0cykKLQkJZGV2cHRzX2tpbGxfaW5kZXgoaWR4KTsKKwkJZGV2cHRzX2tpbGxfaW5kZXgoaW5vZGUsIGlkeCk7CiB9CiAKIC8qKgotICoJdHR5X29wZW4JCS0Jb3BlbiBhIHR0eSBkZXZpY2UKKyAqCV9fdHR5X29wZW4JCS0Jb3BlbiBhIHR0eSBkZXZpY2UKICAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlIGZpbGUKICAqCUBmaWxwOiBmaWxlIHBvaW50ZXIgdG8gdHR5CiAgKgpAQCAtMjE1NCwxNCArMTc0OCwxNCBAQAogICoJVGhlIHRlcm1pb3Mgc3RhdGUgb2YgYSBwdHkgaXMgcmVzZXQgb24gZmlyc3Qgb3BlbiBzbyB0aGF0CiAgKglzZXR0aW5ncyBkb24ndCBwZXJzaXN0IGFjcm9zcyByZXVzZS4KICAqCi0gKglMb2NraW5nOiB0dHlfbXV0ZXggcHJvdGVjdHMgdHR5LCBnZXRfdHR5X2RyaXZlciBhbmQgaW5pdF9kZXYgd29yay4KKyAqCUxvY2tpbmc6IHR0eV9tdXRleCBwcm90ZWN0cyB0dHksIGdldF90dHlfZHJpdmVyIGFuZCB0dHlfaW5pdF9kZXYgd29yay4KICAqCQkgdHR5LT5jb3VudCBzaG91bGQgcHJvdGVjdCB0aGUgcmVzdC4KICAqCQkgLT5zaWdsb2NrIHByb3RlY3RzIC0+c2lnbmFsLy0+c2lnaGFuZAogICovCiAKIHN0YXRpYyBpbnQgX190dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBOVUxMOwogCWludCBub2N0dHksIHJldHZhbDsKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyOwogCWludCBpbmRleDsKQEAgLTIxODMsMjMgKzE3NzcsMjUgQEAKIAkJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KLQkJZHJpdmVyID0gdHR5LT5kcml2ZXI7CisJCWRyaXZlciA9IHR0eV9kcml2ZXJfa3JlZl9nZXQodHR5LT5kcml2ZXIpOwogCQlpbmRleCA9IHR0eS0+aW5kZXg7CiAJCWZpbHAtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsgLyogRG9uJ3QgbGV0IC9kZXYvdHR5IGJsb2NrICovCiAJCS8qIG5vY3R0eSA9IDE7ICovCisJCS8qIEZJWE1FOiBTaG91bGQgd2UgdGFrZSBhIGRyaXZlciByZWZlcmVuY2UgPyAqLworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAkJZ290byBnb3RfZHJpdmVyOwogCX0KICNpZmRlZiBDT05GSUdfVlQKIAlpZiAoZGV2aWNlID09IE1LREVWKFRUWV9NQUpPUiwgMCkpIHsKIAkJZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICpjb25zb2xlX2RyaXZlcjsKLQkJZHJpdmVyID0gY29uc29sZV9kcml2ZXI7CisJCWRyaXZlciA9IHR0eV9kcml2ZXJfa3JlZl9nZXQoY29uc29sZV9kcml2ZXIpOwogCQlpbmRleCA9IGZnX2NvbnNvbGU7CiAJCW5vY3R0eSA9IDE7CiAJCWdvdG8gZ290X2RyaXZlcjsKIAl9CiAjZW5kaWYKIAlpZiAoZGV2aWNlID09IE1LREVWKFRUWUFVWF9NQUpPUiwgMSkpIHsKLQkJZHJpdmVyID0gY29uc29sZV9kZXZpY2UoJmluZGV4KTsKKwkJZHJpdmVyID0gdHR5X2RyaXZlcl9rcmVmX2dldChjb25zb2xlX2RldmljZSgmaW5kZXgpKTsKIAkJaWYgKGRyaXZlcikgewogCQkJLyogRG9uJ3QgbGV0IC9kZXYvY29uc29sZSBibG9jayAqLwogCQkJZmlscC0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwpAQCAtMjIxNiwxMCArMTgxMiwyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiBnb3RfZHJpdmVyOgotCXJldHZhbCA9IGluaXRfZGV2KGRyaXZlciwgaW5kZXgsICZ0dHkpOworCWlmICghdHR5KSB7CisJCS8qIGNoZWNrIHdoZXRoZXIgd2UncmUgcmVvcGVuaW5nIGFuIGV4aXN0aW5nIHR0eSAqLworCQl0dHkgPSB0dHlfZHJpdmVyX2xvb2t1cF90dHkoZHJpdmVyLCBpbm9kZSwgaW5kZXgpOworCisJCWlmIChJU19FUlIodHR5KSkKKwkJCXJldHVybiBQVFJfRVJSKHR0eSk7CisJfQorCisJaWYgKHR0eSkgeworCQlyZXR2YWwgPSB0dHlfcmVvcGVuKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQl0dHkgPSBFUlJfUFRSKHJldHZhbCk7CisJfSBlbHNlCisJCXR0eSA9IHR0eV9pbml0X2Rldihkcml2ZXIsIGluZGV4LCAwKTsKKwogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCXR0eV9kcml2ZXJfa3JlZl9wdXQoZHJpdmVyKTsKKwlpZiAoSVNfRVJSKHR0eSkpCisJCXJldHVybiBQVFJfRVJSKHR0eSk7CiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7CiAJZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7CkBAIC0yMjQ3LDcgKzE4NTgsNyBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiZXJyb3IgJWQgaW4gb3BlbmluZyAlcy4uLiIsIHJldHZhbCwKIAkJICAgICAgIHR0eS0+bmFtZSk7CiAjZW5kaWYKLQkJcmVsZWFzZV9kZXYoZmlscCk7CisJCXR0eV9yZWxlYXNlX2RldihmaWxwKTsKIAkJaWYgKHJldHZhbCAhPSAtRVJFU1RBUlRTWVMpCiAJCQlyZXR1cm4gcmV0dmFsOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC0yMjg2LDY5ICsxODk3LDYgQEAKIAogCiAKLSNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKLS8qKgotICoJcHRteF9vcGVuCQktCW9wZW4gYSB1bml4IDk4IHB0eSBtYXN0ZXIKLSAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlIGZpbGUKLSAqCUBmaWxwOiBmaWxlIHBvaW50ZXIgdG8gdHR5Ci0gKgotICoJQWxsb2NhdGUgYSB1bml4OTggcHR5IG1hc3RlciBkZXZpY2UgZnJvbSB0aGUgcHRteCBkcml2ZXIuCi0gKgotICoJTG9ja2luZzogdHR5X211dGV4IHByb3RlY3RzIHRoZWluaXRfZGV2IHdvcmsuIHR0eS0+Y291bnQgc2hvdWxkCi0gKiAJCXByb3RlY3QgdGhlIHJlc3QuCi0gKgkJYWxsb2NhdGVkX3B0eXNfbG9jayBoYW5kbGVzIHRoZSBsaXN0IG9mIGZyZWUgcHR5IG51bWJlcnMKLSAqLwotCi1zdGF0aWMgaW50IF9fcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JaW50IHJldHZhbDsKLQlpbnQgaW5kZXg7Ci0KLQlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQotCS8qIGZpbmQgYSBkZXZpY2UgdGhhdCBpcyBub3QgaW4gdXNlLiAqLwotCWluZGV4ID0gZGV2cHRzX25ld19pbmRleCgpOwotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiBpbmRleDsKLQotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JcmV0dmFsID0gaW5pdF9kZXYocHRtX2RyaXZlciwgaW5kZXgsICZ0dHkpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQotCWlmIChyZXR2YWwpCi0JCWdvdG8gb3V0OwotCi0Jc2V0X2JpdChUVFlfUFRZX0xPQ0ssICZ0dHktPmZsYWdzKTsgLyogTE9DSyBUSEUgU0xBVkUgKi8KLQlmaWxwLT5wcml2YXRlX2RhdGEgPSB0dHk7Ci0JZmlsZV9tb3ZlKGZpbHAsICZ0dHktPnR0eV9maWxlcyk7Ci0KLQlyZXR2YWwgPSBkZXZwdHNfcHR5X25ldyh0dHktPmxpbmspOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gb3V0MTsKLQotCWNoZWNrX3R0eV9jb3VudCh0dHksICJwdG14X29wZW4iKTsKLQlyZXR2YWwgPSBwdG1fZHJpdmVyLT5vcHMtPm9wZW4odHR5LCBmaWxwKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dXJuIDA7Ci1vdXQxOgotCXJlbGVhc2VfZGV2KGZpbHApOwotCXJldHVybiByZXR2YWw7Ci1vdXQ6Ci0JZGV2cHRzX2tpbGxfaW5kZXgoaW5kZXgpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCWludCByZXQ7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IF9fcHRteF9vcGVuKGlub2RlLCBmaWxwKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZgogCiAvKioKICAqCXR0eV9yZWxlYXNlCQktCXZmcyBjYWxsYmFjayBmb3IgY2xvc2UKQEAgLTIzNTksMTMgKzE5MDcsMTMgQEAKICAqCXRoaXMgdHR5LiBUaGVyZSBtYXkgaG93ZXZlciBiZSBzZXZlcmFsIHN1Y2ggcmVmZXJlbmNlcy4KICAqCiAgKglMb2NraW5nOgotICoJCVRha2VzIGJrbC4gU2VlIHJlbGVhc2VfZGV2CisgKgkJVGFrZXMgYmtsLiBTZWUgdHR5X3JlbGVhc2VfZGV2CiAgKi8KIAogc3RhdGljIGludCB0dHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlsb2NrX2tlcm5lbCgpOwotCXJlbGVhc2VfZGV2KGZpbHApOworCXR0eV9yZWxlYXNlX2RldihmaWxwKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTE0LDcgKzIwNjIsNyBAQAogCiAJLyogRm9yIGEgUFRZIHdlIG5lZWQgdG8gbG9jayB0aGUgdHR5IHNpZGUgKi8KIAltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JaWYgKCFtZW1jbXAod3MsICZ0dHktPndpbnNpemUsIHNpemVvZigqd3MpKSkKKwlpZiAoIW1lbWNtcCh3cywgJnJlYWxfdHR5LT53aW5zaXplLCBzaXplb2YoKndzKSkpCiAJCWdvdG8gZG9uZTsKIAkvKiBHZXQgdGhlIFBJRCB2YWx1ZXMgYW5kIHJlZmVyZW5jZSB0aGVtIHNvIHdlIGNhbgogCSAgIGF2b2lkIGhvbGRpbmcgdGhlIHR0eSBjdHJsIGxvY2sgd2hpbGUgc2VuZGluZyBzaWduYWxzICovCkBAIC0yOTg2LDcgKzI1MzQsNyBAQAogCWNhc2UgVElPQ1NUSToKIAkJcmV0dXJuIHRpb2NzdGkodHR5LCBwKTsKIAljYXNlIFRJT0NHV0lOU1o6Ci0JCXJldHVybiB0aW9jZ3dpbnN6KHR0eSwgcCk7CisJCXJldHVybiB0aW9jZ3dpbnN6KHJlYWxfdHR5LCBwKTsKIAljYXNlIFRJT0NTV0lOU1o6CiAJCXJldHVybiB0aW9jc3dpbnN6KHR0eSwgcmVhbF90dHksIHApOwogCWNhc2UgVElPQ0NPTlM6CkBAIC0zMDE2LDEwICsyNTY0LDYgQEAKIAkJcmV0dXJuIHB1dF91c2VyKHR0eS0+bGRpc2Mub3BzLT5udW0sIChpbnQgX191c2VyICopcCk7CiAJY2FzZSBUSU9DU0VURDoKIAkJcmV0dXJuIHRpb2NzZXRkKHR0eSwgcCk7Ci0jaWZkZWYgQ09ORklHX1ZUCi0JY2FzZSBUSU9DTElOVVg6Ci0JCXJldHVybiB0aW9jbGludXgodHR5LCBhcmcpOwotI2VuZGlmCiAJLyoKIAkgKiBCcmVhayBoYW5kbGluZwogCSAqLwpAQCAtMzIxMCwxMTMgKzI3NTQsNiBAQAogRVhQT1JUX1NZTUJPTChkb19TQUspOwogCiAvKioKLSAqCWZsdXNoX3RvX2xkaXNjCi0gKglAd29yazogdHR5IHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB3b3JrIHF1ZXVlLgotICoKLSAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgb3V0IG9mIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZmx1c2ggZGF0YQotICoJZnJvbSB0aGUgYnVmZmVyIGNoYWluIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCi0gKgotICoJTG9ja2luZzogaG9sZHMgdHR5LT5idWYubG9jayB0byBndWFyZCBidWZmZXIgbGlzdC4gRHJvcHMgdGhlIGxvY2sKLSAqCXdoaWxlIGludm9raW5nIHRoZSBsaW5lIGRpc2NpcGxpbmUgcmVjZWl2ZV9idWYgbWV0aG9kLiBUaGUKLSAqCXJlY2VpdmVfYnVmIG1ldGhvZCBpcyBzaW5nbGUgdGhyZWFkZWQgZm9yIGVhY2ggdHR5IGluc3RhbmNlLgotICovCi0KLXN0YXRpYyB2b2lkIGZsdXNoX3RvX2xkaXNjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dHlfc3RydWN0LCBidWYud29yay53b3JrKTsKLQl1bnNpZ25lZCBsb25nIAlmbGFnczsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpkaXNjOwotCXN0cnVjdCB0dHlfYnVmZmVyICp0YnVmLCAqaGVhZDsKLQljaGFyICpjaGFyX2J1ZjsKLQl1bnNpZ25lZCBjaGFyICpmbGFnX2J1ZjsKLQotCWRpc2MgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JaWYgKGRpc2MgPT0gTlVMTCkJLyogICFUVFlfTERJU0MgKi8KLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKLQkvKiBTbyB3ZSBrbm93IGEgZmx1c2ggaXMgcnVubmluZyAqLwotCXNldF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncyk7Ci0JaGVhZCA9IHR0eS0+YnVmLmhlYWQ7Ci0JaWYgKGhlYWQgIT0gTlVMTCkgewotCQl0dHktPmJ1Zi5oZWFkID0gTlVMTDsKLQkJZm9yICg7OykgewotCQkJaW50IGNvdW50ID0gaGVhZC0+Y29tbWl0IC0gaGVhZC0+cmVhZDsKLQkJCWlmICghY291bnQpIHsKLQkJCQlpZiAoaGVhZC0+bmV4dCA9PSBOVUxMKQotCQkJCQlicmVhazsKLQkJCQl0YnVmID0gaGVhZDsKLQkJCQloZWFkID0gaGVhZC0+bmV4dDsKLQkJCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCB0YnVmKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qIExkaXNjIG9yIHVzZXIgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoZSBidWZmZXJzCi0JCQkgICB3ZSBhcmUgZmVlZGluZyB0byB0aGUgbGRpc2MsIHN0b3AgZmVlZGluZyB0aGUKLQkJCSAgIGxpbmUgZGlzY2lwbGluZSBhcyB3ZSB3YW50IHRvIGVtcHR5IHRoZSBxdWV1ZSAqLwotCQkJaWYgKHRlc3RfYml0KFRUWV9GTFVTSFBFTkRJTkcsICZ0dHktPmZsYWdzKSkKLQkJCQlicmVhazsKLQkJCWlmICghdHR5LT5yZWNlaXZlX3Jvb20pIHsKLQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmssIDEpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvdW50ID4gdHR5LT5yZWNlaXZlX3Jvb20pCi0JCQkJY291bnQgPSB0dHktPnJlY2VpdmVfcm9vbTsKLQkJCWNoYXJfYnVmID0gaGVhZC0+Y2hhcl9idWZfcHRyICsgaGVhZC0+cmVhZDsKLQkJCWZsYWdfYnVmID0gaGVhZC0+ZmxhZ19idWZfcHRyICsgaGVhZC0+cmVhZDsKLQkJCWhlYWQtPnJlYWQgKz0gY291bnQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7Ci0JCQlkaXNjLT5vcHMtPnJlY2VpdmVfYnVmKHR0eSwgY2hhcl9idWYsCi0JCQkJCQkJZmxhZ19idWYsIGNvdW50KTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7Ci0JCX0KLQkJLyogUmVzdG9yZSB0aGUgcXVldWUgaGVhZCAqLwotCQl0dHktPmJ1Zi5oZWFkID0gaGVhZDsKLQl9Ci0JLyogV2UgbWF5IGhhdmUgYSBkZWZlcnJlZCByZXF1ZXN0IHRvIGZsdXNoIHRoZSBpbnB1dCBidWZmZXIsCi0JICAgaWYgc28gcHVsbCB0aGUgY2hhaW4gdW5kZXIgdGhlIGxvY2sgYW5kIGVtcHR5IHRoZSBxdWV1ZSAqLwotCWlmICh0ZXN0X2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncykpIHsKLQkJX190dHlfYnVmZmVyX2ZsdXNoKHR0eSk7Ci0JCWNsZWFyX2JpdChUVFlfRkxVU0hQRU5ESU5HLCAmdHR5LT5mbGFncyk7Ci0JCXdha2VfdXAoJnR0eS0+cmVhZF93YWl0KTsKLQl9Ci0JY2xlYXJfYml0KFRUWV9GTFVTSElORywgJnR0eS0+ZmxhZ3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKLQotCXR0eV9sZGlzY19kZXJlZihkaXNjKTsKLX0KLQotLyoqCi0gKgl0dHlfZmxpcF9idWZmZXJfcHVzaAktCXRlcm1pbmFsCi0gKglAdHR5OiB0dHkgdG8gcHVzaAotICoKLSAqCVF1ZXVlIGEgcHVzaCBvZiB0aGUgdGVybWluYWwgZmxpcCBidWZmZXJzIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuIFRoaXMKLSAqCWZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIElSUSBjb250ZXh0IGlmIHR0eS0+bG93X2xhdGVuY3kgaXMgc2V0LgotICoKLSAqCUluIHRoZSBldmVudCBvZiB0aGUgcXVldWUgYmVpbmcgYnVzeSBmb3IgZmxpcHBpbmcgdGhlIHdvcmsgd2lsbCBiZQotICoJaGVsZCBvZmYgYW5kIHJldHJpZWQgbGF0ZXIuCi0gKgotICoJTG9ja2luZzogdHR5IGJ1ZmZlciBsb2NrLiBEcml2ZXIgbG9ja3MgaW4gbG93IGxhdGVuY3kgbW9kZS4KLSAqLwotCi12b2lkIHR0eV9mbGlwX2J1ZmZlcl9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCWlmICh0dHktPmJ1Zi50YWlsICE9IE5VTEwpCi0JCXR0eS0+YnVmLnRhaWwtPmNvbW1pdCA9IHR0eS0+YnVmLnRhaWwtPnVzZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eS0+bG93X2xhdGVuY3kpCi0JCWZsdXNoX3RvX2xkaXNjKCZ0dHktPmJ1Zi53b3JrLndvcmspOwotCWVsc2UKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrLCAxKTsKLX0KLQotRVhQT1JUX1NZTUJPTCh0dHlfZmxpcF9idWZmZXJfcHVzaCk7Ci0KLQotLyoqCiAgKglpbml0aWFsaXplX3R0eV9zdHJ1Y3QKICAqCUB0dHk6IHR0eSB0byBpbml0aWFsaXplCiAgKgpAQCAtMzMyNiw5ICsyNzYzLDExIEBACiAgKglMb2NraW5nOiBub25lIC0gdHR5IGluIHF1ZXN0aW9uIG11c3Qgbm90IGJlIGV4cG9zZWQgYXQgdGhpcyBwb2ludAogICovCiAKLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfdHR5X3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQordm9pZCBpbml0aWFsaXplX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGlkeCkKIHsKIAltZW1zZXQodHR5LCAwLCBzaXplb2Yoc3RydWN0IHR0eV9zdHJ1Y3QpKTsKKwlrcmVmX2luaXQoJnR0eS0+a3JlZik7CiAJdHR5LT5tYWdpYyA9IFRUWV9NQUdJQzsKIAl0dHlfbGRpc2NfaW5pdCh0dHkpOwogCXR0eS0+c2Vzc2lvbiA9IE5VTEw7CkBAIC0zMzM2LDcgKzI3NzUsNiBAQAogCXR0eS0+b3ZlcnJ1bl90aW1lID0gamlmZmllczsKIAl0dHktPmJ1Zi5oZWFkID0gdHR5LT5idWYudGFpbCA9IE5VTEw7CiAJdHR5X2J1ZmZlcl9pbml0KHR0eSk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnR0eS0+YnVmLndvcmssIGZsdXNoX3RvX2xkaXNjKTsKIAltdXRleF9pbml0KCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR0eS0+d3JpdGVfd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdHR5LT5yZWFkX3dhaXQpOwpAQCAtMzM0Nyw2ICsyNzg1LDExIEBACiAJc3Bpbl9sb2NrX2luaXQoJnR0eS0+Y3RybF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmdHR5LT50dHlfZmlsZXMpOwogCUlOSVRfV09SSygmdHR5LT5TQUtfd29yaywgZG9fU0FLX3dvcmspOworCisJdHR5LT5kcml2ZXIgPSBkcml2ZXI7CisJdHR5LT5vcHMgPSBkcml2ZXItPm9wczsKKwl0dHktPmluZGV4ID0gaWR4OworCXR0eV9saW5lX25hbWUoZHJpdmVyLCBpZHgsIHR0eS0+bmFtZSk7CiB9CiAKIC8qKgpAQCAtMzM2NywxMCArMjgxMCw5IEBACiAJCXJldHVybiB0dHktPm9wcy0+cHV0X2NoYXIodHR5LCBjaCk7CiAJcmV0dXJuIHR0eS0+b3BzLT53cml0ZSh0dHksICZjaCwgMSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHR0eV9wdXRfY2hhcik7CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnR0eV9jbGFzczsKK3N0cnVjdCBjbGFzcyAqdHR5X2NsYXNzOwogCiAvKioKICAqCXR0eV9yZWdpc3Rlcl9kZXZpY2UgLSByZWdpc3RlciBhIHR0eSBkZXZpY2UKQEAgLTM0MDgsOCArMjg1MCw5IEBACiAJZWxzZQogCQl0dHlfbGluZV9uYW1lKGRyaXZlciwgaW5kZXgsIG5hbWUpOwogCi0JcmV0dXJuIGRldmljZV9jcmVhdGVfZHJ2ZGF0YSh0dHlfY2xhc3MsIGRldmljZSwgZGV2LCBOVUxMLCBuYW1lKTsKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIGRldmljZSwgZGV2LCBOVUxMLCBuYW1lKTsKIH0KK0VYUE9SVF9TWU1CT0wodHR5X3JlZ2lzdGVyX2RldmljZSk7CiAKIC8qKgogICogCXR0eV91bnJlZ2lzdGVyX2RldmljZSAtIHVucmVnaXN0ZXIgYSB0dHkgZGV2aWNlCkBAIC0zNDI3LDggKzI4NzAsNiBAQAogCWRldmljZV9kZXN0cm95KHR0eV9jbGFzcywKIAkJTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleCk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wodHR5X3JlZ2lzdGVyX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHR0eV91bnJlZ2lzdGVyX2RldmljZSk7CiAKIHN0cnVjdCB0dHlfZHJpdmVyICphbGxvY190dHlfZHJpdmVyKGludCBsaW5lcykKQEAgLTM0MzcsMjggKzI4NzgsNjYgQEAKIAogCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRyaXZlcikgeworCQlrcmVmX2luaXQoJmRyaXZlci0+a3JlZik7CiAJCWRyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOwogCQlkcml2ZXItPm51bSA9IGxpbmVzOwogCQkvKiBsYXRlciB3ZSdsbCBtb3ZlIGFsbG9jYXRpb24gb2YgdGFibGVzIGhlcmUgKi8KIAl9CiAJcmV0dXJuIGRyaXZlcjsKIH0KK0VYUE9SVF9TWU1CT0woYWxsb2NfdHR5X2RyaXZlcik7CiAKLXZvaWQgcHV0X3R0eV9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKK3N0YXRpYyB2b2lkIGRlc3RydWN0X3R0eV9kcml2ZXIoc3RydWN0IGtyZWYgKmtyZWYpCiB7CisJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHR5X2RyaXZlciwga3JlZik7CisJaW50IGk7CisJc3RydWN0IGt0ZXJtaW9zICp0cDsKKwl2b2lkICpwOworCisJaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0lOU1RBTExFRCkgeworCQkvKgorCQkgKiBGcmVlIHRoZSB0ZXJtaW9zIGFuZCB0ZXJtaW9zX2xvY2tlZCBzdHJ1Y3R1cmVzIGJlY2F1c2UKKwkJICogd2UgZG9uJ3Qgd2FudCB0byBnZXQgbWVtb3J5IGxlYWtzIHdoZW4gbW9kdWxhciB0dHkKKwkJICogZHJpdmVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZHJpdmVyLT5udW07IGkrKykgeworCQkJdHAgPSBkcml2ZXItPnRlcm1pb3NbaV07CisJCQlpZiAodHApIHsKKwkJCQlkcml2ZXItPnRlcm1pb3NbaV0gPSBOVUxMOworCQkJCWtmcmVlKHRwKTsKKwkJCX0KKwkJCWlmICghKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RZTkFNSUNfREVWKSkKKwkJCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoZHJpdmVyLCBpKTsKKwkJfQorCQlwID0gZHJpdmVyLT50dHlzOworCQlwcm9jX3R0eV91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCQlkcml2ZXItPnR0eXMgPSBOVUxMOworCQlkcml2ZXItPnRlcm1pb3MgPSBOVUxMOworCQlrZnJlZShwKTsKKwkJY2Rldl9kZWwoJmRyaXZlci0+Y2Rldik7CisJfQogCWtmcmVlKGRyaXZlcik7CiB9CiAKK3ZvaWQgdHR5X2RyaXZlcl9rcmVmX3B1dChzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQoreworCWtyZWZfcHV0KCZkcml2ZXItPmtyZWYsIGRlc3RydWN0X3R0eV9kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTCh0dHlfZHJpdmVyX2tyZWZfcHV0KTsKKwogdm9pZCB0dHlfc2V0X29wZXJhdGlvbnMoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKIAkJCWNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyAqb3ApCiB7CiAJZHJpdmVyLT5vcHMgPSBvcDsKIH07Ci0KLUVYUE9SVF9TWU1CT0woYWxsb2NfdHR5X2RyaXZlcik7Ci1FWFBPUlRfU1lNQk9MKHB1dF90dHlfZHJpdmVyKTsKIEVYUE9SVF9TWU1CT0wodHR5X3NldF9vcGVyYXRpb25zKTsKIAordm9pZCBwdXRfdHR5X2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZCkKK3sKKwl0dHlfZHJpdmVyX2tyZWZfcHV0KGQpOworfQorRVhQT1JUX1NZTUJPTChwdXRfdHR5X2RyaXZlcik7CisKIC8qCiAgKiBDYWxsZWQgYnkgYSB0dHkgZHJpdmVyIHRvIHJlZ2lzdGVyIGl0c2VsZi4KICAqLwpAQCAtMzQ2OSwxMSArMjk0OCw4IEBACiAJZGV2X3QgZGV2OwogCXZvaWQgKipwID0gTlVMTDsKIAotCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9JTlNUQUxMRUQpCi0JCXJldHVybiAwOwotCiAJaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkgJiYgZHJpdmVyLT5udW0pIHsKLQkJcCA9IGt6YWxsb2MoZHJpdmVyLT5udW0gKiAzICogc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOworCQlwID0ga3phbGxvYyhkcml2ZXItPm51bSAqIDIgKiBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM0OTcsMTIgKzI5NzMsOSBAQAogCWlmIChwKSB7CiAJCWRyaXZlci0+dHR5cyA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKilwOwogCQlkcml2ZXItPnRlcm1pb3MgPSAoc3RydWN0IGt0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0pOwotCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gKHN0cnVjdCBrdGVybWlvcyAqKikKLQkJCQkJCQkocCArIGRyaXZlci0+bnVtICogMik7CiAJfSBlbHNlIHsKIAkJZHJpdmVyLT50dHlzID0gTlVMTDsKIAkJZHJpdmVyLT50ZXJtaW9zID0gTlVMTDsKLQkJZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IE5VTEw7CiAJfQogCiAJY2Rldl9pbml0KCZkcml2ZXItPmNkZXYsICZ0dHlfZm9wcyk7CkBAIC0zNTExLDcgKzI5ODQsNyBAQAogCWlmIChlcnJvcikgewogCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBkcml2ZXItPm51bSk7CiAJCWRyaXZlci0+dHR5cyA9IE5VTEw7Ci0JCWRyaXZlci0+dGVybWlvcyA9IGRyaXZlci0+dGVybWlvc19sb2NrZWQgPSBOVUxMOworCQlkcml2ZXItPnRlcm1pb3MgPSBOVUxMOwogCQlrZnJlZShwKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTM1MjUsNiArMjk5OCw3IEBACiAJCSAgICB0dHlfcmVnaXN0ZXJfZGV2aWNlKGRyaXZlciwgaSwgTlVMTCk7CiAJfQogCXByb2NfdHR5X3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOworCWRyaXZlci0+ZmxhZ3MgfD0gVFRZX0RSSVZFUl9JTlNUQUxMRUQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM1MzUsNDYgKzMwMDksMTkgQEAKICAqLwogaW50IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQogewotCWludCBpOwotCXN0cnVjdCBrdGVybWlvcyAqdHA7Ci0Jdm9pZCAqcDsKLQorI2lmIDAKKwkvKiBGSVhNRSAqLwogCWlmIChkcml2ZXItPnJlZmNvdW50KQogCQlyZXR1cm4gLUVCVVNZOwotCisjZW5kaWYKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCksCiAJCQkJZHJpdmVyLT5udW0pOwogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJbGlzdF9kZWwoJmRyaXZlci0+dHR5X2RyaXZlcnMpOwogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQotCS8qCi0JICogRnJlZSB0aGUgdGVybWlvcyBhbmQgdGVybWlvc19sb2NrZWQgc3RydWN0dXJlcyBiZWNhdXNlCi0JICogd2UgZG9uJ3Qgd2FudCB0byBnZXQgbWVtb3J5IGxlYWtzIHdoZW4gbW9kdWxhciB0dHkKLQkgKiBkcml2ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZHJpdmVyLT5udW07IGkrKykgewotCQl0cCA9IGRyaXZlci0+dGVybWlvc1tpXTsKLQkJaWYgKHRwKSB7Ci0JCQlkcml2ZXItPnRlcm1pb3NbaV0gPSBOVUxMOwotCQkJa2ZyZWUodHApOwotCQl9Ci0JCXRwID0gZHJpdmVyLT50ZXJtaW9zX2xvY2tlZFtpXTsKLQkJaWYgKHRwKSB7Ci0JCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkW2ldID0gTlVMTDsKLQkJCWtmcmVlKHRwKTsKLQkJfQotCQlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVikpCi0JCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoZHJpdmVyLCBpKTsKLQl9Ci0JcCA9IGRyaXZlci0+dHR5czsKLQlwcm9jX3R0eV91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOwotCWRyaXZlci0+dHR5cyA9IE5VTEw7Ci0JZHJpdmVyLT50ZXJtaW9zID0gZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IE5VTEw7Ci0Ja2ZyZWUocCk7Ci0JY2Rldl9kZWwoJmRyaXZlci0+Y2Rldik7CiAJcmV0dXJuIDA7CiB9CisKIEVYUE9SVF9TWU1CT0wodHR5X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogZGV2X3QgdHR5X2Rldm51bShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtMzU4NSw5ICszMDMyLDEzIEBACiAKIHZvaWQgcHJvY19jbGVhcl90dHkoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXNwaW5fbG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXR0eSA9IHAtPnNpZ25hbC0+dHR5OwogCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogLyogQ2FsbGVkIHVuZGVyIHRoZSBzaWdoYW5kIGxvY2sgKi8KQEAgLTM2MDMsOSArMzA1NCwxMyBAQAogCQl0dHktPnBncnAgPSBnZXRfcGlkKHRhc2tfcGdycCh0c2spKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5jdHJsX2xvY2ssIGZsYWdzKTsKIAkJdHR5LT5zZXNzaW9uID0gZ2V0X3BpZCh0YXNrX3Nlc3Npb24odHNrKSk7CisJCWlmICh0c2stPnNpZ25hbC0+dHR5KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5IG5vdCBOVUxMISFcbiIpOworCQkJdHR5X2tyZWZfcHV0KHRzay0+c2lnbmFsLT50dHkpOworCQl9CiAJfQogCXB1dF9waWQodHNrLT5zaWduYWwtPnR0eV9vbGRfcGdycCk7Ci0JdHNrLT5zaWduYWwtPnR0eSA9IHR0eTsKKwl0c2stPnNpZ25hbC0+dHR5ID0gdHR5X2tyZWZfZ2V0KHR0eSk7CiAJdHNrLT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IE5VTEw7CiB9CiAKQEAgLTM2MTksMTggKzMwNzQsMjAgQEAKIHN0cnVjdCB0dHlfc3RydWN0ICpnZXRfY3VycmVudF90dHkodm9pZCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCVdBUk5fT05fT05DRSghbXV0ZXhfaXNfbG9ja2VkKCZ0dHlfbXV0ZXgpKTsKLQl0dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKLQkvKgotCSAqIHNlc3Npb24tPnR0eSBjYW4gYmUgY2hhbmdlZC9jbGVhcmVkIGZyb20gdW5kZXIgdXMsIG1ha2Ugc3VyZSB3ZQotCSAqIGlzc3VlIHRoZSBsb2FkLiBUaGUgb2J0YWluZWQgcG9pbnRlciwgd2hlbiBub3QgTlVMTCwgaXMgdmFsaWQgYXMKLQkgKiBsb25nIGFzIHdlIGhvbGQgdHR5X211dGV4LgotCSAqLwotCWJhcnJpZXIoKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl0dHkgPSB0dHlfa3JlZl9nZXQoY3VycmVudC0+c2lnbmFsLT50dHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gdHR5OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2N1cnJlbnRfdHR5KTsKIAordm9pZCB0dHlfZGVmYXVsdF9mb3BzKHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCit7CisJKmZvcHMgPSB0dHlfZm9wczsKK30KKwogLyoKICAqIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgZGV2aWNlLiBUaGlzIGlzIGNhbGxlZCAqZWFybHkqLCBzbwogICogd2UgY2FuJ3QgbmVjZXNzYXJpbHkgZGVwZW5kIG9uIGxvdHMgb2Yga2VybmVsIGhlbHAgaGVyZS4KQEAgLTM2NjgsMTIgKzMxMjUsNiBAQAogLyogMy8yMDA0IGptYzogd2h5IGRvIHRoZXNlIGRldmljZXMgZXhpc3Q/ICovCiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiB0dHlfY2RldiwgY29uc29sZV9jZGV2OwotI2lmZGVmIENPTkZJR19VTklYOThfUFRZUwotc3RhdGljIHN0cnVjdCBjZGV2IHB0bXhfY2RldjsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WVAotc3RhdGljIHN0cnVjdCBjZGV2IHZjMF9jZGV2OwotI2VuZGlmCiAKIC8qCiAgKiBPaywgbm93IHdlIGNhbiBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSB0dHkgZGV2aWNlcyBhbmQgY2FuIGNvdW50CkBAIC0zNjg1LDMyICszMTM2LDE4IEBACiAJaWYgKGNkZXZfYWRkKCZ0dHlfY2RldiwgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgMSkgfHwKIAkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAxLCAiL2Rldi90dHkiKSA8IDApCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3R0eSBkcml2ZXJcbiIpOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIE5VTEwsCisJZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIE5VTEwsCiAJCQkgICAgICAidHR5Iik7CiAKIAljZGV2X2luaXQoJmNvbnNvbGVfY2RldiwgJmNvbnNvbGVfZm9wcyk7CiAJaWYgKGNkZXZfYWRkKCZjb25zb2xlX2NkZXYsIE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIDEpIHx8CiAJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgMSwgIi9kZXYvY29uc29sZSIpIDwgMCkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvY29uc29sZSBkcml2ZXJcbiIpOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIE5VTEwsCisJZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIE5VTEwsCiAJCQkgICAgICAiY29uc29sZSIpOwogCi0jaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCi0JY2Rldl9pbml0KCZwdG14X2NkZXYsICZwdG14X2ZvcHMpOwotCWlmIChjZGV2X2FkZCgmcHRteF9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCAxKSB8fAotCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIDEsICIvZGV2L3B0bXgiKSA8IDApCi0JCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3B0bXggZHJpdmVyXG4iKTsKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCBOVUxMLCAicHRteCIpOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfVlQKLQljZGV2X2luaXQoJnZjMF9jZGV2LCAmY29uc29sZV9mb3BzKTsKLQlpZiAoY2Rldl9hZGQoJnZjMF9jZGV2LCBNS0RFVihUVFlfTUFKT1IsIDApLCAxKSB8fAotCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWV9NQUpPUiwgMCksIDEsICIvZGV2L3ZjLzAiKSA8IDApCi0JCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3R0eTAgZHJpdmVyXG4iKTsKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlfTUFKT1IsIDApLCBOVUxMLCAidHR5MCIpOwotCi0JdnR5X2luaXQoKTsKKwl2dHlfaW5pdCgmY29uc29sZV9mb3BzKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IGJmMzRlNDUuLmE0MDhjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTQwLDYgKzQwLDE1IEBACiAjZGVmaW5lIFRFUk1JT1NfT0xECTgKIAogCisvKioKKyAqCXR0eV9jaGFyc19pbl9idWZmZXIJLQljaGFyYWN0ZXJzIHBlbmRpbmcKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZGV2aWNlIHByaXZhdGUKKyAqCW91dHB1dCBxdWV1ZS4gSWYgbm8gcHJpdmF0ZSBtZXRob2QgaXMgc3VwcGxpZWQgdGhlcmUgaXMgYXNzdW1lZAorICoJdG8gYmUgbm8gcXVldWUgb24gdGhlIGRldmljZS4KKyAqLworCiBpbnQgdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWlmICh0dHktPm9wcy0+Y2hhcnNfaW5fYnVmZmVyKQpAQCAtNDcsMjYgKzU2LDQ5IEBACiAJZWxzZQogCQlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTCh0dHlfY2hhcnNfaW5fYnVmZmVyKTsKIAorLyoqCisgKgl0dHlfd3JpdGVfcm9vbQkJLQl3cml0ZSBxdWV1ZSBzcGFjZQorICoJQHR0eTogdGVybWluYWwKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBxdWV1ZWQgdG8gdGhpcyBkZXZpY2UKKyAqCWF0IHRoZSBwcmVzZW50IHRpbWUuIFRoZSByZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBndWFyYW50ZWUKKyAqCWFuZCB0aGUgZHJpdmVyIGNhbm5vdCBvZmZlciBhIHZhbHVlIGl0IGxhdGVyIHNocmlua3MgYnkgbW9yZSB0aGFuCisgKgl0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIG5vIG1ldGhvZCBpcyBwcm92aWRlZCAySyBpcyBhbHdheXMKKyAqCXJldHVybmVkIGFuZCBkYXRhIG1heSBiZSBsb3N0IGFzIHRoZXJlIHdpbGwgYmUgbm8gZmxvdyBjb250cm9sLgorICovCisgCiBpbnQgdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlpZiAodHR5LT5vcHMtPndyaXRlX3Jvb20pCiAJCXJldHVybiB0dHktPm9wcy0+d3JpdGVfcm9vbSh0dHkpOwogCXJldHVybiAyMDQ4OwogfQotCiBFWFBPUlRfU1lNQk9MKHR0eV93cml0ZV9yb29tKTsKIAorLyoqCisgKgl0dHlfZHJpdmVyX2ZsdXNoX2J1ZmZlcgktCWRpc2NhcmQgaW50ZXJuYWwgYnVmZmVyCisgKglAdHR5OiB0ZXJtaW5hbAorICoKKyAqCURpc2NhcmQgdGhlIGludGVybmFsIG91dHB1dCBidWZmZXIgZm9yIHRoaXMgZGV2aWNlLiBJZiBubyBtZXRob2QKKyAqCWlzIHByb3ZpZGVkIHRoZW4gZWl0aGVyIHRoZSBidWZmZXIgY2Fubm90IGJlIGhhcmR3YXJlIGZsdXNoZWQgb3IKKyAqCXRoZXJlIGlzIG5vIGJ1ZmZlciBkcml2ZXIgc2lkZS4KKyAqLwogdm9pZCB0dHlfZHJpdmVyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWlmICh0dHktPm9wcy0+Zmx1c2hfYnVmZmVyKQogCQl0dHktPm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodHR5X2RyaXZlcl9mbHVzaF9idWZmZXIpOwogCisvKioKKyAqCXR0eV90aHJvdHRsZQkJLQlmbG93IGNvbnRyb2wKKyAqCUB0dHk6IHRlcm1pbmFsCisgKgorICoJSW5kaWNhdGUgdGhhdCBhIHR0eSBzaG91bGQgc3RvcCB0cmFuc21pdHRpbmcgZGF0YSBkb3duIHRoZSBzdGFjay4KKyAqLworCiB2b2lkIHR0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCS8qIGNoZWNrIFRUWV9USFJPVFRMRUQgZmlyc3Qgc28gaXQgaW5kaWNhdGVzIG91ciBzdGF0ZSAqLwpAQCAtNzYsNiArMTA4LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHR0eV90aHJvdHRsZSk7CiAKKy8qKgorICoJdHR5X3VudGhyb3R0bGUJCS0JZmxvdyBjb250cm9sCisgKglAdHR5OiB0ZXJtaW5hbAorICoKKyAqCUluZGljYXRlIHRoYXQgYSB0dHkgbWF5IGNvbnRpbnVlIHRyYW5zbWl0dGluZyBkYXRhIGRvd24gdGhlIHN0YWNrLgorICovCisKIHZvaWQgdHR5X3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSAmJgpAQCAtMTEyLDYgKzE1MSwxMSBAQAogfQogRVhQT1JUX1NZTUJPTCh0dHlfd2FpdF91bnRpbF9zZW50KTsKIAorCisvKgorICoJCVRlcm1pb3MgSGVscGVyIE1ldGhvZHMKKyAqLworCiBzdGF0aWMgdm9pZCB1bnNldF9sb2NrZWRfdGVybWlvcyhzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCiAJCQkJIHN0cnVjdCBrdGVybWlvcyAqb2xkLAogCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKmxvY2tlZCkKQEAgLTM0Niw2ICszOTAsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUpOwogCisvKioKKyAqCXR0eV9lbmNvZGVfYmF1ZF9yYXRlCQktCXNldCBiYXVkIHJhdGUgb2YgdGhlIHR0eQorICoJQGliYXVkOiBpbnB1dCBiYXVkIHJhdGUKKyAqCUBvYmFkOiBvdXRwdXQgYmF1ZCByYXRlCisgKgorICoJVXBkYXRlIHRoZSBjdXJyZW50IHRlcm1pb3MgZGF0YSBmb3IgdGhlIHR0eSB3aXRoIHRoZSBuZXcgc3BlZWQKKyAqCXNldHRpbmdzLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgdGVybWlvc19tdXRleCBmb3IgdGhlIHR0eSBpbgorICoJcXVlc3Rpb24uCisgKi8KKwogdm9pZCB0dHlfZW5jb2RlX2JhdWRfcmF0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzcGVlZF90IGliYXVkLCBzcGVlZF90IG9iYXVkKQogewogCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUodHR5LT50ZXJtaW9zLCBpYmF1ZCwgb2JhdWQpOwpAQCAtNDMwLDEyICs0ODQsMTEgQEAKICAqCWlzIGEgYml0IG9mIGxheWVyaW5nIHZpb2xhdGlvbiBoZXJlIHdpdGggbl90dHkgaW4gdGVybXMgb2YgdGhlCiAgKglpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhpcyBmdW5jdGlvbi4KICAqCi0gKglMb2NraW5nOiB0ZXJtaW9zX3NlbQorICoJTG9ja2luZzogdGVybWlvc19tdXRleAogICovCiAKIHN0YXRpYyB2b2lkIGNoYW5nZV90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqbmV3X3Rlcm1pb3MpCiB7Ci0JaW50IGNhbm9uX2NoYW5nZTsKIAlzdHJ1Y3Qga3Rlcm1pb3Mgb2xkX3Rlcm1pb3M7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ1MSwxOCArNTA0LDYgQEAKIAlvbGRfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CiAJKnR0eS0+dGVybWlvcyA9ICpuZXdfdGVybWlvczsKIAl1bnNldF9sb2NrZWRfdGVybWlvcyh0dHktPnRlcm1pb3MsICZvbGRfdGVybWlvcywgdHR5LT50ZXJtaW9zX2xvY2tlZCk7Ci0JY2Fub25fY2hhbmdlID0gKG9sZF90ZXJtaW9zLmNfbGZsYWcgXiB0dHktPnRlcm1pb3MtPmNfbGZsYWcpICYgSUNBTk9OOwotCWlmIChjYW5vbl9jaGFuZ2UpIHsKLQkJbWVtc2V0KCZ0dHktPnJlYWRfZmxhZ3MsIDAsIHNpemVvZiB0dHktPnJlYWRfZmxhZ3MpOwotCQl0dHktPmNhbm9uX2hlYWQgPSB0dHktPnJlYWRfdGFpbDsKLQkJdHR5LT5jYW5vbl9kYXRhID0gMDsKLQkJdHR5LT5lcmFzaW5nID0gMDsKLQl9Ci0KLQkvKiBUaGlzIGJpdCBzaG91bGQgYmUgaW4gdGhlIGxkaXNjIGNvZGUgKi8KLQlpZiAoY2Fub25fY2hhbmdlICYmICFMX0lDQU5PTih0dHkpICYmIHR0eS0+cmVhZF9jbnQpCi0JCS8qIEdldCBjaGFyYWN0ZXJzIGxlZnQgb3ZlciBmcm9tIGNhbm9uaWNhbCBtb2RlLiAqLwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cmVhZF93YWl0KTsKIAogCS8qIFNlZSBpZiBwYWNrZXQgbW9kZSBjaGFuZ2Ugb2Ygc3RhdGUuICovCiAJaWYgKHR0eS0+bGluayAmJiB0dHktPmxpbmstPnBhY2tldCkgewpAQCAtNTA4LDcgKzU0OSw3IEBACiAgKglmdW5jdGlvbnMgYmVmb3JlIHVzaW5nIGNoYW5nZV90ZXJtaW9zIHRvIGRvIHRoZSBhY3R1YWwgY2hhbmdlcy4KICAqCiAgKglMb2NraW5nOgotICoJCUNhbGxlZCBmdW5jdGlvbnMgdGFrZSBsZGlzYyBhbmQgdGVybWlvc19zZW0gbG9ja3MKKyAqCQlDYWxsZWQgZnVuY3Rpb25zIHRha2UgbGRpc2MgYW5kIHRlcm1pb3NfbXV0ZXggbG9ja3MKICAqLwogCiBzdGF0aWMgaW50IHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHZvaWQgX191c2VyICphcmcsIGludCBvcHQpCkBAIC01NzksMjUgKzYyMCw1MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnFfY2Fub24oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlpbnQgbnIsIGhlYWQsIHRhaWw7CiAKLQlpZiAoIXR0eS0+Y2Fub25fZGF0YSB8fCAhdHR5LT5yZWFkX2J1ZikKLQkJcmV0dXJuIDA7Ci0JaGVhZCA9IHR0eS0+Y2Fub25faGVhZDsKLQl0YWlsID0gdHR5LT5yZWFkX3RhaWw7Ci0JbnIgPSAoaGVhZCAtIHRhaWwpICYgKE5fVFRZX0JVRl9TSVpFLTEpOwotCS8qIFNraXAgRU9GLWNoYXJzLi4gKi8KLQl3aGlsZSAoaGVhZCAhPSB0YWlsKSB7Ci0JCWlmICh0ZXN0X2JpdCh0YWlsLCB0dHktPnJlYWRfZmxhZ3MpICYmCi0JCSAgICB0dHktPnJlYWRfYnVmW3RhaWxdID09IF9fRElTQUJMRURfQ0hBUikKLQkJCW5yLS07Ci0JCXRhaWwgPSAodGFpbCsxKSAmIChOX1RUWV9CVUZfU0laRS0xKTsKKyNpZmRlZiBUQ0dFVFgKKworLyoqCisgKglzZXRfdGVybWlveAktCXNldCB0ZXJtaW94IGZpZWxkcyBpZiBwb3NzaWJsZQorICoJQHR0eTogdGVybWluYWwKKyAqCUBhcmc6IHRlcm1pb3ggc3RydWN0dXJlIGZyb20gdXNlcgorICoJQG9wdDogb3B0aW9uIGZsYWdzIGZvciBpb2N0bCB0eXBlCisgKgorICoJSW1wbGVtZW50IHRoZSBkZXZpY2UgY2FsbGluZyBwb2ludHMgZm9yIHRoZSBTWVM1IHRlcm1pb3ggaW9jdGwKKyAqCWludGVyZmFjZSBpbiBMaW51eAorICovCisKK3N0YXRpYyBpbnQgc2V0X3Rlcm1pb3goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdm9pZCBfX3VzZXIgKmFyZywgaW50IG9wdCkKK3sKKwlzdHJ1Y3QgdGVybWlveCB0bmV3OworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJaWYgKHR0eS0+dGVybWlveCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRuZXcsIGFyZywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW94KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaWYgKGxkICE9IE5VTEwpIHsKKwkJaWYgKChvcHQgJiBURVJNSU9TX0ZMVVNIKSAmJiBsZC0+b3BzLT5mbHVzaF9idWZmZXIpCisJCQlsZC0+b3BzLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIAl9Ci0JcmV0dXJuIG5yOworCWlmIChvcHQgJiBURVJNSU9TX1dBSVQpIHsKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKworCW11dGV4X2xvY2soJnR0eS0+dGVybWlvc19tdXRleCk7CisJaWYgKHR0eS0+b3BzLT5zZXRfdGVybWlveCkKKwkJdHR5LT5vcHMtPnNldF90ZXJtaW94KHR0eSwgJnRuZXcpOworCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKKwlyZXR1cm4gMDsKIH0KIAorI2VuZGlmCisKKwogI2lmZGVmIFRJT0NHRVRQCiAvKgogICogVGhlc2UgYXJlIGRlcHJlY2F0ZWQsIGJ1dCB0aGVyZSBpcyBsaW1pdGVkIHN1cHBvcnQuLgpAQCAtNjcxLDcgKzczOCw3IEBACiAgKglVcGRhdGVzIGEgdGVybWluYWwgZnJvbSB0aGUgbGVnYWN5IEJTRCBzdHlsZSB0ZXJtaW5hbCBpbmZvcm1hdGlvbgogICoJc3RydWN0dXJlLgogICoKLSAqCUxvY2tpbmc6IHRlcm1pb3Nfc2VtCisgKglMb2NraW5nOiB0ZXJtaW9zX211dGV4CiAgKi8KIAogc3RhdGljIGludCBzZXRfc2d0dHliKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzZ3R0eWIgX191c2VyICpzZ3R0eWIpCkBAIC04NDksNiArOTE2LDcgQEAKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHk7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IHJldCA9IDA7CiAKIAlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgogCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCkBAIC04ODQsMTggKzk1MiwyNCBAQAogCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfT0xEKTsKICNpZm5kZWYgVENHRVRTMgogCWNhc2UgVENHRVRTOgorCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCXJldHVybiByZXQ7CiAjZWxzZQogCWNhc2UgVENHRVRTOgorCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7CisJCQlyZXQgPSAtRUZBVUxUOworCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFRDR0VUUzI6CisJCW11dGV4X2xvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MyIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCXJldHVybiByZXQ7CiAJY2FzZSBUQ1NFVFNGMjoKIAkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCk7CiAJY2FzZSBUQ1NFVFNXMjoKQEAgLTkxMywzNCArOTg3LDU5IEBACiAJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19URVJNSU8pOwogI2lmbmRlZiBUQ0dFVFMyCiAJY2FzZSBUSU9DR0xDS1RSTUlPUzoKKwkJbXV0ZXhfbG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOwogCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7CisJCQlyZXQgPSAtRUZBVUxUOworCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFRJT0NTTENLVFJNSU9TOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOworCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLAogCQkJCQkgICAgICAgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCXJldHVybiByZXQ7CiAjZWxzZQogCWNhc2UgVElPQ0dMQ0tUUk1JT1M6CisJCW11dGV4X2xvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7CisJCQlyZXQgPSAtRUZBVUxUOworCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFRJT0NTTENLVFJNSU9TOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0ID0gLUVQRVJNOworCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQsCiAJCQkJCSAgICAgICAoc3RydWN0IHRlcm1pb3MgX191c2VyICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCXJldHVybiByZXQ7CiAjZW5kaWYKKyNpZmRlZiBUQ0dFVFgKKwljYXNlIFRDR0VUWDoKKwkJaWYgKHJlYWxfdHR5LT50ZXJtaW94ID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbXV0ZXhfbG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOworCQlpZiAoY29weV90b191c2VyKHAsIHJlYWxfdHR5LT50ZXJtaW94LCBzaXplb2Yoc3RydWN0IHRlcm1pb3gpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCW11dGV4X3VubG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCWNhc2UgVENTRVRYOgorCQlyZXR1cm4gc2V0X3Rlcm1pb3gocmVhbF90dHksIHAsIDApOworCWNhc2UgVENTRVRYVzoKKwkJcmV0dXJuIHNldF90ZXJtaW94KHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQpOworCWNhc2UgVENTRVRYRjoKKwkJcmV0dXJuIHNldF90ZXJtaW94KHJlYWxfdHR5LCBwLCBURVJNSU9TX0ZMVVNIKTsKKyNlbmRpZgkJCiAJY2FzZSBUSU9DR1NPRlRDQVI6Ci0JCS8qIEZJWE1FOiBmb3IgY29ycmVjdG5lc3Mgd2UgbWF5IG5lZWQgdG8gdGFrZSB0aGUgdGVybWlvcwotCQkgICBsb2NrIGhlcmUgLSByZXZpZXcgKi8KLQkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHJlYWxfdHR5KSA/IDEgOiAwLAorCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCXJldCA9IHB1dF91c2VyKENfQ0xPQ0FMKHJlYWxfdHR5KSA/IDEgOiAwLAogCQkJCQkJKGludCBfX3VzZXIgKilhcmcpOworCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFRJT0NTU09GVENBUjoKIAkJaWYgKGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtOTgwLDcgKzEwNzksNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHR5X3BlcmZvcm1fZmx1c2gpOwogCi1pbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCitpbnQgbl90dHlfaW9jdGxfaGVscGVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEwMTgsMTMgKzExMTcsNiBAQAogCQlyZXR1cm4gMDsKIAljYXNlIFRDRkxTSDoKIAkJcmV0dXJuIHR0eV9wZXJmb3JtX2ZsdXNoKHR0eSwgYXJnKTsKLQljYXNlIFRJT0NPVVRROgotCQlyZXR1cm4gcHV0X3VzZXIodHR5X2NoYXJzX2luX2J1ZmZlcih0dHkpLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCWNhc2UgVElPQ0lOUToKLQkJcmV0dmFsID0gdHR5LT5yZWFkX2NudDsKLQkJaWYgKExfSUNBTk9OKHR0eSkpCi0JCQlyZXR2YWwgPSBpbnFfY2Fub24odHR5KTsKLQkJcmV0dXJuIHB1dF91c2VyKHJldHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKTsKIAljYXNlIFRJT0NQS1Q6CiAJewogCQlpbnQgcGt0bW9kZTsKQEAgLTEwNTAsNCArMTE0Miw0IEBACiAJCXJldHVybiB0dHlfbW9kZV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG5fdHR5X2lvY3RsKTsKK0VYUE9SVF9TWU1CT0wobl90dHlfaW9jdGxfaGVscGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jIGIvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzYjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBUdHkgcG9ydCBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCit2b2lkIHR0eV9wb3J0X2luaXQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCW1lbXNldChwb3J0LCAwLCBzaXplb2YoKnBvcnQpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5vcGVuX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmNsb3NlX3dhaXQpOworCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisJcG9ydC0+Y2xvc2VfZGVsYXkgPSAoNTAgKiBIWikgLyAxMDA7CisJcG9ydC0+Y2xvc2luZ193YWl0ID0gKDMwMDAgKiBIWikgLyAxMDA7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2luaXQpOworCitpbnQgdHR5X3BvcnRfYWxsb2NfeG1pdF9idWYoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCS8qIFdlIG1heSBzbGVlcCBpbiBnZXRfemVyb2VkX3BhZ2UoKSAqLworCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKwlpZiAocG9ydC0+eG1pdF9idWYgPT0gTlVMTCkKKwkJcG9ydC0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKKwlpZiAocG9ydC0+eG1pdF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2FsbG9jX3htaXRfYnVmKTsKKwordm9pZCB0dHlfcG9ydF9mcmVlX3htaXRfYnVmKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisJaWYgKHBvcnQtPnhtaXRfYnVmICE9IE5VTEwpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBvcnQtPnhtaXRfYnVmKTsKKwkJcG9ydC0+eG1pdF9idWYgPSBOVUxMOworCX0KKwltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wodHR5X3BvcnRfZnJlZV94bWl0X2J1Zik7CisKKworLyoqCisgKgl0dHlfcG9ydF90dHlfZ2V0CS0JZ2V0IGEgdHR5IHJlZmVyZW5jZQorICoJQHBvcnQ6IHR0eSBwb3J0CisgKgorICoJUmV0dXJuIGEgcmVmY291bnQgcHJvdGVjdGVkIHR0eSBpbnN0YW5jZSBvciBOVUxMIGlmIHRoZSBwb3J0IGlzIG5vdAorICoJYXNzb2NpYXRlZCB3aXRoIGEgdHR5IChlZyBkdWUgdG8gY2xvc2Ugb3IgaGFuZ3VwKQorICovCisKK3N0cnVjdCB0dHlfc3RydWN0ICp0dHlfcG9ydF90dHlfZ2V0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXR0eSA9IHR0eV9rcmVmX2dldChwb3J0LT50dHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdHR5OworfQorRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF90dHlfZ2V0KTsKKworLyoqCisgKgl0dHlfcG9ydF90dHlfc2V0CS0Jc2V0IHRoZSB0dHkgb2YgYSBwb3J0CisgKglAcG9ydDogdHR5IHBvcnQKKyAqCUB0dHk6IHRoZSB0dHkKKyAqCisgKglBc3NvY2lhdGUgdGhlIHBvcnQgYW5kIHR0eSBwYWlyLiBNYW5hZ2VzIGFueSBpbnRlcm5hbCByZWZjb3VudHMuCisgKglQYXNzIE5VTEwgdG8gZGVhc3NvY2lhdGUgYSBwb3J0CisgKi8KKwordm9pZCB0dHlfcG9ydF90dHlfc2V0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+dHR5KQorCQl0dHlfa3JlZl9wdXQocG9ydC0+dHR5KTsKKwlwb3J0LT50dHkgPSB0dHk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF90dHlfc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYyBiL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYwppbmRleCBjMmFlNTJkLi40ZjNiM2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKKysrIGIvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jCkBAIC00ODEsMTAgKzQ4MSwxMCBAQAogCiB2b2lkIHZjc19tYWtlX3N5c2ZzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHZjX2NsYXNzLCBOVUxMLCBNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxKSwKLQkJCSAgICAgIE5VTEwsICJ2Y3MldSIsIHR0eS0+aW5kZXggKyAxKTsKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSksCi0JCQkgICAgICBOVUxMLCAidmNzYSV1IiwgdHR5LT5pbmRleCArIDEpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEpLCBOVUxMLAorCQkgICAgICAidmNzJXUiLCB0dHktPmluZGV4ICsgMSk7CisJZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMTI5KSwgTlVMTCwKKwkJICAgICAgInZjc2EldSIsIHR0eS0+aW5kZXggKyAxKTsKIH0KIAogdm9pZCB2Y3NfcmVtb3ZlX3N5c2ZzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC00OTksNyArNDk5LDcgQEAKIAkJcGFuaWMoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIHZjcyBkZXZpY2UiLCBWQ1NfTUFKT1IpOwogCXZjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidmMiKTsKIAotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCAwKSwgTlVMTCwgInZjcyIpOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCAxMjgpLCBOVUxMLCAidmNzYSIpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgMCksIE5VTEwsICJ2Y3MiKTsKKwlkZXZpY2VfY3JlYXRlKHZjX2NsYXNzLCBOVUxMLCBNS0RFVihWQ1NfTUFKT1IsIDEyOCksIE5VTEwsICJ2Y3NhIik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwppbmRleCA3YTcwYTQwLi5mZmM5MjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKQEAgLTg4NiwxMCArODg2LDEwIEBACiAJc3RhdGVbaV0uY3VyX3BhcnQgPSAwOwogCWZvciAoaiA9IDA7IGogPCBNQVhfUEFSVElUSU9OUzsgKytqKQogCQlzdGF0ZVtpXS5wYXJ0X3N0YXRfcndpW2pdID0gVklPVF9JRExFOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YSh0YXBlX2NsYXNzLCBOVUxMLCBNS0RFVihWSU9UQVBFX01BSk9SLCBpKSwKLQkJCSAgICAgIE5VTEwsICJpc2VyaWVzIXZ0JWQiLCBpKTsKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEodGFwZV9jbGFzcywgTlVMTCwgTUtERVYoVklPVEFQRV9NQUpPUiwgaSB8IDB4ODApLAotCQkJICAgICAgTlVMTCwgImlzZXJpZXMhbnZ0JWQiLCBpKTsKKwlkZXZpY2VfY3JlYXRlKHRhcGVfY2xhc3MsIE5VTEwsIE1LREVWKFZJT1RBUEVfTUFKT1IsIGkpLCBOVUxMLAorCQkgICAgICAiaXNlcmllcyF2dCVkIiwgaSk7CisJZGV2aWNlX2NyZWF0ZSh0YXBlX2NsYXNzLCBOVUxMLCBNS0RFVihWSU9UQVBFX01BSk9SLCBpIHwgMHg4MCksIE5VTEwsCisJCSAgICAgICJpc2VyaWVzIW52dCVkIiwgaSk7CiAJcHJpbnRrKFZJT1RBUEVfS0VSTl9JTkZPICJ0YXBlIGlzZXJpZXMvdnQlZCBpcyBpU2VyaWVzICIKIAkJCSJyZXNvdXJjZSAlMTAuMTBzIHR5cGUgJTQuNHMsIG1vZGVsICUzLjNzXG4iLAogCQkJaSwgdmlvdGFwZV91bml0aW5mb1tpXS5yc3JjbmFtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggNjAzNTljMy4uZDhmODNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTU5LDcgKzU5LDcgQEAKICAqIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PiwgSnVseSAxOTk4CiAgKgogICogUmVtb3ZlZCBvbGQtc3R5bGUgdGltZXJzLCBpbnRyb2R1Y2VkIGNvbnNvbGVfdGltZXIsIG1hZGUgdGltZXIKLSAqIGRlbGV0aW9uIFNNUC1zYWZlLiAgMTdKdW4wMCwgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PgorICogZGVsZXRpb24gU01QLXNhZmUuICAxN0p1bjAwLCBBbmRyZXcgTW9ydG9uCiAgKgogICogUmVtb3ZlZCBjb25zb2xlX2xvY2ssIGVuYWJsZWQgaW50ZXJydXB0cyBhY3Jvc3MgYWxsIGNvbnNvbGUgb3BlcmF0aW9ucwogICogMTMgTWFyY2ggMjAwMSwgQW5kcmV3IE1vcnRvbgpAQCAtMTAwLDEwICsxMDAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9mb250Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjZGVmaW5lIE1BWF9OUl9DT05fRFJJVkVSIDE2CiAKQEAgLTMwMSw3ICszMDEsNyBAQAogCWQgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIHQpOwogCXMgPSAodW5zaWduZWQgc2hvcnQgKikodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqICh0ICsgbnIpKTsKIAlzY3JfbWVtbW92ZXcoZCwgcywgKGIgLSB0IC0gbnIpICogdmMtPnZjX3NpemVfcm93KTsKLQlzY3JfbWVtc2V0dyhkICsgKGIgLSB0IC0gbnIpICogdmMtPnZjX2NvbHMsIHZjLT52Y19zY3JsX2VyYXNlX2NoYXIsCisJc2NyX21lbXNldHcoZCArIChiIC0gdCAtIG5yKSAqIHZjLT52Y19jb2xzLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKIAkJICAgIHZjLT52Y19zaXplX3JvdyAqIG5yKTsKIH0KIApAQCAtMzE5LDcgKzMxOSw3IEBACiAJcyA9ICh1bnNpZ25lZCBzaG9ydCAqKSh2Yy0+dmNfb3JpZ2luICsgdmMtPnZjX3NpemVfcm93ICogdCk7CiAJc3RlcCA9IHZjLT52Y19jb2xzICogbnI7CiAJc2NyX21lbW1vdmV3KHMgKyBzdGVwLCBzLCAoYiAtIHQgLSBucikgKiB2Yy0+dmNfc2l6ZV9yb3cpOwotCXNjcl9tZW1zZXR3KHMsIHZjLT52Y19zY3JsX2VyYXNlX2NoYXIsIDIgKiBzdGVwKTsKKwlzY3JfbWVtc2V0dyhzLCB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwgMiAqIHN0ZXApOwogfQogCiBzdGF0aWMgdm9pZCBkb191cGRhdGVfcmVnaW9uKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgbG9uZyBzdGFydCwgaW50IGNvdW50KQpAQCAtNDM0LDcgKzQzNCw2IEBACiAJICAgICAgICAgICAgICB2Yy0+dmNfYmxpbmssIHZjLT52Y191bmRlcmxpbmUsCiAJICAgICAgICAgICAgICB2Yy0+dmNfcmV2ZXJzZSBeIHZjLT52Y19kZWNzY25tLCB2Yy0+dmNfaXRhbGljKTsKIAl2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciA9IChidWlsZF9hdHRyKHZjLCB2Yy0+dmNfY29sb3IsIDEsIHZjLT52Y19ibGluaywgMCwgdmMtPnZjX2RlY3Njbm0sIDApIDw8IDgpIHwgJyAnOwotCXZjLT52Y19zY3JsX2VyYXNlX2NoYXIgPSAoYnVpbGRfYXR0cih2YywgdmMtPnZjX2RlZl9jb2xvciwgMSwgZmFsc2UsIGZhbHNlLCB2Yy0+dmNfZGVjc2NubSwgZmFsc2UpIDw8IDgpIHwgJyAnOwogfQogCiAvKiBOb3RlOiBpbnZlcnRpbmcgdGhlIHNjcmVlbiB0d2ljZSBzaG91bGQgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCBzdGF0ZSAqLwpAQCAtMjEzNiwyNyArMjEzNSw5IEBACiAJICAgIHJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAkgICAgcmV0dXJuIDA7CiAJfQotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQogCW9yaWdfYnVmID0gYnVmOwogCW9yaWdfY291bnQgPSBjb3VudDsKIAotCS8qIEF0IHRoaXMgcG9pbnQgJ2J1ZicgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGtlcm5lbCBidWZmZXIKLQkgKiBhbmQgdGhlcmVmb3JlIG5vIGFjY2VzcyB0byB1c2Vyc3BhY2UgKGFuZCB0aGVyZWZvcmUgc2xlZXBpbmcpCi0JICogd2lsbCBiZSBuZWVkZWQuICBUaGUgY29uX2J1Zl9tdHggc2VyaWFsaXplcyBhbGwgdHR5IGJhc2VkCi0JICogY29uc29sZSByZW5kZXJpbmcgYW5kIHZjcyB3cml0ZS9yZWFkIG9wZXJhdGlvbnMuICBXZSBob2xkCi0JICogdGhlIGNvbnNvbGUgc3BpbmxvY2sgZHVyaW5nIHRoZSBlbnRpcmUgd3JpdGUuCi0JICovCi0KLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0KLQl2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHZjID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2dDogYXJnaCwgZHJpdmVyX2RhdGEgX2JlY2FtZV8gTlVMTCAhXG4iKTsKLQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAloaW1hc2sgPSB2Yy0+dmNfaGlfZm9udF9tYXNrOwogCWNoYXJtYXNrID0gaGltYXNrID8gMHgxZmYgOiAweGZmOwogCkBAIC0yMzcwLDggKzIzNTEsNiBAQAogCUZMVVNICiAJY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSgpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQotb3V0OgogCW5vdGlmeV91cGRhdGUodmMpOwogCXJldHVybiBuOwogI3VuZGVmIEZMVVNICkBAIC0yNTgzLDggKzI1NjIsNiBAQAogCWludCBsaW5lczsKIAlpbnQgcmV0OwogCi0JaWYgKHR0eS0+ZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9DT05TT0xFKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5ICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmIChnZXRfdXNlcih0eXBlLCBwKSkKQEAgLTI3NzgsNiArMjc1NSwxMiBAQAogCQlyZXQgPSB2Y19hbGxvY2F0ZShjdXJyY29ucyk7CiAJCWlmIChyZXQgPT0gMCkgewogCQkJc3RydWN0IHZjX2RhdGEgKnZjID0gdmNfY29uc1tjdXJyY29uc10uZDsKKworCQkJLyogU3RpbGwgYmVpbmcgZnJlZWQgKi8KKwkJCWlmICh2Yy0+dmNfdHR5KSB7CisJCQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQl9CiAJCQl0dHktPmRyaXZlcl9kYXRhID0gdmM7CiAJCQl2Yy0+dmNfdHR5ID0gdHR5OwogCkBAIC0yNzk4LDM0ICsyNzgxLDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFdlIHRha2UgdHR5X211dGV4IGluIGhlcmUgdG8gcHJldmVudCBhbm90aGVyIHRocmVhZCBmcm9tIGNvbWluZyBpbiB2aWEgaW5pdF9kZXYKLSAqIGFuZCB0YWtpbmcgYSByZWYgYWdhaW5zdCB0aGUgdHR5IHdoaWxlIHdlJ3JlIGluIHRoZSBwcm9jZXNzIG9mIGZvcmdldHRpbmcKLSAqIGFib3V0IGl0IGFuZCBjbGVhbmluZyB0aGluZ3MgdXAuCi0gKgotICogVGhpcyBpcyBiZWNhdXNlIHZjc19yZW1vdmVfc3lzZnMoKSBjYW4gc2xlZXAgYW5kIHdpbGwgZHJvcCB0aGUgQktMLgotICovCiBzdGF0aWMgdm9pZCBjb25fY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JaWYgKHR0eSAmJiB0dHktPmNvdW50ID09IDEpIHsKLQkJc3RydWN0IHZjX2RhdGEgKnZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiBOb3RoaW5nIHRvIGRvIC0gd2UgZGVmZXIgdG8gc2h1dGRvd24gKi8KK30KIAotCQlpZiAodmMpCi0JCQl2Yy0+dmNfdHR5ID0gTlVMTDsKLQkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXZjc19yZW1vdmVfc3lzZnModHR5KTsKLQkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0JCS8qCi0JCSAqIHR0eV9tdXRleCBpcyByZWxlYXNlZCwgYnV0IHdlIHN0aWxsIGhvbGQgQktMLCBzbyB0aGVyZSBpcwotCQkgKiBzdGlsbCBleGNsdXNpb24gYWdhaW5zdCBpbml0X2RldigpCi0JCSAqLwotCQlyZXR1cm47Ci0JfQorc3RhdGljIHZvaWQgY29uX3NodXRkb3duKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHZjX2RhdGEgKnZjID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlCVUdfT04odmMgPT0gTlVMTCk7CisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCXZjLT52Y190dHkgPSBOVUxMOworCXZjc19yZW1vdmVfc3lzZnModHR5KTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7Ci0JbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOworCXR0eV9zaHV0ZG93bih0dHkpOwogfQogCiBzdGF0aWMgaW50IGRlZmF1bHRfaXRhbGljX2NvbG9yICAgID0gMjsgLy8gZ3JlZW4gKEFTQ0lJKQpAQCAtMjk1MCwxMCArMjkxOSwxOSBAQAogCS50aHJvdHRsZSA9IGNvbl90aHJvdHRsZSwKIAkudW50aHJvdHRsZSA9IGNvbl91bnRocm90dGxlLAogCS5yZXNpemUgPSB2dF9yZXNpemUsCisJLnNodXRkb3duID0gY29uX3NodXRkb3duCiB9OwogCi1pbnQgX19pbml0IHZ0eV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGNkZXYgdmMwX2NkZXY7CisKK2ludCBfX2luaXQgdnR5X2luaXQoY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqY29uc29sZV9mb3BzKQogeworCWNkZXZfaW5pdCgmdmMwX2NkZXYsIGNvbnNvbGVfZm9wcyk7CisJaWYgKGNkZXZfYWRkKCZ2YzBfY2RldiwgTUtERVYoVFRZX01BSk9SLCAwKSwgMSkgfHwKKwkgICAgcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihUVFlfTUFKT1IsIDApLCAxLCAiL2Rldi92Yy8wIikgPCAwKQorCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi90dHkwIGRyaXZlclxuIik7CisJZGV2aWNlX2NyZWF0ZSh0dHlfY2xhc3MsIE5VTEwsIE1LREVWKFRUWV9NQUpPUiwgMCksIE5VTEwsICJ0dHkwIik7CisKIAl2Y3NfaW5pdCgpOwogCiAJY29uc29sZV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1BWF9OUl9DT05TT0xFUyk7CkBAIC0yOTcyLDcgKzI5NTAsNiBAQAogCXR0eV9zZXRfb3BlcmF0aW9ucyhjb25zb2xlX2RyaXZlciwgJmNvbl9vcHMpOwogCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGNvbnNvbGVfZHJpdmVyKSkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGNvbnNvbGUgZHJpdmVyXG4iKTsKLQogCWtiZF9pbml0KCk7CiAJY29uc29sZV9tYXBfaW5pdCgpOwogI2lmZGVmIENPTkZJR19QUk9NX0NPTlNPTEUKQEAgLTM0NjYsNyArMzQ0Myw3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnI7CiAKLQljb25fZHJpdmVyLT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodnRjb25zb2xlX2NsYXNzLCBOVUxMLAorCWNvbl9kcml2ZXItPmRldiA9IGRldmljZV9jcmVhdGUodnRjb25zb2xlX2NsYXNzLCBOVUxMLAogCQkJCQkJTUtERVYoMCwgY29uX2RyaXZlci0+bm9kZSksCiAJCQkJCQlOVUxMLCAidnRjb24laSIsCiAJCQkJCQljb25fZHJpdmVyLT5ub2RlKTsKQEAgLTM1NzcsNyArMzU1NCw3IEBACiAJCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSAmcmVnaXN0ZXJlZF9jb25fZHJpdmVyW2ldOwogCiAJCWlmIChjb24tPmNvbiAmJiAhY29uLT5kZXYpIHsKLQkJCWNvbi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHZ0Y29uc29sZV9jbGFzcywgTlVMTCwKKwkJCWNvbi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh2dGNvbnNvbGVfY2xhc3MsIE5VTEwsCiAJCQkJCQkJIE1LREVWKDAsIGNvbi0+bm9kZSksCiAJCQkJCQkJIE5VTEwsICJ2dGNvbiVpIiwKIAkJCQkJCQkgY29uLT5ub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKaW5kZXggYzkwNGU5YS4uODk0NGNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKQEAgLTM5NSw2ICszOTUsOCBAQAogIAogCWtiZCA9IGtiZF90YWJsZSArIGNvbnNvbGU7CiAJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NMSU5VWDoKKwkJcmV0dXJuIHRpb2NsaW51eCh0dHksIGFyZyk7CiAJY2FzZSBLSU9DU09VTkQ6CiAJCWlmICghcGVybSkKIAkJCWdvdG8gZXBlcm07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMKaW5kZXggMjc4Yzk4NS4uZWQxMzJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAveGlsaW54X2h3aWNhcC5jCisrKyBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYwpAQCAtNjU3LDggKzY1Nyw3IEBACiAJCWdvdG8gZmFpbGVkMzsKIAl9CiAKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEoaWNhcF9jbGFzcywgZGV2LCBkZXZ0LCBOVUxMLAotCQkJICAgICAgIiVzJWQiLCBEUklWRVJfTkFNRSwgaWQpOworCWRldmljZV9jcmVhdGUoaWNhcF9jbGFzcywgZGV2LCBkZXZ0LCBOVUxMLCAiJXMlZCIsIERSSVZFUl9OQU1FLCBpZCk7CiAJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCiAKICBmYWlsZWQzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwppbmRleCA1Y2ExZDgwLi43MWQyYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qCkBAIC0xNTEsMTMgKzE1MiwxMyBAQAogICovCiBzdGF0aWMgaW50IHZlcmlmeV9wbXRtcl9yYXRlKHZvaWQpCiB7Ci0JdTMyIHZhbHVlMSwgdmFsdWUyOworCWN5Y2xlX3QgdmFsdWUxLCB2YWx1ZTI7CiAJdW5zaWduZWQgbG9uZyBjb3VudCwgZGVsdGE7CiAKIAltYWNoX3ByZXBhcmVfY291bnRlcigpOwotCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwl2YWx1ZTEgPSBjbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQoKTsKIAltYWNoX2NvdW50dXAoJmNvdW50KTsKLQl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJdmFsdWUyID0gY2xvY2tzb3VyY2VfYWNwaV9wbS5yZWFkKCk7CiAJZGVsdGEgPSAodmFsdWUyIC0gdmFsdWUxKSAmIEFDUElfUE1fTUFTSzsKIAogCS8qIENoZWNrIHRoYXQgdGhlIFBNVE1SIGRlbHRhIGlzIHdpdGhpbiA1JSBvZiB3aGF0IHdlIGV4cGVjdCAqLwpAQCAtMTc1LDEwICsxNzYsMTUgQEAKICNkZWZpbmUgdmVyaWZ5X3BtdG1yX3JhdGUoKSAoMCkKICNlbmRpZgogCisvKiBOdW1iZXIgb2YgbW9ub3RvbmljaXR5IGNoZWNrcyB0byBwZXJmb3JtIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBBQ1BJX1BNX01PTk9UT05JQ0lUWV9DSEVDS1MgMTAKKy8qIE51bWJlciBvZiByZWFkcyB3ZSB0cnkgdG8gZ2V0IHR3byBkaWZmZXJlbnQgdmFsdWVzICovCisjZGVmaW5lIEFDUElfUE1fUkVBRF9DSEVDS1MgMTAwMDAKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9hY3BpX3BtX2Nsb2Nrc291cmNlKHZvaWQpCiB7Ci0JdTMyIHZhbHVlMSwgdmFsdWUyOwotCXVuc2lnbmVkIGludCBpOworCWN5Y2xlX3QgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgaW50IGksIGogPSAwOwogCiAJaWYgKCFwbXRtcl9pb3BvcnQpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTg3LDI0ICsxOTMsMjkgQEAKIAkJCQkJCWNsb2Nrc291cmNlX2FjcGlfcG0uc2hpZnQpOwogCiAJLyogInZlcmlmeSIgdGhpcyB0aW1pbmcgc291cmNlOiAqLwotCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7Ci0JCWlmICh2YWx1ZTIgPT0gdmFsdWUxKQotCQkJY29udGludWU7Ci0JCWlmICh2YWx1ZTIgPiB2YWx1ZTEpCi0JCQlnb3RvIHBtX2dvb2Q7Ci0JCWlmICgodmFsdWUyIDwgdmFsdWUxKSAmJiAoKHZhbHVlMikgPCAweEZGRikpCi0JCQlnb3RvIHBtX2dvb2Q7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBpbmNvbnNpc3RlbnQgcmVzdWx0czoiCi0JCQkiIDB4JSN4LCAweCUjeCAtIGFib3J0aW5nLlxuIiwgdmFsdWUxLCB2YWx1ZTIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGogPSAwOyBqIDwgQUNQSV9QTV9NT05PVE9OSUNJVFlfQ0hFQ0tTOyBqKyspIHsKKwkJdWRlbGF5KDEwMCAqIGopOworCQl2YWx1ZTEgPSBjbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQoKTsKKwkJZm9yIChpID0gMDsgaSA8IEFDUElfUE1fUkVBRF9DSEVDS1M7IGkrKykgeworCQkJdmFsdWUyID0gY2xvY2tzb3VyY2VfYWNwaV9wbS5yZWFkKCk7CisJCQlpZiAodmFsdWUyID09IHZhbHVlMSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh2YWx1ZTIgPiB2YWx1ZTEpCisJCQkJYnJlYWs7CisJCQlpZiAoKHZhbHVlMiA8IHZhbHVlMSkgJiYgKCh2YWx1ZTIpIDwgMHhGRkYpKQorCQkJCWJyZWFrOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUE0tVGltZXIgaGFkIGluY29uc2lzdGVudCByZXN1bHRzOiIKKwkJCSAgICAgICAiIDB4JSNsbHgsIDB4JSNsbHggLSBhYm9ydGluZy5cbiIsCisJCQkgICAgICAgdmFsdWUxLCB2YWx1ZTIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGkgPT0gQUNQSV9QTV9SRUFEX0NIRUNLUykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUE0tVGltZXIgZmFpbGVkIGNvbnNpc3RlbmN5IGNoZWNrICIKKwkJCSAgICAgICAiICgweCUjbGx4KSAtIGFib3J0aW5nLlxuIiwgdmFsdWUxKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CiAJfQotCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBubyByZWFzb25hYmxlIHJlc3VsdDoiCi0JCQkiIDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEpOwotCXJldHVybiAtRU5PREVWOwogCi1wbV9nb29kOgogCWlmICh2ZXJpZnlfcG10bXJfcmF0ZSgpICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCA4YTY3ZjE2Li4zMWQ2ZjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTE0NjcsMjUgKzE0NjcsMjcgQEAKIAkJCSAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAogCQkJICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChwb2xpY3ktPmNwdSk7CiAJaWYgKCFwb2xpY3kpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG5vX3BvbGljeTsKIAogCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBmYWlsOwogCiAJcmV0ID0gX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCB0YXJnZXRfZnJlcSwgcmVsYXRpb24pOwogCiAJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSk7CiAKK2ZhaWw6CiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7Citub19wb2xpY3k6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX3RhcmdldCk7CiAKLWludCBfX2NwdWZyZXFfZHJpdmVyX2dldGF2ZyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK2ludCBfX2NwdWZyZXFfZHJpdmVyX2dldGF2ZyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTQ5Myw4ICsxNDk1LDggQEAKIAlpZiAoIXBvbGljeSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY3B1X29ubGluZShwb2xpY3ktPmNwdSkgJiYgY3B1ZnJlcV9kcml2ZXItPmdldGF2ZykKLQkJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmdldGF2Zyhwb2xpY3ktPmNwdSk7CisJaWYgKGNwdV9vbmxpbmUoY3B1KSAmJiBjcHVmcmVxX2RyaXZlci0+Z2V0YXZnKQorCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+Z2V0YXZnKHBvbGljeSwgY3B1KTsKIAogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCXJldHVybiByZXQ7CkBAIC0xNzE3LDEzICsxNzE5LDE3IEBACiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpkYXRhID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5IHBvbGljeTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWRhdGEpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBub19wb2xpY3k7CisJfQogCi0JaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KIAogCWRwcmludGsoInVwZGF0aW5nIHBvbGljeSBmb3IgQ1BVICV1XG4iLCBjcHUpOwogCW1lbWNweSgmcG9saWN5LCBkYXRhLCBzaXplb2Yoc3RydWN0IGNwdWZyZXFfcG9saWN5KSk7CkBAIC0xNzUwLDcgKzE3NTYsOSBAQAogCiAJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCitmYWlsOgogCWNwdWZyZXFfY3B1X3B1dChkYXRhKTsKK25vX3BvbGljeToKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChjcHVmcmVxX3VwZGF0ZV9wb2xpY3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwppbmRleCBhYzBiYmYyLi5lMjY1NzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwpAQCAtNDYwLDYgKzQ2MCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdCh2b2lkKQogeworCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmZGJzX3dvcmsudGltZXIpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGJzX3dvcmssCiAJCQl1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpKTsKIAlyZXR1cm47CkBAIC01NzUsMTMgKzU3NiwxNSBAQAogCXJldHVybiAwOwogfQogCisjaWZuZGVmIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9DT05TRVJWQVRJVkUKK3N0YXRpYworI2VuZGlmCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciBjcHVmcmVxX2dvdl9jb25zZXJ2YXRpdmUgPSB7CiAJLm5hbWUJCQk9ICJjb25zZXJ2YXRpdmUiLAogCS5nb3Zlcm5vcgkJPSBjcHVmcmVxX2dvdmVybm9yX2RicywKIAkubWF4X3RyYW5zaXRpb25fbGF0ZW5jeQk9IFRSQU5TSVRJT05fTEFURU5DWV9MSU1JVCwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogfTsKLUVYUE9SVF9TWU1CT0woY3B1ZnJlcV9nb3ZfY29uc2VydmF0aXZlKTsKIAogc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9nb3ZfZGJzX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCmluZGV4IDMzODU1Y2IuLjJhYjNjMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwpAQCAtMTgsMTMgKzE4LDE5IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAKIC8qCiAgKiBkYnMgaXMgdXNlZCBpbiB0aGlzIGZpbGUgYXMgYSBzaG9ydGZvcm0gZm9yIGRlbWFuZGJhc2VkIHN3aXRjaGluZwogICogSXQgaGVscHMgdG8ga2VlcCB2YXJpYWJsZSBuYW1lcyBzbWFsbGVyLCBzaW1wbGVyCiAgKi8KIAorI2RlZmluZSBERUZfRlJFUVVFTkNZX0RPV05fRElGRkVSRU5USUFMCQkoMTApCiAjZGVmaW5lIERFRl9GUkVRVUVOQ1lfVVBfVEhSRVNIT0xECQkoODApCisjZGVmaW5lIE1JQ1JPX0ZSRVFVRU5DWV9ET1dOX0RJRkZFUkVOVElBTAkoMykKKyNkZWZpbmUgTUlDUk9fRlJFUVVFTkNZX1VQX1RIUkVTSE9MRAkJKDk1KQogI2RlZmluZSBNSU5fRlJFUVVFTkNZX1VQX1RIUkVTSE9MRAkJKDExKQogI2RlZmluZSBNQVhfRlJFUVVFTkNZX1VQX1RIUkVTSE9MRAkJKDEwMCkKIApAQCAtNTcsNiArNjMsNyBAQAogc3RydWN0IGNwdV9kYnNfaW5mb19zIHsKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV9pZGxlOwogCWNwdXRpbWU2NF90IHByZXZfY3B1X3dhbGw7CisJY3B1dGltZTY0X3QgcHJldl9jcHVfbmljZTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmN1cl9wb2xpY3k7CiAgCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGU7CkBAIC04NiwyMSArOTMsMjQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGJzX3R1bmVycyB7CiAJdW5zaWduZWQgaW50IHNhbXBsaW5nX3JhdGU7CiAJdW5zaWduZWQgaW50IHVwX3RocmVzaG9sZDsKKwl1bnNpZ25lZCBpbnQgZG93bl9kaWZmZXJlbnRpYWw7CiAJdW5zaWduZWQgaW50IGlnbm9yZV9uaWNlOwogCXVuc2lnbmVkIGludCBwb3dlcnNhdmVfYmlhczsKIH0gZGJzX3R1bmVyc19pbnMgPSB7CiAJLnVwX3RocmVzaG9sZCA9IERFRl9GUkVRVUVOQ1lfVVBfVEhSRVNIT0xELAorCS5kb3duX2RpZmZlcmVudGlhbCA9IERFRl9GUkVRVUVOQ1lfRE9XTl9ESUZGRVJFTlRJQUwsCiAJLmlnbm9yZV9uaWNlID0gMCwKIAkucG93ZXJzYXZlX2JpYXMgPSAwLAogfTsKIAotc3RhdGljIGlubGluZSBjcHV0aW1lNjRfdCBnZXRfY3B1X2lkbGVfdGltZSh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGlubGluZSBjcHV0aW1lNjRfdCBnZXRfY3B1X2lkbGVfdGltZV9qaWZmeSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJCWNwdXRpbWU2NF90ICp3YWxsKQogewogCWNwdXRpbWU2NF90IGlkbGVfdGltZTsKLQljcHV0aW1lNjRfdCBjdXJfamlmZmllczsKKwljcHV0aW1lNjRfdCBjdXJfd2FsbF90aW1lOwogCWNwdXRpbWU2NF90IGJ1c3lfdGltZTsKIAotCWN1cl9qaWZmaWVzID0gamlmZmllczY0X3RvX2NwdXRpbWU2NChnZXRfamlmZmllc182NCgpKTsKKwljdXJfd2FsbF90aW1lID0gamlmZmllczY0X3RvX2NwdXRpbWU2NChnZXRfamlmZmllc182NCgpKTsKIAlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGtzdGF0X2NwdShjcHUpLmNwdXN0YXQudXNlciwKIAkJCWtzdGF0X2NwdShjcHUpLmNwdXN0YXQuc3lzdGVtKTsKIApAQCAtMTEzLDcgKzEyMywzNyBAQAogCQkJCWtzdGF0X2NwdShjcHUpLmNwdXN0YXQubmljZSk7CiAJfQogCi0JaWRsZV90aW1lID0gY3B1dGltZTY0X3N1YihjdXJfamlmZmllcywgYnVzeV90aW1lKTsKKwlpZGxlX3RpbWUgPSBjcHV0aW1lNjRfc3ViKGN1cl93YWxsX3RpbWUsIGJ1c3lfdGltZSk7CisJaWYgKHdhbGwpCisJCSp3YWxsID0gY3VyX3dhbGxfdGltZTsKKworCXJldHVybiBpZGxlX3RpbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgY3B1dGltZTY0X3QgZ2V0X2NwdV9pZGxlX3RpbWUodW5zaWduZWQgaW50IGNwdSwgY3B1dGltZTY0X3QgKndhbGwpCit7CisJdTY0IGlkbGVfdGltZSA9IGdldF9jcHVfaWRsZV90aW1lX3VzKGNwdSwgd2FsbCk7CisKKwlpZiAoaWRsZV90aW1lID09IC0xVUxMKQorCQlyZXR1cm4gZ2V0X2NwdV9pZGxlX3RpbWVfamlmZnkoY3B1LCB3YWxsKTsKKworCWlmIChkYnNfdHVuZXJzX2lucy5pZ25vcmVfbmljZSkgeworCQljcHV0aW1lNjRfdCBjdXJfbmljZTsKKwkJdW5zaWduZWQgbG9uZyBjdXJfbmljZV9qaWZmaWVzOworCQlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmRic19pbmZvOworCisJCWRic19pbmZvID0gJnBlcl9jcHUoY3B1X2Ric19pbmZvLCBjcHUpOworCQljdXJfbmljZSA9IGNwdXRpbWU2NF9zdWIoa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5uaWNlLAorCQkJCQkgZGJzX2luZm8tPnByZXZfY3B1X25pY2UpOworCQkvKgorCQkgKiBBc3N1bXB0aW9uOiBuaWNlIHRpbWUgYmV0d2VlbiBzYW1wbGluZyBwZXJpb2RzIHdpbGwgYmUKKwkJICogbGVzcyB0aGFuIDJeMzIgamlmZmllcyBmb3IgMzIgYml0IHN5cworCQkgKi8KKwkJY3VyX25pY2VfamlmZmllcyA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQljcHV0aW1lNjRfdG9famlmZmllczY0KGN1cl9uaWNlKTsKKwkJZGJzX2luZm8tPnByZXZfY3B1X25pY2UgPSBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lm5pY2U7CisJCXJldHVybiBpZGxlX3RpbWUgKyBqaWZmaWVzX3RvX3VzZWNzKGN1cl9uaWNlX2ppZmZpZXMpOworCX0KIAlyZXR1cm4gaWRsZV90aW1lOwogfQogCkBAIC0yNzcsOCArMzE3LDggQEAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGopIHsKIAkJc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbzsKIAkJZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGopOwotCQlkYnNfaW5mby0+cHJldl9jcHVfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGopOwotCQlkYnNfaW5mby0+cHJldl9jcHVfd2FsbCA9IGdldF9qaWZmaWVzXzY0KCk7CisJCWRic19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaiwKKwkJCQkJCSZkYnNfaW5mby0+cHJldl9jcHVfd2FsbCk7CiAJfQogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIApAQCAtMzM0LDkgKzM3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGRic19jaGVja19jcHUoc3RydWN0IGNwdV9kYnNfaW5mb19zICp0aGlzX2Ric19pbmZvKQogewotCXVuc2lnbmVkIGludCBpZGxlX3RpY2tzLCB0b3RhbF90aWNrczsKLQl1bnNpZ25lZCBpbnQgbG9hZCA9IDA7Ci0JY3B1dGltZTY0X3QgY3VyX2ppZmZpZXM7CisJdW5zaWduZWQgaW50IG1heF9sb2FkX2ZyZXE7CiAKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAl1bnNpZ25lZCBpbnQgajsKQEAgLTM0NiwxMyArMzg0LDcgQEAKIAogCXRoaXNfZGJzX2luZm8tPmZyZXFfbG8gPSAwOwogCXBvbGljeSA9IHRoaXNfZGJzX2luZm8tPmN1cl9wb2xpY3k7Ci0JY3VyX2ppZmZpZXMgPSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KGdldF9qaWZmaWVzXzY0KCkpOwotCXRvdGFsX3RpY2tzID0gKHVuc2lnbmVkIGludCkgY3B1dGltZTY0X3N1YihjdXJfamlmZmllcywKLQkJCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwotCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwgPSBnZXRfamlmZmllc182NCgpOwogCi0JaWYgKCF0b3RhbF90aWNrcykKLQkJcmV0dXJuOwogCS8qCiAJICogRXZlcnkgc2FtcGxpbmdfcmF0ZSwgd2UgY2hlY2ssIGlmIGN1cnJlbnQgaWRsZSB0aW1lIGlzIGxlc3MKIAkgKiB0aGFuIDIwJSAoZGVmYXVsdCksIHRoZW4gd2UgdHJ5IHRvIGluY3JlYXNlIGZyZXF1ZW5jeQpAQCAtMzY1LDI3ICszOTcsNDQgQEAKIAkgKiA1JSAoZGVmYXVsdCkgb2YgY3VycmVudCBmcmVxdWVuY3kKIAkgKi8KIAotCS8qIEdldCBJZGxlIFRpbWUgKi8KLQlpZGxlX3RpY2tzID0gVUlOVF9NQVg7CisJLyogR2V0IEFic29sdXRlIExvYWQgLSBpbiB0ZXJtcyBvZiBmcmVxICovCisJbWF4X2xvYWRfZnJlcSA9IDA7CisKIAlmb3JfZWFjaF9jcHVfbWFza19ucihqLCBwb2xpY3ktPmNwdXMpIHsKLQkJY3B1dGltZTY0X3QgdG90YWxfaWRsZV90aWNrczsKLQkJdW5zaWduZWQgaW50IHRtcF9pZGxlX3RpY2tzOwogCQlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmpfZGJzX2luZm87CisJCWNwdXRpbWU2NF90IGN1cl93YWxsX3RpbWUsIGN1cl9pZGxlX3RpbWU7CisJCXVuc2lnbmVkIGludCBpZGxlX3RpbWUsIHdhbGxfdGltZTsKKwkJdW5zaWduZWQgaW50IGxvYWQsIGxvYWRfZnJlcTsKKwkJaW50IGZyZXFfYXZnOwogCiAJCWpfZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGopOwotCQl0b3RhbF9pZGxlX3RpY2tzID0gZ2V0X2NwdV9pZGxlX3RpbWUoaik7Ci0JCXRtcF9pZGxlX3RpY2tzID0gKHVuc2lnbmVkIGludCkgY3B1dGltZTY0X3N1Yih0b3RhbF9pZGxlX3RpY2tzLAotCQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUpOwotCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gdG90YWxfaWRsZV90aWNrczsKIAotCQlpZiAodG1wX2lkbGVfdGlja3MgPCBpZGxlX3RpY2tzKQotCQkJaWRsZV90aWNrcyA9IHRtcF9pZGxlX3RpY2tzOworCQljdXJfaWRsZV90aW1lID0gZ2V0X2NwdV9pZGxlX3RpbWUoaiwgJmN1cl93YWxsX3RpbWUpOworCisJCXdhbGxfdGltZSA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIoY3VyX3dhbGxfdGltZSwKKwkJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsKTsKKwkJal9kYnNfaW5mby0+cHJldl9jcHVfd2FsbCA9IGN1cl93YWxsX3RpbWU7CisKKwkJaWRsZV90aW1lID0gKHVuc2lnbmVkIGludCkgY3B1dGltZTY0X3N1YihjdXJfaWRsZV90aW1lLAorCQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUpOworCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gY3VyX2lkbGVfdGltZTsKKworCQlpZiAodW5saWtlbHkoIXdhbGxfdGltZSB8fCB3YWxsX3RpbWUgPCBpZGxlX3RpbWUpKQorCQkJY29udGludWU7CisKKwkJbG9hZCA9IDEwMCAqICh3YWxsX3RpbWUgLSBpZGxlX3RpbWUpIC8gd2FsbF90aW1lOworCisJCWZyZXFfYXZnID0gX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcocG9saWN5LCBqKTsKKwkJaWYgKGZyZXFfYXZnIDw9IDApCisJCQlmcmVxX2F2ZyA9IHBvbGljeS0+Y3VyOworCisJCWxvYWRfZnJlcSA9IGxvYWQgKiBmcmVxX2F2ZzsKKwkJaWYgKGxvYWRfZnJlcSA+IG1heF9sb2FkX2ZyZXEpCisJCQltYXhfbG9hZF9mcmVxID0gbG9hZF9mcmVxOwogCX0KLQlpZiAobGlrZWx5KHRvdGFsX3RpY2tzID4gaWRsZV90aWNrcykpCi0JCWxvYWQgPSAoMTAwICogKHRvdGFsX3RpY2tzIC0gaWRsZV90aWNrcykpIC8gdG90YWxfdGlja3M7CiAKIAkvKiBDaGVjayBmb3IgZnJlcXVlbmN5IGluY3JlYXNlICovCi0JaWYgKGxvYWQgPiBkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQpIHsKKwlpZiAobWF4X2xvYWRfZnJlcSA+IGRic190dW5lcnNfaW5zLnVwX3RocmVzaG9sZCAqIHBvbGljeS0+Y3VyKSB7CiAJCS8qIGlmIHdlIGFyZSBhbHJlYWR5IGF0IGZ1bGwgc3BlZWQgdGhlbiBicmVhayBvdXQgZWFybHkgKi8KIAkJaWYgKCFkYnNfdHVuZXJzX2lucy5wb3dlcnNhdmVfYmlhcykgewogCQkJaWYgKHBvbGljeS0+Y3VyID09IHBvbGljeS0+bWF4KQpAQCAtNDEyLDE1ICs0NjEsMTMgQEAKIAkgKiBjYW4gc3VwcG9ydCB0aGUgY3VycmVudCBDUFUgdXNhZ2Ugd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSB1cAogCSAqIHBvbGljeS4gVG8gYmUgc2FmZSwgd2UgZm9jdXMgMTAgcG9pbnRzIHVuZGVyIHRoZSB0aHJlc2hvbGQuCiAJICovCi0JaWYgKGxvYWQgPCAoZGJzX3R1bmVyc19pbnMudXBfdGhyZXNob2xkIC0gMTApKSB7Ci0JCXVuc2lnbmVkIGludCBmcmVxX25leHQsIGZyZXFfY3VyOwotCi0JCWZyZXFfY3VyID0gX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcocG9saWN5KTsKLQkJaWYgKCFmcmVxX2N1cikKLQkJCWZyZXFfY3VyID0gcG9saWN5LT5jdXI7Ci0KLQkJZnJlcV9uZXh0ID0gKGZyZXFfY3VyICogbG9hZCkgLwotCQkJKGRic190dW5lcnNfaW5zLnVwX3RocmVzaG9sZCAtIDEwKTsKKwlpZiAobWF4X2xvYWRfZnJlcSA8CisJICAgIChkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQgLSBkYnNfdHVuZXJzX2lucy5kb3duX2RpZmZlcmVudGlhbCkgKgorCSAgICAgcG9saWN5LT5jdXIpIHsKKwkJdW5zaWduZWQgaW50IGZyZXFfbmV4dDsKKwkJZnJlcV9uZXh0ID0gbWF4X2xvYWRfZnJlcSAvCisJCQkJKGRic190dW5lcnNfaW5zLnVwX3RocmVzaG9sZCAtCisJCQkJIGRic190dW5lcnNfaW5zLmRvd25fZGlmZmVyZW50aWFsKTsKIAogCQlpZiAoIWRic190dW5lcnNfaW5zLnBvd2Vyc2F2ZV9iaWFzKSB7CiAJCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIGZyZXFfbmV4dCwKQEAgLTUyNiw4ICs1NzMsOCBAQAogCQkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7CiAJCQlqX2Ric19pbmZvLT5jdXJfcG9saWN5ID0gcG9saWN5OwogCi0JCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaik7Ci0JCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZShqLAorCQkJCQkJJmpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwogCQl9CiAJCXRoaXNfZGJzX2luZm8tPmNwdSA9IGNwdTsKIAkJLyoKQEAgLTU3OSwyMiArNjI2LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5ECitzdGF0aWMKKyNlbmRpZgogc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgY3B1ZnJlcV9nb3Zfb25kZW1hbmQgPSB7CiAJLm5hbWUJCQk9ICJvbmRlbWFuZCIsCiAJLmdvdmVybm9yCQk9IGNwdWZyZXFfZ292ZXJub3JfZGJzLAogCS5tYXhfdHJhbnNpdGlvbl9sYXRlbmN5ID0gVFJBTlNJVElPTl9MQVRFTkNZX0xJTUlULAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiB9OwotRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dvdl9vbmRlbWFuZCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZ292X2Ric19pbml0KHZvaWQpCiB7CisJaW50IGVycjsKKwljcHV0aW1lNjRfdCB3YWxsOworCXU2NCBpZGxlX3RpbWU7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKworCWlkbGVfdGltZSA9IGdldF9jcHVfaWRsZV90aW1lX3VzKGNwdSwgJndhbGwpOworCXB1dF9jcHUoKTsKKwlpZiAoaWRsZV90aW1lICE9IC0xVUxMKSB7CisJCS8qIElkbGUgbWljcm8gYWNjb3VudGluZyBpcyBzdXBwb3J0ZWQuIFVzZSBmaW5lciB0aHJlc2hvbGRzICovCisJCWRic190dW5lcnNfaW5zLnVwX3RocmVzaG9sZCA9IE1JQ1JPX0ZSRVFVRU5DWV9VUF9USFJFU0hPTEQ7CisJCWRic190dW5lcnNfaW5zLmRvd25fZGlmZmVyZW50aWFsID0KKwkJCQkJTUlDUk9fRlJFUVVFTkNZX0RPV05fRElGRkVSRU5USUFMOworCX0KKwogCWtvbmRlbWFuZF93cSA9IGNyZWF0ZV93b3JrcXVldWUoImtvbmRlbWFuZCIpOwogCWlmICgha29uZGVtYW5kX3dxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ3JlYXRpb24gb2Yga29uZGVtYW5kIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KLQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9nb3Zlcm5vcigmY3B1ZnJlcV9nb3Zfb25kZW1hbmQpOworCWVyciA9IGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X29uZGVtYW5kKTsKKwlpZiAoZXJyKQorCQlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNwdWZyZXFfZ292X2Ric19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wZXJmb3JtYW5jZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcGVyZm9ybWFuY2UuYwppbmRleCBlOGUxNDUxLi43ZTJlNTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wZXJmb3JtYW5jZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3BlcmZvcm1hbmNlLmMKQEAgLTM2LDEyICszNiwxNCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRV9NT0RVTEUKK3N0YXRpYworI2VuZGlmCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciBjcHVmcmVxX2dvdl9wZXJmb3JtYW5jZSA9IHsKIAkubmFtZQkJPSAicGVyZm9ybWFuY2UiLAogCS5nb3Zlcm5vcgk9IGNwdWZyZXFfZ292ZXJub3JfcGVyZm9ybWFuY2UsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKLUVYUE9SVF9TWU1CT0woY3B1ZnJlcV9nb3ZfcGVyZm9ybWFuY2UpOwogCiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZ292X3BlcmZvcm1hbmNlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3Bvd2Vyc2F2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcG93ZXJzYXZlLmMKaW5kZXggODhkMmY0NC4uZTZkYjVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcG93ZXJzYXZlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcG93ZXJzYXZlLmMKQEAgLTM1LDEyICszNSwxNCBAQAogCXJldHVybiAwOwogfQogCisjaWZuZGVmIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QT1dFUlNBVkUKK3N0YXRpYworI2VuZGlmCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciBjcHVmcmVxX2dvdl9wb3dlcnNhdmUgPSB7CiAJLm5hbWUJCT0gInBvd2Vyc2F2ZSIsCiAJLmdvdmVybm9yCT0gY3B1ZnJlcV9nb3Zlcm5vcl9wb3dlcnNhdmUsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKLUVYUE9SVF9TWU1CT0woY3B1ZnJlcV9nb3ZfcG93ZXJzYXZlKTsKIAogc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9nb3ZfcG93ZXJzYXZlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKaW5kZXggMzIyNDRhYS4uMTQ0MmJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKQEAgLTE4Nyw2ICsxODcsOSBAQAogfQogCiAKKyNpZm5kZWYgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRQorc3RhdGljCisjZW5kaWYKIHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yIGNwdWZyZXFfZ292X3VzZXJzcGFjZSA9IHsKIAkubmFtZQkJPSAidXNlcnNwYWNlIiwKIAkuZ292ZXJub3IJPSBjcHVmcmVxX2dvdmVybm9yX3VzZXJzcGFjZSwKQEAgLTE5NCw3ICsxOTcsNiBAQAogCS5zaG93X3NldHNwZWVkCT0gc2hvd19zcGVlZCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwotRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dvdl91c2Vyc3BhY2UpOwogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX2dvdl91c2Vyc3BhY2VfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jIGIvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCmluZGV4IGVlODI3YTcuLmI2YWQzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYworKysgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKQEAgLTExNTcsNiArMTE1Nyw4IEBACiAJZWRlc2MtPmRlc2MuaGRyID0gY3R4LT5kZXNjX2hkcl90ZW1wbGF0ZSB8IERFU0NfSERSX01PREUwX0VOQ1JZUFQ7CiAKIAltZW1jcHkocmVxLT5naXYsIGN0eC0+aXYsIGNyeXB0b19hZWFkX2l2c2l6ZShhdXRoZW5jKSk7CisJLyogYXZvaWQgY29uc2VjdXRpdmUgcGFja2V0cyBnb2luZyBvdXQgd2l0aCBzYW1lIElWICovCisJKihfX2JlNjQgKilyZXEtPmdpdiBePSBjcHVfdG9fYmU2NChyZXEtPnNlcSk7CiAKIAlyZXR1cm4gaXBzZWNfZXNwKGVkZXNjLCBhcmVxLCByZXEtPmdpdiwgcmVxLT5zZXEsCiAJCQkgaXBzZWNfZXNwX2VuY3J5cHRfZG9uZSk7CkBAIC0xNDQ5LDYgKzE0NTEsOCBAQAogCiAJcHJpdi0+b2ZkZXYgPSBvZmRldjsKIAorCUlOSVRfTElTVF9IRUFEKCZwcml2LT5hbGdfbGlzdCk7CisKIAl0YXNrbGV0X2luaXQoJnByaXYtPmRvbmVfdGFzaywgdGFsaXRvc19kb25lLCAodW5zaWduZWQgbG9uZylkZXYpOwogCXRhc2tsZXRfaW5pdCgmcHJpdi0+ZXJyb3JfdGFzaywgdGFsaXRvc19lcnJvciwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIApAQCAtMTU3NSw4ICsxNTc5LDYgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBjcnlwdG8gYWxnb3JpdGhtcyB0aGUgZGV2aWNlIHN1cHBvcnRzICovCi0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPmFsZ19saXN0KTsKLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRyaXZlcl9hbGdzKTsgaSsrKSB7CiAJCWlmIChod19zdXBwb3J0cyhkZXYsIGRyaXZlcl9hbGdzW2ldLmRlc2NfaGRyX3RlbXBsYXRlKSkgewogCQkJc3RydWN0IHRhbGl0b3NfY3J5cHRvX2FsZyAqdF9hbGc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYyBiL2RyaXZlcnMvZGNhL2RjYS1zeXNmcy5jCmluZGV4IDdhZjRiNDAuLmJiNTM4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGNhL2RjYS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvZGNhL2RjYS1zeXNmcy5jCkBAIC0xNSw5ICsxNSw4IEBACiAJc3RydWN0IGRldmljZSAqY2Q7CiAJc3RhdGljIGludCByZXFfY291bnQ7CiAKLQljZCA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShkY2FfY2xhc3MsIGRjYS0+Y2QsCi0JCQkJICAgTUtERVYoMCwgc2xvdCArIDEpLCBOVUxMLAotCQkJCSAgICJyZXF1ZXN0ZXIlZCIsIHJlcV9jb3VudCsrKTsKKwljZCA9IGRldmljZV9jcmVhdGUoZGNhX2NsYXNzLCBkY2EtPmNkLCBNS0RFVigwLCBzbG90ICsgMSksIE5VTEwsCisJCQkgICAicmVxdWVzdGVyJWQiLCByZXFfY291bnQrKyk7CiAJaWYgKElTX0VSUihjZCkpCiAJCXJldHVybiBQVFJfRVJSKGNkKTsKIAlyZXR1cm4gMDsKQEAgLTQ4LDggKzQ3LDcgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQljZCA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShkY2FfY2xhc3MsIGRldiwgTUtERVYoMCwgMCksIE5VTEwsCi0JCQkJICAgImRjYSVkIiwgZGNhLT5pZCk7CisJY2QgPSBkZXZpY2VfY3JlYXRlKGRjYV9jbGFzcywgZGV2LCBNS0RFVigwLCAwKSwgTlVMTCwgImRjYSVkIiwgZGNhLT5pZCk7CiAJaWYgKElTX0VSUihjZCkpIHsKIAkJc3Bpbl9sb2NrKCZkY2FfaWRyX2xvY2spOwogCQlpZHJfcmVtb3ZlKCZkY2FfaWRyLCBkY2EtPmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2R3X2RtYWMuYyBiL2RyaXZlcnMvZG1hL2R3X2RtYWMuYwppbmRleCA5NGRmOTE3Li4wNzc4ZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kd19kbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvZHdfZG1hYy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAlpbnQgaTsKIAogCXN0YXR1c19ibG9jayA9IGRtYV9yZWFkbChkdywgUkFXLkJMT0NLKTsKLQlzdGF0dXNfeGZlciA9IGRtYV9yZWFkbChkdywgUkFXLkJMT0NLKTsKKwlzdGF0dXNfeGZlciA9IGRtYV9yZWFkbChkdywgUkFXLlhGRVIpOwogCXN0YXR1c19lcnIgPSBkbWFfcmVhZGwoZHcsIFJBVy5FUlJPUik7CiAKIAlkZXZfdmRiZyhkdy0+ZG1hLmRldiwgInRhc2tsZXQ6IHN0YXR1c19ibG9jaz0leCBzdGF0dXNfZXJyPSV4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k1MDAwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pNTAwMF9lZGFjLmMKaW5kZXggNGExNmI1Yi4uZjBkOWI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k1MDAwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTUwMDBfZWRhYy5jCkBAIC0xMTksNiArMTE5LDcgQEAKICNkZWZpbmUJCQlGRVJSX05GX1VOQ09SUkVDVEFCTEUJKEZFUlJfTkZfTTEyRVJSIHwgXAogCQkJCQkJCUZFUlJfTkZfTTExRVJSIHwgXAogCQkJCQkJCUZFUlJfTkZfTTEwRVJSIHwgXAorCQkJCQkJCUZFUlJfTkZfTTlFUlIgfCBcCiAJCQkJCQkJRkVSUl9ORl9NOEVSUiB8IFwKIAkJCQkJCQlGRVJSX05GX003RVJSIHwgXAogCQkJCQkJCUZFUlJfTkZfTTZFUlIgfCBcCkBAIC0zMDEsNiArMzAyLDkgQEAKIH07CiAjZW5kaWYKIAorLyogZW5hYmxlcyB0aGUgcmVwb3J0IG9mIG1pc2NlbGxhbmVvdXMgbWVzc2FnZXMgYXMgQ0UgZXJyb3JzIC0gZGVmYXVsdCBvZmYgKi8KK3N0YXRpYyBpbnQgbWlzY19tZXNzYWdlczsKKwogLyogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIGRldmljZXMgKi8KIGVudW0gaTUwMDBfY2hpcHMgewogCUk1MDAwUCA9IDAsCkBAIC00NjYsNyArNDcwLDggQEAKIAkJCQkJc3RydWN0IGk1MDAwX2Vycm9yX2luZm8gKmluZm8sCiAJCQkJCWludCBoYW5kbGVfZXJyb3JzKQogewotCWNoYXIgbXNnW0VEQUNfTUNfTEFCRUxfTEVOICsgMSArIDkwXTsKKwljaGFyIG1zZ1tFREFDX01DX0xBQkVMX0xFTiArIDEgKyAxNjBdOworCWNoYXIgKnNwZWNpZmljID0gTlVMTDsKIAl1MzIgYWxsRXJyb3JzOwogCWludCBicmFuY2g7CiAJaW50IGNoYW5uZWw7CkBAIC00ODAsMTEgKzQ4NSw2IEBACiAJaWYgKCFhbGxFcnJvcnMpCiAJCXJldHVybjsJCS8qIGlmIG5vIGVycm9yLCByZXR1cm4gbm93ICovCiAKLQkvKiBPTkxZIE9ORSBvZiB0aGUgcG9zc2libGUgZXJyb3IgYml0cyB3aWxsIGJlIHNldCwgYXMgcGVyIHRoZSBkb2NzICovCi0JaTUwMDBfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkiRkFUQUwgRVJST1JTIEZvdW5kISEhIDFzdCBGQVRBTCBFcnIgUmVnPSAweCV4XG4iLAotCQkJYWxsRXJyb3JzKTsKLQogCWJyYW5jaCA9IEVYVFJBQ1RfRkJEQ0hBTl9JTkRYKGluZm8tPmZlcnJfZmF0X2ZiZCk7CiAJY2hhbm5lbCA9IGJyYW5jaDsKIApAQCAtNTAxLDI4ICs1MDEsNDIgQEAKIAkJcmR3ciA/ICJXcml0ZSIgOiAiUmVhZCIsIHJhcywgY2FzKTsKIAogCS8qIE9ubHkgMSBiaXQgd2lsbCBiZSBvbiAqLwotCWlmIChhbGxFcnJvcnMgJiBGRVJSX0ZBVF9NMUVSUikgewotCQlpNTAwMF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKLQkJCQkiQWxlcnQgb24gbm9uLXJlZHVuZGFudCByZXRyeSBvciBmYXN0ICIKLQkJCQkicmVzZXQgdGltZW91dFxuIik7CisJc3dpdGNoIChhbGxFcnJvcnMpIHsKKwljYXNlIEZFUlJfRkFUX00xRVJSOgorCQlzcGVjaWZpYyA9ICJBbGVydCBvbiBub24tcmVkdW5kYW50IHJldHJ5IG9yIGZhc3QgIgorCQkJCSJyZXNldCB0aW1lb3V0IjsKKwkJYnJlYWs7CisJY2FzZSBGRVJSX0ZBVF9NMkVSUjoKKwkJc3BlY2lmaWMgPSAiTm9ydGhib3VuZCBDUkMgZXJyb3Igb24gbm9uLXJlZHVuZGFudCAiCisJCQkJInJldHJ5IjsKKwkJYnJlYWs7CisJY2FzZSBGRVJSX0ZBVF9NM0VSUjoKKwkJeworCQlzdGF0aWMgaW50IGRvbmU7CiAKLQl9IGVsc2UgaWYgKGFsbEVycm9ycyAmIEZFUlJfRkFUX00yRVJSKSB7Ci0JCWk1MDAwX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAotCQkJCSJOb3J0aGJvdW5kIENSQyBlcnJvciBvbiBub24tcmVkdW5kYW50ICIKLQkJCQkicmV0cnlcbiIpOworCQkvKgorCQkgKiBUaGlzIGVycm9yIGlzIGdlbmVyYXRlZCB0byBpbmZvcm0gdGhhdCB0aGUgaW50ZWxsaWdlbnQKKwkJICogdGhyb3R0bGluZyBpcyBkaXNhYmxlZCBhbmQgdGhlIHRlbXBlcmF0dXJlIHBhc3NlZCB0aGUKKwkJICogc3BlY2lmaWVkIG1pZGRsZSBwb2ludC4gU2luY2UgdGhpcyBpcyBzb21ldGhpbmcgdGhlIEJJT1MKKwkJICogc2hvdWxkIHRha2UgY2FyZSBvZiwgd2UnbGwgd2FybiBvbmx5IG9uY2UgdG8gYXZvaWQKKwkJICogd29ydGhsZXNzbHkgZmxvb2RpbmcgdGhlIGxvZy4KKwkJICovCisJCWlmIChkb25lKQorCQkJcmV0dXJuOworCQlkb25lKys7CiAKLQl9IGVsc2UgaWYgKGFsbEVycm9ycyAmIEZFUlJfRkFUX00zRVJSKSB7Ci0JCWk1MDAwX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAotCQkJCSI+VG1pZCBUaGVybWFsIGV2ZW50IHdpdGggaW50ZWxsaWdlbnQgIgotCQkJCSJ0aHJvdHRsaW5nIGRpc2FibGVkXG4iKTsKKwkJc3BlY2lmaWMgPSAiPlRtaWQgVGhlcm1hbCBldmVudCB3aXRoIGludGVsbGlnZW50ICIKKwkJCSAgICJ0aHJvdHRsaW5nIGRpc2FibGVkIjsKKwkJfQorCQlicmVhazsKIAl9CiAKIAkvKiBGb3JtIG91dCBtZXNzYWdlICovCiAJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKIAkJICIoQnJhbmNoPSVkIERSQU0tQmFuaz0lZCBSRFdSPSVzIFJBUz0lZCBDQVM9JWQgIgotCQkgIkZBVEFMIEVycj0weCV4KSIsCisJCSAiRkFUQUwgRXJyPTB4JXggKCVzKSkiLAogCQkgYnJhbmNoID4+IDEsIGJhbmssIHJkd3IgPyAiV3JpdGUiIDogIlJlYWQiLCByYXMsIGNhcywKLQkJIGFsbEVycm9ycyk7CisJCSBhbGxFcnJvcnMsIHNwZWNpZmljKTsKIAogCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLwogCWVkYWNfbWNfaGFuZGxlX2ZiZF91ZShtY2ksIHJhbmssIGNoYW5uZWwsIGNoYW5uZWwgKyAxLCBtc2cpOwpAQCAtNTM5LDcgKzU1Myw4IEBACiAJCQkJCXN0cnVjdCBpNTAwMF9lcnJvcl9pbmZvICppbmZvLAogCQkJCQlpbnQgaGFuZGxlX2Vycm9ycykKIHsKLQljaGFyIG1zZ1tFREFDX01DX0xBQkVMX0xFTiArIDEgKyA5MF07CisJY2hhciBtc2dbRURBQ19NQ19MQUJFTF9MRU4gKyAxICsgMTcwXTsKKwljaGFyICpzcGVjaWZpYyA9IE5VTEw7CiAJdTMyIGFsbEVycm9yczsKIAl1MzIgdWVfZXJyb3JzOwogCXUzMiBjZV9lcnJvcnM7CkBAIC01NTcsMTAgKzU3Miw2IEBACiAJCXJldHVybjsJCS8qIGlmIG5vIGVycm9yLCByZXR1cm4gbm93ICovCiAKIAkvKiBPTkxZIE9ORSBvZiB0aGUgcG9zc2libGUgZXJyb3IgYml0cyB3aWxsIGJlIHNldCwgYXMgcGVyIHRoZSBkb2NzICovCi0JaTUwMDBfbWNfcHJpbnRrKG1jaSwgS0VSTl9XQVJOSU5HLAotCQkJIk5PTi1GQVRBTCBFUlJPUlMgRm91bmQhISEgMXN0IE5PTi1GQVRBTCBFcnIgIgotCQkJIlJlZz0gMHgleFxuIiwgYWxsRXJyb3JzKTsKLQogCXVlX2Vycm9ycyA9IGFsbEVycm9ycyAmIEZFUlJfTkZfVU5DT1JSRUNUQUJMRTsKIAlpZiAodWVfZXJyb3JzKSB7CiAJCWRlYnVnZjAoIlx0VW5jb3JyZWN0ZWQgYml0cz0gMHgleFxuIiwgdWVfZXJyb3JzKTsKQEAgLTU3OSwxMiArNTkwLDQ3IEBACiAJCQlyYW5rLCBjaGFubmVsLCBjaGFubmVsICsgMSwgYnJhbmNoID4+IDEsIGJhbmssCiAJCQlyZHdyID8gIldyaXRlIiA6ICJSZWFkIiwgcmFzLCBjYXMpOwogCisJCXN3aXRjaCAodWVfZXJyb3JzKSB7CisJCWNhc2UgRkVSUl9ORl9NMTJFUlI6CisJCQlzcGVjaWZpYyA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX00xMUVSUjoKKwkJCXNwZWNpZmljID0gIk5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgU3BhcmUtQ29weSAiCisJCQkJCSJEYXRhIEVDQyI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX00xMEVSUjoKKwkJCXNwZWNpZmljID0gIk5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgTWlycm9yZWQgRGVtYW5kICIKKwkJCQkJIkRhdGEgRUNDIjsKKwkJCWJyZWFrOworCQljYXNlIEZFUlJfTkZfTTlFUlI6CisJCQlzcGVjaWZpYyA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCAiCisJCQkJCSJEZW1hbmQgRGF0YSBFQ0MiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NOEVSUjoKKwkJCXNwZWNpZmljID0gIkFsaWFzZWQgVW5jb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NN0VSUjoKKwkJCXNwZWNpZmljID0gIkFsaWFzZWQgVW5jb3JyZWN0YWJsZSBTcGFyZS1Db3B5IERhdGEgRUNDIjsKKwkJCWJyZWFrOworCQljYXNlIEZFUlJfTkZfTTZFUlI6CisJCQlzcGVjaWZpYyA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgTWlycm9yZWQgRGVtYW5kICIKKwkJCQkJIkRhdGEgRUNDIjsKKwkJCWJyZWFrOworCQljYXNlIEZFUlJfTkZfTTVFUlI6CisJCQlzcGVjaWZpYyA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCAiCisJCQkJCSJEYXRhIEVDQyI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX000RVJSOgorCQkJc3BlY2lmaWMgPSAiVW5jb3JyZWN0YWJsZSBEYXRhIEVDQyBvbiBSZXBsYXkiOworCQkJYnJlYWs7CisJCX0KKwogCQkvKiBGb3JtIG91dCBtZXNzYWdlICovCiAJCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCiAJCQkgIihCcmFuY2g9JWQgRFJBTS1CYW5rPSVkIFJEV1I9JXMgUkFTPSVkICIKLQkJCSAiQ0FTPSVkLCBVRSBFcnI9MHgleCkiLAorCQkJICJDQVM9JWQsIFVFIEVycj0weCV4ICglcykpIiwKIAkJCSBicmFuY2ggPj4gMSwgYmFuaywgcmR3ciA/ICJXcml0ZSIgOiAiUmVhZCIsIHJhcywgY2FzLAotCQkJIHVlX2Vycm9ycyk7CisJCQkgdWVfZXJyb3JzLCBzcGVjaWZpYyk7CiAKIAkJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCiAJCWVkYWNfbWNfaGFuZGxlX2ZiZF91ZShtY2ksIHJhbmssIGNoYW5uZWwsIGNoYW5uZWwgKyAxLCBtc2cpOwpAQCAtNjE2LDUxICs2NjIsNzQgQEAKIAkJCXJhbmssIGNoYW5uZWwsIGJyYW5jaCA+PiAxLCBiYW5rLAogCQkJcmR3ciA/ICJXcml0ZSIgOiAiUmVhZCIsIHJhcywgY2FzKTsKIAorCQlzd2l0Y2ggKGNlX2Vycm9ycykgeworCQljYXNlIEZFUlJfTkZfTTE3RVJSOgorCQkJc3BlY2lmaWMgPSAiQ29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX00xOEVSUjoKKwkJCXNwZWNpZmljID0gIkNvcnJlY3RhYmxlIE1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX00xOUVSUjoKKwkJCXNwZWNpZmljID0gIkNvcnJlY3RhYmxlIFNwYXJlLUNvcHkgRGF0YSBFQ0MiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NMjBFUlI6CisJCQlzcGVjaWZpYyA9ICJDb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiOworCQkJYnJlYWs7CisJCX0KKwogCQkvKiBGb3JtIG91dCBtZXNzYWdlICovCiAJCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCiAJCQkgIihCcmFuY2g9JWQgRFJBTS1CYW5rPSVkIFJEV1I9JXMgUkFTPSVkICIKLQkJCSAiQ0FTPSVkLCBDRSBFcnI9MHgleCkiLCBicmFuY2ggPj4gMSwgYmFuaywKLQkJCSByZHdyID8gIldyaXRlIiA6ICJSZWFkIiwgcmFzLCBjYXMsIGNlX2Vycm9ycyk7CisJCQkgIkNBUz0lZCwgQ0UgRXJyPTB4JXggKCVzKSkiLCBicmFuY2ggPj4gMSwgYmFuaywKKwkJCSByZHdyID8gIldyaXRlIiA6ICJSZWFkIiwgcmFzLCBjYXMsIGNlX2Vycm9ycywKKwkJCSBzcGVjaWZpYyk7CiAKIAkJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCiAJCWVkYWNfbWNfaGFuZGxlX2ZiZF9jZShtY2ksIHJhbmssIGNoYW5uZWwsIG1zZyk7CiAJfQogCi0JLyogU2VlIGlmIGFueSBvZiB0aGUgdGhlcm1hbCBlcnJvcnMgaGF2ZSBmaXJlZCAqLwotCW1pc2NfZXJyb3JzID0gYWxsRXJyb3JzICYgRkVSUl9ORl9USEVSTUFMOwotCWlmIChtaXNjX2Vycm9ycykgewotCQlpNTAwMF9wcmludGsoS0VSTl9XQVJOSU5HLCAiXHRUSEVSTUFMIEVycm9yLCBiaXRzPSAweCV4XG4iLAotCQkJbWlzY19lcnJvcnMpOwotCX0KKwlpZiAoIW1pc2NfbWVzc2FnZXMpCisJCXJldHVybjsKIAotCS8qIFNlZSBpZiBhbnkgb2YgdGhlIHRoZXJtYWwgZXJyb3JzIGhhdmUgZmlyZWQgKi8KLQltaXNjX2Vycm9ycyA9IGFsbEVycm9ycyAmIEZFUlJfTkZfTk9OX1JFVFJZOworCW1pc2NfZXJyb3JzID0gYWxsRXJyb3JzICYgKEZFUlJfTkZfTk9OX1JFVFJZIHwgRkVSUl9ORl9OT1JUSF9DUkMgfAorCQkJCSAgIEZFUlJfTkZfU1BEX1BST1RPQ09MIHwgRkVSUl9ORl9ESU1NX1NQQVJFKTsKIAlpZiAobWlzY19lcnJvcnMpIHsKLQkJaTUwMDBfcHJpbnRrKEtFUk5fV0FSTklORywgIlx0Tk9OLVJldHJ5ICBFcnJvcnMsIGJpdHM9IDB4JXhcbiIsCi0JCQltaXNjX2Vycm9ycyk7Ci0JfQorCQlzd2l0Y2ggKG1pc2NfZXJyb3JzKSB7CisJCWNhc2UgRkVSUl9ORl9NMTNFUlI6CisJCQlzcGVjaWZpYyA9ICJOb24tUmV0cnkgb3IgUmVkdW5kYW50IFJldHJ5IEZCRCBNZW1vcnkgIgorCQkJCQkiQWxlcnQgb3IgUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCI7CisJCQlicmVhazsKKwkJY2FzZSBGRVJSX05GX00xNEVSUjoKKwkJCXNwZWNpZmljID0gIk5vbi1SZXRyeSBvciBSZWR1bmRhbnQgUmV0cnkgRkJEICIKKwkJCQkJIkNvbmZpZ3VyYXRpb24gQWxlcnQiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NMTVFUlI6CisJCQlzcGVjaWZpYyA9ICJOb24tUmV0cnkgb3IgUmVkdW5kYW50IFJldHJ5IEZCRCAiCisJCQkJCSJOb3J0aGJvdW5kIENSQyBlcnJvciBvbiByZWFkIGRhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NMjFFUlI6CisJCQlzcGVjaWZpYyA9ICJGQkQgTm9ydGhib3VuZCBDUkMgZXJyb3Igb24gIgorCQkJCQkiRkJEIFN5bmMgU3RhdHVzIjsKKwkJCWJyZWFrOworCQljYXNlIEZFUlJfTkZfTTIyRVJSOgorCQkJc3BlY2lmaWMgPSAiU1BEIHByb3RvY29sIGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIEZFUlJfTkZfTTI3RVJSOgorCQkJc3BlY2lmaWMgPSAiRElNTS1zcGFyZSBjb3B5IHN0YXJ0ZWQiOworCQkJYnJlYWs7CisJCWNhc2UgRkVSUl9ORl9NMjhFUlI6CisJCQlzcGVjaWZpYyA9ICJESU1NLXNwYXJlIGNvcHkgY29tcGxldGVkIjsKKwkJCWJyZWFrOworCQl9CisJCWJyYW5jaCA9IEVYVFJBQ1RfRkJEQ0hBTl9JTkRYKGluZm8tPmZlcnJfbmZfZmJkKTsKIAotCS8qIFNlZSBpZiBhbnkgb2YgdGhlIHRoZXJtYWwgZXJyb3JzIGhhdmUgZmlyZWQgKi8KLQltaXNjX2Vycm9ycyA9IGFsbEVycm9ycyAmIEZFUlJfTkZfTk9SVEhfQ1JDOwotCWlmIChtaXNjX2Vycm9ycykgewotCQlpNTAwMF9wcmludGsoS0VSTl9XQVJOSU5HLAotCQkJIlx0Tk9SVEhCT1VORCBDUkMgIEVycm9yLCBiaXRzPSAweCV4XG4iLAotCQkJbWlzY19lcnJvcnMpOwotCX0KKwkJLyogRm9ybSBvdXQgbWVzc2FnZSAqLworCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkJICIoQnJhbmNoPSVkIEVycj0lI3ggKCVzKSkiLCBicmFuY2ggPj4gMSwKKwkJCSBtaXNjX2Vycm9ycywgc3BlY2lmaWMpOwogCi0JLyogU2VlIGlmIGFueSBvZiB0aGUgdGhlcm1hbCBlcnJvcnMgaGF2ZSBmaXJlZCAqLwotCW1pc2NfZXJyb3JzID0gYWxsRXJyb3JzICYgRkVSUl9ORl9TUERfUFJPVE9DT0w7Ci0JaWYgKG1pc2NfZXJyb3JzKSB7Ci0JCWk1MDAwX3ByaW50ayhLRVJOX1dBUk5JTkcsCi0JCQkiXHRTUEQgUHJvdG9jb2wgIEVycm9yLCBiaXRzPSAweCV4XG4iLAotCQkJbWlzY19lcnJvcnMpOwotCX0KLQotCS8qIFNlZSBpZiBhbnkgb2YgdGhlIHRoZXJtYWwgZXJyb3JzIGhhdmUgZmlyZWQgKi8KLQltaXNjX2Vycm9ycyA9IGFsbEVycm9ycyAmIEZFUlJfTkZfRElNTV9TUEFSRTsKLQlpZiAobWlzY19lcnJvcnMpIHsKLQkJaTUwMDBfcHJpbnRrKEtFUk5fV0FSTklORywgIlx0RElNTS1TcGFyZSAgRXJyb3IsIGJpdHM9IDB4JXhcbiIsCi0JCQltaXNjX2Vycm9ycyk7CisJCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLworCQllZGFjX21jX2hhbmRsZV9mYmRfY2UobWNpLCAwLCAwLCBtc2cpOwogCX0KIH0KIApAQCAtMTQ5NywzICsxNTY2LDYgQEAKIAogbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7Cittb2R1bGVfcGFyYW0obWlzY19tZXNzYWdlcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWlzY19tZXNzYWdlcywgIkxvZyBtaXNjZWxsYW5lb3VzIG5vbiBmYXRhbCBtZXNzYWdlcyIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTgyNDQzYnhneF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTgyNDQzYnhneF9lZGFjLmMKaW5kZXggYzUzMDVlMy4uNTc3NzYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k4MjQ0M2J4Z3hfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pODI0NDNieGd4X2VkYWMuYwpAQCAtMTE0LDYgKzExNCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICppODI0NDNieGd4X3BjaTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2ICptY2lfcGRldjsJLyogaW5pdCBkZXY6IGluIGNhc2UgdGhhdCBBR1AgY29kZSBoYXMKKwkJCQkJICogYWxyZWFkeSByZWdpc3RlcmVkIGRyaXZlcgorCQkJCQkgKi8KKworc3RhdGljIGludCBpODI0NDNieGd4X3JlZ2lzdGVyZWQgPSAxOworCiBzdGF0aWMgdm9pZCBpODI0NDNieGd4X2VkYWNtY19nZXRfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCiAJCQkJc3RydWN0IGk4MjQ0M2J4Z3hfZWRhY21jX2Vycm9yX2luZm8KIAkJCQkqaW5mbykKQEAgLTM0NSwxMCArMzUxLDE3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpODI0NDNieGd4X2VkYWNtY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CisJaW50IHJjOworCiAJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOwogCiAJLyogZG9uJ3QgbmVlZCB0byBjYWxsIHBjaV9kZXZpY2VfZW5hYmxlKCkgKi8KLQlyZXR1cm4gaTgyNDQzYnhneF9lZGFjbWNfcHJvYmUxKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworCXJjID0gaTgyNDQzYnhneF9lZGFjbWNfcHJvYmUxKHBkZXYsIGVudC0+ZHJpdmVyX2RhdGEpOworCisJaWYgKG1jaV9wZGV2ID09IE5VTEwpCisJCW1jaV9wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODI0NDNieGd4X2VkYWNtY19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtMzg3LDE1ICs0MDAsNjEgQEAKIAogc3RhdGljIGludCBfX2luaXQgaTgyNDQzYnhneF9lZGFjbWNfaW5pdCh2b2lkKQogeworCWludCBwY2lfcmM7CiAgICAgICAgLyogRW5zdXJlIHRoYXQgdGhlIE9QU1RBVEUgaXMgc2V0IGNvcnJlY3RseSBmb3IgUE9MTCBvciBOTUkgKi8KICAgICAgICBvcHN0YXRlX2luaXQoKTsKIAotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODI0NDNieGd4X2VkYWNtY19kcml2ZXIpOworCXBjaV9yYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmk4MjQ0M2J4Z3hfZWRhY21jX2RyaXZlcik7CisJaWYgKHBjaV9yYyA8IDApCisJCWdvdG8gZmFpbDA7CisKKwlpZiAobWNpX3BkZXYgPT0gTlVMTCkgeworCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQgPSAmaTgyNDQzYnhneF9wY2lfdGJsWzBdOworCQlpbnQgaSA9IDA7CisJCWk4MjQ0M2J4Z3hfcmVnaXN0ZXJlZCA9IDA7CisKKwkJd2hpbGUgKG1jaV9wZGV2ID09IE5VTEwgJiYgaWQtPnZlbmRvciAhPSAwKSB7CisJCQltY2lfcGRldiA9IHBjaV9nZXRfZGV2aWNlKGlkLT52ZW5kb3IsCisJCQkJCWlkLT5kZXZpY2UsIE5VTEwpOworCQkJaSsrOworCQkJaWQgPSAmaTgyNDQzYnhneF9wY2lfdGJsW2ldOworCQl9CisJCWlmICghbWNpX3BkZXYpIHsKKwkJCWRlYnVnZjAoImk4MjQ0M2J4Z3ggcGNpX2dldF9kZXZpY2UgZmFpbFxuIik7CisJCQlwY2lfcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsMTsKKwkJfQorCisJCXBjaV9yYyA9IGk4MjQ0M2J4Z3hfZWRhY21jX2luaXRfb25lKG1jaV9wZGV2LCBpODI0NDNieGd4X3BjaV90YmwpOworCisJCWlmIChwY2lfcmMgPCAwKSB7CisJCQlkZWJ1Z2YwKCJpODI0NDNieGd4IGluaXQgZmFpbFxuIik7CisJCQlwY2lfcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsMTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmYWlsMToKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk4MjQ0M2J4Z3hfZWRhY21jX2RyaXZlcik7CisKK2ZhaWwwOgorCWlmIChtY2lfcGRldiAhPSBOVUxMKQorCQlwY2lfZGV2X3B1dChtY2lfcGRldik7CisKKwlyZXR1cm4gcGNpX3JjOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaTgyNDQzYnhneF9lZGFjbWNfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTgyNDQzYnhneF9lZGFjbWNfZHJpdmVyKTsKKworCWlmICghaTgyNDQzYnhneF9yZWdpc3RlcmVkKQorCQlpODI0NDNieGd4X2VkYWNtY19yZW1vdmVfb25lKG1jaV9wZGV2KTsKKworCWlmIChtY2lfcGRldikKKwkJcGNpX2Rldl9wdXQobWNpX3BkZXYpOwogfQogCiBtb2R1bGVfaW5pdChpODI0NDNieGd4X2VkYWNtY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCAyMjY1ZDljLi4wY2ZjYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtNDAsNyArNDEsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyB1MzIgb3JpZ19sMl9lcnJfZGlzYWJsZTsKLXN0YXRpYyB1MzIgb3JpZ19oaWQxOworc3RhdGljIHUzMiBvcmlnX2hpZDFbMl07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogTUMgU1lTRlMgcGFydHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTY0Nyw2ICs2NDgsOSBAQAogCXsKIAkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsCiAJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIiwKKwkgfSwKIAl7fSwKIH07CiAKQEAgLTkxMiw3ICs5MTYsOCBAQAogCQkvKiByZWdpc3RlciBpbnRlcnJ1cHRzICovCiAJCXBkYXRhLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvcC0+bm9kZSwgMCk7CiAJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJm9wLT5kZXYsIHBkYXRhLT5pcnEsCi0JCQkJICAgICAgIG1wYzg1eHhfbWNfaXNyLCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICBtcGM4NXh4X21jX2lzciwKKwkJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAogCQkJCSAgICAgICAiW0VEQUNdIE1DIGVyciIsIG1jaSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yICIKQEAgLTk4MCw2ICs5ODUsOSBAQAogCXsKIAkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiLAogCSB9LAorCXsKKwkgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiLAorCSB9LAogCXt9LAogfTsKIApAQCAtOTk1LDYgKzEwMDMsMTQgQEAKIAkJICAgfSwKIH07CiAKKworc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWNfY2xlYXJfcmZ4ZSh2b2lkICpkYXRhKQoreworCW9yaWdfaGlkMVtzbXBfcHJvY2Vzc29yX2lkKCldID0gbWZzcHIoU1BSTl9ISUQxKTsKKwltdHNwcihTUFJOX0hJRDEsIChvcmlnX2hpZDFbc21wX3Byb2Nlc3Nvcl9pZCgpXSAmIH4weDIwMDAwKSk7Cit9CisKKwogc3RhdGljIGludCBfX2luaXQgbXBjODV4eF9tY19pbml0KHZvaWQpCiB7CiAJaW50IHJlcyA9IDA7CkBAIC0xMDMwLDE5ICsxMDQ2LDIyIEBACiAJICogbmVlZCB0byBjbGVhciBISUQxW1JGWEVdIHRvIGRpc2FibGUgbWFjaGluZSBjaGVjayBpbnQKIAkgKiBzbyB3ZSBjYW4gY2F0Y2ggaXQKIAkgKi8KLQlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7Ci0JCW9yaWdfaGlkMSA9IG1mc3ByKFNQUk5fSElEMSk7Ci0JCW10c3ByKFNQUk5fSElEMSwgKG9yaWdfaGlkMSAmIH4weDIwMDAwKSk7Ci0JfQorCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpCisJCW9uX2VhY2hfY3B1KG1wYzg1eHhfbWNfY2xlYXJfcmZ4ZSwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQobXBjODV4eF9tY19pbml0KTsKIAorc3RhdGljIHZvaWQgX19leGl0IG1wYzg1eHhfbWNfcmVzdG9yZV9oaWQxKHZvaWQgKmRhdGEpCit7CisJbXRzcHIoU1BSTl9ISUQxLCBvcmlnX2hpZDFbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBtcGM4NXh4X21jX2V4aXQodm9pZCkKIHsKLQltdHNwcihTUFJOX0hJRDEsIG9yaWdfaGlkMSk7CisJb25fZWFjaF9jcHUobXBjODV4eF9tY19yZXN0b3JlX2hpZDEsIE5VTEwsIDApOwogI2lmZGVmIENPTkZJR19QQ0kKIAlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjODV4eF9wY2lfZXJyX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctY2FyZC5jIGIvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKaW5kZXggYmJkNzNhNC4uNDE4YzE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKQEAgLTE4OSwzOSArMTg5LDE2IEBACiAJNjMsIDUsIDcsIDgsIDEwLCAxMywgMTYsIDE4LCAyMSwgMjQsIDI2LCAyOSwgMzIsIDM1LCAzNywgNDAKIH07CiAKLXN0cnVjdCBibV9kYXRhIHsKLQlzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gdDsKLQlzdHJ1Y3QgewotCQlfX2JlMzIgYXJnOwotCQlfX2JlMzIgZGF0YTsKLQl9IGxvY2s7Ci0JdTMyIG9sZDsKLQlpbnQgcmNvZGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKLX07Ci0KLXN0YXRpYyB2b2lkCi1jb21wbGV0ZV9ibV9sb2NrKHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQgcmNvZGUsCi0JCSB2b2lkICpwYXlsb2FkLCBzaXplX3QgbGVuZ3RoLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBibV9kYXRhICpibWQgPSBkYXRhOwotCi0JaWYgKHJjb2RlID09IFJDT0RFX0NPTVBMRVRFKQotCQlibWQtPm9sZCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopIHBheWxvYWQpOwotCWJtZC0+cmNvZGUgPSByY29kZTsKLQljb21wbGV0ZSgmYm1kLT5kb25lKTsKLX0KLQogc3RhdGljIHZvaWQKIGZ3X2NhcmRfYm1fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGZ3X2NhcmQgKmNhcmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZ3X2NhcmQsIHdvcmsud29yayk7CiAJc3RydWN0IGZ3X2RldmljZSAqcm9vdF9kZXZpY2U7CiAJc3RydWN0IGZ3X25vZGUgKnJvb3Rfbm9kZSwgKmxvY2FsX25vZGU7Ci0Jc3RydWN0IGJtX2RhdGEgYm1kOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJvb3RfaWQsIG5ld19yb290X2lkLCBpcm1faWQsIGdhcF9jb3VudCwgZ2VuZXJhdGlvbiwgZ3JhY2U7CisJaW50IHJvb3RfaWQsIG5ld19yb290X2lkLCBpcm1faWQsIGdhcF9jb3VudCwgZ2VuZXJhdGlvbiwgZ3JhY2UsIHJjb2RlOwogCWJvb2wgZG9fcmVzZXQgPSBmYWxzZTsKKwlfX2JlMzIgbG9ja19kYXRhWzJdOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAlsb2NhbF9ub2RlID0gY2FyZC0+bG9jYWxfbm9kZTsKQEAgLTI2MywzMyArMjQwLDI4IEBACiAJCQlnb3RvIHBpY2tfbWU7CiAJCX0KIAotCQlibWQubG9jay5hcmcgPSBjcHVfdG9fYmUzMigweDNmKTsKLQkJYm1kLmxvY2suZGF0YSA9IGNwdV90b19iZTMyKGxvY2FsX25vZGUtPm5vZGVfaWQpOworCQlsb2NrX2RhdGFbMF0gPSBjcHVfdG9fYmUzMigweDNmKTsKKwkJbG9ja19kYXRhWzFdID0gY3B1X3RvX2JlMzIobG9jYWxfbm9kZS0+bm9kZV9pZCk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCi0JCWluaXRfY29tcGxldGlvbigmYm1kLmRvbmUpOwotCQlmd19zZW5kX3JlcXVlc3QoY2FyZCwgJmJtZC50LCBUQ09ERV9MT0NLX0NPTVBBUkVfU1dBUCwKLQkJCQlpcm1faWQsIGdlbmVyYXRpb24sCi0JCQkJU0NPREVfMTAwLCBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9CVVNfTUFOQUdFUl9JRCwKLQkJCQkmYm1kLmxvY2ssIHNpemVvZihibWQubG9jayksCi0JCQkJY29tcGxldGVfYm1fbG9jaywgJmJtZCk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJtZC5kb25lKTsKKwkJcmNvZGUgPSBmd19ydW5fdHJhbnNhY3Rpb24oY2FyZCwgVENPREVfTE9DS19DT01QQVJFX1NXQVAsCisJCQkJaXJtX2lkLCBnZW5lcmF0aW9uLCBTQ09ERV8xMDAsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfQlVTX01BTkFHRVJfSUQsCisJCQkJbG9ja19kYXRhLCBzaXplb2YobG9ja19kYXRhKSk7CiAKLQkJaWYgKGJtZC5yY29kZSA9PSBSQ09ERV9HRU5FUkFUSU9OKSB7Ci0JCQkvKgotCQkJICogQW5vdGhlciBidXMgcmVzZXQgaGFwcGVuZWQuIEp1c3QgcmV0dXJuLAotCQkJICogdGhlIEJNIHdvcmsgaGFzIGJlZW4gcmVzY2hlZHVsZWQuCi0JCQkgKi8KKwkJaWYgKHJjb2RlID09IFJDT0RFX0dFTkVSQVRJT04pCisJCQkvKiBBbm90aGVyIGJ1cyByZXNldCwgQk0gd29yayBoYXMgYmVlbiByZXNjaGVkdWxlZC4gKi8KIAkJCWdvdG8gb3V0OwotCQl9CiAKLQkJaWYgKGJtZC5yY29kZSA9PSBSQ09ERV9DT01QTEVURSAmJiBibWQub2xkICE9IDB4M2YpCisJCWlmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSAmJgorCQkgICAgbG9ja19kYXRhWzBdICE9IGNwdV90b19iZTMyKDB4M2YpKQogCQkJLyogU29tZWJvZHkgZWxzZSBpcyBCTSwgbGV0IHRoZW0gZG8gdGhlIHdvcmsuICovCiAJCQlnb3RvIG91dDsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoYm1kLnJjb2RlICE9IFJDT0RFX0NPTVBMRVRFKSB7CisKKwkJaWYgKHJjb2RlICE9IFJDT0RFX0NPTVBMRVRFKSB7CiAJCQkvKgogCQkJICogVGhlIGxvY2sgcmVxdWVzdCBmYWlsZWQsIG1heWJlIHRoZSBJUk0KIAkJCSAqIGlzbid0IHJlYWxseSBJUk0gY2FwYWJsZSBhZnRlciBhbGwuIExldCdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWNkZXYuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctY2Rldi5jCmluZGV4IDJlNmQ1ODQuLmVkMDMyMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctY2Rldi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctY2Rldi5jCkBAIC03MjAsOCArNzIwLDggQEAKICNkZWZpbmUgR0VUX1BBWUxPQURfTEVOR1RIKHYpCSgodikgJiAweGZmZmYpCiAjZGVmaW5lIEdFVF9JTlRFUlJVUFQodikJKCgodikgPj4gMTYpICYgMHgwMSkKICNkZWZpbmUgR0VUX1NLSVAodikJCSgoKHYpID4+IDE3KSAmIDB4MDEpCi0jZGVmaW5lIEdFVF9UQUcodikJCSgoKHYpID4+IDE4KSAmIDB4MDIpCi0jZGVmaW5lIEdFVF9TWSh2KQkJKCgodikgPj4gMjApICYgMHgwNCkKKyNkZWZpbmUgR0VUX1RBRyh2KQkJKCgodikgPj4gMTgpICYgMHgwMykKKyNkZWZpbmUgR0VUX1NZKHYpCQkoKCh2KSA+PiAyMCkgJiAweDBmKQogI2RlZmluZSBHRVRfSEVBREVSX0xFTkdUSCh2KQkoKCh2KSA+PiAyNCkgJiAweGZmKQogCiBzdGF0aWMgaW50IGlvY3RsX3F1ZXVlX2lzbyhzdHJ1Y3QgY2xpZW50ICpjbGllbnQsIHZvaWQgKmJ1ZmZlcikKQEAgLTkxMyw3ICs5MTMsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGxvbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5jCmluZGV4IDA4NTVmYjUuLjNmY2NkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuYwpAQCAtMzgxLDQ2ICszODEsMjEgQEAKIAlfX0FUVFJfTlVMTCwKIH07CiAKLXN0cnVjdCByZWFkX3F1YWRsZXRfY2FsbGJhY2tfZGF0YSB7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKLQlpbnQgcmNvZGU7Ci0JdTMyIGRhdGE7Ci19OwotCi1zdGF0aWMgdm9pZAotY29tcGxldGVfdHJhbnNhY3Rpb24oc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCByY29kZSwKLQkJICAgICB2b2lkICpwYXlsb2FkLCBzaXplX3QgbGVuZ3RoLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCByZWFkX3F1YWRsZXRfY2FsbGJhY2tfZGF0YSAqY2FsbGJhY2tfZGF0YSA9IGRhdGE7Ci0KLQlpZiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpCi0JCWNhbGxiYWNrX2RhdGEtPmRhdGEgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKXBheWxvYWQpOwotCWNhbGxiYWNrX2RhdGEtPnJjb2RlID0gcmNvZGU7Ci0JY29tcGxldGUoJmNhbGxiYWNrX2RhdGEtPmRvbmUpOwotfQotCiBzdGF0aWMgaW50CiByZWFkX3JvbShzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UsIGludCBnZW5lcmF0aW9uLCBpbnQgaW5kZXgsIHUzMiAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVhZF9xdWFkbGV0X2NhbGxiYWNrX2RhdGEgY2FsbGJhY2tfZGF0YTsKLQlzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gdDsKLQl1NjQgb2Zmc2V0OworCWludCByY29kZTsKIAogCS8qIGRldmljZS0+bm9kZV9pZCwgYWNjZXNzZWQgYmVsb3csIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwogCXNtcF9ybWIoKTsKIAotCWluaXRfY29tcGxldGlvbigmY2FsbGJhY2tfZGF0YS5kb25lKTsKLQotCW9mZnNldCA9IChDU1JfUkVHSVNURVJfQkFTRSB8IENTUl9DT05GSUdfUk9NKSArIGluZGV4ICogNDsKLQlmd19zZW5kX3JlcXVlc3QoZGV2aWNlLT5jYXJkLCAmdCwgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1QsCisJcmNvZGUgPSBmd19ydW5fdHJhbnNhY3Rpb24oZGV2aWNlLT5jYXJkLCBUQ09ERV9SRUFEX1FVQURMRVRfUkVRVUVTVCwKIAkJCWRldmljZS0+bm9kZV9pZCwgZ2VuZXJhdGlvbiwgZGV2aWNlLT5tYXhfc3BlZWQsCi0JCQlvZmZzZXQsIE5VTEwsIDQsIGNvbXBsZXRlX3RyYW5zYWN0aW9uLCAmY2FsbGJhY2tfZGF0YSk7CisJCQkoQ1NSX1JFR0lTVEVSX0JBU0UgfCBDU1JfQ09ORklHX1JPTSkgKyBpbmRleCAqIDQsCisJCQlkYXRhLCA0KTsKKwliZTMyX3RvX2NwdXMoZGF0YSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYWxsYmFja19kYXRhLmRvbmUpOwotCi0JKmRhdGEgPSBjYWxsYmFja19kYXRhLmRhdGE7Ci0KLQlyZXR1cm4gY2FsbGJhY2tfZGF0YS5yY29kZTsKKwlyZXR1cm4gcmNvZGU7CiB9CiAKICNkZWZpbmUgUkVBRF9CSUJfUk9NX1NJWkUJMjU2CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXNicDIuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCmluZGV4IGFhZmY1MGUuLmVmMGI5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KQEAgLTE4MSwxMCArMTgyLDE2IEBACiAjZGVmaW5lIFNCUDJfTUFYX0xPR0lOX09SQl9USU1FT1VUCTQwMDAwVQkvKiBUaW1lb3V0IGluIG1zICovCiAjZGVmaW5lIFNCUDJfT1JCX1RJTUVPVVQJCTIwMDBVCS8qIFRpbWVvdXQgaW4gbXMgKi8KICNkZWZpbmUgU0JQMl9PUkJfTlVMTAkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgJMHhmMDAwCiAjZGVmaW5lIFNCUDJfUkVUUllfTElNSVQJCTB4ZgkJLyogMTUgcmV0cmllcyAqLwogI2RlZmluZSBTQlAyX0NZQ0xFX0xJTUlUCQkoMHhjOCA8PCAxMikJLyogMjAwIDEyNXVzIGN5Y2xlcyAqLwogCisvKgorICogVGhlIGRlZmF1bHQgbWF4aW11bSBzL2cgc2VnbWVudCBzaXplIG9mIGEgRmlyZVdpcmUgY29udHJvbGxlciBpcworICogdXN1YWxseSAweDEwMDAwLCBidXQgU0JQLTIgb25seSBhbGxvd3MgMHhmZmZmLiBTaW5jZSBidWZmZXJzIGhhdmUgdG8KKyAqIGJlIHF1YWRsZXQtYWxpZ25lZCwgd2Ugc2V0IHRoZSBsZW5ndGggbGltaXQgdG8gMHhmZmZmICYgfjMuCisgKi8KKyNkZWZpbmUgU0JQMl9NQVhfU0VHX1NJWkUJCTB4ZmZmYworCiAvKiBVbml0IGRpcmVjdG9yeSBrZXlzICovCiAjZGVmaW5lIFNCUDJfQ1NSX1VOSVRfQ0hBUkFDVEVSSVNUSUNTCTB4M2EKICNkZWZpbmUgU0JQMl9DU1JfRklSTVdBUkVfUkVWSVNJT04JMHgzYwpAQCAtNjIxLDI1ICs2MjgsMTUgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZAotY29tcGxldGVfYWdlbnRfcmVzZXRfd3JpdGUoc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCByY29kZSwKLQkJCSAgIHZvaWQgKnBheWxvYWQsIHNpemVfdCBsZW5ndGgsIHZvaWQgKmRvbmUpCi17Ci0JY29tcGxldGUoZG9uZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNicDJfYWdlbnRfcmVzZXQoc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSkKIHsKIAlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSBmd19kZXZpY2UobHUtPnRndC0+dW5pdC0+ZGV2aWNlLnBhcmVudCk7Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7Ci0Jc3RydWN0IGZ3X3RyYW5zYWN0aW9uIHQ7Ci0Jc3RhdGljIHUzMiB6OworCV9fYmUzMiBkID0gMDsKIAotCWZ3X3NlbmRfcmVxdWVzdChkZXZpY2UtPmNhcmQsICZ0LCBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1QsCi0JCQlsdS0+dGd0LT5ub2RlX2lkLCBsdS0+Z2VuZXJhdGlvbiwgZGV2aWNlLT5tYXhfc3BlZWQsCi0JCQlsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyZXNzICsgU0JQMl9BR0VOVF9SRVNFVCwKLQkJCSZ6LCBzaXplb2YoeiksIGNvbXBsZXRlX2FnZW50X3Jlc2V0X3dyaXRlLCAmZG9uZSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CisJZndfcnVuX3RyYW5zYWN0aW9uKGRldmljZS0+Y2FyZCwgVENPREVfV1JJVEVfUVVBRExFVF9SRVFVRVNULAorCQkJICAgbHUtPnRndC0+bm9kZV9pZCwgbHUtPmdlbmVyYXRpb24sIGRldmljZS0+bWF4X3NwZWVkLAorCQkJICAgbHUtPmNvbW1hbmRfYmxvY2tfYWdlbnRfYWRkcmVzcyArIFNCUDJfQUdFTlRfUkVTRVQsCisJCQkgICAmZCwgc2l6ZW9mKGQpKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTY1Myw3ICs2NTAsNyBAQAogewogCXN0cnVjdCBmd19kZXZpY2UgKmRldmljZSA9IGZ3X2RldmljZShsdS0+dGd0LT51bml0LT5kZXZpY2UucGFyZW50KTsKIAlzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gKnQ7Ci0Jc3RhdGljIHUzMiB6OworCXN0YXRpYyBfX2JlMzIgZDsKIAogCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9BVE9NSUMpOwogCWlmICh0ID09IE5VTEwpCkBAIC02NjIsNyArNjU5LDcgQEAKIAlmd19zZW5kX3JlcXVlc3QoZGV2aWNlLT5jYXJkLCB0LCBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1QsCiAJCQlsdS0+dGd0LT5ub2RlX2lkLCBsdS0+Z2VuZXJhdGlvbiwgZGV2aWNlLT5tYXhfc3BlZWQsCiAJCQlsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyZXNzICsgU0JQMl9BR0VOVF9SRVNFVCwKLQkJCSZ6LCBzaXplb2YoeiksIGNvbXBsZXRlX2FnZW50X3Jlc2V0X3dyaXRlX25vX3dhaXQsIHQpOworCQkJJmQsIHNpemVvZihkKSwgY29tcGxldGVfYWdlbnRfcmVzZXRfd3JpdGVfbm9fd2FpdCwgdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNicDJfc2V0X2dlbmVyYXRpb24oc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSwgaW50IGdlbmVyYXRpb24pCkBAIC04MjMsMTMgKzgyMCw2IEBACiAJa3JlZl9wdXQoJnRndC0+a3JlZiwgc2JwMl9yZWxlYXNlX3RhcmdldCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb21wbGV0ZV9zZXRfYnVzeV90aW1lb3V0KHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQgcmNvZGUsCi0JCQkgIHZvaWQgKnBheWxvYWQsIHNpemVfdCBsZW5ndGgsIHZvaWQgKmRvbmUpCi17Ci0JY29tcGxldGUoZG9uZSk7Ci19Ci0KIC8qCiAgKiBXcml0ZSByZXRyYW5zbWl0IHJldHJ5IHZhbHVlcyBpbnRvIHRoZSBCVVNZX1RJTUVPVVQgcmVnaXN0ZXIuCiAgKiAtIFRoZSBzaW5nbGUtcGhhc2UgcmV0cnkgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGJ5IGFsbCBTQlAtMiBkZXZpY2VzLCBidXQgdGhlCkBAIC04NDksMTcgKzgzOSwxMiBAQAogc3RhdGljIHZvaWQgc2JwMl9zZXRfYnVzeV90aW1lb3V0KHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUpCiB7CiAJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gZndfZGV2aWNlKGx1LT50Z3QtPnVuaXQtPmRldmljZS5wYXJlbnQpOwotCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGRvbmUpOwotCXN0cnVjdCBmd190cmFuc2FjdGlvbiB0OwotCXN0YXRpYyBfX2JlMzIgYnVzeV90aW1lb3V0OworCV9fYmUzMiBkID0gY3B1X3RvX2JlMzIoU0JQMl9DWUNMRV9MSU1JVCB8IFNCUDJfUkVUUllfTElNSVQpOwogCi0JYnVzeV90aW1lb3V0ID0gY3B1X3RvX2JlMzIoU0JQMl9DWUNMRV9MSU1JVCB8IFNCUDJfUkVUUllfTElNSVQpOwotCi0JZndfc2VuZF9yZXF1ZXN0KGRldmljZS0+Y2FyZCwgJnQsIFRDT0RFX1dSSVRFX1FVQURMRVRfUkVRVUVTVCwKLQkJCWx1LT50Z3QtPm5vZGVfaWQsIGx1LT5nZW5lcmF0aW9uLCBkZXZpY2UtPm1heF9zcGVlZCwKLQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0JVU1lfVElNRU9VVCwgJmJ1c3lfdGltZW91dCwKLQkJCXNpemVvZihidXN5X3RpbWVvdXQpLCBjb21wbGV0ZV9zZXRfYnVzeV90aW1lb3V0LCAmZG9uZSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CisJZndfcnVuX3RyYW5zYWN0aW9uKGRldmljZS0+Y2FyZCwgVENPREVfV1JJVEVfUVVBRExFVF9SRVFVRVNULAorCQkJICAgbHUtPnRndC0+bm9kZV9pZCwgbHUtPmdlbmVyYXRpb24sIGRldmljZS0+bWF4X3NwZWVkLAorCQkJICAgQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfQlVTWV9USU1FT1VULAorCQkJICAgJmQsIHNpemVvZihkKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNicDJfcmVjb25uZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC0xMTIxLDYgKzExMDYsMTAgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAl1MzIgbW9kZWwsIGZpcm13YXJlX3JldmlzaW9uOwogCisJaWYgKGRtYV9nZXRfbWF4X3NlZ19zaXplKGRldmljZS0+Y2FyZC0+ZGV2aWNlKSA+IFNCUDJfTUFYX1NFR19TSVpFKQorCQlCVUdfT04oZG1hX3NldF9tYXhfc2VnX3NpemUoZGV2aWNlLT5jYXJkLT5kZXZpY2UsCisJCQkJCSAgICBTQlAyX01BWF9TRUdfU0laRSkpOworCiAJc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJnNjc2lfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YoKnRndCkpOwogCWlmIChzaG9zdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEzNjksMTQgKzEzNTgsMTIgQEAKIHNicDJfbWFwX3NjYXR0ZXJsaXN0KHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiICpvcmIsIHN0cnVjdCBmd19kZXZpY2UgKmRldmljZSwKIAkJICAgICBzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1KQogewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JaW50IHNnX2xlbiwgbCwgaSwgaiwgY291bnQ7Ci0JZG1hX2FkZHJfdCBzZ19hZGRyOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY3NpX3NnbGlzdChvcmItPmNtZCk7CisJaW50IGksIG47CiAKLQlzZyA9IHNjc2lfc2dsaXN0KG9yYi0+Y21kKTsKLQljb3VudCA9IGRtYV9tYXBfc2coZGV2aWNlLT5jYXJkLT5kZXZpY2UsIHNnLCBzY3NpX3NnX2NvdW50KG9yYi0+Y21kKSwKLQkJCSAgIG9yYi0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbik7Ci0JaWYgKGNvdW50ID09IDApCisJbiA9IGRtYV9tYXBfc2coZGV2aWNlLT5jYXJkLT5kZXZpY2UsIHNnLCBzY3NpX3NnX2NvdW50KG9yYi0+Y21kKSwKKwkJICAgICAgIG9yYi0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJaWYgKG4gPT0gMCkKIAkJZ290byBmYWlsOwogCiAJLyoKQEAgLTEzODYsNyArMTM3Myw3IEBACiAJICogYXMgdGhlIHNlY29uZCBnZW5lcmF0aW9uIGlQb2Qgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHBhZ2UKIAkgKiB0YWJsZXMuCiAJICovCi0JaWYgKGNvdW50ID09IDEgJiYgc2dfZG1hX2xlbihzZykgPCBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCkgeworCWlmIChuID09IDEpIHsKIAkJb3JiLT5yZXF1ZXN0LmRhdGFfZGVzY3JpcHRvci5oaWdoID0KIAkJCWNwdV90b19iZTMyKGx1LT50Z3QtPmFkZHJlc3NfaGlnaCk7CiAJCW9yYi0+cmVxdWVzdC5kYXRhX2Rlc2NyaXB0b3IubG93ICA9CkBAIC0xMzk2LDI5ICsxMzgzLDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyoKLQkgKiBDb252ZXJ0IHRoZSBzY2F0dGVybGlzdCB0byBhbiBzYnAyIHBhZ2UgdGFibGUuICBJZiBhbnkKLQkgKiBzY2F0dGVybGlzdCBlbnRyaWVzIGFyZSB0b28gYmlnIGZvciBzYnAyLCB3ZSBzcGxpdCB0aGVtIGFzIHdlCi0JICogZ28uICBFdmVuIGlmIHdlIGFzayB0aGUgYmxvY2sgSS9PIGxheWVyIHRvIG5vdCBnaXZlIHVzIHNnCi0JICogZWxlbWVudHMgbGFyZ2VyIHRoYW4gNjU1MzUgYnl0ZXMsIHNvbWUgSU9NTVVzIG1heSBtZXJnZSBzZyBlbGVtZW50cwotCSAqIGR1cmluZyBETUEgbWFwcGluZywgYW5kIExpbnV4IGN1cnJlbnRseSBkb2Vzbid0IHByZXZlbnQgdGhpcy4KLQkgKi8KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGNvdW50OyBpKyssIHNnID0gc2dfbmV4dChzZykpIHsKLQkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7Ci0JCXNnX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7Ci0JCXdoaWxlIChzZ19sZW4pIHsKLQkJCS8qIEZJWE1FOiBUaGlzIHdvbid0IGdldCB1cyBvdXQgb2YgdGhlIHBpbmNoLiAqLwotCQkJaWYgKHVubGlrZWx5KGogPj0gQVJSQVlfU0laRShvcmItPnBhZ2VfdGFibGUpKSkgewotCQkJCWZ3X2Vycm9yKCJwYWdlIHRhYmxlIG92ZXJmbG93XG4iKTsKLQkJCQlnb3RvIGZhaWxfcGFnZV90YWJsZTsKLQkJCX0KLQkJCWwgPSBtaW4oc2dfbGVuLCBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCk7Ci0JCQlvcmItPnBhZ2VfdGFibGVbal0ubG93ID0gY3B1X3RvX2JlMzIoc2dfYWRkcik7Ci0JCQlvcmItPnBhZ2VfdGFibGVbal0uaGlnaCA9IGNwdV90b19iZTMyKGwgPDwgMTYpOwotCQkJc2dfYWRkciArPSBsOwotCQkJc2dfbGVuIC09IGw7Ci0JCQlqKys7Ci0JCX0KKwlmb3JfZWFjaF9zZyhzZywgc2csIG4sIGkpIHsKKwkJb3JiLT5wYWdlX3RhYmxlW2ldLmhpZ2ggPSBjcHVfdG9fYmUzMihzZ19kbWFfbGVuKHNnKSA8PCAxNik7CisJCW9yYi0+cGFnZV90YWJsZVtpXS5sb3cgPSBjcHVfdG9fYmUzMihzZ19kbWFfYWRkcmVzcyhzZykpOwogCX0KIAogCW9yYi0+cGFnZV90YWJsZV9idXMgPQpAQCAtMTQzNywxMyArMTQwNCwxMyBAQAogCW9yYi0+cmVxdWVzdC5kYXRhX2Rlc2NyaXB0b3IuaGlnaCA9IGNwdV90b19iZTMyKGx1LT50Z3QtPmFkZHJlc3NfaGlnaCk7CiAJb3JiLT5yZXF1ZXN0LmRhdGFfZGVzY3JpcHRvci5sb3cgID0gY3B1X3RvX2JlMzIob3JiLT5wYWdlX3RhYmxlX2J1cyk7CiAJb3JiLT5yZXF1ZXN0Lm1pc2MgfD0gY3B1X3RvX2JlMzIoQ09NTUFORF9PUkJfUEFHRV9UQUJMRV9QUkVTRU5UIHwKLQkJCQkJIENPTU1BTkRfT1JCX0RBVEFfU0laRShqKSk7CisJCQkJCSBDT01NQU5EX09SQl9EQVRBX1NJWkUobikpOwogCiAJcmV0dXJuIDA7CiAKICBmYWlsX3BhZ2VfdGFibGU6Ci0JZG1hX3VubWFwX3NnKGRldmljZS0+Y2FyZC0+ZGV2aWNlLCBzZywgc2NzaV9zZ19jb3VudChvcmItPmNtZCksCi0JCSAgICAgb3JiLT5jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwlkbWFfdW5tYXBfc2coZGV2aWNlLT5jYXJkLT5kZXZpY2UsIHNjc2lfc2dsaXN0KG9yYi0+Y21kKSwKKwkJICAgICBzY3NpX3NnX2NvdW50KG9yYi0+Y21kKSwgb3JiLT5jbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKICBmYWlsOgogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMTQ1Niw3ICsxNDIzLDcgQEAKIAlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSBmd19kZXZpY2UobHUtPnRndC0+dW5pdC0+ZGV2aWNlLnBhcmVudCk7CiAJc3RydWN0IHNicDJfY29tbWFuZF9vcmIgKm9yYjsKIAl1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWQ7Ci0JaW50IHJldHZhbCA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJaW50IGdlbmVyYXRpb24sIHJldHZhbCA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CiAKIAkvKgogCSAqIEJpZGlyZWN0aW9uYWwgY29tbWFuZHMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQsIGFuZCB1bmtub3duCkBAIC0xNTAwLDYgKzE0NjcsOSBAQAogCWlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKIAkJb3JiLT5yZXF1ZXN0Lm1pc2MgfD0gY3B1X3RvX2JlMzIoQ09NTUFORF9PUkJfRElSRUNUSU9OKTsKIAorCWdlbmVyYXRpb24gPSBkZXZpY2UtPmdlbmVyYXRpb247CisJc21wX3JtYigpOyAgICAvKiBzYnAyX21hcF9zY2F0dGVybGlzdCBsb29rcyBhdCB0Z3QtPmFkZHJlc3NfaGlnaCAqLworCiAJaWYgKHNjc2lfc2dfY291bnQoY21kKSAmJiBzYnAyX21hcF9zY2F0dGVybGlzdChvcmIsIGRldmljZSwgbHUpIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTE1MTIsNyArMTQ4Miw3IEBACiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldmljZS0+Y2FyZC0+ZGV2aWNlLCBvcmItPmJhc2UucmVxdWVzdF9idXMpKQogCQlnb3RvIG91dDsKIAotCXNicDJfc2VuZF9vcmIoJm9yYi0+YmFzZSwgbHUsIGx1LT50Z3QtPm5vZGVfaWQsIGx1LT5nZW5lcmF0aW9uLAorCXNicDJfc2VuZF9vcmIoJm9yYi0+YmFzZSwgbHUsIGx1LT50Z3QtPm5vZGVfaWQsIGdlbmVyYXRpb24sCiAJCSAgICAgIGx1LT5jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHJlc3MgKyBTQlAyX09SQl9QT0lOVEVSKTsKIAlyZXR2YWwgPSAwOwogIG91dDoKQEAgLTE1NjQsNiArMTUzNCw4IEBACiAJaWYgKGx1LT50Z3QtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EXzEyOEtfTUFYX1RSQU5TKQogCQlibGtfcXVldWVfbWF4X3NlY3RvcnMoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgMTI4ICogMTAyNCAvIDUxMik7CiAKKwlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBTQlAyX01BWF9TRUdfU0laRSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jCmluZGV4IGU1ZDFhMGIuLjAyMmFjNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRyYW5zYWN0aW9uLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICovCiB2b2lkCiBmd19zZW5kX3JlcXVlc3Qoc3RydWN0IGZ3X2NhcmQgKmNhcmQsIHN0cnVjdCBmd190cmFuc2FjdGlvbiAqdCwKLQkJaW50IHRjb2RlLCBpbnQgbm9kZV9pZCwgaW50IGdlbmVyYXRpb24sIGludCBzcGVlZCwKKwkJaW50IHRjb2RlLCBpbnQgZGVzdGluYXRpb25faWQsIGludCBnZW5lcmF0aW9uLCBpbnQgc3BlZWQsCiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsCiAJCXZvaWQgKnBheWxvYWQsIHNpemVfdCBsZW5ndGgsCiAJCWZ3X3RyYW5zYWN0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrX2RhdGEpCkBAIC0yNzksMTMgKzI3OSwxNCBAQAogCWNhcmQtPmN1cnJlbnRfdGxhYmVsID0gKGNhcmQtPmN1cnJlbnRfdGxhYmVsICsgMSkgJiAweDFmOwogCWNhcmQtPnRsYWJlbF9tYXNrIHw9ICgxIDw8IHRsYWJlbCk7CiAKLQl0LT5ub2RlX2lkID0gbm9kZV9pZDsKKwl0LT5ub2RlX2lkID0gZGVzdGluYXRpb25faWQ7CiAJdC0+dGxhYmVsID0gdGxhYmVsOwogCXQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJdC0+Y2FsbGJhY2tfZGF0YSA9IGNhbGxiYWNrX2RhdGE7CiAKLQlmd19maWxsX3JlcXVlc3QoJnQtPnBhY2tldCwgdGNvZGUsIHQtPnRsYWJlbCwgbm9kZV9pZCwgY2FyZC0+bm9kZV9pZCwKLQkJCWdlbmVyYXRpb24sIHNwZWVkLCBvZmZzZXQsIHBheWxvYWQsIGxlbmd0aCk7CisJZndfZmlsbF9yZXF1ZXN0KCZ0LT5wYWNrZXQsIHRjb2RlLCB0LT50bGFiZWwsCisJCQlkZXN0aW5hdGlvbl9pZCwgY2FyZC0+bm9kZV9pZCwgZ2VuZXJhdGlvbiwKKwkJCXNwZWVkLCBvZmZzZXQsIHBheWxvYWQsIGxlbmd0aCk7CiAJdC0+cGFja2V0LmNhbGxiYWNrID0gdHJhbnNtaXRfY29tcGxldGVfY2FsbGJhY2s7CiAKIAlsaXN0X2FkZF90YWlsKCZ0LT5saW5rLCAmY2FyZC0+dHJhbnNhY3Rpb25fbGlzdCk7CkBAIC0yOTYsNiArMjk3LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZ3X3NlbmRfcmVxdWVzdCk7CiAKK3N0cnVjdCB0cmFuc2FjdGlvbl9jYWxsYmFja19kYXRhIHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCXZvaWQgKnBheWxvYWQ7CisJaW50IHJjb2RlOworfTsKKworc3RhdGljIHZvaWQgdHJhbnNhY3Rpb25fY2FsbGJhY2soc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCByY29kZSwKKwkJCQkgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IGxlbmd0aCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHJhbnNhY3Rpb25fY2FsbGJhY2tfZGF0YSAqZCA9IGRhdGE7CisKKwlpZiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpCisJCW1lbWNweShkLT5wYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOworCWQtPnJjb2RlID0gcmNvZGU7CisJY29tcGxldGUoJmQtPmRvbmUpOworfQorCisvKioKKyAqIGZ3X3J1bl90cmFuc2FjdGlvbiAtIHNlbmQgcmVxdWVzdCBhbmQgc2xlZXAgdW50aWwgdHJhbnNhY3Rpb24gaXMgY29tcGxldGVkCisgKgorICogUmV0dXJucyB0aGUgUkNPREUuCisgKi8KK2ludCBmd19ydW5fdHJhbnNhY3Rpb24oc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCB0Y29kZSwgaW50IGRlc3RpbmF0aW9uX2lkLAorCQlpbnQgZ2VuZXJhdGlvbiwgaW50IHNwZWVkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LAorCQl2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCXN0cnVjdCB0cmFuc2FjdGlvbl9jYWxsYmFja19kYXRhIGQ7CisJc3RydWN0IGZ3X3RyYW5zYWN0aW9uIHQ7CisKKwlpbml0X2NvbXBsZXRpb24oJmQuZG9uZSk7CisJZC5wYXlsb2FkID0gZGF0YTsKKwlmd19zZW5kX3JlcXVlc3QoY2FyZCwgJnQsIHRjb2RlLCBkZXN0aW5hdGlvbl9pZCwgZ2VuZXJhdGlvbiwgc3BlZWQsCisJCQlvZmZzZXQsIGRhdGEsIGxlbmd0aCwgdHJhbnNhY3Rpb25fY2FsbGJhY2ssICZkKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkLmRvbmUpOworCisJcmV0dXJuIGQucmNvZGU7Cit9CitFWFBPUlRfU1lNQk9MKGZ3X3J1bl90cmFuc2FjdGlvbik7CisKIHN0YXRpYyBERUZJTkVfTVVURVgocGh5X2NvbmZpZ19tdXRleCk7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHBoeV9jb25maWdfZG9uZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaCBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaAppbmRleCAyYWUxYjBkLi4wMjdmNThjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaApAQCAtNDI2LDExICs0MjYsMTQgQEAKIAogdm9pZAogZndfc2VuZF9yZXF1ZXN0KHN0cnVjdCBmd19jYXJkICpjYXJkLCBzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gKnQsCi0JCWludCB0Y29kZSwgaW50IG5vZGVfaWQsIGludCBnZW5lcmF0aW9uLCBpbnQgc3BlZWQsCi0JCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsCi0JCXZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgsCisJCWludCB0Y29kZSwgaW50IGRlc3RpbmF0aW9uX2lkLCBpbnQgZ2VuZXJhdGlvbiwgaW50IHNwZWVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoLAogCQlmd190cmFuc2FjdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpjYWxsYmFja19kYXRhKTsKIAoraW50IGZ3X3J1bl90cmFuc2FjdGlvbihzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgaW50IHRjb2RlLCBpbnQgZGVzdGluYXRpb25faWQsCisJCSAgICAgICBpbnQgZ2VuZXJhdGlvbiwgaW50IHNwZWVkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LAorCQkgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKIGludCBmd19jYW5jZWxfdHJhbnNhY3Rpb24oc3RydWN0IGZ3X2NhcmQgKmNhcmQsCiAJCQkgIHN0cnVjdCBmd190cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNDU1NTc1Yi4uM2U1MjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtMTUsNiArMTUsMTEgQEAKICAqLwogc3RhdGljIGNoYXIgZG1pX2VtcHR5X3N0cmluZ1tdID0gIiAgICAgICAgIjsKIAorLyoKKyAqIENhdGNoIHRvbyBlYXJseSBjYWxscyB0byBkbWlfY2hlY2tfc3lzdGVtKCk6CisgKi8KK3N0YXRpYyBpbnQgZG1pX2luaXRpYWxpemVkOworCiBzdGF0aWMgY29uc3QgY2hhciAqIF9faW5pdCBkbWlfc3RyaW5nX25vc2F2ZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCiB7CiAJY29uc3QgdTggKmJwID0gKCh1OCAqKSBkbSkgKyBkbS0+bGVuZ3RoOwpAQCAtMzY2LDcgKzM3MSw3IEBACiAKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJaWYgKGVmaS5zbWJpb3MgPT0gRUZJX0lOVkFMSURfVEFCTEVfQUREUikKLQkJCWdvdG8gb3V0OworCQkJZ290byBlcnJvcjsKIAogCQkvKiBUaGlzIGlzIGNhbGxlZCBhcyBhIGNvcmVfaW5pdGNhbGwoKSBiZWNhdXNlIGl0IGlzbid0CiAJCSAqIG5lZWRlZCBkdXJpbmcgZWFybHkgYm9vdC4gIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW4KQEAgLTM3NCwxMyArMzc5LDEzIEBACiAJCSAqLwogCQlwID0gZG1pX2lvcmVtYXAoZWZpLnNtYmlvcywgMzIpOwogCQlpZiAocCA9PSBOVUxMKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGVycm9yOwogCiAJCXJjID0gZG1pX3ByZXNlbnQocCArIDB4MTApOyAvKiBvZmZzZXQgb2YgX0RNSV8gc3RyaW5nICovCiAJCWRtaV9pb3VubWFwKHAsIDMyKTsKIAkJaWYgKCFyYykgewogCQkJZG1pX2F2YWlsYWJsZSA9IDE7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAllbHNlIHsKQEAgLTM5MSwxOSArMzk2LDIyIEBACiAJCSAqLwogCQlwID0gZG1pX2lvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7CiAJCWlmIChwID09IE5VTEwpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyb3I7CiAKIAkJZm9yIChxID0gcDsgcSA8IHAgKyAweDEwMDAwOyBxICs9IDE2KSB7CiAJCQlyYyA9IGRtaV9wcmVzZW50KHEpOwogCQkJaWYgKCFyYykgewogCQkJCWRtaV9hdmFpbGFibGUgPSAxOwogCQkJCWRtaV9pb3VubWFwKHAsIDB4MTAwMDApOwotCQkJCXJldHVybjsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQogCQlkbWlfaW91bm1hcChwLCAweDEwMDAwKTsKIAl9Ci0gb3V0OglwcmludGsoS0VSTl9JTkZPICJETUkgbm90IHByZXNlbnQgb3IgaW52YWxpZC5cbiIpOworIGVycm9yOgorCXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudCBvciBpbnZhbGlkLlxuIik7Cisgb3V0OgorCWRtaV9pbml0aWFsaXplZCA9IDE7CiB9CiAKIC8qKgpAQCAtNDI0LDYgKzQzMiw4IEBACiAJaW50IGksIGNvdW50ID0gMDsKIAljb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCA9IGxpc3Q7CiAKKwlXQVJOKCFkbWlfaW5pdGlhbGl6ZWQsIEtFUk5fRVJSICJkbWkgY2hlY2s6IG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKKwogCXdoaWxlIChkLT5pZGVudCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkLT5tYXRjaGVzKTsgaSsrKSB7CiAJCQlpbnQgcyA9IGQtPm1hdGNoZXNbaV0uc2xvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdC5jIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKaW5kZXggYjkxZWY2My4uZGViMTU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0LmMKQEAgLTMzNCw5ICszMzQsOSBAQAogLyoKICAqICBSb3V0aW5lcyBmb3IgcGFyc2luZyB0aGUgaUJGVCBkYXRhIHRvIGJlIGh1bWFuIHJlYWRhYmxlLgogICovCi1zc2l6ZV90IGliZnRfYXR0cl9zaG93X2luaXRpYXRvcihzdHJ1Y3QgaWJmdF9rb2JqZWN0ICplbnRyeSwKLQkJCQkgIHN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGliZnRfYXR0cl9zaG93X2luaXRpYXRvcihzdHJ1Y3QgaWJmdF9rb2JqZWN0ICplbnRyeSwKKwkJCQkJc3RydWN0IGliZnRfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGliZnRfaW5pdGlhdG9yICppbml0aWF0b3IgPSBlbnRyeS0+aW5pdGlhdG9yOwogCXZvaWQgKmliZnRfbG9jID0gZW50cnktPmhlYWRlcjsKQEAgLTM3Niw5ICszNzYsOSBAQAogCXJldHVybiBzdHIgLSBidWY7CiB9CiAKLXNzaXplX3QgaWJmdF9hdHRyX3Nob3dfbmljKHN0cnVjdCBpYmZ0X2tvYmplY3QgKmVudHJ5LAotCQkJICAgIHN0cnVjdCBpYmZ0X2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBpYmZ0X2F0dHJfc2hvd19uaWMoc3RydWN0IGliZnRfa29iamVjdCAqZW50cnksCisJCQkJICBzdHJ1Y3QgaWJmdF9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGliZnRfbmljICpuaWMgPSBlbnRyeS0+bmljOwogCXZvaWQgKmliZnRfbG9jID0gZW50cnktPmhlYWRlcjsKQEAgLTQ0MCw5ICs0NDAsOSBAQAogCXJldHVybiBzdHIgLSBidWY7CiB9OwogCi1zc2l6ZV90IGliZnRfYXR0cl9zaG93X3RhcmdldChzdHJ1Y3QgaWJmdF9rb2JqZWN0ICplbnRyeSwKLQkJCSAgICAgICBzdHJ1Y3QgaWJmdF9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgaWJmdF9hdHRyX3Nob3dfdGFyZ2V0KHN0cnVjdCBpYmZ0X2tvYmplY3QgKmVudHJ5LAorCQkJCSAgICAgc3RydWN0IGliZnRfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBpYmZ0X3RndCAqdGd0ID0gZW50cnktPnRndDsKIAl2b2lkICppYmZ0X2xvYyA9IGVudHJ5LT5oZWFkZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA4ZDI5NDA1Li45MTEyODMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTY3LDE3ICs2NywyOCBAQAogICogd2hlbiBzZXR0aW5nIGRpcmVjdGlvbiwgYW5kIG90aGVyd2lzZSBpbGxlZ2FsLiAgVW50aWwgYm9hcmQgc2V0dXAgY29kZQogICogYW5kIGRyaXZlcnMgdXNlIGV4cGxpY2l0IHJlcXVlc3RzIGV2ZXJ5d2hlcmUgKHdoaWNoIHdvbid0IGhhcHBlbiB3aGVuCiAgKiB0aG9zZSBjYWxscyBoYXZlIG5vIHRlZXRoKSB3ZSBjYW4ndCBhdm9pZCBhdXRvcmVxdWVzdGluZy4gIFRoaXMgbmFnCi0gKiBtZXNzYWdlIHNob3VsZCBtb3RpdmF0ZSBzd2l0Y2hpbmcgdG8gZXhwbGljaXQgcmVxdWVzdHMuLi4KKyAqIG1lc3NhZ2Ugc2hvdWxkIG1vdGl2YXRlIHN3aXRjaGluZyB0byBleHBsaWNpdCByZXF1ZXN0cy4uLiBzbyBzaG91bGQKKyAqIHRoZSB3ZWFrZXIgY2xlYW51cCBhZnRlciBmYXVsdHMsIGNvbXBhcmVkIHRvIGdwaW9fcmVxdWVzdCgpLgogICovCi1zdGF0aWMgdm9pZCBncGlvX2Vuc3VyZV9yZXF1ZXN0ZWQoc3RydWN0IGdwaW9fZGVzYyAqZGVzYykKK3N0YXRpYyBpbnQgZ3Bpb19lbnN1cmVfcmVxdWVzdGVkKHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChGTEFHX1JFUVVFU1RFRCwgJmRlc2MtPmZsYWdzKSA9PSAwKSB7Ci0JCXByX3dhcm5pbmcoIkdQSU8tJWQgYXV0b3JlcXVlc3RlZFxuIiwgKGludCkoZGVzYyAtIGdwaW9fZGVzYykpOworCQlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gZGVzYy0+Y2hpcDsKKwkJaW50IGdwaW8gPSBjaGlwLT5iYXNlICsgb2Zmc2V0OworCisJCWlmICghdHJ5X21vZHVsZV9nZXQoY2hpcC0+b3duZXIpKSB7CisJCQlwcl9lcnIoIkdQSU8tJWQ6IG1vZHVsZSBjYW4ndCBiZSBnb3R0ZW4gXG4iLCBncGlvKTsKKwkJCWNsZWFyX2JpdChGTEFHX1JFUVVFU1RFRCwgJmRlc2MtPmZsYWdzKTsKKwkJCS8qIGxvc2UgKi8KKwkJCXJldHVybiAtRUlPOworCQl9CisJCXByX3dhcm5pbmcoIkdQSU8tJWQgYXV0b3JlcXVlc3RlZFxuIiwgZ3Bpbyk7CiAJCWRlc2Nfc2V0X2xhYmVsKGRlc2MsICJbYXV0b10iKTsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChkZXNjLT5jaGlwLT5vd25lcikpCi0JCQlwcl9lcnIoIkdQSU8tJWQ6IG1vZHVsZSBjYW4ndCBiZSBnb3R0ZW4gXG4iLAotCQkJCQkoaW50KShkZXNjIC0gZ3Bpb19kZXNjKSk7CisJCS8qIGNhbGxlciBtdXN0IGNoaXAtPnJlcXVlc3QoKSB3L28gc3BpbmxvY2sgKi8KKwkJaWYgKGNoaXAtPnJlcXVlc3QpCisJCQlyZXR1cm4gMTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIGNhbGxlciBob2xkcyBncGlvX2xvY2sgKk9SKiBncGlvIGlzIG1hcmtlZCBhcyByZXF1ZXN0ZWQgKi8KQEAgLTc1Miw2ICs3NjMsNyBAQAogaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAlzdHJ1Y3QgZ3Bpb19kZXNjCSpkZXNjOworCXN0cnVjdCBncGlvX2NoaXAJKmNoaXA7CiAJaW50CQkJc3RhdHVzID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIApAQCAtNzYwLDE0ICs3NzIsMTUgQEAKIAlpZiAoIWdwaW9faXNfdmFsaWQoZ3BpbykpCiAJCWdvdG8gZG9uZTsKIAlkZXNjID0gJmdwaW9fZGVzY1tncGlvXTsKLQlpZiAoZGVzYy0+Y2hpcCA9PSBOVUxMKQorCWNoaXAgPSBkZXNjLT5jaGlwOworCWlmIChjaGlwID09IE5VTEwpCiAJCWdvdG8gZG9uZTsKIAotCWlmICghdHJ5X21vZHVsZV9nZXQoZGVzYy0+Y2hpcC0+b3duZXIpKQorCWlmICghdHJ5X21vZHVsZV9nZXQoY2hpcC0+b3duZXIpKQogCQlnb3RvIGRvbmU7CiAKIAkvKiBOT1RFOiAgZ3Bpb19yZXF1ZXN0KCkgY2FuIGJlIGNhbGxlZCBpbiBlYXJseSBib290LAotCSAqIGJlZm9yZSBJUlFzIGFyZSBlbmFibGVkLgorCSAqIGJlZm9yZSBJUlFzIGFyZSBlbmFibGVkLCBmb3Igbm9uLXNsZWVwaW5nIChTT0MpIEdQSU9zLgogCSAqLwogCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxBR19SRVFVRVNURUQsICZkZXNjLT5mbGFncykgPT0gMCkgewpAQCAtNzc1LDcgKzc4OCwyMCBAQAogCQlzdGF0dXMgPSAwOwogCX0gZWxzZSB7CiAJCXN0YXR1cyA9IC1FQlVTWTsKLQkJbW9kdWxlX3B1dChkZXNjLT5jaGlwLT5vd25lcik7CisJCW1vZHVsZV9wdXQoY2hpcC0+b3duZXIpOworCX0KKworCWlmIChjaGlwLT5yZXF1ZXN0KSB7CisJCS8qIGNoaXAtPnJlcXVlc3QgbWF5IHNsZWVwICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQlzdGF0dXMgPSBjaGlwLT5yZXF1ZXN0KGNoaXAsIGdwaW8gLSBjaGlwLT5iYXNlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkZXNjX3NldF9sYWJlbChkZXNjLCBOVUxMKTsKKwkJCW1vZHVsZV9wdXQoY2hpcC0+b3duZXIpOworCQkJY2xlYXJfYml0KEZMQUdfUkVRVUVTVEVELCAmZGVzYy0+ZmxhZ3MpOworCQl9CiAJfQogCiBkb25lOgpAQCAtNzkxLDYgKzgxNyw5IEBACiB7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJc3RydWN0IGdwaW9fZGVzYwkqZGVzYzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCSpjaGlwOworCisJbWlnaHRfc2xlZXAoKTsKIAogCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkgewogCQlXQVJOX09OKGV4dHJhX2NoZWNrcyk7CkBAIC04MDIsOSArODMxLDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCiAJZGVzYyA9ICZncGlvX2Rlc2NbZ3Bpb107Ci0JaWYgKGRlc2MtPmNoaXAgJiYgdGVzdF9hbmRfY2xlYXJfYml0KEZMQUdfUkVRVUVTVEVELCAmZGVzYy0+ZmxhZ3MpKSB7CisJY2hpcCA9IGRlc2MtPmNoaXA7CisJaWYgKGNoaXAgJiYgdGVzdF9iaXQoRkxBR19SRVFVRVNURUQsICZkZXNjLT5mbGFncykpIHsKKwkJaWYgKGNoaXAtPmZyZWUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQkJbWlnaHRfc2xlZXBfaWYoZXh0cmFfY2hlY2tzICYmIGNoaXAtPmNhbl9zbGVlcCk7CisJCQljaGlwLT5mcmVlKGNoaXAsIGdwaW8gLSBjaGlwLT5iYXNlKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwkJfQogCQlkZXNjX3NldF9sYWJlbChkZXNjLCBOVUxMKTsKIAkJbW9kdWxlX3B1dChkZXNjLT5jaGlwLT5vd25lcik7CisJCWNsZWFyX2JpdChGTEFHX1JFUVVFU1RFRCwgJmRlc2MtPmZsYWdzKTsKIAl9IGVsc2UKIAkJV0FSTl9PTihleHRyYV9jaGVja3MpOwogCkBAIC04NjksNyArOTA2LDkgQEAKIAlncGlvIC09IGNoaXAtPmJhc2U7CiAJaWYgKGdwaW8gPj0gY2hpcC0+bmdwaW8pCiAJCWdvdG8gZmFpbDsKLQlncGlvX2Vuc3VyZV9yZXF1ZXN0ZWQoZGVzYyk7CisJc3RhdHVzID0gZ3Bpb19lbnN1cmVfcmVxdWVzdGVkKGRlc2MsIGdwaW8pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CiAKIAkvKiBub3cgd2Uga25vdyB0aGUgZ3BpbyBpcyB2YWxpZCBhbmQgY2hpcCB3b24ndCB2YW5pc2ggKi8KIApAQCAtODc3LDkgKzkxNiwyMiBAQAogCiAJbWlnaHRfc2xlZXBfaWYoZXh0cmFfY2hlY2tzICYmIGNoaXAtPmNhbl9zbGVlcCk7CiAKKwlpZiAoc3RhdHVzKSB7CisJCXN0YXR1cyA9IGNoaXAtPnJlcXVlc3QoY2hpcCwgZ3Bpbyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcl9kZWJ1ZygiR1BJTy0lZDogY2hpcCByZXF1ZXN0IGZhaWwsICVkXG4iLAorCQkJCWNoaXAtPmJhc2UgKyBncGlvLCBzdGF0dXMpOworCQkJLyogYW5kIGl0J3Mgbm90IGF2YWlsYWJsZSB0byBhbnlvbmUgZWxzZSAuLi4KKwkJCSAqIGdwaW9fcmVxdWVzdCgpIGlzIHRoZSBmdWxseSBjbGVhbiBzb2x1dGlvbi4KKwkJCSAqLworCQkJZ290byBsb3NlOworCQl9CisJfQorCiAJc3RhdHVzID0gY2hpcC0+ZGlyZWN0aW9uX2lucHV0KGNoaXAsIGdwaW8pOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJY2xlYXJfYml0KEZMQUdfSVNfT1VULCAmZGVzYy0+ZmxhZ3MpOworbG9zZToKIAlyZXR1cm4gc3RhdHVzOwogZmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKQEAgLTkwNyw3ICs5NTksOSBAQAogCWdwaW8gLT0gY2hpcC0+YmFzZTsKIAlpZiAoZ3BpbyA+PSBjaGlwLT5uZ3BpbykKIAkJZ290byBmYWlsOwotCWdwaW9fZW5zdXJlX3JlcXVlc3RlZChkZXNjKTsKKwlzdGF0dXMgPSBncGlvX2Vuc3VyZV9yZXF1ZXN0ZWQoZGVzYywgZ3Bpbyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKIAogCS8qIG5vdyB3ZSBrbm93IHRoZSBncGlvIGlzIHZhbGlkIGFuZCBjaGlwIHdvbid0IHZhbmlzaCAqLwogCkBAIC05MTUsOSArOTY5LDIyIEBACiAKIAltaWdodF9zbGVlcF9pZihleHRyYV9jaGVja3MgJiYgY2hpcC0+Y2FuX3NsZWVwKTsKIAorCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gY2hpcC0+cmVxdWVzdChjaGlwLCBncGlvKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByX2RlYnVnKCJHUElPLSVkOiBjaGlwIHJlcXVlc3QgZmFpbCwgJWRcbiIsCisJCQkJY2hpcC0+YmFzZSArIGdwaW8sIHN0YXR1cyk7CisJCQkvKiBhbmQgaXQncyBub3QgYXZhaWxhYmxlIHRvIGFueW9uZSBlbHNlIC4uLgorCQkJICogZ3Bpb19yZXF1ZXN0KCkgaXMgdGhlIGZ1bGx5IGNsZWFuIHNvbHV0aW9uLgorCQkJICovCisJCQlnb3RvIGxvc2U7CisJCX0KKwl9CisKIAlzdGF0dXMgPSBjaGlwLT5kaXJlY3Rpb25fb3V0cHV0KGNoaXAsIGdwaW8sIHZhbHVlKTsKIAlpZiAoc3RhdHVzID09IDApCiAJCXNldF9iaXQoRkxBR19JU19PVVQsICZkZXNjLT5mbGFncyk7Citsb3NlOgogCXJldHVybiBzdGF0dXM7CiBmYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwpAQCAtMTAwOCw2ICsxMDc1LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2dwaW9fY2Fuc2xlZXApOwogCisvKioKKyAqIF9fZ3Bpb190b19pcnEoKSAtIHJldHVybiB0aGUgSVJRIGNvcnJlc3BvbmRpbmcgdG8gYSBHUElPCisgKiBAZ3BpbzogZ3BpbyB3aG9zZSBJUlEgd2lsbCBiZSByZXR1cm5lZCAoYWxyZWFkeSByZXF1ZXN0ZWQpCisgKiBDb250ZXh0OiBhbnkKKyAqCisgKiBUaGlzIGlzIHVzZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBpbXBsZW1lbnQgZ3Bpb190b19pcnEoKS4KKyAqIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgSVJRIHNpZ25hbGVkIGJ5IHRoaXMgKGlucHV0KSBHUElPLAorICogb3IgYSBuZWdhdGl2ZSBlcnJuby4KKyAqLworaW50IF9fZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwCSpjaGlwOworCisJY2hpcCA9IGdwaW9fdG9fY2hpcChncGlvKTsKKwlyZXR1cm4gY2hpcC0+dG9faXJxID8gY2hpcC0+dG9faXJxKGNoaXAsIGdwaW8gLSBjaGlwLT5iYXNlKSA6IC1FTlhJTzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZ3Bpb190b19pcnEpOworCiAKIAogLyogVGhlcmUncyBubyB2YWx1ZSBpbiBtYWtpbmcgaXQgZWFzeSB0byBpbmxpbmUgR1BJTyBjYWxscyB0aGF0IG1heSBzbGVlcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tYXg3MzAxLmMgYi9kcml2ZXJzL2dwaW8vbWF4NzMwMS5jCmluZGV4IDM5Yzc5NWEuLjhiMjRkNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9tYXg3MzAxLmMKKysrIGIvZHJpdmVycy9ncGlvL21heDczMDEuYwpAQCAtMjU1LDEwICsyNTUsNiBAQAogCXRzLT5jaGlwLmRldiA9ICZzcGktPmRldjsKIAl0cy0+Y2hpcC5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ0cy0+Y2hpcCk7Ci0JaWYgKHJldCkKLQkJZ290byBleGl0X2Rlc3Ryb3k7Ci0KIAkvKgogCSAqIHRyaXN0YXRlIGFsbCBwaW5zIGluIGhhcmR3YXJlIGFuZCBjYWNoZSB0aGUKIAkgKiByZWdpc3RlciB2YWx1ZXMgZm9yIGxhdGVyIHVzZS4KQEAgLTI2OSwxNyArMjY1LDE5IEBACiAJCW1heDczMDFfd3JpdGUoc3BpLCAweDA4ICsgaSwgMHhBQSk7CiAJCXRzLT5wb3J0X2NvbmZpZ1tpXSA9IDB4QUE7CiAJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCWludCBpZHggPSB0cy0+Y2hpcC5iYXNlICsgKGkgLSAxKSAqIDQgKyBqOwotCQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoaWR4KTsKKwkJCWludCBvZmZzZXQgPSAoaSAtIDEpICogNCArIGo7CisJCQlyZXQgPSBtYXg3MzAxX2RpcmVjdGlvbl9pbnB1dCgmdHMtPmNoaXAsIG9mZnNldCk7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gZXhpdF9yZW1vdmU7Ci0JCQlncGlvX2ZyZWUoaWR4KTsKKwkJCQlnb3RvIGV4aXRfZGVzdHJveTsKIAkJfQogCX0KKworCXJldCA9IGdwaW9jaGlwX2FkZCgmdHMtPmNoaXApOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9kZXN0cm95OworCiAJcmV0dXJuIHJldDsKIAotZXhpdF9yZW1vdmU6Ci0JZ3Bpb2NoaXBfcmVtb3ZlKCZ0cy0+Y2hpcCk7CiBleGl0X2Rlc3Ryb3k6CiAJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CiAJbXV0ZXhfZGVzdHJveSgmdHMtPmxvY2spOwpAQCAtMzI1LDEzICszMjMsMTUgQEAKIHsKIAlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbWF4NzMwMV9kcml2ZXIpOwogfQorLyogcmVnaXN0ZXIgYWZ0ZXIgc3BpIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwobWF4NzMwMV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IG1heDczMDFfZXhpdCh2b2lkKQogewogCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWF4NzMwMV9kcml2ZXIpOwogfQotCi1tb2R1bGVfaW5pdChtYXg3MzAxX2luaXQpOwogbW9kdWxlX2V4aXQobWF4NzMwMV9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiSnVlcmdlbiBCZWlzZXJ0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vbWF4NzMyeC5jIGIvZHJpdmVycy9ncGlvL21heDczMnguYwppbmRleCBiNTFjODEzLi41NWFlOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vbWF4NzMyeC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzJ4LmMKQEAgLTM3Miw3ICszNzIsMTAgQEAKIHsKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDczMnhfZHJpdmVyKTsKIH0KLW1vZHVsZV9pbml0KG1heDczMnhfaW5pdCk7CisvKiByZWdpc3RlciBhZnRlciBpMmMgcG9zdGNvcmUgaW5pdGNhbGwgYW5kIGJlZm9yZQorICogc3Vic3lzIGluaXRjYWxscyB0aGF0IG1heSByZWx5IG9uIHRoZXNlIEdQSU9zCisgKi8KK3N1YnN5c19pbml0Y2FsbChtYXg3MzJ4X2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWF4NzMyeF9leGl0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9tY3AyM3MwOC5jCmluZGV4IDhhMWI0MDUuLjg5YzFkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9tY3AyM3MwOC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9tY3AyM3MwOC5jCkBAIC00MTksNyArNDE5LDEwIEBACiB7CiAJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1jcDIzczA4X2RyaXZlcik7CiB9Ci1tb2R1bGVfaW5pdChtY3AyM3MwOF9pbml0KTsKKy8qIHJlZ2lzdGVyIGFmdGVyIHNwaSBwb3N0Y29yZSBpbml0Y2FsbCBhbmQgYmVmb3JlCisgKiBzdWJzeXMgaW5pdGNhbGxzIHRoYXQgbWF5IHJlbHkgb24gdGhlc2UgR1BJT3MKKyAqLworc3Vic3lzX2luaXRjYWxsKG1jcDIzczA4X2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWNwMjNzMDhfZXhpdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggY2M4NDY4Ni4uOWNlZWI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCkBAIC0yODksNyArMjg5LDEwIEBACiB7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2E5NTN4X2RyaXZlcik7CiB9Ci1tb2R1bGVfaW5pdChwY2E5NTN4X2luaXQpOworLyogcmVnaXN0ZXIgYWZ0ZXIgaTJjIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwocGNhOTUzeF9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHBjYTk1M3hfZXhpdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjZjg1N3guYyBiL2RyaXZlcnMvZ3Bpby9wY2Y4NTd4LmMKaW5kZXggZmM5YzZhZS4uNGJjMjA3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjZjg1N3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNmODU3eC5jCkBAIC0zNTEsNyArMzUxLDEwIEBACiB7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTd4X2RyaXZlcik7CiB9Ci1tb2R1bGVfaW5pdChwY2Y4NTd4X2luaXQpOworLyogcmVnaXN0ZXIgYWZ0ZXIgaTJjIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJzeXNfaW5pdGNhbGwocGNmODU3eF9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHBjZjg1N3hfZXhpdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKaW5kZXggODg5NzQzNC4uOWFjNDcyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAlSSU5HX0xPQ0FMUzsKIAogCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKLQkJICBfX0ZVTkNUSU9OX18sCisJCSAgX19mdW5jX18sCiAJCSAgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKIAkJICBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlKTsKIApAQCAtNjQyLDcgKzY0Miw3IEBACiBzdGF0aWMgaW50IGk5MTVfZmxpcF9idWZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCIlc1xuIiwgX19mdW5jX18pOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggY2FjZjg5ZS4uZjU5OTlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC9LY29uZmlnCkBAIC02Nyw0ICs2NywyMDEgQEAKIAogc291cmNlICJkcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZyIKIAorbWVudSAiU3BlY2lhbCBISUQgZHJpdmVycyIKKwlkZXBlbmRzIG9uIEhJRAorCitjb25maWcgSElEX0NPTVBBVAorCWJvb2wgIkxvYWQgYWxsIEhJRCBkcml2ZXJzIG9uIGhpZCBjb3JlIGxvYWQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCUNvbXBhdGlibGUgb3B0aW9uIGZvciBvbGRlciB1c2Vyc3BhY2UuIElmIHlvdSBoYXZlIHN5c3RlbSB3aXRob3V0IHVkZXYKKwlzdXBwb3J0IG9mIG1vZHVsZSBsb2FkaW5nIHRocm91Z2ggYWxpYXNlcyBhbmQgYWxzbyBvbGQKKwltb2R1bGUtaW5pdC10b29scyB3aGljaCBjYW4ndCBoYW5kbGUgaGlkIGJ1cywgY2hvb3NlIFkgaGVyZS4gT3RoZXJ3aXNlCisJc2F5IE4uIElmIHlvdSBzYXkgTiBhbmQgeW91ciB1c2Vyc3BhY2UgaXMgb2xkIGVub3VnaCwgdGhlIG9ubHkKKwlmdW5jdGlvbmFsaXR5IHlvdSBsb3NlIGlzIG1vZHVsZXMgYXV0b2xvYWRpbmcuCisKKwlJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgSElEX0E0VEVDSAorCXRyaXN0YXRlICJBNCB0ZWNoIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBBNCB0ZWNoIFg1IGFuZCBXT1AtMzUgLyBUcnVzdCA0NTBMIG1pY2UuCisKK2NvbmZpZyBISURfQVBQTEUKKwl0cmlzdGF0ZSAiQXBwbGUiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiAoVVNCX0hJRCB8fCBCVF9ISURQKQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBzb21lIEFwcGxlIGRldmljZXMgd2hpY2ggbGVzcyBvciBtb3JlIGJyZWFrCisJSElEIHNwZWNpZmljYXRpb24uCisKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGtleWJvYXJkcyBvZglBcHBsZSBpQm9va3MsIFBvd2VyQm9va3MsCisJTWFjQm9va3MsIE1hY0Jvb2sgUHJvcyBhbmQgQXBwbGUgQWx1bWludW0uCisKK2NvbmZpZyBISURfQkVMS0lOCisJdHJpc3RhdGUgIkJlbGtpbiIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgQmVsa2luIEZsaXAgS1ZNIGFuZCBXaXJlbGVzcyBrZXlib2FyZC4KKworY29uZmlnIEhJRF9CUklHSFQKKwl0cmlzdGF0ZSAiQnJpZ2h0IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBCcmlnaHQgQUJOVC0yIGtleWJvYXJkLgorCitjb25maWcgSElEX0NIRVJSWQorCXRyaXN0YXRlICJDaGVycnkiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZC4KKworY29uZmlnIEhJRF9DSElDT05ZCisJdHJpc3RhdGUgIkNoaWNvbnkiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIENoaWNvbnkgVGFjdGljYWwgcGFkLgorCitjb25maWcgSElEX0NZUFJFU1MKKwl0cmlzdGF0ZSAiQ3lwcmVzcyIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgY3lwcmVzcyBtb3VzZSBhbmQgYmFyY29kZSByZWFkZXJzLgorCitjb25maWcgSElEX0RFTEwKKwl0cmlzdGF0ZSAiRGVsbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgcXVpcmt5IERlbGwgSElEIGhhcmR3YXJlIHRoYXQgcmVxdWlyZQorCXNwZWNpYWwgTEVEIGhhbmRsaW5nIChXNzY1OCBhbmQgU0s4MTE1IG1vZGVscykKKworY29uZmlnIEhJRF9FWktFWQorCXRyaXN0YXRlICJFemtleSIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgRXprZXkgQlRDIDgxOTMga2V5Ym9hcmQuCisKK2NvbmZpZyBISURfR1lSQVRJT04KKwl0cmlzdGF0ZSAiR3lyYXRpb24iIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIEd5cmF0aW9uIHJlbW90ZSBjb250cm9sLgorCitjb25maWcgSElEX0xPR0lURUNICisJdHJpc3RhdGUgIkxvZ2l0ZWNoIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBMb2dpdGVjaCBkZXZpY2VzIHRoYXQgYXJlIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCBISUQgc3RhbmRhcmQuCisKK2NvbmZpZyBMT0dJVEVDSF9GRgorCWJvb2wgIkxvZ2l0ZWNoIGZvcmNlIGZlZWRiYWNrIgorCWRlcGVuZHMgb24gSElEX0xPR0lURUNICisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBkZXZpY2VzOgorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZAorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZCAyCisJICAtIExvZ2l0ZWNoIFdpbmdNYW4gRm9yY2UgM0QKKwkgIC0gTG9naXRlY2ggRm9ybXVsYSBGb3JjZSBFWAorCSAgLSBMb2dpdGVjaCBNT01PIEZvcmNlIHdoZWVsCisKKwkgIGFuZCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgZm9yIHRoZW0uCisJICBOb3RlOiBpZiB5b3Ugc2F5IE4gaGVyZSwgdGhpcyBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB3aXRob3V0CisJICBmb3JjZSBmZWVkYmFjay4KKworY29uZmlnIExPR0lSVU1CTEVQQUQyX0ZGCisJYm9vbCAiTG9naXRlY2ggUnVtYmxlcGFkIDIgZm9yY2UgZmVlZGJhY2siCisJZGVwZW5kcyBvbiBISURfTE9HSVRFQ0gKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIExvZ2l0ZWNoCisJICBSdW1ibGVwYWQgMiBkZXZpY2VzLgorCitjb25maWcgSElEX01JQ1JPU09GVAorCXRyaXN0YXRlICJNaWNyb3NvZnQiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIE1pY3Jvc29mdCBkZXZpY2VzIHRoYXQgYXJlIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCBISUQgc3RhbmRhcmQuCisKK2NvbmZpZyBISURfTU9OVEVSRVkKKwl0cmlzdGF0ZSAiTW9udGVyZXkiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIE1vbnRlcmV5IEdlbml1cyBLQjI5RS4KKworY29uZmlnIEhJRF9QQU5USEVSTE9SRAorCXRyaXN0YXRlICJQYW50aGVybG9yZCBkZXZpY2VzIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBkZXZpY2Ugc3VwcG9ydC4KKworY29uZmlnIFBBTlRIRVJMT1JEX0ZGCisJYm9vbCAiUGFudGhlcmxvcmQgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhJRF9QQU5USEVSTE9SRAorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKKwkgIG9yIGFkYXB0ZXIgYW5kIHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGl0LgorCitjb25maWcgSElEX1BFVEFMWU5YCisJdHJpc3RhdGUgIlBldGFseW54IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBQZXRhbHlueCBNYXh0ZXIgcmVtb3RlIGNvbnRyb2wuCisKK2NvbmZpZyBISURfU0FNU1VORworCXRyaXN0YXRlICJTYW1zdW5nIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTdXBwb3J0IGZvciBTYW1zdW5nIEluZnJhUmVkIHJlbW90ZSBjb250cm9sLgorCitjb25maWcgSElEX1NPTlkKKwl0cmlzdGF0ZSAiU29ueSIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgU29ueSBQUzMgY29udHJvbGxlci4KKworY29uZmlnIEhJRF9TVU5QTFVTCisJdHJpc3RhdGUgIlN1bnBsdXMiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfSElECisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIFN1bnBsdXMgd2lyZWxlc3MgZGVza3RvcC4KKworY29uZmlnIFRIUlVTVE1BU1RFUl9GRgorCXRyaXN0YXRlICJUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBzdXBwb3J0IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFRIUlVTVE1BU1RFUiBGaXJlU3RvcmUgRHVhbCBQb3dlciAyIG9yCisJICBhIFRIUlVTVE1BU1RFUiBGZXJyYXJpIEdUIFJ1bWJsZSBGb3JjZSBvciBGb3JjZSBGZWVkYmFjayBXaGVlbC4KKworY29uZmlnIFpFUk9QTFVTX0ZGCisJdHJpc3RhdGUgIlplcm9wbHVzIGJhc2VkIGdhbWUgY29udHJvbGxlciBzdXBwb3J0IgorCWRlZmF1bHQgbQorCWRlcGVuZHMgb24gVVNCX0hJRAorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFplcm9wbHVzIGJhc2VkIGdhbWUgY29udHJvbGxlci4KKworZW5kbWVudQorCiBlbmRpZiAjIEhJRF9TVVBQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCmluZGV4IDI3NWRjNTIuLmIwOWU0M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCkBAIC0xLDEzICsxLDQ2IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgSElEIGRyaXZlcgogIwotaGlkLW9ianMJCQk6PSBoaWQtY29yZS5vIGhpZC1pbnB1dC5vIGhpZC1pbnB1dC1xdWlya3MubworaGlkLW9ianMJCQk6PSBoaWQtY29yZS5vIGhpZC1pbnB1dC5vCiAKIG9iai0kKENPTkZJR19ISUQpCQkrPSBoaWQubwogCiBoaWQtJChDT05GSUdfSElEX0RFQlVHKQkJKz0gaGlkLWRlYnVnLm8KIGhpZC0kKENPTkZJR19ISURSQVcpCQkrPSBoaWRyYXcubwogCitpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorb2JqLW0JCQkJKz0gaGlkLWR1bW15Lm8KK2VuZGlmCisKK2hpZC1sb2dpdGVjaC1vYmpzCQk6PSBoaWQtbGcubworaWZkZWYgQ09ORklHX0xPR0lURUNIX0ZGCisJaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnZmYubworZW5kaWYKK2lmZGVmIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRgorCWhpZC1sb2dpdGVjaC1vYmpzCSs9IGhpZC1sZzJmZi5vCitlbmRpZgorCitvYmotJChDT05GSUdfSElEX0E0VEVDSCkJKz0gaGlkLWE0dGVjaC5vCitvYmotJChDT05GSUdfSElEX0FQUExFKQkJKz0gaGlkLWFwcGxlLm8KK29iai0kKENPTkZJR19ISURfQkVMS0lOKQkrPSBoaWQtYmVsa2luLm8KK29iai0kKENPTkZJR19ISURfQlJJR0hUKQkrPSBoaWQtYnJpZ2h0Lm8KK29iai0kKENPTkZJR19ISURfQ0hFUlJZKQkrPSBoaWQtY2hlcnJ5Lm8KK29iai0kKENPTkZJR19ISURfQ0hJQ09OWSkJKz0gaGlkLWNoaWNvbnkubworb2JqLSQoQ09ORklHX0hJRF9DWVBSRVNTKQkrPSBoaWQtY3lwcmVzcy5vCitvYmotJChDT05GSUdfSElEX0RFTEwpCQkrPSBoaWQtZGVsbC5vCitvYmotJChDT05GSUdfSElEX0VaS0VZKQkJKz0gaGlkLWV6a2V5Lm8KK29iai0kKENPTkZJR19ISURfR1lSQVRJT04pCSs9IGhpZC1neXJhdGlvbi5vCitvYmotJChDT05GSUdfSElEX0xPR0lURUNIKQkrPSBoaWQtbG9naXRlY2gubworb2JqLSQoQ09ORklHX0hJRF9NSUNST1NPRlQpCSs9IGhpZC1taWNyb3NvZnQubworb2JqLSQoQ09ORklHX0hJRF9NT05URVJFWSkJKz0gaGlkLW1vbnRlcmV5Lm8KK29iai0kKENPTkZJR19ISURfUEFOVEhFUkxPUkQpCSs9IGhpZC1wbC5vCitvYmotJChDT05GSUdfSElEX1BFVEFMWU5YKQkrPSBoaWQtcGV0YWx5bngubworb2JqLSQoQ09ORklHX0hJRF9TQU1TVU5HKQkrPSBoaWQtc2Ftc3VuZy5vCitvYmotJChDT05GSUdfSElEX1NPTlkpCQkrPSBoaWQtc29ueS5vCitvYmotJChDT05GSUdfSElEX1NVTlBMVVMpCSs9IGhpZC1zdW5wbHVzLm8KK29iai0kKENPTkZJR19USFJVU1RNQVNURVJfRkYpCSs9IGhpZC10bWZmLm8KK29iai0kKENPTkZJR19aRVJPUExVU19GRikJKz0gaGlkLXpwZmYubworCiBvYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC8KIG9iai0kKENPTkZJR19VU0JfTU9VU0UpCQkrPSB1c2JoaWQvCiBvYmotJChDT05GSUdfVVNCX0tCRCkJCSs9IHVzYmhpZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYyBiL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNhMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWE0dGVjaC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgYTR0ZWNoICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgQTRfMldIRUVMX01PVVNFX0hBQ0tfNwkweDAxCisjZGVmaW5lIEE0XzJXSEVFTF9NT1VTRV9IQUNLX0I4CTB4MDIKKworc3RydWN0IGE0dGVjaF9zYyB7CisJdW5zaWduZWQgbG9uZyBxdWlya3M7CisJdW5zaWduZWQgaW50IGh3X3doZWVsOworCV9fczMyIGRlbGF5ZWRfdmFsdWU7Cit9OworCitzdGF0aWMgaW50IGE0X2lucHV0X21hcHBlZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJc3RydWN0IGE0dGVjaF9zYyAqYTQgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMICYmIHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkKKwkJc2V0X2JpdChSRUxfSFdIRUVMLCAqYml0KTsKKworCWlmICgoYTQtPnF1aXJrcyAmIEE0XzJXSEVFTF9NT1VTRV9IQUNLXzcpICYmIHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNykKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYTRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJc3RydWN0IGE0dGVjaF9zYyAqYTQgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisKKwlpZiAoIShoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpIHx8ICFmaWVsZC0+aGlkaW5wdXQgfHwKKwkJCSF1c2FnZS0+dHlwZSkKKwkJcmV0dXJuIDA7CisKKwlpbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7CisKKwlpZiAoYTQtPnF1aXJrcyAmIEE0XzJXSEVFTF9NT1VTRV9IQUNLX0I4KSB7CisJCWlmICh1c2FnZS0+dHlwZSA9PSBFVl9SRUwgJiYgdXNhZ2UtPmNvZGUgPT0gUkVMX1dIRUVMKSB7CisJCQlhNC0+ZGVsYXllZF92YWx1ZSA9IHZhbHVlOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAodXNhZ2UtPmhpZCA9PSAweDAwMDEwMGI4KSB7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgRVZfUkVMLCB2YWx1ZSA/IFJFTF9IV0hFRUwgOgorCQkJCQlSRUxfV0hFRUwsIGE0LT5kZWxheWVkX3ZhbHVlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKChhNC0+cXVpcmtzICYgQTRfMldIRUVMX01PVVNFX0hBQ0tfNykgJiYgdXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSB7CisJCWE0LT5od193aGVlbCA9ICEhdmFsdWU7CisJCXJldHVybiAxOworCX0KKworCWlmICh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwgJiYgYTQtPmh3X3doZWVsKSB7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgUkVMX0hXSEVFTCwgdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhNF9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhNHRlY2hfc2MgKmE0OworCWludCByZXQ7CisKKwlhNCA9IGt6YWxsb2Moc2l6ZW9mKCphNCksIEdGUF9LRVJORUwpOworCWlmIChhNCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlhNC0+cXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOworCisJaGlkX3NldF9kcnZkYXRhKGhkZXYsIGE0KTsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCWtmcmVlKGE0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhNF9yZW1vdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IGE0dGVjaF9zYyAqYTQgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwloaWRfaHdfc3RvcChoZGV2KTsKKwlrZnJlZShhNCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBhNF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVSksCisJCS5kcml2ZXJfZGF0YSA9IEE0XzJXSEVFTF9NT1VTRV9IQUNLXzcgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9YNV8wMDVEKSwKKwkJLmRyaXZlcl9kYXRhID0gQTRfMldIRUVMX01PVVNFX0hBQ0tfQjggfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgYTRfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBhNF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiYTR0ZWNoIiwKKwkuaWRfdGFibGUgPSBhNF9kZXZpY2VzLAorCS5pbnB1dF9tYXBwZWQgPSBhNF9pbnB1dF9tYXBwZWQsCisJLmV2ZW50ID0gYTRfZXZlbnQsCisJLnByb2JlID0gYTRfcHJvYmUsCisJLnJlbW92ZSA9IGE0X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgYTRfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZhNF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBhNF9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZhNF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhNF9pbml0KTsKK21vZHVsZV9leGl0KGE0X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGE0dGVjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYyBiL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2Y4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqICBVU0IgSElEIHF1aXJrcyBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgQVBQTEVfUkRFU0NfSklTCQkweDAwMDEKKyNkZWZpbmUgQVBQTEVfSUdOT1JFX01PVVNFCTB4MDAwMgorI2RlZmluZSBBUFBMRV9IQVNfRk4JCTB4MDAwNAorI2RlZmluZSBBUFBMRV9ISURERVYJCTB4MDAwOAorI2RlZmluZSBBUFBMRV9JU09fS0VZQk9BUkQJMHgwMDEwCisjZGVmaW5lIEFQUExFX01JR0hUWU1PVVNFCTB4MDAyMAorI2RlZmluZSBBUFBMRV9JTlZFUlRfSFdIRUVMCTB4MDA0MAorI2RlZmluZSBBUFBMRV9JR05PUkVfSElESU5QVVQJMHgwMDgwCisjZGVmaW5lIEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OCTB4MDEwMAorCisjZGVmaW5lIEFQUExFX0ZMQUdfRktFWQkJMHgwMQorCitzdGF0aWMgdW5zaWduZWQgaW50IGZubW9kZSA9IDE7Cittb2R1bGVfcGFyYW0oZm5tb2RlLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm5tb2RlLCAiTW9kZSBvZiBmbiBrZXkgb24gQXBwbGUga2V5Ym9hcmRzICgwID0gZGlzYWJsZWQsICIKKwkJIlsxXSA9IGZrZXlzbGFzdCwgMiA9IGZrZXlzZmlyc3QpIik7CisKK3N0cnVjdCBhcHBsZV9zYyB7CisJdW5zaWduZWQgbG9uZyBxdWlya3M7CisJdW5zaWduZWQgaW50IGZuX29uOworCURFQ0xBUkVfQklUTUFQKHByZXNzZWRfZm4sIEtFWV9DTlQpOworCURFQ0xBUkVfQklUTUFQKHByZXNzZWRfbnVtbG9jaywgS0VZX0NOVCk7Cit9OworCitzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uIHsKKwl1MTYgZnJvbTsKKwl1MTYgdG87CisJdTggZmxhZ3M7Cit9OworCitzdGF0aWMgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBhcHBsZV9mbl9rZXlzW10gPSB7CisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCisJeyBLRVlfRjEsCUtFWV9CUklHSFRORVNTRE9XTiwgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjIsCUtFWV9CUklHSFRORVNTVVAsICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjMsCUtFWV9GTl9GNSwgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sIC8qIEV4cG9zw6kgKi8KKwl7IEtFWV9GNCwJS0VZX0ZOX0Y0LCAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwgLyogRGFzaGJvYXJkICovCisJeyBLRVlfRjUsCUtFWV9LQkRJTExVTURPV04sICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjYsCUtFWV9LQkRJTExVTVVQLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjcsCUtFWV9QUkVWSU9VU1NPTkcsICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjgsCUtFWV9QTEFZUEFVU0UsICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjksCUtFWV9ORVhUU09ORywgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjEwLAlLRVlfTVVURSwgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMSwJS0VZX1ZPTFVNRURPV04sICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTIsCUtFWV9WT0xVTUVVUCwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfVVAsCUtFWV9QQUdFVVAgfSwKKwl7IEtFWV9ET1dOLAlLRVlfUEFHRURPV04gfSwKKwl7IEtFWV9MRUZULAlLRVlfSE9NRSB9LAorCXsgS0VZX1JJR0hULAlLRVlfRU5EIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfZm5fa2V5c1tdID0geworCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAorCXsgS0VZX0YxLAlLRVlfQlJJR0hUTkVTU0RPV04sICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMiwJS0VZX0JSSUdIVE5FU1NVUCwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjMsCUtFWV9NVVRFLCAgICAgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y0LAlLRVlfVk9MVU1FRE9XTiwgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNSwJS0VZX1ZPTFVNRVVQLCAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjYsCUtFWV9OVU1MT0NLLCAgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y3LAlLRVlfU1dJVENIVklERU9NT0RFLCAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GOCwJS0VZX0tCRElMTFVNVE9HR0xFLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjksCUtFWV9LQkRJTExVTURPV04sICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMCwJS0VZX0tCRElMTFVNVVAsICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfVVAsCUtFWV9QQUdFVVAgfSwKKwl7IEtFWV9ET1dOLAlLRVlfUEFHRURPV04gfSwKKwl7IEtFWV9MRUZULAlLRVlfSE9NRSB9LAorCXsgS0VZX1JJR0hULAlLRVlfRU5EIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfbnVtbG9ja19rZXlzW10gPSB7CisJeyBLRVlfSiwJS0VZX0tQMSB9LAorCXsgS0VZX0ssCUtFWV9LUDIgfSwKKwl7IEtFWV9MLAlLRVlfS1AzIH0sCisJeyBLRVlfVSwJS0VZX0tQNCB9LAorCXsgS0VZX0ksCUtFWV9LUDUgfSwKKwl7IEtFWV9PLAlLRVlfS1A2IH0sCisJeyBLRVlfNywJS0VZX0tQNyB9LAorCXsgS0VZXzgsCUtFWV9LUDggfSwKKwl7IEtFWV85LAlLRVlfS1A5IH0sCisJeyBLRVlfTSwJS0VZX0tQMCB9LAorCXsgS0VZX0RPVCwJS0VZX0tQRE9UIH0sCisJeyBLRVlfU0xBU0gsCUtFWV9LUFBMVVMgfSwKKwl7IEtFWV9TRU1JQ09MT04sIEtFWV9LUE1JTlVTIH0sCisJeyBLRVlfUCwJS0VZX0tQQVNURVJJU0sgfSwKKwl7IEtFWV9NSU5VUywJS0VZX0tQRVFVQUwgfSwKKwl7IEtFWV8wLAlLRVlfS1BTTEFTSCB9LAorCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSyB9LAorCXsgS0VZX0tQRU5URVIsCUtFWV9LUEVOVEVSIH0sCisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfQkFDS1NQQUNFIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBhcHBsZV9pc29fa2V5Ym9hcmRbXSA9IHsKKwl7IEtFWV9HUkFWRSwJS0VZXzEwMk5EIH0sCisJeyBLRVlfMTAyTkQsCUtFWV9HUkFWRSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKmFwcGxlX2ZpbmRfdHJhbnNsYXRpb24oCisJCXN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKnRhYmxlLCB1MTYgZnJvbSkKK3sKKwlzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCS8qIExvb2sgZm9yIHRoZSB0cmFuc2xhdGlvbiAqLworCWZvciAodHJhbnMgPSB0YWJsZTsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCWlmICh0cmFucy0+ZnJvbSA9PSBmcm9tKQorCQkJcmV0dXJuIHRyYW5zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGlkaW5wdXRfYXBwbGVfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXBwbGVfc2MgKmFzYyA9IGhpZF9nZXRfZHJ2ZGF0YShoaWQpOworCXN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCisJaWYgKHVzYWdlLT5jb2RlID09IEtFWV9GTikgeworCQlhc2MtPmZuX29uID0gISF2YWx1ZTsKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZm5tb2RlKSB7CisJCWludCBkb190cmFuc2xhdGU7CisKKwkJdHJhbnMgPSBhcHBsZV9maW5kX3RyYW5zbGF0aW9uKChoaWQtPnByb2R1Y3QgPCAweDIyMCB8fAorCQkJCQloaWQtPnByb2R1Y3QgPj0gMHgzMDApID8KKwkJCQkJcG93ZXJib29rX2ZuX2tleXMgOiBhcHBsZV9mbl9rZXlzLAorCQkJCQl1c2FnZS0+Y29kZSk7CisJCWlmICh0cmFucykgeworCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBhc2MtPnByZXNzZWRfZm4pKQorCQkJCWRvX3RyYW5zbGF0ZSA9IDE7CisJCQllbHNlIGlmICh0cmFucy0+ZmxhZ3MgJiBBUFBMRV9GTEFHX0ZLRVkpCisJCQkJZG9fdHJhbnNsYXRlID0gKGZubW9kZSA9PSAyICYmIGFzYy0+Zm5fb24pIHx8CisJCQkJCShmbm1vZGUgPT0gMSAmJiAhYXNjLT5mbl9vbik7CisJCQllbHNlCisJCQkJZG9fdHJhbnNsYXRlID0gYXNjLT5mbl9vbjsKKworCQkJaWYgKGRvX3RyYW5zbGF0ZSkgeworCQkJCWlmICh2YWx1ZSkKKwkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgYXNjLT5wcmVzc2VkX2ZuKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgYXNjLT5wcmVzc2VkX2ZuKTsKKworCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLAorCQkJCQkJdmFsdWUpOworCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCQlpZiAoYXNjLT5xdWlya3MgJiBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiAmJgorCQkJCSh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgYXNjLT5wcmVzc2VkX251bWxvY2spIHx8CisJCQkJdGVzdF9iaXQoTEVEX05VTUwsIGlucHV0LT5sZWQpKSkgeworCQkJdHJhbnMgPSBhcHBsZV9maW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19udW1sb2NrX2tleXMsCisJCQkJCXVzYWdlLT5jb2RlKTsKKworCQkJaWYgKHRyYW5zKSB7CisJCQkJaWYgKHZhbHVlKQorCQkJCQlzZXRfYml0KHVzYWdlLT5jb2RlLAorCQkJCQkJCWFzYy0+cHJlc3NlZF9udW1sb2NrKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwKKwkJCQkJCQlhc2MtPnByZXNzZWRfbnVtbG9jayk7CisKKwkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywKKwkJCQkJCXZhbHVlKTsKKwkJCX0KKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoYXNjLT5xdWlya3MgJiBBUFBMRV9JU09fS0VZQk9BUkQpIHsKKwkJdHJhbnMgPSBhcHBsZV9maW5kX3RyYW5zbGF0aW9uKGFwcGxlX2lzb19rZXlib2FyZCwgdXNhZ2UtPmNvZGUpOworCQlpZiAodHJhbnMpIHsKKwkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGxlX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXN0cnVjdCBhcHBsZV9zYyAqYXNjID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKCEoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKSB8fCAhZmllbGQtPmhpZGlucHV0IHx8CisJCQkhdXNhZ2UtPnR5cGUpCisJCXJldHVybiAwOworCisJaWYgKChhc2MtPnF1aXJrcyAmIEFQUExFX0lOVkVSVF9IV0hFRUwpICYmCisJCQl1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSB7CisJCWlucHV0X2V2ZW50KGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwKKwkJCQktdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGFzYy0+cXVpcmtzICYgQVBQTEVfSEFTX0ZOKSAmJgorCQkJaGlkaW5wdXRfYXBwbGVfZXZlbnQoaGRldiwgZmllbGQtPmhpZGlucHV0LT5pbnB1dCwKKwkJCQl1c2FnZSwgdmFsdWUpKQorCQlyZXR1cm4gMTsKKworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWNCb29rIEpJUyBrZXlib2FyZCBoYXMgd3JvbmcgbG9naWNhbCBtYXhpbXVtCisgKi8KK3N0YXRpYyB2b2lkIGFwcGxlX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlzdHJ1Y3QgYXBwbGVfc2MgKmFzYyA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgoYXNjLT5xdWlya3MgJiBBUFBMRV9SREVTQ19KSVMpICYmIHJzaXplID49IDYwICYmCisJCQlyZGVzY1s1M10gPT0gMHg2NSAmJiByZGVzY1s1OV0gPT0gMHg2NSkgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIE1hY0Jvb2sgSklTIGtleWJvYXJkIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1s1M10gPSByZGVzY1s1OV0gPSAweGU3OworCX0KK30KKworc3RhdGljIHZvaWQgYXBwbGVfc2V0dXBfaW5wdXQoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7CisJc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisKKwlzZXRfYml0KEtFWV9OVU1MT0NLLCBpbnB1dC0+a2V5Yml0KTsKKworCS8qIEVuYWJsZSBhbGwgbmVlZGVkIGtleXMgKi8KKwlmb3IgKHRyYW5zID0gYXBwbGVfZm5fa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKKworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfZm5fa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKKworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfbnVtbG9ja19rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKKwkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOworCisJZm9yICh0cmFucyA9IGFwcGxlX2lzb19rZXlib2FyZDsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKK30KKworc3RhdGljIGludCBhcHBsZV9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAodXNhZ2UtPmhpZCA9PSAoSElEX1VQX0NVU1RPTSB8IDB4MDAwMykpIHsKKwkJLyogVGhlIGZuIGtleSBvbiBBcHBsZSBVU0Iga2V5Ym9hcmRzICovCisJCXNldF9iaXQoRVZfUkVQLCBoaS0+aW5wdXQtPmV2Yml0KTsKKwkJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBFVl9LRVksIEtFWV9GTik7CisJCWFwcGxlX3NldHVwX2lucHV0KGhpLT5pbnB1dCk7CisJCXJldHVybiAxOworCX0KKworCS8qIHdlIHdhbnQgdGhlIGhpZCBsYXllciB0byBnbyB0aHJvdWdoIHN0YW5kYXJkIHBhdGggKHNldCBhbmQgaWdub3JlKSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGxlX2lucHV0X21hcHBlZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJc3RydWN0IGFwcGxlX3NjICphc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoYXNjLT5xdWlya3MgJiBBUFBMRV9NSUdIVFlNT1VTRSkgeworCQlpZiAodXNhZ2UtPmhpZCA9PSBISURfR0RfWikKKwkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfUkVMLCBSRUxfSFdIRUVMKTsKKwkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzEpCisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX0tFWSwgQlROXzIpOworCQllbHNlIGlmICh1c2FnZS0+Y29kZSA9PSBCVE5fMikKKwkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfS0VZLCBCVE5fMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXBwbGVfc2MgKmFzYzsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdF9tYXNrID0gSElEX0NPTk5FQ1RfREVGQVVMVDsKKwlpbnQgcmV0OworCisJLyogcmV0dXJuIHNvbWV0aGluZyBlbHNlIG9yIG1vdmUgdG8gaGlkIGxheWVyPyBkZXZpY2Ugd2lsbCByZXNpZGUKKwkgICBhbGxvY2F0ZWQgKi8KKwlpZiAoaWQtPmJ1cyA9PSBCVVNfVVNCICYmIChxdWlya3MgJiBBUFBMRV9JR05PUkVfTU9VU0UpICYmCisJCQl0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpLT5jdXJfYWx0c2V0dGluZy0+CisJCQlkZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFzYyA9IGt6YWxsb2Moc2l6ZW9mKCphc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXNjID09IE5VTEwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgYXBwbGUgZGVzY3JpcHRvclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFzYy0+cXVpcmtzID0gcXVpcmtzOworCisJaGlkX3NldF9kcnZkYXRhKGhkZXYsIGFzYyk7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWlmIChxdWlya3MgJiBBUFBMRV9ISURERVYpCisJCWNvbm5lY3RfbWFzayB8PSBISURfQ09OTkVDVF9ISURERVZfRk9SQ0U7CisJaWYgKHF1aXJrcyAmIEFQUExFX0lHTk9SRV9ISURJTlBVVCkKKwkJY29ubmVjdF9tYXNrICY9IH5ISURfQ09OTkVDVF9ISURJTlBVVDsKKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBjb25uZWN0X21hc2spOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCWtmcmVlKGFzYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXBwbGVfcmVtb3ZlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWhpZF9od19zdG9wKGhkZXYpOworCWtmcmVlKGhpZF9nZXRfZHJ2ZGF0YShoZGV2KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBhcHBsZV9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FUVl9JUkNPTlRST0wpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9ISURERVYgfCBBUFBMRV9JR05PUkVfSElESU5QVVQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfSVJDT05UUk9MNCksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hJRERFViB8IEFQUExFX0lHTk9SRV9ISURJTlBVVCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX01JR0hUWU1PVVNFIHwgQVBQTEVfSU5WRVJUX0hXSEVFTCB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIHwgQVBQTEVfUkRFU0NfSklTfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB8IEFQUExFX1JERVNDX0pJUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CisJCQlBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB8CisJCQlBUFBMRV9JR05PUkVfTU9VU0UgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JR05PUkVfTU9VU0UgfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lHTk9SRV9NT1VTRSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lHTk9SRV9NT1VTRSB8IEFQUExFX1JERVNDX0pJUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSUdOT1JFX01PVVNFIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIHwKKwkJCUFQUExFX0lHTk9SRV9NT1VTRSB9LAorCisJLyogQXBwbGUgd2lyZWxlc3MgTWlnaHR5IE1vdXNlICovCisJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCAweDAzMGMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9NSUdIVFlNT1VTRSB8IEFQUExFX0lOVkVSVF9IV0hFRUwgfSwKKworCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBhcHBsZV9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGFwcGxlX2RyaXZlciA9IHsKKwkubmFtZSA9ICJhcHBsZSIsCisJLmlkX3RhYmxlID0gYXBwbGVfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gYXBwbGVfcmVwb3J0X2ZpeHVwLAorCS5wcm9iZSA9IGFwcGxlX3Byb2JlLAorCS5yZW1vdmUgPSBhcHBsZV9yZW1vdmUsCisJLmV2ZW50ID0gYXBwbGVfZXZlbnQsCisJLmlucHV0X21hcHBpbmcgPSBhcHBsZV9pbnB1dF9tYXBwaW5nLAorCS5pbnB1dF9tYXBwZWQgPSBhcHBsZV9pbnB1dF9tYXBwZWQsCit9OworCitzdGF0aWMgaW50IGFwcGxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmYXBwbGVfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIGFwcGxlIGRyaXZlclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhcHBsZV9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZhcHBsZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhcHBsZV9pbml0KTsKK21vZHVsZV9leGl0KGFwcGxlX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGFwcGxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYyBiL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM4YTliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWJlbGtpbi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgYmVsa2luICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIEJFTEtJTl9ISURERVYJMHgwMQorI2RlZmluZSBCRUxLSU5fV0tCRAkweDAyCisKKyNkZWZpbmUgYmVsa2luX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCBiZWxraW5faW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSIHx8CisJCQkhKHF1aXJrcyAmIEJFTEtJTl9XS0JEKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MDNhOiBiZWxraW5fbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7CisJY2FzZSAweDAzYjogYmVsa2luX21hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKKwljYXNlIDB4MDNjOiBiZWxraW5fbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJlbGtpbl9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwloaWRfc2V0X2RydmRhdGEoaGRldiwgKHZvaWQgKilxdWlya3MpOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8CisJCSgocXVpcmtzICYgQkVMS0lOX0hJRERFVikgPyBISURfQ09OTkVDVF9ISURERVZfRk9SQ0UgOiAwKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldHVybiAwOworZXJyX2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGJlbGtpbl9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JFTEtJTiwgVVNCX0RFVklDRV9JRF9GTElQX0tWTSksCisJCS5kcml2ZXJfZGF0YSA9IEJFTEtJTl9ISURERVYgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEFCVEVDLCBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRCksCisJCS5kcml2ZXJfZGF0YSA9IEJFTEtJTl9XS0JEIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGJlbGtpbl9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGJlbGtpbl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiYmVsa2luIiwKKwkuaWRfdGFibGUgPSBiZWxraW5fZGV2aWNlcywKKwkuaW5wdXRfbWFwcGluZyA9IGJlbGtpbl9pbnB1dF9tYXBwaW5nLAorCS5wcm9iZSA9IGJlbGtpbl9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgYmVsa2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmYmVsa2luX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJlbGtpbl9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZiZWxraW5fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYmVsa2luX2luaXQpOworbW9kdWxlX2V4aXQoYmVsa2luX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGJlbGtpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYnJpZ2h0LmMgYi9kcml2ZXJzL2hpZC9oaWQtYnJpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1MTdhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1icmlnaHQuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgYnJpZ2h0ICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiBCYXNlZCBvbiBoaWQtZGVsbCBkcml2ZXIKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKK3N0YXRpYyBpbnQgYnJpZ2h0X3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwl1c2JoaWRfc2V0X2xlZHMoaGRldik7CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBicmlnaHRfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CUklHSFQsIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBicmlnaHRfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBicmlnaHRfZHJpdmVyID0geworCS5uYW1lID0gImJyaWdodCIsCisJLmlkX3RhYmxlID0gYnJpZ2h0X2RldmljZXMsCisJLnByb2JlID0gYnJpZ2h0X3Byb2JlLAorfTsKKworc3RhdGljIGludCBicmlnaHRfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZicmlnaHRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYnJpZ2h0X2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmJyaWdodF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChicmlnaHRfaW5pdCk7Cittb2R1bGVfZXhpdChicmlnaHRfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoYnJpZ2h0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODMzYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNoZXJyeS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBjaGVycnkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qCisgKiBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgaGF2ZSBhbiBpbnZhbGlkIEhJRCByZXBvcnQgZGVzY3JpcHRvciwKKyAqIHRoYXQgbmVlZHMgZml4aW5nIGJlZm9yZSB3ZSBjYW4gcGFyc2UgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGNoX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBDaGVycnkgQ3ltb3Rpb24gcmVwb3J0ICIKKwkJCQkiZGVzY3JpcHRvclxuIik7CisJCXJkZXNjWzExXSA9IHJkZXNjWzE2XSA9IDB4ZmY7CisJCXJkZXNjWzEyXSA9IHJkZXNjWzE3XSA9IDB4MDM7CisJfQorfQorCisjZGVmaW5lIGNoX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCBjaF9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHgzMDE6IGNoX21hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJYnJlYWs7CisJY2FzZSAweDMwMjogY2hfbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwlicmVhazsKKwljYXNlIDB4MzAzOiBjaF9tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgY2hfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBjaF9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGNoX2RyaXZlciA9IHsKKwkubmFtZSA9ICJjaGVycnkiLAorCS5pZF90YWJsZSA9IGNoX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IGNoX3JlcG9ydF9maXh1cCwKKwkuaW5wdXRfbWFwcGluZyA9IGNoX2lucHV0X21hcHBpbmcsCit9OworCitzdGF0aWMgaW50IGNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmY2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgY2hfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmY2hfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2hfaW5pdCk7Cittb2R1bGVfZXhpdChjaF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihjaGVycnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNoaWNvbnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1jaGljb255LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0ZDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jaGljb255LmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGNoaWNvbnkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2RlZmluZSBjaF9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgY2hfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9NU1ZFTkRPUikKKwkJcmV0dXJuIDA7CisKKwlzZXRfYml0KEVWX1JFUCwgaGktPmlucHV0LT5ldmJpdCk7CisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJY2FzZSAweGZmMDE6IGNoX21hcF9rZXlfY2xlYXIoQlROXzEpOwlicmVhazsKKwljYXNlIDB4ZmYwMjogY2hfbWFwX2tleV9jbGVhcihCVE5fMik7CWJyZWFrOworCWNhc2UgMHhmZjAzOiBjaF9tYXBfa2V5X2NsZWFyKEJUTl8zKTsJYnJlYWs7CisJY2FzZSAweGZmMDQ6IGNoX21hcF9rZXlfY2xlYXIoQlROXzQpOwlicmVhazsKKwljYXNlIDB4ZmYwNTogY2hfbWFwX2tleV9jbGVhcihCVE5fNSk7CWJyZWFrOworCWNhc2UgMHhmZjA2OiBjaF9tYXBfa2V5X2NsZWFyKEJUTl82KTsJYnJlYWs7CisJY2FzZSAweGZmMDc6IGNoX21hcF9rZXlfY2xlYXIoQlROXzcpOwlicmVhazsKKwljYXNlIDB4ZmYwODogY2hfbWFwX2tleV9jbGVhcihCVE5fOCk7CWJyZWFrOworCWNhc2UgMHhmZjA5OiBjaF9tYXBfa2V5X2NsZWFyKEJUTl85KTsJYnJlYWs7CisJY2FzZSAweGZmMGE6IGNoX21hcF9rZXlfY2xlYXIoQlROX0EpOwlicmVhazsKKwljYXNlIDB4ZmYwYjogY2hfbWFwX2tleV9jbGVhcihCVE5fQik7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGNoX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgY2hfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBjaF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2hpY29ueSIsCisJLmlkX3RhYmxlID0gY2hfZGV2aWNlcywKKwkuaW5wdXRfbWFwcGluZyA9IGNoX2lucHV0X21hcHBpbmcsCit9OworCitzdGF0aWMgaW50IGNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmY2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgY2hfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmY2hfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2hfaW5pdCk7Cittb2R1bGVfZXhpdChjaF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihjaGljb255KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDQyNmFjNWEuLjcyMWEzNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZC1kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZHJhdy5oPgogCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCkBAIC0yNjgsOSArMjcwLDkgQEAKIHN0YXRpYyB1MzIgaXRlbV91ZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCiB7CiAJc3dpdGNoIChpdGVtLT5zaXplKSB7Ci0JCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEudTg7Ci0JCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEudTE2OwotCQljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnUzMjsKKwljYXNlIDE6IHJldHVybiBpdGVtLT5kYXRhLnU4OworCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEudTE2OworCWNhc2UgNDogcmV0dXJuIGl0ZW0tPmRhdGEudTMyOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI3OCw5ICsyODAsOSBAQAogc3RhdGljIHMzMiBpdGVtX3NkYXRhKHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKIHsKIAlzd2l0Y2ggKGl0ZW0tPnNpemUpIHsKLQkJY2FzZSAxOiByZXR1cm4gaXRlbS0+ZGF0YS5zODsKLQkJY2FzZSAyOiByZXR1cm4gaXRlbS0+ZGF0YS5zMTY7Ci0JCWNhc2UgNDogcmV0dXJuIGl0ZW0tPmRhdGEuczMyOworCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEuczg7CisJY2FzZSAyOiByZXR1cm4gaXRlbS0+ZGF0YS5zMTY7CisJY2FzZSA0OiByZXR1cm4gaXRlbS0+ZGF0YS5zMzI7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjkyLDg3ICsyOTQsOTEgQEAKIHN0YXRpYyBpbnQgaGlkX3BhcnNlcl9nbG9iYWwoc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlciwgc3RydWN0IGhpZF9pdGVtICppdGVtKQogewogCXN3aXRjaCAoaXRlbS0+dGFnKSB7CisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BVU0g6CiAKLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BVU0g6Ci0KLQkJCWlmIChwYXJzZXItPmdsb2JhbF9zdGFja19wdHIgPT0gSElEX0dMT0JBTF9TVEFDS19TSVpFKSB7Ci0JCQkJZGJnX2hpZCgiZ2xvYmFsIGVudmlyb21lbnQgc3RhY2sgb3ZlcmZsb3dcbiIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJbWVtY3B5KHBhcnNlci0+Z2xvYmFsX3N0YWNrICsgcGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyKyssCi0JCQkJJnBhcnNlci0+Z2xvYmFsLCBzaXplb2Yoc3RydWN0IGhpZF9nbG9iYWwpKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QT1A6Ci0KLQkJCWlmICghcGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyKSB7Ci0JCQkJZGJnX2hpZCgiZ2xvYmFsIGVudmlyb21lbnQgc3RhY2sgdW5kZXJmbG93XG4iKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCW1lbWNweSgmcGFyc2VyLT5nbG9iYWwsIHBhcnNlci0+Z2xvYmFsX3N0YWNrICsgLS1wYXJzZXItPmdsb2JhbF9zdGFja19wdHIsCi0JCQkJc2l6ZW9mKHN0cnVjdCBoaWRfZ2xvYmFsKSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVVNBR0VfUEFHRToKLQkJCXBhcnNlci0+Z2xvYmFsLnVzYWdlX3BhZ2UgPSBpdGVtX3VkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX0xPR0lDQUxfTUlOSU1VTToKLQkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWluaW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NQVhJTVVNOgotCQkJaWYgKHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWluaW11bSA8IDApCi0JCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKLQkJCWVsc2UKLQkJCQlwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21heGltdW0gPSBpdGVtX3VkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01JTklNVU06Ci0JCQlwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9taW5pbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19QSFlTSUNBTF9NQVhJTVVNOgotCQkJaWYgKHBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21pbmltdW0gPCAwKQotCQkJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21heGltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOwotCQkJZWxzZQotCQkJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21heGltdW0gPSBpdGVtX3VkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVRfRVhQT05FTlQ6Ci0JCQlwYXJzZXItPmdsb2JhbC51bml0X2V4cG9uZW50ID0gaXRlbV9zZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VTklUOgotCQkJcGFyc2VyLT5nbG9iYWwudW5pdCA9IGl0ZW1fdWRhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX1NJWkU6Ci0JCQlpZiAoKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplID0gaXRlbV91ZGF0YShpdGVtKSkgPiAzMikgewotCQkJCWRiZ19oaWQoImludmFsaWQgcmVwb3J0X3NpemUgJWRcbiIsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0NPVU5UOgotCQkJaWYgKChwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQgPSBpdGVtX3VkYXRhKGl0ZW0pKSA+IEhJRF9NQVhfVVNBR0VTKSB7Ci0JCQkJZGJnX2hpZCgiaW52YWxpZCByZXBvcnRfY291bnQgJWRcbiIsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9JRDoKLQkJCWlmICgocGFyc2VyLT5nbG9iYWwucmVwb3J0X2lkID0gaXRlbV91ZGF0YShpdGVtKSkgPT0gMCkgewotCQkJCWRiZ19oaWQoInJlcG9ydF9pZCAwIGlzIGludmFsaWRcbiIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCWRlZmF1bHQ6Ci0JCQlkYmdfaGlkKCJ1bmtub3duIGdsb2JhbCB0YWcgMHgleFxuIiwgaXRlbS0+dGFnKTsKKwkJaWYgKHBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0ciA9PSBISURfR0xPQkFMX1NUQUNLX1NJWkUpIHsKKwkJCWRiZ19oaWQoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIG92ZXJmbG93XG4iKTsKIAkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbWNweShwYXJzZXItPmdsb2JhbF9zdGFjayArIHBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0cisrLAorCQkJJnBhcnNlci0+Z2xvYmFsLCBzaXplb2Yoc3RydWN0IGhpZF9nbG9iYWwpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUE9QOgorCisJCWlmICghcGFyc2VyLT5nbG9iYWxfc3RhY2tfcHRyKSB7CisJCQlkYmdfaGlkKCJnbG9iYWwgZW52aXJvbWVudCBzdGFjayB1bmRlcmZsb3dcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbWVtY3B5KCZwYXJzZXItPmdsb2JhbCwgcGFyc2VyLT5nbG9iYWxfc3RhY2sgKworCQkJLS1wYXJzZXItPmdsb2JhbF9zdGFja19wdHIsIHNpemVvZihzdHJ1Y3QgaGlkX2dsb2JhbCkpOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VU0FHRV9QQUdFOgorCQlwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NSU5JTVVNOgorCQlwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01BWElNVU06CisJCWlmIChwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0gPCAwKQorCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKKwkJZWxzZQorCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUlOSU1VTToKKwkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01BWElNVU06CisJCWlmIChwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9taW5pbXVtIDwgMCkKKwkJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21heGltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOworCQllbHNlCisJCQlwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9tYXhpbXVtID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVF9FWFBPTkVOVDoKKwkJcGFyc2VyLT5nbG9iYWwudW5pdF9leHBvbmVudCA9IGl0ZW1fc2RhdGEoaXRlbSk7CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVQ6CisJCXBhcnNlci0+Z2xvYmFsLnVuaXQgPSBpdGVtX3VkYXRhKGl0ZW0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfU0laRToKKwkJcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUgPSBpdGVtX3VkYXRhKGl0ZW0pOworCQlpZiAocGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUgPiAzMikgeworCQkJZGJnX2hpZCgiaW52YWxpZCByZXBvcnRfc2l6ZSAlZFxuIiwKKwkJCQkJcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9DT1VOVDoKKwkJcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50ID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJaWYgKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCA+IEhJRF9NQVhfVVNBR0VTKSB7CisJCQlkYmdfaGlkKCJpbnZhbGlkIHJlcG9ydF9jb3VudCAlZFxuIiwKKwkJCQkJcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfSUQ6CisJCXBhcnNlci0+Z2xvYmFsLnJlcG9ydF9pZCA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCWlmIChwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQgPT0gMCkgeworCQkJZGJnX2hpZCgicmVwb3J0X2lkIDAgaXMgaW52YWxpZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlkYmdfaGlkKCJ1bmtub3duIGdsb2JhbCB0YWcgMHgleFxuIiwgaXRlbS0+dGFnKTsKKwkJcmV0dXJuIC0xOwogCX0KIH0KIApAQCAtMzkzLDc3ICszOTksNzYgQEAKIAlkYXRhID0gaXRlbV91ZGF0YShpdGVtKTsKIAogCXN3aXRjaCAoaXRlbS0+dGFnKSB7CisJY2FzZSBISURfTE9DQUxfSVRFTV9UQUdfREVMSU1JVEVSOgogCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX0RFTElNSVRFUjoKLQotCQkJaWYgKGRhdGEpIHsKLQkJCQkvKgotCQkJCSAqIFdlIHRyZWF0IGl0ZW1zIGJlZm9yZSB0aGUgZmlyc3QgZGVsaW1pdGVyCi0JCQkJICogYXMgZ2xvYmFsIHRvIGFsbCB1c2FnZSBzZXRzIChicmFuY2ggMCkuCi0JCQkJICogSW4gdGhlIG1vbWVudCB3ZSBwcm9jZXNzIG9ubHkgdGhlc2UgZ2xvYmFsCi0JCQkJICogaXRlbXMgYW5kIHRoZSBmaXJzdCBkZWxpbWl0ZXIgc2V0LgotCQkJCSAqLwotCQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCAhPSAwKSB7Ci0JCQkJCWRiZ19oaWQoIm5lc3RlZCBkZWxpbWl0ZXJzXG4iKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCsrOwotCQkJCXBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGggPCAxKSB7Ci0JCQkJCWRiZ19oaWQoImJvZ3VzIGNsb3NlIGRlbGltaXRlclxuIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgtLTsKKwkJaWYgKGRhdGEpIHsKKwkJCS8qCisJCQkgKiBXZSB0cmVhdCBpdGVtcyBiZWZvcmUgdGhlIGZpcnN0IGRlbGltaXRlcgorCQkJICogYXMgZ2xvYmFsIHRvIGFsbCB1c2FnZSBzZXRzIChicmFuY2ggMCkuCisJCQkgKiBJbiB0aGUgbW9tZW50IHdlIHByb2Nlc3Mgb25seSB0aGVzZSBnbG9iYWwKKwkJCSAqIGl0ZW1zIGFuZCB0aGUgZmlyc3QgZGVsaW1pdGVyIHNldC4KKwkJCSAqLworCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoICE9IDApIHsKKwkJCQlkYmdfaGlkKCJuZXN0ZWQgZGVsaW1pdGVyc1xuIik7CisJCQkJcmV0dXJuIC0xOwogCQkJfQotCQkJcmV0dXJuIDE7Ci0KLQkJY2FzZSBISURfTE9DQUxfSVRFTV9UQUdfVVNBR0U6Ci0KLQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7Ci0JCQkJZGJnX2hpZCgiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZFxuIik7Ci0JCQkJcmV0dXJuIDA7CisJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCsrOworCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoKys7CisJCX0gZWxzZSB7CisJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGggPCAxKSB7CisJCQkJZGJnX2hpZCgiYm9ndXMgY2xvc2UgZGVsaW1pdGVyXG4iKTsKKwkJCQlyZXR1cm4gLTE7CiAJCQl9CisJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aC0tOworCQl9CisJCXJldHVybiAxOwogCi0JCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQotCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOworCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFOgogCi0JCQlyZXR1cm4gaGlkX2FkZF91c2FnZShwYXJzZXIsIGRhdGEpOwotCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01JTklNVU06Ci0KLQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7Ci0JCQkJZGJnX2hpZCgiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZFxuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmIChpdGVtLT5zaXplIDw9IDIpCi0JCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7Ci0KLQkJCXBhcnNlci0+bG9jYWwudXNhZ2VfbWluaW11bSA9IGRhdGE7CisJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7CisJCQlkYmdfaGlkKCJhbHRlcm5hdGl2ZSB1c2FnZSBpZ25vcmVkXG4iKTsKIAkJCXJldHVybiAwOworCQl9CiAKLQkJY2FzZSBISURfTE9DQUxfSVRFTV9UQUdfVVNBR0VfTUFYSU1VTToKKwkJaWYgKGl0ZW0tPnNpemUgPD0gMikKKwkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOwogCi0JCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgewotCQkJCWRiZ19oaWQoImFsdGVybmF0aXZlIHVzYWdlIGlnbm9yZWRcbiIpOwotCQkJCXJldHVybiAwOworCQlyZXR1cm4gaGlkX2FkZF91c2FnZShwYXJzZXIsIGRhdGEpOworCisJY2FzZSBISURfTE9DQUxfSVRFTV9UQUdfVVNBR0VfTUlOSU1VTToKKworCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgeworCQkJZGJnX2hpZCgiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChpdGVtLT5zaXplIDw9IDIpCisJCQlkYXRhID0gKHBhcnNlci0+Z2xvYmFsLnVzYWdlX3BhZ2UgPDwgMTYpICsgZGF0YTsKKworCQlwYXJzZXItPmxvY2FsLnVzYWdlX21pbmltdW0gPSBkYXRhOworCQlyZXR1cm4gMDsKKworCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01BWElNVU06CisKKwkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCA+IDEpIHsKKwkJCWRiZ19oaWQoImFsdGVybmF0aXZlIHVzYWdlIGlnbm9yZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQorCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7CisKKwkJZm9yIChuID0gcGFyc2VyLT5sb2NhbC51c2FnZV9taW5pbXVtOyBuIDw9IGRhdGE7IG4rKykKKwkJCWlmIChoaWRfYWRkX3VzYWdlKHBhcnNlciwgbikpIHsKKwkJCQlkYmdfaGlkKCJoaWRfYWRkX3VzYWdlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC0xOwogCQkJfQorCQlyZXR1cm4gMDsKIAotCQkJaWYgKGl0ZW0tPnNpemUgPD0gMikKLQkJCQlkYXRhID0gKHBhcnNlci0+Z2xvYmFsLnVzYWdlX3BhZ2UgPDwgMTYpICsgZGF0YTsKKwlkZWZhdWx0OgogCi0JCQlmb3IgKG4gPSBwYXJzZXItPmxvY2FsLnVzYWdlX21pbmltdW07IG4gPD0gZGF0YTsgbisrKQotCQkJCWlmIChoaWRfYWRkX3VzYWdlKHBhcnNlciwgbikpIHsKLQkJCQkJZGJnX2hpZCgiaGlkX2FkZF91c2FnZSBmYWlsZWRcbiIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDoKLQotCQkJZGJnX2hpZCgidW5rbm93biBsb2NhbCBpdGVtIHRhZyAweCV4XG4iLCBpdGVtLT50YWcpOwotCQkJcmV0dXJuIDA7CisJCWRiZ19oaWQoInVua25vd24gbG9jYWwgaXRlbSB0YWcgMHgleFxuIiwgaXRlbS0+dGFnKTsKKwkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDgwLDI0ICs0ODUsMjQgQEAKIAlkYXRhID0gaXRlbV91ZGF0YShpdGVtKTsKIAogCXN3aXRjaCAoaXRlbS0+dGFnKSB7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfQkVHSU5fQ09MTEVDVElPTjoKLQkJCXJldCA9IG9wZW5fY29sbGVjdGlvbihwYXJzZXIsIGRhdGEgJiAweGZmKTsKLQkJCWJyZWFrOwotCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0VORF9DT0xMRUNUSU9OOgotCQkJcmV0ID0gY2xvc2VfY29sbGVjdGlvbihwYXJzZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfSU5QVVQ6Ci0JCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX0lOUFVUX1JFUE9SVCwgZGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBISURfTUFJTl9JVEVNX1RBR19PVVRQVVQ6Ci0JCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX09VVFBVVF9SRVBPUlQsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfRkVBVFVSRToKLQkJCXJldCA9IGhpZF9hZGRfZmllbGQocGFyc2VyLCBISURfRkVBVFVSRV9SRVBPUlQsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkYmdfaGlkKCJ1bmtub3duIG1haW4gaXRlbSB0YWcgMHgleFxuIiwgaXRlbS0+dGFnKTsKLQkJCXJldCA9IDA7CisJY2FzZSBISURfTUFJTl9JVEVNX1RBR19CRUdJTl9DT0xMRUNUSU9OOgorCQlyZXQgPSBvcGVuX2NvbGxlY3Rpb24ocGFyc2VyLCBkYXRhICYgMHhmZik7CisJCWJyZWFrOworCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfRU5EX0NPTExFQ1RJT046CisJCXJldCA9IGNsb3NlX2NvbGxlY3Rpb24ocGFyc2VyKTsKKwkJYnJlYWs7CisJY2FzZSBISURfTUFJTl9JVEVNX1RBR19JTlBVVDoKKwkJcmV0ID0gaGlkX2FkZF9maWVsZChwYXJzZXIsIEhJRF9JTlBVVF9SRVBPUlQsIGRhdGEpOworCQlicmVhazsKKwljYXNlIEhJRF9NQUlOX0lURU1fVEFHX09VVFBVVDoKKwkJcmV0ID0gaGlkX2FkZF9maWVsZChwYXJzZXIsIEhJRF9PVVRQVVRfUkVQT1JULCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBISURfTUFJTl9JVEVNX1RBR19GRUFUVVJFOgorCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX0ZFQVRVUkVfUkVQT1JULCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnX2hpZCgidW5rbm93biBtYWluIGl0ZW0gdGFnIDB4JXhcbiIsIGl0ZW0tPnRhZyk7CisJCXJldCA9IDA7CiAJfQogCiAJbWVtc2V0KCZwYXJzZXItPmxvY2FsLCAwLCBzaXplb2YocGFyc2VyLT5sb2NhbCkpOwkvKiBSZXNldCB0aGUgbG9jYWwgcGFyc2VyIGVudmlyb25tZW50ICovCkBAIC01MzQsOSArNTM5LDEwIEBACiAgKiBGcmVlIGEgZGV2aWNlIHN0cnVjdHVyZSwgYWxsIHJlcG9ydHMsIGFuZCBhbGwgZmllbGRzLgogICovCiAKLXZvaWQgaGlkX2ZyZWVfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgdm9pZCBoaWRfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXVuc2lnbmVkIGksajsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisJdW5zaWduZWQgaSwgajsKIAogCWZvciAoaSA9IDA7IGkgPCBISURfUkVQT1JUX1RZUEVTOyBpKyspIHsKIAkJc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0gPSBkZXZpY2UtPnJlcG9ydF9lbnVtICsgaTsKQEAgLTU1Miw3ICs1NTgsNiBAQAogCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7CiAJa2ZyZWUoZGV2aWNlKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGhpZF9mcmVlX2RldmljZSk7CiAKIC8qCiAgKiBGZXRjaCBhIHJlcG9ydCBkZXNjcmlwdGlvbiBpdGVtIGZyb20gdGhlIGRhdGEgc3RyZWFtLiBXZSBzdXBwb3J0IGxvbmcKQEAgLTU5Myw0NyArNTk4LDUyIEBACiAJaXRlbS0+c2l6ZSA9IGIgJiAzOwogCiAJc3dpdGNoIChpdGVtLT5zaXplKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gc3RhcnQ7CiAKLQkJY2FzZSAwOgotCQkJcmV0dXJuIHN0YXJ0OworCWNhc2UgMToKKwkJaWYgKChlbmQgLSBzdGFydCkgPCAxKQorCQkJcmV0dXJuIE5VTEw7CisJCWl0ZW0tPmRhdGEudTggPSAqc3RhcnQrKzsKKwkJcmV0dXJuIHN0YXJ0OwogCi0JCWNhc2UgMToKLQkJCWlmICgoZW5kIC0gc3RhcnQpIDwgMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWl0ZW0tPmRhdGEudTggPSAqc3RhcnQrKzsKLQkJCXJldHVybiBzdGFydDsKKwljYXNlIDI6CisJCWlmICgoZW5kIC0gc3RhcnQpIDwgMikKKwkJCXJldHVybiBOVUxMOworCQlpdGVtLT5kYXRhLnUxNiA9IGdldF91bmFsaWduZWRfbGUxNihzdGFydCk7CisJCXN0YXJ0ID0gKF9fdTggKikoKF9fbGUxNiAqKXN0YXJ0ICsgMSk7CisJCXJldHVybiBzdGFydDsKIAotCQljYXNlIDI6Ci0JCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDIpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpdGVtLT5kYXRhLnUxNiA9IGdldF91bmFsaWduZWRfbGUxNihzdGFydCk7Ci0JCQlzdGFydCA9IChfX3U4ICopKChfX2xlMTYgKilzdGFydCArIDEpOwotCQkJcmV0dXJuIHN0YXJ0OwotCi0JCWNhc2UgMzoKLQkJCWl0ZW0tPnNpemUrKzsKLQkJCWlmICgoZW5kIC0gc3RhcnQpIDwgNCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWl0ZW0tPmRhdGEudTMyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHN0YXJ0KTsKLQkJCXN0YXJ0ID0gKF9fdTggKikoKF9fbGUzMiAqKXN0YXJ0ICsgMSk7Ci0JCQlyZXR1cm4gc3RhcnQ7CisJY2FzZSAzOgorCQlpdGVtLT5zaXplKys7CisJCWlmICgoZW5kIC0gc3RhcnQpIDwgNCkKKwkJCXJldHVybiBOVUxMOworCQlpdGVtLT5kYXRhLnUzMiA9IGdldF91bmFsaWduZWRfbGUzMihzdGFydCk7CisJCXN0YXJ0ID0gKF9fdTggKikoKF9fbGUzMiAqKXN0YXJ0ICsgMSk7CisJCXJldHVybiBzdGFydDsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoKKy8qKgorICogaGlkX3BhcnNlX3JlcG9ydCAtIHBhcnNlIGRldmljZSByZXBvcnQKKyAqCisgKiBAZGV2aWNlOiBoaWQgZGV2aWNlCisgKiBAc3RhcnQ6IHJlcG9ydCBzdGFydAorICogQHNpemU6IHJlcG9ydCBzaXplCisgKgogICogUGFyc2UgYSByZXBvcnQgZGVzY3JpcHRpb24gaW50byBhIGhpZF9kZXZpY2Ugc3RydWN0dXJlLiBSZXBvcnRzIGFyZQogICogZW51bWVyYXRlZCwgZmllbGRzIGFyZSBhdHRhY2hlZCB0byB0aGVzZSByZXBvcnRzLgorICogMCByZXR1cm5lZCBvbiBzdWNjZXNzLCBvdGhlcndpc2Ugbm9uemVybyBlcnJvciB2YWx1ZS4KICAqLwotCi1zdHJ1Y3QgaGlkX2RldmljZSAqaGlkX3BhcnNlX3JlcG9ydChfX3U4ICpzdGFydCwgdW5zaWduZWQgc2l6ZSkKK2ludCBoaWRfcGFyc2VfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UsIF9fdTggKnN0YXJ0LAorCQl1bnNpZ25lZCBzaXplKQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlcjsKIAlzdHJ1Y3QgaGlkX2l0ZW0gaXRlbTsKIAlfX3U4ICplbmQ7Ci0JdW5zaWduZWQgaTsKKwlpbnQgcmV0OwogCXN0YXRpYyBpbnQgKCpkaXNwYXRjaF90eXBlW10pKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsCiAJCQkJICAgICAgc3RydWN0IGhpZF9pdGVtICppdGVtKSA9IHsKIAkJaGlkX3BhcnNlcl9tYWluLApAQCAtNjQyLDc2ICs2NTIsNTcgQEAKIAkJaGlkX3BhcnNlcl9yZXNlcnZlZAogCX07CiAKLQlpZiAoIShkZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2RldmljZSksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIE5VTEw7CisJaWYgKGRldmljZS0+ZHJpdmVyLT5yZXBvcnRfZml4dXApCisJCWRldmljZS0+ZHJpdmVyLT5yZXBvcnRfZml4dXAoZGV2aWNlLCBzdGFydCwgc2l6ZSk7CiAKLQlpZiAoIShkZXZpY2UtPmNvbGxlY3Rpb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pICoKLQkJCQkgICBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlMsIEdGUF9LRVJORUwpKSkgewotCQlrZnJlZShkZXZpY2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUgPSBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5yZXBvcnRfZW51bVtpXS5yZXBvcnRfbGlzdCk7Ci0KLQlpZiAoIShkZXZpY2UtPnJkZXNjID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpIHsKLQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKLQkJa2ZyZWUoZGV2aWNlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWRldmljZS0+cmRlc2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChkZXZpY2UtPnJkZXNjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCW1lbWNweShkZXZpY2UtPnJkZXNjLCBzdGFydCwgc2l6ZSk7CiAJZGV2aWNlLT5yc2l6ZSA9IHNpemU7CiAKLQlpZiAoIShwYXJzZXIgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3BhcnNlcikpKSkgewotCQlrZnJlZShkZXZpY2UtPnJkZXNjKTsKLQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKLQkJa2ZyZWUoZGV2aWNlKTsKLQkJcmV0dXJuIE5VTEw7CisJcGFyc2VyID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKTsKKwlpZiAoIXBhcnNlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKIAl9CisKIAltZW1zZXQocGFyc2VyLCAwLCBzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKTsKIAlwYXJzZXItPmRldmljZSA9IGRldmljZTsKIAogCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwlyZXQgPSAtRUlOVkFMOwogCXdoaWxlICgoc3RhcnQgPSBmZXRjaF9pdGVtKHN0YXJ0LCBlbmQsICZpdGVtKSkgIT0gTlVMTCkgewogCiAJCWlmIChpdGVtLmZvcm1hdCAhPSBISURfSVRFTV9GT1JNQVRfU0hPUlQpIHsKIAkJCWRiZ19oaWQoInVuZXhwZWN0ZWQgbG9uZyBnbG9iYWwgaXRlbVxuIik7Ci0JCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQkJCXZmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAKIAkJaWYgKGRpc3BhdGNoX3R5cGVbaXRlbS50eXBlXShwYXJzZXIsICZpdGVtKSkgewogCQkJZGJnX2hpZCgiaXRlbSAldSAldSAldSAldSBwYXJzaW5nIGZhaWxlZFxuIiwKIAkJCQlpdGVtLmZvcm1hdCwgKHVuc2lnbmVkKWl0ZW0uc2l6ZSwgKHVuc2lnbmVkKWl0ZW0udHlwZSwgKHVuc2lnbmVkKWl0ZW0udGFnKTsKLQkJCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOwotCQkJdmZyZWUocGFyc2VyKTsKLQkJCXJldHVybiBOVUxMOworCQkJZ290byBlcnI7CiAJCX0KIAogCQlpZiAoc3RhcnQgPT0gZW5kKSB7CiAJCQlpZiAocGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0cikgewogCQkJCWRiZ19oaWQoInVuYmFsYW5jZWQgY29sbGVjdGlvbiBhdCBlbmQgb2YgcmVwb3J0IGRlc2NyaXB0aW9uXG4iKTsKLQkJCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQkJCQl2ZnJlZShwYXJzZXIpOwotCQkJCXJldHVybiBOVUxMOworCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoKSB7CiAJCQkJZGJnX2hpZCgidW5iYWxhbmNlZCBkZWxpbWl0ZXIgYXQgZW5kIG9mIHJlcG9ydCBkZXNjcmlwdGlvblxuIik7Ci0JCQkJaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7Ci0JCQkJdmZyZWUocGFyc2VyKTsKLQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCXZmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gZGV2aWNlOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKIAlkYmdfaGlkKCJpdGVtIGZldGNoaW5nIGZhaWxlZCBhdCBvZmZzZXQgJWRcbiIsIChpbnQpKGVuZCAtIHN0YXJ0KSk7Ci0JaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7CitlcnI6CiAJdmZyZWUocGFyc2VyKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3BhcnNlX3JlcG9ydCk7CiAKQEAgLTcyNCw5ICs3MTUsOSBAQAogc3RhdGljIHMzMiBzbnRvMzIoX191MzIgdmFsdWUsIHVuc2lnbmVkIG4pCiB7CiAJc3dpdGNoIChuKSB7Ci0JCWNhc2UgODogIHJldHVybiAoKF9fczgpdmFsdWUpOwotCQljYXNlIDE2OiByZXR1cm4gKChfX3MxNil2YWx1ZSk7Ci0JCWNhc2UgMzI6IHJldHVybiAoKF9fczMyKXZhbHVlKTsKKwljYXNlIDg6ICByZXR1cm4gKChfX3M4KXZhbHVlKTsKKwljYXNlIDE2OiByZXR1cm4gKChfX3MxNil2YWx1ZSk7CisJY2FzZSAzMjogcmV0dXJuICgoX19zMzIpdmFsdWUpOwogCX0KIAlyZXR1cm4gdmFsdWUgJiAoMSA8PCAobiAtIDEpKSA/IHZhbHVlIHwgKC0xIDw8IG4pIDogdmFsdWU7CiB9CkBAIC04MTUsOSArODA2LDczIEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdm9pZCBoaWRfcHJvY2Vzc19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlLCBpbnQgaW50ZXJydXB0KQorLyoqCisgKiBoaWRfbWF0Y2hfcmVwb3J0IC0gY2hlY2sgaWYgZHJpdmVyJ3MgcmF3X2V2ZW50IHNob3VsZCBiZSBjYWxsZWQKKyAqCisgKiBAaGlkOiBoaWQgZGV2aWNlCisgKiBAcmVwb3J0X3R5cGU6IHR5cGUgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIGNvbXBhcmUgaGlkLT5kcml2ZXItPnJlcG9ydF90YWJsZS0+cmVwb3J0X3R5cGUgdG8gcmVwb3J0LT50eXBlCisgKi8KK3N0YXRpYyBpbnQgaGlkX21hdGNoX3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0KQogeworCWNvbnN0IHN0cnVjdCBoaWRfcmVwb3J0X2lkICppZCA9IGhpZC0+ZHJpdmVyLT5yZXBvcnRfdGFibGU7CisKKwlpZiAoIWlkKSAvKiBOVUxMIG1lYW5zIGFsbCAqLworCQlyZXR1cm4gMTsKKworCWZvciAoOyBpZC0+cmVwb3J0X3R5cGUgIT0gSElEX1RFUk1JTkFUT1I7IGlkKyspCisJCWlmIChpZC0+cmVwb3J0X3R5cGUgPT0gSElEX0FOWV9JRCB8fAorCQkJCWlkLT5yZXBvcnRfdHlwZSA9PSByZXBvcnQtPnR5cGUpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoaWRfbWF0Y2hfdXNhZ2UgLSBjaGVjayBpZiBkcml2ZXIncyBldmVudCBzaG91bGQgYmUgY2FsbGVkCisgKgorICogQGhpZDogaGlkIGRldmljZQorICogQHVzYWdlOiB1c2FnZSB0byBtYXRjaCBhZ2FpbnN0CisgKgorICogY29tcGFyZSBoaWQtPmRyaXZlci0+dXNhZ2VfdGFibGUtPnVzYWdlX3t0eXBlLGNvZGV9IHRvCisgKiB1c2FnZS0+dXNhZ2Vfe3R5cGUsY29kZX0KKyAqLworc3RhdGljIGludCBoaWRfbWF0Y2hfdXNhZ2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UpCit7CisJY29uc3Qgc3RydWN0IGhpZF91c2FnZV9pZCAqaWQgPSBoaWQtPmRyaXZlci0+dXNhZ2VfdGFibGU7CisKKwlpZiAoIWlkKSAvKiBOVUxMIG1lYW5zIGFsbCAqLworCQlyZXR1cm4gMTsKKworCWZvciAoOyBpZC0+dXNhZ2VfdHlwZSAhPSBISURfQU5ZX0lEIC0gMTsgaWQrKykKKwkJaWYgKChpZC0+dXNhZ2VfaGlkID09IEhJRF9BTllfSUQgfHwKKwkJCQlpZC0+dXNhZ2VfaGlkID09IHVzYWdlLT5oaWQpICYmCisJCQkJKGlkLT51c2FnZV90eXBlID09IEhJRF9BTllfSUQgfHwKKwkJCQlpZC0+dXNhZ2VfdHlwZSA9PSB1c2FnZS0+dHlwZSkgJiYKKwkJCQkoaWQtPnVzYWdlX2NvZGUgPT0gSElEX0FOWV9JRCB8fAorCQkJCSBpZC0+dXNhZ2VfY29kZSA9PSB1c2FnZS0+Y29kZSkpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGlkX3Byb2Nlc3NfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSwgaW50IGludGVycnVwdCkKK3sKKwlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGhpZC0+ZHJpdmVyOworCWludCByZXQ7CisKIAloaWRfZHVtcF9pbnB1dCh1c2FnZSwgdmFsdWUpOworCisJaWYgKGhkcnYgJiYgaGRydi0+ZXZlbnQgJiYgaGlkX21hdGNoX3VzYWdlKGhpZCwgdXNhZ2UpKSB7CisJCXJldCA9IGhkcnYtPmV2ZW50KGhpZCwgZmllbGQsIHVzYWdlLCB2YWx1ZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJaWYgKHJldCA8IDApCisJCQkJZGJnX2hpZCgiJXMncyBldmVudCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCQkJCWhkcnYtPm5hbWUsIHJldCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCiAJCWhpZGlucHV0X2hpZF9ldmVudChoaWQsIGZpZWxkLCB1c2FnZSwgdmFsdWUpOwogCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYgJiYgaW50ZXJydXB0ICYmIGhpZC0+aGlkZGV2X2hpZF9ldmVudCkKQEAgLTk0Niw0NCArMTAwMSw0NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3NldF9maWVsZCk7CiAKLWludCBoaWRfaW5wdXRfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCB0eXBlLCB1OCAqZGF0YSwgaW50IHNpemUsIGludCBpbnRlcnJ1cHQpCitzdGF0aWMgc3RydWN0IGhpZF9yZXBvcnQgKmhpZF9nZXRfcmVwb3J0KHN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlcG9ydF9lbnVtLAorCQljb25zdCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXVuc2lnbmVkIGludCBuID0gMDsJLyogTm9ybWFsbHkgcmVwb3J0IG51bWJlciBpcyAwICovCisKKwkvKiBEZXZpY2UgdXNlcyBudW1iZXJlZCByZXBvcnRzLCBkYXRhWzBdIGlzIHJlcG9ydCBudW1iZXIgKi8KKwlpZiAocmVwb3J0X2VudW0tPm51bWJlcmVkKQorCQluID0gKmRhdGE7CisKKwlyZXBvcnQgPSByZXBvcnRfZW51bS0+cmVwb3J0X2lkX2hhc2hbbl07CisJaWYgKHJlcG9ydCA9PSBOVUxMKQorCQlkYmdfaGlkKCJ1bmRlZmluZWQgcmVwb3J0X2lkICV1IHJlY2VpdmVkXG4iLCBuKTsKKworCXJldHVybiByZXBvcnQ7Cit9CisKK3ZvaWQgaGlkX3JlcG9ydF9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgaW50IHR5cGUsIHU4ICpkYXRhLCBpbnQgc2l6ZSwKKwkJaW50IGludGVycnVwdCkKIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZXBvcnRfZW51bSA9IGhpZC0+cmVwb3J0X2VudW0gKyB0eXBlOwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0JaW50IG4sIHJzaXplLCBpOworCXVuc2lnbmVkIGludCBhOworCWludCByc2l6ZSwgY3NpemUgPSBzaXplOworCXU4ICpjZGF0YSA9IGRhdGE7CiAKLQlpZiAoIWhpZCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJcmVwb3J0ID0gaGlkX2dldF9yZXBvcnQocmVwb3J0X2VudW0sIGRhdGEpOworCWlmICghcmVwb3J0KQorCQlyZXR1cm47CiAKLQlpZiAoIXNpemUpIHsKLQkJZGJnX2hpZCgiZW1wdHkgcmVwb3J0XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWRiZ19oaWQoInJlcG9ydCAoc2l6ZSAldSkgKCVzbnVtYmVyZWQpXG4iLCBzaXplLCByZXBvcnRfZW51bS0+bnVtYmVyZWQgPyAiIiA6ICJ1biIpOwotCi0JbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWxseSByZXBvcnQgbnVtYmVyIGlzIDAgKi8KLQlpZiAocmVwb3J0X2VudW0tPm51bWJlcmVkKSB7ICAgIC8qIERldmljZSB1c2VzIG51bWJlcmVkIHJlcG9ydHMsIGRhdGFbMF0gaXMgcmVwb3J0IG51bWJlciAqLwotCQluID0gKmRhdGErKzsKLQkJc2l6ZS0tOwotCX0KLQotCS8qIGR1bXAgdGhlIHJlcG9ydCAqLwotCWRiZ19oaWQoInJlcG9ydCAlZCAoc2l6ZSAldSkgPSAiLCBuLCBzaXplKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlkYmdfaGlkX2xpbmUoIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JZGJnX2hpZF9saW5lKCJcbiIpOwotCi0JaWYgKCEocmVwb3J0ID0gcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW25dKSkgewotCQlkYmdfaGlkKCJ1bmRlZmluZWQgcmVwb3J0X2lkICVkIHJlY2VpdmVkXG4iLCBuKTsKLQkJcmV0dXJuIC0xOworCWlmIChyZXBvcnRfZW51bS0+bnVtYmVyZWQpIHsKKwkJY2RhdGErKzsKKwkJY3NpemUtLTsKIAl9CiAKIAlyc2l6ZSA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxOwogCi0JaWYgKHNpemUgPCByc2l6ZSkgewotCQlkYmdfaGlkKCJyZXBvcnQgJWQgaXMgdG9vIHNob3J0LCAoJWQgPCAlZClcbiIsIHJlcG9ydC0+aWQsIHNpemUsIHJzaXplKTsKLQkJbWVtc2V0KGRhdGEgKyBzaXplLCAwLCByc2l6ZSAtIHNpemUpOworCWlmIChjc2l6ZSA8IHJzaXplKSB7CisJCWRiZ19oaWQoInJlcG9ydCAlZCBpcyB0b28gc2hvcnQsICglZCA8ICVkKVxuIiwgcmVwb3J0LT5pZCwKKwkJCQljc2l6ZSwgcnNpemUpOworCQltZW1zZXQoY2RhdGEgKyBjc2l6ZSwgMCwgcnNpemUgLSBjc2l6ZSk7CiAJfQogCiAJaWYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpICYmIGhpZC0+aGlkZGV2X3JlcG9ydF9ldmVudCkKQEAgLTk5NiwyNCArMTA1NCw2NjMgQEAKIAkJCWhpZHJhd19yZXBvcnRfZXZlbnQoaGlkLCBkYXRhLCBzaXplKTsKIAl9CiAKLQlmb3IgKG4gPSAwOyBuIDwgcmVwb3J0LT5tYXhmaWVsZDsgbisrKQotCQloaWRfaW5wdXRfZmllbGQoaGlkLCByZXBvcnQtPmZpZWxkW25dLCBkYXRhLCBpbnRlcnJ1cHQpOworCWZvciAoYSA9IDA7IGEgPCByZXBvcnQtPm1heGZpZWxkOyBhKyspCisJCWhpZF9pbnB1dF9maWVsZChoaWQsIHJlcG9ydC0+ZmllbGRbYV0sIGNkYXRhLCBpbnRlcnJ1cHQpOwogCiAJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQogCQloaWRpbnB1dF9yZXBvcnRfZXZlbnQoaGlkLCByZXBvcnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3JlcG9ydF9yYXdfZXZlbnQpOworCisvKioKKyAqIGhpZF9pbnB1dF9yZXBvcnQgLSByZXBvcnQgZGF0YSBmcm9tIGxvd2VyIGxheWVyICh1c2IsIGJ0Li4uKQorICoKKyAqIEBoaWQ6IGhpZCBkZXZpY2UKKyAqIEB0eXBlOiBISUQgcmVwb3J0IHR5cGUgKEhJRF8qX1JFUE9SVCkKKyAqIEBkYXRhOiByZXBvcnQgY29udGVudHMKKyAqIEBzaXplOiBzaXplIG9mIGRhdGEgcGFyYW1ldGVyCisgKiBAaW50ZXJydXB0OiBjYWxsZWQgZnJvbSBhdG9taWM/CisgKgorICogVGhpcyBpcyBkYXRhIGVudHJ5IGZvciBsb3dlciBsYXllcnMuCisgKi8KK2ludCBoaWRfaW5wdXRfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCB0eXBlLCB1OCAqZGF0YSwgaW50IHNpemUsIGludCBpbnRlcnJ1cHQpCit7CisJc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0gPSBoaWQtPnJlcG9ydF9lbnVtICsgdHlwZTsKKwlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGhpZC0+ZHJpdmVyOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmICghaGlkIHx8ICFoaWQtPmRyaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXNpemUpIHsKKwkJZGJnX2hpZCgiZW1wdHkgcmVwb3J0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRiZ19oaWQoInJlcG9ydCAoc2l6ZSAldSkgKCVzbnVtYmVyZWQpXG4iLCBzaXplLCByZXBvcnRfZW51bS0+bnVtYmVyZWQgPyAiIiA6ICJ1biIpOworCisJcmVwb3J0ID0gaGlkX2dldF9yZXBvcnQocmVwb3J0X2VudW0sIGRhdGEpOworCWlmICghcmVwb3J0KQorCQlyZXR1cm4gLTE7CisKKwkvKiBkdW1wIHRoZSByZXBvcnQgKi8KKwlkYmdfaGlkKCJyZXBvcnQgJWQgKHNpemUgJXUpID0gIiwgcmVwb3J0LT5pZCwgc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJZGJnX2hpZF9saW5lKCIgJTAyeCIsIGRhdGFbaV0pOworCWRiZ19oaWRfbGluZSgiXG4iKTsKKworCWlmIChoZHJ2ICYmIGhkcnYtPnJhd19ldmVudCAmJiBoaWRfbWF0Y2hfcmVwb3J0KGhpZCwgcmVwb3J0KSkgeworCQlyZXQgPSBoZHJ2LT5yYXdfZXZlbnQoaGlkLCByZXBvcnQsIGRhdGEsIHNpemUpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CisJfQorCisJaGlkX3JlcG9ydF9yYXdfZXZlbnQoaGlkLCB0eXBlLCBkYXRhLCBzaXplLCBpbnRlcnJ1cHQpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChoaWRfaW5wdXRfcmVwb3J0KTsKIAorc3RhdGljIGJvb2wgaGlkX21hdGNoX29uZV9pZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBpZC0+YnVzID09IGhkZXYtPmJ1cyAmJgorCQkoaWQtPnZlbmRvciA9PSBISURfQU5ZX0lEIHx8IGlkLT52ZW5kb3IgPT0gaGRldi0+dmVuZG9yKSAmJgorCQkoaWQtPnByb2R1Y3QgPT0gSElEX0FOWV9JRCB8fCBpZC0+cHJvZHVjdCA9PSBoZGV2LT5wcm9kdWN0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICpoaWRfbWF0Y2hfaWQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlmb3IgKDsgaWQtPmJ1czsgaWQrKykKKwkJaWYgKGhpZF9tYXRjaF9vbmVfaWQoaGRldiwgaWQpKQorCQkJcmV0dXJuIGlkOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRfaGlkZGV2X2xpc3RbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUdFLCBVU0JfREVWSUNFX0lEX01HRV9VUFMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01HRSwgVVNCX0RFVklDRV9JRF9NR0VfVVBTMSkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBib29sIGhpZF9oaWRkZXYoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJcmV0dXJuICEhaGlkX21hdGNoX2lkKGhkZXYsIGhpZF9oaWRkZXZfbGlzdCk7Cit9CisKK2ludCBoaWRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgdW5zaWduZWQgaW50IGNvbm5lY3RfbWFzaykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqdHlwZXNbXSA9IHsgIkRldmljZSIsICJQb2ludGVyIiwgIk1vdXNlIiwgIkRldmljZSIsCisJCSJKb3lzdGljayIsICJHYW1lcGFkIiwgIktleWJvYXJkIiwgIktleXBhZCIsCisJCSJNdWx0aS1BeGlzIENvbnRyb2xsZXIiCisJfTsKKwljb25zdCBjaGFyICp0eXBlLCAqYnVzOworCWNoYXIgYnVmWzY0XTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgbGVuOworCisJaWYgKGhkZXYtPmJ1cyAhPSBCVVNfVVNCKQorCQljb25uZWN0X21hc2sgJj0gfkhJRF9DT05ORUNUX0hJRERFVjsKKwlpZiAoaGlkX2hpZGRldihoZGV2KSkKKwkJY29ubmVjdF9tYXNrIHw9IEhJRF9DT05ORUNUX0hJRERFVl9GT1JDRTsKKworCWlmICgoY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfSElESU5QVVQpICYmICFoaWRpbnB1dF9jb25uZWN0KGhkZXYsCisJCQkJY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfSElESU5QVVRfRk9SQ0UpKQorCQloZGV2LT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0lOUFVUOworCWlmICgoY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfSElEREVWKSAmJiBoZGV2LT5oaWRkZXZfY29ubmVjdCAmJgorCQkJIWhkZXYtPmhpZGRldl9jb25uZWN0KGhkZXYsCisJCQkJY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFKSkKKwkJaGRldi0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9ISURERVY7CisJaWYgKChjb25uZWN0X21hc2sgJiBISURfQ09OTkVDVF9ISURSQVcpICYmICFoaWRyYXdfY29ubmVjdChoZGV2KSkKKwkJaGRldi0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9ISURSQVc7CisKKwlpZiAoIWhkZXYtPmNsYWltZWQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2xhaW1lZCBieSBuZWl0aGVyIGlucHV0LCBoaWRkZXYgbm9yICIKKwkJCQkiaGlkcmF3XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpICYmCisJCQkoY29ubmVjdF9tYXNrICYgSElEX0NPTk5FQ1RfRkYpICYmIGhkZXYtPmZmX2luaXQpCisJCWhkZXYtPmZmX2luaXQoaGRldik7CisKKwlsZW4gPSAwOworCWlmIChoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgImlucHV0Iik7CisJaWYgKGhkZXYtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzaGlkZGV2JWQiLCBsZW4gPyAiLCIgOiAiIiwKKwkJCQloZGV2LT5taW5vcik7CisJaWYgKGhkZXYtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURSQVcpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzaGlkcmF3JWQiLCBsZW4gPyAiLCIgOiAiIiwKKwkJCQkoKHN0cnVjdCBoaWRyYXcgKiloZGV2LT5oaWRyYXcpLT5taW5vcik7CisKKwl0eXBlID0gIkRldmljZSI7CisJZm9yIChpID0gMDsgaSA8IGhkZXYtPm1heGNvbGxlY3Rpb247IGkrKykgeworCQlzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24gKmNvbCA9ICZoZGV2LT5jb2xsZWN0aW9uW2ldOworCQlpZiAoY29sLT50eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OICYmCisJCSAgIChjb2wtPnVzYWdlICYgSElEX1VTQUdFX1BBR0UpID09IEhJRF9VUF9HRU5ERVNLICYmCisJCSAgIChjb2wtPnVzYWdlICYgMHhmZmZmKSA8IEFSUkFZX1NJWkUodHlwZXMpKSB7CisJCQl0eXBlID0gdHlwZXNbY29sLT51c2FnZSAmIDB4ZmZmZl07CisJCQlicmVhazsKKwkJfQorCX0KKworCXN3aXRjaCAoaGRldi0+YnVzKSB7CisJY2FzZSBCVVNfVVNCOgorCQlidXMgPSAiVVNCIjsKKwkJYnJlYWs7CisJY2FzZSBCVVNfQkxVRVRPT1RIOgorCQlidXMgPSAiQkxVRVRPT1RIIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnVzID0gIjxVTktOT1dOPiI7CisJfQorCisJZGV2X2luZm8oJmhkZXYtPmRldiwgIiVzOiAlcyBISUQgdiV4LiUwMnggJXMgWyVzXSBvbiAlc1xuIiwKKwkJCWJ1ZiwgYnVzLCBoZGV2LT52ZXJzaW9uID4+IDgsIGhkZXYtPnZlcnNpb24gJiAweGZmLAorCQkJdHlwZSwgaGRldi0+bmFtZSwgaGRldi0+cGh5cyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZF9jb25uZWN0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGhpZF9ibGFja2xpc3RbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1g1XzAwNUQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FUVl9JUkNPTlRST0wpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0lSQ09OVFJPTDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BVkVSTUVESUEsIFVTQl9ERVZJQ0VfSURfQVZFUl9GTV9NUjgwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkVMS0lOLCBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CUklHSFQsIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1NLODExNSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVpLRVksIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dZUkFUSU9OLCBVU0JfREVWSUNFX0lEX0dZUkFUSU9OX1JFTU9URSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEFCVEVDLCBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSXzIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fREVTS1RPUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0VER0UpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9LQkQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VMSVRFX0tCRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfQ09SRExFU1NfREVTS1RPUF9MWDUwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTFgzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9WMTUwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FWFRSRU1FXzNEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SVU1CTEVQQUQyXzIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJTkdNQU5fRjNEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9GT1JDRTNEX1BSTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9TSURFV0lOREVSX0dWKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfTkU0SykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0xLNkspIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfVVNCKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfV0lSRUxFU1NfT1BUSUNBTF9ERVNLVE9QXzNfMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9OVEVSRVksIFVTQl9ERVZJQ0VfSURfR0VOSVVTX0tCMjlFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9QRVRBTFlOWCwgVVNCX0RFVklDRV9JRF9QRVRBTFlOWF9NQVhURVJfUkVNT1RFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TQU1TVU5HLCBVU0JfREVWSUNFX0lEX1NBTVNVTkdfSVJfUkVNT1RFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NVTlBMVVMsIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUCkgfSwKKworCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBjKSB9LAorCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUKSB9LAorCXsgfQorfTsKKworc3RhdGljIGludCBoaWRfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBoaWRfZHJpdmVyLCBkcml2ZXIpOworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisKKwlpZiAoIWhpZF9tYXRjaF9pZChoZGV2LCBoZHJ2LT5pZF90YWJsZSkpCisJCXJldHVybiAwOworCisJLyogZ2VuZXJpYyB3YW50cyBhbGwgbm9uLWJsYWNrbGlzdGVkICovCisJaWYgKCFzdHJuY21wKGhkcnYtPm5hbWUsICJnZW5lcmljLSIsIDgpKQorCQlyZXR1cm4gIWhpZF9tYXRjaF9pZChoZGV2LCBoaWRfYmxhY2tsaXN0KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhpZF9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoaWRfZHJpdmVyICpoZHJ2ID0gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLAorCQkJc3RydWN0IGhpZF9kcml2ZXIsIGRyaXZlcik7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSwgZGV2KTsKKwljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWhkZXYtPmRyaXZlcikgeworCQlpZCA9IGhpZF9tYXRjaF9pZChoZGV2LCBoZHJ2LT5pZF90YWJsZSk7CisJCWlmIChpZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJaGRldi0+ZHJpdmVyID0gaGRydjsKKwkJaWYgKGhkcnYtPnByb2JlKSB7CisJCQlyZXQgPSBoZHJ2LT5wcm9iZShoZGV2LCBpZCk7CisJCX0gZWxzZSB7IC8qIGRlZmF1bHQgcHJvYmUgKi8KKwkJCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwkJfQorCQlpZiAocmV0KQorCQkJaGRldi0+ZHJpdmVyID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoaWRfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGhkZXYtPmRyaXZlcjsKKworCWlmIChoZHJ2KSB7CisJCWlmIChoZHJ2LT5yZW1vdmUpCisJCQloZHJ2LT5yZW1vdmUoaGRldik7CisJCWVsc2UgLyogZGVmYXVsdCByZW1vdmUgKi8KKwkJCWhpZF9od19zdG9wKGhkZXYpOworCQloZGV2LT5kcml2ZXIgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZF91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSwgZGV2KTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJISURfSUQ9JTA0WDolMDhYOiUwOFgiLAorCQkJaGRldi0+YnVzLCBoZGV2LT52ZW5kb3IsIGhkZXYtPnByb2R1Y3QpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJISURfTkFNRT0lcyIsIGhkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJISURfUEhZUz0lcyIsIGhkZXYtPnBoeXMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJISURfVU5JUT0lcyIsIGhkZXYtPnVuaXEpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz1oaWQ6YiUwNFh2JTA4WHAlMDhYIiwKKwkJCWhkZXYtPmJ1cywgaGRldi0+dmVuZG9yLCBoZGV2LT5wcm9kdWN0KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBoaWRfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImhpZCIsCisJLm1hdGNoCQk9IGhpZF9idXNfbWF0Y2gsCisJLnByb2JlCQk9IGhpZF9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZQkJPSBoaWRfZGV2aWNlX3JlbW92ZSwKKwkudWV2ZW50CQk9IGhpZF91ZXZlbnQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaGlkX2lnbm9yZV9saXN0W10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FDRUNBRCwgVVNCX0RFVklDRV9JRF9BQ0VDQURfRkxBSVIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FDRUNBRCwgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BRFNfVEVDSCwgVVNCX0RFVklDRV9JRF9BRFNfVEVDSF9SQURJT19TSTQ3MFgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMTApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQUxDT1IsIFVTQl9ERVZJQ0VfSURfQUxDT1JfVVNCUlMyMzIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FTVVMsIFVTQl9ERVZJQ0VfSURfQVNVU19MQ00pfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkVSS1NISVJFLCBVU0JfREVWSUNFX0lEX0JFUktTSElSRV9QQ1dEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSURDLCAweDAxMDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZR05BTCwgVVNCX0RFVklDRV9JRF9DWUdOQUxfUkFESU9fU0k0NzBYKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDkpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF8wXzRfSUZfS0lUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzhfN19JRl9LSVQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HT1RPUCwgVVNCX0RFVklDRV9JRF9TVVBFUl9RMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR09UT1AsIFVTQl9ERVZJQ0VfSURfR09HT1BFTikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR09UT1AsIFVTQl9ERVZJQ0VfSURfUEVOUE9XRVIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSRUVOQVNJQSwgMHgwMDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVUQUdNQUNCRVRILCBVU0JfREVWSUNFX0lEX0dSRVRBR01BQ0JFVEhfSFVFWSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSSUZGSU4sIFVTQl9ERVZJQ0VfSURfU09VTkRLTk9CKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fOTApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDYpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDYpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDYpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDcpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDkpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA2KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSU1BVElPTiwgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS0JHRUFSLCBVU0JfREVWSUNFX0lEX0tCR0VBUl9KQU1TVFVESU8pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfR1BFTl81NjApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NBU1NZKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTU9CSUxFQ0FTU1kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0pXTSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfRE1NUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVU1JUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfWFJBWTEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9WSURFT0NPTSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfQ09NM0xBQikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX05FVFdPUktBTkFMWVNFUikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfUE9XRVJDT05UUk9MKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUNDLCBVU0JfREVWSUNFX0lEX01DQ19QTUQxMDI0TFMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01DQywgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTIwOExTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST0NISVAsIFVTQl9ERVZJQ0VfSURfUElDS0lUMSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9DSElQLCBVU0JfREVWSUNFX0lEX1BJQ0tJVDIpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05BVElPTkFMX1NFTUlDT05EVUNUT1IsIFVTQl9ERVZJQ0VfSURfTl9TX0hBUk1PTlkpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDIwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDEwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAxMDgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDIwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAzMDApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDUwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEFOSklULCAweDAwMDEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEFOSklULCAweDAwMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgsIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09VTkRHUkFQSCwgVVNCX0RFVklDRV9JRF9TT1VOREdSQVBIX0lNT05fTENEMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09VTkRHUkFQSCwgVVNCX0RFVklDRV9JRF9TT1VOREdSQVBIX0lNT05fTENEMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEVOWCwgVVNCX0RFVklDRV9JRF9URU5YX0lCVUREWTEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RFTlgsIFVTQl9ERVZJQ0VfSURfVEVOWF9JQlVERFkyKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjMwMCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSLCAweGIzMDQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiNjUxKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjY1NCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xBQlBSTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9DWUNMT1BTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTENTUEVDKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgSElEX0FOWV9JRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzIwKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMjApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1lFQUxJTkssIFVTQl9ERVZJQ0VfSURfWUVBTElOS19QMUtfUDRLX0IySykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAwNSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfWkVST1BMVVMsIDB4MDAzMCkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBib29sIGhpZF9pZ25vcmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3dpdGNoIChoZGV2LT52ZW5kb3IpIHsKKwljYXNlIFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTOgorCQkvKiBpZ25vcmUgYWxsIENvZGUgTWVyY2VuYXJpZXMgSU9XYXJyaW9yIGRldmljZXMgKi8KKwkJaWYgKGhkZXYtPnByb2R1Y3QgPj0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0ZJUlNUICYmCisJCQkJaGRldi0+cHJvZHVjdCA8PSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfTEFTVCkKKwkJCXJldHVybiB0cnVlOworCQlicmVhazsKKwljYXNlIFVTQl9WRU5ET1JfSURfTE9HSVRFQ0g6CisJCWlmIChoZGV2LT5wcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9GSVJTVCAmJgorCQkJCWhkZXYtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZX0xBU1QpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuICEhaGlkX21hdGNoX2lkKGhkZXYsIGhpZF9pZ25vcmVfbGlzdCk7Cit9CisKK2ludCBoaWRfYWRkX2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdGF0aWMgYXRvbWljX3QgaWQgPSBBVE9NSUNfSU5JVCgwKTsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oaGRldi0+c3RhdHVzICYgSElEX1NUQVRfQURERUQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogd2UgbmVlZCB0byBraWxsIHRoZW0gaGVyZSwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBzdGF5IGFsbG9jYXRlZCB0bworCSAqIHdhaXQgZm9yIGNvbWluZyBkcml2ZXIgKi8KKwlpZiAoaGlkX2lnbm9yZShoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBYWFggaGFjaywgYW55IG90aGVyIGNsZWFuZXIgc29sdXRpb24gPCAyMCBidXNfaWQgYnl0ZXM/ICovCisJc3ByaW50ZihoZGV2LT5kZXYuYnVzX2lkLCAiJTA0WDolMDRYOiUwNFguJTA0WCIsIGhkZXYtPmJ1cywKKwkJCWhkZXYtPnZlbmRvciwgaGRldi0+cHJvZHVjdCwgYXRvbWljX2luY19yZXR1cm4oJmlkKSk7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZoZGV2LT5kZXYpOworCWlmICghcmV0KQorCQloZGV2LT5zdGF0dXMgfD0gSElEX1NUQVRfQURERUQ7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2FkZF9kZXZpY2UpOworCisvKioKKyAqIGhpZF9hbGxvY2F0ZV9kZXZpY2UgLSBhbGxvY2F0ZSBuZXcgaGlkIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgaGlkIGRldmljZSwgc28gdGhhdCBoaWRfZGVzdHJveV9kZXZpY2UgbWlnaHQgYmUKKyAqIHVzZWQgdG8gZnJlZSBpdC4KKyAqCisgKiBOZXcgaGlkX2RldmljZSBwb2ludGVyIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBFUlJfUFRSIGVuY29kZWQKKyAqIGVycm9yIHZhbHVlLgorICovCitzdHJ1Y3QgaGlkX2RldmljZSAqaGlkX2FsbG9jYXRlX2RldmljZSh2b2lkKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2OworCXVuc2lnbmVkIGludCBpOworCWludCByZXQgPSAtRU5PTUVNOworCisJaGRldiA9IGt6YWxsb2Moc2l6ZW9mKCpoZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCWRldmljZV9pbml0aWFsaXplKCZoZGV2LT5kZXYpOworCWhkZXYtPmRldi5yZWxlYXNlID0gaGlkX2RldmljZV9yZWxlYXNlOworCWhkZXYtPmRldi5idXMgPSAmaGlkX2J1c190eXBlOworCisJaGRldi0+Y29sbGVjdGlvbiA9IGtjYWxsb2MoSElEX0RFRkFVTFRfTlVNX0NPTExFQ1RJT05TLAorCQkJc2l6ZW9mKHN0cnVjdCBoaWRfY29sbGVjdGlvbiksIEdGUF9LRVJORUwpOworCWlmIChoZGV2LT5jb2xsZWN0aW9uID09IE5VTEwpCisJCWdvdG8gZXJyOworCWhkZXYtPmNvbGxlY3Rpb25fc2l6ZSA9IEhJRF9ERUZBVUxUX05VTV9DT0xMRUNUSU9OUzsKKworCWZvciAoaSA9IDA7IGkgPCBISURfUkVQT1JUX1RZUEVTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZoZGV2LT5yZXBvcnRfZW51bVtpXS5yZXBvcnRfbGlzdCk7CisKKwlyZXR1cm4gaGRldjsKK2VycjoKKwlwdXRfZGV2aWNlKCZoZGV2LT5kZXYpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfYWxsb2NhdGVfZGV2aWNlKTsKKworc3RhdGljIHZvaWQgaGlkX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJaWYgKGhkZXYtPnN0YXR1cyAmIEhJRF9TVEFUX0FEREVEKSB7CisJCWRldmljZV9kZWwoJmhkZXYtPmRldik7CisJCWhkZXYtPnN0YXR1cyAmPSB+SElEX1NUQVRfQURERUQ7CisJfQorfQorCisvKioKKyAqIGhpZF9kZXN0cm95X2RldmljZSAtIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgZGV2aWNlCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBJZiB5b3UgYWxsb2NhdGUgaGlkX2RldmljZSB0aHJvdWdoIGhpZF9hbGxvY2F0ZV9kZXZpY2UsIHlvdSBzaG91bGQgZXZlcgorICogZnJlZSBieSB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkIGhpZF9kZXN0cm95X2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwloaWRfcmVtb3ZlX2RldmljZShoZGV2KTsKKwlwdXRfZGV2aWNlKCZoZGV2LT5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2Rlc3Ryb3lfZGV2aWNlKTsKKworaW50IF9faGlkX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCWNvbnN0IGNoYXIgKm1vZF9uYW1lKQoreworCWhkcnYtPmRyaXZlci5uYW1lID0gaGRydi0+bmFtZTsKKwloZHJ2LT5kcml2ZXIuYnVzID0gJmhpZF9idXNfdHlwZTsKKwloZHJ2LT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwloZHJ2LT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX2hpZF9yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIGhpZF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmaGRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZF91bnJlZ2lzdGVyX2RyaXZlcik7CisKKyNpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorc3RhdGljIHZvaWQgaGlkX2NvbXBhdF9sb2FkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJcmVxdWVzdF9tb2R1bGUoImhpZC1kdW1teSIpOworfQorc3RhdGljIERFQ0xBUkVfV09SSyhoaWRfY29tcGF0X3dvcmssIGhpZF9jb21wYXRfbG9hZCk7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmhpZF9jb21wYXRfd3E7CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgaGlkX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaGlkcmF3X2luaXQoKTsKKwlpbnQgcmV0OworCisJcmV0ID0gYnVzX3JlZ2lzdGVyKCZoaWRfYnVzX3R5cGUpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJISUQ6IGNhbid0IHJlZ2lzdGVyIGhpZCBidXNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBoaWRyYXdfaW5pdCgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2J1czsKKworI2lmZGVmIENPTkZJR19ISURfQ09NUEFUCisJaGlkX2NvbXBhdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoImhpZF9jb21wYXQiKTsKKwlpZiAoIWhpZF9jb21wYXRfd3EpIHsKKwkJaGlkcmF3X2V4aXQoKTsKKwkJZ290byBlcnI7CisJfQorCXF1ZXVlX3dvcmsoaGlkX2NvbXBhdF93cSwgJmhpZF9jb21wYXRfd29yayk7CisjZW5kaWYKKworCXJldHVybiAwOworZXJyX2J1czoKKwlidXNfdW5yZWdpc3RlcigmaGlkX2J1c190eXBlKTsKK2VycjoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaGlkX2V4aXQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorCWRlc3Ryb3lfd29ya3F1ZXVlKGhpZF9jb21wYXRfd3EpOworI2VuZGlmCiAJaGlkcmF3X2V4aXQoKTsKKwlidXNfdW5yZWdpc3RlcigmaGlkX2J1c190eXBlKTsKIH0KIAogbW9kdWxlX2luaXQoaGlkX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBjeXByZXNzICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgQ1BfUkRFU0NfU1dBUFBFRF9NSU5fTUFYCTB4MDEKKyNkZWZpbmUgQ1BfMldIRUVMX01PVVNFX0hBQ0sJCTB4MDIKKyNkZWZpbmUgQ1BfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MDQKKworLyoKKyAqIFNvbWUgVVNCIGJhcmNvZGUgcmVhZGVycyBmcm9tIGN5cHJlc3MgaGF2ZSB1c2FnZSBtaW4gYW5kIHVzYWdlIG1heCBpbgorICogdGhlIHdyb25nIG9yZGVyCisgKi8KK3N0YXRpYyB2b2lkIGNwX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghKHF1aXJrcyAmIENQX1JERVNDX1NXQVBQRURfTUlOX01BWCkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCByc2l6ZSAtIDQ7IGkrKykKKwkJaWYgKHJkZXNjW2ldID09IDB4MjkgJiYgcmRlc2NbaSArIDJdID09IDB4MTkpIHsKKwkJCV9fdTggdG1wOworCisJCQlyZGVzY1tpXSA9IDB4MTk7CisJCQlyZGVzY1tpICsgMl0gPSAweDI5OworCQkJdG1wID0gcmRlc2NbaSArIDNdOworCQkJcmRlc2NbaSArIDNdID0gcmRlc2NbaSArIDFdOworCQkJcmRlc2NbaSArIDFdID0gdG1wOworCQl9Cit9CisKK3N0YXRpYyBpbnQgY3BfaW5wdXRfbWFwcGVkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICghKHF1aXJrcyAmIENQXzJXSEVFTF9NT1VTRV9IQUNLKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMICYmIHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkKKwkJc2V0X2JpdChSRUxfSFdIRUVMLCAqYml0KTsKKwlpZiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICghKGhkZXYtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgfHwgIWZpZWxkLT5oaWRpbnB1dCB8fAorCQkJIXVzYWdlLT50eXBlIHx8ICEocXVpcmtzICYgQ1BfMldIRUVMX01PVVNFX0hBQ0spKQorCQlyZXR1cm4gMDsKKworCWlmICh1c2FnZS0+aGlkID09IDB4MDAwOTAwMDUpIHsKKwkJaWYgKHZhbHVlKQorCQkJcXVpcmtzIHw9ICBDUF8yV0hFRUxfTU9VU0VfSEFDS19PTjsKKwkJZWxzZQorCQkJcXVpcmtzICY9IH5DUF8yV0hFRUxfTU9VU0VfSEFDS19PTjsKKwkJaGlkX3NldF9kcnZkYXRhKGhkZXYsICh2b2lkICopcXVpcmtzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCAmJiAocXVpcmtzICYgQ1BfMldIRUVMX01PVVNFX0hBQ0tfT04pKSB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gZmllbGQtPmhpZGlucHV0LT5pbnB1dDsKKworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIFJFTF9IV0hFRUwsIHZhbHVlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3BfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJaGlkX3NldF9kcnZkYXRhKGhkZXYsICh2b2lkICopcXVpcmtzKTsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBjcF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEpLAorCQkuZHJpdmVyX2RhdGEgPSBDUF9SREVTQ19TV0FQUEVEX01JTl9NQVggfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMiksCisJCS5kcml2ZXJfZGF0YSA9IENQX1JERVNDX1NXQVBQRURfTUlOX01BWCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpLAorCQkuZHJpdmVyX2RhdGEgPSBDUF8yV0hFRUxfTU9VU0VfSEFDSyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBjcF9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGNwX2RyaXZlciA9IHsKKwkubmFtZSA9ICJjeXByZXNzIiwKKwkuaWRfdGFibGUgPSBjcF9kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBjcF9yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBlZCA9IGNwX2lucHV0X21hcHBlZCwKKwkuZXZlbnQgPSBjcF9ldmVudCwKKwkucHJvYmUgPSBjcF9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgY3BfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZjcF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBjcF9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZjcF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjcF9pbml0KTsKK21vZHVsZV9leGl0KGNwX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGN5cHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlbGwuYyBiL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwZDBkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGRlbGwgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKK3N0YXRpYyBpbnQgZGVsbF9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJdXNiaGlkX3NldF9sZWRzKGhkZXYpOworCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgZGVsbF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1NLODExNSkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZGVsbF9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGRlbGxfZHJpdmVyID0geworCS5uYW1lID0gImRlbGwiLAorCS5pZF90YWJsZSA9IGRlbGxfZGV2aWNlcywKKwkucHJvYmUgPSBkZWxsX3Byb2JlLAorfTsKKworc3RhdGljIGludCBkZWxsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmZGVsbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBkZWxsX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmRlbGxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGVsbF9pbml0KTsKK21vZHVsZV9leGl0KGRlbGxfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoZGVsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHVtbXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDhmODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtZHVtbXkuYwpAQCAtMCwwICsxLDcyIEBACisjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKworc3RhdGljIGludCBfX2luaXQgaGlkX2R1bW15X2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSElEX0E0VEVDSF9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGE0dGVjaCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX0FQUExFX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoYXBwbGUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9CRUxLSU5fTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihiZWxraW4pOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9CUklHSFRfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihicmlnaHQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9DSEVSUllfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihjaGVycnkpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9DSElDT05ZX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoY2hpY29ueSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX0NZUFJFU1NfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihjeXByZXNzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfREVMTF9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGRlbGwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9FWktFWV9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKGV6a2V5KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfR1lSQVRJT05fTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihneXJhdGlvbik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX0xPR0lURUNIX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIobG9naXRlY2gpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9NSUNST1NPRlRfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihtaWNyb3NvZnQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9NT05URVJFWV9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKG1vbnRlcmV5KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfUEFOVEhFUkxPUkRfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihwYW50aGVybG9yZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX1BFVEFMWU5YX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIocGV0YWx5bngpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0hJRF9TQU1TVU5HX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoc2Ftc3VuZyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElEX1NPTllfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihzb255KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfU1VOUExVU19NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKHN1bnBsdXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RIUlVTVE1BU1RFUl9GRl9NT0RVTEUKKwlISURfQ09NUEFUX0NBTExfRFJJVkVSKHRocnVzdG1hc3Rlcik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWkVST1BMVVNfRkZfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUih6ZXJvcGx1cyk7CisjZW5kaWYKKworCXJldHVybiAtRUlPOworfQorbW9kdWxlX2luaXQoaGlkX2R1bW15X2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZXprZXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1lemtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjQyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtZXprZXkuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgZXprZXkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2RlZmluZSBlel9tYXBfcmVsKGMpCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfUkVMLCAoYykpCisjZGVmaW5lIGV6X21hcF9rZXkoYykJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LCBFVl9LRVksIChjKSkKKworc3RhdGljIGludCBlel9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHgyMzA6IGV6X21hcF9rZXkoQlROX01PVVNFKTsJYnJlYWs7CisJY2FzZSAweDIzMTogZXpfbWFwX3JlbChSRUxfV0hFRUwpOwlicmVhazsKKwkvKgorCSAqIHRoaXMga2V5Ym9hcmQgaGFzIGEgc2Nyb2xsd2hlZWwgaW1wbGVtZW50ZWQgaW4KKwkgKiB0b3RhbGx5IGJyb2tlbiB3YXkuIFdlIG1hcCB0aGlzIHVzYWdlIHRlbXBvcmFyaWx5CisJICogdG8gSFdIRUVMIGFuZCBoYW5kbGUgaXQgaW4gdGhlIGV2ZW50IHF1aXJrIGhhbmRsZXIKKwkgKi8KKwljYXNlIDB4MjMyOiBlel9tYXBfcmVsKFJFTF9IV0hFRUwpOwlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXpfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJaWYgKCEoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKSB8fCAhZmllbGQtPmhpZGlucHV0IHx8CisJCQkhdXNhZ2UtPnR5cGUpCisJCXJldHVybiAwOworCisJLyogaGFuZGxlIHRoZSB0ZW1wb3JhcnkgcXVpcmt5IG1hcHBpbmcgdG8gSFdIRUVMICovCisJaWYgKHVzYWdlLT50eXBlID09IEVWX1JFTCAmJiB1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gZmllbGQtPmhpZGlucHV0LT5pbnB1dDsKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBSRUxfV0hFRUwsIC12YWx1ZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgZXpfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FWktFWSwgVVNCX0RFVklDRV9JRF9CVENfODE5MykgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZXpfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBlel9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZXprZXkiLAorCS5pZF90YWJsZSA9IGV6X2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSBlel9pbnB1dF9tYXBwaW5nLAorCS5ldmVudCA9IGV6X2V2ZW50LAorfTsKKworc3RhdGljIGludCBlel9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmV6X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGV6X2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmV6X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGV6X2luaXQpOworbW9kdWxlX2V4aXQoZXpfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoZXprZXkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWd5cmF0aW9uLmMgYi9kcml2ZXJzL2hpZC9oaWQtZ3lyYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUxMjBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWd5cmF0aW9uLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGd5cmF0aW9uICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgZ3lfbWFwX2tleV9jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpLCB1c2FnZSwgYml0LCBtYXgsIFwKKwkJCQkJRVZfS0VZLCAoYykpCitzdGF0aWMgaW50IGd5cmF0aW9uX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTE9HSVZFTkRPUikKKwkJcmV0dXJuIDA7CisKKwlzZXRfYml0KEVWX1JFUCwgaGktPmlucHV0LT5ldmJpdCk7CisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJLyogUmVwb3J0ZWQgb24gR3lyYXRpb24gTUNFIFJlbW90ZSAqLworCWNhc2UgMHgwMGQ6IGd5X21hcF9rZXlfY2xlYXIoS0VZX0hPTUUpOwkJYnJlYWs7CisJY2FzZSAweDAyNDogZ3lfbWFwX2tleV9jbGVhcihLRVlfRFZEKTsJCWJyZWFrOworCWNhc2UgMHgwMjU6IGd5X21hcF9rZXlfY2xlYXIoS0VZX1BWUik7CQlicmVhazsKKwljYXNlIDB4MDQ2OiBneV9tYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CWJyZWFrOworCWNhc2UgMHgwNDc6IGd5X21hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKKwljYXNlIDB4MDQ5OiBneV9tYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwlicmVhazsKKwljYXNlIDB4MDRhOiBneV9tYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGd5cmF0aW9uX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gZmllbGQtPmhpZGlucHV0LT5pbnB1dDsKKworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfR0VOREVTSyAmJgorCQkJKHVzYWdlLT5oaWQgJiAweGZmKSA9PSAweDgyKSB7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIDEpOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7CisJCWlucHV0X3N5bmMoaW5wdXQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGd5cmF0aW9uX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBneXJhdGlvbl9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGd5cmF0aW9uX2RyaXZlciA9IHsKKwkubmFtZSA9ICJneXJhdGlvbiIsCisJLmlkX3RhYmxlID0gZ3lyYXRpb25fZGV2aWNlcywKKwkuaW5wdXRfbWFwcGluZyA9IGd5cmF0aW9uX2lucHV0X21hcHBpbmcsCisJLmV2ZW50ID0gZ3lyYXRpb25fZXZlbnQsCit9OworCitzdGF0aWMgaW50IGd5cmF0aW9uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmZ3lyYXRpb25fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgZ3lyYXRpb25fZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmZ3lyYXRpb25fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ3lyYXRpb25faW5pdCk7Cittb2R1bGVfZXhpdChneXJhdGlvbl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihneXJhdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhMWJhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqICBVU0IgSElEIHF1aXJrcyBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEhJRF9JRFNfSF9GSUxFCisjZGVmaW5lIEhJRF9JRFNfSF9GSUxFCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BNFRFQ0gJCTB4MDlkYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVCTB4MDAwNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0E0VEVDSF9YNV8wMDVECTB4MDAwYQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUFTSElNQQkJMHgwNmQ2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9HQU1FUEFECTB4MDAyNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FBU0hJTUFfUFJFREFUT1IJMHgwMDI2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQJCTB4MDQ2MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUgkweDAwMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyCTB4MDAwOAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQURTX1RFQ0ggCQkweDA2ZTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BRFNfVEVDSF9SQURJT19TSTQ3MFgJMHhhMTU1CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BRkFURUNICQkweDE1YTQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BRkFURUNIX0FGOTAxNgkweDkwMTYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FJUFRFSwkJMHgwOGNhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzAxCQkweDAwMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMTAJCTB4MDAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMAkJMHgwMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIxCQkweDAwMjEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIJCTB4MDAyMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMwkJMHgwMDIzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0CQkweDAwMjQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FJUkNBQkxFCQkweDE2Q0EKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVJDQUJMRTEJCTB4MTUwMgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUxDT1IJCTB4MDU4ZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FMQ09SX1VTQlJTMjMyCTB4OTcyMAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUxQUwkJMHgwNDMzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfSUJNX0dBTUVQQUQJMHgxMTAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BUFBMRQkJMHgwNWFjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfTUlHSFRZTU9VU0UJMHgwMzA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fQU5TSQkweDAyMGUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9JU08JMHgwMjBmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0FOU0kJMHgwMjE0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0lTTwkweDAyMTUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSklTCTB4MDIxNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfQU5TSQkweDAyMTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0lTTwkweDAyMTgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0pJUwkweDAyMTkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0FOU0kJMHgwMjFhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9JU08JMHgwMjFiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9KSVMJMHgwMjFjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0FOU0kJMHgwMjIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0lTTwkweDAyMjEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSklTCTB4MDIyMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSQkweDAyMjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0lTTwkweDAyMjQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0pJUwkweDAyMjUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0kgICAgMHgwMjI5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9JU08gICAgIDB4MDIyYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSklTICAgICAweDAyMmIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfQU5TSSAgMHgwMjJjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTyAgIDB4MDIyZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19KSVMgICAweDAyMmUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9BTlNJCTB4MDIzMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0lTTwkweDAyMzEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9KSVMJMHgwMjMyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWQkweDAzMGEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIxX1RQX09OTFkJMHgwMzBiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQVRWX0lSQ09OVFJPTAkweDgyNDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9JUkNPTlRST0w0CTB4ODI0MgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVNVUwkJMHgwYjA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVNVU19MQ00JCTB4MTcyNgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVRFTgkJMHgwNTU3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNCTB4MjAwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVCTB4MjIwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fMlBPUlRLVk0JMHgyMjA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTQkweDIyMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQwkweDIyMDgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FWRVJNRURJQQkJMHgwN2NhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVZFUl9GTV9NUjgwMAkweGI4MDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0JSSUdIVAkJMHgxMjQxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyCTB4MTUwMworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVSS1NISVJFCQkweDBjOTgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRAkweDExNDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NIRVJSWQkJMHgwNDZhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OCTB4MDAyMworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hJQwkJMHgwNWZlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ19HQU1FUEFECTB4MDAxNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hJQ09OWQkJMHgwNGYyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQJMHgwNDE4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSURDCQkweDE2NzcKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NNRURJQQkJMHgwZDhjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ00xMDkJCTB4MDAwZQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTCQkweDA3YzAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0ZJUlNUCTB4MTUwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfTEFTVAkweDE1ZmYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NZR05BTAkJMHgxMGM0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lHTkFMX1JBRElPX1NJNDcwWAkweDgxOGEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NZUFJFU1MJCTB4MDRiNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UJMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00JMHg1NTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFCTB4NzQxNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xCTB4ZGU2MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yCTB4ZGU2NAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMTAkJMHg0MTNjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OAkweDIwMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1NLODExNQkweDIxMDUKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFTE9STUUJCTB4MTE2MworI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFIDB4MDEwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMAkweDAyMDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0RNSQkJMHgwYzBiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRE1JX0VOQwkJMHg1ZmFiCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FTE8JCTB4MDRFNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0VMT19UUzI3MDAJMHgwMDIwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FU1NFTlRJQUxfUkVBTElUWQkweDBkN2YKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9FU1NFTlRJQUxfUkVBTElUWV9QNSAweDAxMDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0VaS0VZIAkJMHgwNTE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMJCTB4MDAwMgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfR0FNRVJPTgkJMHgwODEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SCTB4MDAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSAkweDBkZmMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dMQUIJCTB4MDZjMgorI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwCTB4MDAzOAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzMwCTB4MDAzOQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfMF80X0lGX0tJVAkweDAwNDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzE2XzE2X0lGX0tJVAkweDAwNDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF84XzhfOF9JRl9LSVQJMHgwMDQ1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF84XzdfSUZfS0lUCTB4MDA1MQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfOF84X0lGX0tJVAkweDAwNTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QSElER0VUX01PVE9SQ09OVFJPTAkweDAwNTgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dPVE9QCQkweDA4ZjIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TVVBFUl9RMgkJMHgwMDdmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR09HT1BFTgkJMHgwMGNlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEVOUE9XRVIJCTB4MDBmNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfR1JFRU5BU0lBCQkweDBlOGYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dSRVRBR01BQ0JFVEgJMHgwOTcxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1JFVEFHTUFDQkVUSF9IVUVZCTB4MjAwNQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfR1JJRkZJTgkJMHgwNzdkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9XRVJNQVRFCQkweDA0MTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IJCTB4MDRBQQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfR1RDTwkJMHgwNzhjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT185MAkJMHgwMDkwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAJCTB4MDEwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAxCQkweDAxMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMwkJMHgwMTAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQJCTB4MDEwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA1CQkweDAxMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNgkJMHgwMTA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcJCTB4MDEwNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA4CQkweDAxMDgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMAkJMHgwMjAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEJCTB4MDIwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAyCQkweDAyMDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMwkJMHgwMjAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQJCTB4MDIwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA1CQkweDAyMDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNgkJMHgwMjA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcJCTB4MDIwNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAwCQkweDAzMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMQkJMHgwMzAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIJCTB4MDMwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAzCQkweDAzMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNAkJMHgwMzA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUJCTB4MDMwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA2CQkweDAzMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNwkJMHgwMzA3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgJCTB4MDMwOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA5CQkweDAzMDkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMAkJMHgwNDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDEJCTB4MDQwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAyCQkweDA0MDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMwkJMHgwNDAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDQJCTB4MDQwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA1CQkweDA0MDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMAkJMHgwNTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDEJCTB4MDUwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAyCQkweDA1MDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMwkJMHgwNTAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDQJCTB4MDUwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMAkJMHgxMDAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAxCQkweDEwMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIJCTB4MTAwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMwkJMHgxMDAzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA0CQkweDEwMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUJCTB4MTAwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNgkJMHgxMDA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA3CQkweDEwMDcKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dZUkFUSU9OCQkweDBjMTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEUJMHgwMDAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9IQVBQCQkweDA3OGIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VR0NJX0RSSVZJTkcJMHgwMDEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9GTFlJTkcJMHgwMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9GSUdIVElORwkweDAwMzAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0lNQVRJT04JCTB4MDcxOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJU0NfU1RBS0tBCTB4ZDAwMAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfS0JHRUFSCQkweDA4NGUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPCTB4MTAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTEFCVEVDCQkweDEwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MQUJURUNfV0lSRUxFU1NfS0VZQk9BUkQJMHgwMDA2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MRAkJMHgwZjExCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfQ0FTU1kJCTB4MTAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1BPQ0tFVENBU1NZCTB4MTAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX01PQklMRUNBU1NZCTB4MTAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0pXTQkJMHgxMDgwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfRE1NUAkJMHgxMDgxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVU1JUAkJMHgxMDkwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfWFJBWTEJCTB4MTEwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1hSQVkyCQkweDExMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9WSURFT0NPTQkweDEyMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9DT00zTEFCCTB4MjAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1RFTEVQT1JUCTB4MjAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX05FVFdPUktBTkFMWVNFUiAweDIwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9QT1dFUkNPTlRST0wJMHgyMDMwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTUFDSElORVRFU1QJMHgyMDQwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSAkJMHgwNDZkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTFgzCTB4YzA0NAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1YxNTAJMHhjMDQ3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIJMHhjMTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9GSVJTVCAgMHhjMTEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9MQVNUIDB4YzE0ZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRAkweGMyMTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FWFRSRU1FXzNECTB4YzIxNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIJMHhjMjE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEMl8yCTB4YzIxOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJTkdNQU5fRjNECTB4YzI4MworI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0ZPUkNFM0RfUFJPCTB4YzI4NgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMCTB4YzI5NAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwJMHhjMjk1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JECTB4YzMwYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRAkweGMzMTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSCTB4YzUwYworI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMgkweGM1MTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9DT1JETEVTU19ERVNLVE9QX0xYNTAwCTB4YzUxMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUgkweGM1MTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESU5PVk9fREVTS1RPUAkweGM3MDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRQkweGM3MTQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESU5PVk9fTUlOSQkweGM3MWYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMMgkweGNhMDMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01DQwkJMHgwOWRiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUwkweDAwNzYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTIwOExTCTB4MDA3YQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTUdFCQkweDA0NjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NR0VfVVBTCQkweGZmZmYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NR0VfVVBTMQkJMHgwMDAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NSUNST0NISVAJCTB4MDRkOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BJQ0tJVDEJCTB4MDAzMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BJQ0tJVDIJCTB4MDAzMworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZUCQkweDA0NWUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TSURFV0lOREVSX0dWCTB4MDAzYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1dJUkVMRVNTX09QVElDQUxfREVTS1RPUF8zXzAgMHgwMDlkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVNfTkU0SwkJMHgwMGRiCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVNfTEs2SwkJMHgwMGY5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUCTB4MDcwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19VU0IJMHgwNzEzCisKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01PTlRFUkVZCQkweDA1NjYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUJMHgzMDA0CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQ1IJCTB4MDQwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVAkJMHgwMzAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkNSX0xBU1QJCTB4MDNmZgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiAweDA0MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSAgICAgICAweGMzNTkKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX05BVFNVICAgICAgICAgICAgIDB4MDhiNworI2RlZmluZSBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQgICAgIDB4MDAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVDCQkweDA3M2UKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORUNfVVNCX0dBTUVfUEFECTB4MDMwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfT05UUkFLCQkweDBhMDcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwCTB4MDA2NAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOSklUCQkweDEzNGMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JECTB4MDgxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLCTB4MDAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEVUQUxZTlgJCTB4MThiMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUJMHgwMDM3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NCTB4MGI0MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJCTB4MDAwMworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FJVEVLCQkweDA2YTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFECTB4ZmYxNworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FNU1VORwkJMHgwNDE5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUJMHgwMDAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT05ZCQkJMHgwNTRjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUgkweDAyNjgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgJMHgxNWMyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRAkweDAwMzgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TT1VOREdSQVBIX0lNT05fTENEMgkweDAwMzYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TT1VOREdSQVBIX0lNT05fTENEMwkweDAwMzQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfU1VOUExVUwkJMHgwNGZjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUAkweDA1ZDgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1RFTlgJCTB4MTEzMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RFTlhfSUJVRERZMQkweDAwMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9URU5YX0lCVUREWTIJMHgwMDAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIJMHgwNDRmCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UT1BNQVgJCTB4MDY2MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1RPUE1BWF9DT0JSQVBBRAkweDAxMDMKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1RVUkJPWAkJMHgwNjJhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJECTB4MDIwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVkVSTklFUgkJMHgwOGY3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8JMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAJMHgwMDAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xDU1BFQwkweDAwMDYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCQkweDA1NmEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUAkJMHgwOTI1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMjAJMHg4MTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAJMHg4MTA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfOF84XzRfSUZfS0lUCTB4ODIwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1FVQURfVVNCX0pPWVBBRAkweDg4MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9EVUFMX1VTQl9KT1lQQUQJMHg4ODY2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFRECTB4NjY2NgorI2RlZmluZSBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQyCTB4NjY3NworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NNQVJUSk9ZX0RVQUxfUExVUyAweDg4MDIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1lFQUxJTksJCTB4Njk5MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMksJMHhiMDAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9aRVJPUExVUwkJMHgwYzEyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9LWUUJCTB4MDQ1OAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0tZRV9HUEVOXzU2MAkweDUwMDMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQtcXVpcmtzLmMgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQtcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZmVlYTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LXF1aXJrcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qCi0gKiAgSElELWlucHV0IHVzYWdlIG1hcHBpbmcgcXVpcmtzCi0gKgotICogIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgSElELWlucHV0IG1hcHBpbmdzIGZvciBkZXZpY2VzIHZpb2xhdGluZwotICogIEhVVCAxLjEyIHNwZWNpZmljYXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmlyaSBLb3NpbmEKLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGlkLmg+Ci0KLSNkZWZpbmUgbWFwX2FicyhjKSAgICAgIGRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0FCUzsgKmJpdCA9IGlucHV0LT5hYnNiaXQ7ICptYXggPSBBQlNfTUFYOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfcmVsKGMpICAgICAgZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfUkVMOyAqYml0ID0gaW5wdXQtPnJlbGJpdDsgKm1heCA9IFJFTF9NQVg7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9rZXkoYykgICAgICBkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9LRVk7ICpiaXQgPSBpbnB1dC0+a2V5Yml0OyAqbWF4ID0gS0VZX01BWDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX2xlZChjKSAgICAgIGRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0xFRDsgKmJpdCA9IGlucHV0LT5sZWRiaXQ7ICptYXggPSBMRURfTUFYOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIG1hcF9hYnNfY2xlYXIoYykgICAgICAgIGRvIHsgbWFwX2FicyhjKTsgY2xlYXJfYml0KGMsICpiaXQpOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfa2V5X2NsZWFyKGMpICAgICAgICBkbyB7IG1hcF9rZXkoYyk7IGNsZWFyX2JpdChjLCAqYml0KTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBxdWlya19iZWxraW5fd2tiZChzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4MDNhOiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKLQkJY2FzZSAweDAzYjogbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOwotCQljYXNlIDB4MDNjOiBtYXBfa2V5X2NsZWFyKEtFWV9ET0NVTUVOVFMpOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19jaGVycnlfY3ltb3Rpb24oc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJY2FzZSAweDMwMTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzEpOwkJYnJlYWs7Ci0JCWNhc2UgMHgzMDI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOwotCQljYXNlIDB4MzAzOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19sb2dpdGVjaF91bHRyYXhfcmVtb3RlKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTE9HSVZFTkRPUikKLQkJcmV0dXJuIDA7Ci0KLQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKLQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkvKiBSZXBvcnRlZCBvbiBMb2dpdGVjaCBVbHRyYSBYIE1lZGlhIFJlbW90ZSAqLwotCQljYXNlIDB4MDA0OiBtYXBfa2V5X2NsZWFyKEtFWV9BR0FJTik7CQlicmVhazsKLQkJY2FzZSAweDAwZDogbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKLQkJY2FzZSAweDAyNDogbWFwX2tleV9jbGVhcihLRVlfU0hVRkZMRSk7CQlicmVhazsKLQkJY2FzZSAweDAyNTogbWFwX2tleV9jbGVhcihLRVlfVFYpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMjY6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMzE6IG1hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsJCWJyZWFrOwotCQljYXNlIDB4MDMyOiBtYXBfa2V5X2NsZWFyKEtFWV9URVhUKTsJCWJyZWFrOwotCQljYXNlIDB4MDMzOiBtYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOwotCQljYXNlIDB4MDQ3OiBtYXBfa2V5X2NsZWFyKEtFWV9NUDMpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNDg6IG1hcF9rZXlfY2xlYXIoS0VZX0RWRCk7CQlicmVhazsKLQkJY2FzZSAweDA0OTogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNGE6IG1hcF9rZXlfY2xlYXIoS0VZX1ZJREVPKTsJCWJyZWFrOwotCQljYXNlIDB4MDRiOiBtYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CQlicmVhazsKLQkJY2FzZSAweDA0YzogbWFwX2tleV9jbGVhcihLRVlfTEFOR1VBR0UpOwlicmVhazsKLQkJY2FzZSAweDA0ZDogbWFwX2tleV9jbGVhcihLRVlfU1VCVElUTEUpOwlicmVhazsKLQkJY2FzZSAweDA1MTogbWFwX2tleV9jbGVhcihLRVlfUkVEKTsJCWJyZWFrOwotCQljYXNlIDB4MDUyOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX2d5cmF0aW9uX3JlbW90ZShzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0xPR0lWRU5ET1IpCi0JCXJldHVybiAwOwotCi0Jc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0Jc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJLyogUmVwb3J0ZWQgb24gR3lyYXRpb24gTUNFIFJlbW90ZSAqLwotCQljYXNlIDB4MDBkOiBtYXBfa2V5X2NsZWFyKEtFWV9IT01FKTsJCWJyZWFrOwotCQljYXNlIDB4MDI0OiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwMjU6IG1hcF9rZXlfY2xlYXIoS0VZX1BWUik7CQlicmVhazsKLQkJY2FzZSAweDA0NjogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7Ci0JCWNhc2UgMHgwNDc6IG1hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKLQkJY2FzZSAweDA0OTogbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOwotCQljYXNlIDB4MDRhOiBtYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX2NoaWNvbnlfdGFjdGljYWxfcGFkKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCi0JCXJldHVybiAwOwotCi0Jc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0Jc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCWNhc2UgMHhmZjAxOiBtYXBfa2V5X2NsZWFyKEJUTl8xKTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwMjogbWFwX2tleV9jbGVhcihCVE5fMik7CQlicmVhazsKLQkJY2FzZSAweGZmMDM6IG1hcF9rZXlfY2xlYXIoQlROXzMpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjA0OiBtYXBfa2V5X2NsZWFyKEJUTl80KTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwNTogbWFwX2tleV9jbGVhcihCVE5fNSk7CQlicmVhazsKLQkJY2FzZSAweGZmMDY6IG1hcF9rZXlfY2xlYXIoQlROXzYpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjA3OiBtYXBfa2V5X2NsZWFyKEJUTl83KTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwODogbWFwX2tleV9jbGVhcihCVE5fOCk7CQlicmVhazsKLQkJY2FzZSAweGZmMDk6IG1hcF9rZXlfY2xlYXIoQlROXzkpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZjBhOiBtYXBfa2V5X2NsZWFyKEJUTl9BKTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwYjogbWFwX2tleV9jbGVhcihCVE5fQik7CQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19taWNyb3NvZnRfZXJnb25vbXlfa2Ioc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9NU1ZFTkRPUikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4ZmQwNjogbWFwX2tleV9jbGVhcihLRVlfQ0hBVCk7CQlicmVhazsKLQkJY2FzZSAweGZkMDc6IG1hcF9rZXlfY2xlYXIoS0VZX1BIT05FKTsJCWJyZWFrOwotCQljYXNlIDB4ZmYwNToKLQkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCQkJbWFwX2tleV9jbGVhcihLRVlfRjEzKTsKLQkJCXNldF9iaXQoS0VZX0YxNCwgaW5wdXQtPmtleWJpdCk7Ci0JCQlzZXRfYml0KEtFWV9GMTUsIGlucHV0LT5rZXliaXQpOwotCQkJc2V0X2JpdChLRVlfRjE2LCBpbnB1dC0+a2V5Yml0KTsKLQkJCXNldF9iaXQoS0VZX0YxNywgaW5wdXQtPmtleWJpdCk7Ci0JCQlzZXRfYml0KEtFWV9GMTgsIGlucHV0LT5rZXliaXQpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX21pY3Jvc29mdF9wcmVzZW50ZXJfOGsoc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCi17Ci0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9NU1ZFTkRPUikKLQkJcmV0dXJuIDA7Ci0KLQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKLQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4ZmQwODogbWFwX2tleV9jbGVhcihLRVlfRk9SV0FSRCk7CWJyZWFrOwotCQljYXNlIDB4ZmQwOTogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKLQkJY2FzZSAweGZkMGI6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlQQVVTRSk7CWJyZWFrOwotCQljYXNlIDB4ZmQwZTogbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwkJYnJlYWs7Ci0JCWNhc2UgMHhmZDBmOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZKTsJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX3BldGFseW54X3JlbW90ZShzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9MT0dJVkVORE9SKSAmJgotCQkJKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikpCi0JCXJldHVybiAwOwotCi0JaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpID09IEhJRF9VUF9MT0dJVkVORE9SKQotCQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJY2FzZSAweDA1YTogbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKLQkJCWNhc2UgMHgwNWI6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKLQkJCWNhc2UgMHgwNWM6IG1hcF9rZXlfY2xlYXIoS0VZX0dSRUVOKTsJCWJyZWFrOwotCQkJY2FzZSAweDA1ZDogbWFwX2tleV9jbGVhcihLRVlfWUVMTE9XKTsJCWJyZWFrOwotCQkJY2FzZSAweDA1ZTogbWFwX2tleV9jbGVhcihLRVlfQkxVRSk7CQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIDA7Ci0JCX0KLQotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfQ09OU1VNRVIpCi0JCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCQljYXNlIDB4MGY2OiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUKTsgICAgICAgICAgICBicmVhazsKLQkJCWNhc2UgMHgwZmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JBQ0spOyAgICAgICAgICAgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gMDsKLQkJfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX2xvZ2l0ZWNoX3dpcmVsZXNzKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQ09OU1VNRVIpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCWNhc2UgMHgxMDAxOiBtYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwlicmVhazsKLQkJY2FzZSAweDEwMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOwotCQljYXNlIDB4MTAwNDogbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDA1OiBtYXBfa2V5X2NsZWFyKEtFWV9BVURJTyk7CQlicmVhazsKLQkJY2FzZSAweDEwMGE6IG1hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7CWJyZWFrOwotCQljYXNlIDB4MTAxMTogbWFwX2tleV9jbGVhcihLRVlfUFJFVklPVVNTT05HKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDEyOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CWJyZWFrOwotCQljYXNlIDB4MTAxMzogbWFwX2tleV9jbGVhcihLRVlfQ0FNRVJBKTsJCWJyZWFrOwotCQljYXNlIDB4MTAxNDogbWFwX2tleV9jbGVhcihLRVlfTUVTU0VOR0VSKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDE1OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDE2OiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZRVIpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDE3OiBtYXBfa2V5X2NsZWFyKEtFWV9FSkVDVENEKTsJYnJlYWs7Ci0JCWNhc2UgMHgxMDE4OiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CQlicmVhazsKLQkJY2FzZSAweDEwMTk6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJCWJyZWFrOwotCQljYXNlIDB4MTAxYTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDFiOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKLQkJY2FzZSAweDEwMWY6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01JTik7CQlicmVhazsKLQkJY2FzZSAweDEwMjA6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01PVVQpOwlicmVhazsKLQkJY2FzZSAweDEwMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01SRVNFVCk7CWJyZWFrOwotCQljYXNlIDB4MTAyMzogbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDI3OiBtYXBfa2V5X2NsZWFyKEtFWV9NRU5VKTsJCWJyZWFrOwotCQkvKiB0aGlzIG9uZSBpcyBtYXJrZWQgYXMgJ1JvdGF0ZScgKi8KLQkJY2FzZSAweDEwMjg6IG1hcF9rZXlfY2xlYXIoS0VZX0FOR0xFKTsJCWJyZWFrOwotCQljYXNlIDB4MTAyOTogbWFwX2tleV9jbGVhcihLRVlfU0hVRkZMRSk7CWJyZWFrOwotCQljYXNlIDB4MTAyYTogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKLQkJY2FzZSAweDEwMmI6IG1hcF9rZXlfY2xlYXIoS0VZX0NZQ0xFV0lORE9XUyk7CWJyZWFrOwotCQljYXNlIDB4MTA0MTogbWFwX2tleV9jbGVhcihLRVlfQkFUVEVSWSk7CWJyZWFrOwotCQljYXNlIDB4MTA0MjogbWFwX2tleV9jbGVhcihLRVlfV09SRFBST0NFU1NPUik7CWJyZWFrOwotCQljYXNlIDB4MTA0MzogbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwlicmVhazsKLQkJY2FzZSAweDEwNDQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVNFTlRBVElPTik7CWJyZWFrOwotCQljYXNlIDB4MTA0NTogbWFwX2tleV9jbGVhcihLRVlfVU5ETyk7CQlicmVhazsKLQkJY2FzZSAweDEwNDY6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDQ3OiBtYXBfa2V5X2NsZWFyKEtFWV9QUklOVCk7CQlicmVhazsKLQkJY2FzZSAweDEwNDg6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVkUpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDQ5OiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKLQkJY2FzZSAweDEwNGE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOwotCQljYXNlIDB4MTA0YjogbWFwX2tleV9jbGVhcihLRVlfUFJPRzMpOwkJYnJlYWs7Ci0JCWNhc2UgMHgxMDRjOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HNCk7CQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHF1aXJrX2NoZXJyeV9nZW5pdXNfMjllKHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQotewotCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQ09OU1VNRVIpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCWNhc2UgMHgxNTY6IG1hcF9rZXlfY2xlYXIoS0VZX1dPUkRQUk9DRVNTT1IpOwlicmVhazsKLQkJY2FzZSAweDE1NzogbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwlicmVhazsKLQkJY2FzZSAweDE1ODogbWFwX2tleV9jbGVhcihLRVlfUFJFU0VOVEFUSU9OKTsJYnJlYWs7Ci0JCWNhc2UgMHgxNWM6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBxdWlya19idGNfODE5MyhzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4MjMwOiBtYXBfa2V5KEJUTl9NT1VTRSk7CQkJYnJlYWs7Ci0JCWNhc2UgMHgyMzE6IG1hcF9yZWwoUkVMX1dIRUVMKTsJCQlicmVhazsKLQkJLyogCi0JCSAqIHRoaXMga2V5Ym9hcmQgaGFzIGEgc2Nyb2xsd2hlZWwgaW1wbGVtZW50ZWQgaW4KLQkJICogdG90YWxseSBicm9rZW4gd2F5LiBXZSBtYXAgdGhpcyB1c2FnZSB0ZW1wb3JhcmlseQotCQkgKiB0byBIV0hFRUwgYW5kIGhhbmRsZSBpdCBpbiB0aGUgZXZlbnQgcXVpcmsgaGFuZGxlcgotCQkgKi8KLQkJY2FzZSAweDIzMjogbWFwX3JlbChSRUxfSFdIRUVMKTsJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcXVpcmtfc3VucGx1c193ZGVza3RvcChzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQljYXNlIDB4MjAwMzogbWFwX2tleV9jbGVhcihLRVlfWk9PTUlOKTsJCWJyZWFrOwotCQljYXNlIDB4MjEwMzogbWFwX2tleV9jbGVhcihLRVlfWk9PTU9VVCk7CWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIFZFTkRPUl9JRF9CRUxLSU4JCQkweDEwMjAKLSNkZWZpbmUgREVWSUNFX0lEX0JFTEtJTl9XSVJFTEVTU19LRVlCT0FSRAkweDAwMDYKLQotI2RlZmluZSBWRU5ET1JfSURfQ0hFUlJZCQkJMHgwNDZhCi0jZGVmaW5lIERFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04JCTB4MDAyMwotCi0jZGVmaW5lIFZFTkRPUl9JRF9DSElDT05ZCQkJMHgwNGYyCi0jZGVmaW5lIERFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRAkJMHgwNDE4Ci0KLSNkZWZpbmUgVkVORE9SX0lEX0VaS0VZCQkJCTB4MDUxOAotI2RlZmluZSBERVZJQ0VfSURfQlRDXzgxOTMJCQkweDAwMDIKLQotI2RlZmluZSBWRU5ET1JfSURfR1lSQVRJT04JCQkweDBjMTYKLSNkZWZpbmUgREVWSUNFX0lEX0dZUkFUSU9OX1JFTU9URQkJMHgwMDAyCi0KLSNkZWZpbmUgVkVORE9SX0lEX0xPR0lURUNICQkJMHgwNDZkCi0jZGVmaW5lIERFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUgkJMHhjMTAxCi0jZGVmaW5lIERFVklDRV9JRF9TNTEwX1JFQ0VJVkVSCQkJMHhjNTBjCi0jZGVmaW5lIERFVklDRV9JRF9TNTEwX1JFQ0VJVkVSXzIJCTB4YzUxNwotI2RlZmluZSBERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSCQkweGM1MTMKLQotI2RlZmluZSBWRU5ET1JfSURfTUlDUk9TT0ZUCQkJMHgwNDVlCi0jZGVmaW5lIERFVklDRV9JRF9NUzRLCQkJCTB4MDBkYgotI2RlZmluZSBERVZJQ0VfSURfTVM2SwkJCQkweDAwZjkKLSNkZWZpbmUgREVWSUNFX0lTX01TX1BSRVNFTlRFUl84S19CVAkJMHgwNzAxCi0jZGVmaW5lIERFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfVVNCCQkweDA3MTMKLQotI2RlZmluZSBWRU5ET1JfSURfTU9OVEVSRVkJCQkweDA1NjYKLSNkZWZpbmUgREVWSUNFX0lEX0dFTklVU19LQjI5RQkJCTB4MzAwNAotCi0jZGVmaW5lIFZFTkRPUl9JRF9QRVRBTFlOWAkJCTB4MThiMQotI2RlZmluZSBERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URQkweDAwMzcKLQotI2RlZmluZSBWRU5ET1JfSURfU1VOUExVUwkJCTB4MDRmYwotI2RlZmluZSBERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUAkJMHgwNWQ4Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2lucHV0X2JsYWNrbGlzdCB7Ci0JX191MTYgaWRWZW5kb3I7Ci0JX191MTYgaWRQcm9kdWN0OwotCWludCAoKnF1aXJrKShzdHJ1Y3QgaGlkX3VzYWdlICosIHN0cnVjdCBpbnB1dF9kZXYgKiwgdW5zaWduZWQgbG9uZyAqKiwgaW50ICopOwotfSBoaWRfaW5wdXRfYmxhY2tsaXN0W10gPSB7Ci0JeyBWRU5ET1JfSURfQkVMS0lOLCBERVZJQ0VfSURfQkVMS0lOX1dJUkVMRVNTX0tFWUJPQVJELCBxdWlya19iZWxraW5fd2tiZCB9LAotCi0JeyBWRU5ET1JfSURfQ0hFUlJZLCBERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OLCBxdWlya19jaGVycnlfY3ltb3Rpb24gfSwKLQotCXsgVkVORE9SX0lEX0NISUNPTlksIERFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRCwgcXVpcmtfY2hpY29ueV90YWN0aWNhbF9wYWQgfSwKLQotCXsgVkVORE9SX0lEX0VaS0VZLCBERVZJQ0VfSURfQlRDXzgxOTMsIHF1aXJrX2J0Y184MTkzIH0sCi0KLQl7IFZFTkRPUl9JRF9HWVJBVElPTiwgREVWSUNFX0lEX0dZUkFUSU9OX1JFTU9URSwgcXVpcmtfZ3lyYXRpb25fcmVtb3RlIH0sCi0KLQl7IFZFTkRPUl9JRF9MT0dJVEVDSCwgREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSLCBxdWlya19sb2dpdGVjaF91bHRyYXhfcmVtb3RlIH0sCi0JeyBWRU5ET1JfSURfTE9HSVRFQ0gsIERFVklDRV9JRF9TNTEwX1JFQ0VJVkVSLCBxdWlya19sb2dpdGVjaF93aXJlbGVzcyB9LAotCXsgVkVORE9SX0lEX0xPR0lURUNILCBERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yLCBxdWlya19sb2dpdGVjaF93aXJlbGVzcyB9LAotCXsgVkVORE9SX0lEX0xPR0lURUNILCBERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSLCBxdWlya19sb2dpdGVjaF93aXJlbGVzcyB9LAotCi0JeyBWRU5ET1JfSURfTUlDUk9TT0ZULCBERVZJQ0VfSURfTVM0SywgcXVpcmtfbWljcm9zb2Z0X2VyZ29ub215X2tiIH0sCi0JeyBWRU5ET1JfSURfTUlDUk9TT0ZULCBERVZJQ0VfSURfTVM2SywgcXVpcmtfbWljcm9zb2Z0X2VyZ29ub215X2tiIH0sCi0JeyBWRU5ET1JfSURfTUlDUk9TT0ZULCBERVZJQ0VfSVNfTVNfUFJFU0VOVEVSXzhLX0JULCBxdWlya19taWNyb3NvZnRfcHJlc2VudGVyXzhrIH0sCi0JeyBWRU5ET1JfSURfTUlDUk9TT0ZULCBERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQiwgcXVpcmtfbWljcm9zb2Z0X3ByZXNlbnRlcl84ayB9LAotCi0JeyBWRU5ET1JfSURfTU9OVEVSRVksIERFVklDRV9JRF9HRU5JVVNfS0IyOUUsIHF1aXJrX2NoZXJyeV9nZW5pdXNfMjllIH0sCi0KLQl7IFZFTkRPUl9JRF9QRVRBTFlOWCwgREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUsIHF1aXJrX3BldGFseW54X3JlbW90ZSB9LAotCi0JeyBWRU5ET1JfSURfU1VOUExVUywgREVWSUNFX0lEX1NVTlBMVVNfV0RFU0tUT1AsIHF1aXJrX3N1bnBsdXNfd2Rlc2t0b3AgfSwKLQotCXsgMCwgMCwgTlVMTCB9Ci19OwotCi1pbnQgaGlkaW5wdXRfbWFwcGluZ19xdWlya3Moc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIAotCQkJCSAgIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LCAKLQkJCQkgICB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKLXsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOwotCWludCBpID0gMDsKLQkKLQl3aGlsZSAoaGlkX2lucHV0X2JsYWNrbGlzdFtpXS5xdWlyaykgewotCQlpZiAoaGlkX2lucHV0X2JsYWNrbGlzdFtpXS5pZFZlbmRvciA9PSBkZXZpY2UtPnZlbmRvciAmJgotCQkJCWhpZF9pbnB1dF9ibGFja2xpc3RbaV0uaWRQcm9kdWN0ID09IGRldmljZS0+cHJvZHVjdCkKLQkJCXJldHVybiBoaWRfaW5wdXRfYmxhY2tsaXN0W2ldLnF1aXJrKHVzYWdlLCBpbnB1dCwgYml0LCBtYXgpOwotCQlpKys7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgaGlkaW5wdXRfZXZlbnRfcXVpcmtzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCi17Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0KLQlpbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7Ci0KLQlpZiAoKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKLQkJfHwgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpIHsKLQkJaWYgKHZhbHVlKSBoaWQtPnF1aXJrcyB8PSAgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OOwotCQllbHNlICAgICAgIGhpZC0+cXVpcmtzICY9IH5ISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT047Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfQjgpICYmCi0JCQkodXNhZ2UtPnR5cGUgPT0gRVZfUkVMKSAmJgotCQkJKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpIHsKLQkJaGlkLT5kZWxheWVkX3ZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfQjgpICYmCi0JCQkodXNhZ2UtPmhpZCA9PSAweDAwMDEwMGI4KSkgewotCQlpbnB1dF9ldmVudChpbnB1dCwgRVZfUkVMLCB2YWx1ZSA/IFJFTF9IV0hFRUwgOiBSRUxfV0hFRUwsIGhpZC0+ZGVsYXllZF92YWx1ZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfSU5WRVJUX0hXSEVFTCkgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9IV0hFRUwpKSB7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIC12YWx1ZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04pICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpKSB7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgUkVMX0hXSEVFTCwgdmFsdWUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX0hBU19GTikgJiYgaGlkaW5wdXRfYXBwbGVfZXZlbnQoaGlkLCBpbnB1dCwgdXNhZ2UsIHZhbHVlKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBIYW5kbGluZyBNUyBrZXlib2FyZHMgc3BlY2lhbCBidXR0b25zICovCi0JaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX01JQ1JPU09GVF9LRVlTICYmIAotCQkJdXNhZ2UtPmhpZCA9PSAoSElEX1VQX01TVkVORE9SIHwgMHhmZjA1KSkgewotCQlpbnQga2V5ID0gMDsKLQkJc3RhdGljIGludCBsYXN0X2tleSA9IDA7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgMHgwMToga2V5ID0gS0VZX0YxNDsgYnJlYWs7Ci0JCQljYXNlIDB4MDI6IGtleSA9IEtFWV9GMTU7IGJyZWFrOwotCQkJY2FzZSAweDA0OiBrZXkgPSBLRVlfRjE2OyBicmVhazsKLQkJCWNhc2UgMHgwODoga2V5ID0gS0VZX0YxNzsgYnJlYWs7Ci0JCQljYXNlIDB4MTA6IGtleSA9IEtFWV9GMTg7IGJyZWFrOwotCQkJZGVmYXVsdDogYnJlYWs7Ci0JCX0KLQkJaWYgKGtleSkgewotCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBrZXksIDEpOwotCQkJbGFzdF9rZXkgPSBrZXk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIGxhc3Rfa2V5LCAwKTsKLQkJfQotCX0KLQotCS8qIGhhbmRsZSB0aGUgdGVtcG9yYXJ5IHF1aXJreSBtYXBwaW5nIHRvIEhXSEVFTCAqLwotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19IV0hFRUxfV0hFRUxfSU5WRVJUICYmCi0JCQl1c2FnZS0+dHlwZSA9PSBFVl9SRUwgJiYgdXNhZ2UtPmNvZGUgPT0gUkVMX0hXSEVFTCkgewotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIFJFTF9XSEVFTCwgLXZhbHVlKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogR3lyYXRpb24gTUNFIHJlbW90ZSAiU2xlZXAiIGtleSAqLwotCWlmIChoaWQtPnZlbmRvciA9PSBWRU5ET1JfSURfR1lSQVRJT04gJiYKLQkgICAgaGlkLT5wcm9kdWN0ID09IERFVklDRV9JRF9HWVJBVElPTl9SRU1PVEUgJiYKLQkgICAgKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0dFTkRFU0sgJiYKLQkgICAgKHVzYWdlLT5oaWQgJiAweGZmKSA9PSAweDgyKSB7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIDEpOwotCQlpbnB1dF9zeW5jKGlucHV0KTsKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7Ci0JCWlucHV0X3N5bmMoaW5wdXQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwppbmRleCAxYjJlOGRjLi43ZjE4M2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwpAQCAtMzIsMTEgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQtZGVidWcuaD4KIAotc3RhdGljIGludCBoaWRfYXBwbGVfZm5tb2RlID0gMTsKLW1vZHVsZV9wYXJhbV9uYW1lZChwYl9mbm1vZGUsIGhpZF9hcHBsZV9mbm1vZGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBiX2ZubW9kZSwKLQkJIk1vZGUgb2YgZm4ga2V5IG9uIEFwcGxlIGtleWJvYXJkcyAoMCA9IGRpc2FibGVkLCAxID0gZmtleXNsYXN0LCAyID0gZmtleXNmaXJzdCkiKTsKLQogI2RlZmluZSB1bmsJS0VZX1VOS05PV04KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaGlkX2tleWJvYXJkWzI1Nl0gPSB7CkBAIC01OCwyMjcgKzUzLDIwIEBACiAJMTUwLDE1OCwxNTksMTI4LDEzNiwxNzcsMTc4LDE3NiwxNDIsMTUyLDE3MywxNDAsdW5rLHVuayx1bmssdW5rCiB9OwogCi0vKiBleHRlbmRlZCBtYXBwaW5nIGZvciBjZXJ0YWluIExvZ2l0ZWNoIGhhcmR3YXJlIChMb2dpdGVjaCBjb3JkbGVzcyBkZXNrdG9wIExYNTAwKSAqLwotI2RlZmluZSBMT0dJVEVDSF9FWFBBTkRFRF9LRVlNQVBfU0laRSA4MAotc3RhdGljIGludCBsb2dpdGVjaF9leHBhbmRlZF9rZXltYXBbTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQX1NJWkVdID0gewotCSAgMCwyMTYsICAwLDIxMywxNzUsMTU2LCAgMCwgIDAsICAwLCAgMCwKLQkxNDQsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwyMTIsCi0JMTc0LDE2NywxNTIsMTYxLDExMiwgIDAsICAwLCAgMCwxNTQsICAwLAotCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCSAgMCwgIDAsICAwLCAgMCwgIDAsMTgzLDE4NCwxODUsMTg2LDE4NywKLQkxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsICAwLCAgMCwgIDAKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCV9fczMyIHg7CiAJX19zMzIgeTsKIH0gIGhpZF9oYXRfdG9fYXhpc1tdID0ge3sgMCwgMH0sIHsgMCwtMX0sIHsgMSwtMX0sIHsgMSwgMH0sIHsgMSwgMX0sIHsgMCwgMX0sIHstMSwgMX0sIHstMSwgMH0sIHstMSwtMX19OwogCi0jZGVmaW5lIG1hcF9hYnMoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfQUJTOyBiaXQgPSBpbnB1dC0+YWJzYml0OyBtYXggPSBBQlNfTUFYOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfcmVsKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX1JFTDsgYml0ID0gaW5wdXQtPnJlbGJpdDsgbWF4ID0gUkVMX01BWDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX2tleShjKQlkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9LRVk7IGJpdCA9IGlucHV0LT5rZXliaXQ7IG1heCA9IEtFWV9NQVg7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9sZWQoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfTEVEOyBiaXQgPSBpbnB1dC0+bGVkYml0OyBtYXggPSBMRURfTUFYOyB9IHdoaWxlICgwKQorI2RlZmluZSBtYXBfYWJzKGMpCWhpZF9tYXBfdXNhZ2UoaGlkaW5wdXQsIHVzYWdlLCAmYml0LCAmbWF4LCBFVl9BQlMsIChjKSkKKyNkZWZpbmUgbWFwX3JlbChjKQloaWRfbWFwX3VzYWdlKGhpZGlucHV0LCB1c2FnZSwgJmJpdCwgJm1heCwgRVZfUkVMLCAoYykpCisjZGVmaW5lIG1hcF9rZXkoYykJaGlkX21hcF91c2FnZShoaWRpbnB1dCwgdXNhZ2UsICZiaXQsICZtYXgsIEVWX0tFWSwgKGMpKQorI2RlZmluZSBtYXBfbGVkKGMpCWhpZF9tYXBfdXNhZ2UoaGlkaW5wdXQsIHVzYWdlLCAmYml0LCAmbWF4LCBFVl9MRUQsIChjKSkKIAotI2RlZmluZSBtYXBfYWJzX2NsZWFyKGMpCWRvIHsgbWFwX2FicyhjKTsgY2xlYXJfYml0KGMsIGJpdCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9rZXlfY2xlYXIoYykJZG8geyBtYXBfa2V5KGMpOyBjbGVhcl9iaXQoYywgYml0KTsgfSB3aGlsZSAoMCkKLQotI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCi0KLXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gewotCXUxNiBmcm9tOwotCXUxNiB0bzsKLQl1OCBmbGFnczsKLX07Ci0KLSNkZWZpbmUgQVBQTEVfRkxBR19GS0VZIDB4MDEKLQotc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gYXBwbGVfZm5fa2V5c1tdID0gewotCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAotCXsgS0VZX0YxLCAgICAgICBLRVlfQlJJR0hUTkVTU0RPV04sIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YyLCAgICAgICBLRVlfQlJJR0hUTkVTU1VQLCAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YzLCAgICAgICBLRVlfRk5fRjUsICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LCAvKiBFeHBvc+kgKi8KLQl7IEtFWV9GNCwgICAgICAgS0VZX0ZOX0Y0LCAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwgLyogRGFzaGJvYXJkICovCi0JeyBLRVlfRjUsICAgICAgIEtFWV9LQkRJTExVTURPV04sICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjYsICAgICAgIEtFWV9LQkRJTExVTVVQLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjcsICAgICAgIEtFWV9QUkVWSU9VU1NPTkcsICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjgsICAgICAgIEtFWV9QTEFZUEFVU0UsICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjksICAgICAgIEtFWV9ORVhUU09ORywgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjEwLCAgICAgIEtFWV9NVVRFLCAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjExLCAgICAgIEtFWV9WT0xVTUVET1dOLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjEyLCAgICAgIEtFWV9WT0xVTUVVUCwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfVVAsICAgICAgIEtFWV9QQUdFVVAgfSwKLQl7IEtFWV9ET1dOLCAgICAgS0VZX1BBR0VET1dOIH0sCi0JeyBLRVlfTEVGVCwgICAgIEtFWV9IT01FIH0sCi0JeyBLRVlfUklHSFQsICAgIEtFWV9FTkQgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHBvd2VyYm9va19mbl9rZXlzW10gPSB7Ci0JeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCi0JeyBLRVlfRjEsICAgICAgIEtFWV9CUklHSFRORVNTRE9XTiwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YyLCAgICAgICBLRVlfQlJJR0hUTkVTU1VQLCAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GMywgICAgICAgS0VZX01VVEUsICAgICAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjQsICAgICAgIEtFWV9WT0xVTUVET1dOLCAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y1LCAgICAgICBLRVlfVk9MVU1FVVAsICAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GNiwgICAgICAgS0VZX05VTUxPQ0ssICAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjcsICAgICAgIEtFWV9TV0lUQ0hWSURFT01PREUsICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y4LCAgICAgICBLRVlfS0JESUxMVU1UT0dHTEUsICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GOSwgICAgICAgS0VZX0tCRElMTFVNRE9XTiwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjEwLCAgICAgIEtFWV9LQkRJTExVTVVQLCAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAotCXsgS0VZX1VQLCAgICAgICBLRVlfUEFHRVVQIH0sCi0JeyBLRVlfRE9XTiwgICAgIEtFWV9QQUdFRE9XTiB9LAotCXsgS0VZX0xFRlQsICAgICBLRVlfSE9NRSB9LAotCXsgS0VZX1JJR0hULCAgICBLRVlfRU5EIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfbnVtbG9ja19rZXlzW10gPSB7Ci0JeyBLRVlfSiwgICAgICAgIEtFWV9LUDEgfSwKLQl7IEtFWV9LLCAgICAgICAgS0VZX0tQMiB9LAotCXsgS0VZX0wsICAgICAgICBLRVlfS1AzIH0sCi0JeyBLRVlfVSwgICAgICAgIEtFWV9LUDQgfSwKLQl7IEtFWV9JLCAgICAgICAgS0VZX0tQNSB9LAotCXsgS0VZX08sICAgICAgICBLRVlfS1A2IH0sCi0JeyBLRVlfNywgICAgICAgIEtFWV9LUDcgfSwKLQl7IEtFWV84LCAgICAgICAgS0VZX0tQOCB9LAotCXsgS0VZXzksICAgICAgICBLRVlfS1A5IH0sCi0JeyBLRVlfTSwgICAgICAgIEtFWV9LUDAgfSwKLQl7IEtFWV9ET1QsICAgICAgS0VZX0tQRE9UIH0sCi0JeyBLRVlfU0xBU0gsICAgIEtFWV9LUFBMVVMgfSwKLQl7IEtFWV9TRU1JQ09MT04sIEtFWV9LUE1JTlVTIH0sCi0JeyBLRVlfUCwgICAgICAgIEtFWV9LUEFTVEVSSVNLIH0sCi0JeyBLRVlfTUlOVVMsICAgIEtFWV9LUEVRVUFMIH0sCi0JeyBLRVlfMCwgICAgICAgIEtFWV9LUFNMQVNIIH0sCi0JeyBLRVlfRjYsICAgICAgIEtFWV9OVU1MT0NLIH0sCi0JeyBLRVlfS1BFTlRFUiwgIEtFWV9LUEVOVEVSIH0sCi0JeyBLRVlfQkFDS1NQQUNFLCBLRVlfQkFDS1NQQUNFIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBhcHBsZV9pc29fa2V5Ym9hcmRbXSA9IHsKLQl7IEtFWV9HUkFWRSwgICAgS0VZXzEwMk5EIH0sCi0JeyBLRVlfMTAyTkQsICAgIEtFWV9HUkFWRSB9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKmZpbmRfdHJhbnNsYXRpb24oc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdGFibGUsIHUxNiBmcm9tKQotewotCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOwotCi0JLyogTG9vayBmb3IgdGhlIHRyYW5zbGF0aW9uICovCi0JZm9yICh0cmFucyA9IHRhYmxlOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKLQkJaWYgKHRyYW5zLT5mcm9tID09IGZyb20pCi0JCQlyZXR1cm4gdHJhbnM7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotaW50IGhpZGlucHV0X2FwcGxlX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCi17Ci0Jc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7Ci0KLQlpZiAodXNhZ2UtPmNvZGUgPT0gS0VZX0ZOKSB7Ci0JCWlmICh2YWx1ZSkgaGlkLT5xdWlya3MgfD0gIEhJRF9RVUlSS19BUFBMRV9GTl9PTjsKLQkJZWxzZSAgICAgICBoaWQtPnF1aXJrcyAmPSB+SElEX1FVSVJLX0FQUExFX0ZOX09OOwotCi0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUsIHZhbHVlKTsKLQotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoaGlkX2FwcGxlX2ZubW9kZSkgewotCQlpbnQgZG9fdHJhbnNsYXRlOwotCi0JCXRyYW5zID0gZmluZF90cmFuc2xhdGlvbigoaGlkLT5wcm9kdWN0IDwgMHgyMjAgfHwKLQkJCQkJICBoaWQtPnByb2R1Y3QgPj0gMHgzMDApID8KLQkJCQkJIHBvd2VyYm9va19mbl9rZXlzIDogYXBwbGVfZm5fa2V5cywKLQkJCQkJIHVzYWdlLT5jb2RlKTsKLQkJaWYgKHRyYW5zKSB7Ci0JCQlpZiAodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+YXBwbGVfcHJlc3NlZF9mbikpCi0JCQkJZG9fdHJhbnNsYXRlID0gMTsKLQkJCWVsc2UgaWYgKHRyYW5zLT5mbGFncyAmIEFQUExFX0ZMQUdfRktFWSkKLQkJCQlkb190cmFuc2xhdGUgPQotCQkJCQkoaGlkX2FwcGxlX2ZubW9kZSA9PSAyICYmICAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfQVBQTEVfRk5fT04pKSB8fAotCQkJCQkoaGlkX2FwcGxlX2ZubW9kZSA9PSAxICYmICEoaGlkLT5xdWlya3MgJiBISURfUVVJUktfQVBQTEVfRk5fT04pKTsKLQkJCWVsc2UKLQkJCQlkb190cmFuc2xhdGUgPSAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfQVBQTEVfRk5fT04pOwotCi0JCQlpZiAoZG9fdHJhbnNsYXRlKSB7Ci0JCQkJaWYgKHZhbHVlKQotCQkJCQlzZXRfYml0KHVzYWdlLT5jb2RlLCBoaWQtPmFwcGxlX3ByZXNzZWRfZm4pOwotCQkJCWVsc2UKLQkJCQkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCBoaWQtPmFwcGxlX3ByZXNzZWRfZm4pOwotCi0JCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKLQotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0KLQkJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OICYmICgKLQkJCQl0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spIHx8Ci0JCQkJdGVzdF9iaXQoTEVEX05VTUwsIGlucHV0LT5sZWQpKSkgewotCQkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19udW1sb2NrX2tleXMsIHVzYWdlLT5jb2RlKTsKLQotCQkJaWYgKHRyYW5zKSB7Ci0JCQkJaWYgKHZhbHVlKQotCQkJCQlzZXRfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfbnVtbG9jayk7Ci0JCQkJZWxzZQotCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKTsKLQotCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRCkgewotCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24oYXBwbGVfaXNvX2tleWJvYXJkLCB1c2FnZS0+Y29kZSk7Ci0JCWlmICh0cmFucykgewotCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZGlucHV0X2FwcGxlX3NldHVwKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQotewotCXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOwotCi0Jc2V0X2JpdChLRVlfTlVNTE9DSywgaW5wdXQtPmtleWJpdCk7Ci0KLQkvKiBFbmFibGUgYWxsIG5lZWRlZCBrZXlzICovCi0JZm9yICh0cmFucyA9IGFwcGxlX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Ci0KLQlmb3IgKHRyYW5zID0gcG93ZXJib29rX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Ci0KLQlmb3IgKHRyYW5zID0gcG93ZXJib29rX251bWxvY2tfa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCi0JCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKLQotCWZvciAodHJhbnMgPSBhcHBsZV9pc29fa2V5Ym9hcmQ7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Ci0KLX0KLSNlbHNlCi1pbmxpbmUgaW50IGhpZGlucHV0X2FwcGxlX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsCi0JCQkJICAgICAgIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJCSAgICAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoaWRpbnB1dF9hcHBsZV9zZXR1cChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKLXsKLX0KLSNlbmRpZgorI2RlZmluZSBtYXBfYWJzX2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGlkaW5wdXQsIHVzYWdlLCAmYml0LCBcCisJCSZtYXgsIEVWX0FCUywgKGMpKQorI2RlZmluZSBtYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGlkaW5wdXQsIHVzYWdlLCAmYml0LCBcCisJCSZtYXgsIEVWX0tFWSwgKGMpKQogCiBzdGF0aWMgaW5saW5lIGludCBtYXRjaF9zY2FuY29kZShpbnQgY29kZSwgaW50IHNjYW5jb2RlKQogewpAQCAtMzY2LDcgKzE1NCw3IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBoaWRpbnB1dC0+aW5wdXQ7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKLQlpbnQgbWF4ID0gMCwgY29kZSwgcmV0OworCWludCBtYXggPSAwLCBjb2RlOwogCXVuc2lnbmVkIGxvbmcgKmJpdCA9IE5VTEw7CiAKIAlmaWVsZC0+aGlkaW5wdXQgPSBoaWRpbnB1dDsKQEAgLTM4NSw0MDYgKzE3MywzNDUgQEAKIAkJZ290byBpZ25vcmU7CiAJfQogCi0JLyogaGFuZGxlIGlucHV0IG1hcHBpbmdzIGZvciBxdWlya3kgZGV2aWNlcyAqLwotCXJldCA9IGhpZGlucHV0X21hcHBpbmdfcXVpcmtzKHVzYWdlLCBpbnB1dCwgJmJpdCwgJm1heCk7Ci0JaWYgKHJldCkKLQkJZ290byBtYXBwZWQ7CisJaWYgKGRldmljZS0+ZHJpdmVyLT5pbnB1dF9tYXBwaW5nKSB7CisJCWludCByZXQgPSBkZXZpY2UtPmRyaXZlci0+aW5wdXRfbWFwcGluZyhkZXZpY2UsIGhpZGlucHV0LCBmaWVsZCwKKwkJCQl1c2FnZSwgJmJpdCwgJm1heCk7CisJCWlmIChyZXQgPiAwKQorCQkJZ290byBtYXBwZWQ7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBpZ25vcmU7CisJfQogCiAJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpIHsKKwljYXNlIEhJRF9VUF9VTkRFRklORUQ6CisJCWdvdG8gaWdub3JlOwogCi0JCWNhc2UgSElEX1VQX1VOREVGSU5FRDoKLQkJCWdvdG8gaWdub3JlOworCWNhc2UgSElEX1VQX0tFWUJPQVJEOgorCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKIAotCQljYXNlIEhJRF9VUF9LRVlCT0FSRDoKKwkJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSA8IDI1NikgeworCQkJaWYgKCFoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pIGdvdG8gaWdub3JlOworCQkJbWFwX2tleV9jbGVhcihoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pOworCQl9IGVsc2UKKwkJCW1hcF9rZXkoS0VZX1VOS05PV04pOwogCi0JCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwkJYnJlYWs7CiAKLQkJCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgPCAyNTYpIHsKLQkJCQlpZiAoIWhpZF9rZXlib2FyZFt1c2FnZS0+aGlkICYgSElEX1VTQUdFXSkgZ290byBpZ25vcmU7Ci0JCQkJbWFwX2tleV9jbGVhcihoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pOwotCQkJfSBlbHNlCi0JCQkJbWFwX2tleShLRVlfVU5LTk9XTik7CisJY2FzZSBISURfVVBfQlVUVE9OOgorCQljb2RlID0gKCh1c2FnZS0+aGlkIC0gMSkgJiAweGYpOwogCi0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9CVVRUT046Ci0KLQkJCWNvZGUgPSAoKHVzYWdlLT5oaWQgLSAxKSAmIDB4Zik7Ci0KLQkJCXN3aXRjaCAoZmllbGQtPmFwcGxpY2F0aW9uKSB7Ci0JCQkJY2FzZSBISURfR0RfTU9VU0U6Ci0JCQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOwotCQkJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IDB4MTIwOyBicmVhazsKLQkJCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc3dpdGNoIChmaWVsZC0+cGh5c2ljYWwpIHsKLQkJCQkJCWNhc2UgSElEX0dEX01PVVNFOgotCQkJCQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOwotCQkJCQkJY2FzZSBISURfR0RfSk9ZU1RJQ0s6IGNvZGUgKz0gMHgxMjA7IGJyZWFrOwotCQkJCQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOwotCQkJCQkJZGVmYXVsdDogICAgICAgICAgICAgIGNvZGUgKz0gMHgxMDA7Ci0JCQkJCX0KLQkJCX0KLQotCQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgTG9naXRlY2ggQ29yZGxlc3MgRGVza3RvcCAqLwotCQkJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbiAhPSBISURfR0RfTU9VU0UpIHsKLQkJCQlpZiAoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQKSB7Ci0JCQkJCWludCBoaWQgPSB1c2FnZS0+aGlkICYgSElEX1VTQUdFOwotCQkJCQlpZiAoaGlkIDwgTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQX1NJWkUgJiYgbG9naXRlY2hfZXhwYW5kZWRfa2V5bWFwW2hpZF0gIT0gMCkKLQkJCQkJCWNvZGUgPSBsb2dpdGVjaF9leHBhbmRlZF9rZXltYXBbaGlkXTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19MT0dJVEVDSF9JR05PUkVfRE9VQkxFRF9XSEVFTCkgewotCQkJCQlpbnQgaGlkID0gdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRTsKLQkJCQkJaWYgKGhpZCA9PSA3IHx8IGhpZCA9PSA4KQotCQkJCQkJZ290byBpZ25vcmU7Ci0JCQkJfQotCQkJfQotCi0JCQltYXBfa2V5KGNvZGUpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKLQkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7ICAgYnJlYWs7Ci0JCQkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOwotCQkJCWNhc2UgMHhjNDogbWFwX2FicyhBQlNfR0FTKTsgICAgICBicmVhazsKLQkJCQljYXNlIDB4YzU6IG1hcF9hYnMoQUJTX0JSQUtFKTsgICAgYnJlYWs7Ci0JCQkJY2FzZSAweGM4OiBtYXBfYWJzKEFCU19XSEVFTCk7ICAgIGJyZWFrOwotCQkJCWRlZmF1bHQ6ICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9HRU5ERVNLOgotCi0JCQlpZiAoKHVzYWdlLT5oaWQgJiAweGYwKSA9PSAweDgwKSB7CS8qIFN5c3RlbUNvbnRyb2wgKi8KLQkJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGYpIHsKLQkJCQkJY2FzZSAweDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BPV0VSKTsgIGJyZWFrOwotCQkJCQljYXNlIDB4MjogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOyAgYnJlYWs7Ci0JCQkJCWNhc2UgMHgzOiBtYXBfa2V5X2NsZWFyKEtFWV9XQUtFVVApOyBicmVhazsKLQkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg5MCkgewkvKiBELXBhZCAqLwotCQkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgewotCQkJCQljYXNlIEhJRF9HRF9VUDoJICAgdXNhZ2UtPmhhdF9kaXIgPSAxOyBicmVhazsKLQkJCQkJY2FzZSBISURfR0RfRE9XTjogIHVzYWdlLT5oYXRfZGlyID0gNTsgYnJlYWs7Ci0JCQkJCWNhc2UgSElEX0dEX1JJR0hUOiB1c2FnZS0+aGF0X2RpciA9IDM7IGJyZWFrOwotCQkJCQljYXNlIEhJRF9HRF9MRUZUOiAgdXNhZ2UtPmhhdF9kaXIgPSA3OyBicmVhazsKLQkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOwotCQkJCX0KLQkJCQlpZiAoZmllbGQtPmRwYWQpIHsKLQkJCQkJbWFwX2FicyhmaWVsZC0+ZHBhZCk7Ci0JCQkJCWdvdG8gaWdub3JlOwotCQkJCX0KLQkJCQltYXBfYWJzKEFCU19IQVQwWCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgewotCi0JCQkJLyogVGhlc2UgdXNhZ2UgSURzIG1hcCBkaXJlY3RseSB0byB0aGUgdXNhZ2UgY29kZXMuICovCi0JCQkJY2FzZSBISURfR0RfWDogY2FzZSBISURfR0RfWTogY2FzZSBISURfR0RfWjoKLQkJCQljYXNlIEhJRF9HRF9SWDogY2FzZSBISURfR0RfUlk6IGNhc2UgSElEX0dEX1JaOgotCQkJCWNhc2UgSElEX0dEX1NMSURFUjogY2FzZSBISURfR0RfRElBTDogY2FzZSBISURfR0RfV0hFRUw6Ci0JCQkJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQotCQkJCQkJbWFwX3JlbCh1c2FnZS0+aGlkICYgMHhmKTsKLQkJCQkJZWxzZQotCQkJCQkJbWFwX2Ficyh1c2FnZS0+aGlkICYgMHhmKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEhJRF9HRF9IQVRTV0lUQ0g6Ci0JCQkJCXVzYWdlLT5oYXRfbWluID0gZmllbGQtPmxvZ2ljYWxfbWluaW11bTsKLQkJCQkJdXNhZ2UtPmhhdF9tYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOwotCQkJCQltYXBfYWJzKEFCU19IQVQwWCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBISURfR0RfU1RBUlQ6CW1hcF9rZXlfY2xlYXIoQlROX1NUQVJUKTsJYnJlYWs7Ci0JCQkJY2FzZSBISURfR0RfU0VMRUNUOgltYXBfa2V5X2NsZWFyKEJUTl9TRUxFQ1QpOwlicmVhazsKLQotCQkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfTEVEOgotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBISUQtVmFsdWU6ICAgICAgICAgICAgICAgICAgICovCi0JCQkJY2FzZSAweDAxOiAgbWFwX2xlZCAoTEVEX05VTUwpOyAgICAgYnJlYWs7ICAgIC8qICAgIk51bSBMb2NrIiAgICAgICAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4MDI6ICBtYXBfbGVkIChMRURfQ0FQU0wpOyAgICBicmVhazsgICAgLyogICAiQ2FwcyBMb2NrIiAgICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHgwMzogIG1hcF9sZWQgKExFRF9TQ1JPTExMKTsgIGJyZWFrOyAgICAvKiAgICJTY3JvbGwgTG9jayIgICAgICAgICAgICAgICovCi0JCQkJY2FzZSAweDA0OiAgbWFwX2xlZCAoTEVEX0NPTVBPU0UpOyAgYnJlYWs7ICAgIC8qICAgIkNvbXBvc2UiICAgICAgICAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4MDU6ICBtYXBfbGVkIChMRURfS0FOQSk7ICAgICBicmVhazsgICAgLyogICAiS2FuYSIgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHgyNzogIG1hcF9sZWQgKExFRF9TTEVFUCk7ICAgIGJyZWFrOyAgICAvKiAgICJTdGFuZC1CeSIgICAgICAgICAgICAgICAgICovCi0JCQkJY2FzZSAweDRjOiAgbWFwX2xlZCAoTEVEX1NVU1BFTkQpOyAgYnJlYWs7ICAgIC8qICAgIlN5c3RlbSBTdXNwZW5kIiAgICAgICAgICAgKi8KLQkJCQljYXNlIDB4MDk6ICBtYXBfbGVkIChMRURfTVVURSk7ICAgICBicmVhazsgICAgLyogICAiTXV0ZSIgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCWNhc2UgMHg0YjogIG1hcF9sZWQgKExFRF9NSVNDKTsgICAgIGJyZWFrOyAgICAvKiAgICJHZW5lcmljIEluZGljYXRvciIgICAgICAgICovCi0JCQkJY2FzZSAweDE5OiAgbWFwX2xlZCAoTEVEX01BSUwpOyAgICAgYnJlYWs7ICAgIC8qICAgIk1lc3NhZ2UgV2FpdGluZyIgICAgICAgICAgKi8KLQkJCQljYXNlIDB4NGQ6ICBtYXBfbGVkIChMRURfQ0hBUkdJTkcpOyBicmVhazsgICAgLyogICAiRXh0ZXJuYWwgUG93ZXIgQ29ubmVjdGVkIiAqLwotCi0JCQkJZGVmYXVsdDogZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9ESUdJVElaRVI6Ci0KLQkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIDB4ZmYpIHsKLQotCQkJCWNhc2UgMHgzMDogLyogVGlwUHJlc3N1cmUgKi8KLQkJCQkJaWYgKCF0ZXN0X2JpdChCVE5fVE9VQ0gsIGlucHV0LT5rZXliaXQpKSB7Ci0JCQkJCQlkZXZpY2UtPnF1aXJrcyB8PSBISURfUVVJUktfTk9UT1VDSDsKLQkJCQkJCXNldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOwotCQkJCQkJc2V0X2JpdChCVE5fVE9VQ0gsIGlucHV0LT5rZXliaXQpOwotCQkJCQl9Ci0KLQkJCQkJbWFwX2Fic19jbGVhcihBQlNfUFJFU1NVUkUpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgMHgzMjogLyogSW5SYW5nZSAqLwotCQkJCQlzd2l0Y2ggKGZpZWxkLT5waHlzaWNhbCAmIDB4ZmYpIHsKLQkJCQkJCWNhc2UgMHgyMTogbWFwX2tleShCVE5fVE9PTF9NT1VTRSk7IGJyZWFrOwotCQkJCQkJY2FzZSAweDIyOiBtYXBfa2V5KEJUTl9UT09MX0ZJTkdFUik7IGJyZWFrOwotCQkJCQkJZGVmYXVsdDogbWFwX2tleShCVE5fVE9PTF9QRU4pOyBicmVhazsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgMHgzYzogLyogSW52ZXJ0ICovCi0JCQkJCW1hcF9rZXlfY2xlYXIoQlROX1RPT0xfUlVCQkVSKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MzM6IC8qIFRvdWNoICovCi0JCQkJY2FzZSAweDQyOiAvKiBUaXBTd2l0Y2ggKi8KLQkJCQljYXNlIDB4NDM6IC8qIFRpcFN3aXRjaDIgKi8KLQkJCQkJZGV2aWNlLT5xdWlya3MgJj0gfkhJRF9RVUlSS19OT1RPVUNIOwotCQkJCQltYXBfa2V5X2NsZWFyKEJUTl9UT1VDSCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAweDQ0OiAvKiBCYXJyZWxTd2l0Y2ggKi8KLQkJCQkJbWFwX2tleV9jbGVhcihCVE5fU1RZTFVTKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OiAgZ290byB1bmtub3duOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfQ09OU1VNRVI6CS8qIFVTQiBIVVQgdjEuMSwgcGFnZXMgNTYtNjIgKi8KLQotCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCQkJY2FzZSAweDAwMDogZ290byBpZ25vcmU7Ci0JCQkJY2FzZSAweDAzNDogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDAzNjogbWFwX2tleV9jbGVhcihCVE5fTUlTQyk7CQlicmVhazsKLQotCQkJCWNhc2UgMHgwNDA6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA0NTogbWFwX2tleV9jbGVhcihLRVlfUkFESU8pOwkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MDgzOiBtYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODg6IG1hcF9rZXlfY2xlYXIoS0VZX1BDKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODk6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOGE6IG1hcF9rZXlfY2xlYXIoS0VZX1dXVyk7CQlicmVhazsKLQkJCQljYXNlIDB4MDhiOiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4YzogbWFwX2tleV9jbGVhcihLRVlfUEhPTkUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4ZDogbWFwX2tleV9jbGVhcihLRVlfUFJPR1JBTSk7CQlicmVhazsKLQkJCQljYXNlIDB4MDhlOiBtYXBfa2V5X2NsZWFyKEtFWV9WSURFT1BIT05FKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDA4ZjogbWFwX2tleV9jbGVhcihLRVlfR0FNRVMpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5MDogbWFwX2tleV9jbGVhcihLRVlfTUVNTyk7CQlicmVhazsKLQkJCQljYXNlIDB4MDkxOiBtYXBfa2V5X2NsZWFyKEtFWV9DRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDkyOiBtYXBfa2V5X2NsZWFyKEtFWV9WQ1IpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5MzogbWFwX2tleV9jbGVhcihLRVlfVFVORVIpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5NDogbWFwX2tleV9jbGVhcihLRVlfRVhJVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDk1OiBtYXBfa2V5X2NsZWFyKEtFWV9IRUxQKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTY6IG1hcF9rZXlfY2xlYXIoS0VZX1RBUEUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5NzogbWFwX2tleV9jbGVhcihLRVlfVFYyKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTg6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDlhOiBtYXBfa2V5X2NsZWFyKEtFWV9QVlIpOwkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MDljOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMVVApOwlicmVhazsKLQkJCQljYXNlIDB4MDlkOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMRE9XTik7CWJyZWFrOwotCQkJCWNhc2UgMHgwYTA6IG1hcF9rZXlfY2xlYXIoS0VZX1ZDUjIpOwkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4MGIwOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwYjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BBVVNFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwYjI6IG1hcF9rZXlfY2xlYXIoS0VZX1JFQ09SRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGIzOiBtYXBfa2V5X2NsZWFyKEtFWV9GQVNURk9SV0FSRCk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1JFV0lORCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGI1OiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjY6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjc6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1BDRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGI4OiBtYXBfa2V5X2NsZWFyKEtFWV9FSkVDVENEKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwYmM6IG1hcF9rZXlfY2xlYXIoS0VZX01FRElBX1JFUEVBVCk7CWJyZWFrOwotCi0JCQkJY2FzZSAweDBjZDogbWFwX2tleV9jbGVhcihLRVlfUExBWVBBVVNFKTsJYnJlYWs7Ci0JCQkgICAgICAgIGNhc2UgMHgwZTA6IG1hcF9hYnNfY2xlYXIoQUJTX1ZPTFVNRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MGUyOiBtYXBfa2V5X2NsZWFyKEtFWV9NVVRFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwZTU6IG1hcF9rZXlfY2xlYXIoS0VZX0JBU1NCT09TVCk7CWJyZWFrOwotCQkJCWNhc2UgMHgwZTk6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRVVQKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDBlYTogbWFwX2tleV9jbGVhcihLRVlfVk9MVU1FRE9XTik7CWJyZWFrOwotCi0JCQkJY2FzZSAweDE4MjogbWFwX2tleV9jbGVhcihLRVlfQk9PS01BUktTKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE4MzogbWFwX2tleV9jbGVhcihLRVlfQ09ORklHKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxODQ6IG1hcF9rZXlfY2xlYXIoS0VZX1dPUkRQUk9DRVNTT1IpOwlicmVhazsKLQkJCQljYXNlIDB4MTg1OiBtYXBfa2V5X2NsZWFyKEtFWV9FRElUT1IpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE4NjogbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwlicmVhazsKLQkJCQljYXNlIDB4MTg3OiBtYXBfa2V5X2NsZWFyKEtFWV9HUkFQSElDU0VESVRPUik7CWJyZWFrOwotCQkJCWNhc2UgMHgxODg6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVNFTlRBVElPTik7CWJyZWFrOwotCQkJCWNhc2UgMHgxODk6IG1hcF9rZXlfY2xlYXIoS0VZX0RBVEFCQVNFKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE4YTogbWFwX2tleV9jbGVhcihLRVlfTUFJTCk7CQlicmVhazsKLQkJCQljYXNlIDB4MThiOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVdTKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPSUNFTUFJTCk7CWJyZWFrOwotCQkJCWNhc2UgMHgxOGQ6IG1hcF9rZXlfY2xlYXIoS0VZX0FERFJFU1NCT09LKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDE4ZTogbWFwX2tleV9jbGVhcihLRVlfQ0FMRU5EQVIpOwlicmVhazsKLQkJCQljYXNlIDB4MTkxOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5BTkNFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOTI6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTEMpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE5NDogbWFwX2tleV9jbGVhcihLRVlfRklMRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MTk2OiBtYXBfa2V5X2NsZWFyKEtFWV9XV1cpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE5YzogbWFwX2tleV9jbGVhcihLRVlfTE9HT0ZGKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOWU6IG1hcF9rZXlfY2xlYXIoS0VZX0NPRkZFRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MWE2OiBtYXBfa2V5X2NsZWFyKEtFWV9IRUxQKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxYTc6IG1hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7CWJyZWFrOwotCQkJCWNhc2UgMHgxYWI6IG1hcF9rZXlfY2xlYXIoS0VZX1NQRUxMQ0hFQ0spOwlicmVhazsKLQkJCQljYXNlIDB4MWI2OiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CQlicmVhazsKLQkJCQljYXNlIDB4MWI3OiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKLQkJCQljYXNlIDB4MWJjOiBtYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwlicmVhazsKLQkJCQljYXNlIDB4MWJkOiBtYXBfa2V5X2NsZWFyKEtFWV9JTkZPKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMDE6IG1hcF9rZXlfY2xlYXIoS0VZX05FVyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjAyOiBtYXBfa2V5X2NsZWFyKEtFWV9PUEVOKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMDM6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMDQ6IG1hcF9rZXlfY2xlYXIoS0VZX0VYSVQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwNzogbWFwX2tleV9jbGVhcihLRVlfU0FWRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjA4OiBtYXBfa2V5X2NsZWFyKEtFWV9QUklOVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjA5OiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9QUyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFhOiBtYXBfa2V5X2NsZWFyKEtFWV9VTkRPKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMWI6IG1hcF9rZXlfY2xlYXIoS0VZX0NPUFkpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIxYzogbWFwX2tleV9jbGVhcihLRVlfQ1VUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMWQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BBU1RFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMWY6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyMTogbWFwX2tleV9jbGVhcihLRVlfU0VBUkNIKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjI6IG1hcF9rZXlfY2xlYXIoS0VZX0dPVE8pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyMzogbWFwX2tleV9jbGVhcihLRVlfSE9NRVBBR0UpOwlicmVhazsKLQkJCQljYXNlIDB4MjI0OiBtYXBfa2V5X2NsZWFyKEtFWV9CQUNLKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjU6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyNjogbWFwX2tleV9jbGVhcihLRVlfU1RPUCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjI3OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUZSRVNIKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMmE6IG1hcF9rZXlfY2xlYXIoS0VZX0JPT0tNQVJLUyk7CWJyZWFrOwotCQkJCWNhc2UgMHgyMmQ6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01JTik7CQlicmVhazsKLQkJCQljYXNlIDB4MjJlOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NT1VUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMmY6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01SRVNFVCk7CWJyZWFrOwotCQkJCWNhc2UgMHgyMzM6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTFVQKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDIzNDogbWFwX2tleV9jbGVhcihLRVlfU0NST0xMRE9XTik7CWJyZWFrOwotCQkJCWNhc2UgMHgyMzg6IG1hcF9yZWwoUkVMX0hXSEVFTCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjVmOiBtYXBfa2V5X2NsZWFyKEtFWV9DQU5DRUwpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDI3OTogbWFwX2tleV9jbGVhcihLRVlfUkVETyk7CQlicmVhazsKLQotCQkJCWNhc2UgMHgyODk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFUExZKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyOGI6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkRNQUlMKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDI4YzogbWFwX2tleV9jbGVhcihLRVlfU0VORCk7CQlicmVhazsKLQotCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfSFBWRU5ET1I6CS8qIFJlcG9ydGVkIG9uIGEgRHV0Y2ggbGF5b3V0IEhQNTMwOCAqLwotCi0JCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKLQkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJICAgICAgICBjYXNlIDB4MDIxOiBtYXBfa2V5X2NsZWFyKEtFWV9QUklOVCk7ICAgICAgICAgICBicmVhazsKLQkJCQljYXNlIDB4MDcwOiBtYXBfa2V5X2NsZWFyKEtFWV9IUCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDcxOiBtYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA3MjogbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA3MzogbWFwX2tleV9jbGVhcihLRVlfUVVFU1RJT04pOwlicmVhazsKLQkJCQljYXNlIDB4MDgwOiBtYXBfa2V5X2NsZWFyKEtFWV9FTUFJTCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDgxOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODI6IG1hcF9rZXlfY2xlYXIoS0VZX1NFQVJDSCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDgzOiBtYXBfa2V5X2NsZWFyKEtFWV9DT05ORUNUKTsJICAgICAgICBicmVhazsKLQkJCQljYXNlIDB4MDg0OiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5BTkNFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODU6IG1hcF9rZXlfY2xlYXIoS0VZX1NQT1JUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODY6IG1hcF9rZXlfY2xlYXIoS0VZX1NIT1ApOwkgICAgICAgIGJyZWFrOwotCQkJCWRlZmF1bHQ6ICAgIGdvdG8gaWdub3JlOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfTVNWRU5ET1I6Ci0KLQkJCWdvdG8gaWdub3JlOwotCi0JCWNhc2UgSElEX1VQX0NVU1RPTTogLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggYW5kIEFwcGxlIFVTQiBrZXlib2FyZHMgKi8KLQotCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0JCQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJCWNhc2UgMHgwMDM6Ci0JCQkJCS8qIFRoZSBmbiBrZXkgb24gQXBwbGUgVVNCIGtleWJvYXJkcyAqLwotCQkJCQltYXBfa2V5X2NsZWFyKEtFWV9GTik7Ci0JCQkJCWhpZGlucHV0X2FwcGxlX3NldHVwKGlucHV0KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0xPR0lWRU5ET1I6Ci0KLQkJCWdvdG8gaWdub3JlOwotCQkKLQkJY2FzZSBISURfVVBfUElEOgotCi0JCQlzd2l0Y2godXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgewotCQkJCWNhc2UgMHhhNDogbWFwX2tleV9jbGVhcihCVE5fREVBRCk7CWJyZWFrOwotCQkJCWRlZmF1bHQ6IGdvdG8gaWdub3JlOwotCQkJfQotCQkJYnJlYWs7Ci0KKwkJc3dpdGNoIChmaWVsZC0+YXBwbGljYXRpb24pIHsKKwkJY2FzZSBISURfR0RfTU9VU0U6CisJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IDB4MTEwOyBicmVhazsKKwkJY2FzZSBISURfR0RfSk9ZU1RJQ0s6IGNvZGUgKz0gMHgxMjA7IGJyZWFrOworCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCXVua25vd246Ci0JCQlpZiAoZmllbGQtPnJlcG9ydF9zaXplID09IDEpIHsKLQkJCQlpZiAoZmllbGQtPnJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgewotCQkJCQltYXBfbGVkKExFRF9NSVNDKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW1hcF9rZXkoQlROX01JU0MpOwotCQkJCWJyZWFrOworCQkJc3dpdGNoIChmaWVsZC0+cGh5c2ljYWwpIHsKKwkJCWNhc2UgSElEX0dEX01PVVNFOgorCQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOworCQkJY2FzZSBISURfR0RfSk9ZU1RJQ0s6IGNvZGUgKz0gMHgxMjA7IGJyZWFrOworCQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAgIGNvZGUgKz0gMHgxMDA7CiAJCQl9Ci0JCQlpZiAoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9SRUxBVElWRSkgewotCQkJCW1hcF9yZWwoUkVMX01JU0MpOwotCQkJCWJyZWFrOworCQl9CisKKwkJbWFwX2tleShjb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKKwkJY2FzZSAweGJhOiBtYXBfYWJzKEFCU19SVURERVIpOyAgIGJyZWFrOworCQljYXNlIDB4YmI6IG1hcF9hYnMoQUJTX1RIUk9UVExFKTsgYnJlYWs7CisJCWNhc2UgMHhjNDogbWFwX2FicyhBQlNfR0FTKTsgICAgICBicmVhazsKKwkJY2FzZSAweGM1OiBtYXBfYWJzKEFCU19CUkFLRSk7ICAgIGJyZWFrOworCQljYXNlIDB4Yzg6IG1hcF9hYnMoQUJTX1dIRUVMKTsgICAgYnJlYWs7CisJCWRlZmF1bHQ6ICAgZ290byBpZ25vcmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9HRU5ERVNLOgorCQlpZiAoKHVzYWdlLT5oaWQgJiAweGYwKSA9PSAweDgwKSB7CS8qIFN5c3RlbUNvbnRyb2wgKi8KKwkJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIDB4ZikgeworCQkJY2FzZSAweDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BPV0VSKTsgIGJyZWFrOworCQkJY2FzZSAweDI6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsgIGJyZWFrOworCQkJY2FzZSAweDM6IG1hcF9rZXlfY2xlYXIoS0VZX1dBS0VVUCk7IGJyZWFrOworCQkJZGVmYXVsdDogZ290byB1bmtub3duOwogCQkJfQotCQkJbWFwX2FicyhBQlNfTUlTQyk7CiAJCQlicmVhazsKKwkJfQorCisJCWlmICgodXNhZ2UtPmhpZCAmIDB4ZjApID09IDB4OTApIHsJLyogRC1wYWQgKi8KKwkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgeworCQkJY2FzZSBISURfR0RfVVA6CSAgIHVzYWdlLT5oYXRfZGlyID0gMTsgYnJlYWs7CisJCQljYXNlIEhJRF9HRF9ET1dOOiAgdXNhZ2UtPmhhdF9kaXIgPSA1OyBicmVhazsKKwkJCWNhc2UgSElEX0dEX1JJR0hUOiB1c2FnZS0+aGF0X2RpciA9IDM7IGJyZWFrOworCQkJY2FzZSBISURfR0RfTEVGVDogIHVzYWdlLT5oYXRfZGlyID0gNzsgYnJlYWs7CisJCQlkZWZhdWx0OiBnb3RvIHVua25vd247CisJCQl9CisJCQlpZiAoZmllbGQtPmRwYWQpIHsKKwkJCQltYXBfYWJzKGZpZWxkLT5kcGFkKTsKKwkJCQlnb3RvIGlnbm9yZTsKKwkJCX0KKwkJCW1hcF9hYnMoQUJTX0hBVDBYKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh1c2FnZS0+aGlkKSB7CisJCS8qIFRoZXNlIHVzYWdlIElEcyBtYXAgZGlyZWN0bHkgdG8gdGhlIHVzYWdlIGNvZGVzLiAqLworCQljYXNlIEhJRF9HRF9YOiBjYXNlIEhJRF9HRF9ZOiBjYXNlIEhJRF9HRF9aOgorCQljYXNlIEhJRF9HRF9SWDogY2FzZSBISURfR0RfUlk6IGNhc2UgSElEX0dEX1JaOgorCQljYXNlIEhJRF9HRF9TTElERVI6IGNhc2UgSElEX0dEX0RJQUw6IGNhc2UgSElEX0dEX1dIRUVMOgorCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpCisJCQkJbWFwX3JlbCh1c2FnZS0+aGlkICYgMHhmKTsKKwkJCWVsc2UKKwkJCQltYXBfYWJzKHVzYWdlLT5oaWQgJiAweGYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBISURfR0RfSEFUU1dJVENIOgorCQkJdXNhZ2UtPmhhdF9taW4gPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOworCQkJdXNhZ2UtPmhhdF9tYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOworCQkJbWFwX2FicyhBQlNfSEFUMFgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBISURfR0RfU1RBUlQ6CW1hcF9rZXlfY2xlYXIoQlROX1NUQVJUKTsJYnJlYWs7CisJCWNhc2UgSElEX0dEX1NFTEVDVDoJbWFwX2tleV9jbGVhcihCVE5fU0VMRUNUKTsJYnJlYWs7CisKKwkJZGVmYXVsdDogZ290byB1bmtub3duOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9MRUQ6CisJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIDB4ZmZmZikgewkJICAgICAgLyogSElELVZhbHVlOiAgICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4MDE6ICBtYXBfbGVkIChMRURfTlVNTCk7ICAgICBicmVhazsgICAgLyogICAiTnVtIExvY2siICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4MDI6ICBtYXBfbGVkIChMRURfQ0FQU0wpOyAgICBicmVhazsgICAgLyogICAiQ2FwcyBMb2NrIiAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4MDM6ICBtYXBfbGVkIChMRURfU0NST0xMTCk7ICBicmVhazsgICAgLyogICAiU2Nyb2xsIExvY2siICAgICAgICAgICAgICAqLworCQljYXNlIDB4MDQ6ICBtYXBfbGVkIChMRURfQ09NUE9TRSk7ICBicmVhazsgICAgLyogICAiQ29tcG9zZSIgICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4MDU6ICBtYXBfbGVkIChMRURfS0FOQSk7ICAgICBicmVhazsgICAgLyogICAiS2FuYSIgICAgICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4Mjc6ICBtYXBfbGVkIChMRURfU0xFRVApOyAgICBicmVhazsgICAgLyogICAiU3RhbmQtQnkiICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4NGM6ICBtYXBfbGVkIChMRURfU1VTUEVORCk7ICBicmVhazsgICAgLyogICAiU3lzdGVtIFN1c3BlbmQiICAgICAgICAgICAqLworCQljYXNlIDB4MDk6ICBtYXBfbGVkIChMRURfTVVURSk7ICAgICBicmVhazsgICAgLyogICAiTXV0ZSIgICAgICAgICAgICAgICAgICAgICAqLworCQljYXNlIDB4NGI6ICBtYXBfbGVkIChMRURfTUlTQyk7ICAgICBicmVhazsgICAgLyogICAiR2VuZXJpYyBJbmRpY2F0b3IiICAgICAgICAqLworCQljYXNlIDB4MTk6ICBtYXBfbGVkIChMRURfTUFJTCk7ICAgICBicmVhazsgICAgLyogICAiTWVzc2FnZSBXYWl0aW5nIiAgICAgICAgICAqLworCQljYXNlIDB4NGQ6ICBtYXBfbGVkIChMRURfQ0hBUkdJTkcpOyBicmVhazsgICAgLyogICAiRXh0ZXJuYWwgUG93ZXIgQ29ubmVjdGVkIiAqLworCisJCWRlZmF1bHQ6IGdvdG8gaWdub3JlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBISURfVVBfRElHSVRJWkVSOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmKSB7CisJCWNhc2UgMHgzMDogLyogVGlwUHJlc3N1cmUgKi8KKwkJCWlmICghdGVzdF9iaXQoQlROX1RPVUNILCBpbnB1dC0+a2V5Yml0KSkgeworCQkJCWRldmljZS0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT1RPVUNIOworCQkJCXNldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOworCQkJCXNldF9iaXQoQlROX1RPVUNILCBpbnB1dC0+a2V5Yml0KTsKKwkJCX0KKwkJCW1hcF9hYnNfY2xlYXIoQUJTX1BSRVNTVVJFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgzMjogLyogSW5SYW5nZSAqLworCQkJc3dpdGNoIChmaWVsZC0+cGh5c2ljYWwgJiAweGZmKSB7CisJCQljYXNlIDB4MjE6IG1hcF9rZXkoQlROX1RPT0xfTU9VU0UpOyBicmVhazsKKwkJCWNhc2UgMHgyMjogbWFwX2tleShCVE5fVE9PTF9GSU5HRVIpOyBicmVhazsKKwkJCWRlZmF1bHQ6IG1hcF9rZXkoQlROX1RPT0xfUEVOKTsgYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4M2M6IC8qIEludmVydCAqLworCQkJbWFwX2tleV9jbGVhcihCVE5fVE9PTF9SVUJCRVIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDMzOiAvKiBUb3VjaCAqLworCQljYXNlIDB4NDI6IC8qIFRpcFN3aXRjaCAqLworCQljYXNlIDB4NDM6IC8qIFRpcFN3aXRjaDIgKi8KKwkJCWRldmljZS0+cXVpcmtzICY9IH5ISURfUVVJUktfTk9UT1VDSDsKKwkJCW1hcF9rZXlfY2xlYXIoQlROX1RPVUNIKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg0NDogLyogQmFycmVsU3dpdGNoICovCisJCQltYXBfa2V5X2NsZWFyKEJUTl9TVFlMVVMpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogIGdvdG8gdW5rbm93bjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSElEX1VQX0NPTlNVTUVSOgkvKiBVU0IgSFVUIHYxLjEsIHBhZ2VzIDU2LTYyICovCisJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCQljYXNlIDB4MDAwOiBnb3RvIGlnbm9yZTsKKwkJY2FzZSAweDAzNDogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOwkJYnJlYWs7CisJCWNhc2UgMHgwMzY6IG1hcF9rZXlfY2xlYXIoQlROX01JU0MpOwkJYnJlYWs7CisKKwkJY2FzZSAweDA0MDogbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKKwkJY2FzZSAweDA0NTogbWFwX2tleV9jbGVhcihLRVlfUkFESU8pOwkJYnJlYWs7CisKKwkJY2FzZSAweDA4MzogbWFwX2tleV9jbGVhcihLRVlfTEFTVCk7CQlicmVhazsKKwkJY2FzZSAweDA4ODogbWFwX2tleV9jbGVhcihLRVlfUEMpOwkJYnJlYWs7CisJCWNhc2UgMHgwODk6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOworCQljYXNlIDB4MDhhOiBtYXBfa2V5X2NsZWFyKEtFWV9XV1cpOwkJYnJlYWs7CisJCWNhc2UgMHgwOGI6IG1hcF9rZXlfY2xlYXIoS0VZX0RWRCk7CQlicmVhazsKKwkJY2FzZSAweDA4YzogbWFwX2tleV9jbGVhcihLRVlfUEhPTkUpOwkJYnJlYWs7CisJCWNhc2UgMHgwOGQ6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0dSQU0pOwkJYnJlYWs7CisJCWNhc2UgMHgwOGU6IG1hcF9rZXlfY2xlYXIoS0VZX1ZJREVPUEhPTkUpOwlicmVhazsKKwkJY2FzZSAweDA4ZjogbWFwX2tleV9jbGVhcihLRVlfR0FNRVMpOwkJYnJlYWs7CisJCWNhc2UgMHgwOTA6IG1hcF9rZXlfY2xlYXIoS0VZX01FTU8pOwkJYnJlYWs7CisJCWNhc2UgMHgwOTE6IG1hcF9rZXlfY2xlYXIoS0VZX0NEKTsJCWJyZWFrOworCQljYXNlIDB4MDkyOiBtYXBfa2V5X2NsZWFyKEtFWV9WQ1IpOwkJYnJlYWs7CisJCWNhc2UgMHgwOTM6IG1hcF9rZXlfY2xlYXIoS0VZX1RVTkVSKTsJCWJyZWFrOworCQljYXNlIDB4MDk0OiBtYXBfa2V5X2NsZWFyKEtFWV9FWElUKTsJCWJyZWFrOworCQljYXNlIDB4MDk1OiBtYXBfa2V5X2NsZWFyKEtFWV9IRUxQKTsJCWJyZWFrOworCQljYXNlIDB4MDk2OiBtYXBfa2V5X2NsZWFyKEtFWV9UQVBFKTsJCWJyZWFrOworCQljYXNlIDB4MDk3OiBtYXBfa2V5X2NsZWFyKEtFWV9UVjIpOwkJYnJlYWs7CisJCWNhc2UgMHgwOTg6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVCk7CQlicmVhazsKKwkJY2FzZSAweDA5YTogbWFwX2tleV9jbGVhcihLRVlfUFZSKTsJCWJyZWFrOworCisJCWNhc2UgMHgwOWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUxVUCk7CWJyZWFrOworCQljYXNlIDB4MDlkOiBtYXBfa2V5X2NsZWFyKEtFWV9DSEFOTkVMRE9XTik7CWJyZWFrOworCQljYXNlIDB4MGEwOiBtYXBfa2V5X2NsZWFyKEtFWV9WQ1IyKTsJCWJyZWFrOworCisJCWNhc2UgMHgwYjA6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVkpOwkJYnJlYWs7CisJCWNhc2UgMHgwYjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BBVVNFKTsJCWJyZWFrOworCQljYXNlIDB4MGIyOiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7CisJCWNhc2UgMHgwYjM6IG1hcF9rZXlfY2xlYXIoS0VZX0ZBU1RGT1JXQVJEKTsJYnJlYWs7CisJCWNhc2UgMHgwYjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1JFV0lORCk7CQlicmVhazsKKwkJY2FzZSAweDBiNTogbWFwX2tleV9jbGVhcihLRVlfTkVYVFNPTkcpOwlicmVhazsKKwkJY2FzZSAweDBiNjogbWFwX2tleV9jbGVhcihLRVlfUFJFVklPVVNTT05HKTsJYnJlYWs7CisJCWNhc2UgMHgwYjc6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1BDRCk7CQlicmVhazsKKwkJY2FzZSAweDBiODogbWFwX2tleV9jbGVhcihLRVlfRUpFQ1RDRCk7CQlicmVhazsKKwkJY2FzZSAweDBiYzogbWFwX2tleV9jbGVhcihLRVlfTUVESUFfUkVQRUFUKTsJYnJlYWs7CisKKwkJY2FzZSAweDBjZDogbWFwX2tleV9jbGVhcihLRVlfUExBWVBBVVNFKTsJYnJlYWs7CisJCWNhc2UgMHgwZTA6IG1hcF9hYnNfY2xlYXIoQUJTX1ZPTFVNRSk7CQlicmVhazsKKwkJY2FzZSAweDBlMjogbWFwX2tleV9jbGVhcihLRVlfTVVURSk7CQlicmVhazsKKwkJY2FzZSAweDBlNTogbWFwX2tleV9jbGVhcihLRVlfQkFTU0JPT1NUKTsJYnJlYWs7CisJCWNhc2UgMHgwZTk6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRVVQKTsJYnJlYWs7CisJCWNhc2UgMHgwZWE6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRURPV04pOwlicmVhazsKKworCQljYXNlIDB4MTgyOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKKwkJY2FzZSAweDE4MzogbWFwX2tleV9jbGVhcihLRVlfQ09ORklHKTsJCWJyZWFrOworCQljYXNlIDB4MTg0OiBtYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7CisJCWNhc2UgMHgxODU6IG1hcF9rZXlfY2xlYXIoS0VZX0VESVRPUik7CQlicmVhazsKKwkJY2FzZSAweDE4NjogbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwlicmVhazsKKwkJY2FzZSAweDE4NzogbWFwX2tleV9jbGVhcihLRVlfR1JBUEhJQ1NFRElUT1IpOwlicmVhazsKKwkJY2FzZSAweDE4ODogbWFwX2tleV9jbGVhcihLRVlfUFJFU0VOVEFUSU9OKTsJYnJlYWs7CisJCWNhc2UgMHgxODk6IG1hcF9rZXlfY2xlYXIoS0VZX0RBVEFCQVNFKTsJYnJlYWs7CisJCWNhc2UgMHgxOGE6IG1hcF9rZXlfY2xlYXIoS0VZX01BSUwpOwkJYnJlYWs7CisJCWNhc2UgMHgxOGI6IG1hcF9rZXlfY2xlYXIoS0VZX05FV1MpOwkJYnJlYWs7CisJCWNhc2UgMHgxOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPSUNFTUFJTCk7CWJyZWFrOworCQljYXNlIDB4MThkOiBtYXBfa2V5X2NsZWFyKEtFWV9BRERSRVNTQk9PSyk7CWJyZWFrOworCQljYXNlIDB4MThlOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxFTkRBUik7CWJyZWFrOworCQljYXNlIDB4MTkxOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5BTkNFKTsJCWJyZWFrOworCQljYXNlIDB4MTkyOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxDKTsJCWJyZWFrOworCQljYXNlIDB4MTk0OiBtYXBfa2V5X2NsZWFyKEtFWV9GSUxFKTsJCWJyZWFrOworCQljYXNlIDB4MTk2OiBtYXBfa2V5X2NsZWFyKEtFWV9XV1cpOwkJYnJlYWs7CisJCWNhc2UgMHgxOWM6IG1hcF9rZXlfY2xlYXIoS0VZX0xPR09GRik7CQlicmVhazsKKwkJY2FzZSAweDE5ZTogbWFwX2tleV9jbGVhcihLRVlfQ09GRkVFKTsJCWJyZWFrOworCQljYXNlIDB4MWE2OiBtYXBfa2V5X2NsZWFyKEtFWV9IRUxQKTsJCWJyZWFrOworCQljYXNlIDB4MWE3OiBtYXBfa2V5X2NsZWFyKEtFWV9ET0NVTUVOVFMpOwlicmVhazsKKwkJY2FzZSAweDFhYjogbWFwX2tleV9jbGVhcihLRVlfU1BFTExDSEVDSyk7CWJyZWFrOworCQljYXNlIDB4MWI2OiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7CQlicmVhazsKKwkJY2FzZSAweDFiNzogbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7CisJCWNhc2UgMHgxYmM6IG1hcF9rZXlfY2xlYXIoS0VZX01FU1NFTkdFUik7CWJyZWFrOworCQljYXNlIDB4MWJkOiBtYXBfa2V5X2NsZWFyKEtFWV9JTkZPKTsJCWJyZWFrOworCQljYXNlIDB4MjAxOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVcpOwkJYnJlYWs7CisJCWNhc2UgMHgyMDI6IG1hcF9rZXlfY2xlYXIoS0VZX09QRU4pOwkJYnJlYWs7CisJCWNhc2UgMHgyMDM6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOworCQljYXNlIDB4MjA0OiBtYXBfa2V5X2NsZWFyKEtFWV9FWElUKTsJCWJyZWFrOworCQljYXNlIDB4MjA3OiBtYXBfa2V5X2NsZWFyKEtFWV9TQVZFKTsJCWJyZWFrOworCQljYXNlIDB4MjA4OiBtYXBfa2V5X2NsZWFyKEtFWV9QUklOVCk7CQlicmVhazsKKwkJY2FzZSAweDIwOTogbWFwX2tleV9jbGVhcihLRVlfUFJPUFMpOwkJYnJlYWs7CisJCWNhc2UgMHgyMWE6IG1hcF9rZXlfY2xlYXIoS0VZX1VORE8pOwkJYnJlYWs7CisJCWNhc2UgMHgyMWI6IG1hcF9rZXlfY2xlYXIoS0VZX0NPUFkpOwkJYnJlYWs7CisJCWNhc2UgMHgyMWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NVVCk7CQlicmVhazsKKwkJY2FzZSAweDIxZDogbWFwX2tleV9jbGVhcihLRVlfUEFTVEUpOwkJYnJlYWs7CisJCWNhc2UgMHgyMWY6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTkQpOwkJYnJlYWs7CisJCWNhc2UgMHgyMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1NFQVJDSCk7CQlicmVhazsKKwkJY2FzZSAweDIyMjogbWFwX2tleV9jbGVhcihLRVlfR09UTyk7CQlicmVhazsKKwkJY2FzZSAweDIyMzogbWFwX2tleV9jbGVhcihLRVlfSE9NRVBBR0UpOwlicmVhazsKKwkJY2FzZSAweDIyNDogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKKwkJY2FzZSAweDIyNTogbWFwX2tleV9jbGVhcihLRVlfRk9SV0FSRCk7CQlicmVhazsKKwkJY2FzZSAweDIyNjogbWFwX2tleV9jbGVhcihLRVlfU1RPUCk7CQlicmVhazsKKwkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKKwkJY2FzZSAweDIyYTogbWFwX2tleV9jbGVhcihLRVlfQk9PS01BUktTKTsJYnJlYWs7CisJCWNhc2UgMHgyMmQ6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01JTik7CQlicmVhazsKKwkJY2FzZSAweDIyZTogbWFwX2tleV9jbGVhcihLRVlfWk9PTU9VVCk7CQlicmVhazsKKwkJY2FzZSAweDIyZjogbWFwX2tleV9jbGVhcihLRVlfWk9PTVJFU0VUKTsJYnJlYWs7CisJCWNhc2UgMHgyMzM6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTFVQKTsJYnJlYWs7CisJCWNhc2UgMHgyMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTERPV04pOwlicmVhazsKKwkJY2FzZSAweDIzODogbWFwX3JlbChSRUxfSFdIRUVMKTsJCWJyZWFrOworCQljYXNlIDB4MjVmOiBtYXBfa2V5X2NsZWFyKEtFWV9DQU5DRUwpOwkJYnJlYWs7CisJCWNhc2UgMHgyNzk6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7CisKKwkJY2FzZSAweDI4OTogbWFwX2tleV9jbGVhcihLRVlfUkVQTFkpOwkJYnJlYWs7CisJCWNhc2UgMHgyOGI6IG1hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkRNQUlMKTsJYnJlYWs7CisJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7CisKKwkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhJRF9VUF9IUFZFTkRPUjoJLyogUmVwb3J0ZWQgb24gYSBEdXRjaCBsYXlvdXQgSFA1MzA4ICovCisJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJY2FzZSAweDAyMTogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOyAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgwNzA6IG1hcF9rZXlfY2xlYXIoS0VZX0hQKTsJCWJyZWFrOworCQljYXNlIDB4MDcxOiBtYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwkJYnJlYWs7CisJCWNhc2UgMHgwNzI6IG1hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOworCQljYXNlIDB4MDczOiBtYXBfa2V5X2NsZWFyKEtFWV9RVUVTVElPTik7CWJyZWFrOworCQljYXNlIDB4MDgwOiBtYXBfa2V5X2NsZWFyKEtFWV9FTUFJTCk7CQlicmVhazsKKwkJY2FzZSAweDA4MTogbWFwX2tleV9jbGVhcihLRVlfQ0hBVCk7CQlicmVhazsKKwkJY2FzZSAweDA4MjogbWFwX2tleV9jbGVhcihLRVlfU0VBUkNIKTsJCWJyZWFrOworCQljYXNlIDB4MDgzOiBtYXBfa2V5X2NsZWFyKEtFWV9DT05ORUNUKTsJICAgICAgICBicmVhazsKKwkJY2FzZSAweDA4NDogbWFwX2tleV9jbGVhcihLRVlfRklOQU5DRSk7CQlicmVhazsKKwkJY2FzZSAweDA4NTogbWFwX2tleV9jbGVhcihLRVlfU1BPUlQpOwkJYnJlYWs7CisJCWNhc2UgMHgwODY6IG1hcF9rZXlfY2xlYXIoS0VZX1NIT1ApOwkgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSElEX1VQX01TVkVORE9SOgorCQlnb3RvIGlnbm9yZTsKKworCWNhc2UgSElEX1VQX0NVU1RPTTogLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggYW5kIEFwcGxlIFVTQiBrZXlib2FyZHMgKi8KKwkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CisJCWdvdG8gaWdub3JlOworCisJY2FzZSBISURfVVBfTE9HSVZFTkRPUjoKKwkJZ290byBpZ25vcmU7CisJCisJY2FzZSBISURfVVBfUElEOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJY2FzZSAweGE0OiBtYXBfa2V5X2NsZWFyKEJUTl9ERUFEKTsJYnJlYWs7CisJCWRlZmF1bHQ6IGdvdG8gaWdub3JlOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwl1bmtub3duOgorCQlpZiAoZmllbGQtPnJlcG9ydF9zaXplID09IDEpIHsKKwkJCWlmIChmaWVsZC0+cmVwb3J0LT50eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSB7CisJCQkJbWFwX2xlZChMRURfTUlTQyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQltYXBfa2V5KEJUTl9NSVNDKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSB7CisJCQltYXBfcmVsKFJFTF9NSVNDKTsKKwkJCWJyZWFrOworCQl9CisJCW1hcF9hYnMoQUJTX01JU0MpOworCQlicmVhazsKIAl9CiAKIG1hcHBlZDoKLQlpZiAoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfTUlHSFRZTU9VU0UpIHsKLQkJaWYgKHVzYWdlLT5oaWQgPT0gSElEX0dEX1opCi0JCQltYXBfcmVsKFJFTF9IV0hFRUwpOwotCQllbHNlIGlmICh1c2FnZS0+Y29kZSA9PSBCVE5fMSkKLQkJCW1hcF9rZXkoQlROXzIpOwotCQllbHNlIGlmICh1c2FnZS0+Y29kZSA9PSBCVE5fMikKLQkJCW1hcF9rZXkoQlROXzEpOwotCX0KLQotCWlmICgoZGV2aWNlLT5xdWlya3MgJiAoSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcgfCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSB8Ci0JCQlISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfQjgpKSAmJiAodXNhZ2UtPnR5cGUgPT0gRVZfUkVMKSAmJgotCQkJKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpCi0JCXNldF9iaXQoUkVMX0hXSEVFTCwgYml0KTsKLQotCWlmICgoKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUpICYmICh1c2FnZS0+aGlkID09IDB4MDAwOTAwMDUpKQotCQl8fCAoKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcpICYmICh1c2FnZS0+aGlkID09IDB4MDAwOTAwMDcpKSkKKwlpZiAoZGV2aWNlLT5kcml2ZXItPmlucHV0X21hcHBlZCAmJiBkZXZpY2UtPmRyaXZlci0+aW5wdXRfbWFwcGVkKGRldmljZSwKKwkJCQloaWRpbnB1dCwgZmllbGQsIHVzYWdlLCAmYml0LCAmbWF4KSA8IDApCiAJCWdvdG8gaWdub3JlOwogCi0JaWYgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUykgJiYKLQkJdXNhZ2UtPnR5cGUgPT0gRVZfS0VZICYmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSkKLQkJZmllbGQtPmZsYWdzICY9IH5ISURfTUFJTl9JVEVNX1JFTEFUSVZFOwotCiAJc2V0X2JpdCh1c2FnZS0+dHlwZSwgaW5wdXQtPmV2Yml0KTsKIAotCWlmIChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19EVVBMSUNBVEVfVVNBR0VTICYmCi0JCQkodXNhZ2UtPnR5cGUgPT0gRVZfS0VZIHx8Ci0JCQkgdXNhZ2UtPnR5cGUgPT0gRVZfUkVMIHx8Ci0JCQkgdXNhZ2UtPnR5cGUgPT0gRVZfQUJTKSkKLQkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCBiaXQpOwotCiAJd2hpbGUgKHVzYWdlLT5jb2RlIDw9IG1heCAmJiB0ZXN0X2FuZF9zZXRfYml0KHVzYWdlLT5jb2RlLCBiaXQpKQogCQl1c2FnZS0+Y29kZSA9IGZpbmRfbmV4dF96ZXJvX2JpdChiaXQsIG1heCArIDEsIHVzYWdlLT5jb2RlKTsKIApAQCAtODU4LDEwICs1ODUsNiBAQAogCWlmICghdXNhZ2UtPnR5cGUpCiAJCXJldHVybjsKIAotCS8qIGhhbmRsZSBpbnB1dCBldmVudHMgZm9yIHF1aXJreSBkZXZpY2VzICovCi0JaWYgKGhpZGlucHV0X2V2ZW50X3F1aXJrcyhoaWQsIGZpZWxkLCB1c2FnZSwgdmFsdWUpKQotCQlyZXR1cm47Ci0KIAlpZiAodXNhZ2UtPmhhdF9taW4gPCB1c2FnZS0+aGF0X21heCB8fCB1c2FnZS0+aGF0X2RpcikgewogCQlpbnQgaGF0X2RpciA9IHVzYWdlLT5oYXRfZGlyOwogCQlpZiAoIWhhdF9kaXIpCkBAIC05NjEsMTQgKzY4NCwxNCBAQAogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcmV0dXJuIGhpZC0+aGlkX29wZW4oaGlkKTsKKwlyZXR1cm4gaGlkLT5sbF9kcml2ZXItPm9wZW4oaGlkKTsKIH0KIAogc3RhdGljIHZvaWQgaGlkaW5wdXRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaGlkLT5oaWRfY2xvc2UoaGlkKTsKKwloaWQtPmxsX2RyaXZlci0+Y2xvc2UoaGlkKTsKIH0KIAogLyoKQEAgLTk3Nyw3ICs3MDAsNyBAQAogICogUmVhZCBhbGwgcmVwb3J0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgYWJzb2x1dGUgZmllbGQgdmFsdWVzLgogICovCiAKLWludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCitpbnQgaGlkaW5wdXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IE5VTEw7CkBAIC05ODUsMTkgKzcwOCwyMCBAQAogCWludCBpLCBqLCBrOwogCWludCBtYXhfcmVwb3J0X3R5cGUgPSBISURfT1VUUFVUX1JFUE9SVDsKIAotCWlmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19JR05PUkVfSElESU5QVVQpCi0JCXJldHVybiAtMTsKLQogCUlOSVRfTElTVF9IRUFEKCZoaWQtPmlucHV0cyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCi0JCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiB8fAotCQkgICAgaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gSElEX0NPTExFQ1RJT05fUEhZU0lDQUwpCi0JCQlpZiAoSVNfSU5QVVRfQVBQTElDQVRJT04oaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlKSkKLQkJCQlicmVhazsKKwlpZiAoIWZvcmNlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykgeworCQkJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2wgPSAmaGlkLT5jb2xsZWN0aW9uW2ldOworCQkJaWYgKGNvbC0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiB8fAorCQkJCQljb2wtPnR5cGUgPT0gSElEX0NPTExFQ1RJT05fUEhZU0lDQUwpCisJCQkJaWYgKElTX0lOUFVUX0FQUExJQ0FUSU9OKGNvbC0+dXNhZ2UpKQorCQkJCQlicmVhazsKKwkJfQogCi0JaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uICYmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19ISURJTlBVVCkgPT0gMCkKLQkJcmV0dXJuIC0xOworCQlpZiAoaSA9PSBoaWQtPm1heGNvbGxlY3Rpb24pCisJCQlyZXR1cm4gLTE7CisJfQogCiAJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMpCiAJCW1heF9yZXBvcnRfdHlwZSA9IEhJRF9JTlBVVF9SRVBPUlQ7CkBAIC0xMDE5LDcgKzc0Myw4IEBACiAJCQkJfQogCiAJCQkJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBoaWQpOwotCQkJCWlucHV0X2Rldi0+ZXZlbnQgPSBoaWQtPmhpZGlucHV0X2lucHV0X2V2ZW50OworCQkJCWlucHV0X2Rldi0+ZXZlbnQgPQorCQkJCQloaWQtPmxsX2RyaXZlci0+aGlkaW5wdXRfaW5wdXRfZXZlbnQ7CiAJCQkJaW5wdXRfZGV2LT5vcGVuID0gaGlkaW5wdXRfb3BlbjsKIAkJCQlpbnB1dF9kZXYtPmNsb3NlID0gaGlkaW5wdXRfY2xvc2U7CiAJCQkJaW5wdXRfZGV2LT5zZXRrZXljb2RlID0gaGlkaW5wdXRfc2V0a2V5Y29kZTsKQEAgLTEwMzIsNyArNzU3LDcgQEAKIAkJCQlpbnB1dF9kZXYtPmlkLnZlbmRvciAgPSBoaWQtPnZlbmRvcjsKIAkJCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBoaWQtPnByb2R1Y3Q7CiAJCQkJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gaGlkLT52ZXJzaW9uOwotCQkJCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9IGhpZC0+ZGV2OworCQkJCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9IGhpZC0+ZGV2LnBhcmVudDsKIAkJCQloaWRpbnB1dC0+aW5wdXQgPSBpbnB1dF9kZXY7CiAJCQkJbGlzdF9hZGRfdGFpbCgmaGlkaW5wdXQtPmxpc3QsICZoaWQtPmlucHV0cyk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGcuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmQ4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIGxvZ2l0ZWNoICJzcGVjaWFsIiBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OSBBbmRyZWFzIEdhbAorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA1IE1pY2hhZWwgSGFib3VzdGFrIDxtaWtlLUBjaW5jaS5yci5jb20+IGZvciBDb25jZXB0MiwgSW5jCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgUGF1bCBXYWxtc2xleQorICogIENvcHlyaWdodCAoYykgMjAwOCBKaXJpIFNsYWJ5CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorI2luY2x1ZGUgImhpZC1sZy5oIgorCisjZGVmaW5lIExHX1JERVNDCQkweDAwMQorI2RlZmluZSBMR19CQURfUkVMQVRJVkVfS0VZUwkweDAwMgorI2RlZmluZSBMR19EVVBMSUNBVEVfVVNBR0VTCTB4MDA0CisjZGVmaW5lIExHX1JFU0VUX0xFRFMJCTB4MDA4CisjZGVmaW5lIExHX0VYUEFOREVEX0tFWU1BUAkweDAxMAorI2RlZmluZSBMR19JR05PUkVfRE9VQkxFRF9XSEVFTAkweDAyMAorI2RlZmluZSBMR19XSVJFTEVTUwkJMHgwNDAKKyNkZWZpbmUgTEdfSU5WRVJUX0hXSEVFTAkweDA4MAorI2RlZmluZSBMR19OT0dFVAkJMHgxMDAKKyNkZWZpbmUgTEdfRkYJCQkweDIwMAorI2RlZmluZSBMR19GRjIJCQkweDQwMAorCisvKgorICogQ2VydGFpbiBMb2dpdGVjaCBrZXlib2FyZHMgc2VuZCBpbiByZXBvcnQgIzMga2V5cyB3aGljaCBhcmUgZmFyCisgKiBhYm92ZSB0aGUgbG9naWNhbCBtYXhpbXVtIGRlc2NyaWJlZCBpbiBkZXNjcmlwdG9yLiBUaGlzIGV4dGVuZHMKKyAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAweDI4YyBvZiBsb2dpY2FsIG1heGltdW0gdG8gMHgxMDRkCisgKi8KK3N0YXRpYyB2b2lkIGxnX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgocXVpcmtzICYgTEdfUkRFU0MpICYmIHJzaXplID49IDkwICYmIHJkZXNjWzgzXSA9PSAweDI2ICYmCisJCQlyZGVzY1s4NF0gPT0gMHg4YyAmJiByZGVzY1s4NV0gPT0gMHgwMikgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIExvZ2l0ZWNoIGtleWJvYXJkIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1s4NF0gPSByZGVzY1s4OV0gPSAweDRkOworCQlyZGVzY1s4NV0gPSByZGVzY1s5MF0gPSAweDEwOworCX0KK30KKworI2RlZmluZSBsZ19tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQlFVl9LRVksIChjKSkKKworc3RhdGljIGludCBsZ191bHRyYXhfcmVtb3RlX21hcHBpbmcoc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0xPR0lWRU5ET1IpCisJCXJldHVybiAwOworCisJc2V0X2JpdChFVl9SRVAsIGhpLT5pbnB1dC0+ZXZiaXQpOworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCS8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIFVsdHJhIFggTWVkaWEgUmVtb3RlICovCisJY2FzZSAweDAwNDogbGdfbWFwX2tleV9jbGVhcihLRVlfQUdBSU4pOwlicmVhazsKKwljYXNlIDB4MDBkOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9IT01FKTsJCWJyZWFrOworCWNhc2UgMHgwMjQ6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1NIVUZGTEUpOwlicmVhazsKKwljYXNlIDB4MDI1OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9UVik7CQlicmVhazsKKwljYXNlIDB4MDI2OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NRU5VKTsJCWJyZWFrOworCWNhc2UgMHgwMzE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsJYnJlYWs7CisJY2FzZSAweDAzMjogbGdfbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKKwljYXNlIDB4MDMzOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOworCWNhc2UgMHgwNDc6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKKwljYXNlIDB4MDQ4OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7CisJY2FzZSAweDA0OTogbGdfbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwlicmVhazsKKwljYXNlIDB4MDRhOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CWJyZWFrOworCWNhc2UgMHgwNGI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0FOR0xFKTsJYnJlYWs7CisJY2FzZSAweDA0YzogbGdfbWFwX2tleV9jbGVhcihLRVlfTEFOR1VBR0UpOwlicmVhazsKKwljYXNlIDB4MDRkOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TVUJUSVRMRSk7CWJyZWFrOworCWNhc2UgMHgwNTE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKKwljYXNlIDB4MDUyOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxnX3dpcmVsZXNzX21hcHBpbmcoc3RydWN0IGhpZF9pbnB1dCAqaGksIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gSElEX1VQX0NPTlNVTUVSKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHgxMDAxOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwkJYnJlYWs7CisJY2FzZSAweDEwMDM6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsJCWJyZWFrOworCWNhc2UgMHgxMDA0OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9WSURFTyk7CQlicmVhazsKKwljYXNlIDB4MTAwNTogbGdfbWFwX2tleV9jbGVhcihLRVlfQVVESU8pOwkJYnJlYWs7CisJY2FzZSAweDEwMGE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7CQlicmVhazsKKwljYXNlIDB4MTAxMTogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJFVklPVVNTT05HKTsJYnJlYWs7CisJY2FzZSAweDEwMTI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX05FWFRTT05HKTsJCWJyZWFrOworCWNhc2UgMHgxMDEzOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwkJYnJlYWs7CisJY2FzZSAweDEwMTQ6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01FU1NFTkdFUik7CQlicmVhazsKKwljYXNlIDB4MTAxNTogbGdfbWFwX2tleV9jbGVhcihLRVlfUkVDT1JEKTsJCWJyZWFrOworCWNhc2UgMHgxMDE2OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QTEFZRVIpOwkJYnJlYWs7CisJY2FzZSAweDEwMTc6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0VKRUNUQ0QpOwkJYnJlYWs7CisJY2FzZSAweDEwMTg6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01FRElBKTsJCWJyZWFrOworCWNhc2UgMHgxMDE5OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKKwljYXNlIDB4MTAxYTogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7CisJY2FzZSAweDEwMWI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOworCWNhc2UgMHgxMDFmOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9aT09NSU4pOwkJYnJlYWs7CisJY2FzZSAweDEwMjA6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1pPT01PVVQpOwkJYnJlYWs7CisJY2FzZSAweDEwMjE6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1pPT01SRVNFVCk7CQlicmVhazsKKwljYXNlIDB4MTAyMzogbGdfbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwkJYnJlYWs7CisJY2FzZSAweDEwMjc6IGxnX21hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7CisJLyogdGhpcyBvbmUgaXMgbWFya2VkIGFzICdSb3RhdGUnICovCisJY2FzZSAweDEwMjg6IGxnX21hcF9rZXlfY2xlYXIoS0VZX0FOR0xFKTsJCWJyZWFrOworCWNhc2UgMHgxMDI5OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TSFVGRkxFKTsJCWJyZWFrOworCWNhc2UgMHgxMDJhOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9CQUNLKTsJCWJyZWFrOworCWNhc2UgMHgxMDJiOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9DWUNMRVdJTkRPV1MpOwlicmVhazsKKwljYXNlIDB4MTA0MTogbGdfbWFwX2tleV9jbGVhcihLRVlfQkFUVEVSWSk7CQlicmVhazsKKwljYXNlIDB4MTA0MjogbGdfbWFwX2tleV9jbGVhcihLRVlfV09SRFBST0NFU1NPUik7CWJyZWFrOworCWNhc2UgMHgxMDQzOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TUFJFQURTSEVFVCk7CQlicmVhazsKKwljYXNlIDB4MTA0NDogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJFU0VOVEFUSU9OKTsJYnJlYWs7CisJY2FzZSAweDEwNDU6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1VORE8pOwkJYnJlYWs7CisJY2FzZSAweDEwNDY6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1JFRE8pOwkJYnJlYWs7CisJY2FzZSAweDEwNDc6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BSSU5UKTsJCWJyZWFrOworCWNhc2UgMHgxMDQ4OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9TQVZFKTsJCWJyZWFrOworCWNhc2UgMHgxMDQ5OiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKKwljYXNlIDB4MTA0YTogbGdfbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7CisJY2FzZSAweDEwNGI6IGxnX21hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOworCWNhc2UgMHgxMDRjOiBsZ19tYXBfa2V5X2NsZWFyKEtFWV9QUk9HNCk7CQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsZ19pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwkvKiBleHRlbmRlZCBtYXBwaW5nIGZvciBjZXJ0YWluIExvZ2l0ZWNoIGhhcmR3YXJlIChMb2dpdGVjaCBjb3JkbGVzcworCSAgIGRlc2t0b3AgTFg1MDApICovCisJc3RhdGljIGNvbnN0IHU4IGVfa2V5bWFwW10gPSB7CisJCSAgMCwyMTYsICAwLDIxMywxNzUsMTU2LCAgMCwgIDAsICAwLCAgMCwKKwkJMTQ0LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsMjEyLAorCQkxNzQsMTY3LDE1MiwxNjEsMTEyLCAgMCwgIDAsICAwLDE1NCwgIDAsCisJCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCQkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJCSAgMCwgIDAsICAwLCAgMCwgIDAsMTgzLDE4NCwxODUsMTg2LDE4NywKKwkJMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LCAgMCwgIDAsICAwCisJfTsKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaGlkID0gdXNhZ2UtPmhpZDsKKworCWlmIChoZGV2LT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIgJiYKKwkJCWxnX3VsdHJheF9yZW1vdGVfbWFwcGluZyhoaSwgdXNhZ2UsIGJpdCwgbWF4KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKHF1aXJrcyAmIExHX1dJUkVMRVNTKSAmJiBsZ193aXJlbGVzc19tYXBwaW5nKGhpLCB1c2FnZSwgYml0LCBtYXgpKQorCQlyZXR1cm4gMTsKKworCWlmICgoaGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9CVVRUT04pCisJCXJldHVybiAwOworCisJaGlkICY9IEhJRF9VU0FHRTsKKworCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIExvZ2l0ZWNoIENvcmRsZXNzIERlc2t0b3AgKi8KKwlpZiAoZmllbGQtPmFwcGxpY2F0aW9uID09IEhJRF9HRF9NT1VTRSkgeworCQlpZiAoKHF1aXJrcyAmIExHX0lHTk9SRV9ET1VCTEVEX1dIRUVMKSAmJgorCQkJCShoaWQgPT0gNyB8fCBoaWQgPT0gOCkpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJaWYgKChxdWlya3MgJiBMR19FWFBBTkRFRF9LRVlNQVApICYmCisJCQkJaGlkIDwgQVJSQVlfU0laRShlX2tleW1hcCkgJiYKKwkJCQllX2tleW1hcFtoaWRdICE9IDApIHsKKwkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwgRVZfS0VZLAorCQkJCQllX2tleW1hcFtoaWRdKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdfaW5wdXRfbWFwcGVkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgocXVpcmtzICYgTEdfQkFEX1JFTEFUSVZFX0tFWVMpICYmIHVzYWdlLT50eXBlID09IEVWX0tFWSAmJgorCQkJKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpKQorCQlmaWVsZC0+ZmxhZ3MgJj0gfkhJRF9NQUlOX0lURU1fUkVMQVRJVkU7CisKKwlpZiAoKHF1aXJrcyAmIExHX0RVUExJQ0FURV9VU0FHRVMpICYmICh1c2FnZS0+dHlwZSA9PSBFVl9LRVkgfHwKKwkJCSB1c2FnZS0+dHlwZSA9PSBFVl9SRUwgfHwgdXNhZ2UtPnR5cGUgPT0gRVZfQUJTKSkKKwkJY2xlYXJfYml0KHVzYWdlLT5jb2RlLCAqYml0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gKHVuc2lnbmVkIGxvbmcpaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKChxdWlya3MgJiBMR19JTlZFUlRfSFdIRUVMKSAmJiB1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSB7CisJCWlucHV0X2V2ZW50KGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwKKwkJCQktdmFsdWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGludCBjb25uZWN0X21hc2sgPSBISURfQ09OTkVDVF9ERUZBVUxUOworCWludCByZXQ7CisKKwloaWRfc2V0X2RydmRhdGEoaGRldiwgKHZvaWQgKilxdWlya3MpOworCisJaWYgKHF1aXJrcyAmIExHX05PR0VUKQorCQloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX05PR0VUOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlpZiAocXVpcmtzICYgKExHX0ZGIHwgTEdfRkYyKSkKKwkJY29ubmVjdF9tYXNrICY9IH5ISURfQ09OTkVDVF9GRjsKKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBjb25uZWN0X21hc2spOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlpZiAocXVpcmtzICYgTEdfUkVTRVRfTEVEUykKKwkJdXNiaGlkX3NldF9sZWRzKGhkZXYpOworCisJaWYgKHF1aXJrcyAmIExHX0ZGKQorCQlsZ2ZmX2luaXQoaGRldik7CisJaWYgKHF1aXJrcyAmIExHX0ZGMikKKwkJbGcyZmZfaW5pdChoZGV2KTsKKworCXJldHVybiAwOworZXJyX2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGxnX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfUkRFU0MgfCBMR19XSVJFTEVTUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfUkRFU0MgfCBMR19XSVJFTEVTUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSXzIpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19SREVTQyB8IExHX1dJUkVMRVNTIH0sCisKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19CQURfUkVMQVRJVkVfS0VZUyB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRFVQTElDQVRFX1VTQUdFUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRSksCisJCS5kcml2ZXJfZGF0YSA9IExHX0RVUExJQ0FURV9VU0FHRVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX01JTkkpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19EVVBMSUNBVEVfVVNBR0VTIH0sCisKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JEKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfUkVTRVRfTEVEUyB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VMSVRFX0tCRCksCisJCS5kcml2ZXJfZGF0YSA9IExHX0lHTk9SRV9ET1VCTEVEX1dIRUVMIHwgTEdfRVhQQU5ERURfS0VZTUFQIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDApLAorCQkuZHJpdmVyX2RhdGEgPSBMR19JR05PUkVfRE9VQkxFRF9XSEVFTCB8IExHX0VYUEFOREVEX0tFWU1BUCB9LAorCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0xYMyksCisJCS5kcml2ZXJfZGF0YSA9IExHX0lOVkVSVF9IV0hFRUwgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVjE1MCksCisJCS5kcml2ZXJfZGF0YSA9IExHX0lOVkVSVF9IV0hFRUwgfSwKKworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FWFRSRU1FXzNEKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfTk9HRVQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19OT0dFVCB8IExHX0ZGIH0sCisKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRkYgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEMl8yKSwKKwkJLmRyaXZlcl9kYXRhID0gTEdfRkYgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0lOR01BTl9GM0QpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19GRiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9GT1JDRTNEX1BSTyksCisJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19GRiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMMiksCisJCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIpLAorCQkuZHJpdmVyX2RhdGEgPSBMR19GRjIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgbGdfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBsZ19kcml2ZXIgPSB7CisJLm5hbWUgPSAibG9naXRlY2giLAorCS5pZF90YWJsZSA9IGxnX2RldmljZXMsCisJLnJlcG9ydF9maXh1cCA9IGxnX3JlcG9ydF9maXh1cCwKKwkuaW5wdXRfbWFwcGluZyA9IGxnX2lucHV0X21hcHBpbmcsCisJLmlucHV0X21hcHBlZCA9IGxnX2lucHV0X21hcHBlZCwKKwkuZXZlbnQgPSBsZ19ldmVudCwKKwkucHJvYmUgPSBsZ19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbGdfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZsZ19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBsZ19leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZsZ19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChsZ19pbml0KTsKK21vZHVsZV9leGl0KGxnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKGxvZ2l0ZWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZy5oIGIvZHJpdmVycy9oaWQvaGlkLWxnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhZTc1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19ISURfTEdfSAorI2RlZmluZSBfX0hJRF9MR19ICisKKyNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgorCisjaWZkZWYgQ09ORklHX0xPR0lURUNIX0ZGCitpbnQgbGdmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBsZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpIHsgcmV0dXJuIC0xOyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRgoraW50IGxnMmZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGxnMmZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpIHsgcmV0dXJuIC0xOyB9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZzJmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNmRjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqICBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBMb2dpdGVjaCBSdW1ibGVwYWQgMgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKworI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKyNpbmNsdWRlICJoaWQtbGcuaCIKKworc3RydWN0IGxnMmZmX2RldmljZSB7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKK307CisKK3N0YXRpYyBpbnQgcGxheV9lZmZlY3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAorCQkJIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbGcyZmZfZGV2aWNlICpsZzJmZiA9IGRhdGE7CisJaW50IHdlYWssIHN0cm9uZzsKKworCXN0cm9uZyA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKKwl3ZWFrID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKworCWlmICh3ZWFrIHx8IHN0cm9uZykgeworCQl3ZWFrID0gd2VhayAqIDB4ZmYgLyAweGZmZmY7CisJCXN0cm9uZyA9IHN0cm9uZyAqIDB4ZmYgLyAweGZmZmY7CisKKwkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHg1MTsKKwkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzJdID0gd2VhazsKKwkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzRdID0gc3Ryb25nOworCX0gZWxzZSB7CisJCWxnMmZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4ZjM7CisJCWxnMmZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7CisJCWxnMmZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDA7CisJfQorCisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBsZzJmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsZzJmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGxnMmZmX2RldmljZSAqbGcyZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CisJaW50IGVycm9yOworCisJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKworCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm91dHB1dCByZXBvcnQgaXMgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDcpIHsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlsZzJmZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZzJmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxnMmZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKKworCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCBsZzJmZiwgcGxheV9lZmZlY3QpOworCWlmIChlcnJvcikgeworCQlrZnJlZShsZzJmZik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlsZzJmZi0+cmVwb3J0ID0gcmVwb3J0OworCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHhmMzsKKwlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsxXSA9IDB4MDA7CisJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOworCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKKwlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDA7CisJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNV0gPSAweDAwOworCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzZdID0gMHgwMDsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggUnVtYmxlcGFkIDIgYnkgIgorCSAgICAgICAiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZ2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhZmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZ2ZmLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBoaWQtY29tcGxpYW50IGZvciBzb21lIG9mIHRoZSBkZXZpY2VzIGZyb20KKyAqIExvZ2l0ZWNoLCBuYW1lbHk6CisgKiAtIFdpbmdNYW4gQ29yZGxlc3MgUnVtYmxlUGFkCisgKiAtIFdpbmdNYW4gRm9yY2UgM0QKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSm9oYW5uIERlbmV1eAorICogIENvcHlyaWdodCAoYykgMjAwNiBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBieQorICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPGpvaGFubi5kZW5ldXhAaXQudXUuc2U+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisKKyNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCisjaW5jbHVkZSAiaGlkLWxnLmgiCisKK3N0cnVjdCBkZXZfdHlwZSB7CisJdTE2IGlkVmVuZG9yOworCXUxNiBpZFByb2R1Y3Q7CisJY29uc3Qgc2lnbmVkIHNob3J0ICpmZjsKK307CisKK3N0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgZmZfcnVtYmxlW10gPSB7CisJRkZfUlVNQkxFLAorCS0xCit9OworCitzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IGZmX2pveXN0aWNrW10gPSB7CisJRkZfQ09OU1RBTlQsCisJLTEKK307CisKK3N0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgZmZfd2hlZWxbXSA9IHsKKwlGRl9DT05TVEFOVCwKKwlGRl9BVVRPQ0VOVEVSLAorCS0xCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl90eXBlIGRldmljZXNbXSA9IHsKKwl7IDB4MDQ2ZCwgMHhjMjExLCBmZl9ydW1ibGUgfSwKKwl7IDB4MDQ2ZCwgMHhjMjE5LCBmZl9ydW1ibGUgfSwKKwl7IDB4MDQ2ZCwgMHhjMjgzLCBmZl9qb3lzdGljayB9LAorCXsgMHgwNDZkLCAweGMyODYsIGZmX2pveXN0aWNrIH0sCisJeyAweDA0NmQsIDB4YzI5NCwgZmZfam95c3RpY2sgfSwKKwl7IDB4MDQ2ZCwgMHhjMjk1LCBmZl9qb3lzdGljayB9LAorCXsgMHgwNDZkLCAweGNhMDMsIGZmX3doZWVsIH0sCit9OworCitzdGF0aWMgaW50IGhpZF9sZ2ZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3QgPSAmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKwlpbnQgeCwgeTsKKwl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQ7CisKKyNkZWZpbmUgQ0xBTVAoeCkgaWYgKHggPCAwKSB4ID0gMDsgaWYgKHggPiAweGZmKSB4ID0gMHhmZgorCisJc3dpdGNoIChlZmZlY3QtPnR5cGUpIHsKKwljYXNlIEZGX0NPTlNUQU5UOgorCQl4ID0gZWZmZWN0LT51LnJhbXAuc3RhcnRfbGV2ZWwgKyAweDdmOwkvKiAweDdmIGlzIGNlbnRlciAqLworCQl5ID0gZWZmZWN0LT51LnJhbXAuZW5kX2xldmVsICsgMHg3ZjsKKwkJQ0xBTVAoeCk7CisJCUNMQU1QKHkpOworCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4NTE7CisJCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHgwODsKKwkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSB4OworCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IHk7CisJCWRiZ19oaWQoIih4LCB5KT0oJTA0eCwgJTA0eClcbiIsIHgsIHkpOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQlicmVhazsKKworCWNhc2UgRkZfUlVNQkxFOgorCQlyaWdodCA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKKwkJbGVmdCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CisJCXJpZ2h0ID0gcmlnaHQgKiAweGZmIC8gMHhmZmZmOworCQlsZWZ0ID0gbGVmdCAqIDB4ZmYgLyAweGZmZmY7CisJCUNMQU1QKGxlZnQpOworCQlDTEFNUChyaWdodCk7CisJCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHg0MjsKKwkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDAwOworCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IGxlZnQ7CisJCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gcmlnaHQ7CisJCWRiZ19oaWQoIihsZWZ0LCByaWdodCk9KCUwNHgsICUwNHgpXG4iLCBsZWZ0LCByaWdodCk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGlkX2xnZmZfc2V0X2F1dG9jZW50ZXIoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1MTYgbWFnbml0dWRlKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CisJX19zMzIgKnZhbHVlID0gcmVwb3J0LT5maWVsZFswXS0+dmFsdWU7CisJbWFnbml0dWRlID0gKG1hZ25pdHVkZSA+PiAxMikgJiAweGY7CisJKnZhbHVlKysgPSAweGZlOworCSp2YWx1ZSsrID0gMHgwZDsKKwkqdmFsdWUrKyA9IG1hZ25pdHVkZTsgICAvKiBjbG9ja3dpc2Ugc3RyZW5ndGggKi8KKwkqdmFsdWUrKyA9IG1hZ25pdHVkZTsgICAvKiBjb3VudGVyLWNsb2Nrd2lzZSBzdHJlbmd0aCAqLworCSp2YWx1ZSsrID0gMHg4MDsKKwkqdmFsdWUrKyA9IDB4MDA7CisJKnZhbHVlID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworfQorCitpbnQgbGdmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlKiBoaWQpCit7CisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2VudHJ5KGhpZC0+aW5wdXRzLm5leHQsIHN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhpZGlucHV0LT5pbnB1dDsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOworCWNvbnN0IHNpZ25lZCBzaG9ydCAqZmZfYml0cyA9IGZmX2pveXN0aWNrOworCWludCBlcnJvcjsKKwlpbnQgaTsKKworCS8qIEZpbmQgdGhlIHJlcG9ydCB0byB1c2UgKi8KKwlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKKwkJZXJyX2hpZCgiTm8gb3V0cHV0IHJlcG9ydCBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgcmVwb3J0IGxvb2tzIG9rICovCisJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOworCWlmICghcmVwb3J0KSB7CisJCWVycl9oaWQoIk5VTEwgb3V0cHV0IHJlcG9ydCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOworCWlmICghZmllbGQpIHsKKwkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7IGkrKykgeworCQlpZiAoZGV2LT5pZC52ZW5kb3IgPT0gZGV2aWNlc1tpXS5pZFZlbmRvciAmJgorCQkgICAgZGV2LT5pZC5wcm9kdWN0ID09IGRldmljZXNbaV0uaWRQcm9kdWN0KSB7CisJCQlmZl9iaXRzID0gZGV2aWNlc1tpXS5mZjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgZmZfYml0c1tpXSA+PSAwOyBpKyspCisJCXNldF9iaXQoZmZfYml0c1tpXSwgZGV2LT5mZmJpdCk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgTlVMTCwgaGlkX2xnZmZfcGxheSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIHRlc3RfYml0KEZGX0FVVE9DRU5URVIsIGRldi0+ZmZiaXQpICkKKwkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGdmZl9zZXRfYXV0b2NlbnRlcjsKKworCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBmb3JjZSBmZWVkYmFjayBkZXZpY2VzIGJ5IEpvaGFubiBEZW5ldXggPGpvaGFubi5kZW5ldXhAaXQudXUuc2U+XG4iKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jIGIvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MThiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiAgSElEIGRyaXZlciBmb3Igc29tZSBtaWNyb3NvZnQgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2RlZmluZSBNU19ISURJTlBVVAkweDAxCisjZGVmaW5lIE1TX0VSR09OT01ZCTB4MDIKKyNkZWZpbmUgTVNfUFJFU0VOVEVSCTB4MDQKKyNkZWZpbmUgTVNfUkRFU0MJMHgwOAorI2RlZmluZSBNU19OT0dFVAkweDEwCisKKy8qCisgKiBNaWNyb3NvZnQgV2lyZWxlc3MgRGVza3RvcCBSZWNlaXZlciAoTW9kZWwgMTAyOCkgaGFzIHNldmVyYWwKKyAqICdVc2FnZSBNaW4vTWF4JyB3aGVyZSBpdCBvdWdodCB0byBoYXZlICdQaHlzaWNhbCBNaW4vTWF4JworICovCitzdGF0aWMgdm9pZCBtc19yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAorCQl1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoKHF1aXJrcyAmIE1TX1JERVNDKSAmJiByc2l6ZSA9PSA1NzEgJiYgcmRlc2NbMjg0XSA9PSAweDE5ICYmCisJCQlyZGVzY1syODZdID09IDB4MmEgJiYgcmRlc2NbMzA0XSA9PSAweDE5ICYmCisJCQlyZGVzY1szMDZdID09IDB4MjkgJiYgcmRlc2NbMzUyXSA9PSAweDFhICYmCisJCQlyZGVzY1szNTVdID09IDB4MmEgJiYgcmRlc2NbNTU3XSA9PSAweDE5ICYmCisJCQlyZGVzY1s1NTldID09IDB4MjkpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBNaWNyb3NvZnQgV2lyZWxlc3MgUmVjZWl2ZXIgIgorCQkJCSJNb2RlbCAxMDI4IHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKKwkJcmRlc2NbMjg0XSA9IHJkZXNjWzMwNF0gPSByZGVzY1s1NTddID0gMHgzNTsKKwkJcmRlc2NbMzUyXSA9IDB4MzY7CisJCXJkZXNjWzI4Nl0gPSByZGVzY1szNTVdID0gMHg0NjsKKwkJcmRlc2NbMzA2XSA9IHJkZXNjWzU1OV0gPSAweDQ1OworCX0KK30KKworI2RlZmluZSBtc19tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgbXNfZXJnb25vbXlfa2JfcXVpcmsoc3RydWN0IGhpZF9pbnB1dCAqaGksIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGhpLT5pbnB1dDsKKworCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCWNhc2UgMHhmZDA2OiBtc19tYXBfa2V5X2NsZWFyKEtFWV9DSEFUKTsJYnJlYWs7CisJY2FzZSAweGZkMDc6IG1zX21hcF9rZXlfY2xlYXIoS0VZX1BIT05FKTsJYnJlYWs7CisJY2FzZSAweGZmMDU6CisJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQltc19tYXBfa2V5X2NsZWFyKEtFWV9GMTMpOworCQlzZXRfYml0KEtFWV9GMTQsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTUsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTYsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTcsIGlucHV0LT5rZXliaXQpOworCQlzZXRfYml0KEtFWV9GMTgsIGlucHV0LT5rZXliaXQpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc19wcmVzZW50ZXJfOGtfcXVpcmsoc3RydWN0IGhpZF9pbnB1dCAqaGksIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlzZXRfYml0KEVWX1JFUCwgaGktPmlucHV0LT5ldmJpdCk7CisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJY2FzZSAweGZkMDg6IG1zX21hcF9rZXlfY2xlYXIoS0VZX0ZPUldBUkQpOwlicmVhazsKKwljYXNlIDB4ZmQwOTogbXNfbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CWJyZWFrOworCWNhc2UgMHhmZDBiOiBtc19tYXBfa2V5X2NsZWFyKEtFWV9QTEFZUEFVU0UpOwlicmVhazsKKwljYXNlIDB4ZmQwZTogbXNfbWFwX2tleV9jbGVhcihLRVlfQ0xPU0UpOwlicmVhazsKKwljYXNlIDB4ZmQwZjogbXNfbWFwX2tleV9jbGVhcihLRVlfUExBWSk7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtc19pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfTVNWRU5ET1IpCisJCXJldHVybiAwOworCisJaWYgKHF1aXJrcyAmIE1TX0VSR09OT01ZKSB7CisJCWludCByZXQgPSBtc19lcmdvbm9teV9rYl9xdWlyayhoaSwgdXNhZ2UsIGJpdCwgbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChxdWlya3MgJiBNU19QUkVTRU5URVIpICYmCisJCQltc19wcmVzZW50ZXJfOGtfcXVpcmsoaGksIHVzYWdlLCBiaXQsIG1heCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBxdWlya3MgPSAodW5zaWduZWQgbG9uZyloaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoIShoZGV2LT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpIHx8ICFmaWVsZC0+aGlkaW5wdXQgfHwKKwkJCSF1c2FnZS0+dHlwZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBIYW5kbGluZyBNUyBrZXlib2FyZHMgc3BlY2lhbCBidXR0b25zICovCisJaWYgKHF1aXJrcyAmIE1TX0VSR09OT01ZICYmIHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9NU1ZFTkRPUiB8IDB4ZmYwNSkpIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBmaWVsZC0+aGlkaW5wdXQtPmlucHV0OworCQlzdGF0aWMgdW5zaWduZWQgaW50IGxhc3Rfa2V5ID0gMDsKKwkJdW5zaWduZWQgaW50IGtleSA9IDA7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSAweDAxOiBrZXkgPSBLRVlfRjE0OyBicmVhazsKKwkJY2FzZSAweDAyOiBrZXkgPSBLRVlfRjE1OyBicmVhazsKKwkJY2FzZSAweDA0OiBrZXkgPSBLRVlfRjE2OyBicmVhazsKKwkJY2FzZSAweDA4OiBrZXkgPSBLRVlfRjE3OyBicmVhazsKKwkJY2FzZSAweDEwOiBrZXkgPSBLRVlfRjE4OyBicmVhazsKKwkJfQorCQlpZiAoa2V5KSB7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIGtleSwgMSk7CisJCQlsYXN0X2tleSA9IGtleTsKKwkJfSBlbHNlCisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIGxhc3Rfa2V5LCAwKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwloaWRfc2V0X2RydmRhdGEoaGRldiwgKHZvaWQgKilxdWlya3MpOworCisJaWYgKHF1aXJrcyAmIE1TX05PR0VUKQorCQloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX05PR0VUOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8ICgocXVpcmtzICYgTVNfSElESU5QVVQpID8KKwkJCQlISURfQ09OTkVDVF9ISURJTlBVVF9GT1JDRSA6IDApKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgbXNfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfU0lERVdJTkRFUl9HViksCisJCS5kcml2ZXJfZGF0YSA9IE1TX0hJRElOUFVUIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ORTRLKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfRVJHT05PTVkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0xLNkspLAorCQkuZHJpdmVyX2RhdGEgPSBNU19FUkdPTk9NWSB8IE1TX1JERVNDIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19QUkVTRU5URVJfOEtfVVNCKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfUFJFU0VOVEVSIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfTk9HRVQgfSwKKworCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUKSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfUFJFU0VOVEVSIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG1zX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbXNfZHJpdmVyID0geworCS5uYW1lID0gIm1pY3Jvc29mdCIsCisJLmlkX3RhYmxlID0gbXNfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gbXNfcmVwb3J0X2ZpeHVwLAorCS5pbnB1dF9tYXBwaW5nID0gbXNfaW5wdXRfbWFwcGluZywKKwkuZXZlbnQgPSBtc19ldmVudCwKKwkucHJvYmUgPSBtc19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgbXNfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZtc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBtc19leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZtc19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtc19pbml0KTsKK21vZHVsZV9leGl0KG1zX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKG1pY3Jvc29mdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1tb250ZXJleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTg1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgbW9udGVyZXkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKK3N0YXRpYyB2b2lkIG1yX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMzAgJiYgcmRlc2NbMjldID09IDB4MDUgJiYgcmRlc2NbMzBdID09IDB4MDkpIHsKKwkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBidXR0b24vY29uc3VtZXIgaW4gSElEIHJlcG9ydCAiCisJCQkJImRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1szMF0gPSAweDBjOworCX0KK30KKworI2RlZmluZSBtcl9tYXBfa2V5X2NsZWFyKGMpCWhpZF9tYXBfdXNhZ2VfY2xlYXIoaGksIHVzYWdlLCBiaXQsIG1heCwgXAorCQkJCQlFVl9LRVksIChjKSkKK3N0YXRpYyBpbnQgbXJfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJaWYgKCh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpICE9IEhJRF9VUF9DT05TVU1FUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwljYXNlIDB4MTU2OiBtcl9tYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7CisJY2FzZSAweDE1NzogbXJfbWFwX2tleV9jbGVhcihLRVlfU1BSRUFEU0hFRVQpOwkJYnJlYWs7CisJY2FzZSAweDE1ODogbXJfbWFwX2tleV9jbGVhcihLRVlfUFJFU0VOVEFUSU9OKTsJCWJyZWFrOworCWNhc2UgMHgxNWM6IG1yX21hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIG1yX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9OVEVSRVksIFVTQl9ERVZJQ0VfSURfR0VOSVVTX0tCMjlFKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBtcl9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIG1yX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtb250ZXJleSIsCisJLmlkX3RhYmxlID0gbXJfZGV2aWNlcywKKwkucmVwb3J0X2ZpeHVwID0gbXJfcmVwb3J0X2ZpeHVwLAorCS5pbnB1dF9tYXBwaW5nID0gbXJfaW5wdXRfbWFwcGluZywKK307CisKK3N0YXRpYyBpbnQgbXJfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZtcl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBtcl9leGl0KHZvaWQpCit7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZtcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtcl9pbml0KTsKK21vZHVsZV9leGl0KG1yX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitISURfQ09NUEFUX0xPQURfRFJJVkVSKG1vbnRlcmV5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jIGIvZHJpdmVycy9oaWQvaGlkLXBldGFseW54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5NDVmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgcGV0YWx5bnggInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qIFBldGFseW54IE1heHRlciBSZW1vdGUgaGFzIG1heGltdW0gZm9yIGNvbnN1bWVyIHBhZ2Ugc2V0IHRvbyBsb3cgKi8KK3N0YXRpYyB2b2lkIHBsX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gNjAgJiYgcmRlc2NbMzldID09IDB4MmEgJiYgcmRlc2NbNDBdID09IDB4ZjUgJiYKKwkJCXJkZXNjWzQxXSA9PSAweDAwICYmIHJkZXNjWzU5XSA9PSAweDI2ICYmCisJCQlyZGVzY1s2MF0gPT0gMHhmOSAmJiByZGVzY1s2MV0gPT0gMHgwMCkgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFBldGFseW54IE1heHRlciBSZW1vdGUgcmVwb3J0ICIKKwkJCQkiZGVzY3JpcHRvclxuIik7CisJCXJkZXNjWzYwXSA9IDB4ZmE7CisJCXJkZXNjWzQwXSA9IDB4ZmE7CisJfQorfQorCisjZGVmaW5lIHBsX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCBwbF9pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0xPR0lWRU5ET1IpIHsKKwkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCWNhc2UgMHgwNWE6IHBsX21hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOwkJYnJlYWs7CisJCWNhc2UgMHgwNWI6IHBsX21hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKKwkJY2FzZSAweDA1YzogcGxfbWFwX2tleV9jbGVhcihLRVlfR1JFRU4pOwlicmVhazsKKwkJY2FzZSAweDA1ZDogcGxfbWFwX2tleV9jbGVhcihLRVlfWUVMTE9XKTsJYnJlYWs7CisJCWNhc2UgMHgwNWU6IHBsX21hcF9rZXlfY2xlYXIoS0VZX0JMVUUpOwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0NPTlNVTUVSKSB7CisJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCQljYXNlIDB4MGY2OiBwbF9tYXBfa2V5X2NsZWFyKEtFWV9ORVhUKTsJCWJyZWFrOworCQljYXNlIDB4MGZhOiBwbF9tYXBfa2V5X2NsZWFyKEtFWV9CQUNLKTsJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT0dFVDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBwbF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BFVEFMWU5YLCBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHBsX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgcGxfZHJpdmVyID0geworCS5uYW1lID0gInBldGFseW54IiwKKwkuaWRfdGFibGUgPSBwbF9kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBwbF9yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBpbmcgPSBwbF9pbnB1dF9tYXBwaW5nLAorCS5wcm9iZSA9IHBsX3Byb2JlLAorfTsKKworc3RhdGljIGludCBwbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnBsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBsX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBsX2luaXQpOworbW9kdWxlX2V4aXQocGxfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIocGV0YWx5bngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBsLmMgYi9kcml2ZXJzL2hpZC9oaWQtcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Q4MTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiAgRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgUGFudGhlckxvcmQvR3JlZW5Bc2lhIGJhc2VkIGRldmljZXMKKyAqCisgKiAgVGhlIGRldmljZXMgYXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHZhcmlvdXMgbmFtZXMgYW5kIHRoZSBzYW1lIFVTQiBkZXZpY2UgSUQKKyAqICBjYW4gYmUgdXNlZCBpbiBib3RoIGFkYXB0ZXJzIGFuZCBhY3R1YWwgZ2FtZSBjb250cm9sbGVycy4KKyAqCisgKiAgMDgxMDowMDAxICJUd2luIFVTQiBKb3lzdGljayIKKyAqICAgLSB0ZXN0ZWQgd2l0aCBQYW50aGVyTG9yZCBVU0IvUFMyIDJpbjEgQWRhcHRlcgorICogICAtIGNvbnRhaW5zIHR3byByZXBvcnRzLCBvbmUgZm9yIGVhY2ggcG9ydCAoSElEX1FVSVJLX01VTFRJX0lOUFVUKQorICoKKyAqICAwZThmOjAwMDMgIkdyZWVuQXNpYSBJbmMuICAgIFVTQiBKb3lzdGljayAgICAgIgorICogICAtIHRlc3RlZCB3aXRoIEs/P25nIEdhbWluZyBnYW1lcGFkCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNyBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKy8qICNkZWZpbmUgREVCVUcgKi8KKworI2RlZmluZSBkZWJ1Zyhmb3JtYXQsIGFyZy4uLikgcHJfZGVidWcoImhpZC1wbGZmOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworI2lmZGVmIENPTkZJR19QQU5USEVSTE9SRF9GRgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKworc3RydWN0IHBsZmZfZGV2aWNlIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworfTsKKworc3RhdGljIGludCBoaWRfcGxmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHBsZmZfZGV2aWNlICpwbGZmID0gZGF0YTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlsZWZ0ID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCXJpZ2h0ID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKwlkZWJ1ZygiY2FsbGVkIHdpdGggMHglMDR4IDB4JTA0eCIsIGxlZnQsIHJpZ2h0KTsKKworCWxlZnQgPSBsZWZ0ICogMHg3ZiAvIDB4ZmZmZjsKKwlyaWdodCA9IHJpZ2h0ICogMHg3ZiAvIDB4ZmZmZjsKKworCXBsZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzJdID0gbGVmdDsKKwlwbGZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IHJpZ2h0OworCWRlYnVnKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeCIsIGxlZnQsIHJpZ2h0KTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBsZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHBsZmZfZGV2aWNlICpwbGZmOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3QgPQorCQkJJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9wdHIgPSByZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CisJaW50IGVycm9yOworCisJLyogVGhlIGRldmljZSBjb250YWlucyBvbmUgb3V0cHV0IHJlcG9ydCBwZXIgcGh5c2ljYWwgZGV2aWNlLCBhbGwKKwkgICBjb250YWluaW5nIDEgZmllbGQsIHdoaWNoIGNvbnRhaW5zIDQgZmYwMC4wMDAyIHVzYWdlcyBhbmQgNCAxNmJpdAorCSAgIGFic29sdXRlIHZhbHVlcy4KKworCSAgIFRoZSBpbnB1dCByZXBvcnRzIGFsc28gY29udGFpbiBhIGZpZWxkIHdoaWNoIGNvbnRhaW5zCisJICAgOCBmZjAwLjAwMDEgdXNhZ2VzIGFuZCA4IGJvb2xlYW4gdmFsdWVzLiBUaGVpciBtZWFuaW5nIGlzCisJICAgY3VycmVudGx5IHVua25vd24uICovCisKKwlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGlkaW5wdXQsICZoaWQtPmlucHV0cywgbGlzdCkgeworCisJCXJlcG9ydF9wdHIgPSByZXBvcnRfcHRyLT5uZXh0OworCisJCWlmIChyZXBvcnRfcHRyID09IHJlcG9ydF9saXN0KSB7CisJCQlkZXZfZXJyKCZoaWQtPmRldiwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgIgorCQkJCQkibWlzc2luZ1xuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOworCQlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKKwkJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNCkgeworCQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlwbGZmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsZmZfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGxmZikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWRldiA9IGhpZGlucHV0LT5pbnB1dDsKKworCQlzZXRfYml0KEZGX1JVTUJMRSwgZGV2LT5mZmJpdCk7CisKKwkJZXJyb3IgPSBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyhkZXYsIHBsZmYsIGhpZF9wbGZmX3BsYXkpOworCQlpZiAoZXJyb3IpIHsKKwkJCWtmcmVlKHBsZmYpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJcGxmZi0+cmVwb3J0ID0gcmVwb3J0OworCQlwbGZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4MDA7CisJCXBsZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHgwMDsKKwkJcGxmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOworCQlwbGZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IDB4MDA7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGxmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisJfQorCisJZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSAiCisJICAgICAgICJkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwbGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHBsX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCWlmIChpZC0+ZHJpdmVyX2RhdGEpCisJCWhkZXYtPnF1aXJrcyB8PSBISURfUVVJUktfTVVMVElfSU5QVVQ7CisKKwlyZXQgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGZmX2luaXQoaGRldik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgcGxfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUiksCisJCS5kcml2ZXJfZGF0YSA9IDEgfSwgLyogVHdpbiBVU0IgSm95c3RpY2sgKi8KKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1JFRU5BU0lBLCAweDAwMDMpLCB9LCAvKiBHcmVlbkFzaWEgSW5jLiBVU0IgSm95c3RpY2sgKi8KKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgcGxfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBwbF9kcml2ZXIgPSB7CisJLm5hbWUgPSAicGFudGhlcmxvcmQiLAorCS5pZF90YWJsZSA9IHBsX2RldmljZXMsCisJLnByb2JlID0gcGxfcHJvYmUsCit9OworCitzdGF0aWMgaW50IHBsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmcGxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGxfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcGxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGxfaW5pdCk7Cittb2R1bGVfZXhpdChwbF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihwYW50aGVybG9yZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jIGIvZHJpdmVycy9oaWQvaGlkLXNhbXN1bmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYzYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNhbXN1bmcuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIHNhbXN1bmcgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qCisgKiBTYW1zdW5nIElyREEgcmVtb3RlIGNvbnRyb2xsZXIgKHJlcG9ydHMgYXMgQ3lwcmVzcyBVU0IgTW91c2UpLgorICoKKyAqIFZlbmRvciBzcGVjaWZpYyByZXBvcnQgIzQgaGFzIGEgc2l6ZSBvZiA0OCBiaXQsCisgKiBhbmQgdGhlcmVmb3JlIGlzIG5vdCBhY2NlcHRlZCB3aGVuIGluc3BlY3RpbmcgdGhlIGRlc2NyaXB0b3JzLgorICogQXMgYSB3b3JrYXJvdW5kIHdlIHJlaW50ZXJwcmV0IHRoZSByZXBvcnQgYXM6CisgKiAgIFZhcmlhYmxlIHR5cGUsIGNvdW50IDYsIHNpemUgOCBiaXQsIGxvZy4gbWF4aW11bSAyNTUKKyAqIFRoZSBidXJkZW4gdG8gcmVjb25zdHJ1Y3QgdGhlIGRhdGEgaXMgbW92ZWQgaW50byB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBzYW1zdW5nX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCisJCXVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMTgyICYmIHJkZXNjWzE3NV0gPT0gMHgyNSAmJiByZGVzY1sxNzZdID09IDB4NDAgJiYKKwkJCXJkZXNjWzE3N10gPT0gMHg3NSAmJiByZGVzY1sxNzhdID09IDB4MzAgJiYKKwkJCXJkZXNjWzE3OV0gPT0gMHg5NSAmJiByZGVzY1sxODBdID09IDB4MDEgJiYKKwkJCXJkZXNjWzE4Ml0gPT0gMHg0MCkgeworCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFNhbXN1bmcgSXJEQSByZXBvcnQgIgorCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJcmRlc2NbMTc2XSA9IDB4ZmY7CisJCXJkZXNjWzE3OF0gPSAweDA4OworCQlyZGVzY1sxODBdID0gMHgwNjsKKwkJcmRlc2NbMTgyXSA9IDB4NDI7CisJfQorfQorCitzdGF0aWMgaW50IHNhbXN1bmdfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgKEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfSElESU5QVVQpIHwKKwkJCUhJRF9DT05ORUNUX0hJRERFVl9GT1JDRSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCXJldHVybiAwOworZXJyX2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIHNhbXN1bmdfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TQU1TVU5HLCBVU0JfREVWSUNFX0lEX1NBTVNVTkdfSVJfUkVNT1RFKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBzYW1zdW5nX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgc2Ftc3VuZ19kcml2ZXIgPSB7CisJLm5hbWUgPSAic2Ftc3VuZyIsCisJLmlkX3RhYmxlID0gc2Ftc3VuZ19kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBzYW1zdW5nX3JlcG9ydF9maXh1cCwKKwkucHJvYmUgPSBzYW1zdW5nX3Byb2JlLAorfTsKKworc3RhdGljIGludCBzYW1zdW5nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmc2Ftc3VuZ19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBzYW1zdW5nX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNhbXN1bmdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2Ftc3VuZ19pbml0KTsKK21vZHVsZV9leGl0KHNhbXN1bmdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoc2Ftc3VuZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc29ueS5jIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY4MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqICBISUQgZHJpdmVyIGZvciBzb21lIHNvbnkgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qCisgKiBTZW5kaW5nIEhJRF9SRVFfR0VUX1JFUE9SVCBjaGFuZ2VzIHRoZSBvcGVyYXRpb24gbW9kZSBvZiB0aGUgcHMzIGNvbnRyb2xsZXIKKyAqIHRvICJvcGVyYXRpb25hbCIuICBXaXRob3V0IHRoaXMsIHRoZSBwczMgY29udHJvbGxlciB3aWxsIG5vdCByZXBvcnQgYW55CisgKiBldmVudHMuCisgKi8KK3N0YXRpYyBpbnQgc29ueV9zZXRfb3BlcmF0aW9uYWwoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCV9fdTE2IGlmbnVtID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlpbnQgcmV0OworCWNoYXIgKmJ1ZiA9IGttYWxsb2MoMTgsIEdGUF9LRVJORUwpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkJIEhJRF9SRVFfR0VUX1JFUE9SVCwKKwkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgKDMgPDwgOCkgfCAweGYyLCBpZm51bSwgYnVmLCAxNywKKwkJCQkgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBzZXQgb3BlcmF0aW9uYWwgbW9kZVxuIik7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb255X3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgfAorCQkJSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmV0ID0gc29ueV9zZXRfb3BlcmF0aW9uYWwoaGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfc3RvcDsKKworCXJldHVybiAwOworZXJyX3N0b3A6CisJaGlkX2h3X3N0b3AoaGRldik7CitlcnJfZnJlZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgc29ueV9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NPTlksIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUikgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgc29ueV9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIHNvbnlfZHJpdmVyID0geworCS5uYW1lID0gInNvbnkiLAorCS5pZF90YWJsZSA9IHNvbnlfZGV2aWNlcywKKwkucHJvYmUgPSBzb255X3Byb2JlLAorfTsKKworc3RhdGljIGludCBzb255X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmc29ueV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBzb255X2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc29ueV9pbml0KTsKK21vZHVsZV9leGl0KHNvbnlfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoc29ueSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jIGIvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE2OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgc3VucGx1cyAic3BlY2lhbCIgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImhpZC1pZHMuaCIKKworc3RhdGljIHZvaWQgc3BfcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKKwkJdW5zaWduZWQgaW50IHJzaXplKQoreworCWlmIChyc2l6ZSA+PSAxMDcgJiYgcmRlc2NbMTA0XSA9PSAweDI2ICYmIHJkZXNjWzEwNV0gPT0gMHg4MCAmJgorCQkJcmRlc2NbMTA2XSA9PSAweDAzKSB7CisJCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgU3VucGx1cyBXaXJlbGVzcyBEZXNrdG9wICIKKwkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQlyZGVzY1sxMDVdID0gcmRlc2NbMTEwXSA9IDB4MDM7CisJCXJkZXNjWzEwNl0gPSByZGVzY1sxMTFdID0gMHgyMTsKKwl9Cit9CisKKyNkZWZpbmUgc3BfbWFwX2tleV9jbGVhcihjKQloaWRfbWFwX3VzYWdlX2NsZWFyKGhpLCB1c2FnZSwgYml0LCBtYXgsIFwKKwkJRVZfS0VZLCAoYykpCitzdGF0aWMgaW50IHNwX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSAhPSBISURfVVBfQ09OU1VNRVIpCisJCXJldHVybiAwOworCisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJY2FzZSAweDIwMDM6IHNwX21hcF9rZXlfY2xlYXIoS0VZX1pPT01JTik7CQlicmVhazsKKwljYXNlIDB4MjEwMzogc3BfbWFwX2tleV9jbGVhcihLRVlfWk9PTU9VVCk7CWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIHNwX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU1VOUExVUywgVVNCX0RFVklDRV9JRF9TVU5QTFVTX1dERVNLVE9QKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBzcF9kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIHNwX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzdW5wbHVzIiwKKwkuaWRfdGFibGUgPSBzcF9kZXZpY2VzLAorCS5yZXBvcnRfZml4dXAgPSBzcF9yZXBvcnRfZml4dXAsCisJLmlucHV0X21hcHBpbmcgPSBzcF9pbnB1dF9tYXBwaW5nLAorfTsKKworc3RhdGljIGludCBzcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnNwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHNwX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNwX2luaXQpOworbW9kdWxlX2V4aXQoc3BfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoc3VucGx1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdjYmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIHZhcmlvdXMgSElEIGNvbXBsaWFudCBkZXZpY2VzIGJ5IFRocnVzdE1hc3RlcjoKKyAqICAgIFRocnVzdE1hc3RlciBGaXJlU3Rvcm0gRHVhbCBQb3dlciAyCisgKiBhbmQgcG9zc2libHkgb3RoZXJzIHdob3NlIGRldmljZSBpZHMgaGF2ZW4ndCBiZWVuIGFkZGVkLgorICoKKyAqICBNb2RpZmllZCB0byBzdXBwb3J0IFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggVmVyaXR1c2UKKyAqICBvbiAyMDAzLTAxLTI1IGZyb20gdGhlIExvZ2l0ZWNoIGZvcmNlIGZlZWRiYWNrIGRyaXZlciwKKyAqICB3aGljaCBpcyBieSBKb2hhbm4gRGVuZXV4LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgWmlueCBWZXJpdHVzZSA8emlueEBlcGljc29sLm9yZz4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgSm9oYW5uIERlbmV1eAorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgorCisvKiBVc2FnZXMgZm9yIHRocnVzdG1hc3RlciBkZXZpY2VzIEkga25vdyBhYm91dCAqLworI2RlZmluZSBUSFJVU1RNQVNURVJfVVNBR0VfRkYJKEhJRF9VUF9HRU5ERVNLIHwgMHhiYikKKworc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCBmZl9ydW1ibGVbXSA9IHsKKwlGRl9SVU1CTEUsCisJLTEKK307CisKK3N0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgZmZfam95c3RpY2tbXSA9IHsKKwlGRl9DT05TVEFOVCwKKwktMQorfTsKKworc3RydWN0IHRtZmZfZGV2aWNlIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfZmllbGQgKmZmX2ZpZWxkOworfTsKKworLyogQ2hhbmdlcyB2YWx1ZXMgZnJvbSAwIHRvIDB4ZmZmZiBpbnRvIHZhbHVlcyBmcm9tIG1pbmltdW0gdG8gbWF4aW11bSAqLworc3RhdGljIGlubGluZSBpbnQgdG1mZl9zY2FsZV91MTYodW5zaWduZWQgaW50IGluLCBpbnQgbWluaW11bSwgaW50IG1heGltdW0pCit7CisJaW50IHJldDsKKworCXJldCA9IChpbiAqIChtYXhpbXVtIC0gbWluaW11bSkgLyAweGZmZmYpICsgbWluaW11bTsKKwlpZiAocmV0IDwgbWluaW11bSkKKwkJcmV0dXJuIG1pbmltdW07CisJaWYgKHJldCA+IG1heGltdW0pCisJCXJldHVybiBtYXhpbXVtOworCXJldHVybiByZXQ7Cit9CisKKy8qIENoYW5nZXMgdmFsdWVzIGZyb20gLTB4ODAgdG8gMHg3ZiBpbnRvIHZhbHVlcyBmcm9tIG1pbmltdW0gdG8gbWF4aW11bSAqLworc3RhdGljIGlubGluZSBpbnQgdG1mZl9zY2FsZV9zOChpbnQgaW4sIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gKCgoaW4gKyAweDgwKSAqIChtYXhpbXVtIC0gbWluaW11bSkpIC8gMHhmZikgKyBtaW5pbXVtOworCWlmIChyZXQgPCBtaW5pbXVtKQorCQlyZXR1cm4gbWluaW11bTsKKwlpZiAocmV0ID4gbWF4aW11bSkKKwkJcmV0dXJuIG1heGltdW07CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0bWZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRtZmZfZGV2aWNlICp0bWZmID0gZGF0YTsKKwlzdHJ1Y3QgaGlkX2ZpZWxkICpmZl9maWVsZCA9IHRtZmYtPmZmX2ZpZWxkOworCWludCB4LCB5OworCWludCBsZWZ0LCByaWdodDsJLyogUnVtYmxpbmcgKi8KKworCXN3aXRjaCAoZWZmZWN0LT50eXBlKSB7CisJY2FzZSBGRl9DT05TVEFOVDoKKwkJeCA9IHRtZmZfc2NhbGVfczgoZWZmZWN0LT51LnJhbXAuc3RhcnRfbGV2ZWwsCisJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCisJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOworCQl5ID0gdG1mZl9zY2FsZV9zOChlZmZlY3QtPnUucmFtcC5lbmRfbGV2ZWwsCisJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCisJCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOworCisJCWRiZ19oaWQoIih4LCB5KT0oJTA0eCwgJTA0eClcbiIsIHgsIHkpOworCQlmZl9maWVsZC0+dmFsdWVbMF0gPSB4OworCQlmZl9maWVsZC0+dmFsdWVbMV0gPSB5OworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHRtZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQlicmVhazsKKworCWNhc2UgRkZfUlVNQkxFOgorCQlsZWZ0ID0gdG1mZl9zY2FsZV91MTYoZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZSwKKwkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWluaW11bSwKKwkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWF4aW11bSk7CisJCXJpZ2h0ID0gdG1mZl9zY2FsZV91MTYoZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlLAorCQkJCQlmZl9maWVsZC0+bG9naWNhbF9taW5pbXVtLAorCQkJCQlmZl9maWVsZC0+bG9naWNhbF9tYXhpbXVtKTsKKworCQlkYmdfaGlkKCIobGVmdCxyaWdodCk9KCUwOHgsICUwOHgpXG4iLCBsZWZ0LCByaWdodCk7CisJCWZmX2ZpZWxkLT52YWx1ZVswXSA9IGxlZnQ7CisJCWZmX2ZpZWxkLT52YWx1ZVsxXSA9IHJpZ2h0OworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHRtZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG1mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGNvbnN0IHNpZ25lZCBzaG9ydCAqZmZfYml0cykKK3sKKwlzdHJ1Y3QgdG1mZl9kZXZpY2UgKnRtZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCQlzdHJ1Y3QgaGlkX2lucHV0LCBsaXN0KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CisJaW50IGVycm9yOworCWludCBpOworCisJdG1mZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bWZmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdG1mZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCisJcmVwb3J0X2xpc3QgPSAmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsIHJlcG9ydF9saXN0LCBsaXN0KSB7CisJCWludCBmaWVsZG51bTsKKworCQlmb3IgKGZpZWxkbnVtID0gMDsgZmllbGRudW0gPCByZXBvcnQtPm1heGZpZWxkOyArK2ZpZWxkbnVtKSB7CisJCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCA9IHJlcG9ydC0+ZmllbGRbZmllbGRudW1dOworCisJCQlpZiAoZmllbGQtPm1heHVzYWdlIDw9IDApCisJCQkJY29udGludWU7CisKKwkJCXN3aXRjaCAoZmllbGQtPnVzYWdlWzBdLmhpZCkgeworCQkJY2FzZSBUSFJVU1RNQVNURVJfVVNBR0VfRkY6CisJCQkJaWYgKGZpZWxkLT5yZXBvcnRfY291bnQgPCAyKSB7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKKwkJCQkJCSJ3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWF4aW11bSA9PQorCQkJCQkJZmllbGQtPmxvZ2ljYWxfbWluaW11bSkgeworCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyBGRiBmaWVsZCAiCisJCQkJCQkJIndpdGggbG9naWNhbF9tYXhpbXVtICIKKwkJCQkJCQkiPT0gbG9naWNhbF9taW5pbXVtXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKHRtZmYtPnJlcG9ydCAmJiB0bWZmLT5yZXBvcnQgIT0gcmVwb3J0KSB7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKKwkJCQkJCQkiaW4gb3RoZXIgcmVwb3J0XG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKHRtZmYtPmZmX2ZpZWxkICYmIHRtZmYtPmZmX2ZpZWxkICE9IGZpZWxkKSB7CisJCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nICIKKwkJCQkJCQkiZHVwbGljYXRlIEZGIGZpZWxkXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJdG1mZi0+cmVwb3J0ID0gcmVwb3J0OworCQkJCXRtZmYtPmZmX2ZpZWxkID0gZmllbGQ7CisKKwkJCQlmb3IgKGkgPSAwOyBmZl9iaXRzW2ldID49IDA7IGkrKykKKwkJCQkJc2V0X2JpdChmZl9iaXRzW2ldLCBpbnB1dF9kZXYtPmZmYml0KTsKKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIHVua25vd24gb3V0cHV0ICIKKwkJCQkJCSJ1c2FnZSAlMDh4XG4iLAorCQkJCQkJZmllbGQtPnVzYWdlWzBdLmhpZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXRtZmYtPnJlcG9ydCkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgImNhbid0IGZpbmQgRkYgZmllbGQgaW4gb3V0cHV0IHJlcG9ydHNcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGlucHV0X2RldiwgdG1mZiwgdG1mZl9wbGF5KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCWRldl9pbmZvKCZoaWQtPmRldiwgImZvcmNlIGZlZWRiYWNrIGZvciBUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBieSBaaW54ICIKKwkJCSJWZXJpdHVzZSA8emlueEBlcGljc29sLm9yZz4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZSh0bWZmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgdG1fcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJdG1mZl9pbml0KGhkZXYsICh2b2lkICopaWQtPmRyaXZlcl9kYXRhKTsKKworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB0bV9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiMzAwKSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmZfcnVtYmxlIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiMzA0KSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmZfcnVtYmxlIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RIUlVTVE1BU1RFUiwgMHhiNjUxKSwJLyogRkdUIFJ1bWJsZSBGb3JjZSBXaGVlbCAqLworCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZylmZl9ydW1ibGUgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVEhSVVNUTUFTVEVSLCAweGI2NTQpLAkvKiBGR1QgRm9yY2UgRmVlZGJhY2sgV2hlZWwgKi8KKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmZfam95c3RpY2sgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgdG1fZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciB0bV9kcml2ZXIgPSB7CisJLm5hbWUgPSAidGhydXN0bWFzdGVyIiwKKwkuaWRfdGFibGUgPSB0bV9kZXZpY2VzLAorCS5wcm9iZSA9IHRtX3Byb2JlLAorfTsKKworc3RhdGljIGludCB0bV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnRtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHRtX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnRtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRtX2luaXQpOworbW9kdWxlX2V4aXQodG1fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIodGhydXN0bWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhODJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIFplcm9wbHVzIGJhc2VkIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCisKK3N0cnVjdCB6cGZmX2RldmljZSB7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKK307CisKK3N0YXRpYyBpbnQgenBmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHpwZmZfZGV2aWNlICp6cGZmID0gZGF0YTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgaXMgc3BlY2lmaWVkIHRoZSBvdGhlciB3YXkgYXJvdW5kIGluIHRoZSBaZXJvcGx1cworCSAqIGRhdGFzaGVldCBidXQgdGhlIG9yZGVyIGJlbG93IGlzIGNvcnJlY3QgZm9yIHRoZSBYRlggRXhlY3V0aW9uZXI7CisJICogaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBYRlggRXhlY3V0aW9uZXIgaXMgYW4gZXhjZXB0aW9uCisJICovCisKKwlsZWZ0ID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCXJpZ2h0ID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKwlkYmdfaGlkKCJjYWxsZWQgd2l0aCAweCUwNHggMHglMDR4XG4iLCBsZWZ0LCByaWdodCk7CisKKwlsZWZ0ID0gbGVmdCAqIDB4N2YgLyAweGZmZmY7CisJcmlnaHQgPSByaWdodCAqIDB4N2YgLyAweGZmZmY7CisKKwl6cGZmLT5yZXBvcnQtPmZpZWxkWzJdLT52YWx1ZVswXSA9IGxlZnQ7CisJenBmZi0+cmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF0gPSByaWdodDsKKwlkYmdfaGlkKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeFxuIiwgbGVmdCwgcmlnaHQpOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgenBmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6cGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgenBmZl9kZXZpY2UgKnpwZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CisJaW50IGVycm9yOworCisJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKworCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgNCkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggZmllbGRzIGluIHJlcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXpwZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgenBmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXpwZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJc2V0X2JpdChGRl9SVU1CTEUsIGRldi0+ZmZiaXQpOworCisJZXJyb3IgPSBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyhkZXYsIHpwZmYsIHpwZmZfcGxheSk7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKHpwZmYpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJenBmZi0+cmVwb3J0ID0gcmVwb3J0OworCXpwZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMDsKKwl6cGZmLT5yZXBvcnQtPmZpZWxkWzFdLT52YWx1ZVswXSA9IDB4MDI7CisJenBmZi0+cmVwb3J0LT5maWVsZFsyXS0+dmFsdWVbMF0gPSAweDAwOworCXpwZmYtPnJlcG9ydC0+ZmllbGRbM10tPnZhbHVlWzBdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHpwZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZGV2X2luZm8oJmhpZC0+ZGV2LCAiZm9yY2UgZmVlZGJhY2sgZm9yIFplcm9wbHVzIGJhc2VkIGRldmljZXMgYnkgIgorCSAgICAgICAiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpwX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXpwZmZfaW5pdChoZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB6cF9kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1pFUk9QTFVTLCAweDAwMzApIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHpwX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgenBfZHJpdmVyID0geworCS5uYW1lID0gInplcm9wbHVzIiwKKwkuaWRfdGFibGUgPSB6cF9kZXZpY2VzLAorCS5wcm9iZSA9IHpwX3Byb2JlLAorfTsKKworc3RhdGljIGludCB6cF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnpwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHpwX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnpwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHpwX2luaXQpOworbW9kdWxlX2V4aXQoenBfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIoemVyb3BsdXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkcmF3LmMgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwppbmRleCBjNDBmMDQwLi5hZjNlZGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWRyYXcuYworKysgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJaWYgKCFkZXYtPmhpZF9vdXRwdXRfcmF3X3JlcG9ydCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoY291bnQgPiBISURfTUlOX0JVRkZFUl9TSVpFKSB7CisJaWYgKGNvdW50ID4gSElEX01BWF9CVUZGRVJfU0laRSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWRyYXc6IHBpZCAlZCBwYXNzZWQgdG9vIGxhcmdlIHJlcG9ydFxuIiwKIAkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTgxLDcgKzE4MSw3IEBACiAKIAlkZXYgPSBoaWRyYXdfdGFibGVbbWlub3JdOwogCWlmICghZGV2LT5vcGVuKyspCi0JCWRldi0+aGlkLT5oaWRfb3BlbihkZXYtPmhpZCk7CisJCWRldi0+aGlkLT5sbF9kcml2ZXItPm9wZW4oZGV2LT5oaWQpOwogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZtaW5vcnNfbG9jayk7CkBAIC0yMDcsNyArMjA3LDcgQEAKIAlkZXYgPSBoaWRyYXdfdGFibGVbbWlub3JdOwogCWlmICghZGV2LT5vcGVuLS0pIHsKIAkJaWYgKGxpc3QtPmhpZHJhdy0+ZXhpc3QpCi0JCQlkZXYtPmhpZC0+aGlkX2Nsb3NlKGRldi0+aGlkKTsKKwkJCWRldi0+aGlkLT5sbF9kcml2ZXItPmNsb3NlKGRldi0+aGlkKTsKIAkJZWxzZQogCQkJa2ZyZWUobGlzdC0+aGlkcmF3KTsKIAl9CkBAIC0zMjYsOSArMzI2LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoaGlkcmF3X2NsYXNzLCBOVUxMLAotCQkJCQkgTUtERVYoaGlkcmF3X21ham9yLCBtaW5vciksIE5VTEwsCi0JCQkJCSAiJXMlZCIsICJoaWRyYXciLCBtaW5vcik7CisJZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlKGhpZHJhd19jbGFzcywgTlVMTCwgTUtERVYoaGlkcmF3X21ham9yLCBtaW5vciksCisJCQkJIE5VTEwsICIlcyVkIiwgImhpZHJhdyIsIG1pbm9yKTsKIAogCWlmIChJU19FUlIoZGV2LT5kZXYpKSB7CiAJCXNwaW5fbG9jaygmbWlub3JzX2xvY2spOwpAQCAtMzY3LDcgKzM2Niw3IEBACiAJZGV2aWNlX2Rlc3Ryb3koaGlkcmF3X2NsYXNzLCBNS0RFVihoaWRyYXdfbWFqb3IsIGhpZHJhdy0+bWlub3IpKTsKIAogCWlmIChoaWRyYXctPm9wZW4pIHsKLQkJaGlkLT5oaWRfY2xvc2UoaGlkKTsKKwkJaGlkLT5sbF9kcml2ZXItPmNsb3NlKGhpZCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGlkcmF3LT53YWl0KTsKIAl9IGVsc2UgewogCQlrZnJlZShoaWRyYXcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwppbmRleCAxOGYwOTEwLi41ZDlhYTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwpAQCAtMjQsODggKzI0LDEzIEBACiBjb21tZW50ICJJbnB1dCBjb3JlIHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgSElEIGlucHV0IGxheWVyIG9yIEhJREJQIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElEICYmIElOUFVUPW4KIAotY29uZmlnIFVTQl9ISURJTlBVVF9QT1dFUkJPT0sKLQlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgQXBwbGUgbGFwdG9wL2FsdW1pbnVtIFVTQiBzcGVjaWFsIGtleXMiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgc3BlY2lhbCBrZXlzIChGbiwgTnVtbG9jaykgb24KLQkgIEFwcGxlIGlCb29rcywgUG93ZXJCb29rcywgTWFjQm9va3MsIE1hY0Jvb2sgUHJvcyBhbmQgYWx1bWludW0gVVNCCi0JICBrZXlib2FyZHMuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBISURfRkYKLQlib29sICJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX0hJRCAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlzIHlvdSB3YW50IGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGEgZmV3IEhJRCBkZXZpY2VzLgotCSAgU2VlIGJlbG93IGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCi0KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L2ZmLnR4dD4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcmNlCi0JICBmZWVkYmFjayBBUEkuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBISURfUElECiAJYm9vbCAiUElEIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBJRC1jb21wbGlhbnQgZGV2aWNlIGFuZCB3aXNoIHRvIGVuYWJsZSBmb3JjZQogCSAgZmVlZGJhY2sgZm9yIGl0LiBNaWNyb3NvZnQgU2lkZXdpbmRlciBGb3JjZSBGZWVkYmFjayAyIGlzIG9uZSBvZiBzdWNoCiAJICBkZXZpY2VzLgogCi1jb25maWcgTE9HSVRFQ0hfRkYKLQlib29sICJMb2dpdGVjaCBkZXZpY2VzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UgZGV2aWNlczoKLQkgIC0gTG9naXRlY2ggV2luZ01hbiBDb3JkbGVzcyBSdW1ibGVQYWQKLQkgIC0gTG9naXRlY2ggV2luZ01hbiBDb3JkbGVzcyBSdW1ibGVQYWQgMgotCSAgLSBMb2dpdGVjaCBXaW5nTWFuIEZvcmNlIDNECi0JICAtIExvZ2l0ZWNoIEZvcm11bGEgRm9yY2UgRVgKLQkgIC0gTG9naXRlY2ggTU9NTyBGb3JjZSB3aGVlbAotCi0JICBhbmQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIGZvciB0aGVtLgotCSAgTm90ZTogaWYgeW91IHNheSBOIGhlcmUsIHRoaXMgZGV2aWNlIHdpbGwgc3RpbGwgYmUgc3VwcG9ydGVkLCBidXQgd2l0aG91dAotCSAgZm9yY2UgZmVlZGJhY2suCi0KLWNvbmZpZyBMT0dJUlVNQkxFUEFEMl9GRgotCWJvb2wgIkxvZ2l0ZWNoIFJ1bWJsZXBhZCAyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgTG9naXRlY2gKLQkgIFJ1bWJsZXBhZCAyIGRldmljZXMuCi0KLWNvbmZpZyBQQU5USEVSTE9SRF9GRgotCWJvb2wgIlBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhJRF9GRgotCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUGFudGhlckxvcmQvR3JlZW5Bc2lhIGJhc2VkIGdhbWUgY29udHJvbGxlcgotCSAgb3IgYWRhcHRlciBhbmQgd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCi0KLWNvbmZpZyBUSFJVU1RNQVNURVJfRkYKLQlib29sICJUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCi0Jc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MgaWYgVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBUSFJVU1RNQVNURVIgRmlyZVN0b3JlIER1YWwgUG93ZXIgMiBvcgotCSAgYSBUSFJVU1RNQVNURVIgRmVycmFyaSBHVCBSdW1ibGUgRm9yY2Ugb3IgRm9yY2UgRmVlZGJhY2sgV2hlZWwsCi0JICBhbmQgd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCi0JICBOb3RlOiBpZiB5b3Ugc2F5IE4gaGVyZSwgdGhpcyBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB3aXRob3V0Ci0JICBmb3JjZSBmZWVkYmFjay4KLQotY29uZmlnIFpFUk9QTFVTX0ZGCi0JYm9vbCAiWmVyb3BsdXMgYmFzZWQgZ2FtZSBjb250cm9sbGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFplcm9wbHVzIGJhc2VkIGdhbWUgY29udHJvbGxlciBhbmQgd2FudCB0bwotCSAgZW5hYmxlIGZvcmNlIGZlZWRiYWNrIGZvciBpdC4KLQogY29uZmlnIFVTQl9ISURERVYKIAlib29sICIvZGV2L2hpZGRldiByYXcgSElEIGRldmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX0hJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlCmluZGV4IDAwYTdiNzAuLjEzMjllY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKQEAgLTEzLDI0ICsxMyw2IEBACiBpZmVxICgkKENPTkZJR19ISURfUElEKSx5KQogCXVzYmhpZC1vYmpzCSs9IGhpZC1waWRmZi5vCiBlbmRpZgotaWZlcSAoJChDT05GSUdfTE9HSVRFQ0hfRkYpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLWxnZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1sZzJmZi5vCi1lbmRpZgotaWZlcSAoJChDT05GSUdfUEFOVEhFUkxPUkRfRkYpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLXBsZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX1RIUlVTVE1BU1RFUl9GRikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtdG1mZi5vCi1lbmRpZgotaWZlcSAoJChDT05GSUdfWkVST1BMVVNfRkYpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLXpwZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX0hJRF9GRikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtZmYubwotZW5kaWYKIAogb2JqLSQoQ09ORklHX1VTQl9ISUQpCQkrPSB1c2JoaWQubwogb2JqLSQoQ09ORklHX1VTQl9LQkQpCQkrPSB1c2JrYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwppbmRleCAyN2ZlNGQ4Li4xZDNiOGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtNDQsOCArNDQsNiBAQAogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEhJRCBjb3JlIGRyaXZlciIKICNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKIAotc3RhdGljIGNoYXIgKmhpZF90eXBlc1tdID0geyJEZXZpY2UiLCAiUG9pbnRlciIsICJNb3VzZSIsICJEZXZpY2UiLCAiSm95c3RpY2siLAotCQkJCSJHYW1lcGFkIiwgIktleWJvYXJkIiwgIktleXBhZCIsICJNdWx0aS1BeGlzIENvbnRyb2xsZXIifTsKIC8qCiAgKiBNb2R1bGUgcGFyYW1ldGVycy4KICAqLwpAQCAtNjEsMTIgKzU5LDYgQEAKIAkJIiBxdWlya3M9dmVuZG9ySUQ6cHJvZHVjdElEOnF1aXJrcyIKIAkJIiB3aGVyZSB2ZW5kb3JJRCwgcHJvZHVjdElELCBhbmQgcXVpcmtzIGFyZSBhbGwgaW4iCiAJCSIgMHgtcHJlZml4ZWQgaGV4Iik7Ci1zdGF0aWMgY2hhciAqcmRlc2NfcXVpcmtzX3BhcmFtW01BWF9VU0JISURfQk9PVF9RVUlSS1NdID0geyBbIDAgLi4uIChNQVhfVVNCSElEX0JPT1RfUVVJUktTIC0gMSkgXSA9IE5VTEwgfTsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChyZGVzY19xdWlya3MsIHJkZXNjX3F1aXJrc19wYXJhbSwgY2hhcnAsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhyZGVzY19xdWlya3MsICJBZGQvbW9kaWZ5IHJlcG9ydCBkZXNjcmlwdG9yIHF1aXJrcyBieSBzcGVjaWZ5aW5nICIKLQkJIiByZGVzY19xdWlya3M9dmVuZG9ySUQ6cHJvZHVjdElEOnJkZXNjX3F1aXJrcyIKLQkJIiB3aGVyZSB2ZW5kb3JJRCwgcHJvZHVjdElELCBhbmQgcmRlc2NfcXVpcmtzIGFyZSBhbGwgaW4iCi0JCSIgMHgtcHJlZml4ZWQgaGV4Iik7CiAvKgogICogSW5wdXQgc3VibWlzc2lvbiBhbmQgSS9PIGVycm9yIGhhbmRsZXIuCiAgKi8KQEAgLTE5NywzMSArMTg5LDMyIEBACiAJaW50CQkJc3RhdHVzOwogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewotCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLwotCQkJdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7Ci0JCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwgSElEX0lOUFVUX1JFUE9SVCwKLQkJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoLCAxKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FUElQRToJCS8qIHN0YWxsICovCi0JCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwotCQkJc2V0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCk7Ci0JCQlzY2hlZHVsZV93b3JrKCZ1c2JoaWQtPnJlc2V0X3dvcmspOwotCQkJcmV0dXJuOwotCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQkJY2FzZSAtRU5PRU5UOgotCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwotCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKLQkJCXJldHVybjsKLQkJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FVElNRToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FVElNRURPVVQ6CS8qIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dC4uLiAqLwotCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKLQkJCWhpZF9pb19lcnJvcihoaWQpOwotCQkJcmV0dXJuOwotCQlkZWZhdWx0OgkJLyogZXJyb3IgKi8KLQkJCXdhcm4oImlucHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7CisJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KKwkJdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7CisJCWhpZF9pbnB1dF9yZXBvcnQodXJiLT5jb250ZXh0LCBISURfSU5QVVRfUkVQT1JULAorCQkJCSB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAtRVBJUEU6CQkvKiBzdGFsbCAqLworCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQlzZXRfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKTsKKwkJc2NoZWR1bGVfd29yaygmdXNiaGlkLT5yZXNldF93b3JrKTsKKwkJcmV0dXJuOworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLworCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQlyZXR1cm47CisJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJY2FzZSAtRVBST1RPOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJY2FzZSAtRVRJTUU6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwljYXNlIC1FVElNRURPVVQ6CS8qIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dC4uLiAqLworCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQloaWRfaW9fZXJyb3IoaGlkKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwgImlucHV0IGlycSBzdGF0dXMgJWQgICIKKwkJCQkicmVjZWl2ZWRcbiIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwpAQCAtMjQwLDEzICsyMzMsMTYgQEAKIHN0YXRpYyBpbnQgaGlkX3N1Ym1pdF9vdXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWNoYXIgKnJhd19yZXBvcnQ7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKLQlyZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdOworCXJlcG9ydCA9IHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0dGFpbF0ucmVwb3J0OworCXJhd19yZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdLnJhd19yZXBvcnQ7CiAKLQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+b3V0YnVmKTsKIAl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKIAl1c2JoaWQtPnVyYm91dC0+ZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKKwltZW1jcHkodXNiaGlkLT5vdXRidWYsIHJhd19yZXBvcnQsIHVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlrZnJlZShyYXdfcmVwb3J0KTsKIAogCWRiZ19oaWQoInN1Ym1pdHRpbmcgb3V0IHVyYlxuIik7CiAKQEAgLTI2MiwxNyArMjU4LDIwIEBACiB7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAl1bnNpZ25lZCBjaGFyIGRpcjsKKwljaGFyICpyYXdfcmVwb3J0OwogCWludCBsZW47CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKIAlyZXBvcnQgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0OworCXJhd19yZXBvcnQgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmF3X3JlcG9ydDsKIAlkaXIgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyOwogCiAJbGVuID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCWlmIChkaXIgPT0gVVNCX0RJUl9PVVQpIHsKLQkJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPmN0cmxidWYpOwogCQl1c2JoaWQtPnVyYmN0cmwtPnBpcGUgPSB1c2Jfc25kY3RybHBpcGUoaGlkX3RvX3VzYl9kZXYoaGlkKSwgMCk7CiAJCXVzYmhpZC0+dXJiY3RybC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGxlbjsKKwkJbWVtY3B5KHVzYmhpZC0+Y3RybGJ1ZiwgcmF3X3JlcG9ydCwgbGVuKTsKKwkJa2ZyZWUocmF3X3JlcG9ydCk7CiAJfSBlbHNlIHsKIAkJaW50IG1heHBhY2tldCwgcGFkbGVuOwogCkBAIC0zMTksMTcgKzMxOCwxOCBAQAogCWludCB1bnBsdWcgPSAwOwogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewotCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCi0JCQl1bnBsdWcgPSAxOwotCQljYXNlIC1FSUxTRVE6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRVBST1RPOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLwotCQljYXNlIC1FTk9FTlQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCQl3YXJuKCJvdXRwdXQgaXJxIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKKwljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLworCQl1bnBsdWcgPSAxOworCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGVycm9yICovCisJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAib3V0cHV0IGlycSBzdGF0dXMgJWQgIgorCQkJCSJyZWNlaXZlZFxuIiwgdXJiLT5zdGF0dXMpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKQEAgLTM2NywyMSArMzY3LDIzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KLQkJCWlmICh1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyID09IFVTQl9ESVJfSU4pCi0JCQkJaGlkX2lucHV0X3JlcG9ydCh1cmItPmNvbnRleHQsIHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQtPnR5cGUsCi0JCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwotCQkJdW5wbHVnID0gMTsKLQkJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQkJY2FzZSAtRU5PRU5UOgotCQljYXNlIC1FUElQRToJCS8qIHJlcG9ydCBub3QgYXZhaWxhYmxlICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCQl3YXJuKCJjdHJsIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7CisJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KKwkJaWYgKHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5kaXIgPT0gVVNCX0RJUl9JTikKKwkJCWhpZF9pbnB1dF9yZXBvcnQodXJiLT5jb250ZXh0LAorCQkJCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQtPnR5cGUsCisJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCwgMCk7CisJCWJyZWFrOworCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCisJCXVucGx1ZyA9IDE7CisJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJY2FzZSAtRVBST1RPOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVQSVBFOgkJLyogcmVwb3J0IG5vdCBhdmFpbGFibGUgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGVycm9yICovCisJCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAiY3RybCB1cmIgc3RhdHVzICVkICIKKwkJCQkicmVjZWl2ZWRcbiIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlpZiAodW5wbHVnKQpAQCAtNDA4LDYgKzQxMCw3IEBACiAJaW50IGhlYWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgbGVuID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCiAJaWYgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19OT0dFVCkgJiYgZGlyID09IFVTQl9ESVJfSU4pCiAJCXJldHVybjsKQEAgLTQxOCwxMSArNDIxLDE4IEBACiAKIAkJaWYgKChoZWFkID0gKHVzYmhpZC0+b3V0aGVhZCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+b3V0dGFpbCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7Ci0JCQl3YXJuKCJvdXRwdXQgcXVldWUgZnVsbCIpOworCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAib3V0cHV0IHF1ZXVlIGZ1bGxcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXSA9IHJlcG9ydDsKKwkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXS5yYXdfcmVwb3J0ID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CisJCQl3YXJuKCJvdXRwdXQgcXVldWVpbmcgZmFpbGVkIik7CisJCQlyZXR1cm47CisJCX0KKwkJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdLnJhd19yZXBvcnQpOworCQl1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdLnJlcG9ydCA9IHJlcG9ydDsKIAkJdXNiaGlkLT5vdXRoZWFkID0gaGVhZDsKIAogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSElEX09VVF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKQEAgLTQzNywxMCArNDQ3LDE5IEBACiAKIAlpZiAoKGhlYWQgPSAodXNiaGlkLT5jdHJsaGVhZCArIDEpICYgKEhJRF9DT05UUk9MX0ZJRk9fU0laRSAtIDEpKSA9PSB1c2JoaWQtPmN0cmx0YWlsKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKLQkJd2FybigiY29udHJvbCBxdWV1ZSBmdWxsIik7CisJCWRldl93YXJuKCZoaWQtPmRldiwgImNvbnRyb2wgcXVldWUgZnVsbFxuIik7CiAJCXJldHVybjsKIAl9CiAKKwlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7CisJCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0ID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0KSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CisJCQl3YXJuKCJjb250cm9sIHF1ZXVlaW5nIGZhaWxlZCIpOworCQkJcmV0dXJuOworCQl9CisJCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJhd19yZXBvcnQpOworCX0KIAl1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0ucmVwb3J0ID0gcmVwb3J0OwogCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5kaXIgPSBkaXI7CiAJdXNiaGlkLT5jdHJsaGVhZCA9IGhlYWQ7CkBAIC00NTEsNiArNDcwLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYmhpZF9zdWJtaXRfcmVwb3J0KTsKIAogc3RhdGljIGludCB1c2JfaGlkaW5wdXRfaW5wdXRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKQEAgLTQ2NSw3ICs0ODUsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlpZiAoKG9mZnNldCA9IGhpZGlucHV0X2ZpbmRfZmllbGQoaGlkLCB0eXBlLCBjb2RlLCAmZmllbGQpKSA9PSAtMSkgewotCQl3YXJuKCJldmVudCBmaWVsZCBub3QgZm91bmQiKTsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZXZlbnQgZmllbGQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNTY4LDcgKzU4OCw3IEBACiAJfQogCiAJaWYgKGVycikKLQkJd2FybigidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0cyIpOworCQlkZXZfd2FybigmaGlkLT5kZXYsICJ0aW1lb3V0IGluaXRpYWxpemluZyByZXBvcnRzXG4iKTsKIH0KIAogLyoKQEAgLTU5OCw3ICs2MTgsNyBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgdXNiaGlkX3NldF9sZWRzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit2b2lkIHVzYmhpZF9zZXRfbGVkcyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOwogCWludCBvZmZzZXQ7CkBAIC02MDgsNiArNjI4LDcgQEAKIAkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBmaWVsZC0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiaGlkX3NldF9sZWRzKTsKIAogLyoKICAqIFRyYXZlcnNlIHRoZSBzdXBwbGllZCBsaXN0IG9mIHJlcG9ydHMgYW5kIGZpbmQgdGhlIGxvbmdlc3QKQEAgLTY3NSw0MyArNjk2LDE2IEBACiAJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPmN0cmxidWYsIHVzYmhpZC0+Y3RybGJ1Zl9kbWEpOwogfQogCi0vKgotICogU2VuZGluZyBISURfUkVRX0dFVF9SRVBPUlQgY2hhbmdlcyB0aGUgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIHBzMyBjb250cm9sbGVyCi0gKiB0byAib3BlcmF0aW9uYWwiLiAgV2l0aG91dCB0aGlzLCB0aGUgcHMzIGNvbnRyb2xsZXIgd2lsbCBub3QgcmVwb3J0IGFueQotICogZXZlbnRzLgotICovCi1zdGF0aWMgdm9pZCBoaWRfZml4dXBfc29ueV9wczNfY29udHJvbGxlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaWZudW0pCitzdGF0aWMgaW50IHVzYmhpZF9wYXJzZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewotCWludCByZXN1bHQ7Ci0JY2hhciAqYnVmID0ga21hbGxvYygxOCwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuOwotCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkJIEhJRF9SRVFfR0VUX1JFUE9SVCwKLQkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwKLQkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLQkJCQkgKDMgPDwgOCkgfCAweGYyLCBpZm51bSwgYnVmLCAxNywKLQkJCQkgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOwotCi0JaWYgKHJlc3VsdCA8IDApCi0JCWVycl9oaWQoIiVzIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwotCi0Ja2ZyZWUoYnVmKTsKLX0KLQotc3RhdGljIHN0cnVjdCBoaWRfZGV2aWNlICp1c2JfaGlkX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGlkLT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CiAJc3RydWN0IGhpZF9kZXNjcmlwdG9yICpoZGVzYzsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwogCXUzMiBxdWlya3MgPSAwOwotCXVuc2lnbmVkIGludCBpbnNpemUgPSAwLCByc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IHJzaXplID0gMDsKIAljaGFyICpyZGVzYzsKLQlpbnQgbiwgbGVuOwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQ7CisJaW50IHJldCwgbjsKIAogCXF1aXJrcyA9IHVzYmhpZF9sb29rdXBfcXVpcmsobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkJCWxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKQEAgLTcyNCw2MyArNzE4LDc1IEBACiAJCQkJcXVpcmtzIHw9IEhJRF9RVUlSS19OT0dFVDsKIAl9CiAKLQlpZiAocXVpcmtzICYgSElEX1FVSVJLX0lHTk9SRSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKHF1aXJrcyAmIEhJRF9RVUlSS19JR05PUkVfTU9VU0UpICYmCi0JCShpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQogCWlmICh1c2JfZ2V0X2V4dHJhX2Rlc2NyaXB0b3IoaW50ZXJmYWNlLCBISURfRFRfSElELCAmaGRlc2MpICYmCiAJICAgICghaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMgfHwKIAkgICAgIHVzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcigmaW50ZXJmYWNlLT5lbmRwb2ludFswXSwgSElEX0RUX0hJRCwgJmhkZXNjKSkpIHsKIAkJZGJnX2hpZCgiY2xhc3MgZGVzY3JpcHRvciBub3QgcHJlc2VudFxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwloaWQtPnZlcnNpb24gPSBsZTE2X3RvX2NwdShoZGVzYy0+YmNkSElEKTsKKwloaWQtPmNvdW50cnkgPSBoZGVzYy0+YkNvdW50cnlDb2RlOworCiAJZm9yIChuID0gMDsgbiA8IGhkZXNjLT5iTnVtRGVzY3JpcHRvcnM7IG4rKykKIAkJaWYgKGhkZXNjLT5kZXNjW25dLmJEZXNjcmlwdG9yVHlwZSA9PSBISURfRFRfUkVQT1JUKQogCQkJcnNpemUgPSBsZTE2X3RvX2NwdShoZGVzYy0+ZGVzY1tuXS53RGVzY3JpcHRvckxlbmd0aCk7CiAKIAlpZiAoIXJzaXplIHx8IHJzaXplID4gSElEX01BWF9ERVNDUklQVE9SX1NJWkUpIHsKIAkJZGJnX2hpZCgid2VpcmQgc2l6ZSBvZiByZXBvcnQgZGVzY3JpcHRvciAoJXUpXG4iLCByc2l6ZSk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoIShyZGVzYyA9IGttYWxsb2MocnNpemUsIEdGUF9LRVJORUwpKSkgewogCQlkYmdfaGlkKCJjb3VsZG4ndCBhbGxvY2F0ZSByZGVzYyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaGlkX3NldF9pZGxlKGRldiwgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDAsIDApOwogCi0JaWYgKChuID0gaGlkX2dldF9jbGFzc19kZXNjcmlwdG9yKGRldiwgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIEhJRF9EVF9SRVBPUlQsIHJkZXNjLCByc2l6ZSkpIDwgMCkgeworCXJldCA9IGhpZF9nZXRfY2xhc3NfZGVzY3JpcHRvcihkZXYsIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJSElEX0RUX1JFUE9SVCwgcmRlc2MsIHJzaXplKTsKKwlpZiAocmV0IDwgMCkgewogCQlkYmdfaGlkKCJyZWFkaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZFxuIik7CiAJCWtmcmVlKHJkZXNjKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyOwogCX0KIAotCXVzYmhpZF9maXh1cF9yZXBvcnRfZGVzY3JpcHRvcihsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQkJbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksIHJkZXNjLAotCQkJcnNpemUsIHJkZXNjX3F1aXJrc19wYXJhbSk7Ci0KIAlkYmdfaGlkKCJyZXBvcnQgZGVzY3JpcHRvciAoc2l6ZSAldSwgcmVhZCAlZCkgPSAiLCByc2l6ZSwgbik7CiAJZm9yIChuID0gMDsgbiA8IHJzaXplOyBuKyspCiAJCWRiZ19oaWRfbGluZSgiICUwMngiLCAodW5zaWduZWQgY2hhcikgcmRlc2Nbbl0pOwogCWRiZ19oaWRfbGluZSgiXG4iKTsKIAotCWlmICghKGhpZCA9IGhpZF9wYXJzZV9yZXBvcnQocmRlc2MsIG4pKSkgeworCXJldCA9IGhpZF9wYXJzZV9yZXBvcnQoaGlkLCByZGVzYywgcnNpemUpOworCWtmcmVlKHJkZXNjKTsKKwlpZiAocmV0KSB7CiAJCWRiZ19oaWQoInBhcnNpbmcgcmVwb3J0IGRlc2NyaXB0b3IgZmFpbGVkXG4iKTsKLQkJa2ZyZWUocmRlc2MpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnI7CiAJfQogCi0Ja2ZyZWUocmRlc2MpOwogCWhpZC0+cXVpcmtzID0gcXVpcmtzOwogCi0JaWYgKCEodXNiaGlkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhpZF9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpCi0JCWdvdG8gZmFpbF9ub191c2JoaWQ7CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1c2JoaWRfc3RhcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGlkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOworCXVuc2lnbmVkIGludCBuLCBpbnNpemUgPSAwOworCWludCByZXQ7CisKKwlXQVJOX09OKGhpZC0+ZHJpdmVyX2RhdGEpOworCisJdXNiaGlkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhpZF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNiaGlkID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCiAJaGlkLT5kcml2ZXJfZGF0YSA9IHVzYmhpZDsKIAl1c2JoaWQtPmhpZCA9IGhpZDsKQEAgLTc5OSwyOCArODA1LDExIEBACiAJCWluc2l6ZSA9IEhJRF9NQVhfQlVGRkVSX1NJWkU7CiAKIAlpZiAoaGlkX2FsbG9jX2J1ZmZlcnMoZGV2LCBoaWQpKSB7Ci0JCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JaGlkLT5uYW1lWzBdID0gMDsKLQotCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKLQkJc3RybGNweShoaWQtPm5hbWUsIGRldi0+bWFudWZhY3R1cmVyLCBzaXplb2YoaGlkLT5uYW1lKSk7Ci0KLQlpZiAoZGV2LT5wcm9kdWN0KSB7Ci0JCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKLQkJCXN0cmxjYXQoaGlkLT5uYW1lLCAiICIsIHNpemVvZihoaWQtPm5hbWUpKTsKLQkJc3RybGNhdChoaWQtPm5hbWUsIGRldi0+cHJvZHVjdCwgc2l6ZW9mKGhpZC0+bmFtZSkpOwotCX0KLQotCWlmICghc3RybGVuKGhpZC0+bmFtZSkpCi0JCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICJISUQgJTA0eDolMDR4IiwKLQkJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKLQogCWZvciAobiA9IDA7IG4gPCBpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50czsgbisrKSB7Ci0KIAkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKIAkJaW50IHBpcGU7CiAJCWludCBpbnRlcnZhbDsKQEAgLTgzMiw3ICs4MjEsNyBAQAogCQlpbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CiAKIAkJLyogU29tZSB2ZW5kb3JzIGdpdmUgZnVsbHNwZWVkIGludGVydmFsIG9uIGhpZ2hzcGVlZCBkZXZpZGVzICovCi0JCWlmIChxdWlya3MgJiBISURfUVVJUktfRlVMTFNQRUVEX0lOVEVSVkFMICAmJgorCQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfRlVMTFNQRUVEX0lOVEVSVkFMICYmCiAJCSAgICBkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7CiAJCQlpbnRlcnZhbCA9IGZscyhlbmRwb2ludC0+YkludGVydmFsKjgpOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpeGluZyBmdWxsc3BlZWQgdG8gaGlnaHNwZWVkIGludGVydmFsOiAlZCAtPiAlZFxuIiwKQEAgLTg0Myw2ICs4MzIsNyBAQAogCQlpZiAoaGlkLT5jb2xsZWN0aW9uLT51c2FnZSA9PSBISURfR0RfTU9VU0UgJiYgaGlkX21vdXNlcG9sbF9pbnRlcnZhbCA+IDApCiAJCQlpbnRlcnZhbCA9IGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWw7CiAKKwkJcmV0ID0gLUVOT01FTTsKIAkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZW5kcG9pbnQpKSB7CiAJCQlpZiAodXNiaGlkLT51cmJpbikKIAkJCQljb250aW51ZTsKQEAgLTg2OCw2ICs4NTgsNyBAQAogCiAJaWYgKCF1c2JoaWQtPnVyYmluKSB7CiAJCWVycl9oaWQoImNvdWxkbid0IGZpbmQgYW4gaW5wdXQgaW50ZXJydXB0IGVuZHBvaW50Iik7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTg3OSw0NCArODcwLDI1IEBACiAJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+b3V0bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+Y3RybGxvY2spOwogCi0JaGlkLT52ZXJzaW9uID0gbGUxNl90b19jcHUoaGRlc2MtPmJjZEhJRCk7Ci0JaGlkLT5jb3VudHJ5ID0gaGRlc2MtPmJDb3VudHJ5Q29kZTsKLQloaWQtPmRldiA9ICZpbnRmLT5kZXY7CiAJdXNiaGlkLT5pbnRmID0gaW50ZjsKIAl1c2JoaWQtPmlmbnVtID0gaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKLQloaWQtPmJ1cyA9IEJVU19VU0I7Ci0JaGlkLT52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCWhpZC0+cHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotCi0JdXNiX21ha2VfcGF0aChkZXYsIGhpZC0+cGh5cywgc2l6ZW9mKGhpZC0+cGh5cykpOwotCXN0cmxjYXQoaGlkLT5waHlzLCAiL2lucHV0Iiwgc2l6ZW9mKGhpZC0+cGh5cykpOwotCWxlbiA9IHN0cmxlbihoaWQtPnBoeXMpOwotCWlmIChsZW4gPCBzaXplb2YoaGlkLT5waHlzKSAtIDEpCi0JCXNucHJpbnRmKGhpZC0+cGh5cyArIGxlbiwgc2l6ZW9mKGhpZC0+cGh5cykgLSBsZW4sCi0JCQkgIiVkIiwgaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotCi0JaWYgKHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgaGlkLT51bmlxLCA2NCkgPD0gMCkKLQkJaGlkLT51bmlxWzBdID0gMDsKLQogCXVzYmhpZC0+dXJiY3RybCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1c2JoaWQtPnVyYmN0cmwpCisJaWYgKCF1c2JoaWQtPnVyYmN0cmwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOworCX0KIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKHVzYmhpZC0+dXJiY3RybCwgZGV2LCAwLCAodm9pZCAqKSB1c2JoaWQtPmNyLAogCQkJICAgICB1c2JoaWQtPmN0cmxidWYsIDEsIGhpZF9jdHJsLCBoaWQpOwogCXVzYmhpZC0+dXJiY3RybC0+c2V0dXBfZG1hID0gdXNiaGlkLT5jcl9kbWE7CiAJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9kbWEgPSB1c2JoaWQtPmN0cmxidWZfZG1hOwogCXVzYmhpZC0+dXJiY3RybC0+dHJhbnNmZXJfZmxhZ3MgfD0gKFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQIHwgVVJCX05PX1NFVFVQX0RNQV9NQVApOwotCWhpZC0+aGlkaW5wdXRfaW5wdXRfZXZlbnQgPSB1c2JfaGlkaW5wdXRfaW5wdXRfZXZlbnQ7Ci0JaGlkLT5oaWRfb3BlbiA9IHVzYmhpZF9vcGVuOwotCWhpZC0+aGlkX2Nsb3NlID0gdXNiaGlkX2Nsb3NlOwotI2lmZGVmIENPTkZJR19VU0JfSElEREVWCi0JaGlkLT5oaWRkZXZfaGlkX2V2ZW50ID0gaGlkZGV2X2hpZF9ldmVudDsKLQloaWQtPmhpZGRldl9yZXBvcnRfZXZlbnQgPSBoaWRkZXZfcmVwb3J0X2V2ZW50OwotI2VuZGlmCi0JaGlkLT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQgPSB1c2JoaWRfb3V0cHV0X3Jhd19yZXBvcnQ7Ci0JcmV0dXJuIGhpZDsKKworCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKKwloaWRfZHVtcF9kZXZpY2UoaGlkKTsKKworCXJldHVybiAwOwogCiBmYWlsOgogCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKQEAgLTkyNCwyNCArODk2LDE4IEBACiAJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJiY3RybCk7CiAJaGlkX2ZyZWVfYnVmZmVycyhkZXYsIGhpZCk7CiAJa2ZyZWUodXNiaGlkKTsKLWZhaWxfbm9fdXNiaGlkOgotCWhpZF9mcmVlX2RldmljZShoaWQpOwotCi0JcmV0dXJuIE5VTEw7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaGlkX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgdm9pZCB1c2JoaWRfc3RvcChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JaWYgKCFoaWQpCisJaWYgKFdBUk5fT04oIXVzYmhpZCkpCiAJCXJldHVybjsKIAotCXVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0KIAlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlzZXRfYml0KEhJRF9ESVNDT05ORUNURUQsICZ1c2JoaWQtPmlvZmwpOwogCXNwaW5fdW5sb2NrX2lycSgmdXNiaGlkLT5pbmxvY2spOwogCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYmluKTsKQEAgLTk1OCw4NiArOTI0LDEwMCBAQAogCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURSQVcpCiAJCWhpZHJhd19kaXNjb25uZWN0KGhpZCk7CiAKKwloaWQtPmNsYWltZWQgPSAwOworCiAJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJiaW4pOwogCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmN0cmwpOwogCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYm91dCk7CiAKIAloaWRfZnJlZV9idWZmZXJzKGhpZF90b191c2JfZGV2KGhpZCksIGhpZCk7CiAJa2ZyZWUodXNiaGlkKTsKLQloaWRfZnJlZV9kZXZpY2UoaGlkKTsKKwloaWQtPmRyaXZlcl9kYXRhID0gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBoaWRfbGxfZHJpdmVyIHVzYl9oaWRfZHJpdmVyID0geworCS5wYXJzZSA9IHVzYmhpZF9wYXJzZSwKKwkuc3RhcnQgPSB1c2JoaWRfc3RhcnQsCisJLnN0b3AgPSB1c2JoaWRfc3RvcCwKKwkub3BlbiA9IHVzYmhpZF9vcGVuLAorCS5jbG9zZSA9IHVzYmhpZF9jbG9zZSwKKwkuaGlkaW5wdXRfaW5wdXRfZXZlbnQgPSB1c2JfaGlkaW5wdXRfaW5wdXRfZXZlbnQsCit9OworCiBzdGF0aWMgaW50IGhpZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7Ci0JY2hhciBwYXRoWzY0XTsKLQlpbnQgaTsKLQljaGFyICpjOworCXNpemVfdCBsZW47CisJaW50IHJldDsKIAogCWRiZ19oaWQoIkhJRCBwcm9iZSBjYWxsZWQgZm9yIGlmbnVtICVkXG4iLAogCQkJaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKIAotCWlmICghKGhpZCA9IHVzYl9oaWRfY29uZmlndXJlKGludGYpKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7Ci0JaGlkX2R1bXBfZGV2aWNlKGhpZCk7Ci0JaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1JFU0VUX0xFRFMpCi0JCXVzYmhpZF9zZXRfbGVkcyhoaWQpOwotCi0JaWYgKCFoaWRpbnB1dF9jb25uZWN0KGhpZCkpCi0JCWhpZC0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9JTlBVVDsKLQlpZiAoIWhpZGRldl9jb25uZWN0KGhpZCkpCi0JCWhpZC0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9ISURERVY7Ci0JaWYgKCFoaWRyYXdfY29ubmVjdChoaWQpKQotCQloaWQtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEUkFXOworCWhpZCA9IGhpZF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoSVNfRVJSKGhpZCkpCisJCXJldHVybiBQVFJfRVJSKGhpZCk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGhpZCk7CisJaGlkLT5sbF9kcml2ZXIgPSAmdXNiX2hpZF9kcml2ZXI7CisJaGlkLT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQgPSB1c2JoaWRfb3V0cHV0X3Jhd19yZXBvcnQ7CisJaGlkLT5mZl9pbml0ID0gaGlkX3BpZGZmX2luaXQ7CisjaWZkZWYgQ09ORklHX1VTQl9ISURERVYKKwloaWQtPmhpZGRldl9jb25uZWN0ID0gaGlkZGV2X2Nvbm5lY3Q7CisJaGlkLT5oaWRkZXZfaGlkX2V2ZW50ID0gaGlkZGV2X2hpZF9ldmVudDsKKwloaWQtPmhpZGRldl9yZXBvcnRfZXZlbnQgPSBoaWRkZXZfcmVwb3J0X2V2ZW50OworI2VuZGlmCisJaGlkLT5kZXYucGFyZW50ID0gJmludGYtPmRldjsKKwloaWQtPmJ1cyA9IEJVU19VU0I7CisJaGlkLT52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCWhpZC0+cHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCWhpZC0+bmFtZVswXSA9IDA7CiAKLQlpZiAoIWhpZC0+Y2xhaW1lZCkgewotCQlwcmludGsgKCJISUQgZGV2aWNlIGNsYWltZWQgYnkgbmVpdGhlciBpbnB1dCwgaGlkZGV2IG5vciBoaWRyYXdcbiIpOwotCQloaWRfZGlzY29ubmVjdChpbnRmKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGRldi0+bWFudWZhY3R1cmVyKQorCQlzdHJsY3B5KGhpZC0+bmFtZSwgZGV2LT5tYW51ZmFjdHVyZXIsIHNpemVvZihoaWQtPm5hbWUpKTsKKworCWlmIChkZXYtPnByb2R1Y3QpIHsKKwkJaWYgKGRldi0+bWFudWZhY3R1cmVyKQorCQkJc3RybGNhdChoaWQtPm5hbWUsICIgIiwgc2l6ZW9mKGhpZC0+bmFtZSkpOworCQlzdHJsY2F0KGhpZC0+bmFtZSwgZGV2LT5wcm9kdWN0LCBzaXplb2YoaGlkLT5uYW1lKSk7CiAJfQogCi0JaWYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkpCi0JCWhpZF9mZl9pbml0KGhpZCk7CisJaWYgKCFzdHJsZW4oaGlkLT5uYW1lKSkKKwkJc25wcmludGYoaGlkLT5uYW1lLCBzaXplb2YoaGlkLT5uYW1lKSwgIkhJRCAlMDR4OiUwNHgiLAorCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCi0JaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1NPTllfUFMzX0NPTlRST0xMRVIpCi0JCWhpZF9maXh1cF9zb255X3BzM19jb250cm9sbGVyKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCQlpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwl1c2JfbWFrZV9wYXRoKGRldiwgaGlkLT5waHlzLCBzaXplb2YoaGlkLT5waHlzKSk7CisJc3RybGNhdChoaWQtPnBoeXMsICIvaW5wdXQiLCBzaXplb2YoaGlkLT5waHlzKSk7CisJbGVuID0gc3RybGVuKGhpZC0+cGh5cyk7CisJaWYgKGxlbiA8IHNpemVvZihoaWQtPnBoeXMpIC0gMSkKKwkJc25wcmludGYoaGlkLT5waHlzICsgbGVuLCBzaXplb2YoaGlkLT5waHlzKSAtIGxlbiwKKwkJCSAiJWQiLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKLQlwcmludGsoS0VSTl9JTkZPKTsKKwlpZiAodXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBoaWQtPnVuaXEsIDY0KSA8PSAwKQorCQloaWQtPnVuaXFbMF0gPSAwOwogCi0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQotCQlwcmludGsoImlucHV0Iik7Ci0JaWYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgJiYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpIHx8Ci0JCQkJaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEUkFXKSkKLQkJcHJpbnRrKCIsIik7Ci0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRERFVikKLQkJcHJpbnRrKCJoaWRkZXYlZCIsIGhpZC0+bWlub3IpOwotCWlmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpICYmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpICYmCi0JCQkoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEUkFXKSkKLQkJcHJpbnRrKCIsIik7Ci0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRFJBVykKLQkJcHJpbnRrKCJoaWRyYXclZCIsICgoc3RydWN0IGhpZHJhdyopaGlkLT5oaWRyYXcpLT5taW5vcik7Ci0KLQljID0gIkRldmljZSI7Ci0JZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKSB7Ci0JCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgotCQkgICAgKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfR0VOREVTSyAmJgotCQkgICAgKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSAmIDB4ZmZmZikgPCBBUlJBWV9TSVpFKGhpZF90eXBlcykpIHsKLQkJCWMgPSBoaWRfdHlwZXNbaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlICYgMHhmZmZmXTsKLQkJCWJyZWFrOwotCQl9CisJcmV0ID0gaGlkX2FkZF9kZXZpY2UoaGlkKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgIT0gLUVOT0RFVikKKwkJCWRldl9lcnIoJmludGYtPmRldiwgImNhbid0IGFkZCBoaWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CiAJfQogCi0JdXNiX21ha2VfcGF0aChpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCBwYXRoLCA2Myk7Ci0KLQlwcmludGsoIjogVVNCIEhJRCB2JXguJTAyeCAlcyBbJXNdIG9uICVzXG4iLAotCQloaWQtPnZlcnNpb24gPj4gOCwgaGlkLT52ZXJzaW9uICYgMHhmZiwgYywgaGlkLT5uYW1lLCBwYXRoKTsKLQogCXJldHVybiAwOworZXJyOgorCWhpZF9kZXN0cm95X2RldmljZShoaWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJaWYgKFdBUk5fT04oIWhpZCkpCisJCXJldHVybjsKKworCWhpZF9kZXN0cm95X2RldmljZShoaWQpOwogfQogCiBzdGF0aWMgaW50IGhpZF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKQEAgLTExMDcsOSArMTA4NywyMiBAQAogCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaGlkX3VzYl90YWJsZVtdID0geworCXsgSElEX1VTQl9ERVZJQ0UoSElEX0FOWV9JRCwgSElEX0FOWV9JRCkgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBoaWRfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJnZW5lcmljLXVzYiIsCisJLmlkX3RhYmxlID0gaGlkX3VzYl90YWJsZSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGhpZF9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKKwlyZXR2YWwgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBoaWRfcmVnaXN0ZXJfZmFpbDsKIAlyZXR2YWwgPSB1c2JoaWRfcXVpcmtzX2luaXQocXVpcmtzX3BhcmFtKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIHVzYmhpZF9xdWlya3NfaW5pdF9mYWlsOwpAQCAtMTExOSw3ICsxMTEyLDggQEAKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmhpZF9kcml2ZXIpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gdXNiX3JlZ2lzdGVyX2ZhaWw7Ci0JaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBEUklWRVJfVkVSU0lPTiAiOiIKKwkJCURSSVZFUl9ERVNDICJcbiIpOwogCiAJcmV0dXJuIDA7CiB1c2JfcmVnaXN0ZXJfZmFpbDoKQEAgLTExMjcsNiArMTEyMSw4IEBACiBoaWRkZXZfaW5pdF9mYWlsOgogCXVzYmhpZF9xdWlya3NfZXhpdCgpOwogdXNiaGlkX3F1aXJrc19pbml0X2ZhaWw6CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7CitoaWRfcmVnaXN0ZXJfZmFpbDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMTM1LDYgKzExMzEsNyBAQAogCXVzYl9kZXJlZ2lzdGVyKCZoaWRfZHJpdmVyKTsKIAloaWRkZXZfZXhpdCgpOwogCXVzYmhpZF9xdWlya3NfZXhpdCgpOworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmaGlkX3VzYl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChoaWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGRhYzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqICBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBoaWQgZGV2aWNlcy4KLSAqICBOb3QgYWxsIGhpZCBkZXZpY2VzIHVzZSB0aGUgc2FtZSBwcm90b2NvbC4gRm9yIGV4YW1wbGUsIHNvbWUgdXNlIFBJRCwKLSAqICBvdGhlciB1c2UgdGhlaXIgb3duIHByb3ByaWV0YXJ5IHByb2NvdG9sLgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBKb2hhbm4gRGVuZXV4Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gYnkKLSAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotCi0jdW5kZWYgREVCVUcKLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotI2luY2x1ZGUgInVzYmhpZC5oIgotCi0vKgotICogVGhpcyB0YWJsZSBjb250YWlucyBwb2ludGVycyB0byBpbml0aWFsaXplcnMuIFRvIGFkZCBzdXBwb3J0IGZvciBuZXcKLSAqIGRldmljZXMsIHlvdSBuZWVkIHRvIGFkZCB0aGUgVVNCIHZlbmRvciBhbmQgcHJvZHVjdCBpZHMgaGVyZS4KLSAqLwotc3RydWN0IGhpZF9mZl9pbml0aWFsaXplciB7Ci0JdTE2IGlkVmVuZG9yOwotCXUxNiBpZFByb2R1Y3Q7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGhpZF9kZXZpY2UqKTsKLX07Ci0KLS8qCi0gKiBXZSB0cnkgcGlkZmYgd2hlbiBubyBvdGhlciBkcml2ZXIgaXMgZm91bmQgYmVjYXVzZSBQSUQgaXMgdGhlCi0gKiBzdGFuZGFyZHMgY29tcGxpYW50IHdheSBvZiBpbXBsZW1lbnRpbmcgZm9yY2UgZmVlZGJhY2sgaW4gSElELgotICogcGlkZmZfaW5pdCgpIHdpbGwgcXVpY2tseSBhYm9ydCBpZiB0aGUgZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvCi0gKiBiZSBhIFBJRCBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBoaWRfZmZfaW5pdGlhbGl6ZXIgaW5pdHNbXSA9IHsKLSNpZmRlZiBDT05GSUdfTE9HSVRFQ0hfRkYKLQl7IDB4NDZkLCAweGMyMTEsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggQ29yZGxlc3MgcnVtYmxlIHBhZCAqLwotCXsgMHg0NmQsIDB4YzIxOSwgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBDb3JkbGVzcyBydW1ibGUgcGFkIDIgKi8KLQl7IDB4NDZkLCAweGMyODMsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggV2luZ21hbiBGb3JjZSAzZCAqLwotCXsgMHg0NmQsIDB4YzI4NiwgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBGb3JjZSAzRCBQcm8gSm95c3RpY2sgKi8KLQl7IDB4NDZkLCAweGMyOTQsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggRm9ybXVsYSBGb3JjZSBFWCAqLwotCXsgMHg0NmQsIDB4YzI5NSwgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBNT01PIGZvcmNlIHdoZWVsICovCi0JeyAweDQ2ZCwgMHhjYTAzLCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIE1PTU8gZm9yY2Ugd2hlZWwgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRgotCXsgMHg0NmQsIDB4YzIxOCwgaGlkX2xnMmZmX2luaXQgfSwgLyogTG9naXRlY2ggUnVtYmxlcGFkIDIgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQU5USEVSTE9SRF9GRgotCXsgMHg4MTAsIDB4MDAwMSwgaGlkX3BsZmZfaW5pdCB9LCAvKiAiVHdpbiBVU0IgSm95c3RpY2siICovCi0JeyAweGU4ZiwgMHgwMDAzLCBoaWRfcGxmZl9pbml0IH0sIC8qICJHcmVlbkFzaWEgSW5jLiAgICBVU0IgSm95c3RpY2sgICAgICIgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19USFJVU1RNQVNURVJfRkYKLQl7IDB4NDRmLCAweGIzMDAsIGhpZF90bWZmX2luaXQgfSwKLQl7IDB4NDRmLCAweGIzMDQsIGhpZF90bWZmX2luaXQgfSwKLQl7IDB4NDRmLCAweGI2NTEsIGhpZF90bWZmX2luaXQgfSwgLyogRkdUIFJ1bWJsZSBGb3JjZSBXaGVlbCAqLwotCXsgMHg0NGYsIDB4YjY1NCwgaGlkX3RtZmZfaW5pdCB9LCAvKiBGR1QgRm9yY2UgRmVlZGJhY2sgV2hlZWwgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19aRVJPUExVU19GRgotCXsgMHhjMTIsIDB4MDAwNSwgaGlkX3pwZmZfaW5pdCB9LAotCXsgMHhjMTIsIDB4MDAzMCwgaGlkX3pwZmZfaW5pdCB9LAotI2VuZGlmCi0JeyAwLAkgMCwJIGhpZF9waWRmZl9pbml0fSAgLyogTWF0Y2hlcyBhbnl0aGluZyAqLwotfTsKLQotaW50IGhpZF9mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlKiBoaWQpCi17Ci0Jc3RydWN0IGhpZF9mZl9pbml0aWFsaXplciAqaW5pdDsKLQlpbnQgdmVuZG9yID0gbGUxNl90b19jcHUoaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JaW50IHByb2R1Y3QgPSBsZTE2X3RvX2NwdShoaWRfdG9fdXNiX2RldihoaWQpLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0KLQlmb3IgKGluaXQgPSBpbml0czsgaW5pdC0+aWRWZW5kb3I7IGluaXQrKykKLQkJaWYgKGluaXQtPmlkVmVuZG9yID09IHZlbmRvciAmJiBpbml0LT5pZFByb2R1Y3QgPT0gcHJvZHVjdCkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIGluaXQtPmluaXQoaGlkKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGhpZF9mZl9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZzJmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZzJmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY5YmQwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtbGcyZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIExvZ2l0ZWNoIFJ1bWJsZXBhZCAyCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwOCBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT4KLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotI2luY2x1ZGUgInVzYmhpZC5oIgotCi1zdHJ1Y3QgbGcyZmZfZGV2aWNlIHsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotfTsKLQotc3RhdGljIGludCBwbGF5X2VmZmVjdChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBsZzJmZl9kZXZpY2UgKmxnMmZmID0gZGF0YTsKLQlpbnQgd2Vhaywgc3Ryb25nOwotCi0Jc3Ryb25nID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOwotCXdlYWsgPSBlZmZlY3QtPnUucnVtYmxlLndlYWtfbWFnbml0dWRlOwotCi0JaWYgKHdlYWsgfHwgc3Ryb25nKSB7Ci0JCXdlYWsgPSB3ZWFrICogMHhmZiAvIDB4ZmZmZjsKLQkJc3Ryb25nID0gc3Ryb25nICogMHhmZiAvIDB4ZmZmZjsKLQotCQlsZzJmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweDUxOwotCQlsZzJmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSB3ZWFrOwotCQlsZzJmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNF0gPSBzdHJvbmc7Ci0JfSBlbHNlIHsKLQkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHhmMzsKLQkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzJdID0gMHgwMDsKLQkJbGcyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzRdID0gMHgwMDsKLQl9Ci0KLQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGxnMmZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGhpZF9sZzJmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0Jc3RydWN0IGxnMmZmX2RldmljZSAqbGcyZmY7Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKLQlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKLQkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KLQkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoaWRpbnB1dC0+aW5wdXQ7Ci0JaW50IGVycm9yOwotCi0JaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLWxnMmZmOiBubyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwotCi0JaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCAxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLWxnMmZmOiBvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA3KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLWxnMmZmOiBub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlsZzJmZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZzJmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxnMmZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKLQotCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCBsZzJmZiwgcGxheV9lZmZlY3QpOwotCWlmIChlcnJvcikgewotCQlrZnJlZShsZzJmZik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlsZzJmZi0+cmVwb3J0ID0gcmVwb3J0OwotCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHhmMzsKLQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsxXSA9IDB4MDA7Ci0JcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOwotCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKLQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDA7Ci0JcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNV0gPSAweDAwOwotCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzZdID0gMHgwMDsKLQotCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggUnVtYmxlcGFkIDIgYnkgIgotCSAgICAgICAiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZ2ZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3YWI2YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaGlkLWNvbXBsaWFudCBmb3Igc29tZSBvZiB0aGUgZGV2aWNlcyBmcm9tCi0gKiBMb2dpdGVjaCwgbmFtZWx5OgotICogLSBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZAotICogLSBXaW5nTWFuIEZvcmNlIDNECi0gKgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEpvaGFubiBEZW5ldXgKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gYnkKLSAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotI2luY2x1ZGUgInVzYmhpZC5oIgotCi1zdHJ1Y3QgZGV2X3R5cGUgewotCXUxNiBpZFZlbmRvcjsKLQl1MTYgaWRQcm9kdWN0OwotCWNvbnN0IHNpZ25lZCBzaG9ydCAqZmY7Ci19OwotCi1zdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IGZmX3J1bWJsZVtdID0gewotCUZGX1JVTUJMRSwKLQktMQotfTsKLQotc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCBmZl9qb3lzdGlja1tdID0gewotCUZGX0NPTlNUQU5ULAotCS0xCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl90eXBlIGRldmljZXNbXSA9IHsKLQl7IDB4MDQ2ZCwgMHhjMjExLCBmZl9ydW1ibGUgfSwKLQl7IDB4MDQ2ZCwgMHhjMjE5LCBmZl9ydW1ibGUgfSwKLQl7IDB4MDQ2ZCwgMHhjMjgzLCBmZl9qb3lzdGljayB9LAotCXsgMHgwNDZkLCAweGMyODYsIGZmX2pveXN0aWNrIH0sCi0JeyAweDA0NmQsIDB4YzI5NCwgZmZfam95c3RpY2sgfSwKLQl7IDB4MDQ2ZCwgMHhjMjk1LCBmZl9qb3lzdGljayB9LAotCXsgMHgwNDZkLCAweGNhMDMsIGZmX2pveXN0aWNrIH0sCi19OwotCi1zdGF0aWMgaW50IGhpZF9sZ2ZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3QgPSAmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKLQlpbnQgeCwgeTsKLQl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQ7Ci0KLSNkZWZpbmUgQ0xBTVAoeCkgaWYgKHggPCAwKSB4ID0gMDsgaWYgKHggPiAweGZmKSB4ID0gMHhmZgotCi0Jc3dpdGNoIChlZmZlY3QtPnR5cGUpIHsKLQljYXNlIEZGX0NPTlNUQU5UOgotCQl4ID0gZWZmZWN0LT51LnJhbXAuc3RhcnRfbGV2ZWwgKyAweDdmOwkvKiAweDdmIGlzIGNlbnRlciAqLwotCQl5ID0gZWZmZWN0LT51LnJhbXAuZW5kX2xldmVsICsgMHg3ZjsKLQkJQ0xBTVAoeCk7Ci0JCUNMQU1QKHkpOwotCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4NTE7Ci0JCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHgwODsKLQkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSB4OwotCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IHk7Ci0JCWRiZ19oaWQoIih4LCB5KT0oJTA0eCwgJTA0eClcbiIsIHgsIHkpOwotCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOwotCQlicmVhazsKLQotCWNhc2UgRkZfUlVNQkxFOgotCQlyaWdodCA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKLQkJbGVmdCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7Ci0JCXJpZ2h0ID0gcmlnaHQgKiAweGZmIC8gMHhmZmZmOwotCQlsZWZ0ID0gbGVmdCAqIDB4ZmYgLyAweGZmZmY7Ci0JCUNMQU1QKGxlZnQpOwotCQlDTEFNUChyaWdodCk7Ci0JCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHg0MjsKLQkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDAwOwotCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IGxlZnQ7Ci0JCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gcmlnaHQ7Ci0JCWRiZ19oaWQoIihsZWZ0LCByaWdodCk9KCUwNHgsICUwNHgpXG4iLCBsZWZ0LCByaWdodCk7Ci0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGhpZF9sZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UqIGhpZCkKLXsKLQlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3QgPSAmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OwotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0Jc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7Ci0JY29uc3Qgc2lnbmVkIHNob3J0ICpmZl9iaXRzID0gZmZfam95c3RpY2s7Ci0JaW50IGVycm9yOwotCWludCBpOwotCi0JLyogRmluZCB0aGUgcmVwb3J0IHRvIHVzZSAqLwotCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQllcnJfaGlkKCJObyBvdXRwdXQgcmVwb3J0IGZvdW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHRoZSByZXBvcnQgbG9va3Mgb2sgKi8KLQlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7Ci0JaWYgKCFyZXBvcnQpIHsKLQkJZXJyX2hpZCgiTlVMTCBvdXRwdXQgcmVwb3J0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmaWVsZCA9IHJlcG9ydC0+ZmllbGRbMF07Ci0JaWYgKCFmaWVsZCkgewotCQllcnJfaGlkKCJOVUxMIGZpZWxkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VzKTsgaSsrKSB7Ci0JCWlmIChkZXYtPmlkLnZlbmRvciA9PSBkZXZpY2VzW2ldLmlkVmVuZG9yICYmCi0JCSAgICBkZXYtPmlkLnByb2R1Y3QgPT0gZGV2aWNlc1tpXS5pZFByb2R1Y3QpIHsKLQkJCWZmX2JpdHMgPSBkZXZpY2VzW2ldLmZmOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBmZl9iaXRzW2ldID49IDA7IGkrKykKLQkJc2V0X2JpdChmZl9iaXRzW2ldLCBkZXYtPmZmYml0KTsKLQotCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCBOVUxMLCBoaWRfbGdmZl9wbGF5KTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBmb3JjZSBmZWVkYmFjayBkZXZpY2VzIGJ5IEpvaGFubiBEZW5ldXggPGpvaGFubi5kZW5ldXhAaXQudXUuc2U+XG4iKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCmluZGV4IDAxMTMyNjEuLjQ4NGUzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKQEAgLTM5Nyw3ICszOTcsNiBAQAogCQkJICBlZmZlY3QtPnUuY29uZGl0aW9uW2ldLmxlZnRfc2F0dXJhdGlvbik7CiAJCXBpZGZmX3NldCgmcGlkZmYtPnNldF9jb25kaXRpb25bUElEX0RFQURfQkFORF0sCiAJCQkgIGVmZmVjdC0+dS5jb25kaXRpb25baV0uZGVhZGJhbmQpOwotCQl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKIAkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9DT05ESVRJT05dLAogCQkJCSAgVVNCX0RJUl9PVVQpOwogCX0KQEAgLTUxMiw3ICs1MTEsNiBAQAogCQlwaWRmZi0+ZWZmZWN0X29wZXJhdGlvbltQSURfTE9PUF9DT1VOVF0udmFsdWVbMF0gPSBuOwogCX0KIAotCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9FRkZFQ1RfT1BFUkFUSU9OXSwKIAkJCSAgVVNCX0RJUl9PVVQpOwogfQpAQCAtNTQ4LDYgKzU0Niw5IEBACiAJaW50IHBpZF9pZCA9IHBpZGZmLT5waWRfaWRbZWZmZWN0X2lkXTsKIAogCWRlYnVnKCJzdGFydGluZyB0byBlcmFzZSAlZC8lZCIsIGVmZmVjdF9pZCwgcGlkZmYtPnBpZF9pZFtlZmZlY3RfaWRdKTsKKwkvKiBXYWl0IGZvciB0aGUgcXVldWUgdG8gY2xlYXIuIFdlIGRvIG5vdCB3YW50IGEgZnVsbCBmaWZvIHRvCisJICAgcHJldmVudCB0aGUgZWZmZWN0IHJlbW92YWwuICovCisJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAJcGlkZmZfcGxheWJhY2tfcGlkKHBpZGZmLCBwaWRfaWQsIDApOwogCXBpZGZmX2VyYXNlX3BpZChwaWRmZiwgcGlkX2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1wbGZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBsZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViODNjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBsZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBkZXZpY2VzCi0gKgotICogIFRoZSBkZXZpY2VzIGFyZSBkaXN0cmlidXRlZCB1bmRlciB2YXJpb3VzIG5hbWVzIGFuZCB0aGUgc2FtZSBVU0IgZGV2aWNlIElECi0gKiAgY2FuIGJlIHVzZWQgaW4gYm90aCBhZGFwdGVycyBhbmQgYWN0dWFsIGdhbWUgY29udHJvbGxlcnMuCi0gKgotICogIDA4MTA6MDAwMSAiVHdpbiBVU0IgSm95c3RpY2siCi0gKiAgIC0gdGVzdGVkIHdpdGggUGFudGhlckxvcmQgVVNCL1BTMiAyaW4xIEFkYXB0ZXIKLSAqICAgLSBjb250YWlucyB0d28gcmVwb3J0cywgb25lIGZvciBlYWNoIHBvcnQgKEhJRF9RVUlSS19NVUxUSV9JTlBVVCkKLSAqCi0gKiAgMGU4ZjowMDAzICJHcmVlbkFzaWEgSW5jLiAgICBVU0IgSm95c3RpY2sgICAgICIKLSAqICAgLSB0ZXN0ZWQgd2l0aCBLw7ZuZyBHYW1pbmcgZ2FtZXBhZAotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNkZWZpbmUgZGVidWcoZm9ybWF0LCBhcmcuLi4pIHByX2RlYnVnKCJoaWQtcGxmZjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlkLmg+Ci0jaW5jbHVkZSAidXNiaGlkLmgiCi0KLXN0cnVjdCBwbGZmX2RldmljZSB7Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKLX07Ci0KLXN0YXRpYyBpbnQgaGlkX3BsZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBwbGZmX2RldmljZSAqcGxmZiA9IGRhdGE7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCi0JbGVmdCA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsKLQlyaWdodCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7Ci0JZGVidWcoImNhbGxlZCB3aXRoIDB4JTA0eCAweCUwNHgiLCBsZWZ0LCByaWdodCk7Ci0KLQlsZWZ0ID0gbGVmdCAqIDB4N2YgLyAweGZmZmY7Ci0JcmlnaHQgPSByaWdodCAqIDB4N2YgLyAweGZmZmY7Ci0KLQlwbGZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IGxlZnQ7Ci0JcGxmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbM10gPSByaWdodDsKLQlkZWJ1ZygicnVubmluZyB3aXRoIDB4JTAyeCAweCUwMngiLCBsZWZ0LCByaWdodCk7Ci0JdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwbGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaGlkX3BsZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQotewotCXN0cnVjdCBwbGZmX2RldmljZSAqcGxmZjsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KLQkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfcHRyID0gcmVwb3J0X2xpc3Q7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2OwotCWludCBlcnJvcjsKLQotCS8qIFRoZSBkZXZpY2UgY29udGFpbnMgb25lIG91dHB1dCByZXBvcnQgcGVyIHBoeXNpY2FsIGRldmljZSwgYWxsCi0JICAgY29udGFpbmluZyAxIGZpZWxkLCB3aGljaCBjb250YWlucyA0IGZmMDAuMDAwMiB1c2FnZXMgYW5kIDQgMTZiaXQKLQkgICBhYnNvbHV0ZSB2YWx1ZXMuCi0KLQkgICBUaGUgaW5wdXQgcmVwb3J0cyBhbHNvIGNvbnRhaW4gYSBmaWVsZCB3aGljaCBjb250YWlucwotCSAgIDggZmYwMC4wMDAxIHVzYWdlcyBhbmQgOCBib29sZWFuIHZhbHVlcy4gVGhlaXIgbWVhbmluZyBpcwotCSAgIGN1cnJlbnRseSB1bmtub3duLiAqLwotCi0JaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLXBsZmY6IG5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoaWRpbnB1dCwgJmhpZC0+aW5wdXRzLCBsaXN0KSB7Ci0KLQkJcmVwb3J0X3B0ciA9IHJlcG9ydF9wdHItPm5leHQ7Ci0KLQkJaWYgKHJlcG9ydF9wdHIgPT0gcmVwb3J0X2xpc3QpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBsZmY6IHJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgbWlzc2luZ1xuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwotCQlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBsZmY6IG5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBsZmY6IG5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCXBsZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGxmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwbGZmKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJZGV2ID0gaGlkaW5wdXQtPmlucHV0OwotCi0JCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKLQotCQllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgcGxmZiwgaGlkX3BsZmZfcGxheSk7Ci0JCWlmIChlcnJvcikgewotCQkJa2ZyZWUocGxmZik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQotCQlwbGZmLT5yZXBvcnQgPSByZXBvcnQ7Ci0JCXBsZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMDsKLQkJcGxmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDAwOwotCQlwbGZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7Ci0JCXBsZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKLQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwbGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJoaWQtcGxmZjogRm9yY2UgZmVlZGJhY2sgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSAiCi0JICAgICAgICJkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCmluZGV4IGIxNWY4ODIuLjQ3ZWJlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpAQCAtMTcsNDEyICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0E0VEVDSAkJMHgwOWRhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUJMHgwMDA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQTRURUNIX1g1XzAwNUQJMHgwMDBhCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQVNISU1BCQkweDA2ZDYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX0dBTUVQQUQJMHgwMDI1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUgkweDAwMjYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FDRUNBRAkJMHgwNDYwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUNFQ0FEX0ZMQUlSCTB4MDAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF8zMDIJMHgwMDA4Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BRFNfVEVDSCAJCTB4MDZlMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FEU19URUNIX1JBRElPX1NJNDcwWAkweGExNTUKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FGQVRFQ0gJCTB4MTVhNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FGQVRFQ0hfQUY5MDE2CTB4OTAxNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlQVEVLCQkweDA4Y2EKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEJCTB4MDAwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18xMAkJMHgwMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwCQkweDAwMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEJCTB4MDAyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMgkJMHgwMDIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzCQkweDAwMjMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQJCTB4MDAyNAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUJCTB4MTZDQQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMQkJMHgxNTAyCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTENPUgkJMHgwNThmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUxDT1JfVVNCUlMyMzIJMHg5NzIwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTFBTCQkweDA0MzMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9JQk1fR0FNRVBBRAkweDExMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRQkweDAzMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJCTB4MDIwZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTwkweDAyMGYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSQkweDAyMTQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPCTB4MDIxNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMJMHgwMjE2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJCTB4MDIxNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPCTB4MDIxOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTCTB4MDIxOQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSQkweDAyMWEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTwkweDAyMWIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUwkweDAyMWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfQU5TSQkweDAyMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfSVNPCTB4MDIyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9KSVMJMHgwMjIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklOR19BTlNJCTB4MDIyMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSVNPCTB4MDIyNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSklTCTB4MDIyNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfQU5TSSAgICAweDAyMjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0lTTyAgICAgMHgwMjJhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9IRl9KSVMgICAgIDB4MDIyYgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19BTlNJICAweDAyMmMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfSVNPICAgMHgwMjJkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUyAgIDB4MDIyZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0FOU0kJMHgwMjMwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPCTB4MDIzMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUwkweDAyMzIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZCTB4MDMwYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWQkweDAzMGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9JUkNPTlRST0w0CTB4ODI0MgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQVNVUwkJMHgwYjA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVNVU19MQ00JCTB4MTcyNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQVRFTgkJMHgwNTU3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNCTB4MjAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVCTB4MjIwMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fMlBPUlRLVk0JMHgyMjA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTQkweDIyMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQwkweDIyMDgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFUktTSElSRQkJMHgwYzk4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QJMHgxMTQwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0NISUMJCTB4MDVmZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNfR0FNRVBBRAkweDAwMTQKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0NJREMJCTB4MTY3NwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ01FRElBCQkweDBkOGMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DTTEwOQkJMHgwMDBlCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MJCTB4MDdjMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QJMHgxNTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19MQVNUCTB4MTVmZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lHTkFMCQkweDEwYzQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWUdOQUxfUkFESU9fU0k0NzBYCTB4ODE4YQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lQUkVTUwkJMHgwNGI0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRQkweDAwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTQkweDU1MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UJMHg3NDE3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEJMHhkZTYxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIJMHhkZTY0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxMCQkweDQxM2MKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4CTB4MjAwNQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMT1JNRQkJMHgxMTYzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUgMHgwMTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwCTB4MDIwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfRE1JCQkweDBjMGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ETUlfRU5DCQkweDVmYWIKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VMTwkJMHgwNEU3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMAkweDAwMjAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZCTB4MGQ3ZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1IDB4MDEwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfRVpLRVkgCQkweDA1MTgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9CVENfODE5MwkJMHgwMDAyCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HQU1FUk9OCQkweDA4MTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUFNYX0FEQVBUT1IJMHgwMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNICTB4MGRmYwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR0xBQgkJMHgwNmMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzAJMHgwMDM4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzAJMHgwMDM5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8wXzRfSUZfS0lUCTB4MDA0MAotI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lUCTB4MDA0NAotI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVAkweDAwNDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfN19JRl9LSVQJMHgwMDUxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lUCTB4MDA1MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MCTB4MDA1OAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR09UT1AJCTB4MDhmMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX1NVUEVSX1EyCQkweDAwN2YKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HT0dPUEVOCQkweDAwY2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9QRU5QT1dFUgkJMHgwMGY0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HUkVUQUdNQUNCRVRICTB4MDk3MQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dSRVRBR01BQ0JFVEhfSFVFWQkweDIwMDUKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0dSSUZGSU4JCTB4MDc3ZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPV0VSTUFURQkJMHgwNDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRLTk9CCQkweDA0QUEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0dUQ08JCTB4MDc4YwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fOTAJCTB4MDA5MAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwCQkweDAxMDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMQkJMHgwMTAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDMJCTB4MDEwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA0CQkweDAxMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNQkJMHgwMTA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDYJCTB4MDEwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA3CQkweDAxMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwOAkJMHgwMTA4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDAJCTB4MDIwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAxCQkweDAyMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMgkJMHgwMjAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDMJCTB4MDIwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA0CQkweDAyMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNQkJMHgwMjA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDYJCTB4MDIwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA3CQkweDAyMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMAkJMHgwMzAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDEJCTB4MDMwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAyCQkweDAzMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMwkJMHgwMzAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDQJCTB4MDMwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA1CQkweDAzMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNgkJMHgwMzA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDcJCTB4MDMwNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA4CQkweDAzMDgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwOQkJMHgwMzA5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDAJCTB4MDQwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAxCQkweDA0MDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMgkJMHgwNDAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDMJCTB4MDQwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA0CQkweDA0MDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwNQkJMHgwNDA1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDAJCTB4MDUwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAxCQkweDA1MDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMgkJMHgwNTAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDMJCTB4MDUwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTA0CQkweDA1MDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAJCTB4MTAwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMQkJMHgxMDAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAyCQkweDEwMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMJCTB4MTAwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNAkJMHgxMDA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA1CQkweDEwMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYJCTB4MTAwNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNwkJMHgxMDA3Ci0jZGVmaW5lIFVTQl9WRU5ET1JfSURfSEFQUAkJMHgwNzhiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9EUklWSU5HCTB4MDAxMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HCTB4MDAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcJMHgwMDMwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9JTUFUSU9OCQkweDA3MTgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQQkweGQwMDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0tCR0VBUgkJMHgwODRlCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTwkweDEwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9DQVNTWQkJMHgxMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9DS0VUQ0FTU1kJMHgxMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTU9CSUxFQ0FTU1kJMHgxMDIwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfSldNCQkweDEwODAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9ETU1QCQkweDEwODEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9VTUlQCQkweDEwOTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9YUkFZMQkJMHgxMTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfWFJBWTIJCTB4MTEwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NCTB4MTIwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIJMHgyMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQJMHgyMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSIDB4MjAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTAkweDIwMzAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVAkweDIwNDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0xPR0lURUNICQkweDA0NmQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9MWDMJMHhjMDQ0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVjE1MAkweGMwNDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUgkweGMxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZICAweGMxMTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIgMHhjMTExCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zIDB4YzExMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNCAweGMxMTMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUgMHhjMTE0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82IDB4YzExNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNyAweGMxMTYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzggMHhjMTE3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV85IDB4YzExOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTAgMHhjMTE5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xMSAweGMxMWEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzEyIDB4YzExYgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTMgMHhjMTFjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNCAweGMxMWQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE1IDB4YzExZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTYgMHhjMTFmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNyAweGMxMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE4IDB4YzEyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTkgMHhjMTIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMCAweGMxMjMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIxIDB4YzEyNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjIgMHhjMTI1Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMyAweGMxMjYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI0IDB4YzEyNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjUgMHhjMTI4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yNiAweGMxMjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI3IDB4YzEyYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjggMHhjMTJiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yOSAweGMxMmMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMwIDB4YzEyZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzEgMHhjMTJlCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zMiAweGMxMmYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMzIDB4YzEzMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzQgMHhjMTMxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zNSAweGMxMzIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM2IDB4YzEzMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzcgMHhjMTM0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zOCAweGMxMzUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM5IDB4YzEzNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDAgMHhjMTM3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80MSAweGMxMzgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQyIDB4YzEzOQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDMgMHhjMTNhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NCAweGMxM2IKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ1IDB4YzEzYwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDYgMHhjMTNkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NyAweGMxM2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ4IDB4YzEzZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDkgMHhjMTQwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MCAweGMxNDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUxIDB4YzE0MgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTIgMHhjMTQzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MyAweGMxNDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU0IDB4YzE0NQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTUgMHhjMTQ2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81NiAweGMxNDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU3IDB4YzE0OAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTggMHhjMTQ5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81OSAweGMxNGEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYwIDB4YzE0YgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjEgMHhjMTRjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82MiAweGMxNGQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYzIDB4YzE0ZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjQgMHhjMTRmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRVhUUkVNRV8zRAkweGMyMTUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTAkweGMyOTQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQJMHhjMzBhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JECTB4YzMxMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVIJMHhjNTBjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCTB4YzUxNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAJMHhjNTEyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSCTB4YzUxMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QCTB4YzcwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFCTB4YzcxNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JCTB4YzcxZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTUNDCQkweDA5ZGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTAyNExTCTB4MDA3NgotI2RlZmluZSBVU0JfREVWSUNFX0lEX01DQ19QTUQxMjA4TFMJMHgwMDdhCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NR0UJCTB4MDQ2MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMJCTB4ZmZmZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMxCQkweDAwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUAkJMHgwNGQ4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElDS0lUMQkJMHgwMDMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElDS0lUMgkJMHgwMDMzCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQJCTB4MDQ1ZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YJMHgwMDNiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfV0lSRUxFU1NfT1BUSUNBTF9ERVNLVE9QXzNfMCAweDAwOWQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERVNLVE9QX1JFQ1ZfMTAyOCAweDAwZjkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19ORTRLCQkweDAwZGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19MSzZLCQkweDAwZjkKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX01PTlRFUkVZCQkweDA1NjYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUJMHgzMDA0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OQ1IJCTB4MDQwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVAkJMHgwMzAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkNSX0xBU1QJCTB4MDNmZgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiAweDA0MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSAgICAgICAweGMzNTkKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX05BVFNVICAgICAgICAgICAgIDB4MDhiNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX05BVFNVX0dBTUVQQUQgICAgIDB4MDAwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTkVDCQkweDA3M2UKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORUNfVVNCX0dBTUVfUEFECTB4MDMwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfT05UUkFLCQkweDBhMDcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwCTB4MDA2NAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOSklUCQkweDEzNGMKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JECTB4MDgxMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLCTB4MDAwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfUEVUQUxZTlgJCTB4MThiMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUJMHgwMDM3Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NCTB4MGI0MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJCTB4MDAwMwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FJVEVLCQkweDA2YTMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFECTB4ZmYxNwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FNU1VORwkJMHgwNDE5Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUJMHgwMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT05ZCQkJMHgwNTRjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUgkweDAyNjgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgJMHgxNWMyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRAkweDAwMzgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfU1VOUExVUwkJMHgwNGZjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUAkweDA1ZDgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUE1BWAkJMHgwNjYzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFECTB4MDEwMwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfVFVSQk9YCQkweDA2MmEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQJMHgwMjAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSCQkweDA4ZjcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xBQlBSTwkweDAwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUAkweDAwMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVAJMHgwMDAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9DWUNMT1BTCTB4MDAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTENTUEVDCTB4MDAwNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfV0FDT00JCTB4MDU2YQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQCQkweDA5MjUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18yMAkweDgxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18yMAkweDgxMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQJMHg4MjAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUVVBRF9VU0JfSk9ZUEFECTB4ODgwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRAkweDg4NjYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQJMHg2Njc3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTIDB4ODgwMgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfWUVBTElOSwkJMHg2OTkzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfWUVBTElOS19QMUtfUDRLX0IySwkweGIwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0tZRQkJMHgwNDU4Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwCTB4NTAwMworI2luY2x1ZGUgIi4uL2hpZC1pZHMuaCIKIAogLyoKICAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KQEAgLTQzMywxOCArMjgsMTAgQEAKIAlfX3UxNiBpZFByb2R1Y3Q7CiAJX191MzIgcXVpcmtzOwogfSBoaWRfYmxhY2tsaXN0W10gPSB7Ci0KLQl7IFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNyB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1g1XzAwNUQsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19COCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181IH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIsIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUyB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FBU0hJTUEsIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9QUkVEQVRPUiwgSElEX1FVSVJLX0JBRFBBRCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BTFBTLCBVU0JfREVWSUNFX0lEX0lCTV9HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NISUMsIFVTQl9ERVZJQ0VfSURfQ0hJQ19HQU1FUEFELCBISURfUVVJUktfQkFEUEFEIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0RSSVZJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0ZMWUlORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKQEAgLTQ1MywxNjkgKzQwLDExIEBACiAJeyBVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUlVNQkxFUEFELCBISURfUVVJUktfQkFEUEFEIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RPUE1BWCwgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fREVTS1RPUCwgSElEX1FVSVJLX0RVUExJQ0FURV9VU0FHRVMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX0VER0UsIEhJRF9RVUlSS19EVVBMSUNBVEVfVVNBR0VTIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19NSU5JLCBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUyB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FGQVRFQ0gsIFVTQl9ERVZJQ0VfSURfQUZBVEVDSF9BRjkwMTYsIEhJRF9RVUlSS19GVUxMU1BFRURfSU5URVJWQUwgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9CRUxLSU4sIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0sIEhJRF9RVUlSS19ISURERVYgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfSVJDT05UUk9MNCwgSElEX1FVSVJLX0hJRERFViB8IEhJRF9RVUlSS19JR05PUkVfSElESU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSwgSElEX1FVSVJLX0hJRERFViB8IEhJRF9RVUlSS19JR05PUkVfSElESU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX1NJREVXSU5ERVJfR1YsIEhJRF9RVUlSS19ISURJTlBVVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0VaS0VZLCBVU0JfREVWSUNFX0lEX0JUQ184MTkzLCBISURfUVVJUktfSFdIRUVMX1dIRUVMX0lOVkVSVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FEU19URUNILCBVU0JfREVWSUNFX0lEX0FEU19URUNIX1JBRElPX1NJNDcwWCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMTAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BU1VTLCBVU0JfREVWSUNFX0lEX0FTVVNfTENNLCBISURfUVVJUktfSUdOT1JFfSwKLQl7IFVTQl9WRU5ET1JfSURfQkVSS1NISVJFLCBVU0JfREVWSUNFX0lEX0JFUktTSElSRV9QQ1dELCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0NJREMsIDB4MDEwMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWUdOQUwsIFVTQl9ERVZJQ0VfSURfQ1lHTkFMX1JBRElPX1NJNDcwWCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0RFTE9STUUsIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzBfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzE2XzE2X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfOF83X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfOF84X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX1NVUEVSX1EyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dPVE9QLCBVU0JfREVWSUNFX0lEX0dPR09QRU4sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR09UT1AsIFVTQl9ERVZJQ0VfSURfUEVOUE9XRVIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JFVEFHTUFDQkVUSCwgVVNCX0RFVklDRV9JRF9HUkVUQUdNQUNCRVRIX0hVRVksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzkwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwOCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwNiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwOSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzUwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfSU1BVElPTiwgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LQkdFQVIsIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9DQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9KV00sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfRE1NUCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9VTUlQLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1NPVU5ER1JBUEgsIFVTQl9ERVZJQ0VfSURfU09VTkRHUkFQSF9JTU9OX0xDRCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0xDU1BFQywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfWUVBTElOSywgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNLSVQxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUCwgVVNCX0RFVklDRV9JRF9QSUNLSVQyLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JELCBISURfUVVJUktfTE9HSVRFQ0hfSUdOT1JFX0RPVUJMRURfV0hFRUwgfCBISURfUVVJUktfTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAsIEhJRF9RVUlSS19MT0dJVEVDSF9JR05PUkVfRE9VQkxFRF9XSEVFTCB8IEhJRF9RVUlSS19MT0dJVEVDSF9FWFBBTkRFRF9LRVlNQVAgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTFgzLCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9WMTUwLCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ORTRLLCBISURfUVVJUktfTUlDUk9TT0ZUX0tFWVMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0xLNkssIEhJRF9RVUlSS19NSUNST1NPRlRfS0VZUyB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFLCBISURfUVVJUktfTUlHSFRZTU9VU0UgfCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAotCiAJeyBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JELCBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLLCBISURfUVVJUktfTVVMVElfSU5QVVQgfCBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUyB9LAogCXsgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NLCBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAotCXsgVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIsIEhJRF9RVUlSS19TT05ZX1BTM19DT05UUk9MTEVSIHwgSElEX1FVSVJLX0hJRERFViB9LAotCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX0NTMTI0VSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl8yUE9SVEtWTSwgSElEX1FVSVJLX05PR0VUIH0sCkBAIC02MjMsMTQ0ICs1MiwxMyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9BVEVOLCBVU0JfREVWSUNFX0lEX0FURU5fNFBPUlRLVk1DLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfRE1JLCBVU0JfREVWSUNFX0lEX0RNSV9FTkMsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9FTE8sIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMCwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VYVFJFTUVfM0QsIEhJRF9RVUlSS19OT0dFVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTCwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wLCBISURfUVVJUktfTk9HRVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1NVTiwgVVNCX0RFVklDRV9JRF9SQVJJVEFOX0tWTV9ET05HTEUsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9UVVJCT1gsIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJELCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIHwgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX1FVQURfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURCwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08sIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMsIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfQU5TSSwgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08sIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkR9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0lTTywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSEZfSVNPLCBISURfUVVJUktfQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0hGX0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0lTTywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTX0pJUywgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0ksIEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfSVNPLCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0FQUExFX0lTT19LRVlCT0FSRCB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0V9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0V9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9BTlNJLCBISURfUVVJUktfQVBQTEVfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRX0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0lTTywgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19BUFBMRV9JU09fS0VZQk9BUkQgfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkcyX0pJUywgSElEX1FVSVJLX0FQUExFX0hBU19GTiAgfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFksIEhJRF9RVUlSS19BUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEhJRF9RVUlSS19BUFBMRV9IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSwgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgSElEX1FVSVJLX0FQUExFX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgsIEhJRF9RVUlSS19SRVNFVF9MRURTIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRCwgSElEX1FVSVJLX1JFU0VUX0xFRFMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV85LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzEyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8xNywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzE4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMTksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzIxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yNiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzI3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMjgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8yOSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzMzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfMzcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV8zOCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzM5LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80MSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV80NywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzQ4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNDksIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzUxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81MywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81NiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzU3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNTgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV81OSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV82MiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZXzYzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0hBUk1PTllfNjQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTkFUSU9OQUxfU0VNSUNPTkRVQ1RPUiwgVVNCX0RFVklDRV9JRF9OX1NfSEFSTU9OWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IDAsIDAgfQotfTsKLQotLyogUXVpcmtzIGZvciBkZXZpY2VzIHdoaWNoIHJlcXVpcmUgcmVwb3J0IGRlc2NyaXB0b3IgZml4dXAgZ28gaGVyZSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfcmRlc2NfYmxhY2tsaXN0IHsKLQlfX3UxNiBpZFZlbmRvcjsKLQlfX3UxNiBpZFByb2R1Y3Q7Ci0JX191MzIgcXVpcmtzOwotfSBoaWRfcmRlc2NfYmxhY2tsaXN0W10gPSB7Ci0KLQl7IFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSLCBISURfUVVJUktfUkRFU0NfTE9HSVRFQ0ggfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUiwgSElEX1FVSVJLX1JERVNDX0xPR0lURUNIIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMiwgSElEX1FVSVJLX1JERVNDX0xPR0lURUNIIH0sCi0JeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9ERVNLVE9QX1JFQ1ZfMTAyOCwgSElEX1FVSVJLX1JERVNDX01JQ1JPU09GVF9SRUNWXzEwMjggfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9NT05URVJFWSwgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUsIEhJRF9RVUlSS19SREVTQ19CVVRUT05fQ09OU1VNRVIgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUywgSElEX1FVSVJLX1JERVNDX01BQ0JPT0tfSklTIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSwgSElEX1FVSVJLX1JERVNDX1BFVEFMWU5YIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSwgSElEX1FVSVJLX1JERVNDX1NBTVNVTkdfUkVNT1RFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfU1VOUExVUywgVVNCX0RFVklDRV9JRF9TVU5QTFVTX1dERVNLVE9QLCBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEsIEhJRF9RVUlSS19SREVTQ19TV0FQUEVEX01JTl9NQVggfSwKLQl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMiwgSElEX1FVSVJLX1JERVNDX1NXQVBQRURfTUlOX01BWCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFREMiwgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCiAJeyAwLCAwIH0KIH07CkBAIC05NzQsMTYgKzI3Miw2IEBACiAJdTMyIHF1aXJrcyA9IDA7CiAJY29uc3Qgc3RydWN0IGhpZF9ibGFja2xpc3QgKmJsX2VudHJ5ID0gTlVMTDsKIAotCS8qIElnbm9yZSBhbGwgV2Fjb20gZGV2aWNlcyAqLwotCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX1dBQ09NKQotCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKLQotCS8qIGlnbm9yZSBhbGwgQ29kZSBNZXJjZW5hcmllcyBJT1dhcnJpb3IgZGV2aWNlcyAqLwotCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUykKLQkJaWYgKGlkUHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QgJiYKLQkJCQlpZFByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QpCi0JCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKLQogCS8qIE5DUiBkZXZpY2VzIG11c3Qgbm90IGJlIHF1ZXJpZWQgZm9yIHJlcG9ydHMgKi8KIAlpZiAoaWRWZW5kb3IgPT0gVVNCX1ZFTkRPUl9JRF9OQ1IgJiYKIAkJCWlkUHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX05DUl9GSVJTVCAmJgpAQCAtMTAwMiwyMjEgKzI5MCwzIEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYmhpZF9sb29rdXBfcXVpcmspOwotCi0vKgotICogQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIGhhdmUgYW4gaW52YWxpZCBISUQgcmVwb3J0IGRlc2NyaXB0b3IsCi0gKiB0aGF0IG5lZWRzIGZpeGluZyBiZWZvcmUgd2UgY2FuIHBhcnNlIGl0LgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfY3ltb3Rpb25fZGVzY3JpcHRvcihjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSAxNyAmJiByZGVzY1sxMV0gPT0gMHgzYyAmJiByZGVzY1sxMl0gPT0gMHgwMikgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgQ2hlcnJ5IEN5bW90aW9uIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbMTFdID0gcmRlc2NbMTZdID0gMHhmZjsKLQkJcmRlc2NbMTJdID0gcmRlc2NbMTddID0gMHgwMzsKLQl9Ci19Ci0KLQotLyoKLSAqIENlcnRhaW4gTG9naXRlY2gga2V5Ym9hcmRzIHNlbmQgaW4gcmVwb3J0ICMzIGtleXMgd2hpY2ggYXJlIGZhcgotICogYWJvdmUgdGhlIGxvZ2ljYWwgbWF4aW11bSBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci4gVGhpcyBleHRlbmRzCi0gKiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgMHgyOGMgb2YgbG9naWNhbCBtYXhpbXVtIHRvIDB4MTA0ZAotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfbG9naXRlY2hfZGVzY3JpcHRvcih1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSA5MCAmJiByZGVzY1s4M10gPT0gMHgyNgotCQkJJiYgcmRlc2NbODRdID09IDB4OGMKLQkJCSYmIHJkZXNjWzg1XSA9PSAweDAyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBMb2dpdGVjaCBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzg0XSA9IHJkZXNjWzg5XSA9IDB4NGQ7Ci0JCXJkZXNjWzg1XSA9IHJkZXNjWzkwXSA9IDB4MTA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfc3VucGx1c193ZGVza3RvcCh1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSAxMDcgJiYgcmRlc2NbMTA0XSA9PSAweDI2Ci0JCQkgJiYgcmRlc2NbMTA1XSA9PSAweDgwCi0JCQkgJiYgcmRlc2NbMTA2XSA9PSAweDAzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBTdW5wbHVzIFdpcmVsZXNzIERlc2t0b3AgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotCQlyZGVzY1sxMDVdID0gcmRlc2NbMTEwXSA9IDB4MDM7Ci0JCXJkZXNjWzEwNl0gPSByZGVzY1sxMTFdID0gMHgyMTsKLQl9Ci19Ci0KLS8qCi0gKiBTYW1zdW5nIElyREEgcmVtb3RlIGNvbnRyb2xsZXIgKHJlcG9ydHMgYXMgQ3lwcmVzcyBVU0IgTW91c2UpLgotICoKLSAqIFZlbmRvciBzcGVjaWZpYyByZXBvcnQgIzQgaGFzIGEgc2l6ZSBvZiA0OCBiaXQsCi0gKiBhbmQgdGhlcmVmb3JlIGlzIG5vdCBhY2NlcHRlZCB3aGVuIGluc3BlY3RpbmcgdGhlIGRlc2NyaXB0b3JzLgotICogQXMgYSB3b3JrYXJvdW5kIHdlIHJlaW50ZXJwcmV0IHRoZSByZXBvcnQgYXM6Ci0gKiAgIFZhcmlhYmxlIHR5cGUsIGNvdW50IDYsIHNpemUgOCBiaXQsIGxvZy4gbWF4aW11bSAyNTUKLSAqIFRoZSBidXJkZW4gdG8gcmVjb25zdHJ1Y3QgdGhlIGRhdGEgaXMgbW92ZWQgaW50byB1c2VyIHNwYWNlLgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfc2Ftc3VuZ19pcmRhX2Rlc2NyaXB0b3IodW5zaWduZWQgY2hhciAqcmRlc2MsCi0JCQkJCQkgIGludCByc2l6ZSkKLXsKLQlpZiAocnNpemUgPj0gMTgyICYmIHJkZXNjWzE3NV0gPT0gMHgyNQotCQkJICYmIHJkZXNjWzE3Nl0gPT0gMHg0MAotCQkJICYmIHJkZXNjWzE3N10gPT0gMHg3NQotCQkJICYmIHJkZXNjWzE3OF0gPT0gMHgzMAotCQkJICYmIHJkZXNjWzE3OV0gPT0gMHg5NQotCQkJICYmIHJkZXNjWzE4MF0gPT0gMHgwMQotCQkJICYmIHJkZXNjWzE4Ml0gPT0gMHg0MCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgU2Ftc3VuZyBJckRBIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbMTc2XSA9IDB4ZmY7Ci0JCXJkZXNjWzE3OF0gPSAweDA4OwotCQlyZGVzY1sxODBdID0gMHgwNjsKLQkJcmRlc2NbMTgyXSA9IDB4NDI7Ci0JfQotfQotCi0vKiBQZXRhbHlueCBNYXh0ZXIgUmVtb3RlIGhhcyBtYXhpbXVtIGZvciBjb25zdW1lciBwYWdlIHNldCB0b28gbG93ICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfcGV0YWx5bnhfZGVzY3JpcHRvcih1bnNpZ25lZCBjaGFyICpyZGVzYywgaW50IHJzaXplKQotewotCWlmIChyc2l6ZSA+PSA2MCAmJiByZGVzY1szOV0gPT0gMHgyYQotCQkJJiYgcmRlc2NbNDBdID09IDB4ZjUKLQkJCSYmIHJkZXNjWzQxXSA9PSAweDAwCi0JCQkmJiByZGVzY1s1OV0gPT0gMHgyNgotCQkJJiYgcmRlc2NbNjBdID09IDB4ZjkKLQkJCSYmIHJkZXNjWzYxXSA9PSAweDAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBQZXRhbHlueCBNYXh0ZXIgUmVtb3RlIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKLQkJcmRlc2NbNjBdID0gMHhmYTsKLQkJcmRlc2NbNDBdID0gMHhmYTsKLQl9Ci19Ci0KLS8qCi0gKiBTb21lIFVTQiBiYXJjb2RlIHJlYWRlcnMgZnJvbSBjeXByZXNzIGhhdmUgdXNhZ2UgbWluIGFuZCB1c2FnZSBtYXggaW4KLSAqIHRoZSB3cm9uZyBvcmRlcgotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfY3lwcmVzc19kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0Jc2hvcnQgZml4ZWQgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJzaXplIC0gNDsgaSsrKSB7Ci0JCWlmIChyZGVzY1tpXSA9PSAweDI5ICYmIHJkZXNjIFtpKzJdID09IDB4MTkpIHsKLQkJCXVuc2lnbmVkIGNoYXIgdG1wOwotCi0JCQlyZGVzY1tpXSA9IDB4MTk7IHJkZXNjW2krMl0gPSAweDI5OwotCQkJdG1wID0gcmRlc2NbaSszXTsKLQkJCXJkZXNjW2krM10gPSByZGVzY1tpKzFdOwotCQkJcmRlc2NbaSsxXSA9IHRtcDsKLQkJfQotCX0KLQotCWlmIChmaXhlZCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRml4aW5nIHVwIEN5cHJlc3MgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotfQotCi0vKgotICogTWFjQm9vayBKSVMga2V5Ym9hcmQgaGFzIHdyb25nIGxvZ2ljYWwgbWF4aW11bQotICovCi1zdGF0aWMgdm9pZCB1c2JoaWRfZml4dXBfbWFjYm9va19kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID49IDYwICYmIHJkZXNjWzUzXSA9PSAweDY1Ci0JCQkmJiByZGVzY1s1OV0gPT0gMHg2NSkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgTWFjQm9vayBKSVMga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwotCQlyZGVzY1s1M10gPSByZGVzY1s1OV0gPSAweGU3OwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNiaGlkX2ZpeHVwX2J1dHRvbl9jb25zdW1lcl9kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID49IDMwICYmIHJkZXNjWzI5XSA9PSAweDA1Ci0JCQkmJiByZGVzY1szMF0gPT0gMHgwOSkgewotCQlwcmludGsoS0VSTl9JTkZPICJGaXhpbmcgdXAgYnV0dG9uL2NvbnN1bWVyIGluIEhJRCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzMwXSA9IDB4MGM7Ci0JfQotfQotCi0vKgotICogTWljcm9zb2Z0IFdpcmVsZXNzIERlc2t0b3AgUmVjZWl2ZXIgKE1vZGVsIDEwMjgpIGhhcyBzZXZlcmFsCi0gKiAnVXNhZ2UgTWluL01heCcgd2hlcmUgaXQgb3VnaHQgdG8gaGF2ZSAnUGh5c2ljYWwgTWluL01heCcKLSAqLwotc3RhdGljIHZvaWQgdXNiaGlkX2ZpeHVwX21pY3Jvc29mdF9kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCi17Ci0JaWYgKHJzaXplID09IDU3MSAmJiByZGVzY1syODRdID09IDB4MTkKLQkgICAgICAgICAgICAgICAgICYmIHJkZXNjWzI4Nl0gPT0gMHgyYQotCSAgICAgICAgICAgICAgICAgJiYgcmRlc2NbMzA0XSA9PSAweDE5Ci0JICAgICAgICAgICAgICAgICAmJiByZGVzY1szMDZdID09IDB4MjkKLQkgICAgICAgICAgICAgICAgICYmIHJkZXNjWzM1Ml0gPT0gMHgxYQotCSAgICAgICAgICAgICAgICAgJiYgcmRlc2NbMzU1XSA9PSAweDJhCi0JCQkgJiYgcmRlc2NbNTU3XSA9PSAweDE5Ci0JCQkgJiYgcmRlc2NbNTU5XSA9PSAweDI5KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZpeGluZyB1cCBNaWNyb3NvZnQgV2lyZWxlc3MgUmVjZWl2ZXIgTW9kZWwgMTAyOCByZXBvcnQgZGVzY3JpcHRvclxuIik7Ci0JCXJkZXNjWzI4NF0gPSByZGVzY1szMDRdID0gcmRlc2NbNTU3XSA9IDB4MzU7Ci0JCXJkZXNjWzM1Ml0gPSAweDM2OwotCQlyZGVzY1syODZdID0gcmRlc2NbMzU1XSA9IDB4NDY7Ci0JCXJkZXNjWzMwNl0gPSByZGVzY1s1NTldID0gMHg0NTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fdXNiaGlkX2ZpeHVwX3JlcG9ydF9kZXNjcmlwdG9yKF9fdTMyIHF1aXJrcywgY2hhciAqcmRlc2MsIHVuc2lnbmVkIHJzaXplKQotewotCWlmICgocXVpcmtzICYgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OKSkKLQkJdXNiaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfTE9HSVRFQ0gpCi0JCXVzYmhpZF9maXh1cF9sb2dpdGVjaF9kZXNjcmlwdG9yKHJkZXNjLCByc2l6ZSk7Ci0KLQlpZiAocXVpcmtzICYgSElEX1FVSVJLX1JERVNDX1NXQVBQRURfTUlOX01BWCkKLQkJdXNiaGlkX2ZpeHVwX2N5cHJlc3NfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwotCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19SREVTQ19QRVRBTFlOWCkKLQkJdXNiaGlkX2ZpeHVwX3BldGFseW54X2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfTUFDQk9PS19KSVMpCi0JCXVzYmhpZF9maXh1cF9tYWNib29rX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfQlVUVE9OX0NPTlNVTUVSKQotCQl1c2JoaWRfZml4dXBfYnV0dG9uX2NvbnN1bWVyX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfU0FNU1VOR19SRU1PVEUpCi0JCXVzYmhpZF9maXh1cF9zYW1zdW5nX2lyZGFfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwotCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19SREVTQ19NSUNST1NPRlRfUkVDVl8xMDI4KQotCQl1c2JoaWRfZml4dXBfbWljcm9zb2Z0X2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKLQotCWlmIChxdWlya3MgJiBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUCkKLQkJdXNiaGlkX2ZpeHVwX3N1bnBsdXNfd2Rlc2t0b3AocmRlc2MsIHJzaXplKTsKLX0KLQotLyoqCi0gKiB1c2JoaWRfZml4dXBfcmVwb3J0X2Rlc2NyaXB0b3I6IGNoZWNrIGlmIHJlcG9ydCBkZXNjcmlwdG9yIG5lZWRzIGZpeHVwCi0gKgotICogRGVzY3JpcHRpb246Ci0gKglXYWxrcyB0aGUgaGlkX3JkZXNjX2JsYWNrbGlzdFtdIGFycmF5IGFuZCBjaGVja3Mgd2hldGhlciB0aGUgZGV2aWNlCi0gKglpcyBrbm93biB0byBoYXZlIGJyb2tlbiByZXBvcnQgZGVzY3JpcHRvciB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIHVwCi0gKglwcmlvciB0byBlbnRlcmluZyB0aGUgSElEIHBhcnNlcgotICoKLSAqIFJldHVybnM6IG5vdGhpbmcKLSAqLwotdm9pZCB1c2JoaWRfZml4dXBfcmVwb3J0X2Rlc2NyaXB0b3IoY29uc3QgdTE2IGlkVmVuZG9yLCBjb25zdCB1MTYgaWRQcm9kdWN0LAotCQkJCSAgICBjaGFyICpyZGVzYywgdW5zaWduZWQgcnNpemUsIGNoYXIgKipxdWlya3NfcGFyYW0pCi17Ci0JaW50IG4sIG07Ci0JdTE2IHBhcmFtVmVuZG9yLCBwYXJhbVByb2R1Y3Q7Ci0JdTMyIHF1aXJrczsKLQotCS8qIHN0YXRpYyByZGVzYyBxdWlyayBlbnRyaWVzICovCi0JZm9yIChuID0gMDsgaGlkX3JkZXNjX2JsYWNrbGlzdFtuXS5pZFZlbmRvcjsgbisrKQotCQlpZiAoaGlkX3JkZXNjX2JsYWNrbGlzdFtuXS5pZFZlbmRvciA9PSBpZFZlbmRvciAmJgotCQkJCWhpZF9yZGVzY19ibGFja2xpc3Rbbl0uaWRQcm9kdWN0ID09IGlkUHJvZHVjdCkKLQkJCV9fdXNiaGlkX2ZpeHVwX3JlcG9ydF9kZXNjcmlwdG9yKGhpZF9yZGVzY19ibGFja2xpc3Rbbl0ucXVpcmtzLAotCQkJCQlyZGVzYywgcnNpemUpOwotCi0JLyogcnVudGltZSByZGVzYyBxdWlyayBlbnRyaWVzIGhhbmRsaW5nICovCi0JZm9yIChuID0gMDsgcXVpcmtzX3BhcmFtW25dICYmIG4gPCBNQVhfVVNCSElEX0JPT1RfUVVJUktTOyBuKyspIHsKLQkJbSA9IHNzY2FuZihxdWlya3NfcGFyYW1bbl0sICIweCVoeDoweCVoeDoweCV4IiwKLQkJCQkmcGFyYW1WZW5kb3IsICZwYXJhbVByb2R1Y3QsICZxdWlya3MpOwotCi0JCWlmIChtICE9IDMpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJIkNvdWxkIG5vdCBwYXJzZSBISUQgcXVpcmsgbW9kdWxlIHBhcmFtICVzXG4iLAotCQkJCXF1aXJrc19wYXJhbVtuXSk7Ci0JCWVsc2UgaWYgKHBhcmFtVmVuZG9yID09IGlkVmVuZG9yICYmIHBhcmFtUHJvZHVjdCA9PSBpZFByb2R1Y3QpCi0JCQlfX3VzYmhpZF9maXh1cF9yZXBvcnRfZGVzY3JpcHRvcihxdWlya3MsIHJkZXNjLCByc2l6ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC10bWZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NTc4Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgdmFyaW91cyBISUQgY29tcGxpYW50IGRldmljZXMgYnkgVGhydXN0TWFzdGVyOgotICogICAgVGhydXN0TWFzdGVyIEZpcmVTdG9ybSBEdWFsIFBvd2VyIDIKLSAqIGFuZCBwb3NzaWJseSBvdGhlcnMgd2hvc2UgZGV2aWNlIGlkcyBoYXZlbid0IGJlZW4gYWRkZWQuCi0gKgotICogIE1vZGlmaWVkIHRvIHN1cHBvcnQgVGhydXN0TWFzdGVyIGRldmljZXMgYnkgWmlueCBWZXJpdHVzZQotICogIG9uIDIwMDMtMDEtMjUgZnJvbSB0aGUgTG9naXRlY2ggZm9yY2UgZmVlZGJhY2sgZHJpdmVyLAotICogIHdoaWNoIGlzIGJ5IEpvaGFubiBEZW5ldXguCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwMyBaaW54IFZlcml0dXNlIDx6aW54QGVwaWNzb2wub3JnPgotICogIENvcHlyaWdodCAoYykgMjAwMiBKb2hhbm4gRGVuZXV4Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0KLSN1bmRlZiBERUJVRwotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi0jaW5jbHVkZSA8bGludXgvaGlkLmg+Ci0jaW5jbHVkZSAidXNiaGlkLmgiCi0KLS8qIFVzYWdlcyBmb3IgdGhydXN0bWFzdGVyIGRldmljZXMgSSBrbm93IGFib3V0ICovCi0jZGVmaW5lIFRIUlVTVE1BU1RFUl9VU0FHRV9GRgkoSElEX1VQX0dFTkRFU0sgfCAweGJiKQotCi1zdHJ1Y3QgZGV2X3R5cGUgewotCXUxNiBpZFZlbmRvcjsKLQl1MTYgaWRQcm9kdWN0OwotCWNvbnN0IHNpZ25lZCBzaG9ydCAqZmY7Ci19OwotCi1zdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IGZmX3J1bWJsZVtdID0gewotCUZGX1JVTUJMRSwKLQktMQotfTsKLQotc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCBmZl9qb3lzdGlja1tdID0gewotCUZGX0NPTlNUQU5ULAotCS0xCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl90eXBlIGRldmljZXNbXSA9IHsKLQl7IDB4NDRmLCAweGIzMDAsIGZmX3J1bWJsZSB9LAotCXsgMHg0NGYsIDB4YjMwNCwgZmZfcnVtYmxlIH0sCi0JeyAweDQ0ZiwgMHhiNjUxLCBmZl9ydW1ibGUgfSwJLyogRkdUIFJ1bWJsZSBGb3JjZSBXaGVlbCAqLwotCXsgMHg0NGYsIDB4YjY1NCwgZmZfam95c3RpY2sgfSwJLyogRkdUIEZvcmNlIEZlZWRiYWNrIFdoZWVsICovCi19OwotCi1zdHJ1Y3QgdG1mZl9kZXZpY2UgewotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0Jc3RydWN0IGhpZF9maWVsZCAqZmZfZmllbGQ7Ci19OwotCi0vKiBDaGFuZ2VzIHZhbHVlcyBmcm9tIDAgdG8gMHhmZmZmIGludG8gdmFsdWVzIGZyb20gbWluaW11bSB0byBtYXhpbXVtICovCi1zdGF0aWMgaW5saW5lIGludCBoaWRfdG1mZl9zY2FsZV91MTYodW5zaWduZWQgaW50IGluLAotCQkJCWludCBtaW5pbXVtLCBpbnQgbWF4aW11bSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gKGluICogKG1heGltdW0gLSBtaW5pbXVtKSAvIDB4ZmZmZikgKyBtaW5pbXVtOwotCWlmIChyZXQgPCBtaW5pbXVtKQotCQlyZXR1cm4gbWluaW11bTsKLQlpZiAocmV0ID4gbWF4aW11bSkKLQkJcmV0dXJuIG1heGltdW07Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogQ2hhbmdlcyB2YWx1ZXMgZnJvbSAtMHg4MCB0byAweDdmIGludG8gdmFsdWVzIGZyb20gbWluaW11bSB0byBtYXhpbXVtICovCi1zdGF0aWMgaW5saW5lIGludCBoaWRfdG1mZl9zY2FsZV9zOChpbnQgaW4sCi0JCQkJICAgIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gKCgoaW4gKyAweDgwKSAqIChtYXhpbXVtIC0gbWluaW11bSkpIC8gMHhmZikgKyBtaW5pbXVtOwotCWlmIChyZXQgPCBtaW5pbXVtKQotCQlyZXR1cm4gbWluaW11bTsKLQlpZiAocmV0ID4gbWF4aW11bSkKLQkJcmV0dXJuIG1heGltdW07Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBoaWRfdG1mZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0bWZmX2RldmljZSAqdG1mZiA9IGRhdGE7Ci0Jc3RydWN0IGhpZF9maWVsZCAqZmZfZmllbGQgPSB0bWZmLT5mZl9maWVsZDsKLQlpbnQgeCwgeTsKLQlpbnQgbGVmdCwgcmlnaHQ7CS8qIFJ1bWJsaW5nICovCi0KLQlzd2l0Y2ggKGVmZmVjdC0+dHlwZSkgewotCWNhc2UgRkZfQ09OU1RBTlQ6Ci0JCXggPSBoaWRfdG1mZl9zY2FsZV9zOChlZmZlY3QtPnUucmFtcC5zdGFydF9sZXZlbCwKLQkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWluaW11bSwKLQkJCQkJZmZfZmllbGQtPmxvZ2ljYWxfbWF4aW11bSk7Ci0JCXkgPSBoaWRfdG1mZl9zY2FsZV9zOChlZmZlY3QtPnUucmFtcC5lbmRfbGV2ZWwsCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOwotCi0JCWRiZ19oaWQoIih4LCB5KT0oJTA0eCwgJTA0eClcbiIsIHgsIHkpOwotCQlmZl9maWVsZC0+dmFsdWVbMF0gPSB4OwotCQlmZl9maWVsZC0+dmFsdWVbMV0gPSB5OwotCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHRtZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwotCQlicmVhazsKLQotCWNhc2UgRkZfUlVNQkxFOgotCQlsZWZ0ID0gaGlkX3RtZmZfc2NhbGVfdTE2KGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGUsCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOwotCQlyaWdodCA9IGhpZF90bWZmX3NjYWxlX3UxNihlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGUsCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21pbmltdW0sCi0JCQkJCWZmX2ZpZWxkLT5sb2dpY2FsX21heGltdW0pOwotCi0JCWRiZ19oaWQoIihsZWZ0LHJpZ2h0KT0oJTA4eCwgJTA4eClcbiIsIGxlZnQsIHJpZ2h0KTsKLQkJZmZfZmllbGQtPnZhbHVlWzBdID0gbGVmdDsKLQkJZmZfZmllbGQtPnZhbHVlWzFdID0gcmlnaHQ7Ci0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgdG1mZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGhpZF90bWZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQlzdHJ1Y3QgdG1mZl9kZXZpY2UgKnRtZmY7Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfbGlzdDsKLQlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gaGlkaW5wdXQtPmlucHV0OwotCWNvbnN0IHNpZ25lZCBzaG9ydCAqZmZfYml0cyA9IGZmX2pveXN0aWNrOwotCWludCBlcnJvcjsKLQlpbnQgaTsKLQotCXRtZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG1mZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtZmYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogRmluZCB0aGUgcmVwb3J0IHRvIHVzZSAqLwotCXJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCByZXBvcnRfbGlzdCwgbGlzdCkgewotCQlpbnQgZmllbGRudW07Ci0KLQkJZm9yIChmaWVsZG51bSA9IDA7IGZpZWxkbnVtIDwgcmVwb3J0LT5tYXhmaWVsZDsgKytmaWVsZG51bSkgewotCQkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQgPSByZXBvcnQtPmZpZWxkW2ZpZWxkbnVtXTsKLQotCQkJaWYgKGZpZWxkLT5tYXh1c2FnZSA8PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzd2l0Y2ggKGZpZWxkLT51c2FnZVswXS5oaWQpIHsKLQkJCWNhc2UgVEhSVVNUTUFTVEVSX1VTQUdFX0ZGOgotCQkJCWlmIChmaWVsZC0+cmVwb3J0X2NvdW50IDwgMikgewotCQkJCQl3YXJuKCJpZ25vcmluZyBGRiBmaWVsZCB3aXRoIHJlcG9ydF9jb3VudCA8IDIiKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGZpZWxkLT5sb2dpY2FsX21heGltdW0gPT0gZmllbGQtPmxvZ2ljYWxfbWluaW11bSkgewotCQkJCQl3YXJuKCJpZ25vcmluZyBGRiBmaWVsZCB3aXRoIGxvZ2ljYWxfbWF4aW11bSA9PSBsb2dpY2FsX21pbmltdW0iKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRtZmYtPnJlcG9ydCAmJiB0bWZmLT5yZXBvcnQgIT0gcmVwb3J0KSB7Ci0JCQkJCXdhcm4oImlnbm9yaW5nIEZGIGZpZWxkIGluIG90aGVyIHJlcG9ydCIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodG1mZi0+ZmZfZmllbGQgJiYgdG1mZi0+ZmZfZmllbGQgIT0gZmllbGQpIHsKLQkJCQkJd2FybigiaWdub3JpbmcgZHVwbGljYXRlIEZGIGZpZWxkIik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRtZmYtPnJlcG9ydCA9IHJlcG9ydDsKLQkJCQl0bWZmLT5mZl9maWVsZCA9IGZpZWxkOwotCi0JCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7IGkrKykgewotCQkJCQlpZiAoaW5wdXRfZGV2LT5pZC52ZW5kb3IgPT0gZGV2aWNlc1tpXS5pZFZlbmRvciAmJgotCQkJCQkgICAgaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID09IGRldmljZXNbaV0uaWRQcm9kdWN0KSB7Ci0JCQkJCQlmZl9iaXRzID0gZGV2aWNlc1tpXS5mZjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpID0gMDsgZmZfYml0c1tpXSA+PSAwOyBpKyspCi0JCQkJCXNldF9iaXQoZmZfYml0c1tpXSwgaW5wdXRfZGV2LT5mZmJpdCk7Ci0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQl3YXJuKCJpZ25vcmluZyB1bmtub3duIG91dHB1dCB1c2FnZSAlMDh4IiwgZmllbGQtPnVzYWdlWzBdLmhpZCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIXRtZmYtPnJlcG9ydCkgewotCQllcnIoImNhbnQgZmluZCBGRiBmaWVsZCBpbiBvdXRwdXQgcmVwb3J0c1xuIik7Ci0JCWVycm9yID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQotCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoaW5wdXRfZGV2LCB0bWZmLCBoaWRfdG1mZl9wbGF5KTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZmFpbDsKLQotCWluZm8oIkZvcmNlIGZlZWRiYWNrIGZvciBUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBieSBaaW54IFZlcml0dXNlIDx6aW54QGVwaWNzb2wub3JnPiIpOwotCXJldHVybiAwOwotCi0gZmFpbDoKLQlrZnJlZSh0bWZmKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtenBmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC16cGZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjg4MjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC16cGZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqICBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT4KLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgotI2luY2x1ZGUgInVzYmhpZC5oIgotCi1zdHJ1Y3QgenBmZl9kZXZpY2UgewotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci19OwotCi1zdGF0aWMgaW50IGhpZF96cGZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAotCQkJIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKLXsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgenBmZl9kZXZpY2UgKnpwZmYgPSBkYXRhOwotCWludCBsZWZ0LCByaWdodDsKLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBpcyBzcGVjaWZpZWQgdGhlIG90aGVyIHdheSBhcm91bmQgaW4gdGhlIFplcm9wbHVzCi0JICogZGF0YXNoZWV0IGJ1dCB0aGUgb3JkZXIgYmVsb3cgaXMgY29ycmVjdCBmb3IgdGhlIFhGWCBFeGVjdXRpb25lcjsKLQkgKiBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFhGWCBFeGVjdXRpb25lciBpcyBhbiBleGNlcHRpb24KLQkgKi8KLQotCWxlZnQgPSBlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGU7Ci0JcmlnaHQgPSBlZmZlY3QtPnUucnVtYmxlLndlYWtfbWFnbml0dWRlOwotCWRiZ19oaWQoImNhbGxlZCB3aXRoIDB4JTA0eCAweCUwNHhcbiIsIGxlZnQsIHJpZ2h0KTsKLQotCWxlZnQgPSBsZWZ0ICogMHg3ZiAvIDB4ZmZmZjsKLQlyaWdodCA9IHJpZ2h0ICogMHg3ZiAvIDB4ZmZmZjsKLQotCXpwZmYtPnJlcG9ydC0+ZmllbGRbMl0tPnZhbHVlWzBdID0gbGVmdDsKLQl6cGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IHJpZ2h0OwotCWRiZ19oaWQoInJ1bm5pbmcgd2l0aCAweCUwMnggMHglMDJ4XG4iLCBsZWZ0LCByaWdodCk7Ci0JdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCB6cGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaGlkX3pwZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQotewotCXN0cnVjdCB6cGZmX2RldmljZSAqenBmZjsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9lbnRyeShoaWQtPmlucHV0cy5uZXh0LAotCQkJCQkJc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcmVwb3J0X2xpc3QgPQotCQkJJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGhpZGlucHV0LT5pbnB1dDsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtenBmZjogbm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKLQotCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgNCkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC16cGZmOiBub3QgZW5vdWdoIGZpZWxkcyBpbiByZXBvcnRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl6cGZmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpwZmZfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF6cGZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKLQotCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCB6cGZmLCBoaWRfenBmZl9wbGF5KTsKLQlpZiAoZXJyb3IpIHsKLQkJa2ZyZWUoenBmZik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQl6cGZmLT5yZXBvcnQgPSByZXBvcnQ7Ci0JenBmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweDAwOwotCXpwZmYtPnJlcG9ydC0+ZmllbGRbMV0tPnZhbHVlWzBdID0gMHgwMjsKLQl6cGZmLT5yZXBvcnQtPmZpZWxkWzJdLT52YWx1ZVswXSA9IDB4MDA7Ci0JenBmZi0+cmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF0gPSAweDAwOwotCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgenBmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJGb3JjZSBmZWVkYmFjayBmb3IgWmVyb3BsdXMgYmFzZWQgZGV2aWNlcyBieSAiCi0JICAgICAgICJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggODQyZTllZC4uYmFiZDY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNzkwLDIxICs3OTAsMjMgQEAKIC8qCiAgKiBUaGlzIGlzIHdoZXJlIGhpZC5jIGNhbGxzIHVzIHRvIGNvbm5lY3QgYSBoaWQgZGV2aWNlIHRvIHRoZSBoaWRkZXYgZHJpdmVyCiAgKi8KLWludCBoaWRkZXZfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoraW50IGhpZGRldl9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCBmb3JjZSkKIHsKIAlzdHJ1Y3QgaGlkZGV2ICpoaWRkZXY7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0JaW50IGk7CiAJaW50IHJldHZhbDsKIAotCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykKLQkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09Ci0JCSAgICBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgotCQkgICAgIUlTX0lOUFVUX0FQUExJQ0FUSU9OKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSkpCi0JCQlicmVhazsKKwlpZiAoIWZvcmNlKSB7CisJCXVuc2lnbmVkIGludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCisJCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0KKwkJCSAgICBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgorCQkJICAgICFJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQorCQkJCWJyZWFrOwogCi0JaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uICYmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19ISURERVYpID09IDApCi0JCXJldHVybiAtMTsKKwkJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmICghKGhpZGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRkZXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaCBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaAppbmRleCA2MmQyZDdjLi5hYmVkYjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3BpbmxvY2tfdCBjdHJsbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgZmlmbyBzcGlubG9jayAqLwogCiAJc3RydWN0IHVyYiAqdXJib3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBVUkIgKi8KLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqb3V0W0hJRF9DT05UUk9MX0ZJRk9fU0laRV07ICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHBpcGUgZmlmbyAqLworCXN0cnVjdCBoaWRfb3V0cHV0X2ZpZm8gb3V0W0hJRF9DT05UUk9MX0ZJRk9fU0laRV07ICAgICAgICAgICAgICAvKiBPdXRwdXQgcGlwZSBmaWZvICovCiAJdW5zaWduZWQgY2hhciBvdXRoZWFkLCBvdXR0YWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBwaXBlIGZpZm8gaGVhZCAmIHRhaWwgKi8KIAljaGFyICpvdXRidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwogCWRtYV9hZGRyX3Qgb3V0YnVmX2RtYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyIGRtYSAqLwpAQCAtODIsNyArODIsNyBAQAogfTsKIAogI2RlZmluZQloaWRfdG9fdXNiX2RldihoaWRfZGV2KSBcCi0JY29udGFpbmVyX29mKGhpZF9kZXYtPmRldi0+cGFyZW50LCBzdHJ1Y3QgdXNiX2RldmljZSwgZGV2KQorCWNvbnRhaW5lcl9vZihoaWRfZGV2LT5kZXYucGFyZW50LT5wYXJlbnQsIHN0cnVjdCB1c2JfZGV2aWNlLCBkZXYpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKaW5kZXggMGNhYWFmZS4uYjM0MjkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwpAQCAtMTA1LDE0ICsxMDUsMTYgQEAKIAkJCWlmICh1c2Jfa2JkX2tleWNvZGVba2JkLT5vbGRbaV1dKQogCQkJCWlucHV0X3JlcG9ydF9rZXkoa2JkLT5kZXYsIHVzYl9rYmRfa2V5Y29kZVtrYmQtPm9sZFtpXV0sIDApOwogCQkJZWxzZQotCQkJCWluZm8oIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLiIsIGtiZC0+b2xkW2ldKTsKKwkJCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKKwkJCQkJCSJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsIGtiZC0+b2xkW2ldKTsKIAkJfQogCiAJCWlmIChrYmQtPm5ld1tpXSA+IDMgJiYgbWVtc2NhbihrYmQtPm9sZCArIDIsIGtiZC0+bmV3W2ldLCA2KSA9PSBrYmQtPm9sZCArIDgpIHsKIAkJCWlmICh1c2Jfa2JkX2tleWNvZGVba2JkLT5uZXdbaV1dKQogCQkJCWlucHV0X3JlcG9ydF9rZXkoa2JkLT5kZXYsIHVzYl9rYmRfa2V5Y29kZVtrYmQtPm5ld1tpXV0sIDEpOwogCQkJZWxzZQotCQkJCWluZm8oIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHByZXNzZWQuIiwga2JkLT5uZXdbaV0pOworCQkJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAorCQkJCQkJIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLlxuIiwga2JkLT5uZXdbaV0pOwogCQl9CiAJfQogCkBAIC0xNTksNyArMTYxLDggQEAKIAlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gdXJiLT5jb250ZXh0OwogCiAJaWYgKHVyYi0+c3RhdHVzKQotCQl3YXJuKCJsZWQgdXJiIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKKwkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJsZWQgdXJiIHN0YXR1cyAlZCByZWNlaXZlZFxuIiwKKwkJCSB1cmItPnN0YXR1cyk7CiAKIAlpZiAoKihrYmQtPmxlZHMpID09IGtiZC0+bmV3bGVkcykKIAkJcmV0dXJuOwpAQCAtMzUyLDcgKzM1NSw4IEBACiB7CiAJaW50IHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdXNiX2tiZF9kcml2ZXIpOwogCWlmIChyZXN1bHQgPT0gMCkKLQkJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOworCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJCQkJRFJJVkVSX0RFU0MgIlxuIik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYwppbmRleCAzNTY4OWVmLi43MmFiNGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYwpAQCAtMzEsNiArMzEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KIAorLyogZm9yIGFwcGxlIElEcyAqLworI2lmZGVmIENPTkZJR19VU0JfSElEX01PRFVMRQorI2luY2x1ZGUgIi4uL2hpZC1pZHMuaCIKKyNlbmRpZgorCiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCkBAIC0yNDAsNyArMjQ1LDggQEAKIHsKIAlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfbW91c2VfZHJpdmVyKTsKIAlpZiAocmV0dmFsID09IDApCi0JCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgorCQkJCURSSVZFUl9ERVNDICJcbiIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCBkNDAyZThkLi5lYmFjYzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC01NDAsNiArNTQwLDE1IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTkzLgogCitjb25maWcgU0VOU09SU19NQVgxMTExCisJdHJpc3RhdGUgIk1heGltIE1BWDExMTEgTXVsdGljaGFubmVsLCBTZXJpYWwgOC1iaXQgQURDIGNoaXAiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE1heGltJ3MgTUFYMTExMSBBREMgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDExMTEuCisKIGNvbmZpZyBTRU5TT1JTX01BWDE2MTkKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNzkxLDYgKzgwMCwxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3ZWhmLgogCitjb25maWcgU0VOU09SU19VTFRSQTQ1CisJdHJpc3RhdGUgIlN1biBVbHRyYTQ1IFBJQzE2Rjc0NyIKKwlkZXBlbmRzIG9uIFNQQVJDNjQKKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgVWx0cmE0NSB3b3Jrc3RhdGlvbiBlbnZpcm9ubWVudGFsCisJICBzZW5zb3JzLgorCiBjb25maWcgU0VOU09SU19IREFQUwogCXRyaXN0YXRlICJJQk0gSGFyZCBEcml2ZSBBY3RpdmUgUHJvdGVjdGlvbiBTeXN0ZW0gKGhkYXBzKSIKIAlkZXBlbmRzIG9uIElOUFVUICYmIFg4NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggOTUwMTM0YS4uMDQyZDVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19GU0NQT1MpCSs9IGZzY3Bvcy5vCiBvYmotJChDT05GSUdfU0VOU09SU19HTDUxOFNNKQkrPSBnbDUxOHNtLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0dMNTIwU00pCSs9IGdsNTIwc20ubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVUxUUkE0NSkJKz0gdWx0cmE0NV9lbnYubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSERBUFMpCSs9IGhkYXBzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0k1S19BTUIpCSs9IGk1a19hbWIubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSUJNQUVNKQkrPSBpYm1hZW0ubwpAQCAtNTksNiArNjAsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MCkJKz0gbG05MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTMpCSs9IGxtOTMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTExMSkJKz0gbWF4MTExMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjE5KQkrPSBtYXgxNjE5Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDY2NTApCSs9IG1heDY2NTAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzM2MCkJKz0gcGM4NzM2MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCmluZGV4IGQ1NjhjNjUuLmQ5ZTdhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJeyAiT1RFUzEgRmFuIiwJCTM2LCAyLCA2MCwgMSwgMCB9LAogCQl7IE5VTEwsIDAsIDAsIDAsIDAsIDAgfSB9CiAJfSwKLQl7IDB4MDAxMSwgTlVMTCAvKiBBYml0IEFUOCAzMlgsIG5lZWQgRE1JIHN0cmluZyAqLywgeworCXsgMHgwMDExLCAiQVQ4IDMyWChBVEkgUkQ1ODAtVUxJIE0xNTc1KSIsIHsKIAkJeyAiQ1BVIENvcmUiLAkJIDAsIDAsIDEwLCAxLCAwIH0sCiAJCXsgIkREUiIsCQkgMSwgMCwgMjAsIDEsIDAgfSwKIAkJeyAiRERSIFZUVCIsCQkgMiwgMCwgMTAsIDEsIDAgfSwKQEAgLTMwMyw2ICszMDMsNyBAQAogCQl7ICJTWVMgRmFuIiwJCTM0LCAyLCA2MCwgMSwgMCB9LAogCQl7ICJBVVgxIEZhbiIsCQkzNSwgMiwgNjAsIDEsIDAgfSwKIAkJeyAiQVVYMiBGYW4iLAkJMzYsIDIsIDYwLCAxLCAwIH0sCisJCXsgIkFVWDMgRmFuIiwJCTM3LCAyLCA2MCwgMSwgMCB9LAogCQl7IE5VTEwsIDAsIDAsIDAsIDAsIDAgfSB9CiAJfSwKIAl7IDB4MDAxMiwgTlVMTCAvKiBBYml0IEFOOCAzMlgsIG5lZWQgRE1JIHN0cmluZyAqLywgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZDc0MTQuYyBiL2RyaXZlcnMvaHdtb24vYWQ3NDE0LmMKaW5kZXggY2U4ZDk0Zi4uYmZkYThjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZDc0MTQuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkNzQxNC5jCkBAIC02OSw3ICs2OSw3IEBACiAJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbHVlKTsKIH0KIAotc3RydWN0IGFkNzQxNF9kYXRhICphZDc0MTRfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGFkNzQxNF9kYXRhICphZDc0MTRfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWQ3NDE0X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy5oIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLmgKaW5kZXggYTYyMjFlNS4uMjIxZWY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hbXMvYW1zLmgKKysrIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiBlbnVtIGFtc19pcnEgewogCUFNU19JUlFfRlJFRUZBTEwgPSAweDAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hdHhwMS5jIGIvZHJpdmVycy9od21vbi9hdHhwMS5jCmluZGV4IGQxOTExMTguLmQ2YjQ5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXR4cDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2F0eHAxLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXN0ZW0gdm9sdGFnZXMgY29udHJvbCB2aWEgQXR0YW5zaWMgQVRYUDEiKTsKLU1PRFVMRV9WRVJTSU9OKCIwLjYuMiIpOworTU9EVUxFX1ZFUlNJT04oIjAuNi4zIik7CiBNT0RVTEVfQVVUSE9SKCJTZWJhc3RpYW4gV2l0dCA8c2Uud2l0dEBnbXgubmV0PiIpOwogCiAjZGVmaW5lIEFUWFAxX1ZJRAkweDAwCkBAIC0yODksMTYgKzI4OSwxNiBAQAogCWlmICghKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZSkgPT0gMCkgJiYKIAkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZikgPT0gMCkgJiYKIAkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHhmZSkgPT0gMCkgJiYKLQkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHhmZikgPT0gMCkgKSkgeworCSAgICAgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweGZmKSA9PSAwKSkpCisJCXJldHVybiAtRU5PREVWOwogCi0JCS8qIE5vIHZlbmRvciBJRCwgbm93IGNoZWNraW5nIGlmIHJlZ2lzdGVycyAweDEwLDB4MTEgKG5vbi1leGlzdGVudCkKLQkJICogc2hvd2luZyB0aGUgc2FtZSBhcyByZWdpc3RlciAweDAwICovCi0JCXRlbXAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgwMCk7CisJLyogTm8gdmVuZG9yIElELCBub3cgY2hlY2tpbmcgaWYgcmVnaXN0ZXJzIDB4MTAsMHgxMSAobm9uLWV4aXN0ZW50KQorCSAqIHNob3dpbmcgdGhlIHNhbWUgYXMgcmVnaXN0ZXIgMHgwMCAqLworCXRlbXAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgwMCk7CiAKLQkJaWYgKCEoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweDEwKSA9PSB0ZW1wKSAmJgotCQkJIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgxMSkgPT0gdGVtcCkgKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KKwlpZiAoISgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4MTApID09IHRlbXApICYmCisJICAgICAgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweDExKSA9PSB0ZW1wKSkpCisJCXJldHVybiAtRU5PREVWOwogCiAJLyogR2V0IFZSTSAqLwogCXRlbXAgPSB2aWRfd2hpY2hfdnJtKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IGNkYjgzMTEuLjI3YTVkMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0xNzUsMTEgKzE3NSwxMSBAQAogICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBtYW5pcHVsYXRpb24gdGhlcmVvZgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIEZvciBJU0EgY2hpcHMsIHdlIGFidXNlIHRoZSBpMmNfY2xpZW50IGFkZHIgYW5kIG5hbWUgZmllbGRzLiBXZSBhbHNvIHVzZQotICAgdGhlIGRyaXZlciBmaWVsZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gSTJDIGFuZCBJU0EgY2hpcHMuICovCiBzdHJ1Y3QgZG1lMTczN19kYXRhIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsJLyogZm9yIEkyQyBkZXZpY2VzIG9ubHkgKi8KIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgYWRkcjsJCS8qIGZvciBJU0EgZGV2aWNlcyBvbmx5ICovCiAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJaW50IHZhbGlkOwkJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwpAQCAtNTEyLDExICs1MTIsMTIgQEAKICAqIGJlZm9yZSBjYWxsaW5nIGRtZTE3MzdfcmVhZCBvciBkbWUxNzM3X3dyaXRlLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB1OCBkbWUxNzM3X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQorc3RhdGljIHU4IGRtZTE3MzdfcmVhZChjb25zdCBzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhLCB1OCByZWcpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlzMzIgdmFsOwogCi0JaWYgKGNsaWVudC0+ZHJpdmVyKSB7IC8qIEkyQyBkZXZpY2UgKi8KKwlpZiAoY2xpZW50KSB7IC8qIEkyQyBkZXZpY2UgKi8KIAkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIAogCQlpZiAodmFsIDwgMCkgewpAQCAtNTI1LDE4ICs1MjYsMTkgQEAKIAkJCQkgIm1haW50YWluZXIuXG4iLCByZWcpOwogCQl9CiAJfSBlbHNlIHsgLyogSVNBIGRldmljZSAqLwotCQlvdXRiKHJlZywgY2xpZW50LT5hZGRyKTsKLQkJdmFsID0gaW5iKGNsaWVudC0+YWRkciArIDEpOworCQlvdXRiKHJlZywgZGF0YS0+YWRkcik7CisJCXZhbCA9IGluYihkYXRhLT5hZGRyICsgMSk7CiAJfQogCiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHMzMiBkbWUxNzM3X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQorc3RhdGljIHMzMiBkbWUxNzM3X3dyaXRlKGNvbnN0IHN0cnVjdCBkbWUxNzM3X2RhdGEgKmRhdGEsIHU4IHJlZywgdTggdmFsKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJczMyIHJlcyA9IDA7CiAKLQlpZiAoY2xpZW50LT5kcml2ZXIpIHsgLyogSTJDIGRldmljZSAqLworCWlmIChjbGllbnQpIHsgLyogSTJDIGRldmljZSAqLwogCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOwogCiAJCWlmIChyZXMgPCAwKSB7CkBAIC01NDUsOCArNTQ3LDggQEAKIAkJCQkgIm1haW50YWluZXIuXG4iLCByZWcpOwogCQl9CiAJfSBlbHNlIHsgLyogSVNBIGRldmljZSAqLwotCQlvdXRiKHJlZywgY2xpZW50LT5hZGRyKTsKLQkJb3V0Yih2YWwsIGNsaWVudC0+YWRkciArIDEpOworCQlvdXRiKHJlZywgZGF0YS0+YWRkcik7CisJCW91dGIodmFsLCBkYXRhLT5hZGRyICsgMSk7CiAJfQogCiAJcmV0dXJuIHJlczsKQEAgLTU1NSw3ICs1NTcsNiBAQAogc3RhdGljIHN0cnVjdCBkbWUxNzM3X2RhdGEgKmRtZTE3MzdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRtZTE3MzdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSAmZGF0YS0+Y2xpZW50OwogCWludCBpeDsKIAl1OCBsc2JbNV07CiAKQEAgLTU2Myw3ICs1NjQsNyBAQAogCiAJLyogRW5hYmxlIGEgVmJhdCBtb25pdG9yaW5nIGN5Y2xlIGV2ZXJ5IDEwIG1pbnMgKi8KIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3ZiYXQgKyA2MDAgKiBIWikgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19DT05GSUcsIGRtZTE3MzdfcmVhZChjbGllbnQsCisJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfQ09ORklHLCBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCURNRTE3MzdfUkVHX0NPTkZJRykgfCAweDEwKTsKIAkJZGF0YS0+bGFzdF92YmF0ID0gamlmZmllczsKIAl9CkBAIC01NzEsNyArNTcyLDcgQEAKIAkvKiBTYW1wbGUgcmVnaXN0ZXIgY29udGVudHMgZXZlcnkgMSBzZWMgKi8KIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZSArIEhaKSB8fCAhZGF0YS0+dmFsaWQpIHsKIAkJaWYgKGRhdGEtPnR5cGUgIT0gc2NoNTAyNykgewotCQkJZGF0YS0+dmlkID0gZG1lMTczN19yZWFkKGNsaWVudCwgRE1FMTczN19SRUdfVklEKSAmCisJCQlkYXRhLT52aWQgPSBkbWUxNzM3X3JlYWQoZGF0YSwgRE1FMTczN19SRUdfVklEKSAmCiAJCQkJMHgzZjsKIAkJfQogCkBAIC01ODAsMTEgKzU4MSwxMSBAQAogCQkJLyogVm9sdGFnZSBpbnB1dHMgYXJlIHN0b3JlZCBhcyAxNiBiaXQgdmFsdWVzIGV2ZW4KIAkJCSAqIHRob3VnaCB0aGV5IGhhdmUgb25seSAxMiBiaXRzIHJlc29sdXRpb24uIFRoaXMgaXMKIAkJCSAqIHRvIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIHRoZSB0ZW1wIGlucHV0cy4gKi8KLQkJCWRhdGEtPmluW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5pbltpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfSU4oaXgpKSA8PCA4OwotCQkJZGF0YS0+aW5fbWluW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5pbl9taW5baXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX0lOX01JTihpeCkpOwotCQkJZGF0YS0+aW5fbWF4W2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5pbl9tYXhbaXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX0lOX01BWChpeCkpOwogCQl9CiAKQEAgLTU5NSwxNCArNTk2LDE0IEBACiAJCQkgKiB0byB0YWtlIGFkdmFudGFnZSBvZiBpbXBsaWNpdCBjb252ZXJzaW9ucyBiZXR3ZWVuCiAJCQkgKiByZWdpc3RlciB2YWx1ZXMgKDIncyBjb21wbGVtZW50KSBhbmQgdGVtcCB2YWx1ZXMKIAkJCSAqIChzaWduZWQgZGVjaW1hbCkuICovCi0JCQlkYXRhLT50ZW1wW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT50ZW1wW2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQlETUUxNzM3X1JFR19URU1QKGl4KSkgPDwgODsKLQkJCWRhdGEtPnRlbXBfbWluW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT50ZW1wX21pbltpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfVEVNUF9NSU4oaXgpKTsKLQkJCWRhdGEtPnRlbXBfbWF4W2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT50ZW1wX21heFtpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfVEVNUF9NQVgoaXgpKTsKIAkJCWlmIChkYXRhLT50eXBlICE9IHNjaDUwMjcpIHsKLQkJCQlkYXRhLT50ZW1wX29mZnNldFtpeF0gPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJCWRhdGEtPnRlbXBfb2Zmc2V0W2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfVEVNUF9PRkZTRVQoaXgpKTsKIAkJCX0KIAkJfQpAQCAtNjEyLDcgKzYxMyw3IEBACiAJCSAqIHdoaWNoIHRoZSByZWdpc3RlcnMgYXJlIHJlYWQgKE1TQiBmaXJzdCwgdGhlbiBMU0IpIGlzCiAJCSAqIGltcG9ydGFudCEgKi8KIAkJZm9yIChpeCA9IDA7IGl4IDwgQVJSQVlfU0laRShsc2IpOyBpeCsrKSB7Ci0JCQlsc2JbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCWxzYltpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfSU5fVEVNUF9MU0IoaXgpKTsKIAkJfQogCQlmb3IgKGl4ID0gMDsgaXggPCBBUlJBWV9TSVpFKGRhdGEtPmluKTsgaXgrKykgewpAQCAtNjMxLDE5ICs2MzIsMTkgQEAKIAkJCWlmICghKGRhdGEtPmhhc19mYW4gJiAoMSA8PCBpeCkpKSB7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlkYXRhLT5mYW5baXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCWRhdGEtPmZhbltpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfRkFOKGl4KSk7Ci0JCQlkYXRhLT5mYW5baXhdIHw9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5mYW5baXhdIHw9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQlETUUxNzM3X1JFR19GQU4oaXgpICsgMSkgPDwgODsKLQkJCWRhdGEtPmZhbl9taW5baXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCWRhdGEtPmZhbl9taW5baXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX0ZBTl9NSU4oaXgpKTsKLQkJCWRhdGEtPmZhbl9taW5baXhdIHw9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5mYW5fbWluW2l4XSB8PSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfRkFOX01JTihpeCkgKyAxKSA8PCA4OwotCQkJZGF0YS0+ZmFuX29wdFtpeF0gPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJZGF0YS0+ZmFuX29wdFtpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfRkFOX09QVChpeCkpOwogCQkJLyogZmFuX21heCBleGlzdHMgb25seSBmb3IgZmFuWzUtNl0gKi8KIAkJCWlmIChpeCA+IDMpIHsKLQkJCQlkYXRhLT5mYW5fbWF4W2l4IC0gNF0gPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJCWRhdGEtPmZhbl9tYXhbaXggLSA0XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQlETUUxNzM3X1JFR19GQU5fTUFYKGl4KSk7CiAJCQl9CiAJCX0KQEAgLTY1NSw2MyArNjU2LDYzIEBACiAJCQlpZiAoIShkYXRhLT5oYXNfcHdtICYgKDEgPDwgaXgpKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJZGF0YS0+cHdtW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5wd21baXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX1BXTShpeCkpOwotCQkJZGF0YS0+cHdtX2ZyZXFbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCWRhdGEtPnB3bV9mcmVxW2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQlETUUxNzM3X1JFR19QV01fRlJFUShpeCkpOwogCQkJLyogcHdtX2NvbmZpZyBhbmQgcHdtX21pbiBleGlzdCBvbmx5IGZvciBwd21bMS0zXSAqLwogCQkJaWYgKGl4IDwgMykgewotCQkJCWRhdGEtPnB3bV9jb25maWdbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfUFdNX0NPTkZJRyhpeCkpOwotCQkJCWRhdGEtPnB3bV9taW5baXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCQlkYXRhLT5wd21fbWluW2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfUFdNX01JTihpeCkpOwogCQkJfQogCQl9CiAJCWZvciAoaXggPSAwOyBpeCA8IEFSUkFZX1NJWkUoZGF0YS0+cHdtX3JyKTsgaXgrKykgewotCQkJZGF0YS0+cHdtX3JyW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5wd21fcnJbaXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fUlIoaXgpKTsKIAkJfQogCiAJCS8qIFRoZXJtYWwgem9uZSByZWdpc3RlcnMgKi8KIAkJZm9yIChpeCA9IDA7IGl4IDwgQVJSQVlfU0laRShkYXRhLT56b25lX2xvdyk7IGl4KyspIHsKLQkJCWRhdGEtPnpvbmVfbG93W2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT56b25lX2xvd1tpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfWk9ORV9MT1coaXgpKTsKLQkJCWRhdGEtPnpvbmVfYWJzW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT56b25lX2Fic1tpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfWk9ORV9BQlMoaXgpKTsKIAkJfQogCQlpZiAoZGF0YS0+dHlwZSAhPSBzY2g1MDI3KSB7CiAJCQlmb3IgKGl4ID0gMDsgaXggPCBBUlJBWV9TSVpFKGRhdGEtPnpvbmVfaHlzdCk7IGl4KyspIHsKLQkJCQlkYXRhLT56b25lX2h5c3RbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCQlkYXRhLT56b25lX2h5c3RbaXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19aT05FX0hZU1QoaXgpKTsKIAkJCX0KIAkJfQogCiAJCS8qIEFsYXJtIHJlZ2lzdGVycyAqLwotCQlkYXRhLT5hbGFybXMgPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQlkYXRhLT5hbGFybXMgPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCURNRTE3MzdfUkVHX0FMQVJNMSk7CiAJCS8qIEJpdCA3IHRlbGxzIHVzIGlmIHRoZSBvdGhlciBhbGFybSByZWdpc3RlcnMgYXJlIG5vbi16ZXJvIGFuZAogCQkgKiB0aGVyZWZvcmUgYWxzbyBuZWVkIHRvIGJlIHJlYWQgKi8KIAkJaWYgKGRhdGEtPmFsYXJtcyAmIDB4ODApIHsKLQkJCWRhdGEtPmFsYXJtcyB8PSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJZGF0YS0+YWxhcm1zIHw9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfQUxBUk0yKSA8PCA4OwotCQkJZGF0YS0+YWxhcm1zIHw9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5hbGFybXMgfD0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19BTEFSTTMpIDw8IDE2OwogCQl9CiAKIAkJLyogVGhlIElTQSBjaGlwcyByZXF1aXJlIGV4cGxpY2l0IGNsZWFyaW5nIG9mIGFsYXJtIGJpdHMuCiAJCSAqIERvbid0IHdvcnJ5LCBhbiBhbGFybSB3aWxsIGNvbWUgYmFjayBpZiB0aGUgY29uZGl0aW9uCiAJCSAqIHRoYXQgY2F1c2VzIGl0IHN0aWxsIGV4aXN0cyAqLwotCQlpZiAoIWNsaWVudC0+ZHJpdmVyKSB7CisJCWlmICghZGF0YS0+Y2xpZW50KSB7CiAJCQlpZiAoZGF0YS0+YWxhcm1zICYgMHhmZjAwMDApIHsKLQkJCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwgRE1FMTczN19SRUdfQUxBUk0zLAorCQkJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfQUxBUk0zLAogCQkJCQkgICAgICAweGZmKTsKIAkJCX0KIAkJCWlmIChkYXRhLT5hbGFybXMgJiAweGZmMDApIHsKLQkJCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwgRE1FMTczN19SRUdfQUxBUk0yLAorCQkJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfQUxBUk0yLAogCQkJCQkgICAgICAweGZmKTsKIAkJCX0KIAkJCWlmIChkYXRhLT5hbGFybXMgJiAweGZmKSB7Ci0JCQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0FMQVJNMSwKKwkJCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX0FMQVJNMSwKIAkJCQkJICAgICAgMHhmZik7CiAJCQl9CiAJCX0KQEAgLTc3MCw3ICs3NzEsNiBAQAogCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIKIAkJKnNlbnNvcl9hdHRyXzIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAlpbnQgaXggPSBzZW5zb3JfYXR0cl8yLT5pbmRleDsKQEAgLTc4MSwxMiArNzgxLDEyIEBACiAJc3dpdGNoIChmbikgewogCWNhc2UgU1lTX0lOX01JTjoKIAkJZGF0YS0+aW5fbWluW2l4XSA9IElOX1RPX1JFRyh2YWwsIGRhdGEtPmluX25vbWluYWxbaXhdKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0lOX01JTihpeCksCisJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfSU5fTUlOKGl4KSwKIAkJCSAgICAgIGRhdGEtPmluX21pbltpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19JTl9NQVg6CiAJCWRhdGEtPmluX21heFtpeF0gPSBJTl9UT19SRUcodmFsLCBkYXRhLT5pbl9ub21pbmFsW2l4XSk7Ci0JCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19JTl9NQVgoaXgpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX0lOX01BWChpeCksCiAJCQkgICAgICBkYXRhLT5pbl9tYXhbaXhdKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTg1MCw3ICs4NTAsNiBAQAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGRtZTE3MzdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSAmZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yCiAJCSpzZW5zb3JfYXR0cl8yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CiAJaW50IGl4ID0gc2Vuc29yX2F0dHJfMi0+aW5kZXg7CkBAIC04NjEsMTcgKzg2MCwxNyBAQAogCXN3aXRjaCAoZm4pIHsKIAljYXNlIFNZU19URU1QX01JTjoKIAkJZGF0YS0+dGVtcF9taW5baXhdID0gVEVNUF9UT19SRUcodmFsKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1RFTVBfTUlOKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19URU1QX01JTihpeCksCiAJCQkgICAgICBkYXRhLT50ZW1wX21pbltpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19URU1QX01BWDoKIAkJZGF0YS0+dGVtcF9tYXhbaXhdID0gVEVNUF9UT19SRUcodmFsKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1RFTVBfTUFYKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19URU1QX01BWChpeCksCiAJCQkgICAgICBkYXRhLT50ZW1wX21heFtpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19URU1QX09GRlNFVDoKIAkJZGF0YS0+dGVtcF9vZmZzZXRbaXhdID0gVEVNUF9UT19SRUcodmFsKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1RFTVBfT0ZGU0VUKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19URU1QX09GRlNFVChpeCksCiAJCQkgICAgICBkYXRhLT50ZW1wX29mZnNldFtpeF0pOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtOTM5LDcgKzkzOCw2IEBACiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIKIAkJKnNlbnNvcl9hdHRyXzIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAlpbnQgaXggPSBzZW5zb3JfYXR0cl8yLT5pbmRleDsKQEAgLTk1MCwzNyArOTQ4LDM3IEBACiAJc3dpdGNoIChmbikgewogCWNhc2UgU1lTX1pPTkVfQVVUT19QT0lOVDFfVEVNUF9IWVNUOgogCQkvKiBSZWZyZXNoIHRoZSBjYWNoZSAqLwotCQlkYXRhLT56b25lX2xvd1tpeF0gPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQlkYXRhLT56b25lX2xvd1tpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCSAgRE1FMTczN19SRUdfWk9ORV9MT1coaXgpKTsKIAkJLyogTW9kaWZ5IHRoZSB0ZW1wIGh5c3QgdmFsdWUgKi8KIAkJZGF0YS0+em9uZV9oeXN0W2l4ID09IDJdID0gVEVNUF9IWVNUX1RPX1JFRygKIAkJCQkJVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lX2xvd1tpeF0sIDgpIC0KLQkJCQkJdmFsLCBpeCwgZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCQkJdmFsLCBpeCwgZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX1pPTkVfSFlTVChpeCA9PSAyKSkpOwotCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwgRE1FMTczN19SRUdfWk9ORV9IWVNUKGl4ID09IDIpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1pPTkVfSFlTVChpeCA9PSAyKSwKIAkJCSAgICAgIGRhdGEtPnpvbmVfaHlzdFtpeCA9PSAyXSk7CiAJCWJyZWFrOwogCWNhc2UgU1lTX1pPTkVfQVVUT19QT0lOVDFfVEVNUDoKIAkJZGF0YS0+em9uZV9sb3dbaXhdID0gVEVNUF9UT19SRUcodmFsKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1pPTkVfTE9XKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19aT05FX0xPVyhpeCksCiAJCQkgICAgICBkYXRhLT56b25lX2xvd1tpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19aT05FX0FVVE9fUE9JTlQyX1RFTVA6CiAJCS8qIFJlZnJlc2ggdGhlIGNhY2hlICovCi0JCWRhdGEtPnpvbmVfbG93W2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCWRhdGEtPnpvbmVfbG93W2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJICBETUUxNzM3X1JFR19aT05FX0xPVyhpeCkpOwogCQkvKiBNb2RpZnkgdGhlIHRlbXAgcmFuZ2UgdmFsdWUgKHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIKIAkJICogbmliYmxlIG9mIHRoZSBwd21fZnJlcSByZWdpc3RlcikgKi8KIAkJZGF0YS0+cHdtX2ZyZXFbaXhdID0gVEVNUF9SQU5HRV9UT19SRUcodmFsIC0KIAkJCQkJVEVNUF9GUk9NX1JFRyhkYXRhLT56b25lX2xvd1tpeF0sIDgpLAotCQkJCQlkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJCQlkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfUFdNX0ZSRVEoaXgpKSk7Ci0JCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19QV01fRlJFUShpeCksCisJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfUFdNX0ZSRVEoaXgpLAogCQkJICAgICAgZGF0YS0+cHdtX2ZyZXFbaXhdKTsKIAkJYnJlYWs7CiAJY2FzZSBTWVNfWk9ORV9BVVRPX1BPSU5UM19URU1QOgogCQlkYXRhLT56b25lX2Fic1tpeF0gPSBURU1QX1RPX1JFRyh2YWwpOwotCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwgRE1FMTczN19SRUdfWk9ORV9BQlMoaXgpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1pPTkVfQUJTKGl4KSwKIAkJCSAgICAgIGRhdGEtPnpvbmVfYWJzW2l4XSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMDQ2LDcgKzEwNDQsNiBAQAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGRtZTE3MzdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSAmZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yCiAJCSpzZW5zb3JfYXR0cl8yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CiAJaW50IGl4ID0gc2Vuc29yX2F0dHJfMi0+aW5kZXg7CkBAIC0xMDYwLDIxICsxMDU3LDIxIEBACiAJCQlkYXRhLT5mYW5fbWluW2l4XSA9IEZBTl9UT19SRUcodmFsLCAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFJlZnJlc2ggdGhlIGNhY2hlICovCi0JCQlkYXRhLT5mYW5fb3B0W2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5mYW5fb3B0W2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfRkFOX09QVChpeCkpOwogCQkJLyogTW9kaWZ5IHRoZSBmYW4gbWluIHZhbHVlICovCiAJCQlkYXRhLT5mYW5fbWluW2l4XSA9IEZBTl9UT19SRUcodmFsLAogCQkJCQlGQU5fVFBDX0ZST01fUkVHKGRhdGEtPmZhbl9vcHRbaXhdKSk7CiAJCX0KLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0ZBTl9NSU4oaXgpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX0ZBTl9NSU4oaXgpLAogCQkJICAgICAgZGF0YS0+ZmFuX21pbltpeF0gJiAweGZmKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0ZBTl9NSU4oaXgpICsgMSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19GQU5fTUlOKGl4KSArIDEsCiAJCQkgICAgICBkYXRhLT5mYW5fbWluW2l4XSA+PiA4KTsKIAkJYnJlYWs7CiAJY2FzZSBTWVNfRkFOX01BWDoKIAkJLyogT25seSB2YWxpZCBmb3IgZmFuWzUtNl0gKi8KIAkJZGF0YS0+ZmFuX21heFtpeCAtIDRdID0gRkFOX01BWF9UT19SRUcodmFsKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0ZBTl9NQVgoaXgpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX0ZBTl9NQVgoaXgpLAogCQkJICAgICAgZGF0YS0+ZmFuX21heFtpeCAtIDRdKTsKIAkJYnJlYWs7CiAJY2FzZSBTWVNfRkFOX1RZUEU6CkBAIC0xMDg2LDkgKzEwODMsOSBAQAogCQkJCSB2YWwpOwogCQkJZ290byBleGl0OwogCQl9Ci0JCWRhdGEtPmZhbl9vcHRbaXhdID0gRkFOX1RZUEVfVE9fUkVHKHZhbCwgZG1lMTczN19yZWFkKGNsaWVudCwKKwkJZGF0YS0+ZmFuX29wdFtpeF0gPSBGQU5fVFlQRV9UT19SRUcodmFsLCBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJRE1FMTczN19SRUdfRkFOX09QVChpeCkpKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0ZBTl9PUFQoaXgpLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX0ZBTl9PUFQoaXgpLAogCQkJICAgICAgZGF0YS0+ZmFuX29wdFtpeF0pOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTE4NSw3ICsxMTgyLDYgQEAKIAkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkbWUxNzM3X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMgogCQkqc2Vuc29yX2F0dHJfMiA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOwogCWludCBpeCA9IHNlbnNvcl9hdHRyXzItPmluZGV4OwpAQCAtMTE5NiwxMiArMTE5MiwxMiBAQAogCXN3aXRjaCAoZm4pIHsKIAljYXNlIFNZU19QV006CiAJCWRhdGEtPnB3bVtpeF0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1BXTShpeCksIGRhdGEtPnB3bVtpeF0pOworCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1BXTShpeCksIGRhdGEtPnB3bVtpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19QV01fRlJFUToKLQkJZGF0YS0+cHdtX2ZyZXFbaXhdID0gUFdNX0ZSRVFfVE9fUkVHKHZhbCwgZG1lMTczN19yZWFkKGNsaWVudCwKKwkJZGF0YS0+cHdtX2ZyZXFbaXhdID0gUFdNX0ZSRVFfVE9fUkVHKHZhbCwgZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fRlJFUShpeCkpKTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1BXTV9GUkVRKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19QV01fRlJFUShpeCksCiAJCQkgICAgICBkYXRhLT5wd21fZnJlcVtpeF0pOwogCQlicmVhazsKIAljYXNlIFNZU19QV01fRU5BQkxFOgpAQCAtMTIxNCw3ICsxMjEwLDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCQkvKiBSZWZyZXNoIHRoZSBjYWNoZSAqLwotCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCWRhdGEtPnB3bV9jb25maWdbaXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fQ09ORklHKGl4KSk7CiAJCWlmICh2YWwgPT0gUFdNX0VOX0ZST01fUkVHKGRhdGEtPnB3bV9jb25maWdbaXhdKSkgewogCQkJLyogQmFpbCBvdXQgaWYgbm8gY2hhbmdlICovCkBAIC0xMjI2LDE0ICsxMjIyLDE0IEBACiAJCQlkYXRhLT5wd21fYWN6W2l4XSA9IFBXTV9BQ1pfRlJPTV9SRUcoCiAJCQkJCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwogCQkJLyogU2F2ZSB0aGUgY3VycmVudCByYW1wIHJhdGUgc3RhdGUgYW5kIGRpc2FibGUgaXQgKi8KLQkJCWRhdGEtPnB3bV9ycltpeCA+IDBdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCWRhdGEtPnB3bV9ycltpeCA+IDBdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fUlIoaXggPiAwKSk7CiAJCQlkYXRhLT5wd21fcnJfZW4gJj0gfigxIDw8IGl4KTsKIAkJCWlmIChQV01fUlJfRU5fRlJPTV9SRUcoZGF0YS0+cHdtX3JyW2l4ID4gMF0sIGl4KSkgewogCQkJCWRhdGEtPnB3bV9ycl9lbiB8PSAoMSA8PCBpeCk7CiAJCQkJZGF0YS0+cHdtX3JyW2l4ID4gMF0gPSBQV01fUlJfRU5fVE9fUkVHKDAsIGl4LAogCQkJCQkJCWRhdGEtPnB3bV9ycltpeCA+IDBdKTsKLQkJCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwKKwkJCQlkbWUxNzM3X3dyaXRlKGRhdGEsCiAJCQkJCSAgICAgIERNRTE3MzdfUkVHX1BXTV9SUihpeCA+IDApLAogCQkJCQkgICAgICBkYXRhLT5wd21fcnJbaXggPiAwXSk7CiAJCQl9CkBAIC0xMjQ3LDE0ICsxMjQzLDE0IEBACiAJCQkvKiBUdXJuIGZhbiBmdWxseSBvbiAqLwogCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0gPSBQV01fRU5fVE9fUkVHKDAsCiAJCQkJCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwotCQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1BXTV9DT05GSUcoaXgpLAorCQkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19QV01fQ09ORklHKGl4KSwKIAkJCQkgICAgICBkYXRhLT5wd21fY29uZmlnW2l4XSk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQkJLyogVHVybiBvbiBtYW51YWwgbW9kZSAqLwogCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0gPSBQV01fRU5fVE9fUkVHKDEsCiAJCQkJCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwotCQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1BXTV9DT05GSUcoaXgpLAorCQkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19QV01fQ09ORklHKGl4KSwKIAkJCQkgICAgICBkYXRhLT5wd21fY29uZmlnW2l4XSk7CiAJCQkvKiBDaGFuZ2UgcGVybWlzc2lvbnMgb2YgcHdtW2l4XSB0byByZWFkLXdyaXRlYWJsZSAqLwogCQkJZG1lMTczN19jaG1vZF9maWxlKGRldiwgZG1lMTczN19wd21fY2htb2RfYXR0cltpeF0sCkBAIC0xMjY5LDE0ICsxMjY1LDE0IEBACiAJCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IFBXTV9BQ1pfVE9fUkVHKAogCQkJCQkJCWRhdGEtPnB3bV9hY3pbaXhdLAogCQkJCQkJCWRhdGEtPnB3bV9jb25maWdbaXhdKTsKLQkJCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19QV01fQ09ORklHKGl4KSwKKwkJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfUFdNX0NPTkZJRyhpeCksCiAJCQkJICAgICAgZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwogCQkJLyogRW5hYmxlIFBXTSByYW1wIHJhdGUgaWYgcHJldmlvdXNseSBlbmFibGVkICovCiAJCQlpZiAoZGF0YS0+cHdtX3JyX2VuICYgKDEgPDwgaXgpKSB7CiAJCQkJZGF0YS0+cHdtX3JyW2l4ID4gMF0gPSBQV01fUlJfRU5fVE9fUkVHKDEsIGl4LAotCQkJCQkJZG1lMTczN19yZWFkKGNsaWVudCwKKwkJCQkJCWRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfUFdNX1JSKGl4ID4gMCkpKTsKLQkJCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwKKwkJCQlkbWUxNzM3X3dyaXRlKGRhdGEsCiAJCQkJCSAgICAgIERNRTE3MzdfUkVHX1BXTV9SUihpeCA+IDApLAogCQkJCQkgICAgICBkYXRhLT5wd21fcnJbaXggPiAwXSk7CiAJCQl9CkBAIC0xMjg2LDkgKzEyODIsOSBAQAogCWNhc2UgU1lTX1BXTV9SQU1QX1JBVEU6CiAJCS8qIE9ubHkgdmFsaWQgZm9yIHB3bVsxLTNdICovCiAJCS8qIFJlZnJlc2ggdGhlIGNhY2hlICovCi0JCWRhdGEtPnB3bV9jb25maWdbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCURNRTE3MzdfUkVHX1BXTV9DT05GSUcoaXgpKTsKLQkJZGF0YS0+cHdtX3JyW2l4ID4gMF0gPSBkbWUxNzM3X3JlYWQoY2xpZW50LAorCQlkYXRhLT5wd21fcnJbaXggPiAwXSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfUFdNX1JSKGl4ID4gMCkpOwogCQkvKiBTZXQgdGhlIHJhbXAgcmF0ZSB2YWx1ZSAqLwogCQlpZiAodmFsID4gMCkgewpAQCAtMTMwMSw3ICsxMjk3LDcgQEAKIAkJCWRhdGEtPnB3bV9ycltpeCA+IDBdID0gUFdNX1JSX0VOX1RPX1JFRyh2YWwgPiAwLCBpeCwKIAkJCQkJCQlkYXRhLT5wd21fcnJbaXggPiAwXSk7CiAJCX0KLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX1BXTV9SUihpeCA+IDApLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1BXTV9SUihpeCA+IDApLAogCQkJICAgICAgZGF0YS0+cHdtX3JyW2l4ID4gMF0pOwogCQlicmVhazsKIAljYXNlIFNZU19QV01fQVVUT19DSEFOTkVMU19aT05FOgpAQCAtMTMxNSwxNCArMTMxMSwxNCBAQAogCQkJZ290byBleGl0OwogCQl9CiAJCS8qIFJlZnJlc2ggdGhlIGNhY2hlICovCi0JCWRhdGEtPnB3bV9jb25maWdbaXhdID0gZG1lMTczN19yZWFkKGNsaWVudCwKKwkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCURNRTE3MzdfUkVHX1BXTV9DT05GSUcoaXgpKTsKIAkJaWYgKFBXTV9FTl9GUk9NX1JFRyhkYXRhLT5wd21fY29uZmlnW2l4XSkgPT0gMikgewogCQkJLyogUFdNIGlzIGFscmVhZHkgaW4gYXV0byBtb2RlIHNvIHVwZGF0ZSB0aGUgdGVtcAogCQkJICogY2hhbm5lbCBhc3NpZ25tZW50ICovCiAJCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IFBXTV9BQ1pfVE9fUkVHKHZhbCwKIAkJCQkJCWRhdGEtPnB3bV9jb25maWdbaXhdKTsKLQkJCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19QV01fQ09ORklHKGl4KSwKKwkJCWRtZTE3Mzdfd3JpdGUoZGF0YSwgRE1FMTczN19SRUdfUFdNX0NPTkZJRyhpeCksCiAJCQkJICAgICAgZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwogCQl9IGVsc2UgewogCQkJLyogUFdNIGlzIG5vdCBpbiBhdXRvIG1vZGUgc28gd2Ugc2F2ZSB0aGUgdGVtcApAQCAtMTMzMyw3ICsxMzI5LDcgQEAKIAljYXNlIFNZU19QV01fQVVUT19QV01fTUlOOgogCQkvKiBPbmx5IHZhbGlkIGZvciBwd21bMS0zXSAqLwogCQkvKiBSZWZyZXNoIHRoZSBjYWNoZSAqLwotCQlkYXRhLT5wd21fbWluW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCWRhdGEtPnB3bV9taW5baXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fTUlOKGl4KSk7CiAJCS8qIFRoZXJlIGFyZSBvbmx5IDIgdmFsdWVzIHN1cHBvcnRlZCBmb3IgdGhlIGF1dG9fcHdtX21pbgogCQkgKiB2YWx1ZTogMCBvciBhdXRvX3BvaW50MV9wd20uIFNvIGlmIHRoZSB0ZW1wZXJhdHVyZSBkcm9wcwpAQCAtMTM0MSwyMCArMTMzNywyMCBAQAogCQkgKiBvZmYgb3IgcnVucyBhdCBhdXRvX3BvaW50MV9wd20gZHV0eS1jeWNsZS4gKi8KIAkJaWYgKHZhbCA+ICgoZGF0YS0+cHdtX21pbltpeF0gKyAxKSAvIDIpKSB7CiAJCQlkYXRhLT5wd21fcnJbMF0gPSBQV01fT0ZGX1RPX1JFRygxLCBpeCwKLQkJCQkJCWRtZTE3MzdfcmVhZChjbGllbnQsCisJCQkJCQlkbWUxNzM3X3JlYWQoZGF0YSwKIAkJCQkJCURNRTE3MzdfUkVHX1BXTV9SUigwKSkpOwogCQl9IGVsc2UgewogCQkJZGF0YS0+cHdtX3JyWzBdID0gUFdNX09GRl9UT19SRUcoMCwgaXgsCi0JCQkJCQlkbWUxNzM3X3JlYWQoY2xpZW50LAorCQkJCQkJZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCQlETUUxNzM3X1JFR19QV01fUlIoMCkpKTsKIAkJfQotCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwgRE1FMTczN19SRUdfUFdNX1JSKDApLAorCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1BXTV9SUigwKSwKIAkJCSAgICAgIGRhdGEtPnB3bV9yclswXSk7CiAJCWJyZWFrOwogCWNhc2UgU1lTX1BXTV9BVVRPX1BPSU5UMV9QV006CiAJCS8qIE9ubHkgdmFsaWQgZm9yIHB3bVsxLTNdICovCiAJCWRhdGEtPnB3bV9taW5baXhdID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7Ci0JCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19QV01fTUlOKGl4KSwKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19QV01fTUlOKGl4KSwKIAkJCSAgICAgIGRhdGEtPnB3bV9taW5baXhdKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE0MDIsNyArMTM5OCw3IEBACiB7CiAJc3RydWN0IGRtZTE3MzdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGRhdGEtPmNsaWVudC5uYW1lKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZGF0YS0+bmFtZSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTkwOCw3ICsxOTA0LDcgQEAKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmZG1lMTczN19ncm91cCk7CiAKLQlpZiAoIWRhdGEtPmNsaWVudC5kcml2ZXIpIHsKKwlpZiAoIWRhdGEtPmNsaWVudCkgewogCQlzeXNmc19yZW1vdmVfZmlsZSgmZGV2LT5rb2JqLCAmZGV2X2F0dHJfbmFtZS5hdHRyKTsKIAl9CiB9CkBAIC0xOTE5LDcgKzE5MTUsNyBAQAogCWludCBlcnIsIGl4OwogCiAJLyogQ3JlYXRlIGEgbmFtZSBhdHRyaWJ1dGUgZm9yIElTQSBkZXZpY2VzICovCi0JaWYgKCFkYXRhLT5jbGllbnQuZHJpdmVyICYmCisJaWYgKCFkYXRhLT5jbGllbnQgJiYKIAkgICAgKGVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkZXYtPmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpKSkgewogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjAxMywxNCArMjAwOSwxNCBAQAogc3RhdGljIGludCBkbWUxNzM3X2luaXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQgaXg7CiAJdTggcmVnOwogCiAJLyogUG9pbnQgdG8gdGhlIHJpZ2h0IG5vbWluYWwgdm9sdGFnZXMgYXJyYXkgKi8KIAlkYXRhLT5pbl9ub21pbmFsID0gSU5fTk9NSU5BTChkYXRhLT50eXBlKTsKIAotCWRhdGEtPmNvbmZpZyA9IGRtZTE3MzdfcmVhZChjbGllbnQsIERNRTE3MzdfUkVHX0NPTkZJRyk7CisJZGF0YS0+Y29uZmlnID0gZG1lMTczN19yZWFkKGRhdGEsIERNRTE3MzdfUkVHX0NPTkZJRyk7CiAJLyogSW5mb3JtIGlmIHBhcnQgaXMgbm90IG1vbml0b3Jpbmcvc3RhcnRlZCAqLwogCWlmICghKGRhdGEtPmNvbmZpZyAmIDB4MDEpKSB7CiAJCWlmICghZm9yY2Vfc3RhcnQpIHsKQEAgLTIwMzIsNyArMjAyOCw3IEBACiAKIAkJLyogRm9yY2UgbW9uaXRvcmluZyAqLwogCQlkYXRhLT5jb25maWcgfD0gMHgwMTsKLQkJZG1lMTczN193cml0ZShjbGllbnQsIERNRTE3MzdfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwkJZG1lMTczN193cml0ZShkYXRhLCBETUUxNzM3X1JFR19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CiAJfQogCS8qIEluZm9ybSBpZiBwYXJ0IGlzIG5vdCByZWFkeSAqLwogCWlmICghKGRhdGEtPmNvbmZpZyAmIDB4MDQpKSB7CkBAIC0yMDQxLDggKzIwMzcsOCBAQAogCX0KIAogCS8qIERldGVybWluZSB3aGljaCBvcHRpb25hbCBmYW4gYW5kIHB3bSBmZWF0dXJlcyBhcmUgZW5hYmxlZC9wcmVzZW50ICovCi0JaWYgKGNsaWVudC0+ZHJpdmVyKSB7ICAgLyogSTJDIGNoaXAgKi8KLQkJZGF0YS0+Y29uZmlnMiA9IGRtZTE3MzdfcmVhZChjbGllbnQsIERNRTE3MzdfUkVHX0NPTkZJRzIpOworCWlmIChjbGllbnQpIHsgICAvKiBJMkMgY2hpcCAqLworCQlkYXRhLT5jb25maWcyID0gZG1lMTczN19yZWFkKGRhdGEsIERNRTE3MzdfUkVHX0NPTkZJRzIpOwogCQkvKiBDaGVjayBpZiBvcHRpb25hbCBmYW4zIGlucHV0IGlzIGVuYWJsZWQgKi8KIAkJaWYgKGRhdGEtPmNvbmZpZzIgJiAweDA0KSB7CiAJCQlkYXRhLT5oYXNfZmFuIHw9ICgxIDw8IDIpOwpAQCAtMjA1MSw3ICsyMDQ3LDcgQEAKIAkJLyogRmFuNCBhbmQgcHdtMyBhcmUgb25seSBhdmFpbGFibGUgaWYgdGhlIGNsaWVudCdzIEkyQyBhZGRyZXNzCiAJCSAqIGlzIHRoZSBkZWZhdWx0IDB4MmUuIE90aGVyd2lzZSB0aGUgSS9PcyBhc3NvY2lhdGVkIHdpdGgKIAkJICogdGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBhZGRyIGVuYWJsZS9zZWxlY3QuICovCi0JCWlmIChkYXRhLT5jbGllbnQuYWRkciA9PSAweDJlKSB7CisJCWlmIChjbGllbnQtPmFkZHIgPT0gMHgyZSkgewogCQkJZGF0YS0+aGFzX2ZhbiB8PSAoMSA8PCAzKTsKIAkJCWRhdGEtPmhhc19wd20gfD0gKDEgPDwgMik7CiAJCX0KQEAgLTIwODYsMTYgKzIwODIsMTYgQEAKIAkJIChkYXRhLT5oYXNfZmFuICYgKDEgPDwgNCkpID8gInllcyIgOiAibm8iLAogCQkgKGRhdGEtPmhhc19mYW4gJiAoMSA8PCA1KSkgPyAieWVzIiA6ICJubyIpOwogCi0JcmVnID0gZG1lMTczN19yZWFkKGNsaWVudCwgRE1FMTczN19SRUdfVEFDSF9QV00pOworCXJlZyA9IGRtZTE3MzdfcmVhZChkYXRhLCBETUUxNzM3X1JFR19UQUNIX1BXTSk7CiAJLyogSW5mb3JtIGlmIGZhbi10by1wd20gbWFwcGluZyBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQgKi8KLQlpZiAoY2xpZW50LT5kcml2ZXIgJiYgcmVnICE9IDB4YTQpIHsgICAvKiBJMkMgY2hpcCAqLworCWlmIChjbGllbnQgJiYgcmVnICE9IDB4YTQpIHsgICAvKiBJMkMgY2hpcCAqLwogCQlkZXZfd2FybihkZXYsICJOb24tc3RhbmRhcmQgZmFuIHRvIHB3bSBtYXBwaW5nOiAiCiAJCQkgImZhbjEtPnB3bSVkLCBmYW4yLT5wd20lZCwgZmFuMy0+cHdtJWQsICIKIAkJCSAiZmFuNC0+cHdtJWQuIFBsZWFzZSByZXBvcnQgdG8gdGhlIGRyaXZlciAiCiAJCQkgIm1haW50YWluZXIuXG4iLAogCQkJIChyZWcgJiAweDAzKSArIDEsICgocmVnID4+IDIpICYgMHgwMykgKyAxLAogCQkJICgocmVnID4+IDQpICYgMHgwMykgKyAxLCAoKHJlZyA+PiA2KSAmIDB4MDMpICsgMSk7Ci0JfSBlbHNlIGlmICghY2xpZW50LT5kcml2ZXIgJiYgcmVnICE9IDB4MjQpIHsgICAvKiBJU0EgY2hpcCAqLworCX0gZWxzZSBpZiAoIWNsaWVudCAmJiByZWcgIT0gMHgyNCkgeyAgIC8qIElTQSBjaGlwICovCiAJCWRldl93YXJuKGRldiwgIk5vbi1zdGFuZGFyZCBmYW4gdG8gcHdtIG1hcHBpbmc6ICIKIAkJCSAiZmFuMS0+cHdtJWQsIGZhbjItPnB3bSVkLCBmYW4zLT5wd20lZC4gIgogCQkJICJQbGVhc2UgcmVwb3J0IHRvIHRoZSBkcml2ZXIgbWFpbnRhaW5lci5cbiIsCkBAIC0yMTA4LDcgKzIxMDQsNyBAQAogCSAqIGRpc2FibGVkKS4gKi8KIAlpZiAoIShkYXRhLT5jb25maWcgJiAweDAyKSkgewogCQlmb3IgKGl4ID0gMDsgaXggPCAzOyBpeCsrKSB7Ci0JCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IGRtZTE3MzdfcmVhZChjbGllbnQsCisJCQlkYXRhLT5wd21fY29uZmlnW2l4XSA9IGRtZTE3MzdfcmVhZChkYXRhLAogCQkJCQkJRE1FMTczN19SRUdfUFdNX0NPTkZJRyhpeCkpOwogCQkJaWYgKChkYXRhLT5oYXNfcHdtICYgKDEgPDwgaXgpKSAmJgogCQkJICAgIChQV01fRU5fRlJPTV9SRUcoZGF0YS0+cHdtX2NvbmZpZ1tpeF0pID09IC0xKSkgewpAQCAtMjExNiw4ICsyMTEyLDggQEAKIAkJCQkJICJtYW51YWwgbW9kZS5cbiIsIGl4ICsgMSk7CiAJCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0gPSBQV01fRU5fVE9fUkVHKDEsCiAJCQkJCQkJZGF0YS0+cHdtX2NvbmZpZ1tpeF0pOwotCQkJCWRtZTE3Mzdfd3JpdGUoY2xpZW50LCBETUUxNzM3X1JFR19QV00oaXgpLCAwKTsKLQkJCQlkbWUxNzM3X3dyaXRlKGNsaWVudCwKKwkJCQlkbWUxNzM3X3dyaXRlKGRhdGEsIERNRTE3MzdfUkVHX1BXTShpeCksIDApOworCQkJCWRtZTE3Mzdfd3JpdGUoZGF0YSwKIAkJCQkJICAgICAgRE1FMTczN19SRUdfUFdNX0NPTkZJRyhpeCksCiAJCQkJCSAgICAgIGRhdGEtPnB3bV9jb25maWdbaXhdKTsKIAkJCX0KQEAgLTIxOTEsMzcgKzIxODcsMjQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRtZTE3MzdfaTJjX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAotCQkJICAgICAgaW50IGtpbmQpCisvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgZG1lMTczN19pMmNfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAorCQkJICAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogeworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+ZGV2OwogCXU4IGNvbXBhbnksIHZlcnN0ZXAgPSAwOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGRtZTE3MzdfZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IGVyciA9IDA7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewotCQlnb3RvIGV4aXQ7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1lMTczN19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQljbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwotCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQljbGllbnQtPmRyaXZlciA9ICZkbWUxNzM3X2kyY19kcml2ZXI7Ci0JZGV2ID0gJmNsaWVudC0+ZGV2OwotCiAJLyogQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggbm8gZm9yY2UKIAkgKiBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZSBtdXN0IGlkZW50aWZ5IHRoZSBjaGlwLiAqLwogCWlmIChraW5kIDwgMCkgewotCQljb21wYW55ID0gZG1lMTczN19yZWFkKGNsaWVudCwgRE1FMTczN19SRUdfQ09NUEFOWSk7Ci0JCXZlcnN0ZXAgPSBkbWUxNzM3X3JlYWQoY2xpZW50LCBETUUxNzM3X1JFR19WRVJTVEVQKTsKKwkJY29tcGFueSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERNRTE3MzdfUkVHX0NPTVBBTlkpOworCQl2ZXJzdGVwID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRE1FMTczN19SRUdfVkVSU1RFUCk7CiAKIAkJaWYgKGNvbXBhbnkgPT0gRE1FMTczN19DT01QQU5ZX1NNU0MgJiYKIAkJICAgICh2ZXJzdGVwICYgRE1FMTczN19WRVJTVEVQX01BU0spID09IERNRTE3MzdfVkVSU1RFUCkgewpAQCAtMjIzMCw4ICsyMjEzLDcgQEAKIAkJCSAgIHZlcnN0ZXAgPT0gU0NINTAyN19WRVJTVEVQKSB7CiAJCQlraW5kID0gc2NoNTAyNzsKIAkJfSBlbHNlIHsKLQkJCWVyciA9IC1FTk9ERVY7Ci0JCQlnb3RvIGV4aXRfa2ZyZWU7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KIApAQCAtMjI0MSwzMiArMjIyMyw0NCBAQAogCQlraW5kID0gZG1lMTczNzsKIAkJbmFtZSA9ICJkbWUxNzM3IjsKIAl9Ci0JZGF0YS0+dHlwZSA9IGtpbmQ7Ci0KLQkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbAotCSAqIGxpc3QgKi8KLQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7Ci0JbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZ290byBleGl0X2tmcmVlOwotCX0KIAogCWRldl9pbmZvKGRldiwgIkZvdW5kIGEgJXMgY2hpcCBhdCAweCUwMnggKHJldiAweCUwMngpLlxuIiwKIAkJIGtpbmQgPT0gc2NoNTAyNyA/ICJTQ0g1MDI3IiA6ICJETUUxNzM3IiwgY2xpZW50LT5hZGRyLAogCQkgdmVyc3RlcCk7CisJc3RybGNweShpbmZvLT50eXBlLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtZTE3MzdfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZG1lMTczN19kYXRhICpkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlpbnQgZXJyOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWUxNzM3X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPm5hbWUgPSBjbGllbnQtPm5hbWU7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgRE1FMTczNyBjaGlwICovCiAJaWYgKChlcnIgPSBkbWUxNzM3X2luaXRfZGV2aWNlKGRldikpKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGV2aWNlLlxuIik7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CiAKIAkvKiBDcmVhdGUgc3lzZnMgZmlsZXMgKi8KIAlpZiAoKGVyciA9IGRtZTE3MzdfY3JlYXRlX2ZpbGVzKGRldikpKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlcy5cbiIpOwotCQlnb3RvIGV4aXRfZGV0YWNoOworCQlnb3RvIGV4aXRfa2ZyZWU7CiAJfQogCiAJLyogUmVnaXN0ZXIgZGV2aWNlICovCkBAIC0yMjgxLDQ1ICsyMjc1LDQwIEBACiAKIGV4aXRfcmVtb3ZlOgogCWRtZTE3MzdfcmVtb3ZlX2ZpbGVzKGRldik7Ci1leGl0X2RldGFjaDoKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogZXhpdF9rZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkbWUxNzM3X2kyY19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZG1lMTczN19pMmNfZGV0ZWN0KTsKLX0KLQotc3RhdGljIGludCBkbWUxNzM3X2kyY19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGRtZTE3MzdfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkbWUxNzM3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgZXJyOwogCiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIAlkbWUxNzM3X3JlbW92ZV9maWxlcygmY2xpZW50LT5kZXYpOwogCi0JaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgewotCQlyZXR1cm4gZXJyOwotCX0KLQogCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZG1lMTczN19pZFtdID0geworCXsgImRtZTE3MzciLCBkbWUxNzM3IH0sCisJeyAic2NoNTAyNyIsIHNjaDUwMjcgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZG1lMTczN19pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkbWUxNzM3X2kyY19kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImRtZTE3MzciLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gZG1lMTczN19pMmNfYXR0YWNoX2FkYXB0ZXIsCi0JLmRldGFjaF9jbGllbnQgPSBkbWUxNzM3X2kyY19kZXRhY2hfY2xpZW50LAorCS5wcm9iZSA9IGRtZTE3MzdfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBkbWUxNzM3X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gZG1lMTczN19pZCwKKwkuZGV0ZWN0ID0gZG1lMTczN19pMmNfZGV0ZWN0LAorCS5hZGRyZXNzX2RhdGEgPSAmYWRkcl9kYXRhLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNDAzLDcgKzIzOTIsNiBAQAogewogCXU4IGNvbXBhbnksIGRldmljZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBkbWUxNzM3X2RhdGEgKmRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlpbnQgZXJyOwpAQCAtMjQyMiwxNSArMjQxMCwxMyBAQAogCQlnb3RvIGV4aXRfcmVsZWFzZV9yZWdpb247CiAJfQogCi0JY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKLQljbGllbnQtPmFkZHIgPSByZXMtPnN0YXJ0OworCWRhdGEtPmFkZHIgPSByZXMtPnN0YXJ0OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCiAJLyogU2tpcCBjaGlwIGRldGVjdGlvbiBpZiBtb2R1bGUgaXMgbG9hZGVkIHdpdGggZm9yY2VfaWQgcGFyYW1ldGVyICovCiAJaWYgKCFmb3JjZV9pZCkgewotCQljb21wYW55ID0gZG1lMTczN19yZWFkKGNsaWVudCwgRE1FMTczN19SRUdfQ09NUEFOWSk7Ci0JCWRldmljZSA9IGRtZTE3MzdfcmVhZChjbGllbnQsIERNRTE3MzdfUkVHX0RFVklDRSk7CisJCWNvbXBhbnkgPSBkbWUxNzM3X3JlYWQoZGF0YSwgRE1FMTczN19SRUdfQ09NUEFOWSk7CisJCWRldmljZSA9IGRtZTE3MzdfcmVhZChkYXRhLCBETUUxNzM3X1JFR19ERVZJQ0UpOwogCiAJCWlmICghKChjb21wYW55ID09IERNRTE3MzdfQ09NUEFOWV9TTVNDKSAmJgogCQkgICAgICAoZGV2aWNlID09IFNDSDMxMVhfREVWSUNFKSkpIHsKQEAgLTI0NDEsMTAgKzI0MjcsMTAgQEAKIAlkYXRhLT50eXBlID0gc2NoMzExeDsKIAogCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBpbml0aWFsaXplIHRoZSBtdXRleCAqLwotCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAic2NoMzExeCIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPm5hbWUgPSAic2NoMzExeCI7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGV2X2luZm8oZGV2LCAiRm91bmQgYSBTQ0gzMTF4IGNoaXAgYXQgMHglMDR4XG4iLCBjbGllbnQtPmFkZHIpOworCWRldl9pbmZvKGRldiwgIkZvdW5kIGEgU0NIMzExeCBjaGlwIGF0IDB4JTA0eFxuIiwgZGF0YS0+YWRkcik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCiAJaWYgKChlcnIgPSBkbWUxNzM3X2luaXRfZGV2aWNlKGRldikpKSB7CkBAIC0yNDg1LDcgKzI0NzEsNyBAQAogCiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIAlkbWUxNzM3X3JlbW92ZV9maWxlcygmcGRldi0+ZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkYXRhLT5jbGllbnQuYWRkciwgRE1FMTczN19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmFkZHIsIERNRTE3MzdfRVhURU5UKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi5jIGIvZHJpdmVycy9od21vbi9od21vbi5jCmluZGV4IDczMjFhODguLjA3NmE1OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKQEAgLTU1LDggKzU1LDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAogCWlkID0gaWQgJiBNQVhfSURfTUFTSzsKLQlod2RldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShod21vbl9jbGFzcywgZGV2LCBNS0RFVigwLCAwKSwgTlVMTCwKLQkJCQkgICAgICBIV01PTl9JRF9GT1JNQVQsIGlkKTsKKwlod2RldiA9IGRldmljZV9jcmVhdGUoaHdtb25fY2xhc3MsIGRldiwgTUtERVYoMCwgMCksIE5VTEwsCisJCQkgICAgICBIV01PTl9JRF9GT1JNQVQsIGlkKTsKIAogCWlmIChJU19FUlIoaHdkZXYpKSB7CiAJCXNwaW5fbG9jaygmaWRyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pdDg3LmMgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwppbmRleCAzMGNkYjA5Li5kNzkzY2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2l0ODcuYworKysgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwpAQCAtNDYsNiArNDYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUlZOQU1FICJpdDg3IgpAQCAtMjM2LDYgKzIzOCw4IEBACiAJLyogVmFsdWVzIHJlYWQgZnJvbSBTdXBlci1JL08gY29uZmlnIHNwYWNlICovCiAJdTggcmV2aXNpb247CiAJdTggdmlkX3ZhbHVlOworCS8qIFZhbHVlcyBzZXQgYmFzZWQgb24gRE1JIHN0cmluZ3MgKi8KKwl1OCBza2lwX3B3bTsKIH07CiAKIC8qIEZvciBlYWNoIHJlZ2lzdGVyZWQgY2hpcCwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCkBAIC0yNzMsMTAgKzI3NywxMCBAQAogc3RhdGljIGlubGluZSBpbnQgaGFzXzE2Yml0X2ZhbnMoY29uc3Qgc3RydWN0IGl0ODdfZGF0YSAqZGF0YSkKIHsKIAkvKiBJVDg3MDVGIERhdGFzaGVldCAwLjQuMSwgM2ggPT0gVmVyc2lvbiBHLgotCSAgIElUODcxMkYgRGF0YXNoZWV0IDAuOS4xLCBzZWN0aW9uIDguMy41IGluZGljYXRlcyA3aCA9PSBWZXJzaW9uIEkuCisJICAgSVQ4NzEyRiBEYXRhc2hlZXQgMC45LjEsIHNlY3Rpb24gOC4zLjUgaW5kaWNhdGVzIDhoID09IFZlcnNpb24gSi4KIAkgICBUaGVzZSBhcmUgdGhlIGZpcnN0IHJldmlzaW9ucyB3aXRoIDE2Yml0IHRhY2hvbWV0ZXIgc3VwcG9ydC4gKi8KIAlyZXR1cm4gKGRhdGEtPnR5cGUgPT0gaXQ4NyAmJiBkYXRhLT5yZXZpc2lvbiA+PSAweDAzKQotCSAgICB8fCAoZGF0YS0+dHlwZSA9PSBpdDg3MTIgJiYgZGF0YS0+cmV2aXNpb24gPj0gMHgwNykKKwkgICAgfHwgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyICYmIGRhdGEtPnJldmlzaW9uID49IDB4MDgpCiAJICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE2CiAJICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE4OwogfQpAQCAtOTY0LDYgKzk2OCw3IEBACiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdTE2IGNoaXBfdHlwZTsKKwljb25zdCBjaGFyICpib2FyZF92ZW5kb3IsICpib2FyZF9uYW1lOwogCiAJc3VwZXJpb19lbnRlcigpOwogCWNoaXBfdHlwZSA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBzdXBlcmlvX2ludyhERVZJRCk7CkBAIC0xMDIyLDYgKzEwMjcsMjQgQEAKIAkJCXByX2luZm8oIml0ODc6IGluNyBpcyBWQ0NIICgrNVYgU3RhbmQtQnkpXG4iKTsKIAl9CiAKKwkvKiBEaXNhYmxlIHNwZWNpZmljIGZlYXR1cmVzIGJhc2VkIG9uIERNSSBzdHJpbmdzICovCisJYm9hcmRfdmVuZG9yID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfVkVORE9SKTsKKwlib2FyZF9uYW1lID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfTkFNRSk7CisJaWYgKGJvYXJkX3ZlbmRvciAmJiBib2FyZF9uYW1lKSB7CisJCWlmIChzdHJjbXAoYm9hcmRfdmVuZG9yLCAiblZJRElBIikgPT0gMAorCQkgJiYgc3RyY21wKGJvYXJkX25hbWUsICJGTjY4UFQiKSA9PSAwKSB7CisJCQkvKiBPbiB0aGUgU2h1dHRsZSBTTjY4UFQsIEZBTl9DVEwyIGlzIGFwcGFyZW50bHkgbm90CisJCQkgICBjb25uZWN0ZWQgdG8gYSBmYW4sIGJ1dCB0byBzb21ldGhpbmcgZWxzZS4gT25lIHVzZXIKKwkJCSAgIGhhcyByZXBvcnRlZCBpbnN0YW50IHN5c3RlbSBwb3dlci1vZmYgd2hlbiBjaGFuZ2luZworCQkJICAgdGhlIFBXTTIgZHV0eSBjeWNsZSwgc28gd2UgZGlzYWJsZSBpdC4KKwkJCSAgIEkgdXNlIHRoZSBib2FyZCBuYW1lIHN0cmluZyBhcyB0aGUgdHJpZ2dlciBpbiBjYXNlCisJCQkgICB0aGUgc2FtZSBib2FyZCBpcyBldmVyIHVzZWQgaW4gb3RoZXIgc3lzdGVtcy4gKi8KKwkJCXByX2luZm8oIml0ODc6IERpc2FibGluZyBwd20yIGR1ZSB0byAiCisJCQkJImhhcmR3YXJlIGNvbnN0cmFpbnRzXG4iKTsKKwkJCXNpb19kYXRhLT5za2lwX3B3bSA9ICgxIDw8IDEpOworCQl9CisJfQorCiBleGl0OgogCXN1cGVyaW9fZXhpdCgpOwogCXJldHVybiBlcnI7CkBAIC0xMTY4LDI1ICsxMTkxLDMzIEBACiAJfQogCiAJaWYgKGVuYWJsZV9wd21faW50ZXJmYWNlKSB7Ci0JCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyKSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIpKQotCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCi0JCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9wd20zX2VuYWJsZS5kZXZfYXR0cikpCi0JCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIpKQotCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCi0JCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyKSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfcHdtMy5kZXZfYXR0cikpCi0JCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJICAgICAmZGV2X2F0dHJfcHdtMV9mcmVxKSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkgICAgICZkZXZfYXR0cl9wd20yX2ZyZXEpKQotCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCi0JCSAgICAgJmRldl9hdHRyX3B3bTNfZnJlcSkpKQotCQkJZ290byBFUlJPUjQ7CisJCWlmICghKHNpb19kYXRhLT5za2lwX3B3bSAmICgxIDw8IDApKSkgeworCQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJmRldl9hdHRyX3B3bTFfZnJlcSkpKQorCQkJCWdvdG8gRVJST1I0OworCQl9CisJCWlmICghKHNpb19kYXRhLT5za2lwX3B3bSAmICgxIDw8IDEpKSkgeworCQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZW5hYmxlLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJmRldl9hdHRyX3B3bTJfZnJlcSkpKQorCQkJCWdvdG8gRVJST1I0OworCQl9CisJCWlmICghKHNpb19kYXRhLT5za2lwX3B3bSAmICgxIDw8IDIpKSkgeworCQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJmRldl9hdHRyX3B3bTNfZnJlcSkpKQorCQkJCWdvdG8gRVJST1I0OworCQl9CiAJfQogCiAJaWYgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE2CkBAIC0xNTQ2LDYgKzE1NzcsNyBAQAogCXVuc2lnbmVkIHNob3J0IGlzYV9hZGRyZXNzPTA7CiAJc3RydWN0IGl0ODdfc2lvX2RhdGEgc2lvX2RhdGE7CiAKKwltZW1zZXQoJnNpb19kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGl0ODdfc2lvX2RhdGEpKTsKIAllcnIgPSBpdDg3X2ZpbmQoJmlzYV9hZGRyZXNzLCAmc2lvX2RhdGEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDExMTEuYyBiL2RyaXZlcnMvaHdtb24vbWF4MTExMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWE2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL21heDExMTEuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIG1heDExMTEuYyAtICsyLjdWLCBMb3ctUG93ZXIsIE11bHRpY2hhbm5lbCwgU2VyaWFsIDgtYml0IEFEQ3MKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXB4YS9jb3JnaV9zc3AuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKiAJRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjZGVmaW5lIE1BWDExMTFfVFhfQlVGX1NJWkUJMQorI2RlZmluZSBNQVgxMTExX1JYX0JVRl9TSVpFCTIKKworLyogTUFYMTExMSBDb21tYW5kcyAqLworI2RlZmluZSBNQVgxMTExX0NUUkxfUEQwICAgICAgKDF1IDw8IDApCisjZGVmaW5lIE1BWDExMTFfQ1RSTF9QRDEgICAgICAoMXUgPDwgMSkKKyNkZWZpbmUgTUFYMTExMV9DVFJMX1NHTCAgICAgICgxdSA8PCAyKQorI2RlZmluZSBNQVgxMTExX0NUUkxfVU5JICAgICAgKDF1IDw8IDMpCisjZGVmaW5lIE1BWDExMTFfQ1RSTF9TRUxfU0ggICAoNSkJLyogTk9URTogYml0IDQgaXMgaWdub3JlZCAqLworI2RlZmluZSBNQVgxMTExX0NUUkxfU1RSICAgICAgKDF1IDw8IDcpCisKK3N0cnVjdCBtYXgxMTExX2RhdGEgeworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJc3RydWN0IGRldmljZQkJKmh3bW9uX2RldjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlclsyXTsKKwl1aW50OF90ICp0eF9idWY7CisJdWludDhfdCAqcnhfYnVmOworfTsKKworc3RhdGljIGludCBtYXgxMTExX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgbWF4MTExMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdWludDhfdCB2MSwgdjI7CisJaW50IGVycjsKKworCWRhdGEtPnR4X2J1ZlswXSA9IChjaGFubmVsIDw8IE1BWDExMTFfQ1RSTF9TRUxfU0gpIHwKKwkJTUFYMTExMV9DVFJMX1BEMCB8IE1BWDExMTFfQ1RSTF9QRDEgfAorCQlNQVgxMTExX0NUUkxfU0dMIHwgTUFYMTExMV9DVFJMX1VOSSB8IE1BWDExMTFfQ1RSTF9TVFI7CisKKwllcnIgPSBzcGlfc3luYyhkYXRhLT5zcGksICZkYXRhLT5tc2cpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAic3BpX3N5bmMgZmFpbGVkIHdpdGggJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJdjEgPSBkYXRhLT5yeF9idWZbMF07CisJdjIgPSBkYXRhLT5yeF9idWZbMV07CisKKwlpZiAoKHYxICYgMHhjMCkgfHwgKHYyICYgMHgzZikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuICh2MSA8PCAyKSB8ICh2MiA+PiA2KTsKK30KKworI2lmZGVmIENPTkZJR19TSEFSUFNMX1BNCitzdGF0aWMgc3RydWN0IG1heDExMTFfZGF0YSAqdGhlX21heDExMTE7CisKK2ludCBtYXgxMTExX3JlYWRfY2hhbm5lbChpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gbWF4MTExMV9yZWFkKCZ0aGVfbWF4MTExMS0+c3BpLT5kZXYsIGNoYW5uZWwpOworfQorRVhQT1JUX1NZTUJPTChtYXgxMTExX3JlYWRfY2hhbm5lbCk7CisjZW5kaWYKKworLyoKKyAqIE5PVEU6IFNQSSBkZXZpY2VzIGRvIG5vdCBoYXZlIGEgZGVmYXVsdCAnbmFtZScgYXR0cmlidXRlLCB3aGljaCBpcworICogbGlrZWx5IHRvIGJlIHVzZWQgYnkgaHdtb24gYXBwbGljYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAqIGRpZmZlcmVudCBkZXZpY2VzLCBleHBsaWNpdGx5IGFkZCBhIG5hbWUgYXR0cmlidXRlIGhlcmUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJtYXgxMTExXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hZGMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgY2hhbm5lbCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJaW50IHJldDsKKworCXJldCA9IG1heDExMTFfcmVhZChkZXYsIGNoYW5uZWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJldCk7Cit9CisKKyNkZWZpbmUgTUFYMTExMV9BRENfQVRUUihfaWQpCQlcCisJU0VOU09SX0RFVklDRV9BVFRSKGFkYyMjX2lkIyNfaW4sIFNfSVJVR08sIHNob3dfYWRjLCBOVUxMLCBfaWQpCisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOworc3RhdGljIE1BWDExMTFfQURDX0FUVFIoMCk7CitzdGF0aWMgTUFYMTExMV9BRENfQVRUUigxKTsKK3N0YXRpYyBNQVgxMTExX0FEQ19BVFRSKDIpOworc3RhdGljIE1BWDExMTFfQURDX0FUVFIoMyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgxMTExX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYWRjMF9pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYWRjMV9pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYWRjMl9pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYWRjM19pbi5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXgxMTExX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzCT0gbWF4MTExMV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBzZXR1cF90cmFuc2ZlcihzdHJ1Y3QgbWF4MTExMV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4OworCisJZGF0YS0+dHhfYnVmID0ga21hbGxvYyhNQVgxMTExX1RYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEtPnR4X2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhLT5yeF9idWYgPSBrbWFsbG9jKE1BWDExMTFfUlhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+cnhfYnVmKSB7CisJCWtmcmVlKGRhdGEtPnR4X2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW0gPSAmZGF0YS0+bXNnOworCXggPSAmZGF0YS0+eGZlclswXTsKKworCXNwaV9tZXNzYWdlX2luaXQobSk7CisKKwl4LT50eF9idWYgPSAmZGF0YS0+dHhfYnVmWzBdOworCXgtPmxlbiA9IDE7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CisKKwl4Kys7CisJeC0+cnhfYnVmID0gJmRhdGEtPnJ4X2J1ZlswXTsKKwl4LT5sZW4gPSAyOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1heDExMTFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbWF4MTExMV9kYXRhICpkYXRhOworCWludCBlcnI7CisKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJZXJyID0gc3BpX3NldHVwKHNwaSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDExMTFfZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0gc2V0dXBfdHJhbnNmZXIoZGF0YSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kYXRhOworCisJZGF0YS0+c3BpID0gc3BpOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGRhdGEpOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBhdHRyaWJ1dGUgZ3JvdXBcbiIpOworCQlnb3RvIGVycl9mcmVlX2FsbDsKKwl9CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnNwaS0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGh3bW9uIGRldmljZVxuIik7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZ290byBlcnJfcmVtb3ZlOworCX0KKworI2lmZGVmIENPTkZJR19TSEFSUFNMX1BNCisJdGhlX21heDExMTEgPSBkYXRhOworI2VuZGlmCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmU6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmbWF4MTExMV9hdHRyX2dyb3VwKTsKK2Vycl9mcmVlX2FsbDoKKwlrZnJlZShkYXRhLT5yeF9idWYpOworCWtmcmVlKGRhdGEtPnR4X2J1Zik7CitlcnJfZnJlZV9kYXRhOgorCWtmcmVlKGRhdGEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDExMTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1heDExMTFfZGF0YSAqZGF0YSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwaS0+ZGV2LmtvYmosICZtYXgxMTExX2F0dHJfZ3JvdXApOworCWtmcmVlKGRhdGEtPnJ4X2J1Zik7CisJa2ZyZWUoZGF0YS0+dHhfYnVmKTsKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heDExMTFfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXgxMTExIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gbWF4MTExMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1heDExMTFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1heDExMTFfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtYXgxMTExX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtYXgxMTExX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWF4MTExMV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYXgxMTExX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXgxMTExX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYMTExMSBBREMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMgYi9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlOTBhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogdWx0cmE0NV9lbnYuYzogRHJpdmVyIGZvciBVbHRyYTQ1IFBJQzE2Rjc0NyBlbnZpcm9ubWVudGFsIG1vbml0b3IuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIwLjEiCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVWx0cmE0NSBlbnZpcm9ubWVudGFsIG1vbml0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCisvKiBQSUMgZGV2aWNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfQ01ECQkweDAwVUwKKyNkZWZpbmUgIFJFR19DTURfUkVTRVQJMHg4MAorI2RlZmluZSAgUkVHX0NNRF9FU1RBUgkweDAxCisjZGVmaW5lIFJFR19TVEFUCTB4MDFVTAorI2RlZmluZSAgUkVHX1NUQVRfRldWRVIJMHhmMAorI2RlZmluZSAgUkVHX1NUQVRfVEdPT0QJMHgwOAorI2RlZmluZSAgUkVHX1NUQVRfU1RBTEUJMHgwNAorI2RlZmluZSAgUkVHX1NUQVRfQlVTWQkweDAyCisjZGVmaW5lICBSRUdfU1RBVF9GQVVMVAkweDAxCisjZGVmaW5lIFJFR19EQVRBCTB4NDBVTAorI2RlZmluZSBSRUdfQUREUgkweDQxVUwKKyNkZWZpbmUgUkVHX1NJWkUJMHg0MlVMCisKKy8qIFJlZ2lzdGVycyBhY2Nlc3NlZCBpbmRpcmVjdGx5IHZpYSBSRUdfREFUQS9SRUdfQUREUiAqLworI2RlZmluZSBJUkVHX0ZBTjAJCTB4MDAKKyNkZWZpbmUgSVJFR19GQU4xCQkweDAxCisjZGVmaW5lIElSRUdfRkFOMgkJMHgwMgorI2RlZmluZSBJUkVHX0ZBTjMJCTB4MDMKKyNkZWZpbmUgSVJFR19GQU40CQkweDA0CisjZGVmaW5lIElSRUdfRkFONQkJMHgwNQorI2RlZmluZSBJUkVHX0xDTF9URU1QCQkweDA2CisjZGVmaW5lIElSRUdfUk1UMV9URU1QCQkweDA3CisjZGVmaW5lIElSRUdfUk1UMl9URU1QCQkweDA4CisjZGVmaW5lIElSRUdfUk1UM19URU1QCQkweDA5CisjZGVmaW5lIElSRUdfTE05NTIyMV9URU1QCTB4MGEKKyNkZWZpbmUgSVJFR19GSVJFX1RFTVAJCTB4MGIKKyNkZWZpbmUgSVJFR19MU0kxMDY0X1RFTVAJMHgwYworI2RlZmluZSBJUkVHX0ZST05UX1RFTVAJCTB4MGQKKyNkZWZpbmUgSVJFR19GQU5fU1RBVAkJMHgwZQorI2RlZmluZSBJUkVHX1ZDT1JFMAkJMHgwZgorI2RlZmluZSBJUkVHX1ZDT1JFMQkJMHgxMAorI2RlZmluZSBJUkVHX1ZNRU0wCQkweDExCisjZGVmaW5lIElSRUdfVk1FTTEJCTB4MTIKKyNkZWZpbmUgSVJFR19QU1VfVEVNUAkJMHgxMworCitzdHJ1Y3QgZW52IHsKKwl2b2lkIF9faW9tZW0JKnJlZ3M7CisJc3BpbmxvY2tfdAlsb2NrOworCisJc3RydWN0IGRldmljZQkqaHdtb25fZGV2OworfTsKKworc3RhdGljIHU4IGVudl9yZWFkKHN0cnVjdCBlbnYgKnAsIHU4IGlyZWcpCit7CisJdTggcmV0OworCisJc3Bpbl9sb2NrKCZwLT5sb2NrKTsKKwl3cml0ZWIoaXJlZywgcC0+cmVncyArIFJFR19BRERSKTsKKwlyZXQgPSByZWFkYihwLT5yZWdzICsgUkVHX0RBVEEpOworCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVudl93cml0ZShzdHJ1Y3QgZW52ICpwLCB1OCBpcmVnLCB1OCB2YWwpCit7CisJc3Bpbl9sb2NrKCZwLT5sb2NrKTsKKwl3cml0ZWIoaXJlZywgcC0+cmVncyArIFJFR19BRERSKTsKKwl3cml0ZWIodmFsLCBwLT5yZWdzICsgUkVHX0RBVEEpOworCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKK30KKworLyogVGhlcmUgc2VlbXMgdG8gYmUgYSBhZHI3NDYyIHByb3ZpZGluZyB0aGVzZSB2YWx1ZXMsIHRodXMgYSBsb3QKKyAqIG9mIHRoZXNlIGNhbGN1bGF0aW9ucyBhcmUgYm9ycm93ZWQgZnJvbSB0aGUgYWR0NzQ3MCBkcml2ZXIuCisgKi8KKyNkZWZpbmUgRkFOX1BFUklPRF9UT19SUE0oeCkJKCg5MDAwMCAqIDYwKSAvICh4KSkKKyNkZWZpbmUgRkFOX1JQTV9UT19QRVJJT0QJRkFOX1BFUklPRF9UT19SUE0KKyNkZWZpbmUgRkFOX1BFUklPRF9JTlZBTElECSgweGZmIDw8IDgpCisjZGVmaW5lIEZBTl9EQVRBX1ZBTElEKHgpCSgoeCkgJiYgKHgpICE9IEZBTl9QRVJJT0RfSU5WQUxJRCkKKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBmYW5fbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBlbnYgKnAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcnBtLCBwZXJpb2Q7CisJdTggdmFsOworCisJdmFsID0gZW52X3JlYWQocCwgSVJFR19GQU4wICsgZmFuX25yKTsKKwlwZXJpb2QgPSAoaW50KSB2YWwgPDwgODsKKwlpZiAoRkFOX0RBVEFfVkFMSUQocGVyaW9kKSkKKwkJcnBtID0gRkFOX1BFUklPRF9UT19SUE0ocGVyaW9kKTsKKwllbHNlCisJCXJwbSA9IDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcnBtKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZmFuX25yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlpbnQgcnBtID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlzdHJ1Y3QgZW52ICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHBlcmlvZDsKKwl1OCB2YWw7CisKKwlpZiAoIXJwbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZXJpb2QgPSBGQU5fUlBNX1RPX1BFUklPRChycG0pOworCXZhbCA9IHBlcmlvZCA+PiA4OworCWVudl93cml0ZShwLCBJUkVHX0ZBTjAgKyBmYW5fbnIsIHZhbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgZmFuX25yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZW52ICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTggdmFsID0gZW52X3JlYWQocCwgSVJFR19GQU5fU1RBVCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICh2YWwgJiAoMSA8PCBmYW5fbnIpKSA/IDEgOiAwKTsKK30KKworI2RlZmluZSBmYW4oaW5kZXgpCQkJCQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNpbmRleCMjX3NwZWVkLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X2Zhbl9zcGVlZCwgc2V0X2Zhbl9zcGVlZCwgaW5kZXgpOwkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNpbmRleCMjX2ZhdWx0LCBTX0lSVUdPLAkJCVwKKwkJc2hvd19mYW5fZmF1bHQsIE5VTEwsIGluZGV4KQorCitmYW4oMCk7CitmYW4oMSk7CitmYW4oMik7CitmYW4oMyk7CitmYW4oNCk7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHN1X2Zhbl9mYXVsdCwgU19JUlVHTywgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDYpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCB0ZW1wX25yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZW52ICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJczggdmFsOworCisJdmFsID0gZW52X3JlYWQocCwgSVJFR19MQ0xfVEVNUCArIHRlbXBfbnIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGludCkgdmFsKSAtIDY0KTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihhZHQ3NDYyX2xvY2FsX3RlbXAsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGNwdTBfdGVtcCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3B1MV90ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihtb3RoZXJib2FyZF90ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihsbTk1MjIxX2xvY2FsX3RlbXAsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZpcmVfdGVtcCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobHNpMTA2NF9sb2NhbF90ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmcm9udF9wYW5lbF90ZW1wLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDcpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwc3VfdGVtcCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAxMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdF9iaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGVudiAqcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IHZhbDsKKworCXZhbCA9IHJlYWRiKHAtPnJlZ3MgKyBSRUdfU1RBVCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICh2YWwgJiAoMSA8PCBpbmRleCkpID8gMSA6IDApOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbl9mYWlsdXJlLCBTX0lSVUdPLCBzaG93X3N0YXRfYml0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZW52X2J1c19idXN5LCBTX0lSVUdPLCBzaG93X3N0YXRfYml0LCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZW52X2RhdGFfc3RhbGUsIFNfSVJVR08sIHNob3dfc3RhdF9iaXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0cG1fc2VsZl90ZXN0X3Bhc3NlZCwgU19JUlVHTywgc2hvd19zdGF0X2JpdCwgTlVMTCwgMyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZnd2ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBlbnYgKnAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCB2YWw7CisKKwl2YWwgPSByZWFkYihwLT5yZWdzICsgUkVHX1NUQVQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwgPj4gNCk7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgU19JUlVHTywgc2hvd19md3ZlciwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAidWx0cmE0NVxuIik7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmVudl9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9mYW4wX3NwZWVkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4wX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX3NwZWVkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX3NwZWVkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX3NwZWVkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X3NwZWVkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wc3VfZmFuX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9hZHQ3NDYyX2xvY2FsX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2NwdTBfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3B1MV90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9tb3RoZXJib2FyZF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9sbTk1MjIxX2xvY2FsX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZpcmVfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfbHNpMTA2NF9sb2NhbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mcm9udF9wYW5lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wc3VfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuX2ZhaWx1cmUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2Vudl9idXNfYnVzeS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZW52X2RhdGFfc3RhbGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RwbV9zZWxmX3Rlc3RfcGFzc2VkLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9maXJtd2FyZV92ZXJzaW9uLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGVudl9ncm91cCA9IHsKKwkuYXR0cnMgPSBlbnZfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVudl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZW52ICpwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWlmICghcCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmcC0+bG9jayk7CisKKwlwLT5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLCBSRUdfU0laRSwgInBpYzE2Zjc0NyIpOworCWlmICghcC0+cmVncykKKwkJZ290byBvdXRfZnJlZTsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmb3AtPmRldi5rb2JqLCAmZW52X2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9pb3VubWFwOworCisJcC0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZvcC0+ZGV2KTsKKwlpZiAoSVNfRVJSKHAtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihwLT5od21vbl9kZXYpOworCQlnb3RvIG91dF9zeXNmc19yZW1vdmVfZ3JvdXA7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBwKTsKKwllcnIgPSAwOworCitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X3N5c2ZzX3JlbW92ZV9ncm91cDoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm9wLT5kZXYua29iaiwgJmVudl9ncm91cCk7CisKK291dF9pb3VubWFwOgorCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcC0+cmVncywgUkVHX1NJWkUpOworCitvdXRfZnJlZToKKwlrZnJlZShwKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZW52X3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgZW52ICpwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKworCWlmIChwKSB7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmb3AtPmRldi5rb2JqLCAmZW52X2dyb3VwKTsKKwkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIocC0+aHdtb25fZGV2KTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCBSRUdfU0laRSk7CisJCWtmcmVlKHApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlbnZfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gImVudi1tb25pdG9yIiwKKwkJLmNvbXBhdGlibGUgPSAiU1VOVyxlYnVzLXBpYzE2Zjc0Ny1lbnYiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZW52X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZW52X2RyaXZlciA9IHsKKwkubmFtZQkJPSAidWx0cmE0NV9lbnYiLAorCS5tYXRjaF90YWJsZQk9IGVudl9tYXRjaCwKKwkucHJvYmUJCT0gZW52X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZW52X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlbnZfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmVudl9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbnZfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZlbnZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZW52X2luaXQpOworbW9kdWxlX2V4aXQoZW52X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwppbmRleCA2ZWU5OTdiLi5hY2FkYmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwpAQCAtNTUsNyArNTUsNyBAQAogCiBjb25maWcgSTJDX0FNRDc1Nl9TNDg4MgogCXRyaXN0YXRlICJTTUJ1cyBtdWx0aXBsZXhpbmcgb24gdGhlIFR5YW4gUzQ4ODIiCi0JZGVwZW5kcyBvbiBJMkNfQU1ENzU2ICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSTJDX0FNRDc1NiAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBhZGQgc3BlY2lmaWMgU01CdXMgc3VwcG9ydCBmb3IgdGhlIFR5YW4KIAkgIFM0ODgyIG1vdGhlcmJvYXJkLiAgT24gdGhpcyA0LUNQVSBib2FyZCwgdGhlIFNNQnVzIGlzIG11bHRpcGxleGVkCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogY29uZmlnIEkyQ19ORk9SQ0UyX1M0OTg1CiAJdHJpc3RhdGUgIlNNQnVzIG11bHRpcGxleGluZyBvbiB0aGUgVHlhbiBTNDk4NSIKLQlkZXBlbmRzIG9uIEkyQ19ORk9SQ0UyICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSTJDX05GT1JDRTIgJiYgWDg2ICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgYWRkIHNwZWNpZmljIFNNQnVzIHN1cHBvcnQgZm9yIHRoZSBUeWFuCiAJICBTNDk4NSBtb3RoZXJib2FyZC4gIE9uIHRoaXMgNC1DUFUgYm9hcmQsIHRoZSBTTUJ1cyBpcyBtdWx0aXBsZXhlZApAQCAtMjA5LDcgKzIwOSw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhLgogCiBjb25maWcgSTJDX1ZJQVBSTwotCXRyaXN0YXRlICJWSUEgVlQ4MkM1OTYvODJDNjg2LzgyeHggYW5kIENYNzAwIgorCXRyaXN0YXRlICJWSUEgVlQ4MkM1OTYvODJDNjg2LzgyeHggYW5kIENYNzAwL1ZYODAwL1ZYODIwIgogCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIFZJQQpAQCAtMjIzLDYgKzIyMyw4IEBACiAJICAgIFZUODIzN1IvQS9TCiAJICAgIFZUODI1MQogCSAgICBDWDcwMAorCSAgICBWWDgwMAorCSAgICBWWDgyMAogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhcHJvLgpAQCAtMzMwLDYgKzMzMiwxOCBAQAogCSAgVGhpcyBpcyBhIHZlcnkgc2ltcGxlIGJpdGJhbmdpbmcgSTJDIGRyaXZlciB1dGlsaXppbmcgdGhlCiAJICBhcmNoLW5ldXRyYWwgR1BJTyBBUEkgdG8gY29udHJvbCB0aGUgU0NMIGFuZCBTREEgbGluZXMuCiAKK2NvbmZpZyBJMkNfSElHSExBTkRFUgorCXRyaXN0YXRlICJIaWdobGFuZGVyIEZQR0EgU01CdXMgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gU0hfSElHSExBTkRFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yCisJICB0aGUgU01CdXMgaW50ZXJmYWNlIGxvY2F0ZWQgaW4gdGhlIEZQR0Egb24gdmFyaW91cyBIaWdobGFuZGVyCisJICBib2FyZHMsIHBhcnRpY3VsYXJseSB0aGUgUjBQNzc4MExDMDAxMVJMIGFuZCBSMFA3Nzg1TEMwMDExUkwKKwkgIEZQR0FzLiBUaGlzIGlzIHdob2xseSB1bnJlbGF0ZWQgdG8gdGhlIFNvQyBJMkMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1oaWdobGFuZGVyLgorCiBjb25maWcgSTJDX0lCTV9JSUMKIAl0cmlzdGF0ZSAiSUJNIFBQQyA0eHggb24tY2hpcCBJMkMgaW50ZXJmYWNlIgogCWRlcGVuZHMgb24gNHh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggOTdkYmZhMi4uMGMyYzRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19DUE0pCQkrPSBpMmMtY3BtLm8KIG9iai0kKENPTkZJR19JMkNfREFWSU5DSSkJKz0gaTJjLWRhdmluY2kubwogb2JqLSQoQ09ORklHX0kyQ19HUElPKQkJKz0gaTJjLWdwaW8ubworb2JqLSQoQ09ORklHX0kyQ19ISUdITEFOREVSKQkrPSBpMmMtaGlnaGxhbmRlci5vCiBvYmotJChDT05GSUdfSTJDX0lCTV9JSUMpCSs9IGkyYy1pYm1faWljLm8KIG9iai0kKENPTkZJR19JMkNfSU9QM1hYKQkrPSBpMmMtaW9wM3h4Lm8KIG9iai0kKENPTkZJR19JMkNfSVhQMjAwMCkJKz0gaTJjLWl4cDIwMDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQyMmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIEZQR0EgSTJDL1NNQnVzIHN1cHBvcnQuCisgKgorICogU3VwcG9ydGVkIGRldmljZXM6IFIwUDc3ODBMQzAwMTFSTCwgUjBQNzc4NUxDMDAxMVJMCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3RvcnkKKyAqIG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgU01DUgkJMHgwMAorI2RlZmluZSBTTUNSX1NUQVJUCSgxIDw8IDApCisjZGVmaW5lIFNNQ1JfSVJJQwkoMSA8PCAxKQorI2RlZmluZSBTTUNSX0JCU1kJKDEgPDwgMikKKyNkZWZpbmUgU01DUl9BQ0tFCSgxIDw8IDMpCisjZGVmaW5lIFNNQ1JfUlNUCSgxIDw8IDQpCisjZGVmaW5lIFNNQ1JfSUVJQwkoMSA8PCA2KQorCisjZGVmaW5lIFNNU01BRFIJCTB4MDIKKworI2RlZmluZSBTTU1SCQkweDA0CisjZGVmaW5lIFNNTVJfTU9ERTAJKDEgPDwgMCkKKyNkZWZpbmUgU01NUl9NT0RFMQkoMSA8PCAxKQorI2RlZmluZSBTTU1SX0NBUAkoMSA8PCAzKQorI2RlZmluZSBTTU1SX1RNTUQJKDEgPDwgNCkKKyNkZWZpbmUgU01NUl9TUAkJKDEgPDwgNykKKworI2RlZmluZSBTTVNBRFIJCTB4MDYKKyNkZWZpbmUgU01UUkRSCQkweDQ2CisKK3N0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcHRlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7CisJdW5zaWduZWQgbG9uZwkJbGFzdF9yZWFkX3RpbWU7CisJaW50CQkJaXJxOworCXU4CQkJKmJ1ZjsKKwlzaXplX3QJCQlidWZfbGVuOworfTsKKworc3RhdGljIGludCBpaWNfZm9yY2VfcG9sbCwgaWljX2ZvcmNlX25vcm1hbDsKK3N0YXRpYyBpbnQgaWljX3RpbWVvdXQgPSAxMDAwLCBpaWNfcmVhZF9kZWxheTsKKworc3RhdGljIGlubGluZSB2b2lkIGhpZ2hsYW5kZXJfaTJjX2lycV9lbmFibGUoc3RydWN0IGhpZ2hsYW5kZXJfaTJjX2RldiAqZGV2KQoreworCWlvd3JpdGUxNihpb3JlYWQxNihkZXYtPmJhc2UgKyBTTUNSKSB8IFNNQ1JfSUVJQywgZGV2LT5iYXNlICsgU01DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdobGFuZGVyX2kyY19pcnFfZGlzYWJsZShzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJaW93cml0ZTE2KGlvcmVhZDE2KGRldi0+YmFzZSArIFNNQ1IpICYgflNNQ1JfSUVJQywgZGV2LT5iYXNlICsgU01DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdobGFuZGVyX2kyY19zdGFydChzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJaW93cml0ZTE2KGlvcmVhZDE2KGRldi0+YmFzZSArIFNNQ1IpIHwgU01DUl9TVEFSVCwgZGV2LT5iYXNlICsgU01DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdobGFuZGVyX2kyY19kb25lKHN0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgKmRldikKK3sKKwlpb3dyaXRlMTYoaW9yZWFkMTYoZGV2LT5iYXNlICsgU01DUikgfCBTTUNSX0lSSUMsIGRldi0+YmFzZSArIFNNQ1IpOworfQorCitzdGF0aWMgdm9pZCBoaWdobGFuZGVyX2kyY19zZXR1cChzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJdTE2IHNtbXI7CisKKwlzbW1yID0gaW9yZWFkMTYoZGV2LT5iYXNlICsgU01NUik7CisJc21tciB8PSBTTU1SX1RNTUQ7CisKKwlpZiAoaWljX2ZvcmNlX25vcm1hbCkKKwkJc21tciAmPSB+U01NUl9TUDsKKwllbHNlCisJCXNtbXIgfD0gU01NUl9TUDsKKworCWlvd3JpdGUxNihzbW1yLCBkZXYtPmJhc2UgKyBTTU1SKTsKK30KKworc3RhdGljIHZvaWQgc21idXNfd3JpdGVfZGF0YSh1OCAqc3JjLCB1MTYgKmRzdCwgaW50IGxlbikKK3sKKwlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpIHsKKwkJKmRzdCsrID0gYmUxNl90b19jcHVwKCh1MTYgKilzcmMpOworCQlzcmMgKz0gMjsKKwl9CisKKwlpZiAobGVuKQorCQkqZHN0ID0gKnNyYyA8PCA4OworfQorCitzdGF0aWMgdm9pZCBzbWJ1c19yZWFkX2RhdGEodTE2ICpzcmMsIHU4ICpkc3QsIGludCBsZW4pCit7CisJZm9yICg7IGxlbiA+IDE7IGxlbiAtPSAyKSB7CisJCSoodTE2ICopZHN0ID0gY3B1X3RvX2JlMTZwKHNyYysrKTsKKwkJZHN0ICs9IDI7CisJfQorCisJaWYgKGxlbikKKwkJKmRzdCA9ICpzcmMgPj4gODsKK30KKworc3RhdGljIHZvaWQgaGlnaGxhbmRlcl9pMmNfY29tbWFuZChzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYsCisJCQkJICAgdTggY29tbWFuZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MTYgY21kID0gKGNvbW1hbmQgPDwgOCkgfCBjb21tYW5kOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7CisJCWlmIChsZW4gLSBpID09IDEpCisJCQljbWQgPSBjb21tYW5kIDw8IDg7CisJCWlvd3JpdGUxNihjbWQsIGRldi0+YmFzZSArIFNNU0FEUiArIGkpOworCQlkZXZfZGJnKGRldi0+ZGV2LCAiY29tbWFuZCBkYXRhWyV4XSAweCUwNHhcbiIsIGkvMiwgY21kKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGlnaGxhbmRlcl9pMmNfd2FpdF9mb3JfYmJzeShzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGlpY190aW1lb3V0KTsKKwl3aGlsZSAoaW9yZWFkMTYoZGV2LT5iYXNlICsgU01DUikgJiBTTUNSX0JCU1kpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWRldl93YXJuKGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBidXMgcmVhZHlcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQltc2xlZXAoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlnaGxhbmRlcl9pMmNfcmVzZXQoc3RydWN0IGhpZ2hsYW5kZXJfaTJjX2RldiAqZGV2KQoreworCWlvd3JpdGUxNihpb3JlYWQxNihkZXYtPmJhc2UgKyBTTUNSKSB8IFNNQ1JfUlNULCBkZXYtPmJhc2UgKyBTTUNSKTsKKwlyZXR1cm4gaGlnaGxhbmRlcl9pMmNfd2FpdF9mb3JfYmJzeShkZXYpOworfQorCitzdGF0aWMgaW50IGhpZ2hsYW5kZXJfaTJjX3dhaXRfZm9yX2FjayhzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJdTE2IHRtcCA9IGlvcmVhZDE2KGRldi0+YmFzZSArIFNNQ1IpOworCisJaWYgKCh0bXAgJiAoU01DUl9JUklDIHwgU01DUl9BQ0tFKSkgPT0gU01DUl9BQ0tFKSB7CisJCWRldl93YXJuKGRldi0+ZGV2LCAiYWNrIGFibm9ybWFsaXR5XG4iKTsKKwkJcmV0dXJuIGhpZ2hsYW5kZXJfaTJjX3Jlc2V0KGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoaWdobGFuZGVyX2kyY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgKmRldiA9IGRldl9pZDsKKworCWhpZ2hsYW5kZXJfaTJjX2RvbmUoZGV2KTsKKwljb21wbGV0ZSgmZGV2LT5jbWRfY29tcGxldGUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBoaWdobGFuZGVyX2kyY19wb2xsKHN0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHNtY3I7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaWljX3RpbWVvdXQpOworCWZvciAoOzspIHsKKwkJc21jciA9IGlvcmVhZDE2KGRldi0+YmFzZSArIFNNQ1IpOworCisJCS8qCisJCSAqIERvbid0IGJvdGhlciBjaGVja2luZyBBQ0tFIGhlcmUsIHRoaXMgYW5kIHRoZSByZXNldAorCQkgKiBhcmUgaGFuZGxlZCBpbiBoaWdobGFuZGVyX2kyY193YWl0X3hmZXJfZG9uZSgpIHdoZW4KKwkJICogd2FpdGluZyBmb3IgdGhlIEFDSy4KKwkJICovCisKKwkJaWYgKHNtY3IgJiBTTUNSX0lSSUMpCisJCQlyZXR1cm47CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisKKwkJY3B1X3JlbGF4KCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWRldl9lcnIoZGV2LT5kZXYsICJwb2xsaW5nIHRpbWVkIG91dFxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhpZ2hsYW5kZXJfaTJjX3dhaXRfeGZlcl9kb25lKHN0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEpCisJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGV2LT5jbWRfY29tcGxldGUsCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhpaWNfdGltZW91dCkpOworCWVsc2UKKwkJLyogYnVzeSBsb29waW5nLCB0aGUgSVJRIG9mIGNoYW1waW9ucyAqLworCQloaWdobGFuZGVyX2kyY19wb2xsKGRldik7CisKKwlyZXR1cm4gaGlnaGxhbmRlcl9pMmNfd2FpdF9mb3JfYWNrKGRldik7Cit9CisKK3N0YXRpYyBpbnQgaGlnaGxhbmRlcl9pMmNfcmVhZChzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJaW50IGksIGNudDsKKwl1MTYgZGF0YVsxNl07CisKKwlpZiAoaGlnaGxhbmRlcl9pMmNfd2FpdF9mb3JfYmJzeShkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWhpZ2hsYW5kZXJfaTJjX3N0YXJ0KGRldik7CisKKwlpZiAoaGlnaGxhbmRlcl9pMmNfd2FpdF94ZmVyX2RvbmUoZGV2KSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiQXJiaXRyYXRpb24gbG9zc1xuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qCisJICogVGhlIFIwUDc3ODBMQzAwMTFSTCBGUEdBIG5lZWRzIGEgc2lnbmlmaWNhbnQgZGVsYXkgYmV0d2VlbgorCSAqIGRhdGEgcmVhZCBjeWNsZXMsIG90aGVyd2lzZSB0aGUgdHJhbnNjaWV2ZXIgZ2V0cyBjb25mdXNlZCBhbmQKKwkgKiBnYXJiYWdlIGlzIHJldHVybmVkIHdoZW4gdGhlIHJlYWQgaXMgc3Vic2VxdWVudGx5IGFib3J0ZWQuCisJICoKKwkgKiBJdCBpcyBub3Qgc3VmZmljaWVudCB0byB3YWl0IGZvciBCQlNZLgorCSAqCisJICogV2hpbGUgdGhpcyBnZW5lcmFsbHkgb25seSBhcHBsaWVzIHRvIHRoZSBvbGRlciBTSDc3ODAtYmFzZWQKKwkgKiBIaWdobGFuZGVycywgdGhlIHNhbWUgaXNzdWUgY2FuIGJlIG9ic2VydmVkIG9uIFNINzc4NSBvbmVzLAorCSAqIGFsYmVpdCBsZXNzIGZyZXF1ZW50bHkuIFNINzc4MC1iYXNlZCBIaWdobGFuZGVycyBtYXkgbmVlZAorCSAqIHRoaXMgdG8gYmUgYXMgaGlnaCBhcyAxMDAwIG1zLgorCSAqLworCWlmIChpaWNfcmVhZF9kZWxheSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBkZXYtPmxhc3RfcmVhZF90aW1lICsKKwkJCQkgbXNlY3NfdG9famlmZmllcyhpaWNfcmVhZF9kZWxheSkpKQorCQltc2xlZXAoamlmZmllc190b19tc2VjcygoZGV2LT5sYXN0X3JlYWRfdGltZSArCisJCQkJbXNlY3NfdG9famlmZmllcyhpaWNfcmVhZF9kZWxheSkpIC0gamlmZmllcykpOworCisJY250ID0gKGRldi0+YnVmX2xlbiArIDEpID4+IDE7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWRhdGFbaV0gPSBpb3JlYWQxNihkZXYtPmJhc2UgKyBTTVRSRFIgKyAoaSAqIHNpemVvZih1MTYpKSk7CisJCWRldl9kYmcoZGV2LT5kZXYsICJyZWFkIGRhdGFbJXhdIDB4JTA0eFxuIiwgaSwgZGF0YVtpXSk7CisJfQorCisJc21idXNfcmVhZF9kYXRhKGRhdGEsIGRldi0+YnVmLCBkZXYtPmJ1Zl9sZW4pOworCisJZGV2LT5sYXN0X3JlYWRfdGltZSA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWdobGFuZGVyX2kyY193cml0ZShzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYpCit7CisJaW50IGksIGNudDsKKwl1MTYgZGF0YVsxNl07CisKKwlzbWJ1c193cml0ZV9kYXRhKGRldi0+YnVmLCBkYXRhLCBkZXYtPmJ1Zl9sZW4pOworCisJY250ID0gKGRldi0+YnVmX2xlbiArIDEpID4+IDE7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlvd3JpdGUxNihkYXRhW2ldLCBkZXYtPmJhc2UgKyBTTVRSRFIgKyAoaSAqIHNpemVvZih1MTYpKSk7CisJCWRldl9kYmcoZGV2LT5kZXYsICJ3cml0ZSBkYXRhWyV4XSAweCUwNHhcbiIsIGksIGRhdGFbaV0pOworCX0KKworCWlmIChoaWdobGFuZGVyX2kyY193YWl0X2Zvcl9iYnN5KGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJaGlnaGxhbmRlcl9pMmNfc3RhcnQoZGV2KTsKKworCXJldHVybiBoaWdobGFuZGVyX2kyY193YWl0X3hmZXJfZG9uZShkZXYpOworfQorCitzdGF0aWMgaW50IGhpZ2hsYW5kZXJfaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1MTYgYWRkciwKKwkJCQkgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCQkJICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKKwkJCQkgIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQoreworCXN0cnVjdCBoaWdobGFuZGVyX2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IHJlYWQgPSByZWFkX3dyaXRlICYgSTJDX1NNQlVTX1JFQUQ7CisJdTE2IHRtcDsKKworCWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY29tcGxldGUpOworCisJZGV2X2RiZyhkZXYtPmRldiwgImFkZHIgJTA0eCwgY29tbWFuZCAlMDJ4LCByZWFkX3dyaXRlICVkLCBzaXplICVkXG4iLAorCQlhZGRyLCBjb21tYW5kLCByZWFkX3dyaXRlLCBzaXplKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBidWZmZXIgYW5kIHRyYW5zZmVyIHNpemUKKwkgKi8KKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCWRldi0+YnVmID0gJmRhdGEtPmJ5dGU7CisJCWRldi0+YnVmX2xlbiA9IDE7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgorCQlkZXYtPmJ1ZiA9ICZkYXRhLT5ibG9ja1sxXTsKKwkJZGV2LT5idWZfbGVuID0gZGF0YS0+YmxvY2tbMF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBjb21tYW5kICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBFbmNvZGUgdGhlIG1vZGUgc2V0dGluZworCSAqLworCXRtcCA9IGlvcmVhZDE2KGRldi0+YmFzZSArIFNNTVIpOworCXRtcCAmPSB+KFNNTVJfTU9ERTAgfCBTTU1SX01PREUxKTsKKworCXN3aXRjaCAoZGV2LT5idWZfbGVuKSB7CisJY2FzZSAxOgorCQkvKiBkZWZhdWx0ICovCisJCWJyZWFrOworCWNhc2UgODoKKwkJdG1wIHw9IFNNTVJfTU9ERTA7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXRtcCB8PSBTTU1SX01PREUxOworCQlicmVhazsKKwljYXNlIDMyOgorCQl0bXAgfD0gKFNNTVJfTU9ERTAgfCBTTU1SX01PREUxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYtPmRldiwgInVuc3VwcG9ydGVkIHhmZXIgc2l6ZSAlZFxuIiwgZGV2LT5idWZfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW93cml0ZTE2KHRtcCwgZGV2LT5iYXNlICsgU01NUik7CisKKwkvKiBFbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlICovCisJaGlnaGxhbmRlcl9pMmNfZG9uZShkZXYpOworCisJLyogU2V0IHNsYXZlIGFkZHJlc3MgKi8KKwlpb3dyaXRlMTYoKGFkZHIgPDwgMSkgfCByZWFkLCBkZXYtPmJhc2UgKyBTTVNNQURSKTsKKworCWhpZ2hsYW5kZXJfaTJjX2NvbW1hbmQoZGV2LCBjb21tYW5kLCBkZXYtPmJ1Zl9sZW4pOworCisJaWYgKHJlYWQpCisJCXJldHVybiBoaWdobGFuZGVyX2kyY19yZWFkKGRldik7CisJZWxzZQorCQlyZXR1cm4gaGlnaGxhbmRlcl9pMmNfd3JpdGUoZGV2KTsKK30KKworc3RhdGljIHUzMiBoaWdobGFuZGVyX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gaGlnaGxhbmRlcl9pMmNfYWxnbyA9IHsKKwkuc21idXNfeGZlcgk9IGhpZ2hsYW5kZXJfaTJjX3NtYnVzX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBoaWdobGFuZGVyX2kyY19mdW5jLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaGlnaGxhbmRlcl9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICh1bmxpa2VseSghcmVzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW0gcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFkZXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+YmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAodW5saWtlbHkoIWRldi0+YmFzZSkpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaWljX2ZvcmNlX3BvbGwpCisJCWRldi0+aXJxID0gMDsKKworCWlmIChkZXYtPmlycSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGlnaGxhbmRlcl9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJCSAgcGRldi0+bmFtZSwgZGV2KTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlnb3RvIGVycl91bm1hcDsKKworCQloaWdobGFuZGVyX2kyY19pcnFfZW5hYmxlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAibm8gSVJRLCB1c2luZyBwb2xsaW5nIG1vZGVcbiIpOworCQloaWdobGFuZGVyX2kyY19pcnFfZGlzYWJsZShkZXYpOworCX0KKworCWRldi0+bGFzdF9yZWFkX3RpbWUgPSBqaWZmaWVzOwkvKiBpbml0aWFsIHJlYWQgamlmZmllcyAqLworCisJaGlnaGxhbmRlcl9pMmNfc2V0dXAoZGV2KTsKKworCWFkYXAgPSAmZGV2LT5hZGFwdGVyOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgZGV2KTsKKwlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOworCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOworCXN0cmxjcHkoYWRhcC0+bmFtZSwgIkhMIEZQR0EgSTJDIGFkYXB0ZXIiLCBzaXplb2YoYWRhcC0+bmFtZSkpOworCWFkYXAtPmFsZ28gPSAmaGlnaGxhbmRlcl9pMmNfYWxnbzsKKwlhZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlhZGFwLT5uciA9IHBkZXYtPmlkOworCisJLyoKKwkgKiBSZXNldCB0aGUgYWRhcHRlcgorCSAqLworCXJldCA9IGhpZ2hsYW5kZXJfaTJjX3Jlc2V0KGRldik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY29udHJvbGxlciBkaWRuJ3QgY29tZSB1cFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsdXJlIGFkZGluZyBhZGFwdGVyXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2lycToKKwlpZiAoZGV2LT5pcnEpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX3VubWFwOgorCWlvdW5tYXAoZGV2LT5iYXNlKTsKK2VycjoKKwlrZnJlZShkZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBoaWdobGFuZGVyX2kyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGlnaGxhbmRlcl9pMmNfZGV2ICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWkyY19kZWxfYWRhcHRlcigmZGV2LT5hZGFwdGVyKTsKKworCWlmIChkZXYtPmlycSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpb3VubWFwKGRldi0+YmFzZSk7CisJa2ZyZWUoZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhpZ2hsYW5kZXJfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaTJjLWhpZ2hsYW5kZXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCisJLnByb2JlCQk9IGhpZ2hsYW5kZXJfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaGlnaGxhbmRlcl9pMmNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhpZ2hsYW5kZXJfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoaWdobGFuZGVyX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGlnaGxhbmRlcl9pMmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoaWdobGFuZGVyX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoaWdobGFuZGVyX2kyY19pbml0KTsKK21vZHVsZV9leGl0KGhpZ2hsYW5kZXJfaTJjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgSGlnaGxhbmRlciBGUEdBIEkyQy9TTUJ1cyBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9wYXJhbShpaWNfZm9yY2VfcG9sbCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX2ZvcmNlX25vcm1hbCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX3RpbWVvdXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaWljX3JlYWRfZGVsYXksIGludCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoaWljX2ZvcmNlX3BvbGwsICJGb3JjZSBwb2xsaW5nIG1vZGUiKTsKK01PRFVMRV9QQVJNX0RFU0MoaWljX2ZvcmNlX25vcm1hbCwKKwkJICJGb3JjZSBub3JtYWwgbW9kZSAoMTAwIGtIeiksIGRlZmF1bHQgaXMgZmFzdCBtb2RlICg0MDAga0h6KSIpOworTU9EVUxFX1BBUk1fREVTQyhpaWNfdGltZW91dCwgIlNldCB0aW1lb3V0IHZhbHVlIGluIG1zZWNzIChkZWZhdWx0IDEwMDAgbXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlpY19yZWFkX2RlbGF5LAorCQkgIkRlbGF5IGJldHdlZW4gZGF0YSByZWFkIGN5Y2xlcyAoZGVmYXVsdCAwIG1zKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKaW5kZXggMjc0NDNmMC4uYTlhNDVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCkBAIC0zMTIsNyArMzEyLDYgQEAKIAkubmFtZSA9ICJNUEMgYWRhcHRlciIsCiAJLmlkID0gSTJDX0hXX01QQzEwNywKIAkuYWxnbyA9ICZtcGNfYWxnbywKLQkuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04gfCBJMkNfQ0xBU1NfU1BELAogCS50aW1lb3V0ID0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKaW5kZXggZTdlYjdiZi4uNjA4MDM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKQEAgLTU4OSwxMSArNTg5LDE2IEBACiAKIAlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJZGV2LT5pcnEgPSBpcnEtPnN0YXJ0OwotCWRldi0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKikgSU9fQUREUkVTUyhtZW0tPnN0YXJ0KTsKKwlkZXYtPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIG1lbS0+ZW5kIC0gbWVtLT5zdGFydCArIDEpOworCWlmICghZGV2LT5iYXNlKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCiAJaWYgKChyID0gb21hcF9pMmNfZ2V0X2Nsb2NrcyhkZXYpKSAhPSAwKQotCQlnb3RvIGVycl9mcmVlX21lbTsKKwkJZ290byBlcnJfaW91bm1hcDsKIAogCW9tYXBfaTJjX3VuaWRsZShkZXYpOwogCkBAIC02NDAsNiArNjQ1LDggQEAKIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCAwKTsKIAlvbWFwX2kyY19pZGxlKGRldik7CiAJb21hcF9pMmNfcHV0X2Nsb2NrcyhkZXYpOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChkZXYtPmJhc2UpOwogZXJyX2ZyZWVfbWVtOgogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKGRldik7CkBAIC02NjEsNiArNjY4LDcgQEAKIAlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+YWRhcHRlcik7CiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgMCk7CiAJb21hcF9pMmNfcHV0X2Nsb2NrcyhkZXYpOworCWlvdW5tYXAoZGV2LT5iYXNlKTsKIAlrZnJlZShkZXYpOwogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCmluZGV4IGM2ZmFmOWIuLmIyYjgzODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCkBAIC0xMjMsMTEgKzEyMyw2IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpMmNfcGFycG9ydF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBlcnI7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7Ci0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLCBEUlZOQU1FKSkKLQkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIFJlc2V0IGhhcmR3YXJlIHRvIGEgc2FuZSBzdGF0ZSAoU0NMIGFuZCBTREEgaGlnaCkgKi8KIAlwYXJwb3J0X3NldHNkYShOVUxMLCAxKTsKQEAgLTEzOCwyOSArMTMzLDE5IEBACiAKIAlwYXJwb3J0X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJZXJyID0gaTJjX2JpdF9hZGRfYnVzKCZwYXJwb3J0X2FkYXB0ZXIpOwotCWlmIChlcnIpIHsKKwlpZiAoZXJyKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBJMkNcbiIpOwotCQlnb3RvIGV4aXRfcmVnaW9uOwotCX0KLQlyZXR1cm4gMDsKLQotZXhpdF9yZWdpb246Ci0JcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgaTJjX3BhcnBvcnRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KIAlpMmNfZGVsX2FkYXB0ZXIoJnBhcnBvcnRfYWRhcHRlcik7CiAKIAkvKiBVbi1pbml0IGlmIG5lZWRlZCAocG93ZXIgb2ZmLi4uKSAqLwogCWlmIChhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdC52YWwpCiAJCWxpbmVfc2V0KDAsICZhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdCk7CiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7Ci0JcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NSwxMiArMTYwLDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaTJjX3BhcnBvcnRfZGV2aWNlX2FkZCh1MTYgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzID0gewotCQkuc3RhcnQJPSBhZGRyZXNzLAotCQkuZW5kCT0gYWRkcmVzcyArIDIsCi0JCS5uYW1lCT0gRFJWTkFNRSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLQl9OwogCWludCBlcnI7CiAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIC0xKTsKQEAgLTE5MCwxMyArMTY5LDYgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7Ci0JfQotCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKQEAgLTIzMSwxMyArMjAzLDE2IEBACiAJCWJhc2UgPSBERUZBVUxUX0JBU0U7CiAJfQogCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCAzLCBEUlZOQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwogICAgICAgICBpZiAoIWFkYXB0ZXJfcGFybVt0eXBlXS5nZXRzY2wudmFsKQogCQlwYXJwb3J0X2FsZ29fZGF0YS5nZXRzY2wgPSBOVUxMOwogCiAJLyogU2V0cyBnbG9iYWwgcGRldiBhcyBhIHNpZGUgZWZmZWN0ICovCiAJZXJyID0gaTJjX3BhcnBvcnRfZGV2aWNlX2FkZChiYXNlKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4aXQ7CisJCWdvdG8gZXhpdF9yZWxlYXNlOwogCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpMmNfcGFycG9ydF9kcml2ZXIpOwogCWlmIChlcnIpCkBAIC0yNDcsNyArMjIyLDggQEAKIAogZXhpdF9kZXZpY2U6CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci1leGl0OgorZXhpdF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI1NSw2ICsyMzEsNyBAQAogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpMmNfcGFycG9ydF9kcml2ZXIpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDMpOwogfQogCiBNT0RVTEVfQVVUSE9SKCJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLWlzYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKaW5kZXggYTExOTc4NC4uOWViNzYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKQEAgLTM2LDggKzM2LDggQEAKICNkZWZpbmUgRFJJVkVSICJpMmMtcGNhLWlzYSIKICNkZWZpbmUgSU9fU0laRSA0CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJhc2UgICA9IDB4MzMwOwotc3RhdGljIGludCBpcnEgCSAgPSAxMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJhc2U7CitzdGF0aWMgaW50IGlycSA9IC0xOwogCiAvKiBEYXRhIHNoZWV0IHJlY29tbWVuZHMgNTlrSHogZm9yIDEwMGtIeiBvcGVyYXRpb24gZHVlIHRvIHZhcmlhdGlvbgogICogaW4gdGhlIGFjdHVhbCBjbG9jayByYXRlICovCkBAIC0xMDcsMTMgKzEwNywyNiBAQAogCS50aW1lb3V0CT0gMTAwLAogfTsKIAorc3RhdGljIGludCBfX2RldmluaXQgcGNhX2lzYV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlpbnQgbWF0Y2ggPSBiYXNlICE9IDA7CisKKwlpZiAobWF0Y2gpIHsKKwkJaWYgKGlycSA8PSAtMSkKKwkJCWRldl93YXJuKGRldiwgIlVzaW5nIHBvbGxpbmcgbW9kZSAoc3BlY2lmeSBpcnEpXG4iKTsKKwl9IGVsc2UKKwkJZGV2X2VycihkZXYsICJQbGVhc2Ugc3BlY2lmeSBJL08gYmFzZVxuIik7CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjYV9pc2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNhX3dhaXQpOwogCiAJZGV2X2luZm8oZGV2LCAiaS9vIGJhc2UgJSMwOGx4LiBpcnEgJWRcbiIsIGJhc2UsIGlycSk7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01FUkdFCisjaWZkZWYgQ09ORklHX1BQQwogCWlmIChjaGVja19sZWdhY3lfaW9wb3J0KGJhc2UpKSB7CiAJCWRldl9lcnIoZGV2LCAiSS9PIGFkZHJlc3MgJSMwOGx4IGlzIG5vdCBhdmFpbGFibGVcbiIsIGJhc2UpOwogCQlnb3RvIG91dDsKQEAgLTE1Myw3ICsxNjYsNyBAQAogewogCWkyY19kZWxfYWRhcHRlcigmcGNhX2lzYV9vcHMpOwogCi0JaWYgKGlycSA+IDApIHsKKwlpZiAoaXJxID4gLTEpIHsKIAkJZGlzYWJsZV9pcnEoaXJxKTsKIAkJZnJlZV9pcnEoaXJxLCAmcGNhX2lzYV9vcHMpOwogCX0KQEAgLTE2Myw2ICsxNzYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgcGNhX2lzYV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHBjYV9pc2FfbWF0Y2gsCiAJLnByb2JlCQk9IHBjYV9pc2FfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwY2FfaXNhX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYwppbmRleCAyMmY2ZDVjLi4wZTdiMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBvd2VybWFjLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jCkBAIC0xODAsNyArMTgwLDcgQEAKIH07CiAKIAotc3RhdGljIGludCBpMmNfcG93ZXJtYWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGkyY19wb3dlcm1hY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHBtYWNfaTJjX2J1cwkqYnVzID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKQEAgLTIwMCw3ICsyMDAsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGkyY19wb3dlcm1hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpMmNfcG93ZXJtYWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cyA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKaW5kZXggNDRkODM4NC4uOTA2ZjliOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC0zOCw3ICszOCw0NCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKworLyoKKyAqIEkyQyByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIElCTVIJCSgweDAwKQorI2RlZmluZSBJREJSCQkoMHgwOCkKKyNkZWZpbmUgSUNSCQkoMHgxMCkKKyNkZWZpbmUgSVNSCQkoMHgxOCkKKyNkZWZpbmUgSVNBUgkJKDB4MjApCisKKyNkZWZpbmUgSUNSX1NUQVJUCSgxIDw8IDApCSAgIC8qIHN0YXJ0IGJpdCAqLworI2RlZmluZSBJQ1JfU1RPUAkoMSA8PCAxKQkgICAvKiBzdG9wIGJpdCAqLworI2RlZmluZSBJQ1JfQUNLTkFLCSgxIDw8IDIpCSAgIC8qIHNlbmQgQUNLKDApIG9yIE5BSygxKSAqLworI2RlZmluZSBJQ1JfVEIJCSgxIDw8IDMpCSAgIC8qIHRyYW5zZmVyIGJ5dGUgYml0ICovCisjZGVmaW5lIElDUl9NQQkJKDEgPDwgNCkJICAgLyogbWFzdGVyIGFib3J0ICovCisjZGVmaW5lIElDUl9TQ0xFCSgxIDw8IDUpCSAgIC8qIG1hc3RlciBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgSUNSX0lVRQkJKDEgPDwgNikJICAgLyogdW5pdCBlbmFibGUgKi8KKyNkZWZpbmUgSUNSX0dDRAkJKDEgPDwgNykJICAgLyogZ2VuZXJhbCBjYWxsIGRpc2FibGUgKi8KKyNkZWZpbmUgSUNSX0lURUlFCSgxIDw8IDgpCSAgIC8qIGVuYWJsZSB0eCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElDUl9JUkZJRQkoMSA8PCA5KQkgICAvKiBlbmFibGUgcnggaW50ZXJydXB0cyAqLworI2RlZmluZSBJQ1JfQkVJRQkoMSA8PCAxMCkJICAgLyogZW5hYmxlIGJ1cyBlcnJvciBpbnRzICovCisjZGVmaW5lIElDUl9TU0RJRQkoMSA8PCAxMSkJICAgLyogc2xhdmUgU1RPUCBkZXRlY3RlZCBpbnQgZW5hYmxlICovCisjZGVmaW5lIElDUl9BTERJRQkoMSA8PCAxMikJICAgLyogZW5hYmxlIGFyYml0cmF0aW9uIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfU0FESUUJKDEgPDwgMTMpCSAgIC8qIHNsYXZlIGFkZHJlc3MgZGV0ZWN0ZWQgaW50IGVuYWJsZSAqLworI2RlZmluZSBJQ1JfVVIJCSgxIDw8IDE0KQkgICAvKiB1bml0IHJlc2V0ICovCisjZGVmaW5lIElDUl9GTQkJKDEgPDwgMTUpCSAgIC8qIGZhc3QgbW9kZSAqLworCisjZGVmaW5lIElTUl9SV00JCSgxIDw8IDApCSAgIC8qIHJlYWQvd3JpdGUgbW9kZSAqLworI2RlZmluZSBJU1JfQUNLTkFLCSgxIDw8IDEpCSAgIC8qIGFjay9uYWsgc3RhdHVzICovCisjZGVmaW5lIElTUl9VQgkJKDEgPDwgMikJICAgLyogdW5pdCBidXN5ICovCisjZGVmaW5lIElTUl9JQkIJCSgxIDw8IDMpCSAgIC8qIGJ1cyBidXN5ICovCisjZGVmaW5lIElTUl9TU0QJCSgxIDw8IDQpCSAgIC8qIHNsYXZlIHN0b3AgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVNSX0FMRAkJKDEgPDwgNSkJICAgLyogYXJiaXRyYXRpb24gbG9zcyBkZXRlY3RlZCAqLworI2RlZmluZSBJU1JfSVRFCQkoMSA8PCA2KQkgICAvKiB0eCBidWZmZXIgZW1wdHkgKi8KKyNkZWZpbmUgSVNSX0lSRgkJKDEgPDwgNykJICAgLyogcnggYnVmZmVyIGZ1bGwgKi8KKyNkZWZpbmUgSVNSX0dDQUQJKDEgPDwgOCkJICAgLyogZ2VuZXJhbCBjYWxsIGFkZHJlc3MgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVNSX1NBRAkJKDEgPDwgOSkJICAgLyogc2xhdmUgYWRkcmVzcyBkZXRlY3RlZCAqLworI2RlZmluZSBJU1JfQkVECQkoMSA8PCAxMCkJICAgLyogYnVzIGVycm9yIG5vIEFDSy9OQUsgKi8KIAogc3RydWN0IHB4YV9pMmMgewogCXNwaW5sb2NrX3QJCWxvY2s7CkBAIC02MCwxOSArOTcsMjEgQEAKIAl1MzIJCQlpY3Jsb2dbMzJdOwogCiAJdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CisJdW5zaWduZWQgaW50CQlyZWdfc2hpZnQ7CiAKIAl1bnNpZ25lZCBsb25nCQlpb2Jhc2U7CiAJdW5zaWduZWQgbG9uZwkJaW9zaXplOwogCiAJaW50CQkJaXJxOwotCWludAkJCXVzZV9waW87CisJdW5zaWduZWQgaW50CQl1c2VfcGlvIDoxOworCXVuc2lnbmVkIGludAkJZmFzdF9tb2RlIDoxOwogfTsKIAotI2RlZmluZSBfSUJNUihpMmMpCSgoaTJjKS0+cmVnX2Jhc2UgKyAwKQotI2RlZmluZSBfSURCUihpMmMpCSgoaTJjKS0+cmVnX2Jhc2UgKyA4KQotI2RlZmluZSBfSUNSKGkyYykJKChpMmMpLT5yZWdfYmFzZSArIDB4MTApCi0jZGVmaW5lIF9JU1IoaTJjKQkoKGkyYyktPnJlZ19iYXNlICsgMHgxOCkKLSNkZWZpbmUgX0lTQVIoaTJjKQkoKGkyYyktPnJlZ19iYXNlICsgMHgyMCkKKyNkZWZpbmUgX0lCTVIoaTJjKQkoKGkyYyktPnJlZ19iYXNlICsgKDB4MCA8PCAoaTJjKS0+cmVnX3NoaWZ0KSkKKyNkZWZpbmUgX0lEQlIoaTJjKQkoKGkyYyktPnJlZ19iYXNlICsgKDB4NCA8PCAoaTJjKS0+cmVnX3NoaWZ0KSkKKyNkZWZpbmUgX0lDUihpMmMpCSgoaTJjKS0+cmVnX2Jhc2UgKyAoMHg4IDw8IChpMmMpLT5yZWdfc2hpZnQpKQorI2RlZmluZSBfSVNSKGkyYykJKChpMmMpLT5yZWdfYmFzZSArICgweGMgPDwgKGkyYyktPnJlZ19zaGlmdCkpCisjZGVmaW5lIF9JU0FSKGkyYykJKChpMmMpLT5yZWdfYmFzZSArICgweDEwIDw8IChpMmMpLT5yZWdfc2hpZnQpKQogCiAvKgogICogSTJDIFNsYXZlIG1vZGUgYWRkcmVzcwpAQCAtMTg4LDE0ICsyMjcsMTQgQEAKIAogc3RhdGljIHZvaWQgaTJjX3B4YV9hYm9ydChzdHJ1Y3QgcHhhX2kyYyAqaTJjKQogewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWi80OworCWludCBpID0gMjUwOwogCiAJaWYgKGkyY19weGFfaXNfc2xhdmVtb2RlKGkyYykpIHsKIAkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBjYWxsZWQgaW4gc2xhdmUgbW9kZVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmIChyZWFkbChfSUJNUihpMmMpKSAmIDB4MSkgPT0gMCkgeworCXdoaWxlICgoaSA+IDApICYmIChyZWFkbChfSUJNUihpMmMpKSAmIDB4MSkgPT0gMCkgewogCQl1bnNpZ25lZCBsb25nIGljciA9IHJlYWRsKF9JQ1IoaTJjKSk7CiAKIAkJaWNyICY9IH5JQ1JfU1RBUlQ7CkBAIC0yMDUsNyArMjQ0LDggQEAKIAogCQlzaG93X3N0YXRlKGkyYyk7CiAKLQkJbXNsZWVwKDEpOworCQltZGVsYXkoMSk7CisJCWkgLS07CiAJfQogCiAJd3JpdGVsKHJlYWRsKF9JQ1IoaTJjKSkgJiB+KElDUl9NQSB8IElDUl9TVEFSVCB8IElDUl9TVE9QKSwKQEAgLTM2NCw3ICs0MDQsNyBAQAogCXdyaXRlbChpMmMtPnNsYXZlX2FkZHIsIF9JU0FSKGkyYykpOwogCiAJLyogc2V0IGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzICovCi0Jd3JpdGVsKEkyQ19JQ1JfSU5JVCwgX0lDUihpMmMpKTsKKwl3cml0ZWwoSTJDX0lDUl9JTklUIHwgKGkyYy0+ZmFzdF9tb2RlID8gSUNSX0ZNIDogMCksIF9JQ1IoaTJjKSk7CiAKICNpZmRlZiBDT05GSUdfSTJDX1BYQV9TTEFWRQogCWRldl9pbmZvKCZpMmMtPmFkYXAuZGV2LCAiRW5hYmxpbmcgc2xhdmUgbW9kZVxuIik7CkBAIC05MDcsMTIgKzk0Nyw2IEBACiAJc3RydWN0IHB4YV9pMmMgKmkyYyA9IGFkYXAtPmFsZ29fZGF0YTsKIAlpbnQgcmV0LCBpOwogCi0JLyogSWYgdGhlIEkyQyBjb250cm9sbGVyIGlzIGRpc2FibGVkIHdlIG5lZWQgdG8gcmVzZXQgaXQgKHByb2JhYmx5IGR1ZQotIAkgICB0byBhIHN1c3BlbmQvcmVzdW1lIGRlc3Ryb3lpbmcgc3RhdGUpLiBXZSBkbyB0aGlzIGhlcmUgYXMgd2UgY2FuIHRoZW4KLSAJICAgYXZvaWQgd29ycnlpbmcgYWJvdXQgcmVzdW1pbmcgdGhlIGNvbnRyb2xsZXIgYmVmb3JlIGl0cyB1c2Vycy4gKi8KLQlpZiAoIShyZWFkbChfSUNSKGkyYykpICYgSUNSX0lVRSkpCi0JCWkyY19weGFfcmVzZXQoaTJjKTsKLQogCWZvciAoaSA9IGFkYXAtPnJldHJpZXM7IGkgPj0gMDsgaS0tKSB7CiAJCXJldCA9IGkyY19weGFfZG9feGZlcihpMmMsIG1zZ3MsIG51bSk7CiAJCWlmIChyZXQgIT0gSTJDX1JFVFJZKQpAQCAtOTkzLDYgKzEwMjcsNyBAQAogCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVyZW1hcDsKIAl9CisJaTJjLT5yZWdfc2hpZnQgPSAoY3B1X2lzX3B4YTN4eCgpICYmIChkZXYtPmlkID09IDEpKSA/IDAgOiAxOwogCiAJaTJjLT5pb2Jhc2UgPSByZXMtPnN0YXJ0OwogCWkyYy0+aW9zaXplID0gcmVzX2xlbihyZXMpOwpAQCAtMTAxMyw2ICsxMDQ4LDcgQEAKIAlpZiAocGxhdCkgewogCQlpMmMtPmFkYXAuY2xhc3MgPSBwbGF0LT5jbGFzczsKIAkJaTJjLT51c2VfcGlvID0gcGxhdC0+dXNlX3BpbzsKKwkJaTJjLT5mYXN0X21vZGUgPSBwbGF0LT5mYXN0X21vZGU7CiAJfQogCiAJaWYgKGkyYy0+dXNlX3BpbykgewpAQCAtMTA4Miw5ICsxMTE4LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaTJjX3B4YV9zdXNwZW5kX2xhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHB4YV9pMmMgKmkyYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJY2xrX2Rpc2FibGUoaTJjLT5jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyY19weGFfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhX2kyYyAqaTJjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19lbmFibGUoaTJjLT5jbGspOworCWkyY19weGFfcmVzZXQoaTJjKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaTJjX3B4YV9zdXNwZW5kX2xhdGUgTlVMTAorI2RlZmluZSBpMmNfcHhhX3Jlc3VtZV9lYXJseSBOVUxMCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaTJjX3B4YV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGkyY19weGFfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2V4aXRfcChpMmNfcHhhX3JlbW92ZSksCisJLnN1c3BlbmRfbGF0ZQk9IGkyY19weGFfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkJPSBpMmNfcHhhX3Jlc3VtZV9lYXJseSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAicHhhMnh4LWkyYyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKaW5kZXggODYyZWIzNS4uNzNkYzUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCkBAIC0zNiw2ICszNiw3IEBACiAgICBWVDgyMzdTICAgICAgICAgICAgMHgzMzcyICAgICAgICAgICAgIHllcwogICAgVlQ4MjUxICAgICAgICAgICAgIDB4MzI4NyAgICAgICAgICAgICB5ZXMKICAgIENYNzAwICAgICAgICAgICAgICAweDgzMjQgICAgICAgICAgICAgeWVzCisgICBWWDgwMC9WWDgyMCAgICAgICAgMHg4MzUzICAgICAgICAgICAgIHllcwogCiAgICBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIGRldmljZSwgd2l0aCBvbmUgU01CdXMgaW50ZXJmYWNlLgogKi8KQEAgLTgyLDYgKzgzLDcgQEAKICNkZWZpbmUgVlQ1OTZfQllURQkJMHgwNAogI2RlZmluZSBWVDU5Nl9CWVRFX0RBVEEJCTB4MDgKICNkZWZpbmUgVlQ1OTZfV09SRF9EQVRBCQkweDBDCisjZGVmaW5lIFZUNTk2X1BST0NfQ0FMTAkJMHgxMAogI2RlZmluZSBWVDU5Nl9CTE9DS19EQVRBCTB4MTQKICNkZWZpbmUgVlQ1OTZfSTJDX0JMT0NLX0RBVEEJMHgzNAogCkBAIC0yMzIsNiArMjM0LDEyIEBACiAJCX0KIAkJc2l6ZSA9IFZUNTk2X1dPUkRfREFUQTsKIAkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgorCQlvdXRiX3AoY29tbWFuZCwgU01CSFNUQ01EKTsKKwkJb3V0Yl9wKGRhdGEtPndvcmQgJiAweGZmLCBTTUJIU1REQVQwKTsKKwkJb3V0Yl9wKChkYXRhLT53b3JkICYgMHhmZjAwKSA+PiA4LCBTTUJIU1REQVQxKTsKKwkJc2l6ZSA9IFZUNTk2X1BST0NfQ0FMTDsKKwkJYnJlYWs7CiAJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CiAJCWlmICghKHZ0NTk2X2ZlYXR1cmVzICYgRkVBVFVSRV9JMkNCTE9DSykpCiAJCQlnb3RvIGV4aXRfdW5zdXBwb3J0ZWQ7CkBAIC0yNjIsNiArMjcwLDkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCisJaWYgKHNpemUgPT0gVlQ1OTZfUFJPQ19DQUxMKQorCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7CisKIAlpZiAoKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB8fCAoc2l6ZSA9PSBWVDU5Nl9RVUlDSykpCiAJCXJldHVybiAwOwogCkBAIC0yNzEsNiArMjgyLDcgQEAKIAkJZGF0YS0+Ynl0ZSA9IGluYl9wKFNNQkhTVERBVDApOwogCQlicmVhazsKIAljYXNlIFZUNTk2X1dPUkRfREFUQToKKwljYXNlIFZUNTk2X1BST0NfQ0FMTDoKIAkJZGF0YS0+d29yZCA9IGluYl9wKFNNQkhTVERBVDApICsgKGluYl9wKFNNQkhTVERBVDEpIDw8IDgpOwogCQlicmVhazsKIAljYXNlIFZUNTk2X0kyQ19CTE9DS19EQVRBOgpAQCAtMjk1LDcgKzMwNyw3IEBACiB7CiAJdTMyIGZ1bmMgPSBJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAogCSAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOworCSAgICBJMkNfU01CVVNfUFJPQ19DQUxMIHwgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQTsKIAogCWlmICh2dDU5Nl9mZWF0dXJlcyAmIEZFQVRVUkVfSTJDQkxPQ0spCiAJCWZ1bmMgfD0gSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOwpAQCAtMzk2LDYgKzQwOCw3IEBACiAKIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfQ1g3MDA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV9WWDgwMDoKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyNTE6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjM3OgogCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfODIzN0E6CkBAIC00NTksNiArNDcyLDggQEAKIAkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfQ1g3MDApLAogCSAgLmRyaXZlcl9kYXRhID0gU01CQkEzIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV9WWDgwMCksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCmluZGV4IGE5NWNiOTQuLjE3MzU2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMTcyLDQgKzE3MiwxNSBAQAogCSAgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIG9mdGVuIHVzZWQgaW4gcG9ydGFibGUgZGV2aWNlcyBsaWtlCiAJICBjZWxsIHBob25lcyBhbmQgUERBcy4KIAorY29uZmlnIE1DVV9NUEM4MzQ5RU1JVFgKKwl0cmlzdGF0ZSAiTVBDODM0OUUtbUlUWCBNQ1UgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDICYmIFBQQ184M3h4CisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHNvZnQgcG93ZXItb2ZmIGZ1bmN0aW9uYWxpdHkgb24gdGhlIEZyZWVzY2FsZQorCSAgYm9hcmRzIHdpdGggdGhlIE1QQzgzNDlFLW1JVFgtY29tcGF0aWJsZSBNQ1UgY2hpcHMuIFRoaXMgZHJpdmVyIHdpbGwKKwkgIGFsc28gcmVnaXN0ZXIgTUNVIEdQSU9zIHdpdGggdGhlIGdlbmVyaWMgR1BJTyBBUEksIHNvIHlvdSdsbCBhYmxlCisJICB0byB1c2UgTUNVIHBpbnMgYXMgR1BJT3MuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKaW5kZXggMzllM2U2OS4uY2E1MjBmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KIG9iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NTApCSs9IHRzbDI1NTAubworb2JqLSQoQ09ORklHX01DVV9NUEM4MzQ5RU1JVFgpCSs9IG1jdV9tcGM4MzQ5ZW1pdHgubwogCiBpZmVxICgkKENPTkZJR19JMkNfREVCVUdfQ0hJUCkseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCmluZGV4IDQ2NTViNzkuLjI4OTAyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCkBAIC00OSwxMCArNDksOSBAQAogCiBzdHJ1Y3QgaXNwMTMwMSB7CiAJc3RydWN0IG90Z190cmFuc2NlaXZlcglvdGc7Ci0Jc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJdm9pZAkJCSgqaTJjX3JlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQlpbnQJCQlpcnE7CiAJaW50CQkJaXJxX3R5cGU7CiAKIAl1MzIJCQlsYXN0X290Z19jdHJsOwpAQCAtMTM4LDE0ICsxMzcsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBvbmx5IHR3byBhZGRyZXNzZXMgcG9zc2libGUgKi8KLSNkZWZpbmUJSVNQX0JBU0UJCTB4MmMKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JSVNQX0JBU0UsIElTUF9CQVNFICsgMSwKLQlJMkNfQ0xJRU5UX0VORCB9OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyOwogCiAvKiBzbWJ1cyBhcGlzIGFyZSB1c2VkIGZvciBwb3J0YWJpbGl0eSAqLwpAQCAtMTUzLDI1ICsxNDQsMjUgQEAKIHN0YXRpYyBpbmxpbmUgdTgKIGlzcDEzMDFfZ2V0X3U4KHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZykKIHsKLQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZpc3AtPmNsaWVudCwgcmVnICsgMCk7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpc3AtPmNsaWVudCwgcmVnICsgMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBpc3AxMzAxX2dldF91MTYoc3RydWN0IGlzcDEzMDEgKmlzcCwgdTggcmVnKQogewotCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoJmlzcC0+Y2xpZW50LCByZWcpOworCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoaXNwLT5jbGllbnQsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBpc3AxMzAxX3NldF9iaXRzKHN0cnVjdCBpc3AxMzAxICppc3AsIHU4IHJlZywgdTggYml0cykKIHsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgmaXNwLT5jbGllbnQsIHJlZyArIDAsIGJpdHMpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGlzcC0+Y2xpZW50LCByZWcgKyAwLCBiaXRzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKIGlzcDEzMDFfY2xlYXJfYml0cyhzdHJ1Y3QgaXNwMTMwMSAqaXNwLCB1OCByZWcsIHU4IGJpdHMpCiB7Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoJmlzcC0+Y2xpZW50LCByZWcgKyAxLCBiaXRzKTsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShpc3AtPmNsaWVudCwgcmVnICsgMSwgYml0cyk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zNDksMTAgKzM0MCwxMCBAQAogCWludCBzdGF0dXM7CiAKIAlpZiAoaXNwICYmICF0ZXN0X2FuZF9zZXRfYml0KHdvcmssICZpc3AtPnRvZG8pKSB7Ci0JCSh2b2lkKSBnZXRfZGV2aWNlKCZpc3AtPmNsaWVudC5kZXYpOworCQkodm9pZCkgZ2V0X2RldmljZSgmaXNwLT5jbGllbnQtPmRldik7CiAJCXN0YXR1cyA9IHNjaGVkdWxlX3dvcmsoJmlzcC0+d29yayk7CiAJCWlmICghc3RhdHVzICYmICFpc3AtPndvcmtpbmcpCi0JCQlkZXZfdmRiZygmaXNwLT5jbGllbnQuZGV2LAorCQkJZGV2X3ZkYmcoJmlzcC0+Y2xpZW50LT5kZXYsCiAJCQkJIndvcmsgaXRlbSAlZCBtYXkgYmUgbG9zdFxuIiwgd29yayk7CiAJfQogfQpAQCAtMTEzNSw3ICsxMTI2LDcgQEAKIAkJLyogdHJhbnNmZXIgc3RhdGUgZnJvbSBvdGcgZW5naW5lIHRvIGlzcDEzMDEgKi8KIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1VQREFURV9JU1AsICZpc3AtPnRvZG8pKSB7CiAJCQlvdGdfdXBkYXRlX2lzcChpc3ApOwotCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LT5kZXYpOwogCQl9CiAjZW5kaWYKIAkJLyogdHJhbnNmZXIgc3RhdGUgZnJvbSBpc3AxMzAxIHRvIG90ZyBlbmdpbmUgKi8KQEAgLTExNDMsNyArMTEzNCw3IEBACiAJCQl1OAkJc3RhdCA9IGlzcDEzMDFfY2xlYXJfbGF0Y2goaXNwKTsKIAogCQkJaXNwX3VwZGF0ZV9vdGcoaXNwLCBzdGF0KTsKLQkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LmRldik7CisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC0+ZGV2KTsKIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV09SS19IT1NUX1JFU1VNRSwgJmlzcC0+dG9kbykpIHsKQEAgLTExNzgsNyArMTE2OSw3IEBACiAJCQl9CiAJCQlob3N0X3Jlc3VtZShpc3ApOwogCQkJLy8gbWRlbGF5KDEwKTsKLQkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LmRldik7CisJCQlwdXRfZGV2aWNlKCZpc3AtPmNsaWVudC0+ZGV2KTsKIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV09SS19USU1FUiwgJmlzcC0+dG9kbykpIHsKQEAgLTExODcsMTUgKzExNzgsMTUgQEAKIAkJCWlmICghc3RvcCkKIAkJCQltb2RfdGltZXIoJmlzcC0+dGltZXIsIGppZmZpZXMgKyBUSU1FUl9KSUZGSUVTKTsKICNlbmRpZgotCQkJcHV0X2RldmljZSgmaXNwLT5jbGllbnQuZGV2KTsKKwkJCXB1dF9kZXZpY2UoJmlzcC0+Y2xpZW50LT5kZXYpOwogCQl9CiAKIAkJaWYgKGlzcC0+dG9kbykKLQkJCWRldl92ZGJnKCZpc3AtPmNsaWVudC5kZXYsCisJCQlkZXZfdmRiZygmaXNwLT5jbGllbnQtPmRldiwKIAkJCQkid29yayBkb25lLCB0b2RvID0gMHglbHhcbiIsCiAJCQkJaXNwLT50b2RvKTsKIAkJaWYgKHN0b3ApIHsKLQkJCWRldl9kYmcoJmlzcC0+Y2xpZW50LmRldiwgInN0b3BcbiIpOworCQkJZGV2X2RiZygmaXNwLT5jbGllbnQtPmRldiwgInN0b3BcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChpc3AtPnRvZG8pOwpAQCAtMTIxOSw3ICsxMjEwLDcgQEAKIHsKIAlzdHJ1Y3QgaXNwMTMwMQkqaXNwOwogCi0JaXNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGlzcDEzMDEsIGNsaWVudC5kZXYpOworCWlzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJLyogdWdseSAtLSBpMmMgaGlqYWNrcyBvdXIgbWVtb3J5IGhvb2sgdG8gd2FpdF9mb3JfY29tcGxldGlvbigpICovCiAJaWYgKGlzcC0+aTJjX3JlbGVhc2UpCkBAIC0xMjI5LDE1ICsxMjIwLDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXNwMTMwMSAqdGhlX3RyYW5zY2VpdmVyOwogCi1zdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQorc3RhdGljIGludCBfX2V4aXQgaXNwMTMwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKIHsKIAlzdHJ1Y3QgaXNwMTMwMQkqaXNwOwogCi0JaXNwID0gY29udGFpbmVyX29mKGkyYywgc3RydWN0IGlzcDEzMDEsIGNsaWVudCk7CisJaXNwID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CiAKIAlpc3AxMzAxX2NsZWFyX2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLCB+MCk7CiAJaXNwMTMwMV9jbGVhcl9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfUklTSU5HLCB+MCk7Ci0JZnJlZV9pcnEoaXNwLT5pcnEsIGlzcCk7CisJZnJlZV9pcnEoaTJjLT5pcnEsIGlzcCk7CiAjaWZkZWYJQ09ORklHX1VTQl9PVEcKIAlvdGdfdW5iaW5kKGlzcCk7CiAjZW5kaWYKQEAgLTEyNTIsNyArMTI0Myw3IEBACiAJcHV0X2RldmljZSgmaTJjLT5kZXYpOwogCXRoZV90cmFuc2NlaXZlciA9IDA7CiAKLQlyZXR1cm4gaTJjX2RldGFjaF9jbGllbnQoaTJjKTsKKwlyZXR1cm4gMDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEyODUsNyArMTI3Niw3IEBACiAJaXNwMTMwMV9zZXRfYml0cyhpc3AsIElTUDEzMDFfSU5URVJSVVBUX0ZBTExJTkcsCiAJCUlOVFJfVkJVU19WTEQgfCBJTlRSX1NFU1NfVkxEIHwgSU5UUl9JRF9HTkQpOwogCi0JZGV2X2luZm8oJmlzcC0+Y2xpZW50LmRldiwgInJlYWR5IGZvciBkdWFsLXJvbGUgVVNCIC4uLlxuIik7CisJZGV2X2luZm8oJmlzcC0+Y2xpZW50LT5kZXYsICJyZWFkeSBmb3IgZHVhbC1yb2xlIFVTQiAuLi5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzEwLDcgKzEzMDEsNyBAQAogCiAjaWZkZWYJQ09ORklHX1VTQl9PVEcKIAlpc3AtPm90Zy5ob3N0ID0gaG9zdDsKLQlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJyZWdpc3RlcmVkIGhvc3RcbiIpOworCWRldl9kYmcoJmlzcC0+Y2xpZW50LT5kZXYsICJyZWdpc3RlcmVkIGhvc3RcbiIpOwogCWhvc3Rfc3VzcGVuZChpc3ApOwogCWlmIChpc3AtPm90Zy5nYWRnZXQpCiAJCXJldHVybiBpc3AxMzAxX290Z19lbmFibGUoaXNwKTsKQEAgLTEzMjUsNyArMTMxNiw3IEBACiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpKQogCQlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9NT0RFX0NPTlRST0xfMSwgTUMxX0RBVF9TRTApOwogCi0JZGV2X2luZm8oJmlzcC0+Y2xpZW50LmRldiwgIkEtSG9zdCBzZXNzaW9ucyBva1xuIik7CisJZGV2X2luZm8oJmlzcC0+Y2xpZW50LT5kZXYsICJBLUhvc3Qgc2Vzc2lvbnMgb2tcbiIpOwogCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9SSVNJTkcsCiAJCUlOVFJfSURfR05EKTsKIAlpc3AxMzAxX3NldF9iaXRzKGlzcCwgSVNQMTMwMV9JTlRFUlJVUFRfRkFMTElORywKQEAgLTEzNDMsNyArMTMzNCw3IEBACiAJcmV0dXJuIDA7CiAKICNlbHNlCi0JZGV2X2RiZygmaXNwLT5jbGllbnQuZGV2LCAiaG9zdCBzZXNzaW9ucyBub3QgYWxsb3dlZFxuIik7CisJZGV2X2RiZygmaXNwLT5jbGllbnQtPmRldiwgImhvc3Qgc2Vzc2lvbnMgbm90IGFsbG93ZWRcbiIpOwogCXJldHVybiAtRUlOVkFMOwogI2VuZGlmCiAKQEAgLTEzNzAsNyArMTM2MSw3IEBACiAKICNpZmRlZglDT05GSUdfVVNCX09URwogCWlzcC0+b3RnLmdhZGdldCA9IGdhZGdldDsKLQlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJyZWdpc3RlcmVkIGdhZGdldFxuIik7CisJZGV2X2RiZygmaXNwLT5jbGllbnQtPmRldiwgInJlZ2lzdGVyZWQgZ2FkZ2V0XG4iKTsKIAkvKiBnYWRnZXQgZHJpdmVyIG1heSBiZSBzdXNwZW5kZWQgdW50aWwgdmJ1c19jb25uZWN0ICgpICovCiAJaWYgKGlzcC0+b3RnLmhvc3QpCiAJCXJldHVybiBpc3AxMzAxX290Z19lbmFibGUoaXNwKTsKQEAgLTEzOTUsNyArMTM4Niw3IEBACiAJCUlOVFJfU0VTU19WTEQpOwogCWlzcDEzMDFfc2V0X2JpdHMoaXNwLCBJU1AxMzAxX0lOVEVSUlVQVF9GQUxMSU5HLAogCQlJTlRSX1ZCVVNfVkxEKTsKLQlkZXZfaW5mbygmaXNwLT5jbGllbnQuZGV2LCAiQi1QZXJpcGhlcmFsIHNlc3Npb25zIG9rXG4iKTsKKwlkZXZfaW5mbygmaXNwLT5jbGllbnQtPmRldiwgIkItUGVyaXBoZXJhbCBzZXNzaW9ucyBva1xuIik7CiAJZHVtcF9yZWdzKGlzcCwgX19mdW5jX18pOwogCiAJLyogSWYgdGhpcyBoYXMgYSBNaW5pLUFCIGNvbm5lY3RvciwgdGhpcyBtb2RlIGlzIGhpZ2hseQpAQCAtMTQwOCw3ICsxMzk5LDcgQEAKIAlyZXR1cm4gMDsKIAogI2Vsc2UKLQlkZXZfZGJnKCZpc3AtPmNsaWVudC5kZXYsICJwZXJpcGhlcmFsIHNlc3Npb25zIG5vdCBhbGxvd2VkXG4iKTsKKwlkZXZfZGJnKCZpc3AtPmNsaWVudC0+ZGV2LCAicGVyaXBoZXJhbCBzZXNzaW9ucyBub3QgYWxsb3dlZFxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIH0KQEAgLTE1MDgsMTIgKzE0OTksMTAgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogbm8gZXJyb3IgcmV0dXJucywgdGhleSdkIGp1c3QgbWFrZSBidXMgc2Nhbm5pbmcgc3RvcCAqLwotc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYnVzLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IF9faW5pdCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCiB7CiAJaW50CQkJc3RhdHVzOwogCXN0cnVjdCBpc3AxMzAxCQkqaXNwOwotCXN0cnVjdCBpMmNfY2xpZW50CSppMmM7CiAKIAlpZiAodGhlX3RyYW5zY2VpdmVyKQogCQlyZXR1cm4gMDsKQEAgLTE1MjcsMzcgKzE1MTYsMTkgQEAKIAlpc3AtPnRpbWVyLmZ1bmN0aW9uID0gaXNwMTMwMV90aW1lcjsKIAlpc3AtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaXNwOwogCi0JaXNwLT5pcnEgPSAtMTsKLQlpc3AtPmNsaWVudC5hZGRyID0gYWRkcmVzczsKLQlpMmNfc2V0X2NsaWVudGRhdGEoJmlzcC0+Y2xpZW50LCBpc3ApOwotCWlzcC0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7Ci0JaXNwLT5jbGllbnQuZHJpdmVyID0gJmlzcDEzMDFfZHJpdmVyOwotCXN0cmxjcHkoaXNwLT5jbGllbnQubmFtZSwgRFJJVkVSX05BTUUsIEkyQ19OQU1FX1NJWkUpOwotCWkyYyA9ICZpc3AtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBpc3ApOworCWlzcC0+Y2xpZW50ID0gaTJjOwogCi0JLyogaWYgdGhpcyBpcyBhIHRydWUgcHJvYmUsIHZlcmlmeSB0aGUgY2hpcCAuLi4gKi8KLQlpZiAoa2luZCA8IDApIHsKLQkJc3RhdHVzID0gaXNwMTMwMV9nZXRfdTE2KGlzcCwgSVNQMTMwMV9WRU5ET1JfSUQpOwotCQlpZiAoc3RhdHVzICE9IEkyQ19WRU5ET1JfSURfUEhJTElQUykgewotCQkJZGV2X2RiZygmYnVzLT5kZXYsICJhZGRyICVkIG5vdCBwaGlsaXBzIGlkOiAlZFxuIiwKLQkJCQlhZGRyZXNzLCBzdGF0dXMpOwotCQkJZ290byBmYWlsMTsKLQkJfQotCQlzdGF0dXMgPSBpc3AxMzAxX2dldF91MTYoaXNwLCBJU1AxMzAxX1BST0RVQ1RfSUQpOwotCQlpZiAoc3RhdHVzICE9IEkyQ19QUk9EVUNUX0lEX1BISUxJUFNfMTMwMSkgewotCQkJZGV2X2RiZygmYnVzLT5kZXYsICIlZCBub3QgaXNwMTMwMSwgJWRcbiIsCi0JCQkJYWRkcmVzcywgc3RhdHVzKTsKLQkJCWdvdG8gZmFpbDE7Ci0JCX0KKwkvKiB2ZXJpZnkgdGhlIGNoaXAgKHNob3VsZG4ndCBiZSBuZWNlc2FyeSkgKi8KKwlzdGF0dXMgPSBpc3AxMzAxX2dldF91MTYoaXNwLCBJU1AxMzAxX1ZFTkRPUl9JRCk7CisJaWYgKHN0YXR1cyAhPSBJMkNfVkVORE9SX0lEX1BISUxJUFMpIHsKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJub3QgcGhpbGlwcyBpZDogJWRcbiIsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKIAl9Ci0KLQlzdGF0dXMgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWRldl9kYmcoJmJ1cy0+ZGV2LCAiY2FuJ3QgYXR0YWNoICVzIHRvIGRldmljZSAlZCwgZXJyICVkXG4iLAotCQkJCURSSVZFUl9OQU1FLCBhZGRyZXNzLCBzdGF0dXMpOwotZmFpbDE6Ci0JCWtmcmVlKGlzcCk7Ci0JCXJldHVybiAwOworCXN0YXR1cyA9IGlzcDEzMDFfZ2V0X3UxNihpc3AsIElTUDEzMDFfUFJPRFVDVF9JRCk7CisJaWYgKHN0YXR1cyAhPSBJMkNfUFJPRFVDVF9JRF9QSElMSVBTXzEzMDEpIHsKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJub3QgaXNwMTMwMSwgJWRcbiIsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKIAl9CiAJaXNwLT5pMmNfcmVsZWFzZSA9IGkyYy0+ZGV2LnJlbGVhc2U7CiAJaTJjLT5kZXYucmVsZWFzZSA9IGlzcDEzMDFfcmVsZWFzZTsKQEAgLTE1ODYsNyArMTU1Nyw3IEBACiAJc3RhdHVzID0gb3RnX2JpbmQoaXNwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZGJnKCZpMmMtPmRldiwgImNhbid0IGJpbmQgT1RHXG4iKTsKLQkJZ290byBmYWlsMjsKKwkJZ290byBmYWlsOwogCX0KICNlbmRpZgogCkBAIC0xNTk5LDI2ICsxNTcwLDIxIEBACiAKIAkJLyogSVJRIHdpcmVkIGF0IE0xNCAqLwogCQlvbWFwX2NmZ19yZWcoTTE0XzE1MTBfR1BJTzIpOwotCQlpc3AtPmlycSA9IE9NQVBfR1BJT19JUlEoMik7CiAJCWlmIChncGlvX3JlcXVlc3QoMiwgImlzcDEzMDEiKSA9PSAwKQogCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoMik7CiAJCWlzcC0+aXJxX3R5cGUgPSBJUlFGX1RSSUdHRVJfRkFMTElORzsKIAl9CiAKIAlpc3AtPmlycV90eXBlIHw9IElSUUZfU0FNUExFX1JBTkRPTTsKLQlzdGF0dXMgPSByZXF1ZXN0X2lycShpc3AtPmlycSwgaXNwMTMwMV9pcnEsCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaTJjLT5pcnEsIGlzcDEzMDFfaXJxLAogCQkJaXNwLT5pcnFfdHlwZSwgRFJJVkVSX05BTUUsIGlzcCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2RiZygmaTJjLT5kZXYsICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCi0JCQkJaXNwLT5pcnEsIHN0YXR1cyk7Ci0jaWZkZWYJQ09ORklHX1VTQl9PVEcKLWZhaWwyOgotI2VuZGlmCi0JCWkyY19kZXRhY2hfY2xpZW50KGkyYyk7Ci0JCWdvdG8gZmFpbDE7CisJCQkJaTJjLT5pcnEsIHN0YXR1cyk7CisJCWdvdG8gZmFpbDsKIAl9CiAKLQlpc3AtPm90Zy5kZXYgPSAmaXNwLT5jbGllbnQuZGV2OworCWlzcC0+b3RnLmRldiA9ICZpMmMtPmRldjsKIAlpc3AtPm90Zy5sYWJlbCA9IERSSVZFUl9OQU1FOwogCiAJaXNwLT5vdGcuc2V0X2hvc3QgPSBpc3AxMzAxX3NldF9ob3N0LApAQCAtMTY0OSwyMiArMTYxNSwyNSBAQAogCQkJc3RhdHVzKTsKIAogCXJldHVybiAwOworCitmYWlsOgorCWtmcmVlKGlzcCk7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQgaXNwMTMwMV9zY2FuX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmJ1cykKLXsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGJ1cywgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBCi0JCQl8IEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGkyY19wcm9iZShidXMsICZhZGRyX2RhdGEsIGlzcDEzMDFfcHJvYmUpOwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlzcDEzMDFfaWRbXSA9IHsKKwl7ICJpc3AxMzAxX29tYXAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGlzcDEzMDFfaWQpOwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAiaXNwMTMwMV9vbWFwIiwKIAl9LAotCS5hdHRhY2hfYWRhcHRlcgk9IGlzcDEzMDFfc2Nhbl9idXMsCi0JLmRldGFjaF9jbGllbnQJPSBpc3AxMzAxX2RldGFjaF9jbGllbnQsCisJLnByb2JlCQk9IGlzcDEzMDFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChpc3AxMzAxX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gaXNwMTMwMV9pZCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tY3VfbXBjODM0OWVtaXR4LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tY3VfbXBjODM0OWVtaXR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhOWJjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL21jdV9tcGM4MzQ5ZW1pdHguYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIFBvd2VyIE1hbmFnZW1lbnQgYW5kIEdQSU8gZXhwYW5kZXIgZHJpdmVyIGZvciBNUEM4MzQ5RS1tSVRYLWNvbXBhdGlibGUgTUNVCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4ICBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorCisvKgorICogSSBkb24ndCBoYXZlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgTUNVIGZpcm13YXJlLCBJIGZvdW5kIHRoaXMgcmVnaXN0ZXIKKyAqIGFuZCBiaXRzIHBvc2l0aW9ucyBieSB0aGUgdHJpYWwmZXJyb3IgbWV0aG9kLgorICovCisjZGVmaW5lIE1DVV9SRUdfQ1RSTAkweDIwCisjZGVmaW5lIE1DVV9DVFJMX1BPRkYJMHg0MAorCisjZGVmaW5lIE1DVV9OVU1fR1BJTwkyCisKK3N0cnVjdCBtY3UgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwIG9mX2djOworCXU4IHJlZ19jdHJsOworfTsKKworc3RhdGljIHN0cnVjdCBtY3UgKmdsb2JfbWN1OworCitzdGF0aWMgdm9pZCBtY3VfcG93ZXJfb2ZmKHZvaWQpCit7CisJc3RydWN0IG1jdSAqbWN1ID0gZ2xvYl9tY3U7CisKKwlwcl9pbmZvKCJTZW5kaW5nIHBvd2VyLW9mZiByZXF1ZXN0IHRvIHRoZSBNQ1UuLi5cbiIpOworCW11dGV4X2xvY2soJm1jdS0+bG9jayk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShnbG9iX21jdS0+Y2xpZW50LCBNQ1VfUkVHX0NUUkwsCisJCQkJICBtY3UtPnJlZ19jdHJsIHwgTUNVX0NUUkxfUE9GRik7CisJbXV0ZXhfdW5sb2NrKCZtY3UtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtY3VfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mX2djID0gdG9fb2ZfZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbWN1ICptY3UgPSBjb250YWluZXJfb2Yob2ZfZ2MsIHN0cnVjdCBtY3UsIG9mX2djKTsKKwl1OCBiaXQgPSAxIDw8ICg0ICsgZ3Bpbyk7CisKKwltdXRleF9sb2NrKCZtY3UtPmxvY2spOworCWlmICh2YWwpCisJCW1jdS0+cmVnX2N0cmwgJj0gfmJpdDsKKwllbHNlCisJCW1jdS0+cmVnX2N0cmwgfD0gYml0OworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShtY3UtPmNsaWVudCwgTUNVX1JFR19DVFJMLCBtY3UtPnJlZ19jdHJsKTsKKwltdXRleF91bmxvY2soJm1jdS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbWN1X2dwaW9fZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJbWN1X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jdV9ncGlvY2hpcF9hZGQoc3RydWN0IG1jdSAqbWN1KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2MgPSAmbWN1LT5vZl9nYzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9ICZvZl9nYy0+Z2M7CisJaW50IHJldDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtY3UtbXBjODM0OWVtaXR4Iik7CisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlnYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlnYy0+bGFiZWwgPSBucC0+ZnVsbF9uYW1lOworCWdjLT5jYW5fc2xlZXAgPSAxOworCWdjLT5uZ3BpbyA9IE1DVV9OVU1fR1BJTzsKKwlnYy0+YmFzZSA9IC0xOworCWdjLT5zZXQgPSBtY3VfZ3Bpb19zZXQ7CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtY3VfZ3Bpb19kaXJfb3V0OworCW9mX2djLT5ncGlvX2NlbGxzID0gMjsKKwlvZl9nYy0+eGxhdGUgPSBvZl9ncGlvX3NpbXBsZV94bGF0ZTsKKworCW5wLT5kYXRhID0gb2ZfZ2M7CisJbWN1LT5ucCA9IG5wOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGxvc2UgdGhlIG5vZGUsIGl0cyAtPmRhdGEgYW5kIC0+ZnVsbF9uYW1lLi4uCisJICogU28sIGlmIHN1Y2NlZWRlZCwgd2UgZG9uJ3QgcHV0IHRoZSBub2RlIGhlcmUuCisJICovCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKGdjKTsKKwlpZiAocmV0KQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtY3VfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBtY3UgKm1jdSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZtY3UtPm9mX2djLmdjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW9mX25vZGVfcHV0KG1jdS0+bnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1jdV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbWN1ICptY3U7CisJaW50IHJldDsKKworCW1jdSA9IGt6YWxsb2Moc2l6ZW9mKCptY3UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZtY3UtPmxvY2spOworCW1jdS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG1jdSk7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobWN1LT5jbGllbnQsIE1DVV9SRUdfQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCW1jdS0+cmVnX2N0cmwgPSByZXQ7CisKKwlyZXQgPSBtY3VfZ3Bpb2NoaXBfYWRkKG1jdSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBYWFg6IHRoaXMgaXMgcG90ZW50aWFsbHkgcmFjeSwgYnV0IHRoZXJlIGlzIG5vIGxvY2sgZm9yIHBwY19tZCAqLworCWlmICghcHBjX21kLnBvd2VyX29mZikgeworCQlnbG9iX21jdSA9IG1jdTsKKwkJcHBjX21kLnBvd2VyX29mZiA9IG1jdV9wb3dlcl9vZmY7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIndpbGwgcHJvdmlkZSBwb3dlci1vZmYgc2VydmljZVxuIik7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUobWN1KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtY3VfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1jdSAqbWN1ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldDsKKworCWlmIChnbG9iX21jdSA9PSBtY3UpIHsKKwkJcHBjX21kLnBvd2VyX29mZiA9IE5VTEw7CisJCWdsb2JfbWN1ID0gTlVMTDsKKwl9CisKKwlyZXQgPSBtY3VfZ3Bpb2NoaXBfcmVtb3ZlKG1jdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwlrZnJlZShtY3UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWN1X2lkc1tdID0geworCXsgIm1jdS1tcGM4MzQ5ZW1pdHgiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtY3VfaWRzKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1jdV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWN1LW1wYzgzNDllbWl0eCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gbWN1X3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChtY3VfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBtY3VfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWN1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1jdV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobWN1X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWN1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWN1X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtY3VfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXIgTWFuYWdlbWVudCBhbmQgR1BJTyBleHBhbmRlciBkcml2ZXIgZm9yICIKKwkJICAgIk1QQzgzNDlFLW1JVFgtY29tcGF0aWJsZSBNQ1UiKTsKK01PRFVMRV9BVVRIT1IoIkFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKaW5kZXggY2YwMmU4Zi4uYWNmOGI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCkBAIC00NTYsMTQgKzQ1NiwxNyBAQAogCiAvKiBvZmZzZXRzIDAuLjMgPT0gR1BJTzEuLkdQSU80CiAgKiBvZmZzZXRzIDQuLjUgPT0gTEVEMS9uUEcsIExFRDIgKHdlIHNldCBvbmUgb2YgdGhlIG5vbi1CTElOSyBtb2RlcykKKyAqIG9mZnNldCA2ID09IHZpYnJhdG9yIG1vdG9yIGRyaXZlcgogICovCiBzdGF0aWMgdm9pZAogdHBzNjUwMTBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7CiAJaWYgKG9mZnNldCA8IDQpCiAJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShvZmZzZXQgKyAxLCB2YWx1ZSk7Ci0JZWxzZQorCWVsc2UgaWYgKG9mZnNldCA8IDYpCiAJCXRwczY1MDEwX3NldF9sZWQob2Zmc2V0IC0gMywgdmFsdWUgPyBPTiA6IE9GRik7CisJZWxzZQorCQl0cHM2NTAxMF9zZXRfdmliKHZhbHVlKTsKIH0KIAogc3RhdGljIGludApAQCAtNDc3LDggKzQ4MCwxMCBAQAogCQlpZiAoISh0cHMtPm91dG1hc2sgJiAoMSA8PCBvZmZzZXQpKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUob2Zmc2V0ICsgMSwgdmFsdWUpOwotCX0gZWxzZQorCX0gZWxzZSBpZiAob2Zmc2V0IDwgNikKIAkJdHBzNjUwMTBfc2V0X2xlZChvZmZzZXQgLSAzLCB2YWx1ZSA/IE9OIDogT0ZGKTsKKwllbHNlCisJCXRwczY1MDEwX3NldF92aWIodmFsdWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDYsNyArNjUxLDcgQEAKIAkJdHBzLT5jaGlwLmdldCA9IHRwczY1MDEwX2dwaW9fZ2V0OwogCiAJCXRwcy0+Y2hpcC5iYXNlID0gYm9hcmQtPmJhc2U7Ci0JCXRwcy0+Y2hpcC5uZ3BpbyA9IDY7CisJCXRwcy0+Y2hpcC5uZ3BpbyA9IDc7CiAJCXRwcy0+Y2hpcC5jYW5fc2xlZXAgPSAxOwogCiAJCXN0YXR1cyA9IGdwaW9jaGlwX2FkZCgmdHBzLT5jaGlwKTsKQEAgLTY3NSw2ICs2ODAsNyBAQAogCXsgInRwczY1MDExIiwgVFBTNjUwMTEgfSwKIAl7ICJ0cHM2NTAxMiIsIFRQUzY1MDEyIH0sCiAJeyAidHBzNjUwMTMiLCBUUFM2NTAxMyB9LAorCXsgInRwczY1MDE0IiwgVFBTNjUwMTEgfSwJLyogdHBzNjUwMTEgY2hhcmdpbmcgYXQgNi41ViBtYXggKi8KIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHBzNjUwMTBfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggYjM0NmE2OC4uNDJlODUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC00MzcsNiArNDM3LDEwIEBACiB7CiAJaW50IHJlcyA9IDAsIGR1bW15OwogCisJLyogQ2FuJ3QgcmVnaXN0ZXIgdW50aWwgYWZ0ZXIgZHJpdmVyIG1vZGVsIGluaXQgKi8KKwlpZiAodW5saWtlbHkoV0FSTl9PTighaTJjX2J1c190eXBlLnApKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKIAltdXRleF9pbml0KCZhZGFwLT5idXNfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYWRhcC0+Y2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmFkYXAtPmNsaWVudHMpOwpAQCAtNjk2LDYgKzcwMCwxMCBAQAogewogCWludCByZXM7CiAKKwkvKiBDYW4ndCByZWdpc3RlciB1bnRpbCBhZnRlciBkcml2ZXIgbW9kZWwgaW5pdCAqLworCWlmICh1bmxpa2VseShXQVJOX09OKCFpMmNfYnVzX3R5cGUucCkpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCS8qIG5ldyBzdHlsZSBkcml2ZXIgbWV0aG9kcyBjYW4ndCBtaXggd2l0aCBsZWdhY3kgb25lcyAqLwogCWlmIChpc19uZXdzdHlsZV9kcml2ZXIoZHJpdmVyKSkgewogCQlpZiAoZHJpdmVyLT5hdHRhY2hfYWRhcHRlciB8fCBkcml2ZXItPmRldGFjaF9hZGFwdGVyCkBAIC05NzgsNyArOTg2LDEwIEBACiAJYnVzX3VucmVnaXN0ZXIoJmkyY19idXNfdHlwZSk7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChpMmNfaW5pdCk7CisvKiBXZSBtdXN0IGluaXRpYWxpemUgZWFybHksIGJlY2F1c2Ugc29tZSBzdWJzeXN0ZW1zIHJlZ2lzdGVyIGkyYyBkcml2ZXJzCisgKiBpbiBzdWJzeXNfaW5pdGNhbGwoKSBjb2RlLCBidXQgYXJlIGxpbmtlZCAoYW5kIGluaXRpYWxpemVkKSBiZWZvcmUgaTJjLgorICovCitwb3N0Y29yZV9pbml0Y2FsbChpMmNfaW5pdCk7CiBtb2R1bGVfZXhpdChpMmNfZXhpdCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2NzcsNiArMTY4OCwyOCBAQAogRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKTsKIAogLyoqCisgKiBpMmNfc21idXNfcHJvY2Vzc19jYWxsIC0gU01CdXMgInByb2Nlc3MgY2FsbCIgcHJvdG9jb2wKKyAqIEBjbGllbnQ6IEhhbmRsZSB0byBzbGF2ZSBkZXZpY2UKKyAqIEBjb21tYW5kOiBCeXRlIGludGVycHJldGVkIGJ5IHNsYXZlCisgKiBAdmFsdWU6IDE2LWJpdCAid29yZCIgYmVpbmcgd3JpdHRlbgorICoKKyAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJwcm9jZXNzIGNhbGwiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KKyAqIGVsc2UgYSAxNi1iaXQgdW5zaWduZWQgIndvcmQiIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4KKyAqLworczMyIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTE2IHZhbHVlKQoreworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJaW50IHN0YXR1czsKKwlkYXRhLndvcmQgPSB2YWx1ZTsKKworCXN0YXR1cyA9IGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlciwgY2xpZW50LT5hZGRyLCBjbGllbnQtPmZsYWdzLAorCQkJCUkyQ19TTUJVU19XUklURSwgY29tbWFuZCwKKwkJCQlJMkNfU01CVVNfUFJPQ19DQUxMLCAmZGF0YSk7CisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IGRhdGEud29yZDsKK30KK0VYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3Byb2Nlc3NfY2FsbCk7CisKKy8qKgogICogaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YSAtIFNNQnVzICJibG9jayByZWFkIiBwcm90b2NvbAogICogQGNsaWVudDogSGFuZGxlIHRvIHNsYXZlIGRldmljZQogICogQGNvbW1hbmQ6IEJ5dGUgaW50ZXJwcmV0ZWQgYnkgc2xhdmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1kZXYuYyBiL2RyaXZlcnMvaTJjL2kyYy1kZXYuYwppbmRleCBhZjQ0OTFmLi5jMTcxOTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWRldi5jCkBAIC01MjEsOSArNTIxLDkgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaTJjX2Rldik7CiAKIAkvKiByZWdpc3RlciB0aGlzIGkyYyBkZXZpY2Ugd2l0aCB0aGUgZHJpdmVyIGNvcmUgKi8KLQlpMmNfZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoaTJjX2Rldl9jbGFzcywgJmFkYXAtPmRldiwKLQkJCQkJICAgICBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSwKLQkJCQkJICAgICBOVUxMLCAiaTJjLSVkIiwgYWRhcC0+bnIpOworCWkyY19kZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaTJjX2Rldl9jbGFzcywgJmFkYXAtPmRldiwKKwkJCQkgICAgIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpLCBOVUxMLAorCQkJCSAgICAgImkyYy0lZCIsIGFkYXAtPm5yKTsKIAlpZiAoSVNfRVJSKGkyY19kZXYtPmRldikpIHsKIAkJcmVzID0gUFRSX0VSUihpMmNfZGV2LT5kZXYpOwogCQlnb3RvIGVycm9yOwpAQCAtNTgzLDggKzU4MywxMCBAQAogCQlnb3RvIG91dDsKIAogCWkyY19kZXZfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJpMmMtZGV2Iik7Ci0JaWYgKElTX0VSUihpMmNfZGV2X2NsYXNzKSkKKwlpZiAoSVNfRVJSKGkyY19kZXZfY2xhc3MpKSB7CisJCXJlcyA9IFBUUl9FUlIoaTJjX2Rldl9jbGFzcyk7CiAJCWdvdG8gb3V0X3VucmVnX2NocmRldjsKKwl9CiAKIAlyZXMgPSBpMmNfYWRkX2RyaXZlcigmaTJjZGV2X2RyaXZlcik7CiAJaWYgKHJlcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL0tjb25maWcgYi9kcml2ZXJzL2lkZS9LY29uZmlnCmluZGV4IGZjNzM1YWIuLjc0YTM2OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL0tjb25maWcKKysrIGIvZHJpdmVycy9pZGUvS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogIyBTZWxlY3QgSEFWRV9JREUgaWYgSURFIGlzIHN1cHBvcnRlZAogY29uZmlnIEhBVkVfSURFCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAogbWVudWNvbmZpZyBJREUKIAl0cmlzdGF0ZSAiQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydCIKQEAgLTU0LDM4ICs1NCw2IEBACiAKIGlmIElERQogCi1jb25maWcgQkxLX0RFVl9JREUKLQl0cmlzdGF0ZSAiRW5oYW5jZWQgSURFL01GTS9STEwgZGlzay9jZHJvbS90YXBlL2Zsb3BweSBzdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCB1c2UgdGhlIGZ1bGwtZmVhdHVyZWQgSURFIGRyaXZlciB0bwotCSAgY29udHJvbCB1cCB0byB0ZW4gQVRBL0lERSBpbnRlcmZhY2VzLCBlYWNoIGJlaW5nIGFibGUgdG8gc2VydmUgYQotCSAgIm1hc3RlciIgYW5kIGEgInNsYXZlIiBkZXZpY2UsIGZvciBhIHRvdGFsIG9mIHVwIHRvIHR3ZW50eSBBVEEvSURFCi0JICBkaXNrL2Nkcm9tL3RhcGUvZmxvcHB5IGRyaXZlcy4KLQotCSAgVXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IGxhcmdlICg+NTQwIE1CKSBJREUgZGlza3MsIG11bHRpcGxlCi0JICBpbnRlcmZhY2VzLCB3aGF0IHRvIGRvIGlmIEFUQS9JREUgZGV2aWNlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkKLQkgIGRldGVjdGVkLCBzb3VuZCBjYXJkIEFUQS9JREUgcG9ydHMsIG1vZHVsZSBzdXBwb3J0LCBhbmQgb3RoZXIKLQkgIHRvcGljcywgaXMgY29udGFpbmVkIGluIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlL2lkZS50eHQ+LiBGb3IgZGV0YWlsZWQKLQkgIGluZm9ybWF0aW9uIGFib3V0IGhhcmQgZHJpdmVzLCBjb25zdWx0IHRoZSBEaXNrLUhPV1RPIGFuZCB0aGUKLQkgIE11bHRpLURpc2stSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBmaW5lLXR1bmUgQVRBL0lERSBkcml2ZS9pbnRlcmZhY2UgcGFyYW1ldGVycyBmb3IgaW1wcm92ZWQKLQkgIHBlcmZvcm1hbmNlLCBsb29rIGZvciB0aGUgaGRwYXJtIHBhY2thZ2UgYXQKLQkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2hhcmR3YXJlLz4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vaWRlL2lkZS50eHQ+LiBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlkZS1tb2QuCi0JICBEbyBub3QgY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSBpZiB5b3VyIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZQotCSAgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBpcyBsb2NhdGVkIG9uIGFuIElERSBkZXZpY2UuCi0KLQkgIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIElERSBkcml2ZXMsIHNheSBZIG9yIE0gaGVyZS4gSWYgeW91ciBzeXN0ZW0KLQkgIGhhcyBubyBJREUgZHJpdmVzLCBvciBpZiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFyZSByZWFsbHkgdGlnaHQsIHlvdQotCSAgY291bGQgc2F5IE4gaGVyZSwgYW5kIHNlbGVjdCB0aGUgIk9sZCBoYXJkIGRpc2sgZHJpdmVyIiBiZWxvdwotCSAgaW5zdGVhZCB0byBzYXZlIGFib3V0IDEzIEtCIG9mIG1lbW9yeSBpbiB0aGUga2VybmVsLgotCi1pZiBCTEtfREVWX0lERQotCiBjb21tZW50ICJQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzIgogCiBjb25maWcgSURFX1RJTUlOR1MKQEAgLTEzMSwyOSArOTksNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCi1jb25maWcgSURFRElTS19NVUxUSV9NT0RFCi0JYm9vbCAiVXNlIG11bHRpcGxlIHNlY3RvciBtb2RlIGZvciBQcm9ncmFtbWVkIElucHV0L091dHB1dCBieSBkZWZhdWx0IgotCWhlbHAKLQkgIFRoaXMgc2V0dGluZyBpcyBpcnJlbGV2YW50IGZvciBtb3N0IElERSBkaXNrcywgd2l0aCBkaXJlY3QgbWVtb3J5Ci0JICBhY2Nlc3MsIHRvIHdoaWNoIG11bHRpcGxlIHNlY3RvciBtb2RlIGRvZXMgbm90IGFwcGx5LiBNdWx0aXBsZSBzZWN0b3IKLQkgIG1vZGUgaXMgYSBmZWF0dXJlIG9mIG1vc3QgbW9kZXJuIElERSBoYXJkIGRyaXZlcywgcGVybWl0dGluZyB0aGUKLQkgIHRyYW5zZmVyIG9mIG11bHRpcGxlIHNlY3RvcnMgcGVyIFByb2dyYW1tZWQgSW5wdXQvT3V0cHV0IGludGVycnVwdCwKLQkgIHJhdGhlciB0aGFuIHRoZSB1c3VhbCBvbmUgc2VjdG9yIHBlciBpbnRlcnJ1cHQuIFdoZW4gdGhpcyBmZWF0dXJlIGlzCi0JICBlbmFibGVkLCBpdCBjYW4gcmVkdWNlIG9wZXJhdGluZyBzeXN0ZW0gb3ZlcmhlYWQgZm9yIGRpc2sgUHJvZ3JhbW1lZAotCSAgSW5wdXQvT3V0cHV0LiBPbiBzb21lIHN5c3RlbXMsIGl0IGFsc28gY2FuIGluY3JlYXNlIHRoZSBkYXRhCi0JICB0aHJvdWdocHV0IG9mIFByb2dyYW1tZWQgSW5wdXQvT3V0cHV0LiBTb21lIGRyaXZlcywgaG93ZXZlciwgc2VlbWVkCi0JICB0byBydW4gc2xvd2VyIHdpdGggbXVsdGlwbGUgc2VjdG9yIG1vZGUgZW5hYmxlZC4gU29tZSBkcml2ZXMgY2xhaW1lZAotCSAgdG8gc3VwcG9ydCBtdWx0aXBsZSBzZWN0b3IgbW9kZSwgYnV0IGxvc3QgZGF0YSBhdCBzb21lIHNldHRpbmdzLgotCSAgVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzLCBzdWNoIGZhaWx1cmVzIGNvdWxkIHJlc3VsdCBpbiBtYXNzaXZlCi0JICBmaWxlc3lzdGVtIGNvcnJ1cHRpb24uCi0KLQkgIElmIHlvdSBnZXQgdGhlIGZvbGxvd2luZyBlcnJvciwgdHJ5IHRvIHNheSBZIGhlcmU6Ci0KLQkgIGhkYTogc2V0X211bHRtb2RlOiBzdGF0dXM9MHg1MSB7IERyaXZlUmVhZHkgU2Vla0NvbXBsZXRlIEVycm9yIH0KLQkgIGhkYTogc2V0X211bHRtb2RlOiBlcnJvcj0weDA0IHsgRHJpdmVTdGF0dXNFcnJvciB9Ci0KLQkgIElmIGluIGRvdWJ0LCBzYXkgTi4KLQogY29uZmlnIEJMS19ERVZfSURFQ1MKIAl0cmlzdGF0ZSAiUENNQ0lBIElERSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENNQ0lBCkBAIC0yOTIsNiArMjM3LDIwIEBACiAJdHJpc3RhdGUgImdlbmVyaWMvZGVmYXVsdCBJREUgY2hpcHNldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQUxQSEEgfHwgWDg2IHx8IElBNjQgfHwgTTMyUiB8fCBNSVBTCiAJaGVscAorCSAgVGhpcyBpcyB0aGUgZ2VuZXJpYyBJREUgZHJpdmVyLiAgVGhpcyBkcml2ZXIgYXR0YWNoZXMgdG8gdGhlCisJICBmaXhlZCBsZWdhY3kgcG9ydHMgKGUuZy4gb24gUENzIDB4MWYwLzB4MTcwLCAweDFlOC8weDE2OCBhbmQKKwkgIHNvIG9uKS4gIFBsZWFzZSBub3RlIHRoYXQgaWYgdGhpcyBkcml2ZXIgaXMgYnVpbHQgaW50byB0aGUKKwkgIGtlcm5lbCBvciBsb2FkZWQgYmVmb3JlIG90aGVyIEFUQSAoSURFIG9yIGxpYmF0YSkgZHJpdmVycworCSAgYW5kIHRoZSBjb250cm9sbGVyIGlzIGxvY2F0ZWQgYXQgbGVnYWN5IHBvcnRzLCB0aGlzIGRyaXZlcgorCSAgbWF5IGdyYWIgdGhvc2UgcG9ydHMgYW5kIHRodXMgY2FuIHByZXZlbnQgdGhlIGNvbnRyb2xsZXIKKwkgIHNwZWNpZmljIGRyaXZlciBmcm9tIGF0dGFjaGluZy4KKworCSAgQWxzbywgY3VycmVudGx5LCBJREUgZ2VuZXJpYyBkb2Vzbid0IGFsbG93IElSUSBzaGFyaW5nCisJICBtZWFuaW5nIHRoYXQgdGhlIElSUXMgaXQgZ3JhYnMgd29uJ3QgYmUgYXZhaWxhYmxlIHRvIG90aGVyCisJICBjb250cm9sbGVycyBzaGFyaW5nIHRob3NlIElSUXMgd2hpY2ggdXN1YWxseSBtYWtlcyBkcml2ZXJzCisJICBmb3IgdGhvc2UgY29udHJvbGxlcnMgZmFpbC4gIEdlbmVyYWxseSwgaXQncyBub3QgYSBnb29kIGlkZWEKKwkgIHRvIGxvYWQgSURFIGdlbmVyaWMgZHJpdmVyIG9uIG1vZGVybiBzeXN0ZW1zLgorCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQkxLX0RFVl9QTEFURk9STQpAQCAtMzU3LDcgKzMxNiw3IEBACiAKIGNvbmZpZyBJREVQQ0lfUENJQlVTX09SREVSCiAJYm9vbCAiUHJvYmUgSURFIFBDSSBkZXZpY2VzIGluIHRoZSBQQ0kgYnVzIG9yZGVyIChERVBSRUNBVEVEKSIKLQlkZXBlbmRzIG9uIEJMS19ERVZfSURFPXkgJiYgQkxLX0RFVl9JREVQQ0kKKwlkZXBlbmRzIG9uIElERT15ICYmIEJMS19ERVZfSURFUENJCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgUHJvYmUgSURFIFBDSSBkZXZpY2VzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUKQEAgLTczOCw3ICs2OTcsNyBAQAogCiBjb25maWcgQkxLX0RFVl9JREVfUE1BQwogCXRyaXN0YXRlICJQb3dlck1hYyBvbi1ib2FyZCBJREUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ19QTUFDICYmIElERT15ICYmIEJMS19ERVZfSURFPXkKKwlkZXBlbmRzIG9uIFBQQ19QTUFDICYmIElERT15CiAJc2VsZWN0IElERV9USU1JTkdTCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWJvYXJkIElERSBjb250cm9sbGVyIG9uCkBAIC03NjYsMTAgKzcyNSw2IEBACiAJICB0byB0cmFuc2ZlciBkYXRhIHRvIGFuZCBmcm9tIG1lbW9yeS4gIFNheWluZyBZIGlzIHNhZmUgYW5kIGltcHJvdmVzCiAJICBwZXJmb3JtYW5jZS4KIAotY29uZmlnIEJMS19ERVZfSURFX1NXQVJNCi0JdHJpc3RhdGUgIklERSBmb3IgU2lieXRlIGV2YWx1YXRpb24gYm9hcmRzIgotCWRlcGVuZHMgb24gU0lCWVRFX1NCMXh4eF9TT0MKLQogY29uZmlnIEJMS19ERVZfSURFX0FVMVhYWAogICAgICAgIGJvb2wgIklERSBmb3IgQU1EIEFsY2hlbXkgQXUxMjAwIgogICAgICAgIGRlcGVuZHMgb24gU09DX0FVMTIwMApAQCAtOTc2LDYgKzkzMSw0IEBACiAJZGVmX2Jvb2wgQkxLX0RFVl9JREVETUFfU0ZGIHx8IEJMS19ERVZfSURFRE1BX1BNQUMgfHwgXAogCQkgQkxLX0RFVl9JREVETUFfSUNTIHx8IEJMS19ERVZfSURFX0FVMVhYWF9NRE1BMl9EQkRNQQogCi1lbmRpZgotCiBlbmRpZiAjIElERQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvTWFrZWZpbGUgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQppbmRleCA2NGUwZWNkLi5jZWFmNzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lkZS9NYWtlZmlsZQpAQCAtNCwyNSArNCwyNiBAQAogCiBFWFRSQV9DRkxBR1MJCQkJKz0gLUlkcml2ZXJzL2lkZQogCi1pZGUtY29yZS15ICs9IGlkZS5vIGlkZS1pby5vIGlkZS1pb3BzLm8gaWRlLWxpYi5vIGlkZS1wcm9iZS5vIGlkZS10YXNrZmlsZS5vIFwKLQkgICAgICBpZGUtcGlvLWJsYWNrbGlzdC5vCitpZGUtY29yZS15ICs9IGlkZS5vIGlkZS1pb2N0bHMubyBpZGUtaW8ubyBpZGUtaW9wcy5vIGlkZS1saWIubyBpZGUtcHJvYmUubyBcCisJICAgICAgaWRlLXRhc2tmaWxlLm8gaWRlLXBhcmsubyBpZGUtcGlvLWJsYWNrbGlzdC5vCiAKICMgY29yZSBJREUgY29kZQogaWRlLWNvcmUtJChDT05GSUdfSURFX1RJTUlOR1MpCQkrPSBpZGUtdGltaW5ncy5vCiBpZGUtY29yZS0kKENPTkZJR19JREVfQVRBUEkpCQkrPSBpZGUtYXRhcGkubwogaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVQQ0kpCSs9IHNldHVwLXBjaS5vCiBpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERURNQSkJKz0gaWRlLWRtYS5vCitpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERURNQV9TRkYpCSs9IGlkZS1kbWEtc2ZmLm8KIGlkZS1jb3JlLSQoQ09ORklHX0lERV9QUk9DX0ZTKQkJKz0gaWRlLXByb2MubwogaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVBQ1BJKQkrPSBpZGUtYWNwaS5vCiAKLW9iai0kKENPTkZJR19CTEtfREVWX0lERSkJCSs9IGlkZS1jb3JlLm8KK29iai0kKENPTkZJR19JREUpCQkJKz0gaWRlLWNvcmUubwogCiBpZmVxICgkKENPTkZJR19JREVfQVJNKSwgeSkKIAlpZGUtYXJtLWNvcmUteSArPSBhcm0vaWRlX2FybS5vCiAJb2JqLXkgKz0gaWRlLWFybS1jb3JlLm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19CTEtfREVWX0lERSkJCSs9IGxlZ2FjeS8gcGNpLworb2JqLSQoQ09ORklHX0lERSkJCQkrPSBsZWdhY3kvIHBjaS8KIAogb2JqLSQoQ09ORklHX0lERVBDSV9QQ0lCVVNfT1JERVIpCSs9IGlkZS1zY2FuLXBjaS5vCiAKQEAgLTMxLDE3ICszMiwyNCBAQAogCW9iai15ICs9IGNtZDY0MC1jb3JlLm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19CTEtfREVWX0lERSkJCSs9IHBwYy8KK29iai0kKENPTkZJR19JREUpCQkJKz0gcHBjLwogb2JqLSQoQ09ORklHX0lERV9IODMwMCkJCQkrPSBoODMwMC8KIG9iai0kKENPTkZJR19JREVfR0VORVJJQykJCSs9IGlkZS1nZW5lcmljLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lERVBOUCkJCSs9IGlkZS1wbnAubwogCitpZGUtZGlza19tb2QteSArPSBpZGUtZGlzay5vIGlkZS1kaXNrX2lvY3RsLm8KIGlkZS1jZF9tb2QteSArPSBpZGUtY2QubyBpZGUtY2RfaW9jdGwubyBpZGUtY2RfdmVyYm9zZS5vCitpZGUtZmxvcHB5X21vZC15ICs9IGlkZS1mbG9wcHkubyBpZGUtZmxvcHB5X2lvY3RsLm8KIAotb2JqLSQoQ09ORklHX0JMS19ERVZfSURFRElTSykJCSs9IGlkZS1kaXNrLm8KK2lmZXEgKCQoQ09ORklHX0lERV9QUk9DX0ZTKSwgeSkKKwlpZGUtZGlza19tb2QteSArPSBpZGUtZGlza19wcm9jLm8KKwlpZGUtZmxvcHB5X21vZC15ICs9IGlkZS1mbG9wcHlfcHJvYy5vCitlbmRpZgorCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVESVNLKQkJKz0gaWRlLWRpc2tfbW9kLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lERUNEKQkJKz0gaWRlLWNkX21vZC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkpCQkrPSBpZGUtZmxvcHB5X21vZC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9JREVUQVBFKQkJKz0gaWRlLXRhcGUubwotb2JqLSQoQ09ORklHX0JMS19ERVZfSURFRkxPUFBZKQkJKz0gaWRlLWZsb3BweS5vCiAKIGlmZXEgKCQoQ09ORklHX0JMS19ERVZfSURFQ1MpLCB5KQogCWlkZS1jcy1jb3JlLXkgKz0gbGVnYWN5L2lkZS1jcy5vCkBAIC01Myw0ICs2MSw0IEBACiAJb2JqLXkgKz0gaWRlLXBsYXRmb3JtLWNvcmUubwogZW5kaWYKIAotb2JqLSQoQ09ORklHX0JMS19ERVZfSURFKQkJKz0gYXJtLyBtaXBzLworb2JqLSQoQ09ORklHX0lERSkJCQkrPSBhcm0vIG1pcHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hcm0vaWNzaWRlLmMgYi9kcml2ZXJzL2lkZS9hcm0vaWNzaWRlLmMKaW5kZXggZGY0YWY0MC4uNzZiZGM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYXJtL2ljc2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2FybS9pY3NpZGUuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI2NSw4ICsyNjQsOCBAQAogCSAqIElmIHdlJ3JlIGdvaW5nIHRvIGJlIGRvaW5nIE1XX0RNQV8xIG9yIE1XX0RNQV8yLCB3ZSBzaG91bGQKIAkgKiB0YWtlIGNhcmUgdG8gbm90ZSB0aGUgdmFsdWVzIGluIHRoZSBJRC4uLgogCSAqLwotCWlmICh1c2VfZG1hX2luZm8gJiYgZHJpdmUtPmlkLT5laWRlX2RtYV90aW1lID4gY3ljbGVfdGltZSkKLQkJY3ljbGVfdGltZSA9IGRyaXZlLT5pZC0+ZWlkZV9kbWFfdGltZTsKKwlpZiAodXNlX2RtYV9pbmZvICYmIGRyaXZlLT5pZFtBVEFfSURfRUlERV9ETUFfVElNRV0gPiBjeWNsZV90aW1lKQorCQljeWNsZV90aW1lID0gZHJpdmUtPmlkW0FUQV9JRF9FSURFX0RNQV9USU1FXTsKIAogCWRyaXZlLT5kcml2ZV9kYXRhID0gY3ljbGVfdGltZTsKIApAQCAtMzczLDI1ICszNzIsNiBAQAogCQkJSUNTX0FSQ0lOX1Y2X0lOVFJTVEFUXzEpKSAmIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGljc2lkZV9kbWFfdGltZW91dChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCi0JcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIHRpbWVvdXQgb2NjdXJyZWQ6ICIsIGRyaXZlLT5uYW1lKTsKLQotCWlmIChpY3NpZGVfZG1hX3Rlc3RfaXJxKGRyaXZlKSkKLQkJcmV0dXJuOwotCi0JaWRlX2R1bXBfc3RhdHVzKGRyaXZlLCAiRE1BIHRpbWVvdXQiLCBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpKTsKLQotCWljc2lkZV9kbWFfZW5kKGRyaXZlKTsKLX0KLQotc3RhdGljIHZvaWQgaWNzaWRlX2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogSVJRIGxvc3RcbiIsIGRyaXZlLT5uYW1lKTsKLX0KLQogc3RhdGljIGludCBpY3NpZGVfZG1hX2luaXQoaWRlX2h3aWZfdCAqaHdpZiwgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKmQpCiB7CiAJaHdpZi0+ZG1hdGFibGVfY3B1CT0gTlVMTDsKQEAgLTQwNyw4ICszODcsOCBAQAogCS5kbWFfc3RhcnQJCT0gaWNzaWRlX2RtYV9zdGFydCwKIAkuZG1hX2VuZAkJPSBpY3NpZGVfZG1hX2VuZCwKIAkuZG1hX3Rlc3RfaXJxCQk9IGljc2lkZV9kbWFfdGVzdF9pcnEsCi0JLmRtYV90aW1lb3V0CQk9IGljc2lkZV9kbWFfdGltZW91dCwKLQkuZG1hX2xvc3RfaXJxCQk9IGljc2lkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiB9OwogI2Vsc2UKICNkZWZpbmUgaWNzaWRlX3Y2X2RtYV9vcHMgTlVMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYXJtL3BhbG1fYmszNzEwLmMgYi9kcml2ZXJzL2lkZS9hcm0vcGFsbV9iazM3MTAuYwppbmRleCA0ZmQ5MWRjLi4xMjJlZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hcm0vcGFsbV9iazM3MTAuYworKysgYi9kcml2ZXJzL2lkZS9hcm0vcGFsbV9iazM3MTAuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xODAsNyArMTc5LDcgQEAKIAl2YWwzMiB8PSAodDJpIDw8IChkZXYgPyA4IDogMCkpOwogCXdyaXRlbCh2YWwzMiwgYmFzZSArIEJLMzcxMF9EQVRSQ1ZSKTsKIAotCWlmIChtYXRlICYmIG1hdGUtPnByZXNlbnQpIHsKKwlpZiAobWF0ZSkgewogCQl1OCBtb2RlMiA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShtYXRlLCAyNTUsIDQpOwogCiAJCWlmIChtb2RlMiA8IG1vZGUpCkBAIC0yMTMsNyArMjEyLDggQEAKIAkJcGFsbV9iazM3MTBfc2V0dWRtYW1vZGUoYmFzZSwgaXNfc2xhdmUsCiAJCQkJCXhmZXJzcGVlZCAtIFhGRVJfVURNQV8wKTsKIAl9IGVsc2UgewotCQlwYWxtX2JrMzcxMF9zZXRkbWFtb2RlKGJhc2UsIGlzX3NsYXZlLCBkcml2ZS0+aWQtPmVpZGVfZG1hX21pbiwKKwkJcGFsbV9iazM3MTBfc2V0ZG1hbW9kZShiYXNlLCBpc19zbGF2ZSwKKwkJCQkgICAgICAgZHJpdmUtPmlkW0FUQV9JRF9FSURFX0RNQV9NSU5dLAogCQkJCSAgICAgICB4ZmVyc3BlZWQpOwogCX0KIH0KQEAgLTIyOSw3ICsyMjksNyBAQAogCSAqIE9idGFpbiB0aGUgZHJpdmUgUElPIGRhdGEgZm9yIHR1bmluZyB0aGUgUGFsbSBDaGlwIHJlZ2lzdGVycwogCSAqLwogCWN5Y2xlX3RpbWUgPSBpZGVfcGlvX2N5Y2xlX3RpbWUoZHJpdmUsIHBpbyk7Ci0JbWF0ZSA9IGlkZV9nZXRfcGFpcmVkX2RyaXZlKGRyaXZlKTsKKwltYXRlID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJcGFsbV9iazM3MTBfc2V0cGlvbW9kZShiYXNlLCBtYXRlLCBpc19zbGF2ZSwgY3ljbGVfdGltZSwgcGlvKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaDgzMDAvaWRlLWg4MzAwLmMgYi9kcml2ZXJzL2lkZS9oODMwMC9pZGUtaDgzMDAuYwppbmRleCBiZGU3YTU4Li5lMmNkZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9oODMwMC9pZGUtaDgzMDAuYworKysgYi9kcml2ZXJzL2lkZS9oODMwMC9pZGUtaDgzMDAuYwpAQCAtODAsNyArODAsNyBAQAogCQlvdXRiKHRmLT5sYmFoLCBpb19wb3J0cy0+bGJhaF9hZGRyKTsKIAogCWlmICh0YXNrLT50Zl9mbGFncyAmIElERV9URkxBR19PVVRfREVWSUNFKQotCQlvdXRiKCh0Zi0+ZGV2aWNlICYgSElISSkgfCBkcml2ZS0+c2VsZWN0LmFsbCwKKwkJb3V0YigodGYtPmRldmljZSAmIEhJSEkpIHwgZHJpdmUtPnNlbGVjdCwKIAkJICAgICBpb19wb3J0cy0+ZGV2aWNlX2FkZHIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwppbmRleCA2ZjcwNDYyLi4yNDRhOGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogCURFQlBSSU5UKCJFTlRFUjogJXMgYXQgJXMsIHBvcnQjOiAlZCwgaGFyZF9wb3J0IzogJWRcbiIsCiAJCSBod2lmLT5uYW1lLCBkZXYtPmJ1c19pZCwgcG9ydCwgaHdpZi0+Y2hhbm5lbCk7CiAKLQlpZiAoIWRyaXZlLT5wcmVzZW50KSB7CisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApIHsKIAkJREVCUFJJTlQoIiVzIGRyaXZlICVkOiVkIG5vdCBwcmVzZW50XG4iLAogCQkJIGh3aWYtPm5hbWUsIGh3aWYtPmNoYW5uZWwsIHBvcnQpOwogCQlnb3RvIG91dDsKQEAgLTQyMCw4ICs0MjAsOSBAQAogCiAJREVCUFJJTlQoIkVOVEVSOiAlcywgaGFyZF9wb3J0IzogJWRcbiIsIGRyaXZlLT5uYW1lLCBkcml2ZS0+ZG4pOwogCi0JaWYgKCFkcml2ZS0+cHJlc2VudCkKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKIAkJZ290byBvdXQ7CisKIAlpZiAoIWd0Zl9jb3VudCkJCS8qIHNob3VsZG4ndCBiZSBoZXJlICovCiAJCWdvdG8gb3V0OwogCkBAIC01ODQsNyArNTg1LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIF9TVE0gQUNQSSBtZXRob2QgZm9yIHRoZSB0YXJnZXQgY2hhbm5lbC4KICAqCiAgKiBfU1RNIHJlcXVpcmVzIElkZW50aWZ5IERyaXZlIGRhdGEsIHdoaWNoIGhhcyB0byBwYXNzZWQgYXMgYW4gYXJndW1lbnQuCi0gKiBVbmZvcnR1bmF0ZWx5IGhkX2RyaXZlaWQgaXMgYSBtYW5nbGVkIHZlcnNpb24gd2hpY2ggd2UgY2FuJ3QgcmVhZGlseQorICogVW5mb3J0dW5hdGVseSBkcml2ZS0+aWQgaXMgYSBtYW5nbGVkIHZlcnNpb24gd2hpY2ggd2UgY2FuJ3QgcmVhZGlseQogICogdXNlOyBoZW5jZSB3ZSdsbCBnZXQgdGhlIGluZm9ybWF0aW9uIGFmcmVzaC4KICAqLwogdm9pZCBpZGVfYWNwaV9wdXNoX3RpbWluZyhpZGVfaHdpZl90ICpod2lmKQpAQCAtNjE0LDEwICs2MTUsMTAgQEAKIAlpbl9wYXJhbXNbMF0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgR1RNX2J1ZmZlcik7CiAJaW5fcGFyYW1zWzBdLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopJmh3aWYtPmFjcGlkYXRhLT5ndG07CiAJaW5fcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwotCWluX3BhcmFtc1sxXS5idWZmZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBoZF9kcml2ZWlkKTsKKwlpbl9wYXJhbXNbMV0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihBVEFfSURfV09SRFMgKiAyKTsKIAlpbl9wYXJhbXNbMV0uYnVmZmVyLnBvaW50ZXIgPSAodTggKikmbWFzdGVyLT5pZGJ1ZmY7CiAJaW5fcGFyYW1zWzJdLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwotCWluX3BhcmFtc1syXS5idWZmZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBoZF9kcml2ZWlkKTsKKwlpbl9wYXJhbXNbMl0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihBVEFfSURfV09SRFMgKiAyKTsKIAlpbl9wYXJhbXNbMl0uYnVmZmVyLnBvaW50ZXIgPSAodTggKikmc2xhdmUtPmlkYnVmZjsKIAkvKiBPdXRwdXQgYnVmZmVyOiBfU1RNIGhhcyBubyBvdXRwdXQgKi8KIApAQCAtNjYwLDcgKzY2MSw4IEBACiAJCWlmICghZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlKQogCQkJZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlID0gaWRlX2FjcGlfZHJpdmVfZ2V0X2hhbmRsZShkcml2ZSk7CiAKLQkJaWYgKGRyaXZlLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSAmJiBkcml2ZS0+cHJlc2VudCkgeworCQlpZiAoZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlICYmCisJCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSkgewogCQkJYWNwaV9idXNfc2V0X3Bvd2VyKGRyaXZlLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSwKIAkJCQlvbj8gQUNQSV9TVEFURV9EMDogQUNQSV9TVEFURV9EMyk7CiAJCX0KQEAgLTcyMCw3ICs3MjIsNyBAQAogCiAJCW1lbXNldChkcml2ZS0+YWNwaWRhdGEsIDAsIHNpemVvZigqZHJpdmUtPmFjcGlkYXRhKSk7CiAKLQkJaWYgKCFkcml2ZS0+cHJlc2VudCkKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCQljb250aW51ZTsKIAogCQllcnIgPSB0YXNrZmlsZV9saWJfZ2V0X2lkZW50aWZ5KGRyaXZlLCBkcml2ZS0+YWNwaWRhdGEtPmlkYnVmZik7CkBAIC03NDUsNyArNzQ3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7CiAJCWRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKIAotCQlpZiAoZHJpdmUtPnByZXNlbnQpCisJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpCiAJCQkvKiBFeGVjdXRlIEFDUEkgc3RhcnR1cCBjb2RlICovCiAJCQlpZGVfYWNwaV9leGVjX3Rmcyhkcml2ZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYwppbmRleCBhZGYwNGY5Li4yZTMwNTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYwpAQCAtMTQsMjUgKzE0LDI2OCBAQAogI2RlZmluZSBkZWJ1Z19sb2coZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0vKiBUT0RPOiB1bmlmeSB0aGUgY29kZSB0aHVzIG1ha2luZyBzb21lIGFyZ3VtZW50cyBnbyBhd2F5ICovCi1pZGVfc3RhcnRzdG9wX3QgaWRlX3BjX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKLQlpZGVfaGFuZGxlcl90ICpoYW5kbGVyLCB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnksCi0Jdm9pZCAoKnVwZGF0ZV9idWZmZXJzKShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICopLAotCXZvaWQgKCpyZXRyeV9wYykoaWRlX2RyaXZlX3QgKiksIHZvaWQgKCpkc2NfaGFuZGxlKShpZGVfZHJpdmVfdCAqKSwKLQl2b2lkICgqaW9fYnVmZmVycykoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9hdGFwaV9wYyAqLCB1bnNpZ25lZCwgaW50KSkKKy8qCisgKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBzdXBwb3J0IGEgZGV2aWNlLAorICogYmFzZWQgb24gdGhlIEFUQVBJIElERU5USUZZIGNvbW1hbmQgcmVzdWx0cy4KKyAqLworaW50IGlkZV9jaGVja19hdGFwaV9kZXZpY2UoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICpzKQogeworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisJdTggZ2N3WzJdLCBwcm90b2NvbCwgZGV2aWNlX3R5cGUsIHJlbW92YWJsZSwgZHJxX3R5cGUsIHBhY2tldF9zaXplOworCisJKigodTE2ICopJmdjdykgPSBpZFtBVEFfSURfQ09ORklHXTsKKworCXByb3RvY29sICAgID0gKGdjd1sxXSAmIDB4QzApID4+IDY7CisJZGV2aWNlX3R5cGUgPSAgZ2N3WzFdICYgMHgxRjsKKwlyZW1vdmFibGUgICA9IChnY3dbMF0gJiAweDgwKSA+PiA3OworCWRycV90eXBlICAgID0gKGdjd1swXSAmIDB4NjApID4+IDU7CisJcGFja2V0X3NpemUgPSAgZ2N3WzBdICYgMHgwMzsKKworI2lmZGVmIENPTkZJR19QUEMKKwkvKiBrbHVkZ2UgZm9yIEFwcGxlIFBvd2VyQm9vayBpbnRlcm5hbCB6aXAgKi8KKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9mbG9wcHkgJiYgZGV2aWNlX3R5cGUgPT0gNSAmJgorCSAgICAhc3Ryc3RyKChjaGFyICopJmlkW0FUQV9JRF9QUk9EXSwgIkNELVJPTSIpICYmCisJICAgIHN0cnN0cigoY2hhciAqKSZpZFtBVEFfSURfUFJPRF0sICJaSVAiKSkKKwkJZGV2aWNlX3R5cGUgPSAwOworI2VuZGlmCisKKwlpZiAocHJvdG9jb2wgIT0gMikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IHByb3RvY29sICgweCUwMngpIGlzIG5vdCBBVEFQSVxuIiwKKwkJCXMsIGRyaXZlLT5uYW1lLCBwcm90b2NvbCk7CisJZWxzZSBpZiAoKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5ICYmIGRldmljZV90eXBlICE9IDApIHx8CisJCSAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmIGRldmljZV90eXBlICE9IDEpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogaW52YWxpZCBkZXZpY2UgdHlwZSAoMHglMDJ4KVxuIiwKKwkJCXMsIGRyaXZlLT5uYW1lLCBkZXZpY2VfdHlwZSk7CisJZWxzZSBpZiAocmVtb3ZhYmxlID09IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiB0aGUgcmVtb3ZhYmxlIGZsYWcgaXMgbm90IHNldFxuIiwKKwkJCXMsIGRyaXZlLT5uYW1lKTsKKwllbHNlIGlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Zsb3BweSAmJiBkcnFfdHlwZSA9PSAzKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc29ycnksIERSUSB0eXBlICgweCUwMngpIG5vdCAiCisJCQkic3VwcG9ydGVkXG4iLCBzLCBkcml2ZS0+bmFtZSwgZHJxX3R5cGUpOworCWVsc2UgaWYgKHBhY2tldF9zaXplICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBwYWNrZXQgc2l6ZSAoMHglMDJ4KSBpcyBub3QgMTIgIgorCQkJImJ5dGVzXG4iLCBzLCBkcml2ZS0+bmFtZSwgcGFja2V0X3NpemUpOworCWVsc2UKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfY2hlY2tfYXRhcGlfZGV2aWNlKTsKKworLyogUElPIGRhdGEgdHJhbnNmZXIgcm91dGluZSB1c2luZyB0aGUgc2NhdHRlciBnYXRoZXIgdGFibGUuICovCitpbnQgaWRlX2lvX2J1ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKKwkJICAgIHVuc2lnbmVkIGludCBiY291bnQsIGludCB3cml0ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKKwl4ZmVyX2Z1bmNfdCAqeGYgPSB3cml0ZSA/IHRwX29wcy0+b3V0cHV0X2RhdGEgOiB0cF9vcHMtPmlucHV0X2RhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHBjLT5zZzsKKwljaGFyICpidWY7CisJaW50IGNvdW50LCBkb25lID0gMDsKKworCXdoaWxlIChiY291bnQpIHsKKwkJY291bnQgPSBtaW4oc2ctPmxlbmd0aCAtIHBjLT5iX2NvdW50LCBiY291bnQpOworCisJCWlmIChQYWdlSGlnaE1lbShzZ19wYWdlKHNnKSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWJ1ZiA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9JUlEwKSArIHNnLT5vZmZzZXQ7CisJCQl4Zihkcml2ZSwgTlVMTCwgYnVmICsgcGMtPmJfY291bnQsIGNvdW50KTsKKwkJCWt1bm1hcF9hdG9taWMoYnVmIC0gc2ctPm9mZnNldCwgS01fSVJRMCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0gZWxzZSB7CisJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCXhmKGRyaXZlLCBOVUxMLCBidWYgKyBwYy0+Yl9jb3VudCwgY291bnQpOworCQl9CisKKwkJYmNvdW50IC09IGNvdW50OworCQlwYy0+Yl9jb3VudCArPSBjb3VudDsKKwkJZG9uZSArPSBjb3VudDsKKworCQlpZiAocGMtPmJfY291bnQgPT0gc2ctPmxlbmd0aCkgeworCQkJaWYgKCEtLXBjLT5zZ19jbnQpCisJCQkJYnJlYWs7CisJCQlwYy0+c2cgPSBzZyA9IHNnX25leHQoc2cpOworCQkJcGMtPmJfY291bnQgPSAwOworCQl9CisJfQorCisJaWYgKGJjb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlZCBsZWZ0b3ZlciBieXRlcywgJXNcbiIsIGRyaXZlLT5uYW1lLAorCQkJYmNvdW50LCB3cml0ZSA/ICJwYWRkaW5nIHdpdGggemVyb3MiCisJCQkJICAgICAgOiAiZGlzY2FyZGluZyBkYXRhIik7CisJCWlkZV9wYWRfdHJhbnNmZXIoZHJpdmUsIHdyaXRlLCBiY291bnQpOworCX0KKworCXJldHVybiBkb25lOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2lvX2J1ZmZlcnMpOworCit2b2lkIGlkZV9pbml0X3BjKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQoreworCW1lbXNldChwYywgMCwgc2l6ZW9mKCpwYykpOworCXBjLT5idWYgPSBwYy0+cGNfYnVmOworCXBjLT5idWZfc2l6ZSA9IElERV9QQ19CVUZGRVJfU0laRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9pbml0X3BjKTsKKworLyoKKyAqIEdlbmVyYXRlIGEgbmV3IHBhY2tldCBjb21tYW5kIHJlcXVlc3QgaW4gZnJvbnQgb2YgdGhlIHJlcXVlc3QgcXVldWUsIGJlZm9yZQorICogdGhlIGN1cnJlbnQgcmVxdWVzdCwgc28gdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBpbW1lZGlhdGVseSwgb24gdGhlIG5leHQKKyAqIHBhc3MgdGhyb3VnaCB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCBpZGVfcXVldWVfcGNfaGVhZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorCQkJICAgICAgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlibGtfcnFfaW5pdChOVUxMLCBycSk7CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKKwlycS0+Y21kX2ZsYWdzIHw9IFJFUV9QUkVFTVBUOworCXJxLT5idWZmZXIgPSAoY2hhciAqKXBjOworCXJxLT5ycV9kaXNrID0gZGlzazsKKwltZW1jcHkocnEtPmNtZCwgcGMtPmMsIDEyKTsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlKQorCQlycS0+Y21kWzEzXSA9IFJFUV9JREVUQVBFX1BDMTsKKwlpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCBycSk7Cit9CisKKy8qCisgKiBBZGQgYSBzcGVjaWFsIHBhY2tldCBjb21tYW5kIHJlcXVlc3QgdG8gdGhlIHRhaWwgb2YgdGhlIHJlcXVlc3QgcXVldWUsCisgKiBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgc2VydmljZWQuCisgKi8KK2ludCBpZGVfcXVldWVfcGNfdGFpbChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorCQkgICAgICBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IGVycm9yOworCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOworCXJxLT5idWZmZXIgPSAoY2hhciAqKXBjOworCW1lbWNweShycS0+Y21kLCBwYy0+YywgMTIpOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX3RhcGUpCisJCXJxLT5jbWRbMTNdID0gUkVRX0lERVRBUEVfUEMxOworCWVycm9yID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBkaXNrLCBycSwgMCk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9xdWV1ZV9wY190YWlsKTsKKworaW50IGlkZV9kb190ZXN0X3VuaXRfcmVhZHkoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOworCisJaWRlX2luaXRfcGMoJnBjKTsKKwlwYy5jWzBdID0gVEVTVF9VTklUX1JFQURZOworCisJcmV0dXJuIGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCBkaXNrLCAmcGMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RvX3Rlc3RfdW5pdF9yZWFkeSk7CisKK2ludCBpZGVfZG9fc3RhcnRfc3RvcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgc3RhcnQpCit7CisJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKKworCWlkZV9pbml0X3BjKCZwYyk7CisJcGMuY1swXSA9IFNUQVJUX1NUT1A7CisJcGMuY1s0XSA9IHN0YXJ0OworCisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSkKKwkJcGMuZmxhZ3MgfD0gUENfRkxBR19XQUlUX0ZPUl9EU0M7CisKKwlyZXR1cm4gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG9fc3RhcnRfc3RvcCk7CisKK2ludCBpZGVfc2V0X21lZGlhX2xvY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IG9uKQoreworCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CisKKwlpZiAoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX05PX0RPT1JMT0NLKQorCQlyZXR1cm4gMDsKKworCWlkZV9pbml0X3BjKCZwYyk7CisJcGMuY1swXSA9IEFMTE9XX01FRElVTV9SRU1PVkFMOworCXBjLmNbNF0gPSBvbjsKKworCXJldHVybiBpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9zZXRfbWVkaWFfbG9jayk7CisKK3ZvaWQgaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQoreworCWlkZV9pbml0X3BjKHBjKTsKKwlwYy0+Y1swXSA9IFJFUVVFU1RfU0VOU0U7CisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5KSB7CisJCXBjLT5jWzRdID0gMjU1OworCQlwYy0+cmVxX3hmZXIgPSAxODsKKwl9IGVsc2UgeworCQlwYy0+Y1s0XSA9IDIwOworCQlwYy0+cmVxX3hmZXIgPSAyMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kKTsKKworLyoKKyAqIENhbGxlZCB3aGVuIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBkdXJpbmcgdGhlIGxhc3QgcGFja2V0IGNvbW1hbmQuCisgKiBXZSBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgcGFja2V0IGNvbW1hbmQgaW4gdGhlIGhlYWQgb2YgdGhlIHJlcXVlc3QgbGlzdC4KKyAqLwordm9pZCBpZGVfcmV0cnlfcGMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSAmZHJpdmUtPnJlcXVlc3Rfc2Vuc2VfcnE7CisJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMgPSAmZHJpdmUtPnJlcXVlc3Rfc2Vuc2VfcGM7CisKKwkodm9pZClpZGVfcmVhZF9lcnJvcihkcml2ZSk7CisJaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChkcml2ZSwgcGMpOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX3RhcGUpCisJCXNldF9iaXQoSURFX0FGTEFHX0lHTk9SRV9EU0MsICZkcml2ZS0+YXRhcGlfZmxhZ3MpOworCWlkZV9xdWV1ZV9wY19oZWFkKGRyaXZlLCBkaXNrLCBwYywgcnEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JldHJ5X3BjKTsKKworaW50IGlkZV9zY3NpX2V4cGlyeShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMgPSBkcml2ZS0+cGM7CisKKwlkZWJ1Z19sb2coIiVzIGNhbGxlZCBmb3IgJWx1IGF0ICVsdVxuIiwgX19mdW5jX18sCisJCSAgcGMtPnNjc2lfY21kLT5zZXJpYWxfbnVtYmVyLCBqaWZmaWVzKTsKKworCXBjLT5mbGFncyB8PSBQQ19GTEFHX1RJTUVET1VUOworCisJcmV0dXJuIDA7IC8qIHdlIGRvIG5vdCB3YW50IHRoZSBJREUgc3Vic3lzdGVtIHRvIHJldHJ5ICovCit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfc2NzaV9leHBpcnkpOworCisvKgorICogVGhpcyBpcyB0aGUgdXN1YWwgaW50ZXJydXB0IGhhbmRsZXIgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGEgcGFja2V0CisgKiBjb21tYW5kLiAgV2Ugd2lsbCB0cmFuc2ZlciBzb21lIG9mIHRoZSBkYXRhIChhcyByZXF1ZXN0ZWQgYnkgdGhlIGRyaXZlKQorICogYW5kIHdpbGwgcmUtcG9pbnQgaW50ZXJydXB0IGhhbmRsZXIgdG8gdXMuCisgKi8KK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX3BjX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJpdmUtPnBjOwogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKLQl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpZGVfZXhwaXJ5X3QgKmV4cGlyeTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCwgdGVtcDsKIAl1MTYgYmNvdW50OwotCXU4IHN0YXQsIGlyZWFzb24sIHNjc2kgPSBkcml2ZS0+c2NzaTsKKwl1OCBzdGF0LCBpcmVhc29uLCBzY3NpID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TQ1NJKSwgZHNjID0gMDsKIAogCWRlYnVnX2xvZygiRW50ZXIgJXMgLSBpbnRlcnJ1cHQgaGFuZGxlclxuIiwgX19mdW5jX18pOwogCisJaWYgKHNjc2kpIHsKKwkJdGltZW91dCA9IGlkZV9zY3NpX2dldF90aW1lb3V0KHBjKTsKKwkJZXhwaXJ5ID0gaWRlX3Njc2lfZXhwaXJ5OworCX0gZWxzZSB7CisJCXRpbWVvdXQgPSAoZHJpdmUtPm1lZGlhID09IGlkZV9mbG9wcHkpID8gV0FJVF9GTE9QUFlfQ01ECisJCQkJCQkgICAgICAgOiBXQUlUX1RBUEVfQ01EOworCQlleHBpcnkgPSBOVUxMOworCX0KKwogCWlmIChwYy0+ZmxhZ3MgJiBQQ19GTEFHX1RJTUVET1VUKSB7Ci0JCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSk7CisJCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgMCk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKQEAgLTQxLDcgKzI4NCw3IEBACiAKIAlpZiAocGMtPmZsYWdzICYgUENfRkxBR19ETUFfSU5fUFJPR1JFU1MpIHsKIAkJaWYgKGh3aWYtPmRtYV9vcHMtPmRtYV9lbmQoZHJpdmUpIHx8Ci0JCSAgICAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmICFzY3NpICYmIChzdGF0ICYgRVJSX1NUQVQpKSkgeworCQkgICAgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSAmJiAhc2NzaSAmJiAoc3RhdCAmIEFUQV9FUlIpKSkgewogCQkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5ICYmICFzY3NpKQogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSAlcyBlcnJvclxuIiwKIAkJCQkJZHJpdmUtPm5hbWUsIHJxX2RhdGFfZGlyKHBjLT5ycSkKQEAgLTQ5LDE0ICsyOTIsMTQgQEAKIAkJCXBjLT5mbGFncyB8PSBQQ19GTEFHX0RNQV9FUlJPUjsKIAkJfSBlbHNlIHsKIAkJCXBjLT54ZmVycmVkID0gcGMtPnJlcV94ZmVyOwotCQkJaWYgKHVwZGF0ZV9idWZmZXJzKQotCQkJCXVwZGF0ZV9idWZmZXJzKGRyaXZlLCBwYyk7CisJCQlpZiAoZHJpdmUtPnBjX3VwZGF0ZV9idWZmZXJzKQorCQkJCWRyaXZlLT5wY191cGRhdGVfYnVmZmVycyhkcml2ZSwgcGMpOwogCQl9CiAJCWRlYnVnX2xvZygiJXM6IERNQSBmaW5pc2hlZFxuIiwgZHJpdmUtPm5hbWUpOwogCX0KIAogCS8qIE5vIG1vcmUgaW50ZXJydXB0cyAqLwotCWlmICgoc3RhdCAmIERSUV9TVEFUKSA9PSAwKSB7CisJaWYgKChzdGF0ICYgQVRBX0RSUSkgPT0gMCkgewogCQlkZWJ1Z19sb2coIlBhY2tldCBjb21tYW5kIGNvbXBsZXRlZCwgJWQgYnl0ZXMgdHJhbnNmZXJyZWRcbiIsCiAJCQkgIHBjLT54ZmVycmVkKTsKIApAQCAtNjUsMTAgKzMwOCwxMCBAQAogCQlsb2NhbF9pcnFfZW5hYmxlX2luX2hhcmRpcnEoKTsKIAogCQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmICFzY3NpICYmCi0JCSAgICAoc3RhdCAmIEVSUl9TVEFUKSAmJiBycS0+Y21kWzBdID09IFJFUVVFU1RfU0VOU0UpCi0JCQlzdGF0ICY9IH5FUlJfU1RBVDsKKwkJICAgIChzdGF0ICYgQVRBX0VSUikgJiYgcnEtPmNtZFswXSA9PSBSRVFVRVNUX1NFTlNFKQorCQkJc3RhdCAmPSB+QVRBX0VSUjsKIAotCQlpZiAoKHN0YXQgJiBFUlJfU1RBVCkgfHwgKHBjLT5mbGFncyAmIFBDX0ZMQUdfRE1BX0VSUk9SKSkgeworCQlpZiAoKHN0YXQgJiBBVEFfRVJSKSB8fCAocGMtPmZsYWdzICYgUENfRkxBR19ETUFfRVJST1IpKSB7CiAJCQkvKiBFcnJvciBkZXRlY3RlZCAqLwogCQkJZGVidWdfbG9nKCIlczogSS9PIGVycm9yXG4iLCBkcml2ZS0+bmFtZSk7CiAKQEAgLTg3LDIxICszMzAsMTkgQEAKIAkJCWRlYnVnX2xvZygiW2NtZCAleF06IGNoZWNrIGNvbmRpdGlvblxuIiwgcnEtPmNtZFswXSk7CiAKIAkJCS8qIFJldHJ5IG9wZXJhdGlvbiAqLwotCQkJcmV0cnlfcGMoZHJpdmUpOworCQkJaWRlX3JldHJ5X3BjKGRyaXZlLCBycS0+cnFfZGlzayk7CiAKIAkJCS8qIHF1ZXVlZCwgYnV0IG5vdCBzdGFydGVkICovCiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJCX0KIGNtZF9maW5pc2hlZDoKIAkJcGMtPmVycm9yID0gMDsKLQkJaWYgKChwYy0+ZmxhZ3MgJiBQQ19GTEFHX1dBSVRfRk9SX0RTQykgJiYKLQkJICAgIChzdGF0ICYgU0VFS19TVEFUKSA9PSAwKSB7Ci0JCQlkc2NfaGFuZGxlKGRyaXZlKTsKLQkJCXJldHVybiBpZGVfc3RvcHBlZDsKLQkJfQorCisJCWlmICgocGMtPmZsYWdzICYgUENfRkxBR19XQUlUX0ZPUl9EU0MpICYmIChzdGF0ICYgQVRBX0RTQykgPT0gMCkKKwkJCWRzYyA9IDE7CiAKIAkJLyogQ29tbWFuZCBmaW5pc2hlZCAtIENhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0JCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSk7CisJCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgZHNjKTsKIAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQpAQCAtMTE3LDE3ICszNTgsMTggQEAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBvbiB0aGlzIGludGVycnVwdC4gKi8KIAlpZGVfcmVhZF9iY291bnRfYW5kX2lyZWFzb24oZHJpdmUsICZiY291bnQsICZpcmVhc29uKTsKIAotCWlmIChpcmVhc29uICYgQ0QpIHsKKwlpZiAoaXJlYXNvbiAmIEFUQVBJX0NPRCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb0QgIT0gMCBpbiAlc1xuIiwgZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CiAJfQogCi0JaWYgKCgoaXJlYXNvbiAmIElPKSA9PSBJTykgPT0gISEocGMtPmZsYWdzICYgUENfRkxBR19XUklUSU5HKSkgeworCWlmICgoKGlyZWFzb24gJiBBVEFQSV9JTykgPT0gQVRBUElfSU8pID09CisJCSEhKHBjLT5mbGFncyAmIFBDX0ZMQUdfV1JJVElORykpIHsKIAkJLyogSG9wZWZ1bGx5LCB3ZSB3aWxsIG5ldmVyIGdldCBoZXJlICovCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IFdlIHdhbnRlZCB0byAlcywgYnV0IHRoZSBkZXZpY2Ugd2FudHMgdXMgIgogCQkJCSJ0byAlcyFcbiIsIGRyaXZlLT5uYW1lLAotCQkJCShpcmVhc29uICYgSU8pID8gIldyaXRlIiA6ICJSZWFkIiwKLQkJCQkoaXJlYXNvbiAmIElPKSA/ICJSZWFkIiA6ICJXcml0ZSIpOworCQkJCShpcmVhc29uICYgQVRBUElfSU8pID8gIldyaXRlIiA6ICJSZWFkIiwKKwkJCQkoaXJlYXNvbiAmIEFUQVBJX0lPKSA/ICJSZWFkIiA6ICJXcml0ZSIpOwogCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKIAl9CiAKQEAgLTE0Niw3ICszODgsOCBAQAogCQkJCQl0ZW1wID0gMDsKIAkJCQlpZiAodGVtcCkgewogCQkJCQlpZiAocGMtPnNnKQotCQkJCQkJaW9fYnVmZmVycyhkcml2ZSwgcGMsIHRlbXAsIDApOworCQkJCQkJZHJpdmUtPnBjX2lvX2J1ZmZlcnMoZHJpdmUsIHBjLAorCQkJCQkJCQkgICAgIHRlbXAsIDApOwogCQkJCQllbHNlCiAJCQkJCQl0cF9vcHMtPmlucHV0X2RhdGEoZHJpdmUsIE5VTEwsCiAJCQkJCQkJcGMtPmN1cl9wb3MsIHRlbXApOwpAQCAtMTU4LDkgKzQwMSw3IEBACiAJCQkJcGMtPnhmZXJyZWQgKz0gdGVtcDsKIAkJCQlwYy0+Y3VyX3BvcyArPSB0ZW1wOwogCQkJCWlkZV9wYWRfdHJhbnNmZXIoZHJpdmUsIDAsIGJjb3VudCAtIHRlbXApOwotCQkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwKLQkJCQkJCWV4cGlyeSk7Ci0JCQkJcmV0dXJuIGlkZV9zdGFydGVkOworCQkJCWdvdG8gbmV4dF9pcnE7CiAJCQl9CiAJCQlkZWJ1Z19sb2coIlRoZSBkZXZpY2Ugd2FudHMgdG8gc2VuZCB1cyBtb3JlIGRhdGEgdGhhbiAiCiAJCQkJICAiZXhwZWN0ZWQgLSBhbGxvd2luZyB0cmFuc2ZlclxuIik7CkBAIC0xNzEsOSArNDEyLDE0IEBACiAKIAlpZiAoKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5ICYmICFzY3NpICYmICFwYy0+YnVmKSB8fAogCSAgICAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmICFzY3NpICYmIHBjLT5iaCkgfHwKLQkgICAgKHNjc2kgJiYgcGMtPnNnKSkKLQkJaW9fYnVmZmVycyhkcml2ZSwgcGMsIGJjb3VudCwgISEocGMtPmZsYWdzICYgUENfRkxBR19XUklUSU5HKSk7Ci0JZWxzZQorCSAgICAoc2NzaSAmJiBwYy0+c2cpKSB7CisJCWludCBkb25lID0gZHJpdmUtPnBjX2lvX2J1ZmZlcnMoZHJpdmUsIHBjLCBiY291bnQsCisJCQkJICAhIShwYy0+ZmxhZ3MgJiBQQ19GTEFHX1dSSVRJTkcpKTsKKworCQkvKiBGSVhNRTogZG9uJ3QgZG8gcGFydGlhbCBjb21wbGV0aW9ucyAqLworCQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9mbG9wcHkgJiYgIXNjc2kpCisJCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDEsIGRvbmUgPj4gOSk7CisJfSBlbHNlCiAJCXhmZXJmdW5jKGRyaXZlLCBOVUxMLCBwYy0+Y3VyX3BvcywgYmNvdW50KTsKIAogCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiAqLwpAQCAtMTgyLDEyICs0MjgsMTEgQEAKIAogCWRlYnVnX2xvZygiW2NtZCAleF0gdHJhbnNmZXJyZWQgJWQgYnl0ZXMgb24gdGhhdCBpbnRyLlxuIiwKIAkJICBycS0+Y21kWzBdLCBiY291bnQpOwotCituZXh0X2lycToKIAkvKiBBbmQgc2V0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhZ2FpbiAqLwotCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwgZXhwaXJ5KTsKKwlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGlkZV9wY19pbnRyLCB0aW1lb3V0LCBleHBpcnkpOwogCXJldHVybiBpZGVfc3RhcnRlZDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9wY19pbnRyKTsKIAogc3RhdGljIHU4IGlkZV9yZWFkX2lyZWFzb24oaWRlX2RyaXZlX3QgKmRyaXZlKQogewpAQCAtMjA1LDcgKzQ1MCw4IEBACiB7CiAJaW50IHJldHJpZXMgPSAxMDA7CiAKLQl3aGlsZSAocmV0cmllcy0tICYmICgoaXJlYXNvbiAmIENEKSA9PSAwIHx8IChpcmVhc29uICYgSU8pKSkgeworCXdoaWxlIChyZXRyaWVzLS0gJiYgKChpcmVhc29uICYgQVRBUElfQ09EKSA9PSAwIHx8CisJCShpcmVhc29uICYgQVRBUElfSU8pKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAoSU8sQ29EICE9ICgwLDEpIHdoaWxlIGlzc3VpbmcgIgogCQkJCSJhIHBhY2tldCBjb21tYW5kLCByZXRyeWluZ1xuIiwgZHJpdmUtPm5hbWUpOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTIxNCw0MSArNDYwLDcxIEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAoSU8sQ29EICE9ICgwLDEpIHdoaWxlIGlzc3VpbmcgIgogCQkJCQkiYSBwYWNrZXQgY29tbWFuZCwgaWdub3JpbmdcbiIsCiAJCQkJCWRyaXZlLT5uYW1lKTsKLQkJCWlyZWFzb24gfD0gQ0Q7Ci0JCQlpcmVhc29uICY9IH5JTzsKKwkJCWlyZWFzb24gfD0gQVRBUElfQ09EOworCQkJaXJlYXNvbiAmPSB+QVRBUElfSU87CiAJCX0KIAl9CiAKIAlyZXR1cm4gaXJlYXNvbjsKIH0KIAotaWRlX3N0YXJ0c3RvcF90IGlkZV90cmFuc2Zlcl9wYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQkJCWlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsIHVuc2lnbmVkIGludCB0aW1lb3V0LAotCQkJCWlkZV9leHBpcnlfdCAqZXhwaXJ5KQorc3RhdGljIGludCBpZGVfZGVsYXllZF90cmFuc2Zlcl9wYyhpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CisJLyogU2VuZCB0aGUgYWN0dWFsIHBhY2tldCAqLworCWRyaXZlLT5od2lmLT50cF9vcHMtPm91dHB1dF9kYXRhKGRyaXZlLCBOVUxMLCBkcml2ZS0+cGMtPmMsIDEyKTsKKworCS8qIFRpbWVvdXQgZm9yIHRoZSBwYWNrZXQgY29tbWFuZCAqLworCXJldHVybiBXQUlUX0ZMT1BQWV9DTUQ7Cit9CisKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX3RyYW5zZmVyX3BjKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IGRyaXZlLT5wYzsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJaWRlX2V4cGlyeV90ICpleHBpcnk7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKIAl1OCBpcmVhc29uOwogCi0JaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIERSUV9TVEFULCBCVVNZX1NUQVQsIFdBSVRfUkVBRFkpKSB7CisJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIEFUQV9EUlEsIEFUQV9CVVNZLCBXQUlUX1JFQURZKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTdHJhbmdlLCBwYWNrZXQgY29tbWFuZCBpbml0aWF0ZWQgeWV0ICIKIAkJCQkiRFJRIGlzbid0IGFzc2VydGVkXG4iLCBkcml2ZS0+bmFtZSk7CiAJCXJldHVybiBzdGFydHN0b3A7CiAJfQogCiAJaXJlYXNvbiA9IGlkZV9yZWFkX2lyZWFzb24oZHJpdmUpOwotCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX3RhcGUgJiYgIWRyaXZlLT5zY3NpKQorCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX3RhcGUgJiYKKwkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0NTSSkgPT0gMCkKIAkJaXJlYXNvbiA9IGlkZV93YWl0X2lyZWFzb24oZHJpdmUsIGlyZWFzb24pOwogCi0JaWYgKChpcmVhc29uICYgQ0QpID09IDAgfHwgKGlyZWFzb24gJiBJTykpIHsKKwlpZiAoKGlyZWFzb24gJiBBVEFQSV9DT0QpID09IDAgfHwgKGlyZWFzb24gJiBBVEFQSV9JTykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogKElPLENvRCkgIT0gKDAsMSkgd2hpbGUgaXNzdWluZyAiCiAJCQkJImEgcGFja2V0IGNvbW1hbmRcbiIsIGRyaXZlLT5uYW1lKTsKIAkJcmV0dXJuIGlkZV9kb19yZXNldChkcml2ZSk7CiAJfQogCisJLyoKKwkgKiBJZiBuZWNlc3Nhcnkgc2NoZWR1bGUgdGhlIHBhY2tldCB0cmFuc2ZlciB0byBvY2N1ciAndGltZW91dCcKKwkgKiBtaWxpc2Vjb25kcyBsYXRlciBpbiBpZGVfZGVsYXllZF90cmFuc2Zlcl9wYygpIGFmdGVyIHRoZSBkZXZpY2UKKwkgKiBzYXlzIGl0J3MgcmVhZHkgZm9yIGEgcGFja2V0LgorCSAqLworCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfWklQX0RSSVZFKSB7CisJCXRpbWVvdXQgPSBkcml2ZS0+cGNfZGVsYXk7CisJCWV4cGlyeSA9ICZpZGVfZGVsYXllZF90cmFuc2Zlcl9wYzsKKwl9IGVsc2UgeworCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TQ1NJKSB7CisJCQl0aW1lb3V0ID0gaWRlX3Njc2lfZ2V0X3RpbWVvdXQocGMpOworCQkJZXhwaXJ5ID0gaWRlX3Njc2lfZXhwaXJ5OworCQl9IGVsc2UgeworCQkJdGltZW91dCA9IChkcml2ZS0+bWVkaWEgPT0gaWRlX2Zsb3BweSkgPyBXQUlUX0ZMT1BQWV9DTUQKKwkJCQkJCQkgICAgICAgOiBXQUlUX1RBUEVfQ01EOworCQkJZXhwaXJ5ID0gTlVMTDsKKwkJfQorCX0KKwogCS8qIFNldCB0aGUgaW50ZXJydXB0IHJvdXRpbmUgKi8KLQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGhhbmRsZXIsIHRpbWVvdXQsIGV4cGlyeSk7CisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCBpZGVfcGNfaW50ciwgdGltZW91dCwgZXhwaXJ5KTsKIAogCS8qIEJlZ2luIERNQSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHBjLT5mbGFncyAmIFBDX0ZMQUdfRE1BX09LKSB7CkBAIC0yNjIsMjIgKzUzOCwyMiBAQAogCiAJcmV0dXJuIGlkZV9zdGFydGVkOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3RyYW5zZmVyX3BjKTsKIAotaWRlX3N0YXJ0c3RvcF90IGlkZV9pc3N1ZV9wYyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQkJICAgICBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLCB1bnNpZ25lZCBpbnQgdGltZW91dCwKK2lkZV9zdGFydHN0b3BfdCBpZGVfaXNzdWVfcGMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdGltZW91dCwKIAkJCSAgICAgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7CisJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMgPSBkcml2ZS0+cGM7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXUzMiB0Zl9mbGFnczsKIAl1MTYgYmNvdW50OwotCXU4IGRtYSA9IDA7CisJdTggc2NzaSA9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0NTSSk7CiAKIAkvKiBXZSBoYXZlbid0IHRyYW5zZmVycmVkIGFueSBkYXRhIHlldCAqLwogCXBjLT54ZmVycmVkID0gMDsKIAlwYy0+Y3VyX3BvcyA9IHBjLT5idWY7CiAKIAkvKiBSZXF1ZXN0IHRvIHRyYW5zZmVyIHRoZSBlbnRpcmUgYnVmZmVyIGF0IG9uY2UgKi8KLQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmICFkcml2ZS0+c2NzaSkKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlICYmIHNjc2kgPT0gMCkKIAkJYmNvdW50ID0gcGMtPnJlcV94ZmVyOwogCWVsc2UKIAkJYmNvdW50ID0gbWluKHBjLT5yZXFfeGZlciwgNjMgKiAxMDI0KTsKQEAgLTI4NywyOCArNTYzLDM1IEBACiAJCWlkZV9kbWFfb2ZmKGRyaXZlKTsKIAl9CiAKLQlpZiAoKHBjLT5mbGFncyAmIFBDX0ZMQUdfRE1BX09LKSAmJiBkcml2ZS0+dXNpbmdfZG1hKSB7Ci0JCWlmIChkcml2ZS0+c2NzaSkKKwlpZiAoKHBjLT5mbGFncyAmIFBDX0ZMQUdfRE1BX09LKSAmJgorCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpKSB7CisJCWlmIChzY3NpKQogCQkJaHdpZi0+c2dfbWFwcGVkID0gMTsKLQkJZG1hID0gIWh3aWYtPmRtYV9vcHMtPmRtYV9zZXR1cChkcml2ZSk7Ci0JCWlmIChkcml2ZS0+c2NzaSkKKwkJZHJpdmUtPmRtYSA9ICFod2lmLT5kbWFfb3BzLT5kbWFfc2V0dXAoZHJpdmUpOworCQlpZiAoc2NzaSkKIAkJCWh3aWYtPnNnX21hcHBlZCA9IDA7CiAJfQogCi0JaWYgKCFkbWEpCisJaWYgKCFkcml2ZS0+ZG1hKQogCQlwYy0+ZmxhZ3MgJj0gflBDX0ZMQUdfRE1BX09LOwogCi0JaWRlX3BrdGNtZF90Zl9sb2FkKGRyaXZlLCBkcml2ZS0+c2NzaSA/IDAgOiBJREVfVEZMQUdfT1VUX0RFVklDRSwKLQkJCSAgIGJjb3VudCwgZG1hKTsKKwlpZiAoc2NzaSkKKwkJdGZfZmxhZ3MgPSAwOworCWVsc2UgaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfY2Ryb20gfHwgZHJpdmUtPm1lZGlhID09IGlkZV9vcHRpY2FsKQorCQl0Zl9mbGFncyA9IElERV9URkxBR19PVVRfTlNFQ1QgfCBJREVfVEZMQUdfT1VUX0xCQUw7CisJZWxzZQorCQl0Zl9mbGFncyA9IElERV9URkxBR19PVVRfREVWSUNFOworCisJaWRlX3BrdGNtZF90Zl9sb2FkKGRyaXZlLCB0Zl9mbGFncywgYmNvdW50LCBkcml2ZS0+ZG1hKTsKIAogCS8qIElzc3VlIHRoZSBwYWNrZXQgY29tbWFuZCAqLwogCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCkgewotCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBXSU5fUEFDS0VUQ01ELCBoYW5kbGVyLAorCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBBVEFfQ01EX1BBQ0tFVCwgaWRlX3RyYW5zZmVyX3BjLAogCQkJCSAgICB0aW1lb3V0LCBOVUxMKTsKIAkJcmV0dXJuIGlkZV9zdGFydGVkOwogCX0gZWxzZSB7CiAJCWlkZV9leGVjdXRlX3BrdF9jbWQoZHJpdmUpOwotCQlyZXR1cm4gKCpoYW5kbGVyKShkcml2ZSk7CisJCXJldHVybiBpZGVfdHJhbnNmZXJfcGMoZHJpdmUpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9pc3N1ZV9wYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCmluZGV4IGYxNDg5OTkuLjMzMDhiMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5jCkBAIC0yMyw2ICsyMyw5IEBACiAgKglEb2N1bWVudGF0aW9uL2lkZS9DaGFuZ2VMb2cuaWRlLWNkLjE5OTQtMjAwNAogICovCiAKKyNkZWZpbmUgRFJWX05BTUUgImlkZS1jZCIKKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKwogI2RlZmluZSBJREVDRF9WRVJTSU9OICI1LjAwIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01MCwxMyArNTMsMTYgQEAKIAogI2luY2x1ZGUgImlkZS1jZC5oIgogCisjZGVmaW5lIElERUNEX0RFQlVHX0xPRwkJMQorCisjaWYgSURFQ0RfREVCVUdfTE9HCisjZGVmaW5lIGlkZV9kZWJ1Z19sb2cobHZsLCBmbXQsIGFyZ3MuLi4pIF9faWRlX2RlYnVnX2xvZyhsdmwsIGZtdCwgYXJncykKKyNlbHNlCisjZGVmaW5lIGlkZV9kZWJ1Z19sb2cobHZsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBERUZJTkVfTVVURVgoaWRlY2RfcmVmX211dGV4KTsKIAotI2RlZmluZSB0b19pZGVfY2Qob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2Ryb21faW5mbywga3JlZikKLQotI2RlZmluZSBpZGVfY2RfZyhkaXNrKSBcCi0JY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgY2Ryb21faW5mbywgZHJpdmVyKQotCiBzdGF0aWMgdm9pZCBpZGVfY2RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqKTsKIAogc3RhdGljIHN0cnVjdCBjZHJvbV9pbmZvICppZGVfY2RfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQpAQCAtNjQsNyArNzAsNyBAQAogCXN0cnVjdCBjZHJvbV9pbmZvICpjZCA9IE5VTEw7CiAKIAltdXRleF9sb2NrKCZpZGVjZF9yZWZfbXV0ZXgpOwotCWNkID0gaWRlX2NkX2coZGlzayk7CisJY2QgPSBpZGVfZHJ2X2coZGlzaywgY2Ryb21faW5mbyk7CiAJaWYgKGNkKSB7CiAJCWlmIChpZGVfZGV2aWNlX2dldChjZC0+ZHJpdmUpKQogCQkJY2QgPSBOVUxMOwpAQCAtMTAyLDYgKzEwOCw5IEBACiB7CiAJaW50IGxvZyA9IDA7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfU0VOU0UsICJDYWxsICVzLCBzZW5zZV9rZXk6IDB4JXhcbiIsIF9fZnVuY19fLAorCQkgICAgICBzZW5zZS0+c2Vuc2Vfa2V5KTsKKwogCWlmICghc2Vuc2UgfHwgIXJxIHx8IChycS0+Y21kX2ZsYWdzICYgUkVRX1FVSUVUKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTE1MCw2ICsxNTksMTQgQEAKIAl1bnNpZ25lZCBsb25nIGJpb19zZWN0b3JzOwogCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX1NFTlNFLCAiQ2FsbCAlcywgZXJyb3JfY29kZTogMHgleCwgIgorCQkJInNlbnNlX2tleTogMHgleFxuIiwgX19mdW5jX18sIHNlbnNlLT5lcnJvcl9jb2RlLAorCQkJc2Vuc2UtPnNlbnNlX2tleSk7CisKKwlpZiAoZmFpbGVkX2NvbW1hbmQpCisJCWlkZV9kZWJ1Z19sb2coSURFX0RCR19TRU5TRSwgIiVzOiBmYWlsZWQgY21kOiAweCV4XG4iLAorCQkJCV9fZnVuY19fLCBmYWlsZWRfY29tbWFuZC0+Y21kWzBdKTsKKwogCWlmICghY2Ryb21fbG9nX3NlbnNlKGRyaXZlLCBmYWlsZWRfY29tbWFuZCwgc2Vuc2UpKQogCQlyZXR1cm47CiAKQEAgLTIwMCw2ICsyMTcsOCBAQAogCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvCQk9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEJCT0gJmluZm8tPnJlcXVlc3Rfc2Vuc2VfcmVxdWVzdDsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19TRU5TRSwgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWlmIChzZW5zZSA9PSBOVUxMKQogCQlzZW5zZSA9ICZpbmZvLT5zZW5zZV9kYXRhOwogCkBAIC0yMTksNiArMjM4LDEwIEBACiAJLyogTk9URSEgU2F2ZSB0aGUgZmFpbGVkIGNvbW1hbmQgaW4gInJxLT5idWZmZXIiICovCiAJcnEtPmJ1ZmZlciA9ICh2b2lkICopIGZhaWxlZF9jb21tYW5kOwogCisJaWYgKGZhaWxlZF9jb21tYW5kKQorCQlpZGVfZGVidWdfbG9nKElERV9EQkdfU0VOU0UsICJmYWlsZWRfY21kOiAweCV4XG4iLAorCQkJICAgICAgZmFpbGVkX2NvbW1hbmQtPmNtZFswXSk7CisKIAlpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCBycSk7CiB9CiAKQEAgLTIyNyw2ICsyNTAsMTAgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CiAJaW50IG5zZWN0b3JzID0gcnEtPmhhcmRfY3VyX3NlY3RvcnM7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXMsIGNtZDogMHgleCwgdXB0b2RhdGU6IDB4JXgsICIKKwkJICAgICAgIm5zZWN0b3JzOiAlZFxuIiwgX19mdW5jX18sIHJxLT5jbWRbMF0sIHVwdG9kYXRlLAorCQkgICAgICBuc2VjdG9ycyk7CisKIAlpZiAoYmxrX3NlbnNlX3JlcXVlc3QocnEpICYmIHVwdG9kYXRlKSB7CiAJCS8qCiAJCSAqIEZvciBSRVFfVFlQRV9TRU5TRSwgInJxLT5idWZmZXIiIHBvaW50cyB0byB0aGUgb3JpZ2luYWwKQEAgLTI2OSw2ICsyOTYsOSBAQAogCWlmICghbnNlY3RvcnMpCiAJCW5zZWN0b3JzID0gMTsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiRXhpdCAlcywgdXB0b2RhdGU6IDB4JXgsIG5zZWN0b3JzOiAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHVwdG9kYXRlLCBuc2VjdG9ycyk7CisKIAlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIHVwdG9kYXRlLCBuc2VjdG9ycyk7CiB9CiAKQEAgLTMwNCwxMSArMzM0LDE1IEBACiAJc2Vuc2Vfa2V5ID0gZXJyID4+IDQ7CiAKIAlpZiAocnEgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNzaW5nIHJxIGluICVzXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogbWlzc2luZyBycSBpbiAlc1xuIiwKIAkJCQlkcml2ZS0+bmFtZSwgX19mdW5jX18pOwogCQlyZXR1cm4gMTsKIAl9CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUlEsICIlczogc3RhdDogMHgleCwgZ29vZF9zdGF0OiAweCV4LCAiCisJCSAgICAgICJycS0+Y21kX3R5cGU6IDB4JXgsIGVycjogMHgleFxuIiwgX19mdW5jX18sIHN0YXQsCisJCSAgICAgIGdvb2Rfc3RhdCwgcnEtPmNtZF90eXBlLCBlcnIpOworCiAJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHJxKSkgewogCQkvKgogCQkgKiBXZSBnb3QgYW4gZXJyb3IgdHJ5aW5nIHRvIGdldCBzZW5zZSBpbmZvIGZyb20gdGhlIGRyaXZlCkBAIC0zNzQsNyArNDA4LDggQEAKIAkJCQljZHJvbV9zYXdfbWVkaWFfY2hhbmdlKGRyaXZlKTsKIAogCQkJCS8qIGZhaWwgdGhlIHJlcXVlc3QgKi8KLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmF5IG9wZW5cbiIsIGRyaXZlLT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHJheSBvcGVuXG4iLAorCQkJCQkJZHJpdmUtPm5hbWUpOwogCQkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKIAkJCX0gZWxzZSB7CiAJCQkJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CkBAIC00MzYsNyArNDcxLDcgQEAKIAkJCWlkZV9kdW1wX3N0YXR1c19ub19zZW5zZShkcml2ZSwgIm1lZGlhIGVycm9yIChibGFuaykiLAogCQkJCQkJIHN0YXQpOwogCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwotCQl9IGVsc2UgaWYgKChlcnIgJiB+QUJSVF9FUlIpICE9IDApIHsKKwkJfSBlbHNlIGlmICgoZXJyICYgfkFUQV9BQk9SVEVEKSAhPSAwKSB7CiAJCQkvKiBnbyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyIGZvciBvdGhlciBlcnJvcnMgKi8KIAkJCWlkZV9lcnJvcihkcml2ZSwgImNkcm9tX2RlY29kZV9zdGF0dXMiLCBzdGF0KTsKIAkJCXJldHVybiAxOwpAQCAtNDU3LDEwICs0OTIsMTAgQEAKIAkJICogSWYgd2UgZ290IGEgQ0hFQ0tfQ09ORElUSU9OIHN0YXR1cywgcXVldWUKIAkJICogYSByZXF1ZXN0IHNlbnNlIGNvbW1hbmQuCiAJCSAqLwotCQlpZiAoc3RhdCAmIEVSUl9TVEFUKQorCQlpZiAoc3RhdCAmIEFUQV9FUlIpCiAJCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBOVUxMLCBOVUxMKTsKIAl9IGVsc2UgewotCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1jZDogYmFkIHJxIik7CisJCWJsa19kdW1wX3JxX2ZsYWdzKHJxLCBQRlggImJhZCBycSIpOwogCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CiAJfQogCkBAIC00NjgsNyArNTAzLDcgQEAKIAlyZXR1cm4gMTsKIAogZW5kX3JlcXVlc3Q6Ci0JaWYgKHN0YXQgJiBFUlJfU1RBVCkgeworCWlmIChzdGF0ICYgQVRBX0VSUikgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwpAQCAtNDg4LDYgKzUyMyw5IEBACiAJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOwogCXVuc2lnbmVkIGxvbmcgd2FpdCA9IDA7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUlEsICJDYWxsICVzOiBycS0+Y21kWzBdOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgcnEtPmNtZFswXSk7CisKIAkvKgogCSAqIFNvbWUgY29tbWFuZHMgYXJlICpzbG93KiBhbmQgbm9ybWFsbHkgdGFrZSBhIGxvbmcgdGltZSB0byBjb21wbGV0ZS4KIAkgKiBVc3VhbGx5IHdlIGNhbiB1c2UgdGhlIEFUQVBJICJkaXNjb25uZWN0IiB0byBieXBhc3MgdGhpcywgYnV0IG5vdCBhbGwKQEAgLTUwNCw3ICs1NDIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAoIShycS0+Y21kX2ZsYWdzICYgUkVRX1FVSUVUKSkKLQkJCXByaW50ayhLRVJOX0lORk8gImlkZS1jZDogY21kIDB4JXggdGltZWQgb3V0XG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNtZCAweCV4IHRpbWVkIG91dFxuIiwKIAkJCQkJIHJxLT5jbWRbMF0pOwogCQl3YWl0ID0gMDsKIAkJYnJlYWs7CkBAIC01MjQsMjQgKzU2MiwyNSBAQAogCQkJCQkJICBpbnQgeGZlcmxlbiwKIAkJCQkJCSAgaWRlX2hhbmRsZXJfdCAqaGFuZGxlcikKIHsKLQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICJDYWxsICVzLCB4ZmVybGVuOiAlZFxuIiwgX19mdW5jX18sIHhmZXJsZW4pOworCiAJLyogRklYTUU6IGZvciBWaXJ0dWFsIERNQSB3ZSBtdXN0IGNoZWNrIGhhcmRlciAqLwotCWlmIChpbmZvLT5kbWEpCi0JCWluZm8tPmRtYSA9ICFod2lmLT5kbWFfb3BzLT5kbWFfc2V0dXAoZHJpdmUpOworCWlmIChkcml2ZS0+ZG1hKQorCQlkcml2ZS0+ZG1hID0gIWh3aWYtPmRtYV9vcHMtPmRtYV9zZXR1cChkcml2ZSk7CiAKIAkvKiBzZXQgdXAgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCiAJaWRlX3BrdGNtZF90Zl9sb2FkKGRyaXZlLCBJREVfVEZMQUdfT1VUX05TRUNUIHwgSURFX1RGTEFHX09VVF9MQkFMLAotCQkJICAgeGZlcmxlbiwgaW5mby0+ZG1hKTsKKwkJCSAgIHhmZXJsZW4sIGRyaXZlLT5kbWEpOwogCiAJaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19EUlFfSU5URVJSVVBUKSB7CiAJCS8qIHdhaXRpbmcgZm9yIENEQiBpbnRlcnJ1cHQsIG5vdCBETUEgeWV0LiAqLwotCQlpZiAoaW5mby0+ZG1hKQorCQlpZiAoZHJpdmUtPmRtYSkKIAkJCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwogCiAJCS8qIHBhY2tldCBjb21tYW5kICovCi0JCWlkZV9leGVjdXRlX2NvbW1hbmQoZHJpdmUsIFdJTl9QQUNLRVRDTUQsIGhhbmRsZXIsCisJCWlkZV9leGVjdXRlX2NvbW1hbmQoZHJpdmUsIEFUQV9DTURfUEFDS0VULCBoYW5kbGVyLAogCQkJCSAgICBBVEFQSV9XQUlUX1BDLCBjZHJvbV90aW1lcl9leHBpcnkpOwogCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJfSBlbHNlIHsKQEAgLTU2NCw5ICs2MDMsMTAgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50IGNtZF9sZW47Ci0Jc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCkgewogCQkvKgogCQkgKiBIZXJlIHdlIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHJlY2VpdmluZyBhbiBpbnRlcnJ1cHQKQEAgLTU3NCwxNiArNjE0LDE2IEBACiAJCSAqLwogCiAJCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KLQkJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIERSUV9TVEFULCBOVUxMKSkKKwkJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIEFUQV9EUlEsIE5VTEwpKQogCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCiAJCS8qIG9rLCBuZXh0IGludGVycnVwdCB3aWxsIGJlIERNQSBpbnRlcnJ1cHQgKi8KLQkJaWYgKGluZm8tPmRtYSkKKwkJaWYgKGRyaXZlLT5kbWEpCiAJCQlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKIAl9IGVsc2UgewogCQkvKiBvdGhlcndpc2UsIHdlIG11c3Qgd2FpdCBmb3IgRFJRIHRvIGdldCBzZXQgKi8KLQkJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIERSUV9TVEFULAotCQkJCUJVU1lfU1RBVCwgV0FJVF9SRUFEWSkpCisJCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBBVEFfRFJRLAorCQkJCSAgQVRBX0JVU1ksIFdBSVRfUkVBRFkpKQogCQkJcmV0dXJuIHN0YXJ0c3RvcDsKIAl9CiAKQEAgLTU5OSw3ICs2MzksNyBAQAogCWh3aWYtPnRwX29wcy0+b3V0cHV0X2RhdGEoZHJpdmUsIE5VTEwsIHJxLT5jbWQsIGNtZF9sZW4pOwogCiAJLyogc3RhcnQgdGhlIERNQSBpZiBuZWVkIGJlICovCi0JaWYgKGluZm8tPmRtYSkKKwlpZiAoZHJpdmUtPmRtYSkKIAkJaHdpZi0+ZG1hX29wcy0+ZG1hX3N0YXJ0KGRyaXZlKTsKIAogCXJldHVybiBpZGVfc3RhcnRlZDsKQEAgLTYxNSw2ICs2NTUsOSBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlcywgaXJlYXNvbjogMHgleCwgcnc6IDB4JXhcbiIsCisJCSAgICAgIF9fZnVuY19fLCBpcmVhc29uLCBydyk7CisKIAkvKgogCSAqIGlyZWFzb24gPT0gMDogdGhlIGRyaXZlIHdhbnRzIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHVzCiAJICogaXJlYXNvbiA9PSAyOiB0aGUgZHJpdmUgaXMgZXhwZWN0aW5nIHRvIHRyYW5zZmVyIGRhdGEgdG8gdXMKQEAgLTYyNCw3ICs2NjcsNyBAQAogCWVsc2UgaWYgKGlyZWFzb24gPT0gKHJ3IDw8IDEpKSB7CiAKIAkJLyogd2hvb3BzLi4uICovCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiB3cm9uZyB0cmFuc2ZlciBkaXJlY3Rpb24hXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogJXM6IHdyb25nIHRyYW5zZmVyIGRpcmVjdGlvbiFcbiIsCiAJCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKIAogCQlpZGVfcGFkX3RyYW5zZmVyKGRyaXZlLCBydywgbGVuKTsKQEAgLTYzNyw3ICs2ODAsNyBAQAogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQkvKiBkcml2ZSB3YW50cyBhIGNvbW1hbmQgcGFja2V0LCBvciBpbnZhbGlkIGlyZWFzb24uLi4gKi8KLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGJhZCBpbnRlcnJ1cHQgcmVhc29uIDB4JTAyeFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6ICVzOiBiYWQgaW50ZXJydXB0IHJlYXNvbiAweCUwMnhcbiIsCiAJCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fLCBpcmVhc29uKTsKIAl9CiAKQEAgLTY1NCwxNyArNjk3LDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgaWRlX2NkX2NoZWNrX3RyYW5zZmVyX3NpemUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbGVuKQogeworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlcywgbGVuOiAlZFxuIiwgX19mdW5jX18sIGxlbik7CisKIAlpZiAoKGxlbiAlIFNFQ1RPUl9TSVpFKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBCYWQgdHJhbnNmZXIgc2l6ZSAlZFxuIiwKLQkJCWRyaXZlLT5uYW1lLCBfX2Z1bmNfXywgbGVuKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogJXM6IEJhZCB0cmFuc2ZlciBzaXplICVkXG4iLCBkcml2ZS0+bmFtZSwKKwkJCV9fZnVuY19fLCBsZW4pOwogCiAJaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19MSU1JVF9ORlJBTUVTKQotCQlwcmludGsoS0VSTl9FUlIgIiAgVGhpcyBkcml2ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5ICIKLQkJCQkidGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXJcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJUaGlzIGRyaXZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyAiCisJCQkJInZlcnNpb24gb2YgdGhlIGRyaXZlclxuIik7CiAJZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiICBUcnlpbmcgdG8gbGltaXQgdHJhbnNmZXIgc2l6ZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJUcnlpbmcgdG8gbGltaXQgdHJhbnNmZXIgc2l6ZXNcbiIpOwogCQlkcml2ZS0+YXRhcGlfZmxhZ3MgfD0gSURFX0FGTEFHX0xJTUlUX05GUkFNRVM7CiAJfQogCkBAIC02NzYsNiArNzIxLDkgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX2NkX3ByZXBhcmVfcndfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsCiAJCQkJCQkgc3RydWN0IHJlcXVlc3QgKnJxKQogeworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19SUSwgIkNhbGwgJXM6IHJxLT5jbWRfZmxhZ3M6IDB4JXhcbiIsIF9fZnVuY19fLAorCQkgICAgICBycS0+Y21kX2ZsYWdzKTsKKwogCWlmIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkgewogCQl1bnNpZ25lZCBzaG9ydCBzZWN0b3JzX3Blcl9mcmFtZSA9CiAJCQlxdWV1ZV9oYXJkc2VjdF9zaXplKGRyaXZlLT5xdWV1ZSkgPj4gU0VDVE9SX0JJVFM7CkBAIC02OTUsNyArNzQzLDcgQEAKIAkJCS8qIHNhbml0eSBjaGVjay4uLiAqLwogCQkJaWYgKHJxLT5jdXJyZW50X25yX3NlY3RvcnMgIT0KIAkJCSAgICBiaW9fY3VyX3NlY3RvcnMocnEtPmJpbykpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogYnVmZmVyIGJvdGNoICgldSlcbiIsCisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6ICVzOiBidWZmZXIgYm90Y2ggKCV1KVxuIiwKIAkJCQkJCWRyaXZlLT5uYW1lLCBfX2Z1bmNfXywKIAkJCQkJCXJxLT5jdXJyZW50X25yX3NlY3RvcnMpOwogCQkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKQEAgLTcwNCwxMSArNzUyLDcgQEAKIAkJCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgKz0gbnNraXA7CiAJCX0KIAl9Ci0jaWYgMAotCWVsc2UKLQkJLyogdGhlIGltbWVkaWF0ZSBiaXQgKi8KLQkJcnEtPmNtZFsxXSA9IDEgPDwgMzsKLSNlbmRpZgorCiAJLyogc2V0IHVwIHRoZSBjb21tYW5kICovCiAJcnEtPnRpbWVvdXQgPSBBVEFQSV9XQUlUX1BDOwogCkBAIC03MzksNiArNzgzLDggQEAKIAlpbnQgc3RhdDsKIAlzdGF0aWMgaW50IHJldHJ5ID0gMTA7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWlmIChjZHJvbV9kZWNvZGVfc3RhdHVzKGRyaXZlLCAwLCAmc3RhdCkpCiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIApAQCAtNzQ2LDcgKzc5Miw3IEBACiAKIAlpZiAocmV0cnkgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBpbmZvLT5zdGFydF9zZWVrICsgSURFQ0RfU0VFS19USU1FUikpIHsKIAkJaWYgKC0tcmV0cnkgPT0gMCkKLQkJCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7CiAJfQogCXJldHVybiBpZGVfc3RvcHBlZDsKIH0KQEAgLTc1NSw2ICs4MDEsOCBAQAogewogCXNlY3Rvcl90IGZyYW1lID0gcnEtPnNlY3RvcjsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOworCiAJc2VjdG9yX2RpdihmcmFtZSwgcXVldWVfaGFyZHNlY3Rfc2l6ZShkcml2ZS0+cXVldWUpID4+IFNFQ1RPUl9CSVRTKTsKIAogCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7CkBAIC03NzUsOCArODIzLDExIEBACiAgKiBGaXggdXAgYSBwb3NzaWJseSBwYXJ0aWFsbHktcHJvY2Vzc2VkIHJlcXVlc3Qgc28gdGhhdCB3ZSBjYW4gc3RhcnQgaXQgb3ZlcgogICogZW50aXJlbHksIG9yIGV2ZW4gcHV0IGl0IGJhY2sgb24gdGhlIHJlcXVlc3QgcXVldWUuCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3RvcmVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBpZGVfY2RfcmVzdG9yZV9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogeworCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAocnEtPmJ1ZmZlciAhPSBiaW9fZGF0YShycS0+YmlvKSkgewogCQlzZWN0b3JfdCBuID0KIAkJCShycS0+YnVmZmVyIC0gKGNoYXIgKiliaW9fZGF0YShycS0+YmlvKSkgLyBTRUNUT1JfU0laRTsKQEAgLTc5NSw4ICs4NDYsMTEgQEAKIC8qCiAgKiBBbGwgb3RoZXIgcGFja2V0IGNvbW1hbmRzLgogICovCi1zdGF0aWMgdm9pZCBpZGVfY2RfcmVxdWVzdF9zZW5zZV9maXh1cChzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBpZGVfY2RfcmVxdWVzdF9zZW5zZV9maXh1cChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKKworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOworCiAJLyoKIAkgKiBTb21lIG9mIHRoZSB0cmFpbGluZyByZXF1ZXN0IHNlbnNlIGZpZWxkcyBhcmUgb3B0aW9uYWwsCiAJICogYW5kIHNvbWUgZHJpdmVzIGRvbid0IHNlbmQgdGhlbS4gIFNpZ2guCkBAIC04MjIsNiArODc2LDEwIEBACiAJaWYgKCFzZW5zZSkKIAkJc2Vuc2UgPSAmbG9jYWxfc2Vuc2U7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICJDYWxsICVzLCBycS0+Y21kWzBdOiAweCV4LCB3cml0ZTogMHgleCwgIgorCQkgICAgICAidGltZW91dDogJWQsIGNtZF9mbGFnczogMHgleFxuIiwgX19mdW5jX18sIGNtZFswXSwgd3JpdGUsCisJCSAgICAgIHRpbWVvdXQsIGNtZF9mbGFncyk7CisKIAkvKiBzdGFydCBvZiByZXRyeSBsb29wICovCiAJZG8gewogCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7CkBAIC04OTUsNyArOTUzLDYgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fbmV3cGNfaW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKIAl4ZmVyX2Z1bmNfdCAqeGZlcmZ1bmM7CiAJaWRlX2V4cGlyeV90ICpleHBpcnkgPSBOVUxMOwpAQCAtOTA1LDEzICs5NjIsMTYgQEAKIAl1MTYgbGVuOwogCXU4IGlyZWFzb247CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICJDYWxsICVzLCBycS0+Y21kWzBdOiAweCV4LCB3cml0ZTogMHgleFxuIiwKKwkJICAgICAgX19mdW5jX18sIHJxLT5jbWRbMF0sIHdyaXRlKTsKKwogCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KLQlkbWEgPSBpbmZvLT5kbWE7CisJZG1hID0gZHJpdmUtPmRtYTsKIAlpZiAoZG1hKSB7Ci0JCWluZm8tPmRtYSA9IDA7CisJCWRyaXZlLT5kbWEgPSAwOwogCQlkbWFfZXJyb3IgPSBod2lmLT5kbWFfb3BzLT5kbWFfZW5kKGRyaXZlKTsKIAkJaWYgKGRtYV9lcnJvcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BICVzIGVycm9yXG4iLCBkcml2ZS0+bmFtZSwKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBETUEgJXMgZXJyb3JcbiIsIGRyaXZlLT5uYW1lLAogCQkJCQl3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIpOwogCQkJaWRlX2RtYV9vZmYoZHJpdmUpOwogCQl9CkBAIC05MzcsOCArOTk3LDExIEBACiAJaWYgKHRoaXNsZW4gPiBsZW4pCiAJCXRoaXNsZW4gPSBsZW47CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICIlczogRFJROiBzdGF0OiAweCV4LCB0aGlzbGVuOiAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHN0YXQsIHRoaXNsZW4pOworCiAJLyogSWYgRFJRIGlzIGNsZWFyLCB0aGUgY29tbWFuZCBoYXMgY29tcGxldGVkLiAqLwotCWlmICgoc3RhdCAmIERSUV9TVEFUKSA9PSAwKSB7CisJaWYgKChzdGF0ICYgQVRBX0RSUSkgPT0gMCkgewogCQlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CiAJCQkvKgogCQkJICogSWYgd2UncmUgbm90IGRvbmUgcmVhZGluZy93cml0aW5nLCBjb21wbGFpbi4KQEAgLTk0Niw3ICsxMDA5LDcgQEAKIAkJCSAqLwogCQkJdXB0b2RhdGUgPSAxOwogCQkJaWYgKHJxLT5jdXJyZW50X25yX3NlY3RvcnMgPiAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGRhdGEgdW5kZXJydW4gIgorCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiAlczogZGF0YSB1bmRlcnJ1biAiCiAJCQkJCQkiKCVkIGJsb2NrcylcbiIsCiAJCQkJCQlkcml2ZS0+bmFtZSwgX19mdW5jX18sCiAJCQkJCQlycS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKQEAgLTk1Nyw3ICsxMDIwLDcgQEAKIAkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSk7CiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJCX0gZWxzZSBpZiAoIWJsa19wY19yZXF1ZXN0KHJxKSkgewotCQkJaWRlX2NkX3JlcXVlc3Rfc2Vuc2VfZml4dXAocnEpOworCQkJaWRlX2NkX3JlcXVlc3Rfc2Vuc2VfZml4dXAoZHJpdmUsIHJxKTsKIAkJCS8qIGNvbXBsYWluIGlmIHdlIHN0aWxsIGhhdmUgZGF0YSBsZWZ0IHRvIHRyYW5zZmVyICovCiAJCQl1cHRvZGF0ZSA9IHJxLT5kYXRhX2xlbiA/IDAgOiAxOwogCQl9CkBAIC0xMDAwLDYgKzEwNjMsOSBAQAogCQl4ZmVyZnVuYyA9IGh3aWYtPnRwX29wcy0+aW5wdXRfZGF0YTsKIAl9CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUEMsICIlczogZGF0YSB0cmFuc2ZlciwgcnEtPmNtZF90eXBlOiAweCV4LCAiCisJCSAgICAgICJpcmVhc29uOiAweCV4XG4iLCBfX2Z1bmNfXywgcnEtPmNtZF90eXBlLCBpcmVhc29uKTsKKwogCS8qIHRyYW5zZmVyIGRhdGEgKi8KIAl3aGlsZSAodGhpc2xlbiA+IDApIHsKIAkJdTggKnB0ciA9IGJsa19mc19yZXF1ZXN0KHJxKSA/IE5VTEwgOiBycS0+ZGF0YTsKQEAgLTEwMjQsNyArMTA5MCw3IEBACiAJCQkJICovCiAJCQkJaWRlX3BhZF90cmFuc2Zlcihkcml2ZSwgMCwgdGhpc2xlbik7CiAJCQllbHNlIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb25mdXNlZCwgbWlzc2luZyBkYXRhXG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjb25mdXNlZCwgbWlzc2luZyBkYXRhXG4iLAogCQkJCQkJZHJpdmUtPm5hbWUpOwogCQkJCWJsa19kdW1wX3JxX2ZsYWdzKHJxLCBycV9kYXRhX2RpcihycSkKIAkJCQkJCSAgPyAiY2Ryb21fbmV3cGNfaW50ciwgd3JpdGUiCkBAIC0xMTExLDkgKzExNzcsMTIgQEAKIAl1bnNpZ25lZCBzaG9ydCBzZWN0b3JzX3Blcl9mcmFtZSA9CiAJCXF1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlKSA+PiBTRUNUT1JfQklUUzsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19SUSwgIkNhbGwgJXMsIHdyaXRlOiAweCV4LCBzZWNzX3Blcl9mcmFtZTogJXVcbiIsCisJCSAgICAgIF9fZnVuY19fLCB3cml0ZSwgc2VjdG9yc19wZXJfZnJhbWUpOworCiAJaWYgKHdyaXRlKSB7CiAJCS8qIGRpc2sgaGFzIGJlY29tZSB3cml0ZSBwcm90ZWN0ZWQgKi8KLQkJaWYgKGNkLT5kaXNrLT5wb2xpY3kpIHsKKwkJaWYgKGdldF9kaXNrX3JvKGNkLT5kaXNrKSkgewogCQkJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOwogCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCQl9CkBAIC0xMTIyLDcgKzExOTEsNyBAQAogCQkgKiBXZSBtYXkgYmUgcmV0cnlpbmcgdGhpcyByZXF1ZXN0IGFmdGVyIGFuIGVycm9yLiAgRml4IHVwIGFueQogCQkgKiB3ZWlyZG5lc3Mgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCBwYWNrZXQuCiAJCSAqLwotCQlyZXN0b3JlX3JlcXVlc3QocnEpOworCQlpZGVfY2RfcmVzdG9yZV9yZXF1ZXN0KGRyaXZlLCBycSk7CiAJfQogCiAJLyogdXNlIERNQSwgaWYgcG9zc2libGUgLyB3cml0ZXMgKm11c3QqIGJlIGhhcmR3YXJlIGZyYW1lIGFsaWduZWQgKi8KQEAgLTExMzIsOSArMTIwMSw5IEBACiAJCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJCX0KLQkJY2QtPmRtYSA9IDA7CisJCWRyaXZlLT5kbWEgPSAwOwogCX0gZWxzZQotCQljZC0+ZG1hID0gZHJpdmUtPnVzaW5nX2RtYTsKKwkJZHJpdmUtPmRtYSA9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKTsKIAogCWlmICh3cml0ZSkKIAkJY2QtPmRldmluZm8ubWVkaWFfd3JpdHRlbiA9IDE7CkBAIC0xMTUxLDI4ICsxMjIwLDI5IEBACiAKIHN0YXRpYyB2b2lkIGNkcm9tX2RvX2Jsb2NrX3BjKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX1BDLCAiQ2FsbCAlcywgcnEtPmNtZF90eXBlOiAweCV4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgcnEtPmNtZF90eXBlKTsKIAogCWlmIChibGtfcGNfcmVxdWVzdChycSkpCiAJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1FVSUVUOwogCWVsc2UKIAkJcnEtPmNtZF9mbGFncyAmPSB+UkVRX0ZBSUxFRDsKIAotCWluZm8tPmRtYSA9IDA7CisJZHJpdmUtPmRtYSA9IDA7CiAKIAkvKiBzZyByZXF1ZXN0ICovCiAJaWYgKHJxLT5iaW8gfHwgKChycS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfQVRBX1BDKSAmJiBycS0+ZGF0YV9sZW4pKSB7CiAJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZHJpdmUtPnF1ZXVlOwogCQl1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwotCQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhY2tfbWFzayA9IH4oVEhSRUFEX1NJWkUgLSAxKTsKKwkJY2hhciAqYnVmOwogCiAJCWlmIChycS0+YmlvKQotCQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWJpb19kYXRhKHJxLT5iaW8pOworCQkJYnVmID0gYmlvX2RhdGEocnEtPmJpbyk7CiAJCWVsc2UKLQkJCWFkZHIgPSAodW5zaWduZWQgbG9uZylycS0+ZGF0YTsKKwkJCWJ1ZiA9IHJxLT5kYXRhOwogCi0JCWluZm8tPmRtYSA9IGRyaXZlLT51c2luZ19kbWE7CisJCWRyaXZlLT5kbWEgPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSk7CiAKIAkJLyoKIAkJICogY2hlY2sgaWYgZG1hIGlzIHNhZmUKQEAgLTExODEsMTIgKzEyNTEsOSBAQAogCQkgKiBzZXBhcmF0ZSBtYXNrcy4KIAkJICovCiAJCWFsaWdubWVudCA9IHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkgfCBxLT5kbWFfcGFkX21hc2s7Ci0JCWlmIChhZGRyICYgYWxpZ25tZW50IHx8IHJxLT5kYXRhX2xlbiAmIGFsaWdubWVudCkKLQkJCWluZm8tPmRtYSA9IDA7Ci0KLQkJaWYgKCEoKGFkZHIgJiBzdGFja19tYXNrKSBeCi0JCSAgICAgICgodW5zaWduZWQgbG9uZyljdXJyZW50LT5zdGFjayAmIHN0YWNrX21hc2spKSkKLQkJCWluZm8tPmRtYSA9IDA7CisJCWlmICgodW5zaWduZWQgbG9uZylidWYgJiBhbGlnbm1lbnQgfHwgcnEtPmRhdGFfbGVuICYgYWxpZ25tZW50CisJCSAgICB8fCBvYmplY3RfaXNfb25fc3RhY2soYnVmKSkKKwkJCWRyaXZlLT5kbWEgPSAwOwogCX0KIH0KIApAQCAtMTIwMCwxOSArMTI2NywyMiBAQAogCWlkZV9oYW5kbGVyX3QgKmZuOwogCWludCB4ZmVybGVuOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX1JRLCAiQ2FsbCAlcywgcnEtPmNtZF90eXBlOiAweCV4LCBibG9jazogJWxsdVxuIiwKKwkJICAgICAgX19mdW5jX18sIHJxLT5jbWRfdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jayk7CisKIAlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CiAJCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfU0VFS0lORykgewogCQkJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCQkJdW5zaWduZWQgbG9uZyBlbGFwc2VkID0gamlmZmllcyAtIGluZm8tPnN0YXJ0X3NlZWs7CiAJCQlpbnQgc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQkJCWlmICgoc3RhdCAmIFNFRUtfU1RBVCkgIT0gU0VFS19TVEFUKSB7CisJCQlpZiAoKHN0YXQgJiBBVEFfRFNDKSAhPSBBVEFfRFNDKSB7CiAJCQkJaWYgKGVsYXBzZWQgPCBJREVDRF9TRUVLX1RJTUVPVVQpIHsKIAkJCQkJaWRlX3N0YWxsX3F1ZXVlKGRyaXZlLAogCQkJCQkJCUlERUNEX1NFRUtfVElNRVIpOwogCQkJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJCQkJfQotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERTQyB0aW1lb3V0XG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBEU0MgdGltZW91dFxuIiwKIAkJCQkJCWRyaXZlLT5uYW1lKTsKIAkJCX0KIAkJCWRyaXZlLT5hdGFwaV9mbGFncyAmPSB+SURFX0FGTEFHX1NFRUtJTkc7CkBAIC0xMjIwLDExICsxMjkwLDExIEBACiAJCWlmIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCAmJgogCQkgICAgSURFX0xBUkdFX1NFRUsoaW5mby0+bGFzdF9ibG9jaywgYmxvY2ssCiAJCQkgICAgSURFQ0RfU0VFS19USFJFU0hPTEQpICYmCi0JCSAgICBkcml2ZS0+ZHNjX292ZXJsYXApIHsKKwkJICAgIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0RTQ19PVkVSTEFQKSkgewogCQkJeGZlcmxlbiA9IDA7CiAJCQlmbiA9IGNkcm9tX3N0YXJ0X3NlZWtfY29udGludWF0aW9uOwogCi0JCQlpbmZvLT5kbWEgPSAwOworCQkJZHJpdmUtPmRtYSA9IDA7CiAJCQlpbmZvLT5zdGFydF9zZWVrID0gamlmZmllczsKIAogCQkJaWRlX2NkX3ByZXBhcmVfc2Vla19yZXF1ZXN0KGRyaXZlLCBycSk7CkBAIC0xMjUzLDcgKzEzMjMsNyBAQAogCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMSk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9IGVsc2UgewotCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1jZCBiYWQgZmxhZ3MiKTsKKwkJYmxrX2R1bXBfcnFfZmxhZ3MocnEsIERSVl9OQU1FICIgYmFkIGZsYWdzIik7CiAJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCX0KQEAgLTEyODMsNiArMTM1Myw4IEBACiAJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkgPSAmaW5mby0+ZGV2aW5mbzsKIAl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCW1lbXNldChjbWQsIDAsIEJMS19NQVhfQ0RCKTsKIAljbWRbMF0gPSBHUENNRF9URVNUX1VOSVRfUkVBRFk7CiAKQEAgLTEzMDksNiArMTM4MSw4IEBACiAJdW5zaWduZWQgbGVuID0gc2l6ZW9mKGNhcGJ1Zik7CiAJdTMyIGJsb2NrbGVuOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKIAltZW1zZXQoY21kLCAwLCBCTEtfTUFYX0NEQik7CiAJY21kWzBdID0gR1BDTURfUkVBRF9DRFZEX0NBUEFDSVRZOwogCkBAIC0xMzI4LDEwICsxNDAyLDEwIEBACiAJY2FzZSA0MDk2OgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3ZWlyZCBibG9jayBzaXplICV1XG4iLAotCQkJZHJpdmUtPm5hbWUsIGJsb2NrbGVuKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZGVmYXVsdCB0byAya2IgYmxvY2sgc2l6ZVxuIiwKLQkJCWRyaXZlLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHdlaXJkIGJsb2NrIHNpemUgJXVcbiIsCisJCQkJZHJpdmUtPm5hbWUsIGJsb2NrbGVuKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGRlZmF1bHQgdG8gMmtiIGJsb2NrIHNpemVcbiIsCisJCQkJZHJpdmUtPm5hbWUpOwogCQlibG9ja2xlbiA9IDIwNDg7CiAJCWJyZWFrOwogCX0KQEAgLTEzNDcsNiArMTQyMSw4IEBACiB7CiAJdW5zaWduZWQgY2hhciBjbWRbQkxLX01BWF9DREJdOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKIAltZW1zZXQoY21kLCAwLCBCTEtfTUFYX0NEQik7CiAKIAljbWRbMF0gPSBHUENNRF9SRUFEX1RPQ19QTUFfQVRJUDsKQEAgLTEzNzUsMTEgKzE0NTEsMTMgQEAKIAlsb25nIGxhc3Rfd3JpdHRlbjsKIAl1bnNpZ25lZCBsb25nIHNlY3RvcnNfcGVyX2ZyYW1lID0gU0VDVE9SU19QRVJfRlJBTUU7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWlmICh0b2MgPT0gTlVMTCkgewogCQkvKiB0cnkgdG8gYWxsb2NhdGUgc3BhY2UgKi8KIAkJdG9jID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0YXBpX3RvYyksIEdGUF9LRVJORUwpOwogCQlpZiAodG9jID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIGNkcm9tIFRPQyBidWZmZXIhXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE5vIGNkcm9tIFRPQyBidWZmZXIhXG4iLAogCQkJCQlkcml2ZS0+bmFtZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTUzNSw2ICsxNjEzLDggQEAKIAlzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgY2djOwogCWludCBzdGF0LCBhdHRlbXB0cyA9IDMsIHNpemUgPSBBVEFQSV9DQVBBQklMSVRJRVNfUEFHRV9TSVpFOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19GVUxMX0NBUFNfUEFHRSkgPT0gMCkKIAkJc2l6ZSAtPSBBVEFQSV9DQVBBQklMSVRJRVNfUEFHRV9QQURfU0laRTsKIApAQCAtMTU1Myw2ICsxNjMzLDggQEAKIAlzdHJ1Y3QgY2Ryb21faW5mbyAqY2QgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJdTE2IGN1cnNwZWVkLCBtYXhzcGVlZDsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOworCiAJaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19MRV9TUEVFRF9GSUVMRFMpIHsKIAkJY3Vyc3BlZWQgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZidWZbOCArIDE0XSk7CiAJCW1heHNwZWVkID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmYnVmWzggKyA4XSk7CkBAIC0xNTkzLDYgKzE2NzUsOCBAQAogCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqZGV2aW5mbyA9ICZpbmZvLT5kZXZpbmZvOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX1BST0JFLCAiQ2FsbCAlcywgbnNsb3RzOiAlZFxuIiwgX19mdW5jX18sIG5zbG90cyk7CisKIAlkZXZpbmZvLT5vcHMgPSAmaWRlX2Nkcm9tX2RvcHM7CiAJZGV2aW5mby0+c3BlZWQgPSBpbmZvLT5jdXJyZW50X3NwZWVkOwogCWRldmluZm8tPmNhcGFjaXR5ID0gbnNsb3RzOwpAQCAtMTYxNCwxMyArMTY5OCwxNyBAQAogCW1lY2h0eXBlX3QgbWVjaHR5cGU7CiAJaW50IG5zbG90cyA9IDE7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUFJPQkUsICJDYWxsICVzLCBkcml2ZS0+bWVkaWE6IDB4JXgsICIKKwkJICAgICAgImRyaXZlLT5hdGFwaV9mbGFnczogMHglbHhcbiIsIF9fZnVuY19fLCBkcml2ZS0+bWVkaWEsCisJCSAgICAgIGRyaXZlLT5hdGFwaV9mbGFncyk7CisKIAljZGktPm1hc2sgPSAoQ0RDX0NEX1IgfCBDRENfQ0RfUlcgfCBDRENfRFZEIHwgQ0RDX0RWRF9SIHwKIAkJICAgICBDRENfRFZEX1JBTSB8IENEQ19TRUxFQ1RfRElTQyB8IENEQ19QTEFZX0FVRElPIHwKIAkJICAgICBDRENfTU9fRFJJVkUgfCBDRENfUkFNKTsKIAogCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpIHsKIAkJY2RpLT5tYXNrICY9IH4oQ0RDX01PX0RSSVZFIHwgQ0RDX1JBTSk7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEFUQVBJIG1hZ25ldG8tb3B0aWNhbCBkcml2ZVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEFUQVBJIG1hZ25ldG8tb3B0aWNhbCBkcml2ZVxuIiwKIAkJCQlkcml2ZS0+bmFtZSk7CiAJCXJldHVybiBuc2xvdHM7CiAJfQpAQCAtMTY2MSw3ICsxNzQ5LDkgQEAKIAkJY2RpLT5tYXNrICY9IH5DRENfUExBWV9BVURJTzsKIAogCW1lY2h0eXBlID0gYnVmWzggKyA2XSA+PiA1OwotCWlmIChtZWNodHlwZSA9PSBtZWNodHlwZV9jYWRkeSB8fCBtZWNodHlwZSA9PSBtZWNodHlwZV9wb3B1cCkKKwlpZiAobWVjaHR5cGUgPT0gbWVjaHR5cGVfY2FkZHkgfHwKKwkgICAgbWVjaHR5cGUgPT0gbWVjaHR5cGVfcG9wdXAgfHwKKwkgICAgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19OT19BVVRPQ0xPU0UpKQogCQljZGktPm1hc2sgfD0gQ0RDX0NMT1NFX1RSQVk7CiAKIAlpZiAoY2RpLT5zYW55b19zbG90ID4gMCkgewpAQCAtMTY3Niw3ICsxNzY2LDcgQEAKIAogCWlkZV9jZHJvbV91cGRhdGVfc3BlZWQoZHJpdmUsIGJ1Zik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogQVRBUEkiLCBkcml2ZS0+bmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBBVEFQSSIsIGRyaXZlLT5uYW1lKTsKIAogCS8qIGRvbid0IHByaW50IHNwZWVkIGlmIHRoZSBkcml2ZSByZXBvcnRlZCAwICovCiAJaWYgKGNkLT5tYXhfc3BlZWQpCkBAIC0xNjk5LDcgKzE3ODksOCBAQAogCWVsc2UKIAkJcHJpbnRrKEtFUk5fQ09OVCAiIGRyaXZlIik7CiAKLQlwcmludGsoS0VSTl9DT05UICIsICVka0IgQ2FjaGVcbiIsIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJmJ1Zls4ICsgMTJdKSk7CisJcHJpbnRrKEtFUk5fQ09OVCAiLCAlZGtCIENhY2hlXG4iLAorCQkJIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJmJ1Zls4ICsgMTJdKSk7CiAKIAlyZXR1cm4gbnNsb3RzOwogfQpAQCAtMTgxMSwxMyArMTkwMiwxMiBAQAogCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9CiB9OwogCi1zdGF0aWMgdm9pZCBpZGVfY2Ryb21fYWRkX3NldHRpbmdzKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJkc2Nfb3ZlcmxhcCIsIFNFVFRJTkdfUlcsIFRZUEVfQllURSwgMCwgMSwgMSwgMSwKLQkJCSZkcml2ZS0+ZHNjX292ZXJsYXAsIE5VTEwpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfY2Ryb21fYWRkX3NldHRpbmdzKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KK2lkZV9kZXZzZXRfcndfZmxhZyhkc2Nfb3ZlcmxhcCwgSURFX0RGTEFHX0RTQ19PVkVSTEFQKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcHJvY19kZXZzZXQgaWRlY2Rfc2V0dGluZ3NbXSA9IHsKKwlJREVfUFJPQ19ERVZTRVQoZHNjX292ZXJsYXAsIDAsIDEpLAorCXsgMCB9LAorfTsKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNkX2xpc3RfZW50cnkgaWRlX2NkX3F1aXJrc19saXN0W10gPSB7CkBAIC0xODU5LDE3ICsxOTQ5LDE5IEBACiAJeyAiTUFUU0hJVEFEVkQtUk9NIFNSLTgxNzYiLCBOVUxMLCAgIElERV9BRkxBR19QTEFZX0FVRElPX09LCSAgICAgfSwKIAl7ICJNQVRTSElUQURWRC1ST00gU1ItODE3NCIsIE5VTEwsICAgSURFX0FGTEFHX1BMQVlfQVVESU9fT0sJICAgICB9LAogCXsgIk9wdGlhcmMgRFZEIFJXIEFELTUyMDBBIiwgTlVMTCwgICBJREVfQUZMQUdfUExBWV9BVURJT19PSwkgICAgIH0sCisJeyAiT3B0aWFyYyBEVkQgUlcgQUQtNzIwMEEiLCBOVUxMLCAgIElERV9BRkxBR19QTEFZX0FVRElPX09LCSAgICAgfSwKKwl7ICJPcHRpYXJjIERWRCBSVyBBRC03NTQzQSIsIE5VTEwsICAgSURFX0FGTEFHX05PX0FVVE9DTE9TRQkgICAgIH0sCiAJeyBOVUxMLCBOVUxMLCAwIH0KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaWRlX2NkX2ZsYWdzKHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWRlX2NkX2ZsYWdzKHUxNiAqaWQpCiB7CiAJY29uc3Qgc3RydWN0IGNkX2xpc3RfZW50cnkgKmNsZSA9IGlkZV9jZF9xdWlya3NfbGlzdDsKIAogCXdoaWxlIChjbGUtPmlkX21vZGVsKSB7Ci0JCWlmIChzdHJjbXAoY2xlLT5pZF9tb2RlbCwgaWQtPm1vZGVsKSA9PSAwICYmCisJCWlmIChzdHJjbXAoY2xlLT5pZF9tb2RlbCwgKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdKSA9PSAwICYmCiAJCSAgICAoY2xlLT5pZF9maXJtd2FyZSA9PSBOVUxMIHx8Ci0JCSAgICAgc3Ryc3RyKGlkLT5md19yZXYsIGNsZS0+aWRfZmlybXdhcmUpKSkKKwkJICAgICBzdHJzdHIoKGNoYXIgKikmaWRbQVRBX0lEX0ZXX1JFVl0sIGNsZS0+aWRfZmlybXdhcmUpKSkKIAkJCXJldHVybiBjbGUtPmNkX2ZsYWdzOwogCQljbGUrKzsKIAl9CkBAIC0xODgxLDkgKzE5NzMsMTIgQEAKIHsKIAlzdHJ1Y3QgY2Ryb21faW5mbyAqY2QgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkgPSAmY2QtPmRldmluZm87Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisJY2hhciAqZndfcmV2ID0gKGNoYXIgKikmaWRbQVRBX0lEX0ZXX1JFVl07CiAJaW50IG5zbG90czsKIAorCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QUk9CRSwgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWJsa19xdWV1ZV9wcmVwX3JxKGRyaXZlLT5xdWV1ZSwgaWRlX2Nkcm9tX3ByZXBfZm4pOwogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KGRyaXZlLT5xdWV1ZSwgMzEpOwogCWJsa19xdWV1ZV91cGRhdGVfZG1hX3BhZChkcml2ZS0+cXVldWUsIDE1KTsKQEAgLTE4OTEsMjAgKzE5ODYsMTUgQEAKIAlpZiAoIWRyaXZlLT5xdWV1ZS0+dW5wbHVnX2RlbGF5KQogCQlkcml2ZS0+cXVldWUtPnVucGx1Z19kZWxheSA9IDE7CiAKLQlkcml2ZS0+c3BlY2lhbC5hbGwJPSAwOwotCiAJZHJpdmUtPmF0YXBpX2ZsYWdzID0gSURFX0FGTEFHX01FRElBX0NIQU5HRUQgfCBJREVfQUZMQUdfTk9fRUpFQ1QgfAogCQkgICAgICAgaWRlX2NkX2ZsYWdzKGlkKTsKIAotCWlmICgoaWQtPmNvbmZpZyAmIDB4MDA2MCkgPT0gMHgyMCkKLQkJZHJpdmUtPmF0YXBpX2ZsYWdzIHw9IElERV9BRkxBR19EUlFfSU5URVJSVVBUOwotCiAJaWYgKChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfVkVSVE9TXzMwMF9TU0QpICYmCi0JICAgIGlkLT5md19yZXZbNF0gPT0gJzEnICYmIGlkLT5md19yZXZbNl0gPD0gJzInKQorCSAgICBmd19yZXZbNF0gPT0gJzEnICYmIGZ3X3Jldls2XSA8PSAnMicpCiAJCWRyaXZlLT5hdGFwaV9mbGFncyB8PSAoSURFX0FGTEFHX1RPQ1RSQUNLU19BU19CQ0QgfAogCQkJCSAgICAgSURFX0FGTEFHX1RPQ0FERFJfQVNfQkNEKTsKIAllbHNlIGlmICgoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX1ZFUlRPU182MDBfRVNEKSAmJgotCQkgaWQtPmZ3X3Jldls0XSA9PSAnMScgJiYgaWQtPmZ3X3Jldls2XSA8PSAnMicpCisJCSBmd19yZXZbNF0gPT0gJzEnICYmIGZ3X3Jldls2XSA8PSAnMicpCiAJCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfVE9DVFJBQ0tTX0FTX0JDRDsKIAllbHNlIGlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfU0FOWU9fM0NEKQogCQkvKiAzID0+IHVzZSBDRCBpbiBzbG90IDAgKi8KQEAgLTE5MTUsMTUgKzIwMDUsMTkgQEAKIAkvKiBzZXQgY29ycmVjdCBibG9jayBzaXplICovCiAJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlLCBDRF9GUkFNRVNJWkUpOwogCi0JZHJpdmUtPmRzY19vdmVybGFwID0gKGRyaXZlLT5uZXh0ICE9IGRyaXZlKTsKKwlpZiAoZHJpdmUtPm5leHQgIT0gZHJpdmUpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0RTQ19PVkVSTEFQOworCWVsc2UKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RTQ19PVkVSTEFQOwogCiAJaWYgKGlkZV9jZHJvbV9yZWdpc3Rlcihkcml2ZSwgbnNsb3RzKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggdGhlIgorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogJXMgZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIHRoZSIKIAkJCQkiIGNkcm9tIGRyaXZlci5cbiIsIGRyaXZlLT5uYW1lLCBfX2Z1bmNfXyk7CiAJCWNkLT5kZXZpbmZvLmhhbmRsZSA9IE5VTEw7CiAJCXJldHVybiAxOwogCX0KLQlpZGVfY2Ryb21fYWRkX3NldHRpbmdzKGRyaXZlKTsKKworCWlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihkcml2ZSwgY2QtPmRyaXZlcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MzEsOSArMjAyNSwxMCBAQAogewogCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CisKIAlpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihkcml2ZSwgaW5mby0+ZHJpdmVyKTsKIAotCWJsa191bnJlZ2lzdGVyX2ZpbHRlcihpbmZvLT5kaXNrKTsKIAlkZWxfZ2VuZGlzayhpbmZvLT5kaXNrKTsKIAogCWlkZV9jZF9wdXQoaW5mbyk7CkBAIC0xOTQxLDE1ICsyMDM2LDE3IEBACiAKIHN0YXRpYyB2b2lkIGlkZV9jZF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogewotCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gdG9faWRlX2NkKGtyZWYpOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gdG9faWRlX2RydihrcmVmLCBjZHJvbV9pbmZvKTsKIAlzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmRldmluZm8gPSAmaW5mby0+ZGV2aW5mbzsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBpbmZvLT5kcml2ZTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGluZm8tPmRpc2s7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWtmcmVlKGluZm8tPnRvYyk7CiAJaWYgKGRldmluZm8tPmhhbmRsZSA9PSBkcml2ZSkKIAkJdW5yZWdpc3Rlcl9jZHJvbShkZXZpbmZvKTsKLQlkcml2ZS0+ZHNjX292ZXJsYXAgPSAwOworCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19EU0NfT1ZFUkxBUDsKIAlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWJsa19xdWV1ZV9wcmVwX3JxKGRyaXZlLT5xdWV1ZSwgTlVMTCk7CiAJZy0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKQEAgLTE5NjgsMTMgKzIwNjUsMTIgQEAKIAkucHJvYmUJCQk9IGlkZV9jZF9wcm9iZSwKIAkucmVtb3ZlCQkJPSBpZGVfY2RfcmVtb3ZlLAogCS52ZXJzaW9uCQk9IElERUNEX1ZFUlNJT04sCi0JLm1lZGlhCQkJPSBpZGVfY2Ryb20sCi0JLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMSwKIAkuZG9fcmVxdWVzdAkJPSBpZGVfY2RfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRlX2VuZF9yZXF1ZXN0LAogCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2MJCQk9IGlkZWNkX3Byb2MsCisJLnNldHRpbmdzCQk9IGlkZWNkX3NldHRpbmdzLAogI2VuZGlmCiB9OwogCkBAIC0xOTk5LDcgKzIwOTUsNyBAQAogc3RhdGljIGludCBpZGVjZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKLQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGlkZV9jZF9nKGRpc2spOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gaWRlX2Rydl9nKGRpc2ssIGNkcm9tX2luZm8pOwogCiAJY2Ryb21fcmVsZWFzZSgmaW5mby0+ZGV2aW5mbywgZmlsZSk7CiAKQEAgLTIwNTEsNyArMjE0Nyw3IEBACiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKLQlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGlkZV9jZF9nKGJkZXYtPmJkX2Rpc2spOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gaWRlX2Rydl9nKGJkZXYtPmJkX2Rpc2ssIGNkcm9tX2luZm8pOwogCWludCBlcnI7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMjA3MiwxMyArMjE2OCwxMyBAQAogCiBzdGF0aWMgaW50IGlkZWNkX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0Jc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBpZGVfY2RfZyhkaXNrKTsKKwlzdHJ1Y3QgY2Ryb21faW5mbyAqaW5mbyA9IGlkZV9kcnZfZyhkaXNrLCBjZHJvbV9pbmZvKTsKIAlyZXR1cm4gY2Ryb21fbWVkaWFfY2hhbmdlZCgmaW5mby0+ZGV2aW5mbyk7CiB9CiAKIHN0YXRpYyBpbnQgaWRlY2RfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewotCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gaWRlX2NkX2coZGlzayk7CisJc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBpZGVfZHJ2X2coZGlzaywgY2Ryb21faW5mbyk7CiAJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CiAKIAlpZGVfY2RfcmVhZF90b2MoaW5mby0+ZHJpdmUsICZzZW5zZSk7CkBAIC0yMDk3LDggKzIxOTMsMTEgQEAKIAogLyogbW9kdWxlIG9wdGlvbnMgKi8KIHN0YXRpYyBjaGFyICppZ25vcmU7Ci0KIG1vZHVsZV9wYXJhbShpZ25vcmUsIGNoYXJwLCAwNDAwKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVidWdfbWFzazsKK21vZHVsZV9wYXJhbShkZWJ1Z19tYXNrLCB1bG9uZywgMDY0NCk7CisKIE1PRFVMRV9ERVNDUklQVElPTigiQVRBUEkgQ0QtUk9NIERyaXZlciIpOwogCiBzdGF0aWMgaW50IGlkZV9jZF9wcm9iZShpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC0yMTA3LDIzICsyMjA2LDMwIEBACiAJc3RydWN0IGdlbmRpc2sgKmc7CiAJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2U7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfUFJPQkUsICJDYWxsICVzLCBkcml2ZS0+ZHJpdmVyX3JlcTogJXMsICIKKwkJICAgICAgImRyaXZlLT5tZWRpYTogMHgleFxuIiwgX19mdW5jX18sIGRyaXZlLT5kcml2ZXJfcmVxLAorCQkgICAgICBkcml2ZS0+bWVkaWEpOworCiAJaWYgKCFzdHJzdHIoImlkZS1jZHJvbSIsIGRyaXZlLT5kcml2ZXJfcmVxKSkKIAkJZ290byBmYWlsZWQ7Ci0JaWYgKCFkcml2ZS0+cHJlc2VudCkKLQkJZ290byBmYWlsZWQ7CisKIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9jZHJvbSAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX29wdGljYWwpCiAJCWdvdG8gZmFpbGVkOworCiAJLyogc2tpcCBkcml2ZXMgdGhhdCB3ZSB3ZXJlIHRvbGQgdG8gaWdub3JlICovCiAJaWYgKGlnbm9yZSAhPSBOVUxMKSB7CiAJCWlmIChzdHJzdHIoaWdub3JlLCBkcml2ZS0+bmFtZSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImlkZS1jZDogaWdub3JpbmcgZHJpdmUgJXNcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaWdub3JpbmcgZHJpdmUgJXNcbiIsCiAJCQkJCSBkcml2ZS0+bmFtZSk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KKworCWRyaXZlLT5kZWJ1Z19tYXNrID0gZGVidWdfbWFzazsKKwogCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2Ryb21faW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChpbmZvID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgYWxsb2NhdGUgYSBjZHJvbSBzdHJ1Y3R1cmVcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBDYW4ndCBhbGxvY2F0ZSBhIGNkcm9tIHN0cnVjdHVyZVxuIiwKIAkJCQlkcml2ZS0+bmFtZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTIxMzQsOCArMjI0MCw2IEBACiAKIAlpZGVfaW5pdF9kaXNrKGcsIGRyaXZlKTsKIAotCWlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihkcml2ZSwgJmlkZV9jZHJvbV9kcml2ZXIpOwotCiAJa3JlZl9pbml0KCZpbmZvLT5rcmVmKTsKIAogCWluZm8tPmRyaXZlID0gZHJpdmU7CkBAIC0yMTUwLDcgKzIyNTQsNiBAQAogCWctPmRyaXZlcmZzX2RldiA9ICZkcml2ZS0+Z2VuZGV2OwogCWctPmZsYWdzID0gR0VOSERfRkxfQ0QgfCBHRU5IRF9GTF9SRU1PVkFCTEU7CiAJaWYgKGlkZV9jZHJvbV9zZXR1cChkcml2ZSkpIHsKLQkJaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsICZpZGVfY2Ryb21fZHJpdmVyKTsKIAkJaWRlX2NkX3JlbGVhc2UoJmluZm8tPmtyZWYpOwogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC0yMTU5LDcgKzIyNjIsNiBAQAogCWctPmZvcHMgPSAmaWRlY2Rfb3BzOwogCWctPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKIAlhZGRfZGlzayhnKTsKLQlibGtfcmVnaXN0ZXJfZmlsdGVyKGcpOwogCXJldHVybiAwOwogCiBvdXRfZnJlZV9jZDoKQEAgLTIxNzUsNiArMjI3Nyw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlkZV9jZHJvbV9pbml0KHZvaWQpCiB7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiIGRyaXZlciAiIElERUNEX1ZFUlNJT04gIlxuIik7CiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaWRlX2Nkcm9tX2RyaXZlci5nZW5fZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmggYi9kcml2ZXJzL2lkZS9pZGUtY2QuaAppbmRleCA2MWE0NTk5Li41ODgyYjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuaApAQCAtODgsNyArODgsNiBAQAogCXN0cnVjdCByZXF1ZXN0X3NlbnNlIHNlbnNlX2RhdGE7CiAKIAlzdHJ1Y3QgcmVxdWVzdCByZXF1ZXN0X3NlbnNlX3JlcXVlc3Q7Ci0JaW50IGRtYTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfYmxvY2s7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9zZWVrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwppbmRleCAwN2VmODhiLi4zODUzYmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKQEAgLTMwLDEwICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLQotI2RlZmluZSBfSURFX0RJU0sKLQogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDEsMjEgKzM5LDE4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKLXN0cnVjdCBpZGVfZGlza19vYmogewotCWlkZV9kcml2ZV90CSpkcml2ZTsKLQlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKLQlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKLQlzdHJ1Y3Qga3JlZglrcmVmOwotCXVuc2lnbmVkIGludAlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KLX07CisjaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUKQorI2RlZmluZSBJREVfRElTS19NSU5PUlMJCSgxIDw8IFBBUlROX0JJVFMpCisjZWxzZQorI2RlZmluZSBJREVfRElTS19NSU5PUlMJCTAKKyNlbmRpZgorCisjaW5jbHVkZSAiaWRlLWRpc2suaCIKIAogc3RhdGljIERFRklORV9NVVRFWChpZGVkaXNrX3JlZl9tdXRleCk7CiAKICNkZWZpbmUgdG9faWRlX2Rpc2sob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgaWRlX2Rpc2tfb2JqLCBrcmVmKQogCi0jZGVmaW5lIGlkZV9kaXNrX2coZGlzaykgXAotCWNvbnRhaW5lcl9vZigoZGlzayktPnByaXZhdGVfZGF0YSwgc3RydWN0IGlkZV9kaXNrX29iaiwgZHJpdmVyKQotCiBzdGF0aWMgdm9pZCBpZGVfZGlza19yZWxlYXNlKHN0cnVjdCBrcmVmICopOwogCiBzdGF0aWMgc3RydWN0IGlkZV9kaXNrX29iaiAqaWRlX2Rpc2tfZ2V0KHN0cnVjdCBnZW5kaXNrICpkaXNrKQpAQCAtODQsNjggKzc5LDE5IEBACiAJbXV0ZXhfdW5sb2NrKCZpZGVkaXNrX3JlZl9tdXRleCk7CiB9CiAKLS8qCi0gKiBsYmFfY2FwYWNpdHlfaXNfb2soKSBwZXJmb3JtcyBhIHNhbml0eSBjaGVjayBvbiB0aGUgY2xhaW1lZCAibGJhX2NhcGFjaXR5IgotICogdmFsdWUgZm9yIHRoaXMgZHJpdmUgKGZyb20gaXRzIHJlcG9ydGVkIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uKS4KLSAqCi0gKiBSZXR1cm5zOgkxIGlmIGxiYV9jYXBhY2l0eSBsb29rcyBzZW5zaWJsZQotICoJCTAgb3RoZXJ3aXNlCi0gKgotICogSXQgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBkcml2ZS4KLSAqLwotc3RhdGljIGludCBsYmFfY2FwYWNpdHlfaXNfb2soc3RydWN0IGhkX2RyaXZlaWQgKmlkKQotewotCXVuc2lnbmVkIGxvbmcgbGJhX3NlY3RzLCBjaHNfc2VjdHMsIGhlYWQsIHRhaWw7Ci0KLQkvKiBObyBub24tTEJBIGluZm8gLi4gc28gdmFsaWQhICovCi0JaWYgKGlkLT5jeWxzID09IDApCi0JCXJldHVybiAxOwotCi0JLyoKLQkgKiBUaGUgQVRBIHNwZWMgdGVsbHMgbGFyZ2UgZHJpdmVzIHRvIHJldHVybgotCSAqIEMvSC9TID0gMTYzODMvMTYvNjMgaW5kZXBlbmRlbnQgb2YgdGhlaXIgc2l6ZS4KLQkgKiBTb21lIGRyaXZlcyBjYW4gYmUganVtcGVyZWQgdG8gdXNlIDE1IGhlYWRzIGluc3RlYWQgb2YgMTYuCi0JICogU29tZSBkcml2ZXMgY2FuIGJlIGp1bXBlcmVkIHRvIHVzZSA0MDkyIGN5bHMgaW5zdGVhZCBvZiAxNjM4My4KLQkgKi8KLQlpZiAoKGlkLT5jeWxzID09IDE2MzgzCi0JICAgICB8fCAoaWQtPmN5bHMgPT0gNDA5MiAmJiBpZC0+Y3VyX2N5bHMgPT0gMTYzODMpKSAmJgotCSAgICBpZC0+c2VjdG9ycyA9PSA2MyAmJgotCSAgICAoaWQtPmhlYWRzID09IDE1IHx8IGlkLT5oZWFkcyA9PSAxNikgJiYKLQkgICAgKGlkLT5sYmFfY2FwYWNpdHkgPj0gMTYzODMqNjMqaWQtPmhlYWRzKSkKLQkJcmV0dXJuIDE7Ci0KLQlsYmFfc2VjdHMgICA9IGlkLT5sYmFfY2FwYWNpdHk7Ci0JY2hzX3NlY3RzICAgPSBpZC0+Y3lscyAqIGlkLT5oZWFkcyAqIGlkLT5zZWN0b3JzOwotCi0JLyogcGVyZm9ybSBhIHJvdWdoIHNhbml0eSBjaGVjayBvbiBsYmFfc2VjdHM6ICB3aXRoaW4gMTAlIGlzIE9LICovCi0JaWYgKChsYmFfc2VjdHMgLSBjaHNfc2VjdHMpIDwgY2hzX3NlY3RzLzEwKQotCQlyZXR1cm4gMTsKLQotCS8qIHNvbWUgZHJpdmVzIGhhdmUgdGhlIHdvcmQgb3JkZXIgcmV2ZXJzZWQgKi8KLQloZWFkID0gKChsYmFfc2VjdHMgPj4gMTYpICYgMHhmZmZmKTsKLQl0YWlsID0gKGxiYV9zZWN0cyAmIDB4ZmZmZik7Ci0JbGJhX3NlY3RzID0gKGhlYWQgfCAodGFpbCA8PCAxNikpOwotCWlmICgobGJhX3NlY3RzIC0gY2hzX3NlY3RzKSA8IGNoc19zZWN0cy8xMCkgewotCQlpZC0+bGJhX2NhcGFjaXR5ID0gbGJhX3NlY3RzOwotCQlyZXR1cm4gMTsJLyogbGJhX2NhcGFjaXR5IGlzIChub3cpIGdvb2QgKi8KLQl9Ci0KLQlyZXR1cm4gMDsJLyogbGJhX2NhcGFjaXR5IHZhbHVlIG1heSBiZSBiYWQgKi8KLX0KLQogc3RhdGljIGNvbnN0IHU4IGlkZV9yd19jbWRzW10gPSB7Ci0JV0lOX01VTFRSRUFELAotCVdJTl9NVUxUV1JJVEUsCi0JV0lOX01VTFRSRUFEX0VYVCwKLQlXSU5fTVVMVFdSSVRFX0VYVCwKLQlXSU5fUkVBRCwKLQlXSU5fV1JJVEUsCi0JV0lOX1JFQURfRVhULAotCVdJTl9XUklURV9FWFQsCi0JV0lOX1JFQURETUEsCi0JV0lOX1dSSVRFRE1BLAotCVdJTl9SRUFERE1BX0VYVCwKLQlXSU5fV1JJVEVETUFfRVhULAorCUFUQV9DTURfUkVBRF9NVUxUSSwKKwlBVEFfQ01EX1dSSVRFX01VTFRJLAorCUFUQV9DTURfUkVBRF9NVUxUSV9FWFQsCisJQVRBX0NNRF9XUklURV9NVUxUSV9FWFQsCisJQVRBX0NNRF9QSU9fUkVBRCwKKwlBVEFfQ01EX1BJT19XUklURSwKKwlBVEFfQ01EX1BJT19SRUFEX0VYVCwKKwlBVEFfQ01EX1BJT19XUklURV9FWFQsCisJQVRBX0NNRF9SRUFELAorCUFUQV9DTURfV1JJVEUsCisJQVRBX0NNRF9SRUFEX0VYVCwKKwlBVEFfQ01EX1dSSVRFX0VYVCwKIH07CiAKIHN0YXRpYyBjb25zdCB1OCBpZGVfZGF0YV9waGFzZXNbXSA9IHsKQEAgLTE4NSw5ICsxMzEsOSBAQAogCQkJCQlzZWN0b3JfdCBibG9jaykKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JdW5zaWduZWQgaW50IGRtYQk9IGRyaXZlLT51c2luZ19kbWE7CiAJdTE2IG5zZWN0b3JzCQk9ICh1MTYpcnEtPm5yX3NlY3RvcnM7Ci0JdTggbGJhNDgJCT0gKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpID8gMSA6IDA7CisJdTggbGJhNDgJCT0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCk7CisJdTggZG1hCQkJPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSk7CiAJaWRlX3Rhc2tfdAkJdGFzazsKIAlzdHJ1Y3QgaWRlX3Rhc2tmaWxlCSp0ZiA9ICZ0YXNrLnRmOwogCWlkZV9zdGFydHN0b3BfdAkJcmM7CkBAIC0yMDcsNyArMTUzLDcgQEAKIAltZW1zZXQoJnRhc2ssIDAsIHNpemVvZih0YXNrKSk7CiAJdGFzay50Zl9mbGFncyA9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7CiAKLQlpZiAoZHJpdmUtPnNlbGVjdC5iLmxiYSkgeworCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQSkgewogCQlpZiAobGJhNDgpIHsKIAkJCXByX2RlYnVnKCIlczogTEJBPTB4JTAxMmxseFxuIiwgZHJpdmUtPm5hbWUsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spOwpAQCAtMjMyLDYgKzE3OCw4IEBACiAJCQl0Zi0+bGJhaCAgID0gYmxvY2sgPj49IDg7CiAJCQl0Zi0+ZGV2aWNlID0gKGJsb2NrID4+IDgpICYgMHhmOwogCQl9CisKKwkJdGYtPmRldmljZSB8PSBBVEFfTEJBOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGludCBzZWN0LCBoZWFkLCBjeWwsIHRyYWNrOwogCkBAIC0yODIsNyArMjMwLDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CiAKLQlCVUdfT04oZHJpdmUtPmJsb2NrZWQpOworCUJVR19PTihkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0JMT0NLRUQpOwogCiAJaWYgKCFibGtfZnNfcmVxdWVzdChycSkpIHsKIAkJYmxrX2R1bXBfcnFfZmxhZ3MocnEsICJpZGVfZG9fcndfZGlzayAtIGJhZCBjb21tYW5kIik7CkBAIC0zMTYsOSArMjY0LDkgQEAKIAkvKiBDcmVhdGUgSURFL0FUQSBjb21tYW5kIHJlcXVlc3Qgc3RydWN0dXJlICovCiAJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOwogCWlmIChsYmE0OCkKLQkJdGYtPmNvbW1hbmQgPSBXSU5fUkVBRF9OQVRJVkVfTUFYX0VYVDsKKwkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX1JFQURfTkFUSVZFX01BWF9FWFQ7CiAJZWxzZQotCQl0Zi0+Y29tbWFuZCA9IFdJTl9SRUFEX05BVElWRV9NQVg7CisJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9SRUFEX05BVElWRV9NQVg7CiAJdGYtPmRldmljZSAgPSBBVEFfTEJBOwogCWFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwogCWlmIChsYmE0OCkKQEAgLTM1MywxMCArMzAxLDEwIEBACiAJCXRmLT5ob2JfbGJhbCA9IChhZGRyX3JlcSA+Pj0gOCkgJiAweGZmOwogCQl0Zi0+aG9iX2xiYW0gPSAoYWRkcl9yZXEgPj49IDgpICYgMHhmZjsKIAkJdGYtPmhvYl9sYmFoID0gKGFkZHJfcmVxID4+PSA4KSAmIDB4ZmY7Ci0JCXRmLT5jb21tYW5kICA9IFdJTl9TRVRfTUFYX0VYVDsKKwkJdGYtPmNvbW1hbmQgID0gQVRBX0NNRF9TRVRfTUFYX0VYVDsKIAl9IGVsc2UgewogCQl0Zi0+ZGV2aWNlICAgPSAoYWRkcl9yZXEgPj49IDgpICYgMHgwZjsKLQkJdGYtPmNvbW1hbmQgID0gV0lOX1NFVF9NQVg7CisJCXRmLT5jb21tYW5kICA9IEFUQV9DTURfU0VUX01BWDsKIAl9CiAJdGYtPmRldmljZSB8PSBBVEFfTEJBOwogCWFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwpAQCAtMzc5LDI1ICszMjcsNiBAQAogfQogCiAvKgotICogQml0cyAxMCBvZiBjb21tYW5kX3NldF8xIGFuZCBjZnNfZW5hYmxlXzEgbXVzdCBiZSBlcXVhbCwKLSAqIHNvIG9uIG5vbi1idWdneSBkcml2ZXMgd2UgbmVlZCB0ZXN0IG9ubHkgb25lLgotICogSG93ZXZlciwgd2Ugc2hvdWxkIGFsc28gY2hlY2sgd2hldGhlciB0aGVzZSBmaWVsZHMgYXJlIHZhbGlkLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpZGVkaXNrX3N1cHBvcnRzX2hwYShjb25zdCBzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQpCi17Ci0JcmV0dXJuIChpZC0+Y29tbWFuZF9zZXRfMSAmIDB4MDQwMCkgJiYgKGlkLT5jZnNfZW5hYmxlXzEgJiAweDA0MDApOwotfQotCi0vKgotICogVGhlIHNhbWUgaGVyZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgaWRlZGlza19zdXBwb3J0c19sYmE0OChjb25zdCBzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQpCi17Ci0JcmV0dXJuIChpZC0+Y29tbWFuZF9zZXRfMiAmIDB4MDQwMCkgJiYgKGlkLT5jZnNfZW5hYmxlXzIgJiAweDA0MDApCi0JICAgICAgICYmIGlkLT5sYmFfY2FwYWNpdHlfMjsKLX0KLQotLyoKICAqIFNvbWUgZGlza3MgcmVwb3J0IHRvdGFsIG51bWJlciBvZiBzZWN0b3JzIGluc3RlYWQgb2YKICAqIG1heGltdW0gc2VjdG9yIGFkZHJlc3MuICBXZSBsaXN0IHRoZW0gaGVyZS4KICAqLwpAQCAtNDExLDcgKzM0MCw3IEBACiBzdGF0aWMgdm9pZCBpZGVkaXNrX2NoZWNrX2hwYShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGNhcGFjaXR5LCBzZXRfbWF4OwotCWludCBsYmE0OCA9IGlkZWRpc2tfc3VwcG9ydHNfbGJhNDgoZHJpdmUtPmlkKTsKKwlpbnQgbGJhNDggPSBhdGFfaWRfbGJhNDhfZW5hYmxlZChkcml2ZS0+aWQpOwogCiAJY2FwYWNpdHkgPSBkcml2ZS0+Y2FwYWNpdHk2NDsKIApAQCAtNDQ3LDEzOSArMzc2LDQwIEBACiAKIHN0YXRpYyB2b2lkIGluaXRfaWRlZGlza19jYXBhY2l0eShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOwotCS8qCi0JICogSWYgdGhpcyBkcml2ZSBzdXBwb3J0cyB0aGUgSG9zdCBQcm90ZWN0ZWQgQXJlYSBmZWF0dXJlIHNldCwKLQkgKiB0aGVuIHdlIG1heSBuZWVkIHRvIGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB0aGUgZHJpdmUncyBjYXBhY2l0eS4KLQkgKi8KLQlpbnQgaHBhID0gaWRlZGlza19zdXBwb3J0c19ocGEoaWQpOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisJaW50IGxiYTsKIAotCWlmIChpZGVkaXNrX3N1cHBvcnRzX2xiYTQ4KGlkKSkgeworCWlmIChhdGFfaWRfbGJhNDhfZW5hYmxlZChpZCkpIHsKIAkJLyogZHJpdmUgc3BlYWtzIDQ4LWJpdCBMQkEgKi8KLQkJZHJpdmUtPnNlbGVjdC5iLmxiYSA9IDE7Ci0JCWRyaXZlLT5jYXBhY2l0eTY0ID0gaWQtPmxiYV9jYXBhY2l0eV8yOwotCQlpZiAoaHBhKQotCQkJaWRlZGlza19jaGVja19ocGEoZHJpdmUpOwotCX0gZWxzZSBpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMikgJiYgbGJhX2NhcGFjaXR5X2lzX29rKGlkKSkgeworCQlsYmEgPSAxOworCQlkcml2ZS0+Y2FwYWNpdHk2NCA9IGF0YV9pZF91NjQoaWQsIEFUQV9JRF9MQkFfQ0FQQUNJVFlfMik7CisJfSBlbHNlIGlmIChhdGFfaWRfaGFzX2xiYShpZCkgJiYgYXRhX2lkX2lzX2xiYV9jYXBhY2l0eV9vayhpZCkpIHsKIAkJLyogZHJpdmUgc3BlYWtzIDI4LWJpdCBMQkEgKi8KLQkJZHJpdmUtPnNlbGVjdC5iLmxiYSA9IDE7Ci0JCWRyaXZlLT5jYXBhY2l0eTY0ID0gaWQtPmxiYV9jYXBhY2l0eTsKLQkJaWYgKGhwYSkKLQkJCWlkZWRpc2tfY2hlY2tfaHBhKGRyaXZlKTsKKwkJbGJhID0gMTsKKwkJZHJpdmUtPmNhcGFjaXR5NjQgPSBhdGFfaWRfdTMyKGlkLCBBVEFfSURfTEJBX0NBUEFDSVRZKTsKIAl9IGVsc2UgewogCQkvKiBkcml2ZSBzcGVha3MgYm9yaW5nIG9sZCAyOC1iaXQgQ0hTICovCisJCWxiYSA9IDA7CiAJCWRyaXZlLT5jYXBhY2l0eTY0ID0gZHJpdmUtPmN5bCAqIGRyaXZlLT5oZWFkICogZHJpdmUtPnNlY3Q7CiAJfQotfQogCi1zdGF0aWMgc2VjdG9yX3QgaWRlZGlza19jYXBhY2l0eShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JcmV0dXJuIGRyaXZlLT5jYXBhY2l0eTY0IC0gZHJpdmUtPnNlY3QwOwotfQorCWlmIChsYmEpIHsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTEJBOwogCi0jaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCi1zdGF0aWMgaW50IHNtYXJ0X2VuYWJsZShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX3Rhc2tfdCBhcmdzOwotCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJmFyZ3MudGY7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7Ci0JdGYtPmZlYXR1cmUgPSBTTUFSVF9FTkFCTEU7Ci0JdGYtPmxiYW0gICAgPSBTTUFSVF9MQ1lMX1BBU1M7Ci0JdGYtPmxiYWggICAgPSBTTUFSVF9IQ1lMX1BBU1M7Ci0JdGYtPmNvbW1hbmQgPSBXSU5fU01BUlQ7Ci0JYXJncy50Zl9mbGFncyA9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7Ci0JcmV0dXJuIGlkZV9ub19kYXRhX3Rhc2tmaWxlKGRyaXZlLCAmYXJncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3NtYXJ0X2RhdGEoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCAqYnVmLCB1OCBzdWJfY21kKQotewotCWlkZV90YXNrX3QgYXJnczsKLQlzdHJ1Y3QgaWRlX3Rhc2tmaWxlICp0ZiA9ICZhcmdzLnRmOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoaWRlX3Rhc2tfdCkpOwotCXRmLT5mZWF0dXJlID0gc3ViX2NtZDsKLQl0Zi0+bnNlY3QgICA9IDB4MDE7Ci0JdGYtPmxiYW0gICAgPSBTTUFSVF9MQ1lMX1BBU1M7Ci0JdGYtPmxiYWggICAgPSBTTUFSVF9IQ1lMX1BBU1M7Ci0JdGYtPmNvbW1hbmQgPSBXSU5fU01BUlQ7Ci0JYXJncy50Zl9mbGFncwk9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7Ci0JYXJncy5kYXRhX3BoYXNlCT0gVEFTS0ZJTEVfSU47Ci0JKHZvaWQpIHNtYXJ0X2VuYWJsZShkcml2ZSk7Ci0JcmV0dXJuIGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBidWYsIDEpOwotfQotCi1zdGF0aWMgaW50IHByb2NfaWRlZGlza19yZWFkX2NhY2hlCi0JKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOwotCWNoYXIJCSpvdXQgPSBwYWdlOwotCWludAkJbGVuOwotCi0JaWYgKGRyaXZlLT5pZF9yZWFkKQotCQlsZW4gPSBzcHJpbnRmKG91dCwgIiVpXG4iLCBkcml2ZS0+aWQtPmJ1Zl9zaXplIC8gMik7Ci0JZWxzZQotCQlsZW4gPSBzcHJpbnRmKG91dCwgIihub25lKVxuIik7Ci0KLQlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOwotfQotCi1zdGF0aWMgaW50IHByb2NfaWRlZGlza19yZWFkX2NhcGFjaXR5Ci0JKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWlkZV9kcml2ZV90KmRyaXZlID0gKGlkZV9kcml2ZV90ICopZGF0YTsKLQlpbnQgbGVuOwotCi0JbGVuID0gc3ByaW50ZihwYWdlLCAiJWxsdVxuIiwgKGxvbmcgbG9uZylpZGVkaXNrX2NhcGFjaXR5KGRyaXZlKSk7Ci0KLQlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOwotfQotCi1zdGF0aWMgaW50IHByb2NfaWRlZGlza19yZWFkX3NtYXJ0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEsIHU4IHN1Yl9jbWQpCi17Ci0JaWRlX2RyaXZlX3QJKmRyaXZlID0gKGlkZV9kcml2ZV90ICopZGF0YTsKLQlpbnQJCWxlbiA9IDAsIGkgPSAwOwotCi0JaWYgKGdldF9zbWFydF9kYXRhKGRyaXZlLCBwYWdlLCBzdWJfY21kKSA9PSAwKSB7Ci0JCXVuc2lnbmVkIHNob3J0ICp2YWwgPSAodW5zaWduZWQgc2hvcnQgKikgcGFnZTsKLQkJY2hhciAqb3V0ID0gKChjaGFyICopdmFsKSArIChTRUNUT1JfV09SRFMgKiA0KTsKLQkJcGFnZSA9IG91dDsKLQkJZG8gewotCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTA0eCVjIiwgbGUxNl90b19jcHUoKnZhbCksCi0JCQkJICAgICAgICgrK2kgJiA3KSA/ICcgJyA6ICdcbicpOwotCQkJdmFsICs9IDE7Ci0JCX0gd2hpbGUgKGkgPCAoU0VDVE9SX1dPUkRTICogMikpOwotCQlsZW4gPSBvdXQgLSBwYWdlOworCQkvKgorCQkqIElmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSBIb3N0IFByb3RlY3RlZCBBcmVhIGZlYXR1cmUgc2V0LAorCQkqIHRoZW4gd2UgbWF5IG5lZWQgdG8gY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IGl0cyBjYXBhY2l0eS4KKwkJKi8KKwkJaWYgKGF0YV9pZF9ocGFfZW5hYmxlZChpZCkpCisJCQlpZGVkaXNrX2NoZWNrX2hwYShkcml2ZSk7CiAJfQotCi0JUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKIH0KIAotc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9zdgotCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3NlY3Rvcl90IGlkZV9kaXNrX2NhcGFjaXR5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlyZXR1cm4gcHJvY19pZGVkaXNrX3JlYWRfc21hcnQocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgZGF0YSwKLQkJCQkgICAgICAgU01BUlRfUkVBRF9WQUxVRVMpOworCXJldHVybiBkcml2ZS0+Y2FwYWNpdHk2NDsKIH0KIAotc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9zdAotCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcHJvY19pZGVkaXNrX3JlYWRfc21hcnQocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgZGF0YSwKLQkJCQkgICAgICAgU01BUlRfUkVBRF9USFJFU0hPTERTKTsKLX0KLQotc3RhdGljIGlkZV9wcm9jX2VudHJ5X3QgaWRlZGlza19wcm9jW10gPSB7Ci0JeyAiY2FjaGUiLAkgIFNfSUZSRUd8U19JUlVHTywgcHJvY19pZGVkaXNrX3JlYWRfY2FjaGUsICAgIE5VTEwgfSwKLQl7ICJjYXBhY2l0eSIsCSAgU19JRlJFR3xTX0lSVUdPLCBwcm9jX2lkZWRpc2tfcmVhZF9jYXBhY2l0eSwgTlVMTCB9LAotCXsgImdlb21ldHJ5IiwJICBTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlX3JlYWRfZ2VvbWV0cnksICAgICBOVUxMIH0sCi0JeyAic21hcnRfdmFsdWVzIiwgU19JRlJFR3xTX0lSVVNSLCBwcm9jX2lkZWRpc2tfcmVhZF9zdiwgICAgICAgTlVMTCB9LAotCXsgInNtYXJ0X3RocmVzaG9sZHMiLCBTX0lGUkVHfFNfSVJVU1IsIHByb2NfaWRlZGlza19yZWFkX3N0LCAgIE5VTEwgfSwKLQl7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfQotfTsKLSNlbmRpZgkvKiBDT05GSUdfSURFX1BST0NfRlMgKi8KLQogc3RhdGljIHZvaWQgaWRlZGlza19wcmVwYXJlX2ZsdXNoKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gcS0+cXVldWVkYXRhOwpAQCAtNTg5LDExICs0MTksMTEgQEAKIAlCVUdfT04odGFzayA9PSBOVUxMKTsKIAogCW1lbXNldCh0YXNrLCAwLCBzaXplb2YoKnRhc2spKTsKLQlpZiAoaWRlX2lkX2hhc19mbHVzaF9jYWNoZV9leHQoZHJpdmUtPmlkKSAmJgorCWlmIChhdGFfaWRfZmx1c2hfZXh0X2VuYWJsZWQoZHJpdmUtPmlkKSAmJgogCSAgICAoZHJpdmUtPmNhcGFjaXR5NjQgPj0gKDFVTCA8PCAyOCkpKQotCQl0YXNrLT50Zi5jb21tYW5kID0gV0lOX0ZMVVNIX0NBQ0hFX0VYVDsKKwkJdGFzay0+dGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0hfRVhUOwogCWVsc2UKLQkJdGFzay0+dGYuY29tbWFuZCA9IFdJTl9GTFVTSF9DQUNIRTsKKwkJdGFzay0+dGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CiAJdGFzay0+dGZfZmxhZ3MJID0gSURFX1RGTEFHX09VVF9URiB8IElERV9URkxBR19PVVRfREVWSUNFIHwKIAkJCSAgIElERV9URkxBR19EWU47CiAJdGFzay0+ZGF0YV9waGFzZSA9IFRBU0tGSUxFX05PX0RBVEE7CkBAIC02MDMsNiArNDMzLDggQEAKIAlycS0+c3BlY2lhbCA9IHRhc2s7CiB9CiAKK2lkZV9kZXZzZXRfZ2V0KG11bHRjb3VudCwgbXVsdF9jb3VudCk7CisKIC8qCiAgKiBUaGlzIGlzIHRpZ2h0bHkgd292ZW4gaW50byB0aGUgZHJpdmVyLT5kb19zcGVjaWFsIGNhbiBub3QgdG91Y2guCiAgKiBET04nVCBkbyBpdCBhZ2FpbiB1bnRpbCBhIHRvdGFsIHBlcnNvbmFsaXR5IHJld3JpdGUgaXMgY29tbWl0dGVkLgpAQCAtNjEyLDcgKzQ0NCw3IEBACiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCBlcnJvcjsKIAotCWlmIChhcmcgPCAwIHx8IGFyZyA+IGRyaXZlLT5pZC0+bWF4X211bHRzZWN0KQorCWlmIChhcmcgPCAwIHx8IGFyZyA+IChkcml2ZS0+aWRbQVRBX0lEX01BWF9NVUxUU0VDVF0gJiAweGZmKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZHJpdmUtPnNwZWNpYWwuYi5zZXRfbXVsdG1vZGUpCkBAIC02MjksMjYgKzQ2MSw0MyBAQAogCXJldHVybiAoZHJpdmUtPm11bHRfY291bnQgPT0gYXJnKSA/IDAgOiAtRUlPOwogfQogCitpZGVfZGV2c2V0X2dldF9mbGFnKG5vd2VyciwgSURFX0RGTEFHX05PV0VSUik7CisKIHN0YXRpYyBpbnQgc2V0X25vd2VycihpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCiB7CiAJaWYgKGFyZyA8IDAgfHwgYXJnID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaWRlX3NwaW5fd2FpdF9od2dyb3VwKGRyaXZlKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlkcml2ZS0+bm93ZXJyID0gYXJnOworCWlmIChhcmcpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PV0VSUjsKKwllbHNlCisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19OT1dFUlI7CisKIAlkcml2ZS0+YmFkX3dzdGF0ID0gYXJnID8gQkFEX1JfU1RBVCA6IEJBRF9XX1NUQVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpZGVfZG9fc2V0ZmVhdHVyZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGZlYXR1cmUsIHU4IG5zZWN0KQoreworCWlkZV90YXNrX3QgdGFzazsKKworCW1lbXNldCgmdGFzaywgMCwgc2l6ZW9mKHRhc2spKTsKKwl0YXNrLnRmLmZlYXR1cmUgPSBmZWF0dXJlOworCXRhc2sudGYubnNlY3QgICA9IG5zZWN0OworCXRhc2sudGYuY29tbWFuZCA9IEFUQV9DTURfU0VUX0ZFQVRVUkVTOworCXRhc2sudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOworCisJcmV0dXJuIGlkZV9ub19kYXRhX3Rhc2tmaWxlKGRyaXZlLCAmdGFzayk7Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV9vcmRlcmVkKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAl1bnNpZ25lZCBvcmRlcmVkID0gUVVFVUVfT1JERVJFRF9OT05FOwogCXByZXBhcmVfZmx1c2hfZm4gKnByZXBfZm4gPSBOVUxMOwogCi0JaWYgKGRyaXZlLT53Y2FjaGUpIHsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19XQ0FDSEUpIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGNhcGFjaXR5OwogCQlpbnQgYmFycmllcjsKIAkJLyoKQEAgLTY1OSwxMCArNTA4LDEyIEBACiAJCSAqIHRpbWUgd2UgaGF2ZSB0cmltbWVkIHRoZSBkcml2ZSBjYXBhY2l0eSBpZiBMQkE0OCBpcwogCQkgKiBub3QgYXZhaWxhYmxlIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVjaGVjayB0aGF0LgogCQkgKi8KLQkJY2FwYWNpdHkgPSBpZGVkaXNrX2NhcGFjaXR5KGRyaXZlKTsKLQkJYmFycmllciA9IGlkZV9pZF9oYXNfZmx1c2hfY2FjaGUoaWQpICYmICFkcml2ZS0+bm9mbHVzaCAmJgotCQkJKGRyaXZlLT5hZGRyZXNzaW5nID09IDAgfHwgY2FwYWNpdHkgPD0gKDFVTEwgPDwgMjgpIHx8Ci0JCQkgaWRlX2lkX2hhc19mbHVzaF9jYWNoZV9leHQoaWQpKTsKKwkJY2FwYWNpdHkgPSBpZGVfZGlza19jYXBhY2l0eShkcml2ZSk7CisJCWJhcnJpZXIgPSBhdGFfaWRfZmx1c2hfZW5hYmxlZChpZCkgJiYKKwkJCShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PRkxVU0gpID09IDAgJiYKKwkJCSgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkgPT0gMCB8fAorCQkJIGNhcGFjaXR5IDw9ICgxVUxMIDw8IDI4KSB8fAorCQkJIGF0YV9pZF9mbHVzaF9leHRfZW5hYmxlZChpZCkpOwogCiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYWNoZSBmbHVzaGVzICVzc3VwcG9ydGVkXG4iLAogCQkgICAgICAgZHJpdmUtPm5hbWUsIGJhcnJpZXIgPyAiIiA6ICJub3QgIik7CkBAIC02NzcsMjMgKzUyOCwyNCBAQAogCWJsa19xdWV1ZV9vcmRlcmVkKGRyaXZlLT5xdWV1ZSwgb3JkZXJlZCwgcHJlcF9mbik7CiB9CiAKLXN0YXRpYyBpbnQgd3JpdGVfY2FjaGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQoraWRlX2RldnNldF9nZXRfZmxhZyh3Y2FjaGUsIElERV9ERkxBR19XQ0FDSEUpOworCitzdGF0aWMgaW50IHNldF93Y2FjaGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewotCWlkZV90YXNrX3QgYXJnczsKIAlpbnQgZXJyID0gMTsKIAogCWlmIChhcmcgPCAwIHx8IGFyZyA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlkZV9pZF9oYXNfZmx1c2hfY2FjaGUoZHJpdmUtPmlkKSkgewotCQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7Ci0JCWFyZ3MudGYuZmVhdHVyZSA9IGFyZyA/Ci0JCQlTRVRGRUFUVVJFU19FTl9XQ0FDSEUgOiBTRVRGRUFUVVJFU19ESVNfV0NBQ0hFOwotCQlhcmdzLnRmLmNvbW1hbmQgPSBXSU5fU0VURkVBVFVSRVM7Ci0JCWFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwotCQllcnIgPSBpZGVfbm9fZGF0YV90YXNrZmlsZShkcml2ZSwgJmFyZ3MpOwotCQlpZiAoZXJyID09IDApCi0JCQlkcml2ZS0+d2NhY2hlID0gYXJnOworCWlmIChhdGFfaWRfZmx1c2hfZW5hYmxlZChkcml2ZS0+aWQpKSB7CisJCWVyciA9IGlkZV9kb19zZXRmZWF0dXJlKGRyaXZlLAorCQkJYXJnID8gU0VURkVBVFVSRVNfV0NfT04gOiBTRVRGRUFUVVJFU19XQ19PRkYsIDApOworCQlpZiAoZXJyID09IDApIHsKKwkJCWlmIChhcmcpCisJCQkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfV0NBQ0hFOworCQkJZWxzZQorCQkJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19XQ0FDSEU7CisJCX0KIAl9CiAKIAl1cGRhdGVfb3JkZXJlZChkcml2ZSk7CkBAIC03MDYsMTA4ICs1NTgsODggQEAKIAlpZGVfdGFza190IGFyZ3M7CiAKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7Ci0JaWYgKGlkZV9pZF9oYXNfZmx1c2hfY2FjaGVfZXh0KGRyaXZlLT5pZCkpCi0JCWFyZ3MudGYuY29tbWFuZCA9IFdJTl9GTFVTSF9DQUNIRV9FWFQ7CisJaWYgKGF0YV9pZF9mbHVzaF9leHRfZW5hYmxlZChkcml2ZS0+aWQpKQorCQlhcmdzLnRmLmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIX0VYVDsKIAllbHNlCi0JCWFyZ3MudGYuY29tbWFuZCA9IFdJTl9GTFVTSF9DQUNIRTsKKwkJYXJncy50Zi5jb21tYW5kID0gQVRBX0NNRF9GTFVTSDsKIAlhcmdzLnRmX2ZsYWdzID0gSURFX1RGTEFHX1RGIHwgSURFX1RGTEFHX0RFVklDRTsKIAlyZXR1cm4gaWRlX25vX2RhdGFfdGFza2ZpbGUoZHJpdmUsICZhcmdzKTsKIH0KIAoraWRlX2RldnNldF9nZXQoYWNvdXN0aWMsIGFjb3VzdGljKTsKKwogc3RhdGljIGludCBzZXRfYWNvdXN0aWMoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewotCWlkZV90YXNrX3QgYXJnczsKLQogCWlmIChhcmcgPCAwIHx8IGFyZyA+IDI1NCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7Ci0JYXJncy50Zi5mZWF0dXJlID0gYXJnID8gU0VURkVBVFVSRVNfRU5fQUFNIDogU0VURkVBVFVSRVNfRElTX0FBTTsKLQlhcmdzLnRmLm5zZWN0ICAgPSBhcmc7Ci0JYXJncy50Zi5jb21tYW5kID0gV0lOX1NFVEZFQVRVUkVTOwotCWFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwotCWlkZV9ub19kYXRhX3Rhc2tmaWxlKGRyaXZlLCAmYXJncyk7CisJaWRlX2RvX3NldGZlYXR1cmUoZHJpdmUsCisJCWFyZyA/IFNFVEZFQVRVUkVTX0FBTV9PTiA6IFNFVEZFQVRVUkVTX0FBTV9PRkYsIGFyZyk7CisKIAlkcml2ZS0+YWNvdXN0aWMgPSBhcmc7CisKIAlyZXR1cm4gMDsKIH0KIAoraWRlX2RldnNldF9nZXRfZmxhZyhhZGRyZXNzaW5nLCBJREVfREZMQUdfTEJBNDgpOworCiAvKgogICogZHJpdmUtPmFkZHJlc3Npbmc6CiAgKgkwOiAyOC1iaXQKICAqCTE6IDQ4LWJpdAogICoJMjogNDgtYml0IGNhcGFibGUgZG9pbmcgMjgtYml0CiAgKi8KLXN0YXRpYyBpbnQgc2V0X2xiYV9hZGRyZXNzaW5nKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKK3N0YXRpYyBpbnQgc2V0X2FkZHJlc3NpbmcoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewogCWlmIChhcmcgPCAwIHx8IGFyZyA+IDIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZHJpdmUtPmFkZHJlc3NpbmcgPSAgMDsKLQotCWlmIChkcml2ZS0+aHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19MQkE0OCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWlkZWRpc2tfc3VwcG9ydHNfbGJhNDgoZHJpdmUtPmlkKSkKKwlpZiAoYXJnICYmICgoZHJpdmUtPmh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fTEJBNDgpIHx8CisJICAgIGF0YV9pZF9sYmE0OF9lbmFibGVkKGRyaXZlLT5pZCkgPT0gMCkpCiAJCXJldHVybiAtRUlPOwotCWRyaXZlLT5hZGRyZXNzaW5nID0gYXJnOworCisJaWYgKGFyZyA9PSAyKQorCQlhcmcgPSAwOworCisJaWYgKGFyZykKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTEJBNDg7CisJZWxzZQorCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTEJBNDg7CisKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwotc3RhdGljIHZvaWQgaWRlZGlza19hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKK2lkZV9leHRfZGV2c2V0X3J3KGFjb3VzdGljLCBhY291c3RpYyk7CitpZGVfZXh0X2RldnNldF9ydyhhZGRyZXNzLCBhZGRyZXNzaW5nKTsKK2lkZV9leHRfZGV2c2V0X3J3KG11bHRjb3VudCwgbXVsdGNvdW50KTsKK2lkZV9leHRfZGV2c2V0X3J3KHdjYWNoZSwgd2NhY2hlKTsKIAotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImJpb3NfY3lsIiwgU0VUVElOR19SVywgVFlQRV9JTlQsIDAsIDY1NTM1LCAxLCAxLAotCQkJJmRyaXZlLT5iaW9zX2N5bCwgTlVMTCk7Ci0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAiYmlvc19oZWFkIiwgU0VUVElOR19SVywgVFlQRV9CWVRFLCAwLCAyNTUsIDEsIDEsCi0JCQkmZHJpdmUtPmJpb3NfaGVhZCwgTlVMTCk7Ci0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAiYmlvc19zZWN0IiwgU0VUVElOR19SVywgVFlQRV9CWVRFLCAwLCA2MywgMSwgMSwKLQkJCSZkcml2ZS0+Ymlvc19zZWN0LCBOVUxMKTsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJhZGRyZXNzIiwgU0VUVElOR19SVywgVFlQRV9CWVRFLCAwLCAyLCAxLCAxLAotCQkJJmRyaXZlLT5hZGRyZXNzaW5nLCBzZXRfbGJhX2FkZHJlc3NpbmcpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgIm11bHRjb3VudCIsIFNFVFRJTkdfUlcsIFRZUEVfQllURSwgMCwKLQkJCWlkLT5tYXhfbXVsdHNlY3QsIDEsIDEsICZkcml2ZS0+bXVsdF9jb3VudCwKLQkJCXNldF9tdWx0Y291bnQpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgIm5vd2VyciIsIFNFVFRJTkdfUlcsIFRZUEVfQllURSwgMCwgMSwgMSwgMSwKLQkJCSZkcml2ZS0+bm93ZXJyLCBzZXRfbm93ZXJyKTsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJsdW4iLCBTRVRUSU5HX1JXLCBUWVBFX0lOVCwgMCwgNywgMSwgMSwKLQkJCSZkcml2ZS0+bHVuLCBOVUxMKTsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJ3Y2FjaGUiLCBTRVRUSU5HX1JXLCBUWVBFX0JZVEUsIDAsIDEsIDEsIDEsCi0JCQkmZHJpdmUtPndjYWNoZSwgd3JpdGVfY2FjaGUpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImFjb3VzdGljIiwgU0VUVElOR19SVywgVFlQRV9CWVRFLCAwLCAyNTQsIDEsIDEsCi0JCQkmZHJpdmUtPmFjb3VzdGljLCBzZXRfYWNvdXN0aWMpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImZhaWx1cmVzIiwgU0VUVElOR19SVywgVFlQRV9JTlQsIDAsIDY1NTM1LCAxLCAxLAotCQkJJmRyaXZlLT5mYWlsdXJlcywgTlVMTCk7Ci0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAibWF4X2ZhaWx1cmVzIiwgU0VUVElOR19SVywgVFlQRV9JTlQsIDAsIDY1NTM1LAotCQkJMSwgMSwgJmRyaXZlLT5tYXhfZmFpbHVyZXMsIE5VTEwpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVkaXNrX2FkZF9zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpIHsgOyB9Ci0jZW5kaWYKK2lkZV9leHRfZGV2c2V0X3J3X3N5bmMobm93ZXJyLCBub3dlcnIpOwogCiBzdGF0aWMgdm9pZCBpZGVkaXNrX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKKwlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICppZGtwID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKKwljaGFyICptID0gKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBjYXBhY2l0eTsKIAotCWlkZWRpc2tfYWRkX3NldHRpbmdzKGRyaXZlKTsKKwlpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsIGlka3AtPmRyaXZlcik7CiAKLQlpZiAoZHJpdmUtPmlkX3JlYWQgPT0gMCkKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfSURfUkVBRCkgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKGRyaXZlLT5yZW1vdmFibGUpIHsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19SRU1PVkFCTEUpIHsKIAkJLyoKIAkJICogUmVtb3ZhYmxlIGRpc2tzIChlZy4gU1lRVUVTVCk7IGlnbm9yZSAnV0QnIGRyaXZlcwogCQkgKi8KLQkJaWYgKGlkLT5tb2RlbFswXSAhPSAnVycgfHwgaWQtPm1vZGVsWzFdICE9ICdEJykKLQkJCWRyaXZlLT5kb29ybG9ja2luZyA9IDE7CisJCWlmIChtWzBdICE9ICdXJyB8fCBtWzFdICE9ICdEJykKKwkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0RPT1JMT0NLSU5HOwogCX0KIAotCSh2b2lkKXNldF9sYmFfYWRkcmVzc2luZyhkcml2ZSwgMSk7CisJKHZvaWQpc2V0X2FkZHJlc3NpbmcoZHJpdmUsIDEpOwogCi0JaWYgKGRyaXZlLT5hZGRyZXNzaW5nID09IDEpIHsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkgewogCQlpbnQgbWF4X3MgPSAyMDQ4OwogCiAJCWlmIChtYXhfcyA+IGh3aWYtPnJxc2l6ZSkKQEAgLTgyMyw3ICs2NTUsOCBAQAogCWluaXRfaWRlZGlza19jYXBhY2l0eShkcml2ZSk7CiAKIAkvKiBsaW1pdCBkcml2ZSBjYXBhY2l0eSB0byAxMzdHQiBpZiBMQkE0OCBjYW5ub3QgYmUgdXNlZCAqLwotCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAwICYmIGRyaXZlLT5jYXBhY2l0eTY0ID4gMVVMTCA8PCAyOCkgeworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkgPT0gMCAmJgorCSAgICBkcml2ZS0+Y2FwYWNpdHk2NCA+IDFVTEwgPDwgMjgpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCB1c2UgTEJBNDggLSBmdWxsIGNhcGFjaXR5ICIKIAkJICAgICAgICIlbGx1IHNlY3RvcnMgKCVsbHUgTUIpXG4iLAogCQkgICAgICAgZHJpdmUtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpZHJpdmUtPmNhcGFjaXR5NjQsCkBAIC04MzEsMjQgKzY2NCwyNCBAQAogCQlkcml2ZS0+Y2FwYWNpdHk2NCA9IDFVTEwgPDwgMjg7CiAJfQogCi0JaWYgKChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0xCQTQ4X0RNQSkgJiYgZHJpdmUtPmFkZHJlc3NpbmcpIHsKKwlpZiAoKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fTEJBNDhfRE1BKSAmJgorCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkpIHsKIAkJaWYgKGRyaXZlLT5jYXBhY2l0eTY0ID4gMVVMTCA8PCAyOCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbm5vdCB1c2UgTEJBNDggRE1BIC0gUElPIG1vZGUiCiAJCQkJCSAiIHdpbGwgYmUgdXNlZCBmb3IgYWNjZXNzaW5nIHNlY3RvcnMgIgogCQkJCQkgIj4gJXVcbiIsIGRyaXZlLT5uYW1lLCAxIDw8IDI4KTsKIAkJfSBlbHNlCi0JCQlkcml2ZS0+YWRkcmVzc2luZyA9IDA7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTEJBNDg7CiAJfQogCiAJLyoKIAkgKiBpZiBwb3NzaWJsZSwgZ2l2ZSBmZGlzayBhY2Nlc3MgdG8gbW9yZSBvZiB0aGUgZHJpdmUsCiAJICogYnkgY29ycmVjdGluZyBiaW9zX2N5bHM6CiAJICovCi0JY2FwYWNpdHkgPSBpZGVkaXNrX2NhcGFjaXR5KGRyaXZlKTsKKwljYXBhY2l0eSA9IGlkZV9kaXNrX2NhcGFjaXR5KGRyaXZlKTsKIAotCWlmICghZHJpdmUtPmZvcmNlZF9nZW9tKSB7Ci0KLQkJaWYgKGlkZWRpc2tfc3VwcG9ydHNfbGJhNDgoZHJpdmUtPmlkKSkgeworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19GT1JDRURfR0VPTSkgPT0gMCkgeworCQlpZiAoYXRhX2lkX2xiYTQ4X2VuYWJsZWQoZHJpdmUtPmlkKSkgewogCQkJLyogY29tcGF0aWJpbGl0eSAqLwogCQkJZHJpdmUtPmJpb3Nfc2VjdCA9IDYzOwogCQkJZHJpdmUtPmJpb3NfaGVhZCA9IDI1NTsKQEAgLTg3NCwyMiArNzA3LDIzIEBACiAJCQkgZHJpdmUtPm5hbWUsIGNhcGFjaXR5LCBzZWN0b3JzX3RvX01CKGNhcGFjaXR5KSk7CiAKIAkvKiBPbmx5IHByaW50IGNhY2hlIHNpemUgd2hlbiBpdCB3YXMgc3BlY2lmaWVkICovCi0JaWYgKGlkLT5idWZfc2l6ZSkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiIHcvJWRLaUIgQ2FjaGUiLCBpZC0+YnVmX3NpemUgLyAyKTsKKwlpZiAoaWRbQVRBX0lEX0JVRl9TSVpFXSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiIHcvJWRLaUIgQ2FjaGUiLCBpZFtBVEFfSURfQlVGX1NJWkVdIC8gMik7CiAKIAlwcmludGsoS0VSTl9DT05UICIsIENIUz0lZC8lZC8lZFxuIiwKIAkJCSBkcml2ZS0+Ymlvc19jeWwsIGRyaXZlLT5iaW9zX2hlYWQsIGRyaXZlLT5iaW9zX3NlY3QpOwogCiAJLyogd3JpdGUgY2FjaGUgZW5hYmxlZD8gKi8KLQlpZiAoKGlkLT5jc2ZvICYgMSkgfHwgKGlkLT5jZnNfZW5hYmxlXzEgJiAoMSA8PCA1KSkpCi0JCWRyaXZlLT53Y2FjaGUgPSAxOworCWlmICgoaWRbQVRBX0lEX0NTRk9dICYgMSkgfHwgYXRhX2lkX3djYWNoZV9lbmFibGVkKGlkKSkKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfV0NBQ0hFOwogCi0Jd3JpdGVfY2FjaGUoZHJpdmUsIDEpOworCXNldF93Y2FjaGUoZHJpdmUsIDEpOwogfQogCiBzdGF0aWMgdm9pZCBpZGVfY2FjaGVmbHVzaF9wKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZiAoIWRyaXZlLT53Y2FjaGUgfHwgIWlkZV9pZF9oYXNfZmx1c2hfY2FjaGUoZHJpdmUtPmlkKSkKKwlpZiAoYXRhX2lkX2ZsdXNoX2VuYWJsZWQoZHJpdmUtPmlkKSA9PSAwIHx8CisJICAgIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1dDQUNIRSkgPT0gMCkKIAkJcmV0dXJuOwogCiAJaWYgKGRvX2lkZWRpc2tfZmx1c2hjYWNoZShkcml2ZSkpCkBAIC05MzEsNyArNzY1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgaWRlX2Rpc2tfcmVzdW1lKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZiAoaWRlZGlza19zdXBwb3J0c19ocGEoZHJpdmUtPmlkKSkKKwlpZiAoYXRhX2lkX2hwYV9lbmFibGVkKGRyaXZlLT5pZCkpCiAJCWluaXRfaWRlZGlza19jYXBhY2l0eShkcml2ZSk7CiB9CiAKQEAgLTk3MywxMyArODA3LDEyIEBACiAJLnJlc3VtZQkJCT0gaWRlX2Rpc2tfcmVzdW1lLAogCS5zaHV0ZG93bgkJPSBpZGVfZGV2aWNlX3NodXRkb3duLAogCS52ZXJzaW9uCQk9IElERURJU0tfVkVSU0lPTiwKLQkubWVkaWEJCQk9IGlkZV9kaXNrLAotCS5zdXBwb3J0c19kc2Nfb3ZlcmxhcAk9IDAsCiAJLmRvX3JlcXVlc3QJCT0gaWRlX2RvX3J3X2Rpc2ssCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZV9lbmRfcmVxdWVzdCwKIAkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwotCS5wcm9jCQkJPSBpZGVkaXNrX3Byb2MsCisJLnByb2MJCQk9IGlkZV9kaXNrX3Byb2MsCisJLnNldHRpbmdzCQk9IGlkZV9kaXNrX3NldHRpbmdzLAogI2VuZGlmCiB9OwogCkBAIC05ODgsNyArODIxLDcgQEAKIAlpZGVfdGFza190IHRhc2s7CiAKIAltZW1zZXQoJnRhc2ssIDAsIHNpemVvZih0YXNrKSk7Ci0JdGFzay50Zi5jb21tYW5kID0gb24gPyBXSU5fRE9PUkxPQ0sgOiBXSU5fRE9PUlVOTE9DSzsKKwl0YXNrLnRmLmNvbW1hbmQgPSBvbiA/IEFUQV9DTURfTUVESUFfTE9DSyA6IEFUQV9DTURfTUVESUFfVU5MT0NLOwogCXRhc2sudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwogCiAJcmV0dXJuIGlkZV9ub19kYXRhX3Rhc2tmaWxlKGRyaXZlLCAmdGFzayk7CkBAIC0xMDA4LDE1ICs4NDEsMTYgQEAKIAogCWlka3AtPm9wZW5lcnMrKzsKIAotCWlmIChkcml2ZS0+cmVtb3ZhYmxlICYmIGlka3AtPm9wZW5lcnMgPT0gMSkgeworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19SRU1PVkFCTEUpICYmIGlka3AtPm9wZW5lcnMgPT0gMSkgewogCQljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKIAkJLyoKIAkJICogSWdub3JlIHRoZSByZXR1cm4gY29kZSBmcm9tIGRvb3JfbG9jaywKIAkJICogc2luY2UgdGhlIG9wZW4oKSBoYXMgYWxyZWFkeSBzdWNjZWVkZWQsCiAJCSAqIGFuZCB0aGUgZG9vcl9sb2NrIGlzIGlycmVsZXZhbnQgYXQgdGhpcyBwb2ludC4KIAkJICovCi0JCWlmIChkcml2ZS0+ZG9vcmxvY2tpbmcgJiYgaWRlZGlza19zZXRfZG9vcmxvY2soZHJpdmUsIDEpKQotCQkJZHJpdmUtPmRvb3Jsb2NraW5nID0gMDsKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0RPT1JMT0NLSU5HKSAmJgorCQkgICAgaWRlZGlza19zZXRfZG9vcmxvY2soZHJpdmUsIDEpKQorCQkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RPT1JMT0NLSU5HOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEwMzAsOSArODY0LDEwIEBACiAJaWYgKGlka3AtPm9wZW5lcnMgPT0gMSkKIAkJaWRlX2NhY2hlZmx1c2hfcChkcml2ZSk7CiAKLQlpZiAoZHJpdmUtPnJlbW92YWJsZSAmJiBpZGtwLT5vcGVuZXJzID09IDEpIHsKLQkJaWYgKGRyaXZlLT5kb29ybG9ja2luZyAmJiBpZGVkaXNrX3NldF9kb29ybG9jayhkcml2ZSwgMCkpCi0JCQlkcml2ZS0+ZG9vcmxvY2tpbmcgPSAwOworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19SRU1PVkFCTEUpICYmIGlka3AtPm9wZW5lcnMgPT0gMSkgeworCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfRE9PUkxPQ0tJTkcpICYmCisJCSAgICBpZGVkaXNrX3NldF9kb29ybG9jayhkcml2ZSwgMCkpCisJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRE9PUkxPQ0tJTkc7CiAJfQogCiAJaWRrcC0+b3BlbmVycy0tOwpAQCAtMTA1Myw3MiArODg4LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWRlZGlza19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGlub2RlLT5pX2JkZXY7Ci0Jc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGlkZV9kaXNrX2coYmRldi0+YmRfZGlzayk7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gaWRrcC0+ZHJpdmU7Ci0JaW50IGVyciwgKCpzZXRmdW5jKShpZGVfZHJpdmVfdCAqLCBpbnQpOwotCXU4ICp2YWw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSERJT19HRVRfQUREUkVTUzoJIHZhbCA9ICZkcml2ZS0+YWRkcmVzc2luZzsJZ290byByZWFkX3ZhbDsKLQljYXNlIEhESU9fR0VUX01VTFRDT1VOVDogdmFsID0gJmRyaXZlLT5tdWx0X2NvdW50Owlnb3RvIHJlYWRfdmFsOwotCWNhc2UgSERJT19HRVRfTk9XRVJSOgkgdmFsID0gJmRyaXZlLT5ub3dlcnI7CQlnb3RvIHJlYWRfdmFsOwotCWNhc2UgSERJT19HRVRfV0NBQ0hFOgkgdmFsID0gJmRyaXZlLT53Y2FjaGU7CQlnb3RvIHJlYWRfdmFsOwotCWNhc2UgSERJT19HRVRfQUNPVVNUSUM6CSB2YWwgPSAmZHJpdmUtPmFjb3VzdGljOwlnb3RvIHJlYWRfdmFsOwotCWNhc2UgSERJT19TRVRfQUREUkVTUzoJIHNldGZ1bmMgPSBzZXRfbGJhX2FkZHJlc3Npbmc7CWdvdG8gc2V0X3ZhbDsKLQljYXNlIEhESU9fU0VUX01VTFRDT1VOVDogc2V0ZnVuYyA9IHNldF9tdWx0Y291bnQ7CWdvdG8gc2V0X3ZhbDsKLQljYXNlIEhESU9fU0VUX05PV0VSUjoJIHNldGZ1bmMgPSBzZXRfbm93ZXJyOwkJZ290byBzZXRfdmFsOwotCWNhc2UgSERJT19TRVRfV0NBQ0hFOgkgc2V0ZnVuYyA9IHdyaXRlX2NhY2hlOwkJZ290byBzZXRfdmFsOwotCWNhc2UgSERJT19TRVRfQUNPVVNUSUM6CSBzZXRmdW5jID0gc2V0X2Fjb3VzdGljOwlnb3RvIHNldF92YWw7Ci0JfQotCi0JcmV0dXJuIGdlbmVyaWNfaWRlX2lvY3RsKGRyaXZlLCBmaWxlLCBiZGV2LCBjbWQsIGFyZyk7Ci0KLXJlYWRfdmFsOgotCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JZXJyID0gKnZhbDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKLQlyZXR1cm4gZXJyID49IDAgPyBwdXRfdXNlcihlcnIsIChsb25nIF9fdXNlciAqKWFyZykgOiBlcnI7Ci0KLXNldF92YWw6Ci0JaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCi0JCWVyciA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCWVyciA9IC1FQUNDRVM7Ci0JCWVsc2UgewotCQkJbXV0ZXhfbG9jaygmaWRlX3NldHRpbmdfbXR4KTsKLQkJCWVyciA9IHNldGZ1bmMoZHJpdmUsIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIGludCBpZGVkaXNrX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGlkZV9kaXNrX2coZGlzayk7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gaWRrcC0+ZHJpdmU7CiAKIAkvKiBkbyBub3Qgc2NhbiBwYXJ0aXRpb25zIHR3aWNlIGlmIHRoaXMgaXMgYSByZW1vdmFibGUgZGV2aWNlICovCi0JaWYgKGRyaXZlLT5hdHRhY2gpIHsKLQkJZHJpdmUtPmF0dGFjaCA9IDA7CisJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfQVRUQUNIKSB7CisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19BVFRBQ0g7CiAJCXJldHVybiAwOwogCX0KKwogCS8qIGlmIHJlbW92YWJsZSwgYWx3YXlzIGFzc3VtZSBpdCB3YXMgY2hhbmdlZCAqLwotCXJldHVybiBkcml2ZS0+cmVtb3ZhYmxlOworCXJldHVybiAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1JFTU9WQUJMRSk7CiB9CiAKIHN0YXRpYyBpbnQgaWRlZGlza19yZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqaWRrcCA9IGlkZV9kaXNrX2coZGlzayk7Ci0Jc2V0X2NhcGFjaXR5KGRpc2ssIGlkZWRpc2tfY2FwYWNpdHkoaWRrcC0+ZHJpdmUpKTsKKwlzZXRfY2FwYWNpdHkoZGlzaywgaWRlX2Rpc2tfY2FwYWNpdHkoaWRrcC0+ZHJpdmUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEyNiw3ICs5MTQsNyBAQAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCQk9IGlkZWRpc2tfb3BlbiwKIAkucmVsZWFzZQkJPSBpZGVkaXNrX3JlbGVhc2UsCi0JLmlvY3RsCQkJPSBpZGVkaXNrX2lvY3RsLAorCS5pb2N0bAkJCT0gaWRlX2Rpc2tfaW9jdGwsCiAJLmdldGdlbwkJCT0gaWRlZGlza19nZXRnZW8sCiAJLm1lZGlhX2NoYW5nZWQJCT0gaWRlZGlza19tZWRpYV9jaGFuZ2VkLAogCS5yZXZhbGlkYXRlX2Rpc2sJPSBpZGVkaXNrX3JldmFsaWRhdGVfZGlzawpAQCAtMTE0Miw4ICs5MzAsNyBAQAogCS8qIHN0cnN0cigiZm9vIiwgIiIpIGlzIG5vbi1OVUxMICovCiAJaWYgKCFzdHJzdHIoImlkZS1kaXNrIiwgZHJpdmUtPmRyaXZlcl9yZXEpKQogCQlnb3RvIGZhaWxlZDsKLQlpZiAoIWRyaXZlLT5wcmVzZW50KQotCQlnb3RvIGZhaWxlZDsKKwogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCiAJCWdvdG8gZmFpbGVkOwogCkBAIC0xMTUxLDE1ICs5MzgsMTIgQEAKIAlpZiAoIWlka3ApCiAJCWdvdG8gZmFpbGVkOwogCi0JZyA9IGFsbG9jX2Rpc2tfbm9kZSgxIDw8IFBBUlROX0JJVFMsCi0JCQlod2lmX3RvX25vZGUoZHJpdmUtPmh3aWYpKTsKKwlnID0gYWxsb2NfZGlza19ub2RlKElERV9ESVNLX01JTk9SUywgaHdpZl90b19ub2RlKGRyaXZlLT5od2lmKSk7CiAJaWYgKCFnKQogCQlnb3RvIG91dF9mcmVlX2lka3A7CiAKIAlpZGVfaW5pdF9kaXNrKGcsIGRyaXZlKTsKIAotCWlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihkcml2ZSwgJmlkZWRpc2tfZHJpdmVyKTsKLQogCWtyZWZfaW5pdCgmaWRrcC0+a3JlZik7CiAKIAlpZGtwLT5kcml2ZSA9IGRyaXZlOwpAQCAtMTE3MSwxNyArOTU1LDIwIEBACiAJZHJpdmUtPmRyaXZlcl9kYXRhID0gaWRrcDsKIAogCWlkZWRpc2tfc2V0dXAoZHJpdmUpOwotCWlmICgoIWRyaXZlLT5oZWFkIHx8IGRyaXZlLT5oZWFkID4gMTYpICYmICFkcml2ZS0+c2VsZWN0LmIubGJhKSB7CisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQSkgPT0gMCAmJgorCSAgICAoZHJpdmUtPmhlYWQgPT0gMCB8fCBkcml2ZS0+aGVhZCA+IDE2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJTlZBTElEIEdFT01FVFJZOiAlZCBQSFlTSUNBTCBIRUFEUz9cbiIsCiAJCQlkcml2ZS0+bmFtZSwgZHJpdmUtPmhlYWQpOwotCQlkcml2ZS0+YXR0YWNoID0gMDsKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0FUVEFDSDsKIAl9IGVsc2UKLQkJZHJpdmUtPmF0dGFjaCA9IDE7CisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0FUVEFDSDsKIAotCWctPm1pbm9ycyA9IDEgPDwgUEFSVE5fQklUUzsKKwlnLT5taW5vcnMgPSBJREVfRElTS19NSU5PUlM7CiAJZy0+ZHJpdmVyZnNfZGV2ID0gJmRyaXZlLT5nZW5kZXY7Ci0JZy0+ZmxhZ3MgPSBkcml2ZS0+cmVtb3ZhYmxlID8gR0VOSERfRkxfUkVNT1ZBQkxFIDogMDsKLQlzZXRfY2FwYWNpdHkoZywgaWRlZGlza19jYXBhY2l0eShkcml2ZSkpOworCWctPmZsYWdzIHw9IEdFTkhEX0ZMX0VYVF9ERVZUOworCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1JFTU9WQUJMRSkKKwkJZy0+ZmxhZ3MgPSBHRU5IRF9GTF9SRU1PVkFCTEU7CisJc2V0X2NhcGFjaXR5KGcsIGlkZV9kaXNrX2NhcGFjaXR5KGRyaXZlKSk7CiAJZy0+Zm9wcyA9ICZpZGVkaXNrX29wczsKIAlhZGRfZGlzayhnKTsKIAlyZXR1cm4gMDsKQEAgLTEyMDMsNiArOTkwLDcgQEAKIH0KIAogTU9EVUxFX0FMSUFTKCJpZGU6Km0tZGlzayoiKTsKK01PRFVMRV9BTElBUygiaWRlLWRpc2siKTsKIG1vZHVsZV9pbml0KGlkZWRpc2tfaW5pdCk7CiBtb2R1bGVfZXhpdChpZGVkaXNrX2V4aXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suaCBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyZmE0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfX0lERV9ESVNLX0gKKyNkZWZpbmUgX19JREVfRElTS19ICisKK3N0cnVjdCBpZGVfZGlza19vYmogeworCWlkZV9kcml2ZV90CSpkcml2ZTsKKwlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKKwlzdHJ1Y3Qga3JlZglrcmVmOworCXVuc2lnbmVkIGludAlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KK307CisKKyNkZWZpbmUgaWRlX2Rpc2tfZyhkaXNrKSBcCisJY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaWRlX2Rpc2tfb2JqLCBkcml2ZXIpCisKKy8qIGlkZS1kaXNrLmMgKi8KK3NlY3Rvcl90IGlkZV9kaXNrX2NhcGFjaXR5KGlkZV9kcml2ZV90ICopOworaWRlX2RlY2xfZGV2c2V0KGFkZHJlc3MpOworaWRlX2RlY2xfZGV2c2V0KG11bHRjb3VudCk7CitpZGVfZGVjbF9kZXZzZXQobm93ZXJyKTsKK2lkZV9kZWNsX2RldnNldCh3Y2FjaGUpOworaWRlX2RlY2xfZGV2c2V0KGFjb3VzdGljKTsKKworLyogaWRlLWRpc2tfaW9jdGwuYyAqLworaW50IGlkZV9kaXNrX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCisjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCisvKiBpZGUtZGlza19wcm9jLmMgKi8KK2V4dGVybiBpZGVfcHJvY19lbnRyeV90IGlkZV9kaXNrX3Byb2NbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0IGlkZV9kaXNrX3NldHRpbmdzW107CisjZW5kaWYKKworI2VuZGlmIC8qIF9fSURFX0RJU0tfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2tfaW9jdGwuYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjZjFhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZGlza19pb2N0bC5jCkBAIC0wLDAgKzEsMjkgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorCisjaW5jbHVkZSAiaWRlLWRpc2suaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfaW9jdGxfZGV2c2V0IGlkZV9kaXNrX2lvY3RsX3NldHRpbmdzW10gPSB7Cit7IEhESU9fR0VUX0FERFJFU1MsCUhESU9fU0VUX0FERFJFU1MsICAgJmlkZV9kZXZzZXRfYWRkcmVzcyAgIH0sCit7IEhESU9fR0VUX01VTFRDT1VOVCwJSERJT19TRVRfTVVMVENPVU5ULCAmaWRlX2RldnNldF9tdWx0Y291bnQgfSwKK3sgSERJT19HRVRfTk9XRVJSLAlIRElPX1NFVF9OT1dFUlIsICAgICZpZGVfZGV2c2V0X25vd2VycgkgIH0sCit7IEhESU9fR0VUX1dDQUNIRSwJSERJT19TRVRfV0NBQ0hFLCAgICAmaWRlX2RldnNldF93Y2FjaGUJICB9LAoreyBIRElPX0dFVF9BQ09VU1RJQywJSERJT19TRVRfQUNPVVNUSUMsICAmaWRlX2RldnNldF9hY291c3RpYyAgfSwKK3sgMCB9Cit9OworCitpbnQgaWRlX2Rpc2tfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBpbm9kZS0+aV9iZGV2OworCXN0cnVjdCBpZGVfZGlza19vYmogKmlka3AgPSBpZGVfZGlza19nKGJkZXYtPmJkX2Rpc2spOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGlka3AtPmRyaXZlOworCWludCBlcnI7CisKKwllcnIgPSBpZGVfc2V0dGluZ19pb2N0bChkcml2ZSwgYmRldiwgY21kLCBhcmcsIGlkZV9kaXNrX2lvY3RsX3NldHRpbmdzKTsKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGdlbmVyaWNfaWRlX2lvY3RsKGRyaXZlLCBmaWxlLCBiZGV2LCBjbWQsIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlza19wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlza19wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyNDk3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrX3Byb2MuYwpAQCAtMCwwICsxLDEyOSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisKKyNpbmNsdWRlICJpZGUtZGlzay5oIgorCitzdGF0aWMgaW50IHNtYXJ0X2VuYWJsZShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX3Rhc2tfdCBhcmdzOworCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJmFyZ3MudGY7CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CisJdGYtPmZlYXR1cmUgPSBBVEFfU01BUlRfRU5BQkxFOworCXRmLT5sYmFtICAgID0gQVRBX1NNQVJUX0xCQU1fUEFTUzsKKwl0Zi0+bGJhaCAgICA9IEFUQV9TTUFSVF9MQkFIX1BBU1M7CisJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX1NNQVJUOworCWFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOworCXJldHVybiBpZGVfbm9fZGF0YV90YXNrZmlsZShkcml2ZSwgJmFyZ3MpOworfQorCitzdGF0aWMgaW50IGdldF9zbWFydF9kYXRhKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggKmJ1ZiwgdTggc3ViX2NtZCkKK3sKKwlpZGVfdGFza190IGFyZ3M7CisJc3RydWN0IGlkZV90YXNrZmlsZSAqdGYgPSAmYXJncy50ZjsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwl0Zi0+ZmVhdHVyZSA9IHN1Yl9jbWQ7CisJdGYtPm5zZWN0ICAgPSAweDAxOworCXRmLT5sYmFtICAgID0gQVRBX1NNQVJUX0xCQU1fUEFTUzsKKwl0Zi0+bGJhaCAgICA9IEFUQV9TTUFSVF9MQkFIX1BBU1M7CisJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX1NNQVJUOworCWFyZ3MudGZfZmxhZ3MJPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOworCWFyZ3MuZGF0YV9waGFzZQk9IFRBU0tGSUxFX0lOOworCSh2b2lkKSBzbWFydF9lbmFibGUoZHJpdmUpOworCXJldHVybiBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmYXJncywgYnVmLCAxKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9jYWNoZQorCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKKwljaGFyCQkqb3V0ID0gcGFnZTsKKwlpbnQJCWxlbjsKKworCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0lEX1JFQUQpCisJCWxlbiA9IHNwcmludGYob3V0LCAiJWlcbiIsIGRyaXZlLT5pZFtBVEFfSURfQlVGX1NJWkVdIC8gMik7CisJZWxzZQorCQlsZW4gPSBzcHJpbnRmKG91dCwgIihub25lKVxuIik7CisKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitzdGF0aWMgaW50IHByb2NfaWRlZGlza19yZWFkX2NhcGFjaXR5CisJKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlkZV9kcml2ZV90KmRyaXZlID0gKGlkZV9kcml2ZV90ICopZGF0YTsKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWxsdVxuIiwgKGxvbmcgbG9uZylpZGVfZGlza19jYXBhY2l0eShkcml2ZSkpOworCisJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKworc3RhdGljIGludCBwcm9jX2lkZWRpc2tfcmVhZF9zbWFydChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhLCB1OCBzdWJfY21kKQoreworCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJaW50CQlsZW4gPSAwLCBpID0gMDsKKworCWlmIChnZXRfc21hcnRfZGF0YShkcml2ZSwgcGFnZSwgc3ViX2NtZCkgPT0gMCkgeworCQl1bnNpZ25lZCBzaG9ydCAqdmFsID0gKHVuc2lnbmVkIHNob3J0ICopIHBhZ2U7CisJCWNoYXIgKm91dCA9IChjaGFyICopdmFsICsgU0VDVE9SX1NJWkU7CisKKwkJcGFnZSA9IG91dDsKKwkJZG8geworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTA0eCVjIiwgbGUxNl90b19jcHUoKnZhbCksCisJCQkJICAgICAgICgrK2kgJiA3KSA/ICcgJyA6ICdcbicpOworCQkJdmFsICs9IDE7CisJCX0gd2hpbGUgKGkgPCBTRUNUT1JfU0laRSAvIDIpOworCQlsZW4gPSBvdXQgLSBwYWdlOworCX0KKworCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVkaXNrX3JlYWRfc3YKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHByb2NfaWRlZGlza19yZWFkX3NtYXJ0KHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGRhdGEsCisJCQkJICAgICAgIEFUQV9TTUFSVF9SRUFEX1ZBTFVFUyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19pZGVkaXNrX3JlYWRfc3QKKwkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHByb2NfaWRlZGlza19yZWFkX3NtYXJ0KHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGRhdGEsCisJCQkJICAgICAgIEFUQV9TTUFSVF9SRUFEX1RIUkVTSE9MRFMpOworfQorCitpZGVfcHJvY19lbnRyeV90IGlkZV9kaXNrX3Byb2NbXSA9IHsKKwl7ICJjYWNoZSIsCSAgU19JRlJFR3xTX0lSVUdPLCBwcm9jX2lkZWRpc2tfcmVhZF9jYWNoZSwgICAgTlVMTCB9LAorCXsgImNhcGFjaXR5IiwJICBTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlZGlza19yZWFkX2NhcGFjaXR5LCBOVUxMIH0sCisJeyAiZ2VvbWV0cnkiLAkgIFNfSUZSRUd8U19JUlVHTywgcHJvY19pZGVfcmVhZF9nZW9tZXRyeSwgICAgIE5VTEwgfSwKKwl7ICJzbWFydF92YWx1ZXMiLCBTX0lGUkVHfFNfSVJVU1IsIHByb2NfaWRlZGlza19yZWFkX3N2LCAgICAgICBOVUxMIH0sCisJeyAic21hcnRfdGhyZXNob2xkcyIsIFNfSUZSRUd8U19JUlVTUiwgcHJvY19pZGVkaXNrX3JlYWRfc3QsICAgTlVMTCB9LAorCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Cit9OworCitpZGVfZGV2c2V0X3J3X2ZpZWxkKGJpb3NfY3lsLCBiaW9zX2N5bCk7CitpZGVfZGV2c2V0X3J3X2ZpZWxkKGJpb3NfaGVhZCwgYmlvc19oZWFkKTsKK2lkZV9kZXZzZXRfcndfZmllbGQoYmlvc19zZWN0LCBiaW9zX3NlY3QpOworaWRlX2RldnNldF9yd19maWVsZChmYWlsdXJlcywgZmFpbHVyZXMpOworaWRlX2RldnNldF9yd19maWVsZChsdW4sIGx1bik7CitpZGVfZGV2c2V0X3J3X2ZpZWxkKG1heF9mYWlsdXJlcywgbWF4X2ZhaWx1cmVzKTsKKworY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCBpZGVfZGlza19zZXR0aW5nc1tdID0geworCUlERV9QUk9DX0RFVlNFVChhY291c3RpYywJMCwgICAyNTQpLAorCUlERV9QUk9DX0RFVlNFVChhZGRyZXNzLAkwLCAgICAgMiksCisJSURFX1BST0NfREVWU0VUKGJpb3NfY3lsLAkwLCA2NTUzNSksCisJSURFX1BST0NfREVWU0VUKGJpb3NfaGVhZCwJMCwgICAyNTUpLAorCUlERV9QUk9DX0RFVlNFVChiaW9zX3NlY3QsCTAsICAgIDYzKSwKKwlJREVfUFJPQ19ERVZTRVQoZmFpbHVyZXMsCTAsIDY1NTM1KSwKKwlJREVfUFJPQ19ERVZTRVQobHVuLAkJMCwgICAgIDcpLAorCUlERV9QUk9DX0RFVlNFVChtYXhfZmFpbHVyZXMsCTAsIDY1NTM1KSwKKwlJREVfUFJPQ19ERVZTRVQobXVsdGNvdW50LAkwLCAgICAxNiksCisJSURFX1BST0NfREVWU0VUKG5vd2VyciwJCTAsICAgICAxKSwKKwlJREVfUFJPQ19ERVZTRVQod2NhY2hlLAkJMCwgICAgIDEpLAorCXsgMCB9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDM3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCkBAIC0wLDAgKzEsMzU2IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoqCisgKgljb25maWdfZHJpdmVfZm9yX2RtYQktCWF0dGVtcHQgdG8gYWN0aXZhdGUgSURFIERNQQorICoJQGRyaXZlOiB0aGUgZHJpdmUgdG8gcGxhY2UgaW4gRE1BIG1vZGUKKyAqCisgKglJZiB0aGUgZHJpdmUgc3VwcG9ydHMgYXQgbGVhc3QgbW9kZSAyIERNQSBvciBVRE1BIG9mIGFueSBraW5kCisgKgl0aGVuIGF0dGVtcHQgdG8gcGxhY2UgaXQgaW50byBETUEgbW9kZS4gRHJpdmVzIHRoYXQgYXJlIGtub3duIHRvCisgKglzdXBwb3J0IERNQSBidXQgcHJlZGF0ZSB0aGUgRE1BIHByb3BlcnRpZXMgb3IgdGhhdCBhcmUga25vd24KKyAqCXRvIGhhdmUgRE1BIGhhbmRsaW5nIGJ1Z3MgYXJlIGFsc28gc2V0IHVwIGFwcHJvcHJpYXRlbHkgYmFzZWQKKyAqCW9uIHRoZSBnb29kL2JhZCBkcml2ZSBsaXN0cy4KKyAqLworCitpbnQgY29uZmlnX2RyaXZlX2Zvcl9kbWEoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwl1MTYgKmlkID0gZHJpdmUtPmlkOworCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgeworCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19BVEFQSV9ETUEpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBETUEgb24gYW55IGRyaXZlIHRoYXQgaGFzCisJICogVWx0cmFETUEgKG1vZGUgMC8xLzIvMy80LzUvNikgZW5hYmxlZAorCSAqLworCWlmICgoaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDQpICYmCisJICAgICgoaWRbQVRBX0lEX1VETUFfTU9ERVNdID4+IDgpICYgMHg3ZikpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBFbmFibGUgRE1BIG9uIGFueSBkcml2ZSB0aGF0IGhhcyBtb2RlMiBETUEKKwkgKiAobXVsdGkgb3Igc2luZ2xlKSBlbmFibGVkCisJICovCisJaWYgKGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKQkvKiByZWd1bGFyIERNQSAqLworCQlpZiAoKGlkW0FUQV9JRF9NV0RNQV9NT0RFU10gJiAweDQwNCkgPT0gMHg0MDQgfHwKKwkJICAgIChpZFtBVEFfSURfU1dETUFfTU9ERVNdICYgMHg0MDQpID09IDB4NDA0KQorCQkJcmV0dXJuIDE7CisKKwkvKiBDb25zdWx0IHRoZSBsaXN0IG9mIGtub3duICJnb29kIiBkcml2ZXMgKi8KKwlpZiAoaWRlX2RtYV9nb29kX2RyaXZlKGRyaXZlKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpZGVfZG1hX2hvc3Rfc2V0CS0JRW5hYmxlL2Rpc2FibGUgRE1BIG9uIGEgaG9zdAorICoJQGRyaXZlOiBkcml2ZSB0byBjb250cm9sCisgKgorICoJRW5hYmxlL2Rpc2FibGUgRE1BIG9uIGFuIElERSBjb250cm9sbGVyIGZvbGxvd2luZyBnZW5lcmljCisgKglidXMtbWFzdGVyaW5nIElERSBjb250cm9sbGVyIGJlaGF2aW91ci4KKyAqLworCit2b2lkIGlkZV9kbWFfaG9zdF9zZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgb24pCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCisJaWYgKG9uKQorCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKKwllbHNlCisJCWRtYV9zdGF0ICY9IH4oMSA8PCAoNSArIHVuaXQpKTsKKworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJCXdyaXRlYihkbWFfc3RhdCwKKwkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOworCWVsc2UKKwkJb3V0YihkbWFfc3RhdCwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX2hvc3Rfc2V0KTsKKworLyoqCisgKglpZGVfYnVpbGRfZG1hdGFibGUJLQlidWlsZCBJREUgRE1BIHRhYmxlCisgKgorICoJaWRlX2J1aWxkX2RtYXRhYmxlKCkgcHJlcGFyZXMgYSBkbWEgcmVxdWVzdC4gV2UgbWFwIHRoZSBjb21tYW5kCisgKgl0byBnZXQgdGhlIHBjaSBidXMgYWRkcmVzc2VzIG9mIHRoZSBidWZmZXJzIGFuZCB0aGVuIGJ1aWxkIHVwCisgKgl0aGUgUFJEIHRhYmxlIHRoYXQgdGhlIElERSBsYXllciB3YW50cyB0byBiZSBmZWQuCisgKgorICoJTW9zdCBjaGlwc2V0cyBjb3JyZWN0bHkgaW50ZXJwcmV0IGEgbGVuZ3RoIG9mIDB4MDAwMCBhcyA2NEtCLAorICoJYnV0IGF0IGxlYXN0IG9uZSAoZS5nLiBDUzU1MzApIG1pc2ludGVycHJldHMgaXQgYXMgemVybyAoISkuCisgKglTbyB3ZSBicmVhayB0aGUgNjRLQiBlbnRyeSBpbnRvIHR3byAzMktCIGVudHJpZXMgaW5zdGVhZC4KKyAqCisgKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVpbHQgUFJEIGVudHJpZXMgaWYgYWxsIHdlbnQgb2theSwKKyAqCXJldHVybnMgMCBvdGhlcndpc2UuCisgKgorICoJTWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHRybTI5MC5jCisgKi8KKworaW50IGlkZV9idWlsZF9kbWF0YWJsZShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJX19sZTMyICp0YWJsZSA9IChfX2xlMzIgKilod2lmLT5kbWF0YWJsZV9jcHU7CisJdW5zaWduZWQgaW50IGlzX3RybTI5MAk9IChod2lmLT5jaGlwc2V0ID09IGlkZV90cm0yOTApID8gMSA6IDA7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJaHdpZi0+c2dfbmVudHMgPSBpZGVfYnVpbGRfc2dsaXN0KGRyaXZlLCBycSk7CisJaWYgKGh3aWYtPnNnX25lbnRzID09IDApCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfc2coaHdpZi0+c2dfdGFibGUsIHNnLCBod2lmLT5zZ19uZW50cywgaSkgeworCQl1MzIgY3VyX2FkZHIsIGN1cl9sZW4sIHhjb3VudCwgYmNvdW50OworCisJCWN1cl9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQljdXJfbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgZG1hIHRhYmxlLCB3aXRob3V0IGNyb3NzaW5nIGFueSA2NGtCIGJvdW5kYXJpZXMuCisJCSAqIE1vc3QgaGFyZHdhcmUgcmVxdWlyZXMgMTYtYml0IGFsaWdubWVudCBvZiBhbGwgYmxvY2tzLAorCQkgKiBidXQgdGhlIHRybTI5MCByZXF1aXJlcyAzMi1iaXQgYWxpZ25tZW50LgorCQkgKi8KKworCQl3aGlsZSAoY3VyX2xlbikgeworCQkJaWYgKGNvdW50KysgPj0gUFJEX0VOVFJJRVMpCisJCQkJZ290byB1c2VfcGlvX2luc3RlYWQ7CisKKwkJCWJjb3VudCA9IDB4MTAwMDAgLSAoY3VyX2FkZHIgJiAweGZmZmYpOworCQkJaWYgKGJjb3VudCA+IGN1cl9sZW4pCisJCQkJYmNvdW50ID0gY3VyX2xlbjsKKwkJCSp0YWJsZSsrID0gY3B1X3RvX2xlMzIoY3VyX2FkZHIpOworCQkJeGNvdW50ID0gYmNvdW50ICYgMHhmZmZmOworCQkJaWYgKGlzX3RybTI5MCkKKwkJCQl4Y291bnQgPSAoKHhjb3VudCA+PiAyKSAtIDEpIDw8IDE2OworCQkJaWYgKHhjb3VudCA9PSAweDAwMDApIHsKKwkJCQlpZiAoY291bnQrKyA+PSBQUkRfRU5UUklFUykKKwkJCQkJZ290byB1c2VfcGlvX2luc3RlYWQ7CisJCQkJKnRhYmxlKysgPSBjcHVfdG9fbGUzMigweDgwMDApOworCQkJCSp0YWJsZSsrID0gY3B1X3RvX2xlMzIoY3VyX2FkZHIgKyAweDgwMDApOworCQkJCXhjb3VudCA9IDB4ODAwMDsKKwkJCX0KKwkJCSp0YWJsZSsrID0gY3B1X3RvX2xlMzIoeGNvdW50KTsKKwkJCWN1cl9hZGRyICs9IGJjb3VudDsKKwkJCWN1cl9sZW4gLT0gYmNvdW50OworCQl9CisJfQorCisJaWYgKGNvdW50KSB7CisJCWlmICghaXNfdHJtMjkwKQorCQkJKi0tdGFibGUgfD0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCXJldHVybiBjb3VudDsKKwl9CisKK3VzZV9waW9faW5zdGVhZDoKKwlwcmludGsoS0VSTl9FUlIgIiVzOiAlc1xuIiwgZHJpdmUtPm5hbWUsCisJCWNvdW50ID8gIkRNQSB0YWJsZSB0b28gc21hbGwiIDogImVtcHR5IERNQSB0YWJsZT8iKTsKKworCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsKKworCXJldHVybiAwOyAvKiByZXZlcnQgdG8gUElPIGZvciB0aGlzIHJlcXVlc3QgKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9idWlsZF9kbWF0YWJsZSk7CisKKy8qKgorICoJaWRlX2RtYV9zZXR1cAktCWJlZ2luIGEgRE1BIHBoYXNlCisgKglAZHJpdmU6IHRhcmdldCBkZXZpY2UKKyAqCisgKglCdWlsZCBhbiBJREUgRE1BIFBSRCAoSURFIHNwZWFrIGZvciBzY2F0dGVyIGdhdGhlciB0YWJsZSkKKyAqCWFuZCB0aGVuIHNldCB1cCB0aGUgRE1BIHRyYW5zZmVyIHJlZ2lzdGVycyBmb3IgYSBkZXZpY2UKKyAqCXRoYXQgZm9sbG93cyBnZW5lcmljIElERSBQQ0kgRE1BIGJlaGF2aW91ci4gQ29udHJvbGxlcnMgY2FuCisgKglvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZXkgbmVlZCB0bworICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzLiBJZiBhIFBJTyBmYWxsYmFjayBpcyByZXF1aXJlZCB0aGVuIDEKKyAqCWlzIHJldHVybmVkLgorICovCisKK2ludCBpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJdW5zaWduZWQgaW50IHJlYWRpbmc7CisJdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7CisJdTggZG1hX3N0YXQ7CisKKwlpZiAocnFfZGF0YV9kaXIocnEpKQorCQlyZWFkaW5nID0gMDsKKwllbHNlCisJCXJlYWRpbmcgPSAxIDw8IDM7CisKKwkvKiBmYWxsIGJhY2sgdG8gcGlvISAqLworCWlmICghaWRlX2J1aWxkX2RtYXRhYmxlKGRyaXZlLCBycSkpIHsKKwkJaWRlX21hcF9zZyhkcml2ZSwgcnEpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBQUkQgdGFibGUgKi8KKwlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQorCQl3cml0ZWwoaHdpZi0+ZG1hdGFibGVfZG1hLAorCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfVEFCTEVfT0ZTKSk7CisJZWxzZQorCQlvdXRsKGh3aWYtPmRtYXRhYmxlX2RtYSwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1RBQkxFX09GUyk7CisKKwkvKiBzcGVjaWZ5IHIvdyAqLworCWlmIChtbWlvKQorCQl3cml0ZWIocmVhZGluZywgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7CisJZWxzZQorCQlvdXRiKHJlYWRpbmcsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOworCisJLyogcmVhZCBETUEgc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KKwlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKworCS8qIGNsZWFyIElOVFIgJiBFUlJPUiBmbGFncyAqLworCWlmIChtbWlvKQorCQl3cml0ZWIoZG1hX3N0YXQgfCA2LAorCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7CisJZWxzZQorCQlvdXRiKGRtYV9zdGF0IHwgNiwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfc2V0dXApOworCisvKioKKyAqCWRtYV90aW1lcl9leHBpcnkJLQloYW5kbGUgYSBETUEgdGltZW91dAorICoJQGRyaXZlOiBEcml2ZSB0aGF0IHRpbWVkIG91dAorICoKKyAqCUFuIElERSBETUEgdHJhbnNmZXIgdGltZWQgb3V0LiBJbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3Igd2UgYXNrCisgKgl0aGUgZHJpdmVyIHRvIHJlc29sdmUgdGhlIHByb2JsZW0sIGlmIGEgRE1BIHRyYW5zZmVyIGlzIHN0aWxsCisgKglpbiBwcm9ncmVzcyB3ZSBjb250aW51ZSB0byB3YWl0IChhcmd1YWJseSB3ZSBuZWVkIHRvIGFkZCBhCisgKglzZWNvbmRhcnkgJ0kgZG9uJ3QgY2FyZSB3aGF0IHRoZSBkcml2ZSB0aGlua3MnIHRpbWVvdXQgaGVyZSkKKyAqCUZpbmFsbHkgaWYgd2UgaGF2ZSBhbiBpbnRlcnJ1cHQgd2UgbGV0IGl0IGNvbXBsZXRlIHRoZSBJL08uCisgKglCdXQgb25seSBvbmUgdGltZSAtIHdlIGNsZWFyIGV4cGlyeSBhbmQgaWYgaXQncyBzdGlsbCBub3QKKyAqCWNvbXBsZXRlZCBhZnRlciBXQUlUX0NNRCwgd2UgZXJyb3IgYW5kIHJldHJ5IGluIFBJTy4KKyAqCVRoaXMgY2FuIG9jY3VyIGlmIGFuIGludGVycnVwdCBpcyBsb3N0IG9yIGR1ZSB0byBoYW5nIG9yIGJ1Z3MuCisgKi8KKworc3RhdGljIGludCBkbWFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXM6IERNQSBzdGF0dXMgKDB4JTAyeClcbiIsCisJCWRyaXZlLT5uYW1lLCBfX2Z1bmNfXywgZG1hX3N0YXQpOworCisJaWYgKChkbWFfc3RhdCAmIDB4MTgpID09IDB4MTgpCS8qIEJVU1kgU3R1cGlkIEVhcmx5IFRpbWVyICEhICovCisJCXJldHVybiBXQUlUX0NNRDsKKworCWh3aWYtPmh3Z3JvdXAtPmV4cGlyeSA9IE5VTEw7CS8qIG9uZSBmcmVlIHJpZGUgZm9yIG5vdyAqLworCisJLyogMSBkbWFpbmcsIDIgZXJyb3IsIDQgaW50ciAqLworCWlmIChkbWFfc3RhdCAmIDIpCS8qIEVSUk9SICovCisJCXJldHVybiAtMTsKKworCWlmIChkbWFfc3RhdCAmIDEpCS8qIERNQWluZyAqLworCQlyZXR1cm4gV0FJVF9DTUQ7CisKKwlpZiAoZG1hX3N0YXQgJiA0KQkvKiBHb3QgYW4gSW50ZXJydXB0ICovCisJCXJldHVybiBXQUlUX0NNRDsKKworCXJldHVybiAwOwkvKiBTdGF0dXMgaXMgdW5rbm93biAtLSByZXNldCB0aGUgYnVzICovCit9CisKK3ZvaWQgaWRlX2RtYV9leGVjX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNvbW1hbmQpCit7CisJLyogaXNzdWUgY21kIHRvIGRyaXZlICovCisJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgY29tbWFuZCwgJmlkZV9kbWFfaW50ciwgMiAqIFdBSVRfQ01ELAorCQkJICAgIGRtYV90aW1lcl9leHBpcnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV9leGVjX2NtZCk7CisKK3ZvaWQgaWRlX2RtYV9zdGFydChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXU4IGRtYV9jbWQ7CisKKwkvKiBOb3RlIHRoYXQgdGhpcyBpcyBkb25lICphZnRlciogdGhlIGNtZCBoYXMKKwkgKiBiZWVuIGlzc3VlZCB0byB0aGUgZHJpdmUsIGFzIHBlciB0aGUgQk0tSURFIHNwZWMuCisJICogVGhlIFByb21pc2UgVWx0cmEzMyBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IHdoZW4KKwkgKiB3ZSBkbyB0aGlzIHBhcnQgYmVmb3JlIGlzc3VpbmcgdGhlIGRyaXZlIGNtZC4KKwkgKi8KKwlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSB7CisJCWRtYV9jbWQgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKKwkJLyogc3RhcnQgRE1BICovCisJCXdyaXRlYihkbWFfY21kIHwgMSwKKwkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOworCX0gZWxzZSB7CisJCWRtYV9jbWQgPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CisJCW91dGIoZG1hX2NtZCB8IDEsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOworCX0KKworCXdtYigpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV9zdGFydCk7CisKKy8qIHJldHVybnMgMSBvbiBlcnJvciwgMCBvdGhlcndpc2UgKi8KK2ludCBpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXU4IG1taW8gPSAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKSA/IDEgOiAwOworCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CisKKwlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKKworCWlmIChtbWlvKSB7CisJCS8qIGdldCBETUEgY29tbWFuZCBtb2RlICovCisJCWRtYV9jbWQgPSByZWFkYigodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKKwkJLyogc3RvcCBETUEgKi8KKwkJd3JpdGViKGRtYV9jbWQgJiB+MSwKKwkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOworCX0gZWxzZSB7CisJCWRtYV9jbWQgPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7CisJCW91dGIoZG1hX2NtZCAmIH4xLCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKKwl9CisKKwkvKiBnZXQgRE1BIHN0YXR1cyAqLworCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCisJaWYgKG1taW8pCisJCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLworCQl3cml0ZWIoZG1hX3N0YXQgfCA2LAorCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7CisJZWxzZQorCQlvdXRiKGRtYV9zdGF0IHwgNiwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisKKwkvKiBwdXJnZSBETUEgbWFwcGluZ3MgKi8KKwlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisJLyogdmVyaWZ5IGdvb2QgRE1BIHN0YXR1cyAqLworCXdtYigpOworCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0ID8gKDB4MTAgfCBkbWFfc3RhdCkgOiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV9lbmQpOworCisvKiByZXR1cm5zIDEgaWYgZG1hIGlycSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCitpbnQgaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCisJLyogcmV0dXJuIDEgaWYgSU5UUiBhc3NlcnRlZCAqLworCWlmICgoZG1hX3N0YXQgJiA0KSA9PSA0KQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV90ZXN0X2lycSk7CisKK2NvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBzZmZfZG1hX29wcyA9IHsKKwkuZG1hX2hvc3Rfc2V0CQk9IGlkZV9kbWFfaG9zdF9zZXQsCisJLmRtYV9zZXR1cAkJPSBpZGVfZG1hX3NldHVwLAorCS5kbWFfZXhlY19jbWQJCT0gaWRlX2RtYV9leGVjX2NtZCwKKwkuZG1hX3N0YXJ0CQk9IGlkZV9kbWFfc3RhcnQsCisJLmRtYV9lbmQJCT0gaWRlX2RtYV9lbmQsCisJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAorCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNmZl9kbWFfb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwppbmRleCBhZGM2ODI3Li5mZmZkMTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCkBAIC0yOCwyNCArMjgsMTMgQEAKICAqIGZvciBzdXBwbHlpbmcgYSBQcm9taXNlIFVETUEgYm9hcmQgJiBXRCBVRE1BIGRyaXZlIGZvciB0aGlzIHdvcmshCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5IGRyaXZlX3doaXRlbGlzdCBbXSA9IHsKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5IGRyaXZlX3doaXRlbGlzdFtdID0gewogCXsgIk1pY3JvcG9saXMgMjExMkEiCSwgICAgICAgTlVMTAkJfSwKIAl7ICJDT05ORVIgQ1RNQSA0MDAwIgksICAgICAgIE5VTEwJCX0sCiAJeyAiQ09OTkVSIENUVDgwMDAtQSIJLCAgICAgICBOVUxMCQl9LApAQCAtNTMsOCArNDIsNyBAQAogCXsgTlVMTAkJCSwJTlVMTAkJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5IGRyaXZlX2JsYWNrbGlzdCBbXSA9IHsKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5IGRyaXZlX2JsYWNrbGlzdFtdID0gewogCXsgIldEQyBBQzExMDAwSCIJLAlOVUxMIAkJfSwKIAl7ICJXREMgQUMyMjEwMEgiCSwJTlVMTCAJCX0sCiAJeyAiV0RDIEFDMzI1MDBIIgksCU5VTEwgCQl9LApAQCAtOTQsMTEgKzgyLDExIEBACiAgKglpZGVfZG1hX2ludHIJLQlJREUgRE1BIGludGVycnVwdCBoYW5kbGVyCiAgKglAZHJpdmU6IHRoZSBkcml2ZSB0aGUgaW50ZXJydXB0IGlzIGZvcgogICoKLSAqCUhhbmRsZSBhbiBpbnRlcnJ1cHQgY29tcGxldGluZyBhIHJlYWQvd3JpdGUgRE1BIHRyYW5zZmVyIG9uIGFuIAorICoJSGFuZGxlIGFuIGludGVycnVwdCBjb21wbGV0aW5nIGEgcmVhZC93cml0ZSBETUEgdHJhbnNmZXIgb24gYW4KICAqCUlERSBkZXZpY2UKICAqLwotIAotaWRlX3N0YXJ0c3RvcF90IGlkZV9kbWFfaW50ciAoaWRlX2RyaXZlX3QgKmRyaXZlKQorCitpZGVfc3RhcnRzdG9wX3QgaWRlX2RtYV9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggc3RhdCA9IDAsIGRtYV9zdGF0ID0gMDsKQEAgLTEwNiwyMiArOTQsMjEgQEAKIAlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9lbmQoZHJpdmUpOwogCXN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCi0JaWYgKE9LX1NUQVQoc3RhdCxEUklWRV9SRUFEWSxkcml2ZS0+YmFkX3dzdGF0fERSUV9TVEFUKSkgeworCWlmIChPS19TVEFUKHN0YXQsIERSSVZFX1JFQURZLCBkcml2ZS0+YmFkX3dzdGF0IHwgQVRBX0RSUSkpIHsKIAkJaWYgKCFkbWFfc3RhdCkgewotCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CiAKIAkJCXRhc2tfZW5kX3JlcXVlc3QoZHJpdmUsIHJxLCBzdGF0KTsKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKIAkJfQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkbWFfaW50cjogYmFkIERNQSBzdGF0dXMgKGRtYV9zdGF0PSV4KVxuIiwgCi0JCSAgICAgICBkcml2ZS0+bmFtZSwgZG1hX3N0YXQpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogYmFkIERNQSBzdGF0dXMgKDB4JTAyeClcbiIsCisJCQlkcml2ZS0+bmFtZSwgX19mdW5jX18sIGRtYV9zdGF0KTsKIAl9CiAJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgImRtYV9pbnRyIiwgc3RhdCk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfaW50cik7CiAKLXN0YXRpYyBpbnQgaWRlX2RtYV9nb29kX2RyaXZlKGlkZV9kcml2ZV90ICpkcml2ZSkKK2ludCBpZGVfZG1hX2dvb2RfZHJpdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXJldHVybiBpZGVfaW5fZHJpdmVfbGlzdChkcml2ZS0+aWQsIGRyaXZlX3doaXRlbGlzdCk7CiB9CkBAIC0xMzksNyArMTI2LDcgQEAKIAogaW50IGlkZV9idWlsZF9zZ2xpc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaHdpZi0+c2dfdGFibGU7CiAKIAlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CkBAIC0xNTIsMTA2ICsxMzksOCBAQAogCXJldHVybiBkbWFfbWFwX3NnKGh3aWYtPmRldiwgc2csIGh3aWYtPnNnX25lbnRzLAogCQkJICBod2lmLT5zZ19kbWFfZGlyZWN0aW9uKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2J1aWxkX3NnbGlzdCk7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfU0ZGCi0vKioKLSAqCWlkZV9idWlsZF9kbWF0YWJsZQktCWJ1aWxkIElERSBETUEgdGFibGUKLSAqCi0gKglpZGVfYnVpbGRfZG1hdGFibGUoKSBwcmVwYXJlcyBhIGRtYSByZXF1ZXN0LiBXZSBtYXAgdGhlIGNvbW1hbmQKLSAqCXRvIGdldCB0aGUgcGNpIGJ1cyBhZGRyZXNzZXMgb2YgdGhlIGJ1ZmZlcnMgYW5kIHRoZW4gYnVpbGQgdXAKLSAqCXRoZSBQUkQgdGFibGUgdGhhdCB0aGUgSURFIGxheWVyIHdhbnRzIHRvIGJlIGZlZC4gVGhlIGNvZGUKLSAqCWtub3dzIGFib3V0IHRoZSA2NEsgd3JhcCBidWcgaW4gdGhlIENTNTUzMC4KLSAqCi0gKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVpbHQgUFJEIGVudHJpZXMgaWYgYWxsIHdlbnQgb2theSwKLSAqCXJldHVybnMgMCBvdGhlcndpc2UuCi0gKgotICoJTWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHRybTI5MC5jCi0gKi8KLSAKLWludCBpZGVfYnVpbGRfZG1hdGFibGUgKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKLQlfX2xlMzIgKnRhYmxlID0gKF9fbGUzMiAqKWh3aWYtPmRtYXRhYmxlX2NwdTsKLQl1bnNpZ25lZCBpbnQgaXNfdHJtMjkwCT0gKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3RybTI5MCkgPyAxIDogMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCWludCBpOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0KLQlod2lmLT5zZ19uZW50cyA9IGkgPSBpZGVfYnVpbGRfc2dsaXN0KGRyaXZlLCBycSk7Ci0KLQlpZiAoIWkpCi0JCXJldHVybiAwOwotCi0Jc2cgPSBod2lmLT5zZ190YWJsZTsKLQl3aGlsZSAoaSkgewotCQl1MzIgY3VyX2FkZHI7Ci0JCXUzMiBjdXJfbGVuOwotCi0JCWN1cl9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOwotCQljdXJfbGVuID0gc2dfZG1hX2xlbihzZyk7Ci0KLQkJLyoKLQkJICogRmlsbCBpbiB0aGUgZG1hIHRhYmxlLCB3aXRob3V0IGNyb3NzaW5nIGFueSA2NGtCIGJvdW5kYXJpZXMuCi0JCSAqIE1vc3QgaGFyZHdhcmUgcmVxdWlyZXMgMTYtYml0IGFsaWdubWVudCBvZiBhbGwgYmxvY2tzLAotCQkgKiBidXQgdGhlIHRybTI5MCByZXF1aXJlcyAzMi1iaXQgYWxpZ25tZW50LgotCQkgKi8KLQotCQl3aGlsZSAoY3VyX2xlbikgewotCQkJaWYgKGNvdW50KysgPj0gUFJEX0VOVFJJRVMpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgdGFibGUgdG9vIHNtYWxsXG4iLCBkcml2ZS0+bmFtZSk7Ci0JCQkJZ290byB1c2VfcGlvX2luc3RlYWQ7Ci0JCQl9IGVsc2UgewotCQkJCXUzMiB4Y291bnQsIGJjb3VudCA9IDB4MTAwMDAgLSAoY3VyX2FkZHIgJiAweGZmZmYpOwotCi0JCQkJaWYgKGJjb3VudCA+IGN1cl9sZW4pCi0JCQkJCWJjb3VudCA9IGN1cl9sZW47Ci0JCQkJKnRhYmxlKysgPSBjcHVfdG9fbGUzMihjdXJfYWRkcik7Ci0JCQkJeGNvdW50ID0gYmNvdW50ICYgMHhmZmZmOwotCQkJCWlmIChpc190cm0yOTApCi0JCQkJCXhjb3VudCA9ICgoeGNvdW50ID4+IDIpIC0gMSkgPDwgMTY7Ci0JCQkJaWYgKHhjb3VudCA9PSAweDAwMDApIHsKLQkvKiAKLQkgKiBNb3N0IGNoaXBzZXRzIGNvcnJlY3RseSBpbnRlcnByZXQgYSBsZW5ndGggb2YgMHgwMDAwIGFzIDY0S0IsCi0JICogYnV0IGF0IGxlYXN0IG9uZSAoZS5nLiBDUzU1MzApIG1pc2ludGVycHJldHMgaXQgYXMgemVybyAoISkuCi0JICogU28gaGVyZSB3ZSBicmVhayB0aGUgNjRLQiBlbnRyeSBpbnRvIHR3byAzMktCIGVudHJpZXMgaW5zdGVhZC4KLQkgKi8KLQkJCQkJaWYgKGNvdW50KysgPj0gUFJEX0VOVFJJRVMpIHsKLQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSB0YWJsZSB0b28gc21hbGxcbiIsIGRyaXZlLT5uYW1lKTsKLQkJCQkJCWdvdG8gdXNlX3Bpb19pbnN0ZWFkOwotCQkJCQl9Ci0JCQkJCSp0YWJsZSsrID0gY3B1X3RvX2xlMzIoMHg4MDAwKTsKLQkJCQkJKnRhYmxlKysgPSBjcHVfdG9fbGUzMihjdXJfYWRkciArIDB4ODAwMCk7Ci0JCQkJCXhjb3VudCA9IDB4ODAwMDsKLQkJCQl9Ci0JCQkJKnRhYmxlKysgPSBjcHVfdG9fbGUzMih4Y291bnQpOwotCQkJCWN1cl9hZGRyICs9IGJjb3VudDsKLQkJCQljdXJfbGVuIC09IGJjb3VudDsKLQkJCX0KLQkJfQotCi0JCXNnID0gc2dfbmV4dChzZyk7Ci0JCWktLTsKLQl9Ci0KLQlpZiAoY291bnQpIHsKLQkJaWYgKCFpc190cm0yOTApCi0JCQkqLS10YWJsZSB8PSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByaW50ayhLRVJOX0VSUiAiJXM6IGVtcHR5IERNQSB0YWJsZT9cbiIsIGRyaXZlLT5uYW1lKTsKLQotdXNlX3Bpb19pbnN0ZWFkOgotCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsKLQotCXJldHVybiAwOyAvKiByZXZlcnQgdG8gUElPIGZvciB0aGlzIHJlcXVlc3QgKi8KLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2J1aWxkX2RtYXRhYmxlKTsKLSNlbmRpZgotCiAvKioKICAqCWlkZV9kZXN0cm95X2RtYXRhYmxlCS0JY2xlYW4gdXAgRE1BIG1hcHBpbmcKICAqCUBkcml2ZTogVGhlIGRyaXZlIHRvIHVubWFwCkBAIC0yNjIsMTQ2ICsxNTEsMzAgQEAKICAqCWFuIG9vcHMgYXMgb25seSBvbmUgbWFwcGluZyBjYW4gYmUgbGl2ZSBmb3IgZWFjaCB0YXJnZXQgYXQgYSBnaXZlbgogICoJdGltZS4KICAqLwotIAotdm9pZCBpZGVfZGVzdHJveV9kbWF0YWJsZSAoaWRlX2RyaXZlX3QgKmRyaXZlKQorCit2b2lkIGlkZV9kZXN0cm95X2RtYXRhYmxlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKIAlkbWFfdW5tYXBfc2coaHdpZi0+ZGV2LCBod2lmLT5zZ190YWJsZSwgaHdpZi0+c2dfbmVudHMsCiAJCSAgICAgaHdpZi0+c2dfZG1hX2RpcmVjdGlvbik7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kZXN0cm95X2RtYXRhYmxlKTsKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9TRkYKLS8qKgotICoJY29uZmlnX2RyaXZlX2Zvcl9kbWEJLQlhdHRlbXB0IHRvIGFjdGl2YXRlIElERSBETUEKLSAqCUBkcml2ZTogdGhlIGRyaXZlIHRvIHBsYWNlIGluIERNQSBtb2RlCi0gKgotICoJSWYgdGhlIGRyaXZlIHN1cHBvcnRzIGF0IGxlYXN0IG1vZGUgMiBETUEgb3IgVURNQSBvZiBhbnkga2luZAotICoJdGhlbiBhdHRlbXB0IHRvIHBsYWNlIGl0IGludG8gRE1BIG1vZGUuIERyaXZlcyB0aGF0IGFyZSBrbm93biB0bwotICoJc3VwcG9ydCBETUEgYnV0IHByZWRhdGUgdGhlIERNQSBwcm9wZXJ0aWVzIG9yIHRoYXQgYXJlIGtub3duCi0gKgl0byBoYXZlIERNQSBoYW5kbGluZyBidWdzIGFyZSBhbHNvIHNldCB1cCBhcHByb3ByaWF0ZWx5IGJhc2VkCi0gKglvbiB0aGUgZ29vZC9iYWQgZHJpdmUgbGlzdHMuCi0gKi8KLSAKLXN0YXRpYyBpbnQgY29uZmlnX2RyaXZlX2Zvcl9kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOwotCi0JaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgewotCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19BVEFQSV9ETUEpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEVuYWJsZSBETUEgb24gYW55IGRyaXZlIHRoYXQgaGFzCi0JICogVWx0cmFETUEgKG1vZGUgMC8xLzIvMy80LzUvNikgZW5hYmxlZAotCSAqLwotCWlmICgoaWQtPmZpZWxkX3ZhbGlkICYgNCkgJiYgKChpZC0+ZG1hX3VsdHJhID4+IDgpICYgMHg3ZikpCi0JCXJldHVybiAxOwotCi0JLyoKLQkgKiBFbmFibGUgRE1BIG9uIGFueSBkcml2ZSB0aGF0IGhhcyBtb2RlMiBETUEKLQkgKiAobXVsdGkgb3Igc2luZ2xlKSBlbmFibGVkCi0JICovCi0JaWYgKGlkLT5maWVsZF92YWxpZCAmIDIpCS8qIHJlZ3VsYXIgRE1BICovCi0JCWlmICgoaWQtPmRtYV9td29yZCAmIDB4NDA0KSA9PSAweDQwNCB8fAotCQkgICAgKGlkLT5kbWFfMXdvcmQgJiAweDQwNCkgPT0gMHg0MDQpCi0JCQlyZXR1cm4gMTsKLQotCS8qIENvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImdvb2QiIGRyaXZlcyAqLwotCWlmIChpZGVfZG1hX2dvb2RfZHJpdmUoZHJpdmUpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqCWRtYV90aW1lcl9leHBpcnkJLQloYW5kbGUgYSBETUEgdGltZW91dAotICoJQGRyaXZlOiBEcml2ZSB0aGF0IHRpbWVkIG91dAotICoKLSAqCUFuIElERSBETUEgdHJhbnNmZXIgdGltZWQgb3V0LiBJbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3Igd2UgYXNrCi0gKgl0aGUgZHJpdmVyIHRvIHJlc29sdmUgdGhlIHByb2JsZW0sIGlmIGEgRE1BIHRyYW5zZmVyIGlzIHN0aWxsCi0gKglpbiBwcm9ncmVzcyB3ZSBjb250aW51ZSB0byB3YWl0IChhcmd1YWJseSB3ZSBuZWVkIHRvIGFkZCBhIAotICoJc2Vjb25kYXJ5ICdJIGRvbid0IGNhcmUgd2hhdCB0aGUgZHJpdmUgdGhpbmtzJyB0aW1lb3V0IGhlcmUpCi0gKglGaW5hbGx5IGlmIHdlIGhhdmUgYW4gaW50ZXJydXB0IHdlIGxldCBpdCBjb21wbGV0ZSB0aGUgSS9PLgotICoJQnV0IG9ubHkgb25lIHRpbWUgLSB3ZSBjbGVhciBleHBpcnkgYW5kIGlmIGl0J3Mgc3RpbGwgbm90Ci0gKgljb21wbGV0ZWQgYWZ0ZXIgV0FJVF9DTUQsIHdlIGVycm9yIGFuZCByZXRyeSBpbiBQSU8uCi0gKglUaGlzIGNhbiBvY2N1ciBpZiBhbiBpbnRlcnJ1cHQgaXMgbG9zdCBvciBkdWUgdG8gaGFuZyBvciBidWdzLgotICovCi0gCi1zdGF0aWMgaW50IGRtYV90aW1lcl9leHBpcnkgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JdTggZG1hX3N0YXQJCT0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOwotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRtYV90aW1lcl9leHBpcnk6IGRtYSBzdGF0dXMgPT0gMHglMDJ4XG4iLAotCQlkcml2ZS0+bmFtZSwgZG1hX3N0YXQpOwotCi0JaWYgKChkbWFfc3RhdCAmIDB4MTgpID09IDB4MTgpCS8qIEJVU1kgU3R1cGlkIEVhcmx5IFRpbWVyICEhICovCi0JCXJldHVybiBXQUlUX0NNRDsKLQotCUhXR1JPVVAoZHJpdmUpLT5leHBpcnkgPSBOVUxMOwkvKiBvbmUgZnJlZSByaWRlIGZvciBub3cgKi8KLQotCS8qIDEgZG1haW5nLCAyIGVycm9yLCA0IGludHIgKi8KLQlpZiAoZG1hX3N0YXQgJiAyKQkvKiBFUlJPUiAqLwotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoZG1hX3N0YXQgJiAxKQkvKiBETUFpbmcgKi8KLQkJcmV0dXJuIFdBSVRfQ01EOwotCi0JaWYgKGRtYV9zdGF0ICYgNCkJLyogR290IGFuIEludGVycnVwdCAqLwotCQlyZXR1cm4gV0FJVF9DTUQ7Ci0KLQlyZXR1cm4gMDsJLyogU3RhdHVzIGlzIHVua25vd24gLS0gcmVzZXQgdGhlIGJ1cyAqLwotfQotCi0vKioKLSAqCWlkZV9kbWFfaG9zdF9zZXQJLQlFbmFibGUvZGlzYWJsZSBETUEgb24gYSBob3N0Ci0gKglAZHJpdmU6IGRyaXZlIHRvIGNvbnRyb2wKLSAqCi0gKglFbmFibGUvZGlzYWJsZSBETUEgb24gYW4gSURFIGNvbnRyb2xsZXIgZm9sbG93aW5nIGdlbmVyaWMKLSAqCWJ1cy1tYXN0ZXJpbmcgSURFIGNvbnRyb2xsZXIgYmVoYXZpb3VyLgotICovCi0KLXZvaWQgaWRlX2RtYV9ob3N0X3NldChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBvbikKLXsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JdTggdW5pdAkJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7Ci0JdTggZG1hX3N0YXQJCT0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOwotCi0JaWYgKG9uKQotCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKLQllbHNlCi0JCWRtYV9zdGF0ICY9IH4oMSA8PCAoNSArIHVuaXQpKTsKLQotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCi0JCXdyaXRlYihkbWFfc3RhdCwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfaG9zdF9zZXQpOwotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9TRkYgICovCi0KIC8qKgogICoJaWRlX2RtYV9vZmZfcXVpZXRseQktCUdlbmVyaWMgRE1BIGtpbGwKICAqCUBkcml2ZTogZHJpdmUgdG8gY29udHJvbAogICoKLSAqCVR1cm4gb2ZmIHRoZSBjdXJyZW50IERNQSBvbiB0aGlzIElERSBjb250cm9sbGVyLiAKKyAqCVR1cm4gb2ZmIHRoZSBjdXJyZW50IERNQSBvbiB0aGlzIElERSBjb250cm9sbGVyLgogICovCiAKIHZvaWQgaWRlX2RtYV9vZmZfcXVpZXRseShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JZHJpdmUtPnVzaW5nX2RtYSA9IDA7CisJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1VTSU5HX0RNQTsKIAlpZGVfdG9nZ2xlX2JvdW5jZShkcml2ZSwgMCk7CiAKIAlkcml2ZS0+aHdpZi0+ZG1hX29wcy0+ZG1hX2hvc3Rfc2V0KGRyaXZlLCAwKTsKIH0KLQogRVhQT1JUX1NZTUJPTChpZGVfZG1hX29mZl9xdWlldGx5KTsKIAogLyoqCkBAIC00MTcsNyArMTkwLDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogRE1BIGRpc2FibGVkXG4iLCBkcml2ZS0+bmFtZSk7CiAJaWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaWRlX2RtYV9vZmYpOwogCiAvKioKQEAgLTQyOSwxNzkgKzIwMSwyNCBAQAogCiB2b2lkIGlkZV9kbWFfb24oaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWRyaXZlLT51c2luZ19kbWEgPSAxOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1VTSU5HX0RNQTsKIAlpZGVfdG9nZ2xlX2JvdW5jZShkcml2ZSwgMSk7CiAKIAlkcml2ZS0+aHdpZi0+ZG1hX29wcy0+ZG1hX2hvc3Rfc2V0KGRyaXZlLCAxKTsKIH0KIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQV9TRkYKLS8qKgotICoJaWRlX2RtYV9zZXR1cAktCWJlZ2luIGEgRE1BIHBoYXNlCi0gKglAZHJpdmU6IHRhcmdldCBkZXZpY2UKLSAqCi0gKglCdWlsZCBhbiBJREUgRE1BIFBSRCAoSURFIHNwZWFrIGZvciBzY2F0dGVyIGdhdGhlciB0YWJsZSkKLSAqCWFuZCB0aGVuIHNldCB1cCB0aGUgRE1BIHRyYW5zZmVyIHJlZ2lzdGVycyBmb3IgYSBkZXZpY2UKLSAqCXRoYXQgZm9sbG93cyBnZW5lcmljIElERSBQQ0kgRE1BIGJlaGF2aW91ci4gQ29udHJvbGxlcnMgY2FuCi0gKglvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZXkgbmVlZCB0bwotICoKLSAqCVJldHVybnMgMCBvbiBzdWNjZXNzLiBJZiBhIFBJTyBmYWxsYmFjayBpcyByZXF1aXJlZCB0aGVuIDEKLSAqCWlzIHJldHVybmVkLiAKLSAqLwotCi1pbnQgaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCitpbnQgX19pZGVfZG1hX2JhZF9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKLQl1bnNpZ25lZCBpbnQgcmVhZGluZzsKLQl1OCBtbWlvID0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKLQl1OCBkbWFfc3RhdDsKLQotCWlmIChycV9kYXRhX2RpcihycSkpCi0JCXJlYWRpbmcgPSAwOwotCWVsc2UKLQkJcmVhZGluZyA9IDEgPDwgMzsKLQotCS8qIGZhbGwgYmFjayB0byBwaW8hICovCi0JaWYgKCFpZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUsIHJxKSkgewotCQlpZGVfbWFwX3NnKGRyaXZlLCBycSk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIFBSRCB0YWJsZSAqLwotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCi0JCXdyaXRlbChod2lmLT5kbWF0YWJsZV9kbWEsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9UQUJMRV9PRlMpKTsKLQllbHNlCi0JCW91dGwoaHdpZi0+ZG1hdGFibGVfZG1hLCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfVEFCTEVfT0ZTKTsKLQotCS8qIHNwZWNpZnkgci93ICovCi0JaWYgKG1taW8pCi0JCXdyaXRlYihyZWFkaW5nLCAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKLQllbHNlCi0JCW91dGIocmVhZGluZywgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCk7Ci0KLQkvKiByZWFkIERNQSBzdGF0dXMgZm9yIElOVFIgJiBFUlJPUiBmbGFncyAqLwotCWRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOwotCi0JLyogY2xlYXIgSU5UUiAmIEVSUk9SIGZsYWdzICovCi0JaWYgKG1taW8pCi0JCXdyaXRlYihkbWFfc3RhdCB8IDYsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQgfCA2LCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKLQotCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAxOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX3NldHVwKTsKLQotdm9pZCBpZGVfZG1hX2V4ZWNfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY29tbWFuZCkKLXsKLQkvKiBpc3N1ZSBjbWQgdG8gZHJpdmUgKi8KLQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBjb21tYW5kLCAmaWRlX2RtYV9pbnRyLCAyKldBSVRfQ01ELCBkbWFfdGltZXJfZXhwaXJ5KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfZXhlY19jbWQpOwotCi12b2lkIGlkZV9kbWFfc3RhcnQoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQl1OCBkbWFfY21kOwotCi0JLyogTm90ZSB0aGF0IHRoaXMgaXMgZG9uZSAqYWZ0ZXIqIHRoZSBjbWQgaGFzCi0JICogYmVlbiBpc3N1ZWQgdG8gdGhlIGRyaXZlLCBhcyBwZXIgdGhlIEJNLUlERSBzcGVjLgotCSAqIFRoZSBQcm9taXNlIFVsdHJhMzMgZG9lc24ndCB3b3JrIGNvcnJlY3RseSB3aGVuCi0JICogd2UgZG8gdGhpcyBwYXJ0IGJlZm9yZSBpc3N1aW5nIHRoZSBkcml2ZSBjbWQuCi0JICovCi0JaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgewotCQlkbWFfY21kID0gcmVhZGIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7Ci0JCS8qIHN0YXJ0IERNQSAqLwotCQl3cml0ZWIoZG1hX2NtZCB8IDEsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpKTsKLQl9IGVsc2UgewotCQlkbWFfY21kID0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwotCQlvdXRiKGRtYV9jbWQgfCAxLCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKLQl9Ci0KLQlod2lmLT5kbWEgPSAxOwotCXdtYigpOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX3N0YXJ0KTsKLQotLyogcmV0dXJucyAxIG9uIGVycm9yLCAwIG90aGVyd2lzZSAqLwotaW50IF9faWRlX2RtYV9lbmQgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7Ci0JdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKLQotCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwotCi0JaWYgKG1taW8pIHsKLQkJLyogZ2V0IERNQSBjb21tYW5kIG1vZGUgKi8KLQkJZG1hX2NtZCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOwotCQkvKiBzdG9wIERNQSAqLwotCQl3cml0ZWIoZG1hX2NtZCAmIH4xLAotCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7Ci0JfSBlbHNlIHsKLQkJZG1hX2NtZCA9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKTsKLQkJb3V0YihkbWFfY21kICYgfjEsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwotCX0KLQotCS8qIGdldCBETUEgc3RhdHVzICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7Ci0KLQlpZiAobW1pbykKLQkJLyogY2xlYXIgdGhlIElOVFIgJiBFUlJPUiBiaXRzICovCi0JCXdyaXRlYihkbWFfc3RhdCB8IDYsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQgfCA2LCBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKLQotCS8qIHB1cmdlIERNQSBtYXBwaW5ncyAqLwotCWlkZV9kZXN0cm95X2RtYXRhYmxlKGRyaXZlKTsKLQkvKiB2ZXJpZnkgZ29vZCBETUEgc3RhdHVzICovCi0JaHdpZi0+ZG1hID0gMDsKLQl3bWIoKTsKLQlyZXR1cm4gKGRtYV9zdGF0ICYgNykgIT0gNCA/ICgweDEwIHwgZG1hX3N0YXQpIDogMDsKLX0KLQotRVhQT1JUX1NZTUJPTChfX2lkZV9kbWFfZW5kKTsKLQotLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwotaW50IGlkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKLQl1OCBkbWFfc3RhdAkJPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7Ci0KLQkvKiByZXR1cm4gMSBpZiBJTlRSIGFzc2VydGVkICovCi0JaWYgKChkbWFfc3RhdCAmIDQpID09IDQpCi0JCXJldHVybiAxOwotCWlmICghZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICglcykgY2FsbGVkIHdoaWxlIG5vdCB3YWl0aW5nXG4iLAotCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfdGVzdF9pcnEpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGNvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICpkcml2ZSkgeyByZXR1cm4gMDsgfQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9TRkYgKi8KLQotaW50IF9faWRlX2RtYV9iYWRfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAogCWludCBibGFja2xpc3QgPSBpZGVfaW5fZHJpdmVfbGlzdChpZCwgZHJpdmVfYmxhY2tsaXN0KTsKIAlpZiAoYmxhY2tsaXN0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEaXNhYmxpbmcgKFUpRE1BIGZvciAlcyAoYmxhY2tsaXN0ZWQpXG4iLAotCQkJCSAgICBkcml2ZS0+bmFtZSwgaWQtPm1vZGVsKTsKKwkJCQkgICAgZHJpdmUtPm5hbWUsIChjaGFyICopJmlkW0FUQV9JRF9QUk9EXSk7CiAJCXJldHVybiBibGFja2xpc3Q7CiAJfQogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKF9faWRlX2RtYV9iYWRfZHJpdmUpOwogCiBzdGF0aWMgY29uc3QgdTggeGZlcl9tb2RlX2Jhc2VzW10gPSB7CkBAIC02MTIsMjEgKzIyOSwyMSBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlkZV9nZXRfbW9kZV9tYXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggYmFzZSwgdTggcmVxX21vZGUpCiB7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCi0Jc3dpdGNoKGJhc2UpIHsKKwlzd2l0Y2ggKGJhc2UpIHsKIAljYXNlIFhGRVJfVURNQV8wOgotCQlpZiAoKGlkLT5maWVsZF92YWxpZCAmIDQpID09IDApCisJCWlmICgoaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDQpID09IDApCiAJCQlicmVhazsKIAogCQlpZiAocG9ydF9vcHMgJiYgcG9ydF9vcHMtPnVkbWFfZmlsdGVyKQogCQkJbWFzayA9IHBvcnRfb3BzLT51ZG1hX2ZpbHRlcihkcml2ZSk7CiAJCWVsc2UKIAkJCW1hc2sgPSBod2lmLT51bHRyYV9tYXNrOwotCQltYXNrICY9IGlkLT5kbWFfdWx0cmE7CisJCW1hc2sgJj0gaWRbQVRBX0lEX1VETUFfTU9ERVNdOwogCiAJCS8qCiAJCSAqIGF2b2lkIGZhbHNlIGNhYmxlIHdhcm5pbmcgZnJvbSBlaWdodHlfbmludHlfdGhyZWUoKQpAQCAtNjM3LDE5ICsyNTQsMTkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFhGRVJfTVdfRE1BXzA6Ci0JCWlmICgoaWQtPmZpZWxkX3ZhbGlkICYgMikgPT0gMCkKKwkJaWYgKChpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgPT0gMCkKIAkJCWJyZWFrOwogCQlpZiAocG9ydF9vcHMgJiYgcG9ydF9vcHMtPm1kbWFfZmlsdGVyKQogCQkJbWFzayA9IHBvcnRfb3BzLT5tZG1hX2ZpbHRlcihkcml2ZSk7CiAJCWVsc2UKIAkJCW1hc2sgPSBod2lmLT5td2RtYV9tYXNrOwotCQltYXNrICY9IGlkLT5kbWFfbXdvcmQ7CisJCW1hc2sgJj0gaWRbQVRBX0lEX01XRE1BX01PREVTXTsKIAkJYnJlYWs7CiAJY2FzZSBYRkVSX1NXX0RNQV8wOgotCQlpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgewotCQkJbWFzayA9IGlkLT5kbWFfMXdvcmQgJiBod2lmLT5zd2RtYV9tYXNrOwotCQl9IGVsc2UgaWYgKGlkLT50RE1BKSB7Ci0JCQl1OCBtb2RlID0gaWQtPnRETUE7CisJCWlmIChpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgeworCQkJbWFzayA9IGlkW0FUQV9JRF9TV0RNQV9NT0RFU10gJiBod2lmLT5zd2RtYV9tYXNrOworCQl9IGVsc2UgaWYgKGlkW0FUQV9JRF9PTERfRE1BX01PREVTXSA+PiA4KSB7CisJCQl1OCBtb2RlID0gaWRbQVRBX0lEX09MRF9ETUFfTU9ERVNdID4+IDg7CiAKIAkJCS8qCiAJCQkgKiBpZiB0aGUgbW9kZSBpcyB2YWxpZCBjb252ZXJ0IGl0IHRvIHRoZSBtYXNrCkBAIC03MDYsNyArMzIzLDggQEAKIAkJLyoKIAkJICogaXMgdGhpcyBjb3JyZWN0PwogCQkgKi8KLQkJaWYgKGlkZV9kbWFfZ29vZF9kcml2ZShkcml2ZSkgJiYgZHJpdmUtPmlkLT5laWRlX2RtYV90aW1lIDwgMTUwKQorCQlpZiAoaWRlX2RtYV9nb29kX2RyaXZlKGRyaXZlKSAmJgorCQkgICAgZHJpdmUtPmlkW0FUQV9JRF9FSURFX0RNQV9USU1FXSA8IDE1MCkKIAkJCW1vZGUgPSBYRkVSX01XX0RNQV8xOwogCX0KIApAQCAtNzE3LDcgKzMzNSw2IEBACiAKIAlyZXR1cm4gbW9kZTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2ZpbmRfZG1hX21vZGUpOwogCiBzdGF0aWMgaW50IGlkZV90dW5lX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC03MjUsNyArMzQyLDggQEAKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggc3BlZWQ7CiAKLQlpZiAoZHJpdmUtPm5vZG1hIHx8IChkcml2ZS0+aWQtPmNhcGFiaWxpdHkgJiAxKSA9PSAwKQorCWlmIChhdGFfaWRfaGFzX2RtYShkcml2ZS0+aWQpID09IDAgfHwKKwkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9ETUEpKQogCQlyZXR1cm4gMDsKIAogCS8qIGNvbnN1bHQgdGhlIGxpc3Qgb2Yga25vd24gImJhZCIgZHJpdmVzICovCkBAIC03NjcsMTMgKzM4NSwxNSBAQAogCiBpbnQgaWRlX2lkX2RtYV9idWcoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKKwl1MTYgKmlkID0gZHJpdmUtPmlkOwogCi0JaWYgKGlkLT5maWVsZF92YWxpZCAmIDQpIHsKLQkJaWYgKChpZC0+ZG1hX3VsdHJhID4+IDgpICYmIChpZC0+ZG1hX213b3JkID4+IDgpKQorCWlmIChpZFtBVEFfSURfRklFTERfVkFMSURdICYgNCkgeworCQlpZiAoKGlkW0FUQV9JRF9VRE1BX01PREVTXSA+PiA4KSAmJgorCQkgICAgKGlkW0FUQV9JRF9NV0RNQV9NT0RFU10gPj4gOCkpCiAJCQlnb3RvIGVycl9vdXQ7Ci0JfSBlbHNlIGlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7Ci0JCWlmICgoaWQtPmRtYV9td29yZCA+PiA4KSAmJiAoaWQtPmRtYV8xd29yZCA+PiA4KSkKKwl9IGVsc2UgaWYgKGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CisJCWlmICgoaWRbQVRBX0lEX01XRE1BX01PREVTXSA+PiA4KSAmJgorCQkgICAgKGlkW0FUQV9JRF9TV0RNQV9NT0RFU10gPj4gOCkpCiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCXJldHVybiAwOwpAQCAtODIzLDY2ICs0NDMsNTkgQEAKIAkJaWRlX2RtYV9vbihkcml2ZSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVETUFfU0ZGCi12b2lkIGlkZV9kbWFfbG9zdF9pcnEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3ZvaWQgaWRlX2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JcHJpbnRrKCIlczogRE1BIGludGVycnVwdCByZWNvdmVyeVxuIiwgZHJpdmUtPm5hbWUpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBpbnRlcnJ1cHQgcmVjb3ZlcnlcbiIsIGRyaXZlLT5uYW1lKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfbG9zdF9pcnEpOwogCi1FWFBPUlRfU1lNQk9MKGlkZV9kbWFfbG9zdF9pcnEpOwotCi12b2lkIGlkZV9kbWFfdGltZW91dCAoaWRlX2RyaXZlX3QgKmRyaXZlKQordm9pZCBpZGVfZG1hX3RpbWVvdXQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKIAlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIERNQVxuIiwgZHJpdmUtPm5hbWUpOwogCiAJaWYgKGh3aWYtPmRtYV9vcHMtPmRtYV90ZXN0X2lycShkcml2ZSkpCiAJCXJldHVybjsKIAorCWlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgIkRNQSB0aW1lb3V0IiwgaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSk7CisKIAlod2lmLT5kbWFfb3BzLT5kbWFfZW5kKGRyaXZlKTsKIH0KLQotRVhQT1JUX1NZTUJPTChpZGVfZG1hX3RpbWVvdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RtYV90aW1lb3V0KTsKIAogdm9pZCBpZGVfcmVsZWFzZV9kbWFfZW5naW5lKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaWYgKGh3aWYtPmRtYXRhYmxlX2NwdSkgewotCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKKwkJaW50IHByZF9zaXplID0gaHdpZi0+cHJkX21heF9uZW50cyAqIGh3aWYtPnByZF9lbnRfc2l6ZTsKIAotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFBSRF9FTlRSSUVTICogUFJEX0JZVEVTLAotCQkJCSAgICBod2lmLT5kbWF0YWJsZV9jcHUsIGh3aWYtPmRtYXRhYmxlX2RtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KGh3aWYtPmRldiwgcHJkX3NpemUsCisJCQkJICBod2lmLT5kbWF0YWJsZV9jcHUsIGh3aWYtPmRtYXRhYmxlX2RtYSk7CiAJCWh3aWYtPmRtYXRhYmxlX2NwdSA9IE5VTEw7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JlbGVhc2VfZG1hX2VuZ2luZSk7CiAKIGludCBpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShpZGVfaHdpZl90ICpod2lmKQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOworCWludCBwcmRfc2l6ZTsKIAotCWh3aWYtPmRtYXRhYmxlX2NwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCi0JCQkJCQkgIFBSRF9FTlRSSUVTICogUFJEX0JZVEVTLAotCQkJCQkJICAmaHdpZi0+ZG1hdGFibGVfZG1hKTsKKwlpZiAoaHdpZi0+cHJkX21heF9uZW50cyA9PSAwKQorCQlod2lmLT5wcmRfbWF4X25lbnRzID0gUFJEX0VOVFJJRVM7CisJaWYgKGh3aWYtPnByZF9lbnRfc2l6ZSA9PSAwKQorCQlod2lmLT5wcmRfZW50X3NpemUgPSBQUkRfQllURVM7CiAKLQlpZiAoaHdpZi0+ZG1hdGFibGVfY3B1KQotCQlyZXR1cm4gMDsKKwlwcmRfc2l6ZSA9IGh3aWYtPnByZF9tYXhfbmVudHMgKiBod2lmLT5wcmRfZW50X3NpemU7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiAtLSBFcnJvciwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQSB0YWJsZS5cbiIsCisJaHdpZi0+ZG1hdGFibGVfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KGh3aWYtPmRldiwgcHJkX3NpemUsCisJCQkJCQkmaHdpZi0+ZG1hdGFibGVfZG1hLAorCQkJCQkJR0ZQX0FUT01JQyk7CisJaWYgKGh3aWYtPmRtYXRhYmxlX2NwdSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBQUkQgdGFibGVcbiIsCiAJCQlod2lmLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZSk7Ci0KLWNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBzZmZfZG1hX29wcyA9IHsKLQkuZG1hX2hvc3Rfc2V0CQk9IGlkZV9kbWFfaG9zdF9zZXQsCi0JLmRtYV9zZXR1cAkJPSBpZGVfZG1hX3NldHVwLAotCS5kbWFfZXhlY19jbWQJCT0gaWRlX2RtYV9leGVjX2NtZCwKLQkuZG1hX3N0YXJ0CQk9IGlkZV9kbWFfc3RhcnQsCi0JLmRtYV9lbmQJCT0gX19pZGVfZG1hX2VuZCwKLQkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCi0JLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKLQkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCi19OwotRVhQT1JUX1NZTUJPTF9HUEwoc2ZmX2RtYV9vcHMpOwotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQV9TRkYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCBlOTAzNGMwLi5jZjBhYTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xNSw2ICsxNSw5IEBACiAgKiBEb2N1bWVudGF0aW9uL2lkZS9DaGFuZ2VMb2cuaWRlLWZsb3BweS4xOTk2LTIwMDIKICAqLwogCisjZGVmaW5lIERSVl9OQU1FICJpZGUtZmxvcHB5IgorI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCiAjZGVmaW5lIElERUZMT1BQWV9WRVJTSU9OICIxLjAwIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMSw4ICszNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiAKQEAgLTQyLDQyICs0NywyNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCi0vKiBkZWZpbmUgdG8gc2VlIGRlYnVnIGluZm8gKi8KLSNkZWZpbmUgSURFRkxPUFBZX0RFQlVHX0xPRwkJMAorI2luY2x1ZGUgImlkZS1mbG9wcHkuaCIKIAotLyogI2RlZmluZSBJREVGTE9QUFlfREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIGZtdCwgIyMgYXJncykgKi8KLSNkZWZpbmUgSURFRkxPUFBZX0RFQlVHKGZtdCwgYXJncy4uLikKKy8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWJ1Z19tYXNrOworbW9kdWxlX3BhcmFtKGRlYnVnX21hc2ssIHVsb25nLCAwNjQ0KTsKKworLyogZGVmaW5lIHRvIHNlZSBkZWJ1ZyBpbmZvICovCisjZGVmaW5lIElERUZMT1BQWV9ERUJVR19MT0cJMAogCiAjaWYgSURFRkxPUFBZX0RFQlVHX0xPRwotI2RlZmluZSBkZWJ1Z19sb2coZm10LCBhcmdzLi4uKSBcCi0JcHJpbnRrKEtFUk5fSU5GTyAiaWRlLWZsb3BweTogIiBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGlkZV9kZWJ1Z19sb2cobHZsLCBmbXQsIGFyZ3MuLi4pIF9faWRlX2RlYnVnX2xvZyhsdmwsIGZtdCwgYXJncykKICNlbHNlCi0jZGVmaW5lIGRlYnVnX2xvZyhmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBpZGVfZGVidWdfbG9nKGx2bCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0KLS8qIFNvbWUgZHJpdmVzIHJlcXVpcmUgYSBsb25nZXIgaXJxIHRpbWVvdXQuICovCi0jZGVmaW5lIElERUZMT1BQWV9XQUlUX0NNRAkJKDUgKiBXQUlUX0NNRCkKLQogLyoKICAqIEFmdGVyIGVhY2ggZmFpbGVkIHBhY2tldCBjb21tYW5kIHdlIGlzc3VlIGEgcmVxdWVzdCBzZW5zZSBjb21tYW5kIGFuZCByZXRyeQogICogdGhlIHBhY2tldCBjb21tYW5kIElERUZMT1BQWV9NQVhfUENfUkVUUklFUyB0aW1lcy4KICAqLwogI2RlZmluZSBJREVGTE9QUFlfTUFYX1BDX1JFVFJJRVMJMwogCi0vKgotICogV2l0aCBlYWNoIHBhY2tldCBjb21tYW5kLCB3ZSBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBJREVGTE9QUFlfUENfQlVGRkVSX1NJWkUKLSAqIGJ5dGVzLgotICovCi0jZGVmaW5lIElERUZMT1BQWV9QQ19CVUZGRVJfU0laRQkyNTYKLQotLyoKLSAqIEluIHZhcmlvdXMgcGxhY2VzIGluIHRoZSBkcml2ZXIsIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3RvcmFnZSBmb3IgcGFja2V0Ci0gKiBjb21tYW5kcyBhbmQgcmVxdWVzdHMsIHdoaWNoIHdpbGwgcmVtYWluIHZhbGlkIHdoaWxlCXdlIGxlYXZlIHRoZSBkcml2ZXIgdG8KLSAqIHdhaXQgZm9yIGFuIGludGVycnVwdCBvciBhIHRpbWVvdXQgZXZlbnQuCi0gKi8KLSNkZWZpbmUgSURFRkxPUFBZX1BDX1NUQUNLCQkoMTAgKyBJREVGTE9QUFlfTUFYX1BDX1JFVFJJRVMpCi0KIC8qIGZvcm1hdCBjYXBhY2l0aWVzIGRlc2NyaXB0b3IgY29kZXMgKi8KICNkZWZpbmUgQ0FQQUNJVFlfSU5WQUxJRAkweDAwCiAjZGVmaW5lIENBUEFDSVRZX1VORk9STUFUVEVECTB4MDEKQEAgLTg1LDc5ICs3NSwxNiBAQAogI2RlZmluZSBDQVBBQ0lUWV9OT19DQVJUUklER0UJMHgwMwogCiAvKgotICogTW9zdCBvZiBvdXIgZ2xvYmFsIGRhdGEgd2hpY2ggd2UgbmVlZCB0byBzYXZlIGV2ZW4gYXMgd2UgbGVhdmUgdGhlIGRyaXZlcgotICogZHVlIHRvIGFuIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50IGlzIHN0b3JlZCBpbiBhIHZhcmlhYmxlIG9mIHR5cGUKLSAqIGlkZWZsb3BweV9mbG9wcHlfdCwgZGVmaW5lZCBiZWxvdy4KKyAqIFRoZSBmb2xsb3dpbmcgZGVsYXkgc29sdmVzIGEgcHJvYmxlbSB3aXRoIEFUQVBJIFppcCAxMDAgZHJpdmUgd2hlcmUgQlNZIGJpdAorICogd2FzIGFwcGFyZW50bHkgYmVpbmcgZGVhc3NlcnRlZCBiZWZvcmUgdGhlIHVuaXQgd2FzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogewotCWlkZV9kcml2ZV90CSpkcml2ZTsKLQlpZGVfZHJpdmVyX3QJKmRyaXZlcjsKLQlzdHJ1Y3QgZ2VuZGlzawkqZGlzazsKLQlzdHJ1Y3Qga3JlZglrcmVmOwotCXVuc2lnbmVkIGludAlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KLQotCS8qIEN1cnJlbnQgcGFja2V0IGNvbW1hbmQgKi8KLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYzsKLQkvKiBMYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCAqLwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKmZhaWxlZF9wYzsKLQkvKiBQYWNrZXQgY29tbWFuZCBzdGFjayAqLwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGNfc3RhY2tbSURFRkxPUFBZX1BDX1NUQUNLXTsKLQkvKiBOZXh0IGZyZWUgcGFja2V0IGNvbW1hbmQgc3RvcmFnZSBzcGFjZSAqLwotCWludCBwY19zdGFja19pbmRleDsKLQlzdHJ1Y3QgcmVxdWVzdCBycV9zdGFja1tJREVGTE9QUFlfUENfU1RBQ0tdOwotCS8qIFdlIGltcGxlbWVudCBhIGNpcmN1bGFyIGFycmF5ICovCi0JaW50IHJxX3N0YWNrX2luZGV4OwotCi0JLyogTGFzdCBlcnJvciBpbmZvcm1hdGlvbiAqLwotCXU4IHNlbnNlX2tleSwgYXNjLCBhc2NxOwotCS8qIGRlbGF5IHRoaXMgbG9uZyBiZWZvcmUgc2VuZGluZyBwYWNrZXQgY29tbWFuZCAqLwotCXU4IHRpY2tzOwotCWludCBwcm9ncmVzc19pbmRpY2F0aW9uOwotCi0JLyogRGV2aWNlIGluZm9ybWF0aW9uICovCi0JLyogQ3VycmVudCBmb3JtYXQgKi8KLQlpbnQgYmxvY2tzLCBibG9ja19zaXplLCBic19mYWN0b3I7Ci0JLyogTGFzdCBmb3JtYXQgY2FwYWNpdHkgZGVzY3JpcHRvciAqLwotCXU4IGNhcF9kZXNjWzhdOwotCS8qIENvcHkgb2YgdGhlIGZsZXhpYmxlIGRpc2sgcGFnZSAqLwotCXU4IGZsZXhpYmxlX2Rpc2tfcGFnZVszMl07Ci0JLyogV3JpdGUgcHJvdGVjdCAqLwotCWludCB3cDsKLQkvKiBTdXBwb3J0cyBmb3JtYXQgcHJvZ3Jlc3MgcmVwb3J0ICovCi0JaW50IHNyZnA7Ci19IGlkZWZsb3BweV9mbG9wcHlfdDsKLQotI2RlZmluZSBJREVGTE9QUFlfVElDS1NfREVMQVkJSFovMjAJLyogZGVmYXVsdCBkZWxheSBmb3IgWklQIDEwMCAoNTBtcykgKi8KLQotLyogRGVmaW5lcyBmb3IgdGhlIE1PREUgU0VOU0UgY29tbWFuZCAqLwotI2RlZmluZSBNT0RFX1NFTlNFX0NVUlJFTlQJCTB4MDAKLSNkZWZpbmUgTU9ERV9TRU5TRV9DSEFOR0VBQkxFCQkweDAxCi0jZGVmaW5lIE1PREVfU0VOU0VfREVGQVVMVAkJMHgwMgotI2RlZmluZSBNT0RFX1NFTlNFX1NBVkVECQkweDAzCi0KLS8qIElPQ1RMcyB1c2VkIGluIGxvdy1sZXZlbCBmb3JtYXR0aW5nLiAqLwotI2RlZmluZQlJREVGTE9QUFlfSU9DVExfRk9STUFUX1NVUFBPUlRFRAkweDQ2MDAKLSNkZWZpbmUJSURFRkxPUFBZX0lPQ1RMX0ZPUk1BVF9HRVRfQ0FQQUNJVFkJMHg0NjAxCi0jZGVmaW5lCUlERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1RBUlQJCTB4NDYwMgotI2RlZmluZSBJREVGTE9QUFlfSU9DVExfRk9STUFUX0dFVF9QUk9HUkVTUwkweDQ2MDMKKyNkZWZpbmUgSURFRkxPUFBZX1BDX0RFTEFZCShIWi8yMCkJLyogZGVmYXVsdCBkZWxheSBmb3IgWklQIDEwMCAoNTBtcykgKi8KIAogLyogRXJyb3IgY29kZSByZXR1cm5lZCBpbiBycS0+ZXJyb3JzIHRvIHRoZSBoaWdoZXIgcGFydCBvZiB0aGUgZHJpdmVyLiAqLwogI2RlZmluZQlJREVGTE9QUFlfRVJST1JfR0VORVJBTAkJMTAxCiAKLS8qCi0gKiBQYWdlcyBvZiB0aGUgU0VMRUNUIFNFTlNFIC8gTU9ERSBTRU5TRSBwYWNrZXQgY29tbWFuZHMuCi0gKiBTZWUgU0ZGLTgwNzBpIHNwZWMuCi0gKi8KLSNkZWZpbmUJSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFCTB4MWIKLSNkZWZpbmUgSURFRkxPUFBZX0ZMRVhJQkxFX0RJU0tfUEFHRQkweDA1Ci0KIHN0YXRpYyBERUZJTkVfTVVURVgoaWRlZmxvcHB5X3JlZl9tdXRleCk7CiAKLSNkZWZpbmUgdG9faWRlX2Zsb3BweShvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBpZGVfZmxvcHB5X29iaiwga3JlZikKLQotI2RlZmluZSBpZGVfZmxvcHB5X2coZGlzaykgXAotCWNvbnRhaW5lcl9vZigoZGlzayktPnByaXZhdGVfZGF0YSwgc3RydWN0IGlkZV9mbG9wcHlfb2JqLCBkcml2ZXIpCi0KIHN0YXRpYyB2b2lkIGlkZWZsb3BweV9jbGVhbnVwX29iaihzdHJ1Y3Qga3JlZiAqKTsKIAogc3RhdGljIHN0cnVjdCBpZGVfZmxvcHB5X29iaiAqaWRlX2Zsb3BweV9nZXQoc3RydWN0IGdlbmRpc2sgKmRpc2spCkBAIC0xNjUsNyArOTIsNyBAQAogCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmlkZWZsb3BweV9yZWZfbXV0ZXgpOwotCWZsb3BweSA9IGlkZV9mbG9wcHlfZyhkaXNrKTsKKwlmbG9wcHkgPSBpZGVfZHJ2X2coZGlzaywgaWRlX2Zsb3BweV9vYmopOwogCWlmIChmbG9wcHkpIHsKIAkJaWYgKGlkZV9kZXZpY2VfZ2V0KGZsb3BweS0+ZHJpdmUpKQogCQkJZmxvcHB5ID0gTlVMTDsKQEAgLTE5NiwxMyArMTIzLDIxIEBACiAJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOwogCWludCBlcnJvcjsKIAotCWRlYnVnX2xvZygiUmVhY2hlZCAlc1xuIiwgX19mdW5jX18pOworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOwogCiAJc3dpdGNoICh1cHRvZGF0ZSkgewotCWNhc2UgMDogZXJyb3IgPSBJREVGTE9QUFlfRVJST1JfR0VORVJBTDsgYnJlYWs7Ci0JY2FzZSAxOiBlcnJvciA9IDA7IGJyZWFrOwotCWRlZmF1bHQ6IGVycm9yID0gdXB0b2RhdGU7CisJY2FzZSAwOgorCQllcnJvciA9IElERUZMT1BQWV9FUlJPUl9HRU5FUkFMOworCQlicmVhazsKKworCWNhc2UgMToKKwkJZXJyb3IgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycm9yID0gdXB0b2RhdGU7CiAJfQorCiAJaWYgKGVycm9yKQogCQlmbG9wcHktPmZhaWxlZF9wYyA9IE5VTEw7CiAJLyogV2h5IGRvZXMgdGhpcyBoYXBwZW4/ICovCkBAIC0yMTksNDQgKzE1NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZV9mbG9wcHlfaW9fYnVmZmVycyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQkJCSAgdW5zaWduZWQgaW50IGJjb3VudCwgaW50IGRpcmVjdGlvbikKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gcGMtPnJxOwotCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjb3VudCwgZG9uZSA9IDA7Ci0JY2hhciAqZGF0YTsKLQotCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgcnEsIGl0ZXIpIHsKLQkJaWYgKCFiY291bnQpCi0JCQlicmVhazsKLQotCQljb3VudCA9IG1pbihidmVjLT5idl9sZW4sIGJjb3VudCk7Ci0KLQkJZGF0YSA9IGJ2ZWNfa21hcF9pcnEoYnZlYywgJmZsYWdzKTsKLQkJaWYgKGRpcmVjdGlvbikKLQkJCWh3aWYtPnRwX29wcy0+b3V0cHV0X2RhdGEoZHJpdmUsIE5VTEwsIGRhdGEsIGNvdW50KTsKLQkJZWxzZQotCQkJaHdpZi0+dHBfb3BzLT5pbnB1dF9kYXRhKGRyaXZlLCBOVUxMLCBkYXRhLCBjb3VudCk7Ci0JCWJ2ZWNfa3VubWFwX2lycShkYXRhLCAmZmxhZ3MpOwotCi0JCWJjb3VudCAtPSBjb3VudDsKLQkJcGMtPmJfY291bnQgKz0gY291bnQ7Ci0JCWRvbmUgKz0gY291bnQ7Ci0JfQotCi0JaWRlZmxvcHB5X2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCBkb25lID4+IDkpOwotCi0JaWYgKGJjb3VudCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsZWZ0b3ZlciBkYXRhIGluICVzLCBiY291bnQgPT0gJWRcbiIsCi0JCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fLCBiY291bnQpOwotCQlpZGVfcGFkX3RyYW5zZmVyKGRyaXZlLCBkaXJlY3Rpb24sIGJjb3VudCk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBpZGVmbG9wcHlfdXBkYXRlX2J1ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLAogCQkJCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQogewpAQCAtMjY3LDUwICsxNjQsMTMgQEAKIAkJaWRlZmxvcHB5X2VuZF9yZXF1ZXN0KGRyaXZlLCAxLCAwKTsKIH0KIAotLyoKLSAqIEdlbmVyYXRlIGEgbmV3IHBhY2tldCBjb21tYW5kIHJlcXVlc3QgaW4gZnJvbnQgb2YgdGhlIHJlcXVlc3QgcXVldWUsIGJlZm9yZQotICogdGhlIGN1cnJlbnQgcmVxdWVzdCBzbyB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LCBvbiB0aGUgbmV4dAotICogcGFzcyB0aHJvdWdoIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9xdWV1ZV9wY19oZWFkKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsCi0JCXN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQotCWJsa19ycV9pbml0KE5VTEwsIHJxKTsKLQlycS0+YnVmZmVyID0gKGNoYXIgKikgcGM7Ci0JcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKLQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9QUkVFTVBUOwotCXJxLT5ycV9kaXNrID0gZmxvcHB5LT5kaXNrOwotCW1lbWNweShycS0+Y21kLCBwYy0+YywgMTIpOwotCWlkZV9kb19kcml2ZV9jbWQoZHJpdmUsIHJxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpZGVfYXRhcGlfcGMgKmlkZWZsb3BweV9uZXh0X3BjX3N0b3JhZ2UoaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9jYWxsYmFjayhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBkc2MpCiB7CiAJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoZmxvcHB5LT5wY19zdGFja19pbmRleCA9PSBJREVGTE9QUFlfUENfU1RBQ0spCi0JCWZsb3BweS0+cGNfc3RhY2tfaW5kZXggPSAwOwotCXJldHVybiAoJmZsb3BweS0+cGNfc3RhY2tbZmxvcHB5LT5wY19zdGFja19pbmRleCsrXSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqaWRlZmxvcHB5X25leHRfcnFfc3RvcmFnZShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoZmxvcHB5LT5ycV9zdGFja19pbmRleCA9PSBJREVGTE9QUFlfUENfU1RBQ0spCi0JCWZsb3BweS0+cnFfc3RhY2tfaW5kZXggPSAwOwotCXJldHVybiAoJmZsb3BweS0+cnFfc3RhY2tbZmxvcHB5LT5ycV9zdGFja19pbmRleCsrXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZV9mbG9wcHlfY2FsbGJhY2soaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZmxvcHB5LT5wYzsKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IGRyaXZlLT5wYzsKIAlpbnQgdXB0b2RhdGUgPSBwYy0+ZXJyb3IgPyAwIDogMTsKIAotCWRlYnVnX2xvZygiUmVhY2hlZCAlc1xuIiwgX19mdW5jX18pOworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGZsb3BweS0+ZmFpbGVkX3BjID09IHBjKQogCQlmbG9wcHktPmZhaWxlZF9wYyA9IE5VTEw7CkBAIC0zMTksNyArMTc5LDcgQEAKIAkgICAgKHBjLT5ycSAmJiBibGtfcGNfcmVxdWVzdChwYy0+cnEpKSkKIAkJdXB0b2RhdGUgPSAxOyAvKiBGSVhNRSAqLwogCWVsc2UgaWYgKHBjLT5jWzBdID09IEdQQ01EX1JFUVVFU1RfU0VOU0UpIHsKLQkJdTggKmJ1ZiA9IGZsb3BweS0+cGMtPmJ1ZjsKKwkJdTggKmJ1ZiA9IHBjLT5idWY7CiAKIAkJaWYgKCFwYy0+ZXJyb3IpIHsKIAkJCWZsb3BweS0+c2Vuc2Vfa2V5ID0gYnVmWzJdICYgMHgwRjsKQEAgLTMyOSwxMDggKzE4OSwyMCBAQAogCQkJCSh1MTYpZ2V0X3VuYWxpZ25lZCgodTE2ICopJmJ1ZlsxNl0pIDogMHgxMDAwMDsKIAogCQkJaWYgKGZsb3BweS0+ZmFpbGVkX3BjKQotCQkJCWRlYnVnX2xvZygicGMgPSAleCwgIiwgZmxvcHB5LT5mYWlsZWRfcGMtPmNbMF0pOworCQkJCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QQywgInBjID0gJXgsICIsCisJCQkJCSAgICAgIGZsb3BweS0+ZmFpbGVkX3BjLT5jWzBdKTsKIAotCQkJZGVidWdfbG9nKCJzZW5zZSBrZXkgPSAleCwgYXNjID0gJXgsIGFzY3EgPSAleFxuIiwKLQkJCQkgIGZsb3BweS0+c2Vuc2Vfa2V5LCBmbG9wcHktPmFzYywgZmxvcHB5LT5hc2NxKTsKKwkJCWlkZV9kZWJ1Z19sb2coSURFX0RCR19TRU5TRSwgInNlbnNlIGtleSA9ICV4LCBhc2MgPSAleCwiCisJCQkJICAgICAgImFzY3EgPSAleFxuIiwgZmxvcHB5LT5zZW5zZV9rZXksCisJCQkJICAgICAgZmxvcHB5LT5hc2MsIGZsb3BweS0+YXNjcSk7CiAJCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbiBSRVFVRVNUIFNFTlNFIGl0c2VsZiAtICIKLQkJCQkJIkFib3J0aW5nIHJlcXVlc3QhXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkVycm9yIGluIFJFUVVFU1QgU0VOU0UgaXRzZWxmIC0gIgorCQkJICAgICAgICJBYm9ydGluZyByZXF1ZXN0IVxuIik7CiAJfQogCiAJaWRlZmxvcHB5X2VuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9pbml0X3BjKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQotewotCW1lbXNldChwYywgMCwgc2l6ZW9mKCpwYykpOwotCXBjLT5idWYgPSBwYy0+cGNfYnVmOwotCXBjLT5idWZfc2l6ZSA9IElERUZMT1BQWV9QQ19CVUZGRVJfU0laRTsKLX0KLQotc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKLXsKLQlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7Ci0JcGMtPmNbMF0gPSBHUENNRF9SRVFVRVNUX1NFTlNFOwotCXBjLT5jWzRdID0gMjU1OwotCXBjLT5yZXFfeGZlciA9IDE4OwotfQotCi0vKgotICogQ2FsbGVkIHdoZW4gYW4gZXJyb3Igd2FzIGRldGVjdGVkIGR1cmluZyB0aGUgbGFzdCBwYWNrZXQgY29tbWFuZC4gV2UgcXVldWUgYQotICogcmVxdWVzdCBzZW5zZSBwYWNrZXQgY29tbWFuZCBpbiB0aGUgaGVhZCBvZiB0aGUgcmVxdWVzdCBsaXN0LgotICovCi1zdGF0aWMgdm9pZCBpZGVmbG9wcHlfcmV0cnlfcGMoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQotCSh2b2lkKWlkZV9yZWFkX2Vycm9yKGRyaXZlKTsKLQlwYyA9IGlkZWZsb3BweV9uZXh0X3BjX3N0b3JhZ2UoZHJpdmUpOwotCXJxID0gaWRlZmxvcHB5X25leHRfcnFfc3RvcmFnZShkcml2ZSk7Ci0JaWRlZmxvcHB5X2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChwYyk7Ci0JaWRlZmxvcHB5X3F1ZXVlX3BjX2hlYWQoZHJpdmUsIHBjLCBycSk7Ci19Ci0KLS8qIFRoZSB1c3VhbCBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgZHVyaW5nIGEgcGFja2V0IGNvbW1hbmQuICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZWZsb3BweV9wY19pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiBpZGVfcGNfaW50cihkcml2ZSwgZmxvcHB5LT5wYywgaWRlZmxvcHB5X3BjX2ludHIsCi0JCQkgICBJREVGTE9QUFlfV0FJVF9DTUQsIE5VTEwsIGlkZWZsb3BweV91cGRhdGVfYnVmZmVycywKLQkJCSAgIGlkZWZsb3BweV9yZXRyeV9wYywgTlVMTCwgaWRlX2Zsb3BweV9pb19idWZmZXJzKTsKLX0KLQotLyoKLSAqIFdoYXQgd2UgaGF2ZSBoZXJlIGlzIGEgY2xhc3NpYyBjYXNlIG9mIGEgdG9wIGhhbGYgLyBib3R0b20gaGFsZiBpbnRlcnJ1cHQKLSAqIHNlcnZpY2Ugcm91dGluZS4gSW4gaW50ZXJydXB0IG1vZGUsIHRoZSBkZXZpY2Ugc2VuZHMgYW4gaW50ZXJydXB0IHRvIHNpZ25hbAotICogdGhhdCBpdCBpcyByZWFkeSB0byByZWNlaXZlIGEgcGFja2V0LiBIb3dldmVyLCB3ZSBuZWVkIHRvIGRlbGF5IGFib3V0IDItMwotICogdGlja3MgYmVmb3JlIGlzc3VpbmcgdGhlIHBhY2tldCBvciB3ZSBnZXRzIGluIHRyb3VibGUuCi0gKi8KLXN0YXRpYyBpbnQgaWRlZmxvcHB5X3RyYW5zZmVyX3BjKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQotCS8qIFNlbmQgdGhlIGFjdHVhbCBwYWNrZXQgKi8KLQlkcml2ZS0+aHdpZi0+dHBfb3BzLT5vdXRwdXRfZGF0YShkcml2ZSwgTlVMTCwgZmxvcHB5LT5wYy0+YywgMTIpOwotCi0JLyogVGltZW91dCBmb3IgdGhlIHBhY2tldCBjb21tYW5kICovCi0JcmV0dXJuIElERUZMT1BQWV9XQUlUX0NNRDsKLX0KLQotCi0vKgotICogQ2FsbGVkIGFzIGFuIGludGVycnVwdCAob3IgZGlyZWN0bHkpLiBXaGVuIHRoZSBkZXZpY2Ugc2F5cyBpdCdzIHJlYWR5IGZvciBhCi0gKiBwYWNrZXQsIHdlIHNjaGVkdWxlIHRoZSBwYWNrZXQgdHJhbnNmZXIgdG8gb2NjdXIgYWJvdXQgMi0zIHRpY2tzIGxhdGVyIGluCi0gKiB0cmFuc2Zlcl9wYy4KLSAqLwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVmbG9wcHlfc3RhcnRfcGNfdHJhbnNmZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZmxvcHB5LT5wYzsKLQlpZGVfZXhwaXJ5X3QgKmV4cGlyeTsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBkZWxheSBzb2x2ZXMgYSBwcm9ibGVtIHdpdGggQVRBUEkgWmlwIDEwMCBkcml2ZXMKLQkgKiB3aGVyZSB0aGUgQnVzeSBmbGFnIHdhcyBhcHBhcmVudGx5IGJlaW5nIGRlYXNzZXJ0ZWQgYmVmb3JlIHRoZQotCSAqIHVuaXQgd2FzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YS4gVGhpcyB3YXMgaGFwcGVuaW5nIG9uIGEKLQkgKiAxMjAwIE1IeiBBdGhsb24gc3lzdGVtLiAxMC8yNi8wMSAyNW1zZWMgaXMgdG9vIHNob3J0LAotCSAqIDQwIGFuZCA1MG1zZWMgd29yayB3ZWxsLiBpZGVmbG9wcHlfcGNfaW50ciB3aWxsIG5vdCBiZSBhY3R1YWxseQotCSAqIHVzZWQgdW50aWwgYWZ0ZXIgdGhlIHBhY2tldCBpcyBtb3ZlZCBpbiBhYm91dCA1MCBtc2VjLgotCSAqLwotCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfWklQX0RSSVZFKSB7Ci0JCXRpbWVvdXQgPSBmbG9wcHktPnRpY2tzOwotCQlleHBpcnkgPSAmaWRlZmxvcHB5X3RyYW5zZmVyX3BjOwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSBJREVGTE9QUFlfV0FJVF9DTUQ7Ci0JCWV4cGlyeSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIGlkZV90cmFuc2Zlcl9wYyhkcml2ZSwgcGMsIGlkZWZsb3BweV9wY19pbnRyLCB0aW1lb3V0LCBleHBpcnkpOwotfQotCiBzdGF0aWMgdm9pZCBpZGVfZmxvcHB5X3JlcG9ydF9lcnJvcihpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSwKIAkJCQkgICAgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCiB7CkBAIC00NDAsNyArMjEyLDcgQEAKIAkgICAgZmxvcHB5LT5hc2NxICAgICAgPT0gMHgwMCkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiAlczogSS9PIGVycm9yLCBwYyA9ICUyeCwga2V5ID0gJTJ4LCAiCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEkvTyBlcnJvciwgcGMgPSAlMngsIGtleSA9ICUyeCwgIgogCQkJImFzYyA9ICUyeCwgYXNjcSA9ICUyeFxuIiwKIAkJCWZsb3BweS0+ZHJpdmUtPm5hbWUsIHBjLT5jWzBdLCBmbG9wcHktPnNlbnNlX2tleSwKIAkJCWZsb3BweS0+YXNjLCBmbG9wcHktPmFzY3EpOwpAQCAtNDU1LDggKzIyNyw5IEBACiAJaWYgKGZsb3BweS0+ZmFpbGVkX3BjID09IE5VTEwgJiYKIAkgICAgcGMtPmNbMF0gIT0gR1BDTURfUkVRVUVTVF9TRU5TRSkKIAkJZmxvcHB5LT5mYWlsZWRfcGMgPSBwYzsKKwogCS8qIFNldCB0aGUgY3VycmVudCBwYWNrZXQgY29tbWFuZCAqLwotCWZsb3BweS0+cGMgPSBwYzsKKwlkcml2ZS0+cGMgPSBwYzsKIAogCWlmIChwYy0+cmV0cmllcyA+IElERUZMT1BQWV9NQVhfUENfUkVUUklFUykgewogCQlpZiAoIShwYy0+ZmxhZ3MgJiBQQ19GTEFHX1NVUFBSRVNTX0VSUk9SKSkKQEAgLTQ2NSw2NyArMjM4LDM1IEBACiAJCXBjLT5lcnJvciA9IElERUZMT1BQWV9FUlJPUl9HRU5FUkFMOwogCiAJCWZsb3BweS0+ZmFpbGVkX3BjID0gTlVMTDsKLQkJZHJpdmUtPnBjX2NhbGxiYWNrKGRyaXZlKTsKKwkJZHJpdmUtPnBjX2NhbGxiYWNrKGRyaXZlLCAwKTsKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCX0KIAotCWRlYnVnX2xvZygiUmV0cnkgbnVtYmVyIC0gJWRcbiIsIHBjLT5yZXRyaWVzKTsKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIiVzOiBSZXRyeSAjJWRcbiIsIF9fZnVuY19fLCBwYy0+cmV0cmllcyk7CiAKIAlwYy0+cmV0cmllcysrOwogCi0JcmV0dXJuIGlkZV9pc3N1ZV9wYyhkcml2ZSwgcGMsIGlkZWZsb3BweV9zdGFydF9wY190cmFuc2ZlciwKLQkJCSAgICBJREVGTE9QUFlfV0FJVF9DTUQsIE5VTEwpOworCXJldHVybiBpZGVfaXNzdWVfcGMoZHJpdmUsIFdBSVRfRkxPUFBZX0NNRCwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIGludCBwcmV2ZW50KQordm9pZCBpZGVfZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKIHsKLQlkZWJ1Z19sb2coImNyZWF0aW5nIHByZXZlbnQgcmVtb3ZhbCBjb21tYW5kLCBwcmV2ZW50ID0gJWRcbiIsIHByZXZlbnQpOwotCi0JaWRlZmxvcHB5X2luaXRfcGMocGMpOwotCXBjLT5jWzBdID0gR1BDTURfUFJFVkVOVF9BTExPV19NRURJVU1fUkVNT1ZBTDsKLQlwYy0+Y1s0XSA9IHByZXZlbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9jcmVhdGVfcmVhZF9jYXBhY2l0eV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCi17Ci0JaWRlZmxvcHB5X2luaXRfcGMocGMpOworCWlkZV9pbml0X3BjKHBjKTsKIAlwYy0+Y1swXSA9IEdQQ01EX1JFQURfRk9STUFUX0NBUEFDSVRJRVM7CiAJcGMtPmNbN10gPSAyNTU7CiAJcGMtPmNbOF0gPSAyNTU7CiAJcGMtPnJlcV94ZmVyID0gMjU1OwogfQogCi1zdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX2Zvcm1hdF91bml0X2NtZChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywgaW50IGIsCi0JCWludCBsLCBpbnQgZmxhZ3MpCi17Ci0JaWRlZmxvcHB5X2luaXRfcGMocGMpOwotCXBjLT5jWzBdID0gR1BDTURfRk9STUFUX1VOSVQ7Ci0JcGMtPmNbMV0gPSAweDE3OwotCi0JbWVtc2V0KHBjLT5idWYsIDAsIDEyKTsKLQlwYy0+YnVmWzFdID0gMHhBMjsKLQkvKiBEZWZhdWx0IGZvcm1hdCBsaXN0IGhlYWRlciwgdTggMTogRk9WL0RDUlQvSU1NIGJpdHMgc2V0ICovCi0KLQlpZiAoZmxhZ3MgJiAxKQkJCQkvKiBWZXJpZnkgYml0IG9uLi4uICovCi0JCXBjLT5idWZbMV0gXj0gMHgyMDsJCS8qIC4uLiB0dXJuIG9mZiBEQ1JUIGJpdCAqLwotCXBjLT5idWZbM10gPSA4OwotCi0JcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUzMihiKSwgKHVuc2lnbmVkIGludCAqKSgmcGMtPmJ1Zls0XSkpOwotCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIobCksICh1bnNpZ25lZCBpbnQgKikoJnBjLT5idWZbOF0pKTsKLQlwYy0+YnVmX3NpemUgPSAxMjsKLQlwYy0+ZmxhZ3MgfD0gUENfRkxBR19XUklUSU5HOwotfQotCiAvKiBBIG1vZGUgc2Vuc2UgY29tbWFuZCBpcyB1c2VkIHRvICJzZW5zZSIgZmxvcHB5IHBhcmFtZXRlcnMuICovCi1zdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX21vZGVfc2Vuc2VfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQl1OCBwYWdlX2NvZGUsIHU4IHR5cGUpCit2b2lkIGlkZV9mbG9wcHlfY3JlYXRlX21vZGVfc2Vuc2VfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCB1OCBwYWdlX2NvZGUpCiB7CiAJdTE2IGxlbmd0aCA9IDg7IC8qIHNpemVvZihNb2RlIFBhcmFtZXRlciBIZWFkZXIpID0gOCBCeXRlcyAqLwogCi0JaWRlZmxvcHB5X2luaXRfcGMocGMpOworCWlkZV9pbml0X3BjKHBjKTsKIAlwYy0+Y1swXSA9IEdQQ01EX01PREVfU0VOU0VfMTA7CiAJcGMtPmNbMV0gPSAwOwotCXBjLT5jWzJdID0gcGFnZV9jb2RlICsgKHR5cGUgPDwgNik7CisJcGMtPmNbMl0gPSBwYWdlX2NvZGU7CiAKIAlzd2l0Y2ggKHBhZ2VfY29kZSkgewogCWNhc2UgSURFRkxPUFBZX0NBUEFCSUxJVElFU19QQUdFOgpAQCAtNTM1LDMyICsyNzYsMjUgQEAKIAkJbGVuZ3RoICs9IDMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IHVuc3VwcG9ydGVkIHBhZ2UgY29kZSAiCi0JCQkJImluIGNyZWF0ZV9tb2RlX3NlbnNlX2NtZFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuc3VwcG9ydGVkIHBhZ2UgY29kZSBpbiAlc1xuIiwgX19mdW5jX18pOwogCX0KIAlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTE2KGxlbmd0aCksICh1MTYgKikgJnBjLT5jWzddKTsKIAlwYy0+cmVxX3hmZXIgPSBsZW5ndGg7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9jcmVhdGVfc3RhcnRfc3RvcF9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIGludCBzdGFydCkKLXsKLQlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7Ci0JcGMtPmNbMF0gPSBHUENNRF9TVEFSVF9TVE9QX1VOSVQ7Ci0JcGMtPmNbNF0gPSBzdGFydDsKLX0KLQotc3RhdGljIHZvaWQgaWRlZmxvcHB5X2NyZWF0ZV9yd19jbWQoaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHksCitzdGF0aWMgdm9pZCBpZGVmbG9wcHlfY3JlYXRlX3J3X2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsCiAJCQkJICAgIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VjdG9yKQogeworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCWludCBibG9jayA9IHNlY3RvciAvIGZsb3BweS0+YnNfZmFjdG9yOwogCWludCBibG9ja3MgPSBycS0+bnJfc2VjdG9ycyAvIGZsb3BweS0+YnNfZmFjdG9yOwogCWludCBjbWQgPSBycV9kYXRhX2RpcihycSk7CiAKLQlkZWJ1Z19sb2coImNyZWF0ZV9ydzEwX2NtZDogYmxvY2sgPT0gJWQsIGJsb2NrcyA9PSAlZFxuIiwKLQkJYmxvY2ssIGJsb2Nrcyk7CisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICIlczogYmxvY2s6ICVkLCBibG9ja3M6ICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgYmxvY2ssIGJsb2Nrcyk7CiAKLQlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7CisJaWRlX2luaXRfcGMocGMpOwogCXBjLT5jWzBdID0gY21kID09IFJFQUQgPyBHUENNRF9SRUFEXzEwIDogR1BDTURfV1JJVEVfMTA7CiAJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNihibG9ja3MpLCAodW5zaWduZWQgc2hvcnQgKikmcGMtPmNbN10pOwogCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIoYmxvY2spLCAodW5zaWduZWQgaW50ICopICZwYy0+Y1syXSk7CkBAIC01NjgsNyArMzAyLDcgQEAKIAltZW1jcHkocnEtPmNtZCwgcGMtPmMsIDEyKTsKIAogCXBjLT5ycSA9IHJxOwotCXBjLT5iX2NvdW50ID0gY21kID09IFJFQUQgPyAwIDogcnEtPmJpby0+Ymlfc2l6ZTsKKwlwYy0+Yl9jb3VudCA9IDA7CiAJaWYgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUlcpCiAJCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dSSVRJTkc7CiAJcGMtPmJ1ZiA9IE5VTEw7CkBAIC01NzksMTAgKzMxMywxMCBAQAogc3RhdGljIHZvaWQgaWRlZmxvcHB5X2Jsb2NrcGNfY21kKGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LAogCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJbWVtY3B5KHBjLT5jLCBycS0+Y21kLCBzaXplb2YocGMtPmMpKTsKIAlwYy0+cnEgPSBycTsKLQlwYy0+Yl9jb3VudCA9IHJxLT5kYXRhX2xlbjsKKwlwYy0+Yl9jb3VudCA9IDA7CiAJaWYgKHJxLT5kYXRhX2xlbiAmJiBycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCiAJCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dSSVRJTkc7CiAJcGMtPmJ1ZiA9IHJxLT5kYXRhOwpAQCAtNTk5LDk1ICszMzMsODkgQEAKIAkJc3RydWN0IHJlcXVlc3QgKnJxLCBzZWN0b3JfdCBibG9ja19zKQogewogCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYzsKIAl1bnNpZ25lZCBsb25nIGJsb2NrID0gKHVuc2lnbmVkIGxvbmcpYmxvY2tfczsKIAotCWRlYnVnX2xvZygiZGV2OiAlcywgY21kX3R5cGU6ICV4LCBlcnJvcnM6ICVkXG4iLAotCQkJcnEtPnJxX2Rpc2sgPyBycS0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iLAotCQkJcnEtPmNtZF90eXBlLCBycS0+ZXJyb3JzKTsKLQlkZWJ1Z19sb2coInNlY3RvcjogJWxkLCBucl9zZWN0b3JzOiAlbGQsICIKLQkJCSJjdXJyZW50X25yX3NlY3RvcnM6ICVkXG4iLCAobG9uZylycS0+c2VjdG9yLAotCQkJcnEtPm5yX3NlY3RvcnMsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCWlkZV9kZWJ1Z19sb2coSURFX0RCR19GVU5DLCAiJXM6IGRldjogJXMsIGNtZDogMHgleCwgY21kX3R5cGU6ICV4LCAiCisJCSAgICAgICJlcnJvcnM6ICVkXG4iLAorCQkgICAgICBfX2Z1bmNfXywgcnEtPnJxX2Rpc2sgPyBycS0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iLAorCQkgICAgICBycS0+Y21kWzBdLCBycS0+Y21kX3R5cGUsIHJxLT5lcnJvcnMpOworCisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICIlczogc2VjdG9yOiAlbGQsIG5yX3NlY3RvcnM6ICVsZCwgIgorCQkgICAgICAiY3VycmVudF9ucl9zZWN0b3JzOiAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIChsb25nKXJxLT5zZWN0b3IsIHJxLT5ucl9zZWN0b3JzLAorCQkgICAgICBycS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKIAogCWlmIChycS0+ZXJyb3JzID49IEVSUk9SX01BWCkgewogCQlpZiAoZmxvcHB5LT5mYWlsZWRfcGMpCiAJCQlpZGVfZmxvcHB5X3JlcG9ydF9lcnJvcihmbG9wcHksIGZsb3BweS0+ZmFpbGVkX3BjKTsKIAkJZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiAlczogSS9PIGVycm9yXG4iLAotCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBJL08gZXJyb3JcbiIsIGRyaXZlLT5uYW1lKTsKKwogCQlpZGVmbG9wcHlfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCWlmIChibGtfZnNfcmVxdWVzdChycSkpIHsKIAkJaWYgKCgobG9uZylycS0+c2VjdG9yICUgZmxvcHB5LT5ic19mYWN0b3IpIHx8CiAJCSAgICAocnEtPm5yX3NlY3RvcnMgJSBmbG9wcHktPmJzX2ZhY3RvcikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuc3VwcG9ydGVkIHIvdyByZXF1ZXN0IHNpemVcbiIsCi0JCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiB1bnN1cHBvcnRlZCByL3cgcnEgc2l6ZVxuIiwKKwkJCQlkcml2ZS0+bmFtZSk7CiAJCQlpZGVmbG9wcHlfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwogCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCQl9Ci0JCXBjID0gaWRlZmxvcHB5X25leHRfcGNfc3RvcmFnZShkcml2ZSk7Ci0JCWlkZWZsb3BweV9jcmVhdGVfcndfY21kKGZsb3BweSwgcGMsIHJxLCBibG9jayk7CisJCXBjID0gJmZsb3BweS0+cXVldWVkX3BjOworCQlpZGVmbG9wcHlfY3JlYXRlX3J3X2NtZChkcml2ZSwgcGMsIHJxLCBibG9jayk7CiAJfSBlbHNlIGlmIChibGtfc3BlY2lhbF9yZXF1ZXN0KHJxKSkgewogCQlwYyA9IChzdHJ1Y3QgaWRlX2F0YXBpX3BjICopIHJxLT5idWZmZXI7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKLQkJcGMgPSBpZGVmbG9wcHlfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJcGMgPSAmZmxvcHB5LT5xdWV1ZWRfcGM7CiAJCWlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSk7CiAJfSBlbHNlIHsKLQkJYmxrX2R1bXBfcnFfZmxhZ3MocnEsCi0JCQkiaWRlLWZsb3BweTogdW5zdXBwb3J0ZWQgY29tbWFuZCBpbiBxdWV1ZSIpOworCQlibGtfZHVtcF9ycV9mbGFncyhycSwgUEZYICJ1bnN1cHBvcnRlZCBjb21tYW5kIGluIHF1ZXVlIik7CiAJCWlkZWZsb3BweV9lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKKwlpZGVfaW5pdF9zZ19jbWQoZHJpdmUsIHJxKTsKKwlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CisKKwlwYy0+c2cgPSBod2lmLT5zZ190YWJsZTsKKwlwYy0+c2dfY250ID0gaHdpZi0+c2dfbmVudHM7CisKIAlwYy0+cnEgPSBycTsKIAogCXJldHVybiBpZGVmbG9wcHlfaXNzdWVfcGMoZHJpdmUsIHBjKTsKIH0KIAogLyoKLSAqIEFkZCBhIHNwZWNpYWwgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCB0byB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwKLSAqIGFuZCB3YWl0IGZvciBpdCB0byBiZSBzZXJ2aWNlZC4KLSAqLwotc3RhdGljIGludCBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQotewotCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgZXJyb3I7Ci0KLQlycSA9IGJsa19nZXRfcmVxdWVzdChkcml2ZS0+cXVldWUsIFJFQUQsIF9fR0ZQX1dBSVQpOwotCXJxLT5idWZmZXIgPSAoY2hhciAqKSBwYzsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCW1lbWNweShycS0+Y21kLCBwYy0+YywgMTIpOwotCWVycm9yID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBmbG9wcHktPmRpc2ssIHJxLCAwKTsKLQlibGtfcHV0X3JlcXVlc3QocnEpOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi0vKgogICogTG9vayBhdCB0aGUgZmxleGlibGUgZGlzayBwYWdlIHBhcmFtZXRlcnMuIFdlIGlnbm9yZSB0aGUgQ0hTIGNhcGFjaXR5CiAgKiBwYXJhbWV0ZXJzIGFuZCB1c2UgdGhlIExCQSBwYXJhbWV0ZXJzIGluc3RlYWQuCiAgKi8KIHN0YXRpYyBpbnQgaWRlX2Zsb3BweV9nZXRfZmxleGlibGVfZGlza19wYWdlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGZsb3BweS0+ZGlzazsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCXU4ICpwYWdlOwogCWludCBjYXBhY2l0eSwgbGJhX2NhcGFjaXR5OwogCXUxNiB0cmFuc2Zlcl9yYXRlLCBzZWN0b3Jfc2l6ZSwgY3lscywgcnBtOwogCXU4IGhlYWRzLCBzZWN0b3JzOwogCi0JaWRlZmxvcHB5X2NyZWF0ZV9tb2RlX3NlbnNlX2NtZCgmcGMsIElERUZMT1BQWV9GTEVYSUJMRV9ESVNLX1BBR0UsCi0JCQkJCU1PREVfU0VOU0VfQ1VSUkVOVCk7CisJaWRlX2Zsb3BweV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVGTE9QUFlfRkxFWElCTEVfRElTS19QQUdFKTsKIAotCWlmIChpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgewotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IENhbid0IGdldCBmbGV4aWJsZSBkaXNrIHBhZ2UiCi0JCQkJIiBwYXJhbWV0ZXJzXG4iKTsKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgZ2V0IGZsZXhpYmxlIGRpc2sgcGFnZSBwYXJhbXNcbiIpOwogCQlyZXR1cm4gMTsKIAl9Ci0JZmxvcHB5LT53cCA9ICEhKHBjLmJ1ZlszXSAmIDB4ODApOwotCXNldF9kaXNrX3JvKGZsb3BweS0+ZGlzaywgZmxvcHB5LT53cCk7CisKKwlpZiAocGMuYnVmWzNdICYgMHg4MCkKKwkJZHJpdmUtPmF0YXBpX2ZsYWdzIHw9IElERV9BRkxBR19XUDsKKwllbHNlCisJCWRyaXZlLT5hdGFwaV9mbGFncyAmPSB+SURFX0FGTEFHX1dQOworCisJc2V0X2Rpc2tfcm8oZGlzaywgISEoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX1dQKSk7CisKIAlwYWdlID0gJnBjLmJ1Zls4XTsKIAogCXRyYW5zZmVyX3JhdGUgPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSZwYy5idWZbOCArIDJdKTsKQEAgLTcwMCw3ICs0MjgsNyBAQAogCWNhcGFjaXR5ID0gY3lscyAqIGhlYWRzICogc2VjdG9ycyAqIHNlY3Rvcl9zaXplOwogCiAJaWYgKG1lbWNtcChwYWdlLCAmZmxvcHB5LT5mbGV4aWJsZV9kaXNrX3BhZ2UsIDMyKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVka0IsICVkLyVkLyVkIENIUywgJWQga0JwcywgIgorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6ICVka0IsICVkLyVkLyVkIENIUywgJWQga0JwcywgIgogCQkJCSIlZCBzZWN0b3Igc2l6ZSwgJWQgcnBtXG4iLAogCQkJCWRyaXZlLT5uYW1lLCBjYXBhY2l0eSAvIDEwMjQsIGN5bHMsIGhlYWRzLAogCQkJCXNlY3RvcnMsIHRyYW5zZmVyX3JhdGUgLyA4LCBzZWN0b3Jfc2l6ZSwgcnBtKTsKQEAgLTcxMiw3ICs0NDAsNyBAQAogCWxiYV9jYXBhY2l0eSA9IGZsb3BweS0+YmxvY2tzICogZmxvcHB5LT5ibG9ja19zaXplOwogCiAJaWYgKGNhcGFjaXR5IDwgbGJhX2NhcGFjaXR5KSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFRoZSBkaXNrIHJlcG9ydHMgYSBjYXBhY2l0eSBvZiAlZCAiCisJCXByaW50ayhLRVJOX05PVElDRSBQRlggIiVzOiBUaGUgZGlzayByZXBvcnRzIGEgY2FwYWNpdHkgb2YgJWQgIgogCQkJImJ5dGVzLCBidXQgdGhlIGRyaXZlIG9ubHkgaGFuZGxlcyAlZFxuIiwKIAkJCWRyaXZlLT5uYW1lLCBsYmFfY2FwYWNpdHksIGNhcGFjaXR5KTsKIAkJZmxvcHB5LT5ibG9ja3MgPSBmbG9wcHktPmJsb2NrX3NpemUgPwpAQCAtNzIxLDIzICs0NDksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlkZWZsb3BweV9nZXRfc2ZycF9iaXQoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7Ci0KLQlmbG9wcHktPnNyZnAgPSAwOwotCWlkZWZsb3BweV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVGTE9QUFlfQ0FQQUJJTElUSUVTX1BBR0UsCi0JCQkJCQkgTU9ERV9TRU5TRV9DVVJSRU5UKTsKLQotCXBjLmZsYWdzIHw9IFBDX0ZMQUdfU1VQUFJFU1NfRVJST1I7Ci0JaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKQotCQlyZXR1cm4gMTsKLQotCWZsb3BweS0+c3JmcCA9IHBjLmJ1Zls4ICsgMl0gJiAweDQwOwotCXJldHVybiAoMCk7Ci19Ci0KIC8qCiAgKiBEZXRlcm1pbmUgaWYgYSBtZWRpYSBpcyBwcmVzZW50IGluIHRoZSBmbG9wcHkgZHJpdmUsIGFuZCBpZiBzbywgaXRzIExCQQogICogY2FwYWNpdHkuCkBAIC03NDUsNiArNDU2LDcgQEAKIHN0YXRpYyBpbnQgaWRlX2Zsb3BweV9nZXRfY2FwYWNpdHkoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZmxvcHB5LT5kaXNrOwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CiAJdTggKmNhcF9kZXNjOwogCXU4IGhlYWRlcl9sZW4sIGRlc2NfY250OwpAQCAtNzU2LDkgKzQ2OCw5IEBACiAJZmxvcHB5LT5ic19mYWN0b3IgPSAxOwogCXNldF9jYXBhY2l0eShmbG9wcHktPmRpc2ssIDApOwogCi0JaWRlZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZCgmcGMpOwotCWlmIChpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgewotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IENhbid0IGdldCBmbG9wcHkgcGFyYW1ldGVyc1xuIik7CisJaWRlX2Zsb3BweV9jcmVhdGVfcmVhZF9jYXBhY2l0eV9jbWQoJnBjKTsKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgZ2V0IGZsb3BweSBwYXJhbWV0ZXJzXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCWhlYWRlcl9sZW4gPSBwYy5idWZbM107CkBAIC03NzEsOCArNDgzLDkgQEAKIAkJYmxvY2tzID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikmcGMuYnVmW2Rlc2Nfc3RhcnRdKTsKIAkJbGVuZ3RoID0gYmUxNl90b19jcHVwKChfX2JlMTYgKikmcGMuYnVmW2Rlc2Nfc3RhcnQgKyA2XSk7CiAKLQkJZGVidWdfbG9nKCJEZXNjcmlwdG9yICVkOiAlZGtCLCAlZCBibG9ja3MsICVkIHNlY3RvciBzaXplXG4iLAotCQkJCWksIGJsb2NrcyAqIGxlbmd0aCAvIDEwMjQsIGJsb2NrcywgbGVuZ3RoKTsKKwkJaWRlX2RlYnVnX2xvZyhJREVfREJHX1BST0JFLCAiRGVzY3JpcHRvciAlZDogJWRrQiwgJWQgYmxvY2tzLCAiCisJCQkgICAgICAiJWQgc2VjdG9yIHNpemVcbiIsCisJCQkgICAgICBpLCBibG9ja3MgKiBsZW5ndGggLyAxMDI0LCBibG9ja3MsIGxlbmd0aCk7CiAKIAkJaWYgKGkpCiAJCQljb250aW51ZTsKQEAgLTc5MiwyMyArNTA1LDI0IEBACiAJCWNhc2UgQ0FQQUNJVFlfQ1VSUkVOVDoKIAkJCS8qIE5vcm1hbCBaaXAvTFMtMTIwIGRpc2tzICovCiAJCQlpZiAobWVtY21wKGNhcF9kZXNjLCAmZmxvcHB5LT5jYXBfZGVzYywgOCkpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVka0IsICVkIGJsb2NrcywgJWQgIgotCQkJCQkic2VjdG9yIHNpemVcbiIsIGRyaXZlLT5uYW1lLAotCQkJCQlibG9ja3MgKiBsZW5ndGggLyAxMDI0LCBibG9ja3MsIGxlbmd0aCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiAlZGtCLCAlZCBibG9ja3MsICVkICIKKwkJCQkgICAgICAgInNlY3RvciBzaXplXG4iLAorCQkJCSAgICAgICBkcml2ZS0+bmFtZSwgYmxvY2tzICogbGVuZ3RoIC8gMTAyNCwKKwkJCQkgICAgICAgYmxvY2tzLCBsZW5ndGgpOwogCQkJbWVtY3B5KCZmbG9wcHktPmNhcF9kZXNjLCBjYXBfZGVzYywgOCk7CiAKIAkJCWlmICghbGVuZ3RoIHx8IGxlbmd0aCAlIDUxMikgewotCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICVkIGJ5dGVzIGJsb2NrIHNpemUgIgotCQkJCQkibm90IHN1cHBvcnRlZFxuIiwgZHJpdmUtPm5hbWUsIGxlbmd0aCk7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFIFBGWCAiJXM6ICVkIGJ5dGVzIGJsb2NrIHNpemUiCisJCQkJICAgICAgICIgbm90IHN1cHBvcnRlZFxuIiwgZHJpdmUtPm5hbWUsIGxlbmd0aCk7CiAJCQl9IGVsc2UgewogCQkJCWZsb3BweS0+YmxvY2tzID0gYmxvY2tzOwogCQkJCWZsb3BweS0+YmxvY2tfc2l6ZSA9IGxlbmd0aDsKIAkJCQlmbG9wcHktPmJzX2ZhY3RvciA9IGxlbmd0aCAvIDUxMjsKIAkJCQlpZiAoZmxvcHB5LT5ic19mYWN0b3IgIT0gMSkKLQkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogd2FybmluZzogbm9uICIKLQkJCQkJCSI1MTIgYnl0ZXMgYmxvY2sgc2l6ZSBub3QgIgotCQkJCQkJImZ1bGx5IHN1cHBvcnRlZFxuIiwKLQkJCQkJCWRyaXZlLT5uYW1lKTsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFIFBGWCAiJXM6IFdhcm5pbmc6ICIKKwkJCQkJICAgICAgICJub24gNTEyIGJ5dGVzIGJsb2NrIHNpemUgbm90ICIKKwkJCQkJICAgICAgICJmdWxseSBzdXBwb3J0ZWRcbiIsCisJCQkJCSAgICAgICBkcml2ZS0+bmFtZSk7CiAJCQkJcmMgPSAwOwogCQkJfQogCQkJYnJlYWs7CkBAIC04MTcsMTQzICs1MzEsMjggQEAKIAkJCSAqIFRoaXMgaXMgYSBLRVJOX0VSUiBzbyBpdCBhcHBlYXJzIG9uIHNjcmVlbgogCQkJICogZm9yIHRoZSB1c2VyIHRvIHNlZQogCQkJICovCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBkaXNrIGluIGRyaXZlXG4iLCBkcml2ZS0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogTm8gZGlzayBpbiBkcml2ZVxuIiwKKwkJCSAgICAgICBkcml2ZS0+bmFtZSk7CiAJCQlicmVhazsKIAkJY2FzZSBDQVBBQ0lUWV9JTlZBTElEOgotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBjYXBhY2l0eSBmb3IgZGlzayAiCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogSW52YWxpZCBjYXBhY2l0eSBmb3IgZGlzayAiCiAJCQkJImluIGRyaXZlXG4iLCBkcml2ZS0+bmFtZSk7CiAJCQlicmVhazsKIAkJfQotCQlkZWJ1Z19sb2coIkRlc2NyaXB0b3IgMCBDb2RlOiAlZFxuIiwKLQkJCSAgcGMuYnVmW2Rlc2Nfc3RhcnQgKyA0XSAmIDB4MDMpOworCQlpZGVfZGVidWdfbG9nKElERV9EQkdfUFJPQkUsICJEZXNjcmlwdG9yIDAgQ29kZTogJWRcbiIsCisJCQkgICAgICBwYy5idWZbZGVzY19zdGFydCArIDRdICYgMHgwMyk7CiAJfQogCiAJLyogQ2xpayEgZGlzayBkb2VzIG5vdCBzdXBwb3J0IGdldF9mbGV4aWJsZV9kaXNrX3BhZ2UgKi8KIAlpZiAoIShkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfQ0xJS19EUklWRSkpCiAJCSh2b2lkKSBpZGVfZmxvcHB5X2dldF9mbGV4aWJsZV9kaXNrX3BhZ2UoZHJpdmUpOwogCi0Jc2V0X2NhcGFjaXR5KGZsb3BweS0+ZGlzaywgZmxvcHB5LT5ibG9ja3MgKiBmbG9wcHktPmJzX2ZhY3Rvcik7CisJc2V0X2NhcGFjaXR5KGRpc2ssIGZsb3BweS0+YmxvY2tzICogZmxvcHB5LT5ic19mYWN0b3IpOworCiAJcmV0dXJuIHJjOwogfQogCi0vKgotICogT2J0YWluIHRoZSBsaXN0IG9mIGZvcm1hdHRhYmxlIGNhcGFjaXRpZXMuCi0gKiBWZXJ5IHNpbWlsYXIgdG8gaWRlX2Zsb3BweV9nZXRfY2FwYWNpdHksIGV4Y2VwdCB0aGF0IHdlIHB1c2ggdGhlIGNhcGFjaXR5Ci0gKiBkZXNjcmlwdG9ycyB0byB1c2VybGFuZCwgaW5zdGVhZCBvZiBvdXIgb3duIHN0cnVjdHVyZXMuCi0gKgotICogVXNlcmxhbmQgZ2l2ZXMgdXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gKgotICogc3RydWN0IGlkZWZsb3BweV9mb3JtYXRfY2FwYWNpdGllcyB7Ci0gKglpbnQgbmZvcm1hdHM7Ci0gKglzdHJ1Y3QgewotICoJCWludCBuYmxvY2tzOwotICoJCWludCBibG9ja3NpemU7Ci0gKgl9IGZvcm1hdHNbXTsKLSAqIH07Ci0gKgotICogdXNlcmxhbmQgaW5pdGlhbGl6ZXMgbmZvcm1hdHMgdG8gdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZm9ybWF0c1tdIHJlY29yZHMuCi0gKiBPbiBleGl0IHdlIHNldCBuZm9ybWF0cyB0byB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd2UndmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQuCi0gKi8KLQotc3RhdGljIGludCBpZGVfZmxvcHB5X2dldF9mb3JtYXRfY2FwYWNpdGllcyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwotCXU4IGhlYWRlcl9sZW4sIGRlc2NfY250OwotCWludCBpLCBibG9ja3MsIGxlbmd0aCwgdV9hcnJheV9zaXplLCB1X2luZGV4OwotCWludCBfX3VzZXIgKmFyZ3A7Ci0KLQlpZiAoZ2V0X3VzZXIodV9hcnJheV9zaXplLCBhcmcpKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JaWYgKHVfYXJyYXlfc2l6ZSA8PSAwKQotCQlyZXR1cm4gKC1FSU5WQUwpOwotCi0JaWRlZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZCgmcGMpOwotCWlmIChpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkgewotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6IENhbid0IGdldCBmbG9wcHkgcGFyYW1ldGVyc1xuIik7Ci0JCXJldHVybiAoLUVJTyk7Ci0JfQotCWhlYWRlcl9sZW4gPSBwYy5idWZbM107Ci0JZGVzY19jbnQgPSBoZWFkZXJfbGVuIC8gODsgLyogY2FwYWNpdHkgZGVzY3JpcHRvciBvZiA4IGJ5dGVzICovCi0KLQl1X2luZGV4ID0gMDsKLQlhcmdwID0gYXJnICsgMTsKLQotCS8qCi0JICogV2UgYWx3YXlzIHNraXAgdGhlIGZpcnN0IGNhcGFjaXR5IGRlc2NyaXB0b3IuICBUaGF0J3MgdGhlIGN1cnJlbnQKLQkgKiBjYXBhY2l0eS4gIFdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSByZW1haW5pbmcgZGVzY3JpcHRvcnMsIHRoZQotCSAqIGZvcm1hdHRhYmxlIGNhcGFjaXRpZXMuCi0JICovCi0JZm9yIChpID0gMTsgaSA8IGRlc2NfY250OyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGRlc2Nfc3RhcnQgPSA0ICsgaSo4OwotCi0JCWlmICh1X2luZGV4ID49IHVfYXJyYXlfc2l6ZSkKLQkJCWJyZWFrOwkvKiBVc2VyLXN1cHBsaWVkIGJ1ZmZlciB0b28gc21hbGwgKi8KLQotCQlibG9ja3MgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSZwYy5idWZbZGVzY19zdGFydF0pOwotCQlsZW5ndGggPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSZwYy5idWZbZGVzY19zdGFydCArIDZdKTsKLQotCQlpZiAocHV0X3VzZXIoYmxvY2tzLCBhcmdwKSkKLQkJCXJldHVybigtRUZBVUxUKTsKLQkJKythcmdwOwotCi0JCWlmIChwdXRfdXNlcihsZW5ndGgsIGFyZ3ApKQotCQkJcmV0dXJuICgtRUZBVUxUKTsKLQkJKythcmdwOwotCi0JCSsrdV9pbmRleDsKLQl9Ci0KLQlpZiAocHV0X3VzZXIodV9pbmRleCwgYXJnKSkKLQkJcmV0dXJuICgtRUZBVUxUKTsKLQlyZXR1cm4gKDApOwotfQotCi0vKgotICogR2V0IEFUQVBJX0ZPUk1BVF9VTklUIHByb2dyZXNzIGluZGljYXRpb24uCi0gKgotICogVXNlcmxhbmQgZ2l2ZXMgYSBwb2ludGVyIHRvIGFuIGludC4gIFRoZSBpbnQgaXMgc2V0IHRvIGEgcHJvZ3Jlc3MKLSAqIGluZGljYXRvciAwLTY1NTM2LCB3aXRoIDY1NTM2PTEwMCUuCi0gKgotICogSWYgdGhlIGRyaXZlIGRvZXMgbm90IHN1cHBvcnQgZm9ybWF0IHByb2dyZXNzIGluZGljYXRpb24sIHdlIGp1c3QgY2hlY2sKLSAqIHRoZSBkc2MgYml0LCBhbmQgcmV0dXJuIGVpdGhlciAwIG9yIDY1NTM2LgotICovCi0KLXN0YXRpYyBpbnQgaWRlZmxvcHB5X2dldF9mb3JtYXRfcHJvZ3Jlc3MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgX191c2VyICphcmcpCi17Ci0JaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKLQlpbnQgcHJvZ3Jlc3NfaW5kaWNhdGlvbiA9IDB4MTAwMDA7Ci0KLQlpZiAoZmxvcHB5LT5zcmZwKSB7Ci0JCWlkZWZsb3BweV9jcmVhdGVfcmVxdWVzdF9zZW5zZV9jbWQoJnBjKTsKLQkJaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKQotCQkJcmV0dXJuICgtRUlPKTsKLQotCQlpZiAoZmxvcHB5LT5zZW5zZV9rZXkgPT0gMiAmJgotCQkgICAgZmxvcHB5LT5hc2MgPT0gNCAmJgotCQkgICAgZmxvcHB5LT5hc2NxID09IDQpCi0JCQlwcm9ncmVzc19pbmRpY2F0aW9uID0gZmxvcHB5LT5wcm9ncmVzc19pbmRpY2F0aW9uOwotCi0JCS8qIEVsc2UgYXNzdW1lIGZvcm1hdF91bml0IGhhcyBmaW5pc2hlZCwgYW5kIHdlJ3JlIGF0IDB4MTAwMDAgKi8KLQl9IGVsc2UgewotCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXU4IHN0YXQ7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JCXByb2dyZXNzX2luZGljYXRpb24gPSAoKHN0YXQgJiBTRUVLX1NUQVQpID09IDApID8gMCA6IDB4MTAwMDA7Ci0JfQotCWlmIChwdXRfdXNlcihwcm9ncmVzc19pbmRpY2F0aW9uLCBhcmcpKQotCQlyZXR1cm4gKC1FRkFVTFQpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHNlY3Rvcl90IGlkZWZsb3BweV9jYXBhY2l0eShpZGVfZHJpdmVfdCAqZHJpdmUpCitzZWN0b3JfdCBpZGVfZmxvcHB5X2NhcGFjaXR5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGNhcGFjaXR5ID0gZmxvcHB5LT5ibG9ja3MgKiBmbG9wcHktPmJzX2ZhY3RvcjsKQEAgLTk2MSw3NyArNTYwLDE0IEBACiAJcmV0dXJuIGNhcGFjaXR5OwogfQogCi0vKgotICogQ2hlY2sgd2hldGhlciB3ZSBjYW4gc3VwcG9ydCBhIGRyaXZlLCBiYXNlZCBvbiB0aGUgQVRBUEkgSURFTlRJRlkgY29tbWFuZAotICogcmVzdWx0cy4KLSAqLwotc3RhdGljIGludCBpZGVmbG9wcHlfaWRlbnRpZnlfZGV2aWNlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGhkX2RyaXZlaWQgKmlkKQotewotCXU4IGdjd1syXTsKLQl1OCBkZXZpY2VfdHlwZSwgcHJvdG9jb2wsIHJlbW92YWJsZSwgZHJxX3R5cGUsIHBhY2tldF9zaXplOwotCi0JKigodTE2ICopICZnY3cpID0gaWQtPmNvbmZpZzsKLQotCWRldmljZV90eXBlID0gIGdjd1sxXSAmIDB4MUY7Ci0JcmVtb3ZhYmxlICAgPSAoZ2N3WzBdICYgMHg4MCkgPj4gNzsKLQlwcm90b2NvbCAgICA9IChnY3dbMV0gJiAweEMwKSA+PiA2OwotCWRycV90eXBlICAgID0gKGdjd1swXSAmIDB4NjApID4+IDU7Ci0JcGFja2V0X3NpemUgPSAgZ2N3WzBdICYgMHgwMzsKLQotI2lmZGVmIENPTkZJR19QUEMKLQkvKiBrbHVkZ2UgZm9yIEFwcGxlIFBvd2VyQm9vayBpbnRlcm5hbCB6aXAgKi8KLQlpZiAoZGV2aWNlX3R5cGUgPT0gNSAmJgotCSAgICAhc3Ryc3RyKGlkLT5tb2RlbCwgIkNELVJPTSIpICYmIHN0cnN0cihpZC0+bW9kZWwsICJaSVAiKSkKLQkJZGV2aWNlX3R5cGUgPSAwOwotI2VuZGlmCi0KLQlpZiAocHJvdG9jb2wgIT0gMikKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBQcm90b2NvbCAoMHglMDJ4KSBpcyBub3QgQVRBUElcbiIsCi0JCQlwcm90b2NvbCk7Ci0JZWxzZSBpZiAoZGV2aWNlX3R5cGUgIT0gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBEZXZpY2UgdHlwZSAoMHglMDJ4KSBpcyBub3Qgc2V0ICIKLQkJCQkidG8gZmxvcHB5XG4iLCBkZXZpY2VfdHlwZSk7Ci0JZWxzZSBpZiAoIXJlbW92YWJsZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBUaGUgcmVtb3ZhYmxlIGZsYWcgaXMgbm90IHNldFxuIik7Ci0JZWxzZSBpZiAoZHJxX3R5cGUgPT0gMykKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBTb3JyeSwgRFJRIHR5cGUgKDB4JTAyeCkgbm90ICIKLQkJCQkic3VwcG9ydGVkXG4iLCBkcnFfdHlwZSk7Ci0JZWxzZSBpZiAocGFja2V0X3NpemUgIT0gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtZmxvcHB5OiBQYWNrZXQgc2l6ZSAoMHglMDJ4KSBpcyBub3QgMTIgIgotCQkJCSJieXRlc1xuIiwgcGFja2V0X3NpemUpOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKLXN0YXRpYyB2b2lkIGlkZWZsb3BweV9hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAiYmlvc19jeWwiLCBTRVRUSU5HX1JXLCBUWVBFX0lOVCwgMCwgMTAyMywgMSwgMSwKLQkJCSZkcml2ZS0+Ymlvc19jeWwsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImJpb3NfaGVhZCIsIFNFVFRJTkdfUlcsIFRZUEVfQllURSwgMCwgMjU1LCAxLCAxLAotCQkJJmRyaXZlLT5iaW9zX2hlYWQsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImJpb3Nfc2VjdCIsIFNFVFRJTkdfUlcsCVRZUEVfQllURSwgMCwgIDYzLCAxLCAxLAotCQkJJmRyaXZlLT5iaW9zX3NlY3QsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgInRpY2tzIiwJICAgU0VUVElOR19SVywgVFlQRV9CWVRFLCAwLCAyNTUsIDEsIDEsCi0JCQkmZmxvcHB5LT50aWNrcywJIE5VTEwpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVmbG9wcHlfYWRkX3NldHRpbmdzKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBpZGVmbG9wcHlfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSkKIHsKLQl1OCBnY3dbMl07CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAotCSooKHUxNiAqKSAmZ2N3KSA9IGRyaXZlLT5pZC0+Y29uZmlnOwotCWZsb3BweS0+cGMgPSBmbG9wcHktPnBjX3N0YWNrOwotCWRyaXZlLT5wY19jYWxsYmFjayA9IGlkZV9mbG9wcHlfY2FsbGJhY2s7CisJZHJpdmUtPnBjX2NhbGxiYWNrCSA9IGlkZV9mbG9wcHlfY2FsbGJhY2s7CisJZHJpdmUtPnBjX3VwZGF0ZV9idWZmZXJzID0gaWRlZmxvcHB5X3VwZGF0ZV9idWZmZXJzOworCWRyaXZlLT5wY19pb19idWZmZXJzCSA9IGlkZV9pb19idWZmZXJzOwogCi0JaWYgKCgoZ2N3WzBdICYgMHg2MCkgPj4gNSkgPT0gMSkKLQkJZHJpdmUtPmF0YXBpX2ZsYWdzIHw9IElERV9BRkxBR19EUlFfSU5URVJSVVBUOwogCS8qCiAJICogV2UgdXNlZCB0byBjaGVjayByZXZpc2lvbnMgaGVyZS4gQXQgdGhpcyBwb2ludCBob3dldmVyIEknbSBnaXZpbmcgdXAuCiAJICogSnVzdCBhc3N1bWUgdGhleSBhcmUgYWxsIGJyb2tlbiwgaXRzIGVhc2llci4KQEAgLTEwNDEsMTAgKzU3NywxMCBAQAogCSAqIGl0LiBJdCBzaG91bGQgYmUgZml4ZWQgYXMgb2YgdmVyc2lvbiAxLjksIGJ1dCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCiAJICogd2UnbGwgbGVhdmUgdGhlIGxpbWl0YXRpb24gYmVsb3cgZm9yIHRoZSAyLjIueCB0cmVlLgogCSAqLwotCWlmICghc3RybmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiSU9NRUdBIFpJUCAxMDAgQVRBUEkiLCAyMCkpIHsKKwlpZiAoIXN0cm5jbXAoKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdLCAiSU9NRUdBIFpJUCAxMDAgQVRBUEkiLCAyMCkpIHsKIAkJZHJpdmUtPmF0YXBpX2ZsYWdzIHw9IElERV9BRkxBR19aSVBfRFJJVkU7CiAJCS8qIFRoaXMgdmFsdWUgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSAvcHJvYy9pZGUvaGR4L3NldHRpbmdzICovCi0JCWZsb3BweS0+dGlja3MgPSBJREVGTE9QUFlfVElDS1NfREVMQVk7CisJCWRyaXZlLT5wY19kZWxheSA9IElERUZMT1BQWV9QQ19ERUxBWTsKIAkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGRyaXZlLT5xdWV1ZSwgNjQpOwogCX0KIApAQCAtMTA1MiwxMyArNTg4LDE2IEBACiAJICogR3Vlc3Mgd2hhdD8gVGhlIElPTUVHQSBDbGlrISBkcml2ZSBhbHNvIG5lZWRzIHRoZSBhYm92ZSBmaXguIEl0IG1ha2VzCiAJICogbmFzdHkgY2xpY2tpbmcgbm9pc2VzIHdpdGhvdXQgaXQsIHNvIHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcy4KIAkgKi8KLQlpZiAoc3RybmNtcChkcml2ZS0+aWQtPm1vZGVsLCAiSU9NRUdBIENsaWshIiwgMTEpID09IDApIHsKKwlpZiAoc3RybmNtcCgoY2hhciAqKSZpZFtBVEFfSURfUFJPRF0sICJJT01FR0EgQ2xpayEiLCAxMSkgPT0gMCkgewogCQlibGtfcXVldWVfbWF4X3NlY3RvcnMoZHJpdmUtPnF1ZXVlLCA2NCk7CiAJCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfQ0xJS19EUklWRTsKKwkJLyogSU9NRUdBIENsaWshIGRyaXZlcyBkbyBub3Qgc3VwcG9ydCBsb2NrL3VubG9jayBjb21tYW5kcyAqLworCQlkcml2ZS0+YXRhcGlfZmxhZ3MgfD0gSURFX0FGTEFHX05PX0RPT1JMT0NLOwogCX0KIAogCSh2b2lkKSBpZGVfZmxvcHB5X2dldF9jYXBhY2l0eShkcml2ZSk7Ci0JaWRlZmxvcHB5X2FkZF9zZXR0aW5ncyhkcml2ZSk7CisKKwlpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsIGZsb3BweS0+ZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9yZW1vdmUoaWRlX2RyaXZlX3QgKmRyaXZlKQpAQCAtMTA3NSw3ICs2MTQsNyBAQAogCiBzdGF0aWMgdm9pZCBpZGVmbG9wcHlfY2xlYW51cF9vYmooc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0Jc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSB0b19pZGVfZmxvcHB5KGtyZWYpOworCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gdG9faWRlX2RydihrcmVmLCBpZGVfZmxvcHB5X29iaik7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gZmxvcHB5LT5kcml2ZTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZyA9IGZsb3BweS0+ZGlzazsKIApAQCAtMTA4NSwyNCArNjI0LDYgQEAKIAlrZnJlZShmbG9wcHkpOwogfQogCi0jaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCi1zdGF0aWMgaW50IHByb2NfaWRlZmxvcHB5X3JlYWRfY2FwYWNpdHkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JaWRlX2RyaXZlX3QqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKilkYXRhOwotCWludCBsZW47Ci0KLQlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLCAobG9uZyBsb25nKWlkZWZsb3BweV9jYXBhY2l0eShkcml2ZSkpOwotCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Ci19Ci0KLXN0YXRpYyBpZGVfcHJvY19lbnRyeV90IGlkZWZsb3BweV9wcm9jW10gPSB7Ci0JeyAiY2FwYWNpdHkiLAlTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlZmxvcHB5X3JlYWRfY2FwYWNpdHksCU5VTEwgfSwKLQl7ICJnZW9tZXRyeSIsCVNfSUZSRUd8U19JUlVHTywgcHJvY19pZGVfcmVhZF9nZW9tZXRyeSwJTlVMTCB9LAotCXsgTlVMTCwgMCwgTlVMTCwgTlVMTCB9Ci19OwotI2VuZGlmCS8qIENPTkZJR19JREVfUFJPQ19GUyAqLwotCiBzdGF0aWMgaW50IGlkZV9mbG9wcHlfcHJvYmUoaWRlX2RyaXZlX3QgKik7CiAKIHN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlZmxvcHB5X2RyaXZlciA9IHsKQEAgLTExMTQsMTMgKzYzNSwxMiBAQAogCS5wcm9iZQkJCT0gaWRlX2Zsb3BweV9wcm9iZSwKIAkucmVtb3ZlCQkJPSBpZGVfZmxvcHB5X3JlbW92ZSwKIAkudmVyc2lvbgkJPSBJREVGTE9QUFlfVkVSU0lPTiwKLQkubWVkaWEJCQk9IGlkZV9mbG9wcHksCi0JLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMCwKIAkuZG9fcmVxdWVzdAkJPSBpZGVmbG9wcHlfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRlZmxvcHB5X2VuZF9yZXF1ZXN0LAogCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCi0JLnByb2MJCQk9IGlkZWZsb3BweV9wcm9jLAorCS5wcm9jCQkJPSBpZGVfZmxvcHB5X3Byb2MsCisJLnNldHRpbmdzCQk9IGlkZV9mbG9wcHlfc2V0dGluZ3MsCiAjZW5kaWYKIH07CiAKQEAgLTExMjksMzAgKzY0OSwyNCBAQAogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKIAlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweTsKIAlpZGVfZHJpdmVfdCAqZHJpdmU7Ci0Jc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKIAlpbnQgcmV0ID0gMDsKIAotCWRlYnVnX2xvZygiUmVhY2hlZCAlc1xuIiwgX19mdW5jX18pOwotCiAJZmxvcHB5ID0gaWRlX2Zsb3BweV9nZXQoZGlzayk7CiAJaWYgKCFmbG9wcHkpCiAJCXJldHVybiAtRU5YSU87CiAKIAlkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CiAKKwlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgIkNhbGwgJXNcbiIsIF9fZnVuY19fKTsKKwogCWZsb3BweS0+b3BlbmVycysrOwogCiAJaWYgKGZsb3BweS0+b3BlbmVycyA9PSAxKSB7CiAJCWRyaXZlLT5hdGFwaV9mbGFncyAmPSB+SURFX0FGTEFHX0ZPUk1BVF9JTl9QUk9HUkVTUzsKIAkJLyogSnVzdCBpbiBjYXNlICovCiAKLQkJaWRlZmxvcHB5X2luaXRfcGMoJnBjKTsKLQkJcGMuY1swXSA9IEdQQ01EX1RFU1RfVU5JVF9SRUFEWTsKLQotCQlpZiAoaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpIHsKLQkJCWlkZWZsb3BweV9jcmVhdGVfc3RhcnRfc3RvcF9jbWQoJnBjLCAxKTsKLQkJCSh2b2lkKSBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKLQkJfQorCQlpZiAoaWRlX2RvX3Rlc3RfdW5pdF9yZWFkeShkcml2ZSwgZGlzaykpCisJCQlpZGVfZG9fc3RhcnRfc3RvcChkcml2ZSwgZGlzaywgMSk7CiAKIAkJaWYgKGlkZV9mbG9wcHlfZ2V0X2NhcGFjaXR5KGRyaXZlKQogCQkgICAmJiAoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSA9PSAwCkBAIC0xMTY2LDE2ICs2ODAsMTMgQEAKIAkJCWdvdG8gb3V0X3B1dF9mbG9wcHk7CiAJCX0KIAotCQlpZiAoZmxvcHB5LT53cCAmJiAoZmlscC0+Zl9tb2RlICYgMikpIHsKKwkJaWYgKChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfV1ApICYmIChmaWxwLT5mX21vZGUgJiAyKSkgewogCQkJcmV0ID0gLUVST0ZTOwogCQkJZ290byBvdXRfcHV0X2Zsb3BweTsKIAkJfQorCiAJCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfTUVESUFfQ0hBTkdFRDsKLQkJLyogSU9NRUdBIENsaWshIGRyaXZlcyBkbyBub3Qgc3VwcG9ydCBsb2NrL3VubG9jayBjb21tYW5kcyAqLwotCQlpZiAoIShkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfQ0xJS19EUklWRSkpIHsKLQkJCWlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQoJnBjLCAxKTsKLQkJCSh2b2lkKSBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKLQkJfQorCQlpZGVfc2V0X21lZGlhX2xvY2soZHJpdmUsIGRpc2ssIDEpOwogCQljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKIAl9IGVsc2UgaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19GT1JNQVRfSU5fUFJPR1JFU1MpIHsKIAkJcmV0ID0gLUVCVVNZOwpAQCAtMTE5MiwxOSArNzAzLDEzIEBACiBzdGF0aWMgaW50IGlkZWZsb3BweV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKLQlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGlkZV9mbG9wcHlfZyhkaXNrKTsKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGlkZV9kcnZfZyhkaXNrLCBpZGVfZmxvcHB5X29iaik7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gZmxvcHB5LT5kcml2ZTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCi0JZGVidWdfbG9nKCJSZWFjaGVkICVzXG4iLCBfX2Z1bmNfXyk7CisJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZmxvcHB5LT5vcGVuZXJzID09IDEpIHsKLQkJLyogSU9NRUdBIENsaWshIGRyaXZlcyBkbyBub3Qgc3VwcG9ydCBsb2NrL3VubG9jayBjb21tYW5kcyAqLwotCQlpZiAoIShkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfQ0xJS19EUklWRSkpIHsKLQkJCWlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQoJnBjLCAwKTsKLQkJCSh2b2lkKSBpZGVmbG9wcHlfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKLQkJfQotCisJCWlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgZGlzaywgMCk7CiAJCWRyaXZlLT5hdGFwaV9mbGFncyAmPSB+SURFX0FGTEFHX0ZPUk1BVF9JTl9QUk9HUkVTUzsKIAl9CiAKQEAgLTEyMTcsNyArNzIyLDggQEAKIAogc3RhdGljIGludCBpZGVmbG9wcHlfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQogewotCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gaWRlX2Zsb3BweV9nKGJkZXYtPmJkX2Rpc2spOworCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gaWRlX2Rydl9nKGJkZXYtPmJkX2Rpc2ssCisJCQkJCQkgICAgIGlkZV9mbG9wcHlfb2JqKTsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBmbG9wcHktPmRyaXZlOwogCiAJZ2VvLT5oZWFkcyA9IGRyaXZlLT5iaW9zX2hlYWQ7CkBAIC0xMjI2LDEzNyArNzMyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX2Zsb3BweV9sb2NrZG9vcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBpbnQgY21kKQotewotCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JaWYgKGZsb3BweS0+b3BlbmVycyA+IDEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKiBUaGUgSU9NRUdBIENsaWshIERyaXZlIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQgLQotCSAqIG5vIHJvb20gZm9yIGFuIGVqZWN0IG1lY2hhbmlzbSAqLwotCWlmICghKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19DTElLX0RSSVZFKSkgewotCQlpbnQgcHJldmVudCA9IGFyZyA/IDEgOiAwOwotCi0JCWlmIChjbWQgPT0gQ0RST01FSkVDVCkKLQkJCXByZXZlbnQgPSAwOwotCi0JCWlkZWZsb3BweV9jcmVhdGVfcHJldmVudF9jbWQocGMsIHByZXZlbnQpOwotCQkodm9pZCkgaWRlZmxvcHB5X3F1ZXVlX3BjX3RhaWwoZmxvcHB5LT5kcml2ZSwgcGMpOwotCX0KLQotCWlmIChjbWQgPT0gQ0RST01FSkVDVCkgewotCQlpZGVmbG9wcHlfY3JlYXRlX3N0YXJ0X3N0b3BfY21kKHBjLCAyKTsKLQkJKHZvaWQpIGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGZsb3BweS0+ZHJpdmUsIHBjKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpZGVfZmxvcHB5X2Zvcm1hdF91bml0KGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LAotCQkJCSAgaW50IF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gZmxvcHB5LT5kcml2ZTsKLQlpbnQgYmxvY2tzLCBsZW5ndGgsIGZsYWdzLCBlcnIgPSAwOwotCi0JaWYgKGZsb3BweS0+b3BlbmVycyA+IDEpIHsKLQkJLyogRG9uJ3QgZm9ybWF0IGlmIHNvbWVvbmUgaXMgdXNpbmcgdGhlIGRpc2sgKi8KLQkJZHJpdmUtPmF0YXBpX2ZsYWdzICY9IH5JREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOwotCi0JLyoKLQkgKiBTZW5kIEFUQVBJX0ZPUk1BVF9VTklUIHRvIHRoZSBkcml2ZS4KLQkgKgotCSAqIFVzZXJsYW5kIGdpdmVzIHVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotCSAqCi0JICogc3RydWN0IGlkZWZsb3BweV9mb3JtYXRfY29tbWFuZCB7Ci0JICogICAgICAgIGludCBuYmxvY2tzOwotCSAqICAgICAgICBpbnQgYmxvY2tzaXplOwotCSAqICAgICAgICBpbnQgZmxhZ3M7Ci0JICogICAgICAgIH0gOwotCSAqCi0JICogZmxhZ3MgaXMgYSBiaXRtYXNrLCBjdXJyZW50bHksIHRoZSBvbmx5IGRlZmluZWQgZmxhZyBpczoKLQkgKgotCSAqICAgICAgICAweDAxIC0gdmVyaWZ5IG1lZGlhIGFmdGVyIGZvcm1hdC4KLQkgKi8KLQlpZiAoZ2V0X3VzZXIoYmxvY2tzLCBhcmcpIHx8Ci0JCQlnZXRfdXNlcihsZW5ndGgsIGFyZysxKSB8fAotCQkJZ2V0X3VzZXIoZmxhZ3MsIGFyZysyKSkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkodm9pZCkgaWRlZmxvcHB5X2dldF9zZnJwX2JpdChkcml2ZSk7Ci0JaWRlZmxvcHB5X2NyZWF0ZV9mb3JtYXRfdW5pdF9jbWQoJnBjLCBibG9ja3MsIGxlbmd0aCwgZmxhZ3MpOwotCi0JaWYgKGlkZWZsb3BweV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKQotCQllcnIgPSAtRUlPOwotCi1vdXQ6Ci0JaWYgKGVycikKLQkJZHJpdmUtPmF0YXBpX2ZsYWdzICY9IH5JREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOwotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIGludCBpZGVmbG9wcHlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKLQlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGlkZV9mbG9wcHlfZyhiZGV2LT5iZF9kaXNrKTsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSBmbG9wcHktPmRyaXZlOwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IGVycjsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBDRFJPTUVKRUNUOgotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIENEUk9NX0xPQ0tET09SOgotCQlyZXR1cm4gaWRlX2Zsb3BweV9sb2NrZG9vcihkcml2ZSwgJnBjLCBhcmcsIGNtZCk7Ci0JY2FzZSBJREVGTE9QUFlfSU9DVExfRk9STUFUX1NVUFBPUlRFRDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBJREVGTE9QUFlfSU9DVExfRk9STUFUX0dFVF9DQVBBQ0lUWToKLQkJcmV0dXJuIGlkZV9mbG9wcHlfZ2V0X2Zvcm1hdF9jYXBhY2l0aWVzKGRyaXZlLCBhcmdwKTsKLQljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1RBUlQ6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIDIpKQotCQkJcmV0dXJuIC1FUEVSTTsKLQotCQlyZXR1cm4gaWRlX2Zsb3BweV9mb3JtYXRfdW5pdChmbG9wcHksIChpbnQgX191c2VyICopYXJnKTsKLQljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX1BST0dSRVNTOgotCQlyZXR1cm4gaWRlZmxvcHB5X2dldF9mb3JtYXRfcHJvZ3Jlc3MoZHJpdmUsIGFyZ3ApOwotCX0KLQotCS8qCi0JICogc2tpcCBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORCAoZGVwcmVjYXRlZCkKLQkgKiBhbmQgQ0RST01fU0VORF9QQUNLRVQgKGxlZ2FjeSkgaW9jdGxzCi0JICovCi0JaWYgKGNtZCAhPSBDRFJPTV9TRU5EX1BBQ0tFVCAmJiBjbWQgIT0gU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQpCi0JCWVyciA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkZXYtPmJkX2Rpc2stPnF1ZXVlLAotCQkJCQliZGV2LT5iZF9kaXNrLCBjbWQsIGFyZ3ApOwotCWVsc2UKLQkJZXJyID0gLUVOT1RUWTsKLQotCWlmIChlcnIgPT0gLUVOT1RUWSkKLQkJZXJyID0gZ2VuZXJpY19pZGVfaW9jdGwoZHJpdmUsIGZpbGUsIGJkZXYsIGNtZCwgYXJnKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgaWRlZmxvcHB5X21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0Jc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSBpZGVfZmxvcHB5X2coZGlzayk7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSBpZGVfZHJ2X2coZGlzaywgaWRlX2Zsb3BweV9vYmopOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CiAJaW50IHJldDsKIAogCS8qIGRvIG5vdCBzY2FuIHBhcnRpdGlvbnMgdHdpY2UgaWYgdGhpcyBpcyBhIHJlbW92YWJsZSBkZXZpY2UgKi8KLQlpZiAoZHJpdmUtPmF0dGFjaCkgewotCQlkcml2ZS0+YXR0YWNoID0gMDsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19BVFRBQ0gpIHsKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0FUVEFDSDsKIAkJcmV0dXJuIDA7CiAJfQogCXJldCA9ICEhKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19NRURJQV9DSEFOR0VEKTsKQEAgLTEzNjYsOCArNzUwLDggQEAKIAogc3RhdGljIGludCBpZGVmbG9wcHlfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewotCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gaWRlX2Zsb3BweV9nKGRpc2spOwotCXNldF9jYXBhY2l0eShkaXNrLCBpZGVmbG9wcHlfY2FwYWNpdHkoZmxvcHB5LT5kcml2ZSkpOworCXN0cnVjdCBpZGVfZmxvcHB5X29iaiAqZmxvcHB5ID0gaWRlX2Rydl9nKGRpc2ssIGlkZV9mbG9wcHlfb2JqKTsKKwlzZXRfY2FwYWNpdHkoZGlzaywgaWRlX2Zsb3BweV9jYXBhY2l0eShmbG9wcHktPmRyaXZlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNzUsNyArNzU5LDcgQEAKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQkJPSBpZGVmbG9wcHlfb3BlbiwKIAkucmVsZWFzZQkJPSBpZGVmbG9wcHlfcmVsZWFzZSwKLQkuaW9jdGwJCQk9IGlkZWZsb3BweV9pb2N0bCwKKwkuaW9jdGwJCQk9IGlkZV9mbG9wcHlfaW9jdGwsCiAJLmdldGdlbwkJCT0gaWRlZmxvcHB5X2dldGdlbywKIAkubWVkaWFfY2hhbmdlZAkJPSBpZGVmbG9wcHlfbWVkaWFfY2hhbmdlZCwKIAkucmV2YWxpZGF0ZV9kaXNrCT0gaWRlZmxvcHB5X3JldmFsaWRhdGVfZGlzawpAQCAtMTM4OCwxOSArNzcyLDE5IEBACiAKIAlpZiAoIXN0cnN0cigiaWRlLWZsb3BweSIsIGRyaXZlLT5kcml2ZXJfcmVxKSkKIAkJZ290byBmYWlsZWQ7Ci0JaWYgKCFkcml2ZS0+cHJlc2VudCkKLQkJZ290byBmYWlsZWQ7CisKIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9mbG9wcHkpCiAJCWdvdG8gZmFpbGVkOwotCWlmICghaWRlZmxvcHB5X2lkZW50aWZ5X2RldmljZShkcml2ZSwgZHJpdmUtPmlkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6ICVzOiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiIKLQkJCQkiIG9mIGlkZS1mbG9wcHlcbiIsIGRyaXZlLT5uYW1lKTsKKworCWlmICghaWRlX2NoZWNrX2F0YXBpX2RldmljZShkcml2ZSwgRFJWX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiAiCisJCSAgICAgICBEUlZfTkFNRSAiXG4iLCBkcml2ZS0+bmFtZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAlmbG9wcHkgPSBremFsbG9jKHNpemVvZihpZGVmbG9wcHlfZmxvcHB5X3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZsb3BweSkgewotCQlwcmludGsoS0VSTl9FUlIgImlkZS1mbG9wcHk6ICVzOiBDYW4ndCBhbGxvY2F0ZSBhIGZsb3BweSIKLQkJCQkiIHN0cnVjdHVyZVxuIiwgZHJpdmUtPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ2FuJ3QgYWxsb2NhdGUgYSBmbG9wcHkgc3RydWN0dXJlXG4iLAorCQkgICAgICAgZHJpdmUtPm5hbWUpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTE0MTAsOCArNzk0LDYgQEAKIAogCWlkZV9pbml0X2Rpc2soZywgZHJpdmUpOwogCi0JaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlLCAmaWRlZmxvcHB5X2RyaXZlcik7Ci0KIAlrcmVmX2luaXQoJmZsb3BweS0+a3JlZik7CiAKIAlmbG9wcHktPmRyaXZlID0gZHJpdmU7CkBAIC0xNDIyLDEzICs4MDQsMTYgQEAKIAogCWRyaXZlLT5kcml2ZXJfZGF0YSA9IGZsb3BweTsKIAorCWRyaXZlLT5kZWJ1Z19tYXNrID0gZGVidWdfbWFzazsKKwogCWlkZWZsb3BweV9zZXR1cChkcml2ZSwgZmxvcHB5KTsKKwlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19BVFRBQ0g7CiAKIAlnLT5taW5vcnMgPSAxIDw8IFBBUlROX0JJVFM7CiAJZy0+ZHJpdmVyZnNfZGV2ID0gJmRyaXZlLT5nZW5kZXY7Ci0JZy0+ZmxhZ3MgPSBkcml2ZS0+cmVtb3ZhYmxlID8gR0VOSERfRkxfUkVNT1ZBQkxFIDogMDsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19SRU1PVkFCTEUpCisJCWctPmZsYWdzID0gR0VOSERfRkxfUkVNT1ZBQkxFOwogCWctPmZvcHMgPSAmaWRlZmxvcHB5X29wczsKLQlkcml2ZS0+YXR0YWNoID0gMTsKIAlhZGRfZGlzayhnKTsKIAlyZXR1cm4gMDsKIApAQCAtMTQ0NSwxMSArODMwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlkZWZsb3BweV9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJpZGUtZmxvcHB5IGRyaXZlciAiIElERUZMT1BQWV9WRVJTSU9OICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiBkcml2ZXIgIiBJREVGTE9QUFlfVkVSU0lPTiAiXG4iKTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZpZGVmbG9wcHlfZHJpdmVyLmdlbl9kcml2ZXIpOwogfQogCiBNT0RVTEVfQUxJQVMoImlkZToqbS1mbG9wcHkqIik7CitNT0RVTEVfQUxJQVMoImlkZS1mbG9wcHkiKTsKIG1vZHVsZV9pbml0KGlkZWZsb3BweV9pbml0KTsKIG1vZHVsZV9leGl0KGlkZWZsb3BweV9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuaCBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NmODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5oCkBAIC0wLDAgKzEsNjIgQEAKKyNpZm5kZWYgX19JREVfRkxPUFBZX0gKKyNkZWZpbmUgX19JREVfRkxPUFBZX0gKKworLyoKKyAqIE1vc3Qgb2Ygb3VyIGdsb2JhbCBkYXRhIHdoaWNoIHdlIG5lZWQgdG8gc2F2ZSBldmVuIGFzIHdlIGxlYXZlIHRoZSBkcml2ZXIKKyAqIGR1ZSB0byBhbiBpbnRlcnJ1cHQgb3IgYSB0aW1lciBldmVudCBpcyBzdG9yZWQgaW4gYSB2YXJpYWJsZSBvZiB0eXBlCisgKiBpZGVmbG9wcHlfZmxvcHB5X3QsIGRlZmluZWQgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlkZV9mbG9wcHlfb2JqIHsKKwlpZGVfZHJpdmVfdAkqZHJpdmU7CisJaWRlX2RyaXZlcl90CSpkcml2ZXI7CisJc3RydWN0IGdlbmRpc2sJKmRpc2s7CisJc3RydWN0IGtyZWYJa3JlZjsKKwl1bnNpZ25lZCBpbnQJb3BlbmVyczsJLyogcHJvdGVjdGVkIGJ5IEJLTCBmb3Igbm93ICovCisKKwkvKiBMYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCAqLworCXN0cnVjdCBpZGVfYXRhcGlfcGMgKmZhaWxlZF9wYzsKKwkvKiB1c2VkIGZvciBibGtfe2ZzLHBjfV9yZXF1ZXN0KCkgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHF1ZXVlZF9wYzsKKworCS8qIExhc3QgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwl1OCBzZW5zZV9rZXksIGFzYywgYXNjcTsKKworCWludCBwcm9ncmVzc19pbmRpY2F0aW9uOworCisJLyogRGV2aWNlIGluZm9ybWF0aW9uICovCisJLyogQ3VycmVudCBmb3JtYXQgKi8KKwlpbnQgYmxvY2tzLCBibG9ja19zaXplLCBic19mYWN0b3I7CisJLyogTGFzdCBmb3JtYXQgY2FwYWNpdHkgZGVzY3JpcHRvciAqLworCXU4IGNhcF9kZXNjWzhdOworCS8qIENvcHkgb2YgdGhlIGZsZXhpYmxlIGRpc2sgcGFnZSAqLworCXU4IGZsZXhpYmxlX2Rpc2tfcGFnZVszMl07Cit9IGlkZWZsb3BweV9mbG9wcHlfdDsKKworLyoKKyAqIFBhZ2VzIG9mIHRoZSBTRUxFQ1QgU0VOU0UgLyBNT0RFIFNFTlNFIHBhY2tldCBjb21tYW5kcy4KKyAqIFNlZSBTRkYtODA3MGkgc3BlYy4KKyAqLworI2RlZmluZQlJREVGTE9QUFlfQ0FQQUJJTElUSUVTX1BBR0UJMHgxYgorI2RlZmluZSBJREVGTE9QUFlfRkxFWElCTEVfRElTS19QQUdFCTB4MDUKKworLyogSU9DVExzIHVzZWQgaW4gbG93LWxldmVsIGZvcm1hdHRpbmcuICovCisjZGVmaW5lCUlERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1VQUE9SVEVECTB4NDYwMAorI2RlZmluZQlJREVGTE9QUFlfSU9DVExfRk9STUFUX0dFVF9DQVBBQ0lUWQkweDQ2MDEKKyNkZWZpbmUJSURFRkxPUFBZX0lPQ1RMX0ZPUk1BVF9TVEFSVAkJMHg0NjAyCisjZGVmaW5lIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX1BST0dSRVNTCTB4NDYwMworCisvKiBpZGUtZmxvcHB5LmMgKi8KK3ZvaWQgaWRlX2Zsb3BweV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqLCB1OCk7Cit2b2lkIGlkZV9mbG9wcHlfY3JlYXRlX3JlYWRfY2FwYWNpdHlfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKik7CitzZWN0b3JfdCBpZGVfZmxvcHB5X2NhcGFjaXR5KGlkZV9kcml2ZV90ICopOworCisvKiBpZGUtZmxvcHB5X2lvY3RsLmMgKi8KK2ludCBpZGVfZmxvcHB5X2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyk7CisKKyNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKKy8qIGlkZS1mbG9wcHlfcHJvYy5jICovCitleHRlcm4gaWRlX3Byb2NfZW50cnlfdCBpZGVfZmxvcHB5X3Byb2NbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0IGlkZV9mbG9wcHlfc2V0dGluZ3NbXTsKKyNlbmRpZgorCisjZW5kaWYgLypfX0lERV9GTE9QUFlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9pb2N0bC5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTdhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5X2lvY3RsLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBpZGUtZmxvcHB5IElPQ1RMcyBoYW5kbGluZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorCisjaW5jbHVkZSAiaWRlLWZsb3BweS5oIgorCisvKgorICogT2J0YWluIHRoZSBsaXN0IG9mIGZvcm1hdHRhYmxlIGNhcGFjaXRpZXMuCisgKiBWZXJ5IHNpbWlsYXIgdG8gaWRlX2Zsb3BweV9nZXRfY2FwYWNpdHksIGV4Y2VwdCB0aGF0IHdlIHB1c2ggdGhlIGNhcGFjaXR5CisgKiBkZXNjcmlwdG9ycyB0byB1c2VybGFuZCwgaW5zdGVhZCBvZiBvdXIgb3duIHN0cnVjdHVyZXMuCisgKgorICogVXNlcmxhbmQgZ2l2ZXMgdXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKgorICogc3RydWN0IGlkZWZsb3BweV9mb3JtYXRfY2FwYWNpdGllcyB7CisgKglpbnQgbmZvcm1hdHM7CisgKglzdHJ1Y3QgeworICoJCWludCBuYmxvY2tzOworICoJCWludCBibG9ja3NpemU7CisgKgl9IGZvcm1hdHNbXTsKKyAqIH07CisgKgorICogdXNlcmxhbmQgaW5pdGlhbGl6ZXMgbmZvcm1hdHMgdG8gdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZm9ybWF0c1tdIHJlY29yZHMuCisgKiBPbiBleGl0IHdlIHNldCBuZm9ybWF0cyB0byB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd2UndmUgYWN0dWFsbHkgaW5pdGlhbGl6ZWQuCisgKi8KKworc3RhdGljIGludCBpZGVfZmxvcHB5X2dldF9mb3JtYXRfY2FwYWNpdGllcyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaWRlX2Zsb3BweV9vYmogKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOworCXU4IGhlYWRlcl9sZW4sIGRlc2NfY250OworCWludCBpLCBibG9ja3MsIGxlbmd0aCwgdV9hcnJheV9zaXplLCB1X2luZGV4OworCWludCBfX3VzZXIgKmFyZ3A7CisKKwlpZiAoZ2V0X3VzZXIodV9hcnJheV9zaXplLCBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh1X2FycmF5X3NpemUgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZGVfZmxvcHB5X2NyZWF0ZV9yZWFkX2NhcGFjaXR5X2NtZCgmcGMpOworCWlmIChpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZmxvcHB5LT5kaXNrLCAmcGMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLWZsb3BweTogQ2FuJ3QgZ2V0IGZsb3BweSBwYXJhbWV0ZXJzXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaGVhZGVyX2xlbiA9IHBjLmJ1ZlszXTsKKwlkZXNjX2NudCA9IGhlYWRlcl9sZW4gLyA4OyAvKiBjYXBhY2l0eSBkZXNjcmlwdG9yIG9mIDggYnl0ZXMgKi8KKworCXVfaW5kZXggPSAwOworCWFyZ3AgPSBhcmcgKyAxOworCisJLyoKKwkgKiBXZSBhbHdheXMgc2tpcCB0aGUgZmlyc3QgY2FwYWNpdHkgZGVzY3JpcHRvci4gIFRoYXQncyB0aGUgY3VycmVudAorCSAqIGNhcGFjaXR5LiAgV2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIHJlbWFpbmluZyBkZXNjcmlwdG9ycywgdGhlCisJICogZm9ybWF0dGFibGUgY2FwYWNpdGllcy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgZGVzY19jbnQ7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgZGVzY19zdGFydCA9IDQgKyBpKjg7CisKKwkJaWYgKHVfaW5kZXggPj0gdV9hcnJheV9zaXplKQorCQkJYnJlYWs7CS8qIFVzZXItc3VwcGxpZWQgYnVmZmVyIHRvbyBzbWFsbCAqLworCisJCWJsb2NrcyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopJnBjLmJ1ZltkZXNjX3N0YXJ0XSk7CisJCWxlbmd0aCA9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJnBjLmJ1ZltkZXNjX3N0YXJ0ICsgNl0pOworCisJCWlmIChwdXRfdXNlcihibG9ja3MsIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJKythcmdwOworCisJCWlmIChwdXRfdXNlcihsZW5ndGgsIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJKythcmdwOworCisJCSsrdV9pbmRleDsKKwl9CisKKwlpZiAocHV0X3VzZXIodV9pbmRleCwgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWRlX2Zsb3BweV9jcmVhdGVfZm9ybWF0X3VuaXRfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCBpbnQgYiwKKwkJaW50IGwsIGludCBmbGFncykKK3sKKwlpZGVfaW5pdF9wYyhwYyk7CisJcGMtPmNbMF0gPSBHUENNRF9GT1JNQVRfVU5JVDsKKwlwYy0+Y1sxXSA9IDB4MTc7CisKKwltZW1zZXQocGMtPmJ1ZiwgMCwgMTIpOworCXBjLT5idWZbMV0gPSAweEEyOworCS8qIERlZmF1bHQgZm9ybWF0IGxpc3QgaGVhZGVyLCB1OCAxOiBGT1YvRENSVC9JTU0gYml0cyBzZXQgKi8KKworCWlmIChmbGFncyAmIDEpCQkJCS8qIFZlcmlmeSBiaXQgb24uLi4gKi8KKwkJcGMtPmJ1ZlsxXSBePSAweDIwOwkJLyogLi4uIHR1cm4gb2ZmIERDUlQgYml0ICovCisJcGMtPmJ1ZlszXSA9IDg7CisKKwlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGIpLCAodW5zaWduZWQgaW50ICopKCZwYy0+YnVmWzRdKSk7CisJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUzMihsKSwgKHVuc2lnbmVkIGludCAqKSgmcGMtPmJ1Zls4XSkpOworCXBjLT5idWZfc2l6ZSA9IDEyOworCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dSSVRJTkc7Cit9CisKK3N0YXRpYyBpbnQgaWRlX2Zsb3BweV9nZXRfc2ZycF9iaXQoaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCWlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CisKKwlkcml2ZS0+YXRhcGlfZmxhZ3MgJj0gfklERV9BRkxBR19TUkZQOworCisJaWRlX2Zsb3BweV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVGTE9QUFlfQ0FQQUJJTElUSUVTX1BBR0UpOworCXBjLmZsYWdzIHw9IFBDX0ZMQUdfU1VQUFJFU1NfRVJST1I7CisKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGZsb3BweS0+ZGlzaywgJnBjKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAocGMuYnVmWzggKyAyXSAmIDB4NDApCisJCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfU1JGUDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZV9mbG9wcHlfZm9ybWF0X3VuaXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgX191c2VyICphcmcpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKKwlpbnQgYmxvY2tzLCBsZW5ndGgsIGZsYWdzLCBlcnIgPSAwOworCisJaWYgKGZsb3BweS0+b3BlbmVycyA+IDEpIHsKKwkJLyogRG9uJ3QgZm9ybWF0IGlmIHNvbWVvbmUgaXMgdXNpbmcgdGhlIGRpc2sgKi8KKwkJZHJpdmUtPmF0YXBpX2ZsYWdzICY9IH5JREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRyaXZlLT5hdGFwaV9mbGFncyB8PSBJREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOworCisJLyoKKwkgKiBTZW5kIEFUQVBJX0ZPUk1BVF9VTklUIHRvIHRoZSBkcml2ZS4KKwkgKgorCSAqIFVzZXJsYW5kIGdpdmVzIHVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCSAqCisJICogc3RydWN0IGlkZWZsb3BweV9mb3JtYXRfY29tbWFuZCB7CisJICogICAgICAgIGludCBuYmxvY2tzOworCSAqICAgICAgICBpbnQgYmxvY2tzaXplOworCSAqICAgICAgICBpbnQgZmxhZ3M7CisJICogICAgICAgIH0gOworCSAqCisJICogZmxhZ3MgaXMgYSBiaXRtYXNrLCBjdXJyZW50bHksIHRoZSBvbmx5IGRlZmluZWQgZmxhZyBpczoKKwkgKgorCSAqICAgICAgICAweDAxIC0gdmVyaWZ5IG1lZGlhIGFmdGVyIGZvcm1hdC4KKwkgKi8KKwlpZiAoZ2V0X3VzZXIoYmxvY2tzLCBhcmcpIHx8CisJCQlnZXRfdXNlcihsZW5ndGgsIGFyZysxKSB8fAorCQkJZ2V0X3VzZXIoZmxhZ3MsIGFyZysyKSkgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwkodm9pZClpZGVfZmxvcHB5X2dldF9zZnJwX2JpdChkcml2ZSk7CisJaWRlX2Zsb3BweV9jcmVhdGVfZm9ybWF0X3VuaXRfY21kKCZwYywgYmxvY2tzLCBsZW5ndGgsIGZsYWdzKTsKKworCWlmIChpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZmxvcHB5LT5kaXNrLCAmcGMpKQorCQllcnIgPSAtRUlPOworCitvdXQ6CisJaWYgKGVycikKKwkJZHJpdmUtPmF0YXBpX2ZsYWdzICY9IH5JREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBHZXQgQVRBUElfRk9STUFUX1VOSVQgcHJvZ3Jlc3MgaW5kaWNhdGlvbi4KKyAqCisgKiBVc2VybGFuZCBnaXZlcyBhIHBvaW50ZXIgdG8gYW4gaW50LiAgVGhlIGludCBpcyBzZXQgdG8gYSBwcm9ncmVzcworICogaW5kaWNhdG9yIDAtNjU1MzYsIHdpdGggNjU1MzY9MTAwJS4KKyAqCisgKiBJZiB0aGUgZHJpdmUgZG9lcyBub3Qgc3VwcG9ydCBmb3JtYXQgcHJvZ3Jlc3MgaW5kaWNhdGlvbiwgd2UganVzdCBjaGVjaworICogdGhlIGRzYyBiaXQsIGFuZCByZXR1cm4gZWl0aGVyIDAgb3IgNjU1MzYuCisgKi8KKworc3RhdGljIGludCBpZGVfZmxvcHB5X2dldF9mb3JtYXRfcHJvZ3Jlc3MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgX191c2VyICphcmcpCit7CisJaWRlZmxvcHB5X2Zsb3BweV90ICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKKwlpbnQgcHJvZ3Jlc3NfaW5kaWNhdGlvbiA9IDB4MTAwMDA7CisKKwlpZiAoZHJpdmUtPmF0YXBpX2ZsYWdzICYgSURFX0FGTEFHX1NSRlApIHsKKwkJaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChkcml2ZSwgJnBjKTsKKwkJaWYgKGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCBmbG9wcHktPmRpc2ssICZwYykpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAoZmxvcHB5LT5zZW5zZV9rZXkgPT0gMiAmJgorCQkgICAgZmxvcHB5LT5hc2MgPT0gNCAmJgorCQkgICAgZmxvcHB5LT5hc2NxID09IDQpCisJCQlwcm9ncmVzc19pbmRpY2F0aW9uID0gZmxvcHB5LT5wcm9ncmVzc19pbmRpY2F0aW9uOworCisJCS8qIEVsc2UgYXNzdW1lIGZvcm1hdF91bml0IGhhcyBmaW5pc2hlZCwgYW5kIHdlJ3JlIGF0IDB4MTAwMDAgKi8KKwl9IGVsc2UgeworCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXU4IHN0YXQ7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCXByb2dyZXNzX2luZGljYXRpb24gPSAoKHN0YXQgJiBBVEFfRFNDKSA9PSAwKSA/IDAgOiAweDEwMDAwOworCX0KKworCWlmIChwdXRfdXNlcihwcm9ncmVzc19pbmRpY2F0aW9uLCBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZV9mbG9wcHlfbG9ja2Rvb3IoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGZsb3BweS0+ZGlzazsKKwlpbnQgcHJldmVudCA9IChhcmcgJiYgY21kICE9IENEUk9NRUpFQ1QpID8gMSA6IDA7CisKKwlpZiAoZmxvcHB5LT5vcGVuZXJzID4gMSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgZGlzaywgcHJldmVudCk7CisKKwlpZiAoY21kID09IENEUk9NRUpFQ1QpCisJCWlkZV9kb19zdGFydF9zdG9wKGRyaXZlLCBkaXNrLCAyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlkZV9mbG9wcHlfZm9ybWF0X2lvY3RsKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfU1VQUE9SVEVEOgorCQlyZXR1cm4gMDsKKwljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX0NBUEFDSVRZOgorCQlyZXR1cm4gaWRlX2Zsb3BweV9nZXRfZm9ybWF0X2NhcGFjaXRpZXMoZHJpdmUsIGFyZ3ApOworCWNhc2UgSURFRkxPUFBZX0lPQ1RMX0ZPUk1BVF9TVEFSVDoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgMikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gaWRlX2Zsb3BweV9mb3JtYXRfdW5pdChkcml2ZSwgKGludCBfX3VzZXIgKilhcmdwKTsKKwljYXNlIElERUZMT1BQWV9JT0NUTF9GT1JNQVRfR0VUX1BST0dSRVNTOgorCQlyZXR1cm4gaWRlX2Zsb3BweV9nZXRfZm9ybWF0X3Byb2dyZXNzKGRyaXZlLCBhcmdwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKK2ludCBpZGVfZmxvcHB5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGlub2RlLT5pX2JkZXY7CisJc3RydWN0IGlkZV9mbG9wcHlfb2JqICpmbG9wcHkgPSBpZGVfZHJ2X2coYmRldi0+YmRfZGlzaywKKwkJCQkJCSAgICAgaWRlX2Zsb3BweV9vYmopOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGZsb3BweS0+ZHJpdmU7CisJc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCisJaWYgKGNtZCA9PSBDRFJPTUVKRUNUIHx8IGNtZCA9PSBDRFJPTV9MT0NLRE9PUikKKwkJcmV0dXJuIGlkZV9mbG9wcHlfbG9ja2Rvb3IoZHJpdmUsICZwYywgYXJnLCBjbWQpOworCisJZXJyID0gaWRlX2Zsb3BweV9mb3JtYXRfaW9jdGwoZHJpdmUsIGZpbGUsIGNtZCwgYXJncCk7CisJaWYgKGVyciAhPSAtRU5PVFRZKQorCQlyZXR1cm4gZXJyOworCisJLyoKKwkgKiBza2lwIFNDU0lfSU9DVExfU0VORF9DT01NQU5EIChkZXByZWNhdGVkKQorCSAqIGFuZCBDRFJPTV9TRU5EX1BBQ0tFVCAobGVnYWN5KSBpb2N0bHMKKwkgKi8KKwlpZiAoY21kICE9IENEUk9NX1NFTkRfUEFDS0VUICYmIGNtZCAhPSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORCkKKwkJZXJyID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmRldi0+YmRfZGlzay0+cXVldWUsCisJCQkJCWJkZXYtPmJkX2Rpc2ssIGNtZCwgYXJncCk7CisKKwlpZiAoZXJyID09IC1FTk9UVFkpCisJCWVyciA9IGdlbmVyaWNfaWRlX2lvY3RsKGRyaXZlLCBmaWxlLCBiZGV2LCBjbWQsIGFyZyk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5X3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmYwYzZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisjaW5jbHVkZSAiaWRlLWZsb3BweS5oIgorCitzdGF0aWMgaW50IHByb2NfaWRlZmxvcHB5X3JlYWRfY2FwYWNpdHkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaWRlX2RyaXZlX3QqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKilkYXRhOworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLCAobG9uZyBsb25nKWlkZV9mbG9wcHlfY2FwYWNpdHkoZHJpdmUpKTsKKwlQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitpZGVfcHJvY19lbnRyeV90IGlkZV9mbG9wcHlfcHJvY1tdID0geworCXsgImNhcGFjaXR5IiwJU19JRlJFR3xTX0lSVUdPLCBwcm9jX2lkZWZsb3BweV9yZWFkX2NhcGFjaXR5LAlOVUxMIH0sCisJeyAiZ2VvbWV0cnkiLAlTX0lGUkVHfFNfSVJVR08sIHByb2NfaWRlX3JlYWRfZ2VvbWV0cnksCU5VTEwgfSwKKwl7IE5VTEwsIDAsIE5VTEwsIE5VTEwgfQorfTsKKworaWRlX2RldnNldF9yd19maWVsZChiaW9zX2N5bCwgYmlvc19jeWwpOworaWRlX2RldnNldF9yd19maWVsZChiaW9zX2hlYWQsIGJpb3NfaGVhZCk7CitpZGVfZGV2c2V0X3J3X2ZpZWxkKGJpb3Nfc2VjdCwgYmlvc19zZWN0KTsKK2lkZV9kZXZzZXRfcndfZmllbGQodGlja3MsIHBjX2RlbGF5KTsKKworY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCBpZGVfZmxvcHB5X3NldHRpbmdzW10gPSB7CisJSURFX1BST0NfREVWU0VUKGJpb3NfY3lsLCAgMCwgMTAyMyksCisJSURFX1BST0NfREVWU0VUKGJpb3NfaGVhZCwgMCwgIDI1NSksCisJSURFX1BST0NfREVWU0VUKGJpb3Nfc2VjdCwgMCwgICA2MyksCisJSURFX1BST0NfREVWU0VUKHRpY2tzLAkgICAwLCAgMjU1KSwKKwl7IDAgfSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZ2VuZXJpYy5jIGIvZHJpdmVycy9pZGUvaWRlLWdlbmVyaWMuYwppbmRleCA4ZmU4YjViLi44MWE1MjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1nZW5lcmljLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogCiAvKiBGSVhNRTogY29udmVydCBtMzJyIHRvIHVzZSBpZGVfcGxhdGZvcm0gaG9zdCBkcml2ZXIgKi8KICNpZmRlZiBDT05GSUdfTTMyUgpAQCAtMjcsNyArMjgsNyBAQAogCiAjZGVmaW5lIERSVl9OQU1FCSJpZGVfZ2VuZXJpYyIKIAotc3RhdGljIGludCBwcm9iZV9tYXNrID0gMHgwMzsKK3N0YXRpYyBpbnQgcHJvYmVfbWFzazsKIG1vZHVsZV9wYXJhbShwcm9iZV9tYXNrLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9tYXNrLCAicHJvYmUgbWFzayBmb3IgbGVnYWN5IElTQSBJREUgcG9ydHMiKTsKIApAQCAtMTAwLDI3ICsxMDEsNjQgQEAKIHN0YXRpYyBjb25zdCBpbnQgbGVnYWN5X2lycXNbXSAgPSB7IDE0LCAxNSwgMTEsIDEwLCA4LCAxMiB9OwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGlkZV9nZW5lcmljX2NoZWNrX3BjaV9sZWdhY3lfaW9iYXNlcyhpbnQgKnByaW1hcnksIGludCAqc2Vjb25kYXJ5KQoreworCXN0cnVjdCBwY2lfZGV2ICpwID0gTlVMTDsKKwl1MTYgdmFsOworCisJZm9yX2VhY2hfcGNpX2RldihwKSB7CisKKwkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwLCAwKSA9PSAweDFmMCkKKwkJCSpwcmltYXJ5ID0gMTsKKwkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwLCAyKSA9PSAweDE3MCkKKwkJCSpzZWNvbmRhcnkgPSAxOworCisJCS8qIEN5cml4IENTNTV7MSwyfTAgcHJlIFNGRiBNV0RNQSBBVEEgb24gdGhlIGJyaWRnZSAqLworCQlpZiAocC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ1lSSVggJiYKKwkJICAgIChwLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DWVJJWF81NTEwIHx8CisJCSAgICAgcC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkpCisJCQkqcHJpbWFyeSA9ICpzZWNvbmRhcnkgPSAxOworCisJCS8qIEludGVsIE1QSUlYIC0gUElPIEFUQSBvbiBub24gUENJIHNpZGUgb2YgYnJpZGdlICovCisJCWlmIChwLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJgorCQkgICAgcC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFNWCkgeworCisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwLCAweDZDLCAmdmFsKTsKKwkJCWlmICh2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBBVEEgcG9ydCBlbmFibGVkICovCisJCQkJaWYgKHZhbCAmIDB4NDAwMCkKKwkJCQkJKnNlY29uZGFyeSA9IDE7CisJCQkJZWxzZQorCQkJCQkqcHJpbWFyeSA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGlkZV9nZW5lcmljX2luaXQodm9pZCkKIHsKLQlod19yZWdzX3QgaHdbTUFYX0hXSUZTXSwgKmh3c1tNQVhfSFdJRlNdOwotCXN0cnVjdCBpZGVfaG9zdCAqaG9zdDsKKwlod19yZWdzX3QgaHcsICpod3NbXSA9IHsgJmh3LCBOVUxMLCBOVUxMLCBOVUxMIH07CiAJdW5zaWduZWQgbG9uZyBpb19hZGRyOwotCWludCBpLCByYzsKKwlpbnQgaSwgcmMgPSAwLCBwcmltYXJ5ID0gMCwgc2Vjb25kYXJ5ID0gMDsKIAotI2lmZGVmIENPTkZJR19NSVBTCi0JaWYgKCFpZGVfcHJvYmVfbGVnYWN5KCkpCi0JCXJldHVybiAtRU5PREVWOwotI2VuZGlmCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBwbGVhc2UgdXNlIFwicHJvYmVfbWFzaz0weDNmXCIgbW9kdWxlICIKLQkJCSAicGFyYW1ldGVyIGZvciBwcm9iaW5nIGFsbCBsZWdhY3kgSVNBIElERSBwb3J0c1xuIik7CisJaWRlX2dlbmVyaWNfY2hlY2tfcGNpX2xlZ2FjeV9pb2Jhc2VzKCZwcmltYXJ5LCAmc2Vjb25kYXJ5KTsKIAotCW1lbXNldChod3MsIDAsIHNpemVvZihod19yZWdzX3QgKikgKiBNQVhfSFdJRlMpOworCWlmICghcHJvYmVfbWFzaykgeworCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IHBsZWFzZSB1c2UgXCJwcm9iZV9tYXNrPTB4M2ZcIiAiCisJCSAgICAgIm1vZHVsZSBwYXJhbWV0ZXIgZm9yIHByb2JpbmcgYWxsIGxlZ2FjeSBJU0EgSURFIHBvcnRzXG4iKTsKKworCQlpZiAocHJpbWFyeSA9PSAwKQorCQkJcHJvYmVfbWFzayB8PSAweDE7CisKKwkJaWYgKHNlY29uZGFyeSA9PSAwKQorCQkJcHJvYmVfbWFzayB8PSAweDI7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIjogZW5mb3JjaW5nIHByb2Jpbmcgb2YgSS9PIHBvcnRzICIKKwkJCSJ1cG9uIHVzZXIgcmVxdWVzdFxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsZWdhY3lfYmFzZXMpOyBpKyspIHsKIAkJaW9fYWRkciA9IGxlZ2FjeV9iYXNlc1tpXTsKIAotCQlod3NbaV0gPSBOVUxMOwotCiAJCWlmICgocHJvYmVfbWFzayAmICgxIDw8IGkpKSAmJiBpb19hZGRyKSB7CiAJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX2FkZHIsIDgsIERSVl9OQU1FKSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEkvTyByZXNvdXJjZSAweCVsWC0weCVsWCAiCkBAIC0xMzcsNDUgKzE3NSwyNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQltZW1zZXQoJmh3W2ldLCAwLCBzaXplb2YoaHdbaV0pKTsKLQkJCWlkZV9zdGRfaW5pdF9wb3J0cygmaHdbaV0sIGlvX2FkZHIsIGlvX2FkZHIgKyAweDIwNik7CisJCQltZW1zZXQoJmh3LCAwLCBzaXplb2YoaHcpKTsKKwkJCWlkZV9zdGRfaW5pdF9wb3J0cygmaHcsIGlvX2FkZHIsIGlvX2FkZHIgKyAweDIwNik7CiAjaWZkZWYgQ09ORklHX0lBNjQKLQkJCWh3W2ldLmlycSA9IGlzYV9pcnFfdG9fdmVjdG9yKGxlZ2FjeV9pcnFzW2ldKTsKKwkJCWh3LmlycSA9IGlzYV9pcnFfdG9fdmVjdG9yKGxlZ2FjeV9pcnFzW2ldKTsKICNlbHNlCi0JCQlod1tpXS5pcnEgPSBsZWdhY3lfaXJxc1tpXTsKKwkJCWh3LmlycSA9IGxlZ2FjeV9pcnFzW2ldOwogI2VuZGlmCi0JCQlod1tpXS5jaGlwc2V0ID0gaWRlX2dlbmVyaWM7CisJCQlody5jaGlwc2V0ID0gaWRlX2dlbmVyaWM7CiAKLQkJCWh3c1tpXSA9ICZod1tpXTsKKwkJCXJjID0gaWRlX2hvc3RfYWRkKE5VTEwsIGh3cywgTlVMTCk7CisJCQlpZiAocmMpIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihpb19hZGRyICsgMHgyMDYsIDEpOworCQkJCXJlbGVhc2VfcmVnaW9uKGlvX2FkZHIsIDgpOworCQkJfQogCQl9CiAJfQogCi0JaG9zdCA9IGlkZV9ob3N0X2FsbG9jX2FsbChOVUxMLCBod3MpOwotCWlmIChob3N0ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyYyA9IGlkZV9ob3N0X3JlZ2lzdGVyKGhvc3QsIE5VTEwsIGh3cyk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9mcmVlOwotCiAJaWYgKGlkZV9nZW5lcmljX3N5c2ZzX2luaXQoKSkKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGZhaWxlZCB0byBjcmVhdGUgaWRlX2dlbmVyaWMgIgogCQkJCQkgImNsYXNzXG4iKTsKIAotCXJldHVybiAwOwotZXJyX2ZyZWU6Ci0JaWRlX2hvc3RfZnJlZShob3N0KTsKLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspIHsKLQkJaWYgKGh3c1tpXSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJaW9fYWRkciA9IGh3c1tpXS0+aW9fcG9ydHMuZGF0YV9hZGRyOwotCQlyZWxlYXNlX3JlZ2lvbihpb19hZGRyICsgMHgyMDYsIDEpOwotCQlyZWxlYXNlX3JlZ2lvbihpb19hZGRyLCA4KTsKLQl9CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IGE4OTZhMjguLjc3YzZlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgpAQCAtNzcsOCArNzgsOSBAQAogCSAqIGRlY2lkZSB3aGV0aGVyIHRvIHJlZW5hYmxlIERNQSAtLSAzIGlzIGEgcmFuZG9tIG1hZ2ljIGZvciBub3csCiAJICogaWYgd2UgRE1BIHRpbWVvdXQgbW9yZSB0aGFuIDMgdGltZXMsIGp1c3Qgc3RheSBpbiBQSU8KIAkgKi8KLQlpZiAoZHJpdmUtPnN0YXRlID09IERNQV9QSU9fUkVUUlkgJiYgZHJpdmUtPnJldHJ5X3BpbyA8PSAzKSB7Ci0JCWRyaXZlLT5zdGF0ZSA9IDA7CisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0RNQV9QSU9fUkVUUlkpICYmCisJICAgIGRyaXZlLT5yZXRyeV9waW8gPD0gMykgeworCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRE1BX1BJT19SRVRSWTsKIAkJaWRlX2RtYV9vbihkcml2ZSk7CiAJfQogCkBAIC0xMzAsMjEgKzEzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9lbmRfcmVxdWVzdCk7CiAKLS8qCi0gKiBQb3dlciBNYW5hZ2VtZW50IHN0YXRlIG1hY2hpbmUuIFRoaXMgb25lIGlzIHJhdGhlciB0cml2aWFsIGZvciBub3csCi0gKiB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIG1vcmUsIGxpa2Ugc3dpdGNoaW5nIGJhY2sgdG8gUElPIG9uIHN1c3BlbmQKLSAqIHRvIGhlbHAgc29tZSBCSU9TZXMsIHJlLWRvIHRoZSBkb29yIGxvY2tpbmcgb24gcmVzdW1lLCBldGMuLi4KLSAqLwotCi1lbnVtIHsKLQlpZGVfcG1fZmx1c2hfY2FjaGUJPSBpZGVfcG1fc3RhdGVfc3RhcnRfc3VzcGVuZCwKLQlpZGVkaXNrX3BtX3N0YW5kYnksCi0KLQlpZGVkaXNrX3BtX3Jlc3RvcmVfcGlvCT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZSwKLQlpZGVkaXNrX3BtX2lkbGUsCi0JaWRlX3BtX3Jlc3RvcmVfZG1hLAotfTsKLQogc3RhdGljIHZvaWQgaWRlX2NvbXBsZXRlX3Bvd2VyX3N0ZXAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHU4IHN0YXQsIHU4IGVycm9yKQogewogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOwpAQCAtMTUzLDIwICsxNDAsMjAgQEAKIAkJcmV0dXJuOwogCiAJc3dpdGNoIChwbS0+cG1fc3RlcCkgewotCWNhc2UgaWRlX3BtX2ZsdXNoX2NhY2hlOgkvKiBTdXNwZW5kIHN0ZXAgMSAoZmx1c2ggY2FjaGUpIGNvbXBsZXRlICovCisJY2FzZSBJREVfUE1fRkxVU0hfQ0FDSEU6CS8qIFN1c3BlbmQgc3RlcCAxIChmbHVzaCBjYWNoZSkgKi8KIAkJaWYgKHBtLT5wbV9zdGF0ZSA9PSBQTV9FVkVOVF9GUkVFWkUpCi0JCQlwbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CisJCQlwbS0+cG1fc3RlcCA9IElERV9QTV9DT01QTEVURUQ7CiAJCWVsc2UKLQkJCXBtLT5wbV9zdGVwID0gaWRlZGlza19wbV9zdGFuZGJ5OworCQkJcG0tPnBtX3N0ZXAgPSBJREVfUE1fU1RBTkRCWTsKIAkJYnJlYWs7Ci0JY2FzZSBpZGVkaXNrX3BtX3N0YW5kYnk6CS8qIFN1c3BlbmQgc3RlcCAyIChzdGFuZGJ5KSBjb21wbGV0ZSAqLwotCQlwbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CisJY2FzZSBJREVfUE1fU1RBTkRCWToJCS8qIFN1c3BlbmQgc3RlcCAyIChzdGFuZGJ5KSAqLworCQlwbS0+cG1fc3RlcCA9IElERV9QTV9DT01QTEVURUQ7CiAJCWJyZWFrOwotCWNhc2UgaWRlZGlza19wbV9yZXN0b3JlX3BpbzoJLyogUmVzdW1lIHN0ZXAgMSBjb21wbGV0ZSAqLwotCQlwbS0+cG1fc3RlcCA9IGlkZWRpc2tfcG1faWRsZTsKKwljYXNlIElERV9QTV9SRVNUT1JFX1BJTzoJLyogUmVzdW1lIHN0ZXAgMSAocmVzdG9yZSBQSU8pICovCisJCXBtLT5wbV9zdGVwID0gSURFX1BNX0lETEU7CiAJCWJyZWFrOwotCWNhc2UgaWRlZGlza19wbV9pZGxlOgkJLyogUmVzdW1lIHN0ZXAgMiAoaWRsZSkgY29tcGxldGUgKi8KLQkJcG0tPnBtX3N0ZXAgPSBpZGVfcG1fcmVzdG9yZV9kbWE7CisJY2FzZSBJREVfUE1fSURMRToJCS8qIFJlc3VtZSBzdGVwIDIgKGlkbGUpKi8KKwkJcG0tPnBtX3N0ZXAgPSBJREVfUE1fUkVTVE9SRV9ETUE7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE3OSw0MCArMTY2LDM3IEBACiAJbWVtc2V0KGFyZ3MsIDAsIHNpemVvZigqYXJncykpOwogCiAJc3dpdGNoIChwbS0+cG1fc3RlcCkgewotCWNhc2UgaWRlX3BtX2ZsdXNoX2NhY2hlOgkvKiBTdXNwZW5kIHN0ZXAgMSAoZmx1c2ggY2FjaGUpICovCisJY2FzZSBJREVfUE1fRkxVU0hfQ0FDSEU6CS8qIFN1c3BlbmQgc3RlcCAxIChmbHVzaCBjYWNoZSkgKi8KIAkJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKIAkJCWJyZWFrOwogCQkvKiBOb3Qgc3VwcG9ydGVkPyBTd2l0Y2ggdG8gbmV4dCBzdGVwIG5vdy4gKi8KLQkJaWYgKCFkcml2ZS0+d2NhY2hlIHx8ICFpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlKGRyaXZlLT5pZCkpIHsKKwkJaWYgKGF0YV9pZF9mbHVzaF9lbmFibGVkKGRyaXZlLT5pZCkgPT0gMCB8fAorCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfV0NBQ0hFKSA9PSAwKSB7CiAJCQlpZGVfY29tcGxldGVfcG93ZXJfc3RlcChkcml2ZSwgcnEsIDAsIDApOwogCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCQl9Ci0JCWlmIChpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlX2V4dChkcml2ZS0+aWQpKQotCQkJYXJncy0+dGYuY29tbWFuZCA9IFdJTl9GTFVTSF9DQUNIRV9FWFQ7CisJCWlmIChhdGFfaWRfZmx1c2hfZXh0X2VuYWJsZWQoZHJpdmUtPmlkKSkKKwkJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIX0VYVDsKIAkJZWxzZQotCQkJYXJncy0+dGYuY29tbWFuZCA9IFdJTl9GTFVTSF9DQUNIRTsKKwkJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIOwogCQlnb3RvIG91dF9kb190ZjsKLQotCWNhc2UgaWRlZGlza19wbV9zdGFuZGJ5OgkvKiBTdXNwZW5kIHN0ZXAgMiAoc3RhbmRieSkgKi8KLQkJYXJncy0+dGYuY29tbWFuZCA9IFdJTl9TVEFOREJZTk9XMTsKKwljYXNlIElERV9QTV9TVEFOREJZOgkJLyogU3VzcGVuZCBzdGVwIDIgKHN0YW5kYnkpICovCisJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX1NUQU5EQllOT1cxOwogCQlnb3RvIG91dF9kb190ZjsKLQotCWNhc2UgaWRlZGlza19wbV9yZXN0b3JlX3BpbzoJLyogUmVzdW1lIHN0ZXAgMSAocmVzdG9yZSBQSU8pICovCisJY2FzZSBJREVfUE1fUkVTVE9SRV9QSU86CS8qIFJlc3VtZSBzdGVwIDEgKHJlc3RvcmUgUElPKSAqLwogCQlpZGVfc2V0X21heF9waW8oZHJpdmUpOwogCQkvKgotCQkgKiBza2lwIGlkZWRpc2tfcG1faWRsZSBmb3IgQVRBUEkgZGV2aWNlcworCQkgKiBza2lwIElERV9QTV9JRExFIGZvciBBVEFQSSBkZXZpY2VzCiAJCSAqLwogCQlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQotCQkJcG0tPnBtX3N0ZXAgPSBpZGVfcG1fcmVzdG9yZV9kbWE7CisJCQlwbS0+cG1fc3RlcCA9IElERV9QTV9SRVNUT1JFX0RNQTsKIAkJZWxzZQogCQkJaWRlX2NvbXBsZXRlX3Bvd2VyX3N0ZXAoZHJpdmUsIHJxLCAwLCAwKTsKIAkJcmV0dXJuIGlkZV9zdG9wcGVkOwotCi0JY2FzZSBpZGVkaXNrX3BtX2lkbGU6CQkvKiBSZXN1bWUgc3RlcCAyIChpZGxlKSAqLwotCQlhcmdzLT50Zi5jb21tYW5kID0gV0lOX0lETEVJTU1FRElBVEU7CisJY2FzZSBJREVfUE1fSURMRToJCS8qIFJlc3VtZSBzdGVwIDIgKGlkbGUpICovCisJCWFyZ3MtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0lETEVJTU1FRElBVEU7CiAJCWdvdG8gb3V0X2RvX3RmOwotCi0JY2FzZSBpZGVfcG1fcmVzdG9yZV9kbWE6CS8qIFJlc3VtZSBzdGVwIDMgKHJlc3RvcmUgRE1BKSAqLworCWNhc2UgSURFX1BNX1JFU1RPUkVfRE1BOgkvKiBSZXN1bWUgc3RlcCAzIChyZXN0b3JlIERNQSkgKi8KIAkJLyoKIAkJICogUmlnaHQgbm93LCBhbGwgd2UgZG8gaXMgY2FsbCBpZGVfc2V0X2RtYShkcml2ZSksCiAJCSAqIHdlIGNvdWxkIGJlIHNtYXJ0ZXIgYW5kIGNoZWNrIGZvciBjdXJyZW50IHhmZXJfc3BlZWQKQEAgLTIyMSwxMiArMjA1LDEzIEBACiAJCWlmIChkcml2ZS0+aHdpZi0+ZG1hX29wcyA9PSBOVUxMKQogCQkJYnJlYWs7CiAJCS8qCi0JCSAqIFRPRE86IHJlc3BlY3QgLT51c2luZ19kbWEgc2V0dGluZworCQkgKiBUT0RPOiByZXNwZWN0IElERV9ERkxBR19VU0lOR19ETUEKIAkJICovCiAJCWlkZV9zZXRfZG1hKGRyaXZlKTsKIAkJYnJlYWs7CiAJfQotCXBtLT5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZDsKKworCXBtLT5wbV9zdGVwID0gSURFX1BNX0NPTVBMRVRFRDsKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAKIG91dF9kb190ZjoKQEAgLTI4Niw3ICsyNzEsNyBAQAogCWlmIChibGtfcG1fc3VzcGVuZF9yZXF1ZXN0KHJxKSkgewogCQlibGtfc3RvcF9xdWV1ZShkcml2ZS0+cXVldWUpOwogCX0gZWxzZSB7Ci0JCWRyaXZlLT5ibG9ja2VkID0gMDsKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0JMT0NLRUQ7CiAJCWJsa19zdGFydF9xdWV1ZShkcml2ZS0+cXVldWUpOwogCX0KIAlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOwpAQCAtMzIyLDcgKzMwNyw3IEBACiAJCWlkZV90YXNrX3QgKnRhc2sgPSAoaWRlX3Rhc2tfdCAqKXJxLT5zcGVjaWFsOwogCiAJCWlmIChycS0+ZXJyb3JzID09IDApCi0JCQlycS0+ZXJyb3JzID0gIU9LX1NUQVQoc3RhdCwgUkVBRFlfU1RBVCwgQkFEX1NUQVQpOworCQkJcnEtPmVycm9ycyA9ICFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCk7CiAKIAkJaWYgKHRhc2spIHsKIAkJCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJnRhc2stPnRmOwpAQCAtMzQyLDcgKzMyNyw3IEBACiAJCQlkcml2ZS0+bmFtZSwgcnEtPnBtLT5wbV9zdGVwLCBzdGF0LCBlcnIpOwogI2VuZGlmCiAJCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKLQkJaWYgKHBtLT5wbV9zdGVwID09IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQpCisJCWlmIChwbS0+cG1fc3RlcCA9PSBJREVfUE1fQ09NUExFVEVEKQogCQkJaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QoZHJpdmUsIHJxKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM3MywyOSArMzU4LDMwIEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCi0JaWYgKHN0YXQgJiBCVVNZX1NUQVQgfHwgKChzdGF0ICYgV1JFUlJfU1RBVCkgJiYgIWRyaXZlLT5ub3dlcnIpKSB7CisJaWYgKChzdGF0ICYgQVRBX0JVU1kpIHx8CisJICAgICgoc3RhdCAmIEFUQV9ERikgJiYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9XRVJSKSA9PSAwKSkgewogCQkvKiBvdGhlciBiaXRzIGFyZSB1c2VsZXNzIHdoZW4gQlVTWSAqLwogCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFU0VUOwotCX0gZWxzZSBpZiAoc3RhdCAmIEVSUl9TVEFUKSB7CisJfSBlbHNlIGlmIChzdGF0ICYgQVRBX0VSUikgewogCQkvKiBlcnIgaGFzIGRpZmZlcmVudCBtZWFuaW5nIG9uIGNkcm9tIGFuZCB0YXBlICovCi0JCWlmIChlcnIgPT0gQUJSVF9FUlIpIHsKLQkJCWlmIChkcml2ZS0+c2VsZWN0LmIubGJhICYmCi0JCQkgICAgLyogc29tZSBuZXdlciBkcml2ZXMgZG9uJ3Qgc3VwcG9ydCBXSU5fU1BFQ0lGWSAqLwotCQkJICAgIGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikgPT0gV0lOX1NQRUNJRlkpCisJCWlmIChlcnIgPT0gQVRBX0FCT1JURUQpIHsKKwkJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkEpICYmCisJCQkgICAgLyogc29tZSBuZXdlciBkcml2ZXMgZG9uJ3Qgc3VwcG9ydCBBVEFfQ01EX0lOSVRfREVWX1BBUkFNUyAqLworCQkJICAgIGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikgPT0gQVRBX0NNRF9JTklUX0RFVl9QQVJBTVMpCiAJCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwogCQl9IGVsc2UgaWYgKChlcnIgJiBCQURfQ1JDKSA9PSBCQURfQ1JDKSB7CiAJCQkvKiBVRE1BIGNyYyBlcnJvciwganVzdCByZXRyeSB0aGUgb3BlcmF0aW9uICovCiAJCQlkcml2ZS0+Y3JjX2NvdW50Kys7Ci0JCX0gZWxzZSBpZiAoZXJyICYgKEJCRF9FUlIgfCBFQ0NfRVJSKSkgeworCQl9IGVsc2UgaWYgKGVyciAmIChBVEFfQkJLIHwgQVRBX1VOQykpIHsKIAkJCS8qIHJldHJpZXMgd29uJ3QgaGVscCB0aGVzZSAqLwogCQkJcnEtPmVycm9ycyA9IEVSUk9SX01BWDsKLQkJfSBlbHNlIGlmIChlcnIgJiBUUkswX0VSUikgeworCQl9IGVsc2UgaWYgKGVyciAmIEFUQV9UUkswTkYpIHsKIAkJCS8qIGhlbHAgaXQgZmluZCB0cmFjayB6ZXJvICovCiAJCQlycS0+ZXJyb3JzIHw9IEVSUk9SX1JFQ0FMOwogCQl9CiAJfQogCi0JaWYgKChzdGF0ICYgRFJRX1NUQVQpICYmIHJxX2RhdGFfZGlyKHJxKSA9PSBSRUFEICYmCisJaWYgKChzdGF0ICYgQVRBX0RSUSkgJiYgcnFfZGF0YV9kaXIocnEpID09IFJFQUQgJiYKIAkgICAgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfRVJST1JfU1RPUFNfRklGTykgPT0gMCkgewogCQlpbnQgbnNlY3QgPSBkcml2ZS0+bXVsdF9jb3VudCA/IGRyaXZlLT5tdWx0X2NvdW50IDogMTsKIApAQCAtNDA3LDcgKzM5Myw3IEBACiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKLQlpZiAoaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSAmIChCVVNZX1NUQVQgfCBEUlFfU1RBVCkpCisJaWYgKGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkKIAkJcnEtPmVycm9ycyB8PSBFUlJPUl9SRVNFVDsKIAogCWlmICgocnEtPmVycm9ycyAmIEVSUk9SX1JFU0VUKSA9PSBFUlJPUl9SRVNFVCkgewpAQCAtNDI3LDE2ICs0MTMsMTcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAKLQlpZiAoc3RhdCAmIEJVU1lfU1RBVCB8fCAoKHN0YXQgJiBXUkVSUl9TVEFUKSAmJiAhZHJpdmUtPm5vd2VycikpIHsKKwlpZiAoKHN0YXQgJiBBVEFfQlVTWSkgfHwKKwkgICAgKChzdGF0ICYgQVRBX0RGKSAmJiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19OT1dFUlIpID09IDApKSB7CiAJCS8qIG90aGVyIGJpdHMgYXJlIHVzZWxlc3Mgd2hlbiBCVVNZICovCiAJCXJxLT5lcnJvcnMgfD0gRVJST1JfUkVTRVQ7CiAJfSBlbHNlIHsKIAkJLyogYWRkIGRlY29kaW5nIGVycm9yIHN0dWZmICovCiAJfQogCi0JaWYgKGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikgJiAoQlVTWV9TVEFUIHwgRFJRX1NUQVQpKQorCWlmIChod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpICYgKEFUQV9CVVNZIHwgQVRBX0RSUSkpCiAJCS8qIGZvcmNlIGFuIGFib3J0ICovCi0JCWh3aWYtPnRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIFdJTl9JRExFSU1NRURJQVRFKTsKKwkJaHdpZi0+dHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgQVRBX0NNRF9JRExFSU1NRURJQVRFKTsKIAogCWlmIChycS0+ZXJyb3JzID49IEVSUk9SX01BWCkgewogCQlpZGVfa2lsbF9ycShkcml2ZSwgcnEpOwpAQCAtNTA4LDIwICs0OTUsMjAgQEAKIAl0Zi0+bGJhbCAgICA9IGRyaXZlLT5zZWN0OwogCXRmLT5sYmFtICAgID0gZHJpdmUtPmN5bDsKIAl0Zi0+bGJhaCAgICA9IGRyaXZlLT5jeWwgPj4gODsKLQl0Zi0+ZGV2aWNlICA9ICgoZHJpdmUtPmhlYWQgLSAxKSB8IGRyaXZlLT5zZWxlY3QuYWxsKSAmIH5BVEFfTEJBOwotCXRmLT5jb21tYW5kID0gV0lOX1NQRUNJRlk7CisJdGYtPmRldmljZSAgPSAoZHJpdmUtPmhlYWQgLSAxKSB8IGRyaXZlLT5zZWxlY3Q7CisJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0lOSVRfREVWX1BBUkFNUzsKIH0KIAogc3RhdGljIHZvaWQgaWRlX3RmX3NldF9yZXN0b3JlX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmKQogewogCXRmLT5uc2VjdCAgID0gZHJpdmUtPnNlY3Q7Ci0JdGYtPmNvbW1hbmQgPSBXSU5fUkVTVE9SRTsKKwl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfUkVTVE9SRTsKIH0KIAogc3RhdGljIHZvaWQgaWRlX3RmX3NldF9zZXRtdWx0X2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmKQogewogCXRmLT5uc2VjdCAgID0gZHJpdmUtPm11bHRfcmVxOwotCXRmLT5jb21tYW5kID0gV0lOX1NFVE1VTFQ7CisJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX1NFVF9NVUxUSTsKIH0KIAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZGlza19zcGVjaWFsKGlkZV9kcml2ZV90ICpkcml2ZSkKQEAgLTU0MCw4ICs1MjcsNiBAQAogCQlpZGVfdGZfc2V0X3Jlc3RvcmVfY21kKGRyaXZlLCAmYXJncy50Zik7CiAJfSBlbHNlIGlmIChzLT5iLnNldF9tdWx0bW9kZSkgewogCQlzLT5iLnNldF9tdWx0bW9kZSA9IDA7Ci0JCWlmIChkcml2ZS0+bXVsdF9yZXEgPiBkcml2ZS0+aWQtPm1heF9tdWx0c2VjdCkKLQkJCWRyaXZlLT5tdWx0X3JlcSA9IGRyaXZlLT5pZC0+bWF4X211bHRzZWN0OwogCQlpZGVfdGZfc2V0X3NldG11bHRfY21kKGRyaXZlLCAmYXJncy50Zik7CiAJfSBlbHNlIGlmIChzLT5hbGwpIHsKIAkJaW50IHNwZWNpYWwgPSBzLT5hbGw7CkBAIC01NTgsMzcgKzU0MywxNCBAQAogCXJldHVybiBpZGVfc3RhcnRlZDsKIH0KIAotLyoKLSAqIGhhbmRsZSBIRElPX1NFVF9QSU9fTU9ERSBpb2N0bCBhYnVzZXJzIGhlcmUsIGV2ZW50dWFsbHkgaXQgd2lsbCBnbyBhd2F5Ci0gKi8KLXN0YXRpYyBpbnQgc2V0X3Bpb19tb2RlX2FidXNlKGlkZV9od2lmX3QgKmh3aWYsIHU4IHJlcV9waW8pCi17Ci0Jc3dpdGNoIChyZXFfcGlvKSB7Ci0JY2FzZSAyMDI6Ci0JY2FzZSAyMDE6Ci0JY2FzZSAyMDA6Ci0JY2FzZSAxMDI6Ci0JY2FzZSAxMDE6Ci0JY2FzZSAxMDA6Ci0JCXJldHVybiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19BQlVTRV9ETUFfTU9ERVMpID8gMSA6IDA7Ci0JY2FzZSA5OgotCWNhc2UgODoKLQkJcmV0dXJuIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX0FCVVNFX1BSRUZFVENIKSA/IDEgOiAwOwotCWNhc2UgNzoKLQljYXNlIDY6Ci0JCXJldHVybiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19BQlVTRV9GQVNUX0RFVlNFTCkgPyAxIDogMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KIC8qKgogICoJZG9fc3BlY2lhbAkJLQlpc3N1ZSBzb21lIHNwZWNpYWwgY29tbWFuZHMKICAqCUBkcml2ZTogZHJpdmUgdGhlIGNvbW1hbmQgaXMgZm9yCiAgKgotICoJZG9fc3BlY2lhbCgpIGlzIHVzZWQgdG8gaXNzdWUgV0lOX1NQRUNJRlksIFdJTl9SRVNUT1JFLCBhbmQgV0lOX1NFVE1VTFQKLSAqCWNvbW1hbmRzIHRvIGEgZHJpdmUuICBJdCB1c2VkIHRvIGRvIG11Y2ggbW9yZSwgYnV0IGhhcyBiZWVuIHNjYWxlZAotICoJYmFjay4KKyAqCWRvX3NwZWNpYWwoKSBpcyB1c2VkIHRvIGlzc3VlIEFUQV9DTURfSU5JVF9ERVZfUEFSQU1TLAorICoJQVRBX0NNRF9SRVNUT1JFIGFuZCBBVEFfQ01EX1NFVF9NVUxUSSBjb21tYW5kcyB0byBhIGRyaXZlLgorICoKKyAqCUl0IHVzZWQgdG8gZG8gbXVjaCBtb3JlLCBidXQgaGFzIGJlZW4gc2NhbGVkIGJhY2suCiAgKi8KIAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBkb19zcGVjaWFsIChpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC01OTgsNDUgKzU2MCwxMiBAQAogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCIlczogZG9fc3BlY2lhbDogMHglMDJ4XG4iLCBkcml2ZS0+bmFtZSwgcy0+YWxsKTsKICNlbmRpZgotCWlmIChzLT5iLnNldF90dW5lKSB7Ci0JCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQkJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKLQkJdTggcmVxX3BpbyA9IGRyaXZlLT50dW5lX3JlcTsKKwlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrKQorCQlyZXR1cm4gaWRlX2Rpc2tfc3BlY2lhbChkcml2ZSk7CiAKLQkJcy0+Yi5zZXRfdHVuZSA9IDA7Ci0KLQkJaWYgKHNldF9waW9fbW9kZV9hYnVzZShkcml2ZS0+aHdpZiwgcmVxX3BpbykpIHsKLQkJCS8qCi0JCQkgKiB0YWtlIGlkZV9sb2NrIGZvciBkcml2ZS0+W25vX111bm1hc2svW25vX11pb18zMmJpdAotCQkJICovCi0JCQlpZiAocmVxX3BpbyA9PSA4IHx8IHJlcV9waW8gPT0gOSkgewotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQkJCQlwb3J0X29wcy0+c2V0X3Bpb19tb2RlKGRyaXZlLCByZXFfcGlvKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQkJfSBlbHNlCi0JCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgcmVxX3Bpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQga2VlcF9kbWEgPSBkcml2ZS0+dXNpbmdfZG1hOwotCi0JCQlpZGVfc2V0X3Bpbyhkcml2ZSwgcmVxX3Bpbyk7Ci0KLQkJCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFVF9QSU9fTU9ERV9LRUVQX0RNQSkgewotCQkJCWlmIChrZWVwX2RtYSkKLQkJCQkJaWRlX2RtYV9vbihkcml2ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKLQkJCXJldHVybiBpZGVfZGlza19zcGVjaWFsKGRyaXZlKTsKLQotCQlzLT5hbGwgPSAwOwotCQlkcml2ZS0+bXVsdF9yZXEgPSAwOwotCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0JfQorCXMtPmFsbCA9IDA7CisJZHJpdmUtPm11bHRfcmVxID0gMDsKKwlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CiAKIHZvaWQgaWRlX21hcF9zZyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTcxNiw5ICs2NDUsNzEgQEAKICAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQogCitpbnQgaWRlX2RldnNldF9leGVjdXRlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3Qgc3RydWN0IGlkZV9kZXZzZXQgKnNldHRpbmcsCisJCSAgICAgICBpbnQgYXJnKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZHJpdmUtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKHNldHRpbmctPmZsYWdzICYgRFNfU1lOQykpCisJCXJldHVybiBzZXR0aW5nLT5zZXQoZHJpdmUsIGFyZyk7CisKKwlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBfX0dGUF9XQUlUKTsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOworCXJxLT5jbWRfbGVuID0gNTsKKwlycS0+Y21kWzBdID0gUkVRX0RFVlNFVF9FWEVDOworCSooaW50ICopJnJxLT5jbWRbMV0gPSBhcmc7CisJcnEtPnNwZWNpYWwgPSBzZXR0aW5nLT5zZXQ7CisKKwlpZiAoYmxrX2V4ZWN1dGVfcnEocSwgTlVMTCwgcnEsIDApKQorCQlyZXQgPSBycS0+ZXJyb3JzOworCWJsa19wdXRfcmVxdWVzdChycSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2RldnNldF9leGVjdXRlKTsKKwogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfc3BlY2lhbF9ycShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlzd2l0Y2ggKHJxLT5jbWRbMF0pIHsKKwl1OCBjbWQgPSBycS0+Y21kWzBdOworCisJaWYgKGNtZCA9PSBSRVFfUEFSS19IRUFEUyB8fCBjbWQgPT0gUkVRX1VOUEFSS19IRUFEUykgeworCQlpZGVfdGFza190IHRhc2s7CisJCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJnRhc2sudGY7CisKKwkJbWVtc2V0KCZ0YXNrLCAwLCBzaXplb2YodGFzaykpOworCQlpZiAoY21kID09IFJFUV9QQVJLX0hFQURTKSB7CisJCQlkcml2ZS0+c2xlZXAgPSAqKHVuc2lnbmVkIGxvbmcgKilycS0+c3BlY2lhbDsKKwkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1NMRUVQSU5HOworCQkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0lETEVJTU1FRElBVEU7CisJCQl0Zi0+ZmVhdHVyZSA9IDB4NDQ7CisJCQl0Zi0+bGJhbCA9IDB4NGM7CisJCQl0Zi0+bGJhbSA9IDB4NGU7CisJCQl0Zi0+bGJhaCA9IDB4NTU7CisJCQl0YXNrLnRmX2ZsYWdzIHw9IElERV9URkxBR19DVVNUT01fSEFORExFUjsKKwkJfSBlbHNlCQkvKiBjbWQgPT0gUkVRX1VOUEFSS19IRUFEUyAqLworCQkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0NIS19QT1dFUjsKKworCQl0YXNrLnRmX2ZsYWdzIHw9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7CisJCXRhc2sucnEgPSBycTsKKwkJZHJpdmUtPmh3aWYtPmRhdGFfcGhhc2UgPSB0YXNrLmRhdGFfcGhhc2UgPSBUQVNLRklMRV9OT19EQVRBOworCQlyZXR1cm4gZG9fcndfdGFza2ZpbGUoZHJpdmUsICZ0YXNrKTsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkVRX0RFVlNFVF9FWEVDOgorCXsKKwkJaW50IGVyciwgKCpzZXRmdW5jKShpZGVfZHJpdmVfdCAqLCBpbnQpID0gcnEtPnNwZWNpYWw7CisKKwkJZXJyID0gc2V0ZnVuYyhkcml2ZSwgKihpbnQgKikmcnEtPmNtZFsxXSk7CisJCWlmIChlcnIpCisJCQlycS0+ZXJyb3JzID0gZXJyOworCQllbHNlCisJCQllcnIgPSAxOworCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIGVyciwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKKwl9CiAJY2FzZSBSRVFfRFJJVkVfUkVTRVQ6CiAJCXJldHVybiBpZGVfZG9fcmVzZXQoZHJpdmUpOwogCWRlZmF1bHQ6CkBAIC03MzMsMTEgKzcyNCwxMSBAQAogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOwogCiAJaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpICYmCi0JICAgIHBtLT5wbV9zdGVwID09IGlkZV9wbV9zdGF0ZV9zdGFydF9zdXNwZW5kKQorCSAgICBwbS0+cG1fc3RlcCA9PSBJREVfUE1fU1RBUlRfU1VTUEVORCkKIAkJLyogTWFyayBkcml2ZSBibG9ja2VkIHdoZW4gc3RhcnRpbmcgdGhlIHN1c3BlbmQgc2VxdWVuY2UuICovCi0JCWRyaXZlLT5ibG9ja2VkID0gMTsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfQkxPQ0tFRDsKIAllbHNlIGlmIChibGtfcG1fcmVzdW1lX3JlcXVlc3QocnEpICYmCi0JCSBwbS0+cG1fc3RlcCA9PSBpZGVfcG1fc3RhdGVfc3RhcnRfcmVzdW1lKSB7CisJCSBwbS0+cG1fc3RlcCA9PSBJREVfUE1fU1RBUlRfUkVTVU1FKSB7CiAJCS8qIAogCQkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gb24gd2FrZXVwIGlzIHRvIHdhaXQgZm9yIEJTWSBiaXQgdG8KIAkJICogZ28gYXdheSAod2l0aCBhIGxvb29uZyB0aW1lb3V0KSBhcyBhIGRyaXZlIG9uIHRoaXMgaHdpZiBtYXkKQEAgLTc2Niw5ICs3NTcsNyBAQAogICoJc3RhcnRfcmVxdWVzdAktCXN0YXJ0IG9mIEkvTyBhbmQgY29tbWFuZCBpc3N1aW5nIGZvciBJREUKICAqCiAgKglzdGFydF9yZXF1ZXN0KCkgaW5pdGlhdGVzIGhhbmRsaW5nIG9mIGEgbmV3IEkvTyByZXF1ZXN0LiBJdAotICoJYWNjZXB0cyBjb21tYW5kcyBhbmQgSS9PIChyZWFkL3dyaXRlKSByZXF1ZXN0cy4gSXQgYWxzbyBkb2VzCi0gKgl0aGUgZmluYWwgcmVtYXBwaW5nIGZvciB3ZWlyZCBzdHVmZiBsaWtlIEVaRHJpdmUuIE9uY2UgCi0gKglkZXZpY2UgbWFwcGVyIGNhbiB3b3JrIHNlY3RvciBsZXZlbCB0aGUgRVpEcml2ZSBzdHVmZiBjYW4gZ28gYXdheQorICoJYWNjZXB0cyBjb21tYW5kcyBhbmQgSS9PIChyZWFkL3dyaXRlKSByZXF1ZXN0cy4KICAqCiAgKglGSVhNRTogdGhpcyBmdW5jdGlvbiBuZWVkcyBhIHJlbmFtZQogICovCkBAIC03NzYsNyArNzY1LDYgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3Qgc3RhcnRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKLQlzZWN0b3JfdCBibG9jazsKIAogCUJVR19PTighYmxrX3JxX3N0YXJ0ZWQocnEpKTsKIApAQCAtNzkxLDIxICs3NzksMTIgQEAKIAkJZ290byBraWxsX3JxOwogCX0KIAotCWJsb2NrICAgID0gcnEtPnNlY3RvcjsKLQlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpICYmCi0JICAgIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2sgfHwgZHJpdmUtPm1lZGlhID09IGlkZV9mbG9wcHkpKSB7Ci0JCWJsb2NrICs9IGRyaXZlLT5zZWN0MDsKLQl9Ci0JLyogWWVjY2ggLSB0aGlzIHdpbGwgc2hpZnQgdGhlIGVudGlyZSBpbnRlcnZhbCwKLQkgICBwb3NzaWJseSBraWxsaW5nIHNvbWUgaW5ub2NlbnQgZm9sbG93aW5nIHNlY3RvciAqLwotCWlmIChibG9jayA9PSAwICYmIGRyaXZlLT5yZW1hcF8wX3RvXzEgPT0gMSkKLQkJYmxvY2sgPSAxOyAgLyogcmVkaXJlY3QgTUJSIGFjY2VzcyB0byBFWi1Ecml2ZSBwYXJ0biB0YWJsZSAqLwotCiAJaWYgKGJsa19wbV9yZXF1ZXN0KHJxKSkKIAkJaWRlX2NoZWNrX3BtX3N0YXRlKGRyaXZlLCBycSk7CiAKIAlTRUxFQ1RfRFJJVkUoZHJpdmUpOwotCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBkcml2ZS0+cmVhZHlfc3RhdCwgQlVTWV9TVEFUfERSUV9TVEFULCBXQUlUX1JFQURZKSkgeworCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBkcml2ZS0+cmVhZHlfc3RhdCwKKwkJCSAgQVRBX0JVU1kgfCBBVEFfRFJRLCBXQUlUX1JFQURZKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZSBub3QgcmVhZHkgZm9yIGNvbW1hbmRcbiIsIGRyaXZlLT5uYW1lKTsKIAkJcmV0dXJuIHN0YXJ0c3RvcDsKIAl9CkBAIC04MjksNyArODA4LDcgQEAKICNlbmRpZgogCQkJc3RhcnRzdG9wID0gaWRlX3N0YXJ0X3Bvd2VyX3N0ZXAoZHJpdmUsIHJxKTsKIAkJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQgJiYKLQkJCSAgICBwbS0+cG1fc3RlcCA9PSBpZGVfcG1fc3RhdGVfY29tcGxldGVkKQorCQkJICAgIHBtLT5wbV9zdGVwID09IElERV9QTV9DT01QTEVURUQpCiAJCQkJaWRlX2NvbXBsZXRlX3BtX3JlcXVlc3QoZHJpdmUsIHJxKTsKIAkJCXJldHVybiBzdGFydHN0b3A7CiAJCX0gZWxzZSBpZiAoIXJxLT5ycV9kaXNrICYmIGJsa19zcGVjaWFsX3JlcXVlc3QocnEpKQpAQCAtODQ0LDcgKzgyMyw4IEBACiAJCQlyZXR1cm4gaWRlX3NwZWNpYWxfcnEoZHJpdmUsIHJxKTsKIAogCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQlyZXR1cm4gZHJ2LT5kb19yZXF1ZXN0KGRyaXZlLCBycSwgYmxvY2spOworCisJCXJldHVybiBkcnYtPmRvX3JlcXVlc3QoZHJpdmUsIHJxLCBycS0+c2VjdG9yKTsKIAl9CiAJcmV0dXJuIGRvX3NwZWNpYWwoZHJpdmUpOwoga2lsbF9ycToKQEAgLTg2Niw3ICs4NDYsNyBAQAogCWlmICh0aW1lb3V0ID4gV0FJVF9XT1JTVENBU0UpCiAJCXRpbWVvdXQgPSBXQUlUX1dPUlNUQ0FTRTsKIAlkcml2ZS0+c2xlZXAgPSB0aW1lb3V0ICsgamlmZmllczsKLQlkcml2ZS0+c2xlZXBpbmcgPSAxOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1NMRUVQSU5HOwogfQogCiBFWFBPUlRfU1lNQk9MKGlkZV9zdGFsbF9xdWV1ZSk7CkBAIC05MDYsMTggKzg4NiwyMyBAQAogCX0KIAogCWRvIHsKLQkJaWYgKCghZHJpdmUtPnNsZWVwaW5nIHx8IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZHJpdmUtPnNsZWVwKSkKLQkJICAgICYmICFlbHZfcXVldWVfZW1wdHkoZHJpdmUtPnF1ZXVlKSkgewotCQkJaWYgKCFiZXN0Ci0JCQkgfHwgKGRyaXZlLT5zbGVlcGluZyAmJiAoIWJlc3QtPnNsZWVwaW5nIHx8IHRpbWVfYmVmb3JlKGRyaXZlLT5zbGVlcCwgYmVzdC0+c2xlZXApKSkKLQkJCSB8fCAoIWJlc3QtPnNsZWVwaW5nICYmIHRpbWVfYmVmb3JlKFdBS0VVUChkcml2ZSksIFdBS0VVUChiZXN0KSkpKQotCQkJeworCQl1OCBkZXZfcyA9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0xFRVBJTkcpOworCQl1OCBiZXN0X3MgPSAoYmVzdCAmJiAhIShiZXN0LT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0xFRVBJTkcpKTsKKworCQlpZiAoKGRldl9zID09IDAgfHwgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBkcml2ZS0+c2xlZXApKSAmJgorCQkgICAgIWVsdl9xdWV1ZV9lbXB0eShkcml2ZS0+cXVldWUpKSB7CisJCQlpZiAoYmVzdCA9PSBOVUxMIHx8CisJCQkgICAgKGRldl9zICYmIChiZXN0X3MgPT0gMCB8fCB0aW1lX2JlZm9yZShkcml2ZS0+c2xlZXAsIGJlc3QtPnNsZWVwKSkpIHx8CisJCQkgICAgKGJlc3RfcyA9PSAwICYmIHRpbWVfYmVmb3JlKFdBS0VVUChkcml2ZSksIFdBS0VVUChiZXN0KSkpKSB7CiAJCQkJaWYgKCFibGtfcXVldWVfcGx1Z2dlZChkcml2ZS0+cXVldWUpKQogCQkJCQliZXN0ID0gZHJpdmU7CiAJCQl9CiAJCX0KIAl9IHdoaWxlICgoZHJpdmUgPSBkcml2ZS0+bmV4dCkgIT0gaHdncm91cC0+ZHJpdmUpOwotCWlmIChiZXN0ICYmIGJlc3QtPm5pY2UxICYmICFiZXN0LT5zbGVlcGluZyAmJiBiZXN0ICE9IGh3Z3JvdXAtPmRyaXZlICYmIGJlc3QtPnNlcnZpY2VfdGltZSA+IFdBSVRfTUlOX1NMRUVQKSB7CisKKwlpZiAoYmVzdCAmJiAoYmVzdC0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05JQ0UxKSAmJgorCSAgICAoYmVzdC0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1NMRUVQSU5HKSA9PSAwICYmCisJICAgIGJlc3QgIT0gaHdncm91cC0+ZHJpdmUgJiYgYmVzdC0+c2VydmljZV90aW1lID4gV0FJVF9NSU5fU0xFRVApIHsKIAkJbG9uZyB0ID0gKHNpZ25lZCBsb25nKShXQUtFVVAoYmVzdCkgLSBqaWZmaWVzKTsKIAkJaWYgKHQgPj0gV0FJVF9NSU5fU0xFRVApIHsKIAkJLyoKQEAgLTkyNiw3ICs5MTEsNyBAQAogCQkgKi8KIAkJCWRyaXZlID0gYmVzdC0+bmV4dDsKIAkJCWRvIHsKLQkJCQlpZiAoIWRyaXZlLT5zbGVlcGluZworCQkJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TTEVFUElORykgPT0gMAogCQkJCSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzIC0gYmVzdC0+c2VydmljZV90aW1lLCBXQUtFVVAoZHJpdmUpKQogCQkJCSAmJiB0aW1lX2JlZm9yZShXQUtFVVAoZHJpdmUpLCBqaWZmaWVzICsgdCkpCiAJCQkJewpAQCAtOTk3LDcgKzk4Miw5IEBACiAJCQlod2dyb3VwLT5ycSA9IE5VTEw7CiAJCQlkcml2ZSA9IGh3Z3JvdXAtPmRyaXZlOwogCQkJZG8gewotCQkJCWlmIChkcml2ZS0+c2xlZXBpbmcgJiYgKCFzbGVlcGluZyB8fCB0aW1lX2JlZm9yZShkcml2ZS0+c2xlZXAsIHNsZWVwKSkpIHsKKwkJCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0xFRVBJTkcpICYmCisJCQkJICAgIChzbGVlcGluZyA9PSAwIHx8CisJCQkJICAgICB0aW1lX2JlZm9yZShkcml2ZS0+c2xlZXAsIHNsZWVwKSkpIHsKIAkJCQkJc2xlZXBpbmcgPSAxOwogCQkJCQlzbGVlcCA9IGRyaXZlLT5zbGVlcDsKIAkJCQl9CkBAIC0xMDQ2LDcgKzEwMzMsNyBAQAogCQl9CiAJCWh3Z3JvdXAtPmh3aWYgPSBod2lmOwogCQlod2dyb3VwLT5kcml2ZSA9IGRyaXZlOwotCQlkcml2ZS0+c2xlZXBpbmcgPSAwOworCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH4oSURFX0RGTEFHX1NMRUVQSU5HIHwgSURFX0RGTEFHX1BBUktFRCk7CiAJCWRyaXZlLT5zZXJ2aWNlX3N0YXJ0ID0gamlmZmllczsKIAogCQlpZiAoYmxrX3F1ZXVlX3BsdWdnZWQoZHJpdmUtPnF1ZXVlKSkgewpAQCAtMTA4MCw3ICsxMDY3LDkgQEAKIAkJICogV2UgY291bnQgaG93IG1hbnkgdGltZXMgd2UgbG9vcCBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBzZXJ2aWNlCiAJCSAqIGFsbCBkcml2ZXMgaW4gdGhlIGh3Z3JvdXAgd2l0aG91dCBsb29waW5nIGZvciBldmVyCiAJCSAqLwotCQlpZiAoZHJpdmUtPmJsb2NrZWQgJiYgIWJsa19wbV9yZXF1ZXN0KHJxKSAmJiAhKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUFJFRU1QVCkpIHsKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0JMT0NLRUQpICYmCisJCSAgICBibGtfcG1fcmVxdWVzdChycSkgPT0gMCAmJgorCQkgICAgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUFJFRU1QVCkgPT0gMCkgewogCQkJZHJpdmUgPSBkcml2ZS0+bmV4dCA/IGRyaXZlLT5uZXh0IDogaHdncm91cC0+ZHJpdmU7CiAJCQlpZiAobG9vcHMrKyA8IDQgJiYgIWJsa19xdWV1ZV9wbHVnZ2VkKGRyaXZlLT5xdWV1ZSkpCiAJCQkJZ290byBhZ2FpbjsKQEAgLTExNTMsOCArMTE0Miw4IEBACiAJICogYSB0aW1lb3V0IC0tIHdlJ2xsIHJlZW5hYmxlIGFmdGVyIHdlIGZpbmlzaCB0aGlzIG5leHQgcmVxdWVzdAogCSAqIChvciByYXRoZXIgdGhlIGZpcnN0IGNodW5rIG9mIGl0KSBpbiBwaW8uCiAJICovCisJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfRE1BX1BJT19SRVRSWTsKIAlkcml2ZS0+cmV0cnlfcGlvKys7Ci0JZHJpdmUtPnN0YXRlID0gRE1BX1BJT19SRVRSWTsKIAlpZGVfZG1hX29mZl9xdWlldGx5KGRyaXZlKTsKIAogCS8qCkBAIC0xMzI1LDcgKzEzMTQsNyBAQAogCQlpZiAoaHdpZi0+aXJxID09IGlycSkgewogCQkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQkJCWlmICghT0tfU1RBVChzdGF0LCBSRUFEWV9TVEFULCBCQURfU1RBVCkpIHsKKwkJCWlmICghT0tfU1RBVChzdGF0LCBBVEFfRFJEWSwgQkFEX1NUQVQpKSB7CiAJCQkJLyogVHJ5IHRvIG5vdCBmbG9vZCB0aGUgY29uc29sZSB3aXRoIG1zZ3MgKi8KIAkJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X21zZ3RpbWUsIGNvdW50OwogCQkJCSsrY291bnQ7CkBAIC0xNDUxLDIzICsxNDQwLDE2IEBACiAJZGVsX3RpbWVyKCZod2dyb3VwLT50aW1lcik7CiAJc3Bpbl91bmxvY2soJmlkZV9sb2NrKTsKIAotCS8qIFNvbWUgY29udHJvbGxlcnMgbWlnaHQgc2V0IERNQSBJTlRSIG5vIG1hdHRlciBETUEgb3IgUElPOwotCSAqIGJtZG1hIHN0YXR1cyBtaWdodCBuZWVkIHRvIGJlIGNsZWFyZWQgZXZlbiBmb3IKLQkgKiBQSU8gaW50ZXJydXB0cyB0byBwcmV2ZW50IHNwdXJpb3VzL2xvc3QgaXJxLgotCSAqLwotCWlmIChod2lmLT5pZGVfZG1hX2NsZWFyX2lycSAmJiAhKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpKQotCQkvKiBpZGVfZG1hX2VuZCgpIG5lZWRzIGJtZG1hIHN0YXR1cyBmb3IgZXJyb3IgY2hlY2tpbmcuCi0JCSAqIFNvLCBza2lwIGNsZWFyaW5nIGJtZG1hIHN0YXR1cyBoZXJlIGFuZCBsZWF2ZSBpdAotCQkgKiB0byBpZGVfZG1hX2VuZCgpIGlmIHRoaXMgaXMgZG1hIGludGVycnVwdC4KLQkJICovCi0JCWh3aWYtPmlkZV9kbWFfY2xlYXJfaXJxKGRyaXZlKTsKKwlpZiAoaHdpZi0+cG9ydF9vcHMgJiYgaHdpZi0+cG9ydF9vcHMtPmNsZWFyX2lycSkKKwkJaHdpZi0+cG9ydF9vcHMtPmNsZWFyX2lycShkcml2ZSk7CiAKLQlpZiAoZHJpdmUtPnVubWFzaykKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VTk1BU0spCiAJCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOworCiAJLyogc2VydmljZSB0aGlzIGludGVycnVwdCwgbWF5IHNldCBoYW5kbGVyIGZvciBuZXh0IGludGVycnVwdCAqLwogCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwotCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKIAorCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKIAkvKgogCSAqIE5vdGUgdGhhdCBoYW5kbGVyKCkgbWF5IGhhdmUgc2V0IHRoaW5ncyB1cCBmb3IgYW5vdGhlcgogCSAqIGludGVycnVwdCB0byBvY2N1ciBzb29uLCBidXQgaXQgY2Fubm90IGhhcHBlbiB1bnRpbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jIGIvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDk0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBJREUgaW9jdGxzIGhhbmRsaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9pb2N0bF9kZXZzZXQgaWRlX2lvY3RsX3NldHRpbmdzW10gPSB7Cit7IEhESU9fR0VUXzMyQklULAkgSERJT19TRVRfMzJCSVQsCSZpZGVfZGV2c2V0X2lvXzMyYml0ICB9LAoreyBIRElPX0dFVF9LRUVQU0VUVElOR1MsIEhESU9fU0VUX0tFRVBTRVRUSU5HUywJJmlkZV9kZXZzZXRfa2VlcHNldHRpbmdzIH0sCit7IEhESU9fR0VUX1VOTUFTS0lOVFIsCSBIRElPX1NFVF9VTk1BU0tJTlRSLAkmaWRlX2RldnNldF91bm1hc2tpcnEgfSwKK3sgSERJT19HRVRfRE1BLAkJIEhESU9fU0VUX0RNQSwJCSZpZGVfZGV2c2V0X3VzaW5nX2RtYSB9LAoreyAtMSwJCQkgSERJT19TRVRfUElPX01PREUsCSZpZGVfZGV2c2V0X3Bpb19tb2RlICB9LAoreyAwIH0KK307CisKK2ludCBpZGVfc2V0dGluZ19pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWRlX2lvY3RsX2RldnNldCAqcykKK3sKKwljb25zdCBzdHJ1Y3QgaWRlX2RldnNldCAqZHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CisKKwlmb3IgKDsgKGRzID0gcy0+c2V0dGluZyk7IHMrKykgeworCQlpZiAoZHMtPmdldCAmJiBzLT5nZXRfaW9jdGwgPT0gY21kKQorCQkJZ290byByZWFkX3ZhbDsKKwkJZWxzZSBpZiAoZHMtPnNldCAmJiBzLT5zZXRfaW9jdGwgPT0gY21kKQorCQkJZ290byBzZXRfdmFsOworCX0KKworCXJldHVybiBlcnI7CisKK3JlYWRfdmFsOgorCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJZXJyID0gZHMtPmdldChkcml2ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmlkZV9zZXR0aW5nX210eCk7CisJcmV0dXJuIGVyciA+PSAwID8gcHV0X3VzZXIoZXJyLCAobG9uZyBfX3VzZXIgKilhcmcpIDogZXJyOworCitzZXRfdmFsOgorCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UgeworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQllcnIgPSAtRUFDQ0VTOworCQllbHNlIHsKKwkJCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7CisJCQllcnIgPSBpZGVfZGV2c2V0X2V4ZWN1dGUoZHJpdmUsIGRzLCBhcmcpOworCQkJbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfc2V0dGluZ19pb2N0bCk7CisKK3N0YXRpYyBpbnQgaWRlX2dldF9pZGVudGl0eV9pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1MTYgKmlkID0gTlVMTDsKKwlpbnQgc2l6ZSA9IChjbWQgPT0gSERJT19HRVRfSURFTlRJVFkpID8gKEFUQV9JRF9XT1JEUyAqIDIpIDogMTQyOworCWludCByYyA9IDA7CisKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfSURfUkVBRCkgPT0gMCkgeworCQlyYyA9IC1FTk9NU0c7CisJCWdvdG8gb3V0OworCX0KKworCWlkID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweShpZCwgZHJpdmUtPmlkLCBzaXplKTsKKwlhdGFfaWRfdG9faGRfZHJpdmVpZChpZCk7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgaWQsIHNpemUpKQorCQlyYyA9IC1FRkFVTFQ7CisKKwlrZnJlZShpZCk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlkZV9nZXRfbmljZV9pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBwdXRfdXNlcigoISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19EU0NfT1ZFUkxBUCkKKwkJCSA8PCBJREVfTklDRV9EU0NfT1ZFUkxBUCkgfAorCQkJKCEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTklDRTEpCisJCQkgPDwgSURFX05JQ0VfMSksIChsb25nIF9fdXNlciAqKWFyZyk7Cit9CisKK3N0YXRpYyBpbnQgaWRlX3NldF9uaWNlX2lvY3RsKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKGFyZyAhPSAoYXJnICYgKCgxIDw8IElERV9OSUNFX0RTQ19PVkVSTEFQKSB8ICgxIDw8IElERV9OSUNFXzEpKSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoKChhcmcgPj4gSURFX05JQ0VfRFNDX09WRVJMQVApICYgMSkgJiYKKwkgICAgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzayB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX2Zsb3BweSB8fAorCSAgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0NTSSkpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKChhcmcgPj4gSURFX05JQ0VfRFNDX09WRVJMQVApICYgMSkKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfRFNDX09WRVJMQVA7CisJZWxzZQorCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7CisKKwlpZiAoKGFyZyA+PiBJREVfTklDRV8xKSAmIDEpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05JQ0UxOworCWVsc2UKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX05JQ0UxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWRlX2NtZF9pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdTggKmJ1ZiA9IE5VTEw7CisJaW50IGJ1ZnNpemUgPSAwLCBlcnIgPSAwOworCXU4IGFyZ3NbNF0sIHhmZXJfcmF0ZSA9IDA7CisJaWRlX3Rhc2tfdCB0ZmFyZ3M7CisJc3RydWN0IGlkZV90YXNrZmlsZSAqdGYgPSAmdGZhcmdzLnRmOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisKKwlpZiAoTlVMTCA9PSAodm9pZCAqKSBhcmcpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJxOworCisJCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7CisJCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0FUQV9UQVNLRklMRTsKKwkJZXJyID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMCk7CisJCWJsa19wdXRfcmVxdWVzdChycSk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXJncywgKHZvaWQgX191c2VyICopYXJnLCA0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKKwl0Zi0+ZmVhdHVyZSA9IGFyZ3NbMl07CisJaWYgKGFyZ3NbMF0gPT0gQVRBX0NNRF9TTUFSVCkgeworCQl0Zi0+bnNlY3QgPSBhcmdzWzNdOworCQl0Zi0+bGJhbCAgPSBhcmdzWzFdOworCQl0Zi0+bGJhbSAgPSAweDRmOworCQl0Zi0+bGJhaCAgPSAweGMyOworCQl0ZmFyZ3MudGZfZmxhZ3MgPSBJREVfVEZMQUdfT1VUX1RGIHwgSURFX1RGTEFHX0lOX05TRUNUOworCX0gZWxzZSB7CisJCXRmLT5uc2VjdCA9IGFyZ3NbMV07CisJCXRmYXJncy50Zl9mbGFncyA9IElERV9URkxBR19PVVRfRkVBVFVSRSB8CisJCQkJICBJREVfVEZMQUdfT1VUX05TRUNUIHwgSURFX1RGTEFHX0lOX05TRUNUOworCX0KKwl0Zi0+Y29tbWFuZCA9IGFyZ3NbMF07CisJdGZhcmdzLmRhdGFfcGhhc2UgPSBhcmdzWzNdID8gVEFTS0ZJTEVfSU4gOiBUQVNLRklMRV9OT19EQVRBOworCisJaWYgKGFyZ3NbM10pIHsKKwkJdGZhcmdzLnRmX2ZsYWdzIHw9IElERV9URkxBR19JT18xNkJJVDsKKwkJYnVmc2l6ZSA9IFNFQ1RPUl9TSVpFICogYXJnc1szXTsKKwkJYnVmID0ga3phbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHRmLT5jb21tYW5kID09IEFUQV9DTURfU0VUX0ZFQVRVUkVTICYmCisJICAgIHRmLT5mZWF0dXJlID09IFNFVEZFQVRVUkVTX1hGRVIgJiYKKwkgICAgdGYtPm5zZWN0ID49IFhGRVJfU1dfRE1BXzAgJiYKKwkgICAgKGlkW0FUQV9JRF9VRE1BX01PREVTXSB8fAorCSAgICAgaWRbQVRBX0lEX01XRE1BX01PREVTXSB8fAorCSAgICAgaWRbQVRBX0lEX1NXRE1BX01PREVTXSkpIHsKKwkJeGZlcl9yYXRlID0gYXJnc1sxXTsKKwkJaWYgKHRmLT5uc2VjdCA+IFhGRVJfVURNQV8yICYmICFlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVURNQSBzcGVlZHMgPlVETUEzMyBjYW5ub3QgIgorCQkJCQkgICAgImJlIHNldFxuIiwgZHJpdmUtPm5hbWUpOworCQkJZ290byBhYm9ydDsKKwkJfQorCX0KKworCWVyciA9IGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZ0ZmFyZ3MsIGJ1ZiwgYXJnc1szXSk7CisKKwlhcmdzWzBdID0gdGYtPnN0YXR1czsKKwlhcmdzWzFdID0gdGYtPmVycm9yOworCWFyZ3NbMl0gPSB0Zi0+bnNlY3Q7CisKKwlpZiAoIWVyciAmJiB4ZmVyX3JhdGUpIHsKKwkJLyogYWN0aXZlLXJldHVuaW5nLWNhbGxzIGZ1dHVyZSAqLworCQlpZGVfc2V0X3hmZXJfcmF0ZShkcml2ZSwgeGZlcl9yYXRlKTsKKwkJaWRlX2RyaXZlaWRfdXBkYXRlKGRyaXZlKTsKKwl9CithYm9ydDoKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFyZ3MsIDQpKQorCQllcnIgPSAtRUZBVUxUOworCWlmIChidWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoYXJnICsgNCksIGJ1ZiwgYnVmc2l6ZSkpCisJCQllcnIgPSAtRUZBVUxUOworCQlrZnJlZShidWYpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlkZV90YXNrX2lvY3RsKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyID0gMDsKKwl1OCBhcmdzWzddOworCWlkZV90YXNrX3QgdGFzazsKKworCWlmIChjb3B5X2Zyb21fdXNlcihhcmdzLCBwLCA3KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRhc2ssIDAsIHNpemVvZih0YXNrKSk7CisJbWVtY3B5KCZ0YXNrLnRmX2FycmF5WzddLCAmYXJnc1sxXSwgNik7CisJdGFzay50Zi5jb21tYW5kID0gYXJnc1swXTsKKwl0YXNrLnRmX2ZsYWdzID0gSURFX1RGTEFHX1RGIHwgSURFX1RGTEFHX0RFVklDRTsKKworCWVyciA9IGlkZV9ub19kYXRhX3Rhc2tmaWxlKGRyaXZlLCAmdGFzayk7CisKKwlhcmdzWzBdID0gdGFzay50Zi5jb21tYW5kOworCW1lbWNweSgmYXJnc1sxXSwgJnRhc2sudGZfYXJyYXlbN10sIDYpOworCisJaWYgKGNvcHlfdG9fdXNlcihwLCBhcmdzLCA3KSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19kcml2ZV9yZXNldChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCWludCByZXQgPSAwOworCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOworCXJxLT5jbWRfbGVuID0gMTsKKwlycS0+Y21kWzBdID0gUkVRX0RSSVZFX1JFU0VUOworCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1NPRlRCQVJSSUVSOworCWlmIChibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIE5VTEwsIHJxLCAxKSkKKwkJcmV0ID0gcnEtPmVycm9yczsKKwlibGtfcHV0X3JlcXVlc3QocnEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBnZW5lcmljX2lkZV9pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaWRlX3NldHRpbmdfaW9jdGwoZHJpdmUsIGJkZXYsIGNtZCwgYXJnLCBpZGVfaW9jdGxfc2V0dGluZ3MpOworCWlmIChlcnIgIT0gLUVPUE5PVFNVUFApCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSERJT19PQlNPTEVURV9JREVOVElUWToKKwljYXNlIEhESU9fR0VUX0lERU5USVRZOgorCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaWRlX2dldF9pZGVudGl0eV9pb2N0bChkcml2ZSwgY21kLCBhcmcpOworCWNhc2UgSERJT19HRVRfTklDRToKKwkJcmV0dXJuIGlkZV9nZXRfbmljZV9pb2N0bChkcml2ZSwgYXJnKTsKKwljYXNlIEhESU9fU0VUX05JQ0U6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaWRlX3NldF9uaWNlX2lvY3RsKGRyaXZlLCBhcmcpOworI2lmZGVmIENPTkZJR19JREVfVEFTS19JT0NUTAorCWNhc2UgSERJT19EUklWRV9UQVNLRklMRToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCQlyZXR1cm4gaWRlX3Rhc2tmaWxlX2lvY3RsKGRyaXZlLCBjbWQsIGFyZyk7CisJCXJldHVybiAtRU5PTVNHOworI2VuZGlmCisJY2FzZSBIRElPX0RSSVZFX0NNRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBpZGVfY21kX2lvY3RsKGRyaXZlLCBjbWQsIGFyZyk7CisJY2FzZSBIRElPX0RSSVZFX1RBU0s6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaWRlX3Rhc2tfaW9jdGwoZHJpdmUsIGNtZCwgYXJnKTsKKwljYXNlIEhESU9fRFJJVkVfUkVTRVQ6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gZ2VuZXJpY19kcml2ZV9yZXNldChkcml2ZSk7CisJY2FzZSBIRElPX0dFVF9CVVNTVEFURToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWlmIChwdXRfdXNlcihCVVNTVEFURV9PTiwgKGxvbmcgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIEhESU9fU0VUX0JVU1NUQVRFOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19pZGVfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKaW5kZXggMmNiYWRmZi4uYjc2MmRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KQEAgLTE4Miw3ICsxODEsNyBAQAogCQl0Zl9vdXRiKHRmLT5sYmFoLCBpb19wb3J0cy0+bGJhaF9hZGRyKTsKIAogCWlmICh0YXNrLT50Zl9mbGFncyAmIElERV9URkxBR19PVVRfREVWSUNFKQotCQl0Zl9vdXRiKCh0Zi0+ZGV2aWNlICYgSElISSkgfCBkcml2ZS0+c2VsZWN0LmFsbCwKKwkJdGZfb3V0YigodGYtPmRldmljZSAmIEhJSEkpIHwgZHJpdmUtPnNlbGVjdCwKIAkJCSBpb19wb3J0cy0+ZGV2aWNlX2FkZHIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3RmX2xvYWQpOwpAQCAtNDAwLDk3ICszOTksMTQgQEAKIAkub3V0cHV0X2RhdGEJCT0gaWRlX291dHB1dF9kYXRhLAogfTsKIAotdm9pZCBpZGVfZml4X2RyaXZlaWQgKHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3ZvaWQgaWRlX2ZpeF9kcml2ZWlkKHUxNiAqaWQpCiB7CiAjaWZuZGVmIF9fTElUVExFX0VORElBTgogIyBpZmRlZiBfX0JJR19FTkRJQU4KIAlpbnQgaTsKLQl1MTYgKnN0cmluZ2Nhc3Q7CiAKLQlpZC0+Y29uZmlnICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jb25maWcpOwotCWlkLT5jeWxzICAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmN5bHMpOwotCWlkLT5yZXNlcnZlZDIgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnJlc2VydmVkMik7Ci0JaWQtPmhlYWRzICAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+aGVhZHMpOwotCWlkLT50cmFja19ieXRlcyAgICA9IF9fbGUxNl90b19jcHUoaWQtPnRyYWNrX2J5dGVzKTsKLQlpZC0+c2VjdG9yX2J5dGVzICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5zZWN0b3JfYnl0ZXMpOwotCWlkLT5zZWN0b3JzICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnNlY3RvcnMpOwotCWlkLT52ZW5kb3IwICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnZlbmRvcjApOwotCWlkLT52ZW5kb3IxICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnZlbmRvcjEpOwotCWlkLT52ZW5kb3IyICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnZlbmRvcjIpOwotCXN0cmluZ2Nhc3QgPSAodTE2ICopJmlkLT5zZXJpYWxfbm9bMF07Ci0JZm9yIChpID0gMDsgaSA8ICgyMC8yKTsgaSsrKQotCQlzdHJpbmdjYXN0W2ldID0gX19sZTE2X3RvX2NwdShzdHJpbmdjYXN0W2ldKTsKLQlpZC0+YnVmX3R5cGUgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5idWZfdHlwZSk7Ci0JaWQtPmJ1Zl9zaXplICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+YnVmX3NpemUpOwotCWlkLT5lY2NfYnl0ZXMgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmVjY19ieXRlcyk7Ci0Jc3RyaW5nY2FzdCA9ICh1MTYgKikmaWQtPmZ3X3JldlswXTsKLQlmb3IgKGkgPSAwOyBpIDwgKDgvMik7IGkrKykKLQkJc3RyaW5nY2FzdFtpXSA9IF9fbGUxNl90b19jcHUoc3RyaW5nY2FzdFtpXSk7Ci0Jc3RyaW5nY2FzdCA9ICh1MTYgKikmaWQtPm1vZGVsWzBdOwotCWZvciAoaSA9IDA7IGkgPCAoNDAvMik7IGkrKykKLQkJc3RyaW5nY2FzdFtpXSA9IF9fbGUxNl90b19jcHUoc3RyaW5nY2FzdFtpXSk7Ci0JaWQtPmR3b3JkX2lvICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZHdvcmRfaW8pOwotCWlkLT5yZXNlcnZlZDUwICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnJlc2VydmVkNTApOwotCWlkLT5maWVsZF92YWxpZCAgICA9IF9fbGUxNl90b19jcHUoaWQtPmZpZWxkX3ZhbGlkKTsKLQlpZC0+Y3VyX2N5bHMgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jdXJfY3lscyk7Ci0JaWQtPmN1cl9oZWFkcyAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+Y3VyX2hlYWRzKTsKLQlpZC0+Y3VyX3NlY3RvcnMgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jdXJfc2VjdG9ycyk7Ci0JaWQtPmN1cl9jYXBhY2l0eTAgID0gX19sZTE2X3RvX2NwdShpZC0+Y3VyX2NhcGFjaXR5MCk7Ci0JaWQtPmN1cl9jYXBhY2l0eTEgID0gX19sZTE2X3RvX2NwdShpZC0+Y3VyX2NhcGFjaXR5MSk7Ci0JaWQtPmxiYV9jYXBhY2l0eSAgID0gX19sZTMyX3RvX2NwdShpZC0+bGJhX2NhcGFjaXR5KTsKLQlpZC0+ZG1hXzF3b3JkICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5kbWFfMXdvcmQpOwotCWlkLT5kbWFfbXdvcmQgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmRtYV9td29yZCk7Ci0JaWQtPmVpZGVfcGlvX21vZGVzID0gX19sZTE2X3RvX2NwdShpZC0+ZWlkZV9waW9fbW9kZXMpOwotCWlkLT5laWRlX2RtYV9taW4gICA9IF9fbGUxNl90b19jcHUoaWQtPmVpZGVfZG1hX21pbik7Ci0JaWQtPmVpZGVfZG1hX3RpbWUgID0gX19sZTE2X3RvX2NwdShpZC0+ZWlkZV9kbWFfdGltZSk7Ci0JaWQtPmVpZGVfcGlvICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZWlkZV9waW8pOwotCWlkLT5laWRlX3Bpb19pb3JkeSA9IF9fbGUxNl90b19jcHUoaWQtPmVpZGVfcGlvX2lvcmR5KTsKLQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQotCQlpZC0+d29yZHM2OV83MFtpXSA9IF9fbGUxNl90b19jcHUoaWQtPndvcmRzNjlfNzBbaV0pOwotCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0JCWlkLT53b3JkczcxXzc0W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHM3MV83NFtpXSk7Ci0JaWQtPnF1ZXVlX2RlcHRoICAgID0gX19sZTE2X3RvX2NwdShpZC0+cXVldWVfZGVwdGgpOwotCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0JCWlkLT53b3Jkczc2Xzc5W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHM3Nl83OVtpXSk7Ci0JaWQtPm1ham9yX3Jldl9udW0gID0gX19sZTE2X3RvX2NwdShpZC0+bWFqb3JfcmV2X251bSk7Ci0JaWQtPm1pbm9yX3Jldl9udW0gID0gX19sZTE2X3RvX2NwdShpZC0+bWlub3JfcmV2X251bSk7Ci0JaWQtPmNvbW1hbmRfc2V0XzEgID0gX19sZTE2X3RvX2NwdShpZC0+Y29tbWFuZF9zZXRfMSk7Ci0JaWQtPmNvbW1hbmRfc2V0XzIgID0gX19sZTE2X3RvX2NwdShpZC0+Y29tbWFuZF9zZXRfMik7Ci0JaWQtPmNmc3NlICAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+Y2Zzc2UpOwotCWlkLT5jZnNfZW5hYmxlXzEgICA9IF9fbGUxNl90b19jcHUoaWQtPmNmc19lbmFibGVfMSk7Ci0JaWQtPmNmc19lbmFibGVfMiAgID0gX19sZTE2X3RvX2NwdShpZC0+Y2ZzX2VuYWJsZV8yKTsKLQlpZC0+Y3NmX2RlZmF1bHQgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jc2ZfZGVmYXVsdCk7Ci0JaWQtPmRtYV91bHRyYSAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+ZG1hX3VsdHJhKTsKLQlpZC0+dHJzZXVjICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT50cnNldWMpOwotCWlkLT50cnNFdWMgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPnRyc0V1Yyk7Ci0JaWQtPkN1ckFQTXZhbHVlcyAgID0gX19sZTE2X3RvX2NwdShpZC0+Q3VyQVBNdmFsdWVzKTsKLQlpZC0+bXByYyAgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5tcHJjKTsKLQlpZC0+aHdfY29uZmlnICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5od19jb25maWcpOwotCWlkLT5hY291c3RpYyAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmFjb3VzdGljKTsKLQlpZC0+bXNycXMgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5tc3Jxcyk7Ci0JaWQtPnN4ZmVydCAgICAgICAgID0gX19sZTE2X3RvX2NwdShpZC0+c3hmZXJ0KTsKLQlpZC0+c2FsICAgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5zYWwpOwotCWlkLT5zcGcgICAgICAgICAgICA9IF9fbGUzMl90b19jcHUoaWQtPnNwZyk7Ci0JaWQtPmxiYV9jYXBhY2l0eV8yID0gX19sZTY0X3RvX2NwdShpZC0+bGJhX2NhcGFjaXR5XzIpOwotCWZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQotCQlpZC0+d29yZHMxMDRfMTI1W2ldICAgPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczEwNF8xMjVbaV0pOwotCWlkLT5sYXN0X2x1biAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmxhc3RfbHVuKTsKLQlpZC0+d29yZDEyNyAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkMTI3KTsKLQlpZC0+ZGxmICAgICAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5kbGYpOwotCWlkLT5jc2ZvICAgICAgICAgICA9IF9fbGUxNl90b19jcHUoaWQtPmNzZm8pOwotCWZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQotCQlpZC0+d29yZHMxMzBfMTU1W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHMxMzBfMTU1W2ldKTsKLQlpZC0+d29yZDE1NiAgICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkMTU2KTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCQlpZC0+d29yZHMxNTdfMTU5W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHMxNTdfMTU5W2ldKTsKLQlpZC0+Y2ZhX3Bvd2VyICAgICAgPSBfX2xlMTZfdG9fY3B1KGlkLT5jZmFfcG93ZXIpOwotCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQotCQlpZC0+d29yZHMxNjFfMTc1W2ldID0gX19sZTE2X3RvX2NwdShpZC0+d29yZHMxNjFfMTc1W2ldKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKLQkJaWQtPndvcmRzMTc2XzIwNVtpXSA9IF9fbGUxNl90b19jcHUoaWQtPndvcmRzMTc2XzIwNVtpXSk7Ci0JZm9yIChpID0gMDsgaSA8IDQ5OyBpKyspCi0JCWlkLT53b3JkczIwNl8yNTRbaV0gPSBfX2xlMTZfdG9fY3B1KGlkLT53b3JkczIwNl8yNTRbaV0pOwotCWlkLT5pbnRlZ3JpdHlfd29yZCAgPSBfX2xlMTZfdG9fY3B1KGlkLT5pbnRlZ3JpdHlfd29yZCk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlpZFtpXSA9IF9fbGUxNl90b19jcHUoaWRbaV0pOwogIyBlbHNlCiAjICBlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICMgZW5kaWYKQEAgLTUwMSwxOSArNDE3LDIxIEBACiAgKiBpZGVfZml4c3RyaW5nKCkgY2xlYW5zIHVwIGFuZCAob3B0aW9uYWxseSkgYnl0ZS1zd2FwcyBhIHRleHQgc3RyaW5nLAogICogcmVtb3ZpbmcgbGVhZGluZy90cmFpbGluZyBibGFua3MgYW5kIGNvbXByZXNzaW5nIGludGVybmFsIGJsYW5rcy4KICAqIEl0IGlzIHByaW1hcmlseSB1c2VkIHRvIHRpZHkgdXAgdGhlIG1vZGVsIG5hbWUvbnVtYmVyIGZpZWxkcyBhcwotICogcmV0dXJuZWQgYnkgdGhlIFdJTl9bUF1JREVOVElGWSBjb21tYW5kcy4KKyAqIHJldHVybmVkIGJ5IHRoZSBBVEFfQ01EX0lEX0FUQVtQSV0gY29tbWFuZHMuCiAgKi8KIAogdm9pZCBpZGVfZml4c3RyaW5nICh1OCAqcywgY29uc3QgaW50IGJ5dGVjb3VudCwgY29uc3QgaW50IGJ5dGVzd2FwKQogewotCXU4ICpwID0gcywgKmVuZCA9ICZzW2J5dGVjb3VudCAmIH4xXTsgLyogYnl0ZWNvdW50IG11c3QgYmUgZXZlbiAqLworCXU4ICpwLCAqZW5kID0gJnNbYnl0ZWNvdW50ICYgfjFdOyAvKiBieXRlY291bnQgbXVzdCBiZSBldmVuICovCiAKIAlpZiAoYnl0ZXN3YXApIHsKIAkJLyogY29udmVydCBmcm9tIGJpZy1lbmRpYW4gdG8gaG9zdCBieXRlIG9yZGVyICovCi0JCWZvciAocCA9IGVuZCA7IHAgIT0gczspCi0JCQliZTE2X3RvX2NwdXMoKHUxNiAqKShwIC09IDIpKTsKKwkJZm9yIChwID0gcyA7IHAgIT0gZW5kIDsgcCArPSAyKQorCQkJYmUxNl90b19jcHVzKCh1MTYgKikgcCk7CiAJfQorCiAJLyogc3RyaXAgbGVhZGluZyBibGFua3MgKi8KKwlwID0gczsKIAl3aGlsZSAocyAhPSBlbmQgJiYgKnMgPT0gJyAnKQogCQkrK3M7CiAJLyogY29tcHJlc3MgaW50ZXJuYWwgYmxhbmtzIGFuZCBzdHJpcCB0cmFpbGluZyBibGFua3MgKi8KQEAgLTU1Niw3ICs0NzQsNyBAQAogCQkvKiBOb3RlOiB0aGlzIG1heSBjbGVhciBhIHBlbmRpbmcgSVJRISEgKi8KIAkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQlpZiAoc3RhdCAmIEJVU1lfU1RBVCkKKwlpZiAoc3RhdCAmIEFUQV9CVVNZKQogCQkvKiBkcml2ZSBidXN5OiAgZGVmaW5pdGVseSBub3QgaW50ZXJydXB0aW5nICovCiAJCXJldHVybiAwOwogCkBAIC01ODgsMTAgKzUwNiwxMCBAQAogCXVkZWxheSgxKTsJLyogc3BlYyBhbGxvd3MgZHJpdmUgNDAwbnMgdG8gYXNzZXJ0ICJCVVNZIiAqLwogCXN0YXQgPSB0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCi0JaWYgKHN0YXQgJiBCVVNZX1NUQVQpIHsKKwlpZiAoc3RhdCAmIEFUQV9CVVNZKSB7CiAJCWxvY2FsX2lycV9zZXQoZmxhZ3MpOwogCQl0aW1lb3V0ICs9IGppZmZpZXM7Ci0JCXdoaWxlICgoc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpICYgQlVTWV9TVEFUKSB7CisJCXdoaWxlICgoc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpICYgQVRBX0JVU1kpIHsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCQkJLyoKIAkJCQkgKiBPbmUgbGFzdCByZWFkIGFmdGVyIHRoZSB0aW1lb3V0IGluIGNhc2UKQEAgLTU5OSw3ICs1MTcsNyBAQAogCQkJCSAqIHByb2dyZXNzIGR1cmluZyB0aGUgdGltZW91dC4uCiAJCQkJICovCiAJCQkJc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0JCQkJaWYgKCEoc3RhdCAmIEJVU1lfU1RBVCkpCisJCQkJaWYgKChzdGF0ICYgQVRBX0JVU1kpID09IDApCiAJCQkJCWJyZWFrOwogCiAJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNjYwLDE4ICs1NzgsMTggQEAKIC8qKgogICoJaWRlX2luX2RyaXZlX2xpc3QJLQlsb29rIGZvciBkcml2ZSBpbiBibGFjay93aGl0ZSBsaXN0CiAgKglAaWQ6IGRyaXZlIGlkZW50aWZpZXIKLSAqCUBkcml2ZV90YWJsZTogbGlzdCB0byBpbnNwZWN0CisgKglAdGFibGU6IGxpc3QgdG8gaW5zcGVjdAogICoKICAqCUxvb2sgZm9yIGEgZHJpdmUgaW4gdGhlIGJsYWNrbGlzdCBhbmQgdGhlIHdoaXRlbGlzdCB0YWJsZXMKICAqCVJldHVybnMgMSBpZiB0aGUgZHJpdmUgaXMgZm91bmQgaW4gdGhlIHRhYmxlLgogICovCiAKLWludCBpZGVfaW5fZHJpdmVfbGlzdChzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQsIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5ICpkcml2ZV90YWJsZSkKK2ludCBpZGVfaW5fZHJpdmVfbGlzdCh1MTYgKmlkLCBjb25zdCBzdHJ1Y3QgZHJpdmVfbGlzdF9lbnRyeSAqdGFibGUpCiB7Ci0JZm9yICggOyBkcml2ZV90YWJsZS0+aWRfbW9kZWw7IGRyaXZlX3RhYmxlKyspCi0JCWlmICgoIXN0cmNtcChkcml2ZV90YWJsZS0+aWRfbW9kZWwsIGlkLT5tb2RlbCkpICYmCi0JCSAgICAoIWRyaXZlX3RhYmxlLT5pZF9maXJtd2FyZSB8fAotCQkgICAgIHN0cnN0cihpZC0+ZndfcmV2LCBkcml2ZV90YWJsZS0+aWRfZmlybXdhcmUpKSkKKwlmb3IgKCA7IHRhYmxlLT5pZF9tb2RlbDsgdGFibGUrKykKKwkJaWYgKCghc3RyY21wKHRhYmxlLT5pZF9tb2RlbCwgKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdKSkgJiYKKwkJICAgICghdGFibGUtPmlkX2Zpcm13YXJlIHx8CisJCSAgICAgc3Ryc3RyKChjaGFyICopJmlkW0FUQV9JRF9GV19SRVZdLCB0YWJsZS0+aWRfZmlybXdhcmUpKSkKIAkJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtNzAyLDcgKzYyMCw3IEBACiB1OCBlaWdodHlfbmludHlfdGhyZWUgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CiAJaW50IGl2YiA9IGlkZV9pbl9kcml2ZV9saXN0KGlkLCBpdmJfbGlzdCk7CiAKIAlpZiAoaHdpZi0+Y2JsID09IEFUQV9DQkxfUEFUQTQwX1NIT1JUKQpAQCAtNzEyLDcgKzYzMCw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tpcHBpbmcgd29yZCA5MyB2YWxpZGl0eSBjaGVja1xuIiwKIAkJCQkgIGRyaXZlLT5uYW1lKTsKIAotCWlmIChpZGVfZGV2X2lzX3NhdGEoaWQpICYmICFpdmIpCisJaWYgKGF0YV9pZF9pc19zYXRhKGlkKSAmJiAhaXZiKQogCQlyZXR1cm4gMTsKIAogCWlmIChod2lmLT5jYmwgIT0gQVRBX0NCTF9QQVRBODAgJiYgIWl2YikKQEAgLTcyNCwxMSArNjQyLDEyIEBACiAJICogLSBmb3JjZSBiaXQxMyAoODBjIGNhYmxlIHByZXNlbnQpIGNoZWNrIGFsc28gZm9yICFpdmIgZGV2aWNlcwogCSAqICAgKHVubGVzcyB0aGUgc2xhdmUgZGV2aWNlIGlzIHByZS1BVEEzKQogCSAqLwotCWlmICgoaWQtPmh3X2NvbmZpZyAmIDB4NDAwMCkgfHwgKGl2YiAmJiAoaWQtPmh3X2NvbmZpZyAmIDB4MjAwMCkpKQorCWlmICgoaWRbQVRBX0lEX0hXX0NPTkZJR10gJiAweDQwMDApIHx8CisJICAgIChpdmIgJiYgKGlkW0FUQV9JRF9IV19DT05GSUddICYgMHgyMDAwKSkpCiAJCXJldHVybiAxOwogCiBub184MHc6Ci0JaWYgKGRyaXZlLT51ZG1hMzNfd2FybmVkID09IDEpCisJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVURNQTMzX1dBUk5FRCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgc2lkZSA4MC13aXJlIGNhYmxlIGRldGVjdGlvbiBmYWlsZWQsICIKQEAgLTczNiw3ICs2NTUsNyBAQAogCQkJICAgIGRyaXZlLT5uYW1lLAogCQkJICAgIGh3aWYtPmNibCA9PSBBVEFfQ0JMX1BBVEE4MCA/ICJkcml2ZSIgOiAiaG9zdCIpOwogCi0JZHJpdmUtPnVkbWEzM193YXJuZWQgPSAxOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1VETUEzM19XQVJORUQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NSw4ICs2NjQsOCBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwotCXN0cnVjdCBoZF9kcml2ZWlkICppZDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGZsYWdzOworCXUxNiAqaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBzdGF0OwogCiAJLyoKQEAgLTc1NywyOSArNjc2LDI0IEBACiAJU0VMRUNUX01BU0soZHJpdmUsIDEpOwogCXRwX29wcy0+c2V0X2lycShod2lmLCAwKTsKIAltc2xlZXAoNTApOwotCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIFdJTl9JREVOVElGWSk7Ci0JdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKLQlkbyB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlTRUxFQ1RfTUFTSyhkcml2ZSwgMCk7Ci0JCQlyZXR1cm4gMDsJLyogZHJpdmUgdGltZWQtb3V0ICovCi0JCX0KKwl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfQ01EX0lEX0FUQSk7CiAKLQkJbXNsZWVwKDUwKTsJLyogZ2l2ZSBkcml2ZSBhIGJyZWF0aGVyICovCi0JCXN0YXQgPSB0cF9vcHMtPnJlYWRfYWx0c3RhdHVzKGh3aWYpOwotCX0gd2hpbGUgKHN0YXQgJiBCVVNZX1NUQVQpOworCWlmIChpZGVfYnVzeV9zbGVlcChod2lmLCBXQUlUX1dPUlNUQ0FTRSwgMSkpIHsKKwkJU0VMRUNUX01BU0soZHJpdmUsIDApOworCQlyZXR1cm4gMDsKKwl9CiAKLQltc2xlZXAoNTApOwkvKiB3YWl0IGZvciBJUlEgYW5kIERSUV9TVEFUICovCisJbXNsZWVwKDUwKTsJLyogd2FpdCBmb3IgSVJRIGFuZCBBVEFfRFJRICovCiAJc3RhdCA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQlpZiAoIU9LX1NUQVQoc3RhdCwgRFJRX1NUQVQsIEJBRF9SX1NUQVQpKSB7CisJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUlEsIEJBRF9SX1NUQVQpKSB7CiAJCVNFTEVDVF9NQVNLKGRyaXZlLCAwKTsKIAkJcHJpbnRrKCIlczogQ0hFQ0sgZm9yIGdvb2QgU1RBVFVTXG4iLCBkcml2ZS0+bmFtZSk7CiAJCXJldHVybiAwOwogCX0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJU0VMRUNUX01BU0soZHJpdmUsIDApOwotCWlkID0ga21hbGxvYyhTRUNUT1JfV09SRFMqNCwgR0ZQX0FUT01JQyk7CisJaWQgPSBrbWFsbG9jKFNFQ1RPUl9TSVpFLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWlkKSB7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuIDA7CkBAIC03ODksMTYgKzcwMywxNiBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJaWRlX2ZpeF9kcml2ZWlkKGlkKTsKLQlpZiAoaWQpIHsKLQkJZHJpdmUtPmlkLT5kbWFfdWx0cmEgPSBpZC0+ZG1hX3VsdHJhOwotCQlkcml2ZS0+aWQtPmRtYV9td29yZCA9IGlkLT5kbWFfbXdvcmQ7Ci0JCWRyaXZlLT5pZC0+ZG1hXzF3b3JkID0gaWQtPmRtYV8xd29yZDsKLQkJLyogYW55dGhpbmcgbW9yZSA/ICovCi0JCWtmcmVlKGlkKTsKIAotCQlpZiAoZHJpdmUtPnVzaW5nX2RtYSAmJiBpZGVfaWRfZG1hX2J1Zyhkcml2ZSkpCi0JCQlpZGVfZG1hX29mZihkcml2ZSk7Ci0JfQorCWRyaXZlLT5pZFtBVEFfSURfVURNQV9NT0RFU10gID0gaWRbQVRBX0lEX1VETUFfTU9ERVNdOworCWRyaXZlLT5pZFtBVEFfSURfTVdETUFfTU9ERVNdID0gaWRbQVRBX0lEX01XRE1BX01PREVTXTsKKwlkcml2ZS0+aWRbQVRBX0lEX1NXRE1BX01PREVTXSA9IGlkW0FUQV9JRF9TV0RNQV9NT0RFU107CisJLyogYW55dGhpbmcgbW9yZSA/ICovCisKKwlrZnJlZShpZCk7CisKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKSAmJiBpZGVfaWRfZG1hX2J1Zyhkcml2ZSkpCisJCWlkZV9kbWFfb2ZmKGRyaXZlKTsKIAogCXJldHVybiAxOwogfQpAQCAtODA3LDYgKzcyMSw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CisJdTE2ICppZCA9IGRyaXZlLT5pZCwgaTsKIAlpbnQgZXJyb3IgPSAwOwogCXU4IHN0YXQ7CiAJaWRlX3Rhc2tfdCB0YXNrOwpAQCAtODE3LDcgKzczMiw3IEBACiAjZW5kaWYKIAogCS8qIFNraXAgc2V0dGluZyBQSU8gZmxvdy1jb250cm9sIG1vZGVzIG9uIHByZS1FSURFIGRyaXZlcyAqLwotCWlmICgoc3BlZWQgJiAweGY4KSA9PSBYRkVSX1BJT18wICYmICEoZHJpdmUtPmlkLT5jYXBhYmlsaXR5ICYgMHgwOCkpCisJaWYgKChzcGVlZCAmIDB4ZjgpID09IFhGRVJfUElPXzAgJiYgYXRhX2lkX2hhc19pb3JkeShkcml2ZS0+aWQpID09IDApCiAJCWdvdG8gc2tpcDsKIAogCS8qCkBAIC04NTEsMTMgKzc2NiwxMyBAQAogCiAJdHBfb3BzLT50Zl9sb2FkKGRyaXZlLCAmdGFzayk7CiAKLQl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBXSU5fU0VURkVBVFVSRVMpOworCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfU0VUX0ZFQVRVUkVTKTsKIAogCWlmIChkcml2ZS0+cXVpcmtfbGlzdCA9PSAyKQogCQl0cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CiAKIAllcnJvciA9IF9faWRlX3dhaXRfc3RhdChkcml2ZSwgZHJpdmUtPnJlYWR5X3N0YXQsCi0JCQkJQlVTWV9TVEFUfERSUV9TVEFUfEVSUl9TVEFULAorCQkJCUFUQV9CVVNZIHwgQVRBX0RSUSB8IEFUQV9FUlIsCiAJCQkJV0FJVF9DTUQsICZzdGF0KTsKIAogCVNFTEVDVF9NQVNLKGRyaXZlLCAwKTsKQEAgLTg2OSwzNSArNzg0LDI5IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlkcml2ZS0+aWQtPmRtYV91bHRyYSAmPSB+MHhGRjAwOwotCWRyaXZlLT5pZC0+ZG1hX213b3JkICY9IH4weDBGMDA7Ci0JZHJpdmUtPmlkLT5kbWFfMXdvcmQgJj0gfjB4MEYwMDsKKwlpZFtBVEFfSURfVURNQV9NT0RFU10gICY9IH4weEZGMDA7CisJaWRbQVRBX0lEX01XRE1BX01PREVTXSAmPSB+MHgwRjAwOworCWlkW0FUQV9JRF9TV0RNQV9NT0RFU10gJj0gfjB4MEYwMDsKIAogIHNraXA6CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCi0JaWYgKHNwZWVkID49IFhGRVJfU1dfRE1BXzAgJiYgZHJpdmUtPnVzaW5nX2RtYSkKKwlpZiAoc3BlZWQgPj0gWEZFUl9TV19ETUFfMCAmJiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpKQogCQlod2lmLT5kbWFfb3BzLT5kbWFfaG9zdF9zZXQoZHJpdmUsIDEpOwogCWVsc2UgaWYgKGh3aWYtPmRtYV9vcHMpCS8qIGNoZWNrIGlmIGhvc3Qgc3VwcG9ydHMgRE1BICovCiAJCWlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOwogI2VuZGlmCiAKLQlzd2l0Y2goc3BlZWQpIHsKLQkJY2FzZSBYRkVSX1VETUFfNzogICBkcml2ZS0+aWQtPmRtYV91bHRyYSB8PSAweDgwODA7IGJyZWFrOwotCQljYXNlIFhGRVJfVURNQV82OiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4NDA0MDsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzU6ICAgZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgyMDIwOyBicmVhazsKLQkJY2FzZSBYRkVSX1VETUFfNDogICBkcml2ZS0+aWQtPmRtYV91bHRyYSB8PSAweDEwMTA7IGJyZWFrOwotCQljYXNlIFhGRVJfVURNQV8zOiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4MDgwODsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzI6ICAgZHJpdmUtPmlkLT5kbWFfdWx0cmEgfD0gMHgwNDA0OyBicmVhazsKLQkJY2FzZSBYRkVSX1VETUFfMTogICBkcml2ZS0+aWQtPmRtYV91bHRyYSB8PSAweDAyMDI7IGJyZWFrOwotCQljYXNlIFhGRVJfVURNQV8wOiAgIGRyaXZlLT5pZC0+ZG1hX3VsdHJhIHw9IDB4MDEwMTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9NV19ETUFfMjogZHJpdmUtPmlkLT5kbWFfbXdvcmQgfD0gMHgwNDA0OyBicmVhazsKLQkJY2FzZSBYRkVSX01XX0RNQV8xOiBkcml2ZS0+aWQtPmRtYV9td29yZCB8PSAweDAyMDI7IGJyZWFrOwotCQljYXNlIFhGRVJfTVdfRE1BXzA6IGRyaXZlLT5pZC0+ZG1hX213b3JkIHw9IDB4MDEwMTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9TV19ETUFfMjogZHJpdmUtPmlkLT5kbWFfMXdvcmQgfD0gMHgwNDA0OyBicmVhazsKLQkJY2FzZSBYRkVSX1NXX0RNQV8xOiBkcml2ZS0+aWQtPmRtYV8xd29yZCB8PSAweDAyMDI7IGJyZWFrOwotCQljYXNlIFhGRVJfU1dfRE1BXzA6IGRyaXZlLT5pZC0+ZG1hXzF3b3JkIHw9IDB4MDEwMTsgYnJlYWs7Ci0JCWRlZmF1bHQ6IGJyZWFrOworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQlpID0gMSA8PCAoc3BlZWQgLSBYRkVSX1VETUFfMCk7CisJCWlkW0FUQV9JRF9VRE1BX01PREVTXSB8PSAoaSA8PCA4IHwgaSk7CisJfSBlbHNlIGlmIChzcGVlZCA+PSBYRkVSX01XX0RNQV8wKSB7CisJCWkgPSAxIDw8IChzcGVlZCAtIFhGRVJfTVdfRE1BXzApOworCQlpZFtBVEFfSURfTVdETUFfTU9ERVNdIHw9IChpIDw8IDggfCBpKTsKKwl9IGVsc2UgaWYgKHNwZWVkID49IFhGRVJfU1dfRE1BXzApIHsKKwkJaSA9IDEgPDwgKHNwZWVkIC0gWEZFUl9TV19ETUFfMCk7CisJCWlkW0FUQV9JRF9TV0RNQV9NT0RFU10gfD0gKGkgPDwgOCB8IGkpOwogCX0KKwogCWlmICghZHJpdmUtPmluaXRfc3BlZWQpCiAJCWRyaXZlLT5pbml0X3NwZWVkID0gc3BlZWQ7CiAJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBzcGVlZDsKQEAgLTk3Nyw3ICs4ODYsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKLQlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBXSU5fUEFDS0VUQ01EKTsKKwlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfQ01EX1BBQ0tFVCk7CiAJbmRlbGF5KDQwMCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTEwMTAsNyArOTE5LDcgQEAKIAl1ZGVsYXkgKDEwKTsKIAlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmIChPS19TVEFUKHN0YXQsIDAsIEJVU1lfU1RBVCkpCisJaWYgKE9LX1NUQVQoc3RhdCwgMCwgQVRBX0JVU1kpKQogCQlwcmludGsoIiVzOiBBVEFQSSByZXNldCBjb21wbGV0ZVxuIiwgZHJpdmUtPm5hbWUpOwogCWVsc2UgewogCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdncm91cC0+cG9sbF90aW1lb3V0KSkgewpAQCAtMTAzMSw2ICs5NDAsMjUgQEAKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CiAKK3N0YXRpYyB2b2lkIGlkZV9yZXNldF9yZXBvcnRfZXJyb3IoaWRlX2h3aWZfdCAqaHdpZiwgdTggZXJyKQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcnJfbWFzdGVyX3ZhbHNbXSA9CisJCXsgTlVMTCwgInBhc3NlZCIsICJmb3JtYXR0ZXIgZGV2aWNlIGVycm9yIiwKKwkJICAic2VjdG9yIGJ1ZmZlciBlcnJvciIsICJFQ0MgY2lyY3VpdHJ5IGVycm9yIiwKKwkJICAiY29udHJvbGxpbmcgTVBVIGVycm9yIiB9OworCisJdTggZXJyX21hc3RlciA9IGVyciAmIDB4N2Y7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiByZXNldDogbWFzdGVyOiAiLCBod2lmLT5uYW1lKTsKKwlpZiAoZXJyX21hc3RlciAmJiBlcnJfbWFzdGVyIDwgNikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiJXMiLCBlcnJfbWFzdGVyX3ZhbHNbZXJyX21hc3Rlcl0pOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fQ09OVCAiZXJyb3IgKDB4JTAyeD8pIiwgZXJyKTsKKwlpZiAoZXJyICYgMHg4MCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiOyBzbGF2ZTogZmFpbGVkIik7CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKK30KKwogLyoKICAqIHJlc2V0X3BvbGxmdW5jKCkgZ2V0cyBpbnZva2VkIHRvIHBvbGwgdGhlIGludGVyZmFjZSBmb3IgY29tcGxldGlvbiBldmVyeSA1MG1zCiAgKiBkdXJpbmcgYW4gaWRlIHJlc2V0IG9wZXJhdGlvbi4gSWYgdGhlIGRyaXZlcyBoYXZlIG5vdCB5ZXQgcmVzcG9uZGVkLApAQCAtMTA1Niw3ICs5ODQsNyBAQAogCiAJdG1wID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmICghT0tfU1RBVCh0bXAsIDAsIEJVU1lfU1RBVCkpIHsKKwlpZiAoIU9LX1NUQVQodG1wLCAwLCBBVEFfQlVTWSkpIHsKIAkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnJlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCkBAIC0xMDY2LDMxICs5OTQsMTQgQEAKIAkJZHJpdmUtPmZhaWx1cmVzKys7CiAJCWVyciA9IC1FSU87CiAJfSBlbHNlICB7Ci0JCXByaW50aygiJXM6IHJlc2V0OiAiLCBod2lmLT5uYW1lKTsKIAkJdG1wID0gaWRlX3JlYWRfZXJyb3IoZHJpdmUpOwogCiAJCWlmICh0bXAgPT0gMSkgewotCQkJcHJpbnRrKCJzdWNjZXNzXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXNldDogc3VjY2Vzc1xuIiwgaHdpZi0+bmFtZSk7CiAJCQlkcml2ZS0+ZmFpbHVyZXMgPSAwOwogCQl9IGVsc2UgeworCQkJaWRlX3Jlc2V0X3JlcG9ydF9lcnJvcihod2lmLCB0bXApOwogCQkJZHJpdmUtPmZhaWx1cmVzKys7Ci0JCQlwcmludGsoIm1hc3RlcjogIik7Ci0JCQlzd2l0Y2ggKHRtcCAmIDB4N2YpIHsKLQkJCQljYXNlIDE6IHByaW50aygicGFzc2VkIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjogcHJpbnRrKCJmb3JtYXR0ZXIgZGV2aWNlIGVycm9yIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzogcHJpbnRrKCJzZWN0b3IgYnVmZmVyIGVycm9yIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDogcHJpbnRrKCJFQ0MgY2lyY3VpdHJ5IGVycm9yIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTogcHJpbnRrKCJjb250cm9sbGluZyBNUFUgZXJyb3IiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDpwcmludGsoImVycm9yICgweCUwMng/KSIsIHRtcCk7Ci0JCQl9Ci0JCQlpZiAodG1wICYgMHg4MCkKLQkJCQlwcmludGsoIjsgc2xhdmU6IGZhaWxlZCIpOwotCQkJcHJpbnRrKCJcbiIpOwogCQkJZXJyID0gLUVJTzsKIAkJfQogCX0KQEAgLTExMDIsMTQgKzEwMTMsMTkgQEAKIAogc3RhdGljIHZvaWQgaWRlX2Rpc2tfcHJlX3Jlc2V0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpbnQgbGVnYWN5ID0gKGRyaXZlLT5pZC0+Y2ZzX2VuYWJsZV8yICYgMHgwNDAwKSA/IDAgOiAxOworCWludCBsZWdhY3kgPSAoZHJpdmUtPmlkW0FUQV9JRF9DRlNfRU5BQkxFXzJdICYgMHgwNDAwKSA/IDAgOiAxOwogCiAJZHJpdmUtPnNwZWNpYWwuYWxsID0gMDsKIAlkcml2ZS0+c3BlY2lhbC5iLnNldF9nZW9tZXRyeSA9IGxlZ2FjeTsKIAlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlICA9IGxlZ2FjeTsKKwogCWRyaXZlLT5tdWx0X2NvdW50ID0gMDsKLQlpZiAoIWRyaXZlLT5rZWVwX3NldHRpbmdzICYmICFkcml2ZS0+dXNpbmdfZG1hKQorCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19QQVJLRUQ7CisKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfS0VFUF9TRVRUSU5HUykgPT0gMCAmJgorCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpID09IDApCiAJCWRyaXZlLT5tdWx0X3JlcSA9IDA7CisKIAlpZiAoZHJpdmUtPm11bHRfcmVxICE9IGRyaXZlLT5tdWx0X2NvdW50KQogCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9tdWx0bW9kZSA9IDE7CiB9CkBAIC0xMTIxLDE4ICsxMDM3LDE4IEBACiAJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKIAkJaWRlX2Rpc2tfcHJlX3Jlc2V0KGRyaXZlKTsKIAllbHNlCi0JCWRyaXZlLT5wb3N0X3Jlc2V0ID0gMTsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfUE9TVF9SRVNFVDsKIAotCWlmIChkcml2ZS0+dXNpbmdfZG1hKSB7CisJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKSB7CiAJCWlmIChkcml2ZS0+Y3JjX2NvdW50KQogCQkJaWRlX2NoZWNrX2RtYV9jcmMoZHJpdmUpOwogCQllbHNlCiAJCQlpZGVfZG1hX29mZihkcml2ZSk7CiAJfQogCi0JaWYgKCFkcml2ZS0+a2VlcF9zZXR0aW5ncykgewotCQlpZiAoIWRyaXZlLT51c2luZ19kbWEpIHsKLQkJCWRyaXZlLT51bm1hc2sgPSAwOworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19LRUVQX1NFVFRJTkdTKSA9PSAwKSB7CisJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpID09IDApIHsKKwkJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19VTk1BU0s7CiAJCQlkcml2ZS0+aW9fMzJiaXQgPSAwOwogCQl9CiAJCXJldHVybjsKQEAgLTExNjQsMTIgKzEwODAsMTMgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZG9fcmVzZXQxIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBkb19ub3RfdHJ5X2F0YXBpKQogewogCXVuc2lnbmVkIGludCB1bml0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdGltZW91dDsKIAlpZGVfaHdpZl90ICpod2lmOwogCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXA7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHM7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wczsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wczsKKwlERUZJTkVfV0FJVCh3YWl0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwogCWh3aWYgPSBIV0lGKGRyaXZlKTsKQEAgLTExODcsNyArMTEwNCw3IEBACiAJCXByZV9yZXNldChkcml2ZSk7CiAJCVNFTEVDVF9EUklWRShkcml2ZSk7CiAJCXVkZWxheSAoMjApOwotCQl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBXSU5fU1JTVCk7CisJCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfREVWX1JFU0VUKTsKIAkJbmRlbGF5KDQwMCk7CiAJCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKIAkJaHdncm91cC0+cG9sbGluZyA9IDE7CkBAIC0xMTk2LDYgKzExMTMsMzEgQEAKIAkJcmV0dXJuIGlkZV9zdGFydGVkOwogCX0KIAorCS8qIFdlIG11c3Qgbm90IGRpc3R1cmIgZGV2aWNlcyBpbiB0aGUgSURFX0RGTEFHX1BBUktFRCBzdGF0ZS4gKi8KKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgbm93OworCisJCXByZXBhcmVfdG9fd2FpdCgmaWRlX3Bhcmtfd3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXRpbWVvdXQgPSBqaWZmaWVzOworCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7CisJCQlpZGVfZHJpdmVfdCAqdGRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKKworCQkJaWYgKHRkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQgJiYKKwkJCSAgICB0ZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQgJiYKKwkJCSAgICB0aW1lX2FmdGVyKHRkcml2ZS0+c2xlZXAsIHRpbWVvdXQpKQorCQkJCXRpbWVvdXQgPSB0ZHJpdmUtPnNsZWVwOworCQl9CisKKwkJbm93ID0gamlmZmllczsKKwkJaWYgKHRpbWVfYmVmb3JlX2VxKHRpbWVvdXQsIG5vdykpCisJCQlicmVhazsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUodGltZW91dCAtIG5vdyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCX0gd2hpbGUgKHRpbWVvdXQpOworCWZpbmlzaF93YWl0KCZpZGVfcGFya193cSwgJndhaXQpOworCiAJLyoKIAkgKiBGaXJzdCwgcmVzZXQgYW55IGRldmljZSBzdGF0ZSBkYXRhIHdlIHdlcmUgbWFpbnRhaW5pbmcKIAkgKiBmb3IgYW55IG9mIHRoZSBkcml2ZXMgb24gdGhpcyBpbnRlcmZhY2UuCkBAIC0xMjcwLDcgKzEyMTIsNyBAQAogCQkgKi8KIAkJbWRlbGF5KDEpOwogCQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKLQkJaWYgKChzdGF0ICYgQlVTWV9TVEFUKSA9PSAwKQorCQlpZiAoKHN0YXQgJiBBVEFfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCQkvKgogCQkgKiBBc3N1bWUgYSB2YWx1ZSBvZiAweGZmIG1lYW5zIG5vdGhpbmcgaXMgY29ubmVjdGVkIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKaW5kZXggOTdmZWZhYi4uOWZjNGNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCkBAIC05MCwyOSArODksMzEgQEAKIAogdTggaWRlX2dldF9iZXN0X3Bpb19tb2RlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IG1vZGVfd2FudGVkLCB1OCBtYXhfbW9kZSkKIHsKLQlpbnQgcGlvX21vZGU7Ci0Jc3RydWN0IGhkX2RyaXZlaWQqIGlkID0gZHJpdmUtPmlkOwotCWludCBvdmVycmlkZGVuICA9IDA7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKKwlpbnQgcGlvX21vZGUgPSAtMSwgb3ZlcnJpZGRlbiA9IDA7CiAKIAlpZiAobW9kZV93YW50ZWQgIT0gMjU1KQogCQlyZXR1cm4gbWluX3QodTgsIG1vZGVfd2FudGVkLCBtYXhfbW9kZSk7CiAKLQlpZiAoKGRyaXZlLT5od2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1BJT19OT19CTEFDS0xJU1QpID09IDAgJiYKLQkgICAgKHBpb19tb2RlID0gaWRlX3NjYW5fcGlvX2JsYWNrbGlzdChpZC0+bW9kZWwpKSAhPSAtMSkgeworCWlmICgoZHJpdmUtPmh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfUElPX05PX0JMQUNLTElTVCkgPT0gMCkKKwkJcGlvX21vZGUgPSBpZGVfc2Nhbl9waW9fYmxhY2tsaXN0KChjaGFyICopJmlkW0FUQV9JRF9QUk9EXSk7CisKKwlpZiAocGlvX21vZGUgIT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGlzIG9uIFBJTyBibGFja2xpc3RcbiIsIGRyaXZlLT5uYW1lKTsKIAl9IGVsc2UgewotCQlwaW9fbW9kZSA9IGlkLT50UElPOworCQlwaW9fbW9kZSA9IGlkW0FUQV9JRF9PTERfUElPX01PREVTXSA+PiA4OwogCQlpZiAocGlvX21vZGUgPiAyKSB7CS8qIDIgaXMgbWF4aW11bSBhbGxvd2VkIHRQSU8gdmFsdWUgKi8KIAkJCXBpb19tb2RlID0gMjsKIAkJCW92ZXJyaWRkZW4gPSAxOwogCQl9Ci0JCWlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7CSAgLyogZHJpdmUgaW1wbGVtZW50cyBBVEEyPyAqLwotCQkJaWYgKGlkLT5jYXBhYmlsaXR5ICYgOCkgeyAvKiBJT1JEWSBzdXBwb3J0ZWQ/ICovCi0JCQkJaWYgKGlkLT5laWRlX3Bpb19tb2RlcyAmIDcpIHsKKworCQlpZiAoaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDIpIHsJICAgICAgLyogQVRBMj8gKi8KKwkJCWlmIChhdGFfaWRfaGFzX2lvcmR5KGlkKSkgeworCQkJCWlmIChpZFtBVEFfSURfUElPX01PREVTXSAmIDcpIHsKIAkJCQkJb3ZlcnJpZGRlbiA9IDA7Ci0JCQkJCWlmIChpZC0+ZWlkZV9waW9fbW9kZXMgJiA0KQorCQkJCQlpZiAoaWRbQVRBX0lEX1BJT19NT0RFU10gJiA0KQogCQkJCQkJcGlvX21vZGUgPSA1OwotCQkJCQllbHNlIGlmIChpZC0+ZWlkZV9waW9fbW9kZXMgJiAyKQorCQkJCQllbHNlIGlmIChpZFtBVEFfSURfUElPX01PREVTXSAmIDIpCiAJCQkJCQlwaW9fbW9kZSA9IDQ7CiAJCQkJCWVsc2UKIAkJCQkJCXBpb19tb2RlID0gMzsKQEAgLTMxNiw3ICszMTcsNyBAQAogewogCWlkZV90YXNrX3QgdGFzazsKIAlzdHJ1Y3QgaWRlX3Rhc2tmaWxlICp0ZiA9ICZ0YXNrLnRmOwotCWludCBsYmE0OCA9IChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKSA/IDEgOiAwOworCXU4IGxiYTQ4ID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCk7CiAKIAltZW1zZXQoJnRhc2ssIDAsIHNpemVvZih0YXNrKSk7CiAJaWYgKGxiYTQ4KQpAQCAtMzM4LDE2ICszMzksMTYgQEAKIHN0YXRpYyB2b2lkIGlkZV9kdW1wX2F0YV9lcnJvcihpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGVycikKIHsKIAlwcmludGsoInsgIik7Ci0JaWYgKGVyciAmIEFCUlRfRVJSKQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7Ci0JaWYgKGVyciAmIElDUkNfRVJSKQotCQlwcmludGsoKGVyciAmIEFCUlRfRVJSKSA/ICJCYWRDUkMgIiA6ICJCYWRTZWN0b3IgIik7Ci0JaWYgKGVyciAmIEVDQ19FUlIpCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOwotCWlmIChlcnIgJiBJRF9FUlIpCXByaW50aygiU2VjdG9ySWROb3RGb3VuZCAiKTsKLQlpZiAoZXJyICYgVFJLMF9FUlIpCXByaW50aygiVHJhY2taZXJvTm90Rm91bmQgIik7Ci0JaWYgKGVyciAmIE1BUktfRVJSKQlwcmludGsoIkFkZHJNYXJrTm90Rm91bmQgIik7CisJaWYgKGVyciAmIEFUQV9BQk9SVEVEKQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7CisJaWYgKGVyciAmIEFUQV9JQ1JDKQorCQlwcmludGsoKGVyciAmIEFUQV9BQk9SVEVEKSA/ICJCYWRDUkMgIiA6ICJCYWRTZWN0b3IgIik7CisJaWYgKGVyciAmIEFUQV9VTkMpCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOworCWlmIChlcnIgJiBBVEFfSURORikJcHJpbnRrKCJTZWN0b3JJZE5vdEZvdW5kICIpOworCWlmIChlcnIgJiBBVEFfVFJLME5GKQlwcmludGsoIlRyYWNrWmVyb05vdEZvdW5kICIpOworCWlmIChlcnIgJiBBVEFfQU1ORikJcHJpbnRrKCJBZGRyTWFya05vdEZvdW5kICIpOwogCXByaW50aygifSIpOwotCWlmICgoZXJyICYgKEJCRF9FUlIgfCBBQlJUX0VSUikpID09IEJCRF9FUlIgfHwKLQkgICAgKGVyciAmIChFQ0NfRVJSfElEX0VSUnxNQVJLX0VSUikpKSB7CisJaWYgKChlcnIgJiAoQVRBX0JCSyB8IEFUQV9BQk9SVEVEKSkgPT0gQVRBX0JCSyB8fAorCSAgICAoZXJyICYgKEFUQV9VTkMgfCBBVEFfSURORiB8IEFUQV9BTU5GKSkpIHsKIAkJaWRlX2R1bXBfc2VjdG9yKGRyaXZlKTsKIAkJaWYgKEhXR1JPVVAoZHJpdmUpICYmIEhXR1JPVVAoZHJpdmUpLT5ycSkKIAkJCXByaW50aygiLCBzZWN0b3I9JWxsdSIsCkBAIC0zNTksMTIgKzM2MCwxMiBAQAogc3RhdGljIHZvaWQgaWRlX2R1bXBfYXRhcGlfZXJyb3IoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBlcnIpCiB7CiAJcHJpbnRrKCJ7ICIpOwotCWlmIChlcnIgJiBJTElfRVJSKQlwcmludGsoIklsbGVnYWxMZW5ndGhJbmRpY2F0aW9uICIpOwotCWlmIChlcnIgJiBFT01fRVJSKQlwcmludGsoIkVuZE9mTWVkaWEgIik7Ci0JaWYgKGVyciAmIEFCUlRfRVJSKQlwcmludGsoIkFib3J0ZWRDb21tYW5kICIpOwotCWlmIChlcnIgJiBNQ1JfRVJSKQlwcmludGsoIk1lZGlhQ2hhbmdlUmVxdWVzdGVkICIpOwotCWlmIChlcnIgJiBMRlNfRVJSKQlwcmludGsoIkxhc3RGYWlsZWRTZW5zZT0weCUwMnggIiwKLQkJCQkgICAgICAgKGVyciAmIExGU19FUlIpID4+IDQpOworCWlmIChlcnIgJiBBVEFQSV9JTEkpCXByaW50aygiSWxsZWdhbExlbmd0aEluZGljYXRpb24gIik7CisJaWYgKGVyciAmIEFUQVBJX0VPTSkJcHJpbnRrKCJFbmRPZk1lZGlhICIpOworCWlmIChlcnIgJiBBVEFfQUJPUlRFRCkJcHJpbnRrKCJBYm9ydGVkQ29tbWFuZCAiKTsKKwlpZiAoZXJyICYgQVRBX01DUikJcHJpbnRrKCJNZWRpYUNoYW5nZVJlcXVlc3RlZCAiKTsKKwlpZiAoZXJyICYgQVRBUElfTEZTKQlwcmludGsoIkxhc3RGYWlsZWRTZW5zZT0weCUwMnggIiwKKwkJCQkgICAgICAgKGVyciAmIEFUQVBJX0xGUykgPj4gNCk7CiAJcHJpbnRrKCJ9XG4iKTsKIH0KIApAQCAtMzg2LDE5ICszODcsMTkgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlwcmludGsoIiVzOiAlczogc3RhdHVzPTB4JTAyeCB7ICIsIGRyaXZlLT5uYW1lLCBtc2csIHN0YXQpOwotCWlmIChzdGF0ICYgQlVTWV9TVEFUKQorCWlmIChzdGF0ICYgQVRBX0JVU1kpCiAJCXByaW50aygiQnVzeSAiKTsKIAllbHNlIHsKLQkJaWYgKHN0YXQgJiBSRUFEWV9TVEFUKQlwcmludGsoIkRyaXZlUmVhZHkgIik7Ci0JCWlmIChzdGF0ICYgV1JFUlJfU1RBVCkJcHJpbnRrKCJEZXZpY2VGYXVsdCAiKTsKLQkJaWYgKHN0YXQgJiBTRUVLX1NUQVQpCXByaW50aygiU2Vla0NvbXBsZXRlICIpOwotCQlpZiAoc3RhdCAmIERSUV9TVEFUKQlwcmludGsoIkRhdGFSZXF1ZXN0ICIpOwotCQlpZiAoc3RhdCAmIEVDQ19TVEFUKQlwcmludGsoIkNvcnJlY3RlZEVycm9yICIpOwotCQlpZiAoc3RhdCAmIElOREVYX1NUQVQpCXByaW50aygiSW5kZXggIik7Ci0JCWlmIChzdGF0ICYgRVJSX1NUQVQpCXByaW50aygiRXJyb3IgIik7CisJCWlmIChzdGF0ICYgQVRBX0RSRFkpCXByaW50aygiRHJpdmVSZWFkeSAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfREYpCXByaW50aygiRGV2aWNlRmF1bHQgIik7CisJCWlmIChzdGF0ICYgQVRBX0RTQykJcHJpbnRrKCJTZWVrQ29tcGxldGUgIik7CisJCWlmIChzdGF0ICYgQVRBX0RSUSkJcHJpbnRrKCJEYXRhUmVxdWVzdCAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfQ09SUikJcHJpbnRrKCJDb3JyZWN0ZWRFcnJvciAiKTsKKwkJaWYgKHN0YXQgJiBBVEFfSURYKQlwcmludGsoIkluZGV4ICIpOworCQlpZiAoc3RhdCAmIEFUQV9FUlIpCXByaW50aygiRXJyb3IgIik7CiAJfQogCXByaW50aygifVxuIik7Ci0JaWYgKChzdGF0ICYgKEJVU1lfU1RBVHxFUlJfU1RBVCkpID09IEVSUl9TVEFUKSB7CisJaWYgKChzdGF0ICYgKEFUQV9CVVNZIHwgQVRBX0VSUikpID09IEFUQV9FUlIpIHsKIAkJZXJyID0gaWRlX3JlYWRfZXJyb3IoZHJpdmUpOwogCQlwcmludGsoIiVzOiAlczogZXJyb3I9MHglMDJ4ICIsIGRyaXZlLT5uYW1lLCBtc2csIGVycik7CiAJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcGFyay5jIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2IwMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpAQCAtMCwwICsxLDEyMSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoaWRlX3Bhcmtfd3EpOworCitzdGF0aWMgdm9pZCBpc3N1ZV9wYXJrX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJjOworCisJdGltZW91dCArPSBqaWZmaWVzOworCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQpIHsKKwkJaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCQlpbnQgcmVzZXRfdGltZXI7CisKKwkJcmVzZXRfdGltZXIgPSB0aW1lX2JlZm9yZSh0aW1lb3V0LCBkcml2ZS0+c2xlZXApOworCQlkcml2ZS0+c2xlZXAgPSB0aW1lb3V0OworCQl3YWtlX3VwX2FsbCgmaWRlX3Bhcmtfd3EpOworCQlpZiAocmVzZXRfdGltZXIgJiYgaHdncm91cC0+c2xlZXBpbmcgJiYKKwkJICAgIGRlbF90aW1lcigmaHdncm91cC0+dGltZXIpKSB7CisJCQlod2dyb3VwLT5zbGVlcGluZyA9IDA7CisJCQlod2dyb3VwLT5idXN5ID0gMDsKKwkJCWJsa19zdGFydF9xdWV1ZWluZyhxKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKworCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFJFQUQsIF9fR0ZQX1dBSVQpOworCXJxLT5jbWRbMF0gPSBSRVFfUEFSS19IRUFEUzsKKwlycS0+Y21kX2xlbiA9IDE7CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKKwlycS0+c3BlY2lhbCA9ICZ0aW1lb3V0OworCXJjID0gYmxrX2V4ZWN1dGVfcnEocSwgTlVMTCwgcnEsIDEpOworCWJsa19wdXRfcmVxdWVzdChycSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgKnNvbWUqIGNvbW1hbmQgaXMgc2VudCB0byB0aGUgZHJpdmUgYWZ0ZXIgdGhlCisJICogdGltZW91dCBoYXMgZXhwaXJlZCwgc28gcG93ZXIgbWFuYWdlbWVudCB3aWxsIGJlIHJlZW5hYmxlZC4KKwkgKi8KKwlycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBHRlBfTk9XQUlUKTsKKwlpZiAodW5saWtlbHkoIXJxKSkKKwkJZ290byBvdXQ7CisKKwlycS0+Y21kWzBdID0gUkVRX1VOUEFSS19IRUFEUzsKKwlycS0+Y21kX2xlbiA9IDE7CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKKwllbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCwgMSk7CisKK291dDoKKwlyZXR1cm47Cit9CisKK3NzaXplX3QgaWRlX3Bhcmtfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICBjaGFyICpidWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCXVuc2lnbmVkIGludCBtc2VjczsKKworCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PX1VOTE9BRCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOworCW5vdyA9IGppZmZpZXM7CisJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEICYmCisJICAgIHRpbWVfYWZ0ZXIoZHJpdmUtPnNsZWVwLCBub3cpKQorCQltc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoZHJpdmUtPnNsZWVwIC0gbm93KTsKKwllbHNlCisJCW1zZWNzID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJXVcbiIsIG1zZWNzKTsKK30KKworc3NpemVfdCBpZGVfcGFya19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworI2RlZmluZSBNQVhfUEFSS19USU1FT1VUIDMwMDAwCisJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOworCWxvbmcgaW50IGlucHV0OworCWludCByYzsKKworCXJjID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmaW5wdXQpOworCWlmIChyYyB8fCBpbnB1dCA8IC0yKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5wdXQgPiBNQVhfUEFSS19USU1FT1VUKSB7CisJCWlucHV0ID0gTUFYX1BBUktfVElNRU9VVDsKKwkJcmMgPSAtRU9WRVJGTE9XOworCX0KKworCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7CisJaWYgKGlucHV0ID49IDApIHsKKwkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9fVU5MT0FEKQorCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZWxzZSBpZiAoaW5wdXQgfHwgZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QQVJLRUQpCisJCQlpc3N1ZV9wYXJrX2NtZChkcml2ZSwgbXNlY3NfdG9famlmZmllcyhpbnB1dCkpOworCX0gZWxzZSB7CisJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCQlzd2l0Y2ggKGlucHV0KSB7CisJCQljYXNlIC0xOgorCQkJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19OT19VTkxPQUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIC0yOgorCQkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX1VOTE9BRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZWxzZQorCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOworCisJcmV0dXJuIHJjID8gcmMgOiBsZW47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IDk5NGU0MTAuLjE5ZjhjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC01MCw1OSArNTAsNTQgQEAKICAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfaWQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWRyaXZlLT5pZC0+Y3lscyA9IGRyaXZlLT5jeWw7Ci0JZHJpdmUtPmlkLT5oZWFkcyA9IGRyaXZlLT5oZWFkOwotCWRyaXZlLT5pZC0+c2VjdG9ycyA9IGRyaXZlLT5zZWN0OwotCWRyaXZlLT5pZC0+Y3VyX2N5bHMgPSBkcml2ZS0+Y3lsOwotCWRyaXZlLT5pZC0+Y3VyX2hlYWRzID0gZHJpdmUtPmhlYWQ7Ci0JZHJpdmUtPmlkLT5jdXJfc2VjdG9ycyA9IGRyaXZlLT5zZWN0OworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisKKwlpZFtBVEFfSURfQ1VSX0NZTFNdCT0gaWRbQVRBX0lEX0NZTFNdCT0gZHJpdmUtPmN5bDsKKwlpZFtBVEFfSURfQ1VSX0hFQURTXQk9IGlkW0FUQV9JRF9IRUFEU10JPSBkcml2ZS0+aGVhZDsKKwlpZFtBVEFfSURfQ1VSX1NFQ1RPUlNdCT0gaWRbQVRBX0lEX1NFQ1RPUlNdCT0gZHJpdmUtPnNlY3Q7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV9kaXNrX2luaXRfY2hzKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAogCS8qIEV4dHJhY3QgZ2VvbWV0cnkgaWYgd2UgZGlkIG5vdCBhbHJlYWR5IGhhdmUgb25lIGZvciB0aGUgZHJpdmUgKi8KIAlpZiAoIWRyaXZlLT5jeWwgfHwgIWRyaXZlLT5oZWFkIHx8ICFkcml2ZS0+c2VjdCkgewotCQlkcml2ZS0+Y3lsICA9IGRyaXZlLT5iaW9zX2N5bCAgPSBpZC0+Y3lsczsKLQkJZHJpdmUtPmhlYWQgPSBkcml2ZS0+Ymlvc19oZWFkID0gaWQtPmhlYWRzOwotCQlkcml2ZS0+c2VjdCA9IGRyaXZlLT5iaW9zX3NlY3QgPSBpZC0+c2VjdG9yczsKKwkJZHJpdmUtPmN5bCAgPSBkcml2ZS0+Ymlvc19jeWwgID0gaWRbQVRBX0lEX0NZTFNdOworCQlkcml2ZS0+aGVhZCA9IGRyaXZlLT5iaW9zX2hlYWQgPSBpZFtBVEFfSURfSEVBRFNdOworCQlkcml2ZS0+c2VjdCA9IGRyaXZlLT5iaW9zX3NlY3QgPSBpZFtBVEFfSURfU0VDVE9SU107CiAJfQogCiAJLyogSGFuZGxlIGxvZ2ljYWwgZ2VvbWV0cnkgdHJhbnNsYXRpb24gYnkgdGhlIGRyaXZlICovCi0JaWYgKChpZC0+ZmllbGRfdmFsaWQgJiAxKSAmJiBpZC0+Y3VyX2N5bHMgJiYKLQkgICAgaWQtPmN1cl9oZWFkcyAmJiAoaWQtPmN1cl9oZWFkcyA8PSAxNikgJiYgaWQtPmN1cl9zZWN0b3JzKSB7Ci0JCWRyaXZlLT5jeWwgID0gaWQtPmN1cl9jeWxzOwotCQlkcml2ZS0+aGVhZCA9IGlkLT5jdXJfaGVhZHM7Ci0JCWRyaXZlLT5zZWN0ID0gaWQtPmN1cl9zZWN0b3JzOworCWlmIChhdGFfaWRfY3VycmVudF9jaHNfdmFsaWQoaWQpKSB7CisJCWRyaXZlLT5jeWwgID0gaWRbQVRBX0lEX0NVUl9DWUxTXTsKKwkJZHJpdmUtPmhlYWQgPSBpZFtBVEFfSURfQ1VSX0hFQURTXTsKKwkJZHJpdmUtPnNlY3QgPSBpZFtBVEFfSURfQ1VSX1NFQ1RPUlNdOwogCX0KIAogCS8qIFVzZSBwaHlzaWNhbCBnZW9tZXRyeSBpZiB3aGF0IHdlIGhhdmUgc3RpbGwgbWFrZXMgbm8gc2Vuc2UgKi8KLQlpZiAoZHJpdmUtPmhlYWQgPiAxNiAmJiBpZC0+aGVhZHMgJiYgaWQtPmhlYWRzIDw9IDE2KSB7Ci0JCWRyaXZlLT5jeWwgID0gaWQtPmN5bHM7Ci0JCWRyaXZlLT5oZWFkID0gaWQtPmhlYWRzOwotCQlkcml2ZS0+c2VjdCA9IGlkLT5zZWN0b3JzOworCWlmIChkcml2ZS0+aGVhZCA+IDE2ICYmIGlkW0FUQV9JRF9IRUFEU10gJiYgaWRbQVRBX0lEX0hFQURTXSA8PSAxNikgeworCQlkcml2ZS0+Y3lsICA9IGlkW0FUQV9JRF9DWUxTXTsKKwkJZHJpdmUtPmhlYWQgPSBpZFtBVEFfSURfSEVBRFNdOworCQlkcml2ZS0+c2VjdCA9IGlkW0FUQV9JRF9TRUNUT1JTXTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV9kaXNrX2luaXRfbXVsdF9jb3VudChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisJdTggbWF4X211bHRzZWN0ID0gaWRbQVRBX0lEX01BWF9NVUxUU0VDVF0gJiAweGZmOwogCi0JZHJpdmUtPm11bHRfY291bnQgPSAwOwotCWlmIChpZC0+bWF4X211bHRzZWN0KSB7Ci0jaWZkZWYgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERQotCQlpZC0+bXVsdHNlY3QgPSAoKGlkLT5tYXhfbXVsdHNlY3QvMikgPiAxKSA/IGlkLT5tYXhfbXVsdHNlY3QgOiAwOwotCQlpZC0+bXVsdHNlY3RfdmFsaWQgPSBpZC0+bXVsdHNlY3QgPyAxIDogMDsKLQkJZHJpdmUtPm11bHRfcmVxID0gaWQtPm11bHRzZWN0X3ZhbGlkID8gaWQtPm1heF9tdWx0c2VjdCA6IDA7Ci0JCWRyaXZlLT5zcGVjaWFsLmIuc2V0X211bHRtb2RlID0gZHJpdmUtPm11bHRfcmVxID8gMSA6IDA7Ci0jZWxzZQkvKiBvcmlnaW5hbCwgcHJlIElERS1ORkcsIHBlciByZXF1ZXN0IG9mIEFDICovCi0JCWRyaXZlLT5tdWx0X3JlcSA9IDA7Ci0JCWlmIChkcml2ZS0+bXVsdF9yZXEgPiBpZC0+bWF4X211bHRzZWN0KQotCQkJZHJpdmUtPm11bHRfcmVxID0gaWQtPm1heF9tdWx0c2VjdDsKLQkJaWYgKGRyaXZlLT5tdWx0X3JlcSB8fCAoKGlkLT5tdWx0c2VjdF92YWxpZCAmIDEpICYmIGlkLT5tdWx0c2VjdCkpCisJaWYgKG1heF9tdWx0c2VjdCkgeworCQlpZiAoKG1heF9tdWx0c2VjdCAvIDIpID4gMSkKKwkJCWlkW0FUQV9JRF9NVUxUU0VDVF0gPSBtYXhfbXVsdHNlY3QgfCAweDEwMDsKKwkJZWxzZQorCQkJaWRbQVRBX0lEX01VTFRTRUNUXSAmPSB+MHgxZmY7CisKKwkJZHJpdmUtPm11bHRfcmVxID0gaWRbQVRBX0lEX01VTFRTRUNUXSAmIDB4ZmY7CisKKwkJaWYgKGRyaXZlLT5tdWx0X3JlcSkKIAkJCWRyaXZlLT5zcGVjaWFsLmIuc2V0X211bHRtb2RlID0gMTsKLSNlbmRpZgogCX0KIH0KIApAQCAtMTE5LDE0ICsxMTQsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwotCWludCBic3dhcCA9IDE7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkOworCXUxNiAqaWQgPSBkcml2ZS0+aWQ7CisJY2hhciAqbSA9IChjaGFyICopJmlkW0FUQV9JRF9QUk9EXTsKKwlpbnQgYnN3YXAgPSAxLCBpc19jZmE7CiAKLQlpZCA9IGRyaXZlLT5pZDsKIAkvKiByZWFkIDUxMiBieXRlcyBvZiBpZCBpbmZvICovCiAJaHdpZi0+dHBfb3BzLT5pbnB1dF9kYXRhKGRyaXZlLCBOVUxMLCBpZCwgU0VDVE9SX1NJWkUpOwogCi0JZHJpdmUtPmlkX3JlYWQgPSAxOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0lEX1JFQUQ7CisKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAjaWZkZWYgREVCVUcKIAlwcmludGsoS0VSTl9JTkZPICIlczogZHVtcGluZyBpZGVudGlmeSBkYXRhXG4iLCBkcml2ZS0+bmFtZSk7CkBAIC0xMzUsNTkgKzEzMSw1OSBAQAogCWlkZV9maXhfZHJpdmVpZChpZCk7CiAKIAkvKgotCSAqICBXSU5fSURFTlRJRlkgcmV0dXJucyBsaXR0bGUtZW5kaWFuIGluZm8sCi0JICogIFdJTl9QSURFTlRJRlkgKnVzdWFsbHkqIHJldHVybnMgbGl0dGxlLWVuZGlhbiBpbmZvLgorCSAqICBBVEFfQ01EX0lEX0FUQSByZXR1cm5zIGxpdHRsZS1lbmRpYW4gaW5mbywKKwkgKiAgQVRBX0NNRF9JRF9BVEFQSSAqdXN1YWxseSogcmV0dXJucyBsaXR0bGUtZW5kaWFuIGluZm8uCiAJICovCi0JaWYgKGNtZCA9PSBXSU5fUElERU5USUZZKSB7Ci0JCWlmICgoaWQtPm1vZGVsWzBdID09ICdOJyAmJiBpZC0+bW9kZWxbMV0gPT0gJ0UnKSAvKiBORUMgKi8KLQkJIHx8IChpZC0+bW9kZWxbMF0gPT0gJ0YnICYmIGlkLT5tb2RlbFsxXSA9PSAnWCcpIC8qIE1pdHN1bWkgKi8KLQkJIHx8IChpZC0+bW9kZWxbMF0gPT0gJ1AnICYmIGlkLT5tb2RlbFsxXSA9PSAnaScpKS8qIFBpb25lZXIgKi8KKwlpZiAoY21kID09IEFUQV9DTURfSURfQVRBUEkpIHsKKwkJaWYgKChtWzBdID09ICdOJyAmJiBtWzFdID09ICdFJykgfHwgIC8qIE5FQyAqLworCQkgICAgKG1bMF0gPT0gJ0YnICYmIG1bMV0gPT0gJ1gnKSB8fCAgLyogTWl0c3VtaSAqLworCQkgICAgKG1bMF0gPT0gJ1AnICYmIG1bMV0gPT0gJ2knKSkgICAgLyogUGlvbmVlciAqLwogCQkJLyogVmVydG9zIGRyaXZlcyBtYXkgc3RpbGwgYmUgd2VpcmQgKi8KLQkJCWJzd2FwIF49IDE7CQorCQkJYnN3YXAgXj0gMTsKIAl9Ci0JaWRlX2ZpeHN0cmluZyhpZC0+bW9kZWwsICAgICBzaXplb2YoaWQtPm1vZGVsKSwgICAgIGJzd2FwKTsKLQlpZGVfZml4c3RyaW5nKGlkLT5md19yZXYsICAgIHNpemVvZihpZC0+ZndfcmV2KSwgICAgYnN3YXApOwotCWlkZV9maXhzdHJpbmcoaWQtPnNlcmlhbF9ubywgc2l6ZW9mKGlkLT5zZXJpYWxfbm8pLCBic3dhcCk7CisKKwlpZGVfZml4c3RyaW5nKG0sIEFUQV9JRF9QUk9EX0xFTiwgYnN3YXApOworCWlkZV9maXhzdHJpbmcoKGNoYXIgKikmaWRbQVRBX0lEX0ZXX1JFVl0sIEFUQV9JRF9GV19SRVZfTEVOLCBic3dhcCk7CisJaWRlX2ZpeHN0cmluZygoY2hhciAqKSZpZFtBVEFfSURfU0VSTk9dLCBBVEFfSURfU0VSTk9fTEVOLCBic3dhcCk7CiAKIAkvKiB3ZSBkZXBlbmQgb24gdGhpcyBhIGxvdCEgKi8KLQlpZC0+bW9kZWxbc2l6ZW9mKGlkLT5tb2RlbCktMV0gPSAnXDAnOworCW1bQVRBX0lEX1BST0RfTEVOIC0gMV0gPSAnXDAnOwogCi0JaWYgKHN0cnN0cihpZC0+bW9kZWwsICJFIFggQSBCIFkgVCBFIE4gRSBTIFQiKSkKKwlpZiAoc3Ryc3RyKG0sICJFIFggQSBCIFkgVCBFIE4gRSBTIFQiKSkKIAkJZ290byBlcnJfbWlzYzsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcywgIiwgZHJpdmUtPm5hbWUsIGlkLT5tb2RlbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzLCAiLCBkcml2ZS0+bmFtZSwgbSk7CiAKLQlkcml2ZS0+cHJlc2VudCA9IDE7Ci0JZHJpdmUtPmRlYWQgPSAwOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1BSRVNFTlQ7CisJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RFQUQ7CiAKIAkvKgogCSAqIENoZWNrIGZvciBhbiBBVEFQSSBkZXZpY2UKIAkgKi8KLQlpZiAoY21kID09IFdJTl9QSURFTlRJRlkpIHsKLQkJdTggdHlwZSA9IChpZC0+Y29uZmlnID4+IDgpICYgMHgxZjsKKwlpZiAoY21kID09IEFUQV9DTURfSURfQVRBUEkpIHsKKwkJdTggdHlwZSA9IChpZFtBVEFfSURfQ09ORklHXSA+PiA4KSAmIDB4MWY7CiAKIAkJcHJpbnRrKEtFUk5fQ09OVCAiQVRBUEkgIik7CiAJCXN3aXRjaCAodHlwZSkgewogCQkJY2FzZSBpZGVfZmxvcHB5OgotCQkJCWlmICghc3Ryc3RyKGlkLT5tb2RlbCwgIkNELVJPTSIpKSB7Ci0JCQkJCWlmICghc3Ryc3RyKGlkLT5tb2RlbCwgIm9wcHkiKSAmJgotCQkJCQkgICAgIXN0cnN0cihpZC0+bW9kZWwsICJwb3lwIikgJiYKLQkJCQkJICAgICFzdHJzdHIoaWQtPm1vZGVsLCAiWklQIikpCisJCQkJaWYgKCFzdHJzdHIobSwgIkNELVJPTSIpKSB7CisJCQkJCWlmICghc3Ryc3RyKG0sICJvcHB5IikgJiYKKwkJCQkJICAgICFzdHJzdHIobSwgInBveXAiKSAmJgorCQkJCQkgICAgIXN0cnN0cihtLCAiWklQIikpCiAJCQkJCQlwcmludGsoS0VSTl9DT05UICJjZHJvbSBvciBmbG9wcHk/LCBhc3N1bWluZyAiKTsKIAkJCQkJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfY2Ryb20pIHsKIAkJCQkJCXByaW50ayhLRVJOX0NPTlQgIkZMT1BQWSIpOwotCQkJCQkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisJCQkJCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19SRU1PVkFCTEU7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0KIAkJCQkvKiBFYXJseSBjZHJvbSBtb2RlbHMgdXNlZCB6ZXJvICovCiAJCQkJdHlwZSA9IGlkZV9jZHJvbTsKIAkJCWNhc2UgaWRlX2Nkcm9tOgotCQkJCWRyaXZlLT5yZW1vdmFibGUgPSAxOworCQkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1JFTU9WQUJMRTsKICNpZmRlZiBDT05GSUdfUFBDCiAJCQkJLyoga2x1ZGdlIGZvciBBcHBsZSBQb3dlckJvb2sgaW50ZXJuYWwgemlwICovCi0JCQkJaWYgKCFzdHJzdHIoaWQtPm1vZGVsLCAiQ0QtUk9NIikgJiYKLQkJCQkgICAgc3Ryc3RyKGlkLT5tb2RlbCwgIlpJUCIpKSB7CisJCQkJaWYgKCFzdHJzdHIobSwgIkNELVJPTSIpICYmIHN0cnN0cihtLCAiWklQIikpIHsKIAkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiRkxPUFBZIik7CiAJCQkJCXR5cGUgPSBpZGVfZmxvcHB5OwogCQkJCQlicmVhazsKQEAgLTIwMCw3ICsxOTYsNyBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBpZGVfb3B0aWNhbDoKIAkJCQlwcmludGsoS0VSTl9DT05UICJPUFRJQ0FMIik7Ci0JCQkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisJCQkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfUkVNT1ZBQkxFOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlwcmludGsoS0VSTl9DT05UICJVTktOT1dOICh0eXBlICVkKSIsIHR5cGUpOwpAQCAtMjEwLDYgKzIwNiwxMCBAQAogCQlkcml2ZS0+bWVkaWEgPSB0eXBlOwogCQkvKiBhbiBBVEFQSSBkZXZpY2UgaWdub3JlcyBEUkRZICovCiAJCWRyaXZlLT5yZWFkeV9zdGF0ID0gMDsKKwkJaWYgKGF0YV9pZF9jZGJfaW50cihpZCkpCisJCQlkcml2ZS0+YXRhcGlfZmxhZ3MgfD0gSURFX0FGTEFHX0RSUV9JTlRFUlJVUFQ7CisJCS8qIHdlIGRvbid0IGRvIGhlYWQgdW5sb2FkaW5nIG9uIEFUQVBJIGRldmljZXMgKi8KKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTk9fVU5MT0FEOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMTcsMjQgKzIxNywyNCBAQAogCSAqIE5vdCBhbiBBVEFQSSBkZXZpY2U6IGxvb2tzIGxpa2UgYSAicmVndWxhciIgaGFyZCBkaXNrCiAJICovCiAKLQkvKgotCSAqIDB4ODQ4YSA9IENvbXBhY3RGbGFzaCBkZXZpY2UKLQkgKiBUaGVzZSBhcmUgKm5vdCogcmVtb3ZhYmxlIGluIExpbnV4IGRlZmluaXRpb24gb2YgdGhlIHRlcm0KLQkgKi8KKwlpc19jZmEgPSBhdGFfaWRfaXNfY2ZhKGlkKTsKIAotCWlmICgoaWQtPmNvbmZpZyAhPSAweDg0OGEpICYmIChpZC0+Y29uZmlnICYgKDE8PDcpKSkKLQkJZHJpdmUtPnJlbW92YWJsZSA9IDE7CisJLyogQ0YgZGV2aWNlcyBhcmUgKm5vdCogcmVtb3ZhYmxlIGluIExpbnV4IGRlZmluaXRpb24gb2YgdGhlIHRlcm0gKi8KKwlpZiAoaXNfY2ZhID09IDAgJiYgKGlkW0FUQV9JRF9DT05GSUddICYgKDEgPDwgNykpKQorCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19SRU1PVkFCTEU7CiAKIAlkcml2ZS0+bWVkaWEgPSBpZGVfZGlzazsKIAotCXByaW50ayhLRVJOX0NPTlQgIiVzIERJU0sgZHJpdmVcbiIsCi0JCShpZC0+Y29uZmlnID09IDB4ODQ4YSkgPyAiQ0ZBIiA6ICJBVEEiKTsKKwlpZiAoIWF0YV9pZF9oYXNfdW5sb2FkKGRyaXZlLT5pZCkpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX1VOTE9BRDsKKworCXByaW50ayhLRVJOX0NPTlQgIiVzIERJU0sgZHJpdmVcbiIsIGlzX2NmYSA/ICJDRkEiIDogIkFUQSIpOwogCiAJcmV0dXJuOwogCiBlcnJfbWlzYzoKIAlrZnJlZShpZCk7Ci0JZHJpdmUtPnByZXNlbnQgPSAwOworCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19QUkVTRU5UOwogCXJldHVybjsKIH0KIApAQCAtMjY4LDcgKzI2OCw3IEBACiAJaWYgKGlvX3BvcnRzLT5jdGxfYWRkcikgewogCQlhID0gdHBfb3BzLT5yZWFkX2FsdHN0YXR1cyhod2lmKTsKIAkJcyA9IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0JCWlmICgoYSBeIHMpICYgfklOREVYX1NUQVQpCisJCWlmICgoYSBeIHMpICYgfkFUQV9JRFgpCiAJCQkvKiBhbmNpZW50IFNlYWdhdGUgZHJpdmVzLCBicm9rZW4gaW50ZXJmYWNlcyAqLwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb2Jpbmcgd2l0aCBTVEFUVVMoMHglMDJ4KSAiCiAJCQkJCSAiaW5zdGVhZCBvZiBBTFRTVEFUVVMoMHglMDJ4KVxuIiwKQEAgLTI4MSw3ICsyODEsNyBAQAogCS8qIHNldCBmZWF0dXJlcyByZWdpc3RlciBmb3IgYXRhcGkKIAkgKiBpZGVudGlmeSBjb21tYW5kIHRvIGJlIHN1cmUgb2YgcmVwbHkKIAkgKi8KLQlpZiAoY21kID09IFdJTl9QSURFTlRJRlkpIHsKKwlpZiAoY21kID09IEFUQV9DTURfSURfQVRBUEkpIHsKIAkJaWRlX3Rhc2tfdCB0YXNrOwogCiAJCW1lbXNldCgmdGFzaywgMCwgc2l6ZW9mKHRhc2spKTsKQEAgLTI5NCwyNCArMjk0LDE2IEBACiAJLyogYXNrIGRyaXZlIGZvciBJRCAqLwogCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIGNtZCk7CiAKLQl0aW1lb3V0ID0gKChjbWQgPT0gV0lOX0lERU5USUZZKSA/IFdBSVRfV09SU1RDQVNFIDogV0FJVF9QSURFTlRJRlkpIC8gMjsKLQl0aW1lb3V0ICs9IGppZmZpZXM7Ci0JZG8gewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJLyogZHJpdmUgdGltZWQtb3V0ICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQkvKiBnaXZlIGRyaXZlIGEgYnJlYXRoZXIgKi8KLQkJbXNsZWVwKDUwKTsKLQkJcyA9IHVzZV9hbHRzdGF0dXMgPyB0cF9vcHMtPnJlYWRfYWx0c3RhdHVzKGh3aWYpCi0JCQkJICA6IHRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0JfSB3aGlsZSAocyAmIEJVU1lfU1RBVCk7CisJdGltZW91dCA9ICgoY21kID09IEFUQV9DTURfSURfQVRBKSA/IFdBSVRfV09SU1RDQVNFIDogV0FJVF9QSURFTlRJRlkpIC8gMjsKIAotCS8qIHdhaXQgZm9yIElSUSBhbmQgRFJRX1NUQVQgKi8KKwlpZiAoaWRlX2J1c3lfc2xlZXAoaHdpZiwgdGltZW91dCwgdXNlX2FsdHN0YXR1cykpCisJCXJldHVybiAxOworCisJLyogd2FpdCBmb3IgSVJRIGFuZCBBVEFfRFJRICovCiAJbXNsZWVwKDUwKTsKIAlzID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmIChPS19TVEFUKHMsIERSUV9TVEFULCBCQURfUl9TVEFUKSkgeworCWlmIChPS19TVEFUKHMsIEFUQV9EUlEsIEJBRF9SX1NUQVQpKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJLyogbG9jYWwgQ1BVIG9ubHk7IHNvbWUgc3lzdGVtcyBuZWVkIHRoaXMgKi8KQEAgLTM4NywxOSArMzc5LDIxIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBpZGVfYnVzeV9zbGVlcChpZGVfaHdpZl90ICpod2lmKQoraW50IGlkZV9idXN5X3NsZWVwKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgdGltZW91dCwgaW50IGFsdHN0YXR1cykKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CiAJdTggc3RhdDsKIAorCXRpbWVvdXQgKz0gamlmZmllczsKKwogCWRvIHsKLQkJbXNsZWVwKDUwKTsKLQkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0JCWlmICgoc3RhdCAmIEJVU1lfU1RBVCkgPT0gMCkKKwkJbXNsZWVwKDUwKTsJLyogZ2l2ZSBkcml2ZSBhIGJyZWF0aGVyICovCisJCXN0YXQgPSBhbHRzdGF0dXMgPyBod2lmLT50cF9vcHMtPnJlYWRfYWx0c3RhdHVzKGh3aWYpCisJCQkJIDogaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKKwkJaWYgKChzdGF0ICYgQVRBX0JVU1kpID09IDApCiAJCQlyZXR1cm4gMDsKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMTsJLyogZHJpdmUgdGltZWQtb3V0ICovCiB9CiAKIHN0YXRpYyB1OCBpZGVfcmVhZF9kZXZpY2UoaWRlX2RyaXZlX3QgKmRyaXZlKQpAQCAtNDQwLDE3ICs0MzQsMTYgQEAKIAlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAlpbnQgcmM7Ci0JdTggc3RhdDsKKwl1OCBwcmVzZW50ID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSwgc3RhdDsKIAotCWlmIChkcml2ZS0+cHJlc2VudCkgewotCQkvKiBhdm9pZCB3YWl0aW5nIGZvciBpbmFwcHJvcHJpYXRlIHByb2JlcyAqLwotCQlpZiAoKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykgJiYgKGNtZCA9PSBXSU5fSURFTlRJRlkpKQotCQkJcmV0dXJuIDQ7Ci0JfQorCS8qIGF2b2lkIHdhaXRpbmcgZm9yIGluYXBwcm9wcmlhdGUgcHJvYmVzICovCisJaWYgKHByZXNlbnQgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrICYmIGNtZCA9PSBBVEFfQ01EX0lEX0FUQSkKKwkJcmV0dXJuIDQ7CisKICNpZmRlZiBERUJVRwogCXByaW50ayhLRVJOX0lORk8gInByb2JpbmcgZm9yICVzOiBwcmVzZW50PSVkLCBtZWRpYT0lZCwgcHJvYmV0eXBlPSVzXG4iLAotCQlkcml2ZS0+bmFtZSwgZHJpdmUtPnByZXNlbnQsIGRyaXZlLT5tZWRpYSwKLQkJKGNtZCA9PSBXSU5fSURFTlRJRlkpID8gIkFUQSIgOiAiQVRBUEkiKTsKKwkJZHJpdmUtPm5hbWUsIHByZXNlbnQsIGRyaXZlLT5tZWRpYSwKKwkJKGNtZCA9PSBBVEFfQ01EX0lEX0FUQSkgPyAiQVRBIiA6ICJBVEFQSSIpOwogI2VuZGlmCiAKIAkvKiBuZWVkZWQgZm9yIHNvbWUgc3lzdGVtcwpAQCAtNDYwLDExICs0NTMsMTEgQEAKIAlTRUxFQ1RfRFJJVkUoZHJpdmUpOwogCW1zbGVlcCg1MCk7CiAKLQlpZiAoaWRlX3JlYWRfZGV2aWNlKGRyaXZlKSAhPSBkcml2ZS0+c2VsZWN0LmFsbCAmJiAhZHJpdmUtPnByZXNlbnQpIHsKLQkJaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0ICE9IDApIHsKKwlpZiAoaWRlX3JlYWRfZGV2aWNlKGRyaXZlKSAhPSBkcml2ZS0+c2VsZWN0ICYmIHByZXNlbnQgPT0gMCkgeworCQlpZiAoZHJpdmUtPmRuICYgMSkgewogCQkJLyogZXhpdCB3aXRoIGRyaXZlMCBzZWxlY3RlZCAqLwogCQkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOwotCQkJLyogYWxsb3cgQlVTWV9TVEFUIHRvIGFzc2VydCAmIGNsZWFyICovCisJCQkvKiBhbGxvdyBBVEFfQlVTWSB0byBhc3NlcnQgJiBjbGVhciAqLwogCQkJbXNsZWVwKDUwKTsKIAkJfQogCQkvKiBubyBpL2YgcHJlc2VudDogbW1tLi4gdGhpcyBzaG91bGQgYmUgYSA0IC1tbCAqLwpAQCAtNDczLDggKzQ2Niw4IEBACiAKIAlzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmIChPS19TVEFUKHN0YXQsIFJFQURZX1NUQVQsIEJVU1lfU1RBVCkgfHwKLQkgICAgZHJpdmUtPnByZXNlbnQgfHwgY21kID09IFdJTl9QSURFTlRJRlkpIHsKKwlpZiAoT0tfU1RBVChzdGF0LCBBVEFfRFJEWSwgQVRBX0JVU1kpIHx8CisJICAgIHByZXNlbnQgfHwgY21kID09IEFUQV9DTURfSURfQVRBUEkpIHsKIAkJLyogc2VuZCBjbWQgYW5kIHdhaXQgKi8KIAkJaWYgKChyYyA9IHRyeV90b19pZGVudGlmeShkcml2ZSwgY21kKSkpIHsKIAkJCS8qIGZhaWxlZDogdHJ5IGFnYWluICovCkBAIC00ODMsMTcgKzQ3NiwxNyBAQAogCiAJCXN0YXQgPSB0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCi0JCWlmIChzdGF0ID09IChCVVNZX1NUQVQgfCBSRUFEWV9TVEFUKSkKKwkJaWYgKHN0YXQgPT0gKEFUQV9CVVNZIHwgQVRBX0RSRFkpKQogCQkJcmV0dXJuIDQ7CiAKLQkJaWYgKHJjID09IDEgJiYgY21kID09IFdJTl9QSURFTlRJRlkpIHsKKwkJaWYgKHJjID09IDEgJiYgY21kID09IEFUQV9DTURfSURfQVRBUEkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIHJlc3BvbnNlIChzdGF0dXMgPSAweCUwMngpLCAiCiAJCQkJCSJyZXNldHRpbmcgZHJpdmVcbiIsIGRyaXZlLT5uYW1lLCBzdGF0KTsKIAkJCW1zbGVlcCg1MCk7CiAJCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOwogCQkJbXNsZWVwKDUwKTsKLQkJCXRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIFdJTl9TUlNUKTsKLQkJCSh2b2lkKWlkZV9idXN5X3NsZWVwKGh3aWYpOworCQkJdHBfb3BzLT5leGVjX2NvbW1hbmQoaHdpZiwgQVRBX0NNRF9ERVZfUkVTRVQpOworCQkJKHZvaWQpaWRlX2J1c3lfc2xlZXAoaHdpZiwgV0FJVF9XT1JTVENBU0UsIDApOwogCQkJcmMgPSB0cnlfdG9faWRlbnRpZnkoZHJpdmUsIGNtZCk7CiAJCX0KIApAQCAtNTA3LDcgKzUwMCw3IEBACiAJCS8qIG5vdCBwcmVzZW50IG9yIG1heWJlIEFUQVBJICovCiAJCXJjID0gMzsKIAl9Ci0JaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0ICE9IDApIHsKKwlpZiAoZHJpdmUtPmRuICYgMSkgewogCQkvKiBleGl0IHdpdGggZHJpdmUwIHNlbGVjdGVkICovCiAJCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKIAkJbXNsZWVwKDUwKTsKQEAgLTUyNiwxMyArNTE5LDE0IEBACiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAl1OCBzdGF0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGVuYWJsaW5nICVzIC0tICIsIGh3aWYtPm5hbWUsIGRyaXZlLT5pZC0+bW9kZWwpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGluZyAlcyAtLSAiLAorCQlod2lmLT5uYW1lLCAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdKTsKIAogCVNFTEVDVF9EUklWRShkcml2ZSk7CiAJbXNsZWVwKDUwKTsKLQl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBFWEFCWVRFX0VOQUJMRV9ORVNUKTsKKwl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfRVhBQllURV9FTkFCTEVfTkVTVCk7CiAKLQlpZiAoaWRlX2J1c3lfc2xlZXAoaHdpZikpIHsKKwlpZiAoaWRlX2J1c3lfc2xlZXAoaHdpZiwgV0FJVF9XT1JTVENBU0UsIDApKSB7CiAJCXByaW50ayhLRVJOX0NPTlQgImZhaWxlZCAodGltZW91dClcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtNTQ1LDEyICs1MzksNiBAQAogCQlwcmludGsoS0VSTl9DT05UICJmYWlsZWQgKHN0YXR1cyA9IDB4JTAyeClcbiIsIHN0YXQpOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fQ09OVCAic3VjY2Vzc1xuIik7Ci0KLQkvKiBpZiAhKHN1Y2Nlc3N8fHRpbWVkLW91dCkgKi8KLQlpZiAoZG9fcHJvYmUoZHJpdmUsIFdJTl9JREVOVElGWSkgPj0gMikgewotCQkvKiBsb29rIGZvciBBVEFQSSBkZXZpY2UgKi8KLQkJKHZvaWQpIGRvX3Byb2JlKGRyaXZlLCBXSU5fUElERU5USUZZKTsKLQl9CiB9CiAKIC8qKgpAQCAtNTYxLDEyICs1NDksMTQgQEAKICAqCWFuZCBwcmVzZW50cyB0aGluZ3MgdG8gdGhlIHVzZXIgYXMgbmVlZGVkLgogICoKICAqCVJldHVybnM6CTAgIG5vIGRldmljZSB3YXMgZm91bmQKLSAqCQkJMSAgZGV2aWNlIHdhcyBmb3VuZCAobm90ZTogZHJpdmUtPnByZXNlbnQgbWlnaHQKLSAqCQkJICAgc3RpbGwgYmUgMCkKKyAqCQkJMSAgZGV2aWNlIHdhcyBmb3VuZAorICoJCQkgICAobm90ZTogSURFX0RGTEFHX1BSRVNFTlQgbWlnaHQgc3RpbGwgYmUgbm90IHNldCkKICAqLwogIAogc3RhdGljIGlubGluZSB1OCBwcm9iZV9mb3JfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKKwljaGFyICptOworCiAJLyoKIAkgKglJbiBvcmRlciB0byBrZWVwIHRoaW5ncyBzaW1wbGUgd2UgaGF2ZSBhbiBpZAogCSAqCWJsb2NrIGZvciBhbGwgZHJpdmVzIGF0IGFsbCB0aW1lcy4gSWYgdGhlIGRldmljZQpAQCAtNTc2LDMxICs1NjYsMzYgQEAKIAkgKglBbHNvIG5vdGUgdGhhdCAwIGV2ZXJ5d2hlcmUgbWVhbnMgImNhbid0IGRvIFgiCiAJICovCiAgCi0JZHJpdmUtPmlkID0ga3phbGxvYyhTRUNUT1JfV09SRFMgKjQsIEdGUF9LRVJORUwpOwotCWRyaXZlLT5pZF9yZWFkID0gMDsKLQlpZihkcml2ZS0+aWQgPT0gTlVMTCkKLQl7CisJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0lEX1JFQUQ7CisKKwlkcml2ZS0+aWQgPSBremFsbG9jKFNFQ1RPUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHJpdmUtPmlkID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGU6IG91dCBvZiBtZW1vcnkgZm9yIGlkIGRhdGEuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCXN0cmNweShkcml2ZS0+aWQtPm1vZGVsLCAiVU5LTk9XTiIpOwotCQorCisJbSA9IChjaGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF07CisJc3RyY3B5KG0sICJVTktOT1dOIik7CisKIAkvKiBza2lwIHByb2Jpbmc/ICovCi0JaWYgKCFkcml2ZS0+bm9wcm9iZSkKLQl7CisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpID09IDApIHsKK3JldHJ5OgogCQkvKiBpZiAhKHN1Y2Nlc3N8fHRpbWVkLW91dCkgKi8KLQkJaWYgKGRvX3Byb2JlKGRyaXZlLCBXSU5fSURFTlRJRlkpID49IDIpIHsKKwkJaWYgKGRvX3Byb2JlKGRyaXZlLCBBVEFfQ01EX0lEX0FUQSkgPj0gMikKIAkJCS8qIGxvb2sgZm9yIEFUQVBJIGRldmljZSAqLwotCQkJKHZvaWQpIGRvX3Byb2JlKGRyaXZlLCBXSU5fUElERU5USUZZKTsKLQkJfQotCQlpZiAoIWRyaXZlLT5wcmVzZW50KQorCQkJKHZvaWQpZG9fcHJvYmUoZHJpdmUsIEFUQV9DTURfSURfQVRBUEkpOworCisJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQkJLyogZHJpdmUgbm90IGZvdW5kICovCiAJCQlyZXR1cm4gMDsKLQkJaWYgKHN0cnN0cihkcml2ZS0+aWQtPm1vZGVsLCAiRSBYIEEgQiBZIFQgRSBOIEUgUyBUIikpCisKKwkJaWYgKHN0cnN0cihtLCAiRSBYIEEgQiBZIFQgRSBOIEUgUyBUIikpIHsKIAkJCWVuYWJsZV9uZXN0KGRyaXZlKTsKLQkKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwogCQkvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQ/ICovCi0JCWlmICghZHJpdmUtPmlkX3JlYWQpIHsKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0lEX1JFQUQpID09IDApIHsKIAkJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbm9uLUlERSBkcml2ZSwgQ0hTPSVkLyVkLyVkXG4iLAogCQkJCQlkcml2ZS0+bmFtZSwgZHJpdmUtPmN5bCwKQEAgLTYxMCwxNSArNjA1LDE3IEBACiAJCQl9IGVsc2UgewogCQkJCS8qIG51a2UgaXQgKi8KIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBkZXZpY2Ugb24gYnVzIHJlZnVzZWQgaWRlbnRpZmljYXRpb24uIElnbm9yaW5nLlxuIiwgZHJpdmUtPm5hbWUpOwotCQkJCWRyaXZlLT5wcmVzZW50ID0gMDsKKwkJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfUFJFU0VOVDsKIAkJCX0KIAkJfQogCQkvKiBkcml2ZSB3YXMgZm91bmQgKi8KIAl9Ci0JaWYoIWRyaXZlLT5wcmVzZW50KQorCisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCXJldHVybiAwOworCiAJLyogVGhlIGRyaXZlIHdhc24ndCBiZWluZyBoZWxwZnVsLiBBZGQgZ2VuZXJpYyBpbmZvIG9ubHkgKi8KLQlpZiAoZHJpdmUtPmlkX3JlYWQgPT0gMCkgeworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19JRF9SRUFEKSA9PSAwKSB7CiAJCWdlbmVyaWNfaWQoZHJpdmUpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC02MjgsNyArNjI1LDcgQEAKIAkJaWRlX2Rpc2tfaW5pdF9tdWx0X2NvdW50KGRyaXZlKTsKIAl9CiAKLQlyZXR1cm4gZHJpdmUtPnByZXNlbnQ7CisJcmV0dXJuICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCk7CiB9CiAKIHN0YXRpYyB2b2lkIGh3aWZfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNjYwLDggKzY1Nyw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWh3aWYtPnBvcnRkZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoaWRlX3BvcnRfY2xhc3MsICZod2lmLT5nZW5kZXYsCi0JCQkJCSAgICAgIE1LREVWKDAsIDApLCBod2lmLCBod2lmLT5uYW1lKTsKKwlod2lmLT5wb3J0ZGV2ID0gZGV2aWNlX2NyZWF0ZShpZGVfcG9ydF9jbGFzcywgJmh3aWYtPmdlbmRldiwKKwkJCQkgICAgICBNS0RFVigwLCAwKSwgaHdpZiwgaHdpZi0+bmFtZSk7CiAJaWYgKElTX0VSUihod2lmLT5wb3J0ZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGh3aWYtPnBvcnRkZXYpOwogCQlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKQEAgLTcxOSw3ICs3MTYsOCBAQAogCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwogCiAJCS8qIElnbm9yZSBkaXNrcyB0aGF0IHdlIHdpbGwgbm90IHByb2JlIGZvciBsYXRlci4gKi8KLQkJaWYgKCFkcml2ZS0+bm9wcm9iZSB8fCBkcml2ZS0+cHJlc2VudCkgeworCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkgPT0gMCB8fAorCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkpIHsKIAkJCVNFTEVDVF9EUklWRShkcml2ZSk7CiAJCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CiAJCQltZGVsYXkoMik7CkBAIC03NDAsMzYgKzczOCwzOCBAQAogCiAvKioKICAqCWlkZV91bmRlY29kZWRfc2xhdmUJLQlsb29rIGZvciBiYWQgQ0YgYWRhcHRlcnMKLSAqCUBkcml2ZTE6IGRyaXZlCisgKglAZGV2MTogc2xhdmUgZGV2aWNlCiAgKgogICoJQW5hbHlzZSB0aGUgZHJpdmVzIG9uIHRoZSBpbnRlcmZhY2UgYW5kIGF0dGVtcHQgdG8gZGVjaWRlIGlmIHdlCiAgKgloYXZlIHRoZSBzYW1lIGRyaXZlIHZpZXdlZCB0d2ljZS4gVGhpcyBvY2N1cnMgd2l0aCBjcmFwIENGIGFkYXB0ZXJzCiAgKglhbmQgUENNQ0lBIHNvbWV0aW1lcy4KICAqLwogCi12b2lkIGlkZV91bmRlY29kZWRfc2xhdmUoaWRlX2RyaXZlX3QgKmRyaXZlMSkKK3ZvaWQgaWRlX3VuZGVjb2RlZF9zbGF2ZShpZGVfZHJpdmVfdCAqZGV2MSkKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUwID0gJmRyaXZlMS0+aHdpZi0+ZHJpdmVzWzBdOworCWlkZV9kcml2ZV90ICpkZXYwID0gJmRldjEtPmh3aWYtPmRyaXZlc1swXTsKIAotCWlmICgoZHJpdmUxLT5kbiAmIDEpID09IDAgfHwgZHJpdmUwLT5wcmVzZW50ID09IDApCisJaWYgKChkZXYxLT5kbiAmIDEpID09IDAgfHwgKGRldjAtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlyZXR1cm47CiAKIAkvKiBJZiB0aGUgbW9kZWxzIGRvbid0IG1hdGNoIHRoZXkgYXJlIG5vdCB0aGUgc2FtZSBwcm9kdWN0ICovCi0JaWYgKHN0cmNtcChkcml2ZTAtPmlkLT5tb2RlbCwgZHJpdmUxLT5pZC0+bW9kZWwpKQorCWlmIChzdHJjbXAoKGNoYXIgKikmZGV2MC0+aWRbQVRBX0lEX1BST0RdLAorCQkgICAoY2hhciAqKSZkZXYxLT5pZFtBVEFfSURfUFJPRF0pKQogCQlyZXR1cm47CiAKIAkvKiBTZXJpYWwgbnVtYmVycyBkbyBub3QgbWF0Y2ggKi8KLQlpZiAoc3RybmNtcChkcml2ZTAtPmlkLT5zZXJpYWxfbm8sIGRyaXZlMS0+aWQtPnNlcmlhbF9ubywgMjApKQorCWlmIChzdHJuY21wKChjaGFyICopJmRldjAtPmlkW0FUQV9JRF9TRVJOT10sCisJCSAgICAoY2hhciAqKSZkZXYxLT5pZFtBVEFfSURfU0VSTk9dLCBBVEFfSURfU0VSTk9fTEVOKSkKIAkJcmV0dXJuOwogCiAJLyogTm8gc2VyaWFsIG51bWJlciwgdGhhbmtmdWxseSB2ZXJ5IHJhcmUgZm9yIENGICovCi0JaWYgKGRyaXZlMC0+aWQtPnNlcmlhbF9ub1swXSA9PSAwKQorCWlmICgqKGNoYXIgKikmZGV2MC0+aWRbQVRBX0lEX1NFUk5PXSA9PSAwKQogCQlyZXR1cm47CiAKIAkvKiBBcHBlYXJzIHRvIGJlIGFuIElERSBmbGFzaCBhZGFwdGVyIHdpdGggZGVjb2RlIGJ1Z3MgKi8KIAlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUtcHJvYmU6IGlnbm9yaW5nIHVuZGVjb2RlZCBzbGF2ZVxuIik7CiAKLQlkcml2ZTEtPnByZXNlbnQgPSAwOworCWRldjEtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1BSRVNFTlQ7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV91bmRlY29kZWRfc2xhdmUpOwpAQCAtNzgyLDcgKzc4Miw4IEBACiAKIAlCVUdfT04oaHdpZi0+cHJlc2VudCk7CiAKLQlpZiAoaHdpZi0+ZHJpdmVzWzBdLm5vcHJvYmUgJiYgaHdpZi0+ZHJpdmVzWzFdLm5vcHJvYmUpCisJaWYgKChod2lmLT5kcml2ZXNbMF0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpICYmCisJICAgIChod2lmLT5kcml2ZXNbMV0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAogCS8qCkBAIC04MDQsOSArODA1LDkgQEAKIAkgKi8KIAlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7CiAJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0JCWRyaXZlLT5kbiA9IChod2lmLT5jaGFubmVsID8gMiA6IDApICsgdW5pdDsKKwogCQkodm9pZCkgcHJvYmVfZm9yX2RyaXZlKGRyaXZlKTsKLQkJaWYgKGRyaXZlLT5wcmVzZW50KQorCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKQogCQkJcmMgPSAwOwogCX0KIApAQCAtODMwLDE3ICs4MzEsMTkgQEAKIAlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7CiAJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CiAKLQkJaWYgKGRyaXZlLT5wcmVzZW50ICYmIHBvcnRfb3BzICYmIHBvcnRfb3BzLT5xdWlya3Byb2MpCi0JCQlwb3J0X29wcy0+cXVpcmtwcm9jKGRyaXZlKTsKKwkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgeworCQkJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5xdWlya3Byb2MpCisJCQkJcG9ydF9vcHMtPnF1aXJrcHJvYyhkcml2ZSk7CisJCX0KIAl9CiAKIAlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7CiAJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CiAKLQkJaWYgKGRyaXZlLT5wcmVzZW50KSB7CisJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKIAkJCWlkZV9zZXRfbWF4X3Bpbyhkcml2ZSk7CiAKLQkJCWRyaXZlLT5uaWNlMSA9IDE7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19OSUNFMTsKIAogCQkJaWYgKGh3aWYtPmRtYV9vcHMpCiAJCQkJaWRlX3NldF9kbWEoZHJpdmUpOwpAQCAtODUwLDE0ICs4NTMsMTQgQEAKIAlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7CiAJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CiAKLQkJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fSU9fMzJCSVQpCi0JCQlkcml2ZS0+bm9faW9fMzJiaXQgPSAxOworCQlpZiAoKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fSU9fMzJCSVQpIHx8CisJCSAgICBkcml2ZS0+aWRbQVRBX0lEX0RXT1JEX0lPXSkKKwkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX0lPXzMyQklUOwogCQllbHNlCi0JCQlkcml2ZS0+bm9faW9fMzJiaXQgPSBkcml2ZS0+aWQtPmR3b3JkX2lvID8gMSA6IDA7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9fSU9fMzJCSVQ7CiAJfQogfQogCi0jaWYgTUFYX0hXSUZTID4gMQogLyoKICAqIHNhdmVfbWF0Y2goKSBpcyB1c2VkIHRvIHNpbXBsaWZ5IGxvZ2ljIGluIGluaXRfaXJxKCkgYmVsb3cuCiAgKgpAQCAtODgyLDcgKzg4NSw2IEBACiAJaWYgKCFtIHx8IG0tPmlycSAhPSBod2lmLT5pcnEpIC8qIGRvbid0IHVuZG8gYSBwcmlvciBwZXJmZWN0IG1hdGNoICovCiAJCSptYXRjaCA9IG5ldzsKIH0KLSNlbmRpZiAvKiBNQVhfSFdJRlMgPiAxICovCiAKIC8qCiAgKiBpbml0IHJlcXVlc3QgcXVldWUKQEAgLTk2MSwyNiArOTYzLDMzIEBACiAgKiAtIGFsbG9jYXRlIHRoZSBibG9jayBkZXZpY2UgcXVldWUKICAqIC0gbGluayBkcml2ZSBpbnRvIHRoZSBod2dyb3VwCiAgKi8KLXN0YXRpYyB2b2lkIGlkZV9wb3J0X3NldHVwX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyBpbnQgaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewotCWludCBpOworCWludCBpLCBqID0gMDsKIAogCW11dGV4X2xvY2soJmlkZV9jZmdfbXR4KTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7CiAJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbaV07CiAKLQkJaWYgKCFkcml2ZS0+cHJlc2VudCkKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDApCiAJCQljb250aW51ZTsKIAogCQlpZiAoaWRlX2luaXRfcXVldWUoZHJpdmUpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImlkZTogZmFpbGVkIHRvIGluaXQgJXNcbiIsCiAJCQkJCWRyaXZlLT5uYW1lKTsKKwkJCWtmcmVlKGRyaXZlLT5pZCk7CisJCQlkcml2ZS0+aWQgPSBOVUxMOworCQkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1BSRVNFTlQ7CiAJCQljb250aW51ZTsKIAkJfQogCisJCWorKzsKKwogCQlpZGVfYWRkX2RyaXZlX3RvX2h3Z3JvdXAoZHJpdmUpOwogCX0KIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKKworCXJldHVybiBqOwogfQogCiBzdGF0aWMgaWRlX2h3aWZfdCAqaWRlX3BvcnRzW01BWF9IV0lGU107CkBAIC0xMDM3LDE0ICsxMDQ2LDkgQEAKIAlpZGVfaHdncm91cF90ICpod2dyb3VwOwogCWlkZV9od2lmX3QgKm1hdGNoID0gTlVMTDsKIAotCi0JQlVHX09OKGluX2ludGVycnVwdCgpKTsKLQlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsJCi0JQlVHX09OKGh3aWYgPT0gTlVMTCk7Ci0KIAltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7CiAJaHdpZi0+aHdncm91cCA9IE5VTEw7Ci0jaWYgTUFYX0hXSUZTID4gMQorCiAJLyoKIAkgKiBHcm91cCB1cCB3aXRoIGFueSBvdGhlciBod2lmcyB0aGF0IHNoYXJlIG91ciBpcnEocykuCiAJICovCkBAIC0xMDY5LDcgKzEwNzMsNyBAQAogCQkJfQogCQl9CiAJfQotI2VuZGlmIC8qIE1BWF9IV0lGUyA+IDEgKi8KKwogCS8qCiAJICogSWYgd2UgYXJlIHN0aWxsIHdpdGhvdXQgYSBod2dyb3VwLCB0aGVuIGZvcm0gYSBuZXcgb25lCiAJICovCkBAIC0xMTE2LDcgKzExMjAsOCBAQAogCQlzYSA9IElSUUZfU0hBUkVEOwogI2VuZGlmIC8qIF9fbWM2ODAwMF9fICovCiAKLQkJaWYgKElERV9DSElQU0VUX0lTX1BDSShod2lmLT5jaGlwc2V0KSkKKwkJaWYgKGh3aWYtPmNoaXBzZXQgPT0gaWRlX3BjaSB8fCBod2lmLT5jaGlwc2V0ID09IGlkZV9jbWQ2NDYgfHwKKwkJICAgIGh3aWYtPmNoaXBzZXQgPT0gaWRlX2FsaTE0eHgpCiAJCQlzYSA9IElSUUZfU0hBUkVEOwogCiAJCWlmIChpb19wb3J0cy0+Y3RsX2FkZHIpCkBAIC0xMTY3LDEyICsxMTcyLDEzIEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRhdGE7CiAJaW50IHVuaXQgPSAqcGFydCA+PiBQQVJUTl9CSVRTOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0JaWYgKCFkcml2ZS0+cHJlc2VudCkKKworCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCiAJCXJlcXVlc3RfbW9kdWxlKCJpZGUtZGlzayIpOwotCWlmIChkcml2ZS0+c2NzaSkKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TQ1NJKQogCQlyZXF1ZXN0X21vZHVsZSgiaWRlLXNjc2kiKTsKIAlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSB8fCBkcml2ZS0+bWVkaWEgPT0gaWRlX29wdGljYWwpCiAJCXJlcXVlc3RfbW9kdWxlKCJpZGUtY2QiKTsKQEAgLTExODgsNyArMTE5NCw3IEBACiB7CiAJc3RydWN0IGdlbmRpc2sgKnAgPSBkYXRhOwogCSpwYXJ0ICY9ICgxIDw8IFBBUlROX0JJVFMpIC0gMTsKLQlyZXR1cm4gJnAtPmRldi5rb2JqOworCXJldHVybiAmZGlza190b19kZXYocCktPmtvYmo7CiB9CiAKIHN0YXRpYyBpbnQgZXhhY3RfbG9jayhkZXZfdCBkZXYsIHZvaWQgKmRhdGEpCkBAIC0xMjE5LDcgKzEyMjUsNyBAQAogdm9pZCBpZGVfaW5pdF9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXVuc2lnbmVkIGludCB1bml0ID0gKGRyaXZlLT5zZWxlY3QuYWxsID4+IDQpICYgMTsKKwl1bnNpZ25lZCBpbnQgdW5pdCA9IGRyaXZlLT5kbiAmIDE7CiAKIAlkaXNrLT5tYWpvciA9IGh3aWYtPm1ham9yOwogCWRpc2stPmZpcnN0X21pbm9yID0gdW5pdCA8PCBQQVJUTl9CSVRTOwpAQCAtMTI2Miw3ICsxMjY4LDcgQEAKIAlpZGVfcmVtb3ZlX2RyaXZlX2Zyb21faHdncm91cChkcml2ZSk7CiAJa2ZyZWUoZHJpdmUtPmlkKTsKIAlkcml2ZS0+aWQgPSBOVUxMOwotCWRyaXZlLT5wcmVzZW50ID0gMDsKKwlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfUFJFU0VOVDsKIAkvKiBNZXNzZWQgdXAgbG9ja2luZyAuLi4gKi8KIAlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKIAlibGtfY2xlYW51cF9xdWV1ZShkcml2ZS0+cXVldWUpOwpAQCAtMTM0MSwxMSArMTM0Nyw5IEBACiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkcml2ZS0+Z2VuZGV2OwogCQlpbnQgcmV0OwogCi0JCWlmICghZHJpdmUtPnByZXNlbnQpCisJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJaWRlX2FkZF9nZW5lcmljX3NldHRpbmdzKGRyaXZlKTsKLQogCQlzbnByaW50ZihkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIldS4ldSIsIGh3aWYtPmluZGV4LCBpKTsKIAkJZGV2LT5wYXJlbnQgPSAmaHdpZi0+Z2VuZGV2OwogCQlkZXYtPmJ1cyA9ICZpZGVfYnVzX3R5cGU7CkBAIC0xMzY3LDEyICsxMzcxLDE0IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewogCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwogCisJCWRyaXZlLT5kbiA9IGkgKyBod2lmLT5jaGFubmVsICogMjsKKwogCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19JT18zMkJJVCkKIAkJCWRyaXZlLT5pb18zMmJpdCA9IDE7CiAJCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1VOTUFTS19JUlFTKQotCQkJZHJpdmUtPnVubWFzayA9IDE7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19VTk1BU0s7CiAJCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX1VOTUFTS19JUlFTKQotCQkJZHJpdmUtPm5vX3VubWFzayA9IDE7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19OT19VTk1BU0s7CiAKIAkJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5pbml0X2RldikKIAkJCXBvcnRfb3BzLT5pbml0X2Rldihkcml2ZSk7CkBAIC0xNDkyLDcgKzE0OTgsNyBAQAogCiBzdGF0aWMgaW50IGlkZV9zeXNmc19yZWdpc3Rlcl9wb3J0KGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaW50IGksIHJjOworCWludCBpLCB1bmluaXRpYWxpemVkX3ZhcihyYyk7CiAKIAlmb3IgKGkgPSAwOyBpZGVfcG9ydF9hdHRyc1tpXTsgaSsrKSB7CiAJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGh3aWYtPnBvcnRkZXYsIGlkZV9wb3J0X2F0dHJzW2ldKTsKQEAgLTE1MjksMTkgKzE1MzUsMTQgQEAKIAkgKiBwb3J0cyAweDFmMC8weDE3MCAodGhlIGlkZTAvaWRlMSBkZWZhdWx0cykuCiAJICovCiAJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOwotCWlmIChNQVhfSFdJRlMgPT0gMSkgewotCQlpZiAoaWRlX2luZGV4ZXMgPT0gMCAmJiBpID09IDApCi0JCQlpZHggPSAxOworCWlmIChib290YWJsZSkgeworCQlpZiAoKGlkZV9pbmRleGVzIHwgaSkgIT0gKDEgPDwgTUFYX0hXSUZTKSAtIDEpCisJCQlpZHggPSBmZnooaWRlX2luZGV4ZXMgfCBpKTsKIAl9IGVsc2UgewotCQlpZiAoYm9vdGFibGUpIHsKLQkJCWlmICgoaWRlX2luZGV4ZXMgfCBpKSAhPSAoMSA8PCBNQVhfSFdJRlMpIC0gMSkKLQkJCQlpZHggPSBmZnooaWRlX2luZGV4ZXMgfCBpKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoaWRlX2luZGV4ZXMgfCAzKSAhPSAoMSA8PCBNQVhfSFdJRlMpIC0gMSkKLQkJCQlpZHggPSBmZnooaWRlX2luZGV4ZXMgfCAzKTsKLQkJCWVsc2UgaWYgKChpZGVfaW5kZXhlcyAmIDMpICE9IDMpCi0JCQkJaWR4ID0gZmZ6KGlkZV9pbmRleGVzKTsKLQkJfQorCQlpZiAoKGlkZV9pbmRleGVzIHwgMykgIT0gKDEgPDwgTUFYX0hXSUZTKSAtIDEpCisJCQlpZHggPSBmZnooaWRlX2luZGV4ZXMgfCAzKTsKKwkJZWxzZSBpZiAoKGlkZV9pbmRleGVzICYgMykgIT0gMykKKwkJCWlkeCA9IGZmeihpZGVfaW5kZXhlcyk7CiAJfQogCWlmIChpZHggPj0gMCkKIAkJaWRlX2luZGV4ZXMgfD0gKDEgPDwgaWR4KTsKQEAgLTE1NTcsOCArMTU1OCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiB9CiAKLXN0cnVjdCBpZGVfaG9zdCAqaWRlX2hvc3RfYWxsb2NfYWxsKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLAotCQkJCSAgICBod19yZWdzX3QgKipod3MpCitzdHJ1Y3QgaWRlX2hvc3QgKmlkZV9ob3N0X2FsbG9jKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLCBod19yZWdzX3QgKipod3MpCiB7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0OwogCWludCBpOwpAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKIAlpZiAoaG9zdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdJRlM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7CiAJCWlkZV9od2lmX3QgKmh3aWY7CiAJCWludCBpZHg7CiAKQEAgLTE2MDIsMjMgKzE2MDIsMTMgQEAKIAlpZiAoaHdzWzBdKQogCQlob3N0LT5kZXZbMF0gPSBod3NbMF0tPmRldjsKIAotCWlmIChkKQorCWlmIChkKSB7CisJCWhvc3QtPmluaXRfY2hpcHNldCA9IGQtPmluaXRfY2hpcHNldDsKIAkJaG9zdC0+aG9zdF9mbGFncyA9IGQtPmhvc3RfZmxhZ3M7CisJfQogCiAJcmV0dXJuIGhvc3Q7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpZGVfaG9zdF9hbGxvY19hbGwpOwotCi1zdHJ1Y3QgaWRlX2hvc3QgKmlkZV9ob3N0X2FsbG9jKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLCBod19yZWdzX3QgKipod3MpCi17Ci0JaHdfcmVnc190ICpod3NfYWxsW01BWF9IV0lGU107Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspCi0JCWh3c19hbGxbaV0gPSAoaSA8IDQpID8gaHdzW2ldIDogTlVMTDsKLQotCXJldHVybiBpZGVfaG9zdF9hbGxvY19hbGwoZCwgaHdzX2FsbCk7Ci19CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfaG9zdF9hbGxvYyk7CiAKIGludCBpZGVfaG9zdF9yZWdpc3RlcihzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QsIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLApAQCAtMTYyNyw3ICsxNjE3LDcgQEAKIAlpZGVfaHdpZl90ICpod2lmLCAqbWF0ZSA9IE5VTEw7CiAJaW50IGksIGogPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IV0lGUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKIAkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwogCiAJCWlmIChod2lmID09IE5VTEwpIHsKQEAgLTE2NDAsMjIgKzE2MzAsMjIgQEAKIAogCQlpZiAoZCA9PSBOVUxMKSB7CiAJCQltYXRlID0gTlVMTDsKLQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKChpICYgMSkgJiYgbWF0ZSkgeworCQkJCWh3aWYtPm1hdGUgPSBtYXRlOworCQkJCW1hdGUtPm1hdGUgPSBod2lmOworCQkJfQorCisJCQltYXRlID0gKGkgJiAxKSA/IE5VTEwgOiBod2lmOworCisJCQlpZGVfaW5pdF9wb3J0KGh3aWYsIGkgJiAxLCBkKTsKKwkJCWlkZV9wb3J0X2NhYmxlX2RldGVjdChod2lmKTsKIAkJfQogCi0JCWlmICgoaSAmIDEpICYmIG1hdGUpIHsKLQkJCWh3aWYtPm1hdGUgPSBtYXRlOwotCQkJbWF0ZS0+bWF0ZSA9IGh3aWY7Ci0JCX0KLQotCQltYXRlID0gKGkgJiAxKSA/IE5VTEwgOiBod2lmOwotCi0JCWlkZV9pbml0X3BvcnQoaHdpZiwgaSAmIDEsIGQpOwotCQlpZGVfcG9ydF9jYWJsZV9kZXRlY3QoaHdpZik7CiAJCWlkZV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewogCQlod2lmID0gaG9zdC0+cG9ydHNbaV07CiAKIAkJaWYgKGh3aWYgPT0gTlVMTCkKQEAgLTE2NzIsNyArMTY2Miw3IEBACiAJCQlpZGVfcG9ydF90dW5lX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IV0lGUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKIAkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwogCiAJCWlmIChod2lmID09IE5VTEwpCkBAIC0xNjg1LDEwICsxNjc1LDEzIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWorKzsKLQogCQlpZiAoaHdpZi0+cHJlc2VudCkKLQkJCWlkZV9wb3J0X3NldHVwX2RldmljZXMoaHdpZik7CisJCQlpZiAoaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhod2lmKSA9PSAwKSB7CisJCQkJaHdpZi0+cHJlc2VudCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJaisrOwogCiAJCWlkZV9hY3BpX2luaXQoaHdpZik7CiAKQEAgLTE2OTYsNyArMTY4OSw3IEBACiAJCQlpZGVfYWNwaV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewogCQlod2lmID0gaG9zdC0+cG9ydHNbaV07CiAKIAkJaWYgKGh3aWYgPT0gTlVMTCkKQEAgLTE3MDksNyArMTcwMiw3IEBACiAJCQlod2lmX3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IV0lGUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKIAkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwogCiAJCWlmIChod2lmID09IE5VTEwpCkBAIC0xNzU0LDcgKzE3NDcsNyBAQAogCWlkZV9od2lmX3QgKmh3aWY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewogCQlod2lmID0gaG9zdC0+cG9ydHNbaV07CiAKIAkJaWYgKGh3aWYgPT0gTlVMTCkKQEAgLTE3NzIsNyArMTc2NSw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXSUZTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewogCQlpZiAoaG9zdC0+cG9ydHNbaV0pCiAJCQlpZGVfdW5yZWdpc3Rlcihob3N0LT5wb3J0c1tpXSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKaW5kZXggZjY2YzljMy4uYjI2OTI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC0xMiwxNCArMTIsNiBAQAogICogInNldHRpbmdzIiBmaWxlcy4gIGUuZy4gICAgImNhdCAvcHJvYy9pZGUwL2hkYS9zZXR0aW5ncyIKICAqIFRvIHdyaXRlIGEgbmV3IHZhbHVlICJ2YWwiIGludG8gYSBzcGVjaWZpYyBzZXR0aW5nICJuYW1lIiwgdXNlOgogICogICBlY2hvICJuYW1lOnZhbCIgPi9wcm9jL2lkZS9pZGUwL2hkYS9zZXR0aW5ncwotICoKLSAqIEFsc28gdXNlZnVsLCAiY2F0IC9wcm9jL2lkZTAvaGRhL1tpZGVudGlmeSwgc21hcnRfdmFsdWVzLAotICogc21hcnRfdGhyZXNob2xkcywgY2FwYWJpbGl0aWVzXSIgd2lsbCBpc3N1ZSBhbiBJREVOVElGWSAvCi0gKiBQQUNLRVRfSURFTlRJRlkgLyBTTUFSVF9SRUFEX1ZBTFVFUyAvIFNNQVJUX1JFQURfVEhSRVNIT0xEUyAvCi0gKiBTRU5TRSBDQVBBQklMSVRJRVMgY29tbWFuZCB0byAvZGV2L2hkYSwgYW5kIHRoZW4gZHVtcCBvdXQgdGhlCi0gKiByZXR1cm5lZCBkYXRhIGFzIDI1NiAxNi1iaXQgd29yZHMuICBUaGUgImhkcGFybSIgdXRpbGl0eSB3aWxsCi0gKiBiZSB1cGRhdGVkIHNvbWVkYXkgc29vbiB0byB1c2UgdGhpcyBtZWNoYW5pc20uCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMxLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCkBAIC0xMDksMTMgKzEwMCwxNCBAQAogCiAJCWVyciA9IHRhc2tmaWxlX2xpYl9nZXRfaWRlbnRpZnkoZHJpdmUsIHBhZ2UpOwogCQlpZiAoIWVycikgewotCQkJY2hhciAqb3V0ID0gKChjaGFyICopcGFnZSkgKyAoU0VDVE9SX1dPUkRTICogNCk7CisJCQljaGFyICpvdXQgPSAoY2hhciAqKXBhZ2UgKyBTRUNUT1JfU0laRTsKKwogCQkJcGFnZSA9IG91dDsKIAkJCWRvIHsKIAkJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDR4JWMiLAogCQkJCQlsZTE2X3RvX2NwdXAodmFsKSwgKCsraSAmIDcpID8gJyAnIDogJ1xuJyk7CiAJCQkJdmFsICs9IDE7Ci0JCQl9IHdoaWxlIChpIDwgKFNFQ1RPUl9XT1JEUyAqIDIpKTsKKwkJCX0gd2hpbGUgKGkgPCBTRUNUT1JfU0laRSAvIDIpOwogCQkJbGVuID0gb3V0IC0gcGFnZTsKIAkJfQogCX0KQEAgLTEyMywxNDAgKzExNSwyNSBAQAogfQogCiAvKioKLSAqCV9faWRlX2FkZF9zZXR0aW5nCS0JYWRkIGFuIGlkZSBzZXR0aW5nIG9wdGlvbgotICoJQGRyaXZlOiBkcml2ZSB0byB1c2UKLSAqCUBuYW1lOiBzZXR0aW5nIG5hbWUKLSAqCUBydzogdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaXMgcmVhZCB3cml0ZQotICoJQGRhdGFfdHlwZTogdHlwZSBvZiBkYXRhCi0gKglAbWluOiByYW5nZSBtaW5pbXVtCi0gKglAbWF4OiByYW5nZSBtYXhpbXVtCi0gKglAbXVsX2ZhY3RvcjogbXVsdGlwbGljYXRpb24gc2NhbGUKLSAqCUBkaXZfZmFjdG9yOiBkaXZpc29uIHNjYWxlCi0gKglAZGF0YTogcHJpdmF0ZSBkYXRhIGZpZWxkCi0gKglAc2V0OiBzZXR0aW5nCi0gKglAYXV0b19yZW1vdmU6IHNldHRpbmcgYXV0byByZW1vdmFsIGZsYWcKLSAqCi0gKglSZW1vdmVzIHRoZSBzZXR0aW5nIG5hbWVkIGZyb20gdGhlIGRldmljZSBpZiBpdCBpcyBwcmVzZW50LgotICoJVGhlIGZ1bmN0aW9uIHRha2VzIHRoZSBzZXR0aW5nc19sb2NrIHRvIHByb3RlY3QgYWdhaW5zdAotICoJcGFyYWxsZWwgY2hhbmdlcy4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEKLSAqCWNvbnRleHQuIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuCi0gKgotICoJQlVHUzogVGhpcyBjb2RlIGlzIHNlcmlvdXNseSBvdmVyLWVuZ2luZWVyZWQuIFRoZXJlIGlzIGFsc28KLSAqCW1hZ2ljIGFib3V0IGhvdyB0aGUgZHJpdmVyIHNwZWNpZmljIGZlYXR1cmVzIGFyZSBzZXR1cC4gSWYKLSAqCWEgZHJpdmVyIGlzIGF0dGFjaGVkIHdlIGFzc3VtZSB0aGUgZHJpdmVyIHNldHRpbmdzIGFyZSBhdXRvCi0gKglyZW1vdmUuCi0gKi8KLQotc3RhdGljIGludCBfX2lkZV9hZGRfc2V0dGluZyhpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBydywgaW50IGRhdGFfdHlwZSwgaW50IG1pbiwgaW50IG1heCwgaW50IG11bF9mYWN0b3IsIGludCBkaXZfZmFjdG9yLCB2b2lkICpkYXRhLCBpZGVfcHJvY3NldF90ICpzZXQsIGludCBhdXRvX3JlbW92ZSkKLXsKLQlpZGVfc2V0dGluZ3NfdCAqKnAgPSAoaWRlX3NldHRpbmdzX3QgKiopICZkcml2ZS0+c2V0dGluZ3MsICpzZXR0aW5nID0gTlVMTDsKLQotCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0Jd2hpbGUgKCgqcCkgJiYgc3RyY21wKCgqcCktPm5hbWUsIG5hbWUpIDwgMCkKLQkJcCA9ICYoKCpwKS0+bmV4dCk7Ci0JaWYgKChzZXR0aW5nID0ga3phbGxvYyhzaXplb2YoKnNldHRpbmcpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJZ290byBhYm9ydDsKLQlpZiAoKHNldHRpbmctPm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDEsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlnb3RvIGFib3J0OwotCXN0cmNweShzZXR0aW5nLT5uYW1lLCBuYW1lKTsKLQlzZXR0aW5nLT5ydyA9IHJ3OwotCXNldHRpbmctPmRhdGFfdHlwZSA9IGRhdGFfdHlwZTsKLQlzZXR0aW5nLT5taW4gPSBtaW47Ci0Jc2V0dGluZy0+bWF4ID0gbWF4OwotCXNldHRpbmctPm11bF9mYWN0b3IgPSBtdWxfZmFjdG9yOwotCXNldHRpbmctPmRpdl9mYWN0b3IgPSBkaXZfZmFjdG9yOwotCXNldHRpbmctPmRhdGEgPSBkYXRhOwotCXNldHRpbmctPnNldCA9IHNldDsKLQotCXNldHRpbmctPm5leHQgPSAqcDsKLQlpZiAoYXV0b19yZW1vdmUpCi0JCXNldHRpbmctPmF1dG9fcmVtb3ZlID0gMTsKLQkqcCA9IHNldHRpbmc7Ci0JbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOwotCXJldHVybiAwOwotYWJvcnQ6Ci0JbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOwotCWtmcmVlKHNldHRpbmcpOwotCXJldHVybiAtMTsKLX0KLQotaW50IGlkZV9hZGRfc2V0dGluZyhpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBydywgaW50IGRhdGFfdHlwZSwgaW50IG1pbiwgaW50IG1heCwgaW50IG11bF9mYWN0b3IsIGludCBkaXZfZmFjdG9yLCB2b2lkICpkYXRhLCBpZGVfcHJvY3NldF90ICpzZXQpCi17Ci0JcmV0dXJuIF9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLCBuYW1lLCBydywgZGF0YV90eXBlLCBtaW4sIG1heCwgbXVsX2ZhY3RvciwgZGl2X2ZhY3RvciwgZGF0YSwgc2V0LCAxKTsKLX0KLQotRVhQT1JUX1NZTUJPTChpZGVfYWRkX3NldHRpbmcpOwotCi0vKioKLSAqCV9faWRlX3JlbW92ZV9zZXR0aW5nCS0JcmVtb3ZlIGFuIGlkZSBzZXR0aW5nIG9wdGlvbgotICoJQGRyaXZlOiBkcml2ZSB0byB1c2UKKyAqCWlkZV9maW5kX3NldHRpbmcJLQlmaW5kIGEgc3BlY2lmaWMgc2V0dGluZworICoJQHN0OiBzZXR0aW5nIHRhYmxlIHBvaW50ZXIKICAqCUBuYW1lOiBzZXR0aW5nIG5hbWUKICAqCi0gKglSZW1vdmVzIHRoZSBzZXR0aW5nIG5hbWVkIGZyb20gdGhlIGRldmljZSBpZiBpdCBpcyBwcmVzZW50LgotICoJVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHNldHRpbmcgc2VtYXBob3JlLgotICovCi0KLXN0YXRpYyB2b2lkIF9faWRlX3JlbW92ZV9zZXR0aW5nKGlkZV9kcml2ZV90ICpkcml2ZSwgY2hhciAqbmFtZSkKLXsKLQlpZGVfc2V0dGluZ3NfdCAqKnAsICpzZXR0aW5nOwotCi0JcCA9IChpZGVfc2V0dGluZ3NfdCAqKikgJmRyaXZlLT5zZXR0aW5nczsKLQotCXdoaWxlICgoKnApICYmIHN0cmNtcCgoKnApLT5uYW1lLCBuYW1lKSkKLQkJcCA9ICYoKCpwKS0+bmV4dCk7Ci0Jc2V0dGluZyA9ICgqcCk7Ci0JaWYgKHNldHRpbmcgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JKCpwKSA9IHNldHRpbmctPm5leHQ7Ci0KLQlrZnJlZShzZXR0aW5nLT5uYW1lKTsKLQlrZnJlZShzZXR0aW5nKTsKLX0KLQotLyoqCi0gKglhdXRvX3JlbW92ZV9zZXR0aW5ncwktCXJlbW92ZSBkcml2ZXIgc3BlY2lmaWMgc2V0dGluZ3MKLSAqCUBkcml2ZTogZHJpdmUKLSAqCi0gKglBdXRvbWF0aWNhbGx5IHJlbW92ZSBhbGwgdGhlIGRyaXZlciBzcGVjaWZpYyBzZXR0aW5ncyBmb3IgdGhpcwotICoJZHJpdmUuIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dC4gVGhlCi0gKgljYWxsZXIgbXVzdCBob2xkIGlkZV9zZXR0aW5nX210eC4KLSAqLwotCi1zdGF0aWMgdm9pZCBhdXRvX3JlbW92ZV9zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX3NldHRpbmdzX3QgKnNldHRpbmc7Ci1yZXBlYXQ6Ci0Jc2V0dGluZyA9IGRyaXZlLT5zZXR0aW5nczsKLQl3aGlsZSAoc2V0dGluZykgewotCQlpZiAoc2V0dGluZy0+YXV0b19yZW1vdmUpIHsKLQkJCV9faWRlX3JlbW92ZV9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nLT5uYW1lKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9Ci0JCXNldHRpbmcgPSBzZXR0aW5nLT5uZXh0OwotCX0KLX0KLQotLyoqCi0gKglpZGVfZmluZF9zZXR0aW5nX2J5X25hbWUJLQlmaW5kIGEgZHJpdmUgc3BlY2lmaWMgc2V0dGluZwotICoJQGRyaXZlOiBkcml2ZSB0byBzY2FuCi0gKglAbmFtZTogc2V0dGluZyBuYW1lCi0gKgotICoJU2NhbidzIHRoZSBkZXZpY2Ugc2V0dGluZyB0YWJsZSBmb3IgYSBtYXRjaGluZyBlbnRyeSBhbmQgcmV0dXJucworICoJU2NhbidzIHRoZSBzZXR0aW5nIHRhYmxlIGZvciBhIG1hdGNoaW5nIGVudHJ5IGFuZCByZXR1cm5zCiAgKgl0aGlzIG9yIE5VTEwgaWYgbm8gZW50cnkgaXMgZm91bmQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZQogICoJc2V0dGluZyBzZW1hcGhvcmUKICAqLwogCi1zdGF0aWMgaWRlX3NldHRpbmdzX3QgKmlkZV9maW5kX3NldHRpbmdfYnlfbmFtZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNoYXIgKm5hbWUpCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBpZGVfcHJvY19kZXZzZXQgKmlkZV9maW5kX3NldHRpbmcoY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCAqc3QsCisJCQkJCSAgICAgICBjaGFyICpuYW1lKQogewotCWlkZV9zZXR0aW5nc190ICpzZXR0aW5nID0gZHJpdmUtPnNldHRpbmdzOwotCi0Jd2hpbGUgKHNldHRpbmcpIHsKLQkJaWYgKHN0cmNtcChzZXR0aW5nLT5uYW1lLCBuYW1lKSA9PSAwKQorCXdoaWxlIChzdC0+bmFtZSkgeworCQlpZiAoc3RyY21wKHN0LT5uYW1lLCBuYW1lKSA9PSAwKQogCQkJYnJlYWs7Ci0JCXNldHRpbmcgPSBzZXR0aW5nLT5uZXh0OworCQlzdCsrOwogCX0KLQlyZXR1cm4gc2V0dGluZzsKKwlyZXR1cm4gc3QtPm5hbWUgPyBzdCA6IE5VTEw7CiB9CiAKIC8qKgpAQCAtMjcyLDI2ICsxNDksMjAgQEAKICAqCWJlIHRvbGQgYXBhcnQKICAqLwogCi1zdGF0aWMgaW50IGlkZV9yZWFkX3NldHRpbmcoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfc2V0dGluZ3NfdCAqc2V0dGluZykKK3N0YXRpYyBpbnQgaWRlX3JlYWRfc2V0dGluZyhpZGVfZHJpdmVfdCAqZHJpdmUsCisJCQkgICAgY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCAqc2V0dGluZykKIHsKLQlpbnQJCXZhbCA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKKwljb25zdCBzdHJ1Y3QgaWRlX2RldnNldCAqZHMgPSBzZXR0aW5nLT5zZXR0aW5nOworCWludCB2YWwgPSAtRUlOVkFMOwogCi0JaWYgKChzZXR0aW5nLT5ydyAmIFNFVFRJTkdfUkVBRCkpIHsKKwlpZiAoZHMtPmdldCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQlzd2l0Y2ggKHNldHRpbmctPmRhdGFfdHlwZSkgewotCQljYXNlIFRZUEVfQllURToKLQkJCXZhbCA9ICooKHU4ICopIHNldHRpbmctPmRhdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFlQRV9TSE9SVDoKLQkJCXZhbCA9ICooKHUxNiAqKSBzZXR0aW5nLT5kYXRhKTsKLQkJCWJyZWFrOwotCQljYXNlIFRZUEVfSU5UOgotCQkJdmFsID0gKigodTMyICopIHNldHRpbmctPmRhdGEpOwotCQkJYnJlYWs7Ci0JCX0KKwkJdmFsID0gZHMtPmdldChkcml2ZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CiAJfQorCiAJcmV0dXJuIHZhbDsKIH0KIApAQCAtMzEzLDMzICsxODQsMjMgQEAKICAqCVRoZSBjdXJyZW50IHNjaGVtZSBvZiBwb2xsaW5nIGlzIGtsdWRneSwgdGhvdWdoIHNhZmUgZW5vdWdoLgogICovCiAKLXN0YXRpYyBpbnQgaWRlX3dyaXRlX3NldHRpbmcoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfc2V0dGluZ3NfdCAqc2V0dGluZywgaW50IHZhbCkKK3N0YXRpYyBpbnQgaWRlX3dyaXRlX3NldHRpbmcoaWRlX2RyaXZlX3QgKmRyaXZlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0ICpzZXR0aW5nLCBpbnQgdmFsKQogeworCWNvbnN0IHN0cnVjdCBpZGVfZGV2c2V0ICpkcyA9IHNldHRpbmctPnNldHRpbmc7CisKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOwotCWlmIChzZXR0aW5nLT5zZXQpCi0JCXJldHVybiBzZXR0aW5nLT5zZXQoZHJpdmUsIHZhbCk7Ci0JaWYgKCEoc2V0dGluZy0+cncgJiBTRVRUSU5HX1dSSVRFKSkKKwlpZiAoIWRzLT5zZXQpCiAJCXJldHVybiAtRVBFUk07Ci0JaWYgKHZhbCA8IHNldHRpbmctPm1pbiB8fCB2YWwgPiBzZXR0aW5nLT5tYXgpCisJaWYgKChkcy0+ZmxhZ3MgJiBEU19TWU5DKQorCSAgICAmJiAodmFsIDwgc2V0dGluZy0+bWluIHx8IHZhbCA+IHNldHRpbmctPm1heCkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoZHJpdmUpKQotCQlyZXR1cm4gLUVCVVNZOwotCXN3aXRjaCAoc2V0dGluZy0+ZGF0YV90eXBlKSB7Ci0JY2FzZSBUWVBFX0JZVEU6Ci0JCSooKHU4ICopIHNldHRpbmctPmRhdGEpID0gdmFsOwotCQlicmVhazsKLQljYXNlIFRZUEVfU0hPUlQ6Ci0JCSooKHUxNiAqKSBzZXR0aW5nLT5kYXRhKSA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0lOVDoKLQkJKigodTMyICopIHNldHRpbmctPmRhdGEpID0gdmFsOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGlkZV9kZXZzZXRfZXhlY3V0ZShkcml2ZSwgZHMsIHZhbCk7CiB9CiAKK2lkZV9kZXZzZXRfZ2V0KHhmZXJfcmF0ZSwgY3VycmVudF9zcGVlZCk7CisKIHN0YXRpYyBpbnQgc2V0X3hmZXJfcmF0ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewogCWlkZV90YXNrX3QgdGFzazsKQEAgLTM0OSw3ICsyMTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbXNldCgmdGFzaywgMCwgc2l6ZW9mKHRhc2spKTsKLQl0YXNrLnRmLmNvbW1hbmQgPSBXSU5fU0VURkVBVFVSRVM7CisJdGFzay50Zi5jb21tYW5kID0gQVRBX0NNRF9TRVRfRkVBVFVSRVM7CiAJdGFzay50Zi5mZWF0dXJlID0gU0VURkVBVFVSRVNfWEZFUjsKIAl0YXNrLnRmLm5zZWN0ICAgPSAodTgpYXJnOwogCXRhc2sudGZfZmxhZ3MgPSBJREVfVEZMQUdfT1VUX0ZFQVRVUkUgfCBJREVfVEZMQUdfT1VUX05TRUNUIHwKQEAgLTM2NCwyOSArMjI1LDIzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoqCi0gKglpZGVfYWRkX2dlbmVyaWNfc2V0dGluZ3MJLQlnZW5lcmljIGlkZSBzZXR0aW5ncwotICoJQGRyaXZlOiBkcml2ZSBiZWluZyBjb25maWd1cmVkCi0gKgotICoJQWRkIHRoZSBnZW5lcmljIHBhcnRzIG9mIHRoZSBzeXN0ZW0gc2V0dGluZ3MgdG8gdGhlIC9wcm9jIGZpbGVzLgotICoJVGhlIGNhbGxlciBtdXN0IG5vdCBiZSBob2xkaW5nIHRoZSBpZGVfc2V0dGluZ19tdHguCi0gKi8KK2lkZV9kZXZzZXRfcncoY3VycmVudF9zcGVlZCwgeGZlcl9yYXRlKTsKK2lkZV9kZXZzZXRfcndfZmllbGQoaW5pdF9zcGVlZCwgaW5pdF9zcGVlZCk7CitpZGVfZGV2c2V0X3J3X2ZsYWcobmljZTEsIElERV9ERkxBR19OSUNFMSk7CitpZGVfZGV2c2V0X3J3X2ZpZWxkKG51bWJlciwgZG4pOwogCi12b2lkIGlkZV9hZGRfZ2VuZXJpY19zZXR0aW5ncyAoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotLyoKLSAqCQkJICBkcml2ZQkJc2V0dGluZyBuYW1lCQlyZWFkL3dyaXRlIGFjY2VzcwkJCQlkYXRhIHR5cGUJbWluCW1heAkJCQltdWxfZmFjdG9yCWRpdl9mYWN0b3IJZGF0YSBwb2ludGVyCQkJc2V0IGZ1bmN0aW9uCi0gKi8KLQlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJImlvXzMyYml0IiwJCWRyaXZlLT5ub19pb18zMmJpdCA/IFNFVFRJTkdfUkVBRCA6IFNFVFRJTkdfUlcsCVRZUEVfQllURSwJMCwJMSArIChTVVBQT1JUX1ZMQl9TWU5DIDw8IDEpLAkxLAkJMSwJCSZkcml2ZS0+aW9fMzJiaXQsCQlzZXRfaW9fMzJiaXQsCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkia2VlcHNldHRpbmdzIiwJCVNFVFRJTkdfUlcsCQkJCQlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCQkxLAkJJmRyaXZlLT5rZWVwX3NldHRpbmdzLAkJTlVMTCwJCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibmljZTEiLAkJU0VUVElOR19SVywJCQkJCVRZUEVfQllURSwJMCwJMSwJCQkJMSwJCTEsCQkmZHJpdmUtPm5pY2UxLAkJCU5VTEwsCQkwKTsKLQlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJInBpb19tb2RlIiwJCVNFVFRJTkdfV1JJVEUsCQkJCQlUWVBFX0JZVEUsCTAsCTI1NSwJCQkJMSwJCTEsCQlOVUxMLAkJCQlzZXRfcGlvX21vZGUsCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkidW5tYXNraXJxIiwJCWRyaXZlLT5ub191bm1hc2sgPyBTRVRUSU5HX1JFQUQgOiBTRVRUSU5HX1JXLAlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCQkxLAkJJmRyaXZlLT51bm1hc2ssCQkJTlVMTCwJCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkidXNpbmdfZG1hIiwJCVNFVFRJTkdfUlcsCQkJCQlUWVBFX0JZVEUsCTAsCTEsCQkJCTEsCQkxLAkJJmRyaXZlLT51c2luZ19kbWEsCQlzZXRfdXNpbmdfZG1hLAkwKTsKLQlfX2lkZV9hZGRfc2V0dGluZyhkcml2ZSwJImluaXRfc3BlZWQiLAkJU0VUVElOR19SVywJCQkJCVRZUEVfQllURSwJMCwJNzAsCQkJCTEsCQkxLAkJJmRyaXZlLT5pbml0X3NwZWVkLAkJTlVMTCwJCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiY3VycmVudF9zcGVlZCIsCVNFVFRJTkdfUlcsCQkJCQlUWVBFX0JZVEUsCTAsCTcwLAkJCQkxLAkJMSwJCSZkcml2ZS0+Y3VycmVudF9zcGVlZCwJCXNldF94ZmVyX3JhdGUsCTApOwotCV9faWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkibnVtYmVyIiwJCVNFVFRJTkdfUlcsCQkJCQlUWVBFX0JZVEUsCTAsCTMsCQkJCTEsCQkxLAkJJmRyaXZlLT5kbiwJCQlOVUxMLAkJMCk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCBpZGVfZ2VuZXJpY19zZXR0aW5nc1tdID0geworCUlERV9QUk9DX0RFVlNFVChjdXJyZW50X3NwZWVkLCAwLCA3MCksCisJSURFX1BST0NfREVWU0VUKGluaXRfc3BlZWQsIDAsIDcwKSwKKwlJREVfUFJPQ19ERVZTRVQoaW9fMzJiaXQsICAwLCAxICsgKFNVUFBPUlRfVkxCX1NZTkMgPDwgMSkpLAorCUlERV9QUk9DX0RFVlNFVChrZWVwc2V0dGluZ3MsIDAsIDEpLAorCUlERV9QUk9DX0RFVlNFVChuaWNlMSwgMCwgMSksCisJSURFX1BST0NfREVWU0VUKG51bWJlciwgMCwgMyksCisJSURFX1BST0NfREVWU0VUKHBpb19tb2RlLCAwLCAyNTUpLAorCUlERV9QUk9DX0RFVlNFVCh1bm1hc2tpcnEsIDAsIDEpLAorCUlERV9QUk9DX0RFVlNFVCh1c2luZ19kbWEsIDAsIDEpLAorCXsgMCB9LAorfTsKIAogc3RhdGljIHZvaWQgcHJvY19pZGVfc2V0dGluZ3Nfd2Fybih2b2lkKQogewpAQCAtNDAzLDE5ICsyNTgsMzIgQEAKIHN0YXRpYyBpbnQgcHJvY19pZGVfcmVhZF9zZXR0aW5ncwogCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKKwljb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0ICpzZXR0aW5nLCAqZywgKmQ7CisJY29uc3Qgc3RydWN0IGlkZV9kZXZzZXQgKmRzOwogCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOwotCWlkZV9zZXR0aW5nc190CSpzZXR0aW5nID0gKGlkZV9zZXR0aW5nc190ICopIGRyaXZlLT5zZXR0aW5nczsKIAljaGFyCQkqb3V0ID0gcGFnZTsKIAlpbnQJCWxlbiwgcmMsIG11bF9mYWN0b3IsIGRpdl9mYWN0b3I7CiAKIAlwcm9jX2lkZV9zZXR0aW5nc193YXJuKCk7CiAKIAltdXRleF9sb2NrKCZpZGVfc2V0dGluZ19tdHgpOworCWcgPSBpZGVfZ2VuZXJpY19zZXR0aW5nczsKKwlkID0gZHJpdmUtPnNldHRpbmdzOwogCW91dCArPSBzcHJpbnRmKG91dCwgIm5hbWVcdFx0XHR2YWx1ZVx0XHRtaW5cdFx0bWF4XHRcdG1vZGVcbiIpOwogCW91dCArPSBzcHJpbnRmKG91dCwgIi0tLS1cdFx0XHQtLS0tLVx0XHQtLS1cdFx0LS0tXHRcdC0tLS1cbiIpOwotCXdoaWxlIChzZXR0aW5nKSB7Ci0JCW11bF9mYWN0b3IgPSBzZXR0aW5nLT5tdWxfZmFjdG9yOwotCQlkaXZfZmFjdG9yID0gc2V0dGluZy0+ZGl2X2ZhY3RvcjsKKwl3aGlsZSAoZy0+bmFtZSB8fCAoZCAmJiBkLT5uYW1lKSkgeworCQkvKiByZWFkIHNldHRpbmdzIGluIHRoZSBhbHBoYWJldGljYWwgb3JkZXIgKi8KKwkJaWYgKGctPm5hbWUgJiYgZCAmJiBkLT5uYW1lKSB7CisJCQlpZiAoc3RyY21wKGQtPm5hbWUsIGctPm5hbWUpIDwgMCkKKwkJCQlzZXR0aW5nID0gZCsrOworCQkJZWxzZQorCQkJCXNldHRpbmcgPSBnKys7CisJCX0gZWxzZSBpZiAoZCAmJiBkLT5uYW1lKSB7CisJCQlzZXR0aW5nID0gZCsrOworCQl9IGVsc2UKKwkJCXNldHRpbmcgPSBnKys7CisJCW11bF9mYWN0b3IgPSBzZXR0aW5nLT5tdWxmID8gc2V0dGluZy0+bXVsZihkcml2ZSkgOiAxOworCQlkaXZfZmFjdG9yID0gc2V0dGluZy0+ZGl2ZiA/IHNldHRpbmctPmRpdmYoZHJpdmUpIDogMTsKIAkJb3V0ICs9IHNwcmludGYob3V0LCAiJS0yNHMiLCBzZXR0aW5nLT5uYW1lKTsKIAkJcmMgPSBpZGVfcmVhZF9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nKTsKIAkJaWYgKHJjID49IDApCkBAIC00MjMsMTIgKzI5MSwxMiBAQAogCQllbHNlCiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlLTE2cyIsICJ3cml0ZS1vbmx5Iik7CiAJCW91dCArPSBzcHJpbnRmKG91dCwgIiUtMTZkJS0xNmQiLCAoc2V0dGluZy0+bWluICogbXVsX2ZhY3RvciArIGRpdl9mYWN0b3IgLSAxKSAvIGRpdl9mYWN0b3IsIHNldHRpbmctPm1heCAqIG11bF9mYWN0b3IgLyBkaXZfZmFjdG9yKTsKLQkJaWYgKHNldHRpbmctPnJ3ICYgU0VUVElOR19SRUFEKQorCQlkcyA9IHNldHRpbmctPnNldHRpbmc7CisJCWlmIChkcy0+Z2V0KQogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiciIpOwotCQlpZiAoc2V0dGluZy0+cncgJiBTRVRUSU5HX1dSSVRFKQorCQlpZiAoZHMtPnNldCkKIAkJCW91dCArPSBzcHJpbnRmKG91dCwgInciKTsKIAkJb3V0ICs9IHNwcmludGYob3V0LCAiXG4iKTsKLQkJc2V0dGluZyA9IHNldHRpbmctPm5leHQ7CiAJfQogCWxlbiA9IG91dCAtIHBhZ2U7CiAJbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOwpAQCAtNDQyLDkgKzMxMCwxMCBAQAogewogCWlkZV9kcml2ZV90CSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKSBkYXRhOwogCWNoYXIJCW5hbWVbTUFYX0xFTiArIDFdOwotCWludAkJZm9yX3JlYWwgPSAwOworCWludAkJZm9yX3JlYWwgPSAwLCBtdWxfZmFjdG9yLCBkaXZfZmFjdG9yOwogCXVuc2lnbmVkIGxvbmcJbjsKLQlpZGVfc2V0dGluZ3NfdAkqc2V0dGluZzsKKworCWNvbnN0IHN0cnVjdCBpZGVfcHJvY19kZXZzZXQgKnNldHRpbmc7CiAJY2hhciAqYnVmLCAqczsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKQEAgLTUxMiwxMyArMzgxLDIxIEBACiAJCQl9CiAKIAkJCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0JCQlzZXR0aW5nID0gaWRlX2ZpbmRfc2V0dGluZ19ieV9uYW1lKGRyaXZlLCBuYW1lKTsKKwkJCS8qIGdlbmVyaWMgc2V0dGluZ3MgZmlyc3QsIHRoZW4gZHJpdmVyIHNwZWNpZmljIG9uZXMgKi8KKwkJCXNldHRpbmcgPSBpZGVfZmluZF9zZXR0aW5nKGlkZV9nZW5lcmljX3NldHRpbmdzLCBuYW1lKTsKIAkJCWlmICghc2V0dGluZykgewotCQkJCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKLQkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJCWlmIChkcml2ZS0+c2V0dGluZ3MpCisJCQkJCXNldHRpbmcgPSBpZGVfZmluZF9zZXR0aW5nKGRyaXZlLT5zZXR0aW5ncywgbmFtZSk7CisJCQkJaWYgKCFzZXR0aW5nKSB7CisJCQkJCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKKwkJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCQl9CiAJCQl9Ci0JCQlpZiAoZm9yX3JlYWwpCi0JCQkJaWRlX3dyaXRlX3NldHRpbmcoZHJpdmUsIHNldHRpbmcsIHZhbCAqIHNldHRpbmctPmRpdl9mYWN0b3IgLyBzZXR0aW5nLT5tdWxfZmFjdG9yKTsKKwkJCWlmIChmb3JfcmVhbCkgeworCQkJCW11bF9mYWN0b3IgPSBzZXR0aW5nLT5tdWxmID8gc2V0dGluZy0+bXVsZihkcml2ZSkgOiAxOworCQkJCWRpdl9mYWN0b3IgPSBzZXR0aW5nLT5kaXZmID8gc2V0dGluZy0+ZGl2Zihkcml2ZSkgOiAxOworCQkJCWlkZV93cml0ZV9zZXR0aW5nKGRyaXZlLCBzZXR0aW5nLCB2YWwgKiBkaXZfZmFjdG9yIC8gbXVsX2ZhY3Rvcik7CisJCQl9CiAJCQltdXRleF91bmxvY2soJmlkZV9zZXR0aW5nX210eCk7CiAJCX0KIAl9IHdoaWxlICghZm9yX3JlYWwrKyk7CkBAIC01NjEsMTEgKzQzOCwxMCBAQAogCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJY2hhcgkJKm0gPSAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdOwogCWludAkJbGVuOwogCi0JbGVuID0gc3ByaW50ZihwYWdlLCAiJS40MHNcbiIsCi0JCShpZCAmJiBpZC0+bW9kZWxbMF0pID8gKGNoYXIgKilpZC0+bW9kZWwgOiAiKG5vbmUpIik7CisJbGVuID0gc3ByaW50ZihwYWdlLCAiJS40MHNcbiIsIG1bMF0gPyBtIDogIihub25lKSIpOwogCVBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7CiB9CiAKQEAgLTY5MCw2ICs1NjYsMTAgQEAKIAogdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikKIHsKKwltdXRleF9sb2NrKCZpZGVfc2V0dGluZ19tdHgpOworCWRyaXZlLT5zZXR0aW5ncyA9IGRyaXZlci0+c2V0dGluZ3M7CisJbXV0ZXhfdW5sb2NrKCZpZGVfc2V0dGluZ19tdHgpOworCiAJaWRlX2FkZF9wcm9jX2VudHJpZXMoZHJpdmUtPnByb2MsIGRyaXZlci0+cHJvYywgZHJpdmUpOwogfQogCkBAIC03MjYsNyArNjA2LDcgQEAKIAkgKiBPVE9IIGJvdGggaWRlX3tyZWFkLHdyaXRlfV9zZXR0aW5nIGFyZSBvbmx5IGV2ZXIgdXNlZCB1bmRlcgogCSAqIGlkZV9zZXR0aW5nX210eC4KIAkgKi8KLQlhdXRvX3JlbW92ZV9zZXR0aW5ncyhkcml2ZSk7CisJZHJpdmUtPnNldHRpbmdzID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwogCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKIH0KQEAgLTc0Miw5ICs2MjIsNyBAQAogCWZvciAoZCA9IDA7IGQgPCBNQVhfRFJJVkVTOyBkKyspIHsKIAkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tkXTsKIAotCQlpZiAoIWRyaXZlLT5wcmVzZW50KQotCQkJY29udGludWU7Ci0JCWlmIChkcml2ZS0+cHJvYykKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID09IDAgfHwgZHJpdmUtPnByb2MpCiAJCQljb250aW51ZTsKIAogCQlkcml2ZS0+cHJvYyA9IHByb2NfbWtkaXIoZHJpdmUtPm5hbWUsIHBhcmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCAxYmNlODRiLi5kODc5Yzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTE1LDYgKzE1LDggQEAKICAqIERvY3VtZW50YXRpb24vaWRlL0NoYW5nZUxvZy5pZGUtdGFwZS4xOTk1LTIwMDIKICAqLwogCisjZGVmaW5lIERSVl9OQU1FICJpZGUtdGFwZSIKKwogI2RlZmluZSBJREVUQVBFX1ZFUlNJT04gIjEuMjAiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTU0LDggKzU2LDYgQEAKIAlEQkdfQ0hSREVWID0JCSgxIDw8IDIpLAogCS8qIGFsbCByZW1haW5pbmcgcHJvY2VkdXJlcyAqLwogCURCR19QUk9DUyA9CQkoMSA8PCAzKSwKLQkvKiBidWZmZXIgYWxsb2MgaW5mbyAocGNfc3RhY2sgJiBycV9zdGFjaykgKi8KLQlEQkdfUENSUV9TVEFDSyA9CSgxIDw8IDQpLAogfTsKIAogLyogZGVmaW5lIHRvIHNlZSBkZWJ1ZyBpbmZvICovCkBAIC04MSwyNiArODEsNiBAQAogI2RlZmluZSBJREVUQVBFX01BWF9QQ19SRVRSSUVTCQkzCiAKIC8qCi0gKiBXaXRoIGVhY2ggcGFja2V0IGNvbW1hbmQsIHdlIGFsbG9jYXRlIGEgYnVmZmVyIG9mIElERVRBUEVfUENfQlVGRkVSX1NJWkUKLSAqIGJ5dGVzLiBUaGlzIGlzIHVzZWQgZm9yIHNldmVyYWwgcGFja2V0IGNvbW1hbmRzIChOb3QgZm9yIFJFQUQvV1JJVEUgY29tbWFuZHMpCi0gKi8KLSNkZWZpbmUgSURFVEFQRV9QQ19CVUZGRVJfU0laRQkJMjU2Ci0KLS8qCi0gKglJbiB2YXJpb3VzIHBsYWNlcyBpbiB0aGUgZHJpdmVyLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHN0b3JhZ2UKLSAqCWZvciBwYWNrZXQgY29tbWFuZHMgYW5kIHJlcXVlc3RzLCB3aGljaCB3aWxsIHJlbWFpbiB2YWxpZCB3aGlsZQotICoJd2UgbGVhdmUgdGhlIGRyaXZlciB0byB3YWl0IGZvciBhbiBpbnRlcnJ1cHQgb3IgYSB0aW1lb3V0IGV2ZW50LgotICovCi0jZGVmaW5lIElERVRBUEVfUENfU1RBQ0sJCSgxMCArIElERVRBUEVfTUFYX1BDX1JFVFJJRVMpCi0KLS8qCi0gKiBTb21lIGRyaXZlcyAoZm9yIGV4YW1wbGUsIFNlYWdhdGUgU1RUMzQwMUEgVHJhdmFuKSByZXF1aXJlIGEgdmVyeSBsb25nCi0gKiB0aW1lb3V0LCBiZWNhdXNlIHRoZXkgZG9uJ3QgcmV0dXJuIGFuIGludGVycnVwdCBvciBjbGVhciB0aGVpciBidXN5IGJpdAotICogdW50aWwgYWZ0ZXIgdGhlIGNvbW1hbmQgY29tcGxldGVzIChldmVuIHJldGVuc2lvbiBjb21tYW5kcykuCi0gKi8KLSNkZWZpbmUgSURFVEFQRV9XQUlUX0NNRAkJKDkwMCpIWikKLQotLyoKICAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb2ludCBpbiB0aGUgaW50ZXJuYWwgdGFwZSBmaWZvCiAgKiBpbiB3aGljaCB3ZSB3aWxsIHN0YXJ0IHRvIHJlZmlsbCB0aGUgYnVmZmVyLiBEZWNyZWFzaW5nIHRoZSBmb2xsb3dpbmcKICAqIHBhcmFtZXRlciB3aWxsIGltcHJvdmUgdGhlIHN5c3RlbSdzIGxhdGVuY3kgYW5kIGludGVyYWN0aXZlIHJlc3BvbnNlLCB3aGlsZQpAQCAtMTcyLDIwICsxNTIsNiBAQAogI2RlZmluZSBJREVUQVBFX0xVX1JFVEVOU0lPTl9NQVNLCTIKICNkZWZpbmUgSURFVEFQRV9MVV9FT1RfTUFTSwkJNAogCi0vKgotICogU3BlY2lhbCByZXF1ZXN0cyBmb3Igb3VyIGJsb2NrIGRldmljZSBzdHJhdGVneSByb3V0aW5lLgotICoKLSAqIEluIG9yZGVyIHRvIHNlcnZpY2UgYSBjaGFyYWN0ZXIgZGV2aWNlIGNvbW1hbmQsIHdlIGFkZCBzcGVjaWFsIHJlcXVlc3RzIHRvCi0gKiB0aGUgdGFpbCBvZiBvdXIgYmxvY2sgZGV2aWNlIHJlcXVlc3QgcXVldWUgYW5kIHdhaXQgZm9yIHRoZWlyIGNvbXBsZXRpb24uCi0gKi8KLQotZW51bSB7Ci0JUkVRX0lERVRBUEVfUEMxCQk9ICgxIDw8IDApLCAvKiBwYWNrZXQgY29tbWFuZCAoZmlyc3Qgc3RhZ2UpICovCi0JUkVRX0lERVRBUEVfUEMyCQk9ICgxIDw8IDEpLCAvKiBwYWNrZXQgY29tbWFuZCAoc2Vjb25kIHN0YWdlKSAqLwotCVJFUV9JREVUQVBFX1JFQUQJPSAoMSA8PCAyKSwKLQlSRVFfSURFVEFQRV9XUklURQk9ICgxIDw8IDMpLAotfTsKLQogLyogRXJyb3IgY29kZXMgcmV0dXJuZWQgaW4gcnEtPmVycm9ycyB0byB0aGUgaGlnaGVyIHBhcnQgb2YgdGhlIGRyaXZlci4gKi8KICNkZWZpbmUgSURFVEFQRV9FUlJPUl9HRU5FUkFMCQkxMDEKICNkZWZpbmUgSURFVEFQRV9FUlJPUl9GSUxFTUFSSwkJMTAyCkBAIC0yMDYsMzEgKzE3MiwxNSBAQAogCXN0cnVjdCBrcmVmCWtyZWY7CiAKIAkvKgotCSAqCVNpbmNlIGEgdHlwaWNhbCBjaGFyYWN0ZXIgZGV2aWNlIG9wZXJhdGlvbiByZXF1aXJlcyBtb3JlCi0JICoJdGhhbiBvbmUgcGFja2V0IGNvbW1hbmQsIHdlIHByb3ZpZGUgaGVyZSBlbm91Z2ggbWVtb3J5Ci0JICoJZm9yIHRoZSBtYXhpbXVtIG9mIGludGVyY29ubmVjdGVkIHBhY2tldCBjb21tYW5kcy4KLQkgKglUaGUgcGFja2V0IGNvbW1hbmRzIGFyZSBzdG9yZWQgaW4gdGhlIGNpcmN1bGFyIGFycmF5IHBjX3N0YWNrLgotCSAqCXBjX3N0YWNrX2luZGV4IHBvaW50cyB0byB0aGUgbGFzdCB1c2VkIGVudHJ5LCBhbmQgd2FycHMgYXJvdW5kCi0JICoJdG8gdGhlIHN0YXJ0IHdoZW4gd2UgZ2V0IHRvIHRoZSBsYXN0IGFycmF5IGVudHJ5LgotCSAqCi0JICoJcGMgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3NlZCBwYWNrZXQgY29tbWFuZC4KLQkgKgogCSAqCWZhaWxlZF9wYyBwb2ludHMgdG8gdGhlIGxhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kLCBvciBjb250YWlucwogCSAqCU5VTEwgaWYgd2UgZG8gbm90IG5lZWQgdG8gcmV0cnkgYW55IHBhY2tldCBjb21tYW5kLiBUaGlzIGlzCiAJICoJcmVxdWlyZWQgc2luY2UgYW4gYWRkaXRpb25hbCBwYWNrZXQgY29tbWFuZCBpcyBuZWVkZWQgYmVmb3JlIHRoZQogCSAqCXJldHJ5LCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB3ZW50IHdyb25nLgogCSAqLwotCS8qIEN1cnJlbnQgcGFja2V0IGNvbW1hbmQgKi8KLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYzsKIAkvKiBMYXN0IGZhaWxlZCBwYWNrZXQgY29tbWFuZCAqLwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKmZhaWxlZF9wYzsKLQkvKiBQYWNrZXQgY29tbWFuZCBzdGFjayAqLwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGNfc3RhY2tbSURFVEFQRV9QQ19TVEFDS107Ci0JLyogTmV4dCBmcmVlIHBhY2tldCBjb21tYW5kIHN0b3JhZ2Ugc3BhY2UgKi8KLQlpbnQgcGNfc3RhY2tfaW5kZXg7Ci0Jc3RydWN0IHJlcXVlc3QgcnFfc3RhY2tbSURFVEFQRV9QQ19TVEFDS107Ci0JLyogV2UgaW1wbGVtZW50IGEgY2lyY3VsYXIgYXJyYXkgKi8KLQlpbnQgcnFfc3RhY2tfaW5kZXg7CisJLyogdXNlZCBieSBSRVFfSURFVEFQRV97UkVBRCxXUklURX0gcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHF1ZXVlZF9wYzsKIAogCS8qCiAJICogRFNDIHBvbGxpbmcgdmFyaWFibGVzLgpAQCAtMzE3LDExICsyNjcsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICppZGV0YXBlX3N5c2ZzX2NsYXNzOwogCi0jZGVmaW5lIHRvX2lkZV90YXBlKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGlkZV90YXBlX29iaiwga3JlZikKLQotI2RlZmluZSBpZGVfdGFwZV9nKGRpc2spIFwKLQljb250YWluZXJfb2YoKGRpc2spLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBpZGVfdGFwZV9vYmosIGRyaXZlcikKLQogc3RhdGljIHZvaWQgaWRlX3RhcGVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqKTsKIAogc3RhdGljIHN0cnVjdCBpZGVfdGFwZV9vYmogKmlkZV90YXBlX2dldChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKQEAgLTMyOSw3ICsyNzQsNyBAQAogCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBOVUxMOwogCiAJbXV0ZXhfbG9jaygmaWRldGFwZV9yZWZfbXV0ZXgpOwotCXRhcGUgPSBpZGVfdGFwZV9nKGRpc2spOworCXRhcGUgPSBpZGVfZHJ2X2coZGlzaywgaWRlX3RhcGVfb2JqKTsKIAlpZiAodGFwZSkgewogCQlpZiAoaWRlX2RldmljZV9nZXQodGFwZS0+ZHJpdmUpKQogCQkJdGFwZSA9IE5VTEw7CkBAIC0zNTYsOCArMzAxLDYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpZGVfdGFwZV9vYmogKmlkZXRhcGVfZGV2c1tNQVhfSFdJRlMgKiBNQVhfRFJJVkVTXTsKIAotI2RlZmluZSBpZGVfdGFwZV9mKGZpbGUpICgoZmlsZSktPnByaXZhdGVfZGF0YSkKLQogc3RhdGljIHN0cnVjdCBpZGVfdGFwZV9vYmogKmlkZV90YXBlX2NocmRldl9nZXQodW5zaWduZWQgaW50IGkpCiB7CiAJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IE5VTEw7CkBAIC00NTEsNDcgKzM5NCw2IEBACiB9CiAKIC8qCi0gKglpZGV0YXBlX25leHRfcGNfc3RvcmFnZSByZXR1cm5zIGEgcG9pbnRlciB0byBhIHBsYWNlIGluIHdoaWNoIHdlIGNhbgotICoJc2FmZWx5IHN0b3JlIGEgcGFja2V0IGNvbW1hbmQsIGV2ZW4gdGhvdWdoIHdlIGludGVuZCB0byBsZWF2ZSB0aGUKLSAqCWRyaXZlci4gQSBzdG9yYWdlIHNwYWNlIGZvciBhIG1heGltdW0gb2YgSURFVEFQRV9QQ19TVEFDSyBwYWNrZXQKLSAqCWNvbW1hbmRzIGlzIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgotICovCi1zdGF0aWMgc3RydWN0IGlkZV9hdGFwaV9wYyAqaWRldGFwZV9uZXh0X3BjX3N0b3JhZ2UoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JZGVidWdfbG9nKERCR19QQ1JRX1NUQUNLLCAicGNfc3RhY2tfaW5kZXg9JWRcbiIsIHRhcGUtPnBjX3N0YWNrX2luZGV4KTsKLQotCWlmICh0YXBlLT5wY19zdGFja19pbmRleCA9PSBJREVUQVBFX1BDX1NUQUNLKQotCQl0YXBlLT5wY19zdGFja19pbmRleCA9IDA7Ci0JcmV0dXJuICgmdGFwZS0+cGNfc3RhY2tbdGFwZS0+cGNfc3RhY2tfaW5kZXgrK10pOwotfQotCi0vKgotICoJaWRldGFwZV9uZXh0X3JxX3N0b3JhZ2UgaXMgdXNlZCBhbG9uZyB3aXRoIGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlLgotICoJU2luY2Ugd2UgcXVldWUgcGFja2V0IGNvbW1hbmRzIGluIHRoZSByZXF1ZXN0IHF1ZXVlLCB3ZSBuZWVkIHRvCi0gKglhbGxvY2F0ZSBhIHJlcXVlc3QsIGFsb25nIHdpdGggdGhlIGFsbG9jYXRpb24gb2YgYSBwYWNrZXQgY29tbWFuZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIFRoaXMgc2hvdWxkIGdldCBmaXhlZCB0byB1c2Uga21hbGxvYyguLiwgR0ZQX0FUT01JQykgICAgICAqCi0gKiAgZm9sbG93ZWQgbGF0ZXIgb24gYnkga2ZyZWUoKS4gICAtbWwgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHJlcXVlc3QgKmlkZXRhcGVfbmV4dF9ycV9zdG9yYWdlKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQotCWRlYnVnX2xvZyhEQkdfUENSUV9TVEFDSywgInJxX3N0YWNrX2luZGV4PSVkXG4iLCB0YXBlLT5ycV9zdGFja19pbmRleCk7Ci0KLQlpZiAodGFwZS0+cnFfc3RhY2tfaW5kZXggPT0gSURFVEFQRV9QQ19TVEFDSykKLQkJdGFwZS0+cnFfc3RhY2tfaW5kZXggPSAwOwotCXJldHVybiAoJnRhcGUtPnJxX3N0YWNrW3RhcGUtPnJxX3N0YWNrX2luZGV4KytdKTsKLX0KLQotLyoKICAqIGNhbGxlZCBvbiBlYWNoIGZhaWxlZCBwYWNrZXQgY29tbWFuZCByZXRyeSB0byBhbmFseXplIHRoZSByZXF1ZXN0IHNlbnNlLiBXZQogICogY3VycmVudGx5IGRvIG5vdCB1dGlsaXplIHRoaXMgaW5mb3JtYXRpb24uCiAgKi8KQEAgLTYwNiwxNCArNTA4LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZV90YXBlX2NhbGxiYWNrKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyB2b2lkIGlkZV90YXBlX2hhbmRsZV9kc2MoaWRlX2RyaXZlX3QgKik7CisKK3N0YXRpYyB2b2lkIGlkZV90YXBlX2NhbGxiYWNrKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGRzYykKIHsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IHRhcGUtPnBjOworCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJpdmUtPnBjOwogCWludCB1cHRvZGF0ZSA9IHBjLT5lcnJvciA/IDAgOiAxOwogCiAJZGVidWdfbG9nKERCR19QUk9DUywgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CiAKKwlpZiAoZHNjKQorCQlpZGVfdGFwZV9oYW5kbGVfZHNjKGRyaXZlKTsKKwogCWlmICh0YXBlLT5mYWlsZWRfcGMgPT0gcGMpCiAJCXRhcGUtPmZhaWxlZF9wYyA9IE5VTEw7CiAKQEAgLTY0Miw3ICs1NDksNyBAQAogCQlpZiAocGMtPmVycm9yKQogCQkJdXB0b2RhdGUgPSBwYy0+ZXJyb3I7CiAJfSBlbHNlIGlmIChwYy0+Y1swXSA9PSBSRUFEX1BPU0lUSU9OICYmIHVwdG9kYXRlKSB7Ci0JCXU4ICpyZWFkcG9zID0gdGFwZS0+cGMtPmJ1ZjsKKwkJdTggKnJlYWRwb3MgPSBwYy0+YnVmOwogCiAJCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJCT1AgLSAlc1xuIiwKIAkJCQkocmVhZHBvc1swXSAmIDB4ODApID8gIlllcyIgOiAiTm8iKTsKQEAgLTY2Nyw3OSArNTc0LDYgQEAKIAlpZGV0YXBlX2VuZF9yZXF1ZXN0KGRyaXZlLCB1cHRvZGF0ZSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZXRhcGVfaW5pdF9wYyhzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKLXsKLQltZW1zZXQocGMtPmMsIDAsIDEyKTsKLQlwYy0+cmV0cmllcyA9IDA7Ci0JcGMtPmZsYWdzID0gMDsKLQlwYy0+cmVxX3hmZXIgPSAwOwotCXBjLT5idWYgPSBwYy0+cGNfYnVmOwotCXBjLT5idWZfc2l6ZSA9IElERVRBUEVfUENfQlVGRkVSX1NJWkU7Ci0JcGMtPmJoID0gTlVMTDsKLQlwYy0+Yl9kYXRhID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfcmVxdWVzdF9zZW5zZV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCi17Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKLQlwYy0+Y1swXSA9IFJFUVVFU1RfU0VOU0U7Ci0JcGMtPmNbNF0gPSAyMDsKLQlwYy0+cmVxX3hmZXIgPSAyMDsKLX0KLQotc3RhdGljIHZvaWQgaWRldGFwZV9pbml0X3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgdTggY21kKQotewotCWJsa19ycV9pbml0KE5VTEwsIHJxKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCXJxLT5jbWRbMTNdID0gY21kOwotfQotCi0vKgotICogR2VuZXJhdGUgYSBuZXcgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCBpbiBmcm9udCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwgYmVmb3JlCi0gKiB0aGUgY3VycmVudCByZXF1ZXN0LCBzbyB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LCBvbiB0aGUgbmV4dAotICogcGFzcyB0aHJvdWdoIHRoZSBkcml2ZXIuIFRoZSBmdW5jdGlvbiBiZWxvdyBpcyBjYWxsZWQgZnJvbSB0aGUgcmVxdWVzdAotICogaGFuZGxpbmcgcGFydCBvZiB0aGUgZHJpdmVyICh0aGUgImJvdHRvbSIgcGFydCkuIFNhZmUgc3RvcmFnZSBmb3IgdGhlIHJlcXVlc3QKLSAqIHNob3VsZCBiZSBhbGxvY2F0ZWQgd2l0aCBpZGVfdGFwZV9uZXh0X3twYyxycX1fc3RvcmFnZSgpIHByaW9yIHRvIHRoYXQuCi0gKgotICogTWVtb3J5IGZvciB0aG9zZSByZXF1ZXN0cyBpcyBwcmUtYWxsb2NhdGVkIGF0IGluaXRpYWxpemF0aW9uIHRpbWUsIGFuZCBpcwotICogbGltaXRlZCB0byBJREVUQVBFX1BDX1NUQUNLIHJlcXVlc3RzLiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IKLSAqIHRoZSBtYXhpbXVtIHBvc3NpYmxlIG51bWJlciBvZiBpbnRlci1kZXBlbmRlbnQgcGFja2V0IGNvbW1hbmRzLgotICoKLSAqIFRoZSBoaWdoZXIgbGV2ZWwgb2YgdGhlIGRyaXZlciAtIFRoZSBpb2N0bCBoYW5kbGVyIGFuZCB0aGUgY2hhcmFjdGVyIGRldmljZQotICogaGFuZGxpbmcgZnVuY3Rpb25zIHNob3VsZCBxdWV1ZSByZXF1ZXN0IHRvIHRoZSBsb3dlciBsZXZlbCBwYXJ0IGFuZCB3YWl0IGZvcgotICogdGhlaXIgY29tcGxldGlvbiB1c2luZyBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwgb3IgaWRldGFwZV9xdWV1ZV9yd190YWlsLgotICovCi1zdGF0aWMgdm9pZCBpZGV0YXBlX3F1ZXVlX3BjX2hlYWQoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKLQkJCQkgIHN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JaWRldGFwZV9pbml0X3JxKHJxLCBSRVFfSURFVEFQRV9QQzEpOwotCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1BSRUVNUFQ7Ci0JcnEtPmJ1ZmZlciA9IChjaGFyICopIHBjOwotCXJxLT5ycV9kaXNrID0gdGFwZS0+ZGlzazsKLQltZW1jcHkocnEtPmNtZCwgcGMtPmMsIDEyKTsKLQlpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCBycSk7Ci19Ci0KLS8qCi0gKglpZGV0YXBlX3JldHJ5X3BjIGlzIGNhbGxlZCB3aGVuIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBkdXJpbmcgdGhlCi0gKglsYXN0IHBhY2tldCBjb21tYW5kLiBXZSBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgcGFja2V0IGNvbW1hbmQgaW4KLSAqCXRoZSBoZWFkIG9mIHRoZSByZXF1ZXN0IGxpc3QuCi0gKi8KLXN0YXRpYyB2b2lkIGlkZXRhcGVfcmV0cnlfcGMoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQotCSh2b2lkKWlkZV9yZWFkX2Vycm9yKGRyaXZlKTsKLQlwYyA9IGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKLQlycSA9IGlkZXRhcGVfbmV4dF9ycV9zdG9yYWdlKGRyaXZlKTsKLQlpZGV0YXBlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChwYyk7Ci0Jc2V0X2JpdChJREVfQUZMQUdfSUdOT1JFX0RTQywgJmRyaXZlLT5hdGFwaV9mbGFncyk7Ci0JaWRldGFwZV9xdWV1ZV9wY19oZWFkKGRyaXZlLCBwYywgcnEpOwotfQotCiAvKgogICogUG9zdHBvbmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBzbyB0aGF0IGlkZS5jIHdpbGwgYmUgYWJsZSB0byBzZXJ2aWNlIHJlcXVlc3RzCiAgKiBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIGh3Z3JvdXAgd2hpbGUgd2UgYXJlIHBvbGxpbmcgZm9yIERTQy4KQEAgLTc2Niw0NCArNjAwLDMwIEBACiAJaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGRyaXZlKTsKIH0KIAotc3RhdGljIHZvaWQgaWRlX3RhcGVfaW9fYnVmZmVycyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAorc3RhdGljIGludCBpZGVfdGFwZV9pb19idWZmZXJzKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsCiAJCQkJdW5zaWduZWQgaW50IGJjb3VudCwgaW50IHdyaXRlKQogewogCWlmICh3cml0ZSkKIAkJaWRldGFwZV9vdXRwdXRfYnVmZmVycyhkcml2ZSwgcGMsIGJjb3VudCk7CiAJZWxzZQogCQlpZGV0YXBlX2lucHV0X2J1ZmZlcnMoZHJpdmUsIHBjLCBiY291bnQpOwotfQogCi0vKgotICogVGhpcyBpcyB0aGUgdXN1YWwgaW50ZXJydXB0IGhhbmRsZXIgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGEgcGFja2V0Ci0gKiBjb21tYW5kLiBXZSB3aWxsIHRyYW5zZmVyIHNvbWUgb2YgdGhlIGRhdGEgKGFzIHJlcXVlc3RlZCBieSB0aGUgZHJpdmUpIGFuZAotICogd2lsbCByZS1wb2ludCBpbnRlcnJ1cHQgaGFuZGxlciB0byB1cy4gV2hlbiBkYXRhIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCB3ZQotICogd2lsbCBhY3QgYWNjb3JkaW5nIHRvIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGJlZm9yZQotICogaWRldGFwZV9pc3N1ZV9wYy4KLSAqLwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGV0YXBlX3BjX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JcmV0dXJuIGlkZV9wY19pbnRyKGRyaXZlLCB0YXBlLT5wYywgaWRldGFwZV9wY19pbnRyLCBJREVUQVBFX1dBSVRfQ01ELAotCQkJICAgTlVMTCwgaWRldGFwZV91cGRhdGVfYnVmZmVycywgaWRldGFwZV9yZXRyeV9wYywKLQkJCSAgIGlkZV90YXBlX2hhbmRsZV9kc2MsIGlkZV90YXBlX2lvX2J1ZmZlcnMpOworCXJldHVybiBiY291bnQ7CiB9CiAKIC8qCiAgKiBQYWNrZXQgQ29tbWFuZCBJbnRlcmZhY2UKICAqCi0gKiBUaGUgY3VycmVudCBQYWNrZXQgQ29tbWFuZCBpcyBhdmFpbGFibGUgaW4gdGFwZS0+cGMsIGFuZCB3aWxsIG5vdCBjaGFuZ2UKKyAqIFRoZSBjdXJyZW50IFBhY2tldCBDb21tYW5kIGlzIGF2YWlsYWJsZSBpbiBkcml2ZS0+cGMsIGFuZCB3aWxsIG5vdCBjaGFuZ2UKICAqIHVudGlsIHdlIGZpbmlzaCBoYW5kbGluZyBpdC4gRWFjaCBwYWNrZXQgY29tbWFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYQogICogY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21tYW5kIGlzIGZpbmlzaGVkLgogICoKICAqIFRoZSBoYW5kbGluZyB3aWxsIGJlIGRvbmUgaW4gdGhyZWUgc3RhZ2VzOgogICoKICAqIDEuIGlkZXRhcGVfaXNzdWVfcGMgd2lsbCBzZW5kIHRoZSBwYWNrZXQgY29tbWFuZCB0byB0aGUgZHJpdmUsIGFuZCB3aWxsIHNldAotICogdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIGlkZXRhcGVfcGNfaW50ci4KKyAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBpZGVfcGNfaW50ci4KICAqCi0gKiAyLiBPbiBlYWNoIGludGVycnVwdCwgaWRldGFwZV9wY19pbnRyIHdpbGwgYmUgY2FsbGVkLiBUaGlzIHN0ZXAgd2lsbCBiZQorICogMi4gT24gZWFjaCBpbnRlcnJ1cHQsIGlkZV9wY19pbnRyIHdpbGwgYmUgY2FsbGVkLiBUaGlzIHN0ZXAgd2lsbCBiZQogICogcmVwZWF0ZWQgdW50aWwgdGhlIGRldmljZSBzaWduYWxzIHVzIHRoYXQgbm8gbW9yZSBpbnRlcnJ1cHRzIHdpbGwgYmUgaXNzdWVkLgogICoKICAqIDMuIEFUQVBJIFRhcGUgbWVkaWEgYWNjZXNzIGNvbW1hbmRzIGhhdmUgaW1tZWRpYXRlIHN0YXR1cyB3aXRoIGEgZGVsYXllZApAQCAtODI3LDIwICs2NDcsMTMgQEAKICAqIGFnYWluLCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHRoZW4gd2Ugd2lsbCBoYW5kbGUgdGhlIG5leHQKICAqIHJlcXVlc3QuCiAgKi8KLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRldGFwZV90cmFuc2Zlcl9wYyhpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gaWRlX3RyYW5zZmVyX3BjKGRyaXZlLCB0YXBlLT5wYywgaWRldGFwZV9wY19pbnRyLAotCQkJICAgICAgIElERVRBUEVfV0FJVF9DTUQsIE5VTEwpOwotfQogCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXRhcGVfaXNzdWVfcGMoaWRlX2RyaXZlX3QgKmRyaXZlLAogCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKIHsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAotCWlmICh0YXBlLT5wYy0+Y1swXSA9PSBSRVFVRVNUX1NFTlNFICYmCisJaWYgKGRyaXZlLT5wYy0+Y1swXSA9PSBSRVFVRVNUX1NFTlNFICYmCiAJICAgIHBjLT5jWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogcG9zc2libGUgaWRlLXRhcGUuYyBidWcgLSAiCiAJCQkiVHdvIHJlcXVlc3Qgc2Vuc2UgaW4gc2VyaWFsIHdlcmUgaXNzdWVkXG4iKTsKQEAgLTg0OCw4ICs2NjEsOSBAQAogCiAJaWYgKHRhcGUtPmZhaWxlZF9wYyA9PSBOVUxMICYmIHBjLT5jWzBdICE9IFJFUVVFU1RfU0VOU0UpCiAJCXRhcGUtPmZhaWxlZF9wYyA9IHBjOworCiAJLyogU2V0IHRoZSBjdXJyZW50IHBhY2tldCBjb21tYW5kICovCi0JdGFwZS0+cGMgPSBwYzsKKwlkcml2ZS0+cGMgPSBwYzsKIAogCWlmIChwYy0+cmV0cmllcyA+IElERVRBUEVfTUFYX1BDX1JFVFJJRVMgfHwKIAkJKHBjLT5mbGFncyAmIFBDX0ZMQUdfQUJPUlQpKSB7CkBAIC04NzMsMjEgKzY4NywyMCBAQAogCQkJcGMtPmVycm9yID0gSURFVEFQRV9FUlJPUl9HRU5FUkFMOwogCQl9CiAJCXRhcGUtPmZhaWxlZF9wYyA9IE5VTEw7Ci0JCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSk7CisJCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgMCk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAJZGVidWdfbG9nKERCR19TRU5TRSwgIlJldHJ5ICMlZCwgY21kID0gJTAyWFxuIiwgcGMtPnJldHJpZXMsIHBjLT5jWzBdKTsKIAogCXBjLT5yZXRyaWVzKys7CiAKLQlyZXR1cm4gaWRlX2lzc3VlX3BjKGRyaXZlLCBwYywgaWRldGFwZV90cmFuc2Zlcl9wYywKLQkJCSAgICBJREVUQVBFX1dBSVRfQ01ELCBOVUxMKTsKKwlyZXR1cm4gaWRlX2lzc3VlX3BjKGRyaXZlLCBXQUlUX1RBUEVfQ01ELCBOVUxMKTsKIH0KIAogLyogQSBtb2RlIHNlbnNlIGNvbW1hbmQgaXMgdXNlZCB0byAic2Vuc2UiIHRhcGUgcGFyYW1ldGVycy4gKi8KIHN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX21vZGVfc2Vuc2VfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCB1OCBwYWdlX2NvZGUpCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBNT0RFX1NFTlNFOwogCWlmIChwYWdlX2NvZGUgIT0gSURFVEFQRV9CTE9DS19ERVNDUklQVE9SKQogCQkvKiBEQkQgPSAxIC0gRG9uJ3QgcmV0dXJuIGJsb2NrIGRlc2NyaXB0b3JzICovCkBAIC05MTUsMTkgKzcyOCwxOSBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IHRhcGUtPnBjOworCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJpdmUtPnBjOwogCXU4IHN0YXQ7CiAKIAlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmIChzdGF0ICYgU0VFS19TVEFUKSB7Ci0JCWlmIChzdGF0ICYgRVJSX1NUQVQpIHsKKwlpZiAoc3RhdCAmIEFUQV9EU0MpIHsKKwkJaWYgKHN0YXQgJiBBVEFfRVJSKSB7CiAJCQkvKiBFcnJvciBkZXRlY3RlZCAqLwogCQkJaWYgKHBjLT5jWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkKIAkJCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogSS9PIGVycm9yLCAiLAogCQkJCQkJdGFwZS0+bmFtZSk7CiAJCQkvKiBSZXRyeSBvcGVyYXRpb24gKi8KLQkJCWlkZXRhcGVfcmV0cnlfcGMoZHJpdmUpOworCQkJaWRlX3JldHJ5X3BjKGRyaXZlLCB0YXBlLT5kaXNrKTsKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKIAkJfQogCQlwYy0+ZXJyb3IgPSAwOwpAQCAtOTM1LDcgKzc0OCw3IEBACiAJCXBjLT5lcnJvciA9IElERVRBUEVfRVJST1JfR0VORVJBTDsKIAkJdGFwZS0+ZmFpbGVkX3BjID0gTlVMTDsKIAl9Ci0JZHJpdmUtPnBjX2NhbGxiYWNrKGRyaXZlKTsKKwlkcml2ZS0+cGNfY2FsbGJhY2soZHJpdmUsIDApOwogCXJldHVybiBpZGVfc3RvcHBlZDsKIH0KIApAQCAtOTQ2LDcgKzc1OSw3IEBACiAJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gKHN0cnVjdCBpZGV0YXBlX2JoICopcnEtPnNwZWNpYWw7CiAJdW5zaWduZWQgaW50IGxlbmd0aCA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnM7CiAKLQlpZGV0YXBlX2luaXRfcGMocGMpOworCWlkZV9pbml0X3BjKHBjKTsKIAlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGxlbmd0aCksICh1bnNpZ25lZCBpbnQgKikgJnBjLT5jWzFdKTsKIAlwYy0+Y1sxXSA9IDE7CiAJcGMtPmJoID0gYmg7CkBAIC05NzgsOSArNzkxLDEwIEBACiAJc3RydWN0IHJlcXVlc3QgKnBvc3Rwb25lZF9ycSA9IHRhcGUtPnBvc3Rwb25lZF9ycTsKIAl1OCBzdGF0OwogCi0JZGVidWdfbG9nKERCR19TRU5TRSwgInNlY3RvcjogJWxkLCBucl9zZWN0b3JzOiAlbGQsIgotCQkJIiBjdXJyZW50X25yX3NlY3RvcnM6ICVkXG4iLAotCQkJcnEtPnNlY3RvciwgcnEtPm5yX3NlY3RvcnMsIHJxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJzZWN0b3I6ICVsbHUsIG5yX3NlY3RvcnM6ICVsdSwiCisJCQkiIGN1cnJlbnRfbnJfc2VjdG9yczogJXVcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXJxLT5zZWN0b3IsIHJxLT5ucl9zZWN0b3JzLAorCQkJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CiAKIAlpZiAoIWJsa19zcGVjaWFsX3JlcXVlc3QocnEpKSB7CiAJCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGJ1ZmZlciBjYWNoZSBvcmlnaW5hdGVkIHJlcXVlc3RzLiAqLwpAQCAtOTkxLDcgKzgwNSw3IEBACiAJfQogCiAJLyogUmV0cnkgYSBmYWlsZWQgcGFja2V0IGNvbW1hbmQgKi8KLQlpZiAodGFwZS0+ZmFpbGVkX3BjICYmIHRhcGUtPnBjLT5jWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKKwlpZiAodGFwZS0+ZmFpbGVkX3BjICYmIGRyaXZlLT5wYy0+Y1swXSA9PSBSRVFVRVNUX1NFTlNFKSB7CiAJCXBjID0gdGFwZS0+ZmFpbGVkX3BjOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDEyLDE2ICs4MjYsMTcgQEAKIAkgKi8KIAlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAotCWlmICghZHJpdmUtPmRzY19vdmVybGFwICYmICEocnEtPmNtZFsxM10gJiBSRVFfSURFVEFQRV9QQzIpKQorCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19EU0NfT1ZFUkxBUCkgPT0gMCAmJgorCSAgICAocnEtPmNtZFsxM10gJiBSRVFfSURFVEFQRV9QQzIpID09IDApCiAJCXNldF9iaXQoSURFX0FGTEFHX0lHTk9SRV9EU0MsICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwogCi0JaWYgKGRyaXZlLT5wb3N0X3Jlc2V0ID09IDEpIHsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QT1NUX1JFU0VUKSB7CiAJCXNldF9iaXQoSURFX0FGTEFHX0lHTk9SRV9EU0MsICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwotCQlkcml2ZS0+cG9zdF9yZXNldCA9IDA7CisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19QT1NUX1JFU0VUOwogCX0KIAogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KElERV9BRkxBR19JR05PUkVfRFNDLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKSAmJgotCSAgICAoc3RhdCAmIFNFRUtfU1RBVCkgPT0gMCkgeworCSAgICAoc3RhdCAmIEFUQV9EU0MpID09IDApIHsKIAkJaWYgKHBvc3Rwb25lZF9ycSA9PSBOVUxMKSB7CiAJCQl0YXBlLT5kc2NfcG9sbGluZ19zdGFydCA9IGppZmZpZXM7CiAJCQl0YXBlLT5kc2NfcG9sbF9mcmVxID0gdGFwZS0+YmVzdF9kc2NfcndfZnJlcTsKQEAgLTEwNDMsMTIgKzg1OCwxMiBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCWlmIChycS0+Y21kWzEzXSAmIFJFUV9JREVUQVBFX1JFQUQpIHsKLQkJcGMgPSBpZGV0YXBlX25leHRfcGNfc3RvcmFnZShkcml2ZSk7CisJCXBjID0gJnRhcGUtPnF1ZXVlZF9wYzsKIAkJaWRlX3RhcGVfY3JlYXRlX3J3X2NtZCh0YXBlLCBwYywgcnEsIFJFQURfNik7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAocnEtPmNtZFsxM10gJiBSRVFfSURFVEFQRV9XUklURSkgewotCQlwYyA9IGlkZXRhcGVfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKKwkJcGMgPSAmdGFwZS0+cXVldWVkX3BjOwogCQlpZGVfdGFwZV9jcmVhdGVfcndfY21kKHRhcGUsIHBjLCBycSwgV1JJVEVfNik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyMzUsNzcgKzEwNTAsMzAgQEAKIHN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3dyaXRlX2ZpbGVtYXJrX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsCiAJCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCBpbnQgd3JpdGVfZmlsZW1hcmspCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBXUklURV9GSUxFTUFSS1M7CiAJcGMtPmNbNF0gPSB3cml0ZV9maWxlbWFyazsKIAlwYy0+ZmxhZ3MgfD0gUENfRkxBR19XQUlUX0ZPUl9EU0M7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3Rlc3RfdW5pdF9yZWFkeV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCi17Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKLQlwYy0+Y1swXSA9IFRFU1RfVU5JVF9SRUFEWTsKLX0KLQotLyoKLSAqIFdlIGFkZCBhIHNwZWNpYWwgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCB0byB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwgYW5kCi0gKiB3YWl0IGZvciBpdCB0byBiZSBzZXJ2aWNlZC4gVGhpcyBpcyBub3QgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSByZXF1ZXN0Ci0gKiBoYW5kbGluZyBwYXJ0IG9mIHRoZSBkcml2ZXIhIFdlIGFsbG9jYXRlIGhlcmUgZGF0YSBvbiB0aGUgc3RhY2sgYW5kIGl0IGlzCi0gKiB2YWxpZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZC4gVGhpcyBpcyBub3QgdGhlIGNhc2UgZm9yIHRoZSBib3R0b20gcGFydAotICogb2YgdGhlIGRyaXZlciwgd2hlcmUgd2UgYXJlIGFsd2F5cyBsZWF2aW5nIHRoZSBmdW5jdGlvbnMgdG8gd2FpdCBmb3IgYW4KLSAqIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50LgotICoKLSAqIEZyb20gdGhlIGJvdHRvbSBwYXJ0IG9mIHRoZSBkcml2ZXIsIHdlIHNob3VsZCBhbGxvY2F0ZSBzYWZlIG1lbW9yeSB1c2luZwotICogaWRldGFwZV9uZXh0X3BjX3N0b3JhZ2UoKSBhbmQgaWRlX3RhcGVfbmV4dF9ycV9zdG9yYWdlKCksIGFuZCBhZGQgdGhlIHJlcXVlc3QKLSAqIHRvIHRoZSByZXF1ZXN0IGxpc3Qgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBiZSBzZXJ2aWNlZCEgSW4gdGhhdCBjYXNlLCB3ZQotICogdXN1YWxseSB1c2UgaWRldGFwZV9xdWV1ZV9wY19oZWFkKCkuCi0gKi8KLXN0YXRpYyBpbnQgaWRldGFwZV9xdWV1ZV9wY190YWlsKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCi17Ci0Jc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0JaW50IGVycm9yOwotCi0JcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCXJxLT5jbWRbMTNdID0gUkVRX0lERVRBUEVfUEMxOwotCXJxLT5idWZmZXIgPSAoY2hhciAqKXBjOwotCW1lbWNweShycS0+Y21kLCBwYy0+YywgMTIpOwotCWVycm9yID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCB0YXBlLT5kaXNrLCBycSwgMCk7Ci0JYmxrX3B1dF9yZXF1ZXN0KHJxKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsCi0JCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLCBpbnQgY21kKQotewotCWlkZXRhcGVfaW5pdF9wYyhwYyk7Ci0JcGMtPmNbMF0gPSBTVEFSVF9TVE9QOwotCXBjLT5jWzRdID0gY21kOwotCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RTQzsKLX0KLQogc3RhdGljIGludCBpZGV0YXBlX3dhaXRfcmVhZHkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7CiAJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGlkZV9hdGFwaV9wYyBwYzsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHRhcGUtPmRpc2s7CiAJaW50IGxvYWRfYXR0ZW1wdGVkID0gMDsKIAogCS8qIFdhaXQgZm9yIHRoZSB0YXBlIHRvIGJlY29tZSByZWFkeSAqLwogCXNldF9iaXQoSURFX0FGTEFHX01FRElVTV9QUkVTRU5ULCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKIAl0aW1lb3V0ICs9IGppZmZpZXM7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWlkZXRhcGVfY3JlYXRlX3Rlc3RfdW5pdF9yZWFkeV9jbWQoJnBjKTsKLQkJaWYgKCFpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpCisJCWlmIChpZGVfZG9fdGVzdF91bml0X3JlYWR5KGRyaXZlLCBkaXNrKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCWlmICgodGFwZS0+c2Vuc2Vfa2V5ID09IDIgJiYgdGFwZS0+YXNjID09IDQgJiYgdGFwZS0+YXNjcSA9PSAyKQogCQkgICAgfHwgKHRhcGUtPmFzYyA9PSAweDNBKSkgewogCQkJLyogbm8gbWVkaWEgKi8KIAkJCWlmIChsb2FkX2F0dGVtcHRlZCkKIAkJCQlyZXR1cm4gLUVOT01FRElVTTsKLQkJCWlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZChkcml2ZSwgJnBjLAotCQkJCQkJCUlERVRBUEVfTFVfTE9BRF9NQVNLKTsKLQkJCWlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJCWlkZV9kb19zdGFydF9zdG9wKGRyaXZlLCBkaXNrLCBJREVUQVBFX0xVX0xPQURfTUFTSyk7CiAJCQlsb2FkX2F0dGVtcHRlZCA9IDE7CiAJCS8qIG5vdCBhYm91dCB0byBiZSByZWFkeSAqLwogCQl9IGVsc2UgaWYgKCEodGFwZS0+c2Vuc2Vfa2V5ID09IDIgJiYgdGFwZS0+YXNjID09IDQgJiYKQEAgLTEzMTgsMTEgKzEwODYsMTIgQEAKIAogc3RhdGljIGludCBpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CisJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCWludCByYzsKIAogCWlkZXRhcGVfY3JlYXRlX3dyaXRlX2ZpbGVtYXJrX2NtZChkcml2ZSwgJnBjLCAwKTsKLQlyYyA9IGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwlyYyA9IGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCB0YXBlLT5kaXNrLCAmcGMpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCWlkZXRhcGVfd2FpdF9yZWFkeShkcml2ZSwgNjAgKiA1ICogSFopOwpAQCAtMTMzMSw3ICsxMTAwLDcgQEAKIAogc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfcmVhZF9wb3NpdGlvbl9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBSRUFEX1BPU0lUSU9OOwogCXBjLT5yZXFfeGZlciA9IDIwOwogfQpAQCAtMTM0NSw3ICsxMTE0LDcgQEAKIAlkZWJ1Z19sb2coREJHX1BST0NTLCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKIAogCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7Ci0JaWYgKGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIHRhcGUtPmRpc2ssICZwYykpCiAJCXJldHVybiAtMTsKIAlwb3NpdGlvbiA9IHRhcGUtPmZpcnN0X2ZyYW1lOwogCXJldHVybiBwb3NpdGlvbjsKQEAgLTEzNTUsNyArMTEyNCw3IEBACiAJCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAogCQl1bnNpZ25lZCBpbnQgYmxvY2ssIHU4IHBhcnRpdGlvbiwgaW50IHNraXApCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBQT1NJVElPTl9UT19FTEVNRU5UOwogCXBjLT5jWzFdID0gMjsKIAlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGJsb2NrKSwgKHVuc2lnbmVkIGludCAqKSAmcGMtPmNbM10pOwpAQCAtMTM2MywyMSArMTEzMiw2IEBACiAJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfV0FJVF9GT1JfRFNDOwogfQogCi1zdGF0aWMgaW50IGlkZXRhcGVfY3JlYXRlX3ByZXZlbnRfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwKLQkJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIGludCBwcmV2ZW50KQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JLyogZGV2aWNlIHN1cHBvcnRzIGxvY2tpbmcgYWNjb3JkaW5nIHRvIGNhcGFiaWxpdGllcyBwYWdlICovCi0JaWYgKCEodGFwZS0+Y2Fwc1s2XSAmIDB4MDEpKQotCQlyZXR1cm4gMDsKLQotCWlkZXRhcGVfaW5pdF9wYyhwYyk7Ci0JcGMtPmNbMF0gPSBBTExPV19NRURJVU1fUkVNT1ZBTDsKLQlwYy0+Y1s0XSA9IHByZXZlbnQ7Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwpAQCAtMTQwNSw2ICsxMTU5LDcgQEAKIAkJdTggcGFydGl0aW9uLCBpbnQgc2tpcCkKIHsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHRhcGUtPmRpc2s7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCkBAIC0xNDEyLDEyICsxMTY3LDEyIEBACiAJCV9faWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUpOwogCWlkZXRhcGVfd2FpdF9yZWFkeShkcml2ZSwgNjAgKiA1ICogSFopOwogCWlkZXRhcGVfY3JlYXRlX2xvY2F0ZV9jbWQoZHJpdmUsICZwYywgYmxvY2ssIHBhcnRpdGlvbiwgc2tpcCk7Ci0JcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCXJldHZhbCA9IGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCBkaXNrLCAmcGMpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiAocmV0dmFsKTsKIAogCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7Ci0JcmV0dXJuIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpOworCXJldHVybiBpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKIH0KIAogc3RhdGljIHZvaWQgaWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoaWRlX2RyaXZlX3QgKmRyaXZlLApAQCAtMTQ3Nyw3ICsxMjMyLDcgQEAKIAogc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfaW5xdWlyeV9jbWQoc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBJTlFVSVJZOwogCXBjLT5jWzRdID0gMjU0OwogCXBjLT5yZXFfeGZlciA9IDI1NDsKQEAgLTE0ODYsMTQgKzEyNDEsMTQgQEAKIHN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3Jld2luZF9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlLAogCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKIHsKLQlpZGV0YXBlX2luaXRfcGMocGMpOworCWlkZV9pbml0X3BjKHBjKTsKIAlwYy0+Y1swXSA9IFJFWkVST19VTklUOwogCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RTQzsKIH0KIAogc3RhdGljIHZvaWQgaWRldGFwZV9jcmVhdGVfZXJhc2VfY21kKHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQogewotCWlkZXRhcGVfaW5pdF9wYyhwYyk7CisJaWRlX2luaXRfcGMocGMpOwogCXBjLT5jWzBdID0gRVJBU0U7CiAJcGMtPmNbMV0gPSAxOwogCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RTQzsKQEAgLTE1MDEsNyArMTI1Niw3IEBACiAKIHN0YXRpYyB2b2lkIGlkZXRhcGVfY3JlYXRlX3NwYWNlX2NtZChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywgaW50IGNvdW50LCB1OCBjbWQpCiB7Ci0JaWRldGFwZV9pbml0X3BjKHBjKTsKKwlpZGVfaW5pdF9wYyhwYyk7CiAJcGMtPmNbMF0gPSBTUEFDRTsKIAlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGNvdW50KSwgKHVuc2lnbmVkIGludCAqKSAmcGMtPmNbMV0pOwogCXBjLT5jWzFdID0gY21kOwpAQCAtMTYwMCw3ICsxMzU1LDcgQEAKIAkJICogTm8gcG9pbnQgaW4gaXNzdWluZyB0aGlzIGlmIERTQyBvdmVybGFwIGlzbid0IHN1cHBvcnRlZCwgc29tZQogCQkgKiBkcml2ZXMgKFNlYWdhdGUgU1RUMzQwMUEpIHdpbGwgcmV0dXJuIGFuIGVycm9yLgogCQkgKi8KLQkJaWYgKGRyaXZlLT5kc2Nfb3ZlcmxhcCkgeworCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19EU0NfT1ZFUkxBUCkgewogCQkJYnl0ZXNfcmVhZCA9IGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwKIAkJCQkJCQlSRVFfSURFVEFQRV9SRUFELCAwLAogCQkJCQkJCXRhcGUtPm1lcmdlX2JoKTsKQEAgLTE2NjQsMjAgKzE0MTksMjAgQEAKICAqLwogc3RhdGljIGludCBpZGV0YXBlX3Jld2luZF90YXBlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gdGFwZS0+ZGlzazsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7Ci0JaWRldGFwZV90YXBlX3QgKnRhcGU7Ci0JdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAogCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOwogCiAJaWRldGFwZV9jcmVhdGVfcmV3aW5kX2NtZChkcml2ZSwgJnBjKTsKLQlyZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJcmV0dmFsID0gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYyk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAogCWlkZXRhcGVfY3JlYXRlX3JlYWRfcG9zaXRpb25fY21kKCZwYyk7Ci0JcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCXJldHZhbCA9IGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCBkaXNrLCAmcGMpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAJcmV0dXJuIDA7CkBAIC0xNzIwLDYgKzE0NzUsNyBAQAogCQkJCQlpbnQgbXRfY291bnQpCiB7CiAJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSB0YXBlLT5kaXNrOwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CiAJaW50IHJldHZhbCwgY291bnQgPSAwOwogCWludCBzcHJldiA9ICEhKHRhcGUtPmNhcHNbNF0gJiAweDIwKTsKQEAgLTE3NDQsNyArMTUwMCw3IEBACiAJY2FzZSBNVEJTRjoKIAkJaWRldGFwZV9jcmVhdGVfc3BhY2VfY21kKCZwYywgbXRfY291bnQgLSBjb3VudCwKIAkJCQkJIElERVRBUEVfU1BBQ0VfT1ZFUl9GSUxFTUFSSyk7Ci0JCXJldHVybiBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCXJldHVybiBpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKIAljYXNlIE1URlNGTToKIAljYXNlIE1UQlNGTToKIAkJaWYgKCFzcHJldikKQEAgLTE3ODAsNyArMTUzNiw3IEBACiBzdGF0aWMgc3NpemVfdCBpZGV0YXBlX2NocmRldl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBpZGVfdGFwZV9mKGZpbGUpOworCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7CiAJc3NpemVfdCBieXRlc19yZWFkLCB0ZW1wLCBhY3R1YWxseV9yZWFkID0gMCwgcmM7CiAJc3NpemVfdCByZXQgPSAwOwpAQCAtMTg0Miw3ICsxNTk4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGlkZXRhcGVfY2hyZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGlkZV90YXBlX2YoZmlsZSk7CisJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKIAlzc2l6ZV90IGFjdHVhbGx5X3dyaXR0ZW4gPSAwOwogCXNzaXplX3QgcmV0ID0gMDsKQEAgLTE4NzUsNyArMTYzMSw3IEBACiAJCSAqIHBvaW50IGluIGlzc3VpbmcgdGhpcyBpZiBEU0Mgb3ZlcmxhcCBpc24ndCBzdXBwb3J0ZWQsIHNvbWUKIAkJICogZHJpdmVzIChTZWFnYXRlIFNUVDM0MDFBKSB3aWxsIHJldHVybiBhbiBlcnJvci4KIAkJICovCi0JCWlmIChkcml2ZS0+ZHNjX292ZXJsYXApIHsKKwkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfRFNDX09WRVJMQVApIHsKIAkJCXNzaXplX3QgcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLAogCQkJCQkJCVJFUV9JREVUQVBFX1dSSVRFLCAwLAogCQkJCQkJCXRhcGUtPm1lcmdlX2JoKTsKQEAgLTE5MzMsMTEgKzE2ODksMTIgQEAKIAogc3RhdGljIGludCBpZGV0YXBlX3dyaXRlX2ZpbGVtYXJrKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CiAKIAkvKiBXcml0ZSBhIGZpbGVtYXJrICovCiAJaWRldGFwZV9jcmVhdGVfd3JpdGVfZmlsZW1hcmtfY21kKGRyaXZlLCAmcGMsIDEpOwotCWlmIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpIHsKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIHRhcGUtPmRpc2ssICZwYykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogQ291bGRuJ3Qgd3JpdGUgYSBmaWxlbWFya1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE5NjAsNiArMTcxNyw3IEBACiBzdGF0aWMgaW50IGlkZXRhcGVfbXRpb2N0b3AoaWRlX2RyaXZlX3QgKmRyaXZlLCBzaG9ydCBtdF9vcCwgaW50IG10X2NvdW50KQogewogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gdGFwZS0+ZGlzazsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCWludCBpLCByZXR2YWw7CiAKQEAgLTE5OTYsOSArMTc1NCw3IEBACiAJCXJldHVybiAwOwogCWNhc2UgTVRMT0FEOgogCQlpZGVfdGFwZV9kaXNjYXJkX21lcmdlX2J1ZmZlcihkcml2ZSwgMCk7Ci0JCWlkZXRhcGVfY3JlYXRlX2xvYWRfdW5sb2FkX2NtZChkcml2ZSwgJnBjLAotCQkJCQkgICAgICAgSURFVEFQRV9MVV9MT0FEX01BU0spOwotCQlyZXR1cm4gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCQlyZXR1cm4gaWRlX2RvX3N0YXJ0X3N0b3AoZHJpdmUsIGRpc2ssIElERVRBUEVfTFVfTE9BRF9NQVNLKTsKIAljYXNlIE1UVU5MT0FEOgogCWNhc2UgTVRPRkZMOgogCQkvKgpAQCAtMjAwNiwxNCArMTc2MiwxMSBAQAogCQkgKiBhdHRlbXB0aW5nIHRvIGVqZWN0LgogCQkgKi8KIAkJaWYgKHRhcGUtPmRvb3JfbG9ja2VkKSB7Ci0JCQlpZiAoaWRldGFwZV9jcmVhdGVfcHJldmVudF9jbWQoZHJpdmUsICZwYywgMCkpCi0JCQkJaWYgKCFpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpCi0JCQkJCXRhcGUtPmRvb3JfbG9ja2VkID0gRE9PUl9VTkxPQ0tFRDsKKwkJCWlmICghaWRlX3NldF9tZWRpYV9sb2NrKGRyaXZlLCBkaXNrLCAwKSkKKwkJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfVU5MT0NLRUQ7CiAJCX0KIAkJaWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDApOwotCQlpZGV0YXBlX2NyZWF0ZV9sb2FkX3VubG9hZF9jbWQoZHJpdmUsICZwYywKLQkJCQkJICAgICAgIUlERVRBUEVfTFVfTE9BRF9NQVNLKTsKLQkJcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCQlyZXR2YWwgPSBpZGVfZG9fc3RhcnRfc3RvcChkcml2ZSwgZGlzaywgIUlERVRBUEVfTFVfTE9BRF9NQVNLKTsKIAkJaWYgKCFyZXR2YWwpCiAJCQljbGVhcl9iaXQoSURFX0FGTEFHX01FRElVTV9QUkVTRU5ULCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTIwMjIsMTYgKzE3NzUsMTUgQEAKIAkJcmV0dXJuIGlkZXRhcGVfZmx1c2hfdGFwZV9idWZmZXJzKGRyaXZlKTsKIAljYXNlIE1UUkVURU46CiAJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRyaXZlLCAwKTsKLQkJaWRldGFwZV9jcmVhdGVfbG9hZF91bmxvYWRfY21kKGRyaXZlLCAmcGMsCisJCXJldHVybiBpZGVfZG9fc3RhcnRfc3RvcChkcml2ZSwgZGlzaywKIAkJCUlERVRBUEVfTFVfUkVURU5TSU9OX01BU0sgfCBJREVUQVBFX0xVX0xPQURfTUFTSyk7Ci0JCXJldHVybiBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CiAJY2FzZSBNVEVPTToKIAkJaWRldGFwZV9jcmVhdGVfc3BhY2VfY21kKCZwYywgMCwgSURFVEFQRV9TUEFDRV9UT19FT0QpOwotCQlyZXR1cm4gaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpOworCQlyZXR1cm4gaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIGRpc2ssICZwYyk7CiAJY2FzZSBNVEVSQVNFOgogCQkodm9pZClpZGV0YXBlX3Jld2luZF90YXBlKGRyaXZlKTsKIAkJaWRldGFwZV9jcmVhdGVfZXJhc2VfY21kKCZwYyk7Ci0JCXJldHVybiBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCXJldHVybiBpZGVfcXVldWVfcGNfdGFpbChkcml2ZSwgZGlzaywgJnBjKTsKIAljYXNlIE1UU0VUQkxLOgogCQlpZiAobXRfY291bnQpIHsKIAkJCWlmIChtdF9jb3VudCA8IHRhcGUtPmJsa19zaXplIHx8CkBAIC0yMDUyLDE3ICsxODA0LDEzIEBACiAJY2FzZSBNVEZTUjoKIAljYXNlIE1UQlNSOgogCWNhc2UgTVRMT0NLOgotCQlpZiAoIWlkZXRhcGVfY3JlYXRlX3ByZXZlbnRfY21kKGRyaXZlLCAmcGMsIDEpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHZhbCA9IGlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKTsKKwkJcmV0dmFsID0gaWRlX3NldF9tZWRpYV9sb2NrKGRyaXZlLCBkaXNrLCAxKTsKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJCXRhcGUtPmRvb3JfbG9ja2VkID0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRDsKIAkJcmV0dXJuIDA7CiAJY2FzZSBNVFVOTE9DSzoKLQkJaWYgKCFpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZChkcml2ZSwgJnBjLCAwKSkKLQkJCXJldHVybiAwOwotCQlyZXR2YWwgPSBpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYyk7CisJCXJldHZhbCA9IGlkZV9zZXRfbWVkaWFfbG9jayhkcml2ZSwgZGlzaywgMCk7CiAJCWlmIChyZXR2YWwpCiAJCQlyZXR1cm4gcmV0dmFsOwogCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfVU5MT0NLRUQ7CkBAIC0yMDgyLDcgKzE4MzAsNyBAQAogc3RhdGljIGludCBpZGV0YXBlX2NocmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxlKTsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwogCXN0cnVjdCBtdG9wIG10b3A7CiAJc3RydWN0IG10Z2V0IG10Z2V0OwpAQCAtMjE0NCw3ICsxODkyLDcgQEAKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCiAJaWRldGFwZV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVUQVBFX0JMT0NLX0RFU0NSSVBUT1IpOwotCWlmIChpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpIHsKKwlpZiAoaWRlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsIHRhcGUtPmRpc2ssICZwYykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogQ2FuJ3QgZ2V0IGJsb2NrIGRlc2NyaXB0b3JcbiIpOwogCQlpZiAodGFwZS0+YmxrX3NpemUgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlLXRhcGU6IENhbm5vdCBkZWFsIHdpdGggemVybyAiCkBAIC0yMTY0LDcgKzE5MTIsNiBAQAogCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSksIGkgPSBtaW5vciAmIH4weGMwOwogCWlkZV9kcml2ZV90ICpkcml2ZTsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHBjOwogCWludCByZXR2YWw7CiAKIAlpZiAoaSA+PSBNQVhfSFdJRlMgKiBNQVhfRFJJVkVTKQpAQCAtMjIyNywxMSArMTk3NCw5IEBACiAKIAkvKiBMb2NrIHRoZSB0YXBlIGRyaXZlIGRvb3Igc28gdXNlciBjYW4ndCBlamVjdC4gKi8KIAlpZiAodGFwZS0+Y2hyZGV2X2RpciA9PSBJREVUQVBFX0RJUl9OT05FKSB7Ci0JCWlmIChpZGV0YXBlX2NyZWF0ZV9wcmV2ZW50X2NtZChkcml2ZSwgJnBjLCAxKSkgewotCQkJaWYgKCFpZGV0YXBlX3F1ZXVlX3BjX3RhaWwoZHJpdmUsICZwYykpIHsKLQkJCQlpZiAodGFwZS0+ZG9vcl9sb2NrZWQgIT0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRCkKLQkJCQkJdGFwZS0+ZG9vcl9sb2NrZWQgPSBET09SX0xPQ0tFRDsKLQkJCX0KKwkJaWYgKCFpZGVfc2V0X21lZGlhX2xvY2soZHJpdmUsIHRhcGUtPmRpc2ssIDEpKSB7CisJCQlpZiAodGFwZS0+ZG9vcl9sb2NrZWQgIT0gRE9PUl9FWFBMSUNJVExZX0xPQ0tFRCkKKwkJCQl0YXBlLT5kb29yX2xvY2tlZCA9IERPT1JfTE9DS0VEOwogCQl9CiAJfQogCXVubG9ja19rZXJuZWwoKTsKQEAgLTIyNjIsOSArMjAwNyw4IEBACiAKIHN0YXRpYyBpbnQgaWRldGFwZV9jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxwKTsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwotCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7CiAJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0yMjgzLDEwICsyMDI3LDggQEAKIAkJKHZvaWQpIGlkZXRhcGVfcmV3aW5kX3RhcGUoZHJpdmUpOwogCWlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRBUEVfRElSX05PTkUpIHsKIAkJaWYgKHRhcGUtPmRvb3JfbG9ja2VkID09IERPT1JfTE9DS0VEKSB7Ci0JCQlpZiAoaWRldGFwZV9jcmVhdGVfcHJldmVudF9jbWQoZHJpdmUsICZwYywgMCkpIHsKLQkJCQlpZiAoIWlkZXRhcGVfcXVldWVfcGNfdGFpbChkcml2ZSwgJnBjKSkKLQkJCQkJdGFwZS0+ZG9vcl9sb2NrZWQgPSBET09SX1VOTE9DS0VEOwotCQkJfQorCQkJaWYgKCFpZGVfc2V0X21lZGlhX2xvY2soZHJpdmUsIHRhcGUtPmRpc2ssIDApKQorCQkJCXRhcGUtPmRvb3JfbG9ja2VkID0gRE9PUl9VTkxPQ0tFRDsKIAkJfQogCX0KIAljbGVhcl9iaXQoSURFX0FGTEFHX0JVU1ksICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwpAQCAtMjI5NSw1MyArMjAzNywxNCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBBVEFQSSBJREVOVElGWSBjb21tYW5kIHJlc3VsdHMuIFdlIHJldHVybjoKLSAqCi0gKiAxIC0gSWYgdGhlIHRhcGUgY2FuIGJlIHN1cHBvcnRlZCBieSB1cywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUgc28KLSAqIGZhci4KLSAqCi0gKiAwIC0gSWYgdGhpcyB0YXBlIGRyaXZlciBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB1cy4KLSAqLwotc3RhdGljIGludCBpZGV0YXBlX2lkZW50aWZ5X2RldmljZShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JdTggZ2N3WzJdLCBwcm90b2NvbCwgZGV2aWNlX3R5cGUsIHJlbW92YWJsZSwgcGFja2V0X3NpemU7Ci0KLQlpZiAoZHJpdmUtPmlkX3JlYWQgPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQkqKCh1bnNpZ25lZCBzaG9ydCAqKSAmZ2N3KSA9IGRyaXZlLT5pZC0+Y29uZmlnOwotCi0JcHJvdG9jb2wJPSAgIChnY3dbMV0gJiAweEMwKSA+PiA2OwotCWRldmljZV90eXBlCT0gICAgZ2N3WzFdICYgMHgxRjsKLQlyZW1vdmFibGUJPSAhIShnY3dbMF0gJiAweDgwKTsKLQlwYWNrZXRfc2l6ZQk9ICAgIGdjd1swXSAmIDB4MzsKLQotCS8qIENoZWNrIHRoYXQgd2UgY2FuIHN1cHBvcnQgdGhpcyBkZXZpY2UgKi8KLQlpZiAocHJvdG9jb2wgIT0gMikKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogUHJvdG9jb2wgKDB4JTAyeCkgaXMgbm90IEFUQVBJXG4iLAotCQkJCXByb3RvY29sKTsKLQllbHNlIGlmIChkZXZpY2VfdHlwZSAhPSAxKQotCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBEZXZpY2UgdHlwZSAoMHglMDJ4KSBpcyBub3Qgc2V0ICIKLQkJCQkidG8gdGFwZVxuIiwgZGV2aWNlX3R5cGUpOwotCWVsc2UgaWYgKCFyZW1vdmFibGUpCi0JCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IFRoZSByZW1vdmFibGUgZmxhZyBpcyBub3Qgc2V0XG4iKTsKLQllbHNlIGlmIChwYWNrZXRfc2l6ZSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IFBhY2tldCBzaXplICgweCUwMngpIGlzIG5vdCAxMiIKLQkJCQkiIGJ5dGVzXG4iLCBwYWNrZXRfc2l6ZSk7Ci0JfSBlbHNlCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBpZGV0YXBlX2dldF9pbnF1aXJ5X3Jlc3VsdHMoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcGM7Ci0JY2hhciBmd19yZXZbNl0sIHZlbmRvcl9pZFsxMF0sIHByb2R1Y3RfaWRbMThdOworCWNoYXIgZndfcmV2WzRdLCB2ZW5kb3JfaWRbOF0sIHByb2R1Y3RfaWRbMTZdOwogCiAJaWRldGFwZV9jcmVhdGVfaW5xdWlyeV9jbWQoJnBjKTsKLQlpZiAoaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisJaWYgKGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCB0YXBlLT5kaXNrLCAmcGMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6ICVzOiBjYW4ndCBnZXQgSU5RVUlSWSByZXN1bHRzXG4iLAogCQkJCXRhcGUtPm5hbWUpOwogCQlyZXR1cm47CkBAIC0yMzUwLDExICsyMDUzLDExIEBACiAJbWVtY3B5KHByb2R1Y3RfaWQsICZwYy5idWZbMTZdLCAxNik7CiAJbWVtY3B5KGZ3X3JldiwgJnBjLmJ1ZlszMl0sIDQpOwogCi0JaWRlX2ZpeHN0cmluZyh2ZW5kb3JfaWQsIDEwLCAwKTsKLQlpZGVfZml4c3RyaW5nKHByb2R1Y3RfaWQsIDE4LCAwKTsKLQlpZGVfZml4c3RyaW5nKGZ3X3JldiwgNiwgMCk7CisJaWRlX2ZpeHN0cmluZyh2ZW5kb3JfaWQsIDgsIDApOworCWlkZV9maXhzdHJpbmcocHJvZHVjdF9pZCwgMTYsIDApOworCWlkZV9maXhzdHJpbmcoZndfcmV2LCA0LCAwKTsKIAotCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlcyA8LT4gJXM6ICVzICVzIHJldiAlc1xuIiwKKwlwcmludGsoS0VSTl9JTkZPICJpZGUtdGFwZTogJXMgPC0+ICVzOiAlLjhzICUuMTZzIHJldiAlLjRzXG4iLAogCQkJZHJpdmUtPm5hbWUsIHRhcGUtPm5hbWUsIHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwgZndfcmV2KTsKIH0KIApAQCAtMjM3MCw3ICsyMDczLDcgQEAKIAl1OCBzcGVlZCwgbWF4X3NwZWVkOwogCiAJaWRldGFwZV9jcmVhdGVfbW9kZV9zZW5zZV9jbWQoJnBjLCBJREVUQVBFX0NBUEFCSUxJVElFU19QQUdFKTsKLQlpZiAoaWRldGFwZV9xdWV1ZV9wY190YWlsKGRyaXZlLCAmcGMpKSB7CisJaWYgKGlkZV9xdWV1ZV9wY190YWlsKGRyaXZlLCB0YXBlLT5kaXNrLCAmcGMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IENhbid0IGdldCB0YXBlIHBhcmFtZXRlcnMgLSBhc3N1bWluZyIKIAkJCQkiIHNvbWUgZGVmYXVsdCB2YWx1ZXNcbiIpOwogCQl0YXBlLT5ibGtfc2l6ZSA9IDUxMjsKQEAgLTI0MDIsNiArMjEwNSwxMSBAQAogCX0KIAogCW1lbWNweSgmdGFwZS0+Y2FwcywgY2FwcywgMjApOworCisJLyogZGV2aWNlIGxhY2tzIGxvY2tpbmcgc3VwcG9ydCBhY2NvcmRpbmcgdG8gY2FwYWJpbGl0aWVzIHBhZ2UgKi8KKwlpZiAoKGNhcHNbNl0gJiAxKSA9PSAwKQorCQlkcml2ZS0+YXRhcGlfZmxhZ3MgfD0gSURFX0FGTEFHX05PX0RPT1JMT0NLOworCiAJaWYgKGNhcHNbN10gJiAweDAyKQogCQl0YXBlLT5ibGtfc2l6ZSA9IDUxMjsKIAllbHNlIGlmIChjYXBzWzddICYgMHgwNCkKQEAgLTI0MDksMjggKzIxMTcsNTYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwotc3RhdGljIHZvaWQgaWRldGFwZV9hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAiYnVmZmVyIiwgU0VUVElOR19SRUFELCBUWVBFX1NIT1JULCAwLCAweGZmZmYsCi0JCQkxLCAyLCAodTE2ICopJnRhcGUtPmNhcHNbMTZdLCBOVUxMKTsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJzcGVlZCIsIFNFVFRJTkdfUkVBRCwgVFlQRV9TSE9SVCwgMCwgMHhmZmZmLAotCQkJMSwgMSwgKHUxNiAqKSZ0YXBlLT5jYXBzWzE0XSwgTlVMTCk7Ci0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLCAiYnVmZmVyX3NpemUiLCBTRVRUSU5HX1JFQUQsIFRZUEVfSU5ULCAwLCAweGZmZmYsCi0JCQkxLCAxMDI0LCAmdGFwZS0+YnVmZmVyX3NpemUsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgInRkc2MiLCBTRVRUSU5HX1JXLCBUWVBFX0lOVCwgSURFVEFQRV9EU0NfUldfTUlOLAotCQkJSURFVEFQRV9EU0NfUldfTUFYLCAxMDAwLCBIWiwgJnRhcGUtPmJlc3RfZHNjX3J3X2ZyZXEsCi0JCQlOVUxMKTsKLQlpZGVfYWRkX3NldHRpbmcoZHJpdmUsICJkc2Nfb3ZlcmxhcCIsIFNFVFRJTkdfUlcsIFRZUEVfQllURSwgMCwgMSwgMSwKLQkJCTEsICZkcml2ZS0+ZHNjX292ZXJsYXAsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImF2Z19zcGVlZCIsIFNFVFRJTkdfUkVBRCwgVFlQRV9JTlQsIDAsIDB4ZmZmZiwKLQkJCTEsIDEsICZ0YXBlLT5hdmdfc3BlZWQsIE5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwgImRlYnVnX21hc2siLCBTRVRUSU5HX1JXLCBUWVBFX0lOVCwgMCwgMHhmZmZmLCAxLAotCQkJMSwgJnRhcGUtPmRlYnVnX21hc2ssIE5VTEwpOworI2RlZmluZSBpZGVfdGFwZV9kZXZzZXRfZ2V0KG5hbWUsIGZpZWxkKSBcCitzdGF0aWMgaW50IGdldF8jI25hbWUoaWRlX2RyaXZlX3QgKmRyaXZlKSBcCit7IFwKKwlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsgXAorCXJldHVybiB0YXBlLT5maWVsZDsgXAogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGV0YXBlX2FkZF9zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpIHsgOyB9CisKKyNkZWZpbmUgaWRlX3RhcGVfZGV2c2V0X3NldChuYW1lLCBmaWVsZCkgXAorc3RhdGljIGludCBzZXRfIyNuYW1lKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykgXAoreyBcCisJaWRldGFwZV90YXBlX3QgKnRhcGUgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7IFwKKwl0YXBlLT5maWVsZCA9IGFyZzsgXAorCXJldHVybiAwOyBcCit9CisKKyNkZWZpbmUgaWRlX3RhcGVfZGV2c2V0X3J3X2ZpZWxkKF9uYW1lLCBfZmllbGQpIFwKK2lkZV90YXBlX2RldnNldF9nZXQoX25hbWUsIF9maWVsZCkgXAoraWRlX3RhcGVfZGV2c2V0X3NldChfbmFtZSwgX2ZpZWxkKSBcCitJREVfREVWU0VUKF9uYW1lLCBEU19TWU5DLCBnZXRfIyNfbmFtZSwgc2V0XyMjX25hbWUpCisKKyNkZWZpbmUgaWRlX3RhcGVfZGV2c2V0X3JfZmllbGQoX25hbWUsIF9maWVsZCkgXAoraWRlX3RhcGVfZGV2c2V0X2dldChfbmFtZSwgX2ZpZWxkKSBcCitJREVfREVWU0VUKF9uYW1lLCAwLCBnZXRfIyNfbmFtZSwgTlVMTCkKKworc3RhdGljIGludCBtdWxmX3Rkc2MoaWRlX2RyaXZlX3QgKmRyaXZlKQl7IHJldHVybiAxMDAwOyB9CitzdGF0aWMgaW50IGRpdmZfdGRzYyhpZGVfZHJpdmVfdCAqZHJpdmUpCXsgcmV0dXJuICAgSFo7IH0KK3N0YXRpYyBpbnQgZGl2Zl9idWZmZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQl7IHJldHVybiAgICAyOyB9CitzdGF0aWMgaW50IGRpdmZfYnVmZmVyX3NpemUoaWRlX2RyaXZlX3QgKmRyaXZlKQl7IHJldHVybiAxMDI0OyB9CisKK2lkZV9kZXZzZXRfcndfZmxhZyhkc2Nfb3ZlcmxhcCwgSURFX0RGTEFHX0RTQ19PVkVSTEFQKTsKKworaWRlX3RhcGVfZGV2c2V0X3J3X2ZpZWxkKGRlYnVnX21hc2ssIGRlYnVnX21hc2spOworaWRlX3RhcGVfZGV2c2V0X3J3X2ZpZWxkKHRkc2MsIGJlc3RfZHNjX3J3X2ZyZXEpOworCitpZGVfdGFwZV9kZXZzZXRfcl9maWVsZChhdmdfc3BlZWQsIGF2Z19zcGVlZCk7CitpZGVfdGFwZV9kZXZzZXRfcl9maWVsZChzcGVlZCwgY2Fwc1sxNF0pOworaWRlX3RhcGVfZGV2c2V0X3JfZmllbGQoYnVmZmVyLCBjYXBzWzE2XSk7CitpZGVfdGFwZV9kZXZzZXRfcl9maWVsZChidWZmZXJfc2l6ZSwgYnVmZmVyX3NpemUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCBpZGV0YXBlX3NldHRpbmdzW10gPSB7CisJX19JREVfUFJPQ19ERVZTRVQoYXZnX3NwZWVkLAkwLCAweGZmZmYsIE5VTEwsIE5VTEwpLAorCV9fSURFX1BST0NfREVWU0VUKGJ1ZmZlciwJMCwgMHhmZmZmLCBOVUxMLCBkaXZmX2J1ZmZlciksCisJX19JREVfUFJPQ19ERVZTRVQoYnVmZmVyX3NpemUsCTAsIDB4ZmZmZiwgTlVMTCwgZGl2Zl9idWZmZXJfc2l6ZSksCisJX19JREVfUFJPQ19ERVZTRVQoZGVidWdfbWFzaywJMCwgMHhmZmZmLCBOVUxMLCBOVUxMKSwKKwlfX0lERV9QUk9DX0RFVlNFVChkc2Nfb3ZlcmxhcCwJMCwgICAgICAxLCBOVUxMLCBOVUxMKSwKKwlfX0lERV9QUk9DX0RFVlNFVChzcGVlZCwJMCwgMHhmZmZmLCBOVUxMLCBOVUxMKSwKKwlfX0lERV9QUk9DX0RFVlNFVCh0ZHNjLAkJSURFVEFQRV9EU0NfUldfTUlOLCBJREVUQVBFX0RTQ19SV19NQVgsCisJCQkJCW11bGZfdGRzYywgZGl2Zl90ZHNjKSwKKwl7IDAgfSwKK307CiAjZW5kaWYKIAogLyoKQEAgLTI0NDksMzIgKzIxODUsMzEgQEAKIAl1bnNpZ25lZCBsb25nIHQ7CiAJaW50IHNwZWVkOwogCWludCBidWZmZXJfc2l6ZTsKLQl1OCBnY3dbMl07CiAJdTE2ICpjdGwgPSAodTE2ICopJnRhcGUtPmNhcHNbMTJdOwogCi0JZHJpdmUtPnBjX2NhbGxiYWNrID0gaWRlX3RhcGVfY2FsbGJhY2s7CisJZHJpdmUtPnBjX2NhbGxiYWNrCSA9IGlkZV90YXBlX2NhbGxiYWNrOworCWRyaXZlLT5wY191cGRhdGVfYnVmZmVycyA9IGlkZXRhcGVfdXBkYXRlX2J1ZmZlcnM7CisJZHJpdmUtPnBjX2lvX2J1ZmZlcnMJID0gaWRlX3RhcGVfaW9fYnVmZmVyczsKIAogCXNwaW5fbG9ja19pbml0KCZ0YXBlLT5sb2NrKTsKLQlkcml2ZS0+ZHNjX292ZXJsYXAgPSAxOworCisJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfRFNDX09WRVJMQVA7CisKIAlpZiAoZHJpdmUtPmh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fRFNDKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiAlczogZGlzYWJsaW5nIERTQyBvdmVybGFwXG4iLAogCQkJCSB0YXBlLT5uYW1lKTsKLQkJZHJpdmUtPmRzY19vdmVybGFwID0gMDsKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RTQ19PVkVSTEFQOwogCX0KKwogCS8qIFNlYWdhdGUgVHJhdmFuIGRyaXZlcyBkbyBub3Qgc3VwcG9ydCBEU0Mgb3ZlcmxhcC4gKi8KLQlpZiAoc3Ryc3RyKGRyaXZlLT5pZC0+bW9kZWwsICJTZWFnYXRlIFNUVDM0MDEiKSkKLQkJZHJpdmUtPmRzY19vdmVybGFwID0gMDsKKwlpZiAoc3Ryc3RyKChjaGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF0sICJTZWFnYXRlIFNUVDM0MDEiKSkKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0RTQ19PVkVSTEFQOworCiAJdGFwZS0+bWlub3IgPSBtaW5vcjsKIAl0YXBlLT5uYW1lWzBdID0gJ2gnOwogCXRhcGUtPm5hbWVbMV0gPSAndCc7CiAJdGFwZS0+bmFtZVsyXSA9ICcwJyArIG1pbm9yOwogCXRhcGUtPmNocmRldl9kaXIgPSBJREVUQVBFX0RJUl9OT05FOwotCXRhcGUtPnBjID0gdGFwZS0+cGNfc3RhY2s7Ci0JKigodW5zaWduZWQgc2hvcnQgKikgJmdjdykgPSBkcml2ZS0+aWQtPmNvbmZpZzsKLQotCS8qIENvbW1hbmQgcGFja2V0IERSUSB0eXBlICovCi0JaWYgKCgoZ2N3WzBdICYgMHg2MCkgPj4gNSkgPT0gMSkKLQkJc2V0X2JpdChJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCwgJmRyaXZlLT5hdGFwaV9mbGFncyk7CiAKIAlpZGV0YXBlX2dldF9pbnF1aXJ5X3Jlc3VsdHMoZHJpdmUpOwogCWlkZXRhcGVfZ2V0X21vZGVfc2Vuc2VfcmVzdWx0cyhkcml2ZSk7CkBAIC0yNTEwLDkgKzIyNDUsOSBAQAogCQkoKih1MTYgKikmdGFwZS0+Y2Fwc1sxNl0gKiA1MTIpIC8gdGFwZS0+YnVmZmVyX3NpemUsCiAJCXRhcGUtPmJ1ZmZlcl9zaXplIC8gMTAyNCwKIAkJdGFwZS0+YmVzdF9kc2NfcndfZnJlcSAqIDEwMDAgLyBIWiwKLQkJZHJpdmUtPnVzaW5nX2RtYSA/ICIsIERNQSI6IiIpOworCQkoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpID8gIiwgRE1BIiA6ICIiKTsKIAotCWlkZXRhcGVfYWRkX3NldHRpbmdzKGRyaXZlKTsKKwlpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsIHRhcGUtPmRyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV90YXBlX3JlbW92ZShpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC0yNTI4LDEzICsyMjYzLDEzIEBACiAKIHN0YXRpYyB2b2lkIGlkZV90YXBlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0Jc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IHRvX2lkZV90YXBlKGtyZWYpOworCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSB0b19pZGVfZHJ2KGtyZWYsIGlkZV90YXBlX29iaik7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7CiAJc3RydWN0IGdlbmRpc2sgKmcgPSB0YXBlLT5kaXNrOwogCiAJQlVHX09OKHRhcGUtPm1lcmdlX2JoX3NpemUpOwogCi0JZHJpdmUtPmRzY19vdmVybGFwID0gMDsKKwlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfRFNDX09WRVJMQVA7CiAJZHJpdmUtPmRyaXZlcl9kYXRhID0gTlVMTDsKIAlkZXZpY2VfZGVzdHJveShpZGV0YXBlX3N5c2ZzX2NsYXNzLCBNS0RFVihJREVUQVBFX01BSk9SLCB0YXBlLT5taW5vcikpOwogCWRldmljZV9kZXN0cm95KGlkZXRhcGVfc3lzZnNfY2xhc3MsCkBAIC0yNTc2LDEzICsyMzExLDEyIEBACiAJLnByb2JlCQkJPSBpZGVfdGFwZV9wcm9iZSwKIAkucmVtb3ZlCQkJPSBpZGVfdGFwZV9yZW1vdmUsCiAJLnZlcnNpb24JCT0gSURFVEFQRV9WRVJTSU9OLAotCS5tZWRpYQkJCT0gaWRlX3RhcGUsCi0JLnN1cHBvcnRzX2RzY19vdmVybGFwIAk9IDEsCiAJLmRvX3JlcXVlc3QJCT0gaWRldGFwZV9kb19yZXF1ZXN0LAogCS5lbmRfcmVxdWVzdAkJPSBpZGV0YXBlX2VuZF9yZXF1ZXN0LAogCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2MJCQk9IGlkZXRhcGVfcHJvYywKKwkuc2V0dGluZ3MJCT0gaWRldGFwZV9zZXR0aW5ncywKICNlbmRpZgogfTsKIApAQCAtMjYxMSw3ICsyMzQ1LDcgQEAKIHN0YXRpYyBpbnQgaWRldGFwZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKLQlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZyhkaXNrKTsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX2Rydl9nKGRpc2ssIGlkZV90YXBlX29iaik7CiAKIAlpZGVfdGFwZV9wdXQodGFwZSk7CiAKQEAgLTI2MjIsNyArMjM1Niw3IEBACiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKLQlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZyhiZGV2LT5iZF9kaXNrKTsKKwlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX2Rydl9nKGJkZXYtPmJkX2Rpc2ssIGlkZV90YXBlX29iaik7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7CiAJaW50IGVyciA9IGdlbmVyaWNfaWRlX2lvY3RsKGRyaXZlLCBmaWxlLCBiZGV2LCBjbWQsIGFyZyk7CiAJaWYgKGVyciA9PSAtRUlOVkFMKQpAQCAtMjY0NSwxMSArMjM3OSwxMiBAQAogCiAJaWYgKCFzdHJzdHIoImlkZS10YXBlIiwgZHJpdmUtPmRyaXZlcl9yZXEpKQogCQlnb3RvIGZhaWxlZDsKLQlpZiAoIWRyaXZlLT5wcmVzZW50KQotCQlnb3RvIGZhaWxlZDsKKwogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX3RhcGUpCiAJCWdvdG8gZmFpbGVkOwotCWlmICghaWRldGFwZV9pZGVudGlmeV9kZXZpY2UoZHJpdmUpKSB7CisKKwlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfSURfUkVBRCkgJiYKKwkgICAgaWRlX2NoZWNrX2F0YXBpX2RldmljZShkcml2ZSwgRFJWX05BTUUpID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogJXM6IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIgogCQkJCSIgdGhlIGRyaXZlclxuIiwgZHJpdmUtPm5hbWUpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTI2NjcsOCArMjQwMiw2IEBACiAKIAlpZGVfaW5pdF9kaXNrKGcsIGRyaXZlKTsKIAotCWlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihkcml2ZSwgJmlkZXRhcGVfZHJpdmVyKTsKLQogCWtyZWZfaW5pdCgmdGFwZS0+a3JlZik7CiAKIAl0YXBlLT5kcml2ZSA9IGRyaXZlOwpAQCAtMjY4NywxMiArMjQyMCwxMSBAQAogCiAJaWRldGFwZV9zZXR1cChkcml2ZSwgdGFwZSwgbWlub3IpOwogCi0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGlkZXRhcGVfc3lzZnNfY2xhc3MsICZkcml2ZS0+Z2VuZGV2LAotCQkJICAgICAgTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IpLCBOVUxMLAotCQkJICAgICAgIiVzIiwgdGFwZS0+bmFtZSk7Ci0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGlkZXRhcGVfc3lzZnNfY2xhc3MsICZkcml2ZS0+Z2VuZGV2LAotCQkJICAgICAgTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IgKyAxMjgpLCBOVUxMLAotCQkJICAgICAgIm4lcyIsIHRhcGUtPm5hbWUpOworCWRldmljZV9jcmVhdGUoaWRldGFwZV9zeXNmc19jbGFzcywgJmRyaXZlLT5nZW5kZXYsCisJCSAgICAgIE1LREVWKElERVRBUEVfTUFKT1IsIG1pbm9yKSwgTlVMTCwgIiVzIiwgdGFwZS0+bmFtZSk7CisJZGV2aWNlX2NyZWF0ZShpZGV0YXBlX3N5c2ZzX2NsYXNzLCAmZHJpdmUtPmdlbmRldiwKKwkJICAgICAgTUtERVYoSURFVEFQRV9NQUpPUiwgbWlub3IgKyAxMjgpLCBOVUxMLAorCQkgICAgICAibiVzIiwgdGFwZS0+bmFtZSk7CiAKIAlnLT5mb3BzID0gJmlkZXRhcGVfYmxvY2tfb3BzOwogCWlkZV9yZWdpc3Rlcl9yZWdpb24oZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCmluZGV4IDdmYjZmMWMuLmJmNGZiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC00NCwxOCArNDQsMTUgQEAKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihpZGVfdGFza190KSk7CiAJYXJncy50Zi5uc2VjdCA9IDB4MDE7CiAJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKLQkJYXJncy50Zi5jb21tYW5kID0gV0lOX0lERU5USUZZOworCQlhcmdzLnRmLmNvbW1hbmQgPSBBVEFfQ01EX0lEX0FUQTsKIAllbHNlCi0JCWFyZ3MudGYuY29tbWFuZCA9IFdJTl9QSURFTlRJRlk7CisJCWFyZ3MudGYuY29tbWFuZCA9IEFUQV9DTURfSURfQVRBUEk7CiAJYXJncy50Zl9mbGFncwk9IElERV9URkxBR19URiB8IElERV9URkxBR19ERVZJQ0U7CiAJYXJncy5kYXRhX3BoYXNlCT0gVEFTS0ZJTEVfSU47CiAJcmV0dXJuIGlkZV9yYXdfdGFza2ZpbGUoZHJpdmUsICZhcmdzLCBidWYsIDEpOwogfQogCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHRhc2tfbm9fZGF0YV9pbnRyKGlkZV9kcml2ZV90ICopOwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBzZXRfZ2VvbWV0cnlfaW50cihpZGVfZHJpdmVfdCAqKTsKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgcmVjYWxfaW50cihpZGVfZHJpdmVfdCAqKTsKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3Qgc2V0X211bHRtb2RlX2ludHIoaWRlX2RyaXZlX3QgKik7CiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHByZV90YXNrX291dF9pbnRyKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogc3RhdGljIGlkZV9zdGFydHN0b3BfdCB0YXNrX2luX2ludHIoaWRlX2RyaXZlX3QgKik7CiAKQEAgLTc5LDYgKzc2LDggQEAKIAlpZiAodGFzay0+dGZfZmxhZ3MgJiBJREVfVEZMQUdfRkxBR0dFRCkKIAkJdGFzay0+dGZfZmxhZ3MgfD0gSURFX1RGTEFHX0ZMQUdHRURfU0VUX0lOX0ZMQUdTOwogCisJbWVtY3B5KCZod2lmLT50YXNrLCB0YXNrLCBzaXplb2YoKnRhc2spKTsKKwogCWlmICgodGFzay0+dGZfZmxhZ3MgJiBJREVfVEZMQUdfRE1BX1BJT19GQUxMQkFDSykgPT0gMCkgewogCQlpZGVfdGZfZHVtcChkcml2ZS0+bmFtZSwgdGYpOwogCQl0cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CkBAIC05OSwxOSArOTgsMTIgQEAKIAljYXNlIFRBU0tGSUxFX05PX0RBVEE6CiAJCWlmIChoYW5kbGVyID09IE5VTEwpCiAJCQloYW5kbGVyID0gdGFza19ub19kYXRhX2ludHI7Ci0JCS8qIFdJTl97U1BFQ0lGWSxSRVNUT1JFLFNFVE1VTFR9IHVzZSBjdXN0b20gaGFuZGxlcnMgKi8KLQkJaWYgKHRhc2stPnRmX2ZsYWdzICYgSURFX1RGTEFHX0NVU1RPTV9IQU5ETEVSKSB7Ci0JCQlzd2l0Y2ggKHRmLT5jb21tYW5kKSB7Ci0JCQljYXNlIFdJTl9TUEVDSUZZOiBoYW5kbGVyID0gc2V0X2dlb21ldHJ5X2ludHI7CWJyZWFrOwotCQkJY2FzZSBXSU5fUkVTVE9SRTogaGFuZGxlciA9IHJlY2FsX2ludHI7CQlicmVhazsKLQkJCWNhc2UgV0lOX1NFVE1VTFQ6IGhhbmRsZXIgPSBzZXRfbXVsdG1vZGVfaW50cjsJYnJlYWs7Ci0JCQl9Ci0JCX0KIAkJaWRlX2V4ZWN1dGVfY29tbWFuZChkcml2ZSwgdGYtPmNvbW1hbmQsIGhhbmRsZXIsCiAJCQkJICAgIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKIAkJcmV0dXJuIGlkZV9zdGFydGVkOwogCWRlZmF1bHQ6Ci0JCWlmIChkcml2ZS0+dXNpbmdfZG1hID09IDAgfHwgZG1hX29wcy0+ZG1hX3NldHVwKGRyaXZlKSkKKwkJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSkgPT0gMCB8fAorCQkgICAgZG1hX29wcy0+ZG1hX3NldHVwKGRyaXZlKSkKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKIAkJZG1hX29wcy0+ZG1hX2V4ZWNfY21kKGRyaXZlLCB0Zi0+Y29tbWFuZCk7CiAJCWRtYV9vcHMtPmRtYV9zdGFydChkcml2ZSk7CkBAIC0xMjEsODggKzExMyw1NiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZG9fcndfdGFza2ZpbGUpOwogCiAvKgotICogc2V0X211bHRtb2RlX2ludHIoKSBpcyBpbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgYSBXSU5fU0VUTVVMVCBjbWQuCisgKiBIYW5kbGVyIGZvciBjb21tYW5kcyB3aXRob3V0IGEgZGF0YSBwaGFzZQogICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHNldF9tdWx0bW9kZV9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QgdGFza19ub19kYXRhX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQl1OCBzdGF0OwotCi0JbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7Ci0Jc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0KLQlpZiAoT0tfU1RBVChzdGF0LCBSRUFEWV9TVEFULCBCQURfU1RBVCkpCi0JCWRyaXZlLT5tdWx0X2NvdW50ID0gZHJpdmUtPm11bHRfcmVxOwotCWVsc2UgewotCQlkcml2ZS0+bXVsdF9yZXEgPSBkcml2ZS0+bXVsdF9jb3VudCA9IDA7Ci0JCWRyaXZlLT5zcGVjaWFsLmIucmVjYWxpYnJhdGUgPSAxOwotCQkodm9pZCkgaWRlX2R1bXBfc3RhdHVzKGRyaXZlLCAic2V0X211bHRtb2RlIiwgc3RhdCk7Ci0JfQotCXJldHVybiBpZGVfc3RvcHBlZDsKLX0KLQotLyoKLSAqIHNldF9nZW9tZXRyeV9pbnRyKCkgaXMgaW52b2tlZCBvbiBjb21wbGV0aW9uIG9mIGEgV0lOX1NQRUNJRlkgY21kLgotICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHNldF9nZW9tZXRyeV9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaW50IHJldHJpZXMgPSA1OworCWlkZV90YXNrX3QgKnRhc2sgPSAmaHdpZi0+dGFzazsKKwlzdHJ1Y3QgaWRlX3Rhc2tmaWxlICp0ZiA9ICZ0YXNrLT50ZjsKKwlpbnQgY3VzdG9tID0gKHRhc2stPnRmX2ZsYWdzICYgSURFX1RGTEFHX0NVU1RPTV9IQU5ETEVSKSA/IDEgOiAwOworCWludCByZXRyaWVzID0gKGN1c3RvbSAmJiB0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX0lOSVRfREVWX1BBUkFNUykgPyA1IDogMTsKIAl1OCBzdGF0OwogCiAJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAKIAl3aGlsZSAoMSkgewogCQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKLQkJaWYgKChzdGF0ICYgQlVTWV9TVEFUKSA9PSAwIHx8IHJldHJpZXMtLSA9PSAwKQorCQlpZiAoKHN0YXQgJiBBVEFfQlVTWSkgPT0gMCB8fCByZXRyaWVzLS0gPT0gMCkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTApOwogCX07CiAKLQlpZiAoT0tfU1RBVChzdGF0LCBSRUFEWV9TVEFULCBCQURfU1RBVCkpCi0JCXJldHVybiBpZGVfc3RvcHBlZDsKLQotCWlmIChzdGF0ICYgKEVSUl9TVEFUfERSUV9TVEFUKSkKLQkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInNldF9nZW9tZXRyeV9pbnRyIiwgc3RhdCk7Ci0KLQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZzZXRfZ2VvbWV0cnlfaW50ciwgV0FJVF9XT1JTVENBU0UsIE5VTEwpOwotCXJldHVybiBpZGVfc3RhcnRlZDsKLX0KLQotLyoKLSAqIHJlY2FsX2ludHIoKSBpcyBpbnZva2VkIG9uIGNvbXBsZXRpb24gb2YgYSBXSU5fUkVTVE9SRSAocmVjYWxpYnJhdGUpIGNtZC4KLSAqLwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCByZWNhbF9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggc3RhdDsKLQotCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwotCXN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwotCi0JaWYgKCFPS19TVEFUKHN0YXQsIFJFQURZX1NUQVQsIEJBRF9TVEFUKSkKLQkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInJlY2FsX2ludHIiLCBzdGF0KTsKLQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci19Ci0KLS8qCi0gKiBIYW5kbGVyIGZvciBjb21tYW5kcyB3aXRob3V0IGEgZGF0YSBwaGFzZQotICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHRhc2tfbm9fZGF0YV9pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX3Rhc2tfdCAqYXJncyA9IGh3aWYtPmh3Z3JvdXAtPnJxLT5zcGVjaWFsOwotCXU4IHN0YXQ7Ci0KLQlsb2NhbF9pcnFfZW5hYmxlX2luX2hhcmRpcnEoKTsKLQlzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKLQotCWlmICghT0tfU1RBVChzdGF0LCBSRUFEWV9TVEFULCBCQURfU1RBVCkpCisJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCkpIHsKKwkJaWYgKGN1c3RvbSAmJiB0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX1NFVF9NVUxUSSkgeworCQkJZHJpdmUtPm11bHRfcmVxID0gZHJpdmUtPm11bHRfY291bnQgPSAwOworCQkJZHJpdmUtPnNwZWNpYWwuYi5yZWNhbGlicmF0ZSA9IDE7CisJCQkodm9pZClpZGVfZHVtcF9zdGF0dXMoZHJpdmUsIF9fZnVuY19fLCBzdGF0KTsKKwkJCXJldHVybiBpZGVfc3RvcHBlZDsKKwkJfSBlbHNlIGlmIChjdXN0b20gJiYgdGYtPmNvbW1hbmQgPT0gQVRBX0NNRF9JTklUX0RFVl9QQVJBTVMpIHsKKwkJCWlmICgoc3RhdCAmIChBVEFfRVJSIHwgQVRBX0RSUSkpID09IDApIHsKKwkJCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZ0YXNrX25vX2RhdGFfaW50ciwKKwkJCQkJCVdBSVRfV09SU1RDQVNFLCBOVUxMKTsKKwkJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CisJCQl9CisJCX0KIAkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInRhc2tfbm9fZGF0YV9pbnRyIiwgc3RhdCk7CiAJCS8qIGNhbGxzIGlkZV9lbmRfZHJpdmVfY21kICovCisJfQogCi0JaWYgKGFyZ3MpCisJaWYgKCFjdXN0b20pCiAJCWlkZV9lbmRfZHJpdmVfY21kKGRyaXZlLCBzdGF0LCBpZGVfcmVhZF9lcnJvcihkcml2ZSkpOworCWVsc2UgaWYgKHRmLT5jb21tYW5kID09IEFUQV9DTURfSURMRUlNTUVESUFURSkgeworCQlod2lmLT50cF9vcHMtPnRmX3JlYWQoZHJpdmUsIHRhc2spOworCQlpZiAodGYtPmxiYWwgIT0gMHhjNCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaGVhZCB1bmxvYWQgZmFpbGVkIVxuIiwKKwkJCSAgICAgICBkcml2ZS0+bmFtZSk7CisJCQlpZGVfdGZfZHVtcChkcml2ZS0+bmFtZSwgdGYpOworCQl9IGVsc2UKKwkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1BBUktFRDsKKwkJaWRlX2VuZF9kcml2ZV9jbWQoZHJpdmUsIHN0YXQsIGlkZV9yZWFkX2Vycm9yKGRyaXZlKSk7CisJfSBlbHNlIGlmICh0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX1NFVF9NVUxUSSkKKwkJZHJpdmUtPm11bHRfY291bnQgPSBkcml2ZS0+bXVsdF9yZXE7CiAKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CkBAIC0yMjAsMTMgKzE4MCwxMyBAQAogCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDAwOyByZXRyaWVzKyspIHsKIAkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKLQkJaWYgKHN0YXQgJiBCVVNZX1NUQVQpCisJCWlmIChzdGF0ICYgQVRBX0JVU1kpCiAJCQl1ZGVsYXkoMTApOwogCQllbHNlCiAJCQlicmVhazsKIAl9CiAKLQlpZiAoc3RhdCAmIEJVU1lfU1RBVCkKKwlpZiAoc3RhdCAmIEFUQV9CVVNZKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZSBzdGlsbCBCVVNZIVxuIiwgZHJpdmUtPm5hbWUpOwogCiAJcmV0dXJuIHN0YXQ7CkBAIC0zODUsNyArMzQ1LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgdGFza19pbl91bmV4cGVjdGVkKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCB1OCBzdGF0KQogewogCS8qIENvbW1hbmQgYWxsIGRvbmU/ICovCi0JaWYgKE9LX1NUQVQoc3RhdCwgUkVBRFlfU1RBVCwgQlVTWV9TVEFUKSkgeworCWlmIChPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBBVEFfQlVTWSkpIHsKIAkJdGFza19lbmRfcmVxdWVzdChkcml2ZSwgcnEsIHN0YXQpOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQpAQCAtNDA1LDExICszNjUsMTEgQEAKIAl1OCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCS8qIEVycm9yPyAqLwotCWlmIChzdGF0ICYgRVJSX1NUQVQpCisJaWYgKHN0YXQgJiBBVEFfRVJSKQogCQlyZXR1cm4gdGFza19lcnJvcihkcml2ZSwgcnEsIF9fZnVuY19fLCBzdGF0KTsKIAogCS8qIERpZG4ndCB3YW50IGFueSBkYXRhPyBPZGQuICovCi0JaWYgKCEoc3RhdCAmIERSUV9TVEFUKSkKKwlpZiAoKHN0YXQgJiBBVEFfRFJRKSA9PSAwKQogCQlyZXR1cm4gdGFza19pbl91bmV4cGVjdGVkKGRyaXZlLCBycSwgc3RhdCk7CiAKIAlpZGVfcGlvX2RhdGFibG9jayhkcml2ZSwgcnEsIDApOwpAQCAtNDQyLDcgKzQwMiw3IEBACiAJCXJldHVybiB0YXNrX2Vycm9yKGRyaXZlLCBycSwgX19mdW5jX18sIHN0YXQpOwogCiAJLyogRGVhbCB3aXRoIHVuZXhwZWN0ZWQgQVRBIGRhdGEgcGhhc2UuICovCi0JaWYgKCgoc3RhdCAmIERSUV9TVEFUKSA9PSAwKSBeICFod2lmLT5ubGVmdCkKKwlpZiAoKChzdGF0ICYgQVRBX0RSUSkgPT0gMCkgXiAhaHdpZi0+bmxlZnQpCiAJCXJldHVybiB0YXNrX2Vycm9yKGRyaXZlLCBycSwgX19mdW5jX18sIHN0YXQpOwogCiAJaWYgKCFod2lmLT5ubGVmdCkgewpAQCAtNDYxLDE2ICs0MjEsMTUgQEAKIHsKIAlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOwogCi0JaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIERSUV9TVEFULAorCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBBVEFfRFJRLAogCQkJICBkcml2ZS0+YmFkX3dzdGF0LCBXQUlUX0RSUSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gRFJRIGFmdGVyIGlzc3VpbmcgJXNXUklURSVzXG4iLAotCQkJCWRyaXZlLT5uYW1lLAotCQkJCWRyaXZlLT5od2lmLT5kYXRhX3BoYXNlID8gIk1VTFQiIDogIiIsCi0JCQkJZHJpdmUtPmFkZHJlc3NpbmcgPyAiX0VYVCIgOiAiIik7CisJCQlkcml2ZS0+bmFtZSwgZHJpdmUtPmh3aWYtPmRhdGFfcGhhc2UgPyAiTVVMVCIgOiAiIiwKKwkJCShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KSA/ICJfRVhUIiA6ICIiKTsKIAkJcmV0dXJuIHN0YXJ0c3RvcDsKIAl9CiAKLQlpZiAoIWRyaXZlLT51bm1hc2spCisJaWYgKChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VOTUFTSykgPT0gMCkKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAogCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnRhc2tfb3V0X2ludHIsIFdBSVRfV09SU1RDQVNFLCBOVUxMKTsKQEAgLTU4Niw3ICs1NDUsNyBAQAogCiAJYXJncy50Zl9mbGFncyA9IElERV9URkxBR19JT18xNkJJVCB8IElERV9URkxBR19ERVZJQ0UgfAogCQkJSURFX1RGTEFHX0lOX1RGOwotCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKQorCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KQogCQlhcmdzLnRmX2ZsYWdzIHw9IChJREVfVEZMQUdfTEJBNDggfCBJREVfVEZMQUdfSU5fSE9CKTsKIAogCWlmIChyZXFfdGFzay0+b3V0X2ZsYWdzLmFsbCkgewpAQCAtNjg5LDcgKzY0OCw3IEBACiAJaWYgKChhcmdzLnRmX2ZsYWdzICYgSURFX1RGTEFHX0ZMQUdHRURfU0VUX0lOX0ZMQUdTKSAmJgogCSAgICByZXFfdGFzay0+aW5fZmxhZ3MuYWxsID09IDApIHsKIAkJcmVxX3Rhc2stPmluX2ZsYWdzLmFsbCA9IElERV9UQVNLRklMRV9TVERfSU5fRkxBR1M7Ci0JCWlmIChkcml2ZS0+YWRkcmVzc2luZyA9PSAxKQorCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkKIAkJCXJlcV90YXNrLT5pbl9mbGFncy5hbGwgfD0gKElERV9IT0JfU1REX0lOX0ZMQUdTIDw8IDgpOwogCX0KIApAQCAtNzIxLDExMCArNjgwLDMgQEAKIAlyZXR1cm4gZXJyOwogfQogI2VuZGlmCi0KLWludCBpZGVfY21kX2lvY3RsIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXU4ICpidWYgPSBOVUxMOwotCWludCBidWZzaXplID0gMCwgZXJyID0gMDsKLQl1OCBhcmdzWzRdLCB4ZmVyX3JhdGUgPSAwOwotCWlkZV90YXNrX3QgdGZhcmdzOwotCXN0cnVjdCBpZGVfdGFza2ZpbGUgKnRmID0gJnRmYXJncy50ZjsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7Ci0KLQlpZiAoTlVMTCA9PSAodm9pZCAqKSBhcmcpIHsKLQkJc3RydWN0IHJlcXVlc3QgKnJxOwotCi0JCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7Ci0JCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0FUQV9UQVNLRklMRTsKLQkJZXJyID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMCk7Ci0JCWJsa19wdXRfcmVxdWVzdChycSk7Ci0KLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoYXJncywgKHZvaWQgX191c2VyICopYXJnLCA0KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQltZW1zZXQoJnRmYXJncywgMCwgc2l6ZW9mKGlkZV90YXNrX3QpKTsKLQl0Zi0+ZmVhdHVyZSA9IGFyZ3NbMl07Ci0JaWYgKGFyZ3NbMF0gPT0gV0lOX1NNQVJUKSB7Ci0JCXRmLT5uc2VjdCA9IGFyZ3NbM107Ci0JCXRmLT5sYmFsICA9IGFyZ3NbMV07Ci0JCXRmLT5sYmFtICA9IDB4NGY7Ci0JCXRmLT5sYmFoICA9IDB4YzI7Ci0JCXRmYXJncy50Zl9mbGFncyA9IElERV9URkxBR19PVVRfVEYgfCBJREVfVEZMQUdfSU5fTlNFQ1Q7Ci0JfSBlbHNlIHsKLQkJdGYtPm5zZWN0ID0gYXJnc1sxXTsKLQkJdGZhcmdzLnRmX2ZsYWdzID0gSURFX1RGTEFHX09VVF9GRUFUVVJFIHwKLQkJCQkgIElERV9URkxBR19PVVRfTlNFQ1QgfCBJREVfVEZMQUdfSU5fTlNFQ1Q7Ci0JfQotCXRmLT5jb21tYW5kID0gYXJnc1swXTsKLQl0ZmFyZ3MuZGF0YV9waGFzZSA9IGFyZ3NbM10gPyBUQVNLRklMRV9JTiA6IFRBU0tGSUxFX05PX0RBVEE7Ci0KLQlpZiAoYXJnc1szXSkgewotCQl0ZmFyZ3MudGZfZmxhZ3MgfD0gSURFX1RGTEFHX0lPXzE2QklUOwotCQlidWZzaXplID0gU0VDVE9SX1dPUkRTICogNCAqIGFyZ3NbM107Ci0JCWJ1ZiA9IGt6YWxsb2MoYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmICh0Zi0+Y29tbWFuZCA9PSBXSU5fU0VURkVBVFVSRVMgJiYKLQkgICAgdGYtPmZlYXR1cmUgPT0gU0VURkVBVFVSRVNfWEZFUiAmJgotCSAgICB0Zi0+bnNlY3QgPj0gWEZFUl9TV19ETUFfMCAmJgotCSAgICAoaWQtPmRtYV91bHRyYSB8fCBpZC0+ZG1hX213b3JkIHx8IGlkLT5kbWFfMXdvcmQpKSB7Ci0JCXhmZXJfcmF0ZSA9IGFyZ3NbMV07Ci0JCWlmICh0Zi0+bnNlY3QgPiBYRkVSX1VETUFfMiAmJiAhZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVETUEgc3BlZWRzID5VRE1BMzMgY2Fubm90ICIKLQkJCQkJICAgICJiZSBzZXRcbiIsIGRyaXZlLT5uYW1lKTsKLQkJCWdvdG8gYWJvcnQ7Ci0JCX0KLQl9Ci0KLQllcnIgPSBpZGVfcmF3X3Rhc2tmaWxlKGRyaXZlLCAmdGZhcmdzLCBidWYsIGFyZ3NbM10pOwotCi0JYXJnc1swXSA9IHRmLT5zdGF0dXM7Ci0JYXJnc1sxXSA9IHRmLT5lcnJvcjsKLQlhcmdzWzJdID0gdGYtPm5zZWN0OwotCi0JaWYgKCFlcnIgJiYgeGZlcl9yYXRlKSB7Ci0JCS8qIGFjdGl2ZS1yZXR1bmluZy1jYWxscyBmdXR1cmUgKi8KLQkJaWRlX3NldF94ZmVyX3JhdGUoZHJpdmUsIHhmZXJfcmF0ZSk7Ci0JCWlkZV9kcml2ZWlkX3VwZGF0ZShkcml2ZSk7Ci0JfQotYWJvcnQ6Ci0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhcmdzLCA0KSkKLQkJZXJyID0gLUVGQVVMVDsKLQlpZiAoYnVmKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKGFyZyArIDQpLCBidWYsIGJ1ZnNpemUpKQotCQkJZXJyID0gLUVGQVVMVDsKLQkJa2ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotaW50IGlkZV90YXNrX2lvY3RsIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBlcnIgPSAwOwotCXU4IGFyZ3NbN107Ci0JaWRlX3Rhc2tfdCB0YXNrOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGFyZ3MsIHAsIDcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW1lbXNldCgmdGFzaywgMCwgc2l6ZW9mKHRhc2spKTsKLQltZW1jcHkoJnRhc2sudGZfYXJyYXlbN10sICZhcmdzWzFdLCA2KTsKLQl0YXNrLnRmLmNvbW1hbmQgPSBhcmdzWzBdOwotCXRhc2sudGZfZmxhZ3MgPSBJREVfVEZMQUdfVEYgfCBJREVfVEZMQUdfREVWSUNFOwotCi0JZXJyID0gaWRlX25vX2RhdGFfdGFza2ZpbGUoZHJpdmUsICZ0YXNrKTsKLQotCWFyZ3NbMF0gPSB0YXNrLnRmLmNvbW1hbmQ7Ci0JbWVtY3B5KCZhcmdzWzFdLCAmdGFzay50Zl9hcnJheVs3XSwgNik7Ci0KLQlpZiAoY29weV90b191c2VyKHAsIGFyZ3MsIDcpKQotCQllcnIgPSAtRUZBVUxUOwotCi0JcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10aW1pbmdzLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGltaW5ncy5jCmluZGV4IDhjMmY4MzIuLjgxZjUyN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10aW1pbmdzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRpbWluZ3MuYwpAQCAtMjIsNyArMjIsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC03OCwxNSArNzcsMTUgQEAKIAogdTE2IGlkZV9waW9fY3ljbGVfdGltZShpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHBpbykKIHsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAlzdHJ1Y3QgaWRlX3RpbWluZyAqdCA9IGlkZV90aW1pbmdfZmluZF9tb2RlKFhGRVJfUElPXzAgKyBwaW8pOwogCXUxNiBjeWNsZSA9IDA7CiAKLQlpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgewotCQlpZiAoaWQtPmNhcGFiaWxpdHkgJiA4KQotCQkJY3ljbGUgPSBpZC0+ZWlkZV9waW9faW9yZHk7CisJaWYgKGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CisJCWlmIChhdGFfaWRfaGFzX2lvcmR5KGRyaXZlLT5pZCkpCisJCQljeWNsZSA9IGlkW0FUQV9JRF9FSURFX1BJT19JT1JEWV07CiAJCWVsc2UKLQkJCWN5Y2xlID0gaWQtPmVpZGVfcGlvOworCQkJY3ljbGUgPSBpZFtBVEFfSURfRUlERV9QSU9dOwogCiAJCS8qIGNvbnNlcnZhdGl2ZSAiZG93bmdyYWRlIiBmb3IgYWxsIHByZS1BVEEyIGRyaXZlcyAqLwogCQlpZiAocGlvIDwgMyAmJiBjeWNsZSA8IHQtPmN5Y2xlKQpAQCAtMTM4LDcgKzEzNyw3IEBACiBpbnQgaWRlX3RpbWluZ19jb21wdXRlKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQsCiAJCSAgICAgICBzdHJ1Y3QgaWRlX3RpbWluZyAqdCwgaW50IFQsIGludCBVVCkKIHsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAlzdHJ1Y3QgaWRlX3RpbWluZyAqcywgcDsKIAogCS8qCkBAIC0xNTcsMTYgKzE1NiwxNSBAQAogCSAqIElmIHRoZSBkcml2ZSBpcyBhbiBFSURFIGRyaXZlLCBpdCBjYW4gdGVsbCB1cyBpdCBuZWVkcyBleHRlbmRlZAogCSAqIFBJTy9NV0RNQSBjeWNsZSB0aW1pbmcuCiAJICovCi0JaWYgKGlkICYmIGlkLT5maWVsZF92YWxpZCAmIDIpIHsJLyogRUlERSBkcml2ZSAqLwotCisJaWYgKGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CS8qIEVJREUgZHJpdmUgKi8KIAkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwogCiAJCWlmIChzcGVlZCA8PSBYRkVSX1BJT18yKQotCQkJcC5jeWNsZSA9IHAuY3ljOGIgPSBpZC0+ZWlkZV9waW87CisJCQlwLmN5Y2xlID0gcC5jeWM4YiA9IGlkW0FUQV9JRF9FSURFX1BJT107CiAJCWVsc2UgaWYgKHNwZWVkIDw9IFhGRVJfUElPXzUpCi0JCQlwLmN5Y2xlID0gcC5jeWM4YiA9IGlkLT5laWRlX3Bpb19pb3JkeTsKKwkJCXAuY3ljbGUgPSBwLmN5YzhiID0gaWRbQVRBX0lEX0VJREVfUElPX0lPUkRZXTsKIAkJZWxzZSBpZiAoc3BlZWQgPj0gWEZFUl9NV19ETUFfMCAmJiBzcGVlZCA8PSBYRkVSX01XX0RNQV8yKQotCQkJcC5jeWNsZSA9IGlkLT5laWRlX2RtYV9taW47CisJCQlwLmN5Y2xlID0gaWRbQVRBX0lEX0VJREVfRE1BX01JTl07CiAKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgdCwgdCwgSURFX1RJTUlOR19DWUNMRSB8IElERV9USU1JTkdfQ1lDOEIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggNzcyNDUxNi4uMDRmOGYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTQ0LDggKzQ0LDYgQEAKICAqICBpbnNwaXJhdGlvbiBmcm9tIGxvdHMgb2YgbGludXggdXNlcnMsIGVzcC4gIGhhbWlzaEB6b3QuYXBhbmEub3JnLmF1CiAgKi8KIAotI2RlZmluZSBfSURFX0MJCQkvKiBUZWxsIGlkZS5oIGl0J3MgcmVhbGx5IHVzICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtNTgsNiArNTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIApAQCAtOTcsOCArOTYsNiBAQAogCWh3aWYtPm5hbWVbMl0JPSAnZSc7CiAJaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OwogCi0JaHdpZi0+YnVzX3N0YXRlCT0gQlVTU1RBVEVfT047Ci0KIAlpbml0X2NvbXBsZXRpb24oJmh3aWYtPmdlbmRldl9yZWxfY29tcCk7CiAKIAlod2lmLT50cF9vcHMgPSAmZGVmYXVsdF90cF9vcHM7CkBAIC0xMTcsOSArMTE0LDkgQEAKIAkJbWVtc2V0KGRyaXZlLCAwLCBzaXplb2YoKmRyaXZlKSk7CiAKIAkJZHJpdmUtPm1lZGlhCQkJPSBpZGVfZGlzazsKLQkJZHJpdmUtPnNlbGVjdC5hbGwJCT0gKHVuaXQ8PDQpfDB4YTA7CisJCWRyaXZlLT5zZWxlY3QJCQk9ICh1bml0IDw8IDQpIHwgQVRBX0RFVklDRV9PQlM7CiAJCWRyaXZlLT5od2lmCQkJPSBod2lmOwotCQlkcml2ZS0+cmVhZHlfc3RhdAkJPSBSRUFEWV9TVEFUOworCQlkcml2ZS0+cmVhZHlfc3RhdAkJPSBBVEFfRFJEWTsKIAkJZHJpdmUtPmJhZF93c3RhdAkJPSBCQURfV19TVEFUOwogCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlCT0gMTsKIAkJZHJpdmUtPnNwZWNpYWwuYi5zZXRfZ2VvbWV0cnkJPSAxOwpAQCAtMTQxLDcgKzEzOCw3IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewogCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwogCi0JCWlmIChkcml2ZS0+cHJlc2VudCkgeworCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKIAkJCWRldmljZV91bnJlZ2lzdGVyKCZkcml2ZS0+Z2VuZGV2KTsKIAkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwpAQCAtMjMwLDggKzIyNyw3IEBACiAJa2ZyZWUoaHdpZi0+c2dfdGFibGUpOwogCXVucmVnaXN0ZXJfYmxrZGV2KGh3aWYtPm1ham9yLCBod2lmLT5uYW1lKTsKIAotCWlmIChod2lmLT5kbWFfYmFzZSkKLQkJaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShod2lmKTsKKwlpZGVfcmVsZWFzZV9kbWFfZW5naW5lKGh3aWYpOwogCiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiB9CkBAIC0yNTMsOTYgKzI0OSw1MiBAQAogCiBERUZJTkVfTVVURVgoaWRlX3NldHRpbmdfbXR4KTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3NldHRpbmdfbXR4KTsKK2lkZV9kZXZzZXRfZ2V0KGlvXzMyYml0LCBpb18zMmJpdCk7CiAKLS8qKgotICoJaWRlX3NwaW5fd2FpdF9od2dyb3VwCS0Jd2FpdCBmb3IgZ3JvdXAKLSAqCUBkcml2ZTogZHJpdmUgaW4gdGhlIGdyb3VwCi0gKgotICoJV2FpdCBmb3IgYW4gSURFIGRldmljZSBncm91cCB0byBnbyBub24gYnVzeSBhbmQgdGhlbiByZXR1cm4KLSAqCWhvbGRpbmcgdGhlIGlkZV9sb2NrIHdoaWNoIGd1YXJkcyB0aGUgaHdncm91cC0+YnVzeSBzdGF0dXMKLSAqCWFuZCByaWdodCB0byB1c2UgaXQuCi0gKi8KLQotaW50IGlkZV9zcGluX3dhaXRfaHdncm91cCAoaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIGludCBzZXRfaW9fMzJiaXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKDMgKiBIWik7Ci0KLQlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7Ci0KLQl3aGlsZSAoaHdncm91cC0+YnVzeSkgewotCQl1bnNpZ25lZCBsb25nIGxmbGFnczsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7Ci0JCWxvY2FsX2lycV9zZXQobGZsYWdzKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGxmbGFncyk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjaGFubmVsIGJ1c3lcbiIsIGRyaXZlLT5uYW1lKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUobGZsYWdzKTsKLQkJc3Bpbl9sb2NrX2lycSgmaWRlX2xvY2spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChpZGVfc3Bpbl93YWl0X2h3Z3JvdXApOwotCi1pbnQgc2V0X2lvXzMyYml0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKLXsKLQlpZiAoZHJpdmUtPm5vX2lvXzMyYml0KQorCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PX0lPXzMyQklUKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGFyZyA8IDAgfHwgYXJnID4gMSArIChTVVBQT1JUX1ZMQl9TWU5DIDw8IDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoZHJpdmUpKQotCQlyZXR1cm4gLUVCVVNZOwotCiAJZHJpdmUtPmlvXzMyYml0ID0gYXJnOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZpZGVfbG9jayk7Ci0KIAlyZXR1cm4gMDsKIH0KIAoraWRlX2RldnNldF9nZXRfZmxhZyhrc2V0dGluZ3MsIElERV9ERkxBR19LRUVQX1NFVFRJTkdTKTsKKwogc3RhdGljIGludCBzZXRfa3NldHRpbmdzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKIHsKIAlpZiAoYXJnIDwgMCB8fCBhcmcgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoZHJpdmUpKQotCQlyZXR1cm4gLUVCVVNZOwotCWRyaXZlLT5rZWVwX3NldHRpbmdzID0gYXJnOwotCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCWlmIChhcmcpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0tFRVBfU0VUVElOR1M7CisJZWxzZQorCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfS0VFUF9TRVRUSU5HUzsKIAogCXJldHVybiAwOwogfQogCi1pbnQgc2V0X3VzaW5nX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCitpZGVfZGV2c2V0X2dldF9mbGFnKHVzaW5nX2RtYSwgSURFX0RGTEFHX1VTSU5HX0RNQSk7CisKK3N0YXRpYyBpbnQgc2V0X3VzaW5nX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCiB7CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BCi0JaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludCBlcnIgPSAtRVBFUk07CiAKIAlpZiAoYXJnIDwgMCB8fCBhcmcgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZHJpdmUtPmlkIHx8ICEoZHJpdmUtPmlkLT5jYXBhYmlsaXR5ICYgMSkpCisJaWYgKGF0YV9pZF9oYXNfZG1hKGRyaXZlLT5pZCkgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaHdpZi0+ZG1hX29wcyA9PSBOVUxMKQorCWlmIChkcml2ZS0+aHdpZi0+ZG1hX29wcyA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWVyciA9IC1FQlVTWTsKLQlpZiAoaWRlX3NwaW5fd2FpdF9od2dyb3VwKGRyaXZlKSkKLQkJZ290byBvdXQ7Ci0JLyoKLQkgKiBzZXQgLT5idXN5IGZsYWcsIHVubG9jayBhbmQgbGV0IGl0IHJpZGUKLQkgKi8KLQlod2lmLT5od2dyb3VwLT5idXN5ID0gMTsKLQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKLQogCWVyciA9IDA7CiAKIAlpZiAoYXJnKSB7CkBAIC0zNTEsMTIgKzMwMyw2IEBACiAJfSBlbHNlCiAJCWlkZV9kbWFfb2ZmKGRyaXZlKTsKIAotCS8qCi0JICogbG9jaywgY2xlYXIgLT5idXN5IGZsYWcgYW5kIHVubG9jayBiZWZvcmUgbGVhdmluZwotCSAqLwotCXNwaW5fbG9ja19pcnEoJmlkZV9sb2NrKTsKLQlod2lmLT5od2dyb3VwLT5idXN5ID0gMDsKLQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogI2Vsc2UKQEAgLTM2Nyw5ICszMTMsMzIgQEAKICNlbmRpZgogfQogCi1pbnQgc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGFyZykKKy8qCisgKiBoYW5kbGUgSERJT19TRVRfUElPX01PREUgaW9jdGwgYWJ1c2VycyBoZXJlLCBldmVudHVhbGx5IGl0IHdpbGwgZ28gYXdheQorICovCitzdGF0aWMgaW50IHNldF9waW9fbW9kZV9hYnVzZShpZGVfaHdpZl90ICpod2lmLCB1OCByZXFfcGlvKQogewotCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlzd2l0Y2ggKHJlcV9waW8pIHsKKwljYXNlIDIwMjoKKwljYXNlIDIwMToKKwljYXNlIDIwMDoKKwljYXNlIDEwMjoKKwljYXNlIDEwMToKKwljYXNlIDEwMDoKKwkJcmV0dXJuIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX0FCVVNFX0RNQV9NT0RFUykgPyAxIDogMDsKKwljYXNlIDk6CisJY2FzZSA4OgorCQlyZXR1cm4gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfQUJVU0VfUFJFRkVUQ0gpID8gMSA6IDA7CisJY2FzZSA3OgorCWNhc2UgNjoKKwkJcmV0dXJuIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX0FCVVNFX0ZBU1RfREVWU0VMKSA/IDEgOiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBzZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQorewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwogCkBAIC0zODAsNDggKzM0OSw2NSBAQAogCSAgICAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19TRVRfTU9ERSkpCiAJCXJldHVybiAtRU5PU1lTOwogCi0JaWYgKGRyaXZlLT5zcGVjaWFsLmIuc2V0X3R1bmUpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKHNldF9waW9fbW9kZV9hYnVzZShkcml2ZS0+aHdpZiwgYXJnKSkgeworCQlpZiAoYXJnID09IDggfHwgYXJnID09IDkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlycSA9IGJsa19nZXRfcmVxdWVzdChkcml2ZS0+cXVldWUsIFJFQUQsIF9fR0ZQX1dBSVQpOwotCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0FUQV9UQVNLRklMRTsKKwkJCS8qIHRha2UgbG9jayBmb3IgSURFX0RGTEFHX1tOT19dVU5NQVNLL1tOT19dSU9fMzJCSVQgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCX0gZWxzZQorCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKKwl9IGVsc2UgeworCQlpbnQga2VlcF9kbWEgPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSk7CiAKLQlkcml2ZS0+dHVuZV9yZXEgPSAodTgpIGFyZzsKLQlkcml2ZS0+c3BlY2lhbC5iLnNldF90dW5lID0gMTsKKwkJaWRlX3NldF9waW8oZHJpdmUsIGFyZyk7CiAKLQlibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIE5VTEwsIHJxLCAwKTsKLQlibGtfcHV0X3JlcXVlc3QocnEpOworCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVRfUElPX01PREVfS0VFUF9ETUEpIHsKKwkJCWlmIChrZWVwX2RtYSkKKwkJCQlpZGVfZG1hX29uKGRyaXZlKTsKKwkJfQorCX0KIAogCXJldHVybiAwOwogfQogCitpZGVfZGV2c2V0X2dldF9mbGFnKHVubWFza2lycSwgSURFX0RGTEFHX1VOTUFTSyk7CisKIHN0YXRpYyBpbnQgc2V0X3VubWFza2lycShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpCiB7Ci0JaWYgKGRyaXZlLT5ub191bm1hc2spCisJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9fVU5NQVNLKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGFyZyA8IDAgfHwgYXJnID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaWRlX3NwaW5fd2FpdF9od2dyb3VwKGRyaXZlKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlkcml2ZS0+dW5tYXNrID0gYXJnOwotCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOworCWlmIChhcmcpCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1VOTUFTSzsKKwllbHNlCisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19VTk1BU0s7CiAKIAlyZXR1cm4gMDsKIH0KIAoraWRlX2V4dF9kZXZzZXRfcndfc3luYyhpb18zMmJpdCwgaW9fMzJiaXQpOworaWRlX2V4dF9kZXZzZXRfcndfc3luYyhrZWVwc2V0dGluZ3MsIGtzZXR0aW5ncyk7CitpZGVfZXh0X2RldnNldF9yd19zeW5jKHVubWFza2lycSwgdW5tYXNraXJxKTsKK2lkZV9leHRfZGV2c2V0X3J3X3N5bmModXNpbmdfZG1hLCB1c2luZ19kbWEpOworX19JREVfREVWU0VUKHBpb19tb2RlLCBEU19TWU5DLCBOVUxMLCBzZXRfcGlvX21vZGUpOworCiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGRldi0+ZHJpdmVyX2RhdGEsICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOwogCWlkZV90YXNrX3QgYXJnczsKIAlpbnQgcmV0OwogCi0JLyogQ2FsbCBBQ1BJIF9HVE0gb25seSBvbmNlICovCi0JaWYgKCEoZHJpdmUtPmRuICUgMikpCisJLyogY2FsbCBBQ1BJIF9HVE0gb25seSBvbmNlICovCisJaWYgKChkcml2ZS0+ZG4gJiAxKSA9PSAwIHx8IHBhaXIgPT0gTlVMTCkKIAkJaWRlX2FjcGlfZ2V0X3RpbWluZyhod2lmKTsKIAogCW1lbXNldCgmcnFwbSwgMCwgc2l6ZW9mKHJxcG0pKTsKQEAgLTQzMCwzMyArNDE2LDMyIEBACiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfUE1fU1VTUEVORDsKIAlycS0+c3BlY2lhbCA9ICZhcmdzOwogCXJxLT5kYXRhID0gJnJxcG07Ci0JcnFwbS5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX3N0YXJ0X3N1c3BlbmQ7CisJcnFwbS5wbV9zdGVwID0gSURFX1BNX1NUQVJUX1NVU1BFTkQ7CiAJaWYgKG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKIAkJbWVzZy5ldmVudCA9IFBNX0VWRU5UX0ZSRUVaRTsKIAlycXBtLnBtX3N0YXRlID0gbWVzZy5ldmVudDsKIAogCXJldCA9IGJsa19leGVjdXRlX3JxKGRyaXZlLT5xdWV1ZSwgTlVMTCwgcnEsIDApOwogCWJsa19wdXRfcmVxdWVzdChycSk7Ci0JLyogb25seSBjYWxsIEFDUEkgX1BTMyBhZnRlciBib3RoIGRyaXZlcnMgYXJlIHN1c3BlbmRlZCAqLwotCWlmICghcmV0ICYmICgoKGRyaXZlLT5kbiAlIDIpICYmIGh3aWYtPmRyaXZlc1swXS5wcmVzZW50Ci0JCSAmJiBod2lmLT5kcml2ZXNbMV0ucHJlc2VudCkKLQkJIHx8ICFod2lmLT5kcml2ZXNbMF0ucHJlc2VudAotCQkgfHwgIWh3aWYtPmRyaXZlc1sxXS5wcmVzZW50KSkKKworCS8qIGNhbGwgQUNQSSBfUFMzIG9ubHkgYWZ0ZXIgYm90aCBkZXZpY2VzIGFyZSBzdXNwZW5kZWQgKi8KKwlpZiAocmV0ID09IDAgJiYgKChkcml2ZS0+ZG4gJiAxKSB8fCBwYWlyID09IE5VTEwpKQogCQlpZGVfYWNwaV9zZXRfc3RhdGUoaHdpZiwgMCk7CisKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YTsKKwlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhLCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgcnFwbTsKIAlpZGVfdGFza190IGFyZ3M7CiAJaW50IGVycjsKIAotCS8qIENhbGwgQUNQSSBfU1RNIG9ubHkgb25jZSAqLwotCWlmICghKGRyaXZlLT5kbiAlIDIpKSB7CisJLyogY2FsbCBBQ1BJIF9QUzAgLyBfU1RNIG9ubHkgb25jZSAqLworCWlmICgoZHJpdmUtPmRuICYgMSkgPT0gMCB8fCBwYWlyID09IE5VTEwpIHsKIAkJaWRlX2FjcGlfc2V0X3N0YXRlKGh3aWYsIDEpOwogCQlpZGVfYWNwaV9wdXNoX3RpbWluZyhod2lmKTsKIAl9CkBAIC00NzAsNyArNDU1LDcgQEAKIAlycS0+Y21kX2ZsYWdzIHw9IFJFUV9QUkVFTVBUOwogCXJxLT5zcGVjaWFsID0gJmFyZ3M7CiAJcnEtPmRhdGEgPSAmcnFwbTsKLQlycXBtLnBtX3N0ZXAgPSBpZGVfcG1fc3RhdGVfc3RhcnRfcmVzdW1lOworCXJxcG0ucG1fc3RlcCA9IElERV9QTV9TVEFSVF9SRVNVTUU7CiAJcnFwbS5wbV9zdGF0ZSA9IFBNX0VWRU5UX09OOwogCiAJZXJyID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMSk7CkBAIC00ODYsMTM4ICs0NzEsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuZXJpY19kcml2ZV9yZXNldChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0Jc3RydWN0IHJlcXVlc3QgKnJxOwotCWludCByZXQgPSAwOwotCi0JcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCXJxLT5jbWRfbGVuID0gMTsKLQlycS0+Y21kWzBdID0gUkVRX0RSSVZFX1JFU0VUOwotCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1NPRlRCQVJSSUVSOwotCWlmIChibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIE5VTEwsIHJxLCAxKSkKLQkJcmV0ID0gcnEtPmVycm9yczsKLQlibGtfcHV0X3JlcXVlc3QocnEpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBnZW5lcmljX2lkZV9pb2N0bChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZGVfZHJpdmVyX3QgKmRydjsKLQl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgZXJyID0gMCwgKCpzZXRmdW5jKShpZGVfZHJpdmVfdCAqLCBpbnQpOwotCXU4ICp2YWw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSERJT19HRVRfMzJCSVQ6CSAgICB2YWwgPSAmZHJpdmUtPmlvXzMyYml0OwkgZ290byByZWFkX3ZhbDsKLQljYXNlIEhESU9fR0VUX0tFRVBTRVRUSU5HUzogdmFsID0gJmRyaXZlLT5rZWVwX3NldHRpbmdzOyBnb3RvIHJlYWRfdmFsOwotCWNhc2UgSERJT19HRVRfVU5NQVNLSU5UUjogICB2YWwgPSAmZHJpdmUtPnVubWFzazsJIGdvdG8gcmVhZF92YWw7Ci0JY2FzZSBIRElPX0dFVF9ETUE6CSAgICB2YWwgPSAmZHJpdmUtPnVzaW5nX2RtYTsJIGdvdG8gcmVhZF92YWw7Ci0JY2FzZSBIRElPX1NFVF8zMkJJVDoJICAgIHNldGZ1bmMgPSBzZXRfaW9fMzJiaXQ7CSBnb3RvIHNldF92YWw7Ci0JY2FzZSBIRElPX1NFVF9LRUVQU0VUVElOR1M6IHNldGZ1bmMgPSBzZXRfa3NldHRpbmdzOwkgZ290byBzZXRfdmFsOwotCWNhc2UgSERJT19TRVRfUElPX01PREU6CSAgICBzZXRmdW5jID0gc2V0X3Bpb19tb2RlOwkgZ290byBzZXRfdmFsOwotCWNhc2UgSERJT19TRVRfVU5NQVNLSU5UUjogICBzZXRmdW5jID0gc2V0X3VubWFza2lycTsJIGdvdG8gc2V0X3ZhbDsKLQljYXNlIEhESU9fU0VUX0RNQToJICAgIHNldGZ1bmMgPSBzZXRfdXNpbmdfZG1hOwkgZ290byBzZXRfdmFsOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgSERJT19PQlNPTEVURV9JREVOVElUWToKLQkJY2FzZSBIRElPX0dFVF9JREVOVElUWToKLQkJCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGRyaXZlLT5pZF9yZWFkID09IDApCi0JCQkJcmV0dXJuIC1FTk9NU0c7Ci0JCQlpZiAoY29weV90b191c2VyKHAsIGRyaXZlLT5pZCwgKGNtZCA9PSBIRElPX0dFVF9JREVOVElUWSkgPyBzaXplb2YoKmRyaXZlLT5pZCkgOiAxNDIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBIRElPX0dFVF9OSUNFOgotCQkJcmV0dXJuIHB1dF91c2VyKGRyaXZlLT5kc2Nfb3ZlcmxhcAk8PAlJREVfTklDRV9EU0NfT1ZFUkxBUAl8Ci0JCQkJCWRyaXZlLT5hdGFwaV9vdmVybGFwCTw8CUlERV9OSUNFX0FUQVBJX09WRVJMQVAJfAotCQkJCQlkcml2ZS0+bmljZTEgPDwgSURFX05JQ0VfMSwKLQkJCQkJKGxvbmcgX191c2VyICopIGFyZyk7Ci0jaWZkZWYgQ09ORklHX0lERV9UQVNLX0lPQ1RMCi0JCWNhc2UgSERJT19EUklWRV9UQVNLRklMRToKLQkJICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCi0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlzd2l0Y2goZHJpdmUtPm1lZGlhKSB7Ci0JCQkJY2FzZSBpZGVfZGlzazoKLQkJCQkJcmV0dXJuIGlkZV90YXNrZmlsZV9pb2N0bChkcml2ZSwgY21kLCBhcmcpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiAtRU5PTVNHOwotCQkJfQotI2VuZGlmIC8qIENPTkZJR19JREVfVEFTS19JT0NUTCAqLwotCi0JCWNhc2UgSERJT19EUklWRV9DTUQ6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCi0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlyZXR1cm4gaWRlX2NtZF9pb2N0bChkcml2ZSwgY21kLCBhcmcpOwotCi0JCWNhc2UgSERJT19EUklWRV9UQVNLOgotCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQotCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJcmV0dXJuIGlkZV90YXNrX2lvY3RsKGRyaXZlLCBjbWQsIGFyZyk7Ci0JCWNhc2UgSERJT19TRVRfTklDRToKLQkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuIC1FQUNDRVM7Ci0JCQlpZiAoYXJnICE9IChhcmcgJiAoKDEgPDwgSURFX05JQ0VfRFNDX09WRVJMQVApIHwgKDEgPDwgSURFX05JQ0VfMSkpKSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJZHJpdmUtPmRzY19vdmVybGFwID0gKGFyZyA+PiBJREVfTklDRV9EU0NfT1ZFUkxBUCkgJiAxOwotCQkJZHJ2ID0gKihpZGVfZHJpdmVyX3QgKiopYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQkJaWYgKGRyaXZlLT5kc2Nfb3ZlcmxhcCAmJiAhZHJ2LT5zdXBwb3J0c19kc2Nfb3ZlcmxhcCkgewotCQkJCWRyaXZlLT5kc2Nfb3ZlcmxhcCA9IDA7Ci0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCX0KLQkJCWRyaXZlLT5uaWNlMSA9IChhcmcgPj4gSURFX05JQ0VfMSkgJiAxOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgSERJT19EUklWRV9SRVNFVDoKLQkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQotCQkJcmV0dXJuIGdlbmVyaWNfZHJpdmVfcmVzZXQoZHJpdmUpOwotCi0JCWNhc2UgSERJT19HRVRfQlVTU1RBVEU6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlpZiAocHV0X3VzZXIoSFdJRihkcml2ZSktPmJ1c19zdGF0ZSwgKGxvbmcgX191c2VyICopYXJnKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSERJT19TRVRfQlVTU1RBVEU6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLXJlYWRfdmFsOgotCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7Ci0JZXJyID0gKnZhbDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCW11dGV4X3VubG9jaygmaWRlX3NldHRpbmdfbXR4KTsKLQlyZXR1cm4gZXJyID49IDAgPyBwdXRfdXNlcihlcnIsIChsb25nIF9fdXNlciAqKWFyZykgOiBlcnI7Ci0KLXNldF92YWw6Ci0JaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCi0JCWVyciA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCWVyciA9IC1FQUNDRVM7Ci0JCWVsc2UgewotCQkJbXV0ZXhfbG9jaygmaWRlX3NldHRpbmdfbXR4KTsKLQkJCWVyciA9IHNldGZ1bmMoZHJpdmUsIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmlkZV9zZXR0aW5nX210eCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotRVhQT1JUX1NZTUJPTChnZW5lcmljX2lkZV9pb2N0bCk7Ci0KIC8qKgogICogaWRlX2RldmljZV9nZXQJLQlnZXQgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gYSBpZGVfZHJpdmVfdAogICogQGRyaXZlOglkZXZpY2UgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvCkBAIC03MTAsMjEgKzU2MywyMSBAQAogCQkJICBjaGFyICpidWYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkcml2ZS0+aWQtPm1vZGVsKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgKGNoYXIgKikmZHJpdmUtPmlkW0FUQV9JRF9QUk9EXSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGZpcm13YXJlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgY2hhciAqYnVmKQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZHJpdmUtPmlkLT5md19yZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX0ZXX1JFVl0pOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXJpYWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgY2hhciAqYnVmKQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZHJpdmUtPmlkLT5zZXJpYWxfbm8pOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1NFUk5PXSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpZGVfZGV2X2F0dHJzW10gPSB7CkBAIC03MzQsNiArNTg3LDcgQEAKIAlfX0FUVFJfUk8obW9kZWwpLAogCV9fQVRUUl9STyhmaXJtd2FyZSksCiAJX19BVFRSKHNlcmlhbCwgMDQwMCwgc2VyaWFsX3Nob3csIE5VTEwpLAorCV9fQVRUUih1bmxvYWRfaGVhZHMsIDA2NDQsIGlkZV9wYXJrX3Nob3csIGlkZV9wYXJrX3N0b3JlKSwKIAlfX0FUVFJfTlVMTAogfTsKIApAQCAtODQxLDcgKzY5NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGlkZV9ub3dlcnI7CiAKIG1vZHVsZV9wYXJhbV9jYWxsKG5vd2VyciwgaWRlX3NldF9kZXZfcGFyYW1fbWFzaywgTlVMTCwgJmlkZV9ub3dlcnIsIDApOwotTU9EVUxFX1BBUk1fREVTQyhub3dlcnIsICJpZ25vcmUgdGhlIFdSRVJSX1NUQVQgYml0IGZvciBhIGRldmljZSIpOworTU9EVUxFX1BBUk1fREVTQyhub3dlcnIsICJpZ25vcmUgdGhlIEFUQV9ERiBiaXQgZm9yIGEgZGV2aWNlIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaWRlX2Nkcm9tczsKIApAQCAtODg4LDMxICs3NDIsMzEgQEAKIG1vZHVsZV9wYXJhbV9jYWxsKGNocywgaWRlX3NldF9kaXNrX2NocywgTlVMTCwgTlVMTCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNocywgImZvcmNlIGRldmljZSBhcyBhIGRpc2sgKHVzaW5nIENIUykiKTsKIAotc3RhdGljIHZvaWQgaWRlX2Rldl9hcHBseV9wYXJhbXMoaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIHZvaWQgaWRlX2Rldl9hcHBseV9wYXJhbXMoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCB1bml0KQogewotCWludCBpID0gZHJpdmUtPmh3aWYtPmluZGV4ICogTUFYX0RSSVZFUyArIGRyaXZlLT5zZWxlY3QuYi51bml0OworCWludCBpID0gZHJpdmUtPmh3aWYtPmluZGV4ICogTUFYX0RSSVZFUyArIHVuaXQ7CiAKIAlpZiAoaWRlX25vZG1hICYgKDEgPDwgaSkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlOiBkaXNhbGxvd2luZyBETUEgZm9yICVzXG4iLCBkcml2ZS0+bmFtZSk7Ci0JCWRyaXZlLT5ub2RtYSA9IDE7CisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PRE1BOwogCX0KIAlpZiAoaWRlX25vZmx1c2ggJiAoMSA8PCBpKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJpZGU6IGRpc2FibGluZyBmbHVzaCByZXF1ZXN0cyBmb3IgJXNcbiIsCiAJCQkJIGRyaXZlLT5uYW1lKTsKLQkJZHJpdmUtPm5vZmx1c2ggPSAxOworCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19OT0ZMVVNIOwogCX0KIAlpZiAoaWRlX25vcHJvYmUgJiAoMSA8PCBpKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJpZGU6IHNraXBwaW5nIHByb2JlIGZvciAlc1xuIiwgZHJpdmUtPm5hbWUpOwotCQlkcml2ZS0+bm9wcm9iZSA9IDE7CisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PUFJPQkU7CiAJfQogCWlmIChpZGVfbm93ZXJyICYgKDEgPDwgaSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaWRlOiBpZ25vcmluZyB0aGUgV1JFUlJfU1RBVCBiaXQgZm9yICVzXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJpZGU6IGlnbm9yaW5nIHRoZSBBVEFfREYgYml0IGZvciAlc1xuIiwKIAkJCQkgZHJpdmUtPm5hbWUpOwogCQlkcml2ZS0+YmFkX3dzdGF0ID0gQkFEX1JfU1RBVDsKIAl9CiAJaWYgKGlkZV9jZHJvbXMgJiAoMSA8PCBpKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJpZGU6IGZvcmNpbmcgJXMgYXMgYSBDRC1ST01cbiIsIGRyaXZlLT5uYW1lKTsKLQkJZHJpdmUtPnByZXNlbnQgPSAxOworCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19QUkVTRU5UOwogCQlkcml2ZS0+bWVkaWEgPSBpZGVfY2Ryb207CiAJCS8qIGFuIEFUQVBJIGRldmljZSBpZ25vcmVzIERSRFkgKi8KIAkJZHJpdmUtPnJlYWR5X3N0YXQgPSAwOwpAQCAtOTIxLDEzICs3NzUsMTQgQEAKIAkJZHJpdmUtPmN5bCAgPSBkcml2ZS0+Ymlvc19jeWwgID0gaWRlX2Rpc2tzX2Noc1tpXS5jeWw7CiAJCWRyaXZlLT5oZWFkID0gZHJpdmUtPmJpb3NfaGVhZCA9IGlkZV9kaXNrc19jaHNbaV0uaGVhZDsKIAkJZHJpdmUtPnNlY3QgPSBkcml2ZS0+Ymlvc19zZWN0ID0gaWRlX2Rpc2tzX2Noc1tpXS5zZWN0OwotCQlkcml2ZS0+Zm9yY2VkX2dlb20gPSAxOworCiAJCXByaW50ayhLRVJOX0lORk8gImlkZTogZm9yY2luZyAlcyBhcyBhIGRpc2sgKCVkLyVkLyVkKVxuIiwKIAkJCQkgZHJpdmUtPm5hbWUsCiAJCQkJIGRyaXZlLT5jeWwsIGRyaXZlLT5oZWFkLCBkcml2ZS0+c2VjdCk7Ci0JCWRyaXZlLT5wcmVzZW50ID0gMTsKKworCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19GT1JDRURfR0VPTSB8IElERV9ERkxBR19QUkVTRU5UOwogCQlkcml2ZS0+bWVkaWEgPSBpZGVfZGlzazsKLQkJZHJpdmUtPnJlYWR5X3N0YXQgPSBSRUFEWV9TVEFUOworCQlkcml2ZS0+cmVhZHlfc3RhdCA9IEFUQV9EUkRZOwogCX0KIH0KIApAQCAtOTY1LDcgKzgyMCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykKLQkJaWRlX2Rldl9hcHBseV9wYXJhbXMoJmh3aWYtPmRyaXZlc1tpXSk7CisJCWlkZV9kZXZfYXBwbHlfcGFyYW1zKCZod2lmLT5kcml2ZXNbaV0sIGkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2FsaTE0eHguYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9hbGkxNHh4LmMKaW5kZXggNGVjMTk3My4uOTBkYTFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2FsaTE0eHguYworKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvYWxpMTR4eC5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApAQCAtMTMyLDcgKzEzMSw3IEBACiAJCWRyaXZlLT5uYW1lLCBwaW8sIHRpbWUxLCB0aW1lMiwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KTsKIAogCS8qIHN0dWZmIHRpbWluZyBwYXJhbWV0ZXJzIGludG8gY29udHJvbGxlciByZWdpc3RlcnMgKi8KLQlkcml2ZU51bSA9IChIV0lGKGRyaXZlKS0+aW5kZXggPDwgMSkgKyBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlkcml2ZU51bSA9IChkcml2ZS0+aHdpZi0+aW5kZXggPDwgMSkgKyAoZHJpdmUtPmRuICYgMSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFsaTE0eHhfbG9jaywgZmxhZ3MpOwogCW91dGJfcChyZWdPbiwgYmFzZVBvcnQpOwogCW91dFJlZyhwYXJhbTEsIHJlZ1RhYltkcml2ZU51bV0ucmVnMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvYnVkZGhhLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvYnVkZGhhLmMKaW5kZXggN2MyYWZhOS4uYzVhM2M5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2J1ZGRoYS5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9idWRkaGEuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9kdGMyMjc4LmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvZHRjMjI3OC5jCmluZGV4IGFmNzkxYTAuLjY4OWIyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9kdGMyMjc4LmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2R0YzIyNzguYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9mYWxjb25pZGUuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9mYWxjb25pZGUuYwppbmRleCA3MjRmOTUwLi4zOWQ1MDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvZmFsY29uaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2ZhbGNvbmlkZS5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2dheWxlLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvZ2F5bGUuYwppbmRleCA1MWJhMDg1Li42OTE1MDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvZ2F5bGUuYworKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvZ2F5bGUuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9odDY1NjBiLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaHQ2NTYwYi5jCmluZGV4IDk4ZjdjOTVlLi5jN2U1YzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaHQ2NTYwYi5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9odDY1NjBiLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC0xMjEsNyArMTIwLDggQEAKIAkgKiBOZWVkIHRvIGVuZm9yY2UgcHJlZmV0Y2ggc29tZXRpbWVzIGJlY2F1c2Ugb3RoZXJ3aXNlCiAJICogaXQnbGwgaGFuZyAoaGFyZCkuCiAJICovCi0JaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCAhZHJpdmUtPnByZXNlbnQpCisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fAorCSAgICAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlzZWxlY3QgfD0gSFRfUFJFRkVUQ0hfTU9ERTsKIAogCWlmIChzZWxlY3QgIT0gY3VycmVudF9zZWxlY3QgfHwgdGltaW5nICE9IGN1cnJlbnRfdGltaW5nKSB7CkBAIC0yNTAsMTEgKzI1MCwxMSBAQAogCSAqLwogCWlmIChzdGF0ZSkgewogCQlkcml2ZS0+ZHJpdmVfZGF0YSB8PSB0OyAgIC8qIGVuYWJsZSBwcmVmZXRjaCBtb2RlICovCi0JCWRyaXZlLT5ub191bm1hc2sgPSAxOwotCQlkcml2ZS0+dW5tYXNrID0gMDsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTk9fVU5NQVNLOworCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfVU5NQVNLOwogCX0gZWxzZSB7CiAJCWRyaXZlLT5kcml2ZV9kYXRhICY9IH50OyAgLyogZGlzYWJsZSBwcmVmZXRjaCBtb2RlICovCi0JCWRyaXZlLT5ub191bm1hc2sgPSAwOworCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9fVU5NQVNLOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0NjU2MGJfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS00ZHJpdmVzLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLTRkcml2ZXMuYwppbmRleCBjNzZkNTVkLi45ZTg1YjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLTRkcml2ZXMuYworKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLTRkcml2ZXMuYwpAQCAtMTQsNyArMTQsNyBAQAogc3RhdGljIHZvaWQgaWRlXzRkcml2ZXNfaW5pdF9kZXYoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlmIChkcml2ZS0+aHdpZi0+Y2hhbm5lbCkKLQkJZHJpdmUtPnNlbGVjdC5hbGwgXj0gMHgyMDsKKwkJZHJpdmUtPnNlbGVjdCBePSAweDIwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyBpZGVfNGRyaXZlc19wb3J0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwppbmRleCAyMWJmYWMxLi5jYjE5OWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTIyMCwxMDMgKzIxOSw5MSBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCitzdHJ1Y3QgcGNtY2lhX2NvbmZpZ19jaGVjayB7CisJdW5zaWduZWQgbG9uZyBjdGxfYmFzZTsKKwlpbnQgc2tpcF92Y2M7CisJaW50IGlzX2ttZTsKK307CisKK3N0YXRpYyBpbnQgcGNtY2lhX2NoZWNrX29uZV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYsCisJCQkJICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJCSAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkJICAgdW5zaWduZWQgaW50IHZjYywKKwkJCQkgICB2b2lkICpwcml2X2RhdGEpCit7CisJc3RydWN0IHBjbWNpYV9jb25maWdfY2hlY2sgKnN0ayA9IHByaXZfZGF0YTsKKworCS8qIENoZWNrIGZvciBtYXRjaGluZyBWY2MsIHVubGVzcyB3ZSdyZSBkZXNwZXJhdGUgKi8KKwlpZiAoIXN0ay0+c2tpcF92Y2MpIHsKKwkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmICh2Y2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0gZWxzZSBpZiAoZGZsdC0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmICh2Y2MgIT0gZGZsdC0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQorCQlwZGV2LT5jb25mLlZwcCA9IGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwllbHNlIGlmIChkZmx0LT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBkZXYtPmNvbmYuVnBwID0gZGZsdC0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKworCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgeworCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOworCQlwZGV2LT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKwkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQlwZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJaWYgKGlvLT5ud2luID09IDIpIHsKKwkJCXBkZXYtPmlvLk51bVBvcnRzMSA9IDg7CisJCQlwZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSAoc3RrLT5pc19rbWUpID8gMiA6IDE7CisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSAhPSAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJc3RrLT5jdGxfYmFzZSA9IHBkZXYtPmlvLkJhc2VQb3J0MjsKKwkJfSBlbHNlIGlmICgoaW8tPm53aW4gPT0gMSkgJiYgKGlvLT53aW5bMF0ubGVuID49IDE2KSkgeworCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZwZGV2LT5pbykgIT0gMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXN0ay0+Y3RsX2Jhc2UgPSBwZGV2LT5pby5CYXNlUG9ydDEgKyAweDBlOworCQl9IGVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCQkvKiBJZiB3ZSd2ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGRvbmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW50IGlkZV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAgICAgaWRlX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBzdHJ1Y3QgewotCXVfc2hvcnQJCWJ1ZlsxMjhdOwotCWNpc3BhcnNlX3QJcGFyc2U7Ci0JY29uZmlnX2luZm9fdAljb25mOwotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdDsKLSAgICB9ICpzdGsgPSBOVUxMOwotICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZzsKLSAgICBpbnQgcGFzcywgbGFzdF9yZXQgPSAwLCBsYXN0X2ZuID0gMCwgaXNfa21lID0gMDsKKyAgICBzdHJ1Y3QgcGNtY2lhX2NvbmZpZ19jaGVjayAqc3RrID0gTlVMTDsKKyAgICBpbnQgbGFzdF9yZXQgPSAwLCBsYXN0X2ZuID0gMCwgaXNfa21lID0gMDsKICAgICB1bnNpZ25lZCBsb25nIGlvX2Jhc2UsIGN0bF9iYXNlOwogICAgIHN0cnVjdCBpZGVfaG9zdCAqaG9zdDsKIAogICAgIERFQlVHKDAsICJpZGVfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHN0ayA9IGt6YWxsb2Moc2l6ZW9mKCpzdGspLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIXN0aykgZ290byBlcnJfbWVtOwotICAgIGNmZyA9ICZzdGstPnBhcnNlLmNmdGFibGVfZW50cnk7Ci0KLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopJnN0ay0+YnVmOwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0KICAgICBpc19rbWUgPSAoKGxpbmstPm1hbmZfaWQgPT0gTUFORklEX0tNRSkgJiYKIAkgICAgICAoKGxpbmstPmNhcmRfaWQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0EpIHx8CiAJICAgICAgIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9LTUVfS1hMQzAwNV9CKSkpOwogCi0gICAgLyogTm90IHN1cmUgaWYgdGhpcyBpcyByaWdodC4uLiBsb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwotICAgIENTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmc3RrLT5jb25mKSk7CisgICAgc3RrID0ga3phbGxvYyhzaXplb2YoKnN0ayksIEdGUF9LRVJORUwpOworICAgIGlmICghc3RrKQorCSAgICBnb3RvIGVycl9tZW07CisgICAgc3RrLT5pc19rbWUgPSBpc19rbWU7CisgICAgc3RrLT5za2lwX3ZjYyA9IGlvX2Jhc2UgPSBjdGxfYmFzZSA9IDA7CiAKLSAgICBwYXNzID0gaW9fYmFzZSA9IGN0bF9iYXNlID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSAhPSAwKSBnb3RvIG5leHRfZW50cnk7Ci0JaWYgKHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZzdGstPnBhcnNlKSAhPSAwKSBnb3RvIG5leHRfZW50cnk7Ci0KLQkvKiBDaGVjayBmb3IgbWF0Y2hpbmcgVmNjLCB1bmxlc3Mgd2UncmUgZGVzcGVyYXRlICovCi0JaWYgKCFwYXNzKSB7Ci0JICAgIGlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCWlmIChzdGstPmNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKQotCQkgICAgZ290byBuZXh0X2VudHJ5OwotCSAgICB9IGVsc2UgaWYgKHN0ay0+ZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQlpZiAoc3RrLT5jb25mLlZjYyAhPSBzdGstPmRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKQotCQkgICAgZ290byBuZXh0X2VudHJ5OwotCSAgICB9Ci0JfQotCi0JaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCSAgICBsaW5rLT5jb25mLlZwcCA9Ci0JCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLQllbHNlIGlmIChzdGstPmRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCSAgICBsaW5rLT5jb25mLlZwcCA9Ci0JCXN0ay0+ZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCi0JaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoc3RrLT5kZmx0LmlvLm53aW4gPiAwKSkgewotCSAgICBjaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJnN0ay0+ZGZsdC5pbzsKLQkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkgICAgaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkgICAgaWYgKGlvLT5ud2luID09IDIpIHsKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gODsKLQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czIgPSAoaXNfa21lKSA/IDIgOiAxOwotCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSAhPSAwKQotCQkJZ290byBuZXh0X2VudHJ5OwotCQlpb19iYXNlID0gbGluay0+aW8uQmFzZVBvcnQxOwotCQljdGxfYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MjsKLQkgICAgfSBlbHNlIGlmICgoaW8tPm53aW4gPT0gMSkgJiYgKGlvLT53aW5bMF0ubGVuID49IDE2KSkgewotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykgIT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJaW9fYmFzZSA9IGxpbmstPmlvLkJhc2VQb3J0MTsKLQkJY3RsX2Jhc2UgPSBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDBlOwotCSAgICB9IGVsc2UgZ290byBuZXh0X2VudHJ5OwotCSAgICAvKiBJZiB3ZSd2ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGRvbmUgKi8KLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgbmV4dF9lbnRyeToKLQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0JICAgIG1lbWNweSgmc3RrLT5kZmx0LCBjZmcsIHNpemVvZihzdGstPmRmbHQpKTsKLQlpZiAocGFzcykgewotCSAgICBDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl9IGVsc2UgaWYgKHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpICE9IDApIHsKLQkgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQkgICAgbWVtc2V0KCZzdGstPmRmbHQsIDAsIHNpemVvZihzdGstPmRmbHQpKTsKLQkgICAgcGFzcysrOwotCX0KKyAgICBpZiAocGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHBjbWNpYV9jaGVja19vbmVfY29uZmlnLCBzdGspKSB7CisJICAgIHN0ay0+c2tpcF92Y2MgPSAxOworCSAgICBpZiAocGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHBjbWNpYV9jaGVja19vbmVfY29uZmlnLCBzdGspKQorCQkgICAgZ290byBmYWlsZWQ7IC8qIE5vIHN1aXRhYmxlIGNvbmZpZyBmb3VuZCAqLwogICAgIH0KKyAgICBpb19iYXNlID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGN0bF9iYXNlID0gc3RrLT5jdGxfYmFzZTsKIAogICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CiAgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKQEAgLTQwNCw4ICszOTEsMTAgQEAKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwMGEsIDB4MDAwMCksCS8qIEktTyBEYXRhIENGQSAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAxYywgMHgwMDAxKSwJLyogTWl0c3ViaXNoaSBDRkEgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwMzIsIDB4MDcwNCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDMyLCAweDI5MDQpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA0NSwgMHgwNDAxKSwJLyogU2FuRGlzayBDRkEgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwNGYsIDB4MDAwMCksCS8qIEtpbmdzdG9uICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDk3LCAweDE2MjApLCAJLyogVEkgZW11bGF0ZWQgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwOTgsIDB4MDAwMCksCS8qIFRvc2hpYmEgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwYTQsIDB4MDAyZCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMGNlLCAweDAwMDApLAkvKiBTYW1zdW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvbWFjaWRlLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvbWFjaWRlLmMKaW5kZXggYTBiYjE2Ny4uNDNmOTdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L21hY2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9tYWNpZGUuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMKaW5kZXggNGFiZDhmYy4uNGFmNGE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L3E0MGlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYwpAQCAtMTQsOCArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9xZDY1eHguYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9xZDY1eHguYwppbmRleCAyMzM4ZjM0Li5iYzI3YzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvcWQ2NXh4LmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0xNTEsMTIgKzE1MCwxNCBAQAogCQlpbnQgKmFjdGl2ZV90aW1lLCBpbnQgKnJlY292ZXJ5X3RpbWUpCiB7CiAJc3RydWN0IHFkNjV4eF90aW1pbmdfcyAqcDsKLQljaGFyIG1vZGVsWzQwXTsKKwljaGFyICptID0gKGNoYXIgKikmZHJpdmUtPmlkW0FUQV9JRF9QUk9EXTsKKwljaGFyIG1vZGVsW0FUQV9JRF9QUk9EX0xFTl07CiAKLQlpZiAoISpkcml2ZS0+aWQtPm1vZGVsKSByZXR1cm4gMDsKKwlpZiAoKm0gPT0gMCkKKwkJcmV0dXJuIDA7CiAKLQlzdHJuY3B5KG1vZGVsLGRyaXZlLT5pZC0+bW9kZWwsNDApOwotCWlkZV9maXhzdHJpbmcobW9kZWwsNDAsMSk7IC8qIGJ5dGUtc3dhcCAqLworCXN0cm5jcHkobW9kZWwsIG0sIEFUQV9JRF9QUk9EX0xFTik7CisJaWRlX2ZpeHN0cmluZyhtb2RlbCwgQVRBX0lEX1BST0RfTEVOLCAxKTsgLyogYnl0ZS1zd2FwICovCiAKIAlmb3IgKHAgPSBxZDY1eHhfdGltaW5nIDsgcC0+b2Zmc2V0ICE9IC0xIDsgcCsrKSB7CiAJCWlmICghc3RybmNtcChwLT5tb2RlbCwgbW9kZWwrcC0+b2Zmc2V0LCA0KSkgewpAQCAtMTg1LDIwICsxODYsMjAgQEAKIAogc3RhdGljIHZvaWQgcWQ2NTAwX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKKwl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWludCBhY3RpdmVfdGltZSAgID0gMTc1OwogCWludCByZWNvdmVyeV90aW1lID0gNDE1OyAvKiB3b3JzdCBjYXNlIHZhbHVlcyBmcm9tIHRoZSBkb3MgZHJpdmVyICovCiAKIAkvKgogCSAqIEZJWE1FOiB1c2UgInBpbyIgdmFsdWUKIAkgKi8KLQlpZiAoZHJpdmUtPmlkICYmICFxZF9maW5kX2Rpc2tfdHlwZShkcml2ZSwgJmFjdGl2ZV90aW1lLCAmcmVjb3ZlcnlfdGltZSkKLQkJJiYgZHJpdmUtPmlkLT50UElPICYmIChkcml2ZS0+aWQtPmZpZWxkX3ZhbGlkICYgMHgwMikKLQkJJiYgZHJpdmUtPmlkLT5laWRlX3BpbyA+PSAyNDApIHsKLQorCWlmICghcWRfZmluZF9kaXNrX3R5cGUoZHJpdmUsICZhY3RpdmVfdGltZSwgJnJlY292ZXJ5X3RpbWUpICYmCisJICAgIChpZFtBVEFfSURfT0xEX1BJT19NT0RFU10gJiAweGZmKSAmJiAoaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDIpICYmCisJICAgIGlkW0FUQV9JRF9FSURFX1BJT10gPj0gMjQwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQSU8gbW9kZSVkXG4iLCBkcml2ZS0+bmFtZSwKLQkJCQlkcml2ZS0+aWQtPnRQSU8pOworCQkJaWRbQVRBX0lEX09MRF9QSU9fTU9ERVNdICYgMHhmZik7CiAJCWFjdGl2ZV90aW1lID0gMTEwOwotCQlyZWNvdmVyeV90aW1lID0gZHJpdmUtPmlkLT5laWRlX3BpbyAtIDEyMDsKKwkJcmVjb3ZlcnlfdGltZSA9IGRyaXZlLT5pZFtBVEFfSURfRUlERV9QSU9dIC0gMTIwOwogCX0KIAogCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjUwMF9jb21wdXRlX3RpbWluZyhIV0lGKGRyaXZlKSwgYWN0aXZlX3RpbWUsIHJlY292ZXJ5X3RpbWUpKTsKQEAgLTMwNCw3ICszMDUsNyBAQAogCX0gZWxzZQogCQl0MiA9IHQxID0gaHdpZi0+Y2hhbm5lbCA/IFFENjU4MF9ERUZfREFUQTIgOiBRRDY1ODBfREVGX0RBVEE7CiAKLQlkcml2ZS0+ZHJpdmVfZGF0YSA9IGRyaXZlLT5zZWxlY3QuYi51bml0ID8gdDIgOiB0MTsKKwlkcml2ZS0+ZHJpdmVfZGF0YSA9IChkcml2ZS0+ZG4gJiAxKSA/IHQyIDogdDE7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHFkNjUwMF9wb3J0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS91bWM4NjcyLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvdW1jODY3Mi5jCmluZGV4IGI1NGExNGEuLjFkYTA3NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2xlZ2FjeS91bWM4NjcyLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L3VtYzg2NzIuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL21pcHMvTWFrZWZpbGUgYi9kcml2ZXJzL2lkZS9taXBzL01ha2VmaWxlCmluZGV4IDY3N2M3YjIuLjU4NzNmYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL21pcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pZGUvbWlwcy9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai0kKENPTkZJR19CTEtfREVWX0lERV9TV0FSTSkJCSs9IHN3YXJtLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lERV9BVTFYWFgpCSs9IGF1MXh4eC1pZGUubwogCiBFWFRSQV9DRkxBR1MgICAgOj0gLUlkcml2ZXJzL2lkZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbWlwcy9hdTF4eHgtaWRlLmMgYi9kcml2ZXJzL2lkZS9taXBzL2F1MXh4eC1pZGUuYwppbmRleCAxMWI3ZjYxLi4wZWM4ZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9taXBzL2F1MXh4eC1pZGUuYworKysgYi9kcml2ZXJzL2lkZS9taXBzL2F1MXh4eC1pZGUuYwpAQCAtMzIyLDExICszMjIsNyBAQAogfQogCiBzdGF0aWMgaW50IGF1aWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCi17CQotCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hID09IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpZGVfZG1hX3Rlc3RfaXJxIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgd2hpbGUgbm90IHdhaXRpbmdcbiIsIGRyaXZlLT5uYW1lKTsKLQorewogCS8qIElmIGRiZG1hIGRpZG4ndCBleGVjdXRlIHRoZSBTVE9QIGNvbW1hbmQgeWV0LCB0aGUKIAkgKiBhY3RpdmUgYml0IGlzIHN0aWxsIHNldAogCSAqLwpAQCAtMzQ0LDExICszNDAsNiBAQAogewogfQogCi1zdGF0aWMgdm9pZCBhdWlkZV9kbWFfbG9zdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCXByaW50ayhLRVJOX0VSUiAiJXM6IElSUSBsb3N0XG4iLCBkcml2ZS0+bmFtZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGF1aWRlX2RkbWFfdHhfY2FsbGJhY2soaW50IGlycSwgdm9pZCAqcGFyYW0pCiB7CiAJX2F1aWRlX2h3aWYgKmFod2lmID0gKF9hdWlkZV9od2lmKilwYXJhbTsKQEAgLTM3NSwxOCArMzY2LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFhfTURNQTJfREJETUEKLXN0YXRpYyB2b2lkIGF1aWRlX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7Ci0KLQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgdGltZW91dCBvY2N1cnJlZDogIiwgZHJpdmUtPm5hbWUpOwotCi0JaWYgKGF1aWRlX2RtYV90ZXN0X2lycShkcml2ZSkpCi0JCXJldHVybjsKLQotCWF1aWRlX2RtYV9lbmQoZHJpdmUpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGF1MXh4eF9kbWFfb3BzID0gewogCS5kbWFfaG9zdF9zZXQJCT0gYXVpZGVfZG1hX2hvc3Rfc2V0LAogCS5kbWFfc2V0dXAJCT0gYXVpZGVfZG1hX3NldHVwLApAQCAtMzk0LDggKzM3Myw4IEBACiAJLmRtYV9zdGFydAkJPSBhdWlkZV9kbWFfc3RhcnQsCiAJLmRtYV9lbmQJCT0gYXVpZGVfZG1hX2VuZCwKIAkuZG1hX3Rlc3RfaXJxCQk9IGF1aWRlX2RtYV90ZXN0X2lycSwKLQkuZG1hX2xvc3RfaXJxCQk9IGF1aWRlX2RtYV9sb3N0X2lycSwKLQkuZG1hX3RpbWVvdXQJCT0gYXVpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAorCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCiB9OwogCiBzdGF0aWMgaW50IGF1aWRlX2RkbWFfaW5pdChpZGVfaHdpZl90ICpod2lmLCBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyAqZCkKQEAgLTQ0OCwxMCArNDI3LDkgQEAKIAkJCQkJCQkgICAgIE5VTV9ERVNDUklQVE9SUyk7CiAJYXVpZGUtPnJ4X2Rlc2NfaGVhZCA9ICh2b2lkKilhdTF4eHhfZGJkbWFfcmluZ19hbGxvYyhhdWlkZS0+cnhfY2hhbiwKIAkJCQkJCQkgICAgIE5VTV9ERVNDUklQVE9SUyk7Ci0gCi0JaHdpZi0+ZG1hdGFibGVfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KGh3aWYtPmRldiwKLQkJCQkJCVBSRF9FTlRSSUVTICogUFJEX0JZVEVTLCAgICAgICAgLyogMSBQYWdlICovCi0JCQkJCQkmaHdpZi0+ZG1hdGFibGVfZG1hLCBHRlBfS0VSTkVMKTsKKworCS8qIEZJWE1FOiBjaGVjayByZXR1cm4gdmFsdWUgKi8KKwkodm9pZClpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKTsKIAkKIAlhdTF4eHhfZGJkbWFfc3RhcnQoIGF1aWRlLT50eF9jaGFuICk7CiAJYXUxeHh4X2RiZG1hX3N0YXJ0KCBhdWlkZS0+cnhfY2hhbiApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbWlwcy9zd2FybS5jIGIvZHJpdmVycy9pZGUvbWlwcy9zd2FybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmNzlmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaWRlL21pcHMvc3dhcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKglBdXRob3I6CU1hbmlzaCBMYWNod2FuaSwgbWxhY2h3YW5pQG12aXN0YS5jb20KLSAqIENvcHlyaWdodCAoQykgMjAwNCAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKglBdXRob3I6IE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BtaXBzLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCAgTWFjaWVqIFcuIFJvenlja2kKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0vKgotICogIERlcml2ZWQgbG9vc2VseSBmcm9tIGlkZS1wbWFjLmMsIHNvOgotICogIENvcHlyaWdodCAoQykgMTk5OCBQYXVsIE1hY2tlcnJhcy4KLSAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIExvcmQKLSAqLwotCi0vKgotICogQm9hcmRzIHdpdGggU2lCeXRlIHByb2Nlc3NvcnMgc28gZmFyIGhhdmUgc3VwcG9ydGVkIElERSBkZXZpY2VzIHZpYQotICogdGhlIEdlbmVyaWMgQnVzLCBQQ0kgYnVzLCBhbmQgYnVpbHQtaW4gUENNQ0lBIGludGVyZmFjZS4gIEluIGFsbAotICogY2FzZXMsIGJ5dGUtc3dhcHBpbmcgbXVzdCBiZSBhdm9pZGVkIGZvciB0aGVzZSBkZXZpY2VzICh3aGVyZWFzCi0gKiBvdGhlciBQQ0kgZGV2aWNlcywgZm9yIGV4YW1wbGUsIHdpbGwgcmVxdWlyZSBzd2FwcGluZykuICBBbnkKLSAqIFNpQnl0ZS10YXJnZXR0ZWQga2VybmVsIGluY2x1ZGluZyBJREUgc3VwcG9ydCB3aWxsIGluY2x1ZGUgdGhpcwotICogZmlsZS4gIFByb2Jpbmcgb2YgYSBHZW5lcmljIEJ1cyBmb3IgYW4gSURFIGRldmljZSBpcyBjb250cm9sbGVkIGJ5Ci0gKiB0aGUgZGVmaW5pdGlvbiBvZiAiU0lCWVRFX0hBVkVfSURFIiwgd2hpY2ggaXMgcHJvdmlkZWQgYnkKLSAqIDxhc20vc2lieXRlL2JvYXJkLmg+IGZvciBCcm9hZGNvbSBib2FyZHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYm9hcmQuaD4KLSNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9nZW5idXMuaD4KLSNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+Ci0KLSNkZWZpbmUgRFJWX05BTUUgImlkZS1zd2FybSIKLQotc3RhdGljIGNoYXIgc3dhcm1faWRlX3N0cmluZ1tdID0gRFJWX05BTUU7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3dhcm1faWRlX3Jlc291cmNlID0gewotCS5uYW1lCT0gIlNXQVJNIEdlbkJ1cyBJREUiLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnN3YXJtX2lkZV9kZXY7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBzd2FybV9wb3J0X2luZm8gPSB7Ci0JLm5hbWUJCQk9IERSVl9OQU1FLAotCS5ob3N0X2ZsYWdzCQk9IElERV9IRkxBR19NTUlPIHwgSURFX0hGTEFHX05PX0RNQSwKLX07Ci0KLS8qCi0gKiBzd2FybV9pZGVfcHJvYmUgLSBpZiB0aGUgYm9hcmQgaGVhZGVyIGluZGljYXRlcyB0aGUgZXhpc3RlbmNlIG9mCi0gKiBHZW5lcmljIEJ1cyBJREUsIGFsbG9jYXRlIGEgSFdJRiBmb3IgaXQuCi0gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHN3YXJtX2lkZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JdTggX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3Q7Ci0JcGh5c190IG9mZnNldCwgc2l6ZTsKLQlpbnQgaSwgcmM7Ci0JaHdfcmVnc190IGh3LCAqaHdzW10gPSB7ICZodywgTlVMTCwgTlVMTCwgTlVMTCB9OwotCi0JaWYgKCFTSUJZVEVfSEFWRV9JREUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JYmFzZSA9IGlvcmVtYXAoQV9JT19FWFRfQkFTRSwgMHg4MDApOwotCW9mZnNldCA9IF9fcmF3X3JlYWRxKGJhc2UgKyBSX0lPX0VYVF9SRUcoUl9JT19FWFRfU1RBUlRfQUREUiwgSURFX0NTKSk7Ci0Jc2l6ZSA9IF9fcmF3X3JlYWRxKGJhc2UgKyBSX0lPX0VYVF9SRUcoUl9JT19FWFRfTVVMVF9TSVpFLCBJREVfQ1MpKTsKLQlpb3VubWFwKGJhc2UpOwotCi0Jb2Zmc2V0ID0gR19JT19TVEFSVF9BRERSKG9mZnNldCkgPDwgU19JT19BRERSQkFTRTsKLQlzaXplID0gKEdfSU9fTVVMVF9TSVpFKHNpemUpICsgMSkgPDwgU19JT19SRUdTSVpFOwotCWlmIChvZmZzZXQgPCBBX1BIWVNfR0VOQlVTIHx8IG9mZnNldCA+PSBBX1BIWVNfR0VOQlVTX0VORCkgewotCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCi0JCSAgICAgICAiOiBJREUgaW50ZXJmYWNlIGF0IEdlbkJ1cyBkaXNhYmxlZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBJREUgaW50ZXJmYWNlIGF0IEdlbkJ1cyBzbG90ICVpXG4iLAotCSAgICAgICBJREVfQ1MpOwotCi0Jc3dhcm1faWRlX3Jlc291cmNlLnN0YXJ0ID0gb2Zmc2V0OwotCXN3YXJtX2lkZV9yZXNvdXJjZS5lbmQgPSBvZmZzZXQgKyBzaXplIC0gMTsKLQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZzd2FybV9pZGVfcmVzb3VyY2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQotCQkgICAgICAgIjogY2FuJ3QgcmVxdWVzdCBJL08gbWVtb3J5IHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQliYXNlID0gaW9yZW1hcChvZmZzZXQsIHNpemUpOwotCi0JZm9yIChpID0gMDsgaSA8PSA3OyBpKyspCi0JCWh3LmlvX3BvcnRzX2FycmF5W2ldID0KLQkJCQkodW5zaWduZWQgbG9uZykoYmFzZSArICgoMHgxZjAgKyBpKSA8PCA1KSk7Ci0JaHcuaW9fcG9ydHMuY3RsX2FkZHIgPQotCQkJCSh1bnNpZ25lZCBsb25nKShiYXNlICsgKDB4M2Y2IDw8IDUpKTsKLQlody5pcnEgPSBLX0lOVF9HQl9JREU7Ci0JaHcuY2hpcHNldCA9IGlkZV9nZW5lcmljOwotCi0JcmMgPSBpZGVfaG9zdF9hZGQoJnN3YXJtX3BvcnRfaW5mbywgaHdzLCAmaG9zdCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycjsKLQotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGhvc3QpOwotCi0JcmV0dXJuIDA7Ci1lcnI6Ci0JcmVsZWFzZV9yZXNvdXJjZSgmc3dhcm1faWRlX3Jlc291cmNlKTsKLQlpb3VubWFwKGJhc2UpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHN3YXJtX2lkZV9kcml2ZXIgPSB7Ci0JLm5hbWUJPSBzd2FybV9pZGVfc3RyaW5nLAotCS5idXMJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLnByb2JlCT0gc3dhcm1faWRlX3Byb2JlLAotfTsKLQotc3RhdGljIHZvaWQgc3dhcm1faWRlX3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OwotCi0JLyogZnJlZSBkZXZpY2UgKi8KLQlwbGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOwotCWtmcmVlKHBsZGV2KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgc3dhcm1faWRlX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxkZXY7Ci0JaW50IGVycjsKLQotCXByaW50ayhLRVJOX0lORk8gIlNXQVJNIElERSBkcml2ZXJcbiIpOwotCi0JaWYgKGRyaXZlcl9yZWdpc3Rlcigmc3dhcm1faWRlX2RyaXZlcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJEcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OwotCX0KLQotICAgICAgICBpZiAoIShwbGRldiA9IGt6YWxsb2Moc2l6ZW9mICgqcGxkZXYpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXRfdW5yZWdpc3Rlcl9kcml2ZXI7Ci0JfQotCi0JcGxkZXYtPm5hbWUJCT0gc3dhcm1faWRlX3N0cmluZzsKLQlwbGRldi0+aWQJCT0gMDsKLQlwbGRldi0+ZGV2LnJlbGVhc2UJPSBzd2FybV9pZGVfcGxhdGZvcm1fcmVsZWFzZTsKLQotCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGxkZXYpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2ZyZWVfcGxkZXY7Ci0JfQotCi0gICAgICAgIGlmICghcGxkZXYtPmRldi5kcml2ZXIpIHsKLQkJLyoKLQkJICogVGhlIGRyaXZlciB3YXMgbm90IGJvdW5kIHRvIHRoaXMgZGV2aWNlLCB0aGVyZSB3YXMKLSAgICAgICAgICAgICAgICAgKiBubyBoYXJkd2FyZSBhdCB0aGlzIGFkZHJlc3MuIFVucmVnaXN0ZXIgaXQsIGFzIHRoZQotCQkgKiByZWxlYXNlIGZ1Y3Rpb24gd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZyB0aGUKLQkJICogYWxsb2NhdGVkIHN0cnVjdHVyZQotCQkgKi8KLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKHBsZGV2KTsKLQl9Ci0KLQlzd2FybV9pZGVfZGV2ID0gcGxkZXY7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWVfcGxkZXY6Ci0Ja2ZyZWUocGxkZXYpOwotCi1vdXRfdW5yZWdpc3Rlcl9kcml2ZXI6Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJnN3YXJtX2lkZV9kcml2ZXIpOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLW1vZHVsZV9pbml0KHN3YXJtX2lkZV9pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYWVjNjJ4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FlYzYyeHguYwppbmRleCAzMTg3MjE1Li40MTQyYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYWVjNjJ4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hZWM2Mnh4LmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApAQCAtMTE2LDcgKzExNSw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqYnVzX2Nsb2NrID0gaG9zdC0+aG9zdF9wcml2OwotCXU4IHVuaXQJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIAl1OCB0bXAxID0gMCwgdG1wMiA9IDA7CiAJdTggdWx0cmEgPSAwLCBkcml2ZV9jb25mID0gMCwgdWx0cmFfY29uZiA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0MCw3ICsxMzksNyBAQAogCWRyaXZlLT5od2lmLT5wb3J0X29wcy0+c2V0X2RtYV9tb2RlKGRyaXZlLCBwaW8gKyBYRkVSX1BJT18wKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2FlYzYyeHgoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X2FlYzYyeHgoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAkvKiBUaGVzZSBhcmUgbmVjZXNzYXJ5IHRvIGdldCBBRUM2MjgwIE1hY2ludG9zaCBjYXJkcyB0byB3b3JrICovCiAJaWYgKChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FSVE9QX0FUUDg2NSkgfHwKQEAgLTMwMywyMSArMzAyLDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFlYzYyeHhfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWVjNjJ4eF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJBRUM2Mnh4X0lERSIsCiAJLmlkX3RhYmxlCT0gYWVjNjJ4eF9wY2lfdGJsLAogCS5wcm9iZQkJPSBhZWM2Mnh4X2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWVjNjJ4eF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhZWM2Mnh4X2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWVjNjJ4eF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFlYzYyeHhfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZWM2Mnh4X3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhZWM2Mnh4X2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hbGltMTV4My5jIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKaW5kZXggZDY0NzUyNi4uZGFmOWRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtNzgsOCArNzcsNyBAQAogCWludCBidXNfc3BlZWQgPSBpZGVfcGNpX2NsayA/IGlkZV9wY2lfY2xrIDogMzM7CiAJaW50IHBvcnQgPSBod2lmLT5jaGFubmVsID8gMHg1YyA6IDB4NTg7CiAJaW50IHBvcnRGSUZPID0gaHdpZi0+Y2hhbm5lbCA/IDB4NTUgOiAweDU0OwotCXU4IGNkX2RtYV9maWZvID0gMDsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMTsKKwl1OCBjZF9kbWFfZmlmbyA9IDAsIHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwogCiAJaWYgKChzX2NsYyA9IChzX3RpbWUgKiBidXNfc3BlZWQgKyA5OTkpIC8gMTAwMCkgPj0gOCkKIAkJc19jbGMgPSAwOwpAQCAtMTEzLDcgKzExMSw3IEBACiAJfQogCQogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHBvcnQsIHNfY2xjKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwb3J0K2RyaXZlLT5zZWxlY3QuYi51bml0KzIsIChhX2NsYyA8PCA0KSB8IHJfY2xjKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBwb3J0ICsgdW5pdCArIDIsIChhX2NsYyA8PCA0KSB8IHJfY2xjKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTEzNCw4ICsxMzIsOCBAQAogCWlmIChtNTIyOV9yZXZpc2lvbiA+IDB4MjAgJiYgbTUyMjlfcmV2aXNpb24gPCAweEMyKSB7CiAJCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCiAJCQlyZXR1cm4gMDsKLQkJaWYgKGNoaXBfaXNfMTU0M2NfZSAmJiBzdHJzdHIoZHJpdmUtPmlkLT5tb2RlbCwgIldEQyAiKSAmJgotCQkgICAgd2RjX3VkbWEgPT0gMCkKKwkJaWYgKHdkY191ZG1hID09IDAgJiYgY2hpcF9pc18xNTQzY19lICYmCisJCSAgICBzdHJzdHIoKGNoYXIgKikmZHJpdmUtPmlkW0FUQV9JRF9QUk9EXSwgIldEQyAiKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMTU1LDcgKzE1Myw3IEBACiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggc3BlZWQxCQk9IHNwZWVkOwotCXU4IHVuaXQJCQk9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOworCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CiAJdTggdG1wYnl0ZQkJPSAweDAwOwogCWludCBtNTIyOV91ZG1hCQk9IChod2lmLT5jaGFubmVsKSA/IDB4NTcgOiAweDU2OwogCkBAIC0yMTQsNyArMjEyLDcgQEAKICAqCWFwcHJvcHJpYXRlIGFsc28gc2V0cyB1cCB0aGUgMTUzMyBzb3V0aGJyaWRnZS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfYWxpMTV4MyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHVuc2lnbmVkIGludCBpbml0X2NoaXBzZXRfYWxpMTV4MyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggdG1wYnl0ZTsKQEAgLTUwOSw3ICs1MDcsNyBAQAogCS5kbWFfc2V0dXAJCT0gYWxpMTV4M19kbWFfc2V0dXAsCiAJLmRtYV9leGVjX2NtZAkJPSBpZGVfZG1hX2V4ZWNfY21kLAogCS5kbWFfc3RhcnQJCT0gaWRlX2RtYV9zdGFydCwKLQkuZG1hX2VuZAkJPSBfX2lkZV9kbWFfZW5kLAorCS5kbWFfZW5kCQk9IGlkZV9kbWFfZW5kLAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKQEAgLTU3NywyMSArNTc1LDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFsaW0xNXgzX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFsaW0xNXgzX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIkFMSTE1eDNfSURFIiwKIAkuaWRfdGFibGUJPSBhbGltMTV4M19wY2lfdGJsLAogCS5wcm9iZQkJPSBhbGltMTV4M19pbml0X29uZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbGkxNXgzX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWxpbTE1eDNfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbGkxNXgzX2lkZV9leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbGltMTV4M19wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxpMTV4M19pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYwppbmRleCAxZTY2YTk2Li44MWVjNzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAogCWlkZV90aW1pbmdfY29tcHV0ZShkcml2ZSwgc3BlZWQsICZ0LCBULCBVVCk7CiAKLQlpZiAocGVlci0+cHJlc2VudCkgeworCWlmIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQlpZGVfdGltaW5nX2NvbXB1dGUocGVlciwgcGVlci0+Y3VycmVudF9zcGVlZCwgJnAsIFQsIFVUKTsKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KQEAgLTExMiwxMyArMTEyLDEzIEBACiAJYW1kX3NldF9kcml2ZShkcml2ZSwgWEZFUl9QSU9fMCArIHBpbyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbWQ3NDA5X2NhYmxlX2RldGVjdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgYW1kNzQwOV9jYWJsZV9kZXRlY3Qoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAkvKiBubyBob3N0IHNpZGUgY2FibGUgZGV0ZWN0aW9uICovCiAJYW1kXzgwdyA9IDB4MDM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbWQ3NDExX2NhYmxlX2RldGVjdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgYW1kNzQxMV9jYWJsZV9kZXRlY3Qoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgaTsKIAl1MzIgdSA9IDA7CkBAIC0xNDAsNyArMTQwLDcgQEAKICAqIFRoZSBpbml0aWFsaXphdGlvbiBjYWxsYmFjay4gIEluaXRpYWxpemUgZHJpdmUgaW5kZXBlbmRlbnQgcmVnaXN0ZXJzLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9hbWQ3NHh4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9hbWQ3NHh4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggdCA9IDAsIG9mZnNldCA9IGFtZF9vZmZzZXQoZGV2KTsKIApAQCAtMzE5LDIxICszMTksMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNzR4eF9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhbWQ3NHh4X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIkFNRF9JREUiLAogCS5pZF90YWJsZQk9IGFtZDc0eHhfcGNpX3RibCwKIAkucHJvYmUJCT0gYW1kNzR4eF9wcm9iZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbWQ3NHh4X2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmYW1kNzR4eF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFtZDc0eHhfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ3NHh4X3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbWQ3NHh4X2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hdGlpeHAuYyBiL2RyaXZlcnMvaWRlL3BjaS9hdGlpeHAuYwppbmRleCA0MWY2Y2I2Li5iMjczNWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYXRpaXhwLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2F0aWl4cC5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC0xODMsMjEgKzE4MiwyMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhdGlpeHBfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXRpaXhwX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIkFUSUlYUF9JREUiLAogCS5pZF90YWJsZQk9IGF0aWl4cF9wY2lfdGJsLAogCS5wcm9iZQkJPSBhdGlpeHBfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXRpaXhwX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXRpaXhwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXRpaXhwX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXRpaXhwX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhdGlpeHBfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NtZDY0MC5jIGIvZHJpdmVycy9pZGUvcGNpL2NtZDY0MC5jCmluZGV4IGU2YzYyMDAuLmU0MzA2NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9jbWQ2NDAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvY21kNjQwLmMKQEAgLTEwMyw3ICsxMDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApAQCAtMzc1LDYgKzM3NCwyMSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIF9fc2V0X3ByZWZldGNoX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbW9kZSkKK3sKKwlpZiAobW9kZSkgewkvKiB3YW50IHByZWZldGNoIG9uPyAqLworI2lmIENNRDY0MF9QUkVGRVRDSF9NQVNLUworCQlkcml2ZS0+ZGV2X2ZsYWdzIHw9IElERV9ERkxBR19OT19VTk1BU0s7CisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19VTk1BU0s7CisjZW5kaWYKKwkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX05PX0lPXzMyQklUOworCX0gZWxzZSB7CisJCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19OT19VTk1BU0s7CisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX0lPXzMyQklUOworCQlkcml2ZS0+aW9fMzJiaXQgPSAwOworCX0KK30KKwogI2lmbmRlZiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQKIC8qCiAgKiBDaGVjayB3aGV0aGVyIHByZWZldGNoIGlzIG9uIGZvciBhIGRyaXZlLApAQCAtMzg0LDE5ICszOTgsMTAgQEAKIHsKIAl1OCBiID0gZ2V0X2NtZDY0MF9yZWcocHJlZmV0Y2hfcmVnc1tpbmRleF0pOwogCi0JaWYgKGIgJiBwcmVmZXRjaF9tYXNrc1tpbmRleF0pIHsJLyogaXMgcHJlZmV0Y2ggb2ZmPyAqLwotCQlkcml2ZS0+bm9fdW5tYXNrID0gMDsKLQkJZHJpdmUtPm5vX2lvXzMyYml0ID0gMTsKLQkJZHJpdmUtPmlvXzMyYml0ID0gMDsKLQl9IGVsc2UgewotI2lmIENNRDY0MF9QUkVGRVRDSF9NQVNLUwotCQlkcml2ZS0+bm9fdW5tYXNrID0gMTsKLQkJZHJpdmUtPnVubWFzayA9IDA7Ci0jZW5kaWYKLQkJZHJpdmUtPm5vX2lvXzMyYml0ID0gMDsKLQl9CisJX19zZXRfcHJlZmV0Y2hfbW9kZShkcml2ZSwgKGIgJiBwcmVmZXRjaF9tYXNrc1tpbmRleF0pID8gMCA6IDEpOwogfQogI2Vsc2UKKwogLyoKICAqIFNldHMgcHJlZmV0Y2ggbW9kZSBmb3IgYSBkcml2ZS4KICAqLwpAQCAtNDA4LDE5ICs0MTMsMTEgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQ2NDBfbG9jaywgZmxhZ3MpOwogCWIgPSBfX2dldF9jbWQ2NDBfcmVnKHJlZyk7Ci0JaWYgKG1vZGUpIHsJLyogd2FudCBwcmVmZXRjaCBvbj8gKi8KLSNpZiBDTUQ2NDBfUFJFRkVUQ0hfTUFTS1MKLQkJZHJpdmUtPm5vX3VubWFzayA9IDE7Ci0JCWRyaXZlLT51bm1hc2sgPSAwOwotI2VuZGlmCi0JCWRyaXZlLT5ub19pb18zMmJpdCA9IDA7CisJX19zZXRfcHJlZmV0Y2hfbW9kZShkcml2ZSwgbW9kZSk7CisJaWYgKG1vZGUpCiAJCWIgJj0gfnByZWZldGNoX21hc2tzW2luZGV4XTsJLyogZW5hYmxlIHByZWZldGNoICovCi0JfSBlbHNlIHsKLQkJZHJpdmUtPm5vX3VubWFzayA9IDA7Ci0JCWRyaXZlLT5ub19pb18zMmJpdCA9IDE7Ci0JCWRyaXZlLT5pb18zMmJpdCA9IDA7CisJZWxzZQogCQliIHw9IHByZWZldGNoX21hc2tzW2luZGV4XTsJLyogZGlzYWJsZSBwcmVmZXRjaCAqLwotCX0KIAlfX3B1dF9jbWQ2NDBfcmVnKHJlZywgYik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kNjQwX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTQ3MSwxMCArNDY4LDEwIEBACiAJICovCiAJaWYgKGluZGV4ID4gMSkgewogCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JCWlkZV9kcml2ZV90ICpwZWVyID0gJmh3aWYtPmRyaXZlc1shZHJpdmUtPnNlbGVjdC5iLnVuaXRdOworCQlpZGVfZHJpdmVfdCAqcGVlciA9ICZod2lmLT5kcml2ZXNbIShkcml2ZS0+ZG4gJiAxKV07CiAJCXVuc2lnbmVkIGludCBtYXRlID0gaW5kZXggXiAxOwogCi0JCWlmIChwZWVyLT5wcmVzZW50KSB7CisJCWlmIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQkJaWYgKHNldHVwX2NvdW50IDwgc2V0dXBfY291bnRzW21hdGVdKQogCQkJCXNldHVwX2NvdW50ID0gc2V0dXBfY291bnRzW21hdGVdOwogCQkJaWYgKGFjdGl2ZV9jb3VudCA8IGFjdGl2ZV9jb3VudHNbbWF0ZV0pCkBAIC02MTAsNyArNjA3LDcgQEAKIAogc3RhdGljIHZvaWQgY21kNjQwX2luaXRfZGV2KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQl1bnNpZ25lZCBpbnQgaSA9IGRyaXZlLT5od2lmLT5jaGFubmVsICogMiArIGRyaXZlLT5zZWxlY3QuYi51bml0OworCXVuc2lnbmVkIGludCBpID0gZHJpdmUtPmh3aWYtPmNoYW5uZWwgKiAyICsgKGRyaXZlLT5kbiAmIDEpOwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VECiAJLyoKQEAgLTYyOSw3ICs2MjYsNyBAQAogCSAqLwogCWNoZWNrX3ByZWZldGNoKGRyaXZlLCBpKTsKIAlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IGRyaXZlJWQgdGltaW5ncy9wcmVmZXRjaCglcykgcHJlc2VydmVkXG4iLAotCQkJCSAgaSwgZHJpdmUtPm5vX2lvXzMyYml0ID8gIm9mZiIgOiAib24iKTsKKwkJaSwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9fSU9fMzJCSVQpID8gIm9mZiIgOiAib24iKTsKICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9DTUQ2NDBfRU5IQU5DRUQgKi8KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvcGNpL2NtZDY0eC5jCmluZGV4IGUwNjQzOTguLjkzNTM4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9jbWQ2NHguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvY21kNjR4LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC0yMjksNyArMjI4LDcgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gaHdpZi0+ZG1hX2Jhc2UgLSAoaHdpZi0+Y2hhbm5lbCAqIDgpOwotCWludCBlcnIJCQk9IF9faWRlX2RtYV9lbmQoZHJpdmUpOworCWludCBlcnIJCQk9IGlkZV9kbWFfZW5kKGRyaXZlKTsKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IE1SRE1PREVfSU5UUl9DSDEgOgogCQkJCQkJICBNUkRNT0RFX0lOVFJfQ0gwOwogCXU4ICBtcmRtb2RlCQk9IGluYihiYXNlICsgMSk7CkBAIC0yNDksNyArMjQ4LDcgQEAKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzX0lOVFJfQ0gxIDoKIAkJCQkJCSAgQ0ZSX0lOVFJfQ0gwOwogCXU4ICBpcnFfc3RhdAkJPSAwOwotCWludCBlcnIJCQk9IF9faWRlX2RtYV9lbmQoZHJpdmUpOworCWludCBlcnIJCQk9IGlkZV9kbWFfZW5kKGRyaXZlKTsKIAogCSh2b2lkKSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGlycV9yZWcsICZpcnFfc3RhdCk7CiAJLyogY2xlYXIgdGhlIGludGVycnVwdCBiaXQgKi8KQEAgLTMzMiw3ICszMzEsNyBAQAogCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfY21kNjR4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9jbWQ2NHgoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBtcmRtb2RlID0gMDsKIApAQCAtNTA2LDIxICs1MDUsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY21kNjR4X3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNtZDY0eF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJDTUQ2NHhfSURFIiwKIAkuaWRfdGFibGUJPSBjbWQ2NHhfcGNpX3RibCwKIAkucHJvYmUJCT0gY21kNjR4X2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtZDY0eF9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmNtZDY0eF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNtZDY0eF9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNtZDY0eF9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoY21kNjR4X2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9jczU1MjAuYyBiL2RyaXZlcnMvaWRlL3BjaS9jczU1MjAuYwppbmRleCAxNTE4NDRmLi41ZWZiNDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvY3M1NTIwLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2NzNTUyMC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KQEAgLTE0NiwxNSArMTQ1LDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNTUyMF9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjczU1MjBfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiQ3lyaXhfSURFIiwKIAkuaWRfdGFibGUJPSBjczU1MjBfcGNpX3RibCwKIAkucHJvYmUJCT0gY3M1NTIwX2luaXRfb25lLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjczU1MjBfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczU1MjBfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGNzNTUyMF9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMgYi9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMKaW5kZXggZjIzNWRiOC4uNTNmMDc5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9jczU1MzAuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CkBAIC04MSwxNyArODAsMTkgQEAKIHN0YXRpYyB1OCBjczU1MzBfdWRtYV9maWx0ZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfZHJpdmVfdCAqbWF0ZSA9ICZod2lmLT5kcml2ZXNbKGRyaXZlLT5kbiAmIDEpIF4gMV07Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKm1hdGVpZCA9IG1hdGUtPmlkOworCWlkZV9kcml2ZV90ICptYXRlID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CisJdTE2ICptYXRlaWQgPSBtYXRlLT5pZDsKIAl1OCBtYXNrID0gaHdpZi0+dWx0cmFfbWFzazsKIAotCWlmIChtYXRlLT5wcmVzZW50ID09IDApCisJaWYgKG1hdGUgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKG1hdGVpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIF9faWRlX2RtYV9iYWRfZHJpdmUobWF0ZSkgPT0gMCkgewotCQlpZiAoKG1hdGVpZC0+ZmllbGRfdmFsaWQgJiA0KSAmJiAobWF0ZWlkLT5kbWFfdWx0cmEgJiA3KSkKKwlpZiAoYXRhX2lkX2hhc19kbWEobWF0ZWlkKSAmJiBfX2lkZV9kbWFfYmFkX2RyaXZlKG1hdGUpID09IDApIHsKKwkJaWYgKChtYXRlaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDQpICYmCisJCSAgICAobWF0ZWlkW0FUQV9JRF9VRE1BX01PREVTXSAmIDcpKQogCQkJZ290byBvdXQ7Ci0JCWlmICgobWF0ZWlkLT5maWVsZF92YWxpZCAmIDIpICYmIChtYXRlaWQtPmRtYV9td29yZCAmIDcpKQorCQlpZiAoKG1hdGVpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgJiYKKwkJICAgIChtYXRlaWRbQVRBX0lEX01XRE1BX01PREVTXSAmIDcpKQogCQkJbWFzayA9IDA7CiAJfQogb3V0OgpAQCAtMTMzLDcgKzEzNCw3IEBACiAgKglJbml0aWFsaXplIHRoZSBjczU1MzAgYnJpZGdlIGZvciByZWxpYWJsZSBJREUgRE1BIG9wZXJhdGlvbi4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfY3M1NTMwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9jczU1MzAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqbWFzdGVyXzAgPSBOVUxMLCAqY3M1NTMwXzAgPSBOVUxMOwogCkBAIC0yNjYsMjEgKzI2NywyMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczU1MzBfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3M1NTMwX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIkNTNTUzMCBJREUiLAogCS5pZF90YWJsZQk9IGNzNTUzMF9wY2lfdGJsLAogCS5wcm9iZQkJPSBjczU1MzBfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3M1NTMwX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3M1NTMwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3M1NTMwX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3M1NTMwX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjczU1MzBfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2NzNTUzNS5jIGIvZHJpdmVycy9pZGUvcGNpL2NzNTUzNS5jCmluZGV4IGRkM2RjMjMuLjk4M2Q5NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9jczU1MzUuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvY3M1NTM1LmMKQEAgLTc2LDE2ICs3NiwxNiBAQAogc3RhdGljIHZvaWQgY3M1NTM1X3NldF9zcGVlZChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewogCXUzMiByZWcgPSAwLCBkdW1teTsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwogCiAJLyogU2V0IHRoZSBQSU8gdGltaW5ncyAqLwogCWlmIChzcGVlZCA8IFhGRVJfU1dfRE1BXzApIHsKLQkJaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJlZF9kcml2ZShkcml2ZSk7CisJCWlkZV9kcml2ZV90ICpwYWlyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJCXU4IGNtZCwgcGlvYTsKIAogCQljbWQgPSBwaW9hID0gc3BlZWQgLSBYRkVSX1BJT18wOwogCi0JCWlmIChwYWlyLT5wcmVzZW50KSB7CisJCWlmIChwYWlyKSB7CiAJCQl1OCBwaW9iID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKHBhaXIsIDI1NSwgNCk7CiAKIAkJCWlmIChwaW9iIDwgY21kKQpAQCAtMTkyLDIxICsxOTIsMjMgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNTUzNV9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKLQkubmFtZSAgICAgICA9ICJDUzU1MzVfSURFIiwKLQkuaWRfdGFibGUgICA9IGNzNTUzNV9wY2lfdGJsLAotCS5wcm9iZSAgICAgID0gY3M1NTM1X2luaXRfb25lLAotCS5yZW1vdmUgICAgID0gaWRlX3BjaV9yZW1vdmUsCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3M1NTM1X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkNTNTUzNV9JREUiLAorCS5pZF90YWJsZQk9IGNzNTUzNV9wY2lfdGJsLAorCS5wcm9iZQkJPSBjczU1MzVfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3M1NTM1X2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3M1NTM1X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3M1NTM1X2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3M1NTM1X3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjczU1MzVfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2N5ODJjNjkzLmMgYi9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYwppbmRleCBlNmQ4ZWU4Li41Mjk3ZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYwpAQCAtNTAsMTggKzUwLDExIEBACiAKICNkZWZpbmUgRFJWX05BTUUgImN5ODJjNjkzIgogCi0vKiB0aGUgY3VycmVudCB2ZXJzaW9uICovCi0jZGVmaW5lIENZODJfVkVSU0lPTgkiQ1k4MkM2OTNVIGRyaXZlciB2MC4zNCA5OS0xMy0xMiBBbmRyZWFzIFMuIEtyZWJzIChha3JlYnNAYWx0YXZpc3RhLm5ldCkiCi0KIC8qCiAgKglUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGRlYnVnIHRoZSBkcml2ZXIuCiAgKi8KLSNkZWZpbmUgQ1k4MkM2OTNfREVCVUdfTE9HUwkwCiAjZGVmaW5lIENZODJDNjkzX0RFQlVHX0lORk8JMAogCi0vKiBkZWZpbmUgQ1k4MkM2OTNfU0VURE1BX0NMT0NLIHRvIHNldCBETUEgQ29udHJvbGxlciBDbG9jayBTcGVlZCB0byBBVENMSyAqLwotI3VuZGVmIENZODJDNjkzX1NFVERNQV9DTE9DSwotCiAvKgogICoJTk9URTogdGhlIHZhbHVlIGZvciBidXNtYXN0ZXIgdGltZW91dCBpcyB0cmlja3kgYW5kIEkgZ290IGl0IGJ5CiAgKgl0cmlhbCBhbmQgZXJyb3IhICBCeSB1c2luZyBhIHRvIGxvdyB2YWx1ZSB3aWxsIGNhdXNlIERNQSB0aW1lb3V0cwpAQCAtODksNyArODIsNiBAQAogI2RlZmluZSBDWTgyX0lOREVYX1BPUlQJCTB4MjIKICNkZWZpbmUgQ1k4Ml9EQVRBX1BPUlQJCTB4MjMKIAotI2RlZmluZSBDWTgyX0lOREVYX0NUUkxSRUcxCTB4MDEKICNkZWZpbmUgQ1k4Ml9JTkRFWF9DSEFOTkVMMAkweDMwCiAjZGVmaW5lIENZODJfSU5ERVhfQ0hBTk5FTDEJMHgzMQogI2RlZmluZSBDWTgyX0lOREVYX1RJTUVPVVQJMHgzMgpAQCAtMTc5LDE3ICsxNzEsNiBAQAogCiAJaW5kZXggPSBod2lmLT5jaGFubmVsID8gQ1k4Ml9JTkRFWF9DSEFOTkVMMSA6IENZODJfSU5ERVhfQ0hBTk5FTDA7CiAKLSNpZiBDWTgyQzY5M19ERUJVR19MT0dTCi0JLyogZm9yIGRlYnVnIGxldCdzIHNob3cgdGhlIHByZXZpb3VzIHZhbHVlcyAqLwotCi0Jb3V0YihpbmRleCwgQ1k4Ml9JTkRFWF9QT1JUKTsKLQlkYXRhID0gaW5iKENZODJfREFUQV9QT1JUKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzIChjaD0lZCwgZGV2PSVkKTogRE1BIG1vZGUgaXMgJWQgKHNpbmdsZT0lZClcbiIsCi0JCWRyaXZlLT5uYW1lLCBIV0lGKGRyaXZlKS0+Y2hhbm5lbCwgZHJpdmUtPnNlbGVjdC5iLnVuaXQsCi0JCShkYXRhJjB4MyksICgoZGF0YT4+MikmMSkpOwotI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0xPR1MgKi8KLQogCWRhdGEgPSAobW9kZSAmIDMpIHwgKHNpbmdsZSA8PCAyKTsKIAogCW91dGIoaW5kZXgsIENZODJfSU5ERVhfUE9SVCk7CkBAIC0xOTcsOCArMTc4LDcgQEAKIAogI2lmIENZODJDNjkzX0RFQlVHX0lORk8KIAlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IHNldCBETUEgbW9kZSB0byAlZCAoc2luZ2xlPSVkKVxuIiwKLQkJZHJpdmUtPm5hbWUsIEhXSUYoZHJpdmUpLT5jaGFubmVsLCBkcml2ZS0+c2VsZWN0LmIudW5pdCwKLQkJbW9kZSAmIDMsIHNpbmdsZSk7CisJCWRyaXZlLT5uYW1lLCBod2lmLT5jaGFubmVsLCBkcml2ZS0+ZG4gJiAxLCBtb2RlICYgMywgc2luZ2xlKTsKICNlbmRpZiAvKiBDWTgyQzY5M19ERUJVR19JTkZPICovCiAKIAkvKgpAQCAtMjM5LDUwICsyMTksMTEgQEAKIAkJfQogCX0KIAotI2lmIENZODJDNjkzX0RFQlVHX0xPR1MKLQkvKiBmb3IgZGVidWcgbGV0J3Mgc2hvdyB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCi0KLQlpZiAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgPT0gMCkgewotCQkvKgotCQkgKiBnZXQgbWFzdGVyIGRyaXZlIHJlZ2lzdGVycwotCQkgKiBhZGRyZXNzIHNldHVwIGNvbnRyb2wgcmVnaXN0ZXIKLQkJICogaXMgMzIgYml0ICEhIQotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgQ1k4Ml9JREVfQUREUlNFVFVQLCAmYWRkckN0cmwpOwotCQlhZGRyQ3RybCAmPSAweDBGOwotCi0JCS8qIG5vdyBsZXQncyBnZXQgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9NQVNURVJfSU9SLCAmcGNsay50aW1lXzE2cik7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfTUFTVEVSX0lPVywgJnBjbGsudGltZV8xNncpOwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX01BU1RFUl84QklULCAmcGNsay50aW1lXzgpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIHNldCBzbGF2ZSBkcml2ZSByZWdpc3RlcnMKLQkJICogYWRkcmVzcyBzZXR1cCBjb250cm9sIHJlZ2lzdGVyCi0JCSAqIGlzIDMyIGJpdCAhISEKLQkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIENZODJfSURFX0FERFJTRVRVUCwgJmFkZHJDdHJsKTsKLQotCQlhZGRyQ3RybCAmPSAweEYwOwotCQlhZGRyQ3RybCA+Pj0gNDsKLQotCQkvKiBub3cgbGV0J3MgZ2V0IHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfSU9SLCAmcGNsay50aW1lXzE2cik7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfSU9XLCAmcGNsay50aW1lXzE2dyk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQ1k4Ml9JREVfU0xBVkVfOEJJVCwgJnBjbGsudGltZV84KTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcyAoY2g9JWQsIGRldj0lZCk6IFBJTyB0aW1pbmcgaXMgIgotCQkiKGFkZHI9MHglWCwgaW9yPTB4JVgsIGlvdz0weCVYLCA4Yml0PTB4JVgpXG4iLAotCQlkcml2ZS0+bmFtZSwgaHdpZi0+Y2hhbm5lbCwgZHJpdmUtPnNlbGVjdC5iLnVuaXQsCi0JCWFkZHJDdHJsLCBwY2xrLnRpbWVfMTZyLCBwY2xrLnRpbWVfMTZ3LCBwY2xrLnRpbWVfOCk7Ci0jZW5kaWYgLyogQ1k4MkM2OTNfREVCVUdfTE9HUyAqLwotCiAJLyogbGV0J3MgY2FsYyB0aGUgdmFsdWVzIGZvciB0aGlzIFBJTyBtb2RlICovCiAJY29tcHV0ZV9jbG9ja3MocGlvLCAmcGNsayk7CiAKIAkvKiBub3cgbGV0J3Mgd3JpdGUgIHRoZSBjbG9ja3MgcmVnaXN0ZXJzICovCi0JaWYgKGRyaXZlLT5zZWxlY3QuYi51bml0ID09IDApIHsKKwlpZiAoKGRyaXZlLT5kbiAmIDEpID09IDApIHsKIAkJLyoKIAkJICogc2V0IG1hc3RlciBkcml2ZQogCQkgKiBhZGRyZXNzIHNldHVwIGNvbnRyb2wgcmVnaXN0ZXIKQEAgLTMyNCw2MyArMjY1LDExIEBACiAjaWYgQ1k4MkM2OTNfREVCVUdfSU5GTwogCXByaW50ayhLRVJOX0lORk8gIiVzIChjaD0lZCwgZGV2PSVkKTogc2V0IFBJTyB0aW1pbmcgdG8gIgogCQkiKGFkZHI9MHglWCwgaW9yPTB4JVgsIGlvdz0weCVYLCA4Yml0PTB4JVgpXG4iLAotCQlkcml2ZS0+bmFtZSwgaHdpZi0+Y2hhbm5lbCwgZHJpdmUtPnNlbGVjdC5iLnVuaXQsCisJCWRyaXZlLT5uYW1lLCBod2lmLT5jaGFubmVsLCBkcml2ZS0+ZG4gJiAxLAogCQlhZGRyQ3RybCwgcGNsay50aW1lXzE2ciwgcGNsay50aW1lXzE2dywgcGNsay50aW1lXzgpOwogI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KIH0KIAotLyoKLSAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBpbml0IGFuZCBpcyB1c2VkIHRvIHNldHVwIHRoZSBjeTgyYzY5MyBjaGlwCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9jeTgyYzY5MyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAxKQotCQlyZXR1cm4gMDsKLQotI2lmZGVmIENZODJDNjkzX1NFVERNQV9DTE9DSwotCXU4IGRhdGEgPSAwOwotI2VuZGlmIC8qIENZODJDNjkzX1NFVERNQV9DTE9DSyAqLwotCi0JLyogd3JpdGUgaW5mbyBhYm91dCB0aGlzIHZlcmlvbiBvZiB0aGUgZHJpdmVyICovCi0JcHJpbnRrKEtFUk5fSU5GTyBDWTgyX1ZFUlNJT04gIlxuIik7Ci0KLSNpZmRlZiBDWTgyQzY5M19TRVRETUFfQ0xPQ0sKLSAgICAgICAvKiBva2F5IGxldCdzIHNldCB0aGUgRE1BIGNsb2NrIHNwZWVkICovCi0KLQlvdXRiKENZODJfSU5ERVhfQ1RSTFJFRzEsIENZODJfSU5ERVhfUE9SVCk7Ci0JZGF0YSA9IGluYihDWTgyX0RBVEFfUE9SVCk7Ci0KLSNpZiBDWTgyQzY5M19ERUJVR19JTkZPCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBQZXJpcGhlcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXI6IDB4JVhcbiIsCi0JCWRhdGEpOwotI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KLQotCS8qCi0JICogZm9yIHNvbWUgcmVhc29uIHNvbWV0aW1lcyB0aGUgRE1BIGNvbnRyb2xsZXIKLQkgKiBzcGVlZCBpcyBzZXQgdG8gQVRDTEsvMiA/Pz8/IC0gd2UgZml4IHRoaXMgaGVyZQotCSAqCi0JICogbm90ZTogaSBkb24ndCBrbm93IHdoYXQgY2F1c2VzIHRoaXMgc3RyYW5nZSBiZWhhdmlvdXIsCi0JICogICAgICAgYnV0IGV2ZW4gY2hhbmdpbmcgdGhlIGRtYSBzcGVlZCBkb2Vzbid0IHNvbHZlIGl0IDotKAotCSAqICAgICAgIHRoZSBpZGUgcGVyZm9ybWFuY2UgaXMgc3RpbGwgb25seSBoYWxmIHRoZSBub3JtYWwgc3BlZWQKLQkgKgotCSAqICAgICAgIGlmIGFueWJvZHkga25vd3Mgd2hhdCBnb2VzIHdyb25nIHdpdGggbXkgbWFjaGluZSwgcGxlYXNlCi0JICogICAgICAgbGV0IG1lIGtub3cgLSBBU0sKLQkgKi8KLQotCWRhdGEgfD0gMHgwMzsKLQotCW91dGIoQ1k4Ml9JTkRFWF9DVFJMUkVHMSwgQ1k4Ml9JTkRFWF9QT1JUKTsKLQlvdXRiKGRhdGEsIENZODJfREFUQV9QT1JUKTsKLQotI2lmIENZODJDNjkzX0RFQlVHX0lORk8KLQlwcmludGsoS0VSTl9JTkZPICI6IE5ldyBQZXJpcGhlcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXI6IDB4JVhcbiIsCi0JCWRhdGEpOwotI2VuZGlmIC8qIENZODJDNjkzX0RFQlVHX0lORk8gKi8KLQotI2VuZGlmIC8qIENZODJDNjkzX1NFVERNQV9DTE9DSyAqLwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9pb3BzX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RhdGljIGlkZV9od2lmX3QgKnByaW1hcnk7CkBAIC00MDEsNyArMjkwLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGN5ODJjNjkzX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZQkJPSBEUlZfTkFNRSwKLQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2N5ODJjNjkzLAogCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfY3k4MmM2OTMsCiAJLnBvcnRfb3BzCT0gJmN5ODJjNjkzX3BvcnRfb3BzLAogCS5jaGlwc2V0CT0gaWRlX2N5ODJjNjkzLApAQCAtNDQzLDIxICszMzEsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3k4MmM2OTNfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3k4MmM2OTNfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiQ3lwcmVzc19JREUiLAogCS5pZF90YWJsZQk9IGN5ODJjNjkzX3BjaV90YmwsCiAJLnByb2JlCQk9IGN5ODJjNjkzX2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3k4MmM2OTNfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3k4MmM2OTNfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeTgyYzY5M19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGN5ODJjNjkzX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3k4MmM2OTNfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGN5ODJjNjkzX2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9kZWxraW5fY2IuYyBiL2RyaXZlcnMvaWRlL3BjaS9kZWxraW5fY2IuYwppbmRleCBmODRiZmI0Li44Njg5YTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvZGVsa2luX2NiLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2RlbGtpbl9jYi5jCkBAIC0xOSw3ICsxOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMTE4LDcgKzExNyw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRlbGtpbl9jYl9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZWxraW5fY2JfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiRGVsa2luLUFTS0EtV29ya2JpdCBDYXJkYnVzIElERSIsCiAJLmlkX3RhYmxlCT0gZGVsa2luX2NiX3BjaV90YmwsCiAJLnByb2JlCQk9IGRlbGtpbl9jYl9wcm9iZSwKQEAgLTEyNywxMiArMTI2LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGRlbGtpbl9jYl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRlbGtpbl9jYl9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRlbGtpbl9jYl9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGVsa2luX2NiX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChkZWxraW5fY2JfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jIGIvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwppbmRleCBiMDdkNGY0Li40NzRmOTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTY3LDIxICsxNjYsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZ2VuZXJpY19wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBnZW5lcmljX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlBDSV9JREUiLAogCS5pZF90YWJsZQk9IGdlbmVyaWNfcGNpX3RibCwKIAkucHJvYmUJCT0gZ2VuZXJpY19pbml0X29uZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ2VuZXJpY19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGdlbmVyaWNfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZnZW5lcmljX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChnZW5lcmljX2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNHguYyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNHguYwppbmRleCA2MDA5YjBiLi5mYjFhM2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzR4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM0eC5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTc5LDcgKzc4LDcgQEAKICAqLwogI2RlZmluZQlIUFQzNFhfUENJX0lOSVRfUkVHCQkweDgwCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9ocHQzNHgoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X2hwdDM0eChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBpID0gMDsKIAl1bnNpZ25lZCBsb25nIGhwdDM0eElvQmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOwpAQCAtMTY3LDIxICsxNjYsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaHB0MzR4X3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhwdDM0eF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJIUFQzNHhfSURFIiwKIAkuaWRfdGFibGUJPSBocHQzNHhfcGNpX3RibCwKIAkucHJvYmUJCT0gaHB0MzR4X2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGhwdDM0eF9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmhwdDM0eF9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGhwdDM0eF9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwdDM0eF9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaHB0MzR4X2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYwppbmRleCBlYjEwN2VlLi45Y2YxNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCkBAIC0xMjIsNyArMTIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjA1LDE0ICs2MDQsMjIgQEAKIAogc3RhdGljIGludCBjaGVja19pbl9kcml2ZV9saXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqKmxpc3QpCiB7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOworCWNoYXIgKm0gPSAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdOwogCiAJd2hpbGUgKCpsaXN0KQotCQlpZiAoIXN0cmNtcCgqbGlzdCsrLGlkLT5tb2RlbCkpCisJCWlmICghc3RyY21wKCpsaXN0KyssIG0pKQogCQkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaHB0X2luZm8gKmhwdDN4eF9nZXRfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gKHN0cnVjdCBocHRfaW5mbyAqKWhvc3QtPmhvc3RfcHJpdjsKKworCXJldHVybiBkZXYgPT0gaG9zdC0+ZGV2WzFdID8gaW5mbyArIDEgOiBpbmZvOworfQorCiAvKgogICogVGhlIE1hcnZlbGwgYnJpZGdlIGNoaXBzIHVzZWQgb24gdGhlIEhpZ2hQb2ludCBTQVRBIGNhcmRzIGRvIG5vdCBzZWVtCiAgKiB0byBzdXBwb3J0IHRoZSBVbHRyYURNQSBtb2RlcyAxLCAyLCBhbmQgMyBhcyB3ZWxsIGFzIGFueSBNV0RNQSBtb2Rlcy4uLgpAQCAtNjIxLDkgKzYyOCw3IEBACiBzdGF0aWMgdTggaHB0M3h4X3VkbWFfZmlsdGVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKLQlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBob3N0LT5ob3N0X3ByaXYgKyAoaHdpZi0+ZGV2ID09IGhvc3QtPmRldlsxXSk7CisJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAJdTggbWFzayAJCT0gaHdpZi0+dWx0cmFfbWFzazsKIAogCXN3aXRjaCAoaW5mby0+Y2hpcF90eXBlKSB7CkBAIC02NDksNyArNjU0LDcgQEAKIAljYXNlIEhQVDM3MkE6CiAJY2FzZSBIUFQzNzJOOgogCWNhc2UgSFBUMzc0IDoKLQkJaWYgKGlkZV9kZXZfaXNfc2F0YShkcml2ZS0+aWQpKQorCQlpZiAoYXRhX2lkX2lzX3NhdGEoZHJpdmUtPmlkKSkKIAkJCW1hc2sgJj0gfjB4MGU7CiAJCS8qIEZhbGwgdGhydSAqLwogCWRlZmF1bHQ6CkBAIC02NjIsMTYgKzY2NywxNCBAQAogc3RhdGljIHU4IGhwdDN4eF9tZG1hX2ZpbHRlcihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwotCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0Jc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gcGNpX2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaG9zdC0+aG9zdF9wcml2ICsgKGh3aWYtPmRldiA9PSBob3N0LT5kZXZbMV0pOworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCiAJc3dpdGNoIChpbmZvLT5jaGlwX3R5cGUpIHsKIAljYXNlIEhQVDM3MiA6CiAJY2FzZSBIUFQzNzJBOgogCWNhc2UgSFBUMzcyTjoKIAljYXNlIEhQVDM3NCA6Ci0JCWlmIChpZGVfZGV2X2lzX3NhdGEoZHJpdmUtPmlkKSkKKwkJaWYgKGF0YV9pZF9pc19zYXRhKGRyaXZlLT5pZCkpCiAJCQlyZXR1cm4gMHgwMDsKIAkJLyogRmFsbCB0aHJ1ICovCiAJZGVmYXVsdDoKQEAgLTcwMCw4ICs3MDMsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwotCXN0cnVjdCBpZGVfaG9zdCAqaG9zdAk9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhvc3QtPmhvc3RfcHJpdiArIChod2lmLT5kZXYgPT0gaG9zdC0+ZGV2WzFdKTsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBocHQzeHhfZ2V0X2luZm8oaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaHB0X3RpbWluZ3MgKnQJPSBpbmZvLT50aW1pbmdzOwogCXU4ICBpdHJfYWRkcgkJPSAweDQwICsgKGRyaXZlLT5kbiAqIDQpOwogCXUzMiBvbGRfaXRyCQk9IDA7CkBAIC03MjgsMTEgKzczMCwxMSBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfcXVpcmtwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CisJY2hhciAqbQkJCT0gKGNoYXIgKikmZHJpdmUtPmlkW0FUQV9JRF9QUk9EXTsKIAljb25zdCAgY2hhciAqKmxpc3QJPSBxdWlya19kcml2ZXM7CiAKIAl3aGlsZSAoKmxpc3QpCi0JCWlmIChzdHJzdHIoaWQtPm1vZGVsLCAqbGlzdCsrKSkgeworCQlpZiAoc3Ryc3RyKG0sICpsaXN0KyspKSB7CiAJCQlkcml2ZS0+cXVpcmtfbGlzdCA9IDE7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTc0NCw4ICs3NDYsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3QgcGNpX2RldgkqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwotCXN0cnVjdCBpZGVfaG9zdCAqaG9zdAk9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhvc3QtPmhvc3RfcHJpdiArIChod2lmLT5kZXYgPT0gaG9zdC0+ZGV2WzFdKTsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBocHQzeHhfZ2V0X2luZm8oaHdpZi0+ZGV2KTsKIAogCWlmIChkcml2ZS0+cXVpcmtfbGlzdCkgewogCQlpZiAoaW5mby0+Y2hpcF90eXBlID49IEhQVDM3MCkgewpAQCAtODM0LDcgKzgzNSw3IEBACiAJCWlmIChkbWFfc3RhdCAmIDB4MDEpCiAJCQlocHQzNzBfaXJxX3RpbWVvdXQoZHJpdmUpOwogCX0KLQlyZXR1cm4gX19pZGVfZG1hX2VuZChkcml2ZSk7CisJcmV0dXJuIGlkZV9kbWFfZW5kKGRyaXZlKTsKIH0KIAogc3RhdGljIHZvaWQgaHB0MzcwX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKQEAgLTg2Miw5ICs4NjMsNiBAQAogCWlmIChkbWFfc3RhdCAmIDQpCiAJCXJldHVybiAxOwogCi0JaWYgKCFkcml2ZS0+d2FpdGluZ19mb3JfZG1hKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKCVzKSBjYWxsZWQgd2hpbGUgbm90IHdhaXRpbmdcbiIsCi0JCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODc5LDcgKzg3Nyw3IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBtY3JfYWRkciwgJm1jcik7CiAJaWYgKGJ3c3IgJiBtYXNrKQogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBtY3JfYWRkciwgbWNyIHwgMHgzMCk7Ci0JcmV0dXJuIF9faWRlX2RtYV9lbmQoZHJpdmUpOworCXJldHVybiBpZGVfZG1hX2VuZChkcml2ZSk7CiB9CiAKIC8qKgpAQCAtOTQyLDcgKzk0MCw3IEBACiAgKglQZXJmb3JtIGEgY2FsaWJyYXRpb24gY3ljbGUgb24gdGhlIERQTEwuCiAgKglSZXR1cm5zIDEgaWYgdGhpcyBzdWNjZWVkcwogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBocHQzN3hfY2FsaWJyYXRlX2RwbGwoc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IGZfbG93LCB1MTYgZl9oaWdoKQorc3RhdGljIGludCBocHQzN3hfY2FsaWJyYXRlX2RwbGwoc3RydWN0IHBjaV9kZXYgKmRldiwgdTE2IGZfbG93LCB1MTYgZl9oaWdoKQogewogCXUzMiBkcGxsID0gKGZfaGlnaCA8PCAxNikgfCBmX2xvdyB8IDB4MTAwOwogCXU4ICBzY3IyOwpAQCAtOTcwLDExICs5NjgsNDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2hwdDM2NihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgaHB0M3h4X2Rpc2FibGVfZmFzdF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggbWNyX2FkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBpb19iYXNlCT0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaG9zdC0+aG9zdF9wcml2ICsgKCZkZXYtPmRldiA9PSBob3N0LT5kZXZbMV0pOworCXU4ICBjaGlwX3R5cGUJCT0gaW5mby0+Y2hpcF90eXBlOworCXU4ICBuZXdfbWNyLCBvbGRfbWNyCT0gMDsKKworCS8qCisJICogRGlzYWJsZSB0aGUgImZhc3QgaW50ZXJydXB0IiBwcmVkaWN0aW9uLiAgRG9uJ3QgaG9sZCBvZmYKKwkgKiBvbiBpbnRlcnJ1cHRzLiAoPT0gMHgwMSBkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KQorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgbWNyX2FkZHIgKyAxLCAmb2xkX21jcik7CisKKwlpZiAoY2hpcF90eXBlID49IEhQVDM3NCkKKwkJbmV3X21jciA9IG9sZF9tY3IgJiB+MHgwNzsKKwllbHNlIGlmIChjaGlwX3R5cGUgPj0gSFBUMzcwKSB7CisJCW5ld19tY3IgPSBvbGRfbWNyOworCQluZXdfbWNyICY9IH4weDAyOworI2lmZGVmIEhQVF9ERUxBWV9JTlRFUlJVUFQKKwkJbmV3X21jciAmPSB+MHgwMTsKKyNlbHNlCisJCW5ld19tY3IgfD0gIDB4MDE7CisjZW5kaWYKKwl9IGVsc2UJCQkJCS8qIEhQVDM2NiBhbmQgSFBUMzY4ICAqLworCQluZXdfbWNyID0gb2xkX21jciAmIH4weDgwOworCisJaWYgKG5ld19tY3IgIT0gb2xkX21jcikKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgbWNyX2FkZHIgKyAxLCBuZXdfbWNyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbml0X2NoaXBzZXRfaHB0MzY2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb19iYXNlCT0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CisJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKCZkZXYtPmRldik7CiAJY29uc3QgY2hhciAqbmFtZQk9IERSVl9OQU1FOwogCXU4IHBjaV9jbGssICBkcGxsX2Nsawk9IDA7CS8qIFBDSSBhbmQgRFBMTCBjbG9jayBpbiBNSHogKi8KIAl1OCBjaGlwX3R5cGU7CkBAIC0xMjA4LDE3ICsxMjM1LDE4IEBACiAJICogTk9URTogVGhpcyByZWdpc3RlciBpcyBvbmx5IHdyaXRlYWJsZSB2aWEgSS9PIHNwYWNlLgogCSAqLwogCWlmIChjaGlwX3R5cGUgPT0gSFBUMzcxTiAmJiBjbG9jayA9PSBBVEFfQ0xPQ0tfNjZNSFopCi0KIAkJb3V0YihpbmIoaW9fYmFzZSArIDB4OWMpIHwgMHgwNCwgaW9fYmFzZSArIDB4OWMpOwogCisJaHB0M3h4X2Rpc2FibGVfZmFzdF9pcnEoZGV2LCAweDUwKTsKKwlocHQzeHhfZGlzYWJsZV9mYXN0X2lycShkZXYsIDB4NTQpOworCiAJcmV0dXJuIGRldi0+aXJxOwogfQogCiBzdGF0aWMgdTggaHB0M3h4X2NhYmxlX2RldGVjdChpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBwY2lfZGV2CSpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0Jc3RydWN0IGlkZV9ob3N0ICpob3N0CT0gcGNpX2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaG9zdC0+aG9zdF9wcml2ICsgKGh3aWYtPmRldiA9PSBob3N0LT5kZXZbMV0pOworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCXU4IGNoaXBfdHlwZQkJPSBpbmZvLT5jaGlwX3R5cGU7CiAJdTggc2NyMSA9IDAsIGF0YTY2CT0gaHdpZi0+Y2hhbm5lbCA/IDB4MDEgOiAweDAyOwogCkBAIC0xMjYyLDExICsxMjkwLDkgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKLQlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBob3N0LT5ob3N0X3ByaXYgKyAoaHdpZi0+ZGV2ID09IGhvc3QtPmRldlsxXSk7CisJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAJaW50IHNlcmlhbGl6ZQkJPSBIUFRfU0VSSUFMSVpFX0lPOwogCXU4ICBjaGlwX3R5cGUJCT0gaW5mby0+Y2hpcF90eXBlOwotCXU4ICBuZXdfbWNyLCBvbGRfbWNyCT0gMDsKIAogCS8qIENhY2hlIHRoZSBjaGFubmVsJ3MgTUlTQy4gY29udHJvbCByZWdpc3RlcnMnIG9mZnNldCAqLwogCWh3aWYtPnNlbGVjdF9kYXRhCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NTQgOiAweDUwOwpAQCAtMTI4OSwyOSArMTMxNSw2IEBACiAJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGlzIGRldmljZSBpZiBuZWVkZWQgKi8KIAlpZiAoc2VyaWFsaXplICYmIGh3aWYtPm1hdGUpCiAJCWh3aWYtPnNlcmlhbGl6ZWQgPSBod2lmLT5tYXRlLT5zZXJpYWxpemVkID0gMTsKLQotCS8qCi0JICogRGlzYWJsZSB0aGUgImZhc3QgaW50ZXJydXB0IiBwcmVkaWN0aW9uLiAgRG9uJ3QgaG9sZCBvZmYKLQkgKiBvbiBpbnRlcnJ1cHRzLiAoPT0gMHgwMSBkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KQotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgaHdpZi0+c2VsZWN0X2RhdGEgKyAxLCAmb2xkX21jcik7Ci0KLQlpZiAoaW5mby0+Y2hpcF90eXBlID49IEhQVDM3NCkKLQkJbmV3X21jciA9IG9sZF9tY3IgJiB+MHgwNzsKLQllbHNlIGlmIChpbmZvLT5jaGlwX3R5cGUgPj0gSFBUMzcwKSB7Ci0JCW5ld19tY3IgPSBvbGRfbWNyOwotCQluZXdfbWNyICY9IH4weDAyOwotCi0jaWZkZWYgSFBUX0RFTEFZX0lOVEVSUlVQVAotCQluZXdfbWNyICY9IH4weDAxOwotI2Vsc2UKLQkJbmV3X21jciB8PSAgMHgwMTsKLSNlbmRpZgotCX0gZWxzZQkJCQkJLyogSFBUMzY2IGFuZCBIUFQzNjggICovCi0JCW5ld19tY3IgPSBvbGRfbWNyICYgfjB4ODA7Ci0KLQlpZiAobmV3X21jciAhPSBvbGRfbWNyKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBod2lmLT5zZWxlY3RfZGF0YSArIDEsIG5ld19tY3IpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X2RtYV9ocHQzNjYoaWRlX2h3aWZfdCAqaHdpZiwKQEAgLTE0NTAsNyArMTQ1Myw3IEBACiAJLmRtYV9zZXR1cAkJPSBpZGVfZG1hX3NldHVwLAogCS5kbWFfZXhlY19jbWQJCT0gaWRlX2RtYV9leGVjX2NtZCwKIAkuZG1hX3N0YXJ0CQk9IGlkZV9kbWFfc3RhcnQsCi0JLmRtYV9lbmQJCT0gX19pZGVfZG1hX2VuZCwKKwkuZG1hX2VuZAkJPSBpZGVfZG1hX2VuZCwKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBocHQzNjZfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCkBAIC0xNjE2LDIxICsxNjE5LDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGhwdDM2Nl9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBocHQzNjZfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiSFBUMzY2X0lERSIsCiAJLmlkX3RhYmxlCT0gaHB0MzY2X3BjaV90YmwsCiAJLnByb2JlCQk9IGhwdDM2Nl9pbml0X29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGhwdDM2Nl9yZW1vdmUpLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBocHQzNjZfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZocHQzNjZfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBocHQzNjZfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZocHQzNjZfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhwdDM2Nl9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvaXQ4MjEzLmMgYi9kcml2ZXJzL2lkZS9wY2kvaXQ4MjEzLmMKaW5kZXggNjUyZTQ3ZC4uN2MyZmVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9pdDgyMTMuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKQEAgLTE5MCwyMSArMTg5LDIzIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpdDgyMTNfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXQ4MjEzX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIklURTgyMTNfSURFIiwKIAkuaWRfdGFibGUJPSBpdDgyMTNfcGNpX3RibCwKIAkucHJvYmUJCT0gaXQ4MjEzX2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGl0ODIxM19pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJml0ODIxM19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGl0ODIxM19pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml0ODIxM19wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaXQ4MjEzX2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9pdDgyMXguYyBiL2RyaXZlcnMvaWRlL3BjaS9pdDgyMXguYwppbmRleCA0YTE1MDhhLi45OTVlMThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2l0ODIxeC5jCkBAIC02Myw3ICs2Myw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApAQCAtMTM5LDggKzEzOCw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCWludCBjaGFubmVsID0gaHdpZi0+Y2hhbm5lbDsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OwotCXU4IGNvbmY7CisJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIGNvbmY7CiAKIAkvKiBQcm9ncmFtIFVETUEgdGltaW5nIGJpdHMgKi8KIAlpZihpdGRldi0+Y2xvY2tfbW9kZSA9PSBBVEFfNjYpCkBAIC0xNjksMTMgKzE2NywxMSBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJaWRlX2RyaXZlX3QgKnBhaXI7CisJaW50IGNsb2NrLCBhbHRjbG9jaywgc2VsID0gMDsKKwl1OCB1bml0ID0gZHJpdmUtPmRuICYgMSwgdjsKIAotCXU4IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKLQlpZGVfZHJpdmVfdCAqcGFpciA9ICZod2lmLT5kcml2ZXNbMS11bml0XTsKLQotCWludCBjbG9jaywgYWx0Y2xvY2s7Ci0JdTggdjsKLQlpbnQgc2VsID0gMDsKKwlwYWlyID0gJmh3aWYtPmRyaXZlc1sxIC0gdW5pdF07CiAKIAlpZihpdGRldi0+d2FudFswXVswXSA+IGl0ZGV2LT53YW50WzFdWzBdKSB7CiAJCWNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07CkBAIC0yNDEsMTYgKzIzNywxNyBAQAogCiBzdGF0aWMgdm9pZCBpdDgyMXhfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OwotCWlkZV9kcml2ZV90ICpwYWlyID0gJmh3aWYtPmRyaXZlc1sxIC0gdW5pdF07Ci0JdTggc2V0X3BpbyA9IHBpbzsKKwlpZGVfZHJpdmVfdCAqcGFpcjsKKwl1OCB1bml0ID0gZHJpdmUtPmRuICYgMSwgc2V0X3BpbyA9IHBpbzsKIAogCS8qIFNwZWMgc2F5cyA4OSByZWYgZHJpdmVyIHVzZXMgODggKi8KIAlzdGF0aWMgdTE2IHBpb190aW1pbmdzW109IHsgMHhBQTg4LCAweEEzODIsIDB4QTE4MSwgMHgzMzMyLCAweDMxMjEgfTsKIAlzdGF0aWMgdTggcGlvX3dhbnRbXSAgICA9IHsgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBXzY2LCBBVEFfQU5ZIH07CiAKKwlwYWlyID0gJmh3aWYtPmRyaXZlc1sxIC0gdW5pdF07CisKIAkvKgogCSAqIENvbXB1dGUgdGhlIGJlc3QgUElPIG1vZGUgd2UgY2FuIGZvciBhIGdpdmVuIGRldmljZS4gV2UgbXVzdAogCSAqIHBpY2sgYSBzcGVlZCB0aGF0IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zIHdpdGggdGhlIG90aGVyIGRldmljZQpAQCAtMjg3LDkgKzI4NCw3IEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gKHZvaWQgKilpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwotCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7Ci0JaW50IGNoYW5uZWwgPSBod2lmLT5jaGFubmVsOwotCXU4IGNvbmY7CisJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIGNoYW5uZWwgPSBod2lmLT5jaGFubmVsLCBjb25mOwogCiAJc3RhdGljIHUxNiBkbWFbXQk9IHsgMHg4ODY2LCAweDMyMjIsIDB4MzEyMSB9OwogCXN0YXRpYyB1OCBtd2RtYV93YW50W10JPSB7IEFUQV9BTlksIEFUQV82NiwgQVRBX0FOWSB9OwpAQCAtMzI2LDkgKzMyMSw3IEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OwotCWludCBjaGFubmVsID0gaHdpZi0+Y2hhbm5lbDsKLQl1OCBjb25mOworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCBjaGFubmVsID0gaHdpZi0+Y2hhbm5lbCwgY29uZjsKIAogCXN0YXRpYyB1MTYgdWRtYVtdCT0geyAweDQ0MzMsIDB4NDIzMSwgMHgzMTIxLCAweDIxMjEsIDB4MTExMSwgMHgyMjExLCAweDExMTEgfTsKIAlzdGF0aWMgdTggdWRtYV93YW50W10JPSB7IEFUQV9BTlksIEFUQV81MCwgQVRBX0FOWSwgQVRBXzY2LCBBVEFfNjYsIEFUQV81MCwgQVRBXzY2IH07CkBAIC0zNzAsNyArMzYzLDggQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOworCiAJaWYoaXRkZXYtPm13ZG1hW3VuaXRdICE9IE1XRE1BX09GRikKIAkJaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5td2RtYVt1bml0XSk7CiAJZWxzZSBpZihpdGRldi0+dWRtYVt1bml0XSAhPSBVRE1BX09GRiAmJiBpdGRldi0+dGltaW5nMTApCkBAIC0zOTAsOSArMzg0LDEwIEBACiBzdGF0aWMgaW50IGl0ODIxeF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKIAlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwotCWludCByZXQgPSBfX2lkZV9kbWFfZW5kKGRyaXZlKTsKKwlpbnQgcmV0ID0gaWRlX2RtYV9lbmQoZHJpdmUpOworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOworCiAJaWYoaXRkZXYtPm13ZG1hW3VuaXRdICE9IE1XRE1BX09GRikKIAkJaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5waW9bdW5pdF0pOwogCXJldHVybiByZXQ7CkBAIC00NDYsOCArNDQxLDcgQEAKIHN0YXRpYyB2b2lkIGl0ODIxeF9xdWlya3Byb2MoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoZHJpdmUtPmh3aWYpOwotCXN0cnVjdCBoZF9kcml2ZWlkICppZCA9IGRyaXZlLT5pZDsKLQl1MTYgKmlkYml0cyA9ICh1MTYgKilkcml2ZS0+aWQ7CisJdTE2ICppZCA9IGRyaXZlLT5pZDsKIAogCWlmICghaXRkZXYtPnNtYXJ0KSB7CiAJCS8qCkBAIC00NTYsNyArNDUwLDcgQEAKIAkJICoJSVJRIG1hc2sgYXMgd2UgbWF5IHdlbGwgYmUgaW4gUElPIChlZyByZXYgMHgxMCkKIAkJICoJZm9yIG5vdyBhbmQgd2Uga25vdyB1bm1hc2tpbmcgaXMgc2FmZSBvbiB0aGlzIGNoaXBzZXQuCiAJCSAqLwotCQlkcml2ZS0+dW5tYXNrID0gMTsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfVU5NQVNLOwogCX0gZWxzZSB7CiAJLyoKIAkgKglQZXJmb3JtIGZpeHVwcyBvbiBzbWFydCBtb2RlLiBXZSBuZWVkIHRvICJsb3NlIiBzb21lCkBAIC00NjYsMzYgKzQ2MCwzNiBAQAogCSAqLwogCiAJCS8qIENoZWNrIGZvciBSQUlEIHYgbmF0aXZlICovCi0JCWlmKHN0cnN0cihpZC0+bW9kZWwsICJJbnRlZ3JhdGVkIFRlY2hub2xvZ3kgRXhwcmVzcyIpKSB7CisJCWlmIChzdHJzdHIoKGNoYXIgKikmaWRbQVRBX0lEX1BST0RdLAorCQkJICAgIkludGVncmF0ZWQgVGVjaG5vbG9neSBFeHByZXNzIikpIHsKIAkJCS8qIEluIHJhaWQgbW9kZSB0aGUgaWRlbnQgYmxvY2sgaXMgc2xpZ2h0bHkgYnVnZ3kKIAkJCSAgIFdlIG5lZWQgdG8gc2V0IHRoZSBiaXRzIHNvIHRoYXQgdGhlIElERSBsYXllciBrbm93cwogCQkJICAgTEJBMjguIExCQTQ4IGFuZCBETUEgYXIgdmFsaWQgKi8KLQkJCWlkLT5jYXBhYmlsaXR5IHw9IDM7CQkvKiBMQkEyOCwgRE1BICovCi0JCQlpZC0+Y29tbWFuZF9zZXRfMiB8PSAweDA0MDA7CS8qIExCQTQ4IHZhbGlkICovCi0JCQlpZC0+Y2ZzX2VuYWJsZV8yIHw9IDB4MDQwMDsJLyogTEJBNDggb24gKi8KKwkJCWlkW0FUQV9JRF9DQVBBQklMSVRZXSAgICB8PSAoMyA8PCA4KTsgLyogTEJBMjgsIERNQSAqLworCQkJaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzJdIHw9IDB4MDQwMDsgICAvKiBMQkE0OCB2YWxpZCAqLworCQkJaWRbQVRBX0lEX0NGU19FTkFCTEVfMl0gIHw9IDB4MDQwMDsgICAvKiBMQkE0OCBvbiAqLwogCQkJLyogUmVwb3J0aW5nIGxvZ2ljICovCiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogSVQ4MjEyICVzUkFJRCAlZCB2b2x1bWUiLAotCQkJCWRyaXZlLT5uYW1lLAotCQkJCWlkYml0c1sxNDddID8gIkJvb3RhYmxlICI6IiIsCi0JCQkJaWRiaXRzWzEyOV0pOwotCQkJCWlmKGlkYml0c1sxMjldICE9IDEpCi0JCQkJCXByaW50aygiKCVkSyBzdHJpcGUpIiwgaWRiaXRzWzE0Nl0pOwotCQkJCXByaW50aygiLlxuIik7CisJCQkJZHJpdmUtPm5hbWUsIGlkWzE0N10gPyAiQm9vdGFibGUgIiA6ICIiLAorCQkJCWlkW0FUQV9JRF9DU0ZPXSk7CisJCQlpZiAoaWRbQVRBX0lEX0NTRk9dICE9IDEpCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiKCVkSyBzdHJpcGUpIiwgaWRbMTQ2XSk7CisJCQlwcmludGsoS0VSTl9DT05UICIuXG4iKTsKIAkJfSBlbHNlIHsKIAkJCS8qIE5vbiBSQUlEIHZvbHVtZS4gRml4dXBzIHRvIHN0b3AgdGhlIGNvcmUgY29kZQogCQkJICAgZG9pbmcgdW5zdXBwb3J0ZWQgdGhpbmdzICovCi0JCQlpZC0+ZmllbGRfdmFsaWQgJj0gMzsKLQkJCWlkLT5xdWV1ZV9kZXB0aCA9IDA7Ci0JCQlpZC0+Y29tbWFuZF9zZXRfMSA9IDA7Ci0JCQlpZC0+Y29tbWFuZF9zZXRfMiAmPSAweEM0MDA7Ci0JCQlpZC0+Y2Zzc2UgJj0gMHhDMDAwOwotCQkJaWQtPmNmc19lbmFibGVfMSA9IDA7Ci0JCQlpZC0+Y2ZzX2VuYWJsZV8yICY9IDB4QzQwMDsKLQkJCWlkLT5jc2ZfZGVmYXVsdCAmPSAweEMwMDA7Ci0JCQlpZC0+d29yZDEyNyA9IDA7Ci0JCQlpZC0+ZGxmID0gMDsKLQkJCWlkLT5jc2ZvID0gMDsKLQkJCWlkLT5jZmFfcG93ZXIgPSAwOworCQkJaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXQkgJj0gMzsKKwkJCWlkW0FUQV9JRF9RVUVVRV9ERVBUSF0JICA9IDA7CisJCQlpZFtBVEFfSURfQ09NTUFORF9TRVRfMV0gID0gMDsKKwkJCWlkW0FUQV9JRF9DT01NQU5EX1NFVF8yXSAmPSAweEM0MDA7CisJCQlpZFtBVEFfSURfQ0ZTU0VdCSAmPSAweEMwMDA7CisJCQlpZFtBVEFfSURfQ0ZTX0VOQUJMRV8xXQkgID0gMDsKKwkJCWlkW0FUQV9JRF9DRlNfRU5BQkxFXzJdCSAmPSAweEM0MDA7CisJCQlpZFtBVEFfSURfQ1NGX0RFRkFVTFRdCSAmPSAweEMwMDA7CisJCQlpZFsxMjddCQkJICA9IDA7CisJCQlpZFtBVEFfSURfRExGXQkJICA9IDA7CisJCQlpZFtBVEFfSURfQ1NGT10JCSAgPSAwOworCQkJaWRbQVRBX0lEX0NGQV9QT1dFUl0JICA9IDA7CiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGVyZm9ybWluZyBpZGVudGlmeSBmaXh1cHMuXG4iLAogCQkJCWRyaXZlLT5uYW1lKTsKIAkJfQpAQCAtNTA1LDggKzQ5OSw4IEBACiAJCSAqIElERSBjb3JlIHRoYXQgRE1BIGlzIHN1cHBvcnRlZCAoaXQ4MjF4IGhhcmR3YXJlCiAJCSAqIHRha2VzIGNhcmUgb2YgRE1BIG1vZGUgcHJvZ3JhbW1pbmcpLgogCQkgKi8KLQkJaWYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgewotCQkJaWQtPmRtYV9td29yZCB8PSAweDAxMDE7CisJCWlmIChhdGFfaWRfaGFzX2RtYShpZCkpIHsKKwkJCWlkW0FUQV9JRF9NV0RNQV9NT0RFU10gfD0gMHgwMTAxOwogCQkJZHJpdmUtPmN1cnJlbnRfc3BlZWQgPSBYRkVSX01XX0RNQV8wOwogCQl9CiAJfQpAQCAtNTg4LDcgKzU4Miw3IEBACiAJaHdpZi0+bXdkbWFfbWFzayA9IEFUQV9NV0RNQTI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpdDgyMTJfZGlzYWJsZV9yYWlkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBpdDgyMTJfZGlzYWJsZV9yYWlkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJLyogUmVzZXQgbG9jYWwgQ1BVLCBhbmQgc2V0IEJJT1Mgbm90IHJlYWR5ICovCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1RSwgMHgwMSk7CkBAIC02MDUsNyArNTk5LDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHgyMCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9pdDgyMXgoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X2l0ODIxeChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXU4IGNvbmY7CiAJc3RhdGljIGNoYXIgKm1vZGVbMl0gPSB7ICJwYXNzIHRocm91Z2giLCAic21hcnQiIH07CkBAIC02ODIsMjEgKzY3NiwyMyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXQ4MjF4X3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl0ODIxeF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJJVEU4MjF4IElERSIsCiAJLmlkX3RhYmxlCT0gaXQ4MjF4X3BjaV90YmwsCiAJLnByb2JlCQk9IGl0ODIxeF9pbml0X29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGl0ODIxeF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpdDgyMXhfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZpdDgyMXhfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpdDgyMXhfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpdDgyMXhfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGl0ODIxeF9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvam1pY3Jvbi5jIGIvZHJpdmVycy9pZGUvcGNpL2ptaWNyb24uYwppbmRleCBiYjlkMDlkLi45YTY4NDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvam1pY3Jvbi5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9qbWljcm9uLmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIApAQCAtMTUwLDIxICsxNDksMjMgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGptaWNyb25fcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgam1pY3Jvbl9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJKTWljcm9uIElERSIsCiAJLmlkX3RhYmxlCT0gam1pY3Jvbl9wY2lfdGJsLAogCS5wcm9iZQkJPSBqbWljcm9uX2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGptaWNyb25faWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZqbWljcm9uX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgam1pY3Jvbl9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmptaWNyb25fcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGptaWNyb25faWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYyBiL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMKaW5kZXggZmZlZmNkMS4uMTM3ODkwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvbnM4NzQxNS5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CkBAIC0xMzgsNyArMTM3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnM4NzQxNV9jb3VudCA9IDAsIG5zODc0MTVfY29udHJvbFtNQVhfSFdJRlNdID0geyAwIH07CiAKIC8qCi0gKiBUaGlzIHJvdXRpbmUgZWl0aGVyIGVuYWJsZXMvZGlzYWJsZXMgKGFjY29yZGluZyB0byBkcml2ZS0+cHJlc2VudCkKKyAqIFRoaXMgcm91dGluZSBlaXRoZXIgZW5hYmxlcy9kaXNhYmxlcyAoYWNjb3JkaW5nIHRvIElERV9ERkxBR19QUkVTRU5UKQogICogdGhlIElSUSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQgKEhXSUYoZHJpdmUpKSwKICAqIGFuZCBzZWxlY3RzIGVpdGhlciBQSU8gb3IgRE1BIGhhbmRzaGFraW5nIGZvciB0aGUgbmV4dCBJL08gb3BlcmF0aW9uLgogICovCkBAIC0xNTQsMTEgKzE1MywxNSBAQAogCiAJLyogQWRqdXN0IElSUSBlbmFibGUgYml0ICovCiAJYml0ID0gMSA8PCAoOCArIGh3aWYtPmNoYW5uZWwpOwotCW5ldyA9IGRyaXZlLT5wcmVzZW50ID8gKG5ldyAmIH5iaXQpIDogKG5ldyB8IGJpdCk7CisKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKQorCQluZXcgJj0gfmJpdDsKKwllbHNlCisJCW5ldyB8PSBiaXQ7CiAKIAkvKiBTZWxlY3QgUElPIG9yIERNQSwgRE1BIG1heSBvbmx5IGJlIHNlbGVjdGVkIGZvciBvbmUgZHJpdmUvY2hhbm5lbC4gKi8KLQliaXQgICA9IDEgPDwgKDIwICsgZHJpdmUtPnNlbGVjdC5iLnVuaXQgICAgICAgKyAoaHdpZi0+Y2hhbm5lbCA8PCAxKSk7Ci0Jb3RoZXIgPSAxIDw8ICgyMCArICgxIC0gZHJpdmUtPnNlbGVjdC5iLnVuaXQpICsgKGh3aWYtPmNoYW5uZWwgPDwgMSkpOworCWJpdCAgID0gMSA8PCAoMjAgKyAoZHJpdmUtPmRuICYgMSkgKyAoaHdpZi0+Y2hhbm5lbCA8PCAxKSk7CisJb3RoZXIgPSAxIDw8ICgyMCArICgxIC0gKGRyaXZlLT5kbiAmIDEpKSArIChod2lmLT5jaGFubmVsIDw8IDEpKTsKIAluZXcgPSB1c2VfZG1hID8gKChuZXcgJiB+b3RoZXIpIHwgYml0KSA6IChuZXcgJiB+Yml0KTsKIAogCWlmIChuZXcgIT0gKm9sZCkgewpAQCAtMTg4LDcgKzE5MSw4IEBACiAKIHN0YXRpYyB2b2lkIG5zODc0MTVfc2VsZWN0cHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCW5zODc0MTVfcHJlcGFyZV9kcml2ZSAoZHJpdmUsIGRyaXZlLT51c2luZ19kbWEpOworCW5zODc0MTVfcHJlcGFyZV9kcml2ZShkcml2ZSwKKwkJCSAgICAgICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKSk7CiB9CiAKIHN0YXRpYyBpbnQgbnM4NzQxNV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKQEAgLTI3NCw5ICsyNzgsOSBAQAogCQlkbyB7CiAJCQl1ZGVsYXkoNTApOwogCQkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7Ci0gICAgICAgICAgICAgICAgCWlmIChzdGF0ID09IDB4ZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgIAl9IHdoaWxlICgoc3RhdCAmIEJVU1lfU1RBVCkgJiYgLS10aW1lb3V0KTsKKwkJCWlmIChzdGF0ID09IDB4ZmYpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKChzdGF0ICYgQVRBX0JVU1kpICYmIC0tdGltZW91dCk7CiAjZW5kaWYKIAl9CiAKQEAgLTMzNSwyMSArMzM5LDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5zODc0MTVfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbnM4NzQxNV9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJOUzg3NDE1X0lERSIsCiAJLmlkX3RhYmxlCT0gbnM4NzQxNV9wY2lfdGJsLAogCS5wcm9iZQkJPSBuczg3NDE1X2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5zODc0MTVfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZuczg3NDE1X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbnM4NzQxNV9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5zODc0MTVfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KG5zODc0MTVfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYyBiL2RyaXZlcnMvaWRlL3BjaS9vcHRpNjIxLmMKaW5kZXggZTI4ZTY3Mi4uNjA0OGVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jCkBAIC04NSw3ICs4NSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTM3LDcgKzEzNiw3IEBACiBzdGF0aWMgdm9pZCBvcHRpNjIxX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJlZF9kcml2ZShkcml2ZSk7CisJaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IHRpbSwgbWlzYywgYWRkcl9waW8gPSBwaW8sIGNsazsKIApAQCAtMTUzLDcgKzE1Miw3IEBACiAKIAlkcml2ZS0+ZHJpdmVfZGF0YSA9IFhGRVJfUElPXzAgKyBwaW87CiAKLQlpZiAocGFpci0+cHJlc2VudCkgeworCWlmIChwYWlyKSB7CiAJCWlmIChwYWlyLT5kcml2ZV9kYXRhICYmIHBhaXItPmRyaXZlX2RhdGEgPCBkcml2ZS0+ZHJpdmVfZGF0YSkKIAkJCWFkZHJfcGlvID0gcGFpci0+ZHJpdmVfZGF0YSAtIFhGRVJfUElPXzA7CiAJfQpAQCAtMTgwLDcgKzE3OSw3IEBACiAJbWlzYyA9IGFkZHJfdGltaW5nc1tjbGtdW2FkZHJfcGlvXTsKIAogCS8qIHNlbGVjdCBJbmRleC0wLzEgZm9yIFJlZ2lzdGVyLUEvQiAqLwotCXdyaXRlX3JlZyhkcml2ZS0+c2VsZWN0LmIudW5pdCwgTUlTQ19SRUcpOworCXdyaXRlX3JlZyhkcml2ZS0+ZG4gJiAxLCBNSVNDX1JFRyk7CiAJLyogc2V0IHJlYWQgY3ljbGUgdGltaW5ncyAqLwogCXdyaXRlX3JlZyh0aW0sIFJFQURfUkVHKTsKIAkvKiBzZXQgd3JpdGUgY3ljbGUgdGltaW5ncyAqLwpAQCAtMjIxLDIxICsyMjAsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgb3B0aTYyMV9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBvcHRpNjIxX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIk9wdGk2MjFfSURFIiwKIAkuaWRfdGFibGUJPSBvcHRpNjIxX3BjaV90YmwsCiAJLnByb2JlCQk9IG9wdGk2MjFfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgb3B0aTYyMV9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJm9wdGk2MjFfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBvcHRpNjIxX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmb3B0aTYyMV9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQob3B0aTYyMV9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfbmV3LmMgYi9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfbmV3LmMKaW5kZXggZDQ3N2RhNi4uMjExYWU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9uZXcuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KQEAgLTIwMywxMCArMjAyLDEwIEBACiAKIHN0YXRpYyB2b2lkIHBkY25ld19xdWlya3Byb2MoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWNvbnN0IGNoYXIgKipsaXN0LCAqbW9kZWwgPSBkcml2ZS0+aWQtPm1vZGVsOworCWNvbnN0IGNoYXIgKipsaXN0LCAqbSA9IChjaGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF07CiAKIAlmb3IgKGxpc3QgPSBwZGNfcXVpcmtfZHJpdmVzOyAqbGlzdCAhPSBOVUxMOyBsaXN0KyspCi0JCWlmIChzdHJzdHIobW9kZWwsICpsaXN0KSAhPSBOVUxMKSB7CisJCWlmIChzdHJzdHIobSwgKmxpc3QpICE9IE5VTEwpIHsKIAkJCWRyaXZlLT5xdWlya19saXN0ID0gMjsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjI3LDcgKzIyNiw3IEBACiAgKiByZWFkX2NvdW50ZXIgLSBSZWFkIHRoZSBieXRlIGNvdW50IHJlZ2lzdGVycwogICogQGRtYV9iYXNlOiBmb3IgdGhlIHBvcnQgYWRkcmVzcwogICovCi1zdGF0aWMgbG9uZyBfX2RldmluaXQgcmVhZF9jb3VudGVyKHUzMiBkbWFfYmFzZSkKK3N0YXRpYyBsb25nIHJlYWRfY291bnRlcih1MzIgZG1hX2Jhc2UpCiB7CiAJdTMyICBwcmlfZG1hX2Jhc2UgPSBkbWFfYmFzZSwgc2VjX2RtYV9iYXNlID0gZG1hX2Jhc2UgKyAweDA4OwogCXU4ICAgY250MCwgY250MSwgY250MiwgY250MzsKQEAgLTI2Nyw3ICsyNjYsNyBAQAogICogQGRtYV9iYXNlOiBmb3IgdGhlIHBvcnQgYWRkcmVzcwogICogRS5nLiAxNjk0OTAwMCBvbiAzMyBNSHogUENJIGJ1cywgaS5lLiBoYWxmIG9mIHRoZSBQQ0kgY2xvY2suCiAgKi8KLXN0YXRpYyBsb25nIF9fZGV2aW5pdCBkZXRlY3RfcGxsX2lucHV0X2Nsb2NrKHVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UpCitzdGF0aWMgbG9uZyBkZXRlY3RfcGxsX2lucHV0X2Nsb2NrKHVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UpCiB7CiAJc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZSwgZW5kX3RpbWU7CiAJbG9uZyBzdGFydF9jb3VudCwgZW5kX2NvdW50OwpAQCAtMzEwLDcgKzMwOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhcHBsZV9raXdpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCBhcHBsZV9raXdpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKIAl1OCBjb25mOwpAQCAtMzI2LDcgKzMyNSw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9wZGNuZXcoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X3BkY25ldyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBEUlZfTkFNRTsKIAl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CkBAIC01NjIsMjEgKzU2MSwyMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwZGMyMDJuZXdfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjMjAybmV3X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlByb21pc2VfSURFIiwKIAkuaWRfdGFibGUJPSBwZGMyMDJuZXdfcGNpX3RibCwKIAkucHJvYmUJCT0gcGRjMjAybmV3X2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGRjMjAybmV3X3JlbW92ZSksCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBkYzIwMm5ld19pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnBkYzIwMm5ld19wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBkYzIwMm5ld19pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBkYzIwMm5ld19wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQocGRjMjAybmV3X2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9vbGQuYyBiL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9vbGQuYwppbmRleCBkZTlhMjc0Li43OTk1NTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X29sZC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KQEAgLTg2LDcgKzg1LDcgQEAKIAkJICogUHJlZmV0Y2hfRU4gLyBJT1JEWV9FTiAvIFBBWzM6MF0gYml0cyBvZiByZWdpc3RlciBBCiAJCSAqLwogCQlBUCAmPSB+MHgzZjsKLQkJaWYgKGRyaXZlLT5pZC0+Y2FwYWJpbGl0eSAmIDQpCisJCWlmIChhdGFfaWRfaW9yZHlfZGlzYWJsZShkcml2ZS0+aWQpKQogCQkJQVAgfD0gMHgyMDsJLyogc2V0IElPUkRZX0VOIGJpdCAqLwogCQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrKQogCQkJQVAgfD0gMHgxMDsJLyogc2V0IFByZWZldGNoX0VOIGJpdCAqLwpAQCAtMTU0LDEwICsxNTMsMTAgQEAKIAogc3RhdGljIHZvaWQgcGRjMjAyeHhfcXVpcmtwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQljb25zdCBjaGFyICoqbGlzdCwgKm1vZGVsID0gZHJpdmUtPmlkLT5tb2RlbDsKKwljb25zdCBjaGFyICoqbGlzdCwgKm0gPSAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdOwogCiAJZm9yIChsaXN0ID0gcGRjX3F1aXJrX2RyaXZlczsgKmxpc3QgIT0gTlVMTDsgbGlzdCsrKQotCQlpZiAoc3Ryc3RyKG1vZGVsLCAqbGlzdCkgIT0gTlVMTCkgeworCQlpZiAoc3Ryc3RyKG0sICpsaXN0KSAhPSBOVUxMKSB7CiAJCQlkcml2ZS0+cXVpcmtfbGlzdCA9IDI7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTE2OSw3ICsxNjgsNyBAQAogewogCWlmIChkcml2ZS0+Y3VycmVudF9zcGVlZCA+IFhGRVJfVURNQV8yKQogCQlwZGNfb2xkX2VuYWJsZV82Nk1Iel9jbG9jayhkcml2ZS0+aHdpZik7Ci0JaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCBkcml2ZS0+YWRkcmVzc2luZyA9PSAxKSB7CisJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzayB8fCAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19MQkE0OCkpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJxCT0gSFdHUk9VUChkcml2ZSktPnJxOwogCQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CiAJCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmV4dHJhX2Jhc2UgLSAxNjsKQEAgLTE4OSw3ICsxODgsNyBAQAogCiBzdGF0aWMgaW50IHBkYzIwMnh4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgZHJpdmUtPmFkZHJlc3NpbmcgPT0gMSkgeworCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpKSB7CiAJCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKIAkJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gaHdpZi0+ZXh0cmFfYmFzZSAtIDE2OwogCQl1bnNpZ25lZCBsb25nIGF0YXBpX3JlZwk9IGhpZ2hfMTYgKyAoaHdpZi0+Y2hhbm5lbCA/IDB4MjQgOiAweDIwKTsKQEAgLTIwMSw3ICsyMDAsNyBAQAogCX0KIAlpZiAoZHJpdmUtPmN1cnJlbnRfc3BlZWQgPiBYRkVSX1VETUFfMikKIAkJcGRjX29sZF9kaXNhYmxlXzY2TUh6X2Nsb2NrKGRyaXZlLT5od2lmKTsKLQlyZXR1cm4gX19pZGVfZG1hX2VuZChkcml2ZSk7CisJcmV0dXJuIGlkZV9kbWFfZW5kKGRyaXZlKTsKIH0KIAogc3RhdGljIGludCBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQpAQCAtMjY1LDcgKzI2NCw3IEBACiAJaWRlX2RtYV90aW1lb3V0KGRyaXZlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3BkYzIwMnh4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9wZGMyMDJ4eChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZG1hYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDQpOwogCXU4IHVkbWFfc3BlZWRfZmxhZyA9IDAsIHByaW1hcnlfbW9kZSA9IDAsIHNlY29uZGFyeV9tb2RlID0gMDsKQEAgLTMzNCw3ICszMzMsNyBAQAogCS5kbWFfc2V0dXAJCT0gaWRlX2RtYV9zZXR1cCwKIAkuZG1hX2V4ZWNfY21kCQk9IGlkZV9kbWFfZXhlY19jbWQsCiAJLmRtYV9zdGFydAkJPSBpZGVfZG1hX3N0YXJ0LAotCS5kbWFfZW5kCQk9IF9faWRlX2RtYV9lbmQsCisJLmRtYV9lbmQJCT0gaWRlX2RtYV9lbmQsCiAJLmRtYV90ZXN0X2lycQkJPSBwZGMyMDJ4eF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBwZGMyMDJ4eF9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IHBkYzIwMnh4X2RtYV90aW1lb3V0LApAQCAtNDI3LDIxICs0MjYsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGRjMjAyeHhfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGRjMjAyeHhfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiUHJvbWlzZV9PbGRfSURFIiwKIAkuaWRfdGFibGUJPSBwZGMyMDJ4eF9wY2lfdGJsLAogCS5wcm9iZQkJPSBwZGMyMDJ4eF9pbml0X29uZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwZGMyMDJ4eF9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnBkYzIwMnh4X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGRjMjAyeHhfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwZGMyMDJ4eF9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQocGRjMjAyeHhfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3BpaXguYyBiL2RyaXZlcnMvaWRlL3BjaS9waWl4LmMKaW5kZXggMzBjZmM4MS4uZDYzZjlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3BpaXguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKQEAgLTIwNSw3ICsyMDQsNyBAQAogICoJb3V0IHRvIGJlIG5pY2UgYW5kIHNpbXBsZS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfaWNoKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9pY2goc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MzIgZXh0cmEgPSAwOwogCkBAIC0yMTYsMTcgKzIxNSwyNiBAQAogfQogCiAvKioKLSAqCXBpaXhfZG1hX2NsZWFyX2lycQktCWNsZWFyIEJNRE1BIHN0YXR1cwotICoJQGRyaXZlOiBJREUgZHJpdmUgdG8gY2xlYXIKKyAqCWljaF9jbGVhcl9pcnEJLQljbGVhciBCTURNQSBzdGF0dXMKKyAqCUBkcml2ZTogSURFIGRyaXZlCiAgKgotICoJQ2FsbGVkIGZyb20gaWRlX2ludHIoKSBmb3IgUElPIGludGVycnVwdHMKLSAqCXRvIGNsZWFyIEJNRE1BIHN0YXR1cyBhcyBuZWVkZWQgYnkgSUNIeAorICoJSUNIeCBjb250b2xsZXJzIHNldCBETUEgSU5UUiBubyBtYXR0ZXIgRE1BIG9yIFBJTy4KKyAqCUJNRE1BIHN0YXR1cyBtaWdodCBuZWVkIHRvIGJlIGNsZWFyZWQgZXZlbiBmb3IKKyAqCVBJTyBpbnRlcnJ1cHRzIHRvIHByZXZlbnQgc3B1cmlvdXMvbG9zdCBJUlEuCiAgKi8KLXN0YXRpYyB2b2lkIHBpaXhfZG1hX2NsZWFyX2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCitzdGF0aWMgdm9pZCBpY2hfY2xlYXJfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CiAJdTggZG1hX3N0YXQ7CiAKKwkvKgorCSAqIGlkZV9kbWFfZW5kKCkgbmVlZHMgQk1ETUEgc3RhdHVzIGZvciBlcnJvciBjaGVja2luZy4KKwkgKiBTbywgc2tpcCBjbGVhcmluZyBCTURNQSBzdGF0dXMgaGVyZSBhbmQgbGVhdmUgaXQKKwkgKiB0byBpZGVfZG1hX2VuZCgpIGlmIHRoaXMgaXMgRE1BIGludGVycnVwdC4KKwkgKi8KKwlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSB8fCBod2lmLT5kbWFfYmFzZSA9PSAwKQorCQlyZXR1cm47CisKIAkvKiBjbGVhciB0aGUgSU5UUiAmIEVSUk9SIGJpdHMgKi8KIAlkbWFfc3RhdCA9IGluYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIAkvKiBTaG91bGQgd2UgZm9yY2UgdGhlIGJpdCBhcyB3ZWxsID8gKi8KQEAgLTI1MCw2ICsyNTgsNyBAQAogCXsgMHgyN0RGLCAweDEwMjUsIDB4MDExMCB9LAkvKiBJQ0g3IG9uIEFjZXIgMzY4MldMTWkgKi8KIAl7IDB4MjdERiwgMHgxMDQzLCAweDEyNjcgfSwJLyogSUNINyBvbiBBc3VzIFc1RiAqLwogCXsgMHgyN0RGLCAweDEwM0MsIDB4MzBBMSB9LAkvKiBJQ0g3IG9uIEhQIENvbXBhcSBuYzI0MDAgKi8KKwl7IDB4MjdERiwgMHgxMDcxLCAweEQyMjEgfSwJLyogSUNINyBvbiBIZXJjdWxlcyBFQy05MDAgKi8KIAl7IDB4MjRDQSwgMHgxMDI1LCAweDAwNjEgfSwJLyogSUNINCBvbiBBY2VyIEFzcGlyZSAyMDIzV0xNaSAqLwogCXsgMHgyNjUzLCAweDEwNDMsIDB4ODJEOCB9LAkvKiBJQ0g2TSBvbiBBc3VzIEVlZSA3MDEgKi8KIAkvKiBlbmQgbWFya2VyICovCkBAIC0yOTQsMjEgKzMwMywxOSBAQAogCQlod2lmLT51bHRyYV9tYXNrID0gaHdpZi0+bXdkbWFfbWFzayA9IGh3aWYtPnN3ZG1hX21hc2sgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2ljaChpZGVfaHdpZl90ICpod2lmKQotewotCWluaXRfaHdpZl9waWl4KGh3aWYpOwotCi0JLyogSUNIeCBuZWVkIHRvIGNsZWFyIHRoZSBCTURNQSBzdGF0dXMgZm9yIGFsbCBpbnRlcnJ1cHRzICovCi0JaWYgKGh3aWYtPmRtYV9iYXNlKQotCQlod2lmLT5pZGVfZG1hX2NsZWFyX2lycSA9ICZwaWl4X2RtYV9jbGVhcl9pcnE7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHBpaXhfcG9ydF9vcHMgPSB7CiAJLnNldF9waW9fbW9kZQkJPSBwaWl4X3NldF9waW9fbW9kZSwKIAkuc2V0X2RtYV9tb2RlCQk9IHBpaXhfc2V0X2RtYV9tb2RlLAogCS5jYWJsZV9kZXRlY3QJCT0gcGlpeF9jYWJsZV9kZXRlY3QsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyBpY2hfcG9ydF9vcHMgPSB7CisJLnNldF9waW9fbW9kZQkJPSBwaWl4X3NldF9waW9fbW9kZSwKKwkuc2V0X2RtYV9tb2RlCQk9IHBpaXhfc2V0X2RtYV9tb2RlLAorCS5jbGVhcl9pcnEJCT0gaWNoX2NsZWFyX2lycSwKKwkuY2FibGVfZGV0ZWN0CQk9IHBpaXhfY2FibGVfZGV0ZWN0LAorfTsKKwogI2lmbmRlZiBDT05GSUdfSUE2NAogICNkZWZpbmUgSURFX0hGTEFHU19QSUlYIElERV9IRkxBR19MRUdBQ1lfSVJRUwogI2Vsc2UKQEAgLTMzMiw5ICszMzksOSBAQAogCXsgXAogCQkubmFtZQkJPSBEUlZfTkFNRSwgXAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2ljaCwgXAotCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2ljaCwgXAorCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX3BpaXgsIFwKIAkJLmVuYWJsZWJpdHMJPSB7ezB4NDEsMHg4MCwweDgwfSwgezB4NDMsMHg4MCwweDgwfX0sIFwKLQkJLnBvcnRfb3BzCT0gJnBpaXhfcG9ydF9vcHMsIFwKKwkJLnBvcnRfb3BzCT0gJmljaF9wb3J0X29wcywgXAogCQkuaG9zdF9mbGFncwk9IElERV9IRkxBR1NfUElJWCwgXAogCQkucGlvX21hc2sJPSBBVEFfUElPNCwgXAogCQkuc3dkbWFfbWFzawk9IEFUQV9TV0RNQTJfT05MWSwgXApAQCAtNDQ1LDIyICs0NTIsMjQgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGlpeF9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwaWl4X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlBJSVhfSURFIiwKIAkuaWRfdGFibGUJPSBwaWl4X3BjaV90YmwsCiAJLnByb2JlCQk9IHBpaXhfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcGlpeF9pZGVfaW5pdCh2b2lkKQogewogCXBpaXhfY2hlY2tfNDUwbngoKTsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZwaWl4X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGlpeF9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBpaXhfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHBpaXhfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3J6MTAwMC5jIGIvZHJpdmVycy9pZGUvcGNpL3J6MTAwMC5jCmluZGV4IDhkMTFlZTguLjdkYWYwMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9yejEwMDAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvcnoxMDAwLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjAsNyArNTksNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCByejEwMDBfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnoxMDAwX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlJaMTAwMF9JREUiLAogCS5pZF90YWJsZQk9IHJ6MTAwMF9wY2lfdGJsLAogCS5wcm9iZQkJPSByejEwMDBfaW5pdF9vbmUsCkBAIC02OSwxMiArNjgsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgcnoxMDAwX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnoxMDAwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcnoxMDAwX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnoxMDAwX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChyejEwMDBfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jIGIvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jCmluZGV4IDhlZmFlZDEuLmYxYTg3NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zYzEyMDAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgpAQCAtMTA0LDE3ICsxMDMsMTkgQEAKIHN0YXRpYyB1OCBzYzEyMDBfdWRtYV9maWx0ZXIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfZHJpdmVfdCAqbWF0ZSA9ICZod2lmLT5kcml2ZXNbKGRyaXZlLT5kbiAmIDEpIF4gMV07Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKm1hdGVpZCA9IG1hdGUtPmlkOworCWlkZV9kcml2ZV90ICptYXRlID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CisJdTE2ICptYXRlaWQgPSBtYXRlLT5pZDsKIAl1OCBtYXNrID0gaHdpZi0+dWx0cmFfbWFzazsKIAotCWlmIChtYXRlLT5wcmVzZW50ID09IDApCisJaWYgKG1hdGUgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKG1hdGVpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIF9faWRlX2RtYV9iYWRfZHJpdmUobWF0ZSkgPT0gMCkgewotCQlpZiAoKG1hdGVpZC0+ZmllbGRfdmFsaWQgJiA0KSAmJiAobWF0ZWlkLT5kbWFfdWx0cmEgJiA3KSkKKwlpZiAoYXRhX2lkX2hhc19kbWEobWF0ZWlkKSAmJiBfX2lkZV9kbWFfYmFkX2RyaXZlKG1hdGUpID09IDApIHsKKwkJaWYgKChtYXRlaWRbQVRBX0lEX0ZJRUxEX1ZBTElEXSAmIDQpICYmCisJCSAgICAobWF0ZWlkW0FUQV9JRF9VRE1BX01PREVTXSAmIDcpKQogCQkJZ290byBvdXQ7Ci0JCWlmICgobWF0ZWlkLT5maWVsZF92YWxpZCAmIDIpICYmIChtYXRlaWQtPmRtYV9td29yZCAmIDcpKQorCQlpZiAoKG1hdGVpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgJiYKKwkJICAgIChtYXRlaWRbQVRBX0lEX01XRE1BX01PREVTXSAmIDcpKQogCQkJbWFzayA9IDA7CiAJfQogb3V0OgpAQCAtMTI1LDcgKzEyNiw2IEBACiB7CiAJaWRlX2h3aWZfdAkJKmh3aWYgPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3QgcGNpX2RldgkJKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKLQlpbnQJCQl1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CiAJdW5zaWduZWQgaW50CQlyZWcsIHRpbWluZ3M7CiAJdW5zaWduZWQgc2hvcnQJCXBjaV9jbG9jazsKIAl1bnNpZ25lZCBpbnQJCWJhc2VyZWcgPSBod2lmLT5jaGFubmVsID8gMHg1MCA6IDB4NDA7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAllbHNlCiAJCXRpbWluZ3MgPSBtd2RtYV90aW1pbmdbcGNpX2Nsb2NrXVttb2RlIC0gWEZFUl9NV19ETUFfMF07CiAKLQlpZiAodW5pdCA9PSAwKSB7CQkJLyogYXJlIHdlIGNvbmZpZ3VyaW5nIGRyaXZlMD8gKi8KKwlpZiAoKGRyaXZlLT5kbiAmIDEpID09IDApIHsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgYmFzZXJlZyArIDQsICZyZWcpOwogCQl0aW1pbmdzIHw9IHJlZyAmIDB4ODAwMDAwMDA7CS8qIHByZXNlcnZlIFBJTyBmb3JtYXQgYml0ICovCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBiYXNlcmVnICsgNCwgdGltaW5ncyk7CkBAIC0yMTUsNyArMjE1LDggQEAKIAlpZiAobW9kZSAhPSAtMSkgewogCQlwcmludGsoIlNDMTIwMDogJXM6IGNoYW5naW5nIChVKURNQSBtb2RlXG4iLCBkcml2ZS0+bmFtZSk7CiAJCWlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOwotCQlpZiAoaWRlX3NldF9kbWFfbW9kZShkcml2ZSwgbW9kZSkgPT0gMCAmJiBkcml2ZS0+dXNpbmdfZG1hKQorCQlpZiAoaWRlX3NldF9kbWFfbW9kZShkcml2ZSwgbW9kZSkgPT0gMCAmJgorCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKSkKIAkJCWh3aWYtPmRtYV9vcHMtPmRtYV9ob3N0X3NldChkcml2ZSwgMSk7CiAJCXJldHVybjsKIAl9CkBAIC0zMjcsNyArMzI4LDcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2MxMjAwX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNjMTIwMF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJTQzEyMDBfSURFIiwKIAkuaWRfdGFibGUJPSBzYzEyMDBfcGNpX3RibCwKIAkucHJvYmUJCT0gc2MxMjAwX2luaXRfb25lLApAQCAtMzQwLDEyICszNDEsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2MxMjAwX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2MxMjAwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2MxMjAwX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2MxMjAwX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChzYzEyMDBfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NjY19wYXRhLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2NjX3BhdGEuYwppbmRleCA0NGNjY2QxLi45Y2UxZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2NjX3BhdGEuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2NjX3BhdGEuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKQEAgLTI5Miw3ICsyOTEsNyBAQAogc3RhdGljIHZvaWQgc2NjX2RtYV9ob3N0X3NldChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBvbikKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggdW5pdCA9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwogCXU4IGRtYV9zdGF0ID0gc2NjX2lkZV9pbmIoaHdpZi0+ZG1hX2Jhc2UgKyA0KTsKIAogCWlmIChvbikKQEAgLTM1NCw3ICszNTMsNiBAQAogCiAJLyogc3RhcnQgRE1BICovCiAJc2NjX2lkZV9vdXRiKGRtYV9jbWQgfCAxLCBod2lmLT5kbWFfYmFzZSk7Ci0JaHdpZi0+ZG1hID0gMTsKIAl3bWIoKTsKIH0KIApAQCAtMzc1LDcgKzM3Myw2IEBACiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwogCS8qIHZlcmlmeSBnb29kIERNQSBzdGF0dXMgKi8KLQlod2lmLT5kbWEgPSAwOwogCXdtYigpOwogCXJldHVybiAoZG1hX3N0YXQgJiA3KSAhPSA0ID8gKDB4MTAgfCBkbWFfc3RhdCkgOiAwOwogfQpAQCAtNDAwLDcgKzM5Nyw3IEBACiAJLyogZXJyYXRhIEEzMDggd29ya2Fyb3VuZDogU3RlcDUgKGNoZWNrIGRhdGEgbG9zcykgKi8KIAkvKiBXZSBkb24ndCBjaGVjayBub24gaWRlX2Rpc2sgYmVjYXVzZSBpdCBpcyBsaW1pdGVkIHRvIFVETUE0ICovCiAJaWYgKCEoaW5fYmUzMigodm9pZCBfX2lvbWVtICopaHdpZi0+aW9fcG9ydHMuY3RsX2FkZHIpCi0JICAgICAgJiBFUlJfU1RBVCkgJiYKKwkgICAgICAmIEFUQV9FUlIpICYmCiAJICAgIGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzayAmJiBkcml2ZS0+Y3VycmVudF9zcGVlZCA+IFhGRVJfVURNQV80KSB7CiAJCXJlZyA9IGluX2JlMzIoKHZvaWQgX19pb21lbSAqKWludHN0c19wb3J0KTsKIAkJaWYgKCEocmVnICYgSU5UU1RTX0FDVEVJTlQpKSB7CkBAIC01MDQsNyArNTAxLDcgQEAKIAogCS8qIFNDQyBlcnJhdGEgQTI1MixBMzA4IHdvcmthcm91bmQ6IFN0ZXA0ICovCiAJaWYgKChpbl9iZTMyKCh2b2lkIF9faW9tZW0gKilod2lmLT5pb19wb3J0cy5jdGxfYWRkcikKLQkgICAgICYgRVJSX1NUQVQpICYmCisJICAgICAmIEFUQV9FUlIpICYmCiAJICAgIChpbnRfc3RhdCAmIElOVFNUU19JTlRSUSkpCiAJCXJldHVybiAxOwogCkBAIC01MTIsOSArNTA5LDYgQEAKIAlpZiAoaW50X3N0YXQgJiBJTlRTVFNfSU9JUlFTKQogCQlyZXR1cm4gMTsKIAotCWlmICghZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICglcykgY2FsbGVkIHdoaWxlIG5vdCB3YWl0aW5nXG4iLAotCQkJZHJpdmUtPm5hbWUsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzExLDcgKzcwNSw3IEBACiAJCXNjY19pZGVfb3V0Yih0Zi0+bGJhaCwgaW9fcG9ydHMtPmxiYWhfYWRkcik7CiAKIAlpZiAodGFzay0+dGZfZmxhZ3MgJiBJREVfVEZMQUdfT1VUX0RFVklDRSkKLQkJc2NjX2lkZV9vdXRiKCh0Zi0+ZGV2aWNlICYgSElISSkgfCBkcml2ZS0+c2VsZWN0LmFsbCwKKwkJc2NjX2lkZV9vdXRiKCh0Zi0+ZGV2aWNlICYgSElISSkgfCBkcml2ZS0+c2VsZWN0LAogCQkJICAgICBpb19wb3J0cy0+ZGV2aWNlX2FkZHIpOwogfQogCkBAIC04MjcsNiArODIxLDEyIEBACiAJaW5pdF9tbWlvX2lvcHNfc2NjKGh3aWYpOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY2NfaW5pdF9kbWEoaWRlX2h3aWZfdCAqaHdpZiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkKQoreworCXJldHVybiBpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKTsKK30KKwogc3RhdGljIHU4IHNjY19jYWJsZV9kZXRlY3QoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CkBAIC04OTEsNiArODkxLDcgQEAKICAgewkJCQkJCQlcCiAgICAgICAubmFtZQkJPSBuYW1lX3N0ciwJCQlcCiAgICAgICAuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX3NjYywJCVwKKyAgICAgIC5pbml0X2RtYQkJPSBzY2NfaW5pdF9kbWEsCQkJXAogICAgICAgLmluaXRfaHdpZgk9IGluaXRfaHdpZl9zY2MsCQlcCiAgICAgICAudHBfb3BzCQk9ICZzY2NfdHBfb3BzLAkJXAogICAgICAgLnBvcnRfb3BzCQk9ICZzY2NfcG9ydF9vcHMsCQlcCkBAIC05MjgsMTMgKzkyOSw2IEBACiB7CiAJc3RydWN0IHNjY19wb3J0cyAqcG9ydHMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QgPSBwb3J0cy0+aG9zdDsKLQlpZGVfaHdpZl90ICpod2lmID0gaG9zdC0+cG9ydHNbMF07Ci0KLQlpZiAoaHdpZi0+ZG1hdGFibGVfY3B1KSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBQUkRfRU5UUklFUyAqIFBSRF9CWVRFUywKLQkJCQkgICAgaHdpZi0+ZG1hdGFibGVfY3B1LCBod2lmLT5kbWF0YWJsZV9kbWEpOwotCQlod2lmLT5kbWF0YWJsZV9jcHUgPSBOVUxMOwotCX0KIAogCWlkZV9ob3N0X3JlbW92ZShob3N0KTsKIApAQCAtOTUwLDcgKzk0NCw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNjY19wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzY2NfcGNpX2RyaXZlciA9IHsKIAkubmFtZSA9ICJTQ0MgSURFIiwKIAkuaWRfdGFibGUgPSBzY2NfcGNpX3RibCwKIAkucHJvYmUgPSBzY2NfaW5pdF9vbmUsCkBAIC05NTksMTQgKzk1MywxNCBAQAogCiBzdGF0aWMgaW50IHNjY19pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnNjY19wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc2NjX2lkZV9pbml0KTsKIC8qIC0tIE5vIGV4aXQgY29kZT8KIHN0YXRpYyB2b2lkIHNjY19pZGVfZXhpdCh2b2lkKQogewotCWlkZV9wY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJaWRlX3BjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2NjX3BjaV9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQoc2NjX2lkZV9leGl0KTsKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NlcnZlcndvcmtzLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwppbmRleCBjM2JkYzZlLi40MzdiYzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC01Nyw4ICs1NiwxMCBAQAogCiBzdGF0aWMgaW50IGNoZWNrX2luX2RyaXZlX2xpc3RzIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKipsaXN0KQogeworCWNoYXIgKm0gPSAoY2hhciAqKSZkcml2ZS0+aWRbQVRBX0lEX1BST0RdOworCiAJd2hpbGUgKCpsaXN0KQotCQlpZiAoIXN0cmNtcCgqbGlzdCsrLCBkcml2ZS0+aWQtPm1vZGVsKSkKKwkJaWYgKCFzdHJjbXAoKmxpc3QrKywgbSkpCiAJCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1Miw3ICsxNTMsNyBAQAogCiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0JdTggdW5pdAkJCT0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CisJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIAogCXU4IHVsdHJhX2VuYWJsZQkgPSAwLCB1bHRyYV90aW1pbmcgPSAwLCBkbWFfdGltaW5nID0gMDsKIApAQCAtMTc0LDcgKzE3NSw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgdWx0cmFfZW5hYmxlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3N2d2tzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9zdndrcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGludCByZWc7CiAJdTggYnRyOwpAQCAtNDQyLDIxICs0NDMsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc3Z3a3NfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3Z3a3NfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiU2VydmVyd29ya3NfSURFIiwKIAkuaWRfdGFibGUJPSBzdndrc19wY2lfdGJsLAogCS5wcm9iZQkJPSBzdndrc19pbml0X29uZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzdndrc19pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnN2d2tzX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3Z3a3NfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdndrc19wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3Z3a3NfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYyBiL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKaW5kZXggNjgxMzA2Yy4uZGQ2MzQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMjIsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTE1MSw3ICsxNTEsNyBAQAogCQlpbnQgY291bnQgPSAwOwogCiAJCXN0YXQgPSBzZ2lpb2M0X3JlYWRfc3RhdHVzKGh3aWYpOwotCQl3aGlsZSAoKHN0YXQgJiAweDgwKSAmJiAoY291bnQrKyA8IDEwMCkpIHsKKwkJd2hpbGUgKChzdGF0ICYgQVRBX0JVU1kpICYmIChjb3VudCsrIDwgMTAwKSkgewogCQkJdWRlbGF5KDEpOwogCQkJc3RhdCA9IHNnaWlvYzRfcmVhZF9zdGF0dXMoaHdpZik7CiAJCX0KQEAgLTMxMSw3ICszMTEsNyBAQAogCXU4IHJlZyA9ICh1OCkgcmVhZGIoKHZvaWQgX19pb21lbSAqKSBwb3J0KTsKIAogCWlmICgocG9ydCAmIDB4RkZGKSA9PSAweDExQykgewkvKiBTdGF0dXMgcmVnaXN0ZXIgb2YgSU9DNCAqLwotCQlpZiAocmVnICYgMHg1MSkgewkvKiBOb3QgYnVzeS4uLmNoZWNrIGZvciBpbnRlcnJ1cHQgKi8KKwkJaWYgKCEocmVnICYgQVRBX0JVU1kpKSB7IC8qIE5vdCBidXN5Li4uIGNoZWNrIGZvciBpbnRlcnJ1cHQgKi8KIAkJCXVuc2lnbmVkIGxvbmcgb3RoZXJfaXIgPSBwb3J0IC0gMHgxMTA7CiAJCQl1bnNpZ25lZCBpbnQgaW50cl9yZWcgPSAodTMyKSByZWFkbCgodm9pZCBfX2lvbWVtICopIG90aGVyX2lyKTsKIApAQCAtMzM5LDM2ICszMzksMzIgQEAKIAlpZiAoZG1hX2Jhc2UgPT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJNLURNQSBhdCAweCUwNGx4LTB4JTA0bHhcbiIsIGh3aWYtPm5hbWUsCi0JICAgICAgIGRtYV9iYXNlLCBkbWFfYmFzZSArIG51bV9wb3J0cyAtIDEpOworCXByaW50ayhLRVJOX0lORk8gIiAgICAlczogTU1JTy1ETUFcbiIsIGh3aWYtPm5hbWUpOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZG1hX2Jhc2UsIG51bV9wb3J0cywgaHdpZi0+bmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXMoJXMpIC0tIEVSUk9SLCBBZGRyZXNzZXMgMHglcCB0byAweCVwICIKLQkJICAgICAgICJBTFJFQURZIGluIHVzZVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBod2lmLT5uYW1lLCAodm9pZCAqKSBkbWFfYmFzZSwKLQkJICAgICAgICh2b2lkICopIGRtYV9iYXNlICsgbnVtX3BvcnRzIC0gMSk7CisJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihkbWFfYmFzZSwgbnVtX3BvcnRzLCBod2lmLT5uYW1lKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMoJXMpIC0tIEVSUk9SOiBhZGRyZXNzZXMgMHglMDhseCB0byAweCUwOGx4ICIKKwkJICAgICAgICJhbHJlYWR5IGluIHVzZVxuIiwgX19mdW5jX18sIGh3aWYtPm5hbWUsCisJCSAgICAgICBkbWFfYmFzZSwgZG1hX2Jhc2UgKyBudW1fcG9ydHMgLSAxKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCXZpcnRfZG1hX2Jhc2UgPSBpb3JlbWFwKGRtYV9iYXNlLCBudW1fcG9ydHMpOwogCWlmICh2aXJ0X2RtYV9iYXNlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXMoJXMpIC0tIEVSUk9SLCBVbmFibGUgdG8gbWFwIGFkZHJlc3NlcyAweCVseCB0byAweCVseFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBod2lmLT5uYW1lLCBkbWFfYmFzZSwgZG1hX2Jhc2UgKyBudW1fcG9ydHMgLSAxKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyglcykgLS0gRVJST1I6IHVuYWJsZSB0byBtYXAgYWRkcmVzc2VzICIKKwkJICAgICAgICIweCVseCB0byAweCVseFxuIiwgX19mdW5jX18sIGh3aWYtPm5hbWUsCisJCSAgICAgICBkbWFfYmFzZSwgZG1hX2Jhc2UgKyBudW1fcG9ydHMgLSAxKTsKIAkJZ290byBkbWFfcmVtYXBfZmFpbHVyZTsKIAl9CiAJaHdpZi0+ZG1hX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdmlydF9kbWFfYmFzZTsKIAotCWh3aWYtPmRtYXRhYmxlX2NwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwKLQkJCQkJICBJT0M0X1BSRF9FTlRSSUVTICogSU9DNF9QUkRfQllURVMsCi0JCQkJCSAgJmh3aWYtPmRtYXRhYmxlX2RtYSk7Ci0KLQlpZiAoIWh3aWYtPmRtYXRhYmxlX2NwdSkKLQkJZ290byBkbWFfcGNpX2FsbG9jX2ZhaWx1cmU7Ci0KIAlod2lmLT5zZ19tYXhfbmVudHMgPSBJT0M0X1BSRF9FTlRSSUVTOwogCisJaHdpZi0+cHJkX21heF9uZW50cyA9IElPQzRfUFJEX0VOVFJJRVM7CisJaHdpZi0+cHJkX2VudF9zaXplID0gSU9DNF9QUkRfQllURVM7CisKKwlpZiAoaWRlX2FsbG9jYXRlX2RtYV9lbmdpbmUoaHdpZikpCisJCWdvdG8gZG1hX3BjaV9hbGxvY19mYWlsdXJlOworCiAJcGFkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCBJT0M0X0lERV9DQUNIRUxJTkVfU0laRSwKIAkJCQkgICAoZG1hX2FkZHJfdCAqKSZod2lmLT5leHRyYV9iYXNlKTsKIAlpZiAocGFkKSB7CkBAIC0zNzYsMTMgKzM3MiwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldiwgSU9DNF9QUkRfRU5UUklFUyAqIElPQzRfUFJEX0JZVEVTLAotCQkJICAgIGh3aWYtPmRtYXRhYmxlX2NwdSwgaHdpZi0+ZG1hdGFibGVfZG1hKTsKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICIlcygpIC0tIEVycm9yISBVbmFibGUgdG8gYWxsb2NhdGUgRE1BIE1hcHMgZm9yIGRyaXZlICVzXG4iLAorCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzKCVzKSAtLSBFUlJPUjogVW5hYmxlIHRvIGFsbG9jYXRlIERNQSBtYXBzXG4iLAogCSAgICAgICBfX2Z1bmNfXywgaHdpZi0+bmFtZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiQ2hhbmdpbmcgZnJvbSBETUEgdG8gUElPIG1vZGUgZm9yIERyaXZlICVzXG4iLCBod2lmLT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2hhbmdpbmcgZnJvbSBETUEgdG8gUElPIG1vZGUiLCBod2lmLT5uYW1lKTsKIAogZG1hX3BjaV9hbGxvY19mYWlsdXJlOgogCWlvdW5tYXAodmlydF9kbWFfYmFzZSk7CkBAIC02MTgsMTQgKzYxMiwxMiBAQAogCWlycXBvcnQgPSAodW5zaWduZWQgbG9uZykgdmlydF9iYXNlICsgSU9DNF9JTlRSX09GRlNFVDsKIAogCWNtZF9waHlzX2Jhc2UgPSBiYXIwICsgSU9DNF9DTURfT0ZGU0VUOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGNtZF9waHlzX2Jhc2UsIElPQzRfQ01EX0NUTF9CTEtfU0laRSwKLQkgICAgRFJWX05BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIiVzICVzOiAtLSBFUlJPUiwgQWRkcmVzc2VzICIKLQkJCSIweCVwIHRvIDB4JXAgQUxSRUFEWSBpbiB1c2VcbiIsCi0JCSAgICAgICBEUlZfTkFNRSwgcGNpX25hbWUoZGV2KSwgKHZvaWQgKiljbWRfcGh5c19iYXNlLAotCQkgICAgICAgKHZvaWQgKikgY21kX3BoeXNfYmFzZSArIElPQzRfQ01EX0NUTF9CTEtfU0laRSk7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oY21kX3BoeXNfYmFzZSwgSU9DNF9DTURfQ1RMX0JMS19TSVpFLAorCQkJICAgICAgIERSVl9OQU1FKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgJXMgLS0gRVJST1I6IGFkZHJlc3NlcyAweCUwOGx4IHRvIDB4JTA4bHggIgorCQkgICAgICAgImFscmVhZHkgaW4gdXNlXG4iLCBEUlZfTkFNRSwgcGNpX25hbWUoZGV2KSwKKwkJICAgICAgIGNtZF9waHlzX2Jhc2UsIGNtZF9waHlzX2Jhc2UgKyBJT0M0X0NNRF9DVExfQkxLX1NJWkUpOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIElPIHJlZ2lzdGVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NpaW1hZ2UuYyBiL2RyaXZlcnMvaWRlL3BjaS9zaWltYWdlLmMKaW5kZXggZGIyYjg4YS4uZWI0ZmFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NpaW1hZ2UuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2lpbWFnZS5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTE3LDEzICsxMTYsMTQgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpaHdpZi0+aHdpZl9kYXRhOworCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CiAKIAliYXNlICs9IDB4QTAgKyByOwogCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCiAJCWJhc2UgKz0gaHdpZi0+Y2hhbm5lbCA8PCA2OwogCWVsc2UKIAkJYmFzZSArPSBod2lmLT5jaGFubmVsIDw8IDQ7Ci0JYmFzZSB8PSBkcml2ZS0+c2VsZWN0LmIudW5pdCA8PCBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwliYXNlIHw9IHVuaXQgPDwgdW5pdDsKIAlyZXR1cm4gYmFzZTsKIH0KIApAQCAtMjIzLDcgKzIyMyw5IEBACiAKIHN0YXRpYyB1OCBzaWxfc2F0YV91ZG1hX2ZpbHRlcihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JcmV0dXJuIHN0cnN0cihkcml2ZS0+aWQtPm1vZGVsLCAiTWF4dG9yIikgPyBBVEFfVURNQTUgOiBBVEFfVURNQTY7CisJY2hhciAqbSA9IChjaGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF07CisKKwlyZXR1cm4gc3Ryc3RyKG0sICJNYXh0b3IiKSA/IEFUQV9VRE1BNSA6IEFUQV9VRE1BNjsKIH0KIAogLyoqCkBAIC0yNDMsNyArMjQ1LDcgQEAKIAogCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwotCWlkZV9kcml2ZV90ICpwYWlyCT0gaWRlX2dldF9wYWlyZWRfZHJpdmUoZHJpdmUpOworCWlkZV9kcml2ZV90ICpwYWlyCT0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJdTMyIHNwZWVkdAkJPSAwOwogCXUxNiBzcGVlZHAJCT0gMDsKIAl1bnNpZ25lZCBsb25nIGFkZHIJPSBzaWltYWdlX3NlbGRldihkcml2ZSwgMHgwNCk7CkBAIC0yNTQsMTAgKzI1NiwxMCBAQAogCXU4IGFkZHJfbWFzawkJPSBod2lmLT5jaGFubmVsID8gKG1taW8gPyAweEY0IDogMHg4NCkKIAkJCQkJCTogKG1taW8gPyAweEI0IDogMHg4MCk7CiAJdTggbW9kZQkJCT0gMDsKLQl1OCB1bml0CQkJPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwl1OCB1bml0CQkJPSBkcml2ZS0+ZG4gJiAxOwogCiAJLyogdHJpbSAqdGFza2ZpbGUqIFBJTyB0byB0aGUgc2xvd2VzdCBvZiB0aGUgbWFzdGVyL3NsYXZlICovCi0JaWYgKHBhaXItPnByZXNlbnQpIHsKKwlpZiAocGFpcikgewogCQl1OCBwYWlyX3BpbyA9IGlkZV9nZXRfYmVzdF9waW9fbW9kZShwYWlyLCAyNTUsIDQpOwogCiAJCWlmIChwYWlyX3BpbyA8IHRmX3BpbykKQEAgLTMwMCw5ICszMDIsOSBAQAogCiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0JdTE2IHVsdHJhID0gMCwgbXVsdGkJPSAwOwotCXU4IG1vZGUgPSAwLCB1bml0CT0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpaHdpZi0+aHdpZl9kYXRhOworCXUxNiB1bHRyYSA9IDAsIG11bHRpCT0gMDsKKwl1OCBtb2RlID0gMCwgdW5pdAk9IGRyaXZlLT5kbiAmIDE7CiAJdTggbW1pbwkJCT0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKIAl1OCBzY3NjID0gMCwgYWRkcl9tYXNrCT0gaHdpZi0+Y2hhbm5lbCA/IChtbWlvID8gMHhGNCA6IDB4ODQpCiAJCQkJCQk6IChtbWlvID8gMHhCNCA6IDB4ODApOwpAQCAtNDYyLDcgKzQ2NCw3IEBACiAgKgl0byAxMzMgTUh6IGNsb2NraW5nIGlmIHRoZSBzeXN0ZW0gaXNuJ3QgYWxyZWFkeSBzZXQgdXAgdG8gZG8gaXQuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3NpaW1hZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X3NpaW1hZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhvc3QtPmhvc3RfcHJpdjsKQEAgLTYxNiw4ICs2MTgsOCBAQAogCiBzdGF0aWMgaW50IGlzX2Rldl9zZWFnYXRlX3NhdGEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWNvbnN0IGNoYXIgKnMJPSAmZHJpdmUtPmlkLT5tb2RlbFswXTsKLQl1bnNpZ25lZCBsZW4JPSBzdHJubGVuKHMsIHNpemVvZihkcml2ZS0+aWQtPm1vZGVsKSk7CisJY29uc3QgY2hhciAqcwk9IChjb25zdCBjaGFyICopJmRyaXZlLT5pZFtBVEFfSURfUFJPRF07CisJdW5zaWduZWQgbGVuCT0gc3RybmxlbihzLCBBVEFfSURfUFJPRF9MRU4pOwogCiAJaWYgKChsZW4gPiA0KSAmJiAoIW1lbWNtcChzLCAiU1QiLCAyKSkpCiAJCWlmICgoIW1lbWNtcChzICsgbGVuIC0gMiwgIkFTIiwgMikpIHx8CkBAIC03MTEsNyArNzEzLDcgQEAKIAkuZG1hX3NldHVwCQk9IGlkZV9kbWFfc2V0dXAsCiAJLmRtYV9leGVjX2NtZAkJPSBpZGVfZG1hX2V4ZWNfY21kLAogCS5kbWFfc3RhcnQJCT0gaWRlX2RtYV9zdGFydCwKLQkuZG1hX2VuZAkJPSBfX2lkZV9kbWFfZW5kLAorCS5kbWFfZW5kCQk9IGlkZV9kbWFfZW5kLAogCS5kbWFfdGVzdF9pcnEJCT0gc2lpbWFnZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCkBAIC04MjgsMjEgKzgzMCwyMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzaWltYWdlX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNpaW1hZ2VfcGNpX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiU2lJX0lERSIsCiAJLmlkX3RhYmxlCT0gc2lpbWFnZV9wY2lfdGJsLAogCS5wcm9iZQkJPSBzaWltYWdlX2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2lpbWFnZV9yZW1vdmUpLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaWltYWdlX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2lpbWFnZV9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNpaW1hZ2VfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzaWltYWdlX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChzaWltYWdlX2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9wY2kvc2lzNTUxMy5jCmluZGV4IDVlZmUyMWQuLmFkMzJlMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NpczU1MTMuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CkBAIC00NDgsNyArNDQ3LDcgQEAKIAlyZXR1cm4gY2hpcHNldF9mYW1pbHk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9zaXM1NTEzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9zaXM1NTEzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJLyogTWFrZSBnZW5lcmFsIGNvbmZpZyBvcHMgaGVyZQogCSAgIDEvIHRlbGwgSURFIGNoYW5uZWxzIHRvIG9wZXJhdGUgaW4gQ29tcGF0aWJpbGl0eSBtb2RlIG9ubHkKQEAgLTYwNiwyMSArNjA1LDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNpczU1MTNfcGNpX3RibCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzNTUxM19wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJTSVNfSURFIiwKIAkuaWRfdGFibGUJPSBzaXM1NTEzX3BjaV90YmwsCiAJLnByb2JlCQk9IHNpczU1MTNfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaXM1NTEzX3JlbW92ZSksCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNpczU1MTNfaWRlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTEzX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2lzNTUxM19pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpczU1MTNfcGNpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHNpczU1MTNfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMgYi9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwppbmRleCA3MzkwNWJjLi44NGRjMzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KIApAQCAtNjIsNyArNjEsNyBAQAogCWlmIChjbWRfb2ZmID09IDApCiAJCWNtZF9vZmYgPSAxOwogCi0JaWYgKHBpbyA+IDIgfHwgaWRlX2Rldl9oYXNfaW9yZHkoZHJpdmUtPmlkKSkKKwlpZiAocGlvID4gMiB8fCBhdGFfaWRfaGFzX2lvcmR5KGRyaXZlLT5pZCkpCiAJCWlvcmR5ID0gMHg0MDsKIAogCXJldHVybiAoY21kX29uIC0gMSkgPDwgOCB8IChjbWRfb2ZmIC0gMSkgfCBpb3JkeTsKQEAgLTIwOCw3ICsyMDcsNyBAQAogCiAJREJHKCgiJXMoZHJpdmU6JXMpXG4iLCBfX2Z1bmNfXywgZHJpdmUtPm5hbWUpKTsKIAotCXJldCA9IF9faWRlX2RtYV9lbmQoZHJpdmUpOworCXJldCA9IGlkZV9kbWFfZW5kKGRyaXZlKTsKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHJlZywgZHJpdmUtPmRyaXZlX2RhdGEpOwogCkBAIC0yNzIsNyArMjcxLDcgQEAKICAqIGNoYW5uZWwgMCBoZXJlIGF0IGxlYXN0LCBidXQgY2hhbm5lbCAxIGhhcyB0byBiZSBlbmFibGVkIGJ5CiAgKiBmaXJtd2FyZSBvciBhcmNoIGNvZGUuIFdlIHN0aWxsIHNldCBib3RoIHRvIDE2IGJpdHMgbW9kZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3NsODJjMTA1KHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfY2hpcHNldF9zbDgyYzEwNShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXUzMiB2YWw7CiAKQEAgLTM0NiwyMSArMzQ1LDIzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNsODJjMTA1X3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNsODJjMTA1X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlc4MkMxMDVfSURFIiwKIAkuaWRfdGFibGUJPSBzbDgyYzEwNV9wY2lfdGJsLAogCS5wcm9iZQkJPSBzbDgyYzEwNV9pbml0X29uZSwKIAkucmVtb3ZlCQk9IGlkZV9wY2lfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaWRlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaWRlX3BjaV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzbDgyYzEwNV9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnNsODJjMTA1X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2w4MmMxMDVfaWRlX2V4aXQodm9pZCkKIHsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzbDgyYzEwNV9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc2w4MmMxMDVfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NsYzkwZTY2LmMgYi9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYwppbmRleCA4NjZkNmM2Li4wZjc1OWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC0xNTUsMjEgKzE1NCwyMyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbGM5MGU2Nl9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzbGM5MGU2Nl9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJTTEM5MGU2Nl9JREUiLAogCS5pZF90YWJsZQk9IHNsYzkwZTY2X3BjaV90YmwsCiAJLnByb2JlCQk9IHNsYzkwZTY2X2luaXRfb25lLAogCS5yZW1vdmUJCT0gaWRlX3BjaV9yZW1vdmUsCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNsYzkwZTY2X2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2xjOTBlNjZfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbGM5MGU2Nl9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNsYzkwZTY2X3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChzbGM5MGU2Nl9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdGM4NmMwMDEuYyBiL2RyaXZlcnMvaWRlL3BjaS90Yzg2YzAwMS5jCmluZGV4IDkyNzI3N2MuLjkzZTJjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS90Yzg2YzAwMS5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS90Yzg2YzAwMS5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAkuZG1hX3NldHVwCQk9IGlkZV9kbWFfc2V0dXAsCiAJLmRtYV9leGVjX2NtZAkJPSBpZGVfZG1hX2V4ZWNfY21kLAogCS5kbWFfc3RhcnQJCT0gdGM4NmMwMDFfZG1hX3N0YXJ0LAotCS5kbWFfZW5kCQk9IF9faWRlX2RtYV9lbmQsCisJLmRtYV9lbmQJCT0gaWRlX2RtYV9lbmQsCiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LApAQCAtMjQ1LDcgKzI0NSw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRjODZjMDAxX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRjODZjMDAxX3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlRDODZDMDAxIiwKIAkuaWRfdGFibGUJPSB0Yzg2YzAwMV9wY2lfdGJsLAogCS5wcm9iZQkJPSB0Yzg2YzAwMV9pbml0X29uZSwKQEAgLTI1NCwxMiArMjU0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRjODZjMDAxX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmdGM4NmMwMDFfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0Yzg2YzAwMV9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRjODZjMDAxX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdCh0Yzg2YzAwMV9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdHJpZmxleC5jIGIvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYwppbmRleCBiNzdlYzM1Li5iNmZmNDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvdHJpZmxleC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS90cmlmbGV4LmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzksMTMgKzM4LDEyIEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0JdTggY2hhbm5lbF9vZmZzZXQgPSBod2lmLT5jaGFubmVsID8gMHg3NCA6IDB4NzA7Ci0JdTE2IHRpbWluZyA9IDA7CiAJdTMyIHRyaWZsZXhfdGltaW5ncyA9IDA7Ci0JdTggdW5pdCA9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOwotCQorCXUxNiB0aW1pbmcgPSAwOworCXU4IGNoYW5uZWxfb2Zmc2V0ID0gaHdpZi0+Y2hhbm5lbCA/IDB4NzQgOiAweDcwLCB1bml0ID0gZHJpdmUtPmRuICYgMTsKKwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGNoYW5uZWxfb2Zmc2V0LCAmdHJpZmxleF90aW1pbmdzKTsKLQkKKwogCXN3aXRjaChzcGVlZCkgewogCQljYXNlIFhGRVJfTVdfRE1BXzI6CiAJCQl0aW1pbmcgPSAweDAxMDM7IApAQCAtMTE1LDIxICsxMTMsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJpZmxleF9wY2lfdGJsKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0cmlmbGV4X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gIlRSSUZMRVhfSURFIiwKIAkuaWRfdGFibGUJPSB0cmlmbGV4X3BjaV90YmwsCiAJLnByb2JlCQk9IHRyaWZsZXhfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdHJpZmxleF9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWZsZXhfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0cmlmbGV4X2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZmxleF9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodHJpZmxleF9pZGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMgYi9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMKaW5kZXggZmQyOGI0OS4uNzVlYTYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3RybTI5MC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS90cm0yOTAuYwpAQCAtMTM1LDcgKzEzNSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAKQEAgLTE2Miw3ICsxNjEsNyBAQAogCX0KIAogCS8qIGVuYWJsZSBJUlEgaWYgbm90IHByb2JpbmcgKi8KLQlpZiAoZHJpdmUtPnByZXNlbnQpIHsKKwlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CiAJCXJlZyA9IGludyhod2lmLT5jb25maWdfZGF0YSArIDMpOwogCQlyZWcgJj0gMHgxMzsKIAkJcmVnICY9IH4oMSA8PCBod2lmLT5jaGFubmVsKTsKQEAgLTE3NCw3ICsxNzMsNyBAQAogCiBzdGF0aWMgdm9pZCB0cm0yOTBfc2VsZWN0cHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXRybTI5MF9wcmVwYXJlX2RyaXZlKGRyaXZlLCBkcml2ZS0+dXNpbmdfZG1hKTsKKwl0cm0yOTBfcHJlcGFyZV9kcml2ZShkcml2ZSwgISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpKTsKIH0KIAogc3RhdGljIHZvaWQgdHJtMjkwX2RtYV9leGVjX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IGNvbW1hbmQpCkBAIC0zNTEsNyArMzUwLDcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJtMjkwX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRybTI5MF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJUUk0yOTBfSURFIiwKIAkuaWRfdGFibGUJPSB0cm0yOTBfcGNpX3RibCwKIAkucHJvYmUJCT0gdHJtMjkwX2luaXRfb25lLApAQCAtMzYwLDEyICszNTksMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgdHJtMjkwX2lkZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmdHJtMjkwX3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdHJtMjkwX2lkZV9leGl0KHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJtMjkwX3BjaV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdCh0cm0yOTBfaWRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jIGIvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCmluZGV4IDk0ZmI5YWIuLjJhODEyZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogc3RhdGljIHZvaWQgdmlhX3NldF9kcml2ZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfZHJpdmVfdCAqcGVlciA9IGh3aWYtPmRyaXZlcyArICh+ZHJpdmUtPmRuICYgMSk7CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB2aWE4MmN4eHhfZGV2ICp2ZGV2ID0gaG9zdC0+aG9zdF9wcml2OwpAQCAtMTczLDcgKzE3Myw3IEBACiAKIAlpZGVfdGltaW5nX2NvbXB1dGUoZHJpdmUsIHNwZWVkLCAmdCwgVCwgVVQpOwogCi0JaWYgKHBlZXItPnByZXNlbnQpIHsKKwlpZiAocGVlcikgewogCQlpZGVfdGltaW5nX2NvbXB1dGUocGVlciwgcGVlci0+Y3VycmVudF9zcGVlZCwgJnAsIFQsIFVUKTsKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KQEAgLTIxNSw3ICsyMTUsNyBAQAogLyoKICAqIENoZWNrIGFuZCBoYW5kbGUgODAtd2lyZSBjYWJsZSBwcmVzZW5jZQogICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgdmlhX2NhYmxlX2RldGVjdChzdHJ1Y3QgdmlhODJjeHh4X2RldiAqdmRldiwgdTMyIHUpCitzdGF0aWMgdm9pZCB2aWFfY2FibGVfZGV0ZWN0KHN0cnVjdCB2aWE4MmN4eHhfZGV2ICp2ZGV2LCB1MzIgdSkKIHsKIAlpbnQgaTsKIApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgKglhbmQgaW5pdGlhbGl6ZSBpdHMgZHJpdmUgaW5kZXBlbmRlbnQgcmVnaXN0ZXJzLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF92aWE4MmN4eHgoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5pdF9jaGlwc2V0X3ZpYTgyY3h4eChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB2aWE4MmN4eHhfZGV2ICp2ZGV2ID0gaG9zdC0+aG9zdF9wcml2OwpAQCAtNDg3LDIxICs0ODcsMjMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmlhX3BjaV90YmwpOwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYV9wY2lfZHJpdmVyID0gewogCS5uYW1lIAkJPSAiVklBX0lERSIsCiAJLmlkX3RhYmxlIAk9IHZpYV9wY2lfdGJsLAogCS5wcm9iZSAJCT0gdmlhX2luaXRfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodmlhX3JlbW92ZSksCisJLnN1c3BlbmQJPSBpZGVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZGVfcGNpX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHZpYV9pZGVfaW5pdCh2b2lkKQogewotCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gaWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYV9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHZpYV9pZGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYV9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodmlhX2lkZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMgYi9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCmluZGV4IGZhMmJlMjYuLjJlMTlkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwpAQCAtNDMwLDEwICs0MzAsNyBAQAogCXBtYWNfaWRlX2h3aWZfdCAqcG1pZiA9CiAJCShwbWFjX2lkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoaHdpZi0+Z2VuZGV2LnBhcmVudCk7CiAKLQlpZiAocG1pZiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAoZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxKQorCWlmIChkcml2ZS0+ZG4gJiAxKQogCQl3cml0ZWwocG1pZi0+dGltaW5nc1sxXSwgUE1BQ19JREVfUkVHKElERV9USU1JTkdfQ09ORklHKSk7CiAJZWxzZQogCQl3cml0ZWwocG1pZi0+dGltaW5nc1swXSwgUE1BQ19JREVfUkVHKElERV9USU1JTkdfQ09ORklHKSk7CkBAIC00NTIsMTAgKzQ0OSw3IEBACiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKIAotCWlmIChwbWlmID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpIHsKKwlpZiAoZHJpdmUtPmRuICYgMSkgewogCQl3cml0ZWwocG1pZi0+dGltaW5nc1sxXSwgUE1BQ19JREVfUkVHKElERV9LQVVBSV9QSU9fQ09ORklHKSk7CiAJCXdyaXRlbChwbWlmLT50aW1pbmdzWzNdLCBQTUFDX0lERV9SRUcoSURFX0tBVUFJX1VMVFJBX0NPTkZJRykpOwogCX0gZWxzZSB7CkBAIC00NzUsOSArNDY5LDYgQEAKIAlwbWFjX2lkZV9od2lmX3QgKnBtaWYgPQogCQkocG1hY19pZGVfaHdpZl90ICopZGV2X2dldF9kcnZkYXRhKGh3aWYtPmdlbmRldi5wYXJlbnQpOwogCi0JaWYgKHBtaWYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAJaWYgKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9zaF9hdGE2IHx8CiAJICAgIHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl91bl9hdGE2IHx8CiAJICAgIHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rMl9hdGE2KQpAQCAtNTI0LDExICs1MTUsOCBAQAogCXVuc2lnbmVkIGFjY2Vzc1RpbWUsIHJlY1RpbWU7CiAJdW5zaWduZWQgaW50IGN5Y2xlX3RpbWU7CiAKLQlpZiAocG1pZiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JCQogCS8qIHdoaWNoIGRyaXZlIGlzIGl0ID8gKi8KLQl0aW1pbmdzID0gJnBtaWYtPnRpbWluZ3NbZHJpdmUtPnNlbGVjdC5iLnVuaXQgJiAweDAxXTsKKwl0aW1pbmdzID0gJnBtaWYtPnRpbWluZ3NbZHJpdmUtPmRuICYgMV07CiAJdCA9ICp0aW1pbmdzOwogCiAJY3ljbGVfdGltZSA9IGlkZV9waW9fY3ljbGVfdGltZShkcml2ZSwgcGlvKTsKQEAgLTY2OSw5ICs2NTcsOSBAQAogc2V0X3RpbWluZ3NfbWRtYShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBpbnRmX3R5cGUsIHUzMiAqdGltaW5ncywgdTMyICp0aW1pbmdzMiwKIAkJIAl1OCBzcGVlZCkKIHsKKwl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWludCBjeWNsZVRpbWUsIGFjY2Vzc1RpbWUgPSAwLCByZWNUaW1lID0gMDsKIAl1bnNpZ25lZCBhY2Nlc3NUaWNrcywgcmVjVGlja3M7Ci0Jc3RydWN0IGhkX2RyaXZlaWQgKmlkID0gZHJpdmUtPmlkOwogCXN0cnVjdCBtZG1hX3RpbWluZ3NfdCogdG0gPSBOVUxMOwogCWludCBpOwogCkBAIC02ODYsOCArNjc0LDggQEAKIAl9CiAKIAkvKiBDaGVjayBpZiBkcml2ZSBwcm92aWRlcyBleHBsaWNpdCBETUEgY3ljbGUgdGltZSAqLwotCWlmICgoaWQtPmZpZWxkX3ZhbGlkICYgMikgJiYgaWQtPmVpZGVfZG1hX3RpbWUpCi0JCWN5Y2xlVGltZSA9IG1heF90KGludCwgaWQtPmVpZGVfZG1hX3RpbWUsIGN5Y2xlVGltZSk7CisJaWYgKChpZFtBVEFfSURfRklFTERfVkFMSURdICYgMikgJiYgaWRbQVRBX0lEX0VJREVfRE1BX1RJTUVdKQorCQljeWNsZVRpbWUgPSBtYXhfdChpbnQsIGlkW0FUQV9JRF9FSURFX0RNQV9USU1FXSwgY3ljbGVUaW1lKTsKIAogCS8qIE9IYXJlIGxpbWl0cyBhY2NvcmRpbmcgdG8gc29tZSBvbGQgQXBwbGUgc291cmNlcyAqLwkKIAlpZiAoKGludGZfdHlwZSA9PSBjb250cm9sbGVyX29oYXJlKSAmJiAoY3ljbGVUaW1lIDwgMTUwKSkKQEAgLTgwNSw5ICs3OTMsOSBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlwbWFjX2lkZV9od2lmX3QgKnBtaWYgPQogCQkocG1hY19pZGVfaHdpZl90ICopZGV2X2dldF9kcnZkYXRhKGh3aWYtPmdlbmRldi5wYXJlbnQpOwotCWludCB1bml0ID0gKGRyaXZlLT5zZWxlY3QuYi51bml0ICYgMHgwMSk7CiAJaW50IHJldCA9IDA7CiAJdTMyICp0aW1pbmdzLCAqdGltaW5nczIsIHRsWzJdOworCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwogCiAJdGltaW5ncyA9ICZwbWlmLT50aW1pbmdzW3VuaXRdOwogCXRpbWluZ3MyID0gJnBtaWYtPnRpbWluZ3NbdW5pdCsyXTsKQEAgLTk2NiwxMSArOTU0LDExIEBACiAJaWYgKHBtaWYtPm1lZGlhYmF5KSB7CiAjaWZkZWYgQ09ORklHX1BNQUNfTUVESUFCQVkKIAkJaWYgKGNoZWNrX21lZGlhX2JheV9ieV9iYXNlKHBtaWYtPnJlZ2Jhc2UsIE1CX0NEKSA9PSAwKSB7Ci0JCQlkcml2ZS0+bm9wcm9iZSA9IDA7CisJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9QUk9CRTsKIAkJCXJldHVybjsKIAkJfQogI2VuZGlmCi0JCWRyaXZlLT5ub3Byb2JlID0gMTsKKwkJZHJpdmUtPmRldl9mbGFncyB8PSBJREVfREZMQUdfTk9QUk9CRTsKIAl9CiB9CiAKQEAgLTE1MzUsMTggKzE1MjMsNiBAQAogCXJldHVybiAwOyAvKiByZXZlcnQgdG8gUElPIGZvciB0aGlzIHJlcXVlc3QgKi8KIH0KIAotLyogVGVhcmRvd24gbWFwcGluZ3MgYWZ0ZXIgRE1BIGhhcyBjb21wbGV0ZWQuICAqLwotc3RhdGljIHZvaWQKLXBtYWNfaWRlX2Rlc3Ryb3lfZG1hdGFibGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0KLQlpZiAoaHdpZi0+c2dfbmVudHMpIHsKLQkJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwotCQlod2lmLT5zZ19uZW50cyA9IDA7Ci0JfQotfQotCiAvKgogICogUHJlcGFyZSBhIERNQSB0cmFuc2Zlci4gV2UgYnVpbGQgdGhlIERNQSB0YWJsZSwgYWRqdXN0IHRoZSB0aW1pbmdzIGZvcgogICogYSByZWFkIG9uIEtleUxhcmdvIEFUQS82NiBhbmQgbWFyayB1cyBhcyB3YWl0aW5nIGZvciBETUEgY29tcGxldGlvbgpAQCAtMTU1OCwxMiArMTUzNCw3IEBACiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0JdTggdW5pdCA9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpOwotCXU4IGF0YTQ7Ci0KLQlpZiAocG1pZiA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQlhdGE0ID0gKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0KTsJCisJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDEsIGF0YTQgPSAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQpOwogCiAJaWYgKCFwbWFjX2lkZV9idWlsZF9kbWF0YWJsZShkcml2ZSwgcnEpKSB7CiAJCWlkZV9tYXBfc2coZHJpdmUsIHJxKTsKQEAgLTE2MTcsMTcgKzE1ODgsMTUgQEAKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hID0gcG1pZi0+ZG1hX3JlZ3M7CiAJdTMyIGRzdGF0OwotCQotCWlmIChwbWlmID09IE5VTEwpCi0JCXJldHVybiAwOwotCWRtYSA9IHBtaWYtPmRtYV9yZWdzOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAJZHN0YXQgPSByZWFkbCgmZG1hLT5zdGF0dXMpOwogCXdyaXRlbCgoKFJVTnxXQUtFfERFQUQpIDw8IDE2KSwgJmRtYS0+Y29udHJvbCk7Ci0JcG1hY19pZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisKKwlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CisKIAkvKiB2ZXJpZnkgZ29vZCBkbWEgc3RhdHVzLiB3ZSBkb24ndCBjaGVjayBmb3IgQUNUSVZFIGJlZWluZyAwLiBXZSBzaG91bGQuLi4KIAkgKiBpbiB0aGVvcnksIGJ1dCB3aXRoIEFUQVBJIGRlY2ljZXMgZG9pbmcgYnVmZmVyIHVuZGVycnVucywgdGhhdCB3b3VsZAogCSAqIGNhdXNlIHVzIHRvIGRpc2FibGUgRE1BLCB3aGljaCBpc24ndCB3aGF0IHdlIHdhbnQKQEAgLTE2NDcsMTMgKzE2MTYsOSBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlwbWFjX2lkZV9od2lmX3QgKnBtaWYgPQogCQkocG1hY19pZGVfaHdpZl90ICopZGV2X2dldF9kcnZkYXRhKGh3aWYtPmdlbmRldi5wYXJlbnQpOwotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWEgPSBwbWlmLT5kbWFfcmVnczsKIAl1bnNpZ25lZCBsb25nIHN0YXR1cywgdGltZW91dDsKIAotCWlmIChwbWlmID09IE5VTEwpCi0JCXJldHVybiAwOwotCWRtYSA9IHBtaWYtPmRtYV9yZWdzOwotCiAJLyogV2UgaGF2ZSB0byB0aGluZ3MgdG8gZGVhbCB3aXRoIGhlcmU6CiAJICogCiAJICogLSBUaGUgZGJkbWEgd29uJ3Qgc3RvcCBpZiB0aGUgY29tbWFuZCB3YXMgc3RhcnRlZApAQCAtMTY3Miw5ICsxNjM3LDYgQEAKIAlzdGF0dXMgPSByZWFkbCgmZG1hLT5zdGF0dXMpOwogCWlmICghKHN0YXR1cyAmIEFDVElWRSkpCiAJCXJldHVybiAxOwotCWlmICghZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlJWQsIGlkZV9kbWFfdGVzdF9pcnEgXAotCQkJY2FsbGVkIHdoaWxlIG5vdCB3YWl0aW5nXG4iLCBIV0lGKGRyaXZlKS0+aW5kZXgpOwogCiAJLyogSWYgZGJkbWEgZGlkbid0IGV4ZWN1dGUgdGhlIFNUT1AgY29tbWFuZCB5ZXQsIHRoZQogCSAqIGFjdGl2ZSBiaXQgaXMgc3RpbGwgc2V0LiBXZSBjb25zaWRlciB0aGF0IHdlIGFyZW4ndApAQCAtMTcwOSwxNCArMTY3MSw5IEBACiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXBtYWNfaWRlX2h3aWZfdCAqcG1pZiA9CiAJCShwbWFjX2lkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoaHdpZi0+Z2VuZGV2LnBhcmVudCk7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYSA9IHBtaWYtPmRtYV9yZWdzOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gcmVhZGwoJmRtYS0+c3RhdHVzKTsKIAotCWlmIChwbWlmID09IE5VTEwpCi0JCXJldHVybjsKLQlkbWEgPSBwbWlmLT5kbWFfcmVnczsKLQotCXN0YXR1cyA9IHJlYWRsKCZkbWEtPnN0YXR1cyk7CiAJcHJpbnRrKEtFUk5fRVJSICJpZGUtcG1hYyBsb3N0IGludGVycnVwdCwgZG1hIHN0YXR1czogJWx4XG4iLCBzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCmluZGV4IGE4ZTllOGEuLjlmMWY5MTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYworKysgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwpAQCAtNjU5LDMgKzY1OSwzNiBAQAogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BjaV9yZW1vdmUpOworCisjaWZkZWYgQ09ORklHX1BNCitpbnQgaWRlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BjaV9zdXNwZW5kKTsKKworaW50IGlkZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGlkZV9ob3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaW50IHJjOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCXBjaV9zZXRfbWFzdGVyKGRldik7CisKKwlpZiAoaG9zdC0+aW5pdF9jaGlwc2V0KQorCQlob3N0LT5pbml0X2NoaXBzZXQoZGV2KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BjaV9yZXN1bWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCmluZGV4IDlmOTUzMzcuLjVlMzhhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAogI2RlZmluZSBxdWFkc190b19ieXRlcyhfcSkgKChfcSkgKiBzaXplb2YodTMyKSkKLSNkZWZpbmUgYnl0ZXNfdG9fcXVhZHMoX2IpICgoKF9iKSArIHNpemVvZih1MzIpIC0gMSkgLyBzaXplb2YodTMyKSkKKyNkZWZpbmUgYnl0ZXNfdG9fcXVhZHMoX2IpIERJVl9ST1VORF9VUChfYiwgc2l6ZW9mKHUzMikpCiAKIHN0YXRpYyB2b2lkIGZyZWVfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwppbmRleCBiNmViMmNmLi4yZjgzNTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKQEAgLTkxOCw3ICs5MTgsNyBAQAogCQkvKiBkZWZhdWx0IFNZVCBvZmZzZXQgaXMgMyBjeWNsZXMgKi8KIAkJaW5pdC0+c3l0X29mZnNldCA9IDM7CiAKLQlpZiAoIChpbml0LT5jaGFubmVsID4gNjMpIHx8IChpbml0LT5jaGFubmVsIDwgMCkgKQorCWlmIChpbml0LT5jaGFubmVsID4gNjMpCiAJCWluaXQtPmNoYW5uZWwgPSA2MzsKIAogCWNoYW5fbWFzayA9ICh1NjQpMSA8PCBpbml0LT5jaGFubmVsOwpAQCAtMjI5NiwxMCArMjI5NiwxMCBAQAogCiAJb2hjaSA9IChzdHJ1Y3QgdGlfb2hjaSAqKWhvc3QtPmhvc3RkYXRhOwogCi0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGhwc2JfcHJvdG9jb2xfY2xhc3MsIE5VTEwsCi0JCQkgICAgICBNS0RFVihJRUVFMTM5NF9NQUpPUiwKLQkJCQkgICAgSUVFRTEzOTRfTUlOT1JfQkxPQ0tfRFYxMzk0ICogMTYgKyAoaWQ8PDIpKSwgTlVMTCwKLQkJCSAgICAgICJkdjEzOTQtJWQiLCBpZCk7CisJZGV2aWNlX2NyZWF0ZShocHNiX3Byb3RvY29sX2NsYXNzLCBOVUxMLAorCQkgICAgICBNS0RFVihJRUVFMTM5NF9NQUpPUiwKKwkJCSAgICBJRUVFMTM5NF9NSU5PUl9CTE9DS19EVjEzOTQgKiAxNiArIChpZDw8MikpLAorCQkgICAgICBOVUxMLCAiZHYxMzk0LSVkIiwgaWQpOwogCiAJZHYxMzk0X2luaXQob2hjaSwgRFYxMzk0X05UU0MsIE1PREVfUkVDRUlWRSk7CiAJZHYxMzk0X2luaXQob2hjaSwgRFYxMzk0X05UU0MsIE1PREVfVFJBTlNNSVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCBiMTY2YjM1Li4yMDEyODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtMTM2MSw3ICsxMzYxLDcgQEAKIAkJaGRyLT5mZi5kZ2wgPSBkZ2w7CiAJCWFkal9tYXhfcGF5bG9hZCA9IG1heF9wYXlsb2FkIC0gaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX0ZGXTsKIAl9Ci0JcmV0dXJuIChkZ19zaXplICsgYWRqX21heF9wYXlsb2FkIC0gMSkgLyBhZGpfbWF4X3BheWxvYWQ7CisJcmV0dXJuIERJVl9ST1VORF9VUChkZ19zaXplLCBhZGpfbWF4X3BheWxvYWQpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGV0aGVyMTM5NF9lbmNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCAxNjI0MGE3Li4yMzc2YjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMTU0LDkgKzE1NCw2IEBACiAKIHN0YXRpYyBpbnQgbm9kZW1ncl9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOwogc3RhdGljIGludCBub2RlbWdyX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudik7Ci1zdGF0aWMgdm9pZCBub2RlbWdyX3Jlc3VtZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpOwotc3RhdGljIHZvaWQgbm9kZW1ncl9yZW1vdmVfbmUoc3RydWN0IG5vZGVfZW50cnkgKm5lKTsKLXN0YXRpYyBzdHJ1Y3Qgbm9kZV9lbnRyeSAqZmluZF9lbnRyeV9ieV9ndWlkKHU2NCBndWlkKTsKIAogc3RydWN0IGJ1c190eXBlIGllZWUxMzk0X2J1c190eXBlID0gewogCS5uYW1lCQk9ICJpZWVlMTM5NCIsCkBAIC0zODUsMjcgKzM4Miw2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoaWdub3JlX2RyaXZlciwgU19JV1VTUiB8IFNfSVJVR08sIGZ3X2dldF9pZ25vcmVfZHJpdmVyLCBmd19zZXRfaWdub3JlX2RyaXZlcik7CiAKIAotc3RhdGljIHNzaXplX3QgZndfc2V0X2Rlc3Ryb3lfbm9kZShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IG5vZGVfZW50cnkgKm5lOwotCXU2NCBndWlkID0gKHU2NClzaW1wbGVfc3RydG91bGwoYnVmLCBOVUxMLCAxNik7Ci0KLQluZSA9IGZpbmRfZW50cnlfYnlfZ3VpZChndWlkKTsKLQotCWlmIChuZSA9PSBOVUxMIHx8ICFuZS0+aW5fbGltYm8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jbm9kZW1ncl9yZW1vdmVfbmUobmUpOwotCi0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIHNzaXplX3QgZndfZ2V0X2Rlc3Ryb3lfbm9kZShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIllvdSBjYW4gZGVzdHJveSBpbl9saW1ibyBub2RlcyBieSB3cml0aW5nIHRoZWlyIEdVSUQgdG8gdGhpcyBmaWxlXG4iKTsKLX0KLXN0YXRpYyBCVVNfQVRUUihkZXN0cm95X25vZGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBmd19nZXRfZGVzdHJveV9ub2RlLCBmd19zZXRfZGVzdHJveV9ub2RlKTsKLQotCiBzdGF0aWMgc3NpemVfdCBmd19zZXRfcmVzY2FuKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBjb25zdCBjaGFyICpidWYsCiAJCQkgICAgIHNpemVfdCBjb3VudCkKIHsKQEAgLTQ0Miw3ICs0MTgsNiBAQAogCiAKIHN0cnVjdCBidXNfYXR0cmlidXRlICpjb25zdCBmd19idXNfYXR0cnNbXSA9IHsKLQkmYnVzX2F0dHJfZGVzdHJveV9ub2RlLAogCSZidXNfYXR0cl9yZXNjYW4sCiAJJmJ1c19hdHRyX2lnbm9yZV9kcml2ZXJzLAogCU5VTEwKQEAgLTczNCwxMCArNzA5LDEwIEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgobm9kZW1ncl9zZXJpYWxpemVfcmVtb3ZlX3Vkcyk7CiAKLXN0YXRpYyBpbnQgX19tYXRjaF9uZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG1hdGNoX25lKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOwotCXN0cnVjdCBub2RlX2VudHJ5ICpuZSA9IChzdHJ1Y3Qgbm9kZV9lbnRyeSAqKWRhdGE7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lID0gZGF0YTsKIAogCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCB1bml0X2Rldik7CiAJcmV0dXJuIHVkLT5uZSA9PSBuZTsKQEAgLTc1NCw4ICs3MjksNyBAQAogCSAqLwogCW11dGV4X2xvY2soJm5vZGVtZ3Jfc2VyaWFsaXplX3JlbW92ZV91ZHMpOwogCWZvciAoOzspIHsKLQkJZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJm5vZGVtZ3JfdWRfY2xhc3MsIE5VTEwsIG5lLAotCQkJCQlfX21hdGNoX25lKTsKKwkJZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJm5vZGVtZ3JfdWRfY2xhc3MsIE5VTEwsIG5lLCBtYXRjaF9uZSk7CiAJCWlmICghZGV2KQogCQkJYnJlYWs7CiAJCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCB1bml0X2Rldik7CkBAIC03ODUsNyArNzU5LDcgQEAKIAlwdXRfZGV2aWNlKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgX19ub2RlbWdyX3JlbW92ZV9ob3N0X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHJlbW92ZV9ob3N0X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJaWYgKGRldi0+YnVzID09ICZpZWVlMTM5NF9idXNfdHlwZSkKIAkJbm9kZW1ncl9yZW1vdmVfbmUoY29udGFpbmVyX29mKGRldiwgc3RydWN0IG5vZGVfZW50cnksCkBAIC03OTUsNyArNzY5LDcgQEAKIAogc3RhdGljIHZvaWQgbm9kZW1ncl9yZW1vdmVfaG9zdF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewotCVdBUk5fT04oZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGRldiwgTlVMTCwgX19ub2RlbWdyX3JlbW92ZV9ob3N0X2RldikpOworCWRldmljZV9mb3JfZWFjaF9jaGlsZChkZXYsIE5VTEwsIHJlbW92ZV9ob3N0X2Rldik7CiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImlybV9pZCIpOwogCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJidXNtZ3JfaWQiKTsKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiaG9zdF9pZCIpOwpAQCAtODMwLDExICs4MDQsMTAgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IG5vZGVfZW50cnkgKm5vZGVtZ3JfY3JlYXRlX25vZGUob2N0bGV0X3QgZ3VpZCwgc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCi0JCQkJCSAgICAgIHN0cnVjdCBob3N0X2luZm8gKmhpLCBub2RlaWRfdCBub2RlaWQsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uKQorc3RhdGljIHN0cnVjdCBub2RlX2VudHJ5ICpub2RlbWdyX2NyZWF0ZV9ub2RlKG9jdGxldF90IGd1aWQsCisJCQkJc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJbm9kZWlkX3Qgbm9kZWlkLCB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbikKIHsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gaGktPmhvc3Q7CiAJc3RydWN0IG5vZGVfZW50cnkgKm5lOwogCiAJbmUgPSBremFsbG9jKHNpemVvZigqbmUpLCBHRlBfS0VSTkVMKTsKQEAgLTg4OCwxMCArODYxLDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgX19tYXRjaF9uZV9ndWlkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWF0Y2hfbmVfZ3VpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5vZGVfZW50cnkgKm5lOwotCXU2NCAqZ3VpZCA9ICh1NjQgKilkYXRhOworCXU2NCAqZ3VpZCA9IGRhdGE7CiAKIAluZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBub2RlX2Rldik7CiAJcmV0dXJuIG5lLT5ndWlkID09ICpndWlkOwpAQCAtOTAyLDggKzg3NSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKIAotCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKCZub2RlbWdyX25lX2NsYXNzLCBOVUxMLCAmZ3VpZCwKLQkJCQlfX21hdGNoX25lX2d1aWQpOworCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKCZub2RlbWdyX25lX2NsYXNzLCBOVUxMLCAmZ3VpZCwgbWF0Y2hfbmVfZ3VpZCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwogCW5lID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG5vZGVfZW50cnksIG5vZGVfZGV2KTsKQEAgLTkxMiwyMSArODg0LDIxIEBACiAJcmV0dXJuIG5lOwogfQogCi1zdHJ1Y3QgbWF0Y2hfbm9kZWlkX3BhcmFtIHsKK3N0cnVjdCBtYXRjaF9ub2RlaWRfcGFyYW1ldGVyIHsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwogCW5vZGVpZF90IG5vZGVpZDsKIH07CiAKLXN0YXRpYyBpbnQgX19tYXRjaF9uZV9ub2RlaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIGludCBtYXRjaF9uZV9ub2RlaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCWludCBmb3VuZCA9IDA7CiAJc3RydWN0IG5vZGVfZW50cnkgKm5lOwotCXN0cnVjdCBtYXRjaF9ub2RlaWRfcGFyYW0gKnBhcmFtID0gKHN0cnVjdCBtYXRjaF9ub2RlaWRfcGFyYW0gKilkYXRhOworCXN0cnVjdCBtYXRjaF9ub2RlaWRfcGFyYW1ldGVyICpwID0gZGF0YTsKIAogCWlmICghZGV2KQogCQlnb3RvIHJldDsKIAluZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBub2RlX2Rldik7Ci0JaWYgKG5lLT5ob3N0ID09IHBhcmFtLT5ob3N0ICYmIG5lLT5ub2RlaWQgPT0gcGFyYW0tPm5vZGVpZCkKKwlpZiAobmUtPmhvc3QgPT0gcC0+aG9zdCAmJiBuZS0+bm9kZWlkID09IHAtPm5vZGVpZCkKIAkJZm91bmQgPSAxOwogcmV0OgogCXJldHVybiBmb3VuZDsKQEAgLTkzNywxMyArOTA5LDEyIEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKLQlzdHJ1Y3QgbWF0Y2hfbm9kZWlkX3BhcmFtIHBhcmFtOworCXN0cnVjdCBtYXRjaF9ub2RlaWRfcGFyYW1ldGVyIHA7CiAKLQlwYXJhbS5ob3N0ID0gaG9zdDsKLQlwYXJhbS5ub2RlaWQgPSBub2RlaWQ7CisJcC5ob3N0ID0gaG9zdDsKKwlwLm5vZGVpZCA9IG5vZGVpZDsKIAotCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKCZub2RlbWdyX25lX2NsYXNzLCBOVUxMLCAmcGFyYW0sCi0JCQkJX19tYXRjaF9uZV9ub2RlaWQpOworCWRldiA9IGNsYXNzX2ZpbmRfZGV2aWNlKCZub2RlbWdyX25lX2NsYXNzLCBOVUxMLCAmcCwgbWF0Y2hfbmVfbm9kZWlkKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAJbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgbm9kZV9kZXYpOwpAQCAtOTkwLDcgKzk2MSw3IEBACiAgKiBpbW1lZGlhdGUgdW5pdCBkaXJlY3RvcmllcyBsb29raW5nIGZvciBzb2Z0d2FyZV9pZCBhbmQKICAqIHNvZnR3YXJlX3ZlcnNpb24gZW50cmllcywgaW4gb3JkZXIgdG8gZ2V0IGRyaXZlciBhdXRvbG9hZGluZyB3b3JraW5nLiAqLwogc3RhdGljIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqbm9kZW1ncl9wcm9jZXNzX3VuaXRfZGlyZWN0b3J5Ci0JKHN0cnVjdCBob3N0X2luZm8gKmhpLCBzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqdWRfa3YsCisJKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgc3RydWN0IGNzcjEyMTJfa2V5dmFsICp1ZF9rdiwKIAkgdW5zaWduZWQgaW50ICppZCwgc3RydWN0IHVuaXRfZGlyZWN0b3J5ICpwYXJlbnQpCiB7CiAJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKQEAgLTEwODMsNyArMTA1NCw3IEBACiAJCQkJCW5vZGVtZ3JfcmVnaXN0ZXJfZGV2aWNlKG5lLCB1ZCwgJm5lLT5kZXZpY2UpOwogCQkJCQogCQkJCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHVuaXQgKi8KLQkJCQl1ZF9jaGlsZCA9IG5vZGVtZ3JfcHJvY2Vzc191bml0X2RpcmVjdG9yeShoaSwgbmUsIGt2LCBpZCwgdWQpOworCQkJCXVkX2NoaWxkID0gbm9kZW1ncl9wcm9jZXNzX3VuaXRfZGlyZWN0b3J5KG5lLCBrdiwgaWQsIHVkKTsKIAogCQkJCWlmICh1ZF9jaGlsZCA9PSBOVUxMKQogCQkJCQlicmVhazsKQEAgLTExMzcsNyArMTEwOCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbm9kZW1ncl9wcm9jZXNzX3Jvb3RfZGlyZWN0b3J5KHN0cnVjdCBob3N0X2luZm8gKmhpLCBzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCitzdGF0aWMgdm9pZCBub2RlbWdyX3Byb2Nlc3Nfcm9vdF9kaXJlY3Rvcnkoc3RydWN0IG5vZGVfZW50cnkgKm5lKQogewogCXVuc2lnbmVkIGludCB1ZF9pZCA9IDA7CiAJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CkBAIC0xMTU3LDcgKzExMjgsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBDU1IxMjEyX0tWX0lEX1VOSVQ6Ci0JCQlub2RlbWdyX3Byb2Nlc3NfdW5pdF9kaXJlY3RvcnkoaGksIG5lLCBrdiwgJnVkX2lkLCBOVUxMKTsKKwkJCW5vZGVtZ3JfcHJvY2Vzc191bml0X2RpcmVjdG9yeShuZSwga3YsICZ1ZF9pZCwgTlVMTCk7CiAJCQlicmVhazsKIAogCQljYXNlIENTUjEyMTJfS1ZfSURfREVTQ1JJUFRPUjoKQEAgLTEyNzMsOCArMTI0NCw3IEBACiAgKiB0aGUgdG8gdGFrZSB3aGF0ZXZlciBhY3Rpb25zIHJlcXVpcmVkLgogICovCiBzdGF0aWMgdm9pZCBub2RlbWdyX3VwZGF0ZV9ub2RlKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCi0JCQkJc3RydWN0IGhvc3RfaW5mbyAqaGksIG5vZGVpZF90IG5vZGVpZCwKLQkJCQl1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbikKKwkJCQlub2RlaWRfdCBub2RlaWQsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uKQogewogCWlmIChuZS0+bm9kZWlkICE9IG5vZGVpZCkgewogCQlIUFNCX0RFQlVHKCJOb2RlIGNoYW5nZWQ6ICIgTk9ERV9CVVNfRk1UICIgLT4gIiBOT0RFX0JVU19GTVQsCkBAIC0xMzA1LDE5ICsxMjc1LDIzIEBACiAJCWNzcjEyMTJfZGVzdHJveV9jc3IoY3NyKTsKIAl9CiAKLQlpZiAobmUtPmluX2xpbWJvKQotCQlub2RlbWdyX3Jlc3VtZV9uZShuZSk7Ci0KIAkvKiBNYXJrIHRoZSBub2RlIGN1cnJlbnQgKi8KIAluZS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisKKwlpZiAobmUtPmluX2xpbWJvKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKTsKKwkJbmUtPmluX2xpbWJvID0gZmFsc2U7CisKKwkJSFBTQl9ERUJVRygiTm9kZSByZWFjdGl2YXRlZDogIgorCQkJICAgIklEOkJVU1siIE5PREVfQlVTX0ZNVCAiXSAgR1VJRFslMDE2THhdIiwKKwkJCSAgIE5PREVfQlVTX0FSR1MobmUtPmhvc3QsIG5lLT5ub2RlaWQpLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CisJfQogfQogCi0KLQotc3RhdGljIHZvaWQgbm9kZW1ncl9ub2RlX3NjYW5fb25lKHN0cnVjdCBob3N0X2luZm8gKmhpLAorc3RhdGljIHZvaWQgbm9kZW1ncl9ub2RlX3NjYW5fb25lKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkJICBub2RlaWRfdCBub2RlaWQsIGludCBnZW5lcmF0aW9uKQogewotCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBoaS0+aG9zdDsKIAlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmU7CiAJb2N0bGV0X3QgZ3VpZDsKIAlzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcjsKQEAgLTEzNzMsMTYgKzEzNDcsMTUgQEAKIAl9CiAKIAlpZiAoIW5lKQotCQlub2RlbWdyX2NyZWF0ZV9ub2RlKGd1aWQsIGNzciwgaGksIG5vZGVpZCwgZ2VuZXJhdGlvbik7CisJCW5vZGVtZ3JfY3JlYXRlX25vZGUoZ3VpZCwgY3NyLCBob3N0LCBub2RlaWQsIGdlbmVyYXRpb24pOwogCWVsc2UKLQkJbm9kZW1ncl91cGRhdGVfbm9kZShuZSwgY3NyLCBoaSwgbm9kZWlkLCBnZW5lcmF0aW9uKTsKKwkJbm9kZW1ncl91cGRhdGVfbm9kZShuZSwgY3NyLCBub2RlaWQsIGdlbmVyYXRpb24pOwogfQogCiAKLXN0YXRpYyB2b2lkIG5vZGVtZ3Jfbm9kZV9zY2FuKHN0cnVjdCBob3N0X2luZm8gKmhpLCBpbnQgZ2VuZXJhdGlvbikKK3N0YXRpYyB2b2lkIG5vZGVtZ3Jfbm9kZV9zY2FuKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBnZW5lcmF0aW9uKQogewogCWludCBjb3VudDsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gaGktPmhvc3Q7CiAJc3RydWN0IHNlbGZpZCAqc2lkID0gKHN0cnVjdCBzZWxmaWQgKilob3N0LT50b3BvbG9neV9tYXA7CiAJbm9kZWlkX3Qgbm9kZWlkID0gTE9DQUxfQlVTOwogCkBAIC0xMzk1LDg5ICsxMzY4LDI2IEBACiAJCQlub2RlaWQrKzsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCW5vZGVtZ3Jfbm9kZV9zY2FuX29uZShoaSwgbm9kZWlkKyssIGdlbmVyYXRpb24pOworCQlub2RlbWdyX25vZGVfc2Nhbl9vbmUoaG9zdCwgbm9kZWlkKyssIGdlbmVyYXRpb24pOwogCX0KIH0KIAotc3RhdGljIGludCBfX25vZGVtZ3JfZHJpdmVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbm9kZW1ncl9wYXVzZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCiB7Ci0Jc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OwotCXN0cnVjdCBub2RlX2VudHJ5ICpuZSA9IChzdHJ1Y3Qgbm9kZV9lbnRyeSAqKWRhdGE7Ci0JaW50IGVycm9yOwotCi0JdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIHVuaXRfZGV2KTsKLQlpZiAodWQtPm5lID09IG5lKSB7Ci0JCWRydiA9IGdldF9kcml2ZXIodWQtPmRldmljZS5kcml2ZXIpOwotCQlpZiAoZHJ2KSB7Ci0JCQllcnJvciA9IDE7IC8qIHJlbGVhc2UgaWYgc3VzcGVuZCBpcyBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCWlmIChkcnYtPnN1c3BlbmQpIHsKLQkJCQlkb3duKCZ1ZC0+ZGV2aWNlLnNlbSk7Ci0JCQkJZXJyb3IgPSBkcnYtPnN1c3BlbmQoJnVkLT5kZXZpY2UsIFBNU0dfU1VTUEVORCk7Ci0JCQkJdXAoJnVkLT5kZXZpY2Uuc2VtKTsKLQkJCX0KLQkJCWlmIChlcnJvcikKLQkJCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnVkLT5kZXZpY2UpOwotCQkJcHV0X2RyaXZlcihkcnYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19ub2RlbWdyX2RyaXZlcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKLQlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSAoc3RydWN0IG5vZGVfZW50cnkgKilkYXRhOwotCi0JdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIHVuaXRfZGV2KTsKLQlpZiAodWQtPm5lID09IG5lKSB7Ci0JCWRydiA9IGdldF9kcml2ZXIodWQtPmRldmljZS5kcml2ZXIpOwotCQlpZiAoZHJ2KSB7Ci0JCQlpZiAoZHJ2LT5yZXN1bWUpIHsKLQkJCQlkb3duKCZ1ZC0+ZGV2aWNlLnNlbSk7Ci0JCQkJZHJ2LT5yZXN1bWUoJnVkLT5kZXZpY2UpOwotCQkJCXVwKCZ1ZC0+ZGV2aWNlLnNlbSk7Ci0JCQl9Ci0JCQlwdXRfZHJpdmVyKGRydik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbm9kZW1ncl9zdXNwZW5kX25lKHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKLXsKLQlIUFNCX0RFQlVHKCJOb2RlIHN1c3BlbmRlZDogSUQ6QlVTWyIgTk9ERV9CVVNfRk1UICJdICBHVUlEWyUwMTZMeF0iLAorCUhQU0JfREVCVUcoIk5vZGUgcGF1c2VkOiBJRDpCVVNbIiBOT0RFX0JVU19GTVQgIl0gIEdVSURbJTAxNkx4XSIsCiAJCSAgIE5PREVfQlVTX0FSR1MobmUtPmhvc3QsIG5lLT5ub2RlaWQpLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW5lLT5ndWlkKTsKIAotCW5lLT5pbl9saW1ibyA9IDE7CisJbmUtPmluX2xpbWJvID0gdHJ1ZTsKIAlXQVJOX09OKGRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKSk7Ci0KLQljbGFzc19mb3JfZWFjaF9kZXZpY2UoJm5vZGVtZ3JfdWRfY2xhc3MsIE5VTEwsIG5lLAotCQkJICAgICAgX19ub2RlbWdyX2RyaXZlcl9zdXNwZW5kKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBub2RlbWdyX3Jlc3VtZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCi17Ci0JbmUtPmluX2xpbWJvID0gMDsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV9pbl9saW1ibyk7Ci0KLQljbGFzc19mb3JfZWFjaF9kZXZpY2UoJm5vZGVtZ3JfdWRfY2xhc3MsIE5VTEwsIG5lLAotCQkJICAgICAgX19ub2RlbWdyX2RyaXZlcl9yZXN1bWUpOwotCUhQU0JfREVCVUcoIk5vZGUgcmVzdW1lZDogSUQ6QlVTWyIgTk9ERV9CVVNfRk1UICJdICBHVUlEWyUwMTZMeF0iLAotCQkgICBOT0RFX0JVU19BUkdTKG5lLT5ob3N0LCBuZS0+bm9kZWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19ub2RlbWdyX3VwZGF0ZV9wZHJ2KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdXBkYXRlX3BkcnYoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKIAlzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgKnBkcnY7Ci0Jc3RydWN0IG5vZGVfZW50cnkgKm5lID0gKHN0cnVjdCBub2RlX2VudHJ5ICopZGF0YTsKKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSBkYXRhOwogCWludCBlcnJvcjsKIAogCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCB1bml0X2Rldik7CkBAIC0xNTAzLDExICsxNDEzLDkgQEAKIAogc3RhdGljIHZvaWQgbm9kZW1ncl91cGRhdGVfcGRydihzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCiB7Ci0JY2xhc3NfZm9yX2VhY2hfZGV2aWNlKCZub2RlbWdyX3VkX2NsYXNzLCBOVUxMLCBuZSwKLQkJCSAgICAgIF9fbm9kZW1ncl91cGRhdGVfcGRydik7CisJY2xhc3NfZm9yX2VhY2hfZGV2aWNlKCZub2RlbWdyX3VkX2NsYXNzLCBOVUxMLCBuZSwgdXBkYXRlX3BkcnYpOwogfQogCi0KIC8qIFdyaXRlIHRoZSBCUk9BRENBU1RfQ0hBTk5FTCBhcyBwZXIgSUVFRTEzOTRhIDguMy4yLjMuMTEgYW5kIDguNC4yLjMuICBUaGlzCiAgKiBzZWVtcyBsaWtlIGFuIG9wdGlvbmFsIHNlcnZpY2UgYnV0IGluIHRoZSBlbmQgaXQgaXMgcHJhY3RpY2FsbHkgbWFuZGF0b3J5CiAgKiBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoZXNlIGNsYXVzZXMuCkBAIC0xNTM1LDExICsxNDQzLDEyIEBACiB9CiAKIAotc3RhdGljIHZvaWQgbm9kZW1ncl9wcm9iZV9uZShzdHJ1Y3QgaG9zdF9pbmZvICpoaSwgc3RydWN0IG5vZGVfZW50cnkgKm5lLCBpbnQgZ2VuZXJhdGlvbikKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcHJvYmVfbmUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IG5vZGVfZW50cnkgKm5lLAorCQkJICAgICBpbnQgZ2VuZXJhdGlvbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlpZiAobmUtPmhvc3QgIT0gaGktPmhvc3QgfHwgbmUtPmluX2xpbWJvKQorCWlmIChuZS0+aG9zdCAhPSBob3N0IHx8IG5lLT5pbl9saW1ibykKIAkJcmV0dXJuOwogCiAJZGV2ID0gZ2V0X2RldmljZSgmbmUtPmRldmljZSk7CkBAIC0xNTU0LDQwICsxNDYzLDQwIEBACiAJICogZG93biB0byB0aGUgZHJpdmVycy4gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgZGVhZCBub2RlIGFuZCB3ZQogCSAqIHN1c3BlbmQgaXQuICovCiAJaWYgKG5lLT5uZWVkc19wcm9iZSkKLQkJbm9kZW1ncl9wcm9jZXNzX3Jvb3RfZGlyZWN0b3J5KGhpLCBuZSk7CisJCW5vZGVtZ3JfcHJvY2Vzc19yb290X2RpcmVjdG9yeShuZSk7CiAJZWxzZSBpZiAobmUtPmdlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbikKIAkJbm9kZW1ncl91cGRhdGVfcGRydihuZSk7CiAJZWxzZQotCQlub2RlbWdyX3N1c3BlbmRfbmUobmUpOworCQlub2RlbWdyX3BhdXNlX25lKG5lKTsKIAogCXB1dF9kZXZpY2UoZGV2KTsKIH0KIAotc3RydWN0IHByb2JlX3BhcmFtIHsKLQlzdHJ1Y3QgaG9zdF9pbmZvICpoaTsKK3N0cnVjdCBub2RlX3Byb2JlX3BhcmFtZXRlciB7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKIAlpbnQgZ2VuZXJhdGlvbjsKIAlib29sIHByb2JlX25vdzsKIH07CiAKIHN0YXRpYyBpbnQgbm9kZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHByb2JlX3BhcmFtICpwID0gZGF0YTsKKwlzdHJ1Y3Qgbm9kZV9wcm9iZV9wYXJhbWV0ZXIgKnAgPSBkYXRhOwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKIAotCWlmIChwLT5nZW5lcmF0aW9uICE9IGdldF9ocHNiX2dlbmVyYXRpb24ocC0+aGktPmhvc3QpKQorCWlmIChwLT5nZW5lcmF0aW9uICE9IGdldF9ocHNiX2dlbmVyYXRpb24ocC0+aG9zdCkpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgbm9kZV9kZXYpOwogCWlmIChuZS0+bmVlZHNfcHJvYmUgPT0gcC0+cHJvYmVfbm93KQotCQlub2RlbWdyX3Byb2JlX25lKHAtPmhpLCBuZSwgcC0+Z2VuZXJhdGlvbik7CisJCW5vZGVtZ3JfcHJvYmVfbmUocC0+aG9zdCwgbmUsIHAtPmdlbmVyYXRpb24pOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBub2RlbWdyX25vZGVfcHJvYmUoc3RydWN0IGhvc3RfaW5mbyAqaGksIGludCBnZW5lcmF0aW9uKQorc3RhdGljIGludCBub2RlbWdyX25vZGVfcHJvYmUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IGdlbmVyYXRpb24pCiB7Ci0Jc3RydWN0IHByb2JlX3BhcmFtIHA7CisJc3RydWN0IG5vZGVfcHJvYmVfcGFyYW1ldGVyIHA7CiAKLQlwLmhpID0gaGk7CisJcC5ob3N0ID0gaG9zdDsKIAlwLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOwogCS8qCiAJICogRG8gc29tZSBwcm9jZXNzaW5nIG9mIHRoZSBub2RlcyB3ZSd2ZSBwcm9iZWQuIFRoaXMgcHVsbHMgdGhlbQpAQCAtMTYwNCwxMSArMTUxMywxMSBAQAogCSAqLwogCXAucHJvYmVfbm93ID0gZmFsc2U7CiAJaWYgKGNsYXNzX2Zvcl9lYWNoX2RldmljZSgmbm9kZW1ncl9uZV9jbGFzcywgTlVMTCwgJnAsIG5vZGVfcHJvYmUpICE9IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlwLnByb2JlX25vdyA9IHRydWU7CiAJaWYgKGNsYXNzX2Zvcl9lYWNoX2RldmljZSgmbm9kZW1ncl9uZV9jbGFzcywgTlVMTCwgJnAsIG5vZGVfcHJvYmUpICE9IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJLyoKIAkgKiBOb3cgbGV0J3MgdGVsbCB0aGUgYnVzIHRvIHJlc2NhbiBvdXIgZGV2aWNlcy4gVGhpcyBtYXkgc2VlbQogCSAqIGxpa2Ugb3ZlcmhlYWQsIGJ1dCB0aGUgZHJpdmVyLW1vZGVsIGNvcmUgd2lsbCBvbmx5IHNjYW4gYQpAQCAtMTYyMCw2ICsxNTI5LDI3IEBACiAJICovCiAJaWYgKGJ1c19yZXNjYW5fZGV2aWNlcygmaWVlZTEzOTRfYnVzX3R5cGUpICE9IDApCiAJCUhQU0JfREVCVUcoImJ1c19yZXNjYW5fZGV2aWNlcyBoYWQgYW4gZXJyb3IiKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9ub2Rlc19pbl9saW1ibyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lOworCisJaWYgKGRldi0+YnVzICE9ICZpZWVlMTM5NF9idXNfdHlwZSkKKwkJcmV0dXJuIDA7CisKKwluZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBkZXZpY2UpOworCWlmIChuZS0+aW5fbGltYm8pCisJCW5vZGVtZ3JfcmVtb3ZlX25lKG5lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV9ub2Rlc19pbl9saW1ibyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmaG9zdC0+ZGV2aWNlLCBOVUxMLCByZW1vdmVfbm9kZXNfaW5fbGltYm8pOwogfQogCiBzdGF0aWMgaW50IG5vZGVtZ3Jfc2VuZF9yZXN1bWVfcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCkBAIC0xNzMwLDEwICsxNjYwLDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBub2RlbWdyX2hvc3RfdGhyZWFkKHZvaWQgKl9faGkpCitzdGF0aWMgaW50IG5vZGVtZ3JfaG9zdF90aHJlYWQodm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaG9zdF9pbmZvICpoaSA9IChzdHJ1Y3QgaG9zdF9pbmZvICopX19oaTsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gaGktPmhvc3Q7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IGRhdGE7CiAJdW5zaWduZWQgaW50IGcsIGdlbmVyYXRpb24gPSAwOwogCWludCBpLCByZXNldF9jeWNsZXMgPSAwOwogCkBAIC0xNzg3LDM2ICsxNzE2LDQ4IEBACiAJCSAqIGVudHJpZXMuIFRoaXMgZG9lcyBub3QgZG8gdGhlIHN5c2ZzIHN0dWZmLCBzaW5jZSB0aGF0CiAJCSAqIHdvdWxkIHRyaWdnZXIgdWV2ZW50cyBhbmQgc3VjaCwgd2hpY2ggaXMgYSBiYWQgaWRlYSBhdAogCQkgKiB0aGlzIHBvaW50LiAqLwotCQlub2RlbWdyX25vZGVfc2NhbihoaSwgZ2VuZXJhdGlvbik7CisJCW5vZGVtZ3Jfbm9kZV9zY2FuKGhvc3QsIGdlbmVyYXRpb24pOwogCiAJCS8qIFRoaXMgYWN0dWFsbHkgZG9lcyB0aGUgZnVsbCBwcm9iZSwgd2l0aCBzeXNmcwogCQkgKiByZWdpc3RyYXRpb24uICovCi0JCW5vZGVtZ3Jfbm9kZV9wcm9iZShoaSwgZ2VuZXJhdGlvbik7CisJCWlmICghbm9kZW1ncl9ub2RlX3Byb2JlKGhvc3QsIGdlbmVyYXRpb24pKQorCQkJY29udGludWU7CiAKIAkJLyogVXBkYXRlIHNvbWUgb2Ygb3VyIHN5c2ZzIHN5bWxpbmtzICovCiAJCW5vZGVtZ3JfdXBkYXRlX2hvc3RfZGV2X2xpbmtzKGhvc3QpOworCisJCS8qIFNsZWVwIDMgc2Vjb25kcyAqLworCQlmb3IgKGkgPSAzMDAwLzIwMDsgaTsgaS0tKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDApOworCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCQlnb3RvIGV4aXQ7CisKKwkJCWlmIChnZW5lcmF0aW9uICE9IGdldF9ocHNiX2dlbmVyYXRpb24oaG9zdCkpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogUmVtb3ZlIG5vZGVzIHdoaWNoIGFyZSBnb25lLCB1bmxlc3MgYSBidXMgcmVzZXQgaGFwcGVuZWQgKi8KKwkJaWYgKCFpKQorCQkJbm9kZW1ncl9yZW1vdmVfbm9kZXNfaW5fbGltYm8oaG9zdCk7CiAJfQogZXhpdDoKIAlIUFNCX1ZFUkJPU0UoIk5vZGVNZ3I6IEV4aXRpbmcgdGhyZWFkIik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBob3N0X2l0ZXJfcGFyYW0geworc3RydWN0IHBlcl9ob3N0X3BhcmFtZXRlciB7CiAJdm9pZCAqZGF0YTsKIAlpbnQgKCpjYikoc3RydWN0IGhwc2JfaG9zdCAqLCB2b2lkICopOwogfTsKIAotc3RhdGljIGludCBfX25vZGVtZ3JfZm9yX2VhY2hfaG9zdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHBlcl9ob3N0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwotCXN0cnVjdCBob3N0X2l0ZXJfcGFyYW0gKmhpcCA9IChzdHJ1Y3QgaG9zdF9pdGVyX3BhcmFtICopZGF0YTsKLQlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBwZXJfaG9zdF9wYXJhbWV0ZXIgKnAgPSBkYXRhOwogCiAJaG9zdCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBocHNiX2hvc3QsIGhvc3RfZGV2KTsKLQllcnJvciA9IGhpcC0+Y2IoaG9zdCwgaGlwLT5kYXRhKTsKLQotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcC0+Y2IoaG9zdCwgcC0+ZGF0YSk7CiB9CisKIC8qKgogICogbm9kZW1ncl9mb3JfZWFjaF9ob3N0IC0gY2FsbCBhIGZ1bmN0aW9uIGZvciBlYWNoIElFRUUgMTM5NCBob3N0CiAgKiBAZGF0YTogYW4gYWRkcmVzcyB0byBzdXBwbHkgdG8gdGhlIGNhbGxiYWNrCkBAIC0xODMxLDE1ICsxNzcyLDExIEBACiAgKi8KIGludCBub2RlbWdyX2Zvcl9lYWNoX2hvc3Qodm9pZCAqZGF0YSwgaW50ICgqY2IpKHN0cnVjdCBocHNiX2hvc3QgKiwgdm9pZCAqKSkKIHsKLQlzdHJ1Y3QgaG9zdF9pdGVyX3BhcmFtIGhpcDsKLQlpbnQgZXJyb3I7CisJc3RydWN0IHBlcl9ob3N0X3BhcmFtZXRlciBwOwogCi0JaGlwLmNiID0gY2I7Ci0JaGlwLmRhdGEgPSBkYXRhOwotCWVycm9yID0gY2xhc3NfZm9yX2VhY2hfZGV2aWNlKCZocHNiX2hvc3RfY2xhc3MsIE5VTEwsICZoaXAsCi0JCQkJICAgICAgX19ub2RlbWdyX2Zvcl9lYWNoX2hvc3QpOwotCi0JcmV0dXJuIGVycm9yOworCXAuY2IgPSBjYjsKKwlwLmRhdGEgPSBkYXRhOworCXJldHVybiBjbGFzc19mb3JfZWFjaF9kZXZpY2UoJmhwc2JfaG9zdF9jbGFzcywgTlVMTCwgJnAsIHBlcl9ob3N0KTsKIH0KIAogLyogVGhlIGZvbGxvd2luZyB0d28gY29udmVuaWVuY2UgZnVuY3Rpb25zIHVzZSBhIHN0cnVjdCBub2RlX2VudHJ5CkBAIC0xODkzLDcgKzE4MzAsNyBAQAogCQlyZXR1cm47CiAJfQogCWhpLT5ob3N0ID0gaG9zdDsKLQloaS0+dGhyZWFkID0ga3RocmVhZF9ydW4obm9kZW1ncl9ob3N0X3RocmVhZCwgaGksICJrbm9kZW1ncmRfJWQiLAorCWhpLT50aHJlYWQgPSBrdGhyZWFkX3J1bihub2RlbWdyX2hvc3RfdGhyZWFkLCBob3N0LCAia25vZGVtZ3JkXyVkIiwKIAkJCQkgaG9zdC0+aWQpOwogCWlmIChJU19FUlIoaGktPnRocmVhZCkpIHsKIAkJSFBTQl9FUlIoIk5vZGVNZ3I6IGNhbm5vdCBzdGFydCB0aHJlYWQgZm9yIGhvc3QgJWQiLCBob3N0LT5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaCBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oCmluZGV4IDZlYjI2NDYuLjRmMjg3YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlIG5vZGVfZGV2OwogCiAJLyogTWVhbnMgdGhpcyBub2RlIGlzIG5vdCBhdHRhY2hlZCBhbnltb3JlICovCi0JaW50IGluX2xpbWJvOworCWJvb2wgaW5fbGltYm87CiAKIAlzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQtcHJpdmF0ZS5oIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LXByaXZhdGUuaAppbmRleCBhMDZhYWFkLi43YTIyNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQtcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC1wcml2YXRlLmgKQEAgLTIyLDYgKzIyLDcgQEAKIHN0cnVjdCBmaWxlX2luZm8gewogICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKKwlzdHJ1Y3QgbXV0ZXggc3RhdGVfbXV0ZXg7CiAgICAgICAgIGVudW0geyBvcGVuZWQsIGluaXRpYWxpemVkLCBjb25uZWN0ZWQgfSBzdGF0ZTsKICAgICAgICAgdW5zaWduZWQgaW50IHByb3RvY29sX3ZlcnNpb247CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggNmZhOWU0YS4uOWYxOWFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC0yMjY3LDYgKzIyNjgsOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwltdXRleF9sb2NrKCZmaS0+c3RhdGVfbXV0ZXgpOworCiAJc3dpdGNoIChmaS0+c3RhdGUpIHsKIAljYXNlIG9wZW5lZDoKIAkJcmV0dmFsID0gc3RhdGVfb3BlbmVkKGZpLCByZXEpOwpAQCAtMjI4MSw2ICsyMjg0LDggQEAKIAkJYnJlYWs7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZmaS0+c3RhdGVfbXV0ZXgpOworCiAJaWYgKHJldHZhbCA8IDApIHsKIAkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKIAl9IGVsc2UgewpAQCAtMjU0MSwxMDkgKzI1NDYsMTIwIEBACiBzdGF0aWMgaW50IHJhdzEzOTRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmZpLT5zdGF0ZV9tdXRleCk7CiAKIAlpZiAoZmktPmlzb19zdGF0ZSA9PSBSQVcxMzk0X0lTT19JTkFDVElWRSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CisJZWxzZQorCQlyZXQgPSBkbWFfcmVnaW9uX21tYXAoJmZpLT5pc29faGFuZGxlLT5kYXRhX2J1ZiwgZmlsZSwgdm1hKTsKIAotCXJldHVybiBkbWFfcmVnaW9uX21tYXAoJmZpLT5pc29faGFuZGxlLT5kYXRhX2J1ZiwgZmlsZSwgdm1hKTsKKwltdXRleF91bmxvY2soJmZpLT5zdGF0ZV9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyByYXcxMzk0X2lvY3RsX2luYWN0aXZlKHN0cnVjdCBmaWxlX2luZm8gKmZpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHZvaWQgX191c2VyICphcmdwKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9JTklUOgorCQlyZXR1cm4gcmF3MTM5NF9pc29feG1pdF9pbml0KGZpLCBhcmdwKTsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX0lOSVQ6CisJCXJldHVybiByYXcxMzk0X2lzb19yZWN2X2luaXQoZmksIGFyZ3ApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGxvbmcgcmF3MTM5NF9pb2N0bF9yZWN2KHN0cnVjdCBmaWxlX2luZm8gKmZpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX1NUQVJUOnsKKwkJCWludCBhcmdzWzNdOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3NbMF0sIGFyZ3AsIHNpemVvZihhcmdzKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9zdGFydChmaS0+aXNvX2hhbmRsZSwKKwkJCQkJCSAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworCQl9CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9SRUNWX1NUT1A6CisJCWhwc2JfaXNvX3N0b3AoZmktPmlzb19oYW5kbGUpOworCQlyZXR1cm4gMDsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX0xJU1RFTl9DSEFOTkVMOgorCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9saXN0ZW5fY2hhbm5lbChmaS0+aXNvX2hhbmRsZSwgYXJnKTsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX1VOTElTVEVOX0NIQU5ORUw6CisJCXJldHVybiBocHNiX2lzb19yZWN2X3VubGlzdGVuX2NoYW5uZWwoZmktPmlzb19oYW5kbGUsIGFyZyk7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9TRVRfQ0hBTk5FTF9NQVNLOnsKKwkJCXU2NCBtYXNrOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1hc2ssIGFyZ3AsIHNpemVvZihtYXNrKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9zZXRfY2hhbm5lbF9tYXNrKGZpLT5pc29faGFuZGxlLAorCQkJCQkJCSAgICAgIG1hc2spOworCQl9CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fR0VUX1NUQVRVUzoKKwkJcmV0dXJuIHJhdzEzOTRfaXNvX2dldF9zdGF0dXMoZmksIGFyZ3ApOworCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfUEFDS0VUUzoKKwkJcmV0dXJuIHJhdzEzOTRfaXNvX3JlY3ZfcGFja2V0cyhmaSwgYXJncCk7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9SRUxFQVNFX1BBQ0tFVFM6CisJCXJldHVybiBocHNiX2lzb19yZWN2X3JlbGVhc2VfcGFja2V0cyhmaS0+aXNvX2hhbmRsZSwgYXJnKTsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX0ZMVVNIOgorCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9mbHVzaChmaS0+aXNvX2hhbmRsZSk7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fU0hVVERPV046CisJCXJhdzEzOTRfaXNvX3NodXRkb3duKGZpKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fUVVFVUVfQUNUSVZJVFk6CisJCXF1ZXVlX3Jhd2lzb19ldmVudChmaSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGxvbmcgcmF3MTM5NF9pb2N0bF94bWl0KHN0cnVjdCBmaWxlX2luZm8gKmZpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHZvaWQgX191c2VyICphcmdwKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9TVEFSVDp7CisJCQlpbnQgYXJnc1syXTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmdzWzBdLCBhcmdwLCBzaXplb2YoYXJncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIGhwc2JfaXNvX3htaXRfc3RhcnQoZmktPmlzb19oYW5kbGUsCisJCQkJCQkgICBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJfQorCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1hNSVRfU1lOQzoKKwkJcmV0dXJuIGhwc2JfaXNvX3htaXRfc3luYyhmaS0+aXNvX2hhbmRsZSk7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9SRUNWX1NUT1A6CisJCWhwc2JfaXNvX3N0b3AoZmktPmlzb19oYW5kbGUpOworCQlyZXR1cm4gMDsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19HRVRfU1RBVFVTOgorCQlyZXR1cm4gcmF3MTM5NF9pc29fZ2V0X3N0YXR1cyhmaSwgYXJncCk7CisJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9QQUNLRVRTOgorCQlyZXR1cm4gcmF3MTM5NF9pc29fc2VuZF9wYWNrZXRzKGZpLCBhcmdwKTsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19TSFVURE9XTjoKKwkJcmF3MTM5NF9pc29fc2h1dGRvd24oZmkpOworCQlyZXR1cm4gMDsKKwljYXNlIFJBVzEzOTRfSU9DX0lTT19RVUVVRV9BQ1RJVklUWToKKwkJcXVldWVfcmF3aXNvX2V2ZW50KGZpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogfQogCiAvKiBpb2N0bCBpcyBvbmx5IHVzZWQgZm9yIHJhd2lzbyBvcGVyYXRpb25zICovCi1zdGF0aWMgbG9uZyBkb19yYXcxMzk0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgcmF3MTM5NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQlzd2l0Y2ggKGZpLT5pc29fc3RhdGUpIHsKLQljYXNlIFJBVzEzOTRfSVNPX0lOQUNUSVZFOgotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19YTUlUX0lOSVQ6Ci0JCQlyZXR1cm4gcmF3MTM5NF9pc29feG1pdF9pbml0KGZpLCBhcmdwKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9JTklUOgotCQkJcmV0dXJuIHJhdzEzOTRfaXNvX3JlY3ZfaW5pdChmaSwgYXJncCk7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIFJBVzEzOTRfSVNPX1JFQ1Y6Ci0JCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfU1RBUlQ6ewotCQkJCS8qIGNvcHkgYXJncyBmcm9tIHVzZXItc3BhY2UgKi8KLQkJCQlpbnQgYXJnc1szXTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCQkgICAgKCZhcmdzWzBdLCBhcmdwLCBzaXplb2YoYXJncykpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9zdGFydChmaS0+aXNvX2hhbmRsZSwKLQkJCQkJCQkgICBhcmdzWzBdLCBhcmdzWzFdLAotCQkJCQkJCSAgIGFyZ3NbMl0pOwotCQkJfQotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19YTUlUX1JFQ1ZfU1RPUDoKLQkJCWhwc2JfaXNvX3N0b3AoZmktPmlzb19oYW5kbGUpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfTElTVEVOX0NIQU5ORUw6Ci0JCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9saXN0ZW5fY2hhbm5lbChmaS0+aXNvX2hhbmRsZSwKLQkJCQkJCQkgICAgYXJnKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9VTkxJU1RFTl9DSEFOTkVMOgotCQkJcmV0dXJuIGhwc2JfaXNvX3JlY3ZfdW5saXN0ZW5fY2hhbm5lbChmaS0+aXNvX2hhbmRsZSwKLQkJCQkJCQkgICAgICBhcmcpOwotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX1NFVF9DSEFOTkVMX01BU0s6ewotCQkJCS8qIGNvcHkgdGhlIHU2NCBmcm9tIHVzZXItc3BhY2UgKi8KLQkJCQl1NjQgbWFzazsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1hc2ssIGFyZ3AsIHNpemVvZihtYXNrKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXJldHVybiBocHNiX2lzb19yZWN2X3NldF9jaGFubmVsX21hc2soZmktPgotCQkJCQkJCQkgICAgICBpc29faGFuZGxlLAotCQkJCQkJCQkgICAgICBtYXNrKTsKLQkJCX0KLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fR0VUX1NUQVRVUzoKLQkJCXJldHVybiByYXcxMzk0X2lzb19nZXRfc3RhdHVzKGZpLCBhcmdwKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9QQUNLRVRTOgotCQkJcmV0dXJuIHJhdzEzOTRfaXNvX3JlY3ZfcGFja2V0cyhmaSwgYXJncCk7Ci0JCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfUkVMRUFTRV9QQUNLRVRTOgotCQkJcmV0dXJuIGhwc2JfaXNvX3JlY3ZfcmVsZWFzZV9wYWNrZXRzKGZpLT5pc29faGFuZGxlLAotCQkJCQkJCSAgICAgYXJnKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9GTFVTSDoKLQkJCXJldHVybiBocHNiX2lzb19yZWN2X2ZsdXNoKGZpLT5pc29faGFuZGxlKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fU0hVVERPV046Ci0JCQlyYXcxMzk0X2lzb19zaHV0ZG93bihmaSk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUVVFVUVfQUNUSVZJVFk6Ci0JCQlxdWV1ZV9yYXdpc29fZXZlbnQoZmkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBSQVcxMzk0X0lTT19YTUlUOgotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19YTUlUX1NUQVJUOnsKLQkJCQkvKiBjb3B5IHR3byBpbnRzIGZyb20gdXNlci1zcGFjZSAqLwotCQkJCWludCBhcmdzWzJdOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJCSAgICAoJmFyZ3NbMF0sIGFyZ3AsIHNpemVvZihhcmdzKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXJldHVybiBocHNiX2lzb194bWl0X3N0YXJ0KGZpLT5pc29faGFuZGxlLAotCQkJCQkJCSAgIGFyZ3NbMF0sIGFyZ3NbMV0pOwotCQkJfQotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19YTUlUX1NZTkM6Ci0JCQlyZXR1cm4gaHBzYl9pc29feG1pdF9zeW5jKGZpLT5pc29faGFuZGxlKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9SRUNWX1NUT1A6Ci0JCQlocHNiX2lzb19zdG9wKGZpLT5pc29faGFuZGxlKTsKLQkJCXJldHVybiAwOwotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19HRVRfU1RBVFVTOgotCQkJcmV0dXJuIHJhdzEzOTRfaXNvX2dldF9zdGF0dXMoZmksIGFyZ3ApOwotCQljYXNlIFJBVzEzOTRfSU9DX0lTT19YTUlUX1BBQ0tFVFM6Ci0JCQlyZXR1cm4gcmF3MTM5NF9pc29fc2VuZF9wYWNrZXRzKGZpLCBhcmdwKTsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fU0hVVERPV046Ci0JCQlyYXcxMzk0X2lzb19zaHV0ZG93bihmaSk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUVVFVUVfQUNUSVZJVFk6Ci0JCQlxdWV1ZV9yYXdpc29fZXZlbnQoZmkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCWxvbmcgcmV0OwogCiAJLyogc3RhdGUtaW5kZXBlbmRlbnQgY29tbWFuZHMgKi8KIAlzd2l0Y2goY21kKSB7CkBAIC0yNjUzLDE2ICsyNjY5LDI1IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybiAtRUlOVkFMOwotfQorCW11dGV4X2xvY2soJmZpLT5zdGF0ZV9tdXRleCk7CiAKLXN0YXRpYyBsb25nIHJhdzEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JbG9uZyByZXQ7Ci0JbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBkb19yYXcxMzk0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChmaS0+aXNvX3N0YXRlKSB7CisJY2FzZSBSQVcxMzk0X0lTT19JTkFDVElWRToKKwkJcmV0ID0gcmF3MTM5NF9pb2N0bF9pbmFjdGl2ZShmaSwgY21kLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBSQVcxMzk0X0lTT19SRUNWOgorCQlyZXQgPSByYXcxMzk0X2lvY3RsX3JlY3YoZmksIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBSQVcxMzk0X0lTT19YTUlUOgorCQlyZXQgPSByYXcxMzk0X2lvY3RsX3htaXQoZmksIGNtZCwgYXJncCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZmktPnN0YXRlX211dGV4KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3MDAsNyArMjcyNSw3IEBACiAJICAgICFjb3B5X2Zyb21fdXNlcigmaW5mb3MzMiwgJmFyZy0+aW5mb3MsIHNpemVvZiBpbmZvczMyKSkgewogCQlpbmZvcyA9IGNvbXBhdF9wdHIoaW5mb3MzMik7CiAJCWlmICghY29weV90b191c2VyKCZkc3QtPmluZm9zLCAmaW5mb3MsIHNpemVvZiBpbmZvcykpCi0JCQllcnIgPSBkb19yYXcxMzk0X2lvY3RsKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpZHN0KTsKKwkJCWVyciA9IHJhdzEzOTRfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZylkc3QpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMjcyNCw3ICsyNzQ5LDYgQEAKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlsb25nIGVycjsKIAotCWxvY2tfa2VybmVsKCk7CiAJc3dpdGNoIChjbWQpIHsKIAkvKiBUaGVzZSByZXF1ZXN0cyBoYXZlIHNhbWUgZm9ybWF0IGFzIGxvbmcgYXMgJ2ludCcgaGFzIHNhbWUgc2l6ZS4gKi8KIAljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX0lOSVQ6CkBAIC0yNzQxLDcgKzI3NjUsNyBAQAogCWNhc2UgUkFXMTM5NF9JT0NfSVNPX0dFVF9TVEFUVVM6CiAJY2FzZSBSQVcxMzk0X0lPQ19JU09fU0hVVERPV046CiAJY2FzZSBSQVcxMzk0X0lPQ19JU09fUVVFVUVfQUNUSVZJVFk6Ci0JCWVyciA9IGRvX3JhdzEzOTRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQllcnIgPSByYXcxMzk0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKIAkJYnJlYWs7CiAJLyogVGhlc2UgcmVxdWVzdCBoYXZlIGRpZmZlcmVudCBmb3JtYXQuICovCiAJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9QQUNLRVRTMzI6CkBAIC0yNzU3LDcgKzI3ODEsNiBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI3OTEsNiArMjgxNCw3IEBACiAJZmktPm5vdGlmaWNhdGlvbiA9ICh1OCkgUkFXMTM5NF9OT1RJRllfT047CS8qIGJ1c3Jlc2V0IG5vdGlmaWNhdGlvbiAqLwogCiAJSU5JVF9MSVNUX0hFQUQoJmZpLT5saXN0KTsKKwltdXRleF9pbml0KCZmaS0+c3RhdGVfbXV0ZXgpOwogCWZpLT5zdGF0ZSA9IG9wZW5lZDsKIAlJTklUX0xJU1RfSEVBRCgmZmktPnJlcV9wZW5kaW5nKTsKIAlJTklUX0xJU1RfSEVBRCgmZmktPnJlcV9jb21wbGV0ZSk7CkBAIC0zMDEwLDEwICszMDM0LDEwIEBACiAJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJnJhdzEzOTRfaGlnaGxldmVsKTsKIAogCWlmIChJU19FUlIKLQkgICAgKGRldmljZV9jcmVhdGVfZHJ2ZGF0YSgKLQkgICAgICBocHNiX3Byb3RvY29sX2NsYXNzLCBOVUxMLAotCSAgICAgIE1LREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19SQVcxMzk0ICogMTYpLAotCSAgICAgIE5VTEwsIFJBVzEzOTRfREVWSUNFX05BTUUpKSkgeworCSAgICAoZGV2aWNlX2NyZWF0ZShocHNiX3Byb3RvY29sX2NsYXNzLCBOVUxMLAorCQkJICAgTUtERVYoSUVFRTEzOTRfTUFKT1IsCisJCQkJIElFRUUxMzk0X01JTk9SX0JMT0NLX1JBVzEzOTQgKiAxNiksCisJCQkgICBOVUxMLCBSQVcxMzk0X0RFVklDRV9OQU1FKSkpIHsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBvdXRfdW5yZWc7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwppbmRleCAxZDZhZDM0Li5jNTJmNmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwpAQCAtNTI2LDI2ICs1MjYsNDEgQEAKIAogc3RhdGljIGludCBzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2JwMl9sdSAqbHUpCiB7Ci0Jc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOwogCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kOworCXN0cnVjdCBkZXZpY2UgKmRtYWRldiA9IGx1LT5oaS0+aG9zdC0+ZGV2aWNlLnBhcmVudDsKIAlpbnQgaSwgb3JicyA9IHNicDJfc2VyaWFsaXplX2lvID8gMiA6IFNCUDJfTUFYX0NNRFM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgb3JiczsgaSsrKSB7CiAJCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjbWQpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJY21kLT5jb21tYW5kX29yYl9kbWEgPSBkbWFfbWFwX3NpbmdsZShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKLQkJCQkJCSZjbWQtPmNvbW1hbmRfb3JiLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKLQkJCQkJCURNQV9UT19ERVZJQ0UpOwotCQljbWQtPnNnZV9kbWEgPSBkbWFfbWFwX3NpbmdsZShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKLQkJCQkJJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCwKLQkJCQkJc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJCURNQV9UT19ERVZJQ0UpOworCQkJZ290byBmYWlsZWRfYWxsb2M7CisKKwkJY21kLT5jb21tYW5kX29yYl9kbWEgPQorCQkgICAgZG1hX21hcF9zaW5nbGUoZG1hZGV2LCAmY21kLT5jb21tYW5kX29yYiwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZG1hZGV2LCBjbWQtPmNvbW1hbmRfb3JiX2RtYSkpCisJCQlnb3RvIGZhaWxlZF9vcmI7CisKKwkJY21kLT5zZ2VfZG1hID0KKwkJICAgIGRtYV9tYXBfc2luZ2xlKGRtYWRldiwgJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCwKKwkJCQkgICBzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKKwkJCQkgICBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRtYWRldiwgY21kLT5zZ2VfZG1hKSkKKwkJCWdvdG8gZmFpbGVkX3NnZTsKKwogCQlJTklUX0xJU1RfSEVBRCgmY21kLT5saXN0KTsKIAkJbGlzdF9hZGRfdGFpbCgmY21kLT5saXN0LCAmbHUtPmNtZF9vcmJfY29tcGxldGVkKTsKIAl9CiAJcmV0dXJuIDA7CisKK2ZhaWxlZF9zZ2U6CisJZG1hX3VubWFwX3NpbmdsZShkbWFkZXYsIGNtZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksIERNQV9UT19ERVZJQ0UpOworZmFpbGVkX29yYjoKKwlrZnJlZShjbWQpOworZmFpbGVkX2FsbG9jOgorCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBzYnAydXRpbF9yZW1vdmVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2JwMl9sdSAqbHUsCkBAIC02NDEsMjQgKzY1NiwxMSBAQAogc3RhdGljIHZvaWQgc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChzdHJ1Y3Qgc2JwMl9sdSAqbHUsCiAJCQkJCSAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZCkKIHsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gbHUtPnVkLT5uZS0+aG9zdDsKLQotCWlmIChjbWQtPmNtZF9kbWEpIHsKLQkJaWYgKGNtZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9TSU5HTEUpCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPmRldmljZS5wYXJlbnQsIGNtZC0+Y21kX2RtYSwKLQkJCQkJIGNtZC0+ZG1hX3NpemUsIGNtZC0+ZG1hX2Rpcik7Ci0JCWVsc2UgaWYgKGNtZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9QQUdFKQotCQkJZG1hX3VubWFwX3BhZ2UoaG9zdC0+ZGV2aWNlLnBhcmVudCwgY21kLT5jbWRfZG1hLAotCQkJCSAgICAgICBjbWQtPmRtYV9zaXplLCBjbWQtPmRtYV9kaXIpOwotCQkvKiBYWFg6IENoZWNrIGZvciBDTURfRE1BX05PTkUgYnVnICovCi0JCWNtZC0+ZG1hX3R5cGUgPSBDTURfRE1BX05PTkU7Ci0JCWNtZC0+Y21kX2RtYSA9IDA7Ci0JfQotCWlmIChjbWQtPnNnZV9idWZmZXIpIHsKLQkJZG1hX3VubWFwX3NnKGhvc3QtPmRldmljZS5wYXJlbnQsIGNtZC0+c2dlX2J1ZmZlciwKLQkJCSAgICAgY21kLT5kbWFfc2l6ZSwgY21kLT5kbWFfZGlyKTsKLQkJY21kLT5zZ2VfYnVmZmVyID0gTlVMTDsKLQl9CisJaWYgKHNjc2lfc2dfY291bnQoY21kLT5DdXJyZW50X1NDcG50KSkKKwkJZG1hX3VubWFwX3NnKGx1LT51ZC0+bmUtPmhvc3QtPmRldmljZS5wYXJlbnQsCisJCQkgICAgIHNjc2lfc2dsaXN0KGNtZC0+Q3VycmVudF9TQ3BudCksCisJCQkgICAgIHNjc2lfc2dfY291bnQoY21kLT5DdXJyZW50X1NDcG50KSwKKwkJCSAgICAgY21kLT5DdXJyZW50X1NDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CiAJbGlzdF9tb3ZlX3RhaWwoJmNtZC0+bGlzdCwgJmx1LT5jbWRfb3JiX2NvbXBsZXRlZCk7CiB9CiAKQEAgLTgyMyw2ICs4MjUsMTAgQEAKICNlbmRpZgogCX0KIAorCWlmIChkbWFfZ2V0X21heF9zZWdfc2l6ZShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCkgPiBTQlAyX01BWF9TRUdfU0laRSkKKwkJQlVHX09OKGRtYV9zZXRfbWF4X3NlZ19zaXplKGhpLT5ob3N0LT5kZXZpY2UucGFyZW50LAorCQkJCQkgICAgU0JQMl9NQVhfU0VHX1NJWkUpKTsKKwogCS8qIFByZXZlbnQgdW5sb2FkaW5nIG9mIHRoZSAxMzk0IGhvc3QgKi8KIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KGhpLT5ob3N0LT5kcml2ZXItPm93bmVyKSkgewogCQlTQlAyX0VSUigiZmFpbGVkIHRvIGdldCBhIHJlZmVyZW5jZSBvbiAxMzk0IGhvc3QgZHJpdmVyIik7CkBAIC0xNDk0LDg0ICsxNTAwLDY1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNicDJfcHJlcF9jb21tYW5kX29yYl9zZyhzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqb3JiLAotCQkJCSAgICAgc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpLAotCQkJCSAgICAgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgc2NzaV91c2Vfc2csCi0JCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCSAgICAgdTMyIG9yYl9kaXJlY3Rpb24sCi0JCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyKQorc3RhdGljIGludCBzYnAyX3ByZXBfY29tbWFuZF9vcmJfc2coc3RydWN0IHNicDJfY29tbWFuZF9vcmIgKm9yYiwKKwkJCQkgICAgc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpLAorCQkJCSAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNnX2NvdW50LAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICB1MzIgb3JiX2RpcmVjdGlvbiwKKwkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcikKIHsKLQljbWQtPmRtYV9kaXIgPSBkbWFfZGlyOworCXN0cnVjdCBkZXZpY2UgKmRtYWRldiA9IGhpLT5ob3N0LT5kZXZpY2UucGFyZW50OworCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlICpwdDsKKwlpbnQgaSwgbjsKKworCW4gPSBkbWFfbWFwX3NnKGRtYWRldiwgc2csIHNnX2NvdW50LCBkbWFfZGlyKTsKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2hpID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKIAlvcmItPm1pc2MgfD0gT1JCX1NFVF9ESVJFQ1RJT04ob3JiX2RpcmVjdGlvbik7CiAKIAkvKiBzcGVjaWFsIGNhc2UgaWYgb25seSBvbmUgZWxlbWVudCAoYW5kIGxlc3MgdGhhbiA2NEtCIGluIHNpemUpICovCi0JaWYgKHNjc2lfdXNlX3NnID09IDEgJiYgc2ctPmxlbmd0aCA8PSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCkgewotCi0JCWNtZC0+ZG1hX3NpemUgPSBzZy0+bGVuZ3RoOwotCQljbWQtPmRtYV90eXBlID0gQ01EX0RNQV9QQUdFOwotCQljbWQtPmNtZF9kbWEgPSBkbWFfbWFwX3BhZ2UoaGktPmhvc3QtPmRldmljZS5wYXJlbnQsCi0JCQkJCSAgICBzZ19wYWdlKHNnKSwgc2ctPm9mZnNldCwKLQkJCQkJICAgIGNtZC0+ZG1hX3NpemUsIGNtZC0+ZG1hX2Rpcik7Ci0KLQkJb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSBjbWQtPmNtZF9kbWE7Ci0JCW9yYi0+bWlzYyB8PSBPUkJfU0VUX0RBVEFfU0laRShjbWQtPmRtYV9zaXplKTsKLQorCWlmIChuID09IDEpIHsKKwkJb3JiLT5taXNjIHw9IE9SQl9TRVRfREFUQV9TSVpFKHNnX2RtYV9sZW4oc2cpKTsKKwkJb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSBzZ19kbWFfYWRkcmVzcyhzZyk7CiAJfSBlbHNlIHsKLQkJc3RydWN0IHNicDJfdW5yZXN0cmljdGVkX3BhZ2VfdGFibGUgKnNnX2VsZW1lbnQgPQotCQkJCQkJJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudFswXTsKLQkJdTMyIHNnX2NvdW50LCBzZ19sZW47Ci0JCWRtYV9hZGRyX3Qgc2dfYWRkcjsKLQkJaW50IGksIGNvdW50ID0gZG1hX21hcF9zZyhoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwgc2csCi0JCQkJCSAgc2NzaV91c2Vfc2csIGRtYV9kaXIpOworCQlwdCA9ICZjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbMF07CiAKLQkJY21kLT5kbWFfc2l6ZSA9IHNjc2lfdXNlX3NnOwotCQljbWQtPnNnZV9idWZmZXIgPSBzZzsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZG1hZGV2LCBjbWQtPnNnZV9kbWEsCisJCQkJCXNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQlETUFfVE9fREVWSUNFKTsKIAotCQkvKiB1c2UgcGFnZSB0YWJsZXMgKHMvZykgKi8KLQkJb3JiLT5taXNjIHw9IE9SQl9TRVRfUEFHRV9UQUJMRV9QUkVTRU5UKDB4MSk7Ci0JCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY21kLT5zZ2VfZG1hOwotCi0JCS8qIGxvb3AgdGhyb3VnaCBhbmQgZmlsbCBvdXQgb3VyIFNCUC0yIHBhZ2UgdGFibGVzCi0JCSAqIChhbmQgc3BsaXQgdXAgYW55dGhpbmcgdG9vIGxhcmdlKSAqLwotCQlmb3IgKGkgPSAwLCBzZ19jb3VudCA9IDA7IGkgPCBjb3VudDsgaSsrLCBzZyA9IHNnX25leHQoc2cpKSB7Ci0JCQlzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKLQkJCXNnX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7Ci0JCQl3aGlsZSAoc2dfbGVuKSB7Ci0JCQkJc2dfZWxlbWVudFtzZ19jb3VudF0uc2VnbWVudF9iYXNlX2xvID0gc2dfYWRkcjsKLQkJCQlpZiAoc2dfbGVuID4gU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgpIHsKLQkJCQkJc2dfZWxlbWVudFtzZ19jb3VudF0ubGVuZ3RoX3NlZ21lbnRfYmFzZV9oaSA9Ci0JCQkJCQlQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0xFTkdUSChTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCk7Ci0JCQkJCXNnX2FkZHIgKz0gU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEg7Ci0JCQkJCXNnX2xlbiAtPSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSDsKLQkJCQl9IGVsc2UgewotCQkJCQlzZ19lbGVtZW50W3NnX2NvdW50XS5sZW5ndGhfc2VnbWVudF9iYXNlX2hpID0KLQkJCQkJCVBBR0VfVEFCTEVfU0VUX1NFR01FTlRfTEVOR1RIKHNnX2xlbik7Ci0JCQkJCXNnX2xlbiA9IDA7Ci0JCQkJfQotCQkJCXNnX2NvdW50Kys7Ci0JCQl9CisJCWZvcl9lYWNoX3NnKHNnLCBzZywgbiwgaSkgeworCQkJcHRbaV0uaGlnaCA9IGNwdV90b19iZTMyKHNnX2RtYV9sZW4oc2cpIDw8IDE2KTsKKwkJCXB0W2ldLmxvdyA9IGNwdV90b19iZTMyKHNnX2RtYV9hZGRyZXNzKHNnKSk7CiAJCX0KIAotCQlvcmItPm1pc2MgfD0gT1JCX1NFVF9EQVRBX1NJWkUoc2dfY291bnQpOworCQlvcmItPm1pc2MgfD0gT1JCX1NFVF9QQUdFX1RBQkxFX1BSRVNFTlQoMHgxKSB8CisJCQkgICAgIE9SQl9TRVRfREFUQV9TSVpFKG4pOworCQlvcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IGNtZC0+c2dlX2RtYTsKIAotCQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2dfZWxlbWVudCwKLQkJCQkoc2l6ZW9mKHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlKSkgKgotCQkJCXNnX2NvdW50KTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZG1hZGV2LCBjbWQtPnNnZV9kbWEsCisJCQkJCSAgIHNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQkgICBETUFfVE9fREVWSUNFKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNicDJfY3JlYXRlX2NvbW1hbmRfb3JiKHN0cnVjdCBzYnAyX2x1ICpsdSwKLQkJCQkgICAgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQsCi0JCQkJICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQorc3RhdGljIGludCBzYnAyX2NyZWF0ZV9jb21tYW5kX29yYihzdHJ1Y3Qgc2JwMl9sdSAqbHUsCisJCQkJICAgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQsCisJCQkJICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7Ci0Jc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOworCXN0cnVjdCBkZXZpY2UgKmRtYWRldiA9IGx1LT5oaS0+aG9zdC0+ZGV2aWNlLnBhcmVudDsKIAlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqb3JiID0gJmNtZC0+Y29tbWFuZF9vcmI7Ci0JdTMyIG9yYl9kaXJlY3Rpb247CiAJdW5zaWduZWQgaW50IHNjc2lfcmVxdWVzdF9idWZmbGVuID0gc2NzaV9idWZmbGVuKFNDcG50KTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOworCXUzMiBvcmJfZGlyZWN0aW9uOworCWludCByZXQ7CiAKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkbWFkZXYsIGNtZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCXNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksIERNQV9UT19ERVZJQ0UpOwogCS8qCiAJICogU2V0LXVwIG91ciBjb21tYW5kIE9SQi4KIAkgKgpAQCAtMTYwMiwxNSArMTU4OSwyMSBAQAogCQlvcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IDB4MDsKIAkJb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSAweDA7CiAJCW9yYi0+bWlzYyB8PSBPUkJfU0VUX0RJUkVDVElPTigxKTsKLQl9IGVsc2UKLQkJc2JwMl9wcmVwX2NvbW1hbmRfb3JiX3NnKG9yYiwgaGksIGNtZCwgc2NzaV9zZ19jb3VudChTQ3BudCksCi0JCQkJCSBzY3NpX3NnbGlzdChTQ3BudCksCi0JCQkJCSBvcmJfZGlyZWN0aW9uLCBkbWFfZGlyKTsKLQorCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IHNicDJfcHJlcF9jb21tYW5kX29yYl9zZyhvcmIsIGx1LT5oaSwgY21kLAorCQkJCQkgICAgICAgc2NzaV9zZ19jb3VudChTQ3BudCksCisJCQkJCSAgICAgICBzY3NpX3NnbGlzdChTQ3BudCksCisJCQkJCSAgICAgICBvcmJfZGlyZWN0aW9uLCBkbWFfZGlyKTsKKwl9CiAJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKG9yYiwgc2l6ZW9mKCpvcmIpKTsKIAogCW1lbXNldChvcmItPmNkYiwgMCwgc2l6ZW9mKG9yYi0+Y2RiKSk7CiAJbWVtY3B5KG9yYi0+Y2RiLCBTQ3BudC0+Y21uZCwgU0NwbnQtPmNtZF9sZW4pOworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZG1hZGV2LCBjbWQtPmNvbW1hbmRfb3JiX2RtYSwKKwkJCXNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksIERNQV9UT19ERVZJQ0UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNicDJfbGlua19vcmJfY29tbWFuZChzdHJ1Y3Qgc2JwMl9sdSAqbHUsCkBAIC0xNjI0LDE0ICsxNjE3LDYgQEAKIAlzaXplX3QgbGVuZ3RoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKLQkJCQkgICBjbWQtPmNvbW1hbmRfb3JiX2RtYSwKLQkJCQkgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAotCQkJCSAgIERNQV9UT19ERVZJQ0UpOwotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhpLT5ob3N0LT5kZXZpY2UucGFyZW50LCBjbWQtPnNnZV9kbWEsCi0JCQkJICAgc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJICAgRE1BX1RPX0RFVklDRSk7Ci0KIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBwcmV2aW91cyBvcmJzIHRvIHVzZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CiAJbGFzdF9vcmIgPSBsdS0+bGFzdF9vcmI7CkBAIC0xNjk5LDkgKzE2ODQsMTAgQEAKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FSU87CiAKLQlzYnAyX2NyZWF0ZV9jb21tYW5kX29yYihsdSwgY21kLCBTQ3BudCk7Ci0Jc2JwMl9saW5rX29yYl9jb21tYW5kKGx1LCBjbWQpOworCWlmIChzYnAyX2NyZWF0ZV9jb21tYW5kX29yYihsdSwgY21kLCBTQ3BudCkpCisJCXJldHVybiAtRU5PTUVNOwogCisJc2JwMl9saW5rX29yYl9jb21tYW5kKGx1LCBjbWQpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzg5LDEzICsxNzc1LDYgQEAKIAllbHNlCiAJCWNtZCA9IHNicDJ1dGlsX2ZpbmRfY29tbWFuZF9mb3Jfb3JiKGx1LCBzYi0+T1JCX29mZnNldF9sbyk7CiAJaWYgKGNtZCkgewotCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKLQkJCQkJY21kLT5jb21tYW5kX29yYl9kbWEsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJCURNQV9UT19ERVZJQ0UpOwotCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwgY21kLT5zZ2VfZG1hLAotCQkJCQlzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKLQkJCQkJRE1BX1RPX0RFVklDRSk7CiAJCS8qIEdyYWIgU0NTSSBjb21tYW5kIHBvaW50ZXJzIGFuZCBjaGVjayBzdGF0dXMuICovCiAJCS8qCiAJCSAqIEZJWE1FOiBJZiB0aGUgc3JjIGZpZWxkIGluIHRoZSBzdGF0dXMgaXMgMSwgdGhlIE9SQiBETUEgbXVzdApAQCAtMTkxMiw3ICsxODkxLDYgQEAKIAogc3RhdGljIHZvaWQgc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHN0cnVjdCBzYnAyX2x1ICpsdSwgdTMyIHN0YXR1cykKIHsKLQlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGkgPSBsdS0+aGk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGg7CiAJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE5MjEsMTMgKzE4OTksNiBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmbHUtPmNtZF9vcmJfaW51c2UpKSB7CiAJCWxoID0gbHUtPmNtZF9vcmJfaW51c2UubmV4dDsKIAkJY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvLCBsaXN0KTsKLQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPmRldmljZS5wYXJlbnQsCi0JCQkJICAgICAgICBjbWQtPmNvbW1hbmRfb3JiX2RtYSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKLQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0JCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhpLT5ob3N0LT5kZXZpY2UucGFyZW50LCBjbWQtPnNnZV9kbWEsCi0JCQkJCXNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAotCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChsdSwgY21kKTsKIAkJaWYgKGNtZC0+Q3VycmVudF9TQ3BudCkgewogCQkJY21kLT5DdXJyZW50X1NDcG50LT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7CkBAIC0yMDMzLDYgKzIwMDQsOCBAQAogCQlzZGV2LT5zdGFydF9zdG9wX3B3cl9jb25kID0gMTsKIAlpZiAobHUtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EXzEyOEtfTUFYX1RSQU5TKQogCQlibGtfcXVldWVfbWF4X3NlY3RvcnMoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgMTI4ICogMTAyNCAvIDUxMik7CisKKwlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBTQlAyX01BWF9TRUdfU0laRSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNDksNyArMjAyMiw2IEBACiBzdGF0aWMgaW50IHNicDJzY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXN0cnVjdCBzYnAyX2x1ICpsdSA9IChzdHJ1Y3Qgc2JwMl9sdSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOwotCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yMDYzLDE0ICsyMDM1LDYgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAkJY21kID0gc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9TQ3BudChsdSwgU0NwbnQpOwogCQlpZiAoY21kKSB7Ci0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKLQkJCQkJY21kLT5jb21tYW5kX29yYl9kbWEsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJCURNQV9UT19ERVZJQ0UpOwotCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPmRldmljZS5wYXJlbnQsCi0JCQkJCWNtZC0+c2dlX2RtYSwKLQkJCQkJc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJCURNQV9UT19ERVZJQ0UpOwogCQkJc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChsdSwgY21kKTsKIAkJCWlmIChjbWQtPkN1cnJlbnRfU0NwbnQpIHsKIAkJCQljbWQtPkN1cnJlbnRfU0NwbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5oIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKaW5kZXggODc1NDI4Yi4uYzUwMzZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKQEAgLTEzOSwxMyArMTM5LDEwIEBACiAJdTMyIHN0YXR1c19maWZvX2xvOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0JBU0VfSEkodikJKCh2KSAmIDB4ZmZmZikKLSNkZWZpbmUgUEFHRV9UQUJMRV9TRVRfU0VHTUVOVF9MRU5HVEgodikJKCgodikgJiAweGZmZmYpIDw8IDE2KQotCiBzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZSB7Ci0JdTMyIGxlbmd0aF9zZWdtZW50X2Jhc2VfaGk7Ci0JdTMyIHNlZ21lbnRfYmFzZV9sbzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJX19iZTMyIGhpZ2g7CisJX19iZTMyIGxvdzsKK307CiAKICNkZWZpbmUgUkVTUF9TVEFUVVNfUkVRVUVTVF9DT01QTEVURQkJMHgwCiAjZGVmaW5lIFJFU1BfU1RBVFVTX1RSQU5TUE9SVF9GQUlMVVJFCQkweDEKQEAgLTIxNiwxNSArMjEzLDE4IEBACiAjZGVmaW5lIFNCUDJfVU5JVF9TUEVDX0lEX0VOVFJZCQkJMHgwMDAwNjA5ZQogI2RlZmluZSBTQlAyX1NXX1ZFUlNJT05fRU5UUlkJCQkweDAwMDEwNDgzCiAKKy8qCisgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIHMvZyBzZWdtZW50IHNpemUgb2YgYSBGaXJlV2lyZSBjb250cm9sbGVyIGlzCisgKiB1c3VhbGx5IDB4MTAwMDAsIGJ1dCBTQlAtMiBvbmx5IGFsbG93cyAweGZmZmYuIFNpbmNlIGJ1ZmZlcnMgaGF2ZSB0bworICogYmUgcXVhZGxldC1hbGlnbmVkLCB3ZSBzZXQgdGhlIGxlbmd0aCBsaW1pdCB0byAweGZmZmYgJiB+My4KKyAqLworI2RlZmluZSBTQlAyX01BWF9TRUdfU0laRQkJCTB4ZmZmYwogCiAvKgotICogU0NTSSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICovCi0KLSNkZWZpbmUgU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgJCTB4ZjAwMAotLyogVGhlcmUgaXMgbm8gcmVhbCBsaW1pdGF0aW9uIG9mIHRoZSBxdWV1ZSBkZXB0aCAoaS5lLiBsZW5ndGggb2YgdGhlIGxpbmtlZAorICogVGhlcmUgaXMgbm8gcmVhbCBsaW1pdGF0aW9uIG9mIHRoZSBxdWV1ZSBkZXB0aCAoaS5lLiBsZW5ndGggb2YgdGhlIGxpbmtlZAogICogbGlzdCBvZiBjb21tYW5kIE9SQnMpIGF0IHRoZSB0YXJnZXQuIFRoZSBjaG9zZW4gZGVwdGggaXMgbWVyZWx5IGFuCi0gKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdGhlIHNicDIgZHJpdmVyLiAqLworICogaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBzYnAyIGRyaXZlci4KKyAqLwogI2RlZmluZSBTQlAyX01BWF9DTURTCQkJCTgKIAogI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0dPT0QJCQkweDAKQEAgLTI0MCwxMiArMjQwLDYgQEAKICAqIFJlcHJlc2VudGF0aW9ucyBvZiBjb21tYW5kcyBhbmQgZGV2aWNlcwogICovCiAKLWVudW0gc2JwMl9kbWFfdHlwZXMgewotCUNNRF9ETUFfTk9ORSwKLQlDTURfRE1BX1BBR0UsCi0JQ01EX0RNQV9TSU5HTEUKLX07Ci0KIC8qIFBlciBTQ1NJIGNvbW1hbmQgKi8KIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMjU4LDExICsyNTIsNiBAQAogCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlCiAJCXNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbU0dfQUxMXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiAJZG1hX2FkZHJfdCBzZ2VfZG1hOwotCXZvaWQgKnNnZV9idWZmZXI7Ci0JZG1hX2FkZHJfdCBjbWRfZG1hOwotCWVudW0gc2JwMl9kbWFfdHlwZXMgZG1hX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBkbWFfc2l6ZTsKLQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyOwogfTsKIAogLyogUGVyIEZpcmVXaXJlIGhvc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCmluZGV4IDI1ZGI2ZTYuLjY3OWE5MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwpAQCAtODkzLDcgKzg5Myw3IEBACiAJCWlmICh1bmxpa2VseShkID09IE5VTEwpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJaWYgKHVubGlrZWx5KCh2LmJ1ZmZlcjwwKSB8fCAodi5idWZmZXI+PWQtPm51bV9kZXNjIC0gMSkpKSB7CisJCWlmICh1bmxpa2VseSh2LmJ1ZmZlciA+PSBkLT5udW1fZGVzYyAtIDEpKSB7CiAJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCiAJCQkgICAgICAiQnVmZmVyICVkIG91dCBvZiByYW5nZSIsdi5idWZmZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC05NTksNyArOTU5LDcgQEAKIAkJaWYgKHVubGlrZWx5KGQgPT0gTlVMTCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlpZiAodW5saWtlbHkoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj5kLT5udW1fZGVzYyAtIDEpKSkgeworCQlpZiAodW5saWtlbHkodi5idWZmZXIgPiBkLT5udW1fZGVzYyAtIDEpKSB7CiAJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCiAJCQkgICAgICAiQnVmZmVyICVkIG91dCBvZiByYW5nZSIsdi5idWZmZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDMwLDcgKzEwMzAsNyBAQAogCQlkID0gZmluZF9jdHgoJmN0eC0+Y29udGV4dF9saXN0LCBPSENJX0lTT19UUkFOU01JVCwgdi5jaGFubmVsKTsKIAkJaWYgKGQgPT0gTlVMTCkgcmV0dXJuIC1FRkFVTFQ7CiAKLQkJaWYgKCh2LmJ1ZmZlcjwwKSB8fCAodi5idWZmZXI+PWQtPm51bV9kZXNjIC0gMSkpIHsKKwkJaWYgKHYuYnVmZmVyID49IGQtPm51bV9kZXNjIC0gMSkgewogCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAogCQkJICAgICAgIkJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2UiLHYuYnVmZmVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKIAkJZCA9IGZpbmRfY3R4KCZjdHgtPmNvbnRleHRfbGlzdCwgT0hDSV9JU09fVFJBTlNNSVQsIHYuY2hhbm5lbCk7CiAJCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOwogCi0JCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPj1kLT5udW1fZGVzYy0xKSkgeworCQlpZiAodi5idWZmZXIgPj0gZC0+bnVtX2Rlc2MgLSAxKSB7CiAJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCiAJCQkgICAgICAiQnVmZmVyICVkIG91dCBvZiByYW5nZSIsdi5idWZmZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzQxLDkgKzEzNDEsOCBAQAogCWhwc2Jfc2V0X2hvc3RpbmZvX2tleSgmdmlkZW8xMzk0X2hpZ2hsZXZlbCwgaG9zdCwgb2hjaS0+aG9zdC0+aWQpOwogCiAJbWlub3IgPSBJRUVFMTM5NF9NSU5PUl9CTE9DS19WSURFTzEzOTQgKiAxNiArIG9oY2ktPmhvc3QtPmlkOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShocHNiX3Byb3RvY29sX2NsYXNzLCBOVUxMLAotCQkJICAgICAgTUtERVYoSUVFRTEzOTRfTUFKT1IsIG1pbm9yKSwgTlVMTCwKLQkJCSAgICAgICIlcy0lZCIsIFZJREVPMTM5NF9EUklWRVJfTkFNRSwgb2hjaS0+aG9zdC0+aWQpOworCWRldmljZV9jcmVhdGUoaHBzYl9wcm90b2NvbF9jbGFzcywgTlVMTCwgTUtERVYoSUVFRTEzOTRfTUFKT1IsIG1pbm9yKSwKKwkJICAgICAgTlVMTCwgIiVzLSVkIiwgVklERU8xMzk0X0RSSVZFUl9OQU1FLCBvaGNpLT5ob3N0LT5pZCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggOTIyZDM1Zi4uYTc4ZDM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0zNjkxLDkgKzM2OTEsOSBAQAogCWNtX2Rldi0+aWJfZGV2aWNlID0gaWJfZGV2aWNlOwogCWNtX2dldF9hY2tfZGVsYXkoY21fZGV2KTsKIAotCWNtX2Rldi0+ZGV2aWNlID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKCZjbV9jbGFzcywgJmliX2RldmljZS0+ZGV2LAotCQkJCQkgICAgICAgTUtERVYoMCwgMCksIE5VTEwsCi0JCQkJCSAgICAgICAiJXMiLCBpYl9kZXZpY2UtPm5hbWUpOworCWNtX2Rldi0+ZGV2aWNlID0gZGV2aWNlX2NyZWF0ZSgmY21fY2xhc3MsICZpYl9kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgTUtERVYoMCwgMCksIE5VTEwsCisJCQkJICAgICAgICIlcyIsIGliX2RldmljZS0+bmFtZSk7CiAJaWYgKCFjbV9kZXYtPmRldmljZSkgewogCQlrZnJlZShjbV9kZXYpOwogCQlyZXR1cm47CkBAIC0zNzQ4LDYgKzM3NDgsNyBAQAogCQljbV9yZW1vdmVfcG9ydF9mcyhwb3J0KTsKIAl9CiAJZGV2aWNlX3VucmVnaXN0ZXIoY21fZGV2LT5kZXZpY2UpOworCWtmcmVlKGNtX2Rldik7CiB9CiAKIHN0YXRpYyB2b2lkIGNtX3JlbW92ZV9vbmUoc3RydWN0IGliX2RldmljZSAqaWJfZGV2aWNlKQpAQCAtMzc3Niw2ICszNzc3LDcgQEAKIAkJY21fcmVtb3ZlX3BvcnRfZnMocG9ydCk7CiAJfQogCWRldmljZV91bnJlZ2lzdGVyKGNtX2Rldi0+ZGV2aWNlKTsKKwlrZnJlZShjbV9kZXYpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpYl9jbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCmluZGV4IDFhZGYyZWYuLjQ5YzQ1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCkBAIC0xNjk3LDkgKzE2OTcsOCBAQAogCXU4IHBvcnRfbnVtID0gbWFkX2FnZW50X3ByaXYtPmFnZW50LnBvcnRfbnVtOwogCXU4IGxtYzsKIAotCXNlbmRfcmVzcCA9ICgoc3RydWN0IGliX21hZCAqKSh3ci0+c2VuZF9idWYubWFkKSktPgotCQkgICAgIG1hZF9oZHIubWV0aG9kICYgSUJfTUdNVF9NRVRIT0RfUkVTUDsKLQlyY3ZfcmVzcCA9IHJ3Yy0+cmVjdl9idWYubWFkLT5tYWRfaGRyLm1ldGhvZCAmIElCX01HTVRfTUVUSE9EX1JFU1A7CisJc2VuZF9yZXNwID0gaWJfcmVzcG9uc2VfbWFkKChzdHJ1Y3QgaWJfbWFkICopd3ItPnNlbmRfYnVmLm1hZCk7CisJcmN2X3Jlc3AgPSBpYl9yZXNwb25zZV9tYWQocndjLT5yZWN2X2J1Zi5tYWQpOwogCiAJaWYgKHNlbmRfcmVzcCA9PSByY3ZfcmVzcCkKIAkJLyogYm90aCByZXF1ZXN0cywgb3IgYm90aCByZXNwb25zZXMuIEdJRHMgZGlmZmVyZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYwppbmRleCAyNjhhMmQyLi44YzQ2ZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKQEAgLTEwMTYsOSArMTAxNiw5IEBACiAJaWYgKGNkZXZfYWRkKHBvcnQtPmNkZXYsIGJhc2VfZGV2ICsgcG9ydC0+ZGV2X251bSwgMSkpCiAJCWdvdG8gZXJyX2NkZXY7CiAKLQlwb3J0LT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodW1hZF9jbGFzcywgZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCQkgIHBvcnQtPmNkZXYtPmRldiwgcG9ydCwKLQkJCQkJICAidW1hZCVkIiwgcG9ydC0+ZGV2X251bSk7CisJcG9ydC0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh1bWFkX2NsYXNzLCBkZXZpY2UtPmRtYV9kZXZpY2UsCisJCQkJICBwb3J0LT5jZGV2LT5kZXYsIHBvcnQsCisJCQkJICAidW1hZCVkIiwgcG9ydC0+ZGV2X251bSk7CiAJaWYgKElTX0VSUihwb3J0LT5kZXYpKQogCQlnb3RvIGVycl9jZGV2OwogCkBAIC0xMDM2LDkgKzEwMzYsOSBAQAogCWlmIChjZGV2X2FkZChwb3J0LT5zbV9jZGV2LCBiYXNlX2RldiArIHBvcnQtPmRldl9udW0gKyBJQl9VTUFEX01BWF9QT1JUUywgMSkpCiAJCWdvdG8gZXJyX3NtX2NkZXY7CiAKLQlwb3J0LT5zbV9kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodW1hZF9jbGFzcywgZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCQkgICAgIHBvcnQtPnNtX2NkZXYtPmRldiwgcG9ydCwKLQkJCQkJICAgICAiaXNzbSVkIiwgcG9ydC0+ZGV2X251bSk7CisJcG9ydC0+c21fZGV2ID0gZGV2aWNlX2NyZWF0ZSh1bWFkX2NsYXNzLCBkZXZpY2UtPmRtYV9kZXZpY2UsCisJCQkJICAgICBwb3J0LT5zbV9jZGV2LT5kZXYsIHBvcnQsCisJCQkJICAgICAiaXNzbSVkIiwgcG9ydC0+ZGV2X251bSk7CiAJaWYgKElTX0VSUihwb3J0LT5zbV9kZXYpKQogCQlnb3RvIGVycl9zbV9jZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCBhZWVlODU2Li5kODVhZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTc2NCwxMiArNzY0LDkgQEAKIAlpZiAoY2Rldl9hZGQodXZlcmJzX2Rldi0+Y2RldiwgSUJfVVZFUkJTX0JBU0VfREVWICsgdXZlcmJzX2Rldi0+ZGV2bnVtLCAxKSkKIAkJZ290byBlcnJfY2RldjsKIAotCXV2ZXJic19kZXYtPmRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YSh1dmVyYnNfY2xhc3MsCi0JCQkJCQlkZXZpY2UtPmRtYV9kZXZpY2UsCi0JCQkJCQl1dmVyYnNfZGV2LT5jZGV2LT5kZXYsCi0JCQkJCQl1dmVyYnNfZGV2LAotCQkJCQkJInV2ZXJicyVkIiwKLQkJCQkJCXV2ZXJic19kZXYtPmRldm51bSk7CisJdXZlcmJzX2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh1dmVyYnNfY2xhc3MsIGRldmljZS0+ZG1hX2RldmljZSwKKwkJCQkJdXZlcmJzX2Rldi0+Y2Rldi0+ZGV2LCB1dmVyYnNfZGV2LAorCQkJCQkidXZlcmJzJWQiLCB1dmVyYnNfZGV2LT5kZXZudW0pOwogCWlmIChJU19FUlIodXZlcmJzX2Rldi0+ZGV2KSkKIAkJZ290byBlcnJfY2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYwppbmRleCAyYWNmOWI2Li42OTU4MGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYwpAQCAtMjcyLDcgKzI3Miw2IEBACiAJCXByX2RlYnVnKCIlczogSW52YWxpZCBRUCB0eXBlOiAlZFxuIiwgX19mdW5jX18sCiAJCQlpbml0X2F0dHItPnFwX3R5cGUpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQkJYnJlYWs7CiAJfQogCiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKaW5kZXggZWI3NzhiZmQuLmVjZmY5ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYwpAQCAtMTE1NSwxMyArMTE1NSwxMSBAQAogCQkJICAgdTggcG9ydCwgc3RydWN0IGliX3BvcnRfYXR0ciAqcHJvcHMpCiB7CiAJUERCRygiJXMgaWJkZXYgJXBcbiIsIF9fZnVuY19fLCBpYmRldik7CisKKwltZW1zZXQocHJvcHMsIDAsIHNpemVvZihzdHJ1Y3QgaWJfcG9ydF9hdHRyKSk7CiAJcHJvcHMtPm1heF9tdHUgPSBJQl9NVFVfNDA5NjsKLQlwcm9wcy0+bGlkID0gMDsKLQlwcm9wcy0+bG1jID0gMDsKLQlwcm9wcy0+c21fbGlkID0gMDsKLQlwcm9wcy0+c21fc2wgPSAwOworCXByb3BzLT5hY3RpdmVfbXR1ID0gSUJfTVRVXzIwNDg7CiAJcHJvcHMtPnN0YXRlID0gSUJfUE9SVF9BQ1RJVkU7Ci0JcHJvcHMtPnBoeXNfc3RhdGUgPSAwOwogCXByb3BzLT5wb3J0X2NhcF9mbGFncyA9CiAJICAgIElCX1BPUlRfQ01fU1VQIHwKIAkgICAgSUJfUE9SVF9TTk1QX1RVTk5FTF9TVVAgfApAQCAtMTE3MCw3ICsxMTY4LDYgQEAKIAkgICAgSUJfUE9SVF9WRU5ET1JfQ0xBU1NfU1VQIHwgSUJfUE9SVF9CT09UX01HTVRfU1VQOwogCXByb3BzLT5naWRfdGJsX2xlbiA9IDE7CiAJcHJvcHMtPnBrZXlfdGJsX2xlbiA9IDE7Ci0JcHJvcHMtPnFrZXlfdmlvbF9jbnRyID0gMDsKIAlwcm9wcy0+YWN0aXZlX3dpZHRoID0gMjsKIAlwcm9wcy0+YWN0aXZlX3NwZWVkID0gMjsKIAlwcm9wcy0+bWF4X21zZ19zeiA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jbGFzc2VzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NsYXNzZXMuaAppbmRleCAxYWI5MTlmLi41ZDdiNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NsYXNzZXMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NsYXNzZXMuaApAQCAtMTY0LDYgKzE2NCwxMyBAQAogCXUxNiByZXBvcnRlZDsKIH07CiAKK3N0cnVjdCBlaGNhX3F1ZXVlX21hcCB7CisJc3RydWN0IGVoY2FfcW1hcF9lbnRyeSAqbWFwOworCXVuc2lnbmVkIGludCBlbnRyaWVzOworCXVuc2lnbmVkIGludCB0YWlsOworCXVuc2lnbmVkIGludCBsZWZ0X3RvX3BvbGw7Cit9OworCiBzdHJ1Y3QgZWhjYV9xcCB7CiAJdW5pb24gewogCQlzdHJ1Y3QgaWJfcXAgaWJfcXA7CkBAIC0xNzMsOCArMTgwLDkgQEAKIAllbnVtIGVoY2FfZXh0X3FwX3R5cGUgZXh0X3R5cGU7CiAJZW51bSBpYl9xcF9zdGF0ZSBzdGF0ZTsKIAlzdHJ1Y3QgaXB6X3F1ZXVlIGlwel9zcXVldWU7Ci0Jc3RydWN0IGVoY2FfcW1hcF9lbnRyeSAqc3FfbWFwOworCXN0cnVjdCBlaGNhX3F1ZXVlX21hcCBzcV9tYXA7CiAJc3RydWN0IGlwel9xdWV1ZSBpcHpfcnF1ZXVlOworCXN0cnVjdCBlaGNhX3F1ZXVlX21hcCBycV9tYXA7CiAJc3RydWN0IGhfZ2FscGFzIGdhbHBhczsKIAl1MzIgcWtleTsKIAl1MzIgcmVhbF9xcF9udW07CkBAIC0yMDQsNiArMjEyLDggQEAKIAlhdG9taWNfdCBucl9ldmVudHM7IC8qIGV2ZW50cyBzZWVuICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jb21wbGV0aW9uOwogCWludCBtaWdfYXJtZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBzcV9lcnJfbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJxX2Vycl9ub2RlOwogfTsKIAogI2RlZmluZSBJU19TUlEocXApIChxcC0+ZXh0X3R5cGUgPT0gRVFQVF9TUlEpCkBAIC0yMzMsNiArMjQzLDggQEAKIAkvKiBtbWFwIGNvdW50ZXIgZm9yIHJlc291cmNlcyBtYXBwZWQgaW50byB1c2VyIHNwYWNlICovCiAJdTMyIG1tX2NvdW50X3F1ZXVlOwogCXUzMiBtbV9jb3VudF9nYWxwYTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNxcF9lcnJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJxcF9lcnJfbGlzdDsKIH07CiAKIGVudW0gZWhjYV9tcl9mbGFnIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY3EuYwppbmRleCA1NTQwYjI3Li4zMzY0N2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jcS5jCkBAIC0yNzYsNiArMjc2LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgUVBfSEFTSFRBQl9MRU47IGkrKykKIAkJSU5JVF9ITElTVF9IRUFEKCZteV9jcS0+cXBfaGFzaHRhYltpXSk7CiAKKwlJTklUX0xJU1RfSEVBRCgmbXlfY3EtPnNxcF9lcnJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm15X2NxLT5ycXBfZXJyX2xpc3QpOworCiAJaWYgKGNvbnRleHQpIHsKIAkJc3RydWN0IGlwel9xdWV1ZSAqaXB6X3F1ZXVlID0gJm15X2NxLT5pcHpfcXVldWU7CiAJCXN0cnVjdCBlaGNhX2NyZWF0ZV9jcV9yZXNwIHJlc3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2l2ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pdmVyYnMuaAppbmRleCBhOGEyZWE1Li44ZjdmMjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2l2ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXZlcmJzLmgKQEAgLTE5Nyw2ICsxOTcsOCBAQAogaW50IGVoY2FfY2FsY19pcGQoc3RydWN0IGVoY2Ffc2hjYSAqc2hjYSwgaW50IHBvcnQsCiAJCSAgZW51bSBpYl9yYXRlIHBhdGhfcmF0ZSwgdTMyICppcGQpOwogCit2b2lkIGVoY2FfYWRkX3RvX2Vycl9saXN0KHN0cnVjdCBlaGNhX3FwICpxcCwgaW50IG9uX3NxKTsKKwogI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCiB2b2lkICplaGNhX2FsbG9jX2Z3X2N0cmxibG9jayhnZnBfdCBmbGFncyk7CiB2b2lkIGVoY2FfZnJlZV9md19jdHJsYmxvY2sodm9pZCAqcHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYwppbmRleCBiNmJjZWUwLi40ZGJlMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCkBAIC0zOTYsNiArMzk2LDUwIEBACiAJcXVldWUtPmlzX3NtYWxsID0gKHF1ZXVlLT5wYWdlX3NpemUgIT0gMCk7CiB9CiAKKy8qIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGNxLT5zcGlubG9jayBoZWxkICovCit2b2lkIGVoY2FfYWRkX3RvX2Vycl9saXN0KHN0cnVjdCBlaGNhX3FwICpxcCwgaW50IG9uX3NxKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICpub2RlOworCisJLyogVE9ETzogc3VwcG9ydCBsb3cgbGF0ZW5jeSBRUHMgKi8KKwlpZiAocXAtPmV4dF90eXBlID09IEVRUFRfTExRUCkKKwkJcmV0dXJuOworCisJaWYgKG9uX3NxKSB7CisJCWxpc3QgPSAmcXAtPnNlbmRfY3EtPnNxcF9lcnJfbGlzdDsKKwkJbm9kZSA9ICZxcC0+c3FfZXJyX25vZGU7CisJfSBlbHNlIHsKKwkJbGlzdCA9ICZxcC0+cmVjdl9jcS0+cnFwX2Vycl9saXN0OworCQlub2RlID0gJnFwLT5ycV9lcnJfbm9kZTsKKwl9CisKKwlpZiAobGlzdF9lbXB0eShub2RlKSkKKwkJbGlzdF9hZGRfdGFpbChub2RlLCBsaXN0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZGVsX2Zyb21fZXJyX2xpc3Qoc3RydWN0IGVoY2FfY3EgKmNxLCBzdHJ1Y3QgbGlzdF9oZWFkICpub2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3EtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWxpc3RfZW1wdHkobm9kZSkpCisJCWxpc3RfZGVsX2luaXQobm9kZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcS0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcXVldWVfbWFwKHN0cnVjdCBlaGNhX3F1ZXVlX21hcCAqcW1hcCkKK3sKKwlpbnQgaTsKKworCXFtYXAtPnRhaWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBxbWFwLT5lbnRyaWVzOyBpKyspCisJCXFtYXAtPm1hcFtpXS5yZXBvcnRlZCA9IDE7Cit9CisKIC8qCiAgKiBDcmVhdGUgYW4gaWJfcXAgc3RydWN0IHRoYXQgaXMgZWl0aGVyIGEgUVAgb3IgYW4gU1JRLCBkZXBlbmRpbmcgb24KICAqIHRoZSB2YWx1ZSBvZiB0aGUgaXNfc3JxIHBhcmFtZXRlci4gSWYgaW5pdF9hdHRyIGFuZCBzcnFfaW5pdF9hdHRyIHNoYXJlCkBAIC00MDcsMTIgKzQ1MSwxMSBAQAogCXN0cnVjdCBpYl9zcnFfaW5pdF9hdHRyICpzcnFfaW5pdF9hdHRyLAogCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsIGludCBpc19zcnEpCiB7Ci0Jc3RydWN0IGVoY2FfcXAgKm15X3FwOworCXN0cnVjdCBlaGNhX3FwICpteV9xcCwgKm15X3NycSA9IE5VTEw7CiAJc3RydWN0IGVoY2FfcGQgKm15X3BkID0gY29udGFpbmVyX29mKHBkLCBzdHJ1Y3QgZWhjYV9wZCwgaWJfcGQpOwogCXN0cnVjdCBlaGNhX3NoY2EgKnNoY2EgPSBjb250YWluZXJfb2YocGQtPmRldmljZSwgc3RydWN0IGVoY2Ffc2hjYSwKIAkJCQkJICAgICAgaWJfZGV2aWNlKTsKIAlzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQgPSBOVUxMOwotCXUzMiBucl9xZXM7CiAJdTY0IGhfcmV0OwogCWludCBpc19sbHFwID0gMCwgaGFzX3NycSA9IDA7CiAJaW50IHFwX3R5cGUsIG1heF9zZW5kX3NnZSwgbWF4X3JlY3Zfc2dlLCByZXQ7CkBAIC00NTcsOCArNTAwLDcgQEAKIAogCS8qIGhhbmRsZSBTUlEgYmFzZSBRUHMgKi8KIAlpZiAoaW5pdF9hdHRyLT5zcnEpIHsKLQkJc3RydWN0IGVoY2FfcXAgKm15X3NycSA9Ci0JCQljb250YWluZXJfb2YoaW5pdF9hdHRyLT5zcnEsIHN0cnVjdCBlaGNhX3FwLCBpYl9zcnEpOworCQlteV9zcnEgPSBjb250YWluZXJfb2YoaW5pdF9hdHRyLT5zcnEsIHN0cnVjdCBlaGNhX3FwLCBpYl9zcnEpOwogCiAJCWhhc19zcnEgPSAxOwogCQlwYXJtcy5leHRfdHlwZSA9IEVRUFRfU1JRQkFTRTsKQEAgLTcxNiwxNSArNzU4LDE5IEBACiAJCQkJICJhbmQgcGFnZXMgcmV0PSVpIiwgcmV0KTsKIAkJCWdvdG8gY3JlYXRlX3FwX2V4aXQyOwogCQl9Ci0JCW5yX3FlcyA9IG15X3FwLT5pcHpfc3F1ZXVlLnF1ZXVlX2xlbmd0aCAvCisKKwkJbXlfcXAtPnNxX21hcC5lbnRyaWVzID0gbXlfcXAtPmlwel9zcXVldWUucXVldWVfbGVuZ3RoIC8KIAkJCSBteV9xcC0+aXB6X3NxdWV1ZS5xZV9zaXplOwotCQlteV9xcC0+c3FfbWFwID0gdm1hbGxvYyhucl9xZXMgKgorCQlteV9xcC0+c3FfbWFwLm1hcCA9IHZtYWxsb2MobXlfcXAtPnNxX21hcC5lbnRyaWVzICoKIAkJCQkJc2l6ZW9mKHN0cnVjdCBlaGNhX3FtYXBfZW50cnkpKTsKLQkJaWYgKCFteV9xcC0+c3FfbWFwKSB7CisJCWlmICghbXlfcXAtPnNxX21hcC5tYXApIHsKIAkJCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJDb3VsZG4ndCBhbGxvY2F0ZSBzcXVldWUgIgogCQkJCSAibWFwIHJldD0laSIsIHJldCk7CiAJCQlnb3RvIGNyZWF0ZV9xcF9leGl0MzsKIAkJfQorCQlJTklUX0xJU1RfSEVBRCgmbXlfcXAtPnNxX2Vycl9ub2RlKTsKKwkJLyogdG8gYXZvaWQgdGhlIGdlbmVyYXRpb24gb2YgYm9ndXMgZmx1c2ggQ1FFcyAqLworCQlyZXNldF9xdWV1ZV9tYXAoJm15X3FwLT5zcV9tYXApOwogCX0KIAogCWlmIChIQVNfUlEobXlfcXApKSB7CkBAIC03MzYsNiArNzgyLDI1IEBACiAJCQkJICJhbmQgcGFnZXMgcmV0PSVpIiwgcmV0KTsKIAkJCWdvdG8gY3JlYXRlX3FwX2V4aXQ0OwogCQl9CisKKwkJbXlfcXAtPnJxX21hcC5lbnRyaWVzID0gbXlfcXAtPmlwel9ycXVldWUucXVldWVfbGVuZ3RoIC8KKwkJCW15X3FwLT5pcHpfcnF1ZXVlLnFlX3NpemU7CisJCW15X3FwLT5ycV9tYXAubWFwID0gdm1hbGxvYyhteV9xcC0+cnFfbWFwLmVudHJpZXMgKgorCQkJCXNpemVvZihzdHJ1Y3QgZWhjYV9xbWFwX2VudHJ5KSk7CisJCWlmICghbXlfcXAtPnJxX21hcC5tYXApIHsKKwkJCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJDb3VsZG4ndCBhbGxvY2F0ZSBzcXVldWUgIgorCQkJCQkibWFwIHJldD0laSIsIHJldCk7CisJCQlnb3RvIGNyZWF0ZV9xcF9leGl0NTsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmbXlfcXAtPnJxX2Vycl9ub2RlKTsKKwkJLyogdG8gYXZvaWQgdGhlIGdlbmVyYXRpb24gb2YgYm9ndXMgZmx1c2ggQ1FFcyAqLworCQlyZXNldF9xdWV1ZV9tYXAoJm15X3FwLT5ycV9tYXApOworCX0gZWxzZSBpZiAoaW5pdF9hdHRyLT5zcnEpIHsKKwkJLyogdGhpcyBpcyBhIGJhc2UgUVAsIHVzZSB0aGUgcXVldWUgbWFwIG9mIHRoZSBTUlEgKi8KKwkJbXlfcXAtPnJxX21hcCA9IG15X3NycS0+cnFfbWFwOworCQlJTklUX0xJU1RfSEVBRCgmbXlfcXAtPnJxX2Vycl9ub2RlKTsKKworCQlteV9xcC0+aXB6X3JxdWV1ZSA9IG15X3NycS0+aXB6X3JxdWV1ZTsKIAl9CiAKIAlpZiAoaXNfc3JxKSB7CkBAIC03OTksNyArODY0LDcgQEAKIAkJaWYgKHJldCkgewogCQkJZWhjYV9lcnIocGQtPmRldmljZSwKIAkJCQkgIkNvdWxkbid0IGFzc2lnbiBxcCB0byBzZW5kX2NxIHJldD0laSIsIHJldCk7Ci0JCQlnb3RvIGNyZWF0ZV9xcF9leGl0NjsKKwkJCWdvdG8gY3JlYXRlX3FwX2V4aXQ3OwogCQl9CiAJfQogCkBAIC04MjUsMjUgKzg5MCwyOSBAQAogCQlpZiAoaWJfY29weV90b191ZGF0YSh1ZGF0YSwgJnJlc3AsIHNpemVvZiByZXNwKSkgewogCQkJZWhjYV9lcnIocGQtPmRldmljZSwgIkNvcHkgdG8gdWRhdGEgZmFpbGVkIik7CiAJCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBjcmVhdGVfcXBfZXhpdDc7CisJCQlnb3RvIGNyZWF0ZV9xcF9leGl0ODsKIAkJfQogCX0KIAogCXJldHVybiBteV9xcDsKIAotY3JlYXRlX3FwX2V4aXQ3OgorY3JlYXRlX3FwX2V4aXQ4OgogCWVoY2FfY3FfdW5hc3NpZ25fcXAobXlfcXAtPnNlbmRfY3EsIG15X3FwLT5yZWFsX3FwX251bSk7CiAKLWNyZWF0ZV9xcF9leGl0NjoKK2NyZWF0ZV9xcF9leGl0NzoKIAlrZnJlZShteV9xcC0+bW9kX3FwX3Bhcm0pOwogCitjcmVhdGVfcXBfZXhpdDY6CisJaWYgKEhBU19SUShteV9xcCkpCisJCXZmcmVlKG15X3FwLT5ycV9tYXAubWFwKTsKKwogY3JlYXRlX3FwX2V4aXQ1OgogCWlmIChIQVNfUlEobXlfcXApKQogCQlpcHpfcXVldWVfZHRvcihteV9wZCwgJm15X3FwLT5pcHpfcnF1ZXVlKTsKIAogY3JlYXRlX3FwX2V4aXQ0OgogCWlmIChIQVNfU1EobXlfcXApKQotCQl2ZnJlZShteV9xcC0+c3FfbWFwKTsKKwkJdmZyZWUobXlfcXAtPnNxX21hcC5tYXApOwogCiBjcmVhdGVfcXBfZXhpdDM6CiAJaWYgKEhBU19TUShteV9xcCkpCkBAIC0xMDM1LDYgKzExMDQsMTAxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY2FsY19sZWZ0X2NxZXModTY0IHdxZV9wLCBzdHJ1Y3QgaXB6X3F1ZXVlICppcHpfcXVldWUsCisJCQkgIHN0cnVjdCBlaGNhX3F1ZXVlX21hcCAqcW1hcCkKK3sKKwl2b2lkICp3cWVfdjsKKwl1NjQgcV9vZnM7CisJdTMyIHdxZV9pZHg7CisKKwkvKiBjb252ZXJ0IHJlYWwgdG8gYWJzIGFkZHJlc3MgKi8KKwl3cWVfcCA9IHdxZV9wICYgKH4oMVVMIDw8IDYzKSk7CisKKwl3cWVfdiA9IGFic190b192aXJ0KHdxZV9wKTsKKworCWlmIChpcHpfcXVldWVfYWJzX3RvX29mZnNldChpcHpfcXVldWUsIHdxZV9wLCAmcV9vZnMpKSB7CisJCWVoY2FfZ2VuX2VycigiSW52YWxpZCBvZmZzZXQgZm9yIGNhbGN1bGF0aW5nIGxlZnQgY3FlcyAiCisJCQkJIndxZV9wPSUjbHggd3FlX3Y9JXBcbiIsIHdxZV9wLCB3cWVfdik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXdxZV9pZHggPSBxX29mcyAvIGlwel9xdWV1ZS0+cWVfc2l6ZTsKKwlpZiAod3FlX2lkeCA8IHFtYXAtPnRhaWwpCisJCXFtYXAtPmxlZnRfdG9fcG9sbCA9IChxbWFwLT5lbnRyaWVzIC0gcW1hcC0+dGFpbCkgKyB3cWVfaWR4OworCWVsc2UKKwkJcW1hcC0+bGVmdF90b19wb2xsID0gd3FlX2lkeCAtIHFtYXAtPnRhaWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19mb3JfbGVmdF9jcWVzKHN0cnVjdCBlaGNhX3FwICpteV9xcCwgc3RydWN0IGVoY2Ffc2hjYSAqc2hjYSkKK3sKKwl1NjQgaF9yZXQ7CisJdm9pZCAqc2VuZF93cWVfcCwgKnJlY3Zfd3FlX3A7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBxcF9udW0gPSBteV9xcC0+aWJfcXAucXBfbnVtOworCisJLyogdGhpcyBoY2FsbCBpcyBub3Qgc3VwcG9ydGVkIG9uIGJhc2UgUVBzICovCisJaWYgKG15X3FwLT5leHRfdHlwZSAhPSBFUVBUX1NSUUJBU0UpIHsKKwkJLyogZ2V0IHNlbmQgYW5kIHJlY2VpdmUgd3FlIHBvaW50ZXIgKi8KKwkJaF9yZXQgPSBoaXB6X2hfZGlzYWJsZV9hbmRfZ2V0X3dxZShzaGNhLT5pcHpfaGNhX2hhbmRsZSwKKwkJCQlteV9xcC0+aXB6X3FwX2hhbmRsZSwgJm15X3FwLT5wZiwKKwkJCQkmc2VuZF93cWVfcCwgJnJlY3Zfd3FlX3AsIDQpOworCQlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7CisJCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiZGlzYWJsZV9hbmRfZ2V0X3dxZSgpICIKKwkJCQkgImZhaWxlZCBlaGNhX3FwPSVwIHFwX251bT0leCBoX3JldD0lbGkiLAorCQkJCSBteV9xcCwgcXBfbnVtLCBoX3JldCk7CisJCQlyZXR1cm4gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CisJCX0KKworCQkvKgorCQkgKiBhY3F1aXJlIGxvY2sgdG8gZW5zdXJlIHRoYXQgbm9ib2R5IGlzIHBvbGxpbmcgdGhlIGNxIHdoaWNoCisJCSAqIGNvdWxkIG1lYW4gdGhhdCB0aGUgcW1hcC0+dGFpbCBwb2ludGVyIGlzIGluIGFuCisJCSAqIGluY29uc2lzdGVudCBzdGF0ZS4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZteV9xcC0+c2VuZF9jcS0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gY2FsY19sZWZ0X2NxZXMoKHU2NClzZW5kX3dxZV9wLCAmbXlfcXAtPmlwel9zcXVldWUsCisJCQkJJm15X3FwLT5zcV9tYXApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZteV9xcC0+c2VuZF9jcS0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXlfcXAtPnJlY3ZfY3EtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldCA9IGNhbGNfbGVmdF9jcWVzKCh1NjQpcmVjdl93cWVfcCwgJm15X3FwLT5pcHpfcnF1ZXVlLAorCQkJCSZteV9xcC0+cnFfbWFwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXlfcXAtPnJlY3ZfY3EtPnNwaW5sb2NrLCBmbGFncyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZteV9xcC0+c2VuZF9jcS0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJbXlfcXAtPnNxX21hcC5sZWZ0X3RvX3BvbGwgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZteV9xcC0+c2VuZF9jcS0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXlfcXAtPnJlY3ZfY3EtPnNwaW5sb2NrLCBmbGFncyk7CisJCW15X3FwLT5ycV9tYXAubGVmdF90b19wb2xsID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXlfcXAtPnJlY3ZfY3EtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyogdGhpcyBhc3N1cmVzIGZsdXNoIGNxZXMgYmVpbmcgZ2VuZXJhdGVkIG9ubHkgZm9yIHBlbmRpbmcgd3FlcyAqLworCWlmICgobXlfcXAtPnNxX21hcC5sZWZ0X3RvX3BvbGwgPT0gMCkgJiYKKwkJCQkobXlfcXAtPnJxX21hcC5sZWZ0X3RvX3BvbGwgPT0gMCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm15X3FwLT5zZW5kX2NxLT5zcGlubG9jaywgZmxhZ3MpOworCQllaGNhX2FkZF90b19lcnJfbGlzdChteV9xcCwgMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm15X3FwLT5zZW5kX2NxLT5zcGlubG9jaywgZmxhZ3MpOworCisJCWlmIChIQVNfUlEobXlfcXApKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXlfcXAtPnJlY3ZfY3EtPnNwaW5sb2NrLCBmbGFncyk7CisJCQllaGNhX2FkZF90b19lcnJfbGlzdChteV9xcCwgMCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZteV9xcC0+cmVjdl9jcS0+c3BpbmxvY2ssCisJCQkJCWZsYWdzKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogaW50ZXJuYWxfbW9kaWZ5X3FwIHdpdGggY2lyY3VtdmVudGlvbiB0byBoYW5kbGUgYXFwMCBwcm9wZXJseQogICogc21pX3Jlc2V0MmluaXQgaW5kaWNhdGVzIGlmIHRoaXMgaXMgYW4gaW50ZXJuYWwgcmVzZXQtdG8taW5pdC1jYWxsIGZvcgpAQCAtMTUzOSwxMCArMTcwMywyNyBAQAogCQkJZ290byBtb2RpZnlfcXBfZXhpdDI7CiAJCX0KIAl9CisJaWYgKChxcF9uZXdfc3RhdGUgPT0gSUJfUVBTX0VSUikgJiYgKHFwX2N1cl9zdGF0ZSAhPSBJQl9RUFNfRVJSKSkgeworCQlyZXQgPSBjaGVja19mb3JfbGVmdF9jcWVzKG15X3FwLCBzaGNhKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gbW9kaWZ5X3FwX2V4aXQyOworCX0KIAogCWlmIChzdGF0ZXRyYW5zID09IElCX1FQU1RfQU5ZMlJFU0VUKSB7CiAJCWlwel9xZWl0X3Jlc2V0KCZteV9xcC0+aXB6X3JxdWV1ZSk7CiAJCWlwel9xZWl0X3Jlc2V0KCZteV9xcC0+aXB6X3NxdWV1ZSk7CisKKwkJaWYgKHFwX2N1cl9zdGF0ZSA9PSBJQl9RUFNfRVJSKSB7CisJCQlkZWxfZnJvbV9lcnJfbGlzdChteV9xcC0+c2VuZF9jcSwgJm15X3FwLT5zcV9lcnJfbm9kZSk7CisKKwkJCWlmIChIQVNfUlEobXlfcXApKQorCQkJCWRlbF9mcm9tX2Vycl9saXN0KG15X3FwLT5yZWN2X2NxLAorCQkJCQkJICAmbXlfcXAtPnJxX2Vycl9ub2RlKTsKKwkJfQorCQlyZXNldF9xdWV1ZV9tYXAoJm15X3FwLT5zcV9tYXApOworCisJCWlmIChIQVNfUlEobXlfcXApKQorCQkJcmVzZXRfcXVldWVfbWFwKCZteV9xcC0+cnFfbWFwKTsKIAl9CiAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUUtFWSkKQEAgLTE5NTgsNiArMjEzOSwxNiBAQAogCWlkcl9yZW1vdmUoJmVoY2FfcXBfaWRyLCBteV9xcC0+dG9rZW4pOwogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlaGNhX3FwX2lkcl9sb2NrLCBmbGFncyk7CiAKKwkvKgorCSAqIFNSUXMgd2lsbCBuZXZlciBnZXQgaW50byBhbiBlcnJvciBsaXN0IGFuZCBkbyBub3QgaGF2ZSBhIHJlY3ZfY3EsCisJICogc28gd2UgbmVlZCB0byBza2lwIHRoZW0gaGVyZS4KKwkgKi8KKwlpZiAoSEFTX1JRKG15X3FwKSAmJiAhSVNfU1JRKG15X3FwKSkKKwkJZGVsX2Zyb21fZXJyX2xpc3QobXlfcXAtPnJlY3ZfY3EsICZteV9xcC0+cnFfZXJyX25vZGUpOworCisJaWYgKEhBU19TUShteV9xcCkpCisJCWRlbF9mcm9tX2Vycl9saXN0KG15X3FwLT5zZW5kX2NxLCAmbXlfcXAtPnNxX2Vycl9ub2RlKTsKKwogCS8qIG5vdyB3YWl0IHVudGlsIGFsbCBwZW5kaW5nIGV2ZW50cyBoYXZlIGNvbXBsZXRlZCAqLwogCXdhaXRfZXZlbnQobXlfcXAtPndhaXRfY29tcGxldGlvbiwgIWF0b21pY19yZWFkKCZteV9xcC0+bnJfZXZlbnRzKSk7CiAKQEAgLTE5ODMsNyArMjE3NCw3IEBACiAJaWYgKHFwX3R5cGUgPT0gSUJfUVBUX0dTSSkgewogCQlzdHJ1Y3QgaWJfZXZlbnQgZXZlbnQ7CiAJCWVoY2FfaW5mbyhkZXYsICJkZXZpY2UgJXM6IHBvcnQgJXggaXMgaW5hY3RpdmUuIiwKLQkJCSAgc2hjYS0+aWJfZGV2aWNlLm5hbWUsIHBvcnRfbnVtKTsKKwkJCQlzaGNhLT5pYl9kZXZpY2UubmFtZSwgcG9ydF9udW0pOwogCQlldmVudC5kZXZpY2UgPSAmc2hjYS0+aWJfZGV2aWNlOwogCQlldmVudC5ldmVudCA9IElCX0VWRU5UX1BPUlRfRVJSOwogCQlldmVudC5lbGVtZW50LnBvcnRfbnVtID0gcG9ydF9udW07CkBAIC0xOTkxLDExICsyMTgyLDE1IEBACiAJCWliX2Rpc3BhdGNoX2V2ZW50KCZldmVudCk7CiAJfQogCi0JaWYgKEhBU19SUShteV9xcCkpCisJaWYgKEhBU19SUShteV9xcCkpIHsKIAkJaXB6X3F1ZXVlX2R0b3IobXlfcGQsICZteV9xcC0+aXB6X3JxdWV1ZSk7CisKKwkJdmZyZWUobXlfcXAtPnJxX21hcC5tYXApOworCX0KIAlpZiAoSEFTX1NRKG15X3FwKSkgewogCQlpcHpfcXVldWVfZHRvcihteV9wZCwgJm15X3FwLT5pcHpfc3F1ZXVlKTsKLQkJdmZyZWUobXlfcXAtPnNxX21hcCk7CisKKwkJdmZyZWUobXlfcXAtPnNxX21hcC5tYXApOwogCX0KIAlrbWVtX2NhY2hlX2ZyZWUocXBfY2FjaGUsIG15X3FwKTsKIAlhdG9taWNfZGVjKCZzaGNhLT5udW1fcXBzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcmVxcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9yZXFzLmMKaW5kZXggNDQyNmQ4Mi4uNjQ5MjgwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9yZXFzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9yZXFzLmMKQEAgLTUzLDkgKzUzLDI1IEBACiAvKiBpbiBSQyB0cmFmZmljLCBpbnNlcnQgYW4gZW1wdHkgUkRNQSBSRUFEIGV2ZXJ5IHRoaXMgbWFueSBwYWNrZXRzICovCiAjZGVmaW5lIEFDS19DSVJDX1RIUkVTSE9MRCAyMDAwMDAwCiAKK3N0YXRpYyB1NjQgcmVwbGFjZV93cl9pZCh1NjQgd3JfaWQsIHUxNiBpZHgpCit7CisJdTY0IHJldDsKKworCXJldCA9IHdyX2lkICYgflFNQVBfSURYX01BU0s7CisJcmV0IHw9IGlkeCAmIFFNQVBfSURYX01BU0s7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGdldF9hcHBfd3JfaWQodTY0IHdyX2lkKQoreworCXJldHVybiB3cl9pZCAmIFFNQVBfSURYX01BU0s7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGVoY2Ffd3JpdGVfcndxZShzdHJ1Y3QgaXB6X3F1ZXVlICppcHpfcnF1ZXVlLAogCQkJCSAgc3RydWN0IGVoY2Ffd3FlICp3cWVfcCwKLQkJCQkgIHN0cnVjdCBpYl9yZWN2X3dyICpyZWN2X3dyKQorCQkJCSAgc3RydWN0IGliX3JlY3Zfd3IgKnJlY3Zfd3IsCisJCQkJICB1MzIgcnFfbWFwX2lkeCkKIHsKIAl1OCBjbnRfZHM7CiAJaWYgKHVubGlrZWx5KChyZWN2X3dyLT5udW1fc2dlIDwgMCkgfHwKQEAgLTY5LDcgKzg1LDcgQEAKIAkvKiBjbGVhciB3cWUgaGVhZGVyIHVudGlsIHNnbGlzdCAqLwogCW1lbXNldCh3cWVfcCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGVoY2Ffd3FlLCB1LnVkX2F2LnNnX2xpc3QpKTsKIAotCXdxZV9wLT53b3JrX3JlcXVlc3RfaWQgPSByZWN2X3dyLT53cl9pZDsKKwl3cWVfcC0+d29ya19yZXF1ZXN0X2lkID0gcmVwbGFjZV93cl9pZChyZWN2X3dyLT53cl9pZCwgcnFfbWFwX2lkeCk7CiAJd3FlX3AtPm5yX29mX2RhdGFfc2VnID0gcmVjdl93ci0+bnVtX3NnZTsKIAogCWZvciAoY250X2RzID0gMDsgY250X2RzIDwgcmVjdl93ci0+bnVtX3NnZTsgY250X2RzKyspIHsKQEAgLTE0Niw2ICsxNjIsNyBAQAogCXU2NCBkbWFfbGVuZ3RoOwogCXN0cnVjdCBlaGNhX2F2ICpteV9hdjsKIAl1MzIgcmVtb3RlX3FrZXkgPSBzZW5kX3dyLT53ci51ZC5yZW1vdGVfcWtleTsKKwlzdHJ1Y3QgZWhjYV9xbWFwX2VudHJ5ICpxbWFwX2VudHJ5ID0gJnFwLT5zcV9tYXAubWFwW3NxX21hcF9pZHhdOwogCiAJaWYgKHVubGlrZWx5KChzZW5kX3dyLT5udW1fc2dlIDwgMCkgfHwKIAkJICAgICAoc2VuZF93ci0+bnVtX3NnZSA+IHFwLT5pcHpfc3F1ZXVlLmFjdF9ucl9vZl9zZykpKSB7CkBAIC0xNTgsMTEgKzE3NSwxMCBAQAogCS8qIGNsZWFyIHdxZSBoZWFkZXIgdW50aWwgc2dsaXN0ICovCiAJbWVtc2V0KHdxZV9wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgZWhjYV93cWUsIHUudWRfYXYuc2dfbGlzdCkpOwogCi0Jd3FlX3AtPndvcmtfcmVxdWVzdF9pZCA9IHNlbmRfd3ItPndyX2lkICYgflFNQVBfSURYX01BU0s7Ci0Jd3FlX3AtPndvcmtfcmVxdWVzdF9pZCB8PSBzcV9tYXBfaWR4ICYgUU1BUF9JRFhfTUFTSzsKKwl3cWVfcC0+d29ya19yZXF1ZXN0X2lkID0gcmVwbGFjZV93cl9pZChzZW5kX3dyLT53cl9pZCwgc3FfbWFwX2lkeCk7CiAKLQlxcC0+c3FfbWFwW3NxX21hcF9pZHhdLmFwcF93cl9pZCA9IHNlbmRfd3ItPndyX2lkICYgUU1BUF9JRFhfTUFTSzsKLQlxcC0+c3FfbWFwW3NxX21hcF9pZHhdLnJlcG9ydGVkID0gMDsKKwlxbWFwX2VudHJ5LT5hcHBfd3JfaWQgPSBnZXRfYXBwX3dyX2lkKHNlbmRfd3ItPndyX2lkKTsKKwlxbWFwX2VudHJ5LT5yZXBvcnRlZCA9IDA7CiAKIAlzd2l0Y2ggKHNlbmRfd3ItPm9wY29kZSkgewogCWNhc2UgSUJfV1JfU0VORDoKQEAgLTQ5Niw3ICs1MTIsOSBAQAogCXN0cnVjdCBlaGNhX3dxZSAqd3FlX3A7CiAJaW50IHdxZV9jbnQgPSAwOwogCWludCByZXQgPSAwOworCXUzMiBycV9tYXBfaWR4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVoY2FfcW1hcF9lbnRyeSAqcW1hcF9lbnRyeTsKIAogCWlmICh1bmxpa2VseSghSEFTX1JRKG15X3FwKSkpIHsKIAkJZWhjYV9lcnIoZGV2LCAiUVAgaGFzIG5vIFJRICBlaGNhX3FwPSVwIHFwX251bT0leCBleHRfdHlwZT0lZCIsCkBAIC01MjQsOCArNTQyLDE1IEBACiAJCQl9CiAJCQlnb3RvIHBvc3RfcmVjdl9leGl0MDsKIAkJfQorCQkvKgorCQkgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBXUUUgaW4gdGhlIHJlY3YgcXVldWUuIFRoZSBzYW1lIGluZGV4CisJCSAqIGlzIHVzZWQgZm9yIHdyaXRpbmcgaW50byB0aGUgcnFfbWFwLgorCQkgKi8KKwkJcnFfbWFwX2lkeCA9IHN0YXJ0X29mZnNldCAvIG15X3FwLT5pcHpfcnF1ZXVlLnFlX3NpemU7CisKIAkJLyogd3JpdGUgYSBSRUNWIFdRRSBpbnRvIHRoZSBRVUVVRSAqLwotCQlyZXQgPSBlaGNhX3dyaXRlX3J3cWUoJm15X3FwLT5pcHpfcnF1ZXVlLCB3cWVfcCwgY3VyX3JlY3Zfd3IpOworCQlyZXQgPSBlaGNhX3dyaXRlX3J3cWUoJm15X3FwLT5pcHpfcnF1ZXVlLCB3cWVfcCwgY3VyX3JlY3Zfd3IsCisJCQkJcnFfbWFwX2lkeCk7CiAJCS8qCiAJCSAqIGlmIHNvbWV0aGluZyBmYWlsZWQsCiAJCSAqIHJlc2V0IHRoZSBmcmVlIGVudHJ5IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IHZhbHVlCkBAIC01NDAsNiArNTY1LDExIEBACiAJCQl9CiAJCQlnb3RvIHBvc3RfcmVjdl9leGl0MDsKIAkJfQorCisJCXFtYXBfZW50cnkgPSAmbXlfcXAtPnJxX21hcC5tYXBbcnFfbWFwX2lkeF07CisJCXFtYXBfZW50cnktPmFwcF93cl9pZCA9IGdldF9hcHBfd3JfaWQoY3VyX3JlY3Zfd3ItPndyX2lkKTsKKwkJcW1hcF9lbnRyeS0+cmVwb3J0ZWQgPSAwOworCiAJCXdxZV9jbnQrKzsKIAl9IC8qIGVvZiBmb3IgY3VyX3JlY3Zfd3IgKi8KIApAQCAtNTk2LDEwICs2MjYsMTIgQEAKIC8qIGludGVybmFsIGZ1bmN0aW9uIHRvIHBvbGwgb25lIGVudHJ5IG9mIGNxICovCiBzdGF0aWMgaW5saW5lIGludCBlaGNhX3BvbGxfY3Ffb25lKHN0cnVjdCBpYl9jcSAqY3EsIHN0cnVjdCBpYl93YyAqd2MpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIHFtYXBfdGFpbF9pZHg7CiAJc3RydWN0IGVoY2FfY3EgKm15X2NxID0gY29udGFpbmVyX29mKGNxLCBzdHJ1Y3QgZWhjYV9jcSwgaWJfY3EpOwogCXN0cnVjdCBlaGNhX2NxZSAqY3FlOwogCXN0cnVjdCBlaGNhX3FwICpteV9xcDsKKwlzdHJ1Y3QgZWhjYV9xbWFwX2VudHJ5ICpxbWFwX2VudHJ5OworCXN0cnVjdCBlaGNhX3F1ZXVlX21hcCAqcW1hcDsKIAlpbnQgY3FlX2NvdW50ID0gMCwgaXNfZXJyb3I7CiAKIHJlcG9sbDoKQEAgLTY3NCwyNyArNzA2LDUyIEBACiAJCWdvdG8gcmVwb2xsOwogCXdjLT5xcCA9ICZteV9xcC0+aWJfcXA7CiAKLQlpZiAoIShjcWUtPndfY29tcGxldGlvbl9mbGFncyAmIFdDX1NFTkRfUkVDRUlWRV9CSVQpKSB7Ci0JCXN0cnVjdCBlaGNhX3FtYXBfZW50cnkgKnFtYXBfZW50cnk7CisJaWYgKGlzX2Vycm9yKSB7CiAJCS8qCi0JCSAqIFdlIGdvdCBhIHNlbmQgY29tcGxldGlvbiBhbmQgbmVlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbAotCQkgKiB3cl9pZC4KKwkJICogc2V0IGxlZnRfdG9fcG9sbCB0byAwIGJlY2F1c2UgaW4gZXJyb3Igc3RhdGUsIHdlIHdpbGwgbm90CisJCSAqIGdldCBhbnkgYWRkaXRpb25hbCBDUUVzCiAJCSAqLwotCQlxbWFwX2VudHJ5ID0gJm15X3FwLT5zcV9tYXBbY3FlLT53b3JrX3JlcXVlc3RfaWQgJgotCQkJCQkgICAgUU1BUF9JRFhfTUFTS107CisJCWVoY2FfYWRkX3RvX2Vycl9saXN0KG15X3FwLCAxKTsKKwkJbXlfcXAtPnNxX21hcC5sZWZ0X3RvX3BvbGwgPSAwOwogCi0JCWlmIChxbWFwX2VudHJ5LT5yZXBvcnRlZCkgewotCQkJZWhjYV93YXJuKGNxLT5kZXZpY2UsICJEb3VibGUgY3FlIG9uIHFwX251bT0lI3giLAotCQkJCSAgbXlfcXAtPnJlYWxfcXBfbnVtKTsKLQkJCS8qIGZvdW5kIGEgZG91YmxlIGNxZSwgZGlzY2FyZCBpdCBhbmQgcmVhZCBuZXh0IG9uZSAqLwotCQkJZ290byByZXBvbGw7Ci0JCX0KLQkJd2MtPndyX2lkID0gY3FlLT53b3JrX3JlcXVlc3RfaWQgJiB+UU1BUF9JRFhfTUFTSzsKLQkJd2MtPndyX2lkIHw9IHFtYXBfZW50cnktPmFwcF93cl9pZDsKLQkJcW1hcF9lbnRyeS0+cmVwb3J0ZWQgPSAxOwotCX0gZWxzZQorCQlpZiAoSEFTX1JRKG15X3FwKSkKKwkJCWVoY2FfYWRkX3RvX2Vycl9saXN0KG15X3FwLCAwKTsKKwkJbXlfcXAtPnJxX21hcC5sZWZ0X3RvX3BvbGwgPSAwOworCX0KKworCXFtYXBfdGFpbF9pZHggPSBnZXRfYXBwX3dyX2lkKGNxZS0+d29ya19yZXF1ZXN0X2lkKTsKKwlpZiAoIShjcWUtPndfY29tcGxldGlvbl9mbGFncyAmIFdDX1NFTkRfUkVDRUlWRV9CSVQpKQorCQkvKiBXZSBnb3QgYSBzZW5kIGNvbXBsZXRpb24uICovCisJCXFtYXAgPSAmbXlfcXAtPnNxX21hcDsKKwllbHNlCiAJCS8qIFdlIGdvdCBhIHJlY2VpdmUgY29tcGxldGlvbi4gKi8KLQkJd2MtPndyX2lkID0gY3FlLT53b3JrX3JlcXVlc3RfaWQ7CisJCXFtYXAgPSAmbXlfcXAtPnJxX21hcDsKKworCXFtYXBfZW50cnkgPSAmcW1hcC0+bWFwW3FtYXBfdGFpbF9pZHhdOworCWlmIChxbWFwX2VudHJ5LT5yZXBvcnRlZCkgeworCQllaGNhX3dhcm4oY3EtPmRldmljZSwgIkRvdWJsZSBjcWUgb24gcXBfbnVtPSUjeCIsCisJCQkJbXlfcXAtPnJlYWxfcXBfbnVtKTsKKwkJLyogZm91bmQgYSBkb3VibGUgY3FlLCBkaXNjYXJkIGl0IGFuZCByZWFkIG5leHQgb25lICovCisJCWdvdG8gcmVwb2xsOworCX0KKworCXdjLT53cl9pZCA9IHJlcGxhY2Vfd3JfaWQoY3FlLT53b3JrX3JlcXVlc3RfaWQsIHFtYXBfZW50cnktPmFwcF93cl9pZCk7CisJcW1hcF9lbnRyeS0+cmVwb3J0ZWQgPSAxOworCisJLyogdGhpcyBpcyBhIHByb3BlciBjb21wbGV0aW9uLCB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlciAqLworCWlmICgrK3FtYXAtPnRhaWwgPT0gcW1hcC0+ZW50cmllcykKKwkJcW1hcC0+dGFpbCA9IDA7CisKKwkvKiBpZiBsZWZ0X3RvX3BvbGwgaXMgZGVjcmVtZW50ZWQgdG8gMCwgYWRkIHRoZSBRUCB0byB0aGUgZXJyb3IgbGlzdCAqLworCWlmIChxbWFwLT5sZWZ0X3RvX3BvbGwgPiAwKSB7CisJCXFtYXAtPmxlZnRfdG9fcG9sbC0tOworCQlpZiAoKG15X3FwLT5zcV9tYXAubGVmdF90b19wb2xsID09IDApICYmCisJCQkJKG15X3FwLT5ycV9tYXAubGVmdF90b19wb2xsID09IDApKSB7CisJCQllaGNhX2FkZF90b19lcnJfbGlzdChteV9xcCwgMSk7CisJCQlpZiAoSEFTX1JRKG15X3FwKSkKKwkJCQllaGNhX2FkZF90b19lcnJfbGlzdChteV9xcCwgMCk7CisJCX0KKwl9CiAKIAkvKiBldmFsIGliX3djX29wY29kZSAqLwogCXdjLT5vcGNvZGUgPSBpYl93Y19vcGNvZGVbY3FlLT5vcHR5cGVdLTE7CkBAIC03MzMsMTMgKzc5MCw4OCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfZmx1c2hfY3FlcyhzdHJ1Y3QgZWhjYV9xcCAqbXlfcXAsIHN0cnVjdCBpYl9jcSAqY3EsCisJCQkgICAgICAgc3RydWN0IGliX3djICp3YywgaW50IG51bV9lbnRyaWVzLAorCQkJICAgICAgIHN0cnVjdCBpcHpfcXVldWUgKmlwel9xdWV1ZSwgaW50IG9uX3NxKQoreworCWludCBuciA9IDA7CisJc3RydWN0IGVoY2Ffd3FlICp3cWU7CisJdTY0IG9mZnNldDsKKwlzdHJ1Y3QgZWhjYV9xdWV1ZV9tYXAgKnFtYXA7CisJc3RydWN0IGVoY2FfcW1hcF9lbnRyeSAqcW1hcF9lbnRyeTsKKworCWlmIChvbl9zcSkKKwkJcW1hcCA9ICZteV9xcC0+c3FfbWFwOworCWVsc2UKKwkJcW1hcCA9ICZteV9xcC0+cnFfbWFwOworCisJcW1hcF9lbnRyeSA9ICZxbWFwLT5tYXBbcW1hcC0+dGFpbF07CisKKwl3aGlsZSAoKG5yIDwgbnVtX2VudHJpZXMpICYmIChxbWFwX2VudHJ5LT5yZXBvcnRlZCA9PSAwKSkgeworCQkvKiBnZW5lcmF0ZSBmbHVzaCBDUUUgKi8KKwkJbWVtc2V0KHdjLCAwLCBzaXplb2YoKndjKSk7CisKKwkJb2Zmc2V0ID0gcW1hcC0+dGFpbCAqIGlwel9xdWV1ZS0+cWVfc2l6ZTsKKwkJd3FlID0gKHN0cnVjdCBlaGNhX3dxZSAqKWlwel9xZWl0X2NhbGMoaXB6X3F1ZXVlLCBvZmZzZXQpOworCQlpZiAoIXdxZSkgeworCQkJZWhjYV9lcnIoY3EtPmRldmljZSwgIkludmFsaWQgd3FlIG9mZnNldD0lI2x4IG9uICIKKwkJCQkgInFwX251bT0lI3giLCBvZmZzZXQsIG15X3FwLT5yZWFsX3FwX251bSk7CisJCQlyZXR1cm4gbnI7CisJCX0KKworCQl3Yy0+d3JfaWQgPSByZXBsYWNlX3dyX2lkKHdxZS0+d29ya19yZXF1ZXN0X2lkLAorCQkJCQkgIHFtYXBfZW50cnktPmFwcF93cl9pZCk7CisKKwkJaWYgKG9uX3NxKSB7CisJCQlzd2l0Y2ggKHdxZS0+b3B0eXBlKSB7CisJCQljYXNlIFdRRV9PUFRZUEVfU0VORDoKKwkJCQl3Yy0+b3Bjb2RlID0gSUJfV0NfU0VORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgV1FFX09QVFlQRV9SRE1BV1JJVEU6CisJCQkJd2MtPm9wY29kZSA9IElCX1dDX1JETUFfV1JJVEU7CisJCQkJYnJlYWs7CisJCQljYXNlIFdRRV9PUFRZUEVfUkRNQVJFQUQ6CisJCQkJd2MtPm9wY29kZSA9IElCX1dDX1JETUFfUkVBRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZWhjYV9lcnIoY3EtPmRldmljZSwgIkludmFsaWQgb3B0eXBlPSV4IiwKKwkJCQkJCXdxZS0+b3B0eXBlKTsKKwkJCQlyZXR1cm4gbnI7CisJCQl9CisJCX0gZWxzZQorCQkJd2MtPm9wY29kZSA9IElCX1dDX1JFQ1Y7CisKKwkJaWYgKHdxZS0+d3JfZmxhZyAmIFdRRV9XUkZMQUdfSU1NX0RBVEFfUFJFU0VOVCkgeworCQkJd2MtPmV4LmltbV9kYXRhID0gd3FlLT5pbW1lZGlhdGVfZGF0YTsKKwkJCXdjLT53Y19mbGFncyB8PSBJQl9XQ19XSVRIX0lNTTsKKwkJfQorCisJCXdjLT5zdGF0dXMgPSBJQl9XQ19XUl9GTFVTSF9FUlI7CisKKwkJd2MtPnFwID0gJm15X3FwLT5pYl9xcDsKKworCQkvKiBtYXJrIGFzIHJlcG9ydGVkIGFuZCBhZHZhbmNlIHRhaWwgcG9pbnRlciAqLworCQlxbWFwX2VudHJ5LT5yZXBvcnRlZCA9IDE7CisJCWlmICgrK3FtYXAtPnRhaWwgPT0gcW1hcC0+ZW50cmllcykKKwkJCXFtYXAtPnRhaWwgPSAwOworCQlxbWFwX2VudHJ5ID0gJnFtYXAtPm1hcFtxbWFwLT50YWlsXTsKKworCQl3YysrOyBucisrOworCX0KKworCXJldHVybiBucjsKKworfQorCiBpbnQgZWhjYV9wb2xsX2NxKHN0cnVjdCBpYl9jcSAqY3EsIGludCBudW1fZW50cmllcywgc3RydWN0IGliX3djICp3YykKIHsKIAlzdHJ1Y3QgZWhjYV9jcSAqbXlfY3EgPSBjb250YWluZXJfb2YoY3EsIHN0cnVjdCBlaGNhX2NxLCBpYl9jcSk7CiAJaW50IG5yOworCXN0cnVjdCBlaGNhX3FwICplcnJfcXA7CiAJc3RydWN0IGliX3djICpjdXJyZW50X3djID0gd2M7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZW50cmllc19sZWZ0ID0gbnVtX2VudHJpZXM7CiAKIAlpZiAobnVtX2VudHJpZXMgPCAxKSB7CiAJCWVoY2FfZXJyKGNxLT5kZXZpY2UsICJJbnZhbGlkIG51bV9lbnRyaWVzPSVkIGVoY2FfY3E9JXAgIgpAQCAtNzQ5LDE1ICs4ODEsNDAgQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXlfY3EtPnNwaW5sb2NrLCBmbGFncyk7Ci0JZm9yIChuciA9IDA7IG5yIDwgbnVtX2VudHJpZXM7IG5yKyspIHsKKworCS8qIGdlbmVyYXRlIGZsdXNoIGNxZXMgZm9yIHNlbmQgcXVldWVzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlcnJfcXAsICZteV9jcS0+c3FwX2Vycl9saXN0LCBzcV9lcnJfbm9kZSkgeworCQluciA9IGdlbmVyYXRlX2ZsdXNoX2NxZXMoZXJyX3FwLCBjcSwgY3VycmVudF93YywgZW50cmllc19sZWZ0LAorCQkJCSZlcnJfcXAtPmlwel9zcXVldWUsIDEpOworCQllbnRyaWVzX2xlZnQgLT0gbnI7CisJCWN1cnJlbnRfd2MgKz0gbnI7CisKKwkJaWYgKGVudHJpZXNfbGVmdCA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyogZ2VuZXJhdGUgZmx1c2ggY3FlcyBmb3IgcmVjZWl2ZSBxdWV1ZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVycl9xcCwgJm15X2NxLT5ycXBfZXJyX2xpc3QsIHJxX2Vycl9ub2RlKSB7CisJCW5yID0gZ2VuZXJhdGVfZmx1c2hfY3FlcyhlcnJfcXAsIGNxLCBjdXJyZW50X3djLCBlbnRyaWVzX2xlZnQsCisJCQkJJmVycl9xcC0+aXB6X3JxdWV1ZSwgMCk7CisJCWVudHJpZXNfbGVmdCAtPSBucjsKKwkJY3VycmVudF93YyArPSBucjsKKworCQlpZiAoZW50cmllc19sZWZ0ID09IDApCisJCQlicmVhazsKKwl9CisKKwlmb3IgKG5yID0gMDsgbnIgPCBlbnRyaWVzX2xlZnQ7IG5yKyspIHsKIAkJcmV0ID0gZWhjYV9wb2xsX2NxX29uZShjcSwgY3VycmVudF93Yyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAkJY3VycmVudF93YysrOwogCX0gLyogZW9mIGZvciBuciAqLworCWVudHJpZXNfbGVmdCAtPSBucjsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm15X2NxLT5zcGlubG9jaywgZmxhZ3MpOwogCWlmIChyZXQgPT0gLUVBR0FJTiAgfHwgIXJldCkKLQkJcmV0ID0gbnI7CisJCXJldCA9IG51bV9lbnRyaWVzIC0gZW50cmllc19sZWZ0OwogCiBwb2xsX2NxX2V4aXQwOgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCmluZGV4IDU2YzBlZGEuLjFhZjFmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCkBAIC0yNDU1LDcgKzI0NTUsNyBAQAogCQlnb3RvIGVycl9jZGV2OwogCX0KIAotCWRldmljZSA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShpcGF0aF9jbGFzcywgTlVMTCwgZGV2LCBOVUxMLCBuYW1lKTsKKwlkZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGlwYXRoX2NsYXNzLCBOVUxMLCBkZXYsIE5VTEwsIG5hbWUpOwogCiAJaWYgKElTX0VSUihkZXZpY2UpKSB7CiAJCXJldCA9IFBUUl9FUlIoZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9yYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKaW5kZXggOTc3MTA1Mi4uN2I5M2NkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKQEAgLTY3NSw3ICs2NzUsOCBAQAogCWhkci5scmhbMF0gPSBjcHVfdG9fYmUxNihscmgwKTsKIAloZHIubHJoWzFdID0gY3B1X3RvX2JlMTYocXAtPnJlbW90ZV9haF9hdHRyLmRsaWQpOwogCWhkci5scmhbMl0gPSBjcHVfdG9fYmUxNihod29yZHMgKyBTSVpFX09GX0NSQyk7Ci0JaGRyLmxyaFszXSA9IGNwdV90b19iZTE2KGRkLT5pcGF0aF9saWQpOworCWhkci5scmhbM10gPSBjcHVfdG9fYmUxNihkZC0+aXBhdGhfbGlkIHwKKwkJCQkgcXAtPnJlbW90ZV9haF9hdHRyLnNyY19wYXRoX2JpdHMpOwogCW9oZHItPmJ0aFswXSA9IGNwdV90b19iZTMyKGJ0aDApOwogCW9oZHItPmJ0aFsxXSA9IGNwdV90b19iZTMyKHFwLT5yZW1vdGVfcXBuKTsKIAlvaGRyLT5idGhbMl0gPSBjcHVfdG9fYmUzMihxcC0+cl9hY2tfcHNuICYgSVBBVEhfUFNOX01BU0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3J1Yy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3J1Yy5jCmluZGV4IGFmMDUxZjcuLmZjMGY2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9ydWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcnVjLmMKQEAgLTYxOCw3ICs2MTgsOCBAQAogCXFwLT5zX2hkci5scmhbMF0gPSBjcHVfdG9fYmUxNihscmgwKTsKIAlxcC0+c19oZHIubHJoWzFdID0gY3B1X3RvX2JlMTYocXAtPnJlbW90ZV9haF9hdHRyLmRsaWQpOwogCXFwLT5zX2hkci5scmhbMl0gPSBjcHVfdG9fYmUxNihxcC0+c19oZHJ3b3JkcyArIG53b3JkcyArIFNJWkVfT0ZfQ1JDKTsKLQlxcC0+c19oZHIubHJoWzNdID0gY3B1X3RvX2JlMTYoZGV2LT5kZC0+aXBhdGhfbGlkKTsKKwlxcC0+c19oZHIubHJoWzNdID0gY3B1X3RvX2JlMTYoZGV2LT5kZC0+aXBhdGhfbGlkIHwKKwkJCQkgICAgICAgcXAtPnJlbW90ZV9haF9hdHRyLnNyY19wYXRoX2JpdHMpOwogCWJ0aDAgfD0gaXBhdGhfZ2V0X3BrZXkoZGV2LT5kZCwgcXAtPnNfcGtleV9pbmRleCk7CiAJYnRoMCB8PSBleHRyYV9ieXRlcyA8PCAyMDsKIAlvaGRyLT5idGhbMF0gPSBjcHVfdG9fYmUzMihidGgwIHwgKDEgPDwgMjIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKaW5kZXggYjc2NmU0MC4uZWFiYzQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKQEAgLTM0MCw5ICszNDAsMTYgQEAKIAlpbnQgYWNjOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQgPSB0b19pZGV2KHFwLT5pYnFwLmRldmljZSktPmRkOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAorCWlmIChxcC0+aWJxcC5xcF90eXBlICE9IElCX1FQVF9TTUkgJiYKKwkgICAgIShkZC0+aXBhdGhfZmxhZ3MgJiBJUEFUSF9MSU5LQUNUSVZFKSkgeworCQlyZXQgPSAtRU5FVERPV047CisJCWdvdG8gYmFpbDsKKwl9CisKIAkvKiBDaGVjayB0aGF0IHN0YXRlIGlzIE9LIHRvIHBvc3Qgc2VuZC4gKi8KIAlpZiAodW5saWtlbHkoIShpYl9pcGF0aF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIElQQVRIX1BPU1RfU0VORF9PSykpKQogCQlnb3RvIGJhaWxfaW52YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwppbmRleCBmMjlkYmI3Li5iYWEwMWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKQEAgLTEwNTgsNiArMTA1OCw5IEBACiAJZWxzZQogCQlzcWRfZXZlbnQgPSAwOwogCisJaWYgKCFpYnFwLT51b2JqZWN0ICYmIGN1cl9zdGF0ZSA9PSBJQl9RUFNfUkVTRVQgJiYgbmV3X3N0YXRlID09IElCX1FQU19JTklUKQorCQljb250ZXh0LT5ybGtleSB8PSAoMSA8PCA0KTsKKwogCS8qCiAJICogQmVmb3JlIHBhc3NpbmcgYSBrZXJuZWwgUVAgdG8gdGhlIEhXLCBtYWtlIHN1cmUgdGhhdCB0aGUKIAkgKiBvd25lcnNoaXAgYml0cyBvZiB0aGUgc2VuZCBxdWV1ZSBhcmUgc2V0IGFuZCB0aGUgU1EKQEAgLTEzNDIsNiArMTM0NSwxMiBAQAogc3RhdGljIHZvaWQgc2V0X2Ztcl9zZWcoc3RydWN0IG1seDRfd3FlX2Ztcl9zZWcgKmZzZWcsIHN0cnVjdCBpYl9zZW5kX3dyICp3cikKIHsKIAlzdHJ1Y3QgbWx4NF9pYl9mYXN0X3JlZ19wYWdlX2xpc3QgKm1mcnBsID0gdG9fbWZycGwod3ItPndyLmZhc3RfcmVnLnBhZ2VfbGlzdCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd3ItPndyLmZhc3RfcmVnLnBhZ2VfbGlzdF9sZW47ICsraSkKKwkJd3ItPndyLmZhc3RfcmVnLnBhZ2VfbGlzdC0+cGFnZV9saXN0W2ldID0KKwkJCWNwdV90b19iZTY0KHdyLT53ci5mYXN0X3JlZy5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtpXSB8CisJCQkJICAgIE1MWDRfTVRUX0ZMQUdfUFJFU0VOVCk7CiAKIAlmc2VnLT5mbGFncwkJPSBjb252ZXJ0X2FjY2Vzcyh3ci0+d3IuZmFzdF9yZWcuYWNjZXNzX2ZsYWdzKTsKIAlmc2VnLT5tZW1fa2V5CQk9IGNwdV90b19iZTMyKHdyLT53ci5mYXN0X3JlZy5ya2V5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKaW5kZXggY2M0NDBmOS4uNjVhZDM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKQEAgLTE0OSwxOCArMTQ5LDEwIEBACiAJCSgocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMSkgJgogCQkgZGV2LT5jYXRhc19lcnIuYWRkcik7CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLCBkZXYtPmNhdGFzX2Vyci5zaXplICogNCwKLQkJCQlEUlZfTkFNRSkpIHsKLQkJbXRoY2Ffd2FybihkZXYsICJjb3VsZG4ndCByZXF1ZXN0IGNhdGFzdHJvcGhpYyBlcnJvciByZWdpb24gIgotCQkJICAgImF0IDB4JWx4LzB4JXhcbiIsIGFkZHIsIGRldi0+Y2F0YXNfZXJyLnNpemUgKiA0KTsKLQkJcmV0dXJuOwotCX0KLQogCWRldi0+Y2F0YXNfZXJyLm1hcCA9IGlvcmVtYXAoYWRkciwgZGV2LT5jYXRhc19lcnIuc2l6ZSAqIDQpOwogCWlmICghZGV2LT5jYXRhc19lcnIubWFwKSB7CiAJCW10aGNhX3dhcm4oZGV2LCAiY291bGRuJ3QgbWFwIGNhdGFzdHJvcGhpYyBlcnJvciByZWdpb24gIgogCQkJICAgImF0IDB4JWx4LzB4JXhcbiIsIGFkZHIsIGRldi0+Y2F0YXNfZXJyLnNpemUgKiA0KTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHIsIGRldi0+Y2F0YXNfZXJyLnNpemUgKiA0KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTc1LDEzICsxNjcsOCBAQAogewogCWRlbF90aW1lcl9zeW5jKCZkZXYtPmNhdGFzX2Vyci50aW1lcik7CiAKLQlpZiAoZGV2LT5jYXRhc19lcnIubWFwKSB7CisJaWYgKGRldi0+Y2F0YXNfZXJyLm1hcCkKIAkJaW91bm1hcChkZXYtPmNhdGFzX2Vyci5tYXApOwotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKwotCQkJCSAgICgocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMSkgJgotCQkJCSAgICBkZXYtPmNhdGFzX2Vyci5hZGRyKSwKLQkJCQkgICBkZXYtPmNhdGFzX2Vyci5zaXplICogNCk7Ci0JfQogCiAJc3Bpbl9sb2NrX2lycSgmY2F0YXNfbG9jayk7CiAJbGlzdF9kZWwoJmRldi0+Y2F0YXNfZXJyLmxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwppbmRleCBjYzY4NThmLi4yOGYwZTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwpAQCAtNjUyLDI3ICs2NTIsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKTsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2UgKyBvZmZzZXQsIHNpemUsIERSVl9OQU1FKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCSptYXAgPSBpb3JlbWFwKGJhc2UgKyBvZmZzZXQsIHNpemUpOwotCWlmICghKm1hcCkgewotCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSArIG9mZnNldCwgc2l6ZSk7CisJaWYgKCEqbWFwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRoY2FfdW5tYXBfcmVnKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkIF9faW9tZW0gKm1hcCkKLXsKLQl1bnNpZ25lZCBsb25nIGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKTsKLQotCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlICsgb2Zmc2V0LCBzaXplKTsKLQlpb3VubWFwKG1hcCk7Ci19Ci0KIHN0YXRpYyBpbnQgbXRoY2FfbWFwX2VxX3JlZ3Moc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKQEAgLTY5OSw5ICs2ODUsNyBAQAogCQkJCQlkZXYtPmZ3LmFyYmVsLmVxX2FybV9iYXNlKSArIDQsIDQsCiAJCQkJICAmZGV2LT5lcV9yZWdzLmFyYmVsLmVxX2FybSkpIHsKIAkJCW10aGNhX2VycihkZXYsICJDb3VsZG4ndCBtYXAgRVEgYXJtIHJlZ2lzdGVyLCBhYm9ydGluZy5cbiIpOwotCQkJbXRoY2FfdW5tYXBfcmVnKGRldiwgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDEpICYKLQkJCQkJZGV2LT5mdy5hcmJlbC5jbHJfaW50X2Jhc2UsIE1USENBX0NMUl9JTlRfU0laRSwKLQkJCQkJZGV2LT5jbHJfYmFzZSk7CisJCQlpb3VubWFwKGRldi0+Y2xyX2Jhc2UpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtNzEwLDEyICs2OTQsOCBAQAogCQkJCSAgTVRIQ0FfRVFfU0VUX0NJX1NJWkUsCiAJCQkJICAmZGV2LT5lcV9yZWdzLmFyYmVsLmVxX3NldF9jaV9iYXNlKSkgewogCQkJbXRoY2FfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBFUSBDSSByZWdpc3RlciwgYWJvcnRpbmcuXG4iKTsKLQkJCW10aGNhX3VubWFwX3JlZyhkZXYsICgocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMSkgJgotCQkJCQkgICAgICBkZXYtPmZ3LmFyYmVsLmVxX2FybV9iYXNlKSArIDQsIDQsCi0JCQkJCWRldi0+ZXFfcmVncy5hcmJlbC5lcV9hcm0pOwotCQkJbXRoY2FfdW5tYXBfcmVnKGRldiwgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDEpICYKLQkJCQkJZGV2LT5mdy5hcmJlbC5jbHJfaW50X2Jhc2UsIE1USENBX0NMUl9JTlRfU0laRSwKLQkJCQkJZGV2LT5jbHJfYmFzZSk7CisJCQlpb3VubWFwKGRldi0+ZXFfcmVncy5hcmJlbC5lcV9hcm0pOworCQkJaW91bm1hcChkZXYtPmNscl9iYXNlKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfSBlbHNlIHsKQEAgLTczMSw4ICs3MTEsNyBAQAogCQkJCSAgJmRldi0+ZXFfcmVncy50YXZvci5lY3JfYmFzZSkpIHsKIAkJCW10aGNhX2VycihkZXYsICJDb3VsZG4ndCBtYXAgZWNyIHJlZ2lzdGVyLCAiCiAJCQkJICAiYWJvcnRpbmcuXG4iKTsKLQkJCW10aGNhX3VubWFwX3JlZyhkZXYsIE1USENBX0NMUl9JTlRfQkFTRSwgTVRIQ0FfQ0xSX0lOVF9TSVpFLAotCQkJCQlkZXYtPmNscl9iYXNlKTsKKwkJCWlvdW5tYXAoZGV2LT5jbHJfYmFzZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTc0NCwyMiArNzIzLDEyIEBACiBzdGF0aWMgdm9pZCBtdGhjYV91bm1hcF9lcV9yZWdzKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7Ci0JCW10aGNhX3VubWFwX3JlZyhkZXYsIChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkgLSAxKSAmCi0JCQkJZGV2LT5mdy5hcmJlbC5lcV9zZXRfY2lfYmFzZSwKLQkJCQlNVEhDQV9FUV9TRVRfQ0lfU0laRSwKLQkJCQlkZXYtPmVxX3JlZ3MuYXJiZWwuZXFfc2V0X2NpX2Jhc2UpOwotCQltdGhjYV91bm1hcF9yZWcoZGV2LCAoKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDEpICYKLQkJCQkgICAgICBkZXYtPmZ3LmFyYmVsLmVxX2FybV9iYXNlKSArIDQsIDQsCi0JCQkJZGV2LT5lcV9yZWdzLmFyYmVsLmVxX2FybSk7Ci0JCW10aGNhX3VubWFwX3JlZyhkZXYsIChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkgLSAxKSAmCi0JCQkJZGV2LT5mdy5hcmJlbC5jbHJfaW50X2Jhc2UsIE1USENBX0NMUl9JTlRfU0laRSwKLQkJCQlkZXYtPmNscl9iYXNlKTsKKwkJaW91bm1hcChkZXYtPmVxX3JlZ3MuYXJiZWwuZXFfc2V0X2NpX2Jhc2UpOworCQlpb3VubWFwKGRldi0+ZXFfcmVncy5hcmJlbC5lcV9hcm0pOworCQlpb3VubWFwKGRldi0+Y2xyX2Jhc2UpOwogCX0gZWxzZSB7Ci0JCW10aGNhX3VubWFwX3JlZyhkZXYsIE1USENBX0VDUl9CQVNFLAotCQkJCU1USENBX0VDUl9TSVpFICsgTVRIQ0FfRUNSX0NMUl9TSVpFLAotCQkJCWRldi0+ZXFfcmVncy50YXZvci5lY3JfYmFzZSk7Ci0JCW10aGNhX3VubWFwX3JlZyhkZXYsIE1USENBX0NMUl9JTlRfQkFTRSwgTVRIQ0FfQ0xSX0lOVF9TSVpFLAotCQkJCWRldi0+Y2xyX2Jhc2UpOworCQlpb3VubWFwKGRldi0+ZXFfcmVncy50YXZvci5lY3JfYmFzZSk7CisJCWlvdW5tYXAoZGV2LT5jbHJfYmFzZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYwppbmRleCBmYjlmOTFiLi41MmY2MGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKQEAgLTkyMSw1OCArOTIxLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG10aGNhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRkcl9oaWRkZW4pCi17Ci0JaW50IGVycjsKLQotCS8qCi0JICogV2UgY2FuJ3QganVzdCB1c2UgcGNpX3JlcXVlc3RfcmVnaW9ucygpIGJlY2F1c2UgdGhlIE1TSS1YCi0JICogdGFibGUgaXMgcmlnaHQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmlyc3QgQkFSLiAgSWYgd2UgZGlkCi0JICogcGNpX3JlcXVlc3RfcmVnaW9uIGFuZCBncmFiIGFsbCBvZiB0aGUgZmlyc3QgQkFSLCB0aGVuCi0JICogc2V0dGluZyB1cCBNU0ktWCB3b3VsZCBmYWlsLCBzaW5jZSB0aGUgUENJIGNvcmUgd2FudHMgdG8gZG8KLQkgKiByZXF1ZXN0X21lbV9yZWdpb24gb24gdGhlIE1TSS1YIHZlY3RvciB0YWJsZS4KLQkgKgotCSAqIFNvIGp1c3QgcmVxdWVzdCB3aGF0IHdlIG5lZWQgcmlnaHQgbm93LCBhbmQgcmVxdWVzdCBhbnkKLQkgKiBvdGhlciByZWdpb25zIHdlIG5lZWQgd2hlbiBzZXR0aW5nIHVwIEVRcy4KLQkgKi8KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgKyBNVEhDQV9IQ1JfQkFTRSwKLQkJCQlNVEhDQV9IQ1JfU0laRSwgRFJWX05BTUUpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDIsIERSVl9OQU1FKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9iYXIyX2ZhaWxlZDsKLQotCWlmICghZGRyX2hpZGRlbikgewotCQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgNCwgRFJWX05BTUUpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfYmFyNF9mYWlsZWQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9iYXI0X2ZhaWxlZDoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMik7Ci0KLWVycl9iYXIyX2ZhaWxlZDoKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApICsgTVRIQ0FfSENSX0JBU0UsCi0JCQkgICBNVEhDQV9IQ1JfU0laRSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBtdGhjYV9yZWxlYXNlX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICBpbnQgZGRyX2hpZGRlbikKLXsKLQlpZiAoIWRkcl9oaWRkZW4pCi0JCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCA0KTsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAyKTsKLQotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkgKyBNVEhDQV9IQ1JfQkFTRSwKLQkJCSAgIE1USENBX0hDUl9TSVpFKTsKLX0KLQogc3RhdGljIGludCBtdGhjYV9lbmFibGVfbXNpX3goc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzWzNdOwpAQCAtMTA1OSw3ICsxMDA3LDcgQEAKIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgNCkgJiBJT1JFU09VUkNFX01FTSkpCiAJCWRkcl9oaWRkZW4gPSAxOwogCi0JZXJyID0gbXRoY2FfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGRkcl9oaWRkZW4pOworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCiAJCQkiYWJvcnRpbmcuXG4iKTsKQEAgLTExOTYsNyArMTE0NCw3IEBACiAJaWJfZGVhbGxvY19kZXZpY2UoJm1kZXYtPmliX2Rldik7CiAKIGVycl9mcmVlX3JlczoKLQltdGhjYV9yZWxlYXNlX3JlZ2lvbnMocGRldiwgZGRyX2hpZGRlbik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAogZXJyX2Rpc2FibGVfcGRldjoKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CkBAIC0xMjQwLDggKzExODgsNyBAQAogCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKIAogCQlpYl9kZWFsbG9jX2RldmljZSgmbWRldi0+aWJfZGV2KTsKLQkJbXRoY2FfcmVsZWFzZV9yZWdpb25zKHBkZXYsIG1kZXYtPm10aGNhX2ZsYWdzICYKLQkJCQkgICAgICBNVEhDQV9GTEFHX0REUl9ISURERU4pOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuYwppbmRleCBiMGNhYjY0Li5hMmIwNGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmMKQEAgLTcwLDI3ICs3MCwzMSBAQAogCiAvKiBJbnRlcm9wZXJhYmlsaXR5ICovCiBpbnQgbXBhX3ZlcnNpb24gPSAxOwotbW9kdWxlX3BhcmFtKG1wYV92ZXJzaW9uLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1wYV92ZXJzaW9uLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhtcGFfdmVyc2lvbiwgIk1QQSB2ZXJzaW9uIHRvIGJlIHVzZWQgaW50IE1QQSBSZXEvUmVzcCAoMCBvciAxKSIpOwogCiAvKiBJbnRlcm9wZXJhYmlsaXR5ICovCiBpbnQgZGlzYWJsZV9tcGFfY3JjID0gMDsKLW1vZHVsZV9wYXJhbShkaXNhYmxlX21wYV9jcmMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9tcGFfY3JjLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX21wYV9jcmMsICJEaXNhYmxlIGNoZWNraW5nIG9mIE1QQSBDUkMiKTsKIAogdW5zaWduZWQgaW50IHNlbmRfZmlyc3QgPSAwOwotbW9kdWxlX3BhcmFtKHNlbmRfZmlyc3QsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2VuZF9maXJzdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VuZF9maXJzdCwgIlNlbmQgUkRNQSBNZXNzYWdlIEZpcnN0IG9uIEFjdGl2ZSBDb25uZWN0aW9uIik7CiAKIAogdW5zaWduZWQgaW50IG5lc19kcnZfb3B0ID0gMDsKLW1vZHVsZV9wYXJhbShuZXNfZHJ2X29wdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuZXNfZHJ2X29wdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobmVzX2Rydl9vcHQsICJEcml2ZXIgb3B0aW9uIHBhcmFtZXRlcnMiKTsKIAogdW5zaWduZWQgaW50IG5lc19kZWJ1Z19sZXZlbCA9IDA7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbGV2ZWwsIG5lc19kZWJ1Z19sZXZlbCwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2xldmVsLCAiRW5hYmxlIGRlYnVnIG91dHB1dCBsZXZlbCIpOwogCit1bnNpZ25lZCBpbnQgd3FtX3F1YW50YSA9IDB4MTAwMDA7Cittb2R1bGVfcGFyYW0od3FtX3F1YW50YSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod3FtX3F1YW50YSwgIldRTSBxdWFudGEiKTsKKwogTElTVF9IRUFEKG5lc19hZGFwdGVyX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChuZXNfZGV2X2xpc3QpOwogCkBAIC01NTcsMTIgKzU2MSwzMiBAQAogCQlnb3RvIGJhaWw1OwogCX0KIAluZXNkZXYtPm5lc2FkYXB0ZXItPmV0X3J4X2NvYWxlc2NlX3VzZWNzX2lycSA9IGludGVycnVwdF9tb2RfaW50ZXJ2YWw7CisJbmVzZGV2LT5uZXNhZGFwdGVyLT53cW1fcXVhbnRhID0gd3FtX3F1YW50YTsKIAogCS8qIG5lc2Rldi0+YmFzZV9kb29yYmVsbF9pbmRleCA9CiAJCQluZXNkZXYtPm5lc2FkYXB0ZXItPnBkX2NvbmZpZ19iYXNlW1BDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbildOyAqLwogCW5lc2Rldi0+YmFzZV9kb29yYmVsbF9pbmRleCA9IDE7CiAJbmVzZGV2LT5kb29yYmVsbF9zdGFydCA9IG5lc2Rldi0+bmVzYWRhcHRlci0+ZG9vcmJlbGxfc3RhcnQ7Ci0JbmVzZGV2LT5tYWNfaW5kZXggPSBQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pICUgbmVzZGV2LT5uZXNhZGFwdGVyLT5wb3J0X2NvdW50OworCWlmIChuZXNkZXYtPm5lc2FkYXB0ZXItPnBoeV90eXBlWzBdID09IE5FU19QSFlfVFlQRV9QVU1BXzFHKSB7CisJCXN3aXRjaCAoUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSAlCisJCQluZXNkZXYtPm5lc2FkYXB0ZXItPnBvcnRfY291bnQpIHsKKwkJY2FzZSAxOgorCQkJbmVzZGV2LT5tYWNfaW5kZXggPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW5lc2Rldi0+bWFjX2luZGV4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQluZXNkZXYtPm1hY19pbmRleCA9IDM7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OgorCQkJbmVzZGV2LT5tYWNfaW5kZXggPSAwOworCQl9CisJfSBlbHNlIHsKKwkJbmVzZGV2LT5tYWNfaW5kZXggPSBQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pICUKKwkJCQkJCW5lc2Rldi0+bmVzYWRhcHRlci0+cG9ydF9jb3VudDsKKwl9CiAKIAl0YXNrbGV0X2luaXQoJm5lc2Rldi0+ZHBjX3Rhc2tsZXQsIG5lc19kcGMsICh1bnNpZ25lZCBsb25nKW5lc2Rldik7CiAKQEAgLTU4MSw3ICs2MDUsNyBAQAogCW5lc2Rldi0+aW50X3JlcSA9ICgweDEwMSA8PCBQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pKSB8CiAJCQkoMSA8PCAoUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSsxNikpOwogCWlmIChQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pIDwgNCkgewotCQluZXNkZXYtPmludF9yZXEgfD0gKDEgPDwgKFBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbikrMjQpKTsKKwkJbmVzZGV2LT5pbnRfcmVxIHw9ICgxIDw8IChQQ0lfRlVOQyhuZXNkZXYtPm1hY19pbmRleCkrMjQpKTsKIAl9CiAKIAkvKiBUT0RPOiBUaGlzIHJlYWxseSBzaG91bGQgYmUgdGhlIGZpcnN0IGRyaXZlciB0byBsb2FkLCBub3QgZnVuY3Rpb24gMCAqLwpAQCAtNzcyLDE0ICs3OTYsMTQgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobmVzZGV2LCAmbmVzX2Rldl9saXN0LCBsaXN0KSB7CiAJCWlmIChpID09IGVlX2Zsc2hfYWRhcHRlcikgewotCQkJZGV2Zm4gICAgICA9IG5lc2Rldi0+bmVzYWRhcHRlci0+ZGV2Zm47Ci0JCQlidXNfbnVtYmVyID0gbmVzZGV2LT5uZXNhZGFwdGVyLT5idXNfbnVtYmVyOworCQkJZGV2Zm4gPSBuZXNkZXYtPnBjaWRldi0+ZGV2Zm47CisJCQlidXNfbnVtYmVyID0gbmVzZGV2LT5wY2lkZXYtPmJ1cy0+bnVtYmVyOwogCQkJYnJlYWs7CiAJCX0KIAkJaSsrOwogCX0KIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4OiV4IiwgYnVzX251bWJlciwgZGV2Zm4pOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4OiV4XG4iLCBidXNfbnVtYmVyLCBkZXZmbik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG5lc19zdG9yZV9hZGFwdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsCkBAIC0xMDUwLDYgKzEwNzQsNTUgQEAKIAlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKIH0KIAorCisvKioKKyAqIG5lc19zaG93X3dxbV9xdWFudGEKKyAqLworc3RhdGljIHNzaXplX3QgbmVzX3Nob3dfd3FtX3F1YW50YShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCit7CisJdTMyIHdxbV9xdWFudGFfdmFsdWUgPSAweGRlYWQ7CisJdTMyIGkgPSAwOworCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5lc2RldiwgJm5lc19kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAoaSA9PSBlZV9mbHNoX2FkYXB0ZXIpIHsKKwkJCXdxbV9xdWFudGFfdmFsdWUgPSBuZXNkZXYtPm5lc2FkYXB0ZXItPndxbV9xdWFudGE7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCisJcmV0dXJuICBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JVhcbiIsIHdxbV9xdWFudGEpOworfQorCisKKy8qKgorICogbmVzX3N0b3JlX3dxbV9xdWFudGEKKyAqLworc3RhdGljIHNzaXplX3QgbmVzX3N0b3JlX3dxbV9xdWFudGEoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB3cW1fcXVhbnRhX3ZhbHVlOworCXUzMiB3cW1fY29uZmlnMTsKKwl1MzIgaSA9IDA7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldjsKKworCXN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJndxbV9xdWFudGFfdmFsdWUpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmVzZGV2LCAmbmVzX2Rldl9saXN0LCBsaXN0KSB7CisJCWlmIChpID09IGVlX2Zsc2hfYWRhcHRlcikgeworCQkJbmVzZGV2LT5uZXNhZGFwdGVyLT53cW1fcXVhbnRhID0gd3FtX3F1YW50YV92YWx1ZTsKKwkJCXdxbV9jb25maWcxID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsCisJCQkJCQlORVNfSURYX1dRTV9DT05GSUcxKTsKKwkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9XUU1fQ09ORklHMSwKKwkJCQkJKCh3cW1fcXVhbnRhX3ZhbHVlIDw8IDEpIHwKKwkJCQkJKHdxbV9jb25maWcxICYgMHgwMDAwMDAwMSkpKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKIHN0YXRpYyBEUklWRVJfQVRUUihhZGFwdGVyLCBTX0lSVVNSIHwgU19JV1VTUiwKIAkJICAgbmVzX3Nob3dfYWRhcHRlciwgbmVzX3N0b3JlX2FkYXB0ZXIpOwogc3RhdGljIERSSVZFUl9BVFRSKGVlcHJvbV9jbWQsIFNfSVJVU1IgfCBTX0lXVVNSLApAQCAtMTA2OCw2ICsxMTQxLDggQEAKIAkJICAgbmVzX3Nob3dfaWR4X2FkZHIsIG5lc19zdG9yZV9pZHhfYWRkcik7CiBzdGF0aWMgRFJJVkVSX0FUVFIoaWR4X2RhdGEsIFNfSVJVU1IgfCBTX0lXVVNSLAogCQkgICBuZXNfc2hvd19pZHhfZGF0YSwgbmVzX3N0b3JlX2lkeF9kYXRhKTsKK3N0YXRpYyBEUklWRVJfQVRUUih3cW1fcXVhbnRhLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJICAgbmVzX3Nob3dfd3FtX3F1YW50YSwgbmVzX3N0b3JlX3dxbV9xdWFudGEpOwogCiBzdGF0aWMgaW50IG5lc19jcmVhdGVfZHJpdmVyX3N5c2ZzKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpCiB7CkBAIC0xMDgxLDYgKzExNTYsNyBAQAogCWVycm9yIHw9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcml2ZXJfYXR0cl9ub25pZHhfZGF0YSk7CiAJZXJyb3IgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkcnYtPmRyaXZlciwgJmRyaXZlcl9hdHRyX2lkeF9hZGRyKTsKIAllcnJvciB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmRydi0+ZHJpdmVyLCAmZHJpdmVyX2F0dHJfaWR4X2RhdGEpOworCWVycm9yIHw9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcml2ZXJfYXR0cl93cW1fcXVhbnRhKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEwOTUsNiArMTE3MSw3IEBACiAJZHJpdmVyX3JlbW92ZV9maWxlKCZkcnYtPmRyaXZlciwgJmRyaXZlcl9hdHRyX25vbmlkeF9kYXRhKTsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmRydi0+ZHJpdmVyLCAmZHJpdmVyX2F0dHJfaWR4X2FkZHIpOwogCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcml2ZXJfYXR0cl9pZHhfZGF0YSk7CisJZHJpdmVyX3JlbW92ZV9maWxlKCZkcnYtPmRyaXZlciwgJmRyaXZlcl9hdHRyX3dxbV9xdWFudGEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5oCmluZGV4IDhlYjdhZTkuLjE1OTVkYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuaApAQCAtMTY5LDcgKzE2OSw3IEBACiBleHRlcm4gdW5zaWduZWQgaW50IHNlbmRfZmlyc3Q7CiBleHRlcm4gdW5zaWduZWQgaW50IG5lc19kcnZfb3B0OwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZXNfZGVidWdfbGV2ZWw7Ci0KK2V4dGVybiB1bnNpZ25lZCBpbnQgd3FtX3F1YW50YTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG5lc19hZGFwdGVyX2xpc3Q7CiAKIGV4dGVybiBhdG9taWNfdCBjbV9jb25uZWN0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCmluZGV4IDlmMGI5NjQuLjJjYWY5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwpAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KQEAgLTEwMTksMjMgKzEwMTksNDMgQEAKIAogCiAvKioKLSAqIG5lc19hZGRyX3NlbmRfYXJwCisgKiBuZXNfYWRkcl9yZXNvbHZlX25laWdoCiAgKi8KLXN0YXRpYyB2b2lkIG5lc19hZGRyX3NlbmRfYXJwKHUzMiBkc3RfaXApCitzdGF0aWMgaW50IG5lc19hZGRyX3Jlc29sdmVfbmVpZ2goc3RydWN0IG5lc192bmljICpuZXN2bmljLCB1MzIgZHN0X2lwKQogewogCXN0cnVjdCBydGFibGUgKnJ0OwogCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlpbnQgcmMgPSAtMTsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZiBmbCk7CiAJZmwubmxfdS5pcDRfdS5kYWRkciA9IGh0b25sKGRzdF9pcCk7CiAJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJmluaXRfbmV0LCAmcnQsICZmbCkpIHsKIAkJcHJpbnRrKCIlczogaXBfcm91dGVfb3V0cHV0X2tleSBmYWlsZWQgZm9yIDB4JTA4WFxuIiwKIAkJCQlfX2Z1bmNfXywgZHN0X2lwKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CiAJfQogCi0JbmVpZ2hfZXZlbnRfc2VuZChydC0+dS5kc3QubmVpZ2hib3VyLCBOVUxMKTsKKwluZWlnaCA9IG5laWdoX2xvb2t1cCgmYXJwX3RibCwgJnJ0LT5ydF9nYXRld2F5LCBuZXN2bmljLT5uZXRkZXYpOworCWlmIChuZWlnaCkgeworCQlpZiAobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkgeworCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJOZWlnaGJvciBNQUMgYWRkcmVzcyBmb3IgMHglMDhYIgorCQkJCSAgIiBpcyAlcywgR2F0ZXdheSBpcyAweCUwOFggXG4iLCBkc3RfaXAsCisJCQkJICBwcmludF9tYWMobWFjLCBuZWlnaC0+aGEpLCBudG9obChydC0+cnRfZ2F0ZXdheSkpOworCQkJbmVzX21hbmFnZV9hcnBfY2FjaGUobmVzdm5pYy0+bmV0ZGV2LCBuZWlnaC0+aGEsCisJCQkJCSAgICAgZHN0X2lwLCBORVNfQVJQX0FERCk7CisJCQlyYyA9IG5lc19hcnBfdGFibGUobmVzdm5pYy0+bmVzZGV2LCBkc3RfaXAsIE5VTEwsCisJCQkJCSAgIE5FU19BUlBfUkVTT0xWRSk7CisJCX0KKwkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CisJfQorCisJaWYgKChuZWlnaCA9PSBOVUxMKSB8fCAoIShuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkpCisJCW5laWdoX2V2ZW50X3NlbmQocnQtPnUuZHN0Lm5laWdoYm91ciwgTlVMTCk7CisKIAlpcF9ydF9wdXQocnQpOworCXJldHVybiByYzsKIH0KIAogCkBAIC0xMTA4LDkgKzExMjgsMTEgQEAKIAkvKiBnZXQgdGhlIG1hYyBhZGRyIGZvciB0aGUgcmVtb3RlIG5vZGUgKi8KIAlhcnBpbmRleCA9IG5lc19hcnBfdGFibGUobmVzZGV2LCBjbV9ub2RlLT5yZW1fYWRkciwgTlVMTCwgTkVTX0FSUF9SRVNPTFZFKTsKIAlpZiAoYXJwaW5kZXggPCAwKSB7Ci0JCWtmcmVlKGNtX25vZGUpOwotCQluZXNfYWRkcl9zZW5kX2FycChjbV9pbmZvLT5yZW1fYWRkcik7Ci0JCXJldHVybiBOVUxMOworCQlhcnBpbmRleCA9IG5lc19hZGRyX3Jlc29sdmVfbmVpZ2gobmVzdm5pYywgY21faW5mby0+cmVtX2FkZHIpOworCQlpZiAoYXJwaW5kZXggPCAwKSB7CisJCQlrZnJlZShjbV9ub2RlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQogCiAJLyogY29weSB0aGUgbWFjIGFkZHIgdG8gbm9kZSBjb250ZXh0ICovCkBAIC0xODI2LDcgKzE4NDgsNyBAQAogLyoqCiAgKiBtaW5pX2NtX2Nvbm5lY3QgLSBtYWtlIGEgY29ubmVjdGlvbiBub2RlIHdpdGggcGFyYW1zCiAgKi8KLXN0cnVjdCBuZXNfY21fbm9kZSAqbWluaV9jbV9jb25uZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKK3N0YXRpYyBzdHJ1Y3QgbmVzX2NtX25vZGUgKm1pbmlfY21fY29ubmVjdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCiAJc3RydWN0IG5lc192bmljICpuZXN2bmljLCB1MTYgcHJpdmF0ZV9kYXRhX2xlbiwKIAl2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBuZXNfY21faW5mbyAqY21faW5mbykKIHsKQEAgLTE5NTYsMTMgKzE5NzgsNiBAQAogCQlyZXR1cm4gcmV0OwogCWNsZWFudXBfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKIAljbV9ub2RlLT5zdGF0ZSA9IE5FU19DTV9TVEFURV9DTE9TRUQ7Ci0JcmV0ID0gc2VuZF9maW4oY21fbm9kZSwgTlVMTCk7Ci0KLQlpZiAoY21fbm9kZS0+YWNjZXB0X3BlbmQpIHsKLQkJQlVHX09OKCFjbV9ub2RlLT5saXN0ZW5lcik7Ci0JCWF0b21pY19kZWMoJmNtX25vZGUtPmxpc3RlbmVyLT5wZW5kX2FjY2VwdHNfY250KTsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZjbV9ub2RlLT5saXN0ZW5lci0+cGVuZF9hY2NlcHRzX2NudCkgPCAwKTsKLQl9CiAKIAlyZXQgPSBzZW5kX3Jlc2V0KGNtX25vZGUsIE5VTEwpOwogCXJldHVybiByZXQ7CkBAIC0yMDE0LDcgKzIwMjksNiBAQAogCQlyZXQgPSByZW1fcmVmX2NtX25vZGUoY21fY29yZSwgY21fbm9kZSk7CiAJCWJyZWFrOwogCX0KLQljbV9ub2RlLT5jbV9pZCA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjM4Myw2ICsyMzk3LDcgQEAKIAkJCWF0b21pY19pbmMoJmNtX2Rpc2Nvbm5lY3RzKTsKIAkJCWNtX2V2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfRElTQ09OTkVDVDsKIAkJCWlmIChsYXN0X2FlID09IE5FU19BRVFFX0FFSURfTExQX0NPTk5FQ1RJT05fUkVTRVQpIHsKKwkJCQlpc3N1ZWRfZGlzY29ubmVjdF9yZXNldCA9IDE7CiAJCQkJY21fZXZlbnQuc3RhdHVzID0gSVdfQ01fRVZFTlRfU1RBVFVTX1JFU0VUOwogCQkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiR2VuZXJhdGluZyBhIENNICIKIAkJCQkJIkRpc2Nvbm5lY3QgRXZlbnQgKHN0YXR1cyByZXNldCkgZm9yICIKQEAgLTI1MDgsNyArMjUyMyw2IEBACiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQ2FsbCBjbG9zZSBBUElcbiIpOwogCiAJCWdfY21fY29yZS0+YXBpLT5jbG9zZShnX2NtX2NvcmUsIG5lc3FwLT5jbV9ub2RlKTsKLQkJbmVzcXAtPmNtX25vZGUgPSBOVUxMOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yODM3LDYgKzI4NTEsNyBAQAogCWNtX25vZGUtPmFwYnZ0X3NldCA9IDE7CiAJbmVzcXAtPmNtX25vZGUgPSBjbV9ub2RlOwogCWNtX25vZGUtPm5lc3FwID0gbmVzcXA7CisJbmVzX2FkZF9yZWYoJm5lc3FwLT5pYnFwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzE2Nyw3ICszMTgyLDYgQEAKIAlpZiAocmV0KQogCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XSBPRkEgQ00gZXZlbnRfaGFuZGxlciByZXR1cm5lZCwgIgogCQkJInJldD0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXQpOwotCW5lc19yZW1fcmVmKCZuZXNxcC0+aWJxcCk7CiAJY21faWQtPnJlbV9yZWYoY21faWQpOwogCiAJcmVtX3JlZl9jbV9ub2RlKGV2ZW50LT5jbV9ub2RlLT5jbV9jb3JlLCBldmVudC0+Y21fbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuYwppbmRleCAxNTEzZDQwLi43YzQ5Y2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmMKQEAgLTU1LDE4ICs1NSwxOSBAQAogdTMyIGludF9tb2RfY3FfZGVwdGhfMTY7CiB1MzIgaW50X21vZF9jcV9kZXB0aF80OwogdTMyIGludF9tb2RfY3FfZGVwdGhfMTsKLQorc3RhdGljIGNvbnN0IHU4IG5lc19tYXhfY3JpdGljYWxfZXJyb3JfY291bnQgPSAxMDA7CiAjaW5jbHVkZSAibmVzX2NtLmgiCiAKIHN0YXRpYyB2b2lkIG5lc19jcXBfY2VfaGFuZGxlcihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX2h3X2NxICpjcSk7CiBzdGF0aWMgdm9pZCBuZXNfaW5pdF9jc3JfbmUwMjAoc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiwgdTggaHdfcmV2LCB1OCBwb3J0X2NvdW50KTsKIHN0YXRpYyBpbnQgbmVzX2luaXRfc2VyZGVzKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHU4IGh3X3JldiwgdTggcG9ydF9jb3VudCwKLQkJCSAgIHU4IE9uZUdfTW9kZSk7CisJCQkJc3RydWN0IG5lc19hZGFwdGVyICpuZXNhZGFwdGVyLCB1OCAgT25lR19Nb2RlKTsKIHN0YXRpYyB2b2lkIG5lc19uaWNfbmFwaV9jZV9oYW5kbGVyKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXNfaHdfbmljX2NxICpjcSk7CiBzdGF0aWMgdm9pZCBuZXNfcHJvY2Vzc19hZXEoc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19od19hZXEgKmFlcSk7CiBzdGF0aWMgdm9pZCBuZXNfcHJvY2Vzc19jZXEoc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19od19jZXEgKmNlcSk7CiBzdGF0aWMgdm9pZCBuZXNfcHJvY2Vzc19pd2FycF9hZXFlKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsCiAJCQkJICAgc3RydWN0IG5lc19od19hZXFlICphZXFlKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY3JpdGljYWxfZXJyb3Ioc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldik7CiBzdGF0aWMgdm9pZCBuZXNfcHJvY2Vzc19tYWNfaW50cihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCB1MzIgbWFjX251bWJlcik7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5lc19yZXNldF9hZGFwdGVyX25lMDIwKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHU4ICpPbmVHX01vZGUpOwogCkBAIC0yMjIsMTEgKzIyMywxMCBAQAogCX0KIAogCS8qIGJvdW5kYXJ5IGNoZWNraW5nICovCi0JaWYgKHNoYXJlZF90aW1lci0+dGltZXJfaW5fdXNlID4gTkVTX05JQ19GQVNUX1RJTUVSX0hJR0gpCi0JCXNoYXJlZF90aW1lci0+dGltZXJfaW5fdXNlID0gTkVTX05JQ19GQVNUX1RJTUVSX0hJR0g7Ci0JZWxzZSBpZiAoc2hhcmVkX3RpbWVyLT50aW1lcl9pbl91c2UgPCBORVNfTklDX0ZBU1RfVElNRVJfTE9XKSB7Ci0JCXNoYXJlZF90aW1lci0+dGltZXJfaW5fdXNlID0gTkVTX05JQ19GQVNUX1RJTUVSX0xPVzsKLQl9CisJaWYgKHNoYXJlZF90aW1lci0+dGltZXJfaW5fdXNlID4gc2hhcmVkX3RpbWVyLT50aHJlc2hvbGRfaGlnaCkKKwkJc2hhcmVkX3RpbWVyLT50aW1lcl9pbl91c2UgPSBzaGFyZWRfdGltZXItPnRocmVzaG9sZF9oaWdoOworCWVsc2UgaWYgKHNoYXJlZF90aW1lci0+dGltZXJfaW5fdXNlIDwgc2hhcmVkX3RpbWVyLT50aHJlc2hvbGRfbG93KQorCQlzaGFyZWRfdGltZXItPnRpbWVyX2luX3VzZSA9IHNoYXJlZF90aW1lci0+dGhyZXNob2xkX2xvdzsKIAogCW5lc2Rldi0+Y3VycmNxX2NvdW50ID0gMDsKIApAQCAtMjkyLDkgKzI5Miw2IEBACiAKIAlpZiAoKHBvcnRfY291bnQgPSBuZXNfcmVzZXRfYWRhcHRlcl9uZTAyMChuZXNkZXYsICZPbmVHX01vZGUpKSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAobmVzX2luaXRfc2VyZGVzKG5lc2RldiwgaHdfcmV2LCBwb3J0X2NvdW50LCBPbmVHX01vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQluZXNfaW5pdF9jc3JfbmUwMjAobmVzZGV2LCBod19yZXYsIHBvcnRfY291bnQpOwogCiAJbWF4X3FwID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfUVBfQ1RYX1NJWkUpOwogCW5lc19kZWJ1ZyhORVNfREJHX0lOSVQsICJRUF9DVFhfU0laRT0ldVxuIiwgbWF4X3FwKTsKQEAgLTM1Myw2ICszNTAsMjIgQEAKIAluZXNfZGVidWcoTkVTX0RCR19JTklULCAiQWxsb2NhdGluZyBuZXcgbmVzYWRhcHRlciBAICVwLCBzaXplID0gJXUgKGFjdHVhbCBzaXplID0gJXUpLlxuIiwKIAkJCW5lc2FkYXB0ZXIsICh1MzIpc2l6ZW9mKHN0cnVjdCBuZXNfYWRhcHRlciksIGFkYXB0ZXJfc2l6ZSk7CiAKKwlpZiAobmVzX3JlYWRfZWVwcm9tX3ZhbHVlcyhuZXNkZXYsIG5lc2FkYXB0ZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWFkIEVFUFJPTSBkYXRhLlxuIik7CisJCWtmcmVlKG5lc2FkYXB0ZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobmVzX2luaXRfc2VyZGVzKG5lc2RldiwgaHdfcmV2LCBwb3J0X2NvdW50LCBuZXNhZGFwdGVyLAorCQkJCQkJCU9uZUdfTW9kZSkpIHsKKwkJa2ZyZWUobmVzYWRhcHRlcik7CisJCXJldHVybiBOVUxMOworCX0KKwluZXNfaW5pdF9jc3JfbmUwMjAobmVzZGV2LCBod19yZXYsIHBvcnRfY291bnQpOworCisJbWVtc2V0KG5lc2FkYXB0ZXItPnBmdF9tY2FzdF9tYXAsIDI1NSwKKwkgICAgICAgc2l6ZW9mIG5lc2FkYXB0ZXItPnBmdF9tY2FzdF9tYXApOworCiAJLyogcG9wdWxhdGUgdGhlIG5ldyBuZXNhZGFwdGVyICovCiAJbmVzYWRhcHRlci0+ZGV2Zm4gPSBuZXNkZXYtPnBjaWRldi0+ZGV2Zm47CiAJbmVzYWRhcHRlci0+YnVzX251bWJlciA9IG5lc2Rldi0+cGNpZGV2LT5idXMtPm51bWJlcjsKQEAgLTQ2OCwyMCArNDgxLDI1IEBACiAKIAkvKiBzZXR1cCBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KIAlpZiAobmVzYWRhcHRlci0+cG9ydF9jb3VudCA9PSAxKSB7Ci0JCXUzMnRlbXAgPSAweDAwMDAwMDAwOworCQluZXNhZGFwdGVyLT5sb2dfcG9ydCA9IDB4MDAwMDAwMDA7CiAJCWlmIChuZXNfZHJ2X29wdCAmIE5FU19EUlZfT1BUX0RVQUxfTE9HSUNBTF9QT1JUKQogCQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1RYX1BPT0xfU0laRSwgMHgwMDAwMDAwMik7CiAJCWVsc2UKIAkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9UWF9QT09MX1NJWkUsIDB4MDAwMDAwMDMpOwogCX0gZWxzZSB7Ci0JCWlmIChuZXNhZGFwdGVyLT5wb3J0X2NvdW50ID09IDIpCi0JCQl1MzJ0ZW1wID0gMHgwMDAwMDA0NDsKLQkJZWxzZQotCQkJdTMydGVtcCA9IDB4MDAwMDAwZTQ7CisJCWlmIChuZXNhZGFwdGVyLT5waHlfdHlwZVswXSA9PSBORVNfUEhZX1RZUEVfUFVNQV8xRykgeworCQkJbmVzYWRhcHRlci0+bG9nX3BvcnQgPSAweDAwMDAwMEQ4OworCQl9IGVsc2UgeworCQkJaWYgKG5lc2FkYXB0ZXItPnBvcnRfY291bnQgPT0gMikKKwkJCQluZXNhZGFwdGVyLT5sb2dfcG9ydCA9IDB4MDAwMDAwNDQ7CisJCQllbHNlCisJCQkJbmVzYWRhcHRlci0+bG9nX3BvcnQgPSAweDAwMDAwMGU0OworCQl9CiAJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9UWF9QT09MX1NJWkUsIDB4MDAwMDAwMDMpOwogCX0KIAotCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9OSUNfTE9HUE9SVF9UT19QSFlQT1JULCB1MzJ0ZW1wKTsKKwluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTklDX0xPR1BPUlRfVE9fUEhZUE9SVCwKKwkJCQkJCW5lc2FkYXB0ZXItPmxvZ19wb3J0KTsKIAluZXNfZGVidWcoTkVTX0RCR19JTklULCAiUHJvYmUgdGltZSwgTE9HMlBIWT0ldVxuIiwKIAkJCW5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX05JQ19MT0dQT1JUX1RPX1BIWVBPUlQpKTsKIApAQCAtNzA2LDIzICs3MjQsNDMgQEAKICAqIG5lc19pbml0X3NlcmRlcwogICovCiBzdGF0aWMgaW50IG5lc19pbml0X3NlcmRlcyhzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCB1OCBod19yZXYsIHU4IHBvcnRfY291bnQsCi0JCQkgICB1OCBPbmVHX01vZGUpCisJCQkJc3RydWN0IG5lc19hZGFwdGVyICpuZXNhZGFwdGVyLCB1OCAgT25lR19Nb2RlKQogewogCWludCBpOwogCXUzMiB1MzJ0ZW1wOworCXUzMiBzZXJkZXNfY29tbW9uX2NvbnRyb2w7CiAKIAlpZiAoaHdfcmV2ICE9IE5FMDIwX1JFVikgewogCQkvKiBpbml0IHNlcmRlcyAwICovCiAKIAkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0VUSF9TRVJERVNfQ0RSX0NPTlRST0wwLCAweDAwMDAwMEZGKTsKLQkJaWYgKCFPbmVHX01vZGUpCisJCWlmIChuZXNhZGFwdGVyLT5waHlfdHlwZVswXSA9PSBORVNfUEhZX1RZUEVfUFVNQV8xRykgeworCQkJc2VyZGVzX2NvbW1vbl9jb250cm9sID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsCisJCQkJCU5FU19JRFhfRVRIX1NFUkRFU19DT01NT05fQ09OVFJPTDApOworCQkJc2VyZGVzX2NvbW1vbl9jb250cm9sIHw9IDB4MDAwMDAwMTAwOworCQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LAorCQkJCQlORVNfSURYX0VUSF9TRVJERVNfQ09NTU9OX0NPTlRST0wwLAorCQkJCQlzZXJkZXNfY29tbW9uX2NvbnRyb2wpOworCQl9IGVsc2UgaWYgKCFPbmVHX01vZGUpIHsKIAkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9FVEhfU0VSREVTX1RYX0hJR0haX0xBTkVfTU9ERTAsIDB4MTExMTAwMDApOwotCQlpZiAocG9ydF9jb3VudCA+IDEpIHsKKwkJfQorCQlpZiAoKChwb3J0X2NvdW50ID4gMSkgJiYKKwkJCShuZXNhZGFwdGVyLT5waHlfdHlwZVswXSAhPSBORVNfUEhZX1RZUEVfUFVNQV8xRykpIHx8CisJCQkoKHBvcnRfY291bnQgPiAyKSAmJgorCQkJKG5lc2FkYXB0ZXItPnBoeV90eXBlWzBdID09IE5FU19QSFlfVFlQRV9QVU1BXzFHKSkpIHsKIAkJCS8qIGluaXQgc2VyZGVzIDEgKi8KIAkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9FVEhfU0VSREVTX0NEUl9DT05UUk9MMSwgMHgwMDAwMDBGRik7Ci0JCQlpZiAoIU9uZUdfTW9kZSkKKwkJCWlmIChuZXNhZGFwdGVyLT5waHlfdHlwZVswXSA9PSBORVNfUEhZX1RZUEVfUFVNQV8xRykgeworCQkJCXNlcmRlc19jb21tb25fY29udHJvbCA9IG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LAorCQkJCQlORVNfSURYX0VUSF9TRVJERVNfQ09NTU9OX0NPTlRST0wxKTsKKwkJCQlzZXJkZXNfY29tbW9uX2NvbnRyb2wgfD0gMHgwMDAwMDAxMDA7CisJCQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LAorCQkJCQlORVNfSURYX0VUSF9TRVJERVNfQ09NTU9OX0NPTlRST0wxLAorCQkJCQlzZXJkZXNfY29tbW9uX2NvbnRyb2wpOworCQkJfSBlbHNlIGlmICghT25lR19Nb2RlKSB7CiAJCQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0VUSF9TRVJERVNfVFhfSElHSFpfTEFORV9NT0RFMSwgMHgxMTExMDAwMCk7CiAJCQl9CisJCX0KIAl9IGVsc2UgewogCQkvKiBpbml0IHNlcmRlcyAwICovCiAJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9FVEhfU0VSREVTX0NPTU1PTl9DT05UUk9MMCwgMHgwMDAwMDAwOCk7CkBAIC04MjYsNyArODY0LDggQEAKIAogCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgMHgwMDAwNTAwMCwgMHgwMDAxODAwMCk7CiAJLyogbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCAweDAwMDA1MDAwLCAweDAwMDEwMDAwKTsgKi8KLQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIDB4MDAwMDUwMDQsIDB4MDAwMjAwMDEpOworCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9XUU1fQ09ORklHMSwgKHdxbV9xdWFudGEgPDwgMSkgfAorCQkJCQkJCSAweDAwMDAwMDAxKTsKIAluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIDB4MDAwMDUwMDgsIDB4MUYxRjFGMUYpOwogCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgMHgwMDAwNTAxMCwgMHgxRjFGMUYxRik7CiAJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCAweDAwMDA1MDE4LCAweDFGMUYxRjFGKTsKQEAgLTEyMjYsNiArMTI2NSw3IEBACiAJCWlmIChuZXNhZGFwdGVyLT5waHlfdHlwZVttYWNfaW5kZXhdID09IE5FU19QSFlfVFlQRV8xRykgewogCQkJcHJpbnRrKFBGWCAiJXM6IFByb2dyYW1taW5nIG1kYyBjb25maWcgZm9yIDFHXG4iLCBfX2Z1bmNfXyk7CiAJCQl0eF9jb25maWcgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9NQUNfVFhfQ09ORklHKTsKKwkJCXR4X2NvbmZpZyAmPSAweEZGRkZGRkUzOwogCQkJdHhfY29uZmlnIHw9IDB4MDQ7CiAJCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTUFDX1RYX0NPTkZJRywgdHhfY29uZmlnKTsKIAkJfQpAQCAtMTI5MSw3ICsxMzMxLDggQEAKIAkJICAgIChuZXNhZGFwdGVyLT5waHlfdHlwZVttYWNfaW5kZXhdID09IE5FU19QSFlfVFlQRV9BUkdVUykpIHsKIAkJCS8qIHNldHVwIDEwRyBNRElPIG9wZXJhdGlvbiAqLwogCQkJdHhfY29uZmlnID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTUFDX1RYX0NPTkZJRyk7Ci0JCQl0eF9jb25maWcgfD0gMHgxNDsKKwkJCXR4X2NvbmZpZyAmPSAweEZGRkZGRkUzOworCQkJdHhfY29uZmlnIHw9IDB4MTU7CiAJCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTUFDX1RYX0NPTkZJRywgdHhfY29uZmlnKTsKIAkJfQogCQlpZiAoKG5lc2FkYXB0ZXItPnBoeV90eXBlW21hY19pbmRleF0gPT0gTkVTX1BIWV9UWVBFX0FSR1VTKSkgewpAQCAtMTMxNSw3ICsxMzU2LDcgQEAKIAkJCQluZXNfd3JpdGVfMTBHX3BoeV9yZWcobmVzZGV2LCBuZXNhZGFwdGVyLT5waHlfaW5kZXhbbWFjX2luZGV4XSwgMHgxLCAweGMzMTksIDB4MDAwOCk7CiAJCQkJbmVzX3dyaXRlXzEwR19waHlfcmVnKG5lc2RldiwgbmVzYWRhcHRlci0+cGh5X2luZGV4W21hY19pbmRleF0sIDB4MSwgMHhjMzFhLCAweDAwOTgpOwogCQkJCW5lc193cml0ZV8xMEdfcGh5X3JlZyhuZXNkZXYsIG5lc2FkYXB0ZXItPnBoeV9pbmRleFttYWNfaW5kZXhdLCAweDMsIDB4MDAyNiwgMHgwRTAwKTsKLQkJCQluZXNfd3JpdGVfMTBHX3BoeV9yZWcobmVzZGV2LCBuZXNhZGFwdGVyLT5waHlfaW5kZXhbbWFjX2luZGV4XSwgMHgzLCAweDAwMjcsIDB4MDAwMCk7CisJCQkJbmVzX3dyaXRlXzEwR19waHlfcmVnKG5lc2RldiwgbmVzYWRhcHRlci0+cGh5X2luZGV4W21hY19pbmRleF0sIDB4MywgMHgwMDI3LCAweDAwMDEpOwogCQkJCW5lc193cml0ZV8xMEdfcGh5X3JlZyhuZXNkZXYsIG5lc2FkYXB0ZXItPnBoeV9pbmRleFttYWNfaW5kZXhdLCAweDMsIDB4MDAyOCwgMHhBNTI4KTsKIAogCQkJCS8qCkBAIC0xNzU5LDkgKzE4MDAsMTQgQEAKICAqLwogdm9pZCBuZXNfZGVzdHJveV9uaWNfcXAoc3RydWN0IG5lc192bmljICpuZXN2bmljKQogeworCXU2NCB1NjR0ZW1wOworCWRtYV9hZGRyX3QgYnVzX2FkZHJlc3M7CiAJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldiA9IG5lc3ZuaWMtPm5lc2RldjsKIAlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJc3RydWN0IG5lc19od19uaWNfc3Ffd3FlICpuaWNfc3FlOwogCXN0cnVjdCBuZXNfaHdfbmljX3JxX3dxZSAqbmljX3JxZTsKKwlfX2xlMTYgKndxZV9mcmFnbWVudF9sZW5ndGg7CisJdTE2ICB3cWVfZnJhZ21lbnRfaW5kZXg7CiAJdTY0IHdxZV9mcmFnOwogCXUzMiBjcXBfaGVhZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTc3MCwxNCArMTgxNiw2OSBAQAogCS8qIEZyZWUgcmVtYWluaW5nIE5JQyByZWNlaXZlIGJ1ZmZlcnMgKi8KIAl3aGlsZSAobmVzdm5pYy0+bmljLnJxX2hlYWQgIT0gbmVzdm5pYy0+bmljLnJxX3RhaWwpIHsKIAkJbmljX3JxZSAgID0gJm5lc3ZuaWMtPm5pYy5ycV92YmFzZVtuZXN2bmljLT5uaWMucnFfdGFpbF07Ci0JCXdxZV9mcmFnICA9ICh1NjQpbGUzMl90b19jcHUobmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0xPV19JRFhdKTsKLQkJd3FlX2ZyYWcgfD0gKCh1NjQpbGUzMl90b19jcHUobmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0hJR0hfSURYXSkpIDw8IDMyOworCQl3cWVfZnJhZyAgPSAodTY0KWxlMzJfdG9fY3B1KAorCQkJbmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0xPV19JRFhdKTsKKwkJd3FlX2ZyYWcgfD0gKCh1NjQpbGUzMl90b19jcHUoCisJCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfRlJBRzBfSElHSF9JRFhdKSk8PDMyOwogCQlwY2lfdW5tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCAoZG1hX2FkZHJfdCl3cWVfZnJhZywKIAkJCQluZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJZGV2X2tmcmVlX3NrYihuZXN2bmljLT5uaWMucnhfc2tiW25lc3ZuaWMtPm5pYy5ycV90YWlsKytdKTsKIAkJbmVzdm5pYy0+bmljLnJxX3RhaWwgJj0gKG5lc3ZuaWMtPm5pYy5ycV9zaXplIC0gMSk7CiAJfQogCisJLyogRnJlZSByZW1haW5pbmcgTklDIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwl3aGlsZSAobmVzdm5pYy0+bmljLnNxX2hlYWQgIT0gbmVzdm5pYy0+bmljLnNxX3RhaWwpIHsKKwkJbmljX3NxZSA9ICZuZXN2bmljLT5uaWMuc3FfdmJhc2VbbmVzdm5pYy0+bmljLnNxX3RhaWxdOworCQl3cWVfZnJhZ21lbnRfaW5kZXggPSAxOworCQl3cWVfZnJhZ21lbnRfbGVuZ3RoID0gKF9fbGUxNiAqKQorCQkJJm5pY19zcWUtPndxZV93b3Jkc1tORVNfTklDX1NRX1dRRV9MRU5HVEhfMF9UQUdfSURYXTsKKwkJLyogYnVtcCBwYXN0IHRoZSB2bGFuIHRhZyAqLworCQl3cWVfZnJhZ21lbnRfbGVuZ3RoKys7CisJCWlmIChsZTE2X3RvX2NwdSh3cWVfZnJhZ21lbnRfbGVuZ3RoW3dxZV9mcmFnbWVudF9pbmRleF0pICE9IDApIHsKKwkJCXU2NHRlbXAgPSAodTY0KWxlMzJfdG9fY3B1KAorCQkJCW5pY19zcWUtPndxZV93b3Jkc1tORVNfTklDX1NRX1dRRV9GUkFHMF9MT1dfSURYKworCQkJCXdxZV9mcmFnbWVudF9pbmRleCoyXSk7CisJCQl1NjR0ZW1wICs9ICgodTY0KWxlMzJfdG9fY3B1KAorCQkJCW5pY19zcWUtPndxZV93b3Jkc1tORVNfTklDX1NRX1dRRV9GUkFHMF9ISUdIX0lEWAorCQkJCSsgd3FlX2ZyYWdtZW50X2luZGV4KjJdKSk8PDMyOworCQkJYnVzX2FkZHJlc3MgPSAoZG1hX2FkZHJfdCl1NjR0ZW1wOworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChuZXN2bmljLT5uaWMuc3FfdGFpbCwKKwkJCQkJbmVzdm5pYy0+bmljLmZpcnN0X2ZyYWdfb3ZlcmZsb3cpKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwKKwkJCQkJCWJ1c19hZGRyZXNzLAorCQkJCQkJbGUxNl90b19jcHUod3FlX2ZyYWdtZW50X2xlbmd0aFsKKwkJCQkJCQl3cWVfZnJhZ21lbnRfaW5kZXgrK10pLAorCQkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQl9CisJCQlmb3IgKDsgd3FlX2ZyYWdtZW50X2luZGV4IDwgNTsgd3FlX2ZyYWdtZW50X2luZGV4KyspIHsKKwkJCQlpZiAod3FlX2ZyYWdtZW50X2xlbmd0aFt3cWVfZnJhZ21lbnRfaW5kZXhdKSB7CisJCQkJCXU2NHRlbXAgPSBsZTMyX3RvX2NwdSgKKwkJCQkJCW5pY19zcWUtPndxZV93b3Jkc1sKKwkJCQkJCU5FU19OSUNfU1FfV1FFX0ZSQUcwX0xPV19JRFgrCisJCQkJCQl3cWVfZnJhZ21lbnRfaW5kZXgqMl0pOworCQkJCQl1NjR0ZW1wICs9ICgodTY0KWxlMzJfdG9fY3B1KAorCQkJCQkJbmljX3NxZS0+d3FlX3dvcmRzWworCQkJCQkJTkVTX05JQ19TUV9XUUVfRlJBRzBfSElHSF9JRFgrCisJCQkJCQl3cWVfZnJhZ21lbnRfaW5kZXgqMl0pKTw8MzI7CisJCQkJCWJ1c19hZGRyZXNzID0gKGRtYV9hZGRyX3QpdTY0dGVtcDsKKwkJCQkJcGNpX3VubWFwX3BhZ2UobmVzZGV2LT5wY2lkZXYsCisJCQkJCQkJYnVzX2FkZHJlc3MsCisJCQkJCQkJbGUxNl90b19jcHUoCisJCQkJCQkJd3FlX2ZyYWdtZW50X2xlbmd0aFsKKwkJCQkJCQl3cWVfZnJhZ21lbnRfaW5kZXhdKSwKKwkJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQl9IGVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG5lc3ZuaWMtPm5pYy50eF9za2JbbmVzdm5pYy0+bmljLnNxX3RhaWxdKQorCQkJZGV2X2tmcmVlX3NrYigKKwkJCQluZXN2bmljLT5uaWMudHhfc2tiW25lc3ZuaWMtPm5pYy5zcV90YWlsXSk7CisKKwkJbmVzdm5pYy0+bmljLnNxX3RhaWwgPSAoKytuZXN2bmljLT5uaWMuc3FfdGFpbCkKKwkJCQkJJiAobmVzdm5pYy0+bmljLnNxX3NpemUgLSAxKTsKKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzZGV2LT5jcXAubG9jaywgZmxhZ3MpOwogCiAJLyogRGVzdHJveSBOSUMgUVAgKi8KQEAgLTE4OTQsNyArMTk5NSwzMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcHJvY2Vzc19jcml0aWNhbF9lcnJvcihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2KQoreworCXUzMiBkZWJ1Z19lcnJvcjsKKwl1MzIgbmVzX2lkeF9kZWJ1Z19lcnJvcl9tYXNrczAgPSAwOworCXUxNiBlcnJvcl9tb2R1bGUgPSAwOwogCisJZGVidWdfZXJyb3IgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9ERUJVR19FUlJPUl9DT05UUk9MX1NUQVRVUyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ3JpdGljYWwgRXJyb3IgcmVwb3J0ZWQgYnkgZGV2aWNlISEhIDB4JTAyWFxuIiwKKwkJCSh1MTYpZGVidWdfZXJyb3IpOworCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9ERUJVR19FUlJPUl9DT05UUk9MX1NUQVRVUywKKwkJCTB4MDEwMTAwMDAgfCAoZGVidWdfZXJyb3IgJiAweDAwMDBmZmZmKSk7CisJaWYgKGNyaXRfZXJyX2NvdW50KysgPiAxMCkKKwkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0RFQlVHX0VSUk9SX01BU0tTMSwgMSA8PCAweDE3KTsKKwllcnJvcl9tb2R1bGUgPSAodTE2KSAoZGVidWdfZXJyb3IgJiAweDFGMDApID4+IDg7CisJaWYgKCsrbmVzZGV2LT5uZXNhZGFwdGVyLT5jcml0X2Vycm9yX2NvdW50W2Vycm9yX21vZHVsZS0xXSA+PQorCQkJbmVzX21heF9jcml0aWNhbF9lcnJvcl9jb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJNYXNraW5nIG9mZiBjcml0aWNhbCBlcnJvciBmb3IgbW9kdWxlICIKKwkJCSIweCUwMlhcbiIsICh1MTYpZXJyb3JfbW9kdWxlKTsKKwkJbmVzX2lkeF9kZWJ1Z19lcnJvcl9tYXNrczAgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwKKwkJCU5FU19JRFhfREVCVUdfRVJST1JfTUFTS1MwKTsKKwkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX0RFQlVHX0VSUk9SX01BU0tTMCwKKwkJCW5lc19pZHhfZGVidWdfZXJyb3JfbWFza3MwIHwgKDEgPDwgZXJyb3JfbW9kdWxlKSk7CisJfQorfQogLyoqCiAgKiBuZXNfZHBjCiAgKi8KQEAgLTE5MDksNyArMjAzMyw2IEBACiAJdTMyIHRpbWVyX3N0YXQ7CiAJdTMyIHRlbXBfaW50X3N0YXQ7CiAJdTMyIGludGZfaW50X3N0YXQ7Ci0JdTMyIGRlYnVnX2Vycm9yOwogCXUzMiBwcm9jZXNzZWRfaW50Zl9pbnQgPSAwOwogCXUxNiBwcm9jZXNzZWRfdGltZXJfaW50ID0gMDsKIAl1MTYgY29tcGxldGlvbl9pbnRzID0gMDsKQEAgLTE5ODcsMTQgKzIxMTAsNyBAQAogCQkJCWludGZfaW50X3N0YXQgPSBuZXNfcmVhZDMyKG5lc2Rldi0+cmVncytORVNfSU5URl9JTlRfU1RBVCk7CiAJCQkJaW50Zl9pbnRfc3RhdCAmPSBuZXNkZXYtPmludGZfaW50X3JlcTsKIAkJCQlpZiAoTkVTX0lOVEZfSU5UX0NSSVRFUlIgJiBpbnRmX2ludF9zdGF0KSB7Ci0JCQkJCWRlYnVnX2Vycm9yID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfREVCVUdfRVJST1JfQ09OVFJPTF9TVEFUVVMpOwotCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDcml0aWNhbCBFcnJvciByZXBvcnRlZCBieSBkZXZpY2UhISEgMHglMDJYXG4iLAotCQkJCQkJCSh1MTYpZGVidWdfZXJyb3IpOwotCQkJCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfREVCVUdfRVJST1JfQ09OVFJPTF9TVEFUVVMsCi0JCQkJCQkJMHgwMTAxMDAwMCB8IChkZWJ1Z19lcnJvciAmIDB4MDAwMGZmZmYpKTsKLQkJCQkJLyogQlVHKCk7ICovCi0JCQkJCWlmIChjcml0X2Vycl9jb3VudCsrID4gMTApCi0JCQkJCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfREVCVUdfRVJST1JfTUFTS1MxLCAxIDw8IDB4MTcpOworCQkJCQlwcm9jZXNzX2NyaXRpY2FsX2Vycm9yKG5lc2Rldik7CiAJCQkJfQogCQkJCWlmIChORVNfSU5URl9JTlRfUENJRVJSICYgaW50Zl9pbnRfc3RhdCkgewogCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJQQ0kgRXJyb3IgcmVwb3J0ZWQgYnkgZGV2aWNlISEhXG4iKTsKQEAgLTIyNTgsNyArMjM3NCw4IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNhZGFwdGVyLT5waHlfbG9jaywgZmxhZ3MpOwogCQl9CiAJCS8qIHJlYWQgdGhlIFBIWSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCWlmIChuZXNhZGFwdGVyLT5PbmVHX01vZGUpIHsKKwkJaWYgKChuZXNhZGFwdGVyLT5PbmVHX01vZGUpICYmCisJCShuZXNhZGFwdGVyLT5waHlfdHlwZVttYWNfaW5kZXhdICE9IE5FU19QSFlfVFlQRV9QVU1BXzFHKSkgewogCQkJZG8gewogCQkJCW5lc19yZWFkXzFHX3BoeV9yZWcobmVzZGV2LCAweDFhLAogCQkJCQkJbmVzYWRhcHRlci0+cGh5X2luZGV4W21hY19pbmRleF0sICZwaHlfZGF0YSk7CkBAIC0zMDc3LDYgKzMxOTQsMjIgQEAKIAkJCW5lc19jbV9kaXNjb25uKG5lc3FwKTsKIAkJCWJyZWFrOwogCQkJLyogVE9ETzogYWRkaXRpb25hbCBBRXMgbmVlZCB0byBiZSBoZXJlICovCisJCWNhc2UgTkVTX0FFUUVfQUVJRF9BTVBfQk9VTkRTX1ZJT0xBVElPTjoKKwkJCW5lc3FwID0gKigoc3RydWN0IG5lc19xcCAqKikmY29udGV4dCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKKwkJCW5lc3FwLT5od19pd2FycF9zdGF0ZSA9IGl3YXJwX3N0YXRlOworCQkJbmVzcXAtPmh3X3RjcF9zdGF0ZSA9IHRjcF9zdGF0ZTsKKwkJCW5lc3FwLT5sYXN0X2FlcSA9IGFzeW5jX2V2ZW50X2lkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChuZXNxcC0+aWJxcC5ldmVudF9oYW5kbGVyKSB7CisJCQkJaWJldmVudC5kZXZpY2UgPSBuZXNxcC0+aWJxcC5kZXZpY2U7CisJCQkJaWJldmVudC5lbGVtZW50LnFwID0gJm5lc3FwLT5pYnFwOworCQkJCWliZXZlbnQuZXZlbnQgPSBJQl9FVkVOVF9RUF9BQ0NFU1NfRVJSOworCQkJCW5lc3FwLT5pYnFwLmV2ZW50X2hhbmRsZXIoJmliZXZlbnQsCisJCQkJCQluZXNxcC0+aWJxcC5xcF9jb250ZXh0KTsKKwkJCX0KKwkJCW5lc19jbV9kaXNjb25uKG5lc3FwKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJbmVzX2RlYnVnKE5FU19EQkdfQUVRLCAiUHJvY2Vzc2luZyBhbiBpV0FSUCByZWxhdGVkIEFFIGZvciBRUCwgbWlzYyA9IDB4JTA0WFxuIiwKIAkJCQkJYXN5bmNfZXZlbnRfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmgKaW5kZXggN2I4MWUwYS4uNjEwYjlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5oCkBAIC0xNTYsNiArMTU2LDcgQEAKIAlORVNfSURYX0VORE5PREUwX05TVEFUX1RYX09DVEVUU19ISSA9IDB4NzAwNCwKIAlORVNfSURYX0VORE5PREUwX05TVEFUX1RYX0ZSQU1FU19MTyA9IDB4NzAwOCwKIAlORVNfSURYX0VORE5PREUwX05TVEFUX1RYX0ZSQU1FU19ISSA9IDB4NzAwYywKKwlORVNfSURYX1dRTV9DT05GSUcxID0gMHg1MDA0LAogCU5FU19JRFhfQ01fQ09ORklHID0gMHg1MTAwLAogCU5FU19JRFhfTklDX0xPR1BPUlRfVE9fUEhZUE9SVCA9IDB4NjAwMCwKIAlORVNfSURYX05JQ19QSFlQT1JUX1RPX1VTVyA9IDB4NjAwOCwKQEAgLTk2Nyw2ICs5NjgsNyBAQAogI2RlZmluZSBERUZBVUxUX0pVTUJPX05FU19RTF9UQVJHRVQgNDAKICNkZWZpbmUgREVGQVVMVF9KVU1CT19ORVNfUUxfSElHSCAgIDEyOAogI2RlZmluZSBORVNfTklDX0NRX0RPV05XQVJEX1RSRU5EICAgMTYKKyNkZWZpbmUgTkVTX1BGVF9TSVpFCQkgICAgNDgKIAogc3RydWN0IG5lc19od190dW5lX3RpbWVyIHsKICAgICAvKiB1MTYgY3FfY291bnQ7ICovCkBAIC0xMDc5LDYgKzEwODEsNyBAQAogCXUzMiBldF9yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoOwogCXUzMiBldF9yYXRlX3NhbXBsZV9pbnRlcnZhbDsKIAl1MzIgdGltZXJfaW50X2xpbWl0OworCXUzMiB3cW1fcXVhbnRhOwogCiAJLyogQWRhcHRlciBiYXNlIE1BQyBhZGRyZXNzICovCiAJdTMyIG1hY19hZGRyX2xvdzsKQEAgLTEwOTQsMTIgKzEwOTcsMTQgQEAKIAl1MTYgcGRfY29uZmlnX2Jhc2VbNF07CiAKIAl1MTYgbGlua19pbnRlcnJ1cHRfY291bnRbNF07CisJdTggY3JpdF9lcnJvcl9jb3VudFszMl07CiAKIAkvKiB0aGUgcGh5IGluZGV4IGZvciBlYWNoIHBvcnQgKi8KIAl1OCAgcGh5X2luZGV4WzRdOwogCXU4ICBtYWNfc3dfc3RhdGVbNF07CiAJdTggIG1hY19saW5rX2Rvd25bNF07CiAJdTggIHBoeV90eXBlWzRdOworCXU4ICBsb2dfcG9ydDsKIAogCS8qIFBDSSBpbmZvcm1hdGlvbiAqLwogCXVuc2lnbmVkIGludCAgZGV2Zm47CkBAIC0xMTEzLDYgKzExMTgsNyBAQAogCXU4ICAgICAgICAgICAgdmlydHdxOwogCXU4ICAgICAgICAgICAgZXRfdXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOwogCXU4ICAgICAgICAgICAgYWRhcHRlcl9mY25fY291bnQ7CisJdTggcGZ0X21jYXN0X21hcFtORVNfUEZUX1NJWkVdOwogfTsKIAogc3RydWN0IG5lc19wYmwgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwppbmRleCAxYjA5MzhjLi43MzAzNTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwpAQCAtOTEsNiArOTEsNyBAQAogc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X21zZyA9IE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSwogCQl8IE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTjsKIHN0YXRpYyBpbnQgZGVidWcgPSAtMTsKK3N0YXRpYyBpbnQgbmljc19wZXJfZnVuY3Rpb24gPSAxOwogCiAvKioKICAqIG5lc19uZXRkZXZfcG9sbApAQCAtMjAxLDcgKzIwMiw4IEBACiAJCW5lc19kZWJ1ZyhORVNfREJHX05FVERFViwgImk9JWQsIHBlcmZlY3QgZmlsdGVyIHRhYmxlIGluZGV4PSAlZCwgUEVSRiBGSUxURVIgTE9XIgogCQkJCSIgKEFkZHI6JTA4WCkgPSAlMDhYLCBISUdIID0gJTA4WC5cbiIsCiAJCQkJaSwgbmVzdm5pYy0+cXBfbmljX2luZGV4W2ldLAotCQkJCU5FU19JRFhfUEVSRkVDVF9GSUxURVJfTE9XKygobmVzdm5pYy0+cGVyZmVjdF9maWx0ZXJfaW5kZXggKyBpKSAqIDgpLAorCQkJCU5FU19JRFhfUEVSRkVDVF9GSUxURVJfTE9XKworCQkJCQkobmVzdm5pYy0+cXBfbmljX2luZGV4W2ldICogOCksCiAJCQkJbWFjYWRkcl9sb3csCiAJCQkJKHUzMiltYWNhZGRyX2hpZ2ggfCBORVNfTUFDX0FERFJfVkFMSUQgfAogCQkJCSgoKCh1MzIpbmVzdm5pYy0+bmljX2luZGV4KSA8PCAxNikpKTsKQEAgLTI3MiwxNCArMjc0LDE4IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoZmlyc3RfbmVzdm5pYy0+bmV0ZGV2X29wZW4gPT0gMCkKKwlpZiAoKGZpcnN0X25lc3ZuaWMtPm5ldGRldl9vcGVuID09IDEpICYmIChmaXJzdF9uZXN2bmljICE9IG5lc3ZuaWMpICAmJgorCQkoUENJX0ZVTkMoZmlyc3RfbmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSAhPQorCQlQQ0lfRlVOQyhuZXN2bmljLT5uZXNkZXYtPnBjaWRldi0+ZGV2Zm4pKSkgeworCQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX01BQ19JTlRfTUFTSysKKwkJCQkoMHgyMDAqbmVzZGV2LT5tYWNfaW5kZXgpLCAweGZmZmZmZmZmKTsKKwkJCW5lc193cml0ZV9pbmRleGVkKGZpcnN0X25lc3ZuaWMtPm5lc2RldiwKKwkJCQlORVNfSURYX01BQ19JTlRfTUFTSysKKwkJCQkoMHgyMDAqZmlyc3RfbmVzdm5pYy0+bmVzZGV2LT5tYWNfaW5kZXgpLAorCQkJfihORVNfTUFDX0lOVF9MSU5LX1NUQVRfQ0hHIHwgTkVTX01BQ19JTlRfWEdNSUlfRVhUIHwKKwkJCU5FU19NQUNfSU5UX1RYX1VOREVSRkxPVyB8IE5FU19NQUNfSU5UX1RYX0VSUk9SKSk7CisJfSBlbHNlIHsKIAkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX01BQ19JTlRfTUFTSysoMHgyMDAqbmVzZGV2LT5tYWNfaW5kZXgpLCAweGZmZmZmZmZmKTsKLQllbHNlIGlmICgoZmlyc3RfbmVzdm5pYyAhPSBuZXN2bmljKSAmJgotCQkgKFBDSV9GVU5DKGZpcnN0X25lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LT5kZXZmbikgIT0gUENJX0ZVTkMobmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSkpIHsKLQkJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX01BQ19JTlRfTUFTSyArICgweDIwMCAqIG5lc2Rldi0+bWFjX2luZGV4KSwgMHhmZmZmZmZmZik7Ci0JCW5lc193cml0ZV9pbmRleGVkKGZpcnN0X25lc3ZuaWMtPm5lc2RldiwgTkVTX0lEWF9NQUNfSU5UX01BU0sgKyAoMHgyMDAgKiBmaXJzdF9uZXN2bmljLT5uZXNkZXYtPm1hY19pbmRleCksCi0JCQkJfihORVNfTUFDX0lOVF9MSU5LX1NUQVRfQ0hHIHwgTkVTX01BQ19JTlRfWEdNSUlfRVhUIHwKLQkJCQlORVNfTUFDX0lOVF9UWF9VTkRFUkZMT1cgfCBORVNfTUFDX0lOVF9UWF9FUlJPUikpOwogCX0KIAogCW5pY19hY3RpdmVfbWFzayA9IH4oKHUzMikoMSA8PCBuZXN2bmljLT5uaWNfaW5kZXgpKTsKQEAgLTQzNyw3ICs0NDMsNyBAQAogCXN0cnVjdCBuZXNfaHdfbmljX3NxX3dxZSAqbmljX3NxZTsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCS8qIHN0cnVjdCB1ZHBoZHIgKnVkcGg7ICovCi0jZGVmaW5lIE5FU19NQVhfVFNPX0ZSQUdTIDE4CisjZGVmaW5lIE5FU19NQVhfVFNPX0ZSQUdTIE1BWF9TS0JfRlJBR1MKIAkvKiA2NEsgc2VnbWVudCBwbHVzIG92ZXJmbG93IG9uIGVhY2ggc2lkZSAqLwogCWRtYV9hZGRyX3QgdHNvX2J1c19hZGRyZXNzW05FU19NQVhfVFNPX0ZSQUdTXTsKIAlkbWFfYWRkcl90IGJ1c19hZGRyZXNzOwpAQCAtNjA1LDYgKzYxMSw4IEBACiAJCQkJCXdxZV9mcmFnbWVudF9sZW5ndGhbd3FlX2ZyYWdtZW50X2luZGV4XSA9IDA7CiAJCQkJCXNldF93cWVfNjRiaXRfdmFsdWUobmljX3NxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHMV9MT1dfSURYLAogCQkJCQkJCQkJYnVzX2FkZHJlc3MpOworCQkJCQl0c29fd3FlX2xlbmd0aCArPSBza2JfaGVhZGxlbihza2IpIC0KKwkJCQkJCQlvcmlnaW5hbF9maXJzdF9sZW5ndGg7CiAJCQkJfQogCQkJCXdoaWxlICh3cWVfZnJhZ21lbnRfaW5kZXggPCA1KSB7CiAJCQkJCXdxZV9mcmFnbWVudF9sZW5ndGhbd3FlX2ZyYWdtZW50X2luZGV4XSA9CkBAIC04MjcsNiArODM1LDcgQEAKIHsKIAlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYgPSBuZXN2bmljLT5uZXNkZXY7CisJc3RydWN0IG5lc19hZGFwdGVyICpuZXNhZGFwdGVyID0gbmVzdm5pYy0+bmVzZGV2LT5uZXNhZGFwdGVyOwogCXN0cnVjdCBkZXZfbWNfbGlzdCAqbXVsdGljYXN0X2FkZHI7CiAJdTMyIG5pY19hY3RpdmVfYml0OwogCXUzMiBuaWNfYWN0aXZlOwpAQCAtODM2LDcgKzg0NSwxMiBAQAogCXU4IG1jX2FsbF9vbiA9IDA7CiAJdTggbWNfaW5kZXg7CiAJaW50IG1jX25pY19pbmRleCA9IC0xOworCXU4IHBmdF9lbnRyaWVzX3ByZWFsbG9jYXRlZCA9IG1heChuZXNhZGFwdGVyLT5hZGFwdGVyX2Zjbl9jb3VudCAqCisJCQkJCW5pY3NfcGVyX2Z1bmN0aW9uLCA0KTsKKwl1OCBtYXhfcGZ0X2VudHJpZXNfYXZhaWFibGUgPSBORVNfUEZUX1NJWkUgLSBwZnRfZW50cmllc19wcmVhbGxvY2F0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNhZGFwdGVyLT5yZXNvdXJjZV9sb2NrLCBmbGFncyk7CiAJbmljX2FjdGl2ZV9iaXQgPSAxIDw8IG5lc3ZuaWMtPm5pY19pbmRleDsKIAogCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKQEAgLTg0Nyw3ICs4NjEsNyBAQAogCQluaWNfYWN0aXZlIHw9IG5pY19hY3RpdmVfYml0OwogCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTklDX1VOSUNBU1RfQUxMLCBuaWNfYWN0aXZlKTsKIAkJbWNfYWxsX29uID0gMTsKLQl9IGVsc2UgaWYgKChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAobmV0ZGV2LT5tY19jb3VudCA+IE5FU19NVUxUSUNBU1RfUEZfTUFYKSB8fAorCX0gZWxzZSBpZiAoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CiAJCQkgICAobmVzdm5pYy0+bmljX2luZGV4ID4gMykpIHsKIAkJbmljX2FjdGl2ZSA9IG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX05JQ19NVUxUSUNBU1RfQUxMKTsKIAkJbmljX2FjdGl2ZSB8PSBuaWNfYWN0aXZlX2JpdDsKQEAgLTg2NiwxNyArODgwLDM0IEBACiAJfQogCiAJbmVzX2RlYnVnKE5FU19EQkdfTklDX1JYLCAiTnVtYmVyIG9mIE1DIGVudHJpZXMgPSAlZCwgUHJvbWlzY291cyA9ICVkLCBBbGwgTXVsdGljYXN0ID0gJWQuXG4iLAotCQkJICBuZXRkZXYtPm1jX2NvdW50LCAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKT8xOjAsCi0JCQkgIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKT8xOjApOworCQkgIG5ldGRldi0+bWNfY291bnQsICEhKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyksCisJCSAgISEobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpOwogCWlmICghbWNfYWxsX29uKSB7CiAJCW11bHRpY2FzdF9hZGRyID0gbmV0ZGV2LT5tY19saXN0OwotCQlwZXJmZWN0X2ZpbHRlcl9yZWdpc3Rlcl9hZGRyZXNzID0gTkVTX0lEWF9QRVJGRUNUX0ZJTFRFUl9MT1cgKyAweDgwOwotCQlwZXJmZWN0X2ZpbHRlcl9yZWdpc3Rlcl9hZGRyZXNzICs9IG5lc3ZuaWMtPm5pY19pbmRleCoweDQwOwotCQlmb3IgKG1jX2luZGV4PTA7IG1jX2luZGV4IDwgTkVTX01VTFRJQ0FTVF9QRl9NQVg7IG1jX2luZGV4KyspIHsKLQkJCXdoaWxlIChtdWx0aWNhc3RfYWRkciAmJiBuZXN2bmljLT5tY3JxX21jYXN0X2ZpbHRlciAmJiAoKG1jX25pY19pbmRleCA9IG5lc3ZuaWMtPm1jcnFfbWNhc3RfZmlsdGVyKG5lc3ZuaWMsIG11bHRpY2FzdF9hZGRyLT5kbWlfYWRkcikpID09IDApKQorCQlwZXJmZWN0X2ZpbHRlcl9yZWdpc3Rlcl9hZGRyZXNzID0gTkVTX0lEWF9QRVJGRUNUX0ZJTFRFUl9MT1cgKworCQkJCQkJcGZ0X2VudHJpZXNfcHJlYWxsb2NhdGVkICogMHg4OworCQlmb3IgKG1jX2luZGV4ID0gMDsgbWNfaW5kZXggPCBtYXhfcGZ0X2VudHJpZXNfYXZhaWFibGU7CisJCW1jX2luZGV4KyspIHsKKwkJCXdoaWxlIChtdWx0aWNhc3RfYWRkciAmJiBuZXN2bmljLT5tY3JxX21jYXN0X2ZpbHRlciAmJgorCQkJKChtY19uaWNfaW5kZXggPSBuZXN2bmljLT5tY3JxX21jYXN0X2ZpbHRlcihuZXN2bmljLAorCQkJCQltdWx0aWNhc3RfYWRkci0+ZG1pX2FkZHIpKSA9PSAwKSkgewogCQkJCW11bHRpY2FzdF9hZGRyID0gbXVsdGljYXN0X2FkZHItPm5leHQ7CisJCQl9CiAJCQlpZiAobWNfbmljX2luZGV4IDwgMCkKIAkJCQltY19uaWNfaW5kZXggPSBuZXN2bmljLT5uaWNfaW5kZXg7CisJCQl3aGlsZSAobmVzYWRhcHRlci0+cGZ0X21jYXN0X21hcFttY19pbmRleF0gPCAxNiAmJgorCQkJCW5lc2FkYXB0ZXItPnBmdF9tY2FzdF9tYXBbbWNfaW5kZXhdICE9CisJCQkJCW5lc3ZuaWMtPm5pY19pbmRleCAmJgorCQkJCQltY19pbmRleCA8IG1heF9wZnRfZW50cmllc19hdmFpYWJsZSkgeworCQkJCQkJbmVzX2RlYnVnKE5FU19EQkdfTklDX1JYLAorCQkJCQkibWNfaW5kZXg9JWQgc2tpcHBpbmcgbmljX2luZGV4PSVkLFwKKwkJCQkJdXNlZCBmb3I9JWQgXG4iLCBtY19pbmRleCwKKwkJCQkJbmVzdm5pYy0+bmljX2luZGV4LAorCQkJCQluZXNhZGFwdGVyLT5wZnRfbWNhc3RfbWFwW21jX2luZGV4XSk7CisJCQkJbWNfaW5kZXgrKzsKKwkJCX0KKwkJCWlmIChtY19pbmRleCA+PSBtYXhfcGZ0X2VudHJpZXNfYXZhaWFibGUpCisJCQkJYnJlYWs7CiAJCQlpZiAobXVsdGljYXN0X2FkZHIpIHsKIAkJCQlERUNMQVJFX01BQ19CVUYobWFjKTsKIAkJCQluZXNfZGVidWcoTkVTX0RCR19OSUNfUlgsICJBc3NpZ25pbmcgTUMgQWRkcmVzcyAlcyB0byByZWdpc3RlciAweCUwNFggbmljX2lkeD0lZFxuIiwKQEAgLTg5NywxNSArOTI4LDMzIEBACiAJCQkJCQkodTMyKW1hY2FkZHJfaGlnaCB8IE5FU19NQUNfQUREUl9WQUxJRCB8CiAJCQkJCQkoKCgodTMyKSgxPDxtY19uaWNfaW5kZXgpKSA8PCAxNikpKTsKIAkJCQltdWx0aWNhc3RfYWRkciA9IG11bHRpY2FzdF9hZGRyLT5uZXh0OworCQkJCW5lc2FkYXB0ZXItPnBmdF9tY2FzdF9tYXBbbWNfaW5kZXhdID0KKwkJCQkJCQluZXN2bmljLT5uaWNfaW5kZXg7CiAJCQl9IGVsc2UgewogCQkJCW5lc19kZWJ1ZyhORVNfREJHX05JQ19SWCwgIkNsZWFyaW5nIE1DIEFkZHJlc3MgYXQgcmVnaXN0ZXIgMHglMDRYXG4iLAogCQkJCQkJICBwZXJmZWN0X2ZpbHRlcl9yZWdpc3Rlcl9hZGRyZXNzKyhtY19pbmRleCAqIDgpKTsKIAkJCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsCiAJCQkJCQlwZXJmZWN0X2ZpbHRlcl9yZWdpc3Rlcl9hZGRyZXNzKzQrKG1jX2luZGV4ICogOCksCiAJCQkJCQkwKTsKKwkJCQluZXNhZGFwdGVyLT5wZnRfbWNhc3RfbWFwW21jX2luZGV4XSA9IDI1NTsKIAkJCX0KIAkJfQorCQkvKiBQRlQgaXMgbm90IGxhcmdlIGVub3VnaCAqLworCQlpZiAobXVsdGljYXN0X2FkZHIgJiYgbXVsdGljYXN0X2FkZHItPm5leHQpIHsKKwkJCW5pY19hY3RpdmUgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwKKwkJCQkJCU5FU19JRFhfTklDX01VTFRJQ0FTVF9BTEwpOworCQkJbmljX2FjdGl2ZSB8PSBuaWNfYWN0aXZlX2JpdDsKKwkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9OSUNfTVVMVElDQVNUX0FMTCwKKwkJCQkJCQkJbmljX2FjdGl2ZSk7CisJCQluaWNfYWN0aXZlID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsCisJCQkJCQlORVNfSURYX05JQ19VTklDQVNUX0FMTCk7CisJCQluaWNfYWN0aXZlICY9IH5uaWNfYWN0aXZlX2JpdDsKKwkJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9OSUNfVU5JQ0FTVF9BTEwsCisJCQkJCQkJCW5pY19hY3RpdmUpOworCQl9CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzYWRhcHRlci0+cmVzb3VyY2VfbG9jaywgZmxhZ3MpOwogfQogCiAKQEAgLTkxOCw2ICs5NjcsMTAgQEAKIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwogCWludCByZXQgPSAwOwogCXU4IGp1bWJvbW9kZSA9IDA7CisJdTMyIG5pY19hY3RpdmU7CisJdTMyIG5pY19hY3RpdmVfYml0OworCXUzMiB1Y19hbGxfYWN0aXZlOworCXUzMiBtY19hbGxfYWN0aXZlOwogCiAJaWYgKChuZXdfbXR1IDwgRVRIX1pMRU4pIHx8IChuZXdfbXR1ID4gbWF4X210dSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTMxLDggKzk4NCwyNCBAQAogCW5lc19uaWNfaW5pdF90aW1lcl9kZWZhdWx0cyhuZXNkZXYsIGp1bWJvbW9kZSk7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCW5pY19hY3RpdmVfYml0ID0gMSA8PCBuZXN2bmljLT5uaWNfaW5kZXg7CisJCW1jX2FsbF9hY3RpdmUgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwKKwkJCQlORVNfSURYX05JQ19NVUxUSUNBU1RfQUxMKSAmIG5pY19hY3RpdmVfYml0OworCQl1Y19hbGxfYWN0aXZlID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsCisJCQkJTkVTX0lEWF9OSUNfVU5JQ0FTVF9BTEwpICAmIG5pY19hY3RpdmVfYml0OworCiAJCW5lc19uZXRkZXZfc3RvcChuZXRkZXYpOwogCQluZXNfbmV0ZGV2X29wZW4obmV0ZGV2KTsKKworCQluaWNfYWN0aXZlID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsCisJCQkJCU5FU19JRFhfTklDX01VTFRJQ0FTVF9BTEwpOworCQluaWNfYWN0aXZlIHw9IG1jX2FsbF9hY3RpdmU7CisJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9OSUNfTVVMVElDQVNUX0FMTCwKKwkJCQkJCQluaWNfYWN0aXZlKTsKKworCQluaWNfYWN0aXZlID0gbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTklDX1VOSUNBU1RfQUxMKTsKKwkJbmljX2FjdGl2ZSB8PSB1Y19hbGxfYWN0aXZlOworCQluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfTklDX1VOSUNBU1RfQUxMLCBuaWNfYWN0aXZlKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTIwOCwxMCArMTI3NywxMiBAQAogCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQogewogCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5lc19hZGFwdGVyICpuZXNhZGFwdGVyID0gbmVzdm5pYy0+bmVzZGV2LT5uZXNhZGFwdGVyOwogCiAJc3RyY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUpOwogCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYpKTsKLQlzdHJjcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIlRCRCIpOworCXNwcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIiV1LiV1IiwgbmVzYWRhcHRlci0+ZmlybXdhcmVfdmVyc2lvbj4+MTYsCisJCQkJbmVzYWRhcHRlci0+ZmlybXdhcmVfdmVyc2lvbiAmIDB4MDAwMDAwZmYpOwogCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CiAJZHJ2aW5mby0+bl9zdGF0cyA9IG5lc19uZXRkZXZfZ2V0X3N0YXRzX2NvdW50KG5ldGRldik7CiAJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKQEAgLTE1ODcsNyArMTY1OCw5IEBACiAJCQluZXN2bmljLCAodW5zaWduZWQgbG9uZyluZXRkZXYtPmZlYXR1cmVzLCBuZXN2bmljLT5uaWMucXBfaWQsCiAJCQluZXN2bmljLT5uaWNfaW5kZXgsIG5lc3ZuaWMtPmxvZ2ljYWxfcG9ydCwgIG5lc2Rldi0+bWFjX2luZGV4KTsKIAotCWlmIChuZXN2bmljLT5uZXNkZXYtPm5lc2FkYXB0ZXItPnBvcnRfY291bnQgPT0gMSkgeworCWlmIChuZXN2bmljLT5uZXNkZXYtPm5lc2FkYXB0ZXItPnBvcnRfY291bnQgPT0gMSAmJgorCQluZXN2bmljLT5uZXNkZXYtPm5lc2FkYXB0ZXItPmFkYXB0ZXJfZmNuX2NvdW50ID09IDEpIHsKKwogCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbMF0gPSBuZXN2bmljLT5uaWNfaW5kZXg7CiAJCW5lc3ZuaWMtPnFwX25pY19pbmRleFsxXSA9IG5lc3ZuaWMtPm5pY19pbmRleCArIDE7CiAJCWlmIChuZXNfZHJ2X29wdCAmIE5FU19EUlZfT1BUX0RVQUxfTE9HSUNBTF9QT1JUKSB7CkBAIC0xNTk4LDExICsxNjcxLDE0IEBACiAJCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbM10gPSBuZXN2bmljLT5uaWNfaW5kZXggKyAzOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKG5lc3ZuaWMtPm5lc2Rldi0+bmVzYWRhcHRlci0+cG9ydF9jb3VudCA9PSAyKSB7Ci0JCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbMF0gPSBuZXN2bmljLT5uaWNfaW5kZXg7Ci0JCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbMV0gPSBuZXN2bmljLT5uaWNfaW5kZXggKyAyOwotCQkJbmVzdm5pYy0+cXBfbmljX2luZGV4WzJdID0gMHhmOwotCQkJbmVzdm5pYy0+cXBfbmljX2luZGV4WzNdID0gMHhmOworCQlpZiAobmVzdm5pYy0+bmVzZGV2LT5uZXNhZGFwdGVyLT5wb3J0X2NvdW50ID09IDIgfHwKKwkJCShuZXN2bmljLT5uZXNkZXYtPm5lc2FkYXB0ZXItPnBvcnRfY291bnQgPT0gMSAmJgorCQkJbmVzdm5pYy0+bmVzZGV2LT5uZXNhZGFwdGVyLT5hZGFwdGVyX2Zjbl9jb3VudCA9PSAyKSkgeworCQkJCW5lc3ZuaWMtPnFwX25pY19pbmRleFswXSA9IG5lc3ZuaWMtPm5pY19pbmRleDsKKwkJCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbMV0gPSBuZXN2bmljLT5uaWNfaW5kZXgKKwkJCQkJCQkJCSsgMjsKKwkJCQluZXN2bmljLT5xcF9uaWNfaW5kZXhbMl0gPSAweGY7CisJCQkJbmVzdm5pYy0+cXBfbmljX2luZGV4WzNdID0gMHhmOwogCQl9IGVsc2UgewogCQkJbmVzdm5pYy0+cXBfbmljX2luZGV4WzBdID0gbmVzdm5pYy0+bmljX2luZGV4OwogCQkJbmVzdm5pYy0+cXBfbmljX2luZGV4WzFdID0gMHhmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKaW5kZXggZDc5OTQyZS4uOTMyZTU2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jCkBAIC0xNDY3LDcgKzE0NjcsNiBAQAogCQlkZWZhdWx0OgogCQkJbmVzX2RlYnVnKE5FU19EQkdfUVAsICJJbnZhbGlkIFFQIHR5cGU6ICVkXG4iLCBpbml0X2F0dHItPnFwX3R5cGUpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JCQlicmVhazsKIAl9CiAKIAkvKiB1cGRhdGUgdGhlIFFQIHRhYmxlICovCkBAIC0yNDk4LDcgKzI0OTcsNiBAQAogCQkJbmVzX2RlYnVnKE5FU19EQkdfTVIsICJMZWF2aW5nLCBpYm1yPSVwIiwgaWJtcik7CiAKIAkJCXJldHVybiBpYm1yOwotCQkJYnJlYWs7CiAJCWNhc2UgSVdORVNfTUVNUkVHX1RZUEVfUVA6CiAJCWNhc2UgSVdORVNfTUVNUkVHX1RZUEVfQ1E6CiAJCQluZXNwYmwgPSBremFsbG9jKHNpemVvZigqbmVzcGJsKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNTcyLDcgKzI1NzAsNiBAQAogCQkJbmVzbXItPmlibXIubGtleSA9IC0xOwogCQkJbmVzbXItPm1vZGUgPSByZXEucmVnX3R5cGU7CiAJCQlyZXR1cm4gJm5lc21yLT5pYm1yOwotCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKaW5kZXggYjBmZmM5YS4uNjhiYTVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaApAQCAtMjY4LDEwICsyNjgsOSBAQAogfTsKIAogLyoKLSAqIERldmljZSBwcml2YXRlIGxvY2tpbmc6IHR4X2xvY2sgcHJvdGVjdHMgbWVtYmVycyB1c2VkIGluIFRYIGZhc3QKLSAqIHBhdGggKGFuZCB3ZSB1c2UgTExUWCBzbyB1cHBlciBsYXllcnMgZG9uJ3QgZG8gZXh0cmEgbG9ja2luZykuCi0gKiBsb2NrIHByb3RlY3RzIGV2ZXJ5dGhpbmcgZWxzZS4gIGxvY2sgbmVzdHMgaW5zaWRlIG9mIHR4X2xvY2sgKGllCi0gKiB0eF9sb2NrIG11c3QgYmUgYWNxdWlyZWQgZmlyc3QgaWYgbmVlZGVkKS4KKyAqIERldmljZSBwcml2YXRlIGxvY2tpbmc6IG5ldHdvcmsgc3RhY2sgdHhfbG9jayBwcm90ZWN0cyBtZW1iZXJzIHVzZWQKKyAqIGluIFRYIGZhc3QgcGF0aCwgbG9jayBwcm90ZWN0cyBldmVyeXRoaW5nIGVsc2UuICBsb2NrIG5lc3RzIGluc2lkZQorICogb2YgdHhfbG9jayAoaWUgdHhfbG9jayBtdXN0IGJlIGFjcXVpcmVkIGZpcnN0IGlmIG5lZWRlZCkuCiAgKi8KIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiB7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMjkzLDYgKzI5Miw3IEBACiAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHBrZXlfcG9sbF90YXNrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgbWNhc3RfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2Fycmllcl9vbl90YXNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBmbHVzaF9saWdodDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmx1c2hfbm9ybWFsOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBmbHVzaF9oZWF2eTsKQEAgLTMxOSw3ICszMTksNiBAQAogCiAJc3RydWN0IGlwb2liX3J4X2J1ZiAqcnhfcmluZzsKIAotCXNwaW5sb2NrX3QJICAgICB0eF9sb2NrOwogCXN0cnVjdCBpcG9pYl90eF9idWYgKnR4X3Jpbmc7CiAJdW5zaWduZWQJICAgICB0eF9oZWFkOwogCXVuc2lnbmVkCSAgICAgdHhfdGFpbDsKQEAgLTQ2NCw2ICs0NjMsNyBAQAogdm9pZCBpcG9pYl9kZXZfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogdm9pZCBpcG9pYl9tY2FzdF9qb2luX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgaXBvaWJfbWNhc3RfY2Fycmllcl9vbl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGlwb2liX21jYXN0X3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWdpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHZvaWQgaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKaW5kZXggMzQxZmZlZC4uN2IxNGMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYwpAQCAtNzg2LDcgKzc4Niw4IEBACiAKIAlkZXZfa2ZyZWVfc2tiX2FueSh0eF9yZXEtPnNrYik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3R4X2xvY2soZGV2KTsKKwogCSsrdHgtPnR4X3RhaWw7CiAJaWYgKHVubGlrZWx5KC0tcHJpdi0+dHhfb3V0c3RhbmRpbmcgPT0gaXBvaWJfc2VuZHFfc2l6ZSA+PiAxKSAmJgogCSAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKQEAgLTgwMSw3ICs4MDIsNyBAQAogCQkJICAgIihzdGF0dXM9JWQsIHdyaWQ9JWQgdmVuZF9lcnIgJXgpXG4iLAogCQkJICAgd2MtPnN0YXR1cywgd3JfaWQsIHdjLT52ZW5kb3JfZXJyKTsKIAotCQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQluZWlnaCA9IHR4LT5uZWlnaDsKIAogCQlpZiAobmVpZ2gpIHsKQEAgLTgyMSwxMCArODIyLDEwIEBACiAKIAkJY2xlYXJfYml0KElQT0lCX0ZMQUdfT1BFUl9VUCwgJnR4LT5mbGFncyk7CiAKLQkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3R4X3VubG9jayhkZXYpOwogfQogCiBpbnQgaXBvaWJfY21fZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTExNDksNyArMTE1MCw2IEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYocC0+ZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfY21fdHhfYnVmICp0eF9yZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGJlZ2luOwogCiAJaXBvaWJfZGJnKHByaXYsICJEZXN0cm95IGFjdGl2ZSBjb25uZWN0aW9uIDB4JXggaGVhZCAweCV4IHRhaWwgMHgleFxuIiwKQEAgLTExODAsMTIgKzExODAsMTIgQEAKIAkJCQkgICAgRE1BX1RPX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHR4X3JlcS0+c2tiKTsKIAkJKytwLT50eF90YWlsOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCQluZXRpZl90eF9sb2NrX2JoKHAtPmRldik7CiAJCWlmICh1bmxpa2VseSgtLXByaXYtPnR4X291dHN0YW5kaW5nID09IGlwb2liX3NlbmRxX3NpemUgPj4gMSkgJiYKIAkJICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQocC0+ZGV2KSAmJgogCQkgICAgdGVzdF9iaXQoSVBPSUJfRkxBR19BRE1JTl9VUCwgJnByaXYtPmZsYWdzKSkKIAkJCW5ldGlmX3dha2VfcXVldWUocC0+ZGV2KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCQluZXRpZl90eF91bmxvY2tfYmgocC0+ZGV2KTsKIAl9CiAKIAlpZiAocC0+cXApCkBAIC0xMjAyLDYgKzEyMDIsNyBAQAogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KHR4LT5kZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGV2ZW50LT5ldmVudCkgewpAQCAtMTIyMCw4ICsxMjIxLDggQEAKIAljYXNlIElCX0NNX1JFSl9SRUNFSVZFRDoKIAljYXNlIElCX0NNX1RJTUVXQUlUX0VYSVQ6CiAJCWlwb2liX2RiZyhwcml2LCAiQ00gZXJyb3IgJWQuXG4iLCBldmVudC0+ZXZlbnQpOwotCQlzcGluX2xvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKLQkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQluZWlnaCA9IHR4LT5uZWlnaDsKIAogCQlpZiAobmVpZ2gpIHsKQEAgLTEyMzksOCArMTI0MCw4IEBACiAJCQlxdWV1ZV93b3JrKGlwb2liX3dvcmtxdWV1ZSwgJnByaXYtPmNtLnJlYXBfdGFzayk7CiAJCX0KIAotCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTI5NCwxOSArMTI5NSwyNCBAQAogCXN0cnVjdCBpYl9zYV9wYXRoX3JlYyBwYXRocmVjOwogCXUzMiBxcG47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnByaXYtPmNtLnN0YXJ0X2xpc3QpKSB7CiAJCXAgPSBsaXN0X2VudHJ5KHByaXYtPmNtLnN0YXJ0X2xpc3QubmV4dCwgdHlwZW9mKCpwKSwgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJnAtPmxpc3QpOwogCQluZWlnaCA9IHAtPm5laWdoOwogCQlxcG4gPSBJUE9JQl9RUE4obmVpZ2gtPm5laWdoYm91ci0+aGEpOwogCQltZW1jcHkoJnBhdGhyZWMsICZwLT5wYXRoLT5wYXRocmVjLCBzaXplb2YgcGF0aHJlYyk7Ci0JCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CisKIAkJcmV0ID0gaXBvaWJfY21fdHhfaW5pdChwLCBxcG4sICZwYXRocmVjKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKLQkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCQluZXRpZl90eF9sb2NrX2JoKGRldik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAkJaWYgKHJldCkgewogCQkJbmVpZ2ggPSBwLT5uZWlnaDsKIAkJCWlmIChuZWlnaCkgewpAQCAtMTMyMCw0NCArMTMyNiw1MiBAQAogCQkJa2ZyZWUocCk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaXBvaWJfY21fdHhfcmVhcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKIAkJCQkJCSAgIGNtLnJlYXBfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKIAlzdHJ1Y3QgaXBvaWJfY21fdHggKnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnEoJnByaXYtPnR4X2xvY2spOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnByaXYtPmNtLnJlYXBfbGlzdCkpIHsKIAkJcCA9IGxpc3RfZW50cnkocHJpdi0+Y20ucmVhcF9saXN0Lm5leHQsIHR5cGVvZigqcCksIGxpc3QpOwogCQlsaXN0X2RlbCgmcC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKIAkJaXBvaWJfY21fdHhfZGVzdHJveShwKTsKLQkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7Ci0JCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGlwb2liX2NtX3NrYl9yZWFwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwb2liX2Rldl9wcml2LAogCQkJCQkJICAgY20uc2tiX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbXR1ID0gcHJpdi0+bWNhc3RfbXR1OwogCi0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7Ci0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwluZXRpZl90eF9sb2NrX2JoKGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPmNtLnNrYl9xdWV1ZSkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKKwogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCkBAIC0xMzY1LDExICsxMzc5LDEzIEBACiAJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHByaXYtPmRldik7CiAjZW5kaWYKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7Ci0JCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwkJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKIH0KIAogdm9pZCBpcG9pYl9jbV9za2JfdG9vX2xvbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCA2NmNhZmEyLi4wZTc0OGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCkBAIC00NjgsMjEgKzQ2OCwyMiBAQAogc3RhdGljIHZvaWQgZHJhaW5fdHhfY3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3R4X2xvY2soZGV2KTsKIAl3aGlsZSAocG9sbF90eChwcml2KSkKIAkJOyAvKiBub3RoaW5nICovCiAKIAlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQogCQltb2RfdGltZXIoJnByaXYtPnBvbGxfdGltZXIsIGppZmZpZXMgKyAxKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwluZXRpZl90eF91bmxvY2soZGV2KTsKIH0KIAogdm9pZCBpcG9pYl9zZW5kX2NvbXBfaGFuZGxlcihzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpkZXZfcHRyKQogewotCWRyYWluX3R4X2NxKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9wdHIpOworCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldl9wdHIpOworCisJbW9kX3RpbWVyKCZwcml2LT5wb2xsX3RpbWVyLCBqaWZmaWVzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcG9zdF9zZW5kKHN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiwKQEAgLTYxNCwxNyArNjE1LDIwIEBACiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfYWggKmFoLCAqdGFoOwogCUxJU1RfSEVBRChyZW1vdmVfbGlzdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnEoJnByaXYtPnR4X2xvY2spOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJbmV0aWZfdHhfbG9ja19iaChkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWgsIHRhaCwgJnByaXYtPmRlYWRfYWhzLCBsaXN0KQogCQlpZiAoKGludCkgcHJpdi0+dHhfdGFpbCAtIChpbnQpIGFoLT5sYXN0X3NlbmQgPj0gMCkgewogCQkJbGlzdF9kZWwoJmFoLT5saXN0KTsKIAkJCWliX2Rlc3Ryb3lfYWgoYWgtPmFoKTsKIAkJCWtmcmVlKGFoKTsKIAkJfQotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnByaXYtPnR4X2xvY2spOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCW5ldGlmX3R4X3VubG9ja19iaChkZXYpOwogfQogCiB2b2lkIGlwb2liX3JlYXBfYWgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzYxLDYgKzc2NSwxNCBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGksIG47CisKKwkvKgorCSAqIFdlIGNhbGwgY29tcGxldGlvbiBoYW5kbGluZyByb3V0aW5lcyB0aGF0IGV4cGVjdCB0byBiZQorCSAqIGNhbGxlZCBmcm9tIHRoZSBCSC1kaXNhYmxlZCBOQVBJIHBvbGwgY29udGV4dCwgc28gZGlzYWJsZQorCSAqIEJIcyBoZXJlIHRvby4KKwkgKi8KKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisKIAlkbyB7CiAJCW4gPSBpYl9wb2xsX2NxKHByaXYtPnJlY3ZfY3EsIElQT0lCX05VTV9XQywgcHJpdi0+aWJ3Yyk7CiAJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKQEAgLTc4NCw2ICs3OTYsOCBAQAogCiAJd2hpbGUgKHBvbGxfdHgocHJpdikpCiAJCTsgLyogbm90aGluZyAqLworCisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIGludCBpcG9pYl9pYl9kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmx1c2gpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCmluZGV4IDdlOWUyMTguLmMwZWU1MTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtMzczLDkgKzM3MywxMCBAQAogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwb2liX3BhdGggKnBhdGgsICp0cDsKIAlMSVNUX0hFQUQocmVtb3ZlX2xpc3QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKLQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJbGlzdF9zcGxpY2VfaW5pdCgmcHJpdi0+cGF0aF9saXN0LCAmcmVtb3ZlX2xpc3QpOwogCkBAIC0zODUsMTUgKzM4NiwxNiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXRoLCB0cCwgJnJlbW92ZV9saXN0LCBsaXN0KSB7CiAJCWlmIChwYXRoLT5xdWVyeSkKIAkJCWliX3NhX2NhbmNlbF9xdWVyeShwYXRoLT5xdWVyeV9pZCwgcGF0aC0+cXVlcnkpOwotCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBhdGgtPmRvbmUpOwogCQlwYXRoX2ZyZWUoZGV2LCBwYXRoKTsKLQkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7Ci0JCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIHBhdGhfcmVjX2NvbXBsZXRpb24oaW50IHN0YXR1cywKQEAgLTQwNCw3ICs0MDYsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwYXRoLT5kZXY7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfYWggKmFoID0gTlVMTDsKLQlzdHJ1Y3QgaXBvaWJfYWggKm9sZF9haDsKKwlzdHJ1Y3QgaXBvaWJfYWggKm9sZF9haCA9IE5VTEw7CiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaCwgKnRuOwogCXN0cnVjdCBza19idWZmX2hlYWQgc2txdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNDI4LDEyICs0MzAsMTIgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlvbGRfYWggICA9IHBhdGgtPmFoOwotCXBhdGgtPmFoID0gYWg7Ci0KIAlpZiAoYWgpIHsKIAkJcGF0aC0+cGF0aHJlYyA9ICpwYXRocmVjOwogCisJCW9sZF9haCAgID0gcGF0aC0+YWg7CisJCXBhdGgtPmFoID0gYWg7CisKIAkJaXBvaWJfZGJnKHByaXYsICJjcmVhdGVkIGFkZHJlc3MgaGFuZGxlICVwIGZvciBMSUQgMHglMDR4LCBTTCAlZFxuIiwKIAkJCSAgYWgsIGJlMTZfdG9fY3B1KHBhdGhyZWMtPmRsaWQpLCBwYXRocmVjLT5zbCk7CiAKQEAgLTU1NSw2ICs1NTcsNyBAQAogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwb2liX3BhdGggKnBhdGg7CiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbmVpZ2ggPSBpcG9pYl9uZWlnaF9hbGxvYyhza2ItPmRzdC0+bmVpZ2hib3VyLCBza2ItPmRldik7CiAJaWYgKCFuZWlnaCkgewpAQCAtNTYzLDExICs1NjYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBXZSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBpcG9pYl9zdGFydF94bWl0LCBzbyB3ZSdyZQotCSAqIGluc2lkZSB0eF9sb2NrIC0tIG5vIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIGZsYWdzLgotCSAqLwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXBhdGggPSBfX3BhdGhfZmluZChkZXYsIHNrYi0+ZHN0LT5uZWlnaGJvdXItPmhhICsgNCk7CiAJaWYgKCFwYXRoKSB7CkBAIC02MTQsNyArNjEzLDcgQEAKIAkJX19za2JfcXVldWVfdGFpbCgmbmVpZ2gtPnF1ZXVlLCBza2IpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuOwogCiBlcnJfbGlzdDoKQEAgLTYyNiw3ICs2MjUsNyBAQAogCSsrZGV2LT5zdGF0cy50eF9kcm9wcGVkOwogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAKLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBpcG9pYl9wYXRoX2xvb2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjUwLDEyICs2NDksOSBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwb2liX3BhdGggKnBhdGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qCi0JICogV2UgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gaXBvaWJfc3RhcnRfeG1pdCwgc28gd2UncmUKLQkgKiBpbnNpZGUgdHhfbG9jayAtLSBubyBuZWVkIHRvIHNhdmUvcmVzdG9yZSBmbGFncy4KLQkgKi8KLQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlwYXRoID0gX19wYXRoX2ZpbmQoZGV2LCBwaGRyLT5od2FkZHIgKyA0KTsKIAlpZiAoIXBhdGggfHwgIXBhdGgtPnZhbGlkKSB7CkBAIC02NjcsNyArNjYzLDcgQEAKIAkJCV9fc2tiX3F1ZXVlX3RhaWwoJnBhdGgtPnF1ZXVlLCBza2IpOwogCiAJCQlpZiAocGF0aF9yZWNfc3RhcnQoZGV2LCBwYXRoKSkgewotCQkJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQkJcGF0aF9mcmVlKGRldiwgcGF0aCk7CiAJCQkJcmV0dXJuOwogCQkJfSBlbHNlCkBAIC02NzcsNyArNjczLDcgQEAKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCX0KIAotCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjk2LDcgKzY5Miw3IEBACiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBpcG9pYl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03MDUsMTMgKzcwMSwxMCBAQAogCXN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2g7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh1bmxpa2VseSghc3Bpbl90cnlsb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKSkpCi0JCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwotCiAJaWYgKGxpa2VseShza2ItPmRzdCAmJiBza2ItPmRzdC0+bmVpZ2hib3VyKSkgewogCQlpZiAodW5saWtlbHkoISp0b19pcG9pYl9uZWlnaChza2ItPmRzdC0+bmVpZ2hib3VyKSkpIHsKIAkJCWlwb2liX3BhdGhfbG9va3VwKHNrYiwgZGV2KTsKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCiAJCW5laWdoID0gKnRvX2lwb2liX25laWdoKHNrYi0+ZHN0LT5uZWlnaGJvdXIpOwpAQCAtNzIxLDcgKzcxNCw3IEBACiAJCQkJCSAgICBza2ItPmRzdC0+bmVpZ2hib3VyLT5oYSArIDQsCiAJCQkJCSAgICBzaXplb2YodW5pb24gaWJfZ2lkKSkpIHx8CiAJCQkJCSAobmVpZ2gtPmRldiAhPSBkZXYpKSkgewotCQkJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCQkvKgogCQkJCSAqIEl0J3Mgc2FmZSB0byBjYWxsIGlwb2liX3B1dF9haCgpIGluc2lkZQogCQkJCSAqIHByaXYtPmxvY2sgaGVyZSwgYmVjYXVzZSB3ZSBrbm93IHRoYXQKQEAgLTczMiwyNSArNzI1LDI1IEBACiAJCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAJCQkJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKIAkJCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwotCQkJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQkJaXBvaWJfcGF0aF9sb29rdXAoc2tiLCBkZXYpOwotCQkJCWdvdG8gb3V0OworCQkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJCQl9CiAKIAkJaWYgKGlwb2liX2NtX2dldChuZWlnaCkpIHsKIAkJCWlmIChpcG9pYl9jbV91cChuZWlnaCkpIHsKIAkJCQlpcG9pYl9jbV9zZW5kKGRldiwgc2tiLCBpcG9pYl9jbV9nZXQobmVpZ2gpKTsKLQkJCQlnb3RvIG91dDsKKwkJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQkJfQogCQl9IGVsc2UgaWYgKG5laWdoLT5haCkgewogCQkJaXBvaWJfc2VuZChkZXYsIHNrYiwgbmVpZ2gtPmFoLCBJUE9JQl9RUE4oc2tiLT5kc3QtPm5laWdoYm91ci0+aGEpKTsKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCiAJCWlmIChza2JfcXVldWVfbGVuKCZuZWlnaC0+cXVldWUpIDwgSVBPSUJfTUFYX1BBVEhfUkVDX1FVRVVFKSB7Ci0JCQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCV9fc2tiX3F1ZXVlX3RhaWwoJm5laWdoLT5xdWV1ZSwgc2tiKTsKLQkJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJfSBlbHNlIHsKIAkJCSsrZGV2LT5zdGF0cy50eF9kcm9wcGVkOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTc3OSwxNiArNzcyLDEzIEBACiAJCQkJCSAgIElQT0lCX0dJRF9SQVdfQVJHKHBoZHItPmh3YWRkciArIDQpKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJCSsrZGV2LT5zdGF0cy50eF9kcm9wcGVkOwotCQkJCWdvdG8gb3V0OworCQkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJCQl9CiAKIAkJCXVuaWNhc3RfYXJwX3NlbmQoc2tiLCBkZXYsIHBoZHIpOwogCQl9CiAJfQogCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtMTA1Miw3ICsxMDQyLDYgQEAKIAlkZXYtPnR5cGUJCSA9IEFSUEhSRF9JTkZJTklCQU5EOwogCWRldi0+dHhfcXVldWVfbGVuCSA9IGlwb2liX3NlbmRxX3NpemUgKiAyOwogCWRldi0+ZmVhdHVyZXMJCSA9IChORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRAl8Ci0JCQkJICAgIE5FVElGX0ZfTExUWAkJfAogCQkJCSAgICBORVRJRl9GX0hJR0hETUEpOwogCiAJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBpcHY0X2JjYXN0X2FkZHIsIElORklOSUJBTkRfQUxFTik7CkBAIC0xMDY0LDcgKzEwNTMsNiBAQAogCWlwb2liX2xyb19zZXR1cChwcml2KTsKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CiAKIAltdXRleF9pbml0KCZwcml2LT52bGFuX211dGV4KTsKIApAQCAtMTA3NSw2ICsxMDYzLDcgQEAKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5wa2V5X3BvbGxfdGFzaywgaXBvaWJfcGtleV9wb2xsKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+bWNhc3RfdGFzaywgICBpcG9pYl9tY2FzdF9qb2luX3Rhc2spOworCUlOSVRfV09SSygmcHJpdi0+Y2Fycmllcl9vbl90YXNrLCBpcG9pYl9tY2FzdF9jYXJyaWVyX29uX3Rhc2spOwogCUlOSVRfV09SSygmcHJpdi0+Zmx1c2hfbGlnaHQsICAgaXBvaWJfaWJfZGV2X2ZsdXNoX2xpZ2h0KTsKIAlJTklUX1dPUksoJnByaXYtPmZsdXNoX25vcm1hbCwgICBpcG9pYl9pYl9kZXZfZmx1c2hfbm9ybWFsKTsKIAlJTklUX1dPUksoJnByaXYtPmZsdXNoX2hlYXZ5LCAgIGlwb2liX2liX2Rldl9mbHVzaF9oZWF2eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwppbmRleCBhYzMzYzhmLi5kOWQxMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKQEAgLTY5LDE0ICs2OSwxMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtY2FzdC0+ZGV2OwogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaCwgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0eF9kcm9wcGVkID0gMDsKIAogCWlwb2liX2RiZ19tY2FzdChuZXRkZXZfcHJpdihkZXYpLAogCQkJImRlbGV0aW5nIG11bHRpY2FzdCBncm91cCAiIElQT0lCX0dJRF9GTVQgIlxuIiwKIAkJCUlQT0lCX0dJRF9BUkcobWNhc3QtPm1jbWVtYmVyLm1naWQpKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmVpZ2gsIHRtcCwgJm1jYXN0LT5uZWlnaF9saXN0LCBsaXN0KSB7CiAJCS8qCkBAIC05MCw3ICs4OSw3IEBACiAJCWlwb2liX25laWdoX2ZyZWUoZGV2LCBuZWlnaCk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAKIAlpZiAobWNhc3QtPmFoKQogCQlpcG9pYl9wdXRfYWgobWNhc3QtPmFoKTsKQEAgLTEwMCw5ICs5OSw5IEBACiAJCWRldl9rZnJlZV9za2JfYW55KHNrYl9kZXF1ZXVlKCZtY2FzdC0+cGt0X3F1ZXVlKSk7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwluZXRpZl90eF9sb2NrX2JoKGRldik7CiAJZGV2LT5zdGF0cy50eF9kcm9wcGVkICs9IHR4X2Ryb3BwZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3R4X3VubG9ja19iaChkZXYpOwogCiAJa2ZyZWUobWNhc3QpOwogfQpAQCAtMjU5LDEwICsyNTgsMTAgQEAKIAl9CiAKIAkvKiBhY3R1YWxseSBzZW5kIGFueSBxdWV1ZWQgcGFja2V0cyAqLwotCXNwaW5fbG9ja19pcnEoJnByaXYtPnR4X2xvY2spOworCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKIAl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmbWNhc3QtPnBrdF9xdWV1ZSkpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9kZXF1ZXVlKCZtY2FzdC0+cGt0X3F1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiAKIAkJc2tiLT5kZXYgPSBkZXY7CiAKQEAgLTI3Myw5ICsyNzIsOSBAQAogCiAJCWlmIChkZXZfcXVldWVfeG1pdChza2IpKQogCQkJaXBvaWJfd2Fybihwcml2LCAiZGV2X3F1ZXVlX3htaXQgZmFpbGVkIHRvIHJlcXVldWUgcGFja2V0XG4iKTsKLQkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKwluZXRpZl90eF91bmxvY2tfYmgoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjg2LDcgKzI4NSw2IEBACiB7CiAJc3RydWN0IGlwb2liX21jYXN0ICptY2FzdCA9IG11bHRpY2FzdC0+Y29udGV4dDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWNhc3QtPmRldjsKLQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogV2UgdHJhcCBmb3IgcG9ydCBldmVudHMgb3Vyc2VsdmVzLiAqLwogCWlmIChzdGF0dXMgPT0gLUVORVRSRVNFVCkKQEAgLTMwMiwxMiArMzAwLDEyIEBACiAJCQkJCUlQT0lCX0dJRF9BUkcobWNhc3QtPm1jbWVtYmVyLm1naWQpLCBzdGF0dXMpOwogCiAJCS8qIEZsdXNoIG91dCBhbnkgcXVldWVkIHBhY2tldHMgKi8KLQkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CisJCW5ldGlmX3R4X2xvY2tfYmgoZGV2KTsKIAkJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJm1jYXN0LT5wa3RfcXVldWUpKSB7CiAJCQkrK2Rldi0+c3RhdHMudHhfZHJvcHBlZDsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYl9kZXF1ZXVlKCZtY2FzdC0+cGt0X3F1ZXVlKSk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7CiAKIAkJLyogQ2xlYXIgdGhlIGJ1c3kgZmxhZyBzbyB3ZSB0cnkgYWdhaW4gKi8KIAkJc3RhdHVzID0gdGVzdF9hbmRfY2xlYXJfYml0KElQT0lCX01DQVNUX0ZMQUdfQlVTWSwKQEAgLTM2Niw2ICszNjQsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIGlwb2liX21jYXN0X2NhcnJpZXJfb25fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKKwkJCQkJCSAgIGNhcnJpZXJfb25fdGFzayk7CisKKwkvKgorCSAqIFRha2UgcnRubF9sb2NrIHRvIGF2b2lkIHJhY2luZyB3aXRoIGlwb2liX3N0b3AoKSBhbmQKKwkgKiB0dXJuaW5nIHRoZSBjYXJyaWVyIGJhY2sgb24gd2hpbGUgYSBkZXZpY2UgaXMgYmVpbmcKKwkgKiByZW1vdmVkLgorCSAqLworCXJ0bmxfbG9jaygpOworCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+ZGV2KTsKKwlydG5sX3VubG9jaygpOworfQorCiBzdGF0aWMgaW50IGlwb2liX21jYXN0X2pvaW5fY29tcGxldGUoaW50IHN0YXR1cywKIAkJCQkgICAgIHN0cnVjdCBpYl9zYV9tdWx0aWNhc3QgKm11bHRpY2FzdCkKIHsKQEAgLTM5MiwxNiArNDA1LDEyIEBACiAJCQkJCSAgICZwcml2LT5tY2FzdF90YXNrLCAwKTsKIAkJbXV0ZXhfdW5sb2NrKCZtY2FzdF9tdXRleCk7CiAKLQkJaWYgKG1jYXN0ID09IHByaXYtPmJyb2FkY2FzdCkgewotCQkJLyoKLQkJCSAqIFRha2UgUlROTCBsb2NrIGhlcmUgdG8gYXZvaWQgcmFjaW5nIHdpdGgKLQkJCSAqIGlwb2liX3N0b3AoKSBhbmQgdHVybmluZyB0aGUgY2FycmllciBiYWNrCi0JCQkgKiBvbiB3aGlsZSBhIGRldmljZSBpcyBiZWluZyByZW1vdmVkLgotCQkJICovCi0JCQlydG5sX2xvY2soKTsKLQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKLQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCX0KKwkJLyoKKwkJICogRGVmZXIgY2FycmllciBvbiB3b3JrIHRvIGlwb2liX3dvcmtxdWV1ZSB0byBhdm9pZCBhCisJCSAqIGRlYWRsb2NrIG9uIHJ0bmxfbG9jayBoZXJlLgorCQkgKi8KKwkJaWYgKG1jYXN0ID09IHByaXYtPmJyb2FkY2FzdCkKKwkJCXF1ZXVlX3dvcmsoaXBvaWJfd29ya3F1ZXVlLCAmcHJpdi0+Y2Fycmllcl9vbl90YXNrKTsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC02NTEsMTIgKzY2MCw5IEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfbWNhc3QgKm1jYXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKgotCSAqIFdlIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGlwb2liX3N0YXJ0X3htaXQsIHNvIHdlJ3JlCi0JICogaW5zaWRlIHR4X2xvY2sgLS0gbm8gbmVlZCB0byBzYXZlL3Jlc3RvcmUgZmxhZ3MuCi0JICovCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCF0ZXN0X2JpdChJUE9JQl9GTEFHX09QRVJfVVAsICZwcml2LT5mbGFncykJCXx8CiAJICAgICFwcml2LT5icm9hZGNhc3QJCQkJCXx8CkBAIC03MjcsNyArNzMzLDcgQEAKIAl9CiAKIHVubG9jazoKLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogfQogCiB2b2lkIGlwb2liX21jYXN0X2Rldl9mbHVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCBlZDdjNWY3Li41YjhiNTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtMTY4Myw3ICsxNjgzLDcgQEAKIAkJCQkgICBTUlBfT1BUX1NFUlZJQ0VfSUQpLAogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3Qgc3JwX29wdF90b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBzcnBfb3B0X3Rva2VucyA9IHsKIAl7IFNSUF9PUFRfSURfRVhULAkJImlkX2V4dD0lcyIgCQl9LAogCXsgU1JQX09QVF9JT0NfR1VJRCwJCSJpb2NfZ3VpZD0lcyIgCQl9LAogCXsgU1JQX09QVF9ER0lELAkJCSJkZ2lkPSVzIiAJCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggMDc4ZTRlZS4uMjg4MGVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwpAQCAtMjMxLDYgKzIzMSw3IEBACiBlbnVtIGdhbWVwb3J0X2V2ZW50X3R5cGUgewogCUdBTUVQT1JUX1JFR0lTVEVSX1BPUlQsCiAJR0FNRVBPUlRfUkVHSVNURVJfRFJJVkVSLAorCUdBTUVQT1JUX0FUVEFDSF9EUklWRVIsCiB9OwogCiBzdHJ1Y3QgZ2FtZXBvcnRfZXZlbnQgewpAQCAtMjQ1LDExICsyNDYsMTIgQEAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChnYW1lcG9ydF93YWl0KTsKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdhbWVwb3J0X3Rhc2s7CiAKLXN0YXRpYyB2b2lkIGdhbWVwb3J0X3F1ZXVlX2V2ZW50KHZvaWQgKm9iamVjdCwgc3RydWN0IG1vZHVsZSAqb3duZXIsCi0JCQkgICAgICBlbnVtIGdhbWVwb3J0X2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKK3N0YXRpYyBpbnQgZ2FtZXBvcnRfcXVldWVfZXZlbnQodm9pZCAqb2JqZWN0LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQllbnVtIGdhbWVwb3J0X2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBnYW1lcG9ydF9ldmVudCAqZXZlbnQ7CisJaW50IHJldHZhbCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FtZXBvcnRfZXZlbnRfbG9jaywgZmxhZ3MpOwogCkBAIC0yNjgsMjQgKzI3MCwzNCBAQAogCQl9CiAJfQogCi0JaWYgKChldmVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnYW1lcG9ydF9ldmVudCksIEdGUF9BVE9NSUMpKSkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ2FtZXBvcnQ6IENhbid0IGdldCBtb2R1bGUgcmVmZXJlbmNlLCBkcm9wcGluZyBldmVudCAlZFxuIiwgZXZlbnRfdHlwZSk7Ci0JCQlrZnJlZShldmVudCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWV2ZW50LT50eXBlID0gZXZlbnRfdHlwZTsKLQkJZXZlbnQtPm9iamVjdCA9IG9iamVjdDsKLQkJZXZlbnQtPm93bmVyID0gb3duZXI7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPm5vZGUsICZnYW1lcG9ydF9ldmVudF9saXN0KTsKLQkJd2FrZV91cCgmZ2FtZXBvcnRfd2FpdCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnYW1lcG9ydDogTm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgZXZlbnQgJWRcbiIsIGV2ZW50X3R5cGUpOworCWV2ZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdhbWVwb3J0X2V2ZW50KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFldmVudCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJnYW1lcG9ydDogTm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgZXZlbnQgJWRcbiIsCisJCQlldmVudF90eXBlKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQorCisJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImdhbWVwb3J0OiBDYW4ndCBnZXQgbW9kdWxlIHJlZmVyZW5jZSwgZHJvcHBpbmcgZXZlbnQgJWRcbiIsCisJCQlldmVudF90eXBlKTsKKwkJa2ZyZWUoZXZlbnQpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlldmVudC0+dHlwZSA9IGV2ZW50X3R5cGU7CisJZXZlbnQtPm9iamVjdCA9IG9iamVjdDsKKwlldmVudC0+b3duZXIgPSBvd25lcjsKKworCWxpc3RfYWRkX3RhaWwoJmV2ZW50LT5ub2RlLCAmZ2FtZXBvcnRfZXZlbnRfbGlzdCk7CisJd2FrZV91cCgmZ2FtZXBvcnRfd2FpdCk7CisKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYW1lcG9ydF9ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgZ2FtZXBvcnRfZnJlZV9ldmVudChzdHJ1Y3QgZ2FtZXBvcnRfZXZlbnQgKmV2ZW50KQpAQCAtMzc4LDkgKzM5MCwxMCBAQAogfQogCiAvKgotICogUmVtb3ZlIGFsbCBldmVudHMgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGZvciBhIGdpdmVuIGdhbWVwb3J0IHBvcnQuCisgKiBSZW1vdmUgYWxsIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgZm9yIGEgZ2l2ZW4gb2JqZWN0LAorICogYmUgaXQgYSBnYW1lcG9ydCBwb3J0IG9yIGEgZHJpdmVyLgogICovCi1zdGF0aWMgdm9pZCBnYW1lcG9ydF9yZW1vdmVfcGVuZGluZ19ldmVudHMoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKK3N0YXRpYyB2b2lkIGdhbWVwb3J0X3JlbW92ZV9wZW5kaW5nX2V2ZW50cyh2b2lkICpvYmplY3QpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAJc3RydWN0IGdhbWVwb3J0X2V2ZW50ICpldmVudDsKQEAgLTM5MCw3ICs0MDMsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZnYW1lcG9ydF9ldmVudF9saXN0KSB7CiAJCWV2ZW50ID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgZ2FtZXBvcnRfZXZlbnQsIG5vZGUpOwotCQlpZiAoZXZlbnQtPm9iamVjdCA9PSBnYW1lcG9ydCkgeworCQlpZiAoZXZlbnQtPm9iamVjdCA9PSBvYmplY3QpIHsKIAkJCWxpc3RfZGVsX2luaXQobm9kZSk7CiAJCQlnYW1lcG9ydF9mcmVlX2V2ZW50KGV2ZW50KTsKIAkJfQpAQCAtNzA1LDEwICs3MTgsNDAgQEAKIAkJCWRydi0+ZHJpdmVyLm5hbWUsIGVycm9yKTsKIH0KIAotdm9pZCBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoraW50IF9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIsCisJCQkJY29uc3QgY2hhciAqbW9kX25hbWUpCiB7CisJaW50IGVycm9yOworCiAJZHJ2LT5kcml2ZXIuYnVzID0gJmdhbWVwb3J0X2J1czsKLQlnYW1lcG9ydF9xdWV1ZV9ldmVudChkcnYsIG93bmVyLCBHQU1FUE9SVF9SRUdJU1RFUl9EUklWRVIpOworCWRydi0+ZHJpdmVyLm93bmVyID0gb3duZXI7CisJZHJ2LT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKKworCS8qCisJICogVGVtcG9yYXJpbHkgZGlzYWJsZSBhdXRvbWF0aWMgYmluZGluZyBiZWNhdXNlIHByb2JpbmcKKwkgKiB0YWtlcyBsb25nIHRpbWUgYW5kIHdlIGFyZSBiZXR0ZXIgb2ZmIGRvaW5nIGl0IGluIGtnYW1lcG9ydGQKKwkgKi8KKwlkcnYtPmlnbm9yZSA9IDE7CisKKwllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJnYW1lcG9ydDogZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkIGZvciAlcywgZXJyb3I6ICVkXG4iLAorCQkJZHJ2LT5kcml2ZXIubmFtZSwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBSZXNldCBpZ25vcmUgZmxhZyBhbmQgbGV0IGtnYW1lcG9ydGQgYmluZCB0aGUgZHJpdmVyIHRvIGZyZWUgcG9ydHMKKwkgKi8KKwlkcnYtPmlnbm9yZSA9IDA7CisJZXJyb3IgPSBnYW1lcG9ydF9xdWV1ZV9ldmVudChkcnYsIE5VTEwsIEdBTUVQT1JUX0FUVEFDSF9EUklWRVIpOworCWlmIChlcnJvcikgeworCQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgZ2FtZXBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQpAQCAtNzE2LDcgKzc1OSw5IEBACiAJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKIAogCW11dGV4X2xvY2soJmdhbWVwb3J0X211dGV4KTsKKwogCWRydi0+aWdub3JlID0gMTsJLyogc28gZ2FtZXBvcnRfZmluZF9kcml2ZXIgaWdub3JlcyBpdCAqLworCWdhbWVwb3J0X3JlbW92ZV9wZW5kaW5nX2V2ZW50cyhkcnYpOwogCiBzdGFydF9vdmVyOgogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2FtZXBvcnQsICZnYW1lcG9ydF9saXN0LCBub2RlKSB7CkBAIC03MjksNiArNzc0LDcgQEAKIAl9CiAKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCiAJbXV0ZXhfdW5sb2NrKCZnYW1lcG9ydF9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCmluZGV4IDkyNDk4ZDQuLjY0ODlmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYwpAQCAtNDE0LDggKzQxNCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGEzZF9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZhM2RfZHJ2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZhM2RfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGEzZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYwppbmRleCBkMWNhOGExLi44OWM0YzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKQEAgLTU3Miw4ICs1NzIsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhZGlfaW5pdCh2b2lkKQogewotCWdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmYWRpX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmYWRpX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhZGlfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKaW5kZXggNzA4YzVhZS4uMzU2YjNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCkBAIC03NjEsOSArNzYxLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGFuYWxvZ19pbml0KHZvaWQpCiB7CiAJYW5hbG9nX3BhcnNlX29wdGlvbnMoKTsKLQlnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoJmFuYWxvZ19kcnYpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmYW5hbG9nX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbmFsb2dfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jCmluZGV4IDYzOWI5NzUuLjM0OTdiODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svY29icmEuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMKQEAgLTI2Myw4ICsyNjMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjb2JyYV9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZjb2JyYV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoJmNvYnJhX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb2JyYV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCmluZGV4IGNiNmVlZjEuLjY3YzIwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCkBAIC0zNzUsOCArMzc1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZ2Yya19pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZnZjJrX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmZ2Yya19kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZ2Yya19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCmluZGV4IDY4NGUwN2MuLmZjNTU4OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcC5jCkBAIC00MjYsOCArNDI2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZ3JpcF9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZncmlwX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmZ3JpcF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZ3JpcF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDgyNzk0ODEuLjJkNDdiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC02ODksOCArNjg5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZ3JpcF9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZncmlwX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmZ3JpcF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZ3JpcF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYwppbmRleCAyNWVjM2ZhLi40MDU4ZDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3VpbGxlbW90LmMKQEAgLTI4Myw4ICsyODMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBndWlsbGVtb3RfaW5pdCh2b2lkKQogewotCWdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmZ3VpbGxlbW90X2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmZ3VpbGxlbW90X2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBndWlsbGVtb3RfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jCmluZGV4IDhjMzI5MGIuLjI0NzgyODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2ludGVyYWN0LmMKQEAgLTMxNyw4ICszMTcsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbnRlcmFjdF9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZpbnRlcmFjdF9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoJmludGVyYWN0X2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpbnRlcmFjdF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2pveWR1bXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svam95ZHVtcC5jCmluZGV4IDJhMWI4MmMuLmNkODk0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svam95ZHVtcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svam95ZHVtcC5jCkBAIC0xNjEsOCArMTYxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgam95ZHVtcF9pbml0KHZvaWQpCiB7Ci0JZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZqb3lkdW1wX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmam95ZHVtcF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgam95ZHVtcF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NpZGV3aW5kZXIuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc2lkZXdpbmRlci5jCmluZGV4IDdiNDg2NWYuLmNhMTNhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc2lkZXdpbmRlci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc2lkZXdpbmRlci5jCkBAIC04MTgsOCArODE4LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3dfaW5pdCh2b2lkKQogewotCWdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmc3dfZHJ2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZzd19kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3dfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90bWRjLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3RtZGMuYwppbmRleCA2MGMzN2JjLi5kNmM2MDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3RtZGMuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3RtZGMuYwpAQCAtNDM4LDggKzQzOCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRtZGNfaW5pdCh2b2lkKQogewotCWdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcigmdG1kY19kcnYpOwotCXJldHVybiAwOworCXJldHVybiBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnRtZGNfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHRtZGNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwppbmRleCA2NzkxYmU4Li44MzlkMWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwpAQCAtNDU1LDEwICs0NTUsMTAgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKaW5kZXggYjFjZTEwZi4uMjIwMTZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwpAQCAtODM0LDEwICs4MzQsMTAgQEAKIH0KIAogLyoKLSAqIE1vc3Qgc3BlY2lhbCBrZXlzIChGbitGPykgb24gRGVsbCBMYXRpdHVkZXMgZG8gbm90IGdlbmVyYXRlIHJlbGVhc2UKKyAqIE1vc3Qgc3BlY2lhbCBrZXlzIChGbitGPykgb24gRGVsbCBsYXB0b3BzIGRvIG5vdCBnZW5lcmF0ZSByZWxlYXNlCiAgKiBldmVudHMgc28gd2UgaGF2ZSB0byBkbyBpdCBvdXJzZWx2ZXMuCiAgKi8KLXN0YXRpYyB2b2lkIGF0a2JkX2xhdGl0dWRlX2tleW1hcF9maXh1cChzdHJ1Y3QgYXRrYmQgKmF0a2JkKQorc3RhdGljIHZvaWQgYXRrYmRfZGVsbF9sYXB0b3Bfa2V5bWFwX2ZpeHVwKHN0cnVjdCBhdGtiZCAqYXRrYmQpCiB7CiAJY29uc3QgdW5zaWduZWQgaW50IGZvcmNlZF9yZWxlYXNlX2tleXNbXSA9IHsKIAkJMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4ZiwgMHg5MywKQEAgLTEyMDcsMTUgKzEyMDcsMTMgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpvbGRfZGV2LCAqbmV3X2RldjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWNoYXIgKnJlc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBjaGFyIG9sZF9leHRyYSwgb2xkX3NldDsKIAogCWlmICghYXRrYmQtPndyaXRlKQogCQlyZXR1cm4gLUVJTzsKIAotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOwotCWlmICgqcmVzdCB8fCB2YWx1ZSA+IDEpCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSkgfHwgdmFsdWUgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChhdGtiZC0+ZXh0cmEgIT0gdmFsdWUpIHsKQEAgLTEyNjQsMTIgKzEyNjIsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpvbGRfZGV2LCAqbmV3X2RldjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWNoYXIgKnJlc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBjaGFyIG9sZF9zY3JvbGw7CiAKLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKLQlpZiAoKnJlc3QgfHwgdmFsdWUgPiAxKQorCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8IHZhbHVlID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXRrYmQtPnNjcm9sbCAhPSB2YWx1ZSkgewpAQCAtMTMxMCwxNSArMTMwNiwxMyBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKm9sZF9kZXYsICpuZXdfZGV2OwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY2hhciAqcmVzdDsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGNoYXIgb2xkX3NldCwgb2xkX2V4dHJhOwogCiAJaWYgKCFhdGtiZC0+d3JpdGUpCiAJCXJldHVybiAtRUlPOwogCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7Ci0JaWYgKCpyZXN0IHx8ICh2YWx1ZSAhPSAyICYmIHZhbHVlICE9IDMpKQorCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8ICh2YWx1ZSAhPSAyICYmIHZhbHVlICE9IDMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChhdGtiZC0+c2V0ICE9IHZhbHVlKSB7CkBAIC0xMzYxLDE1ICsxMzU1LDEzIEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqb2xkX2RldiwgKm5ld19kZXY7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQljaGFyICpyZXN0OwogCWludCBlcnI7CiAJdW5zaWduZWQgY2hhciBvbGRfc29mdHJlcGVhdCwgb2xkX3NvZnRyYXc7CiAKIAlpZiAoIWF0a2JkLT53cml0ZSkKIAkJcmV0dXJuIC1FSU87CiAKLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKLQlpZiAoKnJlc3QgfHwgdmFsdWUgPiAxKQorCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8IHZhbHVlID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXRrYmQtPnNvZnRyZXBlYXQgIT0gdmFsdWUpIHsKQEAgLTE0MTMsMTIgKzE0MDUsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpvbGRfZGV2LCAqbmV3X2RldjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWNoYXIgKnJlc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBjaGFyIG9sZF9zb2Z0cmF3OwogCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7Ci0JaWYgKCpyZXN0IHx8IHZhbHVlID4gMSkKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSB8fCB2YWx1ZSA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGF0a2JkLT5zb2Z0cmF3ICE9IHZhbHVlKSB7CkBAIC0xNDYxLDEzICsxNDUxLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBhdGtiZF9kbWlfcXVpcmtfdGFibGVbXSBfX2luaXRkYXRhID0gewogCXsKLQkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgc2VyaWVzIiwKKwkJLmlkZW50ID0gIkRlbGwgTGFwdG9wIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKKwkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLCAvKiBQb3J0YWJsZSAqLwogCQl9LAogCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKLQkJLmRyaXZlcl9kYXRhID0gYXRrYmRfbGF0aXR1ZGVfa2V5bWFwX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9kZWxsX2xhcHRvcF9rZXltYXBfZml4dXAsCiAJfSwKIAl7CiAJCS5pZGVudCA9ICJIUCAyMTMzIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYmY1NHgta2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iZjU0eC1rZXlzLmMKaW5kZXggZTM0OGNmYy4uMTkyODQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iZjU0eC1rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iZjU0eC1rZXlzLmMKQEAgLTgsNyArOCw3IEBACiAgKgogICoKICAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgpAQCAtODEsNiArODEsOSBAQAogCXVuc2lnbmVkIHNob3J0ICprZXljb2RlOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXVuc2lnbmVkIGludCBrZXl1cF90ZXN0X2ppZmZpZXM7CisJdW5zaWduZWQgc2hvcnQga3BhZF9tc2VsOworCXVuc2lnbmVkIHNob3J0IGtwYWRfcHJlc2NhbGU7CisJdW5zaWduZWQgc2hvcnQga3BhZF9jdGw7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBiZmluX2twYWRfZmluZF9rZXkoc3RydWN0IGJmNTR4X2twYWQgKmJmNTR4X2twYWQsCkBAIC0zNjAsNiArMzYzLDEwIEBACiB7CiAJc3RydWN0IGJmNTR4X2twYWQgKmJmNTR4X2twYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCWJmNTR4X2twYWQtPmtwYWRfbXNlbCA9IGJmaW5fcmVhZF9LUEFEX01TRUwoKTsKKwliZjU0eF9rcGFkLT5rcGFkX3ByZXNjYWxlID0gYmZpbl9yZWFkX0tQQURfUFJFU0NBTEUoKTsKKwliZjU0eF9rcGFkLT5rcGFkX2N0bCA9IGJmaW5fcmVhZF9LUEFEX0NUTCgpOworCiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQogCQllbmFibGVfaXJxX3dha2UoYmY1NHhfa3BhZC0+aXJxKTsKIApAQCAtMzcwLDYgKzM3NywxMCBAQAogewogCXN0cnVjdCBiZjU0eF9rcGFkICpiZjU0eF9rcGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwliZmluX3dyaXRlX0tQQURfTVNFTChiZjU0eF9rcGFkLT5rcGFkX21zZWwpOworCWJmaW5fd3JpdGVfS1BBRF9QUkVTQ0FMRShiZjU0eF9rcGFkLT5rcGFkX3ByZXNjYWxlKTsKKwliZmluX3dyaXRlX0tQQURfQ1RMKGJmNTR4X2twYWQtPmtwYWRfY3RsKTsKKwogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKIAkJZGlzYWJsZV9pcnFfd2FrZShiZjU0eF9rcGFkLT5pcnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKaW5kZXggMTM0ZTY3Yi4uYzhlZDA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwpAQCAtODAsOSArODAsOSBAQAogI2RlZmluZSBLQl9BQ1RJVkFURV9ERUxBWQkxMAogCiAvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciByZWFkaW5nIHRoZSBrZXlib2FyZCBtYXRyaXgKLSAqIE5vdGU6IFdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcgcHhhX2dwaW9fbW9kZSB0byBhbHRlciBHUERSIGJ1dCBpdAotICogICAgICAgcmVxdWlyZXMgYSBmdW5jdGlvbiBjYWxsIHBlciBHUElPIGJpdCB3aGljaCBpcyBleGNlc3NpdmUKLSAqICAgICAgIHdoZW4gd2UgbmVlZCB0byBhY2Nlc3MgMTIgYml0cyBhdCBvbmNlIG11bHRpcGxlIHRpbWVzLgorICogTm90ZTogV2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZyB0aGUgZ2VuZXJpYyBncGlvIGZ1bmN0aW9ucyB0byBhbHRlcgorICogICAgICAgR1BEUiBidXQgaXQgcmVxdWlyZXMgYSBmdW5jdGlvbiBjYWxsIHBlciBHUElPIGJpdCB3aGljaCBpcworICogICAgICAgZXhjZXNzaXZlIHdoZW4gd2UgbmVlZCB0byBhY2Nlc3MgMTIgYml0cyBhdCBvbmNlLCBtdWx0aXBsZSB0aW1lcy4KICAqIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gbG9jYWxfaXJxX3NhdmUoKS9sb2NhbF9pcnFfcmVzdG9yZSgpCiAgKiBvciBzaW1pbGFyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCBlYzk2YjM2Li4wNWYzZjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTM2LDkgKzM2LDEwIEBACiAJc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgZGF0YVswXTsKIH07CiAKLXN0YXRpYyB2b2lkIGdwaW9fa2V5c19yZXBvcnRfZXZlbnQoc3RydWN0IGdwaW9fa2V5c19idXR0b24gKmJ1dHRvbiwKLQkJCQkgICBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3N0YXRpYyB2b2lkIGdwaW9fa2V5c19yZXBvcnRfZXZlbnQoc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKmJkYXRhKQogeworCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b24gPSBiZGF0YS0+YnV0dG9uOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gYmRhdGEtPmlucHV0OwogCXVuc2lnbmVkIGludCB0eXBlID0gYnV0dG9uLT50eXBlID86IEVWX0tFWTsKIAlpbnQgc3RhdGUgPSAoZ3Bpb19nZXRfdmFsdWUoYnV0dG9uLT5ncGlvKSA/IDEgOiAwKSBeIGJ1dHRvbi0+YWN0aXZlX2xvdzsKIApAQCAtNTAsMzQgKzUxLDIzIEBACiB7CiAJc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKmRhdGEgPSAoc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKilfZGF0YTsKIAotCWdwaW9fa2V5c19yZXBvcnRfZXZlbnQoZGF0YS0+YnV0dG9uLCBkYXRhLT5pbnB1dCk7CisJZ3Bpb19rZXlzX3JlcG9ydF9ldmVudChkYXRhKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGdwaW9fa2V5c19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkZXZfaWQ7Ci0Jc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBncGlvX2tleXNfZHJ2ZGF0YSAqZGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKKwlzdHJ1Y3QgZ3Bpb19idXR0b25fZGF0YSAqYmRhdGEgPSBkZXZfaWQ7CisJc3RydWN0IGdwaW9fa2V5c19idXR0b24gKmJ1dHRvbiA9IGJkYXRhLT5idXR0b247CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5idXR0b25zOyBpKyspIHsKLQkJc3RydWN0IGdwaW9fa2V5c19idXR0b24gKmJ1dHRvbiA9ICZwZGF0YS0+YnV0dG9uc1tpXTsKKwlCVUdfT04oaXJxICE9IGdwaW9fdG9faXJxKGJ1dHRvbi0+Z3BpbykpOwogCi0JCWlmIChpcnEgPT0gZ3Bpb190b19pcnEoYnV0dG9uLT5ncGlvKSkgewotCQkJc3RydWN0IGdwaW9fYnV0dG9uX2RhdGEgKmJkYXRhID0gJmRkYXRhLT5kYXRhW2ldOworCWlmIChidXR0b24tPmRlYm91bmNlX2ludGVydmFsKQorCQltb2RfdGltZXIoJmJkYXRhLT50aW1lciwKKwkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGJ1dHRvbi0+ZGVib3VuY2VfaW50ZXJ2YWwpKTsKKwllbHNlCisJCWdwaW9fa2V5c19yZXBvcnRfZXZlbnQoYmRhdGEpOwogCi0JCQlpZiAoYnV0dG9uLT5kZWJvdW5jZV9pbnRlcnZhbCkKLQkJCQltb2RfdGltZXIoJmJkYXRhLT50aW1lciwKLQkJCQkJICBqaWZmaWVzICsKLQkJCQkJICBtc2Vjc190b19qaWZmaWVzKGJ1dHRvbi0+ZGVib3VuY2VfaW50ZXJ2YWwpKTsKLQkJCWVsc2UKLQkJCQlncGlvX2tleXNfcmVwb3J0X2V2ZW50KGJ1dHRvbiwgYmRhdGEtPmlucHV0KTsKLQotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0JfQotCi0JcmV0dXJuIElSUV9OT05FOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb19rZXlzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNTEsNyArMTQxLDcgQEAKIAkJCQkgICAgSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9UUklHR0VSX1JJU0lORyB8CiAJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJCSAgICBidXR0b24tPmRlc2MgPyBidXR0b24tPmRlc2MgOiAiZ3Bpb19rZXlzIiwKLQkJCQkgICAgcGRldik7CisJCQkJICAgIGJkYXRhKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlwcl9lcnIoImdwaW8ta2V5czogVW5hYmxlIHRvIGNsYWltIGlycSAlZDsgZXJyb3IgJWRcbiIsCiAJCQkJaXJxLCBlcnJvcik7CkBAIC0xNzgsNyArMTY4LDcgQEAKIAogIGZhaWwyOgogCXdoaWxlICgtLWkgPj0gMCkgewotCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+YnV0dG9uc1tpXS5ncGlvKSwgcGRldik7CisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5idXR0b25zW2ldLmdwaW8pLCAmZGRhdGEtPmRhdGFbaV0pOwogCQlpZiAocGRhdGEtPmJ1dHRvbnNbaV0uZGVib3VuY2VfaW50ZXJ2YWwpCiAJCQlkZWxfdGltZXJfc3luYygmZGRhdGEtPmRhdGFbaV0udGltZXIpOwogCQlncGlvX2ZyZWUocGRhdGEtPmJ1dHRvbnNbaV0uZ3Bpbyk7CkBAIC0yMDMsNyArMTkzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bmJ1dHRvbnM7IGkrKykgewogCQlpbnQgaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmJ1dHRvbnNbaV0uZ3Bpbyk7Ci0JCWZyZWVfaXJxKGlycSwgcGRldik7CisJCWZyZWVfaXJxKGlycSwgJmRkYXRhLT5kYXRhW2ldKTsKIAkJaWYgKHBkYXRhLT5idXR0b25zW2ldLmRlYm91bmNlX2ludGVydmFsKQogCQkJZGVsX3RpbWVyX3N5bmMoJmRkYXRhLT5kYXRhW2ldLnRpbWVyKTsKIAkJZ3Bpb19mcmVlKHBkYXRhLT5idXR0b25zW2ldLmdwaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCmluZGV4IGRjZWE4N2EuLjY5ZTY3NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZGVib3VuY2U7CiB9OwogCi1ERUNMQVJFX1RBU0tMRVRfRElTQUJMRUQoa3BfdGFza2xldCwgb21hcF9rcF90YXNrbGV0LCAwKTsKK3N0YXRpYyBERUNMQVJFX1RBU0tMRVRfRElTQUJMRUQoa3BfdGFza2xldCwgb21hcF9rcF90YXNrbGV0LCAwKTsKIAogc3RhdGljIGludCAqa2V5bWFwOwogc3RhdGljIHVuc2lnbmVkIGludCAqcm93X2dwaW9zOwpAQCAtNzIsMTIgKzcyLDkgQEAKIHN0YXRpYyB2b2lkIHNldF9jb2xfZ3Bpb192YWwoc3RydWN0IG9tYXBfa3AgKm9tYXBfa3AsIHU4IHZhbHVlKQogewogCWludCBjb2w7Ci0JZm9yIChjb2wgPSAwOyBjb2wgPCBvbWFwX2twLT5jb2xzOyBjb2wrKykgewotCQlpZiAodmFsdWUgJiAoMSA8PCBjb2wpKQotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGNvbF9ncGlvc1tjb2xdLCAxKTsKLQkJZWxzZQotCQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGNvbF9ncGlvc1tjb2xdLCAwKTsKLQl9CisKKwlmb3IgKGNvbCA9IDA7IGNvbCA8IG9tYXBfa3AtPmNvbHM7IGNvbCsrKQorCQlncGlvX3NldF92YWx1ZShjb2xfZ3Bpb3NbY29sXSwgdmFsdWUgJiAoMSA8PCBjb2wpKTsKIH0KIAogc3RhdGljIHU4IGdldF9yb3dfZ3Bpb192YWwoc3RydWN0IG9tYXBfa3AgKm9tYXBfa3ApCkBAIC04Niw3ICs4Myw3IEBACiAJdTggdmFsdWUgPSAwOwogCiAJZm9yIChyb3cgPSAwOyByb3cgPCBvbWFwX2twLT5yb3dzOyByb3crKykgewotCQlpZiAob21hcF9nZXRfZ3Bpb19kYXRhaW4ocm93X2dwaW9zW3Jvd10pKQorCQlpZiAoZ3Bpb19nZXRfdmFsdWUocm93X2dwaW9zW3Jvd10pKQogCQkJdmFsdWUgfD0gKDEgPDwgcm93KTsKIAl9CiAJcmV0dXJuIHZhbHVlOwpAQCAtMzMzLDIzICszMzAsMjMgQEAKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJLyogQ29sczogb3V0cHV0cyAqLwogCQlmb3IgKGNvbF9pZHggPSAwOyBjb2xfaWR4IDwgb21hcF9rcC0+Y29sczsgY29sX2lkeCsrKSB7Ci0JCQlpZiAob21hcF9yZXF1ZXN0X2dwaW8oY29sX2dwaW9zW2NvbF9pZHhdKSA8IDApIHsKKwkJCWlmIChncGlvX3JlcXVlc3QoY29sX2dwaW9zW2NvbF9pZHhdLCAib21hcF9rcF9jb2wiKSA8IDApIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IgogCQkJCSAgICAgICAiR1BJTyVkIGZvciBrZXlwYWRcbiIsCiAJCQkJICAgICAgIGNvbF9ncGlvc1tjb2xfaWR4XSk7CiAJCQkJZ290byBlcnIxOwogCQkJfQotCQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oY29sX2dwaW9zW2NvbF9pZHhdLCAwKTsKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChjb2xfZ3Bpb3NbY29sX2lkeF0sIDApOwogCQl9CiAJCS8qIFJvd3M6IGlucHV0cyAqLwogCQlmb3IgKHJvd19pZHggPSAwOyByb3dfaWR4IDwgb21hcF9rcC0+cm93czsgcm93X2lkeCsrKSB7Ci0JCQlpZiAob21hcF9yZXF1ZXN0X2dwaW8ocm93X2dwaW9zW3Jvd19pZHhdKSA8IDApIHsKKwkJCWlmIChncGlvX3JlcXVlc3Qocm93X2dwaW9zW3Jvd19pZHhdLCAib21hcF9rcF9yb3ciKSA8IDApIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IgogCQkJCSAgICAgICAiR1BJTyVkIGZvciBrZXlwYWRcbiIsCiAJCQkJICAgICAgIHJvd19ncGlvc1tyb3dfaWR4XSk7CiAJCQkJZ290byBlcnIyOwogCQkJfQotCQkJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24ocm93X2dwaW9zW3Jvd19pZHhdLCAxKTsKKwkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KHJvd19ncGlvc1tyb3dfaWR4XSk7CiAJCX0KIAl9IGVsc2UgewogCQljb2xfaWR4ID0gMDsKQEAgLTQxOCwxMCArNDE1LDEwIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGUpOwogZXJyMjoKIAlmb3IgKGkgPSByb3dfaWR4IC0gMTsgaSA+PTA7IGktLSkKLQkJb21hcF9mcmVlX2dwaW8ocm93X2dwaW9zW2ldKTsKKwkJZ3Bpb19mcmVlKHJvd19ncGlvc1tpXSk7CiBlcnIxOgogCWZvciAoaSA9IGNvbF9pZHggLSAxOyBpID49MDsgaS0tKQotCQlvbWFwX2ZyZWVfZ3Bpbyhjb2xfZ3Bpb3NbaV0pOworCQlncGlvX2ZyZWUoY29sX2dwaW9zW2ldKTsKIAogCWtmcmVlKG9tYXBfa3ApOwogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CkBAIC00MzgsOSArNDM1LDkgQEAKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2twLT5jb2xzOyBpKyspCi0JCQlvbWFwX2ZyZWVfZ3Bpbyhjb2xfZ3Bpb3NbaV0pOworCQkJZ3Bpb19mcmVlKGNvbF9ncGlvc1tpXSk7CiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2twLT5yb3dzOyBpKyspIHsKLQkJCW9tYXBfZnJlZV9ncGlvKHJvd19ncGlvc1tpXSk7CisJCQlncGlvX2ZyZWUocm93X2dwaW9zW2ldKTsKIAkJCWZyZWVfaXJxKE9NQVBfR1BJT19JUlEocm93X2dwaW9zW2ldKSwgMCk7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jCmluZGV4IGRlNjdiOGUuLmM0OGI3NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3BpdHprYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMKQEAgLTEwMSw5ICsxMDEsOSBAQAogI2RlZmluZSBLQl9BQ1RJVkFURV9ERUxBWQkxMAogCiAvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciByZWFkaW5nIHRoZSBrZXlib2FyZCBtYXRyaXgKLSAqIE5vdGU6IFdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcgcHhhX2dwaW9fbW9kZSB0byBhbHRlciBHUERSIGJ1dCBpdAotICogICAgICAgcmVxdWlyZXMgYSBmdW5jdGlvbiBjYWxsIHBlciBHUElPIGJpdCB3aGljaCBpcyBleGNlc3NpdmUKLSAqICAgICAgIHdoZW4gd2UgbmVlZCB0byBhY2Nlc3MgMTEgYml0cyBhdCBvbmNlLCBtdWx0aXBsZSB0aW1lcy4KKyAqIE5vdGU6IFdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcgdGhlIGdlbmVyaWMgZ3BpbyBmdW5jdGlvbnMgdG8gYWx0ZXIKKyAqICAgICAgIEdQRFIgYnV0IGl0IHJlcXVpcmVzIGEgZnVuY3Rpb24gY2FsbCBwZXIgR1BJTyBiaXQgd2hpY2ggaXMKKyAqICAgICAgIGV4Y2Vzc2l2ZSB3aGVuIHdlIG5lZWQgdG8gYWNjZXNzIDExIGJpdHMgYXQgb25jZSwgbXVsdGlwbGUgdGltZXMuCiAgKiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBjYWxsZWQgd2l0aGluIGxvY2FsX2lycV9zYXZlKCkvbG9jYWxfaXJxX3Jlc3RvcmUoKQogICogb3Igc2ltaWxhci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90b3Nha2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYwppbmRleCA0NGNiNTBhLi42NzcyNzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3Rvc2FrYmQuYwpAQCAtNTksOSArNTksOSBAQAogCiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGhlIGtleWJvYXJkIG1hdHJpeAotICogTm90ZTogV2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZyBweGFfZ3Bpb19tb2RlIHRvIGFsdGVyIEdQRFIgYnV0IGl0Ci0gKiAgICAgICByZXF1aXJlcyBhIGZ1bmN0aW9uIGNhbGwgcGVyIEdQSU8gYml0IHdoaWNoIGlzIGV4Y2Vzc2l2ZQotICogICAgICAgd2hlbiB3ZSBuZWVkIHRvIGFjY2VzcyAxMiBiaXRzIGF0IG9uY2UsIG11bHRpcGxlIHRpbWVzLgorICogTm90ZTogV2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZyB0aGUgZ2VuZXJpYyBncGlvIGZ1bmN0aW9ucyB0byBhbHRlcgorICogICAgICAgR1BEUiBidXQgaXQgcmVxdWlyZXMgYSBmdW5jdGlvbiBjYWxsIHBlciBHUElPIGJpdCB3aGljaCBpcworICogICAgICAgZXhjZXNzaXZlIHdoZW4gd2UgbmVlZCB0byBhY2Nlc3MgMTIgYml0cyBhdCBvbmNlLCBtdWx0aXBsZSB0aW1lcy4KICAqIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gbG9jYWxfaXJxX3NhdmUoKS9sb2NhbF9pcnFfcmVzdG9yZSgpCiAgKiBvciBzaW1pbGFyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCmluZGV4IGU5OWI3ODguLjE5OTA1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCkBAIC0xODAsNiArMTgwLDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB5ZWFsaW5rLgogCitjb25maWcgSU5QVVRfQ00xMDkKKwl0cmlzdGF0ZSAiQy1NZWRpYSBDTTEwOSBVU0IgSS9PIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFVTQl9BUkNIX0hBU19IQ0QKKwlzZWxlY3QgVVNCCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUga2V5Ym9hcmQgYW5kIGJ1enplciBmdW5jdGlvbnMgb2YgdGhlCisJICBDLU1lZGlhIENNMTA5IHVzYiBwaG9uZXMuIFRoZSBhdWRpbyBwYXJ0IGlzIGVuYWJsZWQgYnkgdGhlIGdlbmVyaWMKKwkgIHVzYiBzb3VuZCBkcml2ZXIsIHNvIHlvdSBtaWdodCB3YW50IHRvIGVuYWJsZSB0aGF0IGFzIHdlbGwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGNtMTA5LgorCiBjb25maWcgSU5QVVRfVUlOUFVUCiAJdHJpc3RhdGUgIlVzZXIgbGV2ZWwgZHJpdmVyIHN1cHBvcnQiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCmluZGV4IGY0ODAwOWIuLmQ3ZGIyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIG9iai0kKENPTkZJR19JTlBVVF9LRVlTUEFOX1JFTU9URSkJKz0ga2V5c3Bhbl9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX1BPV0VSTUFURSkJCSs9IHBvd2VybWF0ZS5vCiBvYmotJChDT05GSUdfSU5QVVRfWUVBTElOSykJCSs9IHllYWxpbmsubworb2JqLSQoQ09ORklHX0lOUFVUX0NNMTA5KQkJKz0gY20xMDkubwogb2JqLSQoQ09ORklHX0hQX1NEQ19SVEMpCQkrPSBocF9zZGNfcnRjLm8KIG9iai0kKENPTkZJR19JTlBVVF9VSU5QVVQpCQkrPSB1aW5wdXQubwogb2JqLSQoQ09ORklHX0lOUFVUX0FQQU5FTCkJCSs9IGFwYW5lbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXRpX3JlbW90ZTIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCmluZGV4IGE3ZmFiYWYuLjNjOTk4OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIGF0aV9yZW1vdGUyIC0gQVRJL1BoaWxpcHMgVVNCIFJGIHJlbW90ZSBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVmlsbGUgU3lyamFsYSA8c3lyamFsYUBzY2kuZmk+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGV0ZXIgU3Rva2VzIDxsaW51eEBkYWRlb3MuZnJlZXNlcnZlLmNvLnVrPgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggVmlsbGUgU3lyamFsYSA8c3lyamFsYUBzY2kuZmk+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBQZXRlciBTdG9rZXMgPGxpbnV4QGRhZGVvcy5jby51az4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAogI2RlZmluZSBEUklWRVJfREVTQyAgICAiQVRJL1BoaWxpcHMgVVNCIFJGIHJlbW90ZSBkcml2ZXIiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjMiCiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CkBAIC0yNyw3ICsyNyw3IEBACiAgKiBBIHJlbW90ZSdzICJjaGFubmVsIiBtYXkgYmUgYWx0ZXJlZCBieSBwcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgIlBDIiBidXR0b24gZm9yCiAgKiBhcHByb3hpbWF0ZWx5IDMgc2Vjb25kcywgYWZ0ZXIgd2hpY2ggdGhlIGJ1dHRvbiB3aWxsIHNsb3dseSBmbGFzaCB0aGUgY291bnQgb2YgdGhlCiAgKiBjdXJyZW50bHkgY29uZmlndXJlZCAiY2hhbm5lbCIsIHVzaW5nIHRoZSBudW1lcmljIGtleXBhZCBlbnRlciBhIG51bWJlciBiZXR3ZWVuIDEgYW5kCi0gKiAxNiBhbmQgdGhlbiB0aGUgIlBDIiBidXR0b24gYWdhaW4sIHRoZSBidXR0b24gd2lsbCBzbG93bHkgZmxhc2ggdGhlIGNvdW50IG9mIHRoZQorICogMTYgYW5kIHRoZW4gcHJlc3MgdGhlICJQQyIgYnV0dG9uIGFnYWluLCB0aGUgYnV0dG9uIHdpbGwgc2xvd2x5IGZsYXNoIHRoZSBjb3VudCBvZiB0aGUKICAqIG5ld2x5IGNvbmZpZ3VyZWQgImNoYW5uZWwiLgogICovCiAKQEAgLTQ1LDkgKzQ1LDI1IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGF0aV9yZW1vdGUyX2lkX3RhYmxlKTsKIAotc3RhdGljIHN0cnVjdCB7Ci0JaW50IGh3X2NvZGU7Ci0JaW50IGtleV9jb2RlOworc3RhdGljIERFRklORV9NVVRFWChhdGlfcmVtb3RlMl9tdXRleCk7CisKK2VudW0geworCUFUSV9SRU1PVEUyX09QRU5FRCA9IDB4MSwKKwlBVElfUkVNT1RFMl9TVVNQRU5ERUQgPSAweDIsCit9OworCitlbnVtIHsKKwlBVElfUkVNT1RFMl9BVVgxLAorCUFUSV9SRU1PVEUyX0FVWDIsCisJQVRJX1JFTU9URTJfQVVYMywKKwlBVElfUkVNT1RFMl9BVVg0LAorCUFUSV9SRU1PVEUyX1BDLAorCUFUSV9SRU1PVEUyX01PREVTLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTggIGh3X2NvZGU7CisJdTE2IGtleWNvZGU7CiB9IGF0aV9yZW1vdGUyX2tleV90YWJsZVtdID0gewogCXsgMHgwMCwgS0VZXzAgfSwKIAl7IDB4MDEsIEtFWV8xIH0sCkBAIC03Myw2ICs4OSw3IEBACiAJeyAweDM3LCBLRVlfUkVDT1JEIH0sCiAJeyAweDM4LCBLRVlfRFZEIH0sCiAJeyAweDM5LCBLRVlfVFYgfSwKKwl7IDB4M2YsIEtFWV9QUk9HMSB9LCAvKiBBVVgxLUFVWDQgYW5kIFBDICovCiAJeyAweDU0LCBLRVlfTUVOVSB9LAogCXsgMHg1OCwgS0VZX1VQIH0sCiAJeyAweDU5LCBLRVlfRE9XTiB9LApAQCAtOTEsMTUgKzEwOCw5IEBACiAJeyAweGE5LCBCVE5fTEVGVCB9LAogCXsgMHhhYSwgQlROX1JJR0hUIH0sCiAJeyAweGJlLCBLRVlfUVVFU1RJT04gfSwKLQl7IDB4ZDUsIEtFWV9GUk9OVCB9LAogCXsgMHhkMCwgS0VZX0VESVQgfSwKKwl7IDB4ZDUsIEtFWV9GUk9OVCB9LAogCXsgMHhmOSwgS0VZX0lORk8gfSwKLQl7ICgweDAwIDw8IDgpIHwgMHgzZiwgS0VZX1BST0cxIH0sCi0JeyAoMHgwMSA8PCA4KSB8IDB4M2YsIEtFWV9QUk9HMiB9LAotCXsgKDB4MDIgPDwgOCkgfCAweDNmLCBLRVlfUFJPRzMgfSwKLQl7ICgweDAzIDw8IDgpIHwgMHgzZiwgS0VZX1BST0c0IH0sCi0JeyAoMHgwNCA8PCA4KSB8IDB4M2YsIEtFWV9QQyB9LAotCXsgMCwgS0VZX1JFU0VSVkVEIH0KIH07CiAKIHN0cnVjdCBhdGlfcmVtb3RlMiB7CkBAIC0xMTcsNDYgKzEyOCwxMDYgQEAKIAogCWNoYXIgbmFtZVs2NF07CiAJY2hhciBwaHlzWzY0XTsKKworCS8qIEVhY2ggbW9kZSAoQVVYMS1BVVg0IGFuZCBQQykgY2FuIGhhdmUgYW4gaW5kZXBlbmRlbnQga2V5bWFwLiAqLworCXUxNiBrZXljb2RlW0FUSV9SRU1PVEUyX01PREVTXVtBUlJBWV9TSVpFKGF0aV9yZW1vdGUyX2tleV90YWJsZSldOworCisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAogc3RhdGljIGludCBhdGlfcmVtb3RlMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogc3RhdGljIHZvaWQgYXRpX3JlbW90ZTJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZTJfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CitzdGF0aWMgaW50IGF0aV9yZW1vdGUyX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGF0aV9yZW1vdGUyX2RyaXZlciA9IHsKIAkubmFtZSAgICAgICA9ICJhdGlfcmVtb3RlMiIsCiAJLnByb2JlICAgICAgPSBhdGlfcmVtb3RlMl9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IGF0aV9yZW1vdGUyX2Rpc2Nvbm5lY3QsCiAJLmlkX3RhYmxlICAgPSBhdGlfcmVtb3RlMl9pZF90YWJsZSwKKwkuc3VzcGVuZCAgICA9IGF0aV9yZW1vdGUyX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBhdGlfcmVtb3RlMl9yZXN1bWUsCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKIH07CiAKLXN0YXRpYyBpbnQgYXRpX3JlbW90ZTJfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQorc3RhdGljIGludCBhdGlfcmVtb3RlMl9zdWJtaXRfdXJicyhzdHJ1Y3QgYXRpX3JlbW90ZTIgKmFyMikKIHsKLQlzdHJ1Y3QgYXRpX3JlbW90ZTIgKmFyMiA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOwogCWludCByOwogCiAJciA9IHVzYl9zdWJtaXRfdXJiKGFyMi0+dXJiWzBdLCBHRlBfS0VSTkVMKTsKIAlpZiAocikgewogCQlkZXZfZXJyKCZhcjItPmludGZbMF0tPmRldiwKLQkJCSIlczogdXNiX3N1Ym1pdF91cmIoKSA9ICVkXG4iLCBfX2Z1bmNfXywgcik7CisJCQkiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSA9ICVkXG4iLCBfX2Z1bmNfXywgcik7CiAJCXJldHVybiByOwogCX0KIAlyID0gdXNiX3N1Ym1pdF91cmIoYXIyLT51cmJbMV0sIEdGUF9LRVJORUwpOwogCWlmIChyKSB7CiAJCXVzYl9raWxsX3VyYihhcjItPnVyYlswXSk7CiAJCWRldl9lcnIoJmFyMi0+aW50ZlsxXS0+ZGV2LAotCQkJIiVzOiB1c2Jfc3VibWl0X3VyYigpID0gJWRcbiIsIF9fZnVuY19fLCByKTsKKwkJCSIlcygpOiB1c2Jfc3VibWl0X3VyYigpID0gJWRcbiIsIF9fZnVuY19fLCByKTsKIAkJcmV0dXJuIHI7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGUyX2tpbGxfdXJicyhzdHJ1Y3QgYXRpX3JlbW90ZTIgKmFyMikKK3sKKwl1c2Jfa2lsbF91cmIoYXIyLT51cmJbMV0pOworCXVzYl9raWxsX3VyYihhcjItPnVyYlswXSk7Cit9CisKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZTJfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCBhdGlfcmVtb3RlMiAqYXIyID0gaW5wdXRfZ2V0X2RydmRhdGEoaWRldik7CisJaW50IHI7CisKKwlkZXZfZGJnKCZhcjItPmludGZbMF0tPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXIgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoYXIyLT5pbnRmWzBdKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZhcjItPmludGZbMF0tPmRldiwKKwkJCSIlcygpOiB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSA9ICVkXG4iLCBfX2Z1bmNfXywgcik7CisJCWdvdG8gZmFpbDE7CisJfQorCisJbXV0ZXhfbG9jaygmYXRpX3JlbW90ZTJfbXV0ZXgpOworCisJaWYgKCEoYXIyLT5mbGFncyAmIEFUSV9SRU1PVEUyX1NVU1BFTkRFRCkpIHsKKwkJciA9IGF0aV9yZW1vdGUyX3N1Ym1pdF91cmJzKGFyMik7CisJCWlmIChyKQorCQkJZ290byBmYWlsMjsKKwl9CisKKwlhcjItPmZsYWdzIHw9IEFUSV9SRU1PVEUyX09QRU5FRDsKKworCW11dGV4X3VubG9jaygmYXRpX3JlbW90ZTJfbXV0ZXgpOworCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFyMi0+aW50ZlswXSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWwyOgorCW11dGV4X3VubG9jaygmYXRpX3JlbW90ZTJfbXV0ZXgpOworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShhcjItPmludGZbMF0pOworIGZhaWwxOgorCXJldHVybiByOworfQorCiBzdGF0aWMgdm9pZCBhdGlfcmVtb3RlMl9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQogewogCXN0cnVjdCBhdGlfcmVtb3RlMiAqYXIyID0gaW5wdXRfZ2V0X2RydmRhdGEoaWRldik7CiAKLQl1c2Jfa2lsbF91cmIoYXIyLT51cmJbMF0pOwotCXVzYl9raWxsX3VyYihhcjItPnVyYlsxXSk7CisJZGV2X2RiZygmYXIyLT5pbnRmWzBdLT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZhdGlfcmVtb3RlMl9tdXRleCk7CisKKwlpZiAoIShhcjItPmZsYWdzICYgQVRJX1JFTU9URTJfU1VTUEVOREVEKSkKKwkJYXRpX3JlbW90ZTJfa2lsbF91cmJzKGFyMik7CisKKwlhcjItPmZsYWdzICY9IH5BVElfUkVNT1RFMl9PUEVORUQ7CisKKwltdXRleF91bmxvY2soJmF0aV9yZW1vdGUyX211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgYXRpX3JlbW90ZTJfaW5wdXRfbW91c2Uoc3RydWN0IGF0aV9yZW1vdGUyICphcjIpCkBAIC0xNzIsNyArMjQzLDcgQEAKIAogCW1vZGUgPSBkYXRhWzBdICYgMHgwRjsKIAotCWlmIChtb2RlID4gNCkgeworCWlmIChtb2RlID4gQVRJX1JFTU9URTJfUEMpIHsKIAkJZGV2X2VycigmYXIyLT5pbnRmWzBdLT5kZXYsCiAJCQkiVW5rbm93biBtb2RlIGJ5dGUgKCUwMnggJTAyeCAlMDJ4ICUwMngpXG4iLAogCQkJZGF0YVszXSwgZGF0YVsyXSwgZGF0YVsxXSwgZGF0YVswXSk7CkBAIC0xOTEsNyArMjYyLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGUyX2tleV90YWJsZVtpXS5rZXlfY29kZSAhPSBLRVlfUkVTRVJWRUQ7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGlfcmVtb3RlMl9rZXlfdGFibGUpOyBpKyspCiAJCWlmIChhdGlfcmVtb3RlMl9rZXlfdGFibGVbaV0uaHdfY29kZSA9PSBod19jb2RlKQogCQkJcmV0dXJuIGk7CiAKQEAgLTIxMSw3ICsyODIsNyBAQAogCiAJbW9kZSA9IGRhdGFbMF0gJiAweDBGOwogCi0JaWYgKG1vZGUgPiA0KSB7CisJaWYgKG1vZGUgPiBBVElfUkVNT1RFMl9QQykgewogCQlkZXZfZXJyKCZhcjItPmludGZbMV0tPmRldiwKIAkJCSJVbmtub3duIG1vZGUgYnl0ZSAoJTAyeCAlMDJ4ICUwMnggJTAyeClcbiIsCiAJCQlkYXRhWzNdLCBkYXRhWzJdLCBkYXRhWzFdLCBkYXRhWzBdKTsKQEAgLTIxOSwxMCArMjkwLDYgQEAKIAl9CiAKIAlod19jb2RlID0gZGF0YVsyXTsKLQkvKgotCSAqIE1vZGUga2V5cyAoQVVYMS1BVVg0LCBQQykgYWxsIGdlbmVyYXRlIHRoZSBzYW1lIGNvZGUgYnl0ZS4KLQkgKiBVc2UgdGhlIG1vZGUgYnl0ZSB0byBmaWd1cmUgb3V0IHdoaWNoIG9uZSB3YXMgcHJlc3NlZC4KLQkgKi8KIAlpZiAoaHdfY29kZSA9PSAweDNmKSB7CiAJCS8qCiAJCSAqIEZvciBzb21lIGluY29tcHJlaGVuc2libGUgcmVhc29uIHRoZSBtb3VzZSBwYWQgZ2VuZXJhdGVzCkBAIC0yMzYsOCArMzAzLDYgQEAKIAogCQlpZiAoZGF0YVsxXSA9PSAwKQogCQkJYXIyLT5tb2RlID0gbW9kZTsKLQotCQlod19jb2RlIHw9IG1vZGUgPDwgODsKIAl9CiAKIAlpZiAoISgoMSA8PCBtb2RlKSAmIG1vZGVfbWFzaykpCkBAIC0yNjAsOCArMzI1LDggQEAKIAljYXNlIDI6CS8qIHJlcGVhdCAqLwogCiAJCS8qIE5vIHJlcGVhdCBmb3IgbW91c2UgYnV0dG9ucy4gKi8KLQkJaWYgKGF0aV9yZW1vdGUyX2tleV90YWJsZVtpbmRleF0ua2V5X2NvZGUgPT0gQlROX0xFRlQgfHwKLQkJICAgIGF0aV9yZW1vdGUyX2tleV90YWJsZVtpbmRleF0ua2V5X2NvZGUgPT0gQlROX1JJR0hUKQorCQlpZiAoYXIyLT5rZXljb2RlW21vZGVdW2luZGV4XSA9PSBCVE5fTEVGVCB8fAorCQkgICAgYXIyLT5rZXljb2RlW21vZGVdW2luZGV4XSA9PSBCVE5fUklHSFQpCiAJCQlyZXR1cm47CiAKIAkJaWYgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGFyMi0+amlmZmllcykpCkBAIC0yNzYsNyArMzQxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlucHV0X2V2ZW50KGlkZXYsIEVWX0tFWSwgYXRpX3JlbW90ZTJfa2V5X3RhYmxlW2luZGV4XS5rZXlfY29kZSwgZGF0YVsxXSk7CisJaW5wdXRfZXZlbnQoaWRldiwgRVZfS0VZLCBhcjItPmtleWNvZGVbbW9kZV1baW5kZXhdLCBkYXRhWzFdKTsKIAlpbnB1dF9zeW5jKGlkZXYpOwogfQogCkBAIC0yODcsNiArMzUyLDcgQEAKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAljYXNlIDA6CisJCXVzYl9tYXJrX2xhc3RfYnVzeShhcjItPnVkZXYpOwogCQlhdGlfcmVtb3RlMl9pbnB1dF9tb3VzZShhcjIpOwogCQlicmVhazsKIAljYXNlIC1FTk9FTlQ6CkBAIC0yOTcsNiArMzYzLDcgQEAKIAkJCSIlcygpOiB1cmIgc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgorCQl1c2JfbWFya19sYXN0X2J1c3koYXIyLT51ZGV2KTsKIAkJZGV2X2VycigmYXIyLT5pbnRmWzBdLT5kZXYsCiAJCQkiJXMoKTogdXJiIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCX0KQEAgLTMxNCw2ICszODEsNyBAQAogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgMDoKKwkJdXNiX21hcmtfbGFzdF9idXN5KGFyMi0+dWRldik7CiAJCWF0aV9yZW1vdGUyX2lucHV0X2tleShhcjIpOwogCQlicmVhazsKIAljYXNlIC1FTk9FTlQ6CkBAIC0zMjQsNiArMzkyLDcgQEAKIAkJCSIlcygpOiB1cmIgc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKIAlkZWZhdWx0OgorCQl1c2JfbWFya19sYXN0X2J1c3koYXIyLT51ZGV2KTsKIAkJZGV2X2VycigmYXIyLT5pbnRmWzFdLT5kZXYsCiAJCQkiJXMoKTogdXJiIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCX0KQEAgLTMzNCwxMCArNDAzLDYwIEBACiAJCQkiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSA9ICVkXG4iLCBfX2Z1bmNfXywgcik7CiB9CiAKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZTJfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LAorCQkJCSAgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCit7CisJc3RydWN0IGF0aV9yZW1vdGUyICphcjIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlpbnQgaW5kZXgsIG1vZGU7CisKKwltb2RlID0gc2NhbmNvZGUgPj4gODsKKwlpZiAobW9kZSA+IEFUSV9SRU1PVEUyX1BDIHx8ICEoKDEgPDwgbW9kZSkgJiBtb2RlX21hc2spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWluZGV4ID0gYXRpX3JlbW90ZTJfbG9va3VwKHNjYW5jb2RlICYgMHhGRik7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqa2V5Y29kZSA9IGFyMi0+a2V5Y29kZVttb2RlXVtpbmRleF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZTJfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LCBpbnQgc2NhbmNvZGUsIGludCBrZXljb2RlKQoreworCXN0cnVjdCBhdGlfcmVtb3RlMiAqYXIyID0gaW5wdXRfZ2V0X2RydmRhdGEoaWRldik7CisJaW50IGluZGV4LCBtb2RlLCBvbGRfa2V5Y29kZTsKKworCW1vZGUgPSBzY2FuY29kZSA+PiA4OworCWlmIChtb2RlID4gQVRJX1JFTU9URTJfUEMgfHwgISgoMSA8PCBtb2RlKSAmIG1vZGVfbWFzaykpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5kZXggPSBhdGlfcmVtb3RlMl9sb29rdXAoc2NhbmNvZGUgJiAweEZGKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrZXljb2RlIDwgS0VZX1JFU0VSVkVEIHx8IGtleWNvZGUgPiBLRVlfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9rZXljb2RlID0gYXIyLT5rZXljb2RlW21vZGVdW2luZGV4XTsKKwlhcjItPmtleWNvZGVbbW9kZV1baW5kZXhdID0ga2V5Y29kZTsKKwlzZXRfYml0KGtleWNvZGUsIGlkZXYtPmtleWJpdCk7CisKKwlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgQVRJX1JFTU9URTJfTU9ERVM7IG1vZGUrKykgeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBUlJBWV9TSVpFKGF0aV9yZW1vdGUyX2tleV90YWJsZSk7IGluZGV4KyspIHsKKwkJCWlmIChhcjItPmtleWNvZGVbbW9kZV1baW5kZXhdID09IG9sZF9rZXljb2RlKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJY2xlYXJfYml0KG9sZF9rZXljb2RlLCBpZGV2LT5rZXliaXQpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYXRpX3JlbW90ZTJfaW5wdXRfaW5pdChzdHJ1Y3QgYXRpX3JlbW90ZTIgKmFyMikKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OwotCWludCBpLCByZXR2YWw7CisJaW50IGluZGV4LCBtb2RlLCByZXR2YWw7CiAKIAlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpZGV2KQpAQCAtMzUwLDggKzQ2OSwyNiBAQAogCWlkZXYtPmtleWJpdFtCSVRfV09SRChCVE5fTU9VU0UpXSA9IEJJVF9NQVNLKEJUTl9MRUZUKSB8CiAJCUJJVF9NQVNLKEJUTl9SSUdIVCk7CiAJaWRldi0+cmVsYml0WzBdID0gQklUX01BU0soUkVMX1gpIHwgQklUX01BU0soUkVMX1kpOwotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGUyX2tleV90YWJsZVtpXS5rZXlfY29kZSAhPSBLRVlfUkVTRVJWRUQ7IGkrKykKLQkJc2V0X2JpdChhdGlfcmVtb3RlMl9rZXlfdGFibGVbaV0ua2V5X2NvZGUsIGlkZXYtPmtleWJpdCk7CisKKwlmb3IgKG1vZGUgPSAwOyBtb2RlIDwgQVRJX1JFTU9URTJfTU9ERVM7IG1vZGUrKykgeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBUlJBWV9TSVpFKGF0aV9yZW1vdGUyX2tleV90YWJsZSk7IGluZGV4KyspIHsKKwkJCWFyMi0+a2V5Y29kZVttb2RlXVtpbmRleF0gPSBhdGlfcmVtb3RlMl9rZXlfdGFibGVbaW5kZXhdLmtleWNvZGU7CisJCQlzZXRfYml0KGFyMi0+a2V5Y29kZVttb2RlXVtpbmRleF0sIGlkZXYtPmtleWJpdCk7CisJCX0KKwl9CisKKwkvKiBBVVgxLUFVWDQgYW5kIFBDIGdlbmVyYXRlIHRoZSBzYW1lIHNjYW5jb2RlLiAqLworCWluZGV4ID0gYXRpX3JlbW90ZTJfbG9va3VwKDB4M2YpOworCWFyMi0+a2V5Y29kZVtBVElfUkVNT1RFMl9BVVgxXVtpbmRleF0gPSBLRVlfUFJPRzE7CisJYXIyLT5rZXljb2RlW0FUSV9SRU1PVEUyX0FVWDJdW2luZGV4XSA9IEtFWV9QUk9HMjsKKwlhcjItPmtleWNvZGVbQVRJX1JFTU9URTJfQVVYM11baW5kZXhdID0gS0VZX1BST0czOworCWFyMi0+a2V5Y29kZVtBVElfUkVNT1RFMl9BVVg0XVtpbmRleF0gPSBLRVlfUFJPRzQ7CisJYXIyLT5rZXljb2RlW0FUSV9SRU1PVEUyX1BDXVtpbmRleF0gPSBLRVlfUEM7CisJc2V0X2JpdChLRVlfUFJPRzEsIGlkZXYtPmtleWJpdCk7CisJc2V0X2JpdChLRVlfUFJPRzIsIGlkZXYtPmtleWJpdCk7CisJc2V0X2JpdChLRVlfUFJPRzMsIGlkZXYtPmtleWJpdCk7CisJc2V0X2JpdChLRVlfUFJPRzQsIGlkZXYtPmtleWJpdCk7CisJc2V0X2JpdChLRVlfUEMsIGlkZXYtPmtleWJpdCk7CiAKIAlpZGV2LT5yZXBbUkVQX0RFTEFZXSAgPSAyNTA7CiAJaWRldi0+cmVwW1JFUF9QRVJJT0RdID0gMzM7CkBAIC0zNTksNiArNDk2LDkgQEAKIAlpZGV2LT5vcGVuID0gYXRpX3JlbW90ZTJfb3BlbjsKIAlpZGV2LT5jbG9zZSA9IGF0aV9yZW1vdGUyX2Nsb3NlOwogCisJaWRldi0+Z2V0a2V5Y29kZSA9IGF0aV9yZW1vdGUyX2dldGtleWNvZGU7CisJaWRldi0+c2V0a2V5Y29kZSA9IGF0aV9yZW1vdGUyX3NldGtleWNvZGU7CisKIAlpZGV2LT5uYW1lID0gYXIyLT5uYW1lOwogCWlkZXYtPnBoeXMgPSBhcjItPnBoeXM7CiAKQEAgLTQ5MCw2ICs2MzAsOCBAQAogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGFyMik7CiAKKwlpbnRlcmZhY2UtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAxOworCiAJcmV0dXJuIDA7CiAKICBmYWlsMjoKQEAgLTUyMiw2ICs2NjQsNTcgQEAKIAlrZnJlZShhcjIpOwogfQogCitzdGF0aWMgaW50IGF0aV9yZW1vdGUyX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCSAgICAgICBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZTIgKmFyMjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGFsdC0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKQorCQlyZXR1cm4gMDsKKworCWFyMiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWRldl9kYmcoJmFyMi0+aW50ZlswXS0+ZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmYXRpX3JlbW90ZTJfbXV0ZXgpOworCisJaWYgKGFyMi0+ZmxhZ3MgJiBBVElfUkVNT1RFMl9PUEVORUQpCisJCWF0aV9yZW1vdGUyX2tpbGxfdXJicyhhcjIpOworCisJYXIyLT5mbGFncyB8PSBBVElfUkVNT1RFMl9TVVNQRU5ERUQ7CisKKwltdXRleF91bmxvY2soJmF0aV9yZW1vdGUyX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aV9yZW1vdGUyX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBhdGlfcmVtb3RlMiAqYXIyOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisJaW50IHIgPSAwOworCisJaWYgKGFsdC0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKQorCQlyZXR1cm4gMDsKKworCWFyMiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWRldl9kYmcoJmFyMi0+aW50ZlswXS0+ZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmYXRpX3JlbW90ZTJfbXV0ZXgpOworCisJaWYgKGFyMi0+ZmxhZ3MgJiBBVElfUkVNT1RFMl9PUEVORUQpCisJCXIgPSBhdGlfcmVtb3RlMl9zdWJtaXRfdXJicyhhcjIpOworCisJaWYgKCFyKQorCQlhcjItPmZsYWdzICY9IH5BVElfUkVNT1RFMl9TVVNQRU5ERUQ7CisKKwltdXRleF91bmxvY2soJmF0aV9yZW1vdGUyX211dGV4KTsKKworCXJldHVybiByOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBhdGlfcmVtb3RlMl9pbml0KHZvaWQpCiB7CiAJaW50IHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvY20xMDkuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9jbTEwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTE2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvY20xMDkuYwpAQCAtMCwwICsxLDg4MiBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIFZvSVAgVVNCIHBob25lcyB3aXRoIENNMTA5IGNoaXBzZXRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyAtIDIwMDggQWxmcmVkIEUuIEhlZ2dlc3RhZCA8YWVoQGRiLm9yZz4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqLworCisvKgorICogICBUZXN0ZWQgZGV2aWNlczoKKyAqCS0gS29tdW5pa2F0ZSBLSVAxMDAwCisgKgktIEdlbml1cyBHLXRhbGsKKyAqCS0gQWxsaWVkLVRlbGVzaXMgQ29yZWdhIFVTQlBIMDEKKyAqCS0gLi4uCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIHllYWxpbmsuYyBkcml2ZXIKKyAqCisgKiBUaGFua3MgdG86CisgKiAgIC0gQXV0aG9ycyBvZiB5ZWFsaW5rLmMKKyAqICAgLSBUaG9tYXMgUmVpdG1heXIKKyAqICAgLSBPbGl2ZXIgTmV1a3VtIGZvciBnb29kIHJldmlldyBjb21tZW50cyBhbmQgY29kZQorICogICAtIFNoYXVuIEphY2ttYW4gPHNqYWNrbWFuQGdtYWlsLmNvbT4gZm9yIEdlbml1cyBHLXRhbGsga2V5bWFwCisgKiAgIC0gRG1pdHJ5IFRvcm9raG92IGZvciB2YWx1YWJsZSBpbnB1dCBhbmQgcmV2aWV3CisgKgorICogVG9kbzoKKyAqICAgLSBSZWFkL3dyaXRlIEVFUFJPTQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMjAwODA4MDUiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJBbGZyZWQgRS4gSGVnZ2VzdGFkIgorI2RlZmluZSBEUklWRVJfREVTQyAgICAiQ00xMDkgcGhvbmUgZHJpdmVyIgorCitzdGF0aWMgY2hhciAqcGhvbmUgPSAia2lwMTAwMCI7Cittb2R1bGVfcGFyYW0ocGhvbmUsIGNoYXJwLCBTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocGhvbmUsICJQaG9uZSBuYW1lIHtraXAxMDAwLCBndGFsaywgdXNicGgwMX0iKTsKKworZW51bSB7CisJLyogSElEIFJlZ2lzdGVycyAqLworCUhJRF9JUjAgPSAweDAwLCAvKiBSZWNvcmQvUGxheWJhY2stbXV0ZSBidXR0b24sIFZvbHVtZSB1cC9kb3duICAqLworCUhJRF9JUjEgPSAweDAxLCAvKiBHUEksIGdlbmVyaWMgcmVnaXN0ZXJzIG9yIEVFUFJPTV9EQVRBMCAgICAgICAqLworCUhJRF9JUjIgPSAweDAyLCAvKiBHZW5lcmljIHJlZ2lzdGVycyBvciBFRVBST01fREFUQTEgICAgICAgICAgICAqLworCUhJRF9JUjMgPSAweDAzLCAvKiBHZW5lcmljIHJlZ2lzdGVycyBvciBFRVBST01fQ1RSTCAgICAgICAgICAgICAqLworCUhJRF9PUjAgPSAweDAwLCAvKiBNYXBwaW5nIGNvbnRyb2wsIGJ1enplciwgU1BESUYgKG9mZnNldCAweDA0KSAqLworCUhJRF9PUjEgPSAweDAxLCAvKiBHUE8gLSBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0ICAgICAgICAgICAgICAgICAqLworCUhJRF9PUjIgPSAweDAyLCAvKiBTZXQgR1BJTyB0byBpbnB1dC9vdXRwdXQgbW9kZSAgICAgICAgICAgICAgICAqLworCUhJRF9PUjMgPSAweDAzLCAvKiBTUERJRiBzdGF0dXMgY2hhbm5lbCBvciBFRVBST01fQ1RSTCAgICAgICAgICAqLworCisJLyogSElEX0lSMCAqLworCVJFQ09SRF9NVVRFICAgPSAxIDw8IDMsCisJUExBWUJBQ0tfTVVURSA9IDEgPDwgMiwKKwlWT0xVTUVfRE9XTiAgID0gMSA8PCAxLAorCVZPTFVNRV9VUCAgICAgPSAxIDw8IDAsCisKKwkvKiBISURfT1IwICovCisJLyogYml0cyA3LTYKKwkgICAwOiBISURfT1IxLTIgYXJlIHVzZWQgZm9yIEdQTzsgSElEX09SMCwgMyBhcmUgdXNlZCBmb3IgYnV6emVyCisJICAgICAgYW5kIFNQRElGCisJICAgMTogSElEX09SMC0zIGFyZSB1c2VkIGFzIGdlbmVyaWMgSElEIHJlZ2lzdGVycworCSAgIDI6IFZhbHVlcyB3cml0dGVuIHRvIEhJRF9PUjAtMyBhcmUgYWxzbyBtYXBwZWQgdG8gTUNVX0NUUkwsCisJICAgICAgRUVQUk9NX0RBVEEwLTEsIEVFUFJPTV9DVFJMIChzZWUgTm90ZSkKKwkgICAzOiBSZXNlcnZlZAorCSAqLworCUhJRF9PUl9HUE9fQlVaX1NQRElGICAgPSAwIDw8IDYsCisJSElEX09SX0dFTkVSSUNfSElEX1JFRyA9IDEgPDwgNiwKKwlISURfT1JfTUFQX01DVV9FRVBST00gID0gMiA8PCA2LAorCisJQlVaWkVSX09OID0gMSA8PCA1LAorCisJLyogdXAgdG8gMjU2IG5vcm1hbCBrZXlzLCB1cCB0byAxNiBzcGVjaWFsIGtleXMgKi8KKwlLRVlNQVBfU0laRSA9IDI1NiArIDE2LAorfTsKKworLyogQ00xMDkgcHJvdG9jb2wgcGFja2V0ICovCitzdHJ1Y3QgY20xMDlfY3RsX3BhY2tldCB7CisJdTggYnl0ZVs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIHsgVVNCX1BLVF9MRU4gPSBzaXplb2Yoc3RydWN0IGNtMTA5X2N0bF9wYWNrZXQpIH07CisKKy8qIENNMTA5IGRldmljZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBjbTEwOV9kZXYgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CSAvKiBpbnB1dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsgLyogdXNiIGRldmljZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCisJLyogaXJxIGlucHV0IGNoYW5uZWwgKi8KKwlzdHJ1Y3QgY20xMDlfY3RsX3BhY2tldCAqaXJxX2RhdGE7CisJZG1hX2FkZHJfdCBpcnFfZG1hOworCXN0cnVjdCB1cmIgKnVyYl9pcnE7CisKKwkvKiBjb250cm9sIG91dHB1dCBjaGFubmVsICovCisJc3RydWN0IGNtMTA5X2N0bF9wYWNrZXQgKmN0bF9kYXRhOworCWRtYV9hZGRyX3QgY3RsX2RtYTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdGxfcmVxOworCWRtYV9hZGRyX3QgY3RsX3JlcV9kbWE7CisJc3RydWN0IHVyYiAqdXJiX2N0bDsKKwkvKgorCSAqIFRoZSAzIGJpdGZpZWxkcyBiZWxvdyBhcmUgcHJvdGVjdGVkIGJ5IGN0bF9zdWJtaXRfbG9jay4KKwkgKiBUaGV5IGhhdmUgdG8gYmUgc2VwYXJhdGUgc2luY2UgdGhleSBhcmUgYWNjZXNzZWQgZnJvbSBJUlEKKwkgKiBjb250ZXh0LgorCSAqLworCXVuc2lnbmVkIGlycV91cmJfcGVuZGluZzoxOwkvKiBpcnFfdXJiIGlzIGluIGZsaWdodCAqLworCXVuc2lnbmVkIGN0bF91cmJfcGVuZGluZzoxOwkvKiBjdGxfdXJiIGlzIGluIGZsaWdodCAqLworCXVuc2lnbmVkIGJ1enplcl9wZW5kaW5nOjE7CS8qIG5lZWQgdG8gaXNzdWUgYnV6eiBjb21tYW5kICovCisJc3BpbmxvY2tfdCBjdGxfc3VibWl0X2xvY2s7CisKKwl1bnNpZ25lZCBjaGFyIGJ1enplcl9zdGF0ZTsJLyogb24vb2ZmICovCisKKwkvKiBmbGFncyAqLworCXVuc2lnbmVkIG9wZW46MTsKKwl1bnNpZ25lZCByZXNldHRpbmc6MTsKKwl1bnNpZ25lZCBzaHV0ZG93bjoxOworCisJLyogVGhpcyBtdXRleCBwcm90ZWN0cyB3cml0ZXMgdG8gdGhlIGFib3ZlIGZsYWdzICovCisJc3RydWN0IG11dGV4IHBtX211dGV4OworCisJdW5zaWduZWQgc2hvcnQga2V5bWFwW0tFWU1BUF9TSVpFXTsKKworCWNoYXIgcGh5c1s2NF07CQkvKiBwaHlzaWNhbCBkZXZpY2UgcGF0aCAqLworCWludCBrZXlfY29kZTsJCS8qIGxhc3QgcmVwb3J0ZWQga2V5ICovCisJaW50IGtleWJpdDsJCS8qIDA9bmV3IHNjYW4gIDEsMiw0LDg9c2NhbiBjb2x1bW5zICAqLworCXU4IGdwaTsJCQkvKiBDYWNoZWQgdmFsdWUgb2YgR1BJIChoaWdoIG5pYmJsZSkgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENNMTA5IGtleSBpbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNwZWNpYWxfa2V5bWFwKGludCBjb2RlKQoreworCWlmIChjb2RlID4gMHhmZikgeworCQlzd2l0Y2ggKGNvZGUgLSAweGZmKSB7CisJCWNhc2UgUkVDT1JEX01VVEU6CXJldHVybiBLRVlfTVVURTsKKwkJY2FzZSBQTEFZQkFDS19NVVRFOglyZXR1cm4gS0VZX01VVEU7CisJCWNhc2UgVk9MVU1FX0RPV046CXJldHVybiBLRVlfVk9MVU1FRE9XTjsKKwkJY2FzZSBWT0xVTUVfVVA6CQlyZXR1cm4gS0VZX1ZPTFVNRVVQOworCQl9CisJfQorCXJldHVybiBLRVlfUkVTRVJWRUQ7Cit9CisKKy8qIE1hcCBkZXZpY2UgYnV0dG9ucyB0byBpbnRlcm5hbCBrZXkgZXZlbnRzLgorICoKKyAqIFRoZSAidXAiIGFuZCAiZG93biIga2V5cywgYXJlIHN5bWJvbGlzZWQgYnkgYXJyb3dzIG9uIHRoZSBidXR0b24uCisgKiBUaGUgInBpY2t1cCIgYW5kICJoYW5ndXAiIGtleXMgYXJlIHN5bWJvbGlzZWQgYnkgYSBncmVlbiBhbmQgcmVkIHBob25lCisgKiBvbiB0aGUgYnV0dG9uLgorCisgS29tdW5pa2F0ZSBLSVAxMDAwIEtleWJvYXJkIE1hdHJpeAorCisgICAgIC0+IC0tIDEgLS0gMiAtLSAzICAtLT4gR1BJIHBpbiA0ICgweDEwKQorICAgICAgfCAgICB8ICAgIHwgICAgfAorICAgICA8LSAtLSA0IC0tIDUgLS0gNiAgLS0+IEdQSSBwaW4gNSAoMHgyMCkKKyAgICAgIHwgICAgfCAgICB8ICAgIHwKKyAgICAgRU5EIC0gNyAtLSA4IC0tIDkgIC0tPiBHUEkgcGluIDYgKDB4NDApCisgICAgICB8ICAgIHwgICAgfCAgICB8CisgICAgIE9LIC0tICogLS0gMCAtLSAjICAtLT4gR1BJIHBpbiA3ICgweDgwKQorICAgICAgfCAgICB8ICAgIHwgICAgfAorCisgICAgIC98XCAgL3xcICAvfFwgIC98XAorICAgICAgfCAgICB8ICAgIHwgICAgfAorR1BPCitwaW46ICAzICAgIDIgICAgMSAgICAwCisgICAgIDB4OCAgMHg0ICAweDIgIDB4MQorCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBrZXltYXBfa2lwMTAwMChpbnQgc2NhbmNvZGUpCit7CisJc3dpdGNoIChzY2FuY29kZSkgewkJCQkvKiBwaG9uZSBrZXk6ICAgKi8KKwljYXNlIDB4ODI6IHJldHVybiBLRVlfTlVNRVJJQ18wOwkJLyogICAwICAgICAgICAgICovCisJY2FzZSAweDE0OiByZXR1cm4gS0VZX05VTUVSSUNfMTsJCS8qICAgMSAgICAgICAgICAqLworCWNhc2UgMHgxMjogcmV0dXJuIEtFWV9OVU1FUklDXzI7CQkvKiAgIDIgICAgICAgICAgKi8KKwljYXNlIDB4MTE6IHJldHVybiBLRVlfTlVNRVJJQ18zOwkJLyogICAzICAgICAgICAgICovCisJY2FzZSAweDI0OiByZXR1cm4gS0VZX05VTUVSSUNfNDsJCS8qICAgNCAgICAgICAgICAqLworCWNhc2UgMHgyMjogcmV0dXJuIEtFWV9OVU1FUklDXzU7CQkvKiAgIDUgICAgICAgICAgKi8KKwljYXNlIDB4MjE6IHJldHVybiBLRVlfTlVNRVJJQ182OwkJLyogICA2ICAgICAgICAgICovCisJY2FzZSAweDQ0OiByZXR1cm4gS0VZX05VTUVSSUNfNzsJCS8qICAgNyAgICAgICAgICAqLworCWNhc2UgMHg0MjogcmV0dXJuIEtFWV9OVU1FUklDXzg7CQkvKiAgIDggICAgICAgICAgKi8KKwljYXNlIDB4NDE6IHJldHVybiBLRVlfTlVNRVJJQ185OwkJLyogICA5ICAgICAgICAgICovCisJY2FzZSAweDgxOiByZXR1cm4gS0VZX05VTUVSSUNfUE9VTkQ7CQkvKiAgICMgICAgICAgICAgKi8KKwljYXNlIDB4ODQ6IHJldHVybiBLRVlfTlVNRVJJQ19TVEFSOwkJLyogICAqICAgICAgICAgICovCisJY2FzZSAweDg4OiByZXR1cm4gS0VZX0VOVEVSOwkJCS8qICAgcGlja3VwICAgICAqLworCWNhc2UgMHg0ODogcmV0dXJuIEtFWV9FU0M7CQkJLyogICBoYW5ndXAgICAgICovCisJY2FzZSAweDI4OiByZXR1cm4gS0VZX0xFRlQ7CQkJLyogICBJTiAgICAgICAgICovCisJY2FzZSAweDE4OiByZXR1cm4gS0VZX1JJR0hUOwkJCS8qICAgT1VUICAgICAgICAqLworCWRlZmF1bHQ6ICAgcmV0dXJuIHNwZWNpYWxfa2V5bWFwKHNjYW5jb2RlKTsKKwl9Cit9CisKKy8qCisgIENvbnRyaWJ1dGVkIGJ5IFNoYXVuIEphY2ttYW4gPHNqYWNrbWFuQGdtYWlsLmNvbT4KKworICBHZW5pdXMgRy1UYWxrIGtleWJvYXJkIG1hdHJpeAorICAgICAwIDEgMiAzCisgIDQ6IDAgNCA4IFRhbGsKKyAgNTogMSA1IDkgRW5kCisgIDY6IDIgNiAjIFVwCisgIDc6IDMgNyAqIERvd24KKyovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQga2V5bWFwX2d0YWxrKGludCBzY2FuY29kZSkKK3sKKwlzd2l0Y2ggKHNjYW5jb2RlKSB7CisJY2FzZSAweDExOiByZXR1cm4gS0VZX05VTUVSSUNfMDsKKwljYXNlIDB4MjE6IHJldHVybiBLRVlfTlVNRVJJQ18xOworCWNhc2UgMHg0MTogcmV0dXJuIEtFWV9OVU1FUklDXzI7CisJY2FzZSAweDgxOiByZXR1cm4gS0VZX05VTUVSSUNfMzsKKwljYXNlIDB4MTI6IHJldHVybiBLRVlfTlVNRVJJQ180OworCWNhc2UgMHgyMjogcmV0dXJuIEtFWV9OVU1FUklDXzU7CisJY2FzZSAweDQyOiByZXR1cm4gS0VZX05VTUVSSUNfNjsKKwljYXNlIDB4ODI6IHJldHVybiBLRVlfTlVNRVJJQ183OworCWNhc2UgMHgxNDogcmV0dXJuIEtFWV9OVU1FUklDXzg7CisJY2FzZSAweDI0OiByZXR1cm4gS0VZX05VTUVSSUNfOTsKKwljYXNlIDB4NDQ6IHJldHVybiBLRVlfTlVNRVJJQ19QT1VORDsJLyogIyAqLworCWNhc2UgMHg4NDogcmV0dXJuIEtFWV9OVU1FUklDX1NUQVI7CS8qICogKi8KKwljYXNlIDB4MTg6IHJldHVybiBLRVlfRU5URVI7CQkvKiBUYWxrIChncmVlbiBoYW5kc2V0KSAqLworCWNhc2UgMHgyODogcmV0dXJuIEtFWV9FU0M7CQkvKiBFbmQgKHJlZCBoYW5kc2V0KSAqLworCWNhc2UgMHg0ODogcmV0dXJuIEtFWV9VUDsJCS8qIE1lbnUgdXAgKHJvY2tlciBzd2l0Y2gpICovCisJY2FzZSAweDg4OiByZXR1cm4gS0VZX0RPV047CQkvKiBNZW51IGRvd24gKHJvY2tlciBzd2l0Y2gpICovCisJZGVmYXVsdDogICByZXR1cm4gc3BlY2lhbF9rZXltYXAoc2NhbmNvZGUpOworCX0KK30KKworLyoKKyAqIEtleW1hcCBmb3IgQWxsaWVkLVRlbGVzaXMgQ29yZWdhIFVTQlBIMDEKKyAqIGh0dHA6Ly93d3cuYWxsaWVkdGVsZXNpcy1jb3JlZ2EuY29tLzIvMTM0NC8xNDM3LzEzNjAvY2hwcmQuaHRtbAorICoKKyAqIENvbnRyaWJ1dGVkIGJ5IGp1bHlAbmF0LmJnCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBrZXltYXBfdXNicGgwMShpbnQgc2NhbmNvZGUpCit7CisJc3dpdGNoIChzY2FuY29kZSkgeworCWNhc2UgMHgxMTogcmV0dXJuIEtFWV9OVU1FUklDXzA7CQkvKiAgIDAgICAgICAgICAgKi8KKwljYXNlIDB4MjE6IHJldHVybiBLRVlfTlVNRVJJQ18xOwkJLyogICAxICAgICAgICAgICovCisJY2FzZSAweDQxOiByZXR1cm4gS0VZX05VTUVSSUNfMjsJCS8qICAgMiAgICAgICAgICAqLworCWNhc2UgMHg4MTogcmV0dXJuIEtFWV9OVU1FUklDXzM7CQkvKiAgIDMgICAgICAgICAgKi8KKwljYXNlIDB4MTI6IHJldHVybiBLRVlfTlVNRVJJQ180OwkJLyogICA0ICAgICAgICAgICovCisJY2FzZSAweDIyOiByZXR1cm4gS0VZX05VTUVSSUNfNTsJCS8qICAgNSAgICAgICAgICAqLworCWNhc2UgMHg0MjogcmV0dXJuIEtFWV9OVU1FUklDXzY7CQkvKiAgIDYgICAgICAgICAgKi8KKwljYXNlIDB4ODI6IHJldHVybiBLRVlfTlVNRVJJQ183OwkJLyogICA3ICAgICAgICAgICovCisJY2FzZSAweDE0OiByZXR1cm4gS0VZX05VTUVSSUNfODsJCS8qICAgOCAgICAgICAgICAqLworCWNhc2UgMHgyNDogcmV0dXJuIEtFWV9OVU1FUklDXzk7CQkvKiAgIDkgICAgICAgICAgKi8KKwljYXNlIDB4NDQ6IHJldHVybiBLRVlfTlVNRVJJQ19QT1VORDsJCS8qICAgIyAgICAgICAgICAqLworCWNhc2UgMHg4NDogcmV0dXJuIEtFWV9OVU1FUklDX1NUQVI7CQkvKiAgICogICAgICAgICAgKi8KKwljYXNlIDB4MTg6IHJldHVybiBLRVlfRU5URVI7CQkJLyogICBwaWNrdXAgICAgICovCisJY2FzZSAweDI4OiByZXR1cm4gS0VZX0VTQzsJCQkvKiAgIGhhbmd1cCAgICAgKi8KKwljYXNlIDB4NDg6IHJldHVybiBLRVlfTEVGVDsJCQkvKiAgIElOICAgICAgICAgKi8KKwljYXNlIDB4ODg6IHJldHVybiBLRVlfUklHSFQ7CQkJLyogICBPVVQgICAgICAgICovCisJZGVmYXVsdDogICByZXR1cm4gc3BlY2lhbF9rZXltYXAoc2NhbmNvZGUpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0ICgqa2V5bWFwKShpbnQpID0ga2V5bWFwX2tpcDEwMDA7CisKKy8qCisgKiBDb21wbGV0ZXMgYSByZXF1ZXN0IGJ5IGNvbnZlcnRpbmcgdGhlIGRhdGEgaW50byBldmVudHMgZm9yIHRoZQorICogaW5wdXQgc3Vic3lzdGVtLgorICovCitzdGF0aWMgdm9pZCByZXBvcnRfa2V5KHN0cnVjdCBjbTEwOV9kZXYgKmRldiwgaW50IGtleSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gZGV2LT5pZGV2OworCisJaWYgKGRldi0+a2V5X2NvZGUgPj0gMCkgeworCQkvKiBvbGQga2V5IHVwICovCisJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwgZGV2LT5rZXlfY29kZSwgMCk7CisJfQorCisJZGV2LT5rZXlfY29kZSA9IGtleTsKKwlpZiAoa2V5ID49IDApIHsKKwkJLyogbmV3IHZhbGlkIGtleSAqLworCQlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIGtleSwgMSk7CisJfQorCisJaW5wdXRfc3luYyhpZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ00xMDkgdXNiIGNvbW11bmljYXRpb24gaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNtMTA5X3N1Ym1pdF9idXp6X3RvZ2dsZShzdHJ1Y3QgY20xMDlfZGV2ICpkZXYpCit7CisJaW50IGVycm9yOworCisJaWYgKGRldi0+YnV6emVyX3N0YXRlKQorCQlkZXYtPmN0bF9kYXRhLT5ieXRlW0hJRF9PUjBdIHw9IEJVWlpFUl9PTjsKKwllbHNlCisJCWRldi0+Y3RsX2RhdGEtPmJ5dGVbSElEX09SMF0gJj0gfkJVWlpFUl9PTjsKKworCWVycm9yID0gdXNiX3N1Ym1pdF91cmIoZGV2LT51cmJfY3RsLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyb3IpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiICh1cmJfY3RsKSBmYWlsZWQgJWQiLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCisvKgorICogSVJRIGhhbmRsZXIKKyAqLworc3RhdGljIHZvaWQgY20xMDlfdXJiX2lycV9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGNtMTA5X2RldiAqZGV2ID0gdXJiLT5jb250ZXh0OworCWNvbnN0IGludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LCAiIyMjIFVSQiBJUlE6IFsweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhdIGtleWJpdD0weCUwMnhcbiIsCisJICAgICBkZXYtPmlycV9kYXRhLT5ieXRlWzBdLAorCSAgICAgZGV2LT5pcnFfZGF0YS0+Ynl0ZVsxXSwKKwkgICAgIGRldi0+aXJxX2RhdGEtPmJ5dGVbMl0sCisJICAgICBkZXYtPmlycV9kYXRhLT5ieXRlWzNdLAorCSAgICAgZGV2LT5rZXliaXQpOworCisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IC1FU0hVVERPV04pCisJCQlyZXR1cm47CisJCWVycigiJXM6IHVyYiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwl9CisKKwkvKiBTcGVjaWFsIGtleXMgKi8KKwlpZiAoZGV2LT5pcnFfZGF0YS0+Ynl0ZVtISURfSVIwXSAmIDB4MGYpIHsKKwkJY29uc3QgaW50IGNvZGUgPSAoZGV2LT5pcnFfZGF0YS0+Ynl0ZVtISURfSVIwXSAmIDB4MGYpOworCQlyZXBvcnRfa2V5KGRldiwgZGV2LT5rZXltYXBbMHhmZiArIGNvZGVdKTsKKwl9CisKKwkvKiBTY2FuIGtleSBjb2x1bW4gKi8KKwlpZiAoZGV2LT5rZXliaXQgPT0gMHhmKSB7CisKKwkJLyogQW55IGNoYW5nZXMgPyAqLworCQlpZiAoKGRldi0+Z3BpICYgMHhmMCkgPT0gKGRldi0+aXJxX2RhdGEtPmJ5dGVbSElEX0lSMV0gJiAweGYwKSkKKwkJCWdvdG8gb3V0OworCisJCWRldi0+Z3BpID0gZGV2LT5pcnFfZGF0YS0+Ynl0ZVtISURfSVIxXSAmIDB4ZjA7CisJCWRldi0+a2V5Yml0ID0gMHgxOworCX0gZWxzZSB7CisJCXJlcG9ydF9rZXkoZGV2LCBkZXYtPmtleW1hcFtkZXYtPmlycV9kYXRhLT5ieXRlW0hJRF9JUjFdXSk7CisKKwkJZGV2LT5rZXliaXQgPDw9IDE7CisJCWlmIChkZXYtPmtleWJpdCA+IDB4OCkKKwkJCWRldi0+a2V5Yml0ID0gMHhmOworCX0KKworIG91dDoKKworCXNwaW5fbG9jaygmZGV2LT5jdGxfc3VibWl0X2xvY2spOworCisJZGV2LT5pcnFfdXJiX3BlbmRpbmcgPSAwOworCisJaWYgKGxpa2VseSghZGV2LT5zaHV0ZG93bikpIHsKKworCQlpZiAoZGV2LT5idXp6ZXJfc3RhdGUpCisJCQlkZXYtPmN0bF9kYXRhLT5ieXRlW0hJRF9PUjBdIHw9IEJVWlpFUl9PTjsKKwkJZWxzZQorCQkJZGV2LT5jdGxfZGF0YS0+Ynl0ZVtISURfT1IwXSAmPSB+QlVaWkVSX09OOworCisJCWRldi0+Y3RsX2RhdGEtPmJ5dGVbSElEX09SMV0gPSBkZXYtPmtleWJpdDsKKwkJZGV2LT5jdGxfZGF0YS0+Ynl0ZVtISURfT1IyXSA9IGRldi0+a2V5Yml0OworCisJCWRldi0+YnV6emVyX3BlbmRpbmcgPSAwOworCQlkZXYtPmN0bF91cmJfcGVuZGluZyA9IDE7CisKKwkJZXJyb3IgPSB1c2Jfc3VibWl0X3VyYihkZXYtPnVyYl9jdGwsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyb3IpCisJCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiAodXJiX2N0bCkgZmFpbGVkICVkIiwKKwkJCQlfX2Z1bmNfXywgZXJyb3IpOworCX0KKworCXNwaW5fdW5sb2NrKCZkZXYtPmN0bF9zdWJtaXRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNtMTA5X3VyYl9jdGxfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBjbTEwOV9kZXYgKmRldiA9IHVyYi0+Y29udGV4dDsKKwljb25zdCBpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJaW50IGVycm9yOworCisJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwgIiMjIyBVUkIgQ1RMOiBbMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XVxuIiwKKwkgICAgIGRldi0+Y3RsX2RhdGEtPmJ5dGVbMF0sCisJICAgICBkZXYtPmN0bF9kYXRhLT5ieXRlWzFdLAorCSAgICAgZGV2LT5jdGxfZGF0YS0+Ynl0ZVsyXSwKKwkgICAgIGRldi0+Y3RsX2RhdGEtPmJ5dGVbM10pOworCisJaWYgKHN0YXR1cykKKwkJZXJyKCIlczogdXJiIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJc3Bpbl9sb2NrKCZkZXYtPmN0bF9zdWJtaXRfbG9jayk7CisKKwlkZXYtPmN0bF91cmJfcGVuZGluZyA9IDA7CisKKwlpZiAobGlrZWx5KCFkZXYtPnNodXRkb3duKSkgeworCisJCWlmIChkZXYtPmJ1enplcl9wZW5kaW5nKSB7CisJCQlkZXYtPmJ1enplcl9wZW5kaW5nID0gMDsKKwkJCWRldi0+Y3RsX3VyYl9wZW5kaW5nID0gMTsKKwkJCWNtMTA5X3N1Ym1pdF9idXp6X3RvZ2dsZShkZXYpOworCQl9IGVsc2UgaWYgKGxpa2VseSghZGV2LT5pcnFfdXJiX3BlbmRpbmcpKSB7CisJCQkvKiBhc2sgZm9yIGtleSBkYXRhICovCisJCQlkZXYtPmlycV91cmJfcGVuZGluZyA9IDE7CisJCQllcnJvciA9IHVzYl9zdWJtaXRfdXJiKGRldi0+dXJiX2lycSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgKHVyYl9pcnEpIGZhaWxlZCAlZCIsCisJCQkJCV9fZnVuY19fLCBlcnJvcik7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmZGV2LT5jdGxfc3VibWl0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjbTEwOV90b2dnbGVfYnV6emVyX2FzeW5jKHN0cnVjdCBjbTEwOV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y3RsX3N1Ym1pdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5jdGxfdXJiX3BlbmRpbmcpIHsKKwkJLyogVVJCIGNvbXBsZXRpb24gd2lsbCByZXN1Ym1pdCAqLworCQlkZXYtPmJ1enplcl9wZW5kaW5nID0gMTsKKwl9IGVsc2UgeworCQlkZXYtPmN0bF91cmJfcGVuZGluZyA9IDE7CisJCWNtMTA5X3N1Ym1pdF9idXp6X3RvZ2dsZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y3RsX3N1Ym1pdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNtMTA5X3RvZ2dsZV9idXp6ZXJfc3luYyhzdHJ1Y3QgY20xMDlfZGV2ICpkZXYsIGludCBvbikKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAob24pCisJCWRldi0+Y3RsX2RhdGEtPmJ5dGVbSElEX09SMF0gfD0gQlVaWkVSX09OOworCWVsc2UKKwkJZGV2LT5jdGxfZGF0YS0+Ynl0ZVtISURfT1IwXSAmPSB+QlVaWkVSX09OOworCisJZXJyb3IgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LAorCQkJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQkJCWRldi0+Y3RsX3JlcS0+YlJlcXVlc3QsCisJCQkJZGV2LT5jdGxfcmVxLT5iUmVxdWVzdFR5cGUsCisJCQkJbGUxNl90b19jcHUoZGV2LT5jdGxfcmVxLT53VmFsdWUpLAorCQkJCWxlMTZfdG9fY3B1KGRldi0+Y3RsX3JlcS0+d0luZGV4KSwKKwkJCQlkZXYtPmN0bF9kYXRhLAorCQkJCVVTQl9QS1RfTEVOLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJaWYgKGVycm9yICYmIGVycm9yICE9IEVJTlRSKQorCQllcnIoIiVzOiB1c2JfY29udHJvbF9tc2coKSBmYWlsZWQgJWQiLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBjbTEwOV9zdG9wX3RyYWZmaWMoc3RydWN0IGNtMTA5X2RldiAqZGV2KQoreworCWRldi0+c2h1dGRvd24gPSAxOworCS8qCisJICogTWFrZSBzdXJlIG90aGVyIENQVXMgc2VlIHRoaXMKKwkgKi8KKwlzbXBfd21iKCk7CisKKwl1c2Jfa2lsbF91cmIoZGV2LT51cmJfY3RsKTsKKwl1c2Jfa2lsbF91cmIoZGV2LT51cmJfaXJxKTsKKworCWNtMTA5X3RvZ2dsZV9idXp6ZXJfc3luYyhkZXYsIDApOworCisJZGV2LT5zaHV0ZG93biA9IDA7CisJc21wX3dtYigpOworfQorCitzdGF0aWMgdm9pZCBjbTEwOV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBjbTEwOV9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5vcGVuKSB7CisJCS8qCisJCSAqIFJlc3RvcmUgYnV6emVyIHN0YXRlLgorCQkgKiBUaGlzIHdpbGwgYWxzbyBraWNrIHJlZ3VsYXIgVVJCIHN1Ym1pc3Npb24KKwkJICovCisJCWNtMTA5X3RvZ2dsZV9idXp6ZXJfYXN5bmMoZGV2KTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlucHV0IGV2ZW50IGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGNtMTA5X2lucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgY20xMDlfZGV2ICpkZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShkZXYtPmludGYpOworCWlmIChlcnJvciA8IDApIHsKKwkJZXJyKCIlcyAtIGNhbm5vdCBhdXRvcmVzdW1lLCByZXN1bHQgJWQiLAorCQkgICAgX19mdW5jX18sIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmRldi0+cG1fbXV0ZXgpOworCisJZGV2LT5idXp6ZXJfc3RhdGUgPSAwOworCWRldi0+a2V5X2NvZGUgPSAtMTsJLyogbm8ga2V5cyBwcmVzc2VkICovCisJZGV2LT5rZXliaXQgPSAweGY7CisKKwkvKiBpc3N1ZSBJTklUICovCisJZGV2LT5jdGxfZGF0YS0+Ynl0ZVtISURfT1IwXSA9IEhJRF9PUl9HUE9fQlVaX1NQRElGOworCWRldi0+Y3RsX2RhdGEtPmJ5dGVbSElEX09SMV0gPSBkZXYtPmtleWJpdDsKKwlkZXYtPmN0bF9kYXRhLT5ieXRlW0hJRF9PUjJdID0gZGV2LT5rZXliaXQ7CisJZGV2LT5jdGxfZGF0YS0+Ynl0ZVtISURfT1IzXSA9IDB4MDA7CisKKwllcnJvciA9IHVzYl9zdWJtaXRfdXJiKGRldi0+dXJiX2N0bCwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycm9yKQorCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiAodXJiX2N0bCkgZmFpbGVkICVkIiwgX19mdW5jX18sIGVycm9yKTsKKwllbHNlCisJCWRldi0+b3BlbiA9IDE7CisKKwltdXRleF91bmxvY2soJmRldi0+cG1fbXV0ZXgpOworCisJaWYgKGVycm9yKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGV2LT5pbnRmKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgY20xMDlfaW5wdXRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgY20xMDlfZGV2ICpkZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKworCW11dGV4X2xvY2soJmRldi0+cG1fbXV0ZXgpOworCisJLyoKKwkgKiBPbmNlIHdlIGFyZSBoZXJlIGV2ZW50IGRlbGl2ZXJ5IGlzIHN0b3BwZWQgc28gd2UKKwkgKiBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHNvbWVvbmUgc3RhcnRpbmcgYnV6emVyCisJICogYWdhaW4KKwkgKi8KKwljbTEwOV9zdG9wX3RyYWZmaWMoZGV2KTsKKwlkZXYtPm9wZW4gPSAwOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnBtX211dGV4KTsKKworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShkZXYtPmludGYpOworfQorCitzdGF0aWMgaW50IGNtMTA5X2lucHV0X2V2KHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJICB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBjbTEwOV9kZXYgKmRldiA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCisJZGV2X2RiZygmZGV2LT51ZGV2LT5kZXYsCisJCSJpbnB1dF9ldjogdHlwZT0ldSBjb2RlPSV1IHZhbHVlPSVkXG4iLCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisKKwlpZiAodHlwZSAhPSBFVl9TTkQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBTTkRfVE9ORToKKwljYXNlIFNORF9CRUxMOgorCQlkZXYtPmJ1enplcl9zdGF0ZSA9ICEhdmFsdWU7CisJCWlmICghZGV2LT5yZXNldHRpbmcpCisJCQljbTEwOV90b2dnbGVfYnV6emVyX2FzeW5jKGRldik7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbnV4IGludGVyZmFjZSBhbmQgdXNiIGluaXRpYWxpc2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBkcml2ZXJfaW5mbyB7CisJY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gaW5mb19jbTEwOSA9IHsKKwkubmFtZSA9ICJDTTEwOSBVU0IgZHJpdmVyIiwKK307CisKK2VudW0geworCVZFTkRPUl9JRCAgICAgICAgPSAweDBkOGMsIC8qIEMtTWVkaWEgRWxlY3Ryb25pY3MgKi8KKwlQUk9EVUNUX0lEX0NNMTA5ID0gMHgwMDBlLCAvKiBDTTEwOSBkZWZpbmVzIHJhbmdlIDB4MDAwOCAtIDB4MDAwZiAqLworfTsKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGNtMTA5X3VzYl90YWJsZVtdID0geworCXsKKwkJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfAorCQkJCVVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCisJCS5pZFZlbmRvciA9IFZFTkRPUl9JRCwKKwkJLmlkUHJvZHVjdCA9IFBST0RVQ1RfSURfQ00xMDksCisJCS5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfSElELAorCQkuYkludGVyZmFjZVN1YkNsYXNzID0gMCwKKwkJLmJJbnRlcmZhY2VQcm90b2NvbCA9IDAsCisJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkgJmluZm9fY20xMDkKKwl9LAorCS8qIHlvdSBjYW4gYWRkIG1vcmUgZGV2aWNlcyBoZXJlIHdpdGggcHJvZHVjdCBJRCAweDAwMDggLSAweDAwMGYgKi8KKwl7IH0KK307CisKK3N0YXRpYyB2b2lkIGNtMTA5X3VzYl9jbGVhbnVwKHN0cnVjdCBjbTEwOV9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5jdGxfcmVxKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBzaXplb2YoKihkZXYtPmN0bF9yZXEpKSwKKwkJCQlkZXYtPmN0bF9yZXEsIGRldi0+Y3RsX3JlcV9kbWEpOworCWlmIChkZXYtPmN0bF9kYXRhKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQlkZXYtPmN0bF9kYXRhLCBkZXYtPmN0bF9kbWEpOworCWlmIChkZXYtPmlycV9kYXRhKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQlkZXYtPmlycV9kYXRhLCBkZXYtPmlycV9kbWEpOworCisJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2lycSk7CS8qIHBhcmFtZXRlciB2YWxpZGF0aW9uIGluIGNvcmUvdXJiICovCisJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2N0bCk7CS8qIHBhcmFtZXRlciB2YWxpZGF0aW9uIGluIGNvcmUvdXJiICovCisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgY20xMDlfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgY20xMDlfZGV2ICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pZGV2KTsKKwljbTEwOV91c2JfY2xlYW51cChkZXYpOworfQorCitzdGF0aWMgaW50IGNtMTA5X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGRyaXZlcl9pbmZvICpuZm8gPSAoc3RydWN0IGRyaXZlcl9pbmZvICopaWQtPmRyaXZlcl9pbmZvOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCBjbTEwOV9kZXYgKmRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBOVUxMOworCWludCByZXQsIHBpcGUsIGk7CisJaW50IGVycm9yID0gLUVOT01FTTsKKworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPmN0bF9zdWJtaXRfbG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT5wbV9tdXRleCk7CisKKwlkZXYtPnVkZXYgPSB1ZGV2OworCWRldi0+aW50ZiA9IGludGY7CisKKwlkZXYtPmlkZXYgPSBpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikKKwkJZ290byBlcnJfb3V0OworCisJLyogYWxsb2NhdGUgdXNiIGJ1ZmZlcnMgKi8KKwlkZXYtPmlycV9kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBVU0JfUEtUX0xFTiwKKwkJCQkJIEdGUF9LRVJORUwsICZkZXYtPmlycV9kbWEpOworCWlmICghZGV2LT5pcnFfZGF0YSkKKwkJZ290byBlcnJfb3V0OworCisJZGV2LT5jdGxfZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVVNCX1BLVF9MRU4sCisJCQkJCSBHRlBfS0VSTkVMLCAmZGV2LT5jdGxfZG1hKTsKKwlpZiAoIWRldi0+Y3RsX2RhdGEpCisJCWdvdG8gZXJyX291dDsKKworCWRldi0+Y3RsX3JlcSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgc2l6ZW9mKCooZGV2LT5jdGxfcmVxKSksCisJCQkJCUdGUF9LRVJORUwsICZkZXYtPmN0bF9yZXFfZG1hKTsKKwlpZiAoIWRldi0+Y3RsX3JlcSkKKwkJZ290byBlcnJfb3V0OworCisJLyogYWxsb2NhdGUgdXJiIHN0cnVjdHVyZXMgKi8KKwlkZXYtPnVyYl9pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT51cmJfaXJxKQorCQlnb3RvIGVycl9vdXQ7CisKKwlkZXYtPnVyYl9jdGwgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT51cmJfY3RsKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBnZXQgYSBoYW5kbGUgdG8gdGhlIGludGVycnVwdCBkYXRhIHBpcGUgKi8KKwlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCXJldCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChyZXQgIT0gVVNCX1BLVF9MRU4pCisJCWVycigiaW52YWxpZCBwYXlsb2FkIHNpemUgJWQsIGV4cGVjdGVkICVkIiwgcmV0LCBVU0JfUEtUX0xFTik7CisKKwkvKiBpbml0aWFsaXNlIGlycSB1cmIgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKGRldi0+dXJiX2lycSwgdWRldiwgcGlwZSwgZGV2LT5pcnFfZGF0YSwKKwkJCSBVU0JfUEtUX0xFTiwKKwkJCSBjbTEwOV91cmJfaXJxX2NhbGxiYWNrLCBkZXYsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworCWRldi0+dXJiX2lycS0+dHJhbnNmZXJfZG1hID0gZGV2LT5pcnFfZG1hOworCWRldi0+dXJiX2lycS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJZGV2LT51cmJfaXJxLT5kZXYgPSB1ZGV2OworCisJLyogaW5pdGlhbGlzZSBjdGwgdXJiICovCisJZGV2LT5jdGxfcmVxLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfAorCQkJCQlVU0JfRElSX09VVDsKKwlkZXYtPmN0bF9yZXEtPmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjsKKwlkZXYtPmN0bF9yZXEtPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MjAwKTsKKwlkZXYtPmN0bF9yZXEtPndJbmRleCA9IGNwdV90b19sZTE2KGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKwlkZXYtPmN0bF9yZXEtPndMZW5ndGggPSBjcHVfdG9fbGUxNihVU0JfUEtUX0xFTik7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYihkZXYtPnVyYl9jdGwsIHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgKHZvaWQgKilkZXYtPmN0bF9yZXEsIGRldi0+Y3RsX2RhdGEsIFVTQl9QS1RfTEVOLAorCQkJICAgICBjbTEwOV91cmJfY3RsX2NhbGxiYWNrLCBkZXYpOworCWRldi0+dXJiX2N0bC0+c2V0dXBfZG1hID0gZGV2LT5jdGxfcmVxX2RtYTsKKwlkZXYtPnVyYl9jdGwtPnRyYW5zZmVyX2RtYSA9IGRldi0+Y3RsX2RtYTsKKwlkZXYtPnVyYl9jdGwtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19TRVRVUF9ETUFfTUFQIHwKKwkJCQkJVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJZGV2LT51cmJfY3RsLT5kZXYgPSB1ZGV2OworCisJLyogZmluZCBvdXQgdGhlIHBoeXNpY2FsIGJ1cyBsb2NhdGlvbiAqLworCXVzYl9tYWtlX3BhdGgodWRldiwgZGV2LT5waHlzLCBzaXplb2YoZGV2LT5waHlzKSk7CisJc3RybGNhdChkZXYtPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGRldi0+cGh5cykpOworCisJLyogcmVnaXN0ZXIgc2V0dGluZ3MgZm9yIHRoZSBpbnB1dCBkZXZpY2UgKi8KKwlpbnB1dF9kZXYtPm5hbWUgPSBuZm8tPm5hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gZGV2LT5waHlzOworCXVzYl90b19pbnB1dF9pZCh1ZGV2LCAmaW5wdXRfZGV2LT5pZCk7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmludGYtPmRldjsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgZGV2KTsKKwlpbnB1dF9kZXYtPm9wZW4gPSBjbTEwOV9pbnB1dF9vcGVuOworCWlucHV0X2Rldi0+Y2xvc2UgPSBjbTEwOV9pbnB1dF9jbG9zZTsKKwlpbnB1dF9kZXYtPmV2ZW50ID0gY20xMDlfaW5wdXRfZXY7CisKKwlpbnB1dF9kZXYtPmtleWNvZGUgPSBkZXYtPmtleW1hcDsKKwlpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoZGV2LT5rZXltYXApOworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9TTkQpOworCWlucHV0X2Rldi0+c25kYml0WzBdID0gQklUX01BU0soU05EX0JFTEwpIHwgQklUX01BU0soU05EX1RPTkUpOworCisJLyogcmVnaXN0ZXIgYXZhaWxhYmxlIGtleSBldmVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgS0VZTUFQX1NJWkU7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCBrID0ga2V5bWFwKGkpOworCQlkZXYtPmtleW1hcFtpXSA9IGs7CisJCV9fc2V0X2JpdChrLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJfQorCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX291dDsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKworCXJldHVybiAwOworCisgZXJyX291dDoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWNtMTA5X3VzYl9jbGVhbnVwKGRldik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGNtMTA5X3VzYl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgY20xMDlfZGV2ICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJZGV2X2luZm8oJmludGYtPmRldiwgImNtMTA5OiB1c2Jfc3VzcGVuZCAoZXZlbnQ9JWQpXG4iLCBtZXNzYWdlLmV2ZW50KTsKKworCW11dGV4X2xvY2soJmRldi0+cG1fbXV0ZXgpOworCWNtMTA5X3N0b3BfdHJhZmZpYyhkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5wbV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbTEwOV91c2JfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBjbTEwOV9kZXYgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiY20xMDk6IHVzYl9yZXN1bWVcbiIpOworCisJbXV0ZXhfbG9jaygmZGV2LT5wbV9tdXRleCk7CisJY20xMDlfcmVzdG9yZV9zdGF0ZShkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5wbV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbTEwOV91c2JfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBjbTEwOV9kZXYgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwltdXRleF9sb2NrKCZkZXYtPnBtX211dGV4KTsKKworCS8qCisJICogTWFrZSBzdXJlIGlucHV0IGV2ZW50cyBkb24ndCB0cnkgdG8gdG9nZ2xlIGJ1enplcgorCSAqIHdoaWxlIHdlIGFyZSByZXNldHRpbmcKKwkgKi8KKwlkZXYtPnJlc2V0dGluZyA9IDE7CisJc21wX3dtYigpOworCisJY20xMDlfc3RvcF90cmFmZmljKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbTEwOV91c2JfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgY20xMDlfZGV2ICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJZGV2LT5yZXNldHRpbmcgPSAwOworCXNtcF93bWIoKTsKKworCWNtMTA5X3Jlc3RvcmVfc3RhdGUoZGV2KTsKKworCW11dGV4X3VubG9jaygmZGV2LT5wbV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNtMTA5X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY20xMDkiLAorCS5wcm9iZQkJPSBjbTEwOV91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBjbTEwOV91c2JfZGlzY29ubmVjdCwKKwkuc3VzcGVuZAk9IGNtMTA5X3VzYl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gY20xMDlfdXNiX3Jlc3VtZSwKKwkucmVzZXRfcmVzdW1lCT0gY20xMDlfdXNiX3Jlc3VtZSwKKwkucHJlX3Jlc2V0CT0gY20xMDlfdXNiX3ByZV9yZXNldCwKKwkucG9zdF9yZXNldAk9IGNtMTA5X3VzYl9wb3N0X3Jlc2V0LAorCS5pZF90YWJsZQk9IGNtMTA5X3VzYl90YWJsZSwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY20xMDlfc2VsZWN0X2tleW1hcCh2b2lkKQoreworCS8qIExvYWQgdGhlIHBob25lIGtleW1hcCAqLworCWlmICghc3RyY2FzZWNtcChwaG9uZSwgImtpcDEwMDAiKSkgeworCQlrZXltYXAgPSBrZXltYXBfa2lwMTAwMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiCisJCQkiS2V5bWFwIGZvciBLb211bmlrYXRlIEtJUDEwMDAgcGhvbmUgbG9hZGVkXG4iKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKHBob25lLCAiZ3RhbGsiKSkgeworCQlrZXltYXAgPSBrZXltYXBfZ3RhbGs7CisJCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIgorCQkJIktleW1hcCBmb3IgR2VuaXVzIEctdGFsayBwaG9uZSBsb2FkZWRcbiIpOworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAocGhvbmUsICJ1c2JwaDAxIikpIHsKKwkJa2V5bWFwID0ga2V5bWFwX3VzYnBoMDE7CisJCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIgorCQkJIktleW1hcCBmb3IgQWxsaWVkLVRlbGVzaXMgQ29yZWdhIFVTQlBIMDEgcGhvbmUgbG9hZGVkXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogIgorCQkJIlVuc3VwcG9ydGVkIHBob25lOiAlc1xuIiwgcGhvbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY20xMDlfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBjbTEwOV9zZWxlY3Rfa2V5bWFwKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHVzYl9yZWdpc3RlcigmY20xMDlfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiCisJCURSSVZFUl9ERVNDICI6ICIgRFJJVkVSX1ZFUlNJT04gIiAoQykgIiBEUklWRVJfQVVUSE9SICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbTEwOV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmNtMTA5X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNtMTA5X2luaXQpOworbW9kdWxlX2V4aXQoY20xMDlfZXhpdCk7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBjbTEwOV91c2JfdGFibGUpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCmluZGV4IGRhYTlkNDIuLjgyZWM2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwpAQCAtNDU4LDM1ICs0NTgsMzUgQEAKIAkJcCArPSBzcHJpbnRmKHAsICJpODA0MiBydGNcdDogUkVBRCBGQUlMRUQhXG4iKTsKIAl9IGVsc2UgewogCQlwICs9IHNwcmludGYocCwgImk4MDQyIHJ0Y1x0OiAlbGQuJTAyZCBzZWNvbmRzXG4iLCAKLQkJCSAgICAgdHYudHZfc2VjLCB0di50dl91c2VjLzEwMDApOworCQkJICAgICB0di50dl9zZWMsIChpbnQpdHYudHZfdXNlYy8xMDAwKTsKIAl9CiAKIAlpZiAoaHBfc2RjX3J0Y19yZWFkX2ZocygmdHYpKSB7CiAJCXAgKz0gc3ByaW50ZihwLCAiaGFuZHNoYWtlXHQ6IFJFQUQgRkFJTEVEIVxuIik7CiAJfSBlbHNlIHsKICAgICAgICAgCXAgKz0gc3ByaW50ZihwLCAiaGFuZHNoYWtlXHQ6ICVsZC4lMDJkIHNlY29uZHNcbiIsIAotCQkJICAgICB0di50dl9zZWMsIHR2LnR2X3VzZWMvMTAwMCk7CisJCQkgICAgIHR2LnR2X3NlYywgKGludCl0di50dl91c2VjLzEwMDApOwogCX0KIAogCWlmIChocF9zZGNfcnRjX3JlYWRfbXQoJnR2KSkgewogCQlwICs9IHNwcmludGYocCwgImFsYXJtXHRcdDogUkVBRCBGQUlMRUQhXG4iKTsKIAl9IGVsc2UgewogCQlwICs9IHNwcmludGYocCwgImFsYXJtXHRcdDogJWxkLiUwMmQgc2Vjb25kc1xuIiwgCi0JCQkgICAgIHR2LnR2X3NlYywgdHYudHZfdXNlYy8xMDAwKTsKKwkJCSAgICAgdHYudHZfc2VjLCAoaW50KXR2LnR2X3VzZWMvMTAwMCk7CiAJfQogCiAJaWYgKGhwX3NkY19ydGNfcmVhZF9kdCgmdHYpKSB7CiAJCXAgKz0gc3ByaW50ZihwLCAiZGVsYXlcdFx0OiBSRUFEIEZBSUxFRCFcbiIpOwogCX0gZWxzZSB7CiAJCXAgKz0gc3ByaW50ZihwLCAiZGVsYXlcdFx0OiAlbGQuJTAyZCBzZWNvbmRzXG4iLCAKLQkJCSAgICAgdHYudHZfc2VjLCB0di50dl91c2VjLzEwMDApOworCQkJICAgICB0di50dl9zZWMsIChpbnQpdHYudHZfdXNlYy8xMDAwKTsKIAl9CiAKIAlpZiAoaHBfc2RjX3J0Y19yZWFkX2N0KCZ0dikpIHsKIAkJcCArPSBzcHJpbnRmKHAsICJwZXJpb2RpY1x0OiBSRUFEIEZBSUxFRCFcbiIpOwogCX0gZWxzZSB7CiAJCXAgKz0gc3ByaW50ZihwLCAicGVyaW9kaWNcdDogJWxkLiUwMmQgc2Vjb25kc1xuIiwgCi0JCQkgICAgIHR2LnR2X3NlYywgdHYudHZfdXNlYy8xMDAwKTsKKwkJCSAgICAgdHYudHZfc2VjLCAoaW50KXR2LnR2X3VzZWMvMTAwMCk7CiAJfQogCiAgICAgICAgIHAgKz0gc3ByaW50ZihwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL21hcF90b183c2VnbWVudC5oIGIvZHJpdmVycy9pbnB1dC9taXNjL21hcF90b183c2VnbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI0MDk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9tYXBfdG9fN3NlZ21lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKgotICogZHJpdmVycy91c2IvaW5wdXQvbWFwX3RvXzdzZWdtZW50LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGVuayBWZXJnb25ldCA8SGVuay5WZXJnb25ldEBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaWZuZGVmIE1BUF9UT183U0VHTUVOVF9ICi0jZGVmaW5lIE1BUF9UT183U0VHTUVOVF9ICi0KLS8qIFRoaXMgZmlsZSBwcm92aWRlcyB0cmFuc2xhdGlvbiBwcmltaXRpdmVzIGFuZCB0YWJsZXMgZm9yIHRoZSBjb252ZXJzaW9uCi0gKiBvZiAoQVNDSUkpIGNoYXJhY3RlcnMgdG8gYSA3LXNlZ21lbnRzIG5vdGF0aW9uLgotICoKLSAqIFRoZSA3IHNlZ21lbnQncyB3aWtpcGVkaWEgbm90YXRpb24gYmVsb3cgaXMgdXNlZCBhcyBzdGFuZGFyZC4KLSAqIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TZXZlbl9zZWdtZW50X2Rpc3BsYXkKLSAqCi0gKiBOb3RhdGlvbjoJKy1hLSsKLSAqCQlmICAgYgotICoJCSstZy0rCi0gKgkJZSAgIGMKLSAqCQkrLWQtKwotICoKLSAqIFVzYWdlOgotICoKLSAqICAgUmVnaXN0ZXIgYSBtYXAgdmFyaWFibGUsIGFuZCBmaWxsIGl0IHdpdGggYSBjaGFyYWN0ZXIgc2V0OgotICogCXN0YXRpYyBTRUc3X0RFRkFVTFRfTUFQKG1hcF9zZWc3KTsKLSAqCi0gKgotICogICBUaGVuIHVzZSBmb3IgY29udmVyc2lvbjoKLSAqCXNlZzcgPSBtYXBfdG9fc2VnNygmbWFwX3NlZzcsIHNvbWVfY2hhcik7Ci0gKgkuLi4KLSAqCi0gKiBJbiBkZXZpY2UgZHJpdmVycyBpdCBpcyByZWNvbW1lbmRlZCwgaWYgcmVxdWlyZWQsIHRvIG1ha2UgdGhlIGNoYXIgbWFwCi0gKiBhY2Nlc3NpYmxlIHZpYSB0aGUgc3lzZnMgaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgotICoKLSAqIHN0YXRpYyBzc2l6ZV90IHNob3dfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7Ci0gKgltZW1jcHkoYnVmLCAmbWFwX3NlZzcsIHNpemVvZihtYXBfc2VnNykpOwotICoJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7Ci0gKiB9Ci0gKiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjbnQpIHsKLSAqCWlmKGNudCAhPSBzaXplb2YobWFwX3NlZzcpKQotICoJCXJldHVybiAtRUlOVkFMOwotICoJbWVtY3B5KCZtYXBfc2VnNywgYnVmLCBjbnQpOwotICoJcmV0dXJuIGNudDsKLSAqIH0KLSAqIHN0YXRpYyBERVZJQ0VfQVRUUihtYXBfc2VnNywgUEVSTVNfUlcsIHNob3dfbWFwLCBzdG9yZV9tYXApOwotICoKLSAqIEhpc3Rvcnk6Ci0gKiAyMDA1LTA1LTMxCVJGQyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotCi0KLSNkZWZpbmUgQklUX1NFRzdfQQkJMAotI2RlZmluZSBCSVRfU0VHN19CCQkxCi0jZGVmaW5lIEJJVF9TRUc3X0MJCTIKLSNkZWZpbmUgQklUX1NFRzdfRAkJMwotI2RlZmluZSBCSVRfU0VHN19FCQk0Ci0jZGVmaW5lIEJJVF9TRUc3X0YJCTUKLSNkZWZpbmUgQklUX1NFRzdfRwkJNgotI2RlZmluZSBCSVRfU0VHN19SRVNFUlZFRAk3Ci0KLXN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwIHsKLQl1bnNpZ25lZCBjaGFyCXRhYmxlWzEyOF07Ci19OwotCi1zdGF0aWMgaW5saW5lIGludCBtYXBfdG9fc2VnNyhzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCAqbWFwLCBpbnQgYykKLXsKLQlyZXR1cm4gYyA+PSAwICYmIGMgPCBzaXplb2YobWFwLT50YWJsZSkgPyBtYXAtPnRhYmxlW2NdIDogLUVJTlZBTDsKLX0KLQotI2RlZmluZSBTRUc3X0NPTlZFUlNJT05fTUFQKF9uYW1lLCBfbWFwKQlcCi0Jc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgX25hbWUgPSB7IC50YWJsZSA9IHsgX21hcCB9IH0KLQotLyoKLSAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhIGZhY2lsaXR5IHRoYXQgYWxsb3dzIHVzZXIgc3BhY2UgdG8gcmVkZWZpbmUKLSAqIGN1c3RvbSBjaGFyYWN0ZXIgc2V0cyBmb3IgTENEIGRldmljZXMuIFBsZWFzZSB1c2UgYSBzeXNmcyBpbnRlcmZhY2UKLSAqIGFzIGRlc2NyaWJlZCBhYm92ZS4KLSAqLwotI2RlZmluZSBNQVBfVE9fU0VHN19TWVNGU19GSUxFCSJtYXBfc2VnNyIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX1NFRzcobCxhLGIsYyxkLGUsZixnKQlcCi0gICAgICAoCWE8PEJJVF9TRUc3X0EgfAliPDxCSVRfU0VHN19CIHwJYzw8QklUX1NFRzdfQyB8CWQ8PEJJVF9TRUc3X0QgfAlcCi0JZTw8QklUX1NFRzdfRSB8CWY8PEJJVF9TRUc3X0YgfAlnPDxCSVRfU0VHN19HICkKLQotI2RlZmluZSBfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKLQkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLQotI2RlZmluZSBfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCi0gX1NFRzcoJyEnLDAsMCwwLDAsMSwxLDApLCBfU0VHNygnIicsMCwxLDAsMCwwLDEsMCksIF9TRUc3KCcjJywwLDEsMSwwLDEsMSwwKSxcCi0gX1NFRzcoJyQnLDEsMCwxLDEsMCwxLDEpLCBfU0VHNygnJScsMCwwLDEsMCwwLDEsMCksIF9TRUc3KCcmJywxLDAsMSwxLDEsMSwxKSxcCi0gX1NFRzcoJ1wnJywwLDAsMCwwLDAsMSwwKSxfU0VHNygnKCcsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCcpJywxLDEsMSwxLDAsMCwwKSxcCi0gX1NFRzcoJyonLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnKycsMCwxLDEsMCwwLDAsMSksIF9TRUc3KCcsJywwLDAsMCwwLDEsMCwwKSxcCi0gX1NFRzcoJy0nLDAsMCwwLDAsMCwwLDEpLCBfU0VHNygnLicsMCwwLDAsMCwxLDAsMCksIF9TRUc3KCcvJywwLDEsMCwwLDEsMCwxKSwKLQotI2RlZmluZSBfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAotIF9TRUc3KCcwJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJzEnLDAsMSwxLDAsMCwwLDApLCBfU0VHNygnMicsMSwxLDAsMSwxLDAsMSksXAotIF9TRUc3KCczJywxLDEsMSwxLDAsMCwxKSwgX1NFRzcoJzQnLDAsMSwxLDAsMCwxLDEpLCBfU0VHNygnNScsMSwwLDEsMSwwLDEsMSksXAotIF9TRUc3KCc2JywxLDAsMSwxLDEsMSwxKSwgX1NFRzcoJzcnLDEsMSwxLDAsMCwwLDApLCBfU0VHNygnOCcsMSwxLDEsMSwxLDEsMSksXAotIF9TRUc3KCc5JywxLDEsMSwxLDAsMSwxKSwKLQotI2RlZmluZSBfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCi0gX1NFRzcoJzonLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnOycsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc8JywxLDAsMCwwLDAsMSwxKSxcCi0gX1NFRzcoJz0nLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnPicsMSwxLDAsMCwwLDAsMSksIF9TRUc3KCc/JywxLDEsMSwwLDAsMSwwKSxcCi0gX1NFRzcoJ0AnLDEsMSwwLDEsMSwxLDEpLAotCi0jZGVmaW5lIF9NQVBfNjVfOTBfQVNDSUlfU0VHN19BTFBIQV9VUFBSCVwKLSBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdCJywxLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ0MnLDEsMCwwLDEsMSwxLDApLFwKLSBfU0VHNygnRCcsMSwxLDEsMSwxLDEsMCksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKLSBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdIJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0knLDAsMSwxLDAsMCwwLDApLFwKLSBfU0VHNygnSicsMCwxLDEsMSwwLDAsMCksIF9TRUc3KCdLJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKLSBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCdOJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ08nLDEsMSwxLDEsMSwxLDApLFwKLSBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdRJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ1InLDEsMSwxLDAsMSwxLDEpLFwKLSBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ1UnLDAsMSwxLDEsMSwxLDApLFwKLSBfU0VHNygnVicsMCwxLDEsMSwxLDEsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKLSBfU0VHNygnWScsMCwxLDEsMCwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKLQotI2RlZmluZSBfTUFQXzkxXzk2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCi0gX1NFRzcoJ1snLDEsMCwwLDEsMSwxLDApLCBfU0VHNygnXFwnLDAsMCwxLDAsMCwxLDEpLF9TRUc3KCddJywxLDEsMSwxLDAsMCwwKSxcCi0gX1NFRzcoJ14nLDEsMSwwLDAsMCwxLDApLCBfU0VHNygnXycsMCwwLDAsMSwwLDAsMCksIF9TRUc3KCdgJywwLDEsMCwwLDAsMCwwKSwKLQotI2RlZmluZSBfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKLSBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdiJywwLDAsMSwxLDEsMSwxKSwgX1NFRzcoJ2MnLDAsMCwwLDEsMSwwLDEpLFwKLSBfU0VHNygnZCcsMCwxLDEsMSwxLDAsMSksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKLSBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdoJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ2knLDAsMCwxLDAsMCwwLDApLFwKLSBfU0VHNygnaicsMCwwLDEsMSwwLDAsMCksIF9TRUc3KCdrJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKLSBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCduJywwLDAsMSwwLDEsMCwxKSwgX1NFRzcoJ28nLDAsMCwxLDEsMSwwLDEpLFwKLSBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdxJywxLDEsMSwwLDAsMSwxKSwgX1NFRzcoJ3InLDAsMCwwLDAsMSwwLDEpLFwKLSBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ3UnLDAsMCwxLDEsMSwwLDApLFwKLSBfU0VHNygndicsMCwwLDEsMSwxLDAsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKLSBfU0VHNygneScsMCwxLDEsMSwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKLQotI2RlZmluZSBfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wJCVwKLSBfU0VHNygneycsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCd8JywwLDAsMCwwLDEsMSwwKSwgX1NFRzcoJ30nLDEsMSwxLDEsMCwwLDApLFwKLSBfU0VHNygnficsMSwwLDAsMCwwLDAsMCksCi0KLS8qIE1hcHMgKi8KLQotLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSB2aXNpYmxlIGNoYXJhY3RlcmlzdGljcwotICogb2YgdGhlIEFTQ0lJIHN5bWJvbCwgbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UgbGV0dGVycyBtYXkgZGlmZmVyIGluCi0gKiBwcmVzZW50YXRpb24gb24gdGhlIGRpc3BsYXkuCi0gKi8KLSNkZWZpbmUgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTQkJCVwKLQlfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKLQlfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCi0JX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKLQlfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCi0JX01BUF82NV85MF9BU0NJSV9TRUc3X0FMUEhBX1VQUFIJXAotCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKLQlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKLQlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKLQotLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBzeW1ib2xpYyBjaGFyYWN0ZXJpc3RpY3MKLSAqIG9mIHRoZSBBU0NJSSBjaGFyYWN0ZXIgZm9yIG1heGltdW0gZGlzY3JpbWluYXRpb24uCi0gKiBGb3Igbm93IHRoaXMgbWVhbnMgYWxsIGFscGhhIGNoYXJzIGFyZSBpbiBsb3dlciBjYXNlIHJlcHJlc2VudGF0aW9ucy4KLSAqIChUaGlzIGZvciBleGFtcGxlIGZhY2lsaXRhdGVzIHRoZSB1c2Ugb2YgaGV4IG51bWJlcnMgd2l0aCB1cHBlcmNhc2UgaW5wdXQuKQotICovCi0jZGVmaW5lIE1BUF9BU0NJSTdTRUdfQUxQSEFOVU1fTEMJCQlcCi0JX01BUF8wXzMyX0FTQ0lJX1NFRzdfTk9OX1BSSU5UQUJMRQlcCi0JX01BUF8zM180N19BU0NJSV9TRUc3X1NZTUJPTAkJXAotCV9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCi0JX01BUF81OF82NF9BU0NJSV9TRUc3X1NZTUJPTAkJXAotCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAotCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKLQlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKLQlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKLQotI2RlZmluZSBTRUc3X0RFRkFVTFRfTUFQKF9uYW1lKQkJXAotCVNFRzdfQ09OVkVSU0lPTl9NQVAoX25hbWUsTUFQX0FTQ0lJN1NFR19BTFBIQU5VTSkKLQotI2VuZGlmCS8qIE1BUF9UT183U0VHTUVOVF9IICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYwppbmRleCBkODc2NWNjLi5jNGY0MjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3NwYXJjc3Brci5jCkBAIC0yNDksNyArMjQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYmJjX2JlZXBfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJiY19iZWVwX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJiZWVwIiwKIAkJLmNvbXBhdGlibGUgPSAiU1VOVyxiYmMtYmVlcCIsCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3JvdmVyX2JlZXBfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdyb3Zlcl9iZWVwX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJiZWVwIiwKIAkJLmNvbXBhdGlibGUgPSAiU1VOVyxzbWJ1cy1iZWVwIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwppbmRleCBmZTI2OGJlLi43Yzg5NTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvd2lzdHJvbl9idG5zLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCkBAIC0yNzcsNiArMjc3LDE2IEBACiAJeyBLRV9FTkQsICAwIH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5IGtleW1hcF9mc19hbWlsb19wcm9fdjM1MDVbXSBfX2luaXRkYXRhID0geworCXsgS0VfS0VZLCAgICAgICAweDAxLCB7S0VZX0hFTFB9IH0sICAgICAgICAgIC8qIEZuK0YxICovCisJeyBLRV9LRVksICAgICAgIDB4MDYsIHtLRVlfRElTUExBWVRPR0dMRX0gfSwgLyogRm4rRjQgKi8KKwl7IEtFX0JMVUVUT09USCwgMHgzMCB9LCAgICAgICAgICAgICAgICAgICAgICAvKiBGbitGMTAgKi8KKwl7IEtFX0tFWSwgICAgICAgMHgzMSwge0tFWV9NQUlMfSB9LCAgICAgICAgICAvKiBtYWlsIGJ1dHRvbiAqLworCXsgS0VfS0VZLCAgICAgICAweDM2LCB7S0VZX1dXV30gfSwgICAgICAgICAgIC8qIHd3dyBidXR0b24gKi8KKwl7IEtFX1dJRkksICAgICAgMHg3OCB9LCAgICAgICAgICAgICAgICAgICAgICAvKiBzYXRlbGl0ZSBkaXNoIGJ1dHRvbiAqLworCXsgS0VfRU5ELCAgICAgICAwIH0KK307CisKIHN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5IGtleW1hcF9mdWppdHN1X24zNTEwW10gX19pbml0ZGF0YSA9IHsKIAl7IEtFX0tFWSwgMHgxMSwge0tFWV9QUk9HMX0gfSwKIAl7IEtFX0tFWSwgMHgxMiwge0tFWV9QUk9HMn0gfSwKQEAgLTYxOCw2ICs2MjgsMTUgQEAKIAl9LAogCXsKIAkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCisJCS5pZGVudCA9ICJGdWppdHN1LVNpZW1lbnMgQW1pbG8gUHJvIEVkaXRpb24gVjM1MDUiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBQcm8gRWRpdGlvbiBWMzUwNSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSBrZXltYXBfZnNfYW1pbG9fcHJvX3YzNTA1CisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAogCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIE03NDAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy95ZWFsaW5rLmMgYi9kcml2ZXJzL2lucHV0L21pc2MveWVhbGluay5jCmluZGV4IGZhY2VmZDMuLjExYjVjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy95ZWFsaW5rLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3llYWxpbmsuYwpAQCAtNTIsOCArNTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFwX3RvXzdzZWdtZW50Lmg+CiAKLSNpbmNsdWRlICJtYXBfdG9fN3NlZ21lbnQuaCIKICNpbmNsdWRlICJ5ZWFsaW5rLmgiCiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInlsZC0yMDA1MTIzMCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZwppbmRleCBmOTk2NTQ2Li5mNDg4YjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnCkBAIC05Niw2ICs5NiwxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTU9VU0VfUFMyX09MUEMKKwlib29sICJPTFBDIFBTLzIgbW91c2UgcHJvdG9jb2wgZXh0ZW5zaW9uIgorCWRlcGVuZHMgb24gTU9VU0VfUFMyICYmIE9MUEMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIE9MUEMgWE8tMSBsYXB0b3AgKHdpdGggYnVpbHQtaW4KKwkgIFBTLzIgdG91Y2hwYWQvdGFibGV0IGRldmljZSkuICBUaGUgbWFudWZhY3R1cmVyIGNhbGxzIHRoZQorCSAgdG91Y2hwYWQgYW4gSEdQSy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE1PVVNFX1NFUklBTAogCXRyaXN0YXRlICJTZXJpYWwgbW91c2UiCiAJc2VsZWN0IFNFUklPCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQppbmRleCBkNGQyMDI1Li44ZTZlNjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKIHBzbW91c2Utb2JqcyA6PSBwc21vdXNlLWJhc2UubyBzeW5hcHRpY3MubwogCiBwc21vdXNlLSQoQ09ORklHX01PVVNFX1BTMl9BTFBTKQkrPSBhbHBzLm8KK3BzbW91c2UtJChDT05GSUdfTU9VU0VfUFMyX09MUEMpCSs9IGhncGsubwogcHNtb3VzZS0kKENPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQKQkrPSBsb2dpcHMycHAubwogcHNtb3VzZS0kKENPTkZJR19NT1VTRV9QUzJfTElGRUJPT0spCSs9IGxpZmVib29rLm8KIHBzbW91c2UtJChDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQpCSs9IHRyYWNrcG9pbnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCAzODVlMzJiLi5jYmVkZjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtNTQsNiArNTQsNyBAQAogCXsgeyAweDIwLCAweDAyLCAweDBlIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sIC8qIFhYWCAqLwogCXsgeyAweDIyLCAweDAyLCAweDBhIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sCiAJeyB7IDB4MjIsIDB4MDIsIDB4MTQgfSwgMHhmZiwgMHhmZiwgQUxQU19QQVNTIHwgQUxQU19EVUFMUE9JTlQgfSwgLyogRGVsbCBMYXRpdHVkZSBENjAwICovCisJeyB7IDB4NjIsIDB4MDIsIDB4MTQgfSwgMHhjZiwgMHhjZiwgQUxQU19QQVNTIHwgQUxQU19EVUFMUE9JTlQgfSwgLyogRGVsbCBMYXRpdHVkZSBFNjUwMCAqLwogCXsgeyAweDczLCAweDAyLCAweDUwIH0sIDB4Y2YsIDB4Y2YsIEFMUFNfRldfQktfMSB9IC8qIERlbGwgVm9zdHJvIDE0MDAgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKaW5kZXggMWY0MWFlOS4uMDc5ODE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKQEAgLTEzNiwxMiArMTM2LDI4IEBACiAjZGVmaW5lIEFUUF9HRVlTRVJfTU9ERV9SRVFVRVNUX0lOREVYCQkwCiAjZGVmaW5lIEFUUF9HRVlTRVJfTU9ERV9WRU5ET1JfVkFMVUUJCTB4MDQKIAorLyoqCisgKiBlbnVtIGF0cF9zdGF0dXNfYml0cyAtIHN0YXR1cyBiaXQgbWVhbmluZ3MKKyAqCisgKiBUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSBtZWFuaW5nIG9mIHRoZSBzdGF0dXMgYml0cy4KKyAqIChvbmx5IEdleXNlciAzLzQpCisgKgorICogQEFUUF9TVEFUVVNfQlVUVE9OOiBUaGUgYnV0dG9uIHdhcyBwcmVzc2VkCisgKiBAQVRQX1NUQVRVU19CQVNFX1VQREFURTogVXBkYXRlIG9mIHRoZSBiYXNlIHZhbHVlcyAodW50b3VjaGVkIHBhZCkKKyAqIEBBVFBfU1RBVFVTX0ZST01fUkVTRVQ6IFJlc2V0IHByZXZpb3VzbHkgcGVyZm9ybWVkCisgKi8KK2VudW0gYXRwX3N0YXR1c19iaXRzIHsKKwlBVFBfU1RBVFVTX0JVVFRPTgk9IEJJVCgwKSwKKwlBVFBfU1RBVFVTX0JBU0VfVVBEQVRFCT0gQklUKDIpLAorCUFUUF9TVEFUVVNfRlJPTV9SRVNFVAk9IEJJVCg0KSwKK307CisKIC8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCiBzdHJ1Y3QgYXRwIHsKIAljaGFyCQkJcGh5c1s2NF07CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CQkvKiB1c2IgZGV2aWNlICovCiAJc3RydWN0IHVyYgkJKnVyYjsJCS8qIHVzYiByZXF1ZXN0IGJsb2NrICovCi0Jc2lnbmVkIGNoYXIJCSpkYXRhOwkJLyogdHJhbnNmZXJyZWQgZGF0YSAqLworCXU4CQkJKmRhdGE7CQkvKiB0cmFuc2ZlcnJlZCBkYXRhICovCiAJc3RydWN0IGlucHV0X2RldgkqaW5wdXQ7CQkvKiBpbnB1dCBkZXYgKi8KIAllbnVtIGF0cF90b3VjaHBhZF90eXBlCXR5cGU7CQkvKiB0eXBlIG9mIHRvdWNocGFkICovCiAJYm9vbAkJCW9wZW47CkBAIC0yNTEsOCArMjY3LDYgQEAKIAlpbnQgcmV0dmFsOwogCiAJZHByaW50aygiYXBwbGV0b3VjaDogcHV0dGluZyBhcHBsZXRvdWNoIHRvIHNsZWVwIChyZWluaXQpXG4iKTsKLQlkZXYtPmlkbGVjb3VudCA9IDA7Ci0KIAlhdHBfZ2V5c2VyX2luaXQodWRldik7CiAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPnVyYiwgR0ZQX0FUT01JQyk7CkBAIC0zMjcsMTEgKzM0MSwxNCBAQAogCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT09MX1RSSVBMRVRBUCwgZmluZ2VycyA+IDIpOwogfQogCi1zdGF0aWMgdm9pZCBhdHBfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQorLyogQ2hlY2sgVVJCIHN0YXR1cyBhbmQgZm9yIGNvcnJlY3QgbGVuZ3RoIG9mIGRhdGEgcGFja2FnZSAqLworCisjZGVmaW5lIEFUUF9VUkJfU1RBVFVTX1NVQ0NFU1MJCTAKKyNkZWZpbmUgQVRQX1VSQl9TVEFUVVNfRVJST1IJCTEKKyNkZWZpbmUgQVRQX1VSQl9TVEFUVVNfRVJST1JfRkFUQUwJMgorCitzdGF0aWMgaW50IGF0cF9zdGF0dXNfY2hlY2soc3RydWN0IHVyYiAqdXJiKQogewotCWludCB4LCB5LCB4X3osIHlfeiwgeF9mLCB5X2Y7Ci0JaW50IHJldHZhbCwgaSwgajsKLQlpbnQga2V5OwogCXN0cnVjdCBhdHAgKmRldiA9IHVyYi0+Y29udGV4dDsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKQEAgLTM1MSwxMSArMzY4LDEyIEBACiAJCS8qIFRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRiZygiYXRwX2NvbXBsZXRlOiB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAogCQkgICAgdXJiLT5zdGF0dXMpOwotCQlyZXR1cm47CisJCXJldHVybiBBVFBfVVJCX1NUQVRVU19FUlJPUl9GQVRBTDsKKwogCWRlZmF1bHQ6CiAJCWRiZygiYXRwX2NvbXBsZXRlOiBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKIAkJICAgIHVyYi0+c3RhdHVzKTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gQVRQX1VSQl9TVEFUVVNfRVJST1I7CiAJfQogCiAJLyogZHJvcCBpbmNvbXBsZXRlIGRhdGFzZXRzICovCkBAIC0zNjMsMzAgKzM4MSwzMyBAQAogCQlkcHJpbnRrKCJhcHBsZXRvdWNoOiBpbmNvbXBsZXRlIGRhdGEgcGFja2FnZSIKIAkJCSIgKGZpcnN0IGJ5dGU6ICVkLCBsZW5ndGg6ICVkKS5cbiIsCiAJCQlkZXYtPmRhdGFbMF0sIGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJZ290byBleGl0OworCQlyZXR1cm4gQVRQX1VSQl9TVEFUVVNfRVJST1I7CiAJfQogCisJcmV0dXJuIEFUUF9VUkJfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBVU0IgaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9ucworICovCisKKy8qIEludGVycnVwdCBmdW5jdGlvbiBmb3Igb2xkZXIgdG91Y2hwYWRzOiBGT1VOVEFJTi9HRVlTRVIxL0dFWVNFUjIgKi8KKworc3RhdGljIHZvaWQgYXRwX2NvbXBsZXRlX2dleXNlcl8xXzIoc3RydWN0IHVyYiAqdXJiKQoreworCWludCB4LCB5LCB4X3osIHlfeiwgeF9mLCB5X2Y7CisJaW50IHJldHZhbCwgaSwgajsKKwlpbnQga2V5OworCXN0cnVjdCBhdHAgKmRldiA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gYXRwX3N0YXR1c19jaGVjayh1cmIpOworCisJaWYgKHN0YXR1cyA9PSBBVFBfVVJCX1NUQVRVU19FUlJPUl9GQVRBTCkKKwkJcmV0dXJuOworCWVsc2UgaWYgKHN0YXR1cyA9PSBBVFBfVVJCX1NUQVRVU19FUlJPUikKKwkJZ290byBleGl0OworCiAJLyogcmVvcmRlciB0aGUgc2Vuc29ycyB2YWx1ZXMgKi8KLQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIzIHx8IGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSNCkgewotCQltZW1zZXQoZGV2LT54eV9jdXIsIDAsIHNpemVvZihkZXYtPnh5X2N1cikpOwotCi0JCS8qCi0JCSAqIFRoZSB2YWx1ZXMgYXJlIGxhaWQgb3V0IGxpa2UgdGhpczoKLQkJICogLSwgWTEsIFkyLCAtLCBZMywgWTQsIC0sIC4uLiwgLSwgWDEsIFgyLCAtLCBYMywgWDQsIC4uLgotCQkgKiAnLScgaXMgYW4gdW51c2VkIHZhbHVlLgotCQkgKi8KLQotCQkvKiByZWFkIFggdmFsdWVzICovCi0JCWZvciAoaSA9IDAsIGogPSAxOTsgaSA8IDIwOyBpICs9IDIsIGogKz0gMykgewotCQkJZGV2LT54eV9jdXJbaV0gPSBkZXYtPmRhdGFbaiArIDFdOwotCQkJZGV2LT54eV9jdXJbaSArIDFdID0gZGV2LT5kYXRhW2ogKyAyXTsKLQkJfQotCQkvKiByZWFkIFkgdmFsdWVzICovCi0JCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgOTsgaSArPSAyLCBqICs9IDMpIHsKLQkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGldID0gZGV2LT5kYXRhW2ogKyAxXTsKLQkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGkgKyAxXSA9IGRldi0+ZGF0YVtqICsgMl07Ci0JCX0KLQl9IGVsc2UgaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikgeworCWlmIChkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIpIHsKIAkJbWVtc2V0KGRldi0+eHlfY3VyLCAwLCBzaXplb2YoZGV2LT54eV9jdXIpKTsKIAogCQkvKgpAQCAtNDI3LDM0ICs0NDgsNDAgQEAKIAkJLyogZmlyc3Qgc2FtcGxlICovCiAJCWRldi0+dmFsaWQgPSB0cnVlOwogCQlkZXYtPnhfb2xkID0gZGV2LT55X29sZCA9IC0xOworCisJCS8qIFN0b3JlIGZpcnN0IHNhbXBsZSAqLwogCQltZW1jcHkoZGV2LT54eV9vbGQsIGRldi0+eHlfY3VyLCBzaXplb2YoZGV2LT54eV9vbGQpKTsKIAotCQlpZiAoZGV2LT5zaXplX2RldGVjdF9kb25lIHx8Ci0JCSAgICBkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjMpIC8qIE5vIDE3IiBNYWNib29rcyAoeWV0KSAqLworCQkvKiBQZXJmb3JtIHNpemUgZGV0ZWN0aW9uLCBpZiBub3QgZG9uZSBhbHJlYWR5ICovCisJCWlmICghZGV2LT5zaXplX2RldGVjdF9kb25lKSB7CisKKwkJCS8qIDE3IiBQb3dlcmJvb2tzIGhhdmUgZXh0cmEgWCBzZW5zb3JzICovCisJCQlmb3IgKGkgPSAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIyID8gMTUgOiAxNik7CisJCQkgICAgIGkgPCBBVFBfWFNFTlNPUlM7IGkrKykgeworCQkJCWlmICghZGV2LT54eV9jdXJbaV0pCisJCQkJCWNvbnRpbnVlOworCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiYXBwbGV0b3VjaDogMTdcIiBtb2RlbCBkZXRlY3RlZC5cbiIpOworCisJCQkJaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikKKwkJCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsCisJCQkJCQkJICAgICAwLAorCQkJCQkJCSAgICAgKDIwIC0gMSkgKgorCQkJCQkJCSAgICAgQVRQX1hGQUNUIC0gMSwKKwkJCQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKKwkJCQllbHNlCisJCQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldi0+aW5wdXQsIEFCU19YLAorCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkgICAgICgyNiAtIDEpICoKKwkJCQkJCQkgICAgIEFUUF9YRkFDVCAtIDEsCisJCQkJCQkJICAgICBBVFBfRlVaWiwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRldi0+c2l6ZV9kZXRlY3RfZG9uZSA9IDE7CiAJCQlnb3RvIGV4aXQ7Ci0KLQkJLyogMTciIFBvd2VyYm9va3MgaGF2ZSBleHRyYSBYIHNlbnNvcnMgKi8KLQkJZm9yIChpID0gKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMiA/IDE1IDogMTYpOwotCQkgICAgIGkgPCBBVFBfWFNFTlNPUlM7IGkrKykgewotCQkJaWYgKCFkZXYtPnh5X2N1cltpXSkKLQkJCQljb250aW51ZTsKLQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGV0b3VjaDogMTdcIiBtb2RlbCBkZXRlY3RlZC5cbiIpOwotCQkJaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikKLQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYtPmlucHV0LCBBQlNfWCwgMCwKLQkJCQkJCSAgICAgKDIwIC0gMSkgKgotCQkJCQkJICAgICBBVFBfWEZBQ1QgLSAxLAotCQkJCQkJICAgICBBVFBfRlVaWiwgMCk7Ci0JCQllbHNlCi0JCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsIDAsCi0JCQkJCQkgICAgIChBVFBfWFNFTlNPUlMgLSAxKSAqCi0JCQkJCQkgICAgIEFUUF9YRkFDVCAtIDEsCi0JCQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKLQkJCWJyZWFrOwogCQl9Ci0KLQkJZGV2LT5zaXplX2RldGVjdF9kb25lID0gMTsKLQkJZ290byBleGl0OwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlM7IGkrKykgewpAQCAtNDc1LDcgKzUwMiwxMTggQEAKIAkJCSAgICAgIEFUUF9YRkFDVCwgJnhfeiwgJnhfZik7CiAJeSA9IGF0cF9jYWxjdWxhdGVfYWJzKGRldi0+eHlfYWNjICsgQVRQX1hTRU5TT1JTLCBBVFBfWVNFTlNPUlMsCiAJCQkgICAgICBBVFBfWUZBQ1QsICZ5X3osICZ5X2YpOwotCWtleSA9IGRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSAmIDE7CisJa2V5ID0gZGV2LT5kYXRhW2Rldi0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CVVRUT047CisKKwlpZiAoeCAmJiB5KSB7CisJCWlmIChkZXYtPnhfb2xkICE9IC0xKSB7CisJCQl4ID0gKGRldi0+eF9vbGQgKiAzICsgeCkgPj4gMjsKKwkJCXkgPSAoZGV2LT55X29sZCAqIDMgKyB5KSA+PiAyOworCQkJZGV2LT54X29sZCA9IHg7CisJCQlkZXYtPnlfb2xkID0geTsKKworCQkJaWYgKGRlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBwbGV0b3VjaDogIgorCQkJCQkiWDogJTNkIFk6ICUzZCBYejogJTNkIFl6OiAlM2RcbiIsCisJCQkJCXgsIHksIHhfeiwgeV96KTsKKworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYtPmlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0LCBBQlNfWCwgeCk7CisJCQlpbnB1dF9yZXBvcnRfYWJzKGRldi0+aW5wdXQsIEFCU19ZLCB5KTsKKwkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1BSRVNTVVJFLAorCQkJCQkgbWluKEFUUF9QUkVTU1VSRSwgeF96ICsgeV96KSk7CisJCQlhdHBfcmVwb3J0X2ZpbmdlcnMoZGV2LT5pbnB1dCwgbWF4KHhfZiwgeV9mKSk7CisJCX0KKwkJZGV2LT54X29sZCA9IHg7CisJCWRldi0+eV9vbGQgPSB5OworCisJfSBlbHNlIGlmICgheCAmJiAheSkgeworCisJCWRldi0+eF9vbGQgPSBkZXYtPnlfb2xkID0gLTE7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dCwgQlROX1RPVUNILCAwKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0LCBBQlNfUFJFU1NVUkUsIDApOworCQlhdHBfcmVwb3J0X2ZpbmdlcnMoZGV2LT5pbnB1dCwgMCk7CisKKwkJLyogcmVzZXQgdGhlIGFjY3VtdWxhdG9yIG9uIHJlbGVhc2UgKi8KKwkJbWVtc2V0KGRldi0+eHlfYWNjLCAwLCBzaXplb2YoZGV2LT54eV9hY2MpKTsKKwl9CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldi0+aW5wdXQsIEJUTl9MRUZULCBrZXkpOworCWlucHV0X3N5bmMoZGV2LT5pbnB1dCk7CisKKyBleGl0OgorCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+dXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQllcnIoImF0cF9jb21wbGV0ZTogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgIHJldHZhbCk7Cit9CisKKy8qIEludGVycnVwdCBmdW5jdGlvbiBmb3Igb2xkZXIgdG91Y2hwYWRzOiBHRVlTRVIzL0dFWVNFUjQgKi8KKworc3RhdGljIHZvaWQgYXRwX2NvbXBsZXRlX2dleXNlcl8zXzQoc3RydWN0IHVyYiAqdXJiKQoreworCWludCB4LCB5LCB4X3osIHlfeiwgeF9mLCB5X2Y7CisJaW50IHJldHZhbCwgaSwgajsKKwlpbnQga2V5OworCXN0cnVjdCBhdHAgKmRldiA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gYXRwX3N0YXR1c19jaGVjayh1cmIpOworCisJaWYgKHN0YXR1cyA9PSBBVFBfVVJCX1NUQVRVU19FUlJPUl9GQVRBTCkKKwkJcmV0dXJuOworCWVsc2UgaWYgKHN0YXR1cyA9PSBBVFBfVVJCX1NUQVRVU19FUlJPUikKKwkJZ290byBleGl0OworCisJLyogUmVvcmRlciB0aGUgc2Vuc29ycyB2YWx1ZXM6CisJICoKKwkgKiBUaGUgdmFsdWVzIGFyZSBsYWlkIG91dCBsaWtlIHRoaXM6CisJICogLSwgWTEsIFkyLCAtLCBZMywgWTQsIC0sIC4uLiwgLSwgWDEsIFgyLCAtLCBYMywgWDQsIC4uLgorCSAqICctJyBpcyBhbiB1bnVzZWQgdmFsdWUuCisJICovCisKKwkvKiByZWFkIFggdmFsdWVzICovCisJZm9yIChpID0gMCwgaiA9IDE5OyBpIDwgMjA7IGkgKz0gMiwgaiArPSAzKSB7CisJCWRldi0+eHlfY3VyW2ldID0gZGV2LT5kYXRhW2ogKyAxXTsKKwkJZGV2LT54eV9jdXJbaSArIDFdID0gZGV2LT5kYXRhW2ogKyAyXTsKKwl9CisJLyogcmVhZCBZIHZhbHVlcyAqLworCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgOTsgaSArPSAyLCBqICs9IDMpIHsKKwkJZGV2LT54eV9jdXJbQVRQX1hTRU5TT1JTICsgaV0gPSBkZXYtPmRhdGFbaiArIDFdOworCQlkZXYtPnh5X2N1cltBVFBfWFNFTlNPUlMgKyBpICsgMV0gPSBkZXYtPmRhdGFbaiArIDJdOworCX0KKworCWRiZ19kdW1wKCJzYW1wbGUiLCBkZXYtPnh5X2N1cik7CisKKwkvKiBKdXN0IHVwZGF0ZSB0aGUgYmFzZSB2YWx1ZXMgKGkuZS4gdG91Y2hwYWQgaW4gdW50b3VjaGVkIHN0YXRlKSAqLworCWlmIChkZXYtPmRhdGFbZGV2LT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JBU0VfVVBEQVRFKSB7CisKKwkJZHByaW50ayhLRVJOX0RFQlVHICJhcHBsZXRvdWNoOiB1cGRhdGVkIGJhc2UgdmFsdWVzXG4iKTsKKworCQltZW1jcHkoZGV2LT54eV9vbGQsIGRldi0+eHlfY3VyLCBzaXplb2YoZGV2LT54eV9vbGQpKTsKKwkJZ290byBleGl0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlM7IGkrKykgeworCQkvKiBjYWxjdWxhdGUgdGhlIGNoYW5nZSAqLworCQlkZXYtPnh5X2FjY1tpXSA9IGRldi0+eHlfY3VyW2ldIC0gZGV2LT54eV9vbGRbaV07CisKKwkJLyogdGhpcyBpcyBhIHJvdW5kLXJvYmluIHZhbHVlLCBzbyBjb3VwbGUgd2l0aCB0aGF0ICovCisJCWlmIChkZXYtPnh5X2FjY1tpXSA+IDEyNykKKwkJCWRldi0+eHlfYWNjW2ldIC09IDI1NjsKKworCQlpZiAoZGV2LT54eV9hY2NbaV0gPCAtMTI3KQorCQkJZGV2LT54eV9hY2NbaV0gKz0gMjU2OworCisJCS8qIHByZXZlbnQgZG93biBkcmlmdGluZyAqLworCQlpZiAoZGV2LT54eV9hY2NbaV0gPCAwKQorCQkJZGV2LT54eV9hY2NbaV0gPSAwOworCX0KKworCWRiZ19kdW1wKCJhY2N1bXVsYXRvciIsIGRldi0+eHlfYWNjKTsKKworCXggPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYywgQVRQX1hTRU5TT1JTLAorCQkJICAgICAgQVRQX1hGQUNULCAmeF96LCAmeF9mKTsKKwl5ID0gYXRwX2NhbGN1bGF0ZV9hYnMoZGV2LT54eV9hY2MgKyBBVFBfWFNFTlNPUlMsIEFUUF9ZU0VOU09SUywKKwkJCSAgICAgIEFUUF9ZRkFDVCwgJnlfeiwgJnlfZik7CisJa2V5ID0gZGV2LT5kYXRhW2Rldi0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CVVRUT047CiAKIAlpZiAoeCAmJiB5KSB7CiAJCWlmIChkZXYtPnhfb2xkICE9IC0xKSB7CkBAIC01MTQsMjggKzY1MiwyNyBAQAogCWlucHV0X3N5bmMoZGV2LT5pbnB1dCk7CiAKIAkvKgotCSAqIE1hbnkgR2V5c2VycyB3aWxsIGNvbnRpbnVlIHRvIHNlbmQgcGFja2V0cyBjb250aW51YWxseSBhZnRlcgorCSAqIEdleXNlcnMgMy80IHdpbGwgY29udGludWUgdG8gc2VuZCBwYWNrZXRzIGNvbnRpbnVhbGx5IGFmdGVyCiAJICogdGhlIGZpcnN0IHRvdWNoIHVubGVzcyByZWluaXRpYWxpc2VkLiBEbyBzbyBpZiBpdCdzIGJlZW4KIAkgKiBpZGxlIGZvciBhIHdoaWxlIGluIG9yZGVyIHRvIGF2b2lkIHdha2luZyB0aGUga2VybmVsIHVwCi0JICogc2V2ZXJhbCBodW5kcmVkIHRpbWVzIGEgc2Vjb25kLiBSZS1pbml0aWFsaXphdGlvbiBkb2VzIG5vdAotCSAqIHdvcmsgb24gRm91bnRhaW4gdG91Y2hwYWRzLgorCSAqIHNldmVyYWwgaHVuZHJlZCB0aW1lcyBhIHNlY29uZC4KIAkgKi8KLQlpZiAoZGV2LT50eXBlICE9IEFUUF9GT1VOVEFJTikgewotCQkvKgotCQkgKiBCdXR0b24gbXVzdCBub3QgYmUgcHJlc3NlZCB3aGVuIGVudGVyaW5nIHN1c3BlbmQsCi0JCSAqIG90aGVyd2lzZSB3ZSB3aWxsIG5ldmVyIHJlbGVhc2UgdGhlIGJ1dHRvbi4KLQkJICovCi0JCWlmICgheCAmJiAheSAmJiAha2V5KSB7Ci0JCQlkZXYtPmlkbGVjb3VudCsrOwotCQkJaWYgKGRldi0+aWRsZWNvdW50ID09IDEwKSB7Ci0JCQkJZGV2LT52YWxpZCA9IGZhbHNlOwotCQkJCXNjaGVkdWxlX3dvcmsoJmRldi0+d29yayk7Ci0JCQkJLyogRG9uJ3QgcmVzdWJtaXQgdXJiIGhlcmUsIHdhaXQgZm9yIHJlaW5pdCAqLwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlCisKKwkvKgorCSAqIEJ1dHRvbiBtdXN0IG5vdCBiZSBwcmVzc2VkIHdoZW4gZW50ZXJpbmcgc3VzcGVuZCwKKwkgKiBvdGhlcndpc2Ugd2Ugd2lsbCBuZXZlciByZWxlYXNlIHRoZSBidXR0b24uCisJICovCisJaWYgKCF4ICYmICF5ICYmICFrZXkpIHsKKwkJZGV2LT5pZGxlY291bnQrKzsKKwkJaWYgKGRldi0+aWRsZWNvdW50ID09IDEwKSB7CisJCQlkZXYtPnhfb2xkID0gZGV2LT55X29sZCA9IC0xOwogCQkJZGV2LT5pZGxlY291bnQgPSAwOwotCX0KKwkJCXNjaGVkdWxlX3dvcmsoJmRldi0+d29yayk7CisJCQkvKiBEb24ndCByZXN1Ym1pdCB1cmIgaGVyZSwgd2FpdCBmb3IgcmVpbml0ICovCisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UKKwkJZGV2LT5pZGxlY291bnQgPSAwOwogCiAgZXhpdDoKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPnVyYiwgR0ZQX0FUT01JQyk7CkBAIC02MzIsOSArNzY5LDE5IEBACiAJaWYgKCFkZXYtPmRhdGEpCiAJCWdvdG8gZXJyX2ZyZWVfdXJiOwogCi0JdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKLQkJCSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBpbnRfaW5fZW5kcG9pbnRBZGRyKSwKLQkJCSBkZXYtPmRhdGEsIGRldi0+ZGF0YWxlbiwgYXRwX2NvbXBsZXRlLCBkZXYsIDEpOworCS8qIFNlbGVjdCB0aGUgVVNCIGNvbXBsZXRlIChjYWxsYmFjaykgZnVuY3Rpb24gKi8KKwlpZiAoZGV2LT50eXBlID09IEFUUF9GT1VOVEFJTiB8fAorCSAgICBkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjEgfHwKKwkgICAgZGV2LT50eXBlID09IEFUUF9HRVlTRVIyKQorCQl1c2JfZmlsbF9pbnRfdXJiKGRldi0+dXJiLCB1ZGV2LAorCQkJCSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBpbnRfaW5fZW5kcG9pbnRBZGRyKSwKKwkJCQkgZGV2LT5kYXRhLCBkZXYtPmRhdGFsZW4sCisJCQkJIGF0cF9jb21wbGV0ZV9nZXlzZXJfMV8yLCBkZXYsIDEpOworCWVsc2UKKwkJdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKKwkJCQkgdXNiX3JjdmludHBpcGUodWRldiwgaW50X2luX2VuZHBvaW50QWRkciksCisJCQkJIGRldi0+ZGF0YSwgZGV2LT5kYXRhbGVuLAorCQkJCSBhdHBfY29tcGxldGVfZ2V5c2VyXzNfNCwgZGV2LCAxKTsKIAogCWVycm9yID0gYXRwX2hhbmRsZV9nZXlzZXIoZGV2KTsKIAlpZiAoZXJyb3IpCkBAIC03NTEsOCArODk4LDYgQEAKIAlzdHJ1Y3QgYXRwICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKIAogCXVzYl9raWxsX3VyYihkZXYtPnVyYik7Ci0JZGV2LT52YWxpZCA9IGZhbHNlOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKaW5kZXggMmVjOTIxYi4uMjk5OGE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKQEAgLTYzLDcgKzYzLDcgQEAKIH0KIAogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGJjbTU5NzRfdGFibGUgW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgYmNtNTk3NF90YWJsZVtdID0gewogCS8qIE1hY2Jvb2tBaXIxLjEgKi8KIAlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkdfQU5TSSksCiAJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0lTTyksCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogLyogdHJhY2twYWQgZmluZ2VyIHN0cnVjdHVyZSAqLwogc3RydWN0IHRwX2ZpbmdlciB7Ci0JX19sZTE2IG9yaWdpbjsJCS8qIGxlZnQvcmlnaHQgb3JpZ2luPyAqLworCV9fbGUxNiBvcmlnaW47CQkvKiB6ZXJvIHdoZW4gc3dpdGNoaW5nIHRyYWNrIGZpbmdlciAqLwogCV9fbGUxNiBhYnNfeDsJCS8qIGFic29sdXRlIHggY29vZGluYXRlICovCiAJX19sZTE2IGFic195OwkJLyogYWJzb2x1dGUgeSBjb29kaW5hdGUgKi8KIAlfX2xlMTYgcmVsX3g7CQkvKiByZWxhdGl2ZSB4IGNvb2RpbmF0ZSAqLwpAQCAtMTU5LDYgKzE1OSw3IEBACiAJc3RydWN0IGJ0X2RhdGEgKmJ0X2RhdGE7CS8qIGJ1dHRvbiB0cmFuc2ZlcnJlZCBkYXRhICovCiAJc3RydWN0IHVyYiAqdHBfdXJiOwkJLyogdHJhY2twYWQgdXNiIHJlcXVlc3QgYmxvY2sgKi8KIAlzdHJ1Y3QgdHBfZGF0YSAqdHBfZGF0YTsJLyogdHJhY2twYWQgdHJhbnNmZXJyZWQgZGF0YSAqLworCWludCBmaW5nZXJzOwkJCS8qIG51bWJlciBvZiBmaW5nZXJzIG9uIHRyYWNrcGFkICovCiB9OwogCiAvKiBsb2dpY2FsIGRpbWVuc2lvbnMgKi8KQEAgLTE3Miw2ICsxNzMsMTAgQEAKICNkZWZpbmUgU05fV0lEVEgJMTAwCQkvKiB3aWR0aCBzaWduYWwtdG8tbm9pc2UgcmF0aW8gKi8KICNkZWZpbmUgU05fQ09PUkQJMjUwCQkvKiBjb29yZGluYXRlIHNpZ25hbC10by1ub2lzZSByYXRpbyAqLwogCisvKiBwcmVzc3VyZSB0aHJlc2hvbGRzICovCisjZGVmaW5lIFBSRVNTVVJFX0xPVwkoMiAqIERJTV9QUkVTU1VSRSAvIFNOX1BSRVNTVVJFKQorI2RlZmluZSBQUkVTU1VSRV9ISUdICSgzICogUFJFU1NVUkVfTE9XKQorCiAvKiBkZXZpY2UgY29uc3RhbnRzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJjbTU5NzRfY29uZmlnIGJjbTU5NzRfY29uZmlnX3RhYmxlW10gPSB7CiAJewpAQCAtMjQ4LDYgKzI1Myw3IEBACiAJCQkJMCwgY2ZnLT55LmRpbSwgY2ZnLT55LmZ1enosIDApOwogCiAJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOwogCV9fc2V0X2JpdChCVE5fVE9PTF9GSU5HRVIsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAlfX3NldF9iaXQoQlROX1RPT0xfRE9VQkxFVEFQLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJX19zZXRfYml0KEJUTl9UT09MX1RSSVBMRVRBUCwgaW5wdXRfZGV2LT5rZXliaXQpOwpAQCAtMjczLDMyICsyNzksNjYgQEAKIAljb25zdCBzdHJ1Y3QgdHBfZmluZ2VyICpmID0gZGV2LT50cF9kYXRhLT5maW5nZXI7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBkZXYtPmlucHV0OwogCWNvbnN0IGludCBmaW5nZXJzID0gKHNpemUgLSAyNikgLyAyODsKLQlpbnQgcCA9IDAsIHcsIHgsIHksIG4gPSAwOworCWludCByYXdfcCwgcmF3X3csIHJhd194LCByYXdfeTsKKwlpbnQgcHRlc3QgPSAwLCBvcmlnaW4gPSAwLCBubWluID0gMCwgbm1heCA9IDA7CisJaW50IGFic19wID0gMCwgYWJzX3cgPSAwLCBhYnNfeCA9IDAsIGFic195ID0gMDsKIAogCWlmIChzaXplIDwgMjYgfHwgKHNpemUgLSAyNikgJSAyOCAhPSAwKQogCQlyZXR1cm4gLUVJTzsKIAorCS8qIGFsd2F5cyB0cmFjayB0aGUgZmlyc3QgZmluZ2VyOyB3aGVuIGRldGFjaGVkLCBzdGFydCBvdmVyICovCiAJaWYgKGZpbmdlcnMpIHsKLQkJcCA9IHJhdzJpbnQoZi0+Zm9yY2VfbWFqb3IpOwotCQl3ID0gcmF3MmludChmLT5zaXplX21ham9yKTsKLQkJeCA9IHJhdzJpbnQoZi0+YWJzX3gpOwotCQl5ID0gcmF3MmludChmLT5hYnNfeSk7Ci0JCW4gPSBwID4gMCA/IGZpbmdlcnMgOiAwOworCQlyYXdfcCA9IHJhdzJpbnQoZi0+Zm9yY2VfbWFqb3IpOworCQlyYXdfdyA9IHJhdzJpbnQoZi0+c2l6ZV9tYWpvcik7CisJCXJhd194ID0gcmF3MmludChmLT5hYnNfeCk7CisJCXJhd195ID0gcmF3MmludChmLT5hYnNfeSk7CiAKIAkJZHByaW50ayg5LAotCQkJImJjbTU5NzQ6IHA6ICUrMDVkIHc6ICUrMDVkIHg6ICUrMDVkIHk6ICUrMDVkIG46ICVkXG4iLAotCQkJcCwgdywgeCwgeSwgbik7CisJCQkiYmNtNTk3NDogcmF3OiBwOiAlKzA1ZCB3OiAlKzA1ZCB4OiAlKzA1ZCB5OiAlKzA1ZFxuIiwKKwkJCXJhd19wLCByYXdfdywgcmF3X3gsIHJhd195KTsKIAotCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfVE9PTF9XSURUSCwgaW50MmJvdW5kKCZjLT53LCB3KSk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19YLCBpbnQyYm91bmQoJmMtPngsIHggLSBjLT54LmRldm1pbikpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWSwgaW50MmJvdW5kKCZjLT55LCBjLT55LmRldm1heCAtIHkpKTsKKwkJcHRlc3QgPSBpbnQyYm91bmQoJmMtPnAsIHJhd19wKTsKKwkJb3JpZ2luID0gcmF3MmludChmLT5vcmlnaW4pOwogCX0KIAotCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgaW50MmJvdW5kKCZjLT5wLCBwKSk7CisJLyogd2hpbGUgdHJhY2tpbmcgZmluZ2VyIHN0aWxsIHZhbGlkLCBjb3VudCBhbGwgZmluZ2VycyAqLworCWlmIChwdGVzdCA+IFBSRVNTVVJFX0xPVyAmJiBvcmlnaW4pIHsKKwkJYWJzX3AgPSBwdGVzdDsKKwkJYWJzX3cgPSBpbnQyYm91bmQoJmMtPncsIHJhd193KTsKKwkJYWJzX3ggPSBpbnQyYm91bmQoJmMtPngsIHJhd194IC0gYy0+eC5kZXZtaW4pOworCQlhYnNfeSA9IGludDJib3VuZCgmYy0+eSwgYy0+eS5kZXZtYXggLSByYXdfeSk7CisJCWZvciAoOyBmICE9IGRldi0+dHBfZGF0YS0+ZmluZ2VyICsgZmluZ2VyczsgZisrKSB7CisJCQlwdGVzdCA9IGludDJib3VuZCgmYy0+cCwgcmF3MmludChmLT5mb3JjZV9tYWpvcikpOworCQkJaWYgKHB0ZXN0ID4gUFJFU1NVUkVfTE9XKQorCQkJCW5tYXgrKzsKKwkJCWlmIChwdGVzdCA+IFBSRVNTVVJFX0hJR0gpCisJCQkJbm1pbisrOworCQl9CisJfQogCi0JaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPT0xfRklOR0VSLCBuID09IDEpOwotCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT09MX0RPVUJMRVRBUCwgbiA9PSAyKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9PTF9UUklQTEVUQVAsIG4gPiAyKTsKKwlpZiAoZGV2LT5maW5nZXJzIDwgbm1pbikKKwkJZGV2LT5maW5nZXJzID0gbm1pbjsKKwlpZiAoZGV2LT5maW5nZXJzID4gbm1heCkKKwkJZGV2LT5maW5nZXJzID0gbm1heDsKKworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgZGV2LT5maW5nZXJzID4gMCk7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPT0xfRklOR0VSLCBkZXYtPmZpbmdlcnMgPT0gMSk7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPT0xfRE9VQkxFVEFQLCBkZXYtPmZpbmdlcnMgPT0gMik7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPT0xfVFJJUExFVEFQLCBkZXYtPmZpbmdlcnMgPiAyKTsKKworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgYWJzX3ApOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19UT09MX1dJRFRILCBhYnNfdyk7CisKKwlpZiAoYWJzX3ApIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIGFic194KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIGFic195KTsKKworCQlkcHJpbnRrKDgsCisJCQkiYmNtNTk3NDogYWJzOiBwOiAlKzA1ZCB3OiAlKzA1ZCB4OiAlKzA1ZCB5OiAlKzA1ZCAiCisJCQkibm1pbjogJWQgbm1heDogJWQgbjogJWRcbiIsCisJCQlhYnNfcCwgYWJzX3csIGFic194LCBhYnNfeSwgbm1pbiwgbm1heCwgZGV2LT5maW5nZXJzKTsKKworCX0KIAogCWlucHV0X3N5bmMoaW5wdXQpOwogCkBAIC0zMTEsOCArMzUxLDkgQEAKICNkZWZpbmUgQkNNNTk3NF9XRUxMU1BSSU5HX01PREVfUkVRVUVTVF9WQUxVRQkJMHgzMDAKICNkZWZpbmUgQkNNNTk3NF9XRUxMU1BSSU5HX01PREVfUkVRVUVTVF9JTkRFWAkJMAogI2RlZmluZSBCQ001OTc0X1dFTExTUFJJTkdfTU9ERV9WRU5ET1JfVkFMVUUJCTB4MDEKKyNkZWZpbmUgQkNNNTk3NF9XRUxMU1BSSU5HX01PREVfTk9STUFMX1ZBTFVFCQkweDA4CiAKLXN0YXRpYyBpbnQgYmNtNTk3NF93ZWxsc3ByaW5nX21vZGUoc3RydWN0IGJjbTU5NzQgKmRldikKK3N0YXRpYyBpbnQgYmNtNTk3NF93ZWxsc3ByaW5nX21vZGUoc3RydWN0IGJjbTU5NzQgKmRldiwgYm9vbCBvbikKIHsKIAljaGFyICpkYXRhID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKIAlpbnQgcmV0dmFsID0gMCwgc2l6ZTsKQEAgLTMzNyw3ICszNzgsOSBAQAogCX0KIAogCS8qIGFwcGx5IHRoZSBtb2RlIHN3aXRjaCAqLwotCWRhdGFbMF0gPSBCQ001OTc0X1dFTExTUFJJTkdfTU9ERV9WRU5ET1JfVkFMVUU7CisJZGF0YVswXSA9IG9uID8KKwkJQkNNNTk3NF9XRUxMU1BSSU5HX01PREVfVkVORE9SX1ZBTFVFIDoKKwkJQkNNNTk3NF9XRUxMU1BSSU5HX01PREVfTk9STUFMX1ZBTFVFOwogCiAJLyogd3JpdGUgY29uZmlndXJhdGlvbiAqLwogCXNpemUgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKQEAgLTM1Miw3ICszOTUsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkcHJpbnRrKDIsICJiY201OTc0OiBzd2l0Y2hlZCB0byB3ZWxsc3ByaW5nIG1vZGUuXG4iKTsKKwlkcHJpbnRrKDIsICJiY201OTc0OiBzd2l0Y2hlZCB0byAlcyBtb2RlLlxuIiwKKwkJb24gPyAid2VsbHNwcmluZyIgOiAibm9ybWFsIik7CiAKICBvdXQ6CiAJa2ZyZWUoZGF0YSk7CkBAIC00NDEsNyArNDg1LDcgQEAKICAqLwogc3RhdGljIGludCBiY201OTc0X3N0YXJ0X3RyYWZmaWMoc3RydWN0IGJjbTU5NzQgKmRldikKIHsKLQlpZiAoYmNtNTk3NF93ZWxsc3ByaW5nX21vZGUoZGV2KSkgeworCWlmIChiY201OTc0X3dlbGxzcHJpbmdfbW9kZShkZXYsIHRydWUpKSB7CiAJCWRwcmludGsoMSwgImJjbTU5NzQ6IG1vZGUgc3dpdGNoIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNDY0LDYgKzUwOCw3IEBACiB7CiAJdXNiX2tpbGxfdXJiKGRldi0+dHBfdXJiKTsKIAl1c2Jfa2lsbF91cmIoZGV2LT5idF91cmIpOworCWJjbTU5NzRfd2VsbHNwcmluZ19tb2RlKGRldiwgZmFsc2UpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJkMzQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBPTFBDIEhHUEsgKFhPLTEpIHRvdWNocGFkIFBTLzIgbW91c2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggT25lIExhcHRvcCBQZXIgQ2hpbGQKKyAqIEF1dGhvcnM6CisgKiAgIFplcGhhbmlhaCBFLiBIdWxsCisgKiAgIEFuZHJlcyBTYWxvbW9uIDxkaWxpbmdlckBkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHBhcnRseSBiYXNlZCBvbiB0aGUgQUxQUyBkcml2ZXIsIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBQZXRlciBPc3Rlcmx1bmQgPHBldGVybzJAdGVsaWEuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0IERtaXRyeSBUb3Jva2hvdiA8ZHRvckBtYWlsLnJ1PgorICogQ29weXJpZ2h0IChjKSAyMDA1IFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhlIHNwZWMgZnJvbSBBTFBTIGlzIGF2YWlsYWJsZSBmcm9tCisgKiA8aHR0cDovL3dpa2kubGFwdG9wLm9yZy9nby9Ub3VjaF9QYWQvVGFibGV0Pi4gIEl0IHJlZmVycyB0byB0aGlzCisgKiBkZXZpY2UgYXMgSEdQSyAoSHlicmlkIEdTLCBQVCwgYW5kIEtleW1hdHJpeCkuCisgKgorICogVGhlIGVhcmxpZXN0IHZlcnNpb25zIG9mIHRoZSBkZXZpY2UgaGFkIHNpbXVsdGFuZW91cyByZXBvcnRpbmc7IHRoYXQKKyAqIHdhcyByZW1vdmVkLiAgQWZ0ZXIgdGhhdCwgdGhlIGRldmljZSB1c2VkIHRoZSBBZHZhbmNlZCBNb2RlIEdTL1BUIHN0cmVhbWluZworICogc3R1ZmYuICBUaGF0IHR1cm5lZCBvdXQgdG8gYmUgdG9vIGJ1Z2d5IHRvIHN1cHBvcnQsIHNvIHdlJ3ZlIGZpbmFsbHkKKyAqIHN3aXRjaGVkIHRvIE1vdXNlIE1vZGUgKHdoaWNoIHV0aWxpemVzIG9ubHkgdGhlIGNlbnRlciAxLzMgb2YgdGhlIHRvdWNocGFkKS4KKyAqLworCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL29scGMuaD4KKworI2luY2x1ZGUgInBzbW91c2UuaCIKKyNpbmNsdWRlICJoZ3BrLmgiCisKK3N0YXRpYyBpbnQgdHBkZWJ1ZzsKK21vZHVsZV9wYXJhbSh0cGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0cGRlYnVnLCAiZW5hYmxlIGRlYnVnZ2luZywgZHVtcGluZyBwYWNrZXRzIHRvIEtFUk5fREVCVUcuIik7CisKK3N0YXRpYyBpbnQgcmVjYWxpYl9kZWx0YSA9IDEwMDsKK21vZHVsZV9wYXJhbShyZWNhbGliX2RlbHRhLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZWNhbGliX2RlbHRhLAorCSJwYWNrZXRzIGNvbnRhaW5pbmcgYSBkZWx0YSB0aGlzIGxhcmdlIHdpbGwgY2F1c2UgYSByZWNhbGlicmF0aW9uLiIpOworCisvKgorICogV2hlbiB0aGUgdG91Y2hwYWQgZ2V0cyB1bHRyYS1zZW5zaXRpdmUsIG9uZSBjYW4ga2VlcCB0aGVpciBmaW5nZXIgMS8yIgorICogYWJvdmUgdGhlIHBhZCBhbmQgc3RpbGwgaGF2ZSBpdCBzZW5kIHBhY2tldHMuICBUaGlzIGNhdXNlcyBhIGp1bXAgY3Vyc29yCisgKiB3aGVuIG9uZSBwbGFjZXMgdGhlaXIgZmluZ2VyIG9uIHRoZSBwYWQuICBXZSBjYW4gcHJvYmFibHkgZGV0ZWN0IHRoZQorICoganVtcCBhcyB3ZSBzZWUgYSBsYXJnZSBkZWx0YXMgKD49IDEwMHB4KS4gIEluIG1vdXNlIG1vZGUsIEkndmUgYmVlbgorICogdW5hYmxlIHRvIGV2ZW4gY29tZSBjbG9zZSB0byAxMDBweCBkZWx0YXMgZHVyaW5nIG5vcm1hbCB1c2FnZSwgc28gSSB0aGluaworICogdGhpcyB0aHJlc2hvbGQgaXMgc2FmZS4gIElmIGEgbGFyZ2UgZGVsdGEgb2NjdXJzLCB0cmlnZ2VyIGEgcmVjYWxpYnJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaGdwa19qdW1weV9oYWNrKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgeCwgaW50IHkpCit7CisJc3RydWN0IGhncGtfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisKKwlpZiAoYWJzKHgpID4gcmVjYWxpYl9kZWx0YSB8fCBhYnMoeSkgPiByZWNhbGliX2RlbHRhKSB7CisJCWhncGtfZXJyKHBzbW91c2UsICI+JWRweCBqdW1wIGRldGVjdGVkICglZCwlZClcbiIsCisJCQkJcmVjYWxpYl9kZWx0YSwgeCwgeSk7CisJCS8qIE15IGNhciBnZXRzIGZvcnR5IHJvZHMgdG8gdGhlIGhvZ3NoZWFkIGFuZCB0aGF0J3MgdGhlCisJCSAqIHdheSBJIGxpa2VzIGl0ISAqLworCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCisJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJfQorfQorCisvKgorICogV2UgaGF2ZSBubyBpZGVhIHdoeSB0aGlzIHBhcnRpY3VsYXIgaGFyZHdhcmUgYnVnIG9jY3Vycy4gIFRoZSB0b3VjaHBhZAorICogd2lsbCByYW5kb21seSBzdGFydCBzcGV3aW5nIHBhY2tldHMgd2l0aG91dCBhbnl0aGluZyB0b3VjaGluZyB0aGUKKyAqIHBhZC4gIFRoaXMgd291bGRuJ3QgbmVjZXNzYXJpbHkgYmUgYmFkLCBidXQgaXQncyBpbmRpY2F0aXZlIG9mIGEKKyAqIHNldmVyZWx5IG1pc2NhbGlicmF0ZWQgcGFkOyBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgdG91Y2hwYWQgd2hpbGUgaXQncworICogc3Bld2luZyBtZWFucyB0aGUgY3Vyc29yIHdpbGwganVtcCBhbGwgb3ZlciB0aGUgcGxhY2UsIGFuZCBhY3QgImRydW5rIi4KKyAqCisgKiBUaGUgcGFja2V0cyB0aGF0IGFyZSBzcGV3ZWQgdGVuZCB0byBhbGwgaGF2ZSBkZWx0YXMgYmV0d2VlbiAtMiBhbmQgMiwgYW5kCisgKiB0aGUgY3Vyc29yIHdpbGwgbW92ZSBhcm91bmQgd2l0aG91dCByZWFsbHkgZ29pbmcgdmVyeSBmYXIuICBJdCB3aWxsCisgKiB0ZW5kIHRvIGVuZCB1cCBpbiB0aGUgc2FtZSBsb2NhdGlvbjsgaWYgd2UgdGFsbHkgdXAgdGhlIGNoYW5nZXMgb3ZlcgorICogMTAwIHBhY2tldHMsIHdlIGVuZCB1cCB3LyBhIGZpbmFsIGRlbHRhIG9mIGNsb3NlIHRvIDAuICBUaGlzIGhhcHBlbnMKKyAqIHByZXR0eSByZWd1bGFybHkgd2hlbiB0aGUgdG91Y2hwYWQgaXMgc3Bld2luZywgYW5kIGlzIHByZXR0eSBoYXJkIHRvCisgKiBtYW51YWxseSB0cmlnZ2VyIChhdCBsZWFzdCBmb3IgKm15KiBmaW5nZXJzKS4gIFNvLCBpdCBtYWtlcyBhIHBlcmZlY3QKKyAqIHNjaGVtZSBmb3IgZGV0ZWN0aW5nIHNwZXdzLgorICovCitzdGF0aWMgdm9pZCBoZ3BrX3NwZXdpbmdfaGFjayhzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCSAgICAgIGludCBsLCBpbnQgciwgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBoZ3BrX2RhdGEgKnByaXYgPSBwc21vdXNlLT5wcml2YXRlOworCisJLyogaWdub3JlIGJ1dHRvbiBwcmVzcyBwYWNrZXRzOyBtYW55IGluIGEgcm93IGNvdWxkIHRyaWdnZXIKKwkgKiBhIGZhbHNlLXBvc2l0aXZlISAqLworCWlmIChsIHx8IHIpCisJCXJldHVybjsKKworCXByaXYtPnhfdGFsbHkgKz0geDsKKwlwcml2LT55X3RhbGx5ICs9IHk7CisKKwlpZiAoKytwcml2LT5jb3VudCA+IDEwMCkgeworCQlpZiAoYWJzKHByaXYtPnhfdGFsbHkpIDwgMyAmJiBhYnMocHJpdi0+eV90YWxseSkgPCAzKSB7CisJCQloZ3BrX2RiZyhwc21vdXNlLCAicGFja2V0IHNwZXcgZGV0ZWN0ZWQgKCVkLCVkKVxuIiwKKwkJCQkgcHJpdi0+eF90YWxseSwgcHJpdi0+eV90YWxseSk7CisJCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCisJCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCQl9CisJCS8qIHJlc2V0IGV2ZXJ5IDEwMCBwYWNrZXRzICovCisJCXByaXYtPmNvdW50ID0gMDsKKwkJcHJpdi0+eF90YWxseSA9IDA7CisJCXByaXYtPnlfdGFsbHkgPSAwOworCX0KK30KKworLyoKKyAqIEhHUEsgTW91c2UgTW9kZSBmb3JtYXQgKHN0YW5kYXJkIG1vdXNlIGZvcm1hdCwgc2FucyBtaWRkbGUgYnV0dG9uKQorICoKKyAqIGJ5dGUgMDoJeS1vdmVyCXgtb3Zlcgl5LW5lZwl4LW5lZwkxCTAJc3dyCXN3bAorICogYnl0ZSAxOgl4Nwl4Ngl4NQl4NAl4Mwl4Mgl4MQl4MAorICogYnl0ZSAyOgl5Nwl5Ngl5NQl5NAl5Mwl5Mgl5MQl5MAorICoKKyAqIHN3ci9zd2wgYXJlIHRoZSBsZWZ0L3JpZ2h0IGJ1dHRvbnMuCisgKiB4LW5lZy95LW5lZyBhcmUgdGhlIHggYW5kIHkgZGVsdGEgbmVnYXRpdmUgYml0cworICogeC1vdmVyL3ktb3ZlciBhcmUgdGhlIHggYW5kIHkgb3ZlcmZsb3cgYml0cworICovCitzdGF0aWMgaW50IGhncGtfdmFsaWRhdGVfYnl0ZSh1bnNpZ25lZCBjaGFyICpwYWNrZXQpCit7CisJcmV0dXJuIChwYWNrZXRbMF0gJiAweDBDKSA9PSAweDA4OworfQorCitzdGF0aWMgdm9pZCBoZ3BrX3Byb2Nlc3NfcGFja2V0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisJaW50IHgsIHksIGxlZnQsIHJpZ2h0OworCisJbGVmdCA9IHBhY2tldFswXSAmIDE7CisJcmlnaHQgPSAocGFja2V0WzBdID4+IDEpICYgMTsKKworCXggPSBwYWNrZXRbMV0gLSAoKHBhY2tldFswXSA8PCA0KSAmIDB4MTAwKTsKKwl5ID0gKChwYWNrZXRbMF0gPDwgMykgJiAweDEwMCkgLSBwYWNrZXRbMl07CisKKwloZ3BrX2p1bXB5X2hhY2socHNtb3VzZSwgeCwgeSk7CisJaGdwa19zcGV3aW5nX2hhY2socHNtb3VzZSwgbGVmdCwgcmlnaHQsIHgsIHkpOworCisJaWYgKHRwZGVidWcpCisJCWhncGtfZGJnKHBzbW91c2UsICJsPSVkIHI9JWQgeD0lZCB5PSVkXG4iLCBsZWZ0LCByaWdodCwgeCwgeSk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGxlZnQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHJpZ2h0KTsKKworCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgeCk7CisJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCB5KTsKKworCWlucHV0X3N5bmMoZGV2KTsKK30KKworc3RhdGljIHBzbW91c2VfcmV0X3QgaGdwa19wcm9jZXNzX2J5dGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGhncGtfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisKKwlpZiAoaGdwa192YWxpZGF0ZV9ieXRlKHBzbW91c2UtPnBhY2tldCkpIHsKKwkJaGdwa19kYmcocHNtb3VzZSwgIiVzOiAoJWQpICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCV9fZnVuY19fLCBwc21vdXNlLT5wa3RjbnQsIHBzbW91c2UtPnBhY2tldFswXSwKKwkJCQlwc21vdXNlLT5wYWNrZXRbMV0sIHBzbW91c2UtPnBhY2tldFsyXSk7CisJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOworCX0KKworCWlmIChwc21vdXNlLT5wa3RjbnQgPj0gcHNtb3VzZS0+cGt0c2l6ZSkgeworCQloZ3BrX3Byb2Nlc3NfcGFja2V0KHBzbW91c2UpOworCQlyZXR1cm4gUFNNT1VTRV9GVUxMX1BBQ0tFVDsKKwl9CisKKwlpZiAocHJpdi0+cmVjYWxpYl93aW5kb3cpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHByaXYtPnJlY2FsaWJfd2luZG93KSkgeworCQkJLyoKKwkJCSAqIHVnaCwgZ290IGEgcGFja2V0IGluc2lkZSBvdXIgcmVjYWxpYnJhdGlvbgorCQkJICogd2luZG93LCBzY2hlZHVsZSBhbm90aGVyIHJlY2FsaWJyYXRpb24uCisJCQkgKi8KKwkJCWhncGtfZGJnKHBzbW91c2UsCisJCQkJICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgIgorCQkJCSAicXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKKwkJCXBzbW91c2VfcXVldWVfd29yayhwc21vdXNlLCAmcHJpdi0+cmVjYWxpYl93cSwKKwkJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCX0KKwkJcHJpdi0+cmVjYWxpYl93aW5kb3cgPSAwOworCX0KKworCXJldHVybiBQU01PVVNFX0dPT0RfREFUQTsKK30KKworc3RhdGljIGludCBoZ3BrX2ZvcmNlX3JlY2FsaWJyYXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBwczJkZXYgKnBzMmRldiA9ICZwc21vdXNlLT5wczJkZXY7CisJc3RydWN0IGhncGtfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisKKwkvKiBDLXNlcmllcyB0b3VjaHBhZHMgYWRkZWQgdGhlIHJlY2FsaWJyYXRlIGNvbW1hbmQgKi8KKwlpZiAocHNtb3VzZS0+bW9kZWwgPCBIR1BLX01PREVMX0MpCisJCXJldHVybiAwOworCisJLyogd2UgZG9uJ3Qgd2FudCB0byByYWNlIHdpdGggdGhlIGlycSBoYW5kbGVyLCBub3Igd2l0aCByZXN5bmNzICovCisJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JTklUSUFMSVpJTkcpOworCisJLyogc3RhcnQgYnkgcmVzZXR0aW5nIHRoZSBkZXZpY2UgKi8KKwlwc21vdXNlX3Jlc2V0KHBzbW91c2UpOworCisJLyogc2VuZCB0aGUgcmVjYWxpYnJhdGUgcmVxdWVzdCAqLworCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZjUpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgMHhmNSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCAweGU2KSB8fAorCSAgICBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZjUpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhY2NvcmRpbmcgdG8gQUxQUywgMTUwbVMgaXMgcmVxdWlyZWQgZm9yIHJlY2FsaWJyYXRpb24gKi8KKwltc2xlZXAoMTUwKTsKKworCS8qIFhYWDogSWYgYSBmaW5nZXIgaXMgZG93biBkdXJpbmcgdGhpcyBkZWxheSwgcmVjYWxpYnJhdGlvbiB3aWxsCisJICogZGV0ZWN0IGNhcGFjaXRhbmNlIGluY29ycmVjdGx5LiAgVGhpcyBpcyBhIGhhcmR3YXJlIGJ1ZywgYW5kCisJICogd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRlYWwgd2l0aCBpdC4gIFRoZSAycyB3aW5kb3cgc3R1ZmYKKwkgKiAoYmVsb3cpIGlzIG91ciBiZXN0IG9wdGlvbiBmb3Igbm93LgorCSAqLworCisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfRU5BQkxFKSkKKwkJcmV0dXJuIC0xOworCisJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOworCisJLyogQWZ0ZXIgd2UgcmVjYWxpYnJhdGUsIHdlIHNob3VsZG4ndCBnZXQgYW55IHBhY2tldHMgZm9yIDJzLiAgSWYKKwkgKiB3ZSBkbywgaXQncyBsaWtlbHkgdGhhdCBzb21lb25lJ3MgZmluZ2VyIHdhcyBvbiB0aGUgdG91Y2hwYWQuCisJICogSWYgc29tZW9uZSdzIGZpbmdlciAqd2FzKiBvbiB0aGUgdG91Y2hwYWQsIGl0J3MgcHJvYmFibHkKKwkgKiBtaXNjYWxpYnJhdGVkLiAgU28sIHdlIHNob3VsZCBzY2hlZHVsZSBhbm90aGVyIHJlY2FsaWJyYXRpb24KKwkgKi8KKwlwcml2LT5yZWNhbGliX3dpbmRvdyA9IGppZmZpZXMgKyAgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBraWxscyBwb3dlciB0byB0aGUgdG91Y2hwYWQ7IGFjY29yZGluZyB0byBBTFBTLCBjdXJyZW50IGNvbnN1bXB0aW9uCisgKiBnb2VzIGRvd24gdG8gNTB1QSBhZnRlciBydW5uaW5nIHRoaXMuICBUbyB0dXJuIHBvd2VyIGJhY2sgb24sIHdlIGRyaXZlCisgKiBNUy1EQVQgbG93LgorICovCitzdGF0aWMgaW50IGhncGtfdG9nZ2xlX3Bvd2VyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBwczJkZXYgKnBzMmRldiA9ICZwc21vdXNlLT5wczJkZXY7CisJaW50IHRpbWVvOworCisJLyogQWRkZWQgb24gRC1zZXJpZXMgdG91Y2hwYWRzICovCisJaWYgKHBzbW91c2UtPm1vZGVsIDwgSEdQS19NT0RFTF9EKQorCQlyZXR1cm4gMDsKKworCWlmIChlbmFibGUpIHsKKwkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JTklUSUFMSVpJTkcpOworCisJCS8qCisJCSAqIFNlbmRpbmcgYSBieXRlIHdpbGwgZHJpdmUgTVMtREFUIGxvdzsgdGhpcyB3aWxsIHdha2UgdXAKKwkJICogdGhlIGNvbnRyb2xsZXIuICBPbmNlIHdlIGdldCBhbiBBQ0sgYmFjayBmcm9tIGl0LCBpdAorCQkgKiBtZWFucyB3ZSBjYW4gY29udGludWUgd2l0aCB0aGUgdG91Y2hwYWQgcmUtaW5pdC4gIEFMUFMKKwkJICogdGVsbHMgdXMgdGhhdCAxcyBzaG91bGQgYmUgbG9uZyBlbm91Z2gsIHNvIHNldCB0aGF0IGFzCisJCSAqIHRoZSB1cHBlciBib3VuZC4KKwkJICovCisJCWZvciAodGltZW8gPSAyMDsgdGltZW8gPiAwOyB0aW1lby0tKSB7CisJCQlpZiAoIXBzMl9zZW5kYnl0ZSgmcHNtb3VzZS0+cHMyZGV2LAorCQkJCQlQU01PVVNFX0NNRF9ESVNBQkxFLCAyMCkpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoNTApOworCQl9CisKKwkJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKKworCQkvKiBzaG91bGQgYmUgYWxsIHNldCwgZW5hYmxlIHRoZSB0b3VjaHBhZCAqLworCQlwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9FTkFCTEUpOworCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0FDVElWQVRFRCk7CisKKwl9IGVsc2UgeworCQloZ3BrX2RiZyhwc21vdXNlLCAiUG93ZXJpbmcgb2ZmIHRvdWNocGFkLlxuIik7CisJCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKworCQlpZiAocHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCAweGVjKSB8fAorCQkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCAweGVjKSB8fAorCQkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBOVUxMLCAweGVhKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogcHJvYmFibHkgd29uJ3Qgc2VlIGFuIEFDSywgdGhlIHRvdWNocGFkIHdpbGwgYmUgb2ZmICovCisJCXBzMl9zZW5kYnl0ZSgmcHNtb3VzZS0+cHMyZGV2LCAweGVjLCAyMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGdwa19wb2xsKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCS8qIFdlIGNhbid0IHBvbGwsIHNvIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4gKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgaGdwa19yZWNvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJLyogRHVyaW5nIHN1c3BlbmQvcmVzdW1lIHRoZSBwczIgcmFpbHMgcmVtYWluIHBvd2VyZWQuICBXZSBkb24ndCB3YW50CisJICogdG8gZG8gYSByZXNldCBiZWNhdXNlIGl0J3MgZmx1c2ggZGF0YSBvdXQgb2YgYnVmZmVyczsgaG93ZXZlciwKKwkgKiBlYXJsaWVyIHByb3RvdHlwZXMgKEIxKSBoYWQgc29tZSBicm9rZW5uZXNzIHRoYXQgcmVxdWlyZWQgYSByZXNldC4gKi8KKwlpZiAob2xwY19ib2FyZF9hdF9sZWFzdChvbHBjX2JvYXJkKDB4YjIpKSkKKwkJaWYgKHBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICE9CisJCQkJUE1fRVZFTlRfT04pCisJCQlyZXR1cm4gMDsKKworCXBzbW91c2VfcmVzZXQocHNtb3VzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaGdwa19zaG93X3Bvd2VyZWQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKmRhdGEsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGdwa19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT5wb3dlcmVkKTsKK30KKworc3RhdGljIHNzaXplX3QgaGdwa19zZXRfcG93ZXJlZChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdm9pZCAqZGF0YSwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGdwa19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCBlcnI7CisKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChlcnIgfHwgdmFsdWUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2YWx1ZSAhPSBwcml2LT5wb3dlcmVkKSB7CisJCS8qCisJCSAqIGhncGtfdG9nZ2xlX3Bvd2VyIHdpbGwgZGVhbCB3LyBzdGF0ZSBzbworCQkgKiB3ZSdyZSBub3QgcmFjaW5nIHcvIGlycQorCQkgKi8KKwkJZXJyID0gaGdwa190b2dnbGVfcG93ZXIocHNtb3VzZSwgdmFsdWUpOworCQlpZiAoIWVycikKKwkJCXByaXYtPnBvd2VyZWQgPSB2YWx1ZTsKKwl9CisKKwlyZXR1cm4gZXJyID8gZXJyIDogY291bnQ7Cit9CisKK19fUFNNT1VTRV9ERUZJTkVfQVRUUihwb3dlcmVkLCBTX0lXVVNSIHwgU19JUlVHTywgTlVMTCwKKwkJICAgICAgaGdwa19zaG93X3Bvd2VyZWQsIGhncGtfc2V0X3Bvd2VyZWQsIDApOworCitzdGF0aWMgdm9pZCBoZ3BrX2Rpc2Nvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGhncGtfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAorCQkJICAgJnBzbW91c2VfYXR0cl9wb3dlcmVkLmRhdHRyKTsKKwlwc21vdXNlX3Jlc2V0KHBzbW91c2UpOworCWtmcmVlKHByaXYpOworfQorCitzdGF0aWMgdm9pZCBoZ3BrX3JlY2FsaWJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqdyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaGdwa19kYXRhICpwcml2ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBoZ3BrX2RhdGEsIHJlY2FsaWJfd3EpOworCXN0cnVjdCBwc21vdXNlICpwc21vdXNlID0gcHJpdi0+cHNtb3VzZTsKKworCWhncGtfZGJnKHBzbW91c2UsICJyZWNhbGlicmF0aW5nIHRvdWNocGFkLi5cbiIpOworCisJaWYgKGhncGtfZm9yY2VfcmVjYWxpYnJhdGUocHNtb3VzZSkpCisJCWhncGtfZXJyKHBzbW91c2UsICJyZWNhbGlicmF0aW9uIGZhaWxlZCFcbiIpOworfQorCitzdGF0aWMgaW50IGhncGtfcmVnaXN0ZXIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OworCWludCBlcnI7CisKKwkvKiB1bnNldCB0aGUgdGhpbmdzIHRoYXQgcHNtb3VzZS1iYXNlIHNldHMgd2hpY2ggd2UgZG9uJ3QgaGF2ZSAqLworCV9fY2xlYXJfYml0KEJUTl9NSURETEUsIGRldi0+a2V5Yml0KTsKKworCS8qIHNldCB0aGUgdGhpbmdzIHdlIGRvIGhhdmUgKi8KKwlfX3NldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKKwlfX3NldF9iaXQoRVZfUkVMLCBkZXYtPmV2Yml0KTsKKworCV9fc2V0X2JpdChSRUxfWCwgZGV2LT5yZWxiaXQpOworCV9fc2V0X2JpdChSRUxfWSwgZGV2LT5yZWxiaXQpOworCisJX19zZXRfYml0KEJUTl9MRUZULCBkZXYtPmtleWJpdCk7CisJX19zZXRfYml0KEJUTl9SSUdIVCwgZGV2LT5rZXliaXQpOworCisJLyogcmVnaXN0ZXIgaGFuZGxlcnMgKi8KKwlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gaGdwa19wcm9jZXNzX2J5dGU7CisJcHNtb3VzZS0+cG9sbCA9IGhncGtfcG9sbDsKKwlwc21vdXNlLT5kaXNjb25uZWN0ID0gaGdwa19kaXNjb25uZWN0OworCXBzbW91c2UtPnJlY29ubmVjdCA9IGhncGtfcmVjb25uZWN0OworCXBzbW91c2UtPnBrdHNpemUgPSAzOworCisJLyogRGlzYWJsZSB0aGUgaWRsZSByZXN5bmMuICovCisJcHNtb3VzZS0+cmVzeW5jX3RpbWUgPSAwOworCS8qIFJlc2V0IGFmdGVyIGEgbG90IG9mIGJhZCBieXRlcy4gKi8KKwlwc21vdXNlLT5yZXNldGFmdGVyID0gMTAyNDsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYsCisJCQkJICZwc21vdXNlX2F0dHJfcG93ZXJlZC5kYXR0cik7CisJaWYgKGVycikKKwkJaGdwa19lcnIocHNtb3VzZSwgIkZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBoZ3BrX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGhncGtfZGF0YSAqcHJpdjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGdwa19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlnb3RvIGFsbG9jX2ZhaWw7CisKKwlwc21vdXNlLT5wcml2YXRlID0gcHJpdjsKKwlwcml2LT5wc21vdXNlID0gcHNtb3VzZTsKKwlwcml2LT5wb3dlcmVkID0gMTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cmVjYWxpYl93cSwgaGdwa19yZWNhbGliX3dvcmspOworCisJZXJyID0gcHNtb3VzZV9yZXNldChwc21vdXNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGluaXRfZmFpbDsKKworCWVyciA9IGhncGtfcmVnaXN0ZXIocHNtb3VzZSk7CisJaWYgKGVycikKKwkJZ290byBpbml0X2ZhaWw7CisKKwlyZXR1cm4gMDsKKworaW5pdF9mYWlsOgorCWtmcmVlKHByaXYpOworYWxsb2NfZmFpbDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgZW51bSBoZ3BrX21vZGVsX3QgaGdwa19nZXRfbW9kZWwoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJnBzbW91c2UtPnBzMmRldjsKKwl1bnNpZ25lZCBjaGFyIHBhcmFtWzNdOworCisJLyogRTcsIEU3LCBFNywgRTkgZ2V0cyB1cyBhIDMgYnl0ZSBpZGVudGlmaWVyICovCisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNDQUxFMjEpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNDQUxFMjEpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNDQUxFMjEpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX0dFVElORk8pKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWhncGtfZGJnKHBzbW91c2UsICJJRDogJTAyeCAlMDJ4ICUwMngiLCBwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKKworCS8qIEhHUEsgc2lnbmF0dXJlOiAweDY3LCAweDAwLCAweDxtb2RlbD4gKi8KKwlpZiAocGFyYW1bMF0gIT0gMHg2NyB8fCBwYXJhbVsxXSAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWhncGtfaW5mbyhwc21vdXNlLCAiT0xQQyB0b3VjaHBhZCByZXZpc2lvbiAweCV4XG4iLCBwYXJhbVsyXSk7CisKKwlyZXR1cm4gcGFyYW1bMl07Cit9CisKK2ludCBoZ3BrX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQoreworCWludCB2ZXJzaW9uOworCisJdmVyc2lvbiA9IGhncGtfZ2V0X21vZGVsKHBzbW91c2UpOworCWlmICh2ZXJzaW9uIDwgMCkKKwkJcmV0dXJuIHZlcnNpb247CisKKwlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKKwkJcHNtb3VzZS0+dmVuZG9yID0gIkFMUFMiOworCQlwc21vdXNlLT5uYW1lID0gIkhHUEsiOworCQlwc21vdXNlLT5tb2RlbCA9IHZlcnNpb247CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjJhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogT0xQQyBIR1BLIChYTy0xKSB0b3VjaHBhZCBQUy8yIG1vdXNlIGRyaXZlcgorICovCisKKyNpZm5kZWYgX0hHUEtfSAorI2RlZmluZSBfSEdQS19ICisKK2VudW0gaGdwa19tb2RlbF90IHsKKwlIR1BLX01PREVMX1BSRUEgPSAweDBhLAkvKiBwcmUtQjFzICovCisJSEdQS19NT0RFTF9BID0gMHgxNCwJLyogZm91bmQgb24gQjFzLCBQVCBkaXNhYmxlZCBpbiBoYXJkd2FyZSAqLworCUhHUEtfTU9ERUxfQiA9IDB4MjgsCS8qIEIycywgaGFzIGNhcGFjaXRhbmNlIGlzc3VlcyAqLworCUhHUEtfTU9ERUxfQyA9IDB4M2MsCisJSEdQS19NT0RFTF9EID0gMHg1MCwJLyogQzEsIG1hc3MgcHJvZHVjdGlvbiAqLworfTsKKworc3RydWN0IGhncGtfZGF0YSB7CisJc3RydWN0IHBzbW91c2UgKnBzbW91c2U7CisJaW50IHBvd2VyZWQ7CisJaW50IGNvdW50LCB4X3RhbGx5LCB5X3RhbGx5OwkvKiBoYXJkd2FyZSB3b3JrYXJvdW5kIHN0dWZmICovCisJdW5zaWduZWQgbG9uZyByZWNhbGliX3dpbmRvdzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJlY2FsaWJfd3E7Cit9OworCisjZGVmaW5lIGhncGtfZGJnKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAorCWRldl9kYmcoJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsIGZvcm1hdCwgIyMgYXJnKQorI2RlZmluZSBoZ3BrX2Vycihwc21vdXNlLCBmb3JtYXQsIGFyZy4uLikJCVwKKwlkZXZfZXJyKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgaGdwa19pbmZvKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAorCWRldl9pbmZvKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgaGdwa193YXJuKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAorCWRldl93YXJuKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKKyNkZWZpbmUgaGdwa19ub3RpY2UocHNtb3VzZSwgZm9ybWF0LCBhcmcuLi4pCQlcCisJZGV2X25vdGljZSgmKHBzbW91c2UpLT5wczJkZXYuc2VyaW8tPmRldiwgZm9ybWF0LCAjIyBhcmcpCisKKyNpZmRlZiBDT05GSUdfTU9VU0VfUFMyX09MUEMKK2ludCBoZ3BrX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKTsKK2ludCBoZ3BrX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGhncGtfZGV0ZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgc2V0X3Byb3BlcnRpZXMpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CitzdGF0aWMgaW5saW5lIGludCBoZ3BrX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCAwYzU2NjBkLi4zOTBmMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTE1NywxMCArMTU3LDggQEAKIHN0YXRpYyBzc2l6ZV90IHBzMnBwX2F0dHJfc2V0X3NtYXJ0c2Nyb2xsKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWNoYXIgKnJlc3Q7CiAKLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKLQlpZiAoKnJlc3QgfHwgdmFsdWUgPiAxKQorCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpIHx8IHZhbHVlID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwczJwcF9zZXRfc21hcnRzY3JvbGwocHNtb3VzZSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKaW5kZXggZjVhNmJlMS4uMTI2ZTk3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAic3luYXB0aWNzLmgiCiAjaW5jbHVkZSAibG9naXBzMnBwLmgiCiAjaW5jbHVkZSAiYWxwcy5oIgorI2luY2x1ZGUgImhncGsuaCIKICNpbmNsdWRlICJsaWZlYm9vay5oIgogI2luY2x1ZGUgInRyYWNrcG9pbnQuaCIKICNpbmNsdWRlICJ0b3VjaGtpdF9wczIuaCIKQEAgLTIwMSw2ICsyMDIsMTIgQEAKIAlyZXR1cm4gUFNNT1VTRV9GVUxMX1BBQ0tFVDsKIH0KIAordm9pZCBwc21vdXNlX3F1ZXVlX3dvcmsoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssCisJCXVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGtwc21vdXNlZF93cSwgd29yaywgZGVsYXkpOworfQorCiAvKgogICogX19wc21vdXNlX3NldF9zdGF0ZSgpIHNldHMgbmV3IHBzbW91c2Ugc3RhdGUgYW5kIHJlc2V0cyBhbGwgZmxhZ3MuCiAgKi8KQEAgLTIyMCw3ICsyMjcsNyBAQAogICogaXMgbm90IGEgY29uY2Vybi4KICAqLwogCi1zdGF0aWMgdm9pZCBwc21vdXNlX3NldF9zdGF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgZW51bSBwc21vdXNlX3N0YXRlIG5ld19zdGF0ZSkKK3ZvaWQgcHNtb3VzZV9zZXRfc3RhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGVudW0gcHNtb3VzZV9zdGF0ZSBuZXdfc3RhdGUpCiB7CiAJc2VyaW9fcGF1c2VfcngocHNtb3VzZS0+cHMyZGV2LnNlcmlvKTsKIAlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIG5ld19zdGF0ZSk7CkBAIC0zMDUsNyArMzEyLDcgQEAKIAkJICAgICAgIHBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7CiAJCXBzbW91c2UtPmJhZGJ5dGUgPSBwc21vdXNlLT5wYWNrZXRbMF07CiAJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOwotCQlxdWV1ZV93b3JrKGtwc21vdXNlZF93cSwgJnBzbW91c2UtPnJlc3luY193b3JrKTsKKwkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwc21vdXNlLT5yZXN5bmNfd29yaywgMCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzQyLDcgKzM0OSw3IEBACiAJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcHNtb3VzZS0+bGFzdCArIHBzbW91c2UtPnJlc3luY190aW1lICogSFopKSB7CiAJCXBzbW91c2UtPmJhZGJ5dGUgPSBwc21vdXNlLT5wYWNrZXRbMF07CiAJCV9fcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9SRVNZTkNJTkcpOwotCQlxdWV1ZV93b3JrKGtwc21vdXNlZF93cSwgJnBzbW91c2UtPnJlc3luY193b3JrKTsKKwkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwc21vdXNlLT5yZXN5bmNfd29yaywgMCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjMwLDggKzYzNywyMCBAQAogCQl9CiAJfQogCi0JaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCkgeworLyoKKyAqIFRyeSBPTFBDIEhHUEsgdG91Y2hwYWQuCisgKi8KKwlpZiAobWF4X3Byb3RvID4gUFNNT1VTRV9JTUVYICYmCisJCQloZ3BrX2RldGVjdChwc21vdXNlLCBzZXRfcHJvcGVydGllcykgPT0gMCkgeworCQlpZiAoIXNldF9wcm9wZXJ0aWVzIHx8IGhncGtfaW5pdChwc21vdXNlKSA9PSAwKQorCQkJcmV0dXJuIFBTTU9VU0VfSEdQSzsKKy8qCisgKiBJbml0IGZhaWxlZCwgdHJ5IGJhc2ljIHJlbGF0aXZlIHByb3RvY29scworICovCisJCW1heF9wcm90byA9IFBTTU9VU0VfSU1FWDsKKwl9CiAKKwlpZiAobWF4X3Byb3RvID4gUFNNT1VTRV9JTUVYKSB7CiAJCWlmIChnZW5pdXNfZGV0ZWN0KHBzbW91c2UsIHNldF9wcm9wZXJ0aWVzKSA9PSAwKQogCQkJcmV0dXJuIFBTTU9VU0VfR0VOUFM7CiAKQEAgLTc2Miw2ICs3ODEsMTQgQEAKIAkJLmRldGVjdAkJPSB0b3VjaGtpdF9wczJfZGV0ZWN0LAogCX0sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTU9VU0VfUFMyX09MUEMKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfSEdQSywKKwkJLm5hbWUJCT0gIk9MUEMgSEdQSyIsCisJCS5hbGlhcwkJPSAiaGdwayIsCisJCS5kZXRlY3QJCT0gaGdwa19kZXRlY3QsCisJfSwKKyNlbmRpZgogCXsKIAkJLnR5cGUJCT0gUFNNT1VTRV9DT1JUUk9OLAogCQkubmFtZQkJPSAiQ29ydHJvblBTLzIiLApAQCAtOTM1LDcgKzk2Miw3IEBACiBzdGF0aWMgdm9pZCBwc21vdXNlX3Jlc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHBzbW91c2UgKnBhcmVudCA9IE5VTEwsICpwc21vdXNlID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwc21vdXNlLCByZXN5bmNfd29yayk7CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcHNtb3VzZSwgcmVzeW5jX3dvcmsud29yayk7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKIAlwc21vdXNlX3JldF90IHJjID0gUFNNT1VTRV9HT09EX0RBVEE7CiAJaW50IGZhaWxlZCA9IDAsIGVuYWJsZWQgPSAwOwpAQCAtMTE5NCw3ICsxMjIxLDcgQEAKIAkJZ290byBlcnJfZnJlZTsKIAogCXBzMl9pbml0KCZwc21vdXNlLT5wczJkZXYsIHNlcmlvKTsKLQlJTklUX1dPUksoJnBzbW91c2UtPnJlc3luY193b3JrLCBwc21vdXNlX3Jlc3luYyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnBzbW91c2UtPnJlc3luY193b3JrLCBwc21vdXNlX3Jlc3luYyk7CiAJcHNtb3VzZS0+ZGV2ID0gaW5wdXRfZGV2OwogCXNucHJpbnRmKHBzbW91c2UtPnBoeXMsIHNpemVvZihwc21vdXNlLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIApAQCAtMTM5NSwyNSArMTQyMiwyOSBAQAogCiAJcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAotCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0lHTk9SRSkgewotCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQorCWlmIChhdHRyLT5wcm90ZWN0KSB7CisJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0lHTk9SRSkgeworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQogCi0JaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7Ci0JCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwotCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKLQl9CisJCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgeworCQkJcGFyZW50ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8tPnBhcmVudCk7CisJCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKKwkJfQogCi0JcHNtb3VzZV9kZWFjdGl2YXRlKHBzbW91c2UpOworCQlwc21vdXNlX2RlYWN0aXZhdGUocHNtb3VzZSk7CisJfQogCiAJcmV0dmFsID0gYXR0ci0+c2V0KHBzbW91c2UsIGF0dHItPmRhdGEsIGJ1ZiwgY291bnQpOwogCi0JaWYgKHJldHZhbCAhPSAtRU5PREVWKQotCQlwc21vdXNlX2FjdGl2YXRlKHBzbW91c2UpOworCWlmIChhdHRyLT5wcm90ZWN0KSB7CisJCWlmIChyZXR2YWwgIT0gLUVOT0RFVikKKwkJCXBzbW91c2VfYWN0aXZhdGUocHNtb3VzZSk7CiAKLQlpZiAocGFyZW50KQotCQlwc21vdXNlX2FjdGl2YXRlKHBhcmVudCk7CisJCWlmIChwYXJlbnQpCisJCQlwc21vdXNlX2FjdGl2YXRlKHBhcmVudCk7CisJfQogCiAgb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJnBzbW91c2VfbXV0ZXgpOwpAQCAtMTQzMywxMCArMTQ2NCw4IEBACiB7CiAJdW5zaWduZWQgaW50ICpmaWVsZCA9ICh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKilwc21vdXNlICsgKHNpemVfdClvZmZzZXQpOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY2hhciAqcmVzdDsKIAotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOwotCWlmICgqcmVzdCkKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKHVuc2lnbmVkIGludCl2YWx1ZSAhPSB2YWx1ZSkKQEAgLTE1NDksMTAgKzE1NzgsOCBAQAogc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9yYXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwotCWNoYXIgKnJlc3Q7CiAKLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJnJlc3QsIDEwKTsKLQlpZiAoKnJlc3QpCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHNtb3VzZS0+c2V0X3JhdGUocHNtb3VzZSwgdmFsdWUpOwpAQCAtMTU2MiwxMCArMTU4OSw4IEBACiBzdGF0aWMgc3NpemVfdCBwc21vdXNlX2F0dHJfc2V0X3Jlc29sdXRpb24oc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY2hhciAqcmVzdDsKIAotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOwotCWlmICgqcmVzdCkKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwc21vdXNlLT5zZXRfcmVzb2x1dGlvbihwc21vdXNlLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCmluZGV4IDEzMTdiZGQuLjhiNjA4YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCkBAIC0zOSw3ICszOSw3IEBACiAJdm9pZCAqcHJpdmF0ZTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CiAJc3RydWN0IHBzMmRldiBwczJkZXY7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHJlc3luY193b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVzeW5jX3dvcms7CiAJY2hhciAqdmVuZG9yOwogCWNoYXIgKm5hbWU7CiAJdW5zaWduZWQgY2hhciBwYWNrZXRbOF07CkBAIC04OSwyMCArODksMjQgQEAKIAlQU01PVVNFX1RSQUNLUE9JTlQsCiAJUFNNT1VTRV9UT1VDSEtJVF9QUzIsCiAJUFNNT1VTRV9DT1JUUk9OLAorCVBTTU9VU0VfSEdQSywKIAlQU01PVVNFX0FVVE8JCS8qIFRoaXMgb25lIHNob3VsZCBhbHdheXMgYmUgbGFzdCAqLwogfTsKIAordm9pZCBwc21vdXNlX3F1ZXVlX3dvcmsoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssCisJCXVuc2lnbmVkIGxvbmcgZGVsYXkpOwogaW50IHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCk7CiBpbnQgcHNtb3VzZV9yZXNldChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSk7Cit2b2lkIHBzbW91c2Vfc2V0X3N0YXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBlbnVtIHBzbW91c2Vfc3RhdGUgbmV3X3N0YXRlKTsKIHZvaWQgcHNtb3VzZV9zZXRfcmVzb2x1dGlvbihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdW5zaWduZWQgaW50IHJlc29sdXRpb24pOwogCi0KIHN0cnVjdCBwc21vdXNlX2F0dHJpYnV0ZSB7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGF0dHI7CiAJdm9pZCAqZGF0YTsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKmRhdGEsIGNoYXIgKmJ1Zik7CiAJc3NpemVfdCAoKnNldCkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHZvaWQgKmRhdGEsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJaW50IHByb3RlY3Q7CiB9OwogI2RlZmluZSB0b19wc21vdXNlX2F0dHIoYSkJY29udGFpbmVyX29mKChhKSwgc3RydWN0IHBzbW91c2VfYXR0cmlidXRlLCBkYXR0cikKIApAQCAtMTExLDcgKzExNSw3IEBACiBzc2l6ZV90IHBzbW91c2VfYXR0cl9zZXRfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogCi0jZGVmaW5lIFBTTU9VU0VfREVGSU5FX0FUVFIoX25hbWUsIF9tb2RlLCBfZGF0YSwgX3Nob3csIF9zZXQpCQkJXAorI2RlZmluZSBfX1BTTU9VU0VfREVGSU5FX0FUVFIoX25hbWUsIF9tb2RlLCBfZGF0YSwgX3Nob3csIF9zZXQsIF9wcm90ZWN0KQlcCiBzdGF0aWMgc3NpemVfdCBfc2hvdyhzdHJ1Y3QgcHNtb3VzZSAqLCB2b2lkICpkYXRhLCBjaGFyICopOwkJCVwKIHN0YXRpYyBzc2l6ZV90IF9zZXQoc3RydWN0IHBzbW91c2UgKiwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqLCBzaXplX3QpOwlcCiBzdGF0aWMgc3RydWN0IHBzbW91c2VfYXR0cmlidXRlIHBzbW91c2VfYXR0cl8jI19uYW1lID0gewkJCVwKQEAgLTEyNiw2ICsxMzAsMTAgQEAKIAkuZGF0YQk9IF9kYXRhLAkJCQkJCQlcCiAJLnNob3cJPSBfc2hvdywJCQkJCQkJXAogCS5zZXQJPSBfc2V0LAkJCQkJCQkJXAorCS5wcm90ZWN0ID0gX3Byb3RlY3QsCQkJCQkJCVwKIH0KIAorI2RlZmluZSBQU01PVVNFX0RFRklORV9BVFRSKF9uYW1lLCBfbW9kZSwgX2RhdGEsIF9zaG93LCBfc2V0KQlcCisJCV9fUFNNT1VTRV9ERUZJTkVfQVRUUihfbmFtZSwgX21vZGUsIF9kYXRhLCBfc2hvdywgX3NldCwgMSkKKwogI2VuZGlmIC8qIF9QU01PVVNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKaW5kZXggMjZiODQ1Zi4uZTY4YzgxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKQEAgLTg5LDEwICs4OSw4IEBACiAJc3RydWN0IHRyYWNrcG9pbnRfYXR0cl9kYXRhICphdHRyID0gZGF0YTsKIAl1bnNpZ25lZCBjaGFyICpmaWVsZCA9ICh1bnNpZ25lZCBjaGFyICopKChjaGFyICopdHAgKyBhdHRyLT5maWVsZF9vZmZzZXQpOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY2hhciAqcmVzdDsKIAotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOwotCWlmICgqcmVzdCB8fCB2YWx1ZSA+IDI1NSkKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSB8fCB2YWx1ZSA+IDI1NSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqZmllbGQgPSB2YWx1ZTsKQEAgLTExNywxMCArMTE1LDggQEAKIAlzdHJ1Y3QgdHJhY2twb2ludF9hdHRyX2RhdGEgKmF0dHIgPSBkYXRhOwogCXVuc2lnbmVkIGNoYXIgKmZpZWxkID0gKHVuc2lnbmVkIGNoYXIgKikoKGNoYXIgKil0cCArIGF0dHItPmZpZWxkX29mZnNldCk7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQljaGFyICpyZXN0OwogCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7Ci0JaWYgKCpyZXN0IHx8IHZhbHVlID4gMSkKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKSB8fCB2YWx1ZSA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGF0dHItPmludmVydGVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMKaW5kZXggMGQzOTU5Ny4uYmZlNDkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJCSAqIGl0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLiBhbmQgYmUgbGVzcyB2ZXJib3NlLgogCQkJICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAicmVhZCB0aW1lb3V0ICglaXVzKSFcbiIsCi0JCQkgICAgICAgdHYudHZfdXNlYyAtIGhwX3NkYy5ydHYudHZfdXNlYyk7CisJCQkgICAgICAgKGludCkodHYudHZfdXNlYyAtIGhwX3NkYy5ydHYudHZfdXNlYykpOwogCQkJY3Vyci0+aWR4ICs9IGhwX3NkYy5ycXR5OwogCQkJaHBfc2RjLnJxdHkgPSAwOwogCQkJdG1wID0gY3Vyci0+c2VxW2N1cnItPmFjdGlkeF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLWlvLmgKaW5kZXggZjQ1MWM3My4uODQ3ZjRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1pby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItaW8uaApAQCAtNjcsNyArNjcsNyBAQAogICogT24gc29tZSBwbGF0Zm9ybXMgdG91Y2hpbmcgdGhlIGk4MDQyIGRhdGEgcmVnaXN0ZXIgcmVnaW9uIGNhbiBkbyByZWFsbHkKICAqIGJhZCB0aGluZ3MuIEJlY2F1c2Ugb2YgdGhpcyB0aGUgcmVnaW9uIGlzIGFsd2F5cyByZXNlcnZlZCBvbiBzdWNoIGJveGVzLgogICovCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQorI2lmIGRlZmluZWQoQ09ORklHX1BQQykKIAlpZiAoY2hlY2tfbGVnYWN5X2lvcG9ydChJODA0Ml9EQVRBX1JFRykpCiAJCXJldHVybiAtRU5PREVWOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXNwYXJjaW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCmluZGV4IDY5MmE3OWUuLjUwNzFhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDItc3BhcmNpby5oCkBAIC04Nyw3ICs4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwYXJjX2k4MDQyX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzcGFyY19pODA0Ml9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiODA0MiIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCmluZGV4IDMyODJiNzQuLmEzMjFhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaApAQCAtMzA1LDcgKzMwNSw3IEBACiAJCS5pZGVudCA9ICJMZW5vdm8gMzAwMCBuMTAwIiwKIAkJLm1hdGNoZXMgPSB7CiAJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJMRU5PVk8iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMzAwMCBOMTAwIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjA3NjgwNFUiKSwKIAkJfSwKIAl9LAogCXsKQEAgLTMyMiw2ICszMjIsMTMgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTjM0QVM2IiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJJQk0gMjY1NiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSUJNIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjI2NTYiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKaW5kZXggYzkzOTdjOC4uNDcwNzcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCkBAIC0zNzMsNiArMzczLDEyIEBACiAJCS5pZAk9IFNFUklPX0FOWSwKIAkJLmV4dHJhCT0gU0VSSU9fQU5ZLAogCX0sCisJeworCQkudHlwZQk9IFNFUklPXzgwNDJfWEwsCisJCS5wcm90bwk9IFNFUklPX0FOWSwKKwkJLmlkCT0gU0VSSU9fQU5ZLAorCQkuZXh0cmEJPSBTRVJJT19BTlksCisJfSwKIAl7IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90YWJsZXQvYWlwdGVrLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9haXB0ZWsuYwppbmRleCA4ZjAzN2ExLi5lNTNjODM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC9haXB0ZWsuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9haXB0ZWsuYwpAQCAtMTIwMiwxNiArMTIwMiwyMiBAQAogc3RvcmVfdGFibGV0WHRpbHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGFpcHRlayAqYWlwdGVrID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHg7CisJbG9uZyB4OwogCi0JaWYgKHN0cmNtcChidWYsICJkaXNhYmxlIikgPT0gMCkgeworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ4KSkgeworCQlzaXplX3QgbGVuID0gYnVmW2NvdW50IC0gMV0gPT0gJ1xuJyA/IGNvdW50IC0gMSA6IGNvdW50OworCisJCWlmIChzdHJuY21wKGJ1ZiwgImRpc2FibGUiLCBsZW4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJYWlwdGVrLT5uZXdTZXR0aW5nLnhUaWx0ID0gQUlQVEVLX1RJTFRfRElTQUJMRTsKIAl9IGVsc2UgewotCQl4ID0gKGludClzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCQlpZiAoeCA+PSBBSVBURUtfVElMVF9NSU4gJiYgeCA8PSBBSVBURUtfVElMVF9NQVgpIHsKLQkJCWFpcHRlay0+bmV3U2V0dGluZy54VGlsdCA9IHg7Ci0JCX0KKwkJaWYgKHggPCBBSVBURUtfVElMVF9NSU4gfHwgeCA+IEFJUFRFS19USUxUX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWFpcHRlay0+bmV3U2V0dGluZy54VGlsdCA9IHg7CiAJfQorCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xMjM4LDE2ICsxMjQ0LDIyIEBACiBzdG9yZV90YWJsZXRZdGlsdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgYWlwdGVrICphaXB0ZWsgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgeTsKKwlsb25nIHk7CiAKLQlpZiAoc3RyY21wKGJ1ZiwgImRpc2FibGUiKSA9PSAwKSB7CisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnkpKSB7CisJCXNpemVfdCBsZW4gPSBidWZbY291bnQgLSAxXSA9PSAnXG4nID8gY291bnQgLSAxIDogY291bnQ7CisKKwkJaWYgKHN0cm5jbXAoYnVmLCAiZGlzYWJsZSIsIGxlbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQlhaXB0ZWstPm5ld1NldHRpbmcueVRpbHQgPSBBSVBURUtfVElMVF9ESVNBQkxFOwogCX0gZWxzZSB7Ci0JCXkgPSAoaW50KXNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7Ci0JCWlmICh5ID49IEFJUFRFS19USUxUX01JTiAmJiB5IDw9IEFJUFRFS19USUxUX01BWCkgewotCQkJYWlwdGVrLT5uZXdTZXR0aW5nLnlUaWx0ID0geTsKLQkJfQorCQlpZiAoeSA8IEFJUFRFS19USUxUX01JTiB8fCB5ID4gQUlQVEVLX1RJTFRfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJYWlwdGVrLT5uZXdTZXR0aW5nLnlUaWx0ID0geTsKIAl9CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTEyNjksOCArMTI4MSwxMiBAQAogc3RvcmVfdGFibGV0Sml0dGVyRGVsYXkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGFpcHRlayAqYWlwdGVrID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyBqOwogCi0JYWlwdGVrLT5uZXdTZXR0aW5nLmppdHRlckRlbGF5ID0gKGludClzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZqKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhaXB0ZWstPm5ld1NldHRpbmcuaml0dGVyRGVsYXkgPSAoaW50KWo7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xMjk0LDggKzEzMTAsMTIgQEAKIHN0b3JlX3RhYmxldFByb2dyYW1tYWJsZURlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBhaXB0ZWsgKmFpcHRlayA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWxvbmcgZDsKIAotCWFpcHRlay0+bmV3U2V0dGluZy5wcm9ncmFtbWFibGVEZWxheSA9IChpbnQpc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWlwdGVrLT5uZXdTZXR0aW5nLnByb2dyYW1tYWJsZURlbGF5ID0gKGludClkOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTU0MSw4ICsxNTYxLDExIEBACiBzdG9yZV90YWJsZXRXaGVlbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgYWlwdGVrICphaXB0ZWsgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlsb25nIHc7CiAKLQlhaXB0ZWstPm5ld1NldHRpbmcud2hlZWwgPSAoaW50KXNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJncpKSByZXR1cm4gLUVJTlZBTDsKKworCWFpcHRlay0+bmV3U2V0dGluZy53aGVlbCA9IChpbnQpdzsKIAlyZXR1cm4gY291bnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCAyNTI4N2U4Li42ZTFlOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC0yMjAsNiArMjIwLDcgQEAKIGNvbmZpZyBUT1VDSFNDUkVFTl9VQ0IxNDAwCiAJdHJpc3RhdGUgIlBoaWxpcHMgVUNCMTQwMCB0b3VjaHNjcmVlbiIKIAlzZWxlY3QgQUM5N19CVVMKKwlkZXBlbmRzIG9uIFVDQjE0MDBfQ09SRQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBVQ0IxNDAwIHRvdWNoc2NyZWVuIGludGVyZmFjZS4KIAkgIFRoZSBVQ0IxNDAwIGlzIGFuIEFDOTcgYXVkaW8gY29kZWMuICBUaGUgdG91Y2hzY3JlZW4gaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGNlNmY0OGMuLmI5YjdmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTY4LDYgKzY5LDE3IEBACiAJaW50CWlnbm9yZTsKIH07CiAKKy8qCisgKiBXZSBhbGxvY2F0ZSB0aGlzIHNlcGFyYXRlbHkgdG8gYXZvaWQgY2FjaGUgbGluZSBzaGFyaW5nIGlzc3VlcyB3aGVuCisgKiBkcml2ZXIgaXMgdXNlZCB3aXRoIERNQS1iYXNlZCBTUEkgY29udHJvbGxlcnMgKGxpa2UgYXRtZWxfc3BpKSBvbgorICogc3lzdGVtcyB3aGVyZSBtYWluIG1lbW9yeSBpcyBub3QgRE1BLWNvaGVyZW50IChtb3N0IG5vbi14ODYgYm9hcmRzKS4KKyAqLworc3RydWN0IGFkczc4NDZfcGFja2V0IHsKKwl1OAkJCXJlYWRfeCwgcmVhZF95LCByZWFkX3oxLCByZWFkX3oyLCBwd3Jkb3duOworCXUxNgkJCWR1bW15OwkJLyogZm9yIHRoZSBwd3Jkb3duIHJlYWQgKi8KKwlzdHJ1Y3QgdHNfZXZlbnQJCXRjOworfTsKKwogc3RydWN0IGFkczc4NDYgewogCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OwogCWNoYXIJCQlwaHlzWzMyXTsKQEAgLTg1LDkgKzk3LDcgQEAKIAl1MTYJCQl4X3BsYXRlX29obXM7CiAJdTE2CQkJcHJlc3N1cmVfbWF4OwogCi0JdTgJCQlyZWFkX3gsIHJlYWRfeSwgcmVhZF96MSwgcmVhZF96MiwgcHdyZG93bjsKLQl1MTYJCQlkdW1teTsJCS8qIGZvciB0aGUgcHdyZG93biByZWFkICovCi0Jc3RydWN0IHRzX2V2ZW50CQl0YzsKKwlzdHJ1Y3QgYWRzNzg0Nl9wYWNrZXQJKnBhY2tldDsKIAogCXN0cnVjdCBzcGlfdHJhbnNmZXIJeGZlclsxOF07CiAJc3RydWN0IHNwaV9tZXNzYWdlCW1zZ1s1XTsKQEAgLTExNiw2ICsxMjYsNyBAQAogCXZvaWQJCQkqZmlsdGVyX2RhdGE7CiAJdm9pZAkJCSgqZmlsdGVyX2NsZWFudXApKHZvaWQgKmRhdGEpOwogCWludAkJCSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOworCWludAkJCWdwaW9fcGVuZG93bjsKIH07CiAKIC8qIGxlYXZlIGNoaXAgc2VsZWN0ZWQgd2hlbiB3ZSdyZSBkb25lLCBmb3IgcXVpY2tlciByZS1zZWxlY3Q/ICovCkBAIC00NjEsMTAgKzQ3MiwxMSBAQAogCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGFkczc4NDYgKnRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JY2hhciAqZW5kcDsKLQlpbnQgaTsKKwlsb25nIGk7CiAKLQlpID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMTApOworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmaSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrX2lycSgmdHMtPmxvY2spOwogCiAJaWYgKGkpCkBAIC00OTEsNiArNTAzLDE0IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitzdGF0aWMgaW50IGdldF9wZW5kb3duX3N0YXRlKHN0cnVjdCBhZHM3ODQ2ICp0cykKK3sKKwlpZiAodHMtPmdldF9wZW5kb3duX3N0YXRlKQorCQlyZXR1cm4gdHMtPmdldF9wZW5kb3duX3N0YXRlKCk7CisKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKHRzLT5ncGlvX3BlbmRvd24pOworfQorCiAvKgogICogUEVOSVJRIG9ubHkga2lja3MgdGhlIHRpbWVyLiAgVGhlIHRpbWVyIG9ubHkgcmVpc3N1ZXMgdGhlIFNQSSB0cmFuc2ZlciwKICAqIHRvIHJldHJpZXZlIHRvdWNoc2NyZWVuIHN0YXR1cy4KQEAgLTUwMiwxNiArNTIyLDE3IEBACiBzdGF0aWMgdm9pZCBhZHM3ODQ2X3J4KHZvaWQgKmFkcykKIHsKIAlzdHJ1Y3QgYWRzNzg0NgkJKnRzID0gYWRzOworCXN0cnVjdCBhZHM3ODQ2X3BhY2tldAkqcGFja2V0ID0gdHMtPnBhY2tldDsKIAl1bnNpZ25lZAkJUnQ7CiAJdTE2CQkJeCwgeSwgejEsIHoyOwogCiAJLyogYWRzNzg0Nl9yeF92YWwoKSBkaWQgaW4tcGxhY2UgY29udmVyc2lvbiAoaW5jbHVkaW5nIGJ5dGVzd2FwKSBmcm9tCiAJICogb24tdGhlLXdpcmUgZm9ybWF0IGFzIHBhcnQgb2YgZGVib3VuY2luZyB0byBnZXQgc3RhYmxlIHJlYWRpbmdzLgogCSAqLwotCXggPSB0cy0+dGMueDsKLQl5ID0gdHMtPnRjLnk7Ci0JejEgPSB0cy0+dGMuejE7Ci0JejIgPSB0cy0+dGMuejI7CisJeCA9IHBhY2tldC0+dGMueDsKKwl5ID0gcGFja2V0LT50Yy55OworCXoxID0gcGFja2V0LT50Yy56MTsKKwl6MiA9IHBhY2tldC0+dGMuejI7CiAKIAkvKiByYW5nZSBmaWx0ZXJpbmcgKi8KIAlpZiAoeCA9PSBNQVhfMTJCSVQpCkBAIC01MzUsMTAgKzU1NiwxMCBAQAogCSAqIHRoZSBtYXhpbXVtLiBEb24ndCByZXBvcnQgaXQgdG8gdXNlciBzcGFjZSwgcmVwZWF0IGF0IGxlYXN0CiAJICogb25jZSBtb3JlIHRoZSBtZWFzdXJlbWVudAogCSAqLwotCWlmICh0cy0+dGMuaWdub3JlIHx8IFJ0ID4gdHMtPnByZXNzdXJlX21heCkgeworCWlmIChwYWNrZXQtPnRjLmlnbm9yZSB8fCBSdCA+IHRzLT5wcmVzc3VyZV9tYXgpIHsKICNpZmRlZiBWRVJCT1NFCiAJCXByX2RlYnVnKCIlczogaWdub3JlZCAlZCBwcmVzc3VyZSAlZFxuIiwKLQkJCXRzLT5zcGktPmRldi5idXNfaWQsIHRzLT50Yy5pZ25vcmUsIFJ0KTsKKwkJCXRzLT5zcGktPmRldi5idXNfaWQsIHBhY2tldC0+dGMuaWdub3JlLCBSdCk7CiAjZW5kaWYKIAkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9QRVJJT0QpLAogCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CkBAIC01NTAsNyArNTcxLDcgQEAKIAkgKi8KIAlpZiAodHMtPnBlbmlycV9yZWNoZWNrX2RlbGF5X3VzZWNzKSB7CiAJCXVkZWxheSh0cy0+cGVuaXJxX3JlY2hlY2tfZGVsYXlfdXNlY3MpOwotCQlpZiAoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSgpKQorCQlpZiAoIWdldF9wZW5kb3duX3N0YXRlKHRzKSkKIAkJCVJ0ID0gMDsKIAl9CiAKQEAgLTYzMSw2ICs2NTIsNyBAQAogc3RhdGljIHZvaWQgYWRzNzg0Nl9yeF92YWwodm9pZCAqYWRzKQogewogCXN0cnVjdCBhZHM3ODQ2ICp0cyA9IGFkczsKKwlzdHJ1Y3QgYWRzNzg0Nl9wYWNrZXQgKnBhY2tldCA9IHRzLT5wYWNrZXQ7CiAJc3RydWN0IHNwaV9tZXNzYWdlICptOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CiAJaW50IHZhbDsKQEAgLTY1MCw3ICs2NzIsNyBAQAogCWNhc2UgQURTNzg0Nl9GSUxURVJfUkVQRUFUOgogCQlicmVhazsKIAljYXNlIEFEUzc4NDZfRklMVEVSX0lHTk9SRToKLQkJdHMtPnRjLmlnbm9yZSA9IDE7CisJCXBhY2tldC0+dGMuaWdub3JlID0gMTsKIAkJLyogTGFzdCBtZXNzYWdlIHdpbGwgY29udGFpbiBhZHM3ODQ2X3J4KCkgYXMgdGhlCiAJCSAqIGNvbXBsZXRpb24gZnVuY3Rpb24uCiAJCSAqLwpAQCAtNjU4LDcgKzY4MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgQURTNzg0Nl9GSUxURVJfT0s6CiAJCSoodTE2ICopdC0+cnhfYnVmID0gdmFsOwotCQl0cy0+dGMuaWdub3JlID0gMDsKKwkJcGFja2V0LT50Yy5pZ25vcmUgPSAwOwogCQltID0gJnRzLT5tc2dbKyt0cy0+bXNnX2lkeF07CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC02NzcsNyArNjk5LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnRzLT5sb2NrKTsKIAotCWlmICh1bmxpa2VseSghdHMtPmdldF9wZW5kb3duX3N0YXRlKCkgfHwKKwlpZiAodW5saWtlbHkoIWdldF9wZW5kb3duX3N0YXRlKHRzKSB8fAogCQkgICAgIGRldmljZV9zdXNwZW5kZWQoJnRzLT5zcGktPmRldikpKSB7CiAJCWlmICh0cy0+cGVuZG93bikgewogCQkJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cy0+aW5wdXQ7CkBAIC03MTYsNyArNzM4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGxpa2VseSh0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKSkpIHsKKwlpZiAobGlrZWx5KGdldF9wZW5kb3duX3N0YXRlKHRzKSkpIHsKIAkJaWYgKCF0cy0+aXJxX2Rpc2FibGVkKSB7CiAJCQkvKiBUaGUgQVJNIGRvX3NpbXBsZV9JUlEoKSBkaXNwYXRjaGVyIGRvZXNuJ3QgYWN0CiAJCQkgKiBsaWtlIHRoZSBvdGhlciBkaXNwYXRjaGVyczogIGl0IHdpbGwgcmVwb3J0IElSUXMKQEAgLTc2Myw3ICs3ODUsNiBAQAogCS8qIHdlIGtub3cgdGhlIGNoaXAncyBpbiBsb3dwb3dlciBtb2RlIHNpbmNlIHdlIGFsd2F5cwogCSAqIGxlYXZlIGl0IHRoYXQgd2F5IGFmdGVyIGV2ZXJ5IHJlcXVlc3QKIAkgKi8KLQogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRzLT5sb2NrIGhlbGQgKi8KQEAgLTgwNiw5ICs4MjcsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgc2V0dXBfcGVuZG93bihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3QgYWRzNzg0NiAqdHMpCit7CisJc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnI7CisKKwkvKiBSRVZJU0lUIHdoZW4gdGhlIGlycSBjYW4gYmUgdHJpZ2dlcmVkIGFjdGl2ZS1sb3csIG9yIGlmIGZvciBzb21lCisJICogcmVhc29uIHRoZSB0b3VjaHNjcmVlbiBpc24ndCBob29rZWQgdXAsIHdlIGRvbid0IG5lZWQgdG8gYWNjZXNzCisJICogdGhlIHBlbmRvd24gc3RhdGUuCisJICovCisJaWYgKCFwZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGUgJiYgIWdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcGVuZG93bikpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBnZXRfcGVuZG93bl9zdGF0ZSBub3IgZ3Bpb19wZW5kb3duP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGUpIHsKKwkJdHMtPmdldF9wZW5kb3duX3N0YXRlID0gcGRhdGEtPmdldF9wZW5kb3duX3N0YXRlOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSBncGlvX3JlcXVlc3QocGRhdGEtPmdwaW9fcGVuZG93biwgImFkczc4NDZfcGVuZG93biIpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBwZW5kb3duIEdQSU8lZFxuIiwKKwkJCQlwZGF0YS0+Z3Bpb19wZW5kb3duKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl0cy0+Z3Bpb19wZW5kb3duID0gcGRhdGEtPmdwaW9fcGVuZG93bjsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgYWRzNzg0Nl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBhZHM3ODQ2CQkJKnRzOworCXN0cnVjdCBhZHM3ODQ2X3BhY2tldAkJKnBhY2tldDsKIAlzdHJ1Y3QgaW5wdXRfZGV2CQkqaW5wdXRfZGV2OwogCXN0cnVjdCBhZHM3ODQ2X3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSptOwpAQCAtODMzLDE1ICs4ODUsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBSRVZJU0lUIHdoZW4gdGhlIGlycSBjYW4gYmUgdHJpZ2dlcmVkIGFjdGl2ZS1sb3csIG9yIGlmIGZvciBzb21lCi0JICogcmVhc29uIHRoZSB0b3VjaHNjcmVlbiBpc24ndCBob29rZWQgdXAsIHdlIGRvbid0IG5lZWQgdG8gYWNjZXNzCi0JICogdGhlIHBlbmRvd24gc3RhdGUuCi0JICovCi0JaWYgKHBkYXRhLT5nZXRfcGVuZG93bl9zdGF0ZSA9PSBOVUxMKSB7Ci0JCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gZ2V0X3BlbmRvd25fc3RhdGUgZnVuY3Rpb24/XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJLyogV2UnZCBzZXQgVFggd29yZHNpemUgOCBiaXRzIGFuZCBSWCB3b3Jkc2l6ZSB0byAxMyBiaXRzIC4uLiBleGNlcHQKIAkgKiB0aGF0IGV2ZW4gaWYgdGhlIGhhcmR3YXJlIGNhbiBkbyB0aGF0LCB0aGUgU1BJIGNvbnRyb2xsZXIgZHJpdmVyCiAJICogbWF5IG5vdC4gIFNvIHdlIHN0aWNrIHRvIHZlcnktcG9ydGFibGUgOCBiaXQgd29yZHMsIGJvdGggUlggYW5kIFRYLgpAQCAtODUzLDE0ICs4OTYsMTYgQEAKIAkJcmV0dXJuIGVycjsKIAogCXRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkczc4NDYpLCBHRlBfS0VSTkVMKTsKKwlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRzNzg0Nl9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIXRzIHx8ICFpbnB1dF9kZXYpIHsKKwlpZiAoIXRzIHx8ICFwYWNrZXQgfHwgIWlucHV0X2RldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKIAlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCB0cyk7CiAKKwl0cy0+cGFja2V0ID0gcGFja2V0OwogCXRzLT5zcGkgPSBzcGk7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OwogCXRzLT52cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CkBAIC04OTMsNyArOTM4LDEwIEBACiAJCXRzLT5maWx0ZXJfZGF0YSA9IHRzOwogCX0gZWxzZQogCQl0cy0+ZmlsdGVyID0gYWRzNzg0Nl9ub19maWx0ZXI7Ci0JdHMtPmdldF9wZW5kb3duX3N0YXRlID0gcGRhdGEtPmdldF9wZW5kb3duX3N0YXRlOworCisJZXJyID0gc2V0dXBfcGVuZG93bihzcGksIHRzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jbGVhbnVwX2ZpbHRlcjsKIAogCWlmIChwZGF0YS0+cGVuaXJxX3JlY2hlY2tfZGVsYXlfdXNlY3MpCiAJCXRzLT5wZW5pcnFfcmVjaGVja19kZWxheV91c2VjcyA9CkBAIC05MjksMTMgKzk3NywxMyBAQAogCXNwaV9tZXNzYWdlX2luaXQobSk7CiAKIAkvKiB5LSBzdGlsbCBvbjsgdHVybiBvbiBvbmx5IHkrIChhbmQgQURDKSAqLwotCXRzLT5yZWFkX3kgPSBSRUFEX1kodnJlZik7Ci0JeC0+dHhfYnVmID0gJnRzLT5yZWFkX3k7CisJcGFja2V0LT5yZWFkX3kgPSBSRUFEX1kodnJlZik7CisJeC0+dHhfYnVmID0gJnBhY2tldC0+cmVhZF95OwogCXgtPmxlbiA9IDE7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKIAl4Kys7Ci0JeC0+cnhfYnVmID0gJnRzLT50Yy55OworCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLnk7CiAJeC0+bGVuID0gMjsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIApAQCAtOTQ3LDEyICs5OTUsMTIgQEAKIAkJeC0+ZGVsYXlfdXNlY3MgPSBwZGF0YS0+c2V0dGxlX2RlbGF5X3VzZWNzOwogCiAJCXgrKzsKLQkJeC0+dHhfYnVmID0gJnRzLT5yZWFkX3k7CisJCXgtPnR4X2J1ZiA9ICZwYWNrZXQtPnJlYWRfeTsKIAkJeC0+bGVuID0gMTsKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKIAkJeCsrOwotCQl4LT5yeF9idWYgPSAmdHMtPnRjLnk7CisJCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLnk7CiAJCXgtPmxlbiA9IDI7CiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOwogCX0KQEAgLTk2NSwxMyArMTAxMywxMyBAQAogCiAJLyogdHVybiB5LSBvZmYsIHgrIG9uLCB0aGVuIGxlYXZlIGluIGxvd3Bvd2VyICovCiAJeCsrOwotCXRzLT5yZWFkX3ggPSBSRUFEX1godnJlZik7Ci0JeC0+dHhfYnVmID0gJnRzLT5yZWFkX3g7CisJcGFja2V0LT5yZWFkX3ggPSBSRUFEX1godnJlZik7CisJeC0+dHhfYnVmID0gJnBhY2tldC0+cmVhZF94OwogCXgtPmxlbiA9IDE7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKIAl4Kys7Ci0JeC0+cnhfYnVmID0gJnRzLT50Yy54OworCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLng7CiAJeC0+bGVuID0gMjsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIApAQCAtOTgwLDEyICsxMDI4LDEyIEBACiAJCXgtPmRlbGF5X3VzZWNzID0gcGRhdGEtPnNldHRsZV9kZWxheV91c2VjczsKIAogCQl4Kys7Ci0JCXgtPnR4X2J1ZiA9ICZ0cy0+cmVhZF94OworCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3g7CiAJCXgtPmxlbiA9IDE7CiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOwogCiAJCXgrKzsKLQkJeC0+cnhfYnVmID0gJnRzLT50Yy54OworCQl4LT5yeF9idWYgPSAmcGFja2V0LT50Yy54OwogCQl4LT5sZW4gPSAyOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIAl9CkBAIC05OTksMTMgKzEwNDcsMTMgQEAKIAkJc3BpX21lc3NhZ2VfaW5pdChtKTsKIAogCQl4Kys7Ci0JCXRzLT5yZWFkX3oxID0gUkVBRF9aMSh2cmVmKTsKLQkJeC0+dHhfYnVmID0gJnRzLT5yZWFkX3oxOworCQlwYWNrZXQtPnJlYWRfejEgPSBSRUFEX1oxKHZyZWYpOworCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3oxOwogCQl4LT5sZW4gPSAxOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIAogCQl4Kys7Ci0JCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMuejE7CisJCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLnoxOwogCQl4LT5sZW4gPSAyOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIApAQCAtMTAxNCwxMiArMTA2MiwxMiBAQAogCQkJeC0+ZGVsYXlfdXNlY3MgPSBwZGF0YS0+c2V0dGxlX2RlbGF5X3VzZWNzOwogCiAJCQl4Kys7Ci0JCQl4LT50eF9idWYgPSAmdHMtPnJlYWRfejE7CisJCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3oxOwogCQkJeC0+bGVuID0gMTsKIAkJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOwogCiAJCQl4Kys7Ci0JCQl4LT5yeF9idWYgPSAmdHMtPnRjLnoxOworCQkJeC0+cnhfYnVmID0gJnBhY2tldC0+dGMuejE7CiAJCQl4LT5sZW4gPSAyOwogCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAJCX0KQEAgLTEwMzEsMTMgKzEwNzksMTMgQEAKIAkJc3BpX21lc3NhZ2VfaW5pdChtKTsKIAogCQl4Kys7Ci0JCXRzLT5yZWFkX3oyID0gUkVBRF9aMih2cmVmKTsKLQkJeC0+dHhfYnVmID0gJnRzLT5yZWFkX3oyOworCQlwYWNrZXQtPnJlYWRfejIgPSBSRUFEX1oyKHZyZWYpOworCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3oyOwogCQl4LT5sZW4gPSAxOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIAogCQl4Kys7Ci0JCXgtPnJ4X2J1ZiA9ICZ0cy0+dGMuejI7CisJCXgtPnJ4X2J1ZiA9ICZwYWNrZXQtPnRjLnoyOwogCQl4LT5sZW4gPSAyOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCBtKTsKIApAQCAtMTA0NiwxMiArMTA5NCwxMiBAQAogCQkJeC0+ZGVsYXlfdXNlY3MgPSBwZGF0YS0+c2V0dGxlX2RlbGF5X3VzZWNzOwogCiAJCQl4Kys7Ci0JCQl4LT50eF9idWYgPSAmdHMtPnJlYWRfejI7CisJCQl4LT50eF9idWYgPSAmcGFja2V0LT5yZWFkX3oyOwogCQkJeC0+bGVuID0gMTsKIAkJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOwogCiAJCQl4Kys7Ci0JCQl4LT5yeF9idWYgPSAmdHMtPnRjLnoyOworCQkJeC0+cnhfYnVmID0gJnBhY2tldC0+dGMuejI7CiAJCQl4LT5sZW4gPSAyOwogCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAJCX0KQEAgLTEwNjUsMTMgKzExMTMsMTMgQEAKIAlzcGlfbWVzc2FnZV9pbml0KG0pOwogCiAJeCsrOwotCXRzLT5wd3Jkb3duID0gUFdSRE9XTjsKLQl4LT50eF9idWYgPSAmdHMtPnB3cmRvd247CisJcGFja2V0LT5wd3Jkb3duID0gUFdSRE9XTjsKKwl4LT50eF9idWYgPSAmcGFja2V0LT5wd3Jkb3duOwogCXgtPmxlbiA9IDE7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKIAl4Kys7Ci0JeC0+cnhfYnVmID0gJnRzLT5kdW1teTsKKwl4LT5yeF9idWYgPSAmcGFja2V0LT5kdW1teTsKIAl4LT5sZW4gPSAyOwogCUNTX0NIQU5HRSgqeCk7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CkBAIC0xMDg1LDcgKzExMzMsNyBAQAogCQkJc3BpLT5kZXYuZHJpdmVyLT5uYW1lLCB0cykpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHNwaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGVycl9jbGVhbnVwX2ZpbHRlcjsKKwkJZ290byBlcnJfZnJlZV9ncGlvOwogCX0KIAogCWVyciA9IGFkczc4NHhfaHdtb25fcmVnaXN0ZXIoc3BpLCB0cyk7CkBAIC0xMTE2LDExICsxMTY0LDE1IEBACiAJYWRzNzg0eF9od21vbl91bnJlZ2lzdGVyKHNwaSwgdHMpOwogIGVycl9mcmVlX2lycToKIAlmcmVlX2lycShzcGktPmlycSwgdHMpOworIGVycl9mcmVlX2dwaW86CisJaWYgKHRzLT5ncGlvX3BlbmRvd24gIT0gLTEpCisJCWdwaW9fZnJlZSh0cy0+Z3Bpb19wZW5kb3duKTsKICBlcnJfY2xlYW51cF9maWx0ZXI6CiAJaWYgKHRzLT5maWx0ZXJfY2xlYW51cCkKIAkJdHMtPmZpbHRlcl9jbGVhbnVwKHRzLT5maWx0ZXJfZGF0YSk7CiAgZXJyX2ZyZWVfbWVtOgogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUocGFja2V0KTsKIAlrZnJlZSh0cyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExNDAsOSArMTE5MiwxMyBAQAogCS8qIHN1c3BlbmQgbGVmdCB0aGUgSVJRIGRpc2FibGVkICovCiAJZW5hYmxlX2lycSh0cy0+c3BpLT5pcnEpOwogCisJaWYgKHRzLT5ncGlvX3BlbmRvd24gIT0gLTEpCisJCWdwaW9fZnJlZSh0cy0+Z3Bpb19wZW5kb3duKTsKKwogCWlmICh0cy0+ZmlsdGVyX2NsZWFudXApCiAJCXRzLT5maWx0ZXJfY2xlYW51cCh0cy0+ZmlsdGVyX2RhdGEpOwogCisJa2ZyZWUodHMtPnBhY2tldCk7CiAJa2ZyZWUodHMpOwogCiAJZGV2X2RiZygmc3BpLT5kZXYsICJ1bnJlZ2lzdGVyZWQgdG91Y2hzY3JlZW5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMKaW5kZXggZWVlMTI2Yi4uYTg5YTZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX3RzYWRjYy5jCkBAIC05MSw2ICs5MSw5IEBACiAJY2hhcgkJCXBoeXNbMzJdOwogCXN0cnVjdCBjbGsJCSpjbGs7CiAJaW50CQkJaXJxOworCXVuc2lnbmVkIGludAkJcHJldl9hYnN4OworCXVuc2lnbmVkIGludAkJcHJldl9hYnN5OworCXVuc2lnbmVkIGNoYXIJCWJ1ZmZlcmVkbWVhc3VyZTsKIH07CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0JCSp0c2NfYmFzZTsKQEAgLTEwMCwxMCArMTAzLDkgQEAKIAogc3RhdGljIGlycXJldHVybl90IGF0bWVsX3RzYWRjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQogewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9ICgoc3RydWN0IGF0bWVsX3RzYWRjYyAqKWRldiktPmlucHV0OworCXN0cnVjdCBhdG1lbF90c2FkY2MJKnRzX2RldiA9IChzdHJ1Y3QgYXRtZWxfdHNhZGNjICopZGV2OworCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0X2RldiA9IHRzX2Rldi0+aW5wdXQ7CiAKLQl1bnNpZ25lZCBpbnQgYWJzeDsKLQl1bnNpZ25lZCBpbnQgYWJzeTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZWc7CiAKQEAgLTEyMSw2ICsxMjMsNyBAQAogCQlhdG1lbF90c2FkY2Nfd3JpdGUoQVRNRUxfVFNBRENDX0lFUiwgQVRNRUxfVFNBRENDX1BFTkNOVCk7CiAKIAkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIEJUTl9UT1VDSCwgMCk7CisJCXRzX2Rldi0+YnVmZmVyZWRtZWFzdXJlID0gMDsKIAkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOwogCiAJfSBlbHNlIGlmIChzdGF0dXMgJiBBVE1FTF9UU0FEQ0NfUEVOQ05UKSB7CkBAIC0xMzgsMTYgKzE0MSwyMyBAQAogCX0gZWxzZSBpZiAoc3RhdHVzICYgQVRNRUxfVFNBRENDX0VPQygzKSkgewogCQkvKiBDb252ZXJzaW9uIGZpbmlzaGVkICovCiAKLQkJYWJzeCA9IGF0bWVsX3RzYWRjY19yZWFkKEFUTUVMX1RTQURDQ19DRFIzKSA8PCAxMDsKLQkJYWJzeCAvPSBhdG1lbF90c2FkY2NfcmVhZChBVE1FTF9UU0FEQ0NfQ0RSMik7CisJCWlmICh0c19kZXYtPmJ1ZmZlcmVkbWVhc3VyZSkgeworCQkJLyogTGFzdCBtZWFzdXJlbWVudCBpcyBhbHdheXMgZGlzY2FyZGVkLCBzaW5jZSBpdCBjYW4KKwkJCSAqIGJlIGVycm9uZW91cy4KKwkJCSAqIEFsd2F5cyByZXBvcnQgcHJldmlvdXMgbWVhc3VyZW1lbnQgKi8KKwkJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfWCwgdHNfZGV2LT5wcmV2X2Fic3gpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19ZLCB0c19kZXYtPnByZXZfYWJzeSk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2RldiwgQlROX1RPVUNILCAxKTsKKwkJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKKwkJfSBlbHNlCisJCQl0c19kZXYtPmJ1ZmZlcmVkbWVhc3VyZSA9IDE7CiAKLQkJYWJzeSA9IGF0bWVsX3RzYWRjY19yZWFkKEFUTUVMX1RTQURDQ19DRFIxKSA8PCAxMDsKLQkJYWJzeSAvPSBhdG1lbF90c2FkY2NfcmVhZChBVE1FTF9UU0FEQ0NfQ0RSMCk7CisJCS8qIE5vdyBtYWtlIG5ldyBtZWFzdXJlbWVudCAqLworCQl0c19kZXYtPnByZXZfYWJzeCA9IGF0bWVsX3RzYWRjY19yZWFkKEFUTUVMX1RTQURDQ19DRFIzKSA8PCAxMDsKKwkJdHNfZGV2LT5wcmV2X2Fic3ggLz0gYXRtZWxfdHNhZGNjX3JlYWQoQVRNRUxfVFNBRENDX0NEUjIpOwogCi0JCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfWCwgYWJzeCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfWSwgYWJzeSk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfZGV2LCBCVE5fVE9VQ0gsIDEpOwotCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7CisJCXRzX2Rldi0+cHJldl9hYnN5ID0gYXRtZWxfdHNhZGNjX3JlYWQoQVRNRUxfVFNBRENDX0NEUjEpIDw8IDEwOworCQl0c19kZXYtPnByZXZfYWJzeSAvPSBhdG1lbF90c2FkY2NfcmVhZChBVE1FTF9UU0FEQ0NfQ0RSMCk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjIzLDYgKzIzMyw3IEBACiAJfQogCiAJdHNfZGV2LT5pbnB1dCA9IGlucHV0X2RldjsKKwl0c19kZXYtPmJ1ZmZlcmVkbWVhc3VyZSA9IDA7CiAKIAlzbnByaW50Zih0c19kZXYtPnBoeXMsIHNpemVvZih0c19kZXYtPnBoeXMpLAogCQkgIiVzL2lucHV0MCIsIHBkZXYtPmRldi5idXNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9qb3JuYWRhNzIwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYwppbmRleCBiZjQ0ZjlkLi5jOGI3ZThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYwpAQCAtMTE5LDggKzExOSw4IEBACiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CiAJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAotCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOwotCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX1RPVUNIKV0gPSBCSVQoQlROX1RPVUNIKTsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDI3MCwgMzkwMCwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMTgwLCAzNzAwLCAwLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYWluc3RvbmUtd205N3h4LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21haW5zdG9uZS13bTk3eHguYwppbmRleCAzN2E1NTVmLi5iYTY0ODc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21haW5zdG9uZS13bTk3eHguYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21haW5zdG9uZS13bTk3eHguYwpAQCAtMyw4ICszLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgIFdvbGZzb24gV005N3h4IEFDOTcgQ29kZWNzLgogICoKICAqIENvcHlyaWdodCAyMDA0LCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCi0gKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKLSAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqIFBhcnRzIENvcHlyaWdodCA6IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+CiAgKiAgICAgICAgICAgICAgICAgICBBbmRyZXcgWmFib2xvdG55IDx6YXBAaG9tZWxpbmsucnU+CiAgKgpAQCAtMjk2LDYgKzI5NSw2IEBACiBtb2R1bGVfZXhpdChtYWluc3RvbmVfd205N3h4X2V4aXQpOwogCiAvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KLU1PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIndtOTd4eCBjb250aW51b3VzIHRvdWNoIGRyaXZlciBmb3IgbWFpbnN0b25lIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCmluZGV4IGJjZTAxOGUuLjU0OTg2NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCkBAIC01LDYgKzUsMTAgQEAKICAqICBDcmVhdGVkOglTZXB0ZW1iZXIgMjUsIDIwMDYKICAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCisgKiBTcGxpdGluZyBkb25lIGJ5OiBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICogSWYgc29tZXRoaW5nIGRvZXNudCB3b3JrIGFuZCBpdCB3b3JrZWQgYmVmb3JlIHNwbGl0aW5nLCBlLW1haWwgbWUsCisgKiBkb250IGJvdGhlciBOaWNvbGFzIHBsZWFzZSA7LSkKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMjUsMTI0ICsyOSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotCi0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KLQotCi0vKgotICogSW50ZXJlc3RpbmcgVUNCMTQwMCBBQy1saW5rIHJlZ2lzdGVycwotICovCi0KLSNkZWZpbmUgVUNCX0lFX1JJUwkJMHg1ZQotI2RlZmluZSBVQ0JfSUVfRkFMCQkweDYwCi0jZGVmaW5lIFVDQl9JRV9TVEFUVVMJCTB4NjIKLSNkZWZpbmUgVUNCX0lFX0NMRUFSCQkweDYyCi0jZGVmaW5lIFVDQl9JRV9BREMJCSgxIDw8IDExKQotI2RlZmluZSBVQ0JfSUVfVFNQWAkJKDEgPDwgMTIpCi0KLSNkZWZpbmUgVUNCX1RTX0NSCQkweDY0Ci0jZGVmaW5lIFVDQl9UU19DUl9UU01YX1BPVwkoMSA8PCAwKQotI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWF9QT1cJKDEgPDwgMSkKLSNkZWZpbmUgVUNCX1RTX0NSX1RTTVlfUE9XCSgxIDw8IDIpCi0jZGVmaW5lIFVDQl9UU19DUl9UU1BZX1BPVwkoMSA8PCAzKQotI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9HTkQJKDEgPDwgNCkKLSNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfR05ECSgxIDw8IDUpCi0jZGVmaW5lIFVDQl9UU19DUl9UU01ZX0dORAkoMSA8PCA2KQotI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWV9HTkQJKDEgPDwgNykKLSNkZWZpbmUgVUNCX1RTX0NSX01PREVfSU5UCSgwIDw8IDgpCi0jZGVmaW5lIFVDQl9UU19DUl9NT0RFX1BSRVMJKDEgPDwgOCkKLSNkZWZpbmUgVUNCX1RTX0NSX01PREVfUE9TCSgyIDw8IDgpCi0jZGVmaW5lIFVDQl9UU19DUl9CSUFTX0VOQQkoMSA8PCAxMSkKLSNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfTE9XCSgxIDw8IDEyKQotI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9MT1cJKDEgPDwgMTMpCi0KLSNkZWZpbmUgVUNCX0FEQ19DUgkJMHg2NgotI2RlZmluZSBVQ0JfQURDX1NZTkNfRU5BCSgxIDw8IDApCi0jZGVmaW5lIFVDQl9BRENfVlJFRkJZUF9DT04JKDEgPDwgMSkKLSNkZWZpbmUgVUNCX0FEQ19JTlBfVFNQWAkoMCA8PCAyKQotI2RlZmluZSBVQ0JfQURDX0lOUF9UU01YCSgxIDw8IDIpCi0jZGVmaW5lIFVDQl9BRENfSU5QX1RTUFkJKDIgPDwgMikKLSNkZWZpbmUgVUNCX0FEQ19JTlBfVFNNWQkoMyA8PCAyKQotI2RlZmluZSBVQ0JfQURDX0lOUF9BRDAJCSg0IDw8IDIpCi0jZGVmaW5lIFVDQl9BRENfSU5QX0FEMQkJKDUgPDwgMikKLSNkZWZpbmUgVUNCX0FEQ19JTlBfQUQyCQkoNiA8PCAyKQotI2RlZmluZSBVQ0JfQURDX0lOUF9BRDMJCSg3IDw8IDIpCi0jZGVmaW5lIFVDQl9BRENfRVhUX1JFRgkJKDEgPDwgNSkKLSNkZWZpbmUgVUNCX0FEQ19TVEFSVAkJKDEgPDwgNykKLSNkZWZpbmUgVUNCX0FEQ19FTkEJCSgxIDw8IDE1KQotCi0jZGVmaW5lIFVDQl9BRENfREFUQQkJMHg2OAotI2RlZmluZSBVQ0JfQURDX0RBVF9WQUxJRAkoMSA8PCAxNSkKLSNkZWZpbmUgVUNCX0FEQ19EQVRfVkFMVUUoeCkJKCh4KSAmIDB4M2ZmKQotCi0jZGVmaW5lIFVDQl9JRAkJCTB4N2UKLSNkZWZpbmUgVUNCX0lEXzE0MDAgICAgICAgICAgICAgMHg0MzA0Ci0KLQotc3RydWN0IHVjYjE0MDAgewotCXN0cnVjdCBzbmRfYWM5NwkJKmFjOTc7Ci0Jc3RydWN0IGlucHV0X2RldgkqdHNfaWRldjsKLQotCWludAkJCWlycTsKLQotCXdhaXRfcXVldWVfaGVhZF90CXRzX3dhaXQ7Ci0Jc3RydWN0IHRhc2tfc3RydWN0CSp0c190YXNrOwotCi0JdW5zaWduZWQgaW50CQlpcnFfcGVuZGluZzsJLyogbm90IGJpdCBmaWVsZCBzaGFyZWQgKi8KLQl1bnNpZ25lZCBpbnQJCXRzX3Jlc3RhcnQ6MTsKLQl1bnNpZ25lZCBpbnQJCWFkY3N5bmM6MTsKLX07CisjaW5jbHVkZSA8bGludXgvdWNiMTQwMC5oPgogCiBzdGF0aWMgaW50IGFkY3N5bmM7CiBzdGF0aWMgaW50IHRzX2RlbGF5ID0gNTU7IC8qIHVzICovCiBzdGF0aWMgaW50IHRzX2RlbGF5X3ByZXNzdXJlOwkvKiB1cyAqLwogCi1zdGF0aWMgaW5saW5lIHUxNiB1Y2IxNDAwX3JlZ19yZWFkKHN0cnVjdCB1Y2IxNDAwICp1Y2IsIHUxNiByZWcpCi17Ci0JcmV0dXJuIHVjYi0+YWM5Ny0+YnVzLT5vcHMtPnJlYWQodWNiLT5hYzk3LCByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF9yZWdfd3JpdGUoc3RydWN0IHVjYjE0MDAgKnVjYiwgdTE2IHJlZywgdTE2IHZhbCkKLXsKLQl1Y2ItPmFjOTctPmJ1cy0+b3BzLT53cml0ZSh1Y2ItPmFjOTcsIHJlZywgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfYWRjX2VuYWJsZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQotewotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgVUNCX0FEQ19FTkEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHVjYjE0MDBfYWRjX3JlYWQoc3RydWN0IHVjYjE0MDAgKnVjYiwgdTE2IGFkY19jaGFubmVsKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlpZiAodWNiLT5hZGNzeW5jKQotCQlhZGNfY2hhbm5lbCB8PSBVQ0JfQURDX1NZTkNfRU5BOwotCi0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IGFkY19jaGFubmVsKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BIHwgYWRjX2NoYW5uZWwgfCBVQ0JfQURDX1NUQVJUKTsKLQotCWZvciAoOzspIHsKLQkJdmFsID0gdWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSk7Ci0JCWlmICh2YWwgJiBVQ0JfQURDX0RBVF9WQUxJRCkKLQkJCWJyZWFrOwotCQkvKiB5aWVsZCB0byBvdGhlciBwcm9jZXNzZXMgKi8KLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JfQotCi0JcmV0dXJuIFVDQl9BRENfREFUX1ZBTFVFKHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxNDAwX2FkY19kaXNhYmxlKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCi17Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCAwKTsKLX0KLQogLyogU3dpdGNoIHRvIGludGVycnVwdCBtb2RlLiAqLwotc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfdHNfbW9kZV9pbnQoc3RydWN0IHVjYjE0MDAgKnVjYikKK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxNDAwX3RzX21vZGVfaW50KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwl1Y2IxNDAwX3JlZ193cml0ZShhYzk3LCBVQ0JfVFNfQ1IsCiAJCQlVQ0JfVFNfQ1JfVFNNWF9QT1cgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAogCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfR05EIHwKIAkJCVVDQl9UU19DUl9NT0RFX0lOVCk7CkBAIC0xNTIsMTQgKzQ4LDE0IEBACiAgKiBTd2l0Y2ggdG8gcHJlc3N1cmUgbW9kZSwgYW5kIHJlYWQgcHJlc3N1cmUuICBXZSBkb24ndCBuZWVkIHRvIHdhaXQKICAqIGhlcmUsIHNpbmNlIGJvdGggcGxhdGVzIGFyZSBiZWluZyBkcml2ZW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjE0MDBfdHNfcmVhZF9wcmVzc3VyZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMTQwMF90c19yZWFkX3ByZXNzdXJlKHN0cnVjdCB1Y2IxNDAwX3RzICp1Y2IpCiB7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfVFNfQ1IsCiAJCQlVQ0JfVFNfQ1JfVFNNWF9QT1cgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAogCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfR05EIHwKIAkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOwogCXVkZWxheSh0c19kZWxheV9wcmVzc3VyZSk7Ci0JcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQodWNiLCBVQ0JfQURDX0lOUF9UU1BZKTsKKwlyZXR1cm4gdWNiMTQwMF9hZGNfcmVhZCh1Y2ItPmFjOTcsIFVDQl9BRENfSU5QX1RTUFksIGFkY3N5bmMpOwogfQogCiAvKgpAQCAtMTY4LDIxICs2NCwyMSBAQAogICogZ2l2ZXMgYSBmYXN0ZXIgcmVzcG9uc2UgdGltZS4gIEV2ZW4gc28sIHdlIG5lZWQgdG8gd2FpdCBhYm91dCA1NXVzCiAgKiBmb3IgdGhpbmdzIHRvIHN0YWJpbGlzZS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMTQwMF90c19yZWFkX3hwb3Moc3RydWN0IHVjYjE0MDAgKnVjYikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjE0MDBfdHNfcmVhZF94cG9zKHN0cnVjdCB1Y2IxNDAwX3RzICp1Y2IpCiB7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfVFNfQ1IsCiAJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAogCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfVFNfQ1IsCiAJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAogCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfVFNfQ1IsCiAJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAogCQkJVUNCX1RTX0NSX01PREVfUE9TIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKIAogCXVkZWxheSh0c19kZWxheSk7CiAKLQlyZXR1cm4gdWNiMTQwMF9hZGNfcmVhZCh1Y2IsIFVDQl9BRENfSU5QX1RTUFkpOworCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYi0+YWM5NywgVUNCX0FEQ19JTlBfVFNQWSwgYWRjc3luYyk7CiB9CiAKIC8qCkBAIC0xOTEsNjMgKzg3LDYzIEBACiAgKiBnaXZlcyBhIGZhc3RlciByZXNwb25zZSB0aW1lLiAgRXZlbiBzbywgd2UgbmVlZCB0byB3YWl0IGFib3V0IDU1dXMKICAqIGZvciB0aGluZ3MgdG8gc3RhYmlsaXNlLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeXBvcyhzdHJ1Y3QgdWNiMTQwMCAqdWNiKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMTQwMF90c19yZWFkX3lwb3Moc3RydWN0IHVjYjE0MDBfdHMgKnVjYikKIHsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2ItPmFjOTcsIFVDQl9UU19DUiwKIAkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CiAJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2ItPmFjOTcsIFVDQl9UU19DUiwKIAkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CiAJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2ItPmFjOTcsIFVDQl9UU19DUiwKIAkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CiAJCQlVQ0JfVFNfQ1JfTU9ERV9QT1MgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOwogCiAJdWRlbGF5KHRzX2RlbGF5KTsKIAotCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgVUNCX0FEQ19JTlBfVFNQWCk7CisJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQodWNiLT5hYzk3LCBVQ0JfQURDX0lOUF9UU1BYLCBhZGNzeW5jKTsKIH0KIAogLyoKICAqIFN3aXRjaCB0byBYIHBsYXRlIHJlc2lzdGFuY2UgbW9kZS4gIFNldCBNWCB0byBncm91bmQsIFBYIHRvCiAgKiBzdXBwbHkuICBNZWFzdXJlIGN1cnJlbnQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjE0MDBfdHNfcmVhZF94cmVzKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeHJlcyhzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiKQogewotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX1RTX0NSLAorCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX1RTX0NSLAogCQkJVUNCX1RTX0NSX1RTTVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKIAkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOwotCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgMCk7CisJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQodWNiLT5hYzk3LCAwLCBhZGNzeW5jKTsKIH0KIAogLyoKICAqIFN3aXRjaCB0byBZIHBsYXRlIHJlc2lzdGFuY2UgbW9kZS4gIFNldCBNWSB0byBncm91bmQsIFBZIHRvCiAgKiBzdXBwbHkuICBNZWFzdXJlIGN1cnJlbnQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjE0MDBfdHNfcmVhZF95cmVzKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeXJlcyhzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiKQogewotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX1RTX0NSLAorCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX1RTX0NSLAogCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwKIAkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOwotCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgMCk7CisJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQodWNiLT5hYzk3LCAwLCBhZGNzeW5jKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdWNiMTQwMF90c19wZW5fZG93bihzdHJ1Y3QgdWNiMTQwMCAqdWNiKQorc3RhdGljIGlubGluZSBpbnQgdWNiMTQwMF90c19wZW5fZG93bihzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsID0gdWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9UU19DUik7Ci0JcmV0dXJuICh2YWwgJiAoVUNCX1RTX0NSX1RTUFhfTE9XIHwgVUNCX1RTX0NSX1RTTVhfTE9XKSk7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gdWNiMTQwMF9yZWdfcmVhZChhYzk3LCBVQ0JfVFNfQ1IpOworCXJldHVybiB2YWwgJiAoVUNCX1RTX0NSX1RTUFhfTE9XIHwgVUNCX1RTX0NSX1RTTVhfTE9XKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfdHNfaXJxX2VuYWJsZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQorc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfdHNfaXJxX2VuYWJsZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIFVDQl9JRV9UU1BYKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9DTEVBUiwgMCk7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfRkFMLCBVQ0JfSUVfVFNQWCk7CisJdWNiMTQwMF9yZWdfd3JpdGUoYWM5NywgVUNCX0lFX0NMRUFSLCBVQ0JfSUVfVFNQWCk7CisJdWNiMTQwMF9yZWdfd3JpdGUoYWM5NywgVUNCX0lFX0NMRUFSLCAwKTsKKwl1Y2IxNDAwX3JlZ193cml0ZShhYzk3LCBVQ0JfSUVfRkFMLCBVQ0JfSUVfVFNQWCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxNDAwX3RzX2lycV9kaXNhYmxlKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF90c19pcnFfZGlzYWJsZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfRkFMLCAwKTsKKwl1Y2IxNDAwX3JlZ193cml0ZShhYzk3LCBVQ0JfSUVfRkFMLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgdWNiMTQwMF90c19ldnRfYWRkKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYsIHUxNiBwcmVzc3VyZSwgdTE2IHgsIHUxNiB5KQpAQCAtMjY0LDI1ICsxNjAsMjQgQEAKIAlpbnB1dF9zeW5jKGlkZXYpOwogfQogCi1zdGF0aWMgdm9pZCB1Y2IxNDAwX2hhbmRsZV9wZW5kaW5nX2lycShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQorc3RhdGljIHZvaWQgdWNiMTQwMF9oYW5kbGVfcGVuZGluZ19pcnEoc3RydWN0IHVjYjE0MDBfdHMgKnVjYikKIHsKIAl1bnNpZ25lZCBpbnQgaXNyOwogCi0JaXNyID0gdWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9JRV9TVEFUVVMpOwotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCBpc3IpOwotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAwKTsKKwlpc3IgPSB1Y2IxNDAwX3JlZ19yZWFkKHVjYi0+YWM5NywgVUNCX0lFX1NUQVRVUyk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfSUVfQ0xFQVIsIGlzcik7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfSUVfQ0xFQVIsIDApOwogCi0JaWYgKGlzciAmIFVDQl9JRV9UU1BYKQotCQl1Y2IxNDAwX3RzX2lycV9kaXNhYmxlKHVjYik7Ci0JZWxzZQorCWlmIChpc3IgJiBVQ0JfSUVfVFNQWCkgeworCQl1Y2IxNDAwX3RzX2lycV9kaXNhYmxlKHVjYi0+YWM5Nyk7CisJCWVuYWJsZV9pcnEodWNiLT5pcnEpOworCX0gZWxzZQogCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHVuZXhwZWN0ZWQgSUVfU1RBVFVTID0gJSN4XG4iLCBpc3IpOwotCi0JZW5hYmxlX2lycSh1Y2ItPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgdWNiMTQwMF90c190aHJlYWQodm9pZCAqX3VjYikKIHsKLQlzdHJ1Y3QgdWNiMTQwMCAqdWNiID0gX3VjYjsKKwlzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiID0gX3VjYjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJaW50IHZhbGlkID0gMDsKIAlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IDEgfTsKQEAgLTMwMSwxOSArMTk2LDE5IEBACiAJCQl1Y2IxNDAwX2hhbmRsZV9wZW5kaW5nX2lycSh1Y2IpOwogCQl9CiAKLQkJdWNiMTQwMF9hZGNfZW5hYmxlKHVjYik7CisJCXVjYjE0MDBfYWRjX2VuYWJsZSh1Y2ItPmFjOTcpOwogCQl4ID0gdWNiMTQwMF90c19yZWFkX3hwb3ModWNiKTsKIAkJeSA9IHVjYjE0MDBfdHNfcmVhZF95cG9zKHVjYik7CiAJCXAgPSB1Y2IxNDAwX3RzX3JlYWRfcHJlc3N1cmUodWNiKTsKLQkJdWNiMTQwMF9hZGNfZGlzYWJsZSh1Y2IpOworCQl1Y2IxNDAwX2FkY19kaXNhYmxlKHVjYi0+YWM5Nyk7CiAKIAkJLyogU3dpdGNoIGJhY2sgdG8gaW50ZXJydXB0IG1vZGUuICovCi0JCXVjYjE0MDBfdHNfbW9kZV9pbnQodWNiKTsKKwkJdWNiMTQwMF90c19tb2RlX2ludCh1Y2ItPmFjOTcpOwogCiAJCW1zbGVlcCgxMCk7CiAKLQkJaWYgKHVjYjE0MDBfdHNfcGVuX2Rvd24odWNiKSkgewotCQkJdWNiMTQwMF90c19pcnFfZW5hYmxlKHVjYik7CisJCWlmICh1Y2IxNDAwX3RzX3Blbl9kb3duKHVjYi0+YWM5NykpIHsKKwkJCXVjYjE0MDBfdHNfaXJxX2VuYWJsZSh1Y2ItPmFjOTcpOwogCiAJCQkvKgogCQkJICogSWYgd2Ugc3BhdCBvdXQgYSB2YWxpZCBzYW1wbGUgc2V0IGxhc3QgdGltZSwKQEAgLTMzMiw4ICsyMjcsOCBAQAogCQl9CiAKIAkJd2FpdF9ldmVudF9mcmVlemFibGVfdGltZW91dCh1Y2ItPnRzX3dhaXQsCi0JCQl1Y2ItPmlycV9wZW5kaW5nIHx8IHVjYi0+dHNfcmVzdGFydCB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCksCi0JCQl0aW1lb3V0KTsKKwkJCXVjYi0+aXJxX3BlbmRpbmcgfHwgdWNiLT50c19yZXN0YXJ0IHx8CisJCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCksIHRpbWVvdXQpOwogCX0KIAogCS8qIFNlbmQgdGhlICJwZW4gb2ZmIiBpZiB3ZSBhcmUgc3RvcHBpbmcgd2l0aCB0aGUgcGVuIHN0aWxsIGFjdGl2ZSAqLwpAQCAtMzU2LDcgKzI1MSw3IEBACiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCB1Y2IxNDAwX2hhcmRfaXJxKGludCBpcnFuciwgdm9pZCAqZGV2aWQpCiB7Ci0Jc3RydWN0IHVjYjE0MDAgKnVjYiA9IGRldmlkOworCXN0cnVjdCB1Y2IxNDAwX3RzICp1Y2IgPSBkZXZpZDsKIAogCWlmIChpcnFuciA9PSB1Y2ItPmlycSkgewogCQlkaXNhYmxlX2lycSh1Y2ItPmlycSk7CkBAIC0zNjksNyArMjY0LDcgQEAKIAogc3RhdGljIGludCB1Y2IxNDAwX3RzX29wZW4oc3RydWN0IGlucHV0X2RldiAqaWRldikKIHsKLQlzdHJ1Y3QgdWNiMTQwMCAqdWNiID0gaW5wdXRfZ2V0X2RydmRhdGEoaWRldik7CisJc3RydWN0IHVjYjE0MDBfdHMgKnVjYiA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOwogCWludCByZXQgPSAwOwogCiAJQlVHX09OKHVjYi0+dHNfdGFzayk7CkBAIC0zODUsMTkgKzI4MCwxNDMgQEAKIAogc3RhdGljIHZvaWQgdWNiMTQwMF90c19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQogewotCXN0cnVjdCB1Y2IxNDAwICp1Y2IgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiID0gaW5wdXRfZ2V0X2RydmRhdGEoaWRldik7CiAKIAlpZiAodWNiLT50c190YXNrKQogCQlrdGhyZWFkX3N0b3AodWNiLT50c190YXNrKTsKIAotCXVjYjE0MDBfdHNfaXJxX2Rpc2FibGUodWNiKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwgMCk7CisJdWNiMTQwMF90c19pcnFfZGlzYWJsZSh1Y2ItPmFjOTcpOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX1RTX0NSLCAwKTsKK30KKworI2lmbmRlZiBOT19JUlEKKyNkZWZpbmUgTk9fSVJRCTAKKyNlbmRpZgorCisvKgorICogVHJ5IHRvIHByb2JlIG91ciBpbnRlcnJ1cHQsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gbG90cyBvZgorICogaGFyZC1jb2RlZCBtYWNoaW5lIGRlcGVuZGVuY2llcy4KKyAqLworc3RhdGljIGludCB1Y2IxNDAwX3RzX2RldGVjdF9pcnEoc3RydWN0IHVjYjE0MDBfdHMgKnVjYikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHRpbWVvdXQ7CisKKwltYXNrID0gcHJvYmVfaXJxX29uKCk7CisKKwkvKiBFbmFibGUgdGhlIEFEQyBpbnRlcnJ1cHQuICovCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfSUVfUklTLCBVQ0JfSUVfQURDKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2ItPmFjOTcsIFVDQl9JRV9GQUwsIFVDQl9JRV9BREMpOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX0lFX0NMRUFSLCAweGZmZmYpOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX0lFX0NMRUFSLCAwKTsKKworCS8qIENhdXNlIGFuIEFEQyBpbnRlcnJ1cHQuICovCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IFVDQl9BRENfU1RBUlQpOworCisJLyogV2FpdCBmb3IgdGhlIGNvbnZlcnNpb24gdG8gY29tcGxldGUuICovCisJdGltZW91dCA9IGppZmZpZXMgKyBIWi8yOworCXdoaWxlICghKHVjYjE0MDBfcmVnX3JlYWQodWNiLT5hYzk3LCBVQ0JfQURDX0RBVEEpICYKKwkJCQkJCVVDQl9BRENfREFUX1ZBTElEKSkgeworCQljcHVfcmVsYXgoKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidWNiMTQwMDogdGltZWQgb3V0IGluIElSUSBwcm9iZVxuIik7CisJCQlwcm9iZV9pcnFfb2ZmKG1hc2spOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfQURDX0NSLCAwKTsKKworCS8qIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdC4gKi8KKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2ItPmFjOTcsIFVDQl9JRV9SSVMsIDApOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYi0+YWM5NywgVUNCX0lFX0ZBTCwgMCk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfSUVfQ0xFQVIsIDB4ZmZmZik7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLT5hYzk3LCBVQ0JfSUVfQ0xFQVIsIDApOworCisJLyogUmVhZCB0cmlnZ2VyZWQgaW50ZXJydXB0LiAqLworCXVjYi0+aXJxID0gcHJvYmVfaXJxX29mZihtYXNrKTsKKwlpZiAodWNiLT5pcnEgPCAwIHx8IHVjYi0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Y2IxNDAwX3RzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3IsIHhfcmVzLCB5X3JlczsKKwlzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXVjYi0+dHNfaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdWNiLT50c19pZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZXJyb3IgPSB1Y2IxNDAwX3RzX2RldGVjdF9pcnEodWNiKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVQ0IxNDAwOiBJUlEgcHJvYmUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZV9kZXZzOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVjYi0+dHNfd2FpdCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKHVjYi0+aXJxLCB1Y2IxNDAwX2hhcmRfaXJxLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJVQ0IxNDAwIiwgdWNiKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1Y2IxNDAwOiB1bmFibGUgdG8gZ3JhYiBpcnElZDogJWRcbiIsCisJCQkJdWNiLT5pcnEsIGVycm9yKTsKKwkJZ290byBlcnJfZnJlZV9kZXZzOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiVUNCMTQwMDogZm91bmQgSVJRICVkXG4iLCB1Y2ItPmlycSk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YSh1Y2ItPnRzX2lkZXYsIHVjYik7CisKKwl1Y2ItPnRzX2lkZXYtPmRldi5wYXJlbnQJPSAmZGV2LT5kZXY7CisJdWNiLT50c19pZGV2LT5uYW1lCQk9ICJVQ0IxNDAwIHRvdWNoc2NyZWVuIGludGVyZmFjZSI7CisJdWNiLT50c19pZGV2LT5pZC52ZW5kb3IJCT0gdWNiMTQwMF9yZWdfcmVhZCh1Y2ItPmFjOTcsCisJCQkJCQlBQzk3X1ZFTkRPUl9JRDEpOworCXVjYi0+dHNfaWRldi0+aWQucHJvZHVjdAk9IHVjYi0+aWQ7CisJdWNiLT50c19pZGV2LT5vcGVuCQk9IHVjYjE0MDBfdHNfb3BlbjsKKwl1Y2ItPnRzX2lkZXYtPmNsb3NlCQk9IHVjYjE0MDBfdHNfY2xvc2U7CisJdWNiLT50c19pZGV2LT5ldmJpdFswXQkJPSBCSVRfTUFTSyhFVl9BQlMpOworCisJdWNiMTQwMF9hZGNfZW5hYmxlKHVjYi0+YWM5Nyk7CisJeF9yZXMgPSB1Y2IxNDAwX3RzX3JlYWRfeHJlcyh1Y2IpOworCXlfcmVzID0gdWNiMTQwMF90c19yZWFkX3lyZXModWNiKTsKKwl1Y2IxNDAwX2FkY19kaXNhYmxlKHVjYi0+YWM5Nyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVDQjE0MDA6IHgveSA9ICVkLyVkXG4iLCB4X3JlcywgeV9yZXMpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXModWNiLT50c19pZGV2LCBBQlNfWCwgMCwgeF9yZXMsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHVjYi0+dHNfaWRldiwgQUJTX1ksIDAsIHlfcmVzLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh1Y2ItPnRzX2lkZXYsIEFCU19QUkVTU1VSRSwgMCwgMCwgMCwgMCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh1Y2ItPnRzX2lkZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHVjYi0+aXJxLCB1Y2IpOworZXJyX2ZyZWVfZGV2czoKKwlpbnB1dF9mcmVlX2RldmljZSh1Y2ItPnRzX2lkZXYpOworZXJyOgorCXJldHVybiBlcnJvcjsKKworfQorCitzdGF0aWMgaW50IHVjYjE0MDBfdHNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWNiMTQwMF90cyAqdWNiID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWZyZWVfaXJxKHVjYi0+aXJxLCB1Y2IpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHVjYi0+dHNfaWRldik7CisJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgdWNiMTQwMF90c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCB1Y2IxNDAwX3RzX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHVjYjE0MDAgKnVjYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1Y2IxNDAwX3RzICp1Y2IgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKHVjYi0+dHNfdGFzaykgewogCQkvKgpAQCAtNDE0LDE2OSArNDMzLDM2IEBACiAjZGVmaW5lIHVjYjE0MDBfdHNfcmVzdW1lIE5VTEwKICNlbmRpZgogCi0jaWZuZGVmIE5PX0lSUQotI2RlZmluZSBOT19JUlEJMAotI2VuZGlmCi0KLS8qCi0gKiBUcnkgdG8gcHJvYmUgb3VyIGludGVycnVwdCwgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBsb3RzIG9mCi0gKiBoYXJkLWNvZGVkIG1hY2hpbmUgZGVwZW5kZW5jaWVzLgotICovCi1zdGF0aWMgaW50IHVjYjE0MDBfZGV0ZWN0X2lycShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQotewotCXVuc2lnbmVkIGxvbmcgbWFzaywgdGltZW91dDsKLQotCW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKLQotCS8qIEVuYWJsZSB0aGUgQURDIGludGVycnVwdC4gKi8KLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIFVDQl9JRV9BREMpOwotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgVUNCX0lFX0FEQyk7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDB4ZmZmZik7Ci0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOwotCi0JLyogQ2F1c2UgYW4gQURDIGludGVycnVwdC4gKi8KLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BIHwgVUNCX0FEQ19TVEFSVCk7Ci0KLQkvKiBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBjb21wbGV0ZS4gKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzI7Ci0Jd2hpbGUgKCEodWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSkgJiBVQ0JfQURDX0RBVF9WQUxJRCkpIHsKLQkJY3B1X3JlbGF4KCk7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHRpbWVkIG91dCBpbiBJUlEgcHJvYmVcbiIpOwotCQkJcHJvYmVfaXJxX29mZihtYXNrKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgMCk7Ci0KLQkvKiBEaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHQuICovCi0JdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCAwKTsKLQl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIDApOwotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAweGZmZmYpOwotCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAwKTsKLQotCS8qIFJlYWQgdHJpZ2dlcmVkIGludGVycnVwdC4gKi8KLQl1Y2ItPmlycSA9IHByb2JlX2lycV9vZmYobWFzayk7Ci0JaWYgKHVjYi0+aXJxIDwgMCB8fCB1Y2ItPmlycSA9PSBOT19JUlEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdWNiMTQwMF90c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVjYjE0MDAgKnVjYjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OwotCWludCBlcnJvciwgaWQsIHhfcmVzLCB5X3JlczsKLQotCXVjYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2IxNDAwKSwgR0ZQX0tFUk5FTCk7Ci0JaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghdWNiIHx8ICFpZGV2KSB7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBlcnJfZnJlZV9kZXZzOwotCX0KLQotCXVjYi0+dHNfaWRldiA9IGlkZXY7Ci0JdWNiLT5hZGNzeW5jID0gYWRjc3luYzsKLQl1Y2ItPmFjOTcgPSB0b19hYzk3X3QoZGV2KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1Y2ItPnRzX3dhaXQpOwotCi0JaWQgPSB1Y2IxNDAwX3JlZ19yZWFkKHVjYiwgVUNCX0lEKTsKLQlpZiAoaWQgIT0gVUNCX0lEXzE0MDApIHsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlX2RldnM7Ci0JfQotCi0JZXJyb3IgPSB1Y2IxNDAwX2RldGVjdF9pcnEodWNiKTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVQ0IxNDAwOiBJUlEgcHJvYmUgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZV9kZXZzOwotCX0KLQotCWVycm9yID0gcmVxdWVzdF9pcnEodWNiLT5pcnEsIHVjYjE0MDBfaGFyZF9pcnEsIElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkJIlVDQjE0MDAiLCB1Y2IpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHVuYWJsZSB0byBncmFiIGlycSVkOiAlZFxuIiwKLQkJCQl1Y2ItPmlycSwgZXJyb3IpOwotCQlnb3RvIGVycl9mcmVlX2RldnM7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJVQ0IxNDAwOiBmb3VuZCBJUlEgJWRcbiIsIHVjYi0+aXJxKTsKLQotCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIHVjYik7Ci0KLQlpZGV2LT5kZXYucGFyZW50CT0gZGV2OwotCWlkZXYtPm5hbWUJCT0gIlVDQjE0MDAgdG91Y2hzY3JlZW4gaW50ZXJmYWNlIjsKLQlpZGV2LT5pZC52ZW5kb3IJCT0gdWNiMTQwMF9yZWdfcmVhZCh1Y2IsIEFDOTdfVkVORE9SX0lEMSk7Ci0JaWRldi0+aWQucHJvZHVjdAk9IGlkOwotCWlkZXYtPm9wZW4JCT0gdWNiMTQwMF90c19vcGVuOwotCWlkZXYtPmNsb3NlCQk9IHVjYjE0MDBfdHNfY2xvc2U7Ci0JaWRldi0+ZXZiaXRbMF0JCT0gQklUX01BU0soRVZfQUJTKTsKLQotCXVjYjE0MDBfYWRjX2VuYWJsZSh1Y2IpOwotCXhfcmVzID0gdWNiMTQwMF90c19yZWFkX3hyZXModWNiKTsKLQl5X3JlcyA9IHVjYjE0MDBfdHNfcmVhZF95cmVzKHVjYik7Ci0JdWNiMTQwMF9hZGNfZGlzYWJsZSh1Y2IpOwotCXByaW50ayhLRVJOX0RFQlVHICJVQ0IxNDAwOiB4L3kgPSAlZC8lZFxuIiwgeF9yZXMsIHlfcmVzKTsKLQotCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIEFCU19YLCAwLCB4X3JlcywgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1ksIDAsIHlfcmVzLCAwLCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBBQlNfUFJFU1NVUkUsIDAsIDAsIDAsIDApOwotCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaWRldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycl9mcmVlX2lycTsKLQotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHVjYik7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfZnJlZV9pcnE6Ci0JZnJlZV9pcnEodWNiLT5pcnEsIHVjYik7Ci0gZXJyX2ZyZWVfZGV2czoKLQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKLQlrZnJlZSh1Y2IpOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCB1Y2IxNDAwX3RzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVjYjE0MDAgKnVjYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JZnJlZV9pcnEodWNiLT5pcnEsIHVjYik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodWNiLT50c19pZGV2KTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQlrZnJlZSh1Y2IpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgdWNiMTQwMF90c19kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gInVjYjE0MDBfdHMiLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuYnVzCQk9ICZhYzk3X2J1c190eXBlLAotCS5wcm9iZQkJPSB1Y2IxNDAwX3RzX3Byb2JlLAotCS5yZW1vdmUJCT0gdWNiMTQwMF90c19yZW1vdmUsCi0JLnJlc3VtZQkJPSB1Y2IxNDAwX3RzX3Jlc3VtZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVjYjE0MDBfdHNfZHJpdmVyID0geworCS5wcm9iZQk9IHVjYjE0MDBfdHNfcHJvYmUsCisJLnJlbW92ZQk9IHVjYjE0MDBfdHNfcmVtb3ZlLAorCS5yZXN1bWUJPSB1Y2IxNDAwX3RzX3Jlc3VtZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ1Y2IxNDAwX3RzIiwKKwl9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdWNiMTQwMF90c19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmdWNiMTQwMF90c19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVjYjE0MDBfdHNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVjYjE0MDBfdHNfZXhpdCh2b2lkKQogewotCWRyaXZlcl91bnJlZ2lzdGVyKCZ1Y2IxNDAwX3RzX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVjYjE0MDBfdHNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX3BhcmFtKGFkY3N5bmMsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhZGNzeW5jLCAiU3luY2hyb25pemUgdG91Y2ggcmVhZGluZ3Mgd2l0aCBBRENTWU5DIHBpbi4iKTsKIAogbW9kdWxlX3BhcmFtKHRzX2RlbGF5LCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyh0c19kZWxheSwgIkRlbGF5IGJldHdlZW4gcGFuZWwgc2V0dXAgYW5kIHBvc2l0aW9uIHJlYWQuIERlZmF1bHQgPSA1NXVzLiIpOworTU9EVUxFX1BBUk1fREVTQyh0c19kZWxheSwgIkRlbGF5IGJldHdlZW4gcGFuZWwgc2V0dXAgYW5kIgorCQkJICAgICIgcG9zaXRpb24gcmVhZC4gRGVmYXVsdCA9IDU1dXMuIik7CiAKIG1vZHVsZV9wYXJhbSh0c19kZWxheV9wcmVzc3VyZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModHNfZGVsYXlfcHJlc3N1cmUsCi0JCSAgImRlbGF5IGJldHdlZW4gcGFuZWwgc2V0dXAgYW5kIHByZXNzdXJlIHJlYWQuICBEZWZhdWx0ID0gMHVzLiIpOworCQkiZGVsYXkgYmV0d2VlbiBwYW5lbCBzZXR1cCBhbmQgcHJlc3N1cmUgcmVhZC4iCisJCSIgIERlZmF1bHQgPSAwdXMuIik7CiAKIG1vZHVsZV9pbml0KHVjYjE0MDBfdHNfaW5pdCk7CiBtb2R1bGVfZXhpdCh1Y2IxNDAwX3RzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MDUuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzA1LmMKaW5kZXggMzcyZWZiYy4uNmI1YmU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MDUuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcwNS5jCkBAIC0yLDggKzIsNyBAQAogICogd205NzA1LmMgIC0tICBDb2RlYyBkcml2ZXIgZm9yIFdvbGZzb24gV005NzA1IEFDOTcgQ29kZWMuCiAgKgogICogQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KICAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KICAqICAgICAgICAgICAgICAgICAgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CkBAIC0zNDcsNiArMzQ2LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHdtOTcwNV9jb2RlYyk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV005NzA1IFRvdWNoIFNjcmVlbiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzEyLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMi5jCmluZGV4IGM4YmIxZTcuLjc0OTBiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzEyLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MTIuYwpAQCAtMiw4ICsyLDcgQEAKICAqIHdtOTcxMi5jICAtLSAgQ29kZWMgZHJpdmVyIGZvciBXb2xmc29uIFdNOTcxMiBBQzk3IENvZGVjcy4KICAqCiAgKiBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgotICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCi0gKiAgICAgICAgIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiAgKiBQYXJ0cyBDb3B5cmlnaHQgOiBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgogICogICAgICAgICAgICAgICAgICAgQW5kcmV3IFphYm9sb3RueSA8emFwQGhvbWVsaW5rLnJ1PgogICogICAgICAgICAgICAgICAgICAgUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KQEAgLTQ2Miw2ICs0NjEsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwod205NzEyX2NvZGVjKTsKIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCi1NT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJXTTk3MTIgVG91Y2ggU2NyZWVuIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MTMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205NzEzLmMKaW5kZXggNzgxZWU4My4uMjM4YjUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3MTMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTcxMy5jCkBAIC0yLDggKzIsNyBAQAogICogd205NzEzLmMgIC0tICBDb2RlYyB0b3VjaCBkcml2ZXIgZm9yIFdvbGZzb24gV005NzEzIEFDOTcgQ29kZWMuCiAgKgogICogQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KICAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KICAqICAgICAgICAgICAgICAgICAgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CkBAIC00NzYsNiArNDc1LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHdtOTcxM19jb2RlYyk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV005NzEzIFRvdWNoIFNjcmVlbiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYwppbmRleCBkNTg5YWIwLi5kMTVhYTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTd4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3eHgtY29yZS5jCkBAIC0zLDggKzMsNyBAQAogICogICAgICAgICAgICAgICAgICAgIGFuZCBXTTk3MTMgQUM5NyBDb2RlY3MuCiAgKgogICogQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogUGFydHMgQ29weXJpZ2h0IDogSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KICAqICAgICAgICAgICAgICAgICAgIEFuZHJldyBaYWJvbG90bnkgPHphcEBob21lbGluay5ydT4KICAqICAgICAgICAgICAgICAgICAgIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CkBAIC04MjQsNiArODIzLDYgQEAKIG1vZHVsZV9leGl0KHdtOTd4eF9leGl0KTsKIAogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCi1NT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJXTTk3eHggQ29yZSAtIFRvdWNoIFNjcmVlbiAvIEFVWCBBREMgLyBHUElPIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYyBiL2RyaXZlcnMvaW5wdXQveGVuLWtiZGZyb250LmMKaW5kZXggOWNlM2IzYi4uM2FiNjM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYworKysgYi9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jCkBAIC0zMzUsMTEgKzMzNSwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4ZW5rYmRfaW5pdCh2b2lkKQogewotCWlmICghaXNfcnVubmluZ19vbl94ZW4oKSkKKwlpZiAoIXhlbl9kb21haW4oKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBOb3RoaW5nIHRvIGRvIGlmIHJ1bm5pbmcgaW4gZG9tMC4gKi8KLQlpZiAoaXNfaW5pdGlhbF94ZW5kb21haW4oKSkKKwlpZiAoeGVuX2luaXRpYWxfZG9tYWluKCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIHhlbmJ1c19yZWdpc3Rlcl9mcm9udGVuZCgmeGVua2JkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwppbmRleCA4NzFiMGNiYy4uMWI1YmY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwpAQCAtMTIzMSw3ICsxMjMxLDcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCXN3aXRjaCAoY21kKSB7CiAJZGVmYXVsdDoKLQkJZXJyb3IgPSBuX3R0eV9pb2N0bCAodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWVycm9yID0gbl90dHlfaW9jdGxfaGVscGVyKHR0eSwgZmlsZSwgY21kLCBhcmcpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMTU1Myw4ICsxNTUzLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoY2FwaV9jbGFzcyk7CiAJfQogCi0JZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGNhcGlfY2xhc3MsIE5VTEwsIE1LREVWKGNhcGlfbWFqb3IsIDApLCBOVUxMLAotCQkJICAgICAgImNhcGkiKTsKKwlkZXZpY2VfY3JlYXRlKGNhcGlfY2xhc3MsIE5VTEwsIE1LREVWKGNhcGlfbWFqb3IsIDApLCBOVUxMLCAiY2FwaSIpOwogCiAjaWZkZWYgQ09ORklHX0lTRE5fQ0FQSV9NSURETEVXQVJFCiAJaWYgKGNhcGluY190dHlfaW5pdCgpIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKaW5kZXggNzU3MjZlYS4uNTM2MGM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCkBAIC04MjgsMTUgKzgyOCwxOCBAQAogCQkJcmV0dXJuIC1FU1JDSDsKIAkJaWYgKGNhcmQtPmxvYWRfZmlybXdhcmUgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgImtjYXBpOiBsb2FkOiBubyBsb2FkIGZ1bmN0aW9uXG4iKTsKKwkJCWNhcGlfY3RyX3B1dChjYXJkKTsKIAkJCXJldHVybiAtRVNSQ0g7CiAJCX0KIAogCQlpZiAobGRlZi50NGZpbGUubGVuIDw9IDApIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJrY2FwaTogbG9hZDogaW52YWxpZCBwYXJhbWV0ZXI6IGxlbmd0aCBvZiB0NGZpbGUgaXMgJWQgP1xuIiwgbGRlZi50NGZpbGUubGVuKTsKKwkJCWNhcGlfY3RyX3B1dChjYXJkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChsZGVmLnQ0ZmlsZS5kYXRhID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJrY2FwaTogbG9hZDogaW52YWxpZCBwYXJhbWV0ZXI6IGRhdGFwdHIgaXMgMFxuIik7CisJCQljYXBpX2N0cl9wdXQoY2FyZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC04NDksNiArODUyLDcgQEAKIAogCQlpZiAoY2FyZC0+Y2FyZHN0YXRlICE9IENBUkRfREVURUNURUQpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImtjYXBpOiBsb2FkOiBjb250cj0lZCBub3QgaW4gZGV0ZWN0IHN0YXRlXG4iLCBsZGVmLmNvbnRyKTsKKwkJCWNhcGlfY3RyX3B1dChjYXJkKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJY2FyZC0+Y2FyZHN0YXRlID0gQ0FSRF9MT0FESU5HOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvc2VyLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Nlci1naWdhc2V0LmMKaW5kZXggNWU4OWZhMS4uMDcwNTJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvc2VyLWdpZ2FzZXQuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jCkBAIC01NzEsNiArNTcxLDcgQEAKIAl9CiAKIAkvKiBwcmV2ZW50IG90aGVyIGNhbGxlcnMgZnJvbSBlbnRlcmluZyBsZGlzYyBtZXRob2RzICovCisJLyogRklYTUU6IHNob3VsZCB1c2UgdGhlIHR0eSBzdGF0ZSBmbGFncyAqLwogCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKIAogCWlmICghY3MtPmh3LnNlcikKQEAgLTY0MiwxMCArNjQzLDExIEBACiAJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVENHRVRTOgotCWNhc2UgVENHRVRBOgotCQkvKiBwYXNzIHRocm91Z2ggdG8gdW5kZXJseWluZyBzZXJpYWwgZGV2aWNlICovCi0JCXJjID0gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisKKwljYXNlIEZJT05SRUFEOgorCQkvKiB1bnVzZWQsIGFsd2F5cyByZXR1cm4gemVybyAqLworCQl2YWwgPSAwOworCQlyYyA9IHB1dF91c2VyKHZhbCwgcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBUQ0ZMU0g6CkBAIC02NTksMjAgKzY2MSwxMyBAQAogCQkJZmx1c2hfc2VuZF9xdWV1ZShjcyk7CiAJCQlicmVhazsKIAkJfQotCQkvKiBmbHVzaCB0aGUgc2VyaWFsIHBvcnQncyBidWZmZXIgKi8KLQkJcmMgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZJT05SRUFEOgotCQkvKiB1bnVzZWQsIGFsd2F5cyByZXR1cm4gemVybyAqLwotCQl2YWwgPSAwOwotCQlyYyA9IHB1dF91c2VyKHZhbCwgcCk7Ci0JCWJyZWFrOworCQkvKiBQYXNzIHRocm91Z2ggKi8KIAogCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT0lPQ1RMQ01EOworCQkvKiBwYXNzIHRocm91Z2ggdG8gdW5kZXJseWluZyBzZXJpYWwgZGV2aWNlICovCisJCXJjID0gbl90dHlfaW9jdGxfaGVscGVyKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKIAl9Ci0KIAljc19wdXQoY3MpOwogCXJldHVybiByYzsKIH0KQEAgLTY4MCw2ICs2NzUsOCBAQAogLyoKICAqIFBvbGwgb24gdGhlIHR0eS4KICAqIFVudXNlZCwgYWx3YXlzIHJldHVybiB6ZXJvLgorICoKKyAqIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgcmV0dXJuIGFuIGV4Y2VwdGlvbiAtIGVzcGVjaWFsbHkgb24gaGFuZ3VwCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGdpZ2FzZXRfdHR5X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwppbmRleCBhNWI5NDFjLi5jNzI1NjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKQEAgLTE1NCw4MyArMTU0LDUwIEBACiAgICAgCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RhdGljIGludCBnZXRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0JCSAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCitzdGF0aWMgaW50IGF2bWNzX2NvbmZpZ2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YsCisJCQkgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICAgIHZvaWQgKnByaXZfZGF0YSkKIHsKLSAgICBpbnQgaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSByZXR1cm4gaTsKLSAgICByZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKLX0KKwlpZiAoY2YtPmlvLm53aW4gPD0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLXN0YXRpYyBpbnQgZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0JCSAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCi17Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHJldHVybiBpOwotICAgIHJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQotCi1zdGF0aWMgaW50IG5leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0JCSAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCi17Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgcmV0dXJuIGk7Ci0gICAgcmV0dXJuIGdldF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2YtPmlvLndpblswXS5sZW47CisJcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXZtX2NzOiB0ZXN0aW5nIGkvbyAlI3gtJSN4XG4iLAorCSAgICAgICBwX2Rldi0+aW8uQmFzZVBvcnQxLAorCSAgICAgICBwX2Rldi0+aW8uQmFzZVBvcnQxK3BfZGV2LT5pby5OdW1Qb3J0czEtMSk7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKIH0KIAogc3RhdGljIGludCBhdm1jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwotICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CiAgICAgbG9jYWxfaW5mb190ICpkZXY7CiAgICAgaW50IGk7Ci0gICAgdV9jaGFyIGJ1Zls2NF07CiAgICAgY2hhciBkZXZuYW1lWzEyOF07CiAgICAgaW50IGNhcmR0eXBlOwogICAgIGludCAoKmFkZGNhcmQpKHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpcnEpOwogCiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAorICAgIGRldm5hbWVbMF0gPSAwOworICAgIGlmIChsaW5rLT5wcm9kX2lkWzFdKQorCSAgICBzdHJsY3B5KGRldm5hbWUsIGxpbmstPnByb2RfaWRbMV0sIHNpemVvZihkZXZuYW1lKSk7CisKKyAgICAvKgorICAgICAqIGZpbmQgSU8gcG9ydAorICAgICAqLworICAgIGlmIChwY21jaWFfbG9vcF9jb25maWcobGluaywgYXZtY3NfY29uZmlnY2hlY2ssIE5VTEwpKQorCSAgICByZXR1cm4gLUVOT0RFVjsKKwogICAgIGRvIHsKLQlkZXZuYW1lWzBdID0gMDsKLQlpZiAobGluay0+cHJvZF9pZFsxXSkKLQkJc3RybGNweShkZXZuYW1lLCBsaW5rLT5wcm9kX2lkWzFdLCBzaXplb2YoZGV2bmFtZSkpOwotCi0JLyoKLSAgICAgICAgICogZmluZCBJTyBwb3J0Ci0gICAgICAgICAqLwotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOyB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQl3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0JICAgIGlmIChjZi0+aW8ubndpbiA+IDApIHsKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJbGluay0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBjZi0+aW8ud2luWzBdLmxlbjsKLQkJbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJhdm1fY3M6IHRlc3RpbmcgaS9vICUjeC0lI3hcbiIsCi0JCQlsaW5rLT5pby5CYXNlUG9ydDEsCi0JCSAgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKLQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JCWlmIChpID09IENTX1NVQ0NFU1MpIGdvdG8gZm91bmRfcG9ydDsKLQkgICAgfQotCSAgICBpID0gbmV4dF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JfQotCi1mb3VuZF9wb3J0OgotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKLQkgICAgY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKLQkgICAgYnJlYWs7Ci0JfQotCiAJLyoKIAkgKiBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZQogCSAqLwogCWkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkgICAgY3NfZXJyb3IobGluaywgUmVxdWVzdElSUSwgaSk7CiAJICAgIC8qIHVuZG8gKi8KIAkgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwpAQCAtMjQxLDcgKzIwOCw3IEBACiAgICAgICAgICAqIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldAogCSAgKi8KIAlpID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkgICAgY3NfZXJyb3IobGluaywgUmVxdWVzdENvbmZpZ3VyYXRpb24sIGkpOwogCSAgICBwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CiAJICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19wY2kuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfcGNpLmgKaW5kZXggZmQyYzliZS4uNTc4M2QyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19wY2kuaAorKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX3BjaS5oCkBAIC0xODMsOCArMTgzLDggQEAKICNkZWZpbmUgRF9GUkVHX01BU0sgIDB4RgogCiBzdHJ1Y3QgenQgewotCXVuc2lnbmVkIHNob3J0IHoxOyAgLyogWjEgcG9pbnRlciAxNiBCaXQgKi8KLQl1bnNpZ25lZCBzaG9ydCB6MjsgIC8qIFoyIHBvaW50ZXIgMTYgQml0ICovCisJX19sZTE2IHoxOyAgLyogWjEgcG9pbnRlciAxNiBCaXQgKi8KKwlfX2xlMTYgejI7ICAvKiBaMiBwb2ludGVyIDE2IEJpdCAqLwogfTsKIAogc3RydWN0IGRmaWZvIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYwppbmRleCA5Y2Y1ZWRiLi5jZDgzMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3BjaS5jCkBAIC00Myw3ICs0Myw3IEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIDApOwogCiBzdGF0aWMgTElTVF9IRUFEKEhGQ2xpc3QpOwotREVGSU5FX1JXTE9DSyhIRkNsb2NrKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKEhGQ2xvY2spOwogCiBlbnVtIHsKIAlIRkNfQ0NEXzJCRDAsCkBAIC04OCw3ICs4OCw3IEBACiAJdW5zaWduZWQgY2hhcgkJYnN3YXBwZWQ7CiAJdW5zaWduZWQgY2hhcgkJcHJvdG9jb2w7CiAJaW50CQkJbnRfdGltZXI7Ci0JdW5zaWduZWQgY2hhcgkJKnBjaV9pbzsgLyogc3RhcnQgb2YgUENJIElPIG1lbW9yeSAqLworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAJKnBjaV9pbzsgLyogc3RhcnQgb2YgUENJIElPIG1lbW9yeSAqLwogCWRtYV9hZGRyX3QJCWRtYWhhbmRsZTsKIAl2b2lkCQkJKmZpZm9zOyAvKiBGSUZPIG1lbW9yeSAqLwogCWludAkJCWxhc3RfYmZpZm9fY250WzJdOwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGhjLT5wZGV2LCBQQ0lfQ09NTUFORCwgMCk7CiAJZGVsX3RpbWVyKCZoYy0+aHcudGltZXIpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGMtPnBkZXYsIDB4ODAwMCwgaGMtPmh3LmZpZm9zLCBoYy0+aHcuZG1haGFuZGxlKTsKLQlpb3VubWFwKCh2b2lkICopaGMtPmh3LnBjaV9pbyk7CisJaW91bm1hcChoYy0+aHcucGNpX2lvKTsKIH0KIAogLyoKQEAgLTM2Niw4ICszNjYsNyBAQAogCWJ6dC0+ZjIgPSBNQVhfQl9GUkFNRVM7CiAJYnp0LT5mMSA9IGJ6dC0+ZjI7CS8qIGluaXQgRiBwb2ludGVycyB0byByZW1haW4gY29uc3RhbnQgKi8KIAlienQtPnphW01BWF9CX0ZSQU1FU10uejEgPSBjcHVfdG9fbGUxNihCX0ZJRk9fU0laRSArIEJfU1VCX1ZBTCAtIDEpOwotCWJ6dC0+emFbTUFYX0JfRlJBTUVTXS56MiA9IGNwdV90b19sZTE2KAotCSAgICBsZTE2X3RvX2NwdShienQtPnphW01BWF9CX0ZSQU1FU10uejEgLSAxKSk7CisJYnp0LT56YVtNQVhfQl9GUkFNRVNdLnoyID0gY3B1X3RvX2xlMTYoQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwgLSAyKTsKIAlpZiAoZmlmb19zdGF0ZSkKIAkJaGMtPmh3LmZpZm9fZW4gfD0gZmlmb19zdGF0ZTsKIAlXcml0ZV9oZmMoaGMsIEhGQ1BDSV9GSUZPX0VOLCBoYy0+aHcuZmlmb19lbik7CkBAIC00ODIsNyArNDgxLDcgQEAKIAkJCWRmLT5mMiA9ICgoZGYtPmYyICsgMSkgJiBNQVhfRF9GUkFNRVMpIHwKIAkJCSAgICAoTUFYX0RfRlJBTUVTICsgMSk7CS8qIG5leHQgYnVmZmVyICovCiAJCQlkZi0+emFbZGYtPmYyICYgRF9GUkVHX01BU0tdLnoyID0KLQkJCSAgICBjcHVfdG9fbGUxNigoenAtPnoyICsgcmNudCkgJiAoRF9GSUZPX1NJWkUgLSAxKSk7CisJCQkgICAgY3B1X3RvX2xlMTYoKGxlMTZfdG9fY3B1KHpwLT56MikgKyByY250KSAmIChEX0ZJRk9fU0laRSAtIDEpKTsKIAkJfSBlbHNlIHsKIAkJCWRjaC0+cnhfc2tiID0gbUlfYWxsb2Nfc2tiKHJjbnQgLSAzLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghZGNoLT5yeF9za2IpIHsKQEAgLTUyMywxMCArNTIyLDEwIEBACiAvKgogICogY2hlY2sgZm9yIHRyYW5zcGFyZW50IHJlY2VpdmUgZGF0YSBhbmQgcmVhZCBtYXggb25lIHRocmVzaG9sZCBzaXplIGlmIGF2YWlsCiAgKi8KLWludAorc3RhdGljIGludAogaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMoc3RydWN0IGJjaGFubmVsICpiY2gsIHN0cnVjdCBiemZpZm8gKmJ6LCB1X2NoYXIgKmJkYXRhKQogewotCXVuc2lnbmVkIHNob3J0CSp6MXIsICp6MnI7CisJIF9fbGUxNiAqejFyLCAqejJyOwogCWludAkJbmV3X3oyLCBmY250LCBtYXhsZW47CiAJdV9jaGFyCQkqcHRyLCAqcHRyMTsKIApAQCAtNTc2LDcgKzU3NSw3IEBACiAvKgogICogQi1jaGFubmVsIG1haW4gcmVjZWl2ZSByb3V0aW5lCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBtYWluX3JlY19oZmNwY2koc3RydWN0IGJjaGFubmVsICpiY2gpCiB7CiAJc3RydWN0IGhmY19wY2kJKmhjID0gYmNoLT5odzsKQEAgLTcyNCw3ICs3MjMsNyBAQAogCXN0cnVjdCBiemZpZm8JKmJ6OwogCXVfY2hhcgkJKmJkYXRhOwogCXVfY2hhcgkJbmV3X2YxLCAqc3JjLCAqZHN0OwotCXVuc2lnbmVkIHNob3J0CSp6MXQsICp6MnQ7CisJX19sZTE2ICp6MXQsICp6MnQ7CiAKIAlpZiAoKGJjaC0+ZGVidWcgJiBERUJVR19IV19CQ0hBTk5FTCkgJiYgIShiY2gtPmRlYnVnICYgREVCVUdfSFdfQkZJRk8pKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIF9fZnVuY19fKTsKQEAgLTE2NzksNyArMTY3OCw3IEBACiAgKiBjYWxsZWQgZm9yIGNhcmQgaW5pdCBtZXNzYWdlCiAgKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGluaXRoZmNwY2koc3RydWN0IGhmY19wY2kgKmhjKQogewogCXByaW50ayhLRVJOX0RFQlVHICJpbml0aGZjcGNpOiBlbnRlcmVkXG4iKTsKQEAgLTE5NjYsNyArMTk2NSw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQy1QQ0k6IE5vIElSUSBmb3IgUENJIGNhcmQgZm91bmRcbiIpOwogCQlyZXR1cm4gMTsKIAl9Ci0JaGMtPmh3LnBjaV9pbyA9IChjaGFyICopKHVsb25nKWhjLT5wZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKKwloYy0+aHcucGNpX2lvID0gKGNoYXIgX19pb21lbSAqKSh1bnNpZ25lZCBsb25nKWhjLT5wZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKIAogCWlmICghaGMtPmh3LnBjaV9pbykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJIRkMtUENJOiBObyBJTy1NZW0gZm9yIFBDSSBjYXJkIGZvdW5kXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKaW5kZXggZmM2Y2MyYy4uMjM1NjBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKQEAgLTE3NCwzOCArMTc0LDI5IEBACiAgICAgCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RhdGljIGludCBnZXRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0JCSAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCitzdGF0aWMgaW50IGF2bWExY3NfY29uZmlnY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHZjYywKKwkJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCiB7Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgcmV0dXJuIGk7Ci0gICAgcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJaWYgKGNmLT5pby5ud2luIDw9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gY2YtPmlvLndpblswXS5sZW47CisJcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXZtYTFfY3M6IHRlc3RpbmcgaS9vICUjeC0lI3hcbiIsCisJICAgICAgIHBfZGV2LT5pby5CYXNlUG9ydDEsCisJICAgICAgIHBfZGV2LT5pby5CYXNlUG9ydDErcF9kZXYtPmlvLk51bVBvcnRzMS0xKTsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOwogfQogCi1zdGF0aWMgaW50IGZpcnN0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAotCQkgICAgIGNpc3BhcnNlX3QgKnBhcnNlKQotewotICAgIGludCBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSByZXR1cm4gaTsKLSAgICByZXR1cm4gZ2V0X3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKLX0KLQotc3RhdGljIGludCBuZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAotCQkgICAgIGNpc3BhcnNlX3QgKnBhcnNlKQotewotICAgIGludCBpID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgdHVwbGUpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHJldHVybiBpOwotICAgIHJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQogCiBzdGF0aWMgaW50IGF2bWExY3NfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OwogICAgIGxvY2FsX2luZm9fdCAqZGV2OwogICAgIGludCBpOwotICAgIHVfY2hhciBidWZbNjRdOwogICAgIGNoYXIgZGV2bmFtZVsxMjhdOwogICAgIElzZG5DYXJkX3QJaWNhcmQ7CiAgICAgaW50IGJ1c3kgPSAwOwpAQCAtMjE0LDQ1ICsyMDUsMTkgQEAKIAogICAgIERFQlVHKDAsICJhdm1hMWNzX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKKyAgICBkZXZuYW1lWzBdID0gMDsKKyAgICBpZiAobGluay0+cHJvZF9pZFsxXSkKKwkgICAgc3RybGNweShkZXZuYW1lLCBsaW5rLT5wcm9kX2lkWzFdLCBzaXplb2YoZGV2bmFtZSkpOworCisgICAgaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBhdm1hMWNzX2NvbmZpZ2NoZWNrLCBOVUxMKSkKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisKICAgICBkbyB7Ci0JZGV2bmFtZVswXSA9IDA7Ci0JaWYgKGxpbmstPnByb2RfaWRbMV0pCi0JCXN0cmxjcHkoZGV2bmFtZSwgbGluay0+cHJvZF9pZFsxXSwgc2l6ZW9mKGRldm5hbWUpKTsKLQotCS8qCi0gICAgICAgICAqIGZpbmQgSU8gcG9ydAotICAgICAgICAgKi8KLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCWkgPSBmaXJzdF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0Jd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgewotCSAgICBpZiAoY2YtPmlvLm53aW4gPiAwKSB7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7Ci0JCWxpbmstPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gY2YtPmlvLndpblswXS5sZW47Ci0JCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCXByaW50ayhLRVJOX0lORk8gImF2bWExX2NzOiB0ZXN0aW5nIGkvbyAlI3gtJSN4XG4iLAotCQkJbGluay0+aW8uQmFzZVBvcnQxLAotCQkJbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMSAtIDEpOwotCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgZ290byBmb3VuZF9wb3J0OwotCSAgICB9Ci0JICAgIGkgPSBuZXh0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLQl9Ci0KLWZvdW5kX3BvcnQ6Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgewotCSAgICBjc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGkpOwotCSAgICBicmVhazsKLQl9Ci0JCiAJLyoKIAkgKiBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZQogCSAqLwogCWkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkgICAgY3NfZXJyb3IobGluaywgUmVxdWVzdElSUSwgaSk7CiAJICAgIC8qIHVuZG8gKi8KIAkgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwpAQCAtMjYzLDcgKzIyOCw3IEBACiAJICogY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0CiAJICovCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAoaSAhPSAwKSB7CiAJICAgIGNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKIAkgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwogCSAgICBicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCmluZGV4IGRiN2U2NDQuLmY0ZDBmZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwpAQCAtMjAzLDgyICsyMDMsNTUgQEAKICAgICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludCBnZXRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICBjaXNwYXJzZV90ICpwYXJzZSkKLXsKLSAgICBpbnQgaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSByZXR1cm4gaTsKLSAgICByZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKLX0KIAotc3RhdGljIGludCBmaXJzdF90dXBsZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNpc3BhcnNlX3QgKnBhcnNlKQorc3RhdGljIGludCBlbHNhX2NzX2NvbmZpZ2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQogewotICAgIGludCBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSByZXR1cm4gaTsKLSAgICByZXR1cm4gZ2V0X3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKLX0KKwlpbnQgajsKIAotc3RhdGljIGludCBuZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAotICAgICAgICAgICAgICAgICAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCi17Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgcmV0dXJuIGk7Ci0gICAgcmV0dXJuIGdldF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIGNmLT5pby53aW5bMF0uYmFzZSkgeworCQlwcmludGsoS0VSTl9JTkZPICIoZWxzYV9jczogbG9va3MgbGlrZSB0aGUgOTYgbW9kZWwpXG4iKTsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIoZWxzYV9jczogbG9va3MgbGlrZSB0aGUgOTcgbW9kZWwpXG4iKTsKKwkJZm9yIChqID0gMHgyZjA7IGogPiAweDEwMDsgaiAtPSAweDEwKSB7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gajsKKwkJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50IGVsc2FfY3NfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICBsb2NhbF9pbmZvX3QgKmRldjsKLSAgICBpbnQgaSwgaiwgbGFzdF9mbjsKLSAgICB1X3Nob3J0IGJ1ZlsxMjhdOwotICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CisgICAgaW50IGksIGxhc3RfZm47CiAgICAgSXNkbkNhcmRfdCBpY2FyZDsKIAogICAgIERFQlVHKDAsICJlbHNhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOyB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLSAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0gICAgICAgIGlmICggKGNmLT5pby5ud2luID4gMCkgJiYgY2YtPmlvLndpblswXS5iYXNlKSB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIoZWxzYV9jczogbG9va3MgbGlrZSB0aGUgOTYgbW9kZWwpXG4iKTsKLSAgICAgICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7Ci0gICAgICAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0gICAgICAgICAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLSAgICAgICAgICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIihlbHNhX2NzOiBsb29rcyBsaWtlIHRoZSA5NyBtb2RlbClcbiIpOwotICAgICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7Ci0gICAgICAgICAgZm9yIChpID0gMCwgaiA9IDB4MmYwOyBqID4gMHgxMDA7IGogLT0gMHgxMCkgewotICAgICAgICAgICAgbGluay0+aW8uQmFzZVBvcnQxID0gajsKLSAgICAgICAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotICAgICAgICAgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkgPSBuZXh0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLSAgICB9Ci0KLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisgICAgaSA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBlbHNhX2NzX2NvbmZpZ2NoZWNrLCBOVUxMKTsKKyAgICBpZiAoaSAhPSAwKSB7CiAJbGFzdF9mbiA9IFJlcXVlc3RJTzsKIAlnb3RvIGNzX2ZhaWxlZDsKICAgICB9CiAKICAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSA9IDA7CiAJbGFzdF9mbiA9IFJlcXVlc3RJUlE7CiAgICAgICAgIGdvdG8gY3NfZmFpbGVkOwogICAgIH0KIAogICAgIGkgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisgICAgaWYgKGkgIT0gMCkgewogICAgICAgbGFzdF9mbiA9IFJlcXVlc3RDb25maWd1cmF0aW9uOwogICAgICAgZ290byBjc19mYWlsZWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCmluZGV4IDQzOWNiNTMuLjlhM2M5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKQEAgLTIxNywxMDEgKzIxNyw2MSBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW50IHNlZGxiYXVlcl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCitzdGF0aWMgaW50IHNlZGxiYXVlcl9jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJCSAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkJICB2b2lkICpwcml2X2RhdGEpCiB7Ci0gICAgbG9jYWxfaW5mb190ICpkZXYgPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7Ci0gICAgdTggYnVmWzY0XTsKLSAgICBjb25maWdfaW5mb190IGNvbmY7Ci0gICAgd2luX3JlcV90IHJlcTsKLSAgICBtZW1yZXFfdCBtYXA7Ci0gICAgSXNkbkNhcmRfdCAgaWNhcmQ7CisJd2luX3JlcV90ICpyZXEgPSBwcml2X2RhdGE7CiAKLSAgICBERUJVRygwLCAic2VkbGJhdWVyX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisJaWYgKGNmZy0+aW5kZXggPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCi0gICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7Ci0KLSAgICAvKgotICAgICAgSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cmllcywKLSAgICAgIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKLSAgICAgIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywgYW5kIGludGVycnVwdCBzZXR0aW5ncy4KLQotICAgICAgV2UgbWFrZSBubyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY2FyZCB0byBiZSBjb25maWd1cmVkOiB3ZSB1c2UKLSAgICAgIGp1c3QgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQ0lTLiAgSW4gYW4gaWRlYWwgd29ybGQsCi0gICAgICB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzIGEgY29tcGxldGUKLSAgICAgIGFuZCBhY2N1cmF0ZSBDSVMuICBJbiBwcmFjdGljZSwgYSBkcml2ZXIgdXN1YWxseSAia25vd3MiIG1vc3Qgb2YKLSAgICAgIHRoZXNlIHRoaW5ncyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIENJUywgYW5kIG1vc3QgY2xpZW50IGRyaXZlcnMKLSAgICAgIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KLSAgICAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgd2hpbGUgKDEpIHsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOwotCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSAhPSAwIHx8Ci0JCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKLQkgICAgZ290byBuZXh0X2VudHJ5OwotCi0JaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKSBkZmx0ID0gKmNmZzsKLQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7Ci0JbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JCiAJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCiAJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgewotCSAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKLQkgICAgbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQlwX2Rldi0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKIAl9Ci0JCisKIAkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KIAkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KIAlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkgICAgaWYgKGNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMCkKLQkJZ290byBuZXh0X2VudHJ5OwotCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkgICAgaWYgKGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMCkKLQkJZ290byBuZXh0X2VudHJ5OworCQlpZiAodmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMCkKKwkJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSBpZiAoZGZsdC0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gZGZsdC0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMCkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KLQkgICAgCisKIAlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQotCSAgICBsaW5rLT5jb25mLlZwcCA9Ci0JCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQotCSAgICBsaW5rLT5jb25mLlZwcCA9Ci0JCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCisJCXBfZGV2LT5jb25mLlZwcCA9IGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJZWxzZSBpZiAoZGZsdC0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0gZGZsdC0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisKIAkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KLQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCi0JICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0JCisJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQtPmlycS5JUlFJbmZvMSkKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKIAkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JICAgIGNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkgICAgaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkgICAgaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLS8qIG5ldyBpbiBkdW1teS5jcyAyMDAxLzAxLzI4IE1OIAotICAgICAgICAgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLSovCi0JICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JICAgIGlmIChpby0+bndpbiA+IDEpIHsKLQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkgICAgfQotCSAgICAvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCSAgICBpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSAhPSAwKQotCQlnb3RvIG5leHRfZW50cnk7CisJcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgeworCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOworCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKgpAQCAtMzI1LDMwICsyODUsNTQgQEAKIAkgIG5lZWRzIHRvIGJlIG1hcHBlZCB0byB2aXJ0dWFsIHNwYWNlIHdpdGggaW9yZW1hcCgpIGJlZm9yZSBpdAogCSAgaXMgdXNlZC4KIAkqLwotCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0Lm1lbS5ud2luID4gMCkpIHsKLQkgICAgY2lzdHBsX21lbV90ICptZW0gPQotCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC5tZW07Ci0JICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNOwotCSAgICByZXEuQXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOwotCSAgICByZXEuQmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKLQkgICAgcmVxLlNpemUgPSBtZW0tPndpblswXS5sZW47Ci0vKiBuZXcgaW4gZHVtbXkuY3MgMjAwMS8wMS8yOCBNTiAKLSAgICAgICAgICAgIGlmIChyZXEuU2l6ZSA8IDB4MTAwMCkKLSAgICAgICAgICAgICAgICByZXEuU2l6ZSA9IDB4MTAwMDsKLSovCi0JICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7Ci0JICAgIGlmIChwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmssICZyZXEsICZsaW5rLT53aW4pICE9IDApCi0JCWdvdG8gbmV4dF9lbnRyeTsKLQkgICAgbWFwLlBhZ2UgPSAwOyBtYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKLQkgICAgaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQotCQlnb3RvIG5leHRfZW50cnk7CisJaWYgKChjZmctPm1lbS5ud2luID4gMCkgfHwgKGRmbHQtPm1lbS5ud2luID4gMCkpIHsKKwkJY2lzdHBsX21lbV90ICptZW0gPSAoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC0+bWVtOworCQltZW1yZXFfdCBtYXA7CisJCXJlcS0+QXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKKwkJcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9FTkFCTEU7CisJCXJlcS0+QmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKKwkJcmVxLT5TaXplID0gbWVtLT53aW5bMF0ubGVuOworCQlyZXEtPkFjY2Vzc1NwZWVkID0gMDsKKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmcF9kZXYsIHJlcSwgJnBfZGV2LT53aW4pICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJbWFwLlBhZ2UgPSAwOworCQltYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKKwkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UocF9kZXYtPndpbiwgJm1hcCkgIT0gMCkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KLQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0JYnJlYWs7CisJcmV0dXJuIDA7Cit9CiAKLSAgICBuZXh0X2VudHJ5OgotCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIH0KKworCitzdGF0aWMgaW50IHNlZGxiYXVlcl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCit7CisgICAgbG9jYWxfaW5mb190ICpkZXYgPSBsaW5rLT5wcml2OworICAgIHdpbl9yZXFfdCAqcmVxOworICAgIGludCBsYXN0X2ZuLCBsYXN0X3JldDsKKyAgICBJc2RuQ2FyZF90ICBpY2FyZDsKKworICAgIERFQlVHKDAsICJzZWRsYmF1ZXJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHJlcSA9IGt6YWxsb2Moc2l6ZW9mKHdpbl9yZXFfdCksIEdGUF9LRVJORUwpOworICAgIGlmICghcmVxKQorCSAgICByZXR1cm4gLUVOT01FTTsKKworICAgIC8qCisgICAgICBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzLAorICAgICAgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZworICAgICAgdm9sdGFnZSwgSU8gd2luZG93LCBtZW1vcnkgd2luZG93LCBhbmQgaW50ZXJydXB0IHNldHRpbmdzLgorCisgICAgICBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlIHVzZQorICAgICAganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbCB3b3JsZCwKKyAgICAgIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMgYSBjb21wbGV0ZQorICAgICAgYW5kIGFjY3VyYXRlIENJUy4gIEluIHByYWN0aWNlLCBhIGRyaXZlciB1c3VhbGx5ICJrbm93cyIgbW9zdCBvZgorICAgICAgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLCBhbmQgbW9zdCBjbGllbnQgZHJpdmVycworICAgICAgd2lsbCBvbmx5IHVzZSB0aGUgQ0lTIHRvIGZpbGwgaW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorICAgICovCisgICAgbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgc2VkbGJhdWVyX2NvbmZpZ19jaGVjaywgcmVxKTsKKyAgICBpZiAobGFzdF9yZXQpCisJICAgIGdvdG8gZmFpbGVkOwogCiAgICAgLyoKICAgICAgICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCkBAIC0zODcsOCArMzcxLDggQEAKIAlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCiAJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7CiAgICAgaWYgKGxpbmstPndpbikKLQlwcmludGsoIiwgbWVtIDB4JTA2bHgtMHglMDZseCIsIHJlcS5CYXNlLAotCSAgICAgICByZXEuQmFzZStyZXEuU2l6ZS0xKTsKKwlwcmludGsoIiwgbWVtIDB4JTA2bHgtMHglMDZseCIsIHJlcS0+QmFzZSwKKwkgICAgICAgcmVxLT5CYXNlK3JlcS0+U2l6ZS0xKTsKICAgICBwcmludGsoIlxuIik7CiAKICAgICBpY2FyZC5wYXJhWzBdID0gbGluay0+aXJxLkFzc2lnbmVkSVJROwpAQCAtNDA5LDYgKzM5Myw3IEBACiAKIGNzX2ZhaWxlZDoKICAgICBjc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CiAgICAgc2VkbGJhdWVyX3JlbGVhc2UobGluayk7CiAgICAgcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKaW5kZXggYWI0YmQ0NS4uNjIzZDExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKQEAgLTE5Myw4MiArMTkzLDU1IEBACiAgICAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgZ2V0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAotICAgICAgICAgICAgICAgICAgICAgY2lzcGFyc2VfdCAqcGFyc2UpCi17Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgcmV0dXJuIGk7Ci0gICAgcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7Ci19CiAKLXN0YXRpYyBpbnQgZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICBjaXNwYXJzZV90ICpwYXJzZSkKK3N0YXRpYyBpbnQgdGVsZXNfY3NfY29uZmlnY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkJdW5zaWduZWQgaW50IHZjYywKKwkJCQl2b2lkICpwcml2X2RhdGEpCiB7Ci0gICAgaW50IGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHJldHVybiBpOwotICAgIHJldHVybiBnZXRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQorCWludCBqOwogCi1zdGF0aWMgaW50IG5leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICBjaXNwYXJzZV90ICpwYXJzZSkKLXsKLSAgICBpbnQgaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSByZXR1cm4gaTsKLSAgICByZXR1cm4gZ2V0X3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKKwlpZiAoKGNmLT5pby5ud2luID4gMCkgJiYgY2YtPmlvLndpblswXS5iYXNlKSB7CisJCXByaW50ayhLRVJOX0lORk8gIih0ZWxlc19jczogbG9va3MgbGlrZSB0aGUgOTYgbW9kZWwpXG4iKTsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIodGVsZXNfY3M6IGxvb2tzIGxpa2UgdGhlIDk3IG1vZGVsKVxuIik7CisJCWZvciAoaiA9IDB4MmYwOyBqID4gMHgxMDA7IGogLT0gMHgxMCkgeworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGo7CisJCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIGludCB0ZWxlc19jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIGxvY2FsX2luZm9fdCAqZGV2OwotICAgIGludCBpLCBqLCBsYXN0X2ZuOwotICAgIHVfc2hvcnQgYnVmWzEyOF07Ci0gICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKyAgICBpbnQgaSwgbGFzdF9mbjsKICAgICBJc2RuQ2FyZF90IGljYXJkOwogCiAgICAgREVCVUcoMCwgInRlbGVzX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOyB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLSAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0gICAgICAgIGlmICggKGNmLT5pby5ud2luID4gMCkgJiYgY2YtPmlvLndpblswXS5iYXNlKSB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIodGVsZXNfY3M6IGxvb2tzIGxpa2UgdGhlIDk2IG1vZGVsKVxuIik7Ci0gICAgICAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OwotICAgICAgICAgICAgbGluay0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotICAgICAgICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIodGVsZXNfY3M6IGxvb2tzIGxpa2UgdGhlIDk3IG1vZGVsKVxuIik7Ci0gICAgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLSAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMHgyZjA7IGogPiAweDEwMDsgaiAtPSAweDEwKSB7Ci0gICAgICAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBqOwotICAgICAgICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IG5leHRfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotICAgIH0KLQotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHRlbGVzX2NzX2NvbmZpZ2NoZWNrLCBOVUxMKTsKKyAgICBpZiAoaSAhPSAwKSB7CiAJbGFzdF9mbiA9IFJlcXVlc3RJTzsKIAlnb3RvIGNzX2ZhaWxlZDsKICAgICB9CiAKICAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSA9IDA7CiAJbGFzdF9mbiA9IFJlcXVlc3RJUlE7CiAgICAgICAgIGdvdG8gY3NfZmFpbGVkOwogICAgIH0KIAogICAgIGkgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisgICAgaWYgKGkgIT0gMCkgewogICAgICAgbGFzdF9mbiA9IFJlcXVlc3RDb25maWd1cmF0aW9uOwogICAgICAgZ290byBjc19mYWlsZWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCmluZGV4IDEyN2NmZGEuLjc3YzI4MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKQEAgLTE1MzMsOCArMTUzMywxMCBAQAogCWludCBzeiA9IElTRE5fTUFYX0NIQU5ORUxTKnNpemVvZihpcHBwX2J1bmRsZSk7CiAJaWYoIChpc2RuX3BwcF9idW5kbGVfYXJyID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCkpID09IE5VTEwgKQogCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IoIGkgPSAwOyBpIDwgSVNETl9NQVhfQ0hBTk5FTFM7IGkrKyApCisJZm9yIChpID0gMDsgaSA8IElTRE5fTUFYX0NIQU5ORUxTOyBpKyspIHsKIAkJc3Bpbl9sb2NrX2luaXQoJmlzZG5fcHBwX2J1bmRsZV9hcnJbaV0ubG9jayk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmlzZG5fcHBwX2J1bmRsZV9hcnJbaV0uZnJhZ3MpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2Nyw3ICsxNTY5LDcgQEAKIAkJaWYgKChscC0+bmV0ZGV2LT5wYiA9IGlzZG5fcHBwX21wX2J1bmRsZV9hbGxvYygpKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWxwLT5uZXh0ID0gbHAtPmxhc3QgPSBscDsJLyogbm9ib2R5IGVsc2UgaW4gYSBxdWV1ZSAqLwotCQlscC0+bmV0ZGV2LT5wYi0+ZnJhZ3MgPSBOVUxMOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZscC0+bmV0ZGV2LT5wYi0+ZnJhZ3MpOwogCQlscC0+bmV0ZGV2LT5wYi0+ZnJhbWVzID0gMDsKIAkJbHAtPm5ldGRldi0+cGItPnNlcSA9IFVJTlRfTUFYOwogCX0KQEAgLTE1NzksMjggKzE1ODEsMjkgQEAKIAogc3RhdGljIHUzMiBpc2RuX3BwcF9tcF9nZXRfc2VxKCBpbnQgc2hvcnRfc2VxLCAKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKiBza2IsIHUzMiBsYXN0X3NlcSApOwotc3RhdGljIHN0cnVjdCBza19idWZmICogaXNkbl9wcHBfbXBfZGlzY2FyZCggaXBwcF9idW5kbGUgKiBtcCwKLQkJCXN0cnVjdCBza19idWZmICogZnJvbSwgc3RydWN0IHNrX2J1ZmYgKiB0byApOwotc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfcmVhc3NlbWJseSggaXNkbl9uZXRfZGV2ICogbmV0X2RldiwgaXNkbl9uZXRfbG9jYWwgKiBscCwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqIGZyb20sIHN0cnVjdCBza19idWZmICogdG8gKTsKLXN0YXRpYyB2b2lkIGlzZG5fcHBwX21wX2ZyZWVfc2tiKCBpcHBwX2J1bmRsZSAqIG1wLCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiApOworc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfZGlzY2FyZChpcHBwX2J1bmRsZSAqbXAsIHN0cnVjdCBza19idWZmICpmcm9tLAorCQkJCXN0cnVjdCBza19idWZmICp0byk7CitzdGF0aWMgdm9pZCBpc2RuX3BwcF9tcF9yZWFzc2VtYmx5KGlzZG5fbmV0X2RldiAqbmV0X2RldiwgaXNkbl9uZXRfbG9jYWwgKmxwLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpmcm9tLCBzdHJ1Y3Qgc2tfYnVmZiAqdG8sCisJCQkJICAgdTMyIGxhc3RzZXEpOworc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfZnJlZV9za2IoaXBwcF9idW5kbGUgKm1wLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIGlzZG5fcHBwX21wX3ByaW50X3JlY3ZfcGt0KCBpbnQgc2xvdCwgc3RydWN0IHNrX2J1ZmYgKiBza2IgKTsKIAogc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfcmVjZWl2ZShpc2RuX25ldF9kZXYgKiBuZXRfZGV2LCBpc2RuX25ldF9sb2NhbCAqIGxwLCAKLQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJCXN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwcHBfc3RydWN0ICppczsKLQlpc2RuX25ldF9sb2NhbCAqIGxwcTsKLQlpcHBwX2J1bmRsZSAqIG1wOwotCWlzZG5fbXBwcF9zdGF0cyAqIHN0YXRzOwotCXN0cnVjdCBza19idWZmICogbmV3ZnJhZywgKiBmcmFnLCAqIHN0YXJ0LCAqbmV4dGY7CisJc3RydWN0IHNrX2J1ZmYgKm5ld2ZyYWcsICpmcmFnLCAqc3RhcnQsICpuZXh0ZjsKIAl1MzIgbmV3c2VxLCBtaW5zZXEsIHRoaXNzZXE7CisJaXNkbl9tcHBwX3N0YXRzICpzdGF0czsKKwlzdHJ1Y3QgaXBwcF9zdHJ1Y3QgKmlzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXNkbl9uZXRfbG9jYWwgKmxwcTsKKwlpcHBwX2J1bmRsZSAqbXA7CiAJaW50IHNsb3Q7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0X2Rldi0+cGItPmxvY2ssIGZsYWdzKTsKLSAgICAJbXAgPSBuZXRfZGV2LT5wYjsKLSAgICAgICAgc3RhdHMgPSAmbXAtPnN0YXRzOworCW1wID0gbmV0X2Rldi0+cGI7CisJc3RhdHMgPSAmbXAtPnN0YXRzOwogCXNsb3QgPSBscC0+cHBwX3Nsb3Q7CiAJaWYgKHNsb3QgPCAwIHx8IHNsb3QgPj0gSVNETl9NQVhfQ0hBTk5FTFMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbHAtPnBwcF9zbG90KCVkKVxuIiwKQEAgLTE2MTEsMjAgKzE2MTQsMTkgQEAKIAkJcmV0dXJuOwogCX0KIAlpcyA9IGlwcHBfdGFibGVbc2xvdF07Ci0gICAgCWlmKCArK21wLT5mcmFtZXMgPiBzdGF0cy0+bWF4X3F1ZXVlX2xlbiApCisJaWYgKCsrbXAtPmZyYW1lcyA+IHN0YXRzLT5tYXhfcXVldWVfbGVuKQogCQlzdGF0cy0+bWF4X3F1ZXVlX2xlbiA9IG1wLT5mcmFtZXM7Ci0JCisKIAlpZiAoaXMtPmRlYnVnICYgMHg4KQogCQlpc2RuX3BwcF9tcF9wcmludF9yZWN2X3BrdChscC0+cHBwX3Nsb3QsIHNrYik7CiAKLQluZXdzZXEgPSBpc2RuX3BwcF9tcF9nZXRfc2VxKGlzLT5tcHBwY2ZnICYgU0NfSU5fU0hPUlRfU0VRLCAKLQkJCQkJCXNrYiwgaXMtPmxhc3RfbGlua19zZXFubyk7Ci0KKwluZXdzZXEgPSBpc2RuX3BwcF9tcF9nZXRfc2VxKGlzLT5tcHBwY2ZnICYgU0NfSU5fU0hPUlRfU0VRLAorCQkJCSAgICAgc2tiLCBpcy0+bGFzdF9saW5rX3NlcW5vKTsKIAogCS8qIGlmIHRoaXMgcGFja2V0IHNlcSAjIGlzIGxlc3MgdGhhbiBsYXN0IGFscmVhZHkgcHJvY2Vzc2VkIG9uZSwKIAkgKiB0b3NzIGl0IHJpZ2h0IGF3YXksIGJ1dCBjaGVjayBmb3Igc2VxdWVuY2Ugc3RhcnQgY2FzZSBmaXJzdCAKIAkgKi8KLQlpZiggbXAtPnNlcSA+IE1QX0xPTkdTRVFfTUFYICYmIChuZXdzZXEgJiBNUF9MT05HU0VRX01BWEJJVCkgKSB7CisJaWYgKG1wLT5zZXEgPiBNUF9MT05HU0VRX01BWCAmJiAobmV3c2VxICYgTVBfTE9OR1NFUV9NQVhCSVQpKSB7CiAJCW1wLT5zZXEgPSBuZXdzZXE7CS8qIHRoZSBmaXJzdCBwYWNrZXQ6IHJlcXVpcmVkIGZvcgogCQkJCQkgKiByZmMxOTkwIG5vbi1jb21wbGlhbnQgY2xpZW50cyAtLQogCQkJCQkgKiBwcmV2ZW50cyBjb25zdGFudCBwYWNrZXQgdG9zcyAqLwpAQCAtMTYzNCw3ICsxNjM2LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQkKKwogCS8qIGZpbmQgdGhlIG1pbmltdW0gcmVjZWl2ZWQgc2VxdWVuY2UgbnVtYmVyIG92ZXIgYWxsIGxpbmtzICovCiAJaXMtPmxhc3RfbGlua19zZXFubyA9IG1pbnNlcSA9IG5ld3NlcTsKIAlmb3IgKGxwcSA9IG5ldF9kZXYtPnF1ZXVlOzspIHsKQEAgLTE2NTUsMjIgKzE2NTcsMzEgQEAKIAkJCQkJICogcGFja2V0cyAqLwogCW5ld2ZyYWcgPSBza2I7CiAKLSAgCS8qIGlmIHRoaXMgbmV3IGZyYWdtZW50IGlzIGJlZm9yZSB0aGUgZmlyc3Qgb25lLCB0aGVuIGVucXVldWUgaXQgbm93LiAqLwotICAJaWYgKChmcmFnID0gbXAtPmZyYWdzKSA9PSBOVUxMIHx8IE1QX0xUKG5ld3NlcSwgTVBfU0VRKGZyYWcpKSkgewotCQluZXdmcmFnLT5uZXh0ID0gZnJhZzsKLSAgICAJCW1wLT5mcmFncyA9IGZyYWcgPSBuZXdmcmFnOwotICAgIAkJbmV3ZnJhZyA9IE5VTEw7Ci0gIAl9CisJLyogSW5zZXJ0IG5ldyBmcmFnbWVudCBpbnRvIHRoZSBwcm9wZXIgc2VxdWVuY2Ugc2xvdC4gICovCisJc2tiX3F1ZXVlX3dhbGsoJm1wLT5mcmFncywgZnJhZykgeworCQlpZiAoTVBfU0VRKGZyYWcpID09IG5ld3NlcSkgeworCQkJaXNkbl9wcHBfbXBfZnJlZV9za2IobXAsIG5ld2ZyYWcpOworCQkJbmV3ZnJhZyA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoTVBfTFQobmV3c2VxLCBNUF9TRVEoZnJhZykpKSB7CisJCQlfX3NrYl9xdWV1ZV9iZWZvcmUoJm1wLT5mcmFncywgZnJhZywgbmV3ZnJhZyk7CisJCQluZXdmcmFnID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChuZXdmcmFnKQorCQlfX3NrYl9xdWV1ZV90YWlsKCZtcC0+ZnJhZ3MsIG5ld2ZyYWcpOwogCi0gIAlzdGFydCA9IE1QX0ZMQUdTKGZyYWcpICYgTVBfQkVHSU5fRlJBRyAmJgotCQkJCU1QX1NFUShmcmFnKSA9PSBtcC0+c2VxID8gZnJhZyA6IE5VTEw7CisJZnJhZyA9IHNrYl9wZWVrKCZtcC0+ZnJhZ3MpOworCXN0YXJ0ID0gKChNUF9GTEFHUyhmcmFnKSAmIE1QX0JFR0lOX0ZSQUcpICYmCisJCSAoTVBfU0VRKGZyYWcpID09IG1wLT5zZXEpKSA/IGZyYWcgOiBOVUxMOworCWlmICghc3RhcnQpCisJCWdvdG8gY2hlY2tfb3ZlcmZsb3c7CiAKLQkvKiAKLQkgKiBtYWluIGZyYWdtZW50IHRyYXZlcnNpbmcgbG9vcAorCS8qIG1haW4gZnJhZ21lbnQgdHJhdmVyc2luZyBsb29wCiAJICoKIAkgKiB0cnkgdG8gYWNjb21wbGlzaCBzZXZlcmFsIHRhc2tzOgotCSAqIC0gaW5zZXJ0IG5ldyBmcmFnbWVudCBpbnRvIHRoZSBwcm9wZXIgc2VxdWVuY2Ugc2xvdCAob25jZSB0aGF0J3MgZG9uZQotCSAqICAgbmV3ZnJhZyB3aWxsIGJlIHNldCB0byBOVUxMKQogCSAqIC0gcmVhc3NlbWJsZSBhbnkgY29tcGxldGUgZnJhZ21lbnQgc2VxdWVuY2UgKG5vbi1udWxsICdzdGFydCcKIAkgKiAgIGluZGljYXRlcyB0aGVyZSBpcyBhIGNvbnRpbmd1b3VzIHNlcXVlbmNlIHByZXNlbnQpCiAJICogLSBkaXNjYXJkIGFueSBpbmNvbXBsZXRlIHNlcXVlbmNlcyB0aGF0IGFyZSBiZWxvdyBtaW5zZXEgLS0gZHVlCkBAIC0xNjc5LDcxICsxNjkwLDQ2IEBACiAJICogICBjb21lIHRvIGNvbXBsZXRlIHN1Y2ggc2VxdWVuY2UgYW5kIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQKIAkgKgogCSAqIGxvb3AgY29tcGxldGVzIHdoZW4gd2UgYWNjb21wbGlzaGVkIHRoZSBmb2xsb3dpbmcgdGFza3M6Ci0JICogLSBuZXcgZnJhZ21lbnQgaXMgaW5zZXJ0ZWQgaW4gdGhlIHByb3BlciBzZXF1ZW5jZSAoJ25ld2ZyYWcnIGlzIAotCSAqICAgc2V0IHRvIE5VTEwpCiAJICogLSB3ZSBoaXQgYSBnYXAgaW4gdGhlIHNlcXVlbmNlLCBzbyBubyByZWFzc2VtYmx5L3Byb2Nlc3NpbmcgaXMgCiAJICogICBwb3NzaWJsZSAoJ3N0YXJ0JyB3b3VsZCBiZSBzZXQgdG8gTlVMTCkKIAkgKgogCSAqIGFsZ29yaXRobSBmb3IgdGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBjb2RlIGluIHRoZSBib29rCiAJICogJ1BQUCBEZXNpZ24gQW5kIERlYnVnZ2luZycgYnkgSmFtZXMgQ2FybHNvbiAoQWRkaXNvbi1XZXNsZXkpCiAJICovCi0gIAl3aGlsZSAoc3RhcnQgIT0gTlVMTCB8fCBuZXdmcmFnICE9IE5VTEwpIHsKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZtcC0+ZnJhZ3MsIGZyYWcsIG5leHRmKSB7CisJCXRoaXNzZXEgPSBNUF9TRVEoZnJhZyk7CiAKLSAgICAJCXRoaXNzZXEgPSBNUF9TRVEoZnJhZyk7Ci0gICAgCQluZXh0ZiA9IGZyYWctPm5leHQ7Ci0KLSAgICAJCS8qIGRyb3AgYW55IGR1cGxpY2F0ZSBmcmFnbWVudHMgKi8KLSAgICAJCWlmIChuZXdmcmFnICE9IE5VTEwgJiYgdGhpc3NlcSA9PSBuZXdzZXEpIHsKLSAgICAgIAkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBuZXdmcmFnKTsKLSAgICAgIAkJCW5ld2ZyYWcgPSBOVUxMOwotICAgIAkJfQotCi0gICAgCQkvKiBpbnNlcnQgbmV3IGZyYWdtZW50IGJlZm9yZSBuZXh0IGVsZW1lbnQgaWYgcG9zc2libGUuICovCi0gICAgCQlpZiAobmV3ZnJhZyAhPSBOVUxMICYmIChuZXh0ZiA9PSBOVUxMIHx8IAotCQkJCQkJTVBfTFQobmV3c2VxLCBNUF9TRVEobmV4dGYpKSkpIHsKLSAgICAgIAkJCW5ld2ZyYWctPm5leHQgPSBuZXh0ZjsKLSAgICAgIAkJCWZyYWctPm5leHQgPSBuZXh0ZiA9IG5ld2ZyYWc7Ci0gICAgICAJCQluZXdmcmFnID0gTlVMTDsKLSAgICAJCX0KLQotICAgIAkJaWYgKHN0YXJ0ICE9IE5VTEwpIHsKLQkgICAgCQkvKiBjaGVjayBmb3IgbWlzcGxhY2VkIHN0YXJ0ICovCi0gICAgICAJCQlpZiAoc3RhcnQgIT0gZnJhZyAmJiAoTVBfRkxBR1MoZnJhZykgJiBNUF9CRUdJTl9GUkFHKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkciaXNkbl9tcHBwKHNlcSAlZCk6IG5ldyAiCi0JCQkJICAgICAgIkJFR0lOIGZsYWcgd2l0aCBubyBwcmlvciBFTkQiLCB0aGlzc2VxKTsKLQkJCQlzdGF0cy0+c2VxZXJycysrOwotCQkJCXN0YXRzLT5mcmFtZV9kcm9wcysrOwotCQkJCXN0YXJ0ID0gaXNkbl9wcHBfbXBfZGlzY2FyZChtcCwgc3RhcnQsZnJhZyk7Ci0JCQkJbmV4dGYgPSBmcmFnLT5uZXh0OwotICAgICAgCQkJfQotICAgIAkJfSBlbHNlIGlmIChNUF9MRSh0aGlzc2VxLCBtaW5zZXEpKSB7CQkKLSAgICAgIAkJCWlmIChNUF9GTEFHUyhmcmFnKSAmIE1QX0JFR0lOX0ZSQUcpCisJCS8qIGNoZWNrIGZvciBtaXNwbGFjZWQgc3RhcnQgKi8KKwkJaWYgKHN0YXJ0ICE9IGZyYWcgJiYgKE1QX0ZMQUdTKGZyYWcpICYgTVBfQkVHSU5fRlJBRykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciaXNkbl9tcHBwKHNlcSAlZCk6IG5ldyAiCisJCQkgICAgICAgIkJFR0lOIGZsYWcgd2l0aCBubyBwcmlvciBFTkQiLCB0aGlzc2VxKTsKKwkJCXN0YXRzLT5zZXFlcnJzKys7CisJCQlzdGF0cy0+ZnJhbWVfZHJvcHMrKzsKKwkJCWlzZG5fcHBwX21wX2Rpc2NhcmQobXAsIHN0YXJ0LCBmcmFnKTsKKwkJCXN0YXJ0ID0gZnJhZzsKKwkJfSBlbHNlIGlmIChNUF9MRSh0aGlzc2VxLCBtaW5zZXEpKSB7CQkKKwkJCWlmIChNUF9GTEFHUyhmcmFnKSAmIE1QX0JFR0lOX0ZSQUcpCiAJCQkJc3RhcnQgPSBmcmFnOwotICAgICAgCQkJZWxzZSB7CisJCQllbHNlIHsKIAkJCQlpZiAoTVBfRkxBR1MoZnJhZykgJiBNUF9FTkRfRlJBRykKLQkgIAkJCQlzdGF0cy0+ZnJhbWVfZHJvcHMrKzsKLQkJCQlpZiggbXAtPmZyYWdzID09IGZyYWcgKQotCQkJCQltcC0+ZnJhZ3MgPSBuZXh0ZjsJCisJCQkJCXN0YXRzLT5mcmFtZV9kcm9wcysrOworCQkJCV9fc2tiX3VubGluayhza2IsICZtcC0+ZnJhZ3MpOwogCQkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBmcmFnKTsKLQkJCQlmcmFnID0gbmV4dGY7CiAJCQkJY29udGludWU7Ci0gICAgICAJCQl9CisJCQl9CiAJCX0KLQkJCi0JCS8qIGlmIHN0YXJ0IGlzIG5vbi1udWxsIGFuZCB3ZSBoYXZlIGVuZCBmcmFnbWVudCwgdGhlbgotCQkgKiB3ZSBoYXZlIGZ1bGwgcmVhc3NlbWJseSBzZXF1ZW5jZSAtLSByZWFzc2VtYmxlIAotCQkgKiBhbmQgcHJvY2VzcyBwYWNrZXQgbm93Ci0JCSAqLwotICAgIAkJaWYgKHN0YXJ0ICE9IE5VTEwgJiYgKE1QX0ZMQUdTKGZyYWcpICYgTVBfRU5EX0ZSQUcpKSB7Ci0gICAgICAJCQltaW5zZXEgPSBtcC0+c2VxID0gKHRoaXNzZXErMSkgJiBNUF9MT05HU0VRX01BU0s7Ci0gICAgICAJCQkvKiBSZWFzc2VtYmxlIHRoZSBwYWNrZXQgdGhlbiBkaXNwYXRjaCBpdCAqLwotCQkJaXNkbl9wcHBfbXBfcmVhc3NlbWJseShuZXRfZGV2LCBscCwgc3RhcnQsIG5leHRmKTsKLSAgICAgIAotICAgICAgCQkJc3RhcnQgPSBOVUxMOwotICAgICAgCQkJZnJhZyA9IE5VTEw7CiAKLSAgICAgIAkJCW1wLT5mcmFncyA9IG5leHRmOwotICAgIAkJfQorCQkvKiBpZiB3ZSBoYXZlIGVuZCBmcmFnbWVudCwgdGhlbiB3ZSBoYXZlIGZ1bGwgcmVhc3NlbWJseQorCQkgKiBzZXF1ZW5jZSAtLSByZWFzc2VtYmxlIGFuZCBwcm9jZXNzIHBhY2tldCBub3cKKwkJICovCisJCWlmIChNUF9GTEFHUyhmcmFnKSAmIE1QX0VORF9GUkFHKSB7CisJCQltaW5zZXEgPSBtcC0+c2VxID0gKHRoaXNzZXErMSkgJiBNUF9MT05HU0VRX01BU0s7CisJCQkvKiBSZWFzc2VtYmxlIHRoZSBwYWNrZXQgdGhlbiBkaXNwYXRjaCBpdCAqLworCQkJaXNkbl9wcHBfbXBfcmVhc3NlbWJseShuZXRfZGV2LCBscCwgc3RhcnQsIGZyYWcsIHRoaXNzZXEpOworCisJCQlzdGFydCA9IE5VTEw7CisJCQlmcmFnID0gTlVMTDsKKwkJfQogCiAJCS8qIGNoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIHN0YXJ0IHBvaW50ZXI6IGlmIHdlIGp1c3QKIAkJICogcmVhc3NlbWJsZWQgdGhlIHBhY2tldCBhbmQgc2VxdWVuY2UgaXMgY29udGlndW91cwpAQCAtMTc1NCwyNiArMTc0MCwyNSBAQAogCQkgKiBiZWxvdyBsb3cgd2F0ZXJtYXJrIGFuZCBzZXQgc3RhcnQgdG8gdGhlIG5leHQgZnJhZyBvcgogCQkgKiBjbGVhciBzdGFydCBwdHIuCiAJCSAqLyAKLSAgICAJCWlmIChuZXh0ZiAhPSBOVUxMICYmIAorCQlpZiAobmV4dGYgIT0gKHN0cnVjdCBza19idWZmICopJm1wLT5mcmFncyAmJiAKIAkJICAgICgodGhpc3NlcSsxKSAmIE1QX0xPTkdTRVFfTUFTSykgPT0gTVBfU0VRKG5leHRmKSkgewotICAgICAgCQkJLyogaWYgd2UganVzdCByZWFzc2VtYmxlZCBhbmQgdGhlIG5leHQgb25lIGlzIGhlcmUsIAotCQkJICogdGhlbiBzdGFydCBhbm90aGVyIHJlYXNzZW1ibHkuICovCi0KLSAgICAgIAkJCWlmIChmcmFnID09IE5VTEwpIHsKKwkJCS8qIGlmIHdlIGp1c3QgcmVhc3NlbWJsZWQgYW5kIHRoZSBuZXh0IG9uZSBpcyBoZXJlLCAKKwkJCSAqIHRoZW4gc3RhcnQgYW5vdGhlciByZWFzc2VtYmx5LgorCQkJICovCisJCQlpZiAoZnJhZyA9PSBOVUxMKSB7CiAJCQkJaWYgKE1QX0ZMQUdTKG5leHRmKSAmIE1QX0JFR0lOX0ZSQUcpCi0JICAJCQkJc3RhcnQgPSBuZXh0ZjsKLQkJCQllbHNlCi0JCQkJewotCSAgCQkJCXByaW50ayhLRVJOX1dBUk5JTkciaXNkbl9tcHBwKHNlcSAlZCk6IgotCQkJCQkJIiBFTkQgZmxhZyB3aXRoIG5vIGZvbGxvd2luZyAiCi0JCQkJCQkiQkVHSU4iLCB0aGlzc2VxKTsKKwkJCQkJc3RhcnQgPSBuZXh0ZjsKKwkJCQllbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyJpc2RuX21wcHAoc2VxICVkKToiCisJCQkJCSAgICAgICAiIEVORCBmbGFnIHdpdGggbm8gZm9sbG93aW5nICIKKwkJCQkJICAgICAgICJCRUdJTiIsIHRoaXNzZXEpOwogCQkJCQlzdGF0cy0+c2VxZXJycysrOwogCQkJCX0KIAkJCX0KLQotICAgIAkJfSBlbHNlIHsKLQkJCWlmICggbmV4dGYgIT0gTlVMTCAmJiBmcmFnICE9IE5VTEwgJiYKLQkJCQkJCU1QX0xUKHRoaXNzZXEsIG1pbnNlcSkpIHsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXh0ZiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmbXAtPmZyYWdzICYmCisJCQkgICAgZnJhZyAhPSBOVUxMICYmCisJCQkgICAgTVBfTFQodGhpc3NlcSwgbWluc2VxKSkgewogCQkJCS8qIHdlJ3ZlIGdvdCBhIGJyZWFrIGluIHRoZSBzZXF1ZW5jZQogCQkJCSAqIGFuZCB3ZSBub3QgYXQgdGhlIGVuZCB5ZXQKIAkJCQkgKiBhbmQgd2UgZGlkIG5vdCBqdXN0IHJlYXNzZW1ibGVkCkBAIC0xNzgyLDQxICsxNzY3LDM5IEBACiAJCQkgCSAqIGRpc2NhcmQgYWxsIHRoZSBmcmFtZXMgYmVsb3cgbG93IHdhdGVybWFyayAKIAkJCQkgKiBhbmQgc3RhcnQgb3ZlciAqLwogCQkJCXN0YXRzLT5mcmFtZV9kcm9wcysrOwotCQkJCW1wLT5mcmFncyA9IGlzZG5fcHBwX21wX2Rpc2NhcmQobXAsc3RhcnQsbmV4dGYpOworCQkJCWlzZG5fcHBwX21wX2Rpc2NhcmQobXAsIHN0YXJ0LCBuZXh0Zik7CiAJCQl9CiAJCQkvKiBicmVhayBpbiB0aGUgc2VxdWVuY2UsIG5vIHJlYXNzZW1ibHkgKi8KLSAgICAgIAkJCXN0YXJ0ID0gTlVMTDsKLSAgICAJCX0KLQkgIAkJCQotICAgIAkJZnJhZyA9IG5leHRmOwotICAJfQkvKiB3aGlsZSAtLSBtYWluIGxvb3AgKi8KLQkKLSAgCWlmIChtcC0+ZnJhZ3MgPT0gTlVMTCkKLSAgICAJCW1wLT5mcmFncyA9IGZyYWc7Ci0JCQorCQkJc3RhcnQgPSBOVUxMOworCQl9CisJCWlmICghc3RhcnQpCisJCQlicmVhazsKKwl9CisKK2NoZWNrX292ZXJmbG93OgogCS8qIHJhdGhlciBzdHJhaWdoZm9yd2FyZCB3YXkgdG8gZGVhbCB3aXRoIChub3QgdmVyeSkgcG9zc2libGUgCi0JICogcXVldWUgb3ZlcmZsb3cgKi8KKwkgKiBxdWV1ZSBvdmVyZmxvdworCSAqLwogCWlmIChtcC0+ZnJhbWVzID4gTVBfTUFYX1FVRVVFX0xFTikgewogCQlzdGF0cy0+b3ZlcmZsb3dzKys7Ci0JCXdoaWxlIChtcC0+ZnJhbWVzID4gTVBfTUFYX1FVRVVFX0xFTikgewotCQkJZnJhZyA9IG1wLT5mcmFncy0+bmV4dDsKLQkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBtcC0+ZnJhZ3MpOwotCQkJbXAtPmZyYWdzID0gZnJhZzsKKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmbXAtPmZyYWdzLCBmcmFnLCBuZXh0ZikgeworCQkJaWYgKG1wLT5mcmFtZXMgPD0gTVBfTUFYX1FVRVVFX0xFTikKKwkJCQlicmVhazsKKwkJCV9fc2tiX3VubGluayhmcmFnLCAmbXAtPmZyYWdzKTsKKwkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBmcmFnKTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBpc2RuX3BwcF9tcF9jbGVhbnVwKCBpc2RuX25ldF9sb2NhbCAqIGxwICkKK3N0YXRpYyB2b2lkIGlzZG5fcHBwX21wX2NsZWFudXAoaXNkbl9uZXRfbG9jYWwgKmxwKQogewotCXN0cnVjdCBza19idWZmICogZnJhZyA9IGxwLT5uZXRkZXYtPnBiLT5mcmFnczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqIG5leHRmcmFnOwotICAgIAl3aGlsZSggZnJhZyApIHsKLQkJbmV4dGZyYWcgPSBmcmFnLT5uZXh0OwotCQlpc2RuX3BwcF9tcF9mcmVlX3NrYihscC0+bmV0ZGV2LT5wYiwgZnJhZyk7Ci0JCWZyYWcgPSBuZXh0ZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOworCisJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmbHAtPm5ldGRldi0+cGItPmZyYWdzLCBza2IsIHRtcCkgeworCQlfX3NrYl91bmxpbmsoc2tiLCAmbHAtPm5ldGRldi0+cGItPmZyYWdzKTsKKwkJaXNkbl9wcHBfbXBfZnJlZV9za2IobHAtPm5ldGRldi0+cGIsIHNrYik7CiAJfQotCWxwLT5uZXRkZXYtPnBiLT5mcmFncyA9IE5VTEw7CiB9CiAKIHN0YXRpYyB1MzIgaXNkbl9wcHBfbXBfZ2V0X3NlcSggaW50IHNob3J0X3NlcSwgCkBAIC0xODUzLDcyICsxODM2LDExNSBAQAogCXJldHVybiBzZXE7CiB9CiAKLXN0cnVjdCBza19idWZmICogaXNkbl9wcHBfbXBfZGlzY2FyZCggaXBwcF9idW5kbGUgKiBtcCwKLQkJCXN0cnVjdCBza19idWZmICogZnJvbSwgc3RydWN0IHNrX2J1ZmYgKiB0byApCitzdGF0aWMgdm9pZCBpc2RuX3BwcF9tcF9kaXNjYXJkKGlwcHBfYnVuZGxlICptcCwgc3RydWN0IHNrX2J1ZmYgKmZyb20sCisJCQkJc3RydWN0IHNrX2J1ZmYgKnRvKQogewotCWlmKCBmcm9tICkKLQkJd2hpbGUgKGZyb20gIT0gdG8pIHsKLQkgIAkJc3RydWN0IHNrX2J1ZmYgKiBuZXh0ID0gZnJvbS0+bmV4dDsKLQkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBmcm9tKTsKLQkgIAkJZnJvbSA9IG5leHQ7CisJaWYgKGZyb20pIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKKwkJaW50IGZyZWVpbmcgPSAwOworCisJCXNrYl9xdWV1ZV93YWxrX3NhZmUoJm1wLT5mcmFncywgc2tiLCB0bXApIHsKKwkJCWlmIChza2IgPT0gdG8pCisJCQkJYnJlYWs7CisJCQlpZiAoc2tiID09IGZyb20pCisJCQkJZnJlZWluZyA9IDE7CisJCQlpZiAoIWZyZWVpbmcpCisJCQkJY29udGludWU7CisJCQlfX3NrYl91bmxpbmsoc2tiLCAmbXAtPmZyYWdzKTsKKwkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBza2IpOwogCQl9Ci0JcmV0dXJuIGZyb207CisJfQogfQogCi12b2lkIGlzZG5fcHBwX21wX3JlYXNzZW1ibHkoIGlzZG5fbmV0X2RldiAqIG5ldF9kZXYsIGlzZG5fbmV0X2xvY2FsICogbHAsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKiBmcm9tLCBzdHJ1Y3Qgc2tfYnVmZiAqIHRvICkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY190b3RfbGVuKHN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwgc3RydWN0IHNrX2J1ZmYgKnRvKQogewotCWlwcHBfYnVuZGxlICogbXAgPSBuZXRfZGV2LT5wYjsKLQlpbnQgcHJvdG87Ci0Jc3RydWN0IHNrX2J1ZmYgKiBza2I7CisJdW5zaWduZWQgaW50IHRvdF9sZW4gPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGZvdW5kX3N0YXJ0ID0gMDsKKworCXNrYl9xdWV1ZV93YWxrKHF1ZXVlLCBza2IpIHsKKwkJaWYgKHNrYiA9PSBmcm9tKQorCQkJZm91bmRfc3RhcnQgPSAxOworCQlpZiAoIWZvdW5kX3N0YXJ0KQorCQkJY29udGludWU7CisJCXRvdF9sZW4gKz0gc2tiLT5sZW4gLSBNUF9IRUFERVJfTEVOOworCQlpZiAoc2tiID09IHRvKQorCQkJYnJlYWs7CisJfQorCXJldHVybiB0b3RfbGVuOworfQorCisvKiBSZWFzc2VtYmxlIHBhY2tldCB1c2luZyBmcmFnbWVudHMgaW4gdGhlIHJlYXNzZW1ibHkgcXVldWUgZnJvbQorICogJ2Zyb20nIHVudGlsICd0bycsIGluY2x1c2l2ZS4KKyAqLworc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfcmVhc3NlbWJseShpc2RuX25ldF9kZXYgKm5ldF9kZXYsIGlzZG5fbmV0X2xvY2FsICpscCwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwgc3RydWN0IHNrX2J1ZmYgKnRvLAorCQkJCSAgIHUzMiBsYXN0c2VxKQoreworCWlwcHBfYnVuZGxlICptcCA9IG5ldF9kZXYtPnBiOwogCXVuc2lnbmVkIGludCB0b3RfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHByb3RvOwogCiAJaWYgKGxwLT5wcHBfc2xvdCA8IDAgfHwgbHAtPnBwcF9zbG90ID49IElTRE5fTUFYX0NIQU5ORUxTKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxwLT5wcHBfc2xvdCglZCkgb3V0IG9mIHJhbmdlXG4iLAogCQkJX19mdW5jX18sIGxwLT5wcHBfc2xvdCk7CiAJCXJldHVybjsKIAl9Ci0JaWYoIE1QX0ZMQUdTKGZyb20pID09IChNUF9CRUdJTl9GUkFHIHwgTVBfRU5EX0ZSQUcpICkgewotCQlpZiggaXBwcF90YWJsZVtscC0+cHBwX3Nsb3RdLT5kZWJ1ZyAmIDB4NDAgKQorCisJdG90X2xlbiA9IGNhbGNfdG90X2xlbigmbXAtPmZyYWdzLCBmcm9tLCB0byk7CisKKwlpZiAoTVBfRkxBR1MoZnJvbSkgPT0gKE1QX0JFR0lOX0ZSQUcgfCBNUF9FTkRfRlJBRykpIHsKKwkJaWYgKGlwcHBfdGFibGVbbHAtPnBwcF9zbG90XS0+ZGVidWcgJiAweDQwKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgImlzZG5fbXBwcDogcmVhc3NlbWJseTogZnJhbWUgJWQsICIKLQkJCQkJImxlbiAlZFxuIiwgTVBfU0VRKGZyb20pLCBmcm9tLT5sZW4gKTsKKwkJCSAgICAgICAibGVuICVkXG4iLCBNUF9TRVEoZnJvbSksIGZyb20tPmxlbik7CiAJCXNrYiA9IGZyb207CiAJCXNrYl9wdWxsKHNrYiwgTVBfSEVBREVSX0xFTik7CisJCV9fc2tiX3VubGluayhza2IsICZtcC0+ZnJhZ3MpOwogCQltcC0+ZnJhbWVzLS07CQogCX0gZWxzZSB7Ci0JCXN0cnVjdCBza19idWZmICogZnJhZzsKLQkJaW50IG47CisJCXN0cnVjdCBza19idWZmICp3YWxrLCAqdG1wOworCQlpbnQgZm91bmRfc3RhcnQgPSAwOwogCi0JCWZvcih0b3RfbGVuPW49MCwgZnJhZz1mcm9tOyBmcmFnICE9IHRvOyBmcmFnPWZyYWctPm5leHQsIG4rKykKLQkJCXRvdF9sZW4gKz0gZnJhZy0+bGVuIC0gTVBfSEVBREVSX0xFTjsKLQotCQlpZiggaXBwcF90YWJsZVtscC0+cHBwX3Nsb3RdLT5kZWJ1ZyAmIDB4NDAgKQorCQlpZiAoaXBwcF90YWJsZVtscC0+cHBwX3Nsb3RdLT5kZWJ1ZyAmIDB4NDApCiAJCQlwcmludGsoS0VSTl9ERUJVRyJpc2RuX21wcHA6IHJlYXNzZW1ibGluZyBmcmFtZXMgJWQgIgotCQkJCSJ0byAlZCwgbGVuICVkXG4iLCBNUF9TRVEoZnJvbSksIAotCQkJCShNUF9TRVEoZnJvbSkrbi0xKSAmIE1QX0xPTkdTRVFfTUFTSywgdG90X2xlbiApOwotCQlpZiggKHNrYiA9IGRldl9hbGxvY19za2IodG90X2xlbikpID09IE5VTEwgKSB7CisJCQkgICAgICAgInRvICVkLCBsZW4gJWRcbiIsIE1QX1NFUShmcm9tKSwgbGFzdHNlcSwKKwkJCSAgICAgICB0b3RfbGVuKTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHRvdF9sZW4pOworCQlpZiAoIXNrYikKIAkJCXByaW50ayhLRVJOX0VSUiAiaXNkbl9tcHBwOiBjYW5ub3QgYWxsb2NhdGUgc2sgYnVmZiAiCi0JCQkJCSJvZiBzaXplICVkXG4iLCB0b3RfbGVuKTsKLQkJCWlzZG5fcHBwX21wX2Rpc2NhcmQobXAsIGZyb20sIHRvKTsKLQkJCXJldHVybjsKLQkJfQorCQkJICAgICAgICJvZiBzaXplICVkXG4iLCB0b3RfbGVuKTsKIAotCQl3aGlsZSggZnJvbSAhPSB0byApIHsKLQkJCXVuc2lnbmVkIGludCBsZW4gPSBmcm9tLT5sZW4gLSBNUF9IRUFERVJfTEVOOworCQlmb3VuZF9zdGFydCA9IDA7CisJCXNrYl9xdWV1ZV93YWxrX3NhZmUoJm1wLT5mcmFncywgd2FsaywgdG1wKSB7CisJCQlpZiAod2FsayA9PSBmcm9tKQorCQkJCWZvdW5kX3N0YXJ0ID0gMTsKKwkJCWlmICghZm91bmRfc3RhcnQpCisJCQkJY29udGludWU7CiAKLQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KGZyb20sIE1QX0hFQURFUl9MRU4sCi0JCQkJCQkJIHNrYl9wdXQoc2tiLGxlbiksCi0JCQkJCQkJIGxlbik7Ci0JCQlmcmFnID0gZnJvbS0+bmV4dDsKLQkJCWlzZG5fcHBwX21wX2ZyZWVfc2tiKG1wLCBmcm9tKTsKLQkJCWZyb20gPSBmcmFnOyAKKwkJCWlmIChza2IpIHsKKwkJCQl1bnNpZ25lZCBpbnQgbGVuID0gd2Fsay0+bGVuIC0gTVBfSEVBREVSX0xFTjsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldCh3YWxrLCBNUF9IRUFERVJfTEVOLAorCQkJCQkJCQkgc2tiX3B1dChza2IsIGxlbiksCisJCQkJCQkJCSBsZW4pOworCQkJfQorCQkJX19za2JfdW5saW5rKHdhbGssICZtcC0+ZnJhZ3MpOworCQkJaXNkbl9wcHBfbXBfZnJlZV9za2IobXAsIHdhbGspOworCisJCQlpZiAod2FsayA9PSB0bykKKwkJCQlicmVhazsKIAkJfQogCX0KKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCiAgICAJcHJvdG8gPSBpc2RuX3BwcF9zdHJpcF9wcm90byhza2IpOwogCWlzZG5fcHBwX3B1c2hfaGlnaGVyKG5ldF9kZXYsIGxwLCBza2IsIHByb3RvKTsKIH0KIAotc3RhdGljIHZvaWQgaXNkbl9wcHBfbXBfZnJlZV9za2IoaXBwcF9idW5kbGUgKiBtcCwgc3RydWN0IHNrX2J1ZmYgKiBza2IpCitzdGF0aWMgdm9pZCBpc2RuX3BwcF9tcF9mcmVlX3NrYihpcHBwX2J1bmRsZSAqbXAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCW1wLT5mcmFtZXMtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NteC5jCmluZGV4IGU5MmIxYmEuLmMyZjUxY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYwpAQCAtNDUyLDEwICs0NTIsMTAgQEAKIAkJCWlmIChmaW5kZHNwLT5mZWF0dXJlcy5wY21faWQgPT0gZHNwLT5mZWF0dXJlcy5wY21faWQpIHsKIAkJCQlpZiAoZmluZGRzcC0+cGNtX3Nsb3RfcnggPj0gMCAmJgogCQkJCSAgICBmaW5kZHNwLT5wY21fc2xvdF9yeCA8IHNpemVvZihmcmVlc2xvdHMpKQotCQkJCQlmcmVlc2xvdHNbZmluZGRzcC0+cGNtX3Nsb3RfdHhdID0gMDsKKwkJCQkJZnJlZXNsb3RzW2ZpbmRkc3AtPnBjbV9zbG90X3J4XSA9IDA7CiAJCQkJaWYgKGZpbmRkc3AtPnBjbV9zbG90X3R4ID49IDAgJiYKIAkJCQkgICAgZmluZGRzcC0+cGNtX3Nsb3RfdHggPCBzaXplb2YoZnJlZXNsb3RzKSkKLQkJCQkJZnJlZXNsb3RzW2ZpbmRkc3AtPnBjbV9zbG90X3J4XSA9IDA7CisJCQkJCWZyZWVzbG90c1tmaW5kZHNwLT5wY21fc2xvdF90eF0gPSAwOwogCQkJfQogCQl9CiAJCWkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL3RpbWVyZGV2LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vdGltZXJkZXYuYwppbmRleCBiNWZhYmM3Li44NzVmYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vbUlTRE4vdGltZXJkZXYuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vdGltZXJkZXYuYwpAQCAtNjEsNyArNjEsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdCk7CiAJZmlsZXAtPnByaXZhdGVfZGF0YSA9IGRldjsKIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCXJldHVybiAwOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlubywgZmlsZXApOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMjQsMTggKzEyNCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGxvZmZfdAotbUlTRE5fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlcCwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCi17Ci0JcmV0dXJuIC1FU1BJUEU7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1tSVNETl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIG1JU0ROX3BvbGwoc3RydWN0IGZpbGUgKmZpbGVwLCBwb2xsX3RhYmxlICp3YWl0KQogewpAQCAtMTU3LDggKzE0NSw5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZfZXhwaXJlX3RpbWVyKHN0cnVjdCBtSVNETnRpbWVyICp0aW1lcikKK2Rldl9leHBpcmVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogeworCXN0cnVjdCBtSVNETnRpbWVyICp0aW1lciA9ICh2b2lkICopZGF0YTsKIAl1X2xvbmcJCQlmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lci0+ZGV2LT5sb2NrLCBmbGFncyk7CkBAIC0xOTEsNyArMTgwLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAJCXRpbWVyLT5kZXYgPSBkZXY7CiAJCXRpbWVyLT50bC5kYXRhID0gKGxvbmcpdGltZXI7Ci0JCXRpbWVyLT50bC5mdW5jdGlvbiA9ICh2b2lkICopIGRldl9leHBpcmVfdGltZXI7CisJCXRpbWVyLT50bC5mdW5jdGlvbiA9IGRldl9leHBpcmVfdGltZXI7CiAJCWluaXRfdGltZXIoJnRpbWVyLT50bCk7CiAJCXRpbWVyLT50bC5leHBpcmVzID0gamlmZmllcyArICgoSFogKiAodV9sb25nKXRpbWVvdXQpIC8gMTAwMCk7CiAJCWFkZF90aW1lcigmdGltZXItPnRsKTsKQEAgLTIxMSw2ICsyMDAsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZkZXYtPnBlbmRpbmcsIGxpc3QpIHsKIAkJaWYgKHRpbWVyLT5pZCA9PSBpZCkgewogCQkJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpc3QpOworCQkJLyogUkVELVBFTiBBSzogcmFjZSAtLSB0aW1lciBjYW4gYmUgc3RpbGwgcnVubmluZyBvbgorCQkJICogb3RoZXIgQ1BVLiBOZWVkcyByZWZlcmVuY2UgY291bnQgSSB0aGluaworCQkJICovCiAJCQlkZWxfdGltZXIoJnRpbWVyLT50bCk7CiAJCQlyZXQgPSB0aW1lci0+aWQ7CiAJCQlrZnJlZSh0aW1lcik7CkBAIC0yNjgsOSArMjYwLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbUlTRE5fZm9wcyA9IHsKLQkubGxzZWVrCQk9IG1JU0ROX2xsc2VlaywKIAkucmVhZAkJPSBtSVNETl9yZWFkLAotCS53cml0ZQkJPSBtSVNETl93cml0ZSwKIAkucG9sbAkJPSBtSVNETl9wb2xsLAogCS5pb2N0bAkJPSBtSVNETl9pb2N0bCwKIAkub3BlbgkJPSBtSVNETl9vcGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL0tjb25maWcgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwppbmRleCA5NTU2MjYyLi5lM2U0MDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2xlZHMvS2NvbmZpZwpAQCAtMjQsMTMgKzI0LDYgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgTEVEcyBkcml2ZW4gdXNpbmcgb3V0cHV0cwogCSAgb2YgdGhlIGRlZGljYXRlZCBQV00gY29udHJvbGxlciBmb3VuZCBvbiBuZXdlciBBdG1lbCBTT0NzLgogCi1jb25maWcgTEVEU19DT1JHSQotCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgdGhlIFNoYXJwIFNMLUM3eDAgc2VyaWVzIgotCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBQWEFfU0hBUlBfQzd4eAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExFRHMgb24gU2hhcnAgWmF1cnVzCi0JICBTTC1DN3gwIHNlcmllcyAoQzcwMCwgQzc1MCwgQzc2MCwgQzg2MCkuCi0KIGNvbmZpZyBMRURTX0xPQ09NTwogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgTG9jb21vIGRldmljZSIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgU0hBUlBfTE9DT01PCkBAIC0zOCwxMyArMzEsNiBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTEVEcyBvbiBTaGFycCBMb2NvbW8uCiAJICBaYXVydXMgbW9kZWxzIFNMLTU1MDAgYW5kIFNMLTU2MDAuCiAKLWNvbmZpZyBMRURTX1NQSVRaCi0JdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciB0aGUgU2hhcnAgU0wtQ3h4MDAgc2VyaWVzIgotCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBQWEFfU0hBUlBfQ3h4MDAKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIFNoYXJwIFphdXJ1cwotCSAgU0wtQ3h4MDAgc2VyaWVzIChDMTAwMCwgQzMwMDAsIEMzMTAwKS4KLQogY29uZmlnIExFRFNfUzNDMjRYWAogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgU2Ftc3VuZyBTM0MyNFhYIEdQSU8gTEVEcyIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgQVJDSF9TM0MyNDEwCkBAIC05Niw2ICs4MiwxNCBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENvYmFsdCBSYXEgc2VyaWVzIExFRHMuCiAKK2NvbmZpZyBMRURTX1NVTkZJUkUKKwl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIFN1bkZpcmUgc2VydmVycy4iCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFNQQVJDNjQKKwlzZWxlY3QgTEVEU19UUklHR0VSUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExlZnQsIE1pZGRsZSwgYW5kIFJpZ2h0CisJICBMRURzIG9uIHRoZSBJL08gYW5kIENQVSBib2FyZHMgb2YgU3VuRmlyZSBVbHRyYVNQQVJDIHNlcnZlcnMuCisKIGNvbmZpZyBMRURTX0hQNlhYCiAJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciB0aGUgSFAgSm9ybmFkYSA2eHgiCiAJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFNIX0hQNlhYCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggZmY3OTgyYi4uZWIxODZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtNiw5ICs2LDcgQEAKIAogIyBMRUQgUGxhdGZvcm0gRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfQVRNRUxfUFdNKQkJKz0gbGVkcy1hdG1lbC1wd20ubwotb2JqLSQoQ09ORklHX0xFRFNfQ09SR0kpCQkrPSBsZWRzLWNvcmdpLm8KIG9iai0kKENPTkZJR19MRURTX0xPQ09NTykJCSs9IGxlZHMtbG9jb21vLm8KLW9iai0kKENPTkZJR19MRURTX1NQSVRaKQkJKz0gbGVkcy1zcGl0ei5vCiBvYmotJChDT05GSUdfTEVEU19TM0MyNFhYKQkJKz0gbGVkcy1zM2MyNHh4Lm8KIG9iai0kKENPTkZJR19MRURTX0FNU19ERUxUQSkJCSs9IGxlZHMtYW1zLWRlbHRhLm8KIG9iai0kKENPTkZJR19MRURTX05FVDQ4WFgpCQkrPSBsZWRzLW5ldDQ4eHgubwpAQCAtMTYsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX0xFRFNfSDE5NDApCQkrPSBsZWRzLWgxOTQwLm8KIG9iai0kKENPTkZJR19MRURTX0NPQkFMVF9RVUJFKQkJKz0gbGVkcy1jb2JhbHQtcXViZS5vCiBvYmotJChDT05GSUdfTEVEU19DT0JBTFRfUkFRKQkJKz0gbGVkcy1jb2JhbHQtcmFxLm8KK29iai0kKENPTkZJR19MRURTX1NVTkZJUkUpCQkrPSBsZWRzLXN1bmZpcmUubwogb2JqLSQoQ09ORklHX0xFRFNfUENBOTUzMikJCSs9IGxlZHMtcGNhOTUzMi5vCiBvYmotJChDT05GSUdfTEVEU19HUElPKQkJCSs9IGxlZHMtZ3Bpby5vCiBvYmotJChDT05GSUdfTEVEU19DTV9YMjcwKSAgICAgICAgICAgICAgKz0gbGVkcy1jbS14MjcwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYwppbmRleCA1NTlhNDA4Li5lZTc0ZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCkBAIC0xMDMsOCArMTAzLDggQEAKIHsKIAlpbnQgcmM7CiAKLQlsZWRfY2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGxlZHNfY2xhc3MsIHBhcmVudCwgMCwgbGVkX2NkZXYsCi0JCQkJCSAgICAgICIlcyIsIGxlZF9jZGV2LT5uYW1lKTsKKwlsZWRfY2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShsZWRzX2NsYXNzLCBwYXJlbnQsIDAsIGxlZF9jZGV2LAorCQkJCSAgICAgICIlcyIsIGxlZF9jZGV2LT5uYW1lKTsKIAlpZiAoSVNfRVJSKGxlZF9jZGV2LT5kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihsZWRfY2Rldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtY29yZ2kuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNvcmdpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmRjZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY29yZ2kuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogTEVEIFRyaWdnZXJzIENvcmUKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA2IE9wZW5lZGhhbmQgTHRkLgotICoKLSAqIEF1dGhvcjogUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAb3BlbmVkaGFuZC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb3JnaS5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+Ci0KLXN0YXRpYyB2b2lkIGNvcmdpbGVkX2FtYmVyX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQotewotCWlmICh2YWx1ZSkKLQkJR1BTUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0xFRF9PUkFOR0UpOwotCWVsc2UKLQkJR1BDUjAgPSBHUElPX2JpdChDT1JHSV9HUElPX0xFRF9PUkFOR0UpOwotfQotCi1zdGF0aWMgdm9pZCBjb3JnaWxlZF9ncmVlbl9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQkgICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKLXsKLQlpZiAodmFsdWUpCi0JCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9MRURfR1JFRU4pOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTEVEX0dSRUVOKTsKLX0KLQotc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgY29yZ2lfYW1iZXJfbGVkID0gewotCS5uYW1lCQkJPSAiY29yZ2k6YW1iZXI6Y2hhcmdlIiwKLQkuZGVmYXVsdF90cmlnZ2VyCT0gInNoYXJwc2wtY2hhcmdlIiwKLQkuYnJpZ2h0bmVzc19zZXQJCT0gY29yZ2lsZWRfYW1iZXJfc2V0LAotfTsKLQotc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgY29yZ2lfZ3JlZW5fbGVkID0gewotCS5uYW1lCQkJPSAiY29yZ2k6Z3JlZW46bWFpbCIsCi0JLmRlZmF1bHRfdHJpZ2dlcgk9ICJuYW5kLWRpc2siLAotCS5icmlnaHRuZXNzX3NldAkJPSBjb3JnaWxlZF9ncmVlbl9zZXQsCi19OwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGNvcmdpbGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0jaWZkZWYgQ09ORklHX0xFRFNfVFJJR0dFUlMKLQlpZiAoY29yZ2lfYW1iZXJfbGVkLnRyaWdnZXIgJiYKLQkgICAgc3RyY21wKGNvcmdpX2FtYmVyX2xlZC50cmlnZ2VyLT5uYW1lLCAic2hhcnBzbC1jaGFyZ2UiKSkKLSNlbmRpZgotCQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmY29yZ2lfYW1iZXJfbGVkKTsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmY29yZ2lfZ3JlZW5fbGVkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb3JnaWxlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWxlZF9jbGFzc2Rldl9yZXN1bWUoJmNvcmdpX2FtYmVyX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmY29yZ2lfZ3JlZW5fbGVkKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNvcmdpbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY29yZ2lfYW1iZXJfbGVkKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY29yZ2lfZ3JlZW5fbGVkKTsKLQlpZiAocmV0IDwgMCkKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmNvcmdpX2FtYmVyX2xlZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNvcmdpbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZjb3JnaV9hbWJlcl9sZWQpOwotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZjb3JnaV9ncmVlbl9sZWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb3JnaWxlZF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGNvcmdpbGVkX3Byb2JlLAotCS5yZW1vdmUJCT0gY29yZ2lsZWRfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gY29yZ2lsZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGNvcmdpbGVkX3Jlc3VtZSwKLSNlbmRpZgotCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSAiY29yZ2ktbGVkIiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjb3JnaWxlZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY29yZ2lsZWRfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNvcmdpbGVkX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY29yZ2lsZWRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoY29yZ2lsZWRfaW5pdCk7Ci1tb2R1bGVfZXhpdChjb3JnaWxlZF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAb3BlbmVkaGFuZC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNvcmdpIExFRCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06Y29yZ2ktbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWZzZy5jCmluZGV4IGJlMGUxMjEuLjM0OTM1MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWZzZy5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWZzZy5jCkBAIC0xNjEsNiArMTYxLDE2IEBACiB7CiAJaW50IHJldDsKIAorCS8qIE1hcCB0aGUgTEVEIGNoaXAgc2VsZWN0IGFkZHJlc3Mgc3BhY2UgKi8KKwlsYXRjaF9hZGRyZXNzID0gKHVuc2lnbmVkIHNob3J0ICopIGlvcmVtYXAoSVhQNFhYX0VYUF9CVVNfQkFTRSgyKSwgNTEyKTsKKwlpZiAoIWxhdGNoX2FkZHJlc3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlscmVtYXA7CisJfQorCisJbGF0Y2hfdmFsdWUgPSAweGZmZmY7CisJKmxhdGNoX2FkZHJlc3MgPSBsYXRjaF92YWx1ZTsKKwogCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZnNnX3dsYW5fbGVkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBmYWlsd2xhbjsKQEAgLTE4NSwyMCArMTk1LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBmYWlscmluZzsKIAotCS8qIE1hcCB0aGUgTEVEIGNoaXAgc2VsZWN0IGFkZHJlc3Mgc3BhY2UgKi8KLQlsYXRjaF9hZGRyZXNzID0gKHVuc2lnbmVkIHNob3J0ICopIGlvcmVtYXAoSVhQNFhYX0VYUF9CVVNfQkFTRSgyKSwgNTEyKTsKLQlpZiAoIWxhdGNoX2FkZHJlc3MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlscmVtYXA7Ci0JfQotCi0JbGF0Y2hfdmFsdWUgPSAweGZmZmY7Ci0JKmxhdGNoX2FkZHJlc3MgPSBsYXRjaF92YWx1ZTsKLQogCXJldHVybiByZXQ7CiAKLSBmYWlscmVtYXA6Ci0JbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmZzZ19yaW5nX2xlZCk7CiAgZmFpbHJpbmc6CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmZzZ19zeW5jX2xlZCk7CiAgZmFpbHN5bmM6CkBAIC0yMTAsMTQgKzIwOCwxNCBAQAogIGZhaWx3YW46CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmZzZ193bGFuX2xlZCk7CiAgZmFpbHdsYW46CisJaW91bm1hcChsYXRjaF9hZGRyZXNzKTsKKyBmYWlscmVtYXA6CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZzZ19sZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW91bm1hcChsYXRjaF9hZGRyZXNzKTsKLQogCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZmc2dfd2xhbl9sZWQpOwogCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZmc2dfd2FuX2xlZCk7CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmZzZ19zYXRhX2xlZCk7CkBAIC0yMjUsNiArMjIzLDggQEAKIAlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZnNnX3N5bmNfbGVkKTsKIAlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZnNnX3JpbmdfbGVkKTsKIAorCWlvdW5tYXAobGF0Y2hfYWRkcmVzcyk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTU1eC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTU1eC5jCmluZGV4IDE0NmMwNjkuLmY1MDg3MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1NXguYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTV4LmMKQEAgLTI0OCwxMSArMjQ4LDEwIEBACiAJCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgcGNhOTU1eF9sZWQgKnBjYTk1NXg7Ci0JaW50IGk7Ci0JaW50IGVyciA9IC1FTk9ERVY7CiAJc3RydWN0IHBjYTk1NXhfY2hpcGRlZiAqY2hpcDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJc3RydWN0IGxlZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgaSwgZXJyOwogCiAJY2hpcCA9ICZwY2E5NTV4X2NoaXBkZWZzW2lkLT5kcml2ZXJfZGF0YV07CiAJYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CkBAIC0yODIsNDMgKzI4MSw0MSBAQAogCQl9CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmJpdHM7IGkrKykgewotCQlwY2E5NTV4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjYTk1NXhfbGVkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGNhOTU1eCkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXhpdDsKLQkJfQorCXBjYTk1NXggPSBremFsbG9jKHNpemVvZigqcGNhOTU1eCkgKiBjaGlwLT5iaXRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjYTk1NXgpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCXBjYTk1NXgtPmNoaXBkZWYgPSBjaGlwOwotCQlwY2E5NTV4LT5jbGllbnQgPSBjbGllbnQ7Ci0JCXBjYTk1NXgtPmxlZF9udW0gPSBpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBjYTk1NXgpOworCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmJpdHM7IGkrKykgeworCQlwY2E5NTV4W2ldLmNoaXBkZWYgPSBjaGlwOworCQlwY2E5NTV4W2ldLmNsaWVudCA9IGNsaWVudDsKKwkJcGNhOTU1eFtpXS5sZWRfbnVtID0gaTsKKwogCQkvKiBQbGF0Zm9ybSBkYXRhIGNhbiBzcGVjaWZ5IExFRCBuYW1lcyBhbmQgZGVmYXVsdCB0cmlnZ2VycyAqLwogCQlpZiAocGRhdGEpIHsKIAkJCWlmIChwZGF0YS0+bGVkc1tpXS5uYW1lKQotCQkJCXNucHJpbnRmKHBjYTk1NXgtPm5hbWUsIDMyLCAicGNhOTU1eDolcyIsCi0JCQkJCQkJcGRhdGEtPmxlZHNbaV0ubmFtZSk7CisJCQkJc25wcmludGYocGNhOTU1eFtpXS5uYW1lLAorCQkJCQkgc2l6ZW9mKHBjYTk1NXhbaV0ubmFtZSksICJwY2E5NTV4OiVzIiwKKwkJCQkJIHBkYXRhLT5sZWRzW2ldLm5hbWUpOwogCQkJaWYgKHBkYXRhLT5sZWRzW2ldLmRlZmF1bHRfdHJpZ2dlcikKLQkJCQlwY2E5NTV4LT5sZWRfY2Rldi5kZWZhdWx0X3RyaWdnZXIgPQorCQkJCXBjYTk1NXhbaV0ubGVkX2NkZXYuZGVmYXVsdF90cmlnZ2VyID0KIAkJCQkJcGRhdGEtPmxlZHNbaV0uZGVmYXVsdF90cmlnZ2VyOwogCQl9IGVsc2UgewotCQkJc25wcmludGYocGNhOTU1eC0+bmFtZSwgMzIsICJwY2E5NTV4OiVkIiwgaSk7CisJCQlzbnByaW50ZihwY2E5NTV4W2ldLm5hbWUsIHNpemVvZihwY2E5NTV4W2ldLm5hbWUpLAorCQkJCSAicGNhOTU1eDolZCIsIGkpOwogCQl9Ci0JCXNwaW5fbG9ja19pbml0KCZwY2E5NTV4LT5sb2NrKTsKIAotCQlwY2E5NTV4LT5sZWRfY2Rldi5uYW1lID0gcGNhOTU1eC0+bmFtZTsKLQkJcGNhOTU1eC0+bGVkX2NkZXYuYnJpZ2h0bmVzc19zZXQgPQotCQkJCXBjYTk1NXhfbGVkX3NldDsKKwkJc3Bpbl9sb2NrX2luaXQoJnBjYTk1NXhbaV0ubG9jayk7CiAKLQkJLyoKLQkJICogQ2xpZW50IGRhdGEgaXMgYSBwb2ludGVyIHRvIHRoZSBfZmlyc3RfIHBjYTk1NXhfbGVkCi0JCSAqIHN0cnVjdAotCQkgKi8KLQkJaWYgKGkgPT0gMCkKLQkJCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBjYTk1NXgpOworCQlwY2E5NTV4W2ldLmxlZF9jZGV2Lm5hbWUgPSBwY2E5NTV4W2ldLm5hbWU7CisJCXBjYTk1NXhbaV0ubGVkX2NkZXYuYnJpZ2h0bmVzc19zZXQgPSBwY2E5NTV4X2xlZF9zZXQ7CiAKLQkJSU5JVF9XT1JLKCYocGNhOTU1eC0+d29yayksIHBjYTk1NXhfbGVkX3dvcmspOworCQlJTklUX1dPUksoJnBjYTk1NXhbaV0ud29yaywgcGNhOTU1eF9sZWRfd29yayk7CiAKLQkJbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJihwY2E5NTV4LT5sZWRfY2RldikpOworCQllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmcGNhOTU1eFtpXS5sZWRfY2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBleGl0OwogCX0KIAogCS8qIFR1cm4gb2ZmIExFRHMgKi8KQEAgLTMzNiwyMyArMzMzLDMyIEBACiAJcGNhOTU1eF93cml0ZV9wc2MoY2xpZW50LCAxLCAwKTsKIAogCXJldHVybiAwOworCiBleGl0OgorCXdoaWxlIChpLS0pIHsKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnBjYTk1NXhbaV0ubGVkX2NkZXYpOworCQljYW5jZWxfd29ya19zeW5jKCZwY2E5NTV4W2ldLndvcmspOworCX0KKworCWtmcmVlKHBjYTk1NXgpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgcGNhOTU1eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgcGNhOTU1eF9sZWQgKnBjYTk1NXggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgbGVkcyA9IHBjYTk1NXgtPmNoaXBkZWYtPmJpdHM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVkczsgaSsrKSB7Ci0JCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCYocGNhOTU1eC0+bGVkX2NkZXYpKTsKLQkJY2FuY2VsX3dvcmtfc3luYygmKHBjYTk1NXgtPndvcmspKTsKLQkJa2ZyZWUocGNhOTU1eCk7Ci0JCXBjYTk1NXggPSBwY2E5NTV4ICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgcGNhOTU1eC0+Y2hpcGRlZi0+Yml0czsgaSsrKSB7CisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZwY2E5NTV4W2ldLmxlZF9jZGV2KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmcGNhOTU1eFtpXS53b3JrKTsKIAl9CiAKKwlrZnJlZShwY2E5NTV4KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1zcGl0ei5jIGIvZHJpdmVycy9sZWRzL2xlZHMtc3BpdHouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ODMxYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1zcGl0ei5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMRUQgVHJpZ2dlcnMgQ29yZQotICoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDYgT3BlbmVkaGFuZCBMdGQuCi0gKgotICogQXV0aG9yOiBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBvcGVuZWRoYW5kLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9zcGl0ei5oPgotCi1zdGF0aWMgdm9pZCBzcGl0emxlZF9hbWJlcl9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQkgICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKLXsKLQlpZiAodmFsdWUpCi0JCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9MRURfT1JBTkdFKTsKLQllbHNlCi0JCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX0xFRF9PUkFOR0UpOwotfQotCi1zdGF0aWMgdm9pZCBzcGl0emxlZF9ncmVlbl9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQkgICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKLXsKLQlpZiAodmFsdWUpCi0JCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9MRURfR1JFRU4pOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTEVEX0dSRUVOKTsKLX0KLQotc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgc3BpdHpfYW1iZXJfbGVkID0gewotCS5uYW1lCQkJPSAic3BpdHo6YW1iZXI6Y2hhcmdlIiwKLQkuZGVmYXVsdF90cmlnZ2VyCT0gInNoYXJwc2wtY2hhcmdlIiwKLQkuYnJpZ2h0bmVzc19zZXQJCT0gc3BpdHpsZWRfYW1iZXJfc2V0LAotfTsKLQotc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgc3BpdHpfZ3JlZW5fbGVkID0gewotCS5uYW1lCQkJPSAic3BpdHo6Z3JlZW46aGRkYWN0aXZpdHkiLAotCS5kZWZhdWx0X3RyaWdnZXIJPSAiaWRlLWRpc2siLAotCS5icmlnaHRuZXNzX3NldAkJPSBzcGl0emxlZF9ncmVlbl9zZXQsCi19OwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNwaXR6bGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0jaWZkZWYgQ09ORklHX0xFRFNfVFJJR0dFUlMKLQlpZiAoc3BpdHpfYW1iZXJfbGVkLnRyaWdnZXIgJiYKLQkgICAgc3RyY21wKHNwaXR6X2FtYmVyX2xlZC50cmlnZ2VyLT5uYW1lLCAic2hhcnBzbC1jaGFyZ2UiKSkKLSNlbmRpZgotCQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmc3BpdHpfYW1iZXJfbGVkKTsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmc3BpdHpfZ3JlZW5fbGVkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzcGl0emxlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWxlZF9jbGFzc2Rldl9yZXN1bWUoJnNwaXR6X2FtYmVyX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmc3BpdHpfZ3JlZW5fbGVkKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IHNwaXR6bGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldDsKLQotCWlmIChtYWNoaW5lX2lzX2FraXRhKCkpIHsKLQkJc3BpdHpfZ3JlZW5fbGVkLm5hbWUgPSAic3BpdHo6Z3JlZW46bWFpbCI7Ci0JCXNwaXR6X2dyZWVuX2xlZC5kZWZhdWx0X3RyaWdnZXIgPSAibmFuZC1kaXNrIjsKLQl9Ci0KLQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnNwaXR6X2FtYmVyX2xlZCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnNwaXR6X2dyZWVuX2xlZCk7Ci0JaWYgKHJldCA8IDApCi0JCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZzcGl0el9hbWJlcl9sZWQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcGl0emxlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlsZWRfY2xhc3NkZXZfdW5yZWdpc3Rlcigmc3BpdHpfYW1iZXJfbGVkKTsKLQlsZWRfY2xhc3NkZXZfdW5yZWdpc3Rlcigmc3BpdHpfZ3JlZW5fbGVkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGl0emxlZF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHNwaXR6bGVkX3Byb2JlLAotCS5yZW1vdmUJCT0gc3BpdHpsZWRfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gc3BpdHpsZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNwaXR6bGVkX3Jlc3VtZSwKLSNlbmRpZgotCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSAic3BpdHotbGVkIiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGl0emxlZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BpdHpsZWRfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNwaXR6bGVkX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpdHpsZWRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc3BpdHpsZWRfaW5pdCk7Ci1tb2R1bGVfZXhpdChzcGl0emxlZF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAb3BlbmVkaGFuZC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNwaXR6IExFRCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06c3BpdHotbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1zdW5maXJlLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1zdW5maXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwMDhmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXN1bmZpcmUuYwpAQCAtMCwwICsxLDI3MyBAQAorLyogbGVkcy1zdW5maXJlLmM6IFNVTlcsVWx0cmEtRW50ZXJwcmlzZSBMRUQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9maGMuaD4KKyNpbmNsdWRlIDxhc20vdXBhLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJImxlZHMtc3VuZmlyZSIKKyNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIEZpcmUgTEVEIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3Qgc3VuZmlyZV9sZWQgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYJbGVkX2NkZXY7CisJdm9pZCBfX2lvbWVtCQkqcmVnOworfTsKKyNkZWZpbmUJdG9fc3VuZmlyZV9sZWQoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzdW5maXJlX2xlZCwgbGVkX2NkZXYpCisKK3N0YXRpYyB2b2lkIF9fY2xvY2tib2FyZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgbGVkX3ZhbCwgdTggYml0KQoreworCXN0cnVjdCBzdW5maXJlX2xlZCAqcCA9IHRvX3N1bmZpcmVfbGVkKGxlZF9jZGV2KTsKKwl1OCByZWcgPSB1cGFfcmVhZGIocC0+cmVnKTsKKworCXN3aXRjaCAoYml0KSB7CisJY2FzZSBDTE9DS19DVFJMX0xMRUQ6CisJCWlmIChsZWRfdmFsKQorCQkJcmVnICY9IH5iaXQ7CisJCWVsc2UKKwkJCXJlZyB8PSBiaXQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKGxlZF92YWwpCisJCQlyZWcgfD0gYml0OworCQllbHNlCisJCQlyZWcgJj0gfmJpdDsKKwkJYnJlYWs7CisJfQorCXVwYV93cml0ZWIocmVnLCBwLT5yZWcpOworfQorCitzdGF0aWMgdm9pZCBjbG9ja2JvYXJkX2xlZnRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJCWVudW0gbGVkX2JyaWdodG5lc3MgbGVkX3ZhbCkKK3sKKwlfX2Nsb2NrYm9hcmRfc2V0KGxlZF9jZGV2LCBsZWRfdmFsLCBDTE9DS19DVFJMX0xMRUQpOworfQorCitzdGF0aWMgdm9pZCBjbG9ja2JvYXJkX21pZGRsZV9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJICBlbnVtIGxlZF9icmlnaHRuZXNzIGxlZF92YWwpCit7CisJX19jbG9ja2JvYXJkX3NldChsZWRfY2RldiwgbGVkX3ZhbCwgQ0xPQ0tfQ1RSTF9NTEVEKTsKK30KKworc3RhdGljIHZvaWQgY2xvY2tib2FyZF9yaWdodF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJIGVudW0gbGVkX2JyaWdodG5lc3MgbGVkX3ZhbCkKK3sKKwlfX2Nsb2NrYm9hcmRfc2V0KGxlZF9jZGV2LCBsZWRfdmFsLCBDTE9DS19DVFJMX1JMRUQpOworfQorCitzdGF0aWMgdm9pZCBfX2ZoY19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgbGVkX3ZhbCwgdTMyIGJpdCkKK3sKKwlzdHJ1Y3Qgc3VuZmlyZV9sZWQgKnAgPSB0b19zdW5maXJlX2xlZChsZWRfY2Rldik7CisJdTMyIHJlZyA9IHVwYV9yZWFkbChwLT5yZWcpOworCisJc3dpdGNoIChiaXQpIHsKKwljYXNlIEZIQ19DT05UUk9MX0xMRUQ6CisJCWlmIChsZWRfdmFsKQorCQkJcmVnICY9IH5iaXQ7CisJCWVsc2UKKwkJCXJlZyB8PSBiaXQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKGxlZF92YWwpCisJCQlyZWcgfD0gYml0OworCQllbHNlCisJCQlyZWcgJj0gfmJpdDsKKwkJYnJlYWs7CisJfQorCXVwYV93cml0ZWwocmVnLCBwLT5yZWcpOworfQorCitzdGF0aWMgdm9pZCBmaGNfbGVmdF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyBsZWRfdmFsKQoreworCV9fZmhjX3NldChsZWRfY2RldiwgbGVkX3ZhbCwgRkhDX0NPTlRST0xfTExFRCk7Cit9CisKK3N0YXRpYyB2b2lkIGZoY19taWRkbGVfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBsZWRfdmFsKQoreworCV9fZmhjX3NldChsZWRfY2RldiwgbGVkX3ZhbCwgRkhDX0NPTlRST0xfTUxFRCk7Cit9CisKK3N0YXRpYyB2b2lkIGZoY19yaWdodF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkgIGVudW0gbGVkX2JyaWdodG5lc3MgbGVkX3ZhbCkKK3sKKwlfX2ZoY19zZXQobGVkX2NkZXYsIGxlZF92YWwsIEZIQ19DT05UUk9MX1JMRUQpOworfQorCit0eXBlZGVmIHZvaWQgKCpzZXRfaGFuZGxlcikoc3RydWN0IGxlZF9jbGFzc2RldiAqLCBlbnVtIGxlZF9icmlnaHRuZXNzKTsKK3N0cnVjdCBsZWRfdHlwZSB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlzZXRfaGFuZGxlcgloYW5kbGVyOworCWNvbnN0IGNoYXIJKmRlZmF1bHRfdHJpZ2dlcjsKK307CisKKyNkZWZpbmUgTlVNX0xFRFNfUEVSX0JPQVJECTMKK3N0cnVjdCBzdW5maXJlX2RydmRhdGEgeworCXN0cnVjdCBzdW5maXJlX2xlZAlsZWRzW05VTV9MRURTX1BFUl9CT0FSRF07Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW5maXJlX2xlZF9nZW5lcmljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgbGVkX3R5cGUgKnR5cGVzKQoreworCXN0cnVjdCBzdW5maXJlX2RydmRhdGEgKnA7CisJaW50IGksIGVyciA9IC1FSU5WQUw7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIldyb25nIG51bWJlciBvZiByZXNvdXJjZXMgJWQsIHNob3VsZCBiZSAxXG4iLAorCQkgICAgICAgcGRldi0+bnVtX3Jlc291cmNlcyk7CisJCWdvdG8gb3V0OworCX0KKworCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IHN1bmZpcmVfZHJ2ZGF0YVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fTEVEU19QRVJfQk9BUkQ7IGkrKykgeworCQlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpscCA9ICZwLT5sZWRzW2ldLmxlZF9jZGV2OworCisJCXAtPmxlZHNbaV0ucmVnID0gKHZvaWQgX19pb21lbSAqKSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwkJbHAtPm5hbWUgPSB0eXBlc1tpXS5uYW1lOworCQlscC0+YnJpZ2h0bmVzcyA9IExFRF9GVUxMOworCQlscC0+YnJpZ2h0bmVzc19zZXQgPSB0eXBlc1tpXS5oYW5kbGVyOworCQlscC0+ZGVmYXVsdF90cmlnZ2VyID0gdHlwZXNbaV0uZGVmYXVsdF90cmlnZ2VyOworCisJCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCBscCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCByZWdpc3RlciAlcyBMRURcbiIsCisJCQkgICAgICAgbHAtPm5hbWUpOworCQkJZ290byBvdXRfdW5yZWdpc3Rlcl9sZWRfY2RldnM7CisJCX0KKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgcCk7CisKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF91bnJlZ2lzdGVyX2xlZF9jZGV2czoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZwLT5sZWRzW2ldLmxlZF9jZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc3VuZmlyZV9sZWRfZ2VuZXJpY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3VuZmlyZV9kcnZkYXRhICpwID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9MRURTX1BFUl9CT0FSRDsgaSsrKQorCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcC0+bGVkc1tpXS5sZWRfY2Rldik7CisKKwlrZnJlZShwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGxlZF90eXBlIGNsb2NrYm9hcmRfbGVkX3R5cGVzW05VTV9MRURTX1BFUl9CT0FSRF0gPSB7CisJeworCQkubmFtZQkJPSAiY2xvY2tib2FyZC1sZWZ0IiwKKwkJLmhhbmRsZXIJPSBjbG9ja2JvYXJkX2xlZnRfc2V0LAorCX0sCisJeworCQkubmFtZQkJPSAiY2xvY2tib2FyZC1taWRkbGUiLAorCQkuaGFuZGxlcgk9IGNsb2NrYm9hcmRfbWlkZGxlX3NldCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gImNsb2NrYm9hcmQtcmlnaHQiLAorCQkuaGFuZGxlcgk9IGNsb2NrYm9hcmRfcmlnaHRfc2V0LAorCQkuZGVmYXVsdF90cmlnZ2VyPSAiaGVhcnRiZWF0IiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc3VuZmlyZV9jbG9ja2JvYXJkX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzdW5maXJlX2xlZF9nZW5lcmljX3Byb2JlKHBkZXYsIGNsb2NrYm9hcmRfbGVkX3R5cGVzKTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfdHlwZSBmaGNfbGVkX3R5cGVzW05VTV9MRURTX1BFUl9CT0FSRF0gPSB7CisJeworCQkubmFtZQkJPSAiZmhjLWxlZnQiLAorCQkuaGFuZGxlcgk9IGZoY19sZWZ0X3NldCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gImZoYy1taWRkbGUiLAorCQkuaGFuZGxlcgk9IGZoY19taWRkbGVfc2V0LAorCX0sCisJeworCQkubmFtZQkJPSAiZmhjLXJpZ2h0IiwKKwkJLmhhbmRsZXIJPSBmaGNfcmlnaHRfc2V0LAorCQkuZGVmYXVsdF90cmlnZ2VyPSAiaGVhcnRiZWF0IiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc3VuZmlyZV9maGNfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHN1bmZpcmVfbGVkX2dlbmVyaWNfcHJvYmUocGRldiwgZmhjX2xlZF90eXBlcyk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3VuZmlyZS1jbG9ja2JvYXJkLWxlZHMiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06c3VuZmlyZS1maGMtbGVkcyIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW5maXJlX2Nsb2NrYm9hcmRfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3VuZmlyZV9jbG9ja2JvYXJkX2xlZF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHN1bmZpcmVfbGVkX2dlbmVyaWNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic3VuZmlyZS1jbG9ja2JvYXJkLWxlZHMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuZmlyZV9maGNfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3VuZmlyZV9maGNfbGVkX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3VuZmlyZV9sZWRfZ2VuZXJpY19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJzdW5maXJlLWZoYy1sZWRzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN1bmZpcmVfbGVkc19pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3VuZmlyZV9jbG9ja2JvYXJkX2xlZF9kcml2ZXIpOworCisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2sgYm9hcmQgTEVEIGRyaXZlclxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzdW5maXJlX2ZoY19sZWRfZHJpdmVyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCByZWdpc3RlciBGSEMgTEVEIGRyaXZlclxuIik7CisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdW5maXJlX2Nsb2NrYm9hcmRfbGVkX2RyaXZlcik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN1bmZpcmVfbGVkc19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN1bmZpcmVfY2xvY2tib2FyZF9sZWRfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3VuZmlyZV9maGNfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHN1bmZpcmVfbGVkc19pbml0KTsKK21vZHVsZV9leGl0KHN1bmZpcmVfbGVkc19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKaW5kZXggY2FlNTI0OC4uMjM3NDFjZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCkBAIC04NjIsOCArODYyLDcgQEAKIAlhZGJfZGV2X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYWRiIik7CiAJaWYgKElTX0VSUihhZGJfZGV2X2NsYXNzKSkKIAkJcmV0dXJuOwotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShhZGJfZGV2X2NsYXNzLCBOVUxMLCBNS0RFVihBREJfTUFKT1IsIDApLCBOVUxMLAotCQkJICAgICAgImFkYiIpOworCWRldmljZV9jcmVhdGUoYWRiX2Rldl9jbGFzcywgTlVMTCwgTUtERVYoQURCX01BSk9SLCAwKSwgTlVMTCwgImFkYiIpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhZGJfcGZkZXYpOwogCXBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYWRiX3BmZHJ2LCBhZGJfZHVtbXlfcHJvYmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9LY29uZmlnIGIvZHJpdmVycy9tZC9LY29uZmlnCmluZGV4IDA3ZDkyYzEuLjIyODFiNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL0tjb25maWcKQEAgLTMwLDYgKzMwLDIwIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNRF9BVVRPREVURUNUCisJYm9vbCAiQXV0b2RldGVjdCBSQUlEIGFycmF5cyBkdXJpbmcga2VybmVsIGJvb3QiCisJZGVwZW5kcyBvbiBCTEtfREVWX01EPXkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlbiB0aGUga2VybmVsIHdpbGwgdHJ5IHRvIGF1dG9kZXRlY3QgcmFpZAorCSAgYXJyYXlzIGFzIHBhcnQgb2YgaXRzIGJvb3QgcHJvY2Vzcy4gCisKKwkgIElmIHlvdSBkb24ndCB1c2UgcmFpZCBhbmQgc2F5IFksIHRoaXMgYXV0b2RldGVjdGlvbiBjYW4gY2F1c2UgCisJICBhIHNldmVyYWwtc2Vjb25kIGRlbGF5IGluIHRoZSBib290IHRpbWUgZHVlIHRvIHZhcmlvdXMKKwkgIHN5bmNocm9uaXNhdGlvbiBzdGVwcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgc3RlcC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIE1EX0xJTkVBUgogCXRyaXN0YXRlICJMaW5lYXIgKGFwcGVuZCkgbW9kZSIKIAlkZXBlbmRzIG9uIEJMS19ERVZfTUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwppbmRleCAxMzk1NjQzLi42ODJlZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMKKysrIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCkBAIC0zMzMsNyArMzMzLDYgQEAKIAljdHgtPmlkeF9vdXQgPSBiaW9fb3V0ID8gYmlvX291dC0+YmlfaWR4IDogMDsKIAljdHgtPnNlY3RvciA9IHNlY3RvciArIGNjLT5pdl9vZmZzZXQ7CiAJaW5pdF9jb21wbGV0aW9uKCZjdHgtPnJlc3RhcnQpOwotCWF0b21pY19zZXQoJmN0eC0+cGVuZGluZywgMSk7CiB9CiAKIHN0YXRpYyBpbnQgY3J5cHRfY29udmVydF9ibG9jayhzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKQEAgLTQwOCw2ICs0MDcsOCBAQAogewogCWludCByOwogCisJYXRvbWljX3NldCgmY3R4LT5wZW5kaW5nLCAxKTsKKwogCXdoaWxlKGN0eC0+aWR4X2luIDwgY3R4LT5iaW9faW4tPmJpX3ZjbnQgJiYKIAkgICAgICBjdHgtPmlkeF9vdXQgPCBjdHgtPmJpb19vdXQtPmJpX3ZjbnQpIHsKIApAQCAtNDU2LDkgKzQ1NywxMSBAQAogLyoKICAqIEdlbmVyYXRlIGEgbmV3IHVuZnJhZ21lbnRlZCBiaW8gd2l0aCB0aGUgZ2l2ZW4gc2l6ZQogICogVGhpcyBzaG91bGQgbmV2ZXIgdmlvbGF0ZSB0aGUgZGV2aWNlIGxpbWl0YXRpb25zCi0gKiBNYXkgcmV0dXJuIGEgc21hbGxlciBiaW8gd2hlbiBydW5uaW5nIG91dCBvZiBwYWdlcworICogTWF5IHJldHVybiBhIHNtYWxsZXIgYmlvIHdoZW4gcnVubmluZyBvdXQgb2YgcGFnZXMsIGluZGljYXRlZCBieQorICogKm91dF9vZl9wYWdlcyBzZXQgdG8gMS4KICAqLwotc3RhdGljIHN0cnVjdCBiaW8gKmNyeXB0X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLCB1bnNpZ25lZCBzaXplKQorc3RhdGljIHN0cnVjdCBiaW8gKmNyeXB0X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLCB1bnNpZ25lZCBzaXplLAorCQkJCSAgICAgIHVuc2lnbmVkICpvdXRfb2ZfcGFnZXMpCiB7CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MgPSBpby0+dGFyZ2V0LT5wcml2YXRlOwogCXN0cnVjdCBiaW8gKmNsb25lOwpAQCAtNDcyLDExICs0NzUsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljbG9uZV9pbml0KGlvLCBjbG9uZSk7CisJKm91dF9vZl9wYWdlcyA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfaW92ZWNzOyBpKyspIHsKIAkJcGFnZSA9IG1lbXBvb2xfYWxsb2MoY2MtPnBhZ2VfcG9vbCwgZ2ZwX21hc2spOwotCQlpZiAoIXBhZ2UpCisJCWlmICghcGFnZSkgeworCQkJKm91dF9vZl9wYWdlcyA9IDE7CiAJCQlicmVhazsKKwkJfQogCiAJCS8qCiAJCSAqIGlmIGFkZGl0aW9uYWwgcGFnZXMgY2Fubm90IGJlIGFsbG9jYXRlZCB3aXRob3V0IHdhaXRpbmcsCkBAIC01MTcsNiArNTIzLDI3IEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IGRtX2NyeXB0X2lvICpjcnlwdF9pb19hbGxvYyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKwkJCQkJICBzdHJ1Y3QgYmlvICpiaW8sIHNlY3Rvcl90IHNlY3RvcikKK3sKKwlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBkbV9jcnlwdF9pbyAqaW87CisKKwlpbyA9IG1lbXBvb2xfYWxsb2MoY2MtPmlvX3Bvb2wsIEdGUF9OT0lPKTsKKwlpby0+dGFyZ2V0ID0gdGk7CisJaW8tPmJhc2VfYmlvID0gYmlvOworCWlvLT5zZWN0b3IgPSBzZWN0b3I7CisJaW8tPmVycm9yID0gMDsKKwlhdG9taWNfc2V0KCZpby0+cGVuZGluZywgMCk7CisKKwlyZXR1cm4gaW87Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0X2luY19wZW5kaW5nKHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCit7CisJYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOworfQorCiAvKgogICogT25lIG9mIHRoZSBiaW9zIHdhcyBmaW5pc2hlZC4gQ2hlY2sgZm9yIGNvbXBsZXRpb24gb2YKICAqIHRoZSB3aG9sZSByZXF1ZXN0IGFuZCBjb3JyZWN0bHkgY2xlYW4gdXAgdGhlIGJ1ZmZlci4KQEAgLTU5MSw3ICs2MTgsNyBAQAogCXN0cnVjdCBiaW8gKmJhc2VfYmlvID0gaW8tPmJhc2VfYmlvOwogCXN0cnVjdCBiaW8gKmNsb25lOwogCi0JYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOworCWNyeXB0X2luY19wZW5kaW5nKGlvKTsKIAogCS8qCiAJICogVGhlIGJsb2NrIGxheWVyIG1pZ2h0IG1vZGlmeSB0aGUgYnZlYyBhcnJheSwgc28gYWx3YXlzCkBAIC02NTMsNiArNjgwLDcgQEAKIAkJY3J5cHRfZnJlZV9idWZmZXJfcGFnZXMoY2MsIGNsb25lKTsKIAkJYmlvX3B1dChjbG9uZSk7CiAJCWlvLT5lcnJvciA9IC1FSU87CisJCWNyeXB0X2RlY19wZW5kaW5nKGlvKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjY0LDI4ICs2OTIsMzQgQEAKIAogCWlmIChhc3luYykKIAkJa2NyeXB0ZF9xdWV1ZV9pbyhpbyk7Ci0JZWxzZSB7Ci0JCWF0b21pY19pbmMoJmlvLT5wZW5kaW5nKTsKKwllbHNlCiAJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGNsb25lKTsKLQl9CiB9CiAKLXN0YXRpYyB2b2lkIGtjcnlwdGRfY3J5cHRfd3JpdGVfY29udmVydF9sb29wKHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCitzdGF0aWMgdm9pZCBrY3J5cHRkX2NyeXB0X3dyaXRlX2NvbnZlcnQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKIHsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7CiAJc3RydWN0IGJpbyAqY2xvbmU7CisJaW50IGNyeXB0X2ZpbmlzaGVkOworCXVuc2lnbmVkIG91dF9vZl9wYWdlcyA9IDA7CiAJdW5zaWduZWQgcmVtYWluaW5nID0gaW8tPmJhc2VfYmlvLT5iaV9zaXplOwogCWludCByOwogCiAJLyoKKwkgKiBQcmV2ZW50IGlvIGZyb20gZGlzYXBwZWFyaW5nIHVudGlsIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzLgorCSAqLworCWNyeXB0X2luY19wZW5kaW5nKGlvKTsKKwljcnlwdF9jb252ZXJ0X2luaXQoY2MsICZpby0+Y3R4LCBOVUxMLCBpby0+YmFzZV9iaW8sIGlvLT5zZWN0b3IpOworCisJLyoKIAkgKiBUaGUgYWxsb2NhdGVkIGJ1ZmZlcnMgY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgd2hvbGUgYmlvLAogCSAqIHNvIHJlcGVhdCB0aGUgd2hvbGUgcHJvY2VzcyB1bnRpbCBhbGwgdGhlIGRhdGEgY2FuIGJlIGhhbmRsZWQuCiAJICovCiAJd2hpbGUgKHJlbWFpbmluZykgewotCQljbG9uZSA9IGNyeXB0X2FsbG9jX2J1ZmZlcihpbywgcmVtYWluaW5nKTsKKwkJY2xvbmUgPSBjcnlwdF9hbGxvY19idWZmZXIoaW8sIHJlbWFpbmluZywgJm91dF9vZl9wYWdlcyk7CiAJCWlmICh1bmxpa2VseSghY2xvbmUpKSB7CiAJCQlpby0+ZXJyb3IgPSAtRU5PTUVNOwotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAJCX0KIAogCQlpby0+Y3R4LmJpb19vdXQgPSBjbG9uZTsKQEAgLTY5MywzNyArNzI3LDMyIEBACiAKIAkJcmVtYWluaW5nIC09IGNsb25lLT5iaV9zaXplOwogCisJCWNyeXB0X2luY19wZW5kaW5nKGlvKTsKIAkJciA9IGNyeXB0X2NvbnZlcnQoY2MsICZpby0+Y3R4KTsKKwkJY3J5cHRfZmluaXNoZWQgPSBhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+Y3R4LnBlbmRpbmcpOwogCi0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+Y3R4LnBlbmRpbmcpKSB7Ci0JCQkvKiBwcm9jZXNzZWQsIG5vIHJ1bm5pbmcgYXN5bmMgY3J5cHRvICAqLworCQkvKiBFbmNyeXB0aW9uIHdhcyBhbHJlYWR5IGZpbmlzaGVkLCBzdWJtaXQgaW8gbm93ICovCisJCWlmIChjcnlwdF9maW5pc2hlZCkgewogCQkJa2NyeXB0ZF9jcnlwdF93cml0ZV9pb19zdWJtaXQoaW8sIHIsIDApOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgd2FzIGFuIGVycm9yLCBkbyBub3QgdHJ5IG5leHQgZnJhZ21lbnRzLgorCQkJICogRm9yIGFzeW5jLCBlcnJvciBpcyBwcm9jZXNzZWQgaW4gYXN5bmMgaGFuZGxlci4KKwkJCSAqLwogCQkJaWYgKHVubGlrZWx5KHIgPCAwKSkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZQotCQkJYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOwotCi0JCS8qIG91dCBvZiBtZW1vcnkgLT4gcnVuIHF1ZXVlcyAqLwotCQlpZiAodW5saWtlbHkocmVtYWluaW5nKSkgewotCQkJLyogd2FpdCBmb3IgYXN5bmMgY3J5cHRvIHRoZW4gcmVpbml0aWFsaXplIHBlbmRpbmcgKi8KLQkJCXdhaXRfZXZlbnQoY2MtPndyaXRlcSwgIWF0b21pY19yZWFkKCZpby0+Y3R4LnBlbmRpbmcpKTsKLQkJCWF0b21pY19zZXQoJmlvLT5jdHgucGVuZGluZywgMSk7Ci0JCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwMCk7CisJCQkJYnJlYWs7CiAJCX0KKworCQkvKgorCQkgKiBPdXQgb2YgbWVtb3J5IC0+IHJ1biBxdWV1ZXMKKwkJICogQnV0IGRvbid0IHdhaXQgaWYgc3BsaXQgd2FzIGR1ZSB0byB0aGUgaW8gc2l6ZSByZXN0cmljdGlvbgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KG91dF9vZl9wYWdlcykpCisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwMCk7CisKKwkJaWYgKHVubGlrZWx5KHJlbWFpbmluZykpCisJCQl3YWl0X2V2ZW50KGNjLT53cml0ZXEsICFhdG9taWNfcmVhZCgmaW8tPmN0eC5wZW5kaW5nKSk7CiAJfQotfQotCi1zdGF0aWMgdm9pZCBrY3J5cHRkX2NyeXB0X3dyaXRlX2NvbnZlcnQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKLXsKLQlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7Ci0KLQkvKgotCSAqIFByZXZlbnQgaW8gZnJvbSBkaXNhcHBlYXJpbmcgdW50aWwgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuCi0JICovCi0JYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOwotCi0JY3J5cHRfY29udmVydF9pbml0KGNjLCAmaW8tPmN0eCwgTlVMTCwgaW8tPmJhc2VfYmlvLCBpby0+c2VjdG9yKTsKLQlrY3J5cHRkX2NyeXB0X3dyaXRlX2NvbnZlcnRfbG9vcChpbyk7CiAKIAljcnlwdF9kZWNfcGVuZGluZyhpbyk7CiB9CkBAIC03NDEsNyArNzcwLDcgQEAKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7CiAJaW50IHIgPSAwOwogCi0JYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOworCWNyeXB0X2luY19wZW5kaW5nKGlvKTsKIAogCWNyeXB0X2NvbnZlcnRfaW5pdChjYywgJmlvLT5jdHgsIGlvLT5iYXNlX2JpbywgaW8tPmJhc2VfYmlvLAogCQkJICAgaW8tPnNlY3Rvcik7CkBAIC0xMTA4LDE1ICsxMTM3LDkgQEAKIHN0YXRpYyBpbnQgY3J5cHRfbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCiAJCSAgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQogewotCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gdGktPnByaXZhdGU7CiAJc3RydWN0IGRtX2NyeXB0X2lvICppbzsKIAotCWlvID0gbWVtcG9vbF9hbGxvYyhjYy0+aW9fcG9vbCwgR0ZQX05PSU8pOwotCWlvLT50YXJnZXQgPSB0aTsKLQlpby0+YmFzZV9iaW8gPSBiaW87Ci0JaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yIC0gdGktPmJlZ2luOwotCWlvLT5lcnJvciA9IDA7Ci0JYXRvbWljX3NldCgmaW8tPnBlbmRpbmcsIDApOworCWlvID0gY3J5cHRfaW9fYWxsb2ModGksIGJpbywgYmlvLT5iaV9zZWN0b3IgLSB0aS0+YmVnaW4pOwogCiAJaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCiAJCWtjcnlwdGRfcXVldWVfaW8oaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKaW5kZXggNDFmNDA4MC4uNzY5YWI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYworKysgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCkBAIC0xMDgsMTIgKzEwOCwxMiBAQAogCSAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBtZXRhZGF0YSBhcmVhIHRoZSBkYXRhIGluCiAJICogJ2NodW5rJyByZWZlcnMgdG8uCiAJICovCi0JdWludDMyX3QgY3VycmVudF9hcmVhOworCWNodW5rX3QgY3VycmVudF9hcmVhOwogCiAJLyoKIAkgKiBUaGUgbmV4dCBmcmVlIGNodW5rIGZvciBhbiBleGNlcHRpb24uCiAJICovCi0JdWludDMyX3QgbmV4dF9mcmVlOworCWNodW5rX3QgbmV4dF9mcmVlOwogCiAJLyoKIAkgKiBUaGUgaW5kZXggb2YgbmV4dCBmcmVlIGV4Y2VwdGlvbiBpbiB0aGUgY3VycmVudApAQCAtMTc1LDcgKzE3NSw3IEBACiAvKgogICogUmVhZCBvciB3cml0ZSBhIGNodW5rIGFsaWduZWQgYW5kIHNpemVkIGJsb2NrIG9mIGRhdGEgZnJvbSBhIGRldmljZS4KICAqLwotc3RhdGljIGludCBjaHVua19pbyhzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgY2h1bmssIGludCBydywgaW50IG1ldGFkYXRhKQorc3RhdGljIGludCBjaHVua19pbyhzdHJ1Y3QgcHN0b3JlICpwcywgY2h1bmtfdCBjaHVuaywgaW50IHJ3LCBpbnQgbWV0YWRhdGEpCiB7CiAJc3RydWN0IGRtX2lvX3JlZ2lvbiB3aGVyZSA9IHsKIAkJLmJkZXYgPSBwcy0+c25hcC0+Y293LT5iZGV2LApAQCAtMjA5LDE2ICsyMDksMjMgQEAKIH0KIAogLyoKKyAqIENvbnZlcnQgYSBtZXRhZGF0YSBhcmVhIGluZGV4IHRvIGEgY2h1bmsgaW5kZXguCisgKi8KK3N0YXRpYyBjaHVua190IGFyZWFfbG9jYXRpb24oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgYXJlYSkKK3sKKwlyZXR1cm4gMSArICgocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKSAqIGFyZWEpOworfQorCisvKgogICogUmVhZCBvciB3cml0ZSBhIG1ldGFkYXRhIGFyZWEuICBSZW1lbWJlcmluZyB0byBza2lwIHRoZSBmaXJzdAogICogY2h1bmsgd2hpY2ggaG9sZHMgdGhlIGhlYWRlci4KICAqLwotc3RhdGljIGludCBhcmVhX2lvKHN0cnVjdCBwc3RvcmUgKnBzLCB1aW50MzJfdCBhcmVhLCBpbnQgcncpCitzdGF0aWMgaW50IGFyZWFfaW8oc3RydWN0IHBzdG9yZSAqcHMsIGNodW5rX3QgYXJlYSwgaW50IHJ3KQogewogCWludCByOwotCXVpbnQzMl90IGNodW5rOworCWNodW5rX3QgY2h1bms7CiAKLQkvKiBjb252ZXJ0IGEgbWV0YWRhdGEgYXJlYSBpbmRleCB0byBhIGNodW5rIGluZGV4ICovCi0JY2h1bmsgPSAxICsgKChwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSArIDEpICogYXJlYSk7CisJY2h1bmsgPSBhcmVhX2xvY2F0aW9uKHBzLCBhcmVhKTsKIAogCXIgPSBjaHVua19pbyhwcywgY2h1bmssIHJ3LCAwKTsKIAlpZiAocikKQEAgLTIyOCw3ICsyMzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHplcm9fYXJlYShzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgYXJlYSkKK3N0YXRpYyBpbnQgemVyb19hcmVhKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGFyZWEpCiB7CiAJbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOwogCXJldHVybiBhcmVhX2lvKHBzLCBhcmVhLCBXUklURSk7CkBAIC00MDQsNyArNDExLDcgQEAKIAogc3RhdGljIGludCByZWFkX2V4Y2VwdGlvbnMoc3RydWN0IHBzdG9yZSAqcHMpCiB7Ci0JdWludDMyX3QgYXJlYTsKKwljaHVua190IGFyZWE7CiAJaW50IHIsIGZ1bGwgPSAxOwogCiAJLyoKQEAgLTUxNyw2ICs1MjQsNyBAQAogewogCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwogCXVpbnQzMl90IHN0cmlkZTsKKwljaHVua190IG5leHRfZnJlZTsKIAlzZWN0b3JfdCBzaXplID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOwogCiAJLyogSXMgdGhlcmUgZW5vdWdoIHJvb20gPyAqLwpAQCAtNTMwLDcgKzUzOCw4IEBACiAJICogaW50byBhY2NvdW50IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgY2h1bmtzLgogCSAqLwogCXN0cmlkZSA9IChwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSArIDEpOwotCWlmICgoKytwcy0+bmV4dF9mcmVlICUgc3RyaWRlKSA9PSAxKQorCW5leHRfZnJlZSA9ICsrcHMtPm5leHRfZnJlZTsKKwlpZiAoc2VjdG9yX2RpdihuZXh0X2ZyZWUsIHN0cmlkZSkgPT0gMSkKIAkJcHMtPm5leHRfZnJlZSsrOwogCiAJYXRvbWljX2luYygmcHMtPnBlbmRpbmdfY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCmluZGV4IGIyNjJjMDAuLmRjYTQwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYworKysgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogCQkJCW9sZF9ubC0+bmV4dCA9ICh1aW50MzJfdCkgKCh2b2lkICopIG5sIC0KIAkJCQkJCQkgICAodm9pZCAqKSBvbGRfbmwpOwogCQkJZGlzayA9IGRtX2Rpc2soaGMtPm1kKTsKLQkJCW5sLT5kZXYgPSBodWdlX2VuY29kZV9kZXYoTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSk7CisJCQlubC0+ZGV2ID0gaHVnZV9lbmNvZGVfZGV2KGRpc2tfZGV2dChkaXNrKSk7CiAJCQlubC0+bmV4dCA9IDA7CiAJCQlzdHJjcHkobmwtPm5hbWUsIGhjLT5uYW1lKTsKIApAQCAtNTM5LDcgKzUzOSw3IEBACiAJaWYgKGRtX3N1c3BlbmRlZChtZCkpCiAJCXBhcmFtLT5mbGFncyB8PSBETV9TVVNQRU5EX0ZMQUc7CiAKLQlwYXJhbS0+ZGV2ID0gaHVnZV9lbmNvZGVfZGV2KE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vcikpOworCXBhcmFtLT5kZXYgPSBodWdlX2VuY29kZV9kZXYoZGlza19kZXZ0KGRpc2spKTsKIAogCS8qCiAJICogWWVzLCB0aGlzIHdpbGwgYmUgb3V0IG9mIGRhdGUgYnkgdGhlIHRpbWUgaXQgZ2V0cyBiYWNrCkBAIC01NDgsNyArNTQ4LDcgQEAKIAkgKi8KIAlwYXJhbS0+b3Blbl9jb3VudCA9IGRtX29wZW5fY291bnQobWQpOwogCi0JaWYgKGRpc2stPnBvbGljeSkKKwlpZiAoZ2V0X2Rpc2tfcm8oZGlzaykpCiAJCXBhcmFtLT5mbGFncyB8PSBETV9SRUFET05MWV9GTEFHOwogCiAJcGFyYW0tPmV2ZW50X25yID0gZG1fZ2V0X2V2ZW50X25yKG1kKTsKQEAgLTExMzEsNyArMTEzMSw3IEBACiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc2l6ZV90IGxlbiwgbmVlZGVkOwotCXN0cnVjdCBkbV9kZXYgKmRkOworCXN0cnVjdCBkbV9kZXZfaW50ZXJuYWwgKmRkOwogCXN0cnVjdCBkbV90YXJnZXRfZGVwcyAqZGVwczsKIAogCWRlcHMgPSBnZXRfcmVzdWx0X2J1ZmZlcihwYXJhbSwgcGFyYW1fc2l6ZSwgJmxlbik7CkBAIC0xMTU3LDcgKzExNTcsNyBAQAogCWRlcHMtPmNvdW50ID0gY291bnQ7CiAJY291bnQgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkgKGRkLCBkbV90YWJsZV9nZXRfZGV2aWNlcyh0YWJsZSksIGxpc3QpCi0JCWRlcHMtPmRldltjb3VudCsrXSA9IGh1Z2VfZW5jb2RlX2RldihkZC0+YmRldi0+YmRfZGV2KTsKKwkJZGVwcy0+ZGV2W2NvdW50KytdID0gaHVnZV9lbmNvZGVfZGV2KGRkLT5kbV9kZXYuYmRldi0+YmRfZGV2KTsKIAogCXBhcmFtLT5kYXRhX3NpemUgPSBwYXJhbS0+ZGF0YV9zdGFydCArIG5lZWRlZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCA3MWRkNjVhLi4xMDMzMDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC0zMCw5ICszMCwxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCXN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGc7CS8qIE93bmluZyBQRyAqLworCXVuc2lnbmVkIGlzX2FjdGl2ZTsJCS8qIFBhdGggc3RhdHVzICovCiAJdW5zaWduZWQgZmFpbF9jb3VudDsJCS8qIEN1bXVsYXRpdmUgZmFpbHVyZSBjb3VudCAqLwogCiAJc3RydWN0IGRtX3BhdGggcGF0aDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVhY3RpdmF0ZV9wYXRoOwogfTsKIAogI2RlZmluZSBwYXRoX3RvX3BncGF0aChfX3BncCkgY29udGFpbmVyX29mKChfX3BncCksIHN0cnVjdCBwZ3BhdGgsIHBhdGgpCkBAIC02Myw2ICs2NSw3IEBACiAKIAljb25zdCBjaGFyICpod19oYW5kbGVyX25hbWU7CiAJc3RydWN0IHdvcmtfc3RydWN0IGFjdGl2YXRlX3BhdGg7CisJc3RydWN0IHBncGF0aCAqcGdwYXRoX3RvX2FjdGl2YXRlOwogCXVuc2lnbmVkIG5yX3ByaW9yaXR5X2dyb3VwczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByaW9yaXR5X2dyb3VwczsKIAl1bnNpZ25lZCBwZ19pbml0X3JlcXVpcmVkOwkvKiBwZ19pbml0IG5lZWRzIGNhbGxpbmc/ICovCkBAIC0xMTEsNiArMTE0LDcgQEAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfcXVldWVkX2lvcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgYWN0aXZhdGVfcGF0aChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTIxLDggKzEyNSwxMCBAQAogewogCXN0cnVjdCBwZ3BhdGggKnBncGF0aCA9IGt6YWxsb2Moc2l6ZW9mKCpwZ3BhdGgpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChwZ3BhdGgpCi0JCXBncGF0aC0+cGF0aC5pc19hY3RpdmUgPSAxOworCWlmIChwZ3BhdGgpIHsKKwkJcGdwYXRoLT5pc19hY3RpdmUgPSAxOworCQlJTklUX1dPUksoJnBncGF0aC0+ZGVhY3RpdmF0ZV9wYXRoLCBkZWFjdGl2YXRlX3BhdGgpOworCX0KIAogCXJldHVybiBwZ3BhdGg7CiB9CkBAIC0xMzIsNiArMTM4LDE0IEBACiAJa2ZyZWUocGdwYXRoKTsKIH0KIAorc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGggPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBncGF0aCwgZGVhY3RpdmF0ZV9wYXRoKTsKKworCWJsa19hYm9ydF9xdWV1ZShwZ3BhdGgtPnBhdGguZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKmFsbG9jX3ByaW9yaXR5X2dyb3VwKHZvaWQpCiB7CiAJc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZzsKQEAgLTE0Niw2ICsxNjAsNyBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3BncGF0aHMoc3RydWN0IGxpc3RfaGVhZCAqcGdwYXRocywgc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGgsICp0bXA7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IHRpLT5wcml2YXRlOwogCkBAIC0xNTQsNiArMTY5LDEwIEBACiAJCWlmIChtLT5od19oYW5kbGVyX25hbWUpCiAJCQlzY3NpX2RoX2RldGFjaChiZGV2X2dldF9xdWV1ZShwZ3BhdGgtPnBhdGguZGV2LT5iZGV2KSk7CiAJCWRtX3B1dF9kZXZpY2UodGksIHBncGF0aC0+cGF0aC5kZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOworCQlpZiAobS0+cGdwYXRoX3RvX2FjdGl2YXRlID09IHBncGF0aCkKKwkJCW0tPnBncGF0aF90b19hY3RpdmF0ZSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIAkJZnJlZV9wZ3BhdGgocGdwYXRoKTsKIAl9CiB9CkBAIC00MjEsNiArNDQwLDcgQEAKIAkJX19jaG9vc2VfcGdwYXRoKG0pOwogCiAJcGdwYXRoID0gbS0+Y3VycmVudF9wZ3BhdGg7CisJbS0+cGdwYXRoX3RvX2FjdGl2YXRlID0gbS0+Y3VycmVudF9wZ3BhdGg7CiAKIAlpZiAoKHBncGF0aCAmJiAhbS0+cXVldWVfaW8pIHx8CiAJICAgICghcGdwYXRoICYmICFtLT5xdWV1ZV9pZl9ub19wYXRoKSkKQEAgLTU1NiwxMiArNTc2LDEyIEBACiAJLyogd2UgbmVlZCBhdCBsZWFzdCBhIHBhdGggYXJnICovCiAJaWYgKGFzLT5hcmdjIDwgMSkgewogCQl0aS0+ZXJyb3IgPSAibm8gZGV2aWNlIGdpdmVuIjsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAogCXAgPSBhbGxvY19wZ3BhdGgoKTsKIAlpZiAoIXApCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBzaGlmdChhcyksIHRpLT5iZWdpbiwgdGktPmxlbiwKIAkJCSAgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJnAtPnBhdGguZGV2KTsKQEAgLTU4OSw3ICs2MDksNyBAQAogCiAgYmFkOgogCWZyZWVfcGdwYXRoKHApOwotCXJldHVybiBOVUxMOworCXJldHVybiBFUlJfUFRSKHIpOwogfQogCiBzdGF0aWMgc3RydWN0IHByaW9yaXR5X2dyb3VwICpwYXJzZV9wcmlvcml0eV9ncm91cChzdHJ1Y3QgYXJnX3NldCAqYXMsCkBAIC02MDcsMTQgKzYyNywxNCBAQAogCiAJaWYgKGFzLT5hcmdjIDwgMikgewogCQlhcy0+YXJnYyA9IDA7Ci0JCXRpLT5lcnJvciA9ICJub3QgZW5vdWdoIHByaW9yaXR5IGdyb3VwIGFydW1lbnRzIjsKLQkJcmV0dXJuIE5VTEw7CisJCXRpLT5lcnJvciA9ICJub3QgZW5vdWdoIHByaW9yaXR5IGdyb3VwIGFyZ3VtZW50cyI7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAogCXBnID0gYWxsb2NfcHJpb3JpdHlfZ3JvdXAoKTsKIAlpZiAoIXBnKSB7CiAJCXRpLT5lcnJvciA9ICJjb3VsZG4ndCBhbGxvY2F0ZSBwcmlvcml0eSBncm91cCI7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJcGctPm0gPSBtOwogCkBAIC02NDcsOCArNjY3LDEwIEBACiAJCXBhdGhfYXJncy5hcmd2ID0gYXMtPmFyZ3Y7CiAKIAkJcGdwYXRoID0gcGFyc2VfcGF0aCgmcGF0aF9hcmdzLCAmcGctPnBzLCB0aSk7Ci0JCWlmICghcGdwYXRoKQorCQlpZiAoSVNfRVJSKHBncGF0aCkpIHsKKwkJCXIgPSBQVFJfRVJSKHBncGF0aCk7CiAJCQlnb3RvIGJhZDsKKwkJfQogCiAJCXBncGF0aC0+cGcgPSBwZzsKIAkJbGlzdF9hZGRfdGFpbCgmcGdwYXRoLT5saXN0LCAmcGctPnBncGF0aHMpOwpAQCAtNjU5LDcgKzY4MSw3IEBACiAKICBiYWQ6CiAJZnJlZV9wcmlvcml0eV9ncm91cChwZywgdGkpOwotCXJldHVybiBOVUxMOworCXJldHVybiBFUlJfUFRSKHIpOwogfQogCiBzdGF0aWMgaW50IHBhcnNlX2h3X2hhbmRsZXIoc3RydWN0IGFyZ19zZXQgKmFzLCBzdHJ1Y3QgbXVsdGlwYXRoICptKQpAQCAtNzc4LDggKzgwMCw4IEBACiAJCXN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGc7CiAKIAkJcGcgPSBwYXJzZV9wcmlvcml0eV9ncm91cCgmYXMsIG0pOwotCQlpZiAoIXBnKSB7Ci0JCQlyID0gLUVJTlZBTDsKKwkJaWYgKElTX0VSUihwZykpIHsKKwkJCXIgPSBQVFJfRVJSKHBnKTsKIAkJCWdvdG8gYmFkOwogCQl9CiAKQEAgLTg0NSwxMyArODY3LDEzIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCFwZ3BhdGgtPnBhdGguaXNfYWN0aXZlKQorCWlmICghcGdwYXRoLT5pc19hY3RpdmUpCiAJCWdvdG8gb3V0OwogCiAJRE1XQVJOKCJGYWlsaW5nIHBhdGggJXMuIiwgcGdwYXRoLT5wYXRoLmRldi0+bmFtZSk7CiAKIAlwZ3BhdGgtPnBnLT5wcy50eXBlLT5mYWlsX3BhdGgoJnBncGF0aC0+cGctPnBzLCAmcGdwYXRoLT5wYXRoKTsKLQlwZ3BhdGgtPnBhdGguaXNfYWN0aXZlID0gMDsKKwlwZ3BhdGgtPmlzX2FjdGl2ZSA9IDA7CiAJcGdwYXRoLT5mYWlsX2NvdW50Kys7CiAKIAltLT5ucl92YWxpZF9wYXRocy0tOwpAQCAtODYzLDYgKzg4NSw3IEBACiAJCSAgICAgIHBncGF0aC0+cGF0aC5kZXYtPm5hbWUsIG0tPm5yX3ZhbGlkX3BhdGhzKTsKIAogCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT50cmlnZ2VyX2V2ZW50KTsKKwlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmcGdwYXRoLT5kZWFjdGl2YXRlX3BhdGgpOwogCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwpAQCAtODgxLDcgKzkwNCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHBncGF0aC0+cGF0aC5pc19hY3RpdmUpCisJaWYgKHBncGF0aC0+aXNfYWN0aXZlKQogCQlnb3RvIG91dDsKIAogCWlmICghcGdwYXRoLT5wZy0+cHMudHlwZS0+cmVpbnN0YXRlX3BhdGgpIHsKQEAgLTg5NSw3ICs5MTgsNyBAQAogCWlmIChyKQogCQlnb3RvIG91dDsKIAotCXBncGF0aC0+cGF0aC5pc19hY3RpdmUgPSAxOworCXBncGF0aC0+aXNfYWN0aXZlID0gMTsKIAogCW0tPmN1cnJlbnRfcGdwYXRoID0gTlVMTDsKIAlpZiAoIW0tPm5yX3ZhbGlkX3BhdGhzKysgJiYgbS0+cXVldWVfc2l6ZSkKQEAgLTEwOTMsOCArMTExNiwxNSBAQAogCWludCByZXQ7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXVsdGlwYXRoLCBhY3RpdmF0ZV9wYXRoKTsKLQlzdHJ1Y3QgZG1fcGF0aCAqcGF0aCA9ICZtLT5jdXJyZW50X3BncGF0aC0+cGF0aDsKKwlzdHJ1Y3QgZG1fcGF0aCAqcGF0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKKwlwYXRoID0gJm0tPnBncGF0aF90b19hY3RpdmF0ZS0+cGF0aDsKKwltLT5wZ3BhdGhfdG9fYWN0aXZhdGUgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybjsKIAlyZXQgPSBzY3NpX2RoX2FjdGl2YXRlKGJkZXZfZ2V0X3F1ZXVlKHBhdGgtPmRldi0+YmRldikpOwogCXBnX2luaXRfZG9uZShwYXRoLCByZXQpOwogfQpAQCAtMTI3Niw3ICsxMzA2LDcgQEAKIAogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcGctPnBncGF0aHMsIGxpc3QpIHsKIAkJCQlETUVNSVQoIiVzICVzICV1ICIsIHAtPnBhdGguZGV2LT5uYW1lLAotCQkJCSAgICAgICBwLT5wYXRoLmlzX2FjdGl2ZSA/ICJBIiA6ICJGIiwKKwkJCQkgICAgICAgcC0+aXNfYWN0aXZlID8gIkEiIDogIkYiLAogCQkJCSAgICAgICBwLT5mYWlsX2NvdW50KTsKIAkJCQlpZiAocGctPnBzLnR5cGUtPnN0YXR1cykKIAkJCQkJc3ogKz0gcGctPnBzLnR5cGUtPnN0YXR1cygmcGctPnBzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5oIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5oCmluZGV4IGMxOThiODUuLmUyMzBmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguaAorKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmgKQEAgLTEzLDggKzEzLDYgQEAKIAogc3RydWN0IGRtX3BhdGggewogCXN0cnVjdCBkbV9kZXYgKmRldjsJLyogUmVhZC1vbmx5ICovCi0JdW5zaWduZWQgaXNfYWN0aXZlOwkvKiBSZWFkLW9ubHkgKi8KLQogCXZvaWQgKnBzY29udGV4dDsJLyogRm9yIHBhdGgtc2VsZWN0b3IgdXNlICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKaW5kZXggZmYwNWZlOC4uMjk5MTNlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwpAQCAtODQyLDcgKzg0Miw5IEBACiAJfQogCiAJLyogaGFuZCB0byBrY29weWQgKi8KLQlzZXRfYml0KERNX0tDT1BZRF9JR05PUkVfRVJST1IsICZmbGFncyk7CisJaWYgKCFlcnJvcnNfaGFuZGxlZChtcykpCisJCXNldF9iaXQoRE1fS0NPUFlEX0lHTk9SRV9FUlJPUiwgJmZsYWdzKTsKKwogCXIgPSBkbV9rY29weWRfY29weShtcy0+a2NvcHlkX2NsaWVudCwgJmZyb20sIG1zLT5ucl9taXJyb3JzIC0gMSwgdG8sCiAJCQkgICBmbGFncywgcmVjb3ZlcnlfY29tcGxldGUsIHJlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCmluZGV4IDRkZTkwYWIuLmI3NDVkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwpAQCAtMjg0LDggKzI4NCw4IEBACiAKIAltZW1zZXQobWFqb3JfbWlub3IsIDAsIHNpemVvZihtYWpvcl9taW5vcikpOwogCXNwcmludGYobWFqb3JfbWlub3IsICIlZDolZCIsCi0JCWJpby0+YmlfYmRldi0+YmRfZGlzay0+bWFqb3IsCi0JCWJpby0+YmlfYmRldi0+YmRfZGlzay0+Zmlyc3RfbWlub3IpOworCQlNQUpPUihkaXNrX2RldnQoYmlvLT5iaV9iZGV2LT5iZF9kaXNrKSksCisJCU1JTk9SKGRpc2tfZGV2dChiaW8tPmJpX2JkZXYtPmJkX2Rpc2spKSk7CiAKIAkvKgogCSAqIFRlc3QgdG8gc2VlIHdoaWNoIHN0cmlwZSBkcml2ZSB0cmlnZ2VyZWQgdGhlIGV2ZW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggNjFmNDQxNC4uYTc0MGE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtMjUwLDcgKzI1MCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqbmV4dDsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIG5leHQsIGRldmljZXMpIHsKLQkJc3RydWN0IGRtX2RldiAqZGQgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRtX2RldiwgbGlzdCk7CisJCXN0cnVjdCBkbV9kZXZfaW50ZXJuYWwgKmRkID0KKwkJICAgIGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZG1fZGV2X2ludGVybmFsLCBsaXN0KTsKIAkJa2ZyZWUoZGQpOwogCX0KIH0KQEAgLTMyNywxMiArMzI4LDEyIEBACiAvKgogICogU2VlIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGEgZGV2aWNlIGluIHRoZSBsaXN0LgogICovCi1zdGF0aWMgc3RydWN0IGRtX2RldiAqZmluZF9kZXZpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbCwgZGV2X3QgZGV2KQorc3RhdGljIHN0cnVjdCBkbV9kZXZfaW50ZXJuYWwgKmZpbmRfZGV2aWNlKHN0cnVjdCBsaXN0X2hlYWQgKmwsIGRldl90IGRldikKIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZDsKKwlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkgKGRkLCBsLCBsaXN0KQotCQlpZiAoZGQtPmJkZXYtPmJkX2RldiA9PSBkZXYpCisJCWlmIChkZC0+ZG1fZGV2LmJkZXYtPmJkX2RldiA9PSBkZXYpCiAJCQlyZXR1cm4gZGQ7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTM0MSw0NSArMzQyLDQ3IEBACiAvKgogICogT3BlbiBhIGRldmljZSBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgbWFwIGRlc3RpbmF0aW9uLgogICovCi1zdGF0aWMgaW50IG9wZW5fZGV2KHN0cnVjdCBkbV9kZXYgKmQsIGRldl90IGRldiwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQorc3RhdGljIGludCBvcGVuX2RldihzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkLCBkZXZfdCBkZXYsCisJCSAgICBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7CiAJc3RhdGljIGNoYXIgKl9jbGFpbV9wdHIgPSAiSSBiZWxvbmcgdG8gZGV2aWNlLW1hcHBlciI7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAogCWludCByOwogCi0JQlVHX09OKGQtPmJkZXYpOworCUJVR19PTihkLT5kbV9kZXYuYmRldik7CiAKLQliZGV2ID0gb3Blbl9ieV9kZXZudW0oZGV2LCBkLT5tb2RlKTsKKwliZGV2ID0gb3Blbl9ieV9kZXZudW0oZGV2LCBkLT5kbV9kZXYubW9kZSk7CiAJaWYgKElTX0VSUihiZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoYmRldik7CiAJciA9IGJkX2NsYWltX2J5X2Rpc2soYmRldiwgX2NsYWltX3B0ciwgZG1fZGlzayhtZCkpOwogCWlmIChyKQogCQlibGtkZXZfcHV0KGJkZXYpOwogCWVsc2UKLQkJZC0+YmRldiA9IGJkZXY7CisJCWQtPmRtX2Rldi5iZGV2ID0gYmRldjsKIAlyZXR1cm4gcjsKIH0KIAogLyoKICAqIENsb3NlIGEgZGV2aWNlIHRoYXQgd2UndmUgYmVlbiB1c2luZy4KICAqLwotc3RhdGljIHZvaWQgY2xvc2VfZGV2KHN0cnVjdCBkbV9kZXYgKmQsIHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3N0YXRpYyB2b2lkIGNsb3NlX2RldihzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkLCBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7Ci0JaWYgKCFkLT5iZGV2KQorCWlmICghZC0+ZG1fZGV2LmJkZXYpCiAJCXJldHVybjsKIAotCWJkX3JlbGVhc2VfZnJvbV9kaXNrKGQtPmJkZXYsIGRtX2Rpc2sobWQpKTsKLQlibGtkZXZfcHV0KGQtPmJkZXYpOwotCWQtPmJkZXYgPSBOVUxMOworCWJkX3JlbGVhc2VfZnJvbV9kaXNrKGQtPmRtX2Rldi5iZGV2LCBkbV9kaXNrKG1kKSk7CisJYmxrZGV2X3B1dChkLT5kbV9kZXYuYmRldik7CisJZC0+ZG1fZGV2LmJkZXYgPSBOVUxMOwogfQogCiAvKgogICogSWYgcG9zc2libGUsIHRoaXMgY2hlY2tzIGFuIGFyZWEgb2YgYSBkZXN0aW5hdGlvbiBkZXZpY2UgaXMgdmFsaWQuCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfZGV2aWNlX2FyZWEoc3RydWN0IGRtX2RldiAqZGQsIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4pCitzdGF0aWMgaW50IGNoZWNrX2RldmljZV9hcmVhKHN0cnVjdCBkbV9kZXZfaW50ZXJuYWwgKmRkLCBzZWN0b3JfdCBzdGFydCwKKwkJCSAgICAgc2VjdG9yX3QgbGVuKQogewotCXNlY3Rvcl90IGRldl9zaXplID0gZGQtPmJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gU0VDVE9SX1NISUZUOworCXNlY3Rvcl90IGRldl9zaXplID0gZGQtPmRtX2Rldi5iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IFNFQ1RPUl9TSElGVDsKIAogCWlmICghZGV2X3NpemUpCiAJCXJldHVybiAxOwpAQCAtMzkyLDE2ICszOTUsMTcgQEAKICAqIGNhcmVmdWwgdG8gbGVhdmUgdGhpbmdzIGFzIHRoZXkgd2VyZSBpZiB3ZSBmYWlsIHRvIHJlb3BlbiB0aGUKICAqIGRldmljZS4KICAqLwotc3RhdGljIGludCB1cGdyYWRlX21vZGUoc3RydWN0IGRtX2RldiAqZGQsIGludCBuZXdfbW9kZSwgc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQorc3RhdGljIGludCB1cGdyYWRlX21vZGUoc3RydWN0IGRtX2Rldl9pbnRlcm5hbCAqZGQsIGludCBuZXdfbW9kZSwKKwkJCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKIHsKIAlpbnQgcjsKLQlzdHJ1Y3QgZG1fZGV2IGRkX2NvcHk7Ci0JZGV2X3QgZGV2ID0gZGQtPmJkZXYtPmJkX2RldjsKKwlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsIGRkX2NvcHk7CisJZGV2X3QgZGV2ID0gZGQtPmRtX2Rldi5iZGV2LT5iZF9kZXY7CiAKIAlkZF9jb3B5ID0gKmRkOwogCi0JZGQtPm1vZGUgfD0gbmV3X21vZGU7Ci0JZGQtPmJkZXYgPSBOVUxMOworCWRkLT5kbV9kZXYubW9kZSB8PSBuZXdfbW9kZTsKKwlkZC0+ZG1fZGV2LmJkZXYgPSBOVUxMOwogCXIgPSBvcGVuX2RldihkZCwgZGV2LCBtZCk7CiAJaWYgKCFyKQogCQljbG9zZV9kZXYoJmRkX2NvcHksIG1kKTsKQEAgLTQyMSw3ICs0MjUsNyBAQAogewogCWludCByOwogCWRldl90IHVuaW5pdGlhbGl6ZWRfdmFyKGRldik7Ci0Jc3RydWN0IGRtX2RldiAqZGQ7CisJc3RydWN0IGRtX2Rldl9pbnRlcm5hbCAqZGQ7CiAJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKIAogCUJVR19PTighdCk7CkBAIC00NDMsMjAgKzQ0NywyMCBAQAogCQlpZiAoIWRkKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJZGQtPm1vZGUgPSBtb2RlOwotCQlkZC0+YmRldiA9IE5VTEw7CisJCWRkLT5kbV9kZXYubW9kZSA9IG1vZGU7CisJCWRkLT5kbV9kZXYuYmRldiA9IE5VTEw7CiAKIAkJaWYgKChyID0gb3Blbl9kZXYoZGQsIGRldiwgdC0+bWQpKSkgewogCQkJa2ZyZWUoZGQpOwogCQkJcmV0dXJuIHI7CiAJCX0KIAotCQlmb3JtYXRfZGV2X3QoZGQtPm5hbWUsIGRldik7CisJCWZvcm1hdF9kZXZfdChkZC0+ZG1fZGV2Lm5hbWUsIGRldik7CiAKIAkJYXRvbWljX3NldCgmZGQtPmNvdW50LCAwKTsKIAkJbGlzdF9hZGQoJmRkLT5saXN0LCAmdC0+ZGV2aWNlcyk7CiAKLQl9IGVsc2UgaWYgKGRkLT5tb2RlICE9IChtb2RlIHwgZGQtPm1vZGUpKSB7CisJfSBlbHNlIGlmIChkZC0+ZG1fZGV2Lm1vZGUgIT0gKG1vZGUgfCBkZC0+ZG1fZGV2Lm1vZGUpKSB7CiAJCXIgPSB1cGdyYWRlX21vZGUoZGQsIG1vZGUsIHQtPm1kKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKQEAgLTQ2NSwxMSArNDY5LDExIEBACiAKIAlpZiAoIWNoZWNrX2RldmljZV9hcmVhKGRkLCBzdGFydCwgbGVuKSkgewogCQlETVdBUk4oImRldmljZSAlcyB0b28gc21hbGwgZm9yIHRhcmdldCIsIHBhdGgpOwotCQlkbV9wdXRfZGV2aWNlKHRpLCBkZCk7CisJCWRtX3B1dF9kZXZpY2UodGksICZkZC0+ZG1fZGV2KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JKnJlc3VsdCA9IGRkOworCSpyZXN1bHQgPSAmZGQtPmRtX2RldjsKIAogCXJldHVybiAwOwogfQpAQCAtNDc4LDYgKzQ4MiwxMyBAQAogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGlvX3Jlc3RyaWN0aW9ucyAqcnMgPSAmdGktPmxpbWl0czsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlpZiAodW5saWtlbHkoIXEpKSB7CisJCURNV0FSTigiJXM6IENhbm5vdCBzZXQgbGltaXRzIGZvciBub25leGlzdGVudCBkZXZpY2UgJXMiLAorCQkgICAgICAgZG1fZGV2aWNlX25hbWUodGktPnRhYmxlLT5tZCksIGJkZXZuYW1lKGJkZXYsIGIpKTsKKwkJcmV0dXJuOworCX0KIAogCS8qCiAJICogQ29tYmluZSB0aGUgZGV2aWNlIGxpbWl0cyBsb3cuCkBAIC01NDAsOCArNTUxLDExIEBACiAvKgogICogRGVjcmVtZW50IGEgZGV2aWNlcyB1c2UgY291bnQgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkuCiAgKi8KLXZvaWQgZG1fcHV0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZGQpCit2b2lkIGRtX3B1dF9kZXZpY2Uoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmQpCiB7CisJc3RydWN0IGRtX2Rldl9pbnRlcm5hbCAqZGQgPSBjb250YWluZXJfb2YoZCwgc3RydWN0IGRtX2Rldl9pbnRlcm5hbCwKKwkJCQkJCSAgZG1fZGV2KTsKKwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZC0+Y291bnQpKSB7CiAJCWNsb3NlX2RldihkZCwgdGktPnRhYmxlLT5tZCk7CiAJCWxpc3RfZGVsKCZkZC0+bGlzdCk7CkBAIC05MzcsMTMgKzk1MSwyMCBAQAogCiBpbnQgZG1fdGFibGVfYW55X2Nvbmdlc3RlZChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBiZGlfYml0cykKIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZDsKKwlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzID0gZG1fdGFibGVfZ2V0X2RldmljZXModCk7CiAJaW50IHIgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZCwgZGV2aWNlcywgbGlzdCkgewotCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRkLT5iZGV2KTsKLQkJciB8PSBiZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBiZGlfYml0cyk7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmRtX2Rldi5iZGV2KTsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCWlmIChsaWtlbHkocSkpCisJCQlyIHw9IGJkaV9jb25nZXN0ZWQoJnEtPmJhY2tpbmdfZGV2X2luZm8sIGJkaV9iaXRzKTsKKwkJZWxzZQorCQkJRE1XQVJOX0xJTUlUKCIlczogYW55X2Nvbmdlc3RlZDogbm9uZXhpc3RlbnQgZGV2aWNlICVzIiwKKwkJCQkgICAgIGRtX2RldmljZV9uYW1lKHQtPm1kKSwKKwkJCQkgICAgIGJkZXZuYW1lKGRkLT5kbV9kZXYuYmRldiwgYikpOwogCX0KIAogCXJldHVybiByOwpAQCAtOTUxLDEzICs5NzIsMTkgQEAKIAogdm9pZCBkbV90YWJsZV91bnBsdWdfYWxsKHN0cnVjdCBkbV90YWJsZSAqdCkKIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZDsKKwlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzID0gZG1fdGFibGVfZ2V0X2RldmljZXModCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRkLCBkZXZpY2VzLCBsaXN0KSB7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmJkZXYpOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRkLT5kbV9kZXYuYmRldik7CisJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotCQlibGtfdW5wbHVnKHEpOworCQlpZiAobGlrZWx5KHEpKQorCQkJYmxrX3VucGx1ZyhxKTsKKwkJZWxzZQorCQkJRE1XQVJOX0xJTUlUKCIlczogQ2Fubm90IHVucGx1ZyBub25leGlzdGVudCBkZXZpY2UgJXMiLAorCQkJCSAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLAorCQkJCSAgICAgYmRldm5hbWUoZGQtPmRtX2Rldi5iZGV2LCBiKSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggYmNhNDQ4ZS4uMzI3ZGUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMzc3LDEzICszNzcsMTQgQEAKIHN0YXRpYyB2b2lkIHN0YXJ0X2lvX2FjY3Qoc3RydWN0IGRtX2lvICppbykKIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBpby0+bWQ7CisJaW50IGNwdTsKIAogCWlvLT5zdGFydF90aW1lID0gamlmZmllczsKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWRpc2tfcm91bmRfc3RhdHMoZG1fZGlzayhtZCkpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JZG1fZGlzayhtZCktPmluX2ZsaWdodCA9IGF0b21pY19pbmNfcmV0dXJuKCZtZC0+cGVuZGluZyk7CisJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgJmRtX2Rpc2sobWQpLT5wYXJ0MCk7CisJcGFydF9zdGF0X3VubG9jaygpOworCWRtX2Rpc2sobWQpLT5wYXJ0MC5pbl9mbGlnaHQgPSBhdG9taWNfaW5jX3JldHVybigmbWQtPnBlbmRpbmcpOwogfQogCiBzdGF0aWMgaW50IGVuZF9pb19hY2N0KHN0cnVjdCBkbV9pbyAqaW8pCkBAIC0zOTEsMTUgKzM5MiwxNiBAQAogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IGlvLT5tZDsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBpby0+YmlvOwogCXVuc2lnbmVkIGxvbmcgZHVyYXRpb24gPSBqaWZmaWVzIC0gaW8tPnN0YXJ0X3RpbWU7Ci0JaW50IHBlbmRpbmc7CisJaW50IHBlbmRpbmcsIGNwdTsKIAlpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWRpc2tfcm91bmRfc3RhdHMoZG1fZGlzayhtZCkpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JZG1fZGlzayhtZCktPmluX2ZsaWdodCA9IHBlbmRpbmcgPSBhdG9taWNfZGVjX3JldHVybigmbWQtPnBlbmRpbmcpOworCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CisJcGFydF9yb3VuZF9zdGF0cyhjcHUsICZkbV9kaXNrKG1kKS0+cGFydDApOworCXBhcnRfc3RhdF9hZGQoY3B1LCAmZG1fZGlzayhtZCktPnBhcnQwLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKLQlkaXNrX3N0YXRfYWRkKGRtX2Rpc2sobWQpLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwlkbV9kaXNrKG1kKS0+cGFydDAuaW5fZmxpZ2h0ID0gcGVuZGluZyA9CisJCWF0b21pY19kZWNfcmV0dXJuKCZtZC0+cGVuZGluZyk7CiAKIAlyZXR1cm4gIXBlbmRpbmc7CiB9CkBAIC04MzcsMTIgKzgzOSwxNCBAQAogCXN0cnVjdCBkbV90YWJsZSAqbWFwID0gZG1fZ2V0X3RhYmxlKG1kKTsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKIAlzZWN0b3JfdCBtYXhfc2VjdG9yczsKLQlpbnQgbWF4X3NpemU7CisJaW50IG1heF9zaXplID0gMDsKIAogCWlmICh1bmxpa2VseSghbWFwKSkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJdGkgPSBkbV90YWJsZV9maW5kX3RhcmdldChtYXAsIGJ2bS0+Ymlfc2VjdG9yKTsKKwlpZiAoIWRtX3RhcmdldF9pc192YWxpZCh0aSkpCisJCWdvdG8gb3V0X3RhYmxlOwogCiAJLyoKIAkgKiBGaW5kIG1heGltdW0gYW1vdW50IG9mIEkvTyB0aGF0IHdvbid0IG5lZWQgc3BsaXR0aW5nCkBAIC04NjEsMTQgKzg2NSwxNiBAQAogCWlmIChtYXhfc2l6ZSAmJiB0aS0+dHlwZS0+bWVyZ2UpCiAJCW1heF9zaXplID0gdGktPnR5cGUtPm1lcmdlKHRpLCBidm0sIGJpb3ZlYywgbWF4X3NpemUpOwogCitvdXRfdGFibGU6CisJZG1fdGFibGVfcHV0KG1hcCk7CisKK291dDoKIAkvKgogCSAqIEFsd2F5cyBhbGxvdyBhbiBlbnRpcmUgZmlyc3QgcGFnZQogCSAqLwogCWlmIChtYXhfc2l6ZSA8PSBiaW92ZWMtPmJ2X2xlbiAmJiAhKGJ2bS0+Ymlfc2l6ZSA+PiBTRUNUT1JfU0hJRlQpKQogCQltYXhfc2l6ZSA9IGJpb3ZlYy0+YnZfbGVuOwogCi0JZG1fdGFibGVfcHV0KG1hcCk7Ci0KIAlyZXR1cm4gbWF4X3NpemU7CiB9CiAKQEAgLTg4MSw2ICs4ODcsNyBAQAogCWludCByID0gLUVJTzsKIAlpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBxLT5xdWV1ZWRhdGE7CisJaW50IGNwdTsKIAogCS8qCiAJICogVGhlcmUgaXMgbm8gdXNlIGluIGZvcndhcmRpbmcgYW55IGJhcnJpZXIgcmVxdWVzdCBzaW5jZSB3ZSBjYW4ndApAQCAtODkzLDggKzkwMCwxMCBAQAogCiAJZG93bl9yZWFkKCZtZC0+aW9fbG9jayk7CiAKLQlkaXNrX3N0YXRfaW5jKGRtX2Rpc2sobWQpLCBpb3NbcnddKTsKLQlkaXNrX3N0YXRfYWRkKGRtX2Rpc2sobWQpLCBzZWN0b3JzW3J3XSwgYmlvX3NlY3RvcnMoYmlvKSk7CisJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJmRtX2Rpc2sobWQpLT5wYXJ0MCwgaW9zW3J3XSk7CisJcGFydF9zdGF0X2FkZChjcHUsICZkbV9kaXNrKG1kKS0+cGFydDAsIHNlY3RvcnNbcnddLCBiaW9fc2VjdG9ycyhiaW8pKTsKKwlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKIAkvKgogCSAqIElmIHdlJ3JlIHN1c3BlbmRlZCB3ZSBoYXZlIHRvIHF1ZXVlCkBAIC0xMTQyLDcgKzExNTEsNyBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX2RldihzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7Ci0JaW50IG1pbm9yID0gbWQtPmRpc2stPmZpcnN0X21pbm9yOworCWludCBtaW5vciA9IE1JTk9SKGRpc2tfZGV2dChtZC0+ZGlzaykpOwogCiAJaWYgKG1kLT5zdXNwZW5kZWRfYmRldikgewogCQl1bmxvY2tfZnMobWQpOwpAQCAtMTE3OCw3ICsxMTg3LDcgQEAKIAlsaXN0X3NwbGljZV9pbml0KCZtZC0+dWV2ZW50X2xpc3QsICZ1ZXZlbnRzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+dWV2ZW50X2xvY2ssIGZsYWdzKTsKIAotCWRtX3NlbmRfdWV2ZW50cygmdWV2ZW50cywgJm1kLT5kaXNrLT5kZXYua29iaik7CisJZG1fc2VuZF91ZXZlbnRzKCZ1ZXZlbnRzLCAmZGlza190b19kZXYobWQtPmRpc2spLT5rb2JqKTsKIAogCWF0b21pY19pbmMoJm1kLT5ldmVudF9ucik7CiAJd2FrZV91cCgmbWQtPmV2ZW50cSk7CkBAIC0xMjYzLDcgKzEyNzIsNyBAQAogCiAJbWQgPSBpZHJfZmluZCgmX21pbm9yX2lkciwgbWlub3IpOwogCWlmIChtZCAmJiAobWQgPT0gTUlOT1JfQUxMT0NFRCB8fAotCQkgICAoZG1fZGlzayhtZCktPmZpcnN0X21pbm9yICE9IG1pbm9yKSB8fAorCQkgICAoTUlOT1IoZGlza19kZXZ0KGRtX2Rpc2sobWQpKSkgIT0gbWlub3IpIHx8CiAJCSAgIHRlc3RfYml0KERNRl9GUkVFSU5HLCAmbWQtPmZsYWdzKSkpIHsKIAkJbWQgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTEzMTQsNyArMTMyMyw4IEBACiAKIAlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbWQtPmhvbGRlcnMsICZfbWlub3JfbG9jaykpIHsKIAkJbWFwID0gZG1fZ2V0X3RhYmxlKG1kKTsKLQkJaWRyX3JlcGxhY2UoJl9taW5vcl9pZHIsIE1JTk9SX0FMTE9DRUQsIGRtX2Rpc2sobWQpLT5maXJzdF9taW5vcik7CisJCWlkcl9yZXBsYWNlKCZfbWlub3JfaWRyLCBNSU5PUl9BTExPQ0VELAorCQkJICAgIE1JTk9SKGRpc2tfZGV2dChkbV9kaXNrKG1kKSkpKTsKIAkJc2V0X2JpdChETUZfRlJFRUlORywgJm1kLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CiAJCWlmICghZG1fc3VzcGVuZGVkKG1kKSkgewpAQCAtMTYzNCw3ICsxNjQ0LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQgZG1fa29iamVjdF91ZXZlbnQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQogewotCWtvYmplY3RfdWV2ZW50KCZtZC0+ZGlzay0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKKwlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWQtPmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiB9CiAKIHVpbnQzMl90IGRtX25leHRfdWV2ZW50X3NlcShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmggYi9kcml2ZXJzL21kL2RtLmgKaW5kZXggMWU1OWEwYi4uY2QxODlkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5oCisrKyBiL2RyaXZlcnMvbWQvZG0uaApAQCAtMjUsMTMgKzI1LDEwIEBACiAvKgogICogTGlzdCBvZiBkZXZpY2VzIHRoYXQgYSBtZXRhZGV2aWNlIHVzZXMgYW5kIHNob3VsZCBvcGVuL2Nsb3NlLgogICovCi1zdHJ1Y3QgZG1fZGV2IHsKK3N0cnVjdCBkbV9kZXZfaW50ZXJuYWwgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQogCWF0b21pY190IGNvdW50OwotCWludCBtb2RlOwotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0JY2hhciBuYW1lWzE2XTsKKwlzdHJ1Y3QgZG1fZGV2IGRtX2RldjsKIH07CiAKIHN0cnVjdCBkbV90YWJsZTsKQEAgLTQ5LDcgKzQ2LDYgQEAKIHZvaWQgZG1fdGFibGVfcG9zdHN1c3BlbmRfdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwogaW50IGRtX3RhYmxlX3Jlc3VtZV90YXJnZXRzKHN0cnVjdCBkbV90YWJsZSAqdCk7CiBpbnQgZG1fdGFibGVfYW55X2Nvbmdlc3RlZChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBiZGlfYml0cyk7Ci12b2lkIGRtX3RhYmxlX3VucGx1Z19hbGwoc3RydWN0IGRtX3RhYmxlICp0KTsKIAogLyoKICAqIFRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBkbV90YWJsZV9maW5kX3RhcmdldCgpLgpAQCAtOTMsOCArODksNiBAQAogaW50IGRtX3N0cmlwZV9pbml0KHZvaWQpOwogdm9pZCBkbV9zdHJpcGVfZXhpdCh2b2lkKTsKIAotdm9pZCAqZG1fdmNhbGxvYyh1bnNpZ25lZCBsb25nIG5tZW1iLCB1bnNpZ25lZCBsb25nIGVsZW1fc2l6ZSk7Ci11bmlvbiBtYXBfaW5mbyAqZG1fZ2V0X21hcGluZm8oc3RydWN0IGJpbyAqYmlvKTsKIGludCBkbV9vcGVuX2NvdW50KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiBpbnQgZG1fbG9ja19mb3JfZGVsZXRpb24oc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9mYXVsdHkuYyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKaW5kZXggMjY4NTQ3ZC4uZjI2YzFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9mYXVsdHkuYworKysgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCkBAIC0yODcsNiArMjg3LDggQEAKIAlpbnQgaTsKIAogCWNvbmZfdCAqY29uZiA9IGttYWxsb2Moc2l6ZW9mKCpjb25mKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25mKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaT0wOyBpPE1vZGVzOyBpKyspIHsKIAkJYXRvbWljX3NldCgmY29uZi0+Y291bnRlcnNbaV0sIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggYjFlZWJmOC4uMTkwMTQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0xNiwxNiArMTYsOCBAQAogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3JhaWQvbWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9saW5lYXIuaD4KIAotI2RlZmluZSBNQUpPUl9OUiBNRF9NQUpPUgotI2RlZmluZSBNRF9EUklWRVIKLSNkZWZpbmUgTURfUEVSU09OQUxJVFkKLQogLyoKICAqIGZpbmQgd2hpY2ggZGV2aWNlIGhvbGRzIGEgcGFydGljdWxhciBvZmZzZXQgCiAgKi8KQEAgLTMzLDE2ICsyNSwxNSBAQAogewogCWRldl9pbmZvX3QgKmhhc2g7CiAJbGluZWFyX2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwotCXNlY3Rvcl90IGJsb2NrID0gc2VjdG9yID4+IDE7CiAKIAkvKgogCSAqIHNlY3Rvcl9kaXYoYSxiKSByZXR1cm5zIHRoZSByZW1haW5lciBhbmQgc2V0cyBhIHRvIGEvYgogCSAqLwotCWJsb2NrID4+PSBjb25mLT5wcmVzaGlmdDsKLQkodm9pZClzZWN0b3JfZGl2KGJsb2NrLCBjb25mLT5oYXNoX3NwYWNpbmcpOwotCWhhc2ggPSBjb25mLT5oYXNoX3RhYmxlW2Jsb2NrXTsKKwlzZWN0b3IgPj49IGNvbmYtPnNlY3Rvcl9zaGlmdDsKKwkodm9pZClzZWN0b3JfZGl2KHNlY3RvciwgY29uZi0+c3BhY2luZyk7CisJaGFzaCA9IGNvbmYtPmhhc2hfdGFibGVbc2VjdG9yXTsKIAotCXdoaWxlICgoc2VjdG9yPj4xKSA+PSAoaGFzaC0+c2l6ZSArIGhhc2gtPm9mZnNldCkpCisJd2hpbGUgKHNlY3RvciA+PSBoYXNoLT5udW1fc2VjdG9ycyArIGhhc2gtPnN0YXJ0X3NlY3RvcikKIAkJaGFzaCsrOwogCXJldHVybiBoYXNoOwogfQpAQCAtNjUsNyArNTYsNyBAQAogCXNlY3Rvcl90IHNlY3RvciA9IGJ2bS0+Ymlfc2VjdG9yICsgZ2V0X3N0YXJ0X3NlY3QoYnZtLT5iaV9iZGV2KTsKIAogCWRldjAgPSB3aGljaF9kZXYobWRkZXYsIHNlY3Rvcik7Ci0JbWF4c2VjdG9ycyA9IChkZXYwLT5zaXplIDw8IDEpIC0gKHNlY3RvciAtIChkZXYwLT5vZmZzZXQ8PDEpKTsKKwltYXhzZWN0b3JzID0gZGV2MC0+bnVtX3NlY3RvcnMgLSAoc2VjdG9yIC0gZGV2MC0+c3RhcnRfc2VjdG9yKTsKIAogCWlmIChtYXhzZWN0b3JzIDwgYmlvX3NlY3RvcnMpCiAJCW1heHNlY3RvcnMgPSAwOwpAQCAtMTEyLDggKzEwMyw4IEBACiAJZGV2X2luZm9fdCAqKnRhYmxlOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJaW50IGksIG5iX3pvbmUsIGNudDsKLQlzZWN0b3JfdCBtaW5fc3BhY2luZzsKLQlzZWN0b3JfdCBjdXJyX29mZnNldDsKKwlzZWN0b3JfdCBtaW5fc2VjdG9yczsKKwlzZWN0b3JfdCBjdXJyX3NlY3RvcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAljb25mID0ga3phbGxvYyAoc2l6ZW9mICgqY29uZikgKyByYWlkX2Rpc2tzKnNpemVvZihkZXZfaW5mb190KSwKQEAgLTE0NSw3ICsxMzYsNyBAQAogCQkgICAgbWRkZXYtPnF1ZXVlLT5tYXhfc2VjdG9ycyA+IChQQUdFX1NJWkU+PjkpKQogCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKIAotCQlkaXNrLT5zaXplID0gcmRldi0+c2l6ZTsKKwkJZGlzay0+bnVtX3NlY3RvcnMgPSByZGV2LT5zaXplICogMjsKIAkJY29uZi0+YXJyYXlfc2VjdG9ycyArPSByZGV2LT5zaXplICogMjsKIAogCQljbnQrKzsKQEAgLTE1NSwzNCArMTQ2LDM0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW1pbl9zcGFjaW5nID0gY29uZi0+YXJyYXlfc2VjdG9ycyAvIDI7Ci0Jc2VjdG9yX2RpdihtaW5fc3BhY2luZywgUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgZGV2X2luZm8gKikpOworCW1pbl9zZWN0b3JzID0gY29uZi0+YXJyYXlfc2VjdG9yczsKKwlzZWN0b3JfZGl2KG1pbl9zZWN0b3JzLCBQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBkZXZfaW5mbyAqKSk7CiAKLQkvKiBtaW5fc3BhY2luZyBpcyB0aGUgbWluaW11bSBzcGFjaW5nIHRoYXQgd2lsbCBmaXQgdGhlIGhhc2gKKwkvKiBtaW5fc2VjdG9ycyBpcyB0aGUgbWluaW11bSBzcGFjaW5nIHRoYXQgd2lsbCBmaXQgdGhlIGhhc2gKIAkgKiB0YWJsZSBpbiBvbmUgUEFHRS4gIFRoaXMgbWF5IGJlIG11Y2ggc21hbGxlciB0aGFuIG5lZWRlZC4KIAkgKiBXZSBmaW5kIHRoZSBzbWFsbGVzdCBub24tdGVybWluYWwgc2V0IG9mIGNvbnNlY3V0aXZlIGRldmljZXMKLQkgKiB0aGF0IGlzIGxhcmdlciB0aGFuIG1pbl9zcGFjaW5nIGFzIHVzZSB0aGUgc2l6ZSBvZiB0aGF0IGFzCisJICogdGhhdCBpcyBsYXJnZXIgdGhhbiBtaW5fc2VjdG9ycyBhbmQgdXNlIHRoZSBzaXplIG9mIHRoYXQgYXMKIAkgKiB0aGUgYWN0dWFsIHNwYWNpbmcKIAkgKi8KLQljb25mLT5oYXNoX3NwYWNpbmcgPSBjb25mLT5hcnJheV9zZWN0b3JzIC8gMjsKKwljb25mLT5zcGFjaW5nID0gY29uZi0+YXJyYXlfc2VjdG9yczsKIAlmb3IgKGk9MDsgaSA8IGNudC0xIDsgaSsrKSB7Ci0JCXNlY3Rvcl90IHN6ID0gMDsKKwkJc2VjdG9yX3QgdG1wID0gMDsKIAkJaW50IGo7Ci0JCWZvciAoaiA9IGk7IGogPCBjbnQgLSAxICYmIHN6IDwgbWluX3NwYWNpbmc7IGorKykKLQkJCXN6ICs9IGNvbmYtPmRpc2tzW2pdLnNpemU7Ci0JCWlmIChzeiA+PSBtaW5fc3BhY2luZyAmJiBzeiA8IGNvbmYtPmhhc2hfc3BhY2luZykKLQkJCWNvbmYtPmhhc2hfc3BhY2luZyA9IHN6OworCQlmb3IgKGogPSBpOyBqIDwgY250IC0gMSAmJiB0bXAgPCBtaW5fc2VjdG9yczsgaisrKQorCQkJdG1wICs9IGNvbmYtPmRpc2tzW2pdLm51bV9zZWN0b3JzOworCQlpZiAodG1wID49IG1pbl9zZWN0b3JzICYmIHRtcCA8IGNvbmYtPnNwYWNpbmcpCisJCQljb25mLT5zcGFjaW5nID0gdG1wOwogCX0KIAotCS8qIGhhc2hfc3BhY2luZyBtYXkgYmUgdG9vIGxhcmdlIGZvciBzZWN0b3JfZGl2IHRvIHdvcmsgd2l0aCwKKwkvKiBzcGFjaW5nIG1heSBiZSB0b28gbGFyZ2UgZm9yIHNlY3Rvcl9kaXYgdG8gd29yayB3aXRoLAogCSAqIHNvIHdlIG1pZ2h0IG5lZWQgdG8gcHJlLXNoaWZ0CiAJICovCi0JY29uZi0+cHJlc2hpZnQgPSAwOworCWNvbmYtPnNlY3Rvcl9zaGlmdCA9IDA7CiAJaWYgKHNpemVvZihzZWN0b3JfdCkgPiBzaXplb2YodTMyKSkgewotCQlzZWN0b3JfdCBzcGFjZSA9IGNvbmYtPmhhc2hfc3BhY2luZzsKKwkJc2VjdG9yX3Qgc3BhY2UgPSBjb25mLT5zcGFjaW5nOwogCQl3aGlsZSAoc3BhY2UgPiAoc2VjdG9yX3QpKH4odTMyKTApKSB7CiAJCQlzcGFjZSA+Pj0gMTsKLQkJCWNvbmYtPnByZXNoaWZ0Kys7CisJCQljb25mLT5zZWN0b3Jfc2hpZnQrKzsKIAkJfQogCX0KIAkvKgpAQCAtMTk0LDkgKzE4NSw5IEBACiAJCXVuc2lnbmVkIHJvdW5kOwogCQl1bnNpZ25lZCBsb25nIGJhc2U7CiAKLQkJc3ogPSBjb25mLT5hcnJheV9zZWN0b3JzID4+IChjb25mLT5wcmVzaGlmdCArIDEpOworCQlzeiA9IGNvbmYtPmFycmF5X3NlY3RvcnMgPj4gY29uZi0+c2VjdG9yX3NoaWZ0OwogCQlzeiArPSAxOyAvKiBmb3JjZSByb3VuZC11cCAqLwotCQliYXNlID0gY29uZi0+aGFzaF9zcGFjaW5nID4+IGNvbmYtPnByZXNoaWZ0OworCQliYXNlID0gY29uZi0+c3BhY2luZyA+PiBjb25mLT5zZWN0b3Jfc2hpZnQ7CiAJCXJvdW5kID0gc2VjdG9yX2RpdihzeiwgYmFzZSk7CiAJCW5iX3pvbmUgPSBzeiArIChyb3VuZCA/IDEgOiAwKTsKIAl9CkBAIC0yMTEsMzIgKzIwMiwzMSBAQAogCSAqIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIGxpbmVhciBoYXNoIHRhYmxlCiAJICogRmlyc3QgY2FsY3VsYXRlIHRoZSBkZXZpY2Ugb2Zmc2V0cy4KIAkgKi8KLQljb25mLT5kaXNrc1swXS5vZmZzZXQgPSAwOworCWNvbmYtPmRpc2tzWzBdLnN0YXJ0X3NlY3RvciA9IDA7CiAJZm9yIChpID0gMTsgaSA8IHJhaWRfZGlza3M7IGkrKykKLQkJY29uZi0+ZGlza3NbaV0ub2Zmc2V0ID0KLQkJCWNvbmYtPmRpc2tzW2ktMV0ub2Zmc2V0ICsKLQkJCWNvbmYtPmRpc2tzW2ktMV0uc2l6ZTsKKwkJY29uZi0+ZGlza3NbaV0uc3RhcnRfc2VjdG9yID0KKwkJCWNvbmYtPmRpc2tzW2ktMV0uc3RhcnRfc2VjdG9yICsKKwkJCWNvbmYtPmRpc2tzW2ktMV0ubnVtX3NlY3RvcnM7CiAKIAl0YWJsZSA9IGNvbmYtPmhhc2hfdGFibGU7Ci0JY3Vycl9vZmZzZXQgPSAwOwogCWkgPSAwOwotCWZvciAoY3Vycl9vZmZzZXQgPSAwOwotCSAgICAgY3Vycl9vZmZzZXQgPCBjb25mLT5hcnJheV9zZWN0b3JzIC8gMjsKLQkgICAgIGN1cnJfb2Zmc2V0ICs9IGNvbmYtPmhhc2hfc3BhY2luZykgeworCWZvciAoY3Vycl9zZWN0b3IgPSAwOworCSAgICAgY3Vycl9zZWN0b3IgPCBjb25mLT5hcnJheV9zZWN0b3JzOworCSAgICAgY3Vycl9zZWN0b3IgKz0gY29uZi0+c3BhY2luZykgewogCiAJCXdoaWxlIChpIDwgcmFpZF9kaXNrcy0xICYmCi0JCSAgICAgICBjdXJyX29mZnNldCA+PSBjb25mLT5kaXNrc1tpKzFdLm9mZnNldCkKKwkJICAgICAgIGN1cnJfc2VjdG9yID49IGNvbmYtPmRpc2tzW2krMV0uc3RhcnRfc2VjdG9yKQogCQkJaSsrOwogCiAJCSp0YWJsZSArKyA9IGNvbmYtPmRpc2tzICsgaTsKIAl9CiAKLQlpZiAoY29uZi0+cHJlc2hpZnQpIHsKLQkJY29uZi0+aGFzaF9zcGFjaW5nID4+PSBjb25mLT5wcmVzaGlmdDsKLQkJLyogcm91bmQgaGFzaF9zcGFjaW5nIHVwIHNvIHRoYXQgd2hlbiB3ZSBkaXZpZGUgYnkgaXQsCisJaWYgKGNvbmYtPnNlY3Rvcl9zaGlmdCkgeworCQljb25mLT5zcGFjaW5nID4+PSBjb25mLT5zZWN0b3Jfc2hpZnQ7CisJCS8qIHJvdW5kIHNwYWNpbmcgdXAgc28gdGhhdCB3aGVuIHdlIGRpdmlkZSBieSBpdCwKIAkJICogd2UgZXJyIG9uIHRoZSBzaWRlIG9mICJ0b28tbG93Iiwgd2hpY2ggaXMgc2FmZXN0LgogCQkgKi8KLQkJY29uZi0+aGFzaF9zcGFjaW5nKys7CisJCWNvbmYtPnNwYWNpbmcrKzsKIAl9CiAKIAlCVUdfT04odGFibGUgLSBjb25mLT5oYXNoX3RhYmxlID4gbmJfem9uZSk7CkBAIC0zMTcsNDAgKzMwNyw0NyBAQAogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCWRldl9pbmZvX3QgKnRtcF9kZXY7Ci0Jc2VjdG9yX3QgYmxvY2s7CisJaW50IGNwdTsKIAogCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pKSkgewogCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CiAJCXJldHVybiAwOwogCX0KIAotCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIGlvc1tyd10pOwotCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHNlY3RvcnNbcnddLCBiaW9fc2VjdG9ycyhiaW8pKTsKKwljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOworCXBhcnRfc3RhdF9pbmMoY3B1LCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJm1kZGV2LT5nZW5kaXNrLT5wYXJ0MCwgc2VjdG9yc1tyd10sCisJCSAgICAgIGJpb19zZWN0b3JzKGJpbykpOworCXBhcnRfc3RhdF91bmxvY2soKTsKIAogCXRtcF9kZXYgPSB3aGljaF9kZXYobWRkZXYsIGJpby0+Ymlfc2VjdG9yKTsKLQlibG9jayA9IGJpby0+Ymlfc2VjdG9yID4+IDE7CiAgICAgCi0JaWYgKHVubGlrZWx5KGJsb2NrID49ICh0bXBfZGV2LT5zaXplICsgdG1wX2Rldi0+b2Zmc2V0KQotCQkgICAgIHx8IGJsb2NrIDwgdG1wX2Rldi0+b2Zmc2V0KSkgeworCWlmICh1bmxpa2VseShiaW8tPmJpX3NlY3RvciA+PSAodG1wX2Rldi0+bnVtX3NlY3RvcnMgKworCQkJCQl0bXBfZGV2LT5zdGFydF9zZWN0b3IpCisJCSAgICAgfHwgKGJpby0+Ymlfc2VjdG9yIDwKKwkJCSB0bXBfZGV2LT5zdGFydF9zZWN0b3IpKSkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLQkJcHJpbnRrKCJsaW5lYXJfbWFrZV9yZXF1ZXN0OiBCbG9jayAlbGx1IG91dCBvZiBib3VuZHMgb24gIgotCQkJImRldiAlcyBzaXplICVsbHUgb2Zmc2V0ICVsbHVcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrLAorCQlwcmludGsoImxpbmVhcl9tYWtlX3JlcXVlc3Q6IFNlY3RvciAlbGx1IG91dCBvZiBib3VuZHMgb24gIgorCQkJImRldiAlczogJWxsdSBzZWN0b3JzLCBvZmZzZXQgJWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsCiAJCQliZGV2bmFtZSh0bXBfZGV2LT5yZGV2LT5iZGV2LCBiKSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdG1wX2Rldi0+c2l6ZSwKLQkJICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRtcF9kZXYtPm9mZnNldCk7CisJCQkodW5zaWduZWQgbG9uZyBsb25nKXRtcF9kZXYtPm51bV9zZWN0b3JzLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBfZGV2LT5zdGFydF9zZWN0b3IpOwogCQliaW9faW9fZXJyb3IoYmlvKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICh1bmxpa2VseShiaW8tPmJpX3NlY3RvciArIChiaW8tPmJpX3NpemUgPj4gOSkgPgotCQkgICAgICh0bXBfZGV2LT5vZmZzZXQgKyB0bXBfZGV2LT5zaXplKTw8MSkpIHsKKwkJICAgICB0bXBfZGV2LT5zdGFydF9zZWN0b3IgKyB0bXBfZGV2LT5udW1fc2VjdG9ycykpIHsKIAkJLyogVGhpcyBiaW8gY3Jvc3NlcyBhIGRldmljZSBib3VuZGFyeSwgc28gd2UgaGF2ZSB0bwogCQkgKiBzcGxpdCBpdC4KIAkJICovCiAJCXN0cnVjdCBiaW9fcGFpciAqYnA7Ci0JCWJwID0gYmlvX3NwbGl0KGJpbywgYmlvX3NwbGl0X3Bvb2wsCi0JCQkgICAgICAgKCh0bXBfZGV2LT5vZmZzZXQgKyB0bXBfZGV2LT5zaXplKTw8MSkgLSBiaW8tPmJpX3NlY3Rvcik7CisKKwkJYnAgPSBiaW9fc3BsaXQoYmlvLAorCQkJICAgICAgIHRtcF9kZXYtPnN0YXJ0X3NlY3RvciArIHRtcF9kZXYtPm51bV9zZWN0b3JzCisJCQkgICAgICAgLSBiaW8tPmJpX3NlY3Rvcik7CisKIAkJaWYgKGxpbmVhcl9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKSkKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KCZicC0+YmlvMSk7CiAJCWlmIChsaW5lYXJfbWFrZV9yZXF1ZXN0KHEsICZicC0+YmlvMikpCkBAIC0zNjAsNyArMzU3LDggQEAKIAl9CiAJCSAgICAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5yZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgLSAodG1wX2Rldi0+b2Zmc2V0IDw8IDEpICsgdG1wX2Rldi0+cmRldi0+ZGF0YV9vZmZzZXQ7CisJYmlvLT5iaV9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvciAtIHRtcF9kZXYtPnN0YXJ0X3NlY3RvcgorCQkrIHRtcF9kZXYtPnJkZXYtPmRhdGFfb2Zmc2V0OwogCiAJcmV0dXJuIDE7CiB9CkBAIC0zNjgsMjkgKzM2Niw2IEBACiBzdGF0aWMgdm9pZCBsaW5lYXJfc3RhdHVzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbWRkZXZfdCAqbWRkZXYpCiB7CiAKLSN1bmRlZiBNRF9ERUJVRwotI2lmZGVmIE1EX0RFQlVHCi0JaW50IGo7Ci0JbGluZWFyX2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwotCXNlY3Rvcl90IHMgPSAwOwotICAKLQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICIpOwotCWZvciAoaiA9IDA7IGogPCBtZGRldi0+cmFpZF9kaXNrczsgaisrKQotCXsKLQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwotCQlzICs9IGNvbmYtPnNtYWxsZXN0X3NpemU7Ci0JCXNlcV9wcmludGYoc2VxLCAiWyVzIiwKLQkJCSAgIGJkZXZuYW1lKGNvbmYtPmhhc2hfdGFibGVbal1bMF0ucmRldi0+YmRldixiKSk7Ci0KLQkJd2hpbGUgKHMgPiBjb25mLT5oYXNoX3RhYmxlW2pdWzBdLm9mZnNldCArCi0JCSAgICAgICAgICAgY29uZi0+aGFzaF90YWJsZVtqXVswXS5zaXplKQotCQkJc2VxX3ByaW50ZihzZXEsICIvJXNdICIsCi0JCQkJICAgYmRldm5hbWUoY29uZi0+aGFzaF90YWJsZVtqXVsxXS5yZGV2LT5iZGV2LGIpKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihzZXEsICJdICIpOwotCX0KLQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci0jZW5kaWYKIAlzZXFfcHJpbnRmKHNlcSwgIiAlZGsgcm91bmRpbmciLCBtZGRldi0+Y2h1bmtfc2l6ZS8xMDI0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDQ3OTBjODMuLmFhYTNkNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTMyLDMxICszMiwyMSBAQAogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPiAvKiBmb3IgaW52YWxpZGF0ZV9iZGV2ICovCiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0KLSNpZmRlZiBDT05GSUdfS01PRAotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNkZWZpbmUgTUFKT1JfTlIgTURfTUFKT1IKLSNkZWZpbmUgTURfRFJJVkVSCiAKIC8qIDYzIHBhcnRpdGlvbnMgd2l0aCB0aGUgYWx0ZXJuYXRlIG1ham9yIG51bWJlciAobWRwKSAqLwogI2RlZmluZSBNZHBNaW5vclNoaWZ0IDYKQEAgLTY2LDcgKzU2LDcgQEAKIAogCiAjaWZuZGVmIE1PRFVMRQotc3RhdGljIHZvaWQgYXV0b3N0YXJ0X2FycmF5cyAoaW50IHBhcnQpOworc3RhdGljIHZvaWQgYXV0b3N0YXJ0X2FycmF5cyhpbnQgcGFydCk7CiAjZW5kaWYKIAogc3RhdGljIExJU1RfSEVBRChwZXJzX2xpc3QpOwpAQCAtMjEyLDcgKzIwMiw3IEBACiAJCSkKIAogCi1zdGF0aWMgaW50IG1kX2ZhaWxfcmVxdWVzdCAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgbWRfZmFpbF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJYmlvX2lvX2Vycm9yKGJpbyk7CiAJcmV0dXJuIDA7CkBAIC0xNDY0LDEwICsxNDU0LDcgQEAKIAlpZiAoKGVyciA9IGtvYmplY3RfYWRkKCZyZGV2LT5rb2JqLCAmbWRkZXYtPmtvYmosICJkZXYtJXMiLCBiKSkpCiAJCWdvdG8gZmFpbDsKIAotCWlmIChyZGV2LT5iZGV2LT5iZF9wYXJ0KQotCQlrbyA9ICZyZGV2LT5iZGV2LT5iZF9wYXJ0LT5kZXYua29iajsKLQllbHNlCi0JCWtvID0gJnJkZXYtPmJkZXYtPmJkX2Rpc2stPmRldi5rb2JqOworCWtvID0gJnBhcnRfdG9fZGV2KHJkZXYtPmJkZXYtPmJkX3BhcnQpLT5rb2JqOwogCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnJkZXYtPmtvYmosIGtvLCAiYmxvY2siKSkpIHsKIAkJa29iamVjdF9kZWwoJnJkZXYtPmtvYmopOwogCQlnb3RvIGZhaWw7CkBAIC0yMTA5LDggKzIwOTYsNiBAQAogCiAJaWYgKHN0cmljdF9zdHJ0b3VsbChidWYsIDEwLCAmc2l6ZSkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc2l6ZSA8IG15X21kZGV2LT5zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAobXlfbWRkZXYtPnBlcnMgJiYgcmRldi0+cmFpZF9kaXNrID49IDApIHsKIAkJaWYgKG15X21kZGV2LT5wZXJzaXN0ZW50KSB7CiAJCQlzaXplID0gc3VwZXJfdHlwZXNbbXlfbWRkZXYtPm1ham9yX3ZlcnNpb25dLgpAQCAtMjEyMSw5ICsyMTA2LDkgQEAKIAkJCXNpemUgPSAocmRldi0+YmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiAxMCk7CiAJCQlzaXplIC09IHJkZXYtPmRhdGFfb2Zmc2V0LzI7CiAJCX0KLQkJaWYgKHNpemUgPCBteV9tZGRldi0+c2l6ZSkKLQkJCXJldHVybiAtRUlOVkFMOyAvKiBjb21wb25lbnQgbXVzdCBmaXQgZGV2aWNlICovCiAJfQorCWlmIChzaXplIDwgbXlfbWRkZXYtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOyAvKiBjb21wb25lbnQgbXVzdCBmaXQgZGV2aWNlICovCiAKIAlyZGV2LT5zaXplID0gc2l6ZTsKIAlpZiAoc2l6ZSA+IG9sZHNpemUgJiYgbXlfbWRkZXYtPmV4dGVybmFsKSB7CkBAIC0yNDA5LDEyICsyMzk0LDExIEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBtc2VjOwogCWNoYXIgYnVmWzMwXTsKLQljaGFyICplOworCiAJLyogcmVtb3ZlIGEgcGVyaW9kLCBhbmQgY291bnQgZGlnaXRzIGFmdGVyIGl0ICovCiAJaWYgKGxlbiA+PSBzaXplb2YoYnVmKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RybGNweShidWYsIGNidWYsIGxlbik7Ci0JYnVmW2xlbl0gPSAwOworCXN0cmxjcHkoYnVmLCBjYnVmLCBzaXplb2YoYnVmKSk7CiAJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKIAkJaWYgKGRvdCkgewogCQkJaWYgKGlzZGlnaXQoYnVmW2ldKSkgewpAQCAtMjQyNyw4ICsyNDExLDcgQEAKIAkJCWJ1ZltpXSA9IDA7CiAJCX0KIAl9Ci0JbXNlYyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmUsIDEwKTsKLQlpZiAoZSA9PSBidWYgfHwgKCplICYmICplICE9ICdcbicpKQorCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmbXNlYykgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltc2VjID0gKG1zZWMgKiAxMDAwKSAvIHNjYWxlOwogCWlmIChtc2VjID09IDApCkBAIC0yNzMwLDkgKzI3MTMsOSBAQAogCQlicmVhazsKIAljYXNlIHJlYWRfYXV0bzoKIAkJaWYgKG1kZGV2LT5wZXJzKSB7Ci0JCQlpZiAobWRkZXYtPnJvICE9IDEpCisJCQlpZiAobWRkZXYtPnJvID09IDApCiAJCQkJZXJyID0gZG9fbWRfc3RvcChtZGRldiwgMSwgMCk7Ci0JCQllbHNlCisJCQllbHNlIGlmIChtZGRldi0+cm8gPT0gMSkKIAkJCQllcnIgPSByZXN0YXJ0X2FycmF5KG1kZGV2KTsKIAkJCWlmIChlcnIgPT0gMCkgewogCQkJCW1kZGV2LT5ybyA9IDI7CkBAIC0yOTQ4LDcgKzI5MzEsMTMgQEAKIHsKIAlpbnQgbWFqb3IsIG1pbm9yOwogCWNoYXIgKmU7Ci0JaWYgKCFsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpKQorCS8qIENoYW5naW5nIHRoZSBkZXRhaWxzIG9mICdleHRlcm5hbCcgbWV0YWRhdGEgaXMKKwkgKiBhbHdheXMgcGVybWl0dGVkLiAgT3RoZXJ3aXNlIHRoZXJlIG11c3QgYmUKKwkgKiBubyBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBhcnJheS4KKwkgKi8KKwlpZiAobWRkZXYtPmV4dGVybmFsICYmIHN0cm5jbXAoYnVmLCAiZXh0ZXJuYWw6IiwgOSkgPT0gMCkKKwkJOworCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKGNtZF9tYXRjaChidWYsICJub25lIikpIHsKQEAgLTM0NzAsOCArMzQ1OSw4IEBACiAJZGlzay0+cXVldWUgPSBtZGRldi0+cXVldWU7CiAJYWRkX2Rpc2soZGlzayk7CiAJbWRkZXYtPmdlbmRpc2sgPSBkaXNrOwotCWVycm9yID0ga29iamVjdF9pbml0X2FuZF9hZGQoJm1kZGV2LT5rb2JqLCAmbWRfa3R5cGUsICZkaXNrLT5kZXYua29iaiwKLQkJCQkgICAgICIlcyIsICJtZCIpOworCWVycm9yID0ga29iamVjdF9pbml0X2FuZF9hZGQoJm1kZGV2LT5rb2JqLCAmbWRfa3R5cGUsCisJCQkJICAgICAmZGlza190b19kZXYoZGlzayktPmtvYmosICIlcyIsICJtZCIpOwogCW11dGV4X3VubG9jaygmZGlza3NfbXV0ZXgpOwogCWlmIChlcnJvcikKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IGNhbm5vdCByZWdpc3RlciAlcy9tZCAtIG5hbWUgaW4gdXNlXG4iLApAQCAtMzUzMCwxNyArMzUxOSwxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJLyoKLQkJICogY2h1bmstc2l6ZSBoYXMgdG8gYmUgYSBwb3dlciBvZiAyIGFuZCBtdWx0aXBsZXMgb2YgUEFHRV9TSVpFCisJCSAqIGNodW5rLXNpemUgaGFzIHRvIGJlIGEgcG93ZXIgb2YgMgogCQkgKi8KIAkJaWYgKCAoMSA8PCBmZnoofmNodW5rX3NpemUpKSAhPSBjaHVua19zaXplKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNodW5rX3NpemUgb2YgJWQgbm90IHZhbGlkXG4iLCBjaHVua19zaXplKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmIChjaHVua19zaXplIDwgUEFHRV9TSVpFKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInRvbyBzbWFsbCBjaHVua19zaXplOiAlZCA8ICVsZFxuIiwKLQkJCQljaHVua19zaXplLCBQQUdFX1NJWkUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAogCQkvKiBkZXZpY2VzIG11c3QgaGF2ZSBtaW5pbXVtIHNpemUgb2Ygb25lIGNodW5rICovCiAJCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgewpAQCAtMzU1OCwxMiArMzU0MiwxMCBAQAogCQl9CiAJfQogCi0jaWZkZWYgQ09ORklHX0tNT0QKIAlpZiAobWRkZXYtPmxldmVsICE9IExFVkVMX05PTkUpCiAJCXJlcXVlc3RfbW9kdWxlKCJtZC1sZXZlbC0lZCIsIG1kZGV2LT5sZXZlbCk7CiAJZWxzZSBpZiAobWRkZXYtPmNsZXZlbFswXSkKIAkJcmVxdWVzdF9tb2R1bGUoIm1kLSVzIiwgbWRkZXYtPmNsZXZlbCk7Ci0jZW5kaWYKIAogCS8qCiAJICogRHJvcCBhbGwgY29udGFpbmVyIGRldmljZSBidWZmZXJzLCBmcm9tIG5vdyBvbgpAQCAtMzc2MSw3ICszNzQzLDcgQEAKIAlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAiYXJyYXlfc3RhdGUiKTsKIAlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKIAlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAiZGVncmFkZWQiKTsKLQlrb2JqZWN0X3VldmVudCgmbWRkZXYtPmdlbmRpc2stPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CisJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KG1kZGV2LT5nZW5kaXNrKS0+a29iaiwgS09CSl9DSEFOR0UpOwogCXJldHVybiAwOwogfQogCkBAIC0zOTc0LDEwICszOTU2LDEwIEBACiAJfQogCXByaW50aygiXG4iKTsKIAotCWVyciA9IGRvX21kX3J1biAobWRkZXYpOworCWVyciA9IGRvX21kX3J1bihtZGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZDogZG9fbWRfcnVuKCkgcmV0dXJuZWQgJWRcbiIsIGVycik7Ci0JCWRvX21kX3N0b3AgKG1kZGV2LCAwLCAwKTsKKwkJZG9fbWRfc3RvcChtZGRldiwgMCwgMCk7CiAJfQogfQogCkBAIC00MzM2LDcgKzQzMTgsNyBAQAogCiAJaWYgKCEoaW5mby0+c3RhdGUgJiAoMTw8TURfRElTS19GQVVMVFkpKSkgewogCQlpbnQgZXJyOwotCQlyZGV2ID0gbWRfaW1wb3J0X2RldmljZSAoZGV2LCAtMSwgMCk7CisJCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwgLTEsIDApOwogCQlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJCSJtZDogZXJyb3IsIG1kX2ltcG9ydF9kZXZpY2UoKSByZXR1cm5lZCAlbGRcbiIsCkBAIC00NDE4LDcgKzQ0MDAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZGV2ID0gbWRfaW1wb3J0X2RldmljZSAoZGV2LCAtMSwgMCk7CisJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LCAtMSwgMCk7CiAJaWYgKElTX0VSUihyZGV2KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJIm1kOiBlcnJvciwgbWRfaW1wb3J0X2RldmljZSgpIHJldHVybmVkICVsZFxuIiwKQEAgLTQ5MzcsMTEgKzQ5MTksMTEgQEAKIAkJCWdvdG8gZG9uZV91bmxvY2s7CiAKIAkJY2FzZSBTVE9QX0FSUkFZOgotCQkJZXJyID0gZG9fbWRfc3RvcCAobWRkZXYsIDAsIDEpOworCQkJZXJyID0gZG9fbWRfc3RvcChtZGRldiwgMCwgMSk7CiAJCQlnb3RvIGRvbmVfdW5sb2NrOwogCiAJCWNhc2UgU1RPUF9BUlJBWV9STzoKLQkJCWVyciA9IGRvX21kX3N0b3AgKG1kZGV2LCAxLCAxKTsKKwkJCWVyciA9IGRvX21kX3N0b3AobWRkZXYsIDEsIDEpOwogCQkJZ290byBkb25lX3VubG9jazsKIAogCX0KQEAgLTQ5OTAsNyArNDk3Miw3IEBACiAJCQlnb3RvIGRvbmVfdW5sb2NrOwogCiAJCWNhc2UgUlVOX0FSUkFZOgotCQkJZXJyID0gZG9fbWRfcnVuIChtZGRldik7CisJCQllcnIgPSBkb19tZF9ydW4obWRkZXYpOwogCQkJZ290byBkb25lX3VubG9jazsKIAogCQljYXNlIFNFVF9CSVRNQVBfRklMRToKQEAgLTU0MjgsMTEgKzU0MTAsMTEgQEAKIAkJCXNlcV9wcmludGYoc2VxLCAiIHN1cGVyIG5vbi1wZXJzaXN0ZW50Iik7CiAKIAkJaWYgKG1kZGV2LT5wZXJzKSB7Ci0JCQltZGRldi0+cGVycy0+c3RhdHVzIChzZXEsIG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5zdGF0dXMoc2VxLCBtZGRldik7CiAJIAkJc2VxX3ByaW50ZihzZXEsICJcbiAgICAgICIpOwogCQkJaWYgKG1kZGV2LT5wZXJzLT5zeW5jX3JlcXVlc3QpIHsKIAkJCQlpZiAobWRkZXYtPmN1cnJfcmVzeW5jID4gMikgewotCQkJCQlzdGF0dXNfcmVzeW5jIChzZXEsIG1kZGV2KTsKKwkJCQkJc3RhdHVzX3Jlc3luYyhzZXEsIG1kZGV2KTsKIAkJCQkJc2VxX3ByaW50ZihzZXEsICJcbiAgICAgICIpOwogCQkJCX0gZWxzZSBpZiAobWRkZXYtPmN1cnJfcmVzeW5jID09IDEgfHwgbWRkZXYtPmN1cnJfcmVzeW5jID09IDIpCiAJCQkJCXNlcV9wcmludGYoc2VxLCAiXHRyZXN5bmM9REVMQVlFRFxuICAgICAgIik7CkBAIC01NTQ5LDggKzU1MzEsOCBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlyZGV2X2Zvcl9lYWNoX3JjdShyZGV2LCBtZGRldikgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHJkZXYtPmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9kaXNrOwotCQljdXJyX2V2ZW50cyA9IGRpc2tfc3RhdF9yZWFkKGRpc2ssIHNlY3RvcnNbMF0pICsgCi0JCQkJZGlza19zdGF0X3JlYWQoZGlzaywgc2VjdG9yc1sxXSkgLSAKKwkJY3Vycl9ldmVudHMgPSBwYXJ0X3N0YXRfcmVhZCgmZGlzay0+cGFydDAsIHNlY3RvcnNbMF0pICsKKwkJCQlwYXJ0X3N0YXRfcmVhZCgmZGlzay0+cGFydDAsIHNlY3RvcnNbMV0pIC0KIAkJCQlhdG9taWNfcmVhZCgmZGlzay0+c3luY19pbyk7CiAJCS8qIHN5bmMgSU8gd2lsbCBjYXVzZSBzeW5jX2lvIHRvIGluY3JlYXNlIGJlZm9yZSB0aGUgZGlza19zdGF0cwogCQkgKiBhcyBzeW5jX2lvIGlzIGNvdW50ZWQgd2hlbiBhIHJlcXVlc3Qgc3RhcnRzLCBhbmQKQEAgLTU3NjEsNyArNTc0MywxMSBAQAogCQkJCQkgKiB0aW1lICdyb3VuZCB3aGVuIGN1cnJfcmVzeW5jID09IDIKIAkJCQkJICovCiAJCQkJCWNvbnRpbnVlOwotCQkJCXByZXBhcmVfdG9fd2FpdCgmcmVzeW5jX3dhaXQsICZ3cSwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJCS8qIFdlIG5lZWQgdG8gd2FpdCAnaW50ZXJydXB0aWJsZScgc28gYXMgbm90IHRvCisJCQkJICogY29udHJpYnV0ZSB0byB0aGUgbG9hZCBhdmVyYWdlLCBhbmQgbm90IHRvCisJCQkJICogYmUgY2F1Z2h0IGJ5ICdzb2Z0bG9ja3VwJworCQkJCSAqLworCQkJCXByZXBhcmVfdG9fd2FpdCgmcmVzeW5jX3dhaXQsICZ3cSwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJgogCQkJCSAgICBtZGRldjItPmN1cnJfcmVzeW5jID49IG1kZGV2LT5jdXJyX3Jlc3luYykgewogCQkJCQlwcmludGsoS0VSTl9JTkZPICJtZDogZGVsYXlpbmcgJXMgb2YgJXMiCkBAIC01NzY5LDYgKzU3NTUsOCBAQAogCQkJCQkgICAgICAgIiBzaGFyZSBvbmUgb3IgbW9yZSBwaHlzaWNhbCB1bml0cylcbiIsCiAJCQkJCSAgICAgICBkZXNjLCBtZG5hbWUobWRkZXYpLCBtZG5hbWUobWRkZXYyKSk7CiAJCQkJCW1kZGV2X3B1dChtZGRldjIpOworCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQkJCQlzY2hlZHVsZSgpOwogCQkJCQlmaW5pc2hfd2FpdCgmcmVzeW5jX3dhaXQsICZ3cSk7CiAJCQkJCWdvdG8gdHJ5X2FnYWluOwpAQCAtNjI1Nyw3ICs2MjQ1LDcgQEAKIAkJCQkgKiBhcHBlYXJzIHRvIHN0aWxsIGJlIGluIHVzZS4gIEhlbmNlCiAJCQkJICogdGhlICcxMDAnLgogCQkJCSAqLwotCQkJCWRvX21kX3N0b3AgKG1kZGV2LCAxLCAxMDApOworCQkJCWRvX21kX3N0b3AobWRkZXYsIDEsIDEwMCk7CiAJCQkJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIAkJCX0KIAkJLyoKQEAgLTYzMDEsNyArNjI4OSw3IEBACiAJcmFpZF90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUocmFpZF9yb290X3RhYmxlKTsKIAogCW1kX2dlbmluaXQoKTsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGM0Nzc5Y2MuLjg3NDQwMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtMTksMTYgKzE5LDcgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL211bHRpcGF0aC5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotCi0jZGVmaW5lIE1BSk9SX05SIE1EX01BSk9SCi0jZGVmaW5lIE1EX0RSSVZFUgotI2RlZmluZSBNRF9QRVJTT05BTElUWQogCiAjZGVmaW5lIE1BWF9XT1JLX1BFUl9ESVNLIDEyOAogCkBAIC0xNDcsNiArMTM4LDcgQEAKIAlzdHJ1Y3QgbXVsdGlwYXRoX2JoICogbXBfYmg7CiAJc3RydWN0IG11bHRpcGF0aF9pbmZvICptdWx0aXBhdGg7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CisJaW50IGNwdTsKIAogCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pKSkgewogCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CkBAIC0xNTgsOCArMTUwLDExIEBACiAJbXBfYmgtPm1hc3Rlcl9iaW8gPSBiaW87CiAJbXBfYmgtPm1kZGV2ID0gbWRkZXY7CiAKLQlkaXNrX3N0YXRfaW5jKG1kZGV2LT5nZW5kaXNrLCBpb3NbcnddKTsKLQlkaXNrX3N0YXRfYWRkKG1kZGV2LT5nZW5kaXNrLCBzZWN0b3JzW3J3XSwgYmlvX3NlY3RvcnMoYmlvKSk7CisJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJm1kZGV2LT5nZW5kaXNrLT5wYXJ0MCwgaW9zW3J3XSk7CisJcGFydF9zdGF0X2FkZChjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIHNlY3RvcnNbcnddLAorCQkgICAgICBiaW9fc2VjdG9ycyhiaW8pKTsKKwlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKIAltcF9iaC0+cGF0aCA9IG11bHRpcGF0aF9tYXAoY29uZik7CiAJaWYgKG1wX2JoLT5wYXRoIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMC5jIGIvZHJpdmVycy9tZC9yYWlkMC5jCmluZGV4IDE4MzYxMDYuLjhhYzY0ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDAuYworKysgYi9kcml2ZXJzL21kL3JhaWQwLmMKQEAgLTE4LDEzICsxOCw4IEBACiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gIAogKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvcmFpZDAuaD4KIAotI2RlZmluZSBNQUpPUl9OUiBNRF9NQUpPUgotI2RlZmluZSBNRF9EUklWRVIKLSNkZWZpbmUgTURfUEVSU09OQUxJVFkKLQogc3RhdGljIHZvaWQgcmFpZDBfdW5wbHVnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMzk5LDE0ICszOTQsMTggQEAKIAlzZWN0b3JfdCBjaHVuazsKIAlzZWN0b3JfdCBibG9jaywgcnNlY3Q7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CisJaW50IGNwdTsKIAogCWlmICh1bmxpa2VseShiaW9fYmFycmllcihiaW8pKSkgewogCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CiAJCXJldHVybiAwOwogCX0KIAotCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIGlvc1tyd10pOwotCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHNlY3RvcnNbcnddLCBiaW9fc2VjdG9ycyhiaW8pKTsKKwljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOworCXBhcnRfc3RhdF9pbmMoY3B1LCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJm1kZGV2LT5nZW5kaXNrLT5wYXJ0MCwgc2VjdG9yc1tyd10sCisJCSAgICAgIGJpb19zZWN0b3JzKGJpbykpOworCXBhcnRfc3RhdF91bmxvY2soKTsKIAogCWNodW5rX3NpemUgPSBtZGRldi0+Y2h1bmtfc2l6ZSA+PiAxMDsKIAljaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zaXplID4+IDk7CkBAIC00MjMsNyArNDIyLDcgQEAKIAkJLyogVGhpcyBpcyBhIG9uZSBwYWdlIGJpbyB0aGF0IHVwcGVyIGxheWVycwogCQkgKiByZWZ1c2UgdG8gc3BsaXQgZm9yIHVzLCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0LgogCQkgKi8KLQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBiaW9fc3BsaXRfcG9vbCwgY2h1bmtfc2VjdHMgLSAoYmlvLT5iaV9zZWN0b3IgJiAoY2h1bmtfc2VjdHMgLSAxKSkgKTsKKwkJYnAgPSBiaW9fc3BsaXQoYmlvLCBjaHVua19zZWN0cyAtIChiaW8tPmJpX3NlY3RvciAmIChjaHVua19zZWN0cyAtIDEpKSk7CiAJCWlmIChyYWlkMF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKSkKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KCZicC0+YmlvMSk7CiAJCWlmIChyYWlkMF9tYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8yKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCAwM2E1YWI3Li45Yzc4OGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0zMiw2ICszMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImRtLWJpby1saXN0LmgiCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3JhaWQxLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9iaXRtYXAuaD4KIApAQCAtNzc5LDcgKzc4MCw3IEBACiAJc3RydWN0IHBhZ2UgKipiZWhpbmRfcGFnZXMgPSBOVUxMOwogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCWNvbnN0IGludCBkb19zeW5jID0gYmlvX3N5bmMoYmlvKTsKLQlpbnQgZG9fYmFycmllcnM7CisJaW50IGNwdSwgZG9fYmFycmllcnM7CiAJbWRrX3JkZXZfdCAqYmxvY2tlZF9yZGV2OwogCiAJLyoKQEAgLTgwNCw4ICs4MDUsMTEgQEAKIAogCWJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7CiAKLQlkaXNrX3N0YXRfaW5jKG1kZGV2LT5nZW5kaXNrLCBpb3NbcnddKTsKLQlkaXNrX3N0YXRfYWRkKG1kZGV2LT5nZW5kaXNrLCBzZWN0b3JzW3J3XSwgYmlvX3NlY3RvcnMoYmlvKSk7CisJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwlwYXJ0X3N0YXRfaW5jKGNwdSwgJm1kZGV2LT5nZW5kaXNrLT5wYXJ0MCwgaW9zW3J3XSk7CisJcGFydF9zdGF0X2FkZChjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIHNlY3RvcnNbcnddLAorCQkgICAgICBiaW9fc2VjdG9ycyhiaW8pKTsKKwlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKIAkvKgogCSAqIG1ha2VfcmVxdWVzdCgpIGNhbiBhYm9ydCB0aGUgb3BlcmF0aW9uIHdoZW4gUkVBREEgaXMgYmVpbmcKQEAgLTEzMDIsOSArMTMwNiw2IEBACiAJCQkJCXNiaW8tPmJpX3NpemUgPSByMV9iaW8tPnNlY3RvcnMgPDwgOTsKIAkJCQkJc2Jpby0+YmlfaWR4ID0gMDsKIAkJCQkJc2Jpby0+YmlfcGh5c19zZWdtZW50cyA9IDA7Ci0JCQkJCXNiaW8tPmJpX2h3X3NlZ21lbnRzID0gMDsKLQkJCQkJc2Jpby0+YmlfaHdfZnJvbnRfc2l6ZSA9IDA7Ci0JCQkJCXNiaW8tPmJpX2h3X2JhY2tfc2l6ZSA9IDA7CiAJCQkJCXNiaW8tPmJpX2ZsYWdzICY9IH4oQklPX1BPT0xfTUFTSyAtIDEpOwogCQkJCQlzYmlvLT5iaV9mbGFncyB8PSAxIDw8IEJJT19VUFRPREFURTsKIAkJCQkJc2Jpby0+YmlfbmV4dCA9IE5VTEw7CkBAIC0xNzkwLDcgKzE3OTEsNiBAQAogCQliaW8tPmJpX3ZjbnQgPSAwOwogCQliaW8tPmJpX2lkeCA9IDA7CiAJCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IDA7Ci0JCWJpby0+YmlfaHdfc2VnbWVudHMgPSAwOwogCQliaW8tPmJpX3NpemUgPSAwOwogCQliaW8tPmJpX2VuZF9pbyA9IE5VTEw7CiAJCWJpby0+YmlfcHJpdmF0ZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCBlMzRjZDBlLi5kYTUxMjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZG0tYmlvLWxpc3QuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvcmFpZDEwLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9iaXRtYXAuaD4KIApAQCAtNzg5LDYgKzc5MCw3IEBACiAJbWlycm9yX2luZm9fdCAqbWlycm9yOwogCXIxMGJpb190ICpyMTBfYmlvOwogCXN0cnVjdCBiaW8gKnJlYWRfYmlvOworCWludCBjcHU7CiAJaW50IGk7CiAJaW50IGNodW5rX3NlY3RzID0gY29uZi0+Y2h1bmtfbWFzayArIDE7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CkBAIC04MTYsNyArODE4LDcgQEAKIAkJLyogVGhpcyBpcyBhIG9uZSBwYWdlIGJpbyB0aGF0IHVwcGVyIGxheWVycwogCQkgKiByZWZ1c2UgdG8gc3BsaXQgZm9yIHVzLCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0LgogCQkgKi8KLQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBiaW9fc3BsaXRfcG9vbCwKKwkJYnAgPSBiaW9fc3BsaXQoYmlvLAogCQkJICAgICAgIGNodW5rX3NlY3RzIC0gKGJpby0+Ymlfc2VjdG9yICYgKGNodW5rX3NlY3RzIC0gMSkpICk7CiAJCWlmIChtYWtlX3JlcXVlc3QocSwgJmJwLT5iaW8xKSkKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KCZicC0+YmlvMSk7CkBAIC04NDMsOCArODQ1LDExIEBACiAJICovCiAJd2FpdF9iYXJyaWVyKGNvbmYpOwogCi0JZGlza19zdGF0X2luYyhtZGRldi0+Z2VuZGlzaywgaW9zW3J3XSk7Ci0JZGlza19zdGF0X2FkZChtZGRldi0+Z2VuZGlzaywgc2VjdG9yc1tyd10sIGJpb19zZWN0b3JzKGJpbykpOworCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CisJcGFydF9zdGF0X2luYyhjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIGlvc1tyd10pOworCXBhcnRfc3RhdF9hZGQoY3B1LCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwLCBzZWN0b3JzW3J3XSwKKwkJICAgICAgYmlvX3NlY3RvcnMoYmlvKSk7CisJcGFydF9zdGF0X3VubG9jaygpOwogCiAJcjEwX2JpbyA9IG1lbXBvb2xfYWxsb2MoY29uZi0+cjEwYmlvX3Bvb2wsIEdGUF9OT0lPKTsKIApAQCAtMTM0NSw5ICsxMzUwLDYgQEAKIAkJdGJpby0+Ymlfc2l6ZSA9IHIxMF9iaW8tPnNlY3RvcnMgPDwgOTsKIAkJdGJpby0+YmlfaWR4ID0gMDsKIAkJdGJpby0+YmlfcGh5c19zZWdtZW50cyA9IDA7Ci0JCXRiaW8tPmJpX2h3X3NlZ21lbnRzID0gMDsKLQkJdGJpby0+YmlfaHdfZnJvbnRfc2l6ZSA9IDA7Ci0JCXRiaW8tPmJpX2h3X2JhY2tfc2l6ZSA9IDA7CiAJCXRiaW8tPmJpX2ZsYWdzICY9IH4oQklPX1BPT0xfTUFTSyAtIDEpOwogCQl0YmlvLT5iaV9mbGFncyB8PSAxIDw8IEJJT19VUFRPREFURTsKIAkJdGJpby0+YmlfbmV4dCA9IE5VTEw7CkBAIC0xOTQ3LDcgKzE5NDksNiBAQAogCQliaW8tPmJpX3ZjbnQgPSAwOwogCQliaW8tPmJpX2lkeCA9IDA7CiAJCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IDA7Ci0JCWJpby0+YmlfaHdfc2VnbWVudHMgPSAwOwogCQliaW8tPmJpX3NpemUgPSAwOwogCX0KIApAQCAtMjAyOCw4ICsyMDI5LDkgQEAKIAlpbnQgbmMsIGZjLCBmbzsKIAlzZWN0b3JfdCBzdHJpZGUsIHNpemU7CiAKLQlpZiAobWRkZXYtPmNodW5rX3NpemUgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm1kL3JhaWQxMDogbm9uLXplcm8gY2h1bmsgc2l6ZSByZXF1aXJlZC5cbiIpOworCWlmIChtZGRldi0+Y2h1bmtfc2l6ZSA8IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1kL3JhaWQxMDogY2h1bmsgc2l6ZSBtdXN0IGJlICIKKwkJICAgICAgICJhdCBsZWFzdCBQQUdFX1NJWkUoJWxkKS5cbiIsIFBBR0VfU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IDIyNGRlMDIuLmEzNmE3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTQzLDEyICs0Myw3IEBACiAgKiBtaXNzIGFueSBiaXRzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAicmFpZDYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3JhaWQvYml0bWFwLmg+CkBAIC0xMDEsNiArOTYsNDAgQEAKIGNvbnN0IGNoYXIgcmFpZDZfZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSk7CiAjZW5kaWYKIAorLyoKKyAqIFdlIG1haW50YWluIGEgYmlhc2VkIGNvdW50IG9mIGFjdGl2ZSBzdHJpcGVzIGluIHRoZSBib3R0b20gMTYgYml0cyBvZgorICogYmlfcGh5c19zZWdtZW50cywgYW5kIGEgY291bnQgb2YgcHJvY2Vzc2VkIHN0cmlwZXMgaW4gdGhlIHVwcGVyIDE2IGJpdHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgcmFpZDVfYmlfcGh5c19zZWdtZW50cyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuIGJpby0+YmlfcGh5c19zZWdtZW50cyAmIDB4ZmZmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmFpZDVfYmlfaHdfc2VnbWVudHMoc3RydWN0IGJpbyAqYmlvKQoreworCXJldHVybiAoYmlvLT5iaV9waHlzX3NlZ21lbnRzID4+IDE2KSAmIDB4ZmZmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmFpZDVfZGVjX2JpX3BoeXNfc2VnbWVudHMoc3RydWN0IGJpbyAqYmlvKQoreworCS0tYmlvLT5iaV9waHlzX3NlZ21lbnRzOworCXJldHVybiByYWlkNV9iaV9waHlzX3NlZ21lbnRzKGJpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJhaWQ1X2RlY19iaV9od19zZWdtZW50cyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gcmFpZDVfYmlfaHdfc2VnbWVudHMoYmlvKTsKKworCS0tdmFsOworCWJpby0+YmlfcGh5c19zZWdtZW50cyA9ICh2YWwgPDwgMTYpIHwgcmFpZDVfYmlfcGh5c19zZWdtZW50cyhiaW8pOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWlkNV9zZXRfYmlfaHdfc2VnbWVudHMoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgY250KQoreworCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IHJhaWQ1X2JpX3BoeXNfc2VnbWVudHMoYmlvKSB8fCAoY250IDw8IDE2KTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcmFpZDZfbmV4dF9kaXNrKGludCBkaXNrLCBpbnQgcmFpZF9kaXNrcykKIHsKIAlkaXNrKys7CkBAIC0yNDEsNyArMjcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFpZDVfYnVpbGRfYmxvY2sgKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKK3N0YXRpYyB2b2lkIHJhaWQ1X2J1aWxkX2Jsb2NrKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKIAogc3RhdGljIHZvaWQgaW5pdF9zdHJpcGUoc3RydWN0IHN0cmlwZV9oZWFkICpzaCwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgcGRfaWR4LCBpbnQgZGlza3MpCiB7CkBAIC01MDcsNyArNTM2LDcgQEAKIAkJCXdoaWxlIChyYmkgJiYgcmJpLT5iaV9zZWN0b3IgPAogCQkJCWRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQlyYmkyID0gcjVfbmV4dF9iaW8ocmJpLCBkZXYtPnNlY3Rvcik7Ci0JCQkJaWYgKC0tcmJpLT5iaV9waHlzX3NlZ21lbnRzID09IDApIHsKKwkJCQlpZiAoIXJhaWQ1X2RlY19iaV9waHlzX3NlZ21lbnRzKHJiaSkpIHsKIAkJCQkJcmJpLT5iaV9uZXh0ID0gcmV0dXJuX2JpOwogCQkJCQlyZXR1cm5fYmkgPSByYmk7CiAJCQkJfQpAQCAtMTExNyw3ICsxMTQ2LDcgQEAKIAlyZWxlYXNlX3N0cmlwZShzaCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaWQ1X2VuZF93cml0ZV9yZXF1ZXN0IChzdHJ1Y3QgYmlvICpiaSwgaW50IGVycm9yKQorc3RhdGljIHZvaWQgcmFpZDVfZW5kX3dyaXRlX3JlcXVlc3Qoc3RydWN0IGJpbyAqYmksIGludCBlcnJvcikKIHsKICAJc3RydWN0IHN0cmlwZV9oZWFkICpzaCA9IGJpLT5iaV9wcml2YXRlOwogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IHNoLT5yYWlkX2NvbmY7CkBAIC0xMTQ5LDcgKzExNzgsNyBAQAogCiBzdGF0aWMgc2VjdG9yX3QgY29tcHV0ZV9ibG9ja25yKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKTsKIAkKLXN0YXRpYyB2b2lkIHJhaWQ1X2J1aWxkX2Jsb2NrIChzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgaSkKK3N0YXRpYyB2b2lkIHJhaWQ1X2J1aWxkX2Jsb2NrKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIGludCBpKQogewogCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07CiAKQEAgLTExODcsMTAgKzEyMTYsMTAgQEAKIAkJCXNldF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSk7CiAJCX0KIAkJc2V0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7Ci0JCXByaW50ayAoS0VSTl9BTEVSVAotCQkJInJhaWQ1OiBEaXNrIGZhaWx1cmUgb24gJXMsIGRpc2FibGluZyBkZXZpY2UuXG4iCi0JCQkicmFpZDU6IE9wZXJhdGlvbiBjb250aW51aW5nIG9uICVkIGRldmljZXMuXG4iLAotCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwgY29uZi0+cmFpZF9kaXNrcyAtIG1kZGV2LT5kZWdyYWRlZCk7CisJCXByaW50ayhLRVJOX0FMRVJUCisJCSAgICAgICAicmFpZDU6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRldmljZS5cbiIKKwkJICAgICAgICJyYWlkNTogT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlcy5cbiIsCisJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LGIpLCBjb25mLT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlZ3JhZGVkKTsKIAl9CiB9CiAKQEAgLTEyODYsOCArMTMxNSw4IEBACiAJCQkqZGRfaWR4ID0gKCpwZF9pZHggKyAyICsgKmRkX2lkeCkgJSByYWlkX2Rpc2tzOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsgKEtFUk5fQ1JJVCAicmFpZDY6IHVuc3VwcG9ydGVkIGFsZ29yaXRobSAlZFxuIiwKLQkJCQljb25mLT5hbGdvcml0aG0pOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAicmFpZDY6IHVuc3VwcG9ydGVkIGFsZ29yaXRobSAlZFxuIiwKKwkJCSAgICAgICBjb25mLT5hbGdvcml0aG0pOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTEzNjIsOCArMTM5MSw4IEBACiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayAoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAotCQkJCWNvbmYtPmFsZ29yaXRobSk7CisJCQlwcmludGsoS0VSTl9DUklUICJyYWlkNjogdW5zdXBwb3J0ZWQgYWxnb3JpdGhtICVkXG4iLAorCQkJICAgICAgIGNvbmYtPmFsZ29yaXRobSk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMTM3MSw3ICsxNDAwLDcgQEAKIAljaHVua19udW1iZXIgPSBzdHJpcGUgKiBkYXRhX2Rpc2tzICsgaTsKIAlyX3NlY3RvciA9IChzZWN0b3JfdCljaHVua19udW1iZXIgKiBzZWN0b3JzX3Blcl9jaHVuayArIGNodW5rX29mZnNldDsKIAotCWNoZWNrID0gcmFpZDVfY29tcHV0ZV9zZWN0b3IgKHJfc2VjdG9yLCByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLCAmZHVtbXkxLCAmZHVtbXkyLCBjb25mKTsKKwljaGVjayA9IHJhaWQ1X2NvbXB1dGVfc2VjdG9yKHJfc2VjdG9yLCByYWlkX2Rpc2tzLCBkYXRhX2Rpc2tzLCAmZHVtbXkxLCAmZHVtbXkyLCBjb25mKTsKIAlpZiAoY2hlY2sgIT0gc2gtPnNlY3RvciB8fCBkdW1teTEgIT0gZGRfaWR4IHx8IGR1bW15MiAhPSBzaC0+cGRfaWR4KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY29tcHV0ZV9ibG9ja25yOiBtYXAgbm90IGNvcnJlY3RcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTE3MjUsNyArMTc1NCw3IEBACiAJaWYgKCpiaXApCiAJCWJpLT5iaV9uZXh0ID0gKmJpcDsKIAkqYmlwID0gYmk7Ci0JYmktPmJpX3BoeXNfc2VnbWVudHMgKys7CisJYmktPmJpX3BoeXNfc2VnbWVudHMrKzsKIAlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAlzcGluX3VubG9jaygmc2gtPmxvY2spOwogCkBAIC0xODE5LDcgKzE4NDgsNyBAQAogCQkJc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJc3RydWN0IGJpbyAqbmV4dGJpID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKIAkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwotCQkJaWYgKC0tYmktPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkgeworCQkJaWYgKCFyYWlkNV9kZWNfYmlfcGh5c19zZWdtZW50cyhiaSkpIHsKIAkJCQltZF93cml0ZV9lbmQoY29uZi0+bWRkZXYpOwogCQkJCWJpLT5iaV9uZXh0ID0gKnJldHVybl9iaTsKIAkJCQkqcmV0dXJuX2JpID0gYmk7CkBAIC0xODM0LDcgKzE4NjMsNyBAQAogCQkgICAgICAgc2gtPmRldltpXS5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJc3RydWN0IGJpbyAqYmkyID0gcjVfbmV4dF9iaW8oYmksIHNoLT5kZXZbaV0uc2VjdG9yKTsKIAkJCWNsZWFyX2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOwotCQkJaWYgKC0tYmktPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkgeworCQkJaWYgKCFyYWlkNV9kZWNfYmlfcGh5c19zZWdtZW50cyhiaSkpIHsKIAkJCQltZF93cml0ZV9lbmQoY29uZi0+bWRkZXYpOwogCQkJCWJpLT5iaV9uZXh0ID0gKnJldHVybl9iaTsKIAkJCQkqcmV0dXJuX2JpID0gYmk7CkBAIC0xODU4LDcgKzE4ODcsNyBAQAogCQkJCXN0cnVjdCBiaW8gKm5leHRiaSA9CiAJCQkJCXI1X25leHRfYmlvKGJpLCBzaC0+ZGV2W2ldLnNlY3Rvcik7CiAJCQkJY2xlYXJfYml0KEJJT19VUFRPREFURSwgJmJpLT5iaV9mbGFncyk7Ci0JCQkJaWYgKC0tYmktPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkgeworCQkJCWlmICghcmFpZDVfZGVjX2JpX3BoeXNfc2VnbWVudHMoYmkpKSB7CiAJCQkJCWJpLT5iaV9uZXh0ID0gKnJldHVybl9iaTsKIAkJCQkJKnJldHVybl9iaSA9IGJpOwogCQkJCX0KQEAgLTIwMzMsNyArMjA2Miw3IEBACiAJCQkJd2hpbGUgKHdiaSAmJiB3YmktPmJpX3NlY3RvciA8CiAJCQkJCWRldi0+c2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKIAkJCQkJd2JpMiA9IHI1X25leHRfYmlvKHdiaSwgZGV2LT5zZWN0b3IpOwotCQkJCQlpZiAoLS13YmktPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkgeworCQkJCQlpZiAoIXJhaWQ1X2RlY19iaV9waHlzX3NlZ21lbnRzKHdiaSkpIHsKIAkJCQkJCW1kX3dyaXRlX2VuZChjb25mLT5tZGRldik7CiAJCQkJCQl3YmktPmJpX25leHQgPSAqcmV0dXJuX2JpOwogCQkJCQkJKnJldHVybl9iaSA9IHdiaTsKQEAgLTI4MTQsNyArMjg0Myw3IEBACiAJCQkJY29weV9kYXRhKDAsIHJiaSwgZGV2LT5wYWdlLCBkZXYtPnNlY3Rvcik7CiAJCQkJcmJpMiA9IHI1X25leHRfYmlvKHJiaSwgZGV2LT5zZWN0b3IpOwogCQkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQkJCQlpZiAoLS1yYmktPmJpX3BoeXNfc2VnbWVudHMgPT0gMCkgeworCQkJCWlmICghcmFpZDVfZGVjX2JpX3BoeXNfc2VnbWVudHMocmJpKSkgewogCQkJCQlyYmktPmJpX25leHQgPSByZXR1cm5fYmk7CiAJCQkJCXJldHVybl9iaSA9IHJiaTsKIAkJCQl9CkBAIC0zMTU1LDggKzMxODQsMTEgQEAKIAlpZihiaSkgewogCQljb25mLT5yZXRyeV9yZWFkX2FsaWduZWRfbGlzdCA9IGJpLT5iaV9uZXh0OwogCQliaS0+YmlfbmV4dCA9IE5VTEw7CisJCS8qCisJCSAqIHRoaXMgc2V0cyB0aGUgYWN0aXZlIHN0cmlwIGNvdW50IHRvIDEgYW5kIHRoZSBwcm9jZXNzZWQKKwkJICogc3RyaXAgY291bnQgdG8gemVybyAodXBwZXIgOCBiaXRzKQorCQkgKi8KIAkJYmktPmJpX3BoeXNfc2VnbWVudHMgPSAxOyAvKiBiaWFzZWQgY291bnQgb2YgYWN0aXZlIHN0cmlwZXMgKi8KLQkJYmktPmJpX2h3X3NlZ21lbnRzID0gMDsgLyogY291bnQgb2YgcHJvY2Vzc2VkIHN0cmlwZXMgKi8KIAl9CiAKIAlyZXR1cm4gYmk7CkBAIC0zMjA2LDggKzMyMzgsNyBAQAogCWlmICgoYmktPmJpX3NpemU+PjkpID4gcS0+bWF4X3NlY3RvcnMpCiAJCXJldHVybiAwOwogCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpKTsKLQlpZiAoYmktPmJpX3BoeXNfc2VnbWVudHMgPiBxLT5tYXhfcGh5c19zZWdtZW50cyB8fAotCSAgICBiaS0+YmlfaHdfc2VnbWVudHMgPiBxLT5tYXhfaHdfc2VnbWVudHMpCisJaWYgKGJpLT5iaV9waHlzX3NlZ21lbnRzID4gcS0+bWF4X3BoeXNfc2VnbWVudHMpCiAJCXJldHVybiAwOwogCiAJaWYgKHEtPm1lcmdlX2J2ZWNfZm4pCkBAIC0zMzUxLDcgKzMzODIsNyBAQAogCXNlY3Rvcl90IGxvZ2ljYWxfc2VjdG9yLCBsYXN0X3NlY3RvcjsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaSk7Ci0JaW50IHJlbWFpbmluZzsKKwlpbnQgY3B1LCByZW1haW5pbmc7CiAKIAlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmkpKSkgewogCQliaW9fZW5kaW8oYmksIC1FT1BOT1RTVVBQKTsKQEAgLTMzNjAsOCArMzM5MSwxMSBAQAogCiAJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpKTsKIAotCWRpc2tfc3RhdF9pbmMobWRkZXYtPmdlbmRpc2ssIGlvc1tyd10pOwotCWRpc2tfc3RhdF9hZGQobWRkZXYtPmdlbmRpc2ssIHNlY3RvcnNbcnddLCBiaW9fc2VjdG9ycyhiaSkpOworCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CisJcGFydF9zdGF0X2luYyhjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIGlvc1tyd10pOworCXBhcnRfc3RhdF9hZGQoY3B1LCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwLCBzZWN0b3JzW3J3XSwKKwkJICAgICAgYmlvX3NlY3RvcnMoYmkpKTsKKwlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKIAlpZiAocncgPT0gUkVBRCAmJgogCSAgICAgbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPT0gTWF4U2VjdG9yICYmCkBAIC0zNDY4LDcgKzM1MDIsNyBAQAogCQkJCiAJfQogCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKLQlyZW1haW5pbmcgPSAtLWJpLT5iaV9waHlzX3NlZ21lbnRzOworCXJlbWFpbmluZyA9IHJhaWQ1X2RlY19iaV9waHlzX3NlZ21lbnRzKGJpKTsKIAlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAlpZiAocmVtYWluaW5nID09IDApIHsKIApAQCAtMzc1Miw3ICszNzg2LDcgQEAKIAkJICAgICBzZWN0b3IgKz0gU1RSSVBFX1NFQ1RPUlMsCiAJCSAgICAgc2NudCsrKSB7CiAKLQkJaWYgKHNjbnQgPCByYWlkX2Jpby0+YmlfaHdfc2VnbWVudHMpCisJCWlmIChzY250IDwgcmFpZDVfYmlfaHdfc2VnbWVudHMocmFpZF9iaW8pKQogCQkJLyogYWxyZWFkeSBkb25lIHRoaXMgc3RyaXBlICovCiAJCQljb250aW51ZTsKIApAQCAtMzc2MCw3ICszNzk0LDcgQEAKIAogCQlpZiAoIXNoKSB7CiAJCQkvKiBmYWlsZWQgdG8gZ2V0IGEgc3RyaXBlIC0gbXVzdCB3YWl0ICovCi0JCQlyYWlkX2Jpby0+YmlfaHdfc2VnbWVudHMgPSBzY250OworCQkJcmFpZDVfc2V0X2JpX2h3X3NlZ21lbnRzKHJhaWRfYmlvLCBzY250KTsKIAkJCWNvbmYtPnJldHJ5X3JlYWRfYWxpZ25lZCA9IHJhaWRfYmlvOwogCQkJcmV0dXJuIGhhbmRsZWQ7CiAJCX0KQEAgLTM3NjgsNyArMzgwMiw3IEBACiAJCXNldF9iaXQoUjVfUmVhZEVycm9yLCAmc2gtPmRldltkZF9pZHhdLmZsYWdzKTsKIAkJaWYgKCFhZGRfc3RyaXBlX2JpbyhzaCwgcmFpZF9iaW8sIGRkX2lkeCwgMCkpIHsKIAkJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKLQkJCXJhaWRfYmlvLT5iaV9od19zZWdtZW50cyA9IHNjbnQ7CisJCQlyYWlkNV9zZXRfYmlfaHdfc2VnbWVudHMocmFpZF9iaW8sIHNjbnQpOwogCQkJY29uZi0+cmV0cnlfcmVhZF9hbGlnbmVkID0gcmFpZF9iaW87CiAJCQlyZXR1cm4gaGFuZGxlZDsKIAkJfQpAQCAtMzc3OCw3ICszODEyLDcgQEAKIAkJaGFuZGxlZCsrOwogCX0KIAlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7Ci0JcmVtYWluaW5nID0gLS1yYWlkX2Jpby0+YmlfcGh5c19zZWdtZW50czsKKwlyZW1haW5pbmcgPSByYWlkNV9kZWNfYmlfcGh5c19zZWdtZW50cyhyYWlkX2Jpbyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJaWYgKHJlbWFpbmluZyA9PSAwKQogCQliaW9fZW5kaW8ocmFpZF9iaW8sIDApOwpAQCAtMzk3Myw2ICs0MDA3LDEzIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCWlmIChtZGRldi0+Y2h1bmtfc2l6ZSA8IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1kL3JhaWQ1OiBjaHVua19zaXplIG11c3QgYmUgYXQgbGVhc3QgIgorCQkgICAgICAgIlBBR0VfU0laRSBidXQgJWQgPCAlbGRcbiIsCisJCSAgICAgICBtZGRldi0+Y2h1bmtfc2l6ZSwgUEFHRV9TSVpFKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uICE9IE1heFNlY3RvcikgewogCQkvKiBDaGVjayB0aGF0IHdlIGNhbiBjb250aW51ZSB0aGUgcmVzaGFwZS4KIAkJICogQ3VycmVudGx5IG9ubHkgZGlza3MgY2FuIGNoYW5nZSwgaXQgbXVzdApAQCAtNDI1MCw3ICs0MjkxLDcgQEAKIH0KIAogI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBwcmludF9zaCAoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gpCitzdGF0aWMgdm9pZCBwcmludF9zaChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHN0cmlwZV9oZWFkICpzaCkKIHsKIAlpbnQgaTsKIApAQCAtNDI2Niw3ICs0MzA3LDcgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50YWxsIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgcmFpZDVfY29uZl90ICpjb25mKQorc3RhdGljIHZvaWQgcHJpbnRhbGwoc3RydWN0IHNlcV9maWxlICpzZXEsIHJhaWQ1X2NvbmZfdCAqY29uZikKIHsKIAlzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoOwogCXN0cnVjdCBobGlzdF9ub2RlICpobjsKQEAgLTQyODQsNyArNDMyNSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc3RhdHVzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbWRkZXZfdCAqbWRkZXYpCitzdGF0aWMgdm9pZCBzdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIG1kZGV2X3QgKm1kZGV2KQogewogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IChyYWlkNV9jb25mX3QgKikgbWRkZXYtPnByaXZhdGU7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2LmggYi9kcml2ZXJzL21kL3JhaWQ2LmgKaW5kZXggMzFjYmVlNy4uOThkY2RlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNi5oCisrKyBiL2RyaXZlcnMvbWQvcmFpZDYuaApAQCAtMTgsMTUgKzE4LDYgQEAKIC8qIFNldCB0byAxIHRvIHVzZSBrZXJuZWwtd2lkZSBlbXB0eV96ZXJvX3BhZ2UgKi8KICNkZWZpbmUgUkFJRDZfVVNFX0VNUFRZX1pFUk9fUEFHRSAwCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9yYWlkNS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKaW5kZXggOGZhOTFmOC4uNDk1MmFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwpAQCAtMTAzLDYgKzEwMyw1NiBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19hdmVybWVkaWFfZHZidCk7CiAKKy8qIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiAqLworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYXZlcm1lZGlhX20xMzVhW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbMHgwMF0gPSBLRVlfUE9XRVIyLAorCVsweDJlXSA9IEtFWV9ET1QsCQkvKiAnLicgKi8KKwlbMHgwMV0gPSBLRVlfTU9ERSwJCS8qIFRWL0ZNICovCisKKwlbMHgwNV0gPSBLRVlfMSwKKwlbMHgwNl0gPSBLRVlfMiwKKwlbMHgwN10gPSBLRVlfMywKKwlbMHgwOV0gPSBLRVlfNCwKKwlbMHgwYV0gPSBLRVlfNSwKKwlbMHgwYl0gPSBLRVlfNiwKKwlbMHgwZF0gPSBLRVlfNywKKwlbMHgwZV0gPSBLRVlfOCwKKwlbMHgwZl0gPSBLRVlfOSwKKwlbMHgxMV0gPSBLRVlfMCwKKworCVsweDEzXSA9IEtFWV9SSUdIVCwJCS8qIC0+ICovCisJWzB4MTJdID0gS0VZX0xFRlQsCQkvKiA8LSAqLworCisJWzB4MTddID0gS0VZX1NMRUVQLAkJLyogQ2FwdHVyYXIgSW1hZ2VtICovCisJWzB4MTBdID0gS0VZX1NIVUZGTEUsCQkvKiBBbW9zdHJhICovCisKKwkvKiBGSVhNRTogVGhlIGtleXMgYmVsbG93IGFyZW4ndCBvayAqLworCisJWzB4NDNdID0gS0VZX0NIQU5ORUxVUCwKKwlbMHg0Ml0gPSBLRVlfQ0hBTk5FTERPV04sCisJWzB4MWZdID0gS0VZX1ZPTFVNRVVQLAorCVsweDFlXSA9IEtFWV9WT0xVTUVET1dOLAorCVsweDBjXSA9IEtFWV9FTlRFUiwKKworCVsweDE0XSA9IEtFWV9NVVRFLAorCVsweDA4XSA9IEtFWV9BVURJTywKKworCVsweDAzXSA9IEtFWV9URVhULAorCVsweDA0XSA9IEtFWV9FUEcsCisJWzB4MmJdID0gS0VZX1RWMiwJCS8qIFRWMiAqLworCisJWzB4MWRdID0gS0VZX1JFRCwKKwlbMHgxY10gPSBLRVlfWUVMTE9XLAorCVsweDQxXSA9IEtFWV9HUkVFTiwKKwlbMHg0MF0gPSBLRVlfQkxVRSwKKworCVsweDFhXSA9IEtFWV9QTEFZUEFVU0UsCisJWzB4MTldID0gS0VZX1JFQ09SRCwKKwlbMHgxOF0gPSBLRVlfUExBWSwKKwlbMHgxYl0gPSBLRVlfU1RPUCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19hdmVybWVkaWFfbTEzNWEpOworCiAvKiBBdHRpbGEgS29uZG9yb3MgPGF0dGlsYS5rb25kb3Jvc0BjaGVsbG8uaHU+ICovCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hcGFjX3ZpZXdjb21wW0lSX0tFWVRBQl9TSVpFXSA9IHsKIApAQCAtNDY3LDcgKzUxNyw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyogTVNJIFRWQG55d2hlcmUgcmVtb3RlICovCisvKiBNU0kgVFZAbnl3aGVyZSBNQVNURVIgcmVtb3RlICovCisKIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX21zaV90dmFueXdoZXJlW0lSX0tFWVRBQl9TSVpFXSA9IHsKIAkvKiBLZXlzIDAgdG8gOSAqLwogCVsgMHgwMCBdID0gS0VZXzAsCkBAIC01MDEsNiArNTUyLDk1IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyoKKyAgS2V5Y29kZXMgZm9yIHJlbW90ZSBvbiB0aGUgTVNJIFRWQG55d2hlcmUgUGx1cy4gVGhlIGNvbnRyb2xsZXIgSUMgb24gdGhlIGNhcmQKKyAgaXMgbWFya2VkICJLUzAwMyIuIFRoZSBjb250cm9sbGVyIGlzIEkyQyBhdCBhZGRyZXNzIDB4MzAsIGJ1dCBkb2VzIG5vdCBzZWVtCisgIHRvIHJlc3BvbmQgdG8gcHJvYmVzIHVudGlsIGEgcmVhZCBpcyBwZXJmb3JtZWQgZnJvbSBhIHZhbGlkIGRldmljZS4KKyAgSSBkb24ndCBrbm93IHdoeS4uLgorCisgIE5vdGU6IFRoaXMgcmVtb3RlIG1heSBiZSBvZiBzaW1pbGFyIG9yIGlkZW50aWNhbCBkZXNpZ24gdG8gdGhlCisgIFBpeGVsdmlldyByZW1vdGUgKD8pLiAgVGhlIHJhdyBjb2RlcyBhbmQgZHVwbGljYXRlIGJ1dHRvbiBjb2RlcworICBhcHBlYXIgdG8gYmUgdGhlIHNhbWUuCisKKyAgSGVucnkgV29uZyA8aGVucnlAc3R1ZmZlZGNvdy5uZXQ+CisgIFNvbWUgY2hhbmdlcyB0byBmb3JtYXR0aW5nIGFuZCBrZXljb2RlcyBieSBNYXJrIFNjaHVsdHogPG45eG1qQHlhaG9vLmNvbT4KKworKi8KKworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfbXNpX3R2YW55d2hlcmVfcGx1c1tJUl9LRVlUQUJfU0laRV0gPSB7CisKKy8qICAtLS0tIFJlbW90ZSBCdXR0b24gTGF5b3V0IC0tLS0KKworICAgIFBPV0VSICAgU09VUkNFICBTQ0FOICAgIE1VVEUKKyAgICBUVi9GTSAgIDEgICAgICAgMiAgICAgICAzCisgICAgfD4gICAgICA0ICAgICAgIDUgICAgICAgNgorICAgIDx8ICAgICAgNyAgICAgICA4ICAgICAgIDkKKyAgICBeXlVQICAgIDAgICAgICAgKyAgICAgICBSRUNBTEwKKyAgICB2dkROICAgIFJFQ09SRCAgU1RPUCAgICBQTEFZCisKKwlNSU5JTUlaRSAgICAgICAgICBaT09NCisKKwkJICBDSCsKKyAgICAgIFZPTC0gICAgICAgICAgICAgICAgICAgVk9MKworCQkgIENILQorCisJU05BUFNIT1QgICAgICAgICAgIE1UUworCisgICAgIDw8ICAgICAgRlVOQyAgICA+PiAgICAgUkVTRVQKKyovCisKKwlbMHgwMV0gPSBLRVlfS1AxLCAgICAgICAgICAgICAvKiAxICovCisJWzB4MGJdID0gS0VZX0tQMiwgICAgICAgICAgICAgLyogMiAqLworCVsweDFiXSA9IEtFWV9LUDMsICAgICAgICAgICAgIC8qIDMgKi8KKwlbMHgwNV0gPSBLRVlfS1A0LCAgICAgICAgICAgICAvKiA0ICovCisJWzB4MDldID0gS0VZX0tQNSwgICAgICAgICAgICAgLyogNSAqLworCVsweDE1XSA9IEtFWV9LUDYsICAgICAgICAgICAgIC8qIDYgKi8KKwlbMHgwNl0gPSBLRVlfS1A3LCAgICAgICAgICAgICAvKiA3ICovCisJWzB4MGFdID0gS0VZX0tQOCwgICAgICAgICAgICAgLyogOCAqLworCVsweDEyXSA9IEtFWV9LUDksICAgICAgICAgICAgIC8qIDkgKi8KKwlbMHgwMl0gPSBLRVlfS1AwLCAgICAgICAgICAgICAvKiAwICovCisJWzB4MTBdID0gS0VZX0tQUExVUywgICAgICAgICAgLyogKyAqLworCVsweDEzXSA9IEtFWV9BR0FJTiwgICAgICAgICAgIC8qIFJlY2FsbCAqLworCisJWzB4MWVdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLyogUG93ZXIgKi8KKwlbMHgwN10gPSBLRVlfVFVORVIsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKwlbMHgxY10gPSBLRVlfU0VBUkNILCAgICAgICAgICAvKiBTY2FuICovCisJWzB4MThdID0gS0VZX01VVEUsICAgICAgICAgICAgLyogTXV0ZSAqLworCisJWzB4MDNdID0gS0VZX1JBRElPLCAgICAgICAgICAgLyogVFYvRk0gKi8KKwkvKiBUaGUgbmV4dCBmb3VyIGtleXMgYXJlIGR1cGxpY2F0ZXMgdGhhdCBhcHBlYXIgdG8gc2VuZCB0aGUKKwkgICBzYW1lIElSIGNvZGUgYXMgQ2grLCBDaC0sID4+LCBhbmQgPDwgLiAgVGhlIHJhdyBjb2RlIGFzc2lnbmVkCisJICAgdG8gdGhlbSBpcyB0aGUgYWN0dWFsIGNvZGUgKyAweDIwIC0gdGhleSB3aWxsIG5ldmVyIGJlCisJICAgZGV0ZWN0ZWQgYXMgc3VjaCB1bmxlc3Mgc29tZSB3YXkgaXMgZGlzY292ZXJlZCB0byBkaXN0aW5ndWlzaAorCSAgIHRoZXNlIGJ1dHRvbnMgZnJvbSB0aG9zZSB0aGF0IGhhdmUgdGhlIHNhbWUgY29kZS4gKi8KKwlbMHgzZl0gPSBLRVlfUklHSFQsICAgICAgICAgICAvKiB8PiBhbmQgQ2grICovCisJWzB4MzddID0gS0VZX0xFRlQsICAgICAgICAgICAgLyogPHwgYW5kIENoLSAqLworCVsweDJjXSA9IEtFWV9VUCwgICAgICAgICAgICAgIC8qIF5eVXAgYW5kID4+ICovCisJWzB4MjRdID0gS0VZX0RPV04sICAgICAgICAgICAgLyogdnZEbiBhbmQgPDwgKi8KKworCVsweDAwXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8qIFJlY29yZCAqLworCVsweDA4XSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8qIFN0b3AgKi8KKwlbMHgxMV0gPSBLRVlfUExBWSwgICAgICAgICAgICAvKiBQbGF5ICovCisKKwlbMHgwZl0gPSBLRVlfQ0xPU0UsICAgICAgICAgICAvKiBNaW5pbWl6ZSAqLworCVsweDE5XSA9IEtFWV9aT09NLCAgICAgICAgICAgIC8qIFpvb20gKi8KKwlbMHgxYV0gPSBLRVlfU0hVRkZMRSwgICAgICAgICAvKiBTbmFwc2hvdCAqLworCVsweDBkXSA9IEtFWV9MQU5HVUFHRSwgICAgICAgIC8qIE1UUyAqLworCisJWzB4MTRdID0gS0VZX1ZPTFVNRURPV04sICAgICAgLyogVm9sLSAqLworCVsweDE2XSA9IEtFWV9WT0xVTUVVUCwgICAgICAgIC8qIFZvbCsgKi8KKwlbMHgxN10gPSBLRVlfQ0hBTk5FTERPV04sICAgICAvKiBDaC0gKi8KKwlbMHgxZl0gPSBLRVlfQ0hBTk5FTFVQLCAgICAgICAvKiBDaCsgKi8KKworCVsweDA0XSA9IEtFWV9SRVdJTkQsICAgICAgICAgIC8qIDw8ICovCisJWzB4MGVdID0gS0VZX01FTlUsICAgICAgICAgICAgLyogRnVuY3Rpb24gKi8KKwlbMHgwY10gPSBLRVlfRkFTVEZPUldBUkQsICAgICAvKiA+PiAqLworCVsweDFkXSA9IEtFWV9SRVNUQVJULCAgICAgICAgIC8qIFJlc2V0ICovCit9OworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfbXNpX3R2YW55d2hlcmVfcGx1cyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogLyogQ2luZXJneSAxNDAwIERWQi1UICovCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19jaW5lcmd5XzE0MDBbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHgwMSBdID0gS0VZX1BPV0VSLApAQCAtMTc5MiwxMiArMTkzMiw2MSBAQAogCVsgMHg0MSBdID0gS0VZX0dSRUVOLAkJLyogQVAyICovCiAJWyAweDQ3IF0gPSBLRVlfWUVMTE9XLAkJLyogQVAzICovCiAJWyAweDU3IF0gPSBLRVlfQkxVRSwJCS8qIEFQNCAqLwotCi0KIH07Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2VuY29yZV9lbmx0dik7CiAKKy8qIEVuY29yZSBFTkxUVjItRk0gIC0gc2lsdmVyIHBsYXN0aWMgLSAiV2FuZCBNZWRpYSIgd3JpdHRlbiBhdCB0aGUgYm90dG9uCisgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+ICovCitJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19lbmNvcmVfZW5sdHYyW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbMHg0Y10gPSBLRVlfUE9XRVIyLAorCVsweDRhXSA9IEtFWV9UVU5FUiwKKwlbMHg0MF0gPSBLRVlfMSwKKwlbMHg2MF0gPSBLRVlfMiwKKwlbMHg1MF0gPSBLRVlfMywKKwlbMHg3MF0gPSBLRVlfNCwKKwlbMHg0OF0gPSBLRVlfNSwKKwlbMHg2OF0gPSBLRVlfNiwKKwlbMHg1OF0gPSBLRVlfNywKKwlbMHg3OF0gPSBLRVlfOCwKKwlbMHg0NF0gPSBLRVlfOSwKKwlbMHg1NF0gPSBLRVlfMCwKKworCVsweDY0XSA9IEtFWV9MQVNULAkJLyogKzEwMCAqLworCVsweDRlXSA9IEtFWV9BR0FJTiwJCS8qIFJlY2FsbCAqLworCisJWzB4NmNdID0gS0VZX1NXSVRDSFZJREVPTU9ERSwJLyogVmlkZW8gU291cmNlICovCisJWzB4NWVdID0gS0VZX01FTlUsCisJWzB4NTZdID0gS0VZX1NDUkVFTiwKKwlbMHg3YV0gPSBLRVlfU0VUVVAsCisKKwlbMHg0Nl0gPSBLRVlfTVVURSwKKwlbMHg1Y10gPSBLRVlfTU9ERSwJCS8qIFN0ZXJlbyAqLworCVsweDc0XSA9IEtFWV9JTkZPLAorCVsweDdjXSA9IEtFWV9DTEVBUiwKKworCVsweDU1XSA9IEtFWV9VUCwKKwlbMHg0OV0gPSBLRVlfRE9XTiwKKwlbMHg3ZV0gPSBLRVlfTEVGVCwKKwlbMHg1OV0gPSBLRVlfUklHSFQsCisJWzB4NmFdID0gS0VZX0VOVEVSLAorCisJWzB4NDJdID0gS0VZX1ZPTFVNRVVQLAorCVsweDYyXSA9IEtFWV9WT0xVTUVET1dOLAorCVsweDUyXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4NzJdID0gS0VZX0NIQU5ORUxET1dOLAorCisJWzB4NDFdID0gS0VZX1JFQ09SRCwKKwlbMHg1MV0gPSBLRVlfU0hVRkZMRSwJLyogU25hcHNob3QgKi8KKwlbMHg3NV0gPSBLRVlfVElNRSwJLyogVGltZXNoaWZ0ICovCisJWzB4NzFdID0gS0VZX1RWMiwJLyogUElQICovCisKKwlbMHg0NV0gPSBLRVlfUkVXSU5ELAorCVsweDZmXSA9IEtFWV9QQVVTRSwKKwlbMHg3ZF0gPSBLRVlfRk9SV0FSRCwKKwlbMHg3OV0gPSBLRVlfU1RPUCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19lbmNvcmVfZW5sdHYyKTsKKwogLyogZm9yIHRoZSBUZWNobm90cmVuZCAxNTAwIGJ1bmRsZWQgcmVtb3RlcyAoZ3JleSBhbmQgYmxhY2spOiAqLwogSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfdHRfMTUwMFtJUl9LRVlUQUJfU0laRV0gPSB7CiAJWyAweDAxIF0gPSBLRVlfUE9XRVIsCkBAIC0yMjM5LDMgKzI0MjgsODYgQEAKIAlbMHgyYV0gPSBLRVlfTUVOVSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19hdmVybWVkaWFfYTE2ZCk7CisKKy8qIEVuY29yZSBFTkxUVi1GTSB2NS4zCisgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqLworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW5jb3JlX2VubHR2X2ZtNTNbSVJfS0VZVEFCX1NJWkVdID0geworCVsweDEwXSA9IEtFWV9QT1dFUjIsCisJWzB4MDZdID0gS0VZX01VVEUsCisKKwlbMHgwOV0gPSBLRVlfMSwKKwlbMHgxZF0gPSBLRVlfMiwKKwlbMHgxZl0gPSBLRVlfMywKKwlbMHgxOV0gPSBLRVlfNCwKKwlbMHgxYl0gPSBLRVlfNSwKKwlbMHgxMV0gPSBLRVlfNiwKKwlbMHgxN10gPSBLRVlfNywKKwlbMHgxMl0gPSBLRVlfOCwKKwlbMHgxNl0gPSBLRVlfOSwKKwlbMHg0OF0gPSBLRVlfMCwKKworCVsweDA0XSA9IEtFWV9MSVNULAkJLyogLS8tLSAqLworCVsweDQwXSA9IEtFWV9MQVNULAkJLyogcmVjYWxsICovCisKKwlbMHgwMl0gPSBLRVlfTU9ERSwJCS8qIFRWL0FWICovCisJWzB4MDVdID0gS0VZX1NIVUZGTEUsCQkvKiBTTkFQU0hPVCAqLworCisJWzB4NGNdID0gS0VZX0NIQU5ORUxVUCwJCS8qIFVQICovCisJWzB4MDBdID0gS0VZX0NIQU5ORUxET1dOLAkvKiBET1dOICovCisJWzB4MGRdID0gS0VZX1ZPTFVNRVVQLAkJLyogUklHSFQgKi8KKwlbMHgxNV0gPSBLRVlfVk9MVU1FRE9XTiwJLyogTEVGVCAqLworCVsweDQ5XSA9IEtFWV9FTlRFUiwJCS8qIE9LICovCisKKwlbMHg1NF0gPSBLRVlfUkVDT1JELAorCVsweDRkXSA9IEtFWV9QTEFZLAkJLyogcGF1c2UgKi8KKworCVsweDFlXSA9IEtFWV9VUCwJCS8qIHZpZGVvIHNldHRpbmcgKi8KKwlbMHgwZV0gPSBLRVlfUklHSFQsCQkvKiA8LSAqLworCVsweDFhXSA9IEtFWV9MRUZULAkJLyogLT4gKi8KKworCVsweDBhXSA9IEtFWV9ET1dOLAkJLyogdmlkZW8gZGVmYXVsdCAqLworCVsweDBjXSA9IEtFWV9aT09NLAkJLyogaGlkZSBwYW5uZWwgKi8KKwlbMHg0N10gPSBLRVlfU0xFRVAsCQkvKiBzaHV0ZG93biAqLworfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2VuY29yZV9lbmx0dl9mbTUzKTsKKworLyogWm9naXMgUmVhbCBBdWRpbyAyMjAgLSAzMiBrZXlzIElSICovCitJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19yZWFsX2F1ZGlvXzIyMF8zMl9rZXlzW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwlbMHgxY10gPSBLRVlfUkFESU8sCisJWzB4MTJdID0gS0VZX1BPV0VSMiwKKworCVsweDAxXSA9IEtFWV8xLAorCVsweDAyXSA9IEtFWV8yLAorCVsweDAzXSA9IEtFWV8zLAorCVsweDA0XSA9IEtFWV80LAorCVsweDA1XSA9IEtFWV81LAorCVsweDA2XSA9IEtFWV82LAorCVsweDA3XSA9IEtFWV83LAorCVsweDA4XSA9IEtFWV84LAorCVsweDA5XSA9IEtFWV85LAorCVsweDAwXSA9IEtFWV8wLAorCisJWzB4MGNdID0gS0VZX1ZPTFVNRVVQLAorCVsweDE4XSA9IEtFWV9WT0xVTUVET1dOLAorCVsweDBiXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MTVdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDE2XSA9IEtFWV9FTlRFUiwKKworCVsweDExXSA9IEtFWV9MSVNULAkJLyogU291cmNlICovCisJWzB4MGRdID0gS0VZX0FVRElPLAkJLyogc3RlcmVvICovCisKKwlbMHgwZl0gPSBLRVlfUFJFVklPVVMsCQkvKiBQcmV2ICovCisJWzB4MWJdID0gS0VZX1BBVVNFLAkJLyogVGltZXNoaWZ0ICovCisJWzB4MWFdID0gS0VZX05FWFQsCQkvKiBOZXh0ICovCisKKwlbMHgwZV0gPSBLRVlfU1RPUCwKKwlbMHgxZl0gPSBLRVlfUExBWSwKKwlbMHgxZV0gPSBLRVlfUExBWVBBVVNFLAkJLyogUGF1c2UgKi8KKworCVsweDFkXSA9IEtFWV9SRUNPUkQsCisJWzB4MTNdID0gS0VZX01VVEUsCisJWzB4MTldID0gS0VZX1NIVUZGTEUsCQkvKiBTbmFwc2hvdCAqLworCit9OworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcmVhbF9hdWRpb18yMjBfMzJfa2V5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCmluZGV4IGQwMTk2NWUuLmQ1OTlkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCkBAIC0yMzQsNyArMjM0LDcgQEAKIGludCBzYWE3MTQ2X3BndGFibGVfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHNhYTcxNDZfcGd0YWJsZSAqcHQpCiB7CiAJX19sZTMyICAgICAgICpjcHU7Ci0JZG1hX2FkZHJfdCAgIGRtYV9hZGRyOworCWRtYV9hZGRyX3QgICBkbWFfYWRkciA9IDA7CiAKIAljcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFBBR0VfU0laRSwgJmRtYV9hZGRyKTsKIAlpZiAoTlVMTCA9PSBjcHUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKaW5kZXggY2Y2YTgxNy4uNWIzNGMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogCW1lbWNweSh2ZmQsICZkZXZpY2VfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSk7CiAJc3RybGNweSh2ZmQtPm5hbWUsIG5hbWUsIHNpemVvZih2ZmQtPm5hbWUpKTsKIAl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQl2ZmQtPnByaXYgPSBkZXY7CisJdmlkZW9fc2V0X2RydmRhdGEodmZkLCBkZXYpOwogCiAJLy8gZml4bWU6IC0xIHNob3VsZCBiZSBhbiBpbnNtb2QgcGFyYW1ldGVyICpmb3IgdGhlIGV4dGVuc2lvbiogKGxpa2UgInZpZGVvX25yIik7CiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIHR5cGUsIC0xKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tdDIwNjAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tdDIwNjAuYwppbmRleCAxMzA1YjBlNi4uMTIyMDZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL210MjA2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tdDIwNjAuYwpAQCAtMTcwLDYgKzE3MCw5IEBACiAJYlswXSA9IFJFR19MTzFCMTsKIAliWzFdID0gMHhGRjsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7IC8qIG9wZW4gaTJjX2dhdGUgKi8KKwogCW10MjA2MF93cml0ZXJlZ3MocHJpdixiLDIpOwogCiAJZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMDsgLy8gSHogLT4ga0h6CkBAIC0yMzMsNiArMjM2LDkgQEAKIAkJaSsrOwogCX0gd2hpbGUgKGk8MTApOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsgLyogY2xvc2UgaTJjX2dhdGUgKi8KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI5NiwxMyArMzAyLDM1IEBACiBzdGF0aWMgaW50IG10MjA2MF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBtdDIwNjBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OwotCXJldHVybiBtdDIwNjBfd3JpdGVyZWcocHJpdiwgUkVHX1ZHQUcsIChwcml2LT5jZmctPmNsb2NrX291dCA8PCA2KSB8IDB4MzMpOworCWludCByZXQ7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOyAvKiBvcGVuIGkyY19nYXRlICovCisKKwlyZXQgPSBtdDIwNjBfd3JpdGVyZWcocHJpdiwgUkVHX1ZHQUcsCisJCQkgICAgICAocHJpdi0+Y2ZnLT5jbG9ja19vdXQgPDwgNikgfCAweDMzKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7IC8qIGNsb3NlIGkyY19nYXRlICovCisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10MjA2MF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgbXQyMDYwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKLQlyZXR1cm4gbXQyMDYwX3dyaXRlcmVnKHByaXYsIFJFR19WR0FHLCAocHJpdi0+Y2ZnLT5jbG9ja19vdXQgPDwgNikgfCAweDMwKTsKKwlpbnQgcmV0OworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsgLyogb3BlbiBpMmNfZ2F0ZSAqLworCisJcmV0ID0gbXQyMDYwX3dyaXRlcmVnKHByaXYsIFJFR19WR0FHLAorCQkJICAgICAgKHByaXYtPmNmZy0+Y2xvY2tfb3V0IDw8IDYpIHwgMHgzMCk7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOyAvKiBjbG9zZSBpMmNfZ2F0ZSAqLworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtdDIwNjBfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKQEAgLTM0NCw2ICszNzIsOSBAQAogCXByaXYtPmkyYyAgICAgID0gaTJjOwogCXByaXYtPmlmMV9mcmVxID0gaWYxOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsgLyogb3BlbiBpMmNfZ2F0ZSAqLworCiAJaWYgKG10MjA2MF9yZWFkcmVnKHByaXYsUkVHX1BBUlRfUkVWLCZpZCkgIT0gMCkgewogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0zNjAsNiArMzkxLDkgQEAKIAogCW10MjA2MF9jYWxpYnJhdGUocHJpdik7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOyAvKiBjbG9zZSBpMmNfZ2F0ZSAqLworCiAJcmV0dXJuIGZlOwogfQogRVhQT1JUX1NZTUJPTChtdDIwNjBfYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA3dC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKaW5kZXggY2IyNWU0My4uNjQzNzlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKQEAgLTk3OSw3ICs5NzksNiBAQAogCXN3aXRjaCAoaW5zdGFuY2UpIHsKIAljYXNlIDA6CiAJCWdvdG8gZmFpbDsKLQkJYnJlYWs7CiAJY2FzZSAxOgogCQkvKiBuZXcgdHVuZXIgaW5zdGFuY2UgKi8KIAkJc3RhdGUtPmNvbmZpZyA9IGNmZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKaW5kZXggOTMwNjNjNi4uMWI0OGI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWZlLmMKQEAgLTExNTUsNyArMTE1NSw2IEBACiAJc3dpdGNoIChpbnN0YW5jZSkgewogCWNhc2UgMDoKIAkJZ290byBmYWlsOwotCQlicmVhazsKIAljYXNlIDE6CiAJCS8qIG5ldyB0dW5lciBpbnN0YW5jZSAqLwogCQlwcml2LT5nYXRlID0gKGNmZykgPyBjZmctPmdhdGUgOiBUREExODI3MV9HQVRFX0FVVE87CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyN3guYwppbmRleCA4NTU1ZDljLi40YTc0ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmMKQEAgLTQ0NywxNyArNDQ3LDE5IEBACiAJCQllbHNlCiAJCQkJYXJnID0gMDsKIAkJfQotCQlpZiAocHJpdi0+Y2ZnLT50dW5lcl9jYWxsYmFjaykKLQkJCXByaXYtPmNmZy0+dHVuZXJfY2FsbGJhY2socHJpdi0+aTJjX2FkYXAtPmFsZ29fZGF0YSwKLQkJCQkJCQkJZ3BfZnVuYywgYXJnKTsKKwkJaWYgKGZlLT5jYWxsYmFjaykKKwkJCWZlLT5jYWxsYmFjayhwcml2LT5pMmNfYWRhcC0+YWxnb19kYXRhLAorCQkJCSAgICAgRFZCX0ZST05URU5EX0NPTVBPTkVOVF9UVU5FUiwKKwkJCQkgICAgIGdwX2Z1bmMsIGFyZyk7CiAJCWJ1ZlsxXSA9IGhpZ2ggPyAwIDogMTsKIAkJaWYgKHByaXYtPmNmZy0+Y29uZmlnID09IDIpCiAJCQlidWZbMV0gPSBoaWdoID8gMSA6IDA7CiAJCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJCWJyZWFrOwogCWNhc2UgMzogLyogc3dpdGNoIHdpdGggR1BJTyBvZiBzYWE3MTN4ICovCi0JCWlmIChwcml2LT5jZmctPnR1bmVyX2NhbGxiYWNrKQotCQkJcHJpdi0+Y2ZnLT50dW5lcl9jYWxsYmFjayhwcml2LT5pMmNfYWRhcC0+YWxnb19kYXRhLCAwLCBoaWdoKTsKKwkJaWYgKGZlLT5jYWxsYmFjaykKKwkJCWZlLT5jYWxsYmFjayhwcml2LT5pMmNfYWRhcC0+YWxnb19kYXRhLAorCQkJCSAgICAgRFZCX0ZST05URU5EX0NPTVBPTkVOVF9UVU5FUiwgMCwgaGlnaCk7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5oCmluZGV4IDc4NTBhOWEuLjdkNzJjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyN3guaApAQCAtMzYsNyArMzYsNiBAQAogCS8qIGludGVyZmFjZSB0byB0ZGE4Mjl4IGRyaXZlciAqLwogCXVuc2lnbmVkIGludCBjb25maWc7CiAJaW50IAkgICAgIHN3aXRjaF9hZGRyOwotCWludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiAKIAl2b2lkICgqYWdjZikoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCmluZGV4IDkxMjA0ZDMuLmMxMTJiZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYwpAQCAtNjcyLDEwICs2NzIsOCBAQAogCXByaXYtPmkyY19wcm9wcy5hZGRyICAgICA9IGkyY19hZGRyOwogCXByaXYtPmkyY19wcm9wcy5hZGFwICAgICA9IGkyY19hZGFwOwogCXByaXYtPmkyY19wcm9wcy5uYW1lICAgICA9ICJ0ZGE4Mjl4IjsKLQlpZiAoY2ZnKSB7CisJaWYgKGNmZykKIAkJcHJpdi0+Y2ZnLmNvbmZpZyAgICAgICAgID0gY2ZnLT5sbmFfY2ZnOwotCQlwcml2LT5jZmcudHVuZXJfY2FsbGJhY2sgPSBjZmctPnR1bmVyX2NhbGxiYWNrOwotCX0KIAogCWlmICh0ZGE4MjkwX3Byb2JlKCZwcml2LT5pMmNfcHJvcHMpID09IDApIHsKIAkJcHJpdi0+dmVyID0gVERBODI5MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5oCmluZGV4IGFhMDc0ZjMuLjdlMjg4YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuaApAQCAtMjIsNyArMjIsNiBAQAogCiBzdHJ1Y3QgdGRhODI5eF9jb25maWcgewogCXVuc2lnbmVkIGludCBsbmFfY2ZnOwotCWludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiAKIAl1bnNpZ25lZCBpbnQgcHJvYmVfdHVuZXI6MTsKICNkZWZpbmUgVERBODI5WF9QUk9CRV9UVU5FUiAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhOTg4Ny5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTk4ODcuYwppbmRleCA3MmFiZjBiLi5mZjE3ODhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhOTg4Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE5ODg3LmMKQEAgLTY4Niw3ICs2ODYsNiBAQAogCWNhc2UgMDoKIAkJbXV0ZXhfdW5sb2NrKCZ0ZGE5ODg3X2xpc3RfbXV0ZXgpOwogCQlyZXR1cm4gTlVMTDsKLQkJYnJlYWs7CiAJY2FzZSAxOgogCQlmZS0+YW5hbG9nX2RlbW9kX3ByaXYgPSBwcml2OwogCQlwcml2LT5tb2RlID0gVF9TVEFOREJZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXNpbXBsZS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXNpbXBsZS5jCmluZGV4IGFhNzczYTYuLjJhMWFhYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci1zaW1wbGUuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItc2ltcGxlLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMzZfTUszOgogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyNTZfSUgzOgogCWNhc2UgVFVORVJfTEdfTlRTQ19UQVBFOgorCWNhc2UgVFVORVJfVENMX01GMDJHSVBfNU46CiAJCXJldHVybiAoKHN0YXR1cyAmIFRVTkVSX1NJR05BTCkgPT0gVFVORVJfU1RFUkVPX01LMyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIHN0YXR1cyAmIFRVTkVSX1NURVJFTzsKQEAgLTQ5NCw2ICs0OTUsNyBAQAogCWNhc2UgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszOgogCWNhc2UgVFVORVJfTEdfTlRTQ19UQVBFOgogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyNTZfSUgzOgorCWNhc2UgVFVORVJfVENMX01GMDJHSVBfNU46CiAJCWJ1ZmZlclszXSA9IDB4MTk7CiAJCWJyZWFrOwogCWNhc2UgVFVORVJfVE5GXzUzMzVNRjoKQEAgLTEwMzgsNyArMTA0MCw2IEBACiAJY2FzZSAwOgogCQltdXRleF91bmxvY2soJnR1bmVyX3NpbXBsZV9saXN0X211dGV4KTsKIAkJcmV0dXJuIE5VTEw7Ci0JCWJyZWFrOwogCWNhc2UgMToKIAkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCmluZGV4IDEwZGRkY2EuLjA0OTYxYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCkBAIC0xMjE2LDYgKzEyMTYsMjMgQEAKIAl9LAogfTsKIAorLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RDTF9NRjAyR0lQLTVOLUUgLSBUQ0wgTUYwMkdJUC01TiAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl90Y2xfbWYwMmdpcF81bl9udHNjX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNzIuMDAgLypNSHoqLywgMHg4ZSwgMHgwMSwgfSwKKwl7IDE2ICogNDQ4LjAwIC8qTUh6Ki8sIDB4OGUsIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweDhlLCAweDA0LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfdGNsX21mMDJnaXBfNW5fcGFyYW1zW10gPSB7CisJeworCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAorCQkucmFuZ2VzID0gdHVuZXJfdGNsX21mMDJnaXBfNW5fbnRzY19yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RjbF9tZjAyZ2lwXzVuX250c2NfcmFuZ2VzKSwKKwkJLmNiX2ZpcnN0X2lmX2xvd2VyX2ZyZXEgPSAxLAorCX0sCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IHR1bmVydHlwZSB0dW5lcnNbXSA9IHsKQEAgLTE2NDEsNiArMTY1OCwxMSBAQAogCQkubmFtZSAgID0gIlhjZWl2ZSA1MDAwIHR1bmVyIiwKIAkJLyogc2VlIHhjNTAwMC5jIGZvciBkZXRhaWxzICovCiAJfSwKKwlbVFVORVJfVENMX01GMDJHSVBfNU5dID0geyAvKiBUQ0wgdHVuZXIgTUYwMkdJUC01Ti1FICovCisJCS5uYW1lICAgPSAiVENMIHR1bmVyIE1GMDJHSVAtNU4tRSIsCisJCS5wYXJhbXMgPSB0dW5lcl90Y2xfbWYwMmdpcF81bl9wYXJhbXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3RjbF9tZjAyZ2lwXzVuX3BhcmFtcyksCisJfSwKIH07CiBFWFBPUlRfU1lNQk9MKHR1bmVycyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYwppbmRleCA0ZGQxZDI0Li5iNjVlNjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5jCkBAIC03MSw5ICs3MSw2IEBACiBzdHJ1Y3QgeGMyMDI4X2RhdGEgewogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0OwogCXN0cnVjdCB0dW5lcl9pMmNfcHJvcHMgIGkyY19wcm9wczsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LAotCQkJCQkJICAgaW50IGNvbW1hbmQsIGludCBhcmcpOwotCXZvaWQJCQkqdmlkZW9fZGV2OwogCV9fdTMyCQkJZnJlcXVlbmN5OwogCiAJc3RydWN0IGZpcm13YXJlX2Rlc2NyaXB0aW9uICpmaXJtOwpAQCAtNDkyLDYgKzQ4OSwyMyBAQAogCXJldHVybiBpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBkb190dW5lcl9jYWxsYmFjayhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGNtZCwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgeGMyMDI4X2RhdGEgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKworCS8qIGFuYWxvZyBzaWRlICh0dW5lci1jb3JlKSB1c2VzIGkyY19hZGFwLT5hbGdvX2RhdGEuCisJICogZGlnaXRhbCBzaWRlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGhhdmUgYWxnb19kYXRhIGRlZmluZWQuCisJICoKKwkgKiBkaWdpdGFsIHNpZGUgd2lsbCBhbHdheXMgaGF2ZSBmZS0+ZHZiIGRlZmluZWQuCisJICogYW5hbG9nIHNpZGUgKHR1bmVyLWNvcmUpIGRvZXNuJ3QgKHlldCkgZGVmaW5lIGZlLT5kdmIuCisJICovCisKKwlyZXR1cm4gKCFmZS0+Y2FsbGJhY2spID8gLUVJTlZBTCA6CisJCWZlLT5jYWxsYmFjaygoKGZlLT5kdmIpICYmIChmZS0+ZHZiLT5wcml2KSkgPworCQkJCWZlLT5kdmItPnByaXYgOiBwcml2LT5pMmNfcHJvcHMuYWRhcC0+YWxnb19kYXRhLAorCQkJICAgICBEVkJfRlJPTlRFTkRfQ09NUE9ORU5UX1RVTkVSLCBjbWQsIGFyZyk7Cit9CisKIHN0YXRpYyBpbnQgbG9hZF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHR5cGUsCiAJCQkgdjRsMl9zdGRfaWQgKmlkKQogewpAQCAtNTMwLDggKzU0NCw3IEBACiAKIAkJaWYgKCFzaXplKSB7CiAJCQkvKiBTcGVjaWFsIGNhbGxiYWNrIGNvbW1hbmQgcmVjZWl2ZWQgKi8KLQkJCXJjID0gcHJpdi0+dHVuZXJfY2FsbGJhY2socHJpdi0+dmlkZW9fZGV2LAotCQkJCQkJICBYQzIwMjhfVFVORVJfUkVTRVQsIDApOworCQkJcmMgPSBkb190dW5lcl9jYWxsYmFjayhmZSwgWEMyMDI4X1RVTkVSX1JFU0VULCAwKTsKIAkJCWlmIChyYyA8IDApIHsKIAkJCQl0dW5lcl9lcnIoIkVycm9yIGF0IFJFU0VUIGNvZGUgJWRcbiIsCiAJCQkJCSAgICgqcCkgJiAweDdmKTsKQEAgLTU0Miw4ICs1NTUsNyBAQAogCQlpZiAoc2l6ZSA+PSAweGZmMDApIHsKIAkJCXN3aXRjaCAoc2l6ZSkgewogCQkJY2FzZSAweGZmMDA6Ci0JCQkJcmMgPSBwcml2LT50dW5lcl9jYWxsYmFjayhwcml2LT52aWRlb19kZXYsCi0JCQkJCQkJWEMyMDI4X1JFU0VUX0NMSywgMCk7CisJCQkJcmMgPSBkb190dW5lcl9jYWxsYmFjayhmZSwgWEMyMDI4X1JFU0VUX0NMSywgMCk7CiAJCQkJaWYgKHJjIDwgMCkgewogCQkJCQl0dW5lcl9lcnIoIkVycm9yIGF0IFJFU0VUIGNvZGUgJWRcbiIsCiAJCQkJCQkgICgqcCkgJiAweDdmKTsKQEAgLTcxNSw4ICs3MjcsNyBAQAogCW1lbXNldCgmcHJpdi0+Y3VyX2Z3LCAwLCBzaXplb2YocHJpdi0+Y3VyX2Z3KSk7CiAKIAkvKiBSZXNldCBpcyBuZWVkZWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUgKi8KLQlyYyA9IHByaXYtPnR1bmVyX2NhbGxiYWNrKHByaXYtPnZpZGVvX2RldiwKLQkJCQkgIFhDMjAyOF9UVU5FUl9SRVNFVCwgMCk7CisJcmMgPSBkb190dW5lcl9jYWxsYmFjayhmZSwgWEMyMDI4X1RVTkVSX1JFU0VULCAwKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGZhaWw7CiAKQEAgLTkzMyw3ICs5NDQsNyBAQAogCSAgIFRoZSByZXNldCBDTEsgaXMgbmVlZGVkIG9ubHkgd2l0aCB0bTYwMDAuCiAJICAgRHJpdmVyIHNob3VsZCB3b3JrIGZpbmUgZXZlbiBpZiB0aGlzIGZhaWxzLgogCSAqLwotCXByaXYtPnR1bmVyX2NhbGxiYWNrKHByaXYtPnZpZGVvX2RldiwgWEMyMDI4X1JFU0VUX0NMSywgMSk7CisJZG9fdHVuZXJfY2FsbGJhY2soZmUsIFhDMjAyOF9SRVNFVF9DTEssIDEpOwogCiAJbXNsZWVwKDEwKTsKIApAQCAtMTAwMiwxMSArMTAxMyw2IEBACiAKIAl0dW5lcl9kYmcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCi0JaWYgKHByaXYtPmN0cmwuZDI2MzMpCi0JCXR5cGUgfD0gRDI2MzM7Ci0JZWxzZQotCQl0eXBlIHw9IEQyNjIwOwotCiAJc3dpdGNoKGZlLT5vcHMuaW5mby50eXBlKSB7CiAJY2FzZSBGRV9PRkRNOgogCQlidyA9IHAtPnUub2ZkbS5iYW5kd2lkdGg7CkBAIC0xMDIxLDEwICsxMDI3LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBGRV9BVFNDOgogCQlidyA9IEJBTkRXSURUSF82X01IWjsKLQkJLyogVGhlIG9ubHkgQVRTQyBmaXJtd2FyZSAoYXQgbGVhc3Qgb24gdjIuNykgaXMgRDI2MzMsCi0JCSAgIHNvIG92ZXJyaWRlcyBjdHJsLT5kMjYzMyAqLwotCQl0eXBlIHw9IEFUU0N8IEQyNjMzOwotCQl0eXBlICY9IH5EMjYyMDsKKwkJLyogVGhlIG9ubHkgQVRTQyBmaXJtd2FyZSAoYXQgbGVhc3Qgb24gdjIuNykgaXMgRDI2MzMgKi8KKwkJdHlwZSB8PSBBVFNDIHwgRDI2MzM7CiAJCWJyZWFrOwogCS8qIERWQi1TIGlzIG5vdCBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgpAQCAtMTA1Nyw2ICsxMDYxLDI4IEBACiAJCXR1bmVyX2VycigiZXJyb3I6IGJhbmR3aWR0aCBub3Qgc3VwcG9ydGVkLlxuIik7CiAJfTsKIAorCS8qCisJICBTZWxlY3RzIGJldHdlZW4gRDI2MzMgb3IgRDI2MjAgZmlybXdhcmUuCisJICBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIEFUU0MsIHNpbmNlIGl0IHNob3VsZCBiZSBEMjYzMyBvbiBhbGwgY2FzZXMKKwkgKi8KKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgIT0gRkVfQVRTQykgeworCQlzd2l0Y2ggKHByaXYtPmN0cmwudHlwZSkgeworCQljYXNlIFhDMjAyOF9EMjYzMzoKKwkJCXR5cGUgfD0gRDI2MzM7CisJCQlicmVhazsKKwkJY2FzZSBYQzIwMjhfRDI2MjA6CisJCQl0eXBlIHw9IEQyNjIwOworCQkJYnJlYWs7CisJCWNhc2UgWEMyMDI4X0FVVE86CisJCWRlZmF1bHQ6CisJCQkvKiBaYXJsaW5rIHNlZW1zIHRvIG5lZWQgRDI2MzMgKi8KKwkJCWlmIChwcml2LT5jdHJsLmRlbW9kID09IFhDMzAyOF9GRV9aQVJMSU5LNDU2KQorCQkJCXR5cGUgfD0gRDI2MzM7CisJCQllbHNlCisJCQkJdHlwZSB8PSBEMjYyMDsKKwkJfQorCX0KKwogCS8qIEFsbCBTLWNvZGUgdGFibGVzIG5lZWQgYSAyMDBrSHogc2hpZnQgKi8KIAlpZiAocHJpdi0+Y3RybC5kZW1vZCkKIAkJZGVtb2QgPSBwcml2LT5jdHJsLmRlbW9kICsgMjAwOwpAQCAtMTE3NywyMCArMTIwMywxMCBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJCS8qIG5ldyB0dW5lciBpbnN0YW5jZSAqLwotCQlwcml2LT50dW5lcl9jYWxsYmFjayA9IGNmZy0+Y2FsbGJhY2s7CiAJCXByaXYtPmN0cmwubWF4X2xlbiA9IDEzOwogCiAJCW11dGV4X2luaXQoJnByaXYtPmxvY2spOwogCi0JCS8qIGFuYWxvZyBzaWRlICh0dW5lci1jb3JlKSB1c2VzIGkyY19hZGFwLT5hbGdvX2RhdGEuCi0JCSAqIGRpZ2l0YWwgc2lkZSBpcyBub3QgZ3VhcmFudGVlZCB0byBoYXZlIGFsZ29fZGF0YSBkZWZpbmVkLgotCQkgKgotCQkgKiBkaWdpdGFsIHNpZGUgd2lsbCBhbHdheXMgaGF2ZSBmZS0+ZHZiIGRlZmluZWQuCi0JCSAqIGFuYWxvZyBzaWRlICh0dW5lci1jb3JlKSBkb2Vzbid0ICh5ZXQpIGRlZmluZSBmZS0+ZHZiLgotCQkgKi8KLQkJcHJpdi0+dmlkZW9fZGV2ID0gKChmZS0+ZHZiKSAmJiAoZmUtPmR2Yi0+cHJpdikpID8KLQkJCQkgICBmZS0+ZHZiLT5wcml2IDogY2ZnLT5pMmNfYWRhcC0+YWxnb19kYXRhOwotCiAJCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKIAkJYnJlYWs7CiAJY2FzZSAyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5oCmluZGV4IDIxNjAyNWMuLjE5ZGU3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguaAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKIAogI2RlZmluZSBYQzIwMjhfREVGQVVMVF9GSVJNV0FSRSAieGMzMDI4LXYyNy5mdyIKKyNkZWZpbmUgWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFICJ4YzMwMjhMLXYzNi5mdyIKIAogLyogICAgICBEbW9kdWxlcgkJSUYgKGtIeikgKi8KICNkZWZpbmUJWEMzMDI4X0ZFX0RFRkFVTFQJMAkJLyogRG9uJ3QgbG9hZCBTQ09ERSAqLwpAQCAtMjMsMjQgKzI0LDI4IEBACiAjZGVmaW5lCVhDMzAyOF9GRV9aQVJMSU5LNDU2CTQ1NjAKICNkZWZpbmUJWEMzMDI4X0ZFX0NISU5BCQk1MjAwCiAKK2VudW0gZmlybXdhcmVfdHlwZSB7CisJWEMyMDI4X0FVVE8gPSAwLCAgICAgICAgLyogQnkgZGVmYXVsdCwgYXV0by1kZXRlY3RzICovCisJWEMyMDI4X0QyNjMzLAorCVhDMjAyOF9EMjYyMCwKK307CisKIHN0cnVjdCB4YzIwMjhfY3RybCB7CiAJY2hhcgkJCSpmbmFtZTsKIAlpbnQJCQltYXhfbGVuOwogCXVuc2lnbmVkIGludAkJc2NvZGVfdGFibGU7CiAJdW5zaWduZWQgaW50CQltdHMgICA6MTsKLQl1bnNpZ25lZCBpbnQJCWQyNjMzIDoxOwogCXVuc2lnbmVkIGludAkJaW5wdXQxOjE7CiAJdW5zaWduZWQgaW50CQl2aGZidzc6MTsKIAl1bnNpZ25lZCBpbnQJCXVoZmJ3ODoxOwogCXVuc2lnbmVkIGludAkJZGVtb2Q7CisJZW51bSBmaXJtd2FyZV90eXBlCXR5cGU6MjsKIH07CiAKIHN0cnVjdCB4YzIwMjhfY29uZmlnIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOwogCXU4IAkJICAgaTJjX2FkZHI7Ci0Jdm9pZCAgICAgICAgICAgICAgICp2aWRlb19kZXY7CiAJc3RydWN0IHhjMjAyOF9jdHJsICpjdHJsOwotCWludCAgICAgICAgICAgICAgICAoKmNhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiB9OwogCiAvKiB4YzIwMjggY29tbWFuZHMgZm9yIGNhbGxiYWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmMKaW5kZXggZGNkZGZhOC4uZjljMmJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogCiAjaW5jbHVkZSAieGM1MDAwLmgiCi0jaW5jbHVkZSAieGM1MDAwX3ByaXYuaCIKKyNpbmNsdWRlICJ0dW5lci1pMmMuaCIKIAogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTQwLDEyICs0MCwyNiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGluaXRfZncsIHhjNTAwMF9sb2FkX2Z3X29uX2F0dGFjaCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5pdF9mdywgIkxvYWQgZmlybXdhcmUgZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbi4iKTsKIAorc3RhdGljIERFRklORV9NVVRFWCh4YzUwMDBfbGlzdF9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0KTsKKwogI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKSBpZiAoZGVidWcgPj0gbGV2ZWwpIFwKIAlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsICJ4YzUwMDAiLCAjIyBhcmcpCiAKICNkZWZpbmUgWEM1MDAwX0RFRkFVTFRfRklSTVdBUkUgImR2Yi1mZS14YzUwMDAtMS4xLmZ3IgogI2RlZmluZSBYQzUwMDBfREVGQVVMVF9GSVJNV0FSRV9TSVpFIDEyMzMyCiAKK3N0cnVjdCB4YzUwMDBfcHJpdiB7CisJc3RydWN0IHR1bmVyX2kyY19wcm9wcyBpMmNfcHJvcHM7CisJc3RydWN0IGxpc3RfaGVhZCBoeWJyaWRfdHVuZXJfaW5zdGFuY2VfbGlzdDsKKworCXUzMiBpZl9raHo7CisJdTMyIGZyZXFfaHo7CisJdTMyIGJhbmR3aWR0aDsKKwl1OCAgdmlkZW9fc3RhbmRhcmQ7CisJdTggIHJmX21vZGU7Cit9OworCiAvKiBNaXNjIERlZmluZXMgKi8KICNkZWZpbmUgTUFYX1RWX1NUQU5EQVJECQkJMjMKICNkZWZpbmUgWENfTUFYX0kyQ19XUklURV9MRU5HVEgJCTY0CkBAIC0yMTYsOSArMjMwLDEyIEBACiAKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAocHJpdi0+Y2ZnLT50dW5lcl9jYWxsYmFjaykgewotCQlyZXQgPSBwcml2LT5jZmctPnR1bmVyX2NhbGxiYWNrKHByaXYtPmRldnB0ciwKLQkJCQkJCVhDNTAwMF9UVU5FUl9SRVNFVCwgMCk7CisJaWYgKGZlLT5jYWxsYmFjaykgeworCQlyZXQgPSBmZS0+Y2FsbGJhY2soKChmZS0+ZHZiKSAmJiAoZmUtPmR2Yi0+cHJpdikpID8KKwkJCQkJICAgZmUtPmR2Yi0+cHJpdiA6CisJCQkJCSAgIHByaXYtPmkyY19wcm9wcy5hZGFwLT5hbGdvX2RhdGEsCisJCQkJCSAgIERWQl9GUk9OVEVORF9DT01QT05FTlRfVFVORVIsCisJCQkJCSAgIFhDNTAwMF9UVU5FUl9SRVNFVCwgMCk7CiAJCWlmIChyZXQpCiAJCQlwcmludGsoS0VSTl9FUlIgInhjNTAwMDogcmVzZXQgZmFpbGVkXG4iKTsKIAl9IGVsc2UKQEAgLTUwOSwxMyArNTI2LDEzIEBACiAJdTggYnVmWzJdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiB9OwogCXU4IGJ2YWxbMl0gPSB7IDAsIDAgfTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7Ci0JCXsgLmFkZHIgPSBwcml2LT5jZmctPmkyY19hZGRyZXNzLAorCQl7IC5hZGRyID0gcHJpdi0+aTJjX3Byb3BzLmFkZHIsCiAJCQkuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZlswXSwgLmxlbiA9IDIgfSwKLQkJeyAuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHJlc3MsCisJCXsgLmFkZHIgPSBwcml2LT5pMmNfcHJvcHMuYWRkciwKIAkJCS5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ2YWxbMF0sIC5sZW4gPSAyIH0sCiAJfTsKIAotCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDIpICE9IDIpIHsKKwlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyY19wcm9wcy5hZGFwLCBtc2csIDIpICE9IDIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAieGM1MDAwOiBJMkMgcmVhZCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CkBAIC01MjYsMTAgKzU0MywxMCBAQAogCiBzdGF0aWMgaW50IHhjNTAwMF93cml0ZXJlZ3Moc3RydWN0IHhjNTAwMF9wcml2ICpwcml2LCB1OCAqYnVmLCB1OCBsZW4pCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHJlc3MsCisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAogCQkuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gbGVuIH07CiAKLQlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSkgIT0gMSkgeworCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjX3Byb3BzLmFkYXAsICZtc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4YzUwMDA6IEkyQyB3cml0ZSBmYWlsZWQgKGxlbj0laSlcbiIsCiAJCQkoaW50KWxlbik7CiAJCXJldHVybiAtRVJFTU9URUlPOwpAQCAtNTM5LDEwICs1NTYsMTAgQEAKIAogc3RhdGljIGludCB4YzUwMDBfcmVhZHJlZ3Moc3RydWN0IHhjNTAwMF9wcml2ICpwcml2LCB1OCAqYnVmLCB1OCBsZW4pCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHJlc3MsCisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAogCQkuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IGxlbiB9OwogCi0JaWYgKGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2csIDEpICE9IDEpIHsKKwlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyY19wcm9wcy5hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGM1MDAwIEkyQyByZWFkIGZhaWxlZCAobGVuPSVpKVxuIiwoaW50KWxlbik7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KQEAgLTU1OSw3ICs1NzYsNyBAQAogCXByaW50ayhLRVJOX0lORk8gInhjNTAwMDogd2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkICglcykuLi5cbiIsCiAJCVhDNTAwMF9ERUZBVUxUX0ZJUk1XQVJFKTsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBYQzUwMDBfREVGQVVMVF9GSVJNV0FSRSwgJnByaXYtPmkyYy0+ZGV2KTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgWEM1MDAwX0RFRkFVTFRfRklSTVdBUkUsICZwcml2LT5pMmNfcHJvcHMuYWRhcC0+ZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGM1MDAwOiBVcGxvYWQgZmFpbGVkLiAoZmlsZSBub3QgZm91bmQ/KVxuIik7CiAJCXJldCA9IFhDX1JFU1VMVF9SRVNFVF9GQUlMVVJFOwpAQCAtNjc1LDEwICs2OTIsMTAgQEAKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCi0JcmV0ID0geGNfc2V0X0lGX2ZyZXF1ZW5jeShwcml2LCBwcml2LT5jZmctPmlmX2toeik7CisJcmV0ID0geGNfc2V0X0lGX2ZyZXF1ZW5jeShwcml2LCBwcml2LT5pZl9raHopOwogCWlmIChyZXQgIT0gWENfUkVTVUxUX1NVQ0NFU1MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4YzUwMDA6IHhjX1NldF9JRl9mcmVxdWVuY3koJWQpIGZhaWxlZFxuIiwKLQkJCXByaXYtPmNmZy0+aWZfa2h6KTsKKwkJICAgICAgIHByaXYtPmlmX2toeik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtODk3LDkgKzkxNCwxOSBAQAogCiBzdGF0aWMgaW50IHhjNTAwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogeworCXN0cnVjdCB4YzUwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKworCW11dGV4X2xvY2soJnhjNTAwMF9saXN0X211dGV4KTsKKworCWlmIChwcml2KQorCQloeWJyaWRfdHVuZXJfcmVsZWFzZV9zdGF0ZShwcml2KTsKKworCW11dGV4X3VubG9jaygmeGM1MDAwX2xpc3RfbXV0ZXgpOworCiAJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyNCwyOSArOTUxLDQzIEBACiAKIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnhjNTAwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCi0JCQkJICAgc3RydWN0IHhjNTAwMF9jb25maWcgKmNmZywgdm9pZCAqZGV2cHRyKQorCQkJCSAgIHN0cnVjdCB4YzUwMDBfY29uZmlnICpjZmcpCiB7CiAJc3RydWN0IHhjNTAwMF9wcml2ICpwcml2ID0gTlVMTDsKKwlpbnQgaW5zdGFuY2U7CiAJdTE2IGlkID0gMDsKIAotCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKDEsICIlcyglZC0lMDR4KVxuIiwgX19mdW5jX18sCisJCWkyYyA/IGkyY19hZGFwdGVyX2lkKGkyYykgOiAtMSwKKwkJY2ZnID8gY2ZnLT5pMmNfYWRkcmVzcyA6IC0xKTsKIAotCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeGM1MDAwX3ByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJpdiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwltdXRleF9sb2NrKCZ4YzUwMDBfbGlzdF9tdXRleCk7CiAKLQlwcml2LT5jZmcgPSBjZmc7Ci0JcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOwotCXByaXYtPmkyYyA9IGkyYzsKLQlwcml2LT5kZXZwdHIgPSBkZXZwdHI7CisJaW5zdGFuY2UgPSBoeWJyaWRfdHVuZXJfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgeGM1MDAwX3ByaXYsIHByaXYsCisJCQkJCSAgICAgIGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0LAorCQkJCQkgICAgICBpMmMsIGNmZy0+aTJjX2FkZHJlc3MsICJ4YzUwMDAiKTsKKwlzd2l0Y2ggKGluc3RhbmNlKSB7CisJY2FzZSAwOgorCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogbmV3IHR1bmVyIGluc3RhbmNlICovCisJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKKwkJcHJpdi0+aWZfa2h6ID0gY2ZnLT5pZl9raHo7CisKKwkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBleGlzdGluZyB0dW5lciBpbnN0YW5jZSAqLworCQlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CisJCWJyZWFrOworCX0KIAogCS8qIENoZWNrIGlmIGZpcm13YXJlIGhhcyBiZWVuIGxvYWRlZC4gSXQgaXMgcG9zc2libGUgdGhhdCBhbm90aGVyCiAJICAgaW5zdGFuY2Ugb2YgdGhlIGRyaXZlciBoYXMgbG9hZGVkIHRoZSBmaXJtd2FyZS4KIAkgKi8KLQlpZiAoeGM1MDAwX3JlYWRyZWcocHJpdiwgWFJFR19QUk9EVUNUX0lELCAmaWQpICE9IDApIHsKLQkJa2ZyZWUocHJpdik7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlpZiAoeGM1MDAwX3JlYWRyZWcocHJpdiwgWFJFR19QUk9EVUNUX0lELCAmaWQpICE9IDApCisJCWdvdG8gZmFpbDsKIAogCXN3aXRjaChpZCkgewogCWNhc2UgWENfUFJPRFVDVF9JRF9GV19MT0FERUQ6CkBAIC05NjcsMTkgKzEwMDgsMjMgQEAKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkieGM1MDAwOiBEZXZpY2Ugbm90IGZvdW5kIGF0IGFkZHIgMHglMDJ4ICgweCV4KVxuIiwKIAkJCWNmZy0+aTJjX2FkZHJlc3MsIGlkKTsKLQkJa2ZyZWUocHJpdik7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGZhaWw7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZ4YzUwMDBfbGlzdF9tdXRleCk7CisKIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmeGM1MDAwX3R1bmVyX29wcywKIAkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CiAKLQlmZS0+dHVuZXJfcHJpdiA9IHByaXY7Ci0KIAlpZiAoeGM1MDAwX2xvYWRfZndfb25fYXR0YWNoKQogCQl4YzUwMDBfaW5pdChmZSk7CiAKIAlyZXR1cm4gZmU7CitmYWlsOgorCW11dGV4X3VubG9jaygmeGM1MDAwX2xpc3RfbXV0ZXgpOworCisJeGM1MDAwX3JlbGVhc2UoZmUpOworCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTCh4YzUwMDBfYXR0YWNoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNTAwMC5oCmluZGV4IDUzODlmNzQuLmNmMWE1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwLmgKQEAgLTMwLDggKzMwLDYgQEAKIHN0cnVjdCB4YzUwMDBfY29uZmlnIHsKIAl1OCAgIGkyY19hZGRyZXNzOwogCXUzMiAgaWZfa2h6OwotCi0JaW50ICAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqcHJpdiwgaW50IGNvbW1hbmQsIGludCBhcmcpOwogfTsKIAogLyogeGM1MDAwIGNhbGxiYWNrIGNvbW1hbmQgKi8KQEAgLTQ5LDEzICs0NywxMSBAQAogICAgIChkZWZpbmVkKENPTkZJR19NRURJQV9UVU5FUl9YQzUwMDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogeGM1MDAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKLQkJCQkJICBzdHJ1Y3QgeGM1MDAwX2NvbmZpZyAqY2ZnLAotCQkJCQkgIHZvaWQgKmRldnB0cik7CisJCQkJCSAgc3RydWN0IHhjNTAwMF9jb25maWcgKmNmZyk7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB4YzUwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAogCQkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAotCQkJCQkJIHN0cnVjdCB4YzUwMDBfY29uZmlnICpjZmcsCi0JCQkJCQkgdm9pZCAqZGV2cHRyKQorCQkJCQkJIHN0cnVjdCB4YzUwMDBfY29uZmlnICpjZmcpCiB7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM1MDAwX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDBfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmEwMDc0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzUwMDBfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIFhjZWl2ZSBYQzUwMDAgIlFBTS84VlNCIHNpbmdsZSBjaGlwIHR1bmVyIgotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgWEM1MDAwX1BSSVZfSAotI2RlZmluZSBYQzUwMDBfUFJJVl9ICi0KLXN0cnVjdCB4YzUwMDBfcHJpdiB7Ci0Jc3RydWN0IHhjNTAwMF9jb25maWcgKmNmZzsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAqaTJjOwotCi0JdTMyIGZyZXFfaHo7Ci0JdTMyIGJhbmR3aWR0aDsKLQl1OCAgdmlkZW9fc3RhbmRhcmQ7Ci0JdTggIHJmX21vZGU7Ci0KLQl2b2lkICpkZXZwdHI7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCmluZGV4IDhiYzE0NDUuLjBiY2Q4NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwpAQCAtMjAsNyArMjAsNiBAQAogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvS2NvbmZpZyIKLXNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL0tjb25maWciCiAKIGNvbW1lbnQgIlN1cHBvcnRlZCBGbGV4Q29wSUkgKEIyQzIpIEFkYXB0ZXJzIgpAQCAtMzUsNiArMzQsMTAgQEAKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL0tjb25maWciCiAKK2NvbW1lbnQgIlN1cHBvcnRlZCBTRE1DIERNMTEwNSBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L0tjb25maWciCisKIGNvbW1lbnQgIlN1cHBvcnRlZCBEVkIgRnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCmluZGV4IGQ2YmE0ZDEuLmY5MWU5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBtdWx0aW1lZGlhIGRldmljZSBkcml2ZXJzLgogIwogCi1vYmoteSAgICAgICAgOj0gZHZiLWNvcmUvIGZyb250ZW5kcy8gdHRwY2kvIHR0dXNiLWRlYy8gdHR1c2ItYnVkZ2V0LyBiMmMyLyBidDh4eC8gY2luZXJneVQyLyBkdmItdXNiLyBwbHV0bzIvIHNpYW5vLworb2JqLXkgICAgICAgIDo9IGR2Yi1jb3JlLyBmcm9udGVuZHMvIHR0cGNpLyB0dHVzYi1kZWMvIHR0dXNiLWJ1ZGdldC8gYjJjMi8gYnQ4eHgvIGR2Yi11c2IvIHBsdXRvMi8gc2lhbm8vIGRtMTEwNS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYwppbmRleCBhOTFlZDI4Li4yNmYwMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jCkBAIC0xMCw3ICsxMCw3IEBACiBpbnQgZmxleGNvcF9kbWFfYWxsb2NhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCB1MzIgc2l6ZSkKIHsKIAl1OCAqdGNwdTsKLQlkbWFfYWRkcl90IHRkbWE7CisJZG1hX2FkZHJfdCB0ZG1hID0gMDsKIAogCWlmIChzaXplICUgMikgewogCQllcnIoImRtYSBidWZmZXJzaXplIGhhcyB0byBiZSBldmVuLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwppbmRleCA0ZWVkNzgzLi5hMTI3YTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwpAQCAtNDkxLDYgKzQ5MSw3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDUzLAogCS5pbnZlcnQgPSAxLAogCS5yZXBlYXRlZF9zdGFydF93b3JrYXJvdW5kID0gMSwKKwkuc2VyaWFsX21wZWcgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBpdGQxMDAwX2NvbmZpZyBza3lzdGFyMl9yZXYyXzdfaXRkMTAwMF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IDZhZmJmYmIuLjQ4NzYyYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC03MDIsNyArNzAyLDcgQEAKIAl9CiAKIAlpZiAoY2FyZC0+ZmUgPT0gTlVMTCkKLQkJcHJpbnRrKCJkdmItYnQ4eHg6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKKwkJcHJpbnRrKCJkdmItYnQ4eHg6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSBbJTA0eDolMDR4XSBzdWJzeXN0ZW0gWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBjYXJkLT5idC0+ZGV2LT52ZW5kb3IsCiAJCSAgICAgICBjYXJkLT5idC0+ZGV2LT5kZXZpY2UsCiAJCSAgICAgICBjYXJkLT5idC0+ZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNTEzYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLWNvbmZpZyBEVkJfQ0lORVJHWVQyCi0JdHJpc3RhdGUgIlRlcnJhdGVjIENpbmVyZ3lUMi9xYW51IFVTQjIgRFZCLVQgcmVjZWl2ZXIiCi0JZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IgJiYgSU5QVVQKLQloZWxwCi0JICBTdXBwb3J0IGZvciAiVGVycmFUZWMgQ2luZXJneVQyIiBVU0IyLjAgSGlnaHNwZWVkIERWQiBSZWNlaXZlcnMKLQotCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KLQotCi1jb25maWcgRFZCX0NJTkVSR1lUMl9UVU5JTkcKLQlib29sICJzb3BoaXN0aWNhdGVkIGZpbmUtdHVuaW5nIGZvciBDaW5lcmd5VDIgY2FyZHMiCi0JZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyCi0JaGVscAotCSAgSGVyZSB5b3UgY2FuIGZpbmUtdHVuZSBzb21lIHBhcmFtZXRlcnMgb2YgdGhlIENpbmVyZ3lUMiBkcml2ZXIuCi0KLQkgIE5vcm1hbGx5IHlvdSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoaXMsIGJ1dCBpbiBleG90aWMgc2V0dXBzIHlvdQotCSAgbWF5IGZpbmUtdHVuZSB5b3VyIHNldHVwIGFuZCBhZGp1c3QgZS5nLiBETUEgYnVmZmVyIHNpemVzIGZvcgotCSAgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLgotCi0KLWNvbmZpZyBEVkJfQ0lORVJHWVQyX1NUUkVBTV9VUkJfQ09VTlQKLQlpbnQgIk51bWJlciBvZiBxdWV1ZWQgVVNCIFJlcXVlc3QgQmxvY2tzIGZvciBIaWdoc3BlZWQgU3RyZWFtIFRyYW5zZmVycyIKLQlkZXBlbmRzIG9uIERWQl9DSU5FUkdZVDJfVFVOSU5HCi0JZGVmYXVsdCAiMzIiCi0JaGVscAotCSAgVVNCIFJlcXVlc3QgQmxvY2tzIGZvciBIaWdoc3BlZWQgU3RyZWFtIHRyYW5zZmVycyBhcmUgc2NoZWR1bGVkIGluCi0JICBhIHF1ZXVlIGZvciB0aGUgSG9zdCBDb250cm9sbGVyLgotCi0JICBVc3VhbGx5IHRoZSBkZWZhdWx0IHZhbHVlIGlzIGEgc2FmZSBjaG9pY2UuCi0KLQkgIFlvdSBtYXkgaW5jcmVhc2UgdGhpcyBudW1iZXIgaWYgeW91IGFyZSB1c2luZyB0aGlzIGRldmljZSBpbiBhCi0JICBTZXJ2ZXIgRW52aXJvbm1lbnQgd2l0aCBtYW55IGhpZ2gtdHJhZmZpYyBVU0IgSGlnaHNwZWVkIGRldmljZXMKLQkgIHNoYXJpbmcgdGhlIHNhbWUgVVNCIGJ1cy4KLQotCi1jb25maWcgRFZCX0NJTkVSR1lUMl9TVFJFQU1fQlVGX1NJWkUKLQlpbnQgIlNpemUgb2YgVVJCIFN0cmVhbSBCdWZmZXJzIGZvciBIaWdoc3BlZWQgVHJhbnNmZXJzIgotCWRlcGVuZHMgb24gRFZCX0NJTkVSR1lUMl9UVU5JTkcKLQlkZWZhdWx0ICI1MTIiCi0JaGVscAotCSAgU2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbmF0aXZlIGJ1ZmZlciBzaXplIG9mIDUxMiBieXRlcy4KLQkgIERlZmF1bHQgdmFsdWUgaXMgYSBzYWZlIGNob2ljZS4KLQotCSAgWW91IG1heSBpbmNyZWFzZSB0aGlzIG51bWJlciBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgZGV2aWNlIGluIGEKLQkgIFNlcnZlciBFbnZpcm9ubWVudCB3aXRoIG1hbnkgaGlnaC10cmFmZmljIFVTQiBIaWdoc3BlZWQgZGV2aWNlcwotCSAgc2hhcmluZyB0aGUgc2FtZSBVU0IgYnVzLgotCi0KLWNvbmZpZyBEVkJfQ0lORVJHWVQyX1FVRVJZX0lOVEVSVkFMCi0JaW50ICJTdGF0dXMgdXBkYXRlIGludGVydmFsIFttaWxsaXNlY29uZHNdIgotCWRlcGVuZHMgb24gRFZCX0NJTkVSR1lUMl9UVU5JTkcKLQlkZWZhdWx0ICIyNTAiCi0JaGVscAotCSAgVGhpcyBpcyB0aGUgaW50ZXJ2YWwgZm9yIHN0YXR1cyByZWFkb3V0cyBmcm9tIHRoZSBkZW1vZHVsYXRvci4KLQkgIFlvdSBtYXkgdHJ5IGxvd2VyIHZhbHVlcyBpZiB5b3UgbmVlZCBtb3JlIHJlc3BvbnNpdmUgc2lnbmFsIHF1YWxpdHkKLQkgIG1lYXN1cmVtZW50cy4KLQotCSAgUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZXNlIHVwZGF0ZXMgY2F1c2UgdHJhZmZpYyBvbiB0aGUgdHVuZXIKLQkgIGNvbnRyb2wgYnVzIGFuZCB0aHVzIG1heSBvciBtYXkgbm90IGFmZmVjdCByZWNlcHRpb24gc2Vuc2l0aXZpdHkuCi0KLQkgIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBhIHNhZmUgY2hvaWNlIGZvciBjb21tb24gYXBwbGljYXRpb25zLgotCi0KLWNvbmZpZyBEVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKLQlib29sICJSZWdpc3RlciB0aGUgb25ib2FyZCBJUiBSZW1vdGUgQ29udHJvbCBSZWNlaXZlciBhcyBJbnB1dCBEZXZpY2UiCi0JZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORwotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uYm9hcmQgSW5mcmFyZWQgUmVtb3RlCi0JICBDb250cm9sIFJlY2VpdmVyIGFzIExpbnV4LUlucHV0IGRldmljZS4KLQotCSAgUmlnaHQgbm93IG9ubHkgdGhlIGtleWNvZGUgdGFibGUgZm9yIHRoZSBkZWZhdWx0IFJlbW90ZSBDb250cm9sCi0JICBkZWxpdmVyZWQgd2l0aCB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCwgcGxlYXNlIHNlZSB0aGUgZHJpdmVyCi0JICBzb3VyY2UgY29kZSB0byBmaW5kIG91dCBob3cgdG8gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGNvbnRyb2xzLgotCi0KLWNvbmZpZyBEVkJfQ0lORVJHWVQyX1JDX1FVRVJZX0lOVEVSVkFMCi0JaW50ICJJbmZyYXJlZCBSZW1vdGUgQ29udHJvbGxlciB1cGRhdGUgaW50ZXJ2YWwgW21pbGxpc2Vjb25kc10iCi0JZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORyAmJiBEVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKLQlkZWZhdWx0ICI1MCIKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhIHZlcnkgZmFzdC1yZXBlYXRpbmcgcmVtb3RlIGNvbnRyb2wgeW91IGNhbiB0cnkgbG93ZXIKLQkgIHZhbHVlcywgZm9yIG5vcm1hbCBjb25zdW1lciByZWNlaXZlcnMgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlCi0JICBhIHNhZmUgY2hvaWNlLgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjJkOGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vYmotJChDT05GSUdfRFZCX0NJTkVSR1lUMikgKz0gY2luZXJneVQyLm8KLQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjRmMzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNSArMCwwIEBACi0vKgotICogVGVycmFUZWMgQ2luZXJneSBUwrIvcWFudSBVU0IyIERWQi1UIGFkYXB0ZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCi0gKgkJICAgIEhvbGdlciBXYWVjaHRsZXIgPGhvbGdlckBxYW51LmRlPgotICoKLSAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAiZG14ZGV2LmgiCi0jaW5jbHVkZSAiZHZiX2RlbXV4LmgiCi0jaW5jbHVkZSAiZHZiX25ldC5oIgotCi0jaWZkZWYgQ09ORklHX0RWQl9DSU5FUkdZVDJfVFVOSU5HCi0JI2RlZmluZSBTVFJFQU1fVVJCX0NPVU5UIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fVVJCX0NPVU5UKQotCSNkZWZpbmUgU1RSRUFNX0JVRl9TSVpFIChDT05GSUdfRFZCX0NJTkVSR1lUMl9TVFJFQU1fQlVGX1NJWkUpCi0JI2RlZmluZSBRVUVSWV9JTlRFUlZBTCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfUVVFUllfSU5URVJWQUwpCi0JI2lmZGVmIENPTkZJR19EVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKLQkJI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoQ09ORklHX0RWQl9DSU5FUkdZVDJfUkNfUVVFUllfSU5URVJWQUwpCi0JCSNkZWZpbmUgRU5BQkxFX1JDICgxKQotCSNlbmRpZgotI2Vsc2UKLQkjZGVmaW5lIFNUUkVBTV9VUkJfQ09VTlQgKDMyKQotCSNkZWZpbmUgU1RSRUFNX0JVRl9TSVpFICg1MTIpCS8qIGJ5dGVzICovCi0JI2RlZmluZSBFTkFCTEVfUkMgKDEpCi0JI2RlZmluZSBSQ19RVUVSWV9JTlRFUlZBTCAoNTApCS8qIG1pbGxpc2Vjb25kcyAqLwotCSNkZWZpbmUgUVVFUllfSU5URVJWQUwgKDMzMykJLyogbWlsbGlzZWNvbmRzICovCi0jZW5kaWYKLQotI2RlZmluZSBEUklWRVJfTkFNRSAiVGVycmFUZWMvcWFudSBVU0IyLjAgSGlnaHNwZWVkIERWQi1UIFJlY2VpdmVyIgotCi1zdGF0aWMgaW50IGRlYnVnOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKLQotRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7Ci0KLSNkZWZpbmUgZHByaW50ayhsZXZlbCwgYXJncy4uLikJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmICgoZGVidWcgJiBsZXZlbCkpIHsJCQkJCQlcCi0JCXByaW50aygiJXM6ICVzKCk6ICIsIEtCVUlMRF9NT0ROQU1FLAkJCVwKLQkJICAgICAgIF9fZnVuY19fKTsJCQkJCVwKLQkJcHJpbnRrKGFyZ3MpOyB9CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotZW51bSBjaW5lcmd5dDJfZXAxX2NtZCB7Ci0JQ0lORVJHWVQyX0VQMV9QSURfVEFCTEVfUkVTRVQJCT0gMHgwMSwKLQlDSU5FUkdZVDJfRVAxX1BJRF9TRVRVUAkJCT0gMHgwMiwKLQlDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSCT0gMHgwMywKLQlDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTCT0gMHgwNCwKLQlDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMJCT0gMHgwNSwKLQlDSU5FUkdZVDJfRVAxX1NUQVJUX1NDQU4JCT0gMHgwNiwKLQlDSU5FUkdZVDJfRVAxX0NPTlRJTlVFX1NDQU4JCT0gMHgwNywKLQlDSU5FUkdZVDJfRVAxX0dFVF9SQ19FVkVOVFMJCT0gMHgwOCwKLQlDSU5FUkdZVDJfRVAxX1NMRUVQX01PREUJCT0gMHgwOQotfTsKLQotc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHsKLQl1aW50OF90IGNtZDsKLQlfX2xlMzIgZnJlcTsKLQl1aW50OF90IGJhbmR3aWR0aDsKLQlfX2xlMTYgdHBzOwotCXVpbnQ4X3QgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZyB7Ci0JX19sZTMyIGZyZXE7Ci0JdWludDhfdCBiYW5kd2lkdGg7Ci0JX19sZTE2IHRwczsKLQl1aW50OF90IGZsYWdzOwotCV9fbGUxNiBnYWluOwotCXVpbnQ4X3Qgc25yOwotCV9fbGUzMiB2aXRlcmJpX2Vycm9yX3JhdGU7Ci0JX19sZTMyIHJzX2Vycm9yX3JhdGU7Ci0JX19sZTMyIHVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OwotCXVpbnQ4X3QgbG9ja19iaXRzOwotCXVpbnQ4X3QgcHJldl9sb2NrX2JpdHM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIGNpbmVyZ3l0Ml9mZV9pbmZvID0gewotCS5uYW1lID0gRFJJVkVSX05BTUUsCi0JLnR5cGUgPSBGRV9PRkRNLAotCS5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwLAotCS5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwLAotCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAxNjY2NjcsCi0JLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfCBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwKLQkJRkVfQ0FOX0ZFQ18zXzQgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwKLQkJRkVfQ0FOX0ZFQ19BVVRPIHwKLQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8Ci0JCUZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPIHwgRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAotCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUiB8IEZFX0NBTl9NVVRFX1RTCi19OwotCi1zdHJ1Y3QgY2luZXJneXQyIHsKLQlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotCXN0cnVjdCBtdXRleCBzZW07Ci0Jc3RydWN0IG11dGV4IHdxX3NlbTsKLQlzdHJ1Y3QgZHZiX2FkYXB0ZXIgYWRhcHRlcjsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZmVkZXY7Ci0Jc3RydWN0IGRteGRldiBkbXhkZXY7Ci0Jc3RydWN0IGR2Yl9uZXQgZHZibmV0OwotCi0JaW50IHN0cmVhbWluZzsKLQlpbnQgc2xlZXBpbmc7Ci0KLQlzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgcGFyYW07Ci0Jc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgc3RhdHVzOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcXVlcnlfd29yazsKLQotCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd3E7Ci0JaW50IHBlbmRpbmdfZmVfZXZlbnRzOwotCWludCBkaXNjb25uZWN0X3BlbmRpbmc7Ci0JdW5zaWduZWQgaW50IHVuY29ycmVjdGVkX2Jsb2NrX2NvdW50OwotCWF0b21pY190IGludXNlOwotCi0Jdm9pZCAqc3RyZWFtYnVmOwotCWRtYV9hZGRyX3Qgc3RyZWFtYnVmX2RtYWhhbmRsZTsKLQlzdHJ1Y3QgdXJiICpzdHJlYW1fdXJiIFtTVFJFQU1fVVJCX0NPVU5UXTsKLQotI2lmZGVmIEVOQUJMRV9SQwotCXN0cnVjdCBpbnB1dF9kZXYgKnJjX2lucHV0X2RldjsKLQljaGFyIHBoeXNbNjRdOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcmNfcXVlcnlfd29yazsKLQlpbnQgcmNfaW5wdXRfZXZlbnQ7Ci0JX19sZTMyIHJjX2xhc3RfY29kZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfZXZlbnRfamlmZmllczsKLSNlbmRpZgotfTsKLQotZW51bSB7Ci0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTk9ORSA9IDB4MDAsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDICA9IDB4MDEsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfUkM1ICA9IDB4MDIKLX07Ci0KLXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgewotCWNoYXIgdHlwZTsKLQlfX2xlMzIgdmFsdWU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdGF0aWMgY29uc3QgdWludDMyX3QgcmNfa2V5c1tdID0gewotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZTAxZWIwNCwJS0VZX1BPV0VSLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmZDAyZWIwNCwJS0VZXzEsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGZjMDNlYjA0LAlLRVlfMiwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZmIwNGViMDQsCUtFWV8zLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmYTA1ZWIwNCwJS0VZXzQsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY5MDZlYjA0LAlLRVlfNSwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjgwN2ViMDQsCUtFWV82LAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmNzA4ZWIwNCwJS0VZXzcsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY2MDllYjA0LAlLRVlfOCwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjUwYWViMDQsCUtFWV85LAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhmMzBjZWIwNCwJS0VZXzAsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGY0MGJlYjA0LAlLRVlfVklERU8sCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYyMGRlYjA0LAlLRVlfUkVGUkVTSCwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZjEwZWViMDQsCUtFWV9TRUxFQ1QsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGYwMGZlYjA0LAlLRVlfRVBHLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlZjEwZWIwNCwJS0VZX1VQLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlYjE0ZWIwNCwJS0VZX0RPV04sCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGVlMTFlYjA0LAlLRVlfTEVGVCwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWMxM2ViMDQsCUtFWV9SSUdIVCwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWQxMmViMDQsCUtFWV9PSywKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZWExNWViMDQsCUtFWV9URVhULAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlOTE2ZWIwNCwJS0VZX0lORk8sCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGU4MTdlYjA0LAlLRVlfUkVELAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNzE4ZWIwNCwJS0VZX0dSRUVOLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlNjE5ZWIwNCwJS0VZX1lFTExPVywKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTUxYWViMDQsCUtFWV9CTFVFLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMzFjZWIwNCwJS0VZX1ZPTFVNRVVQLAotCUNJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQywJMHhlMTFlZWIwNCwJS0VZX1ZPTFVNRURPV04sCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUyMWRlYjA0LAlLRVlfTVVURSwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4ZTQxYmViMDQsCUtFWV9DSEFOTkVMVVAsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGUwMWZlYjA0LAlLRVlfQ0hBTk5FTERPV04sCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGJmNDBlYjA0LAlLRVlfUEFVU0UsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGIzNGNlYjA0LAlLRVlfUExBWSwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YTc1OGViMDQsCUtFWV9SRUNPUkQsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGFiNTRlYjA0LAlLRVlfUFJFVklPVVMsCi0JQ0lORVJHWVQyX1JDX0VWRU5UX1RZUEVfTkVDLAkweGI3NDhlYjA0LAlLRVlfU1RPUCwKLQlDSU5FUkdZVDJfUkNfRVZFTlRfVFlQRV9ORUMsCTB4YTM1Y2ViMDQsCUtFWV9ORVhUCi19OwotCi1zdGF0aWMgaW50IGNpbmVyZ3l0Ml9jb21tYW5kIChzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIsCi0JCQkgICAgICBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKLQkJCSAgICAgIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQotewotCWludCBhY3R1YWxfbGVuOwotCWNoYXIgZHVtbXk7Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9idWxrX21zZyhjaW5lcmd5dDItPnVkZXYsIHVzYl9zbmRidWxrcGlwZShjaW5lcmd5dDItPnVkZXYsIDEpLAotCQkJICAgc2VuZF9idWYsIHNlbmRfYnVmX2xlbiwgJmFjdHVhbF9sZW4sIDEwMDApOwotCi0JaWYgKHJldCkKLQkJZHByaW50aygxLCAidXNiX2J1bGtfbXNnIChzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKLQotCWlmICghcmVjdl9idWYpCi0JCXJlY3ZfYnVmID0gJmR1bW15OwotCi0JcmV0ID0gdXNiX2J1bGtfbXNnKGNpbmVyZ3l0Mi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMSksCi0JCQkgICByZWN2X2J1ZiwgcmVjdl9idWZfbGVuLCAmYWN0dWFsX2xlbiwgMTAwMCk7Ci0KLQlpZiAocmV0KQotCQlkcHJpbnRrKDEsICJ1c2JfYnVsa19tc2cgKHJlYWQpIGZhaWxlZCwgZXJyICVpXG4iLCByZXQpOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGFjdHVhbF9sZW47Ci19Ci0KLXN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9jb250cm9sX3N0cmVhbV90cmFuc2ZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLCBpbnQgZW5hYmxlKQotewotCWNoYXIgYnVmIFtdID0geyBDSU5FUkdZVDJfRVAxX0NPTlRST0xfU1RSRUFNX1RSQU5TRkVSLCBlbmFibGUgPyAxIDogMCB9OwotCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9zbGVlcCAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyLCBpbnQgc2xlZXApCi17Ci0JY2hhciBidWYgW10gPSB7IENJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERSwgc2xlZXAgPyAxIDogMCB9OwotCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7Ci0JY2luZXJneXQyLT5zbGVlcGluZyA9IHNsZWVwOwotfQotCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RyZWFtX2lycSAoc3RydWN0IHVyYiAqdXJiKTsKLQotc3RhdGljIGludCBjaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0Miwgc3RydWN0IHVyYiAqdXJiKQotewotCWludCBlcnI7Ci0KLQl1c2JfZmlsbF9idWxrX3VyYih1cmIsCi0JCQkgIGNpbmVyZ3l0Mi0+dWRldiwKLQkJCSAgdXNiX3JjdmJ1bGtwaXBlKGNpbmVyZ3l0Mi0+dWRldiwgMHgyKSwKLQkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkgIFNUUkVBTV9CVUZfU0laRSwKLQkJCSAgY2luZXJneXQyX3N0cmVhbV9pcnEsCi0JCQkgIGNpbmVyZ3l0Mik7Ci0KLQlpZiAoKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpKQotCQlkcHJpbnRrKDEsICJ1cmIgc3VibWlzc2lvbiBmYWlsZWQgKGVyciA9ICVpKSFcbiIsIGVycik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RyZWFtX2lycSAoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVyYi0+Y29udGV4dDsKLQotCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKQotCQlkdmJfZG14X3N3ZmlsdGVyKCZjaW5lcmd5dDItPmRlbXV4LAotCQkJCSB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKLQkJY2luZXJneXQyX3N1Ym1pdF9zdHJlYW1fdXJiKGNpbmVyZ3l0MiwgdXJiKTsKLX0KLQotc3RhdGljIHZvaWQgY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpPFNUUkVBTV9VUkJfQ09VTlQ7IGkrKykKLQkJdXNiX2ZyZWVfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7Ci0KLQl1c2JfYnVmZmVyX2ZyZWUoY2luZXJneXQyLT51ZGV2LCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSwKLQkJCSAgICBjaW5lcmd5dDItPnN0cmVhbWJ1ZiwgY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKLX0KLQotc3RhdGljIGludCBjaW5lcmd5dDJfYWxsb2Nfc3RyZWFtX3VyYnMgKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQlpbnQgaTsKLQotCWNpbmVyZ3l0Mi0+c3RyZWFtYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhjaW5lcmd5dDItPnVkZXYsIFNUUkVBTV9VUkJfQ09VTlQqU1RSRUFNX0JVRl9TSVpFLAotCQkJCQkgICAgICBHRlBfS0VSTkVMLCAmY2luZXJneXQyLT5zdHJlYW1idWZfZG1haGFuZGxlKTsKLQlpZiAoIWNpbmVyZ3l0Mi0+c3RyZWFtYnVmKSB7Ci0JCWRwcmludGsoMSwgImZhaWxlZCB0byBhbGxvYyBjb25zaXN0ZW50IHN0cmVhbSBtZW1vcnkgYXJlYSwgYmFpbGluZyBvdXQhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtc2V0KGNpbmVyZ3l0Mi0+c3RyZWFtYnVmLCAwLCBTVFJFQU1fVVJCX0NPVU5UKlNUUkVBTV9CVUZfU0laRSk7Ci0KLQlmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspIHsKLQkJc3RydWN0IHVyYiAqdXJiOwotCi0JCWlmICghKHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQykpKSB7Ci0JCQlkcHJpbnRrKDEsICJmYWlsZWQgdG8gYWxsb2MgY29uc2lzdGVudCBzdHJlYW0gdXJicywgYmFpbGluZyBvdXQhXG4iKTsKLQkJCWNpbmVyZ3l0Ml9mcmVlX3N0cmVhbV91cmJzKGNpbmVyZ3l0Mik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gY2luZXJneXQyLT5zdHJlYW1idWYgKyBpICogU1RSRUFNX0JVRl9TSVpFOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTVFJFQU1fQlVGX1NJWkU7Ci0KLQkJY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldID0gdXJiOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfc3RvcF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQotewotCWludCBpOwotCi0JY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMCk7Ci0KLQlmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspCi0JCXVzYl9raWxsX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwotfQotCi1zdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQotewotCWludCBpLCBlcnI7Ci0KLQlmb3IgKGk9MDsgaTxTVFJFQU1fVVJCX0NPVU5UOyBpKyspIHsKLQkJaWYgKChlcnIgPSBjaW5lcmd5dDJfc3VibWl0X3N0cmVhbV91cmIoY2luZXJneXQyLCBjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pKSkgewotCQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKLQkJCWRwcmludGsoMSwgImZhaWxlZCB1cmIgc3VibWlzc2lvbiAoJWk6IGVyciA9ICVpKSFcbiIsIGksIGVycik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCi0JY2luZXJneXQyX2NvbnRyb2xfc3RyZWFtX3RyYW5zZmVyKGNpbmVyZ3l0MiwgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneXQyX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQotewotCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZGVtdXgtPnByaXY7Ci0KLQlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcpCi0JCXJldHVybiAtRUFHQUlOOwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZyA9PSAwKQotCQljaW5lcmd5dDJfc3RhcnRfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKLQotCWNpbmVyZ3l0Mi0+c3RyZWFtaW5nKys7Ci0JbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneXQyX3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBkdmJkbXhmZWVkLT5kZW11eDsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkZW11eC0+cHJpdjsKLQotCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZykKLQkJcmV0dXJuIC1FQUdBSU47Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKC0tY2luZXJneXQyLT5zdHJlYW1pbmcgPT0gMCkKLQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKLQotCW11dGV4X3VubG9jaygmY2luZXJneXQyLT5zZW0pOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqICBjb252ZXJ0IGxpbnV4LWR2YiBmcm9udGVuZCBwYXJhbWV0ZXIgc2V0IGludG8gVFBTLgotICogIFNlZSBFVFNJIEVUUy0zMDA3NDQsIHNlY3Rpb24gNC42LjIsIHRhYmxlIDkgZm9yIGRldGFpbHMuCi0gKgotICogIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFibHkgcmV1c2FibGUgYW5kIG1heSBiZXR0ZXIgZ2V0IHBsYWNlZCBpbiBhIHN1cHBvcnQKLSAqICBsaWJyYXJ5LgotICoKLSAqICBXZSByZXBsYWNlIGVycm9ybm91cyBmaWVsZHMgYnkgZGVmYXVsdCBUUFMgZmllbGRzICh0aGUgb25lcyB3aXRoIHZhbHVlIDApLgotICovCi1zdGF0aWMgdWludDE2X3QgY29tcHV0ZV90cHMgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKLXsKLQlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyAqb3AgPSAmcC0+dS5vZmRtOwotCXVpbnQxNl90IHRwcyA9IDA7Ci0KLQlzd2l0Y2ggKG9wLT5jb2RlX3JhdGVfSFApIHsKLQkJY2FzZSBGRUNfMl8zOgotCQkJdHBzIHw9ICgxIDw8IDcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRkVDXzNfNDoKLQkJCXRwcyB8PSAoMiA8PCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIEZFQ181XzY6Ci0JCQl0cHMgfD0gKDMgPDwgNyk7Ci0JCQlicmVhazsKLQkJY2FzZSBGRUNfN184OgotCQkJdHBzIHw9ICg0IDw8IDcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRkVDXzFfMjoKLQkJY2FzZSBGRUNfQVVUTzoKLQkJZGVmYXVsdDoKLQkJCS8qIHRwcyB8PSAoMCA8PCA3KSAqLzsKLQl9Ci0KLQlzd2l0Y2ggKG9wLT5jb2RlX3JhdGVfTFApIHsKLQkJY2FzZSBGRUNfMl8zOgotCQkJdHBzIHw9ICgxIDw8IDQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRkVDXzNfNDoKLQkJCXRwcyB8PSAoMiA8PCA0KTsKLQkJCWJyZWFrOwotCQljYXNlIEZFQ181XzY6Ci0JCQl0cHMgfD0gKDMgPDwgNCk7Ci0JCQlicmVhazsKLQkJY2FzZSBGRUNfN184OgotCQkJdHBzIHw9ICg0IDw8IDQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRkVDXzFfMjoKLQkJY2FzZSBGRUNfQVVUTzoKLQkJZGVmYXVsdDoKLQkJCS8qIHRwcyB8PSAoMCA8PCA0KSAqLzsKLQl9Ci0KLQlzd2l0Y2ggKG9wLT5jb25zdGVsbGF0aW9uKSB7Ci0JCWNhc2UgUUFNXzE2OgotCQkJdHBzIHw9ICgxIDw8IDEzKTsKLQkJCWJyZWFrOwotCQljYXNlIFFBTV82NDoKLQkJCXRwcyB8PSAoMiA8PCAxMyk7Ci0JCQlicmVhazsKLQkJY2FzZSBRUFNLOgotCQlkZWZhdWx0OgotCQkJLyogdHBzIHw9ICgwIDw8IDEzKSAqLzsKLQl9Ci0KLQlzd2l0Y2ggKG9wLT50cmFuc21pc3Npb25fbW9kZSkgewotCQljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgotCQkJdHBzIHw9ICgxIDw8IDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6Ci0JCWRlZmF1bHQ6Ci0JCQkvKiB0cHMgfD0gKDAgPDwgMCkgKi87Ci0JfQotCi0Jc3dpdGNoIChvcC0+Z3VhcmRfaW50ZXJ2YWwpIHsKLQkJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzE2OgotCQkJdHBzIHw9ICgxIDw8IDIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1VBUkRfSU5URVJWQUxfMV84OgotCQkJdHBzIHw9ICgyIDw8IDIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgotCQkJdHBzIHw9ICgzIDw8IDIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKLQkJZGVmYXVsdDoKLQkJCS8qIHRwcyB8PSAoMCA8PCAyKSAqLzsKLQl9Ci0KLQlzd2l0Y2ggKG9wLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKLQkJY2FzZSBISUVSQVJDSFlfMToKLQkJCXRwcyB8PSAoMSA8PCAxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBISUVSQVJDSFlfMjoKLQkJCXRwcyB8PSAoMiA8PCAxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBISUVSQVJDSFlfNDoKLQkJCXRwcyB8PSAoMyA8PCAxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBISUVSQVJDSFlfTk9ORToKLQkJZGVmYXVsdDoKLQkJCS8qIHRwcyB8PSAoMCA8PCAxMCkgKi87Ci0JfQotCi0JcmV0dXJuIHRwczsKLX0KLQotc3RhdGljIGludCBjaW5lcmd5dDJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7Ci0JaW50IGVyciA9IC1FQUdBSU47Ci0KLQlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcpCi0JCWdvdG8gb3V0OwotCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT53cV9zZW0pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfdW5sb2NrMTsKLQotCWlmICgoZXJyID0gZHZiX2dlbmVyaWNfb3Blbihpbm9kZSwgZmlsZSkpKQotCQlnb3RvIG91dF91bmxvY2syOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkgewotCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAwKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmssIEhaLzIpOwotCX0KLQotCWF0b21pY19pbmMoJmNpbmVyZ3l0Mi0+aW51c2UpOwotCi1vdXRfdW5sb2NrMjoKLQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKLW91dF91bmxvY2sxOgotCW11dGV4X3VubG9jaygmY2luZXJneXQyLT53cV9zZW0pOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml91bnJlZ2lzdGVyKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQlkdmJfbmV0X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZHZibmV0KTsKLQlkdmJfZG14ZGV2X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZG14ZGV2KTsKLQlkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwotCWR2Yl91bnJlZ2lzdGVyX2RldmljZShjaW5lcmd5dDItPmZlZGV2KTsKLQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIpOwotCi0JY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKLQlrZnJlZShjaW5lcmd5dDIpOwotfQotCi1zdGF0aWMgaW50IGNpbmVyZ3l0Ml9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKLQotCW11dGV4X2xvY2soJmNpbmVyZ3l0Mi0+d3Ffc2VtKTsKLQotCWlmICghY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7Ci0JCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yayk7Ci0KLQkJbXV0ZXhfbG9jaygmY2luZXJneXQyLT5zZW0pOwotCQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKLQkJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPndxX3NlbSk7Ci0KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2luZXJneXQyLT5pbnVzZSkgJiYgY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcpIHsKLQkJd2FybigiZGVsYXllZCB1bnJlZ2lzdGVyIGluIHJlbGVhc2UiKTsKLQkJY2luZXJneXQyX3VucmVnaXN0ZXIoY2luZXJneXQyKTsKLQl9Ci0KLQlyZXR1cm4gZHZiX2dlbmVyaWNfcmVsZWFzZShpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2luZXJneXQyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSBkdmJkZXYtPnByaXY7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJmNpbmVyZ3l0Mi0+cG9sbF93cSwgd2FpdCk7Ci0KLQlpZiAoY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyAhPSAwKQotCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTFBSSSk7Ci0KLQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKLQotCXJldHVybiBtYXNrOwotfQotCi0KLXN0YXRpYyBpbnQgY2luZXJneXQyX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gZHZiZGV2LT5wcml2OwotCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnICpzdGF0ID0gJmNpbmVyZ3l0Mi0+c3RhdHVzOwotCWZlX3N0YXR1c190IHN0YXR1cyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgRkVfR0VUX0lORk86Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyKikgYXJnLCAmY2luZXJneXQyX2ZlX2luZm8sCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pKTsKLQotCWNhc2UgRkVfUkVBRF9TVEFUVVM6Ci0JCWlmICgweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSA+IDMwKQotCQkJc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7Ci0JCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCA2KSkKLQkJCXN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKLQkJaWYgKHN0YXQtPmxvY2tfYml0cyAmICgxIDw8IDUpKQotCQkJc3RhdHVzIHw9IEZFX0hBU19TWU5DOwotCQlpZiAoc3RhdC0+bG9ja19iaXRzICYgKDEgPDwgNCkpCi0JCQlzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7Ci0JCWlmIChzdGF0LT5sb2NrX2JpdHMgJiAoMSA8PCAxKSkKLQkJCXN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKLQotCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICBfX3VzZXIqKSBhcmcsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKLQotCWNhc2UgRkVfUkVBRF9CRVI6Ci0JCXJldHVybiBwdXRfdXNlcihsZTMyX3RvX2NwdShzdGF0LT52aXRlcmJpX2Vycm9yX3JhdGUpLAotCQkJCShfX3UzMiBfX3VzZXIgKikgYXJnKTsKLQotCWNhc2UgRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEg6Ci0JCXJldHVybiBwdXRfdXNlcigweGZmZmYgLSBsZTE2X3RvX2NwdShzdGF0LT5nYWluKSwKLQkJCQkoX191MTYgX191c2VyICopIGFyZyk7Ci0KLQljYXNlIEZFX1JFQURfU05SOgotCQlyZXR1cm4gcHV0X3VzZXIoKHN0YXQtPnNuciA8PCA4KSB8IHN0YXQtPnNuciwKLQkJCQkoX191MTYgX191c2VyICopIGFyZyk7Ci0KLQljYXNlIEZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTOgotCXsKLQkJdWludDMyX3QgdW5jX2NvdW50OwotCi0JCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+c2VtKSkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCXVuY19jb3VudCA9IGNpbmVyZ3l0Mi0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7Ci0JCWNpbmVyZ3l0Mi0+dW5jb3JyZWN0ZWRfYmxvY2tfY291bnQgPSAwOwotCQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKLQotCQkvKiBVTkMgYXJlIGFscmVhZHkgY29udmVydGVkIHRvIGhvc3QgYnl0ZSBvcmRlci4uLiAqLwotCQlyZXR1cm4gcHV0X3VzZXIodW5jX2NvdW50LChfX3UzMiBfX3VzZXIgKikgYXJnKTsKLQl9Ci0JY2FzZSBGRV9TRVRfRlJPTlRFTkQ6Ci0JewotCQlzdHJ1Y3QgZHZidF9zZXRfcGFyYW1ldGVyc19tc2cgKnBhcmFtID0gJmNpbmVyZ3l0Mi0+cGFyYW07Ci0JCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBwOwotCQlpbnQgZXJyOwotCi0JCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpCi0JCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgKHZvaWQgIF9fdXNlciopIGFyZywgc2l6ZW9mKHApKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZykKLQkJCXJldHVybiAtRUFHQUlOOwotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JCXBhcmFtLT5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwotCQlwYXJhbS0+dHBzID0gY3B1X3RvX2xlMTYoY29tcHV0ZV90cHMoJnApKTsKLQkJcGFyYW0tPmZyZXEgPSBjcHVfdG9fbGUzMihwLmZyZXF1ZW5jeSAvIDEwMDApOwotCQlwYXJhbS0+YmFuZHdpZHRoID0gOCAtIHAudS5vZmRtLmJhbmR3aWR0aCAtIEJBTkRXSURUSF84X01IWjsKLQotCQlzdGF0LT5sb2NrX2JpdHMgPSAwOwotCQljaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzKys7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKLQotCQllcnIgPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsCi0JCQkJCShjaGFyICopIHBhcmFtLCBzaXplb2YoKnBhcmFtKSwKLQkJCQkJTlVMTCwgMCk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Ci0KLQkJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Ci0JfQotCi0JY2FzZSBGRV9HRVRfRlJPTlRFTkQ6Ci0JCS8qKgotCQkgKiAgdHJpdmlhbCB0byBpbXBsZW1lbnQgKHNlZSBzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZykuCi0JCSAqICBlcXVpdmFsZW50IHRvIEZFX1JFQUQgaW9jdGxzLCBidXQgbmVlZHMKLQkJICogIFRQUyAtPiBsaW51eC1kdmIgcGFyYW1ldGVyIHNldCBjb252ZXJzaW9uLiBGZWVsIGZyZWUKLQkJICogIHRvIGltcGxlbWVudCB0aGlzIGFuZCBzZW5kIHVzIGEgcGF0Y2ggaWYgeW91IG5lZWQgdGhpcwotCQkgKiAgZnVuY3Rpb25hbGl0eS4KLQkJICovCi0JCWJyZWFrOwotCi0JY2FzZSBGRV9HRVRfRVZFTlQ6Ci0JewotCQkvKioKLQkJICogIGZvciBub3cgd2Ugb25seSBmaWxsIHRoZSBzdGF0dXMgZmllbGQuIHRoZSBwYXJhbWV0ZXJzCi0JCSAqICBhcmUgdHJpdmlhbCB0byBmaWxsIGFzIHNvb24gRkVfR0VUX0ZST05URU5EIGlzIGRvbmUuCi0JCSAqLwotCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IF9fdXNlciAqZSA9ICh2b2lkIF9fdXNlciAqKSBhcmc7Ci0JCWlmIChjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID09IDApIHsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gLUVXT1VMREJMT0NLOwotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNpbmVyZ3l0Mi0+cG9sbF93cSwKLQkJCQkJCSBjaW5lcmd5dDItPnBlbmRpbmdfZmVfZXZlbnRzID4gMCk7Ci0JCX0KLQkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyA9IDA7Ci0JCXJldHVybiBjaW5lcmd5dDJfaW9jdGwoaW5vZGUsIGZpbGUsIEZFX1JFQURfU1RBVFVTLAotCQkJCQkodW5zaWduZWQgbG9uZykgJmUtPnN0YXR1cyk7Ci0JfQotCi0JZGVmYXVsdDoKLQkJOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGNpbmVyZ3l0Ml9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKLQlpbnQgcmV0ID0gMDsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9XUklURSB8IFZNX0VYRUMpKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBiYWlsb3V0OwotCX0KLQotCWlmICh2bWEtPnZtX2VuZCA+IHZtYS0+dm1fc3RhcnQgKyBTVFJFQU1fVVJCX0NPVU5UICogU1RSRUFNX0JVRl9TSVpFKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gYmFpbG91dDsKLQl9Ci0KLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0RPTlRDT1BZKTsKLQl2bWEtPnZtX2ZpbGUgPSBmaWxlOwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCSAgICAgIHZpcnRfdG9fcGh5cyhjaW5lcmd5dDItPnN0cmVhbWJ1ZikgPj4gUEFHRV9TSElGVCwKLQkJCSAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KSA/IC1FQUdBSU4gOiAwOwotYmFpbG91dDoKLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2luZXJneXQyX2ZvcHMgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmlvY3RsCQk9IGNpbmVyZ3l0Ml9pb2N0bCwKLQkucG9sbCAgICAgICAgICAgPSBjaW5lcmd5dDJfcG9sbCwKLQkub3BlbiAgICAgICAgICAgPSBjaW5lcmd5dDJfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSBjaW5lcmd5dDJfcmVsZWFzZSwKLQkubW1hcAkJPSBjaW5lcmd5dDJfbW1hcAotfTsKLQotc3RhdGljIHN0cnVjdCBkdmJfZGV2aWNlIGNpbmVyZ3l0Ml9mZV90ZW1wbGF0ZSA9IHsKLQkudXNlcnMgPSB+MCwKLQkud3JpdGVycyA9IDEsCi0JLnJlYWRlcnMgPSAofjApLTEsCi0JLmZvcHMgPSAmY2luZXJneXQyX2ZvcHMKLX07Ci0KLSNpZmRlZiBFTkFCTEVfUkMKLQotc3RhdGljIHZvaWQgY2luZXJneXQyX3F1ZXJ5X3JjIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjaW5lcmd5dDIsIHJjX3F1ZXJ5X3dvcmsud29yayk7Ci0JY2hhciBidWZbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OwotCXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgcmNfZXZlbnRzWzEyXTsKLQlpbnQgbiwgbGVuLCBpOwotCi0JaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nIHx8IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pKQotCQlyZXR1cm47Ci0KLQlsZW4gPSBjaW5lcmd5dDJfY29tbWFuZChjaW5lcmd5dDIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJKGNoYXIgKikgcmNfZXZlbnRzLCBzaXplb2YocmNfZXZlbnRzKSk7Ci0JaWYgKGxlbiA8IDApCi0JCWdvdG8gb3V0OwotCWlmIChsZW4gPT0gMCkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBjaW5lcmd5dDItPmxhc3RfZXZlbnRfamlmZmllcyArCi0JCQkgICAgICAgbXNlY3NfdG9famlmZmllcygxNTApKSkgewotCQkJLyogc3RvcCBrZXkgcmVwZWF0ICovCi0JCQlpZiAoY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCAhPSBLRVlfTUFYKSB7Ci0JCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWQgVXBcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCi0JCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7Ci0JCQkJaW5wdXRfc3luYyhjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7Ci0JCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7Ci0JCQl9Ci0JCQljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IGNwdV90b19sZTMyKH4wKTsKLQkJfQotCQlnb3RvIG91dDsKLQl9Ci0JY2luZXJneXQyLT5sYXN0X2V2ZW50X2ppZmZpZXMgPSBqaWZmaWVzOwotCi0JZm9yIChuID0gMDsgbiA8IChsZW4gLyBzaXplb2YocmNfZXZlbnRzWzBdKSk7IG4rKykgewotCQlkcHJpbnRrKDEsICJyY19ldmVudHNbJWRdLnZhbHVlID0gJXgsIHR5cGU9JXhcbiIsCi0JCQluLCBsZTMyX3RvX2NwdShyY19ldmVudHNbbl0udmFsdWUpLCByY19ldmVudHNbbl0udHlwZSk7Ci0KLQkJaWYgKHJjX2V2ZW50c1tuXS50eXBlID09IENJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAmJgotCQkgICAgcmNfZXZlbnRzW25dLnZhbHVlID09IGNwdV90b19sZTMyKH4wKSkgewotCQkJLyoga2V5cmVwZWF0IGJpdCAtPiBqdXN0IHJlcGVhdCBsYXN0IHJjX2lucHV0X2V2ZW50ICovCi0JCX0gZWxzZSB7Ci0JCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gS0VZX01BWDsKLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJjX2tleXMpOyBpICs9IDMpIHsKLQkJCQlpZiAocmNfa2V5c1tpICsgMF0gPT0gcmNfZXZlbnRzW25dLnR5cGUgJiYKLQkJCQkgICAgcmNfa2V5c1tpICsgMV0gPT0gbGUzMl90b19jcHUocmNfZXZlbnRzW25dLnZhbHVlKSkgewotCQkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gcmNfa2V5c1tpICsgMl07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ICE9IEtFWV9NQVgpIHsKLQkJCWlmIChyY19ldmVudHNbbl0udmFsdWUgPT0gY2luZXJneXQyLT5yY19sYXN0X2NvZGUgJiYKLQkJCSAgICBjaW5lcmd5dDItPnJjX2xhc3RfY29kZSAhPSBjcHVfdG9fbGUzMih+MCkpIHsKLQkJCQkvKiBlbWl0IGEga2V5LXVwIHNvIHRoZSBkb3VibGUgZXZlbnQgaXMgcmVjb2duaXplZCAqLwotCQkJCWRwcmludGsoMSwgInJjX2lucHV0X2V2ZW50PSVkIFVQXG4iLCBjaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50KTsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAotCQkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDApOwotCQkJfQotCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWRcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwotCQkJaW5wdXRfcmVwb3J0X2tleShjaW5lcmd5dDItPnJjX2lucHV0X2RldiwKLQkJCQkJIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQsIDEpOwotCQkJaW5wdXRfc3luYyhjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7Ci0JCQljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IHJjX2V2ZW50c1tuXS52YWx1ZTsKLQkJfQotCX0KLQotb3V0OgotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSQ19RVUVSWV9JTlRFUlZBTCkpOwotCi0JbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneXQyX3JlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JaW50IGk7Ci0JaW50IGVycjsKLQotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaW5wdXRfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXVzYl9tYWtlX3BhdGgoY2luZXJneXQyLT51ZGV2LCBjaW5lcmd5dDItPnBoeXMsIHNpemVvZihjaW5lcmd5dDItPnBoeXMpKTsKLQlzdHJsY2F0KGNpbmVyZ3l0Mi0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoY2luZXJneXQyLT5waHlzKSk7Ci0JY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7Ci0JY2luZXJneXQyLT5yY19sYXN0X2NvZGUgPSBjcHVfdG9fbGUzMih+MCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5X3JjKTsKLQotCWlucHV0X2Rldi0+bmFtZSA9IERSSVZFUl9OQU1FICIgcmVtb3RlIGNvbnRyb2wiOwotCWlucHV0X2Rldi0+cGh5cyA9IGNpbmVyZ3l0Mi0+cGh5czsKLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFUCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfa2V5cyk7IGkgKz0gMykKLQkJc2V0X2JpdChyY19rZXlzW2kgKyAyXSwgaW5wdXRfZGV2LT5rZXliaXQpOwotCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSAwOwotCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IDA7Ci0JaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1VTQjsKLQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGNpbmVyZ3l0Mi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoY2luZXJneXQyLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmY2luZXJneXQyLT51ZGV2LT5kZXY7Ci0KLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JY2luZXJneXQyLT5yY19pbnB1dF9kZXYgPSBpbnB1dF9kZXY7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml91bnJlZ2lzdGVyX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmspOwotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNpbmVyZ3l0Ml9zdXNwZW5kX3JjKHN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MikKLXsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmspOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3Jlc3VtZV9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpCi17Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIEhaLzIpOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIGludCBjaW5lcmd5dDJfcmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2luZXJneXQyX3VucmVnaXN0ZXJfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjaW5lcmd5dDJfc3VzcGVuZF9yYyhzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIGNpbmVyZ3l0Ml9yZXN1bWVfcmMoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKSB7IH0KLQotI2VuZGlmIC8qIEVOQUJMRV9SQyAqLwotCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNpbmVyZ3l0MiwgcXVlcnlfd29yay53b3JrKTsKLQljaGFyIGNtZCBbXSA9IHsgQ0lORVJHWVQyX0VQMV9HRVRfVFVORVJfU1RBVFVTIH07Ci0Jc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgKnMgPSAmY2luZXJneXQyLT5zdGF0dXM7Ci0JdWludDhfdCBsb2NrX2JpdHM7Ci0KLQlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCi0JCXJldHVybjsKLQotCWxvY2tfYml0cyA9IHMtPmxvY2tfYml0czsKLQotCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgY21kLCBzaXplb2YoY21kKSwgKGNoYXIgKikgcywgc2l6ZW9mKCpzKSk7Ci0KLQljaW5lcmd5dDItPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50ICs9Ci0JCWxlMzJfdG9fY3B1KHMtPnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50KTsKLQotCWlmIChsb2NrX2JpdHMgIT0gcy0+bG9ja19iaXRzKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5wb2xsX3dxKTsKLQkJY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cysrOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhRVUVSWV9JTlRFUlZBTCkpOwotCi0JbXV0ZXhfdW5sb2NrKCZjaW5lcmd5dDItPnNlbSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneXQyX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyOwotCWludCBlcnI7Ci0KLQlpZiAoIShjaW5lcmd5dDIgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IGNpbmVyZ3l0MiksIEdGUF9LRVJORUwpKSkgewotCQlkcHJpbnRrKDEsICJvdXQgb2YgbWVtb3J5PyE/XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgKHZvaWQgKikgY2luZXJneXQyKTsKLQotCW11dGV4X2luaXQoJmNpbmVyZ3l0Mi0+c2VtKTsKLQltdXRleF9pbml0KCZjaW5lcmd5dDItPndxX3NlbSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCAoJmNpbmVyZ3l0Mi0+cG9sbF93cSk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5KTsKLQotCWNpbmVyZ3l0Mi0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JY2luZXJneXQyLT5wYXJhbS5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwotCi0JaWYgKGNpbmVyZ3l0Ml9hbGxvY19zdHJlYW1fdXJicyAoY2luZXJneXQyKSA8IDApIHsKLQkJZHByaW50aygxLCAidW5hYmxlIHRvIGFsbG9jYXRlIHN0cmVhbSB1cmJzXG4iKTsKLQkJa2ZyZWUoY2luZXJneXQyKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZXJyID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgRFJJVkVSX05BTUUsCi0JCQkJICAgVEhJU19NT0RVTEUsICZjaW5lcmd5dDItPnVkZXYtPmRldiwKLQkJCQkgICBhZGFwdGVyX25yKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZShjaW5lcmd5dDIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWNpbmVyZ3l0Mi0+ZGVtdXgucHJpdiA9IGNpbmVyZ3l0MjsKLQljaW5lcmd5dDItPmRlbXV4LmZpbHRlcm51bSA9IDI1NjsKLQljaW5lcmd5dDItPmRlbXV4LmZlZWRudW0gPSAyNTY7Ci0JY2luZXJneXQyLT5kZW11eC5zdGFydF9mZWVkID0gY2luZXJneXQyX3N0YXJ0X2ZlZWQ7Ci0JY2luZXJneXQyLT5kZW11eC5zdG9wX2ZlZWQgPSBjaW5lcmd5dDJfc3RvcF9mZWVkOwotCWNpbmVyZ3l0Mi0+ZGVtdXguZG14LmNhcGFiaWxpdGllcyA9IERNWF9UU19GSUxURVJJTkcgfAotCQkJCQkgICAgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwKLQkJCQkJICAgIERNWF9NRU1PUllfQkFTRURfRklMVEVSSU5HOwotCi0JaWYgKChlcnIgPSBkdmJfZG14X2luaXQoJmNpbmVyZ3l0Mi0+ZGVtdXgpKSA8IDApIHsKLQkJZHByaW50aygxLCAiZHZiX2RteF9pbml0KCkgZmFpbGVkIChlcnIgPSAlZClcbiIsIGVycik7Ci0JCWdvdG8gYmFpbG91dDsKLQl9Ci0KLQljaW5lcmd5dDItPmRteGRldi5maWx0ZXJudW0gPSBjaW5lcmd5dDItPmRlbXV4LmZpbHRlcm51bTsKLQljaW5lcmd5dDItPmRteGRldi5kZW11eCA9ICZjaW5lcmd5dDItPmRlbXV4LmRteDsKLQljaW5lcmd5dDItPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwotCi0JaWYgKChlcnIgPSBkdmJfZG14ZGV2X2luaXQoJmNpbmVyZ3l0Mi0+ZG14ZGV2LCAmY2luZXJneXQyLT5hZGFwdGVyKSkgPCAwKSB7Ci0JCWRwcmludGsoMSwgImR2Yl9kbXhkZXZfaW5pdCgpIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBlcnIpOwotCQlnb3RvIGJhaWxvdXQ7Ci0JfQotCi0JaWYgKGR2Yl9uZXRfaW5pdCgmY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5kdmJuZXQsICZjaW5lcmd5dDItPmRlbXV4LmRteCkpCi0JCWRwcmludGsoMSwgImR2Yl9uZXRfaW5pdCgpIGZhaWxlZCFcbiIpOwotCi0JZHZiX3JlZ2lzdGVyX2RldmljZSgmY2luZXJneXQyLT5hZGFwdGVyLCAmY2luZXJneXQyLT5mZWRldiwKLQkJCSAgICAmY2luZXJneXQyX2ZlX3RlbXBsYXRlLCBjaW5lcmd5dDIsCi0JCQkgICAgRFZCX0RFVklDRV9GUk9OVEVORCk7Ci0KLQllcnIgPSBjaW5lcmd5dDJfcmVnaXN0ZXJfcmMoY2luZXJneXQyKTsKLQlpZiAoZXJyKQotCQlnb3RvIGJhaWxvdXQ7Ci0KLQlyZXR1cm4gMDsKLQotYmFpbG91dDoKLQlkdmJfbmV0X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZHZibmV0KTsKLQlkdmJfZG14ZGV2X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZG14ZGV2KTsKLQlkdmJfZG14X3JlbGVhc2UoJmNpbmVyZ3l0Mi0+ZGVtdXgpOwotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlcik7Ci0JY2luZXJneXQyX2ZyZWVfc3RyZWFtX3VyYnMoY2luZXJneXQyKTsKLQlrZnJlZShjaW5lcmd5dDIpOwotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfZGlzY29ubmVjdCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0KLQljaW5lcmd5dDJfdW5yZWdpc3Rlcl9yYyhjaW5lcmd5dDIpOwotCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yayk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnBvbGxfd3EpOwotCi0JY2luZXJneXQyLT5kZW11eC5kbXguY2xvc2UoJmNpbmVyZ3l0Mi0+ZGVtdXguZG14KTsKLQljaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZyA9IDE7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZjaW5lcmd5dDItPmludXNlKSkKLQkJY2luZXJneXQyX3VucmVnaXN0ZXIoY2luZXJneXQyKTsKLX0KLQotc3RhdGljIGludCBjaW5lcmd5dDJfc3VzcGVuZCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQotCWlmIChjaW5lcmd5dDItPmRpc2Nvbm5lY3RfcGVuZGluZykKLQkJcmV0dXJuIC1FQUdBSU47Ci0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT53cV9zZW0pKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JY2luZXJneXQyX3N1c3BlbmRfcmMoY2luZXJneXQyKTsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZjaW5lcmd5dDItPnF1ZXJ5X3dvcmspOwotCi0JbXV0ZXhfbG9jaygmY2luZXJneXQyLT5zZW0pOwotCWlmIChjaW5lcmd5dDItPnN0cmVhbWluZykKLQkJY2luZXJneXQyX3N0b3Bfc3RyZWFtX3hmZXIoY2luZXJneXQyKTsKLQljaW5lcmd5dDJfc2xlZXAoY2luZXJneXQyLCAxKTsKLQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKLQotCW11dGV4X3VubG9jaygmY2luZXJneXQyLT53cV9zZW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneXQyX3Jlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0Jc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnICpwYXJhbSA9ICZjaW5lcmd5dDItPnBhcmFtOwotCWludCBlcnIgPSAtRUFHQUlOOwotCi0JaWYgKGNpbmVyZ3l0Mi0+ZGlzY29ubmVjdF9wZW5kaW5nKQotCQlnb3RvIG91dDsKLQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNpbmVyZ3l0Mi0+d3Ffc2VtKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2luZXJneXQyLT5zZW0pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VubG9jazE7Ci0KLQlpZiAoIWNpbmVyZ3l0Mi0+c2xlZXBpbmcpIHsKLQkJY2luZXJneXQyX3NsZWVwKGNpbmVyZ3l0MiwgMCk7Ci0JCWNpbmVyZ3l0Ml9jb21tYW5kKGNpbmVyZ3l0MiwgKGNoYXIgKikgcGFyYW0sIHNpemVvZigqcGFyYW0pLCBOVUxMLCAwKTsKLQkJaWYgKGNpbmVyZ3l0Mi0+c3RyZWFtaW5nKQotCQkJY2luZXJneXQyX3N0YXJ0X3N0cmVhbV94ZmVyKGNpbmVyZ3l0Mik7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBIWi8yKTsKLQl9Ci0KLQljaW5lcmd5dDJfcmVzdW1lX3JjKGNpbmVyZ3l0Mik7Ci0KLQltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKLW91dF91bmxvY2sxOgotCW11dGV4X3VubG9jaygmY2luZXJneXQyLT53cV9zZW0pOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBjaW5lcmd5dDJfdGFibGUgW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwMzgpIH0sCi0JeyAwIH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBjaW5lcmd5dDJfdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY2luZXJneXQyX2RyaXZlciA9IHsKLQkubmFtZQk9ICJjaW5lcmd5VDIiLAotCS5wcm9iZQk9IGNpbmVyZ3l0Ml9wcm9iZSwKLQkuZGlzY29ubmVjdAk9IGNpbmVyZ3l0Ml9kaXNjb25uZWN0LAotCS5zdXNwZW5kCT0gY2luZXJneXQyX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBjaW5lcmd5dDJfcmVzdW1lLAotCS5pZF90YWJsZQk9IGNpbmVyZ3l0Ml90YWJsZQotfTsKLQotc3RhdGljIGludCBfX2luaXQgY2luZXJneXQyX2luaXQgKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gdXNiX3JlZ2lzdGVyKCZjaW5lcmd5dDJfZHJpdmVyKSkgPCAwKQotCQlkcHJpbnRrKDEsICJ1c2JfcmVnaXN0ZXIoKSBmYWlsZWQhIChlcnIgJWkpXG4iLCBlcnIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNpbmVyZ3l0Ml9leGl0ICh2b2lkKQotewotCXVzYl9kZXJlZ2lzdGVyKCZjaW5lcmd5dDJfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQgKGNpbmVyZ3l0Ml9pbml0KTsKLW1vZHVsZV9leGl0IChjaW5lcmd5dDJfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhvbGdlciBXYWVjaHRsZXIsIERhbmllbCBNYWNrIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzIzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZwpAQCAtMCwwICsxLDE4IEBACitjb25maWcgRFZCX0RNMTEwNQorCXRyaXN0YXRlICJTRE1DIERNMTEwNSBiYXNlZCBQQ0kgY2FyZHMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCisJc2VsZWN0IERWQl9QTEwgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUVjAyODggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUQjYwMDAgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX0NYMjQxMTYgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NJMjFYWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGNhcmRzIGJhc2VkIG9uIHRoZSBTRE1DIERNMTEwNSBQQ0kgY2hpcCBsaWtlCisJICBEdmJXb3JsZCAyMDAyCisKKwkgIFNpbmNlIHRoZXNlIGNhcmRzIGhhdmUgbm8gTVBFRyBkZWNvZGVyIG9uYm9hcmQsIHRoZXkgdHJhbnNtaXQKKwkgIG9ubHkgY29tcHJlc3NlZCBNUEVHIGRhdGEgb3ZlciB0aGUgUENJIGJ1cywgc28geW91IG5lZWQKKwkgIGFuIGV4dGVybmFsIHNvZnR3YXJlIGRlY29kZXIgdG8gd2F0Y2ggVFYgb24geW91ciBjb21wdXRlci4KKworCSAgU2F5IFkgb3IgTSBpZiB5b3Ugb3duIHN1Y2ggYSBkZXZpY2UgYW5kIHdhbnQgdG8gdXNlIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmotJChDT05GSUdfRFZCX0RNMTEwNSkgKz0gZG0xMTA1Lm8KKworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvZG0xMTA1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvZG0xMTA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMjE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9kbTExMDUuYwpAQCAtMCwwICsxLDkxMSBAQAorLyoKKyAqIGRtMTEwNS5jIC0gZHJpdmVyIGZvciBEVkIgY2FyZHMgYmFzZWQgb24gU0RNQyBETTExMDUgUENJIGNoaXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSWdvciBNLiBMaXBsaWFuaW4gPGxpcGxpYW5pbkBtZS5ieT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KKworI2luY2x1ZGUgImRlbXV4LmgiCisjaW5jbHVkZSAiZG14ZGV2LmgiCisjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiZHZiX25ldC5oIgorI2luY2x1ZGUgImR2YmRldi5oIgorI2luY2x1ZGUgImR2Yi1wbGwuaCIKKworI2luY2x1ZGUgInN0djAyOTkuaCIKKyNpbmNsdWRlICJzdHYwMjg4LmgiCisjaW5jbHVkZSAic3RiNjAwMC5oIgorI2luY2x1ZGUgInNpMjF4eC5oIgorI2luY2x1ZGUgImN4MjQxMTYuaCIKKyNpbmNsdWRlICJ6MDE5NGEuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBQQ0kgSUQncworICovCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVFJJR0VNCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFJJR0VNCTB4MTA5ZgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRE0xMTA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRE0xMTA1CTB4MDM2ZgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRFcyMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRFcyMDAyCTB4MjAwMgorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRFcyMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRFcyMDA0CTB4MjAwNAorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2RtYyBkbTExMDUgcmVnaXN0ZXJzICovCisKKy8qIFRTIENvbnRyb2wgKi8KKyNkZWZpbmUgRE0xMTA1X1RTQ1RSCQkJCTB4MDAKKyNkZWZpbmUgRE0xMTA1X0RUQUxFTlRICQkJCTB4MDQKKworLyogR1BJTyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgRE0xMTA1X0dQSU9WQUwJCQkJMHgwOAorI2RlZmluZSBETTExMDVfR1BJT0NUUgkJCQkweDBjCisKKy8qIFBJRCBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIERNMTEwNV9QSUROCQkJCTB4MTAKKworLyogT2RkLWV2ZW4gc2VjcmV0IGtleSBzZWxlY3QgKi8KKyNkZWZpbmUgRE0xMTA1X0NXU0VMCQkJCTB4MTQKKworLyogSG9zdCBDb21tYW5kIEludGVyZmFjZSAqLworI2RlZmluZSBETTExMDVfSE9TVF9DVFIJCQkJMHgxOAorI2RlZmluZSBETTExMDVfSE9TVF9BRAkJCQkweDFjCisKKy8qIFBDSSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgRE0xMTA1X0NSCQkJCTB4MzAKKyNkZWZpbmUgRE0xMTA1X1JTVAkJCQkweDM0CisjZGVmaW5lIERNMTEwNV9TVEFEUgkJCQkweDM4CisjZGVmaW5lIERNMTEwNV9STEVOCQkJCTB4M2MKKyNkZWZpbmUgRE0xMTA1X1dSUAkJCQkweDQwCisjZGVmaW5lIERNMTEwNV9JTlRDTlQJCQkJMHg0NAorI2RlZmluZSBETTExMDVfSU5UTUFLCQkJCTB4NDgKKyNkZWZpbmUgRE0xMTA1X0lOVFNUUwkJCQkweDRjCisKKy8qIENXIFZhbHVlICovCisjZGVmaW5lIERNMTEwNV9PREQJCQkJMHg1MAorI2RlZmluZSBETTExMDVfRVZFTgkJCQkweDU4CisKKy8qIFBJRCBWYWx1ZSAqLworI2RlZmluZSBETTExMDVfUElECQkJCTB4NjAKKworLyogSVIgQ29udHJvbCAqLworI2RlZmluZSBETTExMDVfSVJDVFIJCQkJMHg2NAorI2RlZmluZSBETTExMDVfSVJNT0RFCQkJCTB4NjgKKyNkZWZpbmUgRE0xMTA1X1NZU1RFTUNPREUJCQkweDZjCisjZGVmaW5lIERNMTEwNV9JUkNPREUJCQkJMHg3MAorCisvKiBVbmtub3duIFZhbHVlcyAqLworI2RlZmluZSBETTExMDVfRU5DUllQVAkJCQkweDc0CisjZGVmaW5lIERNMTEwNV9WRVIJCQkJMHg3YworCisvKiBJMkMgSW50ZXJmYWNlICovCisjZGVmaW5lIERNMTEwNV9JMkNDVFIJCQkJMHg4MAorI2RlZmluZSBETTExMDVfSTJDU1RTCQkJCTB4ODEKKyNkZWZpbmUgRE0xMTA1X0kyQ0RBVAkJCQkweDgyCisjZGVmaW5lIERNMTEwNV9JMkNfUkEJCQkJMHg4MworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEludGVycnVwdCBNYXNrIEJpdHMgKi8KKworI2RlZmluZSBJTlRNQUtfVFNJUlFNCQkJCTB4MDEKKyNkZWZpbmUgSU5UTUFLX0hJUlFNCQkJCTB4MDQKKyNkZWZpbmUgSU5UTUFLX0lSTQkJCQkweDA4CisjZGVmaW5lIElOVE1BS19BTExNQVNLCQkJCShJTlRNQUtfVFNJUlFNIHwgXAorCQkJCQkJSU5UTUFLX0hJUlFNIHwgXAorCQkJCQkJSU5UTUFLX0lSTSkKKyNkZWZpbmUgSU5UTUFLX05PTkVNQVNLCQkJCTB4MDAKKworLyogSW50ZXJydXB0IFN0YXR1cyBCaXRzICovCisjZGVmaW5lIElOVFNUU19UU0lSUQkJCQkweDAxCisjZGVmaW5lIElOVFNUU19ISVJRCQkJCTB4MDQKKyNkZWZpbmUgSU5UU1RTX0lSCQkJCTB4MDgKKworLyogSVIgQ29udHJvbCBCaXRzICovCisjZGVmaW5lIERNMTEwNV9JUl9FTgkJCQkweDAxCisjZGVmaW5lIERNMTEwNV9TWVNfQ0hLCQkJCTB4MDIKKyNkZWZpbmUgRE0xMTA1X1JFUF9GTEcJCQkJMHgwOAorCisvKiBFRVBST00gYWRkciAqLworI2RlZmluZSBJSUNfMjRDMDFfYWRkcgkJCQkweGEwCisvKiBNYXggYm9hcmQgY291bnQgKi8KKyNkZWZpbmUgRE0xMTA1X01BWAkJCQkweDA0CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCQkJImRtMTEwNSIKKworI2RlZmluZSBETTExMDVfRE1BX1BBQ0tFVFMJCQk0NworI2RlZmluZSBETTExMDVfRE1BX1BBQ0tFVF9MRU5HVEgJCSgxMjgqNCkKKyNkZWZpbmUgRE0xMTA1X0RNQV9CWVRFUwkJCSgxMjggKiA0ICogRE0xMTA1X0RNQV9QQUNLRVRTKQorCisvKiBHUElPJ3MgZm9yIExOQiBwb3dlciBjb250cm9sICovCisjZGVmaW5lIERNMTEwNV9MTkJfTUFTSwkJCQkweDAwMDAwMDAwCisjZGVmaW5lIERNMTEwNV9MTkJfMTNWCQkJCTB4MDAwMTAxMDAKKyNkZWZpbmUgRE0xMTA1X0xOQl8xOFYJCQkJMHgwMDAwMDEwMAorCitzdGF0aWMgaW50IGlyX2RlYnVnOworbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIElSIGRlY29kaW5nIik7CisKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCitzdGF0aWMgdTE2IGlyX2NvZGVzX2RtMTEwNV9uZWNbMTI4XSA9IHsKKwlbMHgwYV0gPSBLRVlfUSwJCS8qcG93ZXIqLworCVsweDBjXSA9IEtFWV9NLAkJLyptdXRlKi8KKwlbMHgxMV0gPSBLRVlfMSwKKwlbMHgxMl0gPSBLRVlfMiwKKwlbMHgxM10gPSBLRVlfMywKKwlbMHgxNF0gPSBLRVlfNCwKKwlbMHgxNV0gPSBLRVlfNSwKKwlbMHgxNl0gPSBLRVlfNiwKKwlbMHgxN10gPSBLRVlfNywKKwlbMHgxOF0gPSBLRVlfOCwKKwlbMHgxOV0gPSBLRVlfOSwKKwlbMHgxMF0gPSBLRVlfMCwKKwlbMHgxY10gPSBLRVlfUEFHRVVQLAkvKmNoKyovCisJWzB4MGZdID0gS0VZX1BBR0VET1dOLAkvKmNoLSovCisJWzB4MWFdID0gS0VZX08sCQkvKnZvbCsqLworCVsweDBlXSA9IEtFWV9aLAkJLyp2b2wtKi8KKwlbMHgwNF0gPSBLRVlfUiwJCS8qcmVjKi8KKwlbMHgwOV0gPSBLRVlfRCwJCS8qZmF2Ki8KKwlbMHgwOF0gPSBLRVlfQkFDS1NQQUNFLAkvKnJld2luZCovCisJWzB4MDddID0gS0VZX0EsCQkvKmZhc3QqLworCVsweDBiXSA9IEtFWV9QLAkJLypwYXVzZSovCisJWzB4MDJdID0gS0VZX0VTQywJLypjYW5jZWwqLworCVsweDAzXSA9IEtFWV9HLAkJLyp0YWIqLworCVsweDAwXSA9IEtFWV9VUCwJLyp1cCovCisJWzB4MWZdID0gS0VZX0VOVEVSLAkvKm9rKi8KKwlbMHgwMV0gPSBLRVlfRE9XTiwJLypkb3duKi8KKwlbMHgwNV0gPSBLRVlfQywJCS8qY2FwKi8KKwlbMHgwNl0gPSBLRVlfUywJCS8qc3RvcCovCisJWzB4NDBdID0gS0VZX0YsCQkvKmZ1bGwqLworCVsweDFlXSA9IEtFWV9XLAkJLyp0dm1vZGUqLworCVsweDFiXSA9IEtFWV9CLAkJLypyZWNhbGwqLworfTsKKworLyogaW5mcmFyZWQgcmVtb3RlIGNvbnRyb2wgKi8KK3N0cnVjdCBpbmZyYXJlZCB7CisJdTE2CWtleV9tYXBbMTI4XTsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CisJY2hhcgkJCWlucHV0X3BoeXNbMzJdOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlpcl90YXNrbGV0OworCXUzMgkJCWlyX2NvbW1hbmQ7Cit9OworCitzdHJ1Y3QgZG0xMTA1ZHZiIHsKKwkvKiBwY2kgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1OCBfX2lvbWVtICppb19tZW07CisKKwkvKiBpciAqLworCXN0cnVjdCBpbmZyYXJlZCBpcjsKKworCS8qIGR2YiAqLworCXN0cnVjdCBkbXhfZnJvbnRlbmQgaHdfZnJvbnRlbmQ7CisJc3RydWN0IGRteF9mcm9udGVuZCBtZW1fZnJvbnRlbmQ7CisJc3RydWN0IGRteGRldiBkbXhkZXY7CisJc3RydWN0IGR2Yl9hZGFwdGVyIGR2Yl9hZGFwdGVyOworCXN0cnVjdCBkdmJfZGVtdXggZGVtdXg7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisJc3RydWN0IGR2Yl9uZXQgZHZibmV0OworCXVuc2lnbmVkIGludCBmdWxsX3RzX3VzZXJzOworCisJLyogaTJjICovCisJc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOworCisJLyogZG1hICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1bnNpZ25lZCBjaGFyICp0c19idWY7CisJdTMyIHdycDsKKwl1MzIgYnVmZmVyX3NpemU7CisJdW5zaWduZWQgaW50CVBhY2tldEVycm9yQ291bnQ7CisJdW5zaWduZWQgaW50IGRtYXJzdDsKKwlzcGlubG9ja190IGxvY2s7CisKK307CisKKyNkZWZpbmUgZG1faW9fbWVtKHJlZykJKCh1bnNpZ25lZCBsb25nKSgmZG0xMTA1ZHZiLT5pb19tZW1bcmVnXSkpCisKK3N0YXRpYyBzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmJfbG9jYWw7CisKK3N0YXRpYyBpbnQgZG0xMTA1X2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCQkgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiIDsKKworCWludCBhZGRyLCByYywgaSwgaiwgaywgbGVuLCBieXRlLCBkYXRhOworCXU4IHN0YXR1czsKKworCWRtMTEwNWR2YiA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCW91dGIoMHgwMCwgZG1faW9fbWVtKERNMTEwNV9JMkNDVFIpKTsKKwkJaWYgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJLyogcmVhZCBieXRlcyAqLworCQkJYWRkciAgPSBtc2dzW2ldLmFkZHIgPDwgMTsKKwkJCWFkZHIgfD0gMTsKKwkJCW91dGIoYWRkciwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQpKTsKKwkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQorCQkJCW91dGIoMCwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQgKyBieXRlICsgMSkpOworCisJCQlvdXRiKDB4ODEgKyBtc2dzW2ldLmxlbiwgZG1faW9fbWVtKERNMTEwNV9JMkNDVFIpKTsKKwkJCWZvciAoaiA9IDA7IGogPCA1NTsgaisrKSB7CisJCQkJbWRlbGF5KDEwKTsKKwkJCQlzdGF0dXMgPSBpbmIoZG1faW9fbWVtKERNMTEwNV9JMkNTVFMpKTsKKwkJCQlpZiAoKHN0YXR1cyAmIDB4YzApID09IDB4NDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGogPj0gNTUpCisJCQkJcmV0dXJuIC0xOworCisJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykgeworCQkJCXJjID0gaW5iKGRtX2lvX21lbShETTExMDVfSTJDREFUICsgYnl0ZSArIDEpKTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlnb3RvIGVycjsKKwkJCQltc2dzW2ldLmJ1ZltieXRlXSA9IHJjOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChtc2dzW2ldLmJ1ZlswXSA9PSAweGY3KSAmJiAobXNnc1tpXS5hZGRyID09IDB4NTUpKSB7CisJCQkJLyogcHJlcGFpcmVkIGZvciBjeDI0MTE2IGZpcm13YXJlICovCisJCQkJLyogV3JpdGUgaW4gc21hbGwgYmxvY2tzICovCisJCQkJbGVuID0gbXNnc1tpXS5sZW4gLSAxOworCQkJCWsgPSAxOworCQkJCWRvIHsKKwkJCQkJb3V0Yihtc2dzW2ldLmFkZHIgPDwgMSwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQpKTsKKwkJCQkJb3V0YigweGY3LCBkbV9pb19tZW0oRE0xMTA1X0kyQ0RBVCArIDEpKTsKKwkJCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IChsZW4gPiA0OCA/IDQ4IDogbGVuKTsgYnl0ZSsrKSB7CisJCQkJCQlkYXRhID0gbXNnc1tpXS5idWZbaytieXRlXTsKKwkJCQkJCW91dGIoZGF0YSwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQgKyBieXRlICsgMikpOworCQkJCQl9CisJCQkJCW91dGIoMHg4MiArIChsZW4gPiA0OCA/IDQ4IDogbGVuKSwgZG1faW9fbWVtKERNMTEwNV9JMkNDVFIpKTsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDI1OyBqKyspIHsKKwkJCQkJCW1kZWxheSgxMCk7CisJCQkJCQlzdGF0dXMgPSBpbmIoZG1faW9fbWVtKERNMTEwNV9JMkNTVFMpKTsKKwkJCQkJCWlmICgoc3RhdHVzICYgMHhjMCkgPT0gMHg0MCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChqID49IDI1KQorCQkJCQkJcmV0dXJuIC0xOworCisJCQkJCWsgKz0gNDg7CisJCQkJCWxlbiAtPSA0ODsKKwkJCQl9IHdoaWxlIChsZW4gPiAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogd3JpdGUgYnl0ZXMgKi8KKwkJCQlvdXRiKG1zZ3NbaV0uYWRkcjw8MSwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQpKTsKKwkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykgeworCQkJCQlkYXRhID0gbXNnc1tpXS5idWZbYnl0ZV07CisJCQkJCW91dGIoZGF0YSwgZG1faW9fbWVtKERNMTEwNV9JMkNEQVQgKyBieXRlICsgMSkpOworCQkJCX0KKwkJCQlvdXRiKDB4ODEgKyBtc2dzW2ldLmxlbiwgZG1faW9fbWVtKERNMTEwNV9JMkNDVFIpKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMjU7IGorKykgeworCQkJCQltZGVsYXkoMTApOworCQkJCQlzdGF0dXMgPSBpbmIoZG1faW9fbWVtKERNMTEwNV9JMkNTVFMpKTsKKwkJCQkJaWYgKChzdGF0dXMgJiAweGMwKSA9PSAweDQwKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKGogPj0gMjUpCisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnVtOworIGVycjoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1MzIgZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGRtMTEwNV9hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gZG0xMTA1X2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZnVuY3Rpb25hbGl0eSwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRtMTEwNWR2YiAqZmVlZF90b19kbTExMDVkdmIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVlZC0+ZGVtdXgsIHN0cnVjdCBkbTExMDVkdmIsIGRlbXV4KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG0xMTA1ZHZiICpmcm9udGVuZF90b19kbTExMDVkdmIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZS0+ZHZiLCBzdHJ1Y3QgZG0xMTA1ZHZiLCBkdmJfYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbnQgZG0xMTA1ZHZiX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCit7CisJc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiID0gZnJvbnRlbmRfdG9fZG0xMTA1ZHZiKGZlKTsKKworCQlpZiAodm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCkgeworCQkJb3V0bChETTExMDVfTE5CX01BU0ssIGRtX2lvX21lbShETTExMDVfR1BJT0NUUikpOworCQkJb3V0bChETTExMDVfTE5CXzE4ViwgZG1faW9fbWVtKERNMTEwNV9HUElPVkFMKSk7CisJCX0gZWxzZQl7CisJCS8qTE5CIE9OLTEzViBieSBkZWZhdWx0ISovCisJCQlvdXRsKERNMTEwNV9MTkJfTUFTSywgZG1faW9fbWVtKERNMTEwNV9HUElPQ1RSKSk7CisJCQlvdXRsKERNMTEwNV9MTkJfMTNWLCBkbV9pb19tZW0oRE0xMTA1X0dQSU9WQUwpKTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtMTEwNWR2Yl9zZXRfZG1hX2FkZHIoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiKQoreworCW91dGwoY3B1X3RvX2xlMzIoZG0xMTA1ZHZiLT5kbWFfYWRkciksIGRtX2lvX21lbShETTExMDVfU1RBRFIpKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZG0xMTA1ZHZiX2RtYV9tYXAoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiKQoreworCWRtMTEwNWR2Yi0+dHNfYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZG0xMTA1ZHZiLT5wZGV2LCA2KkRNMTEwNV9ETUFfQllURVMsICZkbTExMDVkdmItPmRtYV9hZGRyKTsKKworCXJldHVybiBwY2lfZG1hX21hcHBpbmdfZXJyb3IoZG0xMTA1ZHZiLT5wZGV2LCBkbTExMDVkdmItPmRtYV9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgZG0xMTA1ZHZiX2RtYV91bm1hcChzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmIpCit7CisJcGNpX2ZyZWVfY29uc2lzdGVudChkbTExMDVkdmItPnBkZXYsIDYqRE0xMTA1X0RNQV9CWVRFUywgZG0xMTA1ZHZiLT50c19idWYsIGRtMTEwNWR2Yi0+ZG1hX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZG0xMTA1ZHZiX2VuYWJsZV9pcnFzKHN0cnVjdCBkbTExMDVkdmIgKmRtMTEwNWR2YikKK3sKKwlvdXRiKElOVE1BS19BTExNQVNLLCBkbV9pb19tZW0oRE0xMTA1X0lOVE1BSykpOworCW91dGIoMSwgZG1faW9fbWVtKERNMTEwNV9DUikpOworfQorCitzdGF0aWMgdm9pZCBkbTExMDVkdmJfZGlzYWJsZV9pcnFzKHN0cnVjdCBkbTExMDVkdmIgKmRtMTEwNWR2YikKK3sKKwlvdXRiKElOVE1BS19JUk0sIGRtX2lvX21lbShETTExMDVfSU5UTUFLKSk7CisJb3V0YigwLCBkbV9pb19tZW0oRE0xMTA1X0NSKSk7Cit9CisKK3N0YXRpYyBpbnQgZG0xMTA1ZHZiX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmKQoreworCXN0cnVjdCBkbTExMDVkdmIgKmRtMTEwNWR2YiA9IGZlZWRfdG9fZG0xMTA1ZHZiKGYpOworCisJaWYgKGRtMTEwNWR2Yi0+ZnVsbF90c191c2VycysrID09IDApCisJCWRtMTEwNWR2Yl9lbmFibGVfaXJxcyhkbTExMDVkdmIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG0xMTA1ZHZiX3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYpCit7CisJc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiID0gZmVlZF90b19kbTExMDVkdmIoZik7CisKKwlpZiAoLS1kbTExMDVkdmItPmZ1bGxfdHNfdXNlcnMgPT0gMCkKKwkJZG0xMTA1ZHZiX2Rpc2FibGVfaXJxcyhkbTExMDVkdmIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGlyIHRhc2tsZXQgKi8KK3N0YXRpYyB2b2lkIGRtMTEwNV9lbWl0X2tleSh1bnNpZ25lZCBsb25nIHBhcm0pCit7CisJc3RydWN0IGluZnJhcmVkICppciA9IChzdHJ1Y3QgaW5mcmFyZWQgKikgcGFybTsKKwl1MzIgaXJjb20gPSBpci0+aXJfY29tbWFuZDsKKwl1OCBkYXRhOworCXUxNiBrZXljb2RlOworCisJZGF0YSA9IChpcmNvbSA+PiA4KSAmIDB4N2Y7CisKKwlpbnB1dF9ldmVudChpci0+aW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19SQVcsICgweDAwMDBmOCA8PCAxNikgfCBkYXRhKTsKKwlpbnB1dF9ldmVudChpci0+aW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBkYXRhKTsKKwlrZXljb2RlID0gaXItPmtleV9tYXBbZGF0YV07CisKKwlpZiAoIWtleWNvZGUpCisJCXJldHVybjsKKworCWlucHV0X2V2ZW50KGlyLT5pbnB1dF9kZXYsIEVWX0tFWSwga2V5Y29kZSwgMSk7CisJaW5wdXRfc3luYyhpci0+aW5wdXRfZGV2KTsKKwlpbnB1dF9ldmVudChpci0+aW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDApOworCWlucHV0X3N5bmMoaXItPmlucHV0X2Rldik7CisKK30KKworc3RhdGljIGlycXJldHVybl90IGRtMTEwNWR2Yl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkbTExMDVkdmIgKmRtMTEwNWR2YiA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgcGllY2U7CisJdW5zaWduZWQgaW50IG5icGFja2V0czsKKwl1MzIgY29tbWFuZDsKKwl1MzIgbmV4dHdycDsKKwl1MzIgb2xkd3JwOworCisJLyogUmVhZC1Xcml0ZSBJTlNUUyBBY2sncyBJbnRlcnJ1cHQgZm9yIERNMTEwNSBjaGlwIDE2LjAzLjIwMDggKi8KKwl1bnNpZ25lZCBpbnQgaW50c3RzID0gaW5iKGRtX2lvX21lbShETTExMDVfSU5UU1RTKSk7CisJb3V0YihpbnRzdHMsIGRtX2lvX21lbShETTExMDVfSU5UU1RTKSk7CisKKwlzd2l0Y2ggKGludHN0cykgeworCWNhc2UgSU5UU1RTX1RTSVJROgorCWNhc2UgKElOVFNUU19UU0lSUSB8IElOVFNUU19JUik6CisJCW5leHR3cnAgPSBpbmwoZG1faW9fbWVtKERNMTEwNV9XUlApKSAtCisJCQlpbmwoZG1faW9fbWVtKERNMTEwNV9TVEFEUikpIDsKKwkJb2xkd3JwID0gZG0xMTA1ZHZiLT53cnA7CisJCXNwaW5fbG9jaygmZG0xMTA1ZHZiLT5sb2NrKTsKKwkJaWYgKCEoKGRtMTEwNWR2Yi0+dHNfYnVmW29sZHdycF0gPT0gMHg0NykgJiYKKwkJCQkoZG0xMTA1ZHZiLT50c19idWZbb2xkd3JwICsgMTg4XSA9PSAweDQ3KSAmJgorCQkJCShkbTExMDVkdmItPnRzX2J1ZltvbGR3cnAgKyAxODggKiAyXSA9PSAweDQ3KSkpIHsKKwkJCWRtMTEwNWR2Yi0+UGFja2V0RXJyb3JDb3VudCsrOworCQkJLyogYmFkIHBhY2tldCBmb3VuZCAqLworCQkJaWYgKChkbTExMDVkdmItPlBhY2tldEVycm9yQ291bnQgPj0gMikgJiYKKwkJCQkJKGRtMTEwNWR2Yi0+ZG1hcnN0ID09IDApKSB7CisJCQkJb3V0YigxLCBkbV9pb19tZW0oRE0xMTA1X1JTVCkpOworCQkJCWRtMTEwNWR2Yi0+d3JwID0gMDsKKwkJCQlkbTExMDVkdmItPlBhY2tldEVycm9yQ291bnQgPSAwOworCQkJCWRtMTEwNWR2Yi0+ZG1hcnN0ID0gMDsKKwkJCQlzcGluX3VubG9jaygmZG0xMTA1ZHZiLT5sb2NrKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0KKwkJaWYgKG5leHR3cnAgPCBvbGR3cnApIHsKKwkJCXBpZWNlID0gZG0xMTA1ZHZiLT5idWZmZXJfc2l6ZSAtIG9sZHdycDsKKwkJCW1lbWNweShkbTExMDVkdmItPnRzX2J1ZiArIGRtMTEwNWR2Yi0+YnVmZmVyX3NpemUsIGRtMTEwNWR2Yi0+dHNfYnVmLCBuZXh0d3JwKTsKKwkJCW5icGFja2V0cyA9IChwaWVjZSArIG5leHR3cnApLzE4ODsKKwkJfSBlbHNlCXsKKwkJCW5icGFja2V0cyA9IChuZXh0d3JwIC0gb2xkd3JwKS8xODg7CisJCX0KKwkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKCZkbTExMDVkdmItPmRlbXV4LCAmZG0xMTA1ZHZiLT50c19idWZbb2xkd3JwXSwgbmJwYWNrZXRzKTsKKwkJZG0xMTA1ZHZiLT53cnAgPSBuZXh0d3JwOworCQlzcGluX3VubG9jaygmZG0xMTA1ZHZiLT5sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRTVFNfSVI6CisJCWNvbW1hbmQgPSBpbmwoZG1faW9fbWVtKERNMTEwNV9JUkNPREUpKTsKKwkJaWYgKGlyX2RlYnVnKQorCQkJcHJpbnRrKCJkbTExMDU6IHJlY2VpdmVkIGJ5dGUgMHglMDR4XG4iLCBjb21tYW5kKTsKKworCQlkbTExMDVkdmItPmlyLmlyX2NvbW1hbmQgPSBjb21tYW5kOworCQl0YXNrbGV0X3NjaGVkdWxlKCZkbTExMDVkdmItPmlyLmlyX3Rhc2tsZXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworCisKK30KKworLyogcmVnaXN0ZXIgd2l0aCBpbnB1dCBsYXllciAqLworc3RhdGljIHZvaWQgaW5wdXRfcmVnaXN0ZXJfa2V5cyhzdHJ1Y3QgaW5mcmFyZWQgKmlyKQoreworCWludCBpOworCisJbWVtc2V0KGlyLT5pbnB1dF9kZXYtPmtleWJpdCwgMCwgc2l6ZW9mKGlyLT5pbnB1dF9kZXYtPmtleWJpdCkpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXItPmtleV9tYXApOyBpKyspCisJCQlzZXRfYml0KGlyLT5rZXlfbWFwW2ldLCBpci0+aW5wdXRfZGV2LT5rZXliaXQpOworCisJaXItPmlucHV0X2Rldi0+a2V5Y29kZSA9IGlyLT5rZXlfbWFwOworCWlyLT5pbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKGlyLT5rZXlfbWFwWzBdKTsKKwlpci0+aW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShpci0+a2V5X21hcCk7Cit9CisKK2ludCBfX2RldmluaXQgZG0xMTA1X2lyX2luaXQoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1KQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyOworCisJZG0xMTA1ZHZiX2xvY2FsID0gZG0xMTA1OworCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZG0xMTA1LT5pci5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJc25wcmludGYoZG0xMTA1LT5pci5pbnB1dF9waHlzLCBzaXplb2YoZG0xMTA1LT5pci5pbnB1dF9waHlzKSwKKwkJInBjaS0lcy9pcjAiLCBwY2lfbmFtZShkbTExMDUtPnBkZXYpKTsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlpbnB1dF9kZXYtPm5hbWUgPSAiRFZCIG9uLWNhcmQgSVIgcmVjZWl2ZXIiOworCisJaW5wdXRfZGV2LT5waHlzID0gZG0xMTA1LT5pci5pbnB1dF9waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMjsKKwlpZiAoZG0xMTA1LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKSB7CisJCWlucHV0X2Rldi0+aWQudmVuZG9yID0gZG0xMTA1LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBkbTExMDUtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJfSBlbHNlIHsKKwkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBkbTExMDUtPnBkZXYtPnZlbmRvcjsKKwkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gZG0xMTA1LT5wZGV2LT5kZXZpY2U7CisJfQorCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZkbTExMDUtPnBkZXYtPmRldjsKKwkvKiBpbml0aWFsIGtleW1hcCAqLworCW1lbWNweShkbTExMDUtPmlyLmtleV9tYXAsIGlyX2NvZGVzX2RtMTEwNV9uZWMsIHNpemVvZiBkbTExMDUtPmlyLmtleV9tYXApOworCWlucHV0X3JlZ2lzdGVyX2tleXMoJmRtMTEwNS0+aXIpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl0YXNrbGV0X2luaXQoJmRtMTEwNS0+aXIuaXJfdGFza2xldCwgZG0xMTA1X2VtaXRfa2V5LCAodW5zaWduZWQgbG9uZykgJmRtMTEwNS0+aXIpOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBfX2RldmV4aXQgZG0xMTA1X2lyX2V4aXQoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1KQoreworCXRhc2tsZXRfa2lsbCgmZG0xMTA1LT5pci5pcl90YXNrbGV0KTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkbTExMDUtPmlyLmlucHV0X2Rldik7CisKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZG0xMTA1ZHZiX2h3X2luaXQoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiKQoreworCWRtMTEwNWR2Yl9kaXNhYmxlX2lycXMoZG0xMTA1ZHZiKTsKKworCW91dGIoMCwgZG1faW9fbWVtKERNMTEwNV9IT1NUX0NUUikpOworCisJLypEQVRBTEVOIDE4OCwqLworCW91dGIoMTg4LCBkbV9pb19tZW0oRE0xMTA1X0RUQUxFTlRIKSk7CisJLypUU19TVFJUIFRTX1ZBTFAgTVNCRklSU1QgVFNfTU9ERSBBTFBBUyBUU1BFUyovCisJb3V0dygweGMxMGEsIGRtX2lvX21lbShETTExMDVfVFNDVFIpKTsKKworCS8qIG1hcCBETUEgYW5kIHNldCBhZGRyZXNzICovCisJZG0xMTA1ZHZiX2RtYV9tYXAoZG0xMTA1ZHZiKTsKKwlkbTExMDVkdmJfc2V0X2RtYV9hZGRyKGRtMTEwNWR2Yik7CisJLyogYmlnIGJ1ZmZlciAqLworCW91dGwoNSpETTExMDVfRE1BX0JZVEVTLCBkbV9pb19tZW0oRE0xMTA1X1JMRU4pKTsKKwlvdXRiKDQ3LCBkbV9pb19tZW0oRE0xMTA1X0lOVENOVCkpOworCisJLyogSVIgTkVDIG1vZGUgZW5hYmxlICovCisJb3V0YigoRE0xMTA1X0lSX0VOIHwgRE0xMTA1X1NZU19DSEspLCBkbV9pb19tZW0oRE0xMTA1X0lSQ1RSKSk7CisJb3V0YigwLCBkbV9pb19tZW0oRE0xMTA1X0lSTU9ERSkpOworCW91dHcoMCwgZG1faW9fbWVtKERNMTEwNV9TWVNURU1DT0RFKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG0xMTA1ZHZiX2h3X2V4aXQoc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiKQoreworCWRtMTEwNWR2Yl9kaXNhYmxlX2lycXMoZG0xMTA1ZHZiKTsKKworCS8qIElSIGRpc2FibGUgKi8KKwlvdXRiKDAsIGRtX2lvX21lbShETTExMDVfSVJDVFIpKTsKKwlvdXRiKElOVE1BS19OT05FTUFTSywgZG1faW9fbWVtKERNMTEwNV9JTlRNQUspKTsKKworCWRtMTEwNWR2Yl9kbWFfdW5tYXAoZG0xMTA1ZHZiKTsKK30KKworc3RhdGljIHN0cnVjdCBzdHYwMjg4X2NvbmZpZyBlYXJkYV9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAorCS5taW5fZGVsYXlfbXMgPSAxMDAsCit9OworCitzdGF0aWMgc3RydWN0IHNpMjF4eF9jb25maWcgc2VyaXRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKKwkubWluX2RlbGF5X21zID0gMTAwLAorCit9OworCitzdGF0aWMgc3RydWN0IGN4MjQxMTZfY29uZmlnIHNlcml0X3NwMjYzM19jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDU1LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZnJvbnRlbmRfaW5pdChzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmIpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoZG0xMTA1ZHZiLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0RXMjAwMjoKKwkJZG0xMTA1ZHZiLT5mZSA9IGR2Yl9hdHRhY2goCisJCQlzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0YV9jb25maWcsCisJCQkmZG0xMTA1ZHZiLT5pMmNfYWRhcCk7CisKKwkJaWYgKGRtMTEwNWR2Yi0+ZmUpIHsKKwkJCWRtMTEwNWR2Yi0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9CisJCQkJCQkJZG0xMTA1ZHZiX3NldF92b2x0YWdlOworCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZG0xMTA1ZHZiLT5mZSwgMHg2MCwKKwkJCQkJJmRtMTEwNWR2Yi0+aTJjX2FkYXAsIERWQl9QTExfT1BFUkExKTsKKwkJfQorCisJCWlmICghZG0xMTA1ZHZiLT5mZSkgeworCQkJZG0xMTA1ZHZiLT5mZSA9IGR2Yl9hdHRhY2goCisJCQkJc3R2MDI4OF9hdHRhY2gsICZlYXJkYV9jb25maWcsCisJCQkJJmRtMTEwNWR2Yi0+aTJjX2FkYXApOworCQkJaWYgKGRtMTEwNWR2Yi0+ZmUpIHsKKwkJCQlkbTExMDVkdmItPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPQorCQkJCQkJCWRtMTEwNWR2Yl9zZXRfdm9sdGFnZTsKKwkJCQlkdmJfYXR0YWNoKHN0YjYwMDBfYXR0YWNoLCBkbTExMDVkdmItPmZlLCAweDYxLAorCQkJCQkJJmRtMTEwNWR2Yi0+aTJjX2FkYXApOworCQkJfQorCQl9CisKKwkJaWYgKCFkbTExMDVkdmItPmZlKSB7CisJCQlkbTExMDVkdmItPmZlID0gZHZiX2F0dGFjaCgKKwkJCQlzaTIxeHhfYXR0YWNoLCAmc2VyaXRfY29uZmlnLAorCQkJCSZkbTExMDVkdmItPmkyY19hZGFwKTsKKwkJCWlmIChkbTExMDVkdmItPmZlKQorCQkJCWRtMTEwNWR2Yi0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9CisJCQkJCQkJZG0xMTA1ZHZiX3NldF92b2x0YWdlOworCQl9CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9EVzIwMDQ6CisJCWRtMTEwNWR2Yi0+ZmUgPSBkdmJfYXR0YWNoKAorCQkJY3gyNDExNl9hdHRhY2gsICZzZXJpdF9zcDI2MzNfY29uZmlnLAorCQkJJmRtMTEwNWR2Yi0+aTJjX2FkYXApOworCQlpZiAoZG0xMTA1ZHZiLT5mZSkKKwkJCWRtMTEwNWR2Yi0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGRtMTEwNWR2Yl9zZXRfdm9sdGFnZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFkbTExMDVkdmItPmZlKSB7CisJCWRldl9lcnIoJmRtMTEwNWR2Yi0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBmcm9udGVuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZG0xMTA1ZHZiLT5kdmJfYWRhcHRlciwgZG0xMTA1ZHZiLT5mZSk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGRtMTEwNWR2Yi0+ZmUtPm9wcy5yZWxlYXNlKQorCQkJZG0xMTA1ZHZiLT5mZS0+b3BzLnJlbGVhc2UoZG0xMTA1ZHZiLT5mZSk7CisJCWRtMTEwNWR2Yi0+ZmUgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZG0xMTA1ZHZiX3JlYWRfbWFjKHN0cnVjdCBkbTExMDVkdmIgKmRtMTEwNWR2YiwgdTggKm1hYykKK3sKKwlzdGF0aWMgdTggY29tbWFuZFsxXSA9IHsgMHgyOCB9OworCisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmFkZHIgPSBJSUNfMjRDMDFfYWRkciA+PiAxLCAuZmxhZ3MgPSAwLAorCQkJCS5idWYgPSBjb21tYW5kLCAubGVuID0gMSB9LAorCQl7IC5hZGRyID0gSUlDXzI0QzAxX2FkZHIgPj4gMSwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJLmJ1ZiA9IG1hYywgLmxlbiA9IDYgfSwKKwl9OworCisJZG0xMTA1X2kyY194ZmVyKCZkbTExMDVkdmItPmkyY19hZGFwLCBtc2cgLCAyKTsKKwlkZXZfaW5mbygmZG0xMTA1ZHZiLT5wZGV2LT5kZXYsICJNQUMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZG0xMTA1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZG0xMTA1ZHZiICpkbTExMDVkdmI7CisJc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eDsKKwlzdHJ1Y3QgZG14X2RlbXV4ICpkbXg7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlkbTExMDVkdmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG0xMTA1ZHZiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkbTExMDVkdmIpCisJCWdvdG8gb3V0OworCisJZG0xMTA1ZHZiLT5wZGV2ID0gcGRldjsKKwlkbTExMDVkdmItPmJ1ZmZlcl9zaXplID0gNSAqIERNMTEwNV9ETUFfQllURVM7CisJZG0xMTA1ZHZiLT5QYWNrZXRFcnJvckNvdW50ID0gMDsKKwlkbTExMDVkdmItPmRtYXJzdCA9IDA7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfa2ZyZWU7CisKKwlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOworCisJZG0xMTA1ZHZiLT5pb19tZW0gPSBwY2lfaW9tYXAocGRldiwgMCwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKCFkbTExMDVkdmItPmlvX21lbSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9wY2lfcmVsZWFzZV9yZWdpb25zOworCX0KKworCXNwaW5fbG9ja19pbml0KCZkbTExMDVkdmItPmxvY2spOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkbTExMDVkdmIpOworCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBkbTExMDVkdmJfaXJxLCBJUlFGX1NIQVJFRCwgRFJJVkVSX05BTUUsIGRtMTEwNWR2Yik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9pb3VubWFwOworCisJcmV0ID0gZG0xMTA1ZHZiX2h3X2luaXQoZG0xMTA1ZHZiKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwkvKiBpMmMgKi8KKwlpMmNfc2V0X2FkYXBkYXRhKCZkbTExMDVkdmItPmkyY19hZGFwLCBkbTExMDVkdmIpOworCXN0cmNweShkbTExMDVkdmItPmkyY19hZGFwLm5hbWUsIERSSVZFUl9OQU1FKTsKKwlkbTExMDVkdmItPmkyY19hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7CisJZG0xMTA1ZHZiLT5pMmNfYWRhcC5jbGFzcyA9IEkyQ19DTEFTU19UVl9ESUdJVEFMOworCWRtMTEwNWR2Yi0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJZG0xMTA1ZHZiLT5pMmNfYWRhcC5hbGdvID0gJmRtMTEwNV9hbGdvOworCWRtMTEwNWR2Yi0+aTJjX2FkYXAuYWxnb19kYXRhID0gZG0xMTA1ZHZiOworCXJldCA9IGkyY19hZGRfYWRhcHRlcigmZG0xMTA1ZHZiLT5pMmNfYWRhcCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZG0xMTA1ZHZiX2h3X2V4aXQ7CisKKwkvKiBkdmIgKi8KKwlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZG0xMTA1ZHZiLT5kdmJfYWRhcHRlciwgRFJJVkVSX05BTUUsCisJCQkJCVRISVNfTU9EVUxFLCAmcGRldi0+ZGV2LCBhZGFwdGVyX25yKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfaTJjX2RlbF9hZGFwdGVyOworCisJZHZiX2FkYXB0ZXIgPSAmZG0xMTA1ZHZiLT5kdmJfYWRhcHRlcjsKKworCWRtMTEwNWR2Yl9yZWFkX21hYyhkbTExMDVkdmIsIGR2Yl9hZGFwdGVyLT5wcm9wb3NlZF9tYWMpOworCisJZHZiZGVtdXggPSAmZG0xMTA1ZHZiLT5kZW11eDsKKwlkdmJkZW11eC0+ZmlsdGVybnVtID0gMjU2OworCWR2YmRlbXV4LT5mZWVkbnVtID0gMjU2OworCWR2YmRlbXV4LT5zdGFydF9mZWVkID0gZG0xMTA1ZHZiX3N0YXJ0X2ZlZWQ7CisJZHZiZGVtdXgtPnN0b3BfZmVlZCA9IGRtMTEwNWR2Yl9zdG9wX2ZlZWQ7CisJZHZiZGVtdXgtPmRteC5jYXBhYmlsaXRpZXMgPSAoRE1YX1RTX0ZJTFRFUklORyB8CisJCQlETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJcmV0ID0gZHZiX2RteF9pbml0KGR2YmRlbXV4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcjsKKworCWRteCA9ICZkdmJkZW11eC0+ZG14OworCWRtMTEwNWR2Yi0+ZG14ZGV2LmZpbHRlcm51bSA9IDI1NjsKKwlkbTExMDVkdmItPmRteGRldi5kZW11eCA9IGRteDsKKwlkbTExMDVkdmItPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOworCisJcmV0ID0gZHZiX2RteGRldl9pbml0KCZkbTExMDVkdmItPmRteGRldiwgZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14X3JlbGVhc2U7CisKKwlkbTExMDVkdmItPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCisJcmV0ID0gZG14LT5hZGRfZnJvbnRlbmQoZG14LCAmZG0xMTA1ZHZiLT5od19mcm9udGVuZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2R2Yl9kbXhkZXZfcmVsZWFzZTsKKworCWRtMTEwNWR2Yi0+bWVtX2Zyb250ZW5kLnNvdXJjZSA9IERNWF9NRU1PUllfRkU7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZkbTExMDVkdmItPm1lbV9mcm9udGVuZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlbW92ZV9od19mcm9udGVuZDsKKworCXJldCA9IGRteC0+Y29ubmVjdF9mcm9udGVuZChkbXgsICZkbTExMDVkdmItPmh3X2Zyb250ZW5kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVtb3ZlX21lbV9mcm9udGVuZDsKKworCXJldCA9IGZyb250ZW5kX2luaXQoZG0xMTA1ZHZiKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZGlzY29ubmVjdF9mcm9udGVuZDsKKworCWR2Yl9uZXRfaW5pdChkdmJfYWRhcHRlciwgJmRtMTEwNWR2Yi0+ZHZibmV0LCBkbXgpOworCWRtMTEwNV9pcl9pbml0KGRtMTEwNWR2Yik7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX2Rpc2Nvbm5lY3RfZnJvbnRlbmQ6CisJZG14LT5kaXNjb25uZWN0X2Zyb250ZW5kKGRteCk7CitlcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZkbTExMDVkdmItPm1lbV9mcm9udGVuZCk7CitlcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOgorCWRteC0+cmVtb3ZlX2Zyb250ZW5kKGRteCwgJmRtMTEwNWR2Yi0+aHdfZnJvbnRlbmQpOworZXJyX2R2Yl9kbXhkZXZfcmVsZWFzZToKKwlkdmJfZG14ZGV2X3JlbGVhc2UoJmRtMTEwNWR2Yi0+ZG14ZGV2KTsKK2Vycl9kdmJfZG14X3JlbGVhc2U6CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKK2Vycl9kdmJfdW5yZWdpc3Rlcl9hZGFwdGVyOgorCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZHZiX2FkYXB0ZXIpOworZXJyX2kyY19kZWxfYWRhcHRlcjoKKwlpMmNfZGVsX2FkYXB0ZXIoJmRtMTEwNWR2Yi0+aTJjX2FkYXApOworZXJyX2RtMTEwNWR2Yl9od19leGl0OgorCWRtMTEwNWR2Yl9od19leGl0KGRtMTEwNWR2Yik7CitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkbTExMDVkdmIpOworZXJyX3BjaV9pb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIGRtMTEwNWR2Yi0+aW9fbWVtKTsKK2Vycl9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9rZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZG0xMTA1ZHZiKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRtMTEwNV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRtMTEwNWR2YiAqZG0xMTA1ZHZiID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIgPSAmZG0xMTA1ZHZiLT5kdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9ICZkbTExMDVkdmItPmRlbXV4OworCXN0cnVjdCBkbXhfZGVtdXggKmRteCA9ICZkdmJkZW11eC0+ZG14OworCisJZG0xMTA1X2lyX2V4aXQoZG0xMTA1ZHZiKTsKKwlkbXgtPmNsb3NlKGRteCk7CisJZHZiX25ldF9yZWxlYXNlKCZkbTExMDVkdmItPmR2Ym5ldCk7CisJaWYgKGRtMTEwNWR2Yi0+ZmUpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGRtMTEwNWR2Yi0+ZmUpOworCisJZG14LT5kaXNjb25uZWN0X2Zyb250ZW5kKGRteCk7CisJZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmZG0xMTA1ZHZiLT5tZW1fZnJvbnRlbmQpOworCWRteC0+cmVtb3ZlX2Zyb250ZW5kKGRteCwgJmRtMTEwNWR2Yi0+aHdfZnJvbnRlbmQpOworCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZG0xMTA1ZHZiLT5kbXhkZXYpOworCWR2Yl9kbXhfcmVsZWFzZShkdmJkZW11eCk7CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihkdmJfYWRhcHRlcik7CisJaWYgKCZkbTExMDVkdmItPmkyY19hZGFwKQorCQlpMmNfZGVsX2FkYXB0ZXIoJmRtMTEwNWR2Yi0+aTJjX2FkYXApOworCisJZG0xMTA1ZHZiX2h3X2V4aXQoZG0xMTA1ZHZiKTsKKwlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRtMTEwNWR2Yik7CisJcGNpX2lvdW5tYXAocGRldiwgZG0xMTA1ZHZiLT5pb19tZW0pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShkbTExMDVkdmIpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZG0xMTA1X2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1RSSUdFTSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfRE0xMTA1LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9ERVZJQ0VfSURfRFcyMDAyLAorCX0sIHsKKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfVFJJR0VNLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9ETTExMDUsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0RFVklDRV9JRF9EVzIwMDQsCisJfSwgeworCQkvKiBlbXB0eSAqLworCX0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZG0xMTA1X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRtMTEwNV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgPSBkbTExMDVfaWRfdGFibGUsCisJLnByb2JlID0gZG0xMTA1X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkbTExMDVfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRtMTEwNV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRtMTEwNV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZG0xMTA1X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRtMTEwNV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkbTExMDVfaW5pdCk7Cittb2R1bGVfZXhpdChkbTExMDVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIklnb3IgTS4gTGlwbGlhbmluIDxsaXBsaWFuaW5AbWUuYnk+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNETUMgRE0xMTA1IERWQiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKaW5kZXggMDY5ZDg0Ny4uMGM3MzNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKQEAgLTM2NCwxNSArMzY0LDE2IEBACiAJCQkJICAgICAgIGVudW0gZG14X3N1Y2Nlc3Mgc3VjY2VzcykKIHsKIAlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZmlsdGVyLT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCWlmIChkbXhkZXZmaWx0ZXItPmJ1ZmZlci5lcnJvcikgewogCQl3YWtlX3VwKCZkbXhkZXZmaWx0ZXItPmJ1ZmZlci5xdWV1ZSk7CiAJCXJldHVybiAwOwogCX0KLQlzcGluX2xvY2soJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG14ZGV2ZmlsdGVyLT5kZXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAoZG14ZGV2ZmlsdGVyLT5zdGF0ZSAhPSBETVhERVZfU1RBVEVfR08pIHsKLQkJc3Bpbl91bmxvY2soJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG14ZGV2ZmlsdGVyLT5kZXYtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCWRlbF90aW1lcigmZG14ZGV2ZmlsdGVyLT50aW1lcik7CkBAIC0zOTEsNyArMzkyLDcgQEAKIAl9CiAJaWYgKGRteGRldmZpbHRlci0+cGFyYW1zLnNlYy5mbGFncyAmIERNWF9PTkVTSE9UKQogCQlkbXhkZXZmaWx0ZXItPnN0YXRlID0gRE1YREVWX1NUQVRFX0RPTkU7Ci0Jc3Bpbl91bmxvY2soJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbXhkZXZmaWx0ZXItPmRldi0+bG9jaywgZmxhZ3MpOwogCXdha2VfdXAoJmRteGRldmZpbHRlci0+YnVmZmVyLnF1ZXVlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQwMywxMSArNDA0LDEyIEBACiB7CiAJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9IGZlZWQtPnByaXY7CiAJc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrKCZkbXhkZXZmaWx0ZXItPmRldi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGRteGRldmZpbHRlci0+cGFyYW1zLnBlcy5vdXRwdXQgPT0gRE1YX09VVF9ERUNPREVSKSB7Ci0JCXNwaW5fdW5sb2NrKCZkbXhkZXZmaWx0ZXItPmRldi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDE3LDcgKzQxOSw3IEBACiAJZWxzZQogCQlidWZmZXIgPSAmZG14ZGV2ZmlsdGVyLT5kZXYtPmR2cl9idWZmZXI7CiAJaWYgKGJ1ZmZlci0+ZXJyb3IpIHsKLQkJc3Bpbl91bmxvY2soJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG14ZGV2ZmlsdGVyLT5kZXYtPmxvY2ssIGZsYWdzKTsKIAkJd2FrZV91cCgmYnVmZmVyLT5xdWV1ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTQyOCw3ICs0MzAsNyBAQAogCQlkdmJfcmluZ2J1ZmZlcl9mbHVzaChidWZmZXIpOwogCQlidWZmZXItPmVycm9yID0gcmV0OwogCX0KLQlzcGluX3VubG9jaygmZG14ZGV2ZmlsdGVyLT5kZXYtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRteGRldmZpbHRlci0+ZGV2LT5sb2NrLCBmbGFncyk7CiAJd2FrZV91cCgmYnVmZmVyLT5xdWV1ZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCmluZGV4IGUyZWNhMGIuLmEyYzFmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCkBAIC0zOTksNyArMzk5LDkgQEAKIHZvaWQgZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKHN0cnVjdCBkdmJfZGVtdXggKmRlbXV4LCBjb25zdCB1OCAqYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50KQogewotCXNwaW5fbG9jaygmZGVtdXgtPmxvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGVtdXgtPmxvY2ssIGZsYWdzKTsKIAogCXdoaWxlIChjb3VudC0tKSB7CiAJCWlmIChidWZbMF0gPT0gMHg0NykKQEAgLTQwNywxNiArNDA5LDE3IEBACiAJCWJ1ZiArPSAxODg7CiAJfQogCi0Jc3Bpbl91bmxvY2soJmRlbXV4LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eC0+bG9jaywgZmxhZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyk7CiAKIHZvaWQgZHZiX2RteF9zd2ZpbHRlcihzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHAgPSAwLCBpLCBqOwogCi0Jc3Bpbl9sb2NrKCZkZW11eC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlbXV4LT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZGVtdXgtPnRzYnVmcCkgewogCQlpID0gZGVtdXgtPnRzYnVmcDsKQEAgLTQ0OSwxNyArNDUyLDE4IEBACiAJfQogCiBiYWlsb3V0OgotCXNwaW5fdW5sb2NrKCZkZW11eC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVtdXgtPmxvY2ssIGZsYWdzKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkdmJfZG14X3N3ZmlsdGVyKTsKIAogdm9pZCBkdmJfZG14X3N3ZmlsdGVyXzIwNChzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHAgPSAwLCBpLCBqOwogCXU4IHRtcHBhY2tbMTg4XTsKIAotCXNwaW5fbG9jaygmZGVtdXgtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZW11eC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGRlbXV4LT50c2J1ZnApIHsKIAkJaSA9IGRlbXV4LT50c2J1ZnA7CkBAIC01MDAsNyArNTA0LDcgQEAKIAl9CiAKIGJhaWxvdXQ6Ci0Jc3Bpbl91bmxvY2soJmRlbXV4LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZW11eC0+bG9jaywgZmxhZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGR2Yl9kbXhfc3dmaWx0ZXJfMjA0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggMzUyNmUzZS4uZjE3MGU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgImR2YmRldi5oIgorI2luY2x1ZGUgPGxpbnV4L2R2Yi92ZXJzaW9uLmg+CiAKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2RlYnVnOwogc3RhdGljIGludCBkdmJfc2h1dGRvd25fdGltZW91dDsKQEAgLTc1NSw2ICs3NTYsNTM5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBkdHZfY21kc19oIGR0dl9jbWRzW10gPSB7CisJW0RUVl9UVU5FXSA9IHsKKwkJLm5hbWUJPSAiRFRWX1RVTkUiLAorCQkuY21kCT0gRFRWX1RVTkUsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9DTEVBUl0gPSB7CisJCS5uYW1lCT0gIkRUVl9DTEVBUiIsCisJCS5jbWQJPSBEVFZfQ0xFQVIsCisJCS5zZXQJPSAxLAorCX0sCisKKwkvKiBTZXQgKi8KKwlbRFRWX0ZSRVFVRU5DWV0gPSB7CisJCS5uYW1lCT0gIkRUVl9GUkVRVUVOQ1kiLAorCQkuY21kCT0gRFRWX0ZSRVFVRU5DWSwKKwkJLnNldAk9IDEsCisJfSwKKwlbRFRWX0JBTkRXSURUSF9IWl0gPSB7CisJCS5uYW1lCT0gIkRUVl9CQU5EV0lEVEhfSFoiLAorCQkuY21kCT0gRFRWX0JBTkRXSURUSF9IWiwKKwkJLnNldAk9IDEsCisJfSwKKwlbRFRWX01PRFVMQVRJT05dID0geworCQkubmFtZQk9ICJEVFZfTU9EVUxBVElPTiIsCisJCS5jbWQJPSBEVFZfTU9EVUxBVElPTiwKKwkJLnNldAk9IDEsCisJfSwKKwlbRFRWX0lOVkVSU0lPTl0gPSB7CisJCS5uYW1lCT0gIkRUVl9JTlZFUlNJT04iLAorCQkuY21kCT0gRFRWX0lOVkVSU0lPTiwKKwkJLnNldAk9IDEsCisJfSwKKwlbRFRWX0RJU0VRQ19NQVNURVJdID0geworCQkubmFtZQk9ICJEVFZfRElTRVFDX01BU1RFUiIsCisJCS5jbWQJPSBEVFZfRElTRVFDX01BU1RFUiwKKwkJLnNldAk9IDEsCisJCS5idWZmZXIJPSAxLAorCX0sCisJW0RUVl9TWU1CT0xfUkFURV0gPSB7CisJCS5uYW1lCT0gIkRUVl9TWU1CT0xfUkFURSIsCisJCS5jbWQJPSBEVFZfU1lNQk9MX1JBVEUsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9JTk5FUl9GRUNdID0geworCQkubmFtZQk9ICJEVFZfSU5ORVJfRkVDIiwKKwkJLmNtZAk9IERUVl9JTk5FUl9GRUMsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9WT0xUQUdFXSA9IHsKKwkJLm5hbWUJPSAiRFRWX1ZPTFRBR0UiLAorCQkuY21kCT0gRFRWX1ZPTFRBR0UsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9UT05FXSA9IHsKKwkJLm5hbWUJPSAiRFRWX1RPTkUiLAorCQkuY21kCT0gRFRWX1RPTkUsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9QSUxPVF0gPSB7CisJCS5uYW1lCT0gIkRUVl9QSUxPVCIsCisJCS5jbWQJPSBEVFZfUElMT1QsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9ST0xMT0ZGXSA9IHsKKwkJLm5hbWUJPSAiRFRWX1JPTExPRkYiLAorCQkuY21kCT0gRFRWX1JPTExPRkYsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9ERUxJVkVSWV9TWVNURU1dID0geworCQkubmFtZQk9ICJEVFZfREVMSVZFUllfU1lTVEVNIiwKKwkJLmNtZAk9IERUVl9ERUxJVkVSWV9TWVNURU0sCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9ISUVSQVJDSFldID0geworCQkubmFtZQk9ICJEVFZfSElFUkFSQ0hZIiwKKwkJLmNtZAk9IERUVl9ISUVSQVJDSFksCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9DT0RFX1JBVEVfSFBdID0geworCQkubmFtZQk9ICJEVFZfQ09ERV9SQVRFX0hQIiwKKwkJLmNtZAk9IERUVl9DT0RFX1JBVEVfSFAsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9DT0RFX1JBVEVfTFBdID0geworCQkubmFtZQk9ICJEVFZfQ09ERV9SQVRFX0xQIiwKKwkJLmNtZAk9IERUVl9DT0RFX1JBVEVfTFAsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9HVUFSRF9JTlRFUlZBTF0gPSB7CisJCS5uYW1lCT0gIkRUVl9HVUFSRF9JTlRFUlZBTCIsCisJCS5jbWQJPSBEVFZfR1VBUkRfSU5URVJWQUwsCisJCS5zZXQJPSAxLAorCX0sCisJW0RUVl9UUkFOU01JU1NJT05fTU9ERV0gPSB7CisJCS5uYW1lCT0gIkRUVl9UUkFOU01JU1NJT05fTU9ERSIsCisJCS5jbWQJPSBEVFZfVFJBTlNNSVNTSU9OX01PREUsCisJCS5zZXQJPSAxLAorCX0sCisJLyogR2V0ICovCisJW0RUVl9ESVNFUUNfU0xBVkVfUkVQTFldID0geworCQkubmFtZQk9ICJEVFZfRElTRVFDX1NMQVZFX1JFUExZIiwKKwkJLmNtZAk9IERUVl9ESVNFUUNfU0xBVkVfUkVQTFksCisJCS5zZXQJPSAwLAorCQkuYnVmZmVyCT0gMSwKKwl9LAorCVtEVFZfQVBJX1ZFUlNJT05dID0geworCQkubmFtZQk9ICJEVFZfQVBJX1ZFUlNJT04iLAorCQkuY21kCT0gRFRWX0FQSV9WRVJTSU9OLAorCQkuc2V0CT0gMCwKKwl9LAorCVtEVFZfQ09ERV9SQVRFX0hQXSA9IHsKKwkJLm5hbWUJPSAiRFRWX0NPREVfUkFURV9IUCIsCisJCS5jbWQJPSBEVFZfQ09ERV9SQVRFX0hQLAorCQkuc2V0CT0gMCwKKwl9LAorCVtEVFZfQ09ERV9SQVRFX0xQXSA9IHsKKwkJLm5hbWUJPSAiRFRWX0NPREVfUkFURV9MUCIsCisJCS5jbWQJPSBEVFZfQ09ERV9SQVRFX0xQLAorCQkuc2V0CT0gMCwKKwl9LAorCVtEVFZfR1VBUkRfSU5URVJWQUxdID0geworCQkubmFtZQk9ICJEVFZfR1VBUkRfSU5URVJWQUwiLAorCQkuY21kCT0gRFRWX0dVQVJEX0lOVEVSVkFMLAorCQkuc2V0CT0gMCwKKwl9LAorCVtEVFZfVFJBTlNNSVNTSU9OX01PREVdID0geworCQkubmFtZQk9ICJEVFZfVFJBTlNNSVNTSU9OX01PREUiLAorCQkuY21kCT0gRFRWX1RSQU5TTUlTU0lPTl9NT0RFLAorCQkuc2V0CT0gMCwKKwl9LAorCVtEVFZfSElFUkFSQ0hZXSA9IHsKKwkJLm5hbWUJPSAiRFRWX0hJRVJBUkNIWSIsCisJCS5jbWQJPSBEVFZfSElFUkFSQ0hZLAorCQkuc2V0CT0gMCwKKwl9LAorfTsKKwordm9pZCBkdHZfcHJvcGVydHlfZHVtcChzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCit7CisJaW50IGk7CisKKwlpZiAodHZwLT5jbWQgPD0gMCB8fCB0dnAtPmNtZCA+IERUVl9NQVhfQ09NTUFORCkgeworCQlwcmludGsoIiVzOiB0dnAuY21kID0gMHglMDh4ICh1bmRlZmluZWQvdW5rbm93bi9pbnZhbGlkKVxuIiwKKwkJCV9fZnVuY19fLCB0dnAtPmNtZCk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoIiVzKCkgdHZwLmNtZCAgICA9IDB4JTA4eCAoJXMpXG4iCisJCSxfX0ZVTkNUSU9OX18KKwkJLHR2cC0+Y21kCisJCSxkdHZfY21kc1sgdHZwLT5jbWQgXS5uYW1lKTsKKworCWlmKGR0dl9jbWRzWyB0dnAtPmNtZCBdLmJ1ZmZlcikgeworCisJCXByaW50aygiJXMoKSB0dnAudS5idWZmZXIubGVuID0gMHglMDJ4XG4iCisJCQksX19GVU5DVElPTl9fCisJCQksdHZwLT51LmJ1ZmZlci5sZW4pOworCisJCWZvcihpID0gMDsgaSA8IHR2cC0+dS5idWZmZXIubGVuOyBpKyspCisJCQlwcmludGsoIiVzKCkgdHZwLnUuYnVmZmVyLmRhdGFbMHglMDJ4XSA9IDB4JTAyeFxuIgorCQkJCSxfX0ZVTkNUSU9OX18KKwkJCQksaQorCQkJCSx0dnAtPnUuYnVmZmVyLmRhdGFbaV0pOworCisJfSBlbHNlCisJCXByaW50aygiJXMoKSB0dnAudS5kYXRhID0gMHglMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHR2cC0+dS5kYXRhKTsKK30KKworaW50IGlzX2xlZ2FjeV9kZWxpdmVyeV9zeXN0ZW0oZmVfZGVsaXZlcnlfc3lzdGVtX3QgcykKK3sKKwlpZigocyA9PSBTWVNfVU5ERUZJTkVEKSB8fCAocyA9PSBTWVNfRFZCQ19BTk5FWF9BQykgfHwKKwkJKHMgPT0gU1lTX0RWQkNfQU5ORVhfQikgfHwgKHMgPT0gU1lTX0RWQlQpIHx8IChzID09IFNZU19EVkJTKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3luY2hyb25pc2UgdGhlIGxlZ2FjeSB0dW5pbmcgcGFyYW1ldGVycyBpbnRvIHRoZSBjYWNoZSwgc28gdGhhdCBkZW1vZHVsYXRvcgorICogZHJpdmVycyBjYW4gdXNlIGEgc2luZ2xlIHNldF9mcm9udGVuZCB0dW5pbmcgZnVuY3Rpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICogaXQncyBiZWluZyB1c2VkIGZvciB0aGUgbGVnYWN5IG9yIG5ldyBBUEksIHJlZHVjaW5nIGNvZGUgYW5kIGNvbXBsZXhpdHkuCisgKi8KK3ZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKworCXByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWMtPmZyZXF1ZW5jeSA9IHAtPmZyZXF1ZW5jeTsKKwljLT5pbnZlcnNpb24gPSBwLT5pbnZlcnNpb247CisKKwlzd2l0Y2ggKGZlLT5vcHMuaW5mby50eXBlKSB7CisJY2FzZSBGRV9RUFNLOgorCQljLT5tb2R1bGF0aW9uID0gUVBTSzsgICAvKiBpbXBsaWVkIGZvciBEVkItUyBpbiBsZWdhY3kgQVBJICovCisJCWMtPnJvbGxvZmYgPSBST0xMT0ZGXzM1Oy8qIGltcGxpZWQgZm9yIERWQi1TICovCisJCWMtPnN5bWJvbF9yYXRlID0gcC0+dS5xcHNrLnN5bWJvbF9yYXRlOworCQljLT5mZWNfaW5uZXIgPSBwLT51LnFwc2suZmVjX2lubmVyOworCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCUzsKKwkJYnJlYWs7CisJY2FzZSBGRV9RQU06CisJCWMtPnN5bWJvbF9yYXRlID0gcC0+dS5xYW0uc3ltYm9sX3JhdGU7CisJCWMtPmZlY19pbm5lciA9IHAtPnUucWFtLmZlY19pbm5lcjsKKwkJYy0+bW9kdWxhdGlvbiA9IHAtPnUucWFtLm1vZHVsYXRpb247CisJCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJDX0FOTkVYX0FDOworCQlicmVhazsKKwljYXNlIEZFX09GRE06CisJCWlmIChwLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF82X01IWikKKwkJCWMtPmJhbmR3aWR0aF9oeiA9IDYwMDAwMDA7CisJCWVsc2UgaWYgKHAtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzdfTUhaKQorCQkJYy0+YmFuZHdpZHRoX2h6ID0gNzAwMDAwMDsKKwkJZWxzZSBpZiAocC0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopCisJCQljLT5iYW5kd2lkdGhfaHogPSA4MDAwMDAwOworCQllbHNlCisJCQkvKiBJbmNsdWRpbmcgQkFORFdJRFRIX0FVVE8gKi8KKwkJCWMtPmJhbmR3aWR0aF9oeiA9IDA7CisJCWMtPmNvZGVfcmF0ZV9IUCA9IHAtPnUub2ZkbS5jb2RlX3JhdGVfSFA7CisJCWMtPmNvZGVfcmF0ZV9MUCA9IHAtPnUub2ZkbS5jb2RlX3JhdGVfTFA7CisJCWMtPm1vZHVsYXRpb24gPSBwLT51Lm9mZG0uY29uc3RlbGxhdGlvbjsKKwkJYy0+dHJhbnNtaXNzaW9uX21vZGUgPSBwLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGU7CisJCWMtPmd1YXJkX2ludGVydmFsID0gcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsOworCQljLT5oaWVyYXJjaHkgPSBwLT51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uOworCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCVDsKKwkJYnJlYWs7CisJY2FzZSBGRV9BVFNDOgorCQljLT5tb2R1bGF0aW9uID0gcC0+dS52c2IubW9kdWxhdGlvbjsKKwkJaWYgKChjLT5tb2R1bGF0aW9uID09IFZTQl84KSB8fCAoYy0+bW9kdWxhdGlvbiA9PSBWU0JfMTYpKQorCQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0FUU0M7CisJCWVsc2UKKwkJCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJDX0FOTkVYX0I7CisJCWJyZWFrOworCX0KK30KKworLyogRW5zdXJlIHRoZSBjYWNoZWQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBmcm9udGVuZAorICogbGVnYWN5IHR1bmluZyBzdHJ1Y3R1cmVzLCBmb3IgdGhlIGFkdmFuY2VkIHR1bmluZyBBUEkuCisgKi8KK3ZvaWQgZHR2X3Byb3BlcnR5X2xlZ2FjeV9wYXJhbXNfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCA9ICZmZXByaXYtPnBhcmFtZXRlcnM7CisKKwlwcmludGsoIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlwLT5mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CisJcC0+aW52ZXJzaW9uID0gYy0+aW52ZXJzaW9uOworCisJc3dpdGNoIChmZS0+b3BzLmluZm8udHlwZSkgeworCWNhc2UgRkVfUVBTSzoKKwkJcHJpbnRrKCIlcygpIFByZXBhcmluZyBRUFNLIHJlcVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcC0+dS5xcHNrLnN5bWJvbF9yYXRlID0gYy0+c3ltYm9sX3JhdGU7CisJCXAtPnUucXBzay5mZWNfaW5uZXIgPSBjLT5mZWNfaW5uZXI7CisJCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJTOworCQlicmVhazsKKwljYXNlIEZFX1FBTToKKwkJcHJpbnRrKCIlcygpIFByZXBhcmluZyBRQU0gcmVxXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwLT51LnFhbS5zeW1ib2xfcmF0ZSA9IGMtPnN5bWJvbF9yYXRlOworCQlwLT51LnFhbS5mZWNfaW5uZXIgPSBjLT5mZWNfaW5uZXI7CisJCXAtPnUucWFtLm1vZHVsYXRpb24gPSBjLT5tb2R1bGF0aW9uOworCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCQ19BTk5FWF9BQzsKKwkJYnJlYWs7CisJY2FzZSBGRV9PRkRNOgorCQlwcmludGsoIiVzKCkgUHJlcGFyaW5nIE9GRE0gcmVxXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAoYy0+YmFuZHdpZHRoX2h6ID09IDYwMDAwMDApCisJCQlwLT51Lm9mZG0uYmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQllbHNlIGlmIChjLT5iYW5kd2lkdGhfaHogPT0gNzAwMDAwMCkKKwkJCXAtPnUub2ZkbS5iYW5kd2lkdGggPSBCQU5EV0lEVEhfN19NSFo7CisJCWVsc2UgaWYgKGMtPmJhbmR3aWR0aF9oeiA9PSA4MDAwMDAwKQorCQkJcC0+dS5vZmRtLmJhbmR3aWR0aCA9IEJBTkRXSURUSF84X01IWjsKKwkJZWxzZQorCQkJcC0+dS5vZmRtLmJhbmR3aWR0aCA9IEJBTkRXSURUSF9BVVRPOworCQlwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gYy0+Y29kZV9yYXRlX0hQOworCQlwLT51Lm9mZG0uY29kZV9yYXRlX0xQID0gYy0+Y29kZV9yYXRlX0xQOworCQlwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IGMtPm1vZHVsYXRpb247CisJCXAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9IGMtPnRyYW5zbWlzc2lvbl9tb2RlOworCQlwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBjLT5ndWFyZF9pbnRlcnZhbDsKKwkJcC0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IGMtPmhpZXJhcmNoeTsKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlQ7CisJCWJyZWFrOworCWNhc2UgRkVfQVRTQzoKKwkJcHJpbnRrKCIlcygpIFByZXBhcmluZyBWU0IgcmVxXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwLT51LnZzYi5tb2R1bGF0aW9uID0gYy0+bW9kdWxhdGlvbjsKKwkJaWYgKChjLT5tb2R1bGF0aW9uID09IFZTQl84KSB8fCAoYy0+bW9kdWxhdGlvbiA9PSBWU0JfMTYpKQorCQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0FUU0M7CisJCWVsc2UKKwkJCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJDX0FOTkVYX0I7CisJCWJyZWFrOworCX0KK30KKworLyogRW5zdXJlIHRoZSBjYWNoZWQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBmcm9udGVuZAorICogbGVnYWN5IHR1bmluZyBzdHJ1Y3R1cmVzLCBmb3IgdGhlIGxlZ2FjeSB0dW5pbmcgQVBJLgorICovCit2b2lkIGR0dl9wcm9wZXJ0eV9hZHZfcGFyYW1zX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnAgPSAmZmVwcml2LT5wYXJhbWV0ZXJzOworCisJcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcC0+ZnJlcXVlbmN5ID0gYy0+ZnJlcXVlbmN5OworCXAtPmludmVyc2lvbiA9IGMtPmludmVyc2lvbjsKKworCXN3aXRjaChjLT5tb2R1bGF0aW9uKSB7CisJY2FzZSBQU0tfODoKKwljYXNlIEFQU0tfMTY6CisJY2FzZSBRUFNLOgorCQlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBjLT5zeW1ib2xfcmF0ZTsKKwkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGMtPmZlY19pbm5lcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYoYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19JU0RCVCkgeworCQkvKiBGYWtlIG91dCBhIGdlbmVyaWMgRFZCLVQgcmVxdWVzdCBzbyB3ZSBwYXNzIHZhbGlkYXRpb24gaW4gdGhlIGlvY3RsICovCisJCXAtPmZyZXF1ZW5jeSA9IGMtPmZyZXF1ZW5jeTsKKwkJcC0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX0FVVE87CisJCXAtPnUub2ZkbS5jb25zdGVsbGF0aW9uID0gUUFNX0FVVE87CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfQVVUTzsKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ19BVVRPOworCQlwLT51Lm9mZG0uYmFuZHdpZHRoID0gQkFORFdJRFRIX0FVVE87CisJCXAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9IFRSQU5TTUlTU0lPTl9NT0RFX0FVVE87CisJCXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMX0FVVE87CisJCXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfQVVUTzsKKwl9Cit9CisKK3ZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N1Ym1pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKworCXByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIEZvciBsZWdhY3kgZGVsaXZlcnkgc3lzdGVtcyB3ZSBkb24ndCBuZWVkIHRoZSBkZWxpdmVyeV9zeXN0ZW0gdG8KKwkgKiBiZSBzcGVjaWZpZWQsIGJ1dCB3ZSBwb3B1bGF0ZSB0aGUgb2xkZXIgc3RydWN0dXJlcyBmcm9tIHRoZSBjYWNoZQorCSAqIHNvIHdlIGNhbiBjYWxsIHNldF9mcm9udGVuZCBvbiBvbGRlciBkcml2ZXJzLgorCSAqLworCWlmKGlzX2xlZ2FjeV9kZWxpdmVyeV9zeXN0ZW0oYy0+ZGVsaXZlcnlfc3lzdGVtKSkgeworCisJCXByaW50aygiJXMoKSBsZWdhY3ksIG1vZHVsYXRpb24gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBjLT5tb2R1bGF0aW9uKTsKKwkJZHR2X3Byb3BlcnR5X2xlZ2FjeV9wYXJhbXNfc3luYyhmZSk7CisKKwl9IGVsc2UgeworCQlwcmludGsoIiVzKCkgYWR2LCBtb2R1bGF0aW9uID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgYy0+bW9kdWxhdGlvbik7CisKKwkJLyogRm9yIGFkdmFuY2VkIGRlbGl2ZXJ5IHN5c3RlbXMgLyBtb2R1bGF0aW9uIHR5cGVzIC4uLgorCQkgKiB3ZSBzZWVkIHRoZSBsZWNhY3kgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgc3RydWN0dXJlCisJCSAqIHNvIHRoYXQgdGhlIHNhbml0eSBjaGVja2luZyBjb2RlIGxhdGVyIGluIHRoZSBJT0NUTCBwcm9jZXNzaW5nCisJCSAqIGNhbiB2YWxpZGF0ZSBvdXIgYmFzaWMgZnJlcXVlbmN5IHJhbmdlcywgc3ltYm9scmF0ZXMsIG1vZHVsYXRpb24KKwkJICogZXRjLgorCQkgKi8KKwkJZHR2X3Byb3BlcnR5X2Fkdl9wYXJhbXNfc3luYyhmZSk7CisJfQorfQorCitzdGF0aWMgaW50IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnKTsKK3N0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2lvY3RsX3Byb3BlcnRpZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnKTsKKworaW50IGR0dl9wcm9wZXJ0eV9wcm9jZXNzX2dldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwLAorCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByID0gMDsKKworCXByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWR0dl9wcm9wZXJ0eV9kdW1wKHR2cCk7CisKKwkvKiBBbGxvdyB0aGUgZnJvbnRlbmQgdG8gdmFsaWRhdGUgaW5jb21pbmcgcHJvcGVydGllcyAqLworCWlmIChmZS0+b3BzLmdldF9wcm9wZXJ0eSkKKwkJciA9IGZlLT5vcHMuZ2V0X3Byb3BlcnR5KGZlLCB0dnApOworCisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXN3aXRjaCh0dnAtPmNtZCkgeworCWNhc2UgRFRWX0ZSRVFVRU5DWToKKwkJdHZwLT51LmRhdGEgPSBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmZyZXF1ZW5jeTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfTU9EVUxBVElPTjoKKwkJdHZwLT51LmRhdGEgPSBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLm1vZHVsYXRpb247CisJCWJyZWFrOworCWNhc2UgRFRWX0JBTkRXSURUSF9IWjoKKwkJdHZwLT51LmRhdGEgPSBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmJhbmR3aWR0aF9oejsKKwkJYnJlYWs7CisJY2FzZSBEVFZfSU5WRVJTSU9OOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuaW52ZXJzaW9uOworCQlicmVhazsKKwljYXNlIERUVl9TWU1CT0xfUkFURToKKwkJdHZwLT51LmRhdGEgPSBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnN5bWJvbF9yYXRlOworCQlicmVhazsKKwljYXNlIERUVl9JTk5FUl9GRUM6CisJCXR2cC0+dS5kYXRhID0gZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5mZWNfaW5uZXI7CisJCWJyZWFrOworCWNhc2UgRFRWX1BJTE9UOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUucGlsb3Q7CisJCWJyZWFrOworCWNhc2UgRFRWX1JPTExPRkY6CisJCXR2cC0+dS5kYXRhID0gZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5yb2xsb2ZmOworCQlicmVhazsKKwljYXNlIERUVl9ERUxJVkVSWV9TWVNURU06CisJCXR2cC0+dS5kYXRhID0gZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5kZWxpdmVyeV9zeXN0ZW07CisJCWJyZWFrOworCWNhc2UgRFRWX1ZPTFRBR0U6CisJCXR2cC0+dS5kYXRhID0gZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS52b2x0YWdlOworCQlicmVhazsKKwljYXNlIERUVl9UT05FOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuc2VjdG9uZTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfQVBJX1ZFUlNJT046CisJCXR2cC0+dS5kYXRhID0gKERWQl9BUElfVkVSU0lPTiA8PCA4KSB8IERWQl9BUElfVkVSU0lPTl9NSU5PUjsKKwkJYnJlYWs7CisJY2FzZSBEVFZfQ09ERV9SQVRFX0hQOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuY29kZV9yYXRlX0hQOworCQlicmVhazsKKwljYXNlIERUVl9DT0RFX1JBVEVfTFA6CisJCXR2cC0+dS5kYXRhID0gZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5jb2RlX3JhdGVfTFA7CisJCWJyZWFrOworCWNhc2UgRFRWX0dVQVJEX0lOVEVSVkFMOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZ3VhcmRfaW50ZXJ2YWw7CisJCWJyZWFrOworCWNhc2UgRFRWX1RSQU5TTUlTU0lPTl9NT0RFOgorCQl0dnAtPnUuZGF0YSA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUudHJhbnNtaXNzaW9uX21vZGU7CisJCWJyZWFrOworCWNhc2UgRFRWX0hJRVJBUkNIWToKKwkJdHZwLT51LmRhdGEgPSBmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmhpZXJhcmNoeTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC0xOworCX0KKworCXJldHVybiByOworfQorCitpbnQgZHR2X3Byb3BlcnR5X3Byb2Nlc3Nfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnAsCisJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHIgPSAwOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CisJcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWR0dl9wcm9wZXJ0eV9kdW1wKHR2cCk7CisKKwkvKiBBbGxvdyB0aGUgZnJvbnRlbmQgdG8gdmFsaWRhdGUgaW5jb21pbmcgcHJvcGVydGllcyAqLworCWlmIChmZS0+b3BzLnNldF9wcm9wZXJ0eSkKKwkJciA9IGZlLT5vcHMuc2V0X3Byb3BlcnR5KGZlLCB0dnApOworCisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXN3aXRjaCh0dnAtPmNtZCkgeworCWNhc2UgRFRWX0NMRUFSOgorCQkvKiBSZXNldCBhIGNhY2hlIG9mIGRhdGEgc3BlY2lmaWMgdG8gdGhlIGZyb250ZW5kIGhlcmUuIFRoaXMgZG9lcworCQkgKiBub3QgZWZmZWN0IGhhcmR3YXJlLgorCQkgKi8KKwkJcHJpbnRrKCIlcygpIEZsdXNoaW5nIHByb3BlcnR5IGNhY2hlXG4iLCBfX0ZVTkNUSU9OX18pOworCQltZW1zZXQoJmZlLT5kdHZfcHJvcGVydHlfY2FjaGUsIDAsIHNpemVvZihzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMpKTsKKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5zdGF0ZSA9IHR2cC0+Y21kOworCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19VTkRFRklORUQ7CisJCWJyZWFrOworCWNhc2UgRFRWX1RVTkU6CisJCS8qIGludGVycHJldCB0aGUgY2FjaGUgb2YgZGF0YSwgYnVpbGQgZWl0aGVyIGEgdHJhZGl0aW9uYWwgZnJvbnRlbmQKKwkJICogdHVuZXJlcXVlc3Qgc28gd2UgY2FuIHBhc3MgdmFsaWRhdGlvbiBpbiB0aGUgRkVfU0VUX0ZST05URU5ECisJCSAqIGlvY3RsLgorCQkgKi8KKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5zdGF0ZSA9IHR2cC0+Y21kOworCQlwcmludGsoIiVzKCkgRmluYWxpc2VkIHByb3BlcnR5IGNhY2hlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkdHZfcHJvcGVydHlfY2FjaGVfc3VibWl0KGZlKTsKKworCQlyIHw9IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koaW5vZGUsIGZpbGUsIEZFX1NFVF9GUk9OVEVORCwKKwkJCSZmZXByaXYtPnBhcmFtZXRlcnMpOworCQlicmVhazsKKwljYXNlIERUVl9GUkVRVUVOQ1k6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZnJlcXVlbmN5ID0gdHZwLT51LmRhdGE7CisJCWJyZWFrOworCWNhc2UgRFRWX01PRFVMQVRJT046CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUubW9kdWxhdGlvbiA9IHR2cC0+dS5kYXRhOworCQlicmVhazsKKwljYXNlIERUVl9CQU5EV0lEVEhfSFo6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuYmFuZHdpZHRoX2h6ID0gdHZwLT51LmRhdGE7CisJCWJyZWFrOworCWNhc2UgRFRWX0lOVkVSU0lPTjoKKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5pbnZlcnNpb24gPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfU1lNQk9MX1JBVEU6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuc3ltYm9sX3JhdGUgPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfSU5ORVJfRkVDOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmZlY19pbm5lciA9IHR2cC0+dS5kYXRhOworCQlicmVhazsKKwljYXNlIERUVl9QSUxPVDoKKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5waWxvdCA9IHR2cC0+dS5kYXRhOworCQlicmVhazsKKwljYXNlIERUVl9ST0xMT0ZGOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnJvbGxvZmYgPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfREVMSVZFUllfU1lTVEVNOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmRlbGl2ZXJ5X3N5c3RlbSA9IHR2cC0+dS5kYXRhOworCQlicmVhazsKKwljYXNlIERUVl9WT0xUQUdFOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnZvbHRhZ2UgPSB0dnAtPnUuZGF0YTsKKwkJciA9IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koaW5vZGUsIGZpbGUsIEZFX1NFVF9WT0xUQUdFLAorCQkJKHZvaWQgKilmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnZvbHRhZ2UpOworCQlicmVhazsKKwljYXNlIERUVl9UT05FOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnNlY3RvbmUgPSB0dnAtPnUuZGF0YTsKKwkJciA9IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koaW5vZGUsIGZpbGUsIEZFX1NFVF9UT05FLAorCQkJKHZvaWQgKilmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnNlY3RvbmUpOworCQlicmVhazsKKwljYXNlIERUVl9DT0RFX1JBVEVfSFA6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuY29kZV9yYXRlX0hQID0gdHZwLT51LmRhdGE7CisJCWJyZWFrOworCWNhc2UgRFRWX0NPREVfUkFURV9MUDoKKwkJZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZS5jb2RlX3JhdGVfTFAgPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfR1VBUkRfSU5URVJWQUw6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZ3VhcmRfaW50ZXJ2YWwgPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfVFJBTlNNSVNTSU9OX01PREU6CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUudHJhbnNtaXNzaW9uX21vZGUgPSB0dnAtPnUuZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBEVFZfSElFUkFSQ0hZOgorCQlmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmhpZXJhcmNoeSA9IHR2cC0+dS5kYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLTE7CisJfQorCisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZykKIHsKQEAgLTc3Niw2ICsxMzEwLDExNiBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZmZXByaXYtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKKwlpZiAoKGNtZCA9PSBGRV9TRVRfUFJPUEVSVFkpIHx8IChjbWQgPT0gRkVfR0VUX1BST1BFUlRZKSkKKwkJZXJyID0gZHZiX2Zyb250ZW5kX2lvY3RsX3Byb3BlcnRpZXMoaW5vZGUsIGZpbGUsIGNtZCwgcGFyZyk7CisJZWxzZSB7CisJCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuc3RhdGUgPSBEVFZfVU5ERUZJTkVEOworCQllcnIgPSBkdmJfZnJvbnRlbmRfaW9jdGxfbGVnYWN5KGlub2RlLCBmaWxlLCBjbWQsIHBhcmcpOworCX0KKworCXVwKCZmZXByaXYtPnNlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkdmJfZnJvbnRlbmRfaW9jdGxfcHJvcGVydGllcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBhcmcpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSA9IGR2YmRldi0+cHJpdjsKKwlpbnQgZXJyID0gMDsKKworCXN0cnVjdCBkdHZfcHJvcGVydGllcyAqdHZwcyA9IE5VTEw7CisJc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwID0gTlVMTDsKKwlpbnQgaTsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZihjbWQgPT0gRkVfU0VUX1BST1BFUlRZKSB7CisJCXByaW50aygiJXMoKSBGRV9TRVRfUFJPUEVSVFlcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJdHZwcyA9IChzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgX191c2VyICopcGFyZzsKKworCQlwcmludGsoIiVzKCkgcHJvcGVydGllcy5udW0gPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0dnBzLT5udW0pOworCQlwcmludGsoIiVzKCkgcHJvcGVydGllcy5wcm9wcyA9ICVwXG4iLCBfX0ZVTkNUSU9OX18sIHR2cHMtPnByb3BzKTsKKworCQkvKiBQdXQgYW4gYXJiaXRyYXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBjYW4KKwkJICogYmUgc2VudCBhdCBvbmNlICovCisJCWlmICgodHZwcy0+bnVtID09IDApIHx8ICh0dnBzLT5udW0gPiBEVFZfSU9DVExfTUFYX01TR1MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdHZwID0gKHN0cnVjdCBkdHZfcHJvcGVydHkgKikga21hbGxvYyh0dnBzLT5udW0gKgorCQkJc2l6ZW9mKHN0cnVjdCBkdHZfcHJvcGVydHkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0dnApIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcih0dnAsIHR2cHMtPnByb3BzLCB0dnBzLT5udW0gKiBzaXplb2Yoc3RydWN0IGR0dl9wcm9wZXJ0eSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdHZwcy0+bnVtOyBpKyspIHsKKwkJCSh0dnAgKyBpKS0+cmVzdWx0ID0gZHR2X3Byb3BlcnR5X3Byb2Nlc3Nfc2V0KGZlLCB0dnAgKyBpLCBpbm9kZSwgZmlsZSk7CisJCQllcnIgfD0gKHR2cCArIGkpLT5yZXN1bHQ7CisJCX0KKworCQlpZihmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnN0YXRlID09IERUVl9UVU5FKSB7CisJCQlwcmludGsoIiVzKCkgUHJvcGVydHkgY2FjaGUgaXMgZnVsbCwgdHVuaW5nXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisKKwl9IGVsc2UKKwlpZihjbWQgPT0gRkVfR0VUX1BST1BFUlRZKSB7CisJCXByaW50aygiJXMoKSBGRV9HRVRfUFJPUEVSVFlcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJdHZwcyA9IChzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgX191c2VyICopcGFyZzsKKworCQlwcmludGsoIiVzKCkgcHJvcGVydGllcy5udW0gPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0dnBzLT5udW0pOworCQlwcmludGsoIiVzKCkgcHJvcGVydGllcy5wcm9wcyA9ICVwXG4iLCBfX0ZVTkNUSU9OX18sIHR2cHMtPnByb3BzKTsKKworCQkvKiBQdXQgYW4gYXJiaXRyYXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBjYW4KKwkJICogYmUgc2VudCBhdCBvbmNlICovCisJCWlmICgodHZwcy0+bnVtID09IDApIHx8ICh0dnBzLT5udW0gPiBEVFZfSU9DVExfTUFYX01TR1MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdHZwID0gKHN0cnVjdCBkdHZfcHJvcGVydHkgKikga21hbGxvYyh0dnBzLT5udW0gKgorCQkJc2l6ZW9mKHN0cnVjdCBkdHZfcHJvcGVydHkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0dnApIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcih0dnAsIHR2cHMtPnByb3BzLCB0dnBzLT5udW0gKiBzaXplb2Yoc3RydWN0IGR0dl9wcm9wZXJ0eSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdHZwcy0+bnVtOyBpKyspIHsKKwkJCSh0dnAgKyBpKS0+cmVzdWx0ID0gZHR2X3Byb3BlcnR5X3Byb2Nlc3NfZ2V0KGZlLCB0dnAgKyBpLCBpbm9kZSwgZmlsZSk7CisJCQllcnIgfD0gKHR2cCArIGkpLT5yZXN1bHQ7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKHR2cHMtPnByb3BzLCB0dnAsIHR2cHMtPm51bSAqIHNpemVvZihzdHJ1Y3QgZHR2X3Byb3BlcnR5KSkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJfSBlbHNlCisJCWVyciA9IC1FT1BOT1RTVVBQOworCitvdXQ6CisJa2ZyZWUodHZwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGR2Yl9mcm9udGVuZF9pb2N0bF9sZWdhY3koc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wcml2YXRlICpmZXByaXYgPSBmZS0+ZnJvbnRlbmRfcHJpdjsKKwlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRkVfR0VUX0lORk86IHsKIAkJc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKiBpbmZvID0gcGFyZzsKQEAgLTk0MiwxMyArMTU4NiwyMSBAQAogCWNhc2UgRkVfU0VUX0ZST05URU5EOiB7CiAJCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyBmZXR1bmVzZXR0aW5nczsKIAotCQlpZiAoZHZiX2Zyb250ZW5kX2NoZWNrX3BhcmFtZXRlcnMoZmUsIHBhcmcpIDwgMCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9CisJCWlmKGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuc3RhdGUgPT0gRFRWX1RVTkUpIHsKKwkJCWlmIChkdmJfZnJvbnRlbmRfY2hlY2tfcGFyYW1ldGVycyhmZSwgJmZlcHJpdi0+cGFyYW1ldGVycykgPCAwKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChkdmJfZnJvbnRlbmRfY2hlY2tfcGFyYW1ldGVycyhmZSwgcGFyZykgPCAwKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KIAotCQltZW1jcHkgKCZmZXByaXYtPnBhcmFtZXRlcnMsIHBhcmcsCi0JCQlzaXplb2YgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOworCQkJbWVtY3B5ICgmZmVwcml2LT5wYXJhbWV0ZXJzLCBwYXJnLAorCQkJCXNpemVvZiAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CisJCQlkdHZfcHJvcGVydHlfY2FjaGVfc3luYyhmZSwgJmZlcHJpdi0+cGFyYW1ldGVycyk7CisJCX0KIAogCQltZW1zZXQoJmZldHVuZXNldHRpbmdzLCAwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzKSk7CiAJCW1lbWNweSgmZmV0dW5lc2V0dGluZ3MucGFyYW1ldGVycywgcGFyZywKQEAgLTEwMjcsMTAgKzE2NzksMTAgQEAKIAkJYnJlYWs7CiAJfTsKIAotCXVwICgmZmVwcml2LT5zZW0pOwogCXJldHVybiBlcnI7CiB9CiAKKwogc3RhdGljIHVuc2lnbmVkIGludCBkdmJfZnJvbnRlbmRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewogCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IGFhNDEzM2YuLjMwNTUzMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC0xNjksNiArMTY5LDkgQEAKIAogCXN0cnVjdCBkdmJfdHVuZXJfb3BzIHR1bmVyX29wczsKIAlzdHJ1Y3QgYW5hbG9nX2RlbW9kX29wcyBhbmFsb2dfb3BzOworCisJaW50ICgqc2V0X3Byb3BlcnR5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR0dl9wcm9wZXJ0eSogdHZwKTsKKwlpbnQgKCpnZXRfcHJvcGVydHkpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHR2X3Byb3BlcnR5KiB0dnApOwogfTsKIAogI2RlZmluZSBNQVhfRVZFTlQgOApAQCAtMTgyLDYgKzE4NSwzMiBAQAogCXN0cnVjdCBtdXRleAkJICBtdHg7CiB9OwogCitzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgeworCisJLyogQ2FjaGUgU3RhdGUgKi8KKwl1MzIJCQlzdGF0ZTsKKworCXUzMgkJCWZyZXF1ZW5jeTsKKwlmZV9tb2R1bGF0aW9uX3QJCW1vZHVsYXRpb247CisKKwlmZV9zZWNfdm9sdGFnZV90CXZvbHRhZ2U7CisJZmVfc2VjX3RvbmVfbW9kZV90CXNlY3RvbmU7CisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QJaW52ZXJzaW9uOworCWZlX2NvZGVfcmF0ZV90CQlmZWNfaW5uZXI7CisJZmVfdHJhbnNtaXRfbW9kZV90CXRyYW5zbWlzc2lvbl9tb2RlOworCXUzMgkJCWJhbmR3aWR0aF9oejsJLyogMCA9IEFVVE8gKi8KKwlmZV9ndWFyZF9pbnRlcnZhbF90CWd1YXJkX2ludGVydmFsOworCWZlX2hpZXJhcmNoeV90CQloaWVyYXJjaHk7CisJdTMyCQkJc3ltYm9sX3JhdGU7CisJZmVfY29kZV9yYXRlX3QJCWNvZGVfcmF0ZV9IUDsKKwlmZV9jb2RlX3JhdGVfdAkJY29kZV9yYXRlX0xQOworCisJZmVfcGlsb3RfdAkJcGlsb3Q7CisJZmVfcm9sbG9mZl90CQlyb2xsb2ZmOworCisJZmVfZGVsaXZlcnlfc3lzdGVtX3QJZGVsaXZlcnlfc3lzdGVtOworfTsKKwogc3RydWN0IGR2Yl9mcm9udGVuZCB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiOwpAQCAtMTkwLDYgKzIxOSw5IEBACiAJdm9pZCAqZnJvbnRlbmRfcHJpdjsKIAl2b2lkICpzZWNfcHJpdjsKIAl2b2lkICphbmFsb2dfZGVtb2RfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgZHR2X3Byb3BlcnR5X2NhY2hlOworI2RlZmluZSBEVkJfRlJPTlRFTkRfQ09NUE9ORU5UX1RVTkVSIDAKKwlpbnQgKCpjYWxsYmFjaykodm9pZCAqYWRhcHRlcl9wcml2LCBpbnQgY29tcG9uZW50LCBpbnQgY21kLCBpbnQgYXJnKTsKIH07CiAKIGV4dGVybiBpbnQgZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwppbmRleCBlNzEzMjc3Li42NjU3NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIAltdXRleF91bmxvY2soJmR2YmRldl9yZWdpc3Rlcl9sb2NrKTsKIAotCWNsc2RldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShkdmJfY2xhc3MsIGFkYXAtPmRldmljZSwKKwljbHNkZXYgPSBkZXZpY2VfY3JlYXRlKGR2Yl9jbGFzcywgYWRhcC0+ZGV2aWNlLAogCQkJICAgICAgIE1LREVWKERWQl9NQUpPUiwgbnVtczJtaW5vcihhZGFwLT5udW0sIHR5cGUsIGlkKSksCiAJCQkgICAgICAgTlVMTCwgImR2YiVkLiVzJWQiLCBhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQpOwogCWlmIChJU19FUlIoY2xzZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCmluZGV4IGU4NDE1MmIuLjNjMTNiY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKQEAgLTcyLDkgKzcyLDExIEBACiAJc2VsZWN0IERWQl9ESUI3MDAwUAogCXNlbGVjdCBEVkJfRElCNzAwME0KIAlzZWxlY3QgRFZCX0RJQjMwMDBNQworCXNlbGVjdCBEVkJfUzVIMTQxMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfTVQyMjY2IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDMjAyOCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBNRURJQV9UVU5FUl9YQzUwMDAgaWYgIURWQl9GRV9DVVNUT01JWkUKIAlzZWxlY3QgRFZCX1RVTkVSX0RJQjAwNzAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IyLjAvMS4xIERWQiByZWNlaXZlcnMgYmFzZWQgb24gdGhlIERpQjA3MDAgVVNCIGJyaWRnZS4gVGhlCkBAIC0xMDgsNiArMTEwLDggQEAKIAlzZWxlY3QgTUVESUFfVFVORVJfU0lNUExFIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDMjAyOCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9NWEw1MDA1UyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRElCNzAwMFAgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1RVTkVSX0RJQjAwNzAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIENvbmV4YW50IFVTQjIuMCBoeWJyaWQgcmVmZXJlbmNlIGRlc2lnbi4KIAkgIEN1cnJlbnRseSwgb25seSBEVkIgYW5kIEFUU0MgbW9kZXMgYXJlIHN1cHBvcnRlZCwgYW5hbG9nIG1vZGUKQEAgLTI0NSwxMiArMjQ5LDI1IEBACiAJICBBZmF0ZWNoIEFGOTAwNSBiYXNlZCByZWNlaXZlci4KIAogY29uZmlnIERWQl9VU0JfRFcyMTAyCi0JdHJpc3RhdGUgIkR2YldvcmxkIDIxMDIgRFZCLVMgVVNCMi4wIHJlY2VpdmVyIgorCXRyaXN0YXRlICJEdmJXb3JsZCBEVkItUy9TMiBVU0IyLjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIERWQl9VU0IKLQlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1BMTCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RWMDI5OSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RWMDI4OCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RCNjAwMCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfQ1gyNDExNiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU0kyMVhYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscAotCSAgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgRHZiV29ybGQgMjEwMiBEVkItUyBVU0IyLjAgcmVjZWl2ZXIuCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIER2YldvcmxkIERWQi1TL1MyIFVTQjIuMCByZWNlaXZlcnMKKwkgIGFuZCB0aGUgVGVWaWkgUzY1MC4KKworY29uZmlnIAlEVkJfVVNCX0NJTkVSR1lfVDIKKwl0cmlzdGF0ZSAiVGVycmF0ZWMgQ2luZXJneVQyL3FhbnUgVVNCIDIuMCBEVkItVCByZWNlaXZlciIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTdXBwb3J0IGZvciAiVGVycmFUZWMgQ2luZXJneVQyIiBVU0IyLjAgSGlnaHNwZWVkIERWQiBSZWNlaXZlcnMKKworCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KIAogY29uZmlnIERWQl9VU0JfQU5ZU0VFCiAJdHJpc3RhdGUgIkFueXNlZSBEVkItVC9DIFVTQjIuMCBzdXBwb3J0IgpAQCAtMjYyLDMgKzI3OSwyMiBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgQW55c2VlIEUzMCwgQW55c2VlIEUzMCBQbHVzIG9yCiAJICBBbnlzZWUgRTMwIEMgUGx1cyBEVkIgVVNCMi4wIHJlY2VpdmVyLgorCitjb25maWcgRFZCX1VTQl9EVFY1MTAwCisJdHJpc3RhdGUgIkFNRSBEVFYtNTEwMCBVU0IyLjAgRFZCLVQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgTUVESUFfVFVORVJfUVQxMDEwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBBTUUgRFRWLTUxMDAgVVNCMi4wIERWQi1UIHJlY2VpdmVyLgorCitjb25maWcgRFZCX1VTQl9BRjkwMTUKKwl0cmlzdGF0ZSAiQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfVVNCICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBEVkJfQUY5MDEzCisJc2VsZWN0IERWQl9QTEwgICAgICAgICAgICAgIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX01UMjA2MCAgIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX1FUMTAxMCAgIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX1REQTE4MjcxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX01YTDUwMDVTIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBBZmF0ZWNoIEFGOTAxNSBiYXNlZCBEVkItVCBVU0IyLjAgcmVjZWl2ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCmluZGV4IGUyMDZmMWUuLjMxMjJiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQpAQCAtNjcsNiArNjcsMTYgQEAKIGR2Yi11c2ItZHcyMTAyLW9ianMgPSBkdzIxMDIubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRFcyMTAyKSArPSBkdmItdXNiLWR3MjEwMi5vCiAKK2R2Yi11c2ItZHR2NTEwMC1vYmpzID0gZHR2NTEwMC5vCitvYmotJChDT05GSUdfRFZCX1VTQl9EVFY1MTAwKSArPSBkdmItdXNiLWR0djUxMDAubworCitkdmItdXNiLWFmOTAxNS1vYmpzID0gYWY5MDE1Lm8KK29iai0kKENPTkZJR19EVkJfVVNCX0FGOTAxNSkgKz0gZHZiLXVzYi1hZjkwMTUubworCitkdmItdXNiLWNpbmVyZ3lUMi1vYmpzID0gY2luZXJneVQyLWNvcmUubyBjaW5lcmd5VDItZmUubworb2JqLSQoQ09ORklHX0RWQl9VU0JfQ0lORVJHWV9UMikgKz0gZHZiLXVzYi1jaW5lcmd5VDIubworCisKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KICMgZHVlIHRvIHR1bmVyLXhjMzAyOAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS1yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCmluZGV4IGZmMDBjMGUuLjdjNTk2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXJlbW90ZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAgKi8KICNpbmNsdWRlICJhZjkwMDUuaCIKIC8qIGRlYnVnICovCi1pbnQgZHZiX3VzYl9hZjkwMDVfcmVtb3RlX2RlYnVnOworc3RhdGljIGludCBkdmJfdXNiX2FmOTAwNV9yZW1vdGVfZGVidWc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGR2Yl91c2JfYWY5MDA1X3JlbW90ZV9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsCiAJCSAiZW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSBkZWJ1ZyBtZXNzYWdlcy4iCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS1zY3JpcHQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXNjcmlwdC5oCmluZGV4IDZlZWFhZTUuLjRkNjkwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXNjcmlwdC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LXNjcmlwdC5oCkBAIC0xNCw3ICsxNCw3IEBACiAJdTggdmFsOwogfSBSZWdEZXNjOwogCi1SZWdEZXNjIHNjcmlwdFtdID0geworc3RhdGljIFJlZ0Rlc2Mgc2NyaXB0W10gPSB7CiAJezB4YTE4MCwgMHgwLCAweDgsIDB4YX0sCiAJezB4YTE4MSwgMHgwLCAweDgsIDB4ZDd9LAogCXsweGExODIsIDB4MCwgMHg4LCAweGEzfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jCmluZGV4IGNmZTcxZmUuLmNhNWEwYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUuYwpAQCAtMzUsMTcgKzM1LDE3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGxlZCwgImVuYWJsZSBsZWQgKGRlZmF1bHQ6IDEpLiIpOwogCiAvKiBlZXByb20gZHVtcCAqLwotaW50IGR2Yl91c2JfYWY5MDA1X2R1bXBfZWVwcm9tID0gMDsKK3N0YXRpYyBpbnQgZHZiX3VzYl9hZjkwMDVfZHVtcF9lZXByb207CiBtb2R1bGVfcGFyYW1fbmFtZWQoZHVtcF9lZXByb20sIGR2Yl91c2JfYWY5MDA1X2R1bXBfZWVwcm9tLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkdW1wX2VlcHJvbSwgImR1bXAgY29udGVudHMgb2YgdGhlIGVlcHJvbS4iKTsKIAogRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CiAKIC8qIHJlbW90ZSBjb250cm9sIGRlY29kZXIgKi8KLWludCAoKnJjX2RlY29kZSkgKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqIGQsIHU4ICogZGF0YSwgaW50IGxlbiwgdTMyICogZXZlbnQsCi0JCSAgaW50ICpzdGF0ZSk7Ci12b2lkICpyY19rZXlzOwotaW50ICpyY19rZXlzX3NpemU7CitzdGF0aWMgaW50ICgqcmNfZGVjb2RlKSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCAqZGF0YSwgaW50IGxlbiwKKwkJdTMyICpldmVudCwgaW50ICpzdGF0ZSk7CitzdGF0aWMgdm9pZCAqcmNfa2V5czsKK3N0YXRpYyBpbnQgKnJjX2tleXNfc2l6ZTsKIAogdTggcmVnbWFza1s4XSA9IHsgMHgwMSwgMHgwMywgMHgwNywgMHgwZiwgMHgxZiwgMHgzZiwgMHg3ZiwgMHhmZiB9OwogCkBAIC01NCw4ICs1NCw4IEBACiAJaW50IGxlZF9zdGF0ZTsKIH07CiAKLWludCBhZjkwMDVfdXNiX2dlbmVyaWNfcncoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCAqIHdidWYsIHUxNiB3bGVuLAotCQkJICB1OCAqIHJidWYsIHUxNiBybGVuLCBpbnQgZGVsYXlfbXMpCitzdGF0aWMgaW50IGFmOTAwNV91c2JfZ2VuZXJpY19ydyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4ICp3YnVmLCB1MTYgd2xlbiwKKwkJCSAgdTggKnJidWYsIHUxNiBybGVuLCBpbnQgZGVsYXlfbXMpCiB7CiAJaW50IGFjdGxlbiwgcmV0ID0gLUVOT01FTTsKIApAQCAtOTgsMTIgKzk4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYWY5MDA1X3VzYl9nZW5lcmljX3dyaXRlKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggKiBidWYsIHUxNiBsZW4pCi17Ci0JcmV0dXJuIGFmOTAwNV91c2JfZ2VuZXJpY19ydyhkLCBidWYsIGxlbiwgTlVMTCwgMCwgMCk7Ci19Ci0KLWludCBhZjkwMDVfZ2VuZXJpY19yZWFkX3dyaXRlKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTE2IHJlZywKK3N0YXRpYyBpbnQgYWY5MDA1X2dlbmVyaWNfcmVhZF93cml0ZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUxNiByZWcsCiAJCQkgICAgICBpbnQgcmVhZHdyaXRlLCBpbnQgdHlwZSwgdTggKiB2YWx1ZXMsIGludCBsZW4pCiB7CiAJc3RydWN0IGFmOTAwNV9kZXZpY2Vfc3RhdGUgKnN0ID0gZC0+cHJpdjsKQEAgLTc2NSw3ICs3NjAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYWY5MDA1X2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQorc3RhdGljIGludCBhZjkwMDVfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCiB7CiAJaW50IGksIHBhY2tldHMsIHJldCwgYWN0X2xlbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwODI5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKQEAgLTAsMCArMSwxNDc0IEBACisvKgorICogRFZCIFVTQiBMaW51eCBkcml2ZXIgZm9yIEFmYXRlY2ggQUY5MDE1IERWQi1UIFVTQjIuMCByZWNlaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiBUaGFua3MgdG8gQWZhdGVjaCB3aG8ga2luZGx5IHByb3ZpZGVkIGluZm9ybWF0aW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiYWY5MDE1LmgiCisjaW5jbHVkZSAiYWY5MDEzLmgiCisjaW5jbHVkZSAibXQyMDYwLmgiCisjaW5jbHVkZSAicXQxMDEwLmgiCisjaW5jbHVkZSAidGRhMTgyNzEuaCIKKyNpbmNsdWRlICJteGw1MDA1cy5oIgorI2lmIDAKKyNpbmNsdWRlICJtYzQ0czgweC5oIgorI2VuZGlmCisKK2ludCBkdmJfdXNiX2FmOTAxNV9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHZiX3VzYl9hZjkwMTVfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworaW50IGR2Yl91c2JfYWY5MDE1X3JlbW90ZTsKK21vZHVsZV9wYXJhbV9uYW1lZChyZW1vdGUsIGR2Yl91c2JfYWY5MDE1X3JlbW90ZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVtb3RlLCAic2VsZWN0IHJlbW90ZSIpOworaW50IGR2Yl91c2JfYWY5MDE1X2R1YWxfbW9kZTsKK21vZHVsZV9wYXJhbV9uYW1lZChkdWFsX21vZGUsIGR2Yl91c2JfYWY5MDE1X2R1YWxfbW9kZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZHVhbF9tb2RlLCAiZW5hYmxlIGR1YWwgbW9kZSIpOworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKK3N0YXRpYyBERUZJTkVfTVVURVgoYWY5MDE1X3VzYl9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3QgYWY5MDE1X2NvbmZpZyBhZjkwMTVfY29uZmlnOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGFmOTAxNV9wcm9wZXJ0aWVzWzJdOworaW50IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50ID0gQVJSQVlfU0laRShhZjkwMTVfcHJvcGVydGllcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYWY5MDEzX2NvbmZpZyBhZjkwMTVfYWY5MDEzX2NvbmZpZ1tdID0geworCXsKKwkJLmRlbW9kX2FkZHJlc3MgPSBBRjkwMTVfSTJDX0RFTU9ELAorCQkub3V0cHV0X21vZGUgPSBBRjkwMTNfT1VUUFVUX01PREVfVVNCLAorCQkuYXBpX3ZlcnNpb24gPSB7IDAsIDEsIDksIDAgfSwKKwkJLmdwaW9bMF0gPSBBRjkwMTNfR1BJT19ISSwKKwkJLmdwaW9bM10gPSBBRjkwMTNfR1BJT19UVU5FUl9PTiwKKworCX0sIHsKKwkJLm91dHB1dF9tb2RlID0gQUY5MDEzX09VVFBVVF9NT0RFX1NFUklBTCwKKwkJLmFwaV92ZXJzaW9uID0geyAwLCAxLCA5LCAwIH0sCisJCS5ncGlvWzBdID0gQUY5MDEzX0dQSU9fVFVORVJfT04sCisJCS5ncGlvWzFdID0gQUY5MDEzX0dQSU9fTE8sCisJfQorfTsKKworc3RhdGljIGludCBhZjkwMTVfcndfdWRldihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IHJlcV90ICpyZXEpCit7CisJaW50IGFjdF9sZW4sIHJldDsKKwl1OCBidWZbNjRdOworCXU4IHdyaXRlID0gMTsKKwl1OCBtc2dfbGVuID0gODsKKwlzdGF0aWMgdTggc2VxOyAvKiBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyICovCisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZjkwMTVfdXNiX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmWzBdID0gcmVxLT5jbWQ7CisJYnVmWzFdID0gc2VxKys7CisJYnVmWzJdID0gcmVxLT5pMmNfYWRkcjsKKwlidWZbM10gPSByZXEtPmFkZHIgPj4gODsKKwlidWZbNF0gPSByZXEtPmFkZHIgJiAweGZmOworCWJ1Zls1XSA9IHJlcS0+bWJveDsKKwlidWZbNl0gPSByZXEtPmFkZHJfbGVuOworCWJ1Zls3XSA9IHJlcS0+ZGF0YV9sZW47CisKKwlzd2l0Y2ggKHJlcS0+Y21kKSB7CisJY2FzZSBHRVRfQ09ORklHOgorCWNhc2UgQk9PVDoKKwljYXNlIFJFQURfTUVNT1JZOgorCWNhc2UgUkVDT05ORUNUX1VTQjoKKwljYXNlIEdFVF9JUl9DT0RFOgorCQl3cml0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUkVBRF9JMkM6CisJCXdyaXRlID0gMDsKKwkJYnVmWzJdIHw9IDB4MDE7IC8qIHNldCBJMkMgZGlyZWN0aW9uICovCisJY2FzZSBXUklURV9JMkM6CisJCWJ1ZlswXSA9IFJFQURfV1JJVEVfSTJDOworCQlicmVhazsKKwljYXNlIFdSSVRFX01FTU9SWToKKwkJaWYgKCgocmVxLT5hZGRyICYgMHhmZjAwKSA9PSAweGZmMDApIHx8CisJCSAgICAoKHJlcS0+YWRkciAmIDB4YWUwMCkgPT0gMHhhZTAwKSkKKwkJCWJ1ZlswXSA9IFdSSVRFX1ZJUlRVQUxfTUVNT1JZOworCWNhc2UgV1JJVEVfVklSVFVBTF9NRU1PUlk6CisJY2FzZSBDT1BZX0ZJUk1XQVJFOgorCWNhc2UgRE9XTkxPQURfRklSTVdBUkU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigidW5rbm93biBjb21tYW5kOiVkIiwgcmVxLT5jbWQpOworCQlyZXQgPSAtMTsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJLyogd3JpdGUgcmVxdWVzdGVkICovCisJaWYgKHdyaXRlKSB7CisJCW1lbWNweSgmYnVmWzhdLCByZXEtPmRhdGEsIHJlcS0+ZGF0YV9sZW4pOworCQltc2dfbGVuICs9IHJlcS0+ZGF0YV9sZW47CisJfQorCWRlYl94ZmVyKCI+Pj4gIik7CisJZGVidWdfZHVtcChidWYsIG1zZ19sZW4sIGRlYl94ZmVyKTsKKworCS8qIHNlbmQgcmVxICovCisJcmV0ID0gdXNiX2J1bGtfbXNnKHVkZXYsIHVzYl9zbmRidWxrcGlwZSh1ZGV2LCAweDAyKSwgYnVmLCBtc2dfbGVuLAorCSZhY3RfbGVuLCBBRjkwMTVfVVNCX1RJTUVPVVQpOworCWlmIChyZXQpCisJCWVycigiYnVsayBtZXNzYWdlIGZhaWxlZDolZCAoJWQvJWQpIiwgcmV0LCBtc2dfbGVuLCBhY3RfbGVuKTsKKwllbHNlCisJCWlmIChhY3RfbGVuICE9IG1zZ19sZW4pCisJCQlyZXQgPSAtMTsgLyogYWxsIGRhdGEgaXMgbm90IHNlbmQgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VubG9jazsKKworCS8qIG5vIGFjayBmb3IgdGhvc2UgcGFja2V0cyAqLworCWlmIChyZXEtPmNtZCA9PSBET1dOTE9BRF9GSVJNV0FSRSB8fCByZXEtPmNtZCA9PSBSRUNPTk5FQ1RfVVNCKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJLyogcmVjZWl2ZSBhY2sgYW5kIGRhdGEgaWYgcmVhZCByZXEgKi8KKwltc2dfbGVuID0gMSArIDEgKyByZXEtPmRhdGFfbGVuOyAgLyogc2VxICsgc3RhdHVzICsgZGF0YSBsZW4gKi8KKwlyZXQgPSB1c2JfYnVsa19tc2codWRldiwgdXNiX3JjdmJ1bGtwaXBlKHVkZXYsIDB4ODEpLCBidWYsIG1zZ19sZW4sCisJCQkgICAmYWN0X2xlbiwgQUY5MDE1X1VTQl9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWVycigicmVjdiBidWxrIG1lc3NhZ2UgZmFpbGVkOiVkIiwgcmV0KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZXJyb3JfdW5sb2NrOworCX0KKworCWRlYl94ZmVyKCI8PDwgIik7CisJZGVidWdfZHVtcChidWYsIGFjdF9sZW4sIGRlYl94ZmVyKTsKKworCS8qIHJlbW90ZSBjb250cm9sbGVyIHF1ZXJ5IHN0YXR1cyBpcyAxIGlmIHJlbW90ZSBjb2RlIGlzIG5vdCByZWNlaXZlZCAqLworCWlmIChyZXEtPmNtZCA9PSBHRVRfSVJfQ09ERSAmJiBidWZbMV0gPT0gMSkgeworCQlidWZbMV0gPSAwOyAvKiBjbGVhciBjb21tYW5kICJlcnJvciIgc3RhdHVzICovCisJCW1lbXNldCgmYnVmWzJdLCAwLCByZXEtPmRhdGFfbGVuKTsKKwkJYnVmWzNdID0gMTsgLyogbm8gcmVtb3RlIGNvZGUgcmVjZWl2ZWQgbWFyayAqLworCX0KKworCS8qIGNoZWNrIHN0YXR1cyAqLworCWlmIChidWZbMV0pIHsKKwkJZXJyKCJjb21tYW5kIGZhaWxlZDolZCIsIGJ1ZlsxXSk7CisJCXJldCA9IC0xOworCQlnb3RvIGVycm9yX3VubG9jazsKKwl9CisKKwkvKiByZWFkIHJlcXVlc3QsIGNvcHkgcmV0dXJuZWQgZGF0YSB0byByZXR1cm4gYnVmICovCisJaWYgKCF3cml0ZSkKKwkJbWVtY3B5KHJlcS0+ZGF0YSwgJmJ1ZlsyXSwgcmVxLT5kYXRhX2xlbik7CisKK2Vycm9yX3VubG9jazoKK2V4aXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWY5MDE1X3VzYl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxNV9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHN0cnVjdCByZXFfdCAqcmVxKQoreworCXJldHVybiBhZjkwMTVfcndfdWRldihkLT51ZGV2LCByZXEpOworfQorCitzdGF0aWMgaW50IGFmOTAxNV93cml0ZV9yZWdzKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTE2IGFkZHIsIHU4ICp2YWwsCisJdTggbGVuKQoreworCXN0cnVjdCByZXFfdCByZXEgPSB7V1JJVEVfTUVNT1JZLCBBRjkwMTVfSTJDX0RFTU9ELCBhZGRyLCAwLCAwLCBsZW4sCisJCXZhbH07CisJcmV0dXJuIGFmOTAxNV9jdHJsX21zZyhkLCAmcmVxKTsKK30KKworc3RhdGljIGludCBhZjkwMTVfd3JpdGVfcmVnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTE2IGFkZHIsIHU4IHZhbCkKK3sKKwlyZXR1cm4gYWY5MDE1X3dyaXRlX3JlZ3MoZCwgYWRkciwgJnZhbCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X3JlYWRfcmVnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTE2IGFkZHIsIHU4ICp2YWwpCit7CisJc3RydWN0IHJlcV90IHJlcSA9IHtSRUFEX01FTU9SWSwgQUY5MDE1X0kyQ19ERU1PRCwgYWRkciwgMCwgMCwgMSwgdmFsfTsKKwlyZXR1cm4gYWY5MDE1X2N0cmxfbXNnKGQsICZyZXEpOworfQorCitzdGF0aWMgaW50IGFmOTAxNV93cml0ZV9yZWdfaTJjKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggYWRkciwgdTE2IHJlZywKKwl1OCB2YWwpCit7CisJc3RydWN0IHJlcV90IHJlcSA9IHtXUklURV9JMkMsIGFkZHIsIHJlZywgMSwgMSwgMSwgJnZhbH07CisKKwlpZiAoYWRkciA9PSBhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzIHx8CisJICAgIGFkZHIgPT0gYWY5MDE1X2FmOTAxM19jb25maWdbMV0uZGVtb2RfYWRkcmVzcykKKwkJcmVxLmFkZHJfbGVuID0gMzsKKworCXJldHVybiBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X3JlYWRfcmVnX2kyYyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IGFkZHIsIHUxNiByZWcsCisJdTggKnZhbCkKK3sKKwlzdHJ1Y3QgcmVxX3QgcmVxID0ge1JFQURfSTJDLCBhZGRyLCByZWcsIDAsIDEsIDEsIHZhbH07CisKKwlpZiAoYWRkciA9PSBhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzIHx8CisJICAgIGFkZHIgPT0gYWY5MDE1X2FmOTAxM19jb25maWdbMV0uZGVtb2RfYWRkcmVzcykKKwkJcmVxLmFkZHJfbGVuID0gMzsKKworCXJldHVybiBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByZXQgPSAwLCBpID0gMDsKKwl1MTYgYWRkcjsKKwl1OCBtYm94LCBhZGRyX2xlbjsKKwlzdHJ1Y3QgcmVxX3QgcmVxOworCisvKiBUT0RPOiBpbXBsZW1lbnQgYnVzIGxvY2sKKworVGhlIGJ1cyBsb2NrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZXJlIGlzIHR3byB0dW5lcnMgYm90aCB1c2luZyBzYW1lIEkyQy1hZGRyZXNzLgorRHVlIHRvIHRoYXQgdGhlIG9ubHkgd2F5IHRvIHNlbGVjdCBjb3JyZWN0IHR1bmVyIGlzIHVzZSBkZW1vZHVsYXRvciBJMkMtZ2F0ZS4KKworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisuIEFGOTAxNSBpbmNsdWRlcyBpbnRlZ3JhdGVkIEFGOTAxMyBkZW1vZHVsYXRvci4KKy4gX19fX19fX19fX19fICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fXyAgLiAgICAgICAgICAgICAgICBfX19fX19fX19fX18KKy58ICAgICB1QyAgICAgfCAgICAgICAgICAgICAgICAgfCAgIGRlbW9kICAgIHwgLiAgICAgICAgICAgICAgIHwgICAgdHVuZXIgICB8CisufC0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS18IC4gICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tfAorLnwgICBBRjkwMTUgICB8ICAgICAgICAgICAgICAgICB8ICBBRjkwMTMvNSAgfCAuICAgICAgICAgICAgICAgfCAgIE1YTDUwMDMgIHwKKy58ICAgICAgICAgICAgfC0tKy0tLS1JMkMtLS0tLS0tfC0tLS0tLyAtLS0tLXwtLi0tLS0tSTJDLS0tLS0tLXwgICAgICAgICAgICB8CisufCAgICAgICAgICAgIHwgIHwgICAgICAgICAgICAgIHwgYWRkciAweDM4ICB8IC4gICAgICAgICAgICAgICB8ICBhZGRyIDB4YzYgfAorLnxfX19fX19fX19fX198ICB8ICAgICAgICAgICAgICB8X19fX19fX19fX19ffCAuICAgICAgICAgICAgICAgfF9fX19fX19fX19fX3wKKy4uLi4uLi4uLi4uLi4uLi4ufC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCQkgfCAgICAgICAgICAgICAgIF9fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX18KKwkJIHwgICAgICAgICAgICAgIHwgICBkZW1vZCAgICB8ICAgICAgICAgICAgICAgICB8ICAgIHR1bmVyICAgfAorCQkgfCAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS18CisJCSB8ICAgICAgICAgICAgICB8ICAgQUY5MDEzICAgfCAgICAgICAgICAgICAgICAgfCAgIE1YTDUwMDMgIHwKKwkJICstLS0tSTJDLS0tLS0tLXwtLS0tLS8gLS0tLS18LS0tLS0tLUkyQy0tLS0tLS18ICAgICAgICAgICAgfAorCQkJCXwgYWRkciAweDNhICB8ICAgICAgICAgICAgICAgICB8ICBhZGRyIDB4YzYgfAorCQkJCXxfX19fX19fX19fX198ICAgICAgICAgICAgICAgICB8X19fX19fX19fX19ffAorKi8KKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl3aGlsZSAoaSA8IG51bSkgeworCQlpZiAobXNnW2ldLmFkZHIgPT0gYWY5MDE1X2FmOTAxM19jb25maWdbMF0uZGVtb2RfYWRkcmVzcyB8fAorCQkgICAgbXNnW2ldLmFkZHIgPT0gYWY5MDE1X2FmOTAxM19jb25maWdbMV0uZGVtb2RfYWRkcmVzcykgeworCQkJYWRkciA9IG1zZ1tpXS5idWZbMF0gPDwgODsKKwkJCWFkZHIgKz0gbXNnW2ldLmJ1ZlsxXTsKKwkJCW1ib3ggPSBtc2dbaV0uYnVmWzJdOworCQkJYWRkcl9sZW4gPSAzOworCQl9IGVsc2UgeworCQkJYWRkciA9IG1zZ1tpXS5idWZbMF07CisJCQlhZGRyX2xlbiA9IDE7CisJCQltYm94ID0gMDsKKwkJfQorCisJCWlmIChudW0gPiBpICsgMSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJCWlmIChtc2dbaV0uYWRkciA9PQorCQkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLmRlbW9kX2FkZHJlc3MpCisJCQkJcmVxLmNtZCA9IFJFQURfTUVNT1JZOworCQkJZWxzZQorCQkJCXJlcS5jbWQgPSBSRUFEX0kyQzsKKwkJCXJlcS5pMmNfYWRkciA9IG1zZ1tpXS5hZGRyOworCQkJcmVxLmFkZHIgPSBhZGRyOworCQkJcmVxLm1ib3ggPSBtYm94OworCQkJcmVxLmFkZHJfbGVuID0gYWRkcl9sZW47CisJCQlyZXEuZGF0YV9sZW4gPSBtc2dbaSsxXS5sZW47CisJCQlyZXEuZGF0YSA9ICZtc2dbaSsxXS5idWZbMF07CisJCQlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CisJCQlpICs9IDI7CisJCX0gZWxzZSB7CisJCQlpZiAobXNnW2ldLmFkZHIgPT0KKwkJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzKQorCQkJCXJlcS5jbWQgPSBXUklURV9NRU1PUlk7CisJCQllbHNlCisJCQkJcmVxLmNtZCA9IFdSSVRFX0kyQzsKKwkJCXJlcS5pMmNfYWRkciA9IG1zZ1tpXS5hZGRyOworCQkJcmVxLmFkZHIgPSBhZGRyOworCQkJcmVxLm1ib3ggPSBtYm94OworCQkJcmVxLmFkZHJfbGVuID0gYWRkcl9sZW47CisJCQlyZXEuZGF0YV9sZW4gPSBtc2dbaV0ubGVuLWFkZHJfbGVuOworCQkJcmVxLmRhdGEgPSAmbXNnW2ldLmJ1ZlthZGRyX2xlbl07CisJCQlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CisJCQlpICs9IDE7CisJCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwl9CisJcmV0ID0gaTsKKworZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBhZjkwMTVfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBhZjkwMTVfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyID0gYWY5MDE1X2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gYWY5MDE1X2kyY19mdW5jLAorfTsKKworc3RhdGljIGludCBhZjkwMTVfZG9fcmVnX2JpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUxNiBhZGRyLCB1OCBiaXQsIHU4IG9wKQoreworCWludCByZXQ7CisJdTggdmFsLCBtYXNrID0gMHgwMTsKKworCXJldCA9IGFmOTAxNV9yZWFkX3JlZyhkLCBhZGRyLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFzayA8PD0gYml0OworCWlmIChvcCkgeworCQkvKiBzZXQgYml0ICovCisJCXZhbCB8PSBtYXNrOworCX0gZWxzZSB7CisJCS8qIGNsZWFyIGJpdCAqLworCQltYXNrIF49IDB4ZmY7CisJCXZhbCAmPSBtYXNrOworCX0KKworCXJldHVybiBhZjkwMTVfd3JpdGVfcmVnKGQsIGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X3NldF9yZWdfYml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTE2IGFkZHIsIHU4IGJpdCkKK3sKKwlyZXR1cm4gYWY5MDE1X2RvX3JlZ19iaXQoZCwgYWRkciwgYml0LCAxKTsKK30KKworc3RhdGljIGludCBhZjkwMTVfY2xlYXJfcmVnX2JpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUxNiBhZGRyLCB1OCBiaXQpCit7CisJcmV0dXJuIGFmOTAxNV9kb19yZWdfYml0KGQsIGFkZHIsIGJpdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X2luaXRfZW5kcG9pbnQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCByZXQ7CisJdTE2IGZyYW1lX3NpemU7CisJdTggIHBhY2tldF9zaXplOworCWRlYl9pbmZvKCIlczogVVNCIHNwZWVkOiVkXG4iLCBfX2Z1bmNfXywgZC0+dWRldi0+c3BlZWQpOworCisjZGVmaW5lIFRTX1BBQ0tFVF9TSVpFICAgICAgICAgICAgMTg4CisKKyNkZWZpbmUgVFNfVVNCMjBfUEFDS0VUX0NPVU5UICAgICAzNDgKKyNkZWZpbmUgVFNfVVNCMjBfRlJBTUVfU0laRSAgICAgICAoVFNfUEFDS0VUX1NJWkUqVFNfVVNCMjBfUEFDS0VUX0NPVU5UKQorCisjZGVmaW5lIFRTX1VTQjExX1BBQ0tFVF9DT1VOVCAgICAgIDIxCisjZGVmaW5lIFRTX1VTQjExX0ZSQU1FX1NJWkUgICAgICAgKFRTX1BBQ0tFVF9TSVpFKlRTX1VTQjExX1BBQ0tFVF9DT1VOVCkKKworI2RlZmluZSBUU19VU0IyMF9NQVhfUEFDS0VUX1NJWkUgIDUxMgorI2RlZmluZSBUU19VU0IxMV9NQVhfUEFDS0VUX1NJWkUgICA2NAorCisJaWYgKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMKSB7CisJCWZyYW1lX3NpemUgPSBUU19VU0IxMV9GUkFNRV9TSVpFLzQ7CisJCXBhY2tldF9zaXplID0gVFNfVVNCMTFfTUFYX1BBQ0tFVF9TSVpFLzQ7CisJfSBlbHNlIHsKKwkJZnJhbWVfc2l6ZSA9IFRTX1VTQjIwX0ZSQU1FX1NJWkUvNDsKKwkJcGFja2V0X3NpemUgPSBUU19VU0IyMF9NQVhfUEFDS0VUX1NJWkUvNDsKKwl9CisKKwlyZXQgPSBhZjkwMTVfc2V0X3JlZ19iaXQoZCwgMHhkNTA3LCAyKTsgLyogYXNzZXJ0IEVQNCByZXNldCAqLworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gYWY5MDE1X3NldF9yZWdfYml0KGQsIDB4ZDUwYiwgMSk7IC8qIGFzc2VydCBFUDUgcmVzZXQgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxNV9jbGVhcl9yZWdfYml0KGQsIDB4ZGQxMSwgNSk7IC8qIGRpc2FibGUgRVA0ICovCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBhZjkwMTVfY2xlYXJfcmVnX2JpdChkLCAweGRkMTEsIDYpOyAvKiBkaXNhYmxlIEVQNSAqLworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gYWY5MDE1X3NldF9yZWdfYml0KGQsIDB4ZGQxMSwgNSk7IC8qIGVuYWJsZSBFUDQgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCWlmIChhZjkwMTVfY29uZmlnLmR1YWxfbW9kZSkgeworCQlyZXQgPSBhZjkwMTVfc2V0X3JlZ19iaXQoZCwgMHhkZDExLCA2KTsgLyogZW5hYmxlIEVQNSAqLworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisJcmV0ID0gYWY5MDE1X2NsZWFyX3JlZ19iaXQoZCwgMHhkZDEzLCA1KTsgLyogZGlzYWJsZSBFUDQgTkFLICovCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlpZiAoYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJcmV0ID0gYWY5MDE1X2NsZWFyX3JlZ19iaXQoZCwgMHhkZDEzLCA2KTsgLyogZGlzYWJsZSBFUDUgTkFLICovCisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwkvKiBFUDQgeGZlciBsZW5ndGggKi8KKwlyZXQgPSBhZjkwMTVfd3JpdGVfcmVnKGQsIDB4ZGQ4OCwgZnJhbWVfc2l6ZSAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gYWY5MDE1X3dyaXRlX3JlZyhkLCAweGRkODksIGZyYW1lX3NpemUgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwkvKiBFUDUgeGZlciBsZW5ndGggKi8KKwlyZXQgPSBhZjkwMTVfd3JpdGVfcmVnKGQsIDB4ZGQ4YSwgZnJhbWVfc2l6ZSAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gYWY5MDE1X3dyaXRlX3JlZyhkLCAweGRkOGIsIGZyYW1lX3NpemUgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBhZjkwMTVfd3JpdGVfcmVnKGQsIDB4ZGQwYywgcGFja2V0X3NpemUpOyAvKiBFUDQgcGFja2V0IHNpemUgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxNV93cml0ZV9yZWcoZCwgMHhkZDBkLCBwYWNrZXRfc2l6ZSk7IC8qIEVQNSBwYWNrZXQgc2l6ZSAqLworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gYWY5MDE1X2NsZWFyX3JlZ19iaXQoZCwgMHhkNTA3LCAyKTsgLyogbmVnYXRlIEVQNCByZXNldCAqLworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJaWYgKGFmOTAxNV9jb25maWcuZHVhbF9tb2RlKSB7CisJCXJldCA9IGFmOTAxNV9jbGVhcl9yZWdfYml0KGQsIDB4ZDUwYiwgMSk7IC8qIG5lZ2F0ZSBFUDUgcmVzZXQgKi8KKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLyogZW5hYmxlIC8gZGlzYWJsZSBtcDJpZjIgKi8KKwlpZiAoYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUpCisJCXJldCA9IGFmOTAxNV9zZXRfcmVnX2JpdChkLCAweGQ1MGIsIDApOworCWVsc2UKKwkJcmV0ID0gYWY5MDE1X2NsZWFyX3JlZ19iaXQoZCwgMHhkNTBiLCAwKTsKK2Vycm9yOgorCWlmIChyZXQpCisJCWVycigiZW5kcG9pbnQgaW5pdCBmYWlsZWQ6JWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X2NvcHlfZmlybXdhcmUoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCByZXQ7CisJdTggZndfcGFyYW1zWzRdOworCXU4IHZhbCwgaTsKKwlzdHJ1Y3QgcmVxX3QgcmVxID0ge0NPUFlfRklSTVdBUkUsIDAsIDB4NTEwMCwgMCwgMCwgc2l6ZW9mKGZ3X3BhcmFtcyksCisJCWZ3X3BhcmFtcyB9OworCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWZ3X3BhcmFtc1swXSA9IGFmOTAxNV9jb25maWcuZmlybXdhcmVfc2l6ZSA+PiA4OworCWZ3X3BhcmFtc1sxXSA9IGFmOTAxNV9jb25maWcuZmlybXdhcmVfc2l6ZSAmIDB4ZmY7CisJZndfcGFyYW1zWzJdID0gYWY5MDE1X2NvbmZpZy5maXJtd2FyZV9jaGVja3N1bSA+PiA4OworCWZ3X3BhcmFtc1szXSA9IGFmOTAxNV9jb25maWcuZmlybXdhcmVfY2hlY2tzdW0gJiAweGZmOworCisJLyogd2FpdCAybmQgZGVtb2R1bGF0b3IgcmVhZHkgKi8KKwltc2xlZXAoMTAwKTsKKworCXJldCA9IGFmOTAxNV9yZWFkX3JlZ19pMmMoZCwgMHgzYSwgMHg5OGJlLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCWVsc2UKKwkJZGViX2luZm8oIiVzOiBmaXJtd2FyZSBzdGF0dXM6JTAyeFxuIiwgX19mdW5jX18sIHZhbCk7CisKKwlpZiAodmFsID09IDB4MGMpIC8qIGZ3IGlzIHJ1bm5pbmcsIG5vIG5lZWQgZm9yIGRvd25sb2FkICovCisJCWdvdG8gZXhpdDsKKworCS8qIHNldCBJMkMgbWFzdGVyIGNsb2NrIHRvIGZhc3QgKHRvIHNwZWVkIHVwIGZpcm13YXJlIGNvcHkpICovCisJcmV0ID0gYWY5MDE1X3dyaXRlX3JlZyhkLCAweGQ0MTYsIDB4MDQpOyAvKiAweDA0ICogNDAwbnMgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJbXNsZWVwKDUwKTsKKworCS8qIGNvcHkgZmlybXdhcmUgKi8KKwlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CisJaWYgKHJldCkKKwkJZXJyKCJmaXJtd2FyZSBjb3B5IGNtZCBmYWlsZWQ6JWQiLCByZXQpOworCWRlYl9pbmZvKCIlczogZmlybXdhcmUgY29weSBkb25lXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBzZXQgSTJDIG1hc3RlciBjbG9jayBiYWNrIHRvIG5vcm1hbCAqLworCXJldCA9IGFmOTAxNV93cml0ZV9yZWcoZCwgMHhkNDE2LCAweDE0KTsgLyogMHgxNCAqIDQwMG5zICovCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHJlcXVlc3QgYm9vdCBmaXJtd2FyZSAqLworCXJldCA9IGFmOTAxNV93cml0ZV9yZWdfaTJjKGQsIGFmOTAxNV9hZjkwMTNfY29uZmlnWzFdLmRlbW9kX2FkZHJlc3MsCisJCTB4ZTIwNSwgMSk7CisJZGViX2luZm8oIiVzOiBmaXJtd2FyZSBib290IGNtZCBzdGF0dXM6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQltc2xlZXAoMTAwKTsKKworCQkvKiBjaGVjayBmaXJtd2FyZSBzdGF0dXMgKi8KKwkJcmV0ID0gYWY5MDE1X3JlYWRfcmVnX2kyYyhkLAorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbMV0uZGVtb2RfYWRkcmVzcywgMHg5OGJlLCAmdmFsKTsKKwkJZGViX2luZm8oIiVzOiBmaXJtd2FyZSBzdGF0dXMgY21kIHN0YXR1czolZCBmdyBzdGF0dXM6JTAyeFxuIiwKKwkJCV9fZnVuY19fLCByZXQsIHZhbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWlmICh2YWwgPT0gMHgwYyB8fCB2YWwgPT0gMHgwNCkgLyogc3VjY2VzcyBvciBmYWlsICovCisJCQlicmVhazsKKwl9CisKKwlpZiAodmFsID09IDB4MDQpIHsKKwkJZXJyKCJmaXJtd2FyZSBkaWQgbm90IHJ1biIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgaWYgKHZhbCAhPSAweDBjKSB7CisJCWVycigiZmlybXdhcmUgYm9vdCB0aW1lb3V0Iik7CisJCXJldCA9IC0xOworCX0KKworZXJyb3I6CitleGl0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGR1bXAgZWVwcm9tICovCitzdGF0aWMgaW50IGFmOTAxNV9lZXByb21fZHVtcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJY2hhciBidWZbNTJdLCBidWYyWzRdOworCXU4IHJlZywgdmFsOworCisJZm9yIChyZWcgPSAwOyA7IHJlZysrKSB7CisJCWlmIChyZWcgJSAxNiA9PSAwKSB7CisJCQlpZiAocmVnKQorCQkJCWRlYl9pbmZvKCIlc1xuIiwgYnVmKTsKKwkJCXNwcmludGYoYnVmLCAiJTAyeDogIiwgcmVnKTsKKwkJfQorCQlpZiAoYWY5MDE1X3JlYWRfcmVnX2kyYyhkLCBBRjkwMTVfSTJDX0VFUFJPTSwgcmVnLCAmdmFsKSA9PSAwKQorCQkJc3ByaW50ZihidWYyLCAiJTAyeCAiLCB2YWwpOworCQllbHNlCisJCQlzdHJjcHkoYnVmMiwgIi0tICIpOworCQlzdHJjYXQoYnVmLCBidWYyKTsKKwkJaWYgKHJlZyA9PSAweGZmKQorCQkJYnJlYWs7CisJfQorCWRlYl9pbmZvKCIlc1xuIiwgYnVmKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFmOTAxNV9kb3dubG9hZF9pcl90YWJsZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IGksIHBhY2tldHMgPSAwLCByZXQ7CisJdTE2IGFkZHIgPSAweDlhNTY7IC8qIGlyLXRhYmxlIHN0YXJ0IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcmVxX3QgcmVxID0ge1dSSVRFX01FTU9SWSwgMCwgMCwgMCwgMCwgMSwgTlVMTH07CisJdTggKmRhdGEgPSBOVUxMOworCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWRhdGEgPSBhZjkwMTVfY29uZmlnLmlyX3RhYmxlOworCXBhY2tldHMgPSBhZjkwMTVfY29uZmlnLmlyX3RhYmxlX3NpemU7CisKKwkvKiBubyByZW1vdGUgKi8KKwlpZiAoIXBhY2tldHMpCisJCWdvdG8gZXhpdDsKKworCS8qIGxvYWQgcmVtb3RlIGlyLXRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IHBhY2tldHM7IGkrKykgeworCQlyZXEuYWRkciA9IGFkZHIgKyBpOworCQlyZXEuZGF0YSA9ICZkYXRhW2ldOworCQlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CisJCWlmIChyZXQpIHsKKwkJCWVycigiaXItdGFibGUgZG93bmxvYWQgZmFpbGVkIGF0IHBhY2tldCAlZCB3aXRoICIgXAorCQkJCSJjb2RlICVkIiwgaSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKK2V4aXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCByZXQ7CisJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOworCisJcmV0ID0gYWY5MDE1X2luaXRfZW5kcG9pbnQoZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGFmOTAxNV9kb3dubG9hZF9pcl90YWJsZShkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxNV9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IG9ub2ZmKQoreworCWludCByZXQ7CisJZGViX2luZm8oIiVzOiBvbm9mZjolZFxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCWlmIChvbm9mZikKKwkJcmV0ID0gYWY5MDE1X3NldF9yZWdfYml0KGFkYXAtPmRldiwgMHhkNTAzLCAwKTsKKwllbHNlCisJCXJldCA9IGFmOTAxNV9jbGVhcl9yZWdfYml0KGFkYXAtPmRldiwgMHhkNTAzLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IGluZGV4LCB1MTYgcGlkLAorCWludCBvbm9mZikKK3sKKwlpbnQgcmV0OworCXU4IGlkeDsKKworCWRlYl9pbmZvKCIlczogc2V0IHBpZCBmaWx0ZXIsIGluZGV4ICVkLCBwaWQgJXgsIG9ub2ZmICVkXG4iLAorCQlfX2Z1bmNfXywgaW5kZXgsIHBpZCwgb25vZmYpOworCisJcmV0ID0gYWY5MDE1X3dyaXRlX3JlZyhhZGFwLT5kZXYsIDB4ZDUwNSwgKHBpZCAmIDB4ZmYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gYWY5MDE1X3dyaXRlX3JlZyhhZGFwLT5kZXYsIDB4ZDUwNiwgKHBpZCA+PiA4KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlkeCA9ICgoaW5kZXggJiAweDFmKSB8ICgxIDw8IDUpKTsKKwlyZXQgPSBhZjkwMTVfd3JpdGVfcmVnKGFkYXAtPmRldiwgMHhkNTA0LCBpZHgpOworCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxNV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCWludCBpLCBsZW4sIHBhY2tldHMsIHJlbWFpbmRlciwgcmV0OworCXN0cnVjdCByZXFfdCByZXEgPSB7RE9XTkxPQURfRklSTVdBUkUsIDAsIDAsIDAsIDAsIDAsIE5VTEx9OworCXUxNiBhZGRyID0gMHg1MTAwOyAvKiBmaXJtd2FyZSBzdGFydCBhZGRyZXNzICovCisJdTE2IGNoZWNrc3VtID0gMDsKKworCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKKworCS8qIGNhbGMgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemU7IGkrKykKKwkJY2hlY2tzdW0gKz0gZnctPmRhdGFbaV07CisKKwlhZjkwMTVfY29uZmlnLmZpcm13YXJlX3NpemUgPSBmdy0+c2l6ZTsKKwlhZjkwMTVfY29uZmlnLmZpcm13YXJlX2NoZWNrc3VtID0gY2hlY2tzdW07CisKKwkjZGVmaW5lIEZXX1BBQ0tFVF9NQVhfREFUQSAgNTUKKworCXBhY2tldHMgPSBmdy0+c2l6ZSAvIEZXX1BBQ0tFVF9NQVhfREFUQTsKKwlyZW1haW5kZXIgPSBmdy0+c2l6ZSAlIEZXX1BBQ0tFVF9NQVhfREFUQTsKKwlsZW4gPSBGV19QQUNLRVRfTUFYX0RBVEE7CisJZm9yIChpID0gMDsgaSA8PSBwYWNrZXRzOyBpKyspIHsKKwkJaWYgKGkgPT0gcGFja2V0cykgIC8qIHNldCBzaXplIG9mIHRoZSBsYXN0IHBhY2tldCAqLworCQkJbGVuID0gcmVtYWluZGVyOworCisJCXJlcS5kYXRhX2xlbiA9IGxlbjsKKwkJcmVxLmRhdGEgPSAodTggKikoZnctPmRhdGEgKyBpICogRldfUEFDS0VUX01BWF9EQVRBKTsKKwkJcmVxLmFkZHIgPSBhZGRyOworCQlhZGRyICs9IEZXX1BBQ0tFVF9NQVhfREFUQTsKKworCQlyZXQgPSBhZjkwMTVfcndfdWRldih1ZGV2LCAmcmVxKTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWQgYXQgcGFja2V0ICVkIHdpdGggIiBcCisJCQkJImNvZGUgJWQiLCBpLCByZXQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIGZpcm13YXJlIGxvYWRlZCwgcmVxdWVzdCBib290ICovCisJcmVxLmNtZCA9IEJPT1Q7CisJcmV0ID0gYWY5MDE1X3J3X3VkZXYodWRldiwgJnJlcSk7CisJaWYgKHJldCkgeworCQllcnIoImZpcm13YXJlIGJvb3QgZmFpbGVkOiVkIiwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBmaXJtd2FyZSBpcyBydW5uaW5nLCByZWNvbm5lY3QgZGV2aWNlIGluIHRoZSB1c2IgYnVzICovCisJcmVxLmNtZCA9IFJFQ09OTkVDVF9VU0I7CisJcmV0ID0gYWY5MDE1X3J3X3VkZXYodWRldiwgJnJlcSk7CisJaWYgKHJldCkKKwkJZXJyKCJyZWNvbm5lY3QgZmFpbGVkOiAlZCIsIHJldCk7CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDE1X3JlYWRfY29uZmlnKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCWludCByZXQ7CisJdTggdmFsLCBpLCBvZmZzZXQgPSAwOworCXN0cnVjdCByZXFfdCByZXEgPSB7UkVBRF9JMkMsIEFGOTAxNV9JMkNfRUVQUk9NLCAwLCAwLCAxLCAxLCAmdmFsfTsKKwljaGFyIG1hbnVmYWN0dXJlclsxMF07CisKKwkvKiBJUiByZW1vdGUgY29udHJvbGxlciAqLworCXJlcS5hZGRyID0gQUY5MDE1X0VFUFJPTV9JUl9NT0RFOworCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJZGViX2luZm8oIiVzOiBJUiBtb2RlOiVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWY5MDE1X3Byb3BlcnRpZXNfY291bnQ7IGkrKykgeworCQlpZiAodmFsID09IEFGOTAxNV9JUl9NT0RFX0RJU0FCTEVEIHx8IHZhbCA9PSAweDA0KSB7CisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0gTlVMTDsKKwkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSAgPSAwOworCQl9IGVsc2UgaWYgKGR2Yl91c2JfYWY5MDE1X3JlbW90ZSkgeworCQkJLyogbG9hZCByZW1vdGUgZGVmaW5lZCBhcyBtb2R1bGUgcGFyYW0gKi8KKwkJCXN3aXRjaCAoZHZiX3VzYl9hZjkwMTVfcmVtb3RlKSB7CisJCQljYXNlIEFGOTAxNV9SRU1PVEVfQV9MSU5LX0RUVV9NOgorCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQorCQkJCSAgYWY5MDE1X3JjX2tleXNfYV9saW5rOworCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9yY19rZXlzX2FfbGluayk7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9IGFmOTAxNV9pcl90YWJsZV9hX2xpbms7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZV9zaXplID0KKwkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X2lyX3RhYmxlX2FfbGluayk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFGOTAxNV9SRU1PVEVfTVNJX0RJR0lWT1hfTUlOSV9JSV9WMzoKKwkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0KKwkJCQkgIGFmOTAxNV9yY19rZXlzX21zaTsKKwkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwX3NpemUgPQorCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfcmNfa2V5c19tc2kpOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGUgPSBhZjkwMTVfaXJfdGFibGVfbXNpOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9tc2kpOworCQkJCWJyZWFrOworCQkJY2FzZSBBRjkwMTVfUkVNT1RFX01ZR0lDVFZfVTcxODoKKwkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0KKwkJCQkgIGFmOTAxNV9yY19rZXlzX215Z2ljdHY7CisJCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0ucmNfa2V5X21hcF9zaXplID0KKwkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X3JjX2tleXNfbXlnaWN0dik7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9CisJCQkJICBhZjkwMTVfaXJfdGFibGVfbXlnaWN0djsKKwkJCQlhZjkwMTVfY29uZmlnLmlyX3RhYmxlX3NpemUgPQorCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfaXJfdGFibGVfbXlnaWN0dik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpIHsKKwkJCWNhc2UgVVNCX1ZJRF9MRUFEVEVLOgorCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQorCQkJCSAgYWY5MDE1X3JjX2tleXNfbGVhZHRlazsKKwkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwX3NpemUgPQorCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfcmNfa2V5c19sZWFkdGVrKTsKKwkJCQlhZjkwMTVfY29uZmlnLmlyX3RhYmxlID0KKwkJCQkgIGFmOTAxNV9pcl90YWJsZV9sZWFkdGVrOworCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CisJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9sZWFkdGVrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX1ZJRF9WSVNJT05QTFVTOgorCQkJCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PQorCQkJCVVTQl9QSURfQVpVUkVXQVZFX0FEX1RVNzAwKSB7CisJCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXAgPQorCQkJCQkgIGFmOTAxNV9yY19rZXlzX3R3aW5oYW47CisJCQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLnJjX2tleV9tYXBfc2l6ZSA9CisJCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfcmNfa2V5c190d2luaGFuKTsKKwkJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9CisJCQkJCSAgYWY5MDE1X2lyX3RhYmxlX3R3aW5oYW47CisJCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGVfc2l6ZSA9CisJCQkJCSAgQVJSQVlfU0laRShhZjkwMTVfaXJfdGFibGVfdHdpbmhhbik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfVklEX0tXT1JMRF8yOgorCQkJCS8qIFRPRE86IHVzZSBjb3JyZWN0IHJjIGtleXMgKi8KKwkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0KKwkJCQkgIGFmOTAxNV9yY19rZXlzX3R3aW5oYW47CisJCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0ucmNfa2V5X21hcF9zaXplID0KKwkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X3JjX2tleXNfdHdpbmhhbik7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9IGFmOTAxNV9pcl90YWJsZV9rd29ybGQ7CisJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZV9zaXplID0KKwkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X2lyX3RhYmxlX2t3b3JsZCk7CisJCQkJYnJlYWs7CisJCQkvKiBDaGVjayBVU0IgbWFudWZhY3R1cmVyIGFuZCBwcm9kdWN0IHN0cmluZ3MgYW5kIHRyeQorCQkJICAgdG8gZGV0ZXJtaW5lIGNvcnJlY3QgcmVtb3RlIGluIGNhc2Ugb2YgY2hpcCB2ZW5kb3IKKwkJCSAgIHJlZmVyZW5jZSBJRHMgYXJlIHVzZWQuICovCisJCQljYXNlIFVTQl9WSURfQUZBVEVDSDoKKwkJCQltZW1zZXQobWFudWZhY3R1cmVyLCAwLCBzaXplb2YobWFudWZhY3R1cmVyKSk7CisJCQkJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIsCisJCQkJCW1hbnVmYWN0dXJlciwgc2l6ZW9mKG1hbnVmYWN0dXJlcikpOworCQkJCWlmICghc3RyY21wKCJHZW5pYXRlY2giLCBtYW51ZmFjdHVyZXIpKSB7CisJCQkJCS8qIGlNYW51ZmFjdHVyZXIgMSBHZW5pYXRlY2gKKwkJCQkJICAgaVByb2R1Y3QgICAgICAyIEFGOTAxNSAqLworCQkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwID0KKwkJCQkJICBhZjkwMTVfcmNfa2V5c19teWdpY3R2OworCQkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwX3NpemUgPQorCQkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X3JjX2tleXNfbXlnaWN0dik7CisJCQkJCWFmOTAxNV9jb25maWcuaXJfdGFibGUgPQorCQkJCQkgIGFmOTAxNV9pcl90YWJsZV9teWdpY3R2OworCQkJCQlhZjkwMTVfY29uZmlnLmlyX3RhYmxlX3NpemUgPQorCQkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X2lyX3RhYmxlX215Z2ljdHYpOworCQkJCX0gZWxzZSBpZiAoIXN0cmNtcCgiTVNJIiwgbWFudWZhY3R1cmVyKSkgeworCQkJCQkvKiBpTWFudWZhY3R1cmVyIDEgTVNJCisJCQkJCSAgIGlQcm9kdWN0ICAgICAgMiBNU0kgSy1WT1ggKi8KKwkJCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0ucmNfa2V5X21hcCA9CisJCQkJCSAgYWY5MDE1X3JjX2tleXNfbXNpOworCQkJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5yY19rZXlfbWFwX3NpemUgPQorCQkJCQkgIEFSUkFZX1NJWkUoYWY5MDE1X3JjX2tleXNfbXNpKTsKKwkJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZSA9CisJCQkJCSAgYWY5MDE1X2lyX3RhYmxlX21zaTsKKwkJCQkJYWY5MDE1X2NvbmZpZy5pcl90YWJsZV9zaXplID0KKwkJCQkJICBBUlJBWV9TSVpFKGFmOTAxNV9pcl90YWJsZV9tc2kpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRTIG1vZGUgLSBvbmUgb3IgdHdvIHJlY2VpdmVycyAqLworCXJlcS5hZGRyID0gQUY5MDE1X0VFUFJPTV9UU19NT0RFOworCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUgPSB2YWw7CisJZGViX2luZm8oIiVzOiBUUyBtb2RlOiVkXG4iLCBfX2Z1bmNfXywgYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUpOworCS8qIGRpc2FibGUgZHVhbCBtb2RlIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBpcyBidWdneSAqLworCWlmICghZHZiX3VzYl9hZjkwMTVfZHVhbF9tb2RlKQorCQlhZjkwMTVfY29uZmlnLmR1YWxfbW9kZSA9IDA7CisKKwkvKiBzZXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIFVTQiBwb3J0IHNwZWVkICovCisJZm9yIChpID0gMDsgaSA8IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50OyBpKyspIHsKKwkJLyogVVNCMS4xIHNldCBzbWFsbGVyIGJ1ZmZlcnNpemUgYW5kIGRpc2FibGUgMm5kIGFkYXB0ZXIgKi8KKwkJaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMKSB7CisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5hZGFwdGVyLT5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUgPQorCQkJCVRTX1VTQjExX01BWF9QQUNLRVRfU0laRTsKKwkJCS8qIGRpc2FibGUgMm5kIGFkYXB0ZXIgYmVjYXVzZSB3ZSBkb24ndCBoYXZlCisJCQkgICBQSUQtZmlsdGVycyAqLworCQkJYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUgPSAwOworCQl9IGVsc2UgeworCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0uYWRhcHRlci0+c3RyZWFtLnUuYnVsay5idWZmZXJzaXplID0KKwkJCQlUU19VU0IyMF9NQVhfUEFDS0VUX1NJWkU7CisJCX0KKwl9CisKKwlpZiAoYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJLyogcmVhZCAybmQgZGVtb2R1bGF0b3IgSTJDIGFkZHJlc3MgKi8KKwkJcmVxLmFkZHIgPSBBRjkwMTVfRUVQUk9NX0RFTU9EMl9JMkM7CisJCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJYWY5MDE1X2FmOTAxM19jb25maWdbMV0uZGVtb2RfYWRkcmVzcyA9IHZhbDsKKworCQkvKiBlbmFibGUgMm5kIGFkYXB0ZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50OyBpKyspCisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5udW1fYWRhcHRlcnMgPSAyOworCisJfSBlbHNlIHsKKwkJIC8qIGRpc2FibGUgMm5kIGFkYXB0ZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IGFmOTAxNV9wcm9wZXJ0aWVzX2NvdW50OyBpKyspCisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5udW1fYWRhcHRlcnMgPSAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhZjkwMTVfcHJvcGVydGllc1swXS5udW1fYWRhcHRlcnM7IGkrKykgeworCQlpZiAoaSA9PSAxKQorCQkJb2Zmc2V0ID0gQUY5MDE1X0VFUFJPTV9PRkZTRVQ7CisJCS8qIHh0YWwgKi8KKwkJcmVxLmFkZHIgPSBBRjkwMTVfRUVQUk9NX1hUQUxfVFlQRTEgKyBvZmZzZXQ7CisJCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAwOgorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0uYWRjX2Nsb2NrID0gMjg4MDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0uYWRjX2Nsb2NrID0gMjA0ODA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0uYWRjX2Nsb2NrID0gMjgwMDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0uYWRjX2Nsb2NrID0gMjUwMDA7CisJCQlicmVhazsKKwkJfTsKKwkJZGViX2luZm8oIiVzOiBbJWRdIHh0YWw6JWQgc2V0IGFkY19jbG9jazolZFxuIiwgX19mdW5jX18sIGksCisJCQl2YWwsIGFmOTAxNV9hZjkwMTNfY29uZmlnW2ldLmFkY19jbG9jayk7CisKKwkJLyogdHVuZXIgSUYgKi8KKwkJcmVxLmFkZHIgPSBBRjkwMTVfRUVQUk9NX0lGMUggKyBvZmZzZXQ7CisJCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0udHVuZXJfaWYgPSB2YWwgPDwgODsKKwkJcmVxLmFkZHIgPSBBRjkwMTVfRUVQUk9NX0lGMUwgKyBvZmZzZXQ7CisJCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0udHVuZXJfaWYgKz0gdmFsOworCQlkZWJfaW5mbygiJXM6IFslZF0gSUYxOiVkXG4iLCBfX2Z1bmNfXywgaSwKKwkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLnR1bmVyX2lmKTsKKworCQkvKiBNVDIwNjAgSUYxICovCisJCXJlcS5hZGRyID0gQUY5MDE1X0VFUFJPTV9NVDIwNjBfSUYxSCAgKyBvZmZzZXQ7CisJCXJldCA9IGFmOTAxNV9yd191ZGV2KHVkZXYsICZyZXEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJYWY5MDE1X2NvbmZpZy5tdDIwNjBfaWYxW2ldID0gdmFsIDw8IDg7CisJCXJlcS5hZGRyID0gQUY5MDE1X0VFUFJPTV9NVDIwNjBfSUYxTCArIG9mZnNldDsKKwkJcmV0ID0gYWY5MDE1X3J3X3VkZXYodWRldiwgJnJlcSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlhZjkwMTVfY29uZmlnLm10MjA2MF9pZjFbaV0gKz0gdmFsOworCQlkZWJfaW5mbygiJXM6IFslZF0gTVQyMDYwIElGMTolZFxuIiwgX19mdW5jX18sIGksCisJCQlhZjkwMTVfY29uZmlnLm10MjA2MF9pZjFbaV0pOworCisJCS8qIHR1bmVyICovCisJCXJlcS5hZGRyID0gIEFGOTAxNV9FRVBST01fVFVORVJfSUQxICsgb2Zmc2V0OworCQlyZXQgPSBhZjkwMTVfcndfdWRldih1ZGV2LCAmcmVxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgQUY5MDEzX1RVTkVSX0VOVjc3SDExRDU6CisJCWNhc2UgQUY5MDEzX1RVTkVSX01UMjA2MDoKKwkJY2FzZSBBRjkwMTNfVFVORVJfTUM0NFM4MDM6CisJCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMDoKKwkJY2FzZSBBRjkwMTNfVFVORVJfVU5LTk9XTjoKKwkJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwXzI6CisJCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjcxOgorCQljYXNlIEFGOTAxM19UVU5FUl9RVDEwMTBBOgorCQkJYWY5MDE1X2FmOTAxM19jb25maWdbaV0ucmZfc3BlY19pbnYgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDNEOgorCQljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDA1RDoKKwkJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNVI6CisJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1tpXS5yZl9zcGVjX2ludiA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXdhcm4oInR1bmVyIGlkOiVkIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSByZXBvcnQhIiwgdmFsKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9OworCisJCWFmOTAxNV9hZjkwMTNfY29uZmlnW2ldLnR1bmVyID0gdmFsOworCQlkZWJfaW5mbygiJXM6IFslZF0gdHVuZXIgaWQ6JWRcbiIsIF9fZnVuY19fLCBpLCB2YWwpOworCX0KKworZXJyb3I6CisJaWYgKHJldCkKKwkJZXJyKCJlZXByb20gcmVhZCBmYWlsZWQ6JWQiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTVfaWRlbnRpZnlfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCQkJIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzICpwcm9wcywKKwkJCQkgc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uICoqZGVzYywKKwkJCQkgaW50ICpjb2xkKQoreworCWludCByZXQ7CisJdTggcmVwbHk7CisJc3RydWN0IHJlcV90IHJlcSA9IHtHRVRfQ09ORklHLCAwLCAwLCAwLCAwLCAxLCAmcmVwbHl9OworCisJcmV0ID0gYWY5MDE1X3J3X3VkZXYodWRldiwgJnJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRlYl9pbmZvKCIlczogcmVwbHk6JTAyeFxuIiwgX19mdW5jX18sIHJlcGx5KTsKKwlpZiAocmVwbHkgPT0gMHgwMikKKwkJKmNvbGQgPSAwOworCWVsc2UKKwkJKmNvbGQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXU4IGJ1Zls4XTsKKwlzdHJ1Y3QgcmVxX3QgcmVxID0ge0dFVF9JUl9DT0RFLCAwLCAwLCAwLCAwLCBzaXplb2YoYnVmKSwgYnVmfTsKKwlzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgKmtleW1hcCA9IGQtPnByb3BzLnJjX2tleV9tYXA7CisJaW50IGksIHJldDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCXJldCA9IGFmOTAxNV9jdHJsX21zZyhkLCAmcmVxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJKmV2ZW50ID0gMDsKKwkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspIHsKKwkJaWYgKCFidWZbMV0gJiYga2V5bWFwW2ldLmN1c3RvbSA9PSBidWZbMF0gJiYKKwkJICAgIGtleW1hcFtpXS5kYXRhID09IGJ1ZlsyXSkgeworCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OworCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFidWZbMV0pCisJCWRlYl9yYygiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCV9fZnVuY19fLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwKKwkJCWJ1Zls1XSwgYnVmWzZdLCBidWZbN10pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGluaXQgMm5kIEkyQyBhZGFwdGVyICovCitpbnQgYWY5MDE1X2kyY19pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gZC0+cHJpdjsKKwlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlzdHJuY3B5KHN0YXRlLT5pMmNfYWRhcC5uYW1lLCBkLT5kZXNjLT5uYW1lLAorCQlzaXplb2Yoc3RhdGUtPmkyY19hZGFwLm5hbWUpKTsKKyNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMCisJc3RhdGUtPmkyY19hZGFwLmNsYXNzID0gSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTCwKKyNlbHNlCisJc3RhdGUtPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUwsCisjZW5kaWYKKwlzdGF0ZS0+aTJjX2FkYXAuYWxnbyAgICAgID0gZC0+cHJvcHMuaTJjX2FsZ287CisJc3RhdGUtPmkyY19hZGFwLmFsZ29fZGF0YSA9IE5VTEw7CisJc3RhdGUtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmZC0+dWRldi0+ZGV2OworCisJaTJjX3NldF9hZGFwZGF0YSgmc3RhdGUtPmkyY19hZGFwLCBkKTsKKworCXJldCA9IGkyY19hZGRfYWRhcHRlcigmc3RhdGUtPmkyY19hZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyKCJjb3VsZCBub3QgYWRkIGkyYyBhZGFwdGVyIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWY5MDE1X3N0YXRlICpzdGF0ZSA9IGFkYXAtPmRldi0+cHJpdjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOworCisJaWYgKGFkYXAtPmlkID09IDApIHsKKwkJLyogc2VsZWN0IEkyQyBhZGFwdGVyICovCisJCWkyY19hZGFwID0gJmFkYXAtPmRldi0+aTJjX2FkYXA7CisKKwkJZGViX2luZm8oIiVzOiBpbml0IEkyQ1xuIiwgX19mdW5jX18pOworCQlyZXQgPSBhZjkwMTVfaTJjX2luaXQoYWRhcC0+ZGV2KTsKKworCQkvKiBkdW1wIGVlcHJvbSAoZGVidWcpICovCisJCXJldCA9IGFmOTAxNV9lZXByb21fZHVtcChhZGFwLT5kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKiBzZWxlY3QgSTJDIGFkYXB0ZXIgKi8KKwkJaTJjX2FkYXAgPSAmc3RhdGUtPmkyY19hZGFwOworCisJCS8qIGNvcHkgZmlybXdhcmUgdG8gMm5kIGRlbW9kdWxhdG9yICovCisJCWlmIChhZjkwMTVfY29uZmlnLmR1YWxfbW9kZSkgeworCQkJcmV0ID0gYWY5MDE1X2NvcHlfZmlybXdhcmUoYWRhcC0+ZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQllcnIoImZpcm13YXJlIGNvcHkgdG8gMm5kIGZyb250ZW5kICIgXAorCQkJCQkiZmFpbGVkLCB3aWxsIGRpc2FibGUgaXQiKTsKKwkJCQlhZjkwMTVfY29uZmlnLmR1YWxfbW9kZSA9IDA7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qIGF0dGFjaCBkZW1vZHVsYXRvciAqLworCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhZjkwMTNfYXR0YWNoLCAmYWY5MDE1X2FmOTAxM19jb25maWdbYWRhcC0+aWRdLAorCQlpMmNfYWRhcCk7CisKKwlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgc3RydWN0IG10MjA2MF9jb25maWcgYWY5MDE1X210MjA2MF9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHhjMCwKKwkuY2xvY2tfb3V0ID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXQxMDEwX2NvbmZpZyBhZjkwMTVfcXQxMDEwX2NvbmZpZyA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweGM0LAorfTsKKworc3RhdGljIHN0cnVjdCB0ZGExODI3MV9jb25maWcgYWY5MDE1X3RkYTE4MjcxX2NvbmZpZyA9IHsKKwkuZ2F0ZSA9IFREQTE4MjcxX0dBVEVfRElHSVRBTCwKKwkuc21hbGxfaTJjID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXhsNTAwNXNfY29uZmlnIGFmOTAxNV9teGw1MDAzX2NvbmZpZyA9IHsKKwkuaTJjX2FkZHJlc3MgICAgID0gMHhjNiwKKwkuaWZfZnJlcSAgICAgICAgID0gSUZfRlJFUV80NTcwMDAwSFosCisJLnh0YWxfZnJlcSAgICAgICA9IENSWVNUQUxfRlJFUV8xNjAwMDAwMEhaLAorCS5hZ2NfbW9kZSAgICAgICAgPSBNWExfU0lOR0xFX0FHQywKKwkudHJhY2tpbmdfZmlsdGVyID0gTVhMX1RGX0RFRkFVTFQsCisJLnJzc2lfZW5hYmxlICAgICA9IE1YTF9SU1NJX0VOQUJMRSwKKwkuY2FwX3NlbGVjdCAgICAgID0gTVhMX0NBUF9TRUxfRU5BQkxFLAorCS5kaXZfb3V0ICAgICAgICAgPSBNWExfRElWX09VVF80LAorCS5jbG9ja19vdXQgICAgICAgPSBNWExfQ0xPQ0tfT1VUX0RJU0FCTEUsCisJLm91dHB1dF9sb2FkICAgICA9IE1YTDUwMDVTX0lGX09VVFBVVF9MT0FEXzIwMF9PSE0sCisJLnRvcAkJID0gTVhMNTAwNVNfVE9QXzI1UDIsCisJLm1vZF9tb2RlICAgICAgICA9IE1YTF9ESUdJVEFMX01PREUsCisJLmlmX21vZGUgICAgICAgICA9IE1YTF9aRVJPX0lGLAorCS5BZ2NNYXN0ZXJCeXRlICAgPSAweDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBteGw1MDA1c19jb25maWcgYWY5MDE1X214bDUwMDVfY29uZmlnID0geworCS5pMmNfYWRkcmVzcyAgICAgPSAweGM2LAorCS5pZl9mcmVxICAgICAgICAgPSBJRl9GUkVRXzQ1NzAwMDBIWiwKKwkueHRhbF9mcmVxICAgICAgID0gQ1JZU1RBTF9GUkVRXzE2MDAwMDAwSFosCisJLmFnY19tb2RlICAgICAgICA9IE1YTF9TSU5HTEVfQUdDLAorCS50cmFja2luZ19maWx0ZXIgPSBNWExfVEZfT0ZGLAorCS5yc3NpX2VuYWJsZSAgICAgPSBNWExfUlNTSV9FTkFCTEUsCisJLmNhcF9zZWxlY3QgICAgICA9IE1YTF9DQVBfU0VMX0VOQUJMRSwKKwkuZGl2X291dCAgICAgICAgID0gTVhMX0RJVl9PVVRfNCwKKwkuY2xvY2tfb3V0ICAgICAgID0gTVhMX0NMT0NLX09VVF9ESVNBQkxFLAorCS5vdXRwdXRfbG9hZCAgICAgPSBNWEw1MDA1U19JRl9PVVRQVVRfTE9BRF8yMDBfT0hNLAorCS50b3AJCSA9IE1YTDUwMDVTX1RPUF8yNVAyLAorCS5tb2RfbW9kZSAgICAgICAgPSBNWExfRElHSVRBTF9NT0RFLAorCS5pZl9tb2RlICAgICAgICAgPSBNWExfWkVST19JRiwKKwkuQWdjTWFzdGVyQnl0ZSAgID0gMHgwMCwKK307CisKK3N0YXRpYyBpbnQgYWY5MDE1X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gYWRhcC0+ZGV2LT5wcml2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CisJaW50IHJldDsKKwlkZWJfaW5mbygiJXM6IFxuIiwgX19mdW5jX18pOworCisJLyogc2VsZWN0IEkyQyBhZGFwdGVyICovCisJaWYgKGFkYXAtPmlkID09IDApCisJCWkyY19hZGFwID0gJmFkYXAtPmRldi0+aTJjX2FkYXA7CisJZWxzZQorCQlpMmNfYWRhcCA9ICZzdGF0ZS0+aTJjX2FkYXA7CisKKwlzd2l0Y2ggKGFmOTAxNV9hZjkwMTNfY29uZmlnW2FkYXAtPmlkXS50dW5lcikgeworCWNhc2UgQUY5MDEzX1RVTkVSX01UMjA2MDoKKwljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjBfMjoKKwkJcmV0ID0gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCQkmYWY5MDE1X210MjA2MF9jb25maWcsCisJCQlhZjkwMTVfY29uZmlnLm10MjA2MF9pZjFbYWRhcC0+aWRdKQorCQkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCQlicmVhazsKKwljYXNlIEFGOTAxM19UVU5FUl9RVDEwMTA6CisJY2FzZSBBRjkwMTNfVFVORVJfUVQxMDEwQToKKwkJcmV0ID0gZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCQkmYWY5MDE1X3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwkJYnJlYWs7CisJY2FzZSBBRjkwMTNfVFVORVJfVERBMTgyNzE6CisJCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMCwgaTJjX2FkYXAsCisJCQkmYWY5MDE1X3RkYTE4MjcxX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCQlicmVhazsKKwljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDAzRDoKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJCSZhZjkwMTVfbXhsNTAwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwkJYnJlYWs7CisJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNUQ6CisJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNVI6CisJCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCQkmYWY5MDE1X214bDUwMDVfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX0VOVjc3SDExRDU6CisJCXJldCA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweGMwLCBpMmNfYWRhcCwKKwkJCURWQl9QTExfVERBNjY1WCkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCQlicmVhazsKKwljYXNlIEFGOTAxM19UVU5FUl9NQzQ0UzgwMzoKKyNpZiAwCisJCXJldCA9IGR2Yl9hdHRhY2gobWM0NHM4MHhfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXApCisJCQk9PSBOVUxMID8gLUVOT0RFViA6IDA7CisjZWxzZQorCQlyZXQgPSAtRU5PREVWOworCQlpbmZvKCJGcmVlc2NhbGUgTUM0NFM4MDMgdHVuZXIgZm91bmQgYnV0IG5vIGRyaXZlciBmb3IgdGhhdCIgXAorCQkJInR1bmVyLiBMb29rIGF0IHRoZSBMaW51eHR2Lm9yZyBmb3IgdHVuZXIgZHJpdmVyIiBcCisJCQkic3RhdHVzLiIpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX1VOS05PV046CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZXJyKCJVbmtub3duIHR1bmVyIGlkOiVkIiwKKwkJCWFmOTAxNV9hZjkwMTNfY29uZmlnW2FkYXAtPmlkXS50dW5lcik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBhZjkwMTVfdXNiX3RhYmxlW10gPSB7CisvKiAgMCAqL3tVU0JfREVWSUNFKFVTQl9WSURfQUZBVEVDSCwgICBVU0JfUElEX0FGQVRFQ0hfQUY5MDE1XzkwMTUpfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX0FGQVRFQ0gsICAgVVNCX1BJRF9BRkFURUNIX0FGOTAxNV85MDE2KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9MRUFEVEVLLCAgIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX0dPTEQpfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCAgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWNzFFKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9LV09STERfMiwgIFVTQl9QSURfS1dPUkxEXzM5OVUpfSwKKy8qICA1ICove1VTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLAorCQlVU0JfUElEX1RJTllUV0lOKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLAorCQlVU0JfUElEX0FaVVJFV0FWRV9BRF9UVTcwMCl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfVEVSUkFURUMsICBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9VU0JfWEVfUkVWMil9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX0tXT1JMRF9QQzE2MF8yVCl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9YKX0sCisvKiAxMCAqL3tVU0JfREVWSUNFKFVTQl9WSURfWFRFTlNJT05TLCBVU0JfUElEX1hURU5TSU9OU19YRF8zODApfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX01TSV8yLCAgICAgVVNCX1BJRF9NU0lfRElHSVZPWF9EVU8pfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVJfWF8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9URUxFU1RBUiwgIFVTQl9QSURfVEVMRVNUQVJfU1RBUlNUSUNLXzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwgVVNCX1BJRF9BVkVSTUVESUFfQTMwOSl9LAorLyogMTUgKi97VVNCX0RFVklDRShVU0JfVklEX01TSV8yLCAgICAgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUkpfSwKKwl7MH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGFmOTAxNV91c2JfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgYWY5MDE1X3Byb3BlcnRpZXNbXSA9IHsKKwl7CisJCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCQkudXNiX2N0cmwgPSBERVZJQ0VfU1BFQ0lGSUMsCisJCS5kb3dubG9hZF9maXJtd2FyZSA9IGFmOTAxNV9kb3dubG9hZF9maXJtd2FyZSwKKwkJLmZpcm13YXJlID0gImR2Yi11c2ItYWY5MDE1LmZ3IiwKKworCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdCBhZjkwMTVfc3RhdGUpLCBcCisKKwkJLm51bV9hZGFwdGVycyA9IDIsCisJCS5hZGFwdGVyID0geworCQkJeworCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKKwkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKworCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBhZjkwMTVfcGlkX2ZpbHRlciwKKwkJCQkucGlkX2ZpbHRlcl9jdHJsICA9IGFmOTAxNV9waWRfZmlsdGVyX2N0cmwsCisKKwkJCQkuZnJvbnRlbmRfYXR0YWNoID0KKwkJCQkJYWY5MDE1X2FmOTAxM19mcm9udGVuZF9hdHRhY2gsCisJCQkJLnR1bmVyX2F0dGFjaCAgICA9IGFmOTAxNV90dW5lcl9hdHRhY2gsCisJCQkJLnN0cmVhbSA9IHsKKwkJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkJLmNvdW50ID0gNiwKKwkJCQkJLmVuZHBvaW50ID0gMHg4NCwKKwkJCQl9LAorCQkJfSwKKwkJCXsKKwkJCQkuZnJvbnRlbmRfYXR0YWNoID0KKwkJCQkJYWY5MDE1X2FmOTAxM19mcm9udGVuZF9hdHRhY2gsCisJCQkJLnR1bmVyX2F0dGFjaCAgICA9IGFmOTAxNV90dW5lcl9hdHRhY2gsCisJCQkJLnN0cmVhbSA9IHsKKwkJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkJLmNvdW50ID0gNiwKKwkJCQkJLmVuZHBvaW50ID0gMHg4NSwKKwkJCQl9LAorCQkJfQorCQl9LAorCisJCS5pZGVudGlmeV9zdGF0ZSA9IGFmOTAxNV9pZGVudGlmeV9zdGF0ZSwKKworCQkucmNfcXVlcnkgICAgICAgICA9IGFmOTAxNV9yY19xdWVyeSwKKwkJLnJjX2ludGVydmFsICAgICAgPSAxNTAsCisKKwkJLmkyY19hbGdvID0gJmFmOTAxNV9pMmNfYWxnbywKKworCQkubnVtX2RldmljZV9kZXNjcyA9IDksCisJCS5kZXZpY2VzID0geworCQkJeworCQkJCS5uYW1lID0gIkFmYXRlY2ggQUY5MDE1IERWQi1UIFVTQjIuMCBzdGljayIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzBdLAorCQkJCQkgICAgICZhZjkwMTVfdXNiX3RhYmxlWzFdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkxlYWR0ZWsgV2luRmFzdCBEVFYgRG9uZ2xlIEdvbGQiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVsyXSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJQaW5uYWNsZSBQQ1RWIDcxZSIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzNdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIktXb3JsZCBQbHVzVFYgRHVhbCBEVkItVCBTdGljayAiIFwKKwkJCQkJIihEVkItVCAzOTlVKSIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzRdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkRpZ2l0YWxOb3cgVGlueVR3aW4gRFZCLVQgUmVjZWl2ZXIiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVs1XSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUd2luSGFuIEF6dXJlV2F2ZSBBRC1UVTcwMCg3MDRKKSIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzZdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRlcnJhVGVjIENpbmVyZ3kgVCBVU0IgWEUiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVs3XSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJLV29ybGQgUGx1c1RWIER1YWwgRFZCLVQgUENJICIgXAorCQkJCQkiKERWQi1UIFBDMTYwLTJUKSIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzhdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgVm9sYXIgWCIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzldLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQl9CisJfSwgeworCQkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAorCQkuZG93bmxvYWRfZmlybXdhcmUgPSBhZjkwMTVfZG93bmxvYWRfZmlybXdhcmUsCisJCS5maXJtd2FyZSA9ICJkdmItdXNiLWFmOTAxNS5mdyIsCisKKwkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QgYWY5MDE1X3N0YXRlKSwgXAorCisJCS5udW1fYWRhcHRlcnMgPSAyLAorCQkuYWRhcHRlciA9IHsKKwkJCXsKKwkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CisJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisKKwkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCQkJCS5waWRfZmlsdGVyICAgICAgID0gYWY5MDE1X3BpZF9maWx0ZXIsCisJCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBhZjkwMTVfcGlkX2ZpbHRlcl9jdHJsLAorCisJCQkJLmZyb250ZW5kX2F0dGFjaCA9CisJCQkJCWFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoLAorCQkJCS50dW5lcl9hdHRhY2ggICAgPSBhZjkwMTVfdHVuZXJfYXR0YWNoLAorCQkJCS5zdHJlYW0gPSB7CisJCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJCS5jb3VudCA9IDYsCisJCQkJCS5lbmRwb2ludCA9IDB4ODQsCisJCQkJfSwKKwkJCX0sCisJCQl7CisJCQkJLmZyb250ZW5kX2F0dGFjaCA9CisJCQkJCWFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoLAorCQkJCS50dW5lcl9hdHRhY2ggICAgPSBhZjkwMTVfdHVuZXJfYXR0YWNoLAorCQkJCS5zdHJlYW0gPSB7CisJCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJCS5jb3VudCA9IDYsCisJCQkJCS5lbmRwb2ludCA9IDB4ODUsCisJCQkJfSwKKwkJCX0KKwkJfSwKKworCQkuaWRlbnRpZnlfc3RhdGUgPSBhZjkwMTVfaWRlbnRpZnlfc3RhdGUsCisKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBhZjkwMTVfcmNfcXVlcnksCisJCS5yY19pbnRlcnZhbCAgICAgID0gMTUwLAorCisJCS5pMmNfYWxnbyA9ICZhZjkwMTVfaTJjX2FsZ28sCisKKwkJLm51bV9kZXZpY2VfZGVzY3MgPSA2LAorCQkuZGV2aWNlcyA9IHsKKwkJCXsKKwkJCQkubmFtZSA9ICJYdGVuc2lvbnMgWEQtMzgwIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMTBdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIk1TSSBESUdJVk9YIER1byIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzExXSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJGdWppdHN1LVNpZW1lbnMgU2xpbSBNb2JpbGUgVVNCIERWQi1UIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMTJdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRlbGVzdGFyIFN0YXJzdGljayAyIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMTNdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkFWZXJNZWRpYSBBMzA5IiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMTRdLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIk1TSSBEaWdpIFZPWCBtaW5pIElJSSIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzE1XSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQgYWY5MDE1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJdTggaTsKKworCWRlYl9pbmZvKCIlczogaW50ZXJmYWNlOiVkXG4iLCBfX2Z1bmNfXywKKwkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwkvKiBpbnRlcmZhY2UgMCBpcyB1c2VkIGJ5IERWQi1UIHJlY2VpdmVyIGFuZAorCSAgIGludGVyZmFjZSAxIGlzIGZvciByZW1vdGUgY29udHJvbGxlciAoSElEKSAqLworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID09IDApIHsKKwkJcmV0ID0gYWY5MDE1X3JlYWRfY29uZmlnKHVkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYWY5MDE1X3Byb3BlcnRpZXNfY291bnQ7IGkrKykgeworCQkJcmV0ID0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmYWY5MDE1X3Byb3BlcnRpZXNbaV0sCisJCQkJVEhJU19NT0RVTEUsICZkLCBhZGFwdGVyX25yKTsKKwkJCWlmICghcmV0KQorCQkJCWJyZWFrOworCQkJaWYgKHJldCAhPSAtRU5PREVWKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGQpCisJCQlyZXQgPSBhZjkwMTVfaW5pdChkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFmOTAxNV9pMmNfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IGFmOTAxNV9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWRlYl9pbmZvKCIlczogXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiByZW1vdmUgMm5kIEkyQyBhZGFwdGVyICovCisJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9JMkMpCisJCWkyY19kZWxfYWRhcHRlcigmc3RhdGUtPmkyY19hZGFwKTsKK30KKworc3RhdGljIHZvaWQgYWY5MDE1X3VzYl9kZXZpY2VfZXhpdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWRlYl9pbmZvKCIlczogXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiByZW1vdmUgMm5kIEkyQyBhZGFwdGVyICovCisJaWYgKGQgIT0gTlVMTCAmJiBkLT5kZXNjICE9IE5VTEwpCisJCWFmOTAxNV9pMmNfZXhpdChkKTsKKworCWR2Yl91c2JfZGV2aWNlX2V4aXQoaW50Zik7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhZjkwMTVfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJkdmJfdXNiX2FmOTAxNSIsCisJLnByb2JlID0gYWY5MDE1X3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGFmOTAxNV91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlID0gYWY5MDE1X3VzYl90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgYWY5MDE1X3VzYl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gdXNiX3JlZ2lzdGVyKCZhZjkwMTVfdXNiX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZXJyKCJtb2R1bGUgaW5pdCBmYWlsZWQ6JWQiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFmOTAxNV91c2JfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmYWY5MDE1X3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZjkwMTVfdXNiX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGFmOTAxNV91c2JfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBZmF0ZWNoIEFGOTAxNSBEVkItVCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyZThhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHJlY2VpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqIFRoYW5rcyB0byBBZmF0ZWNoIHdobyBraW5kbHkgcHJvdmlkZWQgaW5mb3JtYXRpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfQUY5MDE1X0hfCisjZGVmaW5lIF9EVkJfVVNCX0FGOTAxNV9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiYWY5MDE1IgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworZXh0ZXJuIGludCBkdmJfdXNiX2FmOTAxNV9kZWJ1ZzsKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgwMSwgYXJncykKKyNkZWZpbmUgZGViX3JjKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgwMiwgYXJncykKKyNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgwNCwgYXJncykKKyNkZWZpbmUgZGViX3JlZyhhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgwOCwgYXJncykKKyNkZWZpbmUgZGViX2kyYyhhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgxMCwgYXJncykKKyNkZWZpbmUgZGViX2Z3KGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2FmOTAxNV9kZWJ1ZywgMHgyMCwgYXJncykKKworI2RlZmluZSBBRjkwMTVfSTJDX0VFUFJPTSAgMHhhMAorI2RlZmluZSBBRjkwMTVfSTJDX0RFTU9EICAgMHgzOAorI2RlZmluZSBBRjkwMTVfVVNCX1RJTUVPVVQgMjAwMAorCisvKiBFRVBST00gbG9jYXRpb25zICovCisjZGVmaW5lIEFGOTAxNV9FRVBST01fSVJfTU9ERSAgICAgICAgMHgxOAorI2RlZmluZSBBRjkwMTVfRUVQUk9NX0lSX1JFTU9URV9UWVBFIDB4MzQKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9UU19NT0RFICAgICAgICAweDMxCisjZGVmaW5lIEFGOTAxNV9FRVBST01fREVNT0QyX0kyQyAgICAgMHgzMgorCisjZGVmaW5lIEFGOTAxNV9FRVBST01fU0FXX0JXMSAgICAgICAgMHgzNQorI2RlZmluZSBBRjkwMTVfRUVQUk9NX1hUQUxfVFlQRTEgICAgIDB4MzYKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9TUEVDX0lOVjEgICAgICAweDM3CisjZGVmaW5lIEFGOTAxNV9FRVBST01fSUYxTCAgICAgICAgICAgMHgzOAorI2RlZmluZSBBRjkwMTVfRUVQUk9NX0lGMUggICAgICAgICAgIDB4MzkKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9NVDIwNjBfSUYxTCAgICAweDNhCisjZGVmaW5lIEFGOTAxNV9FRVBST01fTVQyMDYwX0lGMUggICAgMHgzYgorI2RlZmluZSBBRjkwMTVfRUVQUk9NX1RVTkVSX0lEMSAgICAgIDB4M2MKKworI2RlZmluZSBBRjkwMTVfRUVQUk9NX1NBV19CVzIgICAgICAgIDB4NDUKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9YVEFMX1RZUEUyICAgICAweDQ2CisjZGVmaW5lIEFGOTAxNV9FRVBST01fU1BFQ19JTlYyICAgICAgMHg0NworI2RlZmluZSBBRjkwMTVfRUVQUk9NX0lGMkwgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9JRjJIICAgICAgICAgICAweDQ5CisjZGVmaW5lIEFGOTAxNV9FRVBST01fTVQyMDYwX0lGMkwgICAgMHg0YQorI2RlZmluZSBBRjkwMTVfRUVQUk9NX01UMjA2MF9JRjJIICAgIDB4NGIKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9UVU5FUl9JRDIgICAgICAweDRjCisKKyNkZWZpbmUgQUY5MDE1X0VFUFJPTV9PRkZTRVQgKEFGOTAxNV9FRVBST01fU0FXX0JXMiAtIEFGOTAxNV9FRVBST01fU0FXX0JXMSkKKworI2RlZmluZSBBRjkwMTVfR1BJT19PTiAoMSA8PCAwKQorI2RlZmluZSBBRjkwMTVfR1BJT19FTiAoMSA8PCAxKQorI2RlZmluZSBBRjkwMTVfR1BJT19PICAoMSA8PCAyKQorI2RlZmluZSBBRjkwMTVfR1BJT19JICAoMSA8PCAzKQorCisjZGVmaW5lIEFGOTAxNV9HUElPX1RVTkVSX09OICAoQUY5MDE1X0dQSU9fT058QUY5MDE1X0dQSU9fRU4pCisjZGVmaW5lIEFGOTAxNV9HUElPX1RVTkVSX09GRiAoQUY5MDE1X0dQSU9fT058QUY5MDE1X0dQSU9fRU58QUY5MDE1X0dQSU9fTykKKworc3RydWN0IHJlcV90IHsKKwl1OCAgY21kOyAgICAgICAvKiBbMF0gKi8KKwkvKiAgc2VxICovICAgICAvKiBbMV0gKi8KKwl1OCAgaTJjX2FkZHI7ICAvKiBbMl0gKi8KKwl1MTYgYWRkcjsgICAgICAvKiBbM3w0XSAqLworCXU4ICBtYm94OyAgICAgIC8qIFs1XSAqLworCXU4ICBhZGRyX2xlbjsgIC8qIFs2XSAqLworCXU4ICBkYXRhX2xlbjsgIC8qIFs3XSAqLworCXU4ICAqZGF0YTsKK307CisKK2VudW0gYWY5MDE1X2NtZCB7CisJR0VUX0NPTkZJRyAgICAgICAgICAgPSAweDEwLAorCURPV05MT0FEX0ZJUk1XQVJFICAgID0gMHgxMSwKKwlCT09UICAgICAgICAgICAgICAgICA9IDB4MTMsCisJUkVBRF9NRU1PUlkgICAgICAgICAgPSAweDIwLAorCVdSSVRFX01FTU9SWSAgICAgICAgID0gMHgyMSwKKwlSRUFEX1dSSVRFX0kyQyAgICAgICA9IDB4MjIsCisJQ09QWV9GSVJNV0FSRSAgICAgICAgPSAweDIzLAorCVJFQ09OTkVDVF9VU0IgICAgICAgID0gMHg1YSwKKwlXUklURV9WSVJUVUFMX01FTU9SWSA9IDB4MjYsCisJR0VUX0lSX0NPREUgICAgICAgICAgPSAweDI3LAorCVJFQURfSTJDLAorCVdSSVRFX0kyQywKK307CisKK2VudW0gYWY5MDE1X2lyX21vZGUgeworCUFGOTAxNV9JUl9NT0RFX0RJU0FCTEVEID0gMCwKKwlBRjkwMTVfSVJfTU9ERV9ISUQsCisJQUY5MDE1X0lSX01PREVfUkxDLAorCUFGOTAxNV9JUl9NT0RFX1JDNiwKK307CisKK3N0cnVjdCBhZjkwMTVfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsgLyogSTJDIGFkYXB0ZXIgZm9yIDJuZCBGRSAqLworfTsKKworc3RydWN0IGFmOTAxNV9jb25maWcgeworCXU4ICBkdWFsX21vZGU6MTsKKwl1MTYgbXQyMDYwX2lmMVsyXTsKKwl1MTYgZmlybXdhcmVfc2l6ZTsKKwl1MTYgZmlybXdhcmVfY2hlY2tzdW07CisJdTggICppcl90YWJsZTsKKwl1MTYgaXJfdGFibGVfc2l6ZTsKK307CisKK2VudW0gYWY5MDE1X3JlbW90ZSB7CisJQUY5MDE1X1JFTU9URV9OT05FICAgICAgICAgICAgICAgICAgICA9IDAsCisJQUY5MDE1X1JFTU9URV9BX0xJTktfRFRVX00sCisJQUY5MDE1X1JFTU9URV9NU0lfRElHSVZPWF9NSU5JX0lJX1YzLAorCUFGOTAxNV9SRU1PVEVfTVlHSUNUVl9VNzE4LAorfTsKKworLyogTGVhZHRlayBXaW5GYXN0IERUViBEb25nbGUgR29sZCAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBhZjkwMTVfcmNfa2V5c19sZWFkdGVrW10gPSB7CisJeyAweDAwLCAweDFlLCBLRVlfMSB9LAorCXsgMHgwMCwgMHgxZiwgS0VZXzIgfSwKKwl7IDB4MDAsIDB4MjAsIEtFWV8zIH0sCisJeyAweDAwLCAweDIxLCBLRVlfNCB9LAorCXsgMHgwMCwgMHgyMiwgS0VZXzUgfSwKKwl7IDB4MDAsIDB4MjMsIEtFWV82IH0sCisJeyAweDAwLCAweDI0LCBLRVlfNyB9LAorCXsgMHgwMCwgMHgyNSwgS0VZXzggfSwKKwl7IDB4MDAsIDB4MjYsIEtFWV85IH0sCisJeyAweDAwLCAweDI3LCBLRVlfMCB9LAorCXsgMHgwMCwgMHgyOCwgS0VZX0VOVEVSIH0sCisJeyAweDAwLCAweDRmLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDAsIDB4NTAsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAwLCAweDUxLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIDB4NTIsIEtFWV9DSEFOTkVMVVAgfSwKK307CisKK3N0YXRpYyB1OCBhZjkwMTVfaXJfdGFibGVfbGVhZHRla1tdID0geworCTB4MDMsIDB4ZmMsIDB4MDAsIDB4ZmYsIDB4MWEsIDB4MDEsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1NiwgMHhhOSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDRiLCAweGI0LCAweDAwLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NGMsIDB4YjMsIDB4YjIsIDB4MDQsIDB4MDAsCisJMHgwMywgMHhmYywgMHg0ZCwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDRlLCAweGIxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MWYsIDB4ZTAsIDB4M2QsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg0MCwgMHhiZiwgMHgxMywgMHgwMSwgMHgwMCwKKwkweDAzLCAweGZjLCAweDE0LCAweGViLCAweDEwLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDksIDB4YjYsIDB4MDUsIDB4MDEsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1MCwgMHhhZiwgMHgyOSwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDBjLCAweGYzLCAweDUyLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDMsIDB4ZmMsIDB4MDksIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgwOCwgMHhmNywgMHg1MCwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDEzLCAweGVjLCAweDI4LCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDQsIDB4ZmIsIDB4NGYsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg0ZiwgMHhiMCwgMHgwZiwgMHgwMSwgMHgwMCwKKwkweDAzLCAweGZjLCAweDEwLCAweGVmLCAweDUxLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NTEsIDB4YWUsIDB4M2YsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg0MiwgMHhiZCwgMHgxMywgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDQzLCAweGJjLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDQsIDB4YmIsIDB4MTEsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1MiwgMHhhZCwgMHgxOSwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDU0LCAweGFiLCAweDA1LCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDYsIDB4YjksIDB4MjksIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1NSwgMHhhYSwgMHgyYiwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDUzLCAweGFjLCAweDQxLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MDUsIDB4ZmEsIDB4MWUsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgwNiwgMHhmOSwgMHgxZiwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDA3LCAweGY4LCAweDIwLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MWUsIDB4ZTEsIDB4MTksIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgwOSwgMHhmNiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDBhLCAweGY1LCAweDIyLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MGIsIDB4ZjQsIDB4MjMsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgxYiwgMHhlNCwgMHgxNiwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDBkLCAweGYyLCAweDI0LCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4MGUsIDB4ZjEsIDB4MjUsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgwZiwgMHhmMCwgMHgyNiwgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDE2LCAweGU5LCAweDI4LCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDEsIDB4YmUsIDB4MzcsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHgxMiwgMHhlZCwgMHgyNywgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDExLCAweGVlLCAweDJhLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDgsIDB4YjcsIDB4MmMsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg0YSwgMHhiNSwgMHgzYywgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDQ3LCAweGI4LCAweDE1LCAweDAxLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NDUsIDB4YmEsIDB4MGIsIDB4MDEsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1ZSwgMHhhMSwgMHg0MywgMHgwMCwgMHgwMCwKKwkweDAzLCAweGZjLCAweDVhLCAweGE1LCAweDQyLCAweDAwLCAweDAwLAorCTB4MDMsIDB4ZmMsIDB4NWIsIDB4YTQsIDB4NGIsIDB4MDAsIDB4MDAsCisJMHgwMywgMHhmYywgMHg1ZiwgMHhhMCwgMHg0ZSwgMHgwMCwgMHgwMCwKK307CisKKy8qIFR3aW5IYW4gQXp1cmVXYXZlIEFELVRVNzAwKDcwNEopICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGFmOTAxNV9yY19rZXlzX3R3aW5oYW5bXSA9IHsKKwl7IDB4MDUsIDB4M2YsIEtFWV9QT1dFUiB9LAorCXsgMHgwMCwgMHgxOSwgS0VZX0ZBVk9SSVRFUyB9LCAgICAvKiBGYXZvcml0ZSBMaXN0ICovCisJeyAweDAwLCAweDA0LCBLRVlfVEVYVCB9LCAgICAgICAgIC8qIFRlbGV0ZXh0ICovCisJeyAweDAwLCAweDBlLCBLRVlfUE9XRVIgfSwKKwl7IDB4MDAsIDB4MGUsIEtFWV9JTkZPIH0sICAgICAgICAgLyogUHJldmlldyAqLworCXsgMHgwMCwgMHgwOCwgS0VZX0VQRyB9LCAgICAgICAgICAvKiBJbmZvL0VQRyAqLworCXsgMHgwMCwgMHgwZiwgS0VZX0xJU1QgfSwgICAgICAgICAvKiBSZWNvcmQgTGlzdCAqLworCXsgMHgwMCwgMHgxZSwgS0VZXzEgfSwKKwl7IDB4MDAsIDB4MWYsIEtFWV8yIH0sCisJeyAweDAwLCAweDIwLCBLRVlfMyB9LAorCXsgMHgwMCwgMHgyMSwgS0VZXzQgfSwKKwl7IDB4MDAsIDB4MjIsIEtFWV81IH0sCisJeyAweDAwLCAweDIzLCBLRVlfNiB9LAorCXsgMHgwMCwgMHgyNCwgS0VZXzcgfSwKKwl7IDB4MDAsIDB4MjUsIEtFWV84IH0sCisJeyAweDAwLCAweDI2LCBLRVlfOSB9LAorCXsgMHgwMCwgMHgyNywgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MjksIEtFWV9DQU5DRUwgfSwgICAgICAgLyogQ2FuY2VsICovCisJeyAweDAwLCAweDRjLCBLRVlfQ0xFQVIgfSwgICAgICAgIC8qIENsZWFyICovCisJeyAweDAwLCAweDJhLCBLRVlfQkFDSyB9LCAgICAgICAgIC8qIEJhY2sgKi8KKwl7IDB4MDAsIDB4MmIsIEtFWV9UQUIgfSwgICAgICAgICAgLyogVGFiICovCisJeyAweDAwLCAweDUyLCBLRVlfVVAgfSwgICAgICAgICAgIC8qIHVwIGFycm93ICovCisJeyAweDAwLCAweDUxLCBLRVlfRE9XTiB9LCAgICAgICAgIC8qIGRvd24gYXJyb3cgKi8KKwl7IDB4MDAsIDB4NGYsIEtFWV9SSUdIVCB9LCAgICAgICAgLyogcmlnaHQgYXJyb3cgKi8KKwl7IDB4MDAsIDB4NTAsIEtFWV9MRUZUIH0sICAgICAgICAgLyogbGVmdCBhcnJvdyAqLworCXsgMHgwMCwgMHgyOCwgS0VZX0VOVEVSIH0sICAgICAgICAvKiBFbnRlciAvIG9rICovCisJeyAweDAyLCAweDUyLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDIsIDB4NTEsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAwLCAweDRlLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIDB4NGIsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MDAsIDB4NGEsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDEsIDB4MTEsIEtFWV9QTEFZIH0sCisJeyAweDAwLCAweDE3LCBLRVlfUEFVU0UgfSwKKwl7IDB4MDAsIDB4MGMsIEtFWV9SRVdJTkQgfSwgICAgICAgLyogRlIgPDwgKi8KKwl7IDB4MDAsIDB4MTEsIEtFWV9GQVNURk9SV0FSRCB9LCAgLyogRkYgPj4gKi8KKwl7IDB4MDEsIDB4MTUsIEtFWV9QUkVWSU9VUyB9LCAgICAgLyogUmVwbGF5ICovCisJeyAweDAxLCAweDBlLCBLRVlfTkVYVCB9LCAgICAgICAgIC8qIFNraXAgKi8KKwl7IDB4MDAsIDB4MTMsIEtFWV9DQU1FUkEgfSwgICAgICAgLyogQ2FwdHVyZSAqLworCXsgMHgwMSwgMHgwZiwgS0VZX0xBTkdVQUdFIH0sICAgICAvKiBTQVAgKi8KKwl7IDB4MDEsIDB4MTMsIEtFWV9UVjIgfSwgICAgICAgICAgLyogUElQICovCisJeyAweDAwLCAweDFkLCBLRVlfWk9PTSB9LCAgICAgICAgIC8qIEZ1bGwgU2NyZWVuICovCisJeyAweDAxLCAweDE3LCBLRVlfU1VCVElUTEUgfSwgICAgIC8qIFN1YnRpdGxlIC8gQ0MgKi8KKwl7IDB4MDAsIDB4MTAsIEtFWV9NVVRFIH0sCisJeyAweDAxLCAweDE5LCBLRVlfQVVESU8gfSwgICAgICAgIC8qIEwvUiAqLyAvKiBUT0RPIGJldHRlciBldmVudCAqLworCXsgMHgwMSwgMHgxNiwgS0VZX1NMRUVQIH0sICAgICAgICAvKiBIaWJlcm5hdGUgKi8KKwl7IDB4MDEsIDB4MTYsIEtFWV9TV0lUQ0hWSURFT01PREUgfSwKKwkJCQkJICAvKiBBL1YgKi8gLyogVE9ETyBkb2VzIG5vdCB3b3JrICovCisJeyAweDAwLCAweDA2LCBLRVlfQUdBSU4gfSwgICAgICAgIC8qIFJlY2FsbCAqLworCXsgMHgwMSwgMHgxNiwgS0VZX0tQUExVUyB9LCAgICAgICAvKiBab29tKyAqLyAvKiBUT0RPIGRvZXMgbm90IHdvcmsgKi8KKwl7IDB4MDEsIDB4MTYsIEtFWV9LUE1JTlVTIH0sICAgICAgLyogWm9vbS0gKi8gLyogVE9ETyBkb2VzIG5vdCB3b3JrICovCisJeyAweDAyLCAweDE1LCBLRVlfUkVEIH0sCisJeyAweDAyLCAweDBhLCBLRVlfR1JFRU4gfSwKKwl7IDB4MDIsIDB4MWMsIEtFWV9ZRUxMT1cgfSwKKwl7IDB4MDIsIDB4MDUsIEtFWV9CTFVFIH0sCit9OworCitzdGF0aWMgdTggYWY5MDE1X2lyX3RhYmxlX3R3aW5oYW5bXSA9IHsKKwkweDAwLCAweGZmLCAweDE2LCAweGU5LCAweDNmLCAweDA1LCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MDcsIDB4ZjgsIDB4MTYsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxNCwgMHhlYiwgMHgxMSwgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDFhLCAweGU1LCAweDRkLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NGMsIDB4YjMsIDB4MTcsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxMiwgMHhlZCwgMHgxMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDQwLCAweGJmLCAweDBjLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTEsIDB4ZWUsIDB4NGEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg1NCwgMHhhYiwgMHgxMywgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDQxLCAweGJlLCAweDE1LCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NDIsIDB4YmQsIDB4MGUsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg0MywgMHhiYywgMHgxNywgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDUwLCAweGFmLCAweDBmLCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NGQsIDB4YjIsIDB4MWQsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg0NywgMHhiOCwgMHgxMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweGZmLCAweDA1LCAweGZhLCAweDRiLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MDIsIDB4ZmQsIDB4NGUsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwZSwgMHhmMSwgMHgwNiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDFlLCAweGUxLCAweDUyLCAweDAyLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MGEsIDB4ZjUsIDB4NTEsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxMCwgMHhlZiwgMHgxMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDQ5LCAweGI2LCAweDE5LCAweDAxLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTUsIDB4ZWEsIDB4MjcsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwMywgMHhmYywgMHgxZSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDAxLCAweGZlLCAweDFmLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MDYsIDB4ZjksIDB4MjAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwOSwgMHhmNiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDFkLCAweGUyLCAweDIyLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MWYsIDB4ZTAsIDB4MjMsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwZCwgMHhmMiwgMHgyNCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDE5LCAweGU2LCAweDI1LCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MWIsIDB4ZTQsIDB4MjYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgyYiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDRhLCAweGI1LCAweDRjLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NGIsIDB4YjQsIDB4NTIsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg1MSwgMHhhZSwgMHg1MSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDUyLCAweGFkLCAweDRmLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NGUsIDB4YjEsIDB4NTAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwYywgMHhmMywgMHgyOSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDRmLCAweGIwLCAweDI4LCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTMsIDB4ZWMsIDB4MmEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgxNywgMHhlOCwgMHgxOSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDA0LCAweGZiLCAweDBmLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NDgsIDB4YjcsIDB4MGUsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHgwZiwgMHhmMCwgMHgwNCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGZmLCAweDFjLCAweGUzLCAweDA4LCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4MTgsIDB4ZTcsIDB4MTUsIDB4MDIsIDB4MDAsCisJMHgwMCwgMHhmZiwgMHg1MywgMHhhYywgMHgwYSwgMHgwMiwgMHgwMCwKKwkweDAwLCAweGZmLCAweDVlLCAweGExLCAweDFjLCAweDAyLCAweDAwLAorCTB4MDAsIDB4ZmYsIDB4NWYsIDB4YTAsIDB4MDUsIDB4MDIsIDB4MDAsCit9OworCisvKiBBLUxpbmsgRFRVKG0pICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGFmOTAxNV9yY19rZXlzX2FfbGlua1tdID0geworCXsgMHgwMCwgMHgxZSwgS0VZXzEgfSwKKwl7IDB4MDAsIDB4MWYsIEtFWV8yIH0sCisJeyAweDAwLCAweDIwLCBLRVlfMyB9LAorCXsgMHgwMCwgMHgyMSwgS0VZXzQgfSwKKwl7IDB4MDAsIDB4MjIsIEtFWV81IH0sCisJeyAweDAwLCAweDIzLCBLRVlfNiB9LAorCXsgMHgwMCwgMHgyNCwgS0VZXzcgfSwKKwl7IDB4MDAsIDB4MjUsIEtFWV84IH0sCisJeyAweDAwLCAweDI2LCBLRVlfOSB9LAorCXsgMHgwMCwgMHgyNywgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MmUsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MDAsIDB4MmQsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwNCwgMHgyOCwgS0VZX1pPT00gfSwKKwl7IDB4MDAsIDB4NDEsIEtFWV9NVVRFIH0sCisJeyAweDAwLCAweDQyLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMCwgMHg0MywgS0VZX1ZPTFVNRVVQIH0sCisJeyAweDAwLCAweDQ0LCBLRVlfR09UTyB9LCAgICAgICAgIC8qIGp1bXAgKi8KKwl7IDB4MDUsIDB4NDUsIEtFWV9QT1dFUiB9LAorfTsKKworc3RhdGljIHU4IGFmOTAxNV9pcl90YWJsZV9hX2xpbmtbXSA9IHsKKwkweDA4LCAweGY3LCAweDEyLCAweGVkLCAweDQ1LCAweDA1LCAweDAwLCAvKiBwb3dlciAqLworCTB4MDgsIDB4ZjcsIDB4MWEsIDB4ZTUsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIG11dGUgKi8KKwkweDA4LCAweGY3LCAweDAxLCAweGZlLCAweDFlLCAweDAwLCAweDAwLCAvKiAxICovCisJMHgwOCwgMHhmNywgMHgxYywgMHhlMywgMHgyMSwgMHgwMCwgMHgwMCwgLyogNCAqLworCTB4MDgsIDB4ZjcsIDB4MDMsIDB4ZmMsIDB4MjQsIDB4MDAsIDB4MDAsIC8qIDcgKi8KKwkweDA4LCAweGY3LCAweDA1LCAweGZhLCAweDI4LCAweDA0LCAweDAwLCAvKiB6b29tICovCisJMHgwOCwgMHhmNywgMHgwMCwgMHhmZiwgMHg0MywgMHgwMCwgMHgwMCwgLyogdm9sdW1lIHVwICovCisJMHgwOCwgMHhmNywgMHgxNiwgMHhlOSwgMHg0MiwgMHgwMCwgMHgwMCwgLyogdm9sdW1lIGRvd24gKi8KKwkweDA4LCAweGY3LCAweDBmLCAweGYwLCAweDFmLCAweDAwLCAweDAwLCAvKiAyICovCisJMHgwOCwgMHhmNywgMHgwZCwgMHhmMiwgMHgyMiwgMHgwMCwgMHgwMCwgLyogNSAqLworCTB4MDgsIDB4ZjcsIDB4MWIsIDB4ZTQsIDB4MjUsIDB4MDAsIDB4MDAsIC8qIDggKi8KKwkweDA4LCAweGY3LCAweDA2LCAweGY5LCAweDI3LCAweDAwLCAweDAwLCAvKiAwICovCisJMHgwOCwgMHhmNywgMHgxNCwgMHhlYiwgMHgyZSwgMHgwMCwgMHgwMCwgLyogY2hhbm5lbCB1cCAqLworCTB4MDgsIDB4ZjcsIDB4MWQsIDB4ZTIsIDB4MmQsIDB4MDAsIDB4MDAsIC8qIGNoYW5uZWwgZG93biAqLworCTB4MDgsIDB4ZjcsIDB4MDIsIDB4ZmQsIDB4MjAsIDB4MDAsIDB4MDAsIC8qIDMgKi8KKwkweDA4LCAweGY3LCAweDE4LCAweGU3LCAweDIzLCAweDAwLCAweDAwLCAvKiA2ICovCisJMHgwOCwgMHhmNywgMHgwNCwgMHhmYiwgMHgyNiwgMHgwMCwgMHgwMCwgLyogOSAqLworCTB4MDgsIDB4ZjcsIDB4MDcsIDB4ZjgsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIGp1bXAgKi8KK307CisKKy8qIE1TSSBESUdJVk9YIG1pbmkgSUkgVjMuMCAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBhZjkwMTVfcmNfa2V5c19tc2lbXSA9IHsKKwl7IDB4MDAsIDB4MWUsIEtFWV8xIH0sCisJeyAweDAwLCAweDFmLCBLRVlfMiB9LAorCXsgMHgwMCwgMHgyMCwgS0VZXzMgfSwKKwl7IDB4MDAsIDB4MjEsIEtFWV80IH0sCisJeyAweDAwLCAweDIyLCBLRVlfNSB9LAorCXsgMHgwMCwgMHgyMywgS0VZXzYgfSwKKwl7IDB4MDAsIDB4MjQsIEtFWV83IH0sCisJeyAweDAwLCAweDI1LCBLRVlfOCB9LAorCXsgMHgwMCwgMHgyNiwgS0VZXzkgfSwKKwl7IDB4MDAsIDB4MjcsIEtFWV8wIH0sCisJeyAweDAzLCAweDBmLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAzLCAweDBlLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIDB4NDIsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAwLCAweDQzLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDUsIDB4NDUsIEtFWV9QT1dFUiB9LAorCXsgMHgwMCwgMHg1MiwgS0VZX1VQIH0sICAgICAgICAgICAvKiB1cCAqLworCXsgMHgwMCwgMHg1MSwgS0VZX0RPV04gfSwgICAgICAgICAvKiBkb3duICovCisJeyAweDAwLCAweDI4LCBLRVlfRU5URVIgfSwKK307CisKK3N0YXRpYyB1OCBhZjkwMTVfaXJfdGFibGVfbXNpW10gPSB7CisJMHgwMywgMHhmYywgMHgxNywgMHhlOCwgMHg0NSwgMHgwNSwgMHgwMCwgLyogcG93ZXIgKi8KKwkweDAzLCAweGZjLCAweDBkLCAweGYyLCAweDUxLCAweDAwLCAweDAwLCAvKiBkb3duICovCisJMHgwMywgMHhmYywgMHgwMywgMHhmYywgMHg1MiwgMHgwMCwgMHgwMCwgLyogdXAgKi8KKwkweDAzLCAweGZjLCAweDFhLCAweGU1LCAweDFlLCAweDAwLCAweDAwLCAvKiAxICovCisJMHgwMywgMHhmYywgMHgwMiwgMHhmZCwgMHgxZiwgMHgwMCwgMHgwMCwgLyogMiAqLworCTB4MDMsIDB4ZmMsIDB4MDQsIDB4ZmIsIDB4MjAsIDB4MDAsIDB4MDAsIC8qIDMgKi8KKwkweDAzLCAweGZjLCAweDFjLCAweGUzLCAweDIxLCAweDAwLCAweDAwLCAvKiA0ICovCisJMHgwMywgMHhmYywgMHgwOCwgMHhmNywgMHgyMiwgMHgwMCwgMHgwMCwgLyogNSAqLworCTB4MDMsIDB4ZmMsIDB4MWQsIDB4ZTIsIDB4MjMsIDB4MDAsIDB4MDAsIC8qIDYgKi8KKwkweDAzLCAweGZjLCAweDExLCAweGVlLCAweDI0LCAweDAwLCAweDAwLCAvKiA3ICovCisJMHgwMywgMHhmYywgMHgwYiwgMHhmNCwgMHgyNSwgMHgwMCwgMHgwMCwgLyogOCAqLworCTB4MDMsIDB4ZmMsIDB4MTAsIDB4ZWYsIDB4MjYsIDB4MDAsIDB4MDAsIC8qIDkgKi8KKwkweDAzLCAweGZjLCAweDA5LCAweGY2LCAweDI3LCAweDAwLCAweDAwLCAvKiAwICovCisJMHgwMywgMHhmYywgMHgxNCwgMHhlYiwgMHg0MywgMHgwMCwgMHgwMCwgLyogdm9sdW1lIHVwICovCisJMHgwMywgMHhmYywgMHgxZiwgMHhlMCwgMHg0MiwgMHgwMCwgMHgwMCwgLyogdm9sdW1lIGRvd24gKi8KKwkweDAzLCAweGZjLCAweDE1LCAweGVhLCAweDBmLCAweDAzLCAweDAwLCAvKiBjaGFubmVsIHVwICovCisJMHgwMywgMHhmYywgMHgwNSwgMHhmYSwgMHgwZSwgMHgwMywgMHgwMCwgLyogY2hhbm5lbCBkb3duICovCisJMHgwMywgMHhmYywgMHgxNiwgMHhlOSwgMHgyOCwgMHgwMCwgMHgwMCwgLyogZW50ZXIgKi8KK307CisKKy8qIE1ZR0lDVFYgVTcxOCAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBhZjkwMTVfcmNfa2V5c19teWdpY3R2W10gPSB7CisJeyAweDAwLCAweDNkLCBLRVlfU1dJVENIVklERU9NT0RFIH0sCisJCQkJCSAgLyogVFYgLyBBViAqLworCXsgMHgwNSwgMHg0NSwgS0VZX1BPV0VSIH0sCisJeyAweDAwLCAweDFlLCBLRVlfMSB9LAorCXsgMHgwMCwgMHgxZiwgS0VZXzIgfSwKKwl7IDB4MDAsIDB4MjAsIEtFWV8zIH0sCisJeyAweDAwLCAweDIxLCBLRVlfNCB9LAorCXsgMHgwMCwgMHgyMiwgS0VZXzUgfSwKKwl7IDB4MDAsIDB4MjMsIEtFWV82IH0sCisJeyAweDAwLCAweDI0LCBLRVlfNyB9LAorCXsgMHgwMCwgMHgyNSwgS0VZXzggfSwKKwl7IDB4MDAsIDB4MjYsIEtFWV85IH0sCisJeyAweDAwLCAweDI3LCBLRVlfMCB9LAorCXsgMHgwMCwgMHg0MSwgS0VZX01VVEUgfSwKKwl7IDB4MDAsIDB4MmEsIEtFWV9FU0MgfSwgICAgICAgICAgLyogRXNjICovCisJeyAweDAwLCAweDJlLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDAwLCAweDJkLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIDB4NDIsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAwLCAweDQzLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDAsIDB4NTIsIEtFWV9VUCB9LCAgICAgICAgICAgLyogdXAgYXJyb3cgKi8KKwl7IDB4MDAsIDB4NTEsIEtFWV9ET1dOIH0sICAgICAgICAgLyogZG93biBhcnJvdyAqLworCXsgMHgwMCwgMHg0ZiwgS0VZX1JJR0hUIH0sICAgICAgICAvKiByaWdodCBhcnJvdyAqLworCXsgMHgwMCwgMHg1MCwgS0VZX0xFRlQgfSwgICAgICAgICAvKiBsZWZ0IGFycm93ICovCisJeyAweDAwLCAweDI4LCBLRVlfRU5URVIgfSwgICAgICAgIC8qIG9rICovCisJeyAweDAxLCAweDE1LCBLRVlfUkVDT1JEIH0sCisJeyAweDAzLCAweDEzLCBLRVlfUExBWSB9LAorCXsgMHgwMSwgMHgxMywgS0VZX1BBVVNFIH0sCisJeyAweDAxLCAweDE2LCBLRVlfU1RPUCB9LAorCXsgMHgwMywgMHgwNywgS0VZX1JFV0lORCB9LCAgICAgICAvKiBGUiA8PCAqLworCXsgMHgwMywgMHgwOSwgS0VZX0ZBU1RGT1JXQVJEIH0sICAvKiBGRiA+PiAqLworCXsgMHgwMCwgMHgzYiwgS0VZX1RJTUUgfSwgICAgICAgICAvKiBUaW1lU2hpZnQgKi8KKwl7IDB4MDAsIDB4M2UsIEtFWV9DQU1FUkEgfSwgICAgICAgLyogU25hcHNob3QgKi8KKwl7IDB4MDMsIDB4MTYsIEtFWV9DWUNMRVdJTkRPV1MgfSwgLyogeWVsbG93LCBtaW4gLyBtYXggKi8KKwl7IDB4MDAsIDB4MDAsIEtFWV9aT09NIH0sICAgICAgICAgLyogJ3NlbGVjdCcgKD8pICovCisJeyAweDAzLCAweDE2LCBLRVlfU0hVRkZMRSB9LCAgICAgIC8qIFNodWZmbGUgKi8KKwl7IDB4MDMsIDB4NDUsIEtFWV9QT1dFUiB9LAorfTsKKworc3RhdGljIHU4IGFmOTAxNV9pcl90YWJsZV9teWdpY3R2W10gPSB7CisJMHgwMiwgMHhiZCwgMHgwYywgMHhmMywgMHgzZCwgMHgwMCwgMHgwMCwgLyogVFYgLyBBViAqLworCTB4MDIsIDB4YmQsIDB4MTQsIDB4ZWIsIDB4NDUsIDB4MDUsIDB4MDAsIC8qIHBvd2VyICovCisJMHgwMiwgMHhiZCwgMHgwMCwgMHhmZiwgMHgxZSwgMHgwMCwgMHgwMCwgLyogMSAqLworCTB4MDIsIDB4YmQsIDB4MDEsIDB4ZmUsIDB4MWYsIDB4MDAsIDB4MDAsIC8qIDIgKi8KKwkweDAyLCAweGJkLCAweDAyLCAweGZkLCAweDIwLCAweDAwLCAweDAwLCAvKiAzICovCisJMHgwMiwgMHhiZCwgMHgwMywgMHhmYywgMHgyMSwgMHgwMCwgMHgwMCwgLyogNCAqLworCTB4MDIsIDB4YmQsIDB4MDQsIDB4ZmIsIDB4MjIsIDB4MDAsIDB4MDAsIC8qIDUgKi8KKwkweDAyLCAweGJkLCAweDA1LCAweGZhLCAweDIzLCAweDAwLCAweDAwLCAvKiA2ICovCisJMHgwMiwgMHhiZCwgMHgwNiwgMHhmOSwgMHgyNCwgMHgwMCwgMHgwMCwgLyogNyAqLworCTB4MDIsIDB4YmQsIDB4MDcsIDB4ZjgsIDB4MjUsIDB4MDAsIDB4MDAsIC8qIDggKi8KKwkweDAyLCAweGJkLCAweDA4LCAweGY3LCAweDI2LCAweDAwLCAweDAwLCAvKiA5ICovCisJMHgwMiwgMHhiZCwgMHgwOSwgMHhmNiwgMHgyNywgMHgwMCwgMHgwMCwgLyogMCAqLworCTB4MDIsIDB4YmQsIDB4MGEsIDB4ZjUsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIG11dGUgKi8KKwkweDAyLCAweGJkLCAweDFjLCAweGUzLCAweDJhLCAweDAwLCAweDAwLCAvKiBlc2MgKi8KKwkweDAyLCAweGJkLCAweDFmLCAweGUwLCAweDQzLCAweDAwLCAweDAwLCAvKiB2b2x1bWUgdXAgKi8KKwkweDAyLCAweGJkLCAweDEyLCAweGVkLCAweDUyLCAweDAwLCAweDAwLCAvKiB1cCBhcnJvdyAqLworCTB4MDIsIDB4YmQsIDB4MTEsIDB4ZWUsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIGxlZnQgYXJyb3cgKi8KKwkweDAyLCAweGJkLCAweDE1LCAweGVhLCAweDI4LCAweDAwLCAweDAwLCAvKiBvayAqLworCTB4MDIsIDB4YmQsIDB4MTAsIDB4ZWYsIDB4NGYsIDB4MDAsIDB4MDAsIC8qIHJpZ2h0IGFycm93ICovCisJMHgwMiwgMHhiZCwgMHgxMywgMHhlYywgMHg1MSwgMHgwMCwgMHgwMCwgLyogZG93biBhcnJvdyAqLworCTB4MDIsIDB4YmQsIDB4MGUsIDB4ZjEsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIHZvbHVtZSBkb3duICovCisJMHgwMiwgMHhiZCwgMHgxOSwgMHhlNiwgMHgxNSwgMHgwMSwgMHgwMCwgLyogcmVjb3JkICovCisJMHgwMiwgMHhiZCwgMHgxZSwgMHhlMSwgMHgxMywgMHgwMywgMHgwMCwgLyogcGxheSAqLworCTB4MDIsIDB4YmQsIDB4MTYsIDB4ZTksIDB4MTYsIDB4MDEsIDB4MDAsIC8qIHN0b3AgKi8KKwkweDAyLCAweGJkLCAweDBiLCAweGY0LCAweDI4LCAweDA0LCAweDAwLCAvKiB5ZWxsb3csIG1pbiAvIG1heCAqLworCTB4MDIsIDB4YmQsIDB4MGYsIDB4ZjAsIDB4M2IsIDB4MDAsIDB4MDAsIC8qIHRpbWUgc2hpZnQgKi8KKwkweDAyLCAweGJkLCAweDE4LCAweGU3LCAweDJlLCAweDAwLCAweDAwLCAvKiBjaGFubmVsIHVwICovCisJMHgwMiwgMHhiZCwgMHgxYSwgMHhlNSwgMHgyZCwgMHgwMCwgMHgwMCwgLyogY2hhbm5lbCBkb3duICovCisJMHgwMiwgMHhiZCwgMHgxNywgMHhlOCwgMHgzZSwgMHgwMCwgMHgwMCwgLyogc25hcHNob3QgKi8KKwkweDAyLCAweGJkLCAweDQwLCAweGJmLCAweDEzLCAweDAxLCAweDAwLCAvKiBwYXVzZSAqLworCTB4MDIsIDB4YmQsIDB4NDEsIDB4YmUsIDB4MDksIDB4MDMsIDB4MDAsIC8qIEZGID4+ICovCisJMHgwMiwgMHhiZCwgMHg0MiwgMHhiZCwgMHgwNywgMHgwMywgMHgwMCwgLyogRlIgPDwgKi8KKwkweDAyLCAweGJkLCAweDQzLCAweGJjLCAweDAwLCAweDAwLCAweDAwLCAvKiAnc2VsZWN0JyAoPykgKi8KKwkweDAyLCAweGJkLCAweDQ0LCAweGJiLCAweDE2LCAweDAzLCAweDAwLCAvKiBzaHVmZmxlICovCisJMHgwMiwgMHhiZCwgMHg0NSwgMHhiYSwgMHg0NSwgMHgwMywgMHgwMCwgLyogcG93ZXIgKi8KK307CisKKy8qIEtXb3JsZCBQbHVzVFYgRHVhbCBEVkItVCBTdGljayAoRFZCLVQgMzk5VSkgKi8KK3N0YXRpYyB1OCBhZjkwMTVfaXJfdGFibGVfa3dvcmxkW10gPSB7CisJMHg4NiwgMHg2YiwgMHgwYywgMHhmMywgMHgyZSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDE2LCAweGU5LCAweDJkLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MWQsIDB4ZTIsIDB4MzcsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwMCwgMHhmZiwgMHgxZSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDAxLCAweGZlLCAweDFmLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MDIsIDB4ZmQsIDB4MjAsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwMywgMHhmYywgMHgyMSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDA0LCAweGZiLCAweDIyLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MDUsIDB4ZmEsIDB4MjMsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwNiwgMHhmOSwgMHgyNCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDA3LCAweGY4LCAweDI1LCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MDgsIDB4ZjcsIDB4MjYsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwOSwgMHhmNiwgMHg0ZCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDBhLCAweGY1LCAweDRlLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MTQsIDB4ZWIsIDB4NGYsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgxZSwgMHhlMSwgMHg1MCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDE3LCAweGU4LCAweDUyLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MWYsIDB4ZTAsIDB4NTEsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwZSwgMHhmMSwgMHgwYiwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDIwLCAweGRmLCAweDBjLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4NDIsIDB4YmQsIDB4MGQsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgwYiwgMHhmNCwgMHgwZSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDQzLCAweGJjLCAweDBmLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MTAsIDB4ZWYsIDB4MTAsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgyMSwgMHhkZSwgMHgxMSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDEzLCAweGVjLCAweDEyLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MTEsIDB4ZWUsIDB4MTMsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgxMiwgMHhlZCwgMHgxNCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDE5LCAweGU2LCAweDE1LCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MWEsIDB4ZTUsIDB4MTYsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgxYiwgMHhlNCwgMHgxNywgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDRiLCAweGI0LCAweDE4LCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4NDAsIDB4YmYsIDB4MTksIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHg0NCwgMHhiYiwgMHgxYSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDQxLCAweGJlLCAweDFiLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MjIsIDB4ZGQsIDB4MWMsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgxNSwgMHhlYSwgMHgxZCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDBmLCAweGYwLCAweDNmLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4MWMsIDB4ZTMsIDB4NDAsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHg0YSwgMHhiNSwgMHg0MSwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDQ4LCAweGI3LCAweDQyLCAweDA3LCAweDAwLAorCTB4ODYsIDB4NmIsIDB4NDksIDB4YjYsIDB4NDMsIDB4MDcsIDB4MDAsCisJMHg4NiwgMHg2YiwgMHgxOCwgMHhlNywgMHg0NCwgMHgwNywgMHgwMCwKKwkweDg2LCAweDZiLCAweDIzLCAweGRjLCAweDQ1LCAweDA3LCAweDAwLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwppbmRleCAyZjQwOGQyLi5jNzg2MzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKQEAgLTQxLDYgKzQxLDkgQEAKIHN0YXRpYyBpbnQgZHZiX3VzYl9hbnlzZWVfZGVidWc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGR2Yl91c2JfYW55c2VlX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwiIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKK2ludCBkdmJfdXNiX2FueXNlZV9kZWxzeXM7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVsc3lzLCBkdmJfdXNiX2FueXNlZV9kZWxzeXMsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbHN5cywgInNlbGVjdCBkZWxpdmVyeSBtb2RlICgwPURWQi1DLCAxPURWQi1UKSIpOwogRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CiAKIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggYW55c2VlX3VzYl9tdXRleDsKQEAgLTE3OCwxNCArMTgxLDE0IEBACiAJCQlpbmMgPSAxOwogCQl9CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CiAKIAkJaSArPSBpbmM7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwogCi0JcmV0dXJuIGk7CisJcmV0dXJuIHJldCA/IHJldCA6IGk7CiB9CiAKIHN0YXRpYyB1MzIgYW55c2VlX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKQEAgLTI3Miw5ICsyNzUsMTEgQEAKIAkgICAgICBtb2RlbCAgICAgIGRlbW9kICAgICBodyAgZmlybXdhcmUKIAkgICAxLiBFMzAgICAgICAgIE1UMzUyICAgICAwMiAgMC4yLjEKIAkgICAyLiBFMzAgICAgICAgIFpMMTAzNTMgICAwMiAgMC4yLjEKLQkgICAzLiBFMzAgUGx1cyAgIFpMMTAzNTMgICAwNiAgMC4xLjAKLQkgICA0LiBFMzBDIFBsdXMgIFREQTEwMDIzICAwYSAgMC4xLjAgICAgcmV2IDAuMgotCSAgIDQuIEUzMEMgUGx1cyAgVERBMTAwMjMgIDBmICAwLjEuMiAgICByZXYgMC40CisJICAgMy4gRTMwIENvbWJvICBaTDEwMzUzICAgMGYgIDAuMS4yICAgIERWQi1UL0MgY29tYm8KKwkgICA0LiBFMzAgUGx1cyAgIFpMMTAzNTMgICAwNiAgMC4xLjAKKwkgICA1LiBFMzBDIFBsdXMgIFREQTEwMDIzICAwYSAgMC4xLjAgICAgcmV2IDAuMgorCSAgICAgIEUzMEMgUGx1cyAgVERBMTAwMjMgIDBmICAwLjEuMiAgICByZXYgMC40CisJICAgICAgRTMwIENvbWJvICBUREExMDAyMyAgMGYgIDAuMS4yICAgIERWQi1UL0MgY29tYm8KIAkqLwogCiAJLyogWmFybGluayBNVDM1MiBEVkItVCBkZW1vZCBpbnNpZGUgb2YgU2Ftc3VuZyBETk9TNDA0WkgxMDJBIE5JTSAqLwpAQCAtMjkzLDYgKzI5OCwyMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBmb3IgRTMwIENvbWJvIFBsdXMgRFZCLVQgZGVtb2R1bGF0b3IgKi8KKwlpZiAoZHZiX3VzYl9hbnlzZWVfZGVsc3lzKSB7CisJCXJldCA9IGFueXNlZV93cml0ZV9yZWcoYWRhcC0+ZGV2LCAweGIwLCAweDAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogWmFybGluayBaTDEwMzUzIERWQi1UIGRlbW9kICovCisJCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmFueXNlZV96bDEwMzUzX2NvbmZpZywKKwkJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJCWlmIChhZGFwLT5mZSAhPSBOVUxMKSB7CisJCQlzdGF0ZS0+dHVuZXIgPSBEVkJfUExMX1NBTVNVTkdfRFRPUzQwM0lIMTAyQTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCiAJLyogY29ubmVjdCBkZW1vZCBvbiBJTyBwb3J0IEQgZm9yIFREQTEwMDIzICYgWkwxMDM1MyAqLwogCXJldCA9IGFueXNlZV93cml0ZV9yZWcoYWRhcC0+ZGV2LCAweGIwLCAweDI1KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzlmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBUZXJyYVRlYyBDaW5lcmd5IFQyL3FhbnUgVVNCMiBEVkItVCBhZGFwdGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUb21pIE9yYXZhICh0b21pbW9AbmNpcmNsZS5udWxsbmV0LmZpKQorICoKKyAqIEJhc2VkIG9uIHRoZSBkdmItdXNiLWZyYW1ld29yayBjb2RlIGFuZCB0aGUKKyAqIG9yaWdpbmFsIFRlcnJhdGVjIENpbmVyZ3kgVDIgZHJpdmVyIGJ5OgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBEYW5pZWwgTWFjayA8ZGFuaWVsQHFhbnUuZGU+IGFuZAorICoJCSAgICBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAcWFudS5kZT4KKyAqCisgKiAgUHJvdG9jb2wgU3BlYyBwdWJsaXNoZWQgb24gaHR0cDovL3FhbnUuZGUvc3BlY3MvdGVycmF0ZWNfY2luZXJneVQyLnBkZgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY2luZXJneVQyLmgiCisKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX2NpbmVyZ3l0Ml9kZWJ1ZzsKK2ludCBkaXNhYmxlX3JlbW90ZTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX2NpbmVyZ3l0Ml9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8sIHhmZXI9MiwgcmM9NCAiCisJCSIob3ItYWJsZSkpLiIpOworCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKworc3RydWN0IGNpbmVyZ3l0Ml9zdGF0ZSB7CisJdTggcmNfY291bnRlcjsKK307CisKKy8qIFdlIGFyZSBtaXNzaW5nIGEgcmVsZWFzZSBob29rIHdpdGggdXNiX2RldmljZSBkYXRhICovCitzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmNpbmVyZ3l0Ml91c2JfZGV2aWNlOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgY2luZXJneXQyX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgY2luZXJneXQyX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCBlbmFibGUpCit7CisJY2hhciBidWZbXSA9IHsgQ0lORVJHWVQyX0VQMV9DT05UUk9MX1NUUkVBTV9UUkFOU0ZFUiwgZW5hYmxlID8gMSA6IDAgfTsKKwljaGFyIHJlc3VsdFs2NF07CisJcmV0dXJuIGR2Yl91c2JfZ2VuZXJpY19ydyhhZGFwLT5kZXYsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIHJlc3VsdCwKKwkJCQlzaXplb2YocmVzdWx0KSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgY2luZXJneXQyX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgZW5hYmxlKQoreworCWNoYXIgYnVmW10gPSB7IENJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERSwgZW5hYmxlID8gMCA6IDEgfTsKKwljaGFyIHN0YXRlWzNdOworCXJldHVybiBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYnVmLCBzaXplb2YoYnVmKSwgc3RhdGUsIHNpemVvZihzdGF0ZSksIDApOworfQorCitzdGF0aWMgaW50IGNpbmVyZ3l0Ml9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwljaGFyIHF1ZXJ5W10gPSB7IENJTkVSR1lUMl9FUDFfR0VUX0ZJUk1XQVJFX1ZFUlNJT04gfTsKKwljaGFyIHN0YXRlWzNdOworCWludCByZXQ7CisKKwlhZGFwLT5mZSA9IGNpbmVyZ3l0Ml9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKKworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhhZGFwLT5kZXYsIHF1ZXJ5LCBzaXplb2YocXVlcnkpLCBzdGF0ZSwKKwkJCQlzaXplb2Yoc3RhdGUpLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZWJfcmMoImNpbmVyZ3l0Ml9wb3dlcl9jdHJsKCkgRmFpbGVkIHRvIHJldHJpZXZlIHNsZWVwICIKKwkJCSJzdGF0ZSBpbmZvXG4iKTsKKwl9CisKKwkvKiBDb3B5IHRoaXMgcG9pbnRlciBhcyB3ZSBhcmUgZ29ubmEgbmVlZCBpdCBpbiB0aGUgcmVsZWFzZSBwaGFzZSAqLworCWNpbmVyZ3l0Ml91c2JfZGV2aWNlID0gYWRhcC0+ZGV2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgY2luZXJneXQyX3JjX2tleXNbXSA9IHsKKwl7IDB4MDQsCTB4MDEsCUtFWV9QT1dFUiB9LAorCXsgMHgwNCwJMHgwMiwJS0VZXzEgfSwKKwl7IDB4MDQsCTB4MDMsCUtFWV8yIH0sCisJeyAweDA0LAkweDA0LAlLRVlfMyB9LAorCXsgMHgwNCwJMHgwNSwJS0VZXzQgfSwKKwl7IDB4MDQsCTB4MDYsCUtFWV81IH0sCisJeyAweDA0LAkweDA3LAlLRVlfNiB9LAorCXsgMHgwNCwJMHgwOCwJS0VZXzcgfSwKKwl7IDB4MDQsCTB4MDksCUtFWV84IH0sCisJeyAweDA0LAkweDBhLAlLRVlfOSB9LAorCXsgMHgwNCwJMHgwYywJS0VZXzAgfSwKKwl7IDB4MDQsCTB4MGIsCUtFWV9WSURFTyB9LAorCXsgMHgwNCwJMHgwZCwJS0VZX1JFRlJFU0ggfSwKKwl7IDB4MDQsCTB4MGUsCUtFWV9TRUxFQ1QgfSwKKwl7IDB4MDQsCTB4MGYsCUtFWV9FUEcgfSwKKwl7IDB4MDQsCTB4MTAsCUtFWV9VUCB9LAorCXsgMHgwNCwJMHgxNCwJS0VZX0RPV04gfSwKKwl7IDB4MDQsCTB4MTEsCUtFWV9MRUZUIH0sCisJeyAweDA0LAkweDEzLAlLRVlfUklHSFQgfSwKKwl7IDB4MDQsCTB4MTIsCUtFWV9PSyB9LAorCXsgMHgwNCwJMHgxNSwJS0VZX1RFWFQgfSwKKwl7IDB4MDQsCTB4MTYsCUtFWV9JTkZPIH0sCisJeyAweDA0LAkweDE3LAlLRVlfUkVEIH0sCisJeyAweDA0LAkweDE4LAlLRVlfR1JFRU4gfSwKKwl7IDB4MDQsCTB4MTksCUtFWV9ZRUxMT1cgfSwKKwl7IDB4MDQsCTB4MWEsCUtFWV9CTFVFIH0sCisJeyAweDA0LAkweDFjLAlLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDQsCTB4MWUsCUtFWV9WT0xVTUVET1dOIH0sCisJeyAweDA0LAkweDFkLAlLRVlfTVVURSB9LAorCXsgMHgwNCwJMHgxYiwJS0VZX0NIQU5ORUxVUCB9LAorCXsgMHgwNCwJMHgxZiwJS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDA0LAkweDQwLAlLRVlfUEFVU0UgfSwKKwl7IDB4MDQsCTB4NGMsCUtFWV9QTEFZIH0sCisJeyAweDA0LAkweDU4LAlLRVlfUkVDT1JEIH0sCisJeyAweDA0LAkweDU0LAlLRVlfUFJFVklPVVMgfSwKKwl7IDB4MDQsCTB4NDgsCUtFWV9TVE9QIH0sCisJeyAweDA0LAkweDVjLAlLRVlfTkVYVCB9Cit9OworCisvKiBOdW1iZXIgb2Yga2V5cHJlc3NlcyB0byBpZ25vcmUgYmVmb3JlIGRldGVjdCByZXBlYXRpbmcgKi8KKyNkZWZpbmUgUkNfUkVQRUFUX0RFTEFZIDMKKworc3RhdGljIGludCByZXBlYXRhYmxlX2tleXNbXSA9IHsKKwlLRVlfVVAsCisJS0VZX0RPV04sCisJS0VZX0xFRlQsCisJS0VZX1JJR0hULAorCUtFWV9WT0xVTUVVUCwKKwlLRVlfVk9MVU1FRE9XTiwKKwlLRVlfQ0hBTk5FTFVQLAorCUtFWV9DSEFOTkVMRE9XTgorfTsKKworc3RhdGljIGludCBjaW5lcmd5dDJfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXN0cnVjdCBjaW5lcmd5dDJfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwl1OCBrZXlbNV0gPSB7MCwgMCwgMCwgMCwgMH0sIGNtZCA9IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUzsKKwlpbnQgaTsKKworCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKKworCWR2Yl91c2JfZ2VuZXJpY19ydyhkLCAmY21kLCAxLCBrZXksIHNpemVvZihrZXkpLCAwKTsKKwlpZiAoa2V5WzRdID09IDB4ZmYpIHsKKwkJLyoga2V5IHJlcGVhdCAqLworCQlzdC0+cmNfY291bnRlcisrOworCQlpZiAoc3QtPnJjX2NvdW50ZXIgPiBSQ19SRVBFQVRfREVMQVkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlcGVhdGFibGVfa2V5cyk7IGkrKykgeworCQkJCWlmIChkLT5sYXN0X2V2ZW50ID09IHJlcGVhdGFibGVfa2V5c1tpXSkgeworCQkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1JFUEVBVDsKKwkJCQkJKmV2ZW50ID0gZC0+bGFzdF9ldmVudDsKKwkJCQkJZGViX3JjKCJyZXBlYXQga2V5LCBldmVudCAleFxuIiwKKwkJCQkJCSAgICpldmVudCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCWRlYl9yYygicmVwZWF0ZWQga2V5IChub24gcmVwZWF0YWJsZSlcbiIpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIGhhY2sgdG8gcGFzcyBjaGVja3N1bSBvbiB0aGUgY3VzdG9tIGZpZWxkICovCisJa2V5WzJdID0gfmtleVsxXTsKKwlkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQoZCwga2V5LCBldmVudCwgc3RhdGUpOworCWlmIChrZXlbMF0gIT0gMCkgeworCQlpZiAoKmV2ZW50ICE9IGQtPmxhc3RfZXZlbnQpCisJCQlzdC0+cmNfY291bnRlciA9IDA7CisKKwkJZGViX3JjKCJrZXk6ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkgICAgICAga2V5WzBdLCBrZXlbMV0sIGtleVsyXSwga2V5WzNdLCBrZXlbNF0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcmd5dDJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmY2luZXJneXQyX3Byb3BlcnRpZXMsCisJCQkJCVRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKTsKK30KKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY2luZXJneXQyX3VzYl90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShVU0JfVklEX1RFUlJBVEVDLCAweDAwMzgpIH0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBjaW5lcmd5dDJfdXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGNpbmVyZ3l0Ml9wcm9wZXJ0aWVzID0geworCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IGNpbmVyZ3l0Ml9zdGF0ZSksCisJLm51bV9hZGFwdGVycyA9IDEsCisJLmFkYXB0ZXIgPSB7CisJCXsKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gY2luZXJneXQyX3N0cmVhbWluZ19jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjaW5lcmd5dDJfZnJvbnRlbmRfYXR0YWNoLAorCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gNSwKKwkJCQkuZW5kcG9pbnQgPSAweDAyLAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNTEyLAorCQkJCQl9CisJCQkJfQorCQkJfSwKKwkJfQorCX0sCisKKwkucG93ZXJfY3RybCAgICAgICA9IGNpbmVyZ3l0Ml9wb3dlcl9jdHJsLAorCisJLnJjX2ludGVydmFsICAgICAgPSA1MCwKKwkucmNfa2V5X21hcCAgICAgICA9IGNpbmVyZ3l0Ml9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShjaW5lcmd5dDJfcmNfa2V5cyksCisJLnJjX3F1ZXJ5ICAgICAgICAgPSBjaW5lcmd5dDJfcmNfcXVlcnksCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAxLAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7IC5uYW1lID0gIlRlcnJhVGVjL3FhbnUgVVNCMi4wIEhpZ2hzcGVlZCBEVkItVCBSZWNlaXZlciIsCisJCSAgLmNvbGRfaWRzID0ge05VTEx9LAorCQkgIC53YXJtX2lkcyA9IHsgJmNpbmVyZ3l0Ml91c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJfSwKKwkJeyBOVUxMIH0sCisJfQorfTsKKworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY2luZXJneXQyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY2luZXJneVQyIiwKKwkucHJvYmUJCT0gY2luZXJneXQyX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlCT0gY2luZXJneXQyX3VzYl90YWJsZQorfTsKKworc3RhdGljIGludCBfX2luaXQgY2luZXJneXQyX3VzYl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHVzYl9yZWdpc3RlcigmY2luZXJneXQyX2RyaXZlcik7CisJaWYgKGVycikgeworCQllcnIoInVzYl9yZWdpc3RlcigpIGZhaWxlZCEgKGVyciAlaSlcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2luZXJneXQyX3VzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmNpbmVyZ3l0Ml9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjaW5lcmd5dDJfdXNiX2luaXQpOworbW9kdWxlX2V4aXQoY2luZXJneXQyX3VzYl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZXJyYXRlYyBDaW5lcmd5IFQyIERWQi1UIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVG9taSBPcmF2YSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5ZjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWZlLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBUZXJyYVRlYyBDaW5lcmd5IFQyL3FhbnUgVVNCMiBEVkItVCBhZGFwdGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUb21pIE9yYXZhICh0b21pbW9AbmNpcmNsZS5udWxsbmV0LmZpKQorICoKKyAqIEJhc2VkIG9uIHRoZSBkdmItdXNiLWZyYW1ld29yayBjb2RlIGFuZCB0aGUKKyAqIG9yaWdpbmFsIFRlcnJhdGVjIENpbmVyZ3kgVDIgZHJpdmVyIGJ5OgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBEYW5pZWwgTWFjayA8ZGFuaWVsQHFhbnUuZGU+IGFuZAorICogICAgICAgICAgICAgICAgICBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAcWFudS5kZT4KKyAqCisgKiAgUHJvdG9jb2wgU3BlYyBwdWJsaXNoZWQgb24gaHR0cDovL3FhbnUuZGUvc3BlY3MvdGVycmF0ZWNfY2luZXJneVQyLnBkZgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY2luZXJneVQyLmgiCisKKworLyoqCisgKiAgY29udmVydCBsaW51eC1kdmIgZnJvbnRlbmQgcGFyYW1ldGVyIHNldCBpbnRvIFRQUy4KKyAqICBTZWUgRVRTSSBFVFMtMzAwNzQ0LCBzZWN0aW9uIDQuNi4yLCB0YWJsZSA5IGZvciBkZXRhaWxzLgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHJldXNhYmxlIGFuZCBtYXkgYmV0dGVyIGdldCBwbGFjZWQgaW4gYSBzdXBwb3J0CisgKiAgbGlicmFyeS4KKyAqCisgKiAgV2UgcmVwbGFjZSBlcnJvcm5vdXMgZmllbGRzIGJ5IGRlZmF1bHQgVFBTIGZpZWxkcyAodGhlIG9uZXMgd2l0aCB2YWx1ZSAwKS4KKyAqLworCitzdGF0aWMgdWludDE2X3QgY29tcHV0ZV90cHMoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpvcCA9ICZwLT51Lm9mZG07CisJdWludDE2X3QgdHBzID0gMDsKKworCXN3aXRjaCAob3AtPmNvZGVfcmF0ZV9IUCkgeworCWNhc2UgRkVDXzJfMzoKKwkJdHBzIHw9ICgxIDw8IDcpOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCXRwcyB8PSAoMiA8PCA3KTsKKwkJYnJlYWs7CisJY2FzZSBGRUNfNV82OgorCQl0cHMgfD0gKDMgPDwgNyk7CisJCWJyZWFrOworCWNhc2UgRkVDXzdfODoKKwkJdHBzIHw9ICg0IDw8IDcpOworCQlicmVhazsKKwljYXNlIEZFQ18xXzI6CisJY2FzZSBGRUNfQVVUTzoKKwlkZWZhdWx0OgorCQkvKiB0cHMgfD0gKDAgPDwgNykgKi87CisJfQorCisJc3dpdGNoIChvcC0+Y29kZV9yYXRlX0xQKSB7CisJY2FzZSBGRUNfMl8zOgorCQl0cHMgfD0gKDEgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgRkVDXzNfNDoKKwkJdHBzIHw9ICgyIDw8IDQpOworCQlicmVhazsKKwljYXNlIEZFQ181XzY6CisJCXRwcyB8PSAoMyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSBGRUNfN184OgorCQl0cHMgfD0gKDQgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgRkVDXzFfMjoKKwljYXNlIEZFQ19BVVRPOgorCWRlZmF1bHQ6CisJCS8qIHRwcyB8PSAoMCA8PCA0KSAqLzsKKwl9CisKKwlzd2l0Y2ggKG9wLT5jb25zdGVsbGF0aW9uKSB7CisJY2FzZSBRQU1fMTY6CisJCXRwcyB8PSAoMSA8PCAxMyk7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQl0cHMgfD0gKDIgPDwgMTMpOworCQlicmVhazsKKwljYXNlIFFQU0s6CisJZGVmYXVsdDoKKwkJLyogdHBzIHw9ICgwIDw8IDEzKSAqLzsKKwl9CisKKwlzd2l0Y2ggKG9wLT50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfOEs6CisJCXRwcyB8PSAoMSA8PCAwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV8ySzoKKwlkZWZhdWx0OgorCQkvKiB0cHMgfD0gKDAgPDwgMCkgKi87CisJfQorCisJc3dpdGNoIChvcC0+Z3VhcmRfaW50ZXJ2YWwpIHsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMTY6CisJCXRwcyB8PSAoMSA8PCAyKTsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CisJCXRwcyB8PSAoMiA8PCAyKTsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzQ6CisJCXRwcyB8PSAoMyA8PCAyKTsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzMyOgorCWRlZmF1bHQ6CisJCS8qIHRwcyB8PSAoMCA8PCAyKSAqLzsKKwl9CisKKwlzd2l0Y2ggKG9wLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKKwljYXNlIEhJRVJBUkNIWV8xOgorCQl0cHMgfD0gKDEgPDwgMTApOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV8yOgorCQl0cHMgfD0gKDIgPDwgMTApOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV80OgorCQl0cHMgfD0gKDMgPDwgMTApOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV9OT05FOgorCWRlZmF1bHQ6CisJCS8qIHRwcyB8PSAoMCA8PCAxMCkgKi87CisJfQorCisJcmV0dXJuIHRwczsKK30KKworc3RydWN0IGNpbmVyZ3l0Ml9mZV9zdGF0ZSB7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7Cit9OworCitzdGF0aWMgaW50IGNpbmVyZ3l0Ml9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgY2luZXJneXQyX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHJlc3VsdDsKKwl1OCBjbWRbXSA9IHsgQ0lORVJHWVQyX0VQMV9HRVRfVFVORVJfU1RBVFVTIH07CisJaW50IHJldDsKKworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhzdGF0ZS0+ZCwgY21kLCBzaXplb2YoY21kKSwgKHU4ICopJnJlc3VsdCwKKwkJCXNpemVvZihyZXN1bHQpLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSpzdGF0dXMgPSAwOworCisJaWYgKDB4ZmZmZiAtIGxlMTZfdG9fY3B1KHJlc3VsdC5nYWluKSA+IDMwKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJaWYgKHJlc3VsdC5sb2NrX2JpdHMgJiAoMSA8PCA2KSkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwlpZiAocmVzdWx0LmxvY2tfYml0cyAmICgxIDw8IDUpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCWlmIChyZXN1bHQubG9ja19iaXRzICYgKDEgPDwgNCkpCisJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJaWYgKHJlc3VsdC5sb2NrX2JpdHMgJiAoMSA8PCAxKSkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKworCWlmICgoKnN0YXR1cyAmIChGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMpKSAhPQorCQkJKEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU1lOQykpCisJCSpzdGF0dXMgJj0gfkZFX0hBU19MT0NLOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luZXJneXQyX2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgY2luZXJneXQyX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHN0YXR1czsKKwljaGFyIGNtZFtdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMgfTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCBjbWQsIHNpemVvZihjbWQpLCAoY2hhciAqKSZzdGF0dXMsCisJCQkJc2l6ZW9mKHN0YXR1cyksIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmJlciA9IGxlMzJfdG9fY3B1KHN0YXR1cy52aXRlcmJpX2Vycm9yX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmVyZ3l0Ml9mZV9yZWFkX3VuY19ibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdW5jKQoreworCXN0cnVjdCBjaW5lcmd5dDJfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgc3RhdHVzOworCXU4IGNtZFtdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMgfTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCBjbWQsIHNpemVvZihjbWQpLCAodTggKikmc3RhdHVzLAorCQkJCXNpemVvZihzdGF0dXMpLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoImNpbmVyZ3l0Ml9mZV9yZWFkX3VuY19ibG9ja3MoKSBGYWlsZWQhIChFcnJvcj0lZClcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkqdW5jID0gbGUzMl90b19jcHUoc3RhdHVzLnVuY29ycmVjdGVkX2Jsb2NrX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcmd5dDJfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQl1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBjaW5lcmd5dDJfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgc3RhdHVzOworCWNoYXIgY21kW10gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1RVTkVSX1NUQVRVUyB9OworCWludCByZXQ7CisKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsIGNtZCwgc2l6ZW9mKGNtZCksIChjaGFyICopJnN0YXR1cywKKwkJCQlzaXplb2Yoc3RhdHVzKSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJjaW5lcmd5dDJfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoKSBGYWlsZWQhIgorCQkJIiAoRXJyb3I9JWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkqc3RyZW5ndGggPSAoMHhmZmZmIC0gbGUxNl90b19jcHUoc3RhdHVzLmdhaW4pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcmd5dDJfZmVfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCXN0cnVjdCBjaW5lcmd5dDJfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR2YnRfZ2V0X3N0YXR1c19tc2cgc3RhdHVzOworCWNoYXIgY21kW10gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1RVTkVSX1NUQVRVUyB9OworCWludCByZXQ7CisKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsIGNtZCwgc2l6ZW9mKGNtZCksIChjaGFyICopJnN0YXR1cywKKwkJCQlzaXplb2Yoc3RhdHVzKSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJjaW5lcmd5dDJfZmVfcmVhZF9zbnIoKSBGYWlsZWQhIChFcnJvcj0lZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCSpzbnIgPSAoc3RhdHVzLnNuciA8PCA4KSB8IHN0YXR1cy5zbnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luZXJneXQyX2ZlX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2luZXJneXQyX2ZlX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWRlYl9pbmZvKCJjaW5lcmd5dDJfZmVfc2xlZXAoKSBDYWxsZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmVyZ3l0Ml9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gODAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpbmVyZ3l0Ml9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgY2luZXJneXQyX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdmJ0X3NldF9wYXJhbWV0ZXJzX21zZyBwYXJhbTsKKwljaGFyIHJlc3VsdFsyXTsKKwlpbnQgZXJyOworCisJcGFyYW0uY21kID0gQ0lORVJHWVQyX0VQMV9TRVRfVFVORVJfUEFSQU1FVEVSUzsKKwlwYXJhbS50cHMgPSBjcHVfdG9fbGUxNihjb21wdXRlX3RwcyhmZXApKTsKKwlwYXJhbS5mcmVxID0gY3B1X3RvX2xlMzIoZmVwLT5mcmVxdWVuY3kgLyAxMDAwKTsKKwlwYXJhbS5iYW5kd2lkdGggPSA4IC0gZmVwLT51Lm9mZG0uYmFuZHdpZHRoIC0gQkFORFdJRFRIXzhfTUhaOworCisJZXJyID0gZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLAorCQkJKGNoYXIgKikmcGFyYW0sIHNpemVvZihwYXJhbSksCisJCQlyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZXJyKCJjaW5lcmd5dDJfZmVfc2V0X2Zyb250ZW5kKCkgRmFpbGVkISBlcnI9JWRcbiIsIGVycik7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCBjaW5lcmd5dDJfZmVfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9mZV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBjaW5lcmd5dDJfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaWYgKHN0YXRlICE9IE5VTEwpCisJCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGNpbmVyZ3l0Ml9mZV9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmNpbmVyZ3l0Ml9mZV9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXN0cnVjdCBjaW5lcmd5dDJfZmVfc3RhdGUgKnMgPSBremFsbG9jKHNpemVvZigKKwkJCQkJc3RydWN0IGNpbmVyZ3l0Ml9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcy0+ZCA9IGQ7CisJbWVtY3B5KCZzLT5mZS5vcHMsICZjaW5lcmd5dDJfZmVfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzLT5mZS5kZW1vZHVsYXRvcl9wcml2ID0gczsKKwlyZXR1cm4gJnMtPmZlOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjaW5lcmd5dDJfZmVfb3BzID0geworCS5pbmZvID0geworCQkubmFtZQkJCT0gRFJJVkVSX05BTUUsCisJCS50eXBlCQkJPSBGRV9PRkRNLAorCQkuZnJlcXVlbmN5X21pbgkJPSAxNzQwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4CQk9IDg2MjAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDE2NjY2NywKKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfCBGRV9DQU5fRkVDXzFfMgorCQkJfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180CisJCQl8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzgKKwkJCXwgRkVfQ0FOX0ZFQ19BVVRPIHwgRkVfQ0FOX1FQU0sKKwkJCXwgRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQKKwkJCXwgRkVfQ0FOX1FBTV9BVVRPCisJCQl8IEZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPCisJCQl8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPCisJCQl8IEZFX0NBTl9ISUVSQVJDSFlfQVVUTworCQkJfCBGRV9DQU5fUkVDT1ZFUgorCQkJfCBGRV9DQU5fTVVURV9UUworCX0sCisKKwkucmVsZWFzZQkJPSBjaW5lcmd5dDJfZmVfcmVsZWFzZSwKKworCS5pbml0CQkJPSBjaW5lcmd5dDJfZmVfaW5pdCwKKwkuc2xlZXAJCQk9IGNpbmVyZ3l0Ml9mZV9zbGVlcCwKKworCS5zZXRfZnJvbnRlbmQJCT0gY2luZXJneXQyX2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kCQk9IGNpbmVyZ3l0Ml9mZV9nZXRfZnJvbnRlbmQsCisJLmdldF90dW5lX3NldHRpbmdzCT0gY2luZXJneXQyX2ZlX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzCQk9IGNpbmVyZ3l0Ml9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIJCT0gY2luZXJneXQyX2ZlX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aAk9IGNpbmVyZ3l0Ml9mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIJCT0gY2luZXJneXQyX2ZlX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzCQk9IGNpbmVyZ3l0Ml9mZV9yZWFkX3VuY19ibG9ja3MsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNzllYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFRlcnJhVGVjIENpbmVyZ3kgVDIvcWFudSBVU0IyIERWQi1UIGFkYXB0ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRvbWkgT3JhdmEgKHRvbWltb0BuY2lyY2xlLm51bGxuZXQuZmkpCisgKgorICogQmFzZWQgb24gdGhlIGR2Yi11c2ItZnJhbWV3b3JrIGNvZGUgYW5kIHRoZQorICogb3JpZ2luYWwgVGVycmF0ZWMgQ2luZXJneSBUMiBkcml2ZXIgYnk6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IERhbmllbCBNYWNrIDxkYW5pZWxAcWFudS5kZT4gYW5kCisgKiAgICAgICAgICAgICAgICAgIEhvbGdlciBXYWVjaHRsZXIgPGhvbGdlckBxYW51LmRlPgorICoKKyAqICBQcm90b2NvbCBTcGVjIHB1Ymxpc2hlZCBvbiBodHRwOi8vcWFudS5kZS9zcGVjcy90ZXJyYXRlY19jaW5lcmd5VDIucGRmCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCAgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCAgSW5jLiwgIDY3NSBNYXNzIEF2ZSwgIENhbWJyaWRnZSwgIE1BIDAyMTM5LCAgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJfVVNCX0NJTkVSR1lUMl9IXworI2RlZmluZSBfRFZCX1VTQl9DSU5FUkdZVDJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgorCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiY2luZXJneVQyIgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiVGVycmFUZWMvcWFudSBVU0IyLjAgSGlnaHNwZWVkIERWQi1UIFJlY2VpdmVyIgorCitleHRlcm4gaW50IGR2Yl91c2JfY2luZXJneXQyX2RlYnVnOworCisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMDEsIGFyZ3MpCisjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMDIsIGFyZ3MpCisjZGVmaW5lIGRlYl9wbGwoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMDQsIGFyZ3MpCisjZGVmaW5lIGRlYl90cyhhcmdzLi4uKSAgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMDgsIGFyZ3MpCisjZGVmaW5lIGRlYl9lcnIoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMTAsIGFyZ3MpCisjZGVmaW5lIGRlYl9yYyhhcmdzLi4uKSAgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwMjAsIGFyZ3MpCisjZGVmaW5lIGRlYl9mdyhhcmdzLi4uKSAgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwNDAsIGFyZ3MpCisjZGVmaW5lIGRlYl9tZW0oYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgwODAsIGFyZ3MpCisjZGVmaW5lIGRlYl91eGZlcihhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfY2luZXJneXQyX2RlYnVnLCAgMHgxMDAsIGFyZ3MpCisKKworCitlbnVtIGNpbmVyZ3l0Ml9lcDFfY21kIHsKKwlDSU5FUkdZVDJfRVAxX1BJRF9UQUJMRV9SRVNFVAkJPSAweDAxLAorCUNJTkVSR1lUMl9FUDFfUElEX1NFVFVQCQkJPSAweDAyLAorCUNJTkVSR1lUMl9FUDFfQ09OVFJPTF9TVFJFQU1fVFJBTlNGRVIJPSAweDAzLAorCUNJTkVSR1lUMl9FUDFfU0VUX1RVTkVSX1BBUkFNRVRFUlMJPSAweDA0LAorCUNJTkVSR1lUMl9FUDFfR0VUX1RVTkVSX1NUQVRVUwkJPSAweDA1LAorCUNJTkVSR1lUMl9FUDFfU1RBUlRfU0NBTgkJPSAweDA2LAorCUNJTkVSR1lUMl9FUDFfQ09OVElOVUVfU0NBTgkJPSAweDA3LAorCUNJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUwkJPSAweDA4LAorCUNJTkVSR1lUMl9FUDFfU0xFRVBfTU9ERQkJPSAweDA5LAorCUNJTkVSR1lUMl9FUDFfR0VUX0ZJUk1XQVJFX1ZFUlNJT04JPSAweDBBCit9OworCisKK3N0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHsKKwl1aW50MzJfdCBmcmVxOworCXVpbnQ4X3QgYmFuZHdpZHRoOworCXVpbnQxNl90IHRwczsKKwl1aW50OF90IGZsYWdzOworCXVpbnQxNl90IGdhaW47CisJdWludDhfdCBzbnI7CisJdWludDMyX3Qgdml0ZXJiaV9lcnJvcl9yYXRlOworCXVpbnQzMl90IHJzX2Vycm9yX3JhdGU7CisJdWludDMyX3QgdW5jb3JyZWN0ZWRfYmxvY2tfY291bnQ7CisJdWludDhfdCBsb2NrX2JpdHM7CisJdWludDhfdCBwcmV2X2xvY2tfYml0czsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHsKKwl1aW50OF90IGNtZDsKKwl1aW50MzJfdCBmcmVxOworCXVpbnQ4X3QgYmFuZHdpZHRoOworCXVpbnQxNl90IHRwczsKKwl1aW50OF90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqY2luZXJneXQyX2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOworCisjZW5kaWYgLyogX0RWQl9VU0JfQ0lORVJHWVQyX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCA1NjM0MDAyLi40MDZkN2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0zNiw2ICszNiw5IEBACiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAjaW5jbHVkZSAidHVuZXItc2ltcGxlLmgiCiAjaW5jbHVkZSAibXhsNTAwNXMuaCIKKyNpbmNsdWRlICJkaWI3MDAwcC5oIgorI2luY2x1ZGUgImRpYjAwNzAuaCIKKyNpbmNsdWRlICJsZ3M4Z2w1LmgiCiAKIC8qIGRlYnVnICovCiBzdGF0aWMgaW50IGR2Yl91c2JfY3h1c2JfZGVidWc7CkBAIC0xMDksNiArMTEyLDI1IEBACiAJY3h1c2JfYmx1ZWJpcmRfZ3Bpb19ydyhkLCAweDQwLCBvbm9mZiA/IDAgOiAweDQwKTsKIH0KIAorc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl9ncGlvX3R1bmVyKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwKKwkJdTggYWRkciwgaW50IG9ub2ZmKQoreworCXU4ICBvWzJdID0ge2FkZHIsIG9ub2ZmfTsKKwl1OCAgaTsKKwlpbnQgcmM7CisKKwlyYyA9IGN4dXNiX2N0cmxfbXNnKGQsIENNRF9HUElPX1dSSVRFLCBvLCAyLCAmaSwgMSk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJaWYgKGkgPT0gMHgwMSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWRlYl9pbmZvKCJncGlvX3dyaXRlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKIC8qIEkyQyAqLwogc3RhdGljIGludCBjeHVzYl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLAogCQkJICBpbnQgbnVtKQpAQCAtMjYyLDYgKzI4NCwyMCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCWludCByZXQ7CisJdTggIGI7CisJcmV0ID0gY3h1c2JfcG93ZXJfY3RybChkLCBvbm9mZik7CisJaWYgKCFvbm9mZikKKwkJcmV0dXJuIHJldDsKKworCW1zbGVlcCgxMjgpOworCWN4dXNiX2N0cmxfbXNnKGQsIENNRF9ESUdJVEFMLCBOVUxMLCAwLCAmYiwgMSk7CisJbXNsZWVwKDEwMCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBjeHVzYl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCiB7CiAJdTggYnVmWzJdID0geyAweDAzLCAweDAwIH07CkBAIC0yODMsNiArMzE5LDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGN4dXNiX2Q2ODBfZG1iX2RyYWluX21lc3NhZ2Uoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCAgICAgICBlcCA9IGQtPnByb3BzLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50OworCWNvbnN0IGludCB0aW1lb3V0ID0gMTAwOworCWNvbnN0IGludCBqdW5rX2xlbiA9IDMyOworCXU4ICAgICAgICAqanVuazsKKwlpbnQgICAgICAgcmRfY291bnQ7CisKKwkvKiBEaXNjYXJkIHJlbWFpbmluZyBkYXRhIGluIHZpZGVvIHBpcGUgKi8KKwlqdW5rID0ga21hbGxvYyhqdW5rX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqdW5rKQorCQlyZXR1cm47CisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzYl9idWxrX21zZyhkLT51ZGV2LAorCQkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGVwKSwKKwkJCWp1bmssIGp1bmtfbGVuLCAmcmRfY291bnQsIHRpbWVvdXQpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoIXJkX2NvdW50KQorCQkJYnJlYWs7CisJfQorCWtmcmVlKGp1bmspOworfQorCitzdGF0aWMgdm9pZCBjeHVzYl9kNjgwX2RtYl9kcmFpbl92aWRlbyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IHVzYl9kYXRhX3N0cmVhbV9wcm9wZXJ0aWVzICpwID0gJmQtPnByb3BzLmFkYXB0ZXJbMF0uc3RyZWFtOworCWNvbnN0IGludCB0aW1lb3V0ID0gMTAwOworCWNvbnN0IGludCBqdW5rX2xlbiA9IHAtPnUuYnVsay5idWZmZXJzaXplOworCXU4ICAgICAgICAqanVuazsKKwlpbnQgICAgICAgcmRfY291bnQ7CisKKwkvKiBEaXNjYXJkIHJlbWFpbmluZyBkYXRhIGluIHZpZGVvIHBpcGUgKi8KKwlqdW5rID0ga21hbGxvYyhqdW5rX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqdW5rKQorCQlyZXR1cm47CisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzYl9idWxrX21zZyhkLT51ZGV2LAorCQkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIHAtPmVuZHBvaW50KSwKKwkJCWp1bmssIGp1bmtfbGVuLCAmcmRfY291bnQsIHRpbWVvdXQpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoIXJkX2NvdW50KQorCQkJYnJlYWs7CisJfQorCWtmcmVlKGp1bmspOworfQorCitzdGF0aWMgaW50IGN4dXNiX2Q2ODBfZG1iX3N0cmVhbWluZ19jdHJsKAorCQlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJaWYgKG9ub2ZmKSB7CisJCXU4IGJ1ZlsyXSA9IHsgMHgwMywgMHgwMCB9OworCQljeHVzYl9kNjgwX2RtYl9kcmFpbl92aWRlbyhhZGFwLT5kZXYpOworCQlyZXR1cm4gY3h1c2JfY3RybF9tc2coYWRhcC0+ZGV2LCBDTURfU1RSRUFNSU5HX09OLAorCQkJYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7CisJfSBlbHNlIHsKKwkJaW50IHJldCA9IGN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwKKwkJCUNNRF9TVFJFQU1JTkdfT0ZGLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwkJcmV0dXJuIHJldDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgY3h1c2JfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQogewogCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqa2V5bWFwID0gZC0+cHJvcHMucmNfa2V5X21hcDsKQEAgLTMzNSw2ICs0MzIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsCisJCWludCAqc3RhdGUpCit7CisJc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCXU4IGlyY29kZVsyXTsKKwlpbnQgaTsKKworCSpldmVudCA9IDA7CisJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCisJaWYgKGN4dXNiX2N0cmxfbXNnKGQsIDB4MTAsIE5VTEwsIDAsIGlyY29kZSwgMikgPCAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgeworCQlpZiAoa2V5bWFwW2ldLmN1c3RvbSA9PSBpcmNvZGVbMF0gJiYKKwkJICAgIGtleW1hcFtpXS5kYXRhID09IGlyY29kZVsxXSkgeworCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OworCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGR2aWNvX21jZV9yY19rZXlzW10gPSB7CiAJeyAweGZlLCAweDAyLCBLRVlfVFYgfSwKIAl7IDB4ZmUsIDB4MGUsIEtFWV9NUDMgfSwKQEAgLTQyMiw2ICs1NDUsNDQgQEAKIAl7IDB4ZmMsIDB4MDAsIEtFWV9VTktOT1dOIH0sICAgIC8qIEhEICovCiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGQ2ODBfZG1iX3JjX2tleXNbXSA9IHsKKwl7IDB4MDAsIDB4MzgsIEtFWV9VTktOT1dOIH0sCS8qIFRWL0FWICovCisJeyAweDA4LCAweDBjLCBLRVlfWk9PTSB9LAorCXsgMHgwOCwgMHgwMCwgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MDEsIEtFWV8xIH0sCisJeyAweDA4LCAweDAyLCBLRVlfMiB9LAorCXsgMHgwMCwgMHgwMywgS0VZXzMgfSwKKwl7IDB4MDgsIDB4MDQsIEtFWV80IH0sCisJeyAweDAwLCAweDA1LCBLRVlfNSB9LAorCXsgMHgwOCwgMHgwNiwgS0VZXzYgfSwKKwl7IDB4MDAsIDB4MDcsIEtFWV83IH0sCisJeyAweDA4LCAweDA4LCBLRVlfOCB9LAorCXsgMHgwMCwgMHgwOSwgS0VZXzkgfSwKKwl7IDB4MDAsIDB4MGEsIEtFWV9NVVRFIH0sCisJeyAweDA4LCAweDI5LCBLRVlfQkFDSyB9LAorCXsgMHgwMCwgMHgxMiwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHgwOCwgMHgxMywgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDAwLCAweDJiLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MDgsIDB4MmMsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAwLCAweDIwLCBLRVlfVVAgfSwKKwl7IDB4MDgsIDB4MjEsIEtFWV9ET1dOIH0sCisJeyAweDAwLCAweDExLCBLRVlfTEVGVCB9LAorCXsgMHgwOCwgMHgxMCwgS0VZX1JJR0hUIH0sCisJeyAweDAwLCAweDBkLCBLRVlfT0sgfSwKKwl7IDB4MDgsIDB4MWYsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MDAsIDB4MTcsIEtFWV9QTEFZUEFVU0UgfSwKKwl7IDB4MDgsIDB4MTYsIEtFWV9QTEFZUEFVU0UgfSwKKwl7IDB4MDAsIDB4MGIsIEtFWV9TVE9QIH0sCisJeyAweDA4LCAweDI3LCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4MDAsIDB4MjYsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MDgsIDB4MWUsIEtFWV9VTktOT1dOIH0sICAgIC8qIFRpbWUgU2hpZnQgKi8KKwl7IDB4MDAsIDB4MGUsIEtFWV9VTktOT1dOIH0sICAgIC8qIFNuYXBzaG90ICovCisJeyAweDA4LCAweDJkLCBLRVlfVU5LTk9XTiB9LCAgICAvKiBNb3VzZSBDdXJzb3IgKi8KKwl7IDB4MDAsIDB4MGYsIEtFWV9VTktOT1dOIH0sICAgIC8qIE1pbmltaXplL01heGltaXplICovCisJeyAweDA4LCAweDE0LCBLRVlfVU5LTk9XTiB9LCAgICAvKiBTaHVmZmxlICovCisJeyAweDAwLCAweDI1LCBLRVlfUE9XRVIgfSwKK307CisKIHN0YXRpYyBpbnQgY3h1c2JfZGVlMTYwMV9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0YXRpYyB1OCBjbG9ja19jb25maWcgW10gID0geyBDTE9DS19DVEwsICAweDM4LCAweDI4IH07CkBAIC01MjcsNiArNjg4LDI0IEBACiAJLkFnY01hc3RlckJ5dGUgICA9IDB4MDAsCiB9OwogCisvKiBGSVhNRTogbmVlZHMgdHdlYWtpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgbXhsNTAwNXNfY29uZmlnIGQ2ODBfZG1iX3R1bmVyID0geworCS5pMmNfYWRkcmVzcyAgICAgPSAweDYzLAorCS5pZl9mcmVxICAgICAgICAgPSAzNjEyNTAwMFVMLAorCS54dGFsX2ZyZXEgICAgICAgPSBDUllTVEFMX0ZSRVFfMTYwMDAwMDBIWiwKKwkuYWdjX21vZGUgICAgICAgID0gTVhMX1NJTkdMRV9BR0MsCisJLnRyYWNraW5nX2ZpbHRlciA9IE1YTF9URl9DLAorCS5yc3NpX2VuYWJsZSAgICAgPSBNWExfUlNTSV9FTkFCTEUsCisJLmNhcF9zZWxlY3QgICAgICA9IE1YTF9DQVBfU0VMX0VOQUJMRSwKKwkuZGl2X291dCAgICAgICAgID0gTVhMX0RJVl9PVVRfNCwKKwkuY2xvY2tfb3V0ICAgICAgID0gTVhMX0NMT0NLX09VVF9ESVNBQkxFLAorCS5vdXRwdXRfbG9hZCAgICAgPSBNWEw1MDA1U19JRl9PVVRQVVRfTE9BRF8yMDBfT0hNLAorCS50b3AJCSA9IE1YTDUwMDVTX1RPUF8yNVAyLAorCS5tb2RfbW9kZSAgICAgICAgPSBNWExfRElHSVRBTF9NT0RFLAorCS5pZl9tb2RlICAgICAgICAgPSBNWExfWkVST19JRiwKKwkuQWdjTWFzdGVyQnl0ZSAgID0gMHgwMCwKK307CisKIC8qIENhbGxiYWNrcyBmb3IgRFZCIFVTQiAqLwogc3RhdGljIGludCBjeHVzYl9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CkBAIC01NjMsNyArNzQyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkdmljb19ibHVlYmlyZF94YzIwMjhfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tbWFuZCwgaW50IGFyZykKK3N0YXRpYyBpbnQgZHZpY29fYmx1ZWJpcmRfeGMyMDI4X2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwKKwkJCQkJICBpbnQgY29tbWFuZCwgaW50IGFyZykKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gcHRyOwogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGFkYXAtPmRldjsKQEAgLTU5MSwxNCArNzcxLDE2IEBACiAJc3RydWN0IHhjMjAyOF9jb25maWcJICBjZmcgPSB7CiAJCS5pMmNfYWRhcCAgPSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJLmkyY19hZGRyICA9IDB4NjEsCi0JCS5jYWxsYmFjayAgPSBkdmljb19ibHVlYmlyZF94YzIwMjhfY2FsbGJhY2ssCiAJfTsKIAlzdGF0aWMgc3RydWN0IHhjMjAyOF9jdHJsIGN0bCA9IHsKLQkJLmZuYW1lICAgICAgID0gInhjMzAyOC12MjcuZnciLAorCQkuZm5hbWUgICAgICAgPSBYQzIwMjhfREVGQVVMVF9GSVJNV0FSRSwKIAkJLm1heF9sZW4gICAgID0gNjQsCiAJCS5kZW1vZCAgICAgICA9IFhDMzAyOF9GRV9aQVJMSU5LNDU2LAogCX07CiAKKwkvKiBGSVhNRTogZ2VuZXJhbGl6ZSAmIG1vdmUgdG8gY29tbW9uIGFyZWEgKi8KKwlhZGFwLT5mZS0+Y2FsbGJhY2sgPSBkdmljb19ibHVlYmlyZF94YzIwMjhfY2FsbGJhY2s7CisKIAlmZSA9IGR2Yl9hdHRhY2goeGMyMDI4X2F0dGFjaCwgYWRhcC0+ZmUsICZjZmcpOwogCWlmIChmZSA9PSBOVUxMIHx8IGZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CkBAIC02MTUsNiArNzk3LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3h1c2JfZDY4MF9kbWJfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisJZmUgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmQ2ODBfZG1iX3R1bmVyKTsKKwlyZXR1cm4gKGZlID09IE5VTEwpID8gLUVJTyA6IDA7Cit9CisKIHN0YXRpYyBpbnQgY3h1c2JfY3gyMjcwMl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAl1OCBiOwpAQCAtNzI2LDYgKzkxNiwxNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgZGliNzA3MF9hZ2NfY29uZmlnID0geworCS5iYW5kX2NhcHMgPSBCQU5EX1VIRiB8IEJBTkRfVkhGIHwgQkFORF9MQkFORCB8IEJBTkRfU0JBTkQsCisKKwkvKgorCSAqIFBfYWdjX3VzZV9zZF9tb2QxPTAsIFBfYWdjX3VzZV9zZF9tb2QyPTAsIFBfYWdjX2ZyZXFfcHdtX2Rpdj01LAorCSAqIFBfYWdjX2ludl9wd20xPTAsIFBfYWdjX2ludl9wd20yPTAsIFBfYWdjX2luaF9kY19ydl9lc3Q9MCwKKwkgKiBQX2FnY190aW1lX2VzdD0zLCBQX2FnY19mcmVlemU9MCwgUF9hZ2NfbmJfZXN0PTUsIFBfYWdjX3dyaXRlPTAKKwkgKi8KKwkuc2V0dXAgPSAoMCA8PCAxNSkgfCAoMCA8PCAxNCkgfCAoNSA8PCAxMSkgfCAoMCA8PCAxMCkgfCAoMCA8PCA5KSB8CisJCSAoMCA8PCA4KSB8ICgzIDw8IDUpIHwgKDAgPDwgNCkgfCAoNSA8PCAxKSB8ICgwIDw8IDApLAorCS5pbnZfZ2FpbiA9IDYwMCwKKwkudGltZV9zdGFiaWxpeiA9IDEwLAorCS5hbHBoYV9sZXZlbCA9IDAsCisJLnRobG9jayA9IDExOCwKKwkud2JkX2ludiA9IDAsCisJLndiZF9yZWYgPSAzNTMwLAorCS53YmRfc2VsID0gMSwKKwkud2JkX2FscGhhID0gNSwKKwkuYWdjMV9tYXggPSA2NTUzNSwKKwkuYWdjMV9taW4gPSAwLAorCS5hZ2MyX21heCA9IDY1NTM1LAorCS5hZ2MyX21pbiA9IDAsCisJLmFnYzFfcHQxID0gMCwKKwkuYWdjMV9wdDIgPSA0MCwKKwkuYWdjMV9wdDMgPSAxODMsCisJLmFnYzFfc2xvcGUxID0gMjA2LAorCS5hZ2MxX3Nsb3BlMiA9IDI1NSwKKwkuYWdjMl9wdDEgPSA3MiwKKwkuYWdjMl9wdDIgPSAxNTIsCisJLmFnYzJfc2xvcGUxID0gODgsCisJLmFnYzJfc2xvcGUyID0gOTAsCisJLmFscGhhX21hbnQgPSAxNywKKwkuYWxwaGFfZXhwID0gMjcsCisJLmJldGFfbWFudCA9IDIzLAorCS5iZXRhX2V4cCA9IDUxLAorCS5wZXJmb3JtX2FnY19zb2Z0c3BsaXQgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgZGliNzA3MF9id19jb25maWdfMTJfbWh6ID0geworCS5pbnRlcm5hbCA9IDYwMDAwLAorCS5zYW1wbGluZyA9IDE1MDAwLAorCS5wbGxfcHJlZGl2ID0gMSwKKwkucGxsX3JhdGlvID0gMjAsCisJLnBsbF9yYW5nZSA9IDMsCisJLnBsbF9yZXNldCA9IDEsCisJLnBsbF9ieXBhc3MgPSAwLAorCS5lbmFibGVfcmVmZGl2ID0gMCwKKwkuYnlwY2xrX2RpdiA9IDAsCisJLklPX0NMS19lbl9jb3JlID0gMSwKKwkuQURDbGtTcmMgPSAxLAorCS5tb2R1bG8gPSAyLAorCS8qIHJlZnNlbCwgc2VsLCBmcmVxXzE1ayAqLworCS5zYWRfY2ZnID0gKDMgPDwgMTQpIHwgKDEgPDwgMTIpIHwgKDUyNCA8PCAwKSwKKwkuaWZyZXEgPSAoMCA8PCAyNSkgfCAwLAorCS50aW1mID0gMjA0NTIyMjUsCisJLnh0YWxfaHogPSAxMjAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGliNzAwMHBfY29uZmlnIGN4dXNiX2R1YWxkaWc0X3JldjJfY29uZmlnID0geworCS5vdXRwdXRfbW9kZSA9IE9VVE1PREVfTVBFRzJfUEFSX0dBVEVEX0NMSywKKwkub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcyA9IDEsCisKKwkuYWdjX2NvbmZpZ19jb3VudCA9IDEsCisJLmFnYyA9ICZkaWI3MDcwX2FnY19jb25maWcsCisJLmJ3ICA9ICZkaWI3MDcwX2J3X2NvbmZpZ18xMl9taHosCisJLnR1bmVyX2lzX2Jhc2ViYW5kID0gMSwKKwkuc3B1cl9wcm90ZWN0ID0gMSwKKworCS5ncGlvX2RpciA9IDB4ZmNlZiwKKwkuZ3Bpb192YWwgPSAweDAxMTAsCisKKwkuZ3Bpb19wd21fcG9zID0gRElCNzAwMFBfR1BJT19ERUZBVUxUX1BXTV9QT1MsCisKKwkuaG9zdGJ1c19kaXZlcnNpdHkgPSAxLAorfTsKKworc3RhdGljIGludCBjeHVzYl9kdWFsZGlnNF9yZXYyX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShhZGFwLT5kZXYtPnVkZXYsIDAsIDEpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJY3h1c2JfY3RybF9tc2coYWRhcC0+ZGV2LCBDTURfRElHSVRBTCwgTlVMTCwgMCwgTlVMTCwgMCk7CisKKwljeHVzYl9ibHVlYmlyZF9ncGlvX3B1bHNlKGFkYXAtPmRldiwgMHgwMiwgMSk7CisKKwlkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDE4LAorCQkJCSAmY3h1c2JfZHVhbGRpZzRfcmV2Ml9jb25maWcpOworCisJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJCQkgICAgICAmY3h1c2JfZHVhbGRpZzRfcmV2Ml9jb25maWcpOworCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwNzBfdHVuZXJfcmVzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZikKK3sKKwlyZXR1cm4gZGliNzAwMHBfc2V0X2dwaW8oZmUsIDgsIDAsICFvbm9mZik7Cit9CisKK3N0YXRpYyBpbnQgZGliNzA3MF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRpYjAwNzBfY29uZmlnIGRpYjcwNzBwX2RpYjAwNzBfY29uZmlnID0geworCS5pMmNfYWRkcmVzcyA9IERFRkFVTFRfRElCMDA3MF9JMkNfQUREUkVTUywKKwkucmVzZXQgPSBkaWI3MDcwX3R1bmVyX3Jlc2V0LAorCS5zbGVlcCA9IGRpYjcwNzBfdHVuZXJfc2xlZXAsCisJLmNsb2NrX2toeiA9IDEyMDAwLAorfTsKKworc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSB7CisJaW50ICgqc2V0X3BhcmFtX3NhdmUpIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICosCisJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICopOworfTsKKworc3RhdGljIGludCBkaWI3MDcwX3NldF9wYXJhbV9vdmVycmlkZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlICpzdGF0ZSA9IGFkYXAtPnByaXY7CisKKwl1MTYgb2Zmc2V0OworCXU4IGJhbmQgPSBCQU5EX09GX0ZSRVFVRU5DWShmZXAtPmZyZXF1ZW5jeS8xMDAwKTsKKwlzd2l0Y2ggKGJhbmQpIHsKKwljYXNlIEJBTkRfVkhGOiBvZmZzZXQgPSA5NTA7IGJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBCQU5EX1VIRjogb2Zmc2V0ID0gNTUwOyBicmVhazsKKwl9CisKKwlkaWI3MDAwcF9zZXRfd2JkX3JlZihmZSwgb2Zmc2V0ICsgZGliMDA3MF93YmRfb2Zmc2V0KGZlKSk7CisKKwlyZXR1cm4gc3RhdGUtPnNldF9wYXJhbV9zYXZlKGZlLCBmZXApOworfQorCitzdGF0aWMgaW50IGN4dXNiX2R1YWxkaWc0X3JldjJfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9CisJCWRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCQkJCQlESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCisJaWYgKGR2Yl9hdHRhY2goZGliMDA3MF9hdHRhY2gsIGFkYXAtPmZlLCB0dW5faTJjLAorCSAgICAmZGliNzA3MHBfZGliMDA3MF9jb25maWcpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliNzA3MF9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3h1c2JfbmFubzJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGFkYXAtPmRldi0+dWRldiwgMCwgMSkgPCAwKQpAQCAtNzUxLDYgKzEwOTQsNTQgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIHN0cnVjdCBsZ3M4Z2w1X2NvbmZpZyBsZ3M4Z2w1X2NmZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MTksCit9OworCitzdGF0aWMgaW50IGN4dXNiX2Q2ODBfZG1iX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGFkYXAtPmRldjsKKwlpbnQgbjsKKworCS8qIFNlbGVjdCByZXF1aXJlZCBVU0IgY29uZmlndXJhdGlvbiAqLworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LCAwLCAwKSA8IDApCisJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKKworCS8qIFVuYmxvY2sgYWxsIFVTQiBwaXBlcyAqLworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9zbmRidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsCisJCXVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LCBkLT5wcm9wcy5hZGFwdGVyWzBdLnN0cmVhbS5lbmRwb2ludCkpOworCisJLyogRHJhaW4gVVNCIHBpcGVzIHRvIGF2b2lkIGhhbmcgYWZ0ZXIgcmVib290ICovCisJZm9yIChuID0gMDsgIG4gPCA1OyAgbisrKSB7CisJCWN4dXNiX2Q2ODBfZG1iX2RyYWluX21lc3NhZ2UoZCk7CisJCWN4dXNiX2Q2ODBfZG1iX2RyYWluX3ZpZGVvKGQpOworCQltc2xlZXAoMjAwKTsKKwl9CisKKwkvKiBSZXNldCB0aGUgdHVuZXIgKi8KKwlpZiAoY3h1c2JfZDY4MF9kbWJfZ3Bpb190dW5lcihkLCAweDA3LCAwKSA8IDApIHsKKwkJZXJyKCJjbGVhciB0dW5lciBncGlvIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNsZWVwKDEwMCk7CisJaWYgKGN4dXNiX2Q2ODBfZG1iX2dwaW9fdHVuZXIoZCwgMHgwNywgMSkgPCAwKSB7CisJCWVycigic2V0IHR1bmVyIGdwaW8gZmFpbGVkIik7CisJCXJldHVybiAtRUlPOworCX0KKwltc2xlZXAoMTAwKTsKKworCS8qIEF0dGFjaCBmcm9udGVuZCAqLworCWFkYXAtPmZlID0gZHZiX2F0dGFjaChsZ3M4Z2w1X2F0dGFjaCwgJmxnczhnbDVfY2ZnLCAmZC0+aTJjX2FkYXApOworCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCiAvKgogICogRFZpQ08gaGFzIHNoaXBwZWQgdHdvIGRldmljZXMgd2l0aCB0aGUgc2FtZSBVU0IgSUQsIGJ1dCBvbmx5IG9uZSBvZiB0aGVtCiAgKiBuZWVkcyBhIGZpcm13YXJlIGRvd25sb2FkLiAgQ2hlY2sgdGhlIGRldmljZSBjbGFzcyBkZXRhaWxzIHRvIHNlZSBpZiB0aGV5CkBAIC04MjYsOSArMTIxNywxMSBAQAogc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2JsdWViaXJkX2xnejIwMV9wcm9wZXJ0aWVzOwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2JsdWViaXJkX2R0dDc1NzlfcHJvcGVydGllczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9kdWFsZGlnNF9wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2JsdWViaXJkX2R1YWxkaWc0X3JldjJfcHJvcGVydGllczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9uYW5vMl9wcm9wZXJ0aWVzOwogc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2JsdWViaXJkX25hbm8yX25lZWRzZmlybXdhcmVfcHJvcGVydGllczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBjeHVzYl9hdmVyX2E4NjhyX3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgY3h1c2JfZDY4MF9kbWJfcHJvcGVydGllczsKIAogc3RhdGljIGludCBjeHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTg1Miw2ICsxMjQ1LDExIEBACiAJCQkJICAgICBUSElTX01PRFVMRSwgTlVMTCwgYWRhcHRlcl9ucikgfHwKIAkgICAgMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZjeHVzYl9hdmVyX2E4NjhyX3Byb3BlcnRpZXMsCiAJCQkJICAgICBUSElTX01PRFVMRSwgTlVMTCwgYWRhcHRlcl9ucikgfHwKKwkgICAgMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsCisJCQkJICAgICAmY3h1c2JfYmx1ZWJpcmRfZHVhbGRpZzRfcmV2Ml9wcm9wZXJ0aWVzLAorCQkJCSAgICAgVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmY3h1c2JfZDY4MF9kbWJfcHJvcGVydGllcywKKwkJCQkgICAgIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSB8fAogCSAgICAwKQogCQlyZXR1cm4gMDsKIApAQCAtODc2LDYgKzEyNzQsOCBAQAogCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0RWQl9UX05BTk9fMikgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVkJfVF9OQU5PXzJfTkZXX1dBUk0pIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9BODY4UikgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzRfUkVWXzIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfQ09ORVhBTlQsIFVTQl9QSURfQ09ORVhBTlRfRDY4MF9ETUIpIH0sCiAJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBjeHVzYl90YWJsZSk7CkBAIC0xMzIxLDYgKzE3MjEsMTA0IEBACiAJfQogfTsKIAorc3RhdGljCitzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBjeHVzYl9ibHVlYmlyZF9kdWFsZGlnNF9yZXYyX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCisJLnVzYl9jdHJsICAgICAgICAgPSBDWVBSRVNTX0ZYMiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBjeHVzYl9zdGF0ZSksCisKKwkubnVtX2FkYXB0ZXJzID0gMSwKKwkuYWRhcHRlciA9IHsKKwkJeworCQkJLnN0cmVhbWluZ19jdHJsICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCA9IGN4dXNiX2R1YWxkaWc0X3JldjJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICA9IGN4dXNiX2R1YWxkaWc0X3JldjJfdHVuZXJfYXR0YWNoLAorCQkJLnNpemVfb2ZfcHJpdiAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS5zdHJlYW0gPSB7CisJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA3LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJCQl9CisJCQkJfQorCQkJfSwKKwkJfSwKKwl9LAorCisJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9ibHVlYmlyZF9wb3dlcl9jdHJsLAorCisJLmkyY19hbGdvICAgICAgICAgPSAmY3h1c2JfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCisJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJLnJjX2tleV9tYXAgICAgICAgPSBkdmljb19tY2VfcmNfa2V5cywKKwkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoZHZpY29fbWNlX3JjX2tleXMpLAorCS5yY19xdWVyeSAgICAgICAgID0gY3h1c2JfcmNfcXVlcnksCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgICAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBEdWFsIERpZ2l0YWwgNCAocmV2IDIpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmY3h1c2JfdGFibGVbMTddLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGN4dXNiX2Q2ODBfZG1iX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCisJLnVzYl9jdHJsICAgICAgICAgPSBDWVBSRVNTX0ZYMiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBjeHVzYl9zdGF0ZSksCisKKwkubnVtX2FkYXB0ZXJzID0gMSwKKwkuYWRhcHRlciA9IHsKKwkJeworCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9kNjgwX2RtYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfZDY4MF9kbWJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9kNjgwX2RtYl90dW5lcl9hdHRhY2gsCisKKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS5zdHJlYW0gPSB7CisJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA1LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAorCQkJCQl9CisJCQkJfQorCQkJfSwKKwkJfSwKKwl9LAorCisJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9kNjgwX2RtYl9wb3dlcl9jdHJsLAorCisJLmkyY19hbGdvICAgICAgICAgPSAmY3h1c2JfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCisJLnJjX2ludGVydmFsICAgICAgPSAxMDAsCisJLnJjX2tleV9tYXAgICAgICAgPSBkNjgwX2RtYl9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShkNjgwX2RtYl9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgICA9IGN4dXNiX2Q2ODBfZG1iX3JjX3F1ZXJ5LAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7CisJCQkiQ29uZXhhbnQgRE1CLVRIIFN0aWNrIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmY3h1c2JfdGFibGVbMThdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGN4dXNiX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiZHZiX3VzYl9jeHVzYiIsCiAJLnByb2JlCQk9IGN4dXNiX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDAuaAppbmRleCA2NmQ0ZGM2Li43MzkxOTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDAuaApAQCAtMzEsNiArMzEsOCBAQAogCS8vIDIgQnl0ZTogTVBFRzIgbW9kZTogIDRNU0IoMSA9IE1hc3RlciBNb2RlLCAwID0gU2xhdmUgTW9kZSkgNExTQihDaGFubmVsIDEgPSBiaXQwLCBDaGFubmVsIDIgPSBiaXQxKQogCS8vIDIgQnl0ZTogQW5hbG9nIG1vZGU6IDRNU0IoMCA9IDYyNSBsaW5lcywgMSA9IDUyNSBsaW5lcykgICAgNExTQiggICAgICIgICAgICAgICAgICAgICAgIiAgICAgICAgICAgKQogI2RlZmluZSBSRVFVRVNUX1NFVF9SQyAgICAgICAweDExCisjZGVmaW5lIFJFUVVFU1RfTkVXX0kyQ19SRUFEIDB4MTIKKyNkZWZpbmUgUkVRVUVTVF9ORVdfSTJDX1dSSVRFIDB4MTMKICNkZWZpbmUgUkVRVUVTVF9HRVRfVkVSU0lPTiAgMHgxNQogCiBzdHJ1Y3QgZGliMDcwMF9zdGF0ZSB7CkBAIC0zOSw2ICs0MSw4IEBACiAJdTggcmNfdG9nZ2xlOwogCXU4IHJjX2NvdW50ZXI7CiAJdTggaXNfZGliNzAwMHBjOworCXU4IGZ3X3VzZV9uZXdfaTJjX2FwaTsKKwl1OCBkaXNhYmxlX3N0cmVhbWluZ19tYXN0ZXJfbW9kZTsKIH07CiAKIGV4dGVybiBpbnQgZGliMDcwMF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgZW51bSBkaWIwN3gwX2dwaW9zIGdwaW8sIHU4IGdwaW9fZGlyLCB1OCBncGlvX3ZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYwppbmRleCA1OTVhMDQ2Li5kZDUzY2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKQEAgLTgyLDkgKzgyLDk4IEBACiB9CiAKIC8qCi0gKiBJMkMgbWFzdGVyIHhmZXIgZnVuY3Rpb24KKyAqIEkyQyBtYXN0ZXIgeGZlciBmdW5jdGlvbiAoc3VwcG9ydGVkIGluIDEuMjAgZmlybXdhcmUpCiAgKi8KLXN0YXRpYyBpbnQgZGliMDcwMF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZyxpbnQgbnVtKQorc3RhdGljIGludCBkaWIwNzAwX2kyY194ZmVyX25ldyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2csCisJCQkJaW50IG51bSkKK3sKKwkvKiBUaGUgbmV3IGkyYyBmaXJtd2FyZSBtZXNzYWdlcyBhcmUgbW9yZSByZWxpYWJsZSBhbmQgaW4gcGFydGljdWxhcgorCSAgIHByb3Blcmx5IHN1cHBvcnQgaTJjIHJlYWQgY2FsbHMgbm90IHByZWNlZGVkIGJ5IGEgd3JpdGUgKi8KKworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJdWludDhfdCBidXNfbW9kZSA9IDE7ICAvKiAwPWVlcHJvbSBidXMsIDE9ZnJvbnRlbmQgYnVzICovCisJdWludDhfdCBnZW5fbW9kZSA9IDA7IC8qIDA9bWFzdGVyIGkyYywgMT1ncGlvIGkyYyAqLworCXVpbnQ4X3QgZW5fc3RhcnQgPSAwOworCXVpbnQ4X3QgZW5fc3RvcCA9IDA7CisJdWludDhfdCBidWZbMjU1XTsgLyogVEJWOiBtYWxsb2MgPyAqLworCWludCByZXN1bHQsIGk7CisKKwkvKiBFbnN1cmUgbm9ib2R5IGVsc2UgaGl0cyB0aGUgaTJjIGJ1cyB3aGlsZSB3ZSdyZSBzZW5kaW5nIG91cgorCSAgIHNlcXVlbmNlIG9mIG1lc3NhZ2VzLCAoc3VjaCBhcyB0aGUgcmVtb3RlIGNvbnRyb2wgdGhyZWFkKSAqLworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQkvKiBGaXJzdCBtZXNzYWdlIGluIHRoZSB0cmFuc2FjdGlvbiAqLworCQkJZW5fc3RhcnQgPSAxOworCQl9IGVsc2UgaWYgKCEobXNnW2ldLmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsKKwkJCS8qIERldmljZSBzdXBwb3J0cyByZXBlYXRlZC1zdGFydCAqLworCQkJZW5fc3RhcnQgPSAxOworCQl9IGVsc2UgeworCQkJLyogTm90IHRoZSBmaXJzdCBwYWNrZXQgYW5kIGRldmljZSBkb2Vzbid0IHN1cHBvcnQKKwkJCSAgIHJlcGVhdGVkIHN0YXJ0ICovCisJCQllbl9zdGFydCA9IDA7CisJCX0KKwkJaWYgKGkgPT0gKG51bSAtIDEpKSB7CisJCQkvKiBMYXN0IG1lc3NhZ2UgaW4gdGhlIHRyYW5zYWN0aW9uICovCisJCQllbl9zdG9wID0gMTsKKwkJfQorCisJCWlmIChtc2dbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJLyogUmVhZCByZXF1ZXN0ICovCisJCQl1MTYgaW5kZXgsIHZhbHVlOworCQkJdWludDhfdCBpMmNfZGVzdDsKKworCQkJaTJjX2Rlc3QgPSAobXNnW2ldLmFkZHIgPDwgMSk7CisJCQl2YWx1ZSA9ICgoZW5fc3RhcnQgPDwgNykgfCAoZW5fc3RvcCA8PCA2KSB8CisJCQkJIChtc2dbaV0ubGVuICYgMHgzRikpIDw8IDggfCBpMmNfZGVzdDsKKwkJCS8qIEkyQyBjdHJsICsgRkUgYnVzOyAqLworCQkJaW5kZXggPSAoKGdlbl9tb2RlPDw2KSYweEMwKSB8ICgoYnVzX21vZGU8PDQpJjB4MzApOworCisJCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCQkJCSB1c2JfcmN2Y3RybHBpcGUoZC0+dWRldiwgMCksCisJCQkJCQkgUkVRVUVTVF9ORVdfSTJDX1JFQUQsCisJCQkJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwKKwkJCQkJCSB2YWx1ZSwgaW5kZXgsIG1zZ1tpXS5idWYsCisJCQkJCQkgbXNnW2ldLmxlbiwKKwkJCQkJCSBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCWVycigiaTJjIHJlYWQgZXJyb3IgKHN0YXR1cyA9ICVkKVxuIiwgcmVzdWx0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdyaXRlIHJlcXVlc3QgKi8KKwkJCWJ1ZlswXSA9IFJFUVVFU1RfTkVXX0kyQ19XUklURTsKKwkJCWJ1ZlsxXSA9IChtc2dbaV0uYWRkciA8PCAxKTsKKwkJCWJ1ZlsyXSA9IChlbl9zdGFydCA8PCA3KSB8IChlbl9zdG9wIDw8IDYpIHwKKwkJCQkobXNnW2ldLmxlbiAmIDB4M0YpOworCQkJLyogSTJDIGN0cmwgKyBGRSBidXM7ICovCisJCQlidWZbM10gPSAoKGdlbl9tb2RlPDw2KSYweEMwKSB8ICgoYnVzX21vZGU8PDQpJjB4MzApOworCQkJLyogVGhlIEFjdHVhbCBpMmMgcGF5bG9hZCAqLworCQkJbWVtY3B5KCZidWZbNF0sIG1zZ1tpXS5idWYsIG1zZ1tpXS5sZW4pOworCisJCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCQkJCSB1c2Jfc25kY3RybHBpcGUoZC0+dWRldiwgMCksCisJCQkJCQkgUkVRVUVTVF9ORVdfSTJDX1dSSVRFLAorCQkJCQkJIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULAorCQkJCQkJIDAsIDAsIGJ1ZiwgbXNnW2ldLmxlbiArIDQsCisJCQkJCQkgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQllcnIoImkyYyB3cml0ZSBlcnJvciAoc3RhdHVzID0gJWQpXG4iLCByZXN1bHQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIEkyQyBtYXN0ZXIgeGZlciBmdW5jdGlvbiAocHJlLTEuMjAgZmlybXdhcmUpCisgKi8KK3N0YXRpYyBpbnQgZGliMDcwMF9pMmNfeGZlcl9sZWdhY3koc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkJCSAgIHN0cnVjdCBpMmNfbXNnICptc2csIGludCBudW0pCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKIAlpbnQgaSxsZW47CkBAIC0xMjQsNiArMjEzLDIxIEBACiAJcmV0dXJuIGk7CiB9CiAKK3N0YXRpYyBpbnQgZGliMDcwMF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2csCisJCQkgICAgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CisKKwlpZiAoc3QtPmZ3X3VzZV9uZXdfaTJjX2FwaSA9PSAxKSB7CisJCS8qIFVzZXIgcnVubmluZyBhdCBsZWFzdCBmdyAxLjIwICovCisJCXJldHVybiBkaWIwNzAwX2kyY194ZmVyX25ldyhhZGFwLCBtc2csIG51bSk7CisJfSBlbHNlIHsKKwkJLyogVXNlIGxlZ2FjeSBjYWxscyAqLworCQlyZXR1cm4gZGliMDcwMF9pMmNfeGZlcl9sZWdhY3koYWRhcCwgbXNnLCBudW0pOworCX0KK30KKwogc3RhdGljIHUzMiBkaWIwNzAwX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlyZXR1cm4gSTJDX0ZVTkNfSTJDOwpAQCAtMjQ2LDcgKzM1MCwxMiBAQAogCiAJYlswXSA9IFJFUVVFU1RfRU5BQkxFX1ZJREVPOwogCWJbMV0gPSAob25vZmYgPDwgNCkgfCAweDAwOyAvKiB0aGlzIGJpdCBnaXZlcyBhIGtpbmQgb2YgY29tbWFuZCwgcmF0aGVyIHRoYW4gZW5hYmxpbmcgc29tZXRoaW5nIG9yIG5vdCAqLwotCWJbMl0gPSAoMHgwMSA8PCA0KTsgLyogTWFzdGVyIG1vZGUgKi8KKworCWlmIChzdC0+ZGlzYWJsZV9zdHJlYW1pbmdfbWFzdGVyX21vZGUgPT0gMSkKKwkJYlsyXSA9IDB4MDA7CisJZWxzZQorCQliWzJdID0gKDB4MDEgPDwgNCk7IC8qIE1hc3RlciBtb2RlICovCisKIAliWzNdID0gMHgwMDsKIAogCWRlYl9pbmZvKCJtb2RpZnlpbmcgKCVkKSBzdHJlYW1pbmcgc3RhdGUgZm9yICVkXG4iLCBvbm9mZiwgYWRhcC0+aWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKaW5kZXggNmMwZTVjNS4uMGNmY2NjMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgIm10MjA2MC5oIgogI2luY2x1ZGUgIm10MjI2Ni5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgorI2luY2x1ZGUgInhjNTAwMC5oIgorI2luY2x1ZGUgInM1aDE0MTEuaCIKICNpbmNsdWRlICJkaWIwMDcwLmgiCiAKIHN0YXRpYyBpbnQgZm9yY2VfbG5hX2FjdGl2YXRpb247CkBAIC0zNjYsNyArMzY4LDggQEAKIAkuZ3Bpb19wd21fcG9zID0gRElCNzAwMFBfR1BJT19ERUZBVUxUX1BXTV9QT1MsCiB9OwogCi1zdGF0aWMgaW50IHN0azc3MDBwaF94YzMwMjhfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tbWFuZCwgaW50IGFyZykKK3N0YXRpYyBpbnQgc3RrNzcwMHBoX3hjMzAyOF9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsCisJCQkJICAgICBpbnQgY29tbWFuZCwgaW50IGFyZykKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gcHRyOwogCkBAIC0zOTQsNyArMzk3LDYgQEAKIAogc3RhdGljIHN0cnVjdCB4YzIwMjhfY29uZmlnIHN0azc3MDBwaF94YzMwMjhfY29uZmlnID0gewogCS5pMmNfYWRkciA9IDB4NjEsCi0JLmNhbGxiYWNrID0gc3RrNzcwMHBoX3hjMzAyOF9jYWxsYmFjaywKIAkuY3RybCA9ICZzdGs3NzAwcGhfeGMzMDI4X2N0cmwsCiB9OwogCkBAIC00MzUsNyArNDM3LDkgQEAKIAkJRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAogCXN0azc3MDBwaF94YzMwMjhfY29uZmlnLmkyY19hZGFwID0gdHVuX2kyYzsKLQlzdGs3NzAwcGhfeGMzMDI4X2NvbmZpZy52aWRlb19kZXYgPSBhZGFwOworCisJLyogRklYTUU6IGdlbmVyYWxpemUgJiBtb3ZlIHRvIGNvbW1vbiBhcmVhICovCisJYWRhcC0+ZmUtPmNhbGxiYWNrID0gc3RrNzcwMHBoX3hjMzAyOF9jYWxsYmFjazsKIAogCXJldHVybiBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGFkYXAtPmZlLCAmc3RrNzcwMHBoX3hjMzAyOF9jb25maWcpCiAJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKQEAgLTY3Nyw2ICs2ODEsNDMgQEAKIAl7IDB4MDEsIDB4N2QsIEtFWV9WT0xVTUVET1dOIH0sCiAJeyAweDAyLCAweDQyLCBLRVlfQ0hBTk5FTFVQIH0sCiAJeyAweDAwLCAweDdkLCBLRVlfQ0hBTk5FTERPV04gfSwKKworCS8qIEtleSBjb2RlcyBmb3IgTm92YS1URCAiY3JlZGl0IGNhcmQiIHJlbW90ZSBjb250cm9sLiAqLworCXsgMHgxZCwgMHgwMCwgS0VZXzAgfSwKKwl7IDB4MWQsIDB4MDEsIEtFWV8xIH0sCisJeyAweDFkLCAweDAyLCBLRVlfMiB9LAorCXsgMHgxZCwgMHgwMywgS0VZXzMgfSwKKwl7IDB4MWQsIDB4MDQsIEtFWV80IH0sCisJeyAweDFkLCAweDA1LCBLRVlfNSB9LAorCXsgMHgxZCwgMHgwNiwgS0VZXzYgfSwKKwl7IDB4MWQsIDB4MDcsIEtFWV83IH0sCisJeyAweDFkLCAweDA4LCBLRVlfOCB9LAorCXsgMHgxZCwgMHgwOSwgS0VZXzkgfSwKKwl7IDB4MWQsIDB4MGEsIEtFWV9URVhUIH0sCisJeyAweDFkLCAweDBkLCBLRVlfTUVOVSB9LAorCXsgMHgxZCwgMHgwZiwgS0VZX01VVEUgfSwKKwl7IDB4MWQsIDB4MTAsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgxZCwgMHgxMSwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4MWQsIDB4MTIsIEtFWV9DSEFOTkVMIH0sCisJeyAweDFkLCAweDE0LCBLRVlfVVAgfSwKKwl7IDB4MWQsIDB4MTUsIEtFWV9ET1dOIH0sCisJeyAweDFkLCAweDE2LCBLRVlfTEVGVCB9LAorCXsgMHgxZCwgMHgxNywgS0VZX1JJR0hUIH0sCisJeyAweDFkLCAweDFjLCBLRVlfVFYgfSwKKwl7IDB4MWQsIDB4MWUsIEtFWV9ORVhUIH0sCisJeyAweDFkLCAweDFmLCBLRVlfQkFDSyB9LAorCXsgMHgxZCwgMHgyMCwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHgxZCwgMHgyMSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDFkLCAweDI0LCBLRVlfTEFTVCB9LAorCXsgMHgxZCwgMHgyNSwgS0VZX09LIH0sCisJeyAweDFkLCAweDMwLCBLRVlfUEFVU0UgfSwKKwl7IDB4MWQsIDB4MzIsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MWQsIDB4MzQsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgxZCwgMHgzNSwgS0VZX1BMQVkgfSwKKwl7IDB4MWQsIDB4MzYsIEtFWV9TVE9QIH0sCisJeyAweDFkLCAweDM3LCBLRVlfUkVDT1JEIH0sCisJeyAweDFkLCAweDNiLCBLRVlfR09UTyB9LAorCXsgMHgxZCwgMHgzZCwgS0VZX1BPV0VSIH0sCiB9OwogCiAvKiBTVEs3NzAwUDogSGF1cHBhdWdlIE5vdmEtVCBTdGljaywgQVZlck1lZGlhIFZvbGFyICovCkBAIC0xMDc4LDYgKzExMTksOTcgQEAKIAlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCisvKiBTNUgxNDExICovCitzdGF0aWMgc3RydWN0IHM1aDE0MTFfY29uZmlnIHBpbm5hY2xlXzgwMWVfY29uZmlnID0geworCS5vdXRwdXRfbW9kZSAgID0gUzVIMTQxMV9QQVJBTExFTF9PVVRQVVQsCisJLmdwaW8gICAgICAgICAgPSBTNUgxNDExX0dQSU9fT0ZGLAorCS5tcGVnX3RpbWluZyAgID0gUzVIMTQxMV9NUEVHVElNSU5HX05PTkNPTlRJTk9VU19OT05JTlZFUlRJTkdfQ0xPQ0ssCisJLnFhbV9pZiAgICAgICAgPSBTNUgxNDExX0lGXzQ0MDAwLAorCS52c2JfaWYgICAgICAgID0gUzVIMTQxMV9JRl80NDAwMCwKKwkuaW52ZXJzaW9uICAgICA9IFM1SDE0MTFfSU5WRVJTSU9OX09GRiwKKwkuc3RhdHVzX21vZGUgICA9IFM1SDE0MTFfREVNT0RMT0NLSU5HCit9OworCisvKiBQaW5uYWNsZSBQQ1RWIEhEIFBybyA4MDFlIEdQSU9zIG1hcDoKKyAgIEdQSU8wICAtIGN1cnJlbnRseSB1bmtub3duCisgICBHUElPMSAgLSB4YzUwMDAgdHVuZXIgcmVzZXQKKyAgIEdQSU8yICAtIENYMjU4NDMgc2xlZXAKKyAgIEdQSU8zICAtIGN1cnJlbnRseSB1bmtub3duCisgICBHUElPNCAgLSBjdXJyZW50bHkgdW5rbm93bgorICAgR1BJTzYgIC0gY3VycmVudGx5IHVua25vd24KKyAgIEdQSU83ICAtIGN1cnJlbnRseSB1bmtub3duCisgICBHUElPOSAgLSBjdXJyZW50bHkgdW5rbm93bgorICAgR1BJTzEwIC0gQ1gyNTg0MyByZXNldAorICovCitzdGF0aWMgaW50IHM1aDE0MTFfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OworCisJLyogTWFrZSB1c2Ugb2YgdGhlIG5ldyBpMmMgZnVuY3Rpb25zIGZyb20gRlcgMS4yMCAqLworCXN0LT5md191c2VfbmV3X2kyY19hcGkgPSAxOworCisJLyogVGhlIHM1aDE0MTEgcmVxdWlyZXMgdGhlIGRpYjA3MDAgdG8gbm90IGJlIGluIG1hc3RlciBtb2RlICovCisJc3QtPmRpc2FibGVfc3RyZWFtaW5nX21hc3Rlcl9tb2RlID0gMTsKKworCS8qIEFsbCBtc2xlZXAgdmFsdWVzIHRha2VuIGZyb20gV2luZG93cyBVU0IgdHJhY2UgKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzAsIEdQSU9fT1VULCAwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzMsIEdQSU9fT1VULCAwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsIEdQSU9fT1VULCAxKTsKKwltc2xlZXAoNDAwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMCk7CisJbXNsZWVwKDYwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMSk7CisJbXNsZWVwKDMwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzAsIEdQSU9fT1VULCAxKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzksIEdQSU9fT1VULCAxKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzQsIEdQSU9fT1VULCAxKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzcsIEdQSU9fT1VULCAxKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzIsIEdQSU9fT1VULCAwKTsKKwltc2xlZXAoMzApOworCisJLyogUHV0IHRoZSBDWDI1ODQzIHRvIHNsZWVwIGZvciBub3cgc2luY2Ugd2UncmUgaW4gZGlnaXRhbCBtb2RlICovCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8yLCBHUElPX09VVCwgMSk7CisKKwkvKiBHUElPcyBhcmUgaW5pdGlhbGl6ZWQsIGRvIHRoZSBhdHRhY2ggKi8KKwlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goczVoMTQxMV9hdHRhY2gsICZwaW5uYWNsZV84MDFlX2NvbmZpZywKKwkJCSAgICAgICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IGRpYjA3MDBfeGM1MDAwX3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21wb25lbnQsCisJCQkJCSBpbnQgY29tbWFuZCwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gcHJpdjsKKworCWlmIChjb21tYW5kID09IFhDNTAwMF9UVU5FUl9SRVNFVCkgeworCQkvKiBSZXNldCB0aGUgdHVuZXIgKi8KKwkJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xLCBHUElPX09VVCwgMCk7CisJCW1zbGVlcCgzMzApOyAvKiBmcm9tIFdpbmRvd3MgVVNCIHRyYWNlICovCisJCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPMSwgR1BJT19PVVQsIDEpOworCQltc2xlZXAoMzMwKTsgLyogZnJvbSBXaW5kb3dzIFVTQiB0cmFjZSAqLworCX0gZWxzZSB7CisJCWVycigieGM1MDAwOiB1bmtub3duIHR1bmVyIGNhbGxiYWNrIGNvbW1hbmQ6ICVkXG4iLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGM1MDAwX2NvbmZpZyBzNWgxNDExX3hjNTAwMF90dW5lcmNvbmZpZyA9IHsKKwkuaTJjX2FkZHJlc3MgICAgICA9IDB4NjQsCisJLmlmX2toeiAgICAgICAgICAgPSA1MzgwLAorfTsKKworc3RhdGljIGludCB4YzUwMDBfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJLyogRklYTUU6IGdlbmVyYWxpemUgJiBtb3ZlIHRvIGNvbW1vbiBhcmVhICovCisJYWRhcC0+ZmUtPmNhbGxiYWNrID0gZGliMDcwMF94YzUwMDBfdHVuZXJfY2FsbGJhY2s7CisKKwlyZXR1cm4gZHZiX2F0dGFjaCh4YzUwMDBfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQkgICZzNWgxNDExX3hjNTAwMF90dW5lcmNvbmZpZykKKwkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCiAvKiBEVkItVVNCIGFuZCBVU0Igc3R1ZmYgZm9sbG93cyAqLwogc3RydWN0IHVzYl9kZXZpY2VfaWQgZGliMDcwMF91c2JfaWRfdGFibGVbXSA9IHsKIC8qIDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfRElCQ09NLCAgICBVU0JfUElEX0RJQkNPTV9TVEs3NzAwUCkgfSwKQEAgLTExMTksNiArMTI1MSwxMSBAQAogCXsgVVNCX0RFVklDRShVU0JfVklEX0xFQURURUssICAgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfU1RLNzcwMFBfMikgfSwKIC8qIDM1ICoveyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCBVU0JfUElEX0hBVVBQQVVHRV9OT1ZBX1REX1NUSUNLXzUyMDA5KSB9LAogCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgVVNCX1BJRF9IQVVQUEFVR0VfTk9WQV9UXzUwMF8zKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX0dJR0FCWVRFLCAgVVNCX1BJRF9HSUdBQllURV9VODAwMCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ZVUFOLCAgICAgIFVTQl9QSURfWVVBTl9TVEs3NzAwUEgpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfQVNVUywJVVNCX1BJRF9BU1VTX1UzMDAwSCkgfSwKKy8qIDQwICoveyBVU0JfREVWSUNFKFVTQl9WSURfUElOTkFDTEUsICBVU0JfUElEX1BJTk5BQ0xFX1BDVFY4MDFFKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCAgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWODAxRV9TRSkgfSwKIAl7IDAgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGliMDcwMF91c2JfaWRfdGFibGUpOwpAQCAtMTEyNiw3ICsxMjYzLDcgQEAKICNkZWZpbmUgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTIFwKIAkuY2FwcyAgICAgICAgICAgICAgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLCBcCiAJLnVzYl9jdHJsICAgICAgICAgID0gREVWSUNFX1NQRUNJRklDLCBcCi0JLmZpcm13YXJlICAgICAgICAgID0gImR2Yi11c2ItZGliMDcwMC0xLjEwLmZ3IiwgXAorCS5maXJtd2FyZSAgICAgICAgICA9ICJkdmItdXNiLWRpYjA3MDAtMS4yMC5mdyIsIFwKIAkuZG93bmxvYWRfZmlybXdhcmUgPSBkaWIwNzAwX2Rvd25sb2FkX2Zpcm13YXJlLCBcCiAJLm5vX3JlY29ubmVjdCAgICAgID0gMSwgXAogCS5zaXplX29mX3ByaXYgICAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9zdGF0ZSksIFwKQEAgLTEyOTMsNyArMTQzMCwxMiBAQAogCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzMxXSwgTlVMTCB9LAogCQkJCXsgTlVMTCB9LAogCQkJfQotCQl9CisJCX0sCisKKwkJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCQkucmNfa2V5X21hcCAgICAgICA9IGRpYjA3MDBfcmNfa2V5cywKKwkJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGRpYjA3MDBfcmNfa2V5cyksCisJCS5yY19xdWVyeSAgICAgICAgID0gZGliMDcwMF9yY19xdWVyeQogCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAogCiAJCS5udW1fYWRhcHRlcnMgPSAxLApAQCAtMTQwOCw3ICsxNTUwLDcgQEAKIAkJCX0sCiAJCX0sCiAKLQkJLm51bV9kZXZpY2VfZGVzY3MgPSAzLAorCQkubnVtX2RldmljZV9kZXNjcyA9IDUsCiAJCS5kZXZpY2VzID0gewogCQkJeyAgICJUZXJyYXRlYyBDaW5lcmd5IEhUIFVTQiBYRSIsCiAJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbMjddLCBOVUxMIH0sCkBAIC0xNDIyLDYgKzE1NjQsNDcgQEAKIAkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVszMl0sIE5VTEwgfSwKIAkJCQl7IE5VTEwgfSwKIAkJCX0sCisJCQl7ICAgIkdpZ2FieXRlIFU4MDAwLVJIIiwKKwkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVszN10sIE5VTEwgfSwKKwkJCQl7IE5VTEwgfSwKKwkJCX0sCisJCQl7ICAgIllVQU4gSGlnaC1UZWNoIFNUSzc3MDBQSCIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbMzhdLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQkJeyAgICJBc3VzIE15IENpbmVtYS1VMzAwMEh5YnJpZCIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbMzldLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQl9LAorCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCS5yY19rZXlfbWFwICAgICAgID0gZGliMDcwMF9yY19rZXlzLAorCQkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUoZGliMDcwMF9yY19rZXlzKSwKKwkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5CisJfSwgeyBESUIwNzAwX0RFRkFVTFRfREVWSUNFX1BST1BFUlRJRVMsCisJCS5udW1fYWRhcHRlcnMgPSAxLAorCQkuYWRhcHRlciA9IHsKKwkJCXsKKwkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHM1aDE0MTFfZnJvbnRlbmRfYXR0YWNoLAorCQkJCS50dW5lcl9hdHRhY2ggICAgID0geGM1MDAwX3R1bmVyX2F0dGFjaCwKKworCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCisJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKKwkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCisJCQl9LAorCQl9LAorCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkJLmRldmljZXMgPSB7CisJCQl7ICAgIlBpbm5hY2xlIFBDVFYgSEQgUHJvIFVTQiBTdGljayIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNDBdLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQkJeyAgICJQaW5uYWNsZSBQQ1RWIEhEIFVTQiBTdGljayIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNDFdLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAogCQl9LAogCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCiAJCS5yY19rZXlfbWFwICAgICAgID0gZGliMDcwMF9yY19rZXlzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHY1MTAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhjZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHY1MTAwLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQU1FIERUVi01MTAwIFVTQjIuMCBEVkItVAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCAgQW50b2luZSBKYWNxdWV0IDxyb3lhbGVAemVyZXpvLmNvbT4KKyAqIGh0dHA6Ly9yb3lhbGUuemVyZXpvLmNvbS9kdHY1MTAwLworICoKKyAqIEluc3BpcmVkIGJ5IGdsODYxLmMgYW5kIGF1NjYxMC5jIGRyaXZlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImR0djUxMDAuaCIKKyNpbmNsdWRlICJ6bDEwMzUzLmgiCisjaW5jbHVkZSAicXQxMDEwLmgiCisKKy8qIGRlYnVnICovCitzdGF0aWMgaW50IGR2Yl91c2JfZHR2NTEwMF9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHZiX3VzYl9kdHY1MTAwX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwiIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCitzdGF0aWMgaW50IGR0djUxMDBfaTJjX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IGFkZHIsCisJCQkgICB1OCAqd2J1ZiwgdTE2IHdsZW4sIHU4ICpyYnVmLCB1MTYgcmxlbikKK3sKKwl1OCByZXF1ZXN0OworCXU4IHR5cGU7CisJdTE2IHZhbHVlOworCXUxNiBpbmRleDsKKworCXN3aXRjaCAod2xlbikgeworCWNhc2UgMToKKwkJLyogd3JpdGUgeyByZWcgfSwgcmVhZCB7IHZhbHVlIH0gKi8KKwkJcmVxdWVzdCA9IChhZGRyID09IERUVjUxMDBfREVNT0RfQUREUiA/IERUVjUxMDBfREVNT0RfUkVBRCA6CisJCQkJCQkJRFRWNTEwMF9UVU5FUl9SRUFEKTsKKwkJdHlwZSA9IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU47CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiB3cml0ZSB7IHJlZywgdmFsdWUgfSAqLworCQlyZXF1ZXN0ID0gKGFkZHIgPT0gRFRWNTEwMF9ERU1PRF9BRERSID8gRFRWNTEwMF9ERU1PRF9XUklURSA6CisJCQkJCQkJRFRWNTEwMF9UVU5FUl9XUklURSk7CisJCXR5cGUgPSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVDsKKwkJdmFsdWUgPSB3YnVmWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3YXJuKCJ3bGVuID0gJXgsIGFib3J0aW5nLiIsIHdsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5kZXggPSAoYWRkciA8PCA4KSArIHdidWZbMF07CisKKwltc2xlZXAoMSk7IC8qIGF2b2lkIEkyQyBlcnJvcnMgKi8KKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShkLT51ZGV2LCAwKSwgcmVxdWVzdCwKKwkJCSAgICAgICB0eXBlLCB2YWx1ZSwgaW5kZXgsIHJidWYsIHJsZW4sCisJCQkgICAgICAgRFRWNTEwMF9VU0JfVElNRU9VVCk7Cit9CisKKy8qIEkyQyAqLworc3RhdGljIGludCBkdHY1MTAwX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJCQkgICAgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCBpOworCisJaWYgKG51bSA+IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCS8qIHdyaXRlL3JlYWQgcmVxdWVzdCAqLworCQlpZiAoaSsxIDwgbnVtICYmIChtc2dbaSsxXS5mbGFncyAmIEkyQ19NX1JEKSkgeworCQkJaWYgKGR0djUxMDBfaTJjX21zZyhkLCBtc2dbaV0uYWRkciwgbXNnW2ldLmJ1ZiwKKwkJCQkJICAgIG1zZ1tpXS5sZW4sIG1zZ1tpKzFdLmJ1ZiwKKwkJCQkJICAgIG1zZ1tpKzFdLmxlbikgPCAwKQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9IGVsc2UgaWYgKGR0djUxMDBfaTJjX21zZyhkLCBtc2dbaV0uYWRkciwgbXNnW2ldLmJ1ZiwKKwkJCQkJICAgbXNnW2ldLmxlbiwgTlVMTCwgMCkgPCAwKQorCQkJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHUzMiBkdHY1MTAwX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gZHR2NTEwMF9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IGR0djUxMDBfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBkdHY1MTAwX2kyY19mdW5jLAorfTsKKworLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCitzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIGR0djUxMDBfemwxMDM1M19jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSBEVFY1MTAwX0RFTU9EX0FERFIsCisJLm5vX3R1bmVyID0gMSwKKwkucGFyYWxsZWxfdHMgPSAxLAorfTsKKworc3RhdGljIGludCBkdHY1MTAwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmR0djUxMDBfemwxMDM1M19jb25maWcsCisJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKGFkYXAtPmZlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJLyogZGlzYWJsZSBpMmMgZ2F0ZSwgb3IgaXQgd29uJ3Qgd29yay4uLiBpcyB0aGlzIHNhZmU/ICovCisJYWRhcC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHF0MTAxMF9jb25maWcgZHR2NTEwMF9xdDEwMTBfY29uZmlnID0geworCS5pMmNfYWRkcmVzcyA9IERUVjUxMDBfVFVORVJfQUREUgorfTsKKworc3RhdGljIGludCBkdHY1MTAwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXJldHVybiBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsCisJCQkgIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgJmR0djUxMDBfcXQxMDEwX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCisvKiBEVkIgVVNCIERyaXZlciBzdHVmZiAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGR0djUxMDBfcHJvcGVydGllczsKKworc3RhdGljIGludCBkdHY1MTAwX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCS8qIGluaXRpYWxpemUgbm9uIHF0MTAxMC96bDEwMzUzIHBhcnQ/ICovCisJZm9yIChpID0gMDsgZHR2NTEwMF9pbml0W2ldLnJlcXVlc3Q7IGkrKykgeworCQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSAgICAgIGR0djUxMDBfaW5pdFtpXS5yZXF1ZXN0LAorCQkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULAorCQkJCSAgICAgIGR0djUxMDBfaW5pdFtpXS52YWx1ZSwKKwkJCQkgICAgICBkdHY1MTAwX2luaXRbaV0uaW5kZXgsIE5VTEwsIDAsCisJCQkJICAgICAgRFRWNTEwMF9VU0JfVElNRU9VVCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmR0djUxMDBfcHJvcGVydGllcywKKwkJCQkgIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkdHY1MTAwX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDZiZSwgMHhhMjMyKSB9LAorCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZHR2NTEwMF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBkdHY1MTAwX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKworCS5zaXplX29mX3ByaXYgPSAwLAorCisJLm51bV9hZGFwdGVycyA9IDEsCisJLmFkYXB0ZXIgPSB7eworCQkuZnJvbnRlbmRfYXR0YWNoID0gZHR2NTEwMF9mcm9udGVuZF9hdHRhY2gsCisJCS50dW5lcl9hdHRhY2ggICAgPSBkdHY1MTAwX3R1bmVyX2F0dGFjaCwKKworCQkuc3RyZWFtID0geworCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCS5jb3VudCA9IDgsCisJCQkuZW5kcG9pbnQgPSAweDgyLAorCQkJLnUgPSB7CisJCQkJLmJ1bGsgPSB7CisJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQl9CisJCQl9CisJCX0sCisJfSB9LAorCisJLmkyY19hbGdvID0gJmR0djUxMDBfaTJjX2FsZ28sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsKKwkJCS5uYW1lID0gIkFNRSBEVFYtNTEwMCBVU0IyLjAgRFZCLVQiLAorCQkJLmNvbGRfaWRzID0geyBOVUxMIH0sCisJCQkud2FybV9pZHMgPSB7ICZkdHY1MTAwX3RhYmxlWzBdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGR0djUxMDBfZHJpdmVyID0geworCS5uYW1lCQk9ICJkdmJfdXNiX2R0djUxMDAiLAorCS5wcm9iZQkJPSBkdHY1MTAwX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBkdHY1MTAwX3RhYmxlLAorfTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCBkdHY1MTAwX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9yZWdpc3RlcigmZHR2NTEwMF9kcml2ZXIpOworCWlmIChyZXQpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdHY1MTAwX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmR0djUxMDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHR2NTEwMF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChkdHY1MTAwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR2NTEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTk2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogRFZCIFVTQiBMaW51eCBkcml2ZXIgZm9yIEFNRSBEVFYtNTEwMCBVU0IyLjAgRFZCLVQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIEFudG9pbmUgSmFjcXVldCA8cm95YWxlQHplcmV6by5jb20+CisgKiBodHRwOi8vcm95YWxlLnplcmV6by5jb20vZHR2NTEwMC8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfRFZCX1VTQl9EVFY1MTAwX0hfCisjZGVmaW5lIF9EVkJfVVNCX0RUVjUxMDBfSF8KKworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggImR0djUxMDAiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCisjZGVmaW5lIERUVjUxMDBfVVNCX1RJTUVPVVQgNTAwCisKKyNkZWZpbmUgRFRWNTEwMF9ERU1PRF9BRERSCTB4MDAKKyNkZWZpbmUgRFRWNTEwMF9ERU1PRF9XUklURQkweGMwCisjZGVmaW5lIERUVjUxMDBfREVNT0RfUkVBRAkweGMxCisKKyNkZWZpbmUgRFRWNTEwMF9UVU5FUl9BRERSCTB4YzQKKyNkZWZpbmUgRFRWNTEwMF9UVU5FUl9XUklURQkweGM3CisjZGVmaW5lIERUVjUxMDBfVFVORVJfUkVBRAkweGM4CisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW50b2luZSBKYWNxdWV0LCBodHRwOi8vcm95YWxlLnplcmV6by5jb20vIgorI2RlZmluZSBEUklWRVJfREVTQyAiQU1FIERUVi01MTAwIFVTQjIuMCBEVkItVCIKKworc3RhdGljIHN0cnVjdCB7CisJdTggcmVxdWVzdDsKKwl1OCB2YWx1ZTsKKwl1MTYgaW5kZXg7Cit9IGR0djUxMDBfaW5pdFtdID0geworCXsgMHgwMDAwMDBjNSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSB9LAorCXsgMHgwMDAwMDBjNSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSB9LAorCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IDAzZGZiOWYuLjczODBiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNkZWZpbmUgVVNCX1ZJRF9BVkVSTUVESUEJCQkweDA3Y2EKICNkZWZpbmUgVVNCX1ZJRF9DT01QUk8JCQkJMHgxODViCiAjZGVmaW5lIFVTQl9WSURfQ09NUFJPX1VOSwkJCTB4MTQ1ZgorI2RlZmluZSBVU0JfVklEX0NPTkVYQU5UCQkJMHgwNTcyCiAjZGVmaW5lIFVTQl9WSURfQ1lQUkVTUwkJCQkweDA0YjQKICNkZWZpbmUgVVNCX1ZJRF9ESUJDT00JCQkJMHgxMGI4CiAjZGVmaW5lIFVTQl9WSURfRFBPU0gJCQkJMHgxNDk4CkBAIC0zMywxNiArMzQsMTkgQEAKICNkZWZpbmUgVVNCX1ZJRF9IQVVQUEFVR0UJCQkweDIwNDAKICNkZWZpbmUgVVNCX1ZJRF9IWVBFUl9QQUxURUsJCQkweDEwMjUKICNkZWZpbmUgVVNCX1ZJRF9LV09STEQJCQkJMHhlYjJhCisjZGVmaW5lIFVTQl9WSURfS1dPUkxEXzIJCQkweDFiODAKICNkZWZpbmUgVVNCX1ZJRF9LWUUJCQkJMHgwNDU4CiAjZGVmaW5lIFVTQl9WSURfTEVBRFRFSwkJCQkweDA0MTMKICNkZWZpbmUgVVNCX1ZJRF9MSVRFT04JCQkJMHgwNGNhCiAjZGVmaW5lIFVTQl9WSURfTUVESU9OCQkJCTB4MTY2MAogI2RlZmluZSBVU0JfVklEX01JR0xJQQkJCQkweDE4ZjMKICNkZWZpbmUgVVNCX1ZJRF9NU0kJCQkJMHgwZGIwCisjZGVmaW5lIFVTQl9WSURfTVNJXzIJCQkJMHgxNDYyCiAjZGVmaW5lIFVTQl9WSURfT1BFUkExCQkJCTB4Njk1YwogI2RlZmluZSBVU0JfVklEX1BJTk5BQ0xFCQkJMHgyMzA0CiAjZGVmaW5lIFVTQl9WSURfVEVDSE5PVFJFTkQJCQkweDBiNDgKICNkZWZpbmUgVVNCX1ZJRF9URVJSQVRFQwkJCTB4MGNjZAorI2RlZmluZSBVU0JfVklEX1RFTEVTVEFSCQkJMHgxMGI5CiAjZGVmaW5lIFVTQl9WSURfVklTSU9OUExVUwkJCTB4MTNkMwogI2RlZmluZSBVU0JfVklEX1RXSU5IQU4JCQkJMHgxODIyCiAjZGVmaW5lIFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMJCTB4MDVkOApAQCAtNTAsMTUgKzU0LDE4IEBACiAjZGVmaW5lIFVTQl9WSURfV0lERVZJRVcJCQkweDE0YWEKICNkZWZpbmUgVVNCX1ZJRF9HSUdBQllURQkJCTB4MTA0NAogI2RlZmluZSBVU0JfVklEX1lVQU4JCQkJMHgxMTY0Ci0KKyNkZWZpbmUgVVNCX1ZJRF9YVEVOU0lPTlMJCQkweDFhZTcKIAogLyogUHJvZHVjdCBJRHMgKi8KICNkZWZpbmUgVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRAkJCTB4YTMzMwogI2RlZmluZSBVU0JfUElEX0FEU1RFQ0hfVVNCMl9XQVJNCQkJMHhhMzM0CiAjZGVmaW5lIFVTQl9QSURfQUZBVEVDSF9BRjkwMDUJCQkJMHg5MDIwCisjZGVmaW5lIFVTQl9QSURfQUZBVEVDSF9BRjkwMTVfOTAxNQkJCTB4OTAxNQorI2RlZmluZSBVU0JfUElEX0FGQVRFQ0hfQUY5MDE1XzkwMTYJCQkweDkwMTYKICNkZWZpbmUgVVNCX1ZJRF9BTElOS19EVFUJCQkJMHhmMTcwCiAjZGVmaW5lIFVTQl9QSURfQU5TT05JQ19EVkJUX1VTQgkJCTB4NjAwMAogI2RlZmluZSBVU0JfUElEX0FOWVNFRQkJCQkJMHg4NjFmCisjZGVmaW5lIFVTQl9QSURfQVpVUkVXQVZFX0FEX1RVNzAwCQkJMHgzMjM3CiAjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX0NPTEQJCQkweDAwMDEKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTQkJCTB4MDAwMgogI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQjJfQ09MRAkJMHhhODAwCkBAIC02OSw2ICs3Niw3IEBACiAjZGVmaW5lIFVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1VOS19XQVJNCQkweDAxMGQKICNkZWZpbmUgVVNCX1BJRF9DT01QUk9fVklERU9NQVRFX1U1MDAJCQkweDFlNzgKICNkZWZpbmUgVVNCX1BJRF9DT01QUk9fVklERU9NQVRFX1U1MDBfUEMJCTB4MWU4MAorI2RlZmluZSBVU0JfUElEX0NPTkVYQU5UX0Q2ODBfRE1CCQkJMHg4NmQ2CiAjZGVmaW5lIFVTQl9QSURfRElCQ09NX0hPT0tfREVGQVVMVAkJCTB4MDA2NAogI2RlZmluZSBVU0JfUElEX0RJQkNPTV9IT09LX0RFRkFVTFRfUkVFTlVNCQkweDAwNjUKICNkZWZpbmUgVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9DT0xECQkJMHgwYmI4CkBAIC04Nyw5ICs5NSwxMiBAQAogI2RlZmluZSBVU0JfUElEX1VOSVdJTExfU1RLNzcwMFAJCQkweDYwMDMKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9DT0xECQkJMHgwZmEwCiAjZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfV0FSTQkJCTB4MGZhMQorI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVCQkJCTB4ZTM5OQorI2RlZmluZSBVU0JfUElEX0tXT1JMRF9QQzE2MF8yVAkJCQkweGMxNjAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9DT0xECQkJMHgxN2RlCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fV0FSTQkJCTB4MTdkZgogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9VU0JfWEUJCTB4MDA1NQorI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9VU0JfWEVfUkVWMgkJMHgwMDY5CiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDFfQ09MRAkJCTB4MzIwMQogI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDQxX1dBUk0JCQkweDMyMDIKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMF9DT0xECQkJMHgzMjAzCkBAIC05OCw2ICsxMDksNyBAQAogI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDQ1X1dBUk0JCQkweDMyMDYKICNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMV9DT0xECQkJMHgzMjA3CiAjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwMjFfV0FSTQkJCTB4MzIwOAorI2RlZmluZSBVU0JfUElEX1RJTllUV0lOCQkJCTB4MzIyNgogI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfQ09MRAkJCTB4MzIyMwogI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfV0FSTQkJCTB4MzIyNAogI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xECQkJMHg4MTA1CkBAIC0xNDQsNiArMTU2LDkgQEAKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfSFlCUklEX1VMVFJBX1VTQl9NMDM5UgkweDAwMzkKICNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfSFlCUklEX1VMVFJBX1VTQl9NMDM5Ul9BVFNDCTB4MTAzOQogI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9IWUJSSURfVUxUUkFfVVNCX00wMzlSX0RWQlQJMHgyMDM5CisjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSX1gJCQkweGE4MTUKKyNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVJfWF8yCQkJMHg4MTUwCisjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX0EzMDkJCQkJMHhhMzA5CiAjZGVmaW5lIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMjQwMCAgICAgICAgICAgICAgIDB4MzAwNgogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfRFRfWFNfRElWRVJTSVRZCTB4MDA1YQogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfSFRfVVNCX1hFCQkweDAwNTgKQEAgLTE1Myw4ICsxNjgsMTEgQEAKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMjAwMEUJCQkweDAyMmMKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWX0RWQl9UX0ZMQVNICQkweDAyMjgKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWX0RVQUxfRElWRVJTSVRZX0RWQl9UCTB4MDIyOQorI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3MUUJCQkweDAyMmIKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWNzJFCQkJMHgwMjM2CiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjczRQkJCTB4MDIzNworI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY4MDFFCQkJMHgwMjNhCisjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjgwMUVfU0UJCQkweDAyM2IKICNkZWZpbmUgVVNCX1BJRF9QQ1RWXzIwMEUJCQkJMHgwMjBlCiAjZGVmaW5lIFVTQl9QSURfUENUVl80MDBFCQkJCTB4MDIwZgogI2RlZmluZSBVU0JfUElEX1BDVFZfNDUwRQkJCQkweDAyMjIKQEAgLTE3MSw2ICsxODksNyBAQAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0RVQUxfMl9DT0xECQkweGRiNTgKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzJfV0FSTQkJMHhkYjU5CiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF80CQkJMHhkYjc4CisjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF80X1JFVl8yCQkweGRiOTgKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVkJfVF9OQU5PXzIJCTB4ZGI3MAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0RWQl9UX05BTk9fMl9ORldfV0FSTQkweGRiNzEKICNkZWZpbmUgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RVQUxfMV9DT0xECQkweGRiNTQKQEAgLTE5MCw2ICsyMDksNyBAQAogI2RlZmluZSBVU0JfUElEX1dJTkZBU1RfRFRWX0RPTkdMRV9XQVJNCQkJMHg2MDI2CiAjZGVmaW5lIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX1NUSzc3MDBQCQkweDZmMDAKICNkZWZpbmUgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfU1RLNzcwMFBfMgkJMHg2ZjAxCisjZGVmaW5lIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX0dPTEQJCQkweDYwMjkKICNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19SRVZfMV9DT0xECQkJMHgwMjAwCiAjZGVmaW5lIFVTQl9QSURfR0VOUElYXzhQU0tfUkVWXzFfV0FSTQkJCTB4MDIwMQogI2RlZmluZSBVU0JfUElEX0dFTlBJWF84UFNLX1JFVl8yCQkJMHgwMjAyCkBAIC0xOTcsMTQgKzIxNywyMSBAQAogI2RlZmluZSBVU0JfUElEX0dFTlBJWF9TS1lXQUxLRVJfQ1czSwkJCTB4MDIwNAogI2RlZmluZSBVU0JfUElEX1NJR01BVEVLX0RWQl8xMTAJCQkweDY2MTAKICNkZWZpbmUgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSQkJCTB4MTUxMworI2RlZmluZSBVU0JfUElEX01TSV9ESUdJVk9YX0RVTwkJCQkweDg4MDEKICNkZWZpbmUgVVNCX1BJRF9PUEVSQTFfQ09MRAkJCQkweDI4MzAKICNkZWZpbmUgVVNCX1BJRF9PUEVSQTFfV0FSTQkJCQkweDM4MjkKICNkZWZpbmUgVVNCX1BJRF9MSUZFVklFV19UVl9XQUxLRVJfVFdJTl9DT0xECQkweDA1MTQKICNkZWZpbmUgVVNCX1BJRF9MSUZFVklFV19UVl9XQUxLRVJfVFdJTl9XQVJNCQkweDA1MTMKICNkZWZpbmUgVVNCX1BJRF9HSUdBQllURV9VNzAwMAkJCQkweDcwMDEKKyNkZWZpbmUgVVNCX1BJRF9HSUdBQllURV9VODAwMAkJCQkweDcwMDIKICNkZWZpbmUgVVNCX1BJRF9BU1VTX1UzMDAwCQkJCTB4MTcxZgorI2RlZmluZSBVU0JfUElEX0FTVVNfVTMwMDBICQkJCTB4MTczNgogI2RlZmluZSBVU0JfUElEX0FTVVNfVTMxMDAJCQkJMHgxNzNmCiAjZGVmaW5lIFVTQl9QSURfWVVBTl9FQzM3MlMJCQkJMHgxZWRjCisjZGVmaW5lIFVTQl9QSURfWVVBTl9TVEs3NzAwUEgJCQkJMHgxZjA4CiAjZGVmaW5lIFVTQl9QSURfRFcyMTAyCQkJCQkweDIxMDIKKyNkZWZpbmUgVVNCX1BJRF9YVEVOU0lPTlNfWERfMzgwCQkJMHgwMzgxCisjZGVmaW5lIFVTQl9QSURfVEVMRVNUQVJfU1RBUlNUSUNLXzIJCQkweDgwMDAKKyNkZWZpbmUgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUkgICAgICAgICAgICAgICAgICAgMHg4ODA3CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMKaW5kZXggYTRkODk4Yi4uY2E1M2RmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5jCkBAIC0xLDQgKzEsNSBAQAotLyogRFZCIFVTQiBmcmFtZXdvcmsgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIERWQldvcmxkIERWQi1TIDIxMDIgQ2FyZAorLyogRFZCIFVTQiBmcmFtZXdvcmsgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlCisqCURWQldvcmxkIERWQi1TIDIxMDEsIDIxMDIsIERWQi1TMiAyMTA0IENhcmQKICoKICogQ29weXJpZ2h0IChDKSAyMDA4IElnb3IgTS4gTGlwbGlhbmluIChsaXBsaWFuaW5AbWUuYnkpCiAqCkBAIC0xMCw2MiArMTEsNzQgQEAKICovCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgImR3MjEwMi5oIgorI2luY2x1ZGUgInNpMjF4eC5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKICNpbmNsdWRlICJ6MDE5NGEuaCIKKyNpbmNsdWRlICJzdHYwMjg4LmgiCisjaW5jbHVkZSAic3RiNjAwMC5oIgorI2luY2x1ZGUgImVkczE1NDcuaCIKKyNpbmNsdWRlICJjeDI0MTE2LmgiCiAKICNpZm5kZWYgVVNCX1BJRF9EVzIxMDIKICNkZWZpbmUgVVNCX1BJRF9EVzIxMDIgMHgyMTAyCiAjZW5kaWYKIAotI2RlZmluZSBEVzIxMDJfUkVBRF9NU0cgMAotI2RlZmluZSBEVzIxMDJfV1JJVEVfTVNHIDEKKyNpZm5kZWYgVVNCX1BJRF9EVzIxMDQKKyNkZWZpbmUgVVNCX1BJRF9EVzIxMDQgMHgyMTA0CisjZW5kaWYKKworI2RlZmluZSBEVzIxMFhfUkVBRF9NU0cgMAorI2RlZmluZSBEVzIxMFhfV1JJVEVfTVNHIDEKIAogI2RlZmluZSBSRUdfMUZfU1lNQk9MUkFURV9CWVRFMCAweDFmCiAjZGVmaW5lIFJFR18yMF9TWU1CT0xSQVRFX0JZVEUxIDB4MjAKICNkZWZpbmUgUkVHXzIxX1NZTUJPTFJBVEVfQllURTIgMHgyMQotCisvKiBvbiBteSBvd24qLwogI2RlZmluZSBEVzIxMDJfVk9MVEFHRV9DVFJMICgweDE4MDApCiAjZGVmaW5lIERXMjEwMl9SQ19RVUVSWSAoMHgxYTAwKQogCi1zdHJ1Y3QgZHcyMTAyX3N0YXRlIHsKK3N0cnVjdCBkdzIxMHhfc3RhdGUgewogCXUzMiBsYXN0X2tleV9wcmVzc2VkOwogfTsKLXN0cnVjdCBkdzIxMDJfcmNfa2V5cyB7CitzdHJ1Y3QgZHcyMTB4X3JjX2tleXMgewogCXUzMiBrZXljb2RlOwogCXUzMiBldmVudDsKIH07CiAKKy8qIGRlYnVnICovCitzdGF0aWMgaW50IGR2Yl91c2JfZHcyMTAyX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX2R3MjEwMl9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gMj14ZmVyIChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKIERWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOwogCi1zdGF0aWMgaW50IGR3MjEwMl9vcF9ydyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsCi0JCXU4ICpkYXRhLCB1MTYgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGR3MjEweF9vcF9ydyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsCisJCQl1MTYgaW5kZXgsIHU4ICogZGF0YSwgdTE2IGxlbiwgaW50IGZsYWdzKQogewogCWludCByZXQ7CiAJdTggdThidWZbbGVuXTsKIAotCXVuc2lnbmVkIGludCBwaXBlID0gKGZsYWdzID09IERXMjEwMl9SRUFEX01TRykgPwotCQl1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSA6IHVzYl9zbmRjdHJscGlwZShkZXYsIDApOwotCXU4IHJlcXVlc3RfdHlwZSA9IChmbGFncyA9PSBEVzIxMDJfUkVBRF9NU0cpID8gVVNCX0RJUl9JTiA6IFVTQl9ESVJfT1VUOworCXVuc2lnbmVkIGludCBwaXBlID0gKGZsYWdzID09IERXMjEwWF9SRUFEX01TRykgPworCQkJCXVzYl9yY3ZjdHJscGlwZShkZXYsIDApIDogdXNiX3NuZGN0cmxwaXBlKGRldiwgMCk7CisJdTggcmVxdWVzdF90eXBlID0gKGZsYWdzID09IERXMjEwWF9SRUFEX01TRykgPyBVU0JfRElSX0lOIDogVVNCX0RJUl9PVVQ7CiAKLQlpZiAoZmxhZ3MgPT0gRFcyMTAyX1dSSVRFX01TRykKKwlpZiAoZmxhZ3MgPT0gRFcyMTBYX1dSSVRFX01TRykKIAkJbWVtY3B5KHU4YnVmLCBkYXRhLCBsZW4pOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHBpcGUsIHJlcXVlc3QsCi0JCXJlcXVlc3RfdHlwZSB8IFVTQl9UWVBFX1ZFTkRPUiwgdmFsdWUsIDAgLCB1OGJ1ZiwgbGVuLCAyMDAwKTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCBwaXBlLCByZXF1ZXN0LCByZXF1ZXN0X3R5cGUgfCBVU0JfVFlQRV9WRU5ET1IsCisJCQkJdmFsdWUsIGluZGV4ICwgdThidWYsIGxlbiwgMjAwMCk7CiAKLQlpZiAoZmxhZ3MgPT0gRFcyMTAyX1JFQURfTVNHKQorCWlmIChmbGFncyA9PSBEVzIxMFhfUkVBRF9NU0cpCiAJCW1lbWNweShkYXRhLCB1OGJ1ZiwgbGVuKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBJMkMgKi8KLQogc3RhdGljIGludCBkdzIxMDJfaTJjX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCiAJCWludCBudW0pCiB7CiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCWludCBpID0gMCwgcmV0ID0gMDsKIAl1OCBidWY2W10gPSB7MHgyYywgMHgwNSwgMHhjMCwgMCwgMCwgMCwgMH07Ci0JdTggcmVxdWVzdDsKIAl1MTYgdmFsdWU7CiAKIAlpZiAoIWQpCkBAIC03NiwxNCArODksMTIgQEAKIAlzd2l0Y2ggKG51bSkgewogCWNhc2UgMjoKIAkJLyogcmVhZCBzdHYwMjk5IHJlZ2lzdGVyICovCi0JCXJlcXVlc3QgPSAweGI1OwogCQl2YWx1ZSA9IG1zZ1swXS5idWZbMF07LyogcmVnaXN0ZXIgKi8KIAkJZm9yIChpID0gMDsgaSA8IG1zZ1sxXS5sZW47IGkrKykgewogCQkJdmFsdWUgPSB2YWx1ZSArIGk7Ci0JCQlyZXQgPSBkdzIxMDJfb3BfcncoZC0+dWRldiwgMHhiNSwKLQkJCQl2YWx1ZSwgYnVmNiwgMiwgRFcyMTAyX1JFQURfTVNHKTsKKwkJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGI1LCB2YWx1ZSwgMCwKKwkJCQkJYnVmNiwgMiwgRFcyMTBYX1JFQURfTVNHKTsKIAkJCW1zZ1sxXS5idWZbaV0gPSBidWY2WzBdOwotCiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAxOgpAQCAtOTMsOCArMTA0LDggQEAKIAkJCWJ1ZjZbMF0gPSAweDJhOwogCQkJYnVmNlsxXSA9IG1zZ1swXS5idWZbMF07CiAJCQlidWY2WzJdID0gbXNnWzBdLmJ1ZlsxXTsKLQkJCXJldCA9IGR3MjEwMl9vcF9ydyhkLT51ZGV2LCAweGIyLAotCQkJCTAsIGJ1ZjYsIDMsIERXMjEwMl9XUklURV9NU0cpOworCQkJcmV0ID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YjIsIDAsIDAsCisJCQkJCWJ1ZjYsIDMsIERXMjEwWF9XUklURV9NU0cpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg2MDoKIAkJCWlmIChtc2dbMF0uZmxhZ3MgPT0gMCkgewpAQCAtMTA2LDI2ICsxMTcsMjYgQEAKIAkJCQlidWY2WzRdID0gbXNnWzBdLmJ1ZlsxXTsKIAkJCQlidWY2WzVdID0gbXNnWzBdLmJ1ZlsyXTsKIAkJCQlidWY2WzZdID0gbXNnWzBdLmJ1ZlszXTsKLQkJCQlyZXQgPSBkdzIxMDJfb3BfcncoZC0+dWRldiwgMHhiMiwKLQkJCQkwLCBidWY2LCA3LCBEVzIxMDJfV1JJVEVfTVNHKTsKKwkJCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhiMiwgMCwgMCwKKwkJCQkJCWJ1ZjYsIDcsIERXMjEwWF9XUklURV9NU0cpOwogCQkJfSBlbHNlIHsKLQkJCS8qIHdyaXRlIHRvIHR1bmVyIHBsbCAqLwotCQkJCXJldCA9IGR3MjEwMl9vcF9ydyhkLT51ZGV2LCAweGI1LAotCQkJCTAsIGJ1ZjYsIDEsIERXMjEwMl9SRUFEX01TRyk7CisJCQkvKiByZWFkIGZyb20gdHVuZXIgKi8KKwkJCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhiNSwgMCwgMCwKKwkJCQkJCWJ1ZjYsIDEsIERXMjEwWF9SRUFEX01TRyk7CiAJCQkJbXNnWzBdLmJ1ZlswXSA9IGJ1ZjZbMF07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAoRFcyMTAyX1JDX1FVRVJZKToKLQkJCXJldCAgPSBkdzIxMDJfb3BfcncoZC0+dWRldiwgMHhiOCwKLQkJCQkwLCBidWY2LCAyLCBEVzIxMDJfUkVBRF9NU0cpOworCQkJcmV0ICA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGI4LCAwLCAwLAorCQkJCQlidWY2LCAyLCBEVzIxMFhfUkVBRF9NU0cpOwogCQkJbXNnWzBdLmJ1ZlswXSA9IGJ1ZjZbMF07CiAJCQltc2dbMF0uYnVmWzFdID0gYnVmNlsxXTsKIAkJCWJyZWFrOwogCQljYXNlIChEVzIxMDJfVk9MVEFHRV9DVFJMKToKIAkJCWJ1ZjZbMF0gPSAweDMwOwogCQkJYnVmNlsxXSA9IG1zZ1swXS5idWZbMF07Ci0JCQlyZXQgPSBkdzIxMDJfb3BfcncoZC0+dWRldiwgMHhiMiwKLQkJCQkwLCBidWY2LCAyLCBEVzIxMDJfV1JJVEVfTVNHKTsKKwkJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGIyLCAwLCAwLAorCQkJCQlidWY2LCAyLCBEVzIxMFhfV1JJVEVfTVNHKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEzNiwxNyArMTQ3LDI2NSBAQAogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyB1MzIgZHcyMTAyX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgZHcyMTAyX3Nlcml0X2kyY190cmFuc2ZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCQkJCQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByZXQgPSAwOworCXU4IGJ1ZjZbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwfTsKKworCWlmICghZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoIChudW0pIHsKKwljYXNlIDI6CisJCS8qIHJlYWQgc2kyMTA5IHJlZ2lzdGVyIGJ5IG51bWJlciAqLworCQlidWY2WzBdID0gMHhkMDsKKwkJYnVmNlsxXSA9IG1zZ1swXS5sZW47CisJCWJ1ZjZbMl0gPSBtc2dbMF0uYnVmWzBdOworCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhjMiwgMCwgMCwKKwkJCQlidWY2LCBtc2dbMF0ubGVuICsgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCS8qIHJlYWQgc2kyMTA5IHJlZ2lzdGVyICovCisJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGMzLCAweGQwLCAwLAorCQkJCWJ1ZjYsIG1zZ1sxXS5sZW4gKyAyLCBEVzIxMFhfUkVBRF9NU0cpOworCQltZW1jcHkobXNnWzFdLmJ1ZiwgYnVmNiArIDIsIG1zZ1sxXS5sZW4pOworCisJCWJyZWFrOworCWNhc2UgMToKKwkJc3dpdGNoIChtc2dbMF0uYWRkcikgeworCQljYXNlIDB4Njg6CisJCQkvKiB3cml0ZSB0byBzaTIxMDkgcmVnaXN0ZXIgKi8KKwkJCWJ1ZjZbMF0gPSAweGQwOworCQkJYnVmNlsxXSA9IG1zZ1swXS5sZW47CisJCQltZW1jcHkoYnVmNiArIDIsIG1zZ1swXS5idWYsIG1zZ1swXS5sZW4pOworCQkJcmV0ID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YzIsIDAsIDAsIGJ1ZjYsCisJCQkJCW1zZ1swXS5sZW4gKyAyLCBEVzIxMFhfV1JJVEVfTVNHKTsKKwkJCWJyZWFrOworCQljYXNlKERXMjEwMl9SQ19RVUVSWSk6CisJCQlyZXQgID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YjgsIDAsIDAsCisJCQkJCWJ1ZjYsIDIsIERXMjEwWF9SRUFEX01TRyk7CisJCQltc2dbMF0uYnVmWzBdID0gYnVmNlswXTsKKwkJCW1zZ1swXS5idWZbMV0gPSBidWY2WzFdOworCQkJYnJlYWs7CisJCWNhc2UoRFcyMTAyX1ZPTFRBR0VfQ1RSTCk6CisJCQlidWY2WzBdID0gMHgzMDsKKwkJCWJ1ZjZbMV0gPSBtc2dbMF0uYnVmWzBdOworCQkJcmV0ID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YjIsIDAsIDAsCisJCQkJCWJ1ZjYsIDIsIERXMjEwWF9XUklURV9NU0cpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCXJldHVybiBudW07Cit9CitzdGF0aWMgaW50IGR3MjEwMl9lYXJkYV9pMmNfdHJhbnNmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByZXQgPSAwOworCisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlzd2l0Y2ggKG51bSkgeworCWNhc2UgMjogeworCQkvKiByZWFkICovCisJCS8qIGZpcnN0IHdyaXRlIGZpcnN0IHJlZ2lzdGVyIG51bWJlciAqLworCQl1OCBpYnVmIFttc2dbMV0ubGVuICsgMl0sIG9idWZbM107CisJCW9idWZbMF0gPSAweGQwOworCQlvYnVmWzFdID0gbXNnWzBdLmxlbjsKKwkJb2J1ZlsyXSA9IG1zZ1swXS5idWZbMF07CisJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGMyLCAwLCAwLAorCQkJCW9idWYsIG1zZ1swXS5sZW4gKyAyLCBEVzIxMFhfV1JJVEVfTVNHKTsKKwkJLyogc2Vjb25kIHJlYWQgcmVnaXN0ZXJzICovCisJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGMzLCAweGQxICwgMCwKKwkJCQlpYnVmLCBtc2dbMV0ubGVuICsgMiwgRFcyMTBYX1JFQURfTVNHKTsKKwkJbWVtY3B5KG1zZ1sxXS5idWYsIGlidWYgKyAyLCBtc2dbMV0ubGVuKTsKKworCQlicmVhazsKKwl9CisJY2FzZSAxOgorCQlzd2l0Y2ggKG1zZ1swXS5hZGRyKSB7CisJCWNhc2UgMHg2ODogeworCQkJLyogd3JpdGUgdG8gcmVnaXN0ZXIgKi8KKwkJCXU4IG9idWZbbXNnWzBdLmxlbiArIDJdOworCQkJb2J1ZlswXSA9IDB4ZDA7CisJCQlvYnVmWzFdID0gbXNnWzBdLmxlbjsKKwkJCW1lbWNweShvYnVmICsgMiwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhjMiwgMCwgMCwKKwkJCQkJb2J1ZiwgbXNnWzBdLmxlbiArIDIsIERXMjEwWF9XUklURV9NU0cpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAweDYxOiB7CisJCQkvKiB3cml0ZSB0byB0dW5lciAqLworCQkJdTggb2J1Zlttc2dbMF0ubGVuICsgMl07CisJCQlvYnVmWzBdID0gMHhjMjsKKwkJCW9idWZbMV0gPSBtc2dbMF0ubGVuOworCQkJbWVtY3B5KG9idWYgKyAyLCBtc2dbMF0uYnVmLCBtc2dbMF0ubGVuKTsKKwkJCXJldCA9IGR3MjEweF9vcF9ydyhkLT51ZGV2LCAweGMyLCAwLCAwLAorCQkJCQlvYnVmLCBtc2dbMF0ubGVuICsgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlKERXMjEwMl9SQ19RVUVSWSk6IHsKKwkJCXU4IGlidWZbMl07CisJCQlyZXQgID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YjgsIDAsIDAsCisJCQkJCWlidWYsIDIsIERXMjEwWF9SRUFEX01TRyk7CisJCQltZW1jcHkobXNnWzBdLmJ1ZiwgaWJ1ZiAsIDIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZShEVzIxMDJfVk9MVEFHRV9DVFJMKTogeworCQkJdTggb2J1ZlsyXTsKKwkJCW9idWZbMF0gPSAweDMwOworCQkJb2J1ZlsxXSA9IG1zZ1swXS5idWZbMF07CisJCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhiMiwgMCwgMCwKKwkJCQkJb2J1ZiwgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCQlicmVhazsKKwkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgZHcyMTA0X2kyY190cmFuc2ZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IHJldCA9IDA7CisJaW50IGxlbiwgaTsKKworCWlmICghZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoIChudW0pIHsKKwljYXNlIDI6IHsKKwkJLyogcmVhZCAqLworCQkvKiBmaXJzdCB3cml0ZSBmaXJzdCByZWdpc3RlciBudW1iZXIgKi8KKwkJdTggaWJ1ZiBbbXNnWzFdLmxlbiArIDJdLCBvYnVmWzNdOworCQlvYnVmWzBdID0gMHhhYTsKKwkJb2J1ZlsxXSA9IG1zZ1swXS5sZW47CisJCW9idWZbMl0gPSBtc2dbMF0uYnVmWzBdOworCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhjMiwgMCwgMCwKKwkJCQlvYnVmLCBtc2dbMF0ubGVuICsgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCS8qIHNlY29uZCByZWFkIHJlZ2lzdGVycyAqLworCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhjMywgMHhhYiAsIDAsCisJCQkJaWJ1ZiwgbXNnWzFdLmxlbiArIDIsIERXMjEwWF9SRUFEX01TRyk7CisJCW1lbWNweShtc2dbMV0uYnVmLCBpYnVmICsgMiwgbXNnWzFdLmxlbik7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgMToKKwkJc3dpdGNoIChtc2dbMF0uYWRkcikgeworCQljYXNlIDB4NTU6IHsKKwkJCWlmIChtc2dbMF0uYnVmWzBdID09IDB4ZjcpIHsKKwkJCQkvKiBmaXJtd2FyZSAqLworCQkJCS8qIFdyaXRlIGluIHNtYWxsIGJsb2NrcyAqLworCQkJCXU4IG9idWZbMTldOworCQkJCW9idWZbMF0gPSAweGFhOworCQkJCW9idWZbMV0gPSAweDExOworCQkJCW9idWZbMl0gPSAweGY3OworCQkJCWxlbiA9IG1zZ1swXS5sZW4gLSAxOworCQkJCWkgPSAxOworCQkJCWRvIHsKKwkJCQkJbWVtY3B5KG9idWYgKyAzLCBtc2dbMF0uYnVmICsgaSwgKGxlbiA+IDE2ID8gMTYgOiBsZW4pKTsKKwkJCQkJcmV0ID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YzIsIDAsIDAsCisJCQkJCQlvYnVmLCAobGVuID4gMTYgPyAxNiA6IGxlbikgKyAzLCBEVzIxMFhfV1JJVEVfTVNHKTsKKwkJCQkJaSArPSAxNjsKKwkJCQkJbGVuIC09IDE2OworCQkJCX0gd2hpbGUgKGxlbiA+IDApOworCQkJfSBlbHNlIHsKKwkJCQkvKiB3cml0ZSB0byByZWdpc3RlciAqLworCQkJCXU4IG9idWZbbXNnWzBdLmxlbiArIDJdOworCQkJCW9idWZbMF0gPSAweGFhOworCQkJCW9idWZbMV0gPSBtc2dbMF0ubGVuOworCQkJCW1lbWNweShvYnVmICsgMiwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJCQkJcmV0ID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YzIsIDAsIDAsCisJCQkJCQlvYnVmLCBtc2dbMF0ubGVuICsgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlKERXMjEwMl9SQ19RVUVSWSk6IHsKKwkJCXU4IGlidWZbMl07CisJCQlyZXQgID0gZHcyMTB4X29wX3J3KGQtPnVkZXYsIDB4YjgsIDAsIDAsCisJCQkJCWlidWYsIDIsIERXMjEwWF9SRUFEX01TRyk7CisJCQltZW1jcHkobXNnWzBdLmJ1ZiwgaWJ1ZiAsIDIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZShEVzIxMDJfVk9MVEFHRV9DVFJMKTogeworCQkJdTggb2J1ZlsyXTsKKwkJCW9idWZbMF0gPSAweDMwOworCQkJb2J1ZlsxXSA9IG1zZ1swXS5idWZbMF07CisJCQlyZXQgPSBkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhiMiwgMCwgMCwKKwkJCQkJb2J1ZiwgMiwgRFcyMTBYX1dSSVRFX01TRyk7CisJCQlicmVhazsKKwkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyB1MzIgZHcyMTB4X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlyZXR1cm4gSTJDX0ZVTkNfSTJDOwogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gZHcyMTAyX2kyY19hbGdvID0gewogCS5tYXN0ZXJfeGZlciA9IGR3MjEwMl9pMmNfdHJhbnNmZXIsCi0JLmZ1bmN0aW9uYWxpdHkgPSBkdzIxMDJfaTJjX2Z1bmMsCisJLmZ1bmN0aW9uYWxpdHkgPSBkdzIxMHhfaTJjX2Z1bmMsCiB9OwogCi1zdGF0aWMgaW50IGR3MjEwMl9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQorc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGR3MjEwMl9zZXJpdF9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSBkdzIxMDJfc2VyaXRfaTJjX3RyYW5zZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZHcyMTB4X2kyY19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGR3MjEwMl9lYXJkYV9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSBkdzIxMDJfZWFyZGFfaTJjX3RyYW5zZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZHcyMTB4X2kyY19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGR3MjEwNF9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSBkdzIxMDRfaTJjX3RyYW5zZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZHcyMTB4X2kyY19mdW5jLAorfTsKKworc3RhdGljIGludCBkdzIxMHhfcmVhZF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IG1hY1s2XSkKK3sKKwlpbnQgaTsKKwl1OCBpYnVmW10gPSB7MCwgMH07CisJdTggZWVwcm9tWzI1Nl0sIGVlcHJvbWxpbmVbMTZdOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWlmIChkdzIxMHhfb3BfcncoZC0+dWRldiwgMHhiNiwgMHhhMCAsIGksIGlidWYsIDIsIERXMjEwWF9SRUFEX01TRykgPCAwKSB7CisJCQllcnIoInJlYWQgZWVwcm9tIGZhaWxlZC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWVlcHJvbWxpbmVbaSUxNl0gPSBpYnVmWzBdOworCQkJZWVwcm9tW2ldID0gaWJ1ZlswXTsKKwkJfQorCQlpZiAoKGkgJSAxNikgPT0gMTUpIHsKKwkJCWRlYl94ZmVyKCIlMDJ4OiAiLCBpIC0gMTUpOworCQkJZGVidWdfZHVtcChlZXByb21saW5lLCAxNiwgZGViX3hmZXIpOworCQl9CisJfQorCW1lbWNweShtYWMsIGVlcHJvbSArIDgsIDYpOworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBkdzIxMHhfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdGF0aWMgdTggY29tbWFuZF8xM3ZbMV0gPSB7MHgwMH07CiAJc3RhdGljIHU4IGNvbW1hbmRfMTh2WzFdID0gezB4MDF9OwpAQCAtMTYzLDE0ICs0MjIsNjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBjeDI0MTE2X2NvbmZpZyBkdzIxMDRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKKwkubXBnX2Nsa19wb3NfcG9sID0gMHgwMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2kyMXh4X2NvbmZpZyBzZXJpdF9zcDE1MTFsaGJfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKKwkubWluX2RlbGF5X21zID0gMTAwLAorCit9OworCitzdGF0aWMgaW50IGR3MjEwNF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqZCkKK3sKKwlpZiAoKGQtPmZlID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwgJmR3MjEwNF9jb25maWcsCisJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKKwkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJaW5mbygiQXR0YWNoZWQgY3gyNDExNiFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBkdzIxMDJfcHJvcGVydGllczsKKwogc3RhdGljIGludCBkdzIxMDJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmQpCiB7Ci0JZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djAyOTlfYXR0YWNoLCAmc2hhcnBfejAxOTRhX2NvbmZpZywKLQkJJmQtPmRldi0+aTJjX2FkYXApOwotCWlmIChkLT5mZSAhPSBOVUxMKSB7Ci0JCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMDJfc2V0X3ZvbHRhZ2U7Ci0JCWluZm8oIkF0dGFjaGVkIHN0djAyOTkhXG4iKTsKLQkJcmV0dXJuIDA7CisJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfc2VyaXRfaTJjX2FsZ28pIHsKKwkJLypkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSBOVUxMOyovCisJCWQtPmZlID0gZHZiX2F0dGFjaChzaTIxeHhfYXR0YWNoLCAmc2VyaXRfc3AxNTExbGhiX2NvbmZpZywKKwkJCQkJJmQtPmRldi0+aTJjX2FkYXApOworCQlpZiAoZC0+ZmUgIT0gTlVMTCkgeworCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJCWluZm8oIkF0dGFjaGVkIHNpMjF4eCFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfZWFyZGFfaTJjX2FsZ28pIHsKKwkJLypkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSBkdzIxMDJfdHVuZXJfYXR0YWNoOyovCisJCWQtPmZlID0gZHZiX2F0dGFjaChzdHYwMjg4X2F0dGFjaCwgJmVhcmRhX2NvbmZpZywKKwkJCQkJJmQtPmRldi0+aTJjX2FkYXApOworCQlpZiAoZC0+ZmUgIT0gTlVMTCkgeworCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJCWluZm8oIkF0dGFjaGVkIHN0djAyODghXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfaTJjX2FsZ28pIHsKKwkJLypkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSBkdzIxMDJfdHVuZXJfYXR0YWNoOyovCisJCWQtPmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0YV9jb25maWcsCisJCQkJCSZkLT5kZXYtPmkyY19hZGFwKTsKKwkJaWYgKGQtPmZlICE9IE5VTEwpIHsKKwkJCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CisJCQlpbmZvKCJBdHRhY2hlZCBzdHYwMjk5IVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTE4Miw3ICs0ODksMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBkdzIxMDJfcmNfa2V5c1tdID0geworc3RhdGljIGludCBkdzIxMDJfZWFyZGFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjEsCisJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGR3MjEweF9yY19rZXlzW10gPSB7CiAJeyAweGY4LAkweDBhLCBLRVlfUSB9LAkJLypwb3dlciovCiAJeyAweGY4LAkweDBjLCBLRVlfTSB9LAkJLyptdXRlKi8KIAl7IDB4ZjgsCTB4MTEsIEtFWV8xIH0sCkBAIC0yMjEsNyArNTM2LDcgQEAKIAogc3RhdGljIGludCBkdzIxMDJfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQogewotCXN0cnVjdCBkdzIxMDJfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwlzdHJ1Y3QgZHcyMTB4X3N0YXRlICpzdCA9IGQtPnByaXY7CiAJdTgga2V5WzJdOwogCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewogCQl7LmFkZHIgPSBEVzIxMDJfUkNfUVVFUlksIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0ga2V5LApAQCAtMjMxLDEyICs1NDYsMTIgQEAKIAogCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKIAlpZiAoZHcyMTAyX2kyY190cmFuc2ZlcigmZC0+aTJjX2FkYXAsIG1zZywgMSkgPT0gMSkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkdzIxMDJfcmNfa2V5cyk7IGkrKykgewotCQkJaWYgKGR3MjEwMl9yY19rZXlzW2ldLmRhdGEgPT0gbXNnWzBdLmJ1ZlswXSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkdzIxMHhfcmNfa2V5cyk7IGkrKykgeworCQkJaWYgKGR3MjEweF9yY19rZXlzW2ldLmRhdGEgPT0gbXNnWzBdLmJ1ZlswXSkgewogCQkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUFJFU1NFRDsKLQkJCQkqZXZlbnQgPSBkdzIxMDJfcmNfa2V5c1tpXS5ldmVudDsKKwkJCQkqZXZlbnQgPSBkdzIxMHhfcmNfa2V5c1tpXS5ldmVudDsKIAkJCQlzdC0+bGFzdF9rZXlfcHJlc3NlZCA9Ci0JCQkJCWR3MjEwMl9yY19rZXlzW2ldLmV2ZW50OworCQkJCQlkdzIxMHhfcmNfa2V5c1tpXS5ldmVudDsKIAkJCQlicmVhazsKIAkJCX0KIAkJc3QtPmxhc3Rfa2V5X3ByZXNzZWQgPSAwOwpAQCAtMjQ5LDYgKzU2NCw4IEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZHcyMTAyX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9DWVBSRVNTLCBVU0JfUElEX0RXMjEwMil9LAogCXtVU0JfREVWSUNFKFVTQl9WSURfQ1lQUkVTUywgMHgyMTAxKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9DWVBSRVNTLCAweDIxMDQpfSwKKwl7VVNCX0RFVklDRSgweDkwMjIsIDB4ZDY1MCl9LAogCXsgfQogfTsKIApAQCAtMjYwLDcgKzU3Nyw3IEBACiAJdTggKmIsICpwOwogCWludCByZXQgPSAwLCBpOwogCXU4IHJlc2V0OwotCXU4IHJlc2V0MTYgW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMH07CisJdTggcmVzZXQxNltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDB9OwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJY29uc3QgY2hhciAqZmlsZW5hbWUgPSAiZHZiLXVzYi1kdzIxMDEuZnciOwogCXN3aXRjaCAoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgewpAQCAtMjczLDI1ICs1OTAsMjMgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBVU0JfUElEX0RXMjEwMjoKKwlkZWZhdWx0OgogCQlmdyA9IGZybXdyOwogCQlicmVhazsKIAl9Ci0JaW5mbygic3RhcnQgZG93bmxvYWRpbmcgRFcyMTAyIGZpcm13YXJlIik7CisJaW5mbygic3RhcnQgZG93bmxvYWRpbmcgRFcyMTBYIGZpcm13YXJlIik7CiAJcCA9IGttYWxsb2MoZnctPnNpemUsIEdGUF9LRVJORUwpOwogCXJlc2V0ID0gMTsKIAkvKnN0b3AgdGhlIENQVSovCi0JZHcyMTAyX29wX3J3KGRldiwgMHhhMCwgMHg3ZjkyLCAmcmVzZXQsIDEsIERXMjEwMl9XUklURV9NU0cpOwotCWR3MjEwMl9vcF9ydyhkZXYsIDB4YTAsIDB4ZTYwMCwgJnJlc2V0LCAxLCBEVzIxMDJfV1JJVEVfTVNHKTsKKwlkdzIxMHhfb3BfcncoZGV2LCAweGEwLCAweDdmOTIsIDAsICZyZXNldCwgMSwgRFcyMTBYX1dSSVRFX01TRyk7CisJZHcyMTB4X29wX3J3KGRldiwgMHhhMCwgMHhlNjAwLCAwLCAmcmVzZXQsIDEsIERXMjEwWF9XUklURV9NU0cpOwogCiAJaWYgKHAgIT0gTlVMTCkgewogCQltZW1jcHkocCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKIAkJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplOyBpICs9IDB4NDApIHsKIAkJCWIgPSAodTggKikgcCArIGk7Ci0JCQlpZiAoZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhhMCwgaSwgYiAsIDB4NDAsCi0JCQkJCURXMjEwMl9XUklURV9NU0cpICE9IDB4NDAKLQkJCQkpIHsKKwkJCWlmIChkdzIxMHhfb3BfcncoZGV2LCAweGEwLCBpLCAwLCBiICwgMHg0MCwKKwkJCQkJRFcyMTBYX1dSSVRFX01TRykgIT0gMHg0MCkgewogCQkJCWVycigiZXJyb3Igd2hpbGUgdHJhbnNmZXJyaW5nIGZpcm13YXJlIik7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlicmVhazsKQEAgLTI5OSw0MyArNjE0LDY2IEBACiAJCX0KIAkJLyogcmVzdGFydCB0aGUgQ1BVICovCiAJCXJlc2V0ID0gMDsKLQkJaWYgKHJldCB8fCBkdzIxMDJfb3BfcncKLQkJCShkZXYsIDB4YTAsIDB4N2Y5MiwgJnJlc2V0LCAxLAotCQkJRFcyMTAyX1dSSVRFX01TRykgIT0gMSkgeworCQlpZiAocmV0IHx8IGR3MjEweF9vcF9ydyhkZXYsIDB4YTAsIDB4N2Y5MiwgMCwgJnJlc2V0LCAxLAorCQkJCQlEVzIxMFhfV1JJVEVfTVNHKSAhPSAxKSB7CiAJCQllcnIoImNvdWxkIG5vdCByZXN0YXJ0IHRoZSBVU0IgY29udHJvbGxlciBDUFUuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQl9Ci0JCWlmIChyZXQgfHwgZHcyMTAyX29wX3J3Ci0JCQkoZGV2LCAweGEwLCAweGU2MDAsICZyZXNldCwgMSwKLQkJCURXMjEwMl9XUklURV9NU0cpICE9IDEpIHsKKwkJaWYgKHJldCB8fCBkdzIxMHhfb3BfcncoZGV2LCAweGEwLCAweGU2MDAsIDAsICZyZXNldCwgMSwKKwkJCQkJRFcyMTBYX1dSSVRFX01TRykgIT0gMSkgewogCQkJZXJyKCJjb3VsZCBub3QgcmVzdGFydCB0aGUgVVNCIGNvbnRyb2xsZXIgQ1BVLiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQkvKiBpbml0IHJlZ2lzdGVycyAqLwogCQlzd2l0Y2ggKGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpIHsKLQkJY2FzZSBVU0JfUElEX0RXMjEwMjoKLQkJCWR3MjEwMl9vcF9ydwotCQkJCShkZXYsIDB4YmYsIDB4MDA0MCwgJnJlc2V0LCAwLAotCQkJCURXMjEwMl9XUklURV9NU0cpOwotCQkJZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhiOSwgMHgwMDAwLCAmcmVzZXQxNlswXSwgMiwKLQkJCQlEVzIxMDJfUkVBRF9NU0cpOworCQljYXNlIFVTQl9QSURfRFcyMTA0OgorCQljYXNlIDB4ZDY1MDoKKwkJCXJlc2V0ID0gMTsKKwkJCWR3MjEweF9vcF9ydyhkZXYsIDB4YzQsIDB4MDAwMCwgMCwgJnJlc2V0LCAxLAorCQkJCQlEVzIxMFhfV1JJVEVfTVNHKTsKKwkJCXJlc2V0ID0gMDsKKwkJCWR3MjEweF9vcF9ydyhkZXYsIDB4YmYsIDB4MDA0MCwgMCwgJnJlc2V0LCAwLAorCQkJCQlEVzIxMFhfV1JJVEVfTVNHKTsKIAkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfRFcyMTAyOgorCQkJZHcyMTB4X29wX3J3KGRldiwgMHhiZiwgMHgwMDQwLCAwLCAmcmVzZXQsIDAsCisJCQkJCURXMjEwWF9XUklURV9NU0cpOworCQkJZHcyMTB4X29wX3J3KGRldiwgMHhiOSwgMHgwMDAwLCAwLCAmcmVzZXQxNlswXSwgMiwKKwkJCQkJRFcyMTBYX1JFQURfTVNHKTsKKwkJCS8qIGNoZWNrIFNUVjAyOTkgZnJvbnRlbmQgICovCisJCQlkdzIxMHhfb3BfcncoZGV2LCAweGI1LCAwLCAwLCAmcmVzZXQxNlswXSwgMiwKKwkJCQkJRFcyMTBYX1JFQURfTVNHKTsKKwkJCWlmIChyZXNldDE2WzBdID09IDB4YTEpIHsKKwkJCQlkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9ICZkdzIxMDJfaTJjX2FsZ287CisJCQkJZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+dHVuZXJfYXR0YWNoID0gJmR3MjEwMl90dW5lcl9hdHRhY2g7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIGNoZWNrIFNUVjAyODggZnJvbnRlbmQgICovCisJCQkJcmVzZXQxNlswXSA9IDB4ZDA7CisJCQkJcmVzZXQxNlsxXSA9IDE7CisJCQkJcmVzZXQxNlsyXSA9IDA7CisJCQkJZHcyMTB4X29wX3J3KGRldiwgMHhjMiwgMCwgMCwgJnJlc2V0MTZbMF0sIDMsCisJCQkJCQlEVzIxMFhfV1JJVEVfTVNHKTsKKwkJCQlkdzIxMHhfb3BfcncoZGV2LCAweGMzLCAweGQxLCAwLCAmcmVzZXQxNlswXSwgMywKKwkJCQkJCURXMjEwWF9SRUFEX01TRyk7CisJCQkJaWYgKHJlc2V0MTZbMl0gPT0gMHgxMSkgeworCQkJCQlkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9ICZkdzIxMDJfZWFyZGFfaTJjX2FsZ287CisJCQkJCWR3MjEwMl9wcm9wZXJ0aWVzLmFkYXB0ZXItPnR1bmVyX2F0dGFjaCA9ICZkdzIxMDJfZWFyZGFfdHVuZXJfYXR0YWNoOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CiAJCWNhc2UgMHgyMTAxOgotCQkJZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhiYywgMHgwMDMwLCAmcmVzZXQxNlswXSwgMiwKLQkJCQlEVzIxMDJfUkVBRF9NU0cpOwotCQkJZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhiYSwgMHgwMDAwLCAmcmVzZXQxNlswXSwgNywKLQkJCQlEVzIxMDJfUkVBRF9NU0cpOwotCQkJZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhiYSwgMHgwMDAwLCAmcmVzZXQxNlswXSwgNywKLQkJCQlEVzIxMDJfUkVBRF9NU0cpOwotCQkJZHcyMTAyX29wX3J3Ci0JCQkJKGRldiwgMHhiOSwgMHgwMDAwLCAmcmVzZXQxNlswXSwgMiwKLQkJCQlEVzIxMDJfUkVBRF9NU0cpOworCQkJZHcyMTB4X29wX3J3KGRldiwgMHhiYywgMHgwMDMwLCAwLCAmcmVzZXQxNlswXSwgMiwKKwkJCQkJRFcyMTBYX1JFQURfTVNHKTsKKwkJCWR3MjEweF9vcF9ydyhkZXYsIDB4YmEsIDB4MDAwMCwgMCwgJnJlc2V0MTZbMF0sIDcsCisJCQkJCURXMjEwWF9SRUFEX01TRyk7CisJCQlkdzIxMHhfb3BfcncoZGV2LCAweGJhLCAweDAwMDAsIDAsICZyZXNldDE2WzBdLCA3LAorCQkJCQlEVzIxMFhfUkVBRF9NU0cpOworCQkJZHcyMTB4X29wX3J3KGRldiwgMHhiOSwgMHgwMDAwLCAwLCAmcmVzZXQxNlswXSwgMiwKKwkJCQkJRFcyMTBYX1JFQURfTVNHKTsKIAkJCWJyZWFrOwogCQl9CisJCW1zbGVlcCgxMDApOwogCQlrZnJlZShwKTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTM0NSwxMiArNjgzLDEyIEBACiAJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAogCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKIAkuZmlybXdhcmUgPSAiZHZiLXVzYi1kdzIxMDIuZnciLAotCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IGR3MjEwMl9zdGF0ZSksCisJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QgZHcyMTB4X3N0YXRlKSwKIAkubm9fcmVjb25uZWN0ID0gMSwKIAotCS5pMmNfYWxnbyA9ICZkdzIxMDJfaTJjX2FsZ28sCi0JLnJjX2tleV9tYXAgPSBkdzIxMDJfcmNfa2V5cywKLQkucmNfa2V5X21hcF9zaXplID0gQVJSQVlfU0laRShkdzIxMDJfcmNfa2V5cyksCisJLmkyY19hbGdvID0gJmR3MjEwMl9zZXJpdF9pMmNfYWxnbywKKwkucmNfa2V5X21hcCA9IGR3MjEweF9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgPSBBUlJBWV9TSVpFKGR3MjEweF9yY19rZXlzKSwKIAkucmNfaW50ZXJ2YWwgPSAxNTAsCiAJLnJjX3F1ZXJ5ID0gZHcyMTAyX3JjX3F1ZXJ5LAogCkBAIC0zNTgsMTEgKzY5NiwxMiBAQAogCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuZG93bmxvYWRfZmlybXdhcmUgPSBkdzIxMDJfbG9hZF9maXJtd2FyZSwKLQkuYWRhcHRlciA9IHsKKwkucmVhZF9tYWNfYWRkcmVzcyA9IGR3MjEweF9yZWFkX21hY19hZGRyZXNzLAorCQkuYWRhcHRlciA9IHsKIAkJewogCQkJLmZyb250ZW5kX2F0dGFjaCA9IGR3MjEwMl9mcm9udGVuZF9hdHRhY2gsCiAJCQkuc3RyZWFtaW5nX2N0cmwgPSBOVUxMLAotCQkJLnR1bmVyX2F0dGFjaCA9IGR3MjEwMl90dW5lcl9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoID0gTlVMTCwKIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKIAkJCQkuY291bnQgPSA4LApAQCAtMzg4LDExICs3MjcsNjQgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgZHcyMTA0X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1kdzIxMDQuZnciLAorCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IGR3MjEweF9zdGF0ZSksCisJLm5vX3JlY29ubmVjdCA9IDEsCisKKwkuaTJjX2FsZ28gPSAmZHcyMTA0X2kyY19hbGdvLAorCS5yY19rZXlfbWFwID0gZHcyMTB4X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZHcyMTB4X3JjX2tleXMpLAorCS5yY19pbnRlcnZhbCA9IDE1MCwKKwkucmNfcXVlcnkgPSBkdzIxMDJfcmNfcXVlcnksCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDgxLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkubnVtX2FkYXB0ZXJzID0gMSwKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBkdzIxMDJfbG9hZF9maXJtd2FyZSwKKwkucmVhZF9tYWNfYWRkcmVzcyA9IGR3MjEweF9yZWFkX21hY19hZGRyZXNzLAorCS5hZGFwdGVyID0geworCQl7CisJCQkuZnJvbnRlbmRfYXR0YWNoID0gZHcyMTA0X2Zyb250ZW5kX2F0dGFjaCwKKwkJCS5zdHJlYW1pbmdfY3RybCA9IE5VTEwsCisJCQkvKi50dW5lcl9hdHRhY2ggPSBkdzIxMDRfdHVuZXJfYXR0YWNoLCovCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gOCwKKwkJCQkuZW5kcG9pbnQgPSAweDgyLAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX0KKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAiRFZCV29ybGQgRFcyMTA0IFVTQjIuMCIsCisJCQl7JmR3MjEwMl90YWJsZVsyXSwgTlVMTH0sCisJCQl7TlVMTH0sCisJCX0sCisJCXsgIlRlVmlpIFM2NTAgVVNCMi4wIiwKKwkJCXsmZHcyMTAyX3RhYmxlWzNdLCBOVUxMfSwKKwkJCXtOVUxMfSwKKwkJfSwKKwl9Cit9OworCiBzdGF0aWMgaW50IGR3MjEwMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZkdzIxMDJfcHJvcGVydGllcywKLQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpOworCWlmICgwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmR3MjEwMl9wcm9wZXJ0aWVzLAorCQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmZHcyMTA0X3Byb3BlcnRpZXMsCisJCQlUSElTX01PRFVMRSwgTlVMTCwgYWRhcHRlcl9ucikpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZHcyMTAyX2RyaXZlciA9IHsKQEAgLTQyMCw2ICs4MTIsNiBAQAogbW9kdWxlX2V4aXQoZHcyMTAyX21vZHVsZV9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiSWdvciBNLiBMaXBsaWFuaW4gKGMpIGxpcGxpYW5pbkBtZS5ieSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIERWQldvcmxkIERWQi1TIDIxMDEgMjEwMiBVU0IyLjAgZGV2aWNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgRFZCV29ybGQgRFZCLVMgMjEwMSwgMjEwMiwgRFZCLVMyIDIxMDQgVVNCMi4wIGRldmljZSIpOwogTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmgKaW5kZXggN2EzMTBmOS4uZTMzNzA3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5oCkBAIC00LDYgKzQsNSBAQAogI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggImR3MjEwMiIKICNpbmNsdWRlICJkdmItdXNiLmgiCiAKLWV4dGVybiBpbnQgZHZiX3VzYl9kdzIxMDJfZGVidWc7CiAjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl9kdzIxMDJfZGVidWcsIDB4MDIsIGFyZ3MpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggN2RiYjRhMi4uOTZiOTNlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTQzLDYgKzQzLDIwIEBACiAJaGVscAogCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX1NUVjAyODgKKwl0cmlzdGF0ZSAiU1QgU1RWMDI4OCBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCitjb25maWcgRFZCX1NUQjYwMDAKKwl0cmlzdGF0ZSAiU1QgU1RCNjAwMCBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwkgIGhlbHAKKwkgIEEgRFZCLVMgc2lsaWNvbiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIHR1bmVyLgorCiBjb25maWcgRFZCX1NUVjAyOTkKIAl0cmlzdGF0ZSAiU1QgU1RWMDI5OSBiYXNlZCIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQwpAQCAtOTIsNiArMTA2LDIwIEBACiAJaGVscAogCSAgQSBEVkItUyBQTEwgY2hpcC4KIAorY29uZmlnIERWQl9DWDI0MTE2CisJdHJpc3RhdGUgIkNvbmV4YW50IENYMjQxMTYgYmFzZWQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgRFZCLVMvUzIgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKworY29uZmlnIERWQl9TSTIxWFgKKwl0cmlzdGF0ZSAiU2lsaWNvbiBMYWJzIFNJMjFYWCBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCiBjb21tZW50ICJEVkItVCAodGVycmVzdHJpYWwpIGZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKQEAgLTM4NSw0ICs0MTMsMjMgQEAKIAloZWxwCiAJICBBbiBTRUMgY29udHJvbCBjaGlwLgogCitjb25maWcgRFZCX0xHUzhHTDUKKwl0cmlzdGF0ZSAiU2lsaWNvbiBMZWdlbmQgTEdTLThHTDUgZGVtb2R1bGF0b3IgKE9GRE0pIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIERNQi1USCB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCitjb21tZW50ICJUb29scyB0byBkZXZlbG9wIG5ldyBmcm9udGVuZHMiCisKK2NvbmZpZyBEVkJfRFVNTVlfRkUKKwl0cmlzdGF0ZSAiRHVtbXkgZnJvbnRlbmQgZHJpdmVyIgorCWRlZmF1bHQgbgorCitjb25maWcgRFZCX0FGOTAxMworCXRyaXN0YXRlICJBZmF0ZWNoIEFGOTAxMyBkZW1vZHVsYXRvciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggMDI4ZGE1NS4uYWJhNzlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtNDgsMyArNDgsMTAgQEAKIG9iai0kKENPTkZJR19EVkJfQVU4NTIyKSArPSBhdTg1MjIubwogb2JqLSQoQ09ORklHX0RWQl9UREExMDA0OCkgKz0gdGRhMTAwNDgubwogb2JqLSQoQ09ORklHX0RWQl9TNUgxNDExKSArPSBzNWgxNDExLm8KK29iai0kKENPTkZJR19EVkJfTEdTOEdMNSkgKz0gbGdzOGdsNS5vCitvYmotJChDT05GSUdfRFZCX0RVTU1ZX0ZFKSArPSBkdmJfZHVtbXlfZmUubworb2JqLSQoQ09ORklHX0RWQl9BRjkwMTMpICs9IGFmOTAxMy5vCitvYmotJChDT05GSUdfRFZCX0NYMjQxMTYpICs9IGN4MjQxMTYubworb2JqLSQoQ09ORklHX0RWQl9TSTIxWFgpICs9IHNpMjF4eC5vCitvYmotJChDT05GSUdfRFZCX1NUVjAyODgpICs9IHN0djAyODgubworb2JqLSQoQ09ORklHX0RWQl9TVEI2MDAwKSArPSBzdGI2MDAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMxMDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5jCkBAIC0wLDAgKzEsMTY4NSBAQAorLyoKKyAqIERWQiBVU0IgTGludXggZHJpdmVyIGZvciBBZmF0ZWNoIEFGOTAxNSBEVkItVCBVU0IyLjAgcmVjZWl2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogVGhhbmtzIHRvIEFmYXRlY2ggd2hvIGtpbmRseSBwcm92aWRlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJhZjkwMTNfcHJpdi5oIgorI2luY2x1ZGUgImFmOTAxMy5oIgorCitpbnQgYWY5MDEzX2RlYnVnOworCitzdHJ1Y3QgYWY5MDEzX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCisJc3RydWN0IGFmOTAxM19jb25maWcgY29uZmlnOworCisJdTE2IHNpZ25hbF9zdHJlbmd0aDsKKwl1MzIgYmVyOworCXUzMiB1Y2Jsb2NrczsKKwl1MTYgc25yOworCXUzMiBmcmVxdWVuY3k7CisJdW5zaWduZWQgbG9uZyBuZXh0X3N0YXRpc3RpY3NfY2hlY2s7Cit9OworCitzdGF0aWMgdTggcmVnbWFza1s4XSA9IHsgMHgwMSwgMHgwMywgMHgwNywgMHgwZiwgMHgxZiwgMHgzZiwgMHg3ZiwgMHhmZiB9OworCitzdGF0aWMgaW50IGFmOTAxM193cml0ZV9yZWdzKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLCB1OCBtYm94LCB1MTYgcmVnLAorCXU4ICp2YWwsIHU4IGxlbikKK3sKKwl1OCBidWZbMytsZW5dOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsCisJCS5mbGFncyA9IDAsCisJCS5sZW4gPSBzaXplb2YoYnVmKSwKKwkJLmJ1ZiA9IGJ1ZiB9OworCisJYnVmWzBdID0gcmVnID4+IDg7CisJYnVmWzFdID0gcmVnICYgMHhmZjsKKwlidWZbMl0gPSBtYm94OworCW1lbWNweSgmYnVmWzNdLCB2YWwsIGxlbik7CisKKwlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpICE9IDEpIHsKKwkJd2FybigiSTJDIHdyaXRlIGZhaWxlZCByZWc6JTA0eCBsZW46JWQiLCByZWcsIGxlbik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZjkwMTNfd3JpdGVfb2ZkbV9yZWdzKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1OCAqdmFsLAorCXU4IGxlbikKK3sKKwl1OCBtYm94ID0gKDEgPDwgMCl8KDEgPDwgMSl8KChsZW4gLSAxKSA8PCAyKXwoMCA8PCA2KXwoMCA8PCA3KTsKKwlyZXR1cm4gYWY5MDEzX3dyaXRlX3JlZ3Moc3RhdGUsIG1ib3gsIHJlZywgdmFsLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFmOTAxM193cml0ZV9vZnNtX3JlZ3Moc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUsIHUxNiByZWcsIHU4ICp2YWwsCisJdTggbGVuKQoreworCXU4IG1ib3ggPSAoMSA8PCAwKXwoMSA8PCAxKXwoKGxlbiAtIDEpIDw8IDIpfCgxIDw8IDYpfCgxIDw8IDcpOworCXJldHVybiBhZjkwMTNfd3JpdGVfcmVncyhzdGF0ZSwgbWJveCwgcmVnLCB2YWwsIGxlbik7Cit9CisKKy8qIHdyaXRlIHNpbmdsZSByZWdpc3RlciAqLworc3RhdGljIGludCBhZjkwMTNfd3JpdGVfcmVnKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIGFmOTAxM193cml0ZV9vZmRtX3JlZ3Moc3RhdGUsIHJlZywgJnZhbCwgMSk7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IGFmOTAxM19yZWFkX3JlZyhzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSwgdTE2IHJlZywgdTggKnZhbCkKK3sKKwl1OCBvYnVmWzNdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiwgMCB9OworCXU4IGlidWZbMV07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7CisJCQkuYWRkciA9IHN0YXRlLT5jb25maWcuZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gc2l6ZW9mKG9idWYpLAorCQkJLmJ1ZiA9IG9idWYKKwkJfSwgeworCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSBzaXplb2YoaWJ1ZiksCisJCQkuYnVmID0gaWJ1ZgorCQl9CisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKSAhPSAyKSB7CisJCXdhcm4oIkkyQyByZWFkIGZhaWxlZCByZWc6JTA0eCIsIHJlZyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwkqdmFsID0gaWJ1ZlswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUsIHUxNiByZWcsIHU4IHBvcywKKwl1OCBsZW4sIHU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXU4IHRtcCwgbWFzazsKKworCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgcmVnLCAmdG1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFzayA9IHJlZ21hc2tbbGVuIC0gMV0gPDwgcG9zOworCXRtcCA9ICh0bXAgJiB+bWFzaykgfCAoKHZhbCA8PCBwb3MpICYgbWFzayk7CisKKwlyZXR1cm4gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgcmVnLCB0bXApOworfQorCitzdGF0aWMgaW50IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1OCBwb3MsCisJdTggbGVuLCB1OCAqdmFsKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJcmV0ID0gYWY5MDEzX3JlYWRfcmVnKHN0YXRlLCByZWcsICZ0bXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJKnZhbCA9ICh0bXAgPj4gcG9zKSAmIHJlZ21hc2tbbGVuIC0gMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDEzX3NldF9ncGlvKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLCB1OCBncGlvLCB1OCBncGlvdmFsKQoreworCWludCByZXQ7CisJdTggcG9zOworCXUxNiBhZGRyOworCWRlYl9pbmZvKCIlczogZ3BpbzolZCBncGlvdmFsOiUwMnhcbiIsIF9fZnVuY19fLCBncGlvLCBncGlvdmFsKTsKKworLyogR1BJTzAgJiBHUElPMSAweGQ3MzUKKyAgIEdQSU8yICYgR1BJTzMgMHhkNzM2ICovCisKKwlzd2l0Y2ggKGdwaW8pIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlhZGRyID0gMHhkNzM1OworCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSAzOgorCQlhZGRyID0gMHhkNzM2OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycigiaW52YWxpZCBncGlvOiVkXG4iLCBncGlvKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9OworCisJc3dpdGNoIChncGlvKSB7CisJY2FzZSAwOgorCWNhc2UgMjoKKwkJcG9zID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMzoKKwlkZWZhdWx0OgorCQlwb3MgPSA0OworCQlicmVhazsKKwl9OworCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCBhZGRyLCBwb3MsIDQsIGdwaW92YWwpOworCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGFmOTEzX2Rpdih1MzIgYSwgdTMyIGIsIHUzMiB4KQoreworCXUzMiByID0gMCwgYyA9IDAsIGk7CisJZGViX2luZm8oIiVzOiBhOiVkIGI6JWQgeDolZFxuIiwgX19mdW5jX18sIGEsIGIsIHgpOworCisJaWYgKGEgPiBiKSB7CisJCWMgPSBhIC8gYjsKKwkJYSA9IGEgLSBjICogYjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgeDsgaSsrKSB7CisJCWlmIChhID49IGIpIHsKKwkJCXIgKz0gMTsKKwkJCWEgLT0gYjsKKwkJfQorCQlhIDw8PSAxOworCQlyIDw8PSAxOworCX0KKwlyID0gKGMgPDwgKHUzMil4KSArIHI7CisKKwlkZWJfaW5mbygiJXM6IGE6JWQgYjolZCB4OiVkIHI6JWQgcjoleFxuIiwgX19mdW5jX18sIGEsIGIsIHgsIHIsIHIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGFmOTAxM19zZXRfY29lZmYoc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUsIGZlX2JhbmR3aWR0aF90IGJ3KQoreworCWludCByZXQgPSAwOworCXU4IGkgPSAwOworCXU4IGJ1ZlsyNF07CisJdTMyIG5zX2NvZWZmMV8yMDQ4bnU7CisJdTMyIG5zX2NvZWZmMV84MTkxbnU7CisJdTMyIG5zX2NvZWZmMV84MTkybnU7CisJdTMyIG5zX2NvZWZmMV84MTkzbnU7CisJdTMyIG5zX2NvZWZmMl8yazsKKwl1MzIgbnNfY29lZmYyXzhrOworCisJZGViX2luZm8oIiVzOiBhZGNfY2xvY2s6JWQgYnc6JWRcbiIsIF9fZnVuY19fLAorCQlzdGF0ZS0+Y29uZmlnLmFkY19jbG9jaywgYncpOworCisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLmFkY19jbG9jaykgeworCWNhc2UgMjg4MDA6IC8qIDI4LjgwMCBNSHogKi8KKwkJc3dpdGNoIChidykgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAxZTc5ZTdhOworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDA3OWViNmU7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMDc5ZTc5ZTsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwNzllM2NmOworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDBmM2NmM2Q7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDNjZjNjZjsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAyMzhlMzhlOworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDA4ZTNkNTU7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMDhlMzhlNDsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwOGUzNDcyOworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDExYzcxYzc7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDQ3MWM3MjsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAyOGEyOGEzOworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDBhMjhmM2Q7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMGEyOGEyOTsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwYTI4NTE0OworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDE0NTE0NTE7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDUxNDUxNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIDIwNDgwOiAvKiAyMC40ODAgTUh6ICovCisJCXN3aXRjaCAoYncpIHsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQluc19jb2VmZjFfMjA0OG51ID0gMHgwMmFkYjZkYzsKKwkJCW5zX2NvZWZmMV84MTkxbnUgPSAweDAwYWI3MzEzOworCQkJbnNfY29lZmYxXzgxOTJudSA9IDB4MDBhYjZkYjc7CisJCQluc19jb2VmZjFfODE5M251ID0gMHgwMGFiNjg1YzsKKwkJCW5zX2NvZWZmMl8yayAgICAgPSAweDAxNTZkYjZlOworCQkJbnNfY29lZmYyXzhrICAgICA9IDB4MDA1NWI2ZGM7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCQluc19jb2VmZjFfMjA0OG51ID0gMHgwMzIwMDAwMTsKKwkJCW5zX2NvZWZmMV84MTkxbnUgPSAweDAwYzgwNjQwOworCQkJbnNfY29lZmYxXzgxOTJudSA9IDB4MDBjODAwMDA7CisJCQluc19jb2VmZjFfODE5M251ID0gMHgwMGM3ZjljMDsKKwkJCW5zX2NvZWZmMl8yayAgICAgPSAweDAxOTAwMDAwOworCQkJbnNfY29lZmYyXzhrICAgICA9IDB4MDA2NDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CisJCQluc19jb2VmZjFfMjA0OG51ID0gMHgwMzkyNDkyNjsKKwkJCW5zX2NvZWZmMV84MTkxbnUgPSAweDAwZTQ5OTZlOworCQkJbnNfY29lZmYxXzgxOTJudSA9IDB4MDBlNDkyNDk7CisJCQluc19jb2VmZjFfODE5M251ID0gMHgwMGU0OGIyNTsKKwkJCW5zX2NvZWZmMl8yayAgICAgPSAweDAxYzkyNDkzOworCQkJbnNfY29lZmYyXzhrICAgICA9IDB4MDA3MjQ5MjU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyODAwMDogLyogMjguMDAwIE1IeiAqLworCQlzd2l0Y2ggKGJ3KSB7CisJCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQkJbnNfY29lZmYxXzIwNDhudSA9IDB4MDFmNThkMTA7CisJCQluc19jb2VmZjFfODE5MW51ID0gMHgwMDdkNjcyZjsKKwkJCW5zX2NvZWZmMV84MTkybnUgPSAweDAwN2Q2MzQ0OworCQkJbnNfY29lZmYxXzgxOTNudSA9IDB4MDA3ZDVmNTk7CisJCQluc19jb2VmZjJfMmsgICAgID0gMHgwMGZhYzY4ODsKKwkJCW5zX2NvZWZmMl84ayAgICAgPSAweDAwM2ViMWEyOworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQkJbnNfY29lZmYxXzIwNDhudSA9IDB4MDI0OTI0OTI7CisJCQluc19jb2VmZjFfODE5MW51ID0gMHgwMDkyNGRiNzsKKwkJCW5zX2NvZWZmMV84MTkybnUgPSAweDAwOTI0OTI1OworCQkJbnNfY29lZmYxXzgxOTNudSA9IDB4MDA5MjQ0OTI7CisJCQluc19jb2VmZjJfMmsgICAgID0gMHgwMTI0OTI0OTsKKwkJCW5zX2NvZWZmMl84ayAgICAgPSAweDAwNDkyNDkyOworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJbnNfY29lZmYxXzIwNDhudSA9IDB4MDI5Y2JjMTU7CisJCQluc19jb2VmZjFfODE5MW51ID0gMHgwMGE3MzQzZjsKKwkJCW5zX2NvZWZmMV84MTkybnUgPSAweDAwYTcyZjA1OworCQkJbnNfY29lZmYxXzgxOTNudSA9IDB4MDBhNzI5Y2M7CisJCQluc19jb2VmZjJfMmsgICAgID0gMHgwMTRlNWUwYTsKKwkJCW5zX2NvZWZmMl84ayAgICAgPSAweDAwNTM5NzgzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgMjUwMDA6IC8qIDI1LjAwMCBNSHogKi8KKwkJc3dpdGNoIChidykgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAyMzFiY2I1OworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDA4YzczOTE7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMDhjNmYyZDsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwOGM2YWNhOworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDExOGRlNWI7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDQ2Mzc5NzsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAyOGY1YzI5OworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDBhM2RjMjk7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMGEzZDcwYTsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwYTNkMWVjOworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDE0N2FlMTQ7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDUxZWI4NTsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCW5zX2NvZWZmMV8yMDQ4bnUgPSAweDAyZWNmYjlkOworCQkJbnNfY29lZmYxXzgxOTFudSA9IDB4MDBiYjQ0YzE7CisJCQluc19jb2VmZjFfODE5Mm51ID0gMHgwMGJiM2VlNzsKKwkJCW5zX2NvZWZmMV84MTkzbnUgPSAweDAwYmIzOTBkOworCQkJbnNfY29lZmYyXzJrICAgICA9IDB4MDE3NjdkY2U7CisJCQluc19jb2VmZjJfOGsgICAgID0gMHgwMDVkOWY3NDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoImludmFsaWQgeHRhbCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJldCkgeworCQllcnIoImludmFsaWQgYmFuZHdpZHRoIik7CisJCXJldHVybiByZXQ7CisJfQorCisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYxXzIwNDhudSAmIDB4MDMwMDAwMDApID4+IDI0KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfMjA0OG51ICYgMHgwMGZmMDAwMCkgPj4gMTYpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMV8yMDQ4bnUgJiAweDAwMDBmZjAwKSA+PiA4KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfMjA0OG51ICYgMHgwMDAwMDBmZikpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMl8yayAgICAgJiAweDAxYzAwMDAwKSA+PiAyMik7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYyXzJrICAgICAmIDB4MDAzZmMwMDApID4+IDE0KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjJfMmsgICAgICYgMHgwMDAwM2ZjMCkgPj4gNik7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYyXzJrICAgICAmIDB4MDAwMDAwM2YpKTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfODE5MW51ICYgMHgwMzAwMDAwMCkgPj4gMjQpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMV84MTkxbnUgJiAweDAwZmZjMDAwKSA+PiAxNik7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYxXzgxOTFudSAmIDB4MDAwMGZmMDApID4+IDgpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMV84MTkxbnUgJiAweDAwMDAwMGZmKSk7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYxXzgxOTJudSAmIDB4MDMwMDAwMDApID4+IDI0KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfODE5Mm51ICYgMHgwMGZmYzAwMCkgPj4gMTYpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMV84MTkybnUgJiAweDAwMDBmZjAwKSA+PiA4KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfODE5Mm51ICYgMHgwMDAwMDBmZikpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMV84MTkzbnUgJiAweDAzMDAwMDAwKSA+PiAyNCk7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYxXzgxOTNudSAmIDB4MDBmZmMwMDApID4+IDE2KTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjFfODE5M251ICYgMHgwMDAwZmYwMCkgPj4gOCk7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYxXzgxOTNudSAmIDB4MDAwMDAwZmYpKTsKKwlidWZbaSsrXSA9ICh1OCkgKChuc19jb2VmZjJfOGsgICAgICYgMHgwMWMwMDAwMCkgPj4gMjIpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMl84ayAgICAgJiAweDAwM2ZjMDAwKSA+PiAxNCk7CisJYnVmW2krK10gPSAodTgpICgobnNfY29lZmYyXzhrICAgICAmIDB4MDAwMDNmYzApID4+IDYpOworCWJ1ZltpKytdID0gKHU4KSAoKG5zX2NvZWZmMl84ayAgICAgJiAweDAwMDAwMDNmKSk7CisKKwlkZWJfaW5mbygiJXM6IGNvZWZmOiIsIF9fZnVuY19fKTsKKwlkZWJ1Z19kdW1wKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRlYl9pbmZvKTsKKworCS8qIHByb2dyYW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnKHN0YXRlLCAweGFlMDAgKyBpLCBidWZbaV0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfc2V0X2FkY19jdHJsKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisJdTggYnVmWzNdLCB0bXAsIGk7CisJdTMyIGFkY19jdzsKKworCWRlYl9pbmZvKCIlczogYWRjX2Nsb2NrOiVkXG4iLCBfX2Z1bmNfXywgc3RhdGUtPmNvbmZpZy5hZGNfY2xvY2spOworCisJLyogYWRjIGZyZXF1ZW5jeSB0eXBlICovCisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLmFkY19jbG9jaykgeworCWNhc2UgMjg4MDA6IC8qIDI4LjgwMCBNSHogKi8KKwkJdG1wID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyMDQ4MDogLyogMjAuNDgwIE1IeiAqLworCQl0bXAgPSAxOworCQlicmVhazsKKwljYXNlIDI4MDAwOiAvKiAyOC4wMDAgTUh6ICovCisJCXRtcCA9IDI7CisJCWJyZWFrOworCWNhc2UgMjUwMDA6IC8qIDI1LjAwMCBNSHogKi8KKwkJdG1wID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJpbnZhbGlkIHh0YWwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWRjX2N3ID0gYWY5MTNfZGl2KHN0YXRlLT5jb25maWcuYWRjX2Nsb2NrKjEwMDAsIDEwMDAwMDB1bCwgMTl1bCk7CisKKwlidWZbMF0gPSAodTgpICgoYWRjX2N3ICYgMHgwMDAwMDBmZikpOworCWJ1ZlsxXSA9ICh1OCkgKChhZGNfY3cgJiAweDAwMDBmZjAwKSA+PiA4KTsKKwlidWZbMl0gPSAodTgpICgoYWRjX2N3ICYgMHgwMGZmMDAwMCkgPj4gMTYpOworCisJZGViX2luZm8oIiVzOiBhZGNfY3c6IiwgX19mdW5jX18pOworCWRlYnVnX2R1bXAoYnVmLCBzaXplb2YoYnVmKSwgZGViX2luZm8pOworCisJLyogcHJvZ3JhbSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgaSsrKSB7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4ZDE4MCArIGksIGJ1ZltpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4OWJkMiwgMCwgNCwgdG1wKTsKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDEzX3NldF9mcmVxX2N0cmwoc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUsIGZlX2JhbmR3aWR0aF90IGJ3KQoreworCWludCByZXQ7CisJdTE2IGFkZHI7CisJdTggYnVmWzNdLCBpLCBqOworCXUzMiBhZGNfZnJlcSwgZnJlcV9jdzsKKwlzOCBiZnNfc3BlY19pbnY7CisJaW50IGlmX3NhbXBsZV9mcmVxOworCisJZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworCQlpZiAoaiA9PSAwKSB7CisJCQlhZGRyID0gMHhkMTQwOyAvKiBmY3cgbm9ybWFsICovCisJCQliZnNfc3BlY19pbnYgPSBzdGF0ZS0+Y29uZmlnLnJmX3NwZWNfaW52ID8gLTEgOiAxOworCQl9IGVsc2UgaWYgKGogPT0gMSkgeworCQkJYWRkciA9IDB4OWJlNzsgLyogZmN3IGR1bW15IHJhbSAqLworCQkJYmZzX3NwZWNfaW52ID0gc3RhdGUtPmNvbmZpZy5yZl9zcGVjX2ludiA/IC0xIDogMTsKKwkJfSBlbHNlIHsKKwkJCWFkZHIgPSAweDliZWE7IC8qIGZjdyBpbnZlcnRlZCAqLworCQkJYmZzX3NwZWNfaW52ID0gc3RhdGUtPmNvbmZpZy5yZl9zcGVjX2ludiA/IDEgOiAtMTsKKwkJfQorCisJCWFkY19mcmVxICAgICAgID0gc3RhdGUtPmNvbmZpZy5hZGNfY2xvY2sgKiAxMDAwOworCQlpZl9zYW1wbGVfZnJlcSA9IHN0YXRlLT5jb25maWcudHVuZXJfaWYgKiAxMDAwOworCisJCS8qIFREQTE4MjcxIHVzZXMgZGlmZmVyZW50IHNhbXBsaW5nIGZyZXEgZm9yIGV2ZXJ5IGJ3ICovCisJCWlmIChzdGF0ZS0+Y29uZmlnLnR1bmVyID09IEFGOTAxM19UVU5FUl9UREExODI3MSkgeworCQkJc3dpdGNoIChidykgeworCQkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQkJaWZfc2FtcGxlX2ZyZXEgPSAzMzAwMDAwOyAvKiAzLjMgTUh6ICovCisJCQkJYnJlYWs7CisJCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCQlpZl9zYW1wbGVfZnJlcSA9IDM4MDAwMDA7IC8qIDMuOCBNSHogKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJZGVmYXVsdDoKKwkJCQlpZl9zYW1wbGVfZnJlcSA9IDQzMDAwMDA7IC8qIDQuMyBNSHogKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXdoaWxlIChpZl9zYW1wbGVfZnJlcSA+IChhZGNfZnJlcSAvIDIpKQorCQkJaWZfc2FtcGxlX2ZyZXEgPSBpZl9zYW1wbGVfZnJlcSAtIGFkY19mcmVxOworCisJCWlmIChpZl9zYW1wbGVfZnJlcSA+PSAwKQorCQkJYmZzX3NwZWNfaW52ID0gYmZzX3NwZWNfaW52ICogKC0xKTsKKwkJZWxzZQorCQkJaWZfc2FtcGxlX2ZyZXEgPSBpZl9zYW1wbGVfZnJlcSAqICgtMSk7CisKKwkJZnJlcV9jdyA9IGFmOTEzX2RpdihpZl9zYW1wbGVfZnJlcSwgYWRjX2ZyZXEsIDIzdWwpOworCisJCWlmIChiZnNfc3BlY19pbnYgPT0gLTEpCisJCQlmcmVxX2N3ID0gMHgwMDgwMDAwMCAtIGZyZXFfY3c7CisKKwkJYnVmWzBdID0gKHU4KSAoKGZyZXFfY3cgJiAweDAwMDAwMGZmKSk7CisJCWJ1ZlsxXSA9ICh1OCkgKChmcmVxX2N3ICYgMHgwMDAwZmYwMCkgPj4gOCk7CisJCWJ1ZlsyXSA9ICh1OCkgKChmcmVxX2N3ICYgMHgwMDdmMDAwMCkgPj4gMTYpOworCisKKwkJZGViX2luZm8oIiVzOiBmcmVxX2N3OiIsIF9fZnVuY19fKTsKKwkJZGVidWdfZHVtcChidWYsIHNpemVvZihidWYpLCBkZWJfaW5mbyk7CisKKwkJLyogcHJvZ3JhbSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgYWRkcisrLCBidWZbaV0pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJfQorZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfc2V0X29mZG1fcGFyYW1zKHN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlLAorCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4ICphdXRvX21vZGUpCit7CisJaW50IHJldDsKKwl1OCBpLCBidWZbM10gPSB7MCwgMCwgMH07CisJKmF1dG9fbW9kZSA9IDA7IC8qIHNldCBpZiBwYXJhbWV0ZXJzIGFyZSByZXF1ZXN0ZWQgdG8gYXV0byBzZXQgKi8KKworCXN3aXRjaCAocGFyYW1zLT50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfQVVUTzoKKwkJKmF1dG9fbW9kZSA9IDE7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV8ySzoKKwkJYnJlYWs7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV84SzoKKwkJYnVmWzBdIHw9ICgxIDw8IDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtcy0+Z3VhcmRfaW50ZXJ2YWwpIHsKKwljYXNlIEdVQVJEX0lOVEVSVkFMX0FVVE86CisJCSphdXRvX21vZGUgPSAxOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzE2OgorCQlidWZbMF0gfD0gKDEgPDwgMik7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV84OgorCQlidWZbMF0gfD0gKDIgPDwgMik7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgorCQlidWZbMF0gfD0gKDMgPDwgMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGFyYW1zLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKKwljYXNlIEhJRVJBUkNIWV9BVVRPOgorCQkqYXV0b19tb2RlID0gMTsKKwljYXNlIEhJRVJBUkNIWV9OT05FOgorCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV8xOgorCQlidWZbMF0gfD0gKDEgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgSElFUkFSQ0hZXzI6CisJCWJ1ZlswXSB8PSAoMiA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSBISUVSQVJDSFlfNDoKKwkJYnVmWzBdIHw9ICgzIDw8IDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJc3dpdGNoIChwYXJhbXMtPmNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIFFBTV9BVVRPOgorCQkqYXV0b19tb2RlID0gMTsKKwljYXNlIFFQU0s6CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQlidWZbMV0gfD0gKDEgPDwgNik7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQlidWZbMV0gfD0gKDIgPDwgNik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFVzZSBIUC4gSG93IGFuZCB3aGljaCBjYXNlIHdlIGNhbiBzd2l0Y2ggdG8gTFA/ICovCisJYnVmWzFdIHw9ICgxIDw8IDQpOworCisJc3dpdGNoIChwYXJhbXMtPmNvZGVfcmF0ZV9IUCkgeworCWNhc2UgRkVDX0FVVE86CisJCSphdXRvX21vZGUgPSAxOworCWNhc2UgRkVDXzFfMjoKKwkJYnJlYWs7CisJY2FzZSBGRUNfMl8zOgorCQlidWZbMl0gfD0gKDEgPDwgMCk7CisJCWJyZWFrOworCWNhc2UgRkVDXzNfNDoKKwkJYnVmWzJdIHw9ICgyIDw8IDApOworCQlicmVhazsKKwljYXNlIEZFQ181XzY6CisJCWJ1ZlsyXSB8PSAoMyA8PCAwKTsKKwkJYnJlYWs7CisJY2FzZSBGRUNfN184OgorCQlidWZbMl0gfD0gKDQgPDwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGFyYW1zLT5jb2RlX3JhdGVfTFApIHsKKwljYXNlIEZFQ19BVVRPOgorCS8qIGlmIEhJRVJBUkNIWV9OT05FIGFuZCBGRUNfTk9ORSB0aGVuIExQIEZFQyBpcyBzZXQgdG8gRkVDX0FVVE8KKwkgICBieSBkdmJfZnJvbnRlbmQuYyBmb3IgY29tcGF0aWJpbGl0eSAqLworCQlpZiAocGFyYW1zLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24gIT0gSElFUkFSQ0hZX05PTkUpCisJCQkqYXV0b19tb2RlID0gMTsKKwljYXNlIEZFQ18xXzI6CisJCWJyZWFrOworCWNhc2UgRkVDXzJfMzoKKwkJYnVmWzJdIHw9ICgxIDw8IDMpOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCWJ1ZlsyXSB8PSAoMiA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSBGRUNfNV82OgorCQlidWZbMl0gfD0gKDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgRkVDXzdfODoKKwkJYnVmWzJdIHw9ICg0IDw8IDMpOworCQlicmVhazsKKwljYXNlIEZFQ19OT05FOgorCQlpZiAocGFyYW1zLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPT0gSElFUkFSQ0hZX0FVVE8pCisJCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtcy0+YmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQlidWZbMV0gfD0gKDEgPDwgMik7CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQlidWZbMV0gfD0gKDIgPDwgMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHByb2dyYW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnKHN0YXRlLCAweGQzYzAgKyBpLCBidWZbaV0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfcmVzZXQoc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUsIHU4IHNsZWVwKQoreworCWludCByZXQ7CisJdTggdG1wLCBpOworCWRlYl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogZW5hYmxlIE9GRE0gcmVzZXQgKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDQxNywgNCwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHN0YXJ0IHJlc2V0IG1lY2hhbmlzbSAqLworCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4YWVmZiwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHJlc2V0IGlzIGRvbmUgd2hlbiBiaXQgMSBpcyBzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTUwOyBpKyspIHsKKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDQxNywgMSwgMSwgJnRtcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlpZiAodG1wKQorCQkJYnJlYWs7IC8qIHJlc2V0IGRvbmUgKi8KKwkJbXNsZWVwKDEwKTsKKwl9CisJaWYgKCF0bXApCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogZG9uJ3QgY2xlYXIgcmVzZXQgd2hlbiBnb2luZyB0byBzbGVlcCAqLworCWlmICghc2xlZXApIHsKKwkJLyogY2xlYXIgT0ZETSByZXNldCAqLworCQlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDQxNywgMSwgMSwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCS8qIGRpc2FibGUgT0ZETSByZXNldCAqLworCQlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDQxNywgNCwgMSwgMCk7CisJfQorZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfcG93ZXJfY3RybChzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSwgdTggb25vZmYpCit7CisJaW50IHJldDsKKwlkZWJfaW5mbygiJXM6IG9ub2ZmOiVkXG4iLCBfX2Z1bmNfXywgb25vZmYpOworCisJaWYgKG9ub2ZmKSB7CisJCS8qIHBvd2VyIG9uICovCisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNzNhLCAzLCAxLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNDE3LCAxLCAxLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNDE3LCA0LCAxLCAwKTsKKwl9IGVsc2UgeworCQkvKiBwb3dlciBvZmYgKi8KKwkJcmV0ID0gYWY5MDEzX3Jlc2V0KHN0YXRlLCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNzNhLCAzLCAxLCAxKTsKKwl9CitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxM19sb2NrX2xlZChzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSwgdTggb25vZmYpCit7CisJZGViX2luZm8oIiVzOiBvbm9mZjolZFxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCXJldHVybiBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDczMCwgMCwgMSwgb25vZmYpOworfQorCitzdGF0aWMgaW50IGFmOTAxM19zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IGF1dG9fbW9kZTsgLyogYXV0byBzZXQgVFBTICovCisKKwlkZWJfaW5mbygiJXM6IGZyZXE6JWQgYnc6JWRcbiIsIF9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSwKKwkJcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKTsKKworCXN0YXRlLT5mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKKworCS8qIHByb2dyYW0gQ0ZPRSBjb2VmZmljaWVudHMgKi8KKwlyZXQgPSBhZjkwMTNfc2V0X2NvZWZmKHN0YXRlLCBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBwcm9ncmFtIGZyZXF1ZW5jeSBjb250cm9sICovCisJcmV0ID0gYWY5MDEzX3NldF9mcmVxX2N0cmwoc3RhdGUsIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGNsZWFyIFRQUyBsb2NrIGZsYWcgKGludmVydGVkIGZsYWcpICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQzMzAsIDMsIDEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBNUEVHMiBsb2NrIGZsYWcgKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDUwNywgNiwgMSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGVtcHR5IGNoYW5uZWwgZnVuY3Rpb24gKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4OWJmZSwgMCwgMSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGVtcHR5IERWQi1UIGNoYW5uZWwgZnVuY3Rpb24gKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4OWJjMiwgMCwgMSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHByb2dyYW0gdHVuZXIgKi8KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW1zKTsKKworCS8qIHByb2dyYW0gVFBTIGFuZCBiYW5kd2lkdGgsIGNoZWNrIGlmIGF1dG8gbW9kZSBuZWVkZWQgKi8KKwlyZXQgPSBhZjkwMTNfc2V0X29mZG1fcGFyYW1zKHN0YXRlLCAmcGFyYW1zLT51Lm9mZG0sICZhdXRvX21vZGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoYXV0b19tb2RlKSB7CisJCS8qIGNsZWFyIGVhc3kgbW9kZSBmbGFnICovCisJCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4YWVmZCwgMCk7CisJCWRlYl9pbmZvKCIlczogYXV0byBUUFNcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQkvKiBzZXQgZWFzeSBtb2RlIGZsYWcgKi8KKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHhhZWZkLCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4YWVmZSwgMCk7CisJCWRlYl9pbmZvKCIlczogbWFudWFsIFRQU1xuIiwgX19mdW5jX18pOworCX0KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogZXZlcnl0aGluZyBpcyBzZXQsIGxldHMgdHJ5IHRvIHJlY2VpdmUgY2hhbm5lbCAtIE9GU00gR08hICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHhmZmZmLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxM19nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldDsKKwl1OCBpLCBidWZbM107CisJZGViX2luZm8oIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiByZWFkIFRQUyByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHhkM2MwICsgaSwgJmJ1ZltpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCXN3aXRjaCAoKGJ1ZlsxXSA+PiA2KSAmIDMpIHsKKwljYXNlIDA6CisJCXAtPnUub2ZkbS5jb25zdGVsbGF0aW9uID0gUVBTSzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IFFBTV8xNjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IFFBTV82NDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICgoYnVmWzBdID4+IDApICYgMykgeworCWNhc2UgMDoKKwkJcC0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfMks7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcC0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfOEs7CisJfQorCisJc3dpdGNoICgoYnVmWzBdID4+IDIpICYgMykgeworCWNhc2UgMDoKKwkJcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV8zMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzE2OworCQlicmVhazsKKwljYXNlIDI6CisJCXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMXzFfODsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzQ7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoKGJ1ZlswXSA+PiA0KSAmIDcpIHsKKwljYXNlIDA6CisJCXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwLT51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uID0gSElFUkFSQ0hZXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcC0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV8yOworCQlicmVhazsKKwljYXNlIDM6CisJCXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfNDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICgoYnVmWzJdID4+IDApICYgNykgeworCWNhc2UgMDoKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IEZFQ18xXzI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IEZFQ18yXzM7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IEZFQ18zXzQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IEZFQ181XzY7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IEZFQ183Xzg7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoKGJ1ZlsyXSA+PiAzKSAmIDcpIHsKKwljYXNlIDA6CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIDE6CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfMl8zOworCQlicmVhazsKKwljYXNlIDI6CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIDM6CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIDQ6CisJCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfN184OworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChidWZbMV0gPj4gMikgJiAzKSB7CisJY2FzZSAwOgorCQlwLT51Lm9mZG0uYmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQlicmVhazsKKwljYXNlIDE6CisJCXAtPnUub2ZkbS5iYW5kd2lkdGggPSBCQU5EV0lEVEhfN19NSFo7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcC0+dS5vZmRtLmJhbmR3aWR0aCA9IEJBTkRXSURUSF84X01IWjsKKwkJYnJlYWs7CisJfQorCisJcC0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX0FVVE87CisJcC0+ZnJlcXVlbmN5ID0gc3RhdGUtPmZyZXF1ZW5jeTsKKworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfdXBkYXRlX2Jlcl91bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IGJ1ZlszXSwgaTsKKwl1MzIgZXJyb3JfYml0X2NvdW50ID0gMDsKKwl1MzIgdG90YWxfYml0X2NvdW50ID0gMDsKKwl1MzIgYWJvcnRfcGFja2V0X2NvdW50ID0gMDsKKworCXN0YXRlLT5iZXIgPSAwOworCisJLyogY2hlY2sgaWYgZXJyb3IgYml0IGNvdW50IGlzIHJlYWR5ICovCisJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDM5MSwgNCwgMSwgJmJ1ZlswXSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlpZiAoIWJ1ZlswXSkKKwkJZ290byBleGl0OworCisJLyogZ2V0IFJTRCBwYWNrZXQgYWJvcnQgY291bnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHhkMzhhICsgaSwgJmJ1ZltpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwlhYm9ydF9wYWNrZXRfY291bnQgPSAoYnVmWzFdIDw8IDgpICsgYnVmWzBdOworCisJLyogZ2V0IGVycm9yIGJpdCBjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnKHN0YXRlLCAweGQzODcgKyBpLCAmYnVmW2ldKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCWVycm9yX2JpdF9jb3VudCA9IChidWZbMl0gPDwgMTYpICsgKGJ1ZlsxXSA8PCA4KSArIGJ1ZlswXTsKKwllcnJvcl9iaXRfY291bnQgPSBlcnJvcl9iaXRfY291bnQgLSBhYm9ydF9wYWNrZXRfY291bnQgKiA4ICogODsKKworCS8qIGdldCB1c2VkIFJTRCBjb3VudGluZyBwZXJpb2QgKDEwMDAwIFJTRCBwYWNrZXRzIHVzZWQpICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWcoc3RhdGUsIDB4ZDM4NSArIGksICZidWZbaV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisJdG90YWxfYml0X2NvdW50ID0gKGJ1ZlsxXSA8PCA4KSArIGJ1ZlswXTsKKwl0b3RhbF9iaXRfY291bnQgPSB0b3RhbF9iaXRfY291bnQgLSBhYm9ydF9wYWNrZXRfY291bnQ7CisJdG90YWxfYml0X2NvdW50ID0gdG90YWxfYml0X2NvdW50ICogMjA0ICogODsKKworCWlmICh0b3RhbF9iaXRfY291bnQpCisJCXN0YXRlLT5iZXIgPSBlcnJvcl9iaXRfY291bnQgKiAxMDAwMDAwMDAwIC8gdG90YWxfYml0X2NvdW50OworCisJc3RhdGUtPnVjYmxvY2tzICs9IGFib3J0X3BhY2tldF9jb3VudDsKKworCWRlYl9pbmZvKCIlczogZXJyIGJpdHM6JWQgdG90YWwgYml0czolZCBhYm9ydCBjb3VudDolZFxuIiwgX19mdW5jX18sCisJCWVycm9yX2JpdF9jb3VudCwgdG90YWxfYml0X2NvdW50LCBhYm9ydF9wYWNrZXRfY291bnQpOworCisJLyogc2V0IEJFUiBjb3VudGluZyByYW5nZSAqLworCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4ZDM4NSwgMTAwMDAgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4ZDM4NiwgMTAwMDAgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwkvKiByZXNldCBhbmQgc3RhcnQgQkVSIGNvdW50ZXIgKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDM5MSwgNCwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworZXhpdDoKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDEzX3VwZGF0ZV9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IGJ1ZlszXSwgaSwgbGVuOworCXUzMiBxdWFudCA9IDA7CisJc3RydWN0IHNucl90YWJsZSAqc25yX3RhYmxlOworCisJLyogY2hlY2sgaWYgcXVhbnRpemVyIHJlYWR5IChmb3Igc25yKSAqLworCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQyZTEsIDMsIDEsICZidWZbMF0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJaWYgKGJ1ZlswXSkgeworCQkvKiBxdWFudGl6ZXIgcmVhZHkgLSByZWFkIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHhkMmUzICsgaSwgJmJ1ZltpXSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcXVhbnQgPSAoYnVmWzJdIDw8IDE2KSArIChidWZbMV0gPDwgOCkgKyBidWZbMF07CisKKwkJLyogcmVhZCBjdXJyZW50IGNvbnN0ZWxsYXRpb24gKi8KKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnKHN0YXRlLCAweGQzYzEsICZidWZbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlzd2l0Y2ggKChidWZbMF0gPj4gNikgJiAzKSB7CisJCWNhc2UgMDoKKwkJCWxlbiA9IEFSUkFZX1NJWkUocXBza19zbnJfdGFibGUpOworCQkJc25yX3RhYmxlID0gcXBza19zbnJfdGFibGU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbGVuID0gQVJSQVlfU0laRShxYW0xNl9zbnJfdGFibGUpOworCQkJc25yX3RhYmxlID0gcWFtMTZfc25yX3RhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWxlbiA9IEFSUkFZX1NJWkUocWFtNjRfc25yX3RhYmxlKTsKKwkJCXNucl90YWJsZSA9IHFhbTY0X3Nucl90YWJsZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxlbikgeworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQkJaWYgKHF1YW50IDwgc25yX3RhYmxlW2ldLnZhbCkgeworCQkJCQlzdGF0ZS0+c25yID0gc25yX3RhYmxlW2ldLnNuciAqIDEwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBzZXQgcXVhbnRpemVyIHN1cGVyIGZyYW1lIGNvdW50ICovCisJCXJldCA9IGFmOTAxM193cml0ZV9yZWcoc3RhdGUsIDB4ZDJlMiwgMSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCS8qIGNoZWNrIHF1YW50aXplciBhdmFpbGFiaWxpdHkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCW1zbGVlcCgxMCk7CisJCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHhkMmU2LCAwLCAxLAorCQkJCSZidWZbMF0pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKCFidWZbMF0pCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiByZXNldCBxdWFudGl6ZXIgKi8KKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQyZTEsIDMsIDEsIDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDEzX3VwZGF0ZV9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IHRtcDA7CisJdTggcmZfZ2FpbiwgcmZfNTAsIHJmXzgwLCBpZl9nYWluLCBpZl81MCwgaWZfODA7CisJaW50IHNpZ25hbF9zdHJlbmd0aDsKKworCWRlYl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCisJc3RhdGUtPnNpZ25hbF9zdHJlbmd0aCA9IDA7CisKKwlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHg5YmVlLCAwLCAxLCAmdG1wMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlpZiAodG1wMCkgeworCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWcoc3RhdGUsIDB4OWJiZCwgJnJmXzUwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHg5YmQwLCAmcmZfODApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnKHN0YXRlLCAweDliZTIsICZpZl81MCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWcoc3RhdGUsIDB4OWJlNCwgJmlmXzgwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHhkMDdjLCAmcmZfZ2Fpbik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlyZXQgPSBhZjkwMTNfcmVhZF9yZWcoc3RhdGUsIDB4ZDA3ZCwgJmlmX2dhaW4pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJc2lnbmFsX3N0cmVuZ3RoID0gKDB4ZmZmZiAvICg5ICogKHJmXzUwICsgaWZfNTApIC0gXAorCQkJMTEgKiAocmZfODAgKyBpZl84MCkpKSAqICgxMCAqIChyZl9nYWluICsgaWZfZ2FpbikgLSBcCisJCQkxMSAqIChyZl84MCArIGlmXzgwKSk7CisJCWlmIChzaWduYWxfc3RyZW5ndGggPCAwKQorCQkJc2lnbmFsX3N0cmVuZ3RoID0gMDsKKwkJZWxzZSBpZiAoc2lnbmFsX3N0cmVuZ3RoID4gMHhmZmZmKQorCQkJc2lnbmFsX3N0cmVuZ3RoID0gMHhmZmZmOworCisJCXN0YXRlLT5zaWduYWxfc3RyZW5ndGggPSBzaWduYWxfc3RyZW5ndGg7CisJfQorCitlcnJvcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxM191cGRhdGVfc3RhdGlzdGljcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgc3RhdGUtPm5leHRfc3RhdGlzdGljc19jaGVjaykpCisJCXJldHVybiAwOworCisJLyogc2V0IG1pbmltdW0gc3RhdGlzdGljIHVwZGF0ZSBpbnRlcnZhbCAqLworCXN0YXRlLT5uZXh0X3N0YXRpc3RpY3NfY2hlY2sgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMjAwKTsKKworCXJldCA9IGFmOTAxM191cGRhdGVfc2lnbmFsX3N0cmVuZ3RoKGZlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxM191cGRhdGVfc25yKGZlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxM191cGRhdGVfYmVyX3VuYyhmZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICpmZXNldHRpbmdzKQoreworCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDgwMDsKKwlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAwOworCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZjkwMTNfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1OCB0bXA7CisJKnN0YXR1cyA9IDA7CisKKwkvKiBUUFMgbG9jayAqLworCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzAsIDMsIDEsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJaWYgKHRtcCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSSB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NJR05BTDsKKworCS8qIE1QRUcyIGxvY2sgKi8KKwlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHhkNTA3LCA2LCAxLCAmdG1wKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCWlmICh0bXApCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKworCWlmICghKnN0YXR1cyAmIEZFX0hBU19TSUdOQUwpIHsKKwkJLyogQUdDIGxvY2sgKi8KKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnX2JpdHMoc3RhdGUsIDB4ZDFhMCwgNiwgMSwgJnRtcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCQlpZiAodG1wKQorCQkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCX0KKworCWlmICghKnN0YXR1cyAmIEZFX0hBU19DQVJSSUVSKSB7CisJCS8qIENGTyBsb2NrICovCisJCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzMsIDcsIDEsICZ0bXApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJaWYgKHRtcCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJfQorCisJaWYgKCEqc3RhdHVzICYgRkVfSEFTX0NBUlJJRVIpIHsKKwkJLyogU0ZPRSBsb2NrICovCisJCXJldCA9IGFmOTAxM19yZWFkX3JlZ19iaXRzKHN0YXRlLCAweGQzMzQsIDYsIDEsICZ0bXApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJaWYgKHRtcCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJfQorCisJcmV0ID0gYWY5MDEzX3VwZGF0ZV9zdGF0aXN0aWNzKGZlKTsKKworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGFmOTAxM19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiZXIpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXJldCA9IGFmOTAxM191cGRhdGVfc3RhdGlzdGljcyhmZSk7CisJKmJlciA9IHN0YXRlLT5iZXI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXJldCA9IGFmOTAxM191cGRhdGVfc3RhdGlzdGljcyhmZSk7CisJKnN0cmVuZ3RoID0gc3RhdGUtPnNpZ25hbF9zdHJlbmd0aDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFmOTAxM19yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXJldCA9IGFmOTAxM191cGRhdGVfc3RhdGlzdGljcyhmZSk7CisJKnNuciA9IHN0YXRlLT5zbnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJcmV0ID0gYWY5MDEzX3VwZGF0ZV9zdGF0aXN0aWNzKGZlKTsKKwkqdWNibG9ja3MgPSBzdGF0ZS0+dWNibG9ja3M7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGFmOTAxM19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCWRlYl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gYWY5MDEzX2xvY2tfbGVkKHN0YXRlLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gYWY5MDEzX3Bvd2VyX2N0cmwoc3RhdGUsIDApOworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZjkwMTNfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQsIGksIGxlbjsKKwl1OCB0bXAwLCB0bXAxOworCXN0cnVjdCByZWdkZXNjICppbml0OworCWRlYl9pbmZvKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogcmVzZXQgT0ZETSAqLworCXJldCA9IGFmOTAxM19yZXNldChzdGF0ZSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHBvd2VyIG9uICovCisJcmV0ID0gYWY5MDEzX3Bvd2VyX2N0cmwoc3RhdGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBlbmFibGUgQURDICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHhkNzNhLCAweGE0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogd3JpdGUgQVBJIHZlcnNpb24gdG8gZmlybXdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0YXRlLT5jb25maWcuYXBpX3ZlcnNpb24pOyBpKyspIHsKKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHg5YmYyICsgaSwKKwkJCXN0YXRlLT5jb25maWcuYXBpX3ZlcnNpb25baV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBwcm9ncmFtIEFEQyBjb250cm9sICovCisJcmV0ID0gYWY5MDEzX3NldF9hZGNfY3RybChzdGF0ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHNldCBJMkMgbWFzdGVyIGNsb2NrICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHhkNDE2LCAweDE0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogc2V0IDE2IGVtYnggKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDcwMCwgMSwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHNldCBubyB0cmlnZ2VyICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQ3MDAsIDIsIDEsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXQgcmVhZC11cGRhdGUgYml0IGZvciBjb25zdGVsbGF0aW9uICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQzNzEsIDEsIDEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBlbmFibGUgRkVDIG1vbml0b3IgKi8KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDM5MiwgMSwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGxvYWQgT0ZTTSBzZXR0aW5ncyAqLworCWRlYl9pbmZvKCIlczogbG9hZCBvZnNtIHNldHRpbmdzXG4iLCBfX2Z1bmNfXyk7CisJbGVuID0gQVJSQVlfU0laRShvZnNtX2luaXQpOworCWluaXQgPSBvZnNtX2luaXQ7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgaW5pdFtpXS5hZGRyLCBpbml0W2ldLnBvcywKKwkJCWluaXRbaV0ubGVuLCBpbml0W2ldLnZhbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCS8qIGxvYWQgdHVuZXIgc3BlY2lmaWMgc2V0dGluZ3MgKi8KKwlkZWJfaW5mbygiJXM6IGxvYWQgdHVuZXIgc3BlY2lmaWMgc2V0dGluZ3NcbiIsIF9fZnVuY19fKTsKKwlzd2l0Y2ggKHN0YXRlLT5jb25maWcudHVuZXIpIHsKKwljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDAzRDoKKwkJbGVuID0gQVJSQVlfU0laRSh0dW5lcl9pbml0X214bDUwMDNkKTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfbXhsNTAwM2Q7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDVEOgorCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDVSOgorCQlsZW4gPSBBUlJBWV9TSVpFKHR1bmVyX2luaXRfbXhsNTAwNSk7CisJCWluaXQgPSB0dW5lcl9pbml0X214bDUwMDU7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX0VOVjc3SDExRDU6CisJCWxlbiA9IEFSUkFZX1NJWkUodHVuZXJfaW5pdF9lbnY3N2gxMWQ1KTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfZW52NzdoMTFkNTsKKwkJYnJlYWs7CisJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwOgorCQlsZW4gPSBBUlJBWV9TSVpFKHR1bmVyX2luaXRfbXQyMDYwKTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfbXQyMDYwOworCQlicmVhazsKKwljYXNlIEFGOTAxM19UVU5FUl9NQzQ0UzgwMzoKKwkJbGVuID0gQVJSQVlfU0laRSh0dW5lcl9pbml0X21jNDRzODAzKTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfbWM0NHM4MDM7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMDoKKwljYXNlIEFGOTAxM19UVU5FUl9RVDEwMTBBOgorCQlsZW4gPSBBUlJBWV9TSVpFKHR1bmVyX2luaXRfcXQxMDEwKTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfcXQxMDEwOworCQlicmVhazsKKwljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjBfMjoKKwkJbGVuID0gQVJSQVlfU0laRSh0dW5lcl9pbml0X210MjA2MF8yKTsKKwkJaW5pdCA9IHR1bmVyX2luaXRfbXQyMDYwXzI7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjcxOgorCQlsZW4gPSBBUlJBWV9TSVpFKHR1bmVyX2luaXRfdGRhMTgyNzEpOworCQlpbml0ID0gdHVuZXJfaW5pdF90ZGExODI3MTsKKwkJYnJlYWs7CisJY2FzZSBBRjkwMTNfVFVORVJfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlsZW4gPSBBUlJBWV9TSVpFKHR1bmVyX2luaXRfdW5rbm93bik7CisJCWluaXQgPSB0dW5lcl9pbml0X3Vua25vd247CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIGluaXRbaV0uYWRkciwgaW5pdFtpXS5wb3MsCisJCQlpbml0W2ldLmxlbiwgaW5pdFtpXS52YWwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBzZXQgVFMgbW9kZSAqLworCWRlYl9pbmZvKCIlczogc2V0dGluZyB0cyBtb2RlXG4iLCBfX2Z1bmNfXyk7CisJdG1wMCA9IDA7IC8qIHBhcmFsbGVsIG1vZGUgKi8KKwl0bXAxID0gMDsgLyogc2VyaWFsIG1vZGUgKi8KKwlzd2l0Y2ggKHN0YXRlLT5jb25maWcub3V0cHV0X21vZGUpIHsKKwljYXNlIEFGOTAxM19PVVRQVVRfTU9ERV9QQVJBTExFTDoKKwkJdG1wMCA9IDE7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX09VVFBVVF9NT0RFX1NFUklBTDoKKwkJdG1wMSA9IDE7CisJCWJyZWFrOworCWNhc2UgQUY5MDEzX09VVFBVVF9NT0RFX1VTQjoKKwkJLyogdXNiIG1vZGUgZm9yIEFGOTAxNSAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDUwMCwgMSwgMSwgdG1wMCk7IC8qIHBhcmFsbGVsICovCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBhZjkwMTNfd3JpdGVfcmVnX2JpdHMoc3RhdGUsIDB4ZDUwMCwgMiwgMSwgdG1wMSk7IC8qIHNlcmlhbCAqLworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBlbmFibGUgbG9jayBsZWQgKi8KKwlyZXQgPSBhZjkwMTNfbG9ja19sZWQoc3RhdGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBhZjkwMTNfb3BzOworCitzdGF0aWMgaW50IGFmOTAxM19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaSwgbGVuLCBwYWNrZXRzLCByZW1haW5kZXIsIHJldDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXUxNiBhZGRyID0gMHg1MTAwOyAvKiBmaXJtd2FyZSBzdGFydCBhZGRyZXNzICovCisJdTE2IGNoZWNrc3VtID0gMDsKKwl1OCB2YWw7CisJdTggZndfcGFyYW1zWzRdOworCXU4ICpkYXRhOworCXU4ICpmd19maWxlID0gQUY5MDEzX0RFRkFVTFRfRklSTVdBUkU7CisKKwltc2xlZXAoMTAwKTsKKwkvKiBjaGVjayB3aGV0aGVyIGZpcm13YXJlIGlzIGFscmVhZHkgcnVubmluZyAqLworCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHg5OGJlLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCWVsc2UKKwkJZGViX2luZm8oIiVzOiBmaXJtd2FyZSBzdGF0dXM6JTAyeFxuIiwgX19mdW5jX18sIHZhbCk7CisKKwlpZiAodmFsID09IDB4MGMpIC8qIGZ3IGlzIHJ1bm5pbmcsIG5vIG5lZWQgZm9yIGRvd25sb2FkICovCisJCWdvdG8gZXhpdDsKKworCWluZm8oImZvdW5kIGEgJyVzJyBpbiBjb2xkIHN0YXRlLCB3aWxsIHRyeSB0byBsb2FkIGEgZmlybXdhcmUiLAorCQlhZjkwMTNfb3BzLmluZm8ubmFtZSk7CisKKwkvKiByZXF1ZXN0IHRoZSBmaXJtd2FyZSwgdGhpcyB3aWxsIGJsb2NrIGFuZCB0aW1lb3V0ICovCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X2ZpbGUsICAmc3RhdGUtPmkyYy0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWVycigiZGlkIG5vdCBmaW5kIHRoZSBmaXJtd2FyZSBmaWxlLiAoJXMpICIKKwkJCSJQbGVhc2Ugc2VlIGxpbnV4L0RvY3VtZW50YXRpb24vZHZiLyBmb3IgbW9yZSBkZXRhaWxzIiBcCisJCQkiIG9uIGZpcm13YXJlLXByb2JsZW1zLiAoJWQpIiwKKwkJCWZ3X2ZpbGUsIHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaW5mbygiZG93bmxvYWRpbmcgZmlybXdhcmUgZnJvbSBmaWxlICclcyciLCBmd19maWxlKTsKKworCS8qIGNhbGMgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemU7IGkrKykKKwkJY2hlY2tzdW0gKz0gZnctPmRhdGFbaV07CisKKwlmd19wYXJhbXNbMF0gPSBjaGVja3N1bSA+PiA4OworCWZ3X3BhcmFtc1sxXSA9IGNoZWNrc3VtICYgMHhmZjsKKwlmd19wYXJhbXNbMl0gPSBmdy0+c2l6ZSA+PiA4OworCWZ3X3BhcmFtc1szXSA9IGZ3LT5zaXplICYgMHhmZjsKKworCS8qIHdyaXRlIGZ3IGNoZWNrc3VtICYgc2l6ZSAqLworCXJldCA9IGFmOTAxM193cml0ZV9vZnNtX3JlZ3Moc3RhdGUsIDB4NTBmYywKKwkJZndfcGFyYW1zLCBzaXplb2YoZndfcGFyYW1zKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZWxlYXNlOworCisJI2RlZmluZSBGV19QQUNLRVRfTUFYX0RBVEEgIDE2CisKKwlwYWNrZXRzID0gZnctPnNpemUgLyBGV19QQUNLRVRfTUFYX0RBVEE7CisJcmVtYWluZGVyID0gZnctPnNpemUgJSBGV19QQUNLRVRfTUFYX0RBVEE7CisJbGVuID0gRldfUEFDS0VUX01BWF9EQVRBOworCWZvciAoaSA9IDA7IGkgPD0gcGFja2V0czsgaSsrKSB7CisJCWlmIChpID09IHBhY2tldHMpICAvKiBzZXQgc2l6ZSBvZiB0aGUgbGFzdCBwYWNrZXQgKi8KKwkJCWxlbiA9IHJlbWFpbmRlcjsKKworCQlkYXRhID0gKHU4ICopKGZ3LT5kYXRhICsgaSAqIEZXX1BBQ0tFVF9NQVhfREFUQSk7CisJCXJldCA9IGFmOTAxM193cml0ZV9vZnNtX3JlZ3Moc3RhdGUsIGFkZHIsIGRhdGEsIGxlbik7CisJCWFkZHIgKz0gRldfUEFDS0VUX01BWF9EQVRBOworCisJCWlmIChyZXQpIHsKKwkJCWVycigiZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkIGF0ICVkIHdpdGggJWQiLCBpLCByZXQpOworCQkJZ290byBlcnJvcl9yZWxlYXNlOworCQl9CisJfQorCisJLyogcmVxdWVzdCBib290IGZpcm13YXJlICovCisJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZyhzdGF0ZSwgMHhlMjA1LCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbGVhc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQltc2xlZXAoMTAwKTsKKworCQkvKiBjaGVjayBmaXJtd2FyZSBzdGF0dXMgKi8KKwkJcmV0ID0gYWY5MDEzX3JlYWRfcmVnKHN0YXRlLCAweDk4YmUsICZ2YWwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZWxlYXNlOworCisJCWRlYl9pbmZvKCIlczogZmlybXdhcmUgc3RhdHVzOiUwMnhcbiIsIF9fZnVuY19fLCB2YWwpOworCisJCWlmICh2YWwgPT0gMHgwYyB8fCB2YWwgPT0gMHgwNCkgLyogc3VjY2VzcyBvciBmYWlsICovCisJCQlicmVhazsKKwl9CisKKwlpZiAodmFsID09IDB4MDQpIHsKKwkJZXJyKCJmaXJtd2FyZSBkaWQgbm90IHJ1biIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgaWYgKHZhbCAhPSAweDBjKSB7CisJCWVycigiZmlybXdhcmUgYm9vdCB0aW1lb3V0Iik7CisJCXJldCA9IC0xOworCX0KKworZXJyb3JfcmVsZWFzZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKK2Vycm9yOgorZXhpdDoKKwlpZiAoIXJldCkKKwkJaW5mbygiZm91bmQgYSAnJXMnIGluIHdhcm0gc3RhdGUuIiwgYWY5MDEzX29wcy5pbmZvLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWY5MDEzX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWRlYl9pbmZvKCIlczogZW5hYmxlOiVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCWlmIChzdGF0ZS0+Y29uZmlnLm91dHB1dF9tb2RlID09IEFGOTAxM19PVVRQVVRfTU9ERV9VU0IpCisJCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNDE3LCAzLCAxLCBlbmFibGUpOworCWVsc2UKKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQ2MDcsIDIsIDEsIGVuYWJsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhZjkwMTNfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgYWY5MDEzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGFmOTAxM19vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmFmOTAxM19hdHRhY2goY29uc3Qgc3RydWN0IGFmOTAxM19jb25maWcgKmNvbmZpZywKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZjkwMTNfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwl1OCBidWZbM10sIGk7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFmOTAxM19zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJLyogc2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnN0YXRlLT5jb25maWcsIGNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhZjkwMTNfY29uZmlnKSk7CisKKwkvKiBjaGlwIHZlcnNpb24gKi8KKwlyZXQgPSBhZjkwMTNfcmVhZF9yZWdfYml0cyhzdGF0ZSwgMHhkNzMzLCA0LCA0LCAmYnVmWzJdKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogUk9NIHZlcnNpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHgxMTZiICsgaSwgJmJ1ZltpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwlkZWJfaW5mbygiJXM6IGNoaXAgdmVyc2lvbjolZCBST00gdmVyc2lvbjolZC4lZFxuIiwgX19mdW5jX18sCisJCWJ1ZlsyXSwgYnVmWzBdLCBidWZbMV0pOworCisJLyogZG93bmxvYWQgZmlybXdhcmUgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy5vdXRwdXRfbW9kZSAhPSBBRjkwMTNfT1VUUFVUX01PREVfVVNCKSB7CisJCXJldCA9IGFmOTAxM19kb3dubG9hZF9maXJtd2FyZShzdGF0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCS8qIGZpcm13YXJlIHZlcnNpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldCA9IGFmOTAxM19yZWFkX3JlZyhzdGF0ZSwgMHg1MTAzICsgaSwgJmJ1ZltpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwlpbmZvKCJmaXJtd2FyZSB2ZXJzaW9uOiVkLiVkLiVkIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKwkvKiBzZXR0aW5ncyBmb3IgbXAyaWYgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy5vdXRwdXRfbW9kZSA9PSBBRjkwMTNfT1VUUFVUX01PREVfVVNCKSB7CisJCS8qIEFGOTAxNSBzcGxpdCBQU0IgdG8gMS41ayArIDAuNWsgKi8KKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQ1MGIsIDIsIDEsIDEpOworCX0gZWxzZSB7CisJCS8qIEFGOTAxMyBjaGFuZ2UgdGhlIG91dHB1dCBiaXQgdG8gZGF0YTcgKi8KKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQ1MDAsIDMsIDEsIDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwkJLyogQUY5MDEzIHNldCBtcGVnIHRvIGZ1bGwgc3BlZWQgKi8KKwkJcmV0ID0gYWY5MDEzX3dyaXRlX3JlZ19iaXRzKHN0YXRlLCAweGQ1MDIsIDQsIDEsIDEpOworCX0KKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmOTAxM193cml0ZV9yZWdfYml0cyhzdGF0ZSwgMHhkNTIwLCA0LCAxLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogc2V0IEdQSU9zICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdGF0ZS0+Y29uZmlnLmdwaW8pOyBpKyspIHsKKwkJcmV0ID0gYWY5MDEzX3NldF9ncGlvKHN0YXRlLCBpLCBzdGF0ZS0+Y29uZmlnLmdwaW9baV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmYWY5MDEzX29wcywKKwkJc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworZXJyb3I6CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChhZjkwMTNfYXR0YWNoKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGFmOTAxM19vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIkFmYXRlY2ggQUY5MDEzIERWQi1UIiwKKwkJLnR5cGUgPSBGRV9PRkRNLAorCQkuZnJlcXVlbmN5X21pbiA9IDE3NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAyNTAwMDAsCisJCS5mcmVxdWVuY3lfdG9sZXJhbmNlID0gMCwKKwkJLmNhcHMgPQorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwKKwkJCUZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwKKwkJCUZFX0NBTl9SRUNPVkVSIHwKKwkJCUZFX0NBTl9NVVRFX1RTCisJfSwKKworCS5yZWxlYXNlID0gYWY5MDEzX3JlbGVhc2UsCisJLmluaXQgPSBhZjkwMTNfaW5pdCwKKwkuc2xlZXAgPSBhZjkwMTNfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBhZjkwMTNfaTJjX2dhdGVfY3RybCwKKworCS5zZXRfZnJvbnRlbmQgPSBhZjkwMTNfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBhZjkwMTNfZ2V0X2Zyb250ZW5kLAorCisJLmdldF90dW5lX3NldHRpbmdzID0gYWY5MDEzX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gYWY5MDEzX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGFmOTAxM19yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBhZjkwMTNfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gYWY5MDEzX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gYWY5MDEzX3JlYWRfdWNibG9ja3MsCit9OworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGFmOTAxM19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworTU9EVUxFX0FVVEhPUigiQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFmYXRlY2ggQUY5MDEzIERWQi1UIGRlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2FmOTAxMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjkwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBEVkIgVVNCIExpbnV4IGRyaXZlciBmb3IgQWZhdGVjaCBBRjkwMTUgRFZCLVQgVVNCMi4wIHJlY2VpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqIFRoYW5rcyB0byBBZmF0ZWNoIHdobyBraW5kbHkgcHJvdmlkZWQgaW5mb3JtYXRpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0FGOTAxM19IXworI2RlZmluZSBfQUY5MDEzX0hfCisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworZW51bSBhZjkwMTNfdHNfbW9kZSB7CisJQUY5MDEzX09VVFBVVF9NT0RFX1BBUkFMTEVMLAorCUFGOTAxM19PVVRQVVRfTU9ERV9TRVJJQUwsCisJQUY5MDEzX09VVFBVVF9NT0RFX1VTQiwgLyogb25seSBmb3IgQUY5MDE1ICovCit9OworCitlbnVtIGFmOTAxM190dW5lciB7CisJQUY5MDEzX1RVTkVSX01YTDUwMDNEICAgPSAgIDMsIC8qIE1heExpbmVhciAqLworCUFGOTAxM19UVU5FUl9NWEw1MDA1RCAgID0gIDEzLCAvKiBNYXhMaW5lYXIgKi8KKwlBRjkwMTNfVFVORVJfTVhMNTAwNVIgICA9ICAzMCwgLyogTWF4TGluZWFyICovCisJQUY5MDEzX1RVTkVSX0VOVjc3SDExRDUgPSAxMjksIC8qIFBhbmFzb25pYyAqLworCUFGOTAxM19UVU5FUl9NVDIwNjAgICAgID0gMTMwLCAvKiBNaWNyb3R1bmUgKi8KKwlBRjkwMTNfVFVORVJfTUM0NFM4MDMgICA9IDEzMywgLyogRnJlZXNjYWxlICovCisJQUY5MDEzX1RVTkVSX1FUMTAxMCAgICAgPSAxMzQsIC8qIFF1YW50ZWsgKi8KKwlBRjkwMTNfVFVORVJfVU5LTk9XTiAgICA9IDE0MCwgLyogZm9yIGNhbiB0dW5lcnMgPyAqLworCUFGOTAxM19UVU5FUl9NVDIwNjBfMiAgID0gMTQ3LCAvKiBNaWNyb3R1bmUgKi8KKwlBRjkwMTNfVFVORVJfVERBMTgyNzEgICA9IDE1NiwgLyogTlhQICovCisJQUY5MDEzX1RVTkVSX1FUMTAxMEEgICAgPSAxNjIsIC8qIFF1YW50ZWsgKi8KK307CisKKy8qIEFGOTAxMy81IEdQSU9zIChtb3N0bHkgZ3Vlc3NlZCkKKyAgIGRlbW9kIzEtZ3BpbyMwIC0gc2V0IGRlbW9kIzIgaTJjLWFkZHIgZm9yIGR1YWwgZGV2aWNlcworICAgZGVtb2QjMS1ncGlvIzEgLSB4dGFsIHNldHRpbmcgKD8pCisgICBkZW1vZCMxLWdwaW8jMyAtIHR1bmVyIzEKKyAgIGRlbW9kIzItZ3BpbyMwIC0gdHVuZXIjMgorICAgZGVtb2QjMi1ncGlvIzEgLSB4dGFsIHNldHRpbmcgKD8pCisqLworI2RlZmluZSBBRjkwMTNfR1BJT19PTiAoMSA8PCAwKQorI2RlZmluZSBBRjkwMTNfR1BJT19FTiAoMSA8PCAxKQorI2RlZmluZSBBRjkwMTNfR1BJT19PICAoMSA8PCAyKQorI2RlZmluZSBBRjkwMTNfR1BJT19JICAoMSA8PCAzKQorCisjZGVmaW5lIEFGOTAxM19HUElPX0xPIChBRjkwMTNfR1BJT19PTnxBRjkwMTNfR1BJT19FTikKKyNkZWZpbmUgQUY5MDEzX0dQSU9fSEkgKEFGOTAxM19HUElPX09OfEFGOTAxM19HUElPX0VOfEFGOTAxM19HUElPX08pCisKKyNkZWZpbmUgQUY5MDEzX0dQSU9fVFVORVJfT04gIChBRjkwMTNfR1BJT19PTnxBRjkwMTNfR1BJT19FTikKKyNkZWZpbmUgQUY5MDEzX0dQSU9fVFVORVJfT0ZGIChBRjkwMTNfR1BJT19PTnxBRjkwMTNfR1BJT19FTnxBRjkwMTNfR1BJT19PKQorCitzdHJ1Y3QgYWY5MDEzX2NvbmZpZyB7CisJLyogZGVtb2R1bGF0b3IncyBJMkMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBmcmVxdWVuY2llcyBpbiBrSHogKi8KKwl1MzIgYWRjX2Nsb2NrOworCisJLyogdHVuZXIgSUQgKi8KKwl1OCB0dW5lcjsKKworCS8qIHR1bmVyIElGICovCisJdTE2IHR1bmVyX2lmOworCisJLyogVFMgZGF0YSBvdXRwdXQgbW9kZSAqLworCXU4IG91dHB1dF9tb2RlOjI7CisKKwkvKiBSRiBzcGVjdHJ1bSBpbnZlcnNpb24gKi8KKwl1OCByZl9zcGVjX2ludjoxOworCisJLyogQVBJIHZlcnNpb24gKi8KKwl1OCBhcGlfdmVyc2lvbls0XTsKKworCS8qIEdQSU9zICovCisJdTggZ3Bpb1s0XTsKK307CisKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9BRjkwMTMpIHx8IFwKKwkoZGVmaW5lZChDT05GSUdfRFZCX0FGOTAxM19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICphZjkwMTNfYXR0YWNoKGNvbnN0IHN0cnVjdCBhZjkwMTNfY29uZmlnICpjb25maWcsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqYWY5MDEzX2F0dGFjaCgKK2NvbnN0IHN0cnVjdCBhZjkwMTNfY29uZmlnICpjb25maWcsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIENPTkZJR19EVkJfQUY5MDEzICovCisKKyNlbmRpZiAvKiBfQUY5MDEzX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hZjkwMTNfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2UyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYWY5MDEzX3ByaXYuaApAQCAtMCwwICsxLDg2OSBAQAorLyoKKyAqIERWQiBVU0IgTGludXggZHJpdmVyIGZvciBBZmF0ZWNoIEFGOTAxNSBEVkItVCBVU0IyLjAgcmVjZWl2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogVGhhbmtzIHRvIEFmYXRlY2ggd2hvIGtpbmRseSBwcm92aWRlZCBpbmZvcm1hdGlvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfQUY5MDEzX1BSSVZfCisjZGVmaW5lIF9BRjkwMTNfUFJJVl8KKworI2RlZmluZSBMT0dfUFJFRklYICJhZjkwMTMiCitleHRlcm4gaW50IGFmOTAxM19kZWJ1ZzsKKworI2RlZmluZSBkcHJpbnRrKHZhciwgbGV2ZWwsIGFyZ3MuLi4pIFwKKwkgICAgZG8geyBpZiAoKHZhciAmIGxldmVsKSkgcHJpbnRrKGFyZ3MpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGRlYnVnX2R1bXAoYiwgbCwgZnVuYykge1wKKwlpbnQgbG9vcF87IFwKKwlmb3IgKGxvb3BfID0gMDsgbG9vcF8gPCBsOyBsb29wXysrKSBcCisJCWZ1bmMoIiUwMnggIiwgYltsb29wX10pOyBcCisJZnVuYygiXG4iKTtcCit9CisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhhZjkwMTNfZGVidWcsIDB4MDEsIGFyZ3MpCisKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIHdhcm4KKyNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorCisjZGVmaW5lIEFGOTAxM19ERUZBVUxUX0ZJUk1XQVJFICAgICAiZHZiLWZlLWFmOTAxMy5mdyIKKworc3RydWN0IHJlZ2Rlc2MgeworCXUxNiBhZGRyOworCXU4ICBwb3M6NDsKKwl1OCAgbGVuOjQ7CisJdTggIHZhbDsKK307CisKK3N0cnVjdCBzbnJfdGFibGUgeworCXUzMiB2YWw7CisJdTggc25yOworfTsKKworLyogUVBTSyBTTlIgbG9va3VwIHRhYmxlICovCitzdGF0aWMgc3RydWN0IHNucl90YWJsZSBxcHNrX3Nucl90YWJsZVtdID0geworCXsgMHgwYjQ3NzEsICAwIH0sCisJeyAweDBjMWFlZCwgIDEgfSwKKwl7IDB4MGQwZDI3LCAgMiB9LAorCXsgMHgwZTRkMTksICAzIH0sCisJeyAweDBlNWRhOCwgIDQgfSwKKwl7IDB4MTA3MDk3LCAgNSB9LAorCXsgMHgxMTY5NzUsICA2IH0sCisJeyAweDEyNTJkOSwgIDcgfSwKKwl7IDB4MTMxZmE0LCAgOCB9LAorCXsgMHgxM2Q1ZTEsICA5IH0sCisJeyAweDE0OGU1MywgMTAgfSwKKwl7IDB4MTUzNThiLCAxMSB9LAorCXsgMHgxNWRkMjksIDEyIH0sCisJeyAweDE2ODExMiwgMTMgfSwKKwl7IDB4MTcwYjYxLCAxNCB9LAorCXsgMHhmZmZmZmYsIDE1IH0sCit9OworCisvKiBRQU0xNiBTTlIgbG9va3VwIHRhYmxlICovCitzdGF0aWMgc3RydWN0IHNucl90YWJsZSBxYW0xNl9zbnJfdGFibGVbXSA9IHsKKwl7IDB4MDVlYjYyLCAgNSB9LAorCXsgMHgwNWZlY2YsICA2IH0sCisJeyAweDA2MGI4MCwgIDcgfSwKKwl7IDB4MDYyNTAxLCAgOCB9LAorCXsgMHgwNjQ4NjUsICA5IH0sCisJeyAweDA2OTYwNCwgMTAgfSwKKwl7IDB4MDZmMzU2LCAxMSB9LAorCXsgMHgwNzcwNmEsIDEyIH0sCisJeyAweDA4MDRkMywgMTMgfSwKKwl7IDB4MDg5ZDFhLCAxNCB9LAorCXsgMHgwOTNlM2QsIDE1IH0sCisJeyAweDA5ZTM1ZCwgMTYgfSwKKwl7IDB4MGE3YzNjLCAxNyB9LAorCXsgMHgwYWZhZjgsIDE4IH0sCisJeyAweDBiNzE5ZCwgMTkgfSwKKwl7IDB4ZmZmZmZmLCAyMCB9LAorfTsKKworLyogUUFNNjQgU05SIGxvb2t1cCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBzbnJfdGFibGUgcWFtNjRfc25yX3RhYmxlW10gPSB7CisJeyAweDAzMTA5YiwgMTIgfSwKKwl7IDB4MDMxMGQ0LCAxMyB9LAorCXsgMHgwMzE5MjAsIDE0IH0sCisJeyAweDAzMjJkMCwgMTUgfSwKKwl7IDB4MDMzOWZjLCAxNiB9LAorCXsgMHgwMzY0YTEsIDE3IH0sCisJeyAweDAzOGJjYywgMTggfSwKKwl7IDB4MDNjN2QzLCAxOSB9LAorCXsgMHgwNDA4Y2MsIDIwIH0sCisJeyAweDA0M2JlZCwgMjEgfSwKKwl7IDB4MDQ4MDYxLCAyMiB9LAorCXsgMHgwNGJlOTUsIDIzIH0sCisJeyAweDA0ZmE3ZCwgMjQgfSwKKwl7IDB4MDUyNDA1LCAyNSB9LAorCXsgMHgwNTU3MGQsIDI2IH0sCisJeyAweGZmZmZmZiwgMjcgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnZGVzYyBvZnNtX2luaXRbXSA9IHsKKwl7IDB4ZDczYSwgMCwgOCwgMHhhMSB9LAorCXsgMHhkNzNiLCAwLCA4LCAweDFmIH0sCisJeyAweGQ3M2MsIDQsIDQsIDB4MGEgfSwKKwl7IDB4ZDczMiwgMywgMSwgMHgwMCB9LAorCXsgMHhkNzMxLCA0LCAyLCAweDAzIH0sCisJeyAweGQ3M2QsIDcsIDEsIDB4MDEgfSwKKwl7IDB4ZDc0MCwgMCwgMSwgMHgwMCB9LAorCXsgMHhkNzQwLCAxLCAxLCAweDAwIH0sCisJeyAweGQ3NDAsIDIsIDEsIDB4MDAgfSwKKwl7IDB4ZDc0MCwgMywgMSwgMHgwMSB9LAorCXsgMHhkM2MxLCA0LCAxLCAweDAxIH0sCisJeyAweGQzYTIsIDAsIDgsIDB4MDAgfSwKKwl7IDB4ZDNhMywgMCwgOCwgMHgwNCB9LAorCXsgMHhkMzA1LCAwLCA4LCAweDMyIH0sCisJeyAweGQzMDYsIDAsIDgsIDB4MTAgfSwKKwl7IDB4ZDMwNCwgMCwgOCwgMHgwNCB9LAorCXsgMHg5MTEyLCAwLCAxLCAweDAxIH0sCisJeyAweDkxMWQsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OTExYSwgMCwgMSwgMHgwMSB9LAorCXsgMHg5MTFiLCAwLCAxLCAweDAxIH0sCisJeyAweDliY2UsIDAsIDQsIDB4MDIgfSwKKwl7IDB4OTExNiwgMCwgMSwgMHgwMSB9LAorCXsgMHg5YmQxLCAwLCAxLCAweDAxIH0sCisJeyAweGQyZTAsIDAsIDgsIDB4ZDAgfSwKKwl7IDB4ZDJlOSwgMCwgNCwgMHgwZCB9LAorCXsgMHhkMzhjLCAwLCA4LCAweGZjIH0sCisJeyAweGQzOGQsIDAsIDgsIDB4MDAgfSwKKwl7IDB4ZDM4ZSwgMCwgOCwgMHg3ZSB9LAorCXsgMHhkMzhmLCAwLCA4LCAweDAwIH0sCisJeyAweGQzOTAsIDAsIDgsIDB4MmYgfSwKKwl7IDB4ZDE0NSwgNCwgMSwgMHgwMSB9LAorCXsgMHhkMWE5LCA0LCAxLCAweDAxIH0sCisJeyAweGQxNTgsIDUsIDMsIDB4MDEgfSwKKwl7IDB4ZDE1OSwgMCwgNiwgMHgwNiB9LAorCXsgMHhkMTY3LCAwLCA4LCAweDAwIH0sCisJeyAweGQxNjgsIDAsIDQsIDB4MDcgfSwKKwl7IDB4ZDFjMywgNSwgMywgMHgwMCB9LAorCXsgMHhkMWM0LCAwLCA2LCAweDAwIH0sCisJeyAweGQxYzUsIDAsIDcsIDB4MTAgfSwKKwl7IDB4ZDFjNiwgMCwgMywgMHgwMiB9LAorCXsgMHhkMDgwLCAyLCA1LCAweDAzIH0sCisJeyAweGQwODEsIDQsIDQsIDB4MDkgfSwKKwl7IDB4ZDA5OCwgNCwgNCwgMHgwZiB9LAorCXsgMHhkMDk4LCAwLCA0LCAweDAzIH0sCisJeyAweGRiYzAsIDMsIDEsIDB4MDEgfSwKKwl7IDB4ZGJjMCwgNCwgMSwgMHgwMSB9LAorCXsgMHhkYmM3LCAwLCA4LCAweDA4IH0sCisJeyAweGRiYzgsIDQsIDQsIDB4MDAgfSwKKwl7IDB4ZGJjOSwgMCwgNSwgMHgwMSB9LAorCXsgMHhkMjgwLCAwLCA4LCAweGUwIH0sCisJeyAweGQyODEsIDAsIDgsIDB4ZmYgfSwKKwl7IDB4ZDI4MiwgMCwgOCwgMHhmZiB9LAorCXsgMHhkMjgzLCAwLCA4LCAweGMzIH0sCisJeyAweGQyODQsIDAsIDgsIDB4ZmYgfSwKKwl7IDB4ZDI4NSwgMCwgNCwgMHgwMSB9LAorCXsgMHhkMGYwLCAwLCA3LCAweDFhIH0sCisJeyAweGQwZjEsIDQsIDEsIDB4MDEgfSwKKwl7IDB4ZDBmMiwgMCwgOCwgMHgwYyB9LAorCXsgMHhkMTAzLCAwLCA0LCAweDA4IH0sCisJeyAweGQwZjgsIDAsIDcsIDB4MjAgfSwKKwl7IDB4ZDExMSwgNSwgMSwgMHgwMCB9LAorCXsgMHhkMTExLCA2LCAxLCAweDAwIH0sCisJeyAweDkxMGIsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OTExNSwgMCwgOCwgMHgwMiB9LAorCXsgMHg5MTBjLCAwLCA4LCAweDAyIH0sCisJeyAweDkxMGQsIDAsIDgsIDB4MDggfSwKKwl7IDB4OTEwZSwgMCwgOCwgMHgwYSB9LAorCXsgMHg5YmY2LCAwLCA4LCAweDA2IH0sCisJeyAweDliZjgsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJmNywgMCwgOCwgMHgwNSB9LAorCXsgMHg5YmY5LCAwLCA4LCAweDBmIH0sCisJeyAweDliZmMsIDAsIDgsIDB4MTMgfSwKKwl7IDB4OWJkMywgMCwgOCwgMHhmZiB9LAorCXsgMHg5YmJlLCAwLCAxLCAweDAxIH0sCisJeyAweDliY2MsIDAsIDEsIDB4MDEgfSwKK307CisKKy8qIFBhbmFzb25pYyBFTlY3N0gxMUQ1IHR1bmVyIGluaXQKKyAgIEFGOTAxM19UVU5FUl9FTlY3N0gxMUQ1ID0gMTI5ICovCitzdGF0aWMgc3RydWN0IHJlZ2Rlc2MgdHVuZXJfaW5pdF9lbnY3N2gxMWQ1W10gPSB7CisJeyAweDliZDUsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJkNiwgMCwgOCwgMHgwMyB9LAorCXsgMHg5YmJlLCAwLCA4LCAweDAxIH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAxLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCA1LCAxLCAweDAwIH0sCisJeyAweGQwMDIsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwMywgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDA0LCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDUsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwZSwgMCwgNSwgMHgxMCB9LAorCXsgMHhkMDBmLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMGYsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxMCwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDEwLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTYsIDQsIDQsIDB4MDMgfSwKKwl7IDB4ZDAxZiwgMCwgNiwgMHgwYSB9LAorCXsgMHhkMDIwLCAwLCA2LCAweDBhIH0sCisJeyAweDliZGEsIDAsIDgsIDB4MDAgfSwKKwl7IDB4OWJlMywgMCwgOCwgMHgwMCB9LAorCXsgMHhkMDE1LCAwLCA4LCAweDUwIH0sCisJeyAweGQwMTYsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDA0NCwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDQ1LCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDgsIDAsIDgsIDB4ZGYgfSwKKwl7IDB4ZDAwOSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDA2LCAwLCA4LCAweDQ0IH0sCisJeyAweGQwMDcsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDAwYywgMCwgOCwgMHhlYiB9LAorCXsgMHhkMDBkLCAwLCAyLCAweDAyIH0sCisJeyAweGQwMGEsIDAsIDgsIDB4ZjQgfSwKKwl7IDB4ZDAwYiwgMCwgMiwgMHgwMSB9LAorCXsgMHg5YmJhLCAwLCA4LCAweGY5IH0sCisJeyAweDliYzMsIDAsIDgsIDB4ZGYgfSwKKwl7IDB4OWJjNCwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmM1LCAwLCA4LCAweGViIH0sCisJeyAweDliYzYsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJjOSwgMCwgOCwgMHg1MiB9LAorCXsgMHhkMDExLCAwLCA4LCAweDNjIH0sCisJeyAweGQwMTIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDAxMywgMCwgOCwgMHhmNyB9LAorCXsgMHhkMDE0LCAwLCAyLCAweDAyIH0sCisJeyAweGQwNDAsIDAsIDgsIDB4MGIgfSwKKwl7IDB4ZDA0MSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDQyLCAwLCA4LCAweDRkIH0sCisJeyAweGQwNDMsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDA0NSwgMSwgMSwgMHgwMCB9LAorCXsgMHg5YmNmLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNDUsIDIsIDEsIDB4MDEgfSwKKwl7IDB4ZDA0ZiwgMCwgOCwgMHg5YSB9LAorCXsgMHhkMDUwLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNTEsIDAsIDgsIDB4NWEgfSwKKwl7IDB4ZDA1MiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUzLCAwLCA4LCAweDUwIH0sCisJeyAweGQwNTQsIDAsIDgsIDB4NDYgfSwKKwl7IDB4OWJkNywgMCwgOCwgMHgwYSB9LAorCXsgMHg5YmQ4LCAwLCA4LCAweDE0IH0sCisJeyAweDliZDksIDAsIDgsIDB4MDggfSwKK307CisKKy8qIE1pY3JvdHVuZSBNVDIwNjAgdHVuZXIgaW5pdAorICAgQUY5MDEzX1RVTkVSX01UMjA2MCAgICAgPSAxMzAgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnZGVzYyB0dW5lcl9pbml0X210MjA2MFtdID0geworCXsgMHg5YmQ1LCAwLCA4LCAweDAxIH0sCisJeyAweDliZDYsIDAsIDgsIDB4MDcgfSwKKwl7IDB4ZDFhMCwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAwLCAxLCAweDAxIH0sCisJeyAweGQwMDAsIDEsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMSwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAxLCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDUsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMiwgMCwgNSwgMHgxOSB9LAorCXsgMHhkMDAzLCAwLCA1LCAweDFhIH0sCisJeyAweGQwMDQsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwNSwgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDBlLCAwLCA1LCAweDEwIH0sCisJeyAweGQwMGYsIDAsIDMsIDB4MDQgfSwKKwl7IDB4ZDAwZiwgMywgMywgMHgwNSB9LAorCXsgMHhkMDEwLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMTAsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxNiwgNCwgNCwgMHgwMyB9LAorCXsgMHhkMDFmLCAwLCA2LCAweDBhIH0sCisJeyAweGQwMjAsIDAsIDYsIDB4MGEgfSwKKwl7IDB4OWJkYSwgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmUzLCAwLCA4LCAweDAwIH0sCisJeyAweDliYmUsIDAsIDEsIDB4MDAgfSwKKwl7IDB4OWJjYywgMCwgMSwgMHgwMCB9LAorCXsgMHg5YmI5LCAwLCA4LCAweDc1IH0sCisJeyAweDliY2QsIDAsIDgsIDB4MjQgfSwKKwl7IDB4OWJmZiwgMCwgOCwgMHgzMCB9LAorCXsgMHhkMDE1LCAwLCA4LCAweDQ2IH0sCisJeyAweGQwMTYsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDA0NCwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDQ1LCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDgsIDAsIDgsIDB4MGYgfSwKKwl7IDB4ZDAwOSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDA2LCAwLCA4LCAweDMyIH0sCisJeyAweGQwMDcsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDAwYywgMCwgOCwgMHgzNiB9LAorCXsgMHhkMDBkLCAwLCAyLCAweDAzIH0sCisJeyAweGQwMGEsIDAsIDgsIDB4MzUgfSwKKwl7IDB4ZDAwYiwgMCwgMiwgMHgwMSB9LAorCXsgMHg5YmM3LCAwLCA4LCAweDA3IH0sCisJeyAweDliYzgsIDAsIDgsIDB4OTAgfSwKKwl7IDB4OWJjMywgMCwgOCwgMHgwZiB9LAorCXsgMHg5YmM0LCAwLCA4LCAweDAyIH0sCisJeyAweDliYzUsIDAsIDgsIDB4MzYgfSwKKwl7IDB4OWJjNiwgMCwgOCwgMHgwMyB9LAorCXsgMHg5YmJhLCAwLCA4LCAweGM5IH0sCisJeyAweDliYzksIDAsIDgsIDB4NzkgfSwKKwl7IDB4ZDAxMSwgMCwgOCwgMHgxMCB9LAorCXsgMHhkMDEyLCAwLCAyLCAweDAxIH0sCisJeyAweGQwMTMsIDAsIDgsIDB4NDUgfSwKKwl7IDB4ZDAxNCwgMCwgMiwgMHgwMyB9LAorCXsgMHhkMDQwLCAwLCA4LCAweDk4IH0sCisJeyAweGQwNDEsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDA0MiwgMCwgOCwgMHhjZiB9LAorCXsgMHhkMDQzLCAwLCAyLCAweDAzIH0sCisJeyAweGQwNDUsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJjZiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDQ1LCAyLCAxLCAweDAxIH0sCisJeyAweGQwNGYsIDAsIDgsIDB4OWEgfSwKKwl7IDB4ZDA1MCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUxLCAwLCA4LCAweDVhIH0sCisJeyAweGQwNTIsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MywgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDU0LCAwLCA4LCAweDQ2IH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCisJeyAweDliZDAsIDAsIDgsIDB4Y2MgfSwKKwl7IDB4OWJlNCwgMCwgOCwgMHhhMCB9LAorCXsgMHg5YmJkLCAwLCA4LCAweDhlIH0sCisJeyAweDliZTIsIDAsIDgsIDB4NGQgfSwKKwl7IDB4OWJlZSwgMCwgMSwgMHgwMSB9LAorfTsKKworLyogTWljcm90dW5lIE1UMjA2MCB0dW5lciBpbml0CisgICBBRjkwMTNfVFVORVJfTVQyMDYwXzIgICA9IDE0NyAqLworc3RhdGljIHN0cnVjdCByZWdkZXNjIHR1bmVyX2luaXRfbXQyMDYwXzJbXSA9IHsKKwl7IDB4OWJkNSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmQ2LCAwLCA4LCAweDA2IH0sCisJeyAweDliYmUsIDAsIDgsIDB4MDEgfSwKKwl7IDB4ZDFhMCwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAwLCAxLCAweDAxIH0sCisJeyAweGQwMDAsIDEsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMSwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAxLCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDUsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMiwgMCwgNSwgMHgxOSB9LAorCXsgMHhkMDAzLCAwLCA1LCAweDFhIH0sCisJeyAweGQwMDQsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwNSwgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDBlLCAwLCA1LCAweDEwIH0sCisJeyAweGQwMGYsIDAsIDMsIDB4MDQgfSwKKwl7IDB4ZDAwZiwgMywgMywgMHgwNSB9LAorCXsgMHhkMDEwLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMTAsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxNiwgNCwgNCwgMHgwMyB9LAorCXsgMHhkMDFmLCAwLCA2LCAweDBhIH0sCisJeyAweGQwMjAsIDAsIDYsIDB4MGEgfSwKKwl7IDB4ZDAxNSwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDE2LCAwLCAxLCAweDAwIH0sCisJeyAweGQwNDQsIDAsIDgsIDB4NDYgfSwKKwl7IDB4ZDA0NSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDA4LCAwLCA4LCAweDBmIH0sCisJeyAweGQwMDksIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDAwNiwgMCwgOCwgMHgzMiB9LAorCXsgMHhkMDA3LCAwLCAyLCAweDAxIH0sCisJeyAweGQwMGMsIDAsIDgsIDB4MzYgfSwKKwl7IDB4ZDAwZCwgMCwgMiwgMHgwMyB9LAorCXsgMHhkMDBhLCAwLCA4LCAweDM1IH0sCisJeyAweGQwMGIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4OWJjNywgMCwgOCwgMHgwNyB9LAorCXsgMHg5YmM4LCAwLCA4LCAweDkwIH0sCisJeyAweDliYzMsIDAsIDgsIDB4MGYgfSwKKwl7IDB4OWJjNCwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmM1LCAwLCA4LCAweDM2IH0sCisJeyAweDliYzYsIDAsIDgsIDB4MDMgfSwKKwl7IDB4OWJiYSwgMCwgOCwgMHhjOSB9LAorCXsgMHg5YmM5LCAwLCA4LCAweDc5IH0sCisJeyAweGQwMTEsIDAsIDgsIDB4MTAgfSwKKwl7IDB4ZDAxMiwgMCwgMiwgMHgwMSB9LAorCXsgMHhkMDEzLCAwLCA4LCAweDQ1IH0sCisJeyAweGQwMTQsIDAsIDIsIDB4MDMgfSwKKwl7IDB4ZDA0MCwgMCwgOCwgMHg5OCB9LAorCXsgMHhkMDQxLCAwLCAyLCAweDAwIH0sCisJeyAweGQwNDIsIDAsIDgsIDB4Y2YgfSwKKwl7IDB4ZDA0MywgMCwgMiwgMHgwMyB9LAorCXsgMHhkMDQ1LCAxLCAxLCAweDAwIH0sCisJeyAweDliY2YsIDAsIDgsIDB4MDEgfSwKKwl7IDB4ZDA0NSwgMiwgMSwgMHgwMSB9LAorCXsgMHhkMDRmLCAwLCA4LCAweDlhIH0sCisJeyAweGQwNTAsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MSwgMCwgOCwgMHg1YSB9LAorCXsgMHhkMDUyLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNTMsIDAsIDgsIDB4OTYgfSwKKwl7IDB4ZDA1NCwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDQ1LCA3LCAxLCAweDAwIH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCit9OworCisvKiBNYXhMaW5lYXIgTVhMNTAwMyB0dW5lciBpbml0CisgICBBRjkwMTNfVFVORVJfTVhMNTAwM0QgICA9ICAgMyAqLworc3RhdGljIHN0cnVjdCByZWdkZXNjIHR1bmVyX2luaXRfbXhsNTAwM2RbXSA9IHsKKwl7IDB4OWJkNSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmQ2LCAwLCA4LCAweDA5IH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAxLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCA1LCAxLCAweDAwIH0sCisJeyAweGQwMDIsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwMywgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDA0LCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDUsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwZSwgMCwgNSwgMHgxMCB9LAorCXsgMHhkMDBmLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMGYsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxMCwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDEwLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTYsIDQsIDQsIDB4MDMgfSwKKwl7IDB4ZDAxZiwgMCwgNiwgMHgwYSB9LAorCXsgMHhkMDIwLCAwLCA2LCAweDBhIH0sCisJeyAweDliZGEsIDAsIDgsIDB4MDAgfSwKKwl7IDB4OWJlMywgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmZjLCAwLCA4LCAweDBmIH0sCisJeyAweDliZjYsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJiZSwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDE1LCAwLCA4LCAweDMzIH0sCisJeyAweGQwMTYsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDA0NCwgMCwgOCwgMHg0MCB9LAorCXsgMHhkMDQ1LCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDgsIDAsIDgsIDB4MGYgfSwKKwl7IDB4ZDAwOSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDA2LCAwLCA4LCAweDZjIH0sCisJeyAweGQwMDcsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDAwYywgMCwgOCwgMHgzZCB9LAorCXsgMHhkMDBkLCAwLCAyLCAweDAwIH0sCisJeyAweGQwMGEsIDAsIDgsIDB4NDUgfSwKKwl7IDB4ZDAwYiwgMCwgMiwgMHgwMSB9LAorCXsgMHg5YmM3LCAwLCA4LCAweDA3IH0sCisJeyAweDliYzgsIDAsIDgsIDB4NTIgfSwKKwl7IDB4OWJjMywgMCwgOCwgMHgwZiB9LAorCXsgMHg5YmM0LCAwLCA4LCAweDAyIH0sCisJeyAweDliYzUsIDAsIDgsIDB4M2QgfSwKKwl7IDB4OWJjNiwgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmJhLCAwLCA4LCAweGEyIH0sCisJeyAweDliYzksIDAsIDgsIDB4YTAgfSwKKwl7IDB4ZDAxMSwgMCwgOCwgMHg1NiB9LAorCXsgMHhkMDEyLCAwLCAyLCAweDAwIH0sCisJeyAweGQwMTMsIDAsIDgsIDB4NTAgfSwKKwl7IDB4ZDAxNCwgMCwgMiwgMHgwMCB9LAorCXsgMHhkMDQwLCAwLCA4LCAweDU2IH0sCisJeyAweGQwNDEsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDA0MiwgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDQzLCAwLCAyLCAweDAwIH0sCisJeyAweGQwNDUsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJjZiwgMCwgOCwgMHgwMSB9LAorCXsgMHhkMDQ1LCAyLCAxLCAweDAxIH0sCisJeyAweGQwNGYsIDAsIDgsIDB4OWEgfSwKKwl7IDB4ZDA1MCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUxLCAwLCA4LCAweDVhIH0sCisJeyAweGQwNTIsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MywgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDU0LCAwLCA4LCAweDQ2IH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCit9OworCisvKiBNYXhMaW5lYXIgTVhMNTAwNSB0dW5lciBpbml0CisgICBBRjkwMTNfVFVORVJfTVhMNTAwNUQgICA9ICAxMworICAgQUY5MDEzX1RVTkVSX01YTDUwMDVSICAgPSAgMzAgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnZGVzYyB0dW5lcl9pbml0X214bDUwMDVbXSA9IHsKKwl7IDB4OWJkNSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmQ2LCAwLCA4LCAweDA3IH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAxLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCA1LCAxLCAweDAwIH0sCisJeyAweGQwMDIsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwMywgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDA0LCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDUsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwZSwgMCwgNSwgMHgxMCB9LAorCXsgMHhkMDBmLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMGYsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxMCwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDEwLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTYsIDQsIDQsIDB4MDMgfSwKKwl7IDB4ZDAxZiwgMCwgNiwgMHgwYSB9LAorCXsgMHhkMDIwLCAwLCA2LCAweDBhIH0sCisJeyAweDliZGEsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJlMywgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmJlLCAwLCAxLCAweDAxIH0sCisJeyAweDliY2MsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OWJiOSwgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmNkLCAwLCA4LCAweDI4IH0sCisJeyAweDliZmYsIDAsIDgsIDB4MjQgfSwKKwl7IDB4ZDAxNSwgMCwgOCwgMHg0MCB9LAorCXsgMHhkMDE2LCAwLCAxLCAweDAwIH0sCisJeyAweGQwNDQsIDAsIDgsIDB4NDAgfSwKKwl7IDB4ZDA0NSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDA4LCAwLCA4LCAweDBmIH0sCisJeyAweGQwMDksIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDAwNiwgMCwgOCwgMHg3MyB9LAorCXsgMHhkMDA3LCAwLCAyLCAweDAxIH0sCisJeyAweGQwMGMsIDAsIDgsIDB4ZmEgfSwKKwl7IDB4ZDAwZCwgMCwgMiwgMHgwMSB9LAorCXsgMHhkMDBhLCAwLCA4LCAweGZmIH0sCisJeyAweGQwMGIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4OWJjNywgMCwgOCwgMHgyMyB9LAorCXsgMHg5YmM4LCAwLCA4LCAweDU1IH0sCisJeyAweDliYzMsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJjNCwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmM1LCAwLCA4LCAweGZhIH0sCisJeyAweDliYzYsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJiYSwgMCwgOCwgMHhmZiB9LAorCXsgMHg5YmM5LCAwLCA4LCAweGZmIH0sCisJeyAweDliZDMsIDAsIDgsIDB4OTUgfSwKKwl7IDB4ZDAxMSwgMCwgOCwgMHg3MCB9LAorCXsgMHhkMDEyLCAwLCAyLCAweDAxIH0sCisJeyAweGQwMTMsIDAsIDgsIDB4ZmIgfSwKKwl7IDB4ZDAxNCwgMCwgMiwgMHgwMSB9LAorCXsgMHhkMDQwLCAwLCA4LCAweDcwIH0sCisJeyAweGQwNDEsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDA0MiwgMCwgOCwgMHhmYiB9LAorCXsgMHhkMDQzLCAwLCAyLCAweDAxIH0sCisJeyAweGQwNDUsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJjZiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDQ1LCAyLCAxLCAweDAxIH0sCisJeyAweGQwNGYsIDAsIDgsIDB4OWEgfSwKKwl7IDB4ZDA1MCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUxLCAwLCA4LCAweDVhIH0sCisJeyAweGQwNTIsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MywgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDU0LCAwLCA4LCAweDQ2IH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCisJeyAweDliZDAsIDAsIDgsIDB4OTMgfSwKKwl7IDB4OWJlNCwgMCwgOCwgMHhmZSB9LAorCXsgMHg5YmJkLCAwLCA4LCAweDYzIH0sCisJeyAweDliZTIsIDAsIDgsIDB4ZmUgfSwKKwl7IDB4OWJlZSwgMCwgMSwgMHgwMSB9LAorfTsKKworLyogUXVhbnRlayBRVDEwMTAgdHVuZXIgaW5pdAorICAgQUY5MDEzX1RVTkVSX1FUMTAxMCAgICAgPSAxMzQKKyAgIEFGOTAxM19UVU5FUl9RVDEwMTBBICAgID0gMTYyICovCitzdGF0aWMgc3RydWN0IHJlZ2Rlc2MgdHVuZXJfaW5pdF9xdDEwMTBbXSA9IHsKKwl7IDB4OWJkNSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmQ2LCAwLCA4LCAweDA5IH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAxLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCA1LCAxLCAweDAwIH0sCisJeyAweGQwMDIsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwMywgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDA0LCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDUsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwZSwgMCwgNSwgMHgxMCB9LAorCXsgMHhkMDBmLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMGYsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxMCwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDEwLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTYsIDQsIDQsIDB4MDMgfSwKKwl7IDB4ZDAxZiwgMCwgNiwgMHgwYSB9LAorCXsgMHhkMDIwLCAwLCA2LCAweDBhIH0sCisJeyAweDliZGEsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJlMywgMCwgOCwgMHgwMSB9LAorCXsgMHhkMDE1LCAwLCA4LCAweDQ2IH0sCisJeyAweGQwMTYsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDA0NCwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDQ1LCAwLCAxLCAweDAwIH0sCisJeyAweDliYmUsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OWJjYywgMCwgMSwgMHgwMSB9LAorCXsgMHg5YmI5LCAwLCA4LCAweDAwIH0sCisJeyAweDliY2QsIDAsIDgsIDB4MjggfSwKKwl7IDB4OWJmZiwgMCwgOCwgMHgyMCB9LAorCXsgMHhkMDA4LCAwLCA4LCAweDBmIH0sCisJeyAweGQwMDksIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDAwNiwgMCwgOCwgMHg5OSB9LAorCXsgMHhkMDA3LCAwLCAyLCAweDAxIH0sCisJeyAweGQwMGMsIDAsIDgsIDB4MGYgfSwKKwl7IDB4ZDAwZCwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDBhLCAwLCA4LCAweDUwIH0sCisJeyAweGQwMGIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4OWJjNywgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmM4LCAwLCA4LCAweDAwIH0sCisJeyAweDliYzMsIDAsIDgsIDB4MGYgfSwKKwl7IDB4OWJjNCwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmM1LCAwLCA4LCAweDBmIH0sCisJeyAweDliYzYsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJiYSwgMCwgOCwgMHhjNSB9LAorCXsgMHg5YmM5LCAwLCA4LCAweGZmIH0sCisJeyAweGQwMTEsIDAsIDgsIDB4NTggfSwKKwl7IDB4ZDAxMiwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDEzLCAwLCA4LCAweDg5IH0sCisJeyAweGQwMTQsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDA0MCwgMCwgOCwgMHg1OCB9LAorCXsgMHhkMDQxLCAwLCAyLCAweDAyIH0sCisJeyAweGQwNDIsIDAsIDgsIDB4ODkgfSwKKwl7IDB4ZDA0MywgMCwgMiwgMHgwMSB9LAorCXsgMHhkMDQ1LCAxLCAxLCAweDAwIH0sCisJeyAweDliY2YsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA0NSwgMiwgMSwgMHgwMSB9LAorCXsgMHhkMDRmLCAwLCA4LCAweDlhIH0sCisJeyAweGQwNTAsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MSwgMCwgOCwgMHg1YSB9LAorCXsgMHhkMDUyLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNTMsIDAsIDgsIDB4NTAgfSwKKwl7IDB4ZDA1NCwgMCwgOCwgMHg0NiB9LAorCXsgMHg5YmQ3LCAwLCA4LCAweDBhIH0sCisJeyAweDliZDgsIDAsIDgsIDB4MTQgfSwKKwl7IDB4OWJkOSwgMCwgOCwgMHgwOCB9LAorCXsgMHg5YmQwLCAwLCA4LCAweGNkIH0sCisJeyAweDliZTQsIDAsIDgsIDB4YmIgfSwKKwl7IDB4OWJiZCwgMCwgOCwgMHg5MyB9LAorCXsgMHg5YmUyLCAwLCA4LCAweDgwIH0sCisJeyAweDliZWUsIDAsIDEsIDB4MDEgfSwKK307CisKKy8qIEZyZWVzY2FsZSBNQzQ0UzgwMyB0dW5lciBpbml0CisgICBBRjkwMTNfVFVORVJfTUM0NFM4MDMgICA9IDEzMyAqLworc3RhdGljIHN0cnVjdCByZWdkZXNjIHR1bmVyX2luaXRfbWM0NHM4MDNbXSA9IHsKKwl7IDB4OWJkNSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmQ2LCAwLCA4LCAweDA2IH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAxLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDEsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCA1LCAxLCAweDAwIH0sCisJeyAweGQwMDIsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwMywgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDA0LCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDUsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwZSwgMCwgNSwgMHgxMCB9LAorCXsgMHhkMDBmLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMGYsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxMCwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDEwLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTYsIDQsIDQsIDB4MDMgfSwKKwl7IDB4ZDAxZiwgMCwgNiwgMHgwYSB9LAorCXsgMHhkMDIwLCAwLCA2LCAweDBhIH0sCisJeyAweDliZGEsIDAsIDgsIDB4MDAgfSwKKwl7IDB4OWJlMywgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmY2LCAwLCA4LCAweDAxIH0sCisJeyAweDliZjgsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJmOSwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmZjLCAwLCA4LCAweDFmIH0sCisJeyAweDliYmUsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OWJjYywgMCwgMSwgMHgwMSB9LAorCXsgMHg5YmI5LCAwLCA4LCAweDAwIH0sCisJeyAweDliY2QsIDAsIDgsIDB4MjQgfSwKKwl7IDB4OWJmZiwgMCwgOCwgMHgyNCB9LAorCXsgMHhkMDE1LCAwLCA4LCAweDQ2IH0sCisJeyAweGQwMTYsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDA0NCwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDQ1LCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDgsIDAsIDgsIDB4MDEgfSwKKwl7IDB4ZDAwOSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDA2LCAwLCA4LCAweDdiIH0sCisJeyAweGQwMDcsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDAwYywgMCwgOCwgMHg3YyB9LAorCXsgMHhkMDBkLCAwLCAyLCAweDAyIH0sCisJeyAweGQwMGEsIDAsIDgsIDB4ZmUgfSwKKwl7IDB4ZDAwYiwgMCwgMiwgMHgwMSB9LAorCXsgMHg5YmM3LCAwLCA4LCAweDA4IH0sCisJeyAweDliYzgsIDAsIDgsIDB4OWEgfSwKKwl7IDB4OWJjMywgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmM0LCAwLCA4LCAweDAyIH0sCisJeyAweDliYzUsIDAsIDgsIDB4N2MgfSwKKwl7IDB4OWJjNiwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmJhLCAwLCA4LCAweGZjIH0sCisJeyAweDliYzksIDAsIDgsIDB4YWEgfSwKKwl7IDB4ZDAxMSwgMCwgOCwgMHg2YiB9LAorCXsgMHhkMDEyLCAwLCAyLCAweDAwIH0sCisJeyAweGQwMTMsIDAsIDgsIDB4ODggfSwKKwl7IDB4ZDAxNCwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDQwLCAwLCA4LCAweDZiIH0sCisJeyAweGQwNDEsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDA0MiwgMCwgOCwgMHg3YyB9LAorCXsgMHhkMDQzLCAwLCAyLCAweDAyIH0sCisJeyAweGQwNDUsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJjZiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDQ1LCAyLCAxLCAweDAxIH0sCisJeyAweGQwNGYsIDAsIDgsIDB4OWEgfSwKKwl7IDB4ZDA1MCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUxLCAwLCA4LCAweDVhIH0sCisJeyAweGQwNTIsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MywgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDU0LCAwLCA4LCAweDQ2IH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCisJeyAweDliZDAsIDAsIDgsIDB4OWUgfSwKKwl7IDB4OWJlNCwgMCwgOCwgMHhmZiB9LAorCXsgMHg5YmJkLCAwLCA4LCAweDllIH0sCisJeyAweDliZTIsIDAsIDgsIDB4MjUgfSwKKwl7IDB4OWJlZSwgMCwgMSwgMHgwMSB9LAorCXsgMHhkNzNiLCAzLCAxLCAweDAwIH0sCit9OworCisvKiB1bmtub3duLCBwcm9iYWJseSBmb3IgdGluIGNhbiB0dW5lciwgdHVuZXIgaW5pdAorICAgQUY5MDEzX1RVTkVSX1VOS05PV04gICA9IDE0MCAqLworc3RhdGljIHN0cnVjdCByZWdkZXNjIHR1bmVyX2luaXRfdW5rbm93bltdID0geworCXsgMHg5YmQ1LCAwLCA4LCAweDAxIH0sCisJeyAweDliZDYsIDAsIDgsIDB4MDIgfSwKKwl7IDB4ZDFhMCwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAwLCAwLCAxLCAweDAxIH0sCisJeyAweGQwMDAsIDEsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMSwgMSwgMSwgMHgwMSB9LAorCXsgMHhkMDAxLCAwLCAxLCAweDAwIH0sCisJeyAweGQwMDEsIDUsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMiwgMCwgNSwgMHgxOSB9LAorCXsgMHhkMDAzLCAwLCA1LCAweDFhIH0sCisJeyAweGQwMDQsIDAsIDUsIDB4MTkgfSwKKwl7IDB4ZDAwNSwgMCwgNSwgMHgxYSB9LAorCXsgMHhkMDBlLCAwLCA1LCAweDEwIH0sCisJeyAweGQwMGYsIDAsIDMsIDB4MDQgfSwKKwl7IDB4ZDAwZiwgMywgMywgMHgwNSB9LAorCXsgMHhkMDEwLCAwLCAzLCAweDA0IH0sCisJeyAweGQwMTAsIDMsIDMsIDB4MDUgfSwKKwl7IDB4ZDAxNiwgNCwgNCwgMHgwMyB9LAorCXsgMHhkMDFmLCAwLCA2LCAweDBhIH0sCisJeyAweGQwMjAsIDAsIDYsIDB4MGEgfSwKKwl7IDB4OWJkYSwgMCwgOCwgMHgwMSB9LAorCXsgMHg5YmUzLCAwLCA4LCAweDAxIH0sCisJeyAweGQxYTAsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJiZSwgMCwgMSwgMHgwMSB9LAorCXsgMHg5YmNjLCAwLCAxLCAweDAxIH0sCisJeyAweDliYjksIDAsIDgsIDB4MDAgfSwKKwl7IDB4OWJjZCwgMCwgOCwgMHgxOCB9LAorCXsgMHg5YmZmLCAwLCA4LCAweDJjIH0sCisJeyAweGQwMTUsIDAsIDgsIDB4NDYgfSwKKwl7IDB4ZDAxNiwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDQ0LCAwLCA4LCAweDQ2IH0sCisJeyAweGQwNDUsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwOCwgMCwgOCwgMHhkZiB9LAorCXsgMHhkMDA5LCAwLCAyLCAweDAyIH0sCisJeyAweGQwMDYsIDAsIDgsIDB4NDQgfSwKKwl7IDB4ZDAwNywgMCwgMiwgMHgwMSB9LAorCXsgMHhkMDBjLCAwLCA4LCAweDAwIH0sCisJeyAweGQwMGQsIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDAwYSwgMCwgOCwgMHhmNiB9LAorCXsgMHhkMDBiLCAwLCAyLCAweDAxIH0sCisJeyAweDliYmEsIDAsIDgsIDB4ZjkgfSwKKwl7IDB4OWJjOCwgMCwgOCwgMHhhYSB9LAorCXsgMHg5YmMzLCAwLCA4LCAweGRmIH0sCisJeyAweDliYzQsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJjNSwgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmM2LCAwLCA4LCAweDAyIH0sCisJeyAweDliYzksIDAsIDgsIDB4ZjAgfSwKKwl7IDB4ZDAxMSwgMCwgOCwgMHgzYyB9LAorCXsgMHhkMDEyLCAwLCAyLCAweDAxIH0sCisJeyAweGQwMTMsIDAsIDgsIDB4ZjcgfSwKKwl7IDB4ZDAxNCwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDQwLCAwLCA4LCAweDBiIH0sCisJeyAweGQwNDEsIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDA0MiwgMCwgOCwgMHg0ZCB9LAorCXsgMHhkMDQzLCAwLCAyLCAweDAwIH0sCisJeyAweGQwNDUsIDEsIDEsIDB4MDAgfSwKKwl7IDB4OWJjZiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDQ1LCAyLCAxLCAweDAxIH0sCisJeyAweGQwNGYsIDAsIDgsIDB4OWEgfSwKKwl7IDB4ZDA1MCwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUxLCAwLCA4LCAweDVhIH0sCisJeyAweGQwNTIsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDA1MywgMCwgOCwgMHg1MCB9LAorCXsgMHhkMDU0LCAwLCA4LCAweDQ2IH0sCisJeyAweDliZDcsIDAsIDgsIDB4MGEgfSwKKwl7IDB4OWJkOCwgMCwgOCwgMHgxNCB9LAorCXsgMHg5YmQ5LCAwLCA4LCAweDA4IH0sCit9OworCisvKiBOWFAgVERBMTgyNzEgdHVuZXIgaW5pdAorICAgQUY5MDEzX1RVTkVSX1REQTE4MjcxICAgPSAxNTYgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnZGVzYyB0dW5lcl9pbml0X3RkYTE4MjcxW10gPSB7CisJeyAweDliZDUsIDAsIDgsIDB4MDEgfSwKKwl7IDB4OWJkNiwgMCwgOCwgMHgwNCB9LAorCXsgMHhkMWEwLCAxLCAxLCAweDAxIH0sCisJeyAweGQwMDAsIDAsIDEsIDB4MDEgfSwKKwl7IDB4ZDAwMCwgMSwgMSwgMHgwMCB9LAorCXsgMHhkMDAxLCAxLCAxLCAweDAxIH0sCisJeyAweGQwMDEsIDAsIDEsIDB4MDAgfSwKKwl7IDB4ZDAwMSwgNSwgMSwgMHgwMCB9LAorCXsgMHhkMDAyLCAwLCA1LCAweDE5IH0sCisJeyAweGQwMDMsIDAsIDUsIDB4MWEgfSwKKwl7IDB4ZDAwNCwgMCwgNSwgMHgxOSB9LAorCXsgMHhkMDA1LCAwLCA1LCAweDFhIH0sCisJeyAweGQwMGUsIDAsIDUsIDB4MTAgfSwKKwl7IDB4ZDAwZiwgMCwgMywgMHgwNCB9LAorCXsgMHhkMDBmLCAzLCAzLCAweDA1IH0sCisJeyAweGQwMTAsIDAsIDMsIDB4MDQgfSwKKwl7IDB4ZDAxMCwgMywgMywgMHgwNSB9LAorCXsgMHhkMDE2LCA0LCA0LCAweDAzIH0sCisJeyAweGQwMWYsIDAsIDYsIDB4MGEgfSwKKwl7IDB4ZDAyMCwgMCwgNiwgMHgwYSB9LAorCXsgMHg5YmRhLCAwLCA4LCAweDAxIH0sCisJeyAweDliZTMsIDAsIDgsIDB4MDEgfSwKKwl7IDB4ZDFhMCwgMSwgMSwgMHgwMCB9LAorCXsgMHg5YmJlLCAwLCAxLCAweDAxIH0sCisJeyAweDliY2MsIDAsIDEsIDB4MDEgfSwKKwl7IDB4OWJiOSwgMCwgOCwgMHgwMCB9LAorCXsgMHg5YmNkLCAwLCA4LCAweDE4IH0sCisJeyAweDliZmYsIDAsIDgsIDB4MmMgfSwKKwl7IDB4ZDAxNSwgMCwgOCwgMHg0NiB9LAorCXsgMHhkMDE2LCAwLCAxLCAweDAwIH0sCisJeyAweGQwNDQsIDAsIDgsIDB4NDYgfSwKKwl7IDB4ZDA0NSwgMCwgMSwgMHgwMCB9LAorCXsgMHhkMDA4LCAwLCA4LCAweGRmIH0sCisJeyAweGQwMDksIDAsIDIsIDB4MDIgfSwKKwl7IDB4ZDAwNiwgMCwgOCwgMHg0NCB9LAorCXsgMHhkMDA3LCAwLCAyLCAweDAxIH0sCisJeyAweGQwMGMsIDAsIDgsIDB4MDAgfSwKKwl7IDB4ZDAwZCwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDBhLCAwLCA4LCAweGY2IH0sCisJeyAweGQwMGIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4OWJiYSwgMCwgOCwgMHhmOSB9LAorCXsgMHg5YmM4LCAwLCA4LCAweGFhIH0sCisJeyAweDliYzMsIDAsIDgsIDB4ZGYgfSwKKwl7IDB4OWJjNCwgMCwgOCwgMHgwMiB9LAorCXsgMHg5YmM1LCAwLCA4LCAweDAwIH0sCisJeyAweDliYzYsIDAsIDgsIDB4MDIgfSwKKwl7IDB4OWJjOSwgMCwgOCwgMHhmMCB9LAorCXsgMHhkMDExLCAwLCA4LCAweDNjIH0sCisJeyAweGQwMTIsIDAsIDIsIDB4MDEgfSwKKwl7IDB4ZDAxMywgMCwgOCwgMHhmNyB9LAorCXsgMHhkMDE0LCAwLCAyLCAweDAyIH0sCisJeyAweGQwNDAsIDAsIDgsIDB4MGIgfSwKKwl7IDB4ZDA0MSwgMCwgMiwgMHgwMiB9LAorCXsgMHhkMDQyLCAwLCA4LCAweDRkIH0sCisJeyAweGQwNDMsIDAsIDIsIDB4MDAgfSwKKwl7IDB4ZDA0NSwgMSwgMSwgMHgwMCB9LAorCXsgMHg5YmNmLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNDUsIDIsIDEsIDB4MDEgfSwKKwl7IDB4ZDA0ZiwgMCwgOCwgMHg5YSB9LAorCXsgMHhkMDUwLCAwLCAxLCAweDAxIH0sCisJeyAweGQwNTEsIDAsIDgsIDB4NWEgfSwKKwl7IDB4ZDA1MiwgMCwgMSwgMHgwMSB9LAorCXsgMHhkMDUzLCAwLCA4LCAweDUwIH0sCisJeyAweGQwNTQsIDAsIDgsIDB4NDYgfSwKKwl7IDB4OWJkNywgMCwgOCwgMHgwYSB9LAorCXsgMHg5YmQ4LCAwLCA4LCAweDE0IH0sCisJeyAweDliZDksIDAsIDgsIDB4MDggfSwKKwl7IDB4OWJkMCwgMCwgOCwgMHhhOCB9LAorCXsgMHg5YmU0LCAwLCA4LCAweDdmIH0sCisJeyAweDliYmQsIDAsIDgsIDB4YTggfSwKKwl7IDB4OWJlMiwgMCwgOCwgMHgyMCB9LAorCXsgMHg5YmVlLCAwLCAxLCAweDAxIH0sCit9OworCisjZW5kaWYgLyogX0FGOTAxM19QUklWXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMi5jCmluZGV4IDBiODJjYzIuLmVhYmY5YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyLmMKQEAgLTQwLDYgKzQwLDggQEAKIAl1MzIgY3VycmVudF9mcmVxdWVuY3k7CiAJZmVfbW9kdWxhdGlvbl90IGN1cnJlbnRfbW9kdWxhdGlvbjsKIAorCXUzMiBmZV9zdGF0dXM7CisJdW5zaWduZWQgaW50IGxlZF9zdGF0ZTsKIH07CiAKIHN0YXRpYyBpbnQgZGVidWc7CkBAIC01MzgsMTEgKzU0MCw5OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF1ODUyMl9sZWRfZ3Bpb19lbmFibGUoc3RydWN0IGF1ODUyMl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgYXU4NTIyX2xlZF9jb25maWcgKmxlZF9jb25maWcgPSBzdGF0ZS0+Y29uZmlnLT5sZWRfY2ZnOworCXU4IHZhbDsKKworCS8qIGJhaWwgb3V0IGlmIHdlIGNhbnQgY29udHJvbCBhbiBMRUQgKi8KKwlpZiAoIWxlZF9jb25maWcgfHwgIWxlZF9jb25maWctPmdwaW9fb3V0cHV0IHx8CisJICAgICFsZWRfY29uZmlnLT5ncGlvX291dHB1dF9lbmFibGUgfHwgIWxlZF9jb25maWctPmdwaW9fb3V0cHV0X2Rpc2FibGUpCisJCXJldHVybiAwOworCisJdmFsID0gYXU4NTIyX3JlYWRyZWcoc3RhdGUsIDB4NDAwMCB8CisJCQkgICAgIChsZWRfY29uZmlnLT5ncGlvX291dHB1dCAmIH4weGMwMDApKTsKKwlpZiAob25vZmYpIHsKKwkJLyogZW5hYmxlIEdQSU8gb3V0cHV0ICovCisJCXZhbCAmPSB+KChsZWRfY29uZmlnLT5ncGlvX291dHB1dF9lbmFibGUgPj4gOCkgJiAweGZmKTsKKwkJdmFsIHw9ICAobGVkX2NvbmZpZy0+Z3Bpb19vdXRwdXRfZW5hYmxlICYgMHhmZik7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBHUElPIG91dHB1dCAqLworCQl2YWwgJj0gfigobGVkX2NvbmZpZy0+Z3Bpb19vdXRwdXRfZGlzYWJsZSA+PiA4KSAmIDB4ZmYpOworCQl2YWwgfD0gIChsZWRfY29uZmlnLT5ncGlvX291dHB1dF9kaXNhYmxlICYgMHhmZik7CisJfQorCXJldHVybiBhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIDB4ODAwMCB8CisJCQkgICAgICAgKGxlZF9jb25maWctPmdwaW9fb3V0cHV0ICYgfjB4YzAwMCksIHZhbCk7Cit9CisKKy8qIGxlZCA9IDAgfCBvZmYKKyAqIGxlZCA9IDEgfCBzaWduYWwgb2sKKyAqIGxlZCA9IDIgfCBzaWduYWwgc3Ryb25nCisgKiBsZWQgPCAwIHwgb25seSBsaWdodCBsZWQgaWYgbGVkcyBhcmUgY3VycmVudGx5IG9mZgorICovCitzdGF0aWMgaW50IGF1ODUyMl9sZWRfY3RybChzdHJ1Y3QgYXU4NTIyX3N0YXRlICpzdGF0ZSwgaW50IGxlZCkKK3sKKwlzdHJ1Y3QgYXU4NTIyX2xlZF9jb25maWcgKmxlZF9jb25maWcgPSBzdGF0ZS0+Y29uZmlnLT5sZWRfY2ZnOworCWludCBpLCByZXQgPSAwOworCisJLyogYmFpbCBvdXQgaWYgd2UgY2FudCBjb250cm9sIGFuIExFRCAqLworCWlmICghbGVkX2NvbmZpZyB8fCAhbGVkX2NvbmZpZy0+Z3Bpb19sZWRzIHx8CisJICAgICFsZWRfY29uZmlnLT5udW1fbGVkX3N0YXRlcyB8fCAhbGVkX2NvbmZpZy0+bGVkX3N0YXRlcykKKwkJcmV0dXJuIDA7CisKKwlpZiAobGVkIDwgMCkgeworCQkvKiBpZiBMRUQgaXMgYWxyZWFkeSBsaXQsIHRoZW4gbGVhdmUgaXQgYXMtaXMgKi8KKwkJaWYgKHN0YXRlLT5sZWRfc3RhdGUpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJbGVkICo9IC0xOworCX0KKworCS8qIHRvZ2dsZSBMRUQgaWYgY2hhbmdpbmcgc3RhdGUgKi8KKwlpZiAoc3RhdGUtPmxlZF9zdGF0ZSAhPSBsZWQpIHsKKwkJdTggdmFsOworCisJCWRwcmludGsoIiVzOiAlZFxuIiwgX19mdW5jX18sIGxlZCk7CisKKwkJYXU4NTIyX2xlZF9ncGlvX2VuYWJsZShzdGF0ZSwgMSk7CisKKwkJdmFsID0gYXU4NTIyX3JlYWRyZWcoc3RhdGUsIDB4NDAwMCB8CisJCQkJICAgICAobGVkX2NvbmZpZy0+Z3Bpb19sZWRzICYgfjB4YzAwMCkpOworCisJCS8qIHN0YXJ0IHdpdGggYWxsIGxlZHMgb2ZmICovCisJCWZvciAoaSA9IDA7IGkgPCBsZWRfY29uZmlnLT5udW1fbGVkX3N0YXRlczsgaSsrKQorCQkJdmFsICY9IH5sZWRfY29uZmlnLT5sZWRfc3RhdGVzW2ldOworCisJCS8qIHNldCBzZWxlY3RlZCBMRUQgc3RhdGUgKi8KKwkJaWYgKGxlZCA8IGxlZF9jb25maWctPm51bV9sZWRfc3RhdGVzKQorCQkJdmFsIHw9IGxlZF9jb25maWctPmxlZF9zdGF0ZXNbbGVkXTsKKwkJZWxzZSBpZiAobGVkX2NvbmZpZy0+bnVtX2xlZF9zdGF0ZXMpCisJCQl2YWwgfD0KKwkJCWxlZF9jb25maWctPmxlZF9zdGF0ZXNbbGVkX2NvbmZpZy0+bnVtX2xlZF9zdGF0ZXMgLSAxXTsKKworCQlyZXQgPSBhdTg1MjJfd3JpdGVyZWcoc3RhdGUsIDB4ODAwMCB8CisJCQkJICAgICAgKGxlZF9jb25maWctPmdwaW9fbGVkcyAmIH4weGMwMDApLCB2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJc3RhdGUtPmxlZF9zdGF0ZSA9IGxlZDsKKworCQlpZiAobGVkID09IDApCisJCQlhdTg1MjJfbGVkX2dwaW9fZW5hYmxlKHN0YXRlLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdTg1MjJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGF1ODUyMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKKwkvKiB0dXJuIG9mZiBsZWQgKi8KKwlhdTg1MjJfbGVkX2N0cmwoc3RhdGUsIDApOworCiAJc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ID0gMDsKIAogCXJldHVybiAwOwpAQCAtNTkyLDEyICs2ODEsNTMgQEAKIAkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfU0lHTkFMOwogCQlicmVhazsKIAl9CisJc3RhdGUtPmZlX3N0YXR1cyA9ICpzdGF0dXM7CisKKwlpZiAoKnN0YXR1cyAmIEZFX0hBU19MT0NLKQorCQkvKiB0dXJuIG9uIExFRCwgaWYgaXQgaXNuJ3Qgb24gYWxyZWFkeSAqLworCQlhdTg1MjJfbGVkX2N0cmwoc3RhdGUsIC0xKTsKKwllbHNlCisJCS8qIHR1cm4gb2ZmIExFRCAqLworCQlhdTg1MjJfbGVkX2N0cmwoc3RhdGUsIDApOwogCiAJZHByaW50aygiJXMoKSBzdGF0dXMgMHglMDh4XG4iLCBfX2Z1bmNfXywgKnN0YXR1cyk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdTg1MjJfbGVkX3N0YXR1cyhzdHJ1Y3QgYXU4NTIyX3N0YXRlICpzdGF0ZSwgY29uc3QgdTE2ICpzbnIpCit7CisJc3RydWN0IGF1ODUyMl9sZWRfY29uZmlnICpsZWRfY29uZmlnID0gc3RhdGUtPmNvbmZpZy0+bGVkX2NmZzsKKwlpbnQgbGVkOworCXUxNiBzdHJvbmc7CisKKwkvKiBiYWlsIG91dCBpZiB3ZSBjYW50IGNvbnRyb2wgYW4gTEVEICovCisJaWYgKCFsZWRfY29uZmlnKQorCQlyZXR1cm4gMDsKKworCWlmICgwID09IChzdGF0ZS0+ZmVfc3RhdHVzICYgRkVfSEFTX0xPQ0spKQorCQlyZXR1cm4gYXU4NTIyX2xlZF9jdHJsKHN0YXRlLCAwKTsKKwllbHNlIGlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID09IFFBTV8yNTYpCisJCXN0cm9uZyA9IGxlZF9jb25maWctPnFhbTI1Nl9zdHJvbmc7CisJZWxzZSBpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBRQU1fNjQpCisJCXN0cm9uZyA9IGxlZF9jb25maWctPnFhbTY0X3N0cm9uZzsKKwllbHNlIC8qIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID09IFZTQl84KSAqLworCQlzdHJvbmcgPSBsZWRfY29uZmlnLT52c2I4X3N0cm9uZzsKKworCWlmICgqc25yID49IHN0cm9uZykKKwkJbGVkID0gMjsKKwllbHNlCisJCWxlZCA9IDE7CisKKwlpZiAoKHN0YXRlLT5sZWRfc3RhdGUpICYmCisJICAgICgoKHN0cm9uZyA8ICpzbnIpID8gKCpzbnIgLSBzdHJvbmcpIDogKHN0cm9uZyAtICpzbnIpKSA8PSAxMCkpCisJCS8qIHNuciBkaWRuJ3QgY2hhbmdlIGVub3VnaCB0byBib3RoZXIKKwkJICogY2hhbmdpbmcgdGhlIGNvbG9yIG9mIHRoZSBsZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXU4NTIyX2xlZF9jdHJsKHN0YXRlLCBsZWQpOworfQorCiBzdGF0aWMgaW50IGF1ODUyMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCiB7CiAJc3RydWN0IGF1ODUyMl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTYyMSw2ICs3NTEsOSBAQAogCQkJCQkgICAgYXU4NTIyX3JlYWRyZWcoc3RhdGUsIDB4NDMxMSksCiAJCQkJCSAgICBzbnIpOwogCisJaWYgKHN0YXRlLT5jb25maWctPmxlZF9jZmcpCisJCWF1ODUyMl9sZWRfc3RhdHVzKHN0YXRlLCBzbnIpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMi5oCmluZGV4IDU5NTkxNWEuLjdiOTRmNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyLmgKQEAgLTMwLDYgKzMwLDIxIEBACiAJQVU4NTIyX0lGXzNfMjVNSFosCiB9OwogCitzdHJ1Y3QgYXU4NTIyX2xlZF9jb25maWcgeworCXUxNiB2c2I4X3N0cm9uZzsKKwl1MTYgcWFtNjRfc3Ryb25nOworCXUxNiBxYW0yNTZfc3Ryb25nOworCisJdTE2IGdwaW9fb3V0cHV0OworCS8qIHVuc2V0IGhpIGJpdHMsIHNldCBsb3cgYml0cyAqLworCXUxNiBncGlvX291dHB1dF9lbmFibGU7CisJdTE2IGdwaW9fb3V0cHV0X2Rpc2FibGU7CisKKwl1MTYgZ3Bpb19sZWRzOworCXU4ICpsZWRfc3RhdGVzOworCXVuc2lnbmVkIGludCBudW1fbGVkX3N0YXRlczsKK307CisKIHN0cnVjdCBhdTg1MjJfY29uZmlnIHsKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CkBAIC0zOSw2ICs1NCw4IEBACiAjZGVmaW5lIEFVODUyMl9ERU1PRExPQ0tJTkcgMQogCXU4IHN0YXR1c19tb2RlOwogCisJc3RydWN0IGF1ODUyMl9sZWRfY29uZmlnICpsZWRfY2ZnOworCiAJZW51bSBhdTg1MjJfaWZfZnJlcSB2c2JfaWY7CiAJZW51bSBhdTg1MjJfaWZfZnJlcSBxYW1faWY7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKaW5kZXggMTc5MmFkYi4uZmRjY2VlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCkBAIC0zMywxMiArMzMsMTcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgY3gyNDExMF9wbGxfd3JpdGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiB2YWwpIHsKLQlpbnQgciA9IDA7Ci0JdTggYnVmW10gPSB7KHU4KSAodmFsPj4yNCksICh1OCkgKHZhbD4+MTYpLCAodTgpICh2YWw+PjgpfTsKK3N0YXRpYyBpbmxpbmUgaW50IGN4MjQxMTBfcGxsX3dyaXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgdmFsKQoreworCXU4IGJ1ZltdID0geworCQkodTgpKCh2YWwgPj4gMjQpICYgMHhmZiksCisJCSh1OCkoKHZhbCA+PiAxNikgJiAweGZmKSwKKwkJKHU4KSgodmFsID4+IDgpICYgMHhmZikKKwl9OworCiAJaWYgKGZlLT5vcHMud3JpdGUpCi0JCXIgPSBmZS0+b3BzLndyaXRlKGZlLCBidWYsIDMpOwotCXJldHVybiByOworCQlyZXR1cm4gZmUtPm9wcy53cml0ZShmZSwgYnVmLCAzKTsKKwlyZXR1cm4gMDsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTEwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMTBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIzNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwpAQCAtMCwwICsxLDE0MjMgQEAKKy8qCisgICAgQ29uZXhhbnQgY3gyNDExNi9jeDI0MTE4IC0gRFZCUy9TMiBTYXRlbGxpdGUgZGVtb2QvdHVuZXIgZHJpdmVyCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBTdGV2ZW4gVG90aCA8c3RvdGhAaGF1cHBhdWdlLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHZW9yZyBBY2hlcgorICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IERhcnJvbiBCcm9hZAorCU1hcmNoIDIwMDcKKwkgICAgRml4ZWQgc29tZSBidWdzLgorCSAgICBBZGRlZCBkaXNlcWMgc3VwcG9ydC4KKwkgICAgQWRkZWQgY29ycmVjdGVkIHNpZ25hbCBzdHJlbmd0aCBzdXBwb3J0LgorCUF1Z3VzdCAyMDA3CisJICAgIFN5bmMgd2l0aCBsZWdhY3kgdmVyc2lvbi4KKwkgICAgU29tZSBjbGVhbiB1cHMuCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IElnb3IgTGlwbGlhbmluCisJU2VwdGVtYmVyLCA5dGggMjAwOAorCSAgICBGaXhlZCBsb2NraW5nIG9uIGhpZ2ggc3ltYm9sIHJhdGVzICg+MzAwMDApLgorCSAgICBJbXBsZW1lbnQgTVBFRyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImN4MjQxMTYuaCIKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcpIHByaW50ayAoImN4MjQxMTY6ICIgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENYMjQxMTZfREVGQVVMVF9GSVJNV0FSRSAiZHZiLWZlLWN4MjQxMTYuZnciCisjZGVmaW5lIENYMjQxMTZfU0VBUkNIX1JBTkdFX0tIWiA1MDAwCisKKy8qIGtub3duIHJlZ2lzdGVycyAqLworI2RlZmluZSBDWDI0MTE2X1JFR19DT01NQU5EICgweDAwKSAgICAgIC8qIGNvbW1hbmQgYXJncyAweDAwLi4weDFlICovCisjZGVmaW5lIENYMjQxMTZfUkVHX0VYRUNVVEUgKDB4MWYpICAgICAgLyogZXhlY3V0ZSBjb21tYW5kICovCisjZGVmaW5lIENYMjQxMTZfUkVHX01BSUxCT1ggKDB4OTYpICAgICAgLyogRlcgb3IgbXVsdGlwdXJwb3NlIG1haWxib3g/ICovCisjZGVmaW5lIENYMjQxMTZfUkVHX1JFU0VUICAgKDB4MjApICAgICAgLyogcmVzZXQgc3RhdHVzID4gMCAgICAgKi8KKyNkZWZpbmUgQ1gyNDExNl9SRUdfU0lHTkFMICAoMHg5ZSkgICAgICAvKiBzaWduYWwgbG93ICAgICAgICAgICAqLworI2RlZmluZSBDWDI0MTE2X1JFR19TU1RBVFVTICgweDlkKSAgICAgIC8qIHNpZ25hbCBoaWdoIC8gc3RhdHVzICovCisjZGVmaW5lIENYMjQxMTZfUkVHX1FVQUxJVFk4ICgweGEzKQorI2RlZmluZSBDWDI0MTE2X1JFR19RU1RBVFVTICgweGJjKQorI2RlZmluZSBDWDI0MTE2X1JFR19RVUFMSVRZMCAoMHhkNSkKKyNkZWZpbmUgQ1gyNDExNl9SRUdfQkVSMCAgICAoMHhjOSkKKyNkZWZpbmUgQ1gyNDExNl9SRUdfQkVSOCAgICAoMHhjOCkKKyNkZWZpbmUgQ1gyNDExNl9SRUdfQkVSMTYgICAoMHhjNykKKyNkZWZpbmUgQ1gyNDExNl9SRUdfQkVSMjQgICAoMHhjNikKKyNkZWZpbmUgQ1gyNDExNl9SRUdfVUNCMCAgICAoMHhjYikKKyNkZWZpbmUgQ1gyNDExNl9SRUdfVUNCOCAgICAoMHhjYSkKKyNkZWZpbmUgQ1gyNDExNl9SRUdfQ0xLRElWICAoMHhmMykKKyNkZWZpbmUgQ1gyNDExNl9SRUdfUkFURURJViAoMHhmOSkKKyNkZWZpbmUgQ1gyNDExNl9SRUdfRkVDU1RBVFVTICgweDljKSAgICAvKiBjb25maWd1cmVkIGZlYyAobm90IHR1bmVkKSBvciBhY3R1YWwgRkVDICh0dW5lZCkgMT0xLzIgMj0yLzMgZXRjICovCisKKy8qIEZFQ1NUQVRVUyBiaXRzICovCisjZGVmaW5lIENYMjQxMTZfRkVDX0ZFQ01BU0sgICAoMHgxZikgICAgLyogbWFzayB0byBkZXRlcm1pbmUgY29uZmlndXJlZCBmZWMgKG5vdCB0dW5lZCkgb3IgYWN0dWFsIGZlYyAodHVuZWQpICovCisjZGVmaW5lIENYMjQxMTZfRkVDX0RWQlMgICAgICAoMHgyMCkgICAgLyogU2VsZWN0IERWQi1TIGRlbW9kdWxhdG9yLCBlbHNlIERWQi1TMiAqLworI2RlZmluZSBDWDI0MTE2X0ZFQ19VTktOT1dOICAgKDB4NDApICAgIC8qIFVua25vd24vdW51c2VkICovCisjZGVmaW5lIENYMjQxMTZfRkVDX1BJTE9UICAgICAoMHg4MCkgICAgLyogUGlsb3QgbW9kZSByZXF1ZXN0ZWQgd2hlbiB0dW5pbmcgZWxzZSBhbHdheXMgcmVzZXQgd2hlbiB0dW5lZCAqLworCisvKiBhcmcgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgQ1gyNDExNl9BUkdMRU4gKDB4MWUpCisKKy8qIHJvbGxvZmYgKi8KKyNkZWZpbmUgQ1gyNDExNl9ST0xMT0ZGXzAyMCAoMHgwMCkKKyNkZWZpbmUgQ1gyNDExNl9ST0xMT0ZGXzAyNSAoMHgwMSkKKyNkZWZpbmUgQ1gyNDExNl9ST0xMT0ZGXzAzNSAoMHgwMikKKworLyogcGlsb3QgYml0ICovCisjZGVmaW5lIENYMjQxMTZfUElMT1RfT0ZGICgweDAwKQorI2RlZmluZSBDWDI0MTE2X1BJTE9UX09OICgweDQwKQorCisvKiBzaWduYWwgc3RhdHVzICovCisjZGVmaW5lIENYMjQxMTZfSEFTX1NJR05BTCAgICgweDAxKQorI2RlZmluZSBDWDI0MTE2X0hBU19DQVJSSUVSICAoMHgwMikKKyNkZWZpbmUgQ1gyNDExNl9IQVNfVklURVJCSSAgKDB4MDQpCisjZGVmaW5lIENYMjQxMTZfSEFTX1NZTkNMT0NLICgweDA4KQorI2RlZmluZSBDWDI0MTE2X0hBU19VTktOT1dOMSAoMHgxMCkKKyNkZWZpbmUgQ1gyNDExNl9IQVNfVU5LTk9XTjIgKDB4MjApCisjZGVmaW5lIENYMjQxMTZfU1RBVFVTX01BU0sgICgweDNmKQorI2RlZmluZSBDWDI0MTE2X1NJR05BTF9NQVNLICAoMHhjMCkKKworI2RlZmluZSBDWDI0MTE2X0RJU0VRQ19UT05FT0ZGICAgKDApICAgIC8qIHRvbmVidXJzdCBuZXZlciBzZW50ICovCisjZGVmaW5lIENYMjQxMTZfRElTRVFDX1RPTkVDQUNIRSAoMSkgICAgLyogdG9uZWJ1cnN0IGNhY2hlZCAgICAgKi8KKyNkZWZpbmUgQ1gyNDExNl9ESVNFUUNfTUVTR0NBQ0hFICgyKSAgICAvKiBtZXNzYWdlIGNhY2hlZCAgICAgICAqLworCisvKiBhcmcgb2Zmc2V0IGZvciBEaVNFcUMgKi8KKyNkZWZpbmUgQ1gyNDExNl9ESVNFUUNfQlVSU1QgICgxKQorI2RlZmluZSBDWDI0MTE2X0RJU0VRQ19BUkcyXzIgKDIpICAgLyogdW5rbm93biB2YWx1ZT0yICovCisjZGVmaW5lIENYMjQxMTZfRElTRVFDX0FSRzNfMCAoMykgICAvKiB1bmtub3duIHZhbHVlPTAgKi8KKyNkZWZpbmUgQ1gyNDExNl9ESVNFUUNfQVJHNF8wICg0KSAgIC8qIHVua25vd24gdmFsdWU9MCAqLworI2RlZmluZSBDWDI0MTE2X0RJU0VRQ19NU0dMRU4gKDUpCisjZGVmaW5lIENYMjQxMTZfRElTRVFDX01TR09GUyAoNikKKworLyogRGlTRXFDIGJ1cnN0ICovCisjZGVmaW5lIENYMjQxMTZfRElTRVFDX01JTklfQSAoMCkKKyNkZWZpbmUgQ1gyNDExNl9ESVNFUUNfTUlOSV9CICgxKQorCisvKiBEaVNFcUMgdG9uZSBidXJzdCAqLworc3RhdGljIGludCB0b25lYnVyc3QgPSAxOworCisvKiBTTlIgbWVhc3VyZW1lbnRzICovCitzdGF0aWMgaW50IGVzbm9fc25yID0gMDsKKworZW51bSBjbWRzCit7CisJQ01EX1NFVF9WQ08gICAgID0gMHgxMCwKKwlDTURfVFVORVJFUVVFU1QgPSAweDExLAorCUNNRF9NUEVHQ09ORklHICA9IDB4MTMsCisJQ01EX1RVTkVSSU5JVCAgID0gMHgxNCwKKwlDTURfQkFORFdJRFRIICAgPSAweDE1LAorCUNNRF9HRVRBR0MgICAgICA9IDB4MTksCisJQ01EX0xOQkNPTkZJRyAgID0gMHgyMCwKKwlDTURfTE5CU0VORCAgICAgPSAweDIxLCAvKiBGb3JtZXJseSBDTURfU0VORF9ESVNFUUMgKi8KKwlDTURfU0VUX1RPTkVQUkUgPSAweDIyLAorCUNNRF9TRVRfVE9ORSAgICA9IDB4MjMsCisJQ01EX1VQREZXVkVSUyAgID0gMHgzNSwKKwlDTURfVFVORVJTTEVFUCAgPSAweDM2LAorCUNNRF9BR0NDT05UUk9MICA9IDB4M2IsIC8qIFVua25vd24gKi8KK307CisKKy8qIFRoZSBEZW1vZC9UdW5lciBjYW4ndCBlYXNpbHkgcHJvdmlkZSB0aGVzZSwgd2UgY2FjaGUgdGhlbSAqLworc3RydWN0IGN4MjQxMTZfdHVuaW5nCit7CisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgc3ltYm9sX3JhdGU7CisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uOworCWZlX2NvZGVfcmF0ZV90IGZlYzsKKworCWZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOworCWZlX3BpbG90X3QgcGlsb3Q7CisJZmVfcm9sbG9mZl90IHJvbGxvZmY7CisKKwkvKiBEZW1vZCB2YWx1ZXMgKi8KKwl1OCBmZWNfdmFsOworCXU4IGZlY19tYXNrOworCXU4IGludmVyc2lvbl92YWw7CisJdTggcGlsb3RfdmFsOworCXU4IHJvbGxvZmZfdmFsOworfTsKKworLyogQmFzaWMgY29tbWFuZHMgdGhhdCBhcmUgc2VudCB0byB0aGUgZmlybXdhcmUgKi8KK3N0cnVjdCBjeDI0MTE2X2NtZAoreworCXU4IGxlbjsKKwl1OCBhcmdzW0NYMjQxMTZfQVJHTEVOXTsKK307CisKK3N0cnVjdCBjeDI0MTE2X3N0YXRlCit7CisJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CisJY29uc3Qgc3RydWN0IGN4MjQxMTZfY29uZmlnKiBjb25maWc7CisKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCisJc3RydWN0IGN4MjQxMTZfdHVuaW5nIGRjdXI7CisJc3RydWN0IGN4MjQxMTZfdHVuaW5nIGRueHQ7CisKKwl1OCBza2lwX2Z3X2xvYWQ7CisJdTggYnVyc3Q7CisJc3RydWN0IGN4MjQxMTZfY21kIGRzZWNfY21kOworfTsKKworc3RhdGljIGludCBjeDI0MTE2X3dyaXRlcmVnKHN0cnVjdCBjeDI0MTE2X3N0YXRlKiBzdGF0ZSwgaW50IHJlZywgaW50IGRhdGEpCit7CisJdTggYnVmW10gPSB7IHJlZywgZGF0YSB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMiB9OworCWludCBlcnI7CisKKwlpZiAoZGVidWc+MSkKKwkJcHJpbnRrKCJjeDI0MTE2OiAlczogd3JpdGUgcmVnIDB4JTAyeCwgdmFsdWUgMHglMDJ4XG4iLAorCQkJCQkJX19mdW5jX18scmVnLCBkYXRhKTsKKworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCXByaW50aygiJXM6IHdyaXRlcmVnIGVycm9yKGVyciA9PSAlaSwgcmVnID09IDB4JTAyeCwiCisJCQkgIiB2YWx1ZSA9PSAweCUwMngpXG4iLCBfX2Z1bmNfXywgZXJyLCByZWcsIGRhdGEpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQnVsayBieXRlIHdyaXRlcyB0byBhIHNpbmdsZSBJMkMgYWRkcmVzcywgZm9yIDMyayBmaXJtd2FyZSBsb2FkICovCitzdGF0aWMgaW50IGN4MjQxMTZfd3JpdGVyZWdOKHN0cnVjdCBjeDI0MTE2X3N0YXRlKiBzdGF0ZSwgaW50IHJlZywgdTggKmRhdGEsIHUxNiBsZW4pCit7CisJaW50IHJldCA9IC1FUkVNT1RFSU87CisJc3RydWN0IGkyY19tc2cgbXNnOworCXU4ICpidWY7CisKKwlidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlwcmludGsoIlVuYWJsZSB0byBrbWFsbG9jXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqKGJ1ZikgPSByZWc7CisJbWVtY3B5KGJ1ZiArIDEsIGRhdGEsIGxlbik7CisKKwltc2cuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3M7CisJbXNnLmZsYWdzID0gMDsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSBsZW4gKyAxOworCisJaWYgKGRlYnVnPjEpCisJCXByaW50aygiY3gyNDExNjogJXM6ICB3cml0ZSByZWdOIDB4JTAyeCwgbGVuID0gJWRcbiIsCisJCQkJCQlfX2Z1bmNfXyxyZWcsIGxlbik7CisKKwlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoIiVzOiB3cml0ZXJlZyBlcnJvcihlcnIgPT0gJWksIHJlZyA9PSAweCUwMnhcbiIsCisJCQkgX19mdW5jX18sIHJldCwgcmVnKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisKK2Vycm9yOgorCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZHJlZyhzdHJ1Y3QgY3gyNDExNl9zdGF0ZSogc3RhdGUsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCXU4IGIwW10gPSB7IHJlZyB9OworCXU4IGIxW10gPSB7IDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSBiMCwgLmxlbiA9IDEgfSwKKwkJeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisKKwlpZiAocmV0ICE9IDIpIHsKKwkJcHJpbnRrKCIlczogcmVnPTB4JXggKGVycm9yPSVkKVxuIiwgX19mdW5jX18sIHJlZywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGVidWc+MSkKKwkJcHJpbnRrKCJjeDI0MTE2OiByZWFkIHJlZyAweCUwMngsIHZhbHVlIDB4JTAyeFxuIixyZWcsIGIxWzBdKTsKKworCXJldHVybiBiMVswXTsKK30KKworc3RhdGljIGludCBjeDI0MTE2X3NldF9pbnZlcnNpb24oc3RydWN0IGN4MjQxMTZfc3RhdGUqIHN0YXRlLCBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb24pCit7CisJZHByaW50aygiJXMoJWQpXG4iLCBfX2Z1bmNfXywgaW52ZXJzaW9uKTsKKworCXN3aXRjaCAoaW52ZXJzaW9uKSB7CisJY2FzZSBJTlZFUlNJT05fT0ZGOgorCQlzdGF0ZS0+ZG54dC5pbnZlcnNpb25fdmFsID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBJTlZFUlNJT05fT046CisJCXN0YXRlLT5kbnh0LmludmVyc2lvbl92YWwgPSAweDA0OworCQlicmVhazsKKwljYXNlIElOVkVSU0lPTl9BVVRPOgorCQlzdGF0ZS0+ZG54dC5pbnZlcnNpb25fdmFsID0gMHgwQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdGUtPmRueHQuaW52ZXJzaW9uID0gaW52ZXJzaW9uOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtb2RmZWMgKG1vZHVsYXRpb24gYW5kIEZFQykKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIE1PRCAgICAgICAgICBGRUMgICAgICAgICAgICAgbWFzay92YWwgICAgc3RhbmRhcmQKKyAqIC0tLS0gICAgICAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0KKyAqIFFQU0sgICAgICAgICBGRUNfMV8yICAgICAgICAgMHgwMiAweDAyK1ggRFZCLVMKKyAqIFFQU0sgICAgICAgICBGRUNfMl8zICAgICAgICAgMHgwNCAweDAyK1ggRFZCLVMKKyAqIFFQU0sgICAgICAgICBGRUNfM180ICAgICAgICAgMHgwOCAweDAyK1ggRFZCLVMKKyAqIFFQU0sgICAgICAgICBGRUNfNF81ICAgICAgICAgMHgxMCAweDAyK1ggRFZCLVMgKD8pCisgKiBRUFNLICAgICAgICAgRkVDXzVfNiAgICAgICAgIDB4MjAgMHgwMitYIERWQi1TCisgKiBRUFNLICAgICAgICAgRkVDXzZfNyAgICAgICAgIDB4NDAgMHgwMitYIERWQi1TCisgKiBRUFNLICAgICAgICAgRkVDXzdfOCAgICAgICAgIDB4ODAgMHgwMitYIERWQi1TCisgKiBRUFNLICAgICAgICAgRkVDXzhfOSAgICAgICAgIDB4MDEgMHgwMitYIERWQi1TICg/KSAoTk9UIFNVUFBPUlRFRD8pCisgKiBRUFNLICAgICAgICAgQVVUTyAgICAgICAgICAgIDB4ZmYgMHgwMitYIERWQi1TCisgKgorICogRm9yIERWQi1TIGhpZ2ggYnl0ZSBwcm9iYWJseSByZXByZXNlbnRzIEZFQworICogYW5kIGxvdyBieXRlIHNlbGVjdHMgdGhlIG1vZHVsYXRvci4gVGhlIGhpZ2gKKyAqIGJ5dGUgaXMgc2VhcmNoIHJhbmdlIG1hc2suIEJpdCA1IG1heSB0dXJuCisgKiBvbiBEVkItUyBhbmQgcmVtYWluaW5nIGJpdHMgcmVwcmVzZW50IHNvbWUKKyAqIGtpbmQgb2YgY2FsaWJyYXRpb24gKGhvdy93aGF0IGkgZG8gbm90IGtub3cpLgorICoKKyAqIEVnLigyLzMpIHN6YXAgIlpvbmUgSG9ycm9yIgorICoKKyAqIG1hc2svdmFsID0gMHgwNCwgMHgyMAorICogc3RhdHVzIDFmIHwgc2lnbmFsIGMzYzAgfCBzbnIgYTMzMyB8IGJlciAwMDAwMDA5OCB8IHVuYyAwMDAwMDAwMCB8IEZFX0hBU19MT0NLCisgKgorICogbWFzay92YWwgPSAweDA0LCAweDMwCisgKiBzdGF0dXMgMWYgfCBzaWduYWwgYzNjMCB8IHNuciBhMzMzIHwgYmVyIDAwMDAwMDAwIHwgdW5jIDAwMDAwMDAwIHwgRkVfSEFTX0xPQ0sKKyAqCisgKiBBZnRlciB0dW5pbmcgRkVDU1RBVFVTIGNvbnRhaW5zIGFjdHVhbCBGRUMKKyAqIGluIHVzZSBudW1iZXJlZCAxIHRocm91Z2ggdG8gOCBmb3IgMS8yIC4uIDIvMyBldGMKKyAqCisgKiBOQkM9Tk9UL05PTiBCQUNLV0FSRCBDT01QQVRJQkxFIFdJVEggRFZCLVMgKERWQi1TMiBvbmx5KQorICoKKyAqIE5CQy1RUFNLICAgICBGRUNfMV8yICAgICAgICAgMHgwMCwgMHgwNCAgICAgIERWQi1TMgorICogTkJDLVFQU0sgICAgIEZFQ18zXzUgICAgICAgICAweDAwLCAweDA1ICAgICAgRFZCLVMyCisgKiBOQkMtUVBTSyAgICAgRkVDXzJfMyAgICAgICAgIDB4MDAsIDB4MDYgICAgICBEVkItUzIKKyAqIE5CQy1RUFNLICAgICBGRUNfM180ICAgICAgICAgMHgwMCwgMHgwNyAgICAgIERWQi1TMgorICogTkJDLVFQU0sgICAgIEZFQ180XzUgICAgICAgICAweDAwLCAweDA4ICAgICAgRFZCLVMyCisgKiBOQkMtUVBTSyAgICAgRkVDXzVfNiAgICAgICAgIDB4MDAsIDB4MDkgICAgICBEVkItUzIKKyAqIE5CQy1RUFNLICAgICBGRUNfOF85ICAgICAgICAgMHgwMCwgMHgwYSAgICAgIERWQi1TMgorICogTkJDLVFQU0sgICAgIEZFQ185XzEwICAgICAgICAweDAwLCAweDBiICAgICAgRFZCLVMyCisgKgorICogTkJDLThQU0sgICAgIEZFQ18zXzUgICAgICAgICAweDAwLCAweDBjICAgICAgRFZCLVMyCisgKiBOQkMtOFBTSyAgICAgRkVDXzJfMyAgICAgICAgIDB4MDAsIDB4MGQgICAgICBEVkItUzIKKyAqIE5CQy04UFNLICAgICBGRUNfM180ICAgICAgICAgMHgwMCwgMHgwZSAgICAgIERWQi1TMgorICogTkJDLThQU0sgICAgIEZFQ181XzYgICAgICAgICAweDAwLCAweDBmICAgICAgRFZCLVMyCisgKiBOQkMtOFBTSyAgICAgRkVDXzhfOSAgICAgICAgIDB4MDAsIDB4MTAgICAgICBEVkItUzIKKyAqIE5CQy04UFNLICAgICBGRUNfOV8xMCAgICAgICAgMHgwMCwgMHgxMSAgICAgIERWQi1TMgorICoKKyAqIEZvciBEVkItUzIgbG93IGJ5dGVzIHNlbGVjdHMgYm90aCBtb2R1bGF0b3IKKyAqIGFuZCBGRUMuIEhpZ2ggYnl0ZSBpcyBtZWFuaW5nbGVzcyBoZXJlLiBUbworICogc2V0IHBpbG90LCBiaXQgNiAoMHg0MCkgaXMgc2V0LiBXaGVuIGluc3BlY3RpbmcKKyAqIEZFQ1NUQVRVUyBiaXQgNyAoMHg4MCkgcmVwcmVzZW50cyB0aGUgcGlsb3QKKyAqIHNlbGVjdGlvbiB3aGlsc3Qgbm90IHR1bmVkLiBXaGVuIHR1bmVkLCBhY3R1YWwgRkVDCisgKiBpbiB1c2UgaXMgZm91bmQgaW4gRkVDU1RBVFVTIGFzIHBlciBhYm92ZS4gUGlsb3QKKyAqIHZhbHVlIGlzIHJlc2V0LgorICovCisKKy8qIEEgdGFibGUgb2YgbW9kdWxhdGlvbiwgZmVjIGFuZCBjb25maWd1cmF0aW9uIGJ5dGVzIGZvciB0aGUgZGVtb2QuCisgKiBOb3QgYWxsIFMyIG1tb2R1bGF0aW9uIHNjaGVtZXMgYXJlIHN1cHBvcnQgYW5kIG5vdCBhbGwgcmF0ZXMgd2l0aAorICogYSBzY2hlbWUgYXJlIHN1cHBvcnQuIEVzcGVjaWFsbHksIG5vIGF1dG8gZGV0ZWN0IHdoZW4gaW4gUzIgbW9kZS4KKyAqLworc3RydWN0IGN4MjQxMTZfbW9kZmVjIHsKKwlmZV9kZWxpdmVyeV9zeXN0ZW1fdCBkZWxpdmVyeV9zeXN0ZW07CisJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CisJZmVfY29kZV9yYXRlX3QgZmVjOworCXU4IG1hc2s7CS8qIEluIERWQlMgbW9kZSB0aGlzIGlzIHVzZWQgdG8gYXV0b2RldGVjdCAqLworCXU4IHZhbDsJCS8qIFBhc3NlZCB0byB0aGUgZmlybXdhcmUgdG8gaW5kaWNhdGUgbW9kZSBzZWxlY3Rpb24gKi8KK30gQ1gyNDExNl9NT0RGRUNfTU9ERVNbXSA9IHsKKyAvKiBRUFNLLiBGb3IgdW5rbm93biByYXRlcyB3ZSBzZXQgaGFyZHdhcmUgdG8gYXV0byBkZXRlY3QgMHhmZSAweDMwICovCisKKyAvKm1vZCAgIGZlYyAgICAgICBtYXNrICB2YWwgKi8KKyB7IFNZU19EVkJTLCBRUFNLLCBGRUNfTk9ORSwgMHhmZSwgMHgzMCB9LAorIHsgU1lTX0RWQlMsIFFQU0ssIEZFQ18xXzIsICAweDAyLCAweDJlIH0sIC8qIDAwMDAwMDEwIDAwMTAxMTEwICovCisgeyBTWVNfRFZCUywgUVBTSywgRkVDXzJfMywgIDB4MDQsIDB4MmYgfSwgLyogMDAwMDAxMDAgMDAxMDExMTEgKi8KKyB7IFNZU19EVkJTLCBRUFNLLCBGRUNfM180LCAgMHgwOCwgMHgzMCB9LCAvKiAwMDAwMTAwMCAwMDExMDAwMCAqLworIHsgU1lTX0RWQlMsIFFQU0ssIEZFQ180XzUsICAweGZlLCAweDMwIH0sIC8qIDAwMD8wMDAwID8gICAgICAgICovCisgeyBTWVNfRFZCUywgUVBTSywgRkVDXzVfNiwgIDB4MjAsIDB4MzEgfSwgLyogMDAxMDAwMDAgMDAxMTAwMDEgKi8KKyB7IFNZU19EVkJTLCBRUFNLLCBGRUNfNl83LCAgMHhmZSwgMHgzMCB9LCAvKiAwPzAwMDAwMCA/ICAgICAgICAqLworIHsgU1lTX0RWQlMsIFFQU0ssIEZFQ183XzgsICAweDgwLCAweDMyIH0sIC8qIDEwMDAwMDAwIDAwMTEwMDEwICovCisgeyBTWVNfRFZCUywgUVBTSywgRkVDXzhfOSwgIDB4ZmUsIDB4MzAgfSwgLyogMDAwMDAwMD8gPyAgICAgICAgKi8KKyB7IFNZU19EVkJTLCBRUFNLLCBGRUNfQVVUTywgMHhmZSwgMHgzMCB9LAorIC8qIE5CQy1RUFNLICovCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ18xXzIsICAweDAwLCAweDA0IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ18zXzUsICAweDAwLCAweDA1IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ18yXzMsICAweDAwLCAweDA2IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ18zXzQsICAweDAwLCAweDA3IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ180XzUsICAweDAwLCAweDA4IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ181XzYsICAweDAwLCAweDA5IH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ184XzksICAweDAwLCAweDBhIH0sCisgeyBTWVNfRFZCUzIsIFFQU0ssIEZFQ185XzEwLCAweDAwLCAweDBiIH0sCisgLyogOFBTSyAqLworIHsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzNfNSwgIDB4MDAsIDB4MGMgfSwKKyB7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ18yXzMsICAweDAwLCAweDBkIH0sCisgeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfM180LCAgMHgwMCwgMHgwZSB9LAorIHsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzVfNiwgIDB4MDAsIDB4MGYgfSwKKyB7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ184XzksICAweDAwLCAweDEwIH0sCisgeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfOV8xMCwgMHgwMCwgMHgxMSB9LAorIC8qCisgICogYHZhbCcgY2FuIGJlIGZvdW5kIGluIHRoZSBGRUNTVEFUVVMgcmVnaXN0ZXIgd2hlbiB0dW5pbmcuCisgICogRkVDU1RBVFVTIHdpbGwgZ2l2ZSB0aGUgYWN0dWFsIEZFQyBpbiB1c2UgaWYgdHVuaW5nIHdhcyBzdWNjZXNzZnVsLgorICAqLworfTsKKworc3RhdGljIGludCBjeDI0MTE2X2xvb2t1cF9mZWNtb2Qoc3RydWN0IGN4MjQxMTZfc3RhdGUqIHN0YXRlLAorCWZlX21vZHVsYXRpb25fdCBtLCBmZV9jb2RlX3JhdGVfdCBmKQoreworCWludCBpLCByZXQgPSAtRU9QTk9UU1VQUDsKKworCWRwcmludGsoIiVzKDB4JTAyeCwweCUwMngpXG4iLCBfX2Z1bmNfXywgbSwgZik7CisKKwlmb3IoaT0wIDsgaSA8IHNpemVvZihDWDI0MTE2X01PREZFQ19NT0RFUykgLyBzaXplb2Yoc3RydWN0IGN4MjQxMTZfbW9kZmVjKSA7IGkrKykKKwl7CisJCWlmKCAobSA9PSBDWDI0MTE2X01PREZFQ19NT0RFU1tpXS5tb2R1bGF0aW9uKSAmJgorCQkJKGYgPT0gQ1gyNDExNl9NT0RGRUNfTU9ERVNbaV0uZmVjKSApCisJCQl7CisJCQkJcmV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfc2V0X2ZlYyhzdHJ1Y3QgY3gyNDExNl9zdGF0ZSogc3RhdGUsIGZlX21vZHVsYXRpb25fdCBtb2QsIGZlX2NvZGVfcmF0ZV90IGZlYykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoIiVzKDB4JTAyeCwweCUwMngpXG4iLCBfX2Z1bmNfXywgbW9kLCBmZWMpOworCisJcmV0ID0gY3gyNDExNl9sb29rdXBfZmVjbW9kKHN0YXRlLCBtb2QsIGZlYyk7CisKKwlpZihyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RhdGUtPmRueHQuZmVjID0gZmVjOworCXN0YXRlLT5kbnh0LmZlY192YWwgPSBDWDI0MTE2X01PREZFQ19NT0RFU1tyZXRdLnZhbDsKKwlzdGF0ZS0+ZG54dC5mZWNfbWFzayA9IENYMjQxMTZfTU9ERkVDX01PREVTW3JldF0ubWFzazsKKwlkcHJpbnRrKCIlcygpIG1hc2svdmFsID0gMHglMDJ4LzB4JTAyeFxuIiwgX19mdW5jX18sCisJCXN0YXRlLT5kbnh0LmZlY19tYXNrLCBzdGF0ZS0+ZG54dC5mZWNfdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfc2V0X3N5bWJvbHJhdGUoc3RydWN0IGN4MjQxMTZfc3RhdGUqIHN0YXRlLCB1MzIgcmF0ZSkKK3sKKwlkcHJpbnRrKCIlcyglZClcbiIsIF9fZnVuY19fLCByYXRlKTsKKworCS8qICBjaGVjayBpZiBzeW1ib2wgcmF0ZSBpcyB3aXRoaW4gbGltaXRzICovCisJaWYgKChyYXRlID4gc3RhdGUtPmZyb250ZW5kLm9wcy5pbmZvLnN5bWJvbF9yYXRlX21heCkgfHwKKwkgICAgKHJhdGUgPCBzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWluKSkgeworCQlkcHJpbnRrKCIlcygpIHVuc3VwcG9ydGVkIHN5bWJvbF9yYXRlID0gJWRcbiIsIF9fZnVuY19fLCByYXRlKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXN0YXRlLT5kbnh0LnN5bWJvbF9yYXRlID0gcmF0ZTsKKwlkcHJpbnRrKCIlcygpIHN5bWJvbF9yYXRlID0gJWRcbiIsIF9fZnVuY19fLCByYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfbG9hZF9maXJtd2FyZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOworCitzdGF0aWMgaW50IGN4MjQxMTZfZmlybXdhcmVfb25kZW1hbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludGsoIiVzKClcbiIsX19mdW5jX18pOworCisJaWYgKGN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgMHgyMCkgPiAwKQorCXsKKworCQlpZiAoc3RhdGUtPnNraXBfZndfbG9hZCkKKwkJCXJldHVybiAwOworCisJCS8qIExvYWQgZmlybXdhcmUgKi8KKwkJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KKwkJcHJpbnRrKCIlczogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkICglcykuLi5cbiIsIF9fZnVuY19fLCBDWDI0MTE2X0RFRkFVTFRfRklSTVdBUkUpOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgQ1gyNDExNl9ERUZBVUxUX0ZJUk1XQVJFLCAmc3RhdGUtPmkyYy0+ZGV2KTsKKwkJcHJpbnRrKCIlczogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkKDIpLi4uXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiJXM6IE5vIGZpcm13YXJlIHVwbG9hZGVkICh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjdXJzZSBiYWNrIHRocm91Z2ggaGVyZSBkdXJpbmcgbG9hZGluZyAqLworCQlzdGF0ZS0+c2tpcF9md19sb2FkID0gMTsKKworCQlyZXQgPSBjeDI0MTE2X2xvYWRfZmlybXdhcmUoZmUsIGZ3KTsKKwkJaWYgKHJldCkKKwkJCXByaW50aygiJXM6IFdyaXRpbmcgZmlybXdhcmUgdG8gZGV2aWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJCXByaW50aygiJXM6IEZpcm13YXJlIHVwbG9hZCAlc1xuIiwgX19mdW5jX18sIHJldCA9PSAwID8gImNvbXBsZXRlIiA6ICJmYWlsZWQiKTsKKworCQkvKiBFbnN1cmUgZmlybXdhcmUgaXMgYWx3YXlzIGxvYWRlZCBpZiByZXF1aXJlZCAqLworCQlzdGF0ZS0+c2tpcF9md19sb2FkID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUYWtlIGEgYmFzaWMgZmlybXdhcmUgY29tbWFuZCBzdHJ1Y3R1cmUsIGZvcm1hdCBpdCBhbmQgZm9yd2FyZCBpdCBmb3IgcHJvY2Vzc2luZyAqLworc3RhdGljIGludCBjeDI0MTE2X2NtZF9leGVjdXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgY3gyNDExNl9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgaSwgcmV0OworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogTG9hZCB0aGUgZmlybXdhcmUgaWYgcmVxdWlyZWQgKi8KKwlpZiAoIChyZXQgPSBjeDI0MTE2X2Zpcm13YXJlX29uZGVtYW5kKGZlKSkgIT0gMCkKKwl7CisJCXByaW50aygiJXMoKTogVW5hYmxlIGluaXRpYWxpc2UgdGhlIGZpcm13YXJlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogV3JpdGUgdGhlIGNvbW1hbmQgKi8KKwlmb3IoaSA9IDA7IGkgPCBjbWQtPmxlbiA7IGkrKykKKwl7CisJCWRwcmludGsoIiVzOiAweCUwMnggPT0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgaSwgY21kLT5hcmdzW2ldKTsKKwkJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgaSwgY21kLT5hcmdzW2ldKTsKKwl9CisKKwkvKiBTdGFydCBleGVjdXRpb24gYW5kIHdhaXQgZm9yIGNtZCB0byB0ZXJtaW5hdGUgKi8KKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19FWEVDVVRFLCAweDAxKTsKKwl3aGlsZSggY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19FWEVDVVRFKSApCisJeworCQltc2xlZXAoMTApOworCQlpZihpKysgPiA2NCkKKwkJeworCQkJLyogQXZvaWQgbG9vcGluZyBmb3JldmVyIGlmIHRoZSBmaXJtd2FyZSBkb2VzIG5vIHJlc3BvbmQgKi8KKwkJCXByaW50aygiJXMoKSBGaXJtd2FyZSBub3QgcmVzcG9uZGluZ1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDExNl9sb2FkX2Zpcm13YXJlIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExNl9jbWQgY21kOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciB2ZXJzWzRdOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCJGaXJtd2FyZSBpcyAlenUgYnl0ZXMgKCUwMnggJTAyeCAuLiAlMDJ4ICUwMngpXG4iCisJCQksZnctPnNpemUKKwkJCSxmdy0+ZGF0YVswXQorCQkJLGZ3LT5kYXRhWzFdCisJCQksZnctPmRhdGFbIGZ3LT5zaXplLTIgXQorCQkJLGZ3LT5kYXRhWyBmdy0+c2l6ZS0xIF0KKwkJCSk7CisKKwkvKiBUb2dnbGUgODh4IFNSU1QgcGluIHRvIHJlc2V0IGRlbW9kICovCisJaWYgKHN0YXRlLT5jb25maWctPnJlc2V0X2RldmljZSkKKwkJc3RhdGUtPmNvbmZpZy0+cmVzZXRfZGV2aWNlKGZlKTsKKworCS8qIEJlZ2luIHRoZSBmaXJtd2FyZSBsb2FkIHByb2Nlc3MgKi8KKwkvKiBQcmVwYXJlIHRoZSBkZW1vZCwgbG9hZCB0aGUgZmlybXdhcmUsIGNsZWFudXAgYWZ0ZXIgbG9hZCAqLworCisJLyogSW5pdCBQTEwgKi8KKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweEU1LCAweDAwKTsKKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweEYxLCAweDA4KTsKKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweEYyLCAweDEzKTsKKworCS8qIFN0YXJ0IFBMTCAqLworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIDB4ZTAsIDB4MDMpOworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIDB4ZTAsIDB4MDApOworCisJLyogVW5rbm93biAqLworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0NMS0RJViwgMHg0Nik7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfUkFURURJViwgMHgwMCk7CisKKwkvKiBVbmtub3duICovCisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGMCwgMHgwMyk7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGNCwgMHg4MSk7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGNSwgMHgwMCk7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGNiwgMHgwMCk7CisKKwkvKiB3cml0ZSB0aGUgZW50aXJlIGZpcm13YXJlIGFzIG9uZSB0cmFuc2FjdGlvbiAqLworCWN4MjQxMTZfd3JpdGVyZWdOKHN0YXRlLCAweEY3LCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGNCwgMHgxMCk7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGMCwgMHgwMCk7CisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhGOCwgMHgwNik7CisKKwkvKiBGaXJtd2FyZSBDTUQgMTA6IFZDTyBjb25maWcgKi8KKwljbWQuYXJnc1sweDAwXSA9IENNRF9TRVRfVkNPOworCWNtZC5hcmdzWzB4MDFdID0gMHgwNTsKKwljbWQuYXJnc1sweDAyXSA9IDB4ZGM7CisJY21kLmFyZ3NbMHgwM10gPSAweGRhOworCWNtZC5hcmdzWzB4MDRdID0gMHhhZTsKKwljbWQuYXJnc1sweDA1XSA9IDB4YWE7CisJY21kLmFyZ3NbMHgwNl0gPSAweDA0OworCWNtZC5hcmdzWzB4MDddID0gMHg5ZDsKKwljbWQuYXJnc1sweDA4XSA9IDB4ZmM7CisJY21kLmFyZ3NbMHgwOV0gPSAweDA2OworCWNtZC5sZW49IDB4MGE7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfU1NUQVRVUywgMHgwMCk7CisKKwkvKiBGaXJtd2FyZSBDTUQgMTQ6IFR1bmVyIGNvbmZpZyAqLworCWNtZC5hcmdzWzB4MDBdID0gQ01EX1RVTkVSSU5JVDsKKwljbWQuYXJnc1sweDAxXSA9IDB4MDA7CisJY21kLmFyZ3NbMHgwMl0gPSAweDAwOworCWNtZC5sZW49IDB4MDM7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgMHhlNSwgMHgwMCk7CisKKwkvKiBGaXJtd2FyZSBDTUQgMTM6IE1QRUcgY29uZmlnICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTVBFR0NPTkZJRzsKKwljbWQuYXJnc1sweDAxXSA9IDB4MDE7CisJY21kLmFyZ3NbMHgwMl0gPSAweDc1OworCWNtZC5hcmdzWzB4MDNdID0gMHgwMDsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+bXBnX2Nsa19wb3NfcG9sKQorCQljbWQuYXJnc1sweDA0XSA9IHN0YXRlLT5jb25maWctPm1wZ19jbGtfcG9zX3BvbDsKKwllbHNlCisJCWNtZC5hcmdzWzB4MDRdID0gMHgwMjsKKwljbWQuYXJnc1sweDA1XSA9IDB4MDA7CisJY21kLmxlbj0gMHgwNjsKKwlyZXQgPSBjeDI0MTE2X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBGaXJtd2FyZSBDTUQgMzU6IEdldCBmaXJtd2FyZSB2ZXJzaW9uICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfVVBERldWRVJTOworCWNtZC5sZW49IDB4MDI7CisJZm9yKGk9MDsgaTw0OyBpKyspIHsKKwkJY21kLmFyZ3NbMHgwMV0gPSBpOworCQlyZXQgPSBjeDI0MTE2X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJdmVyc1tpXT0gY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19NQUlMQk9YKTsKKwl9CisJcHJpbnRrKCIlczogRlcgdmVyc2lvbiAlaS4laS4laS4laVxuIiwgX19mdW5jX18sCisJCXZlcnNbMF0sIHZlcnNbMV0sIHZlcnNbMl0sIHZlcnNbM10pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDExNl9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCS8qIFRoZSBpc2w2NDIxIG1vZHVsZSB3aWxsIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGZvcHMuICovCisJZHByaW50aygiJXMoKSBUaGlzIHNob3VsZCBuZXZlciBhcHBlYXIgaWYgdGhlIGlzbDY0MjEgbW9kdWxlIGlzIGxvYWRlZCBjb3JyZWN0bHlcbiIsX19mdW5jX18pOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpbnQgbG9jayA9IGN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfU1NUQVRVUyk7CisKKwlkcHJpbnRrKCIlczogc3RhdHVzID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgbG9jayk7CisKKwkqc3RhdHVzID0gMDsKKworCWlmIChsb2NrICYgQ1gyNDExNl9IQVNfU0lHTkFMKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJaWYgKGxvY2sgJiBDWDI0MTE2X0hBU19DQVJSSUVSKQorCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChsb2NrICYgQ1gyNDExNl9IQVNfVklURVJCSSkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwlpZiAobG9jayAmIENYMjQxMTZfSEFTX1NZTkNMT0NLKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DIHwgRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDI0MTE2X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCSpiZXIgPSAgKCBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0JFUjI0KSA8PCAyNCApIHwKKwkJKCBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0JFUjE2KSA8PCAxNiApIHwKKwkJKCBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0JFUjggKSA8PCA4ICApIHwKKwkJICBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0JFUjAgKTsKKworCXJldHVybiAwOworfQorCisvKiBUT0RPIERldGVybWluZSBmdW5jdGlvbiBhbmQgc2NhbGUgYXBwcm9wcmlhdGVseSAqLworc3RhdGljIGludCBjeDI0MTE2X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNpZ25hbF9zdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExNl9jbWQgY21kOworCWludCByZXQ7CisJdTE2IHNpZ19yZWFkaW5nOworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogRmlybXdhcmUgQ01EIDE5OiBHZXQgQUdDICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfR0VUQUdDOworCWNtZC5sZW49IDB4MDE7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJc2lnX3JlYWRpbmcgPSAoIGN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfU1NUQVRVUykgJiBDWDI0MTE2X1NJR05BTF9NQVNLICkgfAorCQkoIGN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfU0lHTkFMKSA8PCA2ICk7CisJKnNpZ25hbF9zdHJlbmd0aD0gMCAtIHNpZ19yZWFkaW5nOworCisJZHByaW50aygiJXM6IHJhdyAvIGNvb2tlZCA9IDB4JTA0eCAvIDB4JTA0eFxuIiwgX19mdW5jX18sIHNpZ19yZWFkaW5nLCAqc2lnbmFsX3N0cmVuZ3RoKTsKKworCXJldHVybiAwOworfQorCisvKiBTTlIgKDAuLjEwMCklID0gKHNpZyAmIDB4ZjApICogMTAgKyAoc2lnICYgMHgwZikgKiAxMCAvIDE2ICovCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZF9zbnJfcGN0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBzbnJfcmVhZGluZzsKKwlzdGF0aWMgY29uc3QgdTMyIHNucl90YWJbXSA9IHsgLyogMTAgeCBUYWJsZSAocm91bmRlZCB1cCkgKi8KKwkJMHgwMDAwMCwweDAxOTlBLDB4MDMzMzMsMHgwNGNjRCwweDA2NjY3LAorCQkJMHgwODAwMCwweDA5OTlBLDB4MGIzMzMsMHgwY2NjRCwweDBlNjY3LAorCQkweDEwMDAwLDB4MTE5OUEsMHgxMzMzMywweDE0Y2NELDB4MTY2NjcsMHgxODAwMCB9OworCisJZHByaW50aygiJXMoKVxuIiwgX19mdW5jX18pOworCisJc25yX3JlYWRpbmcgPSBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX1FVQUxJVFkwKTsKKworCWlmKHNucl9yZWFkaW5nID49IDB4YTAgLyogMTAwJSAqLykKKwkJKnNuciA9IDB4ZmZmZjsKKwllbHNlCisJCSpzbnIgPSBzbnJfdGFiIFsgKCBzbnJfcmVhZGluZyAmIDB4ZjAgKSAgID4+IDQgXSArCisJCQkoIHNucl90YWIgWyAoIHNucl9yZWFkaW5nICYgMHgwZiApIF0gPj4gNCApOworCisJZHByaW50aygiJXM6IHJhdyAvIGNvb2tlZCA9IDB4JTAyeCAvIDB4JTA0eFxuIiwgX19mdW5jX18sCisJCXNucl9yZWFkaW5nLCAqc25yKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgcmVlbGJveCBwYXRjaGVzIHNob3cgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlcnMgcmVwcmVzZW50cworICogRVNOTywgZnJvbSAwLT4zMGRiICh2YWx1ZXMgMC0+MzAwKS4gV2UgcHJvdmlkZSB0aGlzIHZhbHVlIGJ5CisgKiBkZWZhdWx0LgorICovCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZF9zbnJfZXNubyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkqc25yID0gY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19RVUFMSVRZOCkgPDwgOCB8CisJCWN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfUVVBTElUWTApOworCisJZHByaW50aygiJXM6IHJhdyAweCUwNHhcbiIsIF9fZnVuY19fLCAqc25yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQoreworCWlmIChlc25vX3NuciA9PSAxKQorCQlyZXR1cm4gY3gyNDExNl9yZWFkX3Nucl9lc25vKGZlLCBzbnIpOworCWVsc2UKKwkJcmV0dXJuIGN4MjQxMTZfcmVhZF9zbnJfcGN0KGZlLCBzbnIpOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCSp1Y2Jsb2NrcyA9ICggY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19VQ0I4KSA8PCA4ICkgfAorCQljeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX1VDQjApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE92ZXJ3cml0ZSB0aGUgY3VycmVudCB0dW5pbmcgcGFyYW1zLCB3ZSBhcmUgYWJvdXQgdG8gdHVuZSAqLworc3RhdGljIHZvaWQgY3gyNDExNl9jbG9uZV9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJbWVtY3B5KCZzdGF0ZS0+ZGN1ciwgJnN0YXRlLT5kbnh0LCBzaXplb2Yoc3RhdGUtPmRjdXIpKTsKK30KKworLyogV2FpdCBmb3IgTE5CICovCitzdGF0aWMgaW50IGN4MjQxMTZfd2FpdF9mb3JfbG5iKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBjeDI0MTE2X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCBpOworCisJZHByaW50aygiJXMoKSBxc3RhdHVzID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywKKwkJY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19RU1RBVFVTKSk7CisKKwkvKiBXYWl0IGZvciB1cCB0byAzMDAgbXMgKi8KKwlmb3IoaSA9IDA7IGkgPCAzMCA7IGkrKykgeworCQlpZiAoY3gyNDExNl9yZWFkcmVnKHN0YXRlLCBDWDI0MTE2X1JFR19RU1RBVFVTKSAmIDB4MjApCisJCQlyZXR1cm4gMDsKKwkJbXNsZWVwKDEwKTsKKwl9CisKKwlkcHJpbnRrKCIlcygpOiBMTkIgbm90IHJlYWR5XG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsgLyogLUVCVVNZID8gKi8KK30KKworc3RhdGljIGludCBjeDI0MTE2X3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9jbWQgY21kOworCWludCByZXQ7CisKKwlkcHJpbnRrKCIlcyglZClcbiIsIF9fZnVuY19fLCB0b25lKTsKKwlpZiAoICh0b25lICE9IFNFQ19UT05FX09OKSAmJiAodG9uZSAhPSBTRUNfVE9ORV9PRkYpICkgeworCQlwcmludGsoIiVzOiBJbnZhbGlkLCB0b25lPSVkXG4iLCBfX2Z1bmNfXywgdG9uZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdhaXQgZm9yIExOQiByZWFkeSAqLworCXJldCA9IGN4MjQxMTZfd2FpdF9mb3JfbG5iKGZlKTsKKwlpZihyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1pbiBkZWxheSB0aW1lIGFmdGVyIERpU0VxQyBzZW5kICovCisJbXNsZWVwKDE1KTsgLyogWFhYIGRldGVybWluZSBpcyBGVyBkb2VzIHRoaXMsIHNlZSBzZW5kX2Rpc2VxYy9idXJzdCAqLworCisJLyogVGhpcyBpcyBhbHdheXMgZG9uZSBiZWZvcmUgdGhlIHRvbmUgaXMgc2V0ICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfU0VUX1RPTkVQUkU7CisJY21kLmFyZ3NbMHgwMV0gPSAweDAwOworCWNtZC5sZW49IDB4MDI7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTm93IHdlIHNldCB0aGUgdG9uZSAqLworCWNtZC5hcmdzWzB4MDBdID0gQ01EX1NFVF9UT05FOworCWNtZC5hcmdzWzB4MDFdID0gMHgwMDsKKwljbWQuYXJnc1sweDAyXSA9IDB4MDA7CisKKwlzd2l0Y2ggKHRvbmUpIHsKKwljYXNlIFNFQ19UT05FX09OOgorCQlkcHJpbnRrKCIlczogc2V0dGluZyB0b25lIG9uXG4iLCBfX2Z1bmNfXyk7CisJCWNtZC5hcmdzWzB4MDNdID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVE9ORV9PRkY6CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHRvbmUgb2ZmXG4iLF9fZnVuY19fKTsKKwkJY21kLmFyZ3NbMHgwM10gPSAweDAwOworCQlicmVhazsKKwl9CisJY21kLmxlbj0gMHgwNDsKKworCS8qIE1pbiBkZWxheSB0aW1lIGJlZm9yZSBEaVNFcUMgc2VuZCAqLworCW1zbGVlcCgxNSk7IC8qIFhYWCBkZXRlcm1pbmUgaXMgRlcgZG9lcyB0aGlzLCBzZWUgc2VuZF9kaXNlcWMvYnVyc3QgKi8KKworCXJldHVybiBjeDI0MTE2X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKK30KKworLyogSW5pdGlhbGlzZSBEaVNFcUMgKi8KK3N0YXRpYyBpbnQgY3gyNDExNl9kaXNlcWNfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgY3gyNDExNl9jbWQgY21kOworCWludCByZXQ7CisKKwkvKiBGaXJtd2FyZSBDTUQgMjA6IExOQi9EaVNFcUMgY29uZmlnICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CQ09ORklHOworCWNtZC5hcmdzWzB4MDFdID0gMHgwMDsKKwljbWQuYXJnc1sweDAyXSA9IDB4MTA7CisJY21kLmFyZ3NbMHgwM10gPSAweDAwOworCWNtZC5hcmdzWzB4MDRdID0gMHg4ZjsKKwljbWQuYXJnc1sweDA1XSA9IDB4Mjg7CisJY21kLmFyZ3NbMHgwNl0gPSAodG9uZWJ1cnN0ID09IENYMjQxMTZfRElTRVFDX1RPTkVPRkYpID8gMHgwMCA6IDB4MDE7CisJY21kLmFyZ3NbMHgwN10gPSAweDAxOworCWNtZC5sZW49IDB4MDg7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUHJlcGFyZSBhIERpU0VxQyBjb21tYW5kICovCisJc3RhdGUtPmRzZWNfY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CU0VORDsKKworCS8qIERpU0VxQyBidXJzdCAqLworCXN0YXRlLT5kc2VjX2NtZC5hcmdzW0NYMjQxMTZfRElTRVFDX0JVUlNUXSAgPSBDWDI0MTE2X0RJU0VRQ19NSU5JX0E7CisKKwkvKiBVbmtub3duICovCisJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfQVJHMl8yXSA9IDB4MDI7CisJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfQVJHM18wXSA9IDB4MDA7CisJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfQVJHNF8wXSA9IDB4MDA7IC8qIENvbnRpbnVhdGlvbiBmbGFnPyAqLworCisJLyogRGlTRXFDIG1lc3NhZ2UgbGVuZ3RoICovCisJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfTVNHTEVOXSA9IDB4MDA7CisKKwkvKiBDb21tYW5kIGxlbmd0aCAqLworCXN0YXRlLT5kc2VjX2NtZC5sZW49IENYMjQxMTZfRElTRVFDX01TR09GUzsKKworCXJldHVybiAwOworfQorCisvKiBTZW5kIERpU0VxQyBtZXNzYWdlIHdpdGggZGVyaXZlZCBidXJzdCAoaGFjaykgfHwgcHJldmlvdXMgYnVyc3QgKi8KK3N0YXRpYyBpbnQgY3gyNDExNl9zZW5kX2Rpc2VxY19tc2coc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmQpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGksIHJldDsKKworCS8qIER1bXAgRGlTRXFDIG1lc3NhZ2UgKi8KKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKCJjeDI0MTE2OiAlcygiLCBfX2Z1bmNfXyk7CisJCWZvcihpID0gMCA7IGkgPCBkLT5tc2dfbGVuIDspIHsKKwkJCXByaW50aygiMHglMDJ4IiwgZC0+bXNnW2ldKTsKKwkJCWlmKCsraSA8IGQtPm1zZ19sZW4pCisJCQkJcHJpbnRrKCIsICIpOworCQkJfQorCQlwcmludGsoIikgdG9uZWJ1cnN0PSVkXG4iLCB0b25lYnVyc3QpOworCX0KKworCS8qIFZhbGlkYXRlIGxlbmd0aCAqLworCWlmKGQtPm1zZ19sZW4gPiAoQ1gyNDExNl9BUkdMRU4gLSBDWDI0MTE2X0RJU0VRQ19NU0dPRlMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpU0VxQyBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IGQtPm1zZ19sZW47IGkrKykKKwkJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfTVNHT0ZTICsgaV0gPSBkLT5tc2dbaV07CisKKwkvKiBEaVNFcUMgbWVzc2FnZSBsZW5ndGggKi8KKwlzdGF0ZS0+ZHNlY19jbWQuYXJnc1tDWDI0MTE2X0RJU0VRQ19NU0dMRU5dID0gZC0+bXNnX2xlbjsKKworCS8qIENvbW1hbmQgbGVuZ3RoICovCisJc3RhdGUtPmRzZWNfY21kLmxlbj0gQ1gyNDExNl9ESVNFUUNfTVNHT0ZTICsgc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfTVNHTEVOXTsKKworCS8qIERpU0VxQyB0b25lYnVyc3QgKi8KKwlpZih0b25lYnVyc3QgPT0gQ1gyNDExNl9ESVNFUUNfTUVTR0NBQ0hFKQorCQkvKiBNZXNzYWdlIGlzIGNhY2hlZCAqLworCQlyZXR1cm4gMDsKKworCWVsc2UgaWYodG9uZWJ1cnN0ID09IENYMjQxMTZfRElTRVFDX1RPTkVPRkYpCisJCS8qIE1lc3NhZ2UgaXMgc2VudCB3aXRob3V0IGJ1cnN0ICovCisJCXN0YXRlLT5kc2VjX2NtZC5hcmdzW0NYMjQxMTZfRElTRVFDX0JVUlNUXSA9IDA7CisKKwllbHNlIGlmKHRvbmVidXJzdCA9PSBDWDI0MTE2X0RJU0VRQ19UT05FQ0FDSEUpIHsKKwkJLyoKKwkJICogTWVzc2FnZSBpcyBzZW50IHdpdGggZGVyaXZlZCBlbHNlIGNhY2hlZCBidXJzdAorCQkgKgorCQkgKiBXUklURSBQT1JUIEdST1VQIENPTU1BTkQgMzgKKwkJICoKKwkJICogMC9BL0E6IEUwIDEwIDM4IEYwLi5GMworCQkgKiAxL0IvQjogRTAgMTAgMzggRjQuLkY3CisJCSAqIDIvQy9BOiBFMCAxMCAzOCBGOC4uRkIKKwkJICogMy9EL0I6IEUwIDEwIDM4IEZDLi5GRgorCQkgKgorCQkgKiBkYXRhYnl0ZVszXT0gODQyMTo4NDIxCisJCSAqICAgICAgICAgICAgICBBQkNEOldYWVoKKwkJICogICAgICAgICAgICAgIENMUiA6U0VUCisJCSAqCisJCSAqICAgICAgICAgICAgICBXWD0gUE9SVCBTRUxFQ1QgMC4uMyAgICAoWD1UT05FQlVSU1QpCisJCSAqICAgICAgICAgICAgICBZID0gVk9MVEFHRSAgICAgICAgICAgICAoMD0xM1YsIDE9MThWKQorCQkgKiAgICAgICAgICAgICAgWiA9IEJBTkQgICAgICAgICAgICAgICAgKDA9TE9XLCAxPUhJR0goMjJLKSkKKwkJICovCisJCWlmKGQtPm1zZ19sZW4gPj0gNCAmJiBkLT5tc2dbMl0gPT0gMHgzOCkKKwkJCXN0YXRlLT5kc2VjX2NtZC5hcmdzW0NYMjQxMTZfRElTRVFDX0JVUlNUXSA9ICgoZC0+bXNnWzNdICYgNCkgPj4gMik7CisJCWlmKGRlYnVnKQorCQkJZHByaW50aygiJXMgYnVyc3Q9JWRcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZHNlY19jbWQuYXJnc1tDWDI0MTE2X0RJU0VRQ19CVVJTVF0pOworCX0KKworCS8qIFdhaXQgZm9yIExOQiByZWFkeSAqLworCXJldCA9IGN4MjQxMTZfd2FpdF9mb3JfbG5iKGZlKTsKKwlpZihyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhaXQgZm9yIHZvbHRhZ2UvbWluIHJlcGVhdCBkZWxheSAqLworCW1zbGVlcCgxMDApOworCisJLyogQ29tbWFuZCAqLworCXJldCA9IGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZzdGF0ZS0+ZHNlY19jbWQpOworCWlmKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCS8qCisJICogV2FpdCBmb3Igc2VuZAorCSAqCisJICogRXV0ZWxzYXQgc3BlYzoKKwkgKiA+MTVtcyBkZWxheSAgICAgICAgICArIChYWFggZGV0ZXJtaW5lIGlmIEZXIGRvZXMgdGhpcywgc2VlIHNldF90b25lKQorCSAqICAxMy41bXMgcGVyIGJ5dGUgICAgICsKKwkgKiA+MTVtcyBkZWxheSAgICAgICAgICArCisJICogIDEyLjVtcyBidXJzdCAgICAgICAgKworCSAqID4xNW1zIGRlbGF5ICAgICAgICAgICAgKFhYWCBkZXRlcm1pbmUgaWYgRlcgZG9lcyB0aGlzLCBzZWUgc2V0X3RvbmUpCisJICovCisJbXNsZWVwKCAoc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfTVNHTEVOXSA8PCA0KSArICgodG9uZWJ1cnN0ID09IENYMjQxMTZfRElTRVFDX1RPTkVPRkYpID8gMzAgOiA2MCkgKTsKKworCXJldHVybiAwOworfQorCisvKiBTZW5kIERpU0VxQyBidXJzdCAqLworc3RhdGljIGludCBjeDI0MTE2X2Rpc2VxY19zZW5kX2J1cnN0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXMoJWQpIHRvbmVidXJzdD0lZFxuIixfX2Z1bmNfXywgYnVyc3QsIHRvbmVidXJzdCk7CisKKwkvKiBEaVNFcUMgYnVyc3QgKi8KKwlpZiAoYnVyc3QgPT0gU0VDX01JTklfQSkKKwkJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfQlVSU1RdID0gQ1gyNDExNl9ESVNFUUNfTUlOSV9BOworCWVsc2UgaWYoYnVyc3QgPT0gU0VDX01JTklfQikKKwkJc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfQlVSU1RdID0gQ1gyNDExNl9ESVNFUUNfTUlOSV9COworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEaVNFcUMgdG9uZWJ1cnN0ICovCisJaWYodG9uZWJ1cnN0ICE9IENYMjQxMTZfRElTRVFDX01FU0dDQUNIRSkKKwkJLyogQnVyc3QgaXMgY2FjaGVkICovCisJCXJldHVybiAwOworCisJLyogQnVyc3QgaXMgdG8gYmUgc2VudCB3aXRoIGNhY2hlZCBtZXNzYWdlICovCisKKwkvKiBXYWl0IGZvciBMTkIgcmVhZHkgKi8KKwlyZXQgPSBjeDI0MTE2X3dhaXRfZm9yX2xuYihmZSk7CisJaWYocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBXYWl0IGZvciB2b2x0YWdlL21pbiByZXBlYXQgZGVsYXkgKi8KKwltc2xlZXAoMTAwKTsKKworCS8qIENvbW1hbmQgKi8KKwlyZXQgPSBjeDI0MTE2X2NtZF9leGVjdXRlKGZlLCAmc3RhdGUtPmRzZWNfY21kKTsKKwlpZihyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2FpdCBmb3Igc2VuZAorCSAqCisJICogRXV0ZWxzYXQgc3BlYzoKKwkgKiA+MTVtcyBkZWxheSAgICAgICAgICArIChYWFggZGV0ZXJtaW5lIGlmIEZXIGRvZXMgdGhpcywgc2VlIHNldF90b25lKQorCSAqICAxMy41bXMgcGVyIGJ5dGUgICAgICsKKwkgKiA+MTVtcyBkZWxheSAgICAgICAgICArCisJICogIDEyLjVtcyBidXJzdCAgICAgICAgKworCSAqID4xNW1zIGRlbGF5ICAgICAgICAgICAgKFhYWCBkZXRlcm1pbmUgaWYgRlcgZG9lcyB0aGlzLCBzZWUgc2V0X3RvbmUpCisJICovCisJbXNsZWVwKCAoc3RhdGUtPmRzZWNfY21kLmFyZ3NbQ1gyNDExNl9ESVNFUUNfTVNHTEVOXSA8PCA0KSArIDYwICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3gyNDExNl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBjeDI0MTE2X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWRwcmludGsoIiVzXG4iLF9fZnVuY19fKTsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeDI0MTE2X29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyNDExNl9hdHRhY2goY29uc3Qgc3RydWN0IGN4MjQxMTZfY29uZmlnKiBjb25maWcsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQoreworCXN0cnVjdCBjeDI0MTE2X3N0YXRlKiBzdGF0ZSA9IE5VTEw7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzXG4iLF9fZnVuY19fKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3gyNDExNl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCXByaW50aygiVW5hYmxlIHRvIGttYWxsb2NcbiIpOworCQlnb3RvIGVycm9yMTsKKwl9CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgY3gyNDExNl9zdGF0ZSkpOworCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHByZXNlbnQgKi8KKwlyZXQgPSAoY3gyNDExNl9yZWFkcmVnKHN0YXRlLCAweEZGKSA8PCA4KSB8IGN4MjQxMTZfcmVhZHJlZyhzdGF0ZSwgMHhGRSk7CisJaWYgKHJldCAhPSAweDA1MDEpIHsKKwkJcHJpbnRrKCJJbnZhbGlkIHByb2JlLCBwcm9iYWJseSBub3QgYSBDWDI0MTE2IGRldmljZVxuIik7CisJCWdvdG8gZXJyb3IyOworCX0KKworCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZjeDI0MTE2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKKworZXJyb3IyOiBrZnJlZShzdGF0ZSk7CitlcnJvcjE6IHJldHVybiBOVUxMOworfQorLyoKKyAqIEluaXRpYWxpc2Ugb3Igd2FrZSB1cCBkZXZpY2UKKyAqCisgKiBQb3dlciBjb25maWcgd2lsbCByZXNldCBhbmQgbG9hZCBpbml0aWFsIGZpcm13YXJlIGlmIHJlcXVpcmVkCisgKi8KK3N0YXRpYyBpbnQgY3gyNDExNl9pbml0ZmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjQxMTZfY21kIGNtZDsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXMoKVxuIixfX2Z1bmNfXyk7CisKKwkvKiBQb3dlciBvbiAqLworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIDB4ZTAsIDApOworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIDB4ZTEsIDApOworCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIDB4ZWEsIDApOworCisJLyogRmlybXdhcmUgQ01EIDM2OiBQb3dlciBjb25maWcgKi8KKwljbWQuYXJnc1sweDAwXSA9IENNRF9UVU5FUlNMRUVQOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQubGVuPSAweDAyOworCXJldCA9IGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZjbWQpOworCWlmKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGN4MjQxMTZfZGlzZXFjX2luaXQoZmUpOworfQorCisvKgorICogUHV0IGRldmljZSB0byBzbGVlcAorICovCitzdGF0aWMgaW50IGN4MjQxMTZfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGN4MjQxMTZfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGN4MjQxMTZfY21kIGNtZDsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXMoKVxuIixfX2Z1bmNfXyk7CisKKwkvKiBGaXJtd2FyZSBDTUQgMzY6IFBvd2VyIGNvbmZpZyAqLworCWNtZC5hcmdzWzB4MDBdID0gQ01EX1RVTkVSU0xFRVA7CisJY21kLmFyZ3NbMHgwMV0gPSAxOworCWNtZC5sZW49IDB4MDI7CisJcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CisJaWYocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBQb3dlciBvZmYgKFNodXRkb3duIGNsb2NrcykgKi8KKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweGVhLCAweGZmKTsKKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweGUxLCAxKTsKKwljeDI0MTE2X3dyaXRlcmVnKHN0YXRlLCAweGUwLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjQxMTZfc2V0X3Byb3BlcnR5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHR2X3Byb3BlcnR5KiB0dnApCit7CisJZHByaW50aygiJXMoLi4pXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDExNl9nZXRfcHJvcGVydHkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkqIHR2cCkKK3sKKwlkcHJpbnRrKCIlcyguLilcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworLyogZHZiLWNvcmUgdG9sZCB1cyB0byB0dW5lLCB0aGUgdHYgcHJvcGVydHkgY2FjaGUgd2lsbCBiZSBjb21wbGV0ZSwKKyAqIGl0J3Mgc2FmZSBmb3IgaXMgdG8gcHVsbCB2YWx1ZXMgYW5kIHVzZSB0aGVtIGZvciB0dW5pbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyBpbnQgY3gyNDExNl9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNDExNl9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKKwlzdHJ1Y3QgY3gyNDExNl9jbWQgY21kOworCWZlX3N0YXR1c190IHR1bmVyc3RhdDsKKwlpbnQgaSwgc3RhdHVzLCByZXQsIHJldHVuZTsKKworCWRwcmludGsoIiVzKClcbiIsX19mdW5jX18pOworCisJc3dpdGNoKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCQljYXNlIFNZU19EVkJTOgorCQkJZHByaW50aygiJXM6IERWQi1TIGRlbGl2ZXJ5IHN5c3RlbSBzZWxlY3RlZFxuIixfX2Z1bmNfXyk7CisKKwkJCS8qIE9ubHkgUVBTSyBpcyBzdXBwb3J0ZWQgZm9yIERWQi1TICovCisJCQlpZihjLT5tb2R1bGF0aW9uICE9IFFQU0spIHsKKwkJCQlkcHJpbnRrKCIlczogdW5zdXBwb3J0ZWQgbW9kdWxhdGlvbiBzZWxlY3RlZCAoJWQpXG4iLAorCQkJCQlfX2Z1bmNfXywgYy0+bW9kdWxhdGlvbik7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCisJCQkvKiBQaWxvdCBkb2Vzbid0IGV4aXN0IGluIERWQi1TLCB0dXJuIGJpdCBvZmYgKi8KKwkJCXN0YXRlLT5kbnh0LnBpbG90X3ZhbCA9IENYMjQxMTZfUElMT1RfT0ZGOworCQkJcmV0dW5lID0gMTsKKworCQkJLyogRFZCLVMgb25seSBzdXBwb3J0cyAwLjM1ICovCisJCQlpZihjLT5yb2xsb2ZmICE9IFJPTExPRkZfMzUpIHsKKwkJCQlkcHJpbnRrKCIlczogdW5zdXBwb3J0ZWQgcm9sbG9mZiBzZWxlY3RlZCAoJWQpXG4iLAorCQkJCQlfX2Z1bmNfXywgYy0+cm9sbG9mZik7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCQkJc3RhdGUtPmRueHQucm9sbG9mZl92YWwgPSBDWDI0MTE2X1JPTExPRkZfMDM1OworCQkJYnJlYWs7CisKKwkJY2FzZSBTWVNfRFZCUzI6CisJCQlkcHJpbnRrKCIlczogRFZCLVMyIGRlbGl2ZXJ5IHN5c3RlbSBzZWxlY3RlZFxuIixfX2Z1bmNfXyk7CisKKwkJCS8qCisJCQkgKiBOQkMgOFBTSy9RUFNLIHdpdGggRFZCLVMgaXMgc3VwcG9ydGVkIGZvciBEVkItUzIsCisJCQkgKiBidXQgbm90IGhhcmR3YXJlIGF1dG8gZGV0ZWN0aW9uCisJCQkgKi8KKwkJCWlmKGMtPm1vZHVsYXRpb24gIT0gUFNLXzggJiYgYy0+bW9kdWxhdGlvbiAhPSBRUFNLKSB7CisJCQkJZHByaW50aygiJXM6IHVuc3VwcG9ydGVkIG1vZHVsYXRpb24gc2VsZWN0ZWQgKCVkKVxuIiwKKwkJCQkJX19mdW5jX18sIGMtPm1vZHVsYXRpb24pOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKworCQkJc3dpdGNoKGMtPnBpbG90KSB7CisJCQkJY2FzZSBQSUxPVF9BVVRPOgkvKiBOb3Qgc3VwcG9ydGVkIGJ1dCBlbXVsYXRlZCAqLworCQkJCQlyZXR1bmUgPSAyOwkvKiBGYWxsLXRocm91Z2ggKi8KKwkJCQljYXNlIFBJTE9UX09GRjoKKwkJCQkJc3RhdGUtPmRueHQucGlsb3RfdmFsID0gQ1gyNDExNl9QSUxPVF9PRkY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUElMT1RfT046CisJCQkJCXN0YXRlLT5kbnh0LnBpbG90X3ZhbCA9IENYMjQxMTZfUElMT1RfT047CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWRwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBwaWxvdCBtb2RlIHNlbGVjdGVkICglZClcbiIsCisJCQkJCQlfX2Z1bmNfXywgYy0+cGlsb3QpOworCQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisKKwkJCXN3aXRjaChjLT5yb2xsb2ZmKSB7CisJCQkJY2FzZSBST0xMT0ZGXzIwOgorCQkJCQlzdGF0ZS0+ZG54dC5yb2xsb2ZmX3ZhbD0gQ1gyNDExNl9ST0xMT0ZGXzAyMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBST0xMT0ZGXzI1OgorCQkJCQlzdGF0ZS0+ZG54dC5yb2xsb2ZmX3ZhbD0gQ1gyNDExNl9ST0xMT0ZGXzAyNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBST0xMT0ZGXzM1OgorCQkJCQlzdGF0ZS0+ZG54dC5yb2xsb2ZmX3ZhbD0gQ1gyNDExNl9ST0xMT0ZGXzAzNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBST0xMT0ZGX0FVVE86CS8qIFJvbGxvZmYgbXVzdCBiZSBleHBsaWNpdCAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWRwcmludGsoIiVzOiB1bnN1cHBvcnRlZCByb2xsb2ZmIHNlbGVjdGVkICglZClcbiIsCisJCQkJCQlfX2Z1bmNfXywgYy0+cm9sbG9mZik7CisJCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCIlczogdW5zdXBwb3J0ZWQgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkICglZClcbiIsCisJCQkJX19mdW5jX18sIGMtPmRlbGl2ZXJ5X3N5c3RlbSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXN0YXRlLT5kbnh0Lm1vZHVsYXRpb24gPSBjLT5tb2R1bGF0aW9uOworCXN0YXRlLT5kbnh0LmZyZXF1ZW5jeSA9IGMtPmZyZXF1ZW5jeTsKKwlzdGF0ZS0+ZG54dC5waWxvdCA9IGMtPnBpbG90OworCXN0YXRlLT5kbnh0LnJvbGxvZmYgPSBjLT5yb2xsb2ZmOworCisJaWYgKChyZXQgPSBjeDI0MTE2X3NldF9pbnZlcnNpb24oc3RhdGUsIGMtPmludmVyc2lvbikpICE9ICAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRkVDX05PTkUvQVVUTyBmb3IgRFZCLVMyIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGRldGVjdGVkIGhlcmUgKi8KKwlpZiAoKHJldCA9IGN4MjQxMTZfc2V0X2ZlYyhzdGF0ZSwgYy0+bW9kdWxhdGlvbiwgYy0+ZmVjX2lubmVyKSkgIT0gIDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHJldCA9IGN4MjQxMTZfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIGMtPnN5bWJvbF9yYXRlKSkgIT0gIDApCisJCXJldHVybiByZXQ7CisKKwkvKiBkaXNjYXJkIHRoZSAnY3VycmVudCcgdHVuaW5nIHBhcmFtZXRlcnMgYW5kIHByZXBhcmUgdG8gdHVuZSAqLworCWN4MjQxMTZfY2xvbmVfcGFyYW1zKGZlKTsKKworCWRwcmludGsoIiVzOiAgIG1vZHVsYXRpb24gID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0ZS0+ZGN1ci5tb2R1bGF0aW9uKTsKKwlkcHJpbnRrKCIlczogICBmcmVxdWVuY3kgICA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUtPmRjdXIuZnJlcXVlbmN5KTsKKwlkcHJpbnRrKCIlczogICBwaWxvdCAgICAgICA9ICVkICh2YWwgPSAweCUwMngpXG4iLCBfX2Z1bmNfXywKKwkJc3RhdGUtPmRjdXIucGlsb3QsIHN0YXRlLT5kY3VyLnBpbG90X3ZhbCk7CisJZHByaW50aygiJXM6ICAgcmV0dW5lICAgICAgPSAlZFxuIiwgX19mdW5jX18sIHJldHVuZSk7CisJZHByaW50aygiJXM6ICAgcm9sbG9mZiAgICAgPSAlZCAodmFsID0gMHglMDJ4KVxuIiwgX19mdW5jX18sCisJCXN0YXRlLT5kY3VyLnJvbGxvZmYsIHN0YXRlLT5kY3VyLnJvbGxvZmZfdmFsKTsKKwlkcHJpbnRrKCIlczogICBzeW1ib2xfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUpOworCWRwcmludGsoIiVzOiAgIEZFQyAgICAgICAgID0gJWQgKG1hc2svdmFsID0gMHglMDJ4LzB4JTAyeClcbiIsIF9fZnVuY19fLAorCQlzdGF0ZS0+ZGN1ci5mZWMsIHN0YXRlLT5kY3VyLmZlY19tYXNrLCBzdGF0ZS0+ZGN1ci5mZWNfdmFsKTsKKwlkcHJpbnRrKCIlczogICBJbnZlcnNpb24gICA9ICVkICh2YWwgPSAweCUwMngpXG4iLCBfX2Z1bmNfXywKKwkJc3RhdGUtPmRjdXIuaW52ZXJzaW9uLCBzdGF0ZS0+ZGN1ci5pbnZlcnNpb25fdmFsKTsKKworCS8qIFRoaXMgaXMgYWxzbyBkb25lIGluIGFkdmlzZS9hY3F1aXJlIG9uIEhWUjQwMDAgYnV0IG5vdCBvbiBMSVRFICovCisJaWYgKHN0YXRlLT5jb25maWctPnNldF90c19wYXJhbXMpCisJCXN0YXRlLT5jb25maWctPnNldF90c19wYXJhbXMoZmUsIDApOworCisJLyogU2V0L1Jlc2V0IEIvVyAqLworCWNtZC5hcmdzWzB4MDBdID0gQ01EX0JBTkRXSURUSDsKKwljbWQuYXJnc1sweDAxXSA9IDB4MDE7CisJY21kLmxlbj0gMHgwMjsKKwlyZXQgPSBjeDI0MTE2X2NtZF9leGVjdXRlKGZlLCAmY21kKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBQcmVwYXJlIGEgdHVuZSByZXF1ZXN0ICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfVFVORVJFUVVFU1Q7CisKKwkvKiBGcmVxdWVuY3kgKi8KKwljbWQuYXJnc1sweDAxXSA9IChzdGF0ZS0+ZGN1ci5mcmVxdWVuY3kgJiAweGZmMDAwMCkgPj4gMTY7CisJY21kLmFyZ3NbMHgwMl0gPSAoc3RhdGUtPmRjdXIuZnJlcXVlbmN5ICYgMHgwMGZmMDApID4+IDg7CisJY21kLmFyZ3NbMHgwM10gPSAoc3RhdGUtPmRjdXIuZnJlcXVlbmN5ICYgMHgwMDAwZmYpOworCisJLyogU3ltYm9sIFJhdGUgKi8KKwljbWQuYXJnc1sweDA0XSA9ICgoc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUgLyAxMDAwKSAmIDB4ZmYwMCkgPj4gODsKKwljbWQuYXJnc1sweDA1XSA9ICgoc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUgLyAxMDAwKSAmIDB4MDBmZik7CisKKwkvKiBBdXRvbWF0aWMgSW52ZXJzaW9uICovCisJY21kLmFyZ3NbMHgwNl0gPSBzdGF0ZS0+ZGN1ci5pbnZlcnNpb25fdmFsOworCisJLyogTW9kdWxhdGlvbiAvIEZFQyAvIFBpbG90ICovCisJY21kLmFyZ3NbMHgwN10gPSBzdGF0ZS0+ZGN1ci5mZWNfdmFsIHwgc3RhdGUtPmRjdXIucGlsb3RfdmFsOworCisJY21kLmFyZ3NbMHgwOF0gPSBDWDI0MTE2X1NFQVJDSF9SQU5HRV9LSFogPj4gODsKKwljbWQuYXJnc1sweDA5XSA9IENYMjQxMTZfU0VBUkNIX1JBTkdFX0tIWiAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwYV0gPSAweDAwOworCWNtZC5hcmdzWzB4MGJdID0gMHgwMDsKKwljbWQuYXJnc1sweDBjXSA9IHN0YXRlLT5kY3VyLnJvbGxvZmZfdmFsOworCWNtZC5hcmdzWzB4MGRdID0gc3RhdGUtPmRjdXIuZmVjX21hc2s7CisKKwlpZiAoc3RhdGUtPmRjdXIuc3ltYm9sX3JhdGUgPiAzMDAwMDAwMCkgeworCQljbWQuYXJnc1sweDBlXSA9IDB4MDQ7CisJCWNtZC5hcmdzWzB4MGZdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgxMF0gPSAweDAxOworCQljbWQuYXJnc1sweDExXSA9IDB4Nzc7CisJCWNtZC5hcmdzWzB4MTJdID0gMHgzNjsKKwkJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfQ0xLRElWLCAweDQ0KTsKKwkJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfUkFURURJViwgMHgwMSk7CisJfSBlbHNlIHsKKwkJY21kLmFyZ3NbMHgwZV0gPSAweDA2OworCQljbWQuYXJnc1sweDBmXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MTBdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgxMV0gPSAweEZBOworCQljbWQuYXJnc1sweDEyXSA9IDB4MjQ7CisJCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIENYMjQxMTZfUkVHX0NMS0RJViwgMHg0Nik7CisJCWN4MjQxMTZfd3JpdGVyZWcoc3RhdGUsIENYMjQxMTZfUkVHX1JBVEVESVYsIDB4MDApOworCX0KKworCWNtZC5sZW49IDB4MTM7CisKKwkvKiBXZSBuZWVkIHRvIHN1cHBvcnQgcGlsb3QgYW5kIG5vbi1waWxvdCB0dW5pbmcgaW4gdGhlCisJICogZHJpdmVyIGF1dG9tYXRpY2FsbHkuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBiZWNhdXNlCisJICogdGhlIGRlbW9kIGRvZXMgbm90IHN1cHBvcnQgYXV0b2RldGVjdC4KKwkgKi8KKwlkbyB7CisJCS8qIFJlc2V0IHN0YXR1cyByZWdpc3RlciAqLworCQlzdGF0dXMgPSBjeDI0MTE2X3JlYWRyZWcoc3RhdGUsIENYMjQxMTZfUkVHX1NTVEFUVVMpICYgQ1gyNDExNl9TSUdOQUxfTUFTSzsKKwkJY3gyNDExNl93cml0ZXJlZyhzdGF0ZSwgQ1gyNDExNl9SRUdfU1NUQVRVUywgc3RhdHVzKTsKKworCQkvKiBUdW5lICovCisJCXJldCA9IGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZjbWQpOworCQlpZiggcmV0ICE9IDAgKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgdXAgdG8gNTAwIG1zIGJlZm9yZSByZXRyeWluZworCQkgKgorCQkgKiBJZiB3ZSBhcmUgYWJsZSB0byB0dW5lIHRoZW4gZ2VuZXJhbGx5IGl0IG9jY3VycyB3aXRoaW4gMTAwbXMuCisJCSAqIElmIGl0IHRha2VzIGxvbmdlciwgdHJ5IGEgZGlmZmVyZW50IHRvbmVidXJzdCBzZXR0aW5nLgorCQkgKi8KKwkJZm9yKGkgPSAwOyBpIDwgNTAgOyBpKyspIHsKKwkJCWN4MjQxMTZfcmVhZF9zdGF0dXMoZmUsICZ0dW5lcnN0YXQpOworCQkJc3RhdHVzID0gdHVuZXJzdGF0ICYgKEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfU1lOQyk7CisJCQlpZihzdGF0dXMgPT0gKEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfU1lOQykpIHsKKwkJCQlkcHJpbnRrKCIlczogVHVuZWRcbiIsX19mdW5jX18pOworCQkJCWdvdG8gdHVuZWQ7CisJCQl9CisJCQltc2xlZXAoMTApOworCQl9CisKKwkJZHByaW50aygiJXM6IE5vdCB0dW5lZFxuIixfX2Z1bmNfXyk7CisKKwkJLyogVG9nZ2xlIHBpbG90IGJpdCB3aGVuIGluIGF1dG8tcGlsb3QgKi8KKwkJaWYoc3RhdGUtPmRjdXIucGlsb3QgPT0gUElMT1RfQVVUTykKKwkJCWNtZC5hcmdzWzB4MDddIF49IENYMjQxMTZfUElMT1RfT047CisJfQorCXdoaWxlKC0tcmV0dW5lKTsKKwordHVuZWQ6ICAvKiBTZXQvUmVzZXQgQi9XICovCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfQkFORFdJRFRIOworCWNtZC5hcmdzWzB4MDFdID0gMHgwMDsKKwljbWQubGVuPSAweDAyOworCXJldCA9IGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZjbWQpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeDI0MTE2X29wcyA9IHsKKworCS5pbmZvID0geworCQkubmFtZSA9ICJDb25leGFudCBDWDI0MTE2L0NYMjQxMTgiLAorCQkudHlwZSA9IEZFX1FQU0ssCisJCS5mcmVxdWVuY3lfbWluID0gOTUwMDAwLAorCQkuZnJlcXVlbmN5X21heCA9IDIxNTAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAxMDExLCAvKiBrSHogZm9yIFFQU0sgZnJvbnRlbmRzICovCisJCS5mcmVxdWVuY3lfdG9sZXJhbmNlID0gNTAwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiA9IDEwMDAwMDAsCisJCS5zeW1ib2xfcmF0ZV9tYXggPSA0NTAwMDAwMCwKKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNF81IHwgRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzZfNyB8CisJCQlGRV9DQU5fRkVDXzdfOCB8IEZFX0NBTl9GRUNfQVVUTyB8CisJCQlGRV9DQU5fUVBTSyB8IEZFX0NBTl9SRUNPVkVSCisJfSwKKworCS5yZWxlYXNlID0gY3gyNDExNl9yZWxlYXNlLAorCisJLmluaXQgPSBjeDI0MTE2X2luaXRmZSwKKwkuc2xlZXAgPSBjeDI0MTE2X3NsZWVwLAorCS5yZWFkX3N0YXR1cyA9IGN4MjQxMTZfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gY3gyNDExNl9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBjeDI0MTE2X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGN4MjQxMTZfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBjeDI0MTE2X3JlYWRfdWNibG9ja3MsCisJLnNldF90b25lID0gY3gyNDExNl9zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSBjeDI0MTE2X3NldF92b2x0YWdlLAorCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gY3gyNDExNl9zZW5kX2Rpc2VxY19tc2csCisJLmRpc2VxY19zZW5kX2J1cnN0ID0gY3gyNDExNl9kaXNlcWNfc2VuZF9idXJzdCwKKworCS5zZXRfcHJvcGVydHkgPSBjeDI0MTE2X3NldF9wcm9wZXJ0eSwKKwkuZ2V0X3Byb3BlcnR5ID0gY3gyNDExNl9nZXRfcHJvcGVydHksCisJLnNldF9mcm9udGVuZCA9IGN4MjQxMTZfc2V0X2Zyb250ZW5kLAorfTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFjdGl2YXRlcyBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6MCkiKTsKKworbW9kdWxlX3BhcmFtKHRvbmVidXJzdCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModG9uZWJ1cnN0LCAiRGlTRXFDIHRvbmVidXJzdCAwPU9GRiwgMT1UT05FIENBQ0hFLCAyPU1FU1NBR0UgQ0FDSEUgKGRlZmF1bHQ6MSkiKTsKKworbW9kdWxlX3BhcmFtKGVzbm9fc25yLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNOUiByZXR1cm4gdW5pdHMsIDA9UEVSQ0VOVEFHRSAwLTEwMCwgMT1FU05PKGRiICogMTApIChkZWZhdWx0OjApIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFZCIEZyb250ZW5kIG1vZHVsZSBmb3IgQ29uZXhhbnQgY3gyNDExNi9jeDI0MTE4IGhhcmR3YXJlIik7CitNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gVG90aCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKGN4MjQxMTZfYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgICAgQ29uZXhhbnQgY3gyNDExNi9jeDI0MTE4IC0gRFZCUy9TMiBTYXRlbGxpdGUgZGVtb2QvdHVuZXIgZHJpdmVyCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisjaWZuZGVmIENYMjQxMTZfSAorI2RlZmluZSBDWDI0MTE2X0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgY3gyNDExNl9jb25maWcKK3sKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBOZWVkIHRvIHNldCBkZXZpY2UgcGFyYW0gZm9yIHN0YXJ0X2RtYSAqLworCWludCAoKnNldF90c19wYXJhbXMpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaXNfcHVuY3R1cmVkKTsKKworCS8qIE5lZWQgdG8gcmVzZXQgZGV2aWNlIGR1cmluZyBmaXJtd2FyZSBsb2FkaW5nICovCisJaW50ICgqcmVzZXRfZGV2aWNlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CisKKwkvKiBOZWVkIHRvIHNldCBNUEVHIHBhcmFtZXRlcnMgKi8KKwl1OCBtcGdfY2xrX3Bvc19wb2w6MHgwMjsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDExNikgfHwgZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMTZfTU9EVUxFKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjQxMTZfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDI0MTE2X2NvbmZpZyogY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDI0MTE2X2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyNDExNl9jb25maWcqIGNvbmZpZywKKwkJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8vIENPTkZJR19EVkJfQ1gyNDExNgorCisjZW5kaWYgLyogQ1gyNDExNl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwNzAuaAppbmRleCAzZWVkZmRmLi4yMWYyYzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIwMDcwLmgKQEAgLTQxLDYgKzQxLDcgQEAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkaWIwMDcwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCiAJCQkJCSAgIHN0cnVjdCBkaWIwMDcwX2NvbmZpZyAqY2ZnKTsKK2V4dGVybiB1MTYgZGliMDA3MF93YmRfb2Zmc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkaWIwMDcwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCkBAIC00OSw5ICs1MCwxNCBAQAogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOwogCXJldHVybiBOVUxMOwogfQorCitzdGF0aWMgaW5saW5lIHUxNiBkaWIwMDcwX3diZF9vZmZzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgZGliMDA3MF9jdHJsX2FnY19maWx0ZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1aW50OF90IG9wZW4pOwotZXh0ZXJuIHUxNiBkaWIwMDcwX3diZF9vZmZzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5jCmluZGV4IDVmMTM3NWUuLjAxMDk3MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5jCkBAIC0xMjg0LDcgKzEyODQsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0woZGliNzAwMG1fZ2V0X2kyY19tYXN0ZXIpOwogCi1pbnQgZGliNzAwMG1faTJjX2VudW1lcmF0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBpbnQgbm9fb2ZfZGVtb2RzLCB1OCBkZWZhdWx0X2FkZHIsIHN0cnVjdCBkaWI3MDAwbV9jb25maWcgY2ZnW10pCisjaWYgMAorLyogdXNlZCB3aXRoIHNvbWUgcHJvdG90eXBlIGJvYXJkcyAqLworaW50IGRpYjcwMDBtX2kyY19lbnVtZXJhdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IG5vX29mX2RlbW9kcywKKwkJdTggZGVmYXVsdF9hZGRyLCBzdHJ1Y3QgZGliNzAwMG1fY29uZmlnIGNmZ1tdKQogewogCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSBzdCA9IHsgLmkyY19hZGFwID0gaTJjIH07CiAJaW50IGsgPSAwOwpAQCAtMTMyOSw2ICsxMzMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZGliNzAwMG1faTJjX2VudW1lcmF0aW9uKTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZGliNzAwMG1fb3BzOwogc3RydWN0IGR2Yl9mcm9udGVuZCAqIGRpYjcwMDBtX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCB1OCBpMmNfYWRkciwgc3RydWN0IGRpYjcwMDBtX2NvbmZpZyAqY2ZnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwppbmRleCAxYTAxNDJlLi44MjE3ZTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwpAQCAtMTMzMyw3ICsxMzMzLDggQEAKIAkvKiBFbnN1cmUgdGhlIG91dHB1dCBtb2RlIHJlbWFpbnMgYXQgdGhlIHByZXZpb3VzIGRlZmF1bHQgaWYgaXQncwogCSAqIG5vdCBzcGVjaWZpY2FsbHkgc2V0IGJ5IHRoZSBjYWxsZXIuCiAJICovCi0JaWYgKHN0LT5jZmcub3V0cHV0X21vZGUgIT0gT1VUTU9ERV9NUEVHMl9TRVJJQUwpCisJaWYgKChzdC0+Y2ZnLm91dHB1dF9tb2RlICE9IE9VVE1PREVfTVBFRzJfU0VSSUFMKSAmJgorCSAgICAoc3QtPmNmZy5vdXRwdXRfbW9kZSAhPSBPVVRNT0RFX01QRUcyX1BBUl9HQVRFRF9DTEspKQogCQlzdC0+Y2ZnLm91dHB1dF9tb2RlID0gT1VUTU9ERV9NUEVHMl9GSUZPOwogCiAJZGVtb2QgICAgICAgICAgICAgICAgICAgPSAmc3QtPmRlbW9kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuaAppbmRleCAwN2M0ZDEyLi4zZTgxMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuaApAQCAtNDEsNiArNDEsMTQgQEAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkaWI3MDAwcF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKIAkJCQkJICAgIHU4IGkyY19hZGRyLAogCQkJCQkgICAgc3RydWN0IGRpYjcwMDBwX2NvbmZpZyAqY2ZnKTsKK2V4dGVybiBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwKKwkJCQkJCSAgIGVudW0gZGlieDAwMF9pMmNfaW50ZXJmYWNlLAorCQkJCQkJICAgaW50KTsKK2V4dGVybiBpbnQgZGliNzAwMHBfaTJjX2VudW1lcmF0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSAgICBpbnQgbm9fb2ZfZGVtb2RzLCB1OCBkZWZhdWx0X2FkZHIsCisJCQkJICAgIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgY2ZnW10pOworZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHU4IG51bSwgdTggZGlyLCB1OCB2YWwpOworZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfd2JkX3JlZihzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHUxNiB2YWx1ZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkaWI3MDAwcF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKIAkJCQkJCSAgIHU4IGkyY19hZGRyLApAQCAtNDksMTMgKzU3LDM2IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CiB9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMmNfYWRhcHRlciAqZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgICBlbnVtIGRpYngwMDBfaTJjX2ludGVyZmFjZSBpLCBpbnQgeCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKworZXh0ZXJuIGludCBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJICAgIGludCBub19vZl9kZW1vZHMsIHU4IGRlZmF1bHRfYWRkciwKKwkJCQkgICAgc3RydWN0IGRpYjcwMDBwX2NvbmZpZyBjZmdbXSkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggbnVtLCB1OCBkaXIsIHU4IHZhbCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworZXh0ZXJuIGludCBkaWI3MDAwcF9zZXRfd2JkX3JlZihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2IHZhbHVlKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmCiAKLWV4dGVybiBpbnQgZGliNzAwMHBfaTJjX2VudW1lcmF0aW9uKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBpbnQgbm9fb2ZfZGVtb2RzLCB1OCBkZWZhdWx0X2FkZHIsIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgY2ZnW10pOwotCi1leHRlcm4gc3RydWN0IGkyY19hZGFwdGVyICogZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBlbnVtIGRpYngwMDBfaTJjX2ludGVyZmFjZSwgaW50KTsKIGV4dGVybiBpbnQgZGliNzAwMHBjX2RldGVjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKTsKLWV4dGVybiBpbnQgZGliNzAwMHBfc2V0X2dwaW8oc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1OCBudW0sIHU4IGRpciwgdTggdmFsKTsKLWV4dGVybiBpbnQgZGliNzAwMHBfc2V0X3diZF9yZWYoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1MTYgdmFsdWUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKaW5kZXggM2NiZWQ4Ny4uYjljYTVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeDM5N3hELmMKQEAgLTM4LDM1ICszOCwzMiBAQAogI2RlZmluZSBGX1NFVF8wRDBoCTEKICNkZWZpbmUgRl9TRVRfMEQ0aAkyCiAKLXR5cGVkZWYgZW51bSBmd19peCB7CitlbnVtIGZ3X2l4IHsKICNkZWZpbmUgX0ZXX0VOVFJZKGEsIGIpCQliCiAjaW5jbHVkZSAiZHJ4Mzk3eERfZncuaCIKLX0gZndfaXhfdDsKK307CiAKIC8qIGNoaXAgc3BlY2lmaWNzICovCiBzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAJc3RydWN0IGRyeDM5N3hEX2NvbmZpZyBjb25maWc7Ci0JZndfaXhfdCBjaGlwX3JldjsKKwllbnVtIGZ3X2l4IGNoaXBfcmV2OwogCWludCBmbGFnczsKIAl1MzIgYmFuZHdpZHRoX3Bhcm07CS8qIGludGVybmFsIGJhbmR3aWR0aCBjb252ZXJzaW9ucyAqLwogCXUzMiBmX29zYzsJCS8qIHc5MDogYWN0dWFsIG9zYyBmcmVxdWVuY3kgW0h6XSAqLwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpcm13YXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisvKiBGaXJtd2FyZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmJsb2JfbmFtZVtdID0gewogI2RlZmluZSBfQkxPQl9FTlRSWShhLCBiKQkJYQogI2luY2x1ZGUgImRyeDM5N3hEX2Z3LmgiCiB9OwogCi10eXBlZGVmIGVudW0gYmxvYl9peCB7CitlbnVtIGJsb2JfaXggewogI2RlZmluZSBfQkxPQl9FTlRSWShhLCBiKQkJYgogI2luY2x1ZGUgImRyeDM5N3hEX2Z3LmgiCi19IGJsb2JfaXhfdDsKK307CiAKIHN0YXRpYyBzdHJ1Y3QgewogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC04NSw3ICs4Miw3IEBACiB9OwogCiAvKiB1c2Ugb25seSB3aXRoIHdyaXRlciBsb2NrIGFxdWlyZWQgKi8KLXN0YXRpYyB2b2lkIF9kcnhfcmVsZWFzZV9mdyhzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIGZ3X2l4X3QgaXgpCitzdGF0aWMgdm9pZCBfZHJ4X3JlbGVhc2VfZncoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzLCBlbnVtIGZ3X2l4IGl4KQogewogCW1lbXNldCgmZndbaXhdLmRhdGFbMF0sIDAsIHNpemVvZihmd1swXS5kYXRhKSk7CiAJaWYgKGZ3W2l4XS5maWxlKQpAQCAtOTQsOSArOTEsOSBAQAogCiBzdGF0aWMgdm9pZCBkcnhfcmVsZWFzZV9mdyhzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMpCiB7Ci0JZndfaXhfdCBpeCA9IHMtPmNoaXBfcmV2OworCWVudW0gZndfaXggaXggPSBzLT5jaGlwX3JldjsKIAotCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCXdyaXRlX2xvY2soJmZ3W2l4XS5sb2NrKTsKIAlpZiAoZndbaXhdLnJlZmNudCkgewpAQCAtMTA3LDEzICsxMDQsMTMgQEAKIAl3cml0ZV91bmxvY2soJmZ3W2l4XS5sb2NrKTsKIH0KIAotc3RhdGljIGludCBkcnhfbG9hZF9mdyhzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIGZ3X2l4X3QgaXgpCitzdGF0aWMgaW50IGRyeF9sb2FkX2Z3KHN0cnVjdCBkcngzOTd4RF9zdGF0ZSAqcywgZW51bSBmd19peCBpeCkKIHsKIAljb25zdCB1OCAqZGF0YTsKIAlzaXplX3Qgc2l6ZSwgbGVuOwogCWludCBpID0gMCwgaiwgcmMgPSAtRUlOVkFMOwogCi0JcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKGl4IDwgMCB8fCBpeCA+PSBBUlJBWV9TSVpFKGZ3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzUsMzIgKzE3MiwzNCBAQAogCQkJZ290byBleGl0X2NvcnJ1cHQ7CiAJCX0KIAl9IHdoaWxlIChpIDwgc2l6ZSk7Ci0gICAgICBleGl0X2NvcnJ1cHQ6CisKK2V4aXRfY29ycnVwdDoKIAlwcmludGsoS0VSTl9FUlIgIiVzOiBGaXJtd2FyZSBpcyBjb3JydXB0XG4iLCBtb2RfbmFtZSk7Ci0gICAgICBleGl0X2VycjoKK2V4aXRfZXJyOgogCV9kcnhfcmVsZWFzZV9mdyhzLCBpeCk7CiAJZndbaXhdLnJlZmNudC0tOwotICAgICAgZXhpdF9vazoKK2V4aXRfb2s6CiAJZndbaXhdLnJlZmNudCsrOwogCXdyaXRlX3VubG9jaygmZndbaXhdLmxvY2spOworCiAJcmV0dXJuIHJjOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogaTJjIGJ1cyBJTwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCB3cml0ZV9mdyhzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIGJsb2JfaXhfdCBpeCkKKy8qIGkyYyBidXMgSU8gKi8KK3N0YXRpYyBpbnQgd3JpdGVfZncoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzLCBlbnVtIGJsb2JfaXggaXgpCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gcy0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsLmZsYWdzID0gMCB9OwogCWNvbnN0IHU4ICpkYXRhOwogCWludCBsZW4sIHJjID0gMCwgaSA9IDA7CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IHMtPmNvbmZpZy5kZW1vZF9hZGRyZXNzLAorCQkuZmxhZ3MgPSAwCisJfTsKIAogCWlmIChpeCA8IDAgfHwgaXggPj0gQVJSQVlfU0laRShibG9iX25hbWUpKSB7Ci0JCXByX2RlYnVnKCIlcyBkcnhfZndfaXhfdCBvdXQgb2YgcmFuZ2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByX2RlYnVnKCIlcyBkcnhfZndfaXhfdCBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXByX2RlYnVnKCIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBibG9iX25hbWVbaXhdKTsKKwlwcl9kZWJ1ZygiJXMgJXNcbiIsIF9fZnVuY19fLCBibG9iX25hbWVbaXhdKTsKIAogCXJlYWRfbG9jaygmZndbcy0+Y2hpcF9yZXZdLmxvY2spOwogCWRhdGEgPSBmd1tzLT5jaGlwX3Jldl0uZGF0YVtpeF07CkBAIC0yMjksMzMgKzIyOCwzMyBAQAogCQkJZ290byBleGl0X3JjOwogCQl9CiAJfQotICAgICAgZXhpdF9yYzoKK2V4aXRfcmM6CiAJcmVhZF91bmxvY2soJmZ3W3MtPmNoaXBfcmV2XS5sb2NrKTsKKwogCXJldHVybiAwOwogfQogCiAvKiBGdW5jdGlvbiBpcyBub3QgZW5kaWFuIHNhZmUsIHVzZSB0aGUgUkQxNiB3cmFwcGVyIGJlbG93ICovCi1zdGF0aWMgaW50IF9yZWFkMTYoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzLCB1MzIgaTJjX2FkcikKK3N0YXRpYyBpbnQgX3JlYWQxNihzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIF9fbGUzMiBpMmNfYWRyKQogewogCWludCByYzsKIAl1OCBhWzRdOwotCXUxNiB2OworCV9fbGUxNiB2OwogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKIAkJewotCQkgLmFkZHIgPSBzLT5jb25maWcuZGVtb2RfYWRkcmVzcywKLQkJIC5mbGFncyA9IDAsCi0JCSAuYnVmID0gYSwKLQkJIC5sZW4gPSBzaXplb2YoYSkKLQkJIH0KLQkJLCB7Ci0JCSAgIC5hZGRyID0gcy0+Y29uZmlnLmRlbW9kX2FkZHJlc3MsCi0JCSAgIC5mbGFncyA9IEkyQ19NX1JELAotCQkgICAuYnVmID0gKHU4ICopICYgdiwKLQkJICAgLmxlbiA9IHNpemVvZih2KQotCQkgICB9CisJCQkuYWRkciA9IHMtPmNvbmZpZy5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gMCwKKwkJCS5idWYgPSBhLAorCQkJLmxlbiA9IHNpemVvZihhKQorCQl9LCB7CisJCQkuYWRkciA9IHMtPmNvbmZpZy5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkuYnVmID0gKHU4ICopJnYsCisJCQkubGVuID0gc2l6ZW9mKHYpCisJCX0KIAl9OwogCi0JKih1MzIgKikgYSA9IGkyY19hZHI7CisJKihfX2xlMzIgKikgYSA9IGkyY19hZHI7CiAKIAlyYyA9IGkyY190cmFuc2ZlcihzLT5pMmMsIG1zZywgMik7CiAJaWYgKHJjICE9IDIpCkBAIC0yNjUsNyArMjY0LDcgQEAKIH0KIAogLyogRnVuY3Rpb24gaXMgbm90IGVuZGlhbiBzYWZlLCB1c2UgdGhlIFdSMTYuLiB3cmFwcGVycyBiZWxvdyAqLwotc3RhdGljIGludCBfd3JpdGUxNihzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIHUzMiBpMmNfYWRyLCB1MTYgdmFsKQorc3RhdGljIGludCBfd3JpdGUxNihzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMsIF9fbGUzMiBpMmNfYWRyLCBfX2xlMTYgdmFsKQogewogCXU4IGFbNl07CiAJaW50IHJjOwpAQCAtMjc2LDI4ICsyNzUsMjggQEAKIAkJLmxlbiA9IHNpemVvZihhKQogCX07CiAKLQkqKHUzMiAqKSBhID0gaTJjX2FkcjsKLQkqKHUxNiAqKSAmIGFbNF0gPSB2YWw7CisJKihfX2xlMzIgKilhID0gaTJjX2FkcjsKKwkqKF9fbGUxNiAqKSZhWzRdID0gdmFsOwogCiAJcmMgPSBpMmNfdHJhbnNmZXIocy0+aTJjLCAmbXNnLCAxKTsKIAlpZiAocmMgIT0gMSkKIAkJcmV0dXJuIC1FSU87CisKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBXUjE2KHNzLGFkciwgdmFsKSBcCisjZGVmaW5lIFdSMTYoc3MsIGFkciwgdmFsKSBcCiAJCV93cml0ZTE2KHNzLCBJMkNfQURSX0MwKGFkciksIGNwdV90b19sZTE2KHZhbCkpCi0jZGVmaW5lIFdSMTZfRTAoc3MsYWRyLCB2YWwpIFwKKyNkZWZpbmUgV1IxNl9FMChzcywgYWRyLCB2YWwpIFwKIAkJX3dyaXRlMTYoc3MsIEkyQ19BRFJfRTAoYWRyKSwgY3B1X3RvX2xlMTYodmFsKSkKLSNkZWZpbmUgUkQxNihzcyxhZHIpIFwKKyNkZWZpbmUgUkQxNihzcywgYWRyKSBcCiAJCV9yZWFkMTYoc3MsIEkyQ19BRFJfQzAoYWRyKSkKIAotI2RlZmluZSBFWElUX1JDKCBjbWQgKQlpZiAoIChyYyA9IChjbWQpKSA8IDApIGdvdG8gZXhpdF9yYworI2RlZmluZSBFWElUX1JDKGNtZCkJXAorCWlmICgocmMgPSAoY21kKSkgPCAwKQlcCisJCWdvdG8gZXhpdF9yYwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVHVuZXIgY2FsbGJhY2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKy8qIFR1bmVyIGNhbGxiYWNrICovCiBzdGF0aWMgaW50IFBMTF9TZXQoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzLAogCQkgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCwgaW50ICpkZl90dW5lcikKIHsKQEAgLTMwNSw3ICszMDQsNyBAQAogCXUzMiBmX3R1bmVyLCBmID0gZmVwLT5mcmVxdWVuY3k7CiAJaW50IHJjOwogCi0JcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKChmID4gcy0+ZnJvbnRlbmQub3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9tYXgpIHx8CiAJICAgIChmIDwgcy0+ZnJvbnRlbmQub3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4pKQpAQCAtMzI1LDI4ICszMjQsMjYgQEAKIAkJcmV0dXJuIHJjOwogCiAJKmRmX3R1bmVyID0gZl90dW5lciAtIGY7Ci0JcHJfZGVidWcoIiVzIHJlcXVlc3RlZCAlZCBbSHpdIHR1bmVyICVkIFtIel1cbiIsIF9fRlVOQ1RJT05fXywgZiwKKwlwcl9kZWJ1ZygiJXMgcmVxdWVzdGVkICVkIFtIel0gdHVuZXIgJWQgW0h6XVxuIiwgX19mdW5jX18sIGYsCiAJCSBmX3R1bmVyKTsKIAogCXJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVtb2R1bGF0b3IgaGVscGVyIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyogRGVtb2R1bGF0b3IgaGVscGVyIGZ1bmN0aW9ucyAqLwogc3RhdGljIGludCBTQ19XYWl0Rm9yUmVhZHkoc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzKQogewogCWludCBjbnQgPSAxMDAwOwogCWludCByYzsKIAotCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCXdoaWxlIChjbnQtLSkgewogCQlyYyA9IFJEMTYocywgMHg4MjAwNDMpOwogCQlpZiAocmMgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KKwogCXJldHVybiAtMTsKIH0KIApAQCAtMzU0LDEzICszNTEsMTQgQEAKIHsKIAlpbnQgcmM7CiAKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlXUjE2KHMsIDB4ODIwMDQzLCBjbWQpOwogCVNDX1dhaXRGb3JSZWFkeShzKTsKIAlyYyA9IFJEMTYocywgMHg4MjAwNDIpOwogCWlmICgocmMgJiAweGZmZmYpID09IDB4ZmZmZikKIAkJcmV0dXJuIC0xOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2OCw3ICszNjYsNyBAQAogewogCWludCByYywgY250ID0gMTAwMDsKIAotCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKIAogCXJjID0gV1IxNihzLCAweDQyMDAzMiwgY21kKTsKIAlpZiAocmMgPCAwKQpAQCAtMzgzLDIyICszODEsMjQgQEAKIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAl9IHdoaWxlICgtLWNudCk7CisKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgSElfQ2ZnQ29tbWFuZChzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMpCiB7CiAKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlXUjE2KHMsIDB4NDIwMDMzLCAweDM5NzMpOwotCVdSMTYocywgMHg0MjAwMzQsIHMtPmNvbmZpZy53NTApOwkvLyBjb2RlIDQsIGxvZyA0Ci0JV1IxNihzLCAweDQyMDAzNSwgcy0+Y29uZmlnLnc1Mik7CS8vIGNvZGUgMTUsICBsb2cgOQorCVdSMTYocywgMHg0MjAwMzQsIHMtPmNvbmZpZy53NTApOwkvKiBjb2RlIDQsIGxvZyA0ICovCisJV1IxNihzLCAweDQyMDAzNSwgcy0+Y29uZmlnLnc1Mik7CS8qIGNvZGUgMTUsICBsb2cgOSAqLwogCVdSMTYocywgMHg0MjAwMzYsIHMtPmNvbmZpZy5kZW1vZF9hZGRyZXNzIDw8IDEpOwotCVdSMTYocywgMHg0MjAwMzcsIHMtPmNvbmZpZy53NTYpOwkvLyBjb2RlIChzZXRfaTJjID8/ICBpbml0WCAxICksIGxvZyAxCi0vLyAgICAgIFdSMTYocywgMHg0MjAwMzMsIDB4Mzk3Myk7CisJV1IxNihzLCAweDQyMDAzNywgcy0+Y29uZmlnLnc1Nik7CS8qIGNvZGUgKHNldF9pMmMgPz8gIGluaXRYIDEgKSwgbG9nIDEgKi8KKwkvKiBXUjE2KHMsIDB4NDIwMDMzLCAweDM5NzMpOyAqLwogCWlmICgocy0+Y29uZmlnLnc1NiAmIDgpID09IDApCiAJCXJldHVybiBISV9Db21tYW5kKHMsIDMpOworCiAJcmV0dXJuIFdSMTYocywgMHg0MjAwMzIsIDB4Myk7CiB9CiAKQEAgLTQxOSw3ICs0MTksNyBAQAogCXUxNiB3MEMgPSBhZ2MtPncwQzsKIAlpbnQgcXVvdCwgcmVtLCBpLCByYyA9IC1FSU5WQUw7CiAKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoYWdjLT53MDQgPiAweDNmZikKIAkJZ290byBleGl0X3JjOwpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJaSA9IHNsb3dJbmNyRGVjTFVUXzE1MjcyW3JlbSAvIDI4XTsKIAlFWElUX1JDKFdSMTYocywgMHgwYzIwMDJiLCBpKSk7CiAJcmMgPSBXUjE2KHMsIDB4MGMyMDAyYywgaSk7Ci0gICAgICBleGl0X3JjOgorZXhpdF9yYzoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ3OCw3ICs0NzgsNyBAQAogCXUxNiB3MDYgPSBhZ2MtPncwNjsKIAlpbnQgcmMgPSAtMTsKIAotCXByX2RlYnVnKCIlcyAlZCAweCV4IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgYWdjLT5kMDAsIHcwNCwgdzA2KTsKKwlwcl9kZWJ1ZygiJXMgJWQgMHgleCAweCV4XG4iLCBfX2Z1bmNfXywgYWdjLT5kMDAsIHcwNCwgdzA2KTsKIAogCWlmICh3MDQgPiAweDNmZikKIAkJZ290byBleGl0X3JjOwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJCXJjICY9IH4yOwogCQlicmVhazsKIAljYXNlIDA6Ci0JCS8vIGxvY184MDAwNjU5CisJCS8qIGxvY184MDAwNjU5ICovCiAJCXMtPmNvbmZpZy53OUMgJj0gfjI7CiAJCUVYSVRfUkMoV1IxNihzLCAweDBjMjAwMTUsIHMtPmNvbmZpZy53OUMpKTsKIAkJRVhJVF9SQyhSRDE2KHMsIDB4MGMyMDAxMCkpOwpAQCAtNTIyLDcgKzUyMiw4IEBACiAJCXJjIHw9IDI7CiAJfQogCXJjID0gV1IxNihzLCAweDBjMjAwMTMsIHJjKTsKLSAgICAgIGV4aXRfcmM6CisKK2V4aXRfcmM6CiAJcmV0dXJuIHJjOwogfQogCkBAIC01NTQsNyArNTU1LDcgQEAKIAlpbnQgbG9ja3N0YXQ7CiAJdTMyIGNsaywgY2xrX2xpbWl0OwogCi0JcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKHMtPmNvbmZpZy5kNUMgPT0gMCkgewogCQlFWElUX1JDKFdSMTYocywgMHgwODIwMGU4LCAweDAxMCkpOwpAQCAtNTk4LDExICs1OTksMTIgQEAKIAogCWlmIChjbGsgLSBzLT5jb25maWcuZl9vc2MgKiAxMDAwICsgY2xrX2xpbWl0IDw9IDIgKiBjbGtfbGltaXQpIHsKIAkJcy0+Zl9vc2MgPSBjbGs7Ci0JCXByX2RlYnVnKCIlczogb3NjICVkICVkIFtIel1cbiIsIF9fRlVOQ1RJT05fXywKKwkJcHJfZGVidWcoIiVzOiBvc2MgJWQgJWQgW0h6XVxuIiwgX19mdW5jX18sCiAJCQkgcy0+Y29uZmlnLmZfb3NjICogMTAwMCwgY2xrIC0gcy0+Y29uZmlnLmZfb3NjICogMTAwMCk7CiAJfQogCXJjID0gV1IxNihzLCAweDA4MjAwZTgsIDApOwotICAgICAgZXhpdF9yYzoKKworZXhpdF9yYzoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYxMCw3ICs2MTIsNyBAQAogewogCWludCByYywgc2ksIGJwOwogCi0JcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwogCiAJc2kgPSBzLT5jb25maWcud0EwOwogCWlmIChzLT5jb25maWcudzk4ID09IDApIHsKQEAgLTYyMCwxNyArNjIyLDE3IEBACiAJCXNpICY9IH4xOwogCQlicCA9IDB4MjAwOwogCX0KLQlpZiAocy0+Y29uZmlnLnc5QSA9PSAwKSB7CisJaWYgKHMtPmNvbmZpZy53OUEgPT0gMCkKIAkJc2kgfD0gMHg4MDsKLQl9IGVsc2UgeworCWVsc2UKIAkJc2kgJj0gfjB4ODA7Ci0JfQogCiAJRVhJVF9SQyhXUjE2KHMsIDB4MjE1MDA0NSwgMCkpOwogCUVYSVRfUkMoV1IxNihzLCAweDIxNTAwMTAsIHNpKSk7CiAJRVhJVF9SQyhXUjE2KHMsIDB4MjE1MDAxMSwgYnApKTsKIAlyYyA9IFdSMTYocywgMHgyMTUwMDEyLCAodHlwZSA9PSAwID8gMHhmZmYgOiAwKSk7Ci0gICAgICBleGl0X3JjOgorCitleGl0X3JjOgogCXJldHVybiByYzsKIH0KIApAQCAtNjQ2LDcgKzY0OCw3IEBACiAKIAlpbnQgcmMsIGRmX3R1bmVyOwogCWludCBhLCBiLCBjLCBkOwotCXByX2RlYnVnKCIlcyAlZFxuIiwgX19GVU5DVElPTl9fLCBzLT5jb25maWcuZDYwKTsKKwlwcl9kZWJ1ZygiJXMgJWRcbiIsIF9fZnVuY19fLCBzLT5jb25maWcuZDYwKTsKIAogCWlmIChzLT5jb25maWcuZDYwICE9IDIpCiAJCWdvdG8gc2V0X3R1bmVyOwpAQCAtNjU4LDcgKzY2MCw3IEBACiAJcmMgPSBDb25maWd1cmVNUEVHT3V0cHV0KHMsIDApOwogCWlmIChyYyA8IDApCiAJCWdvdG8gc2V0X3R1bmVyOwotICAgICAgc2V0X3R1bmVyOgorc2V0X3R1bmVyOgogCiAJcmMgPSBQTExfU2V0KHMsIGZlcCwgJmRmX3R1bmVyKTsKIAlpZiAocmMgPCAwKSB7CkBAIC04MzUsMTYgKzgzNywxNiBAQAogCQlyYyA9IFdSMTYocywgMHgyMDEwMDEyLCAwKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gZXhpdF9yYzsKLQkJLy8gICAgICAgICAgICAgIFFQU0sgICAgUUFNMTYgICBRQU02NAotCQllYnggPSAweDE5ZjsJLy8gICAgICAgICAgICAgICAgIDYyCi0JCWVicCA9IDB4MWZiOwkvLyAgICAgICAgICAgICAgICAgMTUKLQkJdjIwID0gMHgxNmE7CS8vICA2MgotCQl2MUUgPSAweDE5NTsJLy8gICAgICAgICA2MgotCQl2MTYgPSAweDFiYjsJLy8gIDE1Ci0JCXYxNCA9IDB4MWVmOwkvLyAgICAgICAgIDE1Ci0JCXYxMiA9IDU7CS8vICAxNgotCQl2MTAgPSA1OwkvLyAgICAgICAgIDE2Ci0JCXYwRSA9IDU7CS8vICAgICAgICAgICAgICAgICAxNgorCQkJCS8qIFFQU0sgICAgUUFNMTYgIFFBTTY0CSovCisJCWVieCA9IDB4MTlmOwkvKiAgICAgICAgICAgICAgICAgNjIJKi8KKwkJZWJwID0gMHgxZmI7CS8qICAgICAgICAgICAgICAgICAxNQkqLworCQl2MjAgPSAweDE2YTsJLyogIDYyCQkJKi8KKwkJdjFFID0gMHgxOTU7CS8qICAgICAgICAgNjIJCSovCisJCXYxNiA9IDB4MWJiOwkvKiAgMTUJCQkqLworCQl2MTQgPSAweDFlZjsJLyogICAgICAgICAxNQkJKi8KKwkJdjEyID0gNTsJLyogIDE2CQkJKi8KKwkJdjEwID0gNTsJLyogICAgICAgICAxNgkJKi8KKwkJdjBFID0gNTsJLyogICAgICAgICAgICAgICAgIDE2CSovCiAJfQogCiAJc3dpdGNoIChmZXAtPnUub2ZkbS5jb25zdGVsbGF0aW9uKSB7CkBAIC05OTcsMTcgKzk5OSwxNyBAQAogCWNhc2UgQkFORFdJRFRIXzhfTUhaOgkvKiAwICovCiAJY2FzZSBCQU5EV0lEVEhfQVVUTzoKIAkJcmMgPSBXUjE2KHMsIDB4MGMyMDAzZiwgMHgzMik7Ci0JCXMtPmJhbmR3aWR0aF9wYXJtID0gZWJ4ID0gMHg4YjgyNDk7CS8vIDkxNDI4NTcKKwkJcy0+YmFuZHdpZHRoX3Bhcm0gPSBlYnggPSAweDhiODI0OTsKIAkJZWR4ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBCQU5EV0lEVEhfN19NSFo6CiAJCXJjID0gV1IxNihzLCAweDBjMjAwM2YsIDB4M2IpOwotCQlzLT5iYW5kd2lkdGhfcGFybSA9IGVieCA9IDB4N2ExMjAwOwkvLyA4MDAwMDAwCisJCXMtPmJhbmR3aWR0aF9wYXJtID0gZWJ4ID0gMHg3YTEyMDA7CiAJCWVkeCA9IDB4NDgwNzsKIAkJYnJlYWs7CiAJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CiAJCXJjID0gV1IxNihzLCAweDBjMjAwM2YsIDB4NDcpOwotCQlzLT5iYW5kd2lkdGhfcGFybSA9IGVieCA9IDB4NjhhMWI2OwkvLyA2ODU3MTQyCisJCXMtPmJhbmR3aWR0aF9wYXJtID0gZWJ4ID0gMHg2OGExYjY7CiAJCWVkeCA9IDB4MGYwNzsKIAkJYnJlYWs7CiAJfTsKQEAgLTEwNjAsOCArMTA2Miw2IEBACiAJV1IxNihzLCAweDA4MjAwNDAsIDEpOwogCVNDX1NlbmRDb21tYW5kKHMsIDEpOwogCi0vLyAgICAgIHJjID0gV1IxNihzLCAweDIxNTAwMDAsIDEpOwotLy8gICAgICBpZiAocmMgPCAwKSBnb3RvIGV4aXRfcmM7CiAKIAlyYyA9IFdSMTYocywgMHgyMTUwMDAwLCAyKTsKIAlyYyA9IFdSMTYocywgMHgyMTUwMDE2LCBhKTsKQEAgLTEwNjksNyArMTA2OSw4IEBACiAJcmMgPSBXUjE2KHMsIDB4MjE1MDAzNiwgMCk7CiAJcmMgPSBXUjE2KHMsIDB4MjE1MDAwMCwgMSk7CiAJcy0+Y29uZmlnLmQ2MCA9IDI7Ci0gICAgICBleGl0X3JjOgorCitleGl0X3JjOgogCXJldHVybiByYzsKIH0KIApAQCAtMTA4Miw3ICsxMDgzLDcgQEAKIAlzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUgKnMgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgcmM7CiAKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzLT5jb25maWcucmZhZ2MuZDAwID0gMjsJLyogMHg3YyAqLwogCXMtPmNvbmZpZy5yZmFnYy53MDQgPSAwOwpAQCAtMTEwMiwxOCArMTEwMywxOCBAQAogCiAJLyogSElfQ2ZnQ29tbWFuZCAqLwogCXMtPmNvbmZpZy53NTAgPSA0OwotCXMtPmNvbmZpZy53NTIgPSA5OwkvLyAweGY7CisJcy0+Y29uZmlnLnc1MiA9IDk7CiAKLQlzLT5jb25maWcuZl9pZiA9IDQyODAwMDAwOwkvKiBkMTQ6IGludGVybWVkaWF0ZSBmcmVxdWVuY3kgW0h6XSAgICAgKi8KLQlzLT5jb25maWcuZl9vc2MgPSA0ODAwMDsJLyogczY2IDogb3NjaWxsYXRvciBmcmVxdWVuY3kgW2tIel0gICAgICovCi0Jcy0+Y29uZmlnLnc5MiA9IDEyMDAwOwkvLyAyMDAwMDsKKwlzLT5jb25maWcuZl9pZiA9IDQyODAwMDAwOwkvKiBkMTQ6IGludGVybWVkaWF0ZSBmcmVxdWVuY3kgW0h6XSAqLworCXMtPmNvbmZpZy5mX29zYyA9IDQ4MDAwOwkvKiBzNjYgOiBvc2NpbGxhdG9yIGZyZXF1ZW5jeSBba0h6XSAqLworCXMtPmNvbmZpZy53OTIgPSAxMjAwMDsKIAogCXMtPmNvbmZpZy53OUMgPSAweDAwMGU7CiAJcy0+Y29uZmlnLnc5RSA9IDB4MDAwMDsKIAogCS8qIENvbmZpZ3VyZU1QRUdPdXRwdXQgcGFyYW1zICovCiAJcy0+Y29uZmlnLndBMCA9IDQ7Ci0Jcy0+Y29uZmlnLnc5OCA9IDE7CS8vIDA7CisJcy0+Y29uZmlnLnc5OCA9IDE7CiAJcy0+Y29uZmlnLnc5QSA9IDE7CiAKIAkvKiBnZXQgY2hpcCByZXZpc2lvbiAqLwpAQCAtMTI0OCw3ICsxMjQ5LDcgQEAKIAkJcmMgPSBXUjE2KHMsIDB4MGMyMDAxMiwgMSk7CiAJfQogCi0gICAgICB3cml0ZV9EUlhEX0luaXRGRV8xOgord3JpdGVfRFJYRF9Jbml0RkVfMToKIAogCXJjID0gd3JpdGVfZncocywgRFJYRF9Jbml0RkVfMSk7CiAJaWYgKHJjIDwgMCkKQEAgLTEzMTEsNyArMTMxMiw4IEBACiAJcy0+Y29uZmlnLmQ1QyA9IDA7CiAJcy0+Y29uZmlnLmQ2MCA9IDE7CiAJcy0+Y29uZmlnLmQ0OCA9IDE7Ci0gICAgICBlcnJvcjoKKworZXJyb3I6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMzI2LDcgKzEzMjgsOCBAQAogewogCXN0cnVjdCBkcngzOTd4RF9zdGF0ZSAqcyA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0Jcy0+Y29uZmlnLnMyMGQyNCA9IDE7CS8vIDA7CisJcy0+Y29uZmlnLnMyMGQyNCA9IDE7CisKIAlyZXR1cm4gZHJ4X3R1bmUocywgcGFyYW1zKTsKIH0KIApAQCAtMTMzNywxOCArMTM0MCwxNiBAQAogCWZlX3R1bmVfc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDAwOwogCWZlX3R1bmVfc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDA7CiAJZmVfdHVuZV9zZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRyeDM5N3hfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICogc3RhdHVzKQorc3RhdGljIGludCBkcngzOTd4X3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQogewogCXN0cnVjdCBkcngzOTd4RF9zdGF0ZSAqcyA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBsb2Nrc3RhdDsKIAogCUdldExvY2tTdGF0dXMocywgJmxvY2tzdGF0KTsKLQkvKiBUT0RPICovCi0vLyAgICAgIGlmIChsb2Nrc3RhdCAmIDEpCi0vLyAgICAgIENvcnJlY3RTeXNDbG9ja0RldmlhdGlvbihzKTsKIAogCSpzdGF0dXMgPSAwOwogCWlmIChsb2Nrc3RhdCAmIDIpIHsKQEAgLTEzNTYsOSArMTM1Nyw4IEBACiAJCUNvbmZpZ3VyZU1QRUdPdXRwdXQocywgMSk7CiAJCSpzdGF0dXMgPSBGRV9IQVNfTE9DSyB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX1ZJVEVSQkk7CiAJfQotCWlmIChsb2Nrc3RhdCAmIDQpIHsKKwlpZiAobG9ja3N0YXQgJiA0KQogCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NJR05BTDsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNjYsMTYgKzEzNjYsMTggQEAKIHN0YXRpYyBpbnQgZHJ4Mzk3eF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50ICpiZXIpCiB7CiAJKmJlciA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcngzOTd4X3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKiBzbnIpCitzdGF0aWMgaW50IGRyeDM5N3hfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQogewogCSpzbnIgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJ4Mzk3eF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICogc3RyZW5ndGgpCitzdGF0aWMgaW50IGRyeDM5N3hfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCiB7CiAJc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJjOwpAQCAtMTQwMSw2ICsxNDAzLDcgQEAKIAkgKiBUaGUgZm9sbG93aW5nIGRvZXMgdGhlIHNhbWUgYnV0IHdpdGggbGVzcyByb3VuZGluZyBlcnJvcnM6CiAJICovCiAJKnN0cmVuZ3RoID0gfig3NzIwICsgKHJjICogMzA3NDQgPj4gMTApKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDA4LDYgKzE0MTEsNyBAQAogCQkJCSB1bnNpZ25lZCBpbnQgKnVjYmxvY2tzKQogewogCSp1Y2Jsb2NrcyA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQzNiwyMiArMTQ0MCwyMiBAQAogCQkgLmZyZXF1ZW5jeV9tYXgJCT0gODU1MjUwMDAwLAogCQkgLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDE2NjY2NywKIAkJIC5mcmVxdWVuY3lfdG9sZXJhbmNlCT0gMCwKLQkJIC5jYXBzID0JCQkJCS8qIDB4MEMwMUIyRUFFICovCi0JCQkgRkVfQ0FOX0ZFQ18xXzIJCQl8CS8vID0gMHgyLAotCQkJIEZFX0NBTl9GRUNfMl8zCQkJfAkvLyA9IDB4NCwKLQkJCSBGRV9DQU5fRkVDXzNfNAkJCXwJLy8gPSAweDgsCi0JCQkgRkVfQ0FOX0ZFQ181XzYJCQl8CS8vID0gMHgyMCwKLQkJCSBGRV9DQU5fRkVDXzdfOAkJCXwJLy8gPSAweDgwLAotCQkJIEZFX0NBTl9GRUNfQVVUTwkJfAkvLyA9IDB4MjAwLAotCQkJIEZFX0NBTl9RUFNLCQkJfAkvLyA9IDB4NDAwLAotCQkJIEZFX0NBTl9RQU1fMTYJCQl8CS8vID0gMHg4MDAsCi0JCQkgRkVfQ0FOX1FBTV82NAkJCXwJLy8gPSAweDIwMDAsCi0JCQkgRkVfQ0FOX1FBTV9BVVRPCQl8CS8vID0gMHgxMDAwMCwKLQkJCSBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTwl8CS8vID0gMHgyMDAwMCwKLQkJCSBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTwl8CS8vID0gMHg4MDAwMCwKLQkJCSBGRV9DQU5fSElFUkFSQ0hZX0FVVE8JCXwJLy8gPSAweDEwMDAwMCwKLQkJCSBGRV9DQU5fUkVDT1ZFUgkJCXwJLy8gPSAweDQwMDAwMDAwLAotCQkJIEZFX0NBTl9NVVRFX1RTCQkJCS8vID0gMHg4MDAwMDAwMAorCQkgLmNhcHMgPQkJCQkgIC8qIDB4MEMwMUIyRUFFICovCisJCQkgRkVfQ0FOX0ZFQ18xXzIJCQl8IC8qID0gMHgyLCAqLworCQkJIEZFX0NBTl9GRUNfMl8zCQkJfCAvKiA9IDB4NCwgKi8KKwkJCSBGRV9DQU5fRkVDXzNfNAkJCXwgLyogPSAweDgsICovCisJCQkgRkVfQ0FOX0ZFQ181XzYJCQl8IC8qID0gMHgyMCwgKi8KKwkJCSBGRV9DQU5fRkVDXzdfOAkJCXwgLyogPSAweDgwLCAqLworCQkJIEZFX0NBTl9GRUNfQVVUTwkJfCAvKiA9IDB4MjAwLCAqLworCQkJIEZFX0NBTl9RUFNLCQkJfCAvKiA9IDB4NDAwLCAqLworCQkJIEZFX0NBTl9RQU1fMTYJCQl8IC8qID0gMHg4MDAsICovCisJCQkgRkVfQ0FOX1FBTV82NAkJCXwgLyogPSAweDIwMDAsICovCisJCQkgRkVfQ0FOX1FBTV9BVVRPCQl8IC8qID0gMHgxMDAwMCwgKi8KKwkJCSBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTwl8IC8qID0gMHgyMDAwMCwgKi8KKwkJCSBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTwl8IC8qID0gMHg4MDAwMCwgKi8KKwkJCSBGRV9DQU5fSElFUkFSQ0hZX0FVVE8JCXwgLyogPSAweDEwMDAwMCwgKi8KKwkJCSBGRV9DQU5fUkVDT1ZFUgkJCXwgLyogPSAweDQwMDAwMDAwLCAqLworCQkJIEZFX0NBTl9NVVRFX1RTCQkJICAvKiA9IDB4ODAwMDAwMDAgKi8KIAkgfSwKIAogCS5yZWxlYXNlID0gZHJ4Mzk3eF9yZWxlYXNlLApAQCAtMTQ3MiwzMyArMTQ3NiwzNSBAQAogc3RydWN0IGR2Yl9mcm9udGVuZCAqZHJ4Mzk3eERfYXR0YWNoKGNvbnN0IHN0cnVjdCBkcngzOTd4RF9jb25maWcgKmNvbmZpZywKIAkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQogewotCXN0cnVjdCBkcngzOTd4RF9zdGF0ZSAqcyA9IE5VTEw7CisJc3RydWN0IGRyeDM5N3hEX3N0YXRlICpzdGF0ZTsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0JcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcngzOTd4RF9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChzID09IE5VTEwpCisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ4Mzk3eERfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQogCQlnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCi0Jcy0+aTJjID0gaTJjOwotCW1lbWNweSgmcy0+Y29uZmlnLCBjb25maWcsIHNpemVvZihzdHJ1Y3QgZHJ4Mzk3eERfY29uZmlnKSk7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnN0YXRlLT5jb25maWcsIGNvbmZpZywgc2l6ZW9mKHN0cnVjdCBkcngzOTd4RF9jb25maWcpKTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCWlmIChSRDE2KHMsIDB4MjQxMDAxOSkgPCAwKQorCWlmIChSRDE2KHN0YXRlLCAweDI0MTAwMTkpIDwgMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQltZW1jcHkoJnMtPmZyb250ZW5kLm9wcywgJmRyeDM5N3hfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKLQlzLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkcngzOTd4X29wcywKKwkJCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKLQlyZXR1cm4gJnMtPmZyb250ZW5kOwotICAgICAgZXJyb3I6Ci0Ja2ZyZWUocyk7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woZHJ4Mzk3eERfYXR0YWNoKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb25hcyBEUlgzOTd4RCBEVkItVCBGcm9udGVuZCIpOwogTU9EVUxFX0FVVEhPUigiSGVuayBWZXJnb25ldCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1FWFBPUlRfU1lNQk9MKGRyeDM5N3hEX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4Mzk3eEQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5oCmluZGV4IGRkYzdhMDcuLmJhMDVkMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcngzOTd4RC5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIERSWF9GX09GRlNFVAkzNjAwMDAwMAogCiAjZGVmaW5lIEkyQ19BRFJfQzAoeCkgXAotKAkodTMyKWNwdV90b19sZTMyKCBcCisoCWNwdV90b19sZTMyKCBcCiAJCSh1MzIpKCBcCiAJCQkoKCh1MzIpKHgpICYgKHUzMikweDAwMDAwMGZmVUwpICAgICAgKSB8IFwKIAkJCSgoKHUzMikoeCkgJiAodTMyKTB4MDAwMGZmMDBVTCkgPDwgMTYpIHwgXApAQCAtMzgsNyArMzgsNyBAQAogKQogCiAjZGVmaW5lIEkyQ19BRFJfRTAoeCkgXAotKAkodTMyKWNwdV90b19sZTMyKCBcCisoCWNwdV90b19sZTMyKCBcCiAJCSh1MzIpKCBcCiAJCQkoKCh1MzIpKHgpICYgKHUzMikweDAwMDAwMGZmVUwpICAgICAgKSB8IFwKIAkJCSgoKHUzMikoeCkgJiAodTMyKTB4MDAwMGZmMDBVTCkgPDwgMTYpIHwgXApAQCAtMTIyLDcgKzEyMiw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGRyeDM5N3hEX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHJ4Mzk3eERfY29uZmlnICpjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQogewotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gTlVMTDsKIH0KICNlbmRpZiAvKiBDT05GSUdfRFZCX0RSWDM5N1hEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiX2R1bW15X2ZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiX2R1bW15X2ZlLmMKaW5kZXggZmVkMDlkZi4uZGI4YTkzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yl9kdW1teV9mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYwpAQCAtNzUsOSArNzUsMTAgQEAKIAogc3RhdGljIGludCBkdmJfZHVtbXlfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7Ci0JaWYgKGZlLT5vcHMtPnR1bmVyX29wcy0+c2V0X3BhcmFtcykgewotCQlmZS0+b3BzLT50dW5lcl9vcHMtPnNldF9wYXJhbXMoZmUsIHApOwotCQlpZiAoZmUtPm9wcy0+aTJjX2dhdGVfY3RybCkgZmUtPm9wcy0+aTJjX2dhdGVfY3RybChmZSwgMCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTMxLDcgKzEzMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkdmJfZHVtbXlfZmVfcXBza19vcHM7CiAKLXN0cnVjdCBkdmJfZnJvbnRlbmQqIGR2Yl9kdW1teV9mZV9xcHNrX2F0dGFjaCgpCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfZHVtbXlfZmVfcXBza19hdHRhY2godm9pZCkKIHsKIAlzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKQEAgLTE1MSw3ICsxNTIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHZiX2R1bW15X2ZlX3FhbV9vcHM7CiAKLXN0cnVjdCBkdmJfZnJvbnRlbmQqIGR2Yl9kdW1teV9mZV9xYW1fYXR0YWNoKCkKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmR2Yl9kdW1teV9mZV9xYW1fYXR0YWNoKHZvaWQpCiB7CiAJc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSogc3RhdGUgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZWRzMTU0Ny5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2VkczE1NDcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc5YjdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2VkczE1NDcuaApAQCAtMCwwICsxLDEzMyBAQAorLyogZWRzMTU0Ny5oIEVhcmRhIEVEUy0xNTQ3IHR1bmVyIHN1cHBvcnQKKyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IElnb3IgTS4gTGlwbGlhbmluIChsaXBsaWFuaW5AbWUuYnkpCisqCisqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyoKKyogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisqLworCisjaWZuZGVmIEVEUzE1NDcKKyNkZWZpbmUgRURTMTU0NworCitzdGF0aWMgdTggc3R2MDI4OF9lYXJkYV9pbml0dGFiW10gPSB7CisJMHgwMSwgMHg1NywKKwkweDAyLCAweDIwLAorCTB4MDMsIDB4OGUsCisJMHgwNCwgMHg4ZSwKKwkweDA1LCAweDEyLAorCTB4MDYsIDB4MDAsCisJMHgwNywgMHgwMCwKKwkweDA5LCAweDAwLAorCTB4MGEsIDB4MDQsCisJMHgwYiwgMHgwMCwKKwkweDBjLCAweDAwLAorCTB4MGQsIDB4MDAsCisJMHgwZSwgMHhkNCwKKwkweDBmLCAweDMwLAorCTB4MTEsIDB4NDQsCisJMHgxMiwgMHgwMywKKwkweDEzLCAweDQ4LAorCTB4MTQsIDB4ODQsCisJMHgxNSwgMHg0NSwKKwkweDE2LCAweGI3LAorCTB4MTcsIDB4OWMsCisJMHgxOCwgMHgwMCwKKwkweDE5LCAweGE2LAorCTB4MWEsIDB4ODgsCisJMHgxYiwgMHg4ZiwKKwkweDFjLCAweGYwLAorCTB4MjAsIDB4MGIsCisJMHgyMSwgMHg1NCwKKwkweDIyLCAweDAwLAorCTB4MjMsIDB4MDAsCisJMHgyYiwgMHhmZiwKKwkweDJjLCAweGY3LAorCTB4MzAsIDB4MDAsCisJMHgzMSwgMHgxZSwKKwkweDMyLCAweDE0LAorCTB4MzMsIDB4MGYsCisJMHgzNCwgMHgwOSwKKwkweDM1LCAweDBjLAorCTB4MzYsIDB4MDUsCisJMHgzNywgMHgyZiwKKwkweDM4LCAweDE2LAorCTB4MzksIDB4YmQsCisJMHgzYSwgMHgwMCwKKwkweDNiLCAweDEzLAorCTB4M2MsIDB4MTEsCisJMHgzZCwgMHgzMCwKKwkweDQwLCAweDYzLAorCTB4NDEsIDB4MDQsCisJMHg0MiwgMHg2MCwKKwkweDQzLCAweDAwLAorCTB4NDQsIDB4MDAsCisJMHg0NSwgMHgwMCwKKwkweDQ2LCAweDAwLAorCTB4NDcsIDB4MDAsCisJMHg0YSwgMHgwMCwKKwkweDUwLCAweDEwLAorCTB4NTEsIDB4MzYsCisJMHg1MiwgMHgwOSwKKwkweDUzLCAweDk0LAorCTB4NTQsIDB4NjIsCisJMHg1NSwgMHgyOSwKKwkweDU2LCAweDY0LAorCTB4NTcsIDB4MmIsCisJMHg1OCwgMHg1NCwKKwkweDU5LCAweDg2LAorCTB4NWEsIDB4MDAsCisJMHg1YiwgMHg5YiwKKwkweDVjLCAweDA4LAorCTB4NWQsIDB4N2YsCisJMHg1ZSwgMHgwMCwKKwkweDVmLCAweGZmLAorCTB4NzAsIDB4MDAsCisJMHg3MSwgMHgwMCwKKwkweDcyLCAweDAwLAorCTB4NzQsIDB4MDAsCisJMHg3NSwgMHgwMCwKKwkweDc2LCAweDAwLAorCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgzZiwKKwkweDgzLCAweDNmLAorCTB4ODQsIDB4MDAsCisJMHg4NSwgMHgwMCwKKwkweDg4LCAweDAwLAorCTB4ODksIDB4MDAsCisJMHg4YSwgMHgwMCwKKwkweDhiLCAweDAwLAorCTB4OGMsIDB4MDAsCisJMHg5MCwgMHgwMCwKKwkweDkxLCAweDAwLAorCTB4OTIsIDB4MDAsCisJMHg5MywgMHgwMCwKKwkweDk0LCAweDFjLAorCTB4OTcsIDB4MDAsCisJMHhhMCwgMHg0OCwKKwkweGExLCAweDAwLAorCTB4YjAsIDB4YjgsCisJMHhiMSwgMHgzYSwKKwkweGIyLCAweDEwLAorCTB4YjMsIDB4ODIsCisJMHhiNCwgMHg4MCwKKwkweGI1LCAweDgyLAorCTB4YjYsIDB4ODIsCisJMHhiNywgMHg4MiwKKwkweGI4LCAweDIwLAorCTB4YjksIDB4MDAsCisJMHhmMCwgMHgwMCwKKwkweGYxLCAweDAwLAorCTB4ZjIsIDB4YzAsCisJMHhmZiwweGZmLAorfTsKKworc3RhdGljIHN0cnVjdCBzdHYwMjg4X2NvbmZpZyBlYXJkYV9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAorCS5taW5fZGVsYXlfbXMgPSAxMDAsCisJLmluaXR0YWIgPSBzdHYwMjg4X2VhcmRhX2luaXR0YWIsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ3M4Z2w1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdzOGdsNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTg1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdzOGdsNS5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICAgIExlZ2VuZCBTaWxpY29uIExHUy04R0w1IERNQi1USCBPRkRNIGRlbW9kdWxhdG9yIGRyaXZlcgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IFNpcml1cyBJbnRlcm5hdGlvbmFsIChIb25nIEtvbmcpIExpbWl0ZWQKKwlUaW1vdGh5IExlZSA8dGltb3RoeS5sZWVAc2lyaXVzaGsuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImxnczhnbDUuaCIKKworCisjZGVmaW5lIFJFR19SRVNFVAkJMHgwMgorI2RlZmluZSBSRUdfUkVTRVRfT0ZGCQkJMHgwMQorI2RlZmluZSBSRUdfMDMJCQkweDAzCisjZGVmaW5lIFJFR18wNAkJCTB4MDQKKyNkZWZpbmUgUkVHXzA3CQkJMHgwNworI2RlZmluZSBSRUdfMDkJCQkweDA5CisjZGVmaW5lIFJFR18wQQkJCTB4MGEKKyNkZWZpbmUgUkVHXzBCCQkJMHgwYgorI2RlZmluZSBSRUdfMEMJCQkweDBjCisjZGVmaW5lIFJFR18zNwkJCTB4MzcKKyNkZWZpbmUgUkVHX1NUUkVOR1RICQkweDRiCisjZGVmaW5lIFJFR19TVFJFTkdUSF9NQVNLCQkweDdmCisjZGVmaW5lIFJFR19TVFJFTkdUSF9DQVJSSUVSCQkweDgwCisjZGVmaW5lIFJFR19JTlZFUlNJT04JCTB4N2MKKyNkZWZpbmUgUkVHX0lOVkVSU0lPTl9PTgkJMHg4MAorI2RlZmluZSBSRUdfN0QJCQkweDdkCisjZGVmaW5lIFJFR183RQkJCTB4N2UKKyNkZWZpbmUgUkVHX0EyCQkJMHhhMgorI2RlZmluZSBSRUdfU1RBVFVTCQkweGE0CisjZGVmaW5lIFJFR19TVEFUVVNfU1lOQwkJMHgwNAorI2RlZmluZSBSRUdfU1RBVFVTX0xPQ0sJCTB4MDEKKworCitzdHJ1Y3QgbGdzOGdsNV9zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJY29uc3Qgc3RydWN0IGxnczhnbDVfY29uZmlnICpjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKK307CisKKworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZykgXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImxnczhnbDU6ICIgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisKKy8qIFdyaXRlcyBpbnRvIGRlbW9kJ3MgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQKK2xnczhnbDVfd3JpdGVfcmVnKHN0cnVjdCBsZ3M4Z2w1X3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCBkYXRhKQoreworCWludCByZXQ7CisJdTggYnVmW10gPSB7cmVnLCBkYXRhfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyICA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCS5mbGFncyA9IDAsCisJCS5idWYgICA9IGJ1ZiwKKwkJLmxlbiAgID0gMgorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSk7CisJaWYgKHJldCAhPSAxKQorCQlkcHJpbnRrKCIlczogZXJyb3IgKHJlZz0weCUwMngsIHZhbD0weCUwMngsIHJldD0laSlcbiIsCisJCQlfX2Z1bmNfXywgcmVnLCBkYXRhLCByZXQpOworCXJldHVybiAocmV0ICE9IDEpID8gLTEgOiAwOworfQorCisKKy8qIFJlYWRzIGZyb20gZGVtb2QncyByZWdpc3RlciAqLworc3RhdGljIGludAorbGdzOGdsNV9yZWFkX3JlZyhzdHJ1Y3QgbGdzOGdsNV9zdGF0ZSAqc3RhdGUsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCXU4IGIwW10gPSB7cmVnfTsKKwl1OCBiMVtdID0gezB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeworCQkJLmFkZHIgID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncyA9IDAsCisJCQkuYnVmICAgPSBiMCwKKwkJCS5sZW4gICA9IDEKKwkJfSwKKwkJeworCQkJLmFkZHIgID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmJ1ZiAgID0gYjEsCisJCQkubGVuICAgPSAxCisJCX0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBiMVswXTsKK30KKworCitzdGF0aWMgaW50CitsZ3M4Z2w1X3VwZGF0ZV9yZWcoc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJbGdzOGdsNV9yZWFkX3JlZyhzdGF0ZSwgcmVnKTsKKwlsZ3M4Z2w1X3dyaXRlX3JlZyhzdGF0ZSwgcmVnLCBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBXcml0ZXMgaW50byBhbHRlcm5hdGUgZGV2aWNlJ3MgcmVnaXN0ZXIgKi8KKy8qIFRPRE86ICBGaW5kIG91dCB3aGF0IHRoYXQgZGV2aWNlIGlzIGZvciEgKi8KK3N0YXRpYyBpbnQKK2xnczhnbDVfdXBkYXRlX2FsdF9yZWcoc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJaW50IHJldDsKKwl1OCBiMFtdID0ge3JlZ307CisJdTggYjFbXSA9IHswfTsKKwl1OCBiMltdID0ge3JlZywgZGF0YX07CisJc3RydWN0IGkyY19tc2cgbXNnWzNdID0geworCQl7CisJCQkuYWRkciAgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzICsgMiwKKwkJCS5mbGFncyA9IDAsCisJCQkuYnVmICAgPSBiMCwKKwkJCS5sZW4gICA9IDEKKwkJfSwKKwkJeworCQkJLmFkZHIgID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyArIDIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5idWYgICA9IGIxLAorCQkJLmxlbiAgID0gMQorCQl9LAorCQl7CisJCQkuYWRkciAgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzICsgMiwKKwkJCS5mbGFncyA9IDAsCisJCQkuYnVmICAgPSBiMiwKKwkJCS5sZW4gICA9IDIKKwkJfSwKKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMyk7CisJcmV0dXJuIChyZXQgIT0gMykgPyAtMSA6IDA7Cit9CisKKworc3RhdGljIHZvaWQKK2xnczhnbDVfc29mdF9yZXNldChzdHJ1Y3QgbGdzOGdsNV9zdGF0ZSAqc3RhdGUpCit7CisJdTggdmFsOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCXZhbCA9IGxnczhnbDVfcmVhZF9yZWcoc3RhdGUsIFJFR19SRVNFVCk7CisJbGdzOGdsNV93cml0ZV9yZWcoc3RhdGUsIFJFR19SRVNFVCwgdmFsICYgflJFR19SRVNFVF9PRkYpOworCWxnczhnbDVfd3JpdGVfcmVnKHN0YXRlLCBSRUdfUkVTRVQsIHZhbCB8IFJFR19SRVNFVF9PRkYpOworCW1zbGVlcCg1KTsKK30KKworCisvKiBTdGFydHMgZGVtb2R1bGF0aW9uICovCitzdGF0aWMgdm9pZAorbGdzOGdsNV9zdGFydF9kZW1vZChzdHJ1Y3QgbGdzOGdsNV9zdGF0ZSAqc3RhdGUpCit7CisJdTggIHZhbDsKKwlpbnQgbjsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlsZ3M4Z2w1X3VwZGF0ZV9hbHRfcmVnKHN0YXRlLCAweGMyLCAweDI4KTsKKwlsZ3M4Z2w1X3NvZnRfcmVzZXQoc3RhdGUpOworCWxnczhnbDVfdXBkYXRlX3JlZyhzdGF0ZSwgUkVHXzA3LCAweDEwKTsKKwlsZ3M4Z2w1X3VwZGF0ZV9yZWcoc3RhdGUsIFJFR18wNywgMHgxMCk7CisJbGdzOGdsNV93cml0ZV9yZWcoc3RhdGUsIFJFR18wOSwgMHgwZSk7CisJbGdzOGdsNV93cml0ZV9yZWcoc3RhdGUsIFJFR18wQSwgMHhlNSk7CisJbGdzOGdsNV93cml0ZV9yZWcoc3RhdGUsIFJFR18wQiwgMHgzNSk7CisJbGdzOGdsNV93cml0ZV9yZWcoc3RhdGUsIFJFR18wQywgMHgzMCk7CisKKwlsZ3M4Z2w1X3VwZGF0ZV9yZWcoc3RhdGUsIFJFR18wMywgMHgwMCk7CisJbGdzOGdsNV91cGRhdGVfcmVnKHN0YXRlLCBSRUdfN0UsIDB4MDEpOworCWxnczhnbDVfdXBkYXRlX2FsdF9yZWcoc3RhdGUsIDB4YzUsIDB4MDApOworCWxnczhnbDVfdXBkYXRlX3JlZyhzdGF0ZSwgUkVHXzA0LCAweDAyKTsKKwlsZ3M4Z2w1X3VwZGF0ZV9yZWcoc3RhdGUsIFJFR18zNywgMHgwMSk7CisJbGdzOGdsNV9zb2Z0X3Jlc2V0KHN0YXRlKTsKKworCS8qIFdhaXQgZm9yIGNhcnJpZXIgKi8KKwlmb3IgKG4gPSAwOyAgbiA8IDEwOyAgbisrKSB7CisJCXZhbCA9IGxnczhnbDVfcmVhZF9yZWcoc3RhdGUsIFJFR19TVFJFTkdUSCk7CisJCWRwcmludGsoIldhaXQgZm9yIGNhcnJpZXJbJWRdIDB4JTAyWFxuIiwgbiwgdmFsKTsKKwkJaWYgKHZhbCAmIFJFR19TVFJFTkdUSF9DQVJSSUVSKQorCQkJYnJlYWs7CisJCW1zbGVlcCg0KTsKKwl9CisJaWYgKCEodmFsICYgUkVHX1NUUkVOR1RIX0NBUlJJRVIpKQorCQlyZXR1cm47CisKKwkvKiBXYWl0IGZvciBsb2NrICovCisJZm9yIChuID0gMDsgIG4gPCAyMDsgIG4rKykgeworCQl2YWwgPSBsZ3M4Z2w1X3JlYWRfcmVnKHN0YXRlLCBSRUdfU1RBVFVTKTsKKwkJZHByaW50aygiV2FpdCBmb3IgbG9ja1slZF0gMHglMDJYXG4iLCBuLCB2YWwpOworCQlpZiAodmFsICYgUkVHX1NUQVRVU19MT0NLKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMik7CisJfQorCWlmICghKHZhbCAmIFJFR19TVEFUVVNfTE9DSykpCisJCXJldHVybjsKKworCWxnczhnbDVfd3JpdGVfcmVnKHN0YXRlLCBSRUdfN0QsIGxnczhnbDVfcmVhZF9yZWcoc3RhdGUsIFJFR19BMikpOworCWxnczhnbDVfc29mdF9yZXNldChzdGF0ZSk7Cit9CisKKworc3RhdGljIGludAorbGdzOGdsNV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBsZ3M4Z2w1X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWxnczhnbDVfdXBkYXRlX2FsdF9yZWcoc3RhdGUsIDB4YzIsIDB4MjgpOworCWxnczhnbDVfc29mdF9yZXNldChzdGF0ZSk7CisJbGdzOGdsNV91cGRhdGVfcmVnKHN0YXRlLCBSRUdfMDcsIDB4MTApOworCWxnczhnbDVfdXBkYXRlX3JlZyhzdGF0ZSwgUkVHXzA3LCAweDEwKTsKKwlsZ3M4Z2w1X3dyaXRlX3JlZyhzdGF0ZSwgUkVHXzA5LCAweDBlKTsKKwlsZ3M4Z2w1X3dyaXRlX3JlZyhzdGF0ZSwgUkVHXzBBLCAweGU1KTsKKwlsZ3M4Z2w1X3dyaXRlX3JlZyhzdGF0ZSwgUkVHXzBCLCAweDM1KTsKKwlsZ3M4Z2w1X3dyaXRlX3JlZyhzdGF0ZSwgUkVHXzBDLCAweDMwKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggbGV2ZWwgPSBsZ3M4Z2w1X3JlYWRfcmVnKHN0YXRlLCBSRUdfU1RSRU5HVEgpOworCXU4IGZsYWdzID0gbGdzOGdsNV9yZWFkX3JlZyhzdGF0ZSwgUkVHX1NUQVRVUyk7CisKKwkqc3RhdHVzID0gMDsKKworCWlmICgobGV2ZWwgJiBSRUdfU1RSRU5HVEhfTUFTSykgPiAwKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJaWYgKGxldmVsICYgUkVHX1NUUkVOR1RIX0NBUlJJRVIpCisJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJaWYgKGZsYWdzICYgUkVHX1NUQVRVU19TWU5DKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCWlmIChmbGFncyAmIFJFR19TVEFUVVNfTE9DSykKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCSpiZXIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorbGdzOGdsNV9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzaWduYWxfc3RyZW5ndGgpCit7CisJc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggbGV2ZWwgPSBsZ3M4Z2w1X3JlYWRfcmVnKHN0YXRlLCBSRUdfU1RSRU5HVEgpOworCSpzaWduYWxfc3RyZW5ndGggPSAobGV2ZWwgJiBSRUdfU1RSRU5HVEhfTUFTSykgPDwgODsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCXN0cnVjdCBsZ3M4Z2w1X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGxldmVsID0gbGdzOGdsNV9yZWFkX3JlZyhzdGF0ZSwgUkVHX1NUUkVOR1RIKTsKKwkqc25yID0gKGxldmVsICYgUkVHX1NUUkVOR1RIX01BU0spIDw8IDg7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitsZ3M4Z2w1X3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCit7CisJKnVjYmxvY2tzID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHAtPnUub2ZkbS5iYW5kd2lkdGggIT0gQkFORFdJRFRIXzhfTUhaKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKKwkvKiBsZ3M4Z2w1X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7ICovCisKKwlsZ3M4Z2w1X3N0YXJ0X2RlbW9kKHN0YXRlKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggaW52ID0gbGdzOGdsNV9yZWFkX3JlZyhzdGF0ZSwgUkVHX0lOVkVSU0lPTik7CisJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKm8gPSAmcC0+dS5vZmRtOworCisJcC0+aW52ZXJzaW9uID0gKGludiAmIFJFR19JTlZFUlNJT05fT04pID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKKworCW8tPmNvZGVfcmF0ZV9IUCA9IEZFQ18xXzI7CisJby0+Y29kZV9yYXRlX0xQID0gRkVDXzdfODsKKwlvLT5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMXzFfMzI7CisJby0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKKwlvLT5jb25zdGVsbGF0aW9uID0gUUFNXzY0OworCW8tPmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV9OT05FOworCW8tPmJhbmR3aWR0aCA9IEJBTkRXSURUSF84X01IWjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2xnczhnbDVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqZmVzZXR0aW5ncykKK3sKKwlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSAyNDA7CisJZmVzZXR0aW5ncy0+c3RlcF9zaXplICAgID0gMDsKKwlmZXNldHRpbmdzLT5tYXhfZHJpZnQgICAgPSAwOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCitsZ3M4Z2w1X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGxnczhnbDVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBsZ3M4Z2w1X29wczsKKworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kKgorbGdzOGdsNV9hdHRhY2goY29uc3Qgc3RydWN0IGxnczhnbDVfY29uZmlnICpjb25maWcsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXN0cnVjdCBsZ3M4Z2w1X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZ3M4Z2w1X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgICAgPSBpMmM7CisKKwkvKiBDaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KKwlpZiAobGdzOGdsNV9yZWFkX3JlZyhzdGF0ZSwgUkVHX1JFU0VUKSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmbGdzOGdsNV9vcHMsCisJCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobGdzOGdsNV9hdHRhY2gpOworCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBsZ3M4Z2w1X29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUJCQk9ICJMZWdlbmQgU2lsaWNvbiBMR1MtOEdMNSBETUItVEgiLAorCQkudHlwZQkJCT0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gNDc0MDAwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSA4NTgwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxMDAwMCwKKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UJPSAwLAorCQkuY2FwcyA9IEZFX0NBTl9GRUNfQVVUTyB8CisJCQlGRV9DQU5fUVBTSyB8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzMyIHwKKwkJCUZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0JBTkRXSURUSF9BVVRPIHwKKwkJCUZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwKKwkJCUZFX0NBTl9ISUVSQVJDSFlfQVVUTyB8CisJCQlGRV9DQU5fUkVDT1ZFUgorCX0sCisKKwkucmVsZWFzZSA9IGxnczhnbDVfcmVsZWFzZSwKKworCS5pbml0ID0gbGdzOGdsNV9pbml0LAorCisJLnNldF9mcm9udGVuZCA9IGxnczhnbDVfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBsZ3M4Z2w1X2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBsZ3M4Z2w1X2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gbGdzOGdsNV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSBsZ3M4Z2w1X3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGxnczhnbDVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gbGdzOGdsNV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IGxnczhnbDVfcmVhZF91Y2Jsb2NrcywKK307CisKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxlZ2VuZCBTaWxpY29uIExHUy04R0w1IERNQi1USCBEZW1vZHVsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlRpbW90aHkgTGVlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdzOGdsNS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnczhnbDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQxNzY3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ3M4Z2w1LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAgICBMZWdlbmQgU2lsaWNvbiBMR1MtOEdMNSBETUItVEggT0ZETSBkZW1vZHVsYXRvciBkcml2ZXIKKworICAgIENvcHlyaWdodCAoQykgMjAwOCBTaXJpdXMgSW50ZXJuYXRpb25hbCAoSG9uZyBLb25nKSBMaW1pdGVkCisJVGltb3RoeSBMZWUgPHRpbW90aHkubGVlQHNpcml1c2hrLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIExHUzhHTDVfSAorI2RlZmluZSBMR1M4R0w1X0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgbGdzOGdsNV9jb25maWcgeworCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTEdTOEdMNSkgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfTEdTOEdMNV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsZ3M4Z2w1X2F0dGFjaCgKKwljb25zdCBzdHJ1Y3QgbGdzOGdsNV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqbGdzOGdsNV9hdHRhY2goCisJY29uc3Qgc3RydWN0IGxnczhnbDVfY29uZmlnICpjb25maWcsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9MR1M4R0w1ICovCisKKyNlbmRpZiAvKiBMR1M4R0w1X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jCmluZGV4IGFmMjk4MzUuLmE4NDI5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguYwpAQCAtODAsNyArODAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggaTJjX3JlYWRieXRlcyAoc3RydWN0IG54dDIwMHhfc3RhdGUqIHN0YXRlLCB1OCBhZGRyLCB1OCogYnVmLCB1OCBsZW4pCitzdGF0aWMgaW50IGkyY19yZWFkYnl0ZXMoc3RydWN0IG54dDIwMHhfc3RhdGUgKnN0YXRlLCB1OCBhZGRyLCB1OCAqYnVmLCB1OCBsZW4pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gYWRkciwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBidWYsIC5sZW4gPSBsZW4gfTsKQEAgLTExMSw3ICsxMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggbnh0MjAweF9yZWFkYnl0ZXMgKHN0cnVjdCBueHQyMDB4X3N0YXRlKiBzdGF0ZSwgdTggcmVnLCB1OCogYnVmLCB1OCBsZW4pCitzdGF0aWMgaW50IG54dDIwMHhfcmVhZGJ5dGVzKHN0cnVjdCBueHQyMDB4X3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCAqYnVmLCB1OCBsZW4pCiB7CiAJdTggcmVnMiBbXSA9IHsgcmVnIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCmluZGV4IDZhZmUxMmEuLjE2Y2YyZmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU4IGkyY19yZWFkYnl0ZXMgKHN0cnVjdCBvcjUxMjExX3N0YXRlKiBzdGF0ZSwgdTggcmVnLCB1OCogYnVmLCBpbnQgbGVuKQorc3RhdGljIGludCBpMmNfcmVhZGJ5dGVzKHN0cnVjdCBvcjUxMjExX3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCAqYnVmLCBpbnQgbGVuKQogewogCWludCBlcnI7CiAJc3RydWN0IGkyY19tc2cgbXNnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKaW5kZXggNzQ3ZDNmYS4uMmU5ZmQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCkBAIC01OSw3ICs1OSw3IEBACiAJICogaXQgZG9lcyBub3Qgc3VwcG9ydCByZXBlYXRlZC1zdGFydCwgd29ya2Fyb3VuZDogd3JpdGUgYWRkci0xCiAJICogYW5kIHRoZW4gcmVhZAogCSAqLwotCXU4IHNoYWRvd1syNTVdOworCXU4IHNoYWRvd1syNTZdOwogfTsKIAogc3RhdGljIHUzMiBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKTsKQEAgLTk0LDggKzk0LDExIEBACiAJCWlmIChyZXQgIT0gMykKIAkJCXJldHVybiByZXQ7CiAJfSBlbHNlIHsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dbMV0sIDIpOwotCQlpZiAocmV0ICE9IDIpCisJCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzFdLCAxKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dbMl0sIDEpOworCQlpZiAocmV0ICE9IDEpCiAJCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtODIzLDcgKzgyNiw3IEBACiAJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiBkaXNhYmxlIHBvd2VyIGRvd24gYW5kIGRvIHJlc2V0ICovCi0Jc3RhdGUtPkNPTl8xX3ZhbCA9IDB4MTA7CisJc3RhdGUtPkNPTl8xX3ZhbCA9IHN0YXRlLT5jb25maWctPnNlcmlhbF9tcGVnIDw8IDQ7CiAJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgc3RhdGUtPkNPTl8xX3ZhbCk7CiAJbXNsZWVwKDEwKTsKIAlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCmluZGV4IDRjOTEzZjEuLmZmMzA4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMzIsMTAgKzMyLDEyIEBACiAJdTggZGVtb2RfYWRkcmVzczsKIAogCS8qIGRvZXMgdGhlIGludmVyc2lvbiByZXF1aXJlIGludmVyc2lvbj8gKi8KLQl1OCBpbnZlcnQgOiAxOworCXU4IGludmVydDoxOwogCi0JdTggcmVwZWF0ZWRfc3RhcnRfd29ya2Fyb3VuZCA6IDE7Ci0JdTggY2RjbGtfcG9sYXJpdHkgOiAxOyAvKiAxID09IGZhbGxpbmcgZWRnZSwgMCA9PSByYWlzaW5nIGVkZ2UgKi8KKwl1OCByZXBlYXRlZF9zdGFydF93b3JrYXJvdW5kOjE7CisJdTggY2RjbGtfcG9sYXJpdHk6MTsgLyogMSA9PSBmYWxsaW5nIGVkZ2UsIDAgPT0gcmFpc2luZyBlZGdlICovCisKKwl1OCBzZXJpYWxfbXBlZzoxOwogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TNUgxNDIwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1M1SDE0MjBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc2kyMXh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc2kyMXh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkYmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zaTIxeHguYwpAQCAtMCwwICsxLDk3NCBAQAorLyogRFZCIGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZSBEVkItUyBzaTIxMDkvMjExMCBkZW1vZHVsYXRvcgorKgorKiBDb3B5cmlnaHQgKEMpIDIwMDggSWdvciBNLiBMaXBsaWFuaW4gKGxpcGxpYW5pbkBtZS5ieSkKKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAic2kyMXh4LmgiCisKKyNkZWZpbmUJUkVWSVNJT05fUkVHCQkJMHgwMAorI2RlZmluZQlTWVNURU1fTU9ERV9SRUcJCQkweDAxCisjZGVmaW5lCVRTX0NUUkxfUkVHXzEJCQkweDAyCisjZGVmaW5lCVRTX0NUUkxfUkVHXzIJCQkweDAzCisjZGVmaW5lCVBJTl9DVFJMX1JFR18xCQkJMHgwNAorI2RlZmluZQlQSU5fQ1RSTF9SRUdfMgkJCTB4MDUKKyNkZWZpbmUJTE9DS19TVEFUVVNfUkVHXzEJCTB4MGYKKyNkZWZpbmUJTE9DS19TVEFUVVNfUkVHXzIJCTB4MTAKKyNkZWZpbmUJQUNRX1NUQVRVU19SRUcJCQkweDExCisjZGVmaW5lCUFDUV9DVFJMX1JFR18xCQkJMHgxMworI2RlZmluZQlBQ1FfQ1RSTF9SRUdfMgkJCTB4MTQKKyNkZWZpbmUJUExMX0RJVklTT1JfUkVHCQkJMHgxNQorI2RlZmluZQlDT0FSU0VfVFVORV9SRUcJCQkweDE2CisjZGVmaW5lCUZJTkVfVFVORV9SRUdfTAkJCTB4MTcKKyNkZWZpbmUJRklORV9UVU5FX1JFR19ICQkJMHgxOAorCisjZGVmaW5lCUFOQUxPR19BR0NfUE9XRVJfTEVWRUxfUkVHCTB4MjgKKyNkZWZpbmUJQ0ZPX0VTVElNQVRPUl9DVFJMX1JFR18xCTB4MjkKKyNkZWZpbmUJQ0ZPX0VTVElNQVRPUl9DVFJMX1JFR18yCTB4MmEKKyNkZWZpbmUJQ0ZPX0VTVElNQVRPUl9DVFJMX1JFR18zCTB4MmIKKworI2RlZmluZQlTWU1fUkFURV9FU1RJTUFURV9SRUdfTAkJMHgzMQorI2RlZmluZQlTWU1fUkFURV9FU1RJTUFURV9SRUdfTQkJMHgzMgorI2RlZmluZQlTWU1fUkFURV9FU1RJTUFURV9SRUdfSAkJMHgzMworCisjZGVmaW5lCUNGT19FU1RJTUFUT1JfT0ZGU0VUX1JFR19MCTB4MzYKKyNkZWZpbmUJQ0ZPX0VTVElNQVRPUl9PRkZTRVRfUkVHX0gJMHgzNworI2RlZmluZQlDRk9fRVJST1JfUkVHX0wJCQkweDM4CisjZGVmaW5lCUNGT19FUlJPUl9SRUdfSAkJCTB4MzkKKyNkZWZpbmUJU1lNX1JBVEVfRVNUSU1BVE9SX0NUUkxfUkVHCTB4M2EKKworI2RlZmluZQlTWU1fUkFURV9SRUdfTAkJCTB4M2YKKyNkZWZpbmUJU1lNX1JBVEVfUkVHX00JCQkweDQwCisjZGVmaW5lCVNZTV9SQVRFX1JFR19ICQkJMHg0MQorI2RlZmluZQlTWU1fUkFURV9FU1RJTUFUT1JfTUFYSU1VTV9SRUcJMHg0MgorI2RlZmluZQlTWU1fUkFURV9FU1RJTUFUT1JfTUlOSU1VTV9SRUcJMHg0MworCisjZGVmaW5lCUNfTl9FU1RJTUFUT1JfQ1RSTF9SRUcJCTB4N2MKKyNkZWZpbmUJQ19OX0VTVElNQVRPUl9USFJTSExEX1JFRwkweDdkCisjZGVmaW5lCUNfTl9FU1RJTUFUT1JfTEVWRUxfUkVHX0wJMHg3ZQorI2RlZmluZQlDX05fRVNUSU1BVE9SX0xFVkVMX1JFR19ICTB4N2YKKworI2RlZmluZQlCTElORF9TQ0FOX0NUUkxfUkVHCQkweDgwCisKKyNkZWZpbmUJTFNBX0NUUkxfUkVHXzEJCQkweDhECisjZGVmaW5lCVNQQ1RSTV9USUxUX0NPUlJfVEhSU0hMRF9SRUcJMHg4ZgorI2RlZmluZQlPTkVfREJfQk5EV0RUSF9USFJTSExEX1JFRwkweDkwCisjZGVmaW5lCVRXT19EQl9CTkRXRFRIX1RIUlNITERfUkVHCTB4OTEKKyNkZWZpbmUJVEhSRUVfREJfQk5EV0RUSF9USFJTSExEX1JFRwkweDkyCisjZGVmaW5lCUlOQkFORF9QT1dFUl9USFJTSExEX1JFRwkweDkzCisjZGVmaW5lCVJFRl9OT0lTRV9MVkxfTVJHTl9USFJTSExEX1JFRwkweDk0CisKKyNkZWZpbmUJVklUX1NSQ0hfQ1RSTF9SRUdfMQkJMHhhMAorI2RlZmluZQlWSVRfU1JDSF9DVFJMX1JFR18yCQkweGExCisjZGVmaW5lCVZJVF9TUkNIX0NUUkxfUkVHXzMJCTB4YTIKKyNkZWZpbmUJVklUX1NSQ0hfU1RBVFVTX1JFRwkJMHhhMworI2RlZmluZQlWSVRFUkJJX0JFUl9DT1VOVF9SRUdfTAkJMHhhYgorI2RlZmluZQlSRUVEX1NPTE9NT05fQ1RSTF9SRUcJCTB4YjAKKyNkZWZpbmUJUkVFRF9TT0xPTU9OX0VSUk9SX0NPVU5UX1JFR19MCTB4YjEKKyNkZWZpbmUJUFJCU19DVFJMX1JFRwkJCTB4YjUKKworI2RlZmluZQlMTkJfQ1RSTF9SRUdfMQkJCTB4YzAKKyNkZWZpbmUJTE5CX0NUUkxfUkVHXzIJCQkweGMxCisjZGVmaW5lCUxOQl9DVFJMX1JFR18zCQkJMHhjMgorI2RlZmluZQlMTkJfQ1RSTF9SRUdfNAkJCTB4YzMKKyNkZWZpbmUJTE5CX0NUUkxfU1RBVFVTX1JFRwkJMHhjNAorI2RlZmluZQlMTkJfRklGT19SRUdTXzAJCQkweGM1CisjZGVmaW5lCUxOQl9GSUZPX1JFR1NfMQkJCTB4YzYKKyNkZWZpbmUJTE5CX0ZJRk9fUkVHU18yCQkJMHhjNworI2RlZmluZQlMTkJfRklGT19SRUdTXzMJCQkweGM4CisjZGVmaW5lCUxOQl9GSUZPX1JFR1NfNAkJCTB4YzkKKyNkZWZpbmUJTE5CX0ZJRk9fUkVHU181CQkJMHhjYQorI2RlZmluZQlMTkJfU1VQUExZX0NUUkxfUkVHXzEJCTB4Y2IKKyNkZWZpbmUJTE5CX1NVUFBMWV9DVFJMX1JFR18yCQkweGNjCisjZGVmaW5lCUxOQl9TVVBQTFlfQ1RSTF9SRUdfMwkJMHhjZAorI2RlZmluZQlMTkJfU1VQUExZX0NUUkxfUkVHXzQJCTB4Y2UKKyNkZWZpbmUJTE5CX1NVUFBMWV9TVEFUVVNfUkVHCQkweGNmCisKKyNkZWZpbmUgRkFMU0UJMAorI2RlZmluZSBUUlVFCTEKKyNkZWZpbmUgRkFJTAktMQorI2RlZmluZSBQQVNTCTAKKworI2RlZmluZSBBTExPV0FCTEVfRlNfQ09VTlQJMTAKKyNkZWZpbmUgU1RBVFVTX0JFUgkJMAorI2RlZmluZSBTVEFUVVNfVUNCTE9DS1MJCTEKKworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChkZWJ1ZykgXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgInNpMjF4eDogIiBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK2VudW0geworCUFDVElWRV9ISUdILAorCUFDVElWRV9MT1cKK307CitlbnVtIHsKKwlCWVRFX1dJREUsCisJQklUX1dJREUKK307CitlbnVtIHsKKwlDTEtfR0FQUEVEX01PREUsCisJQ0xLX0NPTlRJTlVPVVNfTU9ERQorfTsKK2VudW0geworCVJJU0lOR19FREdFLAorCUZBTExJTkdfRURHRQorfTsKK2VudW0geworCU1TQl9GSVJTVCwKKwlMU0JfRklSU1QKK307CitlbnVtIHsKKwlTRVJJQUwsCisJUEFSQUxMRUwKK307CisKK3N0cnVjdCBzaTIxeHhfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCWNvbnN0IHN0cnVjdCBzaTIxeHhfY29uZmlnICpjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKwl1OCBpbml0aWFsaXNlZDoxOworCWludCBlcnJtb2RlOworCWludCBmczsJCQkvKlNhbXBsaW5nIHJhdGUgb2YgdGhlIEFEQyBpbiBNSHoqLworfTsKKworLyoJcmVnaXN0ZXIgZGVmYXVsdCBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHU4IHNlcml0X3NwMTUxMWxoYl9pbml0dGFiW10gPSB7CisJMHgwMSwgMHgyOCwJLyogc2V0IGkyY19pbmNfZGlzYWJsZSAqLworCTB4MjAsIDB4MDMsCisJMHgyNywgMHgyMCwKKwkweGUwLCAweDQ1LAorCTB4ZTEsIDB4MDgsCisJMHhmZSwgMHgwMSwKKwkweDAxLCAweDI4LAorCTB4ODksIDB4MDksCisJMHgwNCwgMHg4MCwKKwkweDA1LCAweDAxLAorCTB4MDYsIDB4MDAsCisJMHgyMCwgMHgwMywKKwkweDI0LCAweDg4LAorCTB4MjksIDB4MDksCisJMHgyYSwgMHgwZiwKKwkweDJjLCAweDEwLAorCTB4MmQsIDB4MTksCisJMHgyZSwgMHgwOCwKKwkweDJmLCAweDEwLAorCTB4MzAsIDB4MTksCisJMHgzNCwgMHgyMCwKKwkweDM1LCAweDAzLAorCTB4NDUsIDB4MDIsCisJMHg0NiwgMHg0NSwKKwkweDQ3LCAweGQwLAorCTB4NDgsIDB4MDAsCisJMHg0OSwgMHg0MCwKKwkweDRhLCAweDAzLAorCTB4NGMsIDB4ZmQsCisJMHg0ZiwgMHgyZSwKKwkweDUwLCAweDJlLAorCTB4NTEsIDB4MTAsCisJMHg1MiwgMHgxMCwKKwkweDU2LCAweDkyLAorCTB4NTksIDB4MDAsCisJMHg1YSwgMHgyZCwKKwkweDViLCAweDMzLAorCTB4NWMsIDB4MWYsCisJMHg1ZiwgMHg3NiwKKwkweDYyLCAweGMwLAorCTB4NjMsIDB4YzAsCisJMHg2NCwgMHhmMywKKwkweDY1LCAweGYzLAorCTB4NzksIDB4NDAsCisJMHg2YSwgMHg0MCwKKwkweDZiLCAweDBhLAorCTB4NmMsIDB4ODAsCisJMHg2ZCwgMHgyNywKKwkweDcxLCAweDA2LAorCTB4NzUsIDB4NjAsCisJMHg3OCwgMHgwMCwKKwkweDc5LCAweGI1LAorCTB4N2MsIDB4MDUsCisJMHg3ZCwgMHgxYSwKKwkweDg3LCAweDU1LAorCTB4ODgsIDB4NzIsCisJMHg4ZiwgMHgwOCwKKwkweDkwLCAweGUwLAorCTB4OTQsIDB4NDAsCisJMHhhMCwgMHgzZiwKKwkweGExLCAweGMwLAorCTB4YTQsIDB4Y2MsCisJMHhhNSwgMHg2NiwKKwkweGE2LCAweDY2LAorCTB4YTcsIDB4N2IsCisJMHhhOCwgMHg3YiwKKwkweGE5LCAweDdiLAorCTB4YWEsIDB4OWEsCisJMHhlZCwgMHgwNCwKKwkweGFkLCAweDAwLAorCTB4YWUsIDB4MDMsCisJMHhjYywgMHhhYiwKKwkweDAxLCAweDA4LAorCTB4ZmYsIDB4ZmYKK307CisKKy8qCWxvdyBsZXZlbCByZWFkL3dyaXRlcyAqLworc3RhdGljIGludCBzaTIxX3dyaXRlcmVncyhzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSwgdTggcmVnMSwKKwkJCQkJCQl1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXU4IGJ1Zls2MF07LyogPSB7IHJlZzEsIGRhdGEgfTsqLworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkJLmZsYWdzID0gMCwKKwkJCQkuYnVmID0gYnVmLAorCQkJCS5sZW4gPSBsZW4gKyAxCisJfTsKKworCW1zZy5idWZbMF0gPSAgcmVnMTsKKwltZW1jcHkobXNnLmJ1ZiArIDEsIGRhdGEsIGxlbik7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSk7CisKKwlpZiAocmV0ICE9IDEpCisJCWRwcmludGsoIiVzOiB3cml0ZXJlZyBlcnJvciAocmVnMSA9PSAweCUwMngsIGRhdGEgPT0gMHglMDJ4LCAiCisJCQkicmV0ID09ICVpKVxuIiwgX19mdW5jX18sIHJlZzEsIGRhdGFbMF0sIHJldCk7CisKKwlyZXR1cm4gKHJldCAhPSAxKSA/IC1FUkVNT1RFSU8gOiAwOworfQorCitzdGF0aWMgaW50IHNpMjFfd3JpdGVyZWcoc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJCS5mbGFncyA9IDAsCisJCQkJLmJ1ZiA9IGJ1ZiwKKwkJCQkubGVuID0gMgorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSk7CisKKwlpZiAocmV0ICE9IDEpCisJCWRwcmludGsoIiVzOiB3cml0ZXJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgZGF0YSA9PSAweCUwMngsICIKKwkJCSJyZXQgPT0gJWkpXG4iLCBfX2Z1bmNfXywgcmVnLCBkYXRhLCByZXQpOworCisJcmV0dXJuIChyZXQgIT0gMSkgPyAtRVJFTU9URUlPIDogMDsKK30KKworc3RhdGljIGludCBzaTIxX3dyaXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAobGVuICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNpMjFfd3JpdGVyZWcoc3RhdGUsIGJ1ZlswXSwgYnVmWzFdKTsKK30KKworc3RhdGljIHU4IHNpMjFfcmVhZHJlZyhzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjBbXSA9IHsgcmVnIH07CisJdTggYjFbXSA9IHsgMCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7CisJCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9IGIwLAorCQkJLmxlbiA9IDEKKwkJfSwgeworCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkuYnVmID0gYjEsCisJCQkubGVuID0gMQorCQl9CisJfTsKKworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCisJaWYgKHJldCAhPSAyKQorCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwKKwkJCV9fZnVuY19fLCByZWcsIHJldCk7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgc2kyMV9yZWFkcmVncyhzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSwgdTggcmVnMSwgdTggKmIsIHU4IGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7CisJCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9ICZyZWcxLAorCQkJLmxlbiA9IDEKKwkJfSwgeworCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkuYnVmID0gYiwKKwkJCS5sZW4gPSBsZW4KKwkJfQorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKTsKKworCWlmIChyZXQgIT0gMikKKwkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJldCA9PSAlaSlcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldCA9PSAyID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHNpMjF4eF93YWl0X2Rpc2VxY19pZGxlKHN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlLCBpbnQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwl3aGlsZSAoKHNpMjFfcmVhZHJlZyhzdGF0ZSwgTE5CX0NUUkxfUkVHXzEpICYgMHg4KSA9PSA4KSB7CisJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiB0aW1lb3V0KSB7CisJCQlkcHJpbnRrKCIlczogdGltZW91dCEhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoMTApOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaTIxeHhfc2V0X3N5bWJvbHJhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBzcmF0ZSkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBzeW1fcmF0ZSwgZGF0YV9yYXRlOworCWludCBpOworCXU4IHN5bV9yYXRlX2J5dGVzWzNdOworCisJZHByaW50aygiJXMgOiBzcmF0ZSA9ICVpXG4iLCBfX2Z1bmNfXyAsIHNyYXRlKTsKKworCWlmICgoc3JhdGUgPCAxMDAwMDAwKSB8fCAoc3JhdGUgPiA0NTAwMDAwMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YV9yYXRlID0gc3JhdGU7CisJc3ltX3JhdGUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQlzeW1fcmF0ZSAvPSAxMDA7CisJCXN5bV9yYXRlID0gc3ltX3JhdGUgKyAoKGRhdGFfcmF0ZSAlIDEwMCkgKiAweDgwMDAwMCkgLworCQkJCQkJCQlzdGF0ZS0+ZnM7CisJCWRhdGFfcmF0ZSAvPSAxMDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJCXN5bV9yYXRlX2J5dGVzW2ldID0gKHU4KSgoc3ltX3JhdGUgPj4gKGkgKiA4KSkgJiAweGZmKTsKKworCXNpMjFfd3JpdGVyZWdzKHN0YXRlLCBTWU1fUkFURV9SRUdfTCwgc3ltX3JhdGVfYnl0ZXMsIDB4MDMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2kyMXh4X3NlbmRfZGlzZXFjX21zZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqbSkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGxuYl9zdGF0dXM7CisJdTggTE5CX0NUUkxfMTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCXN0YXR1cyA9IFBBU1M7CisJTE5CX0NUUkxfMSA9IDA7CisKKwlzdGF0dXMgfD0gc2kyMV9yZWFkcmVncyhzdGF0ZSwgTE5CX0NUUkxfU1RBVFVTX1JFRywgJmxuYl9zdGF0dXMsIDB4MDEpOworCXN0YXR1cyB8PSBzaTIxX3JlYWRyZWdzKHN0YXRlLCBMTkJfQ1RSTF9SRUdfMSwgJmxuYl9zdGF0dXMsIDB4MDEpOworCisJLypmaWxsIHRoZSBGSUZPKi8KKwlzdGF0dXMgfD0gc2kyMV93cml0ZXJlZ3Moc3RhdGUsIExOQl9GSUZPX1JFR1NfMCwgbS0+bXNnLCBtLT5tc2dfbGVuKTsKKworCUxOQl9DVFJMXzEgPSAobG5iX3N0YXR1cyAmIDB4NzApOworCUxOQl9DVFJMXzEgfD0gbS0+bXNnX2xlbjsKKworCUxOQl9DVFJMXzEgfD0gMHg4MDsJLyogYmVnaW4gTE5CIHNpZ25hbGluZyAqLworCisJc3RhdHVzIHw9IHNpMjFfd3JpdGVyZWdzKHN0YXRlLCBMTkJfQ1RSTF9SRUdfMSwgJkxOQl9DVFJMXzEsIDB4MDEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBzaTIxeHhfc2VuZF9kaXNlcWNfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQlmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHZhbDsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoc2kyMXh4X3dhaXRfZGlzZXFjX2lkbGUoc3RhdGUsIDEwMCkgPCAwKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXZhbCA9ICgweDgwIHwgc2kyMV9yZWFkcmVnKHN0YXRlLCAweGMxKSk7CisJaWYgKHNpMjFfd3JpdGVyZWcoc3RhdGUsIExOQl9DVFJMX1JFR18xLAorCQkJYnVyc3QgPT0gU0VDX01JTklfQSA/ICh2YWwgJiB+MHgxMCkgOiAodmFsIHwgMHgxMCkpKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCWlmIChzaTIxeHhfd2FpdF9kaXNlcWNfaWRsZShzdGF0ZSwgMTAwKSA8IDApCisJCXJldHVybiAtRVRJTUVET1VUOworCisJaWYgKHNpMjFfd3JpdGVyZWcoc3RhdGUsIExOQl9DVFJMX1JFR18xLCB2YWwpKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCXJldHVybiAwOworfQorLyoJMzAuMDYuMjAwOCAqLworc3RhdGljIGludCBzaTIxeHhfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKwl2YWwgPSAoMHg4MCB8IHNpMjFfcmVhZHJlZyhzdGF0ZSwgTE5CX0NUUkxfUkVHXzEpKTsKKworCXN3aXRjaCAodG9uZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXJldHVybiBzaTIxX3dyaXRlcmVnKHN0YXRlLCBMTkJfQ1RSTF9SRUdfMSwgdmFsIHwgMHgyMCk7CisKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJcmV0dXJuIHNpMjFfd3JpdGVyZWcoc3RhdGUsIExOQl9DVFJMX1JFR18xLCAodmFsICYgfjB4MjApKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzaTIxeHhfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdCkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJdTggdmFsOworCWRwcmludGsoIiVzOiAlc1xuIiwgX19mdW5jX18sCisJCXZvbHQgPT0gU0VDX1ZPTFRBR0VfMTMgPyAiU0VDX1ZPTFRBR0VfMTMiIDoKKwkJdm9sdCA9PSBTRUNfVk9MVEFHRV8xOCA/ICJTRUNfVk9MVEFHRV8xOCIgOiAiPz8iKTsKKworCisJdmFsID0gKDB4ODAgfCBzaTIxX3JlYWRyZWcoc3RhdGUsIExOQl9DVFJMX1JFR18xKSk7CisKKwlzd2l0Y2ggKHZvbHQpIHsKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQlyZXR1cm4gc2kyMV93cml0ZXJlZyhzdGF0ZSwgTE5CX0NUUkxfUkVHXzEsIHZhbCB8IDB4NDApOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQlyZXR1cm4gc2kyMV93cml0ZXJlZyhzdGF0ZSwgTE5CX0NUUkxfUkVHXzEsICh2YWwgJiB+MHg0MCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworfQorCitzdGF0aWMgaW50IHNpMjF4eF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGk7CisJaW50IHN0YXR1cyA9IDA7CisJdTggcmVnMTsKKwl1OCB2YWw7CisJdTggcmVnMlsyXTsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyA7IGkgKz0gMikgeworCQlyZWcxID0gc2VyaXRfc3AxNTExbGhiX2luaXR0YWJbaV07CisJCXZhbCA9IHNlcml0X3NwMTUxMWxoYl9pbml0dGFiW2krMV07CisJCWlmIChyZWcxID09IDB4ZmYgJiYgdmFsID09IDB4ZmYpCisJCQlicmVhazsKKwkJc2kyMV93cml0ZXJlZ3Moc3RhdGUsIHJlZzEsICZ2YWwsIDEpOworCX0KKworCS8qRFZCIFFQU0sgU1lTVEVNIE1PREUgUkVHKi8KKwlyZWcxID0gMHgwODsKKwlzaTIxX3dyaXRlcmVncyhzdGF0ZSwgU1lTVEVNX01PREVfUkVHLCAmcmVnMSwgMHgwMSk7CisKKwkvKnRyYW5zcG9ydCBzdHJlYW0gY29uZmlnKi8KKwkvKgorCW1vZGUgPSBQQVJBTExFTDsKKwlzZGF0YV9mb3JtID0gTFNCX0ZJUlNUOworCWNsa19lZGdlID0gRkFMTElOR19FREdFOworCWNsa19tb2RlID0gQ0xLX0dBUFBFRF9NT0RFOworCXN0cnRfbGVuID0gQllURV9XSURFOworCXN5bmNfcG9sID0gQUNUSVZFX0hJR0g7CisJdmFsX3BvbCA9IEFDVElWRV9ISUdIOworCWVycl9wb2wgPSBBQ1RJVkVfSElHSDsKKwlzY2xrX3JhdGUgPSAweDAwOworCXBhcml0eSA9IDB4MDAgOworCWRhdGFfZGVsYXkgPSAweDAwOworCWNsa19kZWxheSA9IDB4MDA7CisJcGNsa19zbW9vdGggPSAweDAwOworCSovCisJcmVnMlswXSA9CisJCVBBUkFMTEVMICsgKExTQl9GSVJTVCA8PCAxKQorCQkrIChGQUxMSU5HX0VER0UgPDwgMikgKyAoQ0xLX0dBUFBFRF9NT0RFIDw8IDMpCisJCSsgKEJZVEVfV0lERSA8PCA0KSArIChBQ1RJVkVfSElHSCA8PCA1KQorCQkrIChBQ1RJVkVfSElHSCA8PCA2KSArIChBQ1RJVkVfSElHSCA8PCA3KTsKKworCXJlZzJbMV0gPSAwOworCS8qCXNjbGtfcmF0ZSArIChwYXJpdHkgPDwgMikKKwkJKyAoZGF0YV9kZWxheSA8PCAzKSArIChjbGtfZGVsYXkgPDwgNCkKKwkJKyAocGNsa19zbW9vdGggPDwgNSk7CisJKi8KKwlzdGF0dXMgfD0gc2kyMV93cml0ZXJlZ3Moc3RhdGUsIFRTX0NUUkxfUkVHXzEsIHJlZzIsIDB4MDIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZHByaW50aygiICVzIDogVFMgU2V0IEVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHNpMjFfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCByZWdzX3JlYWRbMl07CisJdTggcmVnX3JlYWQ7CisJdTggaTsKKwl1OCBsb2NrOworCXU4IHNpZ25hbCA9IHNpMjFfcmVhZHJlZyhzdGF0ZSwgQU5BTE9HX0FHQ19QT1dFUl9MRVZFTF9SRUcpOworCisJc2kyMV9yZWFkcmVncyhzdGF0ZSwgTE9DS19TVEFUVVNfUkVHXzEsIHJlZ3NfcmVhZCwgMHgwMik7CisJcmVnX3JlYWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKKwkJcmVnX3JlYWQgfD0gKChyZWdzX3JlYWRbMF0gPj4gaSkgJiAweDAxKSA8PCAoNiAtIGkpOworCisJbG9jayA9ICgocmVnX3JlYWQgJiAweDdmKSB8IChyZWdzX3JlYWRbMV0gJiAweDgwKSk7CisKKwlkcHJpbnRrKCIlcyA6IEZFX1JFQURfU1RBVFVTIDogVlNUQVRVUzogMHglMDJ4XG4iLCBfX2Z1bmNfXywgbG9jayk7CisJKnN0YXR1cyA9IDA7CisKKwlpZiAoc2lnbmFsID4gMTApCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKKworCWlmIChsb2NrICYgMHgyKQorCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCisJaWYgKGxvY2sgJiAweDIwKQorCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOworCisJaWYgKGxvY2sgJiAweDQwKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCisJaWYgKChsb2NrICYgMHg3YikgPT0gMHg3YikKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpMjFfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qc3RhdHVzID0gc2kyMV9yZWFkcmVnKHN0YXRlLCBBTkFMT0dfQUdDX1BPV0VSX0xFVkVMX1JFRywKKwkJCQkJCSh1OCopYWdjbGV2ZWwsIDB4MDEpOyovCisKKwl1MTYgc2lnbmFsID0gKDMgKiBzaTIxX3JlYWRyZWcoc3RhdGUsIDB4MjcpICoKKwkJCQkJc2kyMV9yZWFkcmVnKHN0YXRlLCAweDI4KSk7CisKKwlkcHJpbnRrKCIlcyA6IEFHQ1BXUjogMHglMDJ4JTAyeCwgc2lnbmFsPTB4JTA0eFxuIiwgX19mdW5jX18sCisJCXNpMjFfcmVhZHJlZyhzdGF0ZSwgMHgyNyksCisJCXNpMjFfcmVhZHJlZyhzdGF0ZSwgMHgyOCksIChpbnQpIHNpZ25hbCk7CisKKwlzaWduYWwgIDw8PSA0OworCSpzdHJlbmd0aCA9IHNpZ25hbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpMjFfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHN0YXRlLT5lcnJtb2RlICE9IFNUQVRVU19CRVIpCisJCXJldHVybiAwOworCisJKmJlciA9IChzaTIxX3JlYWRyZWcoc3RhdGUsIDB4MWQpIDw8IDgpIHwKKwkJCQlzaTIxX3JlYWRyZWcoc3RhdGUsIDB4MWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2kyMV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXMzMiB4c25yID0gMHhmZmZmIC0gKChzaTIxX3JlYWRyZWcoc3RhdGUsIDB4MjQpIDw8IDgpIHwKKwkJCQkJc2kyMV9yZWFkcmVnKHN0YXRlLCAweDI1KSk7CisJeHNuciA9IDMgKiAoeHNuciAtIDB4YTEwMCk7CisJKnNuciA9ICh4c25yID4gMHhmZmZmKSA/IDB4ZmZmZiA6ICh4c25yIDwgMCkgPyAwIDogeHNucjsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaTIxX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCit7CisJc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoc3RhdGUtPmVycm1vZGUgIT0gU1RBVFVTX1VDQkxPQ0tTKQorCQkqdWNibG9ja3MgPSAwOworCWVsc2UKKwkJKnVjYmxvY2tzID0gKHNpMjFfcmVhZHJlZyhzdGF0ZSwgMHgxZCkgPDwgOCkgfAorCQkJCQlzaTIxX3JlYWRyZWcoc3RhdGUsIDB4MWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCWluaXRpYXRlcyBhIGNoYW5uZWwgYWNxdWlzaXRpb24gc2VxdWVuY2UKKwl1c2luZyB0aGUgc3BlY2lmaWVkIHN5bWJvbCByYXRlIGFuZCBjb2RlIHJhdGUgKi8KK3N0YXRpYyBpbnQgc2kyMXh4X3NldGFjcXVpcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBzeW1icmF0ZSwKKwkJCQkJCWZlX2NvZGVfcmF0ZV90IGNyYXRlKQoreworCisJc3RydWN0IHNpMjF4eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBjb2RlcmF0ZXNbXSA9IHsKKwkJCQkweDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDAsCisJCQkJMHg4LCAweDEwLCAweDIwLCAweDAwLCAweDNmCisJfTsKKworCXU4IGNvZGVyYXRlX3B0cjsKKwlpbnQgc3RhdHVzOworCXU4IHN0YXJ0X2FjcSA9IDB4ODA7CisJdTggcmVnLCByZWdzWzNdOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCXN0YXR1cyA9IFBBU1M7CisJY29kZXJhdGVfcHRyID0gY29kZXJhdGVzW2NyYXRlXTsKKworCXNpMjF4eF9zZXRfc3ltYm9scmF0ZShmZSwgc3ltYnJhdGUpOworCisJLyogd3JpdGUgY29kZSByYXRlcyB0byB1c2UgaW4gdGhlIFZpdGVyYmkgc2VhcmNoICovCisJc3RhdHVzIHw9IHNpMjFfd3JpdGVyZWdzKHN0YXRlLAorCQkJCVZJVF9TUkNIX0NUUkxfUkVHXzEsCisJCQkJJmNvZGVyYXRlX3B0ciwgMHgwMSk7CisKKwkvKiBjbGVhciBhY3Ffc3RhcnQgYml0ICovCisJc3RhdHVzIHw9IHNpMjFfcmVhZHJlZ3Moc3RhdGUsIEFDUV9DVFJMX1JFR18yLCAmcmVnLCAweDAxKTsKKwlyZWcgJj0gfnN0YXJ0X2FjcTsKKwlzdGF0dXMgfD0gc2kyMV93cml0ZXJlZ3Moc3RhdGUsIEFDUV9DVFJMX1JFR18yLCAmcmVnLCAweDAxKTsKKworCS8qIHVzZSBuZXcgQ2FycmllciBGcmVxdWVuY3kgT2Zmc2V0IEVzdGltYXRvciAoUXVpY2tMb2NrKSAqLworCXJlZ3NbMF0gPSAweENCOworCXJlZ3NbMV0gPSAweDQwOworCXJlZ3NbMl0gPSAweENCOworCisJc3RhdHVzIHw9IHNpMjFfd3JpdGVyZWdzKHN0YXRlLAorCQkJCVRXT19EQl9CTkRXRFRIX1RIUlNITERfUkVHLAorCQkJCSZyZWdzWzBdLCAweDAzKTsKKwlyZWcgPSAweDU2OworCXN0YXR1cyB8PSBzaTIxX3dyaXRlcmVncyhzdGF0ZSwKKwkJCQlMU0FfQ1RSTF9SRUdfMSwgJnJlZywgMSk7CisJcmVnID0gMHgwNTsKKwlzdGF0dXMgfD0gc2kyMV93cml0ZXJlZ3Moc3RhdGUsCisJCQkJQkxJTkRfU0NBTl9DVFJMX1JFRywgJnJlZywgMSk7CisJLyogc3RhcnQgYXV0b21hdGljIGFjcSAqLworCXN0YXR1cyB8PSBzaTIxX3dyaXRlcmVncyhzdGF0ZSwKKwkJCQlBQ1FfQ1RSTF9SRUdfMiwgJnN0YXJ0X2FjcSwgMHgwMSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNpMjF4eF9zZXRfcHJvcGVydHkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkgKnApCit7CisJZHByaW50aygiJXMoLi4pXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2kyMXh4X2dldF9wcm9wZXJ0eShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR0dl9wcm9wZXJ0eSAqcCkKK3sKKwlkcHJpbnRrKCIlcyguLilcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaTIxeHhfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmRmcCkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCisJLyogZnJlcQkJQ2hhbm5lbCBjYXJyaWVyIGZyZXF1ZW5jeSBpbiBLSHogKGkuZS4gMTU1MDAwMCBLSHopCisJIGRhdGFyYXRlCUNoYW5uZWwgc3ltYm9sIHJhdGUgaW4gU3BzIChpLmUuIDIyNTAwMDAwIFNwcykqLworCisJLyogaW4gTUh6ICovCisJdW5zaWduZWQgY2hhciBjb2Fyc2VfdHVuZV9mcmVxOworCWludCBmaW5lX3R1bmVfZnJlcTsKKwl1bnNpZ25lZCBjaGFyIHNhbXBsZV9yYXRlID0gMDsKKwkvKiBib29sZWFuICovCisJdW5zaWduZWQgaW50IGluYmFuZF9pbnRlcmZlcmVyX2luZDsKKworCS8qIElOVEVSTUVESUFURSBWQUxVRVMgKi8KKwlpbnQgaWNvYXJzZV90dW5lX2ZyZXE7IC8qIE1IeiAqLworCWludCBpZmluZV90dW5lX2ZyZXE7IC8qIE1IeiAqLworCXVuc2lnbmVkIGludCBiYW5kX2hpZ2g7CisJdW5zaWduZWQgaW50IGJhbmRfbG93OworCXVuc2lnbmVkIGludCB4MTsKKwl1bnNpZ25lZCBpbnQgeDI7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGluYmFuZF9pbnRlcmZlcmVyX2RpdjJbQUxMT1dBQkxFX0ZTX0NPVU5UXSA9IHsKKwkJCUZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwKKwkJCUZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRQorCX07CisJdW5zaWduZWQgaW50IGluYmFuZF9pbnRlcmZlcmVyX2RpdjRbQUxMT1dBQkxFX0ZTX0NPVU5UXSA9IHsKKwkJCUZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwKKwkJCUZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRQorCX07CisKKwlpbnQgc3RhdHVzOworCisJLyogYWxsb3dhYmxlIHNhbXBsZSByYXRlcyBmb3IgQURDIGluIE1IeiAqLworCWludCBhZnNbQUxMT1dBQkxFX0ZTX0NPVU5UXSA9IHsgMjAwLCAxOTIsIDE5MywgMTk0LCAxOTUsCisJCQkJCTE5NiwgMjA0LCAyMDUsIDIwNiwgMjA3CisJfTsKKwkvKiBpbiBNSHogKi8KKwlpbnQgaWZfbGltaXRfaGlnaDsKKwlpbnQgaWZfbGltaXRfbG93OworCWludCBsbmJfbG87CisJaW50IGxuYl91bmNlcnRhbml0eTsKKworCWludCByZl9mcmVxOworCWludCBkYXRhX3JhdGU7CisJdW5zaWduZWQgY2hhciByZWdzWzRdOworCisJZHByaW50aygiJXMgOiBGRV9TRVRfRlJPTlRFTkRcbiIsIF9fZnVuY19fKTsKKworCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gIT0gU1lTX0RWQlMpIHsKKwkJCWRwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBkZWxpdmVyeSBzeXN0ZW0gc2VsZWN0ZWQgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgYy0+ZGVsaXZlcnlfc3lzdGVtKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQUxMT1dBQkxFX0ZTX0NPVU5UOyArK2kpCisJCWluYmFuZF9pbnRlcmZlcmVyX2RpdjJbaV0gPSBpbmJhbmRfaW50ZXJmZXJlcl9kaXY0W2ldID0gRkFMU0U7CisKKwlpZl9saW1pdF9oaWdoID0gLTcwMDAwMDsKKwlpZl9saW1pdF9sb3cgPSAtMTAwMDAwOworCS8qIGluIE1IeiAqLworCWxuYl9sbyA9IDA7CisJbG5iX3VuY2VydGFuaXR5ID0gMDsKKworCXJmX2ZyZXEgPSAxMCAqIGMtPmZyZXF1ZW5jeSA7CisJZGF0YV9yYXRlID0gYy0+c3ltYm9sX3JhdGUgLyAxMDA7CisKKwlzdGF0dXMgPSBQQVNTOworCisJYmFuZF9sb3cgPSAocmZfZnJlcSAtIGxuYl9sbykgLSAoKGxuYl91bmNlcnRhbml0eSAqIDIwMCkKKwkJCQkJKyAoZGF0YV9yYXRlICogMTM1KSkgLyAyMDA7CisKKwliYW5kX2hpZ2ggPSAocmZfZnJlcSAtIGxuYl9sbykgKyAoKGxuYl91bmNlcnRhbml0eSAqIDIwMCkKKwkJCQkJKyAoZGF0YV9yYXRlICogMTM1KSkgLyAyMDA7CisKKworCWljb2Fyc2VfdHVuZV9mcmVxID0gMTAwMDAwICoKKwkJCQkoKChyZl9mcmVxIC0gbG5iX2xvKSAtCisJCQkJCShpZl9saW1pdF9sb3cgKyBpZl9saW1pdF9oaWdoKSAvIDIpCisJCQkJCQkJCS8gMTAwMDAwKTsKKworCWlmaW5lX3R1bmVfZnJlcSA9IChyZl9mcmVxIC0gbG5iX2xvKSAtIGljb2Fyc2VfdHVuZV9mcmVxIDsKKworCWZvciAoaSA9IDA7IGkgPCBBTExPV0FCTEVfRlNfQ09VTlQ7ICsraSkgeworCQl4MSA9ICgocmZfZnJlcSAtIGxuYl9sbykgLyAoYWZzW2ldICogMjUwMCkpICoKKwkJCQkJKGFmc1tpXSAqIDI1MDApICsgYWZzW2ldICogMjUwMDsKKworCQl4MiA9ICgocmZfZnJlcSAtIGxuYl9sbykgLyAoYWZzW2ldICogMjUwMCkpICoKKwkJCQkJCQkoYWZzW2ldICogMjUwMCk7CisKKwkJaWYgKCgoYmFuZF9sb3cgPCB4MSkgJiYgKHgxIDwgYmFuZF9oaWdoKSkgfHwKKwkJCQkJKChiYW5kX2xvdyA8IHgyKSAmJiAoeDIgPCBiYW5kX2hpZ2gpKSkKKwkJCQkJaW5iYW5kX2ludGVyZmVyZXJfZGl2NFtpXSA9IFRSVUU7CisKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQUxMT1dBQkxFX0ZTX0NPVU5UOyArK2kpIHsKKwkJeDEgPSAoKHJmX2ZyZXEgLSBsbmJfbG8pIC8gKGFmc1tpXSAqIDUwMDApKSAqCisJCQkJCShhZnNbaV0gKiA1MDAwKSArIGFmc1tpXSAqIDUwMDA7CisKKwkJeDIgPSAoKHJmX2ZyZXEgLSBsbmJfbG8pIC8gKGFmc1tpXSAqIDUwMDApKSAqCisJCQkJCShhZnNbaV0gKiA1MDAwKTsKKworCQlpZiAoKChiYW5kX2xvdyA8IHgxKSAmJiAoeDEgPCBiYW5kX2hpZ2gpKSB8fAorCQkJCQkoKGJhbmRfbG93IDwgeDIpICYmICh4MiA8IGJhbmRfaGlnaCkpKQorCQkJCQlpbmJhbmRfaW50ZXJmZXJlcl9kaXYyW2ldID0gVFJVRTsKKwl9CisKKwlpbmJhbmRfaW50ZXJmZXJlcl9pbmQgPSBUUlVFOworCWZvciAoaSA9IDA7IGkgPCBBTExPV0FCTEVfRlNfQ09VTlQ7ICsraSkKKwkJaW5iYW5kX2ludGVyZmVyZXJfaW5kICY9IGluYmFuZF9pbnRlcmZlcmVyX2RpdjJbaV0gfAorCQkJCQkJaW5iYW5kX2ludGVyZmVyZXJfZGl2NFtpXTsKKworCWlmIChpbmJhbmRfaW50ZXJmZXJlcl9pbmQpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFMTE9XQUJMRV9GU19DT1VOVDsgKytpKSB7CisJCQlpZiAoaW5iYW5kX2ludGVyZmVyZXJfZGl2MltpXSA9PSBGQUxTRSkgeworCQkJCXNhbXBsZV9yYXRlID0gKHU4KSBhZnNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgQUxMT1dBQkxFX0ZTX0NPVU5UOyArK2kpIHsKKwkJCWlmICgoaW5iYW5kX2ludGVyZmVyZXJfZGl2MltpXSB8CisJCQkJCWluYmFuZF9pbnRlcmZlcmVyX2RpdjRbaV0pID09IEZBTFNFKSB7CisJCQkJc2FtcGxlX3JhdGUgPSAodTgpIGFmc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJfQorCisJaWYgKHNhbXBsZV9yYXRlID4gMjA3IHx8IHNhbXBsZV9yYXRlIDwgMTkyKQorCQlzYW1wbGVfcmF0ZSA9IDIwMDsKKworCWZpbmVfdHVuZV9mcmVxID0gKCgweDQwMDAgKiAoaWZpbmVfdHVuZV9mcmVxIC8gMTApKSAvCisJCQkJCSgoc2FtcGxlX3JhdGUpICogMTAwMCkpOworCisJY29hcnNlX3R1bmVfZnJlcSA9ICh1OCkoaWNvYXJzZV90dW5lX2ZyZXEgLyAxMDAwMDApOworCisJcmVnc1swXSA9IHNhbXBsZV9yYXRlOworCXJlZ3NbMV0gPSBjb2Fyc2VfdHVuZV9mcmVxOworCXJlZ3NbMl0gPSBmaW5lX3R1bmVfZnJlcSAmIDB4RkY7CisJcmVnc1szXSA9IGZpbmVfdHVuZV9mcmVxID4+IDggJiAweEZGOworCisJc3RhdHVzIHw9IHNpMjFfd3JpdGVyZWdzKHN0YXRlLCBQTExfRElWSVNPUl9SRUcsICZyZWdzWzBdLCAweDA0KTsKKworCXN0YXRlLT5mcyA9IHNhbXBsZV9yYXRlOy8qQURDIE1IeiovCisJc2kyMXh4X3NldGFjcXVpcmUoZmUsIGMtPnN5bWJvbF9yYXRlLCBjLT5mZWNfaW5uZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2kyMXh4X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggcmVnZGF0YTsKKworCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzaTIxX3JlYWRyZWdzKHN0YXRlLCBTWVNURU1fTU9ERV9SRUcsICZyZWdkYXRhLCAweDAxKTsKKwlyZWdkYXRhIHw9IDEgPDwgNjsKKwlzaTIxX3dyaXRlcmVncyhzdGF0ZSwgU1lTVEVNX01PREVfUkVHLCAmcmVnZGF0YSwgMHgwMSk7CisJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaTIxeHhfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2kyMXh4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHNpMjF4eF9vcHMgPSB7CisKKwkuaW5mbyA9IHsKKwkJLm5hbWUJCQk9ICJTTCBTSTIxWFggRFZCLVMiLAorCQkudHlwZQkJCT0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4JCT0gOTUwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gMTI1LAkgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLworCQkuZnJlcXVlbmN5X3RvbGVyYW5jZQk9IDAsCisJCS5zeW1ib2xfcmF0ZV9taW4JPSAxMDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4CT0gNDUwMDAwMDAsCisJCS5zeW1ib2xfcmF0ZV90b2xlcmFuY2UJPSA1MDAsCS8qIHBwbSAqLworCQkuY2FwcyA9IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8CisJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAorCQlGRV9DQU5fUVBTSyB8CisJCUZFX0NBTl9GRUNfQVVUTworCX0sCisKKwkucmVsZWFzZSA9IHNpMjF4eF9yZWxlYXNlLAorCS5pbml0ID0gc2kyMXh4X2luaXQsCisJLnNsZWVwID0gc2kyMXh4X3NsZWVwLAorCS53cml0ZSA9IHNpMjFfd3JpdGUsCisJLnJlYWRfc3RhdHVzID0gc2kyMV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSBzaTIxX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IHNpMjFfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gc2kyMV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IHNpMjFfcmVhZF91Y2Jsb2NrcywKKwkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IHNpMjF4eF9zZW5kX2Rpc2VxY19tc2csCisJLmRpc2VxY19zZW5kX2J1cnN0ID0gc2kyMXh4X3NlbmRfZGlzZXFjX2J1cnN0LAorCS5zZXRfdG9uZSA9IHNpMjF4eF9zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSBzaTIxeHhfc2V0X3ZvbHRhZ2UsCisKKwkuc2V0X3Byb3BlcnR5ID0gc2kyMXh4X3NldF9wcm9wZXJ0eSwKKwkuZ2V0X3Byb3BlcnR5ID0gc2kyMXh4X2dldF9wcm9wZXJ0eSwKKwkuc2V0X2Zyb250ZW5kID0gc2kyMXh4X3NldF9mcm9udGVuZCwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnNpMjF4eF9hdHRhY2goY29uc3Qgc3RydWN0IHNpMjF4eF9jb25maWcgKmNvbmZpZywKKwkJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXN0cnVjdCBzaTIxeHhfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwlpbnQgaWQ7CisKKwlkcHJpbnRrKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzaTIxeHhfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCS8qIHNldHVwIHRoZSBzdGF0ZSAqLworCXN0YXRlLT5jb25maWcgPSBjb25maWc7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwlzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOworCXN0YXRlLT5lcnJtb2RlID0gU1RBVFVTX0JFUjsKKworCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLworCWlkID0gc2kyMV9yZWFkcmVnKHN0YXRlLCBTWVNURU1fTU9ERV9SRUcpOworCXNpMjFfd3JpdGVyZWcoc3RhdGUsIFNZU1RFTV9NT0RFX1JFRywgaWQgfCAweDQwKTsgLyogc3RhbmRieSBvZmYgKi8KKwltc2xlZXAoMjAwKTsKKwlpZCA9IHNpMjFfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CisKKwkvKiByZWdpc3RlciAweDAwIGNvbnRhaW5zOgorCQkweDM0IGZvciBTSTIxMDcKKwkJMHgyNCBmb3IgU0kyMTA4CisJCTB4MTQgZm9yIFNJMjEwOQorCQkweDA0IGZvciBTSTIxMTAKKwkqLworCWlmIChpZCAhPSAweDA0ICYmIGlkICE9IDB4MTQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmc2kyMXh4X29wcywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKKworZXJyb3I6CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzaTIxeHhfYXR0YWNoKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNMIFNJMjFYWCBEVkIgRGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJZ29yIE0uIExpcGxpYW5pbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NpMjF4eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NpMjF4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWI1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc2kyMXh4LmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBTSTIxWFhfSAorI2RlZmluZSBTSTIxWFhfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKK3N0cnVjdCBzaTIxeHhfY29uZmlnIHsKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBtaW5pbXVtIGRlbGF5IGJlZm9yZSByZXR1bmluZyAqLworCWludCBtaW5fZGVsYXlfbXM7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NJMjFYWCkgfHwgXAorCQkoZGVmaW5lZChDT05GSUdfRFZCX1NJMjFYWF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzaTIxeHhfYXR0YWNoKGNvbnN0IHN0cnVjdCBzaTIxeHhfY29uZmlnICpjb25maWcsCisJCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzaTIxeHhfYXR0YWNoKAorCQljb25zdCBzdHJ1Y3Qgc2kyMXh4X2NvbmZpZyAqY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBzaTIxeHhfd3JpdGVyZWdpc3RlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggcmVnLCB1OCB2YWwpCit7CisJaW50IHIgPSAwOworCXU4IGJ1ZltdID0ge3JlZywgdmFsfTsKKwlpZiAoZmUtPm9wcy53cml0ZSkKKwkJciA9IGZlLT5vcHMud3JpdGUoZmUsIGJ1ZiwgMik7CisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jCmluZGV4IDQ1NDM2MDkuLjU1OTUwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMKQEAgLTMzNyw3ICszMzcsOCBAQAogCQkJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCWludCBhY3R1YWxfZnJlcSwgZXJyOworCXVuc2lnbmVkIGFjdHVhbF9mcmVxOworCWludCBlcnI7CiAJdTE2IHZhbCwgcmVnMHhjMDU7CiAKIAlpZiAocC0+dS5vZmRtLmJhbmR3aWR0aCAhPSBCQU5EV0lEVEhfOF9NSFogJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MDAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmNiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiNjAwMC5jCkBAIC0wLDAgKzEsMjU1IEBACisgIC8qCisgICAgIERyaXZlciBmb3IgU1QgU1RCNjAwMCBEVkJTIFNpbGljb24gdHVuZXIKKworICAgICBDb3B5cmlnaHQgKEMpIDIwMDggSWdvciBNLiBMaXBsaWFuaW4gKGxpcGxpYW5pbkBtZS5ieSkKKworICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisKKyAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpbmNsdWRlICJzdGI2MDAwLmgiCisKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoZGVidWcpIFwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzdGI2MDAwOiAiIGFyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKworc3RydWN0IHN0YjYwMDBfcHJpdiB7CisJLyogaTJjIGRldGFpbHMgKi8KKwlpbnQgaTJjX2FkZHJlc3M7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJdTMyIGZyZXF1ZW5jeTsKK307CisKK3N0YXRpYyBpbnQgc3RiNjAwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjAwMF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc3RiNjAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKwl1OCBidWZbXSA9IHsgMTAsIDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gcHJpdi0+aTJjX2FkZHJlc3MsCisJCS5mbGFncyA9IDAsCisJCS5idWYgPSBidWYsCisJCS5sZW4gPSAyCisJfTsKKworCWRwcmludGsoIiVzOlxuIiwgX19mdW5jX18pOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2csIDEpOworCWlmIChyZXQgIT0gMSkKKwkJZHByaW50aygiJXM6IGkyYyBlcnJvclxuIiwgX19mdW5jX18pOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKworCXJldHVybiAocmV0ID09IDEpID8gMCA6IHJldDsKK30KKworc3RhdGljIGludCBzdGI2MDAwX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHN0YjYwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXVuc2lnbmVkIGludCBuLCBtOworCWludCByZXQ7CisJdTMyIGZyZXFfbWh6OworCWludCBiYW5kd2lkdGg7CisJdTggYnVmWzEyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gcHJpdi0+aTJjX2FkZHJlc3MsCisJCS5mbGFncyA9IDAsCisJCS5idWYgPSBidWYsCisJCS5sZW4gPSAxMgorCX07CisKKwlkcHJpbnRrKCIlczpcbiIsIF9fZnVuY19fKTsKKworCWZyZXFfbWh6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwOworCWJhbmR3aWR0aCA9IHBhcmFtcy0+dS5xcHNrLnN5bWJvbF9yYXRlIC8gMTAwMDAwMDsKKworCWlmIChiYW5kd2lkdGggPiAzMSkKKwkJYmFuZHdpZHRoID0gMzE7CisKKwlpZiAoKGZyZXFfbWh6ID4gOTQ5KSAmJiAoZnJlcV9taHogPCAyMTUxKSkgeworCQlidWZbMF0gPSAweDAxOworCQlidWZbMV0gPSAweGFjOworCQlpZiAoZnJlcV9taHogPCAxOTUwKQorCQkJYnVmWzFdID0gMHhhYTsKKwkJaWYgKGZyZXFfbWh6IDwgMTgwMCkKKwkJCWJ1ZlsxXSA9IDB4YTg7CisJCWlmIChmcmVxX21oeiA8IDE2NTApCisJCQlidWZbMV0gPSAweGE2OworCQlpZiAoZnJlcV9taHogPCAxNTMwKQorCQkJYnVmWzFdID0gMHhhNTsKKwkJaWYgKGZyZXFfbWh6IDwgMTQ3MCkKKwkJCWJ1ZlsxXSA9IDB4YTQ7CisJCWlmIChmcmVxX21oeiA8IDEzNzApCisJCQlidWZbMV0gPSAweGEyOworCQlpZiAoZnJlcV9taHogPCAxMzAwKQorCQkJYnVmWzFdID0gMHhhMTsKKwkJaWYgKGZyZXFfbWh6IDwgMTIwMCkKKwkJCWJ1ZlsxXSA9IDB4YTA7CisJCWlmIChmcmVxX21oeiA8IDEwNzUpCisJCQlidWZbMV0gPSAweGJjOworCQlpZiAoZnJlcV9taHogPCAxMDAwKQorCQkJYnVmWzFdID0gMHhiYTsKKwkJaWYgKGZyZXFfbWh6IDwgMTA3NSkgeworCQkJbiA9IGZyZXFfbWh6IC8gODsgLyogdmNvPWxvKjQgKi8KKwkJCW0gPSAyOworCQl9IGVsc2UgeworCQkJbiA9IGZyZXFfbWh6IC8gMTY7IC8qIHZjbz1sbyoyICovCisJCQltID0gMTsKKwkJfQorCQlidWZbMl0gPSBuID4+IDE7CisJCWJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgoKG4gJiAxKSA8PCA3KSB8CisJCQkJCShtICogZnJlcV9taHogLSBuICogMTYpIHwgMHg2MCk7CisJCWJ1Zls0XSA9IDB4MDQ7CisJCWJ1Zls1XSA9IDB4MGU7CisKKwkJYnVmWzZdID0gKHVuc2lnbmVkIGNoYXIpKGJhbmR3aWR0aCk7CisKKwkJYnVmWzddID0gMHhkODsKKwkJYnVmWzhdID0gMHhkMDsKKwkJYnVmWzldID0gMHg1MDsKKwkJYnVmWzEwXSA9IDB4ZWI7CisJCWJ1ZlsxMV0gPSAweDRmOworCisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2csIDEpOworCQlpZiAocmV0ICE9IDEpCisJCQlkcHJpbnRrKCIlczogaTJjIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisKKwkJYnVmWzBdID0gMHgwNzsKKwkJYnVmWzFdID0gMHhkZjsKKwkJYnVmWzJdID0gMHhkMDsKKwkJYnVmWzNdID0gMHg1MDsKKwkJYnVmWzRdID0gMHhmYjsKKwkJbXNnLmxlbiA9IDU7CisKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSk7CisJCWlmIChyZXQgIT0gMSkKKwkJCWRwcmludGsoIiVzOiBpMmMgZXJyb3JcbiIsIF9fZnVuY19fKTsKKworCQl1ZGVsYXkoMTApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKworCQlwcml2LT5mcmVxdWVuY3kgPSBmcmVxX21oeiAqIDEwMDA7CisKKwkJcmV0dXJuIChyZXQgPT0gMSkgPyAwIDogcmV0OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc3RiNjAwMF9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3Qgc3RiNjAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJKmZyZXF1ZW5jeSA9IHByaXYtPmZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdHVuZXJfb3BzIHN0YjYwMDBfdHVuZXJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSA9ICJTVCBTVEI2MDAwIiwKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMAorCX0sCisJLnJlbGVhc2UgPSBzdGI2MDAwX3JlbGVhc2UsCisJLnNsZWVwID0gc3RiNjAwMF9zbGVlcCwKKwkuc2V0X3BhcmFtcyA9IHN0YjYwMDBfc2V0X3BhcmFtcywKKwkuZ2V0X2ZyZXF1ZW5jeSA9IHN0YjYwMDBfZ2V0X2ZyZXF1ZW5jeSwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnN0YjYwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgYWRkciwKKwkJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXN0cnVjdCBzdGI2MDAwX3ByaXYgKnByaXYgPSBOVUxMOworCXU4IGIwW10gPSB7IDAgfTsKKwl1OCBiMVtdID0geyAwLCAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7CisJCQkuYWRkciA9IGFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9IGIwLAorCQkJLmxlbiA9IDAKKwkJfSwgeworCQkJLmFkZHIgPSBhZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkuYnVmID0gYjEsCisJCQkubGVuID0gMgorCQl9CisJfTsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXM6XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJLyogaXMgc29tZSBpMmMgZGV2aWNlIGhlcmUgPyAqLworCXJldCA9IGkyY190cmFuc2ZlcihpMmMsIG1zZywgMik7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKworCWlmIChyZXQgIT0gMikKKwkJcmV0dXJuIE5VTEw7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0YjYwMDBfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcHJpdi0+aTJjX2FkZHJlc3MgPSBhZGRyOworCXByaXYtPmkyYyA9IGkyYzsKKworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZzdGI2MDAwX3R1bmVyX29wcywKKwkJCQlzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKworCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0woc3RiNjAwMF9hdHRhY2gpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFZCIFNUQjYwMDAgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG1lLmJ5PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjYwMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlNDc5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGI2MDAwLmgKQEAgLTAsMCArMSw1MSBAQAorICAvKgorICAgICBEcml2ZXIgZm9yIFNUIHN0YjYwMDAgRFZCUyBTaWxpY29uIHR1bmVyCisKKyAgICAgQ29weXJpZ2h0IChDKSAyMDA4IElnb3IgTS4gTGlwbGlhbmluIChsaXBsaWFuaW5AbWUuYnkpCisKKyAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorCisgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgKi8KKworI2lmbmRlZiBfX0RWQl9TVEI2MDAwX0hfXworI2RlZmluZSBfX0RWQl9TVEI2MDAwX0hfXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKy8qKgorICogQXR0YWNoIGEgc3RiNjAwMCB0dW5lciB0byB0aGUgc3VwcGxpZWQgZnJvbnRlbmQgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBmZSBGcm9udGVuZCB0byBhdHRhY2ggdG8uCisgKiBAcGFyYW0gYWRkciBpMmMgYWRkcmVzcyBvZiB0aGUgdHVuZXIuCisgKiBAcGFyYW0gaTJjIGkyYyBhZGFwdGVyIHRvIHVzZS4KKyAqIEByZXR1cm4gRkUgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfU1RCNjAwMCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TVEI2MDAwX01PRFVMRSkgXAorCQkJCQkJCSYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdGI2MDAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsCisJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnN0YjYwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJICBpbnQgYWRkciwKKwkJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9TVEI2MDAwICovCisKKyNlbmRpZiAvKiBfX0RWQl9TVEI2MDAwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyODguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxMTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMKQEAgLTAsMCArMSw2MTggQEAKKy8qCisJRHJpdmVyIGZvciBTVCBTVFYwMjg4IGRlbW9kdWxhdG9yCisJQ29weXJpZ2h0IChDKSAyMDA2IEdlb3JnIEFjaGVyLCBCYXlDb20gR21iSCwgYWNoZXIgKGF0KSBiYXljb20gKGRvdCkgZGUKKwkJZm9yIFJlZWwgTXVsdGltZWRpYQorCUNvcHlyaWdodCAoQykgMjAwOCBUdXJib1NpZ2h0LmNvbSwgQm9iIExpdSA8Ym9iQHR1cmJvc2lnaHQuY29tPgorCUNvcHlyaWdodCAoQykgMjAwOCBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG1lLmJ5PgorCQlSZW1vdmVkIHN0YjYwMDAgc3BlY2lmaWMgdHVuZXIgY29kZSBhbmQgcmV2aXNlZCBzb21lCisJCXByb2NlZHVyZXMuCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKwlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAic3R2MDI4OC5oIgorCitzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJY29uc3Qgc3RydWN0IHN0djAyODhfY29uZmlnICpjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXU4IGluaXRpYWxpc2VkOjE7CisJdTMyIHR1bmVyX2ZyZXF1ZW5jeTsKKwl1MzIgc3ltYm9sX3JhdGU7CisJZmVfY29kZV9yYXRlX3QgZmVjX2lubmVyOworCWludCBlcnJtb2RlOworfTsKKworI2RlZmluZSBTVEFUVVNfQkVSIDAKKyNkZWZpbmUgU1RBVFVTX1VDQkxPQ0tTIDEKKworc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoOworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGRlYnVnKSBcCisJCQlwcmludGsoS0VSTl9ERUJVRyAic3R2MDI4ODogIiBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKKworc3RhdGljIGludCBzdHYwMjg4X3dyaXRlcmVnSShzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJLmZsYWdzID0gMCwKKwkJLmJ1ZiA9IGJ1ZiwKKwkJLmxlbiA9IDIKKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpOworCisJaWYgKHJldCAhPSAxKQorCQlkcHJpbnRrKCIlczogd3JpdGVyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHZhbCA9PSAweCUwMngsICIKKwkJCSJyZXQgPT0gJWkpXG4iLCBfX2Z1bmNfXywgcmVnLCBkYXRhLCByZXQpOworCisJcmV0dXJuIChyZXQgIT0gMSkgPyAtRVJFTU9URUlPIDogMDsKK30KKworc3RhdGljIGludCBzdHYwMjg4X3dyaXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGxlbiAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgYnVmWzBdLCBidWZbMV0pOworfQorCitzdGF0aWMgdTggc3R2MDI4OF9yZWFkcmVnKHN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjBbXSA9IHsgcmVnIH07CisJdTggYjFbXSA9IHsgMCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7CisJCQkuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9IGIwLAorCQkJLmxlbiA9IDEKKwkJfSwgeworCQkJLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkuYnVmID0gYjEsCisJCQkubGVuID0gMQorCQl9CisJfTsKKworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCisJaWYgKHJldCAhPSAyKQorCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwKKwkJCQlfX2Z1bmNfXywgcmVnLCByZXQpOworCisJcmV0dXJuIGIxWzBdOworfQorCitzdGF0aWMgaW50IHN0djAyODhfc2V0X3N5bWJvbHJhdGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBzcmF0ZSkKK3sKKwlzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwl1bnNpZ25lZCBjaGFyIGJbM107CisKKwlpZiAoKHNyYXRlIDwgMTAwMDAwMCkgfHwgKHNyYXRlID4gNDUwMDAwMDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRlbXAgPSAodW5zaWduZWQgaW50KXNyYXRlIC8gMTAwMDsKKworCQl0ZW1wID0gdGVtcCAqIDMyNzY4OworCQl0ZW1wID0gdGVtcCAvIDI1OworCQl0ZW1wID0gdGVtcCAvIDEyNTsKKwkJYlswXSA9ICh1bnNpZ25lZCBjaGFyKSgodGVtcCA+PiAxMikgJiAweGZmKTsKKwkJYlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgodGVtcCA+PiA0KSAmIDB4ZmYpOworCQliWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh0ZW1wIDw8IDQpICYgMHhmMCk7CisJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDI4LCAweDgwKTsgLyogU0ZSSCAqLworCQlzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgyOSwgMCk7IC8qIFNGUk0gKi8KKwkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmEsIDApOyAvKiBTRlJMICovCisKKwkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MjgsIGJbMF0pOworCQlzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgyOSwgYlsxXSk7CisJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDJhLCBiWzJdKTsKKwkJZHByaW50aygic3R2MDI4ODogc3R2MDI4OF9zZXRfc3ltYm9scmF0ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHYwMjg4X3NlbmRfZGlzZXFjX21zZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqbSkKK3sKKwlzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWludCBpOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDA5LCAwKTsKKwltc2xlZXAoMzApOworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDE2KTsKKworCWZvciAoaSA9IDA7IGkgPCBtLT5tc2dfbGVuOyBpKyspIHsKKwkJaWYgKHN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDA2LCBtLT5tc2dbaV0pKQorCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCW1zbGVlcCgxMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9zZW5kX2Rpc2VxY19idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCWZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHgxNikpLyogYnVyc3QgbW9kZSAqLworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCWlmIChzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgwNiwgYnVyc3QgPT0gU0VDX01JTklfQSA/IDB4MDAgOiAweGZmKSkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlpZiAoc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MDYsIDB4MTIpKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0djAyODhfc2V0X3RvbmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY190b25lX21vZGVfdCB0b25lKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJc3dpdGNoICh0b25lKSB7CisJY2FzZSBTRUNfVE9ORV9PTjoKKwkJaWYgKHN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDEwKSkvKiBidXJzdCBtb2RlICovCisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJcmV0dXJuIHN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDA2LCAweGZmKTsKKworCWNhc2UgU0VDX1RPTkVfT0ZGOgorCQlpZiAoc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MTMpKS8qIGJ1cnN0IG1vZGUgKi8KKwkJCXJldHVybiAtRVJFTU9URUlPOworCQlyZXR1cm4gc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MDYsIDB4MDApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdTggc3R2MDI4OF9pbml0dGFiW10gPSB7CisJMHgwMSwgMHgxNSwKKwkweDAyLCAweDIwLAorCTB4MDksIDB4MCwKKwkweDBhLCAweDQsCisJMHgwYiwgMHgwLAorCTB4MGMsIDB4MCwKKwkweDBkLCAweDAsCisJMHgwZSwgMHhkNCwKKwkweDBmLCAweDMwLAorCTB4MTEsIDB4ODAsCisJMHgxMiwgMHgwMywKKwkweDEzLCAweDQ4LAorCTB4MTQsIDB4ODQsCisJMHgxNSwgMHg0NSwKKwkweDE2LCAweGI3LAorCTB4MTcsIDB4OWMsCisJMHgxOCwgMHgwLAorCTB4MTksIDB4YTYsCisJMHgxYSwgMHg4OCwKKwkweDFiLCAweDhmLAorCTB4MWMsIDB4ZjAsCisJMHgyMCwgMHgwYiwKKwkweDIxLCAweDU0LAorCTB4MjIsIDB4MCwKKwkweDIzLCAweDAsCisJMHgyYiwgMHhmZiwKKwkweDJjLCAweGY3LAorCTB4MzAsIDB4MCwKKwkweDMxLCAweDFlLAorCTB4MzIsIDB4MTQsCisJMHgzMywgMHgwZiwKKwkweDM0LCAweDA5LAorCTB4MzUsIDB4MGMsCisJMHgzNiwgMHgwNSwKKwkweDM3LCAweDJmLAorCTB4MzgsIDB4MTYsCisJMHgzOSwgMHhiZSwKKwkweDNhLCAweDAsCisJMHgzYiwgMHgxMywKKwkweDNjLCAweDExLAorCTB4M2QsIDB4MzAsCisJMHg0MCwgMHg2MywKKwkweDQxLCAweDA0LAorCTB4NDIsIDB4NjAsCisJMHg0MywgMHgwMCwKKwkweDQ0LCAweDAwLAorCTB4NDUsIDB4MDAsCisJMHg0NiwgMHgwMCwKKwkweDQ3LCAweDAwLAorCTB4NGEsIDB4MDAsCisJMHg1MCwgMHgxMCwKKwkweDUxLCAweDM4LAorCTB4NTIsIDB4MjEsCisJMHg1OCwgMHg1NCwKKwkweDU5LCAweDg2LAorCTB4NWEsIDB4MCwKKwkweDViLCAweDliLAorCTB4NWMsIDB4MDgsCisJMHg1ZCwgMHg3ZiwKKwkweDVlLCAweDAsCisJMHg1ZiwgMHhmZiwKKwkweDcwLCAweDAsCisJMHg3MSwgMHgwLAorCTB4NzIsIDB4MCwKKwkweDc0LCAweDAsCisJMHg3NSwgMHgwLAorCTB4NzYsIDB4MCwKKwkweDgxLCAweDAsCisJMHg4MiwgMHgzZiwKKwkweDgzLCAweDNmLAorCTB4ODQsIDB4MCwKKwkweDg1LCAweDAsCisJMHg4OCwgMHgwLAorCTB4ODksIDB4MCwKKwkweDhhLCAweDAsCisJMHg4YiwgMHgwLAorCTB4OGMsIDB4MCwKKwkweDkwLCAweDAsCisJMHg5MSwgMHgwLAorCTB4OTIsIDB4MCwKKwkweDkzLCAweDAsCisJMHg5NCwgMHgxYywKKwkweDk3LCAweDAsCisJMHhhMCwgMHg0OCwKKwkweGExLCAweDAsCisJMHhiMCwgMHhiOCwKKwkweGIxLCAweDNhLAorCTB4YjIsIDB4MTAsCisJMHhiMywgMHg4MiwKKwkweGI0LCAweDgwLAorCTB4YjUsIDB4ODIsCisJMHhiNiwgMHg4MiwKKwkweGI3LCAweDgyLAorCTB4YjgsIDB4MjAsCisJMHhiOSwgMHgwLAorCTB4ZjAsIDB4MCwKKwkweGYxLCAweDAsCisJMHhmMiwgMHhjMCwKKwkweDUxLCAweDM2LAorCTB4NTIsIDB4MDksCisJMHg1MywgMHg5NCwKKwkweDU0LCAweDYyLAorCTB4NTUsIDB4MjksCisJMHg1NiwgMHg2NCwKKwkweDU3LCAweDJiLAorCTB4ZmYsIDB4ZmYsCit9OworCitzdGF0aWMgaW50IHN0djAyODhfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdCkKK3sKKwlkcHJpbnRrKCIlczogJXNcbiIsIF9fZnVuY19fLAorCQl2b2x0ID09IFNFQ19WT0xUQUdFXzEzID8gIlNFQ19WT0xUQUdFXzEzIiA6CisJCXZvbHQgPT0gU0VDX1ZPTFRBR0VfMTggPyAiU0VDX1ZPTFRBR0VfMTgiIDogIj8/Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHYwMjg4X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHN0djAyODhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IGk7CisJdTggcmVnOworCXU4IHZhbDsKKworCWRwcmludGsoInN0djAyODg6IGluaXQgY2hpcFxuIik7CisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4NDEsIDB4MDQpOworCW1zbGVlcCg1MCk7CisKKwkvKiB3ZSBoYXZlIGRlZmF1bHQgaW5pdHRhYiAqLworCWlmIChzdGF0ZS0+Y29uZmlnLT5pbml0dGFiID09IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgIShzdHYwMjg4X2luaXR0YWJbaV0gPT0gMHhmZiAmJgorCQkJCXN0djAyODhfaW5pdHRhYltpICsgMV0gPT0gMHhmZik7IGkgKz0gMikKKwkJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCBzdHYwMjg4X2luaXR0YWJbaV0sCisJCQkJCXN0djAyODhfaW5pdHRhYltpICsgMV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IDsgaSArPSAyKSAgeworCQkJcmVnID0gc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXTsKKwkJCXZhbCA9IHN0YXRlLT5jb25maWctPmluaXR0YWJbaSsxXTsKKwkJCWlmIChyZWcgPT0gMHhmZiAmJiB2YWwgPT0gMHhmZikKKwkJCQlicmVhazsKKwkJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCByZWcsIHZhbCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXU4IHN5bmMgPSBzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MjQpOworCWlmIChzeW5jID09IDI1NSkKKwkJc3luYyA9IDA7CisKKwlkcHJpbnRrKCIlcyA6IEZFX1JFQURfU1RBVFVTIDogVlNUQVRVUzogMHglMDJ4XG4iLCBfX2Z1bmNfXywgc3luYyk7CisKKwkqc3RhdHVzID0gMDsKKworCWlmICgoc3luYyAmIDB4MDgpID09IDB4MDgpIHsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwkJZHByaW50aygic3R2MDI4OCBoYXMgbG9ja2VkXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHYwMjg4X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChzdGF0ZS0+ZXJybW9kZSAhPSBTVEFUVVNfQkVSKQorCQlyZXR1cm4gMDsKKwkqYmVyID0gKHN0djAyODhfcmVhZHJlZyhzdGF0ZSwgMHgyNikgPDwgOCkgfAorCQkJCQlzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MjcpOworCWRwcmludGsoInN0djAyODhfcmVhZF9iZXIgJWRcbiIsICpiZXIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzdHYwMjg4X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJczMyIHNpZ25hbCA9ICAweGZmZmYgLSAoKHN0djAyODhfcmVhZHJlZyhzdGF0ZSwgMHgxMCkgPDwgOCkpOworCisKKwlzaWduYWwgPSBzaWduYWwgKiA1IC8gNDsKKwkqc3RyZW5ndGggPSAoc2lnbmFsID4gMHhmZmZmKSA/IDB4ZmZmZiA6IChzaWduYWwgPCAwKSA/IDAgOiBzaWduYWw7CisJZHByaW50aygic3R2MDI4OF9yZWFkX3NpZ25hbF9zdHJlbmd0aCAlZFxuIiwgKnN0cmVuZ3RoKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBzdHYwMjg4X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4NDEsIDB4ODQpOworCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgc3R2MDI4OF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHN0djAyODhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzMzIgeHNuciA9IDB4ZmZmZiAtICgoc3R2MDI4OF9yZWFkcmVnKHN0YXRlLCAweDJkKSA8PCA4KQorCQkJICAgfCBzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MmUpKTsKKwl4c25yID0gMyAqICh4c25yIC0gMHhhMTAwKTsKKwkqc25yID0gKHhzbnIgPiAweGZmZmYpID8gMHhmZmZmIDogKHhzbnIgPCAwKSA/IDAgOiB4c25yOworCWRwcmludGsoInN0djAyODhfcmVhZF9zbnIgJWRcbiIsICpzbnIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVjYmxvY2tzKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKHN0YXRlLT5lcnJtb2RlICE9IFNUQVRVU19CRVIpCisJCXJldHVybiAwOworCSp1Y2Jsb2NrcyA9IChzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MjYpIDw8IDgpIHwKKwkJCQkJc3R2MDI4OF9yZWFkcmVnKHN0YXRlLCAweDI3KTsKKwlkcHJpbnRrKCJzdHYwMjg4X3JlYWRfYmVyICVkXG4iLCAqdWNibG9ja3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9zZXRfcHJvcGVydHkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkgKnApCit7CisJZHByaW50aygiJXMoLi4pXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9nZXRfcHJvcGVydHkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkgKnApCit7CisJZHByaW50aygiJXMoLi4pXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZGZwKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCisJY2hhciB0bTsKKwl1bnNpZ25lZCBjaGFyIHRkYVszXTsKKworCWRwcmludGsoIiVzIDogRkVfU0VUX0ZST05URU5EXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoYy0+ZGVsaXZlcnlfc3lzdGVtICE9IFNZU19EVkJTKSB7CisJCQlkcHJpbnRrKCIlczogdW5zdXBwb3J0ZWQgZGVsaXZlcnkgIgorCQkJCSJzeXN0ZW0gc2VsZWN0ZWQgKCVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgYy0+ZGVsaXZlcnlfc3lzdGVtKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcykKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisKKwkvKiBvbmx5IGZyZXF1ZW5jeSAmIHN5bWJvbF9yYXRlIGFyZSB1c2VkIGZvciB0dW5lciovCisJZGZwLT5mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CisJZGZwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBjLT5zeW1ib2xfcmF0ZTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBkZnApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKKwl1ZGVsYXkoMTApOworCXN0djAyODhfc2V0X3N5bWJvbHJhdGUoZmUsIGMtPnN5bWJvbF9yYXRlKTsKKwkvKiBDYXJyaWVyIGxvY2sgY29udHJvbCByZWdpc3RlciAqLworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDE1LCAweGM1KTsKKworCXRkYVswXSA9IDB4MmI7IC8qIENGUk0gKi8KKwl0ZGFbMl0gPSAweDA7IC8qIENGUkwgKi8KKwlmb3IgKHRtID0gLTY7IHRtIDwgNzspIHsKKwkJLyogVml0ZXJiaSBzdGF0dXMgKi8KKwkJaWYgKHN0djAyODhfcmVhZHJlZyhzdGF0ZSwgMHgyNCkgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJdGRhWzJdICs9IDQwOworCQlpZiAodGRhWzJdIDwgNDApCisJCQl0bSsrOworCQl0ZGFbMV0gPSAodW5zaWduZWQgY2hhcil0bTsKKwkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmIsIHRkYVsxXSk7CisJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDJjLCB0ZGFbMl0pOworCQl1ZGVsYXkoMzApOworCX0KKworCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CisJc3RhdGUtPmZlY19pbm5lciA9IEZFQ19BVVRPOworCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IGMtPnN5bWJvbF9yYXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R2MDI4OF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkKKwkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MDEsIDB4YjUpOworCWVsc2UKKwkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MDEsIDB4MzUpOworCisJdWRlbGF5KDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0djAyODhfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc3R2MDI4OF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBzdHYwMjg4X29wcyA9IHsKKworCS5pbmZvID0geworCQkubmFtZQkJCT0gIlNUIFNUVjAyODggRFZCLVMiLAorCQkudHlwZQkJCT0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4JCT0gOTUwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gMTAwMCwJIC8qIGtIeiBmb3IgUVBTSyBmcm9udGVuZHMgKi8KKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UJPSAwLAorCQkuc3ltYm9sX3JhdGVfbWluCT0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heAk9IDQ1MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfdG9sZXJhbmNlCT0gNTAwLAkvKiBwcG0gKi8KKwkJLmNhcHMgPSBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkgICAgICBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwKKwkJICAgICAgRkVfQ0FOX1FQU0sgfAorCQkgICAgICBGRV9DQU5fRkVDX0FVVE8KKwl9LAorCisJLnJlbGVhc2UgPSBzdHYwMjg4X3JlbGVhc2UsCisJLmluaXQgPSBzdHYwMjg4X2luaXQsCisJLnNsZWVwID0gc3R2MDI4OF9zbGVlcCwKKwkud3JpdGUgPSBzdHYwMjg4X3dyaXRlLAorCS5pMmNfZ2F0ZV9jdHJsID0gc3R2MDI4OF9pMmNfZ2F0ZV9jdHJsLAorCS5yZWFkX3N0YXR1cyA9IHN0djAyODhfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gc3R2MDI4OF9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBzdHYwMjg4X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IHN0djAyODhfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBzdHYwMjg4X3JlYWRfdWNibG9ja3MsCisJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBzdHYwMjg4X3NlbmRfZGlzZXFjX21zZywKKwkuZGlzZXFjX3NlbmRfYnVyc3QgPSBzdHYwMjg4X3NlbmRfZGlzZXFjX2J1cnN0LAorCS5zZXRfdG9uZSA9IHN0djAyODhfc2V0X3RvbmUsCisJLnNldF92b2x0YWdlID0gc3R2MDI4OF9zZXRfdm9sdGFnZSwKKworCS5zZXRfcHJvcGVydHkgPSBzdHYwMjg4X3NldF9wcm9wZXJ0eSwKKwkuZ2V0X3Byb3BlcnR5ID0gc3R2MDI4OF9nZXRfcHJvcGVydHksCisJLnNldF9mcm9udGVuZCA9IHN0djAyODhfc2V0X2Zyb250ZW5kLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqc3R2MDI4OF9hdHRhY2goY29uc3Qgc3RydWN0IHN0djAyODhfY29uZmlnICpjb25maWcsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXN0cnVjdCBzdHYwMjg4X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJaW50IGlkOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHYwMjg4X3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKKwlzdGF0ZS0+dHVuZXJfZnJlcXVlbmN5ID0gMDsKKwlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOworCXN0YXRlLT5mZWNfaW5uZXIgPSAwOworCXN0YXRlLT5lcnJtb2RlID0gU1RBVFVTX0JFUjsKKworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDQxLCAweDA0KTsKKwltc2xlZXAoMjAwKTsKKwlpZCA9IHN0djAyODhfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CisJZHByaW50aygic3R2MDI4OCBpZCAleFxuIiwgaWQpOworCisJLyogcmVnaXN0ZXIgMHgwMCBjb250YWlucyAweDExIGZvciBTVFYwMjg4ICAqLworCWlmIChpZCAhPSAweDExKQorCQlnb3RvIGVycm9yOworCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnN0djAyODhfb3BzLAorCQkJc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKKworZXJyb3I6CisJa2ZyZWUoc3RhdGUpOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHN0djAyODhfYXR0YWNoKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnX2xlZ2FjeV9kaXNoX3N3aXRjaCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoLAorCQkiRW5hYmxlIHRpbWluZyBhbmFseXNpcyBmb3IgRGlzaCBOZXR3b3JrIGxlZ2FjeSBzd2l0Y2hlcyIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU1QgU1RWMDI4OCBEVkIgRGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJHZW9yZyBBY2hlciwgQm9iIExpdSwgSWdvciBsaXBsaWFuaW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyODguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiNTNkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKwlEcml2ZXIgZm9yIFNUIFNUVjAyODggZGVtb2R1bGF0b3IKKworCUNvcHlyaWdodCAoQykgMjAwNiBHZW9yZyBBY2hlciwgQmF5Q29tIEdtYkgsIGFjaGVyIChhdCkgYmF5Y29tIChkb3QpIGRlCisJCWZvciBSZWVsIE11bHRpbWVkaWEKKwlDb3B5cmlnaHQgKEMpIDIwMDggVHVyYm9TaWdodC5jb20sIDxib2JAdHVyYm9zaWdodC5jb20+CisJQ29weXJpZ2h0IChDKSAyMDA4IElnb3IgTS4gTGlwbGlhbmluIDxsaXBsaWFuaW5AbWUuYnk+CisJCVJlbW92ZWQgc3RiNjAwMCBzcGVjaWZpYyB0dW5lciBjb2RlIGFuZCByZXZpc2VkIHNvbWUKKwkJcHJvY2VkdXJlcy4KKworCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKwl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKwlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIFNUVjAyODhfSAorI2RlZmluZSBTVFYwMjg4X0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCitzdHJ1Y3Qgc3R2MDI4OF9jb25maWcgeworCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKKworCXU4KiBpbml0dGFiOworCisJLyogbWluaW11bSBkZWxheSBiZWZvcmUgcmV0dW5pbmcgKi8KKwlpbnQgbWluX2RlbGF5X21zOworCisJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBpc19wdW5jdHVyZWQpOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjg4KSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyODhfTU9EVUxFKSAmJiBcCisJCQkJCQkJZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnN0djAyODhfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjg4X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpzdHYwMjg4X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI4OF9jb25maWcgKmNvbmZpZywKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9TVFYwMjg4ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHN0djAyODhfd3JpdGVyZWcoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IHJlZywgdTggdmFsKQoreworCWludCByID0gMDsKKwl1OCBidWZbXSA9IHsgcmVnLCB2YWwgfTsKKwlpZiAoZmUtPm9wcy53cml0ZSkKKwkJciA9IGZlLT5vcHMud3JpdGUoZmUsIGJ1ZiwgMik7CisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZiAvKiBTVFYwMjg4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCmluZGV4IDM1NDM1YmUuLjZjMWNiMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYwpAQCAtNTU5LDYgKzU1OSw4IEBACiAJaW50IGludnZhbCA9IDA7CiAKIAlkcHJpbnRrICgiJXMgOiBGRV9TRVRfRlJPTlRFTkRcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcykKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CiAKIAkvLyBzZXQgdGhlIGludmVyc2lvbgogCWlmIChwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09GRikgaW52dmFsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCmluZGV4IDMyODJmNDMuLjBmZDk2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaApAQCAtODksMTUgKzg5LDE4IEBACiAJaW50IG1pbl9kZWxheV9tczsKIAogCS8qIFNldCB0aGUgc3ltYm9sIHJhdGUgKi8KLQlpbnQgKCpzZXRfc3ltYm9sX3JhdGUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgc3JhdGUsIHUzMiByYXRpbyk7CisJaW50ICgqc2V0X3N5bWJvbF9yYXRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pOworCisJLyogU2V0IGRldmljZSBwYXJhbSB0byBzdGFydCBkbWEgKi8KKwlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGlzX3B1bmN0dXJlZCk7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyOTkpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5OV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLWV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKLQkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnN0djAyOTlfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk5X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7CiAjZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKLQkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnN0djAyOTlfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk5X2NvbmZpZyAqY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGhkMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkaGQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMTcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGhkMS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiB0ZGhkMS5oIC0gQUxQUyBUREhEMS0yMDRBIHR1bmVyIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT2xpdmVyIEVuZHJpc3MgPG8uZW5kcmlzc0BnbXguZGU+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICoKKyAqCisgKiBUaGUgcHJvamVjdCdzIHBhZ2UgaXMgYXQgaHR0cDovL3d3dy5saW51eHR2Lm9yZworICovCisKKyNpZm5kZWYgVERIRDFfSAorI2RlZmluZSBUREhEMV9ICisKKyNpbmNsdWRlICJ0ZGExMDA0eC5oIgorCitzdGF0aWMgaW50IGFscHNfdGRoZDFfMjA0X3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyICpuYW1lKTsKKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgYWxwc190ZGhkMV8yMDRhX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKKwkuaW52ZXJ0ID0gMSwKKwkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAorCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCisJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBhbHBzX3RkaGQxXzIwNF9yZXF1ZXN0X2Zpcm13YXJlCit9OworCitzdGF0aWMgaW50IGFscHNfdGRoZDFfMjA0YV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9IGZlLT50dW5lcl9wcml2OworCXU4IGRhdGFbNF07CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07CisJdTMyIGRpdjsKKworCWRpdiA9IChwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTY2NjY2KSAvIDE2NjY2NjsKKworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHg4NTsKKworCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSAxNzQwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gMjMwMDAwMDAwKQorCQlkYXRhWzNdID0gMHgwMjsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0NzAwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gODIzMDAwMDAwKQorCQlkYXRhWzNdID0gMHgwQzsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IDgyMzAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSA4NjIwMDAwMDApCisJCWRhdGFbM10gPSAweDhDOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogVERIRDFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zLWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYwppbmRleCBjYzVlZmI2Li45ZGEyNjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYwpAQCAtNDAsNiArNDAsOCBAQAogCQkuZHJpdmVyX2luZm8gPSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9PS0VNT19CIH0sCiAJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg1NTAwKSwKIAkJLmRyaXZlcl9pbmZvID0gU01TMVhYWF9CT0FSRF9IQVVQUEFVR0VfV0lOREhBTSB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NTUxMCksCisJCS5kcml2ZXJfaW5mbyA9IFNNUzFYWFhfQk9BUkRfSEFVUFBBVUdFX1dJTkRIQU0gfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDU1ODApLAogCQkuZHJpdmVyX2luZm8gPSBTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9XSU5ESEFNIH0sCiAJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg1NTkwKSwKQEAgLTg3LDcgKzg5LDcgQEAKIAkJLmZ3W0RFVklDRV9NT0RFX0RWQlRfQkRBXSA9ICJzbXMxeHh4LW5vdmEtYi1kdmJ0LTAxLmZ3IiwKIAl9LAogCVtTTVMxWFhYX0JPQVJEX0hBVVBQQVVHRV9XSU5ESEFNXSA9IHsKLQkJLm5hbWUJPSAiSGF1cHBhdWdlIFdpblRWLU5vdmEtVC1NaW5pU3RpY2siLAorCQkubmFtZQk9ICJIYXVwcGF1Z2UgV2luVFYgTWluaVN0aWNrIiwKIAkJLnR5cGUJPSBTTVNfTk9WQV9CMCwKIAkJLmZ3W0RFVklDRV9NT0RFX0RWQlRfQkRBXSA9ICJzbXMxeHh4LWhjdy01NXh4eC1kdmJ0LTAxLmZ3IiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKaW5kZXggNDFiNWE5OC4uODY3MDI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCkBAIC04Niw2ICs4Niw3IEBACiAJc2VsZWN0IERWQl9UREExMDA4NiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBODI2WCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTE5CUDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREExMDA0WCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHNpbXBsZSBTQUE3MTQ2IGJhc2VkIERWQiBjYXJkcyAoc28gY2FsbGVkIEJ1ZGdldC0KIAkgIG9yIE5vdmEtUENJIGNhcmRzKSB3aXRob3V0IG9uYm9hcmQgTVBFRzIgZGVjb2RlciwgYW5kIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggMDc3N2U4Zi4uYzdjNzcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTg4LDYgKzg4LDcgQEAKIHN0YXRpYyBpbnQgd3NzX2NmZ180XzMgPSAweDQwMDg7CiBzdGF0aWMgaW50IHdzc19jZmdfMTZfOSA9IDB4MDAwNzsKIHN0YXRpYyBpbnQgdHZfc3RhbmRhcmQ7CitzdGF0aWMgaW50IGZ1bGxfdHM7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYXY3MTEwX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsIChiaXRtYXNrLCBkZWZhdWx0IDApIik7CkBAIC0xMDYsNiArMTA3LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Modm9sdW1lLCAiaW5pdGlhbCB2b2x1bWU6IGRlZmF1bHQgMjU1IChyYW5nZSAwLTI1NSkiKTsKIG1vZHVsZV9wYXJhbShidWRnZXRwYXRjaCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYnVkZ2V0cGF0Y2gsICJ1c2UgYnVkZ2V0LXBhdGNoIGhhcmR3YXJlIG1vZGlmaWNhdGlvbjogZGVmYXVsdCAwICgwIG5vLCAxIGF1dG9kZXRlY3QsIDIgYWx3YXlzKSIpOworbW9kdWxlX3BhcmFtKGZ1bGxfdHMsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfdHMsICJlbmFibGUgY29kZSBmb3IgZnVsbC10cyBoYXJkd2FyZSBtb2RpZmljYXRpb246IDAgZGlzYWJsZSAoZGVmYXVsdCksIDEgZW5hYmxlIik7CiBtb2R1bGVfcGFyYW0od3NzX2NmZ180XzMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdzc19jZmdfNF8zLCAiV1NTIDQ6MyAtIGRlZmF1bHQgMHg0MDA4IC0gYml0IDE1OiBkaXNhYmxlLCAxNDogYnVyc3QgbW9kZSwgMTMuLjA6IHdzcyBkYXRhIik7CiBtb2R1bGVfcGFyYW0od3NzX2NmZ18xNl85LCBpbnQsIDA0NDQpOwpAQCAtMTE2LDYgKzExOSw4IEBACiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKIAogc3RhdGljIHZvaWQgcmVzdGFydF9mZWVkcyhzdHJ1Y3QgYXY3MTEwICphdjcxMTApOworc3RhdGljIGludCBidWRnZXRfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpOworc3RhdGljIGludCBidWRnZXRfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCk7CiAKIHN0YXRpYyBpbnQgYXY3MTEwX251bTsKIApAQCAtMzc2LDkgKzM4MSw5IEBACiAJCWlyZGViaShhdjcxMTAsIERFQklTV0FCLCBhZGRyLCAwLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBkZWJpaXJxKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGRlYmlpcnEodW5zaWduZWQgbG9uZyBjb29raWUpCiB7Ci0Jc3RydWN0IGF2NzExMCAqYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAgKikgZGF0YTsKKwlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKWNvb2tpZTsKIAlpbnQgdHlwZSA9IGF2NzExMC0+ZGViaXR5cGU7CiAJaW50IGhhbmRsZSA9ICh0eXBlID4+IDgpICYgMHgxZjsKIAl1bnNpZ25lZCBpbnQgeGZlciA9IDA7CkBAIC00ODcsOSArNDkyLDkgQEAKIH0KIAogLyogaXJxIGZyb20gYXY3MTEwIGZpcm13YXJlIHdyaXRpbmcgdGhlIG1haWxib3ggcmVnaXN0ZXIgaW4gdGhlIERQUkFNICovCi1zdGF0aWMgdm9pZCBncGlvaXJxKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGdwaW9pcnEodW5zaWduZWQgbG9uZyBjb29raWUpCiB7Ci0Jc3RydWN0IGF2NzExMCAqYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAgKikgZGF0YTsKKwlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKWNvb2tpZTsKIAl1MzIgcnhidWYsIHR4YnVmOwogCWludCBsZW47CiAKQEAgLTgwNiw2ICs4MTEsOSBAQAogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKKwlpZiAoYXY3MTEwLT5mdWxsX3RzKQorCQlyZXR1cm4gMDsKKwogCWlmIChkdmJkbXhmaWx0ZXItPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CiAJCWlmIChod19zZWN0aW9ucykgewogCQkJYnVmWzRdID0gKGR2YmRteGZpbHRlci0+ZmlsdGVyLmZpbHRlcl92YWx1ZVswXSA8PCA4KSB8CkBAIC04NTQsNiArODYyLDkgQEAKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCisJaWYgKGF2NzExMC0+ZnVsbF90cykKKwkJcmV0dXJuIDA7CisKIAloYW5kbGUgPSBkdmJkbXhmaWx0ZXItPmh3X2hhbmRsZTsKIAlpZiAoaGFuZGxlID49IDMyKSB7CiAJCXByaW50aygiJXMgdHJpZWQgdG8gc3RvcCBpbnZhbGlkIGZpbHRlciAlMDR4LCBmaWx0ZXIgdHlwZSA9ICV4XG4iLApAQCAtOTEzLDcgKzkyNCw3IEBACiAJCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JaWYgKChkdmJkbXhmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSkgeworCWlmICgoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkgJiYgIWF2NzExMC0+ZnVsbF90cykgewogCQlpZiAoZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gMCAmJiAhKGR2YmRteC0+cGlkc1swXSAmIDB4ODAwMCkpCiAJCQlyZXQgPSBhdjcxMTBfYXZfc3RhcnRfcmVjb3JkKGF2NzExMCwgUlBfQVVESU8sIGR2YmRteGZlZWQpOwogCQlpZiAoZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gMSAmJiAhKGR2YmRteC0+cGlkc1sxXSAmIDB4ODAwMCkpCkBAIC05NzQsNyArOTg1LDcgQEAKIAlpZiAoIWRlbXV4LT5kbXguZnJvbnRlbmQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGZlZWQtPnBpZCA+IDB4MWZmZikKKwlpZiAoIWF2NzExMC0+ZnVsbF90cyAmJiBmZWVkLT5waWQgPiAweDFmZmYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfVFMpIHsKQEAgLTEwMDMsNyArMTAxNCwxMiBAQAogCQl9CiAJfQogCi0JZWxzZSBpZiAoZmVlZC0+dHlwZSA9PSBETVhfVFlQRV9TRUMpIHsKKwlpZiAoYXY3MTEwLT5mdWxsX3RzKSB7CisJCWJ1ZGdldF9zdGFydF9mZWVkKGZlZWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZGVtdXgtPmZpbHRlcm51bTsgaSsrKSB7CkBAIC0xMDUwLDcgKzEwNjYsMTIgQEAKIAkJCQlyZXQgPSBTdG9wSFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKIAl9CiAKLQlpZiAoIXJldCAmJiBmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgeworCWlmIChhdjcxMTAtPmZ1bGxfdHMpIHsKKwkJYnVkZ2V0X3N0b3BfZmVlZChmZWVkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZmVlZC0+dHlwZSA9PSBETVhfVFlQRV9TRUMpIHsKIAkJZm9yIChpID0gMDsgaTxkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKIAkJCWlmIChkZW11eC0+ZmlsdGVyW2ldLnN0YXRlID09IERNWF9TVEFURV9HTyAmJgogCQkJICAgIGRlbXV4LT5maWx0ZXJbaV0uZmlsdGVyLnBhcmVudCA9PSAmZmVlZC0+ZmVlZC5zZWMpIHsKQEAgLTEwNzQsNiArMTA5NSw3IEBACiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gJmF2NzExMC0+ZGVtdXg7CiAJc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkOwogCWludCBtb2RlOworCWludCBmZWVkaW5nOwogCWludCBpLCBqOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CkBAIC0xMDgyLDYgKzExMDQsOCBAQAogCWF2NzExMC0+cGxheWluZyA9IDA7CiAJYXY3MTEwLT5yZWNfbW9kZSA9IDA7CiAKKwlmZWVkaW5nID0gYXY3MTEwLT5mZWVkaW5nMTsgLyogZnVsbF90cyBtb2QgKi8KKwogCWZvciAoaSA9IDA7IGkgPCBkdmJkbXgtPmZlZWRudW07IGkrKykgewogCQlmZWVkID0gJmR2YmRteC0+ZmVlZFtpXTsKIAkJaWYgKGZlZWQtPnN0YXRlID09IERNWF9TVEFURV9HTykgewpAQCAtMTA5OSw2ICsxMTIzLDggQEAKIAkJfQogCX0KIAorCWF2NzExMC0+ZmVlZGluZzEgPSBmZWVkaW5nOyAvKiBmdWxsX3RzIG1vZCAqLworCiAJaWYgKG1vZGUpCiAJCWF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgbW9kZSk7CiB9CkBAIC0xMTk3LDggKzEyMjMsOSBAQAogCiAJaWYgKGJ1ZGdldC0+ZmVlZGluZzEpCiAJCXJldHVybiArK2J1ZGdldC0+ZmVlZGluZzE7Ci0JbWVtc2V0KGJ1ZGdldC0+Z3JhYmJpbmcsIDB4MDAsIFRTX0hFSUdIVCAqIFRTX1dJRFRIKTsKKwltZW1zZXQoYnVkZ2V0LT5ncmFiYmluZywgMHgwMCwgVFNfQlVGTEVOKTsKIAlidWRnZXQtPnR0YnAgPSAwOworCVNBQTcxNDZfSVNSX0NMRUFSKGJ1ZGdldC0+ZGV2LCBNQVNLXzEwKTsgIC8qIFZQRSAqLwogCVNBQTcxNDZfSUVSX0VOQUJMRShidWRnZXQtPmRldiwgTUFTS18xMCk7IC8qIFZQRSAqLwogCXNhYTcxNDZfd3JpdGUoYnVkZ2V0LT5kZXYsIE1DMSwgKE1BU0tfMDQgfCBNQVNLXzIwKSk7IC8qIERNQTMgb24gKi8KIAlyZXR1cm4gKytidWRnZXQtPmZlZWRpbmcxOwpAQCAtMTIzMywxOCArMTI2MCwxNCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIHZwZWlycSh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCB2cGVpcnEodW5zaWduZWQgbG9uZyBjb29raWUpCiB7Ci0Jc3RydWN0IGF2NzExMCAqYnVkZ2V0ID0gKHN0cnVjdCBhdjcxMTAgKikgZGF0YTsKKwlzdHJ1Y3QgYXY3MTEwICpidWRnZXQgPSAoc3RydWN0IGF2NzExMCAqKWNvb2tpZTsKIAl1OCAqbWVtID0gKHU4ICopIChidWRnZXQtPmdyYWJiaW5nKTsKIAl1MzIgb2xkZG1hID0gYnVkZ2V0LT50dGJwOwogCXUzMiBuZXdkbWEgPSBzYWE3MTQ2X3JlYWQoYnVkZ2V0LT5kZXYsIFBDSV9WRFAzKTsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGJ1ZGdldC0+ZnVsbF90cyA/ICZidWRnZXQtPmRlbXV4IDogJmJ1ZGdldC0+ZGVtdXgxOwogCi0JaWYgKCFidWRnZXRwYXRjaCkgewotCQlwcmludGsoImF2NzExMC5jOiB2cGVpcnEoKSBjYWxsZWQgd2hpbGUgYnVkZ2V0cGF0Y2ggZGlzYWJsZWQhIgotCQkgICAgICAgIiBjaGVjayBzYWE3MTQ2IElFUiByZWdpc3RlclxuIik7Ci0JCUJVRygpOwotCX0KIAkvKiBuZWFyZXN0IGxvd2VyIHBvc2l0aW9uIGRpdmlzaWJsZSBieSAxODggKi8KIAluZXdkbWEgLT0gbmV3ZG1hICUgMTg4OwogCkBAIC0xMjY4LDExICsxMjkxLDExIEBACiAKIAlpZiAobmV3ZG1hID4gb2xkZG1hKQogCQkvKiBubyB3cmFwYXJvdW5kLCBkdW1wIG9sZGRtYS4ubmV3ZG1hICovCi0JCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cygmYnVkZ2V0LT5kZW11eDEsIG1lbSArIG9sZGRtYSwgKG5ld2RtYSAtIG9sZGRtYSkgLyAxODgpOworCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoZGVtdXgsIG1lbSArIG9sZGRtYSwgKG5ld2RtYSAtIG9sZGRtYSkgLyAxODgpOwogCWVsc2UgewogCQkvKiB3cmFwYXJvdW5kLCBkdW1wIG9sZGRtYS4uYnVmbGVuIGFuZCAwLi5uZXdkbWEgKi8KLQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKCZidWRnZXQtPmRlbXV4MSwgbWVtICsgb2xkZG1hLCAoVFNfQlVGTEVOIC0gb2xkZG1hKSAvIDE4OCk7Ci0JCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cygmYnVkZ2V0LT5kZW11eDEsIG1lbSwgbmV3ZG1hIC8gMTg4KTsKKwkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKGRlbXV4LCBtZW0gKyBvbGRkbWEsIChUU19CVUZMRU4gLSBvbGRkbWEpIC8gMTg4KTsKKwkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKGRlbXV4LCBtZW0sIG5ld2RtYSAvIDE4OCk7CiAJfQogfQogCkBAIC0xMjk0LDggKzEzMTcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQogCQlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaV0gPSBOVUxMOwogCi0JZHZiZGVtdXgtPmZpbHRlcm51bSA9IDMyOwotCWR2YmRlbXV4LT5mZWVkbnVtID0gMzI7CisJZHZiZGVtdXgtPmZpbHRlcm51bSA9IChhdjcxMTAtPmZ1bGxfdHMpID8gMjU2IDogMzI7CisJZHZiZGVtdXgtPmZlZWRudW0gPSAoYXY3MTEwLT5mdWxsX3RzKSA/IDI1NiA6IDMyOwogCWR2YmRlbXV4LT5zdGFydF9mZWVkID0gYXY3MTEwX3N0YXJ0X2ZlZWQ7CiAJZHZiZGVtdXgtPnN0b3BfZmVlZCA9IGF2NzExMF9zdG9wX2ZlZWQ7CiAJZHZiZGVtdXgtPndyaXRlX3RvX2RlY29kZXIgPSBhdjcxMTBfd3JpdGVfdG9fZGVjb2RlcjsKQEAgLTEzMDUsNyArMTMyOCw3IEBACiAJZHZiX2RteF9pbml0KCZhdjcxMTAtPmRlbXV4KTsKIAlhdjcxMTAtPmRlbXV4LmRteC5nZXRfc3RjID0gZHZiX2dldF9zdGM7CiAKLQlhdjcxMTAtPmRteGRldi5maWx0ZXJudW0gPSAzMjsKKwlhdjcxMTAtPmRteGRldi5maWx0ZXJudW0gPSAoYXY3MTEwLT5mdWxsX3RzKSA/IDI1NiA6IDMyOwogCWF2NzExMC0+ZG14ZGV2LmRlbXV4ID0gJmR2YmRlbXV4LT5kbXg7CiAJYXY3MTEwLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKIApAQCAtMTQyMiw3ICsxNDQ1LDYgQEAKIAlyZXR1cm4gaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNncywgMSk7CiB9CiAKLSNpZiAwCiB1OCBpMmNfcmVhZHJlZyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGlkLCB1OCByZWcpCiB7CiAJdTggbW0xW10gPSB7MHgwMH07CkBAIC0xNDM5LDcgKzE0NjEsNiBAQAogCiAJcmV0dXJuIG1tMlswXTsKIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSU5JVElBTElaQVRJT04KQEAgLTIyNTYsNyArMjI3Nyw3IEBACiAJaWYgKCFhdjcxMTAtPmZlKSB7CiAJCS8qIEZJWE1FOiBwcm9wYWdhdGUgdGhlIGZhaWx1cmUgY29kZSBmcm9tIHRoZSBsb3dlciBsYXllcnMgKi8KIAkJcmV0ID0gLUVOT01FTTsKLQkJcHJpbnRrKCJkdmItdHRwY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKKwkJcHJpbnRrKCJkdmItdHRwY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSBbJTA0eDolMDR4XSBzdWJzeXN0ZW0gWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBhdjcxMTAtPmRldi0+cGNpLT52ZW5kb3IsCiAJCSAgICAgICBhdjcxMTAtPmRldi0+cGNpLT5kZXZpY2UsCiAJCSAgICAgICBhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLApAQCAtMjQ4NCw3ICsyNTA1LDQ3IEBACiAJCQkgICAgICAgYXY3MTEwLT5kdmJfYWRhcHRlci5wcm9wb3NlZF9tYWMpOwogCXJldCA9IC1FTk9NRU07CiAKLQlpZiAoYnVkZ2V0cGF0Y2gpIHsKKwkvKiBmdWxsLXRzIG1vZD8gKi8KKwlpZiAoZnVsbF90cykKKwkJYXY3MTEwLT5mdWxsX3RzID0gdHJ1ZTsKKworCS8qIGNoZWNrIGZvciBmdWxsLXRzIGZsYWcgaW4gZWVwcm9tICovCisJaWYgKGkyY19yZWFkcmVnKGF2NzExMCwgMHhhYSwgMCkgPT0gMHg0ZiAmJiBpMmNfcmVhZHJlZyhhdjcxMTAsIDB4YWEsIDEpID09IDB4NDUpIHsKKwkJdTggZmxhZ3MgPSBpMmNfcmVhZHJlZyhhdjcxMTAsIDB4YWEsIDIpOworCQlpZiAoZmxhZ3MgIT0gMHhmZiAmJiAoZmxhZ3MgJiAweDAxKSkKKwkJCWF2NzExMC0+ZnVsbF90cyA9IHRydWU7CisJfQorCisJaWYgKGF2NzExMC0+ZnVsbF90cykgeworCQlwcmludGsoS0VSTl9JTkZPICJkdmItdHRwY2k6IGZ1bGwtdHMgbW9kZSBlbmFibGVkIGZvciBzYWE3MTQ2IHBvcnQgQlxuIik7CisJCXNwaW5fbG9ja19pbml0KCZhdjcxMTAtPmZlZWRsb2NrMSk7CisJCWF2NzExMC0+Z3JhYmJpbmcgPSBzYWE3MTQ2X3ZtYWxsb2NfYnVpbGRfcGd0YWJsZShwZGV2LCBsZW5ndGgsCisJCQkJCQkJCSAmYXY3MTEwLT5wdCk7CisJCWlmICghYXY3MTEwLT5ncmFiYmluZykKKwkJCWdvdG8gZXJyX2kyY19kZWxfMzsKKworCQlzYWE3MTQ2X3dyaXRlKGRldiwgREQxX1NUUkVBTV9CLCAweDAwMDAwMDAwKTsKKwkJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMTAgfCBNQVNLXzI2KSk7CisKKwkJc2FhNzE0Nl93cml0ZShkZXYsIEREMV9JTklULCAweDAwMDAwNjAwKTsKKwkJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDkgfCBNQVNLXzI1IHwgTUFTS18xMCB8IE1BU0tfMjYpKTsKKworCQlzYWE3MTQ2X3dyaXRlKGRldiwgQlJTX0NUUkwsIDB4NjAwMDAwMDApOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCBNQVNLXzA4IHwgTUFTS18yNCk7CisKKwkJLyogZG1hMyAqLworCQlzYWE3MTQ2X3dyaXRlKGRldiwgUENJX0JUX1YxLCAweDAwMWMwMDAwIHwgKHNhYTcxNDZfcmVhZChkZXYsIFBDSV9CVF9WMSkgJiB+MHgwMDFmMDAwMCkpOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgQkFTRV9PREQzLCAwKTsKKwkJc2FhNzE0Nl93cml0ZShkZXYsIEJBU0VfRVZFTjMsIDApOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgUFJPVF9BRERSMywgVFNfV0lEVEggKiBUU19IRUlHSFQpOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgUElUQ0gzLCBUU19XSURUSCk7CisJCXNhYTcxNDZfd3JpdGUoZGV2LCBCQVNFX1BBR0UzLCBhdjcxMTAtPnB0LmRtYSB8IE1FMSB8IDB4OTApOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgTlVNX0xJTkVfQllURTMsIChUU19IRUlHSFQgPDwgMTYpIHwgVFNfV0lEVEgpOworCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCBNQVNLXzA0IHwgTUFTS18yMCk7CisKKwkJdGFza2xldF9pbml0KCZhdjcxMTAtPnZwZV90YXNrbGV0LCB2cGVpcnEsICh1bnNpZ25lZCBsb25nKSBhdjcxMTApOworCisJfSBlbHNlIGlmIChidWRnZXRwYXRjaCkgewogCQlzcGluX2xvY2tfaW5pdCgmYXY3MTEwLT5mZWVkbG9jazEpOwogCQlhdjcxMTAtPmdyYWJiaW5nID0gc2FhNzE0Nl92bWFsbG9jX2J1aWxkX3BndGFibGUocGRldiwgbGVuZ3RoLAogCQkJCQkJCQkgJmF2NzExMC0+cHQpOwpAQCAtMjcxMCwxMSArMjc3MSwxMyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVl9NT0RVTEUpCiAJYXY3MTEwX2lyX2V4aXQoYXY3MTEwKTsKICNlbmRpZgotCWlmIChidWRnZXRwYXRjaCkgewotCQkvKiBEaXNhYmxlIFJQUzEgKi8KLQkJc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgTUFTS18yOSk7Ci0JCS8qIFZTWU5DIExPVyAoaW5hY3RpdmUpICovCi0JCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7CisJaWYgKGJ1ZGdldHBhdGNoIHx8IGF2NzExMC0+ZnVsbF90cykgeworCQlpZiAoYnVkZ2V0cGF0Y2gpIHsKKwkJCS8qIERpc2FibGUgUlBTMSAqLworCQkJc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgTUFTS18yOSk7CisJCQkvKiBWU1lOQyBMT1cgKGluYWN0aXZlKSAqLworCQkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsKKwkJfQogCQlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBNQVNLXzIwKTsJLyogRE1BMyBvZmYgKi8KIAkJU0FBNzE0Nl9JRVJfRElTQUJMRShzYWEsIE1BU0tfMTApOwogCQlTQUE3MTQ2X0lTUl9DTEVBUihzYWEsIE1BU0tfMTApOwpAQCAtMjc5NCw3ICsyODU3LDcgQEAKIAkJdGFza2xldF9zY2hlZHVsZSgmYXY3MTEwLT5ncGlvX3Rhc2tsZXQpOwogCX0KIAotCWlmICgoKmlzciAmIE1BU0tfMTApICYmIGJ1ZGdldHBhdGNoKQorCWlmICgqaXNyICYgTUFTS18xMCkKIAkJdGFza2xldF9zY2hlZHVsZSgmYXY3MTEwLT52cGVfdGFza2xldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKaW5kZXggNTVmMjNkZC4uZDg1Yjg1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKQEAgLTE5Miw2ICsxOTIsNyBAQAogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICpncmFiYmluZzsKIAlzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlICBwdDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICB2cGVfdGFza2xldDsKKwlib29sCQkJZnVsbF90czsKIAogCWludAkJCWZlX3N5bmNlZDsKIAlzdHJ1Y3QgbXV0ZXgJCXBpZF9tdXRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggMTg0NjQ3YWQuLmJkYzYyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jCkBAIC03ODgsNiArNzg4LDkgQEAKIAogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCisJaWYgKGF2NzExMC0+ZnVsbF90cyAmJiBkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkKKwkJcmV0dXJuIDA7CisKIAlzd2l0Y2ggKGZlZWQtPnBlc190eXBlKSB7CiAJY2FzZSAwOgogCQlpZiAoYXY3MTEwLT5hdWRpb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gQVVESU9fU09VUkNFX01FTU9SWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggYjdkMWYyZi4uMTAzMmVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTU3LDYgKzU3LDggQEAKICNkZWZpbmUgU0xPVFNUQVRVU19SRUFEWSAgICAgICAgOAogI2RlZmluZSBTTE9UU1RBVFVTX09DQ1VQSUVEICAgICAoU0xPVFNUQVRVU19QUkVTRU5UfFNMT1RTVEFUVVNfUkVTRVR8U0xPVFNUQVRVU19SRUFEWSkKIAorRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKIHN0cnVjdCBidWRnZXRfYXYgewogCXN0cnVjdCBidWRnZXQgYnVkZ2V0OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkOwpAQCAtMTA0OSw3ICsxMDUxLDcgQEAKIAogCWlmIChmZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kICIKLQkJCQkiZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKKwkJCQkiZm9yIGRldmljZSBbJTA0eDolMDR4XSBzdWJzeXN0ZW0gWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBzYWEtPnBjaS0+dmVuZG9yLAogCQkgICAgICAgc2FhLT5wY2ktPmRldmljZSwKIAkJICAgICAgIHNhYS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLApAQCAtMTEyNyw3ICsxMTI5LDkgQEAKIAogCWRldi0+ZXh0X3ByaXYgPSBidWRnZXRfYXY7CiAKLQlpZiAoKGVyciA9IHR0cGNpX2J1ZGdldF9pbml0KCZidWRnZXRfYXYtPmJ1ZGdldCwgZGV2LCBpbmZvLCBUSElTX01PRFVMRSkpKSB7CisJZXJyID0gdHRwY2lfYnVkZ2V0X2luaXQoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBkZXYsIGluZm8sIFRISVNfTU9EVUxFLAorCQkJCWFkYXB0ZXJfbnIpOworCWlmIChlcnIpIHsKIAkJa2ZyZWUoYnVkZ2V0X2F2KTsKIAkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCmluZGV4IDA2MGU3YzcuLjBhNWFhZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCkBAIC05Miw2ICs5Miw4IEBACiBtb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCAiZW5hYmxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgSVIgZGVjb2RpbmciKTsKIAorRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKIHN0cnVjdCBidWRnZXRfY2lfaXIgewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgbXNwNDMwX2lycV90YXNrbGV0OwpAQCAtMTE1Myw3ICsxMTU1LDcgQEAKIAl9CiAKIAlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID09IE5VTEwpIHsKLQkJcHJpbnRrKCJidWRnZXQtY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKKwkJcHJpbnRrKCJidWRnZXQtY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSBbJTA0eDolMDR4XSBzdWJzeXN0ZW0gWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBidWRnZXRfY2ktPmJ1ZGdldC5kZXYtPnBjaS0+dmVuZG9yLAogCQkgICAgICAgYnVkZ2V0X2NpLT5idWRnZXQuZGV2LT5wY2ktPmRldmljZSwKIAkJICAgICAgIGJ1ZGdldF9jaS0+YnVkZ2V0LmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLApAQCAtMTE4Myw3ICsxMTg1LDggQEAKIAogCWRldi0+ZXh0X3ByaXYgPSBidWRnZXRfY2k7CiAKLQllcnIgPSB0dHBjaV9idWRnZXRfaW5pdCgmYnVkZ2V0X2NpLT5idWRnZXQsIGRldiwgaW5mbywgVEhJU19NT0RVTEUpOworCWVyciA9IHR0cGNpX2J1ZGdldF9pbml0KCZidWRnZXRfY2ktPmJ1ZGdldCwgZGV2LCBpbmZvLCBUSElTX01PRFVMRSwKKwkJCQlhZGFwdGVyX25yKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCmluZGV4IDZmNGRkYjYuLmJhMThlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwpAQCAtNTcsOCArNTcsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGJ1ZGdldCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnVmc2l6ZSwgIkRNQSBidWZmZXIgc2l6ZSBpbiBLQiwgZGVmYXVsdDogMTg4LCBtaW46IDE4OCwgbWF4OiAxNDEwIChBY3Rpdnk6IDU2NCkiKTsKIAotRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUVCBidWRnZXQgLyBXaW5UViBOb3ZhCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxMSw3ICs0MDksNyBAQAogCiBpbnQgdHRwY2lfYnVkZ2V0X2luaXQoc3RydWN0IGJ1ZGdldCAqYnVkZ2V0LCBzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwKIAkJICAgICAgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhICppbmZvLAotCQkgICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcikKKwkJICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsIHNob3J0ICphZGFwdGVyX251bXMpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGJ1ZGdldF9pbmZvICpiaSA9IGluZm8tPmV4dF9wcml2OwpAQCAtNDc0LDcgKzQ3Miw3IEBACiAJcHJpbnRrKCIlczogZG1hIGJ1ZmZlciBzaXplICV1XG4iLCBidWRnZXQtPmRldi0+bmFtZSwgYnVkZ2V0LT5idWZmZXJfc2l6ZSk7CiAKIAlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmYnVkZ2V0LT5kdmJfYWRhcHRlciwgYnVkZ2V0LT5jYXJkLT5uYW1lLAotCQkJCSAgIG93bmVyLCAmYnVkZ2V0LT5kZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yKTsKKwkJCQkgICBvd25lciwgJmJ1ZGdldC0+ZGV2LT5wY2ktPmRldiwgYWRhcHRlcl9udW1zKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYwppbmRleCBhYTVlZDRlLi42MDEzNjY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKQEAgLTM5LDYgKzM5LDggQEAKIAogI2luY2x1ZGUgImJzcnU2LmgiCiAKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCiAjZGVmaW5lIGJ1ZGdldF9wYXRjaCBidWRnZXQKIAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBidWRnZXRfZXh0ZW5zaW9uOwpAQCAtMzYwLDcgKzM2Miw3IEBACiAJfQogCiAJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kID09IE5VTEwpIHsKLQkJcHJpbnRrKCJkdmItdHRwY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKKwkJcHJpbnRrKCJkdmItdHRwY2k6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSBbJTA0eDolMDR4XSBzdWJzeXN0ZW0gWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBidWRnZXQtPmRldi0+cGNpLT52ZW5kb3IsCiAJCSAgICAgICBidWRnZXQtPmRldi0+cGNpLT5kZXZpY2UsCiAJCSAgICAgICBidWRnZXQtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLApAQCAtNTkyLDggKzU5NCw5IEBACiAKIAlkcHJpbnRrKDIsICJidWRnZXQ6ICVwXG4iLCBidWRnZXQpOwogCi0JaWYgKChlcnIgPSB0dHBjaV9idWRnZXRfaW5pdCAoYnVkZ2V0LCBkZXYsIGluZm8sIFRISVNfTU9EVUxFKSkpIHsKLQkJa2ZyZWUgKGJ1ZGdldCk7CisJZXJyID0gdHRwY2lfYnVkZ2V0X2luaXQoYnVkZ2V0LCBkZXYsIGluZm8sIFRISVNfTU9EVUxFLCBhZGFwdGVyX25yKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGJ1ZGdldCk7CiAJCXJldHVybiBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jCmluZGV4IGYwMDY4OTkuLjE2MzhlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jCkBAIC00NiwxMSArNDYsMTQgQEAKICNpbmNsdWRlICJsbmJwMjEuaCIKICNpbmNsdWRlICJic3J1Ni5oIgogI2luY2x1ZGUgImJzYmUxLmgiCisjaW5jbHVkZSAidGRoZDEuaCIKIAogc3RhdGljIGludCBkaXNlcWNfbWV0aG9kOwogbW9kdWxlX3BhcmFtKGRpc2VxY19tZXRob2QsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc2VxY19tZXRob2QsICJTZWxlY3QgRGlTRXFDIG1ldGhvZCBmb3Igc3Vic3lzdGVtIGlkIDEzYzI6MTAwMywgMDogZGVmYXVsdCwgMTogbW9yZSByZWxpYWJsZSAoZm9yIG5ld2VyIHJldmlzaW9ucyBvbmx5KSIpOwogCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKwogc3RhdGljIHZvaWQgU2V0MjJLIChzdHJ1Y3QgYnVkZ2V0ICpidWRnZXQsIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldj1idWRnZXQtPmRldjsKQEAgLTM5MCw2ICszOTMsMTMgQEAKIAkuc2V0X3N5bWJvbF9yYXRlID0gYWxwc19ic2JlMV9zZXRfc3ltYm9sX3JhdGUsCiB9OwogCitzdGF0aWMgaW50IGFscHNfdGRoZDFfMjA0X3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopZmUtPmR2Yi0+cHJpdjsKKworCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCAmYnVkZ2V0LT5kZXYtPnBjaS0+ZGV2KTsKK30KKwogCiBzdGF0aWMgaW50IGkyY19yZWFkcmVnKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIsIHU4IHJlZykKIHsKQEAgLTUxMSw2ICs1MjEsMTQgQEAKIAkJfQogCQlicmVhazsKIAorCWNhc2UgMHg1ZjYwOiAvKiBGdWppdHN1IFNpZW1lbnMgQWN0aXZ5IEJ1ZGdldC1UIFBDSSByZXYgQUwgKHRkYTEwMDQ2L0FMUFMgVERIRDEtMjA0QSkgKi8KKwkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwgJmFscHNfdGRoZDFfMjA0YV9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc190ZGhkMV8yMDRhX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXQtPmkyY19hZGFwOworCQl9CisJCWJyZWFrOworCiAJY2FzZSAweDVmNjE6IC8qIEZ1aml0c3UgU2llbWVucyBBY3RpdnkgQnVkZ2V0LVQgUENJIHJldiBHUiAoTDY0NzgxL0dydW5kaWcgMjk1MDQtNDAxKHRzYTUwNjApKSAqLwogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IGR2Yl9hdHRhY2gobDY0NzgxX2F0dGFjaCwgJmdydW5kaWdfMjk1MDRfNDAxX2NvbmZpZ19hY3RpdnksICZidWRnZXQtPmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CkBAIC01NTAsNyArNTY4LDcgQEAKIAl9CiAKIAlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPT0gTlVMTCkgewotCQlwcmludGsoImJ1ZGdldDogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlICUwNHgvJTA0eCBzdWJzeXN0ZW0gJTA0eC8lMDR4XG4iLAorCQlwcmludGsoImJ1ZGdldDogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlIFslMDR4OiUwNHhdIHN1YnN5c3RlbSBbJTA0eDolMDR4XVxuIiwKIAkJICAgICAgIGJ1ZGdldC0+ZGV2LT5wY2ktPnZlbmRvciwKIAkJICAgICAgIGJ1ZGdldC0+ZGV2LT5wY2ktPmRldmljZSwKIAkJICAgICAgIGJ1ZGdldC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IsCkBAIC01ODIsNyArNjAwLDggQEAKIAogCWRldi0+ZXh0X3ByaXYgPSBidWRnZXQ7CiAKLQlpZiAoKGVyciA9IHR0cGNpX2J1ZGdldF9pbml0IChidWRnZXQsIGRldiwgaW5mbywgVEhJU19NT0RVTEUpKSkgeworCWVyciA9IHR0cGNpX2J1ZGdldF9pbml0KGJ1ZGdldCwgZGV2LCBpbmZvLCBUSElTX01PRFVMRSwgYWRhcHRlcl9ucik7CisJaWYgKGVycikgewogCQlwcmludGsoIj09PiBmYWlsZWRcbiIpOwogCQlrZnJlZSAoYnVkZ2V0KTsKIAkJcmV0dXJuIGVycjsKQEAgLTYyNCw2ICs2NDMsNyBAQAogTUFLRV9CVURHRVRfSU5GTyhmc2FjczAsICJGdWppdHN1IFNpZW1lbnMgQWN0aXZ5IEJ1ZGdldC1TIFBDSSAocmV2IEdSL2dydW5kaWcgZnJvbnRlbmQpIiwgQlVER0VUX0ZTX0FDVElWWSk7CiBNQUtFX0JVREdFVF9JTkZPKGZzYWNzMSwgIkZ1aml0c3UgU2llbWVucyBBY3RpdnkgQnVkZ2V0LVMgUENJIChyZXYgQUwvYWxwcyBmcm9udGVuZCkiLCBCVURHRVRfRlNfQUNUSVZZKTsKIE1BS0VfQlVER0VUX0lORk8oZnNhY3QsCSAiRnVqaXRzdSBTaWVtZW5zIEFjdGl2eSBCdWRnZXQtVCBQQ0kgKHJldiBHUi9HcnVuZGlnIGZyb250ZW5kKSIsIEJVREdFVF9GU19BQ1RJVlkpOworTUFLRV9CVURHRVRfSU5GTyhmc2FjdDEsICJGdWppdHN1IFNpZW1lbnMgQWN0aXZ5IEJ1ZGdldC1UIFBDSSAocmV2IEFML0FMUFMgVERIRDEtMjA0QSkiLCBCVURHRVRfRlNfQUNUSVZZKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRicywgIDB4MTNjMiwgMHgxMDAzKSwKQEAgLTYzNCw2ICs2NTQsNyBAQAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJzMTQwMSwgMHgxM2MyLCAweDEwMTgpLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczEsMHgxMTMxLCAweDRmNjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczAsMHgxMTMxLCAweDRmNjEpLAorCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjdDEsIDB4MTEzMSwgMHg1ZjYwKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koZnNhY3QsIDB4MTEzMSwgMHg1ZjYxKSwKIAl7CiAJCS52ZW5kb3IgICAgPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaAppbmRleCBkZDQ1MGI3Li44NjQzNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaApAQCAtMTA5LDcgKzEwOSw3IEBACiAKIGV4dGVybiBpbnQgdHRwY2lfYnVkZ2V0X2luaXQoc3RydWN0IGJ1ZGdldCAqYnVkZ2V0LCBzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwKIAkJCSAgICAgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhICppbmZvLAotCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CisJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyLCBzaG9ydCAqYWRhcHRlcl9udW1zKTsKIGV4dGVybiB2b2lkIHR0cGNpX2J1ZGdldF9pbml0X2hvb2tzKHN0cnVjdCBidWRnZXQgKmJ1ZGdldCk7CiBleHRlcm4gaW50IHR0cGNpX2J1ZGdldF9kZWluaXQoc3RydWN0IGJ1ZGdldCAqYnVkZ2V0KTsKIGV4dGVybiB2b2lkIHR0cGNpX2J1ZGdldF9pcnExMF9oYW5kbGVyKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCB1MzIgKiBpc3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKaW5kZXggZTZjOWNkMi4uNjZhYjBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCkBAIC0xNjE0LDcgKzE2MTQsNyBAQAogCX0KIAogCWlmICh0dHVzYi0+ZmUgPT0gTlVMTCkgewotCQlwcmludGsoImR2Yi10dHVzYi1idWRnZXQ6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHhcbiIsCisJCXByaW50aygiZHZiLXR0dXNiLWJ1ZGdldDogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlIFslMDR4OiUwNHhdXG4iLAogCQkgICAgICAgbGUxNl90b19jcHUodHR1c2ItPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCSAgICAgICBsZTE2X3RvX2NwdSh0dHVzYi0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKaW5kZXggZGU1ODI5Yi4uYWIzM2ZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwpAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAl9CiAKIAlpZiAoZGVjLT5mZSA9PSBOVUxMKSB7Ci0JCXByaW50aygiZHZiLXR0dXNiLWRlYzogQSBmcm9udGVuZCBkcml2ZXIgd2FzIG5vdCBmb3VuZCBmb3IgZGV2aWNlICUwNHgvJTA0eFxuIiwKKwkJcHJpbnRrKCJkdmItdHR1c2ItZGVjOiBBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgICBsZTE2X3RvX2NwdShkZWMtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkgICAgICAgbGUxNl90b19jcHUoZGVjLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwppbmRleCA0NDNhZjI0Li4yMTI2MGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKQEAgLTM4LDcgKzM4LDE3IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgdHR1c2JkZWNmZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3N0YXRpYyBpbnQgdHR1c2JkZWNmZV9kdmJzX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJKnN0YXR1cyA9IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfVklURVJCSSB8CisJCUZFX0hBU19TWU5DIHwgRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfTE9DSzsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHR0dXNiZGVjZmVfZHZidF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlmZV9zdGF0dXNfdCAqc3RhdHVzKQogewogCXN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IGJbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKQEAgLTI1MSw3ICsyNjEsNyBAQAogCiAJLmdldF90dW5lX3NldHRpbmdzID0gdHR1c2JkZWNmZV9kdmJ0X2dldF90dW5lX3NldHRpbmdzLAogCi0JLnJlYWRfc3RhdHVzID0gdHR1c2JkZWNmZV9yZWFkX3N0YXR1cywKKwkucmVhZF9zdGF0dXMgPSB0dHVzYmRlY2ZlX2R2YnRfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJzX29wcyA9IHsKQEAgLTI3Myw3ICsyODMsNyBAQAogCiAJLnNldF9mcm9udGVuZCA9IHR0dXNiZGVjZmVfZHZic19zZXRfZnJvbnRlbmQsCiAKLQkucmVhZF9zdGF0dXMgPSB0dHVzYmRlY2ZlX3JlYWRfc3RhdHVzLAorCS5yZWFkX3N0YXR1cyA9IHR0dXNiZGVjZmVfZHZic19yZWFkX3N0YXR1cywKIAogCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gdHR1c2JkZWNmZV9kdmJzX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQsCiAJLnNldF92b2x0YWdlID0gdHR1c2JkZWNmZV9kdmJzX3NldF92b2x0YWdlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCmluZGV4IDFiNDFiM2YuLmU1MWQ3MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKQEAgLTM2MSw0ICszNjEsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJhZGlvLXNpbGFicy4KIAorY29uZmlnIFVTQl9NUjgwMAorCXRyaXN0YXRlICJBdmVyTWVkaWEgTVIgODAwIFVTQiBGTSByYWRpbyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIHJhZGlvIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuIE5vdGUgdGhhdCB0aGUgYXVkaW8gaXMgbm90IGRpZ2l0YWwsIGFuZAorCSAgeW91IG11c3QgY29ubmVjdCB0aGUgbGluZSBvdXQgY29ubmVjdG9yIHRvIGEgc291bmQgY2FyZCBvciBhCisJICBzZXQgb2Ygc3BlYWtlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJhZGlvLW1yODAwLgorCiBlbmRpZiAjIFJBRElPX0FEQVBURVJTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQppbmRleCA3Y2E3MWFiLi4yNDBlYzYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCkBAIC0xOCw1ICsxOCw2IEBACiBvYmotJChDT05GSUdfUkFESU9fTUFFU1RSTykgKz0gcmFkaW8tbWFlc3Ryby5vCiBvYmotJChDT05GSUdfVVNCX0RTQlIpICs9IGRzYnIxMDAubwogb2JqLSQoQ09ORklHX1VTQl9TSTQ3MFgpICs9IHJhZGlvLXNpNDcweC5vCitvYmotJChDT05GSUdfVVNCX01SODAwKSArPSByYWRpby1tcjgwMC5vCiAKIEVYVFJBX0NGTEFHUyArPSAtSXNvdW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vZHNicjEwMC5jCmluZGV4IDcwYzY1YTcuLjY2NzgzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vZHNicjEwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vZHNicjEwMC5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCiB7Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDYsNyArMzA2LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlyYWRpby0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKIAlpZiAoZHNicjEwMF9zZXRmcmVxKHJhZGlvLCByYWRpby0+Y3VyZnJlcSk9PS0xKQpAQCAtMzE3LDcgKzMxNyw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gcmFkaW8tPmN1cmZyZXE7CkBAIC0zNDIsNyArMzQyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zNTUsMTYgKzM1NSwyMCBAQAogc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKIAkJaWYgKGN0cmwtPnZhbHVlKSB7Ci0JCQlpZiAoZHNicjEwMF9zdG9wKHJhZGlvKT09LTEpCisJCQlpZiAoZHNicjEwMF9zdG9wKHJhZGlvKSA9PSAtMSkgewogCQkJCXdhcm4oIlJhZGlvIGRpZCBub3QgcmVzcG9uZCBwcm9wZXJseSIpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoZHNicjEwMF9zdGFydChyYWRpbyk9PS0xKQorCQkJaWYgKGRzYnIxMDBfc3RhcnQocmFkaW8pID09IC0xKSB7CiAJCQkJd2FybigiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5Iik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KIAkJfQogCQlyZXR1cm4gMDsKIAl9CkBAIC00MDUsMjMgKzQwOSwyNiBAQAogCiBzdGF0aWMgaW50IHVzYl9kc2JyMTAwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbz12aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAorCWxvY2tfa2VybmVsKCk7CiAJcmFkaW8tPnVzZXJzID0gMTsKIAlyYWRpby0+bXV0ZWQgPSAxOwogCiAJaWYgKGRzYnIxMDBfc3RhcnQocmFkaW8pPDApIHsKIAkJd2FybigiUmFkaW8gZGlkIG5vdCBzdGFydCB1cCBwcm9wZXJseSIpOwogCQlyYWRpby0+dXNlcnMgPSAwOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbz12aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICghcmFkaW8pCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTA3LDcgKzUxNCw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBkc2JyMTAwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfZHNicjEwMF9kcml2ZXIpOwotCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJICAgICAgIERSSVZFUl9ERVNDICJcbiIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKaW5kZXggMWYwNjRmNC4uOTMwNWU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKQEAgLTUxLDYgKzUxLDcgQEAKIAogc3RydWN0IHJ0X2RldmljZQogeworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogCWludCBwb3J0OwogCWludCBjdXJ2b2w7CiAJdW5zaWduZWQgbG9uZyBjdXJmcmVxOwpAQCAtMjQ1LDggKzI0Niw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICh2LT5pbmRleCA+IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjczLDggKzI3Myw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJcnQtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJcnRfc2V0ZnJlcShydCwgcnQtPmN1cmZyZXEpOwpAQCAtMjg0LDggKzI4Myw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gcnQtPmN1cmZyZXE7CkBAIC0zMTAsOCArMzA4LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zMjcsOCArMzI0LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zNzgsMTAgKzM3NCwyMSBAQAogCiBzdGF0aWMgc3RydWN0IHJ0X2RldmljZSBydHJhY2tfdW5pdDsKIAorc3RhdGljIGludCBydHJhY2tfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnJ0cmFja191bml0LmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IHJ0cmFja19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJnJ0cmFja191bml0LmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0cmFja19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkub3BlbiAgICAgICAgICAgPSBydHJhY2tfZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gcnRyYWNrX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCkBAIC00MDgsNiArNDE1LDcgQEAKIAkubmFtZQkJPSAiUmFkaW9UcmFjayByYWRpbyIsCiAJLmZvcHMgICAgICAgICAgID0gJnJ0cmFja19mb3BzLAogCS5pb2N0bF9vcHMgCT0gJnJ0cmFja19pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJ0cmFja19pbml0KHZvaWQpCkBAIC00MjQsNyArNDMyLDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlydHJhY2tfcmFkaW8ucHJpdj0mcnRyYWNrX3VuaXQ7CisJdmlkZW9fc2V0X2RydmRhdGEoJnJ0cmFja19yYWRpbywgJnJ0cmFja191bml0KTsKIAogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnJ0cmFja19yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA8IDApIHsKIAkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKaW5kZXggNjI4YzY4OS4uZDc4NDg5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCkBAIC03MCw2ICs3MCw3IEBACiAKIHN0cnVjdCBhel9kZXZpY2UKIHsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIAlpbnQgY3Vydm9sOwogCXVuc2lnbmVkIGxvbmcgY3VyZnJlcTsKIAlpbnQgc3RlcmVvOwpAQCAtMTk1LDggKzE5Niw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBhel9kZXZpY2UgKmF6ID0gZGV2LT5wcml2OworCXN0cnVjdCBhel9kZXZpY2UgKmF6ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICh2LT5pbmRleCA+IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjY0LDggKzI2NCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGF6X2RldmljZSAqYXogPSBkZXYtPnByaXY7CisJc3RydWN0IGF6X2RldmljZSAqYXogPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJYXotPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJYXpfc2V0ZnJlcShheiwgYXotPmN1cmZyZXEpOwpAQCAtMjc1LDggKzI3NCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGF6X2RldmljZSAqYXogPSBkZXYtPnByaXY7CisJc3RydWN0IGF6X2RldmljZSAqYXogPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gYXotPmN1cmZyZXE7CkBAIC0zMDIsOCArMzAwLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBhel9kZXZpY2UgKmF6ID0gZGV2LT5wcml2OworCXN0cnVjdCBhel9kZXZpY2UgKmF6ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMzIyLDggKzMxOSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgYXpfZGV2aWNlICpheiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXpfZGV2aWNlICpheiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTM0MiwxMCArMzM4LDIxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXpfZGV2aWNlIGF6dGVjaF91bml0OwogCitzdGF0aWMgaW50IGF6dGVjaF9leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXp0ZWNoX3VuaXQuaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXp0ZWNoX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmYXp0ZWNoX3VuaXQuaW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXp0ZWNoX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5vcGVuICAgICAgICAgICA9IGF6dGVjaF9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBhenRlY2hfZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTM2OSw5ICszNzYsMTAgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGF6dGVjaF9yYWRpbyA9IHsKLQkubmFtZQkJICAgID0gIkF6dGVjaCByYWRpbyIsCi0JLmZvcHMgICAgICAgICAgICAgICA9ICZhenRlY2hfZm9wcywKLQkuaW9jdGxfb3BzIAkgICAgPSAmYXp0ZWNoX2lvY3RsX29wcywKKwkubmFtZQkJPSAiQXp0ZWNoIHJhZGlvIiwKKwkuZm9wcyAgICAgICAgICAgPSAmYXp0ZWNoX2ZvcHMsCisJLmlvY3RsX29wcyAJPSAmYXp0ZWNoX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGF6dGVjaF9yYWRpby5kZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTM5Miw3ICs0MDAsNyBAQAogCX0KIAogCW11dGV4X2luaXQoJmxvY2spOwotCWF6dGVjaF9yYWRpby5wcml2PSZhenRlY2hfdW5pdDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmYXp0ZWNoX3JhZGlvLCAmYXp0ZWNoX3VuaXQpOwogCiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmYXp0ZWNoX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpIDwgMCkgewogCQlyZWxlYXNlX3JlZ2lvbihpbywyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYwppbmRleCAwNGMzNjk4Li4wNDkwYTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCkBAIC01ODksNiArNTg5LDcgQEAKIAkubmFtZQkJPSAiQ2FkZXQgcmFkaW8iLAogCS5mb3BzICAgICAgICAgICA9ICZjYWRldF9mb3BzLAogCS5pb2N0bF9vcHMgCT0gJmNhZGV0X2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogI2lmZGVmIENPTkZJR19QTlAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKaW5kZXggNWNkN2YwMy4uZTE1YmVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKQEAgLTEwMCw5ICsxMDAsOCBAQAogCXU4ICBtdXRlOwogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHJhZGlvLWdlbXRlay1wY2kuYyx2IDEuMSAyMDAxLzA3LzIzIDA4OjA4OjE2IHRlZCBFeHAgdGVkICQiOwotCiBzdGF0aWMgaW50IG5yX3JhZGlvID0gLTE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbl91c2U7CiAKIHN0YXRpYyBpbmxpbmUgdTggZ2VtdGVrX3BjaV9vdXQoIHUxNiB2YWx1ZSwgdTMyIHBvcnQgKQogewpAQCAtMjA1LDggKzIwNCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAodi0+aW5kZXggPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzMyw4ICsyMzEsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAoIChmLT5mcmVxdWVuY3kgPCBHRU1URUtfUENJX1JBTkdFX0xPVykgfHwKIAkJCShmLT5mcmVxdWVuY3kgPiBHRU1URUtfUENJX1JBTkdFX0hJR0gpICkKQEAgLTI0OCw4ICsyNDUsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAlmLT5mcmVxdWVuY3kgPSBjYXJkLT5jdXJyZW50X2ZyZXF1ZW5jeTsKQEAgLTI3Myw4ICsyNjksNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZ2VtdGVrX3BjaV9jYXJkICpjYXJkID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0yOTMsOCArMjg4LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMzY0LDEwICszNTgsMjEgQEAKIAogc3RhdGljIGludCBteCA9IDE7CiAKK3N0YXRpYyBpbnQgZ2VtdGVrX3BjaV9leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtdGVrX3BjaV9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlbXRla19wY2lfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gZ2VtdGVrX3BjaV9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBnZW10ZWtfcGNpX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCkBAIC0zOTEsOSArMzk2LDEwIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2X3RlbXBsYXRlID0gewotCS5uYW1lICAgICAgICAgID0gIkdlbXRlayBQQ0kgUmFkaW8iLAotCS5mb3BzICAgICAgICAgID0gJmdlbXRla19wY2lfZm9wcywKLQkuaW9jdGxfb3BzICAgICA9ICZnZW10ZWtfcGNpX2lvY3RsX29wcywKKwkubmFtZSAgICAgICAgICAJPSAiR2VtdGVrIFBDSSBSYWRpbyIsCisJLmZvcHMgICAgICAgICAgCT0gJmdlbXRla19wY2lfZm9wcywKKwkuaW9jdGxfb3BzIAk9ICZnZW10ZWtfcGNpX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgZ2VtdGVrX3BjaV9wcm9iZSggc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQgKQpAQCAtNDMxLDcgKzQzNyw3IEBACiAJfQogCiAJY2FyZC0+dmlkZW9kZXYgPSBkZXZyYWRpbzsKLQlkZXZyYWRpby0+cHJpdiA9IGNhcmQ7CisJdmlkZW9fc2V0X2RydmRhdGEoZGV2cmFkaW8sIGNhcmQpOwogCWdlbXRla19wY2lfbXV0ZSggY2FyZCApOwogCiAJcHJpbnRrKCBLRVJOX0lORk8gIkdlbXRlayBQQ0kgUmFkaW8gKHJldi4gJWQpIGZvdW5kIGF0IDB4JTA0eC0weCUwNHguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKaW5kZXggMGEwZjk1Ni4uZDEzMWE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCkBAIC01Nyw2ICs1Nyw3IEBACiBzdGF0aWMgaW50IGtlZXBtdXRlZAk9IDE7CiBzdGF0aWMgaW50IGluaXRtdXRlCT0gMTsKIHN0YXRpYyBpbnQgcmFkaW9fbnIJPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluX3VzZTsKIAogbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbywgIkZvcmNlIEkvTyBwb3J0IGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQgaWYgYXV0b21hdGljICIKQEAgLTM5MywxMCArMzk0LDIxIEBACiAJfQogfTsKIAorc3RhdGljIGludCBnZW10ZWtfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IGdlbXRla19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlbXRla19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZQk9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5vcGVuCQk9IGdlbXRla19leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZQk9IGdlbXRla19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLApAQCAtNDQ3LDggKzQ1OSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBnZW10ZWtfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZ2VtdGVrX3NldGZyZXEocnQsIGYtPmZyZXF1ZW5jeSk7CiAKQEAgLTQ1OCw4ICs0NjksNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwogCWYtPmZyZXF1ZW5jeSA9IHJ0LT5sYXN0ZnJlcTsKQEAgLTQ4Myw4ICs0OTMsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IGdlbXRla19kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC01MDMsOCArNTEyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGdlbXRla19kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCXN0cnVjdCBnZW10ZWtfZGV2aWNlICpydCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtNTY5LDkgKzU3NywxMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZ2VtdGVrX3JhZGlvID0gewotCS5uYW1lCQkJPSAiR2VtVGVrIFJhZGlvIGNhcmQiLAotCS5mb3BzCQkJPSAmZ2VtdGVrX2ZvcHMsCi0JLmlvY3RsX29wcyAJCT0gJmdlbXRla19pb2N0bF9vcHMsCisJLm5hbWUJCT0gIkdlbVRlayBSYWRpbyBjYXJkIiwKKwkuZm9wcwkJPSAmZ2VtdGVrX2ZvcHMsCisJLmlvY3RsX29wcyAJPSAmZ2VtdGVrX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogLyoKQEAgLTYxMCw3ICs2MTksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlnZW10ZWtfcmFkaW8ucHJpdiA9ICZnZW10ZWtfdW5pdDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmZ2VtdGVrX3JhZGlvLCAmZ2VtdGVrX3VuaXQpOwogCiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmZ2VtdGVrX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpIDwgMCkgewogCQlyZWxlYXNlX3JlZ2lvbihpbywgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCmluZGV4IDllZjBhNzYuLjRiZjRkMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCkBAIC03NSw3ICs3NSwyMSBAQAogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbl91c2U7CisKIHN0YXRpYyBpbnQgbWFlc3Ryb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKK3N0YXRpYyBpbnQgbWFlc3Ryb19leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbWFlc3Ryb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIG1hZXN0cm9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1hZXN0cm9fcl9wY2lfdGJsW10gPSB7CkBAIC05OCw4ICsxMTIsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtYWVzdHJvX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5vcGVuICAgICAgICAgICA9IG1hZXN0cm9fZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gbWFlc3Ryb19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLApAQCAtMTk2LDggKzIxMCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjksOCArMjQyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmIChmLT5mcmVxdWVuY3kgPCBGUkVRX0xPIHx8IGYtPmZyZXF1ZW5jeSA+IEZSRVFfSEkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQxLDggKzI1Myw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAlmLT5mcmVxdWVuY3kgPSBCSVRTMkZSRVEocmFkaW9fYml0c19nZXQoY2FyZCkpOwpAQCAtMjY3LDggKzI3OCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0yODEsOCArMjkxLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXJlZ2lzdGVyIHUxNiBpbyA9IGNhcmQtPmlvOwogCXJlZ2lzdGVyIHUxNiBvbWFzayA9IGludyhpbyArIElPX01BU0spOwogCkBAIC0zNzQsNiArMzgzLDcgQEAKIAkubmFtZSAgICAgICAgICAgPSAiTWFlc3RybyByYWRpbyIsCiAJLmZvcHMgICAgICAgICAgID0gJm1hZXN0cm9fZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZtYWVzdHJvX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgbWFlc3Ryb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCmluZGV4IDBjYzZmY2IuLmM3NzdhMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYwpAQCAtODUsNiArODUsNyBAQAogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbl91c2U7CiAKICNkZWZpbmUgRlJFUV9MTwkJIDUwKjE2MDAwCiAjZGVmaW5lIEZSRVFfSEkJCTE1MCoxNjAwMApAQCAtOTksMTAgKzEwMCwyMSBAQAogI2RlZmluZSBCSVRTMkZSRVEoeCkJKCh4KSAqIEZSRVFfU1RFUCAtIEZSRVFfSUYpCiAKIAorc3RhdGljIGludCBtYXhpcmFkaW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IG1heGlyYWRpb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1heGlyYWRpb19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkub3BlbiAgICAgICAgICAgPSBtYXhpcmFkaW9fZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gbWF4aXJhZGlvX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTIxOSw4ICsyMzEsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ190dW5lciAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICBzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQ9ZGV2LT5wcml2OworCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTAsOCArMzAxLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5IChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkPWRldi0+cHJpdjsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmIChmLT5mcmVxdWVuY3kgPCBGUkVRX0xPIHx8IGYtPmZyZXF1ZW5jeSA+IEZSRVFfSEkpIHsKIAkJZHByaW50aygxLCAicmFkaW8gZnJlcSAoJWQuJTAyZCBNSHopIG91dCBvZiByYW5nZSAoJWQtJWQpXG4iLApAQCAtMzEyLDggKzMyMiw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZD1kZXYtPnByaXY7CisJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKIAlmLT5mcmVxdWVuY3kgPSBjYXJkLT5mcmVxOwpAQCAtMzQzLDggKzM1Miw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkPWRldi0+cHJpdjsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMzU4LDggKzM2Niw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZD1kZXYtPnByaXY7CisJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTM5MCw5ICszOTcsMTAgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIG1heGlyYWRpb19yYWRpbyA9IHsKLQkubmFtZQkJICAgID0gIk1heGkgUmFkaW8gRk0yMDAwIHJhZGlvIiwKLQkuZm9wcyAgICAgICAgICAgICAgID0gJm1heGlyYWRpb19mb3BzLAotCS5pb2N0bF9vcHMgCSAgICA9ICZtYXhpcmFkaW9faW9jdGxfb3BzLAorCS5uYW1lCQk9ICJNYXhpIFJhZGlvIEZNMjAwMCByYWRpbyIsCisJLmZvcHMgICAgICAgICAgID0gJm1heGlyYWRpb19mb3BzLAorCS5pb2N0bF9vcHMgCT0gJm1heGlyYWRpb19pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG1heGlyYWRpb19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKQEAgLTQwOCw3ICs0MTYsNyBAQAogCiAJcmFkaW9fdW5pdC5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAltdXRleF9pbml0KCZyYWRpb191bml0LmxvY2spOwotCW1heGlyYWRpb19yYWRpby5wcml2ID0gJnJhZGlvX3VuaXQ7CisJdmlkZW9fc2V0X2RydmRhdGEoJm1heGlyYWRpb19yYWRpbywgJnJhZGlvX3VuaXQpOwogCiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmbWF4aXJhZGlvX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpIDwgMCkgewogCQlwcmludGsoInJhZGlvLW1heGlyYWRpbzogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlISIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzcxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBBIGRyaXZlciBmb3IgdGhlIEF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIHJhZGlvLiBUaGlzIGRldmljZSBwbHVncworICogaW50byBib3RoIHRoZSBVU0IgYW5kIGFuIGFuYWxvZyBhdWRpbyBpbnB1dCwgc28gdGhpcyB0aGluZworICogb25seSBkZWFscyB3aXRoIGluaXRpYWxpemF0aW9uIGFuZCBmcmVxdWVuY3kgc2V0dGluZywgdGhlCisgKiBhdWRpbyBkYXRhIGhhcyB0byBiZSBoYW5kbGVkIGJ5IGEgc291bmQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBBbGV4ZXkgS2xpbW92IDxrbGltb3YubGludXhAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIEJpZyB0aGFua3MgdG8gYXV0aG9ycyBvZiBkc2JyMTAwLmMgYW5kIHJhZGlvLXNpNDcweC5jCisgKgorICogV2hlbiB3b3JrIHdhcyBsb29rZWQgcHJldHR5IGdvb2QsIGkgZGlzY292ZXIgdGhpczoKKyAqIGh0dHA6Ly9hdi11c2JyYWRpby5zb3VyY2Vmb3JnZS5uZXQvaW5kZXgucGhwCisgKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2F2LXVzYnJhZGlvLworICogTGF0ZXN0IHJlbGVhc2Ugb2YgdGhlaXJzIHByb2plY3Qgd2FzIGluIDIwMDUuCisgKiBQcm9iYWJseSwgdGhpcyBkcml2ZXIgY291bGQgYmUgaW1wcm92ZWQgdHJvdWdoIHVzaW5nIHRoZWlyCisgKiBhY2hpZXZlbWVudHMgKHNwZWNpZmljYXRpb25zIGdpdmVuKS4KKyAqIFNvLCB3ZSBoYXZlIHNtdGggdG8gYmVnaW4gd2l0aC4KKyAqCisgKiBIaXN0b3J5OgorICogVmVyc2lvbiAwLjAxOglGaXJzdCB3b3JraW5nIHZlcnNpb24uCisgKiAJCQlJdCdzIHJlcXVpcmVkIHRvIGJsYWNrbGlzdCBBdmVyTWVkaWEgVVNCIFJhZGlvCisgKiAJCQlpbiB1c2JoaWQvaGlkLXF1aXJrcy5jCisgKgorICogTWFueSB0aGluZ3MgdG8gZG86CisgKiAJLSBDb3JyZWN0IHBvd2VyIG1hbmFnbWVudCBvZiBkZXZpY2UgKHN1c3BlbmQgJiByZXN1bWUpCisgKiAJLSBNYWtlIHg4NiBpbmRlcGVuZGFuY2UgKGxpdHRsZS1lbmRpYW4gYW5kIGJpZy1lbmRpYW4gc3R1ZmYpCisgKiAJLSBBZGQgY29kZSBmb3Igc2Nhbm5pbmcgYW5kIHNtb290aCB0dW5pbmcKKyAqIAktIENoZWNrZWQgYW5kIGFkZCBzdGVyZW8mbW9ubyBzdHVmZgorICogCS0gQWRkIGNvZGUgZm9yIHNlbnNpdGl2aXR5IHZhbHVlCisgKiAJLSBDb3JyZWN0IG1pc3Rha2VzCisgKiAJLSBJbiBKYXBhbiBhbm90aGVyIEZSRVFfTUlOIGFuZCBGUkVRX01BWAorICovCisKKy8qIGtlcm5lbCBpbmNsdWRlcyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAqLworCisvKiBkcml2ZXIgYW5kIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBEUklWRVJfQVVUSE9SICJBbGV4ZXkgS2xpbW92IDxrbGltb3YubGludXhAZ21haWwuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIHJhZGlvIGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMDEiCisjZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgVVNCX0FNUkFESU9fVkVORE9SIDB4MDdjYQorI2RlZmluZSBVU0JfQU1SQURJT19QUk9EVUNUIDB4YjgwMAorCisvKiBQcm9iYWJseSBVU0JfVElNRU9VVCBzaG91bGQgYmUgbW9kaWZpZWQgaW4gbW9kdWxlIHBhcmFtZXRlciAqLworI2RlZmluZSBCVUZGRVJfTEVOR1RIIDgKKyNkZWZpbmUgVVNCX1RJTUVPVVQgNTAwCisKKy8qIEZyZXF1ZW5jeSBsaW1pdHMgaW4gTUh6IC0tIHRoZXNlIGFyZSBFdXJvcGVhbiB2YWx1ZXMuICBGb3IgSmFwYW5lc2UKK2RldmljZXMsIHRoYXQgd291bGQgYmUgNzYgYW5kIDkxLiAgKi8KKyNkZWZpbmUgRlJFUV9NSU4gIDg3LjUKKyNkZWZpbmUgRlJFUV9NQVggMTA4LjAKKyNkZWZpbmUgRlJFUV9NVUwgMTYwMDAKKworLyogbW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIGludCByYWRpb19uciA9IC0xOworbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyYWRpb19uciwgIlJhZGlvIE5yIik7CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcmFkaW9fcWN0cmxbXSA9IHsKKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkuc3RlcAkgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LAorLyogSElOVDogdGhlIGRpc2FibGVkIGNvbnRyb2xzIGFyZSBvbmx5IGhlcmUgdG8gc2F0aWZ5IGtyYWRpbyBhbmQgc3VjaCBhcHBzICovCisJewkuaWQJCT0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19CQVNTLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKKwl7CisJCS5pZAkJPSBWNEwyX0NJRF9BVURJT19UUkVCTEUsCisJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKKwl9LAorCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX0FVRElPX0xPVURORVNTLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCB1c2JfYW1yYWRpb19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IHVzYl9hbXJhZGlvX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9fc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CitzdGF0aWMgaW50IHVzYl9hbXJhZGlvX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKKy8qIERhdGEgZm9yIG9uZSAocGh5c2ljYWwpIGRldmljZSAqLworc3RydWN0IGFtcmFkaW9fZGV2aWNlIHsKKwkvKiByZWZlcmVuY2UgdG8gVVNCIGFuZCB2aWRlbyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvZGV2OworCisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBidWZmZXIgbG9ja2luZyAqLworCWludCBjdXJmcmVxOworCWludCBzdGVyZW87CisJaW50IHVzZXJzOworCWludCByZW1vdmVkOworCWludCBtdXRlZDsKK307CisKKy8qIFVTQiBEZXZpY2UgSUQgTGlzdCAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9hbXJhZGlvX2RldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhVU0JfQU1SQURJT19WRU5ET1IsIFVTQl9BTVJBRElPX1BST0RVQ1QsCisJCQkJCQkJVVNCX0NMQVNTX0hJRCwgMCwgMCkgfSwKKwl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9hbXJhZGlvX2RldmljZV90YWJsZSk7CisKKy8qIFVTQiBzdWJzeXN0ZW0gaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FtcmFkaW9fZHJpdmVyID0geworCS5uYW1lCQkJPSAicmFkaW8tbXI4MDAiLAorCS5wcm9iZQkJCT0gdXNiX2FtcmFkaW9fcHJvYmUsCisJLmRpc2Nvbm5lY3QJCT0gdXNiX2FtcmFkaW9fZGlzY29ubmVjdCwKKwkuc3VzcGVuZAkJPSB1c2JfYW1yYWRpb19zdXNwZW5kLAorCS5yZXN1bWUJCQk9IHVzYl9hbXJhZGlvX3Jlc3VtZSwKKwkucmVzZXRfcmVzdW1lCQk9IHVzYl9hbXJhZGlvX3Jlc3VtZSwKKwkuaWRfdGFibGUJCT0gdXNiX2FtcmFkaW9fZGV2aWNlX3RhYmxlLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZAk9IDEsCit9OworCisvKiBzd2l0Y2ggb24gcmFkaW8uIFNlbmQgOCBieXRlcyB0byBkZXZpY2UuICovCitzdGF0aWMgaW50IGFtcmFkaW9fc3RhcnQoc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbykKK3sKKwlpbnQgcmV0dmFsOworCWludCBzaXplOworCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCisJcmFkaW8tPmJ1ZmZlclswXSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlclsxXSA9IDB4NTU7CisJcmFkaW8tPmJ1ZmZlclsyXSA9IDB4YWE7CisJcmFkaW8tPmJ1ZmZlclszXSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls0XSA9IDB4YWI7CisJcmFkaW8tPmJ1ZmZlcls1XSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls2XSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls3XSA9IDB4MDA7CisKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2cocmFkaW8tPnVzYmRldiwgdXNiX3NuZGludHBpcGUocmFkaW8tPnVzYmRldiwgMiksCisJCSh2b2lkICopIChyYWRpby0+YnVmZmVyKSwgQlVGRkVSX0xFTkdUSCwgJnNpemUsIFVTQl9USU1FT1VUKTsKKworCWlmIChyZXR2YWwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisKKwlyYWRpby0+bXV0ZWQgPSAwOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogc3dpdGNoIG9mZiByYWRpbyAqLworc3RhdGljIGludCBhbXJhZGlvX3N0b3Aoc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbykKK3sKKwlpbnQgcmV0dmFsOworCWludCBzaXplOworCisJbXV0ZXhfbG9jaygmcmFkaW8tPmxvY2spOworCisJcmFkaW8tPmJ1ZmZlclswXSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlclsxXSA9IDB4NTU7CisJcmFkaW8tPmJ1ZmZlclsyXSA9IDB4YWE7CisJcmFkaW8tPmJ1ZmZlclszXSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls0XSA9IDB4YWI7CisJcmFkaW8tPmJ1ZmZlcls1XSA9IDB4MDE7CisJcmFkaW8tPmJ1ZmZlcls2XSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls3XSA9IDB4MDA7CisKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2cocmFkaW8tPnVzYmRldiwgdXNiX3NuZGludHBpcGUocmFkaW8tPnVzYmRldiwgMiksCisJCSh2b2lkICopIChyYWRpby0+YnVmZmVyKSwgQlVGRkVSX0xFTkdUSCwgJnNpemUsIFVTQl9USU1FT1VUKTsKKworCWlmIChyZXR2YWwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyYWRpby0+bG9jayk7CisKKwlyYWRpby0+bXV0ZWQgPSAxOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogc2V0IGEgZnJlcXVlbmN5LCBmcmVxIGlzIGRlZmluZWQgYnkgdjRsJ3MgVFVORVJfTE9XLCBpLmUuIDEvMTZ0aCBrSHogKi8KK3N0YXRpYyBpbnQgYW1yYWRpb19zZXRmcmVxKHN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8sIGludCBmcmVxKQoreworCWludCByZXR2YWw7CisJaW50IHNpemU7CisJdW5zaWduZWQgc2hvcnQgZnJlcV9zZW5kID0gMHgxMyArIChmcmVxID4+IDMpIC8gMjU7CisKKwltdXRleF9sb2NrKCZyYWRpby0+bG9jayk7CisKKwlyYWRpby0+YnVmZmVyWzBdID0gMHgwMDsKKwlyYWRpby0+YnVmZmVyWzFdID0gMHg1NTsKKwlyYWRpby0+YnVmZmVyWzJdID0gMHhhYTsKKwlyYWRpby0+YnVmZmVyWzNdID0gMHgwMzsKKwlyYWRpby0+YnVmZmVyWzRdID0gMHhhNDsKKwlyYWRpby0+YnVmZmVyWzVdID0gMHgwMDsKKwlyYWRpby0+YnVmZmVyWzZdID0gMHgwMDsKKwlyYWRpby0+YnVmZmVyWzddID0gMHgwODsKKworCXJldHZhbCA9IHVzYl9idWxrX21zZyhyYWRpby0+dXNiZGV2LCB1c2Jfc25kaW50cGlwZShyYWRpby0+dXNiZGV2LCAyKSwKKwkJKHZvaWQgKikgKHJhZGlvLT5idWZmZXIpLCBCVUZGRVJfTEVOR1RILCAmc2l6ZSwgVVNCX1RJTUVPVVQpOworCisJaWYgKHJldHZhbCkgeworCQltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBmcmVxdWVuY3kgaXMgY2FsY3VsYXRlZCBmcm9tIGZyZXFfc2VuZCBhbmQgcGxhY2VkIGluIGZpcnN0IDIgYnl0ZXMgKi8KKwlyYWRpby0+YnVmZmVyWzBdID0gKGZyZXFfc2VuZCA+PiA4KSAmIDB4ZmY7CisJcmFkaW8tPmJ1ZmZlclsxXSA9IGZyZXFfc2VuZCAmIDB4ZmY7CisJcmFkaW8tPmJ1ZmZlclsyXSA9IDB4MDE7CisJcmFkaW8tPmJ1ZmZlclszXSA9IDB4MDA7CisJcmFkaW8tPmJ1ZmZlcls0XSA9IDB4MDA7CisJLyogNSBhbmQgNiBieXRlcyBvZiBidWZmZXIgYWxyZWFkeSA9IDB4MDAgKi8KKwlyYWRpby0+YnVmZmVyWzddID0gMHgwMDsKKworCXJldHZhbCA9IHVzYl9idWxrX21zZyhyYWRpby0+dXNiZGV2LCB1c2Jfc25kaW50cGlwZShyYWRpby0+dXNiZGV2LCAyKSwKKwkJKHZvaWQgKikgKHJhZGlvLT5idWZmZXIpLCBCVUZGRVJfTEVOR1RILCAmc2l6ZSwgVVNCX1RJTUVPVVQpOworCisJaWYgKHJldHZhbCkgeworCQltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwltdXRleF91bmxvY2soJnJhZGlvLT5sb2NrKTsKKworCXJhZGlvLT5zdGVyZW8gPSAwOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVVNCIHN1YnN5c3RlbSBpbnRlcmZhY2UgYmVnaW5zIGhlcmUgKi8KKworLyogaGFuZGxlIHVucGx1Z2dpbmcgb2YgdGhlIGRldmljZSwgcmVsZWFzZSBkYXRhIHN0cnVjdHVyZXMKK2lmIG5vdGhpbmcga2VlcHMgdXMgZnJvbSBkb2luZyBpdC4gIElmIHNvbWV0aGluZyBpcyBzdGlsbAora2VlcGluZyB1cyBidXN5LCB0aGUgcmVsZWFzZSBjYWxsYmFjayBvZiB2NGwgd2lsbCB0YWtlIGNhcmUKK29mIHJlbGVhc2luZyBpdC4gKi8KK3N0YXRpYyB2b2lkIHVzYl9hbXJhZGlvX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJaWYgKHJhZGlvKSB7CisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2Rldik7CisJCXJhZGlvLT52aWRlb2RldiA9IE5VTEw7CisJCWlmIChyYWRpby0+dXNlcnMpIHsKKwkJCWtmcmVlKHJhZGlvLT5idWZmZXIpOworCQkJa2ZyZWUocmFkaW8pOworCQl9IGVsc2UgeworCQkJcmFkaW8tPnJlbW92ZWQgPSAxOworCQl9CisJfQorfQorCisvKiB2aWRpb2NfcXVlcnljYXAgLSBxdWVyeSBkZXZpY2UgY2FwYWJpbGl0aWVzICovCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKK3sKKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLW1yODAwIiwgc2l6ZW9mKHYtPmRyaXZlcikpOworCXN0cmxjcHkodi0+Y2FyZCwgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiVVNCIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7Cit9CisKKy8qIHZpZGlvY19nX3R1bmVyIC0gZ2V0IHR1bmVyIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKy8qIFRPRE86IEFkZCBmdW5jdGlvbiB3aGljaCBsb29rIGlzIHNpZ25hbCBzdGVyZW8gb3Igbm90CisgKiAJYW1yYWRpb19nZXRzdGF0KHJhZGlvKTsKKyAqLworCXJhZGlvLT5zdGVyZW8gPSAtMTsKKwlzdHJjcHkodi0+bmFtZSwgIkZNIik7CisJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJdi0+cmFuZ2Vsb3cgPSBGUkVRX01JTiAqIEZSRVFfTVVMOworCXYtPnJhbmdlaGlnaCA9IEZSRVFfTUFYICogRlJFUV9NVUw7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk8gfCBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwlpZiAocmFkaW8tPnN0ZXJlbykKKwkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJZWxzZQorCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJdi0+c2lnbmFsID0gMHhmZmZmOyAgICAgLyogQ2FuJ3QgZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGgsIHNhZC4uICovCisJdi0+YWZjID0gMDsgLyogRG9uJ3Qga25vdyB3aGF0IGlzIHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworLyogdmlkaW9jX3NfdHVuZXIgLSBzZXQgdHVuZXIgYXR0cmlidXRlcyAqLworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyogdmlkaW9jX3NfZnJlcXVlbmN5IC0gc2V0IHR1bmVyIHJhZGlvIGZyZXF1ZW5jeSAqLworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKworCXJhZGlvLT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCWlmIChhbXJhZGlvX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKSA8IDApCisJCXdhcm4oIlNldCBmcmVxdWVuY3kgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIHZpZGlvY19nX2ZyZXF1ZW5jeSAtIGdldCB0dW5lciByYWRpbyBmcmVxdWVuY3kgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSByYWRpby0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworLyogdmlkaW9jX3F1ZXJ5Y3RybCAtIGVudW1lcmF0ZSBjb250cm9sIGl0ZW1zICovCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7CisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAorCQkJCQkJc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIHZpZGlvY19nX2N0cmwgLSBnZXQgdGhlIHZhbHVlIG9mIGEgY29udHJvbCAqLworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGFtcmFkaW9fZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSByYWRpby0+bXV0ZWQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogdmlkaW9jX3NfY3RybCAtIHNldCB0aGUgdmFsdWUgb2YgYSBjb250cm9sICovCitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoY3RybC0+dmFsdWUpIHsKKwkJCWlmIChhbXJhZGlvX3N0b3AocmFkaW8pIDwgMCkgeworCQkJCXdhcm4oImFtcmFkaW9fc3RvcCgpIGZhaWxlZCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhbXJhZGlvX3N0YXJ0KHJhZGlvKSA8IDApIHsKKwkJCQl3YXJuKCJhbXJhZGlvX3N0YXJ0KCkgZmFpbGVkIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogdmlkaW9jX2dfYXVkaW8gLSBnZXQgYXVkaW8gYXR0cmlidXRlcyAqLworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKKwlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCXJldHVybiAwOworfQorCisvKiB2aWRpb2Nfc19hdWRpbyAtIHNldCBhdWRpbyBhdHRyaWJ1dGVzICAqLworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKiB2aWRpb2NfZ19pbnB1dCAtIGdldCBpbnB1dCAqLworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyogdmlkaW9jX3NfaW5wdXQgLSBzZXQgaW5wdXQgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKiBvcGVuIGRldmljZSAtIGFtcmFkaW9fc3RhcnQoKSBhbmQgYW1yYWRpb19zZXRmcmVxKCkgKi8KK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlyYWRpby0+dXNlcnMgPSAxOworCXJhZGlvLT5tdXRlZCA9IDE7CisKKwlpZiAoYW1yYWRpb19zdGFydChyYWRpbykgPCAwKSB7CisJCXdhcm4oIlJhZGlvIGRpZCBub3Qgc3RhcnQgdXAgcHJvcGVybHkiKTsKKwkJcmFkaW8tPnVzZXJzID0gMDsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChhbXJhZGlvX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKSA8IDApCisJCXdhcm4oIlNldCBmcmVxdWVuY3kgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKKy8qY2xvc2UgZGV2aWNlIC0gZnJlZSBkcml2ZXIgc3RydWN0dXJlcyAqLworc3RhdGljIGludCB1c2JfYW1yYWRpb19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlpZiAoIXJhZGlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyYWRpby0+dXNlcnMgPSAwOworCWlmIChyYWRpby0+cmVtb3ZlZCkgeworCQlrZnJlZShyYWRpby0+YnVmZmVyKTsKKwkJa2ZyZWUocmFkaW8pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU3VzcGVuZCBkZXZpY2UgLSBzdG9wIGRldmljZS4gTmVlZCB0byBiZSBjaGVja2VkIGFuZCBmaXhlZCAqLworc3RhdGljIGludCB1c2JfYW1yYWRpb19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmIChhbXJhZGlvX3N0b3AocmFkaW8pIDwgMCkKKwkJd2FybigiYW1yYWRpb19zdG9wKCkgZmFpbGVkIik7CisKKwlpbmZvKCJyYWRpby1tcjgwMDogR29pbmcgaW50byBzdXNwZW5kLi4iKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXN1bWUgZGV2aWNlIC0gc3RhcnQgZGV2aWNlLiBOZWVkIHRvIGJlIGNoZWNrZWQgYW5kIGZpeGVkICovCitzdGF0aWMgaW50IHVzYl9hbXJhZGlvX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgYW1yYWRpb19kZXZpY2UgKnJhZGlvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmIChhbXJhZGlvX3N0YXJ0KHJhZGlvKSA8IDApCisJCXdhcm4oImFtcmFkaW9fc3RhcnQoKSBmYWlsZWQiKTsKKworCWluZm8oInJhZGlvLW1yODAwOiBDb21pbmcgb3V0IG9mIHN1c3BlbmQuLiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGUgc3lzdGVtIGludGVyZmFjZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX2FtcmFkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gdXNiX2FtcmFkaW9fb3BlbiwKKwkucmVsZWFzZQk9IHVzYl9hbXJhZGlvX2Nsb3NlLAorCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCisjZW5kaWYKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdXNiX2FtcmFkaW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX2F1ZGlvICAgICA9IHZpZGlvY19nX2F1ZGlvLAorCS52aWRpb2Nfc19hdWRpbyAgICAgPSB2aWRpb2Nfc19hdWRpbywKKwkudmlkaW9jX2dfaW5wdXQgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICA9IHZpZGlvY19zX2lucHV0LAorfTsKKworLyogVjRMMiBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGFtcmFkaW9fdmlkZW9kZXZfdGVtcGxhdGUgPSB7CisJLm5hbWUJCT0gIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIFJhZGlvIiwKKwkuZm9wcwkJPSAmdXNiX2FtcmFkaW9fZm9wcywKKwkuaW9jdGxfb3BzIAk9ICZ1c2JfYW1yYWRpb19pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKK307CisKKy8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBhbmQgcmVnaXN0ZXIgd2l0aCB2NGwgYW5kCit1c2IgaWYgaXQgaXMgKi8KK3N0YXRpYyBpbnQgdXNiX2FtcmFkaW9fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhbXJhZGlvX2RldmljZSAqcmFkaW87CisKKwlyYWRpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbXJhZGlvX2RldmljZSksIEdGUF9LRVJORUwpOworCisJaWYgKCEocmFkaW8pKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJhZGlvLT5idWZmZXIgPSBrbWFsbG9jKEJVRkZFUl9MRU5HVEgsIEdGUF9LRVJORUwpOworCisJaWYgKCEocmFkaW8tPmJ1ZmZlcikpIHsKKwkJa2ZyZWUocmFkaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYWRpby0+dmlkZW9kZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKworCWlmICghKHJhZGlvLT52aWRlb2RldikpIHsKKwkJa2ZyZWUocmFkaW8tPmJ1ZmZlcik7CisJCWtmcmVlKHJhZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KHJhZGlvLT52aWRlb2RldiwgJmFtcmFkaW9fdmlkZW9kZXZfdGVtcGxhdGUsCisJCXNpemVvZihhbXJhZGlvX3ZpZGVvZGV2X3RlbXBsYXRlKSk7CisKKwlyYWRpby0+cmVtb3ZlZCA9IDA7CisJcmFkaW8tPnVzZXJzID0gMDsKKwlyYWRpby0+dXNiZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlyYWRpby0+Y3VyZnJlcSA9IDk1LjE2ICogRlJFUV9NVUw7CisKKwltdXRleF9pbml0KCZyYWRpby0+bG9jayk7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YShyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2RldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSkgeworCQl3YXJuKCJDb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIik7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHJhZGlvLT52aWRlb2Rldik7CisJCWtmcmVlKHJhZGlvLT5idWZmZXIpOworCQlrZnJlZShyYWRpbyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcmFkaW8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbXJhZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfYW1yYWRpb19kcml2ZXIpOworCisJaW5mbyhEUklWRVJfVkVSU0lPTiAiICIgRFJJVkVSX0RFU0MpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1yYWRpb19leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9hbXJhZGlvX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFtcmFkaW9faW5pdCk7Cittb2R1bGVfZXhpdChhbXJhZGlvX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCmluZGV4IDZkODIwZTIuLmE2NzA3OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCkBAIC01Miw2ICs1Miw3IEBACiAKIHN0cnVjdCBydF9kZXZpY2UKIHsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIAlpbnQgcG9ydDsKIAl1bnNpZ25lZCBsb25nIGN1cmZyZXE7CiAJaW50IG11dGVkOwpAQCAtMTUzLDggKzE1NCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzMsOCArMTczLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXJ0LT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OwogCXJ0X3NldGZyZXEocnQsIHJ0LT5jdXJmcmVxKTsKQEAgLTE4NCw4ICsxODMsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gcnQtPmN1cmZyZXE7CkBAIC0yMTAsOCArMjA4LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTIzMCw4ICsyMjcsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMjg0LDEwICsyODAsMjEgQEAKIAogc3RhdGljIHN0cnVjdCBydF9kZXZpY2UgcnRyYWNrMl91bml0OwogCitzdGF0aWMgaW50IHJ0cmFjazJfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnJ0cmFjazJfdW5pdC5pbl91c2UpID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCBydHJhY2syX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmcnRyYWNrMl91bml0LmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0cmFjazJfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gcnRyYWNrMl9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBydHJhY2syX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCkBAIC0zMTQsNiArMzIxLDcgQEAKIAkubmFtZQkJPSAiUmFkaW9UcmFjayBJSSByYWRpbyIsCiAJLmZvcHMgICAgICAgICAgID0gJnJ0cmFjazJfZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZydHJhY2syX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcnRyYWNrMl9pbml0KHZvaWQpCkBAIC0zMjksNyArMzM3LDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlydHJhY2syX3JhZGlvLnByaXY9JnJ0cmFjazJfdW5pdDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmcnRyYWNrMl9yYWRpbywgJnJ0cmFjazJfdW5pdCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmbG9jayk7CiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcnRyYWNrMl9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKaW5kZXggMGQ0NzhmNS4uMzI5YzkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogc3RydWN0IGZtaV9kZXZpY2UKIHsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIAlpbnQgcG9ydDsKIAlpbnQgY3Vydm9sOyAvKiAxIG9yIDAgKi8KIAl1bnNpZ25lZCBsb25nIGN1cmZyZXE7IC8qIGZyZXEgaW4ga0h6ICovCkBAIC0xNDYsOCArMTQ3LDcgQEAKIAkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCiB7CiAJaW50IG11bHQ7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gZGV2LT5wcml2OworCXN0cnVjdCBmbWlfZGV2aWNlICpmbWkgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKHYtPmluZGV4ID4gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzUsOCArMTc1LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gZGV2LT5wcml2OworCXN0cnVjdCBmbWlfZGV2aWNlICpmbWkgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKCEoZm1pLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykpCiAJCWYtPmZyZXF1ZW5jeSAqPSAxMDAwOwpAQCAtMTkzLDggKzE5Miw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGZtaV9kZXZpY2UgKmZtaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwogCWYtPmZyZXF1ZW5jeSA9IGZtaS0+Y3VyZnJlcTsKQEAgLTIyMSw4ICsyMTksNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGZtaV9kZXZpY2UgKmZtaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0yMzUsOCArMjMyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBmbWlfZGV2aWNlICpmbWkgPSBkZXYtPnByaXY7CisJc3RydWN0IGZtaV9kZXZpY2UgKmZtaSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMjg0LDEwICsyODAsMjEgQEAKIAogc3RhdGljIHN0cnVjdCBmbWlfZGV2aWNlIGZtaV91bml0OwogCitzdGF0aWMgaW50IGZtaV9leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmZm1pX3VuaXQuaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZm1pX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmZm1pX3VuaXQuaW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm1pX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5vcGVuICAgICAgICAgICA9IGZtaV9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBmbWlfZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTMxNCw2ICszMjEsNyBAQAogCS5uYW1lCQk9ICJTRjE2Rk14IHJhZGlvIiwKIAkuZm9wcyAgICAgICAgICAgPSAmZm1pX2ZvcHMsCiAJLmlvY3RsX29wcyAJPSAmZm1pX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogLyogbGFkaXM6IHRoaXMgaXMgbXkgY2FyZC4gZG9lcyBhbnkgb3RoZXIgdHlwZXMgZXhpc3Q/ICovCkBAIC0zNzMsNyArMzgxLDcgQEAKIAlmbWlfdW5pdC5jdXJ2b2wgPSAwOwogCWZtaV91bml0LmN1cmZyZXEgPSAwOwogCWZtaV91bml0LmZsYWdzID0gVjRMMl9UVU5FUl9DQVBfTE9XOwotCWZtaV9yYWRpby5wcml2ID0gJmZtaV91bml0OworCXZpZGVvX3NldF9kcnZkYXRhKCZmbWlfcmFkaW8sICZmbWlfdW5pdCk7CiAKIAltdXRleF9pbml0KCZsb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCmluZGV4IDYyOTA1NTMuLmIxZjQ3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKQEAgLTY0LDYgKzY0LDcgQEAKIC8qIHRoaXMgc2hvdWxkIGJlIHN0YXRpYyB2YXJzIGZvciBtb2R1bGUgc2l6ZSAqLwogc3RydWN0IGZtcjJfZGV2aWNlCiB7CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CiAJaW50IHBvcnQ7CiAJaW50IGN1cnZvbDsgLyogMC0xNSAqLwogCWludCBtdXRlOwpAQCAtMjI5LDggKzIzMCw3IEBACiAJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewogCWludCBtdWx0OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gZGV2LT5wcml2OworCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlpZiAodi0+aW5kZXggPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI2Miw4ICsyNjIsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZm1yMl9kZXZpY2UgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJaWYgKCEoZm1yMi0+ZmxhZ3MgJiBWNEwyX1RVTkVSX0NBUF9MT1cpKQogCQlmLT5mcmVxdWVuY3kgKj0gMTAwMDsKQEAgLTI4Niw4ICsyODUsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZm1yMl9kZXZpY2UgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gZm1yMi0+Y3VyZnJlcTsKQEAgLTMxMyw4ICszMTEsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gZGV2LT5wcml2OworCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgpAQCAtMzMwLDggKzMyNyw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZm1yMl9kZXZpY2UgKmZtcjIgPSBkZXYtPnByaXY7CisJc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC00MDAsMTAgKzM5NiwyMSBAQAogCiBzdGF0aWMgc3RydWN0IGZtcjJfZGV2aWNlIGZtcjJfdW5pdDsKIAorc3RhdGljIGludCBmbXIyX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZmbXIyX3VuaXQuaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZm1yMl9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmZtcjJfdW5pdC5pbl91c2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmbXIyX2ZvcHMgPSB7CiAJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gZm1yMl9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBmbXIyX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTQzMCw2ICs0MzcsNyBAQAogCS5uYW1lCQk9ICJTRjE2Rk1SMiByYWRpbyIsCiAJLmZvcHMJCT0gJmZtcjJfZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZmbXIyX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZm1yMl9pbml0KHZvaWQpCkBAIC00NDEsNyArNDQ5LDcgQEAKIAlmbXIyX3VuaXQuc3RlcmVvID0gMTsKIAlmbXIyX3VuaXQuZmxhZ3MgPSBWNEwyX1RVTkVSX0NBUF9MT1c7CiAJZm1yMl91bml0LmNhcmRfdHlwZSA9IDA7Ci0JZm1yMl9yYWRpby5wcml2ID0gJmZtcjJfdW5pdDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmZm1yMl9yYWRpbywgJmZtcjJfdW5pdCk7CiAKIAltdXRleF9pbml0KCZsb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MHguYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2k0NzB4LmMKaW5kZXggMTZjN2VmMi4uZjZjZWRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MHguYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNpNDcweC5jCkBAIC05ODYsNyArOTg2LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNpNDcweF9mb3BzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbCA9IDA7CiAJdW5zaWduZWQgaW50IGJsb2NrX2NvdW50ID0gMDsKIApAQCAtMTA0Nyw3ICsxMDQ3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2k0NzB4X2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdHMpCiB7Ci0Jc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIHN3aXRjaCBvbiByZHMgcmVjZXB0aW9uICovCkBAIC0xMDcxLDkgKzEwNzEsMTAgQEAKICAqLwogc3RhdGljIGludCBzaTQ3MHhfZm9wc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbDsKIAorCWxvY2tfa2VybmVsKCk7CiAJcmFkaW8tPnVzZXJzKys7CiAKIAlyZXR2YWwgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UocmFkaW8tPmludGYpOwpAQCAtMTA5MCw2ICsxMDkxLDcgQEAKIAl9CiAKIGRvbmU6CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEwOTksNyArMTEwMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2k0NzB4X2ZvcHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogc2FmZXR5IGNoZWNrICovCkBAIC0xMjgyLDcgKzEyODQsNyBAQAogc3RhdGljIGludCBzaTQ3MHhfdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogc2FmZXR5IGNoZWNrcyAqLwpAQCAtMTMxOCw3ICsxMzIwLDcgQEAKIHN0YXRpYyBpbnQgc2k0NzB4X3ZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIHNhZmV0eSBjaGVja3MgKi8KQEAgLTE0MDUsNyArMTQwNyw3IEBACiBzdGF0aWMgaW50IHNpNDcweF92aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyKQogewotCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbCA9IDA7CiAKIAkvKiBzYWZldHkgY2hlY2tzICovCkBAIC0xNDcxLDcgKzE0NzMsNyBAQAogc3RhdGljIGludCBzaTQ3MHhfdmlkaW9jX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lcikKIHsKLQlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogc2FmZXR5IGNoZWNrcyAqLwpAQCAtMTUwNSw3ICsxNTA3LDcgQEAKIHN0YXRpYyBpbnQgc2k0NzB4X3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmcmVxKQogewotCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCXN0cnVjdCBzaTQ3MHhfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbCA9IDA7CiAKIAkvKiBzYWZldHkgY2hlY2tzICovCkBAIC0xNTM0LDcgKzE1MzYsNyBAQAogc3RhdGljIGludCBzaTQ3MHhfdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmZyZXEpCiB7Ci0Jc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisJc3RydWN0IHNpNDcweF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIHNhZmV0eSBjaGVja3MgKi8KQEAgLTE1NjMsNyArMTU2NSw3IEBACiBzdGF0aWMgaW50IHNpNDcweF92aWRpb2Nfc19od19mcmVxX3NlZWsoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCXN0cnVjdCB2NGwyX2h3X2ZyZXFfc2VlayAqc2VlaykKIHsKLQlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogc2FmZXR5IGNoZWNrcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCmluZGV4IDA4NzZmZWMuLjBhYmIxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKQEAgLTc5LDYgKzc5LDcgQEAKIAogc3RydWN0IHR0X2RldmljZQogeworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogCWludCBwb3J0OwogCWludCBjdXJ2b2w7CiAJdW5zaWduZWQgbG9uZyBjdXJmcmVxOwpAQCAtMjIwLDggKzIyMSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICh2LT5pbmRleCA+IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ4LDggKzI0OCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHR0X2RldmljZSAqdHQgPSBkZXYtPnByaXY7CisJc3RydWN0IHR0X2RldmljZSAqdHQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJdHQtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CiAJdHRfc2V0ZnJlcSh0dCwgdHQtPmN1cmZyZXEpOwpAQCAtMjU5LDggKzI1OCw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHR0X2RldmljZSAqdHQgPSBkZXYtPnByaXY7CisJc3RydWN0IHR0X2RldmljZSAqdHQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAJZi0+ZnJlcXVlbmN5ID0gdHQtPmN1cmZyZXE7CkBAIC0yODUsOCArMjgzLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zMDUsOCArMzAyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CkBAIC0zNTYsMTAgKzM1MiwyMSBAQAogCiBzdGF0aWMgc3RydWN0IHR0X2RldmljZSB0ZXJyYXRlY191bml0OwogCitzdGF0aWMgaW50IHRlcnJhdGVjX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZ0ZXJyYXRlY191bml0LmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IHRlcnJhdGVjX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmdGVycmF0ZWNfdW5pdC5pbl91c2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0ZXJyYXRlY19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkub3BlbiAgICAgICAgICAgPSB0ZXJyYXRlY19leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSB0ZXJyYXRlY19leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLApAQCAtMzg2LDYgKzM5Myw3IEBACiAJLm5hbWUJCT0gIlRlcnJhVGVjIEFjdGl2ZVJhZGlvIiwKIAkuZm9wcyAgICAgICAgICAgPSAmdGVycmF0ZWNfZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZ0ZXJyYXRlY19pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRlcnJhdGVjX2luaXQodm9pZCkKQEAgLTQwMSw3ICs0MDksNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXRlcnJhdGVjX3JhZGlvLnByaXY9JnRlcnJhdGVjX3VuaXQ7CisJdmlkZW9fc2V0X2RydmRhdGEoJnRlcnJhdGVjX3JhZGlvLCAmdGVycmF0ZWNfdW5pdCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYwppbmRleCAxOTMxNjE5Li5lN2IxMTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCkBAIC03OCw2ICs3OCw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJmcmVxOwogc3RhdGljIGludCBjdXJzdGVyZW87CiBzdGF0aWMgaW50IGN1cm11dGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbl91c2U7CiAKIC8qIGkyYyBhZGRyZXNzZXMgKi8KICNkZWZpbmUgVERBNzMxOF9BRERSIDB4ODgKQEAgLTMzNiwxMCArMzM3LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdHJ1c3RfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IHRydXN0X2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmaW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJ1c3RfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gdHJ1c3RfZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gdHJ1c3RfZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTM2Niw2ICszNzgsNyBAQAogCS5uYW1lCQk9ICJUcnVzdCBGTSBSYWRpbyIsCiAJLmZvcHMgICAgICAgICAgID0gJnRydXN0X2ZvcHMsCiAJLmlvY3RsX29wcyAJPSAmdHJ1c3RfaW9jdGxfb3BzLAorCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB0cnVzdF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCmluZGV4IGY4ZDYyY2YuLjk1MmVjMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCkBAIC03OSw3ICs3OSw3IEBACiAjZW5kaWYKIAogc3RydWN0IHR5cGhvb25fZGV2aWNlIHsKLQlpbnQgdXNlcnM7CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CiAJaW50IGlvYmFzZTsKIAlpbnQgY3Vydm9sOwogCWludCBtdXRlZDsKQEAgLTIyMyw4ICsyMjMsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0eXBob29uX2RldmljZSAqdHlwaG9vbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgKnR5cGhvb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJdHlwaG9vbi0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKIAl0eXBob29uX3NldGZyZXEodHlwaG9vbiwgdHlwaG9vbi0+Y3VyZnJlcSk7CkBAIC0yMzQsOCArMjMzLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgKnR5cGhvb24gPSBkZXYtPnByaXY7CisJc3RydWN0IHR5cGhvb25fZGV2aWNlICp0eXBob29uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwogCWYtPmZyZXF1ZW5jeSA9IHR5cGhvb24tPmN1cmZyZXE7CkBAIC0yNjEsOCArMjU5LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0eXBob29uX2RldmljZSAqdHlwaG9vbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgKnR5cGhvb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTI3OCw4ICsyNzUsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0eXBob29uX2RldmljZSAqdHlwaG9vbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgKnR5cGhvb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTMzNCwxMCArMzMwLDIxIEBACiAJLm11dGVmcmVxCT0gQ09ORklHX1JBRElPX1RZUEhPT05fTVVURUZSRVEsCiB9OwogCitzdGF0aWMgaW50IHR5cGhvb25fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnR5cGhvb25fdW5pdC5pbl91c2UpID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCB0eXBob29uX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmdHlwaG9vbl91bml0LmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR5cGhvb25fZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gdHlwaG9vbl9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSB0eXBob29uX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCkBAIC0zNjQsNiArMzcxLDcgQEAKIAkubmFtZQkJPSAiVHlwaG9vbiBSYWRpbyIsCiAJLmZvcHMgICAgICAgICAgID0gJnR5cGhvb25fZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZ0eXBob29uX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogI2lmZGVmIENPTkZJR19SQURJT19UWVBIT09OX1BST0NfRlMKQEAgLTQ0Niw5ICs0NTQsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXR5cGhvb25fcmFkaW8ucHJpdiA9ICZ0eXBob29uX3VuaXQ7Ci0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdHlwaG9vbl9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA9PSAtMSkKLQl7CisJdmlkZW9fc2V0X2RydmRhdGEoJnR5cGhvb25fcmFkaW8sICZ0eXBob29uX3VuaXQpOworCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnR5cGhvb25fcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucikgPCAwKSB7CiAJCXJlbGVhc2VfcmVnaW9uKGlvLCA4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwppbmRleCA1MWQ1N2VkLi4xNWIxMGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwpAQCAtNjksNiArNjksNyBAQAogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogCiBzdHJ1Y3Qgem9sX2RldmljZSB7CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CiAJaW50IHBvcnQ7CiAJaW50IGN1cnZvbDsKIAl1bnNpZ25lZCBsb25nIGN1cmZyZXE7CkBAIC0xMjIsOCArMTIzLDExIEBACiAJdW5zaWduZWQgaW50IHN0ZXJlbyA9IGRldi0+c3RlcmVvOwogCWludCBpOwogCi0JaWYgKGZyZXEgPT0gMCkKLQkJcmV0dXJuIDE7CisJaWYgKGZyZXEgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6b2x0cml4OiByZWNlaXZlZCB6ZXJvIGZyZXEuIEZhaWxlZCB0byBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbSA9IChmcmVxIC8gMTYwIC0gODgwMCkgKiAyOwogCWYgPSAodW5zaWduZWQgbG9uZyBsb25nKSBtICsgMHg0ZDFjOwogCkBAIC0yNDUsOCArMjQ5LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHpvbF9kZXZpY2UgKnpvbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgem9sX2RldmljZSAqem9sID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICh2LT5pbmRleCA+IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjc2LDE5ICsyNzksMjAgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3Qgem9sX2RldmljZSAqem9sID0gZGV2LT5wcml2OworCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJem9sLT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OwotCXpvbF9zZXRmcmVxKHpvbCwgem9sLT5jdXJmcmVxKTsKKwlpZiAoem9sX3NldGZyZXEoem9sLCB6b2wtPmN1cmZyZXEpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiem9sdHJpeDogU2V0IGZyZXF1ZW5jeSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHpvbF9kZXZpY2UgKnpvbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgem9sX2RldmljZSAqem9sID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwogCWYtPmZyZXF1ZW5jeSA9IHpvbC0+Y3VyZnJlcTsKQEAgLTMxMyw4ICszMTcsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3Qgem9sX2RldmljZSAqem9sID0gZGV2LT5wcml2OworCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTMzMCw4ICszMzMsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3Qgem9sX2RldmljZSAqem9sID0gZGV2LT5wcml2OworCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKQEAgLTM0Nyw3ICszNDksMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXpvbC0+c3RlcmVvID0gMTsKLQl6b2xfc2V0ZnJlcSh6b2wsIHpvbC0+Y3VyZnJlcSk7CisJaWYgKHpvbF9zZXRmcmVxKHpvbCwgem9sLT5jdXJmcmVxKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInpvbHRyaXg6IFNldCBmcmVxdWVuY3kgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KICNpZiAwCiAvKiBGSVhNRTogSW1wbGVtZW50IHN0ZXJlby9tb25vIHN3aXRjaCBvbiBWNEwyICovCiAJCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgewpAQCAtMzk2LDExICs0MDEsMjIgQEAKIAogc3RhdGljIHN0cnVjdCB6b2xfZGV2aWNlIHpvbHRyaXhfdW5pdDsKIAorc3RhdGljIGludCB6b2x0cml4X2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZ6b2x0cml4X3VuaXQuaW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgem9sdHJpeF9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJnpvbHRyaXhfdW5pdC5pbl91c2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6b2x0cml4X2ZvcHMgPQogewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkub3BlbiAgICAgICAgICAgPSB6b2x0cml4X2V4Y2x1c2l2ZV9vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IHpvbHRyaXhfZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTQyNyw2ICs0NDMsNyBAQAogCS5uYW1lCQk9ICJab2x0cml4IFJhZGlvIFBsdXMiLAogCS5mb3BzICAgICAgICAgICA9ICZ6b2x0cml4X2ZvcHMsCiAJLmlvY3RsX29wcyAJPSAmem9sdHJpeF9pb2N0bF9vcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHpvbHRyaXhfaW5pdCh2b2lkKQpAQCAtNDQwLDcgKzQ1Nyw3IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0Jem9sdHJpeF9yYWRpby5wcml2ID0gJnpvbHRyaXhfdW5pdDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmem9sdHJpeF9yYWRpbywgJnpvbHRyaXhfdW5pdCk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgInpvbHRyaXgiKSkgewogCQlwcmludGsoS0VSTl9FUlIgInpvbHRyaXg6IHBvcnQgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgaW8pOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGVjYmZhMWIuLjQ3MTAyYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTM0LDYgKzM0LDcgQEAKIAlzZWxlY3QgVklERU9CVUZfR0VOCiAKIGNvbmZpZyBWSURFT19CVENYCisJZGVwZW5kcyBvbiBQQ0kKIAl0cmlzdGF0ZQogCiBjb25maWcgVklERU9fSVIKQEAgLTcxLDYgKzcyLDE1IEBACiAJICBWNEwgZGV2aWNlcy4KIAkgIEluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFZJREVPX0ZJWEVEX01JTk9SX1JBTkdFUworCWJvb2wgIkVuYWJsZSBvbGQtc3R5bGUgZml4ZWQgbWlub3IgcmFuZ2VzIGZvciB2aWRlbyBkZXZpY2VzIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBvbGQtc3R5bGUgZml4ZWQtcmFuZ2UgbWlub3IgYXNzaWdubWVudHMuCisJICBPbmx5IHVzZWZ1bCBpZiB5b3UgcmVseSBvbiB0aGUgb2xkIGJlaGF2aW9yIGFuZCB1c2UgbWtub2QgaW5zdGVhZCBvZiB1ZGV2LgorCisJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCiAJYm9vbCAiQXV0b3NlbGVjdCBwZXJ0aW5lbnQgZW5jb2RlcnMvZGVjb2RlcnMgYW5kIG90aGVyIGhlbHBlciBjaGlwcyIKIAlkZWZhdWx0IHkKQEAgLTU3OCwxMyArNTg4LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhYTUyNDkuCiAKLWNvbmZpZyBUVU5FUl8zMDM2Ci0JdHJpc3RhdGUgIlNBQjMwMzYgdHVuZXIiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQaGlsaXBzIFNBQjMwMzYgY29tcGF0aWJsZSB0dW5lcnMuCi0JICBJZiBpbiBkb3VidCwgc2F5IE4uCi0KIGNvbmZpZyBWSURFT19WSU5PCiAJdHJpc3RhdGUgIlNHSSBWaW5vIFZpZGVvIEZvciBMaW51eCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEkyQyAmJiBTR0lfSVAyMiAmJiBFWFBFUklNRU5UQUwgJiYgVklERU9fVjRMMgpAQCAtNjAyLDc5ICs2MDUsNyBAQAogCSAgZHJpdmVyIGZvciBQQ0kuICBUaGVyZSBpcyBhIHByb2R1Y3QgcGFnZSBhdAogCSAgPGh0dHA6Ly93d3cuc3RyYWRpcy5jb20vPi4KIAotY29uZmlnIFZJREVPX1pPUkFOCi0JdHJpc3RhdGUgIlpvcmFuIFpSMzYwNTcvMzYwNjcgVmlkZW8gRm9yIExpbnV4IgotCWRlcGVuZHMgb24gUENJICYmIEkyQ19BTEdPQklUICYmIFZJREVPX1Y0TDEgJiYgVklSVF9UT19CVVMKLQloZWxwCi0JICBTYXkgWSBmb3Igc3VwcG9ydCBmb3IgTUpQRUcgY2FwdHVyZSBjYXJkcyBiYXNlZCBvbiB0aGUgWm9yYW4KLQkgIDM2MDU3LzM2MDY3IFBDSSBjb250cm9sbGVyIGNoaXBzZXQuIFRoaXMgaW5jbHVkZXMgdGhlIElvbWVnYQotCSAgQnV6LCBQaW5uYWNsZSBEQzEwKyBhbmQgdGhlIExpbnV4IE1lZGlhIExhYnMgTE1MMzMuIFRoZXJlIGlzCi0JICBhIGRyaXZlciBob21lcGFnZSBhdCA8aHR0cDovL21qcGVnLnNmLm5ldC9kcml2ZXItem9yYW4vPi4gRm9yCi0JICBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuPi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgenIzNjA2Ny4KLQotY29uZmlnIFZJREVPX1pPUkFOX0RDMzAKLQl0cmlzdGF0ZSAiUGlubmFjbGUvTWlybyBEQzMwKCspIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBWSURFT19aT1JBTgotCXNlbGVjdCBWSURFT19BRFY3MTc1IGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCi0Jc2VsZWN0IFZJREVPX1ZQWDMyMjAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgUGlubmFjbGUvTWlybyBEQzMwKCspIE1KUEVHIGNhcHR1cmUvcGxheWJhY2sKLQkgIGNhcmQuIFRoaXMgYWxzbyBzdXBwb3J0cyByZWFsbHkgb2xkIERDMTAgY2FyZHMgYmFzZWQgb24gdGhlCi0JICB6cjM2MDUwIE1KUEVHIGNvZGVjIGFuZCB6cjM2MDE2IFZGRS4KLQotY29uZmlnIFZJREVPX1pPUkFOX1pSMzYwNjAKLQl0cmlzdGF0ZSAiWm9yYW4gWlIzNjA2MCIKLQlkZXBlbmRzIG9uIFZJREVPX1pPUkFOCi0JaGVscAotCSAgU2F5IFkgdG8gc3VwcG9ydCBab3JhbiBib2FyZHMgYmFzZWQgb24gMzYwNjAgY2hpcHMuCi0JICBUaGlzIGluY2x1ZGVzIElvbWVnYSBCdXosIFBpbm5hY2xlIERDMTAsIExpbnV4IG1lZGlhIExhYnMgMzMKLQkgIGFuZCAzMyBSMTAgYW5kIEF2ZXJNZWRpYSA2IGJvYXJkcy4KLQotY29uZmlnIFZJREVPX1pPUkFOX0JVWgotCXRyaXN0YXRlICJJb21lZ2EgQnV6IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBWSURFT19aT1JBTl9aUjM2MDYwCi0Jc2VsZWN0IFZJREVPX1NBQTcxMTEgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQlzZWxlY3QgVklERU9fU0FBNzE4NSBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBJb21lZ2EgQnV6IE1KUEVHIGNhcHR1cmUvcGxheWJhY2sgY2FyZC4KLQotY29uZmlnIFZJREVPX1pPUkFOX0RDMTAKLQl0cmlzdGF0ZSAiUGlubmFjbGUvTWlybyBEQzEwKCspIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBWSURFT19aT1JBTl9aUjM2MDYwCi0Jc2VsZWN0IFZJREVPX1NBQTcxMTAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQlzZWxlY3QgVklERU9fQURWNzE3NSBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBQaW5uYWNsZS9NaXJvIERDMTAoKykgTUpQRUcgY2FwdHVyZS9wbGF5YmFjawotCSAgY2FyZC4KLQotY29uZmlnIFZJREVPX1pPUkFOX0xNTDMzCi0JdHJpc3RhdGUgIkxpbnV4IE1lZGlhIExhYnMgTE1MMzMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFZJREVPX1pPUkFOX1pSMzYwNjAKLQlzZWxlY3QgVklERU9fQlQ4MTkgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQlzZWxlY3QgVklERU9fQlQ4NTYgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgTGludXggTWVkaWEgTGFicyBMTUwzMyBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCi0JICBjYXJkLgotCi1jb25maWcgVklERU9fWk9SQU5fTE1MMzNSMTAKLQl0cmlzdGF0ZSAiTGludXggTWVkaWEgTGFicyBMTUwzM1IxMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gVklERU9fWk9SQU5fWlIzNjA2MAotCXNlbGVjdCBWSURFT19TQUE3MTE0IGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCi0Jc2VsZWN0IFZJREVPX0FEVjcxNzAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQloZWxwCi0JICBzdXBwb3J0IGZvciB0aGUgTGludXggTWVkaWEgTGFicyBMTUwzM1IxMCBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCi0JICBjYXJkLgotCi1jb25maWcgVklERU9fWk9SQU5fQVZTNkVZRVMKLQl0cmlzdGF0ZSAiQXZlck1lZGlhIDYgRXllcyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVklERU9fWk9SQU5fWlIzNjA2MCAmJiBFWFBFUklNRU5UQUwgJiYgVklERU9fVjRMMQotCXNlbGVjdCBWSURFT19CVDg1NiBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwotCXNlbGVjdCBWSURFT19LUzAxMjcgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgQXZlck1lZGlhIDYgRXllcyB2aWRlbyBzdXJ2ZWlsbGFuY2UgY2FyZC4KK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi9LY29uZmlnIgogCiBjb25maWcgVklERU9fTUVZRQogCXRyaXN0YXRlICJTb255IFZhaW8gUGljdHVyZWJvb2sgTW90aW9uIEV5ZSBWaWRlbyBGb3IgTGludXgiCkBAIC02OTcsNyArNjI4LDcgQEAKIAlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19WNEwxICYmIEkyQwogCXNlbGVjdCBWSURFT19TQUE3MTQ2X1ZWCiAJc2VsZWN0IFZJREVPX1RVTkVSCi0Jc2VsZWN0IFZJREVPX1NBQTcxMTEgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KKwlzZWxlY3QgVklERU9fU0FBNzExNSBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwogCXNlbGVjdCBWSURFT19UREE5ODQwIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCiAJc2VsZWN0IFZJREVPX1RFQTY0MTVDIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCiAJc2VsZWN0IFZJREVPX1RFQTY0MjAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KQEAgLTcwOCwyMSArNjM5LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG14Yi4KIAotY29uZmlnIFZJREVPX0RQQwotCXRyaXN0YXRlICJQaGlsaXBzLVNlbWljb25kdWN0b3JzICdkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQnIgotCWRlcGVuZHMgb24gUENJICYmIFZJREVPX1Y0TDEgJiYgSTJDCi0Jc2VsZWN0IFZJREVPX1NBQTcxNDZfVlYKLQlzZWxlY3QgVklERU9fU0FBNzExMSBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSAnZHBjNzE0NiBkZW1vbnN0cmF0aW9uCi0JICBib2FyZCcgYnkgUGhpbGlwcy1TZW1pY29uZHVjdG9ycy4gSXQncyB0aGUgcmVmZXJlbmNlIGRlc2lnbgotCSAgZm9yIFNBQTcxNDYgYmFzZXMgYm9hcmRzLCBzbyBpZiB5b3UgaGF2ZSBzb21lIHVuc3VwcG9ydGVkCi0JICBzYWE3MTQ2IGJhc2VkLCBhbmFsb2cgdmlkZW8gY2FyZCwgY2hhbmNlcyBhcmUgZ29vZCB0aGF0IGl0Ci0JICB3aWxsIHdvcmsgd2l0aCB0aGlzIHNrZWxldG9uIGRyaXZlci4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHBjNzE0Ni4KLQogY29uZmlnIFZJREVPX0hFWElVTV9PUklPTgogCXRyaXN0YXRlICJIZXhpdW0gSFYtUENJNiBhbmQgT3Jpb24gZnJhbWUgZ3JhYmJlciIKIAlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19WNEwyICYmIEkyQwpAQCAtNzg0LDYgKzcwMCw3MCBAQAogCSAgQ01PUyBjYW1lcmEgY29udHJvbGxlci4gIFRoaXMgaXMgdGhlIGNvbnRyb2xsZXIgZm91bmQgb24gZmlyc3QtCiAJICBnZW5lcmF0aW9uIE9MUEMgc3lzdGVtcy4KIAorY29uZmlnIFNPQ19DQU1FUkEKKwl0cmlzdGF0ZSAiU29DIGNhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBIQVNfRE1BCisJc2VsZWN0IFZJREVPQlVGX0dFTgorCWhlbHAKKwkgIFNvQyBDYW1lcmEgaXMgYSBjb21tb24gQVBJIHRvIHNldmVyYWwgY2FtZXJhcywgbm90IGNvbm5lY3RpbmcKKwkgIG92ZXIgYSBidXMgbGlrZSBQQ0kgb3IgVVNCLiBGb3IgZXhhbXBsZSBzb21lIGkyYyBjYW1lcmEgY29ubmVjdGVkCisJICBkaXJlY3RseSB0byB0aGUgZGF0YSBidXMgb2YgYW4gU29DLgorCitjb25maWcgU09DX0NBTUVSQV9NVDlNMDAxCisJdHJpc3RhdGUgIm10OW0wMDEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19DQU1FUkEgJiYgSTJDCisJc2VsZWN0IEdQSU9fUENBOTUzWCBpZiBNVDlNMDAxX1BDQTk1MzZfU1dJVENICisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTVQ5TTAwMSBjYW1lcmFzIGZyb20gTWljcm9uLCBtb25vY2hyb21lCisJICBhbmQgY29sb3VyIG1vZGVscy4KKworY29uZmlnIE1UOU0wMDFfUENBOTUzNl9TV0lUQ0gKKwlib29sICJwY2E5NTM2IGRhdGF3aWR0aCBzd2l0Y2ggZm9yIG10OW0wMDEiCisJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBX01UOU0wMDEgJiYgR0VORVJJQ19HUElPCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91ciBNVDlNMDAxIGNhbWVyYSB1c2VzIGEgUENBOTUzNiBJMkMgR1BJTworCSAgZXh0ZW5kZXIgdG8gc3dpdGNoIGJldHdlZW4gOCBhbmQgMTAgYml0IGRhdGF3aWR0aCBtb2RlcworCitjb25maWcgU09DX0NBTUVSQV9NVDlNMTExCisJdHJpc3RhdGUgIm10OW0xMTEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19DQU1FUkEgJiYgSTJDCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTVQ5TTExMSBjYW1lcmFzIGZyb20gTWljcm9uCisKK2NvbmZpZyBTT0NfQ0FNRVJBX01UOVYwMjIKKwl0cmlzdGF0ZSAibXQ5djAyMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKKwlzZWxlY3QgR1BJT19QQ0E5NTNYIGlmIE1UOVYwMjJfUENBOTUzNl9TV0lUQ0gKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNVDlWMDIyIGNhbWVyYXMgZnJvbSBNaWNyb24KKworY29uZmlnIE1UOVYwMjJfUENBOTUzNl9TV0lUQ0gKKwlib29sICJwY2E5NTM2IGRhdGF3aWR0aCBzd2l0Y2ggZm9yIG10OXYwMjIiCisJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBX01UOVYwMjIgJiYgR0VORVJJQ19HUElPCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91ciBNVDlWMDIyIGNhbWVyYSB1c2VzIGEgUENBOTUzNiBJMkMgR1BJTworCSAgZXh0ZW5kZXIgdG8gc3dpdGNoIGJldHdlZW4gOCBhbmQgMTAgYml0IGRhdGF3aWR0aCBtb2RlcworCitjb25maWcgU09DX0NBTUVSQV9QTEFURk9STQorCXRyaXN0YXRlICJwbGF0Zm9ybSBjYW1lcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19DQU1FUkEKKwloZWxwCisJICBUaGlzIGlzIGEgZ2VuZXJpYyBTb0MgY2FtZXJhIHBsYXRmb3JtIGRyaXZlciwgdXNlZnVsIGZvciB0ZXN0aW5nCisKK2NvbmZpZyBWSURFT19QWEEyN3gKKwl0cmlzdGF0ZSAiUFhBMjd4IFF1aWNrIENhcHR1cmUgSW50ZXJmYWNlIGRyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBQWEEyN3ggJiYgU09DX0NBTUVSQQorCXNlbGVjdCBWSURFT0JVRl9ETUFfU0cKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdjRsMiBkcml2ZXIgZm9yIHRoZSBQWEEyN3ggUXVpY2sgQ2FwdHVyZSBJbnRlcmZhY2UKKworY29uZmlnIFZJREVPX1NIX01PQklMRV9DRVUKKwl0cmlzdGF0ZSAiU3VwZXJIIE1vYmlsZSBDRVUgSW50ZXJmYWNlIGRyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBTT0NfQ0FNRVJBICYmIEhBU19ETUEKKwlzZWxlY3QgVklERU9CVUZfRE1BX0NPTlRJRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2NGwyIGRyaXZlciBmb3IgdGhlIFN1cGVySCBNb2JpbGUgQ0VVIEludGVyZmFjZQorCiAjCiAjIFVTQiBNdWx0aW1lZGlhIGRldmljZSBjb25maWd1cmF0aW9uCiAjCkBAIC04MjIsOCArODAyLDcgQEAKIAogY29uZmlnIFVTQl9XOTk2OENGCiAJdHJpc3RhdGUgIlVTQiBXOTk2Wzg3XUNGIEpQRUcgRHVhbCBNb2RlIENhbWVyYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVklERU9fVjRMMSAmJiBJMkMKLQlzZWxlY3QgVklERU9fT1ZDQU1DSElQCisJZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEkyQyAmJiBWSURFT19PVkNBTUNISVAKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gT1Y2ODEgb3IKIAkgIFdpbmJvbmQgVzk5NjdDRi9XOTk2OENGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgQ2hpcHMuCkBAIC05MTQsNjQgKzg5Myw0IEBACiAKIGVuZGlmICMgVjRMX1VTQl9EUklWRVJTCiAKLWNvbmZpZyBTT0NfQ0FNRVJBCi0JdHJpc3RhdGUgIlNvQyBjYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgSEFTX0RNQQotCXNlbGVjdCBWSURFT0JVRl9HRU4KLQloZWxwCi0JICBTb0MgQ2FtZXJhIGlzIGEgY29tbW9uIEFQSSB0byBzZXZlcmFsIGNhbWVyYXMsIG5vdCBjb25uZWN0aW5nCi0JICBvdmVyIGEgYnVzIGxpa2UgUENJIG9yIFVTQi4gRm9yIGV4YW1wbGUgc29tZSBpMmMgY2FtZXJhIGNvbm5lY3RlZAotCSAgZGlyZWN0bHkgdG8gdGhlIGRhdGEgYnVzIG9mIGFuIFNvQy4KLQotY29uZmlnIFNPQ19DQU1FUkFfTVQ5TTAwMQotCXRyaXN0YXRlICJtdDltMDAxIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQwotCXNlbGVjdCBHUElPX1BDQTk1M1ggaWYgTVQ5TTAwMV9QQ0E5NTM2X1NXSVRDSAotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1UOU0wMDEgY2FtZXJhcyBmcm9tIE1pY3JvbiwgbW9ub2Nocm9tZQotCSAgYW5kIGNvbG91ciBtb2RlbHMuCi0KLWNvbmZpZyBNVDlNMDAxX1BDQTk1MzZfU1dJVENICi0JYm9vbCAicGNhOTUzNiBkYXRhd2lkdGggc3dpdGNoIGZvciBtdDltMDAxIgotCWRlcGVuZHMgb24gU09DX0NBTUVSQV9NVDlNMDAxICYmIEdFTkVSSUNfR1BJTwotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIGlmIHlvdXIgTVQ5TTAwMSBjYW1lcmEgdXNlcyBhIFBDQTk1MzYgSTJDIEdQSU8KLQkgIGV4dGVuZGVyIHRvIHN3aXRjaCBiZXR3ZWVuIDggYW5kIDEwIGJpdCBkYXRhd2lkdGggbW9kZXMKLQotY29uZmlnIFNPQ19DQU1FUkFfTVQ5VjAyMgotCXRyaXN0YXRlICJtdDl2MDIyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQwotCXNlbGVjdCBHUElPX1BDQTk1M1ggaWYgTVQ5VjAyMl9QQ0E5NTM2X1NXSVRDSAotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1UOVYwMjIgY2FtZXJhcyBmcm9tIE1pY3JvbgotCi1jb25maWcgTVQ5VjAyMl9QQ0E5NTM2X1NXSVRDSAotCWJvb2wgInBjYTk1MzYgZGF0YXdpZHRoIHN3aXRjaCBmb3IgbXQ5djAyMiIKLQlkZXBlbmRzIG9uIFNPQ19DQU1FUkFfTVQ5VjAyMiAmJiBHRU5FUklDX0dQSU8KLQloZWxwCi0JICBTZWxlY3QgdGhpcyBpZiB5b3VyIE1UOVYwMjIgY2FtZXJhIHVzZXMgYSBQQ0E5NTM2IEkyQyBHUElPCi0JICBleHRlbmRlciB0byBzd2l0Y2ggYmV0d2VlbiA4IGFuZCAxMCBiaXQgZGF0YXdpZHRoIG1vZGVzCi0KLWNvbmZpZyBTT0NfQ0FNRVJBX1BMQVRGT1JNCi0JdHJpc3RhdGUgInBsYXRmb3JtIGNhbWVyYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09DX0NBTUVSQQotCWhlbHAKLQkgIFRoaXMgaXMgYSBnZW5lcmljIFNvQyBjYW1lcmEgcGxhdGZvcm0gZHJpdmVyLCB1c2VmdWwgZm9yIHRlc3RpbmcKLQotY29uZmlnIFZJREVPX1BYQTI3eAotCXRyaXN0YXRlICJQWEEyN3ggUXVpY2sgQ2FwdHVyZSBJbnRlcmZhY2UgZHJpdmVyIgotCWRlcGVuZHMgb24gVklERU9fREVWICYmIFBYQTI3eAotCXNlbGVjdCBTT0NfQ0FNRVJBCi0Jc2VsZWN0IFZJREVPQlVGX0RNQV9TRwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSB2NGwyIGRyaXZlciBmb3IgdGhlIFBYQTI3eCBRdWljayBDYXB0dXJlIEludGVyZmFjZQotCi1jb25maWcgVklERU9fU0hfTU9CSUxFX0NFVQotCXRyaXN0YXRlICJTdXBlckggTW9iaWxlIENFVSBJbnRlcmZhY2UgZHJpdmVyIgotCWRlcGVuZHMgb24gVklERU9fREVWCi0Jc2VsZWN0IFNPQ19DQU1FUkEKLQlzZWxlY3QgVklERU9CVUZfRE1BX0NPTlRJRwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSB2NGwyIGRyaXZlciBmb3IgdGhlIFN1cGVySCBNb2JpbGUgQ0VVIEludGVyZmFjZQotCiBlbmRpZiAjIFZJREVPX0NBUFRVUkVfRFJJVkVSUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggZWY3YzhkMy4uMTY5NjJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC0yLDggKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIHZpZGVvIGNhcHR1cmUvcGxheWJhY2sgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLXpyMzYwNjctb2Jqcwk6PQl6b3Jhbl9wcm9jZnMubyB6b3Jhbl9kZXZpY2UubyBcCi0JCQl6b3Jhbl9kcml2ZXIubyB6b3Jhbl9jYXJkLm8KIHR1bmVyLW9ianMJOj0JdHVuZXItY29yZS5vCiAKIG1zcDM0MDAtb2Jqcwk6PQltc3AzNDAwLWRyaXZlci5vIG1zcDM0MDAta3RocmVhZHMubwpAQCAtNTQsOSArNTIsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0JUODY2KSArPSBidDg2Ni5vCiBvYmotJChDT05GSUdfVklERU9fS1MwMTI3KSArPSBrczAxMjcubwogCi1vYmotJChDT05GSUdfVklERU9fWk9SQU4pICs9IHpyMzYwNjcubyB2aWRlb2NvZGVjLm8KLW9iai0kKENPTkZJR19WSURFT19aT1JBTl9EQzMwKSArPSB6cjM2MDUwLm8genIzNjAxNi5vCi1vYmotJChDT05GSUdfVklERU9fWk9SQU5fWlIzNjA2MCkgKz0genIzNjA2MC5vCitvYmotJChDT05GSUdfVklERU9fWk9SQU4pICs9IHpvcmFuLwogCiBvYmotJChDT05GSUdfVklERU9fUE1TKSArPSBwbXMubwogb2JqLSQoQ09ORklHX1ZJREVPX1ZJTk8pICs9IHZpbm8ubyBpbmR5Y2FtLm8KQEAgLTg0LDggKzgwLDYgQEAKIG9iai0kKENPTkZJR19WSURFT19NWEIpICs9IG14Yi5vCiBvYmotJChDT05GSUdfVklERU9fSEVYSVVNX09SSU9OKSArPSBoZXhpdW1fb3Jpb24ubwogb2JqLSQoQ09ORklHX1ZJREVPX0hFWElVTV9HRU1JTkkpICs9IGhleGl1bV9nZW1pbmkubwotb2JqLSQoQ09ORklHX1ZJREVPX0RQQykgKz0gZHBjNzE0Ni5vCi1vYmotJChDT05GSUdfVFVORVJfMzAzNikgKz0gdHVuZXItMzAzNi5vCiAKIG9iai0kKENPTkZJR19WSURFT0JVRl9HRU4pICs9IHZpZGVvYnVmLWNvcmUubwogb2JqLSQoQ09ORklHX1ZJREVPQlVGX0RNQV9TRykgKz0gdmlkZW9idWYtZG1hLXNnLm8KQEAgLTEzNyw2ICsxMzEsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVUpCSs9IHNoX21vYmlsZV9jZXVfY2FtZXJhLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBKQkrPSBzb2NfY2FtZXJhLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDEpCSs9IG10OW0wMDEubworb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfTVQ5TTExMSkJKz0gbXQ5bTExMS5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlWMDIyKQkrPSBtdDl2MDIyLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX1BMQVRGT1JNKQkrPSBzb2NfY2FtZXJhX3BsYXRmb3JtLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKaW5kZXggOWU0MzZhZC4uMjE4NzU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCkBAIC0xMTYsNiArMTE2LDcgQEAKIAlpbnQgd2lkdGgsIGhlaWdodDsKIAlpbnQgZnJhbWVfYnl0ZXMsIGxpbmVfYnl0ZXM7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CiAKQEAgLTI2OSw3ICsyNzAsNyBAQAogc3RhdGljIHNzaXplX3QgYXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgYXJfZGV2aWNlICphciA9IHYtPnByaXY7CisJc3RydWN0IGFyX2RldmljZSAqYXIgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2KTsKIAlsb25nIHJldCA9IGFyLT5mcmFtZV9ieXRlczsJCS8qIHJldHVybiByZWFkIGJ5dGVzICovCiAJdW5zaWduZWQgbG9uZyBhcnZjcjEgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zOTksNyArNDAwLDcgQEAKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBhcl9kZXZpY2UgKmFyID0gZGV2LT5wcml2OworCXN0cnVjdCBhcl9kZXZpY2UgKmFyID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKIAogCURFQlVHKDEsICJhcl9pb2N0bCgpXG4iKTsKIAlzd2l0Y2goY21kKSB7CkBAIC02MjUsNyArNjI2LDcgQEAKICAqLwogc3RhdGljIGludCBhcl9pbml0aWFsaXplKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXJfZGV2aWNlICphciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJfZGV2aWNlICphciA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgbG9uZyBjciA9IDA7CiAJaW50IGksZm91bmQ9MDsKIApAQCAtNzMyLDcgKzczMyw3IEBACiAKIHZvaWQgYXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpCiB7Ci0Jc3RydWN0IGFyX2RldmljZSAqYXIgPSB2ZmQtPnByaXY7CisJc3RydWN0IGFyX2RldmljZSAqYXIgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZmQpOwogCW11dGV4X2xvY2soJmFyLT5sb2NrKTsKIAl2aWRlb19kZXZpY2VfcmVsZWFzZSh2ZmQpOwogfQpAQCAtNzQyLDEwICs3NDMsMjMgQEAKICAqIFZpZGVvNExpbnV4IE1vZHVsZSBmdW5jdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgYXJfZGV2aWNlIGFyZGV2OworCitzdGF0aWMgaW50IGFyX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZhcmRldi5pbl91c2UpID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCBhcl9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljbGVhcl9iaXQoMCwgJmFyZGV2LmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFyX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlCT0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4JCT0gYXJfZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UJPSBhcl9leGNsdXNpdmVfcmVsZWFzZSwKIAkucmVhZAkJPSBhcl9yZWFkLAogCS5pb2N0bAkJPSBhcl9pb2N0bCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC03NjIsNyArNzc2LDYgQEAKIH07CiAKICNkZWZpbmUgQUxJR040KHgpCSgoKChpbnQpKHgpKSAmIDB4MykgPT0gMCkKLXN0YXRpYyBzdHJ1Y3QgYXJfZGV2aWNlIGFyZGV2OwogCiBzdGF0aWMgaW50IF9faW5pdCBhcl9pbml0KHZvaWQpCiB7CkBAIC04MDIsNyArODE1LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbWNweShhci0+dmRldiwgJmFyX3RlbXBsYXRlLCBzaXplb2YoYXJfdGVtcGxhdGUpKTsKLQlhci0+dmRldi0+cHJpdiA9IGFyOworCXZpZGVvX3NldF9kcnZkYXRhKGFyLT52ZGV2LCBhcik7CiAKIAlpZiAodmdhKSB7CiAJCWFyLT53aWR0aCAJPSBBUl9XSURUSF9WR0E7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jYXJkcy5jCmluZGV4IGVkNDg5MDguLjVmMDdhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jYXJkcy5jCkBAIC00Niw3ICs0Niw3IEBACiAvKiBUdW5lciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYXUwODI4IGJvYXJkcy4gQ3VycmVudGx5IG9ubHkgbmVlZGVkCiAgKiBmb3IgSFZSMTUwMFEsIHdoaWNoIGhhcyBhbiB4YzUwMDAgdHVuZXIuCiAgKi8KLWludCBhdTA4MjhfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbW1hbmQsIGludCBhcmcpCitpbnQgYXUwODI4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKQogewogCXN0cnVjdCBhdTA4MjhfZGV2ICpkZXYgPSBwcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtZHZiLmMKaW5kZXggYmE5NGJlNy4uZjBmY2RiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1kdmIuYwpAQCAtMzYsMTEgKzM2LDM5IEBACiAjZGVmaW5lIF9BVTA4MjhfQlVMS1BJUEUgMHg4MwogI2RlZmluZSBfQlVMS1BJUEVTSVpFIDB4ZTUyMgogCitzdGF0aWMgdTggaGF1cHBhdWdlX2h2cjk1MHFfbGVkX3N0YXRlc1tdID0geworCTB4MDAsIC8qIG9mZiAqLworCTB4MDIsIC8qIHllbGxvdyAqLworCTB4MDQsIC8qIGdyZWVuICovCit9OworCitzdGF0aWMgc3RydWN0IGF1ODUyMl9sZWRfY29uZmlnIGhhdXBwYXVnZV9odnI5NTBxX2xlZF9jZmcgPSB7CisJLmdwaW9fb3V0cHV0ID0gMHgwMGUwLAorCS5ncGlvX291dHB1dF9lbmFibGUgID0gMHg2MDA2LAorCS5ncGlvX291dHB1dF9kaXNhYmxlID0gMHgwNjYwLAorCisJLmdwaW9fbGVkcyA9IDB4MDBlMiwKKwkubGVkX3N0YXRlcyAgPSBoYXVwcGF1Z2VfaHZyOTUwcV9sZWRfc3RhdGVzLAorCS5udW1fbGVkX3N0YXRlcyA9IHNpemVvZihoYXVwcGF1Z2VfaHZyOTUwcV9sZWRfc3RhdGVzKSwKKworCS52c2I4X3N0cm9uZyAgID0gMjAgLyogZEIgKi8gKiAxMCwKKwkucWFtNjRfc3Ryb25nICA9IDI1IC8qIGRCICovICogMTAsCisJLnFhbTI1Nl9zdHJvbmcgPSAzMiAvKiBkQiAqLyAqIDEwLAorfTsKKwogc3RhdGljIHN0cnVjdCBhdTg1MjJfY29uZmlnIGhhdXBwYXVnZV9odnI5NTBxX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4OGUgPj4gMSwKIAkuc3RhdHVzX21vZGUgICA9IEFVODUyMl9ERU1PRExPQ0tJTkcsCiAJLnFhbV9pZiAgICAgICAgPSBBVTg1MjJfSUZfNk1IWiwKIAkudnNiX2lmICAgICAgICA9IEFVODUyMl9JRl82TUhaLAorCS5sZWRfY2ZnICAgICAgID0gJmhhdXBwYXVnZV9odnI5NTBxX2xlZF9jZmcsCit9OworCitzdGF0aWMgc3RydWN0IGF1ODUyMl9jb25maWcgZnVzaW9uaGR0djd1c2JfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg4ZSA+PiAxLAorCS5zdGF0dXNfbW9kZSAgID0gQVU4NTIyX0RFTU9ETE9DS0lORywKKwkucWFtX2lmICAgICAgICA9IEFVODUyMl9JRl82TUhaLAorCS52c2JfaWYgICAgICAgID0gQVU4NTIyX0lGXzZNSFosCiB9OwogCiBzdGF0aWMgc3RydWN0IGF1ODUyMl9jb25maWcgaGF1cHBhdWdlX3dvb2RidXJ5X2NvbmZpZyA9IHsKQEAgLTUzLDcgKzgxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgeGM1MDAwX2NvbmZpZyBoYXVwcGF1Z2VfaHZyOTUwcV90dW5lcmNvbmZpZyA9IHsKIAkuaTJjX2FkZHJlc3MgICAgICA9IDB4NjEsCiAJLmlmX2toeiAgICAgICAgICAgPSA2MDAwLAotCS50dW5lcl9jYWxsYmFjayAgID0gYXUwODI4X3R1bmVyX2NhbGxiYWNrCiB9OwogCiBzdGF0aWMgc3RydWN0IG14bDUwMDd0X2NvbmZpZyBteGw1MDA3dF9odnI5NTBxX2NvbmZpZyA9IHsKQEAgLTM1MywxNCArMzgwLDEyIEBACiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CiAJY2FzZSBBVTA4MjhfQk9BUkRfSEFVUFBBVUdFX0hWUjg1MDoKIAljYXNlIEFVMDgyOF9CT0FSRF9IQVVQUEFVR0VfSFZSOTUwUToKLQljYXNlIEFVMDgyOF9CT0FSRF9EVklDT19GVVNJT05IRFRWNzoKIAkJZHZiLT5mcm9udGVuZCA9IGR2Yl9hdHRhY2goYXU4NTIyX2F0dGFjaCwKIAkJCQkmaGF1cHBhdWdlX2h2cjk1MHFfY29uZmlnLAogCQkJCSZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGR2Yi0+ZnJvbnRlbmQgIT0gTlVMTCkKLQkJCWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgZHZiLT5mcm9udGVuZCwKLQkJCQkmZGV2LT5pMmNfYWRhcCwKLQkJCQkmaGF1cHBhdWdlX2h2cjk1MHFfdHVuZXJjb25maWcsIGRldik7CisJCQlkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLAorCQkJCSAgICZoYXVwcGF1Z2VfaHZyOTUwcV90dW5lcmNvbmZpZyk7CiAJCWJyZWFrOwogCWNhc2UgQVUwODI4X0JPQVJEX0hBVVBQQVVHRV9IVlI5NTBRX01YTDoKIAkJZHZiLT5mcm9udGVuZCA9IGR2Yl9hdHRhY2goYXU4NTIyX2F0dGFjaCwKQEAgLTM4MCw2ICs0MDUsMTYgQEAKIAkJCQkgICAweDYwLCAmZGV2LT5pMmNfYWRhcCwKIAkJCQkgICAmaGF1cHBhdWdlX3dvb2RidXJ5X3R1bmVyY29uZmlnKTsKIAkJYnJlYWs7CisJY2FzZSBBVTA4MjhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVjc6CisJCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGF1ODUyMl9hdHRhY2gsCisJCQkJJmZ1c2lvbmhkdHY3dXNiX2NvbmZpZywKKwkJCQkmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkdmItPmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgZHZiLT5mcm9udGVuZCwKKwkJCQkmZGV2LT5pMmNfYWRhcCwKKwkJCQkmaGF1cHBhdWdlX2h2cjk1MHFfdHVuZXJjb25maWcpOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQgIgogCQkgICAgICAgImlzbid0IHN1cHBvcnRlZCB5ZXRcbiIpOwpAQCAtMzkwLDYgKzQyNSw4IEBACiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CisJLyogZGVmaW5lIGdlbmVyYWwtcHVycG9zZSBjYWxsYmFjayBwb2ludGVyICovCisJZHZiLT5mcm9udGVuZC0+Y2FsbGJhY2sgPSBhdTA4MjhfdHVuZXJfY2FsbGJhY2s7CiAKIAkvKiByZWdpc3RlciBldmVyeXRoaW5nICovCiAJcmV0ID0gZHZiX3JlZ2lzdGVyKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC5oCmluZGV4IDRmMTBmZjMuLjlkNmExMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC5oCkBAIC0xMDMsNyArMTAzLDggQEAKIGV4dGVybiBzdHJ1Y3QgYXUwODI4X2JvYXJkIGF1MDgyOF9ib2FyZHNbXTsKIGV4dGVybiBzdHJ1Y3QgdXNiX2RldmljZV9pZCBhdTA4MjhfdXNiX2lkX3RhYmxlW107CiBleHRlcm4gdm9pZCBhdTA4MjhfZ3Bpb19zZXR1cChzdHJ1Y3QgYXUwODI4X2RldiAqZGV2KTsKLWV4dGVybiBpbnQgYXUwODI4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKK2V4dGVybiBpbnQgYXUwODI4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21wb25lbnQsCisJCQkJIGludCBjb21tYW5kLCBpbnQgYXJnKTsKIGV4dGVybiB2b2lkIGF1MDgyOF9jYXJkX3NldHVwKHN0cnVjdCBhdTA4MjhfZGV2ICpkZXYpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDg1Ni5jCmluZGV4IDk4ZWUyZDguLmFiMmNlNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NTYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODU2LmMKQEAgLTY4LDggKzY4LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBSRUdfT0ZGU0VUCTB4REEKLSNkZWZpbmUgQlQ4NTZfTlJfUkVHCTYKKyNkZWZpbmUgQlQ4NTZfUkVHX09GRlNFVAkweERBCisjZGVmaW5lIEJUODU2X05SX1JFRwkJNgogCiBzdHJ1Y3QgYnQ4NTYgewogCXVuc2lnbmVkIGNoYXIgcmVnW0JUODU2X05SX1JFR107CkBAIC04OSw3ICs4OSw3IEBACiB7CiAJc3RydWN0IGJ0ODU2ICplbmNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQllbmNvZGVyLT5yZWdbcmVnIC0gUkVHX09GRlNFVF0gPSB2YWx1ZTsKKwllbmNvZGVyLT5yZWdbcmVnIC0gQlQ4NTZfUkVHX09GRlNFVF0gPSB2YWx1ZTsKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwogfQogCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogCXJldHVybiBidDg1Nl93cml0ZShjbGllbnQsIHJlZywKIAkJCSAgIChlbmNvZGVyLT4KLQkJCSAgICByZWdbcmVnIC0gUkVHX09GRlNFVF0gJiB+KDEgPDwgYml0KSkgfAorCQkJICAgIHJlZ1tyZWcgLSBCVDg1Nl9SRUdfT0ZGU0VUXSAmIH4oMSA8PCBiaXQpKSB8CiAJCQkgICAgKHZhbHVlID8gKDEgPDwgYml0KSA6IDApKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCA2MDgxZWRjLi4xMzc0MmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJeyAweDAwMjYxODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULAkiRE5UViBMaXZlISBNaW5pICJ9LAogCXsgMHhkMjAwZGJjMCwgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzIsCSJEVmlDTyBGdXNpb25IRFRWIDIiIH0sCiAJeyAweDc2M2MwMDhhLCBCVFRWX0JPQVJEX0dFT1ZJU0lPTl9HVjYwMCwJIkdlb1Zpc2lvbiBHVi02MDAiIH0sCi0KKwl7IDB4MTgwMTEwMDAsIEJUVFZfQk9BUkRfRU5MVFZfRk1fMiwJIkVuY29yZSBFTkwgVFYtRk0tMiIgfSwKIAl7IDAsIC0xLCBOVUxMIH0KIH07CiAKQEAgLTMwMzcsNiArMzAzNywzMSBAQAogCQkuaGFzX3JhZGlvICAgICAgPSAxLAogCQkuaGFzX3JlbW90ZSAgICAgPSAxLAogCX0sCisJW0JUVFZfQk9BUkRfRU5MVFZfRk1fMl0gPSB7CisJCS8qIEVuY29yZSBUViBUdW5lciBQcm8gRU5MIFRWLUZNLTIKKwkJICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmcgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIkVuY29yZSBFTkwgVFYtRk0tMiIsCisJCS52aWRlb19pbnB1dHMgICA9IDMsCisJCS5hdWRpb19pbnB1dHMgICA9IDEsCisJCS50dW5lciAgICAgICAgICA9IDAsCisJCS5zdmhzICAgICAgICAgICA9IDIsCisJCS8qIGJpdCA2ICAgICAgICAgIC0+IElSIGRpc2FibGVkCisJCSAgIGJpdCAxOC8xNyA9IDAwIC0+IG11dGUKKwkJCSAgICAgICAwMSAtPiBlbmFibGUgZXh0ZXJuYWwgYXVkaW8gaW5wdXQKKwkJCSAgICAgICAxMCAtPiBpbnRlcm5hbCBhdWRpbyBpbnB1dCAobW9ubz8pCisJCQkgICAgICAgMTEgLT4gaW50ZXJuYWwgYXVkaW8gaW5wdXQKKwkJICovCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDYwMDQwLAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDMgfSwKKwkJLmdwaW9tdXggICAgICAgID0geyAweDYwMDAwLCAweDYwMDAwLCAweDIwMDAwLCAweDIwMDAwIH0sCisJCS5ncGlvbXV0ZSAJPSAwLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RDTF9NRjAyR0lQXzVOLAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCisJCS5oYXNfcmFkaW8gICAgICA9IDEsCisJCS5oYXNfcmVtb3RlICAgICA9IDEsCisJfQogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBidHR2X251bV90dmNhcmRzID0gQVJSQVlfU0laRShidHR2X3R2Y2FyZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCmluZGV4IDZhZTRjYzguLjU4NThiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKQEAgLTc2LDkgKzc2LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2J1ZnNpemUgPSAweDIwODAwMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVzZXRfY3JvcCA9IDE7CiAKLXN0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsKLXN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKLXN0YXRpYyBpbnQgdmJpX25yID0gLTE7CitzdGF0aWMgaW50IHZpZGVvX25yW0JUVFZfTUFYXSA9IHsgWzAgLi4uIChCVFRWX01BWC0xKV0gPSAtMSB9Oworc3RhdGljIGludCByYWRpb19ucltCVFRWX01BWF0gPSB7IFswIC4uLiAoQlRUVl9NQVgtMSldID0gLTEgfTsKK3N0YXRpYyBpbnQgdmJpX25yW0JUVFZfTUFYXSA9IHsgWzAgLi4uIChCVFRWX01BWC0xKV0gPSAtMSB9Owogc3RhdGljIGludCBkZWJ1Z19sYXRlbmN5OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZkc3I7CkBAIC0xMDgsOSArMTA4LDYgQEAKIG1vZHVsZV9wYXJhbShkZWJ1Z19sYXRlbmN5LCAgICAgaW50LCAwNjQ0KTsKIAogbW9kdWxlX3BhcmFtKGZkc3IsICAgICAgICAgICAgICBpbnQsIDA0NDQpOwotbW9kdWxlX3BhcmFtKHZpZGVvX25yLCAgICAgICAgICBpbnQsIDA0NDQpOwotbW9kdWxlX3BhcmFtKHJhZGlvX25yLCAgICAgICAgICBpbnQsIDA0NDQpOwotbW9kdWxlX3BhcmFtKHZiaV9uciwgICAgICAgICAgICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGdidWZmZXJzLCAgICAgICAgICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGdidWZzaXplLCAgICAgICAgICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHJlc2V0X2Nyb3AsICAgICAgICBpbnQsIDA0NDQpOwpAQCAtMTMwLDcgKzEyNywxMCBAQAogbW9kdWxlX3BhcmFtKGZ1bGxfbHVtYV9yYW5nZSwgICBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGNvcmluZywgICAgICAgICAgICBpbnQsIDA0NDQpOwogCi1tb2R1bGVfcGFyYW1fYXJyYXkocmFkaW8sIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmFkaW8sICAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmFkaW9fbnIsICAgIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodmJpX25yLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MocmFkaW8sIlRoZSBUViBjYXJkIHN1cHBvcnRzIHJhZGlvLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwogTU9EVUxFX1BBUk1fREVTQyhiaWdlbmRpYW4sImJ5dGUgb3JkZXIgb2YgdGhlIGZyYW1lYnVmZmVyLCBkZWZhdWx0IGlzIG5hdGl2ZSBlbmRpYW4iKTsKQEAgLTE1Miw2ICsxNTIsOSBAQAogTU9EVUxFX1BBUk1fREVTQyh1dl9yYXRpbywicmF0aW8gYmV0d2VlbiB1IGFuZCB2IGdhaW5zLCBkZWZhdWx0IGlzIDUwIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfbHVtYV9yYW5nZSwidXNlIHRoZSBmdWxsIGx1bWEgcmFuZ2UsIGRlZmF1bHQgaXMgMCAobm8pIik7CiBNT0RVTEVfUEFSTV9ERVNDKGNvcmluZywic2V0IHRoZSBsdW1hIGNvcmluZyBsZXZlbCwgZGVmYXVsdCBpcyAwIChubykiKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJ2aWRlbyBkZXZpY2UgbnVtYmVycyIpOworTU9EVUxFX1BBUk1fREVTQyh2YmlfbnIsICJ2YmkgZGV2aWNlIG51bWJlcnMiKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsICJyYWRpbyBkZXZpY2UgbnVtYmVycyIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oImJ0dHYgLSB2NGwvdjRsMiBkcml2ZXIgbW9kdWxlIGZvciBidDg0OC84NzggYmFzZWQgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIgJiBNYXJjdXMgTWV0emxlciAmIEdlcmQgS25vcnIiKTsKQEAgLTEzNjcsNyArMTM3MCw3IEBACiAJCQkoYnR2LT5ncGlvaXJxID8gQlQ4NDhfSU5UX0dQSU5UIDogMCkgfAogCQkJQlQ4NDhfSU5UX1NDRVJSIHwKIAkJCShmZHNyID8gQlQ4NDhfSU5UX0ZEU1IgOiAwKSB8Ci0JCQlCVDg0OF9JTlRfUklTQ0l8QlQ4NDhfSU5UX09DRVJSfEJUODQ4X0lOVF9WUFJFU3wKKwkJCUJUODQ4X0lOVF9SSVNDSSB8IEJUODQ4X0lOVF9PQ0VSUiB8CiAJCQlCVDg0OF9JTlRfRk1UQ0hHfEJUODQ4X0lOVF9ITE9DS3wKIAkJCUJUODQ4X0lOVF9JMkNET05FLAogCQkJQlQ4NDhfSU5UX01BU0spOwpAQCAtMjY2MSwxOCArMjY2NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYnR0dl9lbnVtX2ZtdF92YmlfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQotewotCWlmICgwICE9IGYtPmluZGV4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7Ci0Jc3RyY3B5KGYtPmRlc2NyaXB0aW9uLCAidmJpIGRhdGEiKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGJ0dHZfZW51bV9mbXRfY2FwX292cihzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQogewogCWludCBpbmRleCA9IC0xLCBpOwpAQCAtMzIyNyw2ICszMjE4LDcgQEAKIAogCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0djogb3BlbiBtaW5vcj0lZFxuIixtaW5vcik7CiAKKwlsb2NrX2tlcm5lbCgpOwogCWZvciAoaSA9IDA7IGkgPCBidHR2X251bTsgaSsrKSB7CiAJCWlmIChidHR2c1tpXS52aWRlb19kZXYgJiYKIAkJICAgIGJ0dHZzW2ldLnZpZGVvX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKQEAgLTMyNDEsMTYgKzMyMzMsMjAgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChOVUxMID09IGJ0dikKKwlpZiAoTlVMTCA9PSBidHYpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlkcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogb3BlbiBjYWxsZWQgKHR5cGU9JXMpXG4iLAogCQlidHYtPmMubnIsdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKIAogCS8qIGFsbG9jYXRlIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KIAlmaCA9IGttYWxsb2Moc2l6ZW9mKCpmaCksR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCisJaWYgKE5VTEwgPT0gZmgpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CiAJKmZoID0gYnR2LT5pbml0OwogCWZoLT50eXBlID0gdHlwZTsKQEAgLTMyNzAsNiArMzI2Niw3IEBACiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBidHR2X2J1ZmZlciksCiAJCQkgICAgZmgpOwogCXNldF90dm5vcm0oYnR2LGJ0di0+dHZub3JtKTsKKwlzZXRfaW5wdXQoYnR2LCBidHYtPmlucHV0LCBidHYtPnR2bm9ybSk7CiAKIAlidHYtPnVzZXJzKys7CiAKQEAgLTMyOTAsNiArMzI4Nyw3IEBACiAJYnR0dl92YmlfZm10X3Jlc2V0KCZmaC0+dmJpX2ZtdCwgYnR2LT50dm5vcm0pOwogCiAJYnR0dl9maWVsZF9jb3VudChidHYpOworCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMzMCw2ICszMzI4LDEwIEBACiAKIAlidHYtPnVzZXJzLS07CiAJYnR0dl9maWVsZF9jb3VudChidHYpOworCisJaWYgKCFidHYtPnVzZXJzKQorCQlhdWRpb19tdXRlKGJ0diwgMSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM2Nyw3ICszMzY5LDYgQEAKIAkudmlkaW9jX2dfZm10X3ZpZF9vdmVybGF5ICAgICAgID0gYnR0dl9nX2ZtdF92aWRfb3ZlcmxheSwKIAkudmlkaW9jX3RyeV9mbXRfdmlkX292ZXJsYXkgICAgID0gYnR0dl90cnlfZm10X3ZpZF9vdmVybGF5LAogCS52aWRpb2Nfc19mbXRfdmlkX292ZXJsYXkgICAgICAgPSBidHR2X3NfZm10X3ZpZF9vdmVybGF5LAotCS52aWRpb2NfZW51bV9mbXRfdmJpX2NhcCAgICAgICAgPSBidHR2X2VudW1fZm10X3ZiaV9jYXAsCiAJLnZpZGlvY19nX2ZtdF92YmlfY2FwICAgICAgICAgICA9IGJ0dHZfZ19mbXRfdmJpX2NhcCwKIAkudmlkaW9jX3RyeV9mbXRfdmJpX2NhcCAgICAgICAgID0gYnR0dl90cnlfZm10X3ZiaV9jYXAsCiAJLnZpZGlvY19zX2ZtdF92YmlfY2FwICAgICAgICAgICA9IGJ0dHZfc19mbXRfdmJpX2NhcCwKQEAgLTM0MzAsMjEgKzM0MzEsMjYgQEAKIAogCWRwcmludGsoImJ0dHY6IG9wZW4gbWlub3I9JWRcbiIsbWlub3IpOwogCisJbG9ja19rZXJuZWwoKTsKIAlmb3IgKGkgPSAwOyBpIDwgYnR0dl9udW07IGkrKykgewotCQlpZiAoYnR0dnNbaV0ucmFkaW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQlpZiAoYnR0dnNbaV0ucmFkaW9fZGV2ICYmIGJ0dHZzW2ldLnJhZGlvX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKIAkJCWJ0diA9ICZidHR2c1tpXTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChOVUxMID09IGJ0dikKKwlpZiAoTlVMTCA9PSBidHYpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlkcHJpbnRrKCJidHR2JWQ6IG9wZW4gY2FsbGVkIChyYWRpbylcbiIsYnR2LT5jLm5yKTsKIAogCS8qIGFsbG9jYXRlIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KIAlmaCA9IGttYWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQorCWlmIChOVUxMID09IGZoKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCSpmaCA9IGJ0di0+aW5pdDsKIAl2NGwyX3ByaW9fb3BlbigmYnR2LT5wcmlvLCAmZmgtPnByaW8pOwpAQCAtMzQ1Nyw2ICszNDYzLDcgQEAKIAlhdWRpb19pbnB1dChidHYsVFZBVURJT19JTlBVVF9SQURJTyk7CiAKIAltdXRleF91bmxvY2soJmJ0di0+bG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQogCkBAIC00MjM1LDcgKzQyNDIsOCBAQAogCiAJaWYgKE5VTEwgPT0gYnR2LT52aWRlb19kZXYpCiAJCWdvdG8gZXJyOwotCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT52aWRlb19kZXYsVkZMX1RZUEVfR1JBQkJFUix2aWRlb19ucik8MCkKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGJ0di0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLAorCQkJCSAgdmlkZW9fbnJbYnR2LT5jLm5yXSkgPCAwKQogCQlnb3RvIGVycjsKIAlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHJlZ2lzdGVyZWQgZGV2aWNlIHZpZGVvJWRcbiIsCiAJICAgICAgIGJ0di0+Yy5ucixidHYtPnZpZGVvX2Rldi0+bWlub3IgJiAweDFmKTsKQEAgLTQyNTEsNyArNDI1OSw4IEBACiAKIAlpZiAoTlVMTCA9PSBidHYtPnZiaV9kZXYpCiAJCWdvdG8gZXJyOwotCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT52YmlfZGV2LFZGTF9UWVBFX1ZCSSx2YmlfbnIpPDApCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnZiaV9kZXYsIFZGTF9UWVBFX1ZCSSwKKwkJCQkgIHZiaV9ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwogCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgdmJpJWRcbiIsCiAJICAgICAgIGJ0di0+Yy5ucixidHYtPnZiaV9kZXYtPm1pbm9yICYgMHgxZik7CkBAIC00MjYyLDcgKzQyNzEsOCBAQAogCWJ0di0+cmFkaW9fZGV2ID0gdmRldl9pbml0KGJ0diwgJnJhZGlvX3RlbXBsYXRlLCAicmFkaW8iKTsKIAlpZiAoTlVMTCA9PSBidHYtPnJhZGlvX2RldikKIAkJZ290byBlcnI7Ci0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnJhZGlvX2RldiwgVkZMX1RZUEVfUkFESU8scmFkaW9fbnIpPDApCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnJhZGlvX2RldiwgVkZMX1RZUEVfUkFESU8sCisJCQkJICByYWRpb19ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwogCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgcmFkaW8lZFxuIiwKIAkgICAgICAgYnR2LT5jLm5yLGJ0di0+cmFkaW9fZGV2LT5taW5vciAmIDB4MWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwppbmRleCBhMzhhZjk4Li4yZjI4OWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwpAQCAtMjgsOCArMjgsOCBAQAogI2luY2x1ZGUgImJ0dHZwLmgiCiAKIAotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsgICAgLyogZGVidWcgbGV2ZWwgKDAsMSwyKSAqLworc3RhdGljIGludCBpcl9kZWJ1ZzsKK21vZHVsZV9wYXJhbShpcl9kZWJ1ZywgaW50LCAwNjQ0KTsKIHN0YXRpYyBpbnQgcmVwZWF0X2RlbGF5ID0gNTAwOwogbW9kdWxlX3BhcmFtKHJlcGVhdF9kZWxheSwgaW50LCAwNjQ0KTsKIHN0YXRpYyBpbnQgcmVwZWF0X3BlcmlvZCA9IDMzOwpAQCAtNDAsNiArNDAsMTIgQEAKIHN0YXRpYyBpbnQgaXJfcmM1X2tleV90aW1lb3V0ID0gMjAwOwogbW9kdWxlX3BhcmFtKGlyX3JjNV9rZXlfdGltZW91dCwgaW50LCAwNjQ0KTsKIAorI3VuZGVmIGRwcmludGsKKyNkZWZpbmUgZHByaW50ayhhcmcuLi4pIGRvIHsJXAorCWlmIChpcl9kZWJ1ZyA+PSAxKQlcCisJCXByaW50ayhhcmcpOwlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIERFVk5BTUUgImJ0dHYtaW5wdXQiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTc5LDYgKzg1LDQ1IEBACiAKIH0KIAorc3RhdGljIHZvaWQgaXJfZW5sdHZfaGFuZGxlX2tleShzdHJ1Y3QgYnR0diAqYnR2KQoreworCXN0cnVjdCBjYXJkX2lyICppciA9IGJ0di0+cmVtb3RlOworCXUzMiBncGlvLCBkYXRhLCBrZXl1cDsKKworCS8qIHJlYWQgZ3BpbyB2YWx1ZSAqLworCWdwaW8gPSBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKTsKKworCS8qIGV4dHJhY3QgZGF0YSAqLworCWRhdGEgPSBpcl9leHRyYWN0X2JpdHMoZ3BpbywgaXItPm1hc2tfa2V5Y29kZSk7CisKKwkvKiBDaGVjayBpZiBpdCBpcyBrZXl1cCAqLworCWtleXVwID0gKGdwaW8gJiBpci0+bWFza19rZXl1cCkgPyAxIDw8IDMxIDogMDsKKworCWlmICgoaXItPmxhc3RfZ3BpbyAmIDB4N2YpICE9IGRhdGEpIHsKKwkJZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAorCQkJZ3BpbywgZGF0YSwKKwkJCShncGlvICYgaXItPm1hc2tfa2V5dXApID8gIiB1cCIgOiAidXAvZG93biIpOworCisJCWlyX2lucHV0X2tleWRvd24oaXItPmRldiwgJmlyLT5pciwgZGF0YSwgZGF0YSk7CisJCWlmIChrZXl1cCkKKwkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCX0gZWxzZSB7CisJCWlmICgoaXItPmxhc3RfZ3BpbyAmIDEgPDwgMzEpID09IGtleXVwKQorCQkJcmV0dXJuOworCisJCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjooY250KSBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAorCQkJZ3BpbywgZGF0YSwKKwkJCShncGlvICYgaXItPm1hc2tfa2V5dXApID8gIiB1cCIgOiAiZG93biIpOworCisJCWlmIChrZXl1cCkKKwkJCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+aXIpOworCQllbHNlCisJCQlpcl9pbnB1dF9rZXlkb3duKGlyLT5kZXYsICZpci0+aXIsIGRhdGEsIGRhdGEpOworCX0KKworCWlyLT5sYXN0X2dwaW8gPSBkYXRhIHwga2V5dXA7Cit9CisKIHZvaWQgYnR0dl9pbnB1dF9pcnEoc3RydWN0IGJ0dHYgKmJ0dikKIHsKIAlzdHJ1Y3QgY2FyZF9pciAqaXIgPSBidHYtPnJlbW90ZTsKQEAgLTkyLDcgKzEzNywxMCBAQAogCXN0cnVjdCBidHR2ICpidHYgPSAoc3RydWN0IGJ0dHYqKWRhdGE7CiAJc3RydWN0IGNhcmRfaXIgKmlyID0gYnR2LT5yZW1vdGU7CiAKLQlpcl9oYW5kbGVfa2V5KGJ0dik7CisJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfQk9BUkRfRU5MVFZfRk1fMikKKwkJaXJfZW5sdHZfaGFuZGxlX2tleShidHYpOworCWVsc2UKKwkJaXJfaGFuZGxlX2tleShidHYpOwogCW1vZF90aW1lcigmaXItPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOwogfQogCkBAIC0yODQsNiArMzMyLDE0IEBACiAJCWlyLT5tYXNrX2tleXVwICAgPSAweDAwNjAwMDsKIAkJaXItPnBvbGxpbmcgICAgICA9IDUwOyAvKiBtcyAqLwogCQlicmVhazsKKwljYXNlIEJUVFZfQk9BUkRfRU5MVFZfRk1fMjoKKwkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX2VuY29yZV9lbmx0djI7CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDAwZmQwMDsKKwkJaXItPm1hc2tfa2V5dXAgICA9IDB4MDAwMDgwOworCQlpci0+cG9sbGluZyAgICAgID0gMTsgLyogbXMgKi8KKwkJaXItPmxhc3RfZ3BpbyAgICA9IGlyX2V4dHJhY3RfYml0cyhidHR2X2dwaW9fcmVhZCgmYnR2LT5jKSwKKwkJCQkJCSAgIGlyLT5tYXNrX2tleWNvZGUpOworCQlicmVhazsKIAl9CiAJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKIAkJZHByaW50ayhLRVJOX0lORk8gIk9vb3BzOiBJUiBjb25maWcgZXJyb3IgW2NhcmQ9JWRdXG4iLCBidHYtPmMudHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di5oCmluZGV4IDZkOTNkMTZjLi40NmNiOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaApAQCAtMTc2LDcgKzE3Niw3IEBACiAjZGVmaW5lIEJUVFZfQk9BUkRfVFlQSE9PTl9UVlRVTkVSUENJCSAgIDB4OTUKICNkZWZpbmUgQlRUVl9CT0FSRF9HRU9WSVNJT05fR1Y2MDAJICAgMHg5NgogI2RlZmluZSBCVFRWX0JPQVJEX0tPWlVNSV9LVFZfMDFDICAgICAgICAgIDB4OTcKLQorI2RlZmluZSBCVFRWX0JPQVJEX0VOTFRWX0ZNXzIJCSAgIDB4OTgKIAogLyogbW9yZSBjYXJkLXNwZWNpZmljIGRlZmluZXMgKi8KICNkZWZpbmUgUFQyMjU0X0xfQ0hBTk5FTCAweDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idGN4LXJpc2MuYwppbmRleCAzMzI0YWIzLi5hYzFiMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0Y3gtcmlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnRjeC1yaXNjLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJICAgICAgIHVuc2lnbmVkIGludCBzaXplKQogewogCV9fbGUzMiAqY3B1OwotCWRtYV9hZGRyX3QgZG1hOworCWRtYV9hZGRyX3QgZG1hID0gMDsKIAogCWlmIChOVUxMICE9IHJpc2MtPmNwdSAmJiByaXNjLT5zaXplIDwgc2l6ZSkKIAkJYnRjeF9yaXNjbWVtX2ZyZWUocGNpLHJpc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYwppbmRleCA2ZTM5ZTI1Li5hY2U0ZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJCXZhbDIgPSAoKChxLT5wb3J0X21vZGUgJiBRQ19NT0RFX01BU0spID09IFFDX0JJRElSKSA/IDI0IDogOCkgKgogCQkgICAgcS0+dHJhbnNmZXJfc2NhbGU7CiAJfQotCXZhbCA9ICh2YWwgKyB2YWwyIC0gMSkgLyB2YWwyOworCXZhbCA9IERJVl9ST1VORF9VUCh2YWwsIHZhbDIpOwogCXFjX2NvbW1hbmQocSwgMHgxMyk7CiAJcWNfY29tbWFuZChxLCB2YWwpOwogCkBAIC02NTEsNyArNjUxLDcgQEAKIAl0cmFuc3BlcmxpbmUgPSBxLT53aWR0aCAqIHEtPmJwcDsKIAlkaXZpc29yID0gKCgocS0+cG9ydF9tb2RlICYgUUNfTU9ERV9NQVNLKSA9PSBRQ19CSURJUikgPyAyNCA6IDgpICoKIAkgICAgcS0+dHJhbnNmZXJfc2NhbGU7Ci0JdHJhbnNwZXJsaW5lID0gKHRyYW5zcGVybGluZSArIGRpdmlzb3IgLSAxKSAvIGRpdmlzb3I7CisJdHJhbnNwZXJsaW5lID0gRElWX1JPVU5EX1VQKHRyYW5zcGVybGluZSwgZGl2aXNvcik7CiAKIAlmb3IgKGkgPSAwLCB5aWVsZCA9IHlpZWxkbGluZXM7IGkgPCBsaW5lc3RvdHJhbnM7IGkrKykKIAl7CkBAIC04OTQsMTAgKzg5NCwyNyBAQAogCXJldHVybiBsZW47CiB9CiAKK3N0YXRpYyBpbnQgcWNhbV9leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSA9IChzdHJ1Y3QgcWNhbV9kZXZpY2UgKilkZXY7CisKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmcWNhbS0+aW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcWNhbV9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBxY2FtX2RldmljZSAqcWNhbSA9IChzdHJ1Y3QgcWNhbV9kZXZpY2UgKilkZXY7CisKKwljbGVhcl9iaXQoMCwgJnFjYW0tPmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHFjYW1fZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gcWNhbV9leGNsdXNpdmVfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBxY2FtX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHFjYW1faW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCkBAIC05MDksNiArOTI2LDcgQEAKIHsKIAkubmFtZQkJPSAiQ29ubmVjdGl4IFF1aWNrY2FtIiwKIAkuZm9wcyAgICAgICAgICAgPSAmcWNhbV9mb3BzLAorCS5yZWxlYXNlIAk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogI2RlZmluZSBNQVhfQ0FNUyA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5oCmluZGV4IDY3MDFkYWYuLjhhNjBjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5oCkBAIC02NSw0ICs2NSw1IEBACiAJaW50IHRvcCwgbGVmdDsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBzYXZlZF9iaXRzOworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCmluZGV4IDdmNmM2YjQuLjE3YWEwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwpAQCAtNTEsNiArNTEsNyBAQAogCWludCBjb250cmFzdCwgYnJpZ2h0bmVzcywgd2hpdGViYWw7CiAJaW50IHRvcCwgbGVmdDsKIAl1bnNpZ25lZCBpbnQgYmlkaXJlY3Rpb25hbDsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CiAKQEAgLTY4NywxMSArNjg4LDI4IEBACiAJcmV0dXJuIGxlbjsKIH0KIAorc3RhdGljIGludCBxY2FtX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtID0gKHN0cnVjdCBxY2FtX2RldmljZSAqKWRldjsKKworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZxY2FtLT5pbl91c2UpID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCBxY2FtX2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHFjYW1fZGV2aWNlICpxY2FtID0gKHN0cnVjdCBxY2FtX2RldmljZSAqKWRldjsKKworCWNsZWFyX2JpdCgwLCAmcWNhbS0+aW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKwogLyogdmlkZW8gZGV2aWNlIHRlbXBsYXRlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxY2FtX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAorCS5vcGVuICAgICAgICAgICA9IHFjYW1fZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gcWNhbV9leGNsdXNpdmVfcmVsZWFzZSwKIAkuaW9jdGwgICAgICAgICAgPSBxY2FtX2lvY3RsLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLApAQCAtNzA0LDYgKzcyMiw3IEBACiB7CiAJLm5hbWUJCT0gIkNvbG91ciBRdWlja0NhbSIsCiAJLmZvcHMgICAgICAgICAgID0gJnFjYW1fZm9wcywKKwkucmVsZWFzZSAJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIC8qIEluaXRpYWxpemUgdGhlIFF1aWNrQ2FtIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCmluZGV4IGMxNDliN2QuLmZjOTQ5N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xNDc1LDkgKzE0NzYsMTIgQEAKIHsKIAlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKIAorCWxvY2tfa2VybmVsKCk7CiAJY2FtID0gY2FmZV9maW5kX2RldihpbWlub3IoaW5vZGUpKTsKLQlpZiAoY2FtID09IE5VTEwpCisJaWYgKGNhbSA9PSBOVUxMKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKIAogCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CkBAIC0xNDg5LDYgKzE0OTMsNyBAQAogCX0KIAkoY2FtLT51c2VycykrKzsKIAltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDkxLDE1ICsyMDk2LDggQEAKIAkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQ7Ci0JdTE2IGNsYXNzd29yZDsKIAlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKLQkvKgotCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2FtZXJhIGhlcmUgLSB3ZSdsbCBnZXQgY2FsbHMgZm9yCi0JICogdGhlIG90aGVyIGNhZmUgZGV2aWNlcyBhcyB3ZWxsLgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DTEFTU19ERVZJQ0UsICZjbGFzc3dvcmQpOwotCWlmIChjbGFzc3dvcmQgIT0gUENJX0NMQVNTX01VTFRJTUVESUFfVklERU8pCi0JCXJldHVybiAtRU5PREVWOworCiAJLyoKIAkgKiBTdGFydCBwdXR0aW5nIHRvZ2V0aGVyIG9uZSBvZiBvdXIgYmlnIGNhbWVyYSBzdHJ1Y3R1cmVzLgogCSAqLwpAQCAtMjI4Nyw4ICsyMjg1LDggQEAKIAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxMWFiLCAweDQxMDApIH0sIC8qIEV2ZW50dWFsIHJlYWwgSUQgKi8KLQl7IFBDSV9ERVZJQ0UoMHgxMWFiLCAweDQxMDIpIH0sIC8qIFJlYWxseSBldmVudHVhbCByZWFsIElEICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwKKwkJICAgICBQQ0lfREVWSUNFX0lEX01BUlZFTExfODhBTFAwMV9DQ0lDKSB9LAogCXsgMCwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYwppbmRleCBhNjYxODAwLi4xNzk4Yjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEuYwpAQCAtMzksMTAgKzM5LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi0jaWZkZWYgQ09ORklHX0tNT0QKLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgImNwaWEuaCIKIAogc3RhdGljIGludCB2aWRlb19uciA9IC0xOwpAQCAtMzE1NSw3ICszMTUxLDcgQEAKIHN0YXRpYyBpbnQgY3BpYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkZXYtPnByaXY7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBlcnI7CiAKIAlpZiAoIWNhbSkgewpAQCAtMzIwMiw3ICszMTk4LDcgQEAKIAogCS8qIFNldCBvd25lcnNoaXAgb2YgL3Byb2MvY3BpYS92aWRlb1ggdG8gY3VycmVudCB1c2VyICovCiAJaWYoY2FtLT5wcm9jX2VudHJ5KQotCQljYW0tPnByb2NfZW50cnktPnVpZCA9IGN1cnJlbnQtPnVpZDsKKwkJY2FtLT5wcm9jX2VudHJ5LT51aWQgPSBjdXJyZW50X3VpZCgpOwogCiAJLyogc2V0IG1hcmsgZm9yIGxvYWRpbmcgZmlyc3QgZnJhbWUgdW5jb21wcmVzc2VkICovCiAJY2FtLT5maXJzdF9mcmFtZSA9IDE7CkBAIC0zMjMyLDcgKzMyMjgsNyBAQAogc3RhdGljIGludCBjcGlhX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCAgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkZXYtPnByaXY7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKGNhbS0+b3BzKSB7CiAJCS8qIFJldHVybiBvd25lcnNoaXAgb2YgL3Byb2MvY3BpYS92aWRlb1ggdG8gcm9vdCAqLwpAQCAtMzI4NCw3ICszMjgwLDcgQEAKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNhbV9kYXRhICpjYW0gPSBkZXYtPnByaXY7CisJc3RydWN0IGNhbV9kYXRhICpjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBlcnI7CiAKIAkvKiBtYWtlIHRoaXMgX3JlYWxseV8gc21wIGFuZCBtdWx0aXRocmVhZC1zYWZlICovCkBAIC0zMzQxLDcgKzMzMzcsNyBAQAogCQkJIHVuc2lnbmVkIGludCBpb2N0bG5yLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gZGV2LT5wcml2OworCXN0cnVjdCBjYW1fZGF0YSAqY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0dmFsID0gMDsKIAogCWlmICghY2FtIHx8ICFjYW0tPm9wcykKQEAgLTM3MzksNyArMzczNSw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvczsKLQlzdHJ1Y3QgY2FtX2RhdGEgKmNhbSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY2FtX2RhdGEgKmNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldHZhbDsKIAogCWlmICghY2FtIHx8ICFjYW0tPm9wcykKQEAgLTM4MDEsNiArMzc5Nyw3IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBjcGlhX3RlbXBsYXRlID0gewogCS5uYW1lCQk9ICJDUGlBIENhbWVyYSIsCiAJLmZvcHMgICAgICAgICAgID0gJmNwaWFfZm9wcywKKwkucmVsZWFzZSAJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIC8qIGluaXRpYWxpc2UgY2FtX2RhdGEgc3RydWN0dXJlICAqLwpAQCAtMzkyOCw3ICszOTI1LDcgQEAKIAljYW0tPnByb2NfZW50cnkgPSBOVUxMOwogCiAJbWVtY3B5KCZjYW0tPnZkZXYsICZjcGlhX3RlbXBsYXRlLCBzaXplb2YoY3BpYV90ZW1wbGF0ZSkpOwotCWNhbS0+dmRldi5wcml2ID0gY2FtOworCXZpZGVvX3NldF9kcnZkYXRhKCZjYW0tPnZkZXYsIGNhbSk7CiAKIAljYW0tPmN1cmZyYW1lID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl9jb3JlLmMKaW5kZXggYWY4YjllYy4uN2U3OTFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl9jb3JlLmMKQEAgLTE1MzcsNyArMTUzNyw3IEBACiAgKgogICogIFRoaXMgc2V0cyBhbGwgdXNlciBjaGFuZ2VhYmxlIHByb3BlcnRpZXMgdG8gdGhlIHZhbHVlcyBpbiBjYW0tPnBhcmFtcy4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBzZXRfYWxsX3Byb3BlcnRpZXMoc3RydWN0IGNhbWVyYV9kYXRhICpjYW0pCitzdGF0aWMgaW50IHNldF9hbGxfcHJvcGVydGllcyhzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSkKIHsKIAkvKioKIAkgKiBEb24ndCBzZXQgdGFyZ2V0X2tiIGhlcmUsIGl0IHdpbGwgYmUgc2V0IGxhdGVyLgpAQCAtMTU4OCw3ICsxNTg4LDcgQEAKICAqICBnZXRfY29sb3JfcGFyYW1zCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBnZXRfY29sb3JfcGFyYW1zKHN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtKQorc3RhdGljIHZvaWQgZ2V0X2NvbG9yX3BhcmFtcyhzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSkKIHsKIAljcGlhMl9kb19jb21tYW5kKGNhbSwgQ1BJQTJfQ01EX0dFVF9WUF9CUklHSFRORVNTLCBUUkFOU0ZFUl9SRUFELCAwKTsKIAljcGlhMl9kb19jb21tYW5kKGNhbSwgQ1BJQTJfQ01EX0dFVF9WUF9TQVRVUkFUSU9OLCBUUkFOU0ZFUl9SRUFELCAwKTsKQEAgLTE4ODEsNyArMTg4MSw3IEBACiAgKiAgd2FrZV9zeXN0ZW0KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHdha2Vfc3lzdGVtKHN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtKQorc3RhdGljIHZvaWQgd2FrZV9zeXN0ZW0oc3RydWN0IGNhbWVyYV9kYXRhICpjYW0pCiB7CiAJY3BpYTJfZG9fY29tbWFuZChjYW0sIENQSUEyX0NNRF9TRVRfV0FLRVVQLCBUUkFOU0ZFUl9XUklURSwgMCk7CiB9CkBAIC0xODkyLDcgKzE4OTIsNyBAQAogICoKICAqICBWYWxpZCBmb3IgU1RWNTAwIHNlbnNvciBvbmx5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHNldF9sb3dsaWdodF9ib29zdChzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSkKK3N0YXRpYyB2b2lkIHNldF9sb3dsaWdodF9ib29zdChzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSkKIHsKIAlzdHJ1Y3QgY3BpYTJfY29tbWFuZCBjbWQ7CiAKQEAgLTIxNjksNyArMjE2OSw3IEBACiAgKgogICogIFNldHMgYWxsIHZhbHVlcyB0byB0aGUgZGVmYXVsdHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmVzZXRfY2FtZXJhX3N0cnVjdChzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSkKK3N0YXRpYyB2b2lkIHJlc2V0X2NhbWVyYV9zdHJ1Y3Qoc3RydWN0IGNhbWVyYV9kYXRhICpjYW0pCiB7CiAJLyoqKgogCSAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIGRlZmF1bHRzIGZyb20gdGhlIHJlZ2lzdGVyIG1hcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdXNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jCmluZGV4IGE0NTc0NzQwLi43MzUxMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdXNiLmMKQEAgLTQ3OCw3ICs0NzgsNyBAQAogICogc2V0X2FsdGVybmF0ZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBzZXRfYWx0ZXJuYXRlKHN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtLCB1bnNpZ25lZCBpbnQgYWx0KQorc3RhdGljIGludCBzZXRfYWx0ZXJuYXRlKHN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtLCB1bnNpZ25lZCBpbnQgYWx0KQogewogCWludCByZXQgPSAwOwogCkBAIC02MzIsNyArNjMyLDcgQEAKIHN0YXRpYyBpbnQgc3VibWl0X3VyYnMoc3RydWN0IGNhbWVyYV9kYXRhICpjYW0pCiB7CiAJc3RydWN0IHVyYiAqdXJiOwotCWludCBmeCwgZXJyLCBpOworCWludCBmeCwgZXJyLCBpLCBqOwogCiAJZm9yKGk9MDsgaTxOVU1fU0JVRjsgKytpKSB7CiAJCWlmIChjYW0tPnNidWZbaV0uZGF0YSkKQEAgLTY1Nyw2ICs2NTcsOSBAQAogCQl9CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKKwkJCUVSUigiJXM6IHVzYl9hbGxvY191cmIgZXJyb3IhXG4iLCBfX2Z1bmNfXyk7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCXVzYl9mcmVlX3VyYihjYW0tPnNidWZbal0udXJiKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCmluZGV4IGViOWYxNWMuLjg5N2U4ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwpAQCAtMjQxLDggKzI0MSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IGNwaWEyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGNhbWVyYV9kYXRhICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJaWYgKCFjYW0pIHsKQEAgLTM1Nyw4ICszNTYsNyBAQAogc3RhdGljIHNzaXplX3QgY3BpYTJfdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCSAgICAgIGxvZmZfdCAqb2ZmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGNhbWVyYV9kYXRhICpjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgbm9ibG9jayA9IGZpbGUtPmZfZmxhZ3MmT19OT05CTE9DSzsKIAogCXN0cnVjdCBjcGlhMl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0zODIsOSArMzgwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3BpYTJfdjRsX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbHApOwotCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKLQorCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgY3BpYTJfZmggKmZoID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJaWYoIWNhbSkKQEAgLTE1NzksOCArMTU3NSw3IEBACiBzdGF0aWMgaW50IGNwaWEyX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICB1bnNpZ25lZCBpbnQgaW9jdGxfbnIsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbCA9IDA7CiAKIAlpZiAoIWNhbSkKQEAgLTE4NjAsOSArMTg1NSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IGNwaWEyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKIHsKKwlzdHJ1Y3QgY2FtZXJhX2RhdGEgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldHZhbDsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBjYW1lcmFfZGF0YSAqY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKIAogCS8qIFByaW9yaXR5IGNoZWNrICovCiAJc3RydWN0IGNwaWEyX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9NYWtlZmlsZQppbmRleCBiMjNkMmUyLi5mN2JmMGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogCWN4MTgtcXVldWUubyBjeDE4LXN0cmVhbXMubyBjeDE4LWZpbGVvcHMubyBjeDE4LWlvY3RsLm8gY3gxOC1jb250cm9scy5vIFwKIAljeDE4LW1haWxib3gubyBjeDE4LXZiaS5vIGN4MTgtYXVkaW8ubyBjeDE4LXZpZGVvLm8gY3gxOC1pcnEubyBcCiAJY3gxOC1hdi1jb3JlLm8gY3gxOC1hdi1hdWRpby5vIGN4MTgtYXYtZmlybXdhcmUubyBjeDE4LWF2LXZiaS5vIGN4MTgtc2NiLm8gXAotCWN4MTgtZHZiLm8KKwljeDE4LWR2Yi5vIGN4MTgtaW8ubwogCiBvYmotJChDT05GSUdfVklERU9fQ1gxOCkgKz0gY3gxOC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdWRpby5jCmluZGV4IDZkNWI5NGYuLjU3YmVkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXVkaW8uYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LWkyYy5oIgogI2luY2x1ZGUgImN4MTgtY2FyZHMuaCIKICNpbmNsdWRlICJjeDE4LWF1ZGlvLmgiCkBAIC02MCwxMCArNjEsMTAgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JdmFsID0gcmVhZF9yZWcoQ1gxOF9BVURJT19FTkFCTEUpICYgfjB4MzA7CisJdmFsID0gY3gxOF9yZWFkX3JlZyhjeCwgQ1gxOF9BVURJT19FTkFCTEUpICYgfjB4MzA7CiAJdmFsIHw9IChhdWRpb19pbnB1dCA+IENYMThfQVZfQVVESU9fU0VSSUFMMikgPyAweDIwIDoKIAkJCQkJKGF1ZGlvX2lucHV0IDw8IDQpOwotCXdyaXRlX3JlZyh2YWwgfCAweGIwMCwgQ1gxOF9BVURJT19FTkFCTEUpOworCWN4MThfd3JpdGVfcmVnKGN4LCB2YWwgfCAweGIwMCwgQ1gxOF9BVURJT19FTkFCTEUpOwogCWN4MThfdmFwaShjeCwgQ1gxOF9BUFVfUkVTRVRBSSwgMSwgMCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmMKaW5kZXggM2IwYTJjNC4uNzNmNTE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuYwpAQCAtMjIsMjcgKzIyLDM1IEBACiAgKi8KIAogI2luY2x1ZGUgImN4MTgtZHJpdmVyLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogCiBpbnQgY3gxOF9hdl93cml0ZShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1OCB2YWx1ZSkKIHsKLQl1MzIgeCA9IHJlYWRsKGN4LT5yZWdfbWVtICsgMHhjNDAwMDAgKyAoYWRkciAmIH4zKSk7CisJdTMyIHJlZyA9IDB4YzQwMDAwICsgKGFkZHIgJiB+Myk7CiAJdTMyIG1hc2sgPSAweGZmOwogCWludCBzaGlmdCA9IChhZGRyICYgMykgKiA4OworCXUzMiB4ID0gY3gxOF9yZWFkX3JlZyhjeCwgcmVnKTsKIAogCXggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh1MzIpdmFsdWUgPDwgc2hpZnQpOwotCXdyaXRlbCh4LCBjeC0+cmVnX21lbSArIDB4YzQwMDAwICsgKGFkZHIgJiB+MykpOworCWN4MThfd3JpdGVfcmVnKGN4LCB4LCByZWcpOwogCXJldHVybiAwOwogfQogCiBpbnQgY3gxOF9hdl93cml0ZTQoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkciwgdTMyIHZhbHVlKQogewotCXdyaXRlbCh2YWx1ZSwgY3gtPnJlZ19tZW0gKyAweGM0MDAwMCArIGFkZHIpOworCWN4MThfd3JpdGVfcmVnKGN4LCB2YWx1ZSwgMHhjNDAwMDAgKyBhZGRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MThfYXZfd3JpdGU0X25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkciwgdTMyIHZhbHVlKQoreworCWN4MThfd3JpdGVfcmVnX25vcmV0cnkoY3gsIHZhbHVlLCAweGM0MDAwMCArIGFkZHIpOwogCXJldHVybiAwOwogfQogCiB1OCBjeDE4X2F2X3JlYWQoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkcikKIHsKLQl1MzIgeCA9IHJlYWRsKGN4LT5yZWdfbWVtICsgMHhjNDAwMDAgKyAoYWRkciAmIH4zKSk7CisJdTMyIHggPSBjeDE4X3JlYWRfcmVnKGN4LCAweGM0MDAwMCArIChhZGRyICYgfjMpKTsKIAlpbnQgc2hpZnQgPSAoYWRkciAmIDMpICogODsKIAogCXJldHVybiAoeCA+PiBzaGlmdCkgJiAweGZmOwpAQCAtNTAsNyArNTgsMTIgQEAKIAogdTMyIGN4MThfYXZfcmVhZDQoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkcikKIHsKLQlyZXR1cm4gcmVhZGwoY3gtPnJlZ19tZW0gKyAweGM0MDAwMCArIGFkZHIpOworCXJldHVybiBjeDE4X3JlYWRfcmVnKGN4LCAweGM0MDAwMCArIGFkZHIpOworfQorCit1MzIgY3gxOF9hdl9yZWFkNF9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIpCit7CisJcmV0dXJuIGN4MThfcmVhZF9yZWdfbm9yZXRyeShjeCwgMHhjNDAwMDAgKyBhZGRyKTsKIH0KIAogaW50IGN4MThfYXZfYW5kX29yKHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHVuc2lnbmVkIGFuZF9tYXNrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtY29yZS5oCmluZGV4IGViNjFmYTEuLmI2N2Q4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1jb3JlLmgKQEAgLTMwMSw4ICszMDEsMTAgQEAKIC8qIGN4MThfYXYtY29yZS5jIAkJCQkJCQkgICAqLwogaW50IGN4MThfYXZfd3JpdGUoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkciwgdTggdmFsdWUpOwogaW50IGN4MThfYXZfd3JpdGU0KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHUzMiB2YWx1ZSk7CitpbnQgY3gxOF9hdl93cml0ZTRfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiBhZGRyLCB1MzIgdmFsdWUpOwogdTggY3gxOF9hdl9yZWFkKHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIpOwogdTMyIGN4MThfYXZfcmVhZDQoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkcik7Cit1MzIgY3gxOF9hdl9yZWFkNF9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIpOwogaW50IGN4MThfYXZfYW5kX29yKHN0cnVjdCBjeDE4ICpjeCwgdTE2IGFkZHIsIHVuc2lnbmVkIG1hc2ssIHU4IHZhbHVlKTsKIGludCBjeDE4X2F2X2FuZF9vcjQoc3RydWN0IGN4MTggKmN4LCB1MTYgYWRkciwgdTMyIG1hc2ssIHUzMiB2YWx1ZSk7CiBpbnQgY3gxOF9hdl9jbWQoc3RydWN0IGN4MTggKmN4LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWF2LWZpcm13YXJlLmMKaW5kZXggZTk5NmE0ZS4uNTIyYTAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYXYtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hdi1maXJtd2FyZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImN4MTgtZHJpdmVyLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNkZWZpbmUgQ1gxOF9BVURJT19FTkFCTEUgMHhjNzIwMTQKQEAgLTQ5LDcgKzUwLDcgQEAKIAkJY3gxOF9hdl93cml0ZTQoY3gsIDB4ODEwMCwgMHgwMDAxMDAwMCk7CiAKIAkJLyogUHV0IHRoZSA4MDUxIGluIHJlc2V0IGFuZCBlbmFibGUgZmlybXdhcmUgdXBsb2FkICovCi0JCWN4MThfYXZfd3JpdGU0KGN4LCBDWEFERUNfRExfQ1RMLCAweDBGMDAwMDAwKTsKKwkJY3gxOF9hdl93cml0ZTRfbm9yZXRyeShjeCwgQ1hBREVDX0RMX0NUTCwgMHgwRjAwMDAwMCk7CiAKIAkJcHRyID0gZnctPmRhdGE7CiAJCXNpemUgPSBmdy0+c2l6ZTsKQEAgLTU4LDIyICs1OSwyOCBAQAogCQkJdTMyIGRsX2NvbnRyb2wgPSAweDBGMDAwMDAwIHwgaSB8ICgodTMyKXB0cltpXSA8PCAxNik7CiAJCQl1MzIgdmFsdWUgPSAwOwogCQkJaW50IHJldHJpZXMyOworCQkJaW50IHVucmVjX2VyciA9IDA7CiAKLQkJCWZvciAocmV0cmllczIgPSAwOyByZXRyaWVzMiA8IDU7IHJldHJpZXMyKyspIHsKLQkJCQljeDE4X2F2X3dyaXRlNChjeCwgQ1hBREVDX0RMX0NUTCwgZGxfY29udHJvbCk7CisJCQlmb3IgKHJldHJpZXMyID0gMDsgcmV0cmllczIgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7CisJCQkgICAgIHJldHJpZXMyKyspIHsKKwkJCQljeDE4X2F2X3dyaXRlNF9ub3JldHJ5KGN4LCBDWEFERUNfRExfQ1RMLAorCQkJCQkJICAgICAgIGRsX2NvbnRyb2wpOwogCQkJCXVkZWxheSgxMCk7Ci0JCQkJdmFsdWUgPSBjeDE4X2F2X3JlYWQ0KGN4LCBDWEFERUNfRExfQ1RMKTsKKwkJCQl2YWx1ZSA9IGN4MThfYXZfcmVhZDRfbm9yZXRyeShjeCwKKwkJCQkJCQkgICAgICBDWEFERUNfRExfQ1RMKTsKIAkJCQlpZiAodmFsdWUgPT0gZGxfY29udHJvbCkKIAkJCQkJYnJlYWs7CiAJCQkJLyogQ2hlY2sgaWYgd2UgY2FuIGNvcnJlY3QgdGhlIGJ5dGUgYnkgY2hhbmdpbmcKIAkJCQkgICB0aGUgYWRkcmVzcy4gIFdlIGNhbiBvbmx5IHdyaXRlIHRoZSBsb3dlcgogCQkJCSAgIGFkZHJlc3MgYnl0ZSBvZiB0aGUgYWRkcmVzcy4gKi8KIAkJCQlpZiAoKHZhbHVlICYgMHgzRjAwKSAhPSAoZGxfY29udHJvbCAmIDB4M0YwMCkpIHsKLQkJCQkJcmV0cmllczIgPSA1OworCQkJCQl1bnJlY19lcnIgPSAxOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAocmV0cmllczIgPj0gNSkKKwkJCWN4MThfbG9nX3dyaXRlX3JldHJpZXMoY3gsIHJldHJpZXMyLAorCQkJCQljeC0+cmVnX21lbSArIDB4YzQwMDAwICsgQ1hBREVDX0RMX0NUTCk7CisJCQlpZiAodW5yZWNfZXJyIHx8IHJldHJpZXMyID49IENYMThfTUFYX01NSU9fUkVUUklFUykKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaSA9PSBzaXplKQpAQCAtMTE5LDEwICsxMjYsMTAgQEAKIAkgICBoYXZlIGEgbmFtZSBpbiB0aGUgc3BlYy4gKi8KIAljeDE4X2F2X3dyaXRlNChjeCwgMHgwOUNDLCAxKTsKIAotCXYgPSByZWFkX3JlZyhDWDE4X0FVRElPX0VOQUJMRSk7Ci0JLyogSWYgYml0IDExIGlzIDEgKi8KKwl2ID0gY3gxOF9yZWFkX3JlZyhjeCwgQ1gxOF9BVURJT19FTkFCTEUpOworCS8qIElmIGJpdCAxMSBpcyAxLCBjbGVhciBiaXQgMTAgKi8KIAlpZiAodiAmIDB4ODAwKQotCQl3cml0ZV9yZWcodiAmIDB4RkZGRkZCRkYsIENYMThfQVVESU9fRU5BQkxFKTsgLyogQ2xlYXIgYml0IDEwICovCisJCWN4MThfd3JpdGVfcmVnKGN4LCB2ICYgMHhGRkZGRkJGRiwgQ1gxOF9BVURJT19FTkFCTEUpOwogCiAJLyogRW5hYmxlIFdXIGF1dG8gYXVkaW8gc3RhbmRhcmQgZGV0ZWN0aW9uICovCiAJdiA9IGN4MThfYXZfcmVhZDQoY3gsIENYQURFQ19TVERfREVUX0NUTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtY2FyZHMuYwppbmRleCA4ZmU1ZjM4Li41ZWZlMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWNhcmRzLmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCX0sCiAJLmF1ZGlvX2lucHV0cyA9IHsKIAkJeyBDWDE4X0NBUkRfSU5QVVRfQVVEX1RVTkVSLAotCQkgIENYMThfQVZfQVVESU84LCAwIH0sCisJCSAgQ1gxOF9BVl9BVURJTzUsIDAgfSwKIAkJeyBDWDE4X0NBUkRfSU5QVVRfTElORV9JTjEsCiAJCSAgQ1gxOF9BVl9BVURJT19TRVJJQUwxLCAwIH0sCiAJfSwKQEAgLTI5MiwxMiArMjkyLDExMSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKKy8qIFRvc2hpYmEgUW9zbWlvIGxhcHRvcCBpbnRlcm5hbCBEVkItVC9BbmFsb2cgSHlicmlkIFR1bmVyICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3gxOF9jYXJkX3BjaV9pbmZvIGN4MThfcGNpX3Rvc2hpYmFfcW9zbWlvX2R2YnRbXSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfQ1gyMzQxOCwgQ1gxOF9QQ0lfSURfVE9TSElCQSwgMHgwMTEwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3gxOF9jYXJkIGN4MThfY2FyZF90b3NoaWJhX3Fvc21pb19kdmJ0ID0geworCS50eXBlID0gQ1gxOF9DQVJEX1RPU0hJQkFfUU9TTUlPX0RWQlQsCisJLm5hbWUgPSAiVG9zaGliYSBRb3NtaW8gRFZCLVQvQW5hbG9nIiwKKwkuY29tbWVudCA9ICJFeHBlcmltZW50ZXJzIGFuZCBwaG90b3MgbmVlZGVkIGZvciBkZXZpY2UgdG8gd29yayB3ZWxsLlxuIgorCQkgICJcdFRvIGhlbHAsIG1haWwgdGhlIGl2dHYtZGV2ZWwgbGlzdCAod3d3Lml2dHZkcml2ZXIub3JnKS5cbiIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gQ1gxOF9DQVBfRU5DT0RFUiwKKwkuaHdfYXVkaW9fY3RybCA9IENYMThfSFdfQ1gyMzQxOCwKKwkuaHdfYWxsID0gQ1gxOF9IV19UVU5FUiwKKwkudmlkZW9faW5wdXRzID0geworCQl7IENYMThfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBDWDE4X0FWX0NPTVBPU0lURTYgfSwKKwkJeyBDWDE4X0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwKKwkJCUNYMThfQVZfU1ZJREVPX0xVTUEzIHwgQ1gxOF9BVl9TVklERU9fQ0hST01BNCB9LAorCQl7IENYMThfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBDWDE4X0FWX0NPTVBPU0lURTEgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgQ1gxOF9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgQ1gxOF9BVl9BVURJTzUsIAkgICAgMCB9LAorCQl7IENYMThfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgIENYMThfQVZfQVVESU9fU0VSSUFMMSwgMSB9LAorCX0sCisJLnR1bmVycyA9IHsKKwkJeyAuc3RkID0gVjRMMl9TVERfQUxMLCAudHVuZXIgPSBUVU5FUl9YQzIwMjggfSwKKwl9LAorCS5kZHIgPSB7CisJCS5jaGlwX2NvbmZpZyA9IDB4MjAyLAorCQkucmVmcmVzaCA9IDB4M2JiLAorCQkudGltaW5nMSA9IDB4MzMzMjBhNjMsCisJCS50aW1pbmcyID0gMHgwYSwKKwkJLnR1bmVfbGFuZSA9IDAsCisJCS5pbml0aWFsX2VtcnMgPSAweDQyLAorCX0sCisJLnhjZWl2ZV9waW4gPSAxNSwKKwkucGNpX2xpc3QgPSBjeDE4X3BjaV90b3NoaWJhX3Fvc21pb19kdmJ0LAorCS5pMmMgPSAmY3gxOF9pMmNfc3RkLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBMZWFkdGVrIFdpbkZhc3QgUFZSMjEwMCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4MThfY2FyZF9wY2lfaW5mbyBjeDE4X3BjaV9sZWFkdGVrX3B2cjIxMDBbXSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfQ1gyMzQxOCwgQ1gxOF9QQ0lfSURfTEVBRFRFSywgMHg2ZjI3IH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3gxOF9jYXJkIGN4MThfY2FyZF9sZWFkdGVrX3B2cjIxMDAgPSB7CisJLnR5cGUgPSBDWDE4X0NBUkRfTEVBRFRFS19QVlIyMTAwLAorCS5uYW1lID0gIkxlYWR0ZWsgV2luRmFzdCBQVlIyMTAwIiwKKwkuY29tbWVudCA9ICJFeHBlcmltZW50ZXJzIGFuZCBwaG90b3MgbmVlZGVkIGZvciBkZXZpY2UgdG8gd29yayB3ZWxsLlxuIgorCQkgICJcdFRvIGhlbHAsIG1haWwgdGhlIGl2dHYtZGV2ZWwgbGlzdCAod3d3Lml2dHZkcml2ZXIub3JnKS5cbiIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gQ1gxOF9DQVBfRU5DT0RFUiwKKwkuaHdfYXVkaW9fY3RybCA9IENYMThfSFdfQ1gyMzQxOCwKKwkuaHdfbXV4ZXIgPSBDWDE4X0hXX0dQSU8sCisJLmh3X2FsbCA9IENYMThfSFdfVFVORVIgfCBDWDE4X0hXX0dQSU8sCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBDWDE4X0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgQ1gxOF9BVl9DT01QT1NJVEUyIH0sCisJCXsgQ1gxOF9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsCisJCQlDWDE4X0FWX1NWSURFT19MVU1BMyB8IENYMThfQVZfU1ZJREVPX0NIUk9NQTQgfSwKKwkJeyBDWDE4X0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgQ1gxOF9BVl9DT01QT1NJVEU3IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IENYMThfQ0FSRF9JTlBVVF9BVURfVFVORVIsIENYMThfQVZfQVVESU81LCAJICAgIDAgfSwKKwkJeyBDWDE4X0NBUkRfSU5QVVRfTElORV9JTjEsICBDWDE4X0FWX0FVRElPX1NFUklBTDEsIDEgfSwKKwl9LAorCS50dW5lcnMgPSB7CisJCS8qIFhDMzAyOCB0dW5lciAqLworCQl7IC5zdGQgPSBWNEwyX1NURF9BTEwsIC50dW5lciA9IFRVTkVSX1hDMjAyOCB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBDWDE4X0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBDWDE4X0FWX0FVRElPNSwgMiB9LAorCS5kZHIgPSB7CisJCS8qCisJCSAqIFBvaW50ZXIgdG8gcHJvcGVyIEREUiBjb25maWcgdmFsdWVzIHByb3ZpZGVkIGJ5CisJCSAqIFRlcnJ5IFd1IDx0ZXJyeXd1IGF0IGxlYWR0ZWsuY29tLnR3PgorCQkgKi8KKwkJLmNoaXBfY29uZmlnID0gMHgzMDMsCisJCS5yZWZyZXNoID0gMHgzYmIsCisJCS50aW1pbmcxID0gMHgyNDIyMGU4MywKKwkJLnRpbWluZzIgPSAweDFmLAorCQkudHVuZV9sYW5lID0gMCwKKwkJLmluaXRpYWxfZW1ycyA9IDB4MiwKKwl9LAorCS5ncGlvX2luaXQuaW5pdGlhbF92YWx1ZSA9IDB4NiwKKwkuZ3Bpb19pbml0LmRpcmVjdGlvbiA9IDB4NywKKwkuZ3Bpb19hdWRpb19pbnB1dCA9IHsgLm1hc2sgICA9IDB4NywKKwkJCSAgICAgIC50dW5lciAgPSAweDYsIC5saW5laW4gPSAweDIsIC5yYWRpbyAgPSAweDIgfSwKKwkueGNlaXZlX3BpbiA9IDE1LAorCS5wY2lfbGlzdCA9IGN4MThfcGNpX2xlYWR0ZWtfcHZyMjEwMCwKKwkuaTJjID0gJmN4MThfaTJjX3N0ZCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBjeDE4X2NhcmQgKmN4MThfY2FyZF9saXN0W10gPSB7CiAJJmN4MThfY2FyZF9odnIxNjAwX2VzbXQsCiAJJmN4MThfY2FyZF9odnIxNjAwX3NhbXN1bmcsCiAJJmN4MThfY2FyZF9oOTAwLAogCSZjeDE4X2NhcmRfbXBjNzE4LAogCSZjeDE4X2NhcmRfY254dF9yYXB0b3JfcGFsLAorCSZjeDE4X2NhcmRfdG9zaGliYV9xb3NtaW9fZHZidCwKKwkmY3gxOF9jYXJkX2xlYWR0ZWtfcHZyMjEwMCwKIH07CiAKIGNvbnN0IHN0cnVjdCBjeDE4X2NhcmQgKmN4MThfZ2V0X2NhcmQodTE2IGluZGV4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYwppbmRleCBiZDE4YWZlLi4wODUxMjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBEZXJpdmVkIGZyb20gaXZ0di1kcml2ZXIuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjIsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LXZlcnNpb24uaCIKICNpbmNsdWRlICJjeDE4LWNhcmRzLmgiCiAjaW5jbHVkZSAiY3gxOC1pMmMuaCIKQEAgLTczLDEwICs3NSwxNCBAQAogCQkJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAogCQkJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAogCQkJCSAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07Ci0KK3N0YXRpYyBpbnQgbW1pb19uZGVsYXlbQ1gxOF9NQVhfQ0FSRFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCQkJCSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQkJICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQkJCQkgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKIHN0YXRpYyB1bnNpZ25lZCBjYXJkdHlwZV9jID0gMTsKIHN0YXRpYyB1bnNpZ25lZCB0dW5lcl9jID0gMTsKIHN0YXRpYyB1bnNpZ25lZCByYWRpb19jID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBtbWlvX25kZWxheV9jID0gMTsKIHN0YXRpYyBjaGFyIHBhbFtdID0gIi0tIjsKIHN0YXRpYyBjaGFyIHNlY2FtW10gPSAiLS0iOwogc3RhdGljIGNoYXIgbnRzY1tdID0gIi0iOwpAQCAtOTAsMTUgKzk2LDE4IEBACiAKIHN0YXRpYyBpbnQgY3gxOF9wY2lfbGF0ZW5jeSA9IDE7CiAKK2ludCBjeDE4X3JldHJ5X21taW8gPSAxOwogaW50IGN4MThfZGVidWc7CiAKIG1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgaW50LCAmdHVuZXJfYywgMDY0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkocmFkaW8sIGJvb2wsICZyYWRpb19jLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheShjYXJkdHlwZSwgaW50LCAmY2FyZHR5cGVfYywgMDY0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobW1pb19uZGVsYXksIGludCwgJm1taW9fbmRlbGF5X2MsIDA2NDQpOwogbW9kdWxlX3BhcmFtX3N0cmluZyhwYWwsIHBhbCwgc2l6ZW9mKHBhbCksIDA2NDQpOwogbW9kdWxlX3BhcmFtX3N0cmluZyhzZWNhbSwgc2VjYW0sIHNpemVvZihzZWNhbSksIDA2NDQpOwogbW9kdWxlX3BhcmFtX3N0cmluZyhudHNjLCBudHNjLCBzaXplb2YobnRzYyksIDA2NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBjeDE4X2RlYnVnLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKHJldHJ5X21taW8sIGN4MThfcmV0cnlfbW1pbywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShjeDE4X3BjaV9sYXRlbmN5LCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGN4MThfZmlyc3RfbWlub3IsIGludCwgMDY0NCk7CiAKQEAgLTEyMSw2ICsxMzAsOCBAQAogCQkgIlx0XHRcdCAzID0gQ29tcHJvIFZpZGVvTWF0ZSBIOTAwXG4iCiAJCSAiXHRcdFx0IDQgPSBZdWFuIE1QQzcxOFxuIgogCQkgIlx0XHRcdCA1ID0gQ29uZXhhbnQgUmFwdG9yIFBBTC9TRUNBTVxuIgorCQkgIlx0XHRcdCA2ID0gVG9zaGliYSBRb3NtaW8gRFZCLVQvQW5hbG9nXG4iCisJCSAiXHRcdFx0IDcgPSBMZWFkdGVrIFdpbkZhc3QgUFZSMjEwMFxuIgogCQkgIlx0XHRcdCAwID0gQXV0b2RldGVjdCAoZGVmYXVsdClcbiIKIAkJICJcdFx0XHQtMSA9IElnbm9yZSB0aGlzIGNhcmRcblx0XHQiKTsKIE1PRFVMRV9QQVJNX0RFU0MocGFsLCAiU2V0IFBBTCBzdGFuZGFyZDogQiwgRywgSCwgRCwgSywgSSwgTSwgTiwgTmMsIDYwIik7CkBAIC0xNDAsNiArMTUxLDE0IEBACiBNT0RVTEVfUEFSTV9ERVNDKGN4MThfcGNpX2xhdGVuY3ksCiAJCSAiQ2hhbmdlIHRoZSBQQ0kgbGF0ZW5jeSB0byA2NCBpZiBsb3dlcjogMCA9IE5vLCAxID0gWWVzLFxuIgogCQkgIlx0XHRcdERlZmF1bHQ6IFllcyIpOworTU9EVUxFX1BBUk1fREVTQyhyZXRyeV9tbWlvLAorCQkgIkNoZWNrIGFuZCByZXRyeSBtZW1vcnkgbWFwcGVkIElPIGFjY2Vzc2VzXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogMSBbWWVzXSIpOworTU9EVUxFX1BBUk1fREVTQyhtbWlvX25kZWxheSwKKwkJICJEZWxheSAobnMpIGZvciBlYWNoIENYMjM0MTggbWVtb3J5IG1hcHBlZCBJTyBhY2Nlc3MuXG4iCisJCSAiXHRcdFx0VHJ5IGxhcmdlciB2YWx1ZXMgdGhhdCBhcmUgY2xvc2UgdG8gYSBtdWx0aXBsZSBvZiB0aGVcbiIKKwkJICJcdFx0XHRQQ0kgY2xvY2sgcGVyaW9kLCAzMC4zIG5zLCBpZiB5b3VyIGNhcmQgZG9lc24ndCB3b3JrLlxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX01NSU9fTkRFTEFZKSk7CiBNT0RVTEVfUEFSTV9ERVNDKGVuY19tcGdfYnVmZmVycywKIAkJICJFbmNvZGVyIE1QRyBCdWZmZXJzIChpbiBNQilcbiIKIAkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KENYMThfREVGQVVMVF9FTkNfTVBHX0JVRkZFUlMpKTsKQEAgLTE1Niw3ICsxNzUsNyBAQAogCQkgIkVuY29kZXIgUENNIGJ1ZmZlcnMgKGluIE1CKVxuIgogCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoQ1gxOF9ERUZBVUxUX0VOQ19QQ01fQlVGRkVSUykpOwogCi1NT0RVTEVfUEFSTV9ERVNDKGN4MThfZmlyc3RfbWlub3IsICJTZXQgbWlub3IgYXNzaWduZWQgdG8gZmlyc3QgY2FyZCIpOworTU9EVUxFX1BBUk1fREVTQyhjeDE4X2ZpcnN0X21pbm9yLCAiU2V0IGtlcm5lbCBudW1iZXIgYXNzaWduZWQgdG8gZmlyc3QgY2FyZCIpOwogCiBNT0RVTEVfQVVUSE9SKCJIYW5zIFZlcmt1aWwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ1gyMzQxOCBkcml2ZXIiKTsKQEAgLTM1Niw2ICszNzUsMTEgQEAKIAljeC0+b3B0aW9ucy50dW5lciA9IHR1bmVyW2N4LT5udW1dOwogCWN4LT5vcHRpb25zLnJhZGlvID0gcmFkaW9bY3gtPm51bV07CiAKKwlpZiAobW1pb19uZGVsYXlbY3gtPm51bV0gPCAwKQorCQljeC0+b3B0aW9ucy5tbWlvX25kZWxheSA9IENYMThfREVGQVVMVF9NTUlPX05ERUxBWTsKKwllbHNlCisJCWN4LT5vcHRpb25zLm1taW9fbmRlbGF5ID0gbW1pb19uZGVsYXlbY3gtPm51bV07CisKIAljeC0+c3RkID0gY3gxOF9wYXJzZV9zdGQoY3gpOwogCWlmIChjeC0+b3B0aW9ucy5jYXJkdHlwZSA9PSAtMSkgewogCQlDWDE4X0lORk8oIklnbm9yZSBjYXJkXG4iKTsKQEAgLTM5NSw5ICs0MTksOSBAQAogCiAJaWYgKGN4LT5jYXJkID09IE5VTEwpIHsKIAkJY3gtPmNhcmQgPSBjeDE4X2dldF9jYXJkKENYMThfQ0FSRF9IVlJfMTYwMF9FU01UKTsKLQkJQ1gxOF9FUlIoIlVua25vd24gY2FyZDogdmVuZG9yL2RldmljZTogJTA0eC8lMDR4XG4iLAorCQlDWDE4X0VSUigiVW5rbm93biBjYXJkOiB2ZW5kb3IvZGV2aWNlOiBbJTA0eDolMDR4XVxuIiwKIAkJICAgICBjeC0+ZGV2LT52ZW5kb3IsIGN4LT5kZXYtPmRldmljZSk7Ci0JCUNYMThfRVJSKCIgICAgICAgICAgICAgIHN1YnN5c3RlbSB2ZW5kb3IvZGV2aWNlOiAlMDR4LyUwNHhcbiIsCisJCUNYMThfRVJSKCIgICAgICAgICAgICAgIHN1YnN5c3RlbSB2ZW5kb3IvZGV2aWNlOiBbJTA0eDolMDR4XVxuIiwKIAkJICAgICBjeC0+ZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBjeC0+ZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAkJQ1gxOF9FUlIoIkRlZmF1bHRpbmcgdG8gJXMgY2FyZFxuIiwgY3gtPmNhcmQtPm5hbWUpOwogCQlDWDE4X0VSUigiUGxlYXNlIG1haWwgdGhlIHZlbmRvci9kZXZpY2UgYW5kIHN1YnN5c3RlbSB2ZW5kb3IvZGV2aWNlIElEcyBhbmQgd2hhdCBraW5kIG9mXG4iKTsKQEAgLTUxMSw5ICs1MzUsOSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKiBDaGVjayBmb3IgYnVzIG1hc3RlcmluZyAqLworCS8qIEVuYWJsZSBidXMgbWFzdGVyaW5nIGFuZCBtZW1vcnkgbWFwcGVkIElPIGZvciB0aGUgQ1gyMzQxOCAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCWNtZCB8PSBQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUjsKKwljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjeC0+Y2FyZF9yZXYpOwpAQCAtNTI1LDExICs1NDksNiBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOwogCX0KLQkvKiBUaGlzIGNvbmZpZyBzcGFjZSB2YWx1ZSByZWxhdGVzIHRvIERNQSBsYXRlbmNpZXMuIFRoZQotCSAgIGRlZmF1bHQgdmFsdWUgMHg4MDgwIGlzIHRvbyBsb3cgaG93ZXZlciBhbmQgd2lsbCBsZWFkCi0JICAgdG8gRE1BIGVycm9ycy4gMHhmZmZmIGlzIHRoZSBtYXggdmFsdWUgd2hpY2ggc29sdmVzCi0JICAgdGhlc2UgcHJvYmxlbXMuICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDAsIDB4ZmZmZik7CiAKIAlDWDE4X0RFQlVHX0lORk8oImN4JWQgKHJldiAlZCkgYXQgJTAyeDolMDJ4LiV4LCAiCiAJCSAgICJpcnE6ICVkLCBsYXRlbmN5OiAlZCwgbWVtb3J5OiAweCVseFxuIiwKQEAgLTY1Niw3ICs2NzUsNyBAQAogCQlnb3RvIGZyZWVfbWVtOwogCX0KIAljeC0+cmVnX21lbSA9IGN4LT5lbmNfbWVtICsgQ1gxOF9SRUdfT0ZGU0VUOwotCWRldnR5cGUgPSByZWFkX3JlZygweEM3MjAyOCk7CisJZGV2dHlwZSA9IGN4MThfcmVhZF9yZWcoY3gsIDB4QzcyMDI4KTsKIAlzd2l0Y2ggKGRldnR5cGUgJiAweGZmMDAwMDAwKSB7CiAJY2FzZSAweGZmMDAwMDAwOgogCQlDWDE4X0lORk8oImN4MjM0MTggcmV2aXNpb24gJTA4eCAoQSlcbiIsIGRldnR5cGUpOwpAQCAtODE1LDYgKzgzNCw3IEBACiAJaWYgKHJldHZhbCA9PSAwKQogCQlyZXR2YWwgPSAtRU5PREVWOwogCUNYMThfRVJSKCJFcnJvciAlZCBvbiBpbml0aWFsaXphdGlvblxuIiwgcmV0dmFsKTsKKwljeDE4X2xvZ19zdGF0aXN0aWNzKGN4KTsKIAogCWtmcmVlKGN4MThfY2FyZHNbY3gxOF9jYXJkc19hY3RpdmVdKTsKIAljeDE4X2NhcmRzW2N4MThfY2FyZHNfYWN0aXZlXSA9IE5VTEw7CkBAIC05MDIsOCArOTIyLDggQEAKIAkJY3gxOF9zdG9wX2FsbF9jYXB0dXJlcyhjeCk7CiAKIAkvKiBJbnRlcnJ1cHRzICovCi0Jc3cxX2lycV9kaXNhYmxlKElSUV9DUFVfVE9fRVBVIHwgSVJRX0FQVV9UT19FUFUpOwotCXN3Ml9pcnFfZGlzYWJsZShJUlFfQ1BVX1RPX0VQVV9BQ0sgfCBJUlFfQVBVX1RPX0VQVV9BQ0spOworCWN4MThfc3cxX2lycV9kaXNhYmxlKGN4LCBJUlFfQ1BVX1RPX0VQVSB8IElSUV9BUFVfVE9fRVBVKTsKKwljeDE4X3N3Ml9pcnFfZGlzYWJsZShjeCwgSVJRX0NQVV9UT19FUFVfQUNLIHwgSVJRX0FQVV9UT19FUFVfQUNLKTsKIAogCWN4MThfaGFsdF9maXJtd2FyZShjeCk7CiAKQEAgLTkxOSw2ICs5MzksNyBAQAogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGN4LT5kZXYpOwogCisJY3gxOF9sb2dfc3RhdGlzdGljcyhjeCk7CiAJQ1gxOF9JTkZPKCJSZW1vdmVkICVzLCBjYXJkICMlZFxuIiwgY3gtPmNhcmRfbmFtZSwgY3gtPm51bSk7CiB9CiAKQEAgLTkzOCw3ICs5NTksNyBAQAogCiAJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLwogCWlmIChjeDE4X2ZpcnN0X21pbm9yIDwgMCB8fCBjeDE4X2ZpcnN0X21pbm9yID49IENYMThfTUFYX0NBUkRTKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3gxODogIEV4aXRpbmcsIGl2dHZfZmlyc3RfbWlub3IgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgImN4MTg6ICBFeGl0aW5nLCBjeDE4X2ZpcnN0X21pbm9yIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAlZFxuIiwKIAkJICAgICBDWDE4X01BWF9DQVJEUyAtIDEpOwogCQlyZXR1cm4gLTE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaAppbmRleCA0ODAxYmM3Li5mYThiZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaApAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtNjQsNiArNjMsOSBAQAogIyAgZXJyb3IgIlRoaXMgZHJpdmVyIHJlcXVpcmVzIGtlcm5lbCBQQ0kgc3VwcG9ydC4iCiAjZW5kaWYKIAorLyogRGVmYXVsdCBkZWxheSB0byB0aHJvdHRsZSBtbWlvIGFjY2VzcyB0byB0aGUgQ1gyMzQxOCAqLworI2RlZmluZSBDWDE4X0RFRkFVTFRfTU1JT19OREVMQVkgMCAvKiAwIG5zID0gMCBQQ0kgY2xvY2socykgLyAzMyBNSHogKi8KKwogI2RlZmluZSBDWDE4X01FTV9PRkZTRVQJMHgwMDAwMDAwMAogI2RlZmluZSBDWDE4X01FTV9TSVpFCTB4MDQwMDAwMDAKICNkZWZpbmUgQ1gxOF9SRUdfT0ZGU0VUCTB4MDIwMDAwMDAKQEAgLTc3LDcgKzc5LDkgQEAKICNkZWZpbmUgQ1gxOF9DQVJEX0NPTVBST19IOTAwIAkgICAgICAyCS8qIENvbXBybyBWaWRlb01hdGUgSDkwMCAqLwogI2RlZmluZSBDWDE4X0NBUkRfWVVBTl9NUEM3MTggCSAgICAgIDMJLyogWXVhbiBNUEM3MTggKi8KICNkZWZpbmUgQ1gxOF9DQVJEX0NOWFRfUkFQVE9SX1BBTCAgICAgNAkvKiBDb25leGFudCBSYXB0b3IgUEFMICovCi0jZGVmaW5lIENYMThfQ0FSRF9MQVNUIAkJICAgICAgNAorI2RlZmluZSBDWDE4X0NBUkRfVE9TSElCQV9RT1NNSU9fRFZCVCA1IC8qIFRvc2hpYmEgUW9zbWlvIEludGVyYWwgRFZCLVQvQW5hbG9nKi8KKyNkZWZpbmUgQ1gxOF9DQVJEX0xFQURURUtfUFZSMjEwMCAgICAgNiAvKiBMZWFkdGVrIFdpbkZhc3QgUFZSMjEwMCAqLworI2RlZmluZSBDWDE4X0NBUkRfTEFTVCAJCSAgICAgIDYKIAogI2RlZmluZSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9NUEcgIDAKICNkZWZpbmUgQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMgICAxCkBAIC05Nyw2ICsxMDEsOCBAQAogI2RlZmluZSBDWDE4X1BDSV9JRF9DT01QUk8gCQkweDE4NWIKICNkZWZpbmUgQ1gxOF9QQ0lfSURfWVVBTiAJCTB4MTJhYgogI2RlZmluZSBDWDE4X1BDSV9JRF9DT05FWEFOVAkJMHgxNGYxCisjZGVmaW5lIENYMThfUENJX0lEX1RPU0hJQkEJCTB4MTE3OQorI2RlZmluZSBDWDE4X1BDSV9JRF9MRUFEVEVLCQkweDEwN0QKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFSVCBVU0VSIFNFVFRBQkxFIERNQSBWQVJJQUJMRVMgPT09PT09PT09PT0gKi8KQEAgLTE2OSw2ICsxNzUsNyBAQAogCiAjZGVmaW5lIENYMThfTUFYX1BHTV9JTkRFWCAoNDAwKQogCitleHRlcm4gaW50IGN4MThfcmV0cnlfbW1pbzsJLyogZW5hYmxlIGNoZWNrICYgcmV0cnkgb2YgbW1pbyBhY2Nlc3NlcyAqLwogZXh0ZXJuIGludCBjeDE4X2RlYnVnOwogCiAKQEAgLTE3Nyw2ICsxODQsNyBAQAogCWludCBjYXJkdHlwZTsJCS8qIGZvcmNlIGNhcmQgdHlwZSBvbiBsb2FkICovCiAJaW50IHR1bmVyOwkJLyogc2V0IHR1bmVyIG9uIGxvYWQgKi8KIAlpbnQgcmFkaW87CQkvKiBlbmFibGUvZGlzYWJsZSByYWRpbyAqLworCXVuc2lnbmVkIGxvbmcgbW1pb19uZGVsYXk7IC8qIGRlbGF5IGluIG5zIGFmdGVyIGV2ZXJ5IFBDSSBtbWlvIGFjY2VzcyAqLwogfTsKIAogLyogcGVyLWJ1ZmZlciBiaXQgZmxhZ3MgKi8KQEAgLTIxNiw4ICsyMjQsNyBAQAogCiBzdHJ1Y3QgY3gxOF9xdWV1ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXUzMiBidWZmZXJzOwotCXUzMiBsZW5ndGg7CisJYXRvbWljX3QgYnVmZmVyczsKIAl1MzIgYnl0ZXN1c2VkOwogfTsKIApAQCAtMjM3LDYgKzI0NCw4IEBACiBzdHJ1Y3QgY3gxODsJIC8qIGZvcndhcmQgcmVmZXJlbmNlICovCiBzdHJ1Y3QgY3gxOF9zY2I7IC8qIGZvcndhcmQgcmVmZXJlbmNlICovCiAKKyNkZWZpbmUgQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFIDB4ZmZmZmZmZmYKKwogc3RydWN0IGN4MThfc3RyZWFtIHsKIAkvKiBUaGVzZSBmaXJzdCBmb3VyIGZpZWxkcyBhcmUgYWx3YXlzIHNldCwgZXZlbiBpZiB0aGUgc3RyZWFtCiAJICAgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQuICovCkBAIC0yNTksNyArMjY4LDYgQEAKIAkvKiBCdWZmZXIgU3RhdHMgKi8KIAl1MzIgYnVmZmVyczsKIAl1MzIgYnVmX3NpemU7Ci0JdTMyIGJ1ZmZlcnNfc3RvbGVuOwogCiAJLyogQnVmZmVyIFF1ZXVlcyAqLwogCXN0cnVjdCBjeDE4X3F1ZXVlIHFfZnJlZTsJLyogZnJlZSBidWZmZXJzICovCkBAIC0zNDEsNiArMzQ5LDEzIEBACiAJaW50IGJ1c19pbmRleDsgICAvKiAwIG9yIDEgZm9yIHRoZSBjeDIzNDE4J3MgMXN0IG9yIDJuZCBJMkMgYnVzICovCiB9OwogCisjZGVmaW5lIENYMThfTUFYX01NSU9fUkVUUklFUyAxMAorCitzdHJ1Y3QgY3gxOF9tbWlvX3N0YXRzIHsKKwlhdG9taWNfdCByZXRyaWVkX3dyaXRlW0NYMThfTUFYX01NSU9fUkVUUklFUysxXTsKKwlhdG9taWNfdCByZXRyaWVkX3JlYWRbQ1gxOF9NQVhfTU1JT19SRVRSSUVTKzFdOworfTsKKwogLyogU3RydWN0IHRvIGhvbGQgaW5mbyBhYm91dCBjeDE4IGNhcmRzICovCiBzdHJ1Y3QgY3gxOCB7CiAJaW50IG51bTsJCS8qIGJvYXJkIG51bWJlciwgLTEgZHVyaW5nIGluaXQhICovCkBAIC00MzAsNiArNDQ1LDkgQEAKIAl1MzIgZ3Bpb192YWw7CiAJc3RydWN0IG11dGV4IGdwaW9fbG9jazsKIAorCS8qIFN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgY3gxOF9tbWlvX3N0YXRzIG1taW9fc3RhdHM7CisKIAkvKiB2NGwyIGFuZCBVc2VyIHNldHRpbmdzICovCiAKIAkvKiBjb2RlYyBzZXR0aW5ncyAqLwpAQCAtNDU4LDQ3ICs0NzYsNCBAQAogLyogRmlyc3Qtb3BlbiBpbml0aWFsaXphdGlvbjogbG9hZCBmaXJtd2FyZSwgZXRjLiAqLwogaW50IGN4MThfaW5pdF9vbl9maXJzdF9vcGVuKHN0cnVjdCBjeDE4ICpjeCk7CiAKLS8qIFRoaXMgaXMgYSBQQ0kgcG9zdCB0aGluZywgd2hlcmUgaWYgdGhlIHBjaSByZWdpc3RlciBpcyBub3QgcmVhZCwgdGhlbgotICAgdGhlIHdyaXRlIGRvZXNuJ3QgYWx3YXlzIHRha2UgZWZmZWN0IHJpZ2h0IGF3YXkuIEJ5IHJlYWRpbmcgYmFjayB0aGUKLSAgIHJlZ2lzdGVyIGFueSBwZW5kaW5nIFBDSSB3cml0ZXMgd2lsbCBiZSBwZXJmb3JtZWQgKGluIG9yZGVyKSwgYW5kIHNvCi0gICB5b3UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgd3JpdGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRvbmUuCi0KLSAgIFJhcmVseSBuZWVkZWQsIG9ubHkgaW4gc29tZSB0aW1pbmcgc2Vuc2l0aXZlIGNhc2VzLgotICAgQXBwYXJlbnRseSBpZiB0aGlzIGlzIG5vdCBkb25lIHNvbWUgbW90aGVyYm9hcmRzIHNlZW0KLSAgIHRvIGtpbGwgdGhlIGZpcm13YXJlIGFuZCBnZXQgaW50byB0aGUgYnJva2VuIHN0YXRlIHVudGlsIGNvbXB1dGVyIGlzCi0gICByZWJvb3RlZC4gKi8KLSNkZWZpbmUgd3JpdGVfc3luYyh2YWwsIHJlZykgXAotCWRvIHsgd3JpdGVsKHZhbCwgcmVnKTsgcmVhZGwocmVnKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSByZWFkX3JlZyhyZWcpIHJlYWRsKGN4LT5yZWdfbWVtICsgKHJlZykpCi0jZGVmaW5lIHdyaXRlX3JlZyh2YWwsIHJlZykgd3JpdGVsKHZhbCwgY3gtPnJlZ19tZW0gKyAocmVnKSkKLSNkZWZpbmUgd3JpdGVfcmVnX3N5bmModmFsLCByZWcpIFwKLQlkbyB7IHdyaXRlX3JlZyh2YWwsIHJlZyk7IHJlYWRfcmVnKHJlZyk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgcmVhZF9lbmMoYWRkcikgcmVhZGwoY3gtPmVuY19tZW0gKyAodTMyKShhZGRyKSkKLSNkZWZpbmUgd3JpdGVfZW5jKHZhbCwgYWRkcikgd3JpdGVsKHZhbCwgY3gtPmVuY19tZW0gKyAodTMyKShhZGRyKSkKLSNkZWZpbmUgd3JpdGVfZW5jX3N5bmModmFsLCBhZGRyKSBcCi0JZG8geyB3cml0ZV9lbmModmFsLCBhZGRyKTsgcmVhZF9lbmMoYWRkcik7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgc3cxX2lycV9lbmFibGUodmFsKSBkbyB7IFwKLQl3cml0ZV9yZWcodmFsLCBTVzFfSU5UX1NUQVRVUyk7IFwKLQl3cml0ZV9yZWcocmVhZF9yZWcoU1cxX0lOVF9FTkFCTEVfUENJKSB8ICh2YWwpLCBTVzFfSU5UX0VOQUJMRV9QQ0kpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHN3MV9pcnFfZGlzYWJsZSh2YWwpIFwKLQl3cml0ZV9yZWcocmVhZF9yZWcoU1cxX0lOVF9FTkFCTEVfUENJKSAmIH4odmFsKSwgU1cxX0lOVF9FTkFCTEVfUENJKTsKLQotI2RlZmluZSBzdzJfaXJxX2VuYWJsZSh2YWwpIGRvIHsgXAotCXdyaXRlX3JlZyh2YWwsIFNXMl9JTlRfU1RBVFVTKTsgXAotCXdyaXRlX3JlZyhyZWFkX3JlZyhTVzJfSU5UX0VOQUJMRV9QQ0kpIHwgKHZhbCksIFNXMl9JTlRfRU5BQkxFX1BDSSk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgc3cyX2lycV9kaXNhYmxlKHZhbCkgXAotCXdyaXRlX3JlZyhyZWFkX3JlZyhTVzJfSU5UX0VOQUJMRV9QQ0kpICYgfih2YWwpLCBTVzJfSU5UX0VOQUJMRV9QQ0kpOwotCi0jZGVmaW5lIHNldHVwX3BhZ2UoYWRkcikgZG8geyBcCi0gICAgdTMyIHZhbCA9IHJlYWRfcmVnKDB4RDAwMEY4KSAmIH4weDFmMDA7IFwKLSAgICB3cml0ZV9yZWcodmFsIHwgKCgoYWRkcikgPj4gMTcpICYgMHgxZjAwKSwgMHhEMDAwRjgpOyBcCi19IHdoaWxlICgwKQotCiAjZW5kaWYgLyogQ1gxOF9EUklWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kdmIuYwppbmRleCAxZTQyMGE4Li5hZmM2OTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kdmIuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSAiY3gxOC12ZXJzaW9uLmgiCiAjaW5jbHVkZSAiY3gxOC1kdmIuaCIKKyNpbmNsdWRlICJjeDE4LWlvLmgiCiAjaW5jbHVkZSAiY3gxOC1zdHJlYW1zLmgiCiAjaW5jbHVkZSAiY3gxOC1jYXJkcy5oIgogI2luY2x1ZGUgInM1aDE0MDkuaCIKQEAgLTg3LDEzICs4OCwxMyBAQAogCXN3aXRjaCAoY3gtPmNhcmQtPnR5cGUpIHsKIAljYXNlIENYMThfQ0FSRF9IVlJfMTYwMF9FU01UOgogCWNhc2UgQ1gxOF9DQVJEX0hWUl8xNjAwX1NBTVNVTkc6Ci0JCXYgPSByZWFkX3JlZyhDWDE4X1JFR19ETVVYX05VTV9QT1JUXzBfQ09OVFJPTCk7CisJCXYgPSBjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1JFR19ETVVYX05VTV9QT1JUXzBfQ09OVFJPTCk7CiAJCXYgfD0gMHgwMDQwMDAwMDsgLyogU2VyaWFsIE1vZGUgKi8KIAkJdiB8PSAweDAwMDAyMDAwOyAvKiBEYXRhIExlbmd0aCAtIEJ5dGUgKi8KIAkJdiB8PSAweDAwMDEwMDAwOyAvKiBFcnJvciAtIFBvbGFyaXR5ICovCiAJCXYgfD0gMHgwMDAyMDAwMDsgLyogRXJyb3IgLSBQYXNzdGhydSAqLwogCQl2IHw9IDB4MDAwYzAwMDA7IC8qIEVycm9yIC0gSWdub3JlICovCi0JCXdyaXRlX3JlZyh2LCBDWDE4X1JFR19ETVVYX05VTV9QT1JUXzBfQ09OVFJPTCk7CisJCWN4MThfd3JpdGVfcmVnKGN4LCB2LCBDWDE4X1JFR19ETVVYX05VTV9QT1JUXzBfQ09OVFJPTCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYwppbmRleCAxZTUzN2ZlLi41ZjkwODk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jCkBAIC0xMzIsNiArMTMyLDcgQEAKIAl1MTYgbmV3X3N0ZXJlb19tb2RlOwogCWNvbnN0IHUxNiBzdGVyZW9fbWFzayA9IDB4MDMwMDsKIAljb25zdCB1MTYgZHVhbCA9IDB4MDIwMDsKKwl1MzIgaDsKIAogCW5ld19zdGVyZW9fbW9kZSA9IGN4LT5wYXJhbXMuYXVkaW9fcHJvcGVydGllcyAmIHN0ZXJlb19tYXNrOwogCW1lbXNldCgmdnQsIDAsIHNpemVvZih2dCkpOwpAQCAtMTQzLDEzICsxNDQsMjEgQEAKIAlpZiAobmV3X3N0ZXJlb19tb2RlID09IGN4LT5kdWFsd2F0Y2hfc3RlcmVvX21vZGUpCiAJCXJldHVybjsKIAotCW5ld19iaXRtYXAgPSBuZXdfc3RlcmVvX21vZGUgfCAoY3gtPnBhcmFtcy5hdWRpb19wcm9wZXJ0aWVzICYgfnN0ZXJlb19tYXNrKTsKKwluZXdfYml0bWFwID0gbmV3X3N0ZXJlb19tb2RlCisJCQl8IChjeC0+cGFyYW1zLmF1ZGlvX3Byb3BlcnRpZXMgJiB+c3RlcmVvX21hc2spOwogCi0JQ1gxOF9ERUJVR19JTkZPKCJkdWFsd2F0Y2g6IGNoYW5nZSBzdGVyZW8gZmxhZyBmcm9tIDB4JXggdG8gMHgleC4gbmV3IGF1ZGlvX2JpdG1hc2s9MHgldXhcbiIsCi0JCQkgICBjeC0+ZHVhbHdhdGNoX3N0ZXJlb19tb2RlLCBuZXdfc3RlcmVvX21vZGUsIG5ld19iaXRtYXApOworCUNYMThfREVCVUdfSU5GTygiZHVhbHdhdGNoOiBjaGFuZ2Ugc3RlcmVvIGZsYWcgZnJvbSAweCV4IHRvIDB4JXguICIKKwkJCSJuZXcgYXVkaW9fYml0bWFzaz0weCV1eFxuIiwKKwkJCWN4LT5kdWFsd2F0Y2hfc3RlcmVvX21vZGUsIG5ld19zdGVyZW9fbW9kZSwgbmV3X2JpdG1hcCk7CiAKLQlpZiAoY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9TRVRfQVVESU9fUEFSQU1FVEVSUywgMiwKLQkJCQljeDE4X2ZpbmRfaGFuZGxlKGN4KSwgbmV3X2JpdG1hcCkgPT0gMCkgeworCWggPSBjeDE4X2ZpbmRfaGFuZGxlKGN4KTsKKwlpZiAoaCA9PSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEUpIHsKKwkJQ1gxOF9ERUJVR19JTkZPKCJkdWFsd2F0Y2g6IGNhbid0IGZpbmQgdmFsaWQgdGFzayBoYW5kbGVcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGN4MThfdmFwaShjeCwKKwkJICAgICAgQ1gxOF9DUFVfU0VUX0FVRElPX1BBUkFNRVRFUlMsIDIsIGgsIG5ld19iaXRtYXApID09IDApIHsKIAkJY3gtPmR1YWx3YXRjaF9zdGVyZW9fbW9kZSA9IG5ld19zdGVyZW9fbW9kZTsKIAkJcmV0dXJuOwogCX0KQEAgLTIyMyw3ICsyMzIsNyBAQAogCQlwcmVwYXJlX3RvX3dhaXQoJnMtPndhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJLyogTmV3IGJ1ZmZlcnMgbWlnaHQgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSB3ZSB3ZXJlIGFkZGVkCiAJCSAgIHRvIHRoZSB3YWl0cXVldWUgKi8KLQkJaWYgKCFzLT5xX2Z1bGwuYnVmZmVycykKKwkJaWYgKCFhdG9taWNfcmVhZCgmcy0+cV9mdWxsLmJ1ZmZlcnMpKQogCQkJc2NoZWR1bGUoKTsKIAkJZmluaXNoX3dhaXQoJnMtPndhaXRxLCAmd2FpdCk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewpAQCAtNTA5LDcgKzUxOCw3IEBACiAJQ1gxOF9ERUJVR19ISV9GSUxFKCJFbmNvZGVyIHBvbGxcbiIpOwogCXBvbGxfd2FpdChmaWxwLCAmcy0+d2FpdHEsIHdhaXQpOwogCi0JaWYgKHMtPnFfZnVsbC5sZW5ndGggfHwgcy0+cV9pby5sZW5ndGgpCisJaWYgKGF0b21pY19yZWFkKCZzLT5xX2Z1bGwuYnVmZmVycykgfHwgYXRvbWljX3JlYWQoJnMtPnFfaW8uYnVmZmVycykpCiAJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogCWlmIChlb2YpCiAJCXJldHVybiBQT0xMSFVQOwpAQCAtNjk1LDIwICs3MDQsMjggQEAKIAogdm9pZCBjeDE4X211dGUoc3RydWN0IGN4MTggKmN4KQogewotCWlmIChhdG9taWNfcmVhZCgmY3gtPmFuYV9jYXB0dXJpbmcpKQotCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX1NFVF9BVURJT19NVVRFLCAyLAotCQkJCWN4MThfZmluZF9oYW5kbGUoY3gpLCAxKTsKKwl1MzIgaDsKKwlpZiAoYXRvbWljX3JlYWQoJmN4LT5hbmFfY2FwdHVyaW5nKSkgeworCQloID0gY3gxOF9maW5kX2hhbmRsZShjeCk7CisJCWlmIChoICE9IENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRSkKKwkJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfU0VUX0FVRElPX01VVEUsIDIsIGgsIDEpOworCQllbHNlCisJCQlDWDE4X0VSUigiQ2FuJ3QgZmluZCB2YWxpZCB0YXNrIGhhbmRsZSBmb3IgbXV0ZVxuIik7CisJfQogCUNYMThfREVCVUdfSU5GTygiTXV0ZVxuIik7CiB9CiAKIHZvaWQgY3gxOF91bm11dGUoc3RydWN0IGN4MTggKmN4KQogeworCXUzMiBoOwogCWlmIChhdG9taWNfcmVhZCgmY3gtPmFuYV9jYXB0dXJpbmcpKSB7Ci0JCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAwLCAwKTsKLQkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9TRVRfTUlTQ19QQVJBTUVURVJTLCAyLAotCQkJCWN4MThfZmluZF9oYW5kbGUoY3gpLCAxMik7Ci0JCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfU0VUX0FVRElPX01VVEUsIDIsCi0JCQkJY3gxOF9maW5kX2hhbmRsZShjeCksIDApOworCQloID0gY3gxOF9maW5kX2hhbmRsZShjeCk7CisJCWlmIChoICE9IENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRSkgeworCQkJY3gxOF9tc2xlZXBfdGltZW91dCgxMDAsIDApOworCQkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9TRVRfTUlTQ19QQVJBTUVURVJTLCAyLCBoLCAxMik7CisJCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX1NFVF9BVURJT19NVVRFLCAyLCBoLCAwKTsKKwkJfSBlbHNlCisJCQlDWDE4X0VSUigiQ2FuJ3QgZmluZCB2YWxpZCB0YXNrIGhhbmRsZSBmb3IgdW5tdXRlXG4iKTsKIAl9CiAJQ1gxOF9ERUJVR19JTkZPKCJVbm11dGVcbiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpcm13YXJlLmMKaW5kZXggNzhmYWRkMi4uNTE1MzQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlybXdhcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maXJtd2FyZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImN4MTgtZHJpdmVyLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogI2luY2x1ZGUgImN4MTgtc2NiLmgiCiAjaW5jbHVkZSAiY3gxOC1pcnEuaCIKICNpbmNsdWRlICJjeDE4LWZpcm13YXJlLmgiCkBAIC0xMTMsMTEgKzExNCwxMSBAQAogCXNyYyA9IChjb25zdCB1MzIgKilmdy0+ZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZTsgaSArPSA0MDk2KSB7Ci0JCXNldHVwX3BhZ2UoaSk7CisJCWN4MThfc2V0dXBfcGFnZShjeCwgaSk7CiAJCWZvciAoaiA9IGk7IGogPCBmdy0+c2l6ZSAmJiBqIDwgaSArIDQwOTY7IGogKz0gNCkgewogCQkJLyogbm8gbmVlZCBmb3IgZW5kaWFubmVzcyBjb252ZXJzaW9uIG9uIHRoZSBwcGMgKi8KLQkJCV9fcmF3X3dyaXRlbCgqc3JjLCBkc3QpOwotCQkJaWYgKF9fcmF3X3JlYWRsKGRzdCkgIT0gKnNyYykgeworCQkJY3gxOF9yYXdfd3JpdGVsKGN4LCAqc3JjLCBkc3QpOworCQkJaWYgKGN4MThfcmF3X3JlYWRsKGN4LCBkc3QpICE9ICpzcmMpIHsKIAkJCQlDWDE4X0VSUigiTWlzbWF0Y2ggYXQgb2Zmc2V0ICV4XG4iLCBpKTsKIAkJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJCQlyZXR1cm4gLUVJTzsKQEAgLTE3MCwxMiArMTcxLDE1IEBACiAJCWlmIChvZmZzZXQgKyBzZWdoZHIuc2l6ZSA+IHN6KQogCQkJYnJlYWs7CiAJCWZvciAoaSA9IDA7IGkgPCBzZWdoZHIuc2l6ZTsgaSArPSA0MDk2KSB7Ci0JCQlzZXR1cF9wYWdlKG9mZnNldCArIGkpOworCQkJY3gxOF9zZXR1cF9wYWdlKGN4LCBvZmZzZXQgKyBpKTsKIAkJCWZvciAoaiA9IGk7IGogPCBzZWdoZHIuc2l6ZSAmJiBqIDwgaSArIDQwOTY7IGogKz0gNCkgewogCQkJCS8qIG5vIG5lZWQgZm9yIGVuZGlhbm5lc3MgY29udmVyc2lvbiBvbiB0aGUgcHBjICovCi0JCQkJX19yYXdfd3JpdGVsKHNyY1sob2Zmc2V0ICsgaikgLyA0XSwgZHN0ICsgc2VnaGRyLmFkZHIgKyBqKTsKLQkJCQlpZiAoX19yYXdfcmVhZGwoZHN0ICsgc2VnaGRyLmFkZHIgKyBqKSAhPSBzcmNbKG9mZnNldCArIGopIC8gNF0pIHsKLQkJCQkJQ1gxOF9FUlIoIk1pc21hdGNoIGF0IG9mZnNldCAleFxuIiwgb2Zmc2V0ICsgaik7CisJCQkJY3gxOF9yYXdfd3JpdGVsKGN4LCBzcmNbKG9mZnNldCArIGopIC8gNF0sCisJCQkJCQlkc3QgKyBzZWdoZHIuYWRkciArIGopOworCQkJCWlmIChjeDE4X3Jhd19yZWFkbChjeCwgZHN0ICsgc2VnaGRyLmFkZHIgKyBqKQorCQkJCSAgICAhPSBzcmNbKG9mZnNldCArIGopIC8gNF0pIHsKKwkJCQkJQ1gxOF9FUlIoIk1pc21hdGNoIGF0IG9mZnNldCAleFxuIiwKKwkJCQkJCSBvZmZzZXQgKyBqKTsKIAkJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCQkJCXJldHVybiAtRUlPOwogCQkJCX0KQEAgLTE4OSw0MyArMTkzLDQ1IEBACiAJc2l6ZSA9IGZ3LT5zaXplOwogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCS8qIENsZWFyIGJpdDAgZm9yIEFQVSB0byBzdGFydCBmcm9tIDAgKi8KLQl3cml0ZV9yZWcocmVhZF9yZWcoMHhjNzIwMzApICYgfjEsIDB4YzcyMDMwKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgY3gxOF9yZWFkX3JlZyhjeCwgMHhjNzIwMzApICYgfjEsIDB4YzcyMDMwKTsKIAlyZXR1cm4gc2l6ZTsKIH0KIAogdm9pZCBjeDE4X2hhbHRfZmlybXdhcmUoc3RydWN0IGN4MTggKmN4KQogewogCUNYMThfREVCVUdfSU5GTygiUHJlcGFyaW5nIGZvciBmaXJtd2FyZSBoYWx0LlxuIik7Ci0Jd3JpdGVfcmVnKDB4MDAwRjAwMEYsIENYMThfUFJPQ19TT0ZUX1JFU0VUKTsgLyogc3RvcCB0aGUgZncgKi8KLQl3cml0ZV9yZWcoMHgwMDAyMDAwMiwgQ1gxOF9BREVDX0NPTlRST0wpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMEYwMDBGLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7IC8qIHN0b3AgdGhlIGZ3ICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMjAwMDIsIENYMThfQURFQ19DT05UUk9MKTsKIH0KIAogdm9pZCBjeDE4X2luaXRfcG93ZXIoc3RydWN0IGN4MTggKmN4LCBpbnQgbG93cHdyKQogewogCS8qIHBvd2VyLWRvd24gU3BhcmUgYW5kIEFPTSBQTExzICovCiAJLyogcG93ZXItdXAgZmFzdCwgc2xvdyBhbmQgbXBlZyBQTExzICovCi0Jd3JpdGVfcmVnKDB4MDAwMDAwMDgsIENYMThfUExMX1BPV0VSX0RPV04pOworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMDA4LCBDWDE4X1BMTF9QT1dFUl9ET1dOKTsKIAogCS8qIEFERUMgb3V0IG9mIHNsZWVwICovCi0Jd3JpdGVfcmVnKDB4MDAwMjAwMDAsIENYMThfQURFQ19DT05UUk9MKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgwMDAyMDAwMCwgQ1gxOF9BREVDX0NPTlRST0wpOwogCiAJLyogVGhlIGZhc3QgY2xvY2sgaXMgYXQgMjAwLzI0NSBNSHogKi8KLQl3cml0ZV9yZWcobG93cHdyID8gMHhEIDogMHgxMSwgQ1gxOF9GQVNUX0NMT0NLX1BMTF9JTlQpOwotCXdyaXRlX3JlZyhsb3dwd3IgPyAweDFFRkJGMzcgOiAweDAzOEUzRDcsIENYMThfRkFTVF9DTE9DS19QTExfRlJBQyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIGxvd3B3ciA/IDB4RCA6IDB4MTEsIENYMThfRkFTVF9DTE9DS19QTExfSU5UKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgbG93cHdyID8gMHgxRUZCRjM3IDogMHgwMzhFM0Q3LAorCQkJCQkJQ1gxOF9GQVNUX0NMT0NLX1BMTF9GUkFDKTsKIAotCXdyaXRlX3JlZygyLCBDWDE4X0ZBU1RfQ0xPQ0tfUExMX1BPU1QpOwotCXdyaXRlX3JlZygxLCBDWDE4X0ZBU1RfQ0xPQ0tfUExMX1BSRVNDQUxFKTsKLQl3cml0ZV9yZWcoNCwgQ1gxOF9GQVNUX0NMT0NLX1BMTF9BREpVU1RfQkFORFdJRFRIKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMiwgQ1gxOF9GQVNUX0NMT0NLX1BMTF9QT1NUKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMSwgQ1gxOF9GQVNUX0NMT0NLX1BMTF9QUkVTQ0FMRSk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDQsIENYMThfRkFTVF9DTE9DS19QTExfQURKVVNUX0JBTkRXSURUSCk7CiAKIAkvKiBzZXQgc2xvdyBjbG9jayB0byAxMjUvMTIwIE1IeiAqLwotCXdyaXRlX3JlZyhsb3dwd3IgPyAweDExIDogMHgxMCwgQ1gxOF9TTE9XX0NMT0NLX1BMTF9JTlQpOwotCXdyaXRlX3JlZyhsb3dwd3IgPyAweEVCQUYwNSA6IDB4MTg2MThBOCwgQ1gxOF9TTE9XX0NMT0NLX1BMTF9GUkFDKTsKLQl3cml0ZV9yZWcoNCwgQ1gxOF9TTE9XX0NMT0NLX1BMTF9QT1NUKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgbG93cHdyID8gMHgxMSA6IDB4MTAsIENYMThfU0xPV19DTE9DS19QTExfSU5UKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgbG93cHdyID8gMHhFQkFGMDUgOiAweDE4NjE4QTgsCisJCQkJCQlDWDE4X1NMT1dfQ0xPQ0tfUExMX0ZSQUMpOworCWN4MThfd3JpdGVfcmVnKGN4LCA0LCBDWDE4X1NMT1dfQ0xPQ0tfUExMX1BPU1QpOwogCiAJLyogbXBlZyBjbG9jayBwbGwgNTRNSHogKi8KLQl3cml0ZV9yZWcoMHhGLCBDWDE4X01QRUdfQ0xPQ0tfUExMX0lOVCk7Ci0Jd3JpdGVfcmVnKDB4MkJDRkVGLCBDWDE4X01QRUdfQ0xPQ0tfUExMX0ZSQUMpOwotCXdyaXRlX3JlZyg4LCBDWDE4X01QRUdfQ0xPQ0tfUExMX1BPU1QpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweEYsIENYMThfTVBFR19DTE9DS19QTExfSU5UKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgyQkNGRUYsIENYMThfTVBFR19DTE9DS19QTExfRlJBQyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDgsIENYMThfTVBFR19DTE9DS19QTExfUE9TVCk7CiAKIAkvKiBEZWZhdWx0cyAqLwogCS8qIEFQVSA9IFNDIG9yIFNDLzIgPSAxMjUvNjIuNSAqLwpAQCAtMjQyLDgxICsyNDgsODQgQEAKIAkvKiBWRkMgPSBkaXNhYmxlZCAqLwogCS8qIFVTQiA9IGRpc2FibGVkICovCiAKLQl3cml0ZV9yZWcobG93cHdyID8gMHhGRkZGMDAyMCA6IDB4MDAwNjAwMDQsIENYMThfQ0xPQ0tfU0VMRUNUMSk7Ci0Jd3JpdGVfcmVnKGxvd3B3ciA/IDB4RkZGRjAwMDQgOiAweDAwMDYwMDA2LCBDWDE4X0NMT0NLX1NFTEVDVDIpOworCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweEZGRkYwMDIwIDogMHgwMDA2MDAwNCwKKwkJCQkJCQlDWDE4X0NMT0NLX1NFTEVDVDEpOworCWN4MThfd3JpdGVfcmVnKGN4LCBsb3dwd3IgPyAweEZGRkYwMDA0IDogMHgwMDA2MDAwNiwKKwkJCQkJCQlDWDE4X0NMT0NLX1NFTEVDVDIpOwogCi0Jd3JpdGVfcmVnKDB4RkZGRjAwMDIsIENYMThfSEFMRl9DTE9DS19TRUxFQ1QxKTsKLQl3cml0ZV9yZWcoMHhGRkZGMDEwNCwgQ1gxOF9IQUxGX0NMT0NLX1NFTEVDVDIpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkYwMDAyLCBDWDE4X0hBTEZfQ0xPQ0tfU0VMRUNUMSk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDB4RkZGRjAxMDQsIENYMThfSEFMRl9DTE9DS19TRUxFQ1QyKTsKIAotCXdyaXRlX3JlZygweEZGRkY5MDI2LCBDWDE4X0NMT0NLX0VOQUJMRTEpOwotCXdyaXRlX3JlZygweEZGRkYzMTA1LCBDWDE4X0NMT0NLX0VOQUJMRTIpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkY5MDI2LCBDWDE4X0NMT0NLX0VOQUJMRTEpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweEZGRkYzMTA1LCBDWDE4X0NMT0NLX0VOQUJMRTIpOwogfQogCiB2b2lkIGN4MThfaW5pdF9tZW1vcnkoc3RydWN0IGN4MTggKmN4KQogewogCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDApOwotCXdyaXRlX3JlZygweDEwMDAwLCBDWDE4X0REUl9TT0ZUX1JFU0VUKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgxMDAwMCwgQ1gxOF9ERFJfU09GVF9SRVNFVCk7CiAJY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMCk7CiAKLQl3cml0ZV9yZWcoY3gtPmNhcmQtPmRkci5jaGlwX2NvbmZpZywgQ1gxOF9ERFJfQ0hJUF9DT05GSUcpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLmNoaXBfY29uZmlnLCBDWDE4X0REUl9DSElQX0NPTkZJRyk7CiAKIAljeDE4X21zbGVlcF90aW1lb3V0KDEwLCAwKTsKIAotCXdyaXRlX3JlZyhjeC0+Y2FyZC0+ZGRyLnJlZnJlc2gsIENYMThfRERSX1JFRlJFU0gpOwotCXdyaXRlX3JlZyhjeC0+Y2FyZC0+ZGRyLnRpbWluZzEsIENYMThfRERSX1RJTUlORzEpOwotCXdyaXRlX3JlZyhjeC0+Y2FyZC0+ZGRyLnRpbWluZzIsIENYMThfRERSX1RJTUlORzIpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLnJlZnJlc2gsIENYMThfRERSX1JFRlJFU0gpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLnRpbWluZzEsIENYMThfRERSX1RJTUlORzEpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLnRpbWluZzIsIENYMThfRERSX1RJTUlORzIpOwogCiAJY3gxOF9tc2xlZXBfdGltZW91dCgxMCwgMCk7CiAKIAkvKiBJbml0aWFsaXplIERRUyBwYWQgdGltZSAqLwotCXdyaXRlX3JlZyhjeC0+Y2FyZC0+ZGRyLnR1bmVfbGFuZSwgQ1gxOF9ERFJfVFVORV9MQU5FKTsKLQl3cml0ZV9yZWcoY3gtPmNhcmQtPmRkci5pbml0aWFsX2VtcnMsIENYMThfRERSX0lOSVRJQUxfRU1SUyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIGN4LT5jYXJkLT5kZHIudHVuZV9sYW5lLCBDWDE4X0REUl9UVU5FX0xBTkUpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeC0+Y2FyZC0+ZGRyLmluaXRpYWxfZW1ycywgQ1gxOF9ERFJfSU5JVElBTF9FTVJTKTsKIAogCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDApOwogCi0Jd3JpdGVfcmVnKDB4MjAwMDAsIENYMThfRERSX1NPRlRfUkVTRVQpOworCWN4MThfd3JpdGVfcmVnKGN4LCAweDIwMDAwLCBDWDE4X0REUl9TT0ZUX1JFU0VUKTsKIAljeDE4X21zbGVlcF90aW1lb3V0KDEwLCAwKTsKIAogCS8qIHVzZSBwb3dlci1kb3duIG1vZGUgd2hlbiBpZGxlICovCi0Jd3JpdGVfcmVnKDB4MDAwMDAwMTAsIENYMThfRERSX1BPV0VSX1JFRyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAwMTAsIENYMThfRERSX1BPV0VSX1JFRyk7CiAKLQl3cml0ZV9yZWcoMHgxMDAwMSwgQ1gxOF9SRUdfQlVTX1RJTUVPVVRfRU4pOworCWN4MThfd3JpdGVfcmVnKGN4LCAweDEwMDAxLCBDWDE4X1JFR19CVVNfVElNRU9VVF9FTik7CiAKLQl3cml0ZV9yZWcoMHg0OCwgQ1gxOF9ERFJfTUJfUEVSX1JPV183KTsKLQl3cml0ZV9yZWcoMHhFMDAwMCwgQ1gxOF9ERFJfQkFTRV82M19BRERSKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHg0OCwgQ1gxOF9ERFJfTUJfUEVSX1JPV183KTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHhFMDAwMCwgQ1gxOF9ERFJfQkFTRV82M19BRERSKTsKIAotCXdyaXRlX3JlZygweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQwMik7ICAvKiBBTyAqLwotCXdyaXRlX3JlZygweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQwOSk7ICAvKiBBSTIgKi8KLQl3cml0ZV9yZWcoMHgwMDAwMDEwMSwgQ1gxOF9XTUJfQ0xJRU5UMDUpOyAgLyogVklNMSAqLwotCXdyaXRlX3JlZygweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQwNik7ICAvKiBBSTEgKi8KLQl3cml0ZV9yZWcoMHgwMDAwMDEwMSwgQ1gxOF9XTUJfQ0xJRU5UMDcpOyAgLyogM0QgY29tYiAqLwotCXdyaXRlX3JlZygweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQxMCk7ICAvKiBNRSAqLwotCXdyaXRlX3JlZygweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQxMik7ICAvKiBFTkMgKi8KLQl3cml0ZV9yZWcoMHgwMDAwMDEwMSwgQ1gxOF9XTUJfQ0xJRU5UMTMpOyAgLyogUEsgKi8KLQl3cml0ZV9yZWcoMHgwMDAwMDEwMSwgQ1gxOF9XTUJfQ0xJRU5UMTEpOyAgLyogUkMgKi8KLQl3cml0ZV9yZWcoMHgwMDAwMDEwMSwgQ1gxOF9XTUJfQ0xJRU5UMTQpOyAgLyogQVZPICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAxMDEsIENYMThfV01CX0NMSUVOVDAyKTsgIC8qIEFPICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAxMDEsIENYMThfV01CX0NMSUVOVDA5KTsgIC8qIEFJMiAqLworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQwNSk7ICAvKiBWSU0xICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAxMDEsIENYMThfV01CX0NMSUVOVDA2KTsgIC8qIEFJMSAqLworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQwNyk7ICAvKiAzRCBjb21iICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAxMDEsIENYMThfV01CX0NMSUVOVDEwKTsgIC8qIE1FICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwMDAxMDEsIENYMThfV01CX0NMSUVOVDEyKTsgIC8qIEVOQyAqLworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQxMyk7ICAvKiBQSyAqLworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQxMSk7ICAvKiBSQyAqLworCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDAwMTAxLCBDWDE4X1dNQl9DTElFTlQxNCk7ICAvKiBBVk8gKi8KIH0KIAogaW50IGN4MThfZmlybXdhcmVfaW5pdChzdHJ1Y3QgY3gxOCAqY3gpCiB7CiAJLyogQWxsb3cgY2hpcCB0byBjb250cm9sIENMS1JVTiAqLwotCXdyaXRlX3JlZygweDUsIENYMThfRFNQMF9JTlRFUlJVUFRfTUFTSyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDB4NSwgQ1gxOF9EU1AwX0lOVEVSUlVQVF9NQVNLKTsKIAotCXdyaXRlX3JlZygweDAwMEYwMDBGLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7IC8qIHN0b3AgdGhlIGZ3ICovCisJY3gxOF93cml0ZV9yZWcoY3gsIDB4MDAwRjAwMEYsIENYMThfUFJPQ19TT0ZUX1JFU0VUKTsgLyogc3RvcCB0aGUgZncgKi8KIAogCWN4MThfbXNsZWVwX3RpbWVvdXQoMSwgMCk7CiAKLQlzdzFfaXJxX2VuYWJsZShJUlFfQ1BVX1RPX0VQVSB8IElSUV9BUFVfVE9fRVBVKTsKLQlzdzJfaXJxX2VuYWJsZShJUlFfQ1BVX1RPX0VQVV9BQ0sgfCBJUlFfQVBVX1RPX0VQVV9BQ0spOworCWN4MThfc3cxX2lycV9lbmFibGUoY3gsIElSUV9DUFVfVE9fRVBVIHwgSVJRX0FQVV9UT19FUFUpOworCWN4MThfc3cyX2lycV9lbmFibGUoY3gsIElSUV9DUFVfVE9fRVBVX0FDSyB8IElSUV9BUFVfVE9fRVBVX0FDSyk7CiAKIAkvKiBPbmx5IGlmIHRoZSBwcm9jZXNzb3IgaXMgbm90IHJ1bm5pbmcgKi8KLQlpZiAocmVhZF9yZWcoQ1gxOF9QUk9DX1NPRlRfUkVTRVQpICYgOCkgeworCWlmIChjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1BST0NfU09GVF9SRVNFVCkgJiA4KSB7CiAJCWludCBzeiA9IGxvYWRfYXB1X2Z3X2RpcmVjdCgidjRsLWN4MjM0MTgtYXB1LmZ3IiwKIAkJCSAgICAgICBjeC0+ZW5jX21lbSwgY3gpOwogCi0JCXdyaXRlX2VuYygweEU1MUZGMDA0LCAwKTsKLQkJd3JpdGVfZW5jKDB4YTAwMDAwLCA0KTsgIC8qIHRvZG86IG5vdCBoYXJkY29kZWQgKi8KLQkJd3JpdGVfcmVnKDB4MDAwMTAwMDAsIENYMThfUFJPQ19TT0ZUX1JFU0VUKTsgLyogU3RhcnQgQVBVICovCisJCWN4MThfd3JpdGVfZW5jKGN4LCAweEU1MUZGMDA0LCAwKTsKKwkJY3gxOF93cml0ZV9lbmMoY3gsIDB4YTAwMDAwLCA0KTsgIC8qIHRvZG86IG5vdCBoYXJkY29kZWQgKi8KKwkJLyogU3RhcnQgQVBVICovCisJCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDEwMDAwLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7CiAJCWN4MThfbXNsZWVwX3RpbWVvdXQoNTAwLCAwKTsKIAogCQlzeiA9IHN6IDw9IDAgPyBzeiA6IGxvYWRfY3B1X2Z3X2RpcmVjdCgidjRsLWN4MjM0MTgtY3B1LmZ3IiwKQEAgLTMyNiw5ICszMzUsMTAgQEAKIAkJCWludCByZXRyaWVzID0gMDsKIAogCQkJLyogc3RhcnQgdGhlIENQVSAqLwotCQkJd3JpdGVfcmVnKDB4MDAwODAwMDAsIENYMThfUFJPQ19TT0ZUX1JFU0VUKTsKKwkJCWN4MThfd3JpdGVfcmVnKGN4LCAweDAwMDgwMDAwLCBDWDE4X1BST0NfU09GVF9SRVNFVCk7CiAJCQl3aGlsZSAocmV0cmllcysrIDwgNTApIHsgLyogTG9vcCBmb3IgbWF4IDUwMG1TICovCi0JCQkJaWYgKChyZWFkX3JlZyhDWDE4X1BST0NfU09GVF9SRVNFVCkgJiAxKSA9PSAwKQorCQkJCWlmICgoY3gxOF9yZWFkX3JlZyhjeCwgQ1gxOF9QUk9DX1NPRlRfUkVTRVQpCisJCQkJICAgICAmIDEpID09IDApCiAJCQkJCWJyZWFrOwogCQkJCWN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDApOwogCQkJfQpAQCAtMzQyLDYgKzM1Miw2IEBACiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAJLyogaW5pdGlhbGl6ZSBHUElPICovCi0Jd3JpdGVfcmVnKDB4MTQwMDE0MDAsIDB4Qzc4MTEwKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgMHgxNDAwMTQwMCwgMHhDNzgxMTApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5jCmluZGV4IDNkNDk1ZGIuLjBlNTYwNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1ncGlvLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiY3gxOC1kcml2ZXIuaCIKKyNpbmNsdWRlICJjeDE4LWlvLmgiCiAjaW5jbHVkZSAiY3gxOC1jYXJkcy5oIgogI2luY2x1ZGUgImN4MTgtZ3Bpby5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgpAQCAtNDksMTEgKzUwLDExIEBACiAJdTMyIGRpciA9IGN4LT5ncGlvX2RpcjsKIAl1MzIgdmFsID0gY3gtPmdwaW9fdmFsOwogCi0Jd3JpdGVfcmVnKChkaXIgJiAweGZmZmYpIDw8IDE2LCBDWDE4X1JFR19HUElPX0RJUjEpOwotCXdyaXRlX3JlZygoKGRpciAmIDB4ZmZmZikgPDwgMTYpIHwgKHZhbCAmIDB4ZmZmZiksCisJY3gxOF93cml0ZV9yZWcoY3gsIChkaXIgJiAweGZmZmYpIDw8IDE2LCBDWDE4X1JFR19HUElPX0RJUjEpOworCWN4MThfd3JpdGVfcmVnKGN4LCAoKGRpciAmIDB4ZmZmZikgPDwgMTYpIHwgKHZhbCAmIDB4ZmZmZiksCiAJCQlDWDE4X1JFR19HUElPX09VVDEpOwotCXdyaXRlX3JlZyhkaXIgJiAweGZmZmYwMDAwLCBDWDE4X1JFR19HUElPX0RJUjIpOwotCXdyaXRlX3JlZ19zeW5jKChkaXIgJiAweGZmZmYwMDAwKSB8ICgodmFsICYgMHhmZmZmMDAwMCkgPj4gMTYpLAorCWN4MThfd3JpdGVfcmVnKGN4LCBkaXIgJiAweGZmZmYwMDAwLCBDWDE4X1JFR19HUElPX0RJUjIpOworCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIChkaXIgJiAweGZmZmYwMDAwKSB8ICgodmFsICYgMHhmZmZmMDAwMCkgPj4gMTYpLAogCQkJQ1gxOF9SRUdfR1BJT19PVVQyKTsKIH0KIApAQCAtMTQxLDE1ICsxNDIsMTcgQEAKIAl9CiAKIAlDWDE4X0RFQlVHX0lORk8oIkdQSU8gaW5pdGlhbCBkaXI6ICUwOHgvJTA4eCBvdXQ6ICUwOHgvJTA4eFxuIiwKLQkJICAgcmVhZF9yZWcoQ1gxOF9SRUdfR1BJT19ESVIxKSwgcmVhZF9yZWcoQ1gxOF9SRUdfR1BJT19ESVIyKSwKLQkJICAgcmVhZF9yZWcoQ1gxOF9SRUdfR1BJT19PVVQxKSwgcmVhZF9yZWcoQ1gxOF9SRUdfR1BJT19PVVQyKSk7CisJCQljeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1JFR19HUElPX0RJUjEpLAorCQkJY3gxOF9yZWFkX3JlZyhjeCwgQ1gxOF9SRUdfR1BJT19ESVIyKSwKKwkJCWN4MThfcmVhZF9yZWcoY3gsIENYMThfUkVHX0dQSU9fT1VUMSksCisJCQljeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1JFR19HUElPX09VVDIpKTsKIAogCWdwaW9fd3JpdGUoY3gpOwogCW11dGV4X3VubG9jaygmY3gtPmdwaW9fbG9jayk7CiB9CiAKIC8qIFhjZWl2ZSB0dW5lciByZXNldCBmdW5jdGlvbiAqLwotaW50IGN4MThfcmVzZXRfdHVuZXJfZ3Bpbyh2b2lkICpkZXYsIGludCBjbWQsIGludCB2YWx1ZSkKK2ludCBjeDE4X3Jlc2V0X3R1bmVyX2dwaW8odm9pZCAqZGV2LCBpbnQgY29tcG9uZW50LCBpbnQgY21kLCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphbGdvID0gZGV2OwogCXN0cnVjdCBjeDE4X2kyY19hbGdvX2NhbGxiYWNrX2RhdGEgKmNiX2RhdGEgPSBhbGdvLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZ3Bpby5oCmluZGV4IDIyY2Q3ZGQuLmJlYjc0MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWdwaW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1ncGlvLmgKQEAgLTIzLDUgKzIzLDUgQEAKIHZvaWQgY3gxOF9ncGlvX2luaXQoc3RydWN0IGN4MTggKmN4KTsKIHZvaWQgY3gxOF9yZXNldF9pMmNfc2xhdmVzX2dwaW8oc3RydWN0IGN4MTggKmN4KTsKIHZvaWQgY3gxOF9yZXNldF9pcl9ncGlvKHZvaWQgKmRhdGEpOwotaW50IGN4MThfcmVzZXRfdHVuZXJfZ3Bpbyh2b2lkICpkZXYsIGludCBjbWQsIGludCB2YWx1ZSk7CitpbnQgY3gxOF9yZXNldF90dW5lcl9ncGlvKHZvaWQgKmRldiwgaW50IGNvbXBvbmVudCwgaW50IGNtZCwgaW50IHZhbHVlKTsKIGludCBjeDE4X2dwaW8oc3RydWN0IGN4MTggKmN4LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaTJjLmMKaW5kZXggNjAyM2JhMy4uYWEwOWU1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaTJjLmMKQEAgLTIyLDEzICsyMiwxMiBAQAogICovCiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LWNhcmRzLmgiCiAjaW5jbHVkZSAiY3gxOC1ncGlvLmgiCiAjaW5jbHVkZSAiY3gxOC1hdi1jb3JlLmgiCiAjaW5jbHVkZSAiY3gxOC1pMmMuaCIKIAotI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KLQogI2RlZmluZSBDWDE4X1JFR19JMkNfMV9XUiAgIDB4ZjE1MDAwCiAjZGVmaW5lIENYMThfUkVHX0kyQ18xX1JEICAgMHhmMTUwMDgKICNkZWZpbmUgQ1gxOF9SRUdfSTJDXzJfV1IgICAweGYyNTEwMApAQCAtMTU4LDEyICsxNTcsMTIgQEAKIAlzdHJ1Y3QgY3gxOCAqY3ggPSAoKHN0cnVjdCBjeDE4X2kyY19hbGdvX2NhbGxiYWNrX2RhdGEgKilkYXRhKS0+Y3g7CiAJaW50IGJ1c19pbmRleCA9ICgoc3RydWN0IGN4MThfaTJjX2FsZ29fY2FsbGJhY2tfZGF0YSAqKWRhdGEpLT5idXNfaW5kZXg7CiAJdTMyIGFkZHIgPSBidXNfaW5kZXggPyBDWDE4X1JFR19JMkNfMl9XUiA6IENYMThfUkVHX0kyQ18xX1dSOwotCXUzMiByID0gcmVhZF9yZWcoYWRkcik7CisJdTMyIHIgPSBjeDE4X3JlYWRfcmVnKGN4LCBhZGRyKTsKIAogCWlmIChzdGF0ZSkKLQkJd3JpdGVfcmVnX3N5bmMociB8IFNFVFNDTF9CSVQsIGFkZHIpOworCQljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCByIHwgU0VUU0NMX0JJVCwgYWRkcik7CiAJZWxzZQotCQl3cml0ZV9yZWdfc3luYyhyICYgflNFVFNDTF9CSVQsIGFkZHIpOworCQljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCByICYgflNFVFNDTF9CSVQsIGFkZHIpOwogfQogCiBzdGF0aWMgdm9pZCBjeDE4X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCkBAIC0xNzEsMTIgKzE3MCwxMiBAQAogCXN0cnVjdCBjeDE4ICpjeCA9ICgoc3RydWN0IGN4MThfaTJjX2FsZ29fY2FsbGJhY2tfZGF0YSAqKWRhdGEpLT5jeDsKIAlpbnQgYnVzX2luZGV4ID0gKChzdHJ1Y3QgY3gxOF9pMmNfYWxnb19jYWxsYmFja19kYXRhICopZGF0YSktPmJ1c19pbmRleDsKIAl1MzIgYWRkciA9IGJ1c19pbmRleCA/IENYMThfUkVHX0kyQ18yX1dSIDogQ1gxOF9SRUdfSTJDXzFfV1I7Ci0JdTMyIHIgPSByZWFkX3JlZyhhZGRyKTsKKwl1MzIgciA9IGN4MThfcmVhZF9yZWcoY3gsIGFkZHIpOwogCiAJaWYgKHN0YXRlKQotCQl3cml0ZV9yZWdfc3luYyhyIHwgU0VUU0RMX0JJVCwgYWRkcik7CisJCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIHIgfCBTRVRTRExfQklULCBhZGRyKTsKIAllbHNlCi0JCXdyaXRlX3JlZ19zeW5jKHIgJiB+U0VUU0RMX0JJVCwgYWRkcik7CisJCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIHIgJiB+U0VUU0RMX0JJVCwgYWRkcik7CiB9CiAKIHN0YXRpYyBpbnQgY3gxOF9nZXRzY2wodm9pZCAqZGF0YSkKQEAgLTE4NSw3ICsxODQsNyBAQAogCWludCBidXNfaW5kZXggPSAoKHN0cnVjdCBjeDE4X2kyY19hbGdvX2NhbGxiYWNrX2RhdGEgKilkYXRhKS0+YnVzX2luZGV4OwogCXUzMiBhZGRyID0gYnVzX2luZGV4ID8gQ1gxOF9SRUdfSTJDXzJfUkQgOiBDWDE4X1JFR19JMkNfMV9SRDsKIAotCXJldHVybiByZWFkX3JlZyhhZGRyKSAmIEdFVFNDTF9CSVQ7CisJcmV0dXJuIGN4MThfcmVhZF9yZWcoY3gsIGFkZHIpICYgR0VUU0NMX0JJVDsKIH0KIAogc3RhdGljIGludCBjeDE4X2dldHNkYSh2b2lkICpkYXRhKQpAQCAtMTk0LDcgKzE5Myw3IEBACiAJaW50IGJ1c19pbmRleCA9ICgoc3RydWN0IGN4MThfaTJjX2FsZ29fY2FsbGJhY2tfZGF0YSAqKWRhdGEpLT5idXNfaW5kZXg7CiAJdTMyIGFkZHIgPSBidXNfaW5kZXggPyBDWDE4X1JFR19JMkNfMl9SRCA6IENYMThfUkVHX0kyQ18xX1JEOwogCi0JcmV0dXJuIHJlYWRfcmVnKGFkZHIpICYgR0VUU0RMX0JJVDsKKwlyZXR1cm4gY3gxOF9yZWFkX3JlZyhjeCwgYWRkcikgJiBHRVRTRExfQklUOwogfQogCiAvKiB0ZW1wbGF0ZSBmb3IgaTJjLWJpdC1hbGdvICovCkBAIC0zOTQsMjkgKzM5MywzMyBAQAogCQljeC0+aTJjX2FkYXBbaV0uZGV2LnBhcmVudCA9ICZjeC0+ZGV2LT5kZXY7CiAJfQogCi0JaWYgKHJlYWRfcmVnKENYMThfUkVHX0kyQ18yX1dSKSAhPSAweDAwMDNjMDJmKSB7CisJaWYgKGN4MThfcmVhZF9yZWcoY3gsIENYMThfUkVHX0kyQ18yX1dSKSAhPSAweDAwMDNjMDJmKSB7CiAJCS8qIFJlc2V0L1VucmVzZXQgSTJDIGhhcmR3YXJlIGJsb2NrICovCi0JCXdyaXRlX3JlZygweDEwMDAwMDAwLCAweGM3MTAwNCk7IC8qIENsb2NrIHNlbGVjdCAyMjBNSHogKi8KLQkJd3JpdGVfcmVnX3N5bmMoMHgxMDAwMTAwMCwgMHhjNzEwMjQpOyAvKiBDbG9jayBFbmFibGUgKi8KKwkJLyogQ2xvY2sgc2VsZWN0IDIyME1IeiAqLworCQljeDE4X3dyaXRlX3JlZyhjeCwgMHgxMDAwMDAwMCwgMHhjNzEwMDQpOworCQkvKiBDbG9jayBFbmFibGUgKi8KKwkJY3gxOF93cml0ZV9yZWdfc3luYyhjeCwgMHgxMDAwMTAwMCwgMHhjNzEwMjQpOwogCX0KIAkvKiBjb3VydGVzeSBvZiBTdGV2ZW4gVG90aCA8c3RvdGhAaGF1cHBhdWdlLmNvbT4gKi8KLQl3cml0ZV9yZWdfc3luYygweDAwYzAwMDAwLCAweGM3MDAxYyk7CisJY3gxOF93cml0ZV9yZWdfc3luYyhjeCwgMHgwMGMwMDAwMCwgMHhjNzAwMWMpOwogCW1kZWxheSgxMCk7Ci0Jd3JpdGVfcmVnX3N5bmMoMHgwMGMwMDBjMCwgMHhjNzAwMWMpOworCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwYzAsIDB4YzcwMDFjKTsKIAltZGVsYXkoMTApOwotCXdyaXRlX3JlZ19zeW5jKDB4MDBjMDAwMDAsIDB4YzcwMDFjKTsKKwljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCAweDAwYzAwMDAwLCAweGM3MDAxYyk7CiAJbWRlbGF5KDEwKTsKIAotCXdyaXRlX3JlZ19zeW5jKDB4MDBjMDAwMDAsIDB4YzczMGM4KTsgLyogU2V0IHRvIGVkZ2UtdHJpZ2dlcmVkIGludHJzLiAqLwotCXdyaXRlX3JlZ19zeW5jKDB4MDBjMDAwMDAsIDB4YzczMGM0KTsgLyogQ2xlYXIgYW55IHN0YWxlIGludHJzICovCisJLyogU2V0IHRvIGVkZ2UtdHJpZ2dlcmVkIGludHJzLiAqLworCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDBjMDAwMDAsIDB4YzczMGM4KTsKKwkvKiBDbGVhciBhbnkgc3RhbGUgaW50cnMgKi8KKwljeDE4X3dyaXRlX3JlZ19zeW5jKGN4LCAweDAwYzAwMDAwLCAweGM3MzBjNCk7CiAKIAkvKiBIdyBJMkMxIENsb2NrIEZyZXEgfjEwMGtIeiAqLwotCXdyaXRlX3JlZ19zeW5jKDB4MDAwMjFjMGYgJiB+NCwgQ1gxOF9SRUdfSTJDXzFfV1IpOworCWN4MThfd3JpdGVfcmVnX3N5bmMoY3gsIDB4MDAwMjFjMGYgJiB+NCwgQ1gxOF9SRUdfSTJDXzFfV1IpOwogCWN4MThfc2V0c2NsKCZjeC0+aTJjX2FsZ29fY2JfZGF0YVswXSwgMSk7CiAJY3gxOF9zZXRzZGEoJmN4LT5pMmNfYWxnb19jYl9kYXRhWzBdLCAxKTsKIAogCS8qIEh3IEkyQzIgQ2xvY2sgRnJlcSB+MTAwa0h6ICovCi0Jd3JpdGVfcmVnX3N5bmMoMHgwMDAyMWMwZiAmIH40LCBDWDE4X1JFR19JMkNfMl9XUik7CisJY3gxOF93cml0ZV9yZWdfc3luYyhjeCwgMHgwMDAyMWMwZiAmIH40LCBDWDE4X1JFR19JMkNfMl9XUik7CiAJY3gxOF9zZXRzY2woJmN4LT5pMmNfYWxnb19jYl9kYXRhWzFdLCAxKTsKIAljeDE4X3NldHNkYSgmY3gtPmkyY19hbGdvX2NiX2RhdGFbMV0sIDEpOwogCkBAIC00MzAsOCArNDMzLDEwIEBACiB7CiAJaW50IGk7CiAJQ1gxOF9ERUJVR19JMkMoImkyYyBleGl0XG4iKTsKLQl3cml0ZV9yZWcocmVhZF9yZWcoQ1gxOF9SRUdfSTJDXzFfV1IpIHwgNCwgQ1gxOF9SRUdfSTJDXzFfV1IpOwotCXdyaXRlX3JlZyhyZWFkX3JlZyhDWDE4X1JFR19JMkNfMl9XUikgfCA0LCBDWDE4X1JFR19JMkNfMl9XUik7CisJY3gxOF93cml0ZV9yZWcoY3gsIGN4MThfcmVhZF9yZWcoY3gsIENYMThfUkVHX0kyQ18xX1dSKSB8IDQsCisJCQkJCQkJQ1gxOF9SRUdfSTJDXzFfV1IpOworCWN4MThfd3JpdGVfcmVnKGN4LCBjeDE4X3JlYWRfcmVnKGN4LCBDWDE4X1JFR19JMkNfMl9XUikgfCA0LAorCQkJCQkJCUNYMThfUkVHX0kyQ18yX1dSKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJaTJjX2RlbF9hZGFwdGVyKCZjeC0+aTJjX2FkYXBbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYWI5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiAgY3gxOCBkcml2ZXIgUENJIG1lbW9yeSBtYXBwZWQgSU8gYWNjZXNzIHJvdXRpbmVzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBBbmR5IFdhbGxzIDxhd2FsbHNAcmFkaXgubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY3gxOC1kcml2ZXIuaCIKKyNpbmNsdWRlICJjeDE4LWlvLmgiCisjaW5jbHVkZSAiY3gxOC1pcnEuaCIKKwordm9pZCBjeDE4X2xvZ19zdGF0aXN0aWNzKHN0cnVjdCBjeDE4ICpjeCkKK3sKKwlpbnQgaTsKKworCWlmICghKGN4MThfZGVidWcgJiBDWDE4X0RCR0ZMR19JTkZPKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8PSBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykKKwkJQ1gxOF9ERUJVR19JTkZPKCJyZXRyaWVkX3dyaXRlWyVkXSA9ICVkXG4iLCBpLAorCQkJCWF0b21pY19yZWFkKCZjeC0+bW1pb19zdGF0cy5yZXRyaWVkX3dyaXRlW2ldKSk7CisJZm9yIChpID0gMDsgaSA8PSBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykKKwkJQ1gxOF9ERUJVR19JTkZPKCJyZXRyaWVkX3JlYWRbJWRdID0gJWRcbiIsIGksCisJCQkJYXRvbWljX3JlYWQoJmN4LT5tbWlvX3N0YXRzLnJldHJpZWRfcmVhZFtpXSkpOworCXJldHVybjsKK30KKwordm9pZCBjeDE4X3Jhd193cml0ZWxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7CisJCWN4MThfcmF3X3dyaXRlbF9ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCQlpZiAodmFsID09IGN4MThfcmF3X3JlYWRsX25vcmV0cnkoY3gsIGFkZHIpKQorCQkJYnJlYWs7CisJfQorCWN4MThfbG9nX3dyaXRlX3JldHJpZXMoY3gsIGksIGFkZHIpOworfQorCit1MzIgY3gxOF9yYXdfcmVhZGxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKKwkJdmFsID0gY3gxOF9yYXdfcmVhZGxfbm9yZXRyeShjeCwgYWRkcik7CisJCWlmICh2YWwgIT0gMHhmZmZmZmZmZikgLyogUENJIGJ1cyByZWFkIGVycm9yICovCisJCQlicmVhazsKKwl9CisJY3gxOF9sb2dfcmVhZF9yZXRyaWVzKGN4LCBpLCBhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCit1MTYgY3gxOF9yYXdfcmVhZHdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJdTE2IHZhbDsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKKwkJdmFsID0gY3gxOF9yYXdfcmVhZHdfbm9yZXRyeShjeCwgYWRkcik7CisJCWlmICh2YWwgIT0gMHhmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KKwkJCWJyZWFrOworCX0KKwljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgY3gxOF93cml0ZWxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7CisJCWN4MThfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJCWlmICh2YWwgPT0gY3gxOF9yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKSkKKwkJCWJyZWFrOworCX0KKwljeDE4X2xvZ193cml0ZV9yZXRyaWVzKGN4LCBpLCBhZGRyKTsKK30KKwordm9pZCBjeDE4X3dyaXRld19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKKwkJY3gxOF93cml0ZXdfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKKwkJaWYgKHZhbCA9PSBjeDE4X3JlYWR3X25vcmV0cnkoY3gsIGFkZHIpKQorCQkJYnJlYWs7CisJfQorCWN4MThfbG9nX3dyaXRlX3JldHJpZXMoY3gsIGksIGFkZHIpOworfQorCit2b2lkIGN4MThfd3JpdGViX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7CisJCWN4MThfd3JpdGViX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJCWlmICh2YWwgPT0gY3gxOF9yZWFkYl9ub3JldHJ5KGN4LCBhZGRyKSkKKwkJCWJyZWFrOworCX0KKwljeDE4X2xvZ193cml0ZV9yZXRyaWVzKGN4LCBpLCBhZGRyKTsKK30KKwordTMyIGN4MThfcmVhZGxfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfTU1JT19SRVRSSUVTOyBpKyspIHsKKwkJdmFsID0gY3gxOF9yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKKwkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KKwkJCWJyZWFrOworCX0KKwljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3UxNiBjeDE4X3JlYWR3X3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQoreworCWludCBpOworCXUxNiB2YWw7CisJZm9yIChpID0gMDsgaSA8IENYMThfTUFYX01NSU9fUkVUUklFUzsgaSsrKSB7CisJCXZhbCA9IGN4MThfcmVhZHdfbm9yZXRyeShjeCwgYWRkcik7CisJCWlmICh2YWwgIT0gMHhmZmZmKSAvKiBQQ0kgYnVzIHJlYWQgZXJyb3IgKi8KKwkJCWJyZWFrOworCX0KKwljeDE4X2xvZ19yZWFkX3JldHJpZXMoY3gsIGksIGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3U4IGN4MThfcmVhZGJfcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IGk7CisJdTggdmFsOworCWZvciAoaSA9IDA7IGkgPCBDWDE4X01BWF9NTUlPX1JFVFJJRVM7IGkrKykgeworCQl2YWwgPSBjeDE4X3JlYWRiX25vcmV0cnkoY3gsIGFkZHIpOworCQlpZiAodmFsICE9IDB4ZmYpIC8qIFBDSSBidXMgcmVhZCBlcnJvciAqLworCQkJYnJlYWs7CisJfQorCWN4MThfbG9nX3JlYWRfcmV0cmllcyhjeCwgaSwgYWRkcik7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBjeDE4X21lbWNweV9mcm9taW8oc3RydWN0IGN4MTggKmN4LCB2b2lkICp0bywKKwkJCWNvbnN0IHZvaWQgX19pb21lbSAqZnJvbSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljb25zdCB1OCBfX2lvbWVtICpzcmMgPSBmcm9tOworCXU4ICpkc3QgPSB0bzsKKworCS8qIEFsaWduIHJlYWRzIG9uIHRoZSBDWDIzNDE4J3MgYWRkcmVzc2VzICovCisJaWYgKChsZW4gPiAwKSAmJiAoKHVuc2lnbmVkIGxvbmcpIHNyYyAmIDEpKSB7CisJCSpkc3QgPSBjeDE4X3JlYWRiKGN4LCBzcmMpOworCQlsZW4tLTsKKwkJZHN0Kys7CisJCXNyYysrOworCX0KKwlpZiAoKGxlbiA+IDEpICYmICgodW5zaWduZWQgbG9uZykgc3JjICYgMikpIHsKKwkJKigodTE2ICopZHN0KSA9IGN4MThfcmF3X3JlYWR3KGN4LCBzcmMpOworCQlsZW4gLT0gMjsKKwkJZHN0ICs9IDI7CisJCXNyYyArPSAyOworCX0KKwl3aGlsZSAobGVuID4gMykgeworCQkqKCh1MzIgKilkc3QpID0gY3gxOF9yYXdfcmVhZGwoY3gsIHNyYyk7CisJCWxlbiAtPSA0OworCQlkc3QgKz0gNDsKKwkJc3JjICs9IDQ7CisJfQorCWlmIChsZW4gPiAxKSB7CisJCSooKHUxNiAqKWRzdCkgPSBjeDE4X3Jhd19yZWFkdyhjeCwgc3JjKTsKKwkJbGVuIC09IDI7CisJCWRzdCArPSAyOworCQlzcmMgKz0gMjsKKwl9CisJaWYgKGxlbiA+IDApCisJCSpkc3QgPSBjeDE4X3JlYWRiKGN4LCBzcmMpOworfQorCit2b2lkIGN4MThfbWVtc2V0X2lvKHN0cnVjdCBjeDE4ICpjeCwgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsLCBzaXplX3QgY291bnQpCit7CisJdTggX19pb21lbSAqZHN0ID0gYWRkcjsKKwl1MTYgdmFsMiA9IHZhbCB8ICh2YWwgPDwgOCk7CisJdTMyIHZhbDQgPSB2YWwyIHwgKHZhbDIgPDwgMTYpOworCisJLyogQWxpZ24gd3JpdGVzIG9uIHRoZSBDWDIzNDE4J3MgYWRkcmVzc2VzICovCisJaWYgKChjb3VudCA+IDApICYmICgodW5zaWduZWQgbG9uZylkc3QgJiAxKSkgeworCQljeDE4X3dyaXRlYihjeCwgKHU4KSB2YWwsIGRzdCk7CisJCWNvdW50LS07CisJCWRzdCsrOworCX0KKwlpZiAoKGNvdW50ID4gMSkgJiYgKCh1bnNpZ25lZCBsb25nKWRzdCAmIDIpKSB7CisJCWN4MThfd3JpdGV3KGN4LCB2YWwyLCBkc3QpOworCQljb3VudCAtPSAyOworCQlkc3QgKz0gMjsKKwl9CisJd2hpbGUgKGNvdW50ID4gMykgeworCQljeDE4X3dyaXRlbChjeCwgdmFsNCwgZHN0KTsKKwkJY291bnQgLT0gNDsKKwkJZHN0ICs9IDQ7CisJfQorCWlmIChjb3VudCA+IDEpIHsKKwkJY3gxOF93cml0ZXcoY3gsIHZhbDIsIGRzdCk7CisJCWNvdW50IC09IDI7CisJCWRzdCArPSAyOworCX0KKwlpZiAoY291bnQgPiAwKQorCQljeDE4X3dyaXRlYihjeCwgKHU4KSB2YWwsIGRzdCk7Cit9CisKK3ZvaWQgY3gxOF9zdzFfaXJxX2VuYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpCit7CisJdTMyIHI7CisJY3gxOF93cml0ZV9yZWcoY3gsIHZhbCwgU1cxX0lOVF9TVEFUVVMpOworCXIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzFfSU5UX0VOQUJMRV9QQ0kpOworCWN4MThfd3JpdGVfcmVnKGN4LCByIHwgdmFsLCBTVzFfSU5UX0VOQUJMRV9QQ0kpOworfQorCit2b2lkIGN4MThfc3cxX2lycV9kaXNhYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCkKK3sKKwl1MzIgcjsKKwlyID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cxX0lOVF9FTkFCTEVfUENJKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgciAmIH52YWwsIFNXMV9JTlRfRU5BQkxFX1BDSSk7Cit9CisKK3ZvaWQgY3gxOF9zdzJfaXJxX2VuYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpCit7CisJdTMyIHI7CisJY3gxOF93cml0ZV9yZWcoY3gsIHZhbCwgU1cyX0lOVF9TVEFUVVMpOworCXIgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzJfSU5UX0VOQUJMRV9QQ0kpOworCWN4MThfd3JpdGVfcmVnKGN4LCByIHwgdmFsLCBTVzJfSU5UX0VOQUJMRV9QQ0kpOworfQorCit2b2lkIGN4MThfc3cyX2lycV9kaXNhYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCkKK3sKKwl1MzIgcjsKKwlyID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cyX0lOVF9FTkFCTEVfUENJKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgciAmIH52YWwsIFNXMl9JTlRfRU5BQkxFX1BDSSk7Cit9CisKK3ZvaWQgY3gxOF9zZXR1cF9wYWdlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIGFkZHIpCit7CisJdTMyIHZhbDsKKwl2YWwgPSBjeDE4X3JlYWRfcmVnKGN4LCAweEQwMDBGOCk7CisJdmFsID0gKHZhbCAmIH4weDFmMDApIHwgKChhZGRyID4+IDE3KSAmIDB4MWYwMCk7CisJY3gxOF93cml0ZV9yZWcoY3gsIHZhbCwgMHhEMDAwRjgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3ZDRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pby5oCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogIGN4MTggZHJpdmVyIFBDSSBtZW1vcnkgbWFwcGVkIElPIGFjY2VzcyByb3V0aW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorICogIENvcHlyaWdodCAoQykgMjAwOCAgQW5keSBXYWxscyA8YXdhbGxzQHJhZGl4Lm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBDWDE4X0lPX0gKKyNkZWZpbmUgQ1gxOF9JT19ICisKKyNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF9pb19kZWxheShzdHJ1Y3QgY3gxOCAqY3gpCit7CisJaWYgKGN4LT5vcHRpb25zLm1taW9fbmRlbGF5KQorCQluZGVsYXkoY3gtPm9wdGlvbnMubW1pb19uZGVsYXkpOworfQorCisvKgorICogUmVhZGJhY2sgYW5kIHJldHJ5IG9mIE1NSU8gYWNjZXNzIGZvciByZWxpYWJpbGl0eToKKyAqIFRoZSBjb25jZXB0IHdhcyBzdWdnZXN0ZWQgYnkgU3RldmUgVG90aCA8c3RvdGhAbGludXh0di5vcmc+LgorICogVGhlIGltcGxtZW50YXRpb24gaXMgdGhlIGZhdWx0IG9mIEFuZHkgV2FsbHMgPGF3YWxsc0ByYWRpeC5uZXQ+LgorICovCisKKy8qIFN0YXRpc3RpY3MgZ2F0aGVyaW5nICovCitzdGF0aWMgaW5saW5lCit2b2lkIGN4MThfbG9nX3dyaXRlX3JldHJpZXMoc3RydWN0IGN4MTggKmN4LCBpbnQgaSwgY29uc3Qgdm9pZCAqYWRkcikKK3sKKwlpZiAoaSA+IENYMThfTUFYX01NSU9fUkVUUklFUykKKwkJaSA9IENYMThfTUFYX01NSU9fUkVUUklFUzsKKwlhdG9taWNfaW5jKCZjeC0+bW1pb19zdGF0cy5yZXRyaWVkX3dyaXRlW2ldKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY3gxOF9sb2dfcmVhZF9yZXRyaWVzKHN0cnVjdCBjeDE4ICpjeCwgaW50IGksIGNvbnN0IHZvaWQgKmFkZHIpCit7CisJaWYgKGkgPiBDWDE4X01BWF9NTUlPX1JFVFJJRVMpCisJCWkgPSBDWDE4X01BWF9NTUlPX1JFVFJJRVM7CisJYXRvbWljX2luYygmY3gtPm1taW9fc3RhdHMucmV0cmllZF9yZWFkW2ldKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgY3gxOF9sb2dfc3RhdGlzdGljcyhzdHJ1Y3QgY3gxOCAqY3gpOworCisvKiBOb24gYnl0ZXN3YXBwaW5nIG1lbW9yeSBtYXBwZWQgSU8gKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY3gxOF9yYXdfd3JpdGVsX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgYWRkcik7CisJY3gxOF9pb19kZWxheShjeCk7Cit9CisKK3ZvaWQgY3gxOF9yYXdfd3JpdGVsX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIGN4MThfcmF3X3dyaXRlbChzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQljeDE4X3Jhd193cml0ZWxfcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJZWxzZQorCQljeDE4X3Jhd193cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKK30KKworCitzdGF0aWMgaW5saW5lCit1MzIgY3gxOF9yYXdfcmVhZGxfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgcmV0ID0gX19yYXdfcmVhZGwoYWRkcik7CisJY3gxOF9pb19kZWxheShjeCk7CisJcmV0dXJuIHJldDsKK30KKwordTMyIGN4MThfcmF3X3JlYWRsX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKTsKKworc3RhdGljIGlubGluZSB1MzIgY3gxOF9yYXdfcmVhZGwoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJcmV0dXJuIGN4MThfcmF3X3JlYWRsX3JldHJ5KGN4LCBhZGRyKTsKKworCXJldHVybiBjeDE4X3Jhd19yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKK30KKworCitzdGF0aWMgaW5saW5lCit1MTYgY3gxOF9yYXdfcmVhZHdfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MTYgcmV0ID0gX19yYXdfcmVhZHcoYWRkcik7CisJY3gxOF9pb19kZWxheShjeCk7CisJcmV0dXJuIHJldDsKK30KKwordTE2IGN4MThfcmF3X3JlYWR3X3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKTsKKworc3RhdGljIGlubGluZSB1MTYgY3gxOF9yYXdfcmVhZHcoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJcmV0dXJuIGN4MThfcmF3X3JlYWR3X3JldHJ5KGN4LCBhZGRyKTsKKworCXJldHVybiBjeDE4X3Jhd19yZWFkd19ub3JldHJ5KGN4LCBhZGRyKTsKK30KKworCisvKiBOb3JtYWwgbWVtb3J5IG1hcHBlZCBJTyAqLworc3RhdGljIGlubGluZQordm9pZCBjeDE4X3dyaXRlbF9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlbCh2YWwsIGFkZHIpOworCWN4MThfaW9fZGVsYXkoY3gpOworfQorCit2b2lkIGN4MThfd3JpdGVsX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVsKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCWlmIChjeDE4X3JldHJ5X21taW8pCisJCWN4MThfd3JpdGVsX3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCWVsc2UKKwkJY3gxOF93cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKK30KKworCitzdGF0aWMgaW5saW5lCit2b2lkIGN4MThfd3JpdGV3X25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGV3KHZhbCwgYWRkcik7CisJY3gxOF9pb19kZWxheShjeCk7Cit9CisKK3ZvaWQgY3gxOF93cml0ZXdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZXcoc3RydWN0IGN4MTggKmN4LCB1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJY3gxOF93cml0ZXdfcmV0cnkoY3gsIHZhbCwgYWRkcik7CisJZWxzZQorCQljeDE4X3dyaXRld19ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworfQorCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY3gxOF93cml0ZWJfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHU4IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlYih2YWwsIGFkZHIpOworCWN4MThfaW9fZGVsYXkoY3gpOworfQorCit2b2lkIGN4MThfd3JpdGViX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZWIoc3RydWN0IGN4MTggKmN4LCB1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQljeDE4X3dyaXRlYl9yZXRyeShjeCwgdmFsLCBhZGRyKTsKKwllbHNlCisJCWN4MThfd3JpdGViX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgY3gxOF9yZWFkbF9ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUzMiByZXQgPSByZWFkbChhZGRyKTsKKwljeDE4X2lvX2RlbGF5KGN4KTsKKwlyZXR1cm4gcmV0OworfQorCit1MzIgY3gxOF9yZWFkbF9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZGwoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJcmV0dXJuIGN4MThfcmVhZGxfcmV0cnkoY3gsIGFkZHIpOworCisJcmV0dXJuIGN4MThfcmVhZGxfbm9yZXRyeShjeCwgYWRkcik7Cit9CisKKworc3RhdGljIGlubGluZSB1MTYgY3gxOF9yZWFkd19ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUxNiByZXQgPSByZWFkdyhhZGRyKTsKKwljeDE4X2lvX2RlbGF5KGN4KTsKKwlyZXR1cm4gcmV0OworfQorCit1MTYgY3gxOF9yZWFkd19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdTE2IGN4MThfcmVhZHcoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJcmV0dXJuIGN4MThfcmVhZHdfcmV0cnkoY3gsIGFkZHIpOworCisJcmV0dXJuIGN4MThfcmVhZHdfbm9yZXRyeShjeCwgYWRkcik7Cit9CisKKworc3RhdGljIGlubGluZSB1OCBjeDE4X3JlYWRiX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCBjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTggcmV0ID0gcmVhZGIoYWRkcik7CisJY3gxOF9pb19kZWxheShjeCk7CisJcmV0dXJuIHJldDsKK30KKwordTggY3gxOF9yZWFkYl9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcik7CisKK3N0YXRpYyBpbmxpbmUgdTggY3gxOF9yZWFkYihzdHJ1Y3QgY3gxOCAqY3gsIGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQlyZXR1cm4gY3gxOF9yZWFkYl9yZXRyeShjeCwgYWRkcik7CisKKwlyZXR1cm4gY3gxOF9yZWFkYl9ub3JldHJ5KGN4LCBhZGRyKTsKK30KKworCitzdGF0aWMgaW5saW5lCit1MzIgY3gxOF93cml0ZV9zeW5jX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJY3gxOF93cml0ZWxfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKKwlyZXR1cm4gY3gxOF9yZWFkbF9ub3JldHJ5KGN4LCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZQordTMyIGN4MThfd3JpdGVfc3luY19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwljeDE4X3dyaXRlbF9yZXRyeShjeCwgdmFsLCBhZGRyKTsKKwlyZXR1cm4gY3gxOF9yZWFkbF9yZXRyeShjeCwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4MThfd3JpdGVfc3luYyhzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQlyZXR1cm4gY3gxOF93cml0ZV9zeW5jX3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCisJcmV0dXJuIGN4MThfd3JpdGVfc3luY19ub3JldHJ5KGN4LCB2YWwsIGFkZHIpOworfQorCisKK3ZvaWQgY3gxOF9tZW1jcHlfZnJvbWlvKHN0cnVjdCBjeDE4ICpjeCwgdm9pZCAqdG8sCisJCQljb25zdCB2b2lkIF9faW9tZW0gKmZyb20sIHVuc2lnbmVkIGludCBsZW4pOwordm9pZCBjeDE4X21lbXNldF9pbyhzdHJ1Y3QgY3gxOCAqY3gsIHZvaWQgX19pb21lbSAqYWRkciwgaW50IHZhbCwgc2l6ZV90IGNvdW50KTsKKworCisvKiBBY2Nlc3MgInJlZ2lzdGVyIiByZWdpb24gb2YgQ1gyMzQxOCBtZW1vcnkgbWFwcGVkIEkvTyAqLworc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVfcmVnX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgcmVnKQoreworCWN4MThfd3JpdGVsX25vcmV0cnkoY3gsIHZhbCwgY3gtPnJlZ19tZW0gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3gxOF93cml0ZV9yZWdfcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgcmVnKQoreworCWN4MThfd3JpdGVsX3JldHJ5KGN4LCB2YWwsIGN4LT5yZWdfbWVtICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVfcmVnKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIHJlZykKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQljeDE4X3dyaXRlX3JlZ19yZXRyeShjeCwgdmFsLCByZWcpOworCWVsc2UKKwkJY3gxOF93cml0ZV9yZWdfbm9yZXRyeShjeCwgdmFsLCByZWcpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZF9yZWdfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiByZWcpCit7CisJcmV0dXJuIGN4MThfcmVhZGxfbm9yZXRyeShjeCwgY3gtPnJlZ19tZW0gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRfcmVnX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHJlZykKK3sKKwlyZXR1cm4gY3gxOF9yZWFkbF9yZXRyeShjeCwgY3gtPnJlZ19tZW0gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRfcmVnKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHJlZykKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQlyZXR1cm4gY3gxOF9yZWFkX3JlZ19yZXRyeShjeCwgcmVnKTsKKworCXJldHVybiBjeDE4X3JlYWRfcmVnX25vcmV0cnkoY3gsIHJlZyk7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgY3gxOF93cml0ZV9yZWdfc3luY19ub3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIHJlZykKK3sKKwlyZXR1cm4gY3gxOF93cml0ZV9zeW5jX25vcmV0cnkoY3gsIHZhbCwgY3gtPnJlZ19tZW0gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjeDE4X3dyaXRlX3JlZ19zeW5jX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCwgdTMyIHJlZykKK3sKKwlyZXR1cm4gY3gxOF93cml0ZV9zeW5jX3JldHJ5KGN4LCB2YWwsIGN4LT5yZWdfbWVtICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY3gxOF93cml0ZV9yZWdfc3luYyhzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiByZWcpCit7CisJaWYgKGN4MThfcmV0cnlfbW1pbykKKwkJcmV0dXJuIGN4MThfd3JpdGVfcmVnX3N5bmNfcmV0cnkoY3gsIHZhbCwgcmVnKTsKKworCXJldHVybiBjeDE4X3dyaXRlX3JlZ19zeW5jX25vcmV0cnkoY3gsIHZhbCwgcmVnKTsKK30KKworCisvKiBBY2Nlc3MgImVuY29kZXIgbWVtb3J5IiByZWdpb24gb2YgQ1gyMzQxOCBtZW1vcnkgbWFwcGVkIEkvTyAqLworc3RhdGljIGlubGluZSB2b2lkIGN4MThfd3JpdGVfZW5jX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgYWRkcikKK3sKKwljeDE4X3dyaXRlbF9ub3JldHJ5KGN4LCB2YWwsIGN4LT5lbmNfbWVtICsgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjeDE4X3dyaXRlX2VuY19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQoreworCWN4MThfd3JpdGVsX3JldHJ5KGN4LCB2YWwsIGN4LT5lbmNfbWVtICsgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjeDE4X3dyaXRlX2VuYyhzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQoreworCWlmIChjeDE4X3JldHJ5X21taW8pCisJCWN4MThfd3JpdGVfZW5jX3JldHJ5KGN4LCB2YWwsIGFkZHIpOworCWVsc2UKKwkJY3gxOF93cml0ZV9lbmNfbm9yZXRyeShjeCwgdmFsLCBhZGRyKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRfZW5jX25vcmV0cnkoc3RydWN0IGN4MTggKmN4LCB1MzIgYWRkcikKK3sKKwlyZXR1cm4gY3gxOF9yZWFkbF9ub3JldHJ5KGN4LCBjeC0+ZW5jX21lbSArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjeDE4X3JlYWRfZW5jX3JldHJ5KHN0cnVjdCBjeDE4ICpjeCwgdTMyIGFkZHIpCit7CisJcmV0dXJuIGN4MThfcmVhZGxfcmV0cnkoY3gsIGN4LT5lbmNfbWVtICsgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4MThfcmVhZF9lbmMoc3RydWN0IGN4MTggKmN4LCB1MzIgYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQlyZXR1cm4gY3gxOF9yZWFkX2VuY19yZXRyeShjeCwgYWRkcik7CisKKwlyZXR1cm4gY3gxOF9yZWFkX2VuY19ub3JldHJ5KGN4LCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZQordTMyIGN4MThfd3JpdGVfZW5jX3N5bmNfbm9yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQoreworCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfbm9yZXRyeShjeCwgdmFsLCBjeC0+ZW5jX21lbSArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lCit1MzIgY3gxOF93cml0ZV9lbmNfc3luY19yZXRyeShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwsIHUzMiBhZGRyKQoreworCXJldHVybiBjeDE4X3dyaXRlX3N5bmNfcmV0cnkoY3gsIHZhbCwgY3gtPmVuY19tZW0gKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZQordTMyIGN4MThfd3JpdGVfZW5jX3N5bmMoc3RydWN0IGN4MTggKmN4LCB1MzIgdmFsLCB1MzIgYWRkcikKK3sKKwlpZiAoY3gxOF9yZXRyeV9tbWlvKQorCQlyZXR1cm4gY3gxOF93cml0ZV9lbmNfc3luY19yZXRyeShjeCwgdmFsLCBhZGRyKTsKKworCXJldHVybiBjeDE4X3dyaXRlX2VuY19zeW5jX25vcmV0cnkoY3gsIHZhbCwgYWRkcik7Cit9CisKK3ZvaWQgY3gxOF9zdzFfaXJxX2VuYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpOwordm9pZCBjeDE4X3N3MV9pcnFfZGlzYWJsZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiB2YWwpOwordm9pZCBjeDE4X3N3Ml9pcnFfZW5hYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCk7Cit2b2lkIGN4MThfc3cyX2lycV9kaXNhYmxlKHN0cnVjdCBjeDE4ICpjeCwgdTMyIHZhbCk7Cit2b2lkIGN4MThfc2V0dXBfcGFnZShzdHJ1Y3QgY3gxOCAqY3gsIHUzMiBhZGRyKTsKKworI2VuZGlmIC8qIENYMThfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKaW5kZXggYTdmODM5Ni4uZjBjYTUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImN4MTgtZHJpdmVyLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogI2luY2x1ZGUgImN4MTgtdmVyc2lvbi5oIgogI2luY2x1ZGUgImN4MTgtbWFpbGJveC5oIgogI2luY2x1ZGUgImN4MTgtaTJjLmgiCkBAIC0xNzAsNyArMTcxLDYgQEAKIHsKIAlzdHJ1Y3QgY3gxOF9vcGVuX2lkICppZCA9IGZoOwogCXN0cnVjdCBjeDE4ICpjeCA9IGlkLT5jeDsKLQogCWludCB3ID0gZm10LT5mbXQucGl4LndpZHRoOwogCWludCBoID0gZm10LT5mbXQucGl4LmhlaWdodDsKIApAQCAtMjAyLDggKzIwMiw3IEBACiAJc3RydWN0IGN4MThfb3Blbl9pZCAqaWQgPSBmaDsKIAlzdHJ1Y3QgY3gxOCAqY3ggPSBpZC0+Y3g7CiAJaW50IHJldDsKLQlpbnQgdyA9IGZtdC0+Zm10LnBpeC53aWR0aDsKLQlpbnQgaCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CisJaW50IHcsIGg7CiAKIAlyZXQgPSB2NGwyX3ByaW9fY2hlY2soJmN4LT5wcmlvLCAmaWQtPnByaW8pOwogCWlmIChyZXQpCkBAIC0yMTIsNiArMjExLDggQEAKIAlyZXQgPSBjeDE4X3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZm10KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCXcgPSBmbXQtPmZtdC5waXgud2lkdGg7CisJaCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CiAKIAlpZiAoY3gtPnBhcmFtcy53aWR0aCA9PSB3ICYmIGN4LT5wYXJhbXMuaGVpZ2h0ID09IGgpCiAJCXJldHVybiAwOwpAQCAtMjg2LDkgKzI4Nyw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3gxOF9jYXJkc19sb2NrLCBmbGFncyk7CiAJaWYgKGNtZCA9PSBWSURJT0NfREJHX0dfUkVHSVNURVIpCi0JCXJlZ3MtPnZhbCA9IHJlYWRfZW5jKHJlZ3MtPnJlZyk7CisJCXJlZ3MtPnZhbCA9IGN4MThfcmVhZF9lbmMoY3gsIHJlZ3MtPnJlZyk7CiAJZWxzZQotCQl3cml0ZV9lbmMocmVncy0+dmFsLCByZWdzLT5yZWcpOworCQljeDE4X3dyaXRlX2VuYyhjeCwgcmVncy0+dmFsLCByZWdzLT5yZWcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN4MThfY2FyZHNfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMzQ1LDcgKzM0Niw3IEBACiAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgQ1gxOF9EUklWRVJfTkFNRSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgY3gtPmNhcmRfbmFtZSwgc2l6ZW9mKHZjYXAtPmNhcmQpKTsKLQlzdHJsY3B5KHZjYXAtPmJ1c19pbmZvLCBwY2lfbmFtZShjeC0+ZGV2KSwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7CisJc25wcmludGYodmNhcC0+YnVzX2luZm8sIHNpemVvZih2Y2FwLT5idXNfaW5mbyksICJQQ0k6JXMiLCBwY2lfbmFtZShjeC0+ZGV2KSk7CiAJdmNhcC0+dmVyc2lvbiA9IENYMThfRFJJVkVSX1ZFUlNJT047IAkgICAgLyogdmVyc2lvbiAqLwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IGN4LT52NGwyX2NhcDsgCSAgICAvKiBjYXBhYmlsaXRpZXMgKi8KIAlyZXR1cm4gMDsKQEAgLTYyMiw2ICs2MjMsNyBAQAogewogCXN0cnVjdCBjeDE4X29wZW5faWQgKmlkID0gZmg7CiAJc3RydWN0IGN4MTggKmN4ID0gaWQtPmN4OworCXUzMiBoOwogCiAJc3dpdGNoIChlbmMtPmNtZCkgewogCWNhc2UgVjRMMl9FTkNfQ01EX1NUQVJUOgpAQCAtNjQzLDggKzY0NSwxNCBAQAogCQkJcmV0dXJuIC1FUEVSTTsKIAkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQ1gxOF9GX0lfRU5DX1BBVVNFRCwgJmN4LT5pX2ZsYWdzKSkKIAkJCXJldHVybiAwOworCQloID0gY3gxOF9maW5kX2hhbmRsZShjeCk7CisJCWlmIChoID09IENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRSkgeworCQkJQ1gxOF9FUlIoIkNhbid0IGZpbmQgdmFsaWQgdGFzayBoYW5kbGUgZm9yICIKKwkJCQkgIlY0TDJfRU5DX0NNRF9QQVVTRVxuIik7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQogCQljeDE4X211dGUoY3gpOwotCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0NBUFRVUkVfUEFVU0UsIDEsIGN4MThfZmluZF9oYW5kbGUoY3gpKTsKKwkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9DQVBUVVJFX1BBVVNFLCAxLCBoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFY0TDJfRU5DX0NNRF9SRVNVTUU6CkBAIC02NTQsNyArNjYyLDEzIEBACiAJCQlyZXR1cm4gLUVQRVJNOwogCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChDWDE4X0ZfSV9FTkNfUEFVU0VELCAmY3gtPmlfZmxhZ3MpKQogCQkJcmV0dXJuIDA7Ci0JCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfQ0FQVFVSRV9SRVNVTUUsIDEsIGN4MThfZmluZF9oYW5kbGUoY3gpKTsKKwkJaCA9IGN4MThfZmluZF9oYW5kbGUoY3gpOworCQlpZiAoaCA9PSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEUpIHsKKwkJCUNYMThfRVJSKCJDYW4ndCBmaW5kIHZhbGlkIHRhc2sgaGFuZGxlIGZvciAiCisJCQkJICJWNEwyX0VOQ19DTURfUkVTVU1FXG4iKTsKKwkJCXJldHVybiAtRUJBREZEOworCQl9CisJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfQ0FQVFVSRV9SRVNVTUUsIDEsIGgpOwogCQljeDE4X3VubXV0ZShjeCk7CiAJCWJyZWFrOwogCkBAIC03MzEsMTIgKzc0NSwxNCBAQAogCQkJY29udGludWU7CiAJCUNYMThfSU5GTygiU3RyZWFtICVzOiBzdGF0dXMgMHglMDRseCwgJWQlJSBvZiAlZCBLaUIgKCVkIGJ1ZmZlcnMpIGluIHVzZVxuIiwKIAkJCSAgcy0+bmFtZSwgcy0+c19mbGFncywKLQkJCSAgKHMtPmJ1ZmZlcnMgLSBzLT5xX2ZyZWUuYnVmZmVycykgKiAxMDAgLyBzLT5idWZmZXJzLAorCQkJICAocy0+YnVmZmVycyAtIGF0b21pY19yZWFkKCZzLT5xX2ZyZWUuYnVmZmVycykpCisJCQkJKiAxMDAgLyBzLT5idWZmZXJzLAogCQkJICAocy0+YnVmZmVycyAqIHMtPmJ1Zl9zaXplKSAvIDEwMjQsIHMtPmJ1ZmZlcnMpOwogCX0KIAlDWDE4X0lORk8oIlJlYWQgTVBFRy9WQkk6ICVsbGQvJWxsZCBieXRlc1xuIiwKIAkJCShsb25nIGxvbmcpY3gtPm1wZ19kYXRhX3JlY2VpdmVkLAogCQkJKGxvbmcgbG9uZyljeC0+dmJpX2RhdGFfaW5zZXJ0ZWQpOworCWN4MThfbG9nX3N0YXRpc3RpY3MoY3gpOwogCUNYMThfSU5GTygiPT09PT09PT09PT09PT09PT09ICBFTkQgU1RBVFVTIENBUkQgIyVkICA9PT09PT09PT09PT09PT09PT1cbiIsIGN4LT5udW0pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaXJxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYwppbmRleCBhYjIxODMxLi4zNjAzMzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pcnEuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LWZpcm13YXJlLmgiCiAjaW5jbHVkZSAiY3gxOC1maWxlb3BzLmgiCiAjaW5jbHVkZSAiY3gxOC1xdWV1ZS5oIgpAQCAtNDgsOCArNDksOCBAQAogCQkJYnJlYWs7CiAJfQogCWlmIChpID09IENYMThfTUFYX1NUUkVBTVMpIHsKLQkJQ1gxOF9XQVJOKCJETUEgZG9uZSBmb3IgdW5rbm93biBoYW5kbGUgJWQgZm9yIHN0cmVhbSAlc1xuIiwKLQkJCWhhbmRsZSwgcy0+bmFtZSk7CisJCUNYMThfV0FSTigiR290IERNQSBkb25lIG5vdGlmaWNhdGlvbiBmb3IgdW5rbm93bi9pbmFjdGl2ZSIKKwkJCSAgIiBoYW5kbGUgJWRcbiIsIGhhbmRsZSk7CiAJCW1iLT5lcnJvciA9IENYRVJSX05PVF9PUEVOOwogCQltYi0+Y21kID0gMDsKIAkJY3gxOF9tYl9hY2soY3gsIG1iKTsKQEAgLTYwLDggKzYxLDggQEAKIAlpZiAobWItPmFyZ3NbMl0gIT0gMSkKIAkJQ1gxOF9XQVJOKCJBY2sgc3RydWN0ID0gJWQgZm9yICVzXG4iLAogCQkJbWItPmFyZ3NbMl0sIHMtPm5hbWUpOwotCWlkID0gcmVhZF9lbmMob2ZmKTsKLQlidWYgPSBjeDE4X3F1ZXVlX2dldF9idWZfaXJxKHMsIGlkLCByZWFkX2VuYyhvZmYgKyA0KSk7CisJaWQgPSBjeDE4X3JlYWRfZW5jKGN4LCBvZmYpOworCWJ1ZiA9IGN4MThfcXVldWVfZ2V0X2J1Zl9pcnEocywgaWQsIGN4MThfcmVhZF9lbmMoY3gsIG9mZiArIDQpKTsKIAlDWDE4X0RFQlVHX0hJX0RNQSgiRE1BIERPTkUgZm9yICVzIChidWZmZXIgJWQpXG4iLCBzLT5uYW1lLCBpZCk7CiAJaWYgKGJ1ZikgewogCQljeDE4X2J1Zl9zeW5jX2Zvcl9jcHUocywgYnVmKTsKQEAgLTgxLDcgKzgyLDcgQEAKIAkJCXNldF9iaXQoQ1gxOF9GX0JfTkVFRF9CVUZfU1dBUCwgJmJ1Zi0+Yl9mbGFncyk7CiAJfSBlbHNlIHsKIAkJQ1gxOF9XQVJOKCJDb3VsZCBub3QgZmluZCBidWYgJWQgZm9yIHN0cmVhbSAlc1xuIiwKLQkJCQlyZWFkX2VuYyhvZmYpLCBzLT5uYW1lKTsKKwkJCQljeDE4X3JlYWRfZW5jKGN4LCBvZmYpLCBzLT5uYW1lKTsKIAl9CiAJbWItPmVycm9yID0gMDsKIAltYi0+Y21kID0gMDsKQEAgLTk3LDggKzk4LDggQEAKIAljaGFyICpwOwogCiAJaWYgKG1iLT5hcmdzWzFdKSB7Ci0JCXNldHVwX3BhZ2UobWItPmFyZ3NbMV0pOwotCQltZW1jcHlfZnJvbWlvKHN0ciwgY3gtPmVuY19tZW0gKyBtYi0+YXJnc1sxXSwgMjUyKTsKKwkJY3gxOF9zZXR1cF9wYWdlKGN4LCBtYi0+YXJnc1sxXSk7CisJCWN4MThfbWVtY3B5X2Zyb21pbyhjeCwgc3RyLCBjeC0+ZW5jX21lbSArIG1iLT5hcmdzWzFdLCAyNTIpOwogCQlzdHJbMjUyXSA9IDA7CiAJfQogCWN4MThfbWJfYWNrKGN4LCBtYik7CkBAIC0xMTMsNyArMTE0LDcgQEAKIAlzdHJ1Y3QgY3gxOF9tYWlsYm94IG1iOwogCiAJaWYgKHN3MSAmIElSUV9DUFVfVE9fRVBVKSB7Ci0JCW1lbWNweV9mcm9taW8oJm1iLCAmY3gtPnNjYi0+Y3B1MmVwdV9tYiwgc2l6ZW9mKG1iKSk7CisJCWN4MThfbWVtY3B5X2Zyb21pbyhjeCwgJm1iLCAmY3gtPnNjYi0+Y3B1MmVwdV9tYiwgc2l6ZW9mKG1iKSk7CiAJCW1iLmVycm9yID0gMDsKIAogCQlzd2l0Y2ggKG1iLmNtZCkgewpAQCAtMTQxLDE2ICsxNDIsMTYgQEAKIAogCXNwaW5fbG9jaygmY3gtPmRtYV9yZWdfbG9jayk7CiAKLQlodzJfbWFzayA9IHJlYWRfcmVnKEhXMl9JTlRfTUFTSzVfUENJKTsKLQlodzIgPSByZWFkX3JlZyhIVzJfSU5UX0NMUl9TVEFUVVMpICYgaHcyX21hc2s7Ci0Jc3cyX21hc2sgPSByZWFkX3JlZyhTVzJfSU5UX0VOQUJMRV9QQ0kpIHwgSVJRX0VQVV9UT19IUFVfQUNLOwotCXN3MiA9IHJlYWRfcmVnKFNXMl9JTlRfU1RBVFVTKSAmIHN3Ml9tYXNrOwotCXN3MV9tYXNrID0gcmVhZF9yZWcoU1cxX0lOVF9FTkFCTEVfUENJKSB8IElSUV9FUFVfVE9fSFBVOwotCXN3MSA9IHJlYWRfcmVnKFNXMV9JTlRfU1RBVFVTKSAmIHN3MV9tYXNrOworCWh3Ml9tYXNrID0gY3gxOF9yZWFkX3JlZyhjeCwgSFcyX0lOVF9NQVNLNV9QQ0kpOworCWh3MiA9IGN4MThfcmVhZF9yZWcoY3gsIEhXMl9JTlRfQ0xSX1NUQVRVUykgJiBodzJfbWFzazsKKwlzdzJfbWFzayA9IGN4MThfcmVhZF9yZWcoY3gsIFNXMl9JTlRfRU5BQkxFX1BDSSkgfCBJUlFfRVBVX1RPX0hQVV9BQ0s7CisJc3cyID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cyX0lOVF9TVEFUVVMpICYgc3cyX21hc2s7CisJc3cxX21hc2sgPSBjeDE4X3JlYWRfcmVnKGN4LCBTVzFfSU5UX0VOQUJMRV9QQ0kpIHwgSVJRX0VQVV9UT19IUFU7CisJc3cxID0gY3gxOF9yZWFkX3JlZyhjeCwgU1cxX0lOVF9TVEFUVVMpICYgc3cxX21hc2s7CiAKLQl3cml0ZV9yZWcoc3cyJnN3Ml9tYXNrLCBTVzJfSU5UX1NUQVRVUyk7Ci0Jd3JpdGVfcmVnKHN3MSZzdzFfbWFzaywgU1cxX0lOVF9TVEFUVVMpOwotCXdyaXRlX3JlZyhodzImaHcyX21hc2ssIEhXMl9JTlRfQ0xSX1NUQVRVUyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIHN3MiZzdzJfbWFzaywgU1cyX0lOVF9TVEFUVVMpOworCWN4MThfd3JpdGVfcmVnKGN4LCBzdzEmc3cxX21hc2ssIFNXMV9JTlRfU1RBVFVTKTsKKwljeDE4X3dyaXRlX3JlZyhjeCwgaHcyJmh3Ml9tYXNrLCBIVzJfSU5UX0NMUl9TVEFUVVMpOwogCiAJaWYgKHN3MSB8fCBzdzIgfHwgaHcyKQogCQlDWDE4X0RFQlVHX0hJX0lSUSgiU1cxOiAleCAgU1cyOiAleCAgSFcyOiAleFxuIiwgc3cxLCBzdzIsIGh3Mik7CkBAIC0xNjEsMTUgKzE2MiwxNSBAQAogCSovCiAKIAlpZiAoc3cyKSB7Ci0JCWlmIChzdzIgJiAocmVhZGwoJmN4LT5zY2ItPmNwdTJocHVfaXJxX2FjaykgfAotCQkJICAgcmVhZGwoJmN4LT5zY2ItPmNwdTJlcHVfaXJxX2FjaykpKQorCQlpZiAoc3cyICYgKGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5jcHUyaHB1X2lycV9hY2spIHwKKwkJCSAgIGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5jcHUyZXB1X2lycV9hY2spKSkKIAkJCXdha2VfdXAoJmN4LT5tYl9jcHVfd2FpdHEpOwotCQlpZiAoc3cyICYgKHJlYWRsKCZjeC0+c2NiLT5hcHUyaHB1X2lycV9hY2spIHwKLQkJCSAgIHJlYWRsKCZjeC0+c2NiLT5hcHUyZXB1X2lycV9hY2spKSkKKwkJaWYgKHN3MiAmIChjeDE4X3JlYWRsKGN4LCAmY3gtPnNjYi0+YXB1MmhwdV9pcnFfYWNrKSB8CisJCQkgICBjeDE4X3JlYWRsKGN4LCAmY3gtPnNjYi0+YXB1MmVwdV9pcnFfYWNrKSkpCiAJCQl3YWtlX3VwKCZjeC0+bWJfYXB1X3dhaXRxKTsKLQkJaWYgKHN3MiAmIHJlYWRsKCZjeC0+c2NiLT5lcHUyaHB1X2lycV9hY2spKQorCQlpZiAoc3cyICYgY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmVwdTJocHVfaXJxX2FjaykpCiAJCQl3YWtlX3VwKCZjeC0+bWJfZXB1X3dhaXRxKTsKLQkJaWYgKHN3MiAmIHJlYWRsKCZjeC0+c2NiLT5ocHUyZXB1X2lycV9hY2spKQorCQlpZiAoc3cyICYgY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmhwdTJlcHVfaXJxX2FjaykpCiAJCQl3YWtlX3VwKCZjeC0+bWJfaHB1X3dhaXRxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYwppbmRleCA5MzE3NzUxLi45ZDE4ZGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKICNpbmNsdWRlICJjeDE4LWRyaXZlci5oIgorI2luY2x1ZGUgImN4MTgtaW8uaCIKICNpbmNsdWRlICJjeDE4LXNjYi5oIgogI2luY2x1ZGUgImN4MTgtaXJxLmgiCiAjaW5jbHVkZSAiY3gxOC1tYWlsYm94LmgiCkBAIC04Miw2ICs4Myw3IEBACiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfU0VUX01ETF9BQ0ssCQkJMCksCiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfU0VUX01ETCwJCQlBUElfRkFTVCksCiAJQVBJX0VOVFJZKENQVSwgQ1gxOF9BUFVfUkVTRVRBSSwJCQlBUElfRkFTVCksCisJQVBJX0VOVFJZKENQVSwgQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwsCQkJMCksCiAJQVBJX0VOVFJZKDAsIDAsCQkJCQkJMCksCiB9OwogCkBAIC0xMDUsMjAgKzEwNywyMCBAQAogCXN3aXRjaCAocnB1KSB7CiAJY2FzZSBBUFU6CiAJCW1iID0gJmN4LT5zY2ItPmVwdTJhcHVfbWI7Ci0JCSpzdGF0ZSA9IHJlYWRsKCZjeC0+c2NiLT5hcHVfc3RhdGUpOwotCQkqaXJxID0gcmVhZGwoJmN4LT5zY2ItPmVwdTJhcHVfaXJxKTsKKwkJKnN0YXRlID0gY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmFwdV9zdGF0ZSk7CisJCSppcnEgPSBjeDE4X3JlYWRsKGN4LCAmY3gtPnNjYi0+ZXB1MmFwdV9pcnEpOwogCQlicmVhazsKIAogCWNhc2UgQ1BVOgogCQltYiA9ICZjeC0+c2NiLT5lcHUyY3B1X21iOwotCQkqc3RhdGUgPSByZWFkbCgmY3gtPnNjYi0+Y3B1X3N0YXRlKTsKLQkJKmlycSA9IHJlYWRsKCZjeC0+c2NiLT5lcHUyY3B1X2lycSk7CisJCSpzdGF0ZSA9IGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5jcHVfc3RhdGUpOworCQkqaXJxID0gY3gxOF9yZWFkbChjeCwgJmN4LT5zY2ItPmVwdTJjcHVfaXJxKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhQVToKIAkJbWIgPSAmY3gtPnNjYi0+ZXB1MmhwdV9tYjsKLQkJKnN0YXRlID0gcmVhZGwoJmN4LT5zY2ItPmhwdV9zdGF0ZSk7Ci0JCSppcnEgPSByZWFkbCgmY3gtPnNjYi0+ZXB1MmhwdV9pcnEpOworCQkqc3RhdGUgPSBjeDE4X3JlYWRsKGN4LCAmY3gtPnNjYi0+aHB1X3N0YXRlKTsKKwkJKmlycSA9IGN4MThfcmVhZGwoY3gsICZjeC0+c2NiLT5lcHUyaHB1X2lycSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTI2LDggKzEyOCw4IEBACiAJCXJldHVybiBtYjsKIAogCWRvIHsKLQkJKnJlcSA9IHJlYWRsKCZtYi0+cmVxdWVzdCk7Ci0JCWFjayA9IHJlYWRsKCZtYi0+YWNrKTsKKwkJKnJlcSA9IGN4MThfcmVhZGwoY3gsICZtYi0+cmVxdWVzdCk7CisJCWFjayA9IGN4MThfcmVhZGwoY3gsICZtYi0+YWNrKTsKIAkJd2FpdF9jb3VudCsrOwogCX0gd2hpbGUgKCpyZXEgIT0gYWNrICYmIHdhaXRfY291bnQgPCA2MDApOwogCkBAIC0xNzIsOSArMTc0LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc2V0dXBfcGFnZShTQ0JfT0ZGU0VUKTsKLQl3cml0ZV9zeW5jKG1iLT5yZXF1ZXN0LCAmYWNrX21iLT5hY2spOwotCXdyaXRlX3JlZyhhY2tfaXJxLCBTVzJfSU5UX1NFVCk7CisJY3gxOF9zZXR1cF9wYWdlKGN4LCBTQ0JfT0ZGU0VUKTsKKwljeDE4X3dyaXRlX3N5bmMoY3gsIG1iLT5yZXF1ZXN0LCAmYWNrX21iLT5hY2spOworCWN4MThfd3JpdGVfcmVnKGN4LCBhY2tfaXJxLCBTVzJfSU5UX1NFVCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OSw3ICsyMDEsNyBAQAogCQlDWDE4X0RFQlVHX0hJX0FQSSgiJXNcbiIsIGluZm8tPm5hbWUpOwogCWVsc2UKIAkJQ1gxOF9ERUJVR19BUEkoIiVzXG4iLCBpbmZvLT5uYW1lKTsKLQlzZXR1cF9wYWdlKFNDQl9PRkZTRVQpOworCWN4MThfc2V0dXBfcGFnZShjeCwgU0NCX09GRlNFVCk7CiAJbWIgPSBjeDE4X21iX2lzX2NvbXBsZXRlKGN4LCBpbmZvLT5ycHUsICZzdGF0ZSwgJmlycSwgJnJlcSk7CiAKIAlpZiAobWIgPT0gTlVMTCkgewpAQCAtMjA4LDExICsyMTAsMTEgQEAKIAl9CiAKIAlvbGRyZXEgPSByZXEgLSAxOwotCXdyaXRlbChjbWQsICZtYi0+Y21kKTsKKwljeDE4X3dyaXRlbChjeCwgY21kLCAmbWItPmNtZCk7CiAJZm9yIChpID0gMDsgaSA8IGFyZ3M7IGkrKykKLQkJd3JpdGVsKGRhdGFbaV0sICZtYi0+YXJnc1tpXSk7Ci0Jd3JpdGVsKDAsICZtYi0+ZXJyb3IpOwotCXdyaXRlbChyZXEsICZtYi0+cmVxdWVzdCk7CisJCWN4MThfd3JpdGVsKGN4LCBkYXRhW2ldLCAmbWItPmFyZ3NbaV0pOworCWN4MThfd3JpdGVsKGN4LCAwLCAmbWItPmVycm9yKTsKKwljeDE4X3dyaXRlbChjeCwgcmVxLCAmbWItPnJlcXVlc3QpOwogCiAJc3dpdGNoIChpbmZvLT5ycHUpIHsKIAljYXNlIEFQVTogd2FpdHEgPSAmY3gtPm1iX2FwdV93YWl0cTsgYnJlYWs7CkBAIC0yMjMsOSArMjI1LDEwIEBACiAJfQogCWlmIChpbmZvLT5mbGFncyAmIEFQSV9GQVNUKQogCQl0aW1lb3V0IC89IDI7Ci0Jd3JpdGVfcmVnKGlycSwgU1cxX0lOVF9TRVQpOworCWN4MThfd3JpdGVfcmVnKGN4LCBpcnEsIFNXMV9JTlRfU0VUKTsKIAotCXdoaWxlICghc2lnICYmIHJlYWRsKCZtYi0+YWNrKSAhPSByZWFkbCgmbWItPnJlcXVlc3QpICYmIGNudCA8IDY2MCkgeworCXdoaWxlICghc2lnICYmIGN4MThfcmVhZGwoY3gsICZtYi0+YWNrKSAhPSBjeDE4X3JlYWRsKGN4LCAmbWItPnJlcXVlc3QpCisJICAgICAgICYmIGNudCA8IDY2MCkgewogCQlpZiAoY250ID4gMjAwICYmICFpbl9hdG9taWMoKSkKIAkJCXNpZyA9IGN4MThfbXNsZWVwX3RpbWVvdXQoMTAsIDEpOwogCQljbnQrKzsKQEAgLTIzMywxMyArMjM2LDEzIEBACiAJaWYgKHNpZykKIAkJcmV0dXJuIC1FSU5UUjsKIAlpZiAoY250ID09IDY2MCkgewotCQl3cml0ZWwob2xkcmVxLCAmbWItPnJlcXVlc3QpOworCQljeDE4X3dyaXRlbChjeCwgb2xkcmVxLCAmbWItPnJlcXVlc3QpOwogCQlDWDE4X0VSUigibWIgJXMgZmFpbGVkXG4iLCBpbmZvLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBNQVhfTUJfQVJHVU1FTlRTOyBpKyspCi0JCWRhdGFbaV0gPSByZWFkbCgmbWItPmFyZ3NbaV0pOwotCWVyciA9IHJlYWRsKCZtYi0+ZXJyb3IpOworCQlkYXRhW2ldID0gY3gxOF9yZWFkbChjeCwgJm1iLT5hcmdzW2ldKTsKKwllcnIgPSBjeDE4X3JlYWRsKGN4LCAmbWItPmVycm9yKTsKIAlpZiAoIWluX2F0b21pYygpICYmIChpbmZvLT5mbGFncyAmIEFQSV9TTE9XKSkKIAkJY3gxOF9tc2xlZXBfdGltZW91dCgzMDAsIDApOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtcXVldWUuYwppbmRleCBkYmU3OTJhLi5hMzNiYTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXF1ZXVlLmMKQEAgLTM3LDggKzM3LDcgQEAKIHZvaWQgY3gxOF9xdWV1ZV9pbml0KHN0cnVjdCBjeDE4X3F1ZXVlICpxKQogewogCUlOSVRfTElTVF9IRUFEKCZxLT5saXN0KTsKLQlxLT5idWZmZXJzID0gMDsKLQlxLT5sZW5ndGggPSAwOworCWF0b21pY19zZXQoJnEtPmJ1ZmZlcnMsIDApOwogCXEtPmJ5dGVzdXNlZCA9IDA7CiB9CiAKQEAgLTU1LDggKzU0LDcgQEAKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnFsb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmcS0+bGlzdCk7Ci0JcS0+YnVmZmVycysrOwotCXEtPmxlbmd0aCArPSBzLT5idWZfc2l6ZTsKKwlhdG9taWNfaW5jKCZxLT5idWZmZXJzKTsKIAlxLT5ieXRlc3VzZWQgKz0gYnVmLT5ieXRlc3VzZWQgLSBidWYtPnJlYWRwb3M7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cWxvY2ssIGZsYWdzKTsKIH0KQEAgLTcwLDggKzY4LDcgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnEtPmxpc3QpKSB7CiAJCWJ1ZiA9IGxpc3RfZW50cnkocS0+bGlzdC5uZXh0LCBzdHJ1Y3QgY3gxOF9idWZmZXIsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KHEtPmxpc3QubmV4dCk7Ci0JCXEtPmJ1ZmZlcnMtLTsKLQkJcS0+bGVuZ3RoIC09IHMtPmJ1Zl9zaXplOworCQlhdG9taWNfZGVjKCZxLT5idWZmZXJzKTsKIAkJcS0+Ynl0ZXN1c2VkIC09IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5xbG9jaywgZmxhZ3MpOwpAQCAtOTUsMTAgKzkyLDggQEAKIAkJLyogdGhlIHRyYW5zcG9ydCBidWZmZXJzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LAogCQkgICB0aGV5IGFyZSBub3QgbW92ZWQgdG8gdGhlIGZ1bGwgcXVldWUgKi8KIAkJaWYgKHMtPnR5cGUgIT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMpIHsKLQkJCXMtPnFfZnJlZS5idWZmZXJzLS07Ci0JCQlzLT5xX2ZyZWUubGVuZ3RoIC09IHMtPmJ1Zl9zaXplOwotCQkJcy0+cV9mdWxsLmJ1ZmZlcnMrKzsKLQkJCXMtPnFfZnVsbC5sZW5ndGggKz0gcy0+YnVmX3NpemU7CisJCQlhdG9taWNfZGVjKCZzLT5xX2ZyZWUuYnVmZmVycyk7CisJCQlhdG9taWNfaW5jKCZzLT5xX2Z1bGwuYnVmZmVycyk7CiAJCQlzLT5xX2Z1bGwuYnl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkOwogCQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+bGlzdCwgJnMtPnFfZnVsbC5saXN0KTsKIAkJfQpAQCAtMTI0LDggKzExOSw3IEBACiAJCWJ1ZiA9IGxpc3RfZW50cnkocS0+bGlzdC5uZXh0LCBzdHJ1Y3QgY3gxOF9idWZmZXIsIGxpc3QpOwogCQlsaXN0X21vdmVfdGFpbChxLT5saXN0Lm5leHQsICZzLT5xX2ZyZWUubGlzdCk7CiAJCWJ1Zi0+Ynl0ZXN1c2VkID0gYnVmLT5yZWFkcG9zID0gYnVmLT5iX2ZsYWdzID0gMDsKLQkJcy0+cV9mcmVlLmJ1ZmZlcnMrKzsKLQkJcy0+cV9mcmVlLmxlbmd0aCArPSBzLT5idWZfc2l6ZTsKKwkJYXRvbWljX2luYygmcy0+cV9mcmVlLmJ1ZmZlcnMpOwogCX0KIAljeDE4X3F1ZXVlX2luaXQocSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cWxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXNjYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc2NiLmMKaW5kZXggMzBiYzgwMy4uZjU2ZDM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc2NiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc2NiLmMKQEAgLTIwLDEwMiArMjAsMTAzIEBACiAgKi8KIAogI2luY2x1ZGUgImN4MTgtZHJpdmVyLmgiCisjaW5jbHVkZSAiY3gxOC1pby5oIgogI2luY2x1ZGUgImN4MTgtc2NiLmgiCiAKIHZvaWQgY3gxOF9pbml0X3NjYihzdHJ1Y3QgY3gxOCAqY3gpCiB7Ci0Jc2V0dXBfcGFnZShTQ0JfT0ZGU0VUKTsKLQltZW1zZXRfaW8oY3gtPnNjYiwgMCwgMHgxMDAwMCk7CisJY3gxOF9zZXR1cF9wYWdlKGN4LCBTQ0JfT0ZGU0VUKTsKKwljeDE4X21lbXNldF9pbyhjeCwgY3gtPnNjYiwgMCwgMHgxMDAwMCk7CiAKLQl3cml0ZWwoSVJRX0FQVV9UT19DUFUsICAgICAmY3gtPnNjYi0+YXB1MmNwdV9pcnEpOwotCXdyaXRlbChJUlFfQ1BVX1RPX0FQVV9BQ0ssICZjeC0+c2NiLT5jcHUyYXB1X2lycV9hY2spOwotCXdyaXRlbChJUlFfSFBVX1RPX0NQVSwgICAgICZjeC0+c2NiLT5ocHUyY3B1X2lycSk7Ci0Jd3JpdGVsKElSUV9DUFVfVE9fSFBVX0FDSywgJmN4LT5zY2ItPmNwdTJocHVfaXJxX2Fjayk7Ci0Jd3JpdGVsKElSUV9QUFVfVE9fQ1BVLCAgICAgJmN4LT5zY2ItPnBwdTJjcHVfaXJxKTsKLQl3cml0ZWwoSVJRX0NQVV9UT19QUFVfQUNLLCAmY3gtPnNjYi0+Y3B1MnBwdV9pcnFfYWNrKTsKLQl3cml0ZWwoSVJRX0VQVV9UT19DUFUsICAgICAmY3gtPnNjYi0+ZXB1MmNwdV9pcnEpOwotCXdyaXRlbChJUlFfQ1BVX1RPX0VQVV9BQ0ssICZjeC0+c2NiLT5jcHUyZXB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQVBVX1RPX0NQVSwgICAgICZjeC0+c2NiLT5hcHUyY3B1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9DUFVfVE9fQVBVX0FDSywgJmN4LT5zY2ItPmNwdTJhcHVfaXJxX2Fjayk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9IUFVfVE9fQ1BVLCAgICAgJmN4LT5zY2ItPmhwdTJjcHVfaXJxKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0NQVV9UT19IUFVfQUNLLCAmY3gtPnNjYi0+Y3B1MmhwdV9pcnFfYWNrKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX1BQVV9UT19DUFUsICAgICAmY3gtPnNjYi0+cHB1MmNwdV9pcnEpOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQ1BVX1RPX1BQVV9BQ0ssICZjeC0+c2NiLT5jcHUycHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfRVBVX1RPX0NQVSwgICAgICZjeC0+c2NiLT5lcHUyY3B1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9DUFVfVE9fRVBVX0FDSywgJmN4LT5zY2ItPmNwdTJlcHVfaXJxX2Fjayk7CiAKLQl3cml0ZWwoSVJRX0NQVV9UT19BUFUsICAgICAmY3gtPnNjYi0+Y3B1MmFwdV9pcnEpOwotCXdyaXRlbChJUlFfQVBVX1RPX0NQVV9BQ0ssICZjeC0+c2NiLT5hcHUyY3B1X2lycV9hY2spOwotCXdyaXRlbChJUlFfSFBVX1RPX0FQVSwgICAgICZjeC0+c2NiLT5ocHUyYXB1X2lycSk7Ci0Jd3JpdGVsKElSUV9BUFVfVE9fSFBVX0FDSywgJmN4LT5zY2ItPmFwdTJocHVfaXJxX2Fjayk7Ci0Jd3JpdGVsKElSUV9QUFVfVE9fQVBVLCAgICAgJmN4LT5zY2ItPnBwdTJhcHVfaXJxKTsKLQl3cml0ZWwoSVJRX0FQVV9UT19QUFVfQUNLLCAmY3gtPnNjYi0+YXB1MnBwdV9pcnFfYWNrKTsKLQl3cml0ZWwoSVJRX0VQVV9UT19BUFUsICAgICAmY3gtPnNjYi0+ZXB1MmFwdV9pcnEpOwotCXdyaXRlbChJUlFfQVBVX1RPX0VQVV9BQ0ssICZjeC0+c2NiLT5hcHUyZXB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQ1BVX1RPX0FQVSwgICAgICZjeC0+c2NiLT5jcHUyYXB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9BUFVfVE9fQ1BVX0FDSywgJmN4LT5zY2ItPmFwdTJjcHVfaXJxX2Fjayk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9IUFVfVE9fQVBVLCAgICAgJmN4LT5zY2ItPmhwdTJhcHVfaXJxKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0FQVV9UT19IUFVfQUNLLCAmY3gtPnNjYi0+YXB1MmhwdV9pcnFfYWNrKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX1BQVV9UT19BUFUsICAgICAmY3gtPnNjYi0+cHB1MmFwdV9pcnEpOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQVBVX1RPX1BQVV9BQ0ssICZjeC0+c2NiLT5hcHUycHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfRVBVX1RPX0FQVSwgICAgICZjeC0+c2NiLT5lcHUyYXB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9BUFVfVE9fRVBVX0FDSywgJmN4LT5zY2ItPmFwdTJlcHVfaXJxX2Fjayk7CiAKLQl3cml0ZWwoSVJRX0NQVV9UT19IUFUsICAgICAmY3gtPnNjYi0+Y3B1MmhwdV9pcnEpOwotCXdyaXRlbChJUlFfSFBVX1RPX0NQVV9BQ0ssICZjeC0+c2NiLT5ocHUyY3B1X2lycV9hY2spOwotCXdyaXRlbChJUlFfQVBVX1RPX0hQVSwgICAgICZjeC0+c2NiLT5hcHUyaHB1X2lycSk7Ci0Jd3JpdGVsKElSUV9IUFVfVE9fQVBVX0FDSywgJmN4LT5zY2ItPmhwdTJhcHVfaXJxX2Fjayk7Ci0Jd3JpdGVsKElSUV9QUFVfVE9fSFBVLCAgICAgJmN4LT5zY2ItPnBwdTJocHVfaXJxKTsKLQl3cml0ZWwoSVJRX0hQVV9UT19QUFVfQUNLLCAmY3gtPnNjYi0+aHB1MnBwdV9pcnFfYWNrKTsKLQl3cml0ZWwoSVJRX0VQVV9UT19IUFUsICAgICAmY3gtPnNjYi0+ZXB1MmhwdV9pcnEpOwotCXdyaXRlbChJUlFfSFBVX1RPX0VQVV9BQ0ssICZjeC0+c2NiLT5ocHUyZXB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQ1BVX1RPX0hQVSwgICAgICZjeC0+c2NiLT5jcHUyaHB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9IUFVfVE9fQ1BVX0FDSywgJmN4LT5zY2ItPmhwdTJjcHVfaXJxX2Fjayk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9BUFVfVE9fSFBVLCAgICAgJmN4LT5zY2ItPmFwdTJocHVfaXJxKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0hQVV9UT19BUFVfQUNLLCAmY3gtPnNjYi0+aHB1MmFwdV9pcnFfYWNrKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX1BQVV9UT19IUFUsICAgICAmY3gtPnNjYi0+cHB1MmhwdV9pcnEpOworCWN4MThfd3JpdGVsKGN4LCBJUlFfSFBVX1RPX1BQVV9BQ0ssICZjeC0+c2NiLT5ocHUycHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfRVBVX1RPX0hQVSwgICAgICZjeC0+c2NiLT5lcHUyaHB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9IUFVfVE9fRVBVX0FDSywgJmN4LT5zY2ItPmhwdTJlcHVfaXJxX2Fjayk7CiAKLQl3cml0ZWwoSVJRX0NQVV9UT19QUFUsICAgICAmY3gtPnNjYi0+Y3B1MnBwdV9pcnEpOwotCXdyaXRlbChJUlFfUFBVX1RPX0NQVV9BQ0ssICZjeC0+c2NiLT5wcHUyY3B1X2lycV9hY2spOwotCXdyaXRlbChJUlFfQVBVX1RPX1BQVSwgICAgICZjeC0+c2NiLT5hcHUycHB1X2lycSk7Ci0Jd3JpdGVsKElSUV9QUFVfVE9fQVBVX0FDSywgJmN4LT5zY2ItPnBwdTJhcHVfaXJxX2Fjayk7Ci0Jd3JpdGVsKElSUV9IUFVfVE9fUFBVLCAgICAgJmN4LT5zY2ItPmhwdTJwcHVfaXJxKTsKLQl3cml0ZWwoSVJRX1BQVV9UT19IUFVfQUNLLCAmY3gtPnNjYi0+cHB1MmhwdV9pcnFfYWNrKTsKLQl3cml0ZWwoSVJRX0VQVV9UT19QUFUsICAgICAmY3gtPnNjYi0+ZXB1MnBwdV9pcnEpOwotCXdyaXRlbChJUlFfUFBVX1RPX0VQVV9BQ0ssICZjeC0+c2NiLT5wcHUyZXB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQ1BVX1RPX1BQVSwgICAgICZjeC0+c2NiLT5jcHUycHB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9QUFVfVE9fQ1BVX0FDSywgJmN4LT5zY2ItPnBwdTJjcHVfaXJxX2Fjayk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9BUFVfVE9fUFBVLCAgICAgJmN4LT5zY2ItPmFwdTJwcHVfaXJxKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX1BQVV9UT19BUFVfQUNLLCAmY3gtPnNjYi0+cHB1MmFwdV9pcnFfYWNrKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0hQVV9UT19QUFUsICAgICAmY3gtPnNjYi0+aHB1MnBwdV9pcnEpOworCWN4MThfd3JpdGVsKGN4LCBJUlFfUFBVX1RPX0hQVV9BQ0ssICZjeC0+c2NiLT5wcHUyaHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfRVBVX1RPX1BQVSwgICAgICZjeC0+c2NiLT5lcHUycHB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9QUFVfVE9fRVBVX0FDSywgJmN4LT5zY2ItPnBwdTJlcHVfaXJxX2Fjayk7CiAKLQl3cml0ZWwoSVJRX0NQVV9UT19FUFUsICAgICAmY3gtPnNjYi0+Y3B1MmVwdV9pcnEpOwotCXdyaXRlbChJUlFfRVBVX1RPX0NQVV9BQ0ssICZjeC0+c2NiLT5lcHUyY3B1X2lycV9hY2spOwotCXdyaXRlbChJUlFfQVBVX1RPX0VQVSwgICAgICZjeC0+c2NiLT5hcHUyZXB1X2lycSk7Ci0Jd3JpdGVsKElSUV9FUFVfVE9fQVBVX0FDSywgJmN4LT5zY2ItPmVwdTJhcHVfaXJxX2Fjayk7Ci0Jd3JpdGVsKElSUV9IUFVfVE9fRVBVLCAgICAgJmN4LT5zY2ItPmhwdTJlcHVfaXJxKTsKLQl3cml0ZWwoSVJRX0VQVV9UT19IUFVfQUNLLCAmY3gtPnNjYi0+ZXB1MmhwdV9pcnFfYWNrKTsKLQl3cml0ZWwoSVJRX1BQVV9UT19FUFUsICAgICAmY3gtPnNjYi0+cHB1MmVwdV9pcnEpOwotCXdyaXRlbChJUlFfRVBVX1RPX1BQVV9BQ0ssICZjeC0+c2NiLT5lcHUycHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfQ1BVX1RPX0VQVSwgICAgICZjeC0+c2NiLT5jcHUyZXB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9FUFVfVE9fQ1BVX0FDSywgJmN4LT5zY2ItPmVwdTJjcHVfaXJxX2Fjayk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9BUFVfVE9fRVBVLCAgICAgJmN4LT5zY2ItPmFwdTJlcHVfaXJxKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0VQVV9UT19BUFVfQUNLLCAmY3gtPnNjYi0+ZXB1MmFwdV9pcnFfYWNrKTsKKwljeDE4X3dyaXRlbChjeCwgSVJRX0hQVV9UT19FUFUsICAgICAmY3gtPnNjYi0+aHB1MmVwdV9pcnEpOworCWN4MThfd3JpdGVsKGN4LCBJUlFfRVBVX1RPX0hQVV9BQ0ssICZjeC0+c2NiLT5lcHUyaHB1X2lycV9hY2spOworCWN4MThfd3JpdGVsKGN4LCBJUlFfUFBVX1RPX0VQVSwgICAgICZjeC0+c2NiLT5wcHUyZXB1X2lycSk7CisJY3gxOF93cml0ZWwoY3gsIElSUV9FUFVfVE9fUFBVX0FDSywgJmN4LT5zY2ItPmVwdTJwcHVfaXJxX2Fjayk7CiAKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgYXB1MmNwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGFwdTJjcHVfbWIpLAogCQkJJmN4LT5zY2ItPmFwdTJjcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgaHB1MmNwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGhwdTJjcHVfbWIpLAogCQkJJmN4LT5zY2ItPmhwdTJjcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgcHB1MmNwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIHBwdTJjcHVfbWIpLAogCQkJJmN4LT5zY2ItPnBwdTJjcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgZXB1MmNwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGVwdTJjcHVfbWIpLAogCQkJJmN4LT5zY2ItPmVwdTJjcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgY3B1MmFwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGNwdTJhcHVfbWIpLAogCQkJJmN4LT5zY2ItPmNwdTJhcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgaHB1MmFwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGhwdTJhcHVfbWIpLAogCQkJJmN4LT5zY2ItPmhwdTJhcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgcHB1MmFwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIHBwdTJhcHVfbWIpLAogCQkJJmN4LT5zY2ItPnBwdTJhcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgZXB1MmFwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGVwdTJhcHVfbWIpLAogCQkJJmN4LT5zY2ItPmVwdTJhcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgY3B1MmhwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGNwdTJocHVfbWIpLAogCQkJJmN4LT5zY2ItPmNwdTJocHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgYXB1MmhwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGFwdTJocHVfbWIpLAogCQkJJmN4LT5zY2ItPmFwdTJocHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgcHB1MmhwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIHBwdTJocHVfbWIpLAogCQkJJmN4LT5zY2ItPnBwdTJocHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgZXB1MmhwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGVwdTJocHVfbWIpLAogCQkJJmN4LT5zY2ItPmVwdTJocHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgY3B1MnBwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGNwdTJwcHVfbWIpLAogCQkJJmN4LT5zY2ItPmNwdTJwcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgYXB1MnBwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGFwdTJwcHVfbWIpLAogCQkJJmN4LT5zY2ItPmFwdTJwcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgaHB1MnBwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGhwdTJwcHVfbWIpLAogCQkJJmN4LT5zY2ItPmhwdTJwcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgZXB1MnBwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGVwdTJwcHVfbWIpLAogCQkJJmN4LT5zY2ItPmVwdTJwcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgY3B1MmVwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGNwdTJlcHVfbWIpLAogCQkJJmN4LT5zY2ItPmNwdTJlcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgYXB1MmVwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGFwdTJlcHVfbWIpLAogCQkJJmN4LT5zY2ItPmFwdTJlcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgaHB1MmVwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIGhwdTJlcHVfbWIpLAogCQkJJmN4LT5zY2ItPmhwdTJlcHVfbWJfb2Zmc2V0KTsKLQl3cml0ZWwoU0NCX09GRlNFVCArIG9mZnNldG9mKHN0cnVjdCBjeDE4X3NjYiwgcHB1MmVwdV9tYiksCisJY3gxOF93cml0ZWwoY3gsIFNDQl9PRkZTRVQgKyBvZmZzZXRvZihzdHJ1Y3QgY3gxOF9zY2IsIHBwdTJlcHVfbWIpLAogCQkJJmN4LT5zY2ItPnBwdTJlcHVfbWJfb2Zmc2V0KTsKIAotCXdyaXRlbChTQ0JfT0ZGU0VUICsgb2Zmc2V0b2Yoc3RydWN0IGN4MThfc2NiLCBjcHVfc3RhdGUpLAorCWN4MThfd3JpdGVsKGN4LCBTQ0JfT0ZGU0VUICsgb2Zmc2V0b2Yoc3RydWN0IGN4MThfc2NiLCBjcHVfc3RhdGUpLAogCQkJJmN4LT5zY2ItPmlwY19vZmZzZXQpOwogCi0Jd3JpdGVsKDEsICZjeC0+c2NiLT5ocHVfc3RhdGUpOwotCXdyaXRlbCgxLCAmY3gtPnNjYi0+ZXB1X3N0YXRlKTsKKwljeDE4X3dyaXRlbChjeCwgMSwgJmN4LT5zY2ItPmhwdV9zdGF0ZSk7CisJY3gxOF93cml0ZWwoY3gsIDEsICZjeC0+c2NiLT5lcHVfc3RhdGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jCmluZGV4IDBkYTU3ZjUuLjBjOGU3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiY3gxOC1kcml2ZXIuaCIKKyNpbmNsdWRlICJjeDE4LWlvLmgiCiAjaW5jbHVkZSAiY3gxOC1maWxlb3BzLmgiCiAjaW5jbHVkZSAiY3gxOC1tYWlsYm94LmgiCiAjaW5jbHVkZSAiY3gxOC1pMmMuaCIKQEAgLTU2LDcgKzU3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IHZmbF90eXBlOwotCWludCBtaW5vcl9vZmZzZXQ7CisJaW50IG51bV9vZmZzZXQ7CiAJaW50IGRtYTsKIAllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGU7CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKQEAgLTExOSw3ICsxMjAsNyBAQAogCXMtPmN4ID0gY3g7CiAJcy0+dHlwZSA9IHR5cGU7CiAJcy0+bmFtZSA9IGN4MThfc3RyZWFtX2luZm9bdHlwZV0ubmFtZTsKLQlzLT5oYW5kbGUgPSAweGZmZmZmZmZmOworCXMtPmhhbmRsZSA9IENYMThfSU5WQUxJRF9UQVNLX0hBTkRMRTsKIAogCXMtPmRtYSA9IGN4MThfc3RyZWFtX2luZm9bdHlwZV0uZG1hOwogCXMtPmJ1Zl9zaXplID0gY3gtPnN0cmVhbV9idWZfc2l6ZVt0eXBlXTsKQEAgLTE0Myw4ICsxNDQsOCBAQAogewogCXN0cnVjdCBjeDE4X3N0cmVhbSAqcyA9ICZjeC0+c3RyZWFtc1t0eXBlXTsKIAl1MzIgY2FwID0gY3gtPnY0bDJfY2FwOwotCWludCBtaW5vcl9vZmZzZXQgPSBjeDE4X3N0cmVhbV9pbmZvW3R5cGVdLm1pbm9yX29mZnNldDsKLQlpbnQgbWlub3I7CisJaW50IG51bV9vZmZzZXQgPSBjeDE4X3N0cmVhbV9pbmZvW3R5cGVdLm51bV9vZmZzZXQ7CisJaW50IG51bSA9IGN4LT5udW0gKyBjeDE4X2ZpcnN0X21pbm9yICsgbnVtX29mZnNldDsKIAogCS8qIFRoZXNlIGZvdXIgZmllbGRzIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQuIElmIHY0bDJkZXYgPT0gTlVMTCwgdGhlbgogCSAgIHRoaXMgc3RyZWFtIGlzIG5vdCBpbiB1c2UuIEluIHRoYXQgY2FzZSBubyBvdGhlciBmaWVsZHMgYnV0IHRoZXNlCkBAIC0xNjMsOSArMTY0LDYgQEAKIAkgICAgIShjYXAgJiAoVjRMMl9DQVBfVkJJX0NBUFRVUkUgfCBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUpKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBjYXJkIG51bWJlciArIHVzZXIgZGVmaW5lZCBvZmZzZXQgKyBkZXZpY2Ugb2Zmc2V0ICovCi0JbWlub3IgPSBjeC0+bnVtICsgY3gxOF9maXJzdF9taW5vciArIG1pbm9yX29mZnNldDsKLQogCS8qIFVzZXIgZXhwbGljaXRseSBzZWxlY3RlZCAwIGJ1ZmZlcnMgZm9yIHRoZXNlIHN0cmVhbXMsIHNvIGRvbid0CiAJICAgY3JlYXRlIHRoZW0uICovCiAJaWYgKGN4MThfc3RyZWFtX2luZm9bdHlwZV0uZG1hICE9IFBDSV9ETUFfTk9ORSAmJgpAQCAtMTc2LDcgKzE3NCw3IEBACiAKIAljeDE4X3N0cmVhbV9pbml0KGN4LCB0eXBlKTsKIAotCWlmIChtaW5vcl9vZmZzZXQgPT0gLTEpCisJaWYgKG51bV9vZmZzZXQgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHY0bDIgdmlkZW8gZGV2aWNlIHN0cnVjdHVyZSAqLwpAQCAtMTkwLDcgKzE4OCw3IEBACiAJc25wcmludGYocy0+djRsMmRldi0+bmFtZSwgc2l6ZW9mKHMtPnY0bDJkZXYtPm5hbWUpLCAiY3gxOC0lZCIsCiAJCQljeC0+bnVtKTsKIAotCXMtPnY0bDJkZXYtPm1pbm9yID0gbWlub3I7CisJcy0+djRsMmRldi0+bnVtID0gbnVtOwogCXMtPnY0bDJkZXYtPnBhcmVudCA9ICZjeC0+ZGV2LT5kZXY7CiAJcy0+djRsMmRldi0+Zm9wcyA9IGN4MThfc3RyZWFtX2luZm9bdHlwZV0uZm9wczsKIAlzLT52NGwyZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CkBAIC0yMjYsNyArMjI0LDcgQEAKIHsKIAlzdHJ1Y3QgY3gxOF9zdHJlYW0gKnMgPSAmY3gtPnN0cmVhbXNbdHlwZV07CiAJaW50IHZmbF90eXBlID0gY3gxOF9zdHJlYW1faW5mb1t0eXBlXS52ZmxfdHlwZTsKLQlpbnQgbWlub3I7CisJaW50IG51bTsKIAogCS8qIFRPRE86IFNob3VsZG4ndCB0aGlzIGJlIGEgVkZMX1RZUEVfVFJBTlNQT1JUIG9yIHNvbWV0aGluZz8KIAkgKiBXZSBuZWVkIGEgVkZMX1RZUEVfVFMgZGVmaW5lZC4KQEAgLTI0NCwzOCArMjQyLDQ0IEBACiAJaWYgKHMtPnY0bDJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQltaW5vciA9IHMtPnY0bDJkZXYtPm1pbm9yOworCW51bSA9IHMtPnY0bDJkZXYtPm51bTsKKwkvKiBjYXJkIG51bWJlciArIHVzZXIgZGVmaW5lZCBvZmZzZXQgKyBkZXZpY2Ugb2Zmc2V0ICovCisJaWYgKHR5cGUgIT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfTVBHKSB7CisJCXN0cnVjdCBjeDE4X3N0cmVhbSAqc19tcGcgPSAmY3gtPnN0cmVhbXNbQ1gxOF9FTkNfU1RSRUFNX1RZUEVfTVBHXTsKKworCQlpZiAoc19tcGctPnY0bDJkZXYpCisJCQludW0gPSBzX21wZy0+djRsMmRldi0+bnVtICsgY3gxOF9zdHJlYW1faW5mb1t0eXBlXS5udW1fb2Zmc2V0OworCX0KIAogCS8qIFJlZ2lzdGVyIGRldmljZS4gRmlyc3QgdHJ5IHRoZSBkZXNpcmVkIG1pbm9yLCB0aGVuIGFueSBmcmVlIG9uZS4gKi8KLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHMtPnY0bDJkZXYsIHZmbF90eXBlLCBtaW5vcikgJiYKLQkJCXZpZGVvX3JlZ2lzdGVyX2RldmljZShzLT52NGwyZGV2LCB2ZmxfdHlwZSwgLTEpKSB7Ci0JCUNYMThfRVJSKCJDb3VsZG4ndCByZWdpc3RlciB2NGwyIGRldmljZSBmb3IgJXMgbWlub3IgJWRcbiIsCi0JCQlzLT5uYW1lLCBtaW5vcik7CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShzLT52NGwyZGV2LCB2ZmxfdHlwZSwgbnVtKSkgeworCQlDWDE4X0VSUigiQ291bGRuJ3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UgZm9yICVzIGtlcm5lbCBudW1iZXIgJWRcbiIsCisJCQlzLT5uYW1lLCBudW0pOwogCQl2aWRlb19kZXZpY2VfcmVsZWFzZShzLT52NGwyZGV2KTsKIAkJcy0+djRsMmRldiA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltaW5vciA9IHMtPnY0bDJkZXYtPm1pbm9yOworCW51bSA9IHMtPnY0bDJkZXYtPm51bTsKIAogCXN3aXRjaCAodmZsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CiAJCUNYMThfSU5GTygiUmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBmb3IgJXMgKCVkIE1CKVxuIiwKLQkJCW1pbm9yLCBzLT5uYW1lLCBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pOworCQkJbnVtLCBzLT5uYW1lLCBjeC0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pOwogCQlicmVhazsKIAogCWNhc2UgVkZMX1RZUEVfUkFESU86CiAJCUNYMThfSU5GTygiUmVnaXN0ZXJlZCBkZXZpY2UgcmFkaW8lZCBmb3IgJXNcbiIsCi0JCQltaW5vciAtIE1JTk9SX1ZGTF9UWVBFX1JBRElPX01JTiwgcy0+bmFtZSk7CisJCQludW0sIHMtPm5hbWUpOwogCQlicmVhazsKIAogCWNhc2UgVkZMX1RZUEVfVkJJOgogCQlpZiAoY3gtPm9wdGlvbnMubWVnYWJ5dGVzW3R5cGVdKQogCQkJQ1gxOF9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2YmklZCBmb3IgJXMgKCVkIE1CKVxuIiwKLQkJCQltaW5vciAtIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NSU4sCisJCQkJbnVtLAogCQkJCXMtPm5hbWUsIGN4LT5vcHRpb25zLm1lZ2FieXRlc1t0eXBlXSk7CiAJCWVsc2UKIAkJCUNYMThfSU5GTygiUmVnaXN0ZXJlZCBkZXZpY2UgdmJpJWQgZm9yICVzXG4iLAotCQkJCW1pbm9yIC0gTUlOT1JfVkZMX1RZUEVfVkJJX01JTiwgcy0+bmFtZSk7CisJCQkJbnVtLCBzLT5uYW1lKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00MzIsNyArNDM2LDYgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jcy0+YnVmZmVyc19zdG9sZW4gPSAwOwogCiAJLyogbXV0ZS91bm11dGUgdmlkZW8gKi8KIAljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX1NFVF9WSURFT19NVVRFLCAyLApAQCAtNDcwLDcgKzQ3Myw3IEBACiAKIAlpZiAoYXRvbWljX3JlYWQoJmN4LT50b3RfY2FwdHVyaW5nKSA9PSAwKSB7CiAJCWNsZWFyX2JpdChDWDE4X0ZfSV9FT1MsICZjeC0+aV9mbGFncyk7Ci0JCXdyaXRlX3JlZyg3LCBDWDE4X0RTUDBfSU5URVJSVVBUX01BU0spOworCQljeDE4X3dyaXRlX3JlZyhjeCwgNywgQ1gxOF9EU1AwX0lOVEVSUlVQVF9NQVNLKTsKIAl9CiAKIAljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1NFVF9NRExfQUNLLCAzLCBzLT5oYW5kbGUsCkBAIC00ODAsOCArNDgzLDkgQEAKIAlsaXN0X2Zvcl9lYWNoKHAsICZzLT5xX2ZyZWUubGlzdCkgewogCQlzdHJ1Y3QgY3gxOF9idWZmZXIgKmJ1ZiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGN4MThfYnVmZmVyLCBsaXN0KTsKIAotCQl3cml0ZWwoYnVmLT5kbWFfaGFuZGxlLCAmY3gtPnNjYi0+Y3B1X21kbFtidWYtPmlkXS5wYWRkcik7Ci0JCXdyaXRlbChzLT5idWZfc2l6ZSwgJmN4LT5zY2ItPmNwdV9tZGxbYnVmLT5pZF0ubGVuZ3RoKTsKKwkJY3gxOF93cml0ZWwoY3gsIGJ1Zi0+ZG1hX2hhbmRsZSwKKwkJCQkJJmN4LT5zY2ItPmNwdV9tZGxbYnVmLT5pZF0ucGFkZHIpOworCQljeDE4X3dyaXRlbChjeCwgcy0+YnVmX3NpemUsICZjeC0+c2NiLT5jcHVfbWRsW2J1Zi0+aWRdLmxlbmd0aCk7CiAJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfREVfU0VUX01ETCwgNSwgcy0+aGFuZGxlLAogCQkJKHZvaWQgX19pb21lbSAqKSZjeC0+c2NiLT5jcHVfbWRsW2J1Zi0+aWRdIC0gY3gtPmVuY19tZW0sCiAJCQkxLCBidWYtPmlkLCBzLT5idWZfc2l6ZSk7CkBAIC00ODksNyArNDkzLDE0IEBACiAJLyogYmVnaW5fY2FwdHVyZSAqLwogCWlmIChjeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0NBUFRVUkVfU1RBUlQsIDEsIHMtPmhhbmRsZSkpIHsKIAkJQ1gxOF9ERUJVR19XQVJOKCJFcnJvciBzdGFydGluZyBjYXB0dXJlIVxuIik7CisJCS8qIEVuc3VyZSB3ZSdyZSByZWFsbHkgbm90IGNhcHR1cmluZyBiZWZvcmUgcmVsZWFzaW5nIE1ETHMgKi8KKwkJaWYgKHMtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfTVBHKQorCQkJY3gxOF92YXBpKGN4LCBDWDE4X0NQVV9DQVBUVVJFX1NUT1AsIDIsIHMtPmhhbmRsZSwgMSk7CisJCWVsc2UKKwkJCWN4MThfdmFwaShjeCwgQ1gxOF9DUFVfQ0FQVFVSRV9TVE9QLCAxLCBzLT5oYW5kbGUpOworCQljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1JFTEVBU0VfTURMLCAxLCBzLT5oYW5kbGUpOwogCQljeDE4X3ZhcGkoY3gsIENYMThfREVTVFJPWV9UQVNLLCAxLCBzLT5oYW5kbGUpOworCQkvKiBGSVhNRSAtIGNsZWFuLXVwIERTUDBfSU5UIG1hc2ssIGlfZmxhZ3MsIHNfZmxhZ3MsIGV0Yy4gKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01NDEsNiArNTUyLDkgQEAKIAkJQ1gxOF9JTkZPKCJpZ25vcmluZyBnb3BfZW5kOiBub3QgKHlldD8pIHN1cHBvcnRlZCBieSB0aGUgZmlybXdhcmVcbiIpOwogCX0KIAorCS8qIFRlbGwgdGhlIENYMjM0MTggaXQgY2FuJ3QgdXNlIG91ciBidWZmZXJzIGFueW1vcmUgKi8KKwljeDE4X3ZhcGkoY3gsIENYMThfQ1BVX0RFX1JFTEVBU0VfTURMLCAxLCBzLT5oYW5kbGUpOworCiAJaWYgKHMtPnR5cGUgIT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfVFMpCiAJCWF0b21pY19kZWMoJmN4LT5hbmFfY2FwdHVyaW5nKTsKIAlhdG9taWNfZGVjKCZjeC0+dG90X2NhcHR1cmluZyk7CkBAIC01NDksMTIgKzU2MywxMiBAQAogCWNsZWFyX2JpdChDWDE4X0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKTsKIAogCWN4MThfdmFwaShjeCwgQ1gxOF9ERVNUUk9ZX1RBU0ssIDEsIHMtPmhhbmRsZSk7Ci0Jcy0+aGFuZGxlID0gMHhmZmZmZmZmZjsKKwlzLT5oYW5kbGUgPSBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEU7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmN4LT50b3RfY2FwdHVyaW5nKSA+IDApCiAJCXJldHVybiAwOwogCi0Jd3JpdGVfcmVnKDUsIENYMThfRFNQMF9JTlRFUlJVUFRfTUFTSyk7CisJY3gxOF93cml0ZV9yZWcoY3gsIDUsIENYMThfRFNQMF9JTlRFUlJVUFRfTUFTSyk7CiAJd2FrZV91cCgmcy0+d2FpdHEpOwogCiAJcmV0dXJuIDA7CkBAIC01NjgsOCArNTgyLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQ1gxOF9NQVhfU1RSRUFNUzsgaSsrKSB7CiAJCXN0cnVjdCBjeDE4X3N0cmVhbSAqcyA9ICZjeC0+c3RyZWFtc1tpXTsKIAotCQlpZiAocy0+djRsMmRldiAmJiBzLT5oYW5kbGUpCisJCWlmIChzLT52NGwyZGV2ICYmIChzLT5oYW5kbGUgIT0gQ1gxOF9JTlZBTElEX1RBU0tfSEFORExFKSkKIAkJCXJldHVybiBzLT5oYW5kbGU7CiAJfQotCXJldHVybiAwOworCXJldHVybiBDWDE4X0lOVkFMSURfVEFTS19IQU5ETEU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKaW5kZXggZDVjN2E2Zi4uOWY2YmUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBDWDE4X0RSSVZFUl9OQU1FICJjeDE4IgogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAwCisjZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAxCiAKICNkZWZpbmUgQ1gxOF9WRVJTSU9OIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IpICIuIiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX01JTk9SKSAiLiIgX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQogI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IsIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gyMzQxOC5oCmluZGV4IGU3ZWQwNTMuLjY2OGY5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MjM0MTguaApAQCAtMzUxLDcgKzM1MSw3IEBACiAgICBEZXNjcmlwdG9yIExpc3RzIHRvIHRoZSBkcml2ZXIKICAgIElOWzBdIC0gVGFzayBoYW5kbGUuIEhhbmRsZSBvZiB0aGUgdGFzayB0byBzdGFydAogICAgUmV0dXJuQ29kZSAtIE9uZSBvZiB0aGUgRVJSX0RFXy4uLiAqLwotLyogI2RlZmluZSBDWDE4X0NQVV9ERV9SZWxlYXNlTURMICAgICAgICAgICAgICAgKENQVV9DTURfTUFTS19ERSB8IDB4MDAwNikgKi8KKyNkZWZpbmUgQ1gxOF9DUFVfREVfUkVMRUFTRV9NREwgICAgICAgICAgICAgICAJKENQVV9DTURfTUFTS19ERSB8IDB4MDAwNikKIAogLyogRGVzY3JpcHRpb246IFRoaXMgY29tbWFuZCBzaWduYWxzIHRoZSBjcHUgdGhhdCB0aGUgZGF0IGJ1ZmZlciBoYXMgYmVlbgogICAgY29uc3VtZWQgYW5kIHJlYWR5IGZvciByZS11c2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM0MXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCmluZGV4IDIyODQ3YTAuLmNiYmU0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCkBAIC01MDgsNyArNTA4LDEwIEBACiAJCS8qIHRoaXMgc2V0dGluZyBpcyByZWFkLW9ubHkgZm9yIHRoZSBjeDIzNDF4IHNpbmNlIHRoZQogCQkgICBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIHJlYWxseSBkZXRlcm1pbmVzIHRoZQogCQkgICBNUEVHLTEvMiBzZXR0aW5nICovCi0JCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCQkgICBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAorCQkJCQkgICBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLCAxLAorCQkJCQkgICBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L0tjb25maWcKaW5kZXggZTYwYmQzMS4uOGMxYjdmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCkBAIC0xNSw2ICsxNSw3IEBACiAJc2VsZWN0IERWQl9TNUgxNDA5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TNUgxNDExIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MR0RUMzMwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfWkwxMDM1MyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9YQzIwMjggaWYgIURWQl9GRV9DVVNUT01JWkUKIAlzZWxlY3QgTUVESUFfVFVORVJfVERBODI5MCBpZiAhRFZCX0ZFX0NVU1RPTUlaRQogCXNlbGVjdCBNRURJQV9UVU5FUl9UREExODI3MSBpZiAhRFZCX0ZFX0NVU1RPTUlaRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwppbmRleCA3YjBlOGMwLi4zOTVjMTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPG1lZGlhL2N4MjM0MXguaD4KIAogI2luY2x1ZGUgImN4MjM4ODUuaCIKLSNpbmNsdWRlICJtZWRpYS9jeDIzNDF4LmgiCiAKICNkZWZpbmUgQ1gyMzg4NV9GSVJNX0lNQUdFX1NJWkUgMzc2ODM2CiAjZGVmaW5lIENYMjM4ODVfRklSTV9JTUFHRV9OQU1FICJ2NGwtY3gyMzg4NS1lbmMuZnciCkBAIC02MzIsNyArNjMxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBNUEVHIGVuY29kZXIgQVBJICovCi1jaGFyICpjbWRfdG9fc3RyKGludCBjbWQpCitzdGF0aWMgY2hhciAqY21kX3RvX3N0cihpbnQgY21kKQogewogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDWDIzNDFYX0VOQ19QSU5HX0ZXOgpAQCAtMTU4Myw2ICsxNTgyLDcgQEAKIAogCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAorCWxvY2tfa2VybmVsKCk7CiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmY3gyMzg4NV9kZXZsaXN0KSB7CiAJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDIzODg1X2RldiwgZGV2bGlzdCk7CiAJCWlmIChoLT52NGxfZGV2aWNlLT5taW5vciA9PSBtaW5vcikgewpAQCAtMTU5MSwxMyArMTU5MSwxNyBAQAogCQl9CiAJfQogCi0JaWYgKGRldiA9PSBOVUxMKQorCWlmIChkZXYgPT0gTlVMTCkgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCiAJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKKwlpZiAoTlVMTCA9PSBmaCkgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCWZoLT5kZXYgICAgICA9IGRldjsKQEAgLTE2MDgsNiArMTYxMiw3IEBACiAJCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAogCQkJICAgIHNpemVvZihzdHJ1Y3QgY3gyMzg4NV9idWZmZXIpLAogCQkJICAgIGZoKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCmluZGV4IGMzNmQzZjYuLjJjZGExNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2N4MjU4NDAuaD4KIAogI2luY2x1ZGUgImN4MjM4ODUuaCIKKyNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBib2FyZCBjb25maWcgaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0OCw2ICsxNDksMTUgQEAKIAkJLnBvcnRiCQk9IENYMjM4ODVfTVBFR19EVkIsCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAogCX0sCisJW0NYMjM4ODVfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMX0VYUF0gPSB7CisJCS5uYW1lCQk9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIER1YWwgRXhwcmVzcyIsCisJCS5wb3J0YgkJPSBDWDIzODg1X01QRUdfRFZCLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwl9LAorCVtDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF0gPSB7CisJCS5uYW1lCQk9ICJMZWFkdGVrIFdpbmZhc3QgUHhEVlIzMjAwIEgiLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9ib2FyZHMpOwogCkBAIC0yMTksNiArMjI5LDE0IEBACiAJCS5zdWJ2ZW5kb3IgPSAweDE4YWMsCiAJCS5zdWJkZXZpY2UgPSAweGQ2MTgsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfN19EVUFMX0VYUCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MThhYywKKwkJLnN1YmRldmljZSA9IDB4ZGI3OCwKKwkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMX0VYUCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCisJCS5zdWJkZXZpY2UgPSAweDY2ODEsCisJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSCwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2lkY291bnQgPSBBUlJBWV9TSVpFKGN4MjM4ODVfc3ViaWRzKTsKQEAgLTMxOSwxNSArMzM3LDE1IEBACiAJCQlkZXYtPm5hbWUsIHR2Lm1vZGVsKTsKIH0KIAotLyogVHVuZXIgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGN4MjM4ODUgYm9hcmRzLiBDdXJyZW50bHkgb25seSBuZWVkZWQKLSAqIGZvciBIVlIxNTAwUSwgd2hpY2ggaGFzIGFuIHhjNTAwMCB0dW5lci4KLSAqLwotaW50IGN4MjM4ODVfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbW1hbmQsIGludCBhcmcpCitpbnQgY3gyMzg4NV90dW5lcl9jYWxsYmFjayh2b2lkICpwcml2LCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZykKIHsKLQlzdHJ1Y3QgY3gyMzg4NV9pMmMgKmJ1cyA9IHByaXY7Ci0Jc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBidXMtPmRldjsKKwlzdHJ1Y3QgY3gyMzg4NV90c3BvcnQgKnBvcnQgPSBwcml2OworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gcG9ydC0+ZGV2OwogCXUzMiBiaXRtYXNrID0gMDsKIAorCWlmIChjb21tYW5kID09IFhDMjAyOF9SRVNFVF9DTEspCisJCXJldHVybiAwOworCiAJaWYgKGNvbW1hbmQgIT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzKCk6IFVua25vd24gY29tbWFuZCAweCV4LlxuIiwKIAkJCV9fZnVuY19fLCBjb21tYW5kKTsKQEAgLTMzNSwyMSArMzUzLDIxIEBACiAJfQogCiAJc3dpdGNoKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNTAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTUwMFE6Ci0JCS8qIFR1bmVyIFJlc2V0IENvbW1hbmQgZnJvbSB4YzUwMDAgKi8KLQkJaWYgKGNvbW1hbmQgPT0gMCkKLQkJCWJpdG1hc2sgPSAweDA0OworCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CisJCS8qIFR1bmVyIFJlc2V0IENvbW1hbmQgKi8KKwkJYml0bWFzayA9IDB4MDQ7CiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWXzdfRFVBTF9FWFA6Ci0JCWlmIChjb21tYW5kID09IDApIHsKLQotCQkJLyogVHdvIGlkZW50aWNhbCB0dW5lcnMgb24gdHdvIGRpZmZlcmVudCBpMmMgYnVzZXMsCi0JCQkgKiB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjb3JyZWN0IGdwaW8uICovCi0JCQlpZiAoYnVzLT5uciA9PSAwKQotCQkJCWJpdG1hc2sgPSAweDAxOwotCQkJZWxzZSBpZiAoYnVzLT5uciA9PSAxKQotCQkJCWJpdG1hc2sgPSAweDA0OwotCQl9CisJY2FzZSBDWDIzODg1X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTF9FWFA6CisJCS8qIFR3byBpZGVudGljYWwgdHVuZXJzIG9uIHR3byBkaWZmZXJlbnQgaTJjIGJ1c2VzLAorCQkgKiB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjb3JyZWN0IGdwaW8uICovCisJCWlmIChwb3J0LT5uciA9PSAwKQorCQkJYml0bWFzayA9IDB4MDE7CisJCWVsc2UgaWYgKHBvcnQtPm5yID09IDEpCisJCQliaXRtYXNrID0gMHgwNDsKIAkJYnJlYWs7CiAJfQogCkBAIC00NjUsNiArNDgzLDMyIEBACiAJCW1kZWxheSgyMCk7CiAJCWN4X3NldChHUDBfSU8sIDB4MDAwZjAwMGYpOwogCQlicmVhazsKKwljYXNlIENYMjM4ODVfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMX0VYUDoKKwkJLyogR1BJTy0wIHBvcnRiIHhjMzAyOCByZXNldCAqLworCQkvKiBHUElPLTEgcG9ydGIgemwxMDM1MyByZXNldCAqLworCQkvKiBHUElPLTIgcG9ydGMgeGMzMDI4IHJlc2V0ICovCisJCS8qIEdQSU8tMyBwb3J0YyB6bDEwMzUzIHJlc2V0ICovCisKKwkJLyogUHV0IHRoZSBwYXJ0cyBpbnRvIHJlc2V0IGFuZCBiYWNrICovCisJCWN4X3NldChHUDBfSU8sIDB4MDAwZjAwMDApOworCQltZGVsYXkoMjApOworCQljeF9jbGVhcihHUDBfSU8sIDB4MDAwMDAwMGYpOworCQltZGVsYXkoMjApOworCQljeF9zZXQoR1AwX0lPLCAweDAwMGYwMDBmKTsKKwkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwkJLyogR1BJTy0yICB4YzMwMjggdHVuZXIgcmVzZXQgKi8KKworCQkvKiBUaGUgZm9sbG93aW5nIEdQSU8ncyBhcmUgb24gdGhlIGludGVybmFsIEFWQ29yZSAoY3gyNTg0MCkgKi8KKwkJLyogR1BJTy0/ICB6bDEwMzUzIGRlbW9kIHJlc2V0ICovCisKKwkJLyogUHV0IHRoZSBwYXJ0cyBpbnRvIHJlc2V0IGFuZCBiYWNrICovCisJCWN4X3NldChHUDBfSU8sIDB4MDAwNDAwMDApOworCQltZGVsYXkoMjApOworCQljeF9jbGVhcihHUDBfSU8sIDB4MDAwMDAwMDQpOworCQltZGVsYXkoMjApOworCQljeF9zZXQoR1AwX0lPLCAweDAwMDQwMDA0KTsKKwkJYnJlYWs7CiAJfQogfQogCkBAIC00NzksNiArNTIzLDkgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6CiAJCS8qIEZJWE1FOiBJbXBsZW1lbnQgbWUgKi8KIAkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfRFVBTF9FWFA6CisJCXJlcXVlc3RfbW9kdWxlKCJpci1rYmQtaTJjIik7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpAQCAtNTE2LDYgKzU2Myw3IEBACiAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIENYMjM4ODVfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl83X0RVQUxfRVhQOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUxfRVhQOgogCQl0czItPmdlbl9jdHJsX3ZhbCAgPSAweGM7IC8qIFNlcmlhbCBidXMgKyBwdW5jdHVyZWQgY2xvY2sgKi8KIAkJdHMyLT50c19jbGtfZW5fdmFsID0gMHgxOyAvKiBFbmFibGUgVFNfQ0xLICovCiAJCXRzMi0+c3JjX3NlbF92YWwgICA9IENYMjM4ODVfU1JDX1NFTF9QQVJBTExFTF9NUEVHX1ZJREVPOwpAQCAtNTQ4LDYgKzU5Niw3IEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTcwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKIAlkZWZhdWx0OgogCQl0czItPmdlbl9jdHJsX3ZhbCAgPSAweGM7IC8qIFNlcmlhbCBidXMgKyBwdW5jdHVyZWQgY2xvY2sgKi8KIAkJdHMyLT50c19jbGtfZW5fdmFsID0gMHgxOyAvKiBFbmFibGUgVFNfQ0xLICovCkBAIC01NjEsNiArNjEwLDcgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODAwbHA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNzAwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CiAJCXJlcXVlc3RfbW9kdWxlKCJjeDI1ODQwIik7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwppbmRleCAyNWZiMDk5Li5iZWIzZTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCkBAIC0xNDQyLDcgKzE0NDIsNyBAQAogCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gcG9ydC0+ZGV2OwogCXN0cnVjdCBjeDIzODg1X2RtYXF1ZXVlICpxID0gJnBvcnQtPm1wZWdxOwogCi0JZHByaW50aygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAJZGVsX3RpbWVyX3N5bmMoJnEtPnRpbWVvdXQpOwogCWN4MjM4ODVfc3RvcF9kbWEocG9ydCk7CiAJZG9fY2FuY2VsX2J1ZmZlcnMocG9ydCwgImNhbmNlbCIsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwppbmRleCAyOTFiOWQwLi4yNGJkMTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgInR1bmVyLXNpbXBsZS5oIgogI2luY2x1ZGUgImRpYjcwMDBwLmgiCiAjaW5jbHVkZSAiZGlieDAwMF9jb21tb24uaCIKKyNpbmNsdWRlICJ6bDEwMzUzLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7CiAKQEAgLTE4OCwxMyArMTg5LDExIEBACiBzdGF0aWMgc3RydWN0IHhjNTAwMF9jb25maWcgaGF1cHBhdWdlX2h2cjE1MDBxX3R1bmVyY29uZmlnID0gewogCS5pMmNfYWRkcmVzcyAgICAgID0gMHg2MSwKIAkuaWZfa2h6ICAgICAgICAgICA9IDUzODAsCi0JLnR1bmVyX2NhbGxiYWNrICAgPSBjeDIzODg1X3R1bmVyX2NhbGxiYWNrCiB9OwogCiBzdGF0aWMgc3RydWN0IHhjNTAwMF9jb25maWcgZHZpY29feGM1MDAwX3R1bmVyY29uZmlnID0gewogCS5pMmNfYWRkcmVzcyAgICAgID0gMHg2NCwKIAkuaWZfa2h6ICAgICAgICAgICA9IDUzODAsCi0JLnR1bmVyX2NhbGxiYWNrICAgPSBjeDIzODg1X3R1bmVyX2NhbGxiYWNrCiB9OwogCiBzdGF0aWMgc3RydWN0IHRkYTgyOXhfY29uZmlnIHRkYTgyOXhfbm9fcHJvYmUgPSB7CkBAIC0zMDMsMzUgKzMwMiwxMSBAQAogCS5vdXRwdXRfbW9kZSA9IE9VVE1PREVfTVBFRzJfU0VSSUFMLAogfTsKIAotc3RhdGljIGludCBjeDIzODg1X2h2cjE1MDBfeGMzMDI4X2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbW1hbmQsIGludCBhcmcpCi17Ci0Jc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0ID0gcHRyOwotCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gcG9ydC0+ZGV2OwotCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBYQzIwMjhfVFVORVJfUkVTRVQ6Ci0JCS8qIFNlbmQgdGhlIHR1bmVyIGluIHRoZW4gb3V0IG9mIHJlc2V0ICovCi0JCS8qIEdQSU8tMiB4YzMwMjggdHVuZXIgKi8KLQkJZHByaW50aygxLCAiJXM6IFhDMjAyOF9UVU5FUl9SRVNFVCAlZFxuIiwgX19mdW5jX18sIGFyZyk7Ci0KLQkJY3hfc2V0KEdQMF9JTywgMHgwMDA0MDAwMCk7Ci0JCWN4X2NsZWFyKEdQMF9JTywgMHgwMDAwMDAwNCk7Ci0JCW1zbGVlcCg1KTsKLQotCQljeF9zZXQoR1AwX0lPLCAweDAwMDQwMDA0KTsKLQkJbXNsZWVwKDUpOwotCQlicmVhazsKLQljYXNlIFhDMjAyOF9SRVNFVF9DTEs6Ci0JCWRwcmludGsoMSwgIiVzOiBYQzIwMjhfUkVTRVRfQ0xLICVkXG4iLCBfX2Z1bmNfXywgYXJnKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZHByaW50aygxLCAiJXM6IHVua25vd24gY29tbWFuZCAlZCwgYXJnICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNvbW1hbmQsIGFyZyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQorc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X3hjMzAyOCA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCisJLmlmMiAgICAgICAgICAgPSA0NTYwMCwKKwkubm9fdHVuZXIgICAgICA9IDEsCit9OwogCiBzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3gyMzg4NV90c3BvcnQgKnBvcnQpCiB7CkBAIC00MTMsOCArMzg4LDggQEAKIAkJCQkJCSZkZXYtPmkyY19idXNbMF0uaTJjX2FkYXApOwogCQlpZiAocG9ydC0+ZHZiLmZyb250ZW5kICE9IE5VTEwpCiAJCQlkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIHBvcnQtPmR2Yi5mcm9udGVuZCwKLQkJCQkmaTJjX2J1cy0+aTJjX2FkYXAsCi0JCQkJJmhhdXBwYXVnZV9odnIxNTAwcV90dW5lcmNvbmZpZywgaTJjX2J1cyk7CisJCQkJICAgJmkyY19idXMtPmkyY19hZGFwLAorCQkJCSAgICZoYXVwcGF1Z2VfaHZyMTUwMHFfdHVuZXJjb25maWcpOwogCQlicmVhazsKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDA6CiAJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzWzFdOwpAQCAtNDI2LDEwICs0MDEsOSBAQAogCQkJc3RydWN0IHhjMjAyOF9jb25maWcgY2ZnID0gewogCQkJCS5pMmNfYWRhcCAgPSAmaTJjX2J1cy0+aTJjX2FkYXAsCiAJCQkJLmkyY19hZGRyICA9IDB4NjEsCi0JCQkJLmNhbGxiYWNrICA9IGN4MjM4ODVfaHZyMTUwMF94YzMwMjhfY2FsbGJhY2ssCiAJCQl9OwogCQkJc3RhdGljIHN0cnVjdCB4YzIwMjhfY3RybCBjdGwgPSB7Ci0JCQkJLmZuYW1lICAgICAgID0gInhjMzAyOC12MjcuZnciLAorCQkJCS5mbmFtZSAgICAgICA9IFhDMjAyOF9ERUZBVUxUX0ZJUk1XQVJFLAogCQkJCS5tYXhfbGVuICAgICA9IDY0LAogCQkJCS5zY29kZV90YWJsZSA9IFhDMzAyOF9GRV9PUkVONTM4LAogCQkJfTsKQEAgLTQ2NSwxMyArNDM5LDEzIEBACiAJCQlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmcgPSB7CiAJCQkJLmkyY19hZGFwICA9ICZkZXYtPmkyY19idXNbMV0uaTJjX2FkYXAsCiAJCQkJLmkyY19hZGRyICA9IDB4NjQsCi0JCQkJLmNhbGxiYWNrICA9IGN4MjM4ODVfaHZyMTUwMF94YzMwMjhfY2FsbGJhY2ssCiAJCQl9OwogCQkJc3RhdGljIHN0cnVjdCB4YzIwMjhfY3RybCBjdGwgPSB7Ci0JCQkJLmZuYW1lICAgPSAieGMzMDI4TC12MzYuZnciLAorCQkJCS5mbmFtZSAgID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFLAogCQkJCS5tYXhfbGVuID0gNjQsCiAJCQkJLmRlbW9kICAgPSA1MDAwLAotCQkJCS5kMjYzMyAgID0gMQorCQkJCS8qIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGRlbW9kcyB3aXRoIHYzNiBmaXJtd2FyZT8gKi8KKwkJCQkudHlwZSAgICA9IFhDMjAyOF9EMjYzMywKIAkJCX07CiAKIAkJCWZlID0gZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLApAQCAtNDkyLDggKzQ2Niw1NyBAQAogCQkJCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CiAJCWlmIChwb3J0LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkKIAkJCWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgcG9ydC0+ZHZiLmZyb250ZW5kLAotCQkJCSZpMmNfYnVzLT5pMmNfYWRhcCwKLQkJCQkmZHZpY29feGM1MDAwX3R1bmVyY29uZmlnLCBpMmNfYnVzKTsKKwkJCQkgICAmaTJjX2J1cy0+aTJjX2FkYXAsCisJCQkJICAgJmR2aWNvX3hjNTAwMF90dW5lcmNvbmZpZyk7CisJCWJyZWFrOworCWNhc2UgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUxfRVhQOiB7CisJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzW3BvcnQtPm5yIC0gMV07CisKKwkJcG9ydC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICAgICAgICZkdmljb19mdXNpb25oZHR2X3hjMzAyOCwKKwkJCQkJICAgICAgICZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCWlmIChwb3J0LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJc3RydWN0IGR2Yl9mcm9udGVuZCAgICAgICpmZTsKKwkJCXN0cnVjdCB4YzIwMjhfY29uZmlnCSAgY2ZnID0geworCQkJCS5pMmNfYWRhcCAgPSAmaTJjX2J1cy0+aTJjX2FkYXAsCisJCQkJLmkyY19hZGRyICA9IDB4NjEsCisJCQl9OworCQkJc3RhdGljIHN0cnVjdCB4YzIwMjhfY3RybCBjdGwgPSB7CisJCQkJLmZuYW1lICAgICAgID0gWEMyMDI4X0RFRkFVTFRfRklSTVdBUkUsCisJCQkJLm1heF9sZW4gICAgID0gNjQsCisJCQkJLmRlbW9kICAgICAgID0gWEMzMDI4X0ZFX1pBUkxJTks0NTYsCisJCQl9OworCisJCQlmZSA9IGR2Yl9hdHRhY2goeGMyMDI4X2F0dGFjaCwgcG9ydC0+ZHZiLmZyb250ZW5kLAorCQkJCQkmY2ZnKTsKKwkJCWlmIChmZSAhPSBOVUxMICYmIGZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcgIT0gTlVMTCkKKwkJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfY29uZmlnKGZlLCAmY3RsKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwkJaTJjX2J1cyA9ICZkZXYtPmkyY19idXNbMF07CisKKwkJcG9ydC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCSZkdmljb19mdXNpb25oZHR2X3hjMzAyOCwKKwkJCSZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCWlmIChwb3J0LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJc3RydWN0IGR2Yl9mcm9udGVuZCAgICAgICpmZTsKKwkJCXN0cnVjdCB4YzIwMjhfY29uZmlnCSAgY2ZnID0geworCQkJCS5pMmNfYWRhcCAgPSAmZGV2LT5pMmNfYnVzWzFdLmkyY19hZGFwLAorCQkJCS5pMmNfYWRkciAgPSAweDYxLAorCQkJfTsKKwkJCXN0YXRpYyBzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsID0geworCQkJCS5mbmFtZSAgICAgICA9IFhDMjAyOF9ERUZBVUxUX0ZJUk1XQVJFLAorCQkJCS5tYXhfbGVuICAgICA9IDY0LAorCQkJCS5kZW1vZCAgICAgICA9IFhDMzAyOF9GRV9aQVJMSU5LNDU2LAorCQkJfTsKKworCQkJZmUgPSBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIHBvcnQtPmR2Yi5mcm9udGVuZCwKKwkJCQkmY2ZnKTsKKwkJCWlmIChmZSAhPSBOVUxMICYmIGZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcgIT0gTlVMTCkKKwkJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfY29uZmlnKGZlLCAmY3RsKTsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCkBAIC01MDQsNiArNTI3LDggQEAKIAkJcHJpbnRrKCIlczogZnJvbnRlbmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQorCS8qIGRlZmluZSBnZW5lcmFsLXB1cnBvc2UgY2FsbGJhY2sgcG9pbnRlciAqLworCXBvcnQtPmR2Yi5mcm9udGVuZC0+Y2FsbGJhY2sgPSBjeDIzODg1X3R1bmVyX2NhbGxiYWNrOwogCiAJLyogUHV0IHRoZSBhbmFsb2cgZGVjb2RlciBpbiBzdGFuZGJ5IHRvIGtlZXAgaXQgcXVpZXQgKi8KIAljeDIzODg1X2NhbGxfaTJjX2NsaWVudHMoaTJjX2J1cywgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12YmkuYwppbmRleCAzNWU2MWNkLi41YjI5N2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12YmkuYwpAQCAtODUsMTggKzg1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGN4MjM4ODVfc3RvcF92YmlfZG1hKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQotewotCS8qIHN0b3AgZG1hICovCi0JY3hfY2xlYXIoVklEX0FfRE1BX0NUTCwgMHgwMDAwMDAyMik7CiAKLQkvKiBkaXNhYmxlIGlycXMgKi8KLQljeF9jbGVhcihQQ0lfSU5UX01TSywgMHgwMDAwMDEpOwotCWN4X2NsZWFyKFZJRF9BX0lOVF9NU0ssIDB4MDAwMDAwMjIpOwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShzdHJ1Y3QgY3gyMzg4NV9kZXYgICAgKmRldiwKK3N0YXRpYyBpbnQgY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShzdHJ1Y3QgY3gyMzg4NV9kZXYgICAgKmRldiwKIAkJCSAgICAgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEpCiB7CiAJc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwppbmRleCA2MDQ3Yzc4Li5mNzVlZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogfTsKIHN0YXRpYyBjb25zdCBpbnQgQ1gyMzg4NV9DVExTID0gQVJSQVlfU0laRShjeDIzODg1X2N0bHMpOwogCi1jb25zdCB1MzIgY3gyMzg4NV91c2VyX2N0cmxzW10gPSB7CitzdGF0aWMgY29uc3QgdTMyIGN4MjM4ODVfdXNlcl9jdHJsc1tdID0gewogCVY0TDJfQ0lEX1VTRVJfQ0xBU1MsCiAJVjRMMl9DSURfQlJJR0hUTkVTUywKIAlWNEwyX0NJRF9DT05UUkFTVCwKQEAgLTI1NCwxNCArMjU0LDEzIEBACiAJVjRMMl9DSURfQVVESU9fTVVURSwKIAkwCiB9OwotRVhQT1JUX1NZTUJPTChjeDIzODg1X3VzZXJfY3RybHMpOwogCiBzdGF0aWMgY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXSA9IHsKIAljeDIzODg1X3VzZXJfY3RybHMsCiAJTlVMTAogfTsKIAotdm9pZCBjeDIzODg1X3ZpZGVvX3dha2V1cChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKK3N0YXRpYyB2b2lkIGN4MjM4ODVfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAogCQkgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKIHsKIAlzdHJ1Y3QgY3gyMzg4NV9idWZmZXIgKmJ1ZjsKQEAgLTI5Niw3ICsyOTUsNyBAQAogCQkJX19mdW5jX18sIGJjKTsKIH0KIAotaW50IGN4MjM4ODVfc2V0X3R2bm9ybShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdjRsMl9zdGRfaWQgbm9ybSkKK3N0YXRpYyBpbnQgY3gyMzg4NV9zZXRfdHZub3JtKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB2NGwyX3N0ZF9pZCBub3JtKQogewogCWRwcmludGsoMSwgIiVzKG5vcm0gPSAweCUwOHgpIG5hbWU6IFslc11cbiIsCiAJCV9fZnVuY19fLApAQCAtMzE0LDcgKzMxMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCB2aWRlb19kZXZpY2UgKmN4MjM4ODVfdmRldl9pbml0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAorc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgKmN4MjM4ODVfdmRldl9pbml0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCSAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKIAkJCQkgICAgY2hhciAqdHlwZSkKQEAgLTMzNCw3ICszMzMsNyBAQAogCXJldHVybiB2ZmQ7CiB9CiAKLWludCBjeDIzODg1X2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3N0YXRpYyBpbnQgY3gyMzg4NV9jdHJsX3F1ZXJ5KHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCiB7CiAJaW50IGk7CiAKQEAgLTM1MSw3ICszNTAsNiBAQAogCSpxY3RybCA9IGN4MjM4ODVfY3Rsc1tpXS52OwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjeDIzODg1X2N0cmxfcXVlcnkpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MDIsNyArNDAwLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiB9CiAKLWludCBjeDIzODg1X3ZpZGVvX211eChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQorc3RhdGljIGludCBjeDIzODg1X3ZpZGVvX211eChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQogewogCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CiAJbWVtc2V0KCZyb3V0ZSwgMCwgc2l6ZW9mKHJvdXRlKSk7CkBAIC00MjIsMTAgKzQyMCw5IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY3gyMzg4NV92aWRlb19tdXgpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWludCBjeDIzODg1X3NldF9zY2FsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IHdpZHRoLAorc3RhdGljIGludCBjeDIzODg1X3NldF9zY2FsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IHdpZHRoLAogCXVuc2lnbmVkIGludCBoZWlnaHQsIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKIHsKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CkBAIC03MzEsNiArNzI4LDcgQEAKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CiAJaW50IHJhZGlvID0gMDsKIAorCWxvY2tfa2VybmVsKCk7CiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmY3gyMzg4NV9kZXZsaXN0KSB7CiAJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDIzODg1X2RldiwgZGV2bGlzdCk7CiAJCWlmIChoLT52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSB7CkBAIC03NDgsMTYgKzc0NiwyMCBAQAogCQkJZGV2ICAgPSBoOwogCQl9CiAJfQotCWlmIChOVUxMID09IGRldikKKwlpZiAoTlVMTCA9PSBkZXYpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlkcHJpbnRrKDEsICJvcGVuIG1pbm9yPSVkIHJhZGlvPSVkIHR5cGU9JXNcbiIsCiAJCW1pbm9yLCByYWRpbywgdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKIAogCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCiAJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKKwlpZiAoTlVMTCA9PSBmaCkgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CiAJZmgtPnJhZGlvICAgID0gcmFkaW87CkBAIC03NzUsNiArNzc3LDcgQEAKIAogCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKIAorCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiAwOwogfQpAQCAtODg0LDIxICs4ODcsMTkgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogVklERU8gQ1RSTCBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLWludCBjeDIzODg1X2dldF9jb250cm9sKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCitzdGF0aWMgaW50IGN4MjM4ODVfZ2V0X2NvbnRyb2woc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKIAlkcHJpbnRrKDEsICIlcygpIGNhbGxpbmcgY3gyNTg0MChWSURJT0NfR19DVFJMKVxuIiwgX19mdW5jX18pOwogCWN4MjM4ODVfY2FsbF9pMmNfY2xpZW50cygmZGV2LT5pMmNfYnVzWzJdLCBWSURJT0NfR19DVFJMLCBjdGwpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjeDIzODg1X2dldF9jb250cm9sKTsKIAotaW50IGN4MjM4ODVfc2V0X2NvbnRyb2woc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3N0YXRpYyBpbnQgY3gyMzg4NV9zZXRfY29udHJvbChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKQogewogCWRwcmludGsoMSwgIiVzKCkgY2FsbGluZyBjeDI1ODQwKFZJRElPQ19TX0NUUkwpIgogCQkiIChkaXNhYmxlZCAtIG5vIGFjdGlvbilcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY3gyMzg4NV9zZXRfY29udHJvbCk7CiAKIHN0YXRpYyB2b2lkIGluaXRfY29udHJvbHMoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCiB7CkBAIC0xMTQ2LDcgKzExNDcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY3gyMzg4NV9lbnVtX2lucHV0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKK3N0YXRpYyBpbnQgY3gyMzg4NV9lbnVtX2lucHV0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKIAkJW0NYMjM4ODVfVk1VWF9DT01QT1NJVEUxXSA9ICJDb21wb3NpdGUxIiwKQEAgLTExNzksNyArMTE4MCw2IEBACiAJCWktPnN0ZCA9IENYMjM4ODVfTk9STVM7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGN4MjM4ODVfZW51bV9pbnB1dCk7CiAKIHN0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfaW5wdXQgKmkpCkBAIC0xMjg4LDcgKzEyODgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY3gyMzg4NV9zZXRfZnJlcShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQorc3RhdGljIGludCBjeDIzODg1X3NldF9mcmVxKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCiB7CiAJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTMwNyw3ICsxMzA3LDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjeDIzODg1X3NldF9mcmVxKTsKIAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggZTIzZDk3YzAuLmJhNGUwYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaApAQCAtNjQsNiArNjQsOCBAQAogI2RlZmluZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNzAwICAgICAgICA4CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDAgICAgICAgIDkKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWXzdfRFVBTF9FWFAgMTAKKyNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUxfRVhQIDExCisjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IIDEyCiAKIC8qIEN1cnJlbnRseSB1bnN1cHBvcnRlZCBieSB0aGUgZHJpdmVyOiBQQUwvSCwgTlRTQy9LciwgU0VDQU0gQi9HL0gvTEMgKi8KICNkZWZpbmUgQ1gyMzg4NV9OT1JNUyAoXApAQCAtNDA5LDcgKzQxMSw3IEBACiBleHRlcm4gc3RydWN0IGN4MjM4ODVfc3ViaWQgY3gyMzg4NV9zdWJpZHNbXTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgY3gyMzg4NV9pZGNvdW50OwogCi1leHRlcm4gaW50IGN4MjM4ODVfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbW1hbmQsIGludCBhcmcpOworZXh0ZXJuIGludCBjeDIzODg1X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKIGV4dGVybiB2b2lkIGN4MjM4ODVfY2FyZF9saXN0KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKIGV4dGVybiBpbnQgIGN4MjM4ODVfaXJfaW5pdChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBjeDIzODg1X2dwaW9fc2V0dXAoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwppbmRleCA2OWYyYmJkLi41OGU2ZWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwpAQCAtMTQxLDEwICsxNDEsMTEgQEAKIAkJdTggbGNyWzI0XTsKIAogCQlmbXQgPSBhcmc7Ci0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUpCisJCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgJiYKKwkJICAgIGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXN2YmkgPSAmZm10LT5mbXQuc2xpY2VkOwotCQlpZiAoc3ZiaS0+c2VydmljZV9zZXQgPT0gMCkgeworCQlpZiAoZm10LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUpIHsKIAkJCS8qIHJhdyBWQkkgKi8KIAkJCW1lbXNldChzdmJpLCAwLCBzaXplb2YoKnN2YmkpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwppbmRleCA5ZGQ3YmRmLi4wYjllNWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwpAQCAtNTgsNiArNTgsMTAgQEAKIAlzZWxlY3QgRFZCX0lTTDY0MjEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfU0lNUExFIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TNUgxNDExIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9DWDI0MTE2IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVFYwMjg4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEI2MDAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQi9BVFNDIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQ29uZXhhbnQgMjM4OHggY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggOWExMzc0YS4uZTcxMzY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTEwNTcsMTIgKzEwNTcsMTUgQEAKIAlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2ID0gTlVMTDsKIAlpbnQgZXJyOwogCisJbG9ja19rZXJuZWwoKTsKIAlkZXYgPSBjeDg4MDJfZ2V0X2RldmljZShpbm9kZSk7CiAKIAlkcHJpbnRrKCAxLCAiJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAkvKiBNYWtlIHN1cmUgd2UgY2FuIGFjcXVpcmUgdGhlIGhhcmR3YXJlICovCiAJZHJ2ID0gY3g4ODAyX2dldF9kcml2ZXIoZGV2LCBDWDg4X01QRUdfQkxBQ0tCSVJEKTsKQEAgLTEwNzAsNiArMTA3Myw3IEBACiAJCWVyciA9IGRydi0+cmVxdWVzdF9hY3F1aXJlKGRydik7CiAJCWlmKGVyciAhPSAwKSB7CiAJCQlkcHJpbnRrKDEsIiVzOiBVbmFibGUgdG8gYWNxdWlyZSBoYXJkd2FyZSwgJWRcbiIsIF9fZnVuY19fLCBlcnIpOworCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTEwNzcsNiArMTA4MSw3IEBACiAJaWYgKGJsYWNrYmlyZF9pbml0aWFsaXplX2NvZGVjKGRldikgPCAwKSB7CiAJCWlmIChkcnYpCiAJCQlkcnYtPnJlcXVlc3RfcmVsZWFzZShkcnYpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkcHJpbnRrKDEsIm9wZW4gbWlub3I9JWRcbiIsbWlub3IpOwpAQCAtMTA4Niw2ICsxMDkxLDcgQEAKIAlpZiAoTlVMTCA9PSBmaCkgewogCQlpZiAoZHJ2KQogCQkJZHJ2LT5yZXF1ZXN0X3JlbGVhc2UoZHJ2KTsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CkBAIC0xMTAxLDYgKzExMDcsNyBAQAogCS8qIEZJWE1FOiBsb2NraW5nIGFnYWluc3Qgb3RoZXIgdmlkZW8gZGV2aWNlICovCiAJY3g4OF9zZXRfc2NhbGUoZGV2LT5jb3JlLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwKIAkJCWZoLT5tcGVncS5maWVsZCk7CisJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCBkZTE5OWEyLi41ZGEwNGU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCkBAIC0xMzQ5LDI3ICsxMzQ5LDMwIEBACiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuYXVkaW9fY2hpcCAgICAgPSBWNEwyX0lERU5UX1dNODc3NSwKKwkJLyoKKwkJICogZ3BpbzAgYXMgcmVwb3J0ZWQgYnkgTWlrZSBDcmFzaCA8bWlrZSBBVCBtaWtlY3Jhc2guY29tPgorCQkgKi8KIAkJLmlucHV0CQk9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKLQkJCS5ncGlvMAk9IDB4ZTc4MCwKKwkJCS5ncGlvMAk9IDB4ZWY4OCwKIAkJCS5hdWRpb3JvdXRlID0gMSwKIAkJfSx7CiAJCQkudHlwZQk9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXgJPSAxLAotCQkJLmdwaW8wCT0gMHhlNzgwLAorCQkJLmdwaW8wCT0gMHhlZjg4LAogCQkJLmF1ZGlvcm91dGUgPSAyLAogCQl9LHsKIAkJCS50eXBlCT0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4CT0gMiwKLQkJCS5ncGlvMAk9IDB4ZTc4MCwKKwkJCS5ncGlvMAk9IDB4ZWY4OCwKIAkJCS5hdWRpb3JvdXRlID0gMiwKIAkJfX0sCiAJCS8qIGZpeG1lOiBBZGQgcmFkaW8gc3VwcG9ydCAqLwogCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCIHwgQ1g4OF9NUEVHX0JMQUNLQklSRCwKIAkJLnJhZGlvID0gewogCQkJLnR5cGUgICA9IENYODhfUkFESU8sCi0JCQkuZ3BpbzAJPSAweGU3ODAsCisJCQkuZ3BpbzAJPSAweGVmODgsCiAJCX0sCiAJfSwKIAlbQ1g4OF9CT0FSRF9BRFNURUNIX1BUVl8zOTBdID0gewpAQCAtMTQ0NiwxNSArMTQ0OSwyNiBAQAogCQkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgSHlicmlkIFBDVFYiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9YQzIwMjgsCiAJCS50dW5lcl9hZGRyICAgICA9IDB4NjEsCisJCS5yYWRpb190eXBlICAgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnJhZGlvX2FkZHIgICAgID0gMHg2MSwKIAkJLmlucHV0ICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwNGZmLAorCQkJLmdwaW8xICA9IDB4MDEwZmYsCisJCQkuZ3BpbzIgID0gMHgwMDAwMSwKIAkJfSwgewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwMDRmYiwKKwkJCS5ncGlvMSAgPSAweDAxMGVmLAorCQkJLmF1ZGlvcm91dGUgPSAxLAogCQl9LCB7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4MDA0ZmIsCisJCQkuZ3BpbzEgID0gMHgwMTBlZiwKKwkJCS5hdWRpb3JvdXRlID0gMSwKIAkJfSB9LAogCQkucmFkaW8gPSB7CiAJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKQEAgLTE0NjIsNiArMTQ3Niw3IEBACiAJCQkuZ3BpbzEgID0gMHgwMTBmZiwKIAkJCS5ncGlvMiAgPSAweDBmZiwKIAkJfSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAogCVtDWDg4X0JPQVJEX1dJTkZBU1RfVFYyMDAwX1hQX0dMT0JBTF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJXaW5mYXN0IFRWMjAwMCBYUCBHbG9iYWwiLApAQCAtMTU2Niw5ICsxNTgxLDkgQEAKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfUFJPXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgUFJPIiwKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBYWFg6IEhhcyBYQzMwMjggKi8KKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfYWRkciAgICAgPSAweDYxLAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKLQkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKIAkJLmlucHV0ICAgICAgICAgID0geyB7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCkBAIC0xNjI1LDYgKzE2NDAsMzYgQEAKIAkJCS5ncGlvMiA9IDB4MGNmYiwKIAkJfSwKIAl9LAorCVtDWDg4X0JPQVJEX1BST0xJTktfUFZfR0xPQkFMX1hUUkVNRV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQcm9saW5rIFBpeGVsdmlldyBHbG9iYWwgRXh0cmVtZSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2FkZHIgICAgID0gMHg2MSwKKwkJLmlucHV0ICAgICAgICAgID0geyB7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCA9IDB4MDRmYiwKKwkJCS5ncGlvMSA9IDB4MDQwODAsCisJCQkuZ3BpbzIgPSAweDBjZjcsCisJCX0sIHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wID0gMHgwNGZiLAorCQkJLmdwaW8xID0gMHgwNDA4MCwKKwkJCS5ncGlvMiA9IDB4MGNmYiwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCA9IDB4MDRmYiwKKwkJCS5ncGlvMSA9IDB4MDQwODAsCisJCQkuZ3BpbzIgPSAweDBjZmIsCisJCX0gfSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUgICA9IENYODhfUkFESU8sCisJCQkuZ3BpbzAgPSAweDA0ZmYsCisJCQkuZ3BpbzEgPSAweDA0MDgwLAorCQkJLmdwaW8yID0gMHgwY2Y3LAorCQl9LAorCX0sCiAJLyogQm90aCByYWRpbywgYW5hbG9nIGFuZCBBVFNDIHdvcmsgd2l0aCB0aGlzIGJvYXJkLgogCSAgIEhvd2V2ZXIsIGZvciBhbmFsb2cgdG8gd29yaywgczVoMTQwOSBnYXRlIHNob3VsZCBiZSBvcGVuLAogCSAgIG90aGVyd2lzZSwgdHVuZXIteGMzMDI4IHdvbid0IGJlIGRldGVjdGVkLgpAQCAtMTY2NCw2ICsxNzA5LDEzMSBAQAogCQl9LAogCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAogCX0sCisJW0NYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDBdID0geworCQkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWLUhWUjQwMDAgRFZCLVMvUzIvVC9IeWJyaWQiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS8qCisJCSAqIEdQSU8wIChXSU5UVjIwMDApCisJCSAqCisJCSAqIEFuYWxvZ3VlICAgICBTQVQgICAgIERWQi1UCisJCSAqIEFudGVubmEgICAgICAweGM0YmYgIDB4YzRiYgorCQkgKiBDb21wb3NpdGUgICAgMHhjNGJmICAweGM0YmIKKwkJICogUy1WaWRlbyAgICAgIDB4YzRiZiAgMHhjNGJiCisJCSAqIENvbXBvc2l0ZTEgICAweGM0ZmYgIDB4YzRmYgorCQkgKiBTLVZpZGVvMSAgICAgMHhjNGZmICAweGM0ZmIKKwkJICoKKwkJICogQklUICBWQUxVRSAgIEZVTkNUSU9OIEdQe3h9X0lPCisJCSAqIDAgICAgMSAgICAgICBJOj8KKwkJICogMSAgICAxICAgICAgIEk6PworCQkgKiAyICAgIDEgICAgICAgTzpEVkItVCBERU1PRCBFTkFCTEUgTE9XL0FOQUxPRyBERU1PRCBFTkFCTEUgSElHSAorCQkgKiAzICAgIDEgICAgICAgSTo/CisJCSAqIDQgICAgMSAgICAgICBJOj8KKwkJICogNSAgICAxICAgICAgIEk6PworCQkgKiA2ICAgIDAgICAgICAgTzpJTlBVVCBTRUxFQ1RPUiAwPUlOVEVSTkFMIDE9RVhQQU5TSU9OCisJCSAqIDcgICAgMSAgICAgICBPOkRWQi1UIERFTU9EIFJFU0VUIExPVworCQkgKgorCQkgKiBCSVQgIFZBTFVFICAgRlVOQ1RJT04gR1B7eH1fT0UKKwkJICogOCAgICAwICAgICAgIEkKKwkJICogOSAgICAwICAgICAgIEkKKwkJICogYSAgICAxICAgICAgIE8KKwkJICogYiAgICAwICAgICAgIEkKKwkJICogYyAgICAwICAgICAgIEkKKwkJICogZCAgICAwICAgICAgIEkKKwkJICogZSAgICAxICAgICAgIE8KKwkJICogZiAgICAxICAgICAgIE8KKwkJICovCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweGM0YmYsCisJCX0sIHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4YzRiZiwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweGM0YmYsCisJCX0gfSwKKwkJLyogZml4bWU6IEFkZCByYWRpbyBzdXBwb3J0ICovCisJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCisJfSwKKwlbQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMExJVEVdID0geworCQkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWLUhWUjQwMDAoTGl0ZSkgRFZCLVMvUzIiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKwkJCS52bXV4ICAgPSAwLAorCQl9IH0sCisJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCisJfSwKKwlbQ1g4OF9CT0FSRF9URVZJSV9TNDIwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRlVmlpIFM0MjAgRFZCLVMiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKwkJCS52bXV4ICAgPSAwLAorCQl9IH0sCisJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCisJfSwKKwlbQ1g4OF9CT0FSRF9URVZJSV9TNDYwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRlVmlpIFM0NjAgRFZCLVMvUzIiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKwkJCS52bXV4ICAgPSAwLAorCQl9IH0sCisJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCisJfSwKKwlbQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJPbWljb20gU1M0IERWQi1TL1MyIFBDSSIsCisJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfRFZCLAorCQkJLnZtdXggICA9IDAsCisJCX0gfSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKKwl9LAorCVtDWDg4X0JPQVJEX1RCU184OTIwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlRCUyA4OTIwIERWQi1TL1MyIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfRFZCLAorCQkJLnZtdXggICA9IDEsCisJCX0gfSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKKwl9LAorCVtDWDg4X0JPQVJEX1BST0ZfNzMwMF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQUk9GIDczMDAgRFZCLVMvUzIiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKKwkJCS52bXV4ICAgPSAwLAorCQl9IH0sCisJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCisJfSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjAxMCw5ICsyMTgwLDUzIEBACiAJCS5zdWJkZXZpY2UgPSAweDQ5MzUsCiAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BST0xJTktfUFZfODAwMEdULAogCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MTU1NCwKKwkJLnN1YmRldmljZSA9IDB4NDk3NiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfUFJPTElOS19QVl9HTE9CQUxfWFRSRU1FLAorCX0sIHsKIAkJLnN1YnZlbmRvciA9IDB4MTdkZSwKIAkJLnN1YmRldmljZSA9IDB4MDhjMSwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfS1dPUkxEX0FUU0NfMTIwLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4NjkwMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDAsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHg2OTA0LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDY5MDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4NjkwNSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDBMSVRFLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4NjkwNiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDBMSVRFLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4ZDQyMCwKKwkJLnN1YmRldmljZSA9IDB4OTAyMiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfVEVWSUlfUzQyMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweGQ0NjAsCisJCS5zdWJkZXZpY2UgPSAweDkwMjIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1RFVklJX1M0NjAsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHhBMDQ0LAorCQkuc3ViZGV2aWNlID0gMHgyMDExLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSSwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDg5MjAsCisJCS5zdWJkZXZpY2UgPSAweDg4ODgsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1RCU184OTIwLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4QjAzMywKKwkJLnN1YmRldmljZSA9IDB4MzAzMywKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfUFJPRl83MzAwLAogCX0sCiB9OwogCkBAIC0yMDY1LDYgKzIyNzksMTMgQEAKIAljYXNlIDE0NjY5OiAvKiBXaW5UVi1IVlIzMDAwIChPRU0sIG5vIElSLCBubyBiL3BhbmVsIHZpZGVvIC0gTG93IHByb2ZpbGUpICovCiAJY2FzZSAyODU1MjogLyogV2luVFYtUFZSICdSb3NseW4nIChObyBJUikgKi8KIAljYXNlIDM0NTE5OiAvKiBXaW5UVi1QQ0ktRk0gKi8KKwljYXNlIDY5MDA5OgorCQkvKiBXaW5UVi1IVlI0MDAwIChEVkJTL1MyL1QsIFZpZGVvIGFuZCBJUiwgYmFjayBwYW5lbCBpbnB1dHMpICovCisJY2FzZSA2OTEwMDogLyogV2luVFYtSFZSNDAwMExJVEUgKERWQlMvUzIsIElSKSAqLworCWNhc2UgNjk1MDA6IC8qIFdpblRWLUhWUjQwMDBMSVRFIChEVkJTL1MyLCBObyBJUikgKi8KKwljYXNlIDY5NTU5OgorCQkvKiBXaW5UVi1IVlI0MDAwIChEVkJTL1MyL1QsIFZpZGVvIG5vIElSLCBiYWNrIHBhbmVsIGlucHV0cykgKi8KKwljYXNlIDY5NTY5OiAvKiBXaW5UVi1IVlI0MDAwIChEVkJTL1MyL1QsIFZpZGVvIG5vIElSKSAqLwogCWNhc2UgOTAwMDI6IC8qIE5vdmEtVC1QQ0kgKDkwMDIpICovCiAJY2FzZSA5MjAwMTogLyogTm92YS1TLVBsdXMgKFZpZGVvIGFuZCBJUikgKi8KIAljYXNlIDkyMDAyOiAvKiBOb3ZhLVMtUGx1cyAoVmlkZW8gYW5kIElSKSAqLwpAQCAtMjE0OSw5ICsyMzcwLDIxIEBACiB7CiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBYQzIwMjhfVFVORVJfUkVTRVQ6Ci0JCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgxMDEwMDApOwotCQltZGVsYXkoNSk7Ci0JCWN4X3NldChNT19HUDBfSU8sIDB4MTAxMDEwKTsKKwkJc3dpdGNoIChjb3JlLT5ib2FyZG5yKSB7CisJCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfUENJX05BTk86CisJCQkvKiBHUElPLTQgeGMzMDI4IHR1bmVyICovCisKKwkJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDEwMDApOworCQkJY3hfY2xlYXIoTU9fR1AwX0lPLCAweDAwMDAwMDEwKTsKKwkJCW1zbGVlcCgxMDApOworCQkJY3hfc2V0KE1PX0dQMF9JTywgMHgwMDAwMDAxMCk7CisJCQltc2xlZXAoMTAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3hfd3JpdGUoTU9fR1AwX0lPLCAweDEwMTAwMCk7CisJCQltZGVsYXkoNSk7CisJCQljeF9zZXQoTU9fR1AwX0lPLCAweDEwMTAxMCk7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjU4LDggKzI0OTEsMTAgQEAKIAkJcmV0dXJuIGN4ODhfeGMzMDI4X2dlbmlhdGVjaF90dW5lcl9jYWxsYmFjayhjb3JlLAogCQkJCQkJCWNvbW1hbmQsIGFyZyk7CiAJY2FzZSBDWDg4X0JPQVJEX1BST0xJTktfUFZfODAwMEdUOgorCWNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BWX0dMT0JBTF9YVFJFTUU6CiAJCXJldHVybiBjeDg4X3B2XzgwMDBndF9jYWxsYmFjayhjb3JlLCBjb21tYW5kLCBhcmcpOwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BSTzoKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X1BDSV9OQU5POgogCQlyZXR1cm4gY3g4OF9kdmljb194YzIwMjhfY2FsbGJhY2soY29yZSwgY29tbWFuZCwgYXJnKTsKIAl9CiAKQEAgLTIzMjcsNyArMjU2Miw3IEBACiAJcmV0dXJuIDA7IC8qIFNob3VsZCBuZXZlciBiZSBoZXJlICovCiB9CiAKLWludCBjeDg4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21tYW5kLCBpbnQgYXJnKQoraW50IGN4ODhfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCiB7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICppMmNfYWxnbyA9IHByaXY7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKQEAgLTIzNDQsNiArMjU3OSw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChjb21wb25lbnQgIT0gRFZCX0ZST05URU5EX0NPTVBPTkVOVF9UVU5FUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzd2l0Y2ggKGNvcmUtPmJvYXJkLnR1bmVyX3R5cGUpIHsKIAkJY2FzZSBUVU5FUl9YQzIwMjg6CiAJCQlpbmZvX3ByaW50ayhjb3JlLCAiQ2FsbGluZyBYQzIwMjgvMzAyOCBjYWxsYmFja1xuIik7CkBAIC0yMzkyLDE2ICsyNjMwLDIyIEBACiB7CiAJc3dpdGNoIChjb3JlLT5ib2FyZG5yKSB7CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgotCQkvKiBCcmluZyB0aGUgNzAyIGRlbW9kIHVwIGJlZm9yZSBpMmMgc2Nhbm5pbmcvYXR0YWNoIG9yIGRldmljZXMgYXJlIGhpZGRlbiAqLwotCQkvKiBXZSBsZWF2ZSBoZXJlIHdpdGggdGhlIDcwMiBvbiB0aGUgYnVzICovCi0JCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwZTc4MCk7CisJCS8qCisJCSAqIEJyaW5nIHRoZSA3MDIgZGVtb2QgdXAgYmVmb3JlIGkyYyBzY2FubmluZy9hdHRhY2ggb3IgZGV2aWNlcyBhcmUgaGlkZGVuCisJCSAqIFdlIGxlYXZlIGhlcmUgd2l0aCB0aGUgNzAyIG9uIHRoZSBidXMKKwkJICoKKwkJICogInJlc2V0IHRoZSBJUiByZWNlaXZlciBvbiBHUElPWzNdIgorCQkgKiBSZXBvcnRlZCBieSBNaWtlIENyYXNoIDxtaWtlIEFUIG1pa2VjcmFzaC5jb20+CisJCSAqLworCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwMGVmODgpOwogCQl1ZGVsYXkoMTAwMCk7Ci0JCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDA4MCk7CisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDA4OCk7CiAJCXVkZWxheSg1MCk7Ci0JCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDAwODApOyAvKiA3MDIgb3V0IG9mIHJlc2V0ICovCisJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDAwODgpOyAvKiA3MDIgb3V0IG9mIHJlc2V0ICovCiAJCXVkZWxheSgxMDAwKTsKIAkJYnJlYWs7CiAKKwljYXNlIENYODhfQk9BUkRfUFJPTElOS19QVl9HTE9CQUxfWFRSRU1FOgogCWNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BWXzgwMDBHVDoKIAkJY3hfd3JpdGUoTU9fR1AyX0lPLCAweGNmNyk7CiAJCW1kZWxheSg1MCk7CkBAIC0yNDExLDEwICsyNjU1LDE4IEBACiAJCW1zbGVlcCgxMCk7CiAJCWJyZWFrOwogCi0JIGNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzdfR09MRDoKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl83X0dPTEQ6CiAJCS8qIEVuYWJsZSB0aGUgeGM1MDAwIHR1bmVyICovCiAJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDEwMTApOwogCQlicmVhazsKKworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwTElURToKKwkJLyogSW5pdCBHUElPICovCisJCWN4X3dyaXRlKE1PX0dQMF9JTywgY29yZS0+Ym9hcmQuaW5wdXRbMF0uZ3BpbzApOworCQl1ZGVsYXkoMTAwMCk7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtMjQzNSwxNyArMjY4NywyMiBAQAogCQkJY29yZS0+aTJjX2FsZ28udWRlbGF5ID0gMTY7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BSTzoKLQkJY3RsLT5zY29kZV90YWJsZSA9IFhDMzAyOF9GRV9aQVJMSU5LNDU2OworCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX1pBUkxJTks0NTY7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfQVRTQ18xMjA6CiAJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9QQ0lfTkFOTzoKIAkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9PUkVONTM4OwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfUFJPTElOS19QVl9HTE9CQUxfWFRSRU1FOgogCWNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BWXzgwMDBHVDoKIAkJLyoKLQkJICogVGhpcyBib2FyZCB1c2VzIG5vbi1NVFMgZmlybXdhcmUKKwkJICogVGhvc2UgYm9hcmRzIHVzZXMgbm9uLU1UUyBmaXJtd2FyZQogCQkgKi8KIAkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1BJTk5BQ0xFX0hZQlJJRF9QQ1RWOgorCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX1pBUkxJTks0NTY7CisJCWN0bC0+bXRzID0gMTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9PUkVONTM4OwogCQljdGwtPm10cyA9IDE7CkBAIC0yNDg5LDYgKzI3NDYsOCBAQAogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjEzMDA6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMExJVEU6CiAJCWlmICgwID09IGNvcmUtPmkyY19yYykKIAkJCWhhdXBwYXVnZV9lZXByb20oY29yZSwgZWVwcm9tKTsKIAkJYnJlYWs7CkBAIC0yNTcwLDcgKzI4MjksMTggQEAKIAkJdGVhNTc2N19jZmcucHJpdiAgPSAmY3RsOwogCiAJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhjb3JlLCBUVU5FUl9TRVRfQ09ORklHLCAmdGVhNTc2N19jZmcpOworCQlicmVhazsKIAl9CisJY2FzZSAgQ1g4OF9CT0FSRF9URVZJSV9TNDIwOgorCWNhc2UgIENYODhfQk9BUkRfVEVWSUlfUzQ2MDoKKwljYXNlICBDWDg4X0JPQVJEX09NSUNPTV9TUzRfUENJOgorCWNhc2UgIENYODhfQk9BUkRfVEJTXzg5MjA6CisJY2FzZSAgQ1g4OF9CT0FSRF9QUk9GXzczMDA6CisJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOworCQltc2xlZXAoMTAwKTsKKwkJY3hfd3JpdGUoTU9fU1JTVF9JTywgMSk7CisJCW1zbGVlcCgxMDApOworCQlicmVhazsKIAl9IC8qZW5kIHN3aXRjaCgpICovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwppbmRleCBkOTYxNzNmLi4zNDRlZDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwpAQCAtNDgsNiArNDgsMTEgQEAKICNpbmNsdWRlICJ0dW5lci1zaW1wbGUuaCIKICNpbmNsdWRlICJ0ZGE5ODg3LmgiCiAjaW5jbHVkZSAiczVoMTQxMS5oIgorI2luY2x1ZGUgInN0djAyOTkuaCIKKyNpbmNsdWRlICJ6MDE5NGEuaCIKKyNpbmNsdWRlICJzdHYwMjg4LmgiCisjaW5jbHVkZSAic3RiNjAwMC5oIgorI2luY2x1ZGUgImN4MjQxMTYuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOwpAQCAtMzc1LDM3ICszODAsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeDg4X3BjaV9uYW5vX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbW1hbmQsIGludCBhcmcpCitzdGF0aWMgaW50IHRldmlpX2R2YnNfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICAgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQogewotCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBwdHI7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBYQzIwMjhfVFVORVJfUkVTRVQ6Ci0JCS8qIFNlbmQgdGhlIHR1bmVyIGluIHRoZW4gb3V0IG9mIHJlc2V0ICovCi0JCWRwcmludGsoMSwgIiVzOiBYQzIwMjhfVFVORVJfUkVTRVQgJWRcbiIsIF9fZnVuY19fLCBhcmcpOwotCi0JCXN3aXRjaCAoY29yZS0+Ym9hcmRucikgewotCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X1BDSV9OQU5POgotCQkJLyogR1BJTy00IHhjMzAyOCB0dW5lciAqLwotCi0JCQljeF9zZXQoTU9fR1AwX0lPLCAweDAwMDAxMDAwKTsKLQkJCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDAxMCk7Ci0JCQltc2xlZXAoMTAwKTsKLQkJCWN4X3NldChNT19HUDBfSU8sIDB4MDAwMDAwMTApOwotCQkJbXNsZWVwKDEwMCk7CisJc3dpdGNoICh2b2x0YWdlKSB7CisJCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCQlwcmludGsoIkxOQiBWb2x0YWdlIFNFQ19WT0xUQUdFXzEzXG4iKTsKKwkJCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwNjA0MCk7CiAJCQlicmVhazsKLQkJfQotCi0JCWJyZWFrOwotCWNhc2UgWEMyMDI4X1JFU0VUX0NMSzoKLQkJZHByaW50aygxLCAiJXM6IFhDMjAyOF9SRVNFVF9DTEsgJWRcbiIsIF9fZnVuY19fLCBhcmcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkcHJpbnRrKDEsICIlczogdW5rbm93biBjb21tYW5kICVkLCBhcmcgJWRcbiIsIF9fZnVuY19fLAotCQkJY29tbWFuZCwgYXJnKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCQlwcmludGsoIkxOQiBWb2x0YWdlIFNFQ19WT0xUQUdFXzE4XG4iKTsKKwkJCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwNjA2MCk7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6CisJCQlwcmludGsoIkxOQiBWb2x0YWdlIFNFQ19WT0xUQUdFX29mZlxuIik7CisJCQlicmVhazsKIAl9CiAKKwlpZiAoY29yZS0+cHJldl9zZXRfdm9sdGFnZSkKKwkJcmV0dXJuIGNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOwogCXJldHVybiAwOwogfQogCkBAIC00NTYsNyArNDUyLDEyIEBACiBzdGF0aWMgc3RydWN0IHhjNTAwMF9jb25maWcgcGlubmFjbGVfcGN0dl9oZF84MDBpX3R1bmVyX2NvbmZpZyA9IHsKIAkuaTJjX2FkZHJlc3MJPSAweDY0LAogCS5pZl9raHoJCT0gNTM4MCwKLQkudHVuZXJfY2FsbGJhY2sJPSBjeDg4X3R1bmVyX2NhbGxiYWNrLAorfTsKKworc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBjeDg4X3Bpbm5hY2xlX2h5YnJpZF9wY3R2ID0geworCS5kZW1vZF9hZGRyZXNzID0gKDB4MWUgPj4gMSksCisJLm5vX3R1bmVyICAgICAgPSAxLAorCS5pZjIgICAgICAgICAgID0gNDU2MDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIGN4ODhfZ2VuaWF0ZWNoX3g4MDAwX210ID0gewpAQCAtNDc3LDcgKzQ3OCw2IEBACiBzdGF0aWMgc3RydWN0IHhjNTAwMF9jb25maWcgZHZpY29fZnVzaW9uaGR0djdfdHVuZXJfY29uZmlnID0gewogCS5pMmNfYWRkcmVzcyAgICA9IDB4YzIgPj4gMSwKIAkuaWZfa2h6ICAgICAgICAgPSA1MzgwLAotCS50dW5lcl9jYWxsYmFjayA9IGN4ODhfdHVuZXJfY2FsbGJhY2ssCiB9OwogCiBzdGF0aWMgaW50IGF0dGFjaF94YzMwMjgodTggYWRkciwgc3RydWN0IGN4ODgwMl9kZXYgKmRldikKQEAgLTQ4OCw3ICs0ODgsNiBAQAogCQkuaTJjX2FkYXAgID0gJmRldi0+Y29yZS0+aTJjX2FkYXAsCiAJCS5pMmNfYWRkciAgPSBhZGRyLAogCQkuY3RybCAgICAgID0gJmN0bCwKLQkJLmNhbGxiYWNrICA9IGN4ODhfdHVuZXJfY2FsbGJhY2ssCiAJfTsKIAogCWlmICghZGV2LT5kdmIuZnJvbnRlbmQpIHsKQEAgLTUxOCw2ICs1MTcsNjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeDI0MTE2X3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlpbnQgaXNfcHVuY3R1cmVkKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCWRldi0+dHNfZ2VuX2NudHJsID0gMHgyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3gyNDExNl9yZXNldF9kZXZpY2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCS8qIFJlc2V0IHRoZSBwYXJ0ICovCisJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7CisJbXNsZWVwKDEwKTsKKwljeF93cml0ZShNT19TUlNUX0lPLCAxKTsKKwltc2xlZXAoMTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3gyNDExNl9jb25maWcgaGF1cHBhdWdlX2h2cjQwMDBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzICAgICAgICAgID0gMHgwNSwKKwkuc2V0X3RzX3BhcmFtcyAgICAgICAgICA9IGN4MjQxMTZfc2V0X3RzX3BhcmFtLAorCS5yZXNldF9kZXZpY2UgICAgICAgICAgID0gY3gyNDExNl9yZXNldF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IGN4MjQxMTZfY29uZmlnIHRldmlpX3M0NjBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKKwkuc2V0X3RzX3BhcmFtcyA9IGN4MjQxMTZfc2V0X3RzX3BhcmFtLAorCS5yZXNldF9kZXZpY2UgID0gY3gyNDExNl9yZXNldF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IHN0djAyOTlfY29uZmlnIHRldmlpX3R1bmVyX3NoYXJwX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCisJLmluaXR0YWIgPSBzaGFycF96MDE5NGFfX2luaXR0YWIsCisJLm1jbGsgPSA4ODAwMDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5za2lwX3JlaW5pdCA9IDAsCisJLmxvY2tfb3V0cHV0ID0gMSwKKwkudm9sdDEzX29wMF9vcDEgPSBTVFYwMjk5X1ZPTFQxM19PUDEsCisJLm1pbl9kZWxheV9tcyA9IDEwMCwKKwkuc2V0X3N5bWJvbF9yYXRlID0gc2hhcnBfejAxOTRhX19zZXRfc3ltYm9sX3JhdGUsCisJLnNldF90c19wYXJhbXMgPSBjeDI0MTE2X3NldF90c19wYXJhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI4OF9jb25maWcgdGV2aWlfdHVuZXJfZWFyZGFfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKKwkubWluX2RlbGF5X21zID0gMTAwLAorCS5zZXRfdHNfcGFyYW1zID0gY3gyNDExNl9zZXRfdHNfcGFyYW0sCit9OworCiBzdGF0aWMgaW50IGR2Yl9yZWdpc3RlcihzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC03ODYsNyArODM5LDcgQEAKIAkJCQkJICAgICAgICZjb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewogCQkJaWYgKCFkdmJfYXR0YWNoKGlzbDY0MjFfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwKLQkJCQkJJmNvcmUtPmkyY19hZGFwLCAweDA4LCAweDAwLCAweDAwKSkKKwkJCQkJJmNvcmUtPmkyY19hZGFwLCAweDA4LCBJU0w2NDIxX0RDTCwgMHgwMCkpCiAJCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJCX0KIAkJYnJlYWs7CkBAIC04MTMsMTMgKzg2Niw5IEBACiAJCQkJCSAgICAgICAmcGlubmFjbGVfcGN0dl9oZF84MDBpX2NvbmZpZywKIAkJCQkJICAgICAgICZjb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7Ci0JCQkvKiB0dW5lcl9jb25maWcudmlkZW9fZGV2IG11c3QgcG9pbnQgdG8KLQkJCSAqIGkyY19hZGFwLmFsZ29fZGF0YQotCQkJICovCiAJCQlpZiAoIWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCiAJCQkJCSZjb3JlLT5pMmNfYWRhcCwKLQkJCQkJJnBpbm5hY2xlX3BjdHZfaGRfODAwaV90dW5lcl9jb25maWcsCi0JCQkJCWNvcmUtPmkyY19hZGFwLmFsZ29fZGF0YSkpCisJCQkJCSZwaW5uYWNsZV9wY3R2X2hkXzgwMGlfdHVuZXJfY29uZmlnKSkKIAkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKIAkJfQogCQlicmVhazsKQEAgLTgzMiwxMCArODgxLDkgQEAKIAkJCXN0cnVjdCB4YzIwMjhfY29uZmlnIGNmZyA9IHsKIAkJCQkuaTJjX2FkYXAgID0gJmNvcmUtPmkyY19hZGFwLAogCQkJCS5pMmNfYWRkciAgPSAweDYxLAotCQkJCS5jYWxsYmFjayAgPSBjeDg4X3BjaV9uYW5vX2NhbGxiYWNrLAogCQkJfTsKIAkJCXN0YXRpYyBzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsID0gewotCQkJCS5mbmFtZSAgICAgICA9ICJ4YzMwMjgtdjI3LmZ3IiwKKwkJCQkuZm5hbWUgICAgICAgPSBYQzIwMjhfREVGQVVMVF9GSVJNV0FSRSwKIAkJCQkubWF4X2xlbiAgICAgPSA2NCwKIAkJCQkuc2NvZGVfdGFibGUgPSBYQzMwMjhfRkVfT1JFTjUzOCwKIAkJCX07CkBAIC04NDgsMTAgKzg5NiwxMyBAQAogCQlicmVhazsKIAkgY2FzZSBDWDg4X0JPQVJEX1BJTk5BQ0xFX0hZQlJJRF9QQ1RWOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCi0JCQkJCSAgICAgICAmY3g4OF9nZW5pYXRlY2hfeDgwMDBfbXQsCisJCQkJCSAgICAgICAmY3g4OF9waW5uYWNsZV9oeWJyaWRfcGN0diwKIAkJCQkJICAgICAgICZjb3JlLT5pMmNfYWRhcCk7Ci0JCWlmIChhdHRhY2hfeGMzMDI4KDB4NjEsIGRldikgPCAwKQotCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKwkJCWlmIChhdHRhY2hfeGMzMDI4KDB4NjEsIGRldikgPCAwKQorCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQl9CiAJCWJyZWFrOwogCSBjYXNlIENYODhfQk9BUkRfR0VOSUFURUNIX1g4MDAwX01UOgogCQlkZXYtPnRzX2dlbl9jbnRybCA9IDB4MDA7CkBAIC04NzQsMTYgKzkyNSw2OSBAQAogCQkJCQkgICAgICAgJmR2aWNvX2Z1c2lvbmhkdHY3X2NvbmZpZywKIAkJCQkJICAgICAgICZjb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7Ci0JCQkvKiB0dW5lcl9jb25maWcudmlkZW9fZGV2IG11c3QgcG9pbnQgdG8KLQkJCSAqIGkyY19hZGFwLmFsZ29fZGF0YQotCQkJICovCiAJCQlpZiAoIWR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCiAJCQkJCSZjb3JlLT5pMmNfYWRhcCwKLQkJCQkJJmR2aWNvX2Z1c2lvbmhkdHY3X3R1bmVyX2NvbmZpZywKLQkJCQkJY29yZS0+aTJjX2FkYXAuYWxnb19kYXRhKSkKKwkJCQkJJmR2aWNvX2Z1c2lvbmhkdHY3X3R1bmVyX2NvbmZpZykpCiAJCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMExJVEU6CisJCS8qIFN1cHBvcnQgZm9yIERWQi1TIG9ubHksIG5vdCBEVkItVCBzdXBwb3J0ICovCisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwKKwkJCSZoYXVwcGF1Z2VfaHZyNDAwMF9jb25maWcsCisJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZHZiX2F0dGFjaChpc2w2NDIxX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCisJCQkJJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJMHgwOCwgSVNMNjQyMV9EQ0wsIDB4MDApOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9URVZJSV9TNDIwOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goc3R2MDI5OV9hdHRhY2gsCisJCQkJCQkmdGV2aWlfdHVuZXJfc2hhcnBfY29uZmlnLAorCQkJCQkJJmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWlmICghZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjAsCisJCQkJCSZjb3JlLT5pMmNfYWRhcCwgRFZCX1BMTF9PUEVSQTEpKQorCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQkJY29yZS0+cHJldl9zZXRfdm9sdGFnZSA9IGRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2U7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gdGV2aWlfZHZic19zZXRfdm9sdGFnZTsKKworCQl9IGVsc2UgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHN0djAyODhfYXR0YWNoLAorCQkJCQkJCSAgICAmdGV2aWlfdHVuZXJfZWFyZGFfY29uZmlnLAorCQkJCQkJCSAgICAmY29yZS0+aTJjX2FkYXApOworCQkJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQkJCWlmICghZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJCQkmY29yZS0+aTJjX2FkYXApKQorCQkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKKwkJCQljb3JlLT5wcmV2X3NldF92b2x0YWdlID0gZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZTsKKwkJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gdGV2aWlfZHZic19zZXRfdm9sdGFnZTsKKworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9URVZJSV9TNDYwOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsCisJCQkJCSAgICAgICAmdGV2aWlfczQ2MF9jb25maWcsCisJCQkJCSAgICAgICAmY29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJY29yZS0+cHJldl9zZXRfdm9sdGFnZSA9IGRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2U7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gdGV2aWlfZHZic19zZXRfdm9sdGFnZTsKKwkJfQorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfT01JQ09NX1NTNF9QQ0k6CisJY2FzZSBDWDg4X0JPQVJEX1RCU184OTIwOgorCWNhc2UgQ1g4OF9CT0FSRF9QUk9GXzczMDA6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwKKwkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyNDAwMF9jb25maWcsCisJCQkJCSAgICAgICAmY29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJY29yZS0+cHJldl9zZXRfdm9sdGFnZSA9IGRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2U7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gdGV2aWlfZHZic19zZXRfdm9sdGFnZTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQgaXNuJ3Qgc3VwcG9ydGVkIHlldFxuIiwKIAkJICAgICAgIGNvcmUtPm5hbWUpOwpAQCAtODk1LDYgKzk5OSw4IEBACiAJCSAgICAgICBjb3JlLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCS8qIGRlZmluZSBnZW5lcmFsLXB1cnBvc2UgY2FsbGJhY2sgcG9pbnRlciAqLworCWRldi0+ZHZiLmZyb250ZW5kLT5jYWxsYmFjayA9IGN4ODhfdHVuZXJfY2FsbGJhY2s7CiAKIAkvKiBFbnN1cmUgYWxsIGZyb250ZW5kcyBuZWdvdGlhdGUgYnVzIGFjY2VzcyAqLwogCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHNfYnVzX2N0cmwgPSBjeDg4X2R2Yl9idXNfY3RybDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggZDc0MDZhOS4uOGU3NGQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTIwMSw3ICsyMDEsMjMgQEAKIAogCWNvcmUtPmkyY19yYyA9IGkyY19iaXRfYWRkX2J1cygmY29yZS0+aTJjX2FkYXApOwogCWlmICgwID09IGNvcmUtPmkyY19yYykgeworCQlzdGF0aWMgdTggdHVuZXJfZGF0YVtdID0KKwkJCXsgMHgwYiwgMHhkYywgMHg4NiwgMHg1MiB9OworCQlzdGF0aWMgc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0KKwkJCXsgLmZsYWdzID0gMCwgLmFkZHIgPSAweGMyID4+IDEsIC5idWYgPSB0dW5lcl9kYXRhLCAubGVuID0gNCB9OworCiAJCWRwcmludGsoMSwgImkyYyByZWdpc3RlciBva1xuIik7CisJCXN3aXRjaCggY29yZS0+Ym9hcmRuciApIHsKKwkJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTMwMDoKKwkJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKKwkJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMDoKKwkJCQlwcmludGsoIiVzOiBpMmMgaW5pdDogZW5hYmxpbmcgYW5hbG9nIGRlbW9kIG9uIEhWUjEzMDAvMzAwMC80MDAwIHR1bmVyXG4iLAorCQkJCQljb3JlLT5uYW1lKTsKKwkJCQlpMmNfdHJhbnNmZXIoY29yZS0+aTJjX2NsaWVudC5hZGFwdGVyLCAmdHVuZXJfbXNnLCAxKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KIAkJaWYgKGkyY19zY2FuKQogCQkJZG9faTJjX3NjYW4oY29yZS0+bmFtZSwmY29yZS0+aTJjX2NsaWVudCk7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwppbmRleCA1MzUyNmQ5Li44NjgzZDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKQEAgLTIyNCw2ICsyMjQsOCBAQAogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDA6CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMExJVEU6CiAJCWlyX2NvZGVzID0gaXJfY29kZXNfaGF1cHBhdWdlX25ldzsKIAkJaXJfdHlwZSA9IElSX1RZUEVfUkM1OwogCQlpci0+c2FtcGxpbmcgPSAxOwpAQCAtMjU5LDYgKzI2MSw3IEBACiAJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX1BST0xJTktfUFZfODAwMEdUOgorCWNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BWX0dMT0JBTF9YVFJFTUU6CiAJCWlyX2NvZGVzID0gaXJfY29kZXNfcGl4ZWx2aWV3X25ldzsKIAkJaXItPmdwaW9fYWRkciA9IE1PX0dQMV9JTzsKIAkJaXItPm1hc2tfa2V5Y29kZSA9IDB4M2Y7CkBAIC0zOTIsNyArMzk1LDcgQEAKIHsKIAlzdHJ1Y3QgY3g4OF9JUiAqaXIgPSBjb3JlLT5pcjsKIAl1MzIgc2FtcGxlcywgaXJjb2RlOwotCWludCBpOworCWludCBpLCBzdGFydCwgcmFuZ2UsIHRvZ2dsZSwgZGV2LCBjb2RlOwogCiAJaWYgKE5VTEwgPT0gaXIpCiAJCXJldHVybjsKQEAgLTQ2MSw2ICs0NjQsMzQgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDA6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMDoKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjQwMDBMSVRFOgorCQlpcmNvZGUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgNSwgNyk7CisJCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIsIGlyY29kZSk7CisJCS8qCisJCSAqIFJDNSBoYXMgYW4gZXh0ZW5zaW9uIGJpdCB3aGljaCBhZGRzIGEgbmV3IHJhbmdlCisJCSAqIG9mIGF2YWlsYWJsZSBjb2RlcywgdGhpcyBpcyBkZXRlY3RlZCBoZXJlLiBBbHNvCisJCSAqIGhhdXBwYXVnZSByZW1vdGVzIChibGFjay9zaWx2ZXIpIGFsd2F5cyB1c2UKKwkJICogc3BlY2lmaWMgZGV2aWNlIGlkcy4gSWYgd2UgZG8gbm90IGZpbHRlciB0aGUKKwkJICogZGV2aWNlIGlkcyB0aGVuIG1lc3NhZ2VzIGRlc3RpbmVkIGZvciBkZXZpY2VzCisJCSAqIHN1Y2ggYXMgVFZzIChpZD0wKSB3aWxsIGdldCB0aHJvdWdoIHRvIHRoZQorCQkgKiBkZXZpY2UgY2F1c2luZyBtaXMtZmlyZWQgZXZlbnRzLgorCQkgKi8KKwkJLyogc3BsaXQgcmM1IGRhdGEgYmxvY2sgLi4uICovCisJCXN0YXJ0ID0gKGlyY29kZSAmIDB4MjAwMCkgPj4gMTM7CisJCXJhbmdlID0gKGlyY29kZSAmIDB4MTAwMCkgPj4gMTI7CisJCXRvZ2dsZT0gKGlyY29kZSAmIDB4MDgwMCkgPj4gMTE7CisJCWRldiAgID0gKGlyY29kZSAmIDB4MDdjMCkgPj4gNjsKKwkJY29kZSAgPSAoaXJjb2RlICYgMHgwMDNmKSB8ICgocmFuZ2UgPDwgNikgXiAweDAwNDApOworCQlpZiggc3RhcnQgIT0gMSkKKwkJCS8qIG5vIGtleSBwcmVzc2VkICovCisJCQlicmVhazsKKwkJaWYgKCBkZXYgIT0gMHgxZSAmJiBkZXYgIT0gMHgxZiApCisJCQkvKiBub3QgYSBoYXVwcGF1Z2UgcmVtb3RlICovCisJCQlicmVhazsKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+aW5wdXQsICZpci0+aXIsIGNvZGUsIGlyY29kZSk7CisJCWlyLT5yZWxlYXNlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTIwKTsKKwkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX1BJTk5BQ0xFX1BDVFZfSERfODAwaToKIAkJaXJjb2RlID0gaXJfZGVjb2RlX2JpcGhhc2UoaXItPnNhbXBsZXMsIGlyLT5zY291bnQsIDUsIDcpOwogCQlpcl9kcHJpbnRrKCJiaXBoYXNlIGRlY29kZWQ6ICV4XG4iLCBpcmNvZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKaW5kZXggZWY0ZDU2ZS4uYmU0NTk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCkBAIC03NzMsNiArNzczLDcgQEAKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CiAJaW50IHJhZGlvID0gMDsKIAorCWxvY2tfa2VybmVsKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmY3g4ODAwX2Rldmxpc3QsIGRldmxpc3QpIHsKIAkJaWYgKGgtPnZpZGVvX2Rldi0+bWlub3IgPT0gbWlub3IpIHsKIAkJCWRldiAgPSBoOwpAQCAtNzg4LDggKzc4OSwxMCBAQAogCQkJZGV2ICAgPSBoOwogCQl9CiAJfQotCWlmIChOVUxMID09IGRldikKKwlpZiAoTlVMTCA9PSBkZXYpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAljb3JlID0gZGV2LT5jb3JlOwogCkBAIC03OTgsOCArODAxLDEwIEBACiAKIAkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwogCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBmaCkKKwlpZiAoTlVMTCA9PSBmaCkgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CiAJZmgtPnJhZGlvICAgID0gcmFkaW87CkBAIC04MzIsNiArODM3LDkgQEAKIAkJY3g4OF9zZXRfc3RlcmVvKGNvcmUsVjRMMl9UVU5FUl9NT0RFX1NURVJFTywxKTsKIAkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsQVVEQ19TRVRfUkFESU8sTlVMTCk7CiAJfQorCXVubG9ja19rZXJuZWwoKTsKKworCWF0b21pY19pbmMoJmNvcmUtPnVzZXJzKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTIwLDcgKzkyOCw4IEBACiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlrZnJlZShmaCk7CiAKLQljeDg4X2NhbGxfaTJjX2NsaWVudHMgKGRldi0+Y29yZSwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOworCWlmKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+Y29yZS0+dXNlcnMpKQorCQljeDg4X2NhbGxfaTJjX2NsaWVudHMgKGRldi0+Y29yZSwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAppbmRleCA1NGZlNjUwLi5kYmYwMWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTIyMSw2ICsyMjEsMTQgQEAKICNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzdfR09MRCA2NQogI2RlZmluZSBDWDg4X0JPQVJEX1BST0xJTktfUFZfODAwMEdUICAgICAgIDY2CiAjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0FUU0NfMTIwICAgICAgICAgNjcKKyNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSNDAwMCAgICAgICA2OAorI2RlZmluZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlI0MDAwTElURSAgIDY5CisjZGVmaW5lIENYODhfQk9BUkRfVEVWSUlfUzQ2MCAgICAgICAgICAgICAgNzAKKyNkZWZpbmUgQ1g4OF9CT0FSRF9PTUlDT01fU1M0X1BDSSAgICAgICAgICA3MQorI2RlZmluZSBDWDg4X0JPQVJEX1RCU184OTIwICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIENYODhfQk9BUkRfVEVWSUlfUzQyMCAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QUk9MSU5LX1BWX0dMT0JBTF9YVFJFTUUgNzQKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QUk9GXzczMDAgICAgICAgICAgICAgICA3NQogCiBlbnVtIGN4ODhfaXR5cGUgewogCUNYODhfVk1VWF9DT01QT1NJVEUxID0gMSwKQEAgLTM0Miw2ICszNTAsNyBAQAogCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgIGxvY2s7CiAJLyogdmFyaW91cyB2NGwgY29udHJvbHMgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBmcmVxOworCWF0b21pY190CQkgICB1c2VyczsKIAogCS8qIGN4ODgtdmlkZW8gbmVlZHMgdG8gYWNjZXNzIGN4ODgwMiBmb3IgaHlicmlkIHR1bmVyIHBsbCBhY2Nlc3MuICovCiAJc3RydWN0IGN4ODgwMl9kZXYgICAgICAgICAgKmR2YmRldjsKQEAgLTYwMSw3ICs2MTAsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGN4ODgtY2FyZHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLWV4dGVybiBpbnQgY3g4OF90dW5lcl9jYWxsYmFjayh2b2lkICpkZXYsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKK2V4dGVybiBpbnQgY3g4OF90dW5lcl9jYWxsYmFjayh2b2lkICpkZXYsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKIGV4dGVybiBpbnQgY3g4OF9nZXRfcmVzb3VyY2VzKGNvbnN0IHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCiAJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpKTsKIGV4dGVybiBzdHJ1Y3QgY3g4OF9jb3JlICpjeDg4X2NvcmVfY3JlYXRlKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGludCBucik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhYnVzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYWJ1c2IuYwppbmRleCA3OWZhZWRmNS4uM2FhNTM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYWJ1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhYnVzYi5jCkBAIC04NjYsNyArODY2LDggQEAKIAogCWRiZygiZGFidXNiX2luaXQ6IGRyaXZlciByZWdpc3RlcmVkIik7CiAKLQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgorCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKIAogb3V0OgogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RwYzcxNDYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZHBjNzE0Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQ2ZGY3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZHBjNzE0Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qCi0gICAgZHBjNzE0Ni5jIC0gdjRsMiBkcml2ZXIgZm9yIHRoZSBkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQKLQotICAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLSNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKLQotI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CS8qIGZvciBzYWE3MTExYSAqLwotCi0jZGVmaW5lIEkyQ19TQUE3MTExQSAgICAgICAgICAgIDB4MjQKLQotLyogQWxsIHVudXNlZCBieXRlcyBhcmUgcmVzZXJ2ZXJkLiAqLwotI2RlZmluZSBTQUE3MTFYX0NISVBfVkVSU0lPTiAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgU0FBNzExWF9BTkFMT0dfSU5QVVRfQ09OVFJPTF8xICAweDAyCi0jZGVmaW5lIFNBQTcxMVhfQU5BTE9HX0lOUFVUX0NPTlRST0xfMiAgMHgwMwotI2RlZmluZSBTQUE3MTFYX0FOQUxPR19JTlBVVF9DT05UUk9MXzMgIDB4MDQKLSNkZWZpbmUgU0FBNzExWF9BTkFMT0dfSU5QVVRfQ09OVFJPTF80ICAweDA1Ci0jZGVmaW5lIFNBQTcxMVhfSE9SSVpPTlRBTF9TWU5DX1NUQVJUICAgMHgwNgotI2RlZmluZSBTQUE3MTFYX0hPUklaT05UQUxfU1lOQ19TVE9QICAgIDB4MDcKLSNkZWZpbmUgU0FBNzExWF9TWU5DX0NPTlRST0wgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIFNBQTcxMVhfTFVNSU5BTkNFX0NPTlRST0wgICAgICAgMHgwOQotI2RlZmluZSBTQUE3MTFYX0xVTUlOQU5DRV9CUklHSFRORVNTICAgIDB4MEEKLSNkZWZpbmUgU0FBNzExWF9MVU1JTkFOQ0VfQ09OVFJBU1QgICAgICAweDBCCi0jZGVmaW5lIFNBQTcxMVhfQ0hST01BX1NBVFVSQVRJT04gICAgICAgMHgwQwotI2RlZmluZSBTQUE3MTFYX0NIUk9NQV9IVUVfQ09OVFJPTCAgICAgIDB4MEQKLSNkZWZpbmUgU0FBNzExWF9DSFJPTUFfQ09OVFJPTCAgICAgICAgICAweDBFCi0jZGVmaW5lIFNBQTcxMVhfRk9STUFUX0RFTEFZX0NPTlRST0wgICAgMHgxMAotI2RlZmluZSBTQUE3MTFYX09VVFBVVF9DT05UUk9MXzEgICAgICAgIDB4MTEKLSNkZWZpbmUgU0FBNzExWF9PVVRQVVRfQ09OVFJPTF8yICAgICAgICAweDEyCi0jZGVmaW5lIFNBQTcxMVhfT1VUUFVUX0NPTlRST0xfMyAgICAgICAgMHgxMwotI2RlZmluZSBTQUE3MTFYX1ZfR0FURV8xX1NUQVJUICAgICAgICAgIDB4MTUKLSNkZWZpbmUgU0FBNzExWF9WX0dBVEVfMV9TVE9QICAgICAgICAgICAweDE2Ci0jZGVmaW5lIFNBQTcxMVhfVl9HQVRFXzFfTVNCICAgICAgICAgICAgMHgxNwotI2RlZmluZSBTQUE3MTFYX1RFWFRfU0xJQ0VSX1NUQVRVUyAgICAgIDB4MUEKLSNkZWZpbmUgU0FBNzExWF9ERUNPREVEX0JZVEVTX09GX1RTXzEgICAweDFCCi0jZGVmaW5lIFNBQTcxMVhfREVDT0RFRF9CWVRFU19PRl9UU18yICAgMHgxQwotI2RlZmluZSBTQUE3MTFYX1NUQVRVU19CWVRFICAgICAgICAgICAgIDB4MUYKLQotI2RlZmluZSBEUENfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpICAgKGRldi0+cmV2aXNpb24gIT0gMCkKLQotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyB2ZXJib3NpdHkiKTsKLQotc3RhdGljIGludCBkcGNfbnVtOwotCi0jZGVmaW5lIERQQ19JTlBVVFMJMgotc3RhdGljIHN0cnVjdCB2NGwyX2lucHV0IGRwY19pbnB1dHNbRFBDX0lOUFVUU10gPSB7Ci0JeyAwLCAiUG9ydCBBIiwJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwJMiwgMCwgVjRMMl9TVERfUEFMX0JHfFY0TDJfU1REX05UU0NfTSwgMCB9LAotCXsgMSwgIlBvcnQgQiIsCVY0TDJfSU5QVVRfVFlQRV9DQU1FUkEsCTIsIDAsIFY0TDJfU1REX1BBTF9CR3xWNEwyX1NURF9OVFNDX00sIDAgfSwKLX07Ci0KLSNkZWZpbmUgRFBDX0FVRElPUwkwCi0KLXN0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb25faW9jdGxzIGlvY3Rsc1tdID0gewotCXsgVklESU9DX0dfSU5QVVQsCVNBQTcxNDZfRVhDTFVTSVZFIH0sCi0JeyBWSURJT0NfU19JTlBVVCwJU0FBNzE0Nl9FWENMVVNJVkUgfSwKLQl7IFZJRElPQ19FTlVNSU5QVVQsIAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAotCXsgVklESU9DX1NfU1RELAkJU0FBNzE0Nl9BRlRFUiB9LAotCXsgMCwJCQkwIH0KLX07Ci0KLXN0cnVjdCBkcGMKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2aWRlb19kZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZQkqdmJpX2RldjsKLQotCXN0cnVjdCBpMmNfYWRhcHRlcglpMmNfYWRhcHRlcjsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkqc2FhNzExMWE7Ci0KLQlpbnQgY3VyX2lucHV0OwkvKiBjdXJyZW50IGlucHV0ICovCi19OwotCi1zdGF0aWMgaW50IGRwY19jaGVja19jbGllbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZHBjKiBkcGMgPSBkYXRhOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBpMmNfdmVyaWZ5X2NsaWVudChkZXYpOwotCi0JaWYoICFjbGllbnQgKQotCQlyZXR1cm4gMDsKLQotCWlmKCBJMkNfU0FBNzExMUEgPT0gY2xpZW50LT5hZGRyICkKLQkJZHBjLT5zYWE3MTExYSA9IGNsaWVudDsKLQotCXJldHVybiAwOwotfQotCi0vKiBmaXhtZTogYWRkIHZiaSBzdHVmZiBoZXJlICovCi1zdGF0aWMgaW50IGRwY19wcm9iZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIGRldikKLXsKLQlzdHJ1Y3QgZHBjKiBkcGMgPSBOVUxMOwotCi0JZHBjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRwYyksIEdGUF9LRVJORUwpOwotCWlmKCBOVUxMID09IGRwYyApIHsKLQkJcHJpbnRrKCJkcGNfdjRsMi5vOiBkcGNfcHJvYmU6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBGSVhNRTogZW5hYmxlIGkyYy1wb3J0IHBpbnMsIHZpZGVvLXBvcnQtcGlucwotCSAgIHZpZGVvIHBvcnQgcGlucyBzaG91bGQgYmUgZW5hYmxlZCBoZXJlID8hICovCi0Jc2FhNzE0Nl93cml0ZShkZXYsIE1DMSwgKE1BU0tfMDggfCBNQVNLXzI0IHwgTUFTS18xMCB8IE1BU0tfMjYpKTsKLQotCWRwYy0+aTJjX2FkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyKSB7Ci0JCS5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0csCi0JCS5uYW1lID0gImRwYzcxNDYiLAotCX07Ci0Jc2FhNzE0Nl9pMmNfYWRhcHRlcl9wcmVwYXJlKGRldiwgJmRwYy0+aTJjX2FkYXB0ZXIsIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV80ODApOwotCWlmKGkyY19hZGRfYWRhcHRlcigmZHBjLT5pMmNfYWRhcHRlcikgPCAwKSB7Ci0JCURFQl9TKCgiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIikpOwotCQlrZnJlZShkcGMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQkvKiBsb29wIHRocm91Z2ggYWxsIGkyYy1kZXZpY2VzIG9uIHRoZSBidXMgYW5kIGxvb2sgd2hvIGlzIHRoZXJlICovCi0JZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkcGMtPmkyY19hZGFwdGVyLmRldiwgZHBjLCBkcGNfY2hlY2tfY2xpZW50cyk7Ci0KLQkvKiBjaGVjayBpZiBhbGwgZGV2aWNlcyBhcmUgcHJlc2VudCAqLwotCWlmICghZHBjLT5zYWE3MTExYSkgewotCQlERUJfRCgoImRwY192NGwyLm86IGRwY19hdHRhY2ggZmFpbGVkIGZvciB0aGlzIGRldmljZS5cbiIpKTsKLQkJaTJjX2RlbF9hZGFwdGVyKCZkcGMtPmkyY19hZGFwdGVyKTsKLQkJa2ZyZWUoZHBjKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogYWxsIGRldmljZXMgYXJlIHByZXNlbnQsIHByb2JlIHdhcyBzdWNjZXNzZnVsICovCi0JREVCX0QoKCJkcGNfdjRsMi5vOiBkcGNfcHJvYmUgc3VjY2VlZGVkIGZvciB0aGlzIGRldmljZS5cbiIpKTsKLQotCS8qIHdlIHN0b3JlIHRoZSBwb2ludGVyIGluIG91ciBwcml2YXRlIGRhdGEgZmllbGQgKi8KLQlkZXYtPmV4dF9wcml2ID0gZHBjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGJyaW5nIGhhcmR3YXJlIHRvIGEgc2FuZSBzdGF0ZS4gdGhpcyBoYXMgdG8gYmUgZG9uZSwganVzdCBpbiBjYXNlIHNvbWVvbmUKLSAgIHdhbnRzIHRvIGNhcHR1cmUgZnJvbSB0aGlzIGRldmljZSBiZWZvcmUgaXQgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gICB0aGUgY2FwdHVyZSBlbmdpbmUgd291bGQgYmFkbHkgZmFpbCwgYmVjYXVzZSBubyB2YWxpZCBzaWduYWwgYXJyaXZlcyBvbiB0aGUKLSAgIHNhYTcxNDYsIHRodXMgbGVhZGluZyB0byB0aW1lb3V0cyBhbmQgc3R1ZmYuICovCi1zdGF0aWMgaW50IGRwY19pbml0X2RvbmUoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCi17Ci0Jc3RydWN0IGRwYyogZHBjID0gKHN0cnVjdCBkcGMqKWRldi0+ZXh0X3ByaXY7Ci0KLQlERUJfRCgoImRwY192NGwyLm86IGRwY19pbml0X2RvbmUgY2FsbGVkLlxuIikpOwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgaGVscGVyIGljcyB0byB1c2VmdWwgdmFsdWVzICovCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDAwLCAweDExKTsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwMiwgMHhjMCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDAzLCAweDMwKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MDQsIDB4MDApOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwNSwgMHgwMCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDA2LCAweGRlKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MDcsIDB4YWQpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwOCwgMHhhOCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDA5LCAweDAwKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MGEsIDB4ODApOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwYiwgMHg0Nyk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDBjLCAweDQwKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MGQsIDB4MDApOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgwZSwgMHgwMyk7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MTAsIDB4ZDApOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZHBjLT5zYWE3MTExYSwgMHgxMSwgMHgxYyk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDEyLCAweGMxKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRwYy0+c2FhNzExMWEsIDB4MTMsIDB4MzApOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkcGMtPnNhYTcxMTFhLCAweDFmLCAweDgxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGE7Ci0KLS8qIHRoaXMgZnVuY3Rpb24gb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcm9iaW5nIHdhcyBzdWNjZXNzZnVsICovCi1zdGF0aWMgaW50IGRwY19hdHRhY2goc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSAqaW5mbykKLXsKLQlzdHJ1Y3QgZHBjKiBkcGMgPSAoc3RydWN0IGRwYyopZGV2LT5leHRfcHJpdjsKLQotCURFQl9EKCgiZHBjX3Y0bDIubzogZHBjX2F0dGFjaCBjYWxsZWQuXG4iKSk7Ci0KLQkvKiBjaGVja2luZyBmb3IgaTJjLWRldmljZXMgY2FuIGJlIG9taXR0ZWQgaGVyZSwgYmVjYXVzZSB3ZQotCSAgIGFscmVhZHkgZGlkIHRoaXMgaW4gImRwY192bDQyX3Byb2JlIiAqLwotCi0Jc2FhNzE0Nl92dl9pbml0KGRldiwmdnZfZGF0YSk7Ci0JaWYoIDAgIT0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJmRwYy0+dmlkZW9fZGV2LCBkZXYsICJkcGMiLCBWRkxfVFlQRV9HUkFCQkVSKSkgewotCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBpbml0aWFsaXphdGlvbiBzdHVmZiAodmJpKSAob25seSBmb3IgcmV2aXNpb24gPiAwIGFuZCBmb3IgZXh0ZW5zaW9ucyB3aGljaCB3YW50IGl0KSovCi0JaWYoIDAgIT0gRFBDX0JPQVJEX0NBTl9ET19WQkkoZGV2KSkgewotCQlpZiggMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmZHBjLT52YmlfZGV2LCBkZXYsICJkcGMiLCBWRkxfVFlQRV9WQkkpKSB7Ci0JCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdmJpIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKLQkJfQotCX0KLQotCWkyY191c2VfY2xpZW50KGRwYy0+c2FhNzExMWEpOwotCi0JcHJpbnRrKCJkcGM6IGZvdW5kICdkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQnLSVkLlxuIixkcGNfbnVtKTsKLQlkcGNfbnVtKys7Ci0KLQkvKiB0aGUgcmVzdCAqLwotCWRwYy0+Y3VyX2lucHV0ID0gMDsKLQlkcGNfaW5pdF9kb25lKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkcGNfZGV0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQotewotCXN0cnVjdCBkcGMqIGRwYyA9IChzdHJ1Y3QgZHBjKilkZXYtPmV4dF9wcml2OwotCi0JREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOwotCi0JaTJjX3JlbGVhc2VfY2xpZW50KGRwYy0+c2FhNzExMWEpOwotCi0Jc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmZHBjLT52aWRlb19kZXYsZGV2KTsKLQlpZiggMCAhPSBEUENfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKSB7Ci0JCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJmRwYy0+dmJpX2RldixkZXYpOwotCX0KLQlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKLQotCWRwY19udW0tLTsKLQotCWkyY19kZWxfYWRhcHRlcigmZHBjLT5pMmNfYWRhcHRlcik7Ci0Ja2ZyZWUoZHBjKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIGF4YQotaW50IGRwY192YmlfYnlwYXNzKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQotewotCXN0cnVjdCBkcGMqIGRwYyA9IChzdHJ1Y3QgZHBjKilkZXYtPmV4dF9wcml2OwotCi0JaW50IGkgPSAxOwotCi0JLyogc3dpdGNoIGJ5cGFzcyBpbiBzYWE3MTExYSAqLwotCWlmICggMCAhPSBkcGMtPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQoZHBjLT5zYWE3MTExYSxTQUE3MTFYX1ZCSV9CWVBBU1MsICZpKSkgewotCQlwcmludGsoImRwY192NGwyLm86IFZCSV9CWVBBU1M6IGNvdWxkIG5vdCBhZGRyZXNzIHNhYTcxMTFhLlxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGRwY19pb2N0bChzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGRwYyogZHBjID0gKHN0cnVjdCBkcGMqKWRldi0+ZXh0X3ByaXY7Ci0vKgotCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKLSovCi0Jc3dpdGNoKGNtZCkKLQl7Ci0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCXsKLQkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7Ci0JCURFQl9FRSgoIlZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLGktPmluZGV4KSk7Ci0KLQkJaWYoIGktPmluZGV4IDwgMCB8fCBpLT5pbmRleCA+PSBEUENfSU5QVVRTKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCW1lbWNweShpLCAmZHBjX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOwotCi0JCURFQl9EKCgiZHBjX3Y0bDIubzogdjRsMl9pb2N0bDogVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsaS0+aW5kZXgpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gKGludCAqKWFyZzsKLQkJKmlucHV0ID0gZHBjLT5jdXJfaW5wdXQ7Ci0KLQkJREVCX0QoKCJkcGNfdjRsMi5vOiBWSURJT0NfR19JTlBVVDogJWRcbiIsKmlucHV0KSk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJaW50CWlucHV0ID0gKihpbnQgKilhcmc7Ci0KLQkJaWYgKGlucHV0IDwgMCB8fCBpbnB1dCA+PSBEUENfSU5QVVRTKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWRwYy0+Y3VyX2lucHV0ID0gaW5wdXQ7Ci0KLQkJLyogZml4bWU6IHN3aXRjaCBpbnB1dCBoZXJlLCBzd2l0Y2ggYXVkaW8sIHRvbyEgKi8KLS8vCQlzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKGRldiwgaW5wdXRfcG9ydF9zZWxlY3Rpb25baW5wdXRdLmhwc19zb3VyY2UsIGlucHV0X3BvcnRfc2VsZWN0aW9uW2lucHV0XS5ocHNfc3luYyk7Ci0JCXByaW50aygiZHBjX3Y0bDIubzogVklESU9DX1NfSU5QVVQ6IGZpeG1lIHN3aXRjaCBpbnB1dC5cbiIpOwotCi0JCXJldHVybiAwOwotCX0KLQlkZWZhdWx0OgotLyoKLQkJREVCX0QoKCJkcGNfdjRsMi5vOiB2NGwyX2lvY3RsIGRvZXMgbm90IGhhbmRsZSB0aGlzIGlvY3RsLlxuIikpOwotKi8KLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3RkX2NhbGxiYWNrKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCAqc3RkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNhYTcxNDZfc3RhbmRhcmQgc3RhbmRhcmRbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gIlBBTCIsIAkuaWQJPSBWNEwyX1NURF9QQUwsCi0JCS52X29mZnNldAk9IDB4MTcsCS52X2ZpZWxkIAk9IDI4OCwKLQkJLmhfb2Zmc2V0CT0gMHgxNCwJLmhfcGl4ZWxzIAk9IDY4MCwKLQkJLnZfbWF4X291dAk9IDU3NiwJLmhfbWF4X291dAk9IDc2OCwKLQl9LCB7Ci0JCS5uYW1lCT0gIk5UU0MiLCAJLmlkCT0gVjRMMl9TVERfTlRTQywKLQkJLnZfb2Zmc2V0CT0gMHgxNiwJLnZfZmllbGQgCT0gMjQwLAotCQkuaF9vZmZzZXQJPSAweDA2LAkuaF9waXhlbHMgCT0gNzA4LAotCQkudl9tYXhfb3V0CT0gNDgwLAkuaF9tYXhfb3V0CT0gNjQwLAotCX0sIHsKLQkJLm5hbWUJPSAiU0VDQU0iLCAJLmlkCT0gVjRMMl9TVERfU0VDQU0sCi0JCS52X29mZnNldAk9IDB4MTQsCS52X2ZpZWxkIAk9IDI4OCwKLQkJLmhfb2Zmc2V0CT0gMHgxNCwJLmhfcGl4ZWxzIAk9IDcyMCwKLQkJLnZfbWF4X291dAk9IDU3NiwJLmhfbWF4X291dAk9IDc2OCwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGV4dGVuc2lvbjsKLQotc3RhdGljIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSBkcGMgPSB7Ci0JLmV4dF9wcml2ID0gIk11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkIiwKLQkuZXh0ID0gJmV4dGVuc2lvbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGJsW10gPSB7Ci0JewotCQkudmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotCQkuZGV2aWNlCSAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxNDYsCi0JCS5zdWJ2ZW5kb3IgPSAweDAwMDAsCi0JCS5zdWJkZXZpY2UgPSAweDAwMDAsCi0JCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZkcGMsCi0JfSwgewotCQkudmVuZG9yID0gMCwKLQl9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2FhNzE0Nl9leHRfdnYgdnZfZGF0YSA9IHsKLQkuaW5wdXRzCQk9IERQQ19JTlBVVFMsCi0JLmNhcGFiaWxpdGllcwk9IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFLAotCS5zdGRzCQk9ICZzdGFuZGFyZFswXSwKLQkubnVtX3N0ZHMJPSBzaXplb2Yoc3RhbmRhcmQpL3NpemVvZihzdHJ1Y3Qgc2FhNzE0Nl9zdGFuZGFyZCksCi0JLnN0ZF9jYWxsYmFjawk9ICZzdGRfY2FsbGJhY2ssCi0JLmlvY3RscwkJPSAmaW9jdGxzWzBdLAotCS5pb2N0bAkJPSBkcGNfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGV4dGVuc2lvbiA9IHsKLQkubmFtZQkJPSAiZHBjNzE0NiBkZW1vbnN0cmF0aW9uIGJvYXJkIiwKLQkuZmxhZ3MJCT0gU0FBNzE0Nl9VU0VfSTJDX0lSUSwKLQotCS5wY2lfdGJsCT0gJnBjaV90YmxbMF0sCi0JLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLQotCS5wcm9iZQkJPSBkcGNfcHJvYmUsCi0JLmF0dGFjaAkJPSBkcGNfYXR0YWNoLAotCS5kZXRhY2gJCT0gZHBjX2RldGFjaCwKLQotCS5pcnFfbWFzawk9IDAsCi0JLmlycV9mdW5jCT0gTlVMTCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRwY19pbml0X21vZHVsZSh2b2lkKQotewotCWlmKCAwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pKSB7Ci0JCURFQl9TKCgiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvbi5cbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkcGNfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlzYWE3MTQ2X3VucmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pOwotfQotCi1tb2R1bGVfaW5pdChkcGNfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZHBjX2NsZWFudXBfbW9kdWxlKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJ2aWRlbzRsaW51eC0yIGRyaXZlciBmb3IgdGhlICdkcGM3MTQ2IGRlbW9uc3RyYXRpb24gYm9hcmQnIik7Ci1NT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwppbmRleCAzYzAwNjEwLi5hYzMyOTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtMTE3LDEwICsxMTcsMTAgQEAKIAogCQkJaWYgKG9sZHB0ciArIGxlbmd0aCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewogCQkJCXVuc2lnbmVkIGludCBjbnQgPQotCQkJCSAgICBydW50aW1lLT5idWZmZXJfc2l6ZSAtIG9sZHB0ciAtIDE7CisJCQkJICAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gb2xkcHRyOwogCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIG9sZHB0ciAqIHN0cmlkZSwgY3AsCiAJCQkJICAgICAgIGNudCAqIHN0cmlkZSk7Ci0JCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhLCBjcCArIGNudCwKKwkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEsIGNwICsgY250ICogc3RyaWRlLAogCQkJCSAgICAgICBsZW5ndGggKiBzdHJpZGUgLSBjbnQgKiBzdHJpZGUpOwogCQkJfSBlbHNlIHsKIAkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBvbGRwdHIgKiBzdHJpZGUsIGNwLApAQCAtMTYxLDggKzE2MSwxNCBAQAogCiAJCW1lbXNldChkZXYtPmFkZXYtPnRyYW5zZmVyX2J1ZmZlcltpXSwgMHg4MCwgc2Jfc2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoRU0yOFhYX05VTV9BVURJT19QQUNLRVRTLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCF1cmIpCisJCWlmICghdXJiKSB7CisJCQllbTI4eHhfZXJyZGV2KCJ1c2JfYWxsb2NfdXJiIGZhaWxlZCFcbiIpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCXVzYl9mcmVlX3VyYihkZXYtPmFkZXYtPnVyYltqXSk7CisJCQkJa2ZyZWUoZGV2LT5hZGV2LT50cmFuc2Zlcl9idWZmZXJbal0pOworCQkJfQogCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAogCQl1cmItPmRldiA9IGRldi0+dWRldjsKIAkJdXJiLT5jb250ZXh0ID0gZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCA0NTJkYTcwLi5kNjVkMDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtOTMsMjggKzkzLDYgQEAKIAkJCS5hbXV4ICAgICA9IDAsCiAJCX0gfSwKIAl9LAotCVtFTTI4MDBfQk9BUkRfS1dPUkxEX1VTQjI4MDBdID0gewotCQkubmFtZSAgICAgICAgID0gIkt3b3JsZCBVU0IyODAwIiwKLQkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAotCQkuaXNfZW0yODAwICAgID0gMSwKLQkJLnZjaGFubmVscyAgICA9IDMsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX0ZDVjEyMzZELAotCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULAotCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCi0JCS5pbnB1dCAgICAgICAgICA9IHsgewotCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKLQkJCS5hbXV4ICAgICA9IDAsCi0JCX0sIHsKLQkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCi0JCQkuYW11eCAgICAgPSAxLAotCQl9LCB7Ci0JCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCi0JCQkuYW11eCAgICAgPSAxLAotCQl9IH0sCi0JfSwKIAlbRU0yODIwX0JPQVJEX0tXT1JMRF9QVlJUVjI4MDBSRl0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiS3dvcmxkIFBWUiBUViAyODAwIFJGIiwKIAkJLmlzX2VtMjgwMCAgICA9IDAsCkBAIC01OTksNyArNTc3LDcgQEAKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSAzLAogCQl9LCB7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKQEAgLTk1MiwyMiArOTMwLDIzIEBACiAJfSwKIAlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzEwVV0gPSB7CiAJCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMTBVIiwKLQkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudmNoYW5uZWxzICAgID0gMywKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLmhhc19kdmIgICAgICA9IDEsCisJCS5tdHNfZmlybXdhcmUgPSAxLAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCiAJCS5pbnB1dCAgICAgICAgICA9IHsgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMCwKLQkJCS5hbXV4ICAgICA9IDAsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9WSURFTywKIAkJfSwgewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgICA9IFRWUDUxNTBfQ09NUE9TSVRFMSwKLQkJCS5hbXV4ICAgICA9IDEsCi0JCX0sIHsKKwkJCS5hbXV4ICAgICA9IEVNMjhYWF9BTVVYX0FDOTdfTElORV9JTiwKKwkJfSwgewkvKiBTLXZpZGVvIGhhcyBub3QgYmVlbiB0ZXN0ZWQgeWV0ICovCiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgICAgPSBUVlA1MTUwX1NWSURFTywKLQkJCS5hbXV4ICAgICA9IDEsCisJCQkuYW11eCAgICAgPSBFTTI4WFhfQU1VWF9BQzk3X0xJTkVfSU4sCiAJCX0gfSwKIAl9LAogCVtFTTI4ODFfQk9BUkRfRE5UX0RBMl9IWUJSSURdID0gewpAQCAtMTEyMiw3ICsxMTAxLDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4MjApLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKIAl7IFVTQl9ERVZJQ0UoMHhlYjFhLCAweDI4MjEpLAotCQkJLmRyaXZlcl9pbmZvID0gRU0yODIwX0JPQVJEX1VOS05PV04gfSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjgyMF9CT0FSRF9QUk9MSU5LX1BMQVlUVl9VU0IyIH0sCiAJeyBVU0JfREVWSUNFKDB4ZWIxYSwgMHgyODYwKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjgyMF9CT0FSRF9VTktOT1dOIH0sCiAJeyBVU0JfREVWSUNFKDB4ZWIxYSwgMHgyODYxKSwKQEAgLTEyODIsNiArMTI2MSw3IEBACiBzdGF0aWMgc3RydWN0IGVtMjh4eF9oYXNoX3RhYmxlIGVtMjh4eF9lZXByb21faGFzaCBbXSA9IHsKIAkvKiBQL046IFNBIDYwMDAyMDcwNDY1IFR1bmVyOiBUVkY3NTMzLU1GICovCiAJezB4NmNlMDVhOGYsIEVNMjgyMF9CT0FSRF9QUk9MSU5LX1BMQVlUVl9VU0IyLCBUVU5FUl9ZTUVDX1RWRl81NTMzTUZ9LAorCXsweDk2NmEwNDQxLCBFTTI4ODBfQk9BUkRfS1dPUkxEX0RWQl8zMTBVLCBUVU5FUl9YQzIwMjh9LAogfTsKIAogLyogSTJDIGRldmljZWxpc3QgaGFzaCB0YWJsZSBmb3IgZGV2aWNlcyB3aXRoIGdlbmVyaWMgVVNCIElEcyAqLwpAQCAtMTI5MSw3ICsxMjcxLDcgQEAKIAl7MHgxYmE1MDA4MCwgRU0yODYwX0JPQVJEX1BPSU5UTklYX0lOVFJBT1JBTF9DQU1FUkEsIFRVTkVSX0FCU0VOVH0sCiB9OwogCi1pbnQgZW0yOHh4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbW1hbmQsIGludCBhcmcpCitpbnQgZW0yOHh4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBwdHI7CkBAIC0xNTUyLDkgKzE1MzIsMTIgQEAKIAkJLyogZGpoIC0gTm90IHN1cmUgd2hpY2ggZGVtb2Qgd2UgbmVlZCBoZXJlICovCiAJCWN0bC0+ZGVtb2QgPSBYQzMwMjhfRkVfREVGQVVMVDsKIAkJYnJlYWs7CisJY2FzZSBFTTI4ODBfQk9BUkRfQU1EX0FUSV9UVl9XT05ERVJfSERfNjAwOgorCQljdGwtPmRlbW9kID0gWEMzMDI4X0ZFX0RFRkFVTFQ7CisJCWN0bC0+Zm5hbWUgPSBYQzMwMjhMX0RFRkFVTFRfRklSTVdBUkU7CisJCWJyZWFrOwogCWNhc2UgRU0yODgzX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTUwOgogCWNhc2UgRU0yODgwX0JPQVJEX1BJTk5BQ0xFX1BDVFZfSERfUFJPOgotCWNhc2UgRU0yODgwX0JPQVJEX0FNRF9BVElfVFZfV09OREVSX0hEXzYwMDoKIAkJLyogRklYTUU6IEJldHRlciB0byBzcGVjaWZ5IHRoZSBuZWVkZWQgSUYgKi8KIAkJY3RsLT5kZW1vZCA9IFhDMzAyOF9GRV9ERUZBVUxUOwogCQlicmVhazsKQEAgLTE3NjQsNiArMTc0NywyMCBAQAogCQlicmVhazsKIAljYXNlIEVNMjgyMF9CT0FSRF9VTktOT1dOOgogCWNhc2UgRU0yODAwX0JPQVJEX1VOS05PV046CisJCS8qCisJCSAqIFRoZSBLLVdPUkxEIERWQi1UIDMxMFUgaXMgZGV0ZWN0ZWQgYXMgYW4gTVNJIERpZ2l2b3ggQUQuCisJCSAqCisJCSAqIFRoaXMgb2NjdXJzIGJlY2F1c2UgdGhleSBzaGFyZSBpZGVudGljYWwgVVNCIHZlbmRvciBhbmQKKwkJICogcHJvZHVjdCBJRHMuCisJCSAqCisJCSAqIFdoYXQgd2UgZG8gaGVyZSBpcyBsb29rIHVwIHRoZSBFRVBST00gaGFzaCBvZiB0aGUgSy1XT1JMRAorCQkgKiBhbmQgaWYgaXQgaXMgZm91bmQgdGhlbiB3ZSBkZWNpZGUgdGhhdCB3ZSBkbyBub3QgaGF2ZQorCQkgKiBhIERJR0lWT1ggYW5kIHJlc2V0IHRoZSBkZXZpY2UgdG8gdGhlIEstV09STEQgaW5zdGVhZC4KKwkJICoKKwkJICogVGhpcyBzb2x1dGlvbiBpcyBvbmx5IHZhbGlkIGlmIHRoZXkgZG8gbm90IHNoYXJlIGVlcHJvbQorCQkgKiBoYXNoIGlkZW50aXRpZXMgd2hpY2ggaGFzIG5vdCBiZWVuIGRldGVybWluZWQgYXMgeWV0LgorCQkgKi8KKwljYXNlIEVNMjg4MF9CT0FSRF9NU0lfRElHSVZPWF9BRDoKIAkJaWYgKCFlbTI4eHhfaGludF9ib2FyZChkZXYpKQogCQkJZW0yOHh4X3NldF9tb2RlbChkZXYpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYwppbmRleCA0Yjk5MmJjLi5jOTllMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCkBAIC0yNDksNyArMjQ5LDYgQEAKIAltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwogCWNmZy5pMmNfYWRhcCAgPSAmZGV2LT5pMmNfYWRhcDsKIAljZmcuaTJjX2FkZHIgID0gYWRkcjsKLQljZmcuY2FsbGJhY2sgID0gZW0yOHh4X3R1bmVyX2NhbGxiYWNrOwogCiAJaWYgKCFkZXYtPmR2Yi0+ZnJvbnRlbmQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcy8yOiBkdmIgZnJvbnRlbmQgbm90IGF0dGFjaGVkLiAiCkBAIC0yNzQsNyArMjczLDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludCByZWdpc3Rlcl9kdmIoc3RydWN0IGVtMjh4eF9kdmIgKmR2YiwKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfZHZiKHN0cnVjdCBlbTI4eHhfZHZiICpkdmIsCiAJCSBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCiAJCSBzdHJ1Y3QgZW0yOHh4ICpkZXYsCiAJCSBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCkBAIC00MjIsNiArNDIxLDggQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEVNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMDoKKwljYXNlIEVNMjg4MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6CisJY2FzZSBFTTI4ODBfQk9BUkRfS1dPUkxEX0RWQl8zMTBVOgogCQlkdmItPmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKIAkJCQkJICAgJmVtMjh4eF96bDEwMzUzX3dpdGhfeGMzMDI4LAogCQkJCQkgICAmZGV2LT5pMmNfYWRhcCk7CkBAIC00NDMsMTUgKzQ0NCw2IEBACiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKLQljYXNlIEVNMjg4MF9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFM6Ci0JCWR2Yi0+ZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCQkJJmVtMjh4eF96bDEwMzUzX3dpdGhfeGMzMDI4LAotCQkJCQkJJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgewotCQkJIHJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCIKIAkJCQkiIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCkBAIC00NjUsNiArNDU3LDggQEAKIAkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJZ290byBvdXRfZnJlZTsKIAl9CisJLyogZGVmaW5lIGdlbmVyYWwtcHVycG9zZSBjYWxsYmFjayBwb2ludGVyICovCisJZHZiLT5mcm9udGVuZC0+Y2FsbGJhY2sgPSBlbTI4eHhfdHVuZXJfY2FsbGJhY2s7CiAKIAkvKiByZWdpc3RlciBldmVyeXRoaW5nICovCiAJcmVzdWx0ID0gcmVnaXN0ZXJfZHZiKGR2YiwgVEhJU19NT0RVTEUsIGRldiwgJmRldi0+dWRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwppbmRleCA5Nzg1MzM4Li4zYmFiNTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCkBAIC0xNDMsMTAgKzE0MywxMSBAQAogCX0KIAlmb3IgKHdyaXRlX3RpbWVvdXQgPSBFTTI4MDBfSTJDX1dSSVRFX1RJTUVPVVQ7IHdyaXRlX3RpbWVvdXQgPiAwOwogCSAgICAgd3JpdGVfdGltZW91dCAtPSA1KSB7Ci0JCXVuc2lnbmVkIG1zZyA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnKGRldiwgMHg1KTsKLQkJaWYgKG1zZyA9PSAweDk0KQorCQl1bnNpZ25lZCByZWcgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZyhkZXYsIDB4NSk7CisKKwkJaWYgKHJlZyA9PSAweDk0KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWVsc2UgaWYgKG1zZyA9PSAweDg0KQorCQllbHNlIGlmIChyZWcgPT0gMHg4NCkKIAkJCXJldHVybiAwOwogCQltc2xlZXAoNSk7CiAJfQpAQCAtMzM1LDggKzMzNiwxMSBAQAogCiAJLyogQ2hlY2sgaWYgYm9hcmQgaGFzIGVlcHJvbSAqLwogCWVyciA9IGkyY19tYXN0ZXJfcmVjdigmZGV2LT5pMmNfY2xpZW50LCAmYnVmLCAwKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIC0xOworCWlmIChlcnIgPCAwKSB7CisJCWVtMjh4eF9lcnJkZXYoIiVzOiBpMmNfbWFzdGVyX3JlY3YgZmFpbGVkISBlcnIgWyVkXVxuIiwKKwkJCV9fZnVuY19fLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KIAogCWJ1ZiA9IDA7CiAKQEAgLTM0NCw3ICszNDgsNyBAQAogCWlmIChlcnIgIT0gMSkgewogCQlwcmludGsoS0VSTl9JTkZPICIlczogSHVoLCBubyBlZXByb20gcHJlc2VudCAoZXJyPSVkKT9cbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIGVycik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIGVycjsKIAl9CiAJd2hpbGUgKHNpemUgPiAwKSB7CiAJCWlmIChzaXplID4gMTYpCkBAIC0zNTcsNyArMzYxLDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXM6IGkyYyBlZXByb20gcmVhZCBlcnJvciAoZXJyPSVkKVxuIiwKIAkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXNpemUgLT0gYmxvY2s7CiAJCXAgKz0gYmxvY2s7CkBAIC01ODUsMTggKzU4OSwzMSBAQAogICovCiBpbnQgZW0yOHh4X2kyY19yZWdpc3RlcihzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CisJaW50IHJldHZhbDsKKwogCUJVR19PTighZGV2LT5lbTI4eHhfd3JpdGVfcmVncyB8fCAhZGV2LT5lbTI4eHhfcmVhZF9yZWcpOwogCUJVR19PTighZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEgfHwgIWRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcSk7CiAJZGV2LT5pMmNfYWRhcCA9IGVtMjh4eF9hZGFwX3RlbXBsYXRlOwogCWRldi0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKIAlzdHJjcHkoZGV2LT5pMmNfYWRhcC5uYW1lLCBkZXYtPm5hbWUpOwogCWRldi0+aTJjX2FkYXAuYWxnb19kYXRhID0gZGV2OwotCWkyY19hZGRfYWRhcHRlcigmZGV2LT5pMmNfYWRhcCk7CisKKwlyZXR2YWwgPSBpMmNfYWRkX2FkYXB0ZXIoJmRldi0+aTJjX2FkYXApOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWVtMjh4eF9lcnJkZXYoIiVzOiBpMmNfYWRkX2FkYXB0ZXIgZmFpbGVkISByZXR2YWwgWyVkXVxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWRldi0+aTJjX2NsaWVudCA9IGVtMjh4eF9jbGllbnRfdGVtcGxhdGU7CiAJZGV2LT5pMmNfY2xpZW50LmFkYXB0ZXIgPSAmZGV2LT5pMmNfYWRhcDsKIAotCWVtMjh4eF9pMmNfZWVwcm9tKGRldiwgZGV2LT5lZWRhdGEsIHNpemVvZihkZXYtPmVlZGF0YSkpOworCXJldHZhbCA9IGVtMjh4eF9pMmNfZWVwcm9tKGRldiwgZGV2LT5lZWRhdGEsIHNpemVvZihkZXYtPmVlZGF0YSkpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfaTJfZWVwcm9tIGZhaWxlZCEgcmV0dmFsIFslZF1cbiIsCisJCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoaTJjX3NjYW4pCiAJCWVtMjh4eF9kb19pMmNfc2NhbihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwppbmRleCA0OWFiMDYyLi5jNTM2NDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwpAQCAtNTEzLDEwICs1MTMsMTcgQEAKICAqLwogc3RhdGljIGludCBlbTI4eHhfY29uZmlnKHN0cnVjdCBlbTI4eHggKmRldikKIHsKKwlpbnQgcmV0dmFsOwogCiAJLyogU2V0cyBJMkMgc3BlZWQgdG8gMTAwIEtIeiAqLwotCWlmICghZGV2LT5pc19lbTI4MDApCi0JCWVtMjh4eF93cml0ZV9yZWdzX3JlcShkZXYsIDB4MDAsIDB4MDYsICJceDQwIiwgMSk7CisJaWYgKCFkZXYtPmlzX2VtMjgwMCkgeworCQlyZXR2YWwgPSBlbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDA2LCAiXHg0MCIsIDEpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSBmYWlsZWQhIHJldHZhbCBbJWRdXG4iLAorCQkJCV9fZnVuY19fLCByZXR2YWwpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIAogCS8qIGVuYWJsZSB2YmkgY2FwdHVyaW5nICovCiAKQEAgLTE1MTIsNiArMTUxOSw3IEBACiAJc3RydWN0IGVtMjh4eF9maCAqZmg7CiAJZW51bSB2NGwyX2J1Zl90eXBlIGZoX3R5cGUgPSAwOwogCisJbG9ja19rZXJuZWwoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZlbTI4eHhfZGV2bGlzdCwgZGV2bGlzdCkgewogCQlpZiAoaC0+dmRldi0+bWlub3IgPT0gbWlub3IpIHsKIAkJCWRldiAgPSBoOwpAQCAtMTUyNyw4ICsxNTM1LDEwIEBACiAJCQlkZXYgICA9IGg7CiAJCX0KIAl9Ci0JaWYgKE5VTEwgPT0gZGV2KQorCWlmIChOVUxMID09IGRldikgeworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCWVtMjh4eF92aWRlb2RiZygib3BlbiBtaW5vcj0lZCB0eXBlPSVzIHVzZXJzPSVkXG4iLAogCQkJCW1pbm9yLCB2NGwyX3R5cGVfbmFtZXNbZmhfdHlwZV0sIGRldi0+dXNlcnMpOwpAQCAtMTUzNyw2ICsxNTQ3LDcgQEAKIAlmaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbTI4eHhfZmgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZoKSB7CiAJCWVtMjh4eF9lcnJkZXYoImVtMjh4eC12aWRlby5jOiBPdXQgb2YgbWVtb3J5PyFcbiIpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwpAQCAtMTU3Myw2ICsxNTg0LDcgQEAKIAkJCXNpemVvZihzdHJ1Y3QgZW0yOHh4X2J1ZmZlciksIGZoKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gZXJyQ29kZTsKIH0KQEAgLTE1ODgsOCArMTYwMCw3IEBACiAJLypGSVhNRTogSTJDIElSIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQgKi8KIAogCWVtMjh4eF9pbmZvKCJWNEwyIGRldmljZXMgL2Rldi92aWRlbyVkIGFuZCAvZGV2L3ZiaSVkIGRlcmVnaXN0ZXJlZFxuIiwKLQkJCQlkZXYtPnZkZXYtPm1pbm9yLU1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUlOLAotCQkJCWRldi0+dmJpX2Rldi0+bWlub3ItTUlOT1JfVkZMX1RZUEVfVkJJX01JTik7CisJCQkJZGV2LT52ZGV2LT5udW0sIGRldi0+dmJpX2Rldi0+bnVtKTsKIAlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKIAlpZiAoZGV2LT5zYnV0dG9uX2lucHV0X2RldikKIAkJZW0yOHh4X2RlcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKGRldik7CkBAIC0xOTQ4LDEzICsxOTU5LDIzIEBACiAJfQogCiAJLyogcmVnaXN0ZXIgaTJjIGJ1cyAqLwotCWVtMjh4eF9pMmNfcmVnaXN0ZXIoZGV2KTsKKwllcnJDb2RlID0gZW0yOHh4X2kyY19yZWdpc3RlcihkZXYpOworCWlmIChlcnJDb2RlIDwgMCkgeworCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X2kyY19yZWdpc3RlciAtIGVyckNvZGUgWyVkXSFcbiIsCisJCQlfX2Z1bmNfXywgZXJyQ29kZSk7CisJCXJldHVybiBlcnJDb2RlOworCX0KIAogCS8qIERvIGJvYXJkIHNwZWNpZmljIGluaXQgYW5kIGVlcHJvbSByZWFkaW5nICovCiAJZW0yOHh4X2NhcmRfc2V0dXAoZGV2KTsKIAogCS8qIENvbmZpZ3VyZSBhdWRpbyAqLwotCWVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7CisJZXJyQ29kZSA9IGVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7CisJaWYgKGVyckNvZGUgPCAwKSB7CisJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldCAtIGVyckNvZGUgWyVkXSFcbiIsCisJCQlfX2Z1bmNfXywgZXJyQ29kZSk7CisJCXJldHVybiBlcnJDb2RlOworCX0KIAogCS8qIGNvbmZpZ3VyZSB0aGUgZGV2aWNlICovCiAJZW0yOHh4X2NvbmZpZ19pMmMoZGV2KTsKQEAgLTE5NzQsNiArMTk5NSwxMSBAQAogCWRldi0+Y3RsX2lucHV0ID0gMjsKIAogCWVyckNvZGUgPSBlbTI4eHhfY29uZmlnKGRldik7CisJaWYgKGVyckNvZGUgPCAwKSB7CisJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfY29uZmlnIC0gZXJyQ29kZSBbJWRdIVxuIiwKKwkJCV9fZnVuY19fLCBlcnJDb2RlKTsKKwkJcmV0dXJuIGVyckNvZGU7CisJfQogCiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCAmZW0yOHh4X2Rldmxpc3QpOwogCkBAIC0yMDI2LDE3ICsyMDUyLDI3IEBACiAKIAlpZiAoZGV2LT5oYXNfbXNwMzR4eCkgewogCQkvKiBTZW5kIGEgcmVzZXQgdG8gb3RoZXIgY2hpcHMgdmlhIGdwaW8gKi8KLQkJZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgMHgwMCwgMHgwOCwgIlx4ZjciLCAxKTsKKwkJZXJyQ29kZSA9IGVtMjh4eF93cml0ZV9yZWdzX3JlcShkZXYsIDB4MDAsIDB4MDgsICJceGY3IiwgMSk7CisJCWlmIChlcnJDb2RlIDwgMCkgeworCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSAtIG1zcDM0eHgoMSkgZmFpbGVkISBlcnJDb2RlIFslZF1cbiIsCisJCQkJX19mdW5jX18sIGVyckNvZGUpOworCQkJcmV0dXJuIGVyckNvZGU7CisJCX0KIAkJbXNsZWVwKDMpOwotCQllbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDA4LCAiXHhmZiIsIDEpOworCisJCWVyckNvZGUgPSBlbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCAweDAwLCAweDA4LCAiXHhmZiIsIDEpOworCQlpZiAoZXJyQ29kZSA8IDApIHsKKwkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgLSBtc3AzNHh4KDIpIGZhaWxlZCEgZXJyQ29kZSBbJWRdXG4iLAorCQkJCV9fZnVuY19fLCBlcnJDb2RlKTsKKwkJCXJldHVybiBlcnJDb2RlOworCQl9CiAJCW1zbGVlcCgzKTsKIAl9CiAKIAl2aWRlb19tdXgoZGV2LCAwKTsKIAogCWVtMjh4eF9pbmZvKCJWNEwyIGRldmljZSByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZCBhbmQgL2Rldi92YmklZFxuIiwKLQkJCQlkZXYtPnZkZXYtPm1pbm9yLU1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUlOLAotCQkJCWRldi0+dmJpX2Rldi0+bWlub3ItTUlOT1JfVkZMX1RZUEVfVkJJX01JTik7CisJCQkJZGV2LT52ZGV2LT5udW0sIGRldi0+dmJpX2Rldi0+bnVtKTsKIAogCW11dGV4X2xvY2soJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdF9sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKQEAgLTIyMzYsNyArMjI3Miw3IEBACiAJCWVtMjh4eF93YXJuCiAJCSAgICAoImRldmljZSAvZGV2L3ZpZGVvJWQgaXMgb3BlbiEgRGVyZWdpc3RyYXRpb24gYW5kIG1lbW9yeSAiCiAJCSAgICAgImRlYWxsb2NhdGlvbiBhcmUgZGVmZXJyZWQgb24gY2xvc2UuXG4iLAotCQkJCWRldi0+dmRldi0+bWlub3ItTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NSU4pOworCQkJCWRldi0+dmRldi0+bnVtKTsKIAogCQlkZXYtPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwogCQllbTI4eHhfdW5pbml0X2lzb2MoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKaW5kZXggOWEzMzEwNy4uODI3ODExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKQEAgLTQxMSw4ICs0MTEsOCBAQAogCS8qIGZyYW1lIHByb3BlcnRpZXMgKi8KIAlpbnQgd2lkdGg7CQkvKiBjdXJyZW50IGZyYW1lIHdpZHRoICovCiAJaW50IGhlaWdodDsJCS8qIGN1cnJlbnQgZnJhbWUgaGVpZ2h0ICovCi0JaW50IGhzY2FsZTsJCS8qIGhvcml6b250YWwgc2NhbGUgZmFjdG9yIChzZWUgZGF0YXNoZWV0KSAqLwotCWludCB2c2NhbGU7CQkvKiB2ZXJ0aWNhbCBzY2FsZSBmYWN0b3IgKHNlZSBkYXRhc2hlZXQpICovCisJdW5zaWduZWQgaHNjYWxlOwkvKiBob3Jpem9udGFsIHNjYWxlIGZhY3RvciAoc2VlIGRhdGFzaGVldCkgKi8KKwl1bnNpZ25lZCB2c2NhbGU7CS8qIHZlcnRpY2FsIHNjYWxlIGZhY3RvciAoc2VlIGRhdGFzaGVldCkgKi8KIAlpbnQgaW50ZXJsYWNlZDsJCS8qIDE9aW50ZXJsYWNlIGZpbGVkcywgMD1qdXN0IHRvcCBmaWxlZHMgKi8KIAl1bnNpZ25lZCBpbnQgdmlkZW9fYnl0ZXNyZWFkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwogCkBAIC01MjgsNyArNTI4LDcgQEAKIGV4dGVybiBzdHJ1Y3QgdXNiX2RldmljZV9pZCBlbTI4eHhfaWRfdGFibGVbXTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgZW0yOHh4X2Jjb3VudDsKIHZvaWQgZW0yOHh4X3NldF9pcihzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBJUl9pMmMgKmlyKTsKLWludCBlbTI4eHhfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CitpbnQgZW0yOHh4X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpOwogCiAvKiBQcm92aWRlZCBieSBlbTI4eHgtaW5wdXQuYyAqLwogLyogVE9ETzogQ2hlY2sgaWYgdGhlIHN0YW5kYXJkIGdldF9rZXkgaGFuZGxlcnMgb24gaXItY29tbW9uIGNhbiBiZSB1c2VkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IDhkYjJhMDUuLjdhODVjNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC0xMjE0LDcgKzEyMTQsNyBAQAogCWlmICghZG93bl9yZWFkX3RyeWxvY2soJmV0NjF4MjUxX2Rldl9sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCWNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7CiAKIAlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZjYW0tPnByb2JlKSkgewogCQl1cF9yZWFkKCZldDYxeDI1MV9kZXZfbG9jayk7CkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogCiAJZG93bl93cml0ZSgmZXQ2MXgyNTFfZGV2X2xvY2spOwogCi0JY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCWV0NjF4MjUxX3N0b3BfdHJhbnNmZXIoY2FtKTsKIAlldDYxeDI1MV9yZWxlYXNlX2J1ZmZlcnMoY2FtKTsKQEAgLTEzMTgsNyArMTMxOCw3IEBACiBldDYxeDI1MV9yZWFkKHN0cnVjdCBmaWxlKiBmaWxwLCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCogZl9wb3MpCiB7Ci0Jc3RydWN0IGV0NjF4MjUxX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IGV0NjF4MjUxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgZXQ2MXgyNTFfZnJhbWVfdCogZiwgKiBpOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKIAlsb25nIHRpbWVvdXQ7CkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGV0NjF4MjUxX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IGV0NjF4MjUxX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IGV0NjF4MjUxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgZXQ2MXgyNTFfZnJhbWVfdCogZjsKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwpAQCAtMTUwMiw3ICsxNTAyLDcgQEAKIAogc3RhdGljIGludCBldDYxeDI1MV9tbWFwKHN0cnVjdCBmaWxlKiBmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgZXQ2MXgyNTFfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3QgZXQ2MXgyNTFfZGV2aWNlICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKIAkJICAgICAgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwogCXZvaWQgKnBvczsKQEAgLTIzOTUsNyArMjM5NSw3IEBACiBzdGF0aWMgaW50IGV0NjF4MjUxX2lvY3RsX3Y0bDIoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCiB7Ci0Jc3RydWN0IGV0NjF4MjUxX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IGV0NjF4MjUxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTI0OTAsNyArMjQ5MCw3IEBACiBzdGF0aWMgaW50IGV0NjF4MjUxX2lvY3RsKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBldDYxeDI1MV9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCXN0cnVjdCBldDYxeDI1MV9kZXZpY2UgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjYW0tPmZpbGVvcF9tdXRleCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKaW5kZXggNDJiOTA3NC4uNGQwODE3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwpAQCAtMSwxMyArMSwyMTIgQEAKLWNvbmZpZyBVU0JfR1NQQ0EKLQl0cmlzdGF0ZSAiVVNCIEdTUENBIGRyaXZlciIKK21lbnVjb25maWcgVVNCX0dTUENBCisJdHJpc3RhdGUgIkdTUENBIGJhc2VkIHdlYmNhbXMiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyCisJZGVmYXVsdCBtCiAJLS0taGVscC0tLQotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB2YXJpb3VzIFVTQiB3ZWJjYW1zLgorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHNlbGVjdGluZyB3ZWJjYW1zIGJhc2VkCisJb24gdGhlIEdTUENBIGZyYW1ld29yay4KIAotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0PiBmb3IgbW9yZSBpbmZvLgorCVNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2dzcGNhLnR4dD4gZm9yIG1vcmUgaW5mby4KIAotCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gWW91IG11c3Qgc2F5IFkgb3IgTSB0bwotCSAgIlZpZGVvIEZvciBMaW51eCIgdG8gdXNlIHRoaXMgZHJpdmVyLgorCVRoaXMgZHJpdmVyIHVzZXMgdGhlIFZpZGVvIEZvciBMaW51eCBBUEkuIFlvdSBtdXN0IHNheSBZIG9yIE0gdG8KKwkiVmlkZW8gRm9yIExpbnV4IiB0byB1c2UgdGhpcyBkcml2ZXIuCiAKLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGVzIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3h4eHguCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGVzLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGVzIHdpbGwgYmUgY2FsbGVkIGdzcGNhX21haW4uCisKKworaWYgVVNCX0dTUENBICYmIFZJREVPX1Y0TDIKKworc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL0tjb25maWciCisKK2NvbmZpZyBVU0JfR1NQQ0FfQ09ORVgKKwl0cmlzdGF0ZSAiQ29uZXhhbnQgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgQ29uZXhhbnQgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9jb25leC4KKworY29uZmlnIFVTQl9HU1BDQV9FVE9NUworCXRyaXN0YXRlICJFdG9tcyBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgRXRvbXMgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9ldG9tcy4KKworY29uZmlnIFVTQl9HU1BDQV9GSU5FUElYCisJdHJpc3RhdGUgIkZ1amlmaWxtIEZpbmVQaXggVVNCIFY0TDIgZHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBGaW5lUGl4IGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfZmluZXBpeC4KKworY29uZmlnIFVTQl9HU1BDQV9NQVJTCisJdHJpc3RhdGUgIk1hcnMgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIE1hcnMgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9tYXJzLgorCitjb25maWcgVVNCX0dTUENBX09WNTE5CisJdHJpc3RhdGUgIk9WNTE5IFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBPVjUxOSBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX292NTE5LgorCitjb25maWcgVVNCX0dTUENBX1BBQzIwNworCXRyaXN0YXRlICJQaXhhcnQgUEFDMjA3IFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBQQUMyMDcgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9wYWMyMDcuCisKK2NvbmZpZyBVU0JfR1NQQ0FfUEFDNzMxMQorCXRyaXN0YXRlICJQaXhhcnQgUEFDNzMxMSBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgUEFDNzMxMSBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3BhYzczMTEuCisKK2NvbmZpZyBVU0JfR1NQQ0FfU09OSVhCCisJdHJpc3RhdGUgIlNOOUMxMDIgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNPTklYQiBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3Nvbml4Yi4KKworY29uZmlnIFVTQl9HU1BDQV9TT05JWEoKKwl0cmlzdGF0ZSAiU09OSVggSlBFRyBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU09OSVhKIGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc29uaXhqCisKK2NvbmZpZyBVU0JfR1NQQ0FfU1BDQTUwMAorCXRyaXN0YXRlICJTUENBNTAwIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBTUENBNTAwIGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc3BjYTUwMC4KKworY29uZmlnIFVTQl9HU1BDQV9TUENBNTAxCisJdHJpc3RhdGUgIlNQQ0E1MDEgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNQQ0E1MDEgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zcGNhNTAxLgorCitjb25maWcgVVNCX0dTUENBX1NQQ0E1MDUKKwl0cmlzdGF0ZSAiU1BDQTUwNSBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU1BDQTUwNSBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NwY2E1MDUuCisKK2NvbmZpZyBVU0JfR1NQQ0FfU1BDQTUwNgorCXRyaXN0YXRlICJTUENBNTA2IFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBTUENBNTA2IGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc3BjYTUwNi4KKworY29uZmlnIFVTQl9HU1BDQV9TUENBNTA4CisJdHJpc3RhdGUgIlNQQ0E1MDggVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNQQ0E1MDggY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zcGNhNTA4LgorCitjb25maWcgVVNCX0dTUENBX1NQQ0E1NjEKKwl0cmlzdGF0ZSAiU1BDQTU2MSBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgU1BDQTU2MSBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NwY2E1NjEuCisKK2NvbmZpZyBVU0JfR1NQQ0FfU1RLMDE0CisJdHJpc3RhdGUgIlN5bnRlayBEVjQwMDAgKFNUSzAxNCkgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFNUSzAxNCBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3N0azAxNC4KKworY29uZmlnIFVTQl9HU1BDQV9TVU5QTFVTCisJdHJpc3RhdGUgIlNVTlBMVVMgVVNCIENhbWVyYSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQorCWhlbHAKKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFN1bnBsdXMKKwlTUENBNTA0KGFiYykgU1BDQTUzMyBTUENBNTM2IGNoaXBzLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3NwY2E1eHguCisKK2NvbmZpZyBVU0JfR1NQQ0FfVDYxMworCXRyaXN0YXRlICJUNjEzIChKUEVHIENvbXBsaWFuY2UpIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBUNjEzIGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfdDYxMy4KKworY29uZmlnIFVTQl9HU1BDQV9UVjg1MzIKKwl0cmlzdGF0ZSAiVFY4NTMyIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBUVjg1MzEgY2hpcC4KKworCVRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV90djg1MzIuCisKK2NvbmZpZyBVU0JfR1NQQ0FfVkMwMzJYCisJdHJpc3RhdGUgIlZDMDMyWCBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgVkMwMzJYIGNoaXAuCisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfdmMwMzJ4LgorCitjb25maWcgVVNCX0dTUENBX1pDM1hYCisJdHJpc3RhdGUgIlZDM3h4IFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIHRoZSBaQzNYWCBjaGlwLgorCisJVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdzcGNhX3pjM3h4LgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKaW5kZXggZTY4YTg5Ni4uMjI3MzRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCkBAIC0xLDI5ICsxLDQ4IEBACi1vYmotJChDT05GSUdfVVNCX0dTUENBKQkrPSBnc3BjYV9tYWluLm8gXAotCWdzcGNhX2NvbmV4Lm8gZ3NwY2FfZXRvbXMubyBnc3BjYV9tYXJzLm8gXAotCWdzcGNhX292NTE5Lm8gZ3NwY2FfcGFjMjA3Lm8gZ3NwY2FfcGFjNzMxMS5vIFwKLQlnc3BjYV9zb25peGIubyBnc3BjYV9zb25peGoubyBnc3BjYV9zcGNhNTAwLm8gZ3NwY2Ffc3BjYTUwMS5vIFwKLQlnc3BjYV9zcGNhNTA1Lm8gZ3NwY2Ffc3BjYTUwNi5vIGdzcGNhX3NwY2E1MDgubyBnc3BjYV9zcGNhNTYxLm8gXAotCWdzcGNhX3N1bnBsdXMubyBnc3BjYV9zdGswMTQubyBnc3BjYV90NjEzLm8gZ3NwY2FfdHY4NTMyLm8gXAotCWdzcGNhX3ZjMDMyeC5vIGdzcGNhX3pjM3h4Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0EpCQkrPSBnc3BjYV9tYWluLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfQ09ORVgpCSs9IGdzcGNhX2NvbmV4Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfRVRPTVMpCSs9IGdzcGNhX2V0b21zLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfRklORVBJWCkJKz0gZ3NwY2FfZmluZXBpeC5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX01BUlMpCSs9IGdzcGNhX21hcnMubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9PVjUxOSkJKz0gZ3NwY2Ffb3Y1MTkubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUMyMDcpCSs9IGdzcGNhX3BhYzIwNy5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1BBQzczMTEpICs9IGdzcGNhX3BhYzczMTEubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TT05JWEIpCSs9IGdzcGNhX3Nvbml4Yi5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NPTklYSikJKz0gZ3NwY2Ffc29uaXhqLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfU1BDQTUwMCkgKz0gZ3NwY2Ffc3BjYTUwMC5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NQQ0E1MDEpICs9IGdzcGNhX3NwY2E1MDEubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TUENBNTA1KSArPSBnc3BjYV9zcGNhNTA1Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfU1BDQTUwNikgKz0gZ3NwY2Ffc3BjYTUwNi5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NQQ0E1MDgpICs9IGdzcGNhX3NwY2E1MDgubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TUENBNTYxKSArPSBnc3BjYV9zcGNhNTYxLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfU1VOUExVUykgKz0gZ3NwY2Ffc3VucGx1cy5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NUSzAxNCkJKz0gZ3NwY2Ffc3RrMDE0Lm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfVDYxMykJKz0gZ3NwY2FfdDYxMy5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1RWODUzMikJKz0gZ3NwY2FfdHY4NTMyLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfVkMwMzJYKQkrPSBnc3BjYV92YzAzMngubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9aQzNYWCkJKz0gZ3NwY2FfemMzeHgubwogCi1nc3BjYV9tYWluLW9ianMgOj0gZ3NwY2EubwotZ3NwY2FfY29uZXgtb2JqcyA6PSBjb25leC5vCi1nc3BjYV9ldG9tcy1vYmpzIDo9IGV0b21zLm8KLWdzcGNhX21hcnMtb2JqcyA6PSBtYXJzLm8KLWdzcGNhX292NTE5LW9ianMgOj0gb3Y1MTkubwotZ3NwY2FfcGFjMjA3LW9ianMgOj0gcGFjMjA3Lm8KLWdzcGNhX3BhYzczMTEtb2JqcyA6PSBwYWM3MzExLm8KLWdzcGNhX3Nvbml4Yi1vYmpzIDo9IHNvbml4Yi5vCi1nc3BjYV9zb25peGotb2JqcyA6PSBzb25peGoubwotZ3NwY2Ffc3BjYTUwMC1vYmpzIDo9IHNwY2E1MDAubwotZ3NwY2Ffc3BjYTUwMS1vYmpzIDo9IHNwY2E1MDEubwotZ3NwY2Ffc3BjYTUwNS1vYmpzIDo9IHNwY2E1MDUubwotZ3NwY2Ffc3BjYTUwNi1vYmpzIDo9IHNwY2E1MDYubwotZ3NwY2Ffc3BjYTUwOC1vYmpzIDo9IHNwY2E1MDgubwotZ3NwY2Ffc3BjYTU2MS1vYmpzIDo9IHNwY2E1NjEubwotZ3NwY2Ffc3RrMDE0LW9ianMgOj0gc3RrMDE0Lm8KLWdzcGNhX3N1bnBsdXMtb2JqcyA6PSBzdW5wbHVzLm8KLWdzcGNhX3Q2MTMtb2JqcyA6PSB0NjEzLm8KLWdzcGNhX3R2ODUzMi1vYmpzIDo9IHR2ODUzMi5vCi1nc3BjYV92YzAzMngtb2JqcyA6PSB2YzAzMngubwotZ3NwY2FfemMzeHgtb2JqcyA6PSB6YzN4eC5vCitnc3BjYV9tYWluLW9ianMJCQk6PSBnc3BjYS5vCitnc3BjYV9jb25leC1vYmpzCQk6PSBjb25leC5vCitnc3BjYV9ldG9tcy1vYmpzCQk6PSBldG9tcy5vCitnc3BjYV9maW5lcGl4LW9ianMJCTo9IGZpbmVwaXgubworZ3NwY2FfbWFycy1vYmpzCQkJOj0gbWFycy5vCitnc3BjYV9vdjUxOS1vYmpzCQk6PSBvdjUxOS5vCitnc3BjYV9wYWMyMDctb2JqcwkJOj0gcGFjMjA3Lm8KK2dzcGNhX3BhYzczMTEtb2JqcwkJOj0gcGFjNzMxMS5vCitnc3BjYV9zb25peGItb2JqcwkJOj0gc29uaXhiLm8KK2dzcGNhX3Nvbml4ai1vYmpzCQk6PSBzb25peGoubworZ3NwY2Ffc3BjYTUwMC1vYmpzCQk6PSBzcGNhNTAwLm8KK2dzcGNhX3NwY2E1MDEtb2JqcwkJOj0gc3BjYTUwMS5vCitnc3BjYV9zcGNhNTA1LW9ianMJCTo9IHNwY2E1MDUubworZ3NwY2Ffc3BjYTUwNi1vYmpzCQk6PSBzcGNhNTA2Lm8KK2dzcGNhX3NwY2E1MDgtb2JqcwkJOj0gc3BjYTUwOC5vCitnc3BjYV9zcGNhNTYxLW9ianMJCTo9IHNwY2E1NjEubworZ3NwY2Ffc3RrMDE0LW9ianMJCTo9IHN0azAxNC5vCitnc3BjYV9zdW5wbHVzLW9ianMJCTo9IHN1bnBsdXMubworZ3NwY2FfdDYxMy1vYmpzCQkJOj0gdDYxMy5vCitnc3BjYV90djg1MzItb2JqcwkJOj0gdHY4NTMyLm8KK2dzcGNhX3ZjMDMyeC1vYmpzCQk6PSB2YzAzMngubworZ3NwY2FfemMzeHgtb2JqcwkJOj0gemMzeHgubworCitvYmotJChDT05GSUdfVVNCX001NjAyKQkJKz0gbTU2MDIvCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYwppbmRleCA0ZDlmNGNjLi5hOWQ1MWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCkBAIC04MzcsMTIgKzgzNywxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAljeDExNjQ2X2luaXRzaXplKGdzcGNhX2Rldik7CiAJY3gxMTY0Nl9mdyhnc3BjYV9kZXYpOwogCWN4X3NlbnNvcihnc3BjYV9kZXYpOwogCWN4MTE2NDZfanBlZyhnc3BjYV9kZXYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzZF9zdG9wMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMKaW5kZXggNGZmMGUzOC4uM2JlMzBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYwpAQCAtNjkxLDcgKzY5MSw3IEBACiB9CiAKIC8qIC0tIHN0YXJ0IHRoZSBjYW1lcmEgLS0gKi8KLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIApAQCAtNzA0LDYgKzcwNCw3IEBACiAKIAlyZWdfd192YWwoZ3NwY2FfZGV2LCBFVF9SRVNFVF9BTEwsIDB4MDgpOwogCWV0X3ZpZGVvKGdzcGNhX2RldiwgMSk7CQkvKiB2aWRlbyBvbiAqLworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZmluZXBpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDNjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYwpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIEZ1amlmaWxtIEZpbmVwaXggc3ViZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEZyYW5rIFphZ28KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgImZpbmVwaXgiCisKKyNpbmNsdWRlICJnc3BjYS5oIgorCitNT0RVTEVfQVVUSE9SKCJGcmFuayBaYWdvIDxmcmFua0B6YWdvLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnVqaWZpbG0gRmluZVBpeCBVU0IgVjRMMiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogRGVmYXVsdCB0aW1lb3V0LCBpbiBtcyAqLworI2RlZmluZSBGUElYX1RJTUVPVVQgKEhaIC8gMTApCisKKy8qIE1heGltdW0gdHJhbnNmZXIgc2l6ZSB0byB1c2UuIFRoZSB3aW5kb3dzIGRyaXZlciByZWFkcyBieSBjaHVua3Mgb2YKKyAqIDB4MjAwMCBieXRlcywgc28gZG8gdGhlIHNhbWUuIE5vdGU6IHJlYWRpbmcgbW9yZSBzZWVtcyB0byB3b3JrCisgKiB0b28uICovCisjZGVmaW5lIEZQSVhfTUFYX1RSQU5TRkVSIDB4MjAwMAorCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworc3RydWN0IHVzYl9mcGl4IHsKKwlzdHJ1Y3QgZ3NwY2FfZGV2IGdzcGNhX2RldjsJLyogISEgbXVzdCBiZSB0aGUgZmlyc3QgaXRlbSAqLworCisJLyoKKwkgKiBVU0Igc3R1ZmYKKwkgKi8KKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGN0cmxyZXE7CisJc3RydWN0IHVyYiAqY29udHJvbF91cmI7CisJc3RydWN0IHRpbWVyX2xpc3QgYnVsa190aW1lcjsKKworCWVudW0geworCQlGUElYX05PUCwJLyogaW5hY3RpdmUsIGVsc2Ugc3RyZWFtaW5nICovCisJCUZQSVhfUkVTRVQsCS8qIG11c3QgcmVzZXQgKi8KKwkJRlBJWF9SRVFfRlJBTUUsCS8qIHJlcXVlc3RpbmcgYSBmcmFtZSAqLworCQlGUElYX1JFQURfRlJBTUUsCS8qIHJlYWRpbmcgZnJhbWUgKi8KKwl9IHN0YXRlOworCisJLyoKKwkgKiBEcml2ZXIgc3R1ZmYKKwkgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdxZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjYW5fY2xvc2U7CisJaW50IHN0cmVhbWluZzsKK307CisKKy8qIERlbGF5IGFmdGVyIHdoaWNoIGNsYWltIHRoZSBuZXh0IGZyYW1lLiBJZiB0aGUgZGVsYXkgaXMgdG9vIHNtYWxsLAorICogdGhlIGNhbWVyYSB3aWxsIHJldHVybiBvbGQgZnJhbWVzLiBPbiB0aGUgNDgwMFosIDIwbXMgaXMgYmFkLCAyNW1zCisgKiB3aWxsIGZhaWwgZXZlcnkgNCBvciA1IGZyYW1lcywgYnV0IDMwbXMgaXMgcGVyZmVjdC4gKi8KKyNkZWZpbmUgTkVYVF9GUkFNRV9ERUxBWSAgKCgoSFogKiAzMCkgKyA5OTkpIC8gMTAwMCkKKworI2RlZmluZSBkZXZfbmV3X3N0YXRlKG5ld19zdGF0ZSkgewkJCQlcCisJCVBERUJVRyhEX1NUUkVBTSwgIm5ldyBzdGF0ZSBmcm9tICVkIHRvICVkIGF0ICVzOiVkIiwJXAorCQkJZGV2LT5zdGF0ZSwgbmV3X3N0YXRlLCBfX2Z1bmNfXywgX19MSU5FX18pOwlcCisJCWRldi0+c3RhdGUgPSBuZXdfc3RhdGU7CQkJCQlcCit9CisKKy8qIFRoZXNlIGNhbWVyYXMgb25seSBzdXBwb3J0IDMyMHgyMDAuICovCitzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBmcGl4X21vZGVbMV0gPSB7CisJeyAzMjAsIDI0MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDMyMCwKKwkJLnNpemVpbWFnZSA9IDMyMCAqIDI0MCAqIDMgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDB9Cit9OworCisvKiBSZWFkcyBwYXJ0IG9mIGEgZnJhbWUgKi8KK3N0YXRpYyB2b2lkIHJlYWRfZnJhbWVfcGFydChzdHJ1Y3QgdXNiX2ZwaXggKmRldikKK3sKKwlpbnQgcmV0OworCisJUERFQlVHKERfU1RSRUFNLCAicmVhZF9mcmFtZV9wYXJ0Iik7CisKKwkvKiBSZWFkcyBwYXJ0IG9mIGEgZnJhbWUgKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmdzcGNhX2Rldi51cmJbMF0sIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJZGV2X25ld19zdGF0ZShGUElYX1JFU0VUKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPndxZSwgMSk7CisJCVBERUJVRyhEX1NUUkVBTSwgInVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoICVkIiwKKwkJCXJldCk7CisJfSBlbHNlIHsKKwkJLyogU29tZXRpbWVzIHdlIG5ldmVyIGdldCBhIGNhbGxiYWNrLCBzbyB1c2UgYSB0aW1lci4KKwkJICogSXMgdGhpcyBtYXNraW5nIGEgYnVnIHNvbWV3aGVyZSBlbHNlPyAqLworCQlkZXYtPmJ1bGtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDE1MCk7CisJCWFkZF90aW1lcigmZGV2LT5idWxrX3RpbWVyKTsKKwl9Cit9CisKKy8qIENhbGxiYWNrIGZvciBVUkJzLiAqLworc3RhdGljIHZvaWQgdXJiX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9mcGl4ICpkZXYgPSAoc3RydWN0IHVzYl9mcGl4ICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEX1BBQ0ssCisJCSJlbnRlciB1cmJfY2FsbGJhY2sgLSBzdGF0dXM9JWQsIGxlbmd0aD0lZCIsCisJCXVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJaWYgKGRldi0+c3RhdGUgPT0gRlBJWF9SRUFEX0ZSQU1FKQorCQlkZWxfdGltZXIoJmRldi0+YnVsa190aW1lcik7CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQkvKiBXZSBraWxsIGEgc3R1Y2sgdXJiIGV2ZXJ5IDUwIGZyYW1lcyBvbiBhdmVyYWdlLCBzbyBkb24ndAorCQkgKiBkaXNwbGF5IGEgbG9nIG1lc3NhZ2UgZm9yIHRoYXQuICovCisJCWlmICh1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKKwkJCVBERUJVRyhEX1NUUkVBTSwgImJhZCBVUkIgc3RhdHVzICVkIiwgdXJiLT5zdGF0dXMpOworCQlkZXZfbmV3X3N0YXRlKEZQSVhfUkVTRVQpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+d3FlLCAxKTsKKwl9CisKKwlzd2l0Y2ggKGRldi0+c3RhdGUpIHsKKwljYXNlIEZQSVhfUkVRX0ZSQU1FOgorCQlkZXZfbmV3X3N0YXRlKEZQSVhfUkVBRF9GUkFNRSk7CisJCXJlYWRfZnJhbWVfcGFydChkZXYpOworCQlicmVhazsKKworCWNhc2UgRlBJWF9SRUFEX0ZSQU1FOiB7CisJCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZTsKKworCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKCZkZXYtPmdzcGNhX2Rldik7CisJCWlmIChmcmFtZSA9PSBOVUxMKQorCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCBGUElYX01BWF9UUkFOU0ZFUiB8fAorCQkJKGRhdGFbdXJiLT5hY3R1YWxfbGVuZ3RoLTJdID09IDB4ZmYgJiYKKwkJCQlkYXRhW3VyYi0+YWN0dWFsX2xlbmd0aC0xXSA9PSAweGQ5KSkgeworCisJCQkvKiBJZiB0aGUgcmVzdWx0IGlzIGxlc3MgdGhhbiB3aGF0IHdhcyBhc2tlZAorCQkJICogZm9yLCB0aGVuIGl0J3MgdGhlIGVuZCBvZiB0aGUKKwkJCSAqIGZyYW1lLiBTb21ldGltZSB0aGUganBlZyBpcyBub3QgY29tcGxldGUsCisJCQkgKiBidXQgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkby4gV2UgYWxzbyBlbmQKKwkJCSAqIGhlcmUgaWYgdGhlIHRoZSBqcGVnIGVuZHMgcmlnaHQgYXQgdGhlIGVuZAorCQkJICogb2YgdGhlIGZyYW1lLiAqLworCQkJaWYgKGZyYW1lKQorCQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULAorCQkJCQkJZnJhbWUsCisJCQkJCQlkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJZGV2X25ld19zdGF0ZShGUElYX1JFUV9GUkFNRSk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+d3FlLCBORVhUX0ZSQU1FX0RFTEFZKTsKKwkJfSBlbHNlIHsKKworCQkJLyogZ290IGEgcGFydGlhbCBpbWFnZSAqLworCQkJaWYgKGZyYW1lKQorCQkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsCisJCQkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUKKwkJCQkJCQkJPT0gTEFTVF9QQUNLRVQKKwkJCQkJCT8gRklSU1RfUEFDS0VUIDogSU5URVJfUEFDS0VULAorCQkJCQkJZnJhbWUsCisJCQkJCWRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlyZWFkX2ZyYW1lX3BhcnQoZGV2KTsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCisJY2FzZSBGUElYX05PUDoKKwljYXNlIEZQSVhfUkVTRVQ6CisJCVBERUJVRyhEX1NUUkVBTSwgImludmFsaWQgc3RhdGUgJWQiLCBkZXYtPnN0YXRlKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBSZXF1ZXN0IGEgbmV3IGZyYW1lICovCitzdGF0aWMgdm9pZCByZXF1ZXN0X2ZyYW1lKHN0cnVjdCB1c2JfZnBpeCAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gJmRldi0+Z3NwY2FfZGV2OworCisJLyogU2V0dXAgY29tbWFuZCBwYWNrZXQgKi8KKwltZW1zZXQoZ3NwY2FfZGV2LT51c2JfYnVmLCAwLCAxMik7CisJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gMHhkMzsKKwlnc3BjYV9kZXYtPnVzYl9idWZbN10gPSAweDAxOworCisJLyogUmVxdWVzdCBhIGZyYW1lICovCisJZGV2LT5jdHJscmVxLmJSZXF1ZXN0VHlwZSA9CisJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFOworCWRldi0+Y3RybHJlcS5iUmVxdWVzdCA9IFVTQl9SRVFfR0VUX1NUQVRVUzsKKwlkZXYtPmN0cmxyZXEud1ZhbHVlID0gMDsKKwlkZXYtPmN0cmxyZXEud0luZGV4ID0gMDsKKwlkZXYtPmN0cmxyZXEud0xlbmd0aCA9IGNwdV90b19sZTE2KDEyKTsKKworCXVzYl9maWxsX2NvbnRyb2xfdXJiKGRldi0+Y29udHJvbF91cmIsCisJCQkgICAgIGdzcGNhX2Rldi0+ZGV2LAorCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJICAgICAodW5zaWduZWQgY2hhciAqKSAmZGV2LT5jdHJscmVxLAorCQkJICAgICBnc3BjYV9kZXYtPnVzYl9idWYsCisJCQkgICAgIDEyLCB1cmJfY2FsbGJhY2ssIGdzcGNhX2Rldik7CisKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmNvbnRyb2xfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0KSB7CisJCWRldl9uZXdfc3RhdGUoRlBJWF9SRVNFVCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT53cWUsIDEpOworCQlQREVCVUcoRF9TVFJFQU0sICJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCAlZCIsIHJldCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3RhdGUgbWFjaGluZS4gKi8KK3N0YXRpYyB2b2lkIGZwaXhfc20oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2JfZnBpeCAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfZnBpeCwgd3FlLndvcmspOworCisJUERFQlVHKERfU1RSRUFNLCAiZnBpeF9zbSBzdGF0ZSAlZCIsIGRldi0+c3RhdGUpOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKCFkZXYtPmdzcGNhX2Rldi5wcmVzZW50KSB7CisJCVBERUJVRyhEX1NUUkVBTSwgImRldmljZSBpcyBnb25lIik7CisJCWRldl9uZXdfc3RhdGUoRlBJWF9OT1ApOworCQljb21wbGV0ZSgmZGV2LT5jYW5fY2xvc2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFkZXYtPnN0cmVhbWluZykgeworCQlQREVCVUcoRF9TVFJFQU0sICJzdG9wcGluZyBzdGF0ZSBtYWNoaW5lIik7CisJCWRldl9uZXdfc3RhdGUoRlBJWF9OT1ApOworCQljb21wbGV0ZSgmZGV2LT5jYW5fY2xvc2UpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChkZXYtPnN0YXRlKSB7CisJY2FzZSBGUElYX1JFU0VUOgorCQlkZXZfbmV3X3N0YXRlKEZQSVhfUkVRX0ZSQU1FKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPndxZSwgSFogLyAxMCk7CisJCWJyZWFrOworCisJY2FzZSBGUElYX1JFUV9GUkFNRToKKwkJLyogZ2V0IGFuIGltYWdlICovCisJCXJlcXVlc3RfZnJhbWUoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIEZQSVhfTk9QOgorCWNhc2UgRlBJWF9SRUFEX0ZSQU1FOgorCQlQREVCVUcoRF9TVFJFQU0sICJpbnZhbGlkIHN0YXRlICVkIiwgZGV2LT5zdGF0ZSk7CisJCWJyZWFrOworCX0KK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgdGltZSAqLworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGNhbSAqY2FtID0gJmdzcGNhX2Rldi0+Y2FtOworCisJY2FtLT5jYW1fbW9kZSA9IGZwaXhfbW9kZTsKKwljYW0tPm5tb2RlcyA9IDE7CisJY2FtLT5lcGFkZHIgPSAweDAxOwkvKiB0b2RvOiBjb3JyZWN0IGZvciBhbGwgY2Ftcz8gKi8KKwljYW0tPmJ1bGtfc2l6ZSA9IEZQSVhfTUFYX1RSQU5TRkVSOworCisvKglnc3BjYV9kZXYtPm5iYWx0ID0gMTsJICogdXNlIGJ1bGsgdHJhbnNmZXIgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU3RvcCBzdHJlYW1pbmcgYW5kIGZyZWUgdGhlIHJlc3NvdXJjZXMgYWxsb2NhdGVkIGJ5IHNkX3N0YXJ0LiAqLworc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCB1c2JfZnBpeCAqZGV2ID0gKHN0cnVjdCB1c2JfZnBpeCAqKSBnc3BjYV9kZXY7CisKKwlkZXYtPnN0cmVhbWluZyA9IDA7CisKKwkvKiBTdG9wIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJaWYgKGRldi0+c3RhdGUgIT0gRlBJWF9OT1ApCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRldi0+Y2FuX2Nsb3NlKTsKKworCXVzYl9mcmVlX3VyYihkZXYtPmNvbnRyb2xfdXJiKTsKKwlkZXYtPmNvbnRyb2xfdXJiID0gTlVMTDsKK30KKworLyogS2lsbCBhbiBVUkIgdGhhdCBoYXNuJ3QgY29tcGxldGVkLiAqLworc3RhdGljIHZvaWQgdGltZW91dF9raWxsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKSBkYXRhOworCisJdXNiX3VubGlua191cmIodXJiKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCB1c2JfZnBpeCAqZGV2ID0gKHN0cnVjdCB1c2JfZnBpeCAqKSBnc3BjYV9kZXY7CisKKwlJTklUX0RFTEFZRURfV09SSygmZGV2LT53cWUsIGZwaXhfc20pOworCisJaW5pdF90aW1lcigmZGV2LT5idWxrX3RpbWVyKTsKKwlkZXYtPmJ1bGtfdGltZXIuZnVuY3Rpb24gPSB0aW1lb3V0X2tpbGw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHVzYl9mcGl4ICpkZXYgPSAoc3RydWN0IHVzYl9mcGl4ICopIGdzcGNhX2RldjsKKwlpbnQgcmV0OworCWludCBzaXplX3JldDsKKworCS8qIFJlc2V0IGJ1bGsgaW4gZW5kcG9pbnQgKi8KKwl1c2JfY2xlYXJfaGFsdChnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5jYW0uZXBhZGRyKTsKKworCS8qIEluaXQgdGhlIGRldmljZSAqLworCW1lbXNldChnc3BjYV9kZXYtPnVzYl9idWYsIDAsIDEyKTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweGM2OworCWdzcGNhX2Rldi0+dXNiX2J1Zls4XSA9IDB4MjA7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJVVNCX1JFUV9HRVRfU1RBVFVTLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8CisJCQlVU0JfUkVDSVBfSU5URVJGQUNFLCAwLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsCisJCQkxMiwgRlBJWF9USU1FT1VUKTsKKworCWlmIChyZXQgIT0gMTIpIHsKKwkJUERFQlVHKERfU1RSRUFNLCAidXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpIiwgcmV0KTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBSZWFkIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQuIElnbm9yZSB0aGUgcmVzdWx0LCBmb3IgaXQKKwkgKiB2YXJpZXMgd2l0aCB0aGUgZGV2aWNlLiAqLworCXJldCA9IHVzYl9idWxrX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCXVzYl9yY3ZidWxrcGlwZShnc3BjYV9kZXYtPmRldiwKKwkJCQkJZ3NwY2FfZGV2LT5jYW0uZXBhZGRyKSwKKwkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgRlBJWF9NQVhfVFJBTlNGRVIsICZzaXplX3JldCwKKwkJCUZQSVhfVElNRU9VVCk7CisJaWYgKHJldCAhPSAwKSB7CisJCVBERUJVRyhEX1NUUkVBTSwgInVzYl9idWxrX21zZyBmYWlsZWQgKCVkKSIsIHJldCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogUmVxdWVzdCBhIGZyYW1lLCBidXQgZG9uJ3QgcmVhZCBpdCAqLworCW1lbXNldChnc3BjYV9kZXYtPnVzYl9idWYsIDAsIDEyKTsKKwlnc3BjYV9kZXYtPnVzYl9idWZbMF0gPSAweGQzOworCWdzcGNhX2Rldi0+dXNiX2J1Zls3XSA9IDB4MDE7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJVVNCX1JFUV9HRVRfU1RBVFVTLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8CisJCQlVU0JfUkVDSVBfSU5URVJGQUNFLCAwLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsCisJCQkxMiwgRlBJWF9USU1FT1VUKTsKKwlpZiAocmV0ICE9IDEyKSB7CisJCVBERUJVRyhEX1NUUkVBTSwgInVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKSIsIHJldCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogQWdhaW4sIHJlc2V0IGJ1bGsgaW4gZW5kcG9pbnQgKi8KKwl1c2JfY2xlYXJfaGFsdChnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5jYW0uZXBhZGRyKTsKKworCS8qIEFsbG9jYXRlIGEgY29udHJvbCBVUkIgKi8KKwlkZXYtPmNvbnRyb2xfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+Y29udHJvbF91cmIpIHsKKwkJUERFQlVHKERfU1RSRUFNLCAiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZSIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFZhcmlvdXMgaW5pdGlhbGl6YXRpb25zLiAqLworCWluaXRfY29tcGxldGlvbigmZGV2LT5jYW5fY2xvc2UpOworCWRldi0+YnVsa190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2LT5nc3BjYV9kZXYudXJiWzBdOworCWRldi0+Z3NwY2FfZGV2LnVyYlswXS0+Y29tcGxldGUgPSB1cmJfY2FsbGJhY2s7CisJZGV2LT5zdHJlYW1pbmcgPSAxOworCisJLyogU2NoZWR1bGUgYSBmcmFtZSByZXF1ZXN0LiAqLworCWRldl9uZXdfc3RhdGUoRlBJWF9SRVFfRlJBTUUpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT53cWUsIDEpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCS8qIEZyZWUgdGhlIHJlc3NvdXJjZXMgKi8KKwlzZF9zdG9wTihnc3BjYV9kZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRhYmxlIG9mIHN1cHBvcnRlZCBVU0IgZGV2aWNlcyAqLworc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMDQpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDEwOSl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTBiKX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMGYpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDExMSl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTEzKX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMTUpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDExNyl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTE5KX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMWIpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDExZCl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTIxKX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMjMpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDEyNSl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTI3KX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMjkpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDEyYil9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTJkKX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxMmYpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDEzMSl9LAorCXtVU0JfREVWSUNFKDB4MDRjYiwgMHgwMTNiKX0sCisJe1VTQl9ERVZJQ0UoMHgwNGNiLCAweDAxM2QpfSwKKwl7VVNCX0RFVklDRSgweDA0Y2IsIDB4MDEzZil9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuY29uZmlnID0gc2RfY29uZmlnLAorCS5pbml0ID0gc2RfaW5pdCwKKwkuc3RhcnQgPSBzZF9zdGFydCwKKwkuc3RvcE4gPSBzZF9zdG9wTiwKK307CisKKy8qIC0tIGRldmljZSBjb25uZWN0IC0tICovCitzdGF0aWMgaW50IHNkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwKKwkJCSZzZF9kZXNjLAorCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZnBpeCksCisJCQlUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgPSBkZXZpY2VfdGFibGUsCisJLnByb2JlID0gc2RfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnc3BjYV9kaXNjb25uZWN0LAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gZ3NwY2Ffc3VzcGVuZCwKKwkucmVzdW1lID0gZ3NwY2FfcmVzdW1lLAorI2VuZGlmCit9OworCisvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCitzdGF0aWMgaW50IF9faW5pdCBzZF9tb2RfaW5pdCh2b2lkKQoreworCWlmICh1c2JfcmVnaXN0ZXIoJnNkX2RyaXZlcikgPCAwKQorCQlyZXR1cm4gLTE7CisJUERFQlVHKERfUFJPQkUsICJyZWdpc3RlcmVkIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgc2RfbW9kX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlQREVCVUcoRF9QUk9CRSwgImRlcmVnaXN0ZXJlZCIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKaW5kZXggN2JlNjkyOC4uYzIxYWYzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC00Myw3ICs0NCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBIFVTQiBDYW1lcmEgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT05fTlVNQkVSCUtFUk5FTF9WRVJTSU9OKDIsIDIsIDApCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigyLCAzLCAwKQogCiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CiAKQEAgLTEwMiw2ICsxMDMsMjIgQEAKIAkuY2xvc2UJCT0gZ3NwY2Ffdm1fY2xvc2UsCiB9OwogCisvKiBnZXQgdGhlIGN1cnJlbnQgaW5wdXQgZnJhbWUgYnVmZmVyICovCitzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmdzcGNhX2dldF9pX2ZyYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOworCWludCBpOworCisJaSA9IGdzcGNhX2Rldi0+ZnJfaTsKKwlpID0gZ3NwY2FfZGV2LT5mcl9xdWV1ZVtpXTsKKwlmcmFtZSA9ICZnc3BjYV9kZXYtPmZyYW1lW2ldOworCWlmICgoZnJhbWUtPnY0bDJfYnVmLmZsYWdzICYgQlVGX0FMTF9GTEFHUykKKwkJCQkhPSBWNEwyX0JVRl9GTEFHX1FVRVVFRCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGZyYW1lOworfQorRVhQT1JUX1NZTUJPTChnc3BjYV9nZXRfaV9mcmFtZSk7CisKIC8qCiAgKiBmaWxsIGEgdmlkZW8gZnJhbWUgZnJvbSBhbiBVUkIgYW5kIHJlc3VibWl0CiAgKi8KQEAgLTExMCw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWU7CiAJX191OCAqZGF0YTsJCS8qIGFkZHJlc3Mgb2YgZGF0YSBpbiB0aGUgaXNvIG1lc3NhZ2UgKi8KLQlpbnQgaSwgaiwgbGVuLCBzdDsKKwlpbnQgaSwgbGVuLCBzdDsKIAljYW1fcGt0X29wIHBrdF9zY2FuOwogCiAJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKQEAgLTEyNCwxMSArMTQxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CiAKIAkJLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZnJhbWUgYnVmZmVyICovCi0JCWogPSBnc3BjYV9kZXYtPmZyX2k7Ci0JCWogPSBnc3BjYV9kZXYtPmZyX3F1ZXVlW2pdOwotCQlmcmFtZSA9ICZnc3BjYV9kZXYtPmZyYW1lW2pdOwotCQlpZiAoKGZyYW1lLT52NGwyX2J1Zi5mbGFncyAmIEJVRl9BTExfRkxBR1MpCi0JCQkJCSE9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEKSB7CisJCWZyYW1lID0gZ3NwY2FfZ2V0X2lfZnJhbWUoZ3NwY2FfZGV2KTsKKwkJaWYgKCFmcmFtZSkgewogCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMTc4LDYgKzE5MiwzOSBAQAogfQogCiAvKgorICogYnVsayBtZXNzYWdlIGludGVycnVwdCBmcm9tIHRoZSBVU0IgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGJ1bGtfaXJxKHN0cnVjdCB1cmIgKnVyYgorKQoreworCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiA9IChzdHJ1Y3QgZ3NwY2FfZGV2ICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOworCisJUERFQlVHKERfUEFDSywgImJ1bGsgaXJxIik7CisJaWYgKCFnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJcmV0dXJuOworCWlmICh1cmItPnN0YXR1cyAhPSAwICYmIHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKSB7CisjaWZkZWYgQ09ORklHX1BNCisJCWlmICghZ3NwY2FfZGV2LT5mcm96ZW4pCisjZW5kaWYKKwkJCVBERUJVRyhEX0VSUnxEX1BBQ0ssICJ1cmIgc3RhdHVzOiAlZCIsIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOwkJLyogZGlzY29ubmVjdGlvbiA/ICovCisJfQorCisJLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZnJhbWUgYnVmZmVyICovCisJZnJhbWUgPSBnc3BjYV9nZXRfaV9mcmFtZShnc3BjYV9kZXYpOworCWlmICghZnJhbWUpIHsKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJfSBlbHNlIHsKKwkJUERFQlVHKERfUEFDSywgInBhY2tldCBsOiVkIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5wa3Rfc2Nhbihnc3BjYV9kZXYsCisJCQkJCWZyYW1lLAorCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9Cit9CisKKy8qCiAgKiBhZGQgZGF0YSB0byB0aGUgY3VycmVudCBmcmFtZQogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzdWJkcml2ZXJzIGF0IGludGVycnVwdCBsZXZlbC4KQEAgLTE5MCw3ICsyMzcsNyBAQAogICogT24gTEFTVF9QQUNLRVQsIGEgbmV3IGZyYW1lIGlzIHJldHVybmVkLgogICovCiBzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmdzcGNhX2ZyYW1lX2FkZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQkJICAgIGludCBwYWNrZXRfdHlwZSwKKwkJCQkgICAgZW51bSBnc3BjYV9wYWNrZXRfdHlwZSBwYWNrZXRfdHlwZSwKIAkJCQkgICAgc3RydWN0IGdzcGNhX2ZyYW1lICpmcmFtZSwKIAkJCQkgICAgY29uc3QgX191OCAqZGF0YSwKIAkJCQkgICAgaW50IGxlbikKQEAgLTIzMiw3ICsyNzksNyBAQAogCX0KIAlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKIAotCS8qIGlmIGxhc3QgcGFja2V0LCB3YWtlIHRoZSBhcHBsaWNhdGlvbiBhbmQgYWR2YW5jZSBpbiB0aGUgcXVldWUgKi8KKwkvKiBpZiBsYXN0IHBhY2tldCwgd2FrZSB1cCB0aGUgYXBwbGljYXRpb24gYW5kIGFkdmFuY2UgaW4gdGhlIHF1ZXVlICovCiAJaWYgKHBhY2tldF90eXBlID09IExBU1RfUEFDS0VUKSB7CiAJCWZyYW1lLT52NGwyX2J1Zi5ieXRlc3VzZWQgPSBmcmFtZS0+ZGF0YV9lbmQgLSBmcmFtZS0+ZGF0YTsKIAkJZnJhbWUtPnY0bDJfYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKQEAgLTI3MCw3ICszMTcsNiBAQAogCXZvaWQgKm1lbTsKIAl1bnNpZ25lZCBsb25nIGFkcjsKIAotLyoJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CShhbHJlYWR5IGRvbmUpICovCiAJbWVtID0gdm1hbGxvY18zMihzaXplKTsKIAlpZiAobWVtICE9IE5VTEwpIHsKIAkJYWRyID0gKHVuc2lnbmVkIGxvbmcpIG1lbTsKQEAgLTM3NCwxMCArNDIwLDExIEBACiB9CiAKIC8qCi0gKiBzZWFyY2ggYW4gaW5wdXQgaXNvY2hyb25vdXMgZW5kcG9pbnQgaW4gYW4gYWx0ZXJuYXRlIHNldHRpbmcKKyAqIGxvb2sgZm9yIGFuIGlucHV0IHRyYW5zZmVyIGVuZHBvaW50IGluIGFuIGFsdGVybmF0ZSBzZXR0aW5nCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmFsdF9pc29jKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKLQkJCQkJICBfX3U4IGVwYWRkcikKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmFsdF94ZmVyKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCwKKwkJCQkJICBfX3U4IGVwYWRkciwKKwkJCQkJICBfX3U4IHhmZXIpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKIAlpbnQgaSwgYXR0cjsKQEAgLTM4OCw3ICs0MzUsNyBAQAogCQlpZiAoZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyA9PSBlcGFkZHIpIHsKIAkJCWF0dHIgPSBlcC0+ZGVzYy5ibUF0dHJpYnV0ZXMKIAkJCQkJCSYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0s7Ci0JCQlpZiAoYXR0ciA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJaWYgKGF0dHIgPT0geGZlcikKIAkJCQlyZXR1cm4gZXA7CiAJCQlicmVhazsKIAkJfQpAQCAtMzk3LDE0ICs0NDQsMTQgQEAKIH0KIAogLyoKLSAqIHNlYXJjaCBhbiBpbnB1dCBpc29jaHJvbm91cyBlbmRwb2ludAorICogbG9vayBmb3IgYW4gaW5wdXQgKGlzb2Mgb3IgYnVsaykgZW5kcG9pbnQKICAqCiAgKiBUaGUgZW5kcG9pbnQgaXMgZGVmaW5lZCBieSB0aGUgc3ViZHJpdmVyLgogICogVXNlIG9ubHkgdGhlIGZpcnN0IGlzb2MgKHNvbWUgWm9yYW4gLSAweDA1NzI6MHgwMDAxIC0gaGF2ZSB0d28gc3VjaCBlcCkuCiAgKiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBtYW55IHRpbWVzIHdoZW4gdGhlIGJhbmR3aWR0aCBpcyB0b28gc21hbGwKICAqICh0aGUgYmFuZHdpZHRoIGlzIGNoZWNrZWQgb24gdXJiIHN1Ym1pdCkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmdldF9pc29jX2VwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmdldF9lcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKQEAgLTQxMywyOCArNDYwLDQxIEBACiAJaW50ZiA9IHVzYl9pZm51bV90b19pZihnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSk7CiAJZXAgPSBOVUxMOwogCWkgPSBnc3BjYV9kZXYtPmFsdDsJCQkvKiBwcmV2aW91cyBhbHQgc2V0dGluZyAqLworCisJLyogdHJ5IGlzb2MgKi8KIAl3aGlsZSAoLS1pID4gMCkgewkJCS8qIGFsdCAwIGlzIHVudXNhYmxlICovCi0JCWVwID0gYWx0X2lzb2MoJmludGYtPmFsdHNldHRpbmdbaV0sIGdzcGNhX2Rldi0+Y2FtLmVwYWRkcik7CisJCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbaV0sCisJCQkJZ3NwY2FfZGV2LT5jYW0uZXBhZGRyLAorCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpOwogCQlpZiAoZXApCiAJCQlicmVhazsKIAl9CisKKwkvKiBpZiBubyBpc29jLCB0cnkgYnVsayAqLwogCWlmIChlcCA9PSBOVUxMKSB7Ci0JCWVycigibm8gSVNPQyBlbmRwb2ludCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKKwkJZXAgPSBhbHRfeGZlcigmaW50Zi0+YWx0c2V0dGluZ1swXSwKKwkJCQlnc3BjYV9kZXYtPmNhbS5lcGFkZHIsCisJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSyk7CisJCWlmIChlcCA9PSBOVUxMKSB7CisJCQllcnIoIm5vIHRyYW5zZmVyIGVuZHBvaW50IGZvdW5kIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KLQlQREVCVUcoRF9TVFJFQU0sICJ1c2UgSVNPQyBhbHQgJWQgZXAgMHglMDJ4IiwKKwlQREVCVUcoRF9TVFJFQU0sICJ1c2UgYWx0ICVkIGVwIDB4JTAyeCIsCiAJCQlpLCBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKLQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSwgaSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZXJyKCJzZXQgaW50ZXJmYWNlIGVyciAlZCIsIHJldCk7Ci0JCXJldHVybiBOVUxMOworCWlmIChpID4gMCkgeworCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSwgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIoInNldCBpbnRlcmZhY2UgZXJyICVkIiwgcmV0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQogCWdzcGNhX2Rldi0+YWx0ID0gaTsJCS8qIG1lbW9yaXplIHRoZSBjdXJyZW50IGFsdCBzZXR0aW5nICovCiAJcmV0dXJuIGVwOwogfQogCiAvKgotICogY3JlYXRlIHRoZSBpc29jaHJvbm91cyBVUkJzCisgKiBjcmVhdGUgdGhlIFVSQnMgZm9yIGltYWdlIHRyYW5zZmVyCiAgKi8KIHN0YXRpYyBpbnQgY3JlYXRlX3VyYnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAogCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKQEAgLTQ0NSwyMCArNTA1LDMzIEBACiAJLyogY2FsY3VsYXRlIHRoZSBwYWNrZXQgc2l6ZSBhbmQgdGhlIG51bWJlciBvZiBwYWNrZXRzICovCiAJcHNpemUgPSBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAKLQkvKiBTZWUgcGFyYWdyYXBoIDUuOSAvIHRhYmxlIDUtMTEgb2YgdGhlIHVzYiAyLjAgc3BlYy4gKi8KLQlwc2l6ZSA9IChwc2l6ZSAmIDB4MDdmZikgKiAoMSArICgocHNpemUgPj4gMTEpICYgMykpOwotCW5wa3QgPSBJU09fTUFYX1NJWkUgLyBwc2l6ZTsKLQlpZiAobnBrdCA+IElTT19NQVhfUEtUKQotCQlucGt0ID0gSVNPX01BWF9QS1Q7Ci0JYnNpemUgPSBwc2l6ZSAqIG5wa3Q7Ci0JUERFQlVHKERfU1RSRUFNLAotCQkiaXNvYyAlZCBwa3RzIHNpemUgJWQgKGJzaXplOiVkKSIsIG5wa3QsIHBzaXplLCBic2l6ZSk7Ci0JbnVyYnMgPSBERUZfTlVSQlM7CisJaWYgKGdzcGNhX2Rldi0+YWx0ICE9IDApIHsJCS8qIGlzb2MgKi8KKworCQkvKiBTZWUgcGFyYWdyYXBoIDUuOSAvIHRhYmxlIDUtMTEgb2YgdGhlIHVzYiAyLjAgc3BlYy4gKi8KKwkJcHNpemUgPSAocHNpemUgJiAweDA3ZmYpICogKDEgKyAoKHBzaXplID4+IDExKSAmIDMpKTsKKwkJbnBrdCA9IElTT19NQVhfU0laRSAvIHBzaXplOworCQlpZiAobnBrdCA+IElTT19NQVhfUEtUKQorCQkJbnBrdCA9IElTT19NQVhfUEtUOworCQlic2l6ZSA9IHBzaXplICogbnBrdDsKKwkJUERFQlVHKERfU1RSRUFNLAorCQkJImlzb2MgJWQgcGt0cyBzaXplICVkID0gYnNpemU6JWQiLAorCQkJbnBrdCwgcHNpemUsIGJzaXplKTsKKwkJbnVyYnMgPSBERUZfTlVSQlM7CisJfSBlbHNlIHsJCQkJLyogYnVsayAqLworCQlucGt0ID0gMDsKKwkJYnNpemUgPSBnc3BjYV9kZXYtPmNhbS4JYnVsa19zaXplOworCQlpZiAoYnNpemUgPT0gMCkKKwkJCWJzaXplID0gcHNpemU7CisJCVBERUJVRyhEX1NUUkVBTSwgImJ1bGsgYnNpemU6JWQiLCBic2l6ZSk7CisJCW51cmJzID0gMTsKKwl9CisKIAlnc3BjYV9kZXYtPm51cmJzID0gbnVyYnM7CiAJZm9yIChuID0gMDsgbiA8IG51cmJzOyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGt0LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKIAkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJCWRlc3Ryb3lfdXJicyhnc3BjYV9kZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKGdzcGNhX2Rldi0+ZGV2LApAQCAtNDY4LDI0ICs1NDEsMzEgQEAKIAogCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCQlkZXN0cm95X3VyYnMoZ3NwY2FfZGV2KTsKIAkJCWVycigidXNiX2J1ZmZlcl91cmIgZmFpbGVkIik7CisJCQlkZXN0cm95X3VyYnMoZ3NwY2FfZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWdzcGNhX2Rldi0+dXJiW25dID0gdXJiOwogCQl1cmItPmRldiA9IGdzcGNhX2Rldi0+ZGV2OwogCQl1cmItPmNvbnRleHQgPSBnc3BjYV9kZXY7Ci0JCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShnc3BjYV9kZXYtPmRldiwKLQkJCQkJICAgIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQCi0JCQkJCXwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCXVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7Ci0JCXVyYi0+Y29tcGxldGUgPSBpc29jX2lycTsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG5wa3Q7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJzaXplOwotCQlmb3IgKGkgPSAwOyBpIDwgbnBrdDsgaSsrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHBzaXplOwotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBwc2l6ZSAqIGk7CisJCWlmIChucGt0ICE9IDApIHsJCS8qIElTT0MgKi8KKwkJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShnc3BjYV9kZXYtPmRldiwKKwkJCQkJCSAgICBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAKKwkJCQkJfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJCXVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CisJCQl1cmItPmNvbXBsZXRlID0gaXNvY19pcnE7CisJCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gbnBrdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBucGt0OyBpKyspIHsKKwkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHBzaXplOworCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gcHNpemUgKiBpOworCQkJfQorCQl9IGVsc2UgewkJLyogYnVsayAqLworCQkJdXJiLT5waXBlID0gdXNiX3JjdmJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LAorCQkJCQkJZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyksCisJCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCQl1cmItPmNvbXBsZXRlID0gYnVsa19pcnE7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC01MDcsNyArNTg3LDcgQEAKIAlnc3BjYV9kZXYtPmFsdCA9IGdzcGNhX2Rldi0+bmJhbHQ7CiAJZm9yICg7OykgewogCQlQREVCVUcoRF9TVFJFQU0sICJpbml0IHRyYW5zZmVyIGFsdCAlZCIsIGdzcGNhX2Rldi0+YWx0KTsKLQkJZXAgPSBnZXRfaXNvY19lcChnc3BjYV9kZXYpOworCQllcCA9IGdldF9lcChnc3BjYV9kZXYpOwogCQlpZiAoZXAgPT0gTlVMTCkgewogCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gb3V0OwpAQCAtNTE3LDEwICs1OTcsMTggQEAKIAkJCWdvdG8gb3V0OwogCiAJCS8qIHN0YXJ0IHRoZSBjYW0gKi8KLQkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5zdGFydChnc3BjYV9kZXYpOworCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPnN0YXJ0KGdzcGNhX2Rldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXN0cm95X3VyYnMoZ3NwY2FfZGV2KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWdzcGNhX2Rldi0+c3RyZWFtaW5nID0gMTsKIAkJYXRvbWljX3NldCgmZ3NwY2FfZGV2LT5uZXZlbnQsIDApOwogCisJCS8qIGJ1bGsgdHJhbnNmZXJzIGFyZSBzdGFydGVkIGJ5IHRoZSBzdWJkcml2ZXIgKi8KKwkJaWYgKGdzcGNhX2Rldi0+YWx0ID09IDApCisJCQlicmVhazsKKwogCQkvKiBzdWJtaXQgdGhlIFVSQnMgKi8KIAkJZm9yIChuID0gMDsgbiA8IGdzcGNhX2Rldi0+bnVyYnM7IG4rKykgewogCQkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoZ3NwY2FfZGV2LT51cmJbbl0sIEdGUF9LRVJORUwpOwpAQCAtNTUyLDcgKzY0MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogTm90ZSBib3RoIHRoZSBxdWV1ZSBhbmQgdGhlIHVzYiBsb2NrIHNob3VsZCBiZSBob2xkIHdoZW4gY2FsbGluZyB0aGlzICovCisvKiBOb3RlOiBib3RoIHRoZSBxdWV1ZSBhbmQgdGhlIHVzYiBsb2NrcyBzaG91bGQgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyAqLwogc3RhdGljIHZvaWQgZ3NwY2Ffc3RyZWFtX29mZihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJZ3NwY2FfZGV2LT5zdHJlYW1pbmcgPSAwOwpAQCAtNzU4LDYgKzg0NiwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGdzcGNhX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGdzcGNhX2Rldiwga3JlZik7CisKKwlQREVCVUcoRF9TVFJFQU0sICJkZXZpY2UgZGVsZXRlZCIpOworCisJa2ZyZWUoZ3NwY2FfZGV2LT51c2JfYnVmKTsKKwlrZnJlZShnc3BjYV9kZXYpOworfQorCiBzdGF0aWMgaW50IGRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldjsKQEAgLTc3NywxMyArODc1LDE5IEBACiAJCWdvdG8gb3V0OwogCX0KIAlnc3BjYV9kZXYtPnVzZXJzKys7CisKKwkvKiBvbmUgbW9yZSB1c2VyICovCisJa3JlZl9nZXQoJmdzcGNhX2Rldi0+a3JlZik7CisKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBnc3BjYV9kZXY7CiAjaWZkZWYgR1NQQ0FfREVCVUcKIAkvKiBhY3RpdmF0ZSB0aGUgdjRsMiBkZWJ1ZyAqLwogCWlmIChnc3BjYV9kZWJ1ZyAmIERfVjRMMikKLQkJZ3NwY2FfZGV2LT52ZGV2LmRlYnVnIHw9IDM7CisJCWdzcGNhX2Rldi0+dmRldi5kZWJ1ZyB8PSBWNEwyX0RFQlVHX0lPQ1RMCisJCQkJCXwgVjRMMl9ERUJVR19JT0NUTF9BUkc7CiAJZWxzZQotCQlnc3BjYV9kZXYtPnZkZXYuZGVidWcgJj0gfjM7CisJCWdzcGNhX2Rldi0+dmRldi5kZWJ1ZyAmPSB+KFY0TDJfREVCVUdfSU9DVEwKKwkJCQkJfCBWNEwyX0RFQlVHX0lPQ1RMX0FSRyk7CiAjZW5kaWYKIAlyZXQgPSAwOwogb3V0OgpAQCAtODE3LDcgKzkyMSwxMSBAQAogCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT5xdWV1ZV9sb2NrKTsKKwogCVBERUJVRyhEX1NUUkVBTSwgImNsb3NlIGRvbmUiKTsKKworCWtyZWZfcHV0KCZnc3BjYV9kZXYtPmtyZWYsIGdzcGNhX2RlbGV0ZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODI4LDcgKzkzNiw2IEBACiAKIAltZW1zZXQoY2FwLCAwLCBzaXplb2YgKmNhcCk7CiAJc3RybmNweShjYXAtPmRyaXZlciwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uYW1lLCBzaXplb2YgY2FwLT5kcml2ZXIpOwotLyoJc3RybmNweShjYXAtPmNhcmQsIGdzcGNhX2Rldi0+Y2FtLmRldl9uYW1lLCBzaXplb2YgY2FwLT5jYXJkKTsgKi8KIAlpZiAoZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QgIT0gTlVMTCkgewogCQlzdHJuY3B5KGNhcC0+Y2FyZCwgZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QsCiAJCQlzaXplb2YgY2FwLT5jYXJkKTsKQEAgLTE0NjIsNyArMTU2OSw2IEBACiAJfQogCiAJZnJhbWUtPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotLyoJZnJhbWUtPnY0bDJfYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX0RPTkU7ICovCiAKIAlpZiAoZnJhbWUtPnY0bDJfYnVmLm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSKSB7CiAJCWZyYW1lLT52NGwyX2J1Zi5tLnVzZXJwdHIgPSB2NGwyX2J1Zi0+bS51c2VycHRyOwpAQCAtMTYwOSw3ICsxNzE1LDcgQEAKIAkJfQogCiAJCS8qIGlmIHRoZSBwcm9jZXNzIHNsZXB0IGZvciBtb3JlIHRoYW4gMSBzZWNvbmQsCi0JCSAqIGdldCBhbmV3ZXIgZnJhbWUgKi8KKwkJICogZ2V0IGEgbmV3ZXIgZnJhbWUgKi8KIAkJZnJhbWUgPSAmZ3NwY2FfZGV2LT5mcmFtZVt2NGwyX2J1Zi5pbmRleF07CiAJCWlmICgtLW4gPCAwKQogCQkJYnJlYWs7CQkJLyogYXZvaWQgaW5maW5pdGUgbG9vcCAqLwpAQCAtMTcyNywyMSArMTgzMywyMSBAQAogCWlmIChkZXZfc2l6ZSA8IHNpemVvZiAqZ3NwY2FfZGV2KQogCQlkZXZfc2l6ZSA9IHNpemVvZiAqZ3NwY2FfZGV2OwogCWdzcGNhX2RldiA9IGt6YWxsb2MoZGV2X3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChnc3BjYV9kZXYgPT0gTlVMTCkgeworCWlmICghZ3NwY2FfZGV2KSB7CiAJCWVycigiY291bGRuJ3Qga3phbGxvYyBnc3BjYSBzdHJ1Y3QiKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PTUVNOwogCX0KKwlrcmVmX2luaXQoJmdzcGNhX2Rldi0+a3JlZik7CiAJZ3NwY2FfZGV2LT51c2JfYnVmID0ga21hbGxvYyhVU0JfQlVGX1NaLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdzcGNhX2Rldi0+dXNiX2J1ZikgewogCQllcnIoIm91dCBvZiBtZW1vcnkiKTsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCWdzcGNhX2Rldi0+ZGV2ID0gZGV2OwogCWdzcGNhX2Rldi0+aWZhY2UgPSBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXI7CiAJZ3NwY2FfZGV2LT5uYmFsdCA9IGludGYtPm51bV9hbHRzZXR0aW5nOwogCWdzcGNhX2Rldi0+c2RfZGVzYyA9IHNkX2Rlc2M7Ci0vKglnc3BjYV9kZXYtPnVzZXJzID0gMDsJCQkoZG9uZSBieSBremFsbG9jKSAqLwogCWdzcGNhX2Rldi0+bmJ1ZnJlYWQgPSAyOwogCiAJLyogY29uZmlndXJlIHRoZSBzdWJkcml2ZXIgYW5kIGluaXRpYWxpemUgdGhlIFVTQiBkZXZpY2UgKi8KQEAgLTE3ODAsOCArMTg4Niw3IEBACiAJUERFQlVHKERfUFJPQkUsICJwcm9iZSBvayIpOwogCXJldHVybiAwOwogb3V0OgotCWtmcmVlKGdzcGNhX2Rldi0+dXNiX2J1Zik7Ci0Ja2ZyZWUoZ3NwY2FfZGV2KTsKKwlrcmVmX3B1dCgmZ3NwY2FfZGV2LT5rcmVmLCBnc3BjYV9kZWxldGUpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGdzcGNhX2Rldl9wcm9iZSk7CkBAIC0xNzk2LDI1ICsxOTAxLDE2IEBACiB7CiAJc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAotCWlmICghZ3NwY2FfZGV2KQotCQlyZXR1cm47Ci0JZ3NwY2FfZGV2LT5wcmVzZW50ID0gMDsKLQltdXRleF9sb2NrKCZnc3BjYV9kZXYtPnF1ZXVlX2xvY2spOwotCW11dGV4X2xvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwotCWdzcGNhX2Rldi0+c3RyZWFtaW5nID0gMDsKLQlkZXN0cm95X3VyYnMoZ3NwY2FfZGV2KTsKLQltdXRleF91bmxvY2soJmdzcGNhX2Rldi0+dXNiX2xvY2spOwotCW11dGV4X3VubG9jaygmZ3NwY2FfZGV2LT5xdWV1ZV9sb2NrKTsKLQl3aGlsZSAoZ3NwY2FfZGV2LT51c2VycyAhPSAwKSB7CQkvKiB3YWl0IHVudGlsIGZ1bGx5IGNsb3NlZCAqLwotCQlhdG9taWNfaW5jKCZnc3BjYV9kZXYtPm5ldmVudCk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ3NwY2FfZGV2LT53cSk7CS8qIHdha2UgcHJvY2Vzc2VzICovCi0JCXNjaGVkdWxlKCk7Ci0JfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKIC8qIFdlIGRvbid0IHdhbnQgcGVvcGxlIHRyeWluZyB0byBvcGVuIHVwIHRoZSBkZXZpY2UgKi8KIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmZ3NwY2FfZGV2LT52ZGV2KTsKLS8qIEZyZWUgdGhlIG1lbW9yeSAqLwotCWtmcmVlKGdzcGNhX2Rldi0+dXNiX2J1Zik7Ci0Ja2ZyZWUoZ3NwY2FfZGV2KTsKKworCWdzcGNhX2Rldi0+cHJlc2VudCA9IDA7CisJZ3NwY2FfZGV2LT5zdHJlYW1pbmcgPSAwOworCisJa3JlZl9wdXQoJmdzcGNhX2Rldi0+a3JlZiwgZ3NwY2FfZGVsZXRlKTsKKwogCVBERUJVRyhEX1BST0JFLCAiZGlzY29ubmVjdCBjb21wbGV0ZSIpOwogfQogRVhQT1JUX1NZTUJPTChnc3BjYV9kaXNjb25uZWN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaAppbmRleCBjMTc2MjVjLi40Nzc5ZGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCkBAIC00OSwxMyArNDksMTQgQEAKIAl9IHdoaWxlICgwKQogCiAjZGVmaW5lIEdTUENBX01BWF9GUkFNRVMgMTYJLyogbWF4aW11bSBudW1iZXIgb2YgdmlkZW8gZnJhbWUgYnVmZmVycyAqLwotLyogSVNPQyB0cmFuc2ZlcnMgKi8KLSNkZWZpbmUgTUFYX05VUkJTIDE2CQkvKiBtYXggbnVtYmVyIG9mIFVSQnMgKi8KKy8qIGltYWdlIHRyYW5zZmVycyAqLworI2RlZmluZSBNQVhfTlVSQlMgNAkJLyogbWF4IG51bWJlciBvZiBVUkJzICovCiAjZGVmaW5lIElTT19NQVhfUEtUIDMyCQkvKiBtYXggbnVtYmVyIG9mIHBhY2tldHMgaW4gYW4gSVNPQyB0cmFuc2ZlciAqLwogI2RlZmluZSBJU09fTUFYX1NJWkUgMHg4MDAwCS8qIG1heCBzaXplIG9mIG9uZSBVUkIgYnVmZmVyICgzMiBLYikgKi8KIAogLyogZGV2aWNlIGluZm9ybWF0aW9uIC0gc2V0IGF0IHByb2JlIHRpbWUgKi8KIHN0cnVjdCBjYW0geworCWludCBidWxrX3NpemU7CQkvKiBidWZmZXIgc2l6ZSB3aGVuIGltYWdlIHRyYW5zZmVyIGJ5IGJ1bGsgKi8KIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpjYW1fbW9kZTsJLyogc2l6ZSBubW9kZXMgKi8KIAljaGFyIG5tb2RlczsKIAlfX3U4IGVwYWRkcjsKQEAgLTkzLDcgKzk0LDcgQEAKIC8qIG1hbmRhdG9yeSBvcGVyYXRpb25zICovCiAJY2FtX2NmX29wIGNvbmZpZzsJLyogY2FsbGVkIG9uIHByb2JlICovCiAJY2FtX29wIGluaXQ7CQkvKiBjYWxsZWQgb24gcHJvYmUgYW5kIHJlc3VtZSAqLwotCWNhbV92X29wIHN0YXJ0OwkJLyogY2FsbGVkIG9uIHN0cmVhbSBvbiAqLworCWNhbV9vcCBzdGFydDsJCS8qIGNhbGxlZCBvbiBzdHJlYW0gb24gKi8KIAljYW1fcGt0X29wIHBrdF9zY2FuOwogLyogb3B0aW9uYWwgb3BlcmF0aW9ucyAqLwogCWNhbV92X29wIHN0b3BOOwkJLyogY2FsbGVkIG9uIHN0cmVhbSBvZmYgLSBtYWluIGFsdCAqLwpAQCAtMTA1LDEwICsxMDYsMTIgQEAKIH07CiAKIC8qIHBhY2tldCB0eXBlcyB3aGVuIG1vdmluZyBmcm9tIGlzbyBidWYgdG8gZnJhbWUgYnVmICovCi0jZGVmaW5lIERJU0NBUkRfUEFDS0VUCTAKLSNkZWZpbmUgRklSU1RfUEFDS0VUCTEKLSNkZWZpbmUgSU5URVJfUEFDS0VUCTIKLSNkZWZpbmUgTEFTVF9QQUNLRVQJMworZW51bSBnc3BjYV9wYWNrZXRfdHlwZSB7CisJRElTQ0FSRF9QQUNLRVQsCisJRklSU1RfUEFDS0VULAorCUlOVEVSX1BBQ0tFVCwKKwlMQVNUX1BBQ0tFVAorfTsKIAogc3RydWN0IGdzcGNhX2ZyYW1lIHsKIAlfX3U4ICpkYXRhOwkJCS8qIGZyYW1lIGJ1ZmZlciAqLwpAQCAtMTIxLDYgKzEyNCw3IEBACiAJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJc3RydWN0IGtyZWYga3JlZjsKIAlzdHJ1Y3QgZmlsZSAqY2FwdF9maWxlOwkJLyogZmlsZSBkb2luZyB2aWRlbyBjYXB0dXJlICovCiAKIAlzdHJ1Y3QgY2FtIGNhbTsJCQkJLyogZGV2aWNlIGluZm9ybWF0aW9uICovCkBAIC0xNzMsMTAgKzE3NywxMSBAQAogCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwogdm9pZCBnc3BjYV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIHN0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZnJhbWVfYWRkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKLQkJCQkgICAgaW50IHBhY2tldF90eXBlLAorCQkJCSAgICBlbnVtIGdzcGNhX3BhY2tldF90eXBlIHBhY2tldF90eXBlLAogCQkJCSAgICBzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAogCQkJCSAgICBjb25zdCBfX3U4ICpkYXRhLAogCQkJCSAgICBpbnQgbGVuKTsKK3N0cnVjdCBnc3BjYV9mcmFtZSAqZ3NwY2FfZ2V0X2lfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKICNpZmRlZiBDT05GSUdfUE0KIGludCBnc3BjYV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CiBpbnQgZ3NwY2FfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY5MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9LY29uZmlnCkBAIC0wLDAgKzEsMTEgQEAKK2NvbmZpZyBVU0JfTTU2MDIKKwl0cmlzdGF0ZSAiQUxpIFVTQiBtNTYwMiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlCisJICBBTGkgbTU2MDIgY29ubmVjdGVkIHRvIHZhcmlvdXMgaW1hZ2Ugc2Vuc29ycy4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvbTU2MDIudHh0PiBmb3IgbW9yZSBpbmZvLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9tNTYwMi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNmFiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKK29iai0kKENPTkZJR19VU0JfTTU2MDIpICs9IGdzcGNhX201NjAyLm8KKworZ3NwY2FfbTU2MDItb2JqcyA6PSBtNTYwMl9jb3JlLm8gXAorCQkgICAgbTU2MDJfb3Y5NjUwLm8gXAorCQkgICAgbTU2MDJfbXQ5bTExMS5vIFwKKwkJICAgIG01NjAyX3BvMTAzMC5vIFwKKwkJICAgIG01NjAyX3M1azgzYS5vIFwKKwkJICAgIG01NjAyX3M1azRhYS5vCisKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9icmlkZ2UuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfYnJpZGdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4NmQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfYnJpZGdlLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBVU0IgRHJpdmVyIGZvciBBTGkgbTU2MDIgYmFzZWQgd2ViY2FtcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpZm5kZWYgTTU2MDJfQlJJREdFX0hfCisjZGVmaW5lIE01NjAyX0JSSURHRV9IXworCisjaW5jbHVkZSAiZ3NwY2EuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRSAiQUxpIG01NjAyIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBQREVCVUcKKyN1bmRlZiBpbmZvCisjdW5kZWYgZXJyCisKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIiBcCisJZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisKKy8qIERlYnVnIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREJHX0lOSVQgMHgxCisjZGVmaW5lIERCR19QUk9CRSAweDIKKyNkZWZpbmUgREJHX1Y0TDIgMHg0CisjZGVmaW5lIERCR19UUkFDRSAweDgKKyNkZWZpbmUgREJHX0RBVEEgMHgxMAorI2RlZmluZSBEQkdfVjRMMl9DSUQgMHgyMAorI2RlZmluZSBEQkdfR1NQQ0EgMHg0MAorCisjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCWlmIChtNTYwMl9kZWJ1ZyAmIGxldmVsKSAgICAgXAorCQkJaW5mbygiWyVzOiVkXSAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fICwgXAorCQkJIyMgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTTU2MDJfWEJfU0VOU09SX1RZUEUgMHgwMAorI2RlZmluZSBNNTYwMl9YQl9TRU5TT1JfQ1RSTCAweDAxCisjZGVmaW5lIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSCAweDAyCisjZGVmaW5lIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfTCAweDAzCisjZGVmaW5lIE01NjAyX1hCX1BJWF9PRl9MSU5FX0ggMHgwNAorI2RlZmluZSBNNTYwMl9YQl9QSVhfT0ZfTElORV9MIDB4MDUKKyNkZWZpbmUgTTU2MDJfWEJfVlNZTkNfUEFSQSAweDA2CisjZGVmaW5lIE01NjAyX1hCX0hTWU5DX1BBUkEgMHgwNworI2RlZmluZSBNNTYwMl9YQl9URVNUX01PREVfMSAweDA4CisjZGVmaW5lIE01NjAyX1hCX1RFU1RfTU9ERV8yIDB4MDkKKyNkZWZpbmUgTTU2MDJfWEJfU0lHX0lOSSAweDBhCisjZGVmaW5lIE01NjAyX1hCX0RTX1BBUkEgMHgwZQorI2RlZmluZSBNNTYwMl9YQl9UUklHX1BBUkEgMHgwZgorI2RlZmluZSBNNTYwMl9YQl9DTEtfUEQgMHgxMAorI2RlZmluZSBNNTYwMl9YQl9NQ1VfQ0xLX0NUUkwgMHgxMgorI2RlZmluZSBNNTYwMl9YQl9NQ1VfQ0xLX0RJViAweDEzCisjZGVmaW5lIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCAweDE0CisjZGVmaW5lIE01NjAyX1hCX1NFTl9DTEtfRElWIDB4MTUKKyNkZWZpbmUgTTU2MDJfWEJfQVVEX0NMS19DVFJMIDB4MTYKKyNkZWZpbmUgTTU2MDJfWEJfQVVEX0NMS19ESVYgMHgxNworI2RlZmluZSBNNTYwMl9YQl9ERVZDVFIxIDB4NDEKKyNkZWZpbmUgTTU2MDJfWEJfRVBTRVRSMCAweDQyCisjZGVmaW5lIE01NjAyX1hCX0VQQUZDVFIgMHg0NworI2RlZmluZSBNNTYwMl9YQl9FUEJGQ1RSIDB4NDkKKyNkZWZpbmUgTTU2MDJfWEJfRVBFRkNUUiAweDRmCisjZGVmaW5lIE01NjAyX1hCX1RFU1RfUkVHIDB4NTMKKyNkZWZpbmUgTTU2MDJfWEJfQUxUMlNJWkUgMHg1NAorI2RlZmluZSBNNTYwMl9YQl9BTFQzU0laRSAweDU1CisjZGVmaW5lIE01NjAyX1hCX09CU0ZSQU1FIDB4NTYKKyNkZWZpbmUgTTU2MDJfWEJfUFdSX0NUTCAweDU5CisjZGVmaW5lIE01NjAyX1hCX0FEQ19DVFJMIDB4NjAKKyNkZWZpbmUgTTU2MDJfWEJfQURDX0RBVEEgMHg2MQorI2RlZmluZSBNNTYwMl9YQl9NSVNDX0NUUkwgMHg2MgorI2RlZmluZSBNNTYwMl9YQl9TTkFQU0hPVCAweDYzCisjZGVmaW5lIE01NjAyX1hCX1NDUkFUQ0hfMSAweDY0CisjZGVmaW5lIE01NjAyX1hCX1NDUkFUQ0hfMiAweDY1CisjZGVmaW5lIE01NjAyX1hCX1NDUkFUQ0hfMyAweDY2CisjZGVmaW5lIE01NjAyX1hCX1NDUkFUQ0hfNCAweDY3CisjZGVmaW5lIE01NjAyX1hCX0kyQ19DVFJMIDB4NjgKKyNkZWZpbmUgTTU2MDJfWEJfSTJDX0NMS19ESVYgMHg2OQorI2RlZmluZSBNNTYwMl9YQl9JMkNfREVWX0FERFIgMHg2YQorI2RlZmluZSBNNTYwMl9YQl9JMkNfUkVHX0FERFIgMHg2YgorI2RlZmluZSBNNTYwMl9YQl9JMkNfREFUQSAweDZjCisjZGVmaW5lIE01NjAyX1hCX0kyQ19TVEFUVVMgMHg2ZAorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RBVF9IIDB4NzAKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19EQVRfTCAweDcxCisjZGVmaW5lIE01NjAyX1hCX0dQSU9fRElSX0ggMHg3MgorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RJUl9MIDB4NzMKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19FTl9IIDB4NzQKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19FTl9MIDB4NzUKKyNkZWZpbmUgTTU2MDJfWEJfR1BJT19EQVQgMHg3NgorI2RlZmluZSBNNTYwMl9YQl9HUElPX0RJUiAweDc3CisjZGVmaW5lIE01NjAyX1hCX01JU0NfQ1RMIDB4NzAKKworI2RlZmluZSBJMkNfQlVTWSAweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRHJpdmVyIGluZm8gKi8KKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQUxpIG01NjAyIExpbnV4IERyaXZlciBQcm9qZWN0IgorI2RlZmluZSBEUklWRVJfREVTQyAiQUxpIG01NjAyIHdlYmNhbSBkcml2ZXIiCisKKyNkZWZpbmUgTTU2MDJfSVNPQ19FTkRQT0lOVF9BRERSIDB4ODEKKyNkZWZpbmUgTTU2MDJfSU5UUl9FTkRQT0lOVF9BRERSIDB4ODIKKworI2RlZmluZSBNNTYwMl9NQVhfRlJBTUVTCTMyCisjZGVmaW5lIE01NjAyX1VSQlMJCTIKKyNkZWZpbmUgTTU2MDJfSVNPQ19QQUNLRVRTCTE0CisKKyNkZWZpbmUgTTU2MDJfVVJCX1RJTUVPVVQJbXNlY3NfdG9famlmZmllcygyICogTTU2MDJfSVNPQ19QQUNLRVRTKQorI2RlZmluZSBNNTYwMl9VUkJfTVNHX1RJTUVPVVQgICA1MDAwCisjZGVmaW5lIE01NjAyX0ZSQU1FX1RJTUVPVVQJMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEEgc2tlbGV0b24gdXNlZCBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgbTU2MDIgYnJpZGdlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdXJiX3NrZWxldG9uW10gPSB7CisJMHgxMywgMHgwMCwgMHg4MSwgMHgwMAorfTsKKworLyogQSBza2VsZXRvbiB1c2VkIGZvciBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSBzZW5zb3IgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNlbnNvcl91cmJfc2tlbGV0b25bXSA9IHsKKwkweDIzLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4ODEsIDB4MDYsCisJMHgyMywgTTU2MDJfWEJfTUlTQ19DVFJMLCAweDgxLCAweDgwLAorCTB4MTMsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHg4MSwgMHgwMCwKKwkweDEzLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4ODEsIDB4MDAsCisJMHgxMywgTTU2MDJfWEJfSTJDX0RBVEEsIDB4ODEsIDB4MDAsCisJMHgxMywgTTU2MDJfWEJfSTJDX0NUUkwsIDB4ODEsIDB4MTEKK307CisKKy8qIG01NjAyIGRldmljZSBkZXNjcmlwdG9yLCBjdXJyZW50bHkgaXQganVzdCB3cmFwcyB0aGUgbTU2MDJfY2FtZXJhIHN0cnVjdCAqLworc3RydWN0IHNkIHsKKwlzdHJ1Y3QgZ3NwY2FfZGV2IGdzcGNhX2RldjsKKworCS8qIFRoZSBuYW1lIG9mIHRoZSBtNTYwMiBjYW1lcmEgKi8KKwljaGFyICpuYW1lOworCisJLyogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHNlbnNvciAqLworCXN0cnVjdCBtNTYwMl9zZW5zb3IgKnNlbnNvcjsKKworCXN0cnVjdCBzZF9kZXNjICpkZXNjOworCisJLyogVGhlIGN1cnJlbnQgZnJhbWUncyBpZCwgdXNlZCB0byBkZXRlY3QgZnJhbWUgYm91bmRhcmllcyAqLworCXU4IGZyYW1lX2lkOworCisJLyogVGhlIGN1cnJlbnQgZnJhbWUgY291bnQgKi8KKwl1MzIgZnJhbWVfY291bnQ7Cit9OworCitpbnQgbTU2MDJfcmVhZF9icmlkZ2UoCisJc3RydWN0IHNkICpzZCwgdTggYWRkcmVzcywgdTggKmkyY19kYXRhKTsKKworaW50IG01NjAyX3dyaXRlX2JyaWRnZSgKKwlzdHJ1Y3Qgc2QgKnNkLCB1OCBhZGRyZXNzLCB1OCBpMmNfZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQ1ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9jb3JlLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBVU0IgRHJpdmVyIGZvciBBTGkgbTU2MDIgYmFzZWQgd2ViY2FtcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpbmNsdWRlICJtNTYwMl9vdjk2NTAuaCIKKyNpbmNsdWRlICJtNTYwMl9tdDltMTExLmgiCisjaW5jbHVkZSAibTU2MDJfcG8xMDMwLmgiCisjaW5jbHVkZSAibTU2MDJfczVrODNhLmgiCisjaW5jbHVkZSAibTU2MDJfczVrNGFhLmgiCisKKy8qIEtlcm5lbCBtb2R1bGUgcGFyYW1ldGVycyAqLworaW50IGZvcmNlX3NlbnNvcjsKK2ludCBkdW1wX2JyaWRnZTsKK2ludCBkdW1wX3NlbnNvcjsKK3Vuc2lnbmVkIGludCBtNTYwMl9kZWJ1ZzsKKworc3RhdGljIGNvbnN0IF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgbTU2MDJfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA0MDIsIDB4NTYwMil9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgbTU2MDJfdGFibGUpOworCisvKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgbTU2MDIgKi8KK2ludCBtNTYwMl9yZWFkX2JyaWRnZShzdHJ1Y3Qgc2QgKnNkLCB1OCBhZGRyZXNzLCB1OCAqaTJjX2RhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OworCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKKworCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAweDA0LCAweGMwLCAweDE0LAorCQkJICAgICAgMHg4MTAwICsgYWRkcmVzcywgYnVmLAorCQkJICAgICAgMSwgTTU2MDJfVVJCX01TR19USU1FT1VUKTsKKwkqaTJjX2RhdGEgPSBidWZbMF07CisKKwlQREVCVUcoREJHX1RSQUNFLCAiUmVhZGluZyBicmlkZ2UgcmVnaXN0ZXIgMHgleCBjb250YWluaW5nIDB4JXgiLAorCSAgICAgICBhZGRyZXNzLCAqaTJjX2RhdGEpOworCisJLyogdXNiX2NvbnRyb2xfbXNnKC4uLikgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgdXBvbiBzdWNjZXNzLAorCW1hc2sgdGhhdCBhbmQgcmV0dXJuIHplcm8gdXBvbiBzdWNjZXNzIGluc3RlYWQqLworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCisvKiBXcml0ZXMgYSBieXRlIHRvIHRvIHRoZSBtNTYwMiAqLworaW50IG01NjAyX3dyaXRlX2JyaWRnZShzdHJ1Y3Qgc2QgKnNkLCB1OCBhZGRyZXNzLCB1OCBpMmNfZGF0YSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gc2QtPmdzcGNhX2Rldi5kZXY7CisJX191OCAqYnVmID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCisJUERFQlVHKERCR19UUkFDRSwgIldyaXRpbmcgYnJpZGdlIHJlZ2lzdGVyIDB4JXggd2l0aCAweCV4IiwKKwkgICAgICAgYWRkcmVzcywgaTJjX2RhdGEpOworCisJbWVtY3B5KGJ1ZiwgYnJpZGdlX3VyYl9za2VsZXRvbiwKKwkgICAgICAgc2l6ZW9mKGJyaWRnZV91cmJfc2tlbGV0b24pKTsKKwlidWZbMV0gPSBhZGRyZXNzOworCWJ1ZlszXSA9IGkyY19kYXRhOworCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkweDA0LCAweDQwLCAweDE5LAorCQkJCTB4MDAwMCwgYnVmLAorCQkJCTQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7CisKKwkvKiB1c2JfY29udHJvbF9tc2coLi4uKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCB1cG9uIHN1Y2Nlc3MsCisJICAgbWFzayB0aGF0IGFuZCByZXR1cm4gemVybyB1cG9uIHN1Y2Nlc3MgaW5zdGVhZCAqLworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCisvKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBtNTYwMiBicmlkZ2UsCisgICB1bmZvcnR1bmF0ZWx5IHRoaXMgYnJlYWtzIHRoZSBjYW1lcmEgdW50aWwgaXQncyBwb3dlciBjeWNsZWQgKi8KK3N0YXRpYyB2b2lkIG01NjAyX2R1bXBfYnJpZGdlKHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDB4ODA7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7CisJCW01NjAyX3JlYWRfYnJpZGdlKHNkLCBpLCAmdmFsKTsKKwkJaW5mbygiQUxpIG01NjAyIGFkZHJlc3MgMHgleCBjb250YWlucyAweCV4IiwgaSwgdmFsKTsKKwl9CisJaW5mbygiV2FybmluZzogVGhlIGNhbWVyYSBwcm9iYWJseSB3b24ndCB3b3JrIHVudGlsIGl0J3MgcG93ZXIgY3ljbGVkIik7Cit9CisKK3N0YXRpYyBpbnQgbTU2MDJfcHJvYmVfc2Vuc29yKHN0cnVjdCBzZCAqc2QpCit7CisJLyogVHJ5IHRoZSBwbzEwMzAgKi8KKwlzZC0+c2Vuc29yID0gJnBvMTAzMDsKKwlpZiAoIXNkLT5zZW5zb3ItPnByb2JlKHNkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUcnkgdGhlIG10OW0xMTEgc2Vuc29yICovCisJc2QtPnNlbnNvciA9ICZtdDltMTExOworCWlmICghc2QtPnNlbnNvci0+cHJvYmUoc2QpKQorCQlyZXR1cm4gMDsKKworCS8qIFRyeSB0aGUgczVrNGFhICovCisJc2QtPnNlbnNvciA9ICZzNWs0YWE7CisJaWYgKCFzZC0+c2Vuc29yLT5wcm9iZShzZCkpCisJCXJldHVybiAwOworCisJLyogVHJ5IHRoZSBvdjk2NTAgKi8KKwlzZC0+c2Vuc29yID0gJm92OTY1MDsKKwlpZiAoIXNkLT5zZW5zb3ItPnByb2JlKHNkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUcnkgdGhlIHM1azgzYSAqLworCXNkLT5zZW5zb3IgPSAmczVrODNhOworCWlmICghc2QtPnNlbnNvci0+cHJvYmUoc2QpKQorCQlyZXR1cm4gMDsKKworCS8qIE1vcmUgc2Vuc29yIHByb2JlIGZ1bmN0aW9uIGdvZXMgaGVyZSAqLworCWluZm8oIkZhaWxlZCB0byBmaW5kIGEgc2Vuc29yIik7CisJc2QtPnNlbnNvciA9IE5VTEw7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbTU2MDJfY29uZmlndXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CisKK3N0YXRpYyBpbnQgbTU2MDJfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBlcnI7CisKKwlQREVCVUcoREJHX1RSQUNFLCAiSW5pdGlhbGl6aW5nIEFMaSBtNTYwMiB3ZWJjYW0iKTsKKwkvKiBSdW4gdGhlIGluaXQgc2VxdWVuY2UgKi8KKwllcnIgPSBzZC0+c2Vuc29yLT5pbml0KHNkKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbTU2MDJfc3RhcnRfdHJhbnNmZXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQgdG8gdGhlIGNhbWVyYSAqLworCWNvbnN0IHU4IGJ1ZmZlcls0XSA9IHsweDEzLCAweGY5LCAweDBmLCAweDAxfTsKKwltZW1jcHkoYnVmLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwl1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsIHVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkweDA0LCAweDQwLCAweDE5LCAweDAwMDAsIGJ1ZiwKKwkJCTQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7CisKKwlQREVCVUcoREJHX1Y0TDIsICJUcmFuc2ZlciBzdGFydGVkIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG01NjAyX3VyYl9jb21wbGV0ZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAorCQkJX191OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAobGVuIDwgNikgeworCQlQREVCVUcoREJHX0RBVEEsICJQYWNrZXQgaXMgbGVzcyB0aGFuIDYgYnl0ZXMiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZyYW1lIGRlbGltaXRlcjogZmYgeHggeHggeHggZmYgZmYgKi8KKwlpZiAoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbNF0gPT0gMHhmZiAmJiBkYXRhWzVdID09IDB4ZmYgJiYKKwkgICAgZGF0YVsyXSAhPSBzZC0+ZnJhbWVfaWQpIHsKKwkJUERFQlVHKERCR19EQVRBLCAiRnJhbWUgZGVsaW1pdGVyIGRldGVjdGVkIik7CisJCXNkLT5mcmFtZV9pZCA9IGRhdGFbMl07CisKKwkJLyogUmVtb3ZlIHRoZSBleHRyYSBmbHVmZiBhcHBlbmRlZCBvbiBlYWNoIGhlYWRlciAqLworCQlkYXRhICs9IDY7CisJCWxlbiAtPSA2OworCisJCS8qIENvbXBsZXRlIHRoZSBsYXN0IGZyYW1lIChpZiBhbnkpICovCisJCWZyYW1lID0gZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCWZyYW1lLCBkYXRhLCAwKTsKKwkJc2QtPmZyYW1lX2NvdW50Kys7CisKKwkJLyogQ3JlYXRlIGEgbmV3IGZyYW1lICovCisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisKKwkJUERFQlVHKERCR19WNEwyLCAiU3RhcnRpbmcgbmV3IGZyYW1lICVkIiwKKwkJICAgICAgIHNkLT5mcmFtZV9jb3VudCk7CisKKwl9IGVsc2UgeworCQlpbnQgY3VyX2ZyYW1lX2xlbiA9IGZyYW1lLT5kYXRhX2VuZCAtIGZyYW1lLT5kYXRhOworCisJCS8qIFJlbW92ZSB1cmIgaGVhZGVyICovCisJCWRhdGEgKz0gNDsKKwkJbGVuIC09IDQ7CisKKwkJaWYgKGN1cl9mcmFtZV9sZW4gKyBsZW4gPD0gZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCkgeworCQkJUERFQlVHKERCR19EQVRBLCAiQ29udGludWluZyBmcmFtZSAlZCBjb3B5aW5nICVkIGJ5dGVzIiwKKwkJCSAgICAgICBzZC0+ZnJhbWVfY291bnQsIGxlbik7CisKKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsCisJCQkJCWRhdGEsIGxlbik7CisJCX0gZWxzZSBpZiAoZnJhbWUtPnY0bDJfYnVmLmxlbmd0aCAtIGN1cl9mcmFtZV9sZW4gPiAwKSB7CisJCQkvKiBBZGQgdGhlIHJlbWFpbmluZyBkYXRhIHVwIHRvIGZyYW1lIHNpemUgKi8KKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZnJhbWUsIGRhdGEsCisJCQkJCWZyYW1lLT52NGwyX2J1Zi5sZW5ndGggLSBjdXJfZnJhbWVfbGVuKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbTU2MDJfc3RvcF90cmFuc2ZlcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJLyogSXMgdGhlcmUgYXJlIGEgY29tbWFuZCB0byBzdG9wIGEgZGF0YSB0cmFuc2Zlcj8gKi8KK30KKworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiwgdGhlIGN0cmwgYW5kIG5jdHJsIGlzIGZpbGxlZCBhdCBwcm9iZSB0aW1lICovCitzdGF0aWMgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKKwkubmFtZQkJPSBNT0RVTEVfTkFNRSwKKwkuY29uZmlnCQk9IG01NjAyX2NvbmZpZ3VyZSwKKwkuaW5pdAkJPSBtNTYwMl9pbml0LAorCS5zdGFydAkJPSBtNTYwMl9zdGFydF90cmFuc2ZlciwKKwkuc3RvcE4JCT0gbTU2MDJfc3RvcF90cmFuc2ZlciwKKwkucGt0X3NjYW4JPSBtNTYwMl91cmJfY29tcGxldGUKK307CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KK3N0YXRpYyBpbnQgbTU2MDJfY29uZmlndXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RydWN0IGNhbSAqY2FtOworCWludCBlcnI7CisKKwlQREVCVUcoREJHX0dTUENBLCAibTU2MDJfY29uZmlndXJlIHN0YXJ0Iik7CisKKwljYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJY2FtLT5lcGFkZHIgPSBNNTYwMl9JU09DX0VORFBPSU5UX0FERFI7CisJc2QtPmRlc2MgPSAmc2RfZGVzYzsKKworCWlmIChkdW1wX2JyaWRnZSkKKwkJbTU2MDJfZHVtcF9icmlkZ2Uoc2QpOworCisJLyogUHJvYmUgc2Vuc29yICovCisJZXJyID0gbTU2MDJfcHJvYmVfc2Vuc29yKHNkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwlQREVCVUcoREJHX0dTUENBLCAibTU2MDJfY29uZmlndXJlIGVuZCIpOworCXJldHVybiAwOworCitmYWlsOgorCVBERUJVRyhEQkdfR1NQQ0EsICJtNTYwMl9jb25maWd1cmUgZmFpbGVkIik7CisJY2FtLT5jYW1fbW9kZSA9IE5VTEw7CisJY2FtLT5ubW9kZXMgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtNTYwMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZ3NwY2FfZGV2X3Byb2JlKGludGYsIGlkLCAmc2RfZGVzYywgc2l6ZW9mKHN0cnVjdCBzZCksCisJCQkgICAgICAgVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc2RfZHJpdmVyID0geworCS5uYW1lID0gTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlID0gbTU2MDJfdGFibGUsCisJLnByb2JlID0gbTU2MDJfcHJvYmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IG1vZF9tNTYwMl9pbml0KHZvaWQpCit7CisJaWYgKHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKSA8IDApCisJCXJldHVybiAtMTsKKwlQREVCVUcoRF9QUk9CRSwgIm01NjAyIG1vZHVsZSByZWdpc3RlcmVkIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgbW9kX201NjAyX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKKwlQREVCVUcoRF9QUk9CRSwgIm01NjAyIG1vZHVsZSBkZXJlZ2lzdGVyZWQiKTsKK30KKworbW9kdWxlX2luaXQobW9kX201NjAyX2luaXQpOworbW9kdWxlX2V4aXQobW9kX201NjAyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgbTU2MDJfZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInRvZ2dsZXMgZGVidWcgb24vb2ZmIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9zZW5zb3IsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zZW5zb3IsCisJCSJmb3JjZSBkZXRlY3Rpb24gb2Ygc2Vuc29yLCAiCisJCSIxID0gT1Y5NjUwLCAyID0gUzVLODNBLCAzID0gUzVLNEFBLCA0ID0gTVQ5TTExMSwgNSA9IFBPMTAzMCIpOworCittb2R1bGVfcGFyYW0oZHVtcF9icmlkZ2UsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9icmlkZ2UsICJEdW1wcyBhbGwgdXNiIGJyaWRnZSByZWdpc3RlcnMgYXQgc3RhcnR1cCIpOworCittb2R1bGVfcGFyYW0oZHVtcF9zZW5zb3IsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZHVtcF9zZW5zb3IsICJEdW1wcyBhbGwgdXNiIHNlbnNvciByZWdpc3RlcnMgIgorCQkiYXQgc3RhcnR1cCBwcm92aWRpbmcgYSBzZW5zb3IgaXMgZm91bmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfbXQ5bTExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ZDQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfbXQ5bTExMS5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgbXQ5bTExMSBzZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRXJpayBBbmRyZW4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBJbHllcyBHb3V0YS4gQmFzZWQgb24gdGhlIG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBtNTYwM3ggTGludXggRHJpdmVyIFByb2plY3QgPG01NjAyQHgzbmcuY29tLmJyPgorICoKKyAqIFBvcnRpb25zIG9mIGNvZGUgdG8gVVNCIGludGVyZmFjZSBhbmQgQUxpIGRyaXZlciBzb2Z0d2FyZSwKKyAqIENvcHlyaWdodCAoYykgMjAwNiBXaWxsZW0gRHVpbmtlcgorICogdjRsMiBpbnRlcmZhY2UgbW9kZWxlZCBhZnRlciB0aGUgVjRMMiBkcml2ZXIKKyAqIGZvciBTTjlDMTB4IFBDIENhbWVyYSBDb250cm9sbGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqLworCisjaW5jbHVkZSAibTU2MDJfbXQ5bTExMS5oIgorCitpbnQgbXQ5bTExMV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQoreworCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CisJaW50IGk7CisKKwlpZiAoZm9yY2Vfc2Vuc29yKSB7CisJCWlmIChmb3JjZV9zZW5zb3IgPT0gTVQ5TTExMV9TRU5TT1IpIHsKKwkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBtdDltMTExLm5hbWUpOworCQkJZ290byBzZW5zb3JfZm91bmQ7CisJCX0KKwkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwgZG9uJ3QgdHJ5IHRvIHByb2JlIHRoaXMKKwkJICogb25lICovCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZm8oIlByb2JpbmcgZm9yIGEgbXQ5bTExMSBzZW5zb3IiKTsKKworCS8qIERvIHRoZSBwcmVpbml0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJlaW5pdF9tdDltMTExKTsgaSsrKSB7CisJCWlmIChwcmVpbml0X210OW0xMTFbaV1bMF0gPT0gQlJJREdFKSB7CisJCQltNTYwMl93cml0ZV9icmlkZ2Uoc2QsCisJCQkJcHJlaW5pdF9tdDltMTExW2ldWzFdLAorCQkJCXByZWluaXRfbXQ5bTExMVtpXVsyXSk7CisJCX0gZWxzZSB7CisJCQlkYXRhWzBdID0gcHJlaW5pdF9tdDltMTExW2ldWzJdOworCQkJZGF0YVsxXSA9IHByZWluaXRfbXQ5bTExMVtpXVszXTsKKwkJCW10OW0xMTFfd3JpdGVfc2Vuc29yKHNkLAorCQkJCXByZWluaXRfbXQ5bTExMVtpXVsxXSwgZGF0YSwgMik7CisJCX0KKwl9CisKKwlpZiAobXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19DSElQVkVSLCBkYXRhLCAyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGRhdGFbMF0gPT0gMHgxNCkgJiYgKGRhdGFbMV0gPT0gMHgzYSkpIHsKKwkJaW5mbygiRGV0ZWN0ZWQgYSBtdDltMTExIHNlbnNvciIpOworCQlnb3RvIHNlbnNvcl9mb3VuZDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKKworc2Vuc29yX2ZvdW5kOgorCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gbXQ5bTExMS5tb2RlczsKKwlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBtdDltMTExLm5tb2RlczsKKwlzZC0+ZGVzYy0+Y3RybHMgPSBtdDltMTExLmN0cmxzOworCXNkLT5kZXNjLT5uY3RybHMgPSBtdDltMTExLm5jdHJsczsKKwlyZXR1cm4gMDsKK30KKworaW50IG10OW0xMTFfaW5pdChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBpLCBlcnIgPSAwOworCisJLyogSW5pdCB0aGUgc2Vuc29yICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9tdDltMTExKTsgaSsrKSB7CisJCXU4IGRhdGFbMl07CisKKwkJaWYgKGluaXRfbXQ5bTExMVtpXVswXSA9PSBCUklER0UpIHsKKwkJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwKKwkJCQlpbml0X210OW0xMTFbaV1bMV0sCisJCQkJaW5pdF9tdDltMTExW2ldWzJdKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGFbMF0gPSBpbml0X210OW0xMTFbaV1bMl07CisJCQlkYXRhWzFdID0gaW5pdF9tdDltMTExW2ldWzNdOworCQkJZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsCisJCQkJaW5pdF9tdDltMTExW2ldWzFdLCBkYXRhLCAyKTsKKwkJfQorCX0KKworCWlmIChkdW1wX3NlbnNvcikKKwkJbXQ5bTExMV9kdW1wX3JlZ2lzdGVycyhzZCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IG10OW0xMTFfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKQoreworCXJldHVybiAwOworfQorCitpbnQgbXQ5bTExMV9nZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggZGF0YVsyXSA9IHsweDAwLCAweDAwfTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBtdDltMTExX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsCisJCQkJICBkYXRhLCAyKTsKKwkqdmFsID0gZGF0YVswXSAmIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTOworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJSZWFkIHZlcnRpY2FsIGZsaXAgJWQiLCAqdmFsKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgbXQ5bTExMV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhWzJdID0gezB4MDAsIDB4MDB9OworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgdmVydGljYWwgZmxpcCB0byAlZCIsIHZhbCk7CisKKwkvKiBTZXQgdGhlIGNvcnJlY3QgcGFnZSBtYXAgKi8KKwllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgZGF0YSwgMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLCBkYXRhLCAyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwlkYXRhWzBdID0gKGRhdGFbMF0gJiAweGZlKSB8IHZhbDsKKwllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLAorCQkJCSAgIGRhdGEsIDIpOworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgbXQ5bTExMV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggZGF0YVsyXSA9IHsweDAwLCAweDAwfTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBtdDltMTExX3JlYWRfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsCisJCQkJICBkYXRhLCAyKTsKKwkqdmFsID0gZGF0YVswXSAmIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTOworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJSZWFkIGhvcml6b250YWwgZmxpcCAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBtdDltMTExX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIlNldCBob3Jpem9udGFsIGZsaXAgdG8gJWQiLCB2YWwpOworCisJLyogU2V0IHRoZSBjb3JyZWN0IHBhZ2UgbWFwICovCisJZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIGRhdGEsIDIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IG10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQiwgZGF0YSwgMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZGF0YVswXSA9IChkYXRhWzBdICYgMHhmZCkgfCAoKHZhbCA8PCAxKSAmIDB4MDIpOworCWVyciA9IG10OW0xMTFfd3JpdGVfc2Vuc29yKHNkLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsCisJCQkJCWRhdGEsIDIpOworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgbXQ5bTExMV9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVyciwgdG1wOworCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgTVQ5TTExMV9TQ19HTE9CQUxfR0FJTiwgZGF0YSwgMik7CisJdG1wID0gKChkYXRhWzFdIDw8IDgpIHwgZGF0YVswXSk7CisKKwkqdmFsID0gKCh0bXAgJiAoMSA8PCAxMCkpICogMikgfAorCSAgICAgICgodG1wICYgKDEgPDwgIDkpKSAqIDIpIHwKKwkgICAgICAoKHRtcCAmICgxIDw8ICA4KSkgKiAyKSB8CisJICAgICAgICh0bXAgJiAweDdmKTsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJSZWFkIGdhaW4gJWQiLCAqdmFsKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgbXQ5bTExMV9zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyLCB0bXA7CisJdTggZGF0YVsyXSA9IHsweDAwLCAweDAwfTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkvKiBTZXQgdGhlIGNvcnJlY3QgcGFnZSBtYXAgKi8KKwllcnIgPSBtdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgZGF0YSwgMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHZhbCA+PSBJTklUSUFMX01BWF9HQUlOICogMiAqIDIgKiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsID49IElOSVRJQUxfTUFYX0dBSU4gKiAyICogMikgJiYKKwkgICAgKHZhbCA8IChJTklUSUFMX01BWF9HQUlOIC0gMSkgKiAyICogMiAqIDIpKQorCQl0bXAgPSAoMSA8PCAxMCkgfCAodmFsIDw8IDkpIHwKKwkJCQkodmFsIDw8IDgpIHwgKHZhbCAvIDgpOworCWVsc2UgaWYgKCh2YWwgPj0gSU5JVElBTF9NQVhfR0FJTiAqIDIpICYmCisJCSAodmFsIDwgIElOSVRJQUxfTUFYX0dBSU4gKiAyICogMikpCisJCXRtcCA9ICgxIDw8IDkpIHwgKDEgPDwgOCkgfCAodmFsIC8gNCk7CisJZWxzZSBpZiAoKHZhbCA+PSBJTklUSUFMX01BWF9HQUlOKSAmJgorCQkgKHZhbCA8IElOSVRJQUxfTUFYX0dBSU4gKiAyKSkKKwkJdG1wID0gKDEgPDwgOCkgfCAodmFsIC8gMik7CisJZWxzZQorCQl0bXAgPSB2YWw7CisKKwlkYXRhWzFdID0gKHRtcCAmIDB4ZmYwMCkgPj4gODsKKwlkYXRhWzBdID0gKHRtcCAmIDB4ZmYpOworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJ0bXA9JWQsIGRhdGFbMV09JWQsIGRhdGFbMF09JWQiLCB0bXAsCisJICAgICAgIGRhdGFbMV0sIGRhdGFbMF0pOworCisJZXJyID0gbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4sCisJCQkJICAgZGF0YSwgMik7CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBtdDltMTExX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikgeworCWludCBlcnIsIGk7CisKKwlkbyB7CisJCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfU1RBVFVTLCBpMmNfZGF0YSk7CisJfSB3aGlsZSAoKCppMmNfZGF0YSAmIEkyQ19CVVNZKSAmJiAhZXJyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKKwkJCQkgc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgYWRkcmVzcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IGxlbiAmJiAhZXJyOyBpKyspIHsKKwkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19EQVRBLCAmKGkyY19kYXRhW2ldKSk7CisKKwkJUERFQlVHKERCR19UUkFDRSwgIlJlYWRpbmcgc2Vuc29yIHJlZ2lzdGVyICIKKwkJICAgICAgICIweCV4IGNvbnRhaW5zIDB4JXggIiwgYWRkcmVzcywgKmkyY19kYXRhKTsKKwl9CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBtdDltMTExX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJCXU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKQoreworCWludCBlcnIsIGk7CisJdTggKnA7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwkvKiBObyBzZW5zb3Igd2l0aCBhIGRhdGEgd2lkdGggbGFyZ2VyCisJICAgdGhhbiAxNiBiaXRzIGhhcyB5ZXQgYmVlbiBzZWVuLCBub3Igd2l0aCAwIDpwKi8KKwlpZiAobGVuID4gMiB8fCAhbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sCisJICAgICAgIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7CisKKwlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOworCWJ1ZlsxNV0gPSBhZGRyZXNzOworCisJcCA9IGJ1ZiArIDE2OworCisJLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7CisJCXBbM10gPSBpMmNfZGF0YVtpXTsKKwkJcCArPSA0OworCQlQREVCVUcoREJHX1RSQUNFLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAorCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOworCX0KKworCS8qIENvcHkgdGhlIHRhaWxlciAqLworCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOworCisJLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KKwlwWzNdID0gMHgxMCArIGxlbjsKKworCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAweDA0LCAweDQwLCAweDE5LAorCQkJICAgICAgMHgwMDAwLCBidWYsCisJCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKwordm9pZCBtdDltMTExX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCit7CisJdTggYWRkcmVzcywgdmFsdWVbMl0gPSB7MHgwMCwgMHgwMH07CisKKwlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIHJlZ2lzdGVyIHN0YXRlIik7CisKKwlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIHNlbnNvciBjb3JlIHJlZ2lzdGVycyIpOworCXZhbHVlWzFdID0gTVQ5TTExMV9TRU5TT1JfQ09SRTsKKwltdDltMTExX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOworCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKKwkJbXQ5bTExMV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgdmFsdWUsIDIpOworCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgleCIsCisJCSAgICAgYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKKwl9CisKKwlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNvbG9yIHBpcGVsaW5lIHJlZ2lzdGVycyIpOworCXZhbHVlWzFdID0gTVQ5TTExMV9DT0xPUlBJUEU7CisJbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKKwlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7CisJCW10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKKwkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAorCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJfQorCisJaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSBjYW1lcmEgY29udHJvbCByZWdpc3RlcnMiKTsKKwl2YWx1ZVsxXSA9IE1UOU0xMTFfQ0FNRVJBX0NPTlRST0w7CisJbXQ5bTExMV93cml0ZV9zZW5zb3Ioc2QsIE1UOU0xMTFfUEFHRV9NQVAsIHZhbHVlLCAyKTsKKwlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7CisJCW10OW0xMTFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKKwkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAorCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJfQorCisJaW5mbygibXQ5bTExMSByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfbXQ5bTExMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTVkODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuaApAQCAtMCwwICsxLDEwMjAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBtdDltMTExIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogU29tZSBkZWZpbmVzIHRha2VuIGZyb20gdGhlIG10OW0xMTEgc2Vuc29yIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2JlcnQgSmFyem1payA8cm9iZXJ0LmphcnptaWtAZnJlZS5mcj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2lmbmRlZiBNNTYwMl9NVDlNMTExX0hfCisjZGVmaW5lIE01NjAyX01UOU0xMTFfSF8KKworI2luY2x1ZGUgIm01NjAyX3NlbnNvci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVQ5TTExMV9TQ19DSElQVkVSCQkJMHgwMAorI2RlZmluZSBNVDlNMTExX1NDX1JPV1NUQVJUCQkJMHgwMQorI2RlZmluZSBNVDlNMTExX1NDX0NPTFNUQVJUCQkJMHgwMgorI2RlZmluZSBNVDlNMTExX1NDX1dJTkRPV19IRUlHSFQJCTB4MDMKKyNkZWZpbmUgTVQ5TTExMV9TQ19XSU5ET1dfV0lEVEgJCQkweDA0CisjZGVmaW5lIE1UOU0xMTFfU0NfSEJMQU5LX0NPTlRFWFRfQgkJMHgwNQorI2RlZmluZSBNVDlNMTExX1NDX1ZCTEFOS19DT05URVhUX0IJCTB4MDYKKyNkZWZpbmUgTVQ5TTExMV9TQ19IQkxBTktfQ09OVEVYVF9BCQkweDA3CisjZGVmaW5lIE1UOU0xMTFfU0NfVkJMQU5LX0NPTlRFWFRfQQkJMHgwOAorI2RlZmluZSBNVDlNMTExX1NDX1NIVVRURVJfV0lEVEgJCTB4MDkKKyNkZWZpbmUgTVQ5TTExMV9TQ19ST1dfU1BFRUQJCQkweDBhCisKKyNkZWZpbmUgTVQ5TTExMV9TQ19FWFRSQV9ERUxBWQkJCTB4MGIKKyNkZWZpbmUgTVQ5TTExMV9TQ19TSFVUVEVSX0RFTEFZCQkweDBjCisjZGVmaW5lIE1UOU0xMTFfU0NfUkVTRVQJCQkweDBkCisjZGVmaW5lIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQgkJMHgyMAorI2RlZmluZSBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0EJCTB4MjEKKyNkZWZpbmUgTVQ5TTExMV9TQ19GTEFTSF9DT05UUk9MCQkweDIzCisjZGVmaW5lIE1UOU0xMTFfU0NfR1JFRU5fMV9HQUlOCQkJMHgyYgorI2RlZmluZSBNVDlNMTExX1NDX0JMVUVfR0FJTgkJCTB4MmMKKyNkZWZpbmUgTVQ5TTExMV9TQ19SRURfR0FJTgkJCTB4MmQKKyNkZWZpbmUgTVQ5TTExMV9TQ19HUkVFTl8yX0dBSU4JCQkweDJlCisjZGVmaW5lIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4JCQkweDJmCisKKyNkZWZpbmUgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1MJCQkoMSA8PCAwKQorI2RlZmluZSBNVDlNMTExX1JNQl9NSVJST1JfQ09MUwkJCSgxIDw8IDEpCisKKyNkZWZpbmUgTVQ5TTExMV9DT05URVhUX0NPTlRST0wJCQkweGM4CisjZGVmaW5lIE1UOU0xMTFfUEFHRV9NQVAJCQkweGYwCisjZGVmaW5lIE1UOU0xMTFfQllURVdJU0VfQUREUkVTUwkJMHhmMQorCisjZGVmaW5lIE1UOU0xMTFfQ1BfT1BFUkFUSU5HX01PREVfQ1RMCQkweDA2CisjZGVmaW5lIE1UOU0xMTFfQ1BfTFVNQV9PRkZTRVQJCQkweDM0CisjZGVmaW5lIE1UOU0xMTFfQ1BfTFVNQV9DTElQCQkJMHgzNQorI2RlZmluZSBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0EgMHgzYQorI2RlZmluZSBNVDlNMTExX0NQX0xFTlNfQ09SUkVDVElPTl8xCQkweDNiCisjZGVmaW5lIE1UOU0xMTFfQ1BfREVGRUNUX0NPUlJfQ09OVEVYVF9BCTB4NGMKKyNkZWZpbmUgTVQ5TTExMV9DUF9ERUZFQ1RfQ09SUl9DT05URVhUX0IJMHg0ZAorI2RlZmluZSBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0IgMHg5YgorI2RlZmluZSBNVDlNMTExX0NQX0dMT0JBTF9DTEtfQ09OVFJPTAkJMHhiMworCisjZGVmaW5lIE1UOU0xMTFfQ0NfQVVUT19FWFBPU1VSRV9QQVJBTUVURVJfMTggICAweDY1CisjZGVmaW5lIE1UOU0xMTFfQ0NfQVdCX1BBUkFNRVRFUl83CQkweDI4CisKKyNkZWZpbmUgTVQ5TTExMV9TRU5TT1JfQ09SRQkJCTB4MDAKKyNkZWZpbmUgTVQ5TTExMV9DT0xPUlBJUEUJCQkweDAxCisjZGVmaW5lIE1UOU0xMTFfQ0FNRVJBX0NPTlRST0wJCQkweDAyCisKKyNkZWZpbmUgSU5JVElBTF9NQVhfR0FJTgkJCTY0CisjZGVmaW5lIERFRkFVTFRfR0FJTiAJCQkJMjgzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogS2VybmVsIG1vZHVsZSBwYXJhbWV0ZXJzICovCitleHRlcm4gaW50IGZvcmNlX3NlbnNvcjsKK2V4dGVybiBpbnQgZHVtcF9zZW5zb3I7CitleHRlcm4gdW5zaWduZWQgaW50IG01NjAyX2RlYnVnOworCitpbnQgbXQ5bTExMV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKTsKK2ludCBtdDltMTExX2luaXQoc3RydWN0IHNkICpzZCk7CitpbnQgbXQ5bTExMV9wb3dlcl9kb3duKHN0cnVjdCBzZCAqc2QpOworCitpbnQgbXQ5bTExMV9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOworCitpbnQgbXQ5bTExMV93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkJCSB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKK3ZvaWQgbXQ5bTExMV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKTsKKworaW50IG10OW0xMTFfc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBtdDltMTExX2dldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG10OW0xMTFfZ2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgbXQ5bTExMV9zZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IG10OW0xMTFfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBtdDltMTExX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKKworc3RhdGljIHN0cnVjdCBtNTYwMl9zZW5zb3IgbXQ5bTExMSA9IHsKKwkubmFtZSA9ICJNVDlNMTExIiwKKworCS5pMmNfc2xhdmVfaWQgPSAweGJhLAorCisJLnByb2JlID0gbXQ5bTExMV9wcm9iZSwKKwkuaW5pdCA9IG10OW0xMTFfaW5pdCwKKwkucG93ZXJfZG93biA9IG10OW0xMTFfcG93ZXJfZG93biwKKworCS5yZWFkX3NlbnNvciA9IG10OW0xMTFfcmVhZF9zZW5zb3IsCisJLndyaXRlX3NlbnNvciA9IG10OW0xMTFfd3JpdGVfc2Vuc29yLAorCisJLm5jdHJscyA9IDMsCisJLmN0cmxzID0geworCXsKKwkJeworCQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAorCQkJLnR5cGUgICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lICAgICAgICAgICA9ICJ2ZXJ0aWNhbCBmbGlwIiwKKwkJCS5taW5pbXVtICAgICAgICA9IDAsCisJCQkubWF4aW11bSAgICAgICAgPSAxLAorCQkJLnN0ZXAgICAgICAgICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlICA9IDAKKwkJfSwKKwkJLnNldCA9IG10OW0xMTFfc2V0X3ZmbGlwLAorCQkuZ2V0ID0gbXQ5bTExMV9nZXRfdmZsaXAKKwl9LCB7CisJCXsKKwkJCS5pZCAgICAgICAgICAgICA9IFY0TDJfQ0lEX0hGTElQLAorCQkJLnR5cGUgICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lICAgICAgICAgICA9ICJob3Jpem9udGFsIGZsaXAiLAorCQkJLm1pbmltdW0gICAgICAgID0gMCwKKwkJCS5tYXhpbXVtICAgICAgICA9IDEsCisJCQkuc3RlcCAgICAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMAorCQl9LAorCQkuc2V0ID0gbXQ5bTExMV9zZXRfaGZsaXAsCisJCS5nZXQgPSBtdDltMTExX2dldF9oZmxpcAorCX0sIHsKKwkJeworCQkJLmlkICAgICAgICAgICAgID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlICAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAgICAgICAgICAgPSAiZ2FpbiIsCisJCQkubWluaW11bSAgICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgID0gKElOSVRJQUxfTUFYX0dBSU4gLSAxKSAqIDIgKiAyICogMiwKKwkJCS5zdGVwICAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSAgPSBERUZBVUxUX0dBSU4sCisJCQkuZmxhZ3MgICAgICAgICAgPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IG10OW0xMTFfc2V0X2hmbGlwLAorCQkuZ2V0ID0gbXQ5bTExMV9nZXRfaGZsaXAKKwl9CisJfSwKKworCS5ubW9kZXMgPSAxLAorCS5tb2RlcyA9IHsKKwl7CisJCU01NjAyX0RFRkFVTFRfRlJBTUVfV0lEVEgsCisJCU01NjAyX0RFRkFVTFRfRlJBTUVfSEVJR0hULAorCQlWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQlWNEwyX0ZJRUxEX05PTkUsCisJCS5zaXplaW1hZ2UgPQorCQkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCAqIE01NjAyX0RFRkFVTFRfRlJBTUVfSEVJR0hULAorCQkuYnl0ZXNwZXJsaW5lID0gTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxCisJfQorCX0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByZWluaXRfbXQ5bTExMVtdWzRdID0KK3sKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX0NUUkwsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweGZmLCAweGY3fSwKKworCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDA1LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0wsIDB4MDAsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDcsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDBiLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHgwMCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ0xLX0RJViwgMHgwYSwgMHgwMH0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRfbXQ5bTExMVtdWzRdID0KK3sKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9DVFJMLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHhmZiwgMHhmZn0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHhmZiwgMHhmZn0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHhmZiwgMHhkZX0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHhmZiwgMHhmZn0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHhmZiwgMHhmN30sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMX0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4YjMsIDB4MDB9LAorCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9HTE9CQUxfQ0xLX0NPTlRST0wsIDB4ZmYsIDB4ZmZ9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDUsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDA0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4M2UsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4M2UsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MGIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ0xLX0RJViwgMHgwYSwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA1fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA4fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAxfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09QRVJBVElOR19NT0RFX0NUTCwgMHgwMCwgMHgxMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9MRU5TX0NPUlJFQ1RJT05fMSwgMHgwNCwgMHgyYX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9ERUZFQ1RfQ09SUl9DT05URVhUX0EsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfREVGRUNUX0NPUlJfQ09OVEVYVF9CLCAweDAwLCAweDAxfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xVTUFfT0ZGU0VULCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xVTUFfQ0xJUCwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9PVVRQVVRfRk9STUFUX0NUTDJfQ09OVEVYVF9BLCAweDE0LCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0IsIDB4MTQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHhjZCwgMHgwMH0sCisKKwl7U0VOU09SLCAweGNkLCAweDAwLCAweDBlfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4ZDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4ZDAsIDB4MDAsIDB4NDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDJ9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ0NfQVVUT19FWFBPU1VSRV9QQVJBTUVURVJfMTgsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BV0JfUEFSQU1FVEVSXzcsIDB4ZWYsIDB4MDd9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BV0JfUEFSQU1FVEVSXzcsIDB4ZWYsIDB4MDN9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgzMywgMHgwMH0sCisJe1NFTlNPUiwgMHgzMywgMHgwMywgMHg0OX0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDMzLCAweDAwfSwKKworCXtTRU5TT1IsIDB4MzMsIDB4MDMsIDB4NDl9LAorCXtTRU5TT1IsIDB4MzQsIDB4YzAsIDB4MTl9LAorCXtTRU5TT1IsIDB4M2YsIDB4MjAsIDB4MjB9LAorCXtTRU5TT1IsIDB4NDAsIDB4MjAsIDB4MjB9LAorCXtTRU5TT1IsIDB4NWEsIDB4YzAsIDB4MGF9LAorCXtTRU5TT1IsIDB4NzAsIDB4N2IsIDB4MGF9LAorCXtTRU5TT1IsIDB4NzEsIDB4ZmYsIDB4MDB9LAorCXtTRU5TT1IsIDB4NzIsIDB4MTksIDB4MGV9LAorCXtTRU5TT1IsIDB4NzMsIDB4MTgsIDB4MGZ9LAorCXtTRU5TT1IsIDB4NzQsIDB4NTcsIDB4MzJ9LAorCXtTRU5TT1IsIDB4NzUsIDB4NTYsIDB4MzR9LAorCXtTRU5TT1IsIDB4NzYsIDB4NzMsIDB4MzV9LAorCXtTRU5TT1IsIDB4NzcsIDB4MzAsIDB4MTJ9LAorCXtTRU5TT1IsIDB4NzgsIDB4NzksIDB4MDJ9LAorCXtTRU5TT1IsIDB4NzksIDB4NzUsIDB4MDZ9LAorCXtTRU5TT1IsIDB4N2EsIDB4NzcsIDB4MGF9LAorCXtTRU5TT1IsIDB4N2IsIDB4NzgsIDB4MDl9LAorCXtTRU5TT1IsIDB4N2MsIDB4N2QsIDB4MDZ9LAorCXtTRU5TT1IsIDB4N2QsIDB4MzEsIDB4MTB9LAorCXtTRU5TT1IsIDB4N2UsIDB4MDAsIDB4N2V9LAorCXtTRU5TT1IsIDB4ODAsIDB4NTksIDB4MDR9LAorCXtTRU5TT1IsIDB4ODEsIDB4NTksIDB4MDR9LAorCXtTRU5TT1IsIDB4ODIsIDB4NTcsIDB4MGF9LAorCXtTRU5TT1IsIDB4ODMsIDB4NTgsIDB4MGJ9LAorCXtTRU5TT1IsIDB4ODQsIDB4NDcsIDB4MGN9LAorCXtTRU5TT1IsIDB4ODUsIDB4NDgsIDB4MGV9LAorCXtTRU5TT1IsIDB4ODYsIDB4NWIsIDB4MDJ9LAorCXtTRU5TT1IsIDB4ODcsIDB4MDAsIDB4NWN9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ09OVEVYVF9DT05UUk9MLCAweDAwLCAweDA4fSwKKwl7U0VOU09SLCAweDYwLCAweDAwLCAweDgwfSwKKwl7U0VOU09SLCAweDYxLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDYyLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDYzLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDY0LCAweDAwLCAweDAwfSwKKworCXtTRU5TT1IsIE1UOU0xMTFfU0NfUk9XU1RBUlQsIDB4MDAsIDB4MGR9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfQ09MU1RBUlQsIDB4MDAsIDB4MTh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfV0lORE9XX0hFSUdIVCwgMHgwNCwgMHgwNH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19XSU5ET1dfV0lEVEgsIDB4MDUsIDB4MDh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfSEJMQU5LX0NPTlRFWFRfQiwgMHgwMSwgMHgzOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19WQkxBTktfQ09OVEVYVF9CLCAweDAwLCAweDExfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX0hCTEFOS19DT05URVhUX0EsIDB4MDEsIDB4Mzh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfVkJMQU5LX0NPTlRFWFRfQSwgMHgwMCwgMHgxMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLCAweDAxLCAweDAzfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0EsIDB4MDEsIDB4MDN9LAorCXtTRU5TT1IsIDB4MzAsIDB4MDQsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDUsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDcsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YTAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfU0hVVFRFUl9XSURUSCwgMHgwMSwgMHhmNH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19HTE9CQUxfR0FJTiwgMHgwMCwgMHhlYX0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSCwgMHg4MSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfUElYX09GX0xJTkVfSCwgMHg4MiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwNSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwNywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA5fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA4fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDBjfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA0fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAxfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4YjMsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfR0xPQkFMX0NMS19DT05UUk9MLCAweDAwLCAweDAzfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgzZSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgzZSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweGZmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9MLCAweGZmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9MLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDA3LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwYiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DTEtfRElWLCAweDBhLCAweDAwfSwKKworCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDV9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4Mjl9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDh9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfT1BFUkFUSU5HX01PREVfQ1RMLCAweDAwLCAweDEwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xFTlNfQ09SUkVDVElPTl8xLCAweDA0LCAweDJhfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0RFRkVDVF9DT1JSX0NPTlRFWFRfQSwgMHgwMCwgMHgwMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9ERUZFQ1RfQ09SUl9DT05URVhUX0IsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfTFVNQV9PRkZTRVQsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfTFVNQV9DTElQLCAweGZmLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0EsIDB4MTQsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfT1VUUFVUX0ZPUk1BVF9DVEwyX0NPTlRFWFRfQiwgMHgxNCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4Y2QsIDB4MDB9LAorCXtTRU5TT1IsIDB4Y2QsIDB4MDAsIDB4MGV9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHhkMCwgMHgwMH0sCisJe1NFTlNPUiwgMHhkMCwgMHgwMCwgMHg0MH0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMn0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BVVRPX0VYUE9TVVJFX1BBUkFNRVRFUl8xOCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDI4LCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NDX0FXQl9QQVJBTUVURVJfNywgMHhlZiwgMHgwN30sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDI4LCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NDX0FXQl9QQVJBTUVURVJfNywgMHhlZiwgMHgwM30sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDMzLCAweDAwfSwKKwl7U0VOU09SLCAweDMzLCAweDAzLCAweDQ5fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MzMsIDB4MDB9LAorCisJe1NFTlNPUiwgMHgzMywgMHgwMywgMHg0OX0sCisJe1NFTlNPUiwgMHgzNCwgMHhjMCwgMHgxOX0sCisJe1NFTlNPUiwgMHgzZiwgMHgyMCwgMHgyMH0sCisJe1NFTlNPUiwgMHg0MCwgMHgyMCwgMHgyMH0sCisJe1NFTlNPUiwgMHg1YSwgMHhjMCwgMHgwYX0sCisJe1NFTlNPUiwgMHg3MCwgMHg3YiwgMHgwYX0sCisJe1NFTlNPUiwgMHg3MSwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgMHg3MiwgMHgxOSwgMHgwZX0sCisJe1NFTlNPUiwgMHg3MywgMHgxOCwgMHgwZn0sCisJe1NFTlNPUiwgMHg3NCwgMHg1NywgMHgzMn0sCisJe1NFTlNPUiwgMHg3NSwgMHg1NiwgMHgzNH0sCisJe1NFTlNPUiwgMHg3NiwgMHg3MywgMHgzNX0sCisJe1NFTlNPUiwgMHg3NywgMHgzMCwgMHgxMn0sCisJe1NFTlNPUiwgMHg3OCwgMHg3OSwgMHgwMn0sCisJe1NFTlNPUiwgMHg3OSwgMHg3NSwgMHgwNn0sCisJe1NFTlNPUiwgMHg3YSwgMHg3NywgMHgwYX0sCisJe1NFTlNPUiwgMHg3YiwgMHg3OCwgMHgwOX0sCisJe1NFTlNPUiwgMHg3YywgMHg3ZCwgMHgwNn0sCisJe1NFTlNPUiwgMHg3ZCwgMHgzMSwgMHgxMH0sCisJe1NFTlNPUiwgMHg3ZSwgMHgwMCwgMHg3ZX0sCisJe1NFTlNPUiwgMHg4MCwgMHg1OSwgMHgwNH0sCisJe1NFTlNPUiwgMHg4MSwgMHg1OSwgMHgwNH0sCisJe1NFTlNPUiwgMHg4MiwgMHg1NywgMHgwYX0sCisJe1NFTlNPUiwgMHg4MywgMHg1OCwgMHgwYn0sCisJe1NFTlNPUiwgMHg4NCwgMHg0NywgMHgwY30sCisJe1NFTlNPUiwgMHg4NSwgMHg0OCwgMHgwZX0sCisJe1NFTlNPUiwgMHg4NiwgMHg1YiwgMHgwMn0sCisJe1NFTlNPUiwgMHg4NywgMHgwMCwgMHg1Y30sCisJe1NFTlNPUiwgTVQ5TTExMV9DT05URVhUX0NPTlRST0wsIDB4MDAsIDB4MDh9LAorCXtTRU5TT1IsIDB4NjAsIDB4MDAsIDB4ODB9LAorCXtTRU5TT1IsIDB4NjEsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4NjIsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4NjMsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4NjQsIDB4MDAsIDB4MDB9LAorCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19ST1dTVEFSVCwgMHgwMCwgMHgwZH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19DT0xTVEFSVCwgMHgwMCwgMHgxOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19XSU5ET1dfSEVJR0hULCAweDA0LCAweDA0fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1dJTkRPV19XSURUSCwgMHgwNSwgMHgwOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19IQkxBTktfQ09OVEVYVF9CLCAweDAxLCAweDM4fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1ZCTEFOS19DT05URVhUX0IsIDB4MDAsIDB4MTF9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfSEJMQU5LX0NPTlRFWFRfQSwgMHgwMSwgMHgzOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19WQkxBTktfQ09OVEVYVF9BLCAweDAwLCAweDExfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsIDB4MDEsIDB4MDN9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQSwgMHgwMSwgMHgwM30sCisJe1NFTlNPUiwgMHgzMCwgMHgwNCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSCwgMHg4MSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfUElYX09GX0xJTkVfSCwgMHg4MiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwNSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwNywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhhMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19TSFVUVEVSX1dJRFRILCAweDAxLCAweGY0fSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX0dMT0JBTF9HQUlOLCAweDAwLCAweGVhfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKworCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDl9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4Mjl9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MGN9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDR9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDF9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweGIzLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0dMT0JBTF9DTEtfQ09OVFJPTCwgMHgwMCwgMHgwM30sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDUsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDA0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4M2UsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4M2UsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MGIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ0xLX0RJViwgMHgwYSwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA1fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA4fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAxfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09QRVJBVElOR19NT0RFX0NUTCwgMHgwMCwgMHgxMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9MRU5TX0NPUlJFQ1RJT05fMSwgMHgwNCwgMHgyYX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9ERUZFQ1RfQ09SUl9DT05URVhUX0EsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfREVGRUNUX0NPUlJfQ09OVEVYVF9CLCAweDAwLCAweDAxfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xVTUFfT0ZGU0VULCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xVTUFfQ0xJUCwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9PVVRQVVRfRk9STUFUX0NUTDJfQ09OVEVYVF9BLCAweDE0LCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0IsIDB4MTQsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweGNkLCAweDAwfSwKKwl7U0VOU09SLCAweGNkLCAweDAwLCAweDBlfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4ZDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4ZDAsIDB4MDAsIDB4NDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDJ9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ0NfQVVUT19FWFBPU1VSRV9QQVJBTUVURVJfMTgsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BV0JfUEFSQU1FVEVSXzcsIDB4ZWYsIDB4MDd9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BV0JfUEFSQU1FVEVSXzcsIDB4ZWYsIDB4MDN9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgzMywgMHgwMH0sCisJe1NFTlNPUiwgMHgzMywgMHgwMywgMHg0OX0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDMzLCAweDAwfSwKKworCXtTRU5TT1IsIDB4MzMsIDB4MDMsIDB4NDl9LAorCXtTRU5TT1IsIDB4MzQsIDB4YzAsIDB4MTl9LAorCXtTRU5TT1IsIDB4M2YsIDB4MjAsIDB4MjB9LAorCXtTRU5TT1IsIDB4NDAsIDB4MjAsIDB4MjB9LAorCXtTRU5TT1IsIDB4NWEsIDB4YzAsIDB4MGF9LAorCXtTRU5TT1IsIDB4NzAsIDB4N2IsIDB4MGF9LAorCXtTRU5TT1IsIDB4NzEsIDB4ZmYsIDB4MDB9LAorCXtTRU5TT1IsIDB4NzIsIDB4MTksIDB4MGV9LAorCXtTRU5TT1IsIDB4NzMsIDB4MTgsIDB4MGZ9LAorCXtTRU5TT1IsIDB4NzQsIDB4NTcsIDB4MzJ9LAorCXtTRU5TT1IsIDB4NzUsIDB4NTYsIDB4MzR9LAorCXtTRU5TT1IsIDB4NzYsIDB4NzMsIDB4MzV9LAorCXtTRU5TT1IsIDB4NzcsIDB4MzAsIDB4MTJ9LAorCXtTRU5TT1IsIDB4NzgsIDB4NzksIDB4MDJ9LAorCXtTRU5TT1IsIDB4NzksIDB4NzUsIDB4MDZ9LAorCXtTRU5TT1IsIDB4N2EsIDB4NzcsIDB4MGF9LAorCXtTRU5TT1IsIDB4N2IsIDB4NzgsIDB4MDl9LAorCXtTRU5TT1IsIDB4N2MsIDB4N2QsIDB4MDZ9LAorCXtTRU5TT1IsIDB4N2QsIDB4MzEsIDB4MTB9LAorCXtTRU5TT1IsIDB4N2UsIDB4MDAsIDB4N2V9LAorCXtTRU5TT1IsIDB4ODAsIDB4NTksIDB4MDR9LAorCXtTRU5TT1IsIDB4ODEsIDB4NTksIDB4MDR9LAorCXtTRU5TT1IsIDB4ODIsIDB4NTcsIDB4MGF9LAorCXtTRU5TT1IsIDB4ODMsIDB4NTgsIDB4MGJ9LAorCXtTRU5TT1IsIDB4ODQsIDB4NDcsIDB4MGN9LAorCXtTRU5TT1IsIDB4ODUsIDB4NDgsIDB4MGV9LAorCXtTRU5TT1IsIDB4ODYsIDB4NWIsIDB4MDJ9LAorCXtTRU5TT1IsIDB4ODcsIDB4MDAsIDB4NWN9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ09OVEVYVF9DT05UUk9MLCAweDAwLCAweDA4fSwKKwl7U0VOU09SLCAweDYwLCAweDAwLCAweDgwfSwKKwl7U0VOU09SLCAweDYxLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDYyLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDYzLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDY0LCAweDAwLCAweDAwfSwKKworCXtTRU5TT1IsIE1UOU0xMTFfU0NfUk9XU1RBUlQsIDB4MDAsIDB4MGR9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfQ09MU1RBUlQsIDB4MDAsIDB4MTh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfV0lORE9XX0hFSUdIVCwgMHgwNCwgMHgwNH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19XSU5ET1dfV0lEVEgsIDB4MDUsIDB4MDh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfSEJMQU5LX0NPTlRFWFRfQiwgMHgwMSwgMHgzOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19WQkxBTktfQ09OVEVYVF9CLCAweDAwLCAweDExfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX0hCTEFOS19DT05URVhUX0EsIDB4MDEsIDB4Mzh9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfVkJMQU5LX0NPTlRFWFRfQSwgMHgwMCwgMHgxMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9CLCAweDAxLCAweDAzfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0EsIDB4MDEsIDB4MDN9LAorCXtTRU5TT1IsIDB4MzAsIDB4MDQsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDUsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDcsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YTAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfU0hVVFRFUl9XSURUSCwgMHgwMSwgMHhmNH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19HTE9CQUxfR0FJTiwgMHgwMCwgMHhlYX0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA5fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4Mjl9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwOH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDBjfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDR9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweGIzLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9HTE9CQUxfQ0xLX0NPTlRST0wsIDB4MDAsIDB4MDN9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDA1LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDcsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDBiLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NMS19ESVYsIDB4MGEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwNX0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwOH0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9PUEVSQVRJTkdfTU9ERV9DVEwsIDB4MDAsIDB4MTB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfTEVOU19DT1JSRUNUSU9OXzEsIDB4MDQsIDB4MmF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfREVGRUNUX0NPUlJfQ09OVEVYVF9BLCAweDAwLCAweDAxfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0RFRkVDVF9DT1JSX0NPTlRFWFRfQiwgMHgwMCwgMHgwMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9MVU1BX09GRlNFVCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9MVU1BX0NMSVAsIDB4ZmYsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfT1VUUFVUX0ZPUk1BVF9DVEwyX0NPTlRFWFRfQSwgMHgxNCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9PVVRQVVRfRk9STUFUX0NUTDJfQ09OVEVYVF9CLCAweDE0LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweGNkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgMHhjZCwgMHgwMCwgMHgwZX0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4ZDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCAweGQwLCAweDAwLCAweDQwfSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAyfSwKKwl7U0VOU09SLCBNVDlNMTExX0NDX0FVVE9fRVhQT1NVUkVfUEFSQU1FVEVSXzE4LCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ0NfQVdCX1BBUkFNRVRFUl83LCAweGVmLCAweDA3fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgyOCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ0NfQVdCX1BBUkFNRVRFUl83LCAweGVmLCAweDAzfSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgzMywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIDB4MzMsIDB4MDMsIDB4NDl9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDMzLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisKKwl7U0VOU09SLCAweDMzLCAweDAzLCAweDQ5fSwKKwl7U0VOU09SLCAweDM0LCAweGMwLCAweDE5fSwKKwl7U0VOU09SLCAweDNmLCAweDIwLCAweDIwfSwKKwl7U0VOU09SLCAweDQwLCAweDIwLCAweDIwfSwKKwl7U0VOU09SLCAweDVhLCAweGMwLCAweDBhfSwKKwl7U0VOU09SLCAweDcwLCAweDdiLCAweDBhfSwKKwl7U0VOU09SLCAweDcxLCAweGZmLCAweDAwfSwKKwl7U0VOU09SLCAweDcyLCAweDE5LCAweDBlfSwKKwl7U0VOU09SLCAweDczLCAweDE4LCAweDBmfSwKKwl7U0VOU09SLCAweDc0LCAweDU3LCAweDMyfSwKKwl7U0VOU09SLCAweDc1LCAweDU2LCAweDM0fSwKKwl7U0VOU09SLCAweDc2LCAweDczLCAweDM1fSwKKwl7U0VOU09SLCAweDc3LCAweDMwLCAweDEyfSwKKwl7U0VOU09SLCAweDc4LCAweDc5LCAweDAyfSwKKwl7U0VOU09SLCAweDc5LCAweDc1LCAweDA2fSwKKwl7U0VOU09SLCAweDdhLCAweDc3LCAweDBhfSwKKwl7U0VOU09SLCAweDdiLCAweDc4LCAweDA5fSwKKwl7U0VOU09SLCAweDdjLCAweDdkLCAweDA2fSwKKwl7U0VOU09SLCAweDdkLCAweDMxLCAweDEwfSwKKwl7U0VOU09SLCAweDdlLCAweDAwLCAweDdlfSwKKwl7U0VOU09SLCAweDgwLCAweDU5LCAweDA0fSwKKwl7U0VOU09SLCAweDgxLCAweDU5LCAweDA0fSwKKwl7U0VOU09SLCAweDgyLCAweDU3LCAweDBhfSwKKwl7U0VOU09SLCAweDgzLCAweDU4LCAweDBifSwKKwl7U0VOU09SLCAweDg0LCAweDQ3LCAweDBjfSwKKwl7U0VOU09SLCAweDg1LCAweDQ4LCAweDBlfSwKKwl7U0VOU09SLCAweDg2LCAweDViLCAweDAyfSwKKwl7U0VOU09SLCAweDg3LCAweDAwLCAweDVjfSwKKwl7U0VOU09SLCBNVDlNMTExX0NPTlRFWFRfQ09OVFJPTCwgMHgwMCwgMHgwOH0sCisJe1NFTlNPUiwgMHg2MCwgMHgwMCwgMHg4MH0sCisJe1NFTlNPUiwgMHg2MSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2MiwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2MywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2NCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19ST1dTVEFSVCwgMHgwMCwgMHgwZH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19DT0xTVEFSVCwgMHgwMCwgMHgxMn0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19XSU5ET1dfSEVJR0hULCAweDA0LCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1dJTkRPV19XSURUSCwgMHgwNSwgMHgxMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19IQkxBTktfQ09OVEVYVF9CLCAweDAxLCAweDYwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1ZCTEFOS19DT05URVhUX0IsIDB4MDAsIDB4MTF9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfSEJMQU5LX0NPTlRFWFRfQSwgMHgwMSwgMHg2MH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19WQkxBTktfQ09OVEVYVF9BLCAweDAwLCAweDExfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JfTU9ERV9DT05URVhUX0IsIDB4MDEsIDB4MGZ9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQSwgMHgwMSwgMHgwZn0sCisJe1NFTlNPUiwgMHgzMCwgMHgwNCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfSCwgMHg4MSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfUElYX09GX0xJTkVfSCwgMHg4MiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHhlMywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHg4NywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1NIVVRURVJfV0lEVEgsIDB4MDEsIDB4OTB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4sIDB4MDAsIDB4ZTZ9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwOX0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDh9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwY30sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDA0fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAxfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHhiMywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfR0xPQkFMX0NMS19DT05UUk9MLCAweDAwLCAweDAzfSwKKworCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDA1LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDNlLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDcsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDBiLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NMS19ESVYsIDB4MGEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SRVNFVCwgMHgwMCwgMHgwNX0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JFU0VULCAweDAwLCAweDI5fSwKKwl7U0VOU09SLCBNVDlNMTExX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgwZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUkVTRVQsIDB4MDAsIDB4MDh9LAorCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfT1BFUkFUSU5HX01PREVfQ1RMLCAweDAwLCAweDEwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0xFTlNfQ09SUkVDVElPTl8xLCAweDA0LCAweDJhfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX0RFRkVDVF9DT1JSX0NPTlRFWFRfQSwgMHgwMCwgMHgwMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9DUF9ERUZFQ1RfQ09SUl9DT05URVhUX0IsIDB4MDAsIDB4MDF9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfTFVNQV9PRkZTRVQsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfTFVNQV9DTElQLCAweGZmLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NQX09VVFBVVF9GT1JNQVRfQ1RMMl9DT05URVhUX0EsIDB4MTQsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfQ1BfT1VUUFVUX0ZPUk1BVF9DVEwyX0NPTlRFWFRfQiwgMHgxNCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHhjZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIDB4Y2QsIDB4MDAsIDB4MGV9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweGQwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisJe1NFTlNPUiwgMHhkMCwgMHgwMCwgMHg0MH0sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMn0sCisJe1NFTlNPUiwgTVQ5TTExMV9DQ19BVVRPX0VYUE9TVVJFX1BBUkFNRVRFUl8xOCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MjgsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NDX0FXQl9QQVJBTUVURVJfNywgMHhlZiwgMHgwN30sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0RFVl9BRERSLCAweGJhLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIDB4MjgsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DVFJMLCAweDFhLCAweDAwfSwKKwl7U0VOU09SLCBNVDlNMTExX0NDX0FXQl9QQVJBTUVURVJfNywgMHhlZiwgMHgwM30sCisJe1NFTlNPUiwgTVQ5TTExMV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsIDB4YmEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19SRUdfQUREUiwgMHgzMywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MWEsIDB4MDB9LAorCXtTRU5TT1IsIDB4MzMsIDB4MDMsIDB4NDl9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwgMHhiYSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCAweDMzLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ1RSTCwgMHgxYSwgMHgwMH0sCisKKwl7U0VOU09SLCAweDMzLCAweDAzLCAweDQ5fSwKKwl7U0VOU09SLCAweDM0LCAweGMwLCAweDE5fSwKKwl7U0VOU09SLCAweDNmLCAweDIwLCAweDIwfSwKKwl7U0VOU09SLCAweDQwLCAweDIwLCAweDIwfSwKKwl7U0VOU09SLCAweDVhLCAweGMwLCAweDBhfSwKKwl7U0VOU09SLCAweDcwLCAweDdiLCAweDBhfSwKKwl7U0VOU09SLCAweDcxLCAweGZmLCAweDAwfSwKKwl7U0VOU09SLCAweDcyLCAweDE5LCAweDBlfSwKKwl7U0VOU09SLCAweDczLCAweDE4LCAweDBmfSwKKwl7U0VOU09SLCAweDc0LCAweDU3LCAweDMyfSwKKwl7U0VOU09SLCAweDc1LCAweDU2LCAweDM0fSwKKwl7U0VOU09SLCAweDc2LCAweDczLCAweDM1fSwKKwl7U0VOU09SLCAweDc3LCAweDMwLCAweDEyfSwKKwl7U0VOU09SLCAweDc4LCAweDc5LCAweDAyfSwKKwl7U0VOU09SLCAweDc5LCAweDc1LCAweDA2fSwKKwl7U0VOU09SLCAweDdhLCAweDc3LCAweDBhfSwKKwl7U0VOU09SLCAweDdiLCAweDc4LCAweDA5fSwKKwl7U0VOU09SLCAweDdjLCAweDdkLCAweDA2fSwKKwl7U0VOU09SLCAweDdkLCAweDMxLCAweDEwfSwKKwl7U0VOU09SLCAweDdlLCAweDAwLCAweDdlfSwKKwl7U0VOU09SLCAweDgwLCAweDU5LCAweDA0fSwKKwl7U0VOU09SLCAweDgxLCAweDU5LCAweDA0fSwKKwl7U0VOU09SLCAweDgyLCAweDU3LCAweDBhfSwKKwl7U0VOU09SLCAweDgzLCAweDU4LCAweDBifSwKKwl7U0VOU09SLCAweDg0LCAweDQ3LCAweDBjfSwKKwl7U0VOU09SLCAweDg1LCAweDQ4LCAweDBlfSwKKwl7U0VOU09SLCAweDg2LCAweDViLCAweDAyfSwKKwl7U0VOU09SLCAweDg3LCAweDAwLCAweDVjfSwKKwl7U0VOU09SLCBNVDlNMTExX0NPTlRFWFRfQ09OVFJPTCwgMHgwMCwgMHgwOH0sCisJe1NFTlNPUiwgMHg2MCwgMHgwMCwgMHg4MH0sCisJe1NFTlNPUiwgMHg2MSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2MiwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2MywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg2NCwgMHgwMCwgMHgwMH0sCisKKwl7U0VOU09SLCBNVDlNMTExX1NDX1JPV1NUQVJULCAweDAwLCAweDBkfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX0NPTFNUQVJULCAweDAwLCAweDEyfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1dJTkRPV19IRUlHSFQsIDB4MDQsIDB4MDB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfV0lORE9XX1dJRFRILCAweDA1LCAweDEwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX0hCTEFOS19DT05URVhUX0IsIDB4MDEsIDB4NjB9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfVkJMQU5LX0NPTlRFWFRfQiwgMHgwMCwgMHgxMX0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19IQkxBTktfQ09OVEVYVF9BLCAweDAxLCAweDYwfSwKKwl7U0VOU09SLCBNVDlNMTExX1NDX1ZCTEFOS19DT05URVhUX0EsIDB4MDAsIDB4MTF9LAorCXtTRU5TT1IsIE1UOU0xMTFfU0NfUl9NT0RFX0NPTlRFWFRfQiwgMHgwMSwgMHgwZn0sCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19SX01PREVfQ09OVEVYVF9BLCAweDAxLCAweDBmfSwKKwl7U0VOU09SLCAweDMwLCAweDA0LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9QSVhfT0ZfTElORV9ILCAweDgyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGUwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDdmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKworCXtTRU5TT1IsIE1UOU0xMTFfUEFHRV9NQVAsIDB4MDAsIDB4MDB9LAorCS8qIFNldCBudW1iZXIgb2YgYmxhbmsgcm93cyBjaG9zZW4gdG8gNDAwICovCisJe1NFTlNPUiwgTVQ5TTExMV9TQ19TSFVUVEVSX1dJRFRILCAweDAxLCAweDkwfSwKKwkvKiBTZXQgdGhlIGdsb2JhbCBnYWluIHRvIDI4MyAob2YgNTEyKSAqLworCXtTRU5TT1IsIE1UOU0xMTFfU0NfR0xPQkFMX0dBSU4sIDB4MDMsIDB4NjN9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgb3Y5NjUwIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpbmNsdWRlICJtNTYwMl9vdjk2NTAuaCIKKworaW50IG92OTY1MF9yZWFkX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCisJLyogVGhlIG92OTY1MCByZWdpc3RlcnMgaGF2ZSBhIG1heCBkZXB0aCBvZiBvbmUgYnl0ZSAqLworCWlmIChsZW4gPiAxIHx8ICFsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJZG8geworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOworCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7CisKKwltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKKwkJCSAgIG92OTY1MC5pMmNfc2xhdmVfaWQpOworCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1JFR19BRERSLCBhZGRyZXNzKTsKKwltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19DVFJMLCAweDEwICsgbGVuKTsKKwltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19DVFJMLCAweDA4KTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0RBVEEsICYoaTJjX2RhdGFbaV0pKTsKKworCQlQREVCVUcoREJHX1RSQUNFLCAiUmVhZGluZyBzZW5zb3IgcmVnaXN0ZXIgIgorCQkJCSIweCV4IGNvbnRhaW5pbmcgMHgleCAiLCBhZGRyZXNzLCAqaTJjX2RhdGEpOworCX0KKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IG92OTY1MF93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkJCXU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKQoreworCWludCBlcnIsIGk7CisJdTggKnA7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZC0+Z3NwY2FfZGV2LmRldjsKKwlfX3U4ICpidWYgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWY7CisKKwkvKiBUaGUgb3Y5NjUwIG9ubHkgc3VwcG9ydHMgb25lIGJ5dGUgd3JpdGVzICovCisJaWYgKGxlbiA+IDEgfHwgIWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoYnVmLCBzZW5zb3JfdXJiX3NrZWxldG9uLAorCSAgICAgICBzaXplb2Yoc2Vuc29yX3VyYl9za2VsZXRvbikpOworCisJYnVmWzExXSA9IHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZDsKKwlidWZbMTVdID0gYWRkcmVzczsKKworCS8qIFNwZWNpYWwgY2FzZSBsYXJnZXIgc2Vuc29yIHdyaXRlcyAqLworCXAgPSBidWYgKyAxNjsKKworCS8qIENvcHkgYSBmb3VyIGJ5dGUgd3JpdGUgc2VxdWVuY2UgZm9yIGVhY2ggYnl0ZSB0byBiZSB3cml0dGVuIHRvICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMTYsIDQpOworCQlwWzNdID0gaTJjX2RhdGFbaV07CisJCXAgKz0gNDsKKwkJUERFQlVHKERCR19UUkFDRSwgIldyaXRpbmcgc2Vuc29yIHJlZ2lzdGVyIDB4JXggd2l0aCAweCV4IiwKKwkJICAgICAgIGFkZHJlc3MsIGkyY19kYXRhW2ldKTsKKwl9CisKKwkvKiBDb3B5IHRoZSB0YWlsZXIgKi8KKwltZW1jcHkocCwgc2Vuc29yX3VyYl9za2VsZXRvbiArIDIwLCA0KTsKKworCS8qIFNldCB0aGUgdG90YWwgbGVuZ3RoICovCisJcFszXSA9IDB4MTAgKyBsZW47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgMHgwNCwgMHg0MCwgMHgxOSwKKwkJCSAgICAgIDB4MDAwMCwgYnVmLAorCQkJICAgICAgMjAgKyBsZW4gKiA0LCBNNTYwMl9VUkJfTVNHX1RJTUVPVVQpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfcHJvYmUoc3RydWN0IHNkICpzZCkKK3sKKwl1OCBwcm9kX2lkID0gMCwgdmVyX2lkID0gMCwgaTsKKworCWlmIChmb3JjZV9zZW5zb3IpIHsKKwkJaWYgKGZvcmNlX3NlbnNvciA9PSBPVjk2NTBfU0VOU09SKSB7CisJCQlpbmZvKCJGb3JjaW5nIGFuICVzIHNlbnNvciIsIG92OTY1MC5uYW1lKTsKKwkJCWdvdG8gc2Vuc29yX2ZvdW5kOworCQl9CisJCS8qIElmIHdlIHdhbnQgdG8gZm9yY2UgYW5vdGhlciBzZW5zb3IsCisJCSAgIGRvbid0IHRyeSB0byBwcm9iZSB0aGlzIG9uZSAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvKCJQcm9iaW5nIGZvciBhbiBvdjk2NTAgc2Vuc29yIik7CisKKwkvKiBSdW4gdGhlIHByZS1pbml0IHRvIGFjdHVhbGx5IHByb2JlIHRoZSB1bml0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJlaW5pdF9vdjk2NTApOyBpKyspIHsKKwkJdTggZGF0YSA9IHByZWluaXRfb3Y5NjUwW2ldWzJdOworCQlpZiAocHJlaW5pdF9vdjk2NTBbaV1bMF0gPT0gU0VOU09SKQorCQkJb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwKKwkJCQkJICAgIHByZWluaXRfb3Y5NjUwW2ldWzFdLCAmZGF0YSwgMSk7CisJCWVsc2UKKwkJCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgcHJlaW5pdF9vdjk2NTBbaV1bMV0sIGRhdGEpOworCX0KKworCWlmIChvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9QSUQsICZwcm9kX2lkLCAxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAob3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVkVSLCAmdmVyX2lkLCAxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKHByb2RfaWQgPT0gMHg5NikgJiYgKHZlcl9pZCA9PSAweDUyKSkgeworCQlpbmZvKCJEZXRlY3RlZCBhbiBvdjk2NTAgc2Vuc29yIik7CisJCWdvdG8gc2Vuc29yX2ZvdW5kOworCX0KKworCXJldHVybiAtRU5PREVWOworCitzZW5zb3JfZm91bmQ6CisJc2QtPmdzcGNhX2Rldi5jYW0uY2FtX21vZGUgPSBvdjk2NTAubW9kZXM7CisJc2QtPmdzcGNhX2Rldi5jYW0ubm1vZGVzID0gb3Y5NjUwLm5tb2RlczsKKwlzZC0+ZGVzYy0+Y3RybHMgPSBvdjk2NTAuY3RybHM7CisJc2QtPmRlc2MtPm5jdHJscyA9IG92OTY1MC5uY3RybHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBvdjk2NTBfaW5pdChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBpLCBlcnIgPSAwOworCXU4IGRhdGE7CisKKwlpZiAoZHVtcF9zZW5zb3IpCisJCW92OTY1MF9kdW1wX3JlZ2lzdGVycyhzZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X292OTY1MCkgJiYgIWVycjsgaSsrKSB7CisJCWRhdGEgPSBpbml0X292OTY1MFtpXVsyXTsKKwkJaWYgKGluaXRfb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKKwkJCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIGluaXRfb3Y5NjUwW2ldWzFdLAorCQkJCQkJICAmZGF0YSwgMSk7CisJCWVsc2UKKwkJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgaW5pdF9vdjk2NTBbaV1bMV0sIGRhdGEpOworCX0KKworCWlmICghZXJyICYmIGRtaV9jaGVja19zeXN0ZW0ob3Y5NjUwX2ZsaXBfZG1pX3RhYmxlKSkgeworCQlpbmZvKCJ2ZmxpcCBxdWlyayBhY3RpdmUiKTsKKwkJZGF0YSA9IDB4MzA7CisJCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmZGF0YSwgMSk7CisJfQorCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvd2VyX2Rvd25fb3Y5NjUwKTsgaSsrKSB7CisJCXU4IGRhdGEgPSBwb3dlcl9kb3duX292OTY1MFtpXVsyXTsKKwkJaWYgKHBvd2VyX2Rvd25fb3Y5NjUwW2ldWzBdID09IFNFTlNPUikKKwkJCW92OTY1MF93cml0ZV9zZW5zb3Ioc2QsCisJCQkJCSAgICBwb3dlcl9kb3duX292OTY1MFtpXVsxXSwgJmRhdGEsIDEpOworCQllbHNlCisJCQltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIHBvd2VyX2Rvd25fb3Y5NjUwW2ldWzFdLCBkYXRhKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG92OTY1MF9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBpMmNfZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NMSwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJKnZhbCA9IGkyY19kYXRhICYgMHgwMzsKKworCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0FFQ0gsICZpMmNfZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCSp2YWwgfD0gKGkyY19kYXRhIDw8IDIpOworCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQUVDSE0sICZpMmNfZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCSp2YWwgfD0gKGkyY19kYXRhICYgMHgzZikgPDwgMTA7CisKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBleHBvc3VyZSAlZCIsICp2YWwpOworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggaTJjX2RhdGE7CisJaW50IGVycjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgZXhwb3N1cmUgdG8gJWQiLAorCSAgICAgICB2YWwgJiAweGZmZmYpOworCisJLyogVGhlIDYgTVNCcyAqLworCWkyY19kYXRhID0gKHZhbCA+PiAxMCkgJiAweDNmOworCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9BRUNITSwKKwkJCQkgICZpMmNfZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJLyogVGhlIDggbWlkZGxlIGJpdHMgKi8KKwlpMmNfZGF0YSA9ICh2YWwgPj4gMikgJiAweGZmOworCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9BRUNILAorCQkJCSAgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgMiBMU0JzICovCisJaTJjX2RhdGEgPSB2YWwgJiAweDAzOworCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9DT00xLCAmaTJjX2RhdGEsIDEpOworCitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVlJFRiwgJmkyY19kYXRhLCAxKTsKKwkqdmFsID0gKGkyY19kYXRhICYgMHgwMykgPDwgODsKKworCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0dBSU4sICZpMmNfZGF0YSwgMSk7CisJKnZhbCB8PSBpMmNfZGF0YTsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBnYWluICVkIiwgKnZhbCk7CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkvKiBUaGUgMiBNU0IgKi8KKwkvKiBSZWFkIHRoZSBPVjk2NTBfVlJFRiByZWdpc3RlciBmaXJzdCB0byBhdm9pZAorCSAgIGNvcnJ1cHRpbmcgdGhlIFZSRUYgaGlnaCBhbmQgbG93IGJpdHMgKi8KKwlvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOworCS8qIE1hc2sgYXdheSBhbGwgdW5pbnRlcmVzdGluZyBiaXRzICovCisJaTJjX2RhdGEgPSAoKHZhbCAmIDB4MDMwMCkgPj4gMikgfAorCQkJKGkyY19kYXRhICYgMHgzRik7CisJZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CisKKwkvKiBUaGUgOCBMU0JzICovCisJaTJjX2RhdGEgPSB2YWwgJiAweGZmOworCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9HQUlOLCAmaTJjX2RhdGEsIDEpOworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX2dldF9yZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9SRUQsICZpMmNfZGF0YSwgMSk7CisJKnZhbCA9IGkyY19kYXRhOworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgcmVkIGdhaW4gJWQiLCAqdmFsKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX3NldF9yZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgcmVkIGdhaW4gdG8gJWQiLAorCQkJICAgICB2YWwgJiAweGZmKTsKKworCWkyY19kYXRhID0gdmFsICYgMHhmZjsKKwllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfUkVELCAmaTJjX2RhdGEsIDEpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfZ2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9CTFVFLCAmaTJjX2RhdGEsIDEpOworCSp2YWwgPSBpMmNfZGF0YTsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJSZWFkIGJsdWUgZ2FpbiAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfc2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgYmx1ZSBnYWluIHRvICVkIiwKKwkgICAgICAgdmFsICYgMHhmZik7CisKKwlpMmNfZGF0YSA9IHZhbCAmIDB4ZmY7CisJZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX0JMVUUsICZpMmNfZGF0YSwgMSk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IG92OTY1MF9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShvdjk2NTBfZmxpcF9kbWlfdGFibGUpKQorCQkqdmFsID0gKChpMmNfZGF0YSAmIE9WOTY1MF9IRkxJUCkgPj4gNSkgPyAwIDogMTsKKwllbHNlCisJCSp2YWwgPSAoaTJjX2RhdGEgJiBPVjk2NTBfSEZMSVApID4+IDU7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgaG9yaXpvbnRhbCBmbGlwICVkIiwgKnZhbCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IG92OTY1MF9zZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiU2V0IGhvcml6b250YWwgZmxpcCB0byAlZCIsIHZhbCk7CisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShvdjk2NTBfZmxpcF9kbWlfdGFibGUpKQorCQlpMmNfZGF0YSA9ICgoaTJjX2RhdGEgJiAweGRmKSB8CisJCQkJKCgodmFsID8gMCA6IDEpICYgMHgwMSkgPDwgNSkpOworCWVsc2UKKwkJaTJjX2RhdGEgPSAoKGkyY19kYXRhICYgMHhkZikgfAorCQkJCSgodmFsICYgMHgwMSkgPDwgNSkpOworCisJZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX01WRlAsICZpMmNfZGF0YSwgMSk7CisJaWYgKGRtaV9jaGVja19zeXN0ZW0ob3Y5NjUwX2ZsaXBfZG1pX3RhYmxlKSkKKwkJKnZhbCA9ICgoaTJjX2RhdGEgJiAweDEwKSA+PiA0KSA/IDAgOiAxOworCWVsc2UKKwkJKnZhbCA9IChpMmNfZGF0YSAmIDB4MTApID4+IDQ7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgdmVydGljYWwgZmxpcCAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJdTggaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIlNldCB2ZXJ0aWNhbCBmbGlwIHRvICVkIiwgdmFsKTsKKwllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9NVkZQLCAmaTJjX2RhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChkbWlfY2hlY2tfc3lzdGVtKG92OTY1MF9mbGlwX2RtaV90YWJsZSkpCisJCWkyY19kYXRhID0gKChpMmNfZGF0YSAmIDB4ZWYpIHwKKwkJCQkoKCh2YWwgPyAwIDogMSkgJiAweDAxKSA8PCA0KSk7CisJZWxzZQorCQlpMmNfZGF0YSA9ICgoaTJjX2RhdGEgJiAweGVmKSB8CisJCQkJKCh2YWwgJiAweDAxKSA8PCA0KSk7CisKKwllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfTVZGUCwgJmkyY19kYXRhLCAxKTsKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IG92OTY1MF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIE9WOTY1MF9WUkVGLCAmaTJjX2RhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwkqdmFsID0gKGkyY19kYXRhICYgMHgwMykgPDwgODsKKworCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0dBSU4sICZpMmNfZGF0YSwgMSk7CisJKnZhbCB8PSBpMmNfZGF0YTsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBnYWluICVkIiwgKnZhbCk7CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfc2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiU2V0IGdhaW4gdG8gJWQiLCB2YWwgJiAweDNmZik7CisKKwkvKiBSZWFkIHRoZSBPVjk2NTBfVlJFRiByZWdpc3RlciBmaXJzdCB0byBhdm9pZAorCQljb3JydXB0aW5nIHRoZSBWUkVGIGhpZ2ggYW5kIGxvdyBiaXRzICovCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfVlJFRiwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBNYXNrIGF3YXkgYWxsIHVuaW50ZXJlc3RpbmcgYml0cyAqLworCWkyY19kYXRhID0gKCh2YWwgJiAweDAzMDApID4+IDIpIHwgKGkyY19kYXRhICYgMHgzRik7CisJZXJyID0gb3Y5NjUwX3dyaXRlX3NlbnNvcihzZCwgT1Y5NjUwX1ZSRUYsICZpMmNfZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJLyogVGhlIDggTFNCcyAqLworCWkyY19kYXRhID0gdmFsICYgMHhmZjsKKwllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfR0FJTiwgJmkyY19kYXRhLCAxKTsKKworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX2dldF9hdXRvX3doaXRlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKKwkqdmFsID0gKGkyY19kYXRhICYgT1Y5NjUwX0FXQl9FTikgPj4gMTsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBhdXRvIHdoaXRlIGJhbGFuY2UgJWQiLCAqdmFsKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX3NldF9hdXRvX3doaXRlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBpMmNfZGF0YTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiU2V0IGF1dG8gd2hpdGUgYmFsYW5jZSB0byAlZCIsIHZhbCk7CisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpMmNfZGF0YSA9ICgoaTJjX2RhdGEgJiAweGZkKSB8ICgodmFsICYgMHgwMSkgPDwgMSkpOworCWVyciA9IG92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIE9WOTY1MF9DT004LCAmaTJjX2RhdGEsIDEpOworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgb3Y5NjUwX2dldF9hdXRvX2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggaTJjX2RhdGE7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gb3Y5NjUwX3JlYWRfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKKwkqdmFsID0gKGkyY19kYXRhICYgT1Y5NjUwX0FHQ19FTikgPj4gMjsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBhdXRvIGdhaW4gY29udHJvbCAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBvdjk2NTBfc2V0X2F1dG9fZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGkyY19kYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgYXV0byBnYWluIGNvbnRyb2wgdG8gJWQiLCB2YWwpOworCWVyciA9IG92OTY1MF9yZWFkX3NlbnNvcihzZCwgT1Y5NjUwX0NPTTgsICZpMmNfZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJaTJjX2RhdGEgPSAoKGkyY19kYXRhICYgMHhmYikgfCAoKHZhbCAmIDB4MDEpIDw8IDIpKTsKKwllcnIgPSBvdjk2NTBfd3JpdGVfc2Vuc29yKHNkLCBPVjk2NTBfQ09NOCwgJmkyY19kYXRhLCAxKTsKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKwordm9pZCBvdjk2NTBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgYWRkcmVzczsKKwlpbmZvKCJEdW1waW5nIHRoZSBvdjk2NTAgcmVnaXN0ZXIgc3RhdGUiKTsKKwlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhhOTsgYWRkcmVzcysrKSB7CisJCXU4IHZhbHVlOworCQlvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7CisJCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCisJCSAgICAgYWRkcmVzcywgdmFsdWUpOworCX0KKworCWluZm8oIm92OTY1MCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlIik7CisKKwlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSIpOworCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKKwkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOworCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OworCisJCW92OTY1MF9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CisJCW92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsIHRlc3RfdmFsdWUsIDEpOworCQlvdjk2NTBfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbHVlLCAxKTsKKworCQlpZiAoY3RybF92YWx1ZSA9PSB0ZXN0X3ZhbHVlWzBdKQorCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKKwkJZWxzZQorCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKKworCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlICovCisJCW92OTY1MF93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjljYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5oCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgb3Y5NjUwIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpZm5kZWYgTTU2MDJfT1Y5NjUwX0hfCisjZGVmaW5lIE01NjAyX09WOTY1MF9IXworCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisKKyNpbmNsdWRlICJtNTYwMl9zZW5zb3IuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9WOTY1MF9HQUlOCQkJMHgwMAorI2RlZmluZSBPVjk2NTBfQkxVRQkJCTB4MDEKKyNkZWZpbmUgT1Y5NjUwX1JFRAkJCTB4MDIKKyNkZWZpbmUgT1Y5NjUwX1ZSRUYJCQkweDAzCisjZGVmaW5lIE9WOTY1MF9DT00xCQkJMHgwNAorI2RlZmluZSBPVjk2NTBfQkFWRQkJCTB4MDUKKyNkZWZpbmUgT1Y5NjUwX0dFQVZFCQkJMHgwNgorI2RlZmluZSBPVjk2NTBfUlNWRDcJCQkweDA3CisjZGVmaW5lIE9WOTY1MF9QSUQJCQkweDBhCisjZGVmaW5lIE9WOTY1MF9WRVIJCQkweDBiCisjZGVmaW5lIE9WOTY1MF9DT00zCQkJMHgwYworI2RlZmluZSBPVjk2NTBfQ09NNQkJCTB4MGUKKyNkZWZpbmUgT1Y5NjUwX0NPTTYJCQkweDBmCisjZGVmaW5lIE9WOTY1MF9BRUNICQkJMHgxMAorI2RlZmluZSBPVjk2NTBfQ0xLUkMJCQkweDExCisjZGVmaW5lIE9WOTY1MF9DT003CQkJMHgxMgorI2RlZmluZSBPVjk2NTBfQ09NOAkJCTB4MTMKKyNkZWZpbmUgT1Y5NjUwX0NPTTkJCQkweDE0CisjZGVmaW5lIE9WOTY1MF9DT00xMAkJCTB4MTUKKyNkZWZpbmUgT1Y5NjUwX1JTVkQxNgkJCTB4MTYKKyNkZWZpbmUgT1Y5NjUwX0hTVEFSVAkJCTB4MTcKKyNkZWZpbmUgT1Y5NjUwX0hTVE9QCQkJMHgxOAorI2RlZmluZSBPVjk2NTBfVlNUUlQJCQkweDE5CisjZGVmaW5lIE9WOTY1MF9WU1RPUAkJCTB4MWEKKyNkZWZpbmUgT1Y5NjUwX1BTSEZUCQkJMHgxYgorI2RlZmluZSBPVjk2NTBfTVZGUAkJCTB4MWUKKyNkZWZpbmUgT1Y5NjUwX0FFVwkJCTB4MjQKKyNkZWZpbmUgT1Y5NjUwX0FFQgkJCTB4MjUKKyNkZWZpbmUgT1Y5NjUwX1ZQVAkJCTB4MjYKKyNkZWZpbmUgT1Y5NjUwX0JCSUFTCQkJMHgyNworI2RlZmluZSBPVjk2NTBfR2JCSUFTCQkJMHgyOAorI2RlZmluZSBPVjk2NTBfR3JfQ09NCQkJMHgyOQorI2RlZmluZSBPVjk2NTBfUkJJQVMJCQkweDJjCisjZGVmaW5lIE9WOTY1MF9IUkVGCQkJMHgzMgorI2RlZmluZSBPVjk2NTBfQ0hMRgkJCTB4MzMKKyNkZWZpbmUgT1Y5NjUwX0FSQkxNCQkJMHgzNAorI2RlZmluZSBPVjk2NTBfUlNWRDM1CQkJMHgzNQorI2RlZmluZSBPVjk2NTBfUlNWRDM2CQkJMHgzNgorI2RlZmluZSBPVjk2NTBfQURDCQkJMHgzNworI2RlZmluZSBPVjk2NTBfQUNPTTM4CQkJMHgzOAorI2RlZmluZSBPVjk2NTBfT0ZPTgkJCTB4MzkKKyNkZWZpbmUgT1Y5NjUwX1RTTEIJCQkweDNhCisjZGVmaW5lIE9WOTY1MF9DT00xMgkJCTB4M2MKKyNkZWZpbmUgT1Y5NjUwX0NPTTEzCQkJMHgzZAorI2RlZmluZSBPVjk2NTBfQ09NMTUJCQkweDQwCisjZGVmaW5lIE9WOTY1MF9DT00xNgkJCTB4NDEKKyNkZWZpbmUgT1Y5NjUwX0xDQzEJCQkweDYyCisjZGVmaW5lIE9WOTY1MF9MQ0MyCQkJMHg2MworI2RlZmluZSBPVjk2NTBfTENDMwkJCTB4NjQKKyNkZWZpbmUgT1Y5NjUwX0xDQzQJCQkweDY1CisjZGVmaW5lIE9WOTY1MF9MQ0M1CQkJMHg2NgorI2RlZmluZSBPVjk2NTBfSFYJCQkweDY5CisjZGVmaW5lIE9WOTY1MF9EQkxWCQkJMHg2YgorI2RlZmluZSBPVjk2NTBfQ09NMjEJCQkweDhiCisjZGVmaW5lIE9WOTY1MF9DT00yMgkJCTB4OGMKKyNkZWZpbmUgT1Y5NjUwX0NPTTI0CQkJMHg4ZQorI2RlZmluZSBPVjk2NTBfREJMQzEJCQkweDhmCisjZGVmaW5lIE9WOTY1MF9SU1ZEOTQJCQkweDk0CisjZGVmaW5lIE9WOTY1MF9SU1ZEOTUJCQkweDk1CisjZGVmaW5lIE9WOTY1MF9SU1ZEOTYJCQkweDk2CisjZGVmaW5lIE9WOTY1MF9MQ0NGQgkJCTB4OWQKKyNkZWZpbmUgT1Y5NjUwX0xDQ0ZSCQkJMHg5ZQorI2RlZmluZSBPVjk2NTBfQUVDSE0JCQkweGExCisjZGVmaW5lIE9WOTY1MF9DT00yNgkJCTB4YTUKKyNkZWZpbmUgT1Y5NjUwX0FDT01BOAkJCTB4YTgKKyNkZWZpbmUgT1Y5NjUwX0FDT01BOQkJCTB4YTkKKworI2RlZmluZSBPVjk2NTBfUkVHSVNURVJfUkVTRVQJCSgxIDw8IDcpCisjZGVmaW5lIE9WOTY1MF9WR0FfU0VMRUNUCQkoMSA8PCA2KQorI2RlZmluZSBPVjk2NTBfUkdCX1NFTEVDVAkJKDEgPDwgMikKKyNkZWZpbmUgT1Y5NjUwX1JBV19SR0JfU0VMRUNUCQkoMSA8PCAwKQorCisjZGVmaW5lIE9WOTY1MF9GQVNUX0FHQ19BRUMJCSgxIDw8IDcpCisjZGVmaW5lIE9WOTY1MF9BRUNfVU5MSU1fU1RFUF9TSVpFCSgxIDw8IDYpCisjZGVmaW5lIE9WOTY1MF9CQU5ESU5HCQkJKDEgPDwgNSkKKyNkZWZpbmUgT1Y5NjUwX0FHQ19FTgkJCSgxIDw8IDIpCisjZGVmaW5lIE9WOTY1MF9BV0JfRU4JCQkoMSA8PCAxKQorI2RlZmluZSBPVjk2NTBfQUVDX0VOCQkJKDEgPDwgMCkKKworI2RlZmluZSBPVjk2NTBfVkFSSU9QSVhFTAkJKDEgPDwgMikKKyNkZWZpbmUgT1Y5NjUwX1NZU1RFTV9DTEtfU0VMCQkoMSA8PCA3KQorI2RlZmluZSBPVjk2NTBfU0xBTV9NT0RFIAkJKDEgPDwgNCkKKworI2RlZmluZSBPVjk2NTBfVkZMSVAJCQkoMSA8PCA0KQorI2RlZmluZSBPVjk2NTBfSEZMSVAJCQkoMSA8PCA1KQorCisjZGVmaW5lIEdBSU5fREVGQVVMVAkJCTB4MTQKKyNkZWZpbmUgUkVEX0dBSU5fREVGQVVMVAkJMHg3MAorI2RlZmluZSBCTFVFX0dBSU5fREVGQVVMVAkJMHgyMAorI2RlZmluZSBFWFBPU1VSRV9ERUZBVUxUCQkweDUwMDMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBLZXJuZWwgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK2V4dGVybiBpbnQgZm9yY2Vfc2Vuc29yOworZXh0ZXJuIGludCBkdW1wX3NlbnNvcjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbTU2MDJfZGVidWc7CisKK2ludCBvdjk2NTBfcHJvYmUoc3RydWN0IHNkICpzZCk7CitpbnQgb3Y5NjUwX2luaXQoc3RydWN0IHNkICpzZCk7CitpbnQgb3Y5NjUwX3Bvd2VyX2Rvd24oc3RydWN0IHNkICpzZCk7CisKK2ludCBvdjk2NTBfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKK2ludCBvdjk2NTBfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKK3ZvaWQgb3Y5NjUwX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpOworCitpbnQgb3Y5NjUwX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitpbnQgb3Y5NjUwX2dldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG92OTY1MF9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG92OTY1MF9zZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitpbnQgb3Y5NjUwX2dldF9yZWRfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG92OTY1MF9zZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IG92OTY1MF9nZXRfYmx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgb3Y5NjUwX3NldF9ibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IG92OTY1MF9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBvdjk2NTBfc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBvdjk2NTBfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgb3Y5NjUwX3NldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitpbnQgb3Y5NjUwX2dldF9icmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgb3Y5NjUwX3NldF9icmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBvdjk2NTBfZ2V0X2F1dG9fd2hpdGVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG92OTY1MF9zZXRfYXV0b193aGl0ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBvdjk2NTBfZ2V0X2F1dG9fZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IG92OTY1MF9zZXRfYXV0b19nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKKworc3RhdGljIHN0cnVjdCBtNTYwMl9zZW5zb3Igb3Y5NjUwID0geworCS5uYW1lID0gIk9WOTY1MCIsCisJLmkyY19zbGF2ZV9pZCA9IDB4NjAsCisJLnByb2JlID0gb3Y5NjUwX3Byb2JlLAorCS5pbml0ID0gb3Y5NjUwX2luaXQsCisJLnBvd2VyX2Rvd24gPSBvdjk2NTBfcG93ZXJfZG93biwKKwkucmVhZF9zZW5zb3IgPSBvdjk2NTBfcmVhZF9zZW5zb3IsCisJLndyaXRlX3NlbnNvciA9IG92OTY1MF93cml0ZV9zZW5zb3IsCisKKwkubmN0cmxzID0gOCwKKwkuY3RybHMgPSB7CisJeworCQl7CisJCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUJCT0gImV4cG9zdXJlIiwKKwkJCS5taW5pbXVtCT0gMHgwMCwKKwkJCS5tYXhpbXVtCT0gMHhmZmZmLAorCQkJLnN0ZXAJCT0gMHgxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gRVhQT1NVUkVfREVGQVVMVCwKKwkJCS5mbGFncyAgICAgICAgIAk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkuc2V0ID0gb3Y5NjUwX3NldF9leHBvc3VyZSwKKwkJLmdldCA9IG92OTY1MF9nZXRfZXhwb3N1cmUKKwl9LCB7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lCQk9ICJnYWluIiwKKwkJCS5taW5pbXVtCT0gMHgwMCwKKwkJCS5tYXhpbXVtCT0gMHgzZmYsCisJCQkuc3RlcAkJPSAweDEsCisJCQkuZGVmYXVsdF92YWx1ZQk9IEdBSU5fREVGQVVMVCwKKwkJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IG92OTY1MF9zZXRfZ2FpbiwKKwkJLmdldCA9IG92OTY1MF9nZXRfZ2FpbgorCX0sIHsKKwkJeworCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAJCT0gInJlZCBiYWxhbmNlIiwKKwkJCS5taW5pbXVtIAk9IDB4MDAsCisJCQkubWF4aW11bSAJPSAweGZmLAorCQkJLnN0ZXAgCQk9IDB4MSwKKwkJCS5kZWZhdWx0X3ZhbHVlIAk9IFJFRF9HQUlOX0RFRkFVTFQsCisJCQkuZmxhZ3MgICAgICAgICAJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IG92OTY1MF9zZXRfcmVkX2JhbGFuY2UsCisJCS5nZXQgPSBvdjk2NTBfZ2V0X3JlZF9iYWxhbmNlCisJfSwgeworCQl7CisJCQkudHlwZSAJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lIAkJPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtIAk9IDB4MDAsCisJCQkubWF4aW11bSAJPSAweGZmLAorCQkJLnN0ZXAgCQk9IDB4MSwKKwkJCS5kZWZhdWx0X3ZhbHVlIAk9IEJMVUVfR0FJTl9ERUZBVUxULAorCQkJLmZsYWdzICAgICAgICAgCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSCisJCX0sCisJCS5zZXQgPSBvdjk2NTBfc2V0X2JsdWVfYmFsYW5jZSwKKwkJLmdldCA9IG92OTY1MF9nZXRfYmx1ZV9iYWxhbmNlCisJfSwgeworCQl7CisJCQkuaWQgCQk9IFY0TDJfQ0lEX0hGTElQLAorCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSAJCT0gImhvcml6b250YWwgZmxpcCIsCisJCQkubWluaW11bSAJPSAwLAorCQkJLm1heGltdW0gCT0gMSwKKwkJCS5zdGVwIAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gMAorCQl9LAorCQkuc2V0ID0gb3Y5NjUwX3NldF9oZmxpcCwKKwkJLmdldCA9IG92OTY1MF9nZXRfaGZsaXAKKwl9LCB7CisJCXsKKwkJCS5pZCAJCT0gVjRMMl9DSURfVkZMSVAsCisJCQkudHlwZSAJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lIAkJPSAidmVydGljYWwgZmxpcCIsCisJCQkubWluaW11bSAJPSAwLAorCQkJLm1heGltdW0gCT0gMSwKKwkJCS5zdGVwIAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gMAorCQl9LAorCQkuc2V0ID0gb3Y5NjUwX3NldF92ZmxpcCwKKwkJLmdldCA9IG92OTY1MF9nZXRfdmZsaXAKKwl9LCB7CisJCXsKKwkJCS5pZCAJCT0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAorCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSAJCT0gImF1dG8gd2hpdGUgYmFsYW5jZSIsCisJCQkubWluaW11bSAJPSAwLAorCQkJLm1heGltdW0gCT0gMSwKKwkJCS5zdGVwIAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gMAorCQl9LAorCQkuc2V0ID0gb3Y5NjUwX3NldF9hdXRvX3doaXRlX2JhbGFuY2UsCisJCS5nZXQgPSBvdjk2NTBfZ2V0X2F1dG9fd2hpdGVfYmFsYW5jZQorCX0sIHsKKwkJeworCQkJLmlkIAkJPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkJCS50eXBlIAkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgCQk9ICJhdXRvIGdhaW4gY29udHJvbCIsCisJCQkubWluaW11bSAJPSAwLAorCQkJLm1heGltdW0gCT0gMSwKKwkJCS5zdGVwIAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gMAorCQl9LAorCQkuc2V0ID0gb3Y5NjUwX3NldF9hdXRvX2dhaW4sCisJCS5nZXQgPSBvdjk2NTBfZ2V0X2F1dG9fZ2FpbgorCX0KKwl9LAorCisJLm5tb2RlcyA9IDEsCisJLm1vZGVzID0geworCXsKKwkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKKwkJTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQsCisJCVY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCVY0TDJfRklFTERfTk9ORSwKKwkJLnNpemVpbWFnZSA9CisJCQlNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRIICogTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQsCisJCS5ieXRlc3BlcmxpbmUgPSBNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRILAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDEKKwl9CisJfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHJlaW5pdF9vdjk2NTBbXVszXSA9Cit7CisJLyogW0lOSVRDQU1dICovCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19ESVYsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9DVFJMLCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA4fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DTEtfRElWLCAweDBhfSwKKwkvKiBSZXNldCBjaGlwICovCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTcsIE9WOTY1MF9SRUdJU1RFUl9SRVNFVH0sCisJLyogRW5hYmxlIGRvdWJsZSBjbG9jayAqLworCXtTRU5TT1IsIE9WOTY1MF9DTEtSQywgMHg4MH0sCisJLyogRG8gc29tZXRoaW5nIG91dCBvZiBzcGVjIHdpdGggdGhlIHBvd2VyICovCisJe1NFTlNPUiwgT1Y5NjUwX09GT04sIDB4NDB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0X292OTY1MFtdWzNdID0KK3sKKwkvKiBbSU5JVENBTV0gKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMn0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX0NUUkwsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDh9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDA1fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwNH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDA2fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDA2fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NMS19ESVYsIDB4MGF9LAorCS8qIFJlc2V0IGNoaXAgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX1JFR0lTVEVSX1JFU0VUfSwKKwkvKiBFbmFibGUgZG91YmxlIGNsb2NrICovCisJe1NFTlNPUiwgT1Y5NjUwX0NMS1JDLCAweDgwfSwKKwkvKiBEbyBzb21ldGhpbmcgb3V0IG9mIHNwZWMgd2l0aCB0aGUgcG93ZXIgKi8KKwl7U0VOU09SLCBPVjk2NTBfT0ZPTiwgMHg0MH0sCisKKwkvKiBTZXQgUVFWR0EgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMSwgMHgyMH0sCisJLyogU2V0IGZhc3QgQUdDL0FFQyBhbGdvcml0aG0gd2l0aCB1bmxpbWl0ZWQgc3RlcCBzaXplICovCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTgsIE9WOTY1MF9GQVNUX0FHQ19BRUMgfAorCQkJICAgICAgT1Y5NjUwX0FFQ19VTkxJTV9TVEVQX1NJWkUgfAorCQkJICAgICAgT1Y5NjUwX0FXQl9FTiB8IE9WOTY1MF9BR0NfRU59LAorCisJe1NFTlNPUiwgT1Y5NjUwX0NITEYsIDB4MTB9LAorCXtTRU5TT1IsIE9WOTY1MF9BUkJMTSwgMHhiZn0sCisJe1NFTlNPUiwgT1Y5NjUwX0FDT00zOCwgMHg4MX0sCisJLyogVHVybiBvZmYgY29sb3IgbWF0cml4IGNvZWZmaWNpZW50IGRvdWJsZSBvcHRpb24gKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMTYsIDB4MDB9LAorCQkvKiBFbmFibGUgY29sb3IgbWF0cml4IGZvciBSR0IvWVVWLCBEZWxheSBZIGNoYW5uZWwsCisJc2V0IG91dHB1dCBZL1VWIGRlbGF5IHRvIDEgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMTMsIDB4MTl9LAorCS8qIEVuYWJsZSBkaWdpdGFsIEJMQywgU2V0IG91dHB1dCBtb2RlIHRvIFUgWSBWIFkgKi8KKwl7U0VOU09SLCBPVjk2NTBfVFNMQiwgMHgwY30sCisJLyogTGltaXQgdGhlIEFHQy9BRUMgc3RhYmxlIHVwcGVyIHJlZ2lvbiAqLworCXtTRU5TT1IsIE9WOTY1MF9DT00yNCwgMHgwMH0sCisJLyogRW5hYmxlIEhSRUYgYW5kIHNvbWUgb3V0IG9mIHNwZWMgdGhpbmdzICovCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTEyLCAweDczfSwKKwkJLyogU2V0IGFsbCBEQkxDIG9mZnNldCBzaWducyB0byBwb3NpdGl2ZSBhbmQKKwlkbyBzb21lIG91dCBvZiBzcGVjIHN0dWZmICovCisJe1NFTlNPUiwgT1Y5NjUwX0RCTEMxLCAweGRmfSwKKwl7U0VOU09SLCBPVjk2NTBfQ09NMjEsIDB4MDZ9LAorCXtTRU5TT1IsIE9WOTY1MF9SU1ZEMzUsIDB4OTF9LAorCS8qIE5lY2Vzc2FyeSwgbm8gY2FtZXJhIHN0cmVhbSB3aXRob3V0IGl0ICovCisJe1NFTlNPUiwgT1Y5NjUwX1JTVkQxNiwgMHgwNn0sCisJe1NFTlNPUiwgT1Y5NjUwX1JTVkQ5NCwgMHg5OX0sCisJe1NFTlNPUiwgT1Y5NjUwX1JTVkQ5NSwgMHg5OX0sCisJe1NFTlNPUiwgT1Y5NjUwX1JTVkQ5NiwgMHgwNH0sCisJLyogRW5hYmxlIGZ1bGwgcmFuZ2Ugb3V0cHV0ICovCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTE1LCAweDB9LAorCQkvKiBFbmFibGUgSFJFRiBhdCBvcHRpY2FsIGJsYWNrLCBlbmFibGUgQURCTEMgYmlhcywKKwllbmFibGUgQURCTEMsIHJlc2V0IHRpbWluZ3MgYXQgZm9ybWF0IGNoYW5nZSAqLworCXtTRU5TT1IsIE9WOTY1MF9DT002LCAweDRifSwKKwkvKiBTdWJ0cmFjdCAzMiBmcm9tIHRoZSBCIGNoYW5uZWwgYmlhcyAqLworCXtTRU5TT1IsIE9WOTY1MF9CQklBUywgMHhhMH0sCisJLyogU3VidHJhY3QgMzIgZnJvbSB0aGUgR2IgY2hhbm5lbCBiaWFzICovCisJe1NFTlNPUiwgT1Y5NjUwX0diQklBUywgMHhhMH0sCisJLyogRG8gbm90IGJ5cGFzcyB0aGUgYW5hbG9nIEJMQyBhbmQgdG8gc29tZSBvdXQgb2Ygc3BlYyBzdHVmZiAqLworCXtTRU5TT1IsIE9WOTY1MF9Hcl9DT00sIDB4MDB9LAorCS8qIFN1YnRyYWN0IDMyIGZyb20gdGhlIFIgY2hhbm5lbCBiaWFzICovCisJe1NFTlNPUiwgT1Y5NjUwX1JCSUFTLCAweGEwfSwKKwkvKiBTdWJ0cmFjdCAzMiBmcm9tIHRoZSBSIGNoYW5uZWwgYmlhcyAqLworCXtTRU5TT1IsIE9WOTY1MF9SQklBUywgMHgwfSwKKwl7U0VOU09SLCBPVjk2NTBfQ09NMjYsIDB4ODB9LAorCXtTRU5TT1IsIE9WOTY1MF9BQ09NQTksIDB4OTh9LAorCS8qIFNldCB0aGUgQUdDL0FFQyBzdGFibGUgcmVnaW9uIHVwcGVyIGxpbWl0ICovCisJe1NFTlNPUiwgT1Y5NjUwX0FFVywgMHg2OH0sCisJLyogU2V0IHRoZSBBR0MvQUVDIHN0YWJsZSByZWdpb24gbG93ZXIgbGltaXQgKi8KKwl7U0VOU09SLCBPVjk2NTBfQUVCLCAweDVjfSwKKwkvKiBTZXQgdGhlIGhpZ2ggYW5kIGxvdyBsaW1pdCBuaWJibGVzIHRvIDMgKi8KKwl7U0VOU09SLCBPVjk2NTBfVlBULCAweGMzfSwKKwkJLyogU2V0IHRoZSBBdXRvbWF0aWMgR2FpbiBDZWlsaW5nIChBR0MpIHRvIDEyOHgsCisJZHJvcCBWU1lOQyBhdCBmcmFtZSBkcm9wLAorCWxpbWl0IGV4cG9zdXJlIHRpbWluZywKKwlkcm9wIGZyYW1lIHdoZW4gdGhlIEFFQyBzdGVwIGlzIGxhcmdlciB0aGFuIHRoZSBleHBvc3VyZSBnYXAgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NOSwgMHg2ZX0sCisJLyogU2V0IFZTWU5DIG5lZ2F0aXZlLCBTZXQgUkVTRVQgdG8gU0xIUyAoc2xhdmUgbW9kZSBob3Jpem9udGFsIHN5bmMpCisJYW5kIHNldCBQV0ROIHRvIFNMVlMgKHNsYXZlIG1vZGUgdmVydGljYWwgc3luYykgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMTAsIDB4NDJ9LAorCS8qIFNldCBob3Jpem9udGFsIGNvbHVtbiBzdGFydCBoaWdoIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwl7U0VOU09SLCBPVjk2NTBfSFNUQVJULCAweDFhfSwKKwkvKiBTZXQgaG9yaXpvbnRhbCBjb2x1bW4gZW5kICovCisJe1NFTlNPUiwgT1Y5NjUwX0hTVE9QLCAweGJmfSwKKwkvKiBDb21wbGVtZW50aW5nIHJlZ2lzdGVyIHRvIHRoZSB0d28gd3JpdGVzIGFib3ZlICovCisJe1NFTlNPUiwgT1Y5NjUwX0hSRUYsIDB4YjJ9LAorCS8qIFNldCB2ZXJ0aWNhbCByb3cgc3RhcnQgaGlnaCBiaXRzICovCisJe1NFTlNPUiwgT1Y5NjUwX1ZTVFJULCAweDAyfSwKKwkvKiBTZXQgdmVydGljYWwgcm93IGVuZCBsb3cgYml0cyAqLworCXtTRU5TT1IsIE9WOTY1MF9WU1RPUCwgMHg3ZX0sCisJLyogU2V0IGNvbXBsZW1lbnRpbmcgdmVydGljYWwgZnJhbWUgY29udHJvbCAqLworCXtTRU5TT1IsIE9WOTY1MF9WUkVGLCAweDEwfSwKKwkvKiBTZXQgcmF3IFJHQiBvdXRwdXQgZm9ybWF0IHdpdGggVkdBIHJlc29sdXRpb24gKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NNywgT1Y5NjUwX1ZHQV9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JHQl9TRUxFQ1QgfAorCQkJICAgICAgT1Y5NjUwX1JBV19SR0JfU0VMRUNUfSwKKwl7U0VOU09SLCBPVjk2NTBfQURDLCAweDA0fSwKKwl7U0VOU09SLCBPVjk2NTBfSFYsIDB4NDB9LAorCS8qIEVuYWJsZSBkZW5vaXNlLCBhbmQgd2hpdGUtcGl4ZWwgZXJhc2UgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMjIsIDB4MjN9LAorCisJLyogU2V0IHRoZSBoaWdoIGJpdHMgb2YgdGhlIGV4cG9zdXJlIHZhbHVlICovCisJe1NFTlNPUiwgT1Y5NjUwX0FFQ0gsICgoRVhQT1NVUkVfREVGQVVMVCAmIDB4ZmYwMCkgPj4gOCl9LAorCisJLyogU2V0IHRoZSBsb3cgYml0cyBvZiB0aGUgZXhwb3N1cmUgdmFsdWUgKi8KKwl7U0VOU09SLCBPVjk2NTBfQ09NMSwgKEVYUE9TVVJFX0RFRkFVTFQgJiAweGZmKX0sCisJe1NFTlNPUiwgT1Y5NjUwX0dBSU4sIEdBSU5fREVGQVVMVH0sCisJe1NFTlNPUiwgT1Y5NjUwX0JMVUUsIEJMVUVfR0FJTl9ERUZBVUxUfSwKKwl7U0VOU09SLCBPVjk2NTBfUkVELCBSRURfR0FJTl9ERUZBVUxUfSwKKworCXtTRU5TT1IsIE9WOTY1MF9DT00zLCBPVjk2NTBfVkFSSU9QSVhFTH0sCisJe1NFTlNPUiwgT1Y5NjUwX0NPTTUsIE9WOTY1MF9TWVNURU1fQ0xLX1NFTH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODJ9LAorCXtCUklER0UsIE01NjAyX1hCX0xJTkVfT0ZfRlJBTUVfTCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfUElYX09GX0xJTkVfSCwgMHg4Mn0sCisJe0JSSURHRSwgTTU2MDJfWEJfUElYX09GX0xJTkVfTCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMX0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwOX0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMX0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHhlMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfVlNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHg1ZX0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHgwMn0sCisJe0JSSURHRSwgTTU2MDJfWEJfSFNZTkNfUEFSQSwgMHhkZX0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBvd2VyX2Rvd25fb3Y5NjUwW11bM10gPQoreworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA0fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjB9LAorCXtTRU5TT1IsIE9WOTY1MF9DT003LCAweDgwfSwKKwl7U0VOU09SLCBPVjk2NTBfT0ZPTiwgMHhmNH0sCisJe1NFTlNPUiwgT1Y5NjUwX01WRlAsIDB4ODB9LAorCXtTRU5TT1IsIE9WOTY1MF9EQkxWLCAweDNmfSwKKwl7U0VOU09SLCBPVjk2NTBfUlNWRDM2LCAweDQ5fSwKKwl7U0VOU09SLCBPVjk2NTBfQ09NNywgMHgwNX0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDA2fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAyfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwfQorfTsKKworLyogVmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5IGZsaXBzIHRoZSBpbWFnZSBpZiBtYXRjaGVkLCBuZWVkZWQgZm9yIG1hY2hpbmVzCisgICB3aGVyZSB0aGUgc2Vuc29yIGlzIG1vdW50ZWQgdXBzaWRlIGRvd24gKi8KK3N0YXRpYworICAgIGNvbnN0CisJc3RydWN0IGRtaV9zeXN0ZW1faWQgb3Y5NjUwX2ZsaXBfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiQVNVUyBBNlZDIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZWQyIpCisJCX0KKwl9LAorCXsKKwkJLmlkZW50ID0gIkFTVVMgQTZWTSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkE2Vk0iKQorCQl9CisJfSwKKwl7CisJCS5pZGVudCA9ICJBU1VTIEE2SkMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBNkpDIikKKwkJfQorCX0sCisJeworCQkuaWRlbnQgPSAiQVNVUyBBNkt0IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQTZLdCIpCisJCX0KKwl9LAorCXsgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMwMTViZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBwbzEwMzAgc2Vuc29yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEVyaWsgQW5kcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgSWx5ZXMgR291dGEuIEJhc2VkIG9uIHRoZSBtNTYwM3ggTGludXggRHJpdmVyIFByb2plY3QuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0IDxtNTYwMkB4M25nLmNvbS5icj4KKyAqCisgKiBQb3J0aW9ucyBvZiBjb2RlIHRvIFVTQiBpbnRlcmZhY2UgYW5kIEFMaSBkcml2ZXIgc29mdHdhcmUsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgV2lsbGVtIER1aW5rZXIKKyAqIHY0bDIgaW50ZXJmYWNlIG1vZGVsZWQgYWZ0ZXIgdGhlIFY0TDIgZHJpdmVyCisgKiBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2luY2x1ZGUgIm01NjAyX3BvMTAzMC5oIgorCitpbnQgcG8xMDMwX3Byb2JlKHN0cnVjdCBzZCAqc2QpCit7CisJdTggcHJvZF9pZCA9IDAsIHZlcl9pZCA9IDAsIGk7CisKKwlpZiAoZm9yY2Vfc2Vuc29yKSB7CisJCWlmIChmb3JjZV9zZW5zb3IgPT0gUE8xMDMwX1NFTlNPUikgeworCQkJaW5mbygiRm9yY2luZyBhICVzIHNlbnNvciIsIHBvMTAzMC5uYW1lKTsKKwkJCWdvdG8gc2Vuc29yX2ZvdW5kOworCQl9CisJCS8qIElmIHdlIHdhbnQgdG8gZm9yY2UgYW5vdGhlciBzZW5zb3IsIGRvbid0IHRyeSB0byBwcm9iZSB0aGlzCisJCSAqIG9uZSAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvKCJQcm9iaW5nIGZvciBhIHBvMTAzMCBzZW5zb3IiKTsKKworCS8qIFJ1biB0aGUgcHJlLWluaXQgdG8gYWN0dWFsbHkgcHJvYmUgdGhlIHVuaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVpbml0X3BvMTAzMCk7IGkrKykgeworCQl1OCBkYXRhID0gcHJlaW5pdF9wbzEwMzBbaV1bMl07CisJCWlmIChwcmVpbml0X3BvMTAzMFtpXVswXSA9PSBTRU5TT1IpCisJCQlwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAorCQkJCXByZWluaXRfcG8xMDMwW2ldWzFdLCAmZGF0YSwgMSk7CisJCWVsc2UKKwkJCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgcHJlaW5pdF9wbzEwMzBbaV1bMV0sIGRhdGEpOworCX0KKworCWlmIChwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIDB4MywgJnByb2RfaWQsIDEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIDB4NCwgJnZlcl9pZCwgMSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChwcm9kX2lkID09IDB4MDIpICYmICh2ZXJfaWQgPT0gMHhlZikpIHsKKwkJaW5mbygiRGV0ZWN0ZWQgYSBwbzEwMzAgc2Vuc29yIik7CisJCWdvdG8gc2Vuc29yX2ZvdW5kOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKKworc2Vuc29yX2ZvdW5kOgorCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gcG8xMDMwLm1vZGVzOworCXNkLT5nc3BjYV9kZXYuY2FtLm5tb2RlcyA9IHBvMTAzMC5ubW9kZXM7CisJc2QtPmRlc2MtPmN0cmxzID0gcG8xMDMwLmN0cmxzOworCXNkLT5kZXNjLT5uY3RybHMgPSBwbzEwMzAubmN0cmxzOworCXJldHVybiAwOworfQorCitpbnQgcG8xMDMwX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCisJZG8geworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOworCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7CisKKwltNTYwMl93cml0ZV9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19ERVZfQUREUiwKKwkJCSAgIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7CisJbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOworCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTAgKyBsZW4pOworCW01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MDgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREFUQSwgJihpMmNfZGF0YVtpXSkpOworCisJCVBERUJVRyhEQkdfVFJBQ0UsICJSZWFkaW5nIHNlbnNvciByZWdpc3RlciAiCisJCQkJIjB4JXggY29udGFpbmluZyAweCV4ICIsIGFkZHJlc3MsICppMmNfZGF0YSk7CisJfQorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgcG8xMDMwX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pCit7CisJaW50IGVyciwgaTsKKwl1OCAqcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OworCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKKworCS8qIFRoZSBwbzEwMzAgb25seSBzdXBwb3J0cyBvbmUgYnl0ZSB3cml0ZXMgKi8KKwlpZiAobGVuID4gMSB8fCAhbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7CisKKwlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOworCWJ1ZlsxNV0gPSBhZGRyZXNzOworCisJcCA9IGJ1ZiArIDE2OworCisJLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7CisJCXBbM10gPSBpMmNfZGF0YVtpXTsKKwkJcCArPSA0OworCQlQREVCVUcoREJHX1RSQUNFLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAorCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOworCX0KKworCS8qIENvcHkgdGhlIGZvb3RlciAqLworCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOworCisJLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KKwlwWzNdID0gMHgxMCArIGxlbjsKKworCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAweDA0LCAweDQwLCAweDE5LAorCQkJICAgICAgMHgwMDAwLCBidWYsCisJCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHBvMTAzMF9pbml0KHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGksIGVyciA9IDA7CisKKwkvKiBJbml0IHRoZSBzZW5zb3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X3BvMTAzMCk7IGkrKykgeworCQl1OCBkYXRhWzJdID0gezB4MDAsIDB4MDB9OworCisJCXN3aXRjaCAoaW5pdF9wbzEwMzBbaV1bMF0pIHsKKwkJY2FzZSBCUklER0U6CisJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsCisJCQkJaW5pdF9wbzEwMzBbaV1bMV0sCisJCQkJaW5pdF9wbzEwMzBbaV1bMl0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRU5TT1I6CisJCQlkYXRhWzBdID0gaW5pdF9wbzEwMzBbaV1bMl07CisJCQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAorCQkJCWluaXRfcG8xMDMwW2ldWzFdLCBkYXRhLCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VOU09SX0xPTkc6CisJCQlkYXRhWzBdID0gaW5pdF9wbzEwMzBbaV1bMl07CisJCQlkYXRhWzFdID0gaW5pdF9wbzEwMzBbaV1bM107CisJCQllcnIgPSBwbzEwMzBfd3JpdGVfc2Vuc29yKHNkLAorCQkJCWluaXRfcG8xMDMwW2ldWzFdLCBkYXRhLCAyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW5mbygiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkdW1wX3NlbnNvcikKKwkJcG8xMDMwX2R1bXBfcmVnaXN0ZXJzKHNkKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgcG8xMDMwX2dldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGkyY19kYXRhOworCWludCBlcnI7CisKKwllcnIgPSBwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19ILAorCQkJCSAmaTJjX2RhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwkqdmFsID0gKGkyY19kYXRhIDw8IDgpOworCisJZXJyID0gcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfTSwKKwkJCQkgJmkyY19kYXRhLCAxKTsKKwkqdmFsIHw9IGkyY19kYXRhOworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIkV4cG9zdXJlIHJlYWQgYXMgJWQiLCAqdmFsKTsKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHBvMTAzMF9zZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGkyY19kYXRhOworCWludCBlcnI7CisKKwlQREVCVUcoREJHX1Y0TDIsICJTZXQgZXhwb3N1cmUgdG8gJWQiLCB2YWwgJiAweGZmZmYpOworCisJaTJjX2RhdGEgPSAoKHZhbCAmIDB4ZmYwMCkgPj4gOCk7CisJUERFQlVHKERCR19WNEwyLCAiU2V0IGV4cG9zdXJlIHRvIGhpZ2ggYnl0ZSB0byAweCV4IiwKKwkgICAgICAgaTJjX2RhdGEpOworCisJZXJyID0gcG8xMDMwX3dyaXRlX3NlbnNvcihzZCwgUE8xMDMwX1JFR19JTlRFR0xJTkVTX0gsCisJCQkJICAmaTJjX2RhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWkyY19kYXRhID0gKHZhbCAmIDB4ZmYpOworCVBERUJVRyhEQkdfVjRMMiwgIlNldCBleHBvc3VyZSB0byBsb3cgYnl0ZSB0byAweCV4IiwKKwkgICAgICAgaTJjX2RhdGEpOworCWVyciA9IHBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19NLAorCQkJCSAgJmkyY19kYXRhLCAxKTsKKworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgcG8xMDMwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggaTJjX2RhdGE7CisJaW50IGVycjsKKworCWVyciA9IHBvMTAzMF9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19HTE9CQUxHQUlOLAorCQkJCSAmaTJjX2RhdGEsIDEpOworCSp2YWwgPSBpMmNfZGF0YTsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBnbG9iYWwgZ2FpbiAlZCIsICp2YWwpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBwbzEwMzBfc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGkyY19kYXRhOworCWludCBlcnI7CisKKwlpMmNfZGF0YSA9IHZhbCAmIDB4ZmY7CisJUERFQlVHKERCR19WNEwyLCAiU2V0IGdsb2JhbCBnYWluIHRvICVkIiwgaTJjX2RhdGEpOworCWVyciA9IHBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfR0xPQkFMR0FJTiwKKwkJCQkgICZpMmNfZGF0YSwgMSk7CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBwbzEwMzBfZ2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggaTJjX2RhdGE7CisJaW50IGVycjsKKworCWVyciA9IHBvMTAzMF9yZWFkX3NlbnNvcihzZCwgUE8xMDMwX1JFR19SRURfR0FJTiwKKwkJCQkgJmkyY19kYXRhLCAxKTsKKwkqdmFsID0gaTJjX2RhdGE7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgcmVkIGdhaW4gJWQiLCAqdmFsKTsKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHBvMTAzMF9zZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGkyY19kYXRhOworCWludCBlcnI7CisKKwlpMmNfZGF0YSA9IHZhbCAmIDB4ZmY7CisJUERFQlVHKERCR19WNEwyLCAiU2V0IHJlZCBnYWluIHRvICVkIiwgaTJjX2RhdGEpOworCWVyciA9IHBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfUkVEX0dBSU4sCisJCQkJICAmaTJjX2RhdGEsIDEpOworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgcG8xMDMwX2dldF9ibHVlX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBpMmNfZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gcG8xMDMwX3JlYWRfc2Vuc29yKHNkLCBQTzEwMzBfUkVHX0JMVUVfR0FJTiwKKwkJCQkgJmkyY19kYXRhLCAxKTsKKwkqdmFsID0gaTJjX2RhdGE7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgYmx1ZSBnYWluICVkIiwgKnZhbCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHBvMTAzMF9zZXRfYmx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBpMmNfZGF0YTsKKwlpbnQgZXJyOworCWkyY19kYXRhID0gdmFsICYgMHhmZjsKKwlQREVCVUcoREJHX1Y0TDIsICJTZXQgYmx1ZSBnYWluIHRvICVkIiwgaTJjX2RhdGEpOworCWVyciA9IHBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIFBPMTAzMF9SRUdfQkxVRV9HQUlOLAorCQkJCSAgJmkyY19kYXRhLCAxKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgcG8xMDMwX3Bvd2VyX2Rvd24oc3RydWN0IHNkICpzZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwbzEwMzBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKK3sKKwlpbnQgYWRkcmVzczsKKwl1OCB2YWx1ZSA9IDA7CisKKwlpbmZvKCJEdW1waW5nIHRoZSBwbzEwMzAgc2Vuc29yIGNvcmUgcmVnaXN0ZXJzIik7CisJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4N2Y7IGFkZHJlc3MrKykgeworCQlwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7CisJCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCisJCSAgICAgYWRkcmVzcywgdmFsdWUpOworCX0KKworCWluZm8oInBvMTAzMCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlIik7CisKKwlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSIpOworCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKKwkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOworCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OworCisJCXBvMTAzMF9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CisJCXBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsIHRlc3RfdmFsdWUsIDEpOworCQlwbzEwMzBfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbHVlLCAxKTsKKworCQlpZiAoY3RybF92YWx1ZSA9PSB0ZXN0X3ZhbHVlWzBdKQorCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKKwkJZWxzZQorCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKKworCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlICovCisJCXBvMTAzMF93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjM0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5oCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgcG8xMDMwIHNlbnNvci4KKyAqIFRoaXMgaXMgcHJvYmFibHkgYSBwaXhlbCBwbHVzIHNlbnNvciBidXQgd2UgaGF2ZW4ndCBpZGVudGlmaWVkIGl0IHlldAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChjKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChjKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogUmVnaXN0ZXIgZGVmaW5lcyB0YWtlbiBmcm9tIFBhc2NhbCBTdGFuZ3MgUHJveHljb24gQXJtbGliCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpZm5kZWYgTTU2MDJfUE8xMDMwX0hfCisjZGVmaW5lIE01NjAyX1BPMTAzMF9IXworCisjaW5jbHVkZSAibTU2MDJfc2Vuc29yLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQTzEwMzBfUkVHX0RFVklEX0gJCTB4MDAKKyNkZWZpbmUgUE8xMDMwX1JFR19ERVZJRF9MCQkweDAxCisjZGVmaW5lIFBPMTAzMF9SRUdfRlJBTUVXSURUSF9ICQkweDA0CisjZGVmaW5lIFBPMTAzMF9SRUdfRlJBTUVXSURUSF9MCQkweDA1CisjZGVmaW5lIFBPMTAzMF9SRUdfRlJBTUVIRUlHSFRfSAkweDA2CisjZGVmaW5lIFBPMTAzMF9SRUdfRlJBTUVIRUlHSFRfTAkweDA3CisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XWF9ICQkweDA4CisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XWF9MCQkweDA5CisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XWV9ICQkweDBhCisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XWV9MCQkweDBiCisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XV0lEVEhfSAkweDBjCisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XV0lEVEhfTAkweDBkCisjZGVmaW5lIFBPMTAzMF9SRUdfV0lORE9XSEVJR0hUX0gJMHgwZQorI2RlZmluZSBQTzEwMzBfUkVHX1dJTkRPV0hFSUdIVF9MCTB4MGYKKworI2RlZmluZSBQTzEwMzBfUkVHX0dMT0JBTElCSUFTCQkweDEyCisjZGVmaW5lIFBPMTAzMF9SRUdfUElYRUxJQklBUwkJMHgxMworCisjZGVmaW5lIFBPMTAzMF9SRUdfR0xPQkFMR0FJTgkJMHgxNQorI2RlZmluZSBQTzEwMzBfUkVHX1JFRF9HQUlOCQkweDE2CisjZGVmaW5lIFBPMTAzMF9SRUdfR1JFRU5fMV9HQUlOCQkweDE3CisjZGVmaW5lIFBPMTAzMF9SRUdfQkxVRV9HQUlOCQkweDE4CisjZGVmaW5lIFBPMTAzMF9SRUdfR1JFRU5fMl9HQUlOCQkweDE5CisKKyNkZWZpbmUgUE8xMDMwX1JFR19JTlRFR0xJTkVTX0gJCTB4MWEKKyNkZWZpbmUgUE8xMDMwX1JFR19JTlRFR0xJTkVTX00JCTB4MWIKKyNkZWZpbmUgUE8xMDMwX1JFR19JTlRFR0xJTkVTX0wJCTB4MWMKKworI2RlZmluZSBQTzEwMzBfUkVHX0NPTlRST0wxCQkweDFkCisjZGVmaW5lIFBPMTAzMF9SRUdfQ09OVFJPTDIJCTB4MWUKKyNkZWZpbmUgUE8xMDMwX1JFR19DT05UUk9MMwkJMHgxZgorI2RlZmluZSBQTzEwMzBfUkVHX0NPTlRST0w0CQkweDIwCisKKyNkZWZpbmUgUE8xMDMwX1JFR19QRVJJT0Q1MF9ICQkweDIzCisjZGVmaW5lIFBPMTAzMF9SRUdfUEVSSU9ENTBfTAkJMHgyNAorI2RlZmluZSBQTzEwMzBfUkVHX1BFUklPRDYwX0gJCTB4MjUKKyNkZWZpbmUgUE8xMDMwX1JFR19QRVJJT0Q2MF9MCQkweDI2CisjZGVmaW5lIFBPMTAzMF9SRUdfUkVHQ0xLMTY3CQkweDI3CisjZGVmaW5lIFBPMTAzMF9SRUdfREVMVEE1MAkJMHgyOAorI2RlZmluZSBQTzEwMzBfUkVHX0RFTFRBNjAJCTB4MjkKKworI2RlZmluZSBQTzEwMzBfUkVHX0FEQ09GRlNFVAkJMHgyYworCisvKiBHYW1tYSBDb3JyZWN0aW9uIENvZWZmcyAqLworI2RlZmluZSBQTzEwMzBfUkVHX0dDMAkJCTB4MmQKKyNkZWZpbmUgUE8xMDMwX1JFR19HQzEJCQkweDJlCisjZGVmaW5lIFBPMTAzMF9SRUdfR0MyCQkJMHgyZgorI2RlZmluZSBQTzEwMzBfUkVHX0dDMwkJCTB4MzAKKyNkZWZpbmUgUE8xMDMwX1JFR19HQzQJCQkweDMxCisjZGVmaW5lIFBPMTAzMF9SRUdfR0M1CQkJMHgzMgorI2RlZmluZSBQTzEwMzBfUkVHX0dDNgkJCTB4MzMKKyNkZWZpbmUgUE8xMDMwX1JFR19HQzcJCQkweDM0CisKKy8qIENvbG9yIFRyYW5zZm9ybSBNYXRyaXggKi8KKyNkZWZpbmUgUE8xMDMwX1JFR19DVDAJCQkweDM1CisjZGVmaW5lIFBPMTAzMF9SRUdfQ1QxCQkJMHgzNgorI2RlZmluZSBQTzEwMzBfUkVHX0NUMgkJCTB4MzcKKyNkZWZpbmUgUE8xMDMwX1JFR19DVDMJCQkweDM4CisjZGVmaW5lIFBPMTAzMF9SRUdfQ1Q0CQkJMHgzOQorI2RlZmluZSBQTzEwMzBfUkVHX0NUNQkJCTB4M2EKKyNkZWZpbmUgUE8xMDMwX1JFR19DVDYJCQkweDNiCisjZGVmaW5lIFBPMTAzMF9SRUdfQ1Q3CQkJMHgzYworI2RlZmluZSBQTzEwMzBfUkVHX0NUOAkJCTB4M2QKKworI2RlZmluZSBQTzEwMzBfUkVHX0FVVE9DVFJMMQkJMHgzZQorI2RlZmluZSBQTzEwMzBfUkVHX0FVVE9DVFJMMgkJMHgzZgorCisjZGVmaW5lIFBPMTAzMF9SRUdfWVRBUkdFVAkJMHg0MAorI2RlZmluZSBQTzEwMzBfUkVHX0dMT0JBTEdBSU5NSU4JMHg0MQorI2RlZmluZSBQTzEwMzBfUkVHX0dMT0JBTEdBSU5NQVgJMHg0MgorCisvKiBPdXRwdXQgZm9ybWF0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDEJCTB4NWEKKyNkZWZpbmUgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDIJCTB4NWIKKyNkZWZpbmUgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDMJCTB4NWMKKyNkZWZpbmUgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDQJCTB4NWQKKyNkZWZpbmUgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDUJCTB4NWUKKworLyogSW1hZ2luZyBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgUE8xMDMwX1JFR19ZQlJJR0hUCQkweDczCisjZGVmaW5lIFBPMTAzMF9SRUdfWUNPTlRSQVNUCQkweDc0CisjZGVmaW5lIFBPMTAzMF9SRUdfWVNBVFVSQVRJT04JCTB4NzUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBPMTAzMF9HTE9CQUxfR0FJTl9ERUZBVUxUCTB4MTIKKyNkZWZpbmUgUE8xMDMwX0VYUE9TVVJFX0RFRkFVTFQJCTB4ZjBmZgorI2RlZmluZSBQTzEwMzBfQkxVRV9HQUlOX0RFRkFVTFQgCTB4NDAKKyNkZWZpbmUgUE8xMDMwX1JFRF9HQUlOX0RFRkFVTFQgCTB4NDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBLZXJuZWwgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK2V4dGVybiBpbnQgZm9yY2Vfc2Vuc29yOworZXh0ZXJuIGludCBkdW1wX3NlbnNvcjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbTU2MDJfZGVidWc7CisKK2ludCBwbzEwMzBfcHJvYmUoc3RydWN0IHNkICpzZCk7CitpbnQgcG8xMDMwX2luaXQoc3RydWN0IHNkICpzZCk7CitpbnQgcG8xMDMwX3Bvd2VyX2Rvd24oc3RydWN0IHNkICpzZCk7CisKK3ZvaWQgcG8xMDMwX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpOworCitpbnQgcG8xMDMwX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CitpbnQgcG8xMDMwX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKKworaW50IHBvMTAzMF9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBwbzEwMzBfc2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBwbzEwMzBfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBwbzEwMzBfc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IHBvMTAzMF9nZXRfcmVkX2JhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBwbzEwMzBfc2V0X3JlZF9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBwbzEwMzBfZ2V0X2JsdWVfYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IHBvMTAzMF9zZXRfYmx1ZV9iYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKKworc3RhdGljIHN0cnVjdCBtNTYwMl9zZW5zb3IgcG8xMDMwID0geworCS5uYW1lID0gIlBPMTAzMCIsCisKKwkuaTJjX3NsYXZlX2lkID0gMHhkYywKKworCS5wcm9iZSA9IHBvMTAzMF9wcm9iZSwKKwkuaW5pdCA9IHBvMTAzMF9pbml0LAorCS5wb3dlcl9kb3duID0gcG8xMDMwX3Bvd2VyX2Rvd24sCisKKwkubmN0cmxzID0gNCwKKwkuY3RybHMgPSB7CisJeworCQl7CisJCQkuaWQgCQk9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSAJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lIAkJPSAiZ2FpbiIsCisJCQkubWluaW11bSAJPSAweDAwLAorCQkJLm1heGltdW0gCT0gMHhmZiwKKwkJCS5zdGVwIAkJPSAweDEsCisJCQkuZGVmYXVsdF92YWx1ZSAJPSBQTzEwMzBfR0xPQkFMX0dBSU5fREVGQVVMVCwKKwkJCS5mbGFncyAgICAgICAgIAk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkuc2V0ID0gcG8xMDMwX3NldF9nYWluLAorCQkuZ2V0ID0gcG8xMDMwX2dldF9nYWluCisJfSwgeworCQl7CisJCQkuaWQgCQk9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAJCT0gImV4cG9zdXJlIiwKKwkJCS5taW5pbXVtIAk9IDB4MDAsCisJCQkubWF4aW11bSAJPSAweGZmZmYsCisJCQkuc3RlcCAJCT0gMHgxLAorCQkJLmRlZmF1bHRfdmFsdWUgCT0gUE8xMDMwX0VYUE9TVVJFX0RFRkFVTFQsCisJCQkuZmxhZ3MgICAgICAgICAJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IHBvMTAzMF9zZXRfZXhwb3N1cmUsCisJCS5nZXQgPSBwbzEwMzBfZ2V0X2V4cG9zdXJlCisJfSwgeworCQl7CisJCQkuaWQgCQk9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAJCT0gInJlZCBiYWxhbmNlIiwKKwkJCS5taW5pbXVtIAk9IDB4MDAsCisJCQkubWF4aW11bSAJPSAweGZmLAorCQkJLnN0ZXAgCQk9IDB4MSwKKwkJCS5kZWZhdWx0X3ZhbHVlIAk9IFBPMTAzMF9SRURfR0FJTl9ERUZBVUxULAorCQkJLmZsYWdzICAgICAgICAgCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSCisJCX0sCisJCS5zZXQgPSBwbzEwMzBfc2V0X3JlZF9iYWxhbmNlLAorCQkuZ2V0ID0gcG8xMDMwX2dldF9yZWRfYmFsYW5jZQorCX0sIHsKKwkJeworCQkJLmlkIAkJPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSAJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lIAkJPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtIAk9IDB4MDAsCisJCQkubWF4aW11bSAJPSAweGZmLAorCQkJLnN0ZXAgCQk9IDB4MSwKKwkJCS5kZWZhdWx0X3ZhbHVlIAk9IFBPMTAzMF9CTFVFX0dBSU5fREVGQVVMVCwKKwkJCS5mbGFncyAgICAgICAgIAk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkuc2V0ID0gcG8xMDMwX3NldF9ibHVlX2JhbGFuY2UsCisJCS5nZXQgPSBwbzEwMzBfZ2V0X2JsdWVfYmFsYW5jZQorCX0KKwl9LAorCS5ubW9kZXMgPSAxLAorCS5tb2RlcyA9IHsKKwl7CisJCU01NjAyX0RFRkFVTFRfRlJBTUVfV0lEVEgsCisJCU01NjAyX0RFRkFVTFRfRlJBTUVfSEVJR0hULAorCQlWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQlWNEwyX0ZJRUxEX05PTkUsCisJCS5zaXplaW1hZ2UgPQorCQkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCAqIE01NjAyX0RFRkFVTFRfRlJBTUVfSEVJR0hULAorCQkuYnl0ZXNwZXJsaW5lID0gTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxCisJfQorCX0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByZWluaXRfcG8xMDMwW11bM10gPQoreworCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfRElWLCAweDAyfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0NUUkwsIDB4YjB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwZH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX0NUUkwsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwY30sCisKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0FVVE9DVFJMMiwgMHgyNH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMn0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDZ9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDBjfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODF9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODJ9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4ZWN9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4ODd9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCisJe1NFTlNPUiwgUE8xMDMwX1JFR19BVVRPQ1RSTDIsIDB4MjR9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDV9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDA0fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDZ9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4MDZ9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA0fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwY30sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MDV9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDAwfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdF9wbzEwMzBbXVs0XSA9Cit7CisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19ESVYsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfQ1RSTCwgMHhiMH0sCisJLypzZXF1ZW5jZSAxKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MGR9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX0NUUkwsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwY30sCisJLyplbmQgb2Ygc2VxdWVuY2UgMSovCisKKwkvKnNlcXVlbmNlIDIgKHNhbWUgYXMgc3RvcCBzZXF1ZW5jZSkqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfQVVUT0NUUkwyLCAweDI0fSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMn0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwfSwKKwkvKmVuZCBvZiBzZXF1ZW5jZSAyKi8KKworCS8qc2VxdWVuY2UgNSovCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDZ9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDBjfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODF9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODJ9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4ZWN9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4ODd9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCS8qZW5kIG9mIHNlcXVlbmNlIDUqLworCisJLypzZXF1ZW5jZSAyIHN0b3AgKi8KKwl7U0VOU09SLCBQTzEwMzBfUkVHX0FVVE9DVFJMMiwgMHgyNH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMn0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDR9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJLyplbmQgb2Ygc2VxdWVuY2UgMiBzdG9wICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZW5kIG9mIGluaXQgLSBiZWdpbiBvZiBzdGFydAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKnNlcXVlbmNlIDMqLworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwY30sCisJLyplbmQgb2Ygc2VxdWVuY2UgMyovCisJLypzZXF1ZW5jZSA0Ki8KKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgwNX0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNn0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDAwfSwKKworCXtTRU5TT1IsIFBPMTAzMF9SRUdfQVVUT0NUUkwyLCAweDA0fSwKKworCS8qIFNldCB0aGUgd2lkdGggdG8gNzUxICovCisJe1NFTlNPUiwgUE8xMDMwX1JFR19GUkFNRVdJRFRIX0gsIDB4MDJ9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfRlJBTUVXSURUSF9MLCAweGVmfSwKKworCS8qIFNldCB0aGUgaGVpZ2h0IHRvIDU0MCAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfRlJBTUVIRUlHSFRfSCwgMHgwMn0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19GUkFNRUhFSUdIVF9MLCAweDFjfSwKKworCS8qIFNldCB0aGUgeCB3aW5kb3cgdG8gMSAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfV0lORE9XWF9ILCAweDAwfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX1dJTkRPV1hfTCwgMHgwMX0sCisKKwkvKiBTZXQgdGhlIHkgd2luZG93IHRvIDEgKi8KKwl7U0VOU09SLCBQTzEwMzBfUkVHX1dJTkRPV1lfSCwgMHgwMH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19XSU5ET1dYX0wsIDB4MDF9LAorCisJe1NFTlNPUiwgUE8xMDMwX1JFR19XSU5ET1dXSURUSF9ILCAweDAyfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX1dJTkRPV1dJRFRIX0wsIDB4ODd9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfV0lORE9XSEVJR0hUX0gsIDB4MDF9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfV0lORE9XSEVJR0hUX0wsIDB4ZTN9LAorCisJe1NFTlNPUiwgUE8xMDMwX1JFR19PVVRGT1JNQ1RSTDIsIDB4MDR9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfT1VURk9STUNUUkwyLCAweDA0fSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0FVVE9DVFJMMSwgMHgwOH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19DT05UUk9MMiwgMHgwM30sCisJe1NFTlNPUiwgMHgyMSwgMHg5MH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19ZVEFSR0VULCAweDYwfSwKKwl7U0VOU09SLCAweDU5LCAweDEzfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX09VVEZPUk1DVFJMMSwgMHg0MH0sCisJe1NFTlNPUiwgMHg1ZiwgMHgwMH0sCisJe1NFTlNPUiwgMHg2MCwgMHg4MH0sCisJe1NFTlNPUiwgMHg3OCwgMHgxNH0sCisJe1NFTlNPUiwgMHg2ZiwgMHgwMX0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19DT05UUk9MMSwgMHgxOH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19HTE9CQUxHQUlOTUFYLCAweDE0fSwKKwl7U0VOU09SLCAweDYzLCAweDM4fSwKKwl7U0VOU09SLCAweDY0LCAweDM4fSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0NPTlRST0wxLCAweDU4fSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX1JFRF9HQUlOLCAweDMwfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0dSRUVOXzFfR0FJTiwgMHgzMH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19CTFVFX0dBSU4sIDB4MzB9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfR1JFRU5fMl9HQUlOLCAweDMwfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0dDMCwgMHgxMH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19HQzEsIDB4MjB9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfR0MyLCAweDQwfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0dDMywgMHg2MH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19HQzQsIDB4ODB9LAorCXtTRU5TT1IsIFBPMTAzMF9SRUdfR0M1LCAweGEwfSwKKwl7U0VOU09SLCBQTzEwMzBfUkVHX0dDNiwgMHhjMH0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19HQzcsIDB4ZmZ9LAorCS8qZW5kIG9mIHNlcXVlbmNlIDQqLworCS8qc2VxdWVuY2UgNSovCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDZ9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDBjfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODF9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODJ9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDF9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4ZWN9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDJ9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4N2V9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDB9LAorCS8qZW5kIG9mIHNlcXVlbmNlIDUqLworCisJLypzZXF1ZW5jZSA2Ki8KKwkvKiBDaGFuZ2luZyA0MCBpbiBmMCB0aGUgaW1hZ2UgYmVjb21lcyBncmVlbiBpbiBiYXllciBtb2RlIGFuZCByZWQgaW4KKwkgKiByZ2IgbW9kZSAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfUkVEX0dBSU4sIFBPMTAzMF9SRURfR0FJTl9ERUZBVUxUfSwKKwkvKiBpbiBjaGFuZ2luZyA0MCBpbiBmMCB0aGUgaW1hZ2UgYmVjb21lcyBncmVlbiBpbiBiYXllciBtb2RlIGFuZCByZWQgaW4KKwkgKiByZ2IgbW9kZSAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfQkxVRV9HQUlOLCBQTzEwMzBfQkxVRV9HQUlOX0RFRkFVTFR9LAorCisJLyogd2l0aCBhIHZlcnkgbG93IGxpZ2h0ZWQgZW52aXJvbm1lbnQgaW5jcmVhc2UgdGhlIGV4cG9zdXJlIGJ1dAorCSAqIGRlY3JlYXNlIHRoZSBGUFMgKEZyYW1lIFBlciBTZWNvbmQpICovCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMH0sCisKKwkvKiBDb250cm9scyBoaWdoIGV4cG9zdXJlIG1vcmUgdGhhbiBTRU5TT1JfTE9XX0VYUE9TVVJFLCB1c2Ugb25seSBpbgorCSAqIGxvdyBsaWdodGVkIGVudmlyb25tZW50IChmMCBpcyBtb3JlIHRoYW4gZmYgPykqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19ILCAoKFBPMTAzMF9FWFBPU1VSRV9ERUZBVUxUID4+IDIpCisJCSYgMHhmZil9LAorCisJLyogQ29udHJvbHMgbWlkZGxlIGV4cG9zdXJlLCB1c2Ugb25seSBpbiBoaWdoIGxpZ2h0ZWQgZW52aXJvbm1lbnQgKi8KKwl7U0VOU09SLCBQTzEwMzBfUkVHX0lOVEVHTElORVNfTSwgUE8xMDMwX0VYUE9TVVJFX0RFRkFVTFQgJiAweGZmfSwKKworCS8qIENvbnRyb2xzIGNsYXJpdHkgKG5vdCBzdXJlKSAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfSU5URUdMSU5FU19MLCAweDAwfSwKKwkvKiBDb250cm9scyBnYWluICh0aGUgaW1hZ2UgaXMgbW9yZSBsaWdodGVkKSAqLworCXtTRU5TT1IsIFBPMTAzMF9SRUdfR0xPQkFMR0FJTiwgUE8xMDMwX0dMT0JBTF9HQUlOX0RFRkFVTFR9LAorCisJLyogU2V0cyB0aGUgd2lkdGggKi8KKwl7U0VOU09SLCBQTzEwMzBfUkVHX0ZSQU1FV0lEVEhfSCwgMHgwMn0sCisJe1NFTlNPUiwgUE8xMDMwX1JFR19GUkFNRVdJRFRIX0wsIDB4ZWZ9CisJLyplbmQgb2Ygc2VxdWVuY2UgNiovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjAyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgczVrNGFhIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpbmNsdWRlICJtNTYwMl9zNWs0YWEuaCIKKworaW50IHM1azRhYV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKQoreworCXU4IHByb2RfaWRbNl0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdTggZXhwZWN0ZWRfcHJvZF9pZFs2XSA9IHsweDAwLCAweDEwLCAweDAwLCAweDRiLCAweDMzLCAweDc1fTsKKwlpbnQgaSwgZXJyID0gMDsKKworCWlmIChmb3JjZV9zZW5zb3IpIHsKKwkJaWYgKGZvcmNlX3NlbnNvciA9PSBTNUs0QUFfU0VOU09SKSB7CisJCQlpbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yIiwgczVrNGFhLm5hbWUpOworCQkJZ290byBzZW5zb3JfZm91bmQ7CisJCX0KKwkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwgZG9uJ3QgdHJ5IHRvIHByb2JlIHRoaXMKKwkJICogb25lICovCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZm8oIlByb2JpbmcgZm9yIGEgczVrNGFhIHNlbnNvciIpOworCisJLyogUHJlaW5pdCB0aGUgc2Vuc29yICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJlaW5pdF9zNWs0YWEpICYmICFlcnI7IGkrKykgeworCQl1OCBkYXRhWzJdID0gezB4MDAsIDB4MDB9OworCisJCXN3aXRjaCAocHJlaW5pdF9zNWs0YWFbaV1bMF0pIHsKKwkJY2FzZSBCUklER0U6CisJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsCisJCQkJCQkgcHJlaW5pdF9zNWs0YWFbaV1bMV0sCisJCQkJCQkgcHJlaW5pdF9zNWs0YWFbaV1bMl0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRU5TT1I6CisJCQlkYXRhWzBdID0gcHJlaW5pdF9zNWs0YWFbaV1bMl07CisJCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLAorCQkJCQkJICBwcmVpbml0X3M1azRhYVtpXVsxXSwKKwkJCQkJCSAgZGF0YSwgMSk7CisJCQlicmVhazsKKworCQljYXNlIFNFTlNPUl9MT05HOgorCQkJZGF0YVswXSA9IHByZWluaXRfczVrNGFhW2ldWzJdOworCQkJZGF0YVsxXSA9IHByZWluaXRfczVrNGFhW2ldWzNdOworCQkJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwKKwkJCQkJCSAgcHJlaW5pdF9zNWs0YWFbaV1bMV0sCisJCQkJCQkgIGRhdGEsIDIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogVGVzdCBzb21lIHJlZ2lzdGVycywgYnV0IHdlIGRvbid0IGtub3cgdGhlaXIgZXhhY3QgbWVhbmluZyB5ZXQgKi8KKwlpZiAoczVrNGFhX3JlYWRfc2Vuc29yKHNkLCAweDAwLCBwcm9kX2lkLCBzaXplb2YocHJvZF9pZCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtZW1jbXAocHJvZF9pZCwgZXhwZWN0ZWRfcHJvZF9pZCwgc2l6ZW9mKHByb2RfaWQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZQorCQlpbmZvKCJEZXRlY3RlZCBhIHM1azRhYSBzZW5zb3IiKTsKK3NlbnNvcl9mb3VuZDoKKwlzZC0+Z3NwY2FfZGV2LmNhbS5jYW1fbW9kZSA9IHM1azRhYS5tb2RlczsKKwlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBzNWs0YWEubm1vZGVzOworCXNkLT5kZXNjLT5jdHJscyA9IHM1azRhYS5jdHJsczsKKwlzZC0+ZGVzYy0+bmN0cmxzID0gczVrNGFhLm5jdHJsczsKKworCXJldHVybiAwOworfQorCitpbnQgczVrNGFhX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCisJZG8geworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOworCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsCisJCQkJIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTggKyBsZW4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19TVEFUVVMsIGkyY19kYXRhKTsKKwl9IHdoaWxlICgoKmkyY19kYXRhICYgSTJDX0JVU1kpICYmICFlcnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmICFlcnI7IGkrKykgeworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0RBVEEsICYoaTJjX2RhdGFbaV0pKTsKKworCQlQREVCVUcoREJHX1RSQUNFLCAiUmVhZGluZyBzZW5zb3IgcmVnaXN0ZXIgIgorCQkJCSAgIjB4JXggY29udGFpbmluZyAweCV4ICIsIGFkZHJlc3MsICppMmNfZGF0YSk7CisJfQorb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgczVrNGFhX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pCit7CisJaW50IGVyciwgaTsKKwl1OCAqcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNkLT5nc3BjYV9kZXYuZGV2OworCV9fdTggKmJ1ZiA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZjsKKworCS8qIE5vIHNlbnNvciB3aXRoIGEgZGF0YSB3aWR0aCBsYXJnZXIgdGhhbiAxNiBiaXRzIGhhcyB5ZXQgYmVlbiBzZWVuICovCisJaWYgKGxlbiA+IDIgfHwgIWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoYnVmLCBzZW5zb3JfdXJiX3NrZWxldG9uLAorCSAgICAgICBzaXplb2Yoc2Vuc29yX3VyYl9za2VsZXRvbikpOworCisJYnVmWzExXSA9IHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZDsKKwlidWZbMTVdID0gYWRkcmVzczsKKworCS8qIFNwZWNpYWwgY2FzZSBsYXJnZXIgc2Vuc29yIHdyaXRlcyAqLworCXAgPSBidWYgKyAxNjsKKworCS8qIENvcHkgYSBmb3VyIGJ5dGUgd3JpdGUgc2VxdWVuY2UgZm9yIGVhY2ggYnl0ZSB0byBiZSB3cml0dGVuIHRvICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMTYsIDQpOworCQlwWzNdID0gaTJjX2RhdGFbaV07CisJCXAgKz0gNDsKKwkJUERFQlVHKERCR19UUkFDRSwgIldyaXRpbmcgc2Vuc29yIHJlZ2lzdGVyIDB4JXggd2l0aCAweCV4IiwKKwkJICAgICAgIGFkZHJlc3MsIGkyY19kYXRhW2ldKTsKKwl9CisKKwkvKiBDb3B5IHRoZSB0YWlsZXIgKi8KKwltZW1jcHkocCwgc2Vuc29yX3VyYl9za2VsZXRvbiArIDIwLCA0KTsKKworCS8qIFNldCB0aGUgdG90YWwgbGVuZ3RoICovCisJcFszXSA9IDB4MTAgKyBsZW47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgMHgwNCwgMHg0MCwgMHgxOSwKKwkJCSAgICAgIDB4MDAwMCwgYnVmLAorCQkJICAgICAgMjAgKyBsZW4gKiA0LCBNNTYwMl9VUkJfTVNHX1RJTUVPVVQpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs0YWFfaW5pdChzdHJ1Y3Qgc2QgKnNkKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9zNWs0YWEpICYmICFlcnI7IGkrKykgeworCQl1OCBkYXRhWzJdID0gezB4MDAsIDB4MDB9OworCisJCXN3aXRjaCAoaW5pdF9zNWs0YWFbaV1bMF0pIHsKKwkJY2FzZSBCUklER0U6CisJCQllcnIgPSBtNTYwMl93cml0ZV9icmlkZ2Uoc2QsCisJCQkJaW5pdF9zNWs0YWFbaV1bMV0sCisJCQkJaW5pdF9zNWs0YWFbaV1bMl0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRU5TT1I6CisJCQlkYXRhWzBdID0gaW5pdF9zNWs0YWFbaV1bMl07CisJCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLAorCQkJCWluaXRfczVrNGFhW2ldWzFdLCBkYXRhLCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VOU09SX0xPTkc6CisJCQlkYXRhWzBdID0gaW5pdF9zNWs0YWFbaV1bMl07CisJCQlkYXRhWzFdID0gaW5pdF9zNWs0YWFbaV1bM107CisJCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLAorCQkJCWluaXRfczVrNGFhW2ldWzFdLCBkYXRhLCAyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW5mbygiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkdW1wX3NlbnNvcikKKwkJczVrNGFhX2R1bXBfcmVnaXN0ZXJzKHNkKTsKKworCWlmICghZXJyICYmIGRtaV9jaGVja19zeXN0ZW0oczVrNGFhX3ZmbGlwX2RtaV90YWJsZSkpIHsKKwkJdTggZGF0YSA9IDB4MDI7CisJCWluZm8oInZlcnRpY2FsIGZsaXAgcXVpcmsgYWN0aXZlIik7CisJCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKKwkJZGF0YSB8PSBTNUs0QUFfUk1fVl9GTElQOworCQlkYXRhICY9IH5TNUs0QUFfUk1fSF9GTElQOworCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisKKwkJLyogRGVjcmVtZW50IENPTFNUQVJUIHRvIHByZXNlcnZlIGNvbG9yIG9yZGVyIChCR0dSKSAqLworCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOworCQlkYXRhLS07CisJCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9DT0xTVEFSVF9MTywgJmRhdGEsIDEpOworCisJCS8qIEluY3JlbWVudCBST1dTVEFSVCB0byBwcmVzZXJ2ZSBjb2xvciBvcmRlciAoQkdHUikgKi8KKwkJczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJZGF0YSsrOworCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwl9CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azRhYV9wb3dlcl9kb3duKHN0cnVjdCBzZCAqc2QpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzNWs0YWFfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggZGF0YSA9IFM1SzRBQV9QQUdFX01BUF8yOworCWludCBlcnI7CisKKwllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9FWFBPU1VSRV9ISSwgJmRhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCSp2YWwgPSBkYXRhIDw8IDg7CisJZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfTE8sICZkYXRhLCAxKTsKKwkqdmFsIHw9IGRhdGE7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgZXhwb3N1cmUgJWQiLCAqdmFsKTsKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azRhYV9zZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGRhdGEgPSBTNUs0QUFfUEFHRV9NQVBfMjsKKwlpbnQgZXJyOworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIlNldCBleHBvc3VyZSB0byAlZCIsIHZhbCk7CisJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWRhdGEgPSAodmFsID4+IDgpICYgMHhmZjsKKwllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfRVhQT1NVUkVfSEksICZkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJZGF0YSA9IHZhbCAmIDB4ZmY7CisJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX0VYUE9TVVJFX0xPLCAmZGF0YSwgMSk7CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs0YWFfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggZGF0YSA9IFM1SzRBQV9QQUdFX01BUF8yOworCWludCBlcnI7CisKKwllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCSp2YWwgPSAoZGF0YSAmIFM1SzRBQV9STV9WX0ZMSVApID4+IDc7CisJUERFQlVHKERCR19WNEwyX0NJRCwgIlJlYWQgdmVydGljYWwgZmxpcCAlZCIsICp2YWwpOworCitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs0YWFfc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CisJaW50IGVycjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgdmVydGljYWwgZmxpcCB0byAlZCIsIHZhbCk7CisJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJZGF0YSA9ICgoZGF0YSAmIH5TNUs0QUFfUk1fVl9GTElQKQorCQkJfCAoKHZhbCAmIDB4MDEpIDw8IDcpKTsKKwllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHZhbCkgeworCQllcnIgPSBzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWRhdGErKzsKKwkJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1JPV1NUQVJUX0xPLCAmZGF0YSwgMSk7CisJfSBlbHNlIHsKKwkJZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUk9XU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKworCQlkYXRhLS07CisJCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9ST1dTVEFSVF9MTywgJmRhdGEsIDEpOworCX0KK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azRhYV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CisJaW50IGVycjsKKworCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHM1azRhYV9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJKnZhbCA9IChkYXRhICYgUzVLNEFBX1JNX0hfRkxJUCkgPj4gNjsKKwlQREVCVUcoREJHX1Y0TDJfQ0lELCAiUmVhZCBob3Jpem9udGFsIGZsaXAgJWQiLCAqdmFsKTsKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azRhYV9zZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXU4IGRhdGEgPSBTNUs0QUFfUEFHRV9NQVBfMjsKKwlpbnQgZXJyOworCisJUERFQlVHKERCR19WNEwyX0NJRCwgIlNldCBob3Jpem9udGFsIGZsaXAgdG8gJWQiLAorCSAgICAgICB2YWwpOworCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfUkVBRF9NT0RFLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZGF0YSA9ICgoZGF0YSAmIH5TNUs0QUFfUk1fSF9GTElQKSB8ICgodmFsICYgMHgwMSkgPDwgNikpOworCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9SRUFEX01PREUsICZkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAodmFsKSB7CisJCWVyciA9IHM1azRhYV9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX0NPTFNUQVJUX0xPLCAmZGF0YSwgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCWRhdGErKzsKKwkJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX0NPTFNUQVJUX0xPLCAmZGF0YSwgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJZXJyID0gczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfQ09MU1RBUlRfTE8sICZkYXRhLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwkJZGF0YS0tOworCQllcnIgPSBzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBTNUs0QUFfQ09MU1RBUlRfTE8sICZkYXRhLCAxKTsKKwl9CitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs0YWFfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CisJaW50IGVycjsKKworCWVyciA9IHM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJmRhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHM1azRhYV9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX0dBSU5fMiwgJmRhdGEsIDEpOworCSp2YWwgPSBkYXRhOworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJSZWFkIGdhaW4gJWQiLCAqdmFsKTsKKworb3V0OgorCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgczVrNGFhX3NldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCBkYXRhID0gUzVLNEFBX1BBR0VfTUFQXzI7CisJaW50IGVycjsKKworCVBERUJVRyhEQkdfVjRMMl9DSUQsICJTZXQgZ2FpbiB0byAlZCIsIHZhbCk7CisJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZGF0YSA9IHZhbCAmIDB4ZmY7CisJZXJyID0gczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX0dBSU5fMiwgJmRhdGEsIDEpOworCitvdXQ6CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK3ZvaWQgczVrNGFhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGFkZHJlc3M7CisJdTggcGFnZSwgb2xkX3BhZ2U7CisJczVrNGFhX3JlYWRfc2Vuc29yKHNkLCBTNUs0QUFfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CisJZm9yIChwYWdlID0gMDsgcGFnZSA8IDE2OyBwYWdlKyspIHsKKwkJczVrNGFhX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmcGFnZSwgMSk7CisJCWluZm8oIkR1bXBpbmcgdGhlIHM1azRhYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CisJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CisJCQl1OCB2YWx1ZSA9IDA7CisJCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7CisJCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgiLAorCQkJICAgICBhZGRyZXNzLCB2YWx1ZSk7CisJCX0KKwl9CisJaW5mbygiczVrNGFhIHJlZ2lzdGVyIHN0YXRlIGR1bXAgY29tcGxldGUiKTsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CisJCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJnBhZ2UsIDEpOworCQlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgIgorCQkgICAgICJyZWFkL3dyaXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKKwkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKKwkJCXU4IG9sZF92YWx1ZSwgY3RybF92YWx1ZSwgdGVzdF92YWx1ZSA9IDB4ZmY7CisKKwkJCXM1azRhYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CisJCQlzNWs0YWFfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmdGVzdF92YWx1ZSwgMSk7CisJCQlzNWs0YWFfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbHVlLCAxKTsKKworCQkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZSkKKwkJCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZSIsIGFkZHJlc3MpOworCQkJZWxzZQorCQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CisKKwkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KKwkJCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOworCQl9CisJfQorCWluZm8oIlJlYWQvd3JpdGUgcmVnaXN0ZXIgcHJvYmluZyBjb21wbGV0ZSIpOworCXM1azRhYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJm9sZF9wYWdlLCAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2Y3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5oCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgczVrNGFhIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpZm5kZWYgTTU2MDJfUzVLNEFBX0hfCisjZGVmaW5lIE01NjAyX1M1SzRBQV9IXworCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisKKyNpbmNsdWRlICJtNTYwMl9zZW5zb3IuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFM1SzRBQV9QQUdFX01BUAkJCTB4ZWMKKworI2RlZmluZSBTNUs0QUFfUEFHRV9NQVBfMAkJMHgwMAorI2RlZmluZSBTNUs0QUFfUEFHRV9NQVBfMQkJMHgwMQorI2RlZmluZSBTNUs0QUFfUEFHRV9NQVBfMgkJMHgwMgorCisvKiBTZW5zb3IgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHBhZ2UgMHgwMiAqLworI2RlZmluZSBTNUs0QUFfUkVBRF9NT0RFCQkweDAzCisjZGVmaW5lIFM1SzRBQV9ST1dTVEFSVF9ISQkJMHgwNAorI2RlZmluZSBTNUs0QUFfUk9XU1RBUlRfTE8JCTB4MDUKKyNkZWZpbmUgUzVLNEFBX0NPTFNUQVJUX0hJCQkweDA2CisjZGVmaW5lIFM1SzRBQV9DT0xTVEFSVF9MTwkJMHgwNworI2RlZmluZSBTNUs0QUFfV0lORE9XX0hFSUdIVF9ISQkJMHgwOAorI2RlZmluZSBTNUs0QUFfV0lORE9XX0hFSUdIVF9MTwkJMHgwOQorI2RlZmluZSBTNUs0QUFfV0lORE9XX1dJRFRIX0hJCQkweDBhCisjZGVmaW5lIFM1SzRBQV9XSU5ET1dfV0lEVEhfTE8JCTB4MGIKKyNkZWZpbmUgUzVLNEFBX0dMT0JBTF9HQUlOX18JCTB4MGYgLyogT25seSBhIGd1ZXNzIEFUTSAhISEgKi8KKyNkZWZpbmUgUzVLNEFBX0hfQkxBTktfSElfXwkJMHgxZCAvKiBPbmx5IGEgZ3Vlc3MgQVRNICEhISBzeW5jIGxvc3QKKwkJCQkJCWlmIHRvbyBsb3csIHJlZHVjZXMgZnJhbWUgcmF0ZQorCQkJCQkJaWYgdG9vIGhpZ2ggKi8KKyNkZWZpbmUgUzVLNEFBX0hfQkxBTktfTE9fXwkJMHgxZSAvKiBPbmx5IGEgZ3Vlc3MgQVRNICEhISAqLworI2RlZmluZSBTNUs0QUFfRVhQT1NVUkVfSEkJCTB4MTcKKyNkZWZpbmUgUzVLNEFBX0VYUE9TVVJFX0xPCQkweDE4CisjZGVmaW5lIFM1SzRBQV9HQUlOXzEJCQkweDFmIC8qIChkaWdpdGFsPykgZ2FpbiA6IDUgYml0cyAqLworI2RlZmluZSBTNUs0QUFfR0FJTl8yCQkJMHgyMCAvKiAoYW5hbG9ndWU/KSBnYWluIDogNyBiaXRzICovCisKKyNkZWZpbmUgUzVLNEFBX1JNX1JPV19TS0lQXzRYCQkweDA4CisjZGVmaW5lIFM1SzRBQV9STV9ST1dfU0tJUF8yWAkJMHgwNAorI2RlZmluZSBTNUs0QUFfUk1fQ09MX1NLSVBfNFgJCTB4MDIKKyNkZWZpbmUgUzVLNEFBX1JNX0NPTF9TS0lQXzJYCQkweDAxCisjZGVmaW5lIFM1SzRBQV9STV9IX0ZMSVAJCTB4NDAKKyNkZWZpbmUgUzVLNEFBX1JNX1ZfRkxJUAkJMHg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEtlcm5lbCBtb2R1bGUgcGFyYW1ldGVycyAqLworZXh0ZXJuIGludCBmb3JjZV9zZW5zb3I7CitleHRlcm4gaW50IGR1bXBfc2Vuc29yOworZXh0ZXJuIHVuc2lnbmVkIGludCBtNTYwMl9kZWJ1ZzsKKworaW50IHM1azRhYV9wcm9iZShzdHJ1Y3Qgc2QgKnNkKTsKK2ludCBzNWs0YWFfaW5pdChzdHJ1Y3Qgc2QgKnNkKTsKK2ludCBzNWs0YWFfcG93ZXJfZG93bihzdHJ1Y3Qgc2QgKnNkKTsKKwordm9pZCBzNWs0YWFfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCk7CisKK2ludCBzNWs0YWFfcmVhZF9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkJICAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKK2ludCBzNWs0YWFfd3JpdGVfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQl1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CisKK2ludCBzNWs0YWFfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgczVrNGFhX3NldF9leHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitpbnQgczVrNGFhX2dldF92ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IHM1azRhYV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IHM1azRhYV9nZXRfaGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBzNWs0YWFfc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBzNWs0YWFfZ2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBzNWs0YWFfc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworCitzdGF0aWMgc3RydWN0IG01NjAyX3NlbnNvciBzNWs0YWEgPSB7CisJLm5hbWUgPSAiUzVLNEFBIiwKKwkucHJvYmUgPSBzNWs0YWFfcHJvYmUsCisJLmluaXQgPSBzNWs0YWFfaW5pdCwKKwkucG93ZXJfZG93biA9IHM1azRhYV9wb3dlcl9kb3duLAorCS5yZWFkX3NlbnNvciA9IHM1azRhYV9yZWFkX3NlbnNvciwKKwkud3JpdGVfc2Vuc29yID0gczVrNGFhX3dyaXRlX3NlbnNvciwKKwkuaTJjX3NsYXZlX2lkID0gMHg1YSwKKwkubmN0cmxzID0gNCwKKwkuY3RybHMgPSB7CisJeworCQl7CisJCQkuaWQgCQk9IFY0TDJfQ0lEX1ZGTElQLAorCQkJLnR5cGUgCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSAJCT0gInZlcnRpY2FsIGZsaXAiLAorCQkJLm1pbmltdW0gCT0gMCwKKwkJCS5tYXhpbXVtIAk9IDEsCisJCQkuc3RlcCAJCT0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlIAk9IDAKKwkJfSwKKwkJLnNldCA9IHM1azRhYV9zZXRfdmZsaXAsCisJCS5nZXQgPSBzNWs0YWFfZ2V0X3ZmbGlwCisKKwl9LCB7CisJCXsKKwkJCS5pZCAJCT0gVjRMMl9DSURfSEZMSVAsCisJCQkudHlwZSAJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lIAkJPSAiaG9yaXpvbnRhbCBmbGlwIiwKKwkJCS5taW5pbXVtIAk9IDAsCisJCQkubWF4aW11bSAJPSAxLAorCQkJLnN0ZXAgCQk9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSAJPSAwCisJCX0sCisJCS5zZXQgPSBzNWs0YWFfc2V0X2hmbGlwLAorCQkuZ2V0ID0gczVrNGFhX2dldF9oZmxpcAorCisJfSwgeworCQl7CisJCQkuaWQJCT0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZQkJPSAiR2FpbiIsCisJCQkubWluaW11bQk9IDAsCisJCQkubWF4aW11bQk9IDEyNywKKwkJCS5zdGVwCQk9IDEsCisJCQkuZGVmYXVsdF92YWx1ZQk9IDB4YTAsCisJCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSCisJCX0sCisJCS5zZXQgPSBzNWs0YWFfc2V0X2dhaW4sCisJCS5nZXQgPSBzNWs0YWFfZ2V0X2dhaW4KKwl9LCB7CisJCXsKKwkJCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZQkJPSAiRXhwb3N1cmUiLAorCQkJLm1pbmltdW0JPSAxMywKKwkJCS5tYXhpbXVtCT0gMHhmZmYsCisJCQkuc3RlcAkJPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUJPSAweDEwMCwKKwkJCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnNldCA9IHM1azRhYV9zZXRfZXhwb3N1cmUsCisJCS5nZXQgPSBzNWs0YWFfZ2V0X2V4cG9zdXJlCisJfQorCX0sCisKKwkubm1vZGVzID0gMSwKKwkubW9kZXMgPSB7CisJeworCQlNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRILAorCQlNNTYwMl9ERUZBVUxUX0ZSQU1FX0hFSUdIVCwKKwkJVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJVjRMMl9GSUVMRF9OT05FLAorCQkuc2l6ZWltYWdlID0KKwkJCU01NjAyX0RFRkFVTFRfRlJBTUVfV0lEVEggKiBNNTYwMl9ERUZBVUxUX0ZSQU1FX0hFSUdIVCwKKwkJLmJ5dGVzcGVybGluZSA9IE01NjAyX0RFRkFVTFRfRlJBTUVfV0lEVEgsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMQorCX0KKwl9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcmVpbml0X3M1azRhYVtdWzRdID0KK3sKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MGQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9DVFJMLCAweDAwLCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDFkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwOCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHg4MCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDNmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDNmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgxZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA4LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfRElWLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDFkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgxNCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhmMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MWQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDFjLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NMS19ESVYsIDB4MjAsIDB4MDB9LAorCisJe1NFTlNPUiwgUzVLNEFBX1BBR0VfTUFQLCAweDAwLCAweDAwfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdF9zNWs0YWFbXVs0XSA9Cit7CisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19ESVYsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfQ1RSTCwgMHgwMCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgxZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDgsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4ODAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgzZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgzZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MWQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgxZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MTQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4ZjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDFkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgxYywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DTEtfRElWLCAweDIwLCAweDAwfSwKKworCXtTRU5TT1IsIFM1SzRBQV9QQUdFX01BUCwgMHgwNywgMHgwMH0sCisJe1NFTlNPUiwgMHgzNiwgMHgwMSwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1BBR0VfTUFQLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDdiLCAweGZmLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfUEFHRV9NQVAsIDB4MDIsIDB4MDB9LAorCXtTRU5TT1IsIDB4MGMsIDB4MDUsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDIsIDB4MGUsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9HQUlOXzEsIDB4MGYsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9HQUlOXzIsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9HTE9CQUxfR0FJTl9fLCAweDAxLCAweDAwfSwKKwl7U0VOU09SLCAweDExLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCAweDEyLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfUEFHRV9NQVAsIDB4MDIsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9SRUFEX01PREUsIDB4YTAsIDB4MDB9LAorCXtTRU5TT1IsIDB4MzcsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9ST1dTVEFSVF9ISSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1JPV1NUQVJUX0xPLCAweDJhLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfQ09MU1RBUlRfSEksIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9DT0xTVEFSVF9MTywgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1dJTkRPV19IRUlHSFRfSEksIDB4MDMsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9XSU5ET1dfSEVJR0hUX0xPLCAweGM0LCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfV0lORE9XX1dJRFRIX0hJLCAweDA1LCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfV0lORE9XX1dJRFRIX0xPLCAweDA4LCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfSF9CTEFOS19ISV9fLCAweDAwLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfSF9CTEFOS19MT19fLCAweDQ4LCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfRVhQT1NVUkVfSEksIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9FWFBPU1VSRV9MTywgMHg0MywgMHgwMH0sCisJe1NFTlNPUiwgMHgxMSwgMHgwNCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxMiwgMHhjMywgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1BBR0VfTUFQLCAweDAyLCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9QSVhfT0ZfTElORV9ILCAweDgyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwkvKiBWU1lOQ19QQVJBLCBWU1lOQ19QQVJBIDogaW1nIGhlaWdodCA0ODAgPSAweDAxZTAgKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGUwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwkvKiBIU1lOQ19QQVJBLCBIU1lOQ19QQVJBIDogaW1nIHdpZHRoIDY0MCA9IDB4MDI4MCAqLworCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4ODAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YTAsIDB4MDB9LCAvKiA0OCBNSHogKi8KKworCXtTRU5TT1IsIFM1SzRBQV9QQUdFX01BUCwgMHgwMiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1JFQURfTU9ERSwgUzVLNEFBX1JNX0hfRkxJUCB8IFM1SzRBQV9STV9ST1dfU0tJUF8yWAorCQl8IFM1SzRBQV9STV9DT0xfU0tJUF8yWCwgMHgwMH0sCisJLyogMHgzNyA6IEZpeCBpbWFnZSBzdGFiaWxpdHkgd2hlbiBsaWdodCBpcyB0b28gYnJpZ2h0IGFuZCBpbXByb3ZlcworCSAqIGltYWdlIHF1YWxpdHkgaW4gNjQweDQ4MCwgYnV0IHdvcnNlbnMgaXQgaW4gMTI4MHgxMDI0ICovCisJe1NFTlNPUiwgMHgzNywgMHgwMSwgMHgwMH0sCisJLyogUk9XU1RBUlRfSEksIFJPV1NUQVJUX0xPIDogMTAgKyAoMTAyNC05NjApLzIgPSA0MiA9IDB4MDAyYSAqLworCXtTRU5TT1IsIFM1SzRBQV9ST1dTVEFSVF9ISSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1JPV1NUQVJUX0xPLCAweDJhLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfQ09MU1RBUlRfSEksIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9DT0xTVEFSVF9MTywgMHgwYywgMHgwMH0sCisJLyogd2luZG93X2hlaWdodF9oaSwgd2luZG93X2hlaWdodF9sbyA6IDk2MCA9IDB4MDNjMCAqLworCXtTRU5TT1IsIFM1SzRBQV9XSU5ET1dfSEVJR0hUX0hJLCAweDAzLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfV0lORE9XX0hFSUdIVF9MTywgMHhjMCwgMHgwMH0sCisJLyogd2luZG93X3dpZHRoX2hpLCB3aW5kb3dfd2lkdGhfbG8gOiAxMjgwID0gMHgwNTAwICovCisJe1NFTlNPUiwgUzVLNEFBX1dJTkRPV19XSURUSF9ISSwgMHgwNSwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1dJTkRPV19XSURUSF9MTywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX0hfQkxBTktfSElfXywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX0hfQkxBTktfTE9fXywgMHhhOCwgMHgwMH0sIC8qIGhlbHBzIHRvIHN5bmMuLi4gKi8KKwl7U0VOU09SLCBTNUs0QUFfRVhQT1NVUkVfSEksIDB4MDEsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzRBQV9FWFBPU1VSRV9MTywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxMSwgMHgwNCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxMiwgMHhjMywgMHgwMH0sCisJe1NFTlNPUiwgUzVLNEFBX1BBR0VfTUFQLCAweDAyLCAweDAwfSwKKwl7U0VOU09SLCAweDAyLCAweDBlLCAweDAwfSwKKwl7U0VOU09SX0xPTkcsIFM1SzRBQV9HTE9CQUxfR0FJTl9fLCAweDBmLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfR0FJTl8xLCAweDBiLCAweDAwfSwKKwl7U0VOU09SLCBTNUs0QUFfR0FJTl8yLCAweGEwLCAweDAwfQorfTsKKworc3RhdGljCisgICAgY29uc3QKKwlzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzNWs0YWFfdmZsaXBfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFhhIDI1MjgiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBYYSAyNTI4IikKKwkJfQorCX0sCisJeworCQkuaWRlbnQgPSAiRnVqaXRzdS1TaWVtZW5zIEFtaWxvIFhpIDI1NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBTUlMTyBYaSAyNTUwIikKKwkJfQorCX0sCisJCXsKKwkJLmlkZW50ID0gIk1TSSBHWDcwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTWljcm8tU3RhciBJbnRlcm5hdGlvbmFsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkdYNzAwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA3LzI2LzIwMDciKQorCQl9CisJfSwKKwl7IH0KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiMzNjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBzNWs4M2Egc2Vuc29yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVyaWsgQW5kcmVuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSWx5ZXMgR291dGEuIEJhc2VkIG9uIHRoZSBtNTYwM3ggTGludXggRHJpdmVyIFByb2plY3QuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0IDxtNTYwMkB4M25nLmNvbS5icj4KKyAqCisgKiBQb3J0aW9ucyBvZiBjb2RlIHRvIFVTQiBpbnRlcmZhY2UgYW5kIEFMaSBkcml2ZXIgc29mdHdhcmUsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgV2lsbGVtIER1aW5rZXIKKyAqIHY0bDIgaW50ZXJmYWNlIG1vZGVsZWQgYWZ0ZXIgdGhlIFY0TDIgZHJpdmVyCisgKiBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2luY2x1ZGUgIm01NjAyX3M1azgzYS5oIgorCitpbnQgczVrODNhX3Byb2JlKHN0cnVjdCBzZCAqc2QpCit7CisJdTggcHJvZF9pZCA9IDAsIHZlcl9pZCA9IDA7CisJaW50IGksIGVyciA9IDA7CisKKwlpZiAoZm9yY2Vfc2Vuc29yKSB7CisJCWlmIChmb3JjZV9zZW5zb3IgPT0gUzVLODNBX1NFTlNPUikgeworCQkJaW5mbygiRm9yY2luZyBhICVzIHNlbnNvciIsIHM1azgzYS5uYW1lKTsKKwkJCWdvdG8gc2Vuc29yX2ZvdW5kOworCQl9CisJCS8qIElmIHdlIHdhbnQgdG8gZm9yY2UgYW5vdGhlciBzZW5zb3IsIGRvbid0IHRyeSB0byBwcm9iZSB0aGlzCisJCSAqIG9uZSAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvKCJQcm9iaW5nIGZvciBhIHM1azgzYSBzZW5zb3IiKTsKKworCS8qIFByZWluaXQgdGhlIHNlbnNvciAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByZWluaXRfczVrODNhKSAmJiAhZXJyOyBpKyspIHsKKwkJdTggZGF0YVsyXSA9IHtwcmVpbml0X3M1azgzYVtpXVsyXSwgcHJlaW5pdF9zNWs4M2FbaV1bM119OworCQlpZiAocHJlaW5pdF9zNWs4M2FbaV1bMF0gPT0gU0VOU09SKQorCQkJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgcHJlaW5pdF9zNWs4M2FbaV1bMV0sCisJCQkJZGF0YSwgMik7CisJCWVsc2UKKwkJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgcHJlaW5pdF9zNWs4M2FbaV1bMV0sCisJCQkJZGF0YVswXSk7CisJfQorCisJLyogV2UgZG9uJ3Qga25vdyB3aGF0IHJlZ2lzdGVyIChpZiBhbnkpIHRoYXQgY29udGFpbiB0aGUgcHJvZHVjdCBpZAorCSAqIEp1c3QgcGljayB0aGUgZmlyc3QgYWRkcmVzc2VzIHRoYXQgc2VlbSB0byBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMKKwkgKiBvbiBtdWx0aXBsZSBtYWNoaW5lcyAqLworCWlmIChzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIDB4MDAsICZwcm9kX2lkLCAxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoczVrODNhX3JlYWRfc2Vuc29yKHNkLCAweDAxLCAmdmVyX2lkLCAxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKHByb2RfaWQgPT0gMHhmZikgfHwgKHZlcl9pZCA9PSAweGZmKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZQorCQlpbmZvKCJEZXRlY3RlZCBhIHM1azgzYSBzZW5zb3IiKTsKKworc2Vuc29yX2ZvdW5kOgorCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gczVrODNhLm1vZGVzOworCXNkLT5nc3BjYV9kZXYuY2FtLm5tb2RlcyA9IHM1azgzYS5ubW9kZXM7CisJc2QtPmRlc2MtPmN0cmxzID0gczVrODNhLmN0cmxzOworCXNkLT5kZXNjLT5uY3RybHMgPSBzNWs4M2EubmN0cmxzOworCXJldHVybiAwOworfQorCitpbnQgczVrODNhX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCQkgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCisJZG8geworCQllcnIgPSBtNTYwMl9yZWFkX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX1NUQVRVUywgaTJjX2RhdGEpOworCX0gd2hpbGUgKCgqaTJjX2RhdGEgJiBJMkNfQlVTWSkgJiYgIWVycik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREVWX0FERFIsCisJCQkJIHNkLT5zZW5zb3ItPmkyY19zbGF2ZV9pZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gbTU2MDJfd3JpdGVfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfUkVHX0FERFIsIGFkZHJlc3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwgTTU2MDJfWEJfSTJDX0NUUkwsIDB4MTggKyBsZW4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJZXJyID0gbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIE01NjAyX1hCX0kyQ19TVEFUVVMsIGkyY19kYXRhKTsKKwl9IHdoaWxlICgoKmkyY19kYXRhICYgSTJDX0JVU1kpICYmICFlcnIpOworCisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgIWxlbjsgaSsrKSB7CisJCWVyciA9IG01NjAyX3JlYWRfYnJpZGdlKHNkLCBNNTYwMl9YQl9JMkNfREFUQSwgJihpMmNfZGF0YVtpXSkpOworCisJCVBERUJVRyhEQkdfVFJBQ0UsICJSZWFkaW5nIHNlbnNvciByZWdpc3RlciAiCisJCQkJICAiMHgleCBjb250YWluaW5nIDB4JXggIiwgYWRkcmVzcywgKmkyY19kYXRhKTsKKwl9CisKK291dDoKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azgzYV93cml0ZV9zZW5zb3Ioc3RydWN0IHNkICpzZCwgY29uc3QgdTggYWRkcmVzcywKKwkJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbikKK3sKKwlpbnQgZXJyLCBpOworCXU4ICpwOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gc2QtPmdzcGNhX2Rldi5kZXY7CisJX191OCAqYnVmID0gc2QtPmdzcGNhX2Rldi51c2JfYnVmOworCisJLyogTm8gc2Vuc29yIHdpdGggYSBkYXRhIHdpZHRoIGxhcmdlciB0aGFuIDE2IGJpdHMgaGFzIHlldCBiZWVuIHNlZW4gKi8KKwlpZiAobGVuID4gMiB8fCAhbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShidWYsIHNlbnNvcl91cmJfc2tlbGV0b24sCisJICAgICAgIHNpemVvZihzZW5zb3JfdXJiX3NrZWxldG9uKSk7CisKKwlidWZbMTFdID0gc2QtPnNlbnNvci0+aTJjX3NsYXZlX2lkOworCWJ1ZlsxNV0gPSBhZGRyZXNzOworCisJLyogU3BlY2lhbCBjYXNlIGxhcmdlciBzZW5zb3Igd3JpdGVzICovCisJcCA9IGJ1ZiArIDE2OworCisJLyogQ29weSBhIGZvdXIgYnl0ZSB3cml0ZSBzZXF1ZW5jZSBmb3IgZWFjaCBieXRlIHRvIGJlIHdyaXR0ZW4gdG8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJbWVtY3B5KHAsIHNlbnNvcl91cmJfc2tlbGV0b24gKyAxNiwgNCk7CisJCXBbM10gPSBpMmNfZGF0YVtpXTsKKwkJcCArPSA0OworCQlQREVCVUcoREJHX1RSQUNFLCAiV3JpdGluZyBzZW5zb3IgcmVnaXN0ZXIgMHgleCB3aXRoIDB4JXgiLAorCQkgICAgICAgYWRkcmVzcywgaTJjX2RhdGFbaV0pOworCX0KKworCS8qIENvcHkgdGhlIHRhaWxlciAqLworCW1lbWNweShwLCBzZW5zb3JfdXJiX3NrZWxldG9uICsgMjAsIDQpOworCisJLyogU2V0IHRoZSB0b3RhbCBsZW5ndGggKi8KKwlwWzNdID0gMHgxMCArIGxlbjsKKworCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAweDA0LCAweDQwLCAweDE5LAorCQkJICAgICAgMHgwMDAwLCBidWYsCisJCQkgICAgICAyMCArIGxlbiAqIDQsIE01NjAyX1VSQl9NU0dfVElNRU9VVCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azgzYV9pbml0KHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbml0X3M1azgzYSkgJiYgIWVycjsgaSsrKSB7CisJCXU4IGRhdGFbMl0gPSB7MHgwMCwgMHgwMH07CisKKwkJc3dpdGNoIChpbml0X3M1azgzYVtpXVswXSkgeworCQljYXNlIEJSSURHRToKKwkJCWVyciA9IG01NjAyX3dyaXRlX2JyaWRnZShzZCwKKwkJCQkJaW5pdF9zNWs4M2FbaV1bMV0sCisJCQkJCWluaXRfczVrODNhW2ldWzJdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VOU09SOgorCQkJZGF0YVswXSA9IGluaXRfczVrODNhW2ldWzJdOworCQkJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwKKwkJCQlpbml0X3M1azgzYVtpXVsxXSwgZGF0YSwgMSk7CisJCQlicmVhazsKKworCQljYXNlIFNFTlNPUl9MT05HOgorCQkJZGF0YVswXSA9IGluaXRfczVrODNhW2ldWzJdOworCQkJZGF0YVsxXSA9IGluaXRfczVrODNhW2ldWzNdOworCQkJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwKKwkJCQlpbml0X3M1azgzYVtpXVsxXSwgZGF0YSwgMik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWluZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoZHVtcF9zZW5zb3IpCisJCXM1azgzYV9kdW1wX3JlZ2lzdGVycyhzZCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azgzYV9wb3dlcl9kb3duKHN0cnVjdCBzZCAqc2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgczVrODNhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCit7CisJaW50IGFkZHJlc3M7CisJdTggcGFnZSwgb2xkX3BhZ2U7CisJczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgeworCQlzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZwYWdlLCAxKTsKKwkJaW5mbygiRHVtcGluZyB0aGUgczVrODNhIHJlZ2lzdGVyIHN0YXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKKwkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKKwkJCXU4IHZhbCA9IDA7CisJCQlzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWwsIDEpOworCQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKKwkJCSAgICAgYWRkcmVzcywgdmFsKTsKKwkJfQorCX0KKwlpbmZvKCJzNWs4M2EgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCisJZm9yIChwYWdlID0gMDsgcGFnZSA8IDE2OyBwYWdlKyspIHsKKwkJczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7CisJCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlICIKKwkJICAgICAgImZvciBwYWdlIDB4JXgiLCBwYWdlKTsKKwkJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8PSAweGZmOyBhZGRyZXNzKyspIHsKKwkJCXU4IG9sZF92YWwsIGN0cmxfdmFsLCB0ZXN0X3ZhbCA9IDB4ZmY7CisKKwkJCXM1azgzYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWwsIDEpOworCQkJczVrODNhX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJnRlc3RfdmFsLCAxKTsKKwkJCXM1azgzYV9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsLCAxKTsKKworCQkJaWYgKGN0cmxfdmFsID09IHRlc3RfdmFsKQorCQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CisJCQllbHNlCisJCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKKworCQkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWwgKi8KKwkJCXM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsLCAxKTsKKwkJfQorCX0KKwlpbmZvKCJSZWFkL3dyaXRlIHJlZ2lzdGVyIHByb2JpbmcgY29tcGxldGUiKTsKKwlzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7Cit9CisKK2ludCBzNWs4M2FfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQoreworCWludCBlcnI7CisJdTggZGF0YVsyXTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwllcnIgPSBzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9CUklHSFRORVNTLCBkYXRhLCAyKTsKKwlkYXRhWzFdID0gZGF0YVsxXSA8PCAxOworCSp2YWwgPSBkYXRhWzFdOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2Ffc2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhWzJdOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWRhdGFbMF0gPSAweDAwOworCWRhdGFbMV0gPSAweDIwOworCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIDB4MTQsIGRhdGEsIDIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZGF0YVswXSA9IDB4MDE7CisJZGF0YVsxXSA9IDB4MDA7CisJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgMHgwZCwgZGF0YSwgMik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBGSVhNRTogVGhpcyBpcyBub3Qgc2FuZSwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb21wb3NpdGlvbgorCQkgIG9mIHRoZXNlIHJlZ2lzdGVycyAqLworCWRhdGFbMF0gPSB2YWwgPj4gMzsgLyogYnJpZ2h0bmVzcywgaGlnaCA1IGJpdHMgKi8KKwlkYXRhWzFdID0gdmFsID4+IDE7IC8qIGJyaWdodG5lc3MsIGhpZ2ggNyBiaXRzICovCisJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX0JSSUdIVE5FU1MsIGRhdGEsIDIpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2FfZ2V0X3doaXRlbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWVyciA9IHM1azgzYV9yZWFkX3NlbnNvcihzZCwgUzVLODNBX1dISVRFTkVTUywgJmRhdGEsIDEpOworCisJKnZhbCA9IGRhdGE7CisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2Ffc2V0X3doaXRlbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGRhdGFbMV07CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZGF0YVswXSA9IHZhbDsKKwllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfV0hJVEVORVNTLCBkYXRhLCAxKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgczVrODNhX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGRhdGFbMl07CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZXJyID0gczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfR0FJTiwgZGF0YSwgMik7CisKKwlkYXRhWzFdID0gZGF0YVsxXSAmIDB4M2Y7CisJaWYgKGRhdGFbMV0gPiBTNUs4M0FfTUFYSU1VTV9HQUlOKQorCQlkYXRhWzFdID0gUzVLODNBX01BWElNVU1fR0FJTjsKKworCSp2YWwgPSBkYXRhWzFdOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2Ffc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhWzJdOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWRhdGFbMF0gPSAwOworCWRhdGFbMV0gPSB2YWw7CisJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX0dBSU4sIGRhdGEsIDIpOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2FfZ2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlpbnQgZXJyOworCXU4IGRhdGFbMV07CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJZGF0YVswXSA9IDB4MDU7CisJZXJyID0gczVrODNhX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCBkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHM1azgzYV9yZWFkX3NlbnNvcihzZCwgUzVLODNBX0ZMSVAsIGRhdGEsIDEpOworCSp2YWwgPSAoZGF0YVswXSB8IDB4NDApID8gMSA6IDA7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworaW50IHM1azgzYV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhWzFdOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWRhdGFbMF0gPSAweDA1OworCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9QQUdFX01BUCwgZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIHNldCBvciB6ZXJvIHNpeCBiaXQsIHNldmVuIGlzIGhmbGlwICovCisJZGF0YVswXSA9ICh2YWwpID8gKGRhdGFbMF0gJiAweDgwKSB8IDB4NDAgfCBTNUs4M0FfRkxJUF9NQVNLCisJCQk6IChkYXRhWzBdICYgMHg4MCkgfCBTNUs4M0FfRkxJUF9NQVNLOworCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWRhdGFbMF0gPSAodmFsKSA/IDB4MGIgOiAweDBhOworCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9WRkxJUF9UVU5FLCBkYXRhLCAxKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitpbnQgczVrODNhX2dldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCit7CisJaW50IGVycjsKKwl1OCBkYXRhWzFdOworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWRhdGFbMF0gPSAweDA1OworCWVyciA9IHM1azgzYV93cml0ZV9zZW5zb3Ioc2QsIFM1SzgzQV9QQUdFX01BUCwgZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzNWs4M2FfcmVhZF9zZW5zb3Ioc2QsIFM1SzgzQV9GTElQLCBkYXRhLCAxKTsKKwkqdmFsID0gKGRhdGFbMF0gfCAweDgwKSA/IDEgOiAwOworCisJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7Cit9CisKK2ludCBzNWs4M2Ffc2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQoreworCWludCBlcnI7CisJdTggZGF0YVsxXTsKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlkYXRhWzBdID0gMHgwNTsKKwllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsIGRhdGEsIDEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gczVrODNhX3JlYWRfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBzZXQgb3IgemVybyBzZXZlbiBiaXQsIHNpeCBpcyB2ZmxpcCAqLworCWRhdGFbMF0gPSAodmFsKSA/IChkYXRhWzBdICYgMHg0MCkgfCAweDgwIHwgUzVLODNBX0ZMSVBfTUFTSworCQkJOiAoZGF0YVswXSAmIDB4NDApIHwgUzVLODNBX0ZMSVBfTUFTSzsKKwllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfRkxJUCwgZGF0YSwgMSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlkYXRhWzBdID0gKHZhbCkgPyAweDBhIDogMHgwYjsKKwllcnIgPSBzNWs4M2Ffd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfSEZMSVBfVFVORSwgZGF0YSwgMSk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzcwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5oCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgczVrODNhIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBFcmlrIEFuZHJlbgorICogQ29weXJpZ2h0IChDKSAyMDA3IElseWVzIEdvdXRhLiBCYXNlZCBvbiB0aGUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0LgorICogQ29weXJpZ2h0IChDKSAyMDA1IG01NjAzeCBMaW51eCBEcml2ZXIgUHJvamVjdCA8bTU2MDJAeDNuZy5jb20uYnI+CisgKgorICogUG9ydGlvbnMgb2YgY29kZSB0byBVU0IgaW50ZXJmYWNlIGFuZCBBTGkgZHJpdmVyIHNvZnR3YXJlLAorICogQ29weXJpZ2h0IChjKSAyMDA2IFdpbGxlbSBEdWlua2VyCisgKiB2NGwyIGludGVyZmFjZSBtb2RlbGVkIGFmdGVyIHRoZSBWNEwyIGRyaXZlcgorICogZm9yIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpZm5kZWYgTTU2MDJfUzVLODNBX0hfCisjZGVmaW5lIE01NjAyX1M1SzgzQV9IXworCisjaW5jbHVkZSAibTU2MDJfc2Vuc29yLmgiCisKKyNkZWZpbmUgUzVLODNBX0ZMSVAJCQkJMHgwMQorI2RlZmluZSBTNUs4M0FfSEZMSVBfVFVORQkJMHgwMworI2RlZmluZSBTNUs4M0FfVkZMSVBfVFVORQkJMHgwNQorI2RlZmluZSBTNUs4M0FfV0hJVEVORVNTCQkweDBhCisjZGVmaW5lIFM1SzgzQV9HQUlOCQkJCTB4MTgKKyNkZWZpbmUgUzVLODNBX0JSSUdIVE5FU1MJCTB4MWIKKyNkZWZpbmUgUzVLODNBX1BBR0VfTUFQCQkJMHhlYworCisjZGVmaW5lIFM1SzgzQV9ERUZBVUxUX0JSSUdIVE5FU1MJMHg3MQorI2RlZmluZSBTNUs4M0FfREVGQVVMVF9XSElURU5FU1MJMHg3ZQorI2RlZmluZSBTNUs4M0FfREVGQVVMVF9HQUlOCQkJMHgwMAorI2RlZmluZSBTNUs4M0FfTUFYSU1VTV9HQUlOCQkJMHgzYworI2RlZmluZSBTNUs4M0FfRkxJUF9NQVNLCQkJMHgxMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogS2VybmVsIG1vZHVsZSBwYXJhbWV0ZXJzICovCitleHRlcm4gaW50IGZvcmNlX3NlbnNvcjsKK2V4dGVybiBpbnQgZHVtcF9zZW5zb3I7CitleHRlcm4gdW5zaWduZWQgaW50IG01NjAyX2RlYnVnOworCisKK2ludCBzNWs4M2FfcHJvYmUoc3RydWN0IHNkICpzZCk7CitpbnQgczVrODNhX2luaXQoc3RydWN0IHNkICpzZCk7CitpbnQgczVrODNhX3Bvd2VyX2Rvd24oc3RydWN0IHNkICpzZCk7CisKK3ZvaWQgczVrODNhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpOworCitpbnQgczVrODNhX3JlYWRfc2Vuc29yKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJCSAgICAgICB1OCAqaTJjX2RhdGEsIGNvbnN0IHU4IGxlbik7CitpbnQgczVrODNhX3dyaXRlX3NlbnNvcihzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCQkJdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOworCitpbnQgczVrODNhX3NldF9icmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBzNWs4M2FfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBzNWs4M2Ffc2V0X3doaXRlbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitpbnQgczVrODNhX2dldF93aGl0ZW5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBzNWs4M2Ffc2V0X2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOworaW50IHM1azgzYV9nZXRfZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworaW50IHM1azgzYV9nZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKK2ludCBzNWs4M2Ffc2V0X3ZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKK2ludCBzNWs4M2FfZ2V0X2hmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CitpbnQgczVrODNhX3NldF9oZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CisKKworc3RhdGljIHN0cnVjdCBtNTYwMl9zZW5zb3IgczVrODNhID0geworCS5uYW1lID0gIlM1SzgzQSIsCisJLnByb2JlID0gczVrODNhX3Byb2JlLAorCS5pbml0ID0gczVrODNhX2luaXQsCisJLnBvd2VyX2Rvd24gPSBzNWs4M2FfcG93ZXJfZG93biwKKwkucmVhZF9zZW5zb3IgPSBzNWs4M2FfcmVhZF9zZW5zb3IsCisJLndyaXRlX3NlbnNvciA9IHM1azgzYV93cml0ZV9zZW5zb3IsCisJLmkyY19zbGF2ZV9pZCA9IDB4NWEsCisJLm5jdHJscyA9IDUsCisJLmN0cmxzID0geworCXsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJyaWdodG5lc3MiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSBTNUs4M0FfREVGQVVMVF9CUklHSFRORVNTLAorCQkJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSCisJCX0sCisJCQkuc2V0ID0gczVrODNhX3NldF9icmlnaHRuZXNzLAorCQkJLmdldCA9IHM1azgzYV9nZXRfYnJpZ2h0bmVzcworCisJfSwgeworCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9XSElURU5FU1MsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJ3aGl0ZW5lc3MiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweGZmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSBTNUs4M0FfREVGQVVMVF9XSElURU5FU1MsCisJCQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJCS5zZXQgPSBzNWs4M2Ffc2V0X3doaXRlbmVzcywKKwkJCS5nZXQgPSBzNWs4M2FfZ2V0X3doaXRlbmVzcywKKwl9LCB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnYWluIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gUzVLODNBX01BWElNVU1fR0FJTiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gUzVLODNBX0RFRkFVTFRfR0FJTiwKKwkJCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkJLnNldCA9IHM1azgzYV9zZXRfZ2FpbiwKKwkJCS5nZXQgPSBzNWs4M2FfZ2V0X2dhaW4KKwl9LCB7CisJCXsKKwkJCS5pZCAgICAgICAgID0gVjRMMl9DSURfSEZMSVAsCisJCQkudHlwZSAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSAgICAgICA9ICJob3Jpem9udGFsIGZsaXAiLAorCQkJLm1pbmltdW0gICAgPSAwLAorCQkJLm1heGltdW0gICAgPSAxLAorCQkJLnN0ZXAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgID0gMAorCQl9LAorCQkJLnNldCA9IHM1azgzYV9zZXRfaGZsaXAsCisJCQkuZ2V0ID0gczVrODNhX2dldF9oZmxpcAorCX0sIHsKKwkJeworCQkgLmlkICAgICAgICAgPSBWNEwyX0NJRF9WRkxJUCwKKwkJLnR5cGUgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSAgICAgICA9ICJ2ZXJ0aWNhbCBmbGlwIiwKKwkJLm1pbmltdW0gICAgPSAwLAorCQkubWF4aW11bSAgICA9IDEsCisJCS5zdGVwICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgID0gMAorCQl9LAorCQkuc2V0ID0gczVrODNhX3NldF92ZmxpcCwKKwkJLmdldCA9IHM1azgzYV9nZXRfdmZsaXAKKwkJfQorCX0sCisJLm5tb2RlcyA9IDEsCisJLm1vZGVzID0geworCXsKKwkJTTU2MDJfREVGQVVMVF9GUkFNRV9XSURUSCwKKwkJTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQsCisJCVY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCVY0TDJfRklFTERfTk9ORSwKKwkJLnNpemVpbWFnZSA9CisJCQlNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRIICogTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQsCisJCS5ieXRlc3BlcmxpbmUgPSBNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRILAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCQkucHJpdiA9IDEKKwl9CisJfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHJlaW5pdF9zNWs4M2FbXVs0XSA9Cit7CisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19ESVYsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDBkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfQ1RSTCwgMHgwMCwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgxZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MDgsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgzZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgzZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweGZmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9MLCAweGZmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9MLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweDgwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9BRENfQ1RSTCwgMHhjMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOU09SX1RZUEUsIDB4MDksIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfRElWLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4ZjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDFkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgxYywgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0kyQ19DTEtfRElWLCAweDIwLCAweDAwfSwKKworCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwMCwgMHgwMH0KK307CisKKy8qIFRoaXMgY291bGQgcHJvYmFibHkgYmUgY29uc2lkZXJhYmx5IHNob3J0ZW5lZC4KKyAgIEkgZG9uJ3QgaGF2ZSB0aGUgaGFyZHdhcmUgdG8gZXhwZXJpbWVudCB3aXRoIGl0LCBwYXRjaGVzIHdlbGNvbWUKKyovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0X3M1azgzYVtdWzRdID0KK3sKKwl7U0VOU09SLCBTNUs4M0FfUEFHRV9NQVAsIDB4MDQsIDB4MDB9LAorCXtTRU5TT1IsIDB4YWYsIDB4MDEsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg3YiwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKwl7U0VOU09SLCAweDAxLCAweDUwLCAweDAwfSwKKwl7U0VOU09SLCAweDEyLCAweDIwLCAweDAwfSwKKwl7U0VOU09SLCAweDE3LCAweDQwLCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfQlJJR0hUTkVTUywgMHgwZiwgMHgwMH0sCisJe1NFTlNPUiwgMHgxYywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwMiwgMHg3MCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwMywgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNCwgMHhmMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNSwgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9QSVhfT0ZfTElORV9ILCAweDgyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGU0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDg3LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKworCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwNSwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNiwgMHg3MSwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNywgMHhlOCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwOCwgMHgwMiwgMHgwMH0sCisJe1NFTlNPUiwgMHgwOSwgMHg4OCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxNCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxNSwgMHgyMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxOSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxYSwgMHg5OCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwZiwgMHgwMiwgMHgwMH0sCisJe1NFTlNPUiwgMHgxMCwgMHhlNSwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKwl7U0VOU09SX0xPTkcsIDB4MTQsIDB4MDAsIDB4MjB9LAorCXtTRU5TT1JfTE9ORywgMHgwZCwgMHgwMCwgMHg3ZH0sCisJe1NFTlNPUl9MT05HLCAweDFiLCAweDBkLCAweDA1fSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9QSVhfT0ZfTElORV9ILCAweDgyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGU0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDg3LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSLCAweDFkLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVCwgMHgwOCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9ILCAweDNmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUl9ILCAweDNmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RBVF9ILCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0wsIDB4ZmYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0wsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4ODAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19ESVYsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX01DVV9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhmMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MWQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDFjLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4MDYsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfSTJDX0NMS19ESVYsIDB4MjAsIDB4MDB9LAorCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA0LCAweDAwfSwKKwl7U0VOU09SLCAweGFmLCAweDAxLCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfUEFHRV9NQVAsIDB4MDUsIDB4MDB9LAorCS8qIGZmICggaW5pdCB2YWx1ZSApaXMgdmVyeSBkYXJrKSB8fCA3MSBhbmQgZjAgYmV0dGVyICovCisJe1NFTlNPUiwgMHg3YiwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKwl7U0VOU09SLCAweDAxLCAweDUwLCAweDAwfSwKKwl7U0VOU09SLCAweDEyLCAweDIwLCAweDAwfSwKKwl7U0VOU09SLCAweDE3LCAweDQwLCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfQlJJR0hUTkVTUywgMHgwZiwgMHgwMH0sCisJe1NFTlNPUiwgMHgxYywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwMiwgMHg3MCwgMHgwMH0sCisJLyogc29tZSB2YWx1ZXMgbGlrZSAweDEwIGdpdmUgYSBibHVlLXB1cnBsZSBpbWFnZSAqLworCXtTRU5TT1IsIDB4MDMsIDB4MGIsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDQsIDB4ZjAsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDUsIDB4MGIsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwNSwgMHgwMH0sCisKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwNiwgMHgwMH0sCisJLyogdW5kZXIgODAgZG9uJ3Qgd29yaywgaGlnaHRlciBkZXBlbmQgb24gdmFsdWUgKi8KKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9MSU5FX09GX0ZSQU1FX0gsIDB4ODEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1BJWF9PRl9MSU5FX0gsIDB4ODIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDEsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4ZTQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1ZTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NJR19JTkksIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4MDIsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0hTWU5DX1BBUkEsIDB4N2YsIDB4MDB9LAorCisJe0JSSURHRSwgTTU2MDJfWEJfU0lHX0lOSSwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisKKwl7U0VOU09SLCBTNUs4M0FfUEFHRV9NQVAsIDB4MDUsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDYsIDB4NzEsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDcsIDB4ZTgsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDgsIDB4MDIsIDB4MDB9LAorCXtTRU5TT1IsIDB4MDksIDB4ODgsIDB4MDB9LAorCXtTRU5TT1IsIDB4MTQsIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4MTUsIDB4MjAsIDB4MDB9LAorCXtTRU5TT1IsIDB4MTksIDB4MDAsIDB4MDB9LAorCXtTRU5TT1IsIDB4MWEsIDB4OTgsIDB4MDB9LAorCXtTRU5TT1IsIDB4MGYsIDB4MDIsIDB4MDB9LAorCXtTRU5TT1IsIDB4MTAsIDB4ZTUsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwNSwgMHgwMH0sCisJe1NFTlNPUl9MT05HLCAweDE0LCAweDAwLCAweDIwfSwKKwl7U0VOU09SX0xPTkcsIDB4MGQsIDB4MDAsIDB4N2R9LAorCXtTRU5TT1JfTE9ORywgMHgxYiwgMHgwZCwgMHgwNX0sCisKKwkvKiBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHVzZWxlc3MgYWZ0ZXIgYSBjbGVhbiBib290CisJICAgYnV0IGlzIG5lY2Vzc2FyeSBhZnRlciByZXN1bWUgZnJvbSBzdXNwZW5kICovCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVIsIDB4MWQsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFULCAweDA4LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0VOX0gsIDB4M2YsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRElSX0gsIDB4M2YsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fREFUX0gsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfTCwgMHhmZiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfTCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHg4MCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19ESVYsIDB4MDAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfQ1RSTCwgMHhiMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfQURDX0NUUkwsIDB4YzAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX1NFTlNPUl9UWVBFLCAweDA5LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9NQ1VfQ0xLX0RJViwgMHgwMiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTUNVX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGYwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9HUElPX0RJUiwgMHgxZCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVQsIDB4MWMsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0dQSU9fRU5fSCwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19ESVJfSCwgMHgwNiwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19EQVRfSCwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfR1BJT19FTl9MLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9JMkNfQ0xLX0RJViwgMHgyMCwgMHgwMH0sCisKKwl7U0VOU09SLCBTNUs4M0FfUEFHRV9NQVAsIDB4MDQsIDB4MDB9LAorCXtTRU5TT1IsIDB4YWYsIDB4MDEsIDB4MDB9LAorCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHg3YiwgMHhmZiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKwl7U0VOU09SLCAweDAxLCAweDUwLCAweDAwfSwKKwl7U0VOU09SLCAweDEyLCAweDIwLCAweDAwfSwKKwl7U0VOU09SLCAweDE3LCAweDQwLCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfQlJJR0hUTkVTUywgMHgwZiwgMHgwMH0sCisJe1NFTlNPUiwgMHgxYywgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwMiwgMHg3MCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwMywgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNCwgMHhmMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNSwgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1BBR0VfTUFQLCAweDA1LCAweDAwfSwKKworCXtCUklER0UsIE01NjAyX1hCX1NFTl9DTEtfRElWLCAweDA2LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0NUUkwsIDB4YjAsIDB4MDB9LAorCXtCUklER0UsIE01NjAyX1hCX0FEQ19DVFJMLCAweGMwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5TT1JfVFlQRSwgMHgwOSwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfTElORV9PRl9GUkFNRV9ILCAweDgxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9QSVhfT0ZfTElORV9ILCAweDgyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAxLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweGU0LCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9WU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDAyLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9IU1lOQ19QQVJBLCAweDdmLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TSUdfSU5JLCAweDAwLCAweDAwfSwKKwl7QlJJREdFLCBNNTYwMl9YQl9TRU5fQ0xLX0RJViwgMHgwMCwgMHgwMH0sCisJe0JSSURHRSwgTTU2MDJfWEJfU0VOX0NMS19DVFJMLCAweGIwLCAweDAwfSwKKworCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwNSwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNiwgMHg3MSwgMHgwMH0sCisJe1NFTlNPUiwgMHgwNywgMHhlOCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwOCwgMHgwMiwgMHgwMH0sCisJe1NFTlNPUiwgMHgwOSwgMHg4OCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxNCwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxNSwgMHgyMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxOSwgMHgwMCwgMHgwMH0sCisJe1NFTlNPUiwgMHgxYSwgMHg5OCwgMHgwMH0sCisJe1NFTlNPUiwgMHgwZiwgMHgwMiwgMHgwMH0sCisKKwl7U0VOU09SLCAweDEwLCAweGU1LCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfUEFHRV9NQVAsIDB4MDUsIDB4MDB9LAorCXtTRU5TT1JfTE9ORywgMHgxNCwgMHgwMCwgMHgyMH0sCisJe1NFTlNPUl9MT05HLCAweDBkLCAweDAwLCAweDdkfSwKKwl7U0VOU09SX0xPTkcsIDB4MWIsIDB4MGQsIDB4MDV9LAorCisJLyogbm9ybWFsIGNvbG9ycworCSAgICh0aGlzIGlzIHZhbHVlIGFmdGVyIGJvb3QsIGJ1dCBhZnRlciB0cmllcyBjYW4gYmUgZGlmZmVyZW50KSAqLworCXtTRU5TT1IsIDB4MDAsIDB4MDYsIDB4MDB9LAorCisJLyogc2V0IGRlZmF1bHQgYnJpZ2h0bmVzcyAqLworCXtTRU5TT1JfTE9ORywgMHgxNCwgMHgwMCwgMHgyMH0sCisJe1NFTlNPUl9MT05HLCAweDBkLCAweDAxLCAweDAwfSwKKwl7U0VOU09SX0xPTkcsIDB4MWIsIFM1SzgzQV9ERUZBVUxUX0JSSUdIVE5FU1MgPj4gMywKKwkJCSAgICBTNUs4M0FfREVGQVVMVF9CUklHSFRORVNTID4+IDF9LAorCisJLyogc2V0IGRlZmF1bHQgd2hpdGVuZXNzICovCisJe1NFTlNPUiwgUzVLODNBX1dISVRFTkVTUywgUzVLODNBX0RFRkFVTFRfV0hJVEVORVNTLCAweDAwfSwKKworCS8qIHNldCBkZWZhdWx0IGdhaW4gKi8KKwl7U0VOU09SX0xPTkcsIDB4MTgsIDB4MDAsIFM1SzgzQV9ERUZBVUxUX0dBSU59LAorCisJLyogc2V0IGRlZmF1bHQgZmxpcCAqLworCXtTRU5TT1IsIFM1SzgzQV9QQUdFX01BUCwgMHgwNSwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX0ZMSVAsIDB4MDAgfCBTNUs4M0FfRkxJUF9NQVNLLCAweDAwfSwKKwl7U0VOU09SLCBTNUs4M0FfSEZMSVBfVFVORSwgMHgwYiwgMHgwMH0sCisJe1NFTlNPUiwgUzVLODNBX1ZGTElQX1RVTkUsIDB4MGEsIDB4MDB9CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zZW5zb3IuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfc2Vuc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwZmNhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfc2Vuc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIFVTQiBEcml2ZXIgZm9yIEFMaSBtNTYwMiBiYXNlZCB3ZWJjYW1zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVyaWsgQW5kcmVuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSWx5ZXMgR291dGEuIEJhc2VkIG9uIHRoZSBtNTYwM3ggTGludXggRHJpdmVyIFByb2plY3QuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgbTU2MDN4IExpbnV4IERyaXZlciBQcm9qZWN0IDxtNTYwMkB4M25nLmNvbS5icj4KKyAqCisgKiBQb3J0aW9ucyBvZiBjb2RlIHRvIFVTQiBpbnRlcmZhY2UgYW5kIEFMaSBkcml2ZXIgc29mdHdhcmUsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgV2lsbGVtIER1aW5rZXIKKyAqIHY0bDIgaW50ZXJmYWNlIG1vZGVsZWQgYWZ0ZXIgdGhlIFY0TDIgZHJpdmVyCisgKiBmb3IgU045QzEweCBQQyBDYW1lcmEgQ29udHJvbGxlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2lmbmRlZiBNNTYwMl9TRU5TT1JfSF8KKyNkZWZpbmUgTTU2MDJfU0VOU09SX0hfCisKKyNpbmNsdWRlICJtNTYwMl9icmlkZ2UuaCIKKworI2RlZmluZSBNNTYwMl9ERUZBVUxUX0ZSQU1FX1dJRFRIICA2NDAKKyNkZWZpbmUgTTU2MDJfREVGQVVMVF9GUkFNRV9IRUlHSFQgNDgwCisKKyNkZWZpbmUgTTU2MDJfTUFYX0NUUkxTCQkoVjRMMl9DSURfTEFTVFAxIC0gVjRMMl9DSURfQkFTRSArIDEwKQorCisvKiBFbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQgc2Vuc29ycyAqLworZW51bSBzZW5zb3JzIHsKKwlPVjk2NTBfU0VOU09SCT0gMSwKKwlTNUs4M0FfU0VOU09SCT0gMiwKKwlTNUs0QUFfU0VOU09SCT0gMywKKwlNVDlNMTExX1NFTlNPUgk9IDQsCisJUE8xMDMwX1NFTlNPUgk9IDUKK307CisKKy8qIEVudW1lcmF0ZXMgYWxsIHBvc3NpYmxlIGluc3RydWN0aW9uIHR5cGVzICovCitlbnVtIGluc3RydWN0aW9uIHsKKwlCUklER0UsCisJU0VOU09SLAorCVNFTlNPUl9MT05HCit9OworCitzdHJ1Y3QgbTU2MDJfc2Vuc29yIHsKKwkvKiBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgc2Vuc29yICovCisJY2hhciBuYW1lWzMyXTsKKworCS8qIFdoYXQgaTJjIGFkZHJlc3MgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQgdG8gKi8KKwl1OCBpMmNfc2xhdmVfaWQ7CisKKwkvKiBQcm9iZXMgaWYgdGhlIHNlbnNvciBpcyBjb25uZWN0ZWQgKi8KKwlpbnQgKCpwcm9iZSkoc3RydWN0IHNkICpzZCk7CisKKwkvKiBQZXJmb3JtcyBhIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlICovCisJaW50ICgqaW5pdCkoc3RydWN0IHNkICpzZCk7CisKKwkvKiBQZXJmb3JtcyBhIHBvd2VyIGRvd24gc2VxdWVuY2UgKi8KKwlpbnQgKCpwb3dlcl9kb3duKShzdHJ1Y3Qgc2QgKnNkKTsKKworCS8qIFJlYWRzIGEgc2Vuc29yIHJlZ2lzdGVyICovCisJaW50ICgqcmVhZF9zZW5zb3IpKHN0cnVjdCBzZCAqc2QsIGNvbnN0IHU4IGFkZHJlc3MsCisJICAgICAgdTggKmkyY19kYXRhLCBjb25zdCB1OCBsZW4pOworCisJLyogV3JpdGVzIHRvIGEgc2Vuc29yIHJlZ2lzdGVyICovCisJaW50ICgqd3JpdGVfc2Vuc29yKShzdHJ1Y3Qgc2QgKnNkLCBjb25zdCB1OCBhZGRyZXNzLAorCSAgICAgIHU4ICppMmNfZGF0YSwgY29uc3QgdTggbGVuKTsKKworCWludCBuY3RybHM7CisJc3RydWN0IGN0cmwgY3RybHNbTTU2MDJfTUFYX0NUUkxTXTsKKworCWNoYXIgbm1vZGVzOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgbW9kZXNbXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tYXJzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYwppbmRleCA0ZDVkYjQ3Li4yNzdjYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCWludCBlcnJfY29kZTsKIAlfX3U4ICpkYXRhOwpAQCAtMTQzLDkgKzE0MywxMCBAQAogCWludCBpbnRwaXBlOwogCiAJUERFQlVHKERfU1RSRUFNLCAiY2FtZXJhIHN0YXJ0LCBpZmFjZSAlZCwgYWx0IDgiLCBnc3BjYV9kZXYtPmlmYWNlKTsKLQlpZiAodXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsIDgpIDwgMCkgeworCWVycl9jb2RlID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsIDgpOworCWlmIChlcnJfY29kZSA8IDApIHsKIAkJUERFQlVHKERfRVJSfERfU1RSRUFNLCAiU2V0IHBhY2tldCBzaXplOiBzZXQgaW50ZXJmYWNlIGVycm9yIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGVycl9jb2RlOwogCX0KIAogCWRhdGEgPSBnc3BjYV9kZXYtPnVzYl9idWY7CkBAIC0xNTQsNyArMTU1LDcgQEAKIAogCWVycl9jb2RlID0gcmVnX3coZ3NwY2FfZGV2LCBkYXRhWzBdLCAyKTsKIAlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiBlcnJfY29kZTsKIAogCS8qCiAJICAgSW5pdGlhbGl6ZSB0aGUgTVI5NzExMyBjaGlwIHJlZ2lzdGVyCkBAIC0xODAsMTQgKzE4MSwxNCBAQAogCiAJZXJyX2NvZGUgPSByZWdfdyhnc3BjYV9kZXYsIGRhdGFbMF0sIDExKTsKIAlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiBlcnJfY29kZTsKIAogCWRhdGFbMF0gPSAweDIzOwkJLyogYWRkcmVzcyAqLwogCWRhdGFbMV0gPSAweDA5OwkJLyogcmVnIDM1LCBhcHBlbmQgZnJhbWUgaGVhZGVyICovCiAKIAllcnJfY29kZSA9IHJlZ193KGdzcGNhX2RldiwgZGF0YVswXSwgMik7CiAJaWYgKGVycl9jb2RlIDwgMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gZXJyX2NvZGU7CiAKIAlkYXRhWzBdID0gMHgzYzsJCS8qIGFkZHJlc3MgKi8KIC8qCWlmIChnc3BjYV9kZXYtPndpZHRoID09IDEyODApICovCkBAIC0xOTgsNyArMTk5LDcgQEAKIAkJCQkgKgkodW5pdDogNEtCKSAyMDBLQiAqLwogCWVycl9jb2RlID0gcmVnX3coZ3NwY2FfZGV2LCBkYXRhWzBdLCAyKTsKIAlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiBlcnJfY29kZTsKIAogCWlmICgwKSB7CQkJLyogZml4ZWQgZGFyay1nYWluICovCiAJCWRhdGFbMV0gPSAwOwkJLyogcmVnIDk0LCBZIEdhaW4gKDEuNzUpICovCkBAIC0yNDAsMTMgKzI0MSwxMyBAQAogCiAJZXJyX2NvZGUgPSByZWdfdyhnc3BjYV9kZXYsIGRhdGFbMF0sIDYpOwogCWlmIChlcnJfY29kZSA8IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIGVycl9jb2RlOwogCiAJZGF0YVswXSA9IDB4Njc7CiAJZGF0YVsxXSA9IDB4MTM7CQkvKiByZWcgMTAzLCBmaXJzdCBwaXhlbCBCLCBkaXNhYmxlIHNoYXJwbmVzcyAqLwogCWVycl9jb2RlID0gcmVnX3coZ3NwY2FfZGV2LCBkYXRhWzBdLCAyKTsKIAlpZiAoZXJyX2NvZGUgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiBlcnJfY29kZTsKIAogCS8qCiAJICogaW5pdGlhbGl6ZSB0aGUgdmFsdWUgb2YgTUkgc2Vuc29yLi4uCkBAIC0zMjYsNiArMzI3LDcgQEAKIAlkYXRhWzBdID0gMHgwMDsKIAlkYXRhWzFdID0gMHg0ZDsJCS8qIElTT0MgdHJhbnNmZXJpbmcgZW5hYmxlLi4uICovCiAJcmVnX3coZ3NwY2FfZGV2LCBkYXRhWzBdLCAyKTsKKwlyZXR1cm4gZXJyX2NvZGU7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYwppbmRleCA0ZGY0ZWVjLi5jYTY3MTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCkBAIC0xODU0LDcgKzE4NTQsNyBAQAogfQogCiAvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCi1zdGF0aWMgdm9pZCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJaW50IHJldDsKQEAgLTE4NzEsOSArMTg3MSwxMCBAQAogCQlnb3RvIG91dDsKIAlQREVCVUcoRF9TVFJFQU0sICJjYW1lcmEgc3RhcnRlZCBhbHQ6IDB4JTAyeCIsIGdzcGNhX2Rldi0+YWx0KTsKIAlvdjUxeF9sZWRfY29udHJvbChzZCwgMSk7Ci0JcmV0dXJuOworCXJldHVybiAwOwogb3V0OgogCVBERUJVRyhEX0VSUiwgImNhbWVyYSBzdGFydCBlcnJvcjolZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMKaW5kZXggODNiNWY3NC4uMGIwYzU3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jCkBAIC0yODEsNyArMjgxLDcgQEAKIH0KIAogLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLwotc3RhdGljIHZvaWQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCV9fdTggbW9kZTsKQEAgLTMyMyw2ICszMjMsNyBAQAogCXNkLT5zb2ZfcmVhZCA9IDA7CiAJc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPSAwOwogCWF0b21pY19zZXQoJnNkLT5hdmdfbHVtLCAtMSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTUzNCw2ICs1MzUsNyBAQAogCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNDcwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI0NzEpfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjQ3Mil9LAorCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNDc2KX0sCiAJe1VTQl9ERVZJQ0UoMHgyMDAxLCAweGYxMTUpfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKaW5kZXggZDRiZTUxOC4uZTVmZjlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKQEAgLTY3NSw3ICs2NzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKQEAgLTcyNCw2ICs3MjQsNyBAQAogCQlyZWdfdyhnc3BjYV9kZXYsIDB4NzgsIDB4MDEpOwogCWVsc2UKIAkJcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDA1KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMTA2Myw2ICsxMDY0LDcgQEAKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyMSksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9QQUM3MzAyfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyNCksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9QQUM3MzAyfSwKIAl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyNiksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9QQUM3MzAyfSwKKwl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyYSksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9QQUM3MzAyfSwKIAl7fQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkZXZpY2VfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhiLmMKaW5kZXggNWRkNzhjNi4uNmM2OWJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4Yi5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CiAJezE2MCwgMTIwLCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCiAJCS5ieXRlc3BlcmxpbmUgPSAxNjAsCi0JCS5zaXplaW1hZ2UgPSAxNjAgKiAxMjAgKiA1IC8gNCwKKwkJLnNpemVpbWFnZSA9IDE2MCAqIDEyMCwKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAkJLnByaXYgPSAyIHwgTU9ERV9SQVd9LAogCXsxNjAsIDEyMCwgVjRMMl9QSVhfRk1UX1NOOUMxMFgsIFY0TDJfRklFTERfTk9ORSwKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQkucHJpdiA9IDEgfCBNT0RFX1JFRFVDRURfU0lGfSwKIAl7MTc2LCAxNDQsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKIAkJLmJ5dGVzcGVybGluZSA9IDE3NiwKLQkJLnNpemVpbWFnZSA9IDE3NiAqIDE0NCAqIDUgLyA0LAorCQkuc2l6ZWltYWdlID0gMTc2ICogMTQ0LAogCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAogCQkucHJpdiA9IDEgfCBNT0RFX1JBV30sCiAJezE3NiwgMTQ0LCBWNEwyX1BJWF9GTVRfU045QzEwWCwgVjRMMl9GSUVMRF9OT05FLApAQCAtNDkwLDcgKzQ5MCw3IEBACiAJezB4MzAsIDB4MTEsIDB4MDIsIDB4MjAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MTB9LAogfTsKIAotc3RydWN0IHNlbnNvcl9kYXRhIHNlbnNvcl9kYXRhW10gPSB7CitzdGF0aWMgc3RydWN0IHNlbnNvcl9kYXRhIHNlbnNvcl9kYXRhW10gPSB7CiBTRU5TKGluaXRIdjcxMzEsIE5VTEwsIGh2NzEzMV9zZW5zb3JfaW5pdCwgTlVMTCwgTlVMTCwgMCwgTk9fRVhQT3xOT19GUkVRLCAwKSwKIFNFTlMoaW5pdE92NjY1MCwgTlVMTCwgb3Y2NjUwX3NlbnNvcl9pbml0LCBOVUxMLCBOVUxMLCBGX0dBSU58Rl9TSUYsIDAsIDB4NjApLAogU0VOUyhpbml0T3Y3NjMwLCBpbml0T3Y3NjMwXzMsIG92NzYzMF9zZW5zb3JfaW5pdCwgTlVMTCwgb3Y3NjMwX3NlbnNvcl9pbml0XzMsCkBAIC04OTIsNyArODkyLDcgQEAKIH0KIAogLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLwotc3RhdGljIHZvaWQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKQEAgLTk3Niw2ICs5NzYsNyBAQAogCXNkLT5mcmFtZXNfdG9fZHJvcCA9IDA7CiAJc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPSAwOwogCWF0b21pY19zZXQoJnNkLT5hdmdfbHVtLCAtMSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCmluZGV4IGQ3NWIxZDIuLjUzY2I4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwpAQCAtMzksNiArMzksNyBAQAogCXVuc2lnbmVkIGNoYXIgY29udHJhc3Q7CiAJdW5zaWduZWQgY2hhciBjb2xvcnM7CiAJdW5zaWduZWQgY2hhciBhdXRvZ2FpbjsKKwlfX3U4IHZmbGlwOwkJCS8qIG92NzYzMCBvbmx5ICovCiAKIAlzaWduZWQgY2hhciBhZ19jbnQ7CiAjZGVmaW5lIEFHX0NOVF9TVEFSVCAxMwpAQCAtNzAsNiArNzEsOCBAQAogc3RhdGljIGludCBzZF9nZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKIHN0YXRpYyBpbnQgc2Rfc2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwogc3RhdGljIGludCBzZF9nZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIGludCBzZF9zZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CitzdGF0aWMgaW50IHNkX2dldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0gewogCXsKQEAgLTEzMSw2ICsxMzQsMjIgQEAKIAkgICAgLnNldCA9IHNkX3NldGF1dG9nYWluLAogCSAgICAuZ2V0ID0gc2RfZ2V0YXV0b2dhaW4sCiAJfSwKKy8qIG92NzYzMCBvbmx5ICovCisjZGVmaW5lIFZGTElQX0lEWCA0CisJeworCSAgICB7CisJCS5pZCAgICAgID0gVjRMMl9DSURfVkZMSVAsCisJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgICAgPSAiVmZsaXAiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgICAgPSAxLAorI2RlZmluZSBWRkxJUF9ERUYgMQorCQkuZGVmYXVsdF92YWx1ZSA9IFZGTElQX0RFRiwKKwkgICAgfSwKKwkgICAgLnNldCA9IHNkX3NldHZmbGlwLAorCSAgICAuZ2V0ID0gc2RfZ2V0dmZsaXAsCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CkBAIC0yNDgsMTAgKzI2NywxMiBAQAogCTB4YTYsIDB4YjIsIDB4YmYsIDB4Y2EsIDB4ZDUsIDB4ZTAsIDB4ZWIsIDB4ZjUsIDB4ZmYKIH07CiAKKy8qIGNvbG9yIG1hdHJpeCBhbmQgb2Zmc2V0cyAqLwogc3RhdGljIGNvbnN0IF9fdTggcmVnODRbXSA9IHsKLQkweDE0LCAweDAwLCAweDI3LCAweDAwLCAweDA3LCAweDAwLCAweGU1LCAweDBmLAotCTB4ZTQsIDB4MGYsIDB4MzgsIDB4MDAsIDB4M2UsIDB4MDAsIDB4YzMsIDB4MGYsCi0JMHhmNywgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMAorCTB4MTQsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MDcsIDB4MDAsCS8qIFlSIFlHIFlCIGdhaW5zICovCisJMHhlOCwgMHgwZiwgMHhkYSwgMHgwZiwgMHg0MCwgMHgwMCwJLyogVVIgVUcgVUIgKi8KKwkweDNlLCAweDAwLCAweGNkLCAweDBmLCAweGY3LCAweDBmLAkvKiBWUiBWRyBWQiAqLworCTB4MDAsIDB4MDAsIDB4MDAJCQkvKiBZVVYgb2Zmc2V0cyAqLwogfTsKIHN0YXRpYyBjb25zdCBfX3U4IGh2NzEzMXJfc2Vuc29yX2luaXRbXVs4XSA9IHsKIAl7MHhDMSwgMHgxMSwgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC00MzQsNyArNDU1LDggQEAKIAl7MHhhMSwgMHgyMSwgMHgxMiwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MjEsIDB4MTIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogLypmaXhtZTogKyAweDEyLCAweDA0Ki8KLQl7MHhhMSwgMHgyMSwgMHg3NSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCisvKgl7MHhhMSwgMHgyMSwgMHg3NSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sICAqIENPTU4KKwkJCQkJCQkgKiBzZXQgYnkgc2V0dmZsaXAgKi8KIAl7MHhhMSwgMHgyMSwgMHgxMCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4YTEsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGIxLCAweDIxLCAweDAxLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDEwfSwKQEAgLTcwNyw2ICs3MjksNyBAQAogCQkJMHgwOCwgMCwJCS8qIHZhbHVlLCBpbmRleCAqLwogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCA4LAogCQkJNTAwKTsKKwltc2xlZXAoMik7CiB9CiAKIC8qIHJlYWQgNSBieXRlcyBpbiBnc3BjYV9kZXYtPnVzYl9idWYgKi8KQEAgLTk0OCw2ICs5NzEsOCBAQAogCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgQVVUT0dBSU5fSURYKTsKIAkJYnJlYWs7CiAJfQorCWlmIChzZC0+c2Vuc29yICE9IFNFTlNPUl9PVjc2MzApCisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgfD0gKDEgPDwgVkZMSVBfSURYKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTc2LDEzICsxMDAxLDEzIEBACiAJY2FzZSBCUklER0VfU045QzEwNToKIAkJaWYgKHJlZ0YxICE9IDB4MTEpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCByZWdHcGlvLCAyKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAxLCByZWdHcGlvLCAyKTsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfU045QzEyMDoKIAkJaWYgKHJlZ0YxICE9IDB4MTIpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJcmVnR3Bpb1sxXSA9IDB4NzA7Ci0JCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgcmVnR3BpbywgMik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgcmVnR3BpbywgMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAvKgljYXNlIEJSSURHRV9TTjlDMTEwOiAqLwpAQCAtMTA3OSwyMCArMTEwNCwxNyBAQAogc3RhdGljIHZvaWQgc2V0YnJpZ2h0Y29udChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCXVuc2lnbmVkIHZhbDsKKwlpbnQgdmFsOwogCV9fdTggcmVnODRfZnVsbFsweDE1XTsKIAotCW1lbXNldChyZWc4NF9mdWxsLCAwLCBzaXplb2YgcmVnODRfZnVsbCk7Ci0JdmFsID0gc2QtPmNvbnRyYXN0ICogMHgyMCAvIENPTlRSQVNUX01BWCArIDB4MTA7CS8qIDEwLi4zMCAqLwotCXJlZzg0X2Z1bGxbMl0gPSB2YWw7Ci0JcmVnODRfZnVsbFswXSA9ICh2YWwgKyAxKSAvIDI7Ci0JcmVnODRfZnVsbFs0XSA9ICh2YWwgKyAxKSAvIDU7Ci0JaWYgKHZhbCA+IEJSSUdIVE5FU1NfREVGKQotCQl2YWwgPSAoc2QtPmJyaWdodG5lc3MgLSBCUklHSFRORVNTX0RFRikgKiAweDIwCisJbWVtY3B5KHJlZzg0X2Z1bGwsIHJlZzg0LCBzaXplb2YgcmVnODRfZnVsbCk7CisJdmFsID0gc2QtPmNvbnRyYXN0ICogMHgzMCAvIENPTlRSQVNUX01BWCArIDB4MTA7CS8qIDEwLi40MCAqLworCXJlZzg0X2Z1bGxbMF0gPSAodmFsICsgMSkgLyAyOwkJLyogcmVkICovCisJcmVnODRfZnVsbFsyXSA9IHZhbDsJCQkvKiBncmVlbiAqLworCXJlZzg0X2Z1bGxbNF0gPSAodmFsICsgMSkgLyA1OwkJLyogYmx1ZSAqLworCXZhbCA9IChzZC0+YnJpZ2h0bmVzcyAtIEJSSUdIVE5FU1NfREVGKSAqIDB4MTAKIAkJCS8gQlJJR0hUTkVTU19NQVg7Ci0JZWxzZQotCQl2YWwgPSAwOwotCXJlZzg0X2Z1bGxbMHgxMl0gPSB2YWw7CQkJLyogMDAuLjFmICovCisJcmVnODRfZnVsbFsweDEyXSA9IHZhbCAmIDB4MWY7CQkvKiA1OjAgc2lnbmVkIHZhbHVlICovCiAJcmVnX3coZ3NwY2FfZGV2LCAweDg0LCByZWc4NF9mdWxsLCBzaXplb2YgcmVnODRfZnVsbCk7CiB9CiAKQEAgLTExNzEsOCArMTE5MywxNiBAQAogCQlzZC0+YWdfY250ID0gLTE7CiB9CiAKK3N0YXRpYyB2b2lkIHNldHZmbGlwKHN0cnVjdCBzZCAqc2QpCit7CisJaWYgKHNkLT5zZW5zb3IgIT0gU0VOU09SX09WNzYzMCkKKwkJcmV0dXJuOworCWkyY193MSgmc2QtPmdzcGNhX2RldiwgMHg3NSwJCQkvKiBDT01OICovCisJCXNkLT52ZmxpcCA/IDB4ODIgOiAweDAyKTsKK30KKwogLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLwotc3RhdGljIHZvaWQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCWludCBpOwpAQCAtMTE4Myw3ICsxMjEzLDcgQEAKIAlzdGF0aWMgY29uc3QgX191OCBDQVtdID0geyAweDI4LCAweGQ4LCAweDE0LCAweGVjIH07CiAJc3RhdGljIGNvbnN0IF9fdTggQ0VbXSA9IHsgMHgzMiwgMHhkZCwgMHgyZCwgMHhkZCB9OwkvKiBNSTAzNjAgKi8KIAlzdGF0aWMgY29uc3QgX191OCBDRV9vdjc2eHhbXSA9Ci0JCQl7IDB4MzIsIDB4ZGQsIDB4MzIsIDB4ZGQgfTsJLyogT1Y3NjMwLzQ4ICovCisJCQkJeyAweDMyLCAweGRkLCAweDMyLCAweGRkIH07CiAKIAlzbjljMXh4ID0gc25fdGJbKGludCkgc2QtPnNlbnNvcl07CiAJY29uZmlndXJlX2dwaW8oZ3NwY2FfZGV2LCBzbjljMXh4KTsKQEAgLTEyMjMsOCArMTI1MywxNSBAQAogCXJlZ193KGdzcGNhX2RldiwgMHgyMCwgZ2FtbWFfZGVmLCBzaXplb2YgZ2FtbWFfZGVmKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQlyZWdfdyhnc3BjYV9kZXYsIDB4ODQsIHJlZzg0LCBzaXplb2YgcmVnODQpOworCXN3aXRjaCAoc2QtPnNlbnNvcikgeworCWNhc2UgU0VOU09SX09WNzY2MDoKKwkJcmVnX3cxKGdzcGNhX2RldiwgMHg5YSwgMHgwNSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJlZ193MShnc3BjYV9kZXYsIDB4OWEsIDB4MDgpOwogCQlyZWdfdzEoZ3NwY2FfZGV2LCAweDk5LCAweDU5KTsKKwkJYnJlYWs7CisJfQogCiAJbW9kZSA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlWyhpbnQpIGdzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OwogCWlmIChtb2RlKQpAQCAtMTI1NSw2ICsxMjkyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgogCQlvdjc2MzBfSW5pdFNlbnNvcihnc3BjYV9kZXYpOworCQlzZXR2ZmxpcChzZCk7CiAJCXJlZzE3ID0gMHhlMjsKIAkJcmVnMSA9IDB4NDQ7CiAJCWJyZWFrOwpAQCAtMTI3NSw4ICsxMzEzLDggQEAKIC8qCQkJcmVnMSA9IDB4NDQ7ICovCiAvKgkJCXJlZzEgPSAweDQ2OwkoZG9uZSkgKi8KIAkJfSBlbHNlIHsKLQkJCXJlZzE3ID0gMHgyMjsJLyogNjQwIE1DS1NJWkUgKi8KLQkJCXJlZzEgPSAweDA2OworCQkJcmVnMTcgPSAweGEyOwkvKiA2NDAgKi8KKwkJCXJlZzEgPSAweDQ0OwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTEyODUsNiArMTMyMyw3IEBACiAJc3dpdGNoIChzZC0+c2Vuc29yKSB7CiAJY2FzZSBTRU5TT1JfT1Y3NjMwOgogCWNhc2UgU0VOU09SX09WNzY0ODoKKwljYXNlIFNFTlNPUl9PVjc2NjA6CiAJCXJlZ193KGdzcGNhX2RldiwgMHhjZSwgQ0Vfb3Y3Nnh4LCA0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEzMTEsMTIgKzEzNTAsMTYgQEAKIAkJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwogCQlzZXRjb250cmFzdChnc3BjYV9kZXYpOwogCQlicmVhazsKKwljYXNlIFNFTlNPUl9PVjc2MzA6CisJCXNldHZmbGlwKHNkKTsKKwkJLyogZmFsbCB0aHJ1ICovCiAJZGVmYXVsdDoJCQkvKiBPVjc2eHggKi8KIAkJc2V0YnJpZ2h0Y29udChnc3BjYV9kZXYpOwogCQlicmVhazsKIAl9CiAJc2V0YXV0b2dhaW4oZ3NwY2FfZGV2KTsKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDAxLCByZWcxKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtMTUzNyw2ICsxNTgwLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJc2QtPnZmbGlwID0gdmFsOworCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKKwkJc2V0dmZsaXAoc2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX2dldHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkqdmFsID0gc2QtPnZmbGlwOworCXJldHVybiAwOworfQorCiAvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKIAkubmFtZSA9IE1PRFVMRV9OQU1FLApAQCAtMTU1OCw2ICsxNjE5LDcgQEAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0gewogI2lmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMiAmJiAhZGVmaW5lZCBDT05GSUdfVVNCX1NOOUMxMDJfTU9EVUxFCiAJe1VTQl9ERVZJQ0UoMHgwNDU4LCAweDcwMjUpLCBCU0koU045QzEyMCwgTUkwMzYwLCAweDVkKX0sCisJe1VTQl9ERVZJQ0UoMHgwNDU4LCAweDcwMmUpLCBCU0koU045QzEyMCwgT1Y3NjYwLCAweDIxKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwZjUpLCBCU0koU045QzEwNSwgT1Y3NjYwLCAweDIxKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwZjcpLCBCU0koU045QzEwNSwgT1Y3NjYwLCAweDIxKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjcpLCBCU0koU045QzEwNSwgTUkwMzYwLCAweDVkKX0sCkBAIC0xNTc5LDcgKzE2NDEsOSBAQAogLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmEpLCBCU0koU045QzEwNSwgT1Y3NjQ4LCAweD8/KX0sICovCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmIpLCBCU0koU045QzEwNSwgT1Y3NjYwLCAweDIxKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmMpLCBCU0koU045QzEwNSwgSFY3MTMxUiwgMHgxMSl9LAotLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmUpLCBCU0koU045QzEwNSwgT1Y3NjMwLCAweD8/KX0sICovCisjaWYgIWRlZmluZWQgQ09ORklHX1VTQl9TTjlDMTAyICYmICFkZWZpbmVkIENPTkZJR19VU0JfU045QzEwMl9NT0RVTEUKKwl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjBmZSksIEJTSShTTjlDMTA1LCBPVjc2MzAsIDB4MjEpfSwKKyNlbmRpZgogLyoJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMDgpLCBCU0koU045QzEyMCwgT002ODAxLCAweD8/KX0sICovCiAvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyMiksIEJTSShTTjlDMTEwLCBJQ00xMDVDLCAweD8/KX0sICovCiAvKgl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjEyMyksIEJTSShTTjlDMTEwLCBTYW55b0NDRCwgMHg/Pyl9LCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYwppbmRleCA2ZTczMzkwLi5iY2ExMDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYwpAQCAtNjYwLDcgKzY2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlpbnQgZXJyOwpAQCAtODY3LDYgKzg2Nyw3IEBACiAJCXdyaXRlX3ZlY3Rvcihnc3BjYV9kZXYsIENsaWNrc21hcnQ1MTBfZGVmYXVsdHMpOwogCQlicmVhazsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKaW5kZXggZTllYjU5Yi4uYjc0MmYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKQEAgLTE5ODAsNyArMTk4MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAlpbnQgbW9kZTsKQEAgLTIwMTIsNiArMjAxMiw3IEBACiAJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwogCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CiAJc2V0Y29sb3JzKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKaW5kZXggZjYwMWRhZi4uYjM0NTc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA1LmMKQEAgLTY4OCw3ICs2ODgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CiAJaW50IHJldDsKQEAgLTczMyw2ICs3MzMsNyBAQAogLyoJcmVnX3dyaXRlKGRldiwgMHg1LCAweDAsIDB4MCk7ICovCiAvKglyZWdfd3JpdGUoZGV2LCAweDUsIDB4MCwgMHgxKTsgKi8KIC8qCXJlZ193cml0ZShkZXYsIDB4NSwgMHgxMSwgMHgyKTsgKi8KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCmluZGV4IDE5NWRjZTkuLjY0NWVlOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNi5jCkBAIC00MjIsNyArNDIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OwogCV9fdTE2IG5vcm1lOwpAQCAtNTQ5LDYgKzU0OSw3IEBACiAJUERFQlVHKERfU1RSRUFNLCAid2ViY2FtIHN0YXJ0ZWQiKTsKIAlzcGNhNTA2X0dldE5vcm1lSW5wdXQoZ3NwY2FfZGV2LCAmbm9ybWUsICZjaGFubmVsKTsKIAlzcGNhNTA2X1NldE5vcm1lSW5wdXQoZ3NwY2FfZGV2LCBub3JtZSwgY2hhbm5lbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwOC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMKaW5kZXggMjgxY2UwMi4uNjNlYzkwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMKQEAgLTE1MjgsNyArMTUyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCWludCBtb2RlOwogCkBAIC0xNTQ2LDYgKzE1NDYsNyBAQAogCQlicmVhazsKIAl9CiAJcmVnX3dyaXRlKGdzcGNhX2Rldi0+ZGV2LCAweDgxMTIsIDB4MTAgfCAweDIwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTYxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1NjEuYwppbmRleCBjZmJjOWViLi4wMjBhMDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1NjEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1NjEuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCSAgICAgIDAsCQkvKiByZXF1ZXN0ICovCi0JCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCA1MDApOwogCVBERUJVRyhEX1VTQk8sICJyZWcgd3JpdGU6IDB4JTAyeDoweCUwMngiLCBpbmRleCwgdmFsdWUpOwogCWlmIChyZXQgPCAwKQpAQCAtMjI1LDcgKzIyNSw3IEBACiAJcmVnX3dfdmFsKGdzcGNhX2Rldi0+ZGV2LCAweDg4MDIsIChtb2RlIHwgMHgwMSkpOwogCWRvIHsKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDg4MDMsIDEpOwotCQlpZiAoIWdzcGNhX2Rldi0+dXNiX2J1ZikKKwkJaWYgKCFnc3BjYV9kZXYtPnVzYl9idWZbMF0pCiAJCQlicmVhazsKIAl9IHdoaWxlICgtLXJldHJ5KTsKIAlpZiAocmV0cnkgPT0gMCkKQEAgLTY5OSw3ICs2OTksNyBAQAogCQlzZC0+YWdfY250ID0gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0XzEyYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0XzEyYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OwogCWludCBDbGNrID0gMHg4YTsgLyogbG93ZXIgMHg4WCB2YWx1ZXMgbGVhZCB0byBmcHMgPiAzMCAqLwpAQCAtNzI1LDggKzcyNSw5IEBACiAJc2V0d2hpdGUoZ3NwY2FfZGV2KTsKIAlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOwogCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgdm9pZCBzZF9zdGFydF83MmEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydF83MmEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKIAlpbnQgQ2xjazsKQEAgLTc1MCw2ICs3NTEsNyBAQAogCXJlZ193X3ZhbChkZXYsIDB4ODcwMCwgQ2xjayk7CS8qIDB4MjcgY2xvY2sgKi8KIAlyZWdfd192YWwoZGV2LCAweDgxMTIsIDB4MTAgfCAweDIwKTsKIAlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC0xMDY0LDcgKzEwNjYsNyBAQAogCSAgICB7CiAJCS5pZCA9IFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0UsCiAJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgPSAiV2hpbGUgQmFsYW5jZSIsCisJCS5uYW1lID0gIldoaXRlIEJhbGFuY2UiLAogCQkubWluaW11bSA9IFdISVRFX01JTiwKIAkJLm1heGltdW0gPSBXSElURV9NQVgsCiAJCS5zdGVwID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCmluZGV4IDJmMmRlNDIuLmQ5ZDY0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYwpAQCAtMzI0LDcgKzMyNCw3IEBACiB9CiAKIC8qIC0tIHN0YXJ0IHRoZSBjYW1lcmEgLS0gKi8KLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCWludCByZXQsIHZhbHVlOwogCkBAIC0zNzQsOSArMzc0LDEwIEBACiAJc2V0X3Bhcihnc3BjYV9kZXYsIDB4MDEwMDAwMDApOwogCXNldF9wYXIoZ3NwY2FfZGV2LCAweDAxMDAwMDAwKTsKIAlQREVCVUcoRF9TVFJFQU0sICJjYW1lcmEgc3RhcnRlZCBhbHQ6IDB4JTAyeCIsIGdzcGNhX2Rldi0+YWx0KTsKLQlyZXR1cm47CisJcmV0dXJuIDA7CiBvdXQ6CiAJUERFQlVHKERfRVJSfERfU1RSRUFNLCAiY2FtZXJhIHN0YXJ0IGVyciAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYwppbmRleCAxY2ZjYzZjLi5iZDkyODg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYwpAQCAtOTYxLDcgKzk2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC0xMDQyLDYgKzEwNDIsNyBAQAogCQlicmVhazsKIAl9CiAJc3A1eHhfaW5pdENvbnRCcmlnSHVlUmVnaXN0ZXJzKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKaW5kZXggZjAzNGM3NC4uYjU2MWY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKQEAgLTI4LDggKzI4LDYgQEAKIAogI2luY2x1ZGUgImdzcGNhLmgiCiAKLSNkZWZpbmUgTUFYX0dBTU1BIDB4MTAJCS8qIDAgdG8gMTUgKi8KLQogI2RlZmluZSBWNEwyX0NJRF9FRkZFQ1RTIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQogCiBNT0RVTEVfQVVUSE9SKCJMZWFuZHJvIENvc3RhbnRpbm8gPGxlX2Nvc3RhbnRpbm9AcGl4YXJ0YXJnZW50aW5hLmNvbS5hcj4iKTsKQEAgLTQ5LDYgKzQ3LDEwIEBACiAJdW5zaWduZWQgY2hhciB3aGl0ZWJhbGFuY2U7CiAJdW5zaWduZWQgY2hhciBtaXJyb3I7CiAJdW5zaWduZWQgY2hhciBlZmZlY3Q7CisKKwlfX3U4IHNlbnNvcjsKKyNkZWZpbmUgU0VOU09SX1RBUzUxMzBBIDAKKyNkZWZpbmUgU0VOU09SX09USEVSIDEKIH07CiAKIC8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KQEAgLTgzLDkgKzg1LDkgQEAKIAkgIC50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkgIC5uYW1lID0gIkJyaWdodG5lc3MiLAogCSAgLm1pbmltdW0gPSAwLAotCSAgLm1heGltdW0gPSAweDBmLAorCSAgLm1heGltdW0gPSAxNCwKIAkgIC5zdGVwID0gMSwKLQkgIC5kZWZhdWx0X3ZhbHVlID0gMHgwOSwKKwkgIC5kZWZhdWx0X3ZhbHVlID0gOCwKIAkgIH0sCiAJIC5zZXQgPSBzZF9zZXRicmlnaHRuZXNzLAogCSAuZ2V0ID0gc2RfZ2V0YnJpZ2h0bmVzcywKQEAgLTExOCwxNiArMTIwLDE3IEBACiAJIC5zZXQgPSBzZF9zZXRjb2xvcnMsCiAJIC5nZXQgPSBzZF9nZXRjb2xvcnMsCiAJIH0sCi0jZGVmaW5lIFNEX0dBTU1BIDMKKyNkZWZpbmUgR0FNTUFfTUFYIDE2CisjZGVmaW5lIEdBTU1BX0RFRiAxMAogCXsKIAkgewogCSAgLmlkID0gVjRMMl9DSURfR0FNTUEsCS8qIChnYW1tYSBvbiB3aW4pICovCiAJICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAubmFtZSA9ICJHYW1tYSAoVW50ZXN0ZWQpIiwKKwkgIC5uYW1lID0gIkdhbW1hIiwKIAkgIC5taW5pbXVtID0gMCwKLQkgIC5tYXhpbXVtID0gTUFYX0dBTU1BLAorCSAgLm1heGltdW0gPSBHQU1NQV9NQVggLSAxLAogCSAgLnN0ZXAgPSAxLAotCSAgLmRlZmF1bHRfdmFsdWUgPSAweDA5LAorCSAgLmRlZmF1bHRfdmFsdWUgPSBHQU1NQV9ERUYsCiAJICB9LAogCSAuc2V0ID0gc2Rfc2V0Z2FtbWEsCiAJIC5nZXQgPSBzZF9nZXRnYW1tYSwKQEAgLTE5Nyw3ICsyMDAsNyBAQAogCSAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCSAgLm5hbWUgPSAiU2hhcnBuZXNzIiwKIAkgIC5taW5pbXVtID0gMCwKLQkgIC5tYXhpbXVtID0gTUFYX0dBTU1BLAkvKiAwIHRvIDE2ICovCisJICAubWF4aW11bSA9IDE1LAogCSAgLnN0ZXAgPSAxLAogCSAgLmRlZmF1bHRfdmFsdWUgPSAweDA2LAogCSAgfSwKQEAgLTI1OCw3ICsyNjEsNiBAQAogCQkucHJpdiA9IDB9LAogfTsKIAotI2RlZmluZSBUMTZfT0ZGU0VUX0RBVEEgNjMxCiAjZGVmaW5lIE1BWF9FRkZFQ1RTIDcKIC8qIGVhc2lseSBkb25lIGJ5IHNvZnQsIHRoaXMgdGFibGUgY291bGQgYmUgcmVtb3ZlZCwKICAqIGkga2VlcCBpdCBoZXJlIGp1c3QgaW4gY2FzZSAqLwpAQCAtMjcyLDg3ICsyNzQsODcgQEAKIAl7MHhhOCwgMHhjOCwgMHhjNiwgMHhkMiwgMHhjMCwgMHg0MH0sCS8qIE5lZ2F0aXZlICovCiB9OwogCi1zdGF0aWMgY29uc3QgX191OCBnYW1tYV90YWJsZVtNQVhfR0FNTUFdWzM0XSA9IHsKLQl7MHg5MCwgMHgwMCwgMHg5MSwgMHgzZSwgMHg5MiwgMHg2OSwgMHg5MywgMHg4NSwKK3N0YXRpYyBjb25zdCBfX3U4IGdhbW1hX3RhYmxlW0dBTU1BX01BWF1bMzRdID0geworCXsweDkwLCAweDAwLCAweDkxLCAweDNlLCAweDkyLCAweDY5LCAweDkzLCAweDg1LAkvKiAwICovCiAJIDB4OTQsIDB4OTUsIDB4OTUsIDB4YTEsIDB4OTYsIDB4YWUsIDB4OTcsIDB4YjksCiAJIDB4OTgsIDB4YzIsIDB4OTksIDB4Y2IsIDB4OWEsIDB4ZDQsIDB4OWIsIDB4ZGIsCiAJIDB4OWMsIDB4ZTMsIDB4OWQsIDB4ZWEsIDB4OWUsIDB4ZjEsIDB4OWYsIDB4ZjgsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDMzLCAweDkyLCAweDVBLCAweDkzLCAweDc1LAotCSAweDk0LCAweDg1LCAweDk1LCAweDkzLCAweDk2LCAweEExLCAweDk3LCAweEFELAotCSAweDk4LCAweEI3LCAweDk5LCAweEMyLCAweDlBLCAweENCLCAweDlCLCAweEQ0LAotCSAweDlDLCAweERFLCAweDlELCAweEU3LCAweDlFLCAweEYwLCAweDlGLCAweEY3LAorCXsweDkwLCAweDAwLCAweDkxLCAweDMzLCAweDkyLCAweDVhLCAweDkzLCAweDc1LAkvKiAxICovCisJIDB4OTQsIDB4ODUsIDB4OTUsIDB4OTMsIDB4OTYsIDB4YTEsIDB4OTcsIDB4YWQsCisJIDB4OTgsIDB4YjcsIDB4OTksIDB4YzIsIDB4OWEsIDB4Y2IsIDB4OWIsIDB4ZDQsCisJIDB4OWMsIDB4ZGUsIDB4OUQsIDB4ZTcsIDB4OWUsIDB4ZjAsIDB4OWYsIDB4ZjcsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDJGLCAweDkyLCAweDUxLCAweDkzLCAweDZCLAotCSAweDk0LCAweDdDLCAweDk1LCAweDhBLCAweDk2LCAweDk5LCAweDk3LCAweEE2LAotCSAweDk4LCAweEIxLCAweDk5LCAweEJDLCAweDlBLCAweEM2LCAweDlCLCAweEQwLAotCSAweDlDLCAweERCLCAweDlELCAweEU0LCAweDlFLCAweEVELCAweDlGLCAweEY2LAorCXsweDkwLCAweDAwLCAweDkxLCAweDJmLCAweDkyLCAweDUxLCAweDkzLCAweDZiLAkvKiAyICovCisJIDB4OTQsIDB4N2MsIDB4OTUsIDB4OGEsIDB4OTYsIDB4OTksIDB4OTcsIDB4YTYsCisJIDB4OTgsIDB4YjEsIDB4OTksIDB4YmMsIDB4OWEsIDB4YzYsIDB4OWIsIDB4ZDAsCisJIDB4OWMsIDB4ZGIsIDB4OWQsIDB4ZTQsIDB4OWUsIDB4ZWQsIDB4OWYsIDB4ZjYsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDI5LCAweDkyLCAweDQ4LCAweDkzLCAweDYwLAotCSAweDk0LCAweDcyLCAweDk1LCAweDgxLCAweDk2LCAweDkwLCAweDk3LCAweDlFLAotCSAweDk4LCAweEFBLCAweDk5LCAweEI1LCAweDlBLCAweEJGLCAweDlCLCAweENCLAotCSAweDlDLCAweEQ2LCAweDlELCAweEUxLCAweDlFLCAweEVCLCAweDlGLCAweEY1LAorCXsweDkwLCAweDAwLCAweDkxLCAweDI5LCAweDkyLCAweDQ4LCAweDkzLCAweDYwLAkvKiAzICovCisJIDB4OTQsIDB4NzIsIDB4OTUsIDB4ODEsIDB4OTYsIDB4OTAsIDB4OTcsIDB4OWUsCisJIDB4OTgsIDB4YWEsIDB4OTksIDB4YjUsIDB4OWEsIDB4YmYsIDB4OWIsIDB4Y2IsCisJIDB4OWMsIDB4ZDYsIDB4OWQsIDB4ZTEsIDB4OWUsIDB4ZWIsIDB4OWYsIDB4ZjUsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDIzLCAweDkyLCAweDNGLCAweDkzLCAweDU1LAorCXsweDkwLCAweDAwLCAweDkxLCAweDIzLCAweDkyLCAweDNmLCAweDkzLCAweDU1LAkvKiA0ICovCiAJIDB4OTQsIDB4NjgsIDB4OTUsIDB4NzcsIDB4OTYsIDB4ODYsIDB4OTcsIDB4OTUsCi0JIDB4OTgsIDB4QTIsIDB4OTksIDB4QUQsIDB4OUEsIDB4QjksIDB4OUIsIDB4QzYsCi0JIDB4OUMsIDB4RDIsIDB4OUQsIDB4REUsIDB4OUUsIDB4RTksIDB4OUYsIDB4RjQsCisJIDB4OTgsIDB4YTIsIDB4OTksIDB4YWQsIDB4OWEsIDB4YjksIDB4OWIsIDB4YzYsCisJIDB4OWMsIDB4ZDIsIDB4OWQsIDB4ZGUsIDB4OWUsIDB4ZTksIDB4OWYsIDB4ZjQsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDFCLCAweDkyLCAweDMzLCAweDkzLCAweDQ4LAorCXsweDkwLCAweDAwLCAweDkxLCAweDFiLCAweDkyLCAweDMzLCAweDkzLCAweDQ4LAkvKiA1ICovCiAJIDB4OTQsIDB4NTksIDB4OTUsIDB4NjksIDB4OTYsIDB4NzksIDB4OTcsIDB4ODcsCi0JIDB4OTgsIDB4OTYsIDB4OTksIDB4QTMsIDB4OUEsIDB4QjEsIDB4OUIsIDB4QkUsCi0JIDB4OUMsIDB4Q0MsIDB4OUQsIDB4REEsIDB4OUUsIDB4RTcsIDB4OUYsIDB4RjMsCisJIDB4OTgsIDB4OTYsIDB4OTksIDB4YTMsIDB4OWEsIDB4YjEsIDB4OWIsIDB4YmUsCisJIDB4OWMsIDB4Y2MsIDB4OWQsIDB4ZGEsIDB4OWUsIDB4ZTcsIDB4OWYsIDB4ZjMsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDAyLCAweDkyLCAweDEwLCAweDkzLCAweDIwLAorCXsweDkwLCAweDAwLCAweDkxLCAweDAyLCAweDkyLCAweDEwLCAweDkzLCAweDIwLAkvKiA2ICovCiAJIDB4OTQsIDB4MzIsIDB4OTUsIDB4NDAsIDB4OTYsIDB4NTcsIDB4OTcsIDB4NjcsCiAJIDB4OTgsIDB4NzcsIDB4OTksIDB4ODgsIDB4OWEsIDB4OTksIDB4OWIsIDB4YWEsCiAJIDB4OWMsIDB4YmIsIDB4OWQsIDB4Y2MsIDB4OWUsIDB4ZGQsIDB4OWYsIDB4ZWUsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDAyLCAweDkyLCAweDE0LCAweDkzLCAweDI2LAotCSAweDk0LCAweDM4LCAweDk1LCAweDRBLCAweDk2LCAweDYwLCAweDk3LCAweDcwLAotCSAweDk4LCAweDgwLCAweDk5LCAweDkwLCAweDlBLCAweEEwLCAweDlCLCAweEIwLAotCSAweDlDLCAweEMwLCAweDlELCAweEQwLCAweDlFLCAweEUwLCAweDlGLCAweEYwLAorCXsweDkwLCAweDAwLCAweDkxLCAweDAyLCAweDkyLCAweDE0LCAweDkzLCAweDI2LAkvKiA3ICovCisJIDB4OTQsIDB4MzgsIDB4OTUsIDB4NGEsIDB4OTYsIDB4NjAsIDB4OTcsIDB4NzAsCisJIDB4OTgsIDB4ODAsIDB4OTksIDB4OTAsIDB4OWEsIDB4YTAsIDB4OWIsIDB4YjAsCisJIDB4OWMsIDB4YzAsIDB4OUQsIDB4ZDAsIDB4OWUsIDB4ZTAsIDB4OWYsIDB4ZjAsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDEwLCAweDkyLCAweDIyLCAweDkzLCAweDM1LAotCSAweDk0LCAweDQ3LCAweDk1LCAweDVBLCAweDk2LCAweDY5LCAweDk3LCAweDc5LAotCSAweDk4LCAweDg4LCAweDk5LCAweDk3LCAweDlBLCAweEE3LCAweDlCLCAweEI2LAotCSAweDlDLCAweEM0LCAweDlELCAweEQzLCAweDlFLCAweEUwLCAweDlGLCAweEYwLAorCXsweDkwLCAweDAwLCAweDkxLCAweDEwLCAweDkyLCAweDIyLCAweDkzLCAweDM1LAkvKiA4ICovCisJIDB4OTQsIDB4NDcsIDB4OTUsIDB4NWEsIDB4OTYsIDB4NjksIDB4OTcsIDB4NzksCisJIDB4OTgsIDB4ODgsIDB4OTksIDB4OTcsIDB4OWEsIDB4YTcsIDB4OWIsIDB4YjYsCisJIDB4OWMsIDB4YzQsIDB4OWQsIDB4ZDMsIDB4OWUsIDB4ZTAsIDB4OWYsIDB4ZjAsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDEwLCAweDkyLCAweDI2LCAweDkzLCAweDQwLAorCXsweDkwLCAweDAwLCAweDkxLCAweDEwLCAweDkyLCAweDI2LCAweDkzLCAweDQwLAkvKiA5ICovCiAJIDB4OTQsIDB4NTQsIDB4OTUsIDB4NjUsIDB4OTYsIDB4NzUsIDB4OTcsIDB4ODQsCiAJIDB4OTgsIDB4OTMsIDB4OTksIDB4YTEsIDB4OWEsIDB4YjAsIDB4OWIsIDB4YmQsCiAJIDB4OWMsIDB4Y2EsIDB4OWQsIDB4ZDYsIDB4OWUsIDB4ZTAsIDB4OWYsIDB4ZjAsCiAJIDB4YTAsIDB4ZmZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDE4LCAweDkyLCAweDJCLCAweDkzLCAweDQ0LAotCSAweDk0LCAweDYwLCAweDk1LCAweDcwLCAweDk2LCAweDgwLCAweDk3LCAweDhFLAotCSAweDk4LCAweDlDLCAweDk5LCAweEFBLCAweDlBLCAweEI3LCAweDlCLCAweEM0LAotCSAweDlDLCAweEQwLCAweDlELCAweEQ4LCAweDlFLCAweEUyLCAweDlGLCAweEYwLAorCXsweDkwLCAweDAwLCAweDkxLCAweDE4LCAweDkyLCAweDJiLCAweDkzLCAweDQ0LAkvKiAxMCAqLworCSAweDk0LCAweDYwLCAweDk1LCAweDcwLCAweDk2LCAweDgwLCAweDk3LCAweDhlLAorCSAweDk4LCAweDljLCAweDk5LCAweGFhLCAweDlhLCAweGI3LCAweDliLCAweGM0LAorCSAweDljLCAweGQwLCAweDlkLCAweGQ4LCAweDllLCAweGUyLCAweDlmLCAweGYwLAogCSAweGEwLCAweGZmfSwKLQl7MHg5MCwgMHgwMCwgMHg5MSwgMHgxQSwgMHg5MiwgMHgzNCwgMHg5MywgMHg1MiwKLQkgMHg5NCwgMHg2NiwgMHg5NSwgMHg3RSwgMHg5NiwgMHg4RCwgMHg5NywgMHg5QiwKLQkgMHg5OCwgMHhBOCwgMHg5OSwgMHhCNCwgMHg5QSwgMHhDMCwgMHg5QiwgMHhDQiwKLQkgMHg5QywgMHhENiwgMHg5RCwgMHhFMSwgMHg5RSwgMHhFQiwgMHg5RiwgMHhGNSwKKwl7MHg5MCwgMHgwMCwgMHg5MSwgMHgxYSwgMHg5MiwgMHgzNCwgMHg5MywgMHg1MiwJLyogMTEgKi8KKwkgMHg5NCwgMHg2NiwgMHg5NSwgMHg3ZSwgMHg5NiwgMHg4RCwgMHg5NywgMHg5QiwKKwkgMHg5OCwgMHhhOCwgMHg5OSwgMHhiNCwgMHg5YSwgMHhjMCwgMHg5YiwgMHhjYiwKKwkgMHg5YywgMHhkNiwgMHg5ZCwgMHhlMSwgMHg5ZSwgMHhlYiwgMHg5ZiwgMHhmNSwKIAkgMHhhMCwgMHhmZn0sCi0JezB4OTAsIDB4MDAsIDB4OTEsIDB4M0YsIDB4OTIsIDB4NUEsIDB4OTMsIDB4NkUsCi0JIDB4OTQsIDB4N0YsIDB4OTUsIDB4OEUsIDB4OTYsIDB4OUMsIDB4OTcsIDB4QTgsCi0JIDB4OTgsIDB4QjQsIDB4OTksIDB4QkYsIDB4OUEsIDB4QzksIDB4OUIsIDB4RDMsCi0JIDB4OUMsIDB4REMsIDB4OUQsIDB4RTUsIDB4OUUsIDB4RUUsIDB4OUYsIDB4RjYsCi0JIDB4QTAsIDB4RkZ9LAotCXsweDkwLCAweDAwLCAweDkxLCAweDU0LCAweDkyLCAweDZGLCAweDkzLCAweDgzLAotCSAweDk0LCAweDkzLCAweDk1LCAweEEwLCAweDk2LCAweEFELCAweDk3LCAweEI3LAotCSAweDk4LCAweEMyLCAweDk5LCAweENCLCAweDlBLCAweEQ0LCAweDlCLCAweERDLAotCSAweDlDLCAweEU0LCAweDlELCAweEVCLCAweDlFLCAweEYyLCAweDlGLCAweEY5LAorCXsweDkwLCAweDAwLCAweDkxLCAweDNmLCAweDkyLCAweDVhLCAweDkzLCAweDZlLAkvKiAxMiAqLworCSAweDk0LCAweDdmLCAweDk1LCAweDhlLCAweDk2LCAweDljLCAweDk3LCAweGE4LAorCSAweDk4LCAweGI0LCAweDk5LCAweGJmLCAweDlhLCAweGM5LCAweDliLCAweGQzLAorCSAweDljLCAweGRjLCAweDlkLCAweGU1LCAweDllLCAweGVlLCAweDlmLCAweGY2LAogCSAweGEwLCAweGZmfSwKLQl7MHg5MCwgMHgwMCwgMHg5MSwgMHg2RSwgMHg5MiwgMHg4OCwgMHg5MywgMHg5QSwKLQkgMHg5NCwgMHhBOCwgMHg5NSwgMHhCMywgMHg5NiwgMHhCRCwgMHg5NywgMHhDNiwKLQkgMHg5OCwgMHhDRiwgMHg5OSwgMHhENiwgMHg5QSwgMHhERCwgMHg5QiwgMHhFMywKLQkgMHg5QywgMHhFOSwgMHg5RCwgMHhFRiwgMHg5RSwgMHhGNCwgMHg5RiwgMHhGQSwKKwl7MHg5MCwgMHgwMCwgMHg5MSwgMHg1NCwgMHg5MiwgMHg2ZiwgMHg5MywgMHg4MywJLyogMTMgKi8KKwkgMHg5NCwgMHg5MywgMHg5NSwgMHhhMCwgMHg5NiwgMHhhZCwgMHg5NywgMHhiNywKKwkgMHg5OCwgMHhjMiwgMHg5OSwgMHhjYiwgMHg5YSwgMHhkNCwgMHg5YiwgMHhkYywKKwkgMHg5YywgMHhlNCwgMHg5ZCwgMHhlYiwgMHg5ZSwgMHhmMiwgMHg5ZiwgMHhmOSwKIAkgMHhhMCwgMHhmZn0sCi0JezB4OTAsIDB4MDAsIDB4OTEsIDB4OTMsIDB4OTIsIDB4QTgsIDB4OTMsIDB4QjcsCi0JIDB4OTQsIDB4QzEsIDB4OTUsIDB4Q0EsIDB4OTYsIDB4RDIsIDB4OTcsIDB4RDgsCi0JIDB4OTgsIDB4REUsIDB4OTksIDB4RTMsIDB4OUEsIDB4RTgsIDB4OUIsIDB4RUQsCi0JIDB4OUMsIDB4RjEsIDB4OUQsIDB4RjUsIDB4OUUsIDB4RjgsIDB4OUYsIDB4RkMsCi0JIDB4QTAsIDB4RkZ9CisJezB4OTAsIDB4MDAsIDB4OTEsIDB4NmUsIDB4OTIsIDB4ODgsIDB4OTMsIDB4OWEsCS8qIDE0ICovCisJIDB4OTQsIDB4YTgsIDB4OTUsIDB4YjMsIDB4OTYsIDB4YmQsIDB4OTcsIDB4YzYsCisJIDB4OTgsIDB4Y2YsIDB4OTksIDB4ZDYsIDB4OWEsIDB4ZGQsIDB4OWIsIDB4ZTMsCisJIDB4OWMsIDB4ZTksIDB4OWQsIDB4ZWYsIDB4OWUsIDB4ZjQsIDB4OWYsIDB4ZmEsCisJIDB4YTAsIDB4ZmZ9LAorCXsweDkwLCAweDAwLCAweDkxLCAweDkzLCAweDkyLCAweGE4LCAweDkzLCAweGI3LAkvKiAxNSAqLworCSAweDk0LCAweGMxLCAweDk1LCAweGNhLCAweDk2LCAweGQyLCAweDk3LCAweGQ4LAorCSAweDk4LCAweGRlLCAweDk5LCAweGUzLCAweDlhLCAweGU4LCAweDliLCAweGVkLAorCSAweDljLCAweGYxLCAweDlkLCAweGY1LCAweDllLCAweGY4LCAweDlmLCAweGZjLAorCSAweGEwLCAweGZmfQogfTsKIAogc3RhdGljIGNvbnN0IF9fdTggdGFzNTEzMGFfc2Vuc29yX2luaXRbXVs4XSA9IHsKQEAgLTM2NCw3ICszNjYsNyBAQAogfTsKIAogLyogcmVhZCAxIGJ5dGUgKi8KLXN0YXRpYyBpbnQgcmVnX3JfMShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCitzdGF0aWMgaW50IHJlZ19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJICAgX191MTYgaW5kZXgpCiB7CiAJdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LApAQCAtMzc4LDI2ICszODAsMjYgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVnX3coc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAotCQkJX191MTYgdmFsdWUsCi0JCQlfX3UxNiBpbmRleCwKLQkJCWNvbnN0IF9fdTggKmJ1ZmZlciwgX191MTYgbGVuKQorCQkgIF9fdTE2IGluZGV4KQogewotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQl1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCi0JCQkJdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKLQkJCQkwLAotCQkJICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkJCXZhbHVlLCBpbmRleCwKLQkJCQlOVUxMLCAwLCA1MDApOwotCQlyZXR1cm47Ci0JfQorCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkwLAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJMCwgaW5kZXgsCisJCQlOVUxMLCAwLCA1MDApOworfQorCitzdGF0aWMgdm9pZCBpMmNfdyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCSAgY29uc3QgX191OCAqYnVmZmVyLCBfX3UxNiBsZW4pCit7CiAJaWYgKGxlbiA8PSBVU0JfQlVGX1NaKSB7CiAJCW1lbWNweShnc3BjYV9kZXYtPnVzYl9idWYsIGJ1ZmZlciwgbGVuKTsKIAkJdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAogCQkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCiAJCQkJMCwKIAkJCSAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLQkJCQl2YWx1ZSwgaW5kZXgsCisJCQkJMHgwMSwgMCwKIAkJCQlnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwgNTAwKTsKIAl9IGVsc2UgewogCQlfX3U4ICp0bXBidWY7CkBAIC00MDgsMTIgKzQxMCw1NiBAQAogCQkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCiAJCQkJMCwKIAkJCSAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLQkJCQl2YWx1ZSwgaW5kZXgsCisJCQkJMHgwMSwgMCwKIAkJCQl0bXBidWYsIGxlbiwgNTAwKTsKIAkJa2ZyZWUodG1wYnVmKTsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG90aGVyX3NlbnNvcl9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlpbnQgaTsKKwljb25zdCBfX3U4ICpwOworCV9fdTggYnl0ZTsKKwlfX3U4IHZhbFs2XSA9IHsweDYyLCAwLCAweDY0LCAwLCAweDYwLCAweDA1fTsKKwlzdGF0aWMgY29uc3QgX191OCBzZW5zb3JfaW5pdFtdID0geworCQkweGRmLCAweDZkLAorCQkweGRkLCAweDE4LAorCQkweDVhLCAweGUwLAorCQkweDVjLCAweDA3LAorCQkweDVkLCAweGIwLAorCQkweDVlLCAweDFlLAorCQkweDYwLCAweDcxLAorCQkweGVmLCAweDAwLAorCQkweGU5LCAweDAwLAorCQkweGVhLCAweDAwLAorCQkweDkwLCAweDI0LAorCQkweDkxLCAweGIyLAorCQkweDgyLCAweDMyLAorCQkweGZkLCAweDAwLAorCQkweGZkLCAweDAxLAorCQkweGZkLCAweDQxLAorCQkweDAwCQkJLyogdGFibGUgZW5kICovCisJfTsKKworCXAgPSBzZW5zb3JfaW5pdDsKKwl3aGlsZSAoKnAgIT0gMCkgeworCQl2YWxbMV0gPSAqcCsrOworCQl2YWxbM10gPSAqcCsrOworCQlpZiAoKnAgPT0gMCkKKwkJCXJlZ193KGdzcGNhX2RldiwgMHgzYzgwKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCB2YWwsIHNpemVvZiB2YWwpOworCQlpID0gNDsKKwkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQltc2xlZXAoMTUpOworCQkJYnl0ZSA9IHJlZ19yKGdzcGNhX2RldiwgMHg2MCk7CisJCQlpZiAoIShieXRlICYgMHgwMSkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJCQlyZWdfdyhnc3BjYV9kZXYsIDB4M2M4MCk7Cit9CisKIC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIHRpbWUgKi8KIHN0YXRpYyBpbnQgc2RfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC00MzAsNyArNDc2LDcgQEAKIAlzZC0+YnJpZ2h0bmVzcyA9IHNkX2N0cmxzW1NEX0JSSUdIVE5FU1NdLnFjdHJsLmRlZmF1bHRfdmFsdWU7CiAJc2QtPmNvbnRyYXN0ID0gc2RfY3RybHNbU0RfQ09OVFJBU1RdLnFjdHJsLmRlZmF1bHRfdmFsdWU7CiAJc2QtPmNvbG9ycyA9IHNkX2N0cmxzW1NEX0NPTE9SXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwotCXNkLT5nYW1tYSA9IHNkX2N0cmxzW1NEX0dBTU1BXS5xY3RybC5kZWZhdWx0X3ZhbHVlOworCXNkLT5nYW1tYSA9IEdBTU1BX0RFRjsKIAlzZC0+bWlycm9yID0gc2RfY3RybHNbU0RfTUlSUk9SXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwogCXNkLT5mcmVxID0gc2RfY3RybHNbU0RfTElHSFRGUkVRXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwogCXNkLT53aGl0ZWJhbGFuY2UgPSBzZF9jdHJsc1tTRF9XSElURV9CQUxBTkNFXS5xY3RybC5kZWZhdWx0X3ZhbHVlOwpAQCAtNDM5LDI3ICs0ODUsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbml0X2RlZmF1bHRfcGFyYW1ldGVycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgdm9pZCBzZXRnYW1tYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJUERFQlVHKERfQ09ORiwgIkdhbW1hOiAlZCIsIHNkLT5nYW1tYSk7CisJaTJjX3coZ3NwY2FfZGV2LCBnYW1tYV90YWJsZVtzZC0+Z2FtbWFdLCBzaXplb2YgZ2FtbWFfdGFibGVbMF0pOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSBhbmQgcmVzdW1lIHRpbWUgKi8KK3N0YXRpYyBpbnQgc2RfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJLyogc29tZSBvZiB0aGlzIHJlZ2lzdGVycyBhcmUgbm90IHJlYWxseSBuZWRlZCwgYmVjYXVzZQogCSAqIHRoZXkgYXJlIG92ZXJyaWRlbiBieSBzZXRicmlndGhuZXNzLCBzZXRjb250cmFzdCwgZXRjLAogCSAqIGJ1dCB3b250IGh1cnQgYW55d2F5LCBhbmQgY2FuIGhlbHAgc29tZW9uZSB3aXRoIHNpbWlsYXIgd2ViY2FtCiAJICogdG8gc2VlIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMuKi8KLQlpbnQgaSA9IDA7Ci0JX191OCB0ZXN0X2J5dGU7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpOworCV9fdTggYnl0ZSwgdGVzdF9ieXRlOwogCiAJc3RhdGljIGNvbnN0IF9fdTggcmVhZF9pbmRleHNbXSA9CiAJCXsgMHgwNiwgMHgwNywgMHgwYSwgMHgwYiwgMHg2NiwgMHg4MCwgMHg4MSwgMHg4ZSwgMHg4ZiwgMHhhNSwKIAkJICAweGE2LCAweGE4LCAweGJiLCAweGJjLCAweGM2LCAweDAwLCAweDAwIH07Ci0Jc3RhdGljIGNvbnN0IF9fdTggbjFbNl0gPQorCXN0YXRpYyBjb25zdCBfX3U4IG4xW10gPQogCQkJezB4MDgsIDB4MDMsIDB4MDksIDB4MDMsIDB4MTIsIDB4MDR9OwotCXN0YXRpYyBjb25zdCBfX3U4IG4yWzJdID0KKwlzdGF0aWMgY29uc3QgX191OCBuMltdID0KIAkJCXsweDA4LCAweDAwfTsKLQlzdGF0aWMgY29uc3QgX191OCBuc2V0WzZdID0KLQkJeyAweDYxLCAweDY4LCAweDYyLCAweGZmLCAweDYwLCAweDA3IH07Ci0Jc3RhdGljIGNvbnN0IF9fdTggbjNbNl0gPQorCXN0YXRpYyBjb25zdCBfX3U4IG5zZXRbXSA9CisJCQl7IDB4NjEsIDB4NjgsIDB4NjIsIDB4ZmYsIDB4NjAsIDB4MDcgfTsKKwlzdGF0aWMgY29uc3QgX191OCBuM1tdID0KIAkJCXsweDYxLCAweDY4LCAweDY1LCAweDBhLCAweDYwLCAweDA0fTsKLQlzdGF0aWMgY29uc3QgX191OCBuNFsweDQ2XSA9CisJc3RhdGljIGNvbnN0IF9fdTggbjRbXSA9CiAJCXsweDA5LCAweDAxLCAweDEyLCAweDA0LCAweDY2LCAweDhhLCAweDgwLCAweDNjLAogCQkgMHg4MSwgMHgyMiwgMHg4NCwgMHg1MCwgMHg4YSwgMHg3OCwgMHg4YiwgMHg2OCwKIAkJIDB4OGMsIDB4ODgsIDB4OGUsIDB4MzMsIDB4OGYsIDB4MjQsIDB4YWEsIDB4YjEsCkBAIC00NjksMzMgKzUyNSwyNiBAQAogCQkgMHg2NSwgMHgwYSwgMHhiYiwgMHg4NiwgMHhhZiwgMHg1OCwgMHhiMCwgMHg2OCwKIAkJIDB4ODcsIDB4NDAsIDB4ODksIDB4MmIsIDB4OGQsIDB4ZmYsIDB4ODMsIDB4NDAsCiAJCSAweGFjLCAweDg0LCAweGFkLCAweDg2LCAweGFmLCAweDQ2fTsKLQlzdGF0aWMgY29uc3QgX191OCBuc2V0NFsxOF0gPSB7CisJc3RhdGljIGNvbnN0IF9fdTggbnNldDRbXSA9IHsKIAkJMHhlMCwgMHg2MCwgMHhlMSwgMHhhOCwgMHhlMiwgMHhlMCwgMHhlMywgMHg2MCwgMHhlNCwgMHhhOCwKIAkJMHhlNSwgMHhlMCwgMHhlNiwgMHg2MCwgMHhlNywgMHhhOCwKIAkJMHhlOCwgMHhlMAogCX07CiAJLyogb2pvIHB1ZWRlIHNlciAweGU2IGVuIHZleiBkZSAweGU5ICovCi0Jc3RhdGljIGNvbnN0IF9fdTggbnNldDJbMjBdID0geworCXN0YXRpYyBjb25zdCBfX3U4IG5zZXQyW10gPSB7CiAJCTB4ZDAsIDB4YmIsIDB4ZDEsIDB4MjgsIDB4ZDIsIDB4MTAsIDB4ZDMsIDB4MTAsIDB4ZDQsIDB4YmIsCiAJCTB4ZDUsIDB4MjgsIDB4ZDYsIDB4MWUsIDB4ZDcsIDB4MjcsCiAJCTB4ZDgsIDB4YzgsIDB4ZDksIDB4ZmMKIAl9OwotCXN0YXRpYyBjb25zdCBfX3U4IG1pc3NpbmdbOF0gPQorCXN0YXRpYyBjb25zdCBfX3U4IG1pc3NpbmdbXSA9CiAJCXsgMHg4NywgMHgyMCwgMHg4OCwgMHgyMCwgMHg4OSwgMHgyMCwgMHg4MCwgMHgzOCB9OwotCXN0YXRpYyBjb25zdCBfX3U4IG5zZXQzWzE4XSA9IHsKKwlzdGF0aWMgY29uc3QgX191OCBuc2V0M1tdID0gewogCQkweGM3LCAweDYwLCAweGM4LCAweGE4LCAweGM5LCAweGUwLCAweGNhLCAweDYwLCAweGNiLCAweGE4LAogCQkweGNjLCAweGUwLCAweGNkLCAweDYwLCAweGNlLCAweGE4LAogCQkweGNmLCAweGUwCiAJfTsKLQlzdGF0aWMgY29uc3QgX191OCBuc2V0NVs0XSA9Ci0JCXsgMHg4ZiwgMHgyNCwgMHhjMywgMHgwMCB9OwkvKiBicmlnaHQgKi8KLQlzdGF0aWMgY29uc3QgX191OCBuc2V0NlszNF0gPSB7Ci0JCTB4OTAsIDB4MDAsIDB4OTEsIDB4MWMsIDB4OTIsIDB4MzAsIDB4OTMsIDB4NDMsIDB4OTQsIDB4NTQsCi0JCTB4OTUsIDB4NjUsIDB4OTYsIDB4NzUsIDB4OTcsIDB4ODQsCi0JCTB4OTgsIDB4OTMsIDB4OTksIDB4YTEsIDB4OWEsIDB4YjAsIDB4OWIsIDB4YmQsIDB4OWMsIDB4Y2EsCi0JCTB4OWQsIDB4ZDgsIDB4OWUsIDB4ZTUsIDB4OWYsIDB4ZjIsCi0JCTB4YTAsIDB4ZmYKLQl9OwkJCS8qIEdhbW1hICovCisJc3RhdGljIGNvbnN0IF9fdTggbnNldDVbXSA9CisJCQl7IDB4OGYsIDB4MjQsIDB4YzMsIDB4MDAgfTsJLyogYnJpZ2h0ICovCiAJc3RhdGljIGNvbnN0IF9fdTggbnNldDdbNF0gPQogCQkJeyAweDY2LCAweGNhLCAweGE4LCAweGY4IH07CS8qIDUwLzYwIEh6ICovCiAJc3RhdGljIGNvbnN0IF9fdTggbnNldDlbNF0gPQpAQCAtNTA1LDk1ICs1NTQsMTExIEBACiAJc3RhdGljIGNvbnN0IF9fdTggbnNldDEwWzZdID0KIAkJCXsgMHgwYywgMHgwMywgMHhhYiwgMHgxMCwgMHg4MSwgMHgyMCB9OwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG4xLCAweDA2KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldCwgMHgwNik7Ci0JcmVnX3JfMShnc3BjYV9kZXYsIDB4MDA2Myk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG4yLCAweDAyKTsKKwlieXRlID0gcmVnX3IoZ3NwY2FfZGV2LCAweDA2KTsKKwl0ZXN0X2J5dGUgPSByZWdfcihnc3BjYV9kZXYsIDB4MDcpOworCWlmIChieXRlID09IDB4MDggJiYgdGVzdF9ieXRlID09IDB4MDcpIHsKKwkJUERFQlVHKERfQ09ORiwgIm90aGVyIHNlbnNvciIpOworCQlzZC0+c2Vuc29yID0gU0VOU09SX09USEVSOworCX0gZWxzZSB7CisJCVBERUJVRyhEX0NPTkYsICJzZW5zb3IgJTAyeCAlMDJ4IiwgYnl0ZSwgdGVzdF9ieXRlKTsKKwkJc2QtPnNlbnNvciA9IFNFTlNPUl9UQVM1MTMwQTsKKwl9CiAKKwlpMmNfdyhnc3BjYV9kZXYsIG4xLCBzaXplb2YgbjEpOworCXRlc3RfYnl0ZSA9IDA7CisJaSA9IDU7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWkyY193KGdzcGNhX2RldiwgbnNldCwgc2l6ZW9mIG5zZXQpOworCQltc2xlZXAoNSk7CisJCXRlc3RfYnl0ZSA9IHJlZ19yKGdzcGNhX2RldiwgMHgwMDYzKTsKKwkJbXNsZWVwKDEwMCk7CisJCWlmICh0ZXN0X2J5dGUgPT0gMHgxNykKKwkJCWJyZWFrOwkJLyogT0sgKi8KKwl9CisJaWYgKGkgPCAwKSB7CisJCWVycigiQmFkIHNlbnNvciByZXNldCAlMDJ4IiwgdGVzdF9ieXRlKTsKKy8qCQlyZXR1cm4gLUVJTzsgKi8KKy8qZml4bWU6IHRlc3QgLSBjb250aW51ZSAqLworCX0KKwlpMmNfdyhnc3BjYV9kZXYsIG4yLCBzaXplb2YgbjIpOworCisJaSA9IDA7CiAJd2hpbGUgKHJlYWRfaW5kZXhzW2ldICE9IDB4MDApIHsKLQkJdGVzdF9ieXRlID0gcmVnX3JfMShnc3BjYV9kZXYsIHJlYWRfaW5kZXhzW2ldKTsKLQkJUERFQlVHKERfQ09ORiwgIlJlZyAweCUwMnggPT4gMHglMDJ4IiwgcmVhZF9pbmRleHNbaV0sCisJCXRlc3RfYnl0ZSA9IHJlZ19yKGdzcGNhX2RldiwgcmVhZF9pbmRleHNbaV0pOworCQlQREVCVUcoRF9TVFJFQU0sICJSZWcgMHglMDJ4ID0gMHglMDJ4IiwgcmVhZF9pbmRleHNbaV0sCiAJCSAgICAgICB0ZXN0X2J5dGUpOwogCQlpKys7CiAJfQogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG4zLCAweDA2KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbjQsIDB4NDYpOwotCXJlZ19yXzEoZ3NwY2FfZGV2LCAweDAwODApOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgyYzgwLCBOVUxMLCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldDIsIDB4MTQpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCBuc2V0MywgMHgxMik7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG5zZXQ0LCAweDEyKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4Mzg4MCwgTlVMTCwgMCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDM4ODAsIE5VTEwsIDApOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgzMzhlLCBOVUxMLCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldDUsIDB4MDQpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwMGE5LCBOVUxMLCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldDYsIDB4MjIpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHg4NmJiLCBOVUxMLCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4NGFhNiwgTlVMTCwgMCk7CisJaTJjX3coZ3NwY2FfZGV2LCBuMywgc2l6ZW9mIG4zKTsKKwlpMmNfdyhnc3BjYV9kZXYsIG40LCBzaXplb2YgbjQpOworCXJlZ19yKGdzcGNhX2RldiwgMHgwMDgwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MmM4MCk7CisJaTJjX3coZ3NwY2FfZGV2LCBuc2V0Miwgc2l6ZW9mIG5zZXQyKTsKKwlpMmNfdyhnc3BjYV9kZXYsIG5zZXQzLCBzaXplb2YgbnNldDMpOworCWkyY193KGdzcGNhX2RldiwgbnNldDQsIHNpemVvZiBuc2V0NCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDM4ODApOworCXJlZ193KGdzcGNhX2RldiwgMHgzODgwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MzM4ZSk7CisJaTJjX3coZ3NwY2FfZGV2LCBuc2V0NSwgc2l6ZW9mIG5zZXQ1KTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MDBhOSk7CisJc2V0Z2FtbWEoZ3NwY2FfZGV2KTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4ODZiYik7CisJcmVnX3coZ3NwY2FfZGV2LCAweDRhYTYpOwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG1pc3NpbmcsIDB4MDgpOworCWkyY193KGdzcGNhX2RldiwgbWlzc2luZywgc2l6ZW9mIG1pc3NpbmcpOwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDIwODcsIE5VTEwsIDApOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgyMDg4LCBOVUxMLCAwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4MjA4OSwgTlVMTCwgMCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDIwODcpOworCXJlZ193KGdzcGNhX2RldiwgMHgyMDg4KTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MjA4OSk7CiAKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldDcsIDB4MDQpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCBuc2V0MTAsIDB4MDYpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCBuc2V0OCwgMHgwNik7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG5zZXQ5LCAweDA0KTsKKwlpMmNfdyhnc3BjYV9kZXYsIG5zZXQ3LCBzaXplb2YgbnNldDcpOworCWkyY193KGdzcGNhX2RldiwgbnNldDEwLCBzaXplb2YgbnNldDEwKTsKKwlpMmNfdyhnc3BjYV9kZXYsIG5zZXQ4LCBzaXplb2YgbnNldDgpOworCWkyY193KGdzcGNhX2RldiwgbnNldDksIHNpemVvZiBuc2V0OSk7CiAKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4Mjg4MCwgTlVMTCwgMCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIG5zZXQyLCAweDE0KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgbnNldDMsIDB4MTIpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCBuc2V0NCwgMHgxMik7CisJcmVnX3coZ3NwY2FfZGV2LCAweDI4ODApOworCWkyY193KGdzcGNhX2RldiwgbnNldDIsIHNpemVvZiBuc2V0Mik7CisJaTJjX3coZ3NwY2FfZGV2LCBuc2V0Mywgc2l6ZW9mIG5zZXQzKTsKKwlpMmNfdyhnc3BjYV9kZXYsIG5zZXQ0LCBzaXplb2YgbnNldDQpOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLwotc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbml0X2RlZmF1bHRfcGFyYW1ldGVycyhnc3BjYV9kZXYpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdW5zaWduZWQgaW50IGJyaWdodG5lc3M7Ci0JX191OCBzZXQ2WzRdID0geyAweDhmLCAweDI2LCAweGMzLCAweDgwIH07Ci0JYnJpZ2h0bmVzcyA9IHNkLT5icmlnaHRuZXNzOworCV9fdTggc2V0Nls0XSA9IHsgMHg4ZiwgMHgyNiwgMHhjMywgMHgwMCB9OwogCisJYnJpZ2h0bmVzcyA9IHNkLT5icmlnaHRuZXNzOwogCWlmIChicmlnaHRuZXNzIDwgNykgewotCQlzZXQ2WzNdID0gMHg3MCAtIChicmlnaHRuZXNzICogMHhhKTsKKwkJc2V0NlszXSA9IDB4NzAgLSBicmlnaHRuZXNzICogMHgxMDsKIAl9IGVsc2UgewogCQlzZXQ2WzFdID0gMHgyNDsKLQkJc2V0NlszXSA9IDB4MDAgKyAoKGJyaWdodG5lc3MgLSA3KSAqIDB4YSk7CisJCXNldDZbM10gPSAweDAwICsgKChicmlnaHRuZXNzIC0gNykgKiAweDEwKTsKIAl9CiAKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgc2V0NiwgNCk7CisJaTJjX3coZ3NwY2FfZGV2LCBzZXQ2LCBzaXplb2Ygc2V0Nik7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQogCV9fdTggZmxpcGNtZFs4XSA9Ci0JICAgIHsgMHg2MiwgMHgwNywgMHg2MywgMHgwMywgMHg2NCwgMHgwMCwgMHg2MCwgMHgwOSB9OworCQl7MHg2MiwgMHgwNywgMHg2MywgMHgwMywgMHg2NCwgMHgwMCwgMHg2MCwgMHgwOX07CiAKLQlpZiAoc2QtPm1pcnJvciA9PSAxKQorCWlmIChzZC0+bWlycm9yKQogCQlmbGlwY21kWzNdID0gMHgwMTsKIAotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCBmbGlwY21kLCA4KTsKKwlpMmNfdyhnc3BjYV9kZXYsIGZsaXBjbWQsIHNpemVvZiBmbGlwY21kKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0ZWZmZWN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgZWZmZWN0c190YWJsZVtzZC0+ZWZmZWN0XSwgMHgwNik7CisJaTJjX3coZ3NwY2FfZGV2LCBlZmZlY3RzX3RhYmxlW3NkLT5lZmZlY3RdLCBzaXplb2YgZWZmZWN0c190YWJsZVswXSk7CiAJaWYgKHNkLT5lZmZlY3QgPT0gMSB8fCBzZC0+ZWZmZWN0ID09IDUpIHsKIAkJUERFQlVHKERfQ09ORiwKIAkJICAgICAgICJUaGlzIGVmZmVjdCBoYXZlIGJlZW4gZGlzYWJsZWQgZm9yIHdlYmNhbSBcInNhZmV0eVwiIik7CkBAIC02MDEsOSArNjY2LDkgQEAKIAl9CiAKIAlpZiAoc2QtPmVmZmVjdCA9PSAxIHx8IHNkLT5lZmZlY3QgPT0gNCkKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDRhYTYsIE5VTEwsIDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NGFhNik7CiAJZWxzZQotCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4ZmFhNiwgTlVMTCwgMCk7CisJCXJlZ193KGdzcGNhX2RldiwgMHhmYWE2KTsKIH0KIAogc3RhdGljIHZvaWQgc2V0d2hpdGViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTYxNiw3ICs2ODEsNyBAQAogCWlmIChzZC0+d2hpdGViYWxhbmNlID09IDEpCiAJCXdoaXRlX2JhbGFuY2VbN10gPSAweDNjOwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIHdoaXRlX2JhbGFuY2UsIDgpOworCWkyY193KGdzcGNhX2Rldiwgd2hpdGVfYmFsYW5jZSwgc2l6ZW9mIHdoaXRlX2JhbGFuY2UpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRsaWdodGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtNjI3LDIxICs2OTIsMjEgQEAKIAlpZiAoc2QtPmZyZXEgPT0gMikJLyogNjBoeiAqLwogCQlmcmVxWzFdID0gMHgwMDsKIAotCXJlZ193KGdzcGNhX2RldiwgMHgxLCAweDAwMDAsIGZyZXEsIDB4NCk7CisJaTJjX3coZ3NwY2FfZGV2LCBmcmVxLCBzaXplb2YgZnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJdW5zaWduZWQgaW50IGNvbnRyYXN0ID0gc2QtPmNvbnRyYXN0OwotCV9fdTE2IHJlZ190b193cml0ZSA9IDB4MDA7CisJX191MTYgcmVnX3RvX3dyaXRlOwogCiAJaWYgKGNvbnRyYXN0IDwgNykKIAkJcmVnX3RvX3dyaXRlID0gMHg4ZWE5IC0gKDB4MjAwICogY29udHJhc3QpOwogCWVsc2UKIAkJcmVnX3RvX3dyaXRlID0gKDB4MDBhOSArICgoY29udHJhc3QgLSA3KSAqIDB4MjAwKSk7CiAKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIHJlZ190b193cml0ZSwgTlVMTCwgMCk7CisJcmVnX3coZ3NwY2FfZGV2LCByZWdfdG9fd3JpdGUpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpAQCAtNjUwLDExICs3MTUsNyBAQAogCV9fdTE2IHJlZ190b193cml0ZTsKIAogCXJlZ190b193cml0ZSA9IDB4YzBiYiArIHNkLT5jb2xvcnMgKiAweDEwMDsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIHJlZ190b193cml0ZSwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldGdhbW1hKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKKwlyZWdfdyhnc3BjYV9kZXYsIHJlZ190b193cml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldHNoYXJwbmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCkBAIC02NjQsNyArNzI1LDk5IEBACiAKIAlyZWdfdG9fd3JpdGUgPSAweDBhYTYgKyAweDEwMDAgKiBzZC0+c2hhcnBuZXNzOwogCi0JcmVnX3coZ3NwY2FfZGV2LCAweDAwLCByZWdfdG9fd3JpdGUsIE5VTEwsIDApOworCXJlZ193KGdzcGNhX2RldiwgcmVnX3RvX3dyaXRlKTsKK30KKworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpLCBtb2RlOworCXN0YXRpYyBjb25zdCBfX3U4IHQxW10gPSB7IDB4NjYsIDB4MDAsIDB4YTgsIDB4ZTggfTsKKwlfX3U4IHQyW10gPSB7IDB4MDcsIDB4MDAsIDB4MGQsIDB4NjAsIDB4MGUsIDB4ODAgfTsKKwlzdGF0aWMgY29uc3QgX191OCB0M1tdID0KKwkJeyAweGIzLCAweDA3LCAweGI0LCAweDAwLCAweGI1LCAweDg4LCAweGI2LCAweDAyLCAweGI3LCAweDA2LAorCQkgIDB4YjgsIDB4MDAsIDB4YjksIDB4ZTcsIDB4YmEsIDB4MDEgfTsKKwlzdGF0aWMgY29uc3QgX191OCB0NFtdID0geyAweDBiLCAweDA0LCAweDBhLCAweDQwIH07CisKKwltb2RlID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKGludCkgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLiBwcml2OworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMToJCS8qIDM1MngyODggKi8KKwkJdDJbMV0gPSAweDQwOworCQlicmVhazsKKwljYXNlIDI6CQkvKiAzMjB4MjQwICovCisJCXQyWzFdID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogMTc2eDE0NCAqLworCQl0MlsxXSA9IDB4NTA7CisJCWJyZWFrOworCWNhc2UgNDoJCS8qIDE2MHgxMjAgKi8KKwkJdDJbMV0gPSAweDIwOworCQlicmVhazsKKwlkZWZhdWx0OgkvKiA2NDB4NDgwICgweDAwKSAqLworCQlicmVhazsKKwl9CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfVEFTNTEzMEEpIHsKKwkJaSA9IDA7CisJCXdoaWxlICh0YXM1MTMwYV9zZW5zb3JfaW5pdFtpXVswXSAhPSAwKSB7CisJCQlpMmNfdyhnc3BjYV9kZXYsIHRhczUxMzBhX3NlbnNvcl9pbml0W2ldLAorCQkJCQkgc2l6ZW9mIHRhczUxMzBhX3NlbnNvcl9pbml0WzBdKTsKKwkJCWkrKzsKKwkJfQorCQlyZWdfdyhnc3BjYV9kZXYsIDB4M2M4MCk7CisJCS8qIGp1c3QgaW4gY2FzZSBhbmQgdG8ga2VlcCBzeW5jIHdpdGggbG9ncyAoZm9yIG1pbmUpICovCisJCWkyY193KGdzcGNhX2RldiwgdGFzNTEzMGFfc2Vuc29yX2luaXRbM10sCisJCQkJIHNpemVvZiB0YXM1MTMwYV9zZW5zb3JfaW5pdFswXSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHgzYzgwKTsKKwl9IGVsc2UgeworCQlvdGhlcl9zZW5zb3JfaW5pdChnc3BjYV9kZXYpOworCX0KKwkvKiBqdXN0IGluIGNhc2UgYW5kIHRvIGtlZXAgc3luYyB3aXRoIGxvZ3MgIChmb3IgbWluZSkgKi8KKwlpMmNfdyhnc3BjYV9kZXYsIHQxLCBzaXplb2YgdDEpOworCWkyY193KGdzcGNhX2RldiwgdDIsIHNpemVvZiB0Mik7CisJcmVnX3IoZ3NwY2FfZGV2LCAweDAwMTIpOworCWkyY193KGdzcGNhX2RldiwgdDMsIHNpemVvZiB0Myk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDAwMTMpOworCWkyY193KGdzcGNhX2RldiwgdDQsIHNpemVvZiB0NCk7CisJLyogcmVzdGFydCBvbiBlYWNoIHN0YXJ0LCBqdXN0IGluIGNhc2UsIHNvbWV0aW1lcyByZWdzIGdvZXMgd3JvbmcKKwkgKiB3aGVuIHVzaW5nIGNvbnRyb2xzIGZyb20gYXBwICovCisJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOworCXNldGNvbnRyYXN0KGdzcGNhX2Rldik7CisJc2V0Y29sb3JzKGdzcGNhX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCS8qIHRhcmdldCAqLworCQkJX191OCAqZGF0YSwJCQkvKiBpc29jIHBhY2tldCAqLworCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLworeworCXN0YXRpYyBfX3U4IGZmZDlbXSA9IHsgMHhmZiwgMHhkOSB9OworCisJaWYgKGRhdGFbMF0gPT0gMHg1YSkgeworCQkvKiBDb250cm9sIFBhY2tldCwgYWZ0ZXIgdGhpcyBjYW1lIHRoZSBoZWFkZXIgYWdhaW4sCisJCSAqIGJ1dCBleHRyYSBieXRlcyBjYW1lIGluIHRoZSBwYWNrZXQgYmVmb3JlIHRoaXMsCisJCSAqIHNvbWV0aW1lcyBhbiBFT0YgYXJyaXZlcywgc29tZXRpbWVzIG5vdC4uLiAqLworCQlyZXR1cm47CisJfQorCWRhdGEgKz0gMjsKKwlsZW4gLT0gMjsKKwlpZiAoZGF0YVswXSA9PSAweGZmICYmIGRhdGFbMV0gPT0gMHhkOCkgeworCQkvKiBleHRyYSBieXRlcy4uLi4uLCBjb3VsZCBiZSBwcm9jZXNzZWQgdG9vIGJ1dCB3b3VsZCBiZQorCQkgKiBhIHdhc3RlIG9mIHRpbWUsIHJpZ2h0IG5vdyBsZWF2ZSB0aGUgYXBwbGljYXRpb24gYW5kCisJCSAqIGxpYmpwZWcgZG8gaXQgZm9yIG91cnNlcmx2ZXMuLiAqLworCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKKwkJCQkJZmZkOSwgMik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGF0YVtsZW4gLSAyXSA9PSAweGZmICYmIGRhdGFbbGVuIC0gMV0gPT0gMHhkOSkgeworCQkvKiBKdXN0IGluIGNhc2UsIGkgaGF2ZSBzZWVuIHBhY2tldHMgd2l0aCB0aGUgbWFya2VyLAorCQkgKiBvdGhlcidzIGRvIG5vdCBpbmNsdWRlIGl0Li4uICovCisJCWxlbiAtPSAyOworCX0KKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCkBAIC03ODgsNiArOTQxLDcgQEAKIHN0YXRpYyBpbnQgc2RfZ2V0Z2FtbWEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwogCSp2YWwgPSBzZC0+Z2FtbWE7CiAJcmV0dXJuIDA7CiB9CkBAIC04MzUsOSArOTg5LDkgQEAKIAogCXNkLT5hdXRvZ2FpbiA9IHZhbDsKIAlpZiAodmFsICE9IDApCi0JCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHhmNDhlLCBOVUxMLCAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGY0OGUpOwogCWVsc2UKLQkJcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweGI0OGUsIE5VTEwsIDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4YjQ4ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0OSw5OSArMTAwMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgbW9kZTsKLQotCXN0YXRpYyBjb25zdCBfX3U4IHQxW10gPSB7IDB4NjYsIDB4MDAsIDB4YTgsIDB4ZTggfTsKLQlfX3U4IHQyW10gPSB7IDB4MDcsIDB4MDAsIDB4MGQsIDB4NjAsIDB4MGUsIDB4ODAgfTsKLQlzdGF0aWMgY29uc3QgX191OCB0M1tdID0KLQkJeyAweGIzLCAweDA3LCAweGI0LCAweDAwLCAweGI1LCAweDg4LCAweGI2LCAweDAyLCAweGI3LCAweDA2LAotCQkgIDB4YjgsIDB4MDAsIDB4YjksIDB4ZTcsIDB4YmEsIDB4MDEgfTsKLQlzdGF0aWMgY29uc3QgX191OCB0NFtdID0geyAweDBiLCAweDA0LCAweDBhLCAweDQwIH07Ci0KLQltb2RlID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbKGludCkgZ3NwY2FfZGV2LT5jdXJyX21vZGVdLiBwcml2OwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgMToJCS8qIDM1MngyODggKi8KLQkJdDJbMV0gPSAweDQwOwotCQlicmVhazsKLQljYXNlIDI6CQkvKiAzMjB4MjQwICovCi0JCXQyWzFdID0gMHgxMDsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJLyogMTc2eDE0NCAqLwotCQl0MlsxXSA9IDB4NTA7Ci0JCWJyZWFrOwotCWNhc2UgNDoJCS8qIDE2MHgxMjAgKi8KLQkJdDJbMV0gPSAweDIwOwotCQlicmVhazsKLQlkZWZhdWx0OgkvKiA2NDB4NDgwICgweDAwKSAqLwotCQlicmVhazsKLQl9Ci0KLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgdGFzNTEzMGFfc2Vuc29yX2luaXRbMF0sIDB4OCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIHRhczUxMzBhX3NlbnNvcl9pbml0WzFdLCAweDgpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCB0YXM1MTMwYV9zZW5zb3JfaW5pdFsyXSwgMHg4KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgdGFzNTEzMGFfc2Vuc29yX2luaXRbM10sIDB4OCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDNjODAsIE5VTEwsIDApOwotCQkvKiBqdXN0IGluIGNhc2UgYW5kIHRvIGtlZXAgc3luYyB3aXRoIGxvZ3MgIChmb3IgbWluZSkgKi8KLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgdGFzNTEzMGFfc2Vuc29yX2luaXRbM10sIDB4OCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAwLCAweDNjODAsIE5VTEwsIDApOwotCQkvKiBqdXN0IGluIGNhc2UgYW5kIHRvIGtlZXAgc3luYyB3aXRoIGxvZ3MgIChmb3IgbWluZSkgKi8KLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDEsIDB4MDAwMCwgdDEsIDQpOwotCXJlZ193KGdzcGNhX2RldiwgMHgwMSwgMHgwMDAwLCB0MiwgNik7Ci0JcmVnX3JfMShnc3BjYV9kZXYsIDB4MDAxMik7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIHQzLCAweDEwKTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MDAsIDB4MDAxMywgTlVMTCwgMCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweDAxLCAweDAwMDAsIHQ0LCAweDQpOwotCS8qIHJlc3RhcnQgb24gZWFjaCBzdGFydCwganVzdCBpbiBjYXNlLCBzb21ldGltZXMgcmVncyBnb2VzIHdyb25nCi0JICogd2hlbiB1c2luZyBjb250cm9scyBmcm9tIGFwcCAqLwotCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKLQlzZXRjb250cmFzdChnc3BjYV9kZXYpOwotCXNldGNvbG9ycyhnc3BjYV9kZXYpOwotfQotCi1zdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCi0JCQlzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lLAkvKiB0YXJnZXQgKi8KLQkJCV9fdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KLQkJCWludCBsZW4pCQkJLyogaXNvIHBhY2tldCBsZW5ndGggKi8KLXsKLQlpbnQgc29mID0gMDsKLQlzdGF0aWMgX191OCBmZmQ5W10gPSB7IDB4ZmYsIDB4ZDkgfTsKLQotCWlmIChkYXRhWzBdID09IDB4NWEpIHsKLQkJLyogQ29udHJvbCBQYWNrZXQsIGFmdGVyIHRoaXMgY2FtZSB0aGUgaGVhZGVyIGFnYWluLAotCQkgKiBidXQgZXh0cmEgYnl0ZXMgY2FtZSBpbiB0aGUgcGFja2V0IGJlZm9yZSB0aGlzLAotCQkgKiBzb21ldGltZXMgYW4gRU9GIGFycml2ZXMsIHNvbWV0aW1lcyBub3QuLi4gKi8KLQkJcmV0dXJuOwotCX0KLQotCWlmIChkYXRhW2xlbiAtIDFdID09IDB4ZmYgJiYgZGF0YVtsZW5dID09IDB4ZDkpIHsKLQkJLyogSnVzdCBpbiBjYXNlLCBpIGhhdmUgc2VlbiBwYWNrZXRzIHdpdGggdGhlIG1hcmtlciwKLQkJICogb3RoZXIncyBkbyBub3QgaW5jbHVkZSBpdC4uLiAqLwotCQlkYXRhICs9IDI7Ci0JCWxlbiAtPSA0OwotCX0gZWxzZSBpZiAoZGF0YVsyXSA9PSAweGZmICYmIGRhdGFbM10gPT0gMHhkOCkgewotCQlzb2YgPSAxOwotCQlkYXRhICs9IDI7Ci0JCWxlbiAtPSAyOwotCX0gZWxzZSB7Ci0JCWRhdGEgKz0gMjsKLQkJbGVuIC09IDI7Ci0JfQotCi0JaWYgKHNvZikgewotCQkvKiBleHRyYSBieXRlcy4uLi4uLCBjb3VsZCBiZSBwcm9jZXNzZWQgdG9vIGJ1dCB3b3VsZCBiZQotCQkgKiBhIHdhc3RlIG9mIHRpbWUsIHJpZ2h0IG5vdyBsZWF2ZSB0aGUgYXBwbGljYXRpb24gYW5kCi0JCSAqIGxpYmpwZWcgZG8gaXQgZm9yIG91cnNlcmx2ZXMuLiAqLwotCQlmcmFtZSA9IGdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBmcmFtZSwKLQkJCQkJZmZkOSwgMik7Ci0JCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZnJhbWUsIGRhdGEsIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsIGZyYW1lLCBkYXRhLCBsZW4pOwotfQotCiBzdGF0aWMgaW50IHNkX3F1ZXJ5bWVudShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCiAJCQlzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKm1lbnUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90djg1MzIuYwppbmRleCAwODRhZjA1Li45NjhhNTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3R2ODUzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdHY4NTMyLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogfQogCiAvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCi1zdGF0aWMgdm9pZCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKIAlyZWdfd18xKGdzcGNhX2RldiwgVFY4NTMyX0FEX1NMT1BFLCAweDMyKTsKIAlyZWdfd18xKGdzcGNhX2RldiwgVFY4NTMyX0FEX0JJVENUUkwsIDB4MDApOwpAQCAtNDQzLDYgKzQ0Myw3IEBACiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAl0dl84NTMyX1BvbGxSZWcoZ3NwY2FfZGV2KTsKIAlyZWdfd18xKGdzcGNhX2RldiwgVFY4NTMyX1VEUF9VUERBVEUsIDB4MDApOwkvKiAweDMxICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNkX3N0b3BOKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCmluZGV4IGJkNGMyMjYuLmJlNDZkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYwpAQCAtODAsNyArODAsNiBAQAogCQkuc3RlcCAgICA9IDEsCiAjZGVmaW5lIEZSRVFfREVGIDEKIAkJLmRlZmF1bHRfdmFsdWUgPSBGUkVRX0RFRiwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxLAogCSAgICB9LAogCSAgICAuc2V0ID0gc2Rfc2V0ZnJlcSwKIAkgICAgLmdldCA9IHNkX2dldGZyZXEsCkBAIC0xNTAyLDcgKzE1MDEsNyBAQAogCXVzYl9leGNoYW5nZShnc3BjYV9kZXYsIG92NzY2MF9mcmVxX3RiW3NkLT5saWdodGZyZXFdKTsKIH0KIAotc3RhdGljIHZvaWQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQorc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCWNvbnN0IF9fdTggKkdhbW1hVCA9IE5VTEw7CkBAIC0xNTg2LDcgKzE1ODUsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlQREVCVUcoRF9QUk9CRSwgIkRhbW5lZCAhISBubyBzZW5zb3IgZm91bmQgQnllIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FTUVESVVNVFlQRTsKIAl9CiAJaWYgKEdhbW1hVCAmJiBNYXRyaXhUKSB7CiAJCXB1dF90YWJfdG9fcmVnKGdzcGNhX2RldiwgR2FtbWFULCAxNywgMHhiODRhKTsKQEAgLTE2MjIsNiArMTYyMSw3IEBACiAJCXNldGF1dG9nYWluKGdzcGNhX2Rldik7CiAJCXNldGxpZ2h0ZnJlcShnc3BjYV9kZXYpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCmluZGV4IDhkN2MyN2UuLmQwYTQ0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKQEAgLTY1NzYsOCArNjU3Niw4IEBACiAJCSBjczIxMDJfNjBIWiwgY3MyMTAyXzYwSFpTY2FsZX0sCiAvKiBTRU5TT1JfQ1MyMTAySyAxICovCiAJCXtjczIxMDJfTm9GbGlrZXIsIGNzMjEwMl9Ob0ZsaWtlclNjYWxlLAotCQkgY3MyMTAyXzUwSFosIGNzMjEwMl81MEhaU2NhbGUsCi0JCSBjczIxMDJfNjBIWiwgY3MyMTAyXzYwSFpTY2FsZX0sCisJCSBOVUxMLCBOVUxMLCAvKiBjdXJyZW50bHkgZGlzYWJsZWQgKi8KKwkJIE5VTEwsIE5VTEx9LAogLyogU0VOU09SX0dDMDMwNSAyICovCiAJCXtnYzAzMDVfTm9GbGlrZXIsIGdjMDMwNV9Ob0ZsaWtlciwKIAkJIGdjMDMwNV81MEhaLCBnYzAzMDVfNTBIWiwKQEAgLTcxNzgsNyArNzE3OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC03MzMxLDYgKzczMzEsNyBAQAogCQlyZWdfdyhkZXYsIDB4MDIsIDB4MDAwOCk7CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2Rfc3RvcDAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCBhMzAyNTRiLi5lZmU4NDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMTIsNiArMTIsMTAgQEAKICAqICAgICAgTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KICAqIG1vZGlmaWVkIGZvciBEVmlDTyBGdXNpb24gSERUViA1IFJUIEdPTEQgYnkKICAqICAgICAgQ2hhb2d1aSBaaGFuZyA8Y3poYW5nMTk3NEBnbWFpbC5jb20+CisgKiBtb2RpZmllZCBmb3IgTVNJIFRWQG55d2hlcmUgUGx1cyBieQorICogICAgICBIZW5yeSBXb25nIDxoZW5yeUBzdHVmZmVkY293Lm5ldD4KKyAqICAgICAgTWFyayBTY2h1bHR6IDxuOXhtakB5YWhvby5jb20+CisgKiAgICAgIEJyaWFuIFJvZ2VycyA8YnJpYW5fcm9nZXJzQGNvbWNhc3QubmV0PgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02NSw3ICs2OSw3IEBACiAJCQkgICAgICAgaW50IHNpemUsIGludCBvZmZzZXQpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbNl07Ci0JaW50IHN0YXJ0LCByYW5nZSwgdG9nZ2xlLCBkZXYsIGNvZGU7CisJaW50IHN0YXJ0LCByYW5nZSwgdG9nZ2xlLCBkZXYsIGNvZGUsIGlyY29kZTsKIAogCS8qIHBvbGwgSVIgY2hpcCAqLwogCWlmIChzaXplICE9IGkyY19tYXN0ZXJfcmVjdigmaXItPmMsYnVmLHNpemUpKQpAQCAtODUsNiArODksMjQgQEAKIAlpZiAoIXN0YXJ0KQogCQkvKiBubyBrZXkgcHJlc3NlZCAqLwogCQlyZXR1cm4gMDsKKwkvKgorCSAqIEhhdXBwYXVnZSByZW1vdGVzIChibGFjay9zaWx2ZXIpIGFsd2F5cyB1c2UKKwkgKiBzcGVjaWZpYyBkZXZpY2UgaWRzLiBJZiB3ZSBkbyBub3QgZmlsdGVyIHRoZQorCSAqIGRldmljZSBpZHMgdGhlbiBtZXNzYWdlcyBkZXN0aW5lZCBmb3IgZGV2aWNlcworCSAqIHN1Y2ggYXMgVFZzIChpZD0wKSB3aWxsIGdldCB0aHJvdWdoIGNhdXNpbmcKKwkgKiBtaXMtZmlyZWQgZXZlbnRzLgorCSAqCisJICogV2UgYWxzbyBmaWx0ZXIgb3V0IGludmFsaWQga2V5IHByZXNzZXMgd2hpY2gKKwkgKiBwcm9kdWNlIGFubm95aW5nIGRlYnVnIGxvZyBlbnRyaWVzLgorCSAqLworCWlyY29kZT0gKHN0YXJ0IDw8IDEyKSB8ICh0b2dnbGUgPDwgMTEpIHwgKGRldiA8PCA2KSB8IGNvZGU7CisJaWYgKChpcmNvZGUgJiAweDFmZmYpPT0weDFmZmYpCisJCS8qIGludmFsaWQga2V5IHByZXNzICovCisJCXJldHVybiAwOworCisJaWYgKGRldiE9MHgxZSAmJiBkZXYhPTB4MWYpCisJCS8qIG5vdCBhIGhhdXBwYXVnZSByZW1vdGUgKi8KKwkJcmV0dXJuIDA7CiAKIAlpZiAoIXJhbmdlKQogCQljb2RlICs9IDY0OwpAQCAtOTQsNyArMTE2LDcgQEAKIAogCS8qIHJldHVybiBrZXkgKi8KIAkqaXJfa2V5ID0gY29kZTsKLQkqaXJfcmF3ID0gKHN0YXJ0IDw8IDEyKSB8ICh0b2dnbGUgPDwgMTEpIHwgKGRldiA8PCA2KSB8IGNvZGU7CisJKmlyX3JhdyA9IGlyY29kZTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjI0LDkgKzI0NiwxNSBAQAogc3RhdGljIHZvaWQgaXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IElSX2kyYyAqaXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IElSX2kyYywgd29yayk7CisJaW50IHBvbGxpbmdfaW50ZXJ2YWwgPSAxMDA7CisKKwkvKiBNU0kgVFZAbnl3aGVyZSBQbHVzIHJlcXVpcmVzIG1vcmUgZnJlcXVlbnQgcG9sbGluZworCSAgIG90aGVyd2lzZSBpdCB3aWxsIG1pc3Mgc29tZSBrZXlwcmVzc2VzICovCisJaWYgKGlyLT5jLmFkYXB0ZXItPmlkID09IEkyQ19IV19TQUE3MTM0ICYmIGlyLT5jLmFkZHIgPT0gMHgzMCkKKwkJcG9sbGluZ19pbnRlcnZhbCA9IDUwOwogCiAJaXJfa2V5X3BvbGwoaXIpOwotCW1vZF90aW1lcigmaXItPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApKTsKKwltb2RfdGltZXIoJmlyLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocG9sbGluZ19pbnRlcnZhbCkpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDY1LDkgKzQ5MywzNyBAQAogCQkJKDEgPT0gcmMpID8gInllcyIgOiAibm8iKTsKIAkJaWYgKDEgPT0gcmMpIHsKIAkJCWlyX2F0dGFjaChhZGFwLCBwcm9iZVtpXSwgMCwgMCk7Ci0JCQlicmVhazsKKwkJCXJldHVybiAwOwogCQl9CiAJfQorCisJLyogU3BlY2lhbCBjYXNlIGZvciBNU0kgVFZAbnl3aGVyZSBQbHVzIHJlbW90ZSAqLworCWlmIChhZGFwLT5pZCA9PSBJMkNfSFdfU0FBNzEzNCkgeworCQl1OCB0ZW1wOworCisJCS8qIE1TSSBUVkBueXdoZXJlIFBsdXMgY29udHJvbGxlciBkb2Vzbid0IHNlZW0gdG8KKwkJICAgcmVzcG9uZCB0byBwcm9iZXMgdW5sZXNzIHdlIHJlYWQgc29tZXRoaW5nIGZyb20KKwkJICAgYW4gZXhpc3RpbmcgZGV2aWNlLiBXZWlyZC4uLiAqLworCisJCW1zZy5hZGRyID0gMHg1MDsKKwkJcmMgPSBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSk7CisJCQlkcHJpbnRrKDEsICJwcm9iZSAweCUwMnggQCAlczogJXNcbiIsCisJCQltc2cuYWRkciwgYWRhcC0+bmFtZSwKKwkJCSgxID09IHJjKSA/ICJ5ZXMiIDogIm5vIik7CisKKwkJLyogTm93IGRvIHRoZSBwcm9iZS4gVGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgcmVzcG9uZAorCQkgICB0byAwLWJ5dGUgcmVhZHMsIHNvIHdlIHVzZSBhIDEtYnl0ZSByZWFkIGluc3RlYWQuICovCisJCW1zZy5hZGRyID0gMHgzMDsKKwkJbXNnLmxlbiA9IDE7CisJCW1zZy5idWYgPSAmdGVtcDsKKwkJcmMgPSBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSk7CisJCWRwcmludGsoMSwgInByb2JlIDB4JTAyeCBAICVzOiAlc1xuIiwKKwkJCW1zZy5hZGRyLCBhZGFwLT5uYW1lLAorCQkJKDEgPT0gcmMpID8gInllcyIgOiAibm8iKTsKKwkJaWYgKDEgPT0gcmMpCisJCQlpcl9hdHRhY2goYWRhcCwgbXNnLmFkZHIsIDAsIDApOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuaAppbmRleCAzODFhZjFiLi4wYjhmZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmgKQEAgLTE1NCw3ICsxNTQsNyBAQAogI2RlZmluZSBJVlRWX0NBUF9FTkNPREVSIChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVFVORVIgfCBcCiAJCQkgIFY0TDJfQ0FQX0FVRElPIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwgVjRMMl9DQVBfVkJJX0NBUFRVUkUgfCBcCiAJCQkgIFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRSkKLSNkZWZpbmUgSVZUVl9DQVBfREVDT0RFUiAoVjRMMl9DQVBfVkJJX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFwKKyNkZWZpbmUgSVZUVl9DQVBfREVDT0RFUiAoVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgXAogCQkJICBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZKQogCiBzdHJ1Y3QgaXZ0dl9jYXJkX3ZpZGVvX2lucHV0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKaW5kZXggNGFmYzdlYS4uYWVhYTEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKQEAgLTYxLDE0ICs2MSwxNCBAQAogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogCiAvKiB2YXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGluIHVzZSAqLwotaW50IGl2dHZfY2FyZHNfYWN0aXZlID0gMDsKK2ludCBpdnR2X2NhcmRzX2FjdGl2ZTsKIAogLyogSWYgeW91IGhhdmUgYWxyZWFkeSBYIHY0bCBjYXJkcywgdGhlbiBzZXQgdGhpcyB0byBYLiBUaGlzIHdheQogICAgdGhlIGRldmljZSBudW1iZXJzIHN0YXkgbWF0Y2hlZC4gRXhhbXBsZTogeW91IGhhdmUgYSBXaW5UViBjYXJkCiAgICB3aXRob3V0IHJhZGlvIGFuZCBhIFBWUi0zNTAgd2l0aC4gTm9ybWFsbHkgdGhpcyB3b3VsZCBnaXZlIGEKICAgIHZpZGVvMSBkZXZpY2UgdG9nZXRoZXIgd2l0aCBhIHJhZGlvMCBkZXZpY2UgZm9yIHRoZSBQVlIuIEJ5CiAgICBzZXR0aW5nIHRoaXMgdG8gMSB5b3UgZW5zdXJlIHRoYXQgcmFkaW8wIGlzIG5vdyBhbHNvIHJhZGlvMS4gKi8KLWludCBpdnR2X2ZpcnN0X21pbm9yID0gMDsKK2ludCBpdnR2X2ZpcnN0X21pbm9yOwogCiAvKiBNYXN0ZXIgdmFyaWFibGUgZm9yIGFsbCBpdnR2IGluZm8gKi8KIHN0cnVjdCBpdnR2ICppdnR2X2NhcmRzW0lWVFZfTUFYX0NBUkRTXTsKQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkgIlx0XHRcdC0xIGlzIGF1dG9kZXRlY3QsIDAgaXMgb2ZmLCAxIGlzIG9uXG4iCiAJCSAiXHRcdFx0RGVmYXVsdCBpcyBhdXRvZGV0ZWN0Iik7CiAKLU1PRFVMRV9QQVJNX0RFU0MoaXZ0dl9maXJzdF9taW5vciwgIlNldCBtaW5vciBhc3NpZ25lZCB0byBmaXJzdCBjYXJkIik7CitNT0RVTEVfUEFSTV9ERVNDKGl2dHZfZmlyc3RfbWlub3IsICJTZXQga2VybmVsIG51bWJlciBhc3NpZ25lZCB0byBmaXJzdCBjYXJkIik7CiAKIE1PRFVMRV9BVVRIT1IoIktldmluIFRoYXllciwgQ2hyaXMgS2VubmVkeSwgSGFucyBWZXJrdWlsIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNYMjM0MTUvQ1gyMzQxNiBkcml2ZXIiKTsKQEAgLTY1NSw5ICs2NTUsOSBAQAogCiAJaWYgKGl0di0+Y2FyZCA9PSBOVUxMKSB7CiAJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX1BWUl8xNTApOwotCQlJVlRWX0VSUigiVW5rbm93biBjYXJkOiB2ZW5kb3IvZGV2aWNlOiAlMDR4LyUwNHhcbiIsCisJCUlWVFZfRVJSKCJVbmtub3duIGNhcmQ6IHZlbmRvci9kZXZpY2U6IFslMDR4OiUwNHhdXG4iLAogCQkgICAgIGl0di0+ZGV2LT52ZW5kb3IsIGl0di0+ZGV2LT5kZXZpY2UpOwotCQlJVlRWX0VSUigiICAgICAgICAgICAgICBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZTogJTA0eC8lMDR4XG4iLAorCQlJVlRWX0VSUigiICAgICAgICAgICAgICBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZTogWyUwNHg6JTA0eF1cbiIsCiAJCSAgICAgaXR2LT5kZXYtPnN1YnN5c3RlbV92ZW5kb3IsIGl0di0+ZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAkJSVZUVl9FUlIoIiAgICAgICAgICAgICAgJXMgYmFzZWRcbiIsIGNoaXBuYW1lKTsKIAkJSVZUVl9FUlIoIkRlZmF1bHRpbmcgdG8gJXMgY2FyZFxuIiwgaXR2LT5jYXJkLT5uYW1lKTsKQEAgLTcyMCw3ICs3MjAsNyBAQAogCWl0di0+c3BlZWQgPSAxMDAwOwogCiAJLyogVkJJICovCi0JaXR2LT52YmkuaW4udHlwZSA9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOworCWl0di0+dmJpLmluLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwogCWl0di0+dmJpLnNsaWNlZF9pbiA9ICZpdHYtPnZiaS5pbi5mbXQuc2xpY2VkOwogCiAJLyogSW5pdCB0aGUgc2cgdGFibGUgZm9yIG9zZC95dXYgb3V0cHV0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCmluZGV4IDJjZWI1MjIuLmJjMjk0MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC01MDcsNiArNTA2LDggQEAKIAlzdHJ1Y3QgdjRsMl9yZWN0IG1haW5fcmVjdDsKIAl1MzIgdjRsMl9zcmNfdzsKIAl1MzIgdjRsMl9zcmNfaDsKKworCXU4IHJ1bm5pbmc7IC8qIEhhdmUgYW55IGZyYW1lcyBiZWVuIGRpc3BsYXllZCAqLwogfTsKIAogI2RlZmluZSBJVlRWX1ZCSV9GUkFNRVMgMzIKQEAgLTc1MSw2ICs3NTIsMTIgQEAKIC8qIEZpcnN0LW9wZW4gaW5pdGlhbGl6YXRpb246IGxvYWQgZmlybXdhcmUsIGluaXQgY3gyNTg0MCwgZXRjLiAqLwogaW50IGl2dHZfaW5pdF9vbl9maXJzdF9vcGVuKHN0cnVjdCBpdnR2ICppdHYpOwogCisvKiBUZXN0IGlmIHRoZSBjdXJyZW50IFZCSSBtb2RlIGlzIHJhdyAoMSkgb3Igc2xpY2VkICgwKSAqLworc3RhdGljIGlubGluZSBpbnQgaXZ0dl9yYXdfdmJpKGNvbnN0IHN0cnVjdCBpdnR2ICppdHYpCit7CisJcmV0dXJuIGl0di0+dmJpLmluLnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKK30KKwogLyogVGhpcyBpcyBhIFBDSSBwb3N0IHRoaW5nLCB3aGVyZSBpZiB0aGUgcGNpIHJlZ2lzdGVyIGlzIG5vdCByZWFkLCB0aGVuCiAgICB0aGUgd3JpdGUgZG9lc24ndCBhbHdheXMgdGFrZSBlZmZlY3QgcmlnaHQgYXdheS4gQnkgcmVhZGluZyBiYWNrIHRoZQogICAgcmVnaXN0ZXIgYW55IHBlbmRpbmcgUENJIHdyaXRlcyB3aWxsIGJlIHBlcmZvcm1lZCAoaW4gb3JkZXIpLCBhbmQgc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYwppbmRleCA3ZWM1Yzk5Li5iNzQ1N2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCkBAIC0zOSw3ICszOSw3IEBACiAgICBhc3NvY2lhdGVkIFZCSSBzdHJlYW1zIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgY2xhaW1lZC4KICAgIFBvc3NpYmxlIGVycm9yIHJldHVybnM6IC1FQlVTWSBpZiBzb21lb25lIGVsc2UgaGFzIGNsYWltZWQKICAgIHRoZSBzdHJlYW0gb3IgMCBvbiBzdWNjZXNzLiAqLwotaW50IGl2dHZfY2xhaW1fc3RyZWFtKHN0cnVjdCBpdnR2X29wZW5faWQgKmlkLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgaXZ0dl9jbGFpbV9zdHJlYW0oc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsIGludCB0eXBlKQogewogCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OwogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbdHlwZV07CkBAIC03OCw3ICs3OCw3IEBACiAJaWYgKHR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKSB7CiAJCXZiaV90eXBlID0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJOwogCX0gZWxzZSBpZiAodHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYKLQkJICAgaXR2LT52YmkuaW5zZXJ0X21wZWcgJiYgaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCkgeworCQkgICBpdHYtPnZiaS5pbnNlcnRfbXBlZyAmJiAhaXZ0dl9yYXdfdmJpKGl0dikpIHsKIAkJdmJpX3R5cGUgPSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIDA7CkBAIC0zMDUsNyArMzA1LDcgQEAKIAogCWlmIChsZW4gPiB1Y291bnQpIGxlbiA9IHVjb3VudDsKIAlpZiAoaXR2LT52YmkuaW5zZXJ0X21wZWcgJiYgcy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYKLQkgICAgaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCAmJiBidWYgIT0gJml0di0+dmJpLnNsaWNlZF9tcGVnX2J1ZikgeworCSAgICAhaXZ0dl9yYXdfdmJpKGl0dikgJiYgYnVmICE9ICZpdHYtPnZiaS5zbGljZWRfbXBlZ19idWYpIHsKIAkJY29uc3QgY2hhciAqc3RhcnQgPSBidWYtPmJ1ZiArIGJ1Zi0+cmVhZHBvczsKIAkJY29uc3QgY2hhciAqcCA9IHN0YXJ0ICsgMTsKIAkJY29uc3QgdTggKnE7CkBAIC0zNzIsNyArMzcyLDcgQEAKIAkvKiBFYWNoIFZCSSBidWZmZXIgaXMgb25lIGZyYW1lLCB0aGUgdjRsMiBBUEkgc2F5cyB0aGF0IGZvciBWQkkgdGhlIGZyYW1lcyBzaG91bGQKIAkgICBhcnJpdmUgb25lLWJ5LW9uZSwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIG91dHB1dCBtb3JlIHRoYW4gb25lIFZCSSBmcmFtZSBhdCBhIHRpbWUgKi8KIAlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkgfHwKLQkJCShzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSSAmJiBpdHYtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0KSkKKwkgICAgKHMtPnR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJICYmICFpdnR2X3Jhd192YmkoaXR2KSkpCiAJCXNpbmdsZV9mcmFtZSA9IDE7CiAKIAlmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmgKaW5kZXggMmM4ZDUxOC4uZGY4MWU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuaApAQCAtMzgsMTEgKzM4LDYgQEAKIAogLyogVXRpbGl0aWVzICovCiAKLS8qIFRyeSB0byBjbGFpbSBhIHN0cmVhbSBmb3IgdGhlIGZpbGVoYW5kbGUuIFJldHVybiAwIG9uIHN1Y2Nlc3MsCi0gICAtRUJVU1kgaWYgc3RyZWFtIGFscmVhZHkgY2xhaW1lZC4gT25jZSBhIHN0cmVhbSBpcyBjbGFpbWVkLCBpdAotICAgcmVtYWlucyBjbGFpbWVkIHVudGlsIHRoZSBhc3NvY2lhdGVkIGZpbGVoYW5kbGUgaXMgY2xvc2VkLiAqLwotaW50IGl2dHZfY2xhaW1fc3RyZWFtKHN0cnVjdCBpdnR2X29wZW5faWQgKmlkLCBpbnQgdHlwZSk7Ci0KIC8qIFJlbGVhc2UgYSBwcmV2aW91c2x5IGNsYWltZWQgc3RyZWFtLiAqLwogdm9pZCBpdnR2X3JlbGVhc2Vfc3RyZWFtKHN0cnVjdCBpdnR2X3N0cmVhbSAqcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uYwppbmRleCBiYzIyOTA1Li43NGE0NDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIH0KIAogLyogWGNlaXZlIHR1bmVyIHJlc2V0IGZ1bmN0aW9uICovCi1pbnQgaXZ0dl9yZXNldF90dW5lcl9ncGlvKHZvaWQgKmRldiwgaW50IGNtZCwgaW50IHZhbHVlKQoraW50IGl2dHZfcmVzZXRfdHVuZXJfZ3Bpbyh2b2lkICpkZXYsIGludCBjb21wb25lbnQsIGludCBjbWQsIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmFsZ28gPSBkZXY7CiAJc3RydWN0IGl2dHYgKml0diA9IGFsZ28tPmRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmgKaW5kZXggOTY0YTI2NS4uNDhiNjI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uaApAQCAtMjQsNyArMjQsNyBAQAogLyogR1BJTyBzdHVmZiAqLwogdm9pZCBpdnR2X2dwaW9faW5pdChzdHJ1Y3QgaXZ0diAqaXR2KTsKIHZvaWQgaXZ0dl9yZXNldF9pcl9ncGlvKHN0cnVjdCBpdnR2ICppdHYpOwotaW50IGl2dHZfcmVzZXRfdHVuZXJfZ3Bpbyh2b2lkICpkZXYsIGludCBjbWQsIGludCB2YWx1ZSk7CitpbnQgaXZ0dl9yZXNldF90dW5lcl9ncGlvKHZvaWQgKmRldiwgaW50IGNvbXBvbmVudCwgaW50IGNtZCwgaW50IHZhbHVlKTsKIGludCBpdnR2X2dwaW8oc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgKmFyZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYwppbmRleCBhZjE1NDIzLi4yNDcwMGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuYwpAQCAtNjQsOCArNjQsNiBAQAogI2luY2x1ZGUgIml2dHYtZ3Bpby5oIgogI2luY2x1ZGUgIml2dHYtaTJjLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9pci1rYmQtaTJjLmg+Ci0KIC8qIGkyYyBpbXBsZW1lbnRhdGlvbiBmb3IgY3gyMzQxNS82IGNoaXAsIGl2dHYgcHJvamVjdC4KICAqIEF1dGhvcjogS2V2aW4gVGhheWVyIChudWZhbl93ZmsgYXQgeWFob28uY29tKQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwppbmRleCA2MTAzMDMwLi44Njk2NTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKQEAgLTEwMSwxOCArMTAxLDE1IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNoZWNrX3NlcnZpY2Vfc2V0KHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpmbXQsIGludCBpc19wYWwpCitzdGF0aWMgdm9pZCBjaGVja19zZXJ2aWNlX3NldChzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqZm10LCBpbnQgaXNfcGFsKQogewogCWludCBmLCBsOwotCXUxNiBzZXQgPSAwOwogCiAJZm9yIChmID0gMDsgZiA8IDI7IGYrKykgewogCQlmb3IgKGwgPSAwOyBsIDwgMjQ7IGwrKykgewogCQkJZm10LT5zZXJ2aWNlX2xpbmVzW2ZdW2xdID0gc2VsZWN0X3NlcnZpY2VfZnJvbV9zZXQoZiwgbCwgZm10LT5zZXJ2aWNlX2xpbmVzW2ZdW2xdLCBpc19wYWwpOwotCQkJc2V0IHw9IGZtdC0+c2VydmljZV9saW5lc1tmXVtsXTsKIAkJfQogCX0KLQlyZXR1cm4gc2V0ICE9IDA7CiB9CiAKIHUxNiBpdnR2X2dldF9zZXJ2aWNlX3NldChzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqZm10KQpAQCAtNDc0LDcgKzQ3MSw3IEBACiAJaW50IGggPSBmbXQtPmZtdC5waXguaGVpZ2h0OwogCiAJdyA9IG1pbih3LCA3MjApOwotCXcgPSBtYXgodywgMSk7CisJdyA9IG1heCh3LCAyKTsKIAloID0gbWluKGgsIGl0di0+aXNfNTBoeiA/IDU3NiA6IDQ4MCk7CiAJaCA9IG1heChoLCAyKTsKIAlpdnR2X2dfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGZtdCk7CkBAIC01MTIsMjcgKzUwOSwyMCBAQAogc3RhdGljIGludCBpdnR2X3RyeV9mbXRfdmlkX291dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQogewogCXN0cnVjdCBpdnR2X29wZW5faWQgKmlkID0gZmg7Ci0JczMyIHcsIGg7Ci0JaW50IGZpZWxkOwotCWludCByZXQ7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisJczMyIHcgPSBmbXQtPmZtdC5waXgud2lkdGg7CisJczMyIGggPSBmbXQtPmZtdC5waXguaGVpZ2h0OworCWludCBmaWVsZCA9IGZtdC0+Zm10LnBpeC5maWVsZDsKKwlpbnQgcmV0ID0gaXZ0dl9nX2ZtdF92aWRfb3V0KGZpbGUsIGZoLCBmbXQpOwogCi0JdyA9IGZtdC0+Zm10LnBpeC53aWR0aDsKLQloID0gZm10LT5mbXQucGl4LmhlaWdodDsKLQlmaWVsZCA9IGZtdC0+Zm10LnBpeC5maWVsZDsKLQlyZXQgPSBpdnR2X2dfZm10X3ZpZF9vdXQoZmlsZSwgZmgsIGZtdCk7CisJdyA9IG1pbih3LCA3MjApOworCXcgPSBtYXgodywgMik7CisJaCA9IG1pbihoLCBpdHYtPmlzX291dF81MGh6ID8gNTc2IDogNDgwKTsKKwloID0gbWF4KGgsIDIpOworCWlmIChpZC0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVYpCisJCWZtdC0+Zm10LnBpeC5maWVsZCA9IGZpZWxkOwogCWZtdC0+Zm10LnBpeC53aWR0aCA9IHc7CiAJZm10LT5mbXQucGl4LmhlaWdodCA9IGg7Ci0JaWYgKCFyZXQgJiYgaWQtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWKSB7Ci0JCWZtdC0+Zm10LnBpeC5maWVsZCA9IGZpZWxkOwotCQlpZiAoZm10LT5mbXQucGl4LndpZHRoIDwgMikKLQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9IDI7Ci0JCWlmIChmbXQtPmZtdC5waXgud2lkdGggPiA3MjApCi0JCQlmbXQtPmZtdC5waXgud2lkdGggPSA3MjA7Ci0JCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0IDwgMikKLQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSAyOwotCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA+IDU3NikKLQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSA1NzY7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2MCw5ICs1NTAsOSBAQAogCXN0cnVjdCBpdnR2X29wZW5faWQgKmlkID0gZmg7CiAJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CiAJc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnAgPSAmaXR2LT5wYXJhbXM7CisJaW50IHJldCA9IGl2dHZfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmbXQpOwogCWludCB3ID0gZm10LT5mbXQucGl4LndpZHRoOwogCWludCBoID0gZm10LT5mbXQucGl4LmhlaWdodDsKLQlpbnQgcmV0ID0gaXZ0dl90cnlfZm10X3ZpZF9jYXAoZmlsZSwgZmgsIGZtdCk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTg1LDggKzU3NSwxMSBAQAogewogCXN0cnVjdCBpdnR2ICppdHYgPSAoKHN0cnVjdCBpdnR2X29wZW5faWQgKilmaCktPml0djsKIAorCWlmICghaXZ0dl9yYXdfdmJpKGl0dikgJiYgYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA+IDApCisJCXJldHVybiAtRUJVU1k7CiAJaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9IDA7Ci0JaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0ZNVCwgJml0di0+dmJpLmluKTsKKwlpdHYtPnZiaS5pbi50eXBlID0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTsKKwlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCBmbXQpOwogCXJldHVybiBpdnR2X2dfZm10X3ZiaV9jYXAoZmlsZSwgZmgsIGZtdCk7CiB9CiAKQEAgLTYwMCwxMCArNTkzLDEwIEBACiAJaWYgKHJldCB8fCBpZC0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoY2hlY2tfc2VydmljZV9zZXQodmJpZm10LCBpdHYtPmlzXzUwaHopID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCkKKwljaGVja19zZXJ2aWNlX3NldCh2YmlmbXQsIGl0di0+aXNfNTBoeik7CisJaWYgKGl2dHZfcmF3X3ZiaShpdHYpICYmIGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwKQogCQlyZXR1cm4gLUVCVVNZOworCWl0di0+dmJpLmluLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRTsKIAlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCBmbXQpOwogCW1lbWNweShpdHYtPnZiaS5zbGljZWRfaW4sIHZiaWZtdCwgc2l6ZW9mKCppdHYtPnZiaS5zbGljZWRfaW4pKTsKIAlyZXR1cm4gMDsKQEAgLTY1MSw4ICs2NDQsNiBAQAogCQlpdHYtPmRtYV9kYXRhX3JlcV9zaXplID0KIAkJCTEwODAgKiAoKHlpLT52NGwyX3NyY19oICsgMzEpICYgfjMxKTsKIAotCS8qIEZvcmNlIHVwZGF0ZSBvZiB5dXYgcmVnaXN0ZXJzICovCi0JeWktPnl1dl9mb3JjZWRfdXBkYXRlID0gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYxLDcgKzc1Miw3IEBACiAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgSVZUVl9EUklWRVJfTkFNRSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgaXR2LT5jYXJkX25hbWUsIHNpemVvZih2Y2FwLT5jYXJkKSk7Ci0Jc3RybGNweSh2Y2FwLT5idXNfaW5mbywgcGNpX25hbWUoaXR2LT5kZXYpLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKKwlzbnByaW50Zih2Y2FwLT5idXNfaW5mbywgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSwgIlBDSTolcyIsIHBjaV9uYW1lKGl0di0+ZGV2KSk7CiAJdmNhcC0+dmVyc2lvbiA9IElWVFZfRFJJVkVSX1ZFUlNJT047IAkgICAgLyogdmVyc2lvbiAqLwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IGl0di0+djRsMl9jYXA7IAkgICAgLyogY2FwYWJpbGl0aWVzICovCiAJcmV0dXJuIDA7CkBAIC0xMzcwLDYgKzEzNjEsOSBAQAogCWlmIChpdHYtPm9zZF9nbG9iYWxfYWxwaGFfc3RhdGUpCiAJCWZiLT5mbGFncyB8PSBWNEwyX0ZCVUZfRkxBR19HTE9CQUxfQUxQSEE7CiAKKwlpZiAoeWktPnRyYWNrX29zZCkKKwkJZmItPmZsYWdzIHw9IFY0TDJfRkJVRl9GTEFHX09WRVJMQVk7CisKIAlwaXhmbXQgJj0gNzsKIAogCS8qIG5vIGxvY2FsIGFscGhhIGZvciBSR0I1NjUgb3IgdW5rbm93biBmb3JtYXRzICovCkBAIC0xMzg5LDggKzEzODMsNiBAQAogCQllbHNlCiAJCQlmYi0+ZmxhZ3MgfD0gVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEE7CiAJfQotCWlmICh5aS0+dHJhY2tfb3NkKQotCQlmYi0+ZmxhZ3MgfD0gVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaXJxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuYwppbmRleCAzNGYzYWI4Li5mNWQwMGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJICovCiAJdW5zaWduZWQgaW50IGZyYW1lID0gcmVhZF9yZWcoMHgyOGMwKSAmIDE7CiAJc3RydWN0IHl1dl9wbGF5YmFja19pbmZvICp5aSA9ICZpdHYtPnl1dl9pbmZvOwotCWludCBsYXN0X2RtYV9mcmFtZSA9IGF0b21pY19yZWFkKCZpdHYtPnl1dl9pbmZvLm5leHRfZG1hX2ZyYW1lKTsKKwlpbnQgbGFzdF9kbWFfZnJhbWUgPSBhdG9taWNfcmVhZCgmeWktPm5leHRfZG1hX2ZyYW1lKTsKIAlzdHJ1Y3QgeXV2X2ZyYW1lX2luZm8gKmYgPSAmeWktPm5ld19mcmFtZV9pbmZvW2xhc3RfZG1hX2ZyYW1lXTsKIAogCWlmICgwKSBJVlRWX0RFQlVHX0lSUSgiREVDIFZTWU5DXG4iKTsKQEAgLTc3Miw2ICs3NzIsNyBAQAogCQkJCW5leHRfZG1hX2ZyYW1lID0gKG5leHRfZG1hX2ZyYW1lICsgMSkgJSBJVlRWX1lVVl9CVUZGRVJTOwogCQkJCWF0b21pY19zZXQoJnlpLT5uZXh0X2RtYV9mcmFtZSwgbmV4dF9kbWFfZnJhbWUpOwogCQkJCXlpLT5maWVsZHNfbGFwc2VkID0gLTE7CisJCQkJeWktPnJ1bm5pbmcgPSAxOwogCQkJfQogCQl9CiAJfQpAQCAtODA0LDkgKzgwNSwxMSBAQAogCQl9CiAKIAkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHl1diByZWdpc3RlcnMgKi8KLQkJaWYgKCh5aS0+eXV2X2ZvcmNlZF91cGRhdGUgfHwgZi0+dXBkYXRlKSAmJiBsYXN0X2RtYV9mcmFtZSAhPSAtMSkgeworCQlpZiAoeWktPnJ1bm5pbmcgJiYgKHlpLT55dXZfZm9yY2VkX3VwZGF0ZSB8fCBmLT51cGRhdGUpKSB7CiAJCQlpZiAoIWYtPnVwZGF0ZSkgewotCQkJCWxhc3RfZG1hX2ZyYW1lID0gKHU4KShsYXN0X2RtYV9mcmFtZSAtIDEpICUgSVZUVl9ZVVZfQlVGRkVSUzsKKwkJCQlsYXN0X2RtYV9mcmFtZSA9CisJCQkJCSh1OCkoYXRvbWljX3JlYWQoJnlpLT5uZXh0X2RtYV9mcmFtZSkgLQorCQkJCQkJIDEpICUgSVZUVl9ZVVZfQlVGRkVSUzsKIAkJCQlmID0gJnlpLT5uZXdfZnJhbWVfaW5mb1tsYXN0X2RtYV9mcmFtZV07CiAJCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwppbmRleCA3MzBlODVkLi41YmJmMzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCkBAIC03NSw3ICs3NSw3IEBACiBzdGF0aWMgc3RydWN0IHsKIAljb25zdCBjaGFyICpuYW1lOwogCWludCB2ZmxfdHlwZTsKLQlpbnQgbWlub3Jfb2Zmc2V0OworCWludCBudW1fb2Zmc2V0OwogCWludCBkbWEsIHBpbzsKIAllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGU7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKQEAgLTE3MSw4ICsxNzEsOCBAQAogc3RhdGljIGludCBpdnR2X3ByZXBfZGV2KHN0cnVjdCBpdnR2ICppdHYsIGludCB0eXBlKQogewogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbdHlwZV07Ci0JaW50IG1pbm9yX29mZnNldCA9IGl2dHZfc3RyZWFtX2luZm9bdHlwZV0ubWlub3Jfb2Zmc2V0OwotCWludCBtaW5vcjsKKwlpbnQgbnVtX29mZnNldCA9IGl2dHZfc3RyZWFtX2luZm9bdHlwZV0ubnVtX29mZnNldDsKKwlpbnQgbnVtID0gaXR2LT5udW0gKyBpdnR2X2ZpcnN0X21pbm9yICsgbnVtX29mZnNldDsKIAogCS8qIFRoZXNlIGZvdXIgZmllbGRzIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQuIElmIHY0bDJkZXYgPT0gTlVMTCwgdGhlbgogCSAgIHRoaXMgc3RyZWFtIGlzIG5vdCBpbiB1c2UuIEluIHRoYXQgY2FzZSBubyBvdGhlciBmaWVsZHMgYnV0IHRoZXNlCkBAIC0xODgsOSArMTg4LDYgQEAKIAlpZiAodHlwZSA+PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcgJiYgIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBjYXJkIG51bWJlciArIHVzZXIgZGVmaW5lZCBvZmZzZXQgKyBkZXZpY2Ugb2Zmc2V0ICovCi0JbWlub3IgPSBpdHYtPm51bSArIGl2dHZfZmlyc3RfbWlub3IgKyBtaW5vcl9vZmZzZXQ7Ci0KIAkvKiBVc2VyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgMCBidWZmZXJzIGZvciB0aGVzZSBzdHJlYW1zLCBzbyBkb24ndAogCSAgIGNyZWF0ZSB0aGVtLiAqLwogCWlmIChpdnR2X3N0cmVhbV9pbmZvW3R5cGVdLmRtYSAhPSBQQ0lfRE1BX05PTkUgJiYKQEAgLTIxMSw3ICsyMDgsNyBAQAogCXNucHJpbnRmKHMtPnY0bDJkZXYtPm5hbWUsIHNpemVvZihzLT52NGwyZGV2LT5uYW1lKSwgIml2dHYlZCAlcyIsCiAJCQlpdHYtPm51bSwgcy0+bmFtZSk7CiAKLQlzLT52NGwyZGV2LT5taW5vciA9IG1pbm9yOworCXMtPnY0bDJkZXYtPm51bSA9IG51bTsKIAlzLT52NGwyZGV2LT5wYXJlbnQgPSAmaXR2LT5kZXYtPmRldjsKIAlzLT52NGwyZGV2LT5mb3BzID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5mb3BzOwogCXMtPnY0bDJkZXYtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKQEAgLTI1MCwzOSArMjQ3LDQ2IEBACiB7CiAJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1t0eXBlXTsKIAlpbnQgdmZsX3R5cGUgPSBpdnR2X3N0cmVhbV9pbmZvW3R5cGVdLnZmbF90eXBlOwotCWludCBtaW5vcjsKKwlpbnQgbnVtOwogCiAJaWYgKHMtPnY0bDJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQltaW5vciA9IHMtPnY0bDJkZXYtPm1pbm9yOworCW51bSA9IHMtPnY0bDJkZXYtPm51bTsKKwkvKiBjYXJkIG51bWJlciArIHVzZXIgZGVmaW5lZCBvZmZzZXQgKyBkZXZpY2Ugb2Zmc2V0ICovCisJaWYgKHR5cGUgIT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHKSB7CisJCXN0cnVjdCBpdnR2X3N0cmVhbSAqc19tcGcgPSAmaXR2LT5zdHJlYW1zW0lWVFZfRU5DX1NUUkVBTV9UWVBFX01QR107CisKKwkJaWYgKHNfbXBnLT52NGwyZGV2KQorCQkJbnVtID0gc19tcGctPnY0bDJkZXYtPm51bSArIGl2dHZfc3RyZWFtX2luZm9bdHlwZV0ubnVtX29mZnNldDsKKwl9CisKIAkvKiBSZWdpc3RlciBkZXZpY2UuIEZpcnN0IHRyeSB0aGUgZGVzaXJlZCBtaW5vciwgdGhlbiBhbnkgZnJlZSBvbmUuICovCi0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShzLT52NGwyZGV2LCB2ZmxfdHlwZSwgbWlub3IpICYmCi0JCQl2aWRlb19yZWdpc3Rlcl9kZXZpY2Uocy0+djRsMmRldiwgdmZsX3R5cGUsIC0xKSkgewotCQlJVlRWX0VSUigiQ291bGRuJ3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UgZm9yICVzIG1pbm9yICVkXG4iLAotCQkJCXMtPm5hbWUsIG1pbm9yKTsKKwlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHMtPnY0bDJkZXYsIHZmbF90eXBlLCBudW0pKSB7CisJCUlWVFZfRVJSKCJDb3VsZG4ndCByZWdpc3RlciB2NGwyIGRldmljZSBmb3IgJXMga2VybmVsIG51bWJlciAlZFxuIiwKKwkJCQlzLT5uYW1lLCBudW0pOwogCQl2aWRlb19kZXZpY2VfcmVsZWFzZShzLT52NGwyZGV2KTsKIAkJcy0+djRsMmRldiA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwludW0gPSBzLT52NGwyZGV2LT5udW07CiAKIAlzd2l0Y2ggKHZmbF90eXBlKSB7CiAJY2FzZSBWRkxfVFlQRV9HUkFCQkVSOgogCQlJVlRWX0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHZpZGVvJWQgZm9yICVzICglZCBrQilcbiIsCi0JCQlzLT52NGwyZGV2LT5taW5vciwgcy0+bmFtZSwgaXR2LT5vcHRpb25zLmtpbG9ieXRlc1t0eXBlXSk7CisJCQludW0sIHMtPm5hbWUsIGl0di0+b3B0aW9ucy5raWxvYnl0ZXNbdHlwZV0pOwogCQlicmVhazsKIAljYXNlIFZGTF9UWVBFX1JBRElPOgogCQlJVlRWX0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHJhZGlvJWQgZm9yICVzXG4iLAotCQkJcy0+djRsMmRldi0+bWlub3IgLSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU4sIHMtPm5hbWUpOworCQkJbnVtLCBzLT5uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBWRkxfVFlQRV9WQkk6CiAJCWlmIChpdHYtPm9wdGlvbnMua2lsb2J5dGVzW3R5cGVdKQogCQkJSVZUVl9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2YmklZCBmb3IgJXMgKCVkIGtCKVxuIiwKLQkJCQlzLT52NGwyZGV2LT5taW5vciAtIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NSU4sCi0JCQkJcy0+bmFtZSwgaXR2LT5vcHRpb25zLmtpbG9ieXRlc1t0eXBlXSk7CisJCQkJbnVtLCBzLT5uYW1lLCBpdHYtPm9wdGlvbnMua2lsb2J5dGVzW3R5cGVdKTsKIAkJZWxzZQogCQkJSVZUVl9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2YmklZCBmb3IgJXNcbiIsCi0JCQkJcy0+djRsMmRldi0+bWlub3IgLSBNSU5PUl9WRkxfVFlQRV9WQklfTUlOLCBzLT5uYW1lKTsKKwkJCQludW0sIHMtPm5hbWUpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zMzAsNyArMzM0LDcgQEAKIAogc3RhdGljIHZvaWQgaXZ0dl92Ymlfc2V0dXAoc3RydWN0IGl2dHYgKml0dikKIHsKLQlpbnQgcmF3ID0gaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9PSAwOworCWludCByYXcgPSBpdnR2X3Jhd192YmkoaXR2KTsKIAl1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdOwogCWludCBsaW5lczsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKaW5kZXggMWNlOWRlYi4uNGEzN2E3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCWludCB5OwogCiAJLyogUmF3IFZCSSBkYXRhICovCi0JaWYgKHN0cmVhbXR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJICYmIGl0di0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgPT0gMCkgeworCWlmIChzdHJlYW10eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSSAmJiBpdnR2X3Jhd192YmkoaXR2KSkgewogCQl1OCB0eXBlOwogCiAJCWl2dHZfYnVmX3N3YXAoYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXl1di5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmMKaW5kZXggMzA5MmZmMS4uZWU5MTEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmMKQEAgLTExNDcsNiArMTE0Nyw3IEBACiAJSVZUVl9ERUJVR19ZVVYoIml2dHZfeXV2X2Nsb3NlXG4iKTsKIAlpdnR2X3dhaXRxKCZpdHYtPnZzeW5jX3dhaXRxKTsKIAorCXlpLT5ydW5uaW5nID0gMDsKIAlhdG9taWNfc2V0KCZ5aS0+bmV4dF9kbWFfZnJhbWUsIC0xKTsKIAlhdG9taWNfc2V0KCZ5aS0+bmV4dF9maWxsX2ZyYW1lLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHZmYi5jCmluZGV4IGJkZmRhNDguLjhhNGExNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2ZmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0dmZiLmMKQEAgLTI3NSw3ICsyNzUsNiBAQAogCQkJCSAgaW50IHNpemVfaW5fYnl0ZXMpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7Ci0JaW50IHJldCA9IDA7CiAJaW50IGdvdF9zaWcgPSAwOwogCiAJbXV0ZXhfbG9jaygmaXR2LT51ZG1hLmxvY2spOwpAQCAtMzE2LDcgKzMxNSw3IEBACiAJCXJldHVybiAtRUlOVFI7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpdnR2ZmJfcHJlcF9mcmFtZShzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqc291cmNlLApAQCAtMzY4LDExICszNjcsMTIgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgaXZ0dmZiX3dyaXRlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CiAJdm9pZCAqZHN0OwogCWludCBlcnIgPSAwOworCWludCBkbWFfZXJyOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKIAlzdHJ1Y3QgaXZ0diAqaXR2ID0gKHN0cnVjdCBpdnR2ICopIGluZm8tPnBhcjsKIAl1bnNpZ25lZCBsb25nIGRtYV9vZmZzZXQgPQpAQCAtMzk5LDcgKzM5OSw2IEBACiAJaWYgKGNvdW50ICsgcCA+IHRvdGFsX3NpemUpIHsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSAtRU5PU1BDOwotCiAJCWNvdW50ID0gdG90YWxfc2l6ZSAtIHA7CiAJfQogCkBAIC00MDgsMzkgKzQwNywzNCBAQAogCWlmIChpbmZvLT5mYm9wcy0+ZmJfc3luYykKIAkJaW5mby0+ZmJvcHMtPmZiX3N5bmMoaW5mbyk7CiAKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpIHsKLQkJSVZUVkZCX1dBUk4oIkludmFsaWQgdXNlcnNwYWNlIHBvaW50ZXIgMHglMDhseFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKWJ1Zik7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JfQotCi0JaWYgKCFlcnIpIHsKLQkJLyogSWYgdHJhbnNmZXIgc2l6ZSA+IHRocmVzaG9sZCBhbmQgYm90aCBzcmMvZHN0Ci0JCWFkZHJlc3NlcyBhcmUgYWxpZ25lZCwgdXNlIERNQSAqLwotCQlpZiAoY291bnQgPj0gNDA5NiAmJgotCQkgICAgKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDMpID09ICgodW5zaWduZWQgbG9uZylkc3QgJiAzKSkgewotCQkJLyogT2RkIGFkZHJlc3MgPSBjYW4ndCBETUEuIEFsaWduICovCi0JCQlpZiAoKHVuc2lnbmVkIGxvbmcpZHN0ICYgMykgewotCQkJCWxlYWQgPSA0IC0gKCh1bnNpZ25lZCBsb25nKWRzdCAmIDMpOwotCQkJCW1lbWNweShkc3QsIGJ1ZiwgbGVhZCk7Ci0JCQkJYnVmICs9IGxlYWQ7Ci0JCQkJZHN0ICs9IGxlYWQ7Ci0JCQl9Ci0JCQkvKiBETUEgcmVzb2x1dGlvbiBpcyAzMiBiaXRzICovCi0JCQlpZiAoKGNvdW50IC0gbGVhZCkgJiAzKQotCQkJCXRhaWwgPSAoY291bnQgLSBsZWFkKSAmIDM7Ci0JCQkvKiBETUEgdGhlIGRhdGEgKi8KLQkJCWRtYV9zaXplID0gY291bnQgLSBsZWFkIC0gdGFpbDsKLQkJCWVyciA9IGl2dHZmYl9wcmVwX2RlY19kbWFfdG9fZGV2aWNlKGl0diwKLQkJCSAgICAgICBwICsgbGVhZCArIGRtYV9vZmZzZXQsICh2b2lkICopYnVmLCBkbWFfc2l6ZSk7Ci0JCQlkc3QgKz0gZG1hX3NpemU7Ci0JCQlidWYgKz0gZG1hX3NpemU7Ci0JCQkvKiBDb3B5IGFueSBsZWZ0b3ZlciBkYXRhICovCi0JCQlpZiAodGFpbCkKLQkJCQltZW1jcHkoZHN0LCBidWYsIHRhaWwpOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KGRzdCwgYnVmLCBjb3VudCk7CisJLyogSWYgdHJhbnNmZXIgc2l6ZSA+IHRocmVzaG9sZCBhbmQgYm90aCBzcmMvZHN0CisJYWRkcmVzc2VzIGFyZSBhbGlnbmVkLCB1c2UgRE1BICovCisJaWYgKGNvdW50ID49IDQwOTYgJiYKKwkgICAgKCh1bnNpZ25lZCBsb25nKWJ1ZiAmIDMpID09ICgodW5zaWduZWQgbG9uZylkc3QgJiAzKSkgeworCQkvKiBPZGQgYWRkcmVzcyA9IGNhbid0IERNQS4gQWxpZ24gKi8KKwkJaWYgKCh1bnNpZ25lZCBsb25nKWRzdCAmIDMpIHsKKwkJCWxlYWQgPSA0IC0gKCh1bnNpZ25lZCBsb25nKWRzdCAmIDMpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgYnVmLCBsZWFkKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBsZWFkOworCQkJZHN0ICs9IGxlYWQ7CiAJCX0KKwkJLyogRE1BIHJlc29sdXRpb24gaXMgMzIgYml0cyAqLworCQlpZiAoKGNvdW50IC0gbGVhZCkgJiAzKQorCQkJdGFpbCA9IChjb3VudCAtIGxlYWQpICYgMzsKKwkJLyogRE1BIHRoZSBkYXRhICovCisJCWRtYV9zaXplID0gY291bnQgLSBsZWFkIC0gdGFpbDsKKwkJZG1hX2VyciA9IGl2dHZmYl9wcmVwX2RlY19kbWFfdG9fZGV2aWNlKGl0diwKKwkJICAgICAgIHAgKyBsZWFkICsgZG1hX29mZnNldCwgKHZvaWQgX191c2VyICopYnVmLCBkbWFfc2l6ZSk7CisJCWlmIChkbWFfZXJyKQorCQkJcmV0dXJuIGRtYV9lcnI7CisJCWRzdCArPSBkbWFfc2l6ZTsKKwkJYnVmICs9IGRtYV9zaXplOworCQkvKiBDb3B5IGFueSBsZWZ0b3ZlciBkYXRhICovCisJCWlmICh0YWlsICYmIGNvcHlfZnJvbV91c2VyKGRzdCwgYnVmLCB0YWlsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBidWYsIGNvdW50KSkgeworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlpZiAgKCFlcnIpCkBAIC00NjMsOSArNDU3LDEyIEBACiAJCQl2YmxhbmsuZmxhZ3MgPSBGQl9WQkxBTktfSEFWRV9DT1VOVCB8RkJfVkJMQU5LX0hBVkVfVkNPVU5UIHwKIAkJCQkJRkJfVkJMQU5LX0hBVkVfVlNZTkM7CiAJCQl0cmFjZSA9IHJlYWRfcmVnKDB4MDI4YzApID4+IDE2OwotCQkJaWYgKGl0di0+aXNfNTBoeiAmJiB0cmFjZSA+IDMxMikgdHJhY2UgLT0gMzEyOwotCQkJZWxzZSBpZiAoaXR2LT5pc182MGh6ICYmIHRyYWNlID4gMjYyKSB0cmFjZSAtPSAyNjI7Ci0JCQlpZiAodHJhY2UgPT0gMSkgdmJsYW5rLmZsYWdzIHw9IEZCX1ZCTEFOS19WU1lOQ0lORzsKKwkJCWlmIChpdHYtPmlzXzUwaHogJiYgdHJhY2UgPiAzMTIpCisJCQkJdHJhY2UgLT0gMzEyOworCQkJZWxzZSBpZiAoaXR2LT5pc182MGh6ICYmIHRyYWNlID4gMjYyKQorCQkJCXRyYWNlIC09IDI2MjsKKwkJCWlmICh0cmFjZSA9PSAxKQorCQkJCXZibGFuay5mbGFncyB8PSBGQl9WQkxBTktfVlNZTkNJTkc7CiAJCQl2YmxhbmsuY291bnQgPSBpdHYtPmxhc3RfdnN5bmNfZmllbGQ7CiAJCQl2YmxhbmsudmNvdW50ID0gdHJhY2U7CiAJCQl2YmxhbmsuaGNvdW50ID0gMDsKQEAgLTQ3Niw3ICs0NzMsOCBAQAogCiAJCWNhc2UgRkJJT19XQUlURk9SVlNZTkM6CiAJCQlwcmVwYXJlX3RvX3dhaXQoJml0di0+dnN5bmNfd2FpdHEsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoNTApKSkgcmMgPSAtRVRJTUVET1VUOworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoNTApKSkKKwkJCQlyYyA9IC1FVElNRURPVVQ7CiAJCQlmaW5pc2hfd2FpdCgmaXR2LT52c3luY193YWl0cSwgJndhaXQpOwogCQkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCmluZGV4IGE5ZWY3ODAuLjY0MThmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCkBAIC04NDMsMTcgKzg0MywxNiBAQAogCiBzdGF0aWMgaW50IG1leWVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgaSwgZXJyOworCWludCBpOwogCi0JZXJyID0gdmlkZW9fZXhjbHVzaXZlX29wZW4oaW5vZGUsIGZpbGUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZtZXllLmluX3VzZSkpCisJCXJldHVybiAtRUJVU1k7CiAKIAltY2hpcF9oaWNfc3RvcCgpOwogCiAJaWYgKG1jaGlwX2RtYV9hbGxvYygpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWV5ZTogbWNoaXAgZnJhbWVidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJCWNsZWFyX2JpdCgwLCAmbWV5ZS5pbl91c2UpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCkBAIC04NjgsNyArODY3LDcgQEAKIHsKIAltY2hpcF9oaWNfc3RvcCgpOwogCW1jaGlwX2RtYV9mcmVlKCk7Ci0JdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCWNsZWFyX2JpdCgwLCAmbWV5ZS5pbl91c2UpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzc0LDYgKzE3NzMsNyBAQAogCQlnb3RvIG91dG5vdGRldjsKIAl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCW1leWUubWNoaXBfZGV2ID0gcGNpZGV2OwogCW1leWUudmlkZW9fZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKCFtZXllLnZpZGVvX2RldikgewpAQCAtMTc4MSw3ICsxNzgxLDYgQEAKIAkJZ290byBvdXRub3RkZXY7CiAJfQogCi0JcmV0ID0gLUVOT01FTTsKIAltZXllLmdyYWJfdGVtcCA9IHZtYWxsb2MoTUNISVBfTkJfUEFHRVNfTUpQRUcgKiBQQUdFX1NJWkUpOwogCWlmICghbWV5ZS5ncmFiX3RlbXApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiBncmFiIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCmluZGV4IGQ1MzU3NDguLjVmNzBhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCkBAIC0zMTEsNiArMzExLDcgQEAKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXY7CS8qIHZpZGVvIGRldmljZSBwYXJhbWV0ZXJzICovCiAJc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdHVyZTsJLyogdmlkZW8gcGljdHVyZSBwYXJhbWV0ZXJzICovCiAJc3RydWN0IG1leWVfcGFyYW1zIHBhcmFtczsJLyogYWRkaXRpb25hbCBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgbG9uZyBpbl91c2U7CQkvKiBzZXQgdG8gMSBpZiB0aGUgZGV2aWNlIGlzIGluIHVzZSAqLwogI2lmZGVmIENPTkZJR19QTQogCXU4IHBtX21jaGlwX21vZGU7CQkvKiBvbGQgbWNoaXAgbW9kZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCmluZGV4IDU1NGQyMjkuLjBjNTI0MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCkBAIC0xMTcsMjQgKzExNyw1MSBAQAogCiBzdGF0aWMgaW50IG10OW0wMDFfaW5pdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKKwlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMDAxLCBpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IG10OW0wMDEtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IHJldDsKIAotCS8qIERpc2FibGUgY2hpcCwgc3luY2hyb25vdXMgb3B0aW9uIHVwZGF0ZSAqLwogCWRldl9kYmcoaWNkLT52ZGV2LT5wYXJlbnQsICIlc1xuIiwgX19mdW5jX18pOwogCi0JcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9SRVNFVCwgMSk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlNMDAxX1JFU0VULCAwKTsKLQlpZiAocmV0ID49IDApCisJaWYgKGljbC0+cG93ZXIpIHsKKwkJcmV0ID0gaWNsLT5wb3dlcigmbXQ5bTAwMS0+Y2xpZW50LT5kZXYsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihpY2QtPnZkZXYtPnBhcmVudCwKKwkJCQkiUGxhdGZvcm0gZmFpbGVkIHRvIHBvd2VyLW9uIHRoZSBjYW1lcmEuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBUaGUgY2FtZXJhIGNvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IG9uLCB3ZSByZXNldCBpdCBhZGRpdGlvbmFsbHkgKi8KKwlpZiAoaWNsLT5yZXNldCkKKwkJcmV0ID0gaWNsLT5yZXNldCgmbXQ5bTAwMS0+Y2xpZW50LT5kZXYpOworCWVsc2UKKwkJcmV0ID0gLUVOT0RFVjsKKworCWlmIChyZXQgPCAwKSB7CisJCS8qIEVpdGhlciBubyBwbGF0Zm9ybSByZXNldCwgb3IgcGxhdGZvcm0gcmVzZXQgZmFpbGVkICovCisJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfUkVTRVQsIDEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfUkVTRVQsIDApOworCX0KKwkvKiBEaXNhYmxlIGNoaXAsIHN5bmNocm9ub3VzIG9wdGlvbiB1cGRhdGUgKi8KKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9PVVRQVVRfQ09OVFJPTCwgMCk7CiAKLQlyZXR1cm4gcmV0ID49IDAgPyAwIDogLUVJTzsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10OW0wMDFfcmVsZWFzZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKKwlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMDAxLCBpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IG10OW0wMDEtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKIAkvKiBEaXNhYmxlIHRoZSBjaGlwICovCiAJcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9PVVRQVVRfQ09OVFJPTCwgMCk7CisKKwlpZiAoaWNsLT5wb3dlcikKKwkJaWNsLT5wb3dlcigmbXQ5bTAwMS0+Y2xpZW50LT5kZXYsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NywyNCArMjk0LDI0IEBACiAKIAkvKiBCbGFua2luZyBhbmQgc3RhcnQgdmFsdWVzIC0gZGVmYXVsdC4uLiAqLwogCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfSE9SSVpPTlRBTF9CTEFOS0lORywgaGJsYW5rKTsKLQlpZiAocmV0ID49IDApCisJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfVkVSVElDQUxfQkxBTktJTkcsIHZibGFuayk7CiAKIAkvKiBUaGUgY2FsbGVyIHByb3ZpZGVzIGEgc3VwcG9ydGVkIGZvcm1hdCwgYXMgdmVyaWZpZWQgcGVyCiAJICogY2FsbCB0byBpY2QtPnRyeV9mbXRfY2FwKCkgKi8KLQlpZiAocmV0ID49IDApCisJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfQ09MVU1OX1NUQVJULCByZWN0LT5sZWZ0KTsKLQlpZiAocmV0ID49IDApCisJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOU0wMDFfUk9XX1NUQVJULCByZWN0LT50b3ApOwotCWlmIChyZXQgPj0gMCkKKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5TTAwMV9XSU5ET1dfV0lEVEgsIHJlY3QtPndpZHRoIC0gMSk7Ci0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlNMDAxX1dJTkRPV19IRUlHSFQsCiAJCQkJcmVjdC0+aGVpZ2h0ICsgaWNkLT55X3NraXBfdG9wIC0gMSk7Ci0JaWYgKHJldCA+PSAwICYmIG10OW0wMDEtPmF1dG9leHBvc3VyZSkgeworCWlmICghcmV0ICYmIG10OW0wMDEtPmF1dG9leHBvc3VyZSkgewogCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlNMDAxX1NIVVRURVJfV0lEVEgsCiAJCQkJcmVjdC0+aGVpZ2h0ICsgaWNkLT55X3NraXBfdG9wICsgdmJsYW5rKTsKLQkJaWYgKHJldCA+PSAwKSB7CisJCWlmICghcmV0KSB7CiAJCQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsID0KIAkJCQlzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoaWNkLT5vcHMsCiAJCQkJCQkgICAgICBWNEwyX0NJRF9FWFBPU1VSRSk7CkBAIC0yOTUsNyArMzIyLDcgQEAKIAkJfQogCX0KIAotCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10OW0wMDFfdHJ5X2ZtdF9jYXAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGIyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYwpAQCAtMCwwICsxLDk3MyBAQAorLyoKKyAqIERyaXZlciBmb3IgTVQ5TTExMSBDTU9TIEltYWdlIFNlbnNvciBmcm9tIE1pY3JvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgUm9iZXJ0IEphcnptaWsgPHJvYmVydC5qYXJ6bWlrQGZyZWUuZnI+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKworLyoKKyAqIG10OW0xMTEgaTJjIGFkZHJlc3MgaXMgMHg1ZCBvciAweDQ4IChkZXBlbmRpbmcgb24gU0FkZHIgcGluKQorICogVGhlIHBsYXRmb3JtIGhhcyB0byBkZWZpbmUgaTJjX2JvYXJkX2luZm8gYW5kIGNhbGwgaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oKQorICovCisKKy8qIG10OW0xMTE6IFNlbnNvciByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgTVQ5TTExMV9DSElQX1ZFUlNJT04JCTB4MDAwCisjZGVmaW5lIE1UOU0xMTFfUk9XX1NUQVJUCQkweDAwMQorI2RlZmluZSBNVDlNMTExX0NPTFVNTl9TVEFSVAkJMHgwMDIKKyNkZWZpbmUgTVQ5TTExMV9XSU5ET1dfSEVJR0hUCQkweDAwMworI2RlZmluZSBNVDlNMTExX1dJTkRPV19XSURUSAkJMHgwMDQKKyNkZWZpbmUgTVQ5TTExMV9IT1JJWk9OVEFMX0JMQU5LSU5HX0IJMHgwMDUKKyNkZWZpbmUgTVQ5TTExMV9WRVJUSUNBTF9CTEFOS0lOR19CCTB4MDA2CisjZGVmaW5lIE1UOU0xMTFfSE9SSVpPTlRBTF9CTEFOS0lOR19BCTB4MDA3CisjZGVmaW5lIE1UOU0xMTFfVkVSVElDQUxfQkxBTktJTkdfQQkweDAwOAorI2RlZmluZSBNVDlNMTExX1NIVVRURVJfV0lEVEgJCTB4MDA5CisjZGVmaW5lIE1UOU0xMTFfUk9XX1NQRUVECQkweDAwYQorI2RlZmluZSBNVDlNMTExX0VYVFJBX0RFTEFZCQkweDAwYgorI2RlZmluZSBNVDlNMTExX1NIVVRURVJfREVMQVkJCTB4MDBjCisjZGVmaW5lIE1UOU0xMTFfUkVTRVQJCQkweDAwZAorI2RlZmluZSBNVDlNMTExX1JFQURfTU9ERV9CCQkweDAyMAorI2RlZmluZSBNVDlNMTExX1JFQURfTU9ERV9BCQkweDAyMQorI2RlZmluZSBNVDlNMTExX0ZMQVNIX0NPTlRST0wJCTB4MDIzCisjZGVmaW5lIE1UOU0xMTFfR1JFRU4xX0dBSU4JCTB4MDJiCisjZGVmaW5lIE1UOU0xMTFfQkxVRV9HQUlOCQkweDAyYworI2RlZmluZSBNVDlNMTExX1JFRF9HQUlOCQkweDAyZAorI2RlZmluZSBNVDlNMTExX0dSRUVOMl9HQUlOCQkweDAyZQorI2RlZmluZSBNVDlNMTExX0dMT0JBTF9HQUlOCQkweDAyZgorI2RlZmluZSBNVDlNMTExX0NPTlRFWFRfQ09OVFJPTAkJMHgwYzgKKyNkZWZpbmUgTVQ5TTExMV9QQUdFX01BUAkJMHgwZjAKKyNkZWZpbmUgTVQ5TTExMV9CWVRFX1dJU0VfQUREUgkJMHgwZjEKKworI2RlZmluZSBNVDlNMTExX1JFU0VUX1NZTkNfQ0hBTkdFUwkoMSA8PCAxNSkKKyNkZWZpbmUgTVQ5TTExMV9SRVNFVF9SRVNUQVJUX0JBRF9GUkFNRQkoMSA8PCA5KQorI2RlZmluZSBNVDlNMTExX1JFU0VUX1NIT1dfQkFEX0ZSQU1FUwkoMSA8PCA4KQorI2RlZmluZSBNVDlNMTExX1JFU0VUX1JFU0VUX1NPQwkJKDEgPDwgNSkKKyNkZWZpbmUgTVQ5TTExMV9SRVNFVF9PVVRQVVRfRElTQUJMRQkoMSA8PCA0KQorI2RlZmluZSBNVDlNMTExX1JFU0VUX0NISVBfRU5BQkxFCSgxIDw8IDMpCisjZGVmaW5lIE1UOU0xMTFfUkVTRVRfQU5BTE9HX1NUQU5EQlkJKDEgPDwgMikKKyNkZWZpbmUgTVQ5TTExMV9SRVNFVF9SRVNUQVJUX0ZSQU1FCSgxIDw8IDEpCisjZGVmaW5lIE1UOU0xMTFfUkVTRVRfUkVTRVRfTU9ERQkoMSA8PCAwKQorCisjZGVmaW5lIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTCQkoMSA8PCAxKQorI2RlZmluZSBNVDlNMTExX1JNQl9NSVJST1JfUk9XUwkJKDEgPDwgMCkKKyNkZWZpbmUgTVQ5TTExMV9DVFhUX0NUUkxfUkVTVEFSVAkoMSA8PCAxNSkKKyNkZWZpbmUgTVQ5TTExMV9DVFhUX0NUUkxfREVGRUNUQ09SX0IJKDEgPDwgMTIpCisjZGVmaW5lIE1UOU0xMTFfQ1RYVF9DVFJMX1JFU0laRV9CCSgxIDw8IDEwKQorI2RlZmluZSBNVDlNMTExX0NUWFRfQ1RSTF9DVFJMMl9CCSgxIDw8IDkpCisjZGVmaW5lIE1UOU0xMTFfQ1RYVF9DVFJMX0dBTU1BX0IJKDEgPDwgOCkKKyNkZWZpbmUgTVQ5TTExMV9DVFhUX0NUUkxfWEVOT05fRU4JKDEgPDwgNykKKyNkZWZpbmUgTVQ5TTExMV9DVFhUX0NUUkxfUkVBRF9NT0RFX0IJKDEgPDwgMykKKyNkZWZpbmUgTVQ5TTExMV9DVFhUX0NUUkxfTEVEX0ZMQVNIX0VOCSgxIDw8IDIpCisjZGVmaW5lIE1UOU0xMTFfQ1RYVF9DVFJMX1ZCTEFOS19TRUxfQgkoMSA8PCAxKQorI2RlZmluZSBNVDlNMTExX0NUWFRfQ1RSTF9IQkxBTktfU0VMX0IJKDEgPDwgMCkKKy8qCisgKiBtdDltMTExOiBDb2xvcnBpcGUgcmVnaXN0ZXIgYWRkcmVzc2VzICgweDEwMC4uMHgxZmYpCisgKi8KKyNkZWZpbmUgTVQ5TTExMV9PUEVSX01PREVfQ1RSTAkJMHgxMDYKKyNkZWZpbmUgTVQ5TTExMV9PVVRQVVRfRk9STUFUX0NUUkwJMHgxMDgKKyNkZWZpbmUgTVQ5TTExMV9SRURVQ0VSX1haT09NX0IJCTB4MWEwCisjZGVmaW5lIE1UOU0xMTFfUkVEVUNFUl9YU0laRV9CCQkweDFhMQorI2RlZmluZSBNVDlNMTExX1JFRFVDRVJfWVpPT01fQgkJMHgxYTMKKyNkZWZpbmUgTVQ5TTExMV9SRURVQ0VSX1lTSVpFX0IJCTB4MWE0CisjZGVmaW5lIE1UOU0xMTFfUkVEVUNFUl9YWk9PTV9BCQkweDFhNgorI2RlZmluZSBNVDlNMTExX1JFRFVDRVJfWFNJWkVfQQkJMHgxYTcKKyNkZWZpbmUgTVQ5TTExMV9SRURVQ0VSX1laT09NX0EJCTB4MWE5CisjZGVmaW5lIE1UOU0xMTFfUkVEVUNFUl9ZU0laRV9BCQkweDFhYQorCisjZGVmaW5lIE1UOU0xMTFfT1VUUFVUX0ZPUk1BVF9DVFJMMl9BCTB4MTNhCisjZGVmaW5lIE1UOU0xMTFfT1VUUFVUX0ZPUk1BVF9DVFJMMl9CCTB4MTliCisKKyNkZWZpbmUgTVQ5TTExMV9PUE1PREVfQVVUT0VYUE9fRU4JKDEgPDwgMTQpCisKKworI2RlZmluZSBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIJKDEgPDwgMTQpCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAJKDEgPDwgMTApCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX0lOVl9QSVhfQ0xPQ0sJKDEgPDwgOSkKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfUkdCCQkoMSA8PCA4KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9SR0I1NjUJCSgweDAgPDwgNikKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfUkdCNTU1CQkoMHgxIDw8IDYpCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1JHQjQ0NHgJCSgweDIgPDwgNikKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfUkdCeDQ0NAkJKDB4MyA8PCA2KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9UU1RfUkFNUF9PRkYJKDB4MCA8PCA0KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9UU1RfUkFNUF9DT0wJKDB4MSA8PCA0KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9UU1RfUkFNUF9ST1cJKDB4MiA8PCA0KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9UU1RfUkFNUF9GUkFNRQkoMHgzIDw8IDQpCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NISUZUXzNfVVAJKDEgPDwgMykKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfQVZHX0NIUk9NQQkoMSA8PCAyKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWQkoMSA8PCAxKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1JHQl9FVkVOCSgxIDw8IDEpCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3IJKDEgPDwgMCkKKy8qCisgKiBtdDltMTExOiBDYW1lcmEgY29udHJvbCByZWdpc3RlciBhZGRyZXNzZXMgKDB4MjAwLi4weDJmZiBub3QgaW1wbGVtZW50ZWQpCisgKi8KKworI2RlZmluZSByZWdfcmVhZChyZWcpIG10OW0xMTFfcmVnX3JlYWQoaWNkLCBNVDlNMTExXyMjcmVnKQorI2RlZmluZSByZWdfd3JpdGUocmVnLCB2YWwpIG10OW0xMTFfcmVnX3dyaXRlKGljZCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCisjZGVmaW5lIHJlZ19zZXQocmVnLCB2YWwpIG10OW0xMTFfcmVnX3NldChpY2QsIE1UOU0xMTFfIyNyZWcsICh2YWwpKQorI2RlZmluZSByZWdfY2xlYXIocmVnLCB2YWwpIG10OW0xMTFfcmVnX2NsZWFyKGljZCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCisKKyNkZWZpbmUgTVQ5TTExMV9NSU5fREFSS19ST1dTCTgKKyNkZWZpbmUgTVQ5TTExMV9NSU5fREFSS19DT0xTCTI0CisjZGVmaW5lIE1UOU0xMTFfTUFYX0hFSUdIVAkxMDI0CisjZGVmaW5lIE1UOU0xMTFfTUFYX1dJRFRICTEyODAKKworI2RlZmluZSBDT0xfRk1UKF9uYW1lLCBfZGVwdGgsIF9mb3VyY2MsIF9jb2xvcnNwYWNlKSBcCisJeyAubmFtZSA9IF9uYW1lLCAuZGVwdGggPSBfZGVwdGgsIC5mb3VyY2MgPSBfZm91cmNjLCBcCisJLmNvbG9yc3BhY2UgPSBfY29sb3JzcGFjZSB9CisjZGVmaW5lIFJHQl9GTVQoX25hbWUsIF9kZXB0aCwgX2ZvdXJjYykgXAorCUNPTF9GTVQoX25hbWUsIF9kZXB0aCwgX2ZvdXJjYywgVjRMMl9DT0xPUlNQQUNFX1NSR0IpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kYXRhX2Zvcm1hdCBtdDltMTExX2NvbG91cl9mb3JtYXRzW10gPSB7CisJQ09MX0ZNVCgiWUNyWUNiIDggYml0IiwgOCwgVjRMMl9QSVhfRk1UX1lVWVYsIFY0TDJfQ09MT1JTUEFDRV9KUEVHKSwKKwlSR0JfRk1UKCJSR0IgNTY1IiwgMTYsIFY0TDJfUElYX0ZNVF9SR0I1NjUpLAorCVJHQl9GTVQoIlJHQiA1NTUiLCAxNiwgVjRMMl9QSVhfRk1UX1JHQjU1NSksCisJUkdCX0ZNVCgiQmF5ZXIgKHNSR0IpIDEwIGJpdCIsIDEwLCBWNEwyX1BJWF9GTVRfU0JHR1IxNiksCisJUkdCX0ZNVCgiQmF5ZXIgKHNSR0IpIDggYml0IiwgOCwgVjRMMl9QSVhfRk1UX1NCR0dSOCksCit9OworCitlbnVtIG10OW0xMTFfY29udGV4dCB7CisJSElHSFBPV0VSID0gMCwKKwlMT1dQT1dFUiwKK307CisKK3N0cnVjdCBtdDltMTExIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSBpY2Q7CisJaW50IG1vZGVsOwkvKiBWNEwyX0lERU5UX01UOU0xMTEqIGNvZGVzIGZyb20gdjRsMi1jaGlwLWlkZW50LmggKi8KKwllbnVtIG10OW0xMTFfY29udGV4dCBjb250ZXh0OworCXVuc2lnbmVkIGludCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisJdTMyIHBpeGZtdDsKKwl1bnNpZ25lZCBjaGFyIGF1dG9leHBvc3VyZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGF3aWR0aDsKKwl1bnNpZ25lZCBpbnQgcG93ZXJlZDoxOworCXVuc2lnbmVkIGludCBoZmxpcDoxOworCXVuc2lnbmVkIGludCB2ZmxpcDoxOworCXVuc2lnbmVkIGludCBzd2FwX3JnYl9ldmVuX29kZDoxOworCXVuc2lnbmVkIGludCBzd2FwX3JnYl9yZWRfYmx1ZToxOworCXVuc2lnbmVkIGludCBzd2FwX3l1dl95X2Nocm9tYXM6MTsKKwl1bnNpZ25lZCBpbnQgc3dhcF95dXZfY2JfY3I6MTsKK307CisKK3N0YXRpYyBpbnQgcmVnX3BhZ2VfbWFwX3NldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1MTYgcmVnKQoreworCWludCByZXQ7CisJdTE2IHBhZ2U7CisJc3RhdGljIGludCBsYXN0cGFnZSA9IC0xOwkvKiBQYWdlTWFwIGNhY2hlIHZhbHVlICovCisKKwlwYWdlID0gKHJlZyA+PiA4KTsKKwlpZiAocGFnZSA9PSBsYXN0cGFnZSkKKwkJcmV0dXJuIDA7CisJaWYgKHBhZ2UgPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBNVDlNMTExX1BBR0VfTUFQLCBzd2FiMTYocGFnZSkpOworCWlmICghcmV0KQorCQlsYXN0cGFnZSA9IHBhZ2U7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3JlZ19yZWFkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBjb25zdCB1MTYgcmVnKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IG10OW0xMTEtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnX3BhZ2VfbWFwX3NldChjbGllbnQsIHJlZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAocmVnICYgMHhmZikpKTsKKworCWRldl9kYmcoJmljZC0+ZGV2LCAicmVhZCAgcmVnLiUwM3ggLT4gJTA0eFxuIiwgcmVnLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9yZWdfd3JpdGUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGNvbnN0IHUxNiByZWcsCisJCQkgICAgIGNvbnN0IHUxNiBkYXRhKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IG10OW0xMTEtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnX3BhZ2VfbWFwX3NldChjbGllbnQsIHJlZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEobXQ5bTExMS0+Y2xpZW50LCAocmVnICYgMHhmZiksCisJCQkJCQlzd2FiMTYoZGF0YSkpOworCWRldl9kYmcoJmljZC0+ZGV2LCAid3JpdGUgcmVnLiUwM3ggPSAlMDR4IC0+ICVkXG4iLCByZWcsIGRhdGEsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3JlZ19zZXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGNvbnN0IHUxNiByZWcsCisJCQkgICBjb25zdCB1MTYgZGF0YSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbXQ5bTExMV9yZWdfcmVhZChpY2QsIHJlZyk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBtdDltMTExX3JlZ193cml0ZShpY2QsIHJlZywgcmV0IHwgZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3JlZ19jbGVhcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgY29uc3QgdTE2IHJlZywKKwkJCSAgICAgY29uc3QgdTE2IGRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IG10OW0xMTFfcmVnX3JlYWQoaWNkLCByZWcpOworCXJldHVybiBtdDltMTExX3JlZ193cml0ZShpY2QsIHJlZywgcmV0ICYgfmRhdGEpOworfQorCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2NvbnRleHQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICAgZW51bSBtdDltMTExX2NvbnRleHQgY3R4dCkKK3sKKwlpbnQgdmFsQiA9IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU1RBUlQgfCBNVDlNMTExX0NUWFRfQ1RSTF9ERUZFQ1RDT1JfQgorCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU0laRV9CIHwgTVQ5TTExMV9DVFhUX0NUUkxfQ1RSTDJfQgorCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX0dBTU1BX0IgfCBNVDlNMTExX0NUWFRfQ1RSTF9SRUFEX01PREVfQgorCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX1ZCTEFOS19TRUxfQgorCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX0hCTEFOS19TRUxfQjsKKwlpbnQgdmFsQSA9IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU1RBUlQ7CisKKwlpZiAoY3R4dCA9PSBISUdIUE9XRVIpCisJCXJldHVybiByZWdfd3JpdGUoQ09OVEVYVF9DT05UUk9MLCB2YWxCKTsKKwllbHNlCisJCXJldHVybiByZWdfd3JpdGUoQ09OVEVYVF9DT05UUk9MLCB2YWxBKTsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldHVwX3JlY3Qoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgcmV0LCBpc19yYXdfZm9ybWF0OworCWludCB3aWR0aCA9IG10OW0xMTEtPndpZHRoOworCWludCBoZWlnaHQgPSBtdDltMTExLT5oZWlnaHQ7CisKKwlpZiAoKG10OW0xMTEtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfU0JHR1I4KQorCSAgICB8fCAobXQ5bTExMS0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9TQkdHUjE2KSkKKwkJaXNfcmF3X2Zvcm1hdCA9IDE7CisJZWxzZQorCQlpc19yYXdfZm9ybWF0ID0gMDsKKworCXJldCA9IHJlZ193cml0ZShDT0xVTU5fU1RBUlQsIG10OW0xMTEtPmxlZnQpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoUk9XX1NUQVJULCBtdDltMTExLT50b3ApOworCisJaWYgKGlzX3Jhd19mb3JtYXQpIHsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZWdfd3JpdGUoV0lORE9XX1dJRFRILCB3aWR0aCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3dyaXRlKFdJTkRPV19IRUlHSFQsIGhlaWdodCk7CisJfSBlbHNlIHsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZWdfd3JpdGUoUkVEVUNFUl9YWk9PTV9CLCBNVDlNMTExX01BWF9XSURUSCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3dyaXRlKFJFRFVDRVJfWVpPT01fQiwgTVQ5TTExMV9NQVhfSEVJR0hUKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZWdfd3JpdGUoUkVEVUNFUl9YU0laRV9CLCB3aWR0aCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3dyaXRlKFJFRFVDRVJfWVNJWkVfQiwgaGVpZ2h0KTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZWdfd3JpdGUoUkVEVUNFUl9YWk9PTV9BLCBNVDlNMTExX01BWF9XSURUSCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3dyaXRlKFJFRFVDRVJfWVpPT01fQSwgTVQ5TTExMV9NQVhfSEVJR0hUKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSByZWdfd3JpdGUoUkVEVUNFUl9YU0laRV9BLCB3aWR0aCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVnX3dyaXRlKFJFRFVDRVJfWVNJWkVfQSwgaGVpZ2h0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcGl4Zm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MTYgb3V0Zm10KQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfd3JpdGUoT1VUUFVUX0ZPUk1BVF9DVFJMMl9BLCBvdXRmbXQpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoT1VUUFVUX0ZPUk1BVF9DVFJMMl9CLCBvdXRmbXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRmbXRfYmF5ZXI4KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXJldHVybiBtdDltMTExX3NldHVwX3BpeGZtdChpY2QsIE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUik7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRmbXRfYmF5ZXIxMChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoaWNkLCBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQKTsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NjUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgdmFsID0gMDsKKworCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKKwkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7CisJaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQorCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKKwl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTY1OworCisJcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGljZCwgdmFsKTsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NTUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgdmFsID0gMDsKKworCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKKwkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7CisJaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQorCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKKwl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1OworCisJcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGljZCwgdmFsKTsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldGZtdF95dXYoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgdmFsID0gMDsKKworCWlmIChtdDltMTExLT5zd2FwX3l1dl9jYl9jcikKKwkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7CisJaWYgKG10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcykKKwkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZOworCisJcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGljZCwgdmFsKTsKK30KKworc3RhdGljIGludCBtdDltMTExX2VuYWJsZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IG10OW0xMTEtPmNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworCWlmIChpY2wtPnBvd2VyKSB7CisJCXJldCA9IGljbC0+cG93ZXIoJm10OW0xMTEtPmNsaWVudC0+ZGV2LCAxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoaWNkLT52ZGV2LT5wYXJlbnQsCisJCQkJIlBsYXRmb3JtIGZhaWxlZCB0byBwb3dlci1vbiB0aGUgY2FtZXJhLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gcmVnX3NldChSRVNFVCwgTVQ5TTExMV9SRVNFVF9DSElQX0VOQUJMRSk7CisJaWYgKCFyZXQpCisJCW10OW0xMTEtPnBvd2VyZWQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9kaXNhYmxlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gbXQ5bTExMS0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnX2NsZWFyKFJFU0VULCBNVDlNMTExX1JFU0VUX0NISVBfRU5BQkxFKTsKKwlpZiAoIXJldCkKKwkJbXQ5bTExMS0+cG93ZXJlZCA9IDA7CisKKwlpZiAoaWNsLT5wb3dlcikKKwkJaWNsLT5wb3dlcigmbXQ5bTExMS0+Y2xpZW50LT5kZXYsIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3Jlc2V0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX1JFU0VUX01PREUpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX1JFU0VUX1NPQyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ19jbGVhcihSRVNFVCwgTVQ5TTExMV9SRVNFVF9SRVNFVF9NT0RFCisJCQkJfCBNVDlNMTExX1JFU0VUX1JFU0VUX1NPQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3N0YXJ0X2NhcHR1cmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zdG9wX2NhcHR1cmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG10OW0xMTFfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXJldHVybiBTT0NBTV9NQVNURVIgfCBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJU09DQU1fREFUQVdJRFRIXzg7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1bnNpZ25lZCBsb25nIGYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfcGl4Zm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MzIgcGl4Zm10KQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJaW50IHJldDsKKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1I4OgorCQlyZXQgPSBtdDltMTExX3NldGZtdF9iYXllcjgoaWNkKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1IxNjoKKwkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfYmF5ZXIxMChpY2QpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisJCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU1NShpY2QpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU2NShpY2QpOworCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoaWNkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaWNkLT5kZXYsICJQaXhlbCBmb3JtYXQgbm90IGhhbmRsZWQgOiAleFxuIiwgcGl4Zm10KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJldCkKKwkJbXQ5bTExMS0+cGl4Zm10ID0gcGl4Zm10OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldF9mbXRfY2FwKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgIF9fdTMyIHBpeGZtdCwgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCWludCByZXQ7CisKKwltdDltMTExLT5sZWZ0ID0gcmVjdC0+bGVmdDsKKwltdDltMTExLT50b3AgPSByZWN0LT50b3A7CisJbXQ5bTExMS0+d2lkdGggPSByZWN0LT53aWR0aDsKKwltdDltMTExLT5oZWlnaHQgPSByZWN0LT5oZWlnaHQ7CisKKwlkZXZfZGJnKCZpY2QtPmRldiwgIiVzIGZtdD0leCBsZWZ0PSVkLCB0b3A9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsCisJCV9fZnVuY19fLCBwaXhmbXQsIG10OW0xMTEtPmxlZnQsIG10OW0xMTEtPnRvcCwgbXQ5bTExMS0+d2lkdGgsCisJCW10OW0xMTEtPmhlaWdodCk7CisKKwlyZXQgPSBtdDltMTExX3NldHVwX3JlY3QoaWNkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbXQ5bTExMV9zZXRfcGl4Zm10KGljZCwgcGl4Zm10KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfdHJ5X2ZtdF9jYXAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IE1UOU0xMTFfTUFYX0hFSUdIVCkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBNVDlNMTExX01BWF9IRUlHSFQ7CisJaWYgKGYtPmZtdC5waXgud2lkdGggPiBNVDlNMTExX01BWF9XSURUSCkKKwkJZi0+Zm10LnBpeC53aWR0aCA9IE1UOU0xMTFfTUFYX1dJRFRIOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9nZXRfY2hpcF9pZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICppZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCisJaWYgKGlkLT5tYXRjaF90eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaWQtPm1hdGNoX2NoaXAgIT0gbXQ5bTExMS0+Y2xpZW50LT5hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlkLT5pZGVudAk9IG10OW0xMTEtPm1vZGVsOworCWlkLT5yZXZpc2lvbgk9IDA7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgbXQ5bTExMV9nZXRfcmVnaXN0ZXIoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZykKK3sKKwlpbnQgdmFsOworCisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKworCWlmIChyZWctPm1hdGNoX3R5cGUgIT0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSIHx8IHJlZy0+cmVnID4gMHgyZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyZWctPm1hdGNoX2NoaXAgIT0gbXQ5bTExMS0+Y2xpZW50LT5hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbCA9IG10OW0xMTFfcmVnX3JlYWQoaWNkLCByZWctPnJlZyk7CisJcmVnLT52YWwgPSAodTY0KXZhbDsKKworCWlmIChyZWctPnZhbCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDltMTExX3NldF9yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisKKwlpZiAocmVnLT5tYXRjaF90eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiB8fCByZWctPnJlZyA+IDB4MmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZWctPm1hdGNoX2NoaXAgIT0gbXQ5bTExMS0+Y2xpZW50LT5hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtdDltMTExX3JlZ193cml0ZShpY2QsIHJlZy0+cmVnLCByZWctPnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXQ5bTExMV9jb250cm9sc1tdID0geworCXsKKwkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbHkiLAorCQkubWluaW11bQk9IDAsCisJCS5tYXhpbXVtCT0gMSwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZmF1bHRfdmFsdWUJPSAwLAorCX0sIHsKKwkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFseSIsCisJCS5taW5pbXVtCT0gMCwKKwkJLm1heGltdW0JPSAxLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmYXVsdF92YWx1ZQk9IDAsCisJfSwgewkvKiBnYWluID0gMS8zMip2YWwgKD0+Z2Fpbj0xIGlmIHZhbD09MzIpICovCisJCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiIsCisJCS5taW5pbXVtCT0gMCwKKwkJLm1heGltdW0JPSA2MyAqIDIgKiAyLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmYXVsdF92YWx1ZQk9IDMyLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAorCX0sIHsKKwkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJBdXRvIEV4cG9zdXJlIiwKKwkJLm1pbmltdW0JPSAwLAorCQkubWF4aW11bQk9IDEsCisJCS5zdGVwCQk9IDEsCisJCS5kZWZhdWx0X3ZhbHVlCT0gMSwKKwl9Cit9OworCitzdGF0aWMgaW50IG10OW0xMTFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOworc3RhdGljIHZvaWQgbXQ5bTExMV92aWRlb19yZW1vdmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOworc3RhdGljIGludCBtdDltMTExX2dldF9jb250cm9sKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKik7CitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosCisJCQkgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqKTsKK3N0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOworc3RhdGljIGludCBtdDltMTExX2luaXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOworc3RhdGljIGludCBtdDltMTExX3JlbGVhc2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOworCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG10OW0xMTFfb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQkJPSBtdDltMTExX3ZpZGVvX3Byb2JlLAorCS5yZW1vdmUJCQk9IG10OW0xMTFfdmlkZW9fcmVtb3ZlLAorCS5pbml0CQkJPSBtdDltMTExX2luaXQsCisJLnJlc3VtZQkJCT0gbXQ5bTExMV9yZXN1bWUsCisJLnJlbGVhc2UJCT0gbXQ5bTExMV9yZWxlYXNlLAorCS5zdGFydF9jYXB0dXJlCQk9IG10OW0xMTFfc3RhcnRfY2FwdHVyZSwKKwkuc3RvcF9jYXB0dXJlCQk9IG10OW0xMTFfc3RvcF9jYXB0dXJlLAorCS5zZXRfZm10X2NhcAkJPSBtdDltMTExX3NldF9mbXRfY2FwLAorCS50cnlfZm10X2NhcAkJPSBtdDltMTExX3RyeV9mbXRfY2FwLAorCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbSwKKwkuc2V0X2J1c19wYXJhbQkJPSBtdDltMTExX3NldF9idXNfcGFyYW0sCisJLmNvbnRyb2xzCQk9IG10OW0xMTFfY29udHJvbHMsCisJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG10OW0xMTFfY29udHJvbHMpLAorCS5nZXRfY29udHJvbAkJPSBtdDltMTExX2dldF9jb250cm9sLAorCS5zZXRfY29udHJvbAkJPSBtdDltMTExX3NldF9jb250cm9sLAorCS5nZXRfY2hpcF9pZAkJPSBtdDltMTExX2dldF9jaGlwX2lkLAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkuZ2V0X3JlZ2lzdGVyCQk9IG10OW0xMTFfZ2V0X3JlZ2lzdGVyLAorCS5zZXRfcmVnaXN0ZXIJCT0gbXQ5bTExMV9zZXRfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZmxpcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgaW50IGZsaXAsIGludCBtYXNrKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJaW50IHJldDsKKworCWlmIChtdDltMTExLT5jb250ZXh0ID09IEhJR0hQT1dFUikgeworCQlpZiAoZmxpcCkKKwkJCXJldCA9IHJlZ19zZXQoUkVBRF9NT0RFX0IsIG1hc2spOworCQllbHNlCisJCQlyZXQgPSByZWdfY2xlYXIoUkVBRF9NT0RFX0IsIG1hc2spOworCX0gZWxzZSB7CisJCWlmIChmbGlwKQorCQkJcmV0ID0gcmVnX3NldChSRUFEX01PREVfQSwgbWFzayk7CisJCWVsc2UKKwkJCXJldCA9IHJlZ19jbGVhcihSRUFEX01PREVfQSwgbWFzayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YSwgZ2FpbjsKKworCWRhdGEgPSByZWdfcmVhZChHTE9CQUxfR0FJTik7CisJaWYgKGRhdGEgPj0gMCkKKwkJZ2FpbiA9ICgoZGF0YSAmICgxIDw8IDEwKSkgKiAyKQorCQkJfCAoKGRhdGEgJiAoMSA8PCA5KSkgKiAyKQorCQkJfCAoZGF0YSAmIDB4MmYpOworCWVsc2UKKwkJZ2FpbiA9IGRhdGE7CisKKwlyZXR1cm4gZ2FpbjsKK30KK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIGludCBnYWluKQoreworCXUxNiB2YWw7CisKKwlpZiAoZ2FpbiA+IDYzICogMiAqIDIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWNkLT5nYWluID0gZ2FpbjsKKwlpZiAoKGdhaW4gPj0gNjQgKiAyKSAmJiAoZ2FpbiA8IDYzICogMiAqIDIpKQorCQl2YWwgPSAoMSA8PCAxMCkgfCAoMSA8PCA5KSB8IChnYWluIC8gNCk7CisJZWxzZSBpZiAoKGdhaW4gPj0gNjQpICYmIChnYWluIDwgNjQgKiAyKSkKKwkJdmFsID0gKDEgPDwgOSkgfCAoZ2FpbiAvIDIpOworCWVsc2UKKwkJdmFsID0gZ2FpbjsKKworCXJldHVybiByZWdfd3JpdGUoR0xPQkFMX0dBSU4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBpbnQgb24pCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgcmV0OworCisJaWYgKG9uKQorCQlyZXQgPSByZWdfc2V0KE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTik7CisJZWxzZQorCQlyZXQgPSByZWdfY2xlYXIoT1BFUl9NT0RFX0NUUkwsIE1UOU0xMTFfT1BNT0RFX0FVVE9FWFBPX0VOKTsKKworCWlmICghcmV0KQorCQltdDltMTExLT5hdXRvZXhwb3N1cmUgPSBvbjsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IG10OW0xMTFfZ2V0X2NvbnRyb2woc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCWludCBkYXRhOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWlmIChtdDltMTExLT5jb250ZXh0ID09IEhJR0hQT1dFUikKKwkJCWRhdGEgPSByZWdfcmVhZChSRUFEX01PREVfQik7CisJCWVsc2UKKwkJCWRhdGEgPSByZWdfcmVhZChSRUFEX01PREVfQSk7CisKKwkJaWYgKGRhdGEgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJaWYgKG10OW0xMTEtPmNvbnRleHQgPT0gSElHSFBPV0VSKQorCQkJZGF0YSA9IHJlZ19yZWFkKFJFQURfTU9ERV9CKTsKKwkJZWxzZQorCQkJZGF0YSA9IHJlZ19yZWFkKFJFQURfTU9ERV9BKTsKKworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCWRhdGEgPSBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihpY2QpOworCQlpZiAoZGF0YSA8IDApCisJCQlyZXR1cm4gZGF0YTsKKwkJY3RybC0+dmFsdWUgPSBkYXRhOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCWN0cmwtPnZhbHVlID0gbXQ5bTExMS0+YXV0b2V4cG9zdXJlOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfY29udHJvbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OW0xMTEsIGljZCk7CisJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKKwlpbnQgcmV0OworCisJcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OW0xMTFfb3BzLCBjdHJsLT5pZCk7CisKKwlpZiAoIXFjdHJsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQltdDltMTExLT52ZmxpcCA9IGN0cmwtPnZhbHVlOworCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKGljZCwgY3RybC0+dmFsdWUsCisJCQkJCU1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJbXQ5bTExMS0+aGZsaXAgPSBjdHJsLT52YWx1ZTsKKwkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChpY2QsIGN0cmwtPnZhbHVlLAorCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJcmV0ID0gbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oaWNkLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShpY2QsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfcmVzdG9yZV9zdGF0ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCisJbXQ5bTExMV9zZXRfY29udGV4dChpY2QsIG10OW0xMTEtPmNvbnRleHQpOworCW10OW0xMTFfc2V0X3BpeGZtdChpY2QsIG10OW0xMTEtPnBpeGZtdCk7CisJbXQ5bTExMV9zZXR1cF9yZWN0KGljZCk7CisJbXQ5bTExMV9zZXRfZmxpcChpY2QsIG10OW0xMTEtPmhmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7CisJbXQ5bTExMV9zZXRfZmxpcChpY2QsIG10OW0xMTEtPnZmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7CisJbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oaWNkLCBpY2QtPmdhaW4pOworCW10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShpY2QsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5bTExMSwgaWNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtdDltMTExLT5wb3dlcmVkKSB7CisJCXJldCA9IG10OW0xMTFfZW5hYmxlKGljZCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gbXQ5bTExMV9yZXNldChpY2QpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IG10OW0xMTFfcmVzdG9yZV9zdGF0ZShpY2QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfaW5pdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCWludCByZXQ7CisKKwltdDltMTExLT5jb250ZXh0ID0gSElHSFBPV0VSOworCXJldCA9IG10OW0xMTFfZW5hYmxlKGljZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG10OW0xMTFfcmVzZXQoaWNkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbXQ5bTExMV9zZXRfY29udGV4dChpY2QsIG10OW0xMTEtPmNvbnRleHQpOworCWlmICghcmV0KQorCQlyZXQgPSBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoaWNkLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmljZC0+ZGV2LCAibXQ5bTExMSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDltMTExX3JlbGVhc2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJaW50IHJldDsKKworCXJldCA9IG10OW0xMTFfZGlzYWJsZShpY2QpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpY2QtPmRldiwgIm10OW0xMTEgcmVsZWFzZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEludGVyZmFjZSBhY3RpdmUsIGNhbiB1c2UgaTJjLiBJZiBpdCBmYWlscywgaXQgY2FuIGluZGVlZCBtZWFuLCB0aGF0CisgKiB0aGlzIHdhc24ndCBvdXIgY2FwdHVyZSBpbnRlcmZhY2UsIHNvLCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgb25lCisgKi8KK3N0YXRpYyBpbnQgbXQ5bTExMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCXMzMiBkYXRhOworCWludCByZXQ7CisKKwkvKgorCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCisJICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KKwkgKi8KKwlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAorCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBtdDltMTExX2VuYWJsZShpY2QpOworCWlmIChyZXQpCisJCWdvdG8gZWkyYzsKKwlyZXQgPSBtdDltMTExX3Jlc2V0KGljZCk7CisJaWYgKHJldCkKKwkJZ290byBlaTJjOworCisJZGF0YSA9IHJlZ19yZWFkKENISVBfVkVSU0lPTik7CisKKwlzd2l0Y2ggKGRhdGEpIHsKKwljYXNlIDB4MTQzYToKKwkJbXQ5bTExMS0+bW9kZWwgPSBWNEwyX0lERU5UX01UOU0xMTE7CisJCWljZC0+Zm9ybWF0cyA9IG10OW0xMTFfY29sb3VyX2Zvcm1hdHM7CisJCWljZC0+bnVtX2Zvcm1hdHMgPSBBUlJBWV9TSVpFKG10OW0xMTFfY29sb3VyX2Zvcm1hdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJCSJObyBNVDlNMTExIGNoaXAgZGV0ZWN0ZWQsIHJlZ2lzdGVyIHJlYWQgJXhcbiIsIGRhdGEpOworCQlnb3RvIGVpMmM7CisJfQorCisJZGV2X2luZm8oJmljZC0+ZGV2LCAiRGV0ZWN0ZWQgYSBNVDlNMTExIGNoaXAgSUQgMHgxNDNhXG4iKTsKKworCXJldCA9IHNvY19jYW1lcmFfdmlkZW9fc3RhcnQoaWNkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVpc2lzOworCisJbXQ5bTExMS0+YXV0b2V4cG9zdXJlID0gMTsKKworCW10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkID0gMTsKKwltdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSA9IDE7CisKKwlyZXR1cm4gMDsKK2Vpc2lzOgorZWkyYzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtdDltMTExX3ZpZGVvX3JlbW92ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihpY2QsIHN0cnVjdCBtdDltMTExLCBpY2QpOworCisJZGV2X2RiZygmaWNkLT5kZXYsICJWaWRlbyAleCByZW1vdmVkOiAlcCwgJXBcbiIsIG10OW0xMTEtPmNsaWVudC0+YWRkciwKKwkJbXQ5bTExMS0+aWNkLmRldi5wYXJlbnQsIG10OW0xMTEtPmljZC52ZGV2KTsKKwlzb2NfY2FtZXJhX3ZpZGVvX3N0b3AoJm10OW0xMTEtPmljZCk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTE7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIWljbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOU0xMTEgZHJpdmVyIG5lZWRzIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwKKwkJCSAiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IEkyQ19GVU5DX1NNQlVTX1dPUkRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltdDltMTExID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10OW0xMTEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10OW0xMTEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXQ5bTExMS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG10OW0xMTEpOworCisJLyogU2Vjb25kIHN0YWdlIHByb2JlIC0gd2hlbiBhIGNhcHR1cmUgYWRhcHRlciBpcyB0aGVyZSAqLworCWljZCAJCT0gJm10OW0xMTEtPmljZDsKKwlpY2QtPm9wcwk9ICZtdDltMTExX29wczsKKwlpY2QtPmNvbnRyb2wJPSAmY2xpZW50LT5kZXY7CisJaWNkLT54X21pbgk9IE1UOU0xMTFfTUlOX0RBUktfQ09MUzsKKwlpY2QtPnlfbWluCT0gTVQ5TTExMV9NSU5fREFSS19ST1dTOworCWljZC0+eF9jdXJyZW50CT0gaWNkLT54X21pbjsKKwlpY2QtPnlfY3VycmVudAk9IGljZC0+eV9taW47CisJaWNkLT53aWR0aF9taW4JPSBNVDlNMTExX01JTl9EQVJLX1JPV1M7CisJaWNkLT53aWR0aF9tYXgJPSBNVDlNMTExX01BWF9XSURUSDsKKwlpY2QtPmhlaWdodF9taW4JPSBNVDlNMTExX01JTl9EQVJLX0NPTFM7CisJaWNkLT5oZWlnaHRfbWF4CT0gTVQ5TTExMV9NQVhfSEVJR0hUOworCWljZC0+eV9za2lwX3RvcAk9IDA7CisJaWNkLT5pZmFjZQk9IGljbC0+YnVzX2lkOworCisJcmV0ID0gc29jX2NhbWVyYV9kZXZpY2VfcmVnaXN0ZXIoaWNkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVpc2RyOworCXJldHVybiAwOworCitlaXNkcjoKKwlrZnJlZShtdDltMTExKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzb2NfY2FtZXJhX2RldmljZV91bnJlZ2lzdGVyKCZtdDltMTExLT5pY2QpOworCWtmcmVlKG10OW0xMTEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDltMTExX2lkW10gPSB7CisJeyAibXQ5bTExMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbXQ5bTExMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDltMTExX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXQ5bTExMSIsCisJfSwKKwkucHJvYmUJCT0gbXQ5bTExMV9wcm9iZSwKKwkucmVtb3ZlCQk9IG10OW0xMTFfcmVtb3ZlLAorCS5pZF90YWJsZQk9IG10OW0xMTFfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtdDltMTExX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtdDltMTExX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXQ5bTExMV9tb2RfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtdDltMTExX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtdDltMTExX21vZF9pbml0KTsKK21vZHVsZV9leGl0KG10OW0xMTFfbW9kX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvbiBNVDlNMTExIENhbWVyYSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBKYXJ6bWlrIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCmluZGV4IDU2ODA4Y2QuLjI1ODQyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCkBAIC0xMzQsMzQgKzEzNCw1NiBAQAogc3RhdGljIGludCBtdDl2MDIyX2luaXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSBjb250YWluZXJfb2YoaWNkLCBzdHJ1Y3QgbXQ5djAyMiwgaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBtdDl2MDIyLT5jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCByZXQ7CiAKKwlpZiAoaWNsLT5wb3dlcikgeworCQlyZXQgPSBpY2wtPnBvd2VyKCZtdDl2MDIyLT5jbGllbnQtPmRldiwgMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGljZC0+dmRldi0+cGFyZW50LAorCQkJCSJQbGF0Zm9ybSBmYWlsZWQgdG8gcG93ZXItb24gdGhlIGNhbWVyYS5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGNhbWVyYSBjb3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBvbiwgd2UgaGFyZC1yZXNldCBpdCBhZGRpdGlvbmFsbHksCisJICogaWYgYXZhaWxhYmxlLiBTb2Z0IHJlc2V0IGlzIGRvbmUgaW4gdmlkZW9fcHJvYmUoKS4KKwkgKi8KKwlpZiAoaWNsLT5yZXNldCkKKwkJaWNsLT5yZXNldCgmbXQ5djAyMi0+Y2xpZW50LT5kZXYpOworCiAJLyogQWxtb3N0IHRoZSBkZWZhdWx0IG1vZGU6IG1hc3RlciwgcGFyYWxsZWwsIHNpbXVsdGFuZW91cywgYW5kIGFuCiAJICogdW5kb2N1bWVudGVkIGJpdCAweDIwMCwgd2hpY2ggaXMgcHJlc2VudCBpbiB0YWJsZSA3LCBidXQgbm90IGluIDgsCiAJICogcGx1cyBzbmFwc2hvdCBtb2RlIHRvIGRpc2FibGUgc2NhbiBmb3Igbm93ICovCiAJbXQ5djAyMi0+Y2hpcF9jb250cm9sIHw9IDB4MTA7CiAJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9DSElQX0NPTlRST0wsIG10OXYwMjItPmNoaXBfY29udHJvbCk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZWdfd3JpdGUoaWNkLCBNVDlWMDIyX1JFQURfTU9ERSwgMHgzMDApOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlWMDIyX1JFQURfTU9ERSwgMHgzMDApOwogCiAJLyogQWxsIGRlZmF1bHRzICovCi0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQkvKiBBRUMsIEFHQyBvbiAqLwogCQlyZXQgPSByZWdfc2V0KGljZCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgzKTsKLQlpZiAocmV0ID49IDApCisJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShpY2QsIE1UOVYwMjJfTUFYX1RPVEFMX1NIVVRURVJfV0lEVEgsIDQ4MCk7Ci0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQkvKiBkZWZhdWx0IC0gYXV0byAqLwogCQlyZXQgPSByZWdfY2xlYXIoaWNkLCBNVDlWMDIyX0JMQUNLX0xFVkVMX0NBTElCX0NUUkwsIDEpOwotCWlmIChyZXQgPj0gMCkKKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9ESUdJVEFMX1RFU1RfUEFUVEVSTiwgMCk7CiAKLQlyZXR1cm4gcmV0ID49IDAgPyAwIDogLUVJTzsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG10OXYwMjJfcmVsZWFzZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQkvKiBOb3RoaW5nPyAqLworCXN0cnVjdCBtdDl2MDIyICptdDl2MDIyID0gY29udGFpbmVyX29mKGljZCwgc3RydWN0IG10OXYwMjIsIGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gbXQ5djAyMi0+Y2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChpY2wtPnBvd2VyKQorCQlpY2wtPnBvd2VyKCZtdDl2MDIyLT5jbGllbnQtPmRldiwgMCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzUyLDIxICszNzQsMjEgQEAKIAkJCQkJcmVjdC0+aGVpZ2h0ICsgaWNkLT55X3NraXBfdG9wICsgNDMpOwogCX0KIAkvKiBTZXR1cCBmcmFtZSBmb3JtYXQ6IGRlZmF1bHRzIGFwYXJ0IGZyb20gd2lkdGggYW5kIGhlaWdodCAqLwotCWlmIChyZXQgPj0gMCkKKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9DT0xVTU5fU1RBUlQsIHJlY3QtPmxlZnQpOwotCWlmIChyZXQgPj0gMCkKKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9ST1dfU1RBUlQsIHJlY3QtPnRvcCk7Ci0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQkvKiBEZWZhdWx0IDk0LCBQaHl0ZWMgZHJpdmVyIHNheXM6CiAJCSAqICJ3aWR0aCArIGhvcml6b250YWwgYmxhbmsgPj0gNjYwIiAqLwogCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlWMDIyX0hPUklaT05UQUxfQkxBTktJTkcsCiAJCQkJcmVjdC0+d2lkdGggPiA2NjAgLSA0MyA/IDQzIDoKIAkJCQk2NjAgLSByZWN0LT53aWR0aCk7Ci0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlWMDIyX1ZFUlRJQ0FMX0JMQU5LSU5HLCA0NSk7Ci0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQlyZXQgPSByZWdfd3JpdGUoaWNkLCBNVDlWMDIyX1dJTkRPV19XSURUSCwgcmVjdC0+d2lkdGgpOwotCWlmIChyZXQgPj0gMCkKKwlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGljZCwgTVQ5VjAyMl9XSU5ET1dfSEVJR0hULAogCQkJCXJlY3QtPmhlaWdodCArIGljZC0+eV9za2lwX3RvcCk7CiAKQEAgLTcxNyw3ICs3MzksNyBAQAogCQkJaWNkLT5udW1fZm9ybWF0cyA9IDE7CiAJfQogCi0JaWYgKHJldCA+PSAwKQorCWlmICghcmV0KQogCQlyZXQgPSBzb2NfY2FtZXJhX3ZpZGVvX3N0YXJ0KGljZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZWlzaXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwppbmRleCA4ZWY1NzhjLi43ZjEzMDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3NhYTcxMTUuaD4KIAogI2luY2x1ZGUgIm14Yi5oIgogI2luY2x1ZGUgInRlYTY0MTVjLmgiCkBAIC0xMjIsNiArMTIzLDggQEAKIAl7IFZJRElPQ19TX0ZSRVFVRU5DWSwgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCiAJeyBWSURJT0NfR19BVURJTywgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCiAJeyBWSURJT0NfU19BVURJTywgCVNBQTcxNDZfRVhDTFVTSVZFIH0sCisJeyBWSURJT0NfREJHX0dfUkVHSVNURVIsIAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAorCXsgVklESU9DX0RCR19TX1JFR0lTVEVSLCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwKIAl7IE1YQl9TX0FVRElPX0NELCAJU0FBNzE0Nl9FWENMVVNJVkUgfSwJLyogY3VzdG9tIGNvbnRyb2wgKi8KIAl7IE1YQl9TX0FVRElPX0xJTkUsIAlTQUE3MTQ2X0VYQ0xVU0lWRSB9LAkvKiBjdXN0b20gY29udHJvbCAqLwogCXsgMCwJCQkwIH0KQEAgLTEzNCwxMiArMTM3LDEyIEBACiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJaTJjX2FkYXB0ZXI7CiAKLQlzdHJ1Y3QgaTJjX2NsaWVudCoJc2FhNzExMWE7Ci0Jc3RydWN0IGkyY19jbGllbnQqCXRkYTk4NDA7Ci0Jc3RydWN0IGkyY19jbGllbnQqCXRlYTY0MTVjOwotCXN0cnVjdCBpMmNfY2xpZW50Kgl0dW5lcjsKLQlzdHJ1Y3QgaTJjX2NsaWVudCoJdGVhNjQyMF8xOwotCXN0cnVjdCBpMmNfY2xpZW50Kgl0ZWE2NDIwXzI7CisJc3RydWN0IGkyY19jbGllbnQJKnNhYTcxMTFhOworCXN0cnVjdCBpMmNfY2xpZW50CSp0ZGE5ODQwOworCXN0cnVjdCBpMmNfY2xpZW50CSp0ZWE2NDE1YzsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqdHVuZXI7CisJc3RydWN0IGkyY19jbGllbnQJKnRlYTY0MjBfMTsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqdGVhNjQyMF8yOwogCiAJaW50CWN1cl9tb2RlOwkvKiBjdXJyZW50IGF1ZGlvIG1vZGUgKG1vbm8sIHN0ZXJlbywgLi4uKSAqLwogCWludAljdXJfaW5wdXQ7CS8qIGN1cnJlbnQgaW5wdXQgKi8KQEAgLTE1MSwyMyArMTU0LDIzIEBACiAKIHN0YXRpYyBpbnQgbXhiX2NoZWNrX2NsaWVudHMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBteGIqIG14YiA9IGRhdGE7CisJc3RydWN0IG14YiAqbXhiID0gZGF0YTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KTsKIAotCWlmKCAhY2xpZW50ICkKKwlpZiAoIWNsaWVudCkKIAkJcmV0dXJuIDA7CiAKLQlpZiggSTJDX0FERFJfVEVBNjQyMF8xID09IGNsaWVudC0+YWRkciApCisJaWYgKEkyQ19BRERSX1RFQTY0MjBfMSA9PSBjbGllbnQtPmFkZHIpCiAJCW14Yi0+dGVhNjQyMF8xID0gY2xpZW50OwotCWlmKCBJMkNfQUREUl9URUE2NDIwXzIgPT0gY2xpZW50LT5hZGRyICkKKwlpZiAoSTJDX0FERFJfVEVBNjQyMF8yID09IGNsaWVudC0+YWRkcikKIAkJbXhiLT50ZWE2NDIwXzIgPSBjbGllbnQ7Ci0JaWYoIEkyQ19URUE2NDE1Q18yID09IGNsaWVudC0+YWRkciApCisJaWYgKEkyQ19URUE2NDE1Q18yID09IGNsaWVudC0+YWRkcikKIAkJbXhiLT50ZWE2NDE1YyA9IGNsaWVudDsKLQlpZiggSTJDX0FERFJfVERBOTg0MCA9PSBjbGllbnQtPmFkZHIgKQorCWlmIChJMkNfQUREUl9UREE5ODQwID09IGNsaWVudC0+YWRkcikKIAkJbXhiLT50ZGE5ODQwID0gY2xpZW50OwotCWlmKCBJMkNfU0FBNzExMSA9PSBjbGllbnQtPmFkZHIgKQorCWlmIChJMkNfU0FBNzExMSA9PSBjbGllbnQtPmFkZHIpCiAJCW14Yi0+c2FhNzExMWEgPSBjbGllbnQ7Ci0JaWYoIDB4NjAgPT0gY2xpZW50LT5hZGRyICkKKwlpZiAoMHg2MCA9PSBjbGllbnQtPmFkZHIpCiAJCW14Yi0+dHVuZXIgPSBjbGllbnQ7CiAKIAlyZXR1cm4gMDsKQEAgLTE3OCwyMyArMTgxLDI4IEBACiAJc3RydWN0IG14YiogbXhiID0gTlVMTDsKIAlpbnQgcmVzdWx0OwogCi0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgic2FhNzExMSIpKSA8IDApIHsKKwlyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgic2FhNzExNSIpOworCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByaW50aygibXhiOiBzYWE3MTExIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGVhNjQyMCIpKSA8IDApIHsKKwlyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGVhNjQyMCIpOworCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByaW50aygibXhiOiB0ZWE2NDIwIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGVhNjQxNWMiKSkgPCAwKSB7CisJcmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInRlYTY0MTVjIik7CisJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJpbnRrKCJteGI6IHRlYTY0MTVjIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGRhOTg0MCIpKSA8IDApIHsKKwlyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidGRhOTg0MCIpOworCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByaW50aygibXhiOiB0ZGE5ODQwIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidHVuZXIiKSkgPCAwKSB7CisJcmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInR1bmVyIik7CisJaWYgKHJlc3VsdCA8IDApIHsKIAkJcHJpbnRrKCJteGI6IHR1bmVyIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMDcsOSArMjE1LDEwIEBACiAKIAlteGItPmkyY19hZGFwdGVyID0gKHN0cnVjdCBpMmNfYWRhcHRlcikgewogCQkuY2xhc3MgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAotCQkubmFtZSA9ICJteGIiLAogCX07CiAKKwlzbnByaW50ZihteGItPmkyY19hZGFwdGVyLm5hbWUsIHNpemVvZihteGItPmkyY19hZGFwdGVyLm5hbWUpLCAibXhiJWQiLCBteGJfbnVtKTsKKwogCXNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShkZXYsICZteGItPmkyY19hZGFwdGVyLCBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfNDgwKTsKIAlpZihpMmNfYWRkX2FkYXB0ZXIoJm14Yi0+aTJjX2FkYXB0ZXIpIDwgMCkgewogCQlERUJfUygoImNhbm5vdCByZWdpc3RlciBpMmMtZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKQEAgLTI5MCwzOCArMjk5LDcgQEAKIAl7IDksIHsgMHgxZCwgMHhlZCwgMHhkMCwgMHg2OCwgMHgyOSwgMHhiNCwgMHhlMSwgMHgwMCwgMHhiOCB9IH0sCiAJeyA5LCB7IDB4M2QsIDB4ZWQsIDB4ZDAsIDB4NjgsIDB4MjksIDB4YjQsIDB4ZTEsIDB4MDAsIDB4YjggfSB9LAogCXsgMywgeyAweDgwLCAweGIzLCAweDBhIH0gfSwKLQl7LTEsIHsgMH0gfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXhiX3NhYTcxMTFfaW5pdFtdID0gewotCTB4MDAsIDB4MDAsCSAgLyogMDAgLSBJRCBieXRlICovCi0JMHgwMSwgMHgwMCwJICAvKiAwMSAtIHJlc2VydmVkICovCi0KLQkvKmZyb250IGVuZCAqLwotCTB4MDIsIDB4ZDgsCSAgLyogMDIgLSBGVVNFPXgsIEdVREw9eCwgTU9ERT14ICovCi0JMHgwMywgMHgyMywJICAvKiAwMyAtIEhMTlJTPTAsIFZCU0w9MSwgV1BPRkY9MCwgSE9MREc9MCwgR0FGSVg9MCwgR0FJMT0yNTYsIEdBSTI9MjU2ICovCi0JMHgwNCwgMHgwMCwJICAvKiAwNCAtIEdBSTE9MjU2ICovCi0JMHgwNSwgMHgwMCwJICAvKiAwNSAtIEdBSTI9MjU2ICovCi0KLQkvKiBkZWNvZGVyICovCi0JMHgwNiwgMHhmMCwJICAvKiAwNiAtIEhTQiBhdCAgeHgoNTBIeikgLyAgeHgoNjBIeikgcGl4ZWxzIGFmdGVyIGVuZCBvZiBsYXN0IGxpbmUgKi8KLQkweDA3LCAweDMwLAkgIC8qIDA3IC0gSFNTIGF0ICB4eCg1MEh6KSAvICB4eCg2MEh6KSBwaXhlbHMgYWZ0ZXIgZW5kIG9mIGxhc3QgbGluZSAqLwotCTB4MDgsIDB4YTgsCSAgLyogMDggLSBBVUZEPXgsIEZTRUw9eCwgRVhGSUw9eCwgVlRSQz14LCBIUExMPXgsIFZOT0k9eCAqLwotCTB4MDksIDB4MDIsCSAgLyogMDkgLSBCWVBTPXgsIFBSRUY9eCwgQlBTUz14LCBWQkxCPXgsIFVQVENWPXgsIEFQRVI9eCAqLwotCTB4MGEsIDB4ODAsCSAgLyogMGEgLSBCUklHPTEyOCAqLwotCTB4MGIsIDB4NDcsCSAgLyogMGIgLSBDT05UPTEuMTA5ICovCi0JMHgwYywgMHg0MCwJICAvKiAwYyAtIFNBVE49MS4wICovCi0JMHgwZCwgMHgwMCwJICAvKiAwZCAtIEhVRT0wICovCi0JMHgwZSwgMHgwMSwJICAvKiAwZSAtIENEVE89MCwgQ1NURD0wLCBEQ0NGPTAsIEZDVEM9MCwgQ0hCVz0xICovCi0JMHgwZiwgMHgwMCwJICAvKiAwZiAtIHJlc2VydmVkICovCi0JMHgxMCwgMHhkMCwJICAvKiAxMCAtIE9GVFM9eCwgSERFTD14LCBWUkxOPXgsIFlERUw9eCAqLwotCTB4MTEsIDB4OGMsCSAgLyogMTEgLSBHUFNXPXgsIENNOTk9eCwgRkVDTz14LCBDT01QTz14LCBPRVlDPTEsIE9FSFY9MSwgVklQQj0wLCBDT0xPPTAgKi8KLQkweDEyLCAweDgwLAkgIC8qIDEyIC0geHggb3V0cHV0IGNvbnRyb2wgMiAqLwotCTB4MTMsIDB4MzAsCSAgLyogMTMgLSB4eCBvdXRwdXQgY29udHJvbCAzICovCi0JMHgxNCwgMHgwMCwJICAvKiAxNCAtIHJlc2VydmVkICovCi0JMHgxNSwgMHgxNSwJICAvKiAxNSAtIFZCSSAqLwotCTB4MTYsIDB4MDQsCSAgLyogMTYgLSBWQkkgKi8KLQkweDE3LCAweDAwLAkgIC8qIDE3IC0gVkJJICovCisJey0xLCB7IDAgfSB9CiB9OwogCiAvKiBicmluZyBoYXJkd2FyZSB0byBhIHNhbmUgc3RhdGUuIHRoaXMgaGFzIHRvIGJlIGRvbmUsIGp1c3QgaW4gY2FzZSBzb21lb25lCkBAIC0zMzEsMzcgKzMwOSwyOCBAQAogc3RhdGljIGludCBteGJfaW5pdF9kb25lKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQogewogCXN0cnVjdCBteGIqIG14YiA9IChzdHJ1Y3QgbXhiKilkZXYtPmV4dF9wcml2OwotCXN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQgaW5pdDsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CiAJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAl2NGwyX3N0ZF9pZCBzdGQgPSBWNEwyX1NURF9QQUxfQkc7CisJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKIAogCWludCBpID0gMCwgZXJyID0gMDsKLQlzdHJ1Y3QJdGVhNjQxNWNfbXVsdGlwbGV4IHZtOworCXN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggdm07CiAKIAkvKiBzZWxlY3QgdmlkZW8gbW9kZSBpbiBzYWE3MTExYSAqLwotCWkgPSBWSURFT19NT0RFX1BBTDsKLQkvKiBmaXhtZTogY3VycmVudGx5IHBvaW50bGVzczogZ2V0cyBvdmVyd3JpdHRlbiBieSBjb25maWd1cmF0aW9uIGJlbG93ICovCi0JbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfTk9STSwgJmkpOwotCi0JLyogd3JpdGUgY29uZmlndXJhdGlvbiB0byBzYWE3MTExYSAqLwotCWluaXQuZGF0YSA9IG14Yl9zYWE3MTExX2luaXQ7Ci0JaW5pdC5sZW4gPSBzaXplb2YobXhiX3NhYTcxMTFfaW5pdCk7Ci0JbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9JTklULCAmaW5pdCk7CisJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsIFZJRElPQ19TX1NURCwgJnN0ZCk7CiAKIAkvKiBzZWxlY3QgdHVuZXItb3V0cHV0IG9uIHNhYTcxMTFhICovCiAJaSA9IDA7Ci0JbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfSU5QVVQsICZpKTsKLQotCS8qIGVuYWJsZSB2YmkgYnlwYXNzICovCi0JaSA9IDE7Ci0JbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfVkJJX0JZUEFTUywgJmkpOworCXJvdXRlLmlucHV0ID0gU0FBNzExNV9DT01QT1NJVEUwOworCXJvdXRlLm91dHB1dCA9IFNBQTcxMTFfRk1UX0NDSVIgfCBTQUE3MTExX1ZCSV9CWVBBU1M7CisJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOwogCiAJLyogc2VsZWN0IGEgdHVuZXIgdHlwZSAqLwogCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsKIAl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CiAJdHVuX3NldHVwLnR5cGUgPSBUVU5FUl9QSElMSVBTX1BBTDsKLQlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lcixUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lciwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CiAJLyogdHVuZSBpbiBzb21lIGZyZXF1ZW5jeSBvbiB0dW5lciAqLwogCW14Yi0+Y3VyX2ZyZXEudHVuZXIgPSAwOwogCW14Yi0+Y3VyX2ZyZXEudHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwpAQCAtMzczLDI3ICszNDIsMjYgQEAKIAlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lciwgVklESU9DX1NfU1RELCAmc3RkKTsKIAogCS8qIG11dGUgYXVkaW8gb24gdGVhNjQyMHMgKi8KLQlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzBdKTsKLQlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzFdKTsKLQlteGItPnRlYTY0MjBfMS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8xLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9jZFs2XVswXSk7Ci0JbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMixURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfY2RbNl1bMV0pOworCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsIFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzBdKTsKKwlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLCBURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVs2XVsxXSk7CisJbXhiLT50ZWE2NDIwXzEtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMSwgVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2NkWzZdWzBdKTsKKwlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLCBURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfY2RbNl1bMV0pOwogCiAJLyogc3dpdGNoIHRvIHR1bmVyLWNoYW5uZWwgb24gdGVhNjQxNWMqLwogCXZtLm91dCA9IDE3OwogCXZtLmluICA9IDM7Ci0JbXhiLT50ZWE2NDE1Yy0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQxNWMsVEVBNjQxNUNfU1dJVENILCAmdm0pOworCW14Yi0+dGVhNjQxNWMtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MTVjLCBURUE2NDE1Q19TV0lUQ0gsICZ2bSk7CiAKIAkvKiBzZWxlY3QgdHVuZXItb3V0cHV0IG9uIG11bHRpY2FibGUgb24gdGVhNjQxNWMqLwogCXZtLmluICA9IDM7CiAJdm0ub3V0ID0gMTM7Ci0JbXhiLT50ZWE2NDE1Yy0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQxNWMsVEVBNjQxNUNfU1dJVENILCAmdm0pOworCW14Yi0+dGVhNjQxNWMtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MTVjLCBURUE2NDE1Q19TV0lUQ0gsICZ2bSk7CiAKIAkvKiB0aGUgcmVzdCBmb3IgbXhiICovCiAJbXhiLT5jdXJfaW5wdXQgPSAwOwogCW14Yi0+Y3VyX211dGUgPSAxOwogCiAJbXhiLT5jdXJfbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JbXhiLT50ZGE5ODQwLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZGE5ODQwLCBUREE5ODQwX1NXSVRDSCwgJm14Yi0+Y3VyX21vZGUpOwogCiAJLyogY2hlY2sgaWYgdGhlIHNhYTc3NDAgKGFrYSAnc291bmQgYXJlbmEgbW9kdWxlJykgaXMgcHJlc2VudAogCSAgIG9uIHRoZSBteGIuIGlmIHNvLCB3ZSBtdXN0IGluaXRpYWxpemUgaXQuIGR1ZSB0byBsYWNrIG9mCkBAIC00MDQsMjEgKzM3MiwyMiBAQAogCW1zZy5sZW4gPSBteGJfc2FhNzc0MF9pbml0WzBdLmxlbmd0aDsKIAltc2cuYnVmID0gJm14Yl9zYWE3NzQwX2luaXRbMF0uZGF0YVswXTsKIAotCWlmKCAxID09IChlcnIgPSBpMmNfdHJhbnNmZXIoJm14Yi0+aTJjX2FkYXB0ZXIsICZtc2csIDEpKSkgeworCWVyciA9IGkyY190cmFuc2ZlcigmbXhiLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7CisJaWYgKGVyciA9PSAxKSB7CiAJCS8qIHRoZSBzb3VuZCBhcmVuYSBtb2R1bGUgaXMgYSBwb3MsIHRoYXQncyBwcm9iYWJseSB0aGUgcmVhc29uCiAJCSAgIHBoaWxpcHMgcmVmdXNlcyB0byBoYW5kIG91dCBhIGRhdGFzaGVldCBmb3IgdGhlIHNhYTc3NDAuLi4KIAkJICAgaXQgc2VlbXMgdG8gc2NyZXcgdXAgdGhlIGkyYyBidXMsIHNvIHdlIGRpc2FibGUgZmFzdCBpcnEKIAkJICAgYmFzZWQgaTJjIHRyYW5zYWN0aW9ucyBoZXJlIGFuZCByZWx5IG9uIHRoZSBzbG93IGFuZCBzYWZlCiAJCSAgIHBvbGxpbmcgbWV0aG9kIC4uLiAqLwogCQlleHRlbnNpb24uZmxhZ3MgJj0gflNBQTcxNDZfVVNFX0kyQ19JUlE7Ci0JCWZvcihpID0gMTs7aSsrKSB7Ci0JCQlpZiggLTEgPT0gbXhiX3NhYTc3NDBfaW5pdFtpXS5sZW5ndGggKSB7CisJCWZvciAoaSA9IDE7IDsgaSsrKSB7CisJCQlpZiAoLTEgPT0gbXhiX3NhYTc3NDBfaW5pdFtpXS5sZW5ndGgpCiAJCQkJYnJlYWs7Ci0JCQl9CiAKIAkJCW1zZy5sZW4gPSBteGJfc2FhNzc0MF9pbml0W2ldLmxlbmd0aDsKIAkJCW1zZy5idWYgPSAmbXhiX3NhYTc3NDBfaW5pdFtpXS5kYXRhWzBdOwotCQkJaWYoIDEgIT0gKGVyciA9IGkyY190cmFuc2ZlcigmbXhiLT5pMmNfYWRhcHRlciwgJm1zZywgMSkpKSB7CisJCQllcnIgPSBpMmNfdHJhbnNmZXIoJm14Yi0+aTJjX2FkYXB0ZXIsICZtc2csIDEpOworCQkJaWYgKGVyciAhPSAxKSB7CiAJCQkJREVCX0QoKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSAnc291bmQgYXJlbmEgbW9kdWxlJy5cbiIpKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTQzMiw3ICs0MDEsOCBAQAogCS8qIGV4dC0+c2FhIGhhcyBiZWVuIGZpbGxlZCBieSB0aGUgY29yZSBkcml2ZXIgKi8KIAogCS8qIHNvbWUgc3R1ZmYgaXMgZG9uZSB2aWEgdmFyaWFibGVzICovCi0Jc2FhNzE0Nl9zZXRfaHBzX3NvdXJjZV9hbmRfc3luYyhkZXYsIGlucHV0X3BvcnRfc2VsZWN0aW9uW214Yi0+Y3VyX2lucHV0XS5ocHNfc291cmNlLCBpbnB1dF9wb3J0X3NlbGVjdGlvbltteGItPmN1cl9pbnB1dF0uaHBzX3N5bmMpOworCXNhYTcxNDZfc2V0X2hwc19zb3VyY2VfYW5kX3N5bmMoZGV2LCBpbnB1dF9wb3J0X3NlbGVjdGlvbltteGItPmN1cl9pbnB1dF0uaHBzX3NvdXJjZSwKKwkJCWlucHV0X3BvcnRfc2VsZWN0aW9uW214Yi0+Y3VyX2lucHV0XS5ocHNfc3luYyk7CiAKIAkvKiBzb21lIHN0dWZmIGlzIGRvbmUgdmlhIGRpcmVjdCB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzICovCiAKQEAgLTQ1NywyNCArNDI3LDI0IEBACiBzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0X3Z2IHZ2X2RhdGE7CiAKIC8qIHRoaXMgZnVuY3Rpb24gb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcm9iaW5nIHdhcyBzdWNjZXNzZnVsICovCi1zdGF0aWMgaW50IG14Yl9hdHRhY2goc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYsIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSAqaW5mbykKK3N0YXRpYyBpbnQgbXhiX2F0dGFjaChzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhICppbmZvKQogewotCXN0cnVjdCBteGIqIG14YiA9IChzdHJ1Y3QgbXhiKilkZXYtPmV4dF9wcml2OworCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAotCURFQl9FRSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOwogCiAJLyogY2hlY2tpbmcgZm9yIGkyYy1kZXZpY2VzIGNhbiBiZSBvbWl0dGVkIGhlcmUsIGJlY2F1c2Ugd2UKIAkgICBhbHJlYWR5IGRpZCB0aGlzIGluICJteGJfdmw0Ml9wcm9iZSIgKi8KIAotCXNhYTcxNDZfdnZfaW5pdChkZXYsJnZ2X2RhdGEpOwotCWlmKCAwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZteGItPnZpZGVvX2RldiwgZGV2LCAibXhiIiwgVkZMX1RZUEVfR1JBQkJFUikpIHsKKwlzYWE3MTQ2X3Z2X2luaXQoZGV2LCAmdnZfZGF0YSk7CisJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZteGItPnZpZGVvX2RldiwgZGV2LCAibXhiIiwgVkZMX1RZUEVfR1JBQkJFUikpIHsKIAkJRVJSKCgiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogaW5pdGlhbGl6YXRpb24gc3R1ZmYgKHZiaSkgKG9ubHkgZm9yIHJldmlzaW9uID4gMCBhbmQgZm9yIGV4dGVuc2lvbnMgd2hpY2ggd2FudCBpdCkqLwotCWlmKCAwICE9IE1YQl9CT0FSRF9DQU5fRE9fVkJJKGRldikpIHsKLQkJaWYoIDAgIT0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmJpX2RldiwgZGV2LCAibXhiIiwgVkZMX1RZUEVfVkJJKSkgeworCWlmIChNWEJfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKSB7CisJCWlmIChzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmbXhiLT52YmlfZGV2LCBkZXYsICJteGIiLCBWRkxfVFlQRV9WQkkpKSB7CiAJCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdmJpIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKIAkJfQogCX0KQEAgLTQ4NiwxOCArNDU2LDE4IEBACiAJaTJjX3VzZV9jbGllbnQobXhiLT5zYWE3MTExYSk7CiAJaTJjX3VzZV9jbGllbnQobXhiLT50dW5lcik7CiAKLQlwcmludGsoIm14YjogZm91bmQgJ011bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkJy0lZC5cbiIsbXhiX251bSk7CisJcHJpbnRrKCJteGI6IGZvdW5kIE11bHRpbWVkaWEgZVh0ZW5zaW9uIEJvYXJkICMlZC5cbiIsIG14Yl9udW0pOwogCiAJbXhiX251bSsrOwogCW14Yl9pbml0X2RvbmUoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBteGJfZGV0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQorc3RhdGljIGludCBteGJfZGV0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQogewotCXN0cnVjdCBteGIqIG14YiA9IChzdHJ1Y3QgbXhiKilkZXYtPmV4dF9wcml2OworCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAotCURFQl9FRSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOwogCiAJaTJjX3JlbGVhc2VfY2xpZW50KG14Yi0+dGVhNjQyMF8xKTsKIAlpMmNfcmVsZWFzZV9jbGllbnQobXhiLT50ZWE2NDIwXzIpOwpAQCAtNTA3LDkgKzQ3Nyw4IEBACiAJaTJjX3JlbGVhc2VfY2xpZW50KG14Yi0+dHVuZXIpOwogCiAJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmbXhiLT52aWRlb19kZXYsZGV2KTsKLQlpZiggMCAhPSBNWEJfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKSB7Ci0JCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJm14Yi0+dmJpX2RldixkZXYpOwotCX0KKwlpZiAoTVhCX0JPQVJEX0NBTl9ET19WQkkoZGV2KSkKKwkJc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSgmbXhiLT52YmlfZGV2LCBkZXYpOwogCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwogCiAJbXhiX251bS0tOwpAQCAtNTIzLDcgKzQ5Miw3IEBACiBzdGF0aWMgaW50IG14Yl9pb2N0bChzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IG14YiogbXhiID0gKHN0cnVjdCBteGIqKWRldi0+ZXh0X3ByaXY7CisJc3RydWN0IG14YiAqbXhiID0gKHN0cnVjdCBteGIgKilkZXYtPmV4dF9wcml2OwogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAogCXN3aXRjaChjbWQpIHsKQEAgLTUzMiwxMSArNTAxLDkgQEAKIAkJc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CiAKIAkJREVCX0VFKCgiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsaS0+aW5kZXgpKTsKLQkJaWYoIGktPmluZGV4IDwgMCB8fCBpLT5pbmRleCA+PSBNWEJfSU5QVVRTKSB7CisJCWlmIChpLT5pbmRleCA8IDAgfHwgaS0+aW5kZXggPj0gTVhCX0lOUFVUUykKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAJCW1lbWNweShpLCAmbXhiX2lucHV0c1tpLT5pbmRleF0sIHNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpOwotCiAJCXJldHVybiAwOwogCX0KIAkvKiB0aGUgc2FhNzE0NiBwcm92aWRlcyBzb21lIGNvbnRyb2xzIChicmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbikKQEAgLTU1MCw3ICs1MTcsNyBAQAogCQlmb3IgKGkgPSBNQVhDT05UUk9MUyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCQlpZiAobXhiX2NvbnRyb2xzW2ldLmlkID09IHFjLT5pZCkgewogCQkJCSpxYyA9IG14Yl9jb250cm9sc1tpXTsKLQkJCQlERUJfRCgoIlZJRElPQ19RVUVSWUNUUkwgJWQuXG4iLHFjLT5pZCkpOworCQkJCURFQl9EKCgiVklESU9DX1FVRVJZQ1RSTCAlZC5cbiIsIHFjLT5pZCkpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CkBAIC01NjIsNTYgKzUyOSw1MSBAQAogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSBNQVhDT05UUk9MUyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAobXhiX2NvbnRyb2xzW2ldLmlkID09IHZjLT5pZCkgeworCQkJaWYgKG14Yl9jb250cm9sc1tpXS5pZCA9PSB2Yy0+aWQpCiAJCQkJYnJlYWs7Ci0JCQl9CiAJCX0KIAotCQlpZiggaSA8IDAgKSB7CisJCWlmIChpIDwgMCkKIAkJCXJldHVybiAtRUFHQUlOOworCisJCWlmICh2Yy0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgeworCQkJdmMtPnZhbHVlID0gbXhiLT5jdXJfbXV0ZTsKKwkJCURFQl9EKCgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkLlxuIiwgdmMtPnZhbHVlKSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXN3aXRjaCAodmMtPmlkICkgewotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiB7Ci0JCQkJdmMtPnZhbHVlID0gbXhiLT5jdXJfbXV0ZTsKLQkJCQlERUJfRCgoIlZJRElPQ19HX0NUUkwgVjRMMl9DSURfQVVESU9fTVVURTolZC5cbiIsdmMtPnZhbHVlKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQotCQlERUJfRUUoKCJWSURJT0NfR19DVFJMIFY0TDJfQ0lEX0FVRElPX01VVEU6JWQuXG4iLHZjLT52YWx1ZSkpOworCQlERUJfRUUoKCJWSURJT0NfR19DVFJMIFY0TDJfQ0lEX0FVRElPX01VVEU6JWQuXG4iLCB2Yy0+dmFsdWUpKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJY2FzZSBWSURJT0NfU19DVFJMOgogCXsKLQkJc3RydWN0CXY0bDJfY29udHJvbAkqdmMgPSBhcmc7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKnZjID0gYXJnOwogCQlpbnQgaSA9IDA7CiAKIAkJZm9yIChpID0gTUFYQ09OVFJPTFMgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKG14Yl9jb250cm9sc1tpXS5pZCA9PSB2Yy0+aWQpIHsKKwkJCWlmIChteGJfY29udHJvbHNbaV0uaWQgPT0gdmMtPmlkKQogCQkJCWJyZWFrOwotCQkJfQogCQl9CiAKLQkJaWYoIGkgPCAwICkgeworCQlpZiAoaSA8IDApCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQogCi0JCXN3aXRjaCAodmMtPmlkICkgewotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiB7Ci0JCQkJbXhiLT5jdXJfbXV0ZSA9IHZjLT52YWx1ZTsKLQkJCQlpZiggMCA9PSB2Yy0+dmFsdWUgKSB7Ci0JCQkJCS8qIHN3aXRjaCB0aGUgYXVkaW8tc291cmNlICovCi0JCQkJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbdmlkZW9fYXVkaW9fY29ubmVjdFtteGItPmN1cl9pbnB1dF1dWzBdKTsKLQkJCQkJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMixURUE2NDIwX1NXSVRDSCwgJlRFQTY0MjBfbGluZVt2aWRlb19hdWRpb19jb25uZWN0W214Yi0+Y3VyX2lucHV0XV1bMV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbNl1bMF0pOwotCQkJCQlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLFRFQTY0MjBfU1dJVENILCAmVEVBNjQyMF9saW5lWzZdWzFdKTsKLQkJCQl9Ci0JCQkJREVCX0VFKCgiVklESU9DX1NfQ1RSTCwgVjRMMl9DSURfQVVESU9fTVVURTogJWQuXG4iLHZjLT52YWx1ZSkpOwotCQkJCWJyZWFrOworCQlpZiAodmMtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKKwkJCW14Yi0+Y3VyX211dGUgPSB2Yy0+dmFsdWU7CisJCQlpZiAoIXZjLT52YWx1ZSkgeworCQkJCS8qIHN3aXRjaCB0aGUgYXVkaW8tc291cmNlICovCisJCQkJbXhiLT50ZWE2NDIwXzEtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMSwgVEVBNjQyMF9TV0lUQ0gsCisJCQkJCQkmVEVBNjQyMF9saW5lW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbbXhiLT5jdXJfaW5wdXRdXVswXSk7CisJCQkJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMiwgVEVBNjQyMF9TV0lUQ0gsCisJCQkJCQkmVEVBNjQyMF9saW5lW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbbXhiLT5jdXJfaW5wdXRdXVsxXSk7CisJCQl9IGVsc2UgeworCQkJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsIFRFQTY0MjBfU1dJVENILAorCQkJCQkJJlRFQTY0MjBfbGluZVs2XVswXSk7CisJCQkJbXhiLT50ZWE2NDIwXzItPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MjBfMiwgVEVBNjQyMF9TV0lUQ0gsCisJCQkJCQkmVEVBNjQyMF9saW5lWzZdWzFdKTsKIAkJCX0KKwkJCURFQl9FRSgoIlZJRElPQ19TX0NUUkwsIFY0TDJfQ0lEX0FVRElPX01VVEU6ICVkLlxuIiwgdmMtPnZhbHVlKSk7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjIwLDEwNiArNTgyLDg0IEBACiAJCWludCAqaW5wdXQgPSAoaW50ICopYXJnOwogCQkqaW5wdXQgPSBteGItPmN1cl9pbnB1dDsKIAotCQlERUJfRUUoKCJWSURJT0NfR19JTlBVVCAlZC5cbiIsKmlucHV0KSk7CisJCURFQl9FRSgoIlZJRElPQ19HX0lOUFVUICVkLlxuIiwgKmlucHV0KSk7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19TX0lOUFVUOgogCXsKIAkJaW50IGlucHV0ID0gKihpbnQgKilhcmc7Ci0JCXN0cnVjdAl0ZWE2NDE1Y19tdWx0aXBsZXggdm07CisJCXN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggdm07CisJCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CiAJCWludCBpID0gMDsKIAotCQlERUJfRUUoKCJWSURJT0NfU19JTlBVVCAlZC5cbiIsaW5wdXQpKTsKKwkJREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCkpOwogCi0JCWlmIChpbnB1dCA8IDAgfHwgaW5wdXQgPj0gTVhCX0lOUFVUUykgeworCQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IE1YQl9JTlBVVFMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qIGZpeG1lOiBsb2NrZSBkYXMgc2V0emVuIGRlcyBpbnB1dHMgbWl0IGhpbGZlIGRlcyBtdXRleGVzCi0JCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JCXZpZGVvX211eChkZXYsKmkpOwotCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0JCSovCi0KLQkJLyogZml4bWU6IGNoZWNrIGlmIHN0cmVhbWluZyBjYXB0dXJlCi0JCWlmICggMCAhPSBkZXYtPnN0cmVhbWluZyApIHsKLQkJCURFQl9EKCgiVklESU9DX1NfSU5QVVQgaWxsZWdhbCB3aGlsZSBzdHJlYW1pbmcuXG4iKSk7Ci0JCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JCSovCiAKIAkJbXhiLT5jdXJfaW5wdXQgPSBpbnB1dDsKIAotCQlzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKGRldiwgaW5wdXRfcG9ydF9zZWxlY3Rpb25baW5wdXRdLmhwc19zb3VyY2UsIGlucHV0X3BvcnRfc2VsZWN0aW9uW2lucHV0XS5ocHNfc3luYyk7CisJCXNhYTcxNDZfc2V0X2hwc19zb3VyY2VfYW5kX3N5bmMoZGV2LCBpbnB1dF9wb3J0X3NlbGVjdGlvbltpbnB1dF0uaHBzX3NvdXJjZSwKKwkJCQlpbnB1dF9wb3J0X3NlbGVjdGlvbltpbnB1dF0uaHBzX3N5bmMpOwogCiAJCS8qIHByZXBhcmUgc3dpdGNoaW5nIG9mIHRlYTY0MTVjIGFuZCBzYWE3MTExYTsKIAkJICAgaGF2ZSBhIGxvb2sgYXQgdGhlICdiYWNrZ3JvdW5kJy1maWxlIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9ucyAgKi8KLQkJc3dpdGNoKCBpbnB1dCApIHsKKwkJc3dpdGNoIChpbnB1dCkgeworCQljYXNlIFRVTkVSOgorCQkJaSA9IFNBQTcxMTVfQ09NUE9TSVRFMDsKKwkJCXZtLmluICA9IDM7CisJCQl2bS5vdXQgPSAxNzsKIAotCQkJY2FzZSBUVU5FUjoKLQkJCXsKLQkJCQlpID0gMDsKLQkJCQl2bS5pbiAgPSAzOwotCQkJCXZtLm91dCA9IDE3OwotCi0JCQlpZiAoIDAgIT0gbXhiLT50ZWE2NDE1Yy0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQxNWMsVEVBNjQxNUNfU1dJVENILCAmdm0pKSB7Ci0JCQkJCXByaW50aygiVklESU9DX1NfSU5QVVQ6IGNvdWxkIG5vdCBhZGRyZXNzIHRlYTY0MTVjICMxXG4iKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCS8qIGNvbm5lY3QgdHVuZXItb3V0cHV0IGFsd2F5cyB0byBtdWx0aWNhYmxlICovCi0JCQkJdm0uaW4gID0gMzsKLQkJCQl2bS5vdXQgPSAxMzsKLQkJCQlicmVhazsKKwkJCWlmIChteGItPnRlYTY0MTVjLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDE1YywgVEVBNjQxNUNfU1dJVENILCAmdm0pKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJWSURJT0NfU19JTlBVVDogY291bGQgbm90IGFkZHJlc3MgdGVhNjQxNWMgIzFcbiIpOworCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQotCQkJY2FzZSBBVVgzX1lDOgotCQkJewotCQkJCS8qIG5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlLiBhdXgzX3ljIGlzCi0JCQkJICAgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBzYWE3MTFhICovCi0JCQkJaSA9IDU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVWDM6Ci0JCQl7Ci0JCQkJLyogbm90aGluZyB0byBiZSBkb25lIGhlcmUuIGF1eDMgaXMKLQkJCQkgICBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHNhYTcxMWEgKi8KLQkJCQlpID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVYMToKLQkJCXsKLQkJCQlpID0gMDsKLQkJCQl2bS5pbiAgPSAxOwotCQkJCXZtLm91dCA9IDE3OwotCQkJCWJyZWFrOwotCQkJfQorCQkJLyogY29ubmVjdCB0dW5lci1vdXRwdXQgYWx3YXlzIHRvIG11bHRpY2FibGUgKi8KKwkJCXZtLmluICA9IDM7CisJCQl2bS5vdXQgPSAxMzsKKwkJCWJyZWFrOworCQljYXNlIEFVWDNfWUM6CisJCQkvKiBub3RoaW5nIHRvIGJlIGRvbmUgaGVyZS4gYXV4M195YyBpcworCQkJICAgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBzYWE3MTFhICovCisJCQlpID0gU0FBNzExNV9TVklERU8xOworCQkJYnJlYWs7CisJCWNhc2UgQVVYMzoKKwkJCS8qIG5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlLiBhdXgzIGlzCisJCQkgICBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHNhYTcxMWEgKi8KKwkJCWkgPSBTQUE3MTE1X0NPTVBPU0lURTE7CisJCQlicmVhazsKKwkJY2FzZSBBVVgxOgorCQkJaSA9IFNBQTcxMTVfQ09NUE9TSVRFMDsKKwkJCXZtLmluICA9IDE7CisJCQl2bS5vdXQgPSAxNzsKKwkJCWJyZWFrOwogCQl9CiAKIAkJLyogc3dpdGNoIHZpZGVvIGluIHRlYTY0MTVjIG9ubHkgaWYgbmVjZXNzYXJ5ICovCi0JCXN3aXRjaCggaW5wdXQgKSB7Ci0JCQljYXNlIFRVTkVSOgotCQkJY2FzZSBBVVgxOgotCQkJewotCQkJCWlmICggMCAhPSBteGItPnRlYTY0MTVjLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDE1YyxURUE2NDE1Q19TV0lUQ0gsICZ2bSkpIHsKLQkJCQkJcHJpbnRrKCJWSURJT0NfU19JTlBVVDogY291bGQgbm90IGFkZHJlc3MgdGVhNjQxNWMgIzNcbiIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoaW5wdXQpIHsKKwkJY2FzZSBUVU5FUjoKKwkJY2FzZSBBVVgxOgorCQkJaWYgKG14Yi0+dGVhNjQxNWMtPmRyaXZlci0+Y29tbWFuZChteGItPnRlYTY0MTVjLCBURUE2NDE1Q19TV0lUQ0gsICZ2bSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZJRElPQ19TX0lOUFVUOiBjb3VsZCBub3QgYWRkcmVzcyB0ZWE2NDE1YyAjM1xuIik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9Ci0JCQlkZWZhdWx0OgotCQkJewotCQkJCWJyZWFrOwotCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQogCiAJCS8qIHN3aXRjaCB2aWRlbyBpbiBzYWE3MTExYSAqLwotCQlpZiAoIDAgIT0gbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsREVDT0RFUl9TRVRfSU5QVVQsICZpKSkgeworCQlyb3V0ZS5pbnB1dCA9IGk7CisJCXJvdXRlLm91dHB1dCA9IDA7CisJCWlmIChteGItPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQobXhiLT5zYWE3MTExYSwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSkpCiAJCQlwcmludGsoIlZJRElPQ19TX0lOUFVUOiBjb3VsZCBub3QgYWRkcmVzcyBzYWE3MTExYSAjMS5cbiIpOwotCQl9CiAKIAkJLyogc3dpdGNoIHRoZSBhdWRpby1zb3VyY2Ugb25seSBpZiBuZWNlc3NhcnkgKi8KIAkJaWYoIDAgPT0gbXhiLT5jdXJfbXV0ZSApIHsKLQkJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbdmlkZW9fYXVkaW9fY29ubmVjdFtpbnB1dF1dWzBdKTsKLQkJCW14Yi0+dGVhNjQyMF8yLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzIsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbdmlkZW9fYXVkaW9fY29ubmVjdFtpbnB1dF1dWzFdKTsKKwkJCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsIFRFQTY0MjBfU1dJVENILAorCQkJCQkmVEVBNjQyMF9saW5lW3ZpZGVvX2F1ZGlvX2Nvbm5lY3RbaW5wdXRdXVswXSk7CisJCQlteGItPnRlYTY0MjBfMi0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGVhNjQyMF8yLCBURUE2NDIwX1NXSVRDSCwKKwkJCQkgICAgICAgJlRFQTY0MjBfbGluZVt2aWRlb19hdWRpb19jb25uZWN0W2lucHV0XV1bMV0pOwogCQl9CiAKIAkJcmV0dXJuIDA7CkBAIC03MjcsMTE0ICs2NjcsNDQgQEAKIAljYXNlIFZJRElPQ19HX1RVTkVSOgogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7Ci0JCWludCBieXRlID0gMDsKIAotCQlpZiggMCAhPSB0LT5pbmRleCApIHsKKwkJaWYgKHQtPmluZGV4KSB7CiAJCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciBhdHRhY2hlZC5cbiIsIHQtPmluZGV4KSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCURFQl9FRSgoIlZJRElPQ19HX1RVTkVSOiAlZFxuIiwgdC0+aW5kZXgpKTsKIAotCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwotCQlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKKwkJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCQlpMmNfY2xpZW50c19jb21tYW5kKCZteGItPmkyY19hZGFwdGVyLCBjbWQsIGFyZyk7CiAKKwkJc3RybGNweSh0LT5uYW1lLCAiVFYgVHVuZXIiLCBzaXplb2YodC0+bmFtZSkpOwogCQl0LT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9OT1JNIHwgVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwgVjRMMl9UVU5FUl9DQVBfTEFORzEgfCBWNEwyX1RVTkVSX0NBUF9MQU5HMiB8IFY0TDJfVFVORVJfQ0FQX1NBUDsKLQkJdC0+cmFuZ2Vsb3cgPSA3NzI7CS8qIDQ4LjI1IE1IWiAvIDYyLjUga0h6ID0gNzcyLCBzZWUgZmkxMjE2bWsyLXNwZWNzLCBwYWdlIDIgKi8KLQkJdC0+cmFuZ2VoaWdoID0gMTM2ODQ7CS8qIDg1NS4yNSBNSHogLyA2Mi41IGtIeiA9IDEzNjg0ICovCi0JCS8qIEZJWE1FOiBhZGQgdGhlIHJlYWwgc2lnbmFsIHN0cmVuZ3RoIGhlcmUgKi8KLQkJdC0+c2lnbmFsID0gMHhmZmZmOwotCQl0LT5hZmMgPSAwOwotCi0JCW14Yi0+dGRhOTg0MC0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dGRhOTg0MCxUREE5ODQwX0RFVEVDVCwgJmJ5dGUpOworCQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STSB8IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFwKKwkJCVY0TDJfVFVORVJfQ0FQX0xBTkcxIHwgVjRMMl9UVU5FUl9DQVBfTEFORzIgfCBWNEwyX1RVTkVSX0NBUF9TQVA7CiAJCXQtPmF1ZG1vZGUgPSBteGItPmN1cl9tb2RlOwotCi0JCWlmKCBieXRlIDwgMCApIHsKLQkJCXQtPnJ4c3ViY2hhbnMgID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJfSBlbHNlIHsKLQkJCXN3aXRjaChieXRlKSB7Ci0JCQkJY2FzZSBUREE5ODQwX01PTk9fREVURUNUOiB7Ci0JCQkJCXQtPnJ4c3ViY2hhbnMgCT0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCQkJREVCX0QoKCJWSURJT0NfR19UVU5FUjogVjRMMl9UVU5FUl9NT0RFX01PTk8uXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFREQTk4NDBfRFVBTF9ERVRFQ1Q6IHsKLQkJCQkJdC0+cnhzdWJjaGFucyAJPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOwotCQkJCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBWNEwyX1RVTkVSX01PREVfTEFORzEuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFREQTk4NDBfU1RFUkVPX0RFVEVDVDogewotCQkJCQl0LT5yeHN1YmNoYW5zIAk9IFY0TDJfVFVORVJfU1VCX1NURVJFTyB8IFY0TDJfVFVORVJfU1VCX01PTk87Ci0JCQkJCURFQl9EKCgiVklESU9DX0dfVFVORVI6IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8uXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0OiB7IC8qIFREQTk4NDBfSU5DT1JSRUNUX0RFVEVDVCAqLwotCQkJCQl0LT5yeHN1YmNoYW5zIAk9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJCQlERUJfRCgoIlZJRElPQ19HX1RVTkVSOiBUREE5ODQwX0lOQ09SUkVDVF9ERVRFQ1QgPT4gVjRMMl9UVU5FUl9NT0RFX01PTk9cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfVFVORVI6CiAJewogCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWludCBieXRlID0gMDsKIAotCQlpZiggMCAhPSB0LT5pbmRleCApIHsKKwkJaWYgKHQtPmluZGV4KSB7CiAJCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciBhdHRhY2hlZC5cbiIsdC0+aW5kZXgpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJc3dpdGNoKHQtPmF1ZG1vZGUpIHsKLQkJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzogewotCQkJCW14Yi0+Y3VyX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwotCQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9TVEVSRU87Ci0JCQkJREVCX0QoKCJWSURJT0NfU19UVU5FUjogVjRMMl9UVU5FUl9NT0RFX1NURVJFT1xuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzI6IHsKLQkJCQlteGItPmN1cl9tb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxX0xBTkcyOwotCQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9CT1RIOwotCQkJCURFQl9EKCgiVklESU9DX1NfVFVORVI6IFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMlxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6IHsKLQkJCQlteGItPmN1cl9tb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOwotCQkJCWJ5dGUgPSBUREE5ODQwX1NFVF9MQU5HMTsKLQkJCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBWNEwyX1RVTkVSX01PREVfTEFORzFcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOiB7Ci0JCQkJbXhiLT5jdXJfbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMjsKLQkJCQlieXRlID0gVERBOTg0MF9TRVRfTEFORzI7Ci0JCQkJREVCX0QoKCJWSURJT0NfU19UVU5FUjogVjRMMl9UVU5FUl9NT0RFX0xBTkcyXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7IC8qIGNhc2UgVjRMMl9UVU5FUl9NT0RFX01PTk86IHsqLwotCQkJCW14Yi0+Y3VyX21vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJCQlieXRlID0gVERBOTg0MF9TRVRfTU9OTzsKLQkJCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBUREE5ODQwX1NFVF9NT05PXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiggMCAhPSAocmVzdWx0ID0gbXhiLT50ZGE5ODQwLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZGE5ODQwLCBUREE5ODQwX1NXSVRDSCwgJmJ5dGUpKSkgewotCQkJcHJpbnRrKCJWSURJT0NfU19UVU5FUiBlcnJvci4gcmVzdWx0OiVkLCBieXRlOiVkXG4iLHJlc3VsdCxieXRlKTsKLQkJfQotCisJCW14Yi0+Y3VyX21vZGUgPSB0LT5hdWRtb2RlOworCQlpMmNfY2xpZW50c19jb21tYW5kKCZteGItPmkyY19hZGFwdGVyLCBjbWQsIGFyZyk7CiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKIAl7CiAJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKIAotCQlpZigwICE9IG14Yi0+Y3VyX2lucHV0KSB7Ci0JCQlERUJfRCgoIlZJRElPQ19HX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIixteGItPmN1cl9pbnB1dCkpOworCQlpZiAobXhiLT5jdXJfaW5wdXQpIHsKKwkJCURFQl9EKCgiVklESU9DX0dfRlJFUTogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIhXG4iLAorCQkJCQkJbXhiLT5jdXJfaW5wdXQpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTg0NywxNCArNzE3LDE0IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CiAKLQkJaWYgKDAgIT0gZi0+dHVuZXIpCisJCWlmIChmLT50dW5lcikKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChWNEwyX1RVTkVSX0FOQUxPR19UViAhPSBmLT50eXBlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYoMCAhPSBteGItPmN1cl9pbnB1dCkgewotCQkJREVCX0QoKCJWSURJT0NfU19GUkVROiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciFcbiIsbXhiLT5jdXJfaW5wdXQpKTsKKwkJaWYgKG14Yi0+Y3VyX2lucHV0KSB7CisJCQlERUJfRCgoIlZJRElPQ19TX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIiwgbXhiLT5jdXJfaW5wdXQpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTg3NSw3ICs3NDUsNyBAQAogCXsKIAkJaW50IGkgPSAqKGludCopYXJnOwogCi0JCWlmKCBpIDwgMCB8fCBpID49IE1YQl9BVURJT1MgKSB7CisJCWlmIChpIDwgMCB8fCBpID49IE1YQl9BVURJT1MpIHsKIAkJCURFQl9EKCgiaWxsZWdhbCBhcmd1bWVudCB0byBNWEJfU19BVURJT19DRDogaTolZC5cbiIsaSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg5MSw3ICs3NjEsNyBAQAogCXsKIAkJaW50IGkgPSAqKGludCopYXJnOwogCi0JCWlmKCBpIDwgMCB8fCBpID49IE1YQl9BVURJT1MgKSB7CisJCWlmIChpIDwgMCB8fCBpID49IE1YQl9BVURJT1MpIHsKIAkJCURFQl9EKCgiaWxsZWdhbCBhcmd1bWVudCB0byBNWEJfU19BVURJT19MSU5FOiBpOiVkLlxuIixpKSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtOTA2LDEyICs3NzYsMTIgQEAKIAl7CiAJCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOwogCi0JCWlmKCBhLT5pbmRleCA8IDAgfHwgYS0+aW5kZXggPiBNWEJfSU5QVVRTICkgewotCQkJREVCX0QoKCJWSURJT0NfR19BVURJTyAlZCBvdXQgb2YgcmFuZ2UuXG4iLGEtPmluZGV4KSk7CisJCWlmIChhLT5pbmRleCA8IDAgfHwgYS0+aW5kZXggPiBNWEJfSU5QVVRTKSB7CisJCQlERUJfRCgoIlZJRElPQ19HX0FVRElPICVkIG91dCBvZiByYW5nZS5cbiIsIGEtPmluZGV4KSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCURFQl9FRSgoIlZJRElPQ19HX0FVRElPICVkLlxuIixhLT5pbmRleCkpOworCQlERUJfRUUoKCJWSURJT0NfR19BVURJTyAlZC5cbiIsIGEtPmluZGV4KSk7CiAJCW1lbWNweShhLCAmbXhiX2F1ZGlvc1t2aWRlb19hdWRpb19jb25uZWN0W214Yi0+Y3VyX2lucHV0XV0sIHNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpbykpOwogCiAJCXJldHVybiAwOwpAQCAtOTE5LDkgKzc4OSwxNiBAQAogCWNhc2UgVklESU9DX1NfQVVESU86CiAJewogCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSA9IGFyZzsKLQkJREVCX0QoKCJWSURJT0NfU19BVURJTyAlZC5cbiIsYS0+aW5kZXgpKTsKKworCQlERUJfRCgoIlZJRElPQ19TX0FVRElPICVkLlxuIiwgYS0+aW5kZXgpKTsKIAkJcmV0dXJuIDA7CiAJfQorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwljYXNlIFZJRElPQ19EQkdfU19SRUdJU1RFUjoKKwljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjoKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmbXhiLT5pMmNfYWRhcHRlciwgY21kLCBhcmcpOworCQlyZXR1cm4gMDsKKyNlbmRpZgogCWRlZmF1bHQ6CiAvKgogCQlERUIyKHByaW50aygiZG9lcyBub3QgaGFuZGxlIHRoaXMgaW9jdGwuXG4iKSk7CkBAIC05NDQsNyArODIxLDcgQEAKIAkJLyogc2V0IHRoZSA3MTQ2IGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEdQSU9fQ1RSTCwgMHgwMDQwNDA1MCk7CiAJCS8qIHVuc2V0IHRoZSA3MTExIGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KLQkJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsIERFQ09ERVJfU0VUX0dQSU8sICZ6ZXJvKTsKKwkJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsIFZJRElPQ19JTlRfU19HUElPLCAmemVybyk7CiAJCW14Yi0+dHVuZXItPmRyaXZlci0+Y29tbWFuZChteGItPnR1bmVyLCBWSURJT0NfU19TVEQsICZzdGQpOwogCX0gZWxzZSB7CiAJCXY0bDJfc3RkX2lkIHN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKQEAgLTk1Myw3ICs4MzAsNyBAQAogCQkvKiBzZXQgdGhlIDcxNDYgZ3BpbyByZWdpc3RlciAtLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMgZXhhY3RseSAqLwogCQlzYWE3MTQ2X3dyaXRlKGRldiwgR1BJT19DVFJMLCAweDAwNDA0MDUwKTsKIAkJLyogc2V0IHRoZSA3MTExIGdwaW8gcmVnaXN0ZXIgLS0gSSBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzIGV4YWN0bHkgKi8KLQkJbXhiLT5zYWE3MTExYS0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+c2FhNzExMWEsIERFQ09ERVJfU0VUX0dQSU8sICZvbmUpOworCQlteGItPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQobXhiLT5zYWE3MTExYSwgVklESU9DX0lOVF9TX0dQSU8sICZvbmUpOwogCQlteGItPnR1bmVyLT5kcml2ZXItPmNvbW1hbmQobXhiLT50dW5lciwgVklESU9DX1NfU1RELCAmc3RkKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDI5LDcgKzkwNiw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG14Yl9pbml0X21vZHVsZSh2b2lkKQogewotCWlmKCAwICE9IHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pKSB7CisJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZleHRlbnNpb24pKSB7CiAJCURFQl9TKCgiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvbi5cbiIpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCmluZGV4IDNkM2M0OGQuLjkzNWQ3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKQEAgLTk3NCwxNCArOTc0LDE0IEBACiAKIAlmb3IgKGkgPSByZWcxOyBpIDw9IHJlZ247IGkrKykgewogCQlyYyA9IGkyY19yKG92LCBpKTsKLQkJaW5mbygiU2Vuc29yWzB4JTAyWF0gPSAweCUwMlgiLCBpLCByYyk7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3JbMHglMDJYXSA9IDB4JTAyWFxuIiwgaSwgcmMpOwogCX0KIH0KIAogc3RhdGljIHZvaWQKIGR1bXBfaTJjX3JlZ3Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCiB7Ci0JaW5mbygiSTJDIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiSTJDIFJFR1NcbiIpOwogCWR1bXBfaTJjX3JhbmdlKG92LCAweDAwLCAweDdDKTsKIH0KIApAQCAtOTkyLDI4ICs5OTIsMjggQEAKIAogCWZvciAoaSA9IHJlZzE7IGkgPD0gcmVnbjsgaSsrKSB7CiAJCXJjID0gcmVnX3Iob3YsIGkpOwotCQlpbmZvKCJPVjUxMVsweCUwMlhdID0gMHglMDJYIiwgaSwgcmMpOworCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiT1Y1MTFbMHglMDJYXSA9IDB4JTAyWFxuIiwgaSwgcmMpOwogCX0KIH0KIAogc3RhdGljIHZvaWQKIG92NTExX2R1bXBfcmVncyhzdHJ1Y3QgdXNiX292NTExICpvdikKIHsKLQlpbmZvKCJDQU1FUkEgSU5URVJGQUNFIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiQ0FNRVJBIElOVEVSRkFDRSBSRUdTXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHgxMCwgMHgxZik7Ci0JaW5mbygiRFJBTSBJTlRFUkZBQ0UgUkVHUyIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJEUkFNIElOVEVSRkFDRSBSRUdTXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHgyMCwgMHgyMyk7Ci0JaW5mbygiSVNPIEZJRk8gUkVHUyIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJJU08gRklGTyBSRUdTXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHgzMCwgMHgzMSk7Ci0JaW5mbygiUElPIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiUElPIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDM4LCAweDM5KTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHgzZSwgMHgzZSk7Ci0JaW5mbygiSTJDIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiSTJDIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDQwLCAweDQ5KTsKLQlpbmZvKCJTWVNURU0gQ09OVFJPTCBSRUdTIik7CisJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNZU1RFTSBDT05UUk9MIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDUwLCAweDU1KTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHg1ZSwgMHg1Zik7Ci0JaW5mbygiT21uaUNFIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiT21uaUNFIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDcwLCAweDc5KTsKIAkvKiBOT1RFOiBRdWFudGl6YXRpb24gdGFibGVzIGFyZSBub3QgcmVhZGFibGUuIFlvdSB3aWxsIGdldCB0aGUgdmFsdWUKIAkgKiBpbiByZWcuIDB4NzkgZm9yIGV2ZXJ5IHRhYmxlIHJlZ2lzdGVyICovCkBAIC0xMDI1LDI1ICsxMDI1LDI1IEBACiBzdGF0aWMgdm9pZAogb3Y1MThfZHVtcF9yZWdzKHN0cnVjdCB1c2Jfb3Y1MTEgKm92KQogewotCWluZm8oIlZJREVPIE1PREUgUkVHUyIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJWSURFTyBNT0RFIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDIwLCAweDJmKTsKLQlpbmZvKCJEQVRBIFBVTVAgQU5EIFNOQVBTSE9UIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiREFUQSBQVU1QIEFORCBTTkFQU0hPVCBSRUdTXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHgzMCwgMHgzZik7Ci0JaW5mbygiSTJDIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiSTJDIFJFR1NcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDQwLCAweDRmKTsKLQlpbmZvKCJTWVNURU0gQ09OVFJPTCBBTkQgVkVORE9SIFJFR1MiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU1lTVEVNIENPTlRST0wgQU5EIFZFTkRPUiBSRUdTXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHg1MCwgMHg1Zik7Ci0JaW5mbygiNjAgLSA2RiIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICI2MCAtIDZGXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHg2MCwgMHg2Zik7Ci0JaW5mbygiNzAgLSA3RiIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICI3MCAtIDdGXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHg3MCwgMHg3Zik7Ci0JaW5mbygiWSBRVUFOVElaQVRJT04gVEFCTEUiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiWSBRVUFOVElaQVRJT04gVEFCTEVcbiIpOwogCWR1bXBfcmVnX3JhbmdlKG92LCAweDgwLCAweDhmKTsKLQlpbmZvKCJVViBRVUFOVElaQVRJT04gVEFCTEUiKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiVVYgUVVBTlRJWkFUSU9OIFRBQkxFXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHg5MCwgMHg5Zik7Ci0JaW5mbygiQTAgLSBCRiIpOworCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJBMCAtIEJGXG4iKTsKIAlkdW1wX3JlZ19yYW5nZShvdiwgMHhhMCwgMHhiZik7Ci0JaW5mbygiQ0JSIik7CisJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkNCUlxuIik7CiAJZHVtcF9yZWdfcmFuZ2Uob3YsIDB4YzAsIDB4Y2YpOwogfQogI2VuZGlmCkBAIC0zMjA1LDkgKzMyMDUsMTAgQEAKIAkgKi8KIAogCWlmIChwcmludHBoKSB7Ci0JCWluZm8oInBoKCUzZCk6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4IiwKLQkJICAgICBwbnVtLCBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSwKLQkJICAgICBpbls3XSwgaW5bOF0sIGluWzldLCBpblsxMF0sIGluWzExXSk7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsCisJCQkgInBoKCUzZCk6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLAorCQkJIHBudW0sIGluWzBdLCBpblsxXSwgaW5bMl0sIGluWzNdLCBpbls0XSwgaW5bNV0sIGluWzZdLAorCQkJIGluWzddLCBpbls4XSwgaW5bOV0sIGluWzEwXSwgaW5bMTFdKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgU09GL0VPRiBwYWNrZXQgKi8KQEAgLTMzNjYsOCArMzM2NywxMCBAQAogCSAqIHRoZSBkZWZpbml0aXZlIFNPRi9FT0YgZm9ybWF0ICovCiAJaWYgKCghKGluWzBdIHwgaW5bMV0gfCBpblsyXSB8IGluWzNdIHwgaW5bNV0pKSAmJiBpbls2XSkgewogCQlpZiAocHJpbnRwaCkgewotCQkJaW5mbygicGg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMngiLCBpblswXSwKLQkJCSAgICAgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSwgaW5bN10pOworCQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwKKwkJCQkgInBoOiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLAorCQkJCSBpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLAorCQkJCSBpbls2XSwgaW5bN10pOwogCQl9CiAKIAkJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU1RBVEVfTElORVMpIHsKQEAgLTM1OTEsNyArMzU5NCw3IEBACiBvdjUxeF9pbml0X2lzb2Moc3RydWN0IHVzYl9vdjUxMSAqb3YpCiB7CiAJc3RydWN0IHVyYiAqdXJiOwotCWludCBmeCwgZXJyLCBuLCBzaXplOworCWludCBmeCwgZXJyLCBuLCBpLCBzaXplOwogCiAJUERFQlVHKDMsICIqKiogSW5pdGlhbGl6aW5nIGNhcHR1cmUgKioqIik7CiAKQEAgLTM2NDYsMTQgKzM2NDksMTYgQEAKIAkJaWYgKHBhY2tldHNpemUgPT0gLTEpIHsKIAkJCW92NTE4X3NldF9wYWNrZXRfc2l6ZShvdiwgNjQwKTsKIAkJfSBlbHNlIHsKLQkJCWluZm8oIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWQiLCBwYWNrZXRzaXplKTsKKwkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJGb3JjaW5nIHBhY2tldCBzaXplIHRvICVkXG4iLAorCQkJCSBwYWNrZXRzaXplKTsKIAkJCW92NTE4X3NldF9wYWNrZXRfc2l6ZShvdiwgcGFja2V0c2l6ZSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocGFja2V0c2l6ZSA9PSAtMSkgewogCQkJb3Y1MTFfc2V0X3BhY2tldF9zaXplKG92LCBzaXplKTsKIAkJfSBlbHNlIHsKLQkJCWluZm8oIkZvcmNpbmcgcGFja2V0IHNpemUgdG8gJWQiLCBwYWNrZXRzaXplKTsKKwkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJGb3JjaW5nIHBhY2tldCBzaXplIHRvICVkXG4iLAorCQkJCSBwYWNrZXRzaXplKTsKIAkJCW92NTExX3NldF9wYWNrZXRfc2l6ZShvdiwgcGFja2V0c2l6ZSk7CiAJCX0KIAl9CkBAIC0zNjYyLDYgKzM2NjcsOCBAQAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKEZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7CiAJCQllcnIoImluaXQgaXNvYzogdXNiX2FsbG9jX3VyYiByZXQuIE5VTEwiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJdXNiX2ZyZWVfdXJiKG92LT5zYnVmW2ldLnVyYik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlvdi0+c2J1ZltuXS51cmIgPSB1cmI7CkBAIC00MTE5LDcgKzQxMjYsNyBAQAogCQkJcmV0dXJuIC1FSU87CiAKIAkJaWYgKGZvcmNlX3BhbGV0dGUgJiYgcC0+cGFsZXR0ZSAhPSBmb3JjZV9wYWxldHRlKSB7Ci0JCQlpbmZvKCJQYWxldHRlIHJlamVjdGVkICglcykiLAorCQkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlBhbGV0dGUgcmVqZWN0ZWQgKCVzKVxuIiwKIAkJCSAgICAgc3ltYm9saWModjRsMV9wbGlzdCwgcC0+cGFsZXR0ZSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTQ4NDcsMjYgKzQ4NTQsMjcgQEAKIAkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKIAkJcmV0dXJuIC0xOwogCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMykgewotCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y3NjEwIik7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y3NjEwXG4iKTsKIAkJb3YtPnNlbnNvciA9IFNFTl9PVjc2MTA7CiAJfSBlbHNlIGlmICgocmMgJiAzKSA9PSAxKSB7CiAJCS8qIEkgZG9uJ3Qga25vdyB3aGF0J3MgZGlmZmVyZW50IGFib3V0IHRoZSA3NkJFIHlldC4gKi8KIAkJaWYgKGkyY19yKG92LCAweDE1KSAmIDEpCi0JCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y3NjIwQUUiKTsKKwkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y3NjIwQUVcbiIpOwogCQllbHNlCi0JCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y3NkJFIik7CisJCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAiU2Vuc29yIGlzIGFuIE9WNzZCRVxuIik7CiAKIAkJLyogT1Y1MTErIHdpbGwgcmV0dXJuIGFsbCB6ZXJvIGlzb2MgZGF0YSB1bmxlc3Mgd2UKIAkJICogY29uZmlndXJlIHRoZSBzZW5zb3IgYXMgYSA3NjIwLiBTb21lb25lIG5lZWRzIHRvCiAJCSAqIGZpbmQgdGhlIGV4YWN0IHJlZy4gc2V0dGluZyB0aGF0IGNhdXNlcyB0aGlzLiAqLwogCQlpZiAob3YtPmJyaWRnZSA9PSBCUkdfT1Y1MTFQTFVTKSB7Ci0JCQlpbmZvKCJFbmFibGluZyA1MTErLzc2MjBBRSB3b3JrYXJvdW5kIik7CisJCQlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LAorCQkJCSAiRW5hYmxpbmcgNTExKy83NjIwQUUgd29ya2Fyb3VuZFxuIik7CiAJCQlvdi0+c2Vuc29yID0gU0VOX09WNzYyMDsKIAkJfSBlbHNlIHsKIAkJCW92LT5zZW5zb3IgPSBTRU5fT1Y3NkJFOwogCQl9CiAJfSBlbHNlIGlmICgocmMgJiAzKSA9PSAwKSB7Ci0JCWluZm8oIlNlbnNvciBpcyBhbiBPVjc2MjAiKTsKKwkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNlbnNvciBpcyBhbiBPVjc2MjBcbiIpOwogCQlvdi0+c2Vuc29yID0gU0VOX09WNzYyMDsKIAl9IGVsc2UgewogCQllcnIoIlVua25vd24gaW1hZ2Ugc2Vuc29yIHZlcnNpb246ICVkIiwgcmMgJiAzKTsKQEAgLTUwMjIsMTYgKzUwMzAsMTYgQEAKIAogCWlmICgocmMgJiAzKSA9PSAwKSB7CiAJCW92LT5zZW5zb3IgPSBTRU5fT1Y2NjMwOwotCQlpbmZvKCJTZW5zb3IgaXMgYW4gT1Y2NjMwIik7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y2NjMwXG4iKTsKIAl9IGVsc2UgaWYgKChyYyAmIDMpID09IDEpIHsKIAkJb3YtPnNlbnNvciA9IFNFTl9PVjY2MjA7Ci0JCWluZm8oIlNlbnNvciBpcyBhbiBPVjY2MjAiKTsKKwkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIlNlbnNvciBpcyBhbiBPVjY2MjBcbiIpOwogCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMikgewogCQlvdi0+c2Vuc29yID0gU0VOX09WNjYzMDsKLQkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYzMEFFIik7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y2NjMwQUVcbiIpOwogCX0gZWxzZSBpZiAoKHJjICYgMykgPT0gMykgewogCQlvdi0+c2Vuc29yID0gU0VOX09WNjYzMDsKLQkJaW5mbygiU2Vuc29yIGlzIGFuIE9WNjYzMEFGIik7CisJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYW4gT1Y2NjMwQUZcbiIpOwogCX0KIAogCS8qIFNldCBzZW5zb3Itc3BlY2lmaWMgdmFycyAqLwpAQCAtNTA4NiwxMCArNTA5NCwxMCBAQAogCQkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHR5cGUiKTsKIAkJCXJldHVybiAtMTsKIAkJfSBlbHNlIGlmICgocmMgJiAweDBmKSA9PSAwKSB7Ci0JCQlpbmZvKCJTZW5zb3IgaXMgYSBLUzAxMjciKTsKKwkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYSBLUzAxMjdcbiIpOwogCQkJb3YtPnNlbnNvciA9IFNFTl9LUzAxMjc7CiAJCX0gZWxzZSBpZiAoKHJjICYgMHgwZikgPT0gOSkgewotCQkJaW5mbygiU2Vuc29yIGlzIGEgS1MwMTI3QiBSZXYuIEEiKTsKKwkJCWRldl9pbmZvKCZvdi0+ZGV2LT5kZXYsICJTZW5zb3IgaXMgYSBLUzAxMjdCIFJldi4gQVxuIik7CiAJCQlvdi0+c2Vuc29yID0gU0VOX0tTMDEyN0I7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTE5OCw3ICs1MjA2LDggQEAKIAkJZXJyKCJFcnJvciBkZXRlY3Rpbmcgc2Vuc29yIHZlcnNpb24iKTsKIAkJcmV0dXJuIC0xOwogCX0gZWxzZSB7Ci0JCWluZm8oIlNlbnNvciBpcyBhbiBTQUE3MTExQSAodmVyc2lvbiAweCV4KSIsIHJjKTsKKwkJZGV2X2luZm8oJm92LT5kZXYtPmRldiwKKwkJCSAiU2Vuc29yIGlzIGFuIFNBQTcxMTFBICh2ZXJzaW9uIDB4JXgpXG4iLCByYyk7CiAJCW92LT5zZW5zb3IgPSBTRU5fU0FBNzExMUE7CiAJfQogCkBAIC01MjYwLDcgKzUyNjksNyBAQAogCiAJUERFQlVHICgxLCAiQ3VzdG9tSUQgPSAlZCIsIG92LT5jdXN0b21pZCk7CiAJb3YtPmRlc2MgPSBzeW1ib2xpYyhjYW1saXN0LCBvdi0+Y3VzdG9taWQpOwotCWluZm8oIm1vZGVsOiAlcyIsIG92LT5kZXNjKTsKKwlkZXZfaW5mbygmb3YtPmRldi0+ZGV2LCAibW9kZWw6ICVzXG4iLCBvdi0+ZGVzYyk7CiAKIAlpZiAoMCA9PSBzdHJjbXAob3YtPmRlc2MsIE5PVF9ERUZJTkVEX1NUUikpIHsKIAkJZXJyKCJDYW1lcmEgdHlwZSAoJWQpIG5vdCByZWNvZ25pemVkIiwgb3YtPmN1c3RvbWlkKTsKQEAgLTU0MjQsNyArNTQzMyw4IEBACiAJUERFQlVHKDQsICIiKTsKIAogCS8qIEZpcnN0IDUgYml0cyBvZiBjdXN0b20gSUQgcmVnIGFyZSBhIHJldmlzaW9uIElEIG9uIE9WNTE4ICovCi0JaW5mbygiRGV2aWNlIHJldmlzaW9uICVkIiwgMHgxRiAmIHJlZ19yKG92LCBSNTExX1NZU19DVVNUX0lEKSk7CisJZGV2X2luZm8oJm92LT5kZXYtPmRldiwgIkRldmljZSByZXZpc2lvbiAlZFxuIiwKKwkJIDB4MUYgJiByZWdfcihvdiwgUjUxMV9TWVNfQ1VTVF9JRCkpOwogCiAJLyogR2l2ZSBpdCB0aGUgZGVmYXVsdCBkZXNjcmlwdGlvbiAqLwogCW92LT5kZXNjID0gc3ltYm9saWMoY2FtbGlzdCwgMCk7CkBAIC01NjUxLDcgKzU2NjEsNyBAQAogCWlmICghb3YtPmRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJc2Vuc29yX2dldF9leHBvc3VyZShvdiwgJmV4cCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGV4cCA+PiA4KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZXhwKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihleHBvc3VyZSwgU19JUlVHTywgc2hvd19leHBvc3VyZSwgTlVMTCk7CiAKQEAgLTU3NzEsNyArNTc4MSw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaW5mbygiVVNCICVzIHZpZGVvIGRldmljZSBmb3VuZCIsIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVVNCICVzIHZpZGVvIGRldmljZSBmb3VuZFxuIiwKKwkJIHN5bWJvbGljKGJyZ2xpc3QsIG92LT5icmlkZ2UpKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm92LT53cSk7CiAKQEAgLTU4NTIsOCArNTg2Myw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaW5mbygiRGV2aWNlIGF0ICVzIHJlZ2lzdGVyZWQgdG8gbWlub3IgJWQiLCBvdi0+dXNiX3BhdGgsCi0JICAgICBvdi0+dmRldi0+bWlub3IpOworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJEZXZpY2UgYXQgJXMgcmVnaXN0ZXJlZCB0byBtaW5vciAlZFxuIiwKKwkJIG92LT51c2JfcGF0aCwgb3YtPnZkZXYtPm1pbm9yKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgb3YpOwogCWlmIChvdl9jcmVhdGVfc3lzZnMob3YtPnZkZXYpKSB7CkBAIC01OTU2LDcgKzU5NjcsOCBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0OwogCi0JaW5mbyhEUklWRVJfVkVSU0lPTiAiIDogIiBEUklWRVJfREVTQyk7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgorCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKIAogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC01OTY2LDggKzU5NzgsNyBAQAogdXNiX292NTExX2V4aXQodm9pZCkKIHsKIAl1c2JfZGVyZWdpc3Rlcigmb3Y1MTFfZHJpdmVyKTsKLQlpbmZvKCJkcml2ZXIgZGVyZWdpc3RlcmVkIik7Ci0KKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6IGRyaXZlciBkZXJlZ2lzdGVyZWRcbiIpOwogfQogCiBtb2R1bGVfaW5pdCh1c2Jfb3Y1MTFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmgKaW5kZXggYmFkZWQxMi4uNzBkOTllNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuaApAQCAtMTIsNyArMTIsOCBAQAogCiAjaWZkZWYgT1Y1MTFfREVCVUcKIAkjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCi0JCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSBpbmZvKCJbJXM6JWRdICIgZm10LCBcCisJCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKQlcCisJCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICJbJXM6JWRdIFxuIiBmbXQsIFwKIAkJX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncykKICNlbHNlCiAJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCmluZGV4IDA2NWMyNDUuLjJjNGFjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpAQCAtNDksMTIgKzQ5LDYgQEAKICNkZWZpbmUgR0VORVJJQ19SRUdfSURfTE9XICAgICAgICAweDFECS8qIG1hbnVmYWN0dXJlciBJRCBMU0IgKi8KICNkZWZpbmUgR0VORVJJQ19SRUdfQ09NX0kgICAgICAgICAweDI5CS8qIG1pc2MgSUQgYml0cyAqLwogCi1leHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y2eDIwX29wczsKLWV4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjZ4MzBfb3BzOwotZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92N3gxMF9vcHM7Ci1leHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3eDIwX29wczsKLWV4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjc2YmVfb3BzOwotCiBzdGF0aWMgY2hhciAqY2hpcF9uYW1lc1tOVU1fQ0NfVFlQRVNdID0gewogCVtDQ19VTktOT1dOXQk9ICJVbmtub3duIGNoaXAiLAogCVtDQ19PVjc2QkVdCT0gIk9WNzZCRSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX3ByaXYuaAppbmRleCA5YWZhNGZlLi5hMDU2NTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9wcml2LmgKQEAgLTUzLDYgKzUzLDEyIEBACiAJaW50IGluaXRpYWxpemVkOyAgICAgICAgICAgLyogT1ZDQU1DSElQX0NNRF9JTklUSUFMSVpFIHdhcyBzdWNjZXNzZnVsICovCiB9OwogCitleHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y2eDIwX29wczsKK2V4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjZ4MzBfb3BzOworZXh0ZXJuIHN0cnVjdCBvdmNhbWNoaXBfb3BzIG92N3gxMF9vcHM7CitleHRlcm4gc3RydWN0IG92Y2FtY2hpcF9vcHMgb3Y3eDIwX29wczsKK2V4dGVybiBzdHJ1Y3Qgb3ZjYW1jaGlwX29wcyBvdjc2YmVfb3BzOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qICAgICAgICAgICAgICBJMkMgSS9PICAgICAgICAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCA3Yzg0Zjc5Li45OTQ4MDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0dXJlOwogCWludCBoZWlnaHQ7CiAJaW50IHdpZHRoOworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIApAQCAtODgxLDEwICs4ODIsMjcgQEAKIAlyZXR1cm4gbGVuOwogfQogCitzdGF0aWMgaW50IHBtc19leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcG1zX2RldmljZSAqcGQgPSAoc3RydWN0IHBtc19kZXZpY2UgKil2OworCisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnBkLT5pbl91c2UpID8gLUVCVVNZIDogMDsKK30KKworc3RhdGljIGludCBwbXNfZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHBtc19kZXZpY2UgKnBkID0gKHN0cnVjdCBwbXNfZGV2aWNlICopdjsKKworCWNsZWFyX2JpdCgwLCAmcGQtPmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBtc19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKKwkub3BlbiAgICAgICAgICAgPSBwbXNfZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gcG1zX2V4Y2x1c2l2ZV9yZWxlYXNlLAogCS5pb2N0bCAgICAgICAgICA9IHBtc19pb2N0bCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKQEAgLTg5Nyw2ICs5MTUsNyBAQAogewogCS5uYW1lCQk9ICJNZWRpYXZpc2lvbiBQTVMiLAogCS5mb3BzICAgICAgICAgICA9ICZwbXNfZm9wcywKKwkucmVsZWFzZSAJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG1zX2RldmljZSBwbXNfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3RybC5jCmluZGV4IDA3NjRmYmYuLjIwM2Y1NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWN0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1jdHJsLmMKQEAgLTEzNCwxMyArMTM0LDE3IEBACiAKIAogLyogUmV0cmlldmUgY29udHJvbCdzIGRlZmF1bHQgdmFsdWUgKGFueSB0eXBlKSAqLwotaW50IHB2cjJfY3RybF9nZXRfZGVmKHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIpCitpbnQgcHZyMl9jdHJsX2dldF9kZWYoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICp2YWxwdHIpCiB7CiAJaW50IHJldCA9IDA7CiAJaWYgKCFjcHRyKSByZXR1cm4gMDsKIAlMT0NLX1RBS0UoY3B0ci0+aGR3LT5iaWdfbG9jayk7IGRvIHsKIAkJaWYgKGNwdHItPmluZm8tPnR5cGUgPT0gcHZyMl9jdGxfaW50KSB7Ci0JCQlyZXQgPSBjcHRyLT5pbmZvLT5kZWZhdWx0X3ZhbHVlOworCQkJaWYgKGNwdHItPmluZm8tPmdldF9kZWZfdmFsdWUpIHsKKwkJCQlyZXQgPSBjcHRyLT5pbmZvLT5nZXRfZGVmX3ZhbHVlKGNwdHIsIHZhbHB0cik7CisJCQl9IGVsc2UgeworCQkJCSp2YWxwdHIgPSBjcHRyLT5pbmZvLT5kZWZhdWx0X3ZhbHVlOworCQkJfQogCQl9CiAJfSB3aGlsZSgwKTsgTE9DS19HSVZFKGNwdHItPmhkdy0+YmlnX2xvY2spOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1jdHJsLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1jdHJsLmgKaW5kZXggMDM3MWFlNi4uNzk0ZmY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3RybC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWN0cmwuaApAQCAtNDksNyArNDksNyBAQAogaW50IHB2cjJfY3RybF9nZXRfbWluKHN0cnVjdCBwdnIyX2N0cmwgKik7CiAKIC8qIFJldHJpZXZlIGNvbnRyb2wncyBkZWZhdWx0IHZhbHVlIChhbnkgdHlwZSkgKi8KLWludCBwdnIyX2N0cmxfZ2V0X2RlZihzdHJ1Y3QgcHZyMl9jdHJsICopOworaW50IHB2cjJfY3RybF9nZXRfZGVmKHN0cnVjdCBwdnIyX2N0cmwgKiwgaW50ICp2YWxwdHIpOwogCiAvKiBSZXRyaWV2ZSBjb250cm9sJ3MgZW51bWVyYXRpb24gY291bnQgKGVudW0gb25seSkgKi8KIGludCBwdnIyX2N0cmxfZ2V0X2NudChzdHJ1Y3QgcHZyMl9jdHJsICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jCmluZGV4IDg4ZTE3NTEuLmNiZTJhMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmMKQEAgLTQ4OSw2ICs0ODksOCBAQAogc3RydWN0IHVzYl9kZXZpY2VfaWQgcHZyMl9kZXZpY2VfdGFibGVbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDI5MDApLAogCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZwdnIyX2RldmljZV8yOXh4eH0sCisJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHgyOTUwKSwgLyogTG9naWNhbGx5IGlkZW50aWNhbCB0byAyOTAwICovCisJICAuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJnB2cjJfZGV2aWNlXzI5eHh4fSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDI0MDApLAogCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZwdnIyX2RldmljZV8yNHh4eH0sCiAJeyBVU0JfREVWSUNFKDB4MTE2NCwgMHgwNjIyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LWludGVybmFsLmgKaW5kZXggNjU3Zjg2MS4uZGU3ZWU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LWludGVybmFsLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LWludGVybmFsLmgKQEAgLTgyLDYgKzgyLDcgQEAKIAogCS8qIENvbnRyb2wncyBpbXBsZW1lbnRhdGlvbiAqLwogCXB2cjJfY3RsZl9nZXRfdmFsdWUgZ2V0X3ZhbHVlOyAgICAgIC8qIEdldCBpdHMgdmFsdWUgKi8KKwlwdnIyX2N0bGZfZ2V0X3ZhbHVlIGdldF9kZWZfdmFsdWU7ICAvKiBHZXQgaXRzIGRlZmF1bHQgdmFsdWUgKi8KIAlwdnIyX2N0bGZfZ2V0X3ZhbHVlIGdldF9taW5fdmFsdWU7ICAvKiBHZXQgbWluaW11bSBhbGxvd2VkIHZhbHVlICovCiAJcHZyMl9jdGxmX2dldF92YWx1ZSBnZXRfbWF4X3ZhbHVlOyAgLyogR2V0IG1heGltdW0gYWxsb3dlZCB2YWx1ZSAqLwogCXB2cjJfY3RsZl9zZXRfdmFsdWUgc2V0X3ZhbHVlOyAgICAgIC8qIFNldCBpdHMgdmFsdWUgKi8KQEAgLTMwNyw2ICszMDgsMTAgQEAKIAlzdHJ1Y3QgdjRsMl90dW5lciB0dW5lcl9zaWduYWxfaW5mbzsKIAlpbnQgdHVuZXJfc2lnbmFsX3N0YWxlOwogCisJLyogQ3JvcHBpbmcgY2FwYWJpbGl0eSBpbmZvICovCisJc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwX2luZm87CisJaW50IGNyb3BjYXBfc3RhbGU7CisKIAkvKiBWaWRlbyBzdGFuZGFyZCBoYW5kbGluZyAqLwogCXY0bDJfc3RkX2lkIHN0ZF9tYXNrX2VlcHJvbTsgLy8gSGFyZHdhcmUgc3VwcG9ydGVkIHNlbGVjdGlvbnMKIAl2NGwyX3N0ZF9pZCBzdGRfbWFza19hdmFpbDsgIC8vIFdoaWNoIHN0YW5kYXJkcyB3ZSBtYXkgc2VsZWN0IGZyb20KQEAgLTM2Nyw2ICszNzIsMTAgQEAKIAlWQ1JFQVRFX0RBVEEoYmFzcyk7CiAJVkNSRUFURV9EQVRBKHRyZWJsZSk7CiAJVkNSRUFURV9EQVRBKG11dGUpOworCVZDUkVBVEVfREFUQShjcm9wbCk7CisJVkNSRUFURV9EQVRBKGNyb3B0KTsKKwlWQ1JFQVRFX0RBVEEoY3JvcHcpOworCVZDUkVBVEVfREFUQShjcm9waCk7CiAJVkNSRUFURV9EQVRBKGlucHV0KTsKIAlWQ1JFQVRFX0RBVEEoYXVkaW9tb2RlKTsKIAlWQ1JFQVRFX0RBVEEocmVzX2hvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IGYwNTFjNmEuLjk0MjY1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0yOTgsNiArMjk4LDcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCxpbnQgcHJvYmVfZmwsCiAJCQkJdm9pZCAqd3JpdGVfZGF0YSx1bnNpZ25lZCBpbnQgd3JpdGVfbGVuLAogCQkJCXZvaWQgKnJlYWRfZGF0YSx1bnNpZ25lZCBpbnQgcmVhZF9sZW4pOworc3RhdGljIGludCBwdnIyX2hkd19jaGVja19jcm9wY2FwKHN0cnVjdCBwdnIyX2hkdyAqaGR3KTsKIAogCiBzdGF0aWMgdm9pZCB0cmFjZV9zdGJpdChjb25zdCBjaGFyICpuYW1lLGludCB2YWwpCkBAIC00MDIsNiArNDAzLDE5NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGN0cmxfY3JvcGxfbWluX2dldChzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyLCBpbnQgKmxlZnQpCit7CisJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gJmNwdHItPmhkdy0+Y3JvcGNhcF9pbmZvOworCWludCBzdGF0ID0gcHZyMl9oZHdfY2hlY2tfY3JvcGNhcChjcHRyLT5oZHcpOworCWlmIChzdGF0ICE9IDApIHsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCSpsZWZ0ID0gY2FwLT5ib3VuZHMubGVmdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2Nyb3BsX21heF9nZXQoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICpsZWZ0KQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqbGVmdCA9IGNhcC0+Ym91bmRzLmxlZnQ7CisJaWYgKGNhcC0+Ym91bmRzLndpZHRoID4gY3B0ci0+aGR3LT5jcm9wd192YWwpIHsKKwkJKmxlZnQgKz0gY2FwLT5ib3VuZHMud2lkdGggLSBjcHRyLT5oZHctPmNyb3B3X3ZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9jcm9wdF9taW5fZ2V0KHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdG9wKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdG9wID0gY2FwLT5ib3VuZHMudG9wOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN0cmxfY3JvcHRfbWF4X2dldChzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyLCBpbnQgKnRvcCkKK3sKKwlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYXAgPSAmY3B0ci0+aGR3LT5jcm9wY2FwX2luZm87CisJaW50IHN0YXQgPSBwdnIyX2hkd19jaGVja19jcm9wY2FwKGNwdHItPmhkdyk7CisJaWYgKHN0YXQgIT0gMCkgeworCQlyZXR1cm4gc3RhdDsKKwl9CisJKnRvcCA9IGNhcC0+Ym91bmRzLnRvcDsKKwlpZiAoY2FwLT5ib3VuZHMuaGVpZ2h0ID4gY3B0ci0+aGR3LT5jcm9waF92YWwpIHsKKwkJKnRvcCArPSBjYXAtPmJvdW5kcy5oZWlnaHQgLSBjcHRyLT5oZHctPmNyb3BoX3ZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9jcm9wd19tYXhfZ2V0KHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gMDsKKwlpZiAoY2FwLT5ib3VuZHMud2lkdGggPiBjcHRyLT5oZHctPmNyb3BsX3ZhbCkgeworCQkqdmFsID0gY2FwLT5ib3VuZHMud2lkdGggLSBjcHRyLT5oZHctPmNyb3BsX3ZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9jcm9waF9tYXhfZ2V0KHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gMDsKKwlpZiAoY2FwLT5ib3VuZHMuaGVpZ2h0ID4gY3B0ci0+aGR3LT5jcm9wdF92YWwpIHsKKwkJKnZhbCA9IGNhcC0+Ym91bmRzLmhlaWdodCAtIGNwdHItPmhkdy0+Y3JvcHRfdmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2dldF9jcm9wY2FwYmwoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICp2YWwpCit7CisJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gJmNwdHItPmhkdy0+Y3JvcGNhcF9pbmZvOworCWludCBzdGF0ID0gcHZyMl9oZHdfY2hlY2tfY3JvcGNhcChjcHRyLT5oZHcpOworCWlmIChzdGF0ICE9IDApIHsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCSp2YWwgPSBjYXAtPmJvdW5kcy5sZWZ0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN0cmxfZ2V0X2Nyb3BjYXBidChzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYXAgPSAmY3B0ci0+aGR3LT5jcm9wY2FwX2luZm87CisJaW50IHN0YXQgPSBwdnIyX2hkd19jaGVja19jcm9wY2FwKGNwdHItPmhkdyk7CisJaWYgKHN0YXQgIT0gMCkgeworCQlyZXR1cm4gc3RhdDsKKwl9CisJKnZhbCA9IGNhcC0+Ym91bmRzLnRvcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2dldF9jcm9wY2FwYncoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICp2YWwpCit7CisJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gJmNwdHItPmhkdy0+Y3JvcGNhcF9pbmZvOworCWludCBzdGF0ID0gcHZyMl9oZHdfY2hlY2tfY3JvcGNhcChjcHRyLT5oZHcpOworCWlmIChzdGF0ICE9IDApIHsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCSp2YWwgPSBjYXAtPmJvdW5kcy53aWR0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2dldF9jcm9wY2FwYmgoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICp2YWwpCit7CisJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gJmNwdHItPmhkdy0+Y3JvcGNhcF9pbmZvOworCWludCBzdGF0ID0gcHZyMl9oZHdfY2hlY2tfY3JvcGNhcChjcHRyLT5oZHcpOworCWlmIChzdGF0ICE9IDApIHsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCSp2YWwgPSBjYXAtPmJvdW5kcy5oZWlnaHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9nZXRfY3JvcGNhcGRsKHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gY2FwLT5kZWZyZWN0LmxlZnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9nZXRfY3JvcGNhcGR0KHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gY2FwLT5kZWZyZWN0LnRvcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2dldF9jcm9wY2FwZHcoc3RydWN0IHB2cjJfY3RybCAqY3B0ciwgaW50ICp2YWwpCit7CisJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gJmNwdHItPmhkdy0+Y3JvcGNhcF9pbmZvOworCWludCBzdGF0ID0gcHZyMl9oZHdfY2hlY2tfY3JvcGNhcChjcHRyLT5oZHcpOworCWlmIChzdGF0ICE9IDApIHsKKwkJcmV0dXJuIHN0YXQ7CisJfQorCSp2YWwgPSBjYXAtPmRlZnJlY3Qud2lkdGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9nZXRfY3JvcGNhcGRoKHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gY2FwLT5kZWZyZWN0LmhlaWdodDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdHJsX2dldF9jcm9wY2FwcGFuKHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsIGludCAqdmFsKQoreworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNhcCA9ICZjcHRyLT5oZHctPmNyb3BjYXBfaW5mbzsKKwlpbnQgc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoY3B0ci0+aGR3KTsKKwlpZiAoc3RhdCAhPSAwKSB7CisJCXJldHVybiBzdGF0OworCX0KKwkqdmFsID0gY2FwLT5waXhlbGFzcGVjdC5udW1lcmF0b3I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RybF9nZXRfY3JvcGNhcHBhZChzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYXAgPSAmY3B0ci0+aGR3LT5jcm9wY2FwX2luZm87CisJaW50IHN0YXQgPSBwdnIyX2hkd19jaGVja19jcm9wY2FwKGNwdHItPmhkdyk7CisJaWYgKHN0YXQgIT0gMCkgeworCQlyZXR1cm4gc3RhdDsKKwl9CisJKnZhbCA9IGNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3I7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3RybF92cmVzX21heF9nZXQoc3RydWN0IHB2cjJfY3RybCAqY3B0cixpbnQgKnZwKQogewogCS8qIEFjdHVhbCBtYXhpbXVtIGRlcGVuZHMgb24gdGhlIHZpZGVvIHN0YW5kYXJkIGluIGVmZmVjdC4gKi8KQEAgLTc3OSw2ICs5NjgsMTAgQEAKIFZDUkVBVEVfRlVOQ1MoYmFzcykKIFZDUkVBVEVfRlVOQ1ModHJlYmxlKQogVkNSRUFURV9GVU5DUyhtdXRlKQorVkNSRUFURV9GVU5DUyhjcm9wbCkKK1ZDUkVBVEVfRlVOQ1MoY3JvcHQpCitWQ1JFQVRFX0ZVTkNTKGNyb3B3KQorVkNSRUFURV9GVU5DUyhjcm9waCkKIFZDUkVBVEVfRlVOQ1MoYXVkaW9tb2RlKQogVkNSRUFURV9GVU5DUyhyZXNfaG9yKQogVkNSRUFURV9GVU5DUyhyZXNfdmVyKQpAQCAtODQ5LDYgKzEwNDIsNzIgQEAKIAkJLmRlZmF1bHRfdmFsdWUgPSAwLAogCQlERUZSRUYobXV0ZSksCiAJCURFRkJPT0wsCisJfSwgeworCQkuZGVzYyA9ICJDYXB0dXJlIGNyb3AgbGVmdCBtYXJnaW4iLAorCQkubmFtZSA9ICJjcm9wX2xlZnQiLAorCQkuaW50ZXJuYWxfaWQgPSBQVlIyX0NJRF9DUk9QTCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQlERUZSRUYoY3JvcGwpLAorCQlERUZJTlQoLTEyOSwgMzQwKSwKKwkJLmdldF9taW5fdmFsdWUgPSBjdHJsX2Nyb3BsX21pbl9nZXQsCisJCS5nZXRfbWF4X3ZhbHVlID0gY3RybF9jcm9wbF9tYXhfZ2V0LAorCQkuZ2V0X2RlZl92YWx1ZSA9IGN0cmxfZ2V0X2Nyb3BjYXBkbCwKKwl9LCB7CisJCS5kZXNjID0gIkNhcHR1cmUgY3JvcCB0b3AgbWFyZ2luIiwKKwkJLm5hbWUgPSAiY3JvcF90b3AiLAorCQkuaW50ZXJuYWxfaWQgPSBQVlIyX0NJRF9DUk9QVCwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQlERUZSRUYoY3JvcHQpLAorCQlERUZJTlQoLTM1LCA1NDQpLAorCQkuZ2V0X21pbl92YWx1ZSA9IGN0cmxfY3JvcHRfbWluX2dldCwKKwkJLmdldF9tYXhfdmFsdWUgPSBjdHJsX2Nyb3B0X21heF9nZXQsCisJCS5nZXRfZGVmX3ZhbHVlID0gY3RybF9nZXRfY3JvcGNhcGR0LAorCX0sIHsKKwkJLmRlc2MgPSAiQ2FwdHVyZSBjcm9wIHdpZHRoIiwKKwkJLm5hbWUgPSAiY3JvcF93aWR0aCIsCisJCS5pbnRlcm5hbF9pZCA9IFBWUjJfQ0lEX0NST1BXLAorCQkuZGVmYXVsdF92YWx1ZSA9IDcyMCwKKwkJREVGUkVGKGNyb3B3KSwKKwkJLmdldF9tYXhfdmFsdWUgPSBjdHJsX2Nyb3B3X21heF9nZXQsCisJCS5nZXRfZGVmX3ZhbHVlID0gY3RybF9nZXRfY3JvcGNhcGR3LAorCX0sIHsKKwkJLmRlc2MgPSAiQ2FwdHVyZSBjcm9wIGhlaWdodCIsCisJCS5uYW1lID0gImNyb3BfaGVpZ2h0IiwKKwkJLmludGVybmFsX2lkID0gUFZSMl9DSURfQ1JPUEgsCisJCS5kZWZhdWx0X3ZhbHVlID0gNDgwLAorCQlERUZSRUYoY3JvcGgpLAorCQkuZ2V0X21heF92YWx1ZSA9IGN0cmxfY3JvcGhfbWF4X2dldCwKKwkJLmdldF9kZWZfdmFsdWUgPSBjdHJsX2dldF9jcm9wY2FwZGgsCisJfSwgeworCQkuZGVzYyA9ICJDYXB0dXJlIGNhcGFiaWxpdHkgcGl4ZWwgYXNwZWN0IG51bWVyYXRvciIsCisJCS5uYW1lID0gImNyb3BjYXBfcGl4ZWxfbnVtZXJhdG9yIiwKKwkJLmludGVybmFsX2lkID0gUFZSMl9DSURfQ1JPUENBUFBBTiwKKwkJLmdldF92YWx1ZSA9IGN0cmxfZ2V0X2Nyb3BjYXBwYW4sCisJfSwgeworCQkuZGVzYyA9ICJDYXB0dXJlIGNhcGFiaWxpdHkgcGl4ZWwgYXNwZWN0IGRlbm9taW5hdG9yIiwKKwkJLm5hbWUgPSAiY3JvcGNhcF9waXhlbF9kZW5vbWluYXRvciIsCisJCS5pbnRlcm5hbF9pZCA9IFBWUjJfQ0lEX0NST1BDQVBQQUQsCisJCS5nZXRfdmFsdWUgPSBjdHJsX2dldF9jcm9wY2FwcGFkLAorCX0sIHsKKwkJLmRlc2MgPSAiQ2FwdHVyZSBjYXBhYmlsaXR5IGJvdW5kcyB0b3AiLAorCQkubmFtZSA9ICJjcm9wY2FwX2JvdW5kc190b3AiLAorCQkuaW50ZXJuYWxfaWQgPSBQVlIyX0NJRF9DUk9QQ0FQQlQsCisJCS5nZXRfdmFsdWUgPSBjdHJsX2dldF9jcm9wY2FwYnQsCisJfSwgeworCQkuZGVzYyA9ICJDYXB0dXJlIGNhcGFiaWxpdHkgYm91bmRzIGxlZnQiLAorCQkubmFtZSA9ICJjcm9wY2FwX2JvdW5kc19sZWZ0IiwKKwkJLmludGVybmFsX2lkID0gUFZSMl9DSURfQ1JPUENBUEJMLAorCQkuZ2V0X3ZhbHVlID0gY3RybF9nZXRfY3JvcGNhcGJsLAorCX0sIHsKKwkJLmRlc2MgPSAiQ2FwdHVyZSBjYXBhYmlsaXR5IGJvdW5kcyB3aWR0aCIsCisJCS5uYW1lID0gImNyb3BjYXBfYm91bmRzX3dpZHRoIiwKKwkJLmludGVybmFsX2lkID0gUFZSMl9DSURfQ1JPUENBUEJXLAorCQkuZ2V0X3ZhbHVlID0gY3RybF9nZXRfY3JvcGNhcGJ3LAorCX0sIHsKKwkJLmRlc2MgPSAiQ2FwdHVyZSBjYXBhYmlsaXR5IGJvdW5kcyBoZWlnaHQiLAorCQkubmFtZSA9ICJjcm9wY2FwX2JvdW5kc19oZWlnaHQiLAorCQkuaW50ZXJuYWxfaWQgPSBQVlIyX0NJRF9DUk9QQ0FQQkgsCisJCS5nZXRfdmFsdWUgPSBjdHJsX2dldF9jcm9wY2FwYmgsCiAJfSx7CiAJCS5kZXNjID0gIlZpZGVvIFNvdXJjZSIsCiAJCS5uYW1lID0gImlucHV0IiwKQEAgLTEzMTMsOSArMTU3MiwxOSBAQAogCQlpZiAoYmNudCA+IEZJUk1XQVJFX0NIVU5LX1NJWkUpIGJjbnQgPSBGSVJNV0FSRV9DSFVOS19TSVpFOwogCQltZW1jcHkoZndfcHRyLCBmd19lbnRyeS0+ZGF0YSArIGZ3X2RvbmUsIGJjbnQpOwogCQkvKiBVc2Jzbm9vcCBsb2cgc2hvd3MgdGhhdCB3ZSBtdXN0IHN3YXAgYnl0ZXMuLi4gKi8KKwkJLyogU29tZSBiYWNrZ3JvdW5kIGluZm86IFRoZSBkYXRhIGJlaW5nIHN3YXBwZWQgaGVyZSBpcyBhCisJCSAgIGZpcm13YXJlIGltYWdlIGRlc3RpbmVkIGZvciB0aGUgbXBlZyBlbmNvZGVyIGNoaXAgdGhhdAorCQkgICBsaXZlcyBhdCB0aGUgb3RoZXIgZW5kIG9mIGEgVVNCIGVuZHBvaW50LiAgVGhlIGVuY29kZXIKKwkJICAgY2hpcCBhbHdheXMgdGFsa3MgaW4gMzIgYml0IGNodW5rcyBhbmQgaXRzIHN0b3JhZ2UgaXMKKwkJICAgb3JnYW5pemVkIGludG8gMzIgYml0IHdvcmRzLiAgSG93ZXZlciBmcm9tIHRoZSBmaWxlCisJCSAgIHN5c3RlbSB0byB0aGUgZW5jb2RlciBjaGlwIGV2ZXJ5dGhpbmcgaXMgcHVyZWx5IGEgYnl0ZQorCQkgICBzdHJlYW0uICBUaGUgZmlybXdhcmUgZmlsZSdzIGNvbnRlbnRzIGFyZSBhbHdheXMgMzIgYml0CisJCSAgIHN3YXBwZWQgZnJvbSB3aGF0IHRoZSBlbmNvZGVyIGV4cGVjdHMuICBUaHVzIHRoZSBuZWVkCisJCSAgIGFsd2F5cyBleGlzdHMgdG8gc3dhcCB0aGUgYnl0ZXMgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuCisJCSAgIHR5cGUgb2YgdGhlIGhvc3QgcHJvY2Vzc29yIGFuZCB0aGVyZWZvcmUgc3dhYjMyKCkgbWFrZXMKKwkJICAgdGhlIG1vc3Qgc2Vuc2UuICovCiAJCWZvciAoaWNudCA9IDA7IGljbnQgPCBiY250LzQgOyBpY250KyspCi0JCQkoKHUzMiAqKWZ3X3B0cilbaWNudF0gPQotCQkJCV9fX3N3YWIzMigoKHUzMiAqKWZ3X3B0cilbaWNudF0pOworCQkJKCh1MzIgKilmd19wdHIpW2ljbnRdID0gc3dhYjMyKCgodTMyICopZndfcHRyKVtpY250XSk7CiAKIAkJcmV0IHw9IHVzYl9idWxrX21zZyhoZHctPnVzYl9kZXYsIHBpcGUsIGZ3X3B0cixiY250LAogCQkJCSAgICAmYWN0dWFsX2xlbmd0aCwgSFopOwpAQCAtMTkwNSw3ICsyMTc0LDcgQEAKIAkJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmlkKQogewogCXVuc2lnbmVkIGludCBpZHgsY250MSxjbnQyLG07Ci0Jc3RydWN0IHB2cjJfaGR3ICpoZHc7CisJc3RydWN0IHB2cjJfaGR3ICpoZHcgPSBOVUxMOwogCWludCB2YWxpZF9zdGRfbWFzazsKIAlzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyOwogCWNvbnN0IHN0cnVjdCBwdnIyX2RldmljZV9kZXNjICpoZHdfZGVzYzsKQEAgLTE5MTUsNiArMjE4NCwxNiBAQAogCiAJaGR3X2Rlc2MgPSAoY29uc3Qgc3RydWN0IHB2cjJfZGV2aWNlX2Rlc2MgKikoZGV2aWQtPmRyaXZlcl9pbmZvKTsKIAorCWlmIChoZHdfZGVzYyA9PSBOVUxMKSB7CisJCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9JTklULCAicHZyMl9oZHdfY3JlYXRlOiIKKwkJCSAgICIgTm8gZGV2aWNlIGRlc2NyaXB0aW9uIHBvaW50ZXIsIgorCQkJICAgIiB1bmFibGUgdG8gY29udGludWUuIik7CisJCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9JTklULCAiSWYgeW91IGhhdmUgYSBuZXcgZGV2aWNlIHR5cGUsIgorCQkJICAgIiBwbGVhc2UgY29udGFjdCBNaWtlIElzZWx5IDxpc2VseUBwb2JveC5jb20+IgorCQkJICAgIiB0byBnZXQgaXQgaW5jbHVkZWQgaW4gdGhlIGRyaXZlclxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKIAloZHcgPSBremFsbG9jKHNpemVvZigqaGR3KSxHRlBfS0VSTkVMKTsKIAlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfSU5JVCwicHZyMl9oZHdfY3JlYXRlOiBoZHc9JXAsIHR5cGUgXCIlc1wiIiwKIAkJICAgaGR3LGhkd19kZXNjLT5kZXNjcmlwdGlvbik7CkBAIC0yMDcyLDYgKzIzNTEsNyBAQAogCQkJdmFsaWRfc3RkX21hc2s7CiAJfQogCisJaGR3LT5jcm9wY2FwX3N0YWxlID0gITA7CiAJaGR3LT5lZXByb21fYWRkciA9IC0xOwogCWhkdy0+dW5pdF9udW1iZXIgPSAtMTsKIAloZHctPnY0bF9taW5vcl9udW1iZXJfdmlkZW8gPSAtMTsKQEAgLTI1MDgsNiArMjc4OCwyOCBAQAogCQkvKiBDYW4ndCBjb21taXQgYW55dGhpbmcgdW50aWwgcGF0aHdheSBpcyBvay4gKi8KIAkJcmV0dXJuIDA7CiAJfQorCS8qIFRoZSBicm9hZGNhc3QgZGVjb2RlciBjYW4gb25seSBzY2FsZSBkb3duLCBzbyBpZgorCSAqIHJlc18qX2RpcnR5ICYmIGNyb3Agd2luZG93IDwgb3V0cHV0IGZvcm1hdCA9PT4gZW5sYXJnZSBjcm9wLgorCSAqCisJICogVGhlIG1wZWcgZW5jb2RlciByZWNlaXZlcyBmaWVsZHMgb2YgcmVzX2hvcl92YWwgZG90cyBhbmQKKwkgKiByZXNfdmVyX3ZhbCBoYWxmbGluZXMuICBMaW1pdHM6IGhvcjw9NzIwLCB2ZXI8PTU3Ni4KKwkgKi8KKwlpZiAoaGR3LT5yZXNfaG9yX2RpcnR5ICYmIGhkdy0+Y3JvcHdfdmFsIDwgaGR3LT5yZXNfaG9yX3ZhbCkgeworCQloZHctPmNyb3B3X3ZhbCA9IGhkdy0+cmVzX2hvcl92YWw7CisJCWhkdy0+Y3JvcHdfZGlydHkgPSAhMDsKKwl9IGVsc2UgaWYgKGhkdy0+Y3JvcHdfZGlydHkpIHsKKwkJaGR3LT5yZXNfaG9yX2RpcnR5ID0gITA7ICAgICAgICAgICAvKiBtdXN0IHJlc2NhbGUgKi8KKwkJaGR3LT5yZXNfaG9yX3ZhbCA9IG1pbig3MjAsIGhkdy0+Y3JvcHdfdmFsKTsKKwl9CisJaWYgKGhkdy0+cmVzX3Zlcl9kaXJ0eSAmJiBoZHctPmNyb3BoX3ZhbCA8IGhkdy0+cmVzX3Zlcl92YWwpIHsKKwkJaGR3LT5jcm9waF92YWwgPSBoZHctPnJlc192ZXJfdmFsOworCQloZHctPmNyb3BoX2RpcnR5ID0gITA7CisJfSBlbHNlIGlmIChoZHctPmNyb3BoX2RpcnR5KSB7CisJCWludCBudnJlcyA9IGhkdy0+c3RkX21hc2tfY3VyICYgVjRMMl9TVERfNTI1XzYwID8gNDgwIDogNTc2OworCQloZHctPnJlc192ZXJfZGlydHkgPSAhMDsKKwkJaGR3LT5yZXNfdmVyX3ZhbCA9IG1pbihudnJlcywgaGR3LT5jcm9waF92YWwpOworCX0KKwogCS8qIElmIGFueSBvZiB0aGUgYmVsb3cgaGFzIGNoYW5nZWQsIHRoZW4gd2UgY2FuJ3QgZG8gdGhlIHVwZGF0ZQogCSAgIHdoaWxlIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nLiAgUGlwZWxpbmUgbXVzdCBiZSBwYXVzZWQgZmlyc3QKIAkgICBhbmQgZGVjb2RlciAtPiBlbmNvZGVyIGNvbm5lY3Rpb24gYmUgbWFkZSBxdWllc2NlbnQgYmVmb3JlIHdlCkBAIC0yNTE4LDYgKzI4MjAsOCBAQAogCQkgaGR3LT5zcmF0ZV9kaXJ0eSB8fAogCQkgaGR3LT5yZXNfdmVyX2RpcnR5IHx8CiAJCSBoZHctPnJlc19ob3JfZGlydHkgfHwKKwkJIGhkdy0+Y3JvcHdfZGlydHkgfHwKKwkJIGhkdy0+Y3JvcGhfZGlydHkgfHwKIAkJIGhkdy0+aW5wdXRfZGlydHkgfHwKIAkJIChoZHctPmFjdGl2ZV9zdHJlYW1fdHlwZSAhPSBoZHctPmRlc2lyZWRfc3RyZWFtX3R5cGUpKTsKIAlpZiAoZGlzcnVwdGl2ZV9jaGFuZ2UgJiYgIWhkdy0+c3RhdGVfcGlwZWxpbmVfaWRsZSkgewpAQCAtMjU4Nyw2ICsyODkxLDkgQEAKIAl9CiAKIAloZHctPnN0YXRlX3BpcGVsaW5lX2NvbmZpZyA9ICEwOworCS8qIEhhcmR3YXJlIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQgaW4gYSB3YXkgdG8gY2F1c2UgdGhlIGNyb3BwaW5nCisJICAgY2FwYWJpbGl0aWVzIHRvIGhhdmUgY2hhbmdlZC4gIFNvIG1hcmsgaXQgc3RhbGUsIHdoaWNoIHdpbGwKKwkgICBjYXVzZSBhIGxhdGVyIHJlLWZldGNoLiAqLwogCXRyYWNlX3N0Yml0KCJzdGF0ZV9waXBlbGluZV9jb25maWciLGhkdy0+c3RhdGVfcGlwZWxpbmVfY29uZmlnKTsKIAlyZXR1cm4gITA7CiB9CkBAIC0yNjc3LDYgKzI5ODQsMzMgQEAKIH0KIAogCitzdGF0aWMgaW50IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoc3RydWN0IHB2cjJfaGR3ICpoZHcpCit7CisJaWYgKCFoZHctPmNyb3BjYXBfc3RhbGUpIHsKKwkJcmV0dXJuIDA7CisJfQorCXB2cjJfaTJjX2NvcmVfc3RhdHVzX3BvbGwoaGR3KTsKKwlpZiAoaGR3LT5jcm9wY2FwX3N0YWxlKSB7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgY3JvcHBpbmcgY2FwYWJpbGl0aWVzICovCitpbnQgcHZyMl9oZHdfZ2V0X2Nyb3BjYXAoc3RydWN0IHB2cjJfaGR3ICpoZHcsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKnBwKQoreworCWludCBzdGF0ID0gMDsKKwlMT0NLX1RBS0UoaGR3LT5iaWdfbG9jayk7CisJc3RhdCA9IHB2cjJfaGR3X2NoZWNrX2Nyb3BjYXAoaGR3KTsKKwlpZiAoIXN0YXQpIHsKKwkJbWVtY3B5KHBwLCAmaGR3LT5jcm9wY2FwX2luZm8sIHNpemVvZihoZHctPmNyb3BjYXBfaW5mbykpOworCX0KKwlMT0NLX0dJVkUoaGR3LT5iaWdfbG9jayk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKwogLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0dW5lciAqLwogaW50IHB2cjJfaGR3X2dldF90dW5lcl9zdGF0dXMoc3RydWN0IHB2cjJfaGR3ICpoZHcsc3RydWN0IHY0bDJfdHVuZXIgKnZ0cCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmgKaW5kZXggYzA0OTU2ZC4uNDk0ODJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmgKQEAgLTM2LDYgKzM2LDE2IEBACiAjZGVmaW5lIFBWUjJfQ0lEX0ZSRVFVRU5DWSA2CiAjZGVmaW5lIFBWUjJfQ0lEX0hSRVMgNwogI2RlZmluZSBQVlIyX0NJRF9WUkVTIDgKKyNkZWZpbmUgUFZSMl9DSURfQ1JPUEwgOQorI2RlZmluZSBQVlIyX0NJRF9DUk9QVCAxMAorI2RlZmluZSBQVlIyX0NJRF9DUk9QVyAxMQorI2RlZmluZSBQVlIyX0NJRF9DUk9QSCAxMgorI2RlZmluZSBQVlIyX0NJRF9DUk9QQ0FQUEFOIDEzCisjZGVmaW5lIFBWUjJfQ0lEX0NST1BDQVBQQUQgMTQKKyNkZWZpbmUgUFZSMl9DSURfQ1JPUENBUEJMIDE1CisjZGVmaW5lIFBWUjJfQ0lEX0NST1BDQVBCVCAxNgorI2RlZmluZSBQVlIyX0NJRF9DUk9QQ0FQQlcgMTcKKyNkZWZpbmUgUFZSMl9DSURfQ1JPUENBUEJIIDE4CiAKIC8qIExlZ2FsIHZhbHVlcyBmb3IgdGhlIElOUFVUIHN0YXRlIHZhcmlhYmxlICovCiAjZGVmaW5lIFBWUjJfQ1ZBTF9JTlBVVF9UViAwCkBAIC0xNzAsNiArMTgwLDkgQEAKIC8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHVuZXIgKi8KIGludCBwdnIyX2hkd19nZXRfdHVuZXJfc3RhdHVzKHN0cnVjdCBwdnIyX2hkdyAqLHN0cnVjdCB2NGwyX3R1bmVyICopOwogCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgY3JvcHBpbmcgY2FwYWJpbGl0aWVzICovCitpbnQgcHZyMl9oZHdfZ2V0X2Nyb3BjYXAoc3RydWN0IHB2cjJfaGR3ICosIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKik7CisKIC8qIFF1ZXJ5IGRldmljZSBhbmQgc2VlIGlmIGl0IHRoaW5rcyBpdCBpcyBvbiBhIGhpZ2gtc3BlZWQgVVNCIGxpbmsgKi8KIGludCBwdnIyX2hkd19pc19oc20oc3RydWN0IHB2cjJfaGR3ICopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY2hpcHMtdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNoaXBzLXY0bDIuYwppbmRleCBjY2RiNDI5Li45NGE0NzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY2hpcHMtdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jaGlwcy12NGwyLmMKQEAgLTM3LDggKzM3LDkgQEAKICNkZWZpbmUgT1BfVk9MVU1FIDMKICNkZWZpbmUgT1BfRlJFUSA0CiAjZGVmaW5lIE9QX0FVRElPUkFURSA1Ci0jZGVmaW5lIE9QX1NJWkUgNgotI2RlZmluZSBPUF9MT0cgNworI2RlZmluZSBPUF9DUk9QIDYKKyNkZWZpbmUgT1BfU0laRSA3CisjZGVmaW5lIE9QX0xPRyA4CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZyMl9pMmNfb3AgKiBjb25zdCBvcHNbXSA9IHsKIAlbT1BfU1RBTkRBUkRdID0gJnB2cjJfaTJjX29wX3Y0bDJfc3RhbmRhcmQsCkBAIC00Niw2ICs0Nyw3IEBACiAJW09QX0JDU0hdID0gJnB2cjJfaTJjX29wX3Y0bDJfYmNzaCwKIAlbT1BfVk9MVU1FXSA9ICZwdnIyX2kyY19vcF92NGwyX3ZvbHVtZSwKIAlbT1BfRlJFUV0gPSAmcHZyMl9pMmNfb3BfdjRsMl9mcmVxdWVuY3ksCisJW09QX0NST1BdID0gJnB2cjJfaTJjX29wX3Y0bDJfY3JvcCwKIAlbT1BfU0laRV0gPSAmcHZyMl9pMmNfb3BfdjRsMl9zaXplLAogCVtPUF9MT0ddID0gJnB2cjJfaTJjX29wX3Y0bDJfbG9nLAogfTsKQEAgLTU5LDYgKzYxLDcgQEAKIAkJCSgxIDw8IE9QX0JDU0gpIHwKIAkJCSgxIDw8IE9QX1ZPTFVNRSkgfAogCQkJKDEgPDwgT1BfRlJFUSkgfAorCQkJKDEgPDwgT1BfQ1JPUCkgfAogCQkJKDEgPDwgT1BfU0laRSkgfAogCQkJKDEgPDwgT1BfTE9HKSk7CiAJY3AtPnN0YXR1c19wb2xsID0gcHZyMl92NGwyX2NtZF9zdGF0dXNfcG9sbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jbWQtdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNtZC12NGwyLmMKaW5kZXggNTVmMDRhMC4uMTZiYjExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNtZC12NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNtZC12NGwyLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAkJcHZyMl9pMmNfY29yZV9jbWQoaGR3LFZJRElPQ19TX1NURCwmdnMpOwogCX0KIAloZHctPnR1bmVyX3NpZ25hbF9zdGFsZSA9ICEwOworCWhkdy0+Y3JvcGNhcF9zdGFsZSA9ICEwOwogfQogCiAKQEAgLTIzMyw2ICsyMzQsMzcgQEAKIH07CiAKIAorc3RhdGljIHZvaWQgc2V0X2Nyb3Aoc3RydWN0IHB2cjJfaGR3ICpoZHcpCit7CisJc3RydWN0IHY0bDJfY3JvcCBjcm9wOworCisJbWVtc2V0KCZjcm9wLCAwLCBzaXplb2YgY3JvcCk7CisJY3JvcC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWNyb3AuYy5sZWZ0ID0gaGR3LT5jcm9wbF92YWw7CisJY3JvcC5jLnRvcCA9IGhkdy0+Y3JvcHRfdmFsOworCWNyb3AuYy5oZWlnaHQgPSBoZHctPmNyb3BoX3ZhbDsKKwljcm9wLmMud2lkdGggPSBoZHctPmNyb3B3X3ZhbDsKKworCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9DSElQUywKKwkJICAgImkyYyB2NGwyIHNldF9jcm9wIGNyb3A9JWQ6JWQ6JWQ6JWQiLAorCQkgICBjcm9wLmMud2lkdGgsIGNyb3AuYy5oZWlnaHQsIGNyb3AuYy5sZWZ0LCBjcm9wLmMudG9wKTsKKworCXB2cjJfaTJjX2NvcmVfY21kKGhkdywgVklESU9DX1NfQ1JPUCwgJmNyb3ApOworfQorCitzdGF0aWMgaW50IGNoZWNrX2Nyb3Aoc3RydWN0IHB2cjJfaGR3ICpoZHcpCit7CisJcmV0dXJuIChoZHctPmNyb3BsX2RpcnR5IHx8IGhkdy0+Y3JvcHRfZGlydHkgfHwKKwkJaGR3LT5jcm9wd19kaXJ0eSB8fCBoZHctPmNyb3BoX2RpcnR5KTsKK30KKworY29uc3Qgc3RydWN0IHB2cjJfaTJjX29wIHB2cjJfaTJjX29wX3Y0bDJfY3JvcCA9IHsKKwkuY2hlY2sgPSBjaGVja19jcm9wLAorCS51cGRhdGUgPSBzZXRfY3JvcCwKKwkubmFtZSA9ICJ2NGwyX2Nyb3AiLAorfTsKKworCiBzdGF0aWMgdm9pZCBkb19sb2coc3RydWN0IHB2cjJfaGR3ICpoZHcpCiB7CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0NISVBTLCJpMmMgdjRsMiBkb19sb2coKSIpOwpAQCAtMjYzLDcgKzI5NSwxOSBAQAogCiB2b2lkIHB2cjJfdjRsMl9jbWRfc3RhdHVzX3BvbGwoc3RydWN0IHB2cjJfaTJjX2NsaWVudCAqY3ApCiB7Ci0JcHZyMl9pMmNfY2xpZW50X2NtZChjcCxWSURJT0NfR19UVU5FUiwmY3AtPmhkdy0+dHVuZXJfc2lnbmFsX2luZm8pOworCWludCBzdGF0OworCXN0cnVjdCBwdnIyX2hkdyAqaGR3ID0gY3AtPmhkdzsKKwlpZiAoaGR3LT5jcm9wY2FwX3N0YWxlKSB7CisJCWhkdy0+Y3JvcGNhcF9pbmZvLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCXN0YXQgPSBwdnIyX2kyY19jbGllbnRfY21kKGNwLCBWSURJT0NfQ1JPUENBUCwKKwkJCQkJICAgJmhkdy0+Y3JvcGNhcF9pbmZvKTsKKwkJaWYgKHN0YXQgPT0gMCkgeworCQkJLyogQ2hlY2sgd2FzIHN1Y2Nlc3NmdWwsIHNvIHRoZSBkYXRhIGlzIG5vCisJCQkgICBsb25nZXIgY29uc2lkZXJlZCBzdGFsZS4gKi8KKwkJCWhkdy0+Y3JvcGNhcF9zdGFsZSA9IDA7CisJCX0KKwl9CisJcHZyMl9pMmNfY2xpZW50X2NtZChjcCwgVklESU9DX0dfVFVORVIsICZoZHctPnR1bmVyX3NpZ25hbF9pbmZvKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY21kLXY0bDIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jbWQtdjRsMi5oCmluZGV4IDdmYTM4NjguLmViNzQ0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jbWQtdjRsMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jbWQtdjRsMi5oCkBAIC0yOSw2ICsyOSw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHB2cjJfaTJjX29wIHB2cjJfaTJjX29wX3Y0bDJfYmNzaDsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcHZyMl9pMmNfb3AgcHZyMl9pMmNfb3BfdjRsMl92b2x1bWU7CiBleHRlcm4gY29uc3Qgc3RydWN0IHB2cjJfaTJjX29wIHB2cjJfaTJjX29wX3Y0bDJfZnJlcXVlbmN5OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwdnIyX2kyY19vcCBwdnIyX2kyY19vcF92NGwyX2Nyb3A7CiBleHRlcm4gY29uc3Qgc3RydWN0IHB2cjJfaTJjX29wIHB2cjJfaTJjX29wX3Y0bDJfc2l6ZTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcHZyMl9pMmNfb3AgcHZyMl9pMmNfb3BfdjRsMl9hdWRpb21vZGU7CiBleHRlcm4gY29uc3Qgc3RydWN0IHB2cjJfaTJjX29wIHB2cjJfaTJjX29wX3Y0bDJfbG9nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKaW5kZXggZTYwMDU3Ni4uZDZhMzU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCkBAIC04MjcsNyArODI3LDcgQEAKIAlpZiAoKGRldGFpbCAmIFBWUjJfSTJDX0RFVEFJTF9DVExNQVNLKSAmJiBjcC0+Y3RsX21hc2spIHsKIAkJdW5zaWduZWQgaW50IGlkeDsKIAkJdW5zaWduZWQgbG9uZyBtc2ssc207Ci0JCWludCBzcGNmbDsKKwogCQliY250ID0gc2NucHJpbnRmKGJ1ZixtYXhsZW4sIiBbIik7CiAJCWNjbnQgKz0gYmNudDsgYnVmICs9IGJjbnQ7IG1heGxlbiAtPSBiY250OwogCQlzbSA9IDA7CkBAIC04OTEsNiArODkxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY3AtPmxpc3QpOwogCWNwLT5jbGllbnQgPSBjbGllbnQ7CiAJbXV0ZXhfbG9jaygmaGR3LT5pMmNfbGlzdF9sb2NrKTsgZG8geworCQloZHctPmNyb3BjYXBfc3RhbGUgPSAhMDsKIAkJbGlzdF9hZGRfdGFpbCgmY3AtPmxpc3QsJmhkdy0+aTJjX2NsaWVudHMpOwogCQloZHctPmkyY19wZW5kX3R5cGVzIHw9IFBWUjJfSTJDX1BFTkRfREVURUNUOwogCX0gd2hpbGUgKDApOyBtdXRleF91bmxvY2soJmhkdy0+aTJjX2xpc3RfbG9jayk7CkBAIC05MDUsNiArOTA2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFtYXNrID0gMDsKIAlpbnQgZm91bmRmbCA9IDA7CiAJbXV0ZXhfbG9jaygmaGR3LT5pMmNfbGlzdF9sb2NrKTsgZG8geworCQloZHctPmNyb3BjYXBfc3RhbGUgPSAhMDsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNwLCBuY3AsICZoZHctPmkyY19jbGllbnRzLCBsaXN0KSB7CiAJCQlpZiAoY3AtPmNsaWVudCA9PSBjbGllbnQpIHsKIAkJCQl0cmFjZV9pMmMoInB2cjJfaTJjX2RldGFjaCIKQEAgLTk0NiwyMiArOTQ4LDMyIEBACiAJLmNsaWVudF91bnJlZ2lzdGVyID0gcHZyMl9pMmNfZGV0YWNoX2luZm9ybSwKIH07CiAKLXN0YXRpYyB2b2lkIGRvX2kyY19zY2FuKHN0cnVjdCBwdnIyX2hkdyAqaGR3KQorCisvKiBSZXR1cm4gdHJ1ZSBpZiBkZXZpY2UgZXhpc3RzIGF0IGdpdmVuIGFkZHJlc3MgKi8KK3N0YXRpYyBpbnQgZG9faTJjX3Byb2JlKHN0cnVjdCBwdnIyX2hkdyAqaGR3LCBpbnQgYWRkcikKIHsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMV07Ci0JaW50IGkscmM7CisJaW50IHJjOwogCW1zZ1swXS5hZGRyID0gMDsKIAltc2dbMF0uZmxhZ3MgPSBJMkNfTV9SRDsKIAltc2dbMF0ubGVuID0gMDsKIAltc2dbMF0uYnVmID0gTlVMTDsKLQlwcmludGsoIiVzOiBpMmMgc2NhbiBiZWdpbm5pbmdcbiIsaGR3LT5uYW1lKTsKKwltc2dbMF0uYWRkciA9IGFkZHI7CisJcmMgPSBpMmNfdHJhbnNmZXIoJmhkdy0+aTJjX2FkYXAsIG1zZywgQVJSQVlfU0laRShtc2cpKTsKKwlyZXR1cm4gcmMgPT0gMTsKK30KKworc3RhdGljIHZvaWQgZG9faTJjX3NjYW4oc3RydWN0IHB2cjJfaGR3ICpoZHcpCit7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGkyYyBzY2FuIGJlZ2lubmluZ1xuIiwgaGR3LT5uYW1lKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKLQkJbXNnWzBdLmFkZHIgPSBpOwotCQlyYyA9IGkyY190cmFuc2ZlcigmaGR3LT5pMmNfYWRhcCxtc2csIEFSUkFZX1NJWkUobXNnKSk7Ci0JCWlmIChyYyAhPSAxKSBjb250aW51ZTsKLQkJcHJpbnRrKCIlczogaTJjIHNjYW46IGZvdW5kIGRldmljZSBAIDB4JXhcbiIsaGR3LT5uYW1lLGkpOworCQlpZiAoZG9faTJjX3Byb2JlKGhkdywgaSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpMmMgc2NhbjogZm91bmQgZGV2aWNlIEAgMHgleFxuIiwKKwkJCSAgICAgICBoZHctPm5hbWUsIGkpOworCQl9CiAJfQotCXByaW50aygiJXM6IGkyYyBzY2FuIGRvbmUuXG4iLGhkdy0+bmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGkyYyBzY2FuIGRvbmUuXG4iLCBoZHctPm5hbWUpOwogfQogCiB2b2lkIHB2cjJfaTJjX2NvcmVfaW5pdChzdHJ1Y3QgcHZyMl9oZHcgKmhkdykKQEAgLTk4MCw4ICs5OTIsNiBAQAogCQloZHctPmkyY19mdW5jWzB4MThdID0gaTJjX2JsYWNrX2hvbGU7CiAJfSBlbHNlIGlmIChpcl9tb2RlW2hkdy0+dW5pdF9udW1iZXJdID09IDEpIHsKIAkJaWYgKGhkdy0+aGR3X2Rlc2MtPmlyX3NjaGVtZSA9PSBQVlIyX0lSX1NDSEVNRV8yNFhYWCkgewotCQkJLyogVGhpcyBjb21tZW50IGlzIHByZXNlbnQgUFVSRUxZIHRvIGdldAotCQkJICAgY2hlY2twYXRjaC5wbCB0byBTVEZVLiAgTG92ZWx5LCBlaD8gKi8KIAkJCWhkdy0+aTJjX2Z1bmNbMHgxOF0gPSBpMmNfMjR4eHhfaXI7CiAJCX0KIAl9CkBAIC0xMDA2LDYgKzEwMTYsMTYgQEAKIAltdXRleF9pbml0KCZoZHctPmkyY19saXN0X2xvY2spOwogCWhkdy0+aTJjX2xpbmtlZCA9ICEwOwogCWkyY19hZGRfYWRhcHRlcigmaGR3LT5pMmNfYWRhcCk7CisJaWYgKGhkdy0+aTJjX2Z1bmNbMHgxOF0gPT0gaTJjXzI0eHh4X2lyKSB7CisJCS8qIFByb2JlIGZvciBhIGRpZmZlcmVudCB0eXBlIG9mIElSIHJlY2VpdmVyIG9uIHRoaXMKKwkJICAgZGV2aWNlLiAgSWYgcHJlc2VudCwgZGlzYWJsZSB0aGUgZW11bGF0ZWQgSVIgcmVjZWl2ZXIuICovCisJCWlmIChkb19pMmNfcHJvYmUoaGR3LCAweDcxKSkgeworCQkJcHZyMl90cmFjZShQVlIyX1RSQUNFX0lORk8sCisJCQkJICAgIkRldmljZSBoYXMgbmV3ZXIgSVIgaGFyZHdhcmU7IgorCQkJCSAgICIgZGlzYWJsaW5nIHVubmVlZGVkIHZpcnR1YWwgSVIgZGV2aWNlIik7CisJCQloZHctPmkyY19mdW5jWzB4MThdID0gTlVMTDsKKwkJfQorCX0KIAlpZiAoaTJjX3NjYW4pIGRvX2kyY19zY2FuKGhkdyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYwppbmRleCBhZDBkOThjLi45YjNjODc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItbWFpbi5jCkBAIC0xMzcsOSArMTM3LDExIEBACiAJcmV0ID0gdXNiX3JlZ2lzdGVyKCZwdnJfZHJpdmVyKTsKIAogCWlmIChyZXQgPT0gMCkKLQkJaW5mbyhEUklWRVJfREVTQyAiIDogIiBEUklWRVJfVkVSU0lPTik7Ci0JaWYgKHB2cnVzYjJfZGVidWcpIGluZm8oIkRlYnVnIG1hc2sgaXMgJWQgKDB4JXgpIiwKLQkJCQlwdnJ1c2IyX2RlYnVnLHB2cnVzYjJfZGVidWcpOworCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKKwlpZiAocHZydXNiMl9kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiBEZWJ1ZyBtYXNrIGlzICVkICgweCV4KVxuIiwKKwkJICAgICAgIHB2cnVzYjJfZGVidWcscHZydXNiMl9kZWJ1Zyk7CiAKIAlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfSU5JVCwicHZyX2luaXQgY29tcGxldGUiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXN5c2ZzLmMKaW5kZXggNDZhOGMzOWIuLjczMzY4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYwpAQCAtNjUsNiArNjUsNyBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHJfdHlwZTsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX21pbjsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX21heDsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX2RlZjsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX2VudW07CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXR0cl9iaXRzOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHJfdmFsOwpAQCAtMTQ1LDYgKzE0NiwyMyBAQAogCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIHZhbCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfZGVmKHN0cnVjdCBkZXZpY2UgKmNsYXNzX2RldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBwdnIyX3N5c2ZzX2N0bF9pdGVtICpjaXA7CisJaW50IHZhbDsKKwlpbnQgcmV0OworCWNpcCA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgcHZyMl9zeXNmc19jdGxfaXRlbSwgYXR0cl9kZWYpOworCXJldCA9IHB2cjJfY3RybF9nZXRfZGVmKGNpcC0+Y3B0ciwgJnZhbCk7CisJcHZyMl9zeXNmc190cmFjZSgicHZyMl9zeXNmcyglcCkgc2hvd19kZWYoY2lkPSVkKSBpcyAlZCwgc3RhdD0lZCIsCisJCQkgY2lwLT5jaHB0ciwgY2lwLT5jdGxfaWQsIHZhbCwgcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbCk7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfdmFsX25vcm0oc3RydWN0IGRldmljZSAqY2xhc3NfZGV2LAogCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgY2hhciAqYnVmKQpAQCAtMzIwLDYgKzMzOCwxMCBAQAogCWNpcC0+YXR0cl9tYXguYXR0ci5tb2RlID0gU19JUlVHTzsKIAljaXAtPmF0dHJfbWF4LnNob3cgPSBzaG93X21heDsKIAorCWNpcC0+YXR0cl9kZWYuYXR0ci5uYW1lID0gImRlZl92YWwiOworCWNpcC0+YXR0cl9kZWYuYXR0ci5tb2RlID0gU19JUlVHTzsKKwljaXAtPmF0dHJfZGVmLnNob3cgPSBzaG93X2RlZjsKKwogCWNpcC0+YXR0cl92YWwuYXR0ci5uYW1lID0gImN1cl92YWwiOwogCWNpcC0+YXR0cl92YWwuYXR0ci5tb2RlID0gU19JUlVHTzsKIApAQCAtMzQzLDYgKzM2NSw3IEBACiAJY2lwLT5hdHRyX2dlblthY250KytdID0gJmNpcC0+YXR0cl9uYW1lLmF0dHI7CiAJY2lwLT5hdHRyX2dlblthY250KytdID0gJmNpcC0+YXR0cl90eXBlLmF0dHI7CiAJY2lwLT5hdHRyX2dlblthY250KytdID0gJmNpcC0+YXR0cl92YWwuYXR0cjsKKwljaXAtPmF0dHJfZ2VuW2FjbnQrK10gPSAmY2lwLT5hdHRyX2RlZi5hdHRyOwogCWNpcC0+YXR0cl92YWwuc2hvdyA9IHNob3dfdmFsX25vcm07CiAJY2lwLT5hdHRyX3ZhbC5zdG9yZSA9IHN0b3JlX3ZhbF9ub3JtOwogCWlmIChwdnIyX2N0cmxfaGFzX2N1c3RvbV9zeW1ib2xzKGNwdHIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKaW5kZXggMDAzMDZmYS4uZjA0OGQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwpAQCAtNTMzLDcgKzUzMyw3IEBACiAKIAkJCWxtaW4gPSBwdnIyX2N0cmxfZ2V0X21pbihoY3ApOwogCQkJbG1heCA9IHB2cjJfY3RybF9nZXRfbWF4KGhjcCk7Ci0JCQlsZGVmID0gcHZyMl9jdHJsX2dldF9kZWYoaGNwKTsKKwkJCXB2cjJfY3RybF9nZXRfZGVmKGhjcCwgJmxkZWYpOwogCQkJaWYgKHcgPT0gLTEpIHsKIAkJCQl3ID0gbGRlZjsKIAkJCX0gZWxzZSBpZiAodyA8IGxtaW4pIHsKQEAgLTU0Myw3ICs1NDMsNyBAQAogCQkJfQogCQkJbG1pbiA9IHB2cjJfY3RybF9nZXRfbWluKHZjcCk7CiAJCQlsbWF4ID0gcHZyMl9jdHJsX2dldF9tYXgodmNwKTsKLQkJCWxkZWYgPSBwdnIyX2N0cmxfZ2V0X2RlZih2Y3ApOworCQkJcHZyMl9jdHJsX2dldF9kZWYodmNwLCAmbGRlZik7CiAJCQlpZiAoaCA9PSAtMSkgewogCQkJCWggPSBsZGVmOwogCQkJfSBlbHNlIGlmIChoIDwgbG1pbikgewpAQCAtNjA0LDYgKzYwNCw3IEBACiAJY2FzZSBWSURJT0NfUVVFUllDVFJMOgogCXsKIAkJc3RydWN0IHB2cjJfY3RybCAqY3B0cjsKKwkJaW50IHZhbDsKIAkJc3RydWN0IHY0bDJfcXVlcnljdHJsICp2YyA9IChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKilhcmc7CiAJCXJldCA9IDA7CiAJCWlmICh2Yy0+aWQgJiBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwpIHsKQEAgLTYyNyw3ICs2MjgsOCBAQAogCQkJICAgcHZyMl9jdHJsX2dldF9kZXNjKGNwdHIpKTsKIAkJc3RybGNweSh2Yy0+bmFtZSxwdnIyX2N0cmxfZ2V0X2Rlc2MoY3B0ciksc2l6ZW9mKHZjLT5uYW1lKSk7CiAJCXZjLT5mbGFncyA9IHB2cjJfY3RybF9nZXRfdjRsZmxhZ3MoY3B0cik7Ci0JCXZjLT5kZWZhdWx0X3ZhbHVlID0gcHZyMl9jdHJsX2dldF9kZWYoY3B0cik7CisJCXB2cjJfY3RybF9nZXRfZGVmKGNwdHIsICZ2YWwpOworCQl2Yy0+ZGVmYXVsdF92YWx1ZSA9IHZhbDsKIAkJc3dpdGNoIChwdnIyX2N0cmxfZ2V0X3R5cGUoY3B0cikpIHsKIAkJY2FzZSBwdnIyX2N0bF9lbnVtOgogCQkJdmMtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOwpAQCAtNzUzLDYgKzc1NSw5MiBAQAogCQlicmVhazsKIAl9CiAKKwljYXNlIFZJRElPQ19DUk9QQ0FQOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY2FwID0gKHN0cnVjdCB2NGwyX2Nyb3BjYXAgKilhcmc7CisJCWlmIChjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcHZyMl9oZHdfZ2V0X2Nyb3BjYXAoaGR3LCBjYXApOworCQljYXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7IC8qIHBhcmFub2lhICovCisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0NST1A6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gKHN0cnVjdCB2NGwyX2Nyb3AgKilhcmc7CisJCWludCB2YWwgPSAwOworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBwdnIyX2N0cmxfZ2V0X3ZhbHVlKAorCQkJcHZyMl9oZHdfZ2V0X2N0cmxfYnlfaWQoaGR3LCBQVlIyX0NJRF9DUk9QTCksICZ2YWwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQljcm9wLT5jLmxlZnQgPSB2YWw7CisJCXJldCA9IHB2cjJfY3RybF9nZXRfdmFsdWUoCisJCQlwdnIyX2hkd19nZXRfY3RybF9ieV9pZChoZHcsIFBWUjJfQ0lEX0NST1BUKSwgJnZhbCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWNyb3AtPmMudG9wID0gdmFsOworCQlyZXQgPSBwdnIyX2N0cmxfZ2V0X3ZhbHVlKAorCQkJcHZyMl9oZHdfZ2V0X2N0cmxfYnlfaWQoaGR3LCBQVlIyX0NJRF9DUk9QVyksICZ2YWwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQljcm9wLT5jLndpZHRoID0gdmFsOworCQlyZXQgPSBwdnIyX2N0cmxfZ2V0X3ZhbHVlKAorCQkJcHZyMl9oZHdfZ2V0X2N0cmxfYnlfaWQoaGR3LCBQVlIyX0NJRF9DUk9QSCksICZ2YWwpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQljcm9wLT5jLmhlaWdodCA9IHZhbDsKKwl9CisJY2FzZSBWSURJT0NfU19DUk9QOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IChzdHJ1Y3QgdjRsMl9jcm9wICopYXJnOworCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwIGNhcDsKKwkJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCXJldCA9IHB2cjJfY3RybF9zZXRfdmFsdWUoCisJCQlwdnIyX2hkd19nZXRfY3RybF9ieV9pZChoZHcsIFBWUjJfQ0lEX0NST1BMKSwKKwkJCWNyb3AtPmMubGVmdCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHB2cjJfY3RybF9zZXRfdmFsdWUoCisJCQlwdnIyX2hkd19nZXRfY3RybF9ieV9pZChoZHcsIFBWUjJfQ0lEX0NST1BUKSwKKwkJCWNyb3AtPmMudG9wKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcHZyMl9jdHJsX3NldF92YWx1ZSgKKwkJCXB2cjJfaGR3X2dldF9jdHJsX2J5X2lkKGhkdywgUFZSMl9DSURfQ1JPUFcpLAorCQkJY3JvcC0+Yy53aWR0aCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHB2cjJfY3RybF9zZXRfdmFsdWUoCisJCQlwdnIyX2hkd19nZXRfY3RybF9ieV9pZChoZHcsIFBWUjJfQ0lEX0NST1BIKSwKKwkJCWNyb3AtPmMuaGVpZ2h0KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9CiAJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKIAl7CiAJCXB2cjJfaGR3X3RyaWdnZXJfbW9kdWxlX2xvZyhoZHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKaW5kZXggZGJjNTYwNy4uYzY2NTMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgInB3Yy5oIgogI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IDlhZWU3Y2IuLmFiMjgzODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC0xMTEyLDcgKzExMTIsNyBAQAogCiAJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOwogCi0JcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXZkZXYtPnByaXY7CisJcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCUJVR19PTighcGRldik7CiAJaWYgKHBkZXYtPnZvcGVuKSB7CiAJCVBXQ19ERUJVR19PUEVOKCJJJ20gYnVzeSwgc29tZW9uZSBpcyB1c2luZyB0aGUgZGV2aWNlLlxuIik7CkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19jbG9zZSBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CiAKIAlsb2NrX2tlcm5lbCgpOwotCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OworCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAlpZiAocGRldi0+dm9wZW4gPT0gMCkKIAkJUFdDX0RFQlVHX01PRFVMRSgidmlkZW9fY2xvc2UoKSBjYWxsZWQgb24gY2xvc2VkIGRldmljZT9cbiIpOwogCkBAIC0xMzA0LDcgKzEzMDQsNyBAQAogCQkJdmRldiwgYnVmLCBjb3VudCk7CiAJaWYgKHZkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZkZXYtPnByaXY7CisJcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xMzg2LDcgKzEzODYsNyBAQAogCiAJaWYgKHZkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZkZXYtPnByaXY7CisJcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCiAJaWYgKCF2ZGV2KQogCQlnb3RvIG91dDsKLQlwZGV2ID0gdmRldi0+cHJpdjsKKwlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAKIAltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKIAlpZiAoIXBkZXYtPnVucGx1Z2dlZCkKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAJaW50IGluZGV4OwogCiAJUFdDX0RFQlVHX01FTU9SWSgiPj4gJXNcbiIsIF9fZnVuY19fKTsKLQlwZGV2ID0gdmRldi0+cHJpdjsKKwlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAlzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwppbmRleCAxNzQyODg5Li43NmExMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCWlmICh2ZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwotCXBkZXYgPSB2ZGV2LT5wcml2OworCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAlpZiAocGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwppbmRleCAzODhjZjk0Li5lYjZiZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwpAQCAtNjI5LDE3ICs2MjksNiBAQAogCQlwZGF0YS0+aW5pdChwY2Rldi0+ZGV2KTsKIAl9CiAKLQlpZiAocGRhdGEgJiYgcGRhdGEtPnBvd2VyKSB7Ci0JCWRldl9kYmcocGNkZXYtPmRldiwgIiVzOiBQb3dlciBvbiBjYW1lcmFcbiIsIF9fZnVuY19fKTsKLQkJcGRhdGEtPnBvd2VyKHBjZGV2LT5kZXYsIDEpOwotCX0KLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVzZXQpIHsKLQkJZGV2X2RiZyhwY2Rldi0+ZGV2LCAiJXM6IFJlbGVhc2luZyBjYW1lcmEgcmVzZXRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXBkYXRhLT5yZXNldChwY2Rldi0+ZGV2LCAxKTsKLQl9Ci0KIAlDSUNSMCA9IDB4M0ZGOyAgIC8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KIAogCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX1BDTEtfRU4pCkBAIC02NjAsMjAgKzY0OSw3IEBACiAKIHN0YXRpYyB2b2lkIHB4YV9jYW1lcmFfZGVhY3RpdmF0ZShzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2KQogewotCXN0cnVjdCBweGFjYW1lcmFfcGxhdGZvcm1fZGF0YSAqYm9hcmQgPSBwY2Rldi0+cGRhdGE7Ci0KIAljbGtfZGlzYWJsZShwY2Rldi0+Y2xrKTsKLQotCWlmIChib2FyZCAmJiBib2FyZC0+cmVzZXQpIHsKLQkJZGV2X2RiZyhwY2Rldi0+ZGV2LCAiJXM6IEFzc2VydGluZyBjYW1lcmEgcmVzZXRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWJvYXJkLT5yZXNldChwY2Rldi0+ZGV2LCAwKTsKLQl9Ci0KLQlpZiAoYm9hcmQgJiYgYm9hcmQtPnBvd2VyKSB7Ci0JCWRldl9kYmcocGNkZXYtPmRldiwgIiVzOiBQb3dlciBvZmYgY2FtZXJhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJvYXJkLT5wb3dlcihwY2Rldi0+ZGV2LCAwKTsKLQl9CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBweGFfY2FtZXJhX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQpAQCAtMTAyNSw5ICsxMDAxLDkgQEAKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCBpID0gMCwgcmV0ID0gMDsKIAotCURSQ01SNjggPSBwY2Rldi0+ZG1hX2NoYW5zWzBdIHwgRFJDTVJfTUFQVkxEOwotCURSQ01SNjkgPSBwY2Rldi0+ZG1hX2NoYW5zWzFdIHwgRFJDTVJfTUFQVkxEOwotCURSQ01SNzAgPSBwY2Rldi0+ZG1hX2NoYW5zWzJdIHwgRFJDTVJfTUFQVkxEOworCURSQ01SKDY4KSA9IHBjZGV2LT5kbWFfY2hhbnNbMF0gfCBEUkNNUl9NQVBWTEQ7CisJRFJDTVIoNjkpID0gcGNkZXYtPmRtYV9jaGFuc1sxXSB8IERSQ01SX01BUFZMRDsKKwlEUkNNUig3MCkgPSBwY2Rldi0+ZG1hX2NoYW5zWzJdIHwgRFJDTVJfTUFQVkxEOwogCiAJQ0lDUjAgPSBwY2Rldi0+c2F2ZV9jaWNyW2krK10gJiB+Q0lDUjBfRU5COwogCUNJQ1IxID0gcGNkZXYtPnNhdmVfY2ljcltpKytdOwpAQCAtMTE0NCwzNiArMTEyMCwzNiBAQAogCXBjZGV2LT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJLyogcmVxdWVzdCBkbWEgKi8KLQlwY2Rldi0+ZG1hX2NoYW5zWzBdID0gcHhhX3JlcXVlc3RfZG1hKCJDSV9ZIiwgRE1BX1BSSU9fSElHSCwKLQkJCQkJICAgICAgcHhhX2NhbWVyYV9kbWFfaXJxX3ksIHBjZGV2KTsKLQlpZiAocGNkZXYtPmRtYV9jaGFuc1swXSA8IDApIHsKKwllcnIgPSBweGFfcmVxdWVzdF9kbWEoIkNJX1kiLCBETUFfUFJJT19ISUdILAorCQkJICAgICAgcHhhX2NhbWVyYV9kbWFfaXJxX3ksIHBjZGV2KTsKKwlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHBjZGV2LT5kZXYsICJDYW4ndCByZXF1ZXN0IERNQSBmb3IgWVxuIik7Ci0JCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdF9pb3VubWFwOwogCX0KKwlwY2Rldi0+ZG1hX2NoYW5zWzBdID0gZXJyOwogCWRldl9kYmcocGNkZXYtPmRldiwgImdvdCBETUEgY2hhbm5lbCAlZFxuIiwgcGNkZXYtPmRtYV9jaGFuc1swXSk7CiAKLQlwY2Rldi0+ZG1hX2NoYW5zWzFdID0gcHhhX3JlcXVlc3RfZG1hKCJDSV9VIiwgRE1BX1BSSU9fSElHSCwKLQkJCQkJICAgICAgcHhhX2NhbWVyYV9kbWFfaXJxX3UsIHBjZGV2KTsKLQlpZiAocGNkZXYtPmRtYV9jaGFuc1sxXSA8IDApIHsKKwllcnIgPSBweGFfcmVxdWVzdF9kbWEoIkNJX1UiLCBETUFfUFJJT19ISUdILAorCQkJICAgICAgcHhhX2NhbWVyYV9kbWFfaXJxX3UsIHBjZGV2KTsKKwlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKHBjZGV2LT5kZXYsICJDYW4ndCByZXF1ZXN0IERNQSBmb3IgVVxuIik7Ci0JCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdF9mcmVlX2RtYV95OwogCX0KKwlwY2Rldi0+ZG1hX2NoYW5zWzFdID0gZXJyOwogCWRldl9kYmcocGNkZXYtPmRldiwgImdvdCBETUEgY2hhbm5lbCAoVSkgJWRcbiIsIHBjZGV2LT5kbWFfY2hhbnNbMV0pOwogCi0JcGNkZXYtPmRtYV9jaGFuc1syXSA9IHB4YV9yZXF1ZXN0X2RtYSgiQ0lfViIsIERNQV9QUklPX0hJR0gsCi0JCQkJCSAgICAgIHB4YV9jYW1lcmFfZG1hX2lycV92LCBwY2Rldik7Ci0JaWYgKHBjZGV2LT5kbWFfY2hhbnNbMF0gPCAwKSB7CisJZXJyID0gcHhhX3JlcXVlc3RfZG1hKCJDSV9WIiwgRE1BX1BSSU9fSElHSCwKKwkJCSAgICAgIHB4YV9jYW1lcmFfZG1hX2lycV92LCBwY2Rldik7CisJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycihwY2Rldi0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBETUEgZm9yIFZcbiIpOwotCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfZnJlZV9kbWFfdTsKIAl9CisJcGNkZXYtPmRtYV9jaGFuc1syXSA9IGVycjsKIAlkZXZfZGJnKHBjZGV2LT5kZXYsICJnb3QgRE1BIGNoYW5uZWwgKFYpICVkXG4iLCBwY2Rldi0+ZG1hX2NoYW5zWzJdKTsKIAotCURSQ01SNjggPSBwY2Rldi0+ZG1hX2NoYW5zWzBdIHwgRFJDTVJfTUFQVkxEOwotCURSQ01SNjkgPSBwY2Rldi0+ZG1hX2NoYW5zWzFdIHwgRFJDTVJfTUFQVkxEOwotCURSQ01SNzAgPSBwY2Rldi0+ZG1hX2NoYW5zWzJdIHwgRFJDTVJfTUFQVkxEOworCURSQ01SKDY4KSA9IHBjZGV2LT5kbWFfY2hhbnNbMF0gfCBEUkNNUl9NQVBWTEQ7CisJRFJDTVIoNjkpID0gcGNkZXYtPmRtYV9jaGFuc1sxXSB8IERSQ01SX01BUFZMRDsKKwlEUkNNUig3MCkgPSBwY2Rldi0+ZG1hX2NoYW5zWzJdIHwgRFJDTVJfTUFQVkxEOwogCiAJLyogcmVxdWVzdCBpcnEgKi8KIAllcnIgPSByZXF1ZXN0X2lycShwY2Rldi0+aXJxLCBweGFfY2FtZXJhX2lycSwgMCwgUFhBX0NBTV9EUlZfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYwppbmRleCBiMWQwOWQ4Li41MjcyOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jCkBAIC01OCw2ICs1OCw4IEBACiAKIAogCisvKiBkZWZhdWx0IEpQRUcgcXVhbGl0eSAqLworI2RlZmluZSBTMjI1NV9ERUZfSlBFR19RVUFMICAgICA1MAogLyogdmVuZG9yIHJlcXVlc3QgaW4gKi8KICNkZWZpbmUgUzIyNTVfVlJfSU4JCTAKIC8qIHZlbmRvciByZXF1ZXN0IG91dCAqLwpAQCAtNjcsMjAgKzY5LDIxIEBACiAvKiBVU0IgZW5kcG9pbnQgbnVtYmVyIGZvciBjb25maWd1cmluZyB0aGUgZGV2aWNlICovCiAjZGVmaW5lIFMyMjU1X0NPTkZJR19FUCAgICAgICAgIDIKIC8qIG1heGltdW0gdGltZSBmb3IgRFNQIHRvIHN0YXJ0IHJlc3BvbmRpbmcgYWZ0ZXIgbGFzdCBGVyB3b3JkIGxvYWRlZChtcykgKi8KLSNkZWZpbmUgUzIyNTVfRFNQX0JPT1RUSU1FICAgICAgNDAwCisjZGVmaW5lIFMyMjU1X0RTUF9CT09UVElNRSAgICAgIDgwMAogLyogbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGZpcm13YXJlIHRvIGxvYWQgKG1zKSAqLwogI2RlZmluZSBTMjI1NV9MT0FEX1RJTUVPVVQgICAgICAoNTAwMCArIFMyMjU1X0RTUF9CT09UVElNRSkKICNkZWZpbmUgUzIyNTVfREVGX0JVRlMgICAgICAgICAgMTYKKyNkZWZpbmUgUzIyNTVfU0VUTU9ERV9USU1FT1VUICAgNTAwCiAjZGVmaW5lIE1BWF9DSEFOTkVMUwkJNAotI2RlZmluZSBGUkFNRV9NQVJLRVIJCTB4MjI1NURBNEFMCi0jZGVmaW5lIE1BWF9QSVBFX1VTQkJMT0NLCSg0MCAqIDEwMjQpCi0jZGVmaW5lIERFRkFVTFRfUElQRV9VU0JCTE9DSwkoMTYgKiAxMDI0KQorI2RlZmluZSBTMjI1NV9NQVJLRVJfRlJBTUUJMHgyMjU1REE0QUwKKyNkZWZpbmUgUzIyNTVfTUFSS0VSX1JFU1BPTlNFCTB4MjI1NUFDQUNMCisjZGVmaW5lIFMyMjU1X1VTQl9YRkVSX1NJWkUJKDE2ICogMTAyNCkKICNkZWZpbmUgTUFYX0NIQU5ORUxTCQk0CiAjZGVmaW5lIE1BWF9QSVBFX0JVRkZFUlMJMQogI2RlZmluZSBTWVNfRlJBTUVTCQk0CiAvKiBtYXhpbXVtIHNpemUgaXMgUEFMIGZ1bGwgc2l6ZSBwbHVzIHJvb20gZm9yIHRoZSBtYXJrZXIgaGVhZGVyKHMpICovCi0jZGVmaW5lIFNZU19GUkFNRVNfTUFYU0laRQkoNzIwICogMjg4ICogMiAqIDIgKyA0MDk2KQotI2RlZmluZSBERUZfVVNCX0JMT0NLCQkoNDA5NikKKyNkZWZpbmUgU1lTX0ZSQU1FU19NQVhTSVpFCSg3MjAqMjg4KjIqMiArIDQwOTYpCisjZGVmaW5lIERFRl9VU0JfQkxPQ0sJCVMyMjU1X1VTQl9YRkVSX1NJWkUKICNkZWZpbmUgTElORV9TWl80Q0lGU19OVFNDCTY0MAogI2RlZmluZSBMSU5FX1NaXzJDSUZTX05UU0MJNjQwCiAjZGVmaW5lIExJTkVfU1pfMUNJRlNfTlRTQwkzMjAKQEAgLTEwOCw2ICsxMTEsOSBAQAogI2RlZmluZSBDT0xPUl9ZVVZQTAkxCS8qIFlVViBwbGFuYXIgKi8KICNkZWZpbmUgQ09MT1JfWVVWUEsJMgkvKiBZVVYgcGFja2VkICovCiAjZGVmaW5lIENPTE9SX1k4CTQJLyogbW9ub2Nocm9tZSAqLworI2RlZmluZSBDT0xPUl9KUEcgICAgICAgNSAgICAgICAvKiBKUEVHICovCisjZGVmaW5lIE1BU0tfQ09MT1IgICAgICAweGZmCisjZGVmaW5lIE1BU0tfSlBHX1FVQUxJVFkgMHhmZjAwCiAKIC8qIGZyYW1lIGRlY2ltYXRpb24uIE5vdCBpbXBsZW1lbnRlZCBieSBWNEwgeWV0KGV4cGVyaW1lbnRhbCBpbiBWNEwpICovCiAjZGVmaW5lIEZERUNfMQkJMQkvKiBjYXB0dXJlIGV2ZXJ5IGZyYW1lLiBkZWZhdWx0ICovCkBAIC0xNDgsMTYgKzE1NCwxNCBAQAogCXUzMiByZXN0YXJ0OwkvKiBpZiBEU1AgcmVxdWlyZXMgcmVzdGFydCAqLwogfTsKIAorCisjZGVmaW5lIFMyMjU1X1JFQURfSURMRQkJMAorI2RlZmluZSBTMjI1NV9SRUFEX0ZSQU1FCTEKKwogLyogZnJhbWUgc3RydWN0dXJlICovCi0jZGVmaW5lIEZSQU1FX1NUQVRFX1VOVVNFRAkwCi0jZGVmaW5lIEZSQU1FX1NUQVRFX0ZJTExJTkcJMQotI2RlZmluZSBGUkFNRV9TVEFURV9GVUxMCTIKLQotCiBzdHJ1Y3QgczIyNTVfZnJhbWVpIHsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0KLQl1bnNpZ25lZCBsb25nIHVsU3RhdGU7CS8qIHVsU3RhdGUgPT0wIHVudXNlZCwgMSBiZWluZyBmaWxsZWQsIDIgZnVsbCAqLworCXVuc2lnbmVkIGxvbmcgdWxTdGF0ZTsJLyogdWxTdGF0ZTpTMjI1NV9SRUFEX0lETEUsIFMyMjU1X1JFQURfRlJBTUUqLwogCXZvaWQgKmxwdmJpdHM7CQkvKiBpbWFnZSBkYXRhICovCiAJdW5zaWduZWQgbG9uZyBjdXJfc2l6ZTsJLyogY3VycmVudCBkYXRhIGNvcGllZCB0byBpdCAqLwogfTsKQEAgLTE4OCw2ICsxOTIsMTAgQEAKICNkZWZpbmUgUzIyNTVfRldfRkFJTEVECQkzCiAjZGVmaW5lIFMyMjU1X0ZXX0RJU0NPTk5FQ1RJTkcgIDQKIAorI2RlZmluZSBTMjI1NV9GV19NQVJLRVIgICAgICAgICAweDIyNTUyZjJmCisvKiAyMjU1IHJlYWQgc3RhdGVzICovCisjZGVmaW5lIFMyMjU1X1JFQURfSURMRSAgICAgICAgIDAKKyNkZWZpbmUgUzIyNTVfUkVBRF9GUkFNRSAgICAgICAgMQogc3RydWN0IHMyMjU1X2Z3IHsKIAlpbnQJCSAgICAgIGZ3X2xvYWRlZDsKIAlpbnQJCSAgICAgIGZ3X3NpemU7CkBAIC0xOTUsNyArMjAzLDYgQEAKIAlhdG9taWNfdAkgICAgICBmd19zdGF0ZTsKIAl2b2lkCQkgICAgICAqcGZ3X2RhdGE7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgICAgIHdhaXRfZnc7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgIGRzcF93YWl0OwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiB9OwogCkBAIC0yMzcsMTUgKzI0NCwyNyBAQAogCXN0cnVjdCBzMjI1NV9waXBlaW5mbwlwaXBlc1tNQVhfUElQRV9CVUZGRVJTXTsKIAlzdHJ1Y3QgczIyNTVfYnVmZmVyaQkJYnVmZmVyW01BWF9DSEFOTkVMU107CiAJc3RydWN0IHMyMjU1X21vZGUJbW9kZVtNQVhfQ0hBTk5FTFNdOworCS8qIGpwZWcgY29tcHJlc3Npb24gKi8KKwlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gamNbTUFYX0NIQU5ORUxTXTsKIAljb25zdCBzdHJ1Y3QgczIyNTVfZm10CSpjdXJfZm10W01BWF9DSEFOTkVMU107CiAJaW50CQkJY3VyX2ZyYW1lW01BWF9DSEFOTkVMU107CiAJaW50CQkJbGFzdF9mcmFtZVtNQVhfQ0hBTk5FTFNdOwogCXUzMgkJCWNjOwkvKiBjdXJyZW50IGNoYW5uZWwgKi8KIAlpbnQJCQliX2FjcXVpcmVbTUFYX0NIQU5ORUxTXTsKKwkvKiBhbGxvY2F0ZWQgaW1hZ2Ugc2l6ZSAqLwogCXVuc2lnbmVkIGxvbmcJCXJlcV9pbWFnZV9zaXplW01BWF9DSEFOTkVMU107CisJLyogcmVjZWl2ZWQgcGFja2V0IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nCQlwa3Rfc2l6ZVtNQVhfQ0hBTk5FTFNdOwogCWludAkJCWJhZF9wYXlsb2FkW01BWF9DSEFOTkVMU107CiAJdW5zaWduZWQgbG9uZwkJZnJhbWVfY291bnRbTUFYX0NIQU5ORUxTXTsKIAlpbnQJCQlmcmFtZV9yZWFkeTsKKwkvKiBpZiBKUEVHIGltYWdlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAganBnX3NpemVbTUFYX0NIQU5ORUxTXTsKKwkvKiBpZiBjaGFubmVsIGNvbmZpZ3VyZWQgdG8gZGVmYXVsdCBzdGF0ZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGNobl9jb25maWd1cmVkW01BWF9DSEFOTkVMU107CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgd2FpdF9zZXRtb2RlW01BWF9DSEFOTkVMU107CisJaW50ICAgICAgICAgICAgICAgICAgICAgc2V0bW9kZV9yZWFkeVtNQVhfQ0hBTk5FTFNdOworCWludCAgICAgICAgICAgICAgICAgICAgIGNobl9yZWFkeTsKIAlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAlzcGlubG9ja190ICAgICAgICAgICAgICBzbG9jazsKIH07CkBAIC0zMDYsMTIgKzMyNSwxNiBAQAogc3RhdGljIGludCBzMjI1NV9zdGFydF9hY3F1aXJlKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBjaG4pOwogc3RhdGljIGludCBzMjI1NV9zdG9wX2FjcXVpcmUoc3RydWN0IHMyMjU1X2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGNobik7CiBzdGF0aWMgdm9pZCBzMjI1NV9maWxsYnVmZihzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIHN0cnVjdCBzMjI1NV9idWZmZXIgKmJ1ZiwKLQkJCSAgIGludCBjaG4pOworCQkJICAgaW50IGNobiwgaW50IGpwZ3NpemUpOwogc3RhdGljIGludCBzMjI1NV9zZXRfbW9kZShzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2huLAogCQkJICBzdHJ1Y3QgczIyNTVfbW9kZSAqbW9kZSk7CiBzdGF0aWMgaW50IHMyMjU1X2JvYXJkX3NodXRkb3duKHN0cnVjdCBzMjI1NV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBzMjI1NV9leGl0X3Y0bChzdHJ1Y3QgczIyNTVfZGV2ICpkZXYpOwotc3RhdGljIHZvaWQgczIyNTVfZndsb2FkX3N0YXJ0KHN0cnVjdCBzMjI1NV9kZXYgKmRldik7CitzdGF0aWMgdm9pZCBzMjI1NV9md2xvYWRfc3RhcnQoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBpbnQgcmVzZXQpOworc3RhdGljIHZvaWQgczIyNTVfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZik7CitzdGF0aWMgbG9uZyBzMjI1NV92ZW5kb3JfcmVxKHN0cnVjdCBzMjI1NV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciByZXEsCisJCQkgICAgIHUxNiBpbmRleCwgdTE2IHZhbHVlLCB2b2lkICpidWYsCisJCQkgICAgIHMzMiBidWZfbGVuLCBpbnQgYk91dCk7CiAKICNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCQkJCQlcCiAJZG8gewkJCQkJCQkJXApAQCAtNDA3LDYgKzQzMCwxMCBAQAogCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1VZVlksCiAJCS5kZXB0aCA9IDE2CiAJfSwgeworCQkubmFtZSA9ICJKUEciLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0pQRUcsCisJCS5kZXB0aCA9IDI0CisJfSwgewogCQkubmFtZSA9ICI4YnBwIEdSRVkiLAogCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0dSRVksCiAJCS5kZXB0aCA9IDgKQEAgLTQ2NCw2ICs0OTEsMTMgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIHMyMjU1X3Jlc2V0X2RzcHBvd2VyKHN0cnVjdCBzMjI1NV9kZXYgKmRldikKK3sKKwlzMjI1NV92ZW5kb3JfcmVxKGRldiwgMHg0MCwgMHgwYjBiLCAweDBiMGIsIE5VTEwsIDAsIDEpOworCW1zbGVlcCgxMCk7CisJczIyNTVfdmVuZG9yX3JlcShkZXYsIDB4NTAsIDB4MDAwMCwgMHgwMDAwLCBOVUxMLCAwLCAxKTsKKwlyZXR1cm47Cit9CiAKIC8qIGtpY2tzdGFydHMgdGhlIGZpcm13YXJlIGxvYWRpbmcuIGZyb20gcHJvYmUKICAqLwpAQCAtNDgwLDE4ICs1MTQsNiBAQAogCX0KIH0KIAotLyogY2FsbGVkIHdoZW4gRFNQIGlzIHVwIGFuZCBydW5uaW5nLiAgRFNQIGlzIGd1YXJhbnRlZWQgdG8KLSAgIGJlIHJ1bm5pbmcgYWZ0ZXIgUzIyNTVfRFNQX0JPT1RUSU1FICovCi1zdGF0aWMgdm9pZCBzMjI1NV9kc3BfcnVubmluZyh1bnNpZ25lZCBsb25nIHVzZXJfZGF0YSkKLXsKLQlzdHJ1Y3QgczIyNTVfZncgKmRhdGEgPSAoc3RydWN0IHMyMjU1X2Z3ICopdXNlcl9kYXRhOwotCWRwcmludGsoMSwgImRzcCBydW5uaW5nXG4iKTsKLQlhdG9taWNfc2V0KCZkYXRhLT5md19zdGF0ZSwgUzIyNTVfRldfU1VDQ0VTUyk7Ci0Jd2FrZV91cCgmZGF0YS0+d2FpdF9mdyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiczIyNTU6IGZpcm13YXJlIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiIpOwotCXJldHVybjsKLX0KLQogCiAvKiB0aGlzIGxvYWRzIHRoZSBmaXJtd2FyZSBhc3luY2hyb25vdXNseS4KICAgIE9yaWdpbmFsbHkgdGhpcyB3YXMgZG9uZSBzeW5jaHJvb3VzbHkgaW4gcHJvYmUuCkBAIC01NDksMTkgKzU3MSwxNCBAQAogCQl9CiAJCWRhdGEtPmZ3X2xvYWRlZCArPSBsZW47CiAJfSBlbHNlIHsKLQkJaW5pdF90aW1lcigmZGF0YS0+ZHNwX3dhaXQpOwotCQlkYXRhLT5kc3Bfd2FpdC5mdW5jdGlvbiA9IHMyMjU1X2RzcF9ydW5uaW5nOwotCQlkYXRhLT5kc3Bfd2FpdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKIAkJYXRvbWljX3NldCgmZGF0YS0+Zndfc3RhdGUsIFMyMjU1X0ZXX0xPQURFRF9EU1BXQUlUKTsKLQkJbW9kX3RpbWVyKCZkYXRhLT5kc3Bfd2FpdCwgbXNlY3NfdG9famlmZmllcyhTMjI1NV9EU1BfQk9PVFRJTUUpCi0JCQkgICsgamlmZmllcyk7CiAJfQogCWRwcmludGsoMTAwLCAiMjI1NSBjb21wbGV0ZSBkb25lXG4iKTsKIAlyZXR1cm47CiAKIH0KIAotc3RhdGljIGludCBzMjI1NV9nb3RfZnJhbWUoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBpbnQgY2huKQorc3RhdGljIGludCBzMjI1NV9nb3RfZnJhbWUoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBpbnQgY2huLCBpbnQganBnc2l6ZSkKIHsKIAlzdHJ1Y3QgczIyNTVfZG1hcXVldWUgKmRtYV9xID0gJmRldi0+dmlkcVtjaG5dOwogCXN0cnVjdCBzMjI1NV9idWZmZXIgKmJ1ZjsKQEAgLTU4Niw4ICs2MDMsNyBAQAogCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKIAlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwogCWRwcmludGsoMTAwLCAiWyVwLyVkXSB3YWtldXBcbiIsIGJ1ZiwgYnVmLT52Yi5pKTsKLQotCXMyMjU1X2ZpbGxidWZmKGRldiwgYnVmLCBkbWFfcS0+Y2hhbm5lbCk7CisJczIyNTVfZmlsbGJ1ZmYoZGV2LCBidWYsIGRtYV9xLT5jaGFubmVsLCBqcGdzaXplKTsKIAl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwogCWRwcmludGsoMiwgIndha2V1cCBbYnVmL2ldIFslcC8lZF1cbiIsIGJ1ZiwgYnVmLT52Yi5pKTsKIHVubG9jazoKQEAgLTYyMSw3ICs2MzcsNyBAQAogICoKICAqLwogc3RhdGljIHZvaWQgczIyNTVfZmlsbGJ1ZmYoc3RydWN0IHMyMjU1X2RldiAqZGV2LCBzdHJ1Y3QgczIyNTVfYnVmZmVyICpidWYsCi0JCQkgICBpbnQgY2huKQorCQkJICAgaW50IGNobiwgaW50IGpwZ3NpemUpCiB7CiAJaW50IHBvcyA9IDA7CiAJc3RydWN0IHRpbWV2YWwgdHM7CkBAIC02NDksNiArNjY1LDEwIEBACiAJCWNhc2UgVjRMMl9QSVhfRk1UX0dSRVk6CiAJCQltZW1jcHkodmJ1ZiwgdG1wYnVmLCBidWYtPnZiLndpZHRoICogYnVmLT52Yi5oZWlnaHQpOwogCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9QSVhfRk1UX0pQRUc6CisJCQlidWYtPnZiLnNpemUgPSBqcGdzaXplOworCQkJbWVtY3B5KHZidWYsIHRtcGJ1ZiwgYnVmLT52Yi5zaXplKTsKKwkJCWJyZWFrOwogCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgogCQkJbWVtY3B5KHZidWYsIHRtcGJ1ZiwKIAkJCSAgICAgICBidWYtPnZiLndpZHRoICogYnVmLT52Yi5oZWlnaHQgKiAyKTsKQEAgLTY1Nyw5ICs2NzcsNiBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgInMyMjU1OiB1bmtub3duIGZvcm1hdD9cbiIpOwogCQl9CiAJCWRldi0+bGFzdF9mcmFtZVtjaG5dID0gLTE7Ci0JCS8qIGRvbmUgd2l0aCB0aGUgZnJhbWUsIGZyZWUgaXQgKi8KLQkJZnJtLT51bFN0YXRlID0gMDsKLQkJZHByaW50ayg0LCAiZnJlZWluZyBidWZmZXJcbiIpOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiczIyNTU6ID09PT09PT1ubyBmcmFtZVxuIik7CiAJCXJldHVybjsKQEAgLTY2OSw3ICs2ODYsNyBAQAogCQkodW5zaWduZWQgbG9uZyl2YnVmLCBwb3MpOwogCS8qIHRlbGwgdjRsIGJ1ZmZlciB3YXMgZmlsbGVkICovCiAKLQlidWYtPnZiLmZpZWxkX2NvdW50Kys7CisJYnVmLT52Yi5maWVsZF9jb3VudCA9IGRldi0+ZnJhbWVfY291bnRbY2huXSAqIDI7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0cyk7CiAJYnVmLT52Yi50cyA9IHRzOwogCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOwpAQCAtMTAyMSw2ICsxMDM4LDEwIEBACiAJY2FzZSBWNEwyX1BJWF9GTVRfR1JFWToKIAkJZmgtPm1vZGUuY29sb3IgPSBDT0xPUl9ZODsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoKKwkJZmgtPm1vZGUuY29sb3IgPSBDT0xPUl9KUEcgfAorCQkJKGZoLT5kZXYtPmpjW2ZoLT5jaGFubmVsXS5xdWFsaXR5IDw8IDgpOworCQlicmVhazsKIAljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgogCQlmaC0+bW9kZS5jb2xvciA9IENPTE9SX1lVVlBMOwogCQlicmVhazsKQEAgLTExMzksNyArMTE2MCw3IEBACiAJCX0KIAl9CiAJb3V0SW1hZ2VTaXplID0gbGluZXNQZXJGcmFtZSAqIHBpeGVsc1BlckxpbmU7Ci0JaWYgKG1vZGUtPmNvbG9yICE9IENPTE9SX1k4KSB7CisJaWYgKChtb2RlLT5jb2xvciAmIE1BU0tfQ09MT1IpICE9IENPTE9SX1k4KSB7CiAJCS8qIDIgYnl0ZXMvcGl4ZWwgaWYgbm90IG1vbm9jaHJvbWUgKi8KIAkJb3V0SW1hZ2VTaXplICo9IDI7CiAJfQpAQCAtMTE4NSwxMiArMTIwNiwxNyBAQAogCXUzMiAqYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgY2huX3JldjsKIAorCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJY2huX3JldiA9IEdfY2hubWFwW2Nobl07CiAJZHByaW50aygzLCAibW9kZSBzY2FsZSBbJWxkXSAlcCAlZFxuIiwgY2huLCBtb2RlLCBtb2RlLT5zY2FsZSk7CiAJZHByaW50aygzLCAibW9kZSBzY2FsZSBbJWxkXSAlcCAlZFxuIiwgY2huLCAmZGV2LT5tb2RlW2Nobl0sCiAJCWRldi0+bW9kZVtjaG5dLnNjYWxlKTsKIAlkcHJpbnRrKDIsICJtb2RlIGNvbnRyYXN0ICV4XG4iLCBtb2RlLT5jb250cmFzdCk7CiAKKwkvKiBpZiBKUEVHLCBzZXQgdGhlIHF1YWxpdHkgKi8KKwlpZiAoKG1vZGUtPmNvbG9yICYgTUFTS19DT0xPUikgPT0gQ09MT1JfSlBHKQorCQltb2RlLT5jb2xvciA9IChkZXYtPmpjW2Nobl0ucXVhbGl0eSA8PCA4KSB8IENPTE9SX0pQRzsKKwogCS8qIHNhdmUgdGhlIG1vZGUgKi8KIAlkZXYtPm1vZGVbY2huXSA9ICptb2RlOwogCWRldi0+cmVxX2ltYWdlX3NpemVbY2huXSA9IGdldF90cmFuc2Zlcl9zaXplKG1vZGUpOwpAQCAtMTE5OSw2ICsxMjI1LDcgQEAKIAlidWZmZXIgPSBremFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbVxuIik7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMjE0LDEyICsxMjQxLDIwIEBACiAJZHByaW50aygxLCAic2V0IG1vZGUgZG9uZSBjaG4gJWx1LCAlZFxuIiwgY2huLCByZXMpOwogCiAJLyogd2FpdCBhdCBsZWFzdCAzIGZyYW1lcyBiZWZvcmUgY29udGludWluZyAqLwotCWlmIChtb2RlLT5yZXN0YXJ0KQotCQltc2xlZXAoMTI1KTsKKwlpZiAobW9kZS0+cmVzdGFydCkgeworCQlkZXYtPnNldG1vZGVfcmVhZHlbY2huXSA9IDA7CisJCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPndhaXRfc2V0bW9kZVtjaG5dLAorCQkJCSAgIChkZXYtPnNldG1vZGVfcmVhZHlbY2huXSAhPSAwKSwKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKFMyMjU1X1NFVE1PREVfVElNRU9VVCkpOworCQlpZiAoZGV2LT5zZXRtb2RlX3JlYWR5W2Nobl0gIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInMyMjU1OiBubyBzZXQgbW9kZSByZXNwb25zZVxuIik7CisJCQlyZXMgPSAtRUZBVUxUOworCQl9CisJfQogCiAJLyogY2xlYXIgdGhlIHJlc3RhcnQgZmxhZyAqLwogCWRldi0+bW9kZVtjaG5dLnJlc3RhcnQgPSAwOwotCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTEyNjgsOCArMTMwMyw5IEBACiAJZGV2LT5sYXN0X2ZyYW1lW2Nobl0gPSAtMTsKIAlkZXYtPmJhZF9wYXlsb2FkW2Nobl0gPSAwOwogCWRldi0+Y3VyX2ZyYW1lW2Nobl0gPSAwOworCWRldi0+ZnJhbWVfY291bnRbY2huXSA9IDA7CiAJZm9yIChqID0gMDsgaiA8IFNZU19GUkFNRVM7IGorKykgewotCQlkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2pdLnVsU3RhdGUgPSAwOworCQlkZXYtPmJ1ZmZlcltjaG5dLmZyYW1lW2pdLnVsU3RhdGUgPSBTMjI1NV9SRUFEX0lETEU7CiAJCWRldi0+YnVmZmVyW2Nobl0uZnJhbWVbal0uY3VyX3NpemUgPSAwOwogCX0KIAlyZXMgPSB2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOwpAQCAtMTQ0NSw2ICsxNDgxLDI3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX2dfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqYykKK3sKKwlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OworCSpqYyA9IGRldi0+amNbZmgtPmNoYW5uZWxdOworCWRwcmludGsoMiwgImdldHRpbmcganBlZ2NvbXByZXNzaW9uLCBxdWFsaXR5ICVkXG4iLCBqYy0+cXVhbGl0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqYykKK3sKKwlzdHJ1Y3QgczIyNTVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBmaC0+ZGV2OworCWlmIChqYy0+cXVhbGl0eSA8IDAgfHwgamMtPnF1YWxpdHkgPiAxMDApCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+amNbZmgtPmNoYW5uZWxdLnF1YWxpdHkgPSBqYy0+cXVhbGl0eTsKKwlkcHJpbnRrKDIsICJzZXR0aW5nIGpwZWcgcXVhbGl0eSAlZFxuIiwgamMtPnF1YWxpdHkpOworCXJldHVybiAwOworfQogc3RhdGljIGludCBzMjI1NV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CkBAIC0xNDU0LDggKzE1MTEsMTAgQEAKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CiAJaW50IGkgPSAwOwogCWludCBjdXJfY2hhbm5lbCA9IC0xOworCWludCBzdGF0ZTsKIAlkcHJpbnRrKDEsICJzMjI1NTogb3BlbiBjYWxsZWQgKG1pbm9yPSVkKVxuIiwgbWlub3IpOwogCisJbG9ja19rZXJuZWwoKTsKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZzMjI1NV9kZXZsaXN0KSB7CiAJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzMjI1NV9kZXYsIHMyMjU1X2Rldmxpc3QpOwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHsKQEAgLTE0NjgsNDUgKzE1MjcsNzggQEAKIAl9CiAKIAlpZiAoKE5VTEwgPT0gZGV2KSB8fCAoY3VyX2NoYW5uZWwgPT0gLTEpKSB7Ci0JCWRwcmludGsoMSwgInMyMjU1OiBvcGVudjRsIG5vIGRldlxuIik7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTU6IG9wZW52NGwgbm8gZGV2XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJaWYgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKSA9PSBTMjI1NV9GV19ESVNDT05ORUNUSU5HKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGlzY29ubmVjdGluZ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKIAltdXRleF9sb2NrKCZkZXYtPm9wZW5fbG9jayk7CiAKIAlkZXYtPnVzZXJzW2N1cl9jaGFubmVsXSsrOwogCWRwcmludGsoNCwgInMyMjU1OiBvcGVuX2hhbmRsZXMgJWRcbiIsIGRldi0+dXNlcnNbY3VyX2NoYW5uZWxdKTsKIAotCWlmIChhdG9taWNfcmVhZCgmZGV2LT5md19kYXRhLT5md19zdGF0ZSkgPT0gUzIyNTVfRldfRkFJTEVEKSB7CisJc3dpdGNoIChhdG9taWNfcmVhZCgmZGV2LT5md19kYXRhLT5md19zdGF0ZSkpIHsKKwljYXNlIFMyMjU1X0ZXX0ZBSUxFRDoKIAkJZXJyKCIyMjU1IGZpcm13YXJlIGxvYWQgZmFpbGVkLiByZXRyeWluZy5cbiIpOwotCQlzMjI1NV9md2xvYWRfc3RhcnQoZGV2KTsKKwkJczIyNTVfZndsb2FkX3N0YXJ0KGRldiwgMSk7CiAJCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPmZ3X2RhdGEtPndhaXRfZncsCi0JCQkJICAgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQotCQkJCSAgICAhPSBTMjI1NV9GV19OT1RMT0FERUQpLAorCQkJCSAgICgoYXRvbWljX3JlYWQoJmRldi0+ZndfZGF0YS0+Zndfc3RhdGUpCisJCQkJICAgICA9PSBTMjI1NV9GV19TVUNDRVNTKSB8fAorCQkJCSAgICAoYXRvbWljX3JlYWQoJmRldi0+ZndfZGF0YS0+Zndfc3RhdGUpCisJCQkJICAgICA9PSBTMjI1NV9GV19ESVNDT05ORUNUSU5HKSksCiAJCQkJICAgbXNlY3NfdG9famlmZmllcyhTMjI1NV9MT0FEX1RJTUVPVVQpKTsKLQkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQotCQkgICAgIT0gUzIyNTVfRldfU1VDQ0VTUykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiMjI1NSBGVyBsb2FkIGZhaWxlZC5cbiIpOwotCQkJZGV2LT51c2Vyc1tjdXJfY2hhbm5lbF0tLTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5vcGVuX2xvY2spOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKSA9PSBTMjI1NV9GV19OT1RMT0FERUQpIHsKKwkJYnJlYWs7CisJY2FzZSBTMjI1NV9GV19OT1RMT0FERUQ6CisJY2FzZSBTMjI1NV9GV19MT0FERURfRFNQV0FJVDoKIAkJLyogZ2l2ZSBTMjI1NV9MT0FEX1RJTUVPVVQgdGltZSBmb3IgZmlybXdhcmUgdG8gbG9hZCBpbiBjYXNlCiAJCSAgIGRyaXZlciBsb2FkZWQgYW5kIHRoZW4gZGV2aWNlIGltbWVkaWF0ZWx5IG9wZW5lZCAqLwogCQlwcmludGsoS0VSTl9JTkZPICIlcyB3YWl0aW5nIGZvciBmaXJtd2FyZSBsb2FkXG4iLCBfX2Z1bmNfXyk7CiAJCXdhaXRfZXZlbnRfdGltZW91dChkZXYtPmZ3X2RhdGEtPndhaXRfZncsCi0JCQkJICAgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQotCQkJCSAgICE9IFMyMjU1X0ZXX05PVExPQURFRCksCi0JCQkJICAgbXNlY3NfdG9famlmZmllcyhTMjI1NV9MT0FEX1RJTUVPVVQpKTsKLQkJaWYgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQotCQkgICAgIT0gUzIyNTVfRldfU1VDQ0VTUykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiMjI1NSBmaXJtd2FyZSBub3QgbG9hZGVkIgotCQkJICAgICAgICJ0cnkgYWdhaW5cbiIpOwotCQkJZGV2LT51c2Vyc1tjdXJfY2hhbm5lbF0tLTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5vcGVuX2xvY2spOwotCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQkgICAoKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQorCQkJCSAgICAgPT0gUzIyNTVfRldfU1VDQ0VTUykgfHwKKwkJCQkgICAgKGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKQorCQkJCSAgICAgPT0gUzIyNTVfRldfRElTQ09OTkVDVElORykpLAorCQkJbXNlY3NfdG9famlmZmllcyhTMjI1NV9MT0FEX1RJTUVPVVQpKTsKKwkJYnJlYWs7CisJY2FzZSBTMjI1NV9GV19TVUNDRVNTOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlzdGF0ZSA9IGF0b21pY19yZWFkKCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlKTsKKwlpZiAoc3RhdGUgIT0gUzIyNTVfRldfU1VDQ0VTUykgeworCQlpbnQgcmM7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTMjI1NV9GV19GQUlMRUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIyMjU1IEZXIGxvYWQgZmFpbGVkLiAlZFxuIiwgc3RhdGUpOworCQkJcmMgPSAtRU5PREVWOworCQkJYnJlYWs7CisJCWNhc2UgUzIyNTVfRldfRElTQ09OTkVDVElORzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkaXNjb25uZWN0aW5nXG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJY2FzZSBTMjI1NV9GV19MT0FERURfRFNQV0FJVDoKKwkJY2FzZSBTMjI1NV9GV19OT1RMT0FERUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgbm90IGxvYWRlZCB5ZXQiCisJCQkgICAgICAgInBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmMgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5rbm93biBzdGF0ZVxuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CiAJCX0KKwkJZGV2LT51c2Vyc1tjdXJfY2hhbm5lbF0tLTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm9wZW5fbG9jayk7CisJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHMyMjU1X2Rlc3Ryb3kpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiByYzsKIAl9CiAKIAkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwpAQCAtMTUxNCw2ICsxNjA2LDggQEAKIAlpZiAoTlVMTCA9PSBmaCkgewogCQlkZXYtPnVzZXJzW2N1cl9jaGFubmVsXS0tOwogCQltdXRleF91bmxvY2soJmRldi0+b3Blbl9sb2NrKTsKKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgczIyNTVfZGVzdHJveSk7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNTI3LDYgKzE2MjEsMTMgQEAKIAlmaC0+aGVpZ2h0ID0gTlVNX0xJTkVTXzRDSUZTX05UU0MgKiAyOwogCWZoLT5jaGFubmVsID0gY3VyX2NoYW5uZWw7CiAKKwkvKiBjb25maWd1cmUgY2hhbm5lbCB0byBkZWZhdWx0IHN0YXRlICovCisJaWYgKCFkZXYtPmNobl9jb25maWd1cmVkW2N1cl9jaGFubmVsXSkgeworCQlzMjI1NV9zZXRfbW9kZShkZXYsIGN1cl9jaGFubmVsLCAmZmgtPm1vZGUpOworCQlkZXYtPmNobl9jb25maWd1cmVkW2N1cl9jaGFubmVsXSA9IDE7CisJfQorCisKIAkvKiBQdXQgYWxsIGNvbnRyb2xzIGF0IGEgc2FuZSBzdGF0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMyMjU1X3FjdHJsKTsgaSsrKQogCQlxY3RsX3JlZ3NbaV0gPSBzMjI1NV9xY3RybFtpXS5kZWZhdWx0X3ZhbHVlOwpAQCAtMTU0NSw4ICsxNjQ2LDggQEAKIAkJCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAogCQkJCSAgICBzaXplb2Yoc3RydWN0IHMyMjU1X2J1ZmZlciksIGZoKTsKIAotCWtyZWZfZ2V0KCZkZXYtPmtyZWYpOwogCW11dGV4X3VubG9jaygmZGV2LT5vcGVuX2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2OCwzMCArMTY2OSwyNCBAQAogc3RhdGljIHZvaWQgczIyNTVfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSB0b19zMjI1NV9kZXYoa3JlZik7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgaTsKIAlpZiAoIWRldikgewogCQlwcmludGsoS0VSTl9FUlIgInMyMjU1ZHJ2OiBrcmVmIHByb2JsZW1cbiIpOwogCQlyZXR1cm47CiAJfQotCi0JLyoKLQkgKiBXYWtlIHVwIGFueSBmaXJtd2FyZSBsb2FkIHdhaXRpbmcgKG9ubHkgZG9uZSBpbiAub3BlbiwKLQkgKiB3aGljaCBob2xkcyB0aGUgb3Blbl9sb2NrIG11dGV4KQotCSAqLwogCWF0b21pY19zZXQoJmRldi0+ZndfZGF0YS0+Zndfc3RhdGUsIFMyMjU1X0ZXX0RJU0NPTk5FQ1RJTkcpOwogCXdha2VfdXAoJmRldi0+ZndfZGF0YS0+d2FpdF9mdyk7Ci0KLQkvKiBwcmV2ZW50IHMyMjU1X2Rpc2Nvbm5lY3QgZnJvbSByYWNpbmcgczIyNTVfb3BlbiAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgeworCQlkZXYtPnNldG1vZGVfcmVhZHlbaV0gPSAxOworCQl3YWtlX3VwKCZkZXYtPndhaXRfc2V0bW9kZVtpXSk7CisJfQogCW11dGV4X2xvY2soJmRldi0+b3Blbl9sb2NrKTsKKwkvKiByZXNldCB0aGUgRFNQIHNvIGZpcm13YXJlIGNhbiBiZSByZWxvYWQgbmV4dCB0aW1lICovCisJczIyNTVfcmVzZXRfZHNwcG93ZXIoZGV2KTsKIAlzMjI1NV9leGl0X3Y0bChkZXYpOwotCS8qCi0JICogZGV2aWNlIHVucmVnaXN0ZXJlZCBzbyBubyBsb25nZXIgcG9zc2libGUgdG8gb3Blbi4gb3Blbl9tdXRleAotCSAqICBjYW4gYmUgdW5sb2NrZWQgYW5kIHRpbWVycyBkZWxldGVkIGFmdGVyd2FyZHMuCi0JICovCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPm9wZW5fbG9jayk7Ci0KIAkvKiBib2FyZCBzaHV0ZG93biBzdG9wcyB0aGUgcmVhZCBwaXBlIGlmIGl0IGlzIHJ1bm5pbmcgKi8KIAlzMjI1NV9ib2FyZF9zaHV0ZG93bihkZXYpOwotCiAJLyogbWFrZSBzdXJlIGZpcm13YXJlIHN0aWxsIG5vdCB0cnlpbmcgdG8gbG9hZCAqLwogCWRlbF90aW1lcigmZGV2LT50aW1lcik7ICAvKiBvbmx5IHN0YXJ0ZWQgaW4gLnByb2JlIGFuZCAub3BlbiAqLwogCkBAIC0xNjAxLDIzICsxNjk2LDE5IEBACiAJCXVzYl9mcmVlX3VyYihkZXYtPmZ3X2RhdGEtPmZ3X3VyYik7CiAJCWRldi0+ZndfZGF0YS0+ZndfdXJiID0gTlVMTDsKIAl9Ci0KLQkvKgotCSAqIGRlbGV0ZSB0aGUgZHNwX3dhaXQgdGltZXIsIHdoaWNoIHNldHMgdGhlIGZpcm13YXJlCi0JICogc3RhdGUgb24gY29tcGxldGlvbi4gIFRoaXMgaXMgZG9uZSBiZWZvcmUgZndfZGF0YQotCSAqIGlzIGZyZWVkIGJlbG93LgotCSAqLwotCi0JZGVsX3RpbWVyKCZkZXYtPmZ3X2RhdGEtPmRzcF93YWl0KTsgLyogb25seSBzdGFydGVkIGluIC5vcGVuICovCi0KIAlpZiAoZGV2LT5md19kYXRhLT5mdykKIAkJcmVsZWFzZV9maXJtd2FyZShkZXYtPmZ3X2RhdGEtPmZ3KTsKIAlrZnJlZShkZXYtPmZ3X2RhdGEtPnBmd19kYXRhKTsKIAlrZnJlZShkZXYtPmZ3X2RhdGEpOwotCiAJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKIAlkcHJpbnRrKDEsICIlcyIsIF9fZnVuY19fKTsKIAlrZnJlZShkZXYpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzMjI1NV9kZXZsaXN0KSkgeworCQlsaXN0ID0gczIyNTVfZGV2bGlzdC5uZXh0OworCQlsaXN0X2RlbChsaXN0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm9wZW5fbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgczIyNTVfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xNzAxLDYgKzE3OTIsOCBAQAogI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAogCS52aWRpb2NnbWJ1ZiA9IHZpZGlvY19jZ21idWYsCiAjZW5kaWYKKwkudmlkaW9jX3NfanBlZ2NvbXAgPSB2aWRpb2Nfc19qcGVnY29tcCwKKwkudmlkaW9jX2dfanBlZ2NvbXAgPSB2aWRpb2NfZ19qcGVnY29tcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHRlbXBsYXRlID0gewpAQCAtMTczOSw3ICsxODMyLDcgQEAKIAkJCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShkZXYtPnZkZXZbaV0sCiAJCQkJCQkgICAgVkZMX1RZUEVfR1JBQkJFUiwKIAkJCQkJCSAgICBjdXJfbnIgKyBpKTsKLQkJZGV2LT52ZGV2W2ldLT5wcml2ID0gZGV2OworCQl2aWRlb19zZXRfZHJ2ZGF0YShkZXYtPnZkZXZbaV0sIGRldik7CiAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwKQEAgLTE3NTMsMTggKzE4NDYsMTYgQEAKIAogc3RhdGljIHZvaWQgczIyNTVfZXhpdF92NGwoc3RydWN0IHMyMjU1X2RldiAqZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKIAlpbnQgaTsKLQkvKiB1bnJlZ2lzdGVyIHRoZSB2aWRlbyBkZXZpY2VzICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzMjI1NV9kZXZsaXN0KSkgewotCQlsaXN0ID0gczIyNTVfZGV2bGlzdC5uZXh0OwotCQlsaXN0X2RlbChsaXN0KTsKLQl9CiAJZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgaSsrKSB7Ci0JCWlmICgtMSAhPSBkZXYtPnZkZXZbaV0tPm1pbm9yKQorCQlpZiAoLTEgIT0gZGV2LT52ZGV2W2ldLT5taW5vcikgewogCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52ZGV2W2ldKTsKLQkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTUgdW5yZWdpc3RlcmVkXG4iKTsKKwkJfSBlbHNlIHsKIAkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+dmRldltpXSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJzMjI1NSByZWxlYXNlZFxuIik7CisJCX0KIAl9CiB9CiAKQEAgLTE3NzQsMTMzICsxODY1LDEyMiBAQAogICogZnVuY3Rpb24gYWdhaW4pLgogICoKICAqIFJlY2VpdmVkIGZyYW1lIHN0cnVjdHVyZToKLSAqIGJ5dGVzIDAtMzogIG1hcmtlciA6IDB4MjI1NURBNEFMIChGUkFNRV9NQVJLRVIpCisgKiBieXRlcyAwLTM6ICBtYXJrZXIgOiAweDIyNTVEQTRBTCAoUzIyNTVfTUFSS0VSX0ZSQU1FKQogICogYnl0ZXMgNC03OiAgY2hhbm5lbDogMC0zCiAgKiBieXRlcyA4LTExOiBwYXlsb2FkIHNpemU6ICBzaXplIG9mIHRoZSBmcmFtZQogICogYnl0ZXMgMTItcGF5bG9hZHNpemUrMTI6ICBmcmFtZSBkYXRhCiAgKi8KIHN0YXRpYyBpbnQgc2F2ZV9mcmFtZShzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIHN0cnVjdCBzMjI1NV9waXBlaW5mbyAqcGlwZV9pbmZvKQogewotCXN0YXRpYyBpbnQgZGJnc3luYzsgLyogPSAwOyAqLwogCWNoYXIgKnBkZXN0OwogCXUzMiBvZmZzZXQgPSAwOwotCWludCBic3luYyA9IDA7Ci0JaW50IGJ0cnVuYyA9IDA7CisJaW50IGJmcmFtZSA9IDA7CiAJY2hhciAqcHNyYzsKIAl1bnNpZ25lZCBsb25nIGNvcHlfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJczMyIGlkeCA9IC0xOwogCXN0cnVjdCBzMjI1NV9mcmFtZWkgKmZybTsKIAl1bnNpZ25lZCBjaGFyICpwZGF0YTsKLQl1bnNpZ25lZCBsb25nIGN1cl9zaXplOwotCWludCBic2VhcmNoID0gMDsKLQlzdHJ1Y3QgczIyNTVfYnVmZmVyaSAqYnVmOworCiAJZHByaW50aygxMDAsICJidWZmZXIgdG8gdXNlclxuIik7CiAKIAlpZHggPSBkZXYtPmN1cl9mcmFtZVtkZXYtPmNjXTsKLQlidWYgPSAmZGV2LT5idWZmZXJbZGV2LT5jY107Ci0JZnJtID0gJmJ1Zi0+ZnJhbWVbaWR4XTsKLQotCWlmIChmcm0tPnVsU3RhdGUgPT0gMCkgewotCQlmcm0tPnVsU3RhdGUgPSAxOwotCQlmcm0tPmN1cl9zaXplID0gMDsKLQkJYnNlYXJjaCA9IDE7Ci0JfSBlbHNlIGlmIChmcm0tPnVsU3RhdGUgPT0gMikgewotCQkvKiBzeXN0ZW0gZnJhbWUgd2FzIG5vdCBmcmVlZCAqLwotCQlkcHJpbnRrKDIsICJzeXMgZnJhbWUgbm90IGZyZWUuICBvdmVycnVuIHJpbmdidWZcbiIpOwotCQlic2VhcmNoID0gMTsKLQkJZnJtLT51bFN0YXRlID0gMTsKLQkJZnJtLT5jdXJfc2l6ZSA9IDA7Ci0JfQotCi0JaWYgKGJzZWFyY2gpIHsKLQkJaWYgKCooczMyICopIHBpcGVfaW5mby0+dHJhbnNmZXJfYnVmZmVyICE9IEZSQU1FX01BUktFUikgewotCQkJdTMyIGpqOwotCQkJaWYgKGRiZ3N5bmMgPT0gMCkgewotCQkJCWRwcmludGsoMywgIm5vdCBzeW5jaGVkLCBkaXNjYXJkaW5nIGFsbCBwYWNrZXRzIgotCQkJCQkidW50aWwgbWFya2VyXG4iKTsKLQotCQkJCWRiZ3N5bmMrKzsKLQkJCX0KLQkJCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilwaXBlX2luZm8tPnRyYW5zZmVyX2J1ZmZlcjsKLQkJCWZvciAoamogPSAwOyBqaiA8IChwaXBlX2luZm8tPmN1cl90cmFuc2Zlcl9zaXplIC0gMTIpOwotCQkJICAgICBqaisrKSB7Ci0JCQkJaWYgKCooczMyICopIHBkYXRhID09IEZSQU1FX01BUktFUikgewotCQkJCQlpbnQgY2M7Ci0JCQkJCWRwcmludGsoMywKLQkJCQkJCSJmb3VuZCBmcmFtZSBtYXJrZXIgYXQgb2Zmc2V0OiIKLQkJCQkJCSIgJWQgWyV4ICV4XVxuIiwgamosIHBkYXRhWzBdLAotCQkJCQkJcGRhdGFbMV0pOwotCQkJCQlvZmZzZXQgPSBqajsKLQkJCQkJYnN5bmMgPSAxOwotCQkJCQljYyA9ICoodTMyICopIChwZGF0YSArIHNpemVvZih1MzIpKTsKLQkJCQkJaWYgKGNjID49IE1BWF9DSEFOTkVMUykgewotCQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCQkgICAgICAgImJhZCBjaGFubmVsXG4iKTsKLQkJCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCQl9Ci0JCQkJCS8qIHJldmVyc2UgaXQgKi8KLQkJCQkJZGV2LT5jYyA9IEdfY2hubWFwW2NjXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBkYXRhKys7Ci0JCQl9Ci0JCQlpZiAoYnN5bmMgPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCXUzMiAqcHdvcmQ7Ci0JCQl1MzIgcGF5bG9hZDsKLQkJCWludCBjYzsKLQkJCWRiZ3N5bmMgPSAwOwotCQkJYnN5bmMgPSAxOwotCQkJcHdvcmQgPSAodTMyICopIHBpcGVfaW5mby0+dHJhbnNmZXJfYnVmZmVyOwotCQkJY2MgPSBwd29yZFsxXTsKLQotCQkJaWYgKGNjID49IE1BWF9DSEFOTkVMUykgewotCQkJCXByaW50aygiaW52YWxpZCBjaGFubmVsIGZvdW5kLiAiCi0JCQkJCSJ0aHJvd2luZyBvdXQgZGF0YSFcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJZGV2LT5jYyA9IEdfY2hubWFwW2NjXTsKLQkJCXBheWxvYWQgPSBwd29yZFsyXTsKLQkJCWlmIChwYXlsb2FkICE9IGRldi0+cmVxX2ltYWdlX3NpemVbZGV2LT5jY10pIHsKLQkJCQlkcHJpbnRrKDEsICJbJWRdWyVkXXVuZXhwZWN0ZWQgcGF5bG9hZDogJWQiCi0JCQkJCSJyZXF1aXJlZDogJWx1IFxuIiwgY2MsIGRldi0+Y2MsCi0JCQkJCXBheWxvYWQsIGRldi0+cmVxX2ltYWdlX3NpemVbZGV2LT5jY10pOwotCQkJCWRldi0+YmFkX3BheWxvYWRbZGV2LT5jY10rKzsKLQkJCQkvKiBkaXNjYXJkIHRoZSBiYWQgZnJhbWUgKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQl9Ci0JfQotCS8qIHNlYXJjaCBkb25lLiAgbm93IGZpbmQgb3V0IGlmIHNob3VsZCBiZSBhY3F1aXJpbmcKLQkgICBvbiB0aGlzIGNoYW5uZWwgKi8KLQlpZiAoIWRldi0+Yl9hY3F1aXJlW2Rldi0+Y2NdKSB7Ci0JCWZybS0+dWxTdGF0ZSA9IDA7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlkeCA9IGRldi0+Y3VyX2ZyYW1lW2Rldi0+Y2NdOwogCWZybSA9ICZkZXYtPmJ1ZmZlcltkZXYtPmNjXS5mcmFtZVtpZHhdOwogCi0JaWYgKGZybS0+dWxTdGF0ZSA9PSAwKSB7Ci0JCWZybS0+dWxTdGF0ZSA9IDE7Ci0JCWZybS0+Y3VyX3NpemUgPSAwOwotCX0gZWxzZSBpZiAoZnJtLT51bFN0YXRlID09IDIpIHsKLQkJLyogc3lzdGVtIGZyYW1lIHJpbmcgYnVmZmVyIG92ZXJydW4gKi8KLQkJZHByaW50aygyLCAic3lzIGZyYW1lIG92ZXJydW4uICBvdmVyd3JpdGluZyBmcmFtZSAlZCAlZFxuIiwKLQkJCWRldi0+Y2MsIGlkeCk7Ci0JCWZybS0+dWxTdGF0ZSA9IDE7CisJaWYgKGZybS0+dWxTdGF0ZSA9PSBTMjI1NV9SRUFEX0lETEUpIHsKKwkJaW50IGpqOworCQl1bnNpZ25lZCBpbnQgY2M7CisJCXMzMiAqcGR3b3JkOworCQlpbnQgcGF5bG9hZDsKKwkJLyogc2VhcmNoIGZvciBtYXJrZXIgY29kZXMgKi8KKwkJcGRhdGEgPSAodW5zaWduZWQgY2hhciAqKXBpcGVfaW5mby0+dHJhbnNmZXJfYnVmZmVyOworCQlmb3IgKGpqID0gMDsgamogPCAocGlwZV9pbmZvLT5jdXJfdHJhbnNmZXJfc2l6ZSAtIDEyKTsgamorKykgeworCQkJc3dpdGNoICgqKHMzMiAqKSBwZGF0YSkgeworCQkJY2FzZSBTMjI1NV9NQVJLRVJfRlJBTUU6CisJCQkJcGR3b3JkID0gKHMzMiAqKXBkYXRhOworCQkJCWRwcmludGsoNCwgImZvdW5kIGZyYW1lIG1hcmtlciBhdCBvZmZzZXQ6IgorCQkJCQkiICVkIFsleCAleF1cbiIsIGpqLCBwZGF0YVswXSwKKwkJCQkJcGRhdGFbMV0pOworCQkJCW9mZnNldCA9IGpqICsgUFJFRklYX1NJWkU7CisJCQkJYmZyYW1lID0gMTsKKwkJCQljYyA9IHBkd29yZFsxXTsKKwkJCQlpZiAoY2MgPj0gTUFYX0NIQU5ORUxTKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkgICAgICAgImJhZCBjaGFubmVsXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qIHJldmVyc2UgaXQgKi8KKwkJCQlkZXYtPmNjID0gR19jaG5tYXBbY2NdOworCQkJCXBheWxvYWQgPSAgcGR3b3JkWzNdOworCQkJCWlmIChwYXlsb2FkID4gZGV2LT5yZXFfaW1hZ2Vfc2l6ZVtkZXYtPmNjXSkgeworCQkJCQlkZXYtPmJhZF9wYXlsb2FkW2Rldi0+Y2NdKys7CisJCQkJCS8qIGRpc2NhcmQgdGhlIGJhZCBmcmFtZSAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJZGV2LT5wa3Rfc2l6ZVtkZXYtPmNjXSA9IHBheWxvYWQ7CisJCQkJZGV2LT5qcGdfc2l6ZVtkZXYtPmNjXSA9IHBkd29yZFs0XTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUzIyNTVfTUFSS0VSX1JFU1BPTlNFOgorCQkJCXBkd29yZCA9IChzMzIgKilwZGF0YTsKKwkJCQlwZGF0YSArPSBERUZfVVNCX0JMT0NLOworCQkJCWpqICs9IERFRl9VU0JfQkxPQ0s7CisJCQkJaWYgKHBkd29yZFsxXSA+PSBNQVhfQ0hBTk5FTFMpCisJCQkJCWJyZWFrOworCQkJCWNjID0gR19jaG5tYXBbcGR3b3JkWzFdXTsKKwkJCQlpZiAoIShjYyA+PSAwICYmIGNjIDwgTUFYX0NIQU5ORUxTKSkKKwkJCQkJYnJlYWs7CisJCQkJc3dpdGNoIChwZHdvcmRbMl0pIHsKKwkJCQljYXNlIDB4MDE6CisJCQkJCS8qIGNoZWNrIGlmIGNoYW5uZWwgdmFsaWQgKi8KKwkJCQkJLyogc2V0IG1vZGUgcmVhZHkgKi8KKwkJCQkJZGV2LT5zZXRtb2RlX3JlYWR5W2NjXSA9IDE7CisJCQkJCXdha2VfdXAoJmRldi0+d2FpdF9zZXRtb2RlW2NjXSk7CisJCQkJCWRwcmludGsoNSwgInNldG1vZGUgcmVhZHkgJWRcbiIsIGNjKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDEwOgorCisJCQkJCWRldi0+Y2huX3JlYWR5IHw9ICgxIDw8IGNjKTsKKwkJCQkJaWYgKChkZXYtPmNobl9yZWFkeSAmIDB4MGYpICE9IDB4MGYpCisJCQkJCQlicmVhazsKKwkJCQkJLyogYWxsIGNoYW5uZWxzIHJlYWR5ICovCisJCQkJCXByaW50ayhLRVJOX0lORk8gInMyMjU1OiBmdyBsb2FkZWRcbiIpOworCQkJCQlhdG9taWNfc2V0KCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlLAorCQkJCQkJICAgUzIyNTVfRldfU1VDQ0VTUyk7CisJCQkJCXdha2VfdXAoJmRldi0+ZndfZGF0YS0+d2FpdF9mdyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ayhLRVJOX0lORk8gInMyMjU1IHVua253biByZXNwXG4iKTsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCXBkYXRhKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmZyYW1lKQorCQkJCWJyZWFrOworCQl9IC8qIGZvciAqLworCQlpZiAoIWJmcmFtZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWR4ID0gZGV2LT5jdXJfZnJhbWVbZGV2LT5jY107CisJZnJtID0gJmRldi0+YnVmZmVyW2Rldi0+Y2NdLmZyYW1lW2lkeF07CisKKwkvKiBzZWFyY2ggZG9uZS4gIG5vdyBmaW5kIG91dCBpZiBzaG91bGQgYmUgYWNxdWlyaW5nIG9uIHRoaXMgY2hhbm5lbCAqLworCWlmICghZGV2LT5iX2FjcXVpcmVbZGV2LT5jY10pIHsKKwkJLyogd2UgZm91bmQgYSBmcmFtZSwgYnV0IHRoaXMgY2hhbm5lbCBpcyB0dXJuZWQgb2ZmICovCisJCWZybS0+dWxTdGF0ZSA9IFMyMjU1X1JFQURfSURMRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZybS0+dWxTdGF0ZSA9PSBTMjI1NV9SRUFEX0lETEUpIHsKKwkJZnJtLT51bFN0YXRlID0gUzIyNTVfUkVBRF9GUkFNRTsKIAkJZnJtLT5jdXJfc2l6ZSA9IDA7CiAJfQogCi0JaWYgKGJzeW5jKSB7Ci0JCS8qIHNraXAgdGhlIG1hcmtlciA1MTIgYnl0ZXMgKGFuZCBvZmZzZXQgaWYgb3V0IG9mIHN5bmMpICovCi0JCXBzcmMgPSAodTggKilwaXBlX2luZm8tPnRyYW5zZmVyX2J1ZmZlciArIG9mZnNldCArIFBSRUZJWF9TSVpFOwotCX0gZWxzZSB7Ci0JCXBzcmMgPSAodTggKilwaXBlX2luZm8tPnRyYW5zZmVyX2J1ZmZlcjsKLQl9CisJLyogc2tpcCB0aGUgbWFya2VyIDUxMiBieXRlcyAoYW5kIG9mZnNldCBpZiBvdXQgb2Ygc3luYykgKi8KKwlwc3JjID0gKHU4ICopcGlwZV9pbmZvLT50cmFuc2Zlcl9idWZmZXIgKyBvZmZzZXQ7CisKIAogCWlmIChmcm0tPmxwdmJpdHMgPT0gTlVMTCkgewogCQlkcHJpbnRrKDEsICJzMjI1NSBmcmFtZSBidWZmZXIgPT0gTlVMTC4lcCAlcCAlZCAlZCIsCkBAIC0xOTEwLDMzICsxOTkwLDIwIEBACiAKIAlwZGVzdCA9IGZybS0+bHB2Yml0cyArIGZybS0+Y3VyX3NpemU7CiAKLQlpZiAoYnN5bmMpIHsKLQkJY29weV9zaXplID0KLQkJICAgIChwaXBlX2luZm8tPmN1cl90cmFuc2Zlcl9zaXplIC0gb2Zmc2V0KSAtIFBSRUZJWF9TSVpFOwotCQlpZiAoY29weV9zaXplID4gcGlwZV9pbmZvLT5jdXJfdHJhbnNmZXJfc2l6ZSkgewotCQkJcHJpbnRrKCJpbnZhbGlkIGNvcHkgc2l6ZSwgb3ZlcmZsb3chXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfSBlbHNlIHsKLQkJY29weV9zaXplID0gcGlwZV9pbmZvLT5jdXJfdHJhbnNmZXJfc2l6ZTsKLQl9CisJY29weV9zaXplID0gKHBpcGVfaW5mby0+Y3VyX3RyYW5zZmVyX3NpemUgLSBvZmZzZXQpOwogCi0JY3VyX3NpemUgPSBmcm0tPmN1cl9zaXplOwotCXNpemUgPSBkZXYtPnJlcV9pbWFnZV9zaXplW2Rldi0+Y2NdOworCXNpemUgPSBkZXYtPnBrdF9zaXplW2Rldi0+Y2NdIC0gUFJFRklYX1NJWkU7CiAKLQlpZiAoKGNvcHlfc2l6ZSArIGN1cl9zaXplKSA+IHNpemUpIHsKLQkJY29weV9zaXplID0gc2l6ZSAtIGN1cl9zaXplOwotCQlidHJ1bmMgPSAxOwotCX0KKwkvKiBzYW5pdHkgY2hlY2sgb24gcGRlc3QgKi8KKwlpZiAoKGNvcHlfc2l6ZSArIGZybS0+Y3VyX3NpemUpIDwgZGV2LT5yZXFfaW1hZ2Vfc2l6ZVtkZXYtPmNjXSkKKwkJbWVtY3B5KHBkZXN0LCBwc3JjLCBjb3B5X3NpemUpOwogCi0JbWVtY3B5KHBkZXN0LCBwc3JjLCBjb3B5X3NpemUpOwotCWN1cl9zaXplICs9IGNvcHlfc2l6ZTsKIAlmcm0tPmN1cl9zaXplICs9IGNvcHlfc2l6ZTsKLQlkcHJpbnRrKDUwLCAiY3VyX3NpemUgc2l6ZSAlbHUgc2l6ZSAlbHUgXG4iLCBjdXJfc2l6ZSwgc2l6ZSk7CisJZHByaW50ayg0LCAiY3VyX3NpemUgc2l6ZSAlbHUgc2l6ZSAlbHUgXG4iLCBmcm0tPmN1cl9zaXplLCBzaXplKTsKIAotCWlmIChjdXJfc2l6ZSA+PSAoc2l6ZSAtIFBSRUZJWF9TSVpFKSkgeworCWlmIChmcm0tPmN1cl9zaXplID49IHNpemUpIHsKKwogCQl1MzIgY2MgPSBkZXYtPmNjOwotCQlmcm0tPnVsU3RhdGUgPSAyOwogCQlkcHJpbnRrKDIsICIqKioqKioqKioqKioqKioqWyVkXUJ1ZmZlclslZF1mdWxsKioqKioqKioqKioqKlxuIiwKIAkJCWNjLCBpZHgpOwogCQlkZXYtPmxhc3RfZnJhbWVbY2NdID0gZGV2LT5jdXJfZnJhbWVbY2NdOwpAQCAtMTk0NSwxNiArMjAxMiwxMyBAQAogCQlpZiAoKGRldi0+Y3VyX2ZyYW1lW2NjXSA9PSBTWVNfRlJBTUVTKSB8fAogCQkgICAgKGRldi0+Y3VyX2ZyYW1lW2NjXSA9PSBkZXYtPmJ1ZmZlcltjY10uZHdGcmFtZXMpKQogCQkJZGV2LT5jdXJfZnJhbWVbY2NdID0gMDsKLQotCQkvKiBzaWduYWwgdGhlIHNlbWFwaG9yZSBmb3IgdGhpcyBjaGFubmVsICovCisJCS8qIGZyYW1lIHJlYWR5ICovCiAJCWlmIChkZXYtPmJfYWNxdWlyZVtjY10pCi0JCQlzMjI1NV9nb3RfZnJhbWUoZGV2LCBjYyk7CisJCQlzMjI1NV9nb3RfZnJhbWUoZGV2LCBjYywgZGV2LT5qcGdfc2l6ZVtjY10pOwogCQlkZXYtPmZyYW1lX2NvdW50W2NjXSsrOwotCX0KLQkvKiBmcmFtZSB3YXMgdHJ1bmNhdGVkICovCi0JaWYgKGJ0cnVuYykgewotCQkvKiByZXR1cm4gbW9yZSBkYXRhIHRvIHByb2Nlc3MgKi8KLQkJcmV0dXJuIEVBR0FJTjsKKwkJZnJtLT51bFN0YXRlID0gUzIyNTVfUkVBRF9JRExFOworCQlmcm0tPmN1cl9zaXplID0gMDsKKwogCX0KIAkvKiBkb25lIHN1Y2Nlc3NmdWxseSAqLwogCXJldHVybiAwOwpAQCAtMTk3Myw4ICsyMDM3LDggQEAKIAl9CiAJLyogb3RoZXJ3aXNlIGNvcHkgdG8gdGhlIHN5c3RlbSBidWZmZXJzICovCiAJcmVzID0gc2F2ZV9mcmFtZShkZXYsIHBpcGVfaW5mbyk7Ci0JaWYgKHJlcyA9PSBFQUdBSU4pCi0JCXNhdmVfZnJhbWUoZGV2LCBwaXBlX2luZm8pOworCWlmIChyZXMgIT0gMCkKKwkJZHByaW50ayg0LCAiczIyNTU6IHJlYWQgY2FsbGJhY2sgZmFpbGVkXG4iKTsKIAogCWRwcmludGsoNTAsICJjYWxsYmFjayByZWFkIHZpZGVvIGRvbmVcbiIpOwogCXJldHVybjsKQEAgLTIwOTQsMTEgKzIxNTgsOSBAQAogCiAJCW1lbXNldChwaXBlLCAwLCBzaXplb2YoKnBpcGUpKTsKIAkJcGlwZS0+ZGV2ID0gZGV2OwotCQlwaXBlLT5jdXJfdHJhbnNmZXJfc2l6ZSA9IERFRkFVTFRfUElQRV9VU0JCTE9DSzsKLQkJcGlwZS0+bWF4X3RyYW5zZmVyX3NpemUgPSBNQVhfUElQRV9VU0JCTE9DSzsKKwkJcGlwZS0+Y3VyX3RyYW5zZmVyX3NpemUgPSBTMjI1NV9VU0JfWEZFUl9TSVpFOworCQlwaXBlLT5tYXhfdHJhbnNmZXJfc2l6ZSA9IFMyMjU1X1VTQl9YRkVSX1NJWkU7CiAKLQkJaWYgKHBpcGUtPmN1cl90cmFuc2Zlcl9zaXplID4gcGlwZS0+bWF4X3RyYW5zZmVyX3NpemUpCi0JCQlwaXBlLT5jdXJfdHJhbnNmZXJfc2l6ZSA9IHBpcGUtPm1heF90cmFuc2Zlcl9zaXplOwogCQlwaXBlLT50cmFuc2Zlcl9idWZmZXIgPSBremFsbG9jKHBpcGUtPm1heF90cmFuc2Zlcl9zaXplLAogCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChwaXBlLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewpAQCAtMjExOCw2ICsyMTgwLDcgQEAKIAlmb3IgKGogPSAwOyBqIDwgTUFYX0NIQU5ORUxTOyBqKyspIHsKIAkJZGV2LT5iX2FjcXVpcmVbal0gPSAwOwogCQlkZXYtPm1vZGVbal0gPSBtb2RlX2RlZjsKKwkJZGV2LT5qY1tqXS5xdWFsaXR5ID0gUzIyNTVfREVGX0pQRUdfUVVBTDsKIAkJZGV2LT5jdXJfZm10W2pdID0gJmZvcm1hdHNbMF07CiAJCWRldi0+bW9kZVtqXS5yZXN0YXJ0ID0gMTsKIAkJZGV2LT5yZXFfaW1hZ2Vfc2l6ZVtqXSA9IGdldF90cmFuc2Zlcl9zaXplKCZtb2RlX2RlZik7CkBAIC0yMzIyLDcgKzIzODUsNyBAQAogCWtmcmVlKGJ1ZmZlcik7CiAJZGV2LT5iX2FjcXVpcmVbY2huXSA9IDA7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZCBzMjI1NV9zdG9wX3JlYWRwaXBlKHN0cnVjdCBzMjI1NV9kZXYgKmRldikKQEAgLTIzNTgsOCArMjQyMSwxMCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgczIyNTVfZndsb2FkX3N0YXJ0KHN0cnVjdCBzMjI1NV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIHMyMjU1X2Z3bG9hZF9zdGFydChzdHJ1Y3QgczIyNTVfZGV2ICpkZXYsIGludCByZXNldCkKIHsKKwlpZiAocmVzZXQpCisJCXMyMjU1X3Jlc2V0X2RzcHBvd2VyKGRldik7CiAJZGV2LT5md19kYXRhLT5md19zaXplID0gZGV2LT5md19kYXRhLT5mdy0+c2l6ZTsKIAlhdG9taWNfc2V0KCZkZXYtPmZ3X2RhdGEtPmZ3X3N0YXRlLCBTMjI1NV9GV19OT1RMT0FERUQpOwogCW1lbWNweShkZXYtPmZ3X2RhdGEtPnBmd19kYXRhLApAQCAtMjM4Miw2ICsyNDQ3LDggQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCWludCBpOwogCWludCByZXR2YWwgPSAtRU5PTUVNOworCV9fbGUzMiAqcGRhdGE7CisJaW50IGZ3X3NpemU7CiAKIAlkcHJpbnRrKDIsICJzMjI1NTogcHJvYmVcbiIpOwogCkBAIC0yNDM2LDYgKzI1MDMsOCBAQAogCWRldi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldi0+ZndfZGF0YTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+ZndfZGF0YS0+d2FpdF9mdyk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgaSsrKQorCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRfc2V0bW9kZVtpXSk7CiAKIAogCWRldi0+ZndfZGF0YS0+ZndfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKQEAgLTI0NTUsMTYgKzI1MjQsMzAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJzZW5zb3JheSAyMjU1IGZhaWxlZCB0byBnZXQgZmlybXdhcmVcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KKwkvKiBjaGVjayB0aGUgZmlybXdhcmUgaXMgdmFsaWQgKi8KKwlmd19zaXplID0gZGV2LT5md19kYXRhLT5mdy0+c2l6ZTsKKwlwZGF0YSA9IChfX2xlMzIgKikgJmRldi0+ZndfZGF0YS0+ZnctPmRhdGFbZndfc2l6ZSAtIDhdOwogCisJaWYgKCpwZGF0YSAhPSBTMjI1NV9GV19NQVJLRVIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRmlybXdhcmUgaW52YWxpZC5cbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc3VyZSBmaXJtd2FyZSBpcyB0aGUgbGF0ZXN0ICovCisJCV9fbGUzMiAqcFJlbDsKKwkJcFJlbCA9IChfX2xlMzIgKikgJmRldi0+ZndfZGF0YS0+ZnctPmRhdGFbZndfc2l6ZSAtIDRdOworCQlwcmludGsoS0VSTl9JTkZPICJzMjI1NSBkc3AgZncgdmVyc2lvbiAleFxuIiwgKnBSZWwpOworCX0KIAkvKiBsb2FkcyB2NGwgc3BlY2lmaWMgKi8KIAlzMjI1NV9wcm9iZV92NGwoZGV2KTsKKwl1c2JfcmVzZXRfZGV2aWNlKGRldi0+dWRldik7CiAJLyogbG9hZCAyMjU1IGJvYXJkIHNwZWNpZmljICovCiAJczIyNTVfYm9hcmRfaW5pdChkZXYpOwogCiAJZHByaW50ayg0LCAiYmVmb3JlIHByb2JlIGRvbmUgJXBcbiIsIGRldik7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwogCi0JczIyNTVfZndsb2FkX3N0YXJ0KGRldik7CisJczIyNTVfZndsb2FkX3N0YXJ0KGRldiwgMCk7CiAJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiU2Vuc29yYXkgMjI1NSBkZXRlY3RlZFxuIik7CiAJcmV0dXJuIDA7CiBlcnJvcjoKQEAgLTI0NzUsMTQgKzI1NTgsMzAgQEAKIHN0YXRpYyB2b2lkIHMyMjU1X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlzdHJ1Y3QgczIyNTVfZGV2ICpkZXYgPSBOVUxMOworCWludCBpOwogCWRwcmludGsoMSwgInMyMjU1OiBkaXNjb25uZWN0IGludGVyZmFjZSAlcFxuIiwgaW50ZXJmYWNlKTsKIAlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwkvKgorCSAqIHdha2UgdXAgYW55IG9mIHRoZSB0aW1lcnMgdG8gYWxsb3cgb3Blbl9sb2NrIHRvIGJlCisJICogYWNxdWlyZWQgc29vbmVyCisJICovCisJYXRvbWljX3NldCgmZGV2LT5md19kYXRhLT5md19zdGF0ZSwgUzIyNTVfRldfRElTQ09OTkVDVElORyk7CisJd2FrZV91cCgmZGV2LT5md19kYXRhLT53YWl0X2Z3KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHsKKwkJZGV2LT5zZXRtb2RlX3JlYWR5W2ldID0gMTsKKwkJd2FrZV91cCgmZGV2LT53YWl0X3NldG1vZGVbaV0pOworCX0KKworCW11dGV4X2xvY2soJmRldi0+b3Blbl9sb2NrKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm9wZW5fbG9jayk7CisKIAlpZiAoZGV2KSB7CiAJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHMyMjU1X2Rlc3Ryb3kpOwogCQlkcHJpbnRrKDEsICJzMjI1NWRydjogZGlzY29ubmVjdFxuIik7CiAJCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgInMyMjU1dXNiIG5vdyBkaXNjb25uZWN0ZWRcbiIpOwogCX0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzMjI1NV9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMKaW5kZXggNmVlNjNlNi4uNGEyMWI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYwpAQCAtNDMsMTM2ICs0MywzNjQgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSAic2FhNTI0NmEuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNTI0NkEsIFNBQTUyODEgVGVsZXRleHQgZGVjb2RlciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorI2RlZmluZSBNQUpPUl9WRVJTSU9OIDEJCS8qIGRyaXZlciBtYWpvciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNSU5PUl9WRVJTSU9OIDgJCS8qIGRyaXZlciBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworCisvKiBOdW1iZXIgb2YgREFVcyA9IG51bWJlciBvZiBwYWdlcyB0aGF0IGNhbiBiZSBzZWFyY2hlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLworI2RlZmluZSBOVU1fREFVUyA0CisKKyNkZWZpbmUgTlVNX1JPV1NfUEVSX1BBR0UgNDAKKworLyogZmlyc3QgY29sdW1uIGlzIDAgKG5vdCAxKSAqLworI2RlZmluZSBQT1NfVElNRV9TVEFSVCAzMgorI2RlZmluZSBQT1NfVElNRV9FTkQgMzkKKworI2RlZmluZSBQT1NfSEVBREVSX1NUQVJUIDcKKyNkZWZpbmUgUE9TX0hFQURFUl9FTkQgMzEKKworLyogUmV0dXJucyAndHJ1ZScgaWYgdGhlIHBhcnQgb2YgdGhlIHZpZGVvdGV4dCBwYWdlIGRlc2NyaWJlZCB3aXRoIHJlcSBjb250YWlucworICAgKGF0IGxlYXN0IHBhcnRzIG9mKSB0aGUgdGltZSBmaWVsZCAqLworI2RlZmluZSBSRVFfQ09OVEFJTlNfVElNRShwX3JlcSkgXAorCSgocF9yZXEpLT5zdGFydCA8PSBQT1NfVElNRV9FTkQgJiYgXAorCSAocF9yZXEpLT5lbmQgICA+PSBQT1NfVElNRV9TVEFSVCkKKworLyogUmV0dXJucyAndHJ1ZScgaWYgdGhlIHBhcnQgb2YgdGhlIHZpZGVvdGV4dCBwYWdlIGRlc2NyaWJlZCB3aXRoIHJlcSBjb250YWlucworICAgKGF0IGxlYXN0IHBhcnRzIG9mKSB0aGUgcGFnZSBoZWFkZXIgKi8KKyNkZWZpbmUgUkVRX0NPTlRBSU5TX0hFQURFUihwX3JlcSkgXAorCSgocF9yZXEpLT5zdGFydCA8PSBQT1NfSEVBREVSX0VORCAmJiBcCisJIChwX3JlcSktPmVuZCAgID49IFBPU19IRUFERVJfU1RBUlQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZGUgcmVnaXN0ZXIgbnVtYmVycyBvZiB0aGUgU0FBNTI0NkEJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMCAgICAwCisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxICAgIDEKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjIgICAgMgorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMyAgICAzCisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I0ICAgIDQKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjUgICAgNQorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SNiAgICA2CisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I3ICAgIDcKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjggICAgOAorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SOSAgICA5CisjZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxMCAgMTAKKyNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjExICAxMQorI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMTFCIDExCisKKy8qIFNBQTUyNDZBIG1vZGUgcmVnaXN0ZXJzIG9mdGVuIGF1dG9pbmNyZW1lbnQgdG8gdGhlIG5leHQgcmVnaXN0ZXIuCisgICBUaGVyZWZvcmUgd2UgdXNlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLiBUaGUgZm9sbG93aW5nIG1hY3JvIGluZGljYXRlcworICAgdGhlIGVuZCBvZiBhIGNvbW1hbmQgbGlzdC4gKi8KKyNkZWZpbmUgQ09NTUFORF9FTkQgKC0xKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb250ZW50cyBvZiB0aGUgbW9kZSByZWdpc3RlcnMgb2YgdGhlIFNBQTUyNDZBCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVnaXN0ZXIgUjAgKEFkdmFuY2VkIENvbnRyb2wpICovCisjZGVmaW5lIFIwX1NFTEVDVF9SMTEJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjBfU0VMRUNUX1IxMUIJCQkJCSAgIDB4MDEKKworI2RlZmluZSBSMF9QTExfVElNRV9DT05TVEFOVF9MT05HCQkJICAgMHgwMAorI2RlZmluZSBSMF9QTExfVElNRV9DT05TVEFOVF9TSE9SVAkJCSAgIDB4MDIKKworI2RlZmluZSBSMF9FTkFCTEVfbk9ERF9FVkVOX09VVFBVVAkJCSAgIDB4MDAKKyNkZWZpbmUgUjBfRElTQUJMRV9uT0REX0VWRU5fT1VUUFVUCQkJICAgMHgwNAorCisjZGVmaW5lIFIwX0VOQUJMRV9IRFJfUE9MTAkJCQkgICAweDAwCisjZGVmaW5lIFIwX0RJU0FCTEVfSERSX1BPTEwJCQkJICAgMHgxMAorCisjZGVmaW5lIFIwX0RPX05PVF9GT1JDRV9uT0REX0VWRU5fTE9XX0lGX1BJQ1RVUkVfRElTUExBWUVEIDB4MDAKKyNkZWZpbmUgUjBfRk9SQ0Vfbk9ERF9FVkVOX0xPV19JRl9QSUNUVVJFX0RJU1BMQVlFRAkgICAweDIwCisKKyNkZWZpbmUgUjBfTk9fRlJFRV9SVU5fUExMCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjBfRlJFRV9SVU5fUExMCQkJCQkgICAweDQwCisKKyNkZWZpbmUgUjBfTk9fQVVUT01BVElDX0ZBU1RFWFRfUFJPTVBUCQkJICAgMHgwMAorI2RlZmluZSBSMF9BVVRPTUFUSUNfRkFTVEVYVF9QUk9NUFQJCQkgICAweDgwCisKKy8qIFJlZ2lzdGVyIFIxIChNb2RlKSAqLworI2RlZmluZSBSMV9JTlRFUkxBQ0VEXzMxMl9BTkRfSEFMRl8zMTJfQU5EX0hBTEZfTElORVMJICAgMHgwMAorI2RlZmluZSBSMV9OT05fSU5URVJMQUNFRF8zMTJfMzEzX0xJTkVTCQkJICAgMHgwMQorI2RlZmluZSBSMV9OT05fSU5URVJMQUNFRF8zMTJfMzEyX0xJTkVTCQkJICAgMHgwMgorI2RlZmluZSBSMV9GRkJfTEVBRElOR19FREdFX0lOX0ZJUlNUX0JST0FEX1BVTFNFCSAgIDB4MDMKKyNkZWZpbmUgUjFfRkZCX0xFQURJTkdfRURHRV9JTl9TRUNPTkRfQlJPQURfUFVMU0UJICAgMHgwNworCisjZGVmaW5lIFIxX0RFVwkJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjFfRlVMTF9GSUVMRAkJCQkJICAgMHgwOAorCisjZGVmaW5lIFIxX0VYVEVOREVEX1BBQ0tFVF9ESVNBQkxFCQkJICAgMHgwMAorI2RlZmluZSBSMV9FWFRFTkRFRF9QQUNLRVRfRU5BQkxFCQkJICAgMHgxMAorCisjZGVmaW5lIFIxX0RBVVNfQUxMX09OCQkJCQkgICAweDAwCisjZGVmaW5lIFIxX0RBVVNfQUxMX09GRgkJCQkJICAgMHgyMAorCisjZGVmaW5lIFIxXzdfQklUU19QTFVTX1BBUklUWQkJCQkgICAweDAwCisjZGVmaW5lIFIxXzhfQklUU19OT19QQVJJVFkJCQkJICAgMHg0MAorCisjZGVmaW5lIFIxX1ZDU19UT19TQ1MJCQkJCSAgIDB4MDAKKyNkZWZpbmUgUjFfTk9fVkNTX1RPX1NDUwkJCQkgICAweDgwCisKKy8qIFJlZ2lzdGVyIFIyIChQYWdlIHJlcXVlc3QgYWRkcmVzcykgKi8KKyNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX1BBR0VfSFVORFJFRFMJCQkgICAweDAwCisjZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9QQUdFX1RFTlMJCQkgICAweDAxCisjZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9QQUdFX1VOSVRTCQkJICAgMHgwMgorI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfSE9VUlNfVEVOUwkJCSAgIDB4MDMKKyNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX0hPVVJTX1VOSVRTCQkJICAgMHgwNAorI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfTUlOVVRFU19URU5TCQkJICAgMHgwNQorI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfTUlOVVRFU19VTklUUwkJCSAgIDB4MDYKKworI2RlZmluZSBSMl9EQVVfMAkJCQkJICAgMHgwMAorI2RlZmluZSBSMl9EQVVfMQkJCQkJICAgMHgxMAorI2RlZmluZSBSMl9EQVVfMgkJCQkJICAgMHgyMAorI2RlZmluZSBSMl9EQVVfMwkJCQkJICAgMHgzMAorCisjZGVmaW5lIFIyX0JBTktfMAkJCQkJICAgMHgwMAorI2RlZmluZSBSMl9CQU5LIDEJCQkJCSAgIDB4NDAKKworI2RlZmluZSBSMl9IQU1NSU5HX0NIRUNLX09OCQkJCSAgIDB4ODAKKyNkZWZpbmUgUjJfSEFNTUlOR19DSEVDS19PRkYJCQkJICAgMHgwMAorCisvKiBSZWdpc3RlciBSMyAoUGFnZSByZXF1ZXN0IGRhdGEpICovCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfMAkJCQkgICAweDAwCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfMQkJCQkgICAweDAxCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfMgkJCQkgICAweDAyCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfMwkJCQkgICAweDAzCisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfNAkJCQkgICAweDA0CisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfNQkJCQkgICAweDA1CisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfNgkJCQkgICAweDA2CisjZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfNwkJCQkgICAweDA3CisKKyNkZWZpbmUgUjNfSE9MRF9QQUdFCQkJCQkgICAweDAwCisjZGVmaW5lIFIzX1VQREFURV9QQUdFCQkJCQkgICAweDA4CisKKyNkZWZpbmUgUjNfUEFHRV9IVU5EUkVEU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfUEFHRV9IVU5EUkVEU19ET19DQVJFCQkJICAgMHgxMAorCisjZGVmaW5lIFIzX1BBR0VfVEVOU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfUEFHRV9URU5TX0RPX0NBUkUJCQkJICAgMHgxMAorCisjZGVmaW5lIFIzX1BBR0VfVU5JVFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCisjZGVmaW5lIFIzX1BBR0VfVU5JVFNfRE9fQ0FSRQkJCQkgICAweDEwCisKKyNkZWZpbmUgUjNfSE9VUlNfVEVOU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfSE9VUlNfVEVOU19ET19DQVJFCQkJCSAgIDB4MTAKKworI2RlZmluZSBSM19IT1VSU19VTklUU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfSE9VUlNfVU5JVFNfRE9fQ0FSRQkJCQkgICAweDEwCisKKyNkZWZpbmUgUjNfTUlOVVRFU19URU5TX0RPX05PVF9DQVJFCQkJICAgMHgwMAorI2RlZmluZSBSM19NSU5VVEVTX1RFTlNfRE9fQ0FSRQkJCQkgICAweDEwCisKKyNkZWZpbmUgUjNfTUlOVVRFU19VTklUU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKKyNkZWZpbmUgUjNfTUlOVVRFU19VTklUU19ET19DQVJFCQkJICAgMHgxMAorCisvKiBSZWdpc3RlciBSNCAoRGlzcGxheSBjaGFwdGVyKSAqLworI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfMAkJCQkgICAweDAwCisjZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV8xCQkJCSAgIDB4MDEKKyNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzIJCQkJICAgMHgwMgorI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfMwkJCQkgICAweDAzCisjZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV80CQkJCSAgIDB4MDQKKyNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzUJCQkJICAgMHgwNQorI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfNgkJCQkgICAweDA2CisjZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV83CQkJCSAgIDB4MDcKKworLyogUmVnaXN0ZXIgUjUgKE5vcm1hbCBkaXNwbGF5IGNvbnRyb2wpICovCisjZGVmaW5lIFI1X1BJQ1RVUkVfSU5TSURFX0JPWElOR19PRkYJCQkgICAweDAwCisjZGVmaW5lIFI1X1BJQ1RVUkVfSU5TSURFX0JPWElOR19PTgkJCSAgIDB4MDEKKworI2RlZmluZSBSNV9QSUNUVVJFX09VVFNJREVfQk9YSU5HX09GRgkJCSAgIDB4MDAKKyNkZWZpbmUgUjVfUElDVFVSRV9PVVRTSURFX0JPWElOR19PTgkJCSAgIDB4MDIKKworI2RlZmluZSBSNV9URVhUX0lOU0lERV9CT1hJTkdfT0ZGCQkJICAgMHgwMAorI2RlZmluZSBSNV9URVhUX0lOU0lERV9CT1hJTkdfT04JCQkgICAweDA0CisKKyNkZWZpbmUgUjVfVEVYVF9PVVRTSURFX0JPWElOR19PRkYJCQkgICAweDAwCisjZGVmaW5lIFI1X1RFWFRfT1VUU0lERV9CT1hJTkdfT04JCQkgICAweDA4CisKKyNkZWZpbmUgUjVfQ09OVFJBU1RfUkVEVUNUSU9OX0lOU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09OCQkgICAweDEwCisKKyNkZWZpbmUgUjVfQ09OVFJBU1RfUkVEVUNUSU9OX09VVFNJREVfQk9YSU5HX09GRgkgICAweDAwCisjZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PTgkJICAgMHgyMAorCisjZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PRkYJCSAgIDB4MDAKKyNkZWZpbmUgUjVfQkFDS0dST1VORF9DT0xPUl9JTlNJREVfQk9YSU5HX09OCQkgICAweDQwCisKKyNkZWZpbmUgUjVfQkFDS0dST1VORF9DT0xPUl9PVVRTSURFX0JPWElOR19PRkYJCSAgIDB4MDAKKyNkZWZpbmUgUjVfQkFDS0dST1VORF9DT0xPUl9PVVRTSURFX0JPWElOR19PTgkJICAgMHg4MAorCisvKiBSZWdpc3RlciBSNiAoTmV3c2ZsYXNoIGRpc3BsYXkpICovCisjZGVmaW5lIFI2X05FV1NGTEFTSF9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI2X05FV1NGTEFTSF9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT04JCSAgIDB4MDEKKworI2RlZmluZSBSNl9ORVdTRkxBU0hfUElDVFVSRV9PVVRTSURFX0JPWElOR19PRkYJCSAgIDB4MDAKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX1BJQ1RVUkVfT1VUU0lERV9CT1hJTkdfT04JCSAgIDB4MDIKKworI2RlZmluZSBSNl9ORVdTRkxBU0hfVEVYVF9JTlNJREVfQk9YSU5HX09GRgkJICAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfVEVYVF9JTlNJREVfQk9YSU5HX09OCQkgICAweDA0CisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX1RFWFRfT1VUU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCisjZGVmaW5lIFI2X05FV1NGTEFTSF9URVhUX09VVFNJREVfQk9YSU5HX09OCQkgICAweDA4CisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09GRiAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfQ09OVFJBU1RfUkVEVUNUSU9OX0lOU0lERV9CT1hJTkdfT04gICAweDEwCisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PRkYgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfQ09OVFJBU1RfUkVEVUNUSU9OX09VVFNJREVfQk9YSU5HX09OICAweDIwCisKKyNkZWZpbmUgUjZfTkVXU0ZMQVNIX0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PRkYgICAgMHgwMAorI2RlZmluZSBSNl9ORVdTRkxBU0hfQkFDS0dST1VORF9DT0xPUl9JTlNJREVfQk9YSU5HX09OCSAgIDB4NDAKKworI2RlZmluZSBSNl9ORVdTRkxBU0hfQkFDS0dST1VORF9DT0xPUl9PVVRTSURFX0JPWElOR19PRkYgICAweDAwCisjZGVmaW5lIFI2X05FV1NGTEFTSF9CQUNLR1JPVU5EX0NPTE9SX09VVFNJREVfQk9YSU5HX09OICAgIDB4ODAKKworLyogUmVnaXN0ZXIgUjcgKERpc3BsYXkgbW9kZSkgKi8KKyNkZWZpbmUgUjdfQk9YX09GRl9ST1dfMAkJCQkgICAweDAwCisjZGVmaW5lIFI3X0JPWF9PTl9ST1dfMAkJCQkJICAgMHgwMQorCisjZGVmaW5lIFI3X0JPWF9PRkZfUk9XXzFfVE9fMjMJCQkJICAgMHgwMAorI2RlZmluZSBSN19CT1hfT05fUk9XXzFfVE9fMjMJCQkJICAgMHgwMgorCisjZGVmaW5lIFI3X0JPWF9PRkZfUk9XXzI0CQkJCSAgIDB4MDAKKyNkZWZpbmUgUjdfQk9YX09OX1JPV18yNAkJCQkgICAweDA0CisKKyNkZWZpbmUgUjdfU0lOR0xFX0hFSUdIVAkJCQkgICAweDAwCisjZGVmaW5lIFI3X0RPVUJMRV9IRUlHSFQJCQkJICAgMHgwOAorCisjZGVmaW5lIFI3X1RPUF9IQUxGCQkJCQkgICAweDAwCisjZGVmaW5lIFI3X0JPVFRPTV9IQUxGCQkJCQkgICAweDEwCisKKyNkZWZpbmUgUjdfUkVWRUFMX09GRgkJCQkJICAgMHgwMAorI2RlZmluZSBSN19SRVZFQUxfT04JCQkJCSAgIDB4MjAKKworI2RlZmluZSBSN19DVVJTRVJfT0ZGCQkJCQkgICAweDAwCisjZGVmaW5lIFI3X0NVUlNFUl9PTgkJCQkJICAgMHg0MAorCisjZGVmaW5lIFI3X1NUQVRVU19CT1RUT00JCQkJICAgMHgwMAorI2RlZmluZSBSN19TVEFUVVNfVE9QCQkJCQkgICAweDgwCisKKy8qIFJlZ2lzdGVyIFI4IChBY3RpdmUgY2hhcHRlcikgKi8KKyNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfMAkJCQkgICAweDAwCisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzEJCQkJICAgMHgwMQorI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl8yCQkJCSAgIDB4MDIKKyNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfMwkJCQkgICAweDAzCisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzQJCQkJICAgMHgwNAorI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl81CQkJCSAgIDB4MDUKKyNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfNgkJCQkgICAweDA2CisjZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzcJCQkJICAgMHgwNworCisjZGVmaW5lIFI4X0NMRUFSX01FTU9SWQkJCQkJICAgMHgwOAorI2RlZmluZSBSOF9ET19OT1RfQ0xFQVJfTUVNT1JZCQkJCSAgIDB4MDAKKworLyogUmVnaXN0ZXIgUjkgKEN1cnNlciByb3cpICovCisjZGVmaW5lIFI5X0NVUlNFUl9ST1dfMAkJCQkJICAgMHgwMAorI2RlZmluZSBSOV9DVVJTRVJfUk9XXzEJCQkJCSAgIDB4MDEKKyNkZWZpbmUgUjlfQ1VSU0VSX1JPV18yCQkJCQkgICAweDAyCisjZGVmaW5lIFI5X0NVUlNFUl9ST1dfMjUJCQkJICAgMHgxOQorCisvKiBSZWdpc3RlciBSMTAgKEN1cnNlciBjb2x1bW4pICovCisjZGVmaW5lIFIxMF9DVVJTRVJfQ09MVU1OXzAJCQkJICAgMHgwMAorI2RlZmluZSBSMTBfQ1VSU0VSX0NPTFVNTl82CQkJCSAgIDB4MDYKKyNkZWZpbmUgUjEwX0NVUlNFUl9DT0xVTU5fOAkJCQkgICAweDA4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJvdyAyNSBjb250cm9sIGRhdGEgaW4gY29sdW1uIDAgdG8gOQkJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBST1cyNV9DT0xVTU4wX1BBR0VfVU5JVFMJCQkgICAweDBGCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1OMV9QQUdFX1RFTlMJCQkJICAgMHgwRgorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjJfTUlOVVRFU19VTklUUwkJCSAgIDB4MEYKKworI2RlZmluZSBST1cyNV9DT0xVTU4zX01JTlVURVNfVEVOUwkJCSAgIDB4MDcKKyNkZWZpbmUgUk9XMjVfQ09MVU1OM19ERUxFVEVfUEFHRQkJCSAgIDB4MDgKKworI2RlZmluZSBST1cyNV9DT0xVTU40X0hPVVJfVU5JVFMJCQkgICAweDBGCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONV9IT1VSX1RFTlMJCQkJICAgMHgwMworI2RlZmluZSBST1cyNV9DT0xVTU41X0lOU0VSVF9IRUFETElORQkJCSAgIDB4MDQKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONV9JTlNFUlRfU1VCVElUTEUJCQkgICAweDA4CisKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONl9TVVBQUkVTU19IRUFERVIJCQkgICAweDAxCisjZGVmaW5lIFJPVzI1X0NPTFVNTjZfVVBEQVRFX1BBR0UJCQkgICAweDAyCisjZGVmaW5lIFJPVzI1X0NPTFVNTjZfSU5URVJSVVBURURfU0VRVUVOQ0UJCSAgIDB4MDQKKyNkZWZpbmUgUk9XMjVfQ09MVU1ONl9TVVBQUkVTU19ESVNQTEFZCQkJICAgMHgwOAorCisjZGVmaW5lIFJPVzI1X0NPTFVNTjdfU0VSSUFMX01PREUJCQkgICAweDAxCisjZGVmaW5lIFJPVzI1X0NPTFVNTjdfQ0hBUkFDVEVSX1NFVAkJCSAgIDB4MEUKKworI2RlZmluZSBST1cyNV9DT0xVTU44X1BBR0VfSFVORFJFRFMJCQkgICAweDA3CisjZGVmaW5lIFJPVzI1X0NPTFVNTjhfUEFHRV9OT1RfRk9VTkQJCQkgICAweDEwCisKKyNkZWZpbmUgUk9XMjVfQ09MVU1OOV9QQUdFX0JFSU5HX0xPT0tFRF9GT1IJCSAgIDB4MjAKKworI2RlZmluZSBST1cyNV9DT0xVTU4wX1RPXzdfSEFNTUlOR19FUlJPUgkJICAgMHgxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIZWxwZXIgbWFjcm9zIGZvciBleHRyYWN0aW5nIHBhZ2UsIGhvdXIgYW5kIG1pbnV0ZSBkaWdpdHMJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJZVEVfUE9TICAwIGlzIGF0IHJvdyAwLCBjb2x1bW4gMCwKKyAgIEJZVEVfUE9TICAxIGlzIGF0IHJvdyAwLCBjb2x1bW4gMSwKKyAgIEJZVEVfUE9TIDQwIGlzIGF0IHJvdyAxLCBjb2x1bW4gMCwgKHdpdGggTlVNX1JPV1NfUEVSX1BBR0UgPSA0MCkKKyAgIEJZVEVfUE9TIDQxIGlzIGF0IHJvdyAxLCBjb2x1bW4gMSwgKHdpdGggTlVNX1JPV1NfUEVSX1BBR0UgPSA0MCksCisgICAuLi4gKi8KKyNkZWZpbmUgUk9XKEJZVEVfUE9TKSAgICAoQllURV9QT1MgLyBOVU1fUk9XU19QRVJfUEFHRSkKKyNkZWZpbmUgQ09MVU1OKEJZVEVfUE9TKSAoQllURV9QT1MgJSBOVU1fUk9XU19QRVJfUEFHRSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGVscGVyIG1hY3JvcyBmb3IgZXh0cmFjdGluZyBwYWdlLCBob3VyIGFuZCBtaW51dGUgZGlnaXRzCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNYWNyb3MgZm9yIGV4dHJhY3RpbmcgaHVuZHJlZHMsIHRlbnMgYW5kIHVuaXRzIG9mIGEgcGFnZSBudW1iZXIgd2hpY2gKKyAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4uIDB4Nzk5LgorICAgTm90ZSB0aGF0IHBhZ2UgaXMgY29kZWQgaW4gaGV4YWRlY2ltYWwsIGkuZS4gMHgxMjMgbWVhbnMgcGFnZSAxMjMuCisgICBwYWdlIDB4Li4gbWVhbnMgcGFnZSA4Li4gKi8KKyNkZWZpbmUgSFVORFJFRFNfT0ZfUEFHRShwYWdlKSAoKChwYWdlKSAvIDB4MTAwKSAmIDB4NykKKyNkZWZpbmUgVEVOU19PRl9QQUdFKHBhZ2UpICAgICAoKChwYWdlKSAvIDB4MTApICAmIDB4RikKKyNkZWZpbmUgVU5JVFNfT0ZfUEFHRShwYWdlKSAgICAgKChwYWdlKSAmIDB4RikKKworLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIHRlbnMgYW5kIHVuaXRzIG9mIGEgaG91ciBpbmZvcm1hdGlvbiB3aGljaAorICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCAuLi4gMHgyNC4KKyAgIE5vdGUgdGhhdCBob3VyIGlzIGNvZGVkIGluIGhleGFkZWNpbWFsLCBpLmUuIDB4MTIgbWVhbnMgMTIgaG91cnMgKi8KKyNkZWZpbmUgVEVOU19PRl9IT1VSKGhvdXIpICAoKGhvdXIpIC8gMHgxMCkKKyNkZWZpbmUgVU5JVFNfT0ZfSE9VUihob3VyKSAoKGhvdXIpICYgMHhGKQorCisvKiBNYWNyb3MgZm9yIGV4dHJhY3RpbmcgdGVucyBhbmQgdW5pdHMgb2YgYSBtaW51dGUgaW5mb3JtYXRpb24gd2hpY2gKKyAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4uIDB4NTkuCisgICBOb3RlIHRoYXQgbWludXRlIGlzIGNvZGVkIGluIGhleGFkZWNpbWFsLCBpLmUuIDB4MTIgbWVhbnMgMTIgbWludXRlcyAqLworI2RlZmluZSBURU5TX09GX01JTlVURShtaW51dGUpICAoKG1pbnV0ZSkgLyAweDEwKQorI2RlZmluZSBVTklUU19PRl9NSU5VVEUobWludXRlKSAoKG1pbnV0ZSkgJiAweEYpCisKKyNkZWZpbmUgSE9VUl9NQVggICAweDIzCisjZGVmaW5lIE1JTlVURV9NQVggMHg1OQorI2RlZmluZSBQQUdFX01BWCAgIDB4OEZGCisKKwogc3RydWN0IHNhYTUyNDZhX2RldmljZQogewogCXU4ICAgICBwZ2J1ZltOVU1fREFVU11bVlRYX1ZJUlRVQUxTSVpFXTsKIAlpbnQgICAgaXNfc2VhcmNoaW5nW05VTV9EQVVTXTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlOwkvKiBEZWNsYXJlZCBuZWFyIGJvdHRvbSAqLwogCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXQkgPSB7IEkyQ19BRERSRVNTLCBJMkNfQ0xJRU5UX0VORCB9OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQotc3RhdGljIGludCBzYWE1MjQ2YV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCi17Ci0JaW50IHBnYnVmOwotCWludCBlcnI7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZDsKLQlzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0OwotCi0JcHJpbnRrKEtFUk5fSU5GTyAic2FhNTI0NmE6IHRlbGV0ZXh0IGNoaXAgZm91bmQuXG4iKTsKLQljbGllbnQ9a21hbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOwotCWlmKGNsaWVudD09TlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwotCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQltZW1jcHkoY2xpZW50LCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoKmNsaWVudCkpOwotCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOwotCWlmKHQ9PU5VTEwpCi0JewotCQlrZnJlZShjbGllbnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3RybGNweShjbGllbnQtPm5hbWUsIElGX05BTUUsIEkyQ19OQU1FX1NJWkUpOwotCW11dGV4X2luaXQoJnQtPmxvY2spOwotCi0JLyoKLQkgKglOb3cgY3JlYXRlIGEgdmlkZW80bGludXggZGV2aWNlCi0JICovCi0KLQl2ZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmKHZkPT1OVUxMKQotCXsKLQkJa2ZyZWUodCk7Ci0JCWtmcmVlKGNsaWVudCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB2ZCk7Ci0JbWVtY3B5KHZkLCAmc2FhX3RlbXBsYXRlLCBzaXplb2YoKnZkKSk7Ci0KLQlmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykKLQl7Ci0JCW1lbXNldCh0LT5wZ2J1ZltwZ2J1Zl0sICcgJywgc2l6ZW9mKHQtPnBnYnVmWzBdKSk7Ci0JCXQtPmlzX3NlYXJjaGluZ1twZ2J1Zl0gPSBmYWxzZTsKLQl9Ci0JdmQtPnByaXY9dDsKLQotCi0JLyoKLQkgKglSZWdpc3RlciBpdAotCSAqLwotCi0JaWYoKGVycj12aWRlb19yZWdpc3Rlcl9kZXZpY2UodmQsIFZGTF9UWVBFX1ZUWCwtMSkpPDApCi0JewotCQlrZnJlZSh0KTsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmQpOwotCQlyZXR1cm4gZXJyOwotCX0KLQl0LT5jbGllbnQgPSBjbGllbnQ7Ci0JaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCVdlIGRvIG1vc3Qgb2YgdGhlIGhhcmQgd29yayB3aGVuIHdlIGJlY29tZSBhIGRldmljZSBvbiB0aGUgaTJjLgotICovCi1zdGF0aWMgaW50IHNhYTUyNDZhX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQotCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHNhYTUyNDZhX2F0dGFjaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2FhNTI0NmFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkKTsKLQlrZnJlZSh2ZC0+cHJpdik7Ci0Ja2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqCUkyQyBpbnRlcmZhY2VzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfdmlkZW90ZXh0ID0KLXsKLQkuZHJpdmVyID0gewotCQkubmFtZSAJPSBJRl9OQU1FLAkJLyogbmFtZSAqLwotCX0sCi0JLmlkIAkJPSBJMkNfRFJJVkVSSURfU0FBNTI0OSwgLyogaW4gaTJjLmggKi8KLQkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE1MjQ2YV9wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCAgPSBzYWE1MjQ2YV9kZXRhY2gsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewotCS5kcml2ZXIJCT0gJmkyY19kcml2ZXJfdmlkZW90ZXh0LAotCS5uYW1lCQk9ICIodW5zZXQpIiwKLX07Ci0KIHN0YXRpYyBpbnQgaTJjX3NlbmRidWYoc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCwgaW50IHJlZywgaW50IGNvdW50LCB1OCAqZGF0YSkKIHsKIAljaGFyIGJ1Zls2NF07CkBAIC01NzksOCArODA3LDggQEAKIHN0YXRpYyBpbnQgZG9fc2FhNTI0NmFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3Qgc2FhNTI0NmFfZGV2aWNlICp0PXZkLT5wcml2OworCXN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCiAJc3dpdGNoKGNtZCkKIAl7CiAJCWNhc2UgVlRYSU9DR0VUSU5GTzoKQEAgLTcyMCw4ICs5NDgsNyBAQAogc3RhdGljIGludCBzYWE1MjQ2YV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCA9IHZkLT5wcml2OworCXN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCBlcnI7CiAKIAljbWQgPSB2dHhfZml4X2NvbW1hbmQoY21kKTsKQEAgLTczMywyMSArOTYwLDE1IEBACiAKIHN0YXRpYyBpbnQgc2FhNTI0NmFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCA9IHZkLT5wcml2OwotCWludCBlcnI7CisJc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQllcnIgPSB2aWRlb19leGNsdXNpdmVfb3Blbihpbm9kZSxmaWxlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlpZiAodC0+Y2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHQtPmNsaWVudD09TlVMTCkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZhaWw7Ci0JfQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ0LT5pbl91c2UpKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKGkyY19zZW5kZGF0YSh0LCBTQUE1MjQ2QV9SRUdJU1RFUl9SMCwKLQogCQlSMF9TRUxFQ1RfUjExIHwKIAkJUjBfUExMX1RJTUVfQ09OU1RBTlRfTE9ORyB8CiAJCVIwX0VOQUJMRV9uT0REX0VWRU5fT1VUUFVUIHwKQEAgLTc3MywyMSArOTk0LDE1IEBACiAKIAkJQ09NTUFORF9FTkQpKQogCXsKLQkJZXJyID0gLUVJTzsKLQkJZ290byBmYWlsOworCQljbGVhcl9iaXQoMCwgJnQtPmluX3VzZSk7CisJCXJldHVybiAtRUlPOwogCX0KLQogCXJldHVybiAwOwotCi1mYWlsOgotCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLGZpbGUpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2FhNTI0NmFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdCA9IHZkLT5wcml2OworCXN0cnVjdCBzYWE1MjQ2YV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJLyogU3RvcCBhbGwgYWNxdWlzaXRpb24gY2lyY3VpdHMuICovCiAJaTJjX3NlbmRkYXRhKHQsIFNBQTUyNDZBX1JFR0lTVEVSX1IxLApAQCAtODAwLDI2ICsxMDE1LDEwIEBACiAJCVIxX1ZDU19UT19TQ1MsCiAKIAkJQ09NTUFORF9FTkQpOwotCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLGZpbGUpOworCWNsZWFyX2JpdCgwLCAmdC0+aW5fdXNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9zYWFfNTI0NmEgKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTwotCQkiU0FBNTI0NkEgKG9yIGNvbXBhdGlibGUpIFRlbGV0ZXh0IGRlY29kZXIgZHJpdmVyIHZlcnNpb24gJWQuJWRcbiIsCi0JCU1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04pOwotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl92aWRlb3RleHQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zYWFfNTI0NmEgKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfdmlkZW90ZXh0KTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9zYWFfNTI0NmEpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9zYWFfNTI0NmEpOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzYWFfZm9wcyA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiAJLm9wZW4JID0gc2FhNTI0NmFfb3BlbiwKQEAgLTgzMCw4ICsxMDI5LDc5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNhYV90ZW1wbGF0ZSA9CiB7Ci0JLm5hbWUJICA9IElGX05BTUUsCisJLm5hbWUJICA9ICJzYWE1MjQ2YSIsCiAJLmZvcHMJICA9ICZzYWFfZm9wcywKIAkucmVsZWFzZSAgPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKIAkubWlub3IgICAgPSAtMSwKIH07CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDIyID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CisKK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgaW50IHNhYTUyNDZhX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHBnYnVmOworCWludCBlcnI7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CisJc3RydWN0IHNhYTUyNDZhX2RldmljZSAqdDsKKworCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKwl2NGxfaW5mbyhjbGllbnQsICJWaWRlb1RleHQgdmVyc2lvbiAlZC4lZFxuIiwKKwkJCU1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04pOworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICh0ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJnQtPmxvY2spOworCisJLyogTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZSAqLworCXZkID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKHZkID09IE5VTEwpIHsKKwkJa2ZyZWUodCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB2ZCk7CisJbWVtY3B5KHZkLCAmc2FhX3RlbXBsYXRlLCBzaXplb2YoKnZkKSk7CisKKwlmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykgeworCQltZW1zZXQodC0+cGdidWZbcGdidWZdLCAnICcsIHNpemVvZih0LT5wZ2J1ZlswXSkpOworCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7CisJfQorCXZpZGVvX3NldF9kcnZkYXRhKHZkLCB0KTsKKworCS8qIFJlZ2lzdGVyIGl0ICovCisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkLCBWRkxfVFlQRV9WVFgsIC0xKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZSh0KTsKKwkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmQpOworCQlyZXR1cm4gZXJyOworCX0KKwl0LT5jbGllbnQgPSBjbGllbnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNTI0NmFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkKTsKKwlrZnJlZSh2aWRlb19nZXRfZHJ2ZGF0YSh2ZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2FhNTI0NmFfaWRbXSA9IHsKKwl7ICJzYWE1MjQ2YSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2FhNTI0NmFfaWQpOworCitzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CisJLm5hbWUgPSAic2FhNTI0NmEiLAorCS5kcml2ZXJpZCA9IEkyQ19EUklWRVJJRF9TQUE1MjQ5LAorCS5wcm9iZSA9IHNhYTUyNDZhX3Byb2JlLAorCS5yZW1vdmUgPSBzYWE1MjQ2YV9yZW1vdmUsCisJLmlkX3RhYmxlID0gc2FhNTI0NmFfaWQsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM5NGMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICAgRHJpdmVyIGZvciB0aGUgU0FBNTI0NkEgb3IgU0FBNTI4MSBUZWxldGV4dCAoPVZpZGVvdGV4dCkgZGVjb2RlciBjaGlwcyBmcm9tCi0gICBQaGlsaXBzLgotCi0gICBDb3B5cmlnaHQgKEMpIDIwMDQgTWljaGFlbCBHZW5nIChsaW51eEBNaWNoYWVsR2VuZy5kZSkKLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICovCi0jaWZuZGVmIF9fU0FBNTI0NkFfSF9fCi0jZGVmaW5lIF9fU0FBNTI0NkFfSF9fCi0KLSNkZWZpbmUgTUFKT1JfVkVSU0lPTiAxCQkvKiBkcml2ZXIgbWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KLSNkZWZpbmUgTUlOT1JfVkVSU0lPTiA4CQkvKiBkcml2ZXIgbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KLQotI2RlZmluZSBJRl9OQU1FICJTQUE1MjQ2QSIKLQotI2RlZmluZSBJMkNfQUREUkVTUyAxNwotCi0vKiBOdW1iZXIgb2YgREFVcyA9IG51bWJlciBvZiBwYWdlcyB0aGF0IGNhbiBiZSBzZWFyY2hlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLwotI2RlZmluZSBOVU1fREFVUyA0Ci0KLSNkZWZpbmUgTlVNX1JPV1NfUEVSX1BBR0UgNDAKLQotLyogZmlyc3QgY29sdW1uIGlzIDAgKG5vdCAxKSAqLwotI2RlZmluZSBQT1NfVElNRV9TVEFSVCAzMgotI2RlZmluZSBQT1NfVElNRV9FTkQgMzkKLQotI2RlZmluZSBQT1NfSEVBREVSX1NUQVJUIDcKLSNkZWZpbmUgUE9TX0hFQURFUl9FTkQgMzEKLQotLyogUmV0dXJucyAndHJ1ZScgaWYgdGhlIHBhcnQgb2YgdGhlIHZpZGVvdGV4dCBwYWdlIGRlc2NyaWJlZCB3aXRoIHJlcSBjb250YWlucwotICAgKGF0IGxlYXN0IHBhcnRzIG9mKSB0aGUgdGltZSBmaWVsZCAqLwotI2RlZmluZSBSRVFfQ09OVEFJTlNfVElNRShwX3JlcSkgXAotCSgocF9yZXEpLT5zdGFydCA8PSBQT1NfVElNRV9FTkQgJiYgXAotCSAocF9yZXEpLT5lbmQgICA+PSBQT1NfVElNRV9TVEFSVCkKLQotLyogUmV0dXJucyAndHJ1ZScgaWYgdGhlIHBhcnQgb2YgdGhlIHZpZGVvdGV4dCBwYWdlIGRlc2NyaWJlZCB3aXRoIHJlcSBjb250YWlucwotICAgKGF0IGxlYXN0IHBhcnRzIG9mKSB0aGUgcGFnZSBoZWFkZXIgKi8KLSNkZWZpbmUgUkVRX0NPTlRBSU5TX0hFQURFUihwX3JlcSkgXAotCSgocF9yZXEpLT5zdGFydCA8PSBQT1NfSEVBREVSX0VORCAmJiBcCi0JIChwX3JlcSktPmVuZCAgID49IFBPU19IRUFERVJfU1RBUlQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE1vZGUgcmVnaXN0ZXIgbnVtYmVycyBvZiB0aGUgU0FBNTI0NkEJCQkJICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMCAgICAwCi0jZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxICAgIDEKLSNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjIgICAgMgotI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMyAgICAzCi0jZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I0ICAgIDQKLSNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjUgICAgNQotI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SNiAgICA2Ci0jZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1I3ICAgIDcKLSNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjggICAgOAotI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SOSAgICA5Ci0jZGVmaW5lIFNBQTUyNDZBX1JFR0lTVEVSX1IxMCAgMTAKLSNkZWZpbmUgU0FBNTI0NkFfUkVHSVNURVJfUjExICAxMQotI2RlZmluZSBTQUE1MjQ2QV9SRUdJU1RFUl9SMTFCIDExCi0KLS8qIFNBQTUyNDZBIG1vZGUgcmVnaXN0ZXJzIG9mdGVuIGF1dG9pbmNyZW1lbnQgdG8gdGhlIG5leHQgcmVnaXN0ZXIuCi0gICBUaGVyZWZvcmUgd2UgdXNlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLiBUaGUgZm9sbG93aW5nIG1hY3JvIGluZGljYXRlcwotICAgdGhlIGVuZCBvZiBhIGNvbW1hbmQgbGlzdC4gKi8KLSNkZWZpbmUgQ09NTUFORF9FTkQgKC0gMSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ29udGVudHMgb2YgdGhlIG1vZGUgcmVnaXN0ZXJzIG9mIHRoZSBTQUE1MjQ2QQkJCSAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlZ2lzdGVyIFIwIChBZHZhbmNlZCBDb250cm9sKSAqLwotI2RlZmluZSBSMF9TRUxFQ1RfUjExCQkJCQkgICAweDAwCi0jZGVmaW5lIFIwX1NFTEVDVF9SMTFCCQkJCQkgICAweDAxCi0KLSNkZWZpbmUgUjBfUExMX1RJTUVfQ09OU1RBTlRfTE9ORwkJCSAgIDB4MDAKLSNkZWZpbmUgUjBfUExMX1RJTUVfQ09OU1RBTlRfU0hPUlQJCQkgICAweDAyCi0KLSNkZWZpbmUgUjBfRU5BQkxFX25PRERfRVZFTl9PVVRQVVQJCQkgICAweDAwCi0jZGVmaW5lIFIwX0RJU0FCTEVfbk9ERF9FVkVOX09VVFBVVAkJCSAgIDB4MDQKLQotI2RlZmluZSBSMF9FTkFCTEVfSERSX1BPTEwJCQkJICAgMHgwMAotI2RlZmluZSBSMF9ESVNBQkxFX0hEUl9QT0xMCQkJCSAgIDB4MTAKLQotI2RlZmluZSBSMF9ET19OT1RfRk9SQ0Vfbk9ERF9FVkVOX0xPV19JRl9QSUNUVVJFX0RJU1BMQVlFRCAweDAwCi0jZGVmaW5lIFIwX0ZPUkNFX25PRERfRVZFTl9MT1dfSUZfUElDVFVSRV9ESVNQTEFZRUQJICAgMHgyMAotCi0jZGVmaW5lIFIwX05PX0ZSRUVfUlVOX1BMTAkJCQkgICAweDAwCi0jZGVmaW5lIFIwX0ZSRUVfUlVOX1BMTAkJCQkJICAgMHg0MAotCi0jZGVmaW5lIFIwX05PX0FVVE9NQVRJQ19GQVNURVhUX1BST01QVAkJCSAgIDB4MDAKLSNkZWZpbmUgUjBfQVVUT01BVElDX0ZBU1RFWFRfUFJPTVBUCQkJICAgMHg4MAotCi0vKiBSZWdpc3RlciBSMSAoTW9kZSkgKi8KLSNkZWZpbmUgUjFfSU5URVJMQUNFRF8zMTJfQU5EX0hBTEZfMzEyX0FORF9IQUxGX0xJTkVTCSAgIDB4MDAKLSNkZWZpbmUgUjFfTk9OX0lOVEVSTEFDRURfMzEyXzMxM19MSU5FUwkJCSAgIDB4MDEKLSNkZWZpbmUgUjFfTk9OX0lOVEVSTEFDRURfMzEyXzMxMl9MSU5FUwkJCSAgIDB4MDIKLSNkZWZpbmUgUjFfRkZCX0xFQURJTkdfRURHRV9JTl9GSVJTVF9CUk9BRF9QVUxTRQkgICAweDAzCi0jZGVmaW5lIFIxX0ZGQl9MRUFESU5HX0VER0VfSU5fU0VDT05EX0JST0FEX1BVTFNFCSAgIDB4MDcKLQotI2RlZmluZSBSMV9ERVcJCQkJCQkgICAweDAwCi0jZGVmaW5lIFIxX0ZVTExfRklFTEQJCQkJCSAgIDB4MDgKLQotI2RlZmluZSBSMV9FWFRFTkRFRF9QQUNLRVRfRElTQUJMRQkJCSAgIDB4MDAKLSNkZWZpbmUgUjFfRVhURU5ERURfUEFDS0VUX0VOQUJMRQkJCSAgIDB4MTAKLQotI2RlZmluZSBSMV9EQVVTX0FMTF9PTgkJCQkJICAgMHgwMAotI2RlZmluZSBSMV9EQVVTX0FMTF9PRkYJCQkJCSAgIDB4MjAKLQotI2RlZmluZSBSMV83X0JJVFNfUExVU19QQVJJVFkJCQkJICAgMHgwMAotI2RlZmluZSBSMV84X0JJVFNfTk9fUEFSSVRZCQkJCSAgIDB4NDAKLQotI2RlZmluZSBSMV9WQ1NfVE9fU0NTCQkJCQkgICAweDAwCi0jZGVmaW5lIFIxX05PX1ZDU19UT19TQ1MJCQkJICAgMHg4MAotCi0vKiBSZWdpc3RlciBSMiAoUGFnZSByZXF1ZXN0IGFkZHJlc3MpICovCi0jZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9QQUdFX0hVTkRSRURTCQkJICAgMHgwMAotI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfUEFHRV9URU5TCQkJICAgMHgwMQotI2RlZmluZSBSMl9JTl9SM19TRUxFQ1RfUEFHRV9VTklUUwkJCSAgIDB4MDIKLSNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX0hPVVJTX1RFTlMJCQkgICAweDAzCi0jZGVmaW5lIFIyX0lOX1IzX1NFTEVDVF9IT1VSU19VTklUUwkJCSAgIDB4MDQKLSNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX01JTlVURVNfVEVOUwkJCSAgIDB4MDUKLSNkZWZpbmUgUjJfSU5fUjNfU0VMRUNUX01JTlVURVNfVU5JVFMJCQkgICAweDA2Ci0KLSNkZWZpbmUgUjJfREFVXzAJCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjJfREFVXzEJCQkJCSAgIDB4MTAKLSNkZWZpbmUgUjJfREFVXzIJCQkJCSAgIDB4MjAKLSNkZWZpbmUgUjJfREFVXzMJCQkJCSAgIDB4MzAKLQotI2RlZmluZSBSMl9CQU5LXzAJCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjJfQkFOSyAxCQkJCQkgICAweDQwCi0KLSNkZWZpbmUgUjJfSEFNTUlOR19DSEVDS19PTgkJCQkgICAweDgwCi0jZGVmaW5lIFIyX0hBTU1JTkdfQ0hFQ0tfT0ZGCQkJCSAgIDB4MDAKLQotLyogUmVnaXN0ZXIgUjMgKFBhZ2UgcmVxdWVzdCBkYXRhKSAqLwotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzAJCQkJICAgMHgwMAotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzEJCQkJICAgMHgwMQotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzIJCQkJICAgMHgwMgotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzMJCQkJICAgMHgwMwotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzQJCQkJICAgMHgwNAotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzUJCQkJICAgMHgwNQotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzYJCQkJICAgMHgwNgotI2RlZmluZSBSM19QQUdFX0hVTkRSRURTXzcJCQkJICAgMHgwNwotCi0jZGVmaW5lIFIzX0hPTERfUEFHRQkJCQkJICAgMHgwMAotI2RlZmluZSBSM19VUERBVEVfUEFHRQkJCQkJICAgMHgwOAotCi0jZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCi0jZGVmaW5lIFIzX1BBR0VfSFVORFJFRFNfRE9fQ0FSRQkJCSAgIDB4MTAKLQotI2RlZmluZSBSM19QQUdFX1RFTlNfRE9fTk9UX0NBUkUJCQkgICAweDAwCi0jZGVmaW5lIFIzX1BBR0VfVEVOU19ET19DQVJFCQkJCSAgIDB4MTAKLQotI2RlZmluZSBSM19QQUdFX1VOSVRTX0RPX05PVF9DQVJFCQkJICAgMHgwMAotI2RlZmluZSBSM19QQUdFX1VOSVRTX0RPX0NBUkUJCQkJICAgMHgxMAotCi0jZGVmaW5lIFIzX0hPVVJTX1RFTlNfRE9fTk9UX0NBUkUJCQkgICAweDAwCi0jZGVmaW5lIFIzX0hPVVJTX1RFTlNfRE9fQ0FSRQkJCQkgICAweDEwCi0KLSNkZWZpbmUgUjNfSE9VUlNfVU5JVFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCi0jZGVmaW5lIFIzX0hPVVJTX1VOSVRTX0RPX0NBUkUJCQkJICAgMHgxMAotCi0jZGVmaW5lIFIzX01JTlVURVNfVEVOU19ET19OT1RfQ0FSRQkJCSAgIDB4MDAKLSNkZWZpbmUgUjNfTUlOVVRFU19URU5TX0RPX0NBUkUJCQkJICAgMHgxMAotCi0jZGVmaW5lIFIzX01JTlVURVNfVU5JVFNfRE9fTk9UX0NBUkUJCQkgICAweDAwCi0jZGVmaW5lIFIzX01JTlVURVNfVU5JVFNfRE9fQ0FSRQkJCSAgIDB4MTAKLQotLyogUmVnaXN0ZXIgUjQgKERpc3BsYXkgY2hhcHRlcikgKi8KLSNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzAJCQkJICAgMHgwMAotI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfMQkJCQkgICAweDAxCi0jZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV8yCQkJCSAgIDB4MDIKLSNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzMJCQkJICAgMHgwMwotI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfNAkJCQkgICAweDA0Ci0jZGVmaW5lIFI0X0RJU1BMQVlfUEFHRV81CQkJCSAgIDB4MDUKLSNkZWZpbmUgUjRfRElTUExBWV9QQUdFXzYJCQkJICAgMHgwNgotI2RlZmluZSBSNF9ESVNQTEFZX1BBR0VfNwkJCQkgICAweDA3Ci0KLS8qIFJlZ2lzdGVyIFI1IChOb3JtYWwgZGlzcGxheSBjb250cm9sKSAqLwotI2RlZmluZSBSNV9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT0ZGCQkJICAgMHgwMAotI2RlZmluZSBSNV9QSUNUVVJFX0lOU0lERV9CT1hJTkdfT04JCQkgICAweDAxCi0KLSNkZWZpbmUgUjVfUElDVFVSRV9PVVRTSURFX0JPWElOR19PRkYJCQkgICAweDAwCi0jZGVmaW5lIFI1X1BJQ1RVUkVfT1VUU0lERV9CT1hJTkdfT04JCQkgICAweDAyCi0KLSNkZWZpbmUgUjVfVEVYVF9JTlNJREVfQk9YSU5HX09GRgkJCSAgIDB4MDAKLSNkZWZpbmUgUjVfVEVYVF9JTlNJREVfQk9YSU5HX09OCQkJICAgMHgwNAotCi0jZGVmaW5lIFI1X1RFWFRfT1VUU0lERV9CT1hJTkdfT0ZGCQkJICAgMHgwMAotI2RlZmluZSBSNV9URVhUX09VVFNJREVfQk9YSU5HX09OCQkJICAgMHgwOAotCi0jZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09GRgkJICAgMHgwMAotI2RlZmluZSBSNV9DT05UUkFTVF9SRURVQ1RJT05fSU5TSURFX0JPWElOR19PTgkJICAgMHgxMAotCi0jZGVmaW5lIFI1X0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PRkYJICAgMHgwMAotI2RlZmluZSBSNV9DT05UUkFTVF9SRURVQ1RJT05fT1VUU0lERV9CT1hJTkdfT04JCSAgIDB4MjAKLQotI2RlZmluZSBSNV9CQUNLR1JPVU5EX0NPTE9SX0lOU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCi0jZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PTgkJICAgMHg0MAotCi0jZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCi0jZGVmaW5lIFI1X0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT04JCSAgIDB4ODAKLQotLyogUmVnaXN0ZXIgUjYgKE5ld3NmbGFzaCBkaXNwbGF5KSAqLwotI2RlZmluZSBSNl9ORVdTRkxBU0hfUElDVFVSRV9JTlNJREVfQk9YSU5HX09GRgkJICAgMHgwMAotI2RlZmluZSBSNl9ORVdTRkxBU0hfUElDVFVSRV9JTlNJREVfQk9YSU5HX09OCQkgICAweDAxCi0KLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX1BJQ1RVUkVfT1VUU0lERV9CT1hJTkdfT0ZGCQkgICAweDAwCi0jZGVmaW5lIFI2X05FV1NGTEFTSF9QSUNUVVJFX09VVFNJREVfQk9YSU5HX09OCQkgICAweDAyCi0KLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX1RFWFRfSU5TSURFX0JPWElOR19PRkYJCSAgIDB4MDAKLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX1RFWFRfSU5TSURFX0JPWElOR19PTgkJICAgMHgwNAotCi0jZGVmaW5lIFI2X05FV1NGTEFTSF9URVhUX09VVFNJREVfQk9YSU5HX09GRgkJICAgMHgwMAotI2RlZmluZSBSNl9ORVdTRkxBU0hfVEVYVF9PVVRTSURFX0JPWElOR19PTgkJICAgMHgwOAotCi0jZGVmaW5lIFI2X05FV1NGTEFTSF9DT05UUkFTVF9SRURVQ1RJT05fSU5TSURFX0JPWElOR19PRkYgIDB4MDAKLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9JTlNJREVfQk9YSU5HX09OICAgMHgxMAotCi0jZGVmaW5lIFI2X05FV1NGTEFTSF9DT05UUkFTVF9SRURVQ1RJT05fT1VUU0lERV9CT1hJTkdfT0ZGIDB4MDAKLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX0NPTlRSQVNUX1JFRFVDVElPTl9PVVRTSURFX0JPWElOR19PTiAgMHgyMAotCi0jZGVmaW5lIFI2X05FV1NGTEFTSF9CQUNLR1JPVU5EX0NPTE9SX0lOU0lERV9CT1hJTkdfT0ZGICAgIDB4MDAKLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX0JBQ0tHUk9VTkRfQ09MT1JfSU5TSURFX0JPWElOR19PTgkgICAweDQwCi0KLSNkZWZpbmUgUjZfTkVXU0ZMQVNIX0JBQ0tHUk9VTkRfQ09MT1JfT1VUU0lERV9CT1hJTkdfT0ZGICAgMHgwMAotI2RlZmluZSBSNl9ORVdTRkxBU0hfQkFDS0dST1VORF9DT0xPUl9PVVRTSURFX0JPWElOR19PTiAgICAweDgwCi0KLS8qIFJlZ2lzdGVyIFI3IChEaXNwbGF5IG1vZGUpICovCi0jZGVmaW5lIFI3X0JPWF9PRkZfUk9XXzAJCQkJICAgMHgwMAotI2RlZmluZSBSN19CT1hfT05fUk9XXzAJCQkJCSAgIDB4MDEKLQotI2RlZmluZSBSN19CT1hfT0ZGX1JPV18xX1RPXzIzCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjdfQk9YX09OX1JPV18xX1RPXzIzCQkJCSAgIDB4MDIKLQotI2RlZmluZSBSN19CT1hfT0ZGX1JPV18yNAkJCQkgICAweDAwCi0jZGVmaW5lIFI3X0JPWF9PTl9ST1dfMjQJCQkJICAgMHgwNAotCi0jZGVmaW5lIFI3X1NJTkdMRV9IRUlHSFQJCQkJICAgMHgwMAotI2RlZmluZSBSN19ET1VCTEVfSEVJR0hUCQkJCSAgIDB4MDgKLQotI2RlZmluZSBSN19UT1BfSEFMRgkJCQkJICAgMHgwMAotI2RlZmluZSBSN19CT1RUT01fSEFMRgkJCQkJICAgMHgxMAotCi0jZGVmaW5lIFI3X1JFVkVBTF9PRkYJCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjdfUkVWRUFMX09OCQkJCQkgICAweDIwCi0KLSNkZWZpbmUgUjdfQ1VSU0VSX09GRgkJCQkJICAgMHgwMAotI2RlZmluZSBSN19DVVJTRVJfT04JCQkJCSAgIDB4NDAKLQotI2RlZmluZSBSN19TVEFUVVNfQk9UVE9NCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjdfU1RBVFVTX1RPUAkJCQkJICAgMHg4MAotCi0vKiBSZWdpc3RlciBSOCAoQWN0aXZlIGNoYXB0ZXIpICovCi0jZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzAJCQkJICAgMHgwMAotI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl8xCQkJCSAgIDB4MDEKLSNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfMgkJCQkgICAweDAyCi0jZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzMJCQkJICAgMHgwMwotI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl80CQkJCSAgIDB4MDQKLSNkZWZpbmUgUjhfQUNUSVZFX0NIQVBURVJfNQkJCQkgICAweDA1Ci0jZGVmaW5lIFI4X0FDVElWRV9DSEFQVEVSXzYJCQkJICAgMHgwNgotI2RlZmluZSBSOF9BQ1RJVkVfQ0hBUFRFUl83CQkJCSAgIDB4MDcKLQotI2RlZmluZSBSOF9DTEVBUl9NRU1PUlkJCQkJCSAgIDB4MDgKLSNkZWZpbmUgUjhfRE9fTk9UX0NMRUFSX01FTU9SWQkJCQkgICAweDAwCi0KLS8qIFJlZ2lzdGVyIFI5IChDdXJzZXIgcm93KSAqLwotI2RlZmluZSBSOV9DVVJTRVJfUk9XXzAJCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjlfQ1VSU0VSX1JPV18xCQkJCQkgICAweDAxCi0jZGVmaW5lIFI5X0NVUlNFUl9ST1dfMgkJCQkJICAgMHgwMgotI2RlZmluZSBSOV9DVVJTRVJfUk9XXzI1CQkJCSAgIDB4MTkKLQotLyogUmVnaXN0ZXIgUjEwIChDdXJzZXIgY29sdW1uKSAqLwotI2RlZmluZSBSMTBfQ1VSU0VSX0NPTFVNTl8wCQkJCSAgIDB4MDAKLSNkZWZpbmUgUjEwX0NVUlNFUl9DT0xVTU5fNgkJCQkgICAweDA2Ci0jZGVmaW5lIFIxMF9DVVJTRVJfQ09MVU1OXzgJCQkJICAgMHgwOAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSb3cgMjUgY29udHJvbCBkYXRhIGluIGNvbHVtbiAwIHRvIDkJCQkJCSAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUk9XMjVfQ09MVU1OMF9QQUdFX1VOSVRTCQkJICAgMHgwRgotCi0jZGVmaW5lIFJPVzI1X0NPTFVNTjFfUEFHRV9URU5TCQkJCSAgIDB4MEYKLQotI2RlZmluZSBST1cyNV9DT0xVTU4yX01JTlVURVNfVU5JVFMJCQkgICAweDBGCi0KLSNkZWZpbmUgUk9XMjVfQ09MVU1OM19NSU5VVEVTX1RFTlMJCQkgICAweDA3Ci0jZGVmaW5lIFJPVzI1X0NPTFVNTjNfREVMRVRFX1BBR0UJCQkgICAweDA4Ci0KLSNkZWZpbmUgUk9XMjVfQ09MVU1ONF9IT1VSX1VOSVRTCQkJICAgMHgwRgotCi0jZGVmaW5lIFJPVzI1X0NPTFVNTjVfSE9VUl9URU5TCQkJCSAgIDB4MDMKLSNkZWZpbmUgUk9XMjVfQ09MVU1ONV9JTlNFUlRfSEVBRExJTkUJCQkgICAweDA0Ci0jZGVmaW5lIFJPVzI1X0NPTFVNTjVfSU5TRVJUX1NVQlRJVExFCQkJICAgMHgwOAotCi0jZGVmaW5lIFJPVzI1X0NPTFVNTjZfU1VQUFJFU1NfSEVBREVSCQkJICAgMHgwMQotI2RlZmluZSBST1cyNV9DT0xVTU42X1VQREFURV9QQUdFCQkJICAgMHgwMgotI2RlZmluZSBST1cyNV9DT0xVTU42X0lOVEVSUlVQVEVEX1NFUVVFTkNFCQkgICAweDA0Ci0jZGVmaW5lIFJPVzI1X0NPTFVNTjZfU1VQUFJFU1NfRElTUExBWQkJCSAgIDB4MDgKLQotI2RlZmluZSBST1cyNV9DT0xVTU43X1NFUklBTF9NT0RFCQkJICAgMHgwMQotI2RlZmluZSBST1cyNV9DT0xVTU43X0NIQVJBQ1RFUl9TRVQJCQkgICAweDBFCi0KLSNkZWZpbmUgUk9XMjVfQ09MVU1OOF9QQUdFX0hVTkRSRURTCQkJICAgMHgwNwotI2RlZmluZSBST1cyNV9DT0xVTU44X1BBR0VfTk9UX0ZPVU5ECQkJICAgMHgxMAotCi0jZGVmaW5lIFJPVzI1X0NPTFVNTjlfUEFHRV9CRUlOR19MT09LRURfRk9SCQkgICAweDIwCi0KLSNkZWZpbmUgUk9XMjVfQ09MVU1OMF9UT183X0hBTU1JTkdfRVJST1IJCSAgIDB4MTAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSGVscGVyIG1hY3JvcyBmb3IgZXh0cmFjdGluZyBwYWdlLCBob3VyIGFuZCBtaW51dGUgZGlnaXRzCQkgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBCWVRFX1BPUyAgMCBpcyBhdCByb3cgMCwgY29sdW1uIDAsCi0gICBCWVRFX1BPUyAgMSBpcyBhdCByb3cgMCwgY29sdW1uIDEsCi0gICBCWVRFX1BPUyA0MCBpcyBhdCByb3cgMSwgY29sdW1uIDAsICh3aXRoIE5VTV9ST1dTX1BFUl9QQUdFID0gNDApCi0gICBCWVRFX1BPUyA0MSBpcyBhdCByb3cgMSwgY29sdW1uIDEsICh3aXRoIE5VTV9ST1dTX1BFUl9QQUdFID0gNDApLAotICAgLi4uICovCi0jZGVmaW5lIFJPVyhCWVRFX1BPUykgICAgKEJZVEVfUE9TIC8gTlVNX1JPV1NfUEVSX1BBR0UpCi0jZGVmaW5lIENPTFVNTihCWVRFX1BPUykgKEJZVEVfUE9TICUgTlVNX1JPV1NfUEVSX1BBR0UpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhlbHBlciBtYWNyb3MgZm9yIGV4dHJhY3RpbmcgcGFnZSwgaG91ciBhbmQgbWludXRlIGRpZ2l0cwkJICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIGh1bmRyZWRzLCB0ZW5zIGFuZCB1bml0cyBvZiBhIHBhZ2UgbnVtYmVyIHdoaWNoCi0gICBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiAweDc5OS4KLSAgIE5vdGUgdGhhdCBwYWdlIGlzIGNvZGVkIGluIGhleGFkZWNpbWFsLCBpLmUuIDB4MTIzIG1lYW5zIHBhZ2UgMTIzLgotICAgcGFnZSAweC4uIG1lYW5zIHBhZ2UgOC4uICovCi0jZGVmaW5lIEhVTkRSRURTX09GX1BBR0UocGFnZSkgKCgocGFnZSkgLyAweDEwMCkgJiAweDcpCi0jZGVmaW5lIFRFTlNfT0ZfUEFHRShwYWdlKSAgICAgKCgocGFnZSkgLyAweDEwKSAgJiAweEYpCi0jZGVmaW5lIFVOSVRTX09GX1BBR0UocGFnZSkgICAgICgocGFnZSkgJiAweEYpCi0KLS8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0ZW5zIGFuZCB1bml0cyBvZiBhIGhvdXIgaW5mb3JtYXRpb24gd2hpY2gKLSAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4uIDB4MjQuCi0gICBOb3RlIHRoYXQgaG91ciBpcyBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS5lLiAweDEyIG1lYW5zIDEyIGhvdXJzICovCi0jZGVmaW5lIFRFTlNfT0ZfSE9VUihob3VyKSAgKChob3VyKSAvIDB4MTApCi0jZGVmaW5lIFVOSVRTX09GX0hPVVIoaG91cikgKChob3VyKSAmIDB4RikKLQotLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIHRlbnMgYW5kIHVuaXRzIG9mIGEgbWludXRlIGluZm9ybWF0aW9uIHdoaWNoCi0gICBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uLiAweDU5LgotICAgTm90ZSB0aGF0IG1pbnV0ZSBpcyBjb2RlZCBpbiBoZXhhZGVjaW1hbCwgaS5lLiAweDEyIG1lYW5zIDEyIG1pbnV0ZXMgKi8KLSNkZWZpbmUgVEVOU19PRl9NSU5VVEUobWludXRlKSAgKChtaW51dGUpIC8gMHgxMCkKLSNkZWZpbmUgVU5JVFNfT0ZfTUlOVVRFKG1pbnV0ZSkgKChtaW51dGUpICYgMHhGKQotCi0jZGVmaW5lIEhPVVJfTUFYICAgMHgyMwotI2RlZmluZSBNSU5VVEVfTUFYIDB4NTkKLSNkZWZpbmUgUEFHRV9NQVggICAweDhGRgotCi0jZW5kaWYgIC8qIF9fU0FBNTI0NkFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0OS5jCmluZGV4IDBkNjM5NzMuLjNiYjk1OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0OS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0OS5jCkBAIC0xNSw4ICsxNSw2IEBACiAgKgogICoJQ29weXJpZ2h0IChjKSAxOTk4IFJpY2hhcmQgR3VlbnRoZXIgPHJpY2hhcmQuZ3VlbnRoZXJAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlPgogICoKLSAqICRJZDogc2FhNTI0OS5jLHYgMS4xIDE5OTgvMDMvMzAgMjI6MjM6MjMgYWxhbiBFeHAgJAotICoKICAqCURlcml2ZWQgRnJvbQogICoKICAqIHZ0eC5jOgpAQCAtNDUsMzMgKzQzLDI4IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KIAotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgR2VuZyA8bGludXhATWljaGFlbEdlbmcuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgU0FBNTI0OSBUZWxldGV4dCBkZWNvZGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIFZUWF9WRVJfTUFKIDEKICNkZWZpbmUgVlRYX1ZFUl9NSU4gOAogCiAKLQogI2RlZmluZSBOVU1fREFVUyA0CiAjZGVmaW5lIE5VTV9CVUZTIDgKLSNkZWZpbmUgSUZfTkFNRSAiU0FBNTI0OSIKIAogc3RhdGljIGNvbnN0IGludCBkaXNwX21vZGVzWzhdWzNdID0KIHsKQEAgLTEwOSw2ICsxMDIsNyBAQAogCWludCBkaXNwX21vZGU7CiAJaW50IHZpcnR1YWxfbW9kZTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwogCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIApAQCAtMTIzLDEyNSArMTE3LDggQEAKIAogI2RlZmluZSBWVFhfREVWX01JTk9SIDAKIAotLyogR2VuZXJhbCBkZWZpbmVzIGFuZCBkZWJ1Z2dpbmcgc3VwcG9ydCAqLwotCi0jZGVmaW5lIFJFU0NIRUQgZG8geyBjb25kX3Jlc2NoZWQoKTsgfSB3aGlsZSgwKQotCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzYWFfdGVtcGxhdGU7CS8qIERlY2xhcmVkIG5lYXIgYm90dG9tICovCiAKLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gezM0Pj4xLEkyQ19DTElFTlRfRU5EfTsKLQotSTJDX0NMSUVOVF9JTlNNT0Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KLXN0YXRpYyBpbnQgc2FhNTI0OV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCi17Ci0JaW50IHBnYnVmOwotCWludCBlcnI7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZDsKLQlzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJzYWE1MjQ5OiB0ZWxldGV4dCBjaGlwIGZvdW5kLlxuIik7Ci0JY2xpZW50PWttYWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZihjbGllbnQ9PU5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLQljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7Ci0JbWVtY3B5KGNsaWVudCwgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKCpjbGllbnQpKTsKLQl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKLQlpZih0PT1OVUxMKQotCXsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBJRl9OQU1FLCBJMkNfTkFNRV9TSVpFKTsKLQltdXRleF9pbml0KCZ0LT5sb2NrKTsKLQotCS8qCi0JICoJTm93IGNyZWF0ZSBhIHZpZGVvNGxpbnV4IGRldmljZQotCSAqLwotCi0JdmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYodmQ9PU5VTEwpCi0JewotCQlrZnJlZSh0KTsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZkKTsKLQltZW1jcHkodmQsICZzYWFfdGVtcGxhdGUsIHNpemVvZigqdmQpKTsKLQotCWZvciAocGdidWYgPSAwOyBwZ2J1ZiA8IE5VTV9EQVVTOyBwZ2J1ZisrKQotCXsKLQkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7Ci0JCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKLQkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLmxhc3RzdGF0LCAwLCBzaXplb2YodC0+dmRhdVswXS5sYXN0c3RhdCkpOwotCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOwotCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7Ci0JCXQtPnZkYXVbcGdidWZdLnN0b3BwZWQgPSB0cnVlOwotCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7Ci0JfQotCXZkLT5wcml2PXQ7Ci0KLQotCS8qCi0JICoJUmVnaXN0ZXIgaXQKLQkgKi8KLQotCWlmKChlcnI9dmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkLCBWRkxfVFlQRV9WVFgsLTEpKTwwKQotCXsKLQkJa2ZyZWUodCk7Ci0JCWtmcmVlKHZkKTsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JdC0+Y2xpZW50ID0gY2xpZW50OwotCWkyY19hdHRhY2hfY2xpZW50KGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKglXZSBkbyBtb3N0IG9mIHRoZSBoYXJkIHdvcmsgd2hlbiB3ZSBiZWNvbWUgYSBkZXZpY2Ugb24gdGhlIGkyYy4KLSAqLwotCi1zdGF0aWMgaW50IHNhYTUyNDlfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCi0JCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgc2FhNTI0OV9hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhYTUyNDlfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkKTsKLQlrZnJlZSh2ZC0+cHJpdik7Ci0Ja2ZyZWUodmQpOwotCWtmcmVlKGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG5ldyBJMkMgZHJpdmVyIHN1cHBvcnQgKi8KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfdmlkZW90ZXh0ID0KLXsKLQkuZHJpdmVyID0gewotCQkubmFtZSAJPSBJRl9OQU1FLAkJLyogbmFtZSAqLwotCX0sCi0JLmlkIAkJPSBJMkNfRFJJVkVSSURfU0FBNTI0OSwgLyogaW4gaTJjLmggKi8KLQkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE1MjQ5X3Byb2JlLAotCS5kZXRhY2hfY2xpZW50ICA9IHNhYTUyNDlfZGV0YWNoLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKLQkuZHJpdmVyCQk9ICZpMmNfZHJpdmVyX3ZpZGVvdGV4dCwKLQkubmFtZQkJPSAiKHVuc2V0KSIsCi19OwotCiAvKgogICoJV2FpdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGppZmZpZXMgKDEwbXMpLiBUaGlzIGNhbGxzIHRoZSBzY2hlZHVsZXIsIHNvIHRoZSBhY3R1YWwKICAqCWRlbGF5IG1heSBiZSBsb25nZXIuCkBAIC0yNzUsNyArMTUyLDcgQEAKIAlidWZbMF0gPSByZWc7CiAJbWVtY3B5KGJ1ZisxLCBkYXRhLCBjb3VudCk7CiAKLQlpZihpMmNfbWFzdGVyX3NlbmQodC0+Y2xpZW50LCBidWYsIGNvdW50KzEpPT1jb3VudCsxKQorCWlmIChpMmNfbWFzdGVyX3NlbmQodC0+Y2xpZW50LCBidWYsIGNvdW50ICsgMSkgPT0gY291bnQgKyAxKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gLTE7CiB9CkBAIC0zMTcsMjQ2ICsxOTQsMjM2IEBACiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0YXRpYyBpbnQgdmlydHVhbF9tb2RlID0gZmFsc2U7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdD12ZC0+cHJpdjsKKwlzdHJ1Y3Qgc2FhNTI0OV9kZXZpY2UgKnQgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0Jc3dpdGNoKGNtZCkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVlRYSU9DR0VUSU5GTzoKIAl7Ci0JCWNhc2UgVlRYSU9DR0VUSU5GTzoKLQkJewotCQkJdnR4X2luZm9fdCAqaW5mbyA9IGFyZzsKLQkJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBWVFhfVkVSX01BSjsKLQkJCWluZm8tPnZlcnNpb25fbWlub3IgPSBWVFhfVkVSX01JTjsKLQkJCWluZm8tPm51bXBhZ2VzID0gTlVNX0RBVVM7Ci0JCQkvKmluZm8tPmNjdF90eXBlID0gQ0NUX1RZUEU7Ki8KLQkJCXJldHVybiAwOwotCQl9CisJCXZ0eF9pbmZvX3QgKmluZm8gPSBhcmc7CisJCWluZm8tPnZlcnNpb25fbWFqb3IgPSBWVFhfVkVSX01BSjsKKwkJaW5mby0+dmVyc2lvbl9taW5vciA9IFZUWF9WRVJfTUlOOworCQlpbmZvLT5udW1wYWdlcyA9IE5VTV9EQVVTOworCQkvKmluZm8tPmNjdF90eXBlID0gQ0NUX1RZUEU7Ki8KKwkJcmV0dXJuIDA7CisJfQogCi0JCWNhc2UgVlRYSU9DQ0xSUEFHRToKLQkJewotCQkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCWNhc2UgVlRYSU9DQ0xSUEFHRToKKwl7CisJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKIAotCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOwotCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IHRydWU7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQodC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiwgJyAnLCBzaXplb2YodC0+dmRhdVswXS5wZ2J1ZikpOworCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQogCi0JCWNhc2UgVlRYSU9DQ0xSRk9VTkQ6Ci0JCXsKLQkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKwljYXNlIFZUWElPQ0NMUkZPVU5EOgorCXsKKwkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOwogCi0JCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IHRydWU7CisJCXJldHVybiAwOworCX0KIAotCQljYXNlIFZUWElPQ1BBR0VSRVE6Ci0JCXsKLQkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKLQkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfUEFHRSkpCi0JCQkJcmVxLT5wYWdlID0gMDsKLQkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfSE9VUikpCi0JCQkJcmVxLT5ob3VyID0gMDsKLQkJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKLQkJCQlyZXEtPm1pbnV0ZSA9IDA7Ci0JCQlpZiAocmVxLT5wYWdlIDwgMCB8fCByZXEtPnBhZ2UgPiAweDhmZikgLyogN0ZGID8/ICovCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlyZXEtPnBhZ2UgJj0gMHg3ZmY7Ci0JCQlpZiAocmVxLT5ob3VyIDwgMCB8fCByZXEtPmhvdXIgPiAweDNmIHx8IHJlcS0+bWludXRlIDwgMCB8fCByZXEtPm1pbnV0ZSA+IDB4N2YgfHwKLQkJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMF0gPSAocmVxLT5wYWdlbWFzayAmIFBHX0hVTkQgPyAweDEwIDogMCkgfCAocmVxLT5wYWdlIC8gMHgxMDApOwotCQkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzJdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAmIDB4Zik7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzNdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9URU4gPyAweDEwIDogMCkgfCAocmVxLT5ob3VyIC8gMHgxMCk7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzVdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+bWludXRlIC8gMHgxMCk7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzZdID0gKHJlcS0+cGFnZW1hc2sgJiBNSU5fVU5JVCA/IDB4MTAgOiAwKSB8IChyZXEtPm1pbnV0ZSAmIDB4Zik7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBmYWxzZTsKLQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uY2xyZm91bmQgPSB0cnVlOwotCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gdHJ1ZTsKLQkJCXJldHVybiAwOwotCQl9CisJY2FzZSBWVFhJT0NQQUdFUkVROgorCXsKKwkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCQlpZiAoIShyZXEtPnBhZ2VtYXNrICYgUEdNQVNLX1BBR0UpKQorCQkJcmVxLT5wYWdlID0gMDsKKwkJaWYgKCEocmVxLT5wYWdlbWFzayAmIFBHTUFTS19IT1VSKSkKKwkJCXJlcS0+aG91ciA9IDA7CisJCWlmICghKHJlcS0+cGFnZW1hc2sgJiBQR01BU0tfTUlOVVRFKSkKKwkJCXJlcS0+bWludXRlID0gMDsKKwkJaWYgKHJlcS0+cGFnZSA8IDAgfHwgcmVxLT5wYWdlID4gMHg4ZmYpIC8qIDdGRiA/PyAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlcS0+cGFnZSAmPSAweDdmZjsKKwkJaWYgKHJlcS0+aG91ciA8IDAgfHwgcmVxLT5ob3VyID4gMHgzZiB8fCByZXEtPm1pbnV0ZSA8IDAgfHwgcmVxLT5taW51dGUgPiAweDdmIHx8CisJCQlyZXEtPnBhZ2VtYXNrIDwgMCB8fCByZXEtPnBhZ2VtYXNrID49IFBHTUFTS19NQVggfHwgcmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKKwkJCXJldHVybiAtRUlOVkFMOworCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzBdID0gKHJlcS0+cGFnZW1hc2sgJiBQR19IVU5EID8gMHgxMCA6IDApIHwgKHJlcS0+cGFnZSAvIDB4MTAwKTsKKwkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1sxXSA9IChyZXEtPnBhZ2VtYXNrICYgUEdfVEVOID8gMHgxMCA6IDApIHwgKChyZXEtPnBhZ2UgLyAweDEwKSAmIDB4Zik7CisJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMl0gPSAocmVxLT5wYWdlbWFzayAmIFBHX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5wYWdlICYgMHhmKTsKKwkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1szXSA9IChyZXEtPnBhZ2VtYXNrICYgSFJfVEVOID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAvIDB4MTApOworCQl0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzWzRdID0gKHJlcS0+cGFnZW1hc2sgJiBIUl9VTklUID8gMHgxMCA6IDApIHwgKHJlcS0+aG91ciAmIDB4Zik7CisJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbNV0gPSAocmVxLT5wYWdlbWFzayAmIE1JTl9URU4gPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgLyAweDEwKTsKKwkJdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1s2XSA9IChyZXEtPnBhZ2VtYXNrICYgTUlOX1VOSVQgPyAweDEwIDogMCkgfCAocmVxLT5taW51dGUgJiAweGYpOworCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSBmYWxzZTsKKwkJdC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCA9IHRydWU7CisJCXQtPmlzX3NlYXJjaGluZ1tyZXEtPnBnYnVmXSA9IHRydWU7CisJCXJldHVybiAwOworCX0KIAotCQljYXNlIFZUWElPQ0dFVFNUQVQ6Ci0JCXsKLQkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKLQkJCXU4IGluZm9iaXRzWzEwXTsKLQkJCXZ0eF9wYWdlaW5mb190IGluZm87Ci0JCQlpbnQgYTsKKwljYXNlIFZUWElPQ0dFVFNUQVQ6CisJeworCQl2dHhfcGFnZXJlcV90ICpyZXEgPSBhcmc7CisJCXU4IGluZm9iaXRzWzEwXTsKKwkJdnR4X3BhZ2VpbmZvX3QgaW5mbzsKKwkJaW50IGE7CiAKLQkJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKCF0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQpCi0JCQl7Ci0JCQkJaWYgKGkyY19zZW5kZGF0YSh0LCAyLCAwLCAtMSkgfHwKLQkJCQkJaTJjX3NlbmRidWYodCwgMywgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzKSB8fAotCQkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsIC0xKSB8fAotCQkJCQlpMmNfc2VuZGRhdGEodCwgMiwgMCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5zcmVnc1swXSB8IDgsIC0xKSB8fAotCQkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsIC0xKSkKKwkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQpIHsKKwkJCWlmIChpMmNfc2VuZGRhdGEodCwgMiwgMCwgLTEpIHx8CisJCQkJaTJjX3NlbmRidWYodCwgMywgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpLCB0LT52ZGF1W3JlcS0+cGdidWZdLnNyZWdzKSB8fAorCQkJCWkyY19zZW5kZGF0YSh0LCA4LCAwLCAyNSwgMCwgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgLTEpIHx8CisJCQkJaTJjX3NlbmRkYXRhKHQsIDIsIDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uc3JlZ3NbMF0gfCA4LCAtMSkgfHwKKwkJCQlpMmNfc2VuZGRhdGEodCwgOCwgMCwgMjUsIDAsIC0xKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWpkZWxheShQQUdFX1dBSVQpOworCQkJaWYgKGkyY19nZXRkYXRhKHQsIDEwLCBpbmZvYml0cykpCisJCQkJcmV0dXJuIC1FSU87CisKKwkJCWlmICghKGluZm9iaXRzWzhdICYgMHgxMCkgJiYgIShpbmZvYml0c1s3XSAmIDB4ZjApICYmCS8qIGNoZWNrIEZPVU5ELWJpdCAqLworCQkJCShtZW1jbXAoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpIHx8CisJCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSkpKQorCQkJewkJLyogY2hlY2sgaWYgbmV3IHBhZ2UgYXJyaXZlZCAqLworCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgMCwgLTEpIHx8CisJCQkJCWkyY19nZXRkYXRhKHQsIFZUWF9QQUdFU0laRSwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZikpCiAJCQkJCXJldHVybiAtRUlPOwotCQkJCWpkZWxheShQQUdFX1dBSVQpOwotCQkJCWlmIChpMmNfZ2V0ZGF0YSh0LCAxMCwgaW5mb2JpdHMpKQotCQkJCQlyZXR1cm4gLUVJTzsKLQotCQkJCWlmICghKGluZm9iaXRzWzhdICYgMHgxMCkgJiYgIShpbmZvYml0c1s3XSAmIDB4ZjApICYmCS8qIGNoZWNrIEZPVU5ELWJpdCAqLwotCQkJCQkobWVtY21wKGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKSB8fAotCQkJCQl0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0uZXhwaXJlKSkpCi0JCQkJewkJLyogY2hlY2sgaWYgbmV3IHBhZ2UgYXJyaXZlZCAqLwotCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIDAsIC0xKSB8fAotCQkJCQkJaTJjX2dldGRhdGEodCwgVlRYX1BBR0VTSVpFLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmKSkKKwkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmV4cGlyZSA9IGppZmZpZXMgKyBQR0JVRl9FWFBJUkU7CisJCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUsICcgJywgVlRYX1ZJUlRVQUxTSVpFIC0gVlRYX1BBR0VTSVpFKTsKKwkJCQlpZiAodC0+dmlydHVhbF9tb2RlKSB7CisJCQkJCS8qIFBhY2tldCBYLzI0ICovCisJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMCwgMCwgLTEpIHx8CisJCQkJCQlpMmNfZ2V0ZGF0YSh0LCA0MCwgdC0+dmRhdVtyZXEtPnBnYnVmXS5wZ2J1ZiArIFZUWF9QQUdFU0laRSArIDIwICogNDApKQogCQkJCQkJcmV0dXJuIC1FSU87Ci0JCQkJCXQtPnZkYXVbcmVxLT5wZ2J1Zl0uZXhwaXJlID0gamlmZmllcyArIFBHQlVGX0VYUElSRTsKLQkJCQkJbWVtc2V0KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUsICcgJywgVlRYX1ZJUlRVQUxTSVpFIC0gVlRYX1BBR0VTSVpFKTsKLQkJCQkJaWYgKHQtPnZpcnR1YWxfbW9kZSkKLQkJCQkJewotCQkJCQkJLyogUGFja2V0IFgvMjQgKi8KLQkJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMCwgMCwgLTEpIHx8Ci0JCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMCAqIDQwKSkKLQkJCQkJCQlyZXR1cm4gLUVJTzsKLQkJCQkJCS8qIFBhY2tldCBYLzI3LzAgKi8KLQkJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMSwgMCwgLTEpIHx8Ci0JCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAxNiAqIDQwKSkKLQkJCQkJCQlyZXR1cm4gLUVJTzsKLQkJCQkJCS8qIFBhY2tldCA4LzMwLzAuLi44LzMwLzE1Ci0JCQkJCQkgKiBGSVhNRTogQUZBSUssIHRoZSA1MjQ5IGRvZXMgaGFtbWluZy1kZWNvZGluZyBmb3Igc29tZSBieXRlcyBpbiBwYWNrZXQgOC8zMCwKLQkJCQkJCSAqICAgICAgICBzbyB3ZSBzaG91bGQgdW5kbyB0aGlzIGhlcmUuCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMHgyMiwgMCwgLTEpIHx8Ci0JCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMyAqIDQwKSkKLQkJCQkJCQlyZXR1cm4gLUVJTzsKLQkJCQkJfQotCQkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gZmFsc2U7Ci0JCQkJCW1lbWNweSh0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBpbmZvYml0cywgc2l6ZW9mKGluZm9iaXRzKSk7CisJCQkJCS8qIFBhY2tldCBYLzI3LzAgKi8KKwkJCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAweDIxLCAwLCAtMSkgfHwKKwkJCQkJCWkyY19nZXRkYXRhKHQsIDQwLCB0LT52ZGF1W3JlcS0+cGdidWZdLnBnYnVmICsgVlRYX1BBR0VTSVpFICsgMTYgKiA0MCkpCisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJLyogUGFja2V0IDgvMzAvMC4uLjgvMzAvMTUKKwkJCQkJICogRklYTUU6IEFGQUlLLCB0aGUgNTI0OSBkb2VzIGhhbW1pbmctZGVjb2RpbmcgZm9yIHNvbWUgYnl0ZXMgaW4gcGFja2V0IDgvMzAsCisJCQkJCSAqICAgICAgICBzbyB3ZSBzaG91bGQgdW5kbyB0aGlzIGhlcmUuCisJCQkJCSAqLworCQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDB4MjIsIDAsIC0xKSB8fAorCQkJCQkJaTJjX2dldGRhdGEodCwgNDAsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWYgKyBWVFhfUEFHRVNJWkUgKyAyMyAqIDQwKSkKKwkJCQkJCXJldHVybiAtRUlPOwogCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQltZW1jcHkoaW5mb2JpdHMsIHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIHNpemVvZihpbmZvYml0cykpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCQl0LT52ZGF1W3JlcS0+cGdidWZdLmNscmZvdW5kID0gZmFsc2U7CisJCQkJbWVtY3B5KHQtPnZkYXVbcmVxLT5wZ2J1Zl0ubGFzdHN0YXQsIGluZm9iaXRzLCBzaXplb2YoaW5mb2JpdHMpKTsKKwkJCX0gZWxzZSB7CiAJCQkJbWVtY3B5KGluZm9iaXRzLCB0LT52ZGF1W3JlcS0+cGdidWZdLmxhc3RzdGF0LCBzaXplb2YoaW5mb2JpdHMpKTsKIAkJCX0KLQotCQkJaW5mby5wYWdlbnVtID0gKChpbmZvYml0c1s4XSA8PCA4KSAmIDB4NzAwKSB8ICgoaW5mb2JpdHNbMV0gPDwgNCkgJiAweGYwKSB8IChpbmZvYml0c1swXSAmIDB4MGYpOwotCQkJaWYgKGluZm8ucGFnZW51bSA8IDB4MTAwKQotCQkJCWluZm8ucGFnZW51bSArPSAweDgwMDsKLQkJCWluZm8uaG91ciA9ICgoaW5mb2JpdHNbNV0gPDwgNCkgJiAweDMwKSB8IChpbmZvYml0c1s0XSAmIDB4MGYpOwotCQkJaW5mby5taW51dGUgPSAoKGluZm9iaXRzWzNdIDw8IDQpICYgMHg3MCkgfCAoaW5mb2JpdHNbMl0gJiAweDBmKTsKLQkJCWluZm8uY2hhcnNldCA9ICgoaW5mb2JpdHNbN10gPj4gMSkgJiA3KTsKLQkJCWluZm8uZGVsZXRlID0gISEoaW5mb2JpdHNbM10gJiA4KTsKLQkJCWluZm8uaGVhZGxpbmUgPSAhIShpbmZvYml0c1s1XSAmIDQpOwotCQkJaW5mby5zdWJ0aXRsZSA9ICEhKGluZm9iaXRzWzVdICYgOCk7Ci0JCQlpbmZvLnN1cHBfaGVhZGVyID0gISEoaW5mb2JpdHNbNl0gJiAxKTsKLQkJCWluZm8udXBkYXRlID0gISEoaW5mb2JpdHNbNl0gJiAyKTsKLQkJCWluZm8uaW50ZXJfc2VxID0gISEoaW5mb2JpdHNbNl0gJiA0KTsKLQkJCWluZm8uZGlzX2Rpc3AgPSAhIShpbmZvYml0c1s2XSAmIDgpOwotCQkJaW5mby5zZXJpYWwgPSAhIShpbmZvYml0c1s3XSAmIDEpOwotCQkJaW5mby5ub3Rmb3VuZCA9ICEhKGluZm9iaXRzWzhdICYgMHgxMCk7Ci0JCQlpbmZvLnBibGYgPSAhIShpbmZvYml0c1s5XSAmIDB4MjApOwotCQkJaW5mby5oYW1taW5nID0gMDsKLQkJCWZvciAoYSA9IDA7IGEgPD0gNzsgYSsrKQotCQkJewotCQkJCWlmIChpbmZvYml0c1thXSAmIDB4ZjApCi0JCQkJewotCQkJCQlpbmZvLmhhbW1pbmcgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCkKLQkJCQlpbmZvLm5vdGZvdW5kID0gMTsKLQkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJmluZm8sIHNpemVvZih2dHhfcGFnZWluZm9fdCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKCFpbmZvLmhhbW1pbmcgJiYgIWluZm8ubm90Zm91bmQpCi0JCQl7Ci0JCQkJdC0+aXNfc2VhcmNoaW5nW3JlcS0+cGdidWZdID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShpbmZvYml0cywgdC0+dmRhdVtyZXEtPnBnYnVmXS5sYXN0c3RhdCwgc2l6ZW9mKGluZm9iaXRzKSk7CiAJCX0KIAotCQljYXNlIFZUWElPQ0dFVFBBR0U6Ci0JCXsKLQkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKLQkJCWludCBzdGFydCwgZW5kOwotCi0JCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUyB8fCByZXEtPnN0YXJ0IDwgMCB8fAotCQkJCXJlcS0+c3RhcnQgPiByZXEtPmVuZCB8fCByZXEtPmVuZCA+PSAodmlydHVhbF9tb2RlID8gVlRYX1ZJUlRVQUxTSVpFIDogVlRYX1BBR0VTSVpFKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJnQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWZbcmVxLT5zdGFydF0sIHJlcS0+ZW5kIC0gcmVxLT5zdGFydCArIDEpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkgLyoKLQkJCSAgKglBbHdheXMgcmVhZCB0aGUgdGltZSBkaXJlY3RseSBmcm9tIFNBQTUyNDkKLQkJCSAgKi8KLQotCQkJaWYgKHJlcS0+c3RhcnQgPD0gMzkgJiYgcmVxLT5lbmQgPj0gMzIpCi0JCQl7Ci0JCQkJaW50IGxlbjsKLQkJCQljaGFyIGJ1ZlsxNl07Ci0JCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgMzIpOwotCQkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzkpOwotCQkJCWxlbj1lbmQtc3RhcnQrMTsKLQkJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIHN0YXJ0LCAtMSkgfHwKLQkJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQotCQkJCQlyZXR1cm4gLUVJTzsKLQkJCQlpZihjb3B5X3RvX3VzZXIocmVxLT5idWZmZXIrc3RhcnQtcmVxLT5zdGFydCwgYnVmLCBsZW4pKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaW5mby5wYWdlbnVtID0gKChpbmZvYml0c1s4XSA8PCA4KSAmIDB4NzAwKSB8ICgoaW5mb2JpdHNbMV0gPDwgNCkgJiAweGYwKSB8IChpbmZvYml0c1swXSAmIDB4MGYpOworCQlpZiAoaW5mby5wYWdlbnVtIDwgMHgxMDApCisJCQlpbmZvLnBhZ2VudW0gKz0gMHg4MDA7CisJCWluZm8uaG91ciA9ICgoaW5mb2JpdHNbNV0gPDwgNCkgJiAweDMwKSB8IChpbmZvYml0c1s0XSAmIDB4MGYpOworCQlpbmZvLm1pbnV0ZSA9ICgoaW5mb2JpdHNbM10gPDwgNCkgJiAweDcwKSB8IChpbmZvYml0c1syXSAmIDB4MGYpOworCQlpbmZvLmNoYXJzZXQgPSAoKGluZm9iaXRzWzddID4+IDEpICYgNyk7CisJCWluZm8uZGVsZXRlID0gISEoaW5mb2JpdHNbM10gJiA4KTsKKwkJaW5mby5oZWFkbGluZSA9ICEhKGluZm9iaXRzWzVdICYgNCk7CisJCWluZm8uc3VidGl0bGUgPSAhIShpbmZvYml0c1s1XSAmIDgpOworCQlpbmZvLnN1cHBfaGVhZGVyID0gISEoaW5mb2JpdHNbNl0gJiAxKTsKKwkJaW5mby51cGRhdGUgPSAhIShpbmZvYml0c1s2XSAmIDIpOworCQlpbmZvLmludGVyX3NlcSA9ICEhKGluZm9iaXRzWzZdICYgNCk7CisJCWluZm8uZGlzX2Rpc3AgPSAhIShpbmZvYml0c1s2XSAmIDgpOworCQlpbmZvLnNlcmlhbCA9ICEhKGluZm9iaXRzWzddICYgMSk7CisJCWluZm8ubm90Zm91bmQgPSAhIShpbmZvYml0c1s4XSAmIDB4MTApOworCQlpbmZvLnBibGYgPSAhIShpbmZvYml0c1s5XSAmIDB4MjApOworCQlpbmZvLmhhbW1pbmcgPSAwOworCQlmb3IgKGEgPSAwOyBhIDw9IDc7IGErKykgeworCQkJaWYgKGluZm9iaXRzW2FdICYgMHhmMCkgeworCQkJCWluZm8uaGFtbWluZyA9IDE7CisJCQkJYnJlYWs7CiAJCQl9Ci0JCQkvKiBJbnNlcnQgdGhlIGN1cnJlbnQgaGVhZGVyIGlmIERBVSBpcyBzdGlsbCBzZWFyY2hpbmcgZm9yIGEgcGFnZSAqLwotCQkJaWYgKHJlcS0+c3RhcnQgPD0gMzEgJiYgcmVxLT5lbmQgPj0gNyAmJiB0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0pCi0JCQl7Ci0JCQkJY2hhciBidWZbMzJdOwotCQkJCWludCBsZW47Ci0JCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgNyk7Ci0JCQkJZW5kID0gbWluKHJlcS0+ZW5kLCAzMSk7Ci0JCQkJbGVuPWVuZC1zdGFydCsxOwotCQkJCWlmIChpMmNfc2VuZGRhdGEodCwgOCwgMCwgMCwgc3RhcnQsIC0xKSB8fAotCQkJCQlpMmNfZ2V0ZGF0YSh0LCBsZW4sIGJ1ZikpCi0JCQkJCXJldHVybiAtRUlPOwotCQkJCWlmKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlcitzdGFydC1yZXEtPnN0YXJ0LCBidWYsIGxlbikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJcmV0dXJuIDA7CiAJCX0KLQotCQljYXNlIFZUWElPQ1NUT1BEQVU6Ci0JCXsKLQkJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKLQotCQkJaWYgKHJlcS0+cGdidWYgPCAwIHx8IHJlcS0+cGdidWYgPj0gTlVNX0RBVVMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSB0cnVlOworCQlpZiAodC0+dmRhdVtyZXEtPnBnYnVmXS5jbHJmb3VuZCkKKwkJCWluZm8ubm90Zm91bmQgPSAxOworCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyLCAmaW5mbywgc2l6ZW9mKHZ0eF9wYWdlaW5mb190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCFpbmZvLmhhbW1pbmcgJiYgIWluZm8ubm90Zm91bmQpCiAJCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBmYWxzZTsKLQkJCXJldHVybiAwOwotCQl9CisJCXJldHVybiAwOworCX0KIAotCQljYXNlIFZUWElPQ1BVVFBBR0U6Ci0JCWNhc2UgVlRYSU9DU0VURElTUDoKLQkJY2FzZSBWVFhJT0NQVVRTVEFUOgotCQkJcmV0dXJuIDA7CisJY2FzZSBWVFhJT0NHRVRQQUdFOgorCXsKKwkJdnR4X3BhZ2VyZXFfdCAqcmVxID0gYXJnOworCQlpbnQgc3RhcnQsIGVuZDsKIAotCQljYXNlIFZUWElPQ0NMUkNBQ0hFOgotCQl7Ci0JCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDAsIE5VTV9EQVVTLCAwLCA4LCAtMSkgfHwgaTJjX3NlbmRkYXRhKHQsIDExLAotCQkJCScgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLAotCQkJCScgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCcgJywnICcsJyAnLCAtMSkpCisJCWlmIChyZXEtPnBnYnVmIDwgMCB8fCByZXEtPnBnYnVmID49IE5VTV9EQVVTIHx8IHJlcS0+c3RhcnQgPCAwIHx8CisJCQlyZXEtPnN0YXJ0ID4gcmVxLT5lbmQgfHwgcmVxLT5lbmQgPj0gKHZpcnR1YWxfbW9kZSA/IFZUWF9WSVJUVUFMU0laRSA6IFZUWF9QQUdFU0laRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciwgJnQtPnZkYXVbcmVxLT5wZ2J1Zl0ucGdidWZbcmVxLT5zdGFydF0sIHJlcS0+ZW5kIC0gcmVxLT5zdGFydCArIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJIC8qCisJCSAgKglBbHdheXMgcmVhZCB0aGUgdGltZSBkaXJlY3RseSBmcm9tIFNBQTUyNDkKKwkJICAqLworCisJCWlmIChyZXEtPnN0YXJ0IDw9IDM5ICYmIHJlcS0+ZW5kID49IDMyKSB7CisJCQlpbnQgbGVuOworCQkJY2hhciBidWZbMTZdOworCQkJc3RhcnQgPSBtYXgocmVxLT5zdGFydCwgMzIpOworCQkJZW5kID0gbWluKHJlcS0+ZW5kLCAzOSk7CisJCQlsZW4gPSBlbmQgLSBzdGFydCArIDE7CisJCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDgsIDAsIDAsIHN0YXJ0LCAtMSkgfHwKKwkJCQlpMmNfZ2V0ZGF0YSh0LCBsZW4sIGJ1ZikpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoaTJjX3NlbmRkYXRhKHQsIDMsIDB4MjAsIC0xKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWpkZWxheSgxMCAqIENMRUFSX0RFTEFZKTsJCQkvKiBJIGhhdmUgbm8gaWRlYSBob3cgbG9uZyB3ZSBoYXZlIHRvIHdhaXQgaGVyZSAqLwotCQkJcmV0dXJuIDA7CisJCQlpZiAoY29weV90b191c2VyKHJlcS0+YnVmZmVyICsgc3RhcnQgLSByZXEtPnN0YXJ0LCBidWYsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KKwkJLyogSW5zZXJ0IHRoZSBjdXJyZW50IGhlYWRlciBpZiBEQVUgaXMgc3RpbGwgc2VhcmNoaW5nIGZvciBhIHBhZ2UgKi8KKwkJaWYgKHJlcS0+c3RhcnQgPD0gMzEgJiYgcmVxLT5lbmQgPj0gNyAmJiB0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0pIHsKKwkJCWNoYXIgYnVmWzMyXTsKKwkJCWludCBsZW47CiAKLQkJY2FzZSBWVFhJT0NTRVRWSVJUOgotCQl7Ci0JCQkvKiBUaGUgU0FBNTI0OSBoYXMgdmlydHVhbC1yb3cgcmVjZXB0aW9uIHR1cm5lZCBvbiBhbHdheXMgKi8KLQkJCXQtPnZpcnR1YWxfbW9kZSA9IChpbnQpKGxvbmcpYXJnOwotCQkJcmV0dXJuIDA7CisJCQlzdGFydCA9IG1heChyZXEtPnN0YXJ0LCA3KTsKKwkJCWVuZCA9IG1pbihyZXEtPmVuZCwgMzEpOworCQkJbGVuID0gZW5kIC0gc3RhcnQgKyAxOworCQkJaWYgKGkyY19zZW5kZGF0YSh0LCA4LCAwLCAwLCBzdGFydCwgLTEpIHx8CisJCQkJaTJjX2dldGRhdGEodCwgbGVuLCBidWYpKQorCQkJCXJldHVybiAtRUlPOworCQkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmJ1ZmZlciArIHN0YXJ0IC0gcmVxLT5zdGFydCwgYnVmLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQl9CisJCXJldHVybiAwOworCX0KKworCWNhc2UgVlRYSU9DU1RPUERBVToKKwl7CisJCXZ0eF9wYWdlcmVxX3QgKnJlcSA9IGFyZzsKKworCQlpZiAocmVxLT5wZ2J1ZiA8IDAgfHwgcmVxLT5wZ2J1ZiA+PSBOVU1fREFVUykKKwkJCXJldHVybiAtRUlOVkFMOworCQl0LT52ZGF1W3JlcS0+cGdidWZdLnN0b3BwZWQgPSB0cnVlOworCQl0LT5pc19zZWFyY2hpbmdbcmVxLT5wZ2J1Zl0gPSBmYWxzZTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWVFhJT0NQVVRQQUdFOgorCWNhc2UgVlRYSU9DU0VURElTUDoKKwljYXNlIFZUWElPQ1BVVFNUQVQ6CisJCXJldHVybiAwOworCisJY2FzZSBWVFhJT0NDTFJDQUNIRToKKwl7CisJCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgTlVNX0RBVVMsIDAsIDgsIC0xKSB8fCBpMmNfc2VuZGRhdGEodCwgMTEsCisJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAorCQkJJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKKwkJCScgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsCisJCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLAorCQkJLTEpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChpMmNfc2VuZGRhdGEodCwgMywgMHgyMCwgLTEpKQorCQkJcmV0dXJuIC1FSU87CisJCWpkZWxheSgxMCAqIENMRUFSX0RFTEFZKTsJCQkvKiBJIGhhdmUgbm8gaWRlYSBob3cgbG9uZyB3ZSBoYXZlIHRvIHdhaXQgaGVyZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZUWElPQ1NFVFZJUlQ6CisJeworCQkvKiBUaGUgU0FBNTI0OSBoYXMgdmlydHVhbC1yb3cgcmVjZXB0aW9uIHR1cm5lZCBvbiBhbHdheXMgKi8KKwkJdC0+dmlydHVhbF9tb2RlID0gKGludCkobG9uZylhcmc7CisJCXJldHVybiAwOworCX0KIAl9CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC02MTYsOCArNDgzLDcgQEAKIHN0YXRpYyBpbnQgc2FhNTI0OV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0PXZkLT5wcml2OworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGVycjsKIAogCWNtZCA9IHZ0eF9maXhfY29tbWFuZChjbWQpOwpAQCAtNjI5LDMyICs0OTUsMjcgQEAKIAogc3RhdGljIGludCBzYWE1MjQ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdD12ZC0+cHJpdjsKLQlpbnQgZXJyLHBnYnVmOworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJaW50IHBnYnVmOwogCi0JZXJyID0gdmlkZW9fZXhjbHVzaXZlX29wZW4oaW5vZGUsZmlsZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKHQtPmNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICh0LT5jbGllbnQ9PU5VTEwpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdC0+aW5fdXNlKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChpMmNfc2VuZGRhdGEodCwgMCwgMCwgLTEpIHx8CQkvKiBTZWxlY3QgUjExICovCi0JCQkJCQkvKiBUdXJuIG9mZiBwYXJpdHkgY2hlY2tzICh3ZSBkbyB0aGlzIG91cnNlbHZlcykgKi8KKwlpZiAoaTJjX3NlbmRkYXRhKHQsIDAsIDAsIC0xKSB8fCAvKiBTZWxlY3QgUjExICovCisJCS8qIFR1cm4gb2ZmIHBhcml0eSBjaGVja3MgKHdlIGRvIHRoaXMgb3Vyc2VsdmVzKSAqLwogCQlpMmNfc2VuZGRhdGEodCwgMSwgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzBdLCAwLCAtMSkgfHwKLQkJCQkJCS8qIERpc3BsYXkgVFYtcGljdHVyZSwgbm8gdmlydHVhbCByb3dzICovCi0JCWkyY19zZW5kZGF0YSh0LCA0LCBOVU1fREFVUywgZGlzcF9tb2Rlc1t0LT5kaXNwX21vZGVdWzFdLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMl0sIDcsIC0xKSkgLyogU2V0IGRpc3BsYXkgdG8gcGFnZSA0ICovCi0KKwkJLyogRGlzcGxheSBUVi1waWN0dXJlLCBubyB2aXJ0dWFsIHJvd3MgKi8KKwkJaTJjX3NlbmRkYXRhKHQsIDQsIE5VTV9EQVVTLCBkaXNwX21vZGVzW3QtPmRpc3BfbW9kZV1bMV0sIGRpc3BfbW9kZXNbdC0+ZGlzcF9tb2RlXVsyXSwgNywgLTEpKQorCQkvKiBTZXQgZGlzcGxheSB0byBwYWdlIDQgKi8KIAl7Ci0JCWVyciA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKKwkJY2xlYXJfYml0KDAsICZ0LT5pbl91c2UpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlmb3IgKHBnYnVmID0gMDsgcGdidWYgPCBOVU1fREFVUzsgcGdidWYrKykKLQl7CisJZm9yIChwZ2J1ZiA9IDA7IHBnYnVmIDwgTlVNX0RBVVM7IHBnYnVmKyspIHsKIAkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CiAJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKIAkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLmxhc3RzdGF0LCAwLCBzaXplb2YodC0+dmRhdVswXS5sYXN0c3RhdCkpOwpAQCAtNjY1LDM5ICs1MjYsMjAgQEAKIAl9CiAJdC0+dmlydHVhbF9tb2RlID0gZmFsc2U7CiAJcmV0dXJuIDA7Ci0KLSBmYWlsOgotCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLGZpbGUpOwotCXJldHVybiBlcnI7CiB9CiAKIAogCiBzdGF0aWMgaW50IHNhYTUyNDlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0PXZkLT5wcml2OworCXN0cnVjdCBzYWE1MjQ5X2RldmljZSAqdCA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKIAlpMmNfc2VuZGRhdGEodCwgMSwgMHgyMCwgLTEpOwkJLyogVHVybiBvZmYgQ0NUICovCiAJaTJjX3NlbmRkYXRhKHQsIDUsIDMsIDMsIC0xKTsJCS8qIFR1cm4gb2ZmIFRWLWRpc3BsYXkgKi8KLQl2aWRlb19leGNsdXNpdmVfcmVsZWFzZShpbm9kZSxmaWxlKTsKKwljbGVhcl9iaXQoMCwgJnQtPmluX3VzZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfc2FhXzUyNDkgKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU0FBNTI0OSBkcml2ZXIgKCIgSUZfTkFNRSAiIGludGVyZmFjZSkgZm9yIFZpZGVvVGV4dCB2ZXJzaW9uICVkLiVkXG4iLAotCQkJVlRYX1ZFUl9NQUosIFZUWF9WRVJfTUlOKTsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmkyY19kcml2ZXJfdmlkZW90ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc2FhXzUyNDkgKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfdmlkZW90ZXh0KTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9zYWFfNTI0OSk7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX3NhYV81MjQ5KTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2FhX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IHNhYTUyNDlfb3BlbiwKQEAgLTcxMSw4ICs1NTMsODQgQEAKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc2FhX3RlbXBsYXRlID0KIHsKLQkubmFtZQkJPSBJRl9OQU1FLAorCS5uYW1lCQk9ICJzYWE1MjQ5IiwKIAkuZm9wcyAgICAgICAgICAgPSAmc2FhX2ZvcHMsCisJLnJlbGVhc2UgCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCiB9OwogCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMiA+PiAxLCBJMkNfQ0xJRU5UX0VORCB9OworCitJMkNfQ0xJRU5UX0lOU01PRDsKKworc3RhdGljIGludCBzYWE1MjQ5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHBnYnVmOworCWludCBlcnI7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CisJc3RydWN0IHNhYTUyNDlfZGV2aWNlICp0OworCisJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwKKwkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOworCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvVGV4dCB2ZXJzaW9uICVkLiVkXG4iLAorCQkJVlRYX1ZFUl9NQUosIFZUWF9WRVJfTUlOKTsKKwl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAodCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltdXRleF9pbml0KCZ0LT5sb2NrKTsKKworCS8qIE5vdyBjcmVhdGUgYSB2aWRlbzRsaW51eCBkZXZpY2UgKi8KKwl2ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodmQgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdmQpOworCW1lbWNweSh2ZCwgJnNhYV90ZW1wbGF0ZSwgc2l6ZW9mKCp2ZCkpOworCisJZm9yIChwZ2J1ZiA9IDA7IHBnYnVmIDwgTlVNX0RBVVM7IHBnYnVmKyspIHsKKwkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLnBnYnVmLCAnICcsIHNpemVvZih0LT52ZGF1WzBdLnBnYnVmKSk7CisJCW1lbXNldCh0LT52ZGF1W3BnYnVmXS5zcmVncywgMCwgc2l6ZW9mKHQtPnZkYXVbMF0uc3JlZ3MpKTsKKwkJbWVtc2V0KHQtPnZkYXVbcGdidWZdLmxhc3RzdGF0LCAwLCBzaXplb2YodC0+dmRhdVswXS5sYXN0c3RhdCkpOworCQl0LT52ZGF1W3BnYnVmXS5leHBpcmUgPSAwOworCQl0LT52ZGF1W3BnYnVmXS5jbHJmb3VuZCA9IHRydWU7CisJCXQtPnZkYXVbcGdidWZdLnN0b3BwZWQgPSB0cnVlOworCQl0LT5pc19zZWFyY2hpbmdbcGdidWZdID0gZmFsc2U7CisJfQorCXZpZGVvX3NldF9kcnZkYXRhKHZkLCB0KTsKKworCS8qIFJlZ2lzdGVyIGl0ICovCisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkLCBWRkxfVFlQRV9WVFgsIC0xKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZSh0KTsKKwkJa2ZyZWUodmQpOworCQlyZXR1cm4gZXJyOworCX0KKwl0LT5jbGllbnQgPSBjbGllbnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FhNTI0OV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmQpOworCWtmcmVlKHZpZGVvX2dldF9kcnZkYXRhKHZkKSk7CisJa2ZyZWUodmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2FhNTI0OV9pZFtdID0geworCXsgInNhYTUyNDkiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNhYTUyNDlfaWQpOworCitzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CisJLm5hbWUgPSAic2FhNTI0OSIsCisJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1NBQTUyNDksCisJLnByb2JlID0gc2FhNTI0OV9wcm9iZSwKKwkucmVtb3ZlID0gc2FhNTI0OV9yZW1vdmUsCisJLmlkX3RhYmxlID0gc2FhNTI0OV9pZCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCmluZGV4IGFkNzMzY2EuLmM4ZTljYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPD0gMjM7IGkrKykKIAkJbGNyW2ldID0gMHhmZjsKIAotCWlmIChmbXQtPnNlcnZpY2Vfc2V0ID09IDApIHsKKwlpZiAoZm10ID09IE5VTEwpIHsKIAkJLyogcmF3IFZCSSAqLwogCQlpZiAoaXNfNTBoeikKIAkJCWZvciAoaSA9IDY7IGkgPD0gMjM7IGkrKykKQEAgLTExMTMsNyArMTExMyw3IEBACiAJfQogCiAJLyogZW5hYmxlL2Rpc2FibGUgcmF3IFZCSSBjYXB0dXJpbmcgKi8KLQlzYWE3MTF4X3dyaXRlcmVncyhjbGllbnQsIGZtdC0+c2VydmljZV9zZXQgPT0gMCA/CisJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBmbXQgPT0gTlVMTCA/CiAJCQkJc2FhNzExNV9jZmdfdmJpX29uIDoKIAkJCQlzYWE3MTE1X2NmZ192Ymlfb2ZmKTsKIH0KQEAgLTExNTMsNiArMTE1MywxMCBAQAogCQlzYWE3MTF4X3NldF9sY3IoY2xpZW50LCAmZm10LT5mbXQuc2xpY2VkKTsKIAkJcmV0dXJuIDA7CiAJfQorCWlmIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgeworCQlzYWE3MTF4X3NldF9sY3IoY2xpZW50LCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQogCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTMwOSwxMCArMTMxMywxMyBAQAogCWNhc2UgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkc6CiAJewogCQlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKKwkJdTMyIGlucHV0ID0gcm91dGUtPmlucHV0OworCQl1OCBtYXNrID0gKHN0YXRlLT5pZGVudCA9PSBWNEwyX0lERU5UX1NBQTcxMTEpID8gMHhmOCA6IDB4ZjA7CiAKIAkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZGVjb2RlciBzZXQgaW5wdXQgJWQgb3V0cHV0ICVkXG4iLCByb3V0ZS0+aW5wdXQsIHJvdXRlLT5vdXRwdXQpOwotCQkvKiBzYWE3MTEzIGRvZXMgbm90IGhhdmUgdGhlc2UgaW5wdXRzICovCi0JCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzICYmCisJCS8qIHNhYTcxMTEvMyBkb2VzIG5vdCBoYXZlIHRoZXNlIGlucHV0cyAqLworCQlpZiAoKHN0YXRlLT5pZGVudCA9PSBWNEwyX0lERU5UX1NBQTcxMTMgfHwKKwkJICAgICBzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTExKSAmJgogCQkgICAgKHJvdXRlLT5pbnB1dCA9PSBTQUE3MTE1X0NPTVBPU0lURTQgfHwKIAkJICAgICByb3V0ZS0+aW5wdXQgPT0gU0FBNzExNV9DT01QT1NJVEU1KSkgewogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzI3LDEwICsxMzM0LDIzIEBACiAJCQkocm91dGUtPmlucHV0ID49IFNBQTcxMTVfU1ZJREVPMCkgPyAiUy1WaWRlbyIgOiAiQ29tcG9zaXRlIiwgKHJvdXRlLT5vdXRwdXQgPT0gU0FBNzExNV9JUE9SVF9PTikgPyAiaXBvcnQgb24iIDogImlwb3J0IG9mZiIpOwogCQlzdGF0ZS0+aW5wdXQgPSByb3V0ZS0+aW5wdXQ7CiAKKwkJLyogc2FhNzExMSBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IGlucHV0IG51bWJlcmluZyAqLworCQlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMSkgeworCQkJaWYgKGlucHV0ID49IFNBQTcxMTVfQ09NUE9TSVRFNCkKKwkJCQlpbnB1dCAtPSAyOworCQkJLyogc2FhNzExMSBzcGVjaWZpYyAqLworCQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMTBfQ0hST01BX0NOVExfMiwKKwkJCQkJKHNhYTcxMXhfcmVhZChjbGllbnQsIFJfMTBfQ0hST01BX0NOVExfMikgJiAweDNmKSB8CisJCQkJCSgocm91dGUtPm91dHB1dCAmIDB4YzApIF4gMHg0MCkpOworCQkJc2FhNzExeF93cml0ZShjbGllbnQsIFJfMTNfUlRfWF9QT1JUX09VVF9DTlRMLAorCQkJCQkoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8xM19SVF9YX1BPUlRfT1VUX0NOVEwpICYgMHhmMCkgfAorCQkJCQkoKHJvdXRlLT5vdXRwdXQgJiAyKSA/IDB4MGEgOiAwKSk7CisJCX0KKwogCQkvKiBzZWxlY3QgbW9kZSAqLwogCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wMl9JTlBVVF9DTlRMXzEsCi0JCQkgICAgICAoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8wMl9JTlBVVF9DTlRMXzEpICYgMHhmMCkgfAotCQkJICAgICAgIHN0YXRlLT5pbnB1dCk7CisJCQkgICAgICAoc2FhNzExeF9yZWFkKGNsaWVudCwgUl8wMl9JTlBVVF9DTlRMXzEpICYgbWFzaykgfAorCQkJICAgICAgIGlucHV0KTsKIAogCQkvKiBieXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgUy1WaWRlbyBtb2RlcyAqLwogCQlzYWE3MTF4X3dyaXRlKGNsaWVudCwgUl8wOV9MVU1BX0NOVEwsCkBAIC0xMzg0LDYgKzE0MDQsMTMgQEAKIAkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ19yZXNldF9zY2FsZXIpOwogCQlicmVhazsKIAorCWNhc2UgVklESU9DX0lOVF9TX0dQSU86CisJCWlmIChzdGF0ZS0+aWRlbnQgIT0gVjRMMl9JREVOVF9TQUE3MTExKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNhYTcxMXhfd3JpdGUoY2xpZW50LCAweDExLCAoc2FhNzExeF9yZWFkKGNsaWVudCwgMHgxMSkgJiAweDdmKSB8CisJCQkoKih1MzIgKilhcmcgPyAweDgwIDogMCkpOworCQlicmVhazsKKwogCWNhc2UgVklESU9DX0lOVF9HX1ZCSV9EQVRBOgogCXsKIAkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhICpkYXRhID0gYXJnOwpAQCAtMTUzOSw3ICsxNTY2LDggQEAKIAkJc3RhdGUtPmNyeXN0YWxfZnJlcSA9IFNBQTcxMTVfRlJFUV8zMl8xMV9NSFo7CiAJCXNhYTcxMXhfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9pbml0X2F1dG9faW5wdXQpOwogCX0KLQlzYWE3MTF4X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfaW5pdF9taXNjKTsKKwlpZiAoc3RhdGUtPmlkZW50ICE9IFY0TDJfSURFTlRfU0FBNzExMSkKKwkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2luaXRfbWlzYyk7CiAJc2FhNzExeF9zZXRfdjRsc3RkKGNsaWVudCwgVjRMMl9TVERfTlRTQyk7CiAKIAl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJzdGF0dXM6ICgxRSkgMHglMDJ4LCAoMUYpIDB4JTAyeFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwppbmRleCA3MDdiZTE3Li4xZmI2ZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCkBAIC0xLDMgKzEsMjcgQEAKKyAvKgorICAgIHNhYTY3NTJocyAtIGkyYy1kcml2ZXIgZm9yIHRoZSBzYWE2NzUyaHMgYnkgUGhpbGlwcworCisgICAgQ29weXJpZ2h0IChDKSAyMDA0IEFuZHJldyBkZSBRdWluY2V5CisKKyAgICBBQy0zIHN1cHBvcnQ6CisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdnMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTXZzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMTAsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWkyYy1kcnYtbGVnYWN5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAKQEAgLTI3LDkgKzUzLDYgQEAKIE1PRFVMRV9BVVRIT1IoIkFuZHJldyBkZSBRdWluY2V5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXI7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCiBlbnVtIHNhYTY3NTJoc192aWRlb2Zvcm1hdCB7CiAJU0FBNjc1MkhTX1ZGX0QxID0gMCwgICAgLyogc3RhbmRhcmQgRDEgdmlkZW8gZm9ybWF0OiA3MjB4NTc2ICovCiAJU0FBNjc1MkhTX1ZGXzJfM19EMSA9IDEsLyogMi8zRDEgdmlkZW8gZm9ybWF0OiA0ODB4NTc2ICovCkBAIC00Niw3ICs2OSw5IEBACiAJX191MTYJCQkJdHNfcGlkX3BjcjsKIAogCS8qIGF1ZGlvICovCi0JZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSBhdV9sMl9iaXRyYXRlOworCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nICAgIGF1X2VuY29kaW5nOworCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGUgIGF1X2wyX2JpdHJhdGU7CisJZW51bSB2NGwyX21wZWdfYXVkaW9fYWMzX2JpdHJhdGUgYXVfYWMzX2JpdHJhdGU7CiAKIAkvKiB2aWRlbyAqLwogCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdAl2aV9hc3BlY3Q7CkBAIC03MCw3ICs5NSw5IEBACiB9OwogCiBzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAgICBjbGllbnQ7CisJaW50IAkJCSAgICAgIGNoaXA7CisJdTMyIAkJCSAgICAgIHJldmlzaW9uOworCWludCAJCQkgICAgICBoYXNfYWMzOwogCXN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgIHBhcmFtczsKIAllbnVtIHNhYTY3NTJoc192aWRlb2Zvcm1hdCAgICB2aWRlb19mb3JtYXQ7CiAJdjRsMl9zdGRfaWQgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQ7CkBAIC0xNDUsNiArMTcyLDM5IEBACiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiBDUkMzMiAqLwogfTsKIAorc3RhdGljIHU4IFBNVF9BQzNbXSA9IHsKKwkweGMyLCAvKiBpMmMgcmVnaXN0ZXIgKi8KKwkweDAxLCAvKiB0YWJsZSBudW1iZXIgZm9yIGVuY29kZXIoMSkgKi8KKwkweDQ3LCAvKiBzeW5jICovCisKKwkweDQwLCAvKiB0cmFuc3BvcnRfZXJyb3JfaW5kaWNhdG9yKDApLCBwYXlsb2FkX3VuaXRfc3RhcnQoMSksIHRyYW5zcG9ydF9wcmlvcml0eSgwKSAqLworCTB4MTAsIC8qIFBNVCBQSUQgKDB4MDAxMCkgKi8KKwkweDEwLCAvKiB0cmFuc3BvcnRfc2NyYW1ibGluZ19jb250cm9sKDAwKSwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sKDAxKSwgY29udGludWl0eV9jb3VudGVyKDApICovCisKKwkweDAwLCAvKiBQU0kgcG9pbnRlciB0byBzdGFydCBvZiB0YWJsZSAqLworCisJMHgwMiwgLyogVElEICgyKSAqLworCTB4YjAsIDB4MWEsIC8qIHNlY3Rpb25fc3ludGF4X2luZGljYXRvcigxKSwgc2VjdGlvbl9sZW5ndGgoMjYpICovCisKKwkweDAwLCAweDAxLCAvKiBwcm9ncmFtX251bWJlcigxKSAqLworCisJMHhjMSwgLyogdmVyc2lvbl9udW1iZXIoMCksIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IoMSkgKi8KKworCTB4MDAsIDB4MDAsIC8qIHNlY3Rpb25fbnVtYmVyKDApLCBsYXN0X3NlY3Rpb25fbnVtYmVyKDApICovCisKKwkweGUxLCAweDA0LCAvKiBQQ1JfUElEICgweDAxMDQpICovCisKKwkweGYwLCAweDAwLCAvKiBwcm9ncmFtX2luZm9fbGVuZ3RoKDApICovCisKKwkweDAyLCAweGUxLCAweDAwLCAweGYwLCAweDAwLCAvKiB2aWRlbyBzdHJlYW0gdHlwZSgyKSwgcGlkICovCisJMHgwNiwgMHhlMSwgMHgwMywgMHhmMCwgMHgwMywgLyogYXVkaW8gc3RyZWFtIHR5cGUoNiksIHBpZCAqLworCTB4NmEsIC8qIEFDMyAqLworCTB4MDEsIC8qIERlc2NyaXB0b3JfbGVuZ3RoKDEpICovCisJMHgwMCwgLyogY29tcG9uZW50X3R5cGVfZmxhZygwKSwgYnNpZF9mbGFnKDApLCBtYWluaWRfZmxhZygwKSwgYXN2Y19mbGFnKDApLCByZXNlcnZlZCBmbGFncygwKSAqLworCisJMHhFRCwgMHhERSwgMHgyRCwgMHhGMyAvKiBDUkMzMiBCRSAqLworfTsKKwogc3RhdGljIHN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgcGFyYW1fZGVmYXVsdHMgPQogewogCS50c19waWRfcG10ICAgICAgPSAxNiwKQEAgLTE1NywxMiArMjE3LDE0IEBACiAJLnZpX2JpdHJhdGVfcGVhayA9IDYwMDAsCiAJLnZpX2JpdHJhdGVfbW9kZSA9IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSLAogCisJLmF1X2VuY29kaW5nICAgICA9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yLAogCS5hdV9sMl9iaXRyYXRlICAgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLLAorCS5hdV9hYzNfYml0cmF0ZSAgPSBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SywKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBzYWE2NzUyaHNfY2hpcF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCitzdGF0aWMgaW50IHNhYTY3NTJoc19jaGlwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkgIGVudW0gc2FhNjc1MmhzX2NvbW1hbmQgY29tbWFuZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKQEAgLTIyOSw0NSArMjkxLDYxIEBACiB9CiAKIAotc3RhdGljIGludCBzYWE2NzUyaHNfc2V0X2JpdHJhdGUoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKLQkJCQkgc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyogcGFyYW1zKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9yZWc4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgcmVnLCB1aW50OF90IHZhbCkKK3sKKwl1OCBidWZbMl07CisKKwlidWZbMF0gPSByZWc7CisJYnVmWzFdID0gdmFsOworCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmVnMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdWludDhfdCByZWcsIHVpbnQxNl90IHZhbCkKIHsKIAl1OCBidWZbM107CisKKwlidWZbMF0gPSByZWc7CisJYnVmWzFdID0gdmFsID4+IDg7CisJYnVmWzJdID0gdmFsICYgMHhmZjsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpOworfQorCitzdGF0aWMgaW50IHNhYTY3NTJoc19zZXRfYml0cmF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSBzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlICpoKQoreworCXN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgKnBhcmFtcyA9ICZoLT5wYXJhbXM7CiAJaW50IHRvdF9iaXRyYXRlOworCWludCBpc18zODRrOwogCiAJLyogc2V0IHRoZSBiaXRyYXRlIG1vZGUgKi8KLQlidWZbMF0gPSAweDcxOwotCWJ1ZlsxXSA9IChwYXJhbXMtPnZpX2JpdHJhdGVfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUikgPyAwIDogMTsKLQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCXNldF9yZWc4KGNsaWVudCwgMHg3MSwKKwkJcGFyYW1zLT52aV9iaXRyYXRlX21vZGUgIT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpOwogCiAJLyogc2V0IHRoZSB2aWRlbyBiaXRyYXRlICovCiAJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSKSB7CiAJCS8qIHNldCB0aGUgdGFyZ2V0IGJpdHJhdGUgKi8KLQkJYnVmWzBdID0gMHg4MDsKLQkJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlID4+IDg7Ci0JCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZSAmIDB4ZmY7Ci0JCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CisJCXNldF9yZWcxNihjbGllbnQsIDB4ODAsIHBhcmFtcy0+dmlfYml0cmF0ZSk7CiAKIAkJLyogc2V0IHRoZSBtYXggYml0cmF0ZSAqLwotCQlidWZbMF0gPSAweDgxOwotCQlidWZbMV0gPSBwYXJhbXMtPnZpX2JpdHJhdGVfcGVhayA+PiA4OwotCQlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGVfcGVhayAmIDB4ZmY7Ci0JCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CisJCXNldF9yZWcxNihjbGllbnQsIDB4ODEsIHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrKTsKIAkJdG90X2JpdHJhdGUgPSBwYXJhbXMtPnZpX2JpdHJhdGVfcGVhazsKIAl9IGVsc2UgewogCQkvKiBzZXQgdGhlIHRhcmdldCBiaXRyYXRlIChubyBtYXggYml0cmF0ZSBmb3IgQ0JSKSAqLwotCQlidWZbMF0gPSAweDgxOwotCQlidWZbMV0gPSBwYXJhbXMtPnZpX2JpdHJhdGUgPj4gODsKLQkJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlICYgMHhmZjsKLQkJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKTsKKwkJc2V0X3JlZzE2KGNsaWVudCwgMHg4MSwgcGFyYW1zLT52aV9iaXRyYXRlKTsKIAkJdG90X2JpdHJhdGUgPSBwYXJhbXMtPnZpX2JpdHJhdGU7CiAJfQogCisJLyogc2V0IHRoZSBhdWRpbyBlbmNvZGluZyAqLworCXNldF9yZWc4KGNsaWVudCwgMHg5MywKKwkJCXBhcmFtcy0+YXVfZW5jb2RpbmcgPT0gVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FDMyk7CisKIAkvKiBzZXQgdGhlIGF1ZGlvIGJpdHJhdGUgKi8KLQlidWZbMF0gPSAweDk0OwotCWJ1ZlsxXSA9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAwIDogMTsKLQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOwotCXRvdF9iaXRyYXRlICs9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAyNTYgOiAzODQ7CisJaWYgKHBhcmFtcy0+YXVfZW5jb2RpbmcgPT0gVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FDMykKKwkJaXNfMzg0ayA9IFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLID09IHBhcmFtcy0+YXVfYWMzX2JpdHJhdGU7CisJZWxzZQorCQlpc18zODRrID0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SyA9PSBwYXJhbXMtPmF1X2wyX2JpdHJhdGU7CisJc2V0X3JlZzgoY2xpZW50LCAweDk0LCBpc18zODRrKTsKKwl0b3RfYml0cmF0ZSArPSBpc18zODRrID8gMzg0IDogMjU2OwogCiAJLyogTm90ZTogdGhlIHRvdGFsIG1heCBiaXRyYXRlIGlzIGRldGVybWluZWQgYnkgYWRkaW5nIHRoZSB2aWRlbyBhbmQgYXVkaW8KIAkgICBiaXRyYXRlcyB0b2dldGhlciBhbmQgYWxzbyBhZGRpbmcgYW4gZXh0cmEgNzY4a2JpdC9zIHRvIHN0YXkgb24gdGhlCkBAIC0yNzgsMTYgKzM1NiwxMiBAQAogCQl0b3RfYml0cmF0ZSA9IE1QRUdfVE9UQUxfVEFSR0VUX0JJVFJBVEVfTUFYOwogCiAJLyogc2V0IHRoZSB0b3RhbCBiaXRyYXRlICovCi0JYnVmWzBdID0gMHhiMTsKLQlidWZbMV0gPSB0b3RfYml0cmF0ZSA+PiA4OwotCWJ1ZlsyXSA9IHRvdF9iaXRyYXRlICYgMHhmZjsKLQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpOwotCisJc2V0X3JlZzE2KGNsaWVudCwgMHhiMSwgdG90X2JpdHJhdGUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzYWE2NzUyaHNfc2V0X3N1YnNhbXBsaW5nKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCi0JCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0KiBmKQorc3RhdGljIHZvaWQgc2FhNjc1MmhzX3NldF9zdWJzYW1wbGluZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKIAlzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlICpoID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGRpc3RfMzUyLCBkaXN0XzQ4MCwgZGlzdF83MjA7CkBAIC0zMzIsNyArNDA2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGhhbmRsZV9jdHJsKHN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgKnBhcmFtcywKK3N0YXRpYyBpbnQgaGFuZGxlX2N0cmwoaW50IGhhc19hYzMsIHN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgKnBhcmFtcywKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwsIHVuc2lnbmVkIGludCBjbWQpCiB7CiAJaW50IG9sZCA9IDAsIG5ldzsKQEAgLTM3OSw4ICs0NTMsOSBAQAogCQkJcGFyYW1zLT50c19waWRfcGNyID0gbmV3OwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKLQkJCW9sZCA9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yOwotCQkJaWYgKHNldCAmJiBuZXcgIT0gb2xkKQorCQkJb2xkID0gcGFyYW1zLT5hdV9lbmNvZGluZzsKKwkJCWlmIChzZXQgJiYgbmV3ICE9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yICYmCisJCQkgICAgKCFoYXNfYWMzIHx8IG5ldyAhPSBWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUMzKSkKIAkJCQlyZXR1cm4gLUVSQU5HRTsKIAkJCW5ldyA9IG9sZDsKIAkJCWJyZWFrOwpAQCAtMzk1LDYgKzQ3MCwxOSBAQAogCQkJCW5ldyA9IFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEs7CiAJCQlwYXJhbXMtPmF1X2wyX2JpdHJhdGUgPSBuZXc7CiAJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FDM19CSVRSQVRFOgorCQkJaWYgKCFoYXNfYWMzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJb2xkID0gcGFyYW1zLT5hdV9hYzNfYml0cmF0ZTsKKwkJCWlmIChzZXQgJiYgbmV3ICE9IFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yNTZLICYmCisJCQkJICAgbmV3ICE9IFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyA8PSBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SykKKwkJCQluZXcgPSBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SzsKKwkJCWVsc2UKKwkJCQluZXcgPSBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzg0SzsKKwkJCXBhcmFtcy0+YXVfYWMzX2JpdHJhdGUgPSBuZXc7CisJCQlicmVhazsKIAkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CiAJCQlvbGQgPSBWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMDsKIAkJCWlmIChzZXQgJiYgbmV3ICE9IG9sZCkKQEAgLTQ0OCwxNyArNTM2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNjc1MmhzX3FjdHJsKHN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgKnBhcmFtcywKK3N0YXRpYyBpbnQgc2FhNjc1MmhzX3FjdHJsKHN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmgsCiAJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCiB7CisJc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyAqcGFyYW1zID0gJmgtPnBhcmFtczsKIAlpbnQgZXJyOwogCiAJc3dpdGNoIChxY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CiAJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKIAkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiwKLQkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiwgMSwKLQkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMik7CisJCQkJaC0+aGFzX2FjMyA/IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQzMgOgorCQkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiwKKwkJCQkxLCBWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMik7CiAKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLApAQCAtNDY2LDYgKzU1NiwxNCBAQAogCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzM4NEssIDEsCiAJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjU2Syk7CiAKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQUMzX0JJVFJBVEU6CisJCWlmICghaC0+aGFzX2FjMykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzI1NkssCisJCQkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzM4NEssIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzI1NkspOworCiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CiAJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKIAkJCQlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMCwKQEAgLTUxMiw0NCArNjEwLDU3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNjc1MmhzX3FtZW51KHN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgKnBhcmFtcywKK3N0YXRpYyBpbnQgc2FhNjc1MmhzX3FtZW51KHN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmgsCiAJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDJfYml0cmF0ZVtdID0gewotCQkiIiwKLQkJIiIsCi0JCSIiLAotCQkiIiwKLQkJIiIsCi0JCSIiLAotCQkiIiwKLQkJIiIsCi0JCSIiLAotCQkiIiwKLQkJIiIsCi0JCSIyNTYga2JwcyIsCi0JCSIiLAotCQkiMzg0IGticHMiLAotCQlOVUxMCisJc3RhdGljIGNvbnN0IHUzMiBtcGVnX2F1ZGlvX2VuY29kaW5nW10gPSB7CisJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yLAorCQlWNEwyX0NUUkxfTUVOVV9JRFNfRU5ECisJfTsKKwlzdGF0aWMgY29uc3QgdTMyIG1wZWdfYXVkaW9fYWMzX2VuY29kaW5nW10gPSB7CisJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yLAorCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUMzLAorCQlWNEwyX0NUUkxfTUVOVV9JRFNfRU5ECisJfTsKKwlzdGF0aWMgdTMyIG1wZWdfYXVkaW9fbDJfYml0cmF0ZVtdID0geworCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLLAorCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLLAorCQlWNEwyX0NUUkxfTUVOVV9JRFNfRU5ECisJfTsKKwlzdGF0aWMgdTMyIG1wZWdfYXVkaW9fYWMzX2JpdHJhdGVbXSA9IHsKKwkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzI1NkssCisJCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLLAorCQlWNEwyX0NUUkxfTUVOVV9JRFNfRU5ECiAJfTsKIAlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcWN0cmw7CiAJaW50IGVycjsKIAogCXFjdHJsLmlkID0gcW1lbnUtPmlkOwotCWVyciA9IHNhYTY3NTJoc19xY3RybChwYXJhbXMsICZxY3RybCk7CisJZXJyID0gc2FhNjc1MmhzX3FjdHJsKGgsICZxY3RybCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlpZiAocW1lbnUtPmlkID09IFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSkKLQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51KHFtZW51LCAmcWN0cmwsCisJc3dpdGNoIChxbWVudS0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKHFtZW51LAogCQkJCW1wZWdfYXVkaW9fbDJfYml0cmF0ZSk7Ci0JcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51KHFtZW51LCAmcWN0cmwsCi0JCQl2NGwyX2N0cmxfZ2V0X21lbnUocW1lbnUtPmlkKSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FDM19CSVRSQVRFOgorCQlpZiAoIWgtPmhhc19hYzMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKHFtZW51LAorCQkJCW1wZWdfYXVkaW9fYWMzX2JpdHJhdGUpOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKHFtZW51LAorCQkJaC0+aGFzX2FjMyA/IG1wZWdfYXVkaW9fYWMzX2VuY29kaW5nIDoKKwkJCQltcGVnX2F1ZGlvX2VuY29kaW5nKTsKKwl9CisJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51KHFtZW51LCAmcWN0cmwsIE5VTEwpOwogfQogCi1zdGF0aWMgaW50IHNhYTY3NTJoc19pbml0KHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQpCitzdGF0aWMgaW50IHNhYTY3NTJoc19pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiBsZWFkaW5nX251bGxfYnl0ZXMpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbOV0sIGJ1ZjJbNF07CiAJc3RydWN0IHNhYTY3NTJoc19zdGF0ZSAqaDsKKwl1bnNpZ25lZCBzaXplOwogCXUzMiBjcmM7CiAJdW5zaWduZWQgY2hhciBsb2NhbFBBVFsyNTZdOwogCXVuc2lnbmVkIGNoYXIgbG9jYWxQTVRbMjU2XTsKQEAgLTU1Nyw0NSArNjY4LDMxIEBACiAJaCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJLyogU2V0IHZpZGVvIGZvcm1hdCAtIG11c3QgYmUgZG9uZSBmaXJzdCBhcyBpdCByZXNldHMgb3RoZXIgc2V0dGluZ3MgKi8KLQlidWZbMF0gPSAweDQxOwotCWJ1ZlsxXSA9IGgtPnZpZGVvX2Zvcm1hdDsKLQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCXNldF9yZWc4KGNsaWVudCwgMHg0MSwgaC0+dmlkZW9fZm9ybWF0KTsKIAogCS8qIFNldCBudW1iZXIgb2YgbGluZXMgaW4gaW5wdXQgc2lnbmFsICovCi0JYnVmWzBdID0gMHg0MDsKLQlidWZbMV0gPSAweDAwOwotCWlmIChoLT5zdGFuZGFyZCAmIFY0TDJfU1REXzUyNV82MCkKLQkJYnVmWzFdID0gMHgwMTsKLQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCXNldF9yZWc4KGNsaWVudCwgMHg0MCwgKGgtPnN0YW5kYXJkICYgVjRMMl9TVERfNTI1XzYwKSA/IDEgOiAwKTsKIAogCS8qIHNldCBiaXRyYXRlICovCi0Jc2FhNjc1MmhzX3NldF9iaXRyYXRlKGNsaWVudCwgJmgtPnBhcmFtcyk7CisJc2FhNjc1MmhzX3NldF9iaXRyYXRlKGNsaWVudCwgaCk7CiAKIAkvKiBTZXQgR09QIHN0cnVjdHVyZSB7MywgMTN9ICovCi0JYnVmWzBdID0gMHg3MjsKLQlidWZbMV0gPSAweDAzOwotCWJ1ZlsyXSA9IDB4MEQ7Ci0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMyk7CisJc2V0X3JlZzE2KGNsaWVudCwgMHg3MiwgMHgwMzBkKTsKIAogCS8qIFNldCBtaW5pbXVtIFEtc2NhbGUgezR9ICovCi0JYnVmWzBdID0gMHg4MjsKLQlidWZbMV0gPSAweDA0OwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOworCXNldF9yZWc4KGNsaWVudCwgMHg4MiwgMHgwNCk7CiAKIAkvKiBTZXQgbWF4aW11bSBRLXNjYWxlIHsxMn0gKi8KLQlidWZbMF0gPSAweDgzOwotCWJ1ZlsxXSA9IDB4MEM7Ci0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CisJc2V0X3JlZzgoY2xpZW50LCAweDgzLCAweDBjKTsKIAogCS8qIFNldCBPdXRwdXQgUHJvdG9jb2wgKi8KLQlidWZbMF0gPSAweEQwOwotCWJ1ZlsxXSA9IDB4ODE7Ci0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CisJc2V0X3JlZzgoY2xpZW50LCAweGQwLCAweDgxKTsKIAogCS8qIFNldCB2aWRlbyBvdXRwdXQgc3RyZWFtIGZvcm1hdCB7VFN9ICovCi0JYnVmWzBdID0gMHhCMDsKLQlidWZbMV0gPSAweDA1OwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOworCXNldF9yZWc4KGNsaWVudCwgMHhiMCwgMHgwNSk7CisKKwkvKiBTZXQgbGVhZGluZyBudWxsIGJ5dGUgZm9yIFRTICovCisJc2V0X3JlZzE2KGNsaWVudCwgMHhmNiwgbGVhZGluZ19udWxsX2J5dGVzKTsKIAogCS8qIGNvbXB1dGUgUEFUICovCiAJbWVtY3B5KGxvY2FsUEFULCBQQVQsIHNpemVvZihQQVQpKTsKQEAgLTYwOCw3ICs3MDUsMTMgQEAKIAlsb2NhbFBBVFtzaXplb2YoUEFUKSAtIDFdID0gY3JjICYgMHhGRjsKIAogCS8qIGNvbXB1dGUgUE1UICovCi0JbWVtY3B5KGxvY2FsUE1ULCBQTVQsIHNpemVvZihQTVQpKTsKKwlpZiAoaC0+cGFyYW1zLmF1X2VuY29kaW5nID09IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQzMpIHsKKwkJc2l6ZSA9IHNpemVvZihQTVRfQUMzKTsKKwkJbWVtY3B5KGxvY2FsUE1ULCBQTVRfQUMzLCBzaXplKTsKKwl9IGVsc2UgeworCQlzaXplID0gc2l6ZW9mKFBNVCk7CisJCW1lbWNweShsb2NhbFBNVCwgUE1ULCBzaXplKTsKKwl9CiAJbG9jYWxQTVRbM10gPSAweDQwIHwgKChoLT5wYXJhbXMudHNfcGlkX3BtdCA+PiA4KSAmIDB4MGYpOwogCWxvY2FsUE1UWzRdID0gaC0+cGFyYW1zLnRzX3BpZF9wbXQgJiAweGZmOwogCWxvY2FsUE1UWzE1XSA9IDB4RTAgfCAoKGgtPnBhcmFtcy50c19waWRfcGNyID4+IDgpICYgMHgwRik7CkBAIC02MTcsNDAgKzcyMCwyOCBAQAogCWxvY2FsUE1UWzIxXSA9IGgtPnBhcmFtcy50c19waWRfdmlkZW8gJiAweEZGOwogCWxvY2FsUE1UWzI1XSA9IDB4RTAgfCAoKGgtPnBhcmFtcy50c19waWRfYXVkaW8gPj4gOCkgJiAweDBGKTsKIAlsb2NhbFBNVFsyNl0gPSBoLT5wYXJhbXMudHNfcGlkX2F1ZGlvICYgMHhGRjsKLQljcmMgPSBjcmMzMl9iZSh+MCwgJmxvY2FsUE1UWzddLCBzaXplb2YoUE1UKSAtIDcgLSA0KTsKLQlsb2NhbFBNVFtzaXplb2YoUE1UKSAtIDRdID0gKGNyYyA+PiAyNCkgJiAweEZGOwotCWxvY2FsUE1UW3NpemVvZihQTVQpIC0gM10gPSAoY3JjID4+IDE2KSAmIDB4RkY7Ci0JbG9jYWxQTVRbc2l6ZW9mKFBNVCkgLSAyXSA9IChjcmMgPj4gOCkgJiAweEZGOwotCWxvY2FsUE1UW3NpemVvZihQTVQpIC0gMV0gPSBjcmMgJiAweEZGOworCWNyYyA9IGNyYzMyX2JlKH4wLCAmbG9jYWxQTVRbN10sIHNpemUgLSA3IC0gNCk7CisJbG9jYWxQTVRbc2l6ZSAtIDRdID0gKGNyYyA+PiAyNCkgJiAweEZGOworCWxvY2FsUE1UW3NpemUgLSAzXSA9IChjcmMgPj4gMTYpICYgMHhGRjsKKwlsb2NhbFBNVFtzaXplIC0gMl0gPSAoY3JjID4+IDgpICYgMHhGRjsKKwlsb2NhbFBNVFtzaXplIC0gMV0gPSBjcmMgJiAweEZGOwogCiAJLyogU2V0IEF1ZGlvIFBJRCAqLwotCWJ1ZlswXSA9IDB4QzE7Ci0JYnVmWzFdID0gKGgtPnBhcmFtcy50c19waWRfYXVkaW8gPj4gOCkgJiAweEZGOwotCWJ1ZlsyXSA9IGgtPnBhcmFtcy50c19waWRfYXVkaW8gJiAweEZGOwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOworCXNldF9yZWcxNihjbGllbnQsIDB4YzEsIGgtPnBhcmFtcy50c19waWRfYXVkaW8pOwogCiAJLyogU2V0IFZpZGVvIFBJRCAqLwotCWJ1ZlswXSA9IDB4QzA7Ci0JYnVmWzFdID0gKGgtPnBhcmFtcy50c19waWRfdmlkZW8gPj4gOCkgJiAweEZGOwotCWJ1ZlsyXSA9IGgtPnBhcmFtcy50c19waWRfdmlkZW8gJiAweEZGOwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOworCXNldF9yZWcxNihjbGllbnQsIDB4YzAsIGgtPnBhcmFtcy50c19waWRfdmlkZW8pOwogCiAJLyogU2V0IFBDUiBQSUQgKi8KLQlidWZbMF0gPSAweEM0OwotCWJ1ZlsxXSA9IChoLT5wYXJhbXMudHNfcGlkX3BjciA+PiA4KSAmIDB4RkY7Ci0JYnVmWzJdID0gaC0+cGFyYW1zLnRzX3BpZF9wY3IgJiAweEZGOwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOworCXNldF9yZWcxNihjbGllbnQsIDB4YzQsIGgtPnBhcmFtcy50c19waWRfcGNyKTsKIAogCS8qIFNlbmQgU0kgdGFibGVzICovCi0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxsb2NhbFBBVCxzaXplb2YoUEFUKSk7Ci0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxsb2NhbFBNVCxzaXplb2YoUE1UKSk7CisJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgbG9jYWxQQVQsIHNpemVvZihQQVQpKTsKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBsb2NhbFBNVCwgc2l6ZSk7CiAKIAkvKiBtdXRlIHRoZW4gdW5tdXRlIGF1ZGlvLiBUaGlzIHJlbW92ZXMgYnV6emluZyBhcnRlZmFjdHMgKi8KLQlidWZbMF0gPSAweGE0OwotCWJ1ZlsxXSA9IDE7Ci0JaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKLQlidWZbMV0gPSAwOwotCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMik7CisJc2V0X3JlZzgoY2xpZW50LCAweGE0LCAxKTsKKwlzZXRfcmVnOChjbGllbnQsIDB4YTQsIDApOwogCiAJLyogc3RhcnQgaXQgZ29pbmcgKi8KIAlzYWE2NzUyaHNfY2hpcF9jb21tYW5kKGNsaWVudCwgU0FBNjc1MkhTX0NPTU1BTkRfU1RBUlQpOwpAQCAtNjg4LDQ1ICs3NzksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTY3NTJoc19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCi17Ci0Jc3RydWN0IHNhYTY3NTJoc19zdGF0ZSAqaDsKLQotCi0JaWYgKE5VTEwgPT0gKGggPSBremFsbG9jKHNpemVvZigqaCksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaC0+Y2xpZW50ID0gY2xpZW50X3RlbXBsYXRlOwotCWgtPnBhcmFtcyA9IHBhcmFtX2RlZmF1bHRzOwotCWgtPmNsaWVudC5hZGFwdGVyID0gYWRhcDsKLQloLT5jbGllbnQuYWRkciA9IGFkZHI7Ci0KLQkvKiBBc3N1bWUgNjI1IGlucHV0IGxpbmVzICovCi0JaC0+c3RhbmRhcmQgPSAwOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKCZoLT5jbGllbnQsIGgpOwotCWkyY19hdHRhY2hfY2xpZW50KCZoLT5jbGllbnQpOwotCi0JdjRsX2luZm8oJmgtPmNsaWVudCwic2FhNjc1MmhzOiBjaGlwIGZvdW5kIEAgMHgleFxuIiwgYWRkcjw8MSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2FhNjc1MmhzX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlpZiAoYWRhcC0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQotCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHNhYTY3NTJoc19hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhYTY3NTJoc19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgc2FhNjc1MmhzX3N0YXRlICpoOwotCi0JaCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0Ja2ZyZWUoaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQKIHNhYTY3NTJoc19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKQEAgLTczNywxNCArNzg5LDEzIEBACiAJaW50IGk7CiAKIAlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX0lOVF9JTklUOgorCQkvKiBhcHBseSBzZXR0aW5ncyBhbmQgc3RhcnQgZW5jb2RlciAqLworCQlzYWE2NzUyaHNfaW5pdChjbGllbnQsICoodTMyICopYXJnKTsKKwkJYnJlYWs7CiAJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CiAJCWlmIChjdHJscy0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoY3RybHMtPmNvdW50ID09IDApIHsKLQkJCS8qIGFwcGx5IHNldHRpbmdzIGFuZCBzdGFydCBlbmNvZGVyICovCi0JCQlzYWE2NzUyaHNfaW5pdChjbGllbnQpOwotCQkJYnJlYWs7Ci0JCX0KIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBWSURJT0NfVFJZX0VYVF9DVFJMUzoKIAljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKQEAgLTc1Miw3ICs4MDMsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXBhcmFtcyA9IGgtPnBhcmFtczsKIAkJZm9yIChpID0gMDsgaSA8IGN0cmxzLT5jb3VudDsgaSsrKSB7Ci0JCQlpZiAoKGVyciA9IGhhbmRsZV9jdHJsKCZwYXJhbXMsIGN0cmxzLT5jb250cm9scyArIGksIGNtZCkpKSB7CisJCQllcnIgPSBoYW5kbGVfY3RybChoLT5oYXNfYWMzLCAmcGFyYW1zLCBjdHJscy0+Y29udHJvbHMgKyBpLCBjbWQpOworCQkJaWYgKGVycikgewogCQkJCWN0cmxzLT5lcnJvcl9pZHggPSBpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CkBAIC03NjAsOSArODEyLDkgQEAKIAkJaC0+cGFyYW1zID0gcGFyYW1zOwogCQlicmVhazsKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXJldHVybiBzYWE2NzUyaHNfcWN0cmwoJmgtPnBhcmFtcywgYXJnKTsKKwkJcmV0dXJuIHNhYTY3NTJoc19xY3RybChoLCBhcmcpOwogCWNhc2UgVklESU9DX1FVRVJZTUVOVToKLQkJcmV0dXJuIHNhYTY3NTJoc19xbWVudSgmaC0+cGFyYW1zLCBhcmcpOworCQlyZXR1cm4gc2FhNjc1MmhzX3FtZW51KGgsIGFyZyk7CiAJY2FzZSBWSURJT0NfR19GTVQ6CiAJewogCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZiA9IGFyZzsKQEAgLTc4NSw2ICs4MzcsMTEgQEAKIAljYXNlIFZJRElPQ19TX1NURDoKIAkJaC0+c3RhbmRhcmQgPSAqKCh2NGwyX3N0ZF9pZCAqKSBhcmcpOwogCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKKwkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwKKwkJCQlhcmcsIGgtPmNoaXAsIGgtPnJldmlzaW9uKTsKKwogCWRlZmF1bHQ6CiAJCS8qIG5vdGhpbmcgKi8KIAkJYnJlYWs7CkBAIC03OTMsMzYgKzg1MCw1NSBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgICA9ICJzYWE2NzUyaHMiLAotCX0sCi0JLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1NBQTY3NTJIUywKLQkuYXR0YWNoX2FkYXB0ZXIgPSBzYWE2NzUyaHNfcHJvYmUsCi0JLmRldGFjaF9jbGllbnQgID0gc2FhNjc1MmhzX2RldGFjaCwKLQkuY29tbWFuZCAgICAgICAgPSBzYWE2NzUyaHNfY29tbWFuZCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQorc3RhdGljIGludCBzYWE2NzUyaHNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQkubmFtZSAgICAgICA9ICJzYWE2NzUyaHMiLAotCS5kcml2ZXIgICAgID0gJmRyaXZlciwKLX07CisJc3RydWN0IHNhYTY3NTJoc19zdGF0ZSAqaCA9IGt6YWxsb2Moc2l6ZW9mKCpoKSwgR0ZQX0tFUk5FTCk7CisJdTggYWRkciA9IDB4MTM7CisJdTggZGF0YVsxMl07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNhYTY3NTJoc19pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKKwl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJaWYgKGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAmYWRkciwgMSk7CisJaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwloLT5jaGlwID0gVjRMMl9JREVOVF9TQUE2NzUySFM7CisJaC0+cmV2aXNpb24gPSAoZGF0YVs4XSA8PCA4KSB8IGRhdGFbOV07CisJaC0+aGFzX2FjMyA9IDA7CisJaWYgKGgtPnJldmlzaW9uID09IDB4MDIwNikgeworCQloLT5jaGlwID0gVjRMMl9JREVOVF9TQUE2NzUySFNfQUMzOworCQloLT5oYXNfYWMzID0gMTsKKwkJdjRsX2luZm8oY2xpZW50LCAic3VwcG9ydCBBQy0zXG4iKTsKKwl9CisJaC0+cGFyYW1zID0gcGFyYW1fZGVmYXVsdHM7CisJaC0+c3RhbmRhcmQgPSAwOyAvKiBBc3N1bWUgNjI1IGlucHV0IGxpbmVzICovCisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHNhYTY3NTJoc19jbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIGludCBzYWE2NzUyaHNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOwogfQogCi1tb2R1bGVfaW5pdChzYWE2NzUyaHNfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoc2FhNjc1MmhzX2NsZWFudXBfbW9kdWxlKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzYWE2NzUyaHNfaWRbXSA9IHsKKwl7ICJzYWE2NzUyaHMiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNhYTY3NTJoc19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKKwkubmFtZSA9ICJzYWE2NzUyaHMiLAorCS5kcml2ZXJpZCA9IEkyQ19EUklWRVJJRF9TQUE2NzUySFMsCisJLmNvbW1hbmQgPSBzYWE2NzUyaHNfY29tbWFuZCwKKwkucHJvYmUgPSBzYWE2NzUyaHNfcHJvYmUsCisJLnJlbW92ZSA9IHNhYTY3NTJoc19yZW1vdmUsCisJLmlkX3RhYmxlID0gc2FhNjc1MmhzX2lkLAorfTsKIAogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCmluZGV4IDk5MjlkMjAuLjI2MTk0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKQEAgLTQ4OCwxMCArNDg4LDEyIEBACiAJcGVyaW9kX3NpemUgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyk7CiAJcGVyaW9kcyA9IHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CiAKLQlzbmRfYXNzZXJ0KHBlcmlvZF9zaXplID49IDB4MTAwICYmIHBlcmlvZF9zaXplIDw9IDB4MTAwMDAsCi0JCSAgIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KHBlcmlvZHMgPj0gNCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQocGVyaW9kX3NpemUgKiBwZXJpb2RzIDw9IDEwMjQgKiAxMDI0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHBlcmlvZF9zaXplIDwgMHgxMDAgfHwgcGVyaW9kX3NpemUgPiAweDEwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGVyaW9kcyA8IDQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwZXJpb2Rfc2l6ZSAqIHBlcmlvZHMgPiAxMDI0ICogMTAyNCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkZXYgPSBzYWE3MTM0LT5kZXY7CiAKQEAgLTk0Miw3ICs5NDQsOCBAQAogCXVuc2lnbmVkIGludCBpZHg7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiU0FBNzEzNCBNaXhlciIpOwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9zYWE3MTM0X2NvbnRyb2xzKTsgaWR4KyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IDk4MzY0ZDEuLmRkYzU0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtMzI2MCw2ICszMjYwLDcgQEAKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTEwXSA9IHsKIAkJLyogVGhvbWFzIEdlbnR5IDx0b21sb2hhdmVAZ21haWwuY29tPiAqLworCQkvKiBEYXZpZCBCZW50aGFtIDxkYjI2MDE3OUBob3RtYWlsLmNvbT4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UVi1IVlIxMTEwIERWQi1UL0h5YnJpZCIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKQEAgLTMyNjgsMjMgKzMyNjksMjYgQEAKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKIAkJLnR1bmVyX2NvbmZpZyAgID0gMSwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmdwaW9tYXNrICAgICAgID0gMHgwMjAwMTAwLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKLQkJfSx7Ci0JCQkubmFtZSAgID0gbmFtZV9jb21wMSwKLQkJCS52bXV4ICAgPSAzLAotCQkJLmFtdXggICA9IExJTkUyLCAvKiBGSVhNRTogYXVkaW8gZG9lc24ndCB3b3JrIG9uIHN2aWRlby9jb21wb3NpdGUgKi8KLQkJfSx7Ci0JCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCi0JCQkudm11eCAgID0gOCwKLQkJCS5hbXV4ICAgPSBMSU5FMiwgLyogRklYTUU6IGF1ZGlvIGRvZXNuJ3Qgd29yayBvbiBzdmlkZW8vY29tcG9zaXRlICovCi0JCX19LAorCQkJLmdwaW8gPSAweDAwMDAxMDAsCisJCX0sIHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0sIHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9IH0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKLQkJCS5hbXV4ICAgPSBUViwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDIwMDEwMCwKIAkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1lfSFRfUENNQ0lBXSA9IHsKQEAgLTMzODgsNiArMzM5Miw0MiBAQAogCQkJLmFtdXggPSAwLAogCQl9LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfRU5DT1JFX0VOTFRWX0ZNNTNdID0geworCQkubmFtZSAgICAgICAgICAgPSAiRW5jb3JlIEVOTFRWLUZNIHY1LjMiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9UTkZfNTMzNU1GLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5ncGlvbWFzawk9IDB4NzAwMCwKKwkJLmlucHV0cyAgICAgICAgID0geyB7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IDEsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4NTAwMDAsCisJCX0sIHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gMiwKKwkJCS5ncGlvID0gMHgyMDAwLAorCQl9LCB7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSAyLAorCQkJLmdwaW8gPSAweDIwMDAsCisJCX0gfSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSAxLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmdwaW8gPSAweGYwMDAsCisJCQkuYW11eCA9IDAsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDSV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IEhUIFBDSSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCkBAIC0zNjMxLDYgKzM2NzEsNDAgQEAKIAkJCS50diAgICAgPSAxLAogCQl9fSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTM1QV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgUENJIHB1cmUgYW5hbG9nIChNMTM1QSkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkudHVuZXJfY29uZmlnICAgPSAyLAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDAyMDIwMDAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0sIHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0sIHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9IH0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDAyMDAwMDAsCisJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAxLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQkVIT0xEXzQwMV0gPSB7CiAJCS8qICAgICAgIEJlaG9sZGVyIEludGwuIEx0ZC4gMjAwOCAgICAgICovCiAJCS8qRG1pdHJ5IEJlbGltb3YgPGQuYmVsaW1vdkBnbWFpbC5jb20+ICovCkBAIC00NDA5LDYgKzQ0ODMsMTI5IEBACiAJCS8qIG5vIERWQiBzdXBwb3J0IGZvciBub3cgKi8KIAkJLyogLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwgKi8KIAl9LAorCVtTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVElHRVJfM0lOMV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBc3VzIFRpZ2VyIDNpbjEiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkudHVuZXJfY29uZmlnICAgPSAyLAorCQkuZ3Bpb21hc2sgICAgICAgPSAxIDw8IDIxLAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSwgeworCQkJLm5hbWUgPSBuYW1lX2NvbXAsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LCB7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAyMDAwMDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9SRUFMX0FOR0VMXzIyMF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJab2dpcyBSZWFsIEFuZ2VsIDIyMCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RORl81MzM1TUYsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDgwMWE4MDg3LAorCQkuaW5wdXRzID0geyB7CisJCQkubmFtZSAgID0gbmFtZV90diwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUyLAorCQkJLnR2ICAgICA9IDEsCisJCQkuZ3BpbyAgID0gMHg2MjQwMDAsCisJCX0sIHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHg2MjQwMDAsCisJCX0sIHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4NjI0MDAwLAorCQl9IH0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUyLAorCQkJLmdwaW8gICA9IDB4NjI0MDAxLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX0hEVFZfUENJXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFEUyBUZWNoIEluc3RhbnQgSERUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVFVWMTIzNkQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgICAgICAgICA9IHsgeworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSwgeworCQkJLm5hbWUgPSBuYW1lX2NvbXAsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LCB7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSB9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVNVU1RlS19USUdFUl0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJBc3VzIFRpZ2VyIFJldjoxLjAwIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50dW5lcl9jb25maWcgICA9IDAsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDIwMDAwMCwKKwkJLmlucHV0cyA9IHsgeworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LCB7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS5ncGlvICAgPSAweDAyMDAwMDAsCisJCX0sCisJfSwKIH07CiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwpAQCAtNDc3Nyw2ICs0OTc0LDEyIEBACiAKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhmMTFkLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTEzNUEsCisJfSwgeworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5zdWJkZXZpY2UgICAgPSAweDIwMDQsCkBAIC01MTU3LDYgKzUzNjAsMTIgQEAKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRU5DT1JFX0VOTFRWX0ZNLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDFhN2YsCisJCS5zdWJkZXZpY2UgICAgPSAweDIwMDgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VOQ09SRV9FTkxUVl9GTTUzLAorCX0sIHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxNTNiLAogCQkuc3ViZGV2aWNlICAgID0gMHgxMTc1LApAQCAtNTE4Myw4ICs1MzkyLDggQEAKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxMDQzLAotCQkuc3ViZGV2aWNlICAgID0gMHg0ODU3LAotCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0RVQUwsCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4NTcsCQkvKiBSRVY6MS4wMCAqLworCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RJR0VSLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCkBAIC01NDE1LDYgKzU2MjQsMTIgQEAKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1Q3NTAsCiAJfSwgewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsIC8qIFNBQTcxMzVITCAqLworCQkuc3VidmVuZG9yICAgID0gMHgxNDIxLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzgwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9IRFRWX1BDSSwKKwl9LCB7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OSwKIAkJLnN1YmRldmljZSAgICA9IDB4MTUwMiwKQEAgLTU0MzIsNiArNTY0NywxMiBAQAogCQkuc3ViZGV2aWNlICAgID0gMHhmNjM2LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTEwMywKIAl9LCB7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0MywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg3OCwgLyogUkVWOjEuMDJHICovCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVElHRVJfM0lOMSwKKwl9LCB7CiAJCS8qIC0tLSBib2FyZHMgd2l0aG91dCBlZXByb20gKyBzdWJzeXN0ZW0gSUQgLS0tICovCiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKQEAgLTU1NDAsNyArNTc2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzYWE3MTM0X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21tYW5kLCBpbnQgYXJnKQoraW50IHNhYTcxMzRfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBwcml2OwogCWlmIChkZXYgIT0gTlVMTCkgewpAQCAtNTYyMCw2ICs1ODQxLDcgQEAKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT181MDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk06CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV83Nzc6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTM1QToKIC8qICAgICAgY2FzZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTTogICovIC8qIG5vdCBmaW5pc2hlZCB5ZXQgKi8KIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVUzoKQEAgLTU2NDQsNiArNTg2Niw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BMTZBUjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfRU5DT1JFX0VOTFRWOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9FTkNPUkVfRU5MVFZfRk06CisJY2FzZSBTQUE3MTM0X0JPQVJEX0VOQ09SRV9FTkxUVl9GTTUzOgogCWNhc2UgU0FBNzEzNF9CT0FSRF8xME1PT05TVFZNQVNURVIzOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9CRUhPTERfNDAxOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9CRUhPTERfNDAzOgpAQCAtNTY1Niw2ICs1ODc5LDcgQEAKIAljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEXzUwNUZNOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9CRUhPTERfNTA3XzlGTToKIAljYXNlIFNBQTcxMzRfQk9BUkRfR0VOSVVTX1RWR09fQTExTUNFOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9SRUFMX0FOR0VMXzIyMDoKIAkJZGV2LT5oYXNfcmVtb3RlID0gU0FBNzEzNF9SRU1PVEVfR1BJTzsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlNfTFIzMDA6CkBAIC01NzQ1LDYgKzU5NjksNyBAQAogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzExMGk6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaToKIAljYXNlIFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UVjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfTVNJX1RWQVRBTllXSEVSRV9QTFVTOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9IQVVQUEFVR0VfSFZSMTExMDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEXzYwN185Rk06CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF9NNjoKQEAgLTU5ODcsNiArNjIxMiw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaToKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0RWQlRfMjEwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9URVZJT05fRFZCVF8yMjBSRjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19USUdFUjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0hZQlJJRF9MTkE6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX01FRElPTl9NRDg4MDBfUVVBRFJPOgpAQCAtNjAwMiw2ICs2MjI4LDE0IEBACiAJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJCWJyZWFrOwogCX0KKwljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19USUdFUl8zSU4xOgorCXsKKwkJdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDYwfTsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gMHgwYiwgLmZsYWdzID0gMCwgLmJ1ZiA9IGRhdGEsCisJCQkJCQkJLmxlbiA9IHNpemVvZihkYXRhKX07CisJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisJCWJyZWFrOworCX0KIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCX1RSSU86CiAJewogCQl1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NjJ9OwpAQCAtNjAyNyw2ICs2MjYxLDcgQEAKIAkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9IRFRWX1BDSToKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0FUU0MxMTA6CiAJewogCQkvKiBlbmFibGUgdHVuZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwppbmRleCA3NWQ2MTg0Li5iNjg2YmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIGludCBzYWE3MTM0X3BndGFibGVfYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IHNhYTcxMzRfcGd0YWJsZSAqcHQpCiB7CiAJX19sZTMyICAgICAgICpjcHU7Ci0JZG1hX2FkZHJfdCAgIGRtYV9hZGRyOworCWRtYV9hZGRyX3QgICBkbWFfYWRkciA9IDA7CiAKIAljcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFNBQTcxMzRfUEdUQUJMRV9TSVpFLCAmZG1hX2FkZHIpOwogCWlmIChOVUxMID09IGNwdSkKQEAgLTM1OSwzMiArMzU5LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKIH0KIAotLyogcmVzZW5kcyBhIGN1cnJlbnQgYnVmZmVyIGluIHF1ZXVlIGFmdGVyIHJlc3VtZSAqLwotCi1zdGF0aWMgaW50IHNhYTcxMzRfYnVmZmVyX3JlcXVldWUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCi0JCQkJICBzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAqcSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9idWYgKmJ1ZiwgKm5leHQ7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+c2xvY2spOwotCi0JYnVmICA9IHEtPmN1cnI7Ci0JbmV4dCA9IGJ1ZjsKLQlkcHJpbnRrKCJidWZmZXJfcmVxdWV1ZVxuIik7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIDA7Ci0KLQlkcHJpbnRrKCJidWZmZXJfcmVxdWV1ZSA6IHJlc2VuZGluZyBhY3RpdmUgYnVmZmVycyBcbiIpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZSkpCi0JCW5leHQgPSBsaXN0X2VudHJ5KHEtPnF1ZXVlLm5leHQsIHN0cnVjdCBzYWE3MTM0X2J1ZiwKLQkJCQkJICB2Yi5xdWV1ZSk7Ci0JYnVmLT5hY3RpdmF0ZShkZXYsIGJ1ZiwgbmV4dCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBzYWE3MTM0X3NldF9kbWFiaXRzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQpAQCAtNDQyLDkgKzQxNiw3IEBACiAJLyogVFMgY2FwdHVyZSAtLSBkbWEgNSAqLwogCWlmIChkZXYtPnRzX3EuY3VycikgewogCQljdHJsIHw9IFNBQTcxMzRfTUFJTl9DVFJMX1RFNTsKLQkJaXJxICB8PSBTQUE3MTM0X0lSUTFfSU5URV9SQTJfMyB8Ci0JCQlTQUE3MTM0X0lSUTFfSU5URV9SQTJfMiB8Ci0JCQlTQUE3MTM0X0lSUTFfSU5URV9SQTJfMSB8CisJCWlycSAgfD0gU0FBNzEzNF9JUlExX0lOVEVfUkEyXzEgfAogCQkJU0FBNzEzNF9JUlExX0lOVEVfUkEyXzA7CiAJfQogCkBAIC03MjcsNiArNjk5LDEwIEBACiAJCQlpcnEyX21hc2sgfD0gU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4QTsKIAl9CiAKKwlpZiAoZGV2LT5oYXNfcmVtb3RlID09IFNBQTcxMzRfUkVNT1RFX0kyQykgeworCQlyZXF1ZXN0X21vZHVsZSgiaXIta2JkLWkyYyIpOworCX0KKwogCXNhYV93cml0ZWwoU0FBNzEzNF9JUlExLCAwKTsKIAlzYWFfd3JpdGVsKFNBQTcxMzRfSVJRMiwgaXJxMl9tYXNrKTsKIApAQCAtMTEzOSw2ICsxMTE1LDMyIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KKworLyogcmVzZW5kcyBhIGN1cnJlbnQgYnVmZmVyIGluIHF1ZXVlIGFmdGVyIHJlc3VtZSAqLworc3RhdGljIGludCBzYWE3MTM0X2J1ZmZlcl9yZXF1ZXVlKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAorCQkJCSAgc3RydWN0IHNhYTcxMzRfZG1hcXVldWUgKnEpCit7CisJc3RydWN0IHNhYTcxMzRfYnVmICpidWYsICpuZXh0OworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPnNsb2NrKTsKKworCWJ1ZiAgPSBxLT5jdXJyOworCW5leHQgPSBidWY7CisJZHByaW50aygiYnVmZmVyX3JlcXVldWVcbiIpOworCisJaWYgKCFidWYpCisJCXJldHVybiAwOworCisJZHByaW50aygiYnVmZmVyX3JlcXVldWUgOiByZXNlbmRpbmcgYWN0aXZlIGJ1ZmZlcnMgXG4iKTsKKworCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWUpKQorCQluZXh0ID0gbGlzdF9lbnRyeShxLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc2FhNzEzNF9idWYsCisJCQkJCSAgdmIucXVldWUpOworCWJ1Zi0+YWN0aXZhdGUoZGV2LCBidWYsIG5leHQpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc2FhNzEzNF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ICwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IGJlNDhiOWIuLjg3YzEwOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC01NTMsNyArNTUzLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IHRkYTgyN3hfY29uZmlnIHRkYTgyN3hfY2ZnXzAgPSB7Ci0JLnR1bmVyX2NhbGxiYWNrID0gc2FhNzEzNF90dW5lcl9jYWxsYmFjaywKIAkuaW5pdCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0LAogCS5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcCwKIAkuY29uZmlnID0gMCwKQEAgLTU2MSw3ICs1NjAsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB0ZGE4Mjd4X2NvbmZpZyB0ZGE4Mjd4X2NmZ18xID0gewotCS50dW5lcl9jYWxsYmFjayA9IHNhYTcxMzRfdHVuZXJfY2FsbGJhY2ssCiAJLmluaXQgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfaW5pdCwKIAkuc2xlZXAgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2xlZXAsCiAJLmNvbmZpZyA9IDEsCkBAIC01NjksNyArNTY3LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhODI3eF9jb25maWcgdGRhODI3eF9jZmdfMiA9IHsKLQkudHVuZXJfY2FsbGJhY2sgPSBzYWE3MTM0X3R1bmVyX2NhbGxiYWNrLAogCS5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQsCiAJLnNsZWVwID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NsZWVwLAogCS5jb25maWcgPSAyLApAQCAtNTc3LDcgKzU3NCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHRkYTgyN3hfY29uZmlnIHRkYTgyN3hfY2ZnXzJfc3c0MiA9IHsKLQkudHVuZXJfY2FsbGJhY2sgPSBzYWE3MTM0X3R1bmVyX2NhbGxiYWNrLAogCS5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQsCiAJLnNsZWVwID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NsZWVwLAogCS5jb25maWcgPSAyLApAQCAtNzk5LDYgKzc5NSwyMCBAQAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCiB9OwogCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBhc3VzX3RpZ2VyXzNpbjFfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwYiwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMTFfSSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLmFudGVubmFfc3dpdGNoID0gMSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBzcGVjaWFsIGNhc2U6IHRoaXMgY2FyZCB1c2VzIHNhYTcxM3ggR1BJTzIyIGZvciB0aGUgbW9kZSBzd2l0Y2gKICAqLwpAQCAtODIyLDcgKzgzMiw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhODI3eF9jb25maWcgYWRzX2R1b19jZmcgPSB7Ci0JLnR1bmVyX2NhbGxiYWNrID0gc2FhNzEzNF90dW5lcl9jYWxsYmFjaywKIAkuaW5pdCA9IGFkc19kdW9fdHVuZXJfaW5pdCwKIAkuc2xlZXAgPSBhZHNfZHVvX3R1bmVyX3NsZWVwLAogCS5jb25maWcgPSAwCkBAIC0xMTQ3LDYgKzExNTYsNyBAQAogCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCiAJCQkJICAgTlVMTCwgRFZCX1BMTF9UREhVMik7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfSU5TVEFOVF9IRFRWX1BDSToKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0FUU0MxMTA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChueHQyMDB4X2F0dGFjaCwgJmt3b3JsZGF0c2MxMTAsCiAJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CkBAIC0xMzAwLDYgKzEzMTAsMzYgQEAKIAkJCQkJCSZkZXYtPmkyY19hZGFwKTsKIAkJYXR0YWNoX3hjMzAyOCA9IDE7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RJR0VSXzNJTjE6CisJCWlmICghdXNlX2Zyb250ZW5kKSB7ICAgICAvKiB0ZXJyZXN0cmlhbCAqLworCQkJaWYgKGNvbmZpZ3VyZV90ZGE4Mjd4X2ZlKGRldiwgJmFzdXNfdGlnZXJfM2luMV9jb25maWcsCisJCQkJCQkJJnRkYTgyN3hfY2ZnXzIpIDwgMCkKKwkJCQlnb3RvIGRldHRhY2hfZnJvbnRlbmQ7CisJCX0gZWxzZSB7ICAJCS8qIHNhdGVsbGl0ZSAqLworCQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDg2X2F0dGFjaCwKKwkJCQkJCSZmbHlkdmJzLCAmZGV2LT5pMmNfYWRhcCk7CisJCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCQlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwKKwkJCQkJCWRldi0+ZHZiLmZyb250ZW5kLCAweDYwLAorCQkJCQkJJmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKKwkJCQkJd3ByaW50aygiJXM6IEFzdXMgVGlnZXIgM2luMSwgbm8gIgorCQkJCQkJInRkYTgyNnggZm91bmQhXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWdvdG8gZGV0dGFjaF9mcm9udGVuZDsKKwkJCQl9CisJCQkJaWYgKGR2Yl9hdHRhY2gobG5icDIxX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCisJCQkJCQkmZGV2LT5pMmNfYWRhcCwgMCwgMCkgPT0gTlVMTCkgeworCQkJCQl3cHJpbnRrKCIlczogQXN1cyBUaWdlciAzaW4xLCBubyBsbmJwMjEiCisJCQkJCQkiIGZvdW5kIVxuIiwgX19mdW5jX18pOworCQkJCQlnb3RvIGRldHRhY2hfZnJvbnRlbmQ7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RJR0VSOgorCQlpZiAoY29uZmlndXJlX3RkYTgyN3hfZmUoZGV2LCAmcGhpbGlwc190aWdlcl9jb25maWcsCisJCQkJCSAmdGRhODI3eF9jZmdfMCkgPCAwKQorCQkJZ290byBkZXR0YWNoX2Zyb250ZW5kOworCQlicmVhazsKIAlkZWZhdWx0OgogCQl3cHJpbnRrKCJIdWg/IHVua25vd24gRFZCIGNhcmQ/XG4iKTsKIAkJYnJlYWs7CkBAIC0xMzI3LDYgKzEzNjcsOCBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzL2R2YjogZnJvbnRlbmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQorCS8qIGRlZmluZSBnZW5lcmFsLXB1cnBvc2UgY2FsbGJhY2sgcG9pbnRlciAqLworCWRldi0+ZHZiLmZyb250ZW5kLT5jYWxsYmFjayA9IHNhYTcxMzRfdHVuZXJfY2FsbGJhY2s7CiAKIAkvKiByZWdpc3RlciBldmVyeXRoaW5nIGVsc2UgKi8KIAlyZXQgPSB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoJmRldi0+ZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT5wY2ktPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwppbmRleCBjMGM1ZDc1Li45YTg3NjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zYWE2NzUyaHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNjMsMTAgKzY0LDE5IEBACiAKIHN0YXRpYyBpbnQgdHNfaW5pdF9lbmNvZGVyKHN0cnVjdCBzYWE3MTM0X2RldiogZGV2KQogewotCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBjdHJscyA9IHsgVjRMMl9DVFJMX0NMQVNTX01QRUcsIDAgfTsKKwl1MzIgbGVhZGluZ19udWxsX2J5dGVzID0gMDsKIAorCS8qIElmIG1vcmUgY2FyZHMgc3RhcnQgdG8gbmVlZCB0aGlzLCB0aGVuIHRoaXMKKwkgICBzaG91bGQgcHJvYmFibHkgYmUgYWRkZWQgdG8gdGhlIGNhcmQgZGVmaW5pdGlvbnMuICovCisJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF9NNjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEX002MzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQkVIT0xEX002X0VYVFJBOgorCQlsZWFkaW5nX251bGxfYnl0ZXMgPSAxOworCQlicmVhazsKKwl9CiAJdHNfcmVzZXRfZW5jb2RlcihkZXYpOwotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX0VYVF9DVFJMUywgJmN0cmxzKTsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX0lOSVQsICZsZWFkaW5nX251bGxfYnl0ZXMpOwogCWRldi0+ZW1wcmVzc19zdGFydGVkID0gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc5LDkgKzg5LDExIEBACiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CiAJaW50IGVycjsKIAorCWxvY2tfa2VybmVsKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZzYWE3MTM0X2Rldmxpc3QsIGRldmxpc3QpCiAJCWlmIChkZXYtPmVtcHJlc3NfZGV2ICYmIGRldi0+ZW1wcmVzc19kZXYtPm1pbm9yID09IG1pbm9yKQogCQkJZ290byBmb3VuZDsKKwl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FTk9ERVY7CiAgZm91bmQ6CiAKQEAgLTEwMyw2ICsxMTUsNyBAQAogZG9uZV91cDoKIAltdXRleF91bmxvY2soJmRldi0+ZW1wcmVzc190c3EudmJfbG9jayk7CiBkb25lOgorCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yOTAsMTUgKzMwMyw2IEBACiAJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9mZigmZGV2LT5lbXByZXNzX3RzcSk7CiB9CiAKLXN0YXRpYyBpbnQgc2FhNzEzNF9pMmNfY2FsbF9zYWE2NzUyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaWYgKGRldi0+bXBlZ19pMmNfY2xpZW50ID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBkZXYtPm1wZWdfaTJjX2NsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGRldi0+bXBlZ19pMmNfY2xpZW50LAotCQkJCQkJCQljbWQsIGFyZyk7Ci19Ci0KIHN0YXRpYyBpbnQgZW1wcmVzc19zX2V4dF9jdHJscyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmN0cmxzKQogewpAQCAtNDAwLDYgKzQwNCwzOSBAQAogCXJldHVybiBzYWE3MTM0X2kyY19jYWxsX3NhYTY3NTIoZGV2LCBWSURJT0NfUVVFUllNRU5VLCBjKTsKIH0KIAorc3RhdGljIGludCBlbXByZXNzX2dfY2hpcF9pZGVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJICAgICAgIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLT5yZXZpc2lvbiA9IDA7CisJaWYgKGRldi0+bXBlZ19pMmNfY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGlwLT5tYXRjaF90eXBlID09IFY0TDJfQ0hJUF9NQVRDSF9JMkNfRFJJVkVSICYmCisJICAgIGNoaXAtPm1hdGNoX2NoaXAgPT0gSTJDX0RSSVZFUklEX1NBQTY3NTJIUykKKwkJcmV0dXJuIHNhYTcxMzRfaTJjX2NhbGxfc2FhNjc1MihkZXYsIFZJRElPQ19HX0NISVBfSURFTlQsIGNoaXApOworCWlmIChjaGlwLT5tYXRjaF90eXBlID09IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAmJgorCSAgICBjaGlwLT5tYXRjaF9jaGlwID09IGRldi0+bXBlZ19pMmNfY2xpZW50LT5hZGRyKQorCQlyZXR1cm4gc2FhNzEzNF9pMmNfY2FsbF9zYWE2NzUyKGRldiwgVklESU9DX0dfQ0hJUF9JREVOVCwgY2hpcCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZW1wcmVzc19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmlkKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHNhYTcxMzRfc19zdGRfaW50ZXJuYWwoZGV2LCBOVUxMLCBpZCk7Cit9CisKK3N0YXRpYyBpbnQgZW1wcmVzc19nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmlkKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJKmlkID0gZGV2LT50dm5vcm0tPmlkOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0c19mb3BzID0KIHsKIAkub3duZXIJICA9IFRISVNfTU9EVUxFLApAQCAtNDI4LDExICs0NjUsMTMgQEAKIAkudmlkaW9jX2VudW1faW5wdXQJCT0gZW1wcmVzc19lbnVtX2lucHV0LAogCS52aWRpb2NfZ19pbnB1dAkJCT0gZW1wcmVzc19nX2lucHV0LAogCS52aWRpb2Nfc19pbnB1dAkJCT0gZW1wcmVzc19zX2lucHV0LAotCiAJLnZpZGlvY19xdWVyeWN0cmwJCT0gZW1wcmVzc19xdWVyeWN0cmwsCiAJLnZpZGlvY19xdWVyeW1lbnUJCT0gZW1wcmVzc19xdWVyeW1lbnUsCiAJLnZpZGlvY19nX2N0cmwJCQk9IGVtcHJlc3NfZ19jdHJsLAogCS52aWRpb2Nfc19jdHJsCQkJPSBlbXByZXNzX3NfY3RybCwKKwkudmlkaW9jX2dfY2hpcF9pZGVudCAJCT0gZW1wcmVzc19nX2NoaXBfaWRlbnQsCisJLnZpZGlvY19zX3N0ZAkJCT0gZW1wcmVzc19zX3N0ZCwKKwkudmlkaW9jX2dfc3RkCQkJPSBlbXByZXNzX2dfc3RkLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKaW5kZXggNWY3MTNlNi4uMjBjMWIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMKQEAgLTMzNyw2ICszMzcsNyBAQAogCQljYXNlIDB4NDc6CiAJCWNhc2UgMHg3MToKIAkJY2FzZSAweDJkOgorCQljYXNlIDB4MzA6CiAJCXsKIAkJCXN0cnVjdCBJUl9pMmMgKmlyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJCQlkMXByaW50aygiJXMgaTJjIElSIGRldGVjdGVkICglcykuXG4iLApAQCAtNDI3LDYgKzQyOCwxNiBAQAogCWkyY19jbGllbnRzX2NvbW1hbmQoJmRldi0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIH0KIAoraW50IHNhYTcxMzRfaTJjX2NhbGxfc2FhNjc1MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWlmIChkZXYtPm1wZWdfaTJjX2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZGV2LT5tcGVnX2kyY19jbGllbnQtPmRyaXZlci0+Y29tbWFuZChkZXYtPm1wZWdfaTJjX2NsaWVudCwKKwkJCQkJCQkJY21kLCBhcmcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzEzNF9pMmNfY2FsbF9zYWE2NzUyKTsKKwogaW50IHNhYTcxMzRfaTJjX3JlZ2lzdGVyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCWRldi0+aTJjX2FkYXAgPSBzYWE3MTM0X2FkYXBfdGVtcGxhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCBhZDA4ZDEzLi5jNTNmZDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTYyLDggKzYyLDExIEBACiAjZGVmaW5lIGkyY2RwcmludGsoZm10LCBhcmcuLi4pICAgIGlmIChpcl9kZWJ1ZykgXAogCXByaW50ayhLRVJOX0RFQlVHICIlcy9pcjogIiBmbXQsIGlyLT5jLm5hbWUgLCAjIyBhcmcpCiAKLS8qKiByYzUgZnVuY3Rpb25zICovCisvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBSQzUgYW5kIE5FQyBkZWNvZGluZyBhdCBHUElPMTYgb3IgR1BJTzE4ICovCiBzdGF0aWMgaW50IHNhYTcxMzRfcmM1X2lycShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitzdGF0aWMgaW50IHNhYTcxMzRfbmVjX2lycShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CitzdGF0aWMgdm9pZCBuZWNfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgc2FhNzEzNF9uZWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gR1BJTyBnZW5lcmljIGtleWNvZGUgYnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xMTUsNiArMTE4LDUzIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDaGlwIHNwZWNpZmljIEkyQyBrZXkgYnVpbGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGludCBnZXRfa2V5X21zaV90dmFueXdoZXJlX3BsdXMoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LAorCQkJCSAgICAgICB1MzIgKmlyX3JhdykKK3sKKwl1bnNpZ25lZCBjaGFyIGI7CisJaW50IGdwaW87CisKKwkvKiA8ZGV2PiBpcyBuZWVkZWQgdG8gYWNjZXNzIEdQSU8uIFVzZWQgYnkgdGhlIHNhYV9yZWFkbCBtYWNyby4gKi8KKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGlyLT5jLmFkYXB0ZXItPmFsZ29fZGF0YTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZHByaW50aygiZ2V0X2tleV9tc2lfdHZhbnl3aGVyZV9wbHVzOiAiCisJCQkiZ2lyLT5jLmFkYXB0ZXItPmFsZ29fZGF0YSBpcyBOVUxMIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJpc2luZyBTQUE3MTM0X0dQSU9fR1BSRVNDQU4gcmVhZHMgdGhlIHN0YXR1cyAqLworCisJc2FhX2NsZWFyYihTQUE3MTM0X0dQSU9fR1BNT0RFMywgU0FBNzEzNF9HUElPX0dQUkVTQ0FOKTsKKwlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BNT0RFMywgU0FBNzEzNF9HUElPX0dQUkVTQ0FOKTsKKworCWdwaW8gPSBzYWFfcmVhZGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyKTsKKworCS8qIEdQSU8mMHg0MCBpcyBwdWxzZWQgbG93IHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZC4gRG9uJ3QgZG8KKwkgICBJMkMgcmVjZWl2ZSBpZiBncGlvJjB4NDAgaXMgbm90IGxvdy4gKi8KKworCWlmIChncGlvICYgMHg0MCkKKwkJcmV0dXJuIDA7ICAgICAgIC8qIE5vIGJ1dHRvbiBwcmVzcyAqLworCisJLyogR1BJTyBzYXlzIHRoZXJlIGlzIGEgYnV0dG9uIHByZXNzLiBHZXQgaXQuICovCisKKwlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoJmlyLT5jLCAmYiwgMSkpIHsKKwkJaTJjZHByaW50aygicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIE5vIGJ1dHRvbiBwcmVzcyAqLworCisJaWYgKGIgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisKKwkvKiBCdXR0b24gcHJlc3NlZCAqLworCisJZHByaW50aygiZ2V0X2tleV9tc2lfdHZhbnl3aGVyZV9wbHVzOiBLZXkgPSAweCUwMlhcbiIsIGIpOworCSppcl9rZXkgPSBiOworCSppcl9yYXcgPSBiOworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGdldF9rZXlfcHVycGxldHYoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKIHsKIAl1bnNpZ25lZCBjaGFyIGI7CkBAIC0yODAsNyArMzMwLDkgQEAKIHsKIAlzdHJ1Y3QgY2FyZF9pciAqaXIgPSBkZXYtPnJlbW90ZTsKIAotCWlmICghaXItPnBvbGxpbmcgJiYgIWlyLT5yYzVfZ3BpbykgeworCWlmIChpci0+bmVjX2dwaW8pIHsKKwkJc2FhNzEzNF9uZWNfaXJxKGRldik7CisJfSBlbHNlIGlmICghaXItPnBvbGxpbmcgJiYgIWlyLT5yYzVfZ3BpbykgewogCQlidWlsZF9rZXkoZGV2KTsKIAl9IGVsc2UgaWYgKGlyLT5yYzVfZ3BpbykgewogCQlzYWE3MTM0X3JjNV9pcnEoZGV2KTsKQEAgLTMxNiw2ICszNjgsMTAgQEAKIAkJaXItPmFkZHIgPSAweDE3OwogCQlpci0+cmM1X2tleV90aW1lb3V0ID0gaXJfcmM1X2tleV90aW1lb3V0OwogCQlpci0+cmM1X3JlbW90ZV9nYXAgPSBpcl9yYzVfcmVtb3RlX2dhcDsKKwl9IGVsc2UgaWYgKGlyLT5uZWNfZ3BpbykgeworCQlzZXR1cF90aW1lcigmaXItPnRpbWVyX2tleXVwLCBzYWE3MTM0X25lY190aW1lciwKKwkJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOworCQl0YXNrbGV0X2luaXQoJmlyLT50bGV0LCBuZWNfdGFzaywgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAl9CiB9CiAKQEAgLTMzNSw2ICszOTEsNyBAQAogCXUzMiBtYXNrX2tleXVwICAgPSAwOwogCWludCBwb2xsaW5nICAgICAgPSAwOwogCWludCByYzVfZ3BpbwkgPSAwOworCWludCBuZWNfZ3BpbwkgPSAwOwogCWludCBpcl90eXBlICAgICAgPSBJUl9UWVBFX09USEVSOwogCWludCBlcnI7CiAKQEAgLTM5MSw2ICs0NDgsMTIgQEAKIAkJc2FhX3NldGIoU0FBNzEzNF9HUElPX0dQTU9ERTAsIDB4NCk7CiAJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAsIDB4NCk7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTEzNUE6CisJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX2F2ZXJtZWRpYV9tMTM1YTsKKwkJbWFza19rZXlkb3duID0gMHgwMDQwMDAwOworCQltYXNrX2tleWNvZGUgPSAweDAwMDEzZjsKKwkJbmVjX2dwaW8gICAgID0gMTsKKwkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV83Nzc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BMTZBUjoKIAkJaXJfY29kZXMgICAgID0gaXJfY29kZXNfYXZlcm1lZGlhOwpAQCAtNDk5LDYgKzU2MiwxMiBAQAogCQltYXNrX2tleXVwICAgPSAweDA0MDAwMDsKIAkJcG9sbGluZyAgICAgID0gNTA7IC8vIG1zCiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9FTkNPUkVfRU5MVFZfRk01MzoKKwkJaXJfY29kZXMgICAgID0gaXJfY29kZXNfZW5jb3JlX2VubHR2X2ZtNTM7CisJCW1hc2tfa2V5ZG93biA9IDB4MDA0MDAwMDsKKwkJbWFza19rZXljb2RlID0gMHgwMDAwN2Y7CisJCW5lY19ncGlvID0gMTsKKwkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEXzEwTU9PTlNUVk1BU1RFUjM6CiAJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX2VuY29yZV9lbmx0djsKIAkJbWFza19rZXljb2RlID0gMHg1ZjgwMDAwOwpAQCAtNTExLDYgKzU4MCwxMiBAQAogCQltYXNrX2tleWRvd24gPSAweGYwMDAwMDsKIAkJcG9sbGluZyA9IDUwOyAvKiBtcyAqLwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfUkVBTF9BTkdFTF8yMjA6CisJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX3JlYWxfYXVkaW9fMjIwXzMyX2tleXM7CisJCW1hc2tfa2V5Y29kZSA9IDB4M2YwMDsKKwkJbWFza19rZXl1cCAgID0gMHg0MDAwOworCQlwb2xsaW5nID0gNTA7IC8qIG1zICovCisJCWJyZWFrOwogCX0KIAlpZiAoTlVMTCA9PSBpcl9jb2RlcykgewogCQlwcmludGsoIiVzOiBPb3BzOiBJUiBjb25maWcgZXJyb3IgW2NhcmQ9JWRdXG4iLApAQCAtNTMzLDYgKzYwOCw3IEBACiAJaXItPm1hc2tfa2V5dXAgICA9IG1hc2tfa2V5dXA7CiAJaXItPnBvbGxpbmcgICAgICA9IHBvbGxpbmc7CiAJaXItPnJjNV9ncGlvCSA9IHJjNV9ncGlvOworCWlyLT5uZWNfZ3BpbwkgPSBuZWNfZ3BpbzsKIAogCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCiAJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJzYWE3MTM0IElSICglcykiLApAQCAtNjEyLDYgKzY4OCwxMSBAQAogCQlpci0+Z2V0X2tleSAgID0gZ2V0X2tleV9wdXJwbGV0djsKIAkJaXItPmlyX2NvZGVzICA9IGlyX2NvZGVzX3B1cnBsZXR2OwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfTVNJX1RWQVRBTllXSEVSRV9QTFVTOgorCQlzbnByaW50Zihpci0+Yy5uYW1lLCBzaXplb2YoaXItPmMubmFtZSksICJNU0kgVFZAbnl3aGVyZSBQbHVzIik7CisJCWlyLT5nZXRfa2V5ICA9IGdldF9rZXlfbXNpX3R2YW55d2hlcmVfcGx1czsKKwkJaXItPmlyX2NvZGVzID0gaXJfY29kZXNfbXNpX3R2YW55d2hlcmVfcGx1czsKKwkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTEwOgogCQlzbnByaW50Zihpci0+Yy5uYW1lLCBzaXplb2YoaXItPmMubmFtZSksICJIVlIgMTExMCIpOwogCQlpci0+Z2V0X2tleSAgID0gZ2V0X2tleV9odnIxMTEwOwpAQCAtNjc1LDggKzc1NiwxMjUgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKKworLyogT24gTkVDIHByb3RvY29sLCBPbmUgaGFzIDIuMjUgbXMsIGFuZCB6ZXJvIGhhcyAxLjEyNSBtcworICAgVGhlIGZpcnN0IHB1bHNlIChzdGFydCkgaGFzIDkgKyA0LjUgbXMKICAqLworCitzdGF0aWMgdm9pZCBzYWE3MTM0X25lY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSAoc3RydWN0IHNhYTcxMzRfZGV2ICopIGRhdGE7CisJc3RydWN0IGNhcmRfaXIgKmlyID0gZGV2LT5yZW1vdGU7CisKKwlkcHJpbnRrKCJDYW5jZWwga2V5IHJlcGVhdFxuIik7CisKKwlpcl9pbnB1dF9ub2tleShpci0+ZGV2LCAmaXItPmlyKTsKK30KKworc3RhdGljIHZvaWQgbmVjX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gKHN0cnVjdCBzYWE3MTM0X2RldiAqKSBkYXRhOworCXN0cnVjdCBjYXJkX2lyICppcjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgY291bnQsIHB1bHNlLCBvbGRwdWxzZSwgZ2FwOworCXUzMiBpcmNvZGUgPSAwLCBub3RfY29kZSA9IDA7CisJaW50IG5nYXAgPSAwOworCisJaWYgKCFkYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2FhNzEzeC9pcjogQ2FuJ3QgcmVjb3ZlciBkZXYgc3RydWN0XG4iKTsKKwkJLyogR1BJTyB3aWxsIGJlIGtlcHQgZGlzYWJsZWQgKi8KKwkJcmV0dXJuOworCX0KKworCWlyID0gZGV2LT5yZW1vdGU7CisKKwkvKiByaXNpbmcgU0FBNzEzNF9HUElPX0dQUkVTQ0FOIHJlYWRzIHRoZSBzdGF0dXMgKi8KKwlzYWFfY2xlYXJiKFNBQTcxMzRfR1BJT19HUE1PREUzLCBTQUE3MTM0X0dQSU9fR1BSRVNDQU4pOworCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUzLCBTQUE3MTM0X0dQSU9fR1BSRVNDQU4pOworCisJb2xkcHVsc2UgPSBzYWFfcmVhZGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyKSAmIGlyLT5tYXNrX2tleWRvd247CisJcHVsc2UgPSBvbGRwdWxzZTsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWlyLT5iYXNlX3RpbWUgPSB0djsKKworCS8qIERlY29kZSBORUMgcHVsc2Vjb2RlLiBUaGlzIGNvZGUgY2FuIHRha2UgdXAgdG8gNzYuNSBtcyB0byBydW4uCisJICAgVW5mb3J0dW5hdGVseSwgdXNpbmcgSVJRIHRvIGRlY29kZSBwdWxzZSBkaWRuJ3Qgd29yaywgc2luY2UgaXQgdXNlcworCSAgIGEgcHVsc2UgdHJhaW4gb2YgMzhLSHouIFRoaXMgbWVhbnMgb25lIHB1bHNlIG9uIGVhY2ggNTIgdXMKKwkgKi8KKwlkbyB7CisJCS8qIFdhaXQgdW50aWwgdGhlIGVuZCBvZiBwdWxzZS9zcGFjZSBvciA1IG1zICovCisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDUwMDsgY291bnQrKykgIHsKKwkJCXVkZWxheSgxMCk7CisJCQkvKiByaXNpbmcgU0FBNzEzNF9HUElPX0dQUkVTQ0FOIHJlYWRzIHRoZSBzdGF0dXMgKi8KKwkJCXNhYV9jbGVhcmIoU0FBNzEzNF9HUElPX0dQTU9ERTMsIFNBQTcxMzRfR1BJT19HUFJFU0NBTik7CisJCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BNT0RFMywgU0FBNzEzNF9HUElPX0dQUkVTQ0FOKTsKKwkJCXB1bHNlID0gc2FhX3JlYWRsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMikKKwkJCQkmIGlyLT5tYXNrX2tleWRvd247CisJCQlpZiAocHVsc2UgIT0gb2xkcHVsc2UpCisJCQkJYnJlYWs7CisJCX0KKworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJZ2FwID0gMTAwMDAwMCAqICh0di50dl9zZWMgLSBpci0+YmFzZV90aW1lLnR2X3NlYykgKworCQkJCXR2LnR2X3VzZWMgLSBpci0+YmFzZV90aW1lLnR2X3VzZWM7CisKKwkJaWYgKCFwdWxzZSkgeworCQkJLyogQml0IDAgaGFzIDU2MCB1cywgd2hpbGUgYml0IDEgaGFzIDExMjAgdXMuCisJCQkgICBEbyBzb21ldGhpbmcgb25seSBpZiBiaXQgPT0gMQorCQkJICovCisJCQlpZiAobmdhcCAmJiAoZ2FwID4gNTYwICsgMjgwKSkgeworCQkJCXVuc2lnbmVkIGludCBzaGlmdCA9IG5nYXAgLSAxOworCisJCQkJLyogQWRkcmVzcyBmaXJzdCwgdGhlbiBjb21tYW5kICovCisJCQkJaWYgKHNoaWZ0IDwgOCkgeworCQkJCQlzaGlmdCArPSA4OworCQkJCQlpcmNvZGUgfD0gMSA8PCBzaGlmdDsKKwkJCQl9IGVsc2UgaWYgKHNoaWZ0IDwgMTYpIHsKKwkJCQkJbm90X2NvZGUgfD0gMSA8PCBzaGlmdDsKKwkJCQl9IGVsc2UgaWYgKHNoaWZ0IDwgMjQpIHsKKwkJCQkJc2hpZnQgLT0gMTY7CisJCQkJCWlyY29kZSB8PSAxIDw8IHNoaWZ0OworCQkJCX0gZWxzZSB7CisJCQkJCXNoaWZ0IC09IDI0OworCQkJCQlub3RfY29kZSB8PSAxIDw8IHNoaWZ0OworCQkJCX0KKwkJCX0KKwkJCW5nYXArKzsKKwkJfQorCisKKwkJaXItPmJhc2VfdGltZSA9IHR2OworCisJCS8qIFRJTUVPVVQgLSBMb25nIHB1bHNlICovCisJCWlmIChnYXAgPj0gNTAwMCkKKwkJCWJyZWFrOworCQlvbGRwdWxzZSA9IHB1bHNlOworCX0gd2hpbGUgKG5nYXAgPCAzMik7CisKKwlpZiAobmdhcCA9PSAzMikgeworCQkvKiBGSVhNRTogc2hvdWxkIGNoZWNrIGlmIG5vdF9jb2RlID09IH5pcmNvZGUgKi8KKwkJaXItPmNvZGUgPSBpcl9leHRyYWN0X2JpdHMoaXJjb2RlLCBpci0+bWFza19rZXljb2RlKTsKKworCQlkcHJpbnRrKCJzY2FuY29kZSA9IDB4JTAyeCAoY29kZSA9IDB4JTAyeCwgbm90Y29kZT0gMHglMDJ4KVxuIiwKKwkJCSBpci0+Y29kZSwgaXJjb2RlLCBub3RfY29kZSk7CisKKwkJaXJfaW5wdXRfa2V5ZG93bihpci0+ZGV2LCAmaXItPmlyLCBpci0+Y29kZSwgaXItPmNvZGUpOworCX0gZWxzZQorCQlkcHJpbnRrKCJSZXBlYXQgbGFzdCBrZXlcbiIpOworCisJLyogS2VlcCByZXBlYXRpbmcgdGhlIGxhc3Qga2V5ICovCisJbW9kX3RpbWVyKCZpci0+dGltZXJfa2V5dXAsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDE1MCkpOworCisJc2FhX3NldGwoU0FBNzEzNF9JUlEyLCBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTgpOworfQorCitzdGF0aWMgaW50IHNhYTcxMzRfbmVjX2lycShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgY2FyZF9pciAqaXIgPSBkZXYtPnJlbW90ZTsKKworCXNhYV9jbGVhcmwoU0FBNzEzNF9JUlEyLCBTQUE3MTM0X0lSUTJfSU5URV9HUElPMTgpOworCXRhc2tsZXRfc2NoZWR1bGUoJmlyLT50bGV0KTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKaW5kZXggZWFlNzJmZC4uZWY1NWE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCkBAIC02NiwxMSArNjYsMjkgQEAKIAlzYWE3MTM0X3NldF9kbWFiaXRzKGRldik7CiAKIAltb2RfdGltZXIoJmRldi0+dHNfcS50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKworCWlmIChkZXYtPnRzX3N0YXRlID09IFNBQTcxMzRfVFNfQlVGRl9ET05FKSB7CisJCS8qIENsZWFyIFRTIGNhY2hlICovCisJCWRldi0+YnVmZl9jbnQgPSAwOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfU0VSSUFMMSwgMHgwMCk7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9UU19TRVJJQUwxLCAweDAzKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1NFUklBTDEsIDB4MDApOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfU0VSSUFMMSwgMHgwMSk7CisKKwkJLyogVFMgY2xvY2sgbm9uLWludmVydGVkICovCisJCXNhYV93cml0ZWIoU0FBNzEzNF9UU19TRVJJQUwxLCAweDAwKTsKKworCQkvKiBTdGFydCBUUyBzdHJlYW0gKi8KKwkJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1NFUklBTDAsIDB4NDApOworCQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfUEFSQUxMRUwsIDB4RUMpOworCQlkZXYtPnRzX3N0YXRlID0gU0FBNzEzNF9UU19TVEFSVEVEOworCX0KKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCi0JCQkgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKKwkJZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOwogCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CkBAIC0xMTAsMTYgKzEyOCwyMiBAQAogCQkJZ290byBvb3BzOwogCX0KIAotCS8qIGRtYTogc2V0dXAgY2hhbm5lbCA1ICg9IFRTKSAqLwotCWNvbnRyb2wgPSBTQUE3MTM0X1JTX0NPTlRST0xfQlVSU1RfMTYgfAotCQkgIFNBQTcxMzRfUlNfQ09OVFJPTF9NRSB8Ci0JCSAgKGJ1Zi0+cHQtPmRtYSA+PiAxMik7CisJZGV2LT5idWZmX2NudCsrOwogCi0Jc2FhX3dyaXRlYihTQUE3MTM0X1RTX0RNQTAsICgobGluZXMtMSkmMHhmZikpOwotCXNhYV93cml0ZWIoU0FBNzEzNF9UU19ETUExLCAoKChsaW5lcy0xKT4+OCkmMHhmZikpOwotCXNhYV93cml0ZWIoU0FBNzEzNF9UU19ETUEyLCAoKCgobGluZXMtMSk+PjE2KSYweDNmKSB8IDB4MDApKTsgLyogVFNOT1BJVD0wLCBUU0NPTEFQPTAgKi8KLQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNSksVFNfUEFDS0VUX1NJWkUpOwotCXNhYV93cml0ZWwoU0FBNzEzNF9SU19DT05UUk9MKDUpLGNvbnRyb2wpOworCWlmIChkZXYtPmJ1ZmZfY250ID09IGRldi0+dHMubnJfYnVmcykgeworCQlkZXYtPnRzX3N0YXRlID0gU0FBNzEzNF9UU19CVUZGX0RPTkU7CisJCS8qIGRtYTogc2V0dXAgY2hhbm5lbCA1ICg9IFRTKSAqLworCQljb250cm9sID0gU0FBNzEzNF9SU19DT05UUk9MX0JVUlNUXzE2IHwKKwkJCVNBQTcxMzRfUlNfQ09OVFJPTF9NRSB8CisJCQkoYnVmLT5wdC0+ZG1hID4+IDEyKTsKKworCQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfRE1BMCwgKGxpbmVzIC0gMSkgJiAweGZmKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X1RTX0RNQTEsICgobGluZXMgLSAxKSA+PiA4KSAmIDB4ZmYpOworCQkvKiBUU05PUElUPTAsIFRTQ09MQVA9MCAqLworCQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfRE1BMiwgKCgobGluZXMgLSAxKSA+PiAxNikgJiAweDNmKSB8IDB4MDApOworCQlzYWFfd3JpdGVsKFNBQTcxMzRfUlNfUElUQ0goNSksIFRTX1BBQ0tFVF9TSVpFKTsKKwkJc2FhX3dyaXRlbChTQUE3MTM0X1JTX0NPTlRST0woNSksIGNvbnRyb2wpOworCX0KIAogCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9QUkVQQVJFRDsKIAlidWYtPmFjdGl2YXRlID0gYnVmZmVyX2FjdGl2YXRlOwpAQCAtMTQwLDYgKzE2NCw4IEBACiAJaWYgKDAgPT0gKmNvdW50KQogCQkqY291bnQgPSBkZXYtPnRzLm5yX2J1ZnM7CiAJKmNvdW50ID0gc2FhNzEzNF9idWZmZXJfY291bnQoKnNpemUsKmNvdW50KTsKKwlkZXYtPmJ1ZmZfY250ID0gMDsKKwlkZXYtPnRzX3N0YXRlID0gU0FBNzEzNF9UU19TVE9QUEVEOwogCXJldHVybiAwOwogfQogCkBAIC0xNTQsNyArMTgwLDEzIEBACiBzdGF0aWMgdm9pZCBidWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzYWE3MTM0X2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLHN0cnVjdCBzYWE3MTM0X2J1Zix2Yik7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBxLT5wcml2X2RhdGE7CiAKKwlpZiAoZGV2LT50c19zdGF0ZSA9PSBTQUE3MTM0X1RTX1NUQVJURUQpIHsKKwkJLyogU3RvcCBUUyB0cmFuc3BvcnQgKi8KKwkJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1BBUkFMTEVMLCAweDZjKTsKKwkJZGV2LT50c19zdGF0ZSA9IFNBQTcxMzRfVFNfU1RPUFBFRDsKKwl9CiAJc2FhNzEzNF9kbWFfZnJlZShxLGJ1Zik7CiB9CiAKQEAgLTE4Miw3ICsyMTQsNyBAQAogCS8qIGRlYWN0aXZhdGUgVFMgc29mdHJlc2V0ICovCiAJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1NFUklBTDEsIDB4MDApOwogCS8qIFRTU09QIGhpZ2ggYWN0aXZlLCBUU1ZBTCBoaWdoIGFjdGl2ZSwgVFNMT0NLIGlnbm9yZWQgKi8KLQlzYWFfd3JpdGViKFNBQTcxMzRfVFNfUEFSQUxMRUwsIDB4ZWMpOworCXNhYV93cml0ZWIoU0FBNzEzNF9UU19QQVJBTExFTCwgMHg2Yyk7CiAJc2FhX3dyaXRlYihTQUE3MTM0X1RTX1BBUkFMTEVMX1NFUklBTCwgKFRTX1BBQ0tFVF9TSVpFLTEpKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfVFNfRE1BMCwgKChkZXYtPnRzLm5yX3BhY2tldHMtMSkmMHhmZikpOwogCXNhYV93cml0ZWIoU0FBNzEzNF9UU19ETUExLCAoKChkZXYtPnRzLm5yX3BhY2tldHMtMSk+PjgpJjB4ZmYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IDY4YzI2ODkuLjAyYmI2NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtNjI4LDYgKzYyOCw5IEBACiAKIAlpZiAoY2FyZF9pbihkZXYsIGRldi0+Y3RsX2lucHV0KS50dikKIAkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX1NfU1RELCAmZGV2LT50dm5vcm0tPmlkKTsKKwkvKiBTZXQgdGhlIGNvcnJlY3Qgbm9ybSBmb3IgdGhlIHNhYTY3NTJocy4gVGhpcyBmdW5jdGlvbgorCSAgIGRvZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBzYWE2NzUyaHMuICovCisJc2FhNzEzNF9pMmNfY2FsbF9zYWE2NzUyKGRldiwgVklESU9DX1NfU1RELCAmZGV2LT50dm5vcm0tPmlkKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2hfcHJlc2NhbGUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCB0YXNrLCBpbnQgcHJlc2NhbGUpCkBAIC0xMzMwLDYgKzEzMzMsOCBAQAogCXN0cnVjdCBzYWE3MTM0X2ZoICpmaDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlpbnQgcmFkaW8gPSAwOworCisJbG9ja19rZXJuZWwoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnNhYTcxMzRfZGV2bGlzdCwgZGV2bGlzdCkgewogCQlpZiAoZGV2LT52aWRlb19kZXYgJiYgKGRldi0+dmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikpCiAJCQlnb3RvIGZvdW5kOwpAQCAtMTM0Miw2ICsxMzQ3LDcgQEAKIAkJCWdvdG8gZm91bmQ7CiAJCX0KIAl9CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAtRU5PREVWOwogIGZvdW5kOgogCkBAIC0xMzUwLDggKzEzNTYsMTAgQEAKIAogCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCiAJZmggPSBremFsbG9jKHNpemVvZigqZmgpLEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGZoKQorCWlmIChOVUxMID09IGZoKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCWZoLT5kZXYgICAgICA9IGRldjsKIAlmaC0+cmFkaW8gICAgPSByYWRpbzsKQEAgLTEzODQsNiArMTM5Miw3IEBACiAJCS8qIHN3aXRjaCB0byB2aWRlby92YmkgbW9kZSAqLwogCQl2aWRlb19tdXgoZGV2LGRldi0+Y3RsX2lucHV0KTsKIAl9CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzkwLDE4ICsxNzk5LDI1IEBACiAJCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhYTcxMzRfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICppZCkKK2ludCBzYWE3MTM0X3Nfc3RkX2ludGVybmFsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHY0bDJfc3RkX2lkICppZCkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmgtPmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpOwogCXY0bDJfc3RkX2lkIGZpeHVwOwogCWludCBlcnI7CiAKLQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+cHJpbywgJmZoLT5wcmlvKTsKLQlpZiAoMCAhPSBlcnIpCi0JCXJldHVybiBlcnI7CisJLyogV2hlbiBjYWxsZWQgZnJvbSB0aGUgZW1wcmVzcyBjb2RlIGZoID09IE5VTEwuCisJICAgVGhhdCBuZWVkcyB0byBiZSBmaXhlZCBzb21laG93LCBidXQgZm9yIG5vdyB0aGlzIGlzCisJICAgZ29vZCBlbm91Z2guICovCisJaWYgKGZoKSB7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5wcmlvLCAmZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAocmVzX2xvY2tlZChkZXYsIFJFU09VUkNFX09WRVJMQVkpKSB7CisJCS8qIERvbid0IGNoYW5nZSB0aGUgc3RkIGZyb20gdGhlIG1wZWcgZGV2aWNlCisJCSAgIGlmIG92ZXJsYXkgaXMgYWN0aXZlLiAqLworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBUVk5PUk1TOyBpKyspCiAJCWlmICgqaWQgPT0gdHZub3Jtc1tpXS5pZCkKQEAgLTE4MzQsNyArMTg1MCw3IEBACiAJKmlkID0gdHZub3Jtc1tpXS5pZDsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JaWYgKHJlc19jaGVjayhmaCwgUkVTT1VSQ0VfT1ZFUkxBWSkpIHsKKwlpZiAoZmggJiYgcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9PVkVSTEFZKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCQlzdG9wX3ByZXZpZXcoZGV2LCBmaCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKQEAgLTE4NTEsNiArMTg2NywyMyBAQAogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxMzRfc19zdGRfaW50ZXJuYWwpOworCitzdGF0aWMgaW50IHNhYTcxMzRfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9maCAqZmggPSBwcml2OworCisJcmV0dXJuIHNhYTcxMzRfc19zdGRfaW50ZXJuYWwoZmgtPmRldiwgZmgsIGlkKTsKK30KKworc3RhdGljIGludCBzYWE3MTM0X2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaWQpCit7CisJc3RydWN0IHNhYTcxMzRfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwkqaWQgPSBkZXYtPnR2bm9ybS0+aWQ7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgc2FhNzEzNF9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYXApCkBAIC0yMDc3LDE4ICsyMTEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYWE3MTM0X2VudW1fZm10X3ZiaV9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQotewotCWlmICgwICE9IGYtPmluZGV4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7Ci0Jc3RyY3B5KGYtPmRlc2NyaXB0aW9uLCAidmJpIGRhdGEiKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHNhYTcxMzRfZ19mYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLAogCQkJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYikKIHsKQEAgLTIzNzksNyArMjQwMCw2IEBACiAJLnZpZGlvY19nX2ZtdF92aWRfb3ZlcmxheQk9IHNhYTcxMzRfZ19mbXRfdmlkX292ZXJsYXksCiAJLnZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5CT0gc2FhNzEzNF90cnlfZm10X3ZpZF9vdmVybGF5LAogCS52aWRpb2Nfc19mbXRfdmlkX292ZXJsYXkJPSBzYWE3MTM0X3NfZm10X3ZpZF9vdmVybGF5LAotCS52aWRpb2NfZW51bV9mbXRfdmJpX2NhcAk9IHNhYTcxMzRfZW51bV9mbXRfdmJpX2NhcCwKIAkudmlkaW9jX2dfZm10X3ZiaV9jYXAJCT0gc2FhNzEzNF90cnlfZ2V0X3NldF9mbXRfdmJpX2NhcCwKIAkudmlkaW9jX3RyeV9mbXRfdmJpX2NhcAkJPSBzYWE3MTM0X3RyeV9nZXRfc2V0X2ZtdF92YmlfY2FwLAogCS52aWRpb2Nfc19mbXRfdmJpX2NhcAkJPSBzYWE3MTM0X3RyeV9nZXRfc2V0X2ZtdF92YmlfY2FwLApAQCAtMjM5MSw2ICsyNDExLDcgQEAKIAkudmlkaW9jX3FidWYJCQk9IHNhYTcxMzRfcWJ1ZiwKIAkudmlkaW9jX2RxYnVmCQkJPSBzYWE3MTM0X2RxYnVmLAogCS52aWRpb2Nfc19zdGQJCQk9IHNhYTcxMzRfc19zdGQsCisJLnZpZGlvY19nX3N0ZAkJCT0gc2FhNzEzNF9nX3N0ZCwKIAkudmlkaW9jX2VudW1faW5wdXQJCT0gc2FhNzEzNF9lbnVtX2lucHV0LAogCS52aWRpb2NfZ19pbnB1dAkJCT0gc2FhNzEzNF9nX2lucHV0LAogCS52aWRpb2Nfc19pbnB1dAkJCT0gc2FhNzEzNF9zX2lucHV0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggYTA4ODRmNi4uNDkxYWIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0yNjksNiArMjY5LDEyIEBACiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQkVIT0xEX002X0VYVFJBICAgIDE0NAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTAzICAgIDE0NQogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfUDcxMzFfQU5BTE9HIDE0NgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVElHRVJfM0lOMSAgIDE0NworI2RlZmluZSBTQUE3MTM0X0JPQVJEX0VOQ09SRV9FTkxUVl9GTTUzIDE0OAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTM1QSAgICAxNDkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9SRUFMX0FOR0VMXzIyMCAgICAgMTUwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfSERUVl9QQ0kgIDE1MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVElHRVIgICAgICAgICAxNTIKIAogI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKQEAgLTQ2Miw2ICs0NjgsMTIgQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAoKnNpZ25hbF9jaGFuZ2UpKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKIH07CiAKK2VudW0gc2FhNzEzNF90c19zdGF0dXMgeworCVNBQTcxMzRfVFNfU1RPUFBFRCwKKwlTQUE3MTM0X1RTX0JVRkZfRE9ORSwKKwlTQUE3MTM0X1RTX1NUQVJURUQsCit9OworCiAvKiBnbG9iYWwgZGV2aWNlIHN0YXR1cyAqLwogc3RydWN0IHNhYTcxMzRfZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICBkZXZsaXN0OwpAQCAtNTU1LDYgKzU2Nyw4IEBACiAJLyogU0FBNzEzNF9NUEVHXyogKi8KIAlzdHJ1Y3Qgc2FhNzEzNF90cyAgICAgICAgICB0czsKIAlzdHJ1Y3Qgc2FhNzEzNF9kbWFxdWV1ZSAgICB0c19xOworCWVudW0gc2FhNzEzNF90c19zdGF0dXMgCSAgIHRzX3N0YXRlOworCXVuc2lnbmVkIGludCAJCSAgIGJ1ZmZfY250OwogCXN0cnVjdCBzYWE3MTM0X21wZWdfb3BzICAgICptb3BzOwogCXN0cnVjdCBpMmNfY2xpZW50IAkgICAqbXBlZ19pMmNfY2xpZW50OwogCkBAIC02NDQsNyArNjU4LDcgQEAKIAogZXh0ZXJuIGludCBzYWE3MTM0X2JvYXJkX2luaXQxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKIGV4dGVybiBpbnQgc2FhNzEzNF9ib2FyZF9pbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Ci1pbnQgc2FhNzEzNF90dW5lcl9jYWxsYmFjayh2b2lkICpwcml2LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CitpbnQgc2FhNzEzNF90dW5lcl9jYWxsYmFjayh2b2lkICpwcml2LCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY1NCw2ICs2NjgsOCBAQAogaW50IHNhYTcxMzRfaTJjX3VucmVnaXN0ZXIoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwogdm9pZCBzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IHNhYTcxMzRfaTJjX2NhbGxfc2FhNjc1MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY2Niw2ICs2ODIsNyBAQAogaW50IHNhYTcxMzRfc19jdHJsX2ludGVybmFsKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCAgc3RydWN0IHNhYTcxMzRfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKTsKIGludCBzYWE3MTM0X2dfY3RybF9pbnRlcm5hbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwgc3RydWN0IHY0bDJfY29udHJvbCAqYyk7CiBpbnQgc2FhNzEzNF9xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYyk7CitpbnQgc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgIHN0cnVjdCBzYWE3MTM0X2ZoICpmaCwgdjRsMl9zdGRfaWQgKmlkKTsKIAogaW50IHNhYTcxMzRfdmlkZW9wb3J0X2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwogdm9pZCBzYWE3MTM0X3NldF90dm5vcm1faHcoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5jCmluZGV4IGFjY2VlZDUuLmFlMzk0OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2U0MDEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmMKQEAgLTI4OCw3ICsyODgsNyBAQAogCWludCBzdGF0dXM7CiAKIAlpZiAoIXNlNDAxLT5kZXYpIHsKLQkJaW5mbygib2hvaDogZGV2aWNlIHZhcG91cmlzaGVkIik7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAiZGV2aWNlIHZhcG91cmlzaGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJCXJldHVybjsKIAogCWlmICghc2U0MDEtPmRldikgewotCQlpbmZvICgib2hvaDogZGV2aWNlIHZhcG91cmlzaGVkIik7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAiZGV2aWNlIHZhcG91cmlzaGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzc1LDcgKzM3NSw3IEBACiAJdXJiLT5zdGF0dXM9MDsKIAl1cmItPmRldj1zZTQwMS0+ZGV2OwogCWlmKHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCkpCi0JCWluZm8oInVyYiBidXJuZWQgZG93biIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgInVyYiBidXJuZWQgZG93blxuIik7CiAJcmV0dXJuOwogfQogCkBAIC04NjAsNyArODYwLDggQEAKIAkJKTsKIAkJaWYgKHNlNDAxLT5udWxscGFja2V0cyA+IFNFNDAxX01BWF9OVUxMUEFDS0VUUykgewogCQkJc2U0MDEtPm51bGxwYWNrZXRzPTA7Ci0JCQlpbmZvKCJ0byBtYW55IG51bGwgbGVuZ3RoIHBhY2tldHMsIHJlc3RhcnRpbmcgY2FwdHVyZSIpOworCQkJZGV2X2luZm8oJnNlNDAxLT5kZXYtPmRldiwKKwkJCQkgInRvbyBtYW55IG51bGwgbGVuZ3RoIHBhY2tldHMsIHJlc3RhcnRpbmcgY2FwdHVyZVxuIik7CiAJCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CiAJCQlzZTQwMV9zdGFydF9zdHJlYW0oc2U0MDEpOwogCQl9IGVsc2UgewpAQCAtODgwLDcgKzg4MSw4IEBACiAJCQkJc2U0MDEtPnNjcmF0Y2hfdXNlPTA7CiAJCQlpZiAoZXJyb3JzID4gU0U0MDFfTUFYX0VSUk9SUykgewogCQkJCWVycm9ycz0wOwotCQkJCWluZm8oInRvIG11Y2ggZXJyb3JzLCByZXN0YXJ0aW5nIGNhcHR1cmUiKTsKKwkJCQlkZXZfaW5mbygmc2U0MDEtPmRldi0+ZGV2LAorCQkJCQkgInRvbyBtYW55IGVycm9ycywgcmVzdGFydGluZyBjYXB0dXJlXG4iKTsKIAkJCQlzZTQwMV9zdG9wX3N0cmVhbShzZTQwMSk7CiAJCQkJc2U0MDFfc3RhcnRfc3RyZWFtKHNlNDAxKTsKIAkJCX0KQEAgLTkxMyw3ICs5MTUsNyBAQAogCQl1c2Jfa2lsbF91cmIoc2U0MDEtPmludHVyYik7CiAJCXVzYl9mcmVlX3VyYihzZTQwMS0+aW50dXJiKTsKIAl9Ci0JaW5mbygiJXMgZGlzY29ubmVjdGVkIiwgc2U0MDEtPmNhbWVyYV9uYW1lKTsKKwlkZXZfaW5mbygmc2U0MDEtPmRldi0+ZGV2LCAiJXMgZGlzY29ubmVjdGVkIiwgc2U0MDEtPmNhbWVyYV9uYW1lKTsKIAogCS8qIEZyZWUgdGhlIG1lbW9yeSAqLwogCWtmcmVlKHNlNDAxLT53aWR0aCk7CkBAIC05MzYsMTQgKzkzOCwxOCBAQAogCXN0cnVjdCB1c2Jfc2U0MDEgKnNlNDAxID0gKHN0cnVjdCB1c2Jfc2U0MDEgKilkZXY7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoc2U0MDEtPnVzZXIpCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoc2U0MDEtPnVzZXIpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAlzZTQwMS0+ZmJ1ZiA9IHJ2bWFsbG9jKHNlNDAxLT5tYXhmcmFtZXNpemUgKiBTRTQwMV9OVU1GUkFNRVMpOwogCWlmIChzZTQwMS0+ZmJ1ZikKIAkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCWVsc2UKIAkJZXJyID0gLUVOT01FTTsKIAlzZTQwMS0+dXNlciA9ICFlcnI7CisJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTk1Niw4ICs5NjIsOCBAQAogCiAJcnZmcmVlKHNlNDAxLT5mYnVmLCBzZTQwMS0+bWF4ZnJhbWVzaXplICogU0U0MDFfTlVNRlJBTUVTKTsKIAlpZiAoc2U0MDEtPnJlbW92ZWQpIHsKKwkJZGV2X2luZm8oJnNlNDAxLT5kZXYtPmRldiwgImRldmljZSB1bnJlZ2lzdGVyZWRcbiIpOwogCQl1c2Jfc2U0MDFfcmVtb3ZlX2Rpc2Nvbm5lY3RlZChzZTQwMSk7Ci0JCWluZm8oImRldmljZSB1bnJlZ2lzdGVyZWQiKTsKIAl9IGVsc2UgewogCQlmb3IgKGk9MDsgaTxTRTQwMV9OVU1GUkFNRVM7IGkrKykKIAkJCXNlNDAxLT5mcmFtZVtpXS5ncmFic3RhdGU9RlJBTUVfVU5VU0VEOwpAQCAtMTIzMiw2ICsxMjM4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHNlNDAxX3RlbXBsYXRlID0gewogCS5uYW1lID0gICAgICAgICAic2U0MDEgVVNCIGNhbWVyYSIsCiAJLmZvcHMgPSAgICAgICAgICZzZTQwMV9mb3BzLAorCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCiB9OwogCiAKQEAgLTEyNzEsNyArMTI3OCw3IEBACiAJZm9yIChpPTA7IGk8c2U0MDEtPnNpemVzOyBpKyspIHsKIAkJc3ByaW50Zih0ZW1wLCAiJXMgJWR4JWQiLCB0ZW1wLCBzZTQwMS0+d2lkdGhbaV0sIHNlNDAxLT5oZWlnaHRbaV0pOwogCX0KLQlpbmZvKCIlcyIsIHRlbXApOworCWRldl9pbmZvKCZzZTQwMS0+ZGV2LT5kZXYsICIlc1xuIiwgdGVtcCk7CiAJc2U0MDEtPm1heGZyYW1lc2l6ZT1zZTQwMS0+d2lkdGhbc2U0MDEtPnNpemVzLTFdKnNlNDAxLT5oZWlnaHRbc2U0MDEtPnNpemVzLTFdKjM7CiAKIAlyYz1zZTQwMV9zbmRjdHJsKDAsIHNlNDAxLCBTRTQwMV9SRVFfR0VUX1dJRFRILCAwLCBjcCwgc2l6ZW9mKGNwKSk7CkBAIC0xMzA1LDcgKzEzMTIsOCBAQAogCWlmIChidXR0b24pIHsKIAkJc2U0MDEtPmludHVyYj11c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXNlNDAxLT5pbnR1cmIpIHsKLQkJCWluZm8oIkFsbG9jYXRpb24gb2YgaW50dXJiIGZhaWxlZCIpOworCQkJZGV2X2luZm8oJnNlNDAxLT5kZXYtPmRldiwKKwkJCQkgIkFsbG9jYXRpb24gb2YgaW50dXJiIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQl1c2JfZmlsbF9pbnRfdXJiKHNlNDAxLT5pbnR1cmIsIHNlNDAxLT5kZXYsCkBAIC0xMzE2LDcgKzEzMjQsNyBAQAogCQkgICAgOAogCQkpOwogCQlpZiAodXNiX3N1Ym1pdF91cmIoc2U0MDEtPmludHVyYiwgR0ZQX0tFUk5FTCkpIHsKLQkJCWluZm8oImludCB1cmIgYnVybmVkIGRvd24iKTsKKwkJCWRldl9pbmZvKCZzZTQwMS0+ZGV2LT5kZXYsICJpbnQgdXJiIGJ1cm5lZCBkb3duXG4iKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfSBlbHNlCkBAIC0xMzczLDcgKzEzODEsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFdlIGZvdW5kIG9uZSAqLwotCWluZm8oIlNFNDAxIGNhbWVyYSBmb3VuZDogJXMiLCBjYW1lcmFfbmFtZSk7CisJZGV2X2luZm8oJmludGYtPmRldiwgIlNFNDAxIGNhbWVyYSBmb3VuZDogJXNcbiIsIGNhbWVyYV9uYW1lKTsKIAogCWlmICgoc2U0MDEgPSBremFsbG9jKHNpemVvZigqc2U0MDEpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQllcnIoImNvdWxkbid0IGttYWxsb2Mgc2U0MDEgc3RydWN0Iik7CkBAIC0xMzg0LDcgKzEzOTIsOCBAQAogCXNlNDAxLT5pZmFjZSA9IGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcjsKIAlzZTQwMS0+Y2FtZXJhX25hbWUgPSBjYW1lcmFfbmFtZTsKIAotCWluZm8oImZpcm13YXJlIHZlcnNpb246ICUwMngiLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAmIDI1NSk7CisJZGV2X2luZm8oJmludGYtPmRldiwgImZpcm13YXJlIHZlcnNpb246ICUwMnhcbiIsCisJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAmIDI1NSk7CiAKIAlpZiAoc2U0MDFfaW5pdChzZTQwMSwgYnV0dG9uKSkgewogCQlrZnJlZShzZTQwMSk7CkBAIC0xNDAyLDcgKzE0MTEsOCBAQAogCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCWluZm8oInJlZ2lzdGVyZWQgbmV3IHZpZGVvIGRldmljZTogdmlkZW8lZCIsIHNlNDAxLT52ZGV2Lm1pbm9yKTsKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAicmVnaXN0ZXJlZCBuZXcgdmlkZW8gZGV2aWNlOiB2aWRlbyVkXG4iLAorCQkgc2U0MDEtPnZkZXYubWlub3IpOwogCiAJdXNiX3NldF9pbnRmZGF0YSAoaW50Ziwgc2U0MDEpOwogCXJldHVybiAwOwpAQCAtMTQ0NiwxMCArMTQ1NiwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1c2Jfc2U0MDFfaW5pdCh2b2lkKQogewotCWluZm8oIlNFNDAxIHVzYiBjYW1lcmEgZHJpdmVyIHZlcnNpb24gJXMgcmVnaXN0ZXJpbmciLCB2ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9JTkZPICJTRTQwMSB1c2IgY2FtZXJhIGRyaXZlciB2ZXJzaW9uICVzIHJlZ2lzdGVyaW5nXG4iLCB2ZXJzaW9uKTsKIAlpZiAoZmxpY2tlcmxlc3MpCiAJCWlmIChmbGlja2VybGVzcyE9NTAgJiYgZmxpY2tlcmxlc3MhPTYwKSB7Ci0JCQlpbmZvKCJJbnZhbGxpZCBmbGlja2VybGVzcyB2YWx1ZSwgdXNlIDAsIDUwIG9yIDYwLiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGxpZCBmbGlja2VybGVzcyB2YWx1ZSwgdXNlIDAsIDUwIG9yIDYwLlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnNlNDAxX2RyaXZlcik7CkBAIC0xNDU4LDcgKzE0NjgsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHVzYl9zZTQwMV9leGl0KHZvaWQpCiB7CiAJdXNiX2RlcmVnaXN0ZXIoJnNlNDAxX2RyaXZlcik7Ci0JaW5mbygiU0U0MDEgZHJpdmVyIGRlcmVnaXN0ZXJlZCIpOworCXByaW50ayhLRVJOX0lORk8gIlNFNDAxIGRyaXZlciBkZXJlZ2lzdGVyZWRcZnJhbWUiKTsKIH0KIAogbW9kdWxlX2luaXQodXNiX3NlNDAxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCmluZGV4IDMxODc1NGUuLjc2ODM4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKQEAgLTMwNCw5ICszMDQsNiBAQAogCQkgIlN1cGVySCBNb2JpbGUgQ0VVIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKLQlpZiAocGNkZXYtPnBkYXRhLT5lbmFibGVfY2FtZXJhKQotCQlwY2Rldi0+cGRhdGEtPmVuYWJsZV9jYW1lcmEoKTsKLQogCXJldCA9IGljZC0+b3BzLT5pbml0KGljZCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CkBAIC0zMzMsOCArMzMwLDYgQEAKIAljZXVfd3JpdGUocGNkZXYsIENFSUVSLCAwKTsKIAljZXVfd3JpdGUocGNkZXYsIENBUFNSLCAxIDw8IDE2KTsgLyogcmVzZXQgKi8KIAlpY2QtPm9wcy0+cmVsZWFzZShpY2QpOwotCWlmIChwY2Rldi0+cGRhdGEtPmRpc2FibGVfY2FtZXJhKQotCQlwY2Rldi0+cGRhdGEtPmRpc2FibGVfY2FtZXJhKCk7CiAKIAlkZXZfaW5mbygmaWNkLT5kZXYsCiAJCSAiU3VwZXJIIE1vYmlsZSBDRVUgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCmluZGV4IDJkYTY5MzguLjIwZTMwYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKQEAgLTExNiw2ICsxMTYsMjYgQEAKIAkJICJcbiIpOwogI2VuZGlmCiAKKy8qCisgICBBZGQgdGhlIHByb2JlIGVudHJpZXMgdG8gdGhpcyB0YWJsZS4gQmUgc3VyZSB0byBhZGQgdGhlIGVudHJ5IGluIHRoZSByaWdodAorICAgcGxhY2UsIHNpbmNlLCBvbiBmYWlsdXJlLCB0aGUgbmV4dCBwcm9iaW5nIHJvdXRpbmUgaXMgY2FsbGVkIGFjY29yZGluZyB0bworICAgdGhlIG9yZGVyIG9mIHRoZSBsaXN0IGJlbG93LCBmcm9tIHRvcCB0byBib3R0b20uCisqLworc3RhdGljIGludCAoKnNuOWMxMDJfc2Vuc29yX3RhYmxlW10pKHN0cnVjdCBzbjljMTAyX2RldmljZSAqKSA9IHsKKwkmc245YzEwMl9wcm9iZV9odjcxMzFkLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KKwkmc245YzEwMl9wcm9iZV9odjcxMzFyLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KKwkmc245YzEwMl9wcm9iZV9taTAzNDMsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLworCSZzbjljMTAyX3Byb2JlX21pMDM2MCwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCisJJnNuOWMxMDJfcHJvYmVfbXQ5djExMSwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCisJJnNuOWMxMDJfcHJvYmVfcGFzMTA2YiwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCisJJnNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KKwkmc245YzEwMl9wcm9iZV9vdjc2MzAsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLworCSZzbjljMTAyX3Byb2JlX292NzY2MCwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCisJJnNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCisJJnNuOWMxMDJfcHJvYmVfdGFzNTExMGQsIC8qIGRldGVjdGlvbiBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLworCSZzbjljMTAyX3Byb2JlX3RhczUxMzBkMWIsIC8qIGRldGVjdGlvbiBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdTMyCkBAIC0xNzQ2LDcgKzE3NjYsNyBAQAogCWlmICghZG93bl9yZWFkX3RyeWxvY2soJnNuOWMxMDJfZGV2X2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmNhbS0+cHJvYmUpKSB7CiAJCXVwX3JlYWQoJnNuOWMxMDJfZGV2X2xvY2spOwpAQCAtMTg0Myw3ICsxODYzLDcgQEAKIAogCWRvd25fd3JpdGUoJnNuOWMxMDJfZGV2X2xvY2spOwogCi0JY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCXNuOWMxMDJfc3RvcF90cmFuc2ZlcihjYW0pOwogCXNuOWMxMDJfcmVsZWFzZV9idWZmZXJzKGNhbSk7CkBAIC0xODYzLDcgKzE4ODMsNyBAQAogc3RhdGljIHNzaXplX3QKIHNuOWMxMDJfcmVhZChzdHJ1Y3QgZmlsZSogZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90KiBmX3BvcykKIHsKLQlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCXN0cnVjdCBzbjljMTAyX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiBmLCAqIGk7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCWxvbmcgdGltZW91dDsKQEAgLTE5ODcsNyArMjAwNyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc245YzEwMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IHNuOWMxMDJfZGV2aWNlICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCXN0cnVjdCBzbjljMTAyX2ZyYW1lX3QqIGY7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKQEAgLTIwNjMsNyArMjA4Myw3IEBACiAKIHN0YXRpYyBpbnQgc245YzEwMl9tbWFwKHN0cnVjdCBmaWxlKiBmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCXN0cnVjdCBzbjljMTAyX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCiAJCSAgICAgIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKIAl2b2lkICpwb3M7CkBAIC0zMDc1LDcgKzMwOTUsNyBAQAogc3RhdGljIGludCBzbjljMTAyX2lvY3RsX3Y0bDIoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKIHsKLQlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlscCkpOworCXN0cnVjdCBzbjljMTAyX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTMxNzksNyArMzE5OSw3IEBACiBzdGF0aWMgaW50IHNuOWMxMDJfaW9jdGwoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3Qgc245YzEwMl9kZXZpY2UgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjYW0tPmZpbGVvcF9tdXRleCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9kZXZ0YWJsZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaAppbmRleCA5MGE0MDFkLi5lMjM3MzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9kZXZ0YWJsZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmgKQEAgLTE0MCwyNCArMTQwLDQgQEAKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV90YXM1MTEwZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiAKLS8qCi0gICBBZGQgdGhlIGFib3ZlIGVudHJpZXMgdG8gdGhpcyB0YWJsZS4gQmUgc3VyZSB0byBhZGQgdGhlIGVudHJ5IGluIHRoZSByaWdodAotICAgcGxhY2UsIHNpbmNlLCBvbiBmYWlsdXJlLCB0aGUgbmV4dCBwcm9iaW5nIHJvdXRpbmUgaXMgY2FsbGVkIGFjY29yZGluZyB0bwotICAgdGhlIG9yZGVyIG9mIHRoZSBsaXN0IGJlbG93LCBmcm9tIHRvcCB0byBib3R0b20uCi0qLwotc3RhdGljIGludCAoKnNuOWMxMDJfc2Vuc29yX3RhYmxlW10pKHN0cnVjdCBzbjljMTAyX2RldmljZSopID0gewotCSZzbjljMTAyX3Byb2JlX2h2NzEzMWQsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwotCSZzbjljMTAyX3Byb2JlX2h2NzEzMXIsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwotCSZzbjljMTAyX3Byb2JlX21pMDM0MywgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCi0JJnNuOWMxMDJfcHJvYmVfbWkwMzYwLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KLQkmc245YzEwMl9wcm9iZV9tdDl2MTExLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KLQkmc245YzEwMl9wcm9iZV9wYXMxMDZiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KLQkmc245YzEwMl9wcm9iZV9wYXMyMDJiY2IsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwotCSZzbjljMTAyX3Byb2JlX292NzYzMCwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCi0JJnNuOWMxMDJfcHJvYmVfb3Y3NjYwLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KLQkmc245YzEwMl9wcm9iZV90YXM1MTEwYzFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8KLQkmc245YzEwMl9wcm9iZV90YXM1MTEwZCwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCi0JJnNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCi19OwotCiAjZW5kaWYgLyogX1NOOUMxMDJfREVWVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYwppbmRleCBlYWY5YWQwLi5kYjI0MzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCBodjcxMzFkX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKaW5kZXggMGZjNDAxMi4uNDI5NTg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisjaW5jbHVkZSAic245YzEwMl9kZXZ0YWJsZS5oIgogCiAKIHN0YXRpYyBpbnQgaHY3MTMxcl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbWkwMzQzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNDMuYwppbmRleCAwMGIxMzRjLi4xZjViMDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNDMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNDMuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisjaW5jbHVkZSAic245YzEwMl9kZXZ0YWJsZS5oIgogCiAKIHN0YXRpYyBpbnQgbWkwMzQzX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCmluZGV4IGY4ZDgxZDguLmQ5NzNmYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCBtaTAzNjBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX210OXYxMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX210OXYxMTEuYwppbmRleCAzYjk4YWMzLi45NTk4NmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9tdDl2MTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbXQ5djExMS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCBtdDl2MTExX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlICpjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzYzMC5jCmluZGV4IGU0ODU2ZmQuLjgwMzcxMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzYzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzYzMC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCBvdjc2MzBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzY2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKaW5kZXggOGFhZTQxNi4uNzk3Nzc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjYwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorI2luY2x1ZGUgInNuOWMxMDJfZGV2dGFibGUuaCIKIAogCiBzdGF0aWMgaW50IG92NzY2MF9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCmluZGV4IDM2MGYyYTguLjgxY2Q5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczEwNmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCBwYXMxMDZiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCmluZGV4IGNhNGExNTAuLjI3ODJmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisjaW5jbHVkZSAic245YzEwMl9kZXZ0YWJsZS5oIgogCiAKIHN0YXRpYyBpbnQgcGFzMjAyYmNiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwYzFiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwYzFiLmMKaW5kZXggZTdkMmRlMi4uMDRjZGZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBjMWIuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisjaW5jbHVkZSAic245YzEwMl9kZXZ0YWJsZS5oIgogCiAKIHN0YXRpYyBpbnQgdGFzNTExMGMxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKaW5kZXggZDMyZmRiYy4uOTM3MmU2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGQuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCisjaW5jbHVkZSAic245YzEwMl9kZXZ0YWJsZS5oIgogCiAKIHN0YXRpYyBpbnQgdGFzNTExMGRfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYwppbmRleCA1NmZiMWQ1Li5hMzBiYmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTMwZDFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTEzMGQxYi5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKyNpbmNsdWRlICJzbjljMTAyX2RldnRhYmxlLmgiCiAKIAogc3RhdGljIGludCB0YXM1MTMwZDFiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0ay13ZWJjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5jCmluZGV4IGFkMzZhZjMuLmRiNjliYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5jCkBAIC02NSwyMiArNjUsNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzdGt3ZWJjYW1fdGFibGUpOwogCi1zdGF0aWMgdm9pZCBzdGtfY2FtZXJhX2NsZWFudXAoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IHN0a19jYW1lcmEgKmRldiA9IHRvX3N0a19jYW1lcmEoa3JlZik7Ci0KLQlTVEtfSU5GTygiU3ludGVrIFVTQjIuMCBDYW1lcmEgcmVsZWFzZSByZXNvdXJjZXMiCi0JCSIgdmlkZW8gZGV2aWNlIC9kZXYvdmlkZW8lZFxuIiwgZGV2LT52ZGV2Lm1pbm9yKTsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmZGV2LT52ZGV2KTsKLQlkZXYtPnZkZXYucHJpdiA9IE5VTEw7Ci0KLQlpZiAoZGV2LT5zaW9fYnVmcyAhPSBOVUxMIHx8IGRldi0+aXNvYnVmcyAhPSBOVUxMKQotCQlTVEtfRVJST1IoIldlIGFyZSBsZWFraW5nIG1lbW9yeVxuIik7Ci0JdXNiX3B1dF9pbnRmKGRldi0+aW50ZXJmYWNlKTsKLQlrZnJlZShkZXYpOwotfQotCi0KIC8qCiAgKiBCYXNpYyBzdHVmZgogICovCkBAIC02ODksMzQgKzY3MywyNCBAQAogCXZkZXYgPSB2aWRlb19kZXZkYXRhKGZwKTsKIAlkZXYgPSB2ZGV2X3RvX2NhbWVyYSh2ZGV2KTsKIAotCWlmIChkZXYgPT0gTlVMTCB8fCAhaXNfcHJlc2VudChkZXYpKQorCWxvY2tfa2VybmVsKCk7CisJaWYgKGRldiA9PSBOVUxMIHx8ICFpc19wcmVzZW50KGRldikpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOWElPOwotCWZwLT5wcml2YXRlX2RhdGEgPSB2ZGV2OwotCWtyZWZfZ2V0KCZkZXYtPmtyZWYpOworCX0KKwlmcC0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShkZXYtPmludGVyZmFjZSk7CisJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdjRsX3N0a19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmcCkKIHsKLQlzdHJ1Y3Qgc3RrX2NhbWVyYSAqZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7Ci0KLQl2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmcCk7Ci0JaWYgKHZkZXYgPT0gTlVMTCkgewotCQlTVEtfRVJST1IoInY0bF9yZWxlYXNlIGNhbGxlZCB3L28gdmlkZW8gZGV2ZGF0YVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlkZXYgPSB2ZGV2X3RvX2NhbWVyYSh2ZGV2KTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJU1RLX0VSUk9SKCJ2NGxfcmVsZWFzZSBjYWxsZWQgb24gcmVtb3ZlZCBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJc3RydWN0IHN0a19jYW1lcmEgKmRldiA9IGZwLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoZGV2LT5vd25lciAhPSBmcCkgewogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGV2LT5pbnRlcmZhY2UpOwotCQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBzdGtfY2FtZXJhX2NsZWFudXApOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTcyNyw3ICs3MDEsNiBAQAogCWRldi0+b3duZXIgPSBOVUxMOwogCiAJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGRldi0+aW50ZXJmYWNlKTsKLQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBzdGtfY2FtZXJhX2NsZWFudXApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MzgsMTQgKzcxMSw4IEBACiAJaW50IGk7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzdGtfY2FtZXJhICpkZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKIAlzdHJ1Y3Qgc3RrX3Npb19idWZmZXIgKnNidWY7Ci0KLQl2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmcCk7Ci0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGV2ID0gdmRldl90b19jYW1lcmEodmRldik7CisJc3RydWN0IHN0a19jYW1lcmEgKmRldiA9IGZwLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwpAQCAtODA0LDE1ICs3NzEsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHY0bF9zdGtfcG9sbChzdHJ1Y3QgZmlsZSAqZnAsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IHN0a19jYW1lcmEgKmRldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCBzdGtfY2FtZXJhICpkZXYgPSBmcC0+cHJpdmF0ZV9kYXRhOwogCi0JdmRldiA9IHZpZGVvX2RldmRhdGEoZnApOwotCi0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlkZXYgPSB2ZGV2X3RvX2NhbWVyYSh2ZGV2KTsKIAlpZiAoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC04NTAsMTYgKzgxMCwxMiBAQAogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0Jc3RydWN0IHN0a19jYW1lcmEgKmRldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCBzdGtfY2FtZXJhICpkZXYgPSBmcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzdGtfc2lvX2J1ZmZlciAqc2J1ZiA9IE5VTEw7CiAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdmRldiA9IHZpZGVvX2RldmRhdGEoZnApOwotCWRldiA9IHZkZXZfdG9fY2FtZXJhKHZkZXYpOwotCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zYnVmczsgaSsrKSB7CiAJCWlmIChkZXYtPnNpb19idWZzW2ldLnY0bGJ1Zi5tLm9mZnNldCA9PSBvZmZzZXQpIHsKIAkJCXNidWYgPSBkZXYtPnNpb19idWZzICsgaTsKQEAgLTEzNTUsNiArMTMxMSwxMiBAQAogCiBzdGF0aWMgdm9pZCBzdGtfdjRsX2Rldl9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkKQogeworCXN0cnVjdCBzdGtfY2FtZXJhICpkZXYgPSB2ZGV2X3RvX2NhbWVyYSh2ZCk7CisKKwlpZiAoZGV2LT5zaW9fYnVmcyAhPSBOVUxMIHx8IGRldi0+aXNvYnVmcyAhPSBOVUxMKQorCQlTVEtfRVJST1IoIldlIGFyZSBsZWFraW5nIG1lbW9yeVxuIik7CisJdXNiX3B1dF9pbnRmKGRldi0+aW50ZXJmYWNlKTsKKwlrZnJlZShkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzdGtfdjRsX2RhdGEgPSB7CkBAIC0xMzc1LDcgKzEzMzcsNiBAQAogCWRldi0+dmRldiA9IHN0a192NGxfZGF0YTsKIAlkZXYtPnZkZXYuZGVidWcgPSBkZWJ1ZzsKIAlkZXYtPnZkZXYucGFyZW50ID0gJmRldi0+aW50ZXJmYWNlLT5kZXY7Ci0JZGV2LT52ZGV2LnByaXYgPSBkZXY7CiAJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZkZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKIAlpZiAoZXJyKQogCQlTVEtfRVJST1IoInY0bCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKQEAgLTEzOTIsNyArMTM1Myw3IEBACiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgaTsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJc3RydWN0IHN0a19jYW1lcmEgKmRldiA9IE5VTEw7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CkBAIC0xNDA1LDcgKzEzNjYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlrcmVmX2luaXQoJmRldi0+a3JlZik7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+c3BpbmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdF9mcmFtZSk7CiAKQEAgLTE0MzgsOCArMTM5OCw4IEBACiAJfQogCWlmICghZGV2LT5pc29jX2VwKSB7CiAJCVNUS19FUlJPUigiQ291bGQgbm90IGZpbmQgaXNvYy1pbiBlbmRwb2ludCIpOwotCQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBzdGtfY2FtZXJhX2NsZWFudXApOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKIAl9CiAJZGV2LT52c2V0dGluZ3MuYnJpZ2h0bmVzcyA9IDB4N2ZmZjsKIAlkZXYtPnZzZXR0aW5ncy5wYWxldHRlID0gVjRMMl9QSVhfRk1UX1JHQjU2NTsKQEAgLTE0NTMsMTQgKzE0MTMsMTcgQEAKIAogCWVyciA9IHN0a19yZWdpc3Rlcl92aWRlb19kZXZpY2UoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHN0a19jYW1lcmFfY2xlYW51cCk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJc3RrX2NyZWF0ZV9zeXNmc19maWxlcygmZGV2LT52ZGV2KTsKIAl1c2JfYXV0b3BtX2VuYWJsZShkZXYtPmludGVyZmFjZSk7CiAKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBzdGtfY2FtZXJhX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKQEAgLTE0NzMsNyArMTQzNiwxMCBAQAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X2ZyYW1lKTsKIAlzdGtfcmVtb3ZlX3N5c2ZzX2ZpbGVzKCZkZXYtPnZkZXYpOwogCi0Ja3JlZl9wdXQoJmRldi0+a3JlZiwgc3RrX2NhbWVyYV9jbGVhbnVwKTsKKwlTVEtfSU5GTygiU3ludGVrIFVTQjIuMCBDYW1lcmEgcmVsZWFzZSByZXNvdXJjZXMiCisJCSJ2aWRlbyBkZXZpY2UgL2Rldi92aWRlbyVkXG4iLCBkZXYtPnZkZXYubWlub3IpOworCisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+dmRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmgKaW5kZXggZGY0ZGZlZi4uMDg0YTg1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmgKQEAgLTk5LDcgKzk5LDYgQEAKIAogCXU4IGlzb2NfZXA7CiAKLQlzdHJ1Y3Qga3JlZiBrcmVmOwogCS8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQgKi8KIAlhdG9taWNfdCB1cmJzX3VzZWQ7CiAKQEAgLTEyMSw3ICsxMjAsNiBAQAogCXVuc2lnbmVkIHNlcXVlbmNlOwogfTsKIAotI2RlZmluZSB0b19zdGtfY2FtZXJhKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3RrX2NhbWVyYSwga3JlZikKICNkZWZpbmUgdmRldl90b19jYW1lcmEoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzdGtfY2FtZXJhLCB2ZGV2KQogCiB2b2lkIHN0a19jYW1lcmFfZGVsZXRlKHN0cnVjdCBrcmVmICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYwppbmRleCAyNzZiZGVkLi5iYmFkNTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0cmFkaXMuYwpAQCAtMTg4MiwxMiArMTg4MiwxNiBAQAogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBzYWE3MTQ2ICpzYWEgPSBjb250YWluZXJfb2YodmRldiwgc3RydWN0IHNhYTcxNDYsIHZpZGVvX2Rldik7CiAKKwlsb2NrX2tlcm5lbCgpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNhYTsKIAogCXNhYS0+dXNlcisrOwotCWlmIChzYWEtPnVzZXIgPiAxKQorCWlmIChzYWEtPnVzZXIgPiAxKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIDA7CS8qIGRldmljZSBvcGVuIGFscmVhZHksIGRvbid0IHJlc2V0ICovCisJfQogCXNhYS0+d3JpdGVtb2RlID0gVklEX1dSSVRFX01QRUdfVklEOwkvKiBkZWZhdWx0IHRvIHZpZGVvICovCisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTIxLDYgKzE5MjUsNyBAQAogCS5uYW1lID0gIlNBQTcxNDZBIiwKIAkuZm9wcyA9ICZzYWFfZm9wcywKIAkubWlub3IgPSAtMSwKKwkucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgY29uZmlndXJlX3NhYTcxNDYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYwppbmRleCBkY2U5NDc0Li45YzU0OWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKQEAgLTg0LDcgKzg0LDggQEAKICNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIAlkbyB7IFwKIAlpZiAoZGVidWcgPj0gbGV2ZWwpCVwKLQkJaW5mbygiWyVzOiVkXSAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7CVwKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiIFslczolZF0gXG4iIGZtdCwJXAorCQkJX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7CVwKIAl9IHdoaWxlICgwKQogCiAKQEAgLTEwODYsNiArMTA4Nyw3IEBACiAJaW50IGVyciA9IDA7CiAKIAkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggdGhlIEJLTCBoZWxkICovCisJbG9ja19rZXJuZWwoKTsKIAlzdHY2ODAtPnVzZXIgPSAxOwogCWVyciA9IHN0dl9pbml0IChzdHY2ODApOwkvKiBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGNhbWVyYSAqLwogCkBAIC0xMDk5LDYgKzExMDEsNyBAQAogCX0KIAlpZiAoZXJyKQogCQlzdHY2ODAtPnVzZXIgPSAwOworCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xNTUwLDcgKzE1NTMsOCBAQAogCX0KIAlQREVCVUcgKDAsICJTVFYoaSk6IHVzYiBjYW1lcmEgZHJpdmVyIHZlcnNpb24gJXMgcmVnaXN0ZXJpbmciLCBEUklWRVJfVkVSU0lPTik7CiAKLQlpbmZvKERSSVZFUl9ERVNDICIgIiBEUklWRVJfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgorCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYwppbmRleCAyNDM3YzFhLi4xYzM5MWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuYwpAQCAtMiw2ICsyLDcgQEAKICAgICB0ZGE5ODQwIC0gaTJjLWRyaXZlciBmb3IgdGhlIHRkYTk4NDAgYnkgU0dTIFRob21zb24KIAogICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisgICAgQ29weXJpZ2h0IChDKSAyMDA4IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgogCiAgICAgVGhlIHRkYTk4NDAgaXMgYSBzdGVyZW8vZHVhbCBzb3VuZCBwcm9jZXNzb3Igd2l0aCBkaWdpdGFsCiAgICAgaWRlbnRpZmljYXRpb24uIEl0IGNhbiBiZSBmb3VuZCBhdCBhZGRyZXNzIDB4ODQgb24gdGhlIGkyYy1idXMuCkBAIC0yOCw1OSArMjksMTE4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2LWxlZ2FjeS5oPgogI2luY2x1ZGUgInRkYTk4NDAuaCIKIAotc3RhdGljIGludCBkZWJ1ZzsJCS8qIGluc21vZCBwYXJhbWV0ZXIgKi8KLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZXZpY2UgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0ZGE5ODQwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAotCSAgICBkbyB7IGlmIChkZWJ1ZykgeyBwcmludGsoIiVzOiAlcygpWyVkXTogIiwgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX0xJTkVfXyk7IHByaW50ayhhcmdzKTsgfSB9IHdoaWxlICgwKQorc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CiAKICNkZWZpbmUJU1dJVENICQkweDAwCiAjZGVmaW5lCUxFVkVMX0FESlVTVAkweDAyCiAjZGVmaW5lCVNURVJFT19BREpVU1QJMHgwMwogI2RlZmluZQlURVNUCQkweDA0CiAKKyNkZWZpbmUgVERBOTg0MF9TRVRfTVVURSAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFREQTk4NDBfU0VUX01PTk8gICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBUREE5ODQwX1NFVF9TVEVSRU8gICAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgVERBOTg0MF9TRVRfTEFORzEgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFREQTk4NDBfU0VUX0xBTkcyICAgICAgICAgICAgICAgMHgxZQorI2RlZmluZSBUREE5ODQwX1NFVF9CT1RIICAgICAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgVERBOTg0MF9TRVRfQk9USF9SICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIFREQTk4NDBfU0VUX0VYVEVSTkFMICAgICAgICAgICAgMHg3YQorCiAvKiBhZGRyZXNzZXMgdG8gc2NhbiwgZm91bmQgb25seSBhdCAweDQyICg3LUJpdCkgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19BRERSX1REQTk4NDAsIEkyQ19DTElFTlRfRU5EIH07CiAKIC8qIG1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCiBJMkNfQ0xJRU5UX0lOU01PRDsKIAotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KLXN0YXRpYyBpbnQgY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCB0ZGE5ODQwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQogewotCWludCByZXN1bHQ7CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCkpCisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImVycm9yIHdyaXRpbmcgJTAyeCB0byAlMDJ4XG4iLAorCQkJCXZhbCwgcmVnKTsKK30KKworc3RhdGljIGludCB0ZGE5ODQwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY21kLCB2b2lkICphcmcpCit7CiAJaW50IGJ5dGUgPSAqKGludCAqKWFyZzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBUREE5ODQwX1NXSVRDSDoKKwljYXNlIFZJRElPQ19TX1RVTkVSOiB7CisJCXN0cnVjdCB2NGwyX3R1bmVyICp0ID0gYXJnOworCQlpbnQgYnl0ZTsKIAotCQlkcHJpbnRrKCJUREE5ODQwX1NXSVRDSDogMHglMDJ4XG4iLCBieXRlKTsKKwkJaWYgKHQtPmluZGV4KQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKGJ5dGUgIT0gVERBOTg0MF9TRVRfTU9OTwotCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9NVVRFCi0JCSAgICAmJiBieXRlICE9IFREQTk4NDBfU0VUX1NURVJFTwotCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9MQU5HMQotCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9MQU5HMgotCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9CT1RICi0JCSAgICAmJiBieXRlICE9IFREQTk4NDBfU0VUX0JPVEhfUgotCQkgICAgJiYgYnl0ZSAhPSBUREE5ODQwX1NFVF9FWFRFUk5BTCkgeworCQlzd2l0Y2ggKHQtPmF1ZG1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOgorCQkJYnl0ZSA9IFREQTk4NDBfU0VUX1NURVJFTzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMjoKKwkJCWJ5dGUgPSBUREE5ODQwX1NFVF9CT1RIOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcxOgorCQkJYnl0ZSA9IFREQTk4NDBfU0VUX0xBTkcxOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOgorCQkJYnl0ZSA9IFREQTk4NDBfU0VUX0xBTkcyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlieXRlID0gVERBOTg0MF9TRVRfTU9OTzsKKwkJCWJyZWFrOworCQl9CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlREQTk4NDBfU1dJVENIOiAweCUwMnhcbiIsIGJ5dGUpOworCQl0ZGE5ODQwX3dyaXRlKGNsaWVudCwgU1dJVENILCBieXRlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19UVU5FUjogeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKwkJdTggYnl0ZTsKKworCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgJmJ5dGUsIDEpKSB7CisJCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsCisJCQkJImkyY19tYXN0ZXJfcmVjdigpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChieXRlICYgMHg4MCkgeworCQkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LAorCQkJCSJUREE5ODQwX0RFVEVDVDogcmVnaXN0ZXIgY29udGVudHMgaW52YWxpZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTV0lUQ0gsIGJ5dGUpOwotCQlpZiAocmVzdWx0KQotCQkJZHByaW50aygiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmVzdWx0KTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiVERBOTg0MF9ERVRFQ1Q6IGJ5dGU6IDB4JTAyeFxuIiwgYnl0ZSk7CisKKwkJc3dpdGNoIChieXRlICYgMHg2MCkgeworCQljYXNlIDB4MDA6CisJCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCWJyZWFrOworCQljYXNlIDB4MjA6CisJCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTEFORzEgfCBWNEwyX1RVTkVSX1NVQl9MQU5HMjsKKwkJCWJyZWFrOworCQljYXNlIDB4NDA6CisJCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPIHwgVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBJbmNvcnJlY3QgZGV0ZWN0ICovCisJCQl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKKwl9CiAKIAljYXNlIFREQTk4NDBfTEVWRUxfQURKVVNUOgotCi0JCWRwcmludGsoIlREQTk4NDBfTEVWRUxfQURKVVNUOiAlZFxuIiwgYnl0ZSk7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIlREQTk4NDBfTEVWRUxfQURKVVNUOiAlZFxuIiwgYnl0ZSk7CiAKIAkJLyogY2hlY2sgZm9yIGNvcnJlY3QgcmFuZ2UgKi8KIAkJaWYgKGJ5dGUgPiAyNSB8fCBieXRlIDwgLTIwKQpAQCAtOTIsMTUgKzE1MiwxMSBAQAogCQkJYnl0ZSArPSAweDg7CiAJCWVsc2UKIAkJCWJ5dGUgPSAtYnl0ZTsKLQotCQlyZXN1bHQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTEVWRUxfQURKVVNULCBieXRlKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWRwcmludGsoImkyY19zbWJ1c193cml0ZV9ieXRlKCkgZmFpbGVkLCByZXQ6JWRcbiIsIHJlc3VsdCk7CisJCXRkYTk4NDBfd3JpdGUoY2xpZW50LCBMRVZFTF9BREpVU1QsIGJ5dGUpOwogCQlicmVhazsKIAogCWNhc2UgVERBOTg0MF9TVEVSRU9fQURKVVNUOgotCi0JCWRwcmludGsoIlREQTk4NDBfU1RFUkVPX0FESlVTVDogJWRcbiIsIGJ5dGUpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJUREE5ODQwX1NURVJFT19BREpVU1Q6ICVkXG4iLCBieXRlKTsKIAogCQkvKiBjaGVjayBmb3IgY29ycmVjdCByYW5nZSAqLwogCQlpZiAoYnl0ZSA+IDI1IHx8IGJ5dGUgPCAtMjQpCkBAIC0xMTMsMTQzICsxNjksNTkgQEAKIAkJZWxzZQogCQkJYnl0ZSA9IC1ieXRlOwogCi0JCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTVEVSRU9fQURKVVNULCBieXRlKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWRwcmludGsoImkyY19zbWJ1c193cml0ZV9ieXRlKCkgZmFpbGVkLCByZXQ6JWRcbiIsIHJlc3VsdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUREE5ODQwX0RFVEVDVDogewotCQlpbnQgKnJldCA9IChpbnQgKilhcmc7Ci0KLQkJYnl0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFNURVJFT19BREpVU1QpOwotCQlpZiAoYnl0ZSA9PSAtMSkgewotCQkJZHByaW50aygiaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJaWYgKDAgIT0gKGJ5dGUgJiAweDgwKSkgewotCQkJZHByaW50aygiVERBOTg0MF9ERVRFQ1Q6IHJlZ2lzdGVyIGNvbnRlbnRzIGludmFsaWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlkcHJpbnRrKCJUREE5ODQwX0RFVEVDVDogYnl0ZTogMHglMDJ4XG4iLCBieXRlKTsKLQkJKnJldCA9ICgoYnl0ZSAmIDB4NjApID4+IDUpOwotCQlyZXN1bHQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBUREE5ODQwX1RFU1Q6Ci0JCWRwcmludGsoIlREQTk4NDBfVEVTVDogMHglMDJ4XG4iLCBieXRlKTsKLQotCQkvKiBtYXNrIG91dCBpcnJlbGV2YW50IGJpdHMgKi8KLQkJYnl0ZSAmPSAweDM7Ci0KLQkJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFRFU1QsIGJ5dGUpOwotCQlpZiAocmVzdWx0KQotCQkJZHByaW50aygiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmVzdWx0KTsKKwkJdGRhOTg0MF93cml0ZShjbGllbnQsIFNURVJFT19BREpVU1QsIGJ5dGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIAotCWlmIChyZXN1bHQpCi0JCXJldHVybiAtRUlPOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCB0ZGE5ODQwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCWludCByZXN1bHQgPSAwOwotCi0JaW50IGJ5dGUgPSAweDA7CisJaW50IHJlc3VsdDsKKwlpbnQgYnl0ZTsKIAogCS8qIGxldCdzIHNlZSB3aGV0aGVyIHRoaXMgYWRhcHRlciBjYW4gc3VwcG9ydCB3aGF0IHdlIG5lZWQgKi8KLQlpZiAoMCA9PSBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAotCQkJCSAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSB8Ci0JCQkJICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpIHsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCUkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBIHwKKwkJCUkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCiAJCXJldHVybiAwOwotCX0KIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2xpZW50IHN0cnVjdHVyZSAqLwotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGllbnQpIHsKLQkJcHJpbnRrKCJub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBmaWxsIGNsaWVudCBzdHJ1Y3R1cmUgKi8KLQltZW1jcHkoY2xpZW50LCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0KLQkvKiB0ZWxsIHRoZSBpMmMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKDAgIT0gKHJlc3VsdCA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWtmcmVlKGNsaWVudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKIAogCS8qIHNldCBpbml0aWFsIHZhbHVlcyBmb3IgbGV2ZWwgJiBzdGVyZW8gLSBhZGp1c3RtZW50LCBtb2RlICovCiAJYnl0ZSA9IDA7Ci0JcmVzdWx0ICA9IGNvbW1hbmQoY2xpZW50LCBUREE5ODQwX0xFVkVMX0FESlVTVCwgJmJ5dGUpOwotCXJlc3VsdCArPSBjb21tYW5kKGNsaWVudCwgVERBOTg0MF9TVEVSRU9fQURKVVNULCAmYnl0ZSk7Ci0JYnl0ZSA9IFREQTk4NDBfU0VUX01PTk87Ci0JcmVzdWx0ID0gY29tbWFuZChjbGllbnQsIFREQTk4NDBfU1dJVENILCAmYnl0ZSk7CisJcmVzdWx0ID0gdGRhOTg0MF9jb21tYW5kKGNsaWVudCwgVERBOTg0MF9MRVZFTF9BREpVU1QsICZieXRlKTsKKwlyZXN1bHQgKz0gdGRhOTg0MF9jb21tYW5kKGNsaWVudCwgVERBOTg0MF9TVEVSRU9fQURKVVNULCAmYnl0ZSk7CisJdGRhOTg0MF93cml0ZShjbGllbnQsIFNXSVRDSCwgVERBOTg0MF9TRVRfU1RFUkVPKTsKIAlpZiAocmVzdWx0KSB7Ci0JCWRwcmludGsoImNvdWxkIG5vdCBpbml0aWFsaXplIHRkYTk4NDBcbiIpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJjb3VsZCBub3QgaW5pdGlhbGl6ZSB0ZGE5ODQwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCi0JcHJpbnRrKCJ0ZGE5ODQwOiBkZXRlY3RlZCBAIDB4JTAyeCBvbiBhZGFwdGVyICVzXG4iLCBhZGRyZXNzLCAmY2xpZW50LT5hZGFwdGVyLT5uYW1lWzBdKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCB0ZGE5ODQwX2xlZ2FjeV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCi0JaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19IV19TQUE3MTQ2KSB7Ci0JCWRwcmludGsoInJlZnVzaW5nIHRvIHByb2JlIG9uIHVua25vd24gYWRhcHRlciBbbmFtZT0nJXMnLGlkPTB4JXhdXG4iLCBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyLT5pZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJmRldGVjdCk7CisJLyogTGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3duIGFkYXB0ZXIgd2UgY2FuIGF0dGFjaCB0by4KKwkgICBQcmV2ZW50cyBjb25mbGljdHMgd2l0aCB0dmF1ZGlvLmMuICovCisJcmV0dXJuIGFkYXB0ZXItPmlkID09IEkyQ19IV19TQUE3MTQ2OwogfQotCi1zdGF0aWMgaW50IGRldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludCByZXQgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCWtmcmVlKGNsaWVudCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0ZGE5ODQwIiwKLQl9LAotCS5pZAk9IEkyQ19EUklWRVJJRF9UREE5ODQwLAotCS5hdHRhY2hfYWRhcHRlcgk9IGF0dGFjaCwKLQkuZGV0YWNoX2NsaWVudAk9IGRldGFjaCwKLQkuY29tbWFuZAk9IGNvbW1hbmQsCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGRhOTg0MF9pZFtdID0geworCXsgInRkYTk4NDAiLCAwIH0sCisJeyB9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRkYTk4NDBfaWQpOwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0geworc3RhdGljIHN0cnVjdCB2NGwyX2kyY19kcml2ZXJfZGF0YSB2NGwyX2kyY19kYXRhID0gewogCS5uYW1lID0gInRkYTk4NDAiLAotCS5kcml2ZXIgPSAmZHJpdmVyLAorCS5kcml2ZXJpZCA9IEkyQ19EUklWRVJJRF9UREE5ODQwLAorCS5jb21tYW5kID0gdGRhOTg0MF9jb21tYW5kLAorCS5wcm9iZSA9IHRkYTk4NDBfcHJvYmUsCisJLmxlZ2FjeV9wcm9iZSA9IHRkYTk4NDBfbGVnYWN5X3Byb2JlLAorCS5pZF90YWJsZSA9IHRkYTk4NDBfaWQsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0aGlzX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGhpc19tb2R1bGVfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh0aGlzX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KHRoaXNfbW9kdWxlX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJ0ZGE5ODQwIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODQwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuaAppbmRleCA3ZGE4NDMyLi5kYzEyYWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NDAuaApAQCAtMywyNCArMyw2IEBACiAKICNkZWZpbmUJSTJDX0FERFJfVERBOTg0MAkJMHg0MgogCi0jZGVmaW5lIFREQTk4NDBfREVURUNUCQlfSU9SKCd2JywxLGludCkKLS8qIHJldHVybiB2YWx1ZXMgZm9yIFREQTk4NDBfREVUQ1QgKi8KLSNkZWZpbmUgVERBOTg0MF9NT05PX0RFVEVDVAkJMHgwCi0jZGVmaW5lCVREQTk4NDBfRFVBTF9ERVRFQ1QJCTB4MQotI2RlZmluZQlUREE5ODQwX1NURVJFT19ERVRFQ1QJCTB4MgotI2RlZmluZQlUREE5ODQwX0lOQ09SUkVDVF9ERVRFQ1QJMHgzCi0KLSNkZWZpbmUgVERBOTg0MF9TV0lUQ0gJCV9JT1coJ3YnLDIsaW50KQotLyogbW9kZXMgdGhhbiBjYW4gYmUgc2V0IHdpdGggVERBOTg0MF9TV0lUQ0ggKi8KLSNkZWZpbmUJVERBOTg0MF9TRVRfTVVURQkJMHgwMAotI2RlZmluZQlUREE5ODQwX1NFVF9NT05PCQkweDEwCi0jZGVmaW5lCVREQTk4NDBfU0VUX1NURVJFTwkJMHgyYQotI2RlZmluZQlUREE5ODQwX1NFVF9MQU5HMQkJMHgxMgotI2RlZmluZQlUREE5ODQwX1NFVF9MQU5HMgkJMHgxZQotI2RlZmluZQlUREE5ODQwX1NFVF9CT1RICQkweDFhCi0jZGVmaW5lCVREQTk4NDBfU0VUX0JPVEhfUgkJMHgxNgotI2RlZmluZQlUREE5ODQwX1NFVF9FWFRFUk5BTAkJMHg3YQotCiAvKiB2YWx1ZXMgbWF5IHJhbmdlIGJldHdlZW4gKzIuNSBhbmQgLTIuMDsKICAgIHRoZSB2YWx1ZSBoYXMgdG8gYmUgbXVsdGlwbGllZCB3aXRoIDEwICovCiAjZGVmaW5lIFREQTk4NDBfTEVWRUxfQURKVVNUCV9JT1coJ3YnLDMsaW50KQpAQCAtMjksNyArMTEsNCBAQAogICAgdGhlIHZhbHVlIGhhcyB0byBiZSBtdWx0aXBsaWVkIHdpdGggMTAgKi8KICNkZWZpbmUgVERBOTg0MF9TVEVSRU9fQURKVVNUCV9JT1coJ3YnLDQsaW50KQogCi0vKiBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkICovCi0jZGVmaW5lIFREQTk4NDBfVEVTVAkJX0lPVygndicsNSxpbnQpCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE2NDE1Yy5jCmluZGV4IDQyMWMxNDQuLmNkZTA5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQxNWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MTVjLmMKQEAgLTIsNiArMiw3IEBACiAgICAgdGVhNjQxNWMgLSBpMmMtZHJpdmVyIGZvciB0aGUgdGVhNjQxNWMgYnkgU0dTIFRob21zb24KIAogICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIE1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+CisgICAgQ29weXJpZ2h0IChDKSAyMDA4IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgogCiAgICAgVGhlIHRlYTY0MTVjIGlzIGEgYnVzIGNvbnRyb2xsZWQgdmlkZW8tbWF0cml4LXN3aXRjaAogICAgIHdpdGggOCBpbnB1dHMgYW5kIDYgb3V0cHV0cy4KQEAgLTMwLDE4ICszMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaTJjLWRydi1sZWdhY3kuaD4KICNpbmNsdWRlICJ0ZWE2NDE1Yy5oIgogCi1zdGF0aWMgaW50IGRlYnVnOwkJLyogaW5zbW9kIHBhcmFtZXRlciAqLworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIdW5vbGQgPG1pY2hhZWxAbWlodS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidGVhNjQxNWMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGV2aWNlIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwogCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAotCSAgICBkbyB7IGlmIChkZWJ1ZykgeyBwcmludGsoIiVzOiAlcygpWyVkXTogIiwgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX0xJTkVfXyk7IHByaW50ayhhcmdzKTsgfSB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFRFQTY0MTVDX05VTV9JTlBVVFMJOAotI2RlZmluZSBURUE2NDE1Q19OVU1fT1VUUFVUUwk2CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKIAogLyogYWRkcmVzc2VzIHRvIHNjYW4sIGZvdW5kIG9ubHkgYXQgMHgwMyBhbmQvb3IgMHg0MyAoNy1iaXQpICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfVEVBNjQxNUNfMSwgSTJDX1RFQTY0MTVDXzIsIEkyQ19DTElFTlRfRU5EIH07CkBAIC00OSw2MCArNTAsNiBAQAogLyogbWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KIEkyQ19DTElFTlRfSU5TTU9EOwogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQotLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCi1zdGF0aWMgaW50IGRldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQlpbnQgZXJyID0gMDsKLQotCS8qIGxldCdzIHNlZSB3aGV0aGVyIHRoaXMgYWRhcHRlciBjYW4gc3VwcG9ydCB3aGF0IHdlIG5lZWQgKi8KLQlpZiAoMCA9PSBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNsaWVudCBzdHJ1Y3R1cmUgKi8KLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwotCWlmICghY2xpZW50KSB7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIGZpbGwgY2xpZW50IHN0cnVjdHVyZSAqLwotCW1lbWNweShjbGllbnQsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwotCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQotCS8qIHRlbGwgdGhlIGkyYyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KLQlpZiAoMCAhPSAoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlwcmludGsoInRlYTY0MTVjOiBkZXRlY3RlZCBAIDB4JTAyeCBvbiBhZGFwdGVyICVzXG4iLCBhZGRyZXNzLCAmY2xpZW50LT5hZGFwdGVyLT5uYW1lWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCi0JaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19IV19TQUE3MTQ2KSB7Ci0JCWRwcmludGsoInJlZnVzaW5nIHRvIHByb2JlIG9uIHVua25vd24gYWRhcHRlciBbbmFtZT0nJXMnLGlkPTB4JXhdXG4iLCBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyLT5pZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJmRldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJldCA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0Ja2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gcmV0OwotfQotCiAvKiBtYWtlcyBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgaW5wdXQtcGluICdpJyBhbmQgdGhlIG91dHB1dC1waW4gJ28nCiAgICBmb3IgdGhlIHRlYTY0MTVjLWNsaWVudCAnY2xpZW50JyAqLwogc3RhdGljIGludCBzd2l0Y2hfbWF0cml4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpLCBpbnQgbykKQEAgLTExMCw3ICs1Nyw3IEBACiAJdTggYnl0ZSA9IDA7CiAJaW50IHJldDsKIAotCWRwcmludGsoImFkcjoweCUwMngsIGk6JWQsIG86JWRcbiIsIGNsaWVudC0+YWRkciwgaSwgbyk7CisJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiaT0lZCwgbz0lZFxuIiwgaSwgbyk7CiAKIAkvKiBjaGVjayBpZiB0aGUgcGlucyBhcmUgdmFsaWQgKi8KIAlpZiAoMCA9PSAoKDEgPT0gaSB8fCAgMyA9PSBpIHx8ICA1ID09IGkgfHwgIDYgPT0gaSB8fCAgOCA9PSBpIHx8IDEwID09IGkgfHwgMjAgPT0gaSB8fCAxMSA9PSBpKQpAQCAtMTY4LDE0ICsxMTUsMTQgQEAKIAogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgYnl0ZSk7CiAJaWYgKHJldCkgewotCQlkcHJpbnRrKCJpMmNfc21idXNfd3JpdGVfYnl0ZSgpIGZhaWxlZCwgcmV0OiVkXG4iLCByZXQpOworCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsCisJCQkiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmV0KTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdGVhNjQxNWNfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdGVhNjQxNWNfbXVsdGlwbGV4ICp2ID0gKHN0cnVjdCB0ZWE2NDE1Y19tdWx0aXBsZXggKilhcmc7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xODcsMzggKzEzNCw0MCBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQotCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0ZWE2NDE1YyIsCi0JfSwKLQkuaWQgCT0gSTJDX0RSSVZFUklEX1RFQTY0MTVDLAotCS5hdHRhY2hfYWRhcHRlcgk9IGF0dGFjaCwKLQkuZGV0YWNoX2NsaWVudAk9IGRldGFjaCwKLQkuY29tbWFuZAk9IGNvbW1hbmQsCi19OworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCitzdGF0aWMgaW50IHRlYTY0MTVjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIHN1cHBvcnQgd2hhdCB3ZSBuZWVkICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpKQorCQlyZXR1cm4gMDsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwl2NGxfaW5mbyhjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAorCQkJY2xpZW50LT5hZGRyIDw8IDEsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVhNjQxNWNfbGVnYWN5X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBMZXQncyBzZWUgd2hldGhlciB0aGlzIGlzIGEga25vd24gYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvLgorCSAgIFByZXZlbnRzIGNvbmZsaWN0cyB3aXRoIHR2YXVkaW8uYy4gKi8KKwlyZXR1cm4gYWRhcHRlci0+aWQgPT0gSTJDX0hXX1NBQTcxNDY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0ZWE2NDE1Y19pZFtdID0geworCXsgInRlYTY0MTVjIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0ZWE2NDE1Y19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9pMmNfZHJpdmVyX2RhdGEgdjRsMl9pMmNfZGF0YSA9IHsKIAkubmFtZSA9ICJ0ZWE2NDE1YyIsCi0JLmRyaXZlciA9ICZkcml2ZXIsCisJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1RFQTY0MTVDLAorCS5jb21tYW5kID0gdGVhNjQxNWNfY29tbWFuZCwKKwkucHJvYmUgPSB0ZWE2NDE1Y19wcm9iZSwKKwkubGVnYWN5X3Byb2JlID0gdGVhNjQxNWNfbGVnYWN5X3Byb2JlLAorCS5pZF90YWJsZSA9IHRlYTY0MTVjX2lkLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgdGhpc19tb2R1bGVfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRoaXNfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodGhpc19tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdCh0aGlzX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIdW5vbGQgPG1pY2hhZWxAbWlodS5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigidGVhNjQxNWMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTY0MjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQyMC5jCmluZGV4IGI1Yzg5NTcuLmU1MDgyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNjQyMC5jCkBAIC0yLDYgKzIsNyBAQAogICAgIHRlYTY0MjAgLSBpMmMtZHJpdmVyIGZvciB0aGUgdGVhNjQyMCBieSBTR1MgVGhvbXNvbgogCiAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgTWljaGFlbCBIdW5vbGQgPG1pY2hhZWxAbWlodS5kZT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CiAKICAgICBUaGUgdGVhNjQyMCBpcyBhIGJ1cyBjb250cm9sbGVkIGF1ZGlvLW1hdHJpeCB3aXRoIDUgc3RlcmVvIGlucHV0cywKICAgICA0IHN0ZXJlbyBvdXRwdXRzIGFuZCBnYWluIGNvbnRyb2wgZm9yIGVhY2ggb3V0cHV0LgpAQCAtMzAsMTUgKzMxLDE4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pMmMtZHJ2LWxlZ2FjeS5oPgogI2luY2x1ZGUgInRlYTY0MjAuaCIKIAotc3RhdGljIGludCBkZWJ1ZzsJCS8qIGluc21vZCBwYXJhbWV0ZXIgKi8KLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZXZpY2UgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEh1bm9sZCA8bWljaGFlbEBtaWh1LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0ZWE2NDIwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAotCSAgICBkbyB7IGlmIChkZWJ1ZykgeyBwcmludGsoIiVzOiAlcygpWyVkXTogIiwgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX0xJTkVfXyk7IHByaW50ayhhcmdzKTsgfSB9IHdoaWxlICgwKQorc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTEpIik7CiAKIC8qIGFkZHJlc3NlcyB0byBzY2FuLCBmb3VuZCBvbmx5IGF0IDB4NGMgYW5kL29yIDB4NGQgKDctQml0KSAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0FERFJfVEVBNjQyMF8xLCBJMkNfQUREUl9URUE2NDIwXzIsIEkyQ19DTElFTlRfRU5EIH07CkBAIC00NiwyMyArNTAsMjAgQEAKIC8qIG1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCiBJMkNfQ0xJRU5UX0lOU01PRDsKIAotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KIC8qIG1ha2UgYSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGlucHV0ICdpJyBhbmQgdGhlIG91dHB1dCAnbycKICAgIHdpdGggZ2FpbiAnZycgZm9yIHRoZSB0ZWE2NDIwLWNsaWVudCAnY2xpZW50JyAobm90ZTogaSA9IDYgbWVhbnMgJ211dGUnKSAqLwogc3RhdGljIGludCB0ZWE2NDIwX3N3aXRjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgaSwgaW50IG8sIGludCBnKQogewotCXU4IGJ5dGUgPSAwOworCXU4IGJ5dGU7CiAJaW50IHJldDsKIAotCWRwcmludGsoImFkcjoweCUwMngsIGk6JWQsIG86JWQsIGc6JWRcbiIsIGNsaWVudC0+YWRkciwgaSwgbywgZyk7CisJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiaT0lZCwgbz0lZCwgZz0lZFxuIiwgaSwgbywgZyk7CiAKIAkvKiBjaGVjayBpZiB0aGUgcGFyYW1ldGVycyBhcmUgdmFsaWQgKi8KIAlpZiAoaSA8IDEgfHwgaSA+IDYgfHwgbyA8IDEgfHwgbyA+IDQgfHwgZyA8IDAgfHwgZyA+IDYgfHwgZyAlIDIgIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JYnl0ZSAgPSAoKG8gLSAxKSA8PCA1KTsKKwlieXRlID0gKChvIC0gMSkgPDwgNSk7CiAJYnl0ZSB8PSAoaSAtIDEpOwogCiAJLyogdG8gdW5kZXJzdGFuZCB0aGlzLCBoYXZlIGEgbG9vayBhdCB0aGUgdGVhNjQyMC1zcGVjcyAocC41KSAqLwpAQCAtODIsNzYgKzgzLDE0IEBACiAKIAlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIGJ5dGUpOwogCWlmIChyZXQpIHsKLQkJZHByaW50aygiaTJjX3NtYnVzX3dyaXRlX2J5dGUoKSBmYWlsZWQsIHJldDolZFxuIiwgcmV0KTsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LAorCQkJImkyY19zbWJ1c193cml0ZV9ieXRlKCkgZmFpbGVkLCByZXQ6JWRcbiIsIHJldCk7CiAJCXJldHVybiAtRUlPOwogCX0KLQogCXJldHVybiAwOwogfQogCi0vKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KLXN0YXRpYyBpbnQgdGVhNjQyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlpbnQgZXJyID0gMCwgaSA9IDA7Ci0KLQkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIHN1cHBvcnQgd2hhdCB3ZSBuZWVkICovCi0JaWYgKDAgPT0gaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBjbGllbnQgc3RydWN0dXJlICovCi0JY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsaWVudCkgewotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBmaWxsIGNsaWVudCBzdHJ1Y3R1cmUgKi8KLQltZW1jcHkoY2xpZW50LCAmY2xpZW50X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpKTsKLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0KLQkvKiB0ZWxsIHRoZSBpMmMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKDAgIT0gKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKSB7Ci0JCWtmcmVlKGNsaWVudCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JLyogc2V0IGluaXRpYWwgdmFsdWVzOiBzZXQgIm11dGUiLWlucHV0IHRvIGFsbCBvdXRwdXRzIGF0IGdhaW4gMCAqLwotCWVyciA9IDA7Ci0JZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewotCQllcnIgKz0gdGVhNjQyMF9zd2l0Y2goY2xpZW50LCA2LCBpLCAwKTsKLQl9Ci0JaWYgKGVycikgewotCQlkcHJpbnRrKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSB0ZWE2NDIwXG4iKTsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcHJpbnRrKCJ0ZWE2NDIwOiBkZXRlY3RlZCBAIDB4JTAyeCBvbiBhZGFwdGVyICVzXG4iLCBhZGRyZXNzLCAmY2xpZW50LT5hZGFwdGVyLT5uYW1lWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogbGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3cgYWRhcHRlciB3ZSBjYW4gYXR0YWNoIHRvICovCi0JaWYgKGFkYXB0ZXItPmlkICE9IEkyQ19IV19TQUE3MTQ2KSB7Ci0JCWRwcmludGsoInJlZnVzaW5nIHRvIHByb2JlIG9uIHVua25vd24gYWRhcHRlciBbbmFtZT0nJXMnLGlkPTB4JXhdXG4iLCBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyLT5pZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgJnRlYTY0MjBfZGV0ZWN0KTsKLX0KLQotc3RhdGljIGludCBkZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgcmV0ID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZShjbGllbnQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHRlYTY0MjBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdGVhNjQyMF9tdWx0aXBsZXggKmEgPSAoc3RydWN0IHRlYTY0MjBfbXVsdGlwbGV4ICopYXJnOwogCWludCByZXN1bHQgPSAwOwpAQCAtMTY3LDM0ICsxMDYsNTAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInRlYTY0MjAiLAotCX0sCi0JLmlkCT0gSTJDX0RSSVZFUklEX1RFQTY0MjAsCi0JLmF0dGFjaF9hZGFwdGVyCT0gYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50CT0gZGV0YWNoLAotCS5jb21tYW5kCT0gY29tbWFuZCwKLX07CisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KK3N0YXRpYyBpbnQgdGVhNjQyMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVyciwgaTsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkvKiBsZXQncyBzZWUgd2hldGhlciB0aGlzIGFkYXB0ZXIgY2FuIHN1cHBvcnQgd2hhdCB3ZSBuZWVkICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpKQorCQlyZXR1cm4gLUVJTzsKKworCXY0bF9pbmZvKGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsCisJCQljbGllbnQtPmFkZHIgPDwgMSwgY2xpZW50LT5hZGFwdGVyLT5uYW1lKTsKKworCS8qIHNldCBpbml0aWFsIHZhbHVlczogc2V0ICJtdXRlIi1pbnB1dCB0byBhbGwgb3V0cHV0cyBhdCBnYWluIDAgKi8KKwllcnIgPSAwOworCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKwkJZXJyICs9IHRlYTY0MjBfc3dpdGNoKGNsaWVudCwgNiwgaSwgMCk7CisJfQorCWlmIChlcnIpIHsKKwkJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiY291bGQgbm90IGluaXRpYWxpemUgdGVhNjQyMFxuIik7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWE2NDIwX2xlZ2FjeV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogTGV0J3Mgc2VlIHdoZXRoZXIgdGhpcyBpcyBhIGtub3duIGFkYXB0ZXIgd2UgY2FuIGF0dGFjaCB0by4KKwkgICBQcmV2ZW50cyBjb25mbGljdHMgd2l0aCB0dmF1ZGlvLmMuICovCisJcmV0dXJuIGFkYXB0ZXItPmlkID09IEkyQ19IV19TQUE3MTQ2OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGVhNjQyMF9pZFtdID0geworCXsgInRlYTY0MjAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRlYTY0MjBfaWQpOworCitzdGF0aWMgc3RydWN0IHY0bDJfaTJjX2RyaXZlcl9kYXRhIHY0bDJfaTJjX2RhdGEgPSB7CiAJLm5hbWUgPSAidGVhNjQyMCIsCi0JLmRyaXZlciA9ICZkcml2ZXIsCisJLmRyaXZlcmlkID0gSTJDX0RSSVZFUklEX1RFQTY0MjAsCisJLmNvbW1hbmQgPSB0ZWE2NDIwX2NvbW1hbmQsCisJLnByb2JlID0gdGVhNjQyMF9wcm9iZSwKKwkubGVnYWN5X3Byb2JlID0gdGVhNjQyMF9sZWdhY3lfcHJvYmUsCisJLmlkX3RhYmxlID0gdGVhNjQyMF9pZCwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRoaXNfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0aGlzX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHRoaXNfbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQodGhpc19tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVub2xkIDxtaWNoYWVsQG1paHUuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInRlYTY0MjAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGY1MDZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBEcml2ZXIgZm9yIFBoaWxpcHMgU0FCMzAzNiAiQ0lUQUMiIHR1bmVyIGNvbnRyb2wgY2hpcC4KLSAqCi0gKiBBdXRob3I6IFBoaWwgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Ci0gKgotICogVGhlIFNBQjMwMzYgaXMganVzdCBhYm91dCBkaWZmZXJlbnQgZW5vdWdoIGZyb20gdGhlIGNoaXBzIHRoYXQKLSAqIHR1bmVyLmMgY29wZXMgd2l0aCB0byBtYWtlIGl0IG5vdCB3b3J0aCB0aGUgZWZmb3J0IHRvIGNyb3diYXIKLSAqIHRoZSBzdXBwb3J0IGludG8gdGhhdCBmaWxlLiAgU28gaW5zdGVhZCB3ZSBoYXZlIGEgc2VwYXJhdGUgZHJpdmVyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0KLXN0YXRpYyBpbnQgZGVidWc7CS8qIGluc21vZCBwYXJhbWV0ZXIgKi8KLXN0YXRpYyBpbnQgdGhpc19hZGFwOwotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg2MCwgMHg2MSwgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmUgPSBJMkNfQ0xJRU5UX0VORDsKLQotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7Ci0JLm5vcm1hbF9pMmMJPSBub3JtYWxfaTJjLAotCS5wcm9iZQkJPSAmaWdub3JlLAotCS5pZ25vcmUJCT0gJmlnbm9yZSwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIKLXR1bmVyX2dldHN0YXR1cyAoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0JdW5zaWduZWQgY2hhciBieXRlOwotCWlmIChpMmNfbWFzdGVyX3JlY3YoYywgJmJ5dGUsIDEpICE9IDEpCi0JCXByaW50ayhLRVJOX0VSUiAidHVuZXItMzAzNjogSS9PIGVycm9yLlxuIik7Ci0JcmV0dXJuIGJ5dGU7Ci19Ci0KLSNkZWZpbmUgVFVORVJfRkwgICAgICAgIDB4ODAKLQotc3RhdGljIGludAotdHVuZXJfaXNsb2NrZWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXJldHVybiAodHVuZXJfZ2V0c3RhdHVzKGMpICYgVFVORVJfRkwpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkCi1zZXRfdHZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgaW50IGZyZXEpCi17Ci0JdTE2IGRpdiA9ICgoZnJlcSAqIDIwKSAvIDE2KTsKLQl1bnNpZ25lZCBsb25nIGdpdmVfdXAgPSBqaWZmaWVzICsgSFo7Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbMl07Ci0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICJ0dW5lcjogc2V0dGluZyBmcmVxdWVuY3kgJWRNSHosIGRpdmlzb3IgJXhcbiIsIGZyZXEgLyAxNiwgZGl2KTsKLQotCS8qIFNlbGVjdCBoaWdoIHR1bmluZyBjdXJyZW50ICovCi0JYnVmZmVyWzBdID0gMHgyOTsKLQlidWZmZXJbMV0gPSAweDNlOwotCi0JaWYgKGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDIpICE9IDIpCi0JCXByaW50aygidHVuZXI6IGkyYyBpL28gZXJyb3IgMVxuIik7Ci0KLQlidWZmZXJbMF0gPSAweDgwIHwgKChkaXY+PjgpICYgMHg3Zik7Ci0JYnVmZmVyWzFdID0gZGl2ICYgMHhmZjsKLQotCWlmIChpMmNfbWFzdGVyX3NlbmQoYywgYnVmZmVyLCAyKSAhPSAyKQotCQlwcmludGsoInR1bmVyOiBpMmMgaS9vIGVycm9yIDJcbiIpOwotCi0Jd2hpbGUgKCF0dW5lcl9pc2xvY2tlZChjKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBnaXZlX3VwKSkKLQkJc2NoZWR1bGUoKTsKLQotCWlmICghdHVuZXJfaXNsb2NrZWQoYykpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInR1bmVyOiBmYWlsZWQgdG8gYWNoaWV2ZSBQTEwgbG9ja1xuIik7Ci0KLQkvKiBTZWxlY3QgbG93IHR1bmluZyBjdXJyZW50IGFuZCBlbmdhZ2UgQUZDICovCi0JYnVmZmVyWzBdID0gMHgyOTsKLQlidWZmZXJbMV0gPSAweGIyOwotCi0JaWYgKGkyY19tYXN0ZXJfc2VuZChjLCBidWZmZXIsIDIpICE9IDIpCi0JCXByaW50aygidHVuZXI6IGkyYyBpL28gZXJyb3IgM1xuIik7Ci0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICJ0dW5lcjogc3RhdHVzICUwMnhcbiIsIHR1bmVyX2dldHN0YXR1cyhjKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludAotdHVuZXJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQotewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltdID0geyAweDI5LCAweDMyLCAweDJhLCAwLCAweDJiLCAwIH07Ci0KLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCi0JaWYgKHRoaXNfYWRhcCA+IDApCi0JCXJldHVybiAtMTsKLQl0aGlzX2FkYXArKzsKLQotCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLQljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7Ci0KLQljbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwotCWlmIChjbGllbnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGNsaWVudCwgJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7Ci0KLQlwcmludGsoInR1bmVyOiBTQUIzMDM2IGZvdW5kLCBzdGF0dXMgJTAyeFxuIiwgdHVuZXJfZ2V0c3RhdHVzKGNsaWVudCkpOwotCi0JaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKLQotCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIDIpICE9IDIpCi0JCXByaW50aygidHVuZXI6IGkyYyBpL28gZXJyb3IgMVxuIik7Ci0JaWYgKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlcisyLCAyKSAhPSAyKQotCQlwcmludGsoInR1bmVyOiBpMmMgaS9vIGVycm9yIDJcbiIpOwotCWlmIChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIrNCwgMikgIT0gMikKLQkJcHJpbnRrKCJ0dW5lcjogaTJjIGkvbyBlcnJvciAzXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdHVuZXJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci10dW5lcl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgKmlhcmcgPSAoaW50Kilhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkKLQl7Ci0JCWNhc2UgVklESU9DU0ZSRVE6Ci0JCQlzZXRfdHZfZnJlcShjbGllbnQsICppYXJnKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXR1bmVyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQl0aGlzX2FkYXAgPSAwOwotCWlmIChhZGFwLT5pZCA9PSBJMkNfSFdfQl9MUCkKLQkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0dW5lcl9hdHRhY2gpOwotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIKLWkyY19kcml2ZXJfdHVuZXIgPQotewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0JInNhYjMwMzYiLAotCX0sCi0JLmlkCQk9CUkyQ19EUklWRVJJRF9TQUIzMDM2LAotCS5hdHRhY2hfYWRhcHRlciA9CXR1bmVyX3Byb2JlLAotCS5kZXRhY2hfY2xpZW50ICA9CXR1bmVyX2RldGFjaCwKLQkuY29tbWFuZAk9CXR1bmVyX2NvbW1hbmQKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQotewotCS5kcml2ZXIJCT0gJmkyY19kcml2ZXJfdHVuZXIsCi0JLm5hbWUJCT0gIlNBQjMwMzYiLAotfTsKLQotc3RhdGljIGludCBfX2luaXQKLXR1bmVyMzAzNl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX3R1bmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci10dW5lcjMwMzZfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyX3R1bmVyKTsKLX0KLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTQUIzMDM2IHR1bmVyIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJFbmFibGUgZGVidWdnaW5nIG91dHB1dCIpOwotCi1tb2R1bGVfaW5pdCh0dW5lcjMwMzZfaW5pdCk7Ci1tb2R1bGVfZXhpdCh0dW5lcjMwMzZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IGQ4MDZhMzUuLjRhNzczNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC05Miw3ICs5Miw2IEBACiAKIAl1bnNpZ25lZCBpbnQgICAgICAgIHR5cGU7IC8qIGNoaXAgdHlwZSBpZCAqLwogCXVuc2lnbmVkIGludCAgICAgICAgY29uZmlnOwotCWludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CiAJY29uc3QgY2hhciAgICAgICAgICAqbmFtZTsKIH07CiAKQEAgLTM0Niw3ICszNDUsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXRfdHlwZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IHR5cGUsCiAJCSAgICAgdW5zaWduZWQgaW50IG5ld19tb2RlX21hc2ssIHVuc2lnbmVkIGludCBuZXdfY29uZmlnLAotCQkgICAgIGludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCxpbnQgYXJnKSkKKwkJICAgICBpbnQgKCp0dW5lcl9jYWxsYmFjaykgKHZvaWQgKmRldiwgaW50IGNvbXBvbmVudCwgaW50IGNtZCwgaW50IGFyZykpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCXN0cnVjdCBkdmJfdHVuZXJfb3BzICpmZV90dW5lcl9vcHMgPSAmdC0+ZmUub3BzLnR1bmVyX29wczsKQEAgLTM2Miw3ICszNjEsNyBAQAogCXQtPmNvbmZpZyA9IG5ld19jb25maWc7CiAJaWYgKHR1bmVyX2NhbGxiYWNrICE9IE5VTEwpIHsKIAkJdHVuZXJfZGJnKCJkZWZpbmluZyBHUElPIGNhbGxiYWNrXG4iKTsKLQkJdC0+dHVuZXJfY2FsbGJhY2sgPSB0dW5lcl9jYWxsYmFjazsKKwkJdC0+ZmUuY2FsbGJhY2sgPSB0dW5lcl9jYWxsYmFjazsKIAl9CiAKIAlpZiAodC0+bW9kZSA9PSBUX1VOSU5JVElBTElaRUQpIHsKQEAgLTM4NSw3ICszODQsNiBAQAogCXsKIAkJc3RydWN0IHRkYTgyOXhfY29uZmlnIGNmZyA9IHsKIAkJCS5sbmFfY2ZnICAgICAgICA9IHQtPmNvbmZpZywKLQkJCS50dW5lcl9jYWxsYmFjayA9IHQtPnR1bmVyX2NhbGxiYWNrLAogCQl9OwogCQlpZiAoIWR2Yl9hdHRhY2godGRhODI5eF9hdHRhY2gsICZ0LT5mZSwgdC0+aTJjLT5hZGFwdGVyLAogCQkJCXQtPmkyYy0+YWRkciwgJmNmZykpCkBAIC00MzMsNyArNDMxLDYgQEAKIAkJc3RydWN0IHhjMjAyOF9jb25maWcgY2ZnID0gewogCQkJLmkyY19hZGFwICA9IHQtPmkyYy0+YWRhcHRlciwKIAkJCS5pMmNfYWRkciAgPSB0LT5pMmMtPmFkZHIsCi0JCQkuY2FsbGJhY2sgID0gdC0+dHVuZXJfY2FsbGJhY2ssCiAJCX07CiAJCWlmICghZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLCAmdC0+ZmUsICZjZmcpKQogCQkJZ290byBhdHRhY2hfZmFpbGVkOwpAQCAtNDUwLDEwICs0NDcsOCBAQAogCiAJCXhjNTAwMF9jZmcuaTJjX2FkZHJlc3MJICA9IHQtPmkyYy0+YWRkcjsKIAkJeGM1MDAwX2NmZy5pZl9raHoJICA9IDUzODA7Ci0JCXhjNTAwMF9jZmcudHVuZXJfY2FsbGJhY2sgPSB0LT50dW5lcl9jYWxsYmFjazsKIAkJaWYgKCFkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsCi0JCQkJJnQtPmZlLCB0LT5pMmMtPmFkYXB0ZXIsICZ4YzUwMDBfY2ZnLAotCQkJCWMtPmFkYXB0ZXItPmFsZ29fZGF0YSkpCisJCQkJJnQtPmZlLCB0LT5pMmMtPmFkYXB0ZXIsICZ4YzUwMDBfY2ZnKSkKIAkJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKIAogCQl4Y190dW5lcl9vcHMgPSAmdC0+ZmUub3BzLnR1bmVyX29wczsKQEAgLTEyMjUsNyArMTIyMCw3IEBACiAJfSBlbHNlIHsKIAkJdC0+bW9kZSA9IFY0TDJfVFVORVJfRElHSVRBTF9UVjsKIAl9Ci0Jc2V0X3R5cGUoY2xpZW50LCB0LT50eXBlLCB0LT5tb2RlX21hc2ssIHQtPmNvbmZpZywgdC0+dHVuZXJfY2FsbGJhY2spOworCXNldF90eXBlKGNsaWVudCwgdC0+dHlwZSwgdC0+bW9kZV9tYXNrLCB0LT5jb25maWcsIHQtPmZlLmNhbGxiYWNrKTsKIAlsaXN0X2FkZF90YWlsKCZ0LT5saXN0LCAmdHVuZXJfbGlzdCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCmluZGV4IDQ2MzY4MGIuLmI1OWU0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC0xNzkyLDcgKzE3OTIsNyBAQAogCQlicmVhazsKIAljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKIAkJY2hpcC0+bW9kZSA9IDA7IC8qIGF1dG9tYXRpYyAqLwotCQlpZiAoZGVzYy0+Y2hlY2ttb2RlKSB7CisJCWlmIChkZXNjLT5jaGVja21vZGUgJiYgZGVzYy0+c2V0bW9kZSkgewogCQkJZGVzYy0+c2V0bW9kZShjaGlwLFY0TDJfVFVORVJfTU9ERV9NT05PKTsKIAkJCWlmIChjaGlwLT5wcmV2bW9kZSAhPSBWNEwyX1RVTkVSX01PREVfTU9OTykKIAkJCQljaGlwLT5wcmV2bW9kZSA9IC0xOyAvKiByZXNldCBwcmV2aW91cyBtb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9pYm1jYW0uYwppbmRleCBjYzI3ZWZlLi4yODQyMWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMKQEAgLTI1OCw3ICsyNTgsOSBAQAogCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDIpID09IDB4MDApKQogCQkJewogI2lmIDAJCQkJLyogVGhpcyBjb2RlIGhlbHBzIHRvIGRldGVjdCBuZXcgZnJhbWUgbWFya2VycyAqLwotCQkJCWluZm8oIkhlYWRlciBzaWc6IDAwIEZGIDAwICUwMlgiLCBSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDMpKTsKKwkJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkJICJIZWFkZXIgc2lnOiAwMCBGRiAwMCAlMDJYXG4iLAorCQkJCQkgUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAzKSk7CiAjZW5kaWYKIAkJCQlmcmFtZS0+aGVhZGVyID0gUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAzKTsKIAkJCQlpZiAoKGZyYW1lLT5oZWFkZXIgPT0gSERSU0lHX01PREVMMV8xMjh4OTYpIHx8CkBAIC0yNjYsNyArMjY4LDggQEAKIAkJCQkgICAgKGZyYW1lLT5oZWFkZXIgPT0gSERSU0lHX01PREVMMV8zNTJ4Mjg4KSkKIAkJCQl7CiAjaWYgMAotCQkJCQlpbmZvKCJIZWFkZXIgZm91bmQuIik7CisJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJICJIZWFkZXIgZm91bmQuXG4iKTsKICNlbmRpZgogCQkJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIG1hcmtlcl9sZW4pOwogCQkJCQlpY2FtLT5oYXNfaGRyID0gMTsKQEAgLTI5NSw3ICsyOTgsNyBAQAogCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDEpID09IDB4RkYpKQogCQkJewogI2lmIDAKLQkJCQlpbmZvKCJIZWFkZXIgZm91bmQuIik7CisJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICJIZWFkZXIgZm91bmQuXG4iKTsKICNlbmRpZgogCQkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgbWFya2VyX2xlbik7CiAJCQkJaWNhbS0+aGFzX2hkciA9IDE7CkBAIC0zMzgsNyArMzQxLDcgQEAKIAkJCQlieXRlNCA9IFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMyk7CiAJCQkJZnJhbWUtPmhlYWRlciA9IChieXRlMyA8PCA4KSB8IGJ5dGU0OwogI2lmIDAKLQkJCQlpbmZvKCJIZWFkZXIgZm91bmQuIik7CisJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICJIZWFkZXIgZm91bmQuXG4iKTsKICNlbmRpZgogCQkJCVJJTkdfUVVFVUVfREVRVUVVRV9CWVRFUygmdXZkLT5kcCwgbWFya2VyX2xlbik7CiAJCQkJaWNhbS0+aGFzX2hkciA9IDE7CkBAIC0zNTQsNyArMzU3LDggQEAKIAl9CiAJaWYgKCFpY2FtLT5oYXNfaGRyKSB7CiAJCWlmICh1dmQtPmRlYnVnID4gMikKLQkJCWluZm8oIlNraXBwaW5nIGZyYW1lLCBubyBoZWFkZXIiKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCSAiU2tpcHBpbmcgZnJhbWUsIG5vIGhlYWRlclxuIik7CiAJCXJldHVybiBzY2FuX0VuZFBhcnNlOwogCX0KIApAQCAtODgxLDcgKzg4NSw5IEBACiAJICovCiAJaWYgKChmcmFtZS0+Y3VybGluZSArIDEpID49IGRhdGFfaCkgewogCQlpZiAodXZkLT5kZWJ1ZyA+PSAzKQotCQkJaW5mbygiUmVhY2hlZCBsaW5lICVkLiAoZnJhbWUgaXMgZG9uZSkiLCBmcmFtZS0+Y3VybGluZSk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIlJlYWNoZWQgbGluZSAlZC4gKGZyYW1lIGlzIGRvbmUpXG4iLAorCQkJCSBmcmFtZS0+Y3VybGluZSk7CiAJCXJldHVybiBzY2FuX05leHRGcmFtZTsKIAl9CiAKQEAgLTk1NCw4ICs5NjAsOSBAQAogCiAJaWYgKGZyYW1lLT5jdXJsaW5lID49IFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSkgewogCQlpZiAodXZkLT5kZWJ1ZyA+PSAzKSB7Ci0JCQlpbmZvKCJBbGwgcmVxdWVzdGVkIGxpbmVzICglbGQuKSBkb25lLiIsCi0JCQkgICAgIFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIkFsbCByZXF1ZXN0ZWQgbGluZXMgKCVsZC4pIGRvbmUuXG4iLAorCQkJCSBWSURFT1NJWkVfWShmcmFtZS0+cmVxdWVzdCkpOwogCQl9CiAJCXJldHVybiBzY2FuX05leHRGcmFtZTsKIAl9IGVsc2UKQEAgLTEwMDAsNyArMTAwNyw5IEBACiAJICovCiAJaWYgKChmcmFtZS0+Y3VybGluZSArIDEpID49IGRhdGFfaCkgewogCQlpZiAodXZkLT5kZWJ1ZyA+PSAzKQotCQkJaW5mbygiUmVhY2hlZCBsaW5lICVkLiAoZnJhbWUgaXMgZG9uZSkiLCBmcmFtZS0+Y3VybGluZSk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIlJlYWNoZWQgbGluZSAlZC4gKGZyYW1lIGlzIGRvbmUpXG4iLAorCQkJCSBmcmFtZS0+Y3VybGluZSk7CiAJCXJldHVybiBzY2FuX05leHRGcmFtZTsKIAl9CiAKQEAgLTEwNDksOCArMTA1OCw5IEBACiAKIAlpZiAoZnJhbWUtPmN1cmxpbmUgPj0gVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKSB7CiAJCWlmICh1dmQtPmRlYnVnID49IDMpIHsKLQkJCWluZm8oIkFsbCByZXF1ZXN0ZWQgbGluZXMgKCVsZC4pIGRvbmUuIiwKLQkJCSAgICAgVklERU9TSVpFX1koZnJhbWUtPnJlcXVlc3QpKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCSAiQWxsIHJlcXVlc3RlZCBsaW5lcyAoJWxkLikgZG9uZS5cbiIsCisJCQkJIFZJREVPU0laRV9ZKGZyYW1lLT5yZXF1ZXN0KSk7CiAJCX0KIAkJcmV0dXJuIHNjYW5fTmV4dEZyYW1lOwogCX0gZWxzZQpAQCAtMTE3MSwxMCArMTE4MSwxMSBAQAogCQkJc2l6ZW9mKGNwKSwKIAkJCTEwMDApOwogI2lmIDAKLQkJaW5mbygiVVNCID0+ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgICAgICIocmVxPSQlMDJ4IHZhbD0kJTA0eCBpbmQ9JCUwNHgpIiwKLQkJICAgICAgIGNwWzBdLGNwWzFdLGNwWzJdLGNwWzNdLGNwWzRdLGNwWzVdLGNwWzZdLGNwWzddLAotCQkgICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCSAiVVNCID0+ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAiKHJlcT0kJTAyeCB2YWw9JCUwNHggaW5kPSQlMDR4KVxuIiwKKwkJCSBjcFswXSxjcFsxXSxjcFsyXSxjcFszXSxjcFs0XSxjcFs1XSxjcFs2XSxjcFs3XSwKKwkJCSByZXEsIHZhbHVlLCBpbmRleCk7CiAjZW5kaWYKIAl9IGVsc2UgewogCQlpID0gdXNiX2NvbnRyb2xfbXNnKApAQCAtMTQ0OSwxMCArMTQ2MCw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucyhzdHJ1Y3QgdXZkICp1dmQpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV9jaGFuZ2VfbGlnaHRpbmdfY29uZGl0aW9ucyI7Ci0KIAlpZiAoZGVidWcgPiAwKQotCQlpbmZvKCIlczogU2V0IGxpZ2h0aW5nIHRvICVodS4iLCBwcm9jLCBsaWdodGluZyk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJICIlczogU2V0IGxpZ2h0aW5nIHRvICVodS5cbiIsIF9fZnVuY19fLCBsaWdodGluZyk7CiAKIAlzd2l0Y2ggKElCTUNBTV9UKHV2ZCktPmNhbWVyYV9tb2RlbCkgewogCWNhc2UgSUJNQ0FNX01PREVMXzE6CkBAIC0xNDk1LDggKzE1MDUsNiBAQAogICovCiBzdGF0aWMgdm9pZCBpYm1jYW1fc2V0X3NoYXJwbmVzcyhzdHJ1Y3QgdXZkICp1dmQpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gImlibWNhbV9zZXRfc2hhcnBuZXNzIjsKLQogCXN3aXRjaCAoSUJNQ0FNX1QodXZkKS0+Y2FtZXJhX21vZGVsKSB7CiAJY2FzZSBJQk1DQU1fTU9ERUxfMToKIAl7CkBAIC0xNTA1LDcgKzE1MTMsOCBAQAogCiAJCVJFU1RSSUNUX1RPX1JBTkdFKHNoYXJwbmVzcywgU0hBUlBORVNTX01JTiwgU0hBUlBORVNTX01BWCk7CiAJCWlmIChkZWJ1ZyA+IDApCi0JCQlpbmZvKCIlczogU2V0IHNoYXJwbmVzcyB0byAlaHUuIiwgcHJvYywgc2hhcnBuZXNzKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiJXM6IFNldCBzaGFycG5lc3MgdG8gJWh1LlxuIiwKKwkJCQkgX19mdW5jX18sIHNoYXJwbmVzcyk7CiAKIAkJc3YgPSBzYVtzaGFycG5lc3MgLSBTSEFSUE5FU1NfTUlOXTsKIAkJZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKQEAgLTE1NjQsMTEgKzE1NzMsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgaWJtY2FtX3NldF9icmlnaHRuZXNzKHN0cnVjdCB1dmQgKnV2ZCkKIHsKLQlzdGF0aWMgY29uc3QgY2hhciBwcm9jW10gPSAiaWJtY2FtX3NldF9icmlnaHRuZXNzIjsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbiA9IDE7CiAKIAlpZiAoZGVidWcgPiAwKQotCQlpbmZvKCIlczogU2V0IGJyaWdodG5lc3MgdG8gJWh1LiIsIHByb2MsIHV2ZC0+dnBpYy5icmlnaHRuZXNzKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlczogU2V0IGJyaWdodG5lc3MgdG8gJWh1LlxuIiwKKwkJCSBfX2Z1bmNfXywgdXZkLT52cGljLmJyaWdodG5lc3MpOwogCiAJc3dpdGNoIChJQk1DQU1fVCh1dmQpLT5jYW1lcmFfbW9kZWwpIHsKIAljYXNlIElCTUNBTV9NT0RFTF8xOgpAQCAtMjExNSw3ICsyMTI0LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh1dmQtPmRlYnVnID4gMCkKLQkJCWluZm8oIkZyYW1lcmF0ZSAoaGFyZHdhcmUpOiAlaGQuIiwgaHdfZnBzKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiRnJhbWVyYXRlIChoYXJkd2FyZSk6ICVoZC5cbiIsCisJCQkJIGh3X2Zwcyk7CiAJCVJFU1RSSUNUX1RPX1JBTkdFKGh3X2ZwcywgMCwgMzEpOwogCQlpYm1jYW1fbW9kZWwyX1BhY2tldDEodXZkLCBtb2QyX3NldF9mcmFtZXJhdGUsIGh3X2Zwcyk7CiAJfQpAQCAtMzQ4Nyw3ICszNDk3LDcgQEAKIAkvKiAwMS4wMS4wOCAtIEFkZGVkIGZvciBSQ0EgdmlkZW8gaW4gc3VwcG9ydCAtTE8gKi8KIAlpZihpbml0X21vZGVsM19pbnB1dCkgewogCQlpZiAoZGVidWcgPiAwKQotCQkJaW5mbygiU2V0dGluZyBpbnB1dCB0byBSQ0EuIik7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIlNldHRpbmcgaW5wdXQgdG8gUkNBLlxuIik7CiAJCWZvciAoaT0wOyBpIDwgQVJSQVlfU0laRShpbml0RGF0YSk7IGkrKykgewogCQkJaWJtY2FtX3ZlaW8odXZkLCBpbml0RGF0YVtpXS5yZXEsIGluaXREYXRhW2ldLnZhbHVlLCBpbml0RGF0YVtpXS5pbmRleCk7CiAJCX0KQEAgLTM2ODUsNyArMzY5NSw3IEBACiAJdW5zaWduZWQgY2hhciB2aWRlb19lcCA9IDA7CiAKIAlpZiAoZGVidWcgPj0gMSkKLQkJaW5mbygiaWJtY2FtX3Byb2JlKCVwLCV1LikiLCBpbnRmLCBpZm51bSk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiaWJtY2FtX3Byb2JlKCVwLCV1LilcbiIsIGludGYsIGlmbnVtKTsKIAogCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLwogCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCkBAIC0zNzM2LDE0ICszNzQ2LDE2IEBACiAJCQlicmFuZCA9ICJJQk0gUEMgQ2FtZXJhIjsgLyogYS5rLmEuIFhpcmxpbmsgQy1JdCAqLwogCQkJYnJlYWs7CiAJCX0KLQkJaW5mbygiJXMgVVNCIGNhbWVyYSBmb3VuZCAobW9kZWwgJWQsIHJldi4gMHglMDR4KSIsCi0JCSAgICAgYnJhbmQsIG1vZGVsLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJICIlcyBVU0IgY2FtZXJhIGZvdW5kIChtb2RlbCAlZCwgcmV2LiAweCUwNHgpXG4iLAorCQkJIGJyYW5kLCBtb2RlbCwgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOwogCX0gd2hpbGUgKDApOwogCiAJLyogVmFsaWRhdGUgZm91bmQgaW50ZXJmYWNlOiBtdXN0IGhhdmUgb25lIElTTyBlbmRwb2ludCAqLwogCW5hcyA9IGludGYtPm51bV9hbHRzZXR0aW5nOwogCWlmIChkZWJ1ZyA+IDApCi0JCWluZm8oIk51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZ3M9JWQuIiwgbmFzKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICJOdW1iZXIgb2YgYWx0ZXJuYXRlIHNldHRpbmdzPSVkLlxuIiwKKwkJCSBuYXMpOwogCWlmIChuYXMgPCAyKSB7CiAJCWVycigiVG9vIGZldyBhbHRlcm5hdGUgc2V0dGluZ3MgZm9yIHRoaXMgY2FtZXJhISIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM3ODcsNyArMzc5OSw5IEBACiAJCQkJYWN0SW50ZXJmYWNlID0gaTsKIAkJCQltYXhQUyA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CiAJCQkJaWYgKGRlYnVnID4gMCkKLQkJCQkJaW5mbygiQWN0aXZlIHNldHRpbmc9JWQuIG1heFBTPSVkLiIsIGksIG1heFBTKTsKKwkJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCQkgIkFjdGl2ZSBzZXR0aW5nPSVkLiAiCisJCQkJCQkgIm1heFBTPSVkLlxuIiwgaSwgbWF4UFMpOwogCQkJfSBlbHNlCiAJCQkJZXJyKCJNb3JlIHRoYW4gb25lIGFjdGl2ZSBhbHQuIHNldHRpbmchIElnbm9yaW5nICMlZC4iLCBpKTsKIAkJfQpAQCAtMzgyNiw3ICszODQwLDcgQEAKIAkJCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lcmF0ZSwgMCwgNSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWluZm8oIklCTSBjYW1lcmE6IHVzaW5nIDMyMHgyNDAiKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiSUJNIGNhbWVyYTogdXNpbmcgMzIweDI0MFxuIik7CiAJCQlzaXplID0gU0laRV8zMjB4MjQwOwogCQkJLyogTm8gYnJlYWsgaGVyZSAqLwogCQljYXNlIFNJWkVfMzIweDI0MDoKQEAgLTM4NTUsNyArMzg2OSw3IEBACiAJCQljYW52YXNZID0gMTIwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJQk0gTmV0Q2FtZXJhOiB1c2luZyAxNzZ4MTQ0Iik7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIklCTSBOZXRDYW1lcmE6IHVzaW5nIDE3NngxNDRcbiIpOwogCQkJc2l6ZSA9IFNJWkVfMTc2eDE0NDsKIAkJCS8qIE5vIGJyZWFrIGhlcmUgKi8KIAkJY2FzZSBTSVpFXzE3NngxNDQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKaW5kZXggMWMxODAyOC4uZTk4NmMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwpAQCAtMzM3LDcgKzMzNyw4IEBACiAJCX0KIAogCQlpZigoc3RzID4gMHgwMSkgJiYgKHN0cyA8IDB4ODApKSB7Ci0JCQlpbmZvKCJ1bmtub3duIHN0YXR1cyAlMi4yeCIsIHN0cyk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgInVua25vd24gc3RhdHVzICUyLjJ4XG4iLAorCQkJCSBzdHMpOwogCQkJYmFkKys7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNTY4LDggKzU2OSwxMiBAQAogCQkJCQlmZHJvcHMgPSAoMHg4MCArIGN1cmZyYW1lIC0gY2FtLT5sYXN0ZnJhbWUpICYgMHg3RjsKIAkJCQkJZmRyb3BzLS07CiAJCQkJCWlmKGZkcm9wcykgewotCQkJCQkJaW5mbygiRHJvcHBlZCAlZCBmcmFtZXMgKCVkIC0+ICVkKSIsIGZkcm9wcywKLQkJCQkJCSAgICAgY2FtLT5sYXN0ZnJhbWUsIGN1cmZyYW1lKTsKKwkJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJCSAiRHJvcHBlZCAlZCBmcmFtZXMgIgorCQkJCQkJCSAiKCVkIC0+ICVkKVxuIiwKKwkJCQkJCQkgZmRyb3BzLAorCQkJCQkJCSBjYW0tPmxhc3RmcmFtZSwKKwkJCQkJCQkgY3VyZnJhbWUpOwogCQkJCQl9CiAJCQkJfQogCQkJCWNhbS0+bGFzdGZyYW1lID0gY3VyZnJhbWU7CkBAIC03ODQsNyArNzg5LDggQEAKIAlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyAhPSAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oIktvbmljYSBXZWJjYW0gKHJldi4gMHglMDR4KSIsIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpKTsKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiS29uaWNhIFdlYmNhbSAocmV2LiAweCUwNHgpXG4iLAorCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOwogCVJFU1RSSUNUX1RPX1JBTkdFKHNwZWVkLCAwLCBNQVhfU1BFRUQpOwogCiAJLyogVmFsaWRhdGUgZm91bmQgaW50ZXJmYWNlOiBtdXN0IGhhdmUgb25lIElTTyBlbmRwb2ludCAqLwpAQCAtOTI1LDcgKzkzMSw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBrb25pY2F3Y19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHVzYnZpZGVvX2NiIGNiVGJsOwotCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJICAgICAgIERSSVZFUl9ERVNDICJcbiIpOwogCW1lbXNldCgmY2JUYmwsIDAsIHNpemVvZihjYlRibCkpOwogCWNiVGJsLnByb2JlID0ga29uaWNhd2NfcHJvYmU7CiAJY2JUYmwuc2V0dXBPbk9wZW4gPSBrb25pY2F3Y19zZXR1cF9vbl9vcGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKaW5kZXggM2QyNmEzMC4uMDVjNjFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCkBAIC0xMDgwLDcgKzEwODAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBxY21faW5pdCh2b2lkKQogewotCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJICAgICAgIERSSVZFUl9ERVNDICJcbiIpOwogCiAJcmV0dXJuIHVzYnZpZGVvX3JlZ2lzdGVyKAogCQkmY2FtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYwppbmRleCA5NTQ0ZTY0Li45NzE0YmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jCkBAIC0xNTYsMTAgKzE1NiwxMSBAQAogCQkJc2l6ZW9mKGNwKSwKIAkJCTEwMDApOwogI2lmIDEKLQkJaW5mbygiVVNCID0+ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgICAgICIocmVxPSQlMDJ4IHZhbD0kJTA0eCBpbmQ9JCUwNHgpIiwKLQkJICAgICAgIGNwWzBdLGNwWzFdLGNwWzJdLGNwWzNdLGNwWzRdLGNwWzVdLGNwWzZdLGNwWzddLAotCQkgICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCSAiVVNCID0+ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAiKHJlcT0kJTAyeCB2YWw9JCUwNHggaW5kPSQlMDR4KVxuIiwKKwkJCSBjcFswXSxjcFsxXSxjcFsyXSxjcFszXSxjcFs0XSxjcFs1XSxjcFs2XSxjcFs3XSwKKwkJCSByZXEsIHZhbHVlLCBpbmRleCk7CiAjZW5kaWYKIAl9IGVsc2UgewogCQlpID0gdXNiX2NvbnRyb2xfbXNnKApAQCAtNTE3LDE5ICs1MTgsMjAgQEAKIAl1bnNpZ25lZCBjaGFyIHZpZGVvX2VwID0gMDsKIAogCWlmIChkZWJ1ZyA+PSAxKQotCQlpbmZvKCJ1bHRyYWNhbV9wcm9iZSglcCkiLCBpbnRmKTsKKwkJZGV2X2luZm8oJmludGYtPmRldiwgInVsdHJhY2FtX3Byb2JlXG4iKTsKIAogCS8qIFdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLwogCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaW5mbygiSUJNIFVsdHJhIGNhbWVyYSBmb3VuZCAocmV2LiAweCUwNHgpIiwKLQkJbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJJQk0gVWx0cmEgY2FtZXJhIGZvdW5kIChyZXYuIDB4JTA0eClcbiIsCisJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CiAKIAkvKiBWYWxpZGF0ZSBmb3VuZCBpbnRlcmZhY2U6IG11c3QgaGF2ZSBvbmUgSVNPIGVuZHBvaW50ICovCiAJbmFzID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CiAJaWYgKGRlYnVnID4gMCkKLQkJaW5mbygiTnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5ncz0lZC4iLCBuYXMpOworCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiTnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5ncz0lZC5cbiIsCisJCQkgbmFzKTsKIAlpZiAobmFzIDwgOCkgewogCQllcnIoIlRvbyBmZXcgYWx0ZXJuYXRlIHNldHRpbmdzIGZvciB0aGlzIGNhbWVyYSEiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NzYsNyArNTc4LDkgQEAKIAkJCQlhY3RJbnRlcmZhY2UgPSBpOwogCQkJCW1heFBTID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKIAkJCQlpZiAoZGVidWcgPiAwKQotCQkJCQlpbmZvKCJBY3RpdmUgc2V0dGluZz0lZC4gbWF4UFM9JWQuIiwgaSwgbWF4UFMpOworCQkJCQlkZXZfaW5mbygmaW50Zi0+ZGV2LAorCQkJCQkJICJBY3RpdmUgc2V0dGluZz0lZC4gIgorCQkJCQkJICJtYXhQUz0lZC5cbiIsIGksIG1heFBTKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogR290IGFub3RoZXIgYWN0aXZlIGFsdC4gc2V0dGluZyAqLwogCQkJCWlmIChtYXhQUyA8IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpIHsKQEAgLTU4NCw4ICs1ODgsMTEgQEAKIAkJCQkJYWN0SW50ZXJmYWNlID0gaTsKIAkJCQkJbWF4UFMgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwogCQkJCQlpZiAoZGVidWcgPiAwKSB7Ci0JCQkJCQlpbmZvKCJFdmVuIGJldHRlciBjdGl2ZSBzZXR0aW5nPSVkLiBtYXhQUz0lZC4iLAotCQkJCQkJICAgICBpLCBtYXhQUyk7CisJCQkJCQlkZXZfaW5mbygmaW50Zi0+ZGV2LAorCQkJCQkJCSAiRXZlbiBiZXR0ZXIgY3RpdmUgIgorCQkJCQkJCSAic2V0dGluZz0lZC4gIgorCQkJCQkJCSAibWF4UFM9JWQuXG4iLAorCQkJCQkJCSBpLCBtYXhQUyk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMKaW5kZXggYmYxYmMyZi4uMDdjZDg3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYwpAQCAtNDY4LDggKzQ2OCw5IEBACiAJCQlwZXJjZW50ID0gKDEwMCAqIGdvb2RQYWNrZXRzKSAvIGFsbFBhY2tldHM7CiAJCWVsc2UKIAkJCXBlcmNlbnQgPSBnb29kUGFja2V0cyAvIChhbGxQYWNrZXRzIC8gMTAwKTsKLQkJaW5mbygiUGFja2V0IFN0YXRpc3RpY3M6IFRvdGFsPSVsdS4gRW1wdHk9JWx1LiBVc2FnZT0lbHUlJSIsCi0JCSAgICAgYWxsUGFja2V0cywgYmFkUGFja2V0cywgcGVyY2VudCk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJICJQYWNrZXQgU3RhdGlzdGljczogVG90YWw9JWx1LiBFbXB0eT0lbHUuIFVzYWdlPSVsdSUlXG4iLAorCQkJIGFsbFBhY2tldHMsIGJhZFBhY2tldHMsIHBlcmNlbnQpOwogCQlpZiAodXZkLT5pc29fcGFja2V0X2xlbiA+IDApIHsKIAkJCXVuc2lnbmVkIGxvbmcgYWxsQnl0ZXMsIHhmZXJCeXRlczsKIAkJCWNoYXIgbXVsdGlwbGllciA9ICcgJzsKQEAgLTQ5Nyw4ICs0OTgsOSBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJaW5mbygiVHJhbnNmZXIgU3RhdGlzdGljczogVHJhbnNmZXJyZWQ9JWx1JWNCIFVzYWdlPSVsdSUlIiwKLQkJCSAgICAgeGZlckJ5dGVzLCBtdWx0aXBsaWVyLCBwZXJjZW50KTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCSAiVHJhbnNmZXIgU3RhdGlzdGljczogVHJhbnNmZXJyZWQ9JWx1JWNCIFVzYWdlPSVsdSUlXG4iLAorCQkJCSB4ZmVyQnl0ZXMsIG11bHRpcGxpZXIsIHBlcmNlbnQpOwogCQl9CiAJfQogfQpAQCAtNTQ1LDcgKzU0Nyw3IEBACiAJewkvKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkgKi8KIAkJY2hhciB0bXBbMjBdOwogCQl1c2J2aWRlb19WaWRlb3NpemVUb1N0cmluZyh0bXAsIHNpemVvZih0bXApLCBmcmFtZS0+cmVxdWVzdCk7Ci0JCWluZm8oInRlc3RwYXR0ZXJuOiBmcmFtZT0lcyIsIHRtcCk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAidGVzdHBhdHRlcm46IGZyYW1lPSVzXG4iLCB0bXApOwogCX0KICNlbmRpZgogCS8qIEZvcm0gZXZlcnkgc2NhbiBsaW5lICovCkBAIC04NTQsNyArODU2LDcgQEAKIAogCXVzYnZpZGVvX0NsaWVudEluY01vZENvdW50KHV2ZCk7CiAJaWYgKHV2ZC0+ZGVidWcgPiAwKQotCQlpbmZvKCIlcyglcC4pIiwgX19mdW5jX18sIGludGYpOworCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiJXMoJXAuKVxuIiwgX19mdW5jX18sIGludGYpOwogCiAJbXV0ZXhfbG9jaygmdXZkLT5sb2NrKTsKIAl1dmQtPnJlbW92ZV9wZW5kaW5nID0gMTsgLyogTm93IGFsbCBJU08gZGF0YSB3aWxsIGJlIGlnbm9yZWQgKi8KQEAgLTg3MCwxNCArODcyLDE1IEBACiAKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmdXZkLT52ZGV2KTsKIAlpZiAodXZkLT5kZWJ1ZyA+IDApCi0JCWluZm8oIiVzOiBWaWRlbyB1bnJlZ2lzdGVyZWQuIiwgX19mdW5jX18pOworCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiJXM6IFZpZGVvIHVucmVnaXN0ZXJlZC5cbiIsIF9fZnVuY19fKTsKIAogCWlmICh1dmQtPnVzZXIpCi0JCWluZm8oIiVzOiBJbiB1c2UsIGRpc2Nvbm5lY3QgcGVuZGluZy4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICIlczogSW4gdXNlLCBkaXNjb25uZWN0IHBlbmRpbmcuXG4iLAorCQkJIF9fZnVuY19fKTsKIAllbHNlCiAJCXVzYnZpZGVvX0NhbWVyYVJlbGVhc2UodXZkKTsKIAltdXRleF91bmxvY2soJnV2ZC0+bG9jayk7Ci0JaW5mbygiVVNCIGNhbWVyYSBkaXNjb25uZWN0ZWQuIik7CisJZGV2X2luZm8oJmludGYtPmRldiwgIlVTQiBjYW1lcmEgZGlzY29ubmVjdGVkLlxuIik7CiAKIAl1c2J2aWRlb19DbGllbnREZWNNb2RDb3VudCh1dmQpOwogfQpAQCAtMTAxNSwxNCArMTAxOCwxNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHV2ZC0+dmlkZW9fZW5kcCA9PSAwKSB7Ci0JCWluZm8oIiVzOiBObyB2aWRlbyBlbmRwb2ludCBzcGVjaWZpZWQ7IGRhdGEgcHVtcCBkaXNhYmxlZC4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJICIlczogTm8gdmlkZW8gZW5kcG9pbnQgc3BlY2lmaWVkOyBkYXRhIHB1bXAgZGlzYWJsZWQuXG4iLAorCQkJIF9fZnVuY19fKTsKIAl9CiAJaWYgKHV2ZC0+cGFsZXR0ZUJpdHMgPT0gMCkgewogCQllcnIoIiVzOiBObyBwYWxldHRlcyBzcGVjaWZpZWQhIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHV2ZC0+ZGVmYXVsdFBhbGV0dGUgPT0gMCkgewotCQlpbmZvKCIlczogTm8gZGVmYXVsdCBwYWxldHRlISIsIF9fZnVuY19fKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlczogTm8gZGVmYXVsdCBwYWxldHRlIVxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJfQogCiAJdXZkLT5tYXhfZnJhbWVfc2l6ZSA9IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSAqCkBAIC0xMDMxLDI1ICsxMDM3LDI5IEBACiAJdXNidmlkZW9fVmlkZW9zaXplVG9TdHJpbmcodG1wMiwgc2l6ZW9mKHRtcDIpLCB1dmQtPmNhbnZhcyk7CiAKIAlpZiAodXZkLT5kZWJ1ZyA+IDApIHsKLQkJaW5mbygiJXM6IGlmYWNlPSVkLiBlbmRwb2ludD0kJTAyeCBwYWxldHRlQml0cz0kJTA4bHgiLAotCQkgICAgIF9fZnVuY19fLCB1dmQtPmlmYWNlLCB1dmQtPnZpZGVvX2VuZHAsIHV2ZC0+cGFsZXR0ZUJpdHMpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCSAiJXM6IGlmYWNlPSVkLiBlbmRwb2ludD0kJTAyeCBwYWxldHRlQml0cz0kJTA4bHhcbiIsCisJCQkgX19mdW5jX18sIHV2ZC0+aWZhY2UsIHV2ZC0+dmlkZW9fZW5kcCwKKwkJCSB1dmQtPnBhbGV0dGVCaXRzKTsKIAl9CiAJaWYgKHV2ZC0+ZGV2ID09IE5VTEwpIHsKIAkJZXJyKCIlczogdXZkLT5kZXYgPT0gTlVMTCIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXV2ZC0+dmRldi5wYXJlbnQgPSAmdXZkLT5kZXYtPmRldjsKLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ1dmQtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA9PSAtMSkgeworCXV2ZC0+dmRldi5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdXZkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPCAwKSB7CiAJCWVycigiJXM6IHZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVBJUEU7CiAJfQogCWlmICh1dmQtPmRlYnVnID4gMSkgewotCQlpbmZvKCIlczogdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCkgc3VjY2Vzc2Z1bCIsIF9fZnVuY19fKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkgIiVzOiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKSBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7CiAJfQogCi0JaW5mbygiJXMgb24gL2Rldi92aWRlbyVkOiBjYW52YXM9JXMgdmlkZW9zaXplPSVzIiwKLQkgICAgICh1dmQtPmhhbmRsZSAhPSBOVUxMKSA/IHV2ZC0+aGFuZGxlLT5kcnZOYW1lIDogIj8/PyIsCi0JICAgICB1dmQtPnZkZXYubWlub3IsIHRtcDIsIHRtcDEpOworCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiJXMgb24gL2Rldi92aWRlbyVkOiBjYW52YXM9JXMgdmlkZW9zaXplPSVzXG4iLAorCQkgKHV2ZC0+aGFuZGxlICE9IE5VTEwpID8gdXZkLT5oYW5kbGUtPmRydk5hbWUgOiAiPz8/IiwKKwkJIHV2ZC0+dmRldi5taW5vciwgdG1wMiwgdG1wMSk7CiAKIAl1c2JfZ2V0X2Rldih1dmQtPmRldik7CiAJcmV0dXJuIDA7CkBAIC0xMTExLDcgKzExMjEsNyBAQAogCWludCBpLCBlcnJDb2RlID0gMDsKIAogCWlmICh1dmQtPmRlYnVnID4gMSkKLQkJaW5mbygiJXMoJCVwKSIsIF9fZnVuY19fLCBkZXYpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIiVzKCQlcClcbiIsIF9fZnVuY19fLCBkZXYpOwogCiAJaWYgKDAgPCB1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudCh1dmQpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExNzgsMTkgKzExODgsMjUgQEAKIAkJaWYgKGVyckNvZGUgPT0gMCkgewogCQkJaWYgKFZBTElEX0NBTExCQUNLKHV2ZCwgc2V0dXBPbk9wZW4pKSB7CiAJCQkJaWYgKHV2ZC0+ZGVidWcgPiAxKQotCQkJCQlpbmZvKCIlczogc2V0dXBPbk9wZW4gY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJICIlczogc2V0dXBPbk9wZW4gY2FsbGJhY2tcbiIsCisJCQkJCQkgX19mdW5jX18pOwogCQkJCWVyckNvZGUgPSBHRVRfQ0FMTEJBQ0sodXZkLCBzZXR1cE9uT3BlbikodXZkKTsKIAkJCQlpZiAoZXJyQ29kZSA8IDApIHsKIAkJCQkJZXJyKCIlczogc2V0dXBPbk9wZW4gY2FsbGJhY2sgZmFpbGVkICglZC4pLiIsCiAJCQkJCSAgICBfX2Z1bmNfXywgZXJyQ29kZSk7CiAJCQkJfSBlbHNlIGlmICh1dmQtPmRlYnVnID4gMSkgewotCQkJCQlpbmZvKCIlczogc2V0dXBPbk9wZW4gY2FsbGJhY2sgc3VjY2Vzc2Z1bCIsIF9fZnVuY19fKTsKKwkJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCQkgIiVzOiBzZXR1cE9uT3BlbiBjYWxsYmFjayBzdWNjZXNzZnVsXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKIAkJCQl9CiAJCQl9CiAJCQlpZiAoZXJyQ29kZSA9PSAwKSB7CiAJCQkJdXZkLT5zZXR0aW5nc0FkanVzdGVkID0gMDsKIAkJCQlpZiAodXZkLT5kZWJ1ZyA+IDEpCi0JCQkJCWluZm8oIiVzOiBPcGVuIHN1Y2NlZWRlZC4iLCBfX2Z1bmNfXyk7CisJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJICIlczogT3BlbiBzdWNjZWVkZWQuXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKIAkJCQl1dmQtPnVzZXIrKzsKIAkJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSB1dmQ7CiAJCQl9CkBAIC0xMjAwLDcgKzEyMTYsOCBAQAogCWlmIChlcnJDb2RlICE9IDApCiAJCXVzYnZpZGVvX0NsaWVudERlY01vZENvdW50KHV2ZCk7CiAJaWYgKHV2ZC0+ZGVidWcgPiAwKQotCQlpbmZvKCIlczogUmV0dXJuaW5nICVkLiIsIF9fZnVuY19fLCBlcnJDb2RlKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlczogUmV0dXJuaW5nICVkLlxuIiwgX19mdW5jX18sCisJCQkgZXJyQ29kZSk7CiAJcmV0dXJuIGVyckNvZGU7CiB9CiAKQEAgLTEyMjMsNyArMTI0MCw3IEBACiAJaW50IGk7CiAKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCi0JCWluZm8oIiVzKCQlcCkiLCBfX2Z1bmNfXywgZGV2KTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlcygkJXApXG4iLCBfX2Z1bmNfXywgZGV2KTsKIAogCW11dGV4X2xvY2soJnV2ZC0+bG9jayk7CiAJR0VUX0NBTExCQUNLKHV2ZCwgc3RvcERhdGFQdW1wKSh1dmQpOwpAQCAtMTI0MywxNCArMTI2MCwxNSBAQAogCXV2ZC0+dXNlci0tOwogCWlmICh1dmQtPnJlbW92ZV9wZW5kaW5nKSB7CiAJCWlmICh1dmQtPmRlYnVnID4gMCkKLQkJCWluZm8oInVzYnZpZGVvX3Y0bF9jbG9zZTogRmluYWwgZGlzY29ubmVjdC4iKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiJXM6IEZpbmFsIGRpc2Nvbm5lY3QuXG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCXVzYnZpZGVvX0NhbWVyYVJlbGVhc2UodXZkKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZ1dmQtPmxvY2spOwogCXVzYnZpZGVvX0NsaWVudERlY01vZENvdW50KHV2ZCk7CiAKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCi0JCWluZm8oIiVzOiBDb21wbGV0ZWQuIiwgX19mdW5jX18pOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIiVzOiBDb21wbGV0ZWQuXG4iLCBfX2Z1bmNfXyk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNjQsOCArMTM4Miw5IEBACiAJCQlzdHJ1Y3QgdmlkZW9fbW1hcCAqdm0gPSBhcmc7CiAKIAkJCWlmICh1dmQtPmRlYnVnID49IDEpIHsKLQkJCQlpbmZvKCJWSURJT0NNQ0FQVFVSRTogZnJhbWU9JWQuIHNpemU9JWR4JWQsIGZvcm1hdD0lZC4iLAotCQkJCSAgICAgdm0tPmZyYW1lLCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsIHZtLT5mb3JtYXQpOworCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkgIlZJRElPQ01DQVBUVVJFOiBmcmFtZT0lZC4gc2l6ZT0lZHglZCwgZm9ybWF0PSVkLlxuIiwKKwkJCQkJIHZtLT5mcmFtZSwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+Zm9ybWF0KTsKIAkJCX0KIAkJCS8qCiAJCQkgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMgc3VwcG9ydGVkLiBJZiB0aGUgcmVxdWVzdG9yCkBAIC0xMzgzLDE4ICsxNDAyLDI0IEBACiAJCQlpZiAoKHZtLT53aWR0aCA+IFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSkgfHwKIAkJCSAgICAodm0tPmhlaWdodCA+IFZJREVPU0laRV9ZKHV2ZC0+Y2FudmFzKSkpIHsKIAkJCQlpZiAodXZkLT5kZWJ1ZyA+IDApIHsKLQkJCQkJaW5mbygiVklESU9DTUNBUFRVUkU6IFNpemU9JWR4JWQgdG9vIGxhcmdlOyAiCi0JCQkJCSAgICAgImFsbG93ZWQgb25seSB1cCB0byAlbGR4JWxkIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LAotCQkJCQkgICAgIFZJREVPU0laRV9YKHV2ZC0+Y2FudmFzKSwgVklERU9TSVpFX1kodXZkLT5jYW52YXMpKTsKKwkJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCQkgIlZJRElPQ01DQVBUVVJFOiBTaXplPSVkeCVkICIKKwkJCQkJCSAidG9vIGxhcmdlOyBhbGxvd2VkIG9ubHkgdXAgIgorCQkJCQkJICJ0byAlbGR4JWxkXG4iLCB2bS0+d2lkdGgsCisJCQkJCQkgdm0tPmhlaWdodCwKKwkJCQkJCSBWSURFT1NJWkVfWCh1dmQtPmNhbnZhcyksCisJCQkJCQkgVklERU9TSVpFX1kodXZkLT5jYW52YXMpKTsKIAkJCQl9CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQkvKiBDaGVjayBpZiB0aGUgcGFsZXR0ZSBpcyBzdXBwb3J0ZWQgKi8KIAkJCWlmICgoKDFMIDw8IHZtLT5mb3JtYXQpICYgdXZkLT5wYWxldHRlQml0cykgPT0gMCkgewogCQkJCWlmICh1dmQtPmRlYnVnID4gMCkgewotCQkJCQlpbmZvKCJWSURJT0NNQ0FQVFVSRTogZm9ybWF0PSVkLiBub3Qgc3VwcG9ydGVkIgotCQkJCQkgICAgICIgKHBhbGV0dGVCaXRzPSQlMDhseCkiLAotCQkJCQkgICAgIHZtLT5mb3JtYXQsIHV2ZC0+cGFsZXR0ZUJpdHMpOworCQkJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkJCSAiVklESU9DTUNBUFRVUkU6IGZvcm1hdD0lZC4gIgorCQkJCQkJICJub3Qgc3VwcG9ydGVkICIKKwkJCQkJCSAiKHBhbGV0dGVCaXRzPSQlMDhseClcbiIsCisJCQkJCQkgdm0tPmZvcm1hdCwgdXZkLT5wYWxldHRlQml0cyk7CiAJCQkJfQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtMTQyMiw3ICsxNDQ3LDkgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMSkKLQkJCQlpbmZvKCJWSURJT0NTWU5DOiBzeW5jaW5nIHRvIGZyYW1lICVkLiIsICpmcmFtZU51bSk7CisJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCSAiVklESU9DU1lOQzogc3luY2luZyB0byBmcmFtZSAlZC5cbiIsCisJCQkJCSAqZnJhbWVOdW0pOwogCQkJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19OT19ERUNPRElORykKIAkJCQlyZXQgPSB1c2J2aWRlb19HZXRGcmFtZSh1dmQsICpmcmFtZU51bSk7CiAJCQllbHNlIGlmIChWQUxJRF9DQUxMQkFDSyh1dmQsIGdldEZyYW1lKSkgewpAQCAtMTUwNCw3ICsxNTMxLDkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAodXZkLT5kZWJ1ZyA+PSAxKQotCQlpbmZvKCIlczogJVpkLiBieXRlcywgbm9ibG9jaz0lZC4iLCBfX2Z1bmNfXywgY291bnQsIG5vYmxvY2spOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCSAiJXM6ICVaZC4gYnl0ZXMsIG5vYmxvY2s9JWQuXG4iLAorCQkJIF9fZnVuY19fLCBjb3VudCwgbm9ibG9jayk7CiAKIAltdXRleF9sb2NrKCZ1dmQtPmxvY2spOwogCkBAIC0xNjg1LDE4ICsxNzE0LDIxIEBACiAJCXJldHVybjsKICNpZiAwCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKLQkJaW5mbygidXJiPSQlcCBzdGF0dXM9JWQuIGVycmNvdW50PSVkLiBsZW5ndGg9JWQuIiwKLQkJICAgICB1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmVycm9yX2NvdW50LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCSAidXJiPSQlcCBzdGF0dXM9JWQuIGVycmNvdW50PSVkLiBsZW5ndGg9JWQuXG4iLAorCQkJIHVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+ZXJyb3JfY291bnQsCisJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAl9IGVsc2UgewogCQlzdGF0aWMgaW50IGMgPSAwOwogCQlpZiAoYysrICUgMTAwID09IDApCi0JCQlpbmZvKCJObyBJc29jIGRhdGEiKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiTm8gSXNvYyBkYXRhXG4iKTsKIAl9CiAjZW5kaWYKIAogCWlmICghdXZkLT5zdHJlYW1pbmcpIHsKIAkJaWYgKHV2ZC0+ZGVidWcgPj0gMSkKLQkJCWluZm8oIk5vdCBzdHJlYW1pbmcsIGJ1dCBpbnRlcnJ1cHQhIik7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIk5vdCBzdHJlYW1pbmcsIGJ1dCBpbnRlcnJ1cHQhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTc0MSw3ICsxNzczLDcgQEAKIAlpbnQgaSwgZXJyRmxhZzsKIAogCWlmICh1dmQtPmRlYnVnID4gMSkKLQkJaW5mbygiJXMoJCVwKSIsIF9fZnVuY19fLCB1dmQpOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIiVzKCQlcClcbiIsIF9fZnVuY19fLCB1dmQpOwogCiAJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkgewogCQllcnIoIiVzOiBDYW1lcmEgaXMgbm90IG9wZXJhdGlvbmFsIiwgX19mdW5jX18pOwpAQCAtMTc4OSw3ICsxODIxLDkgQEAKIAogCXV2ZC0+c3RyZWFtaW5nID0gMTsKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCi0JCWluZm8oIiVzOiBzdHJlYW1pbmc9MSB2aWRlb19lbmRwPSQlMDJ4IiwgX19mdW5jX18sIHV2ZC0+dmlkZW9fZW5kcCk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJICIlczogc3RyZWFtaW5nPTEgdmlkZW9fZW5kcD0kJTAyeFxuIiwgX19mdW5jX18sCisJCQkgdXZkLT52aWRlb19lbmRwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTgxMSwxNCArMTg0NSwxNCBAQAogCQlyZXR1cm47CiAKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCi0JCWluZm8oIiVzKCQlcCkiLCBfX2Z1bmNfXywgdXZkKTsKKwkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlcygkJXApXG4iLCBfX2Z1bmNfXywgdXZkKTsKIAogCS8qIFVuc2NoZWR1bGUgYWxsIG9mIHRoZSBpc28gdGQncyAqLwogCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKSB7CiAJCXVzYl9raWxsX3VyYih1dmQtPnNidWZbaV0udXJiKTsKIAl9CiAJaWYgKHV2ZC0+ZGVidWcgPiAxKQotCQlpbmZvKCIlczogc3RyZWFtaW5nPTAiLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LCAiJXM6IHN0cmVhbWluZz0wXG4iLCBfX2Z1bmNfXyk7CiAJdXZkLT5zdHJlYW1pbmcgPSAwOwogCiAJaWYgKCF1dmQtPnJlbW92ZV9wZW5kaW5nKSB7CkBAIC0xODUwLDcgKzE4ODQsOCBAQAogCWludCBuOwogCiAJaWYgKHV2ZC0+ZGVidWcgPiAxKQotCQlpbmZvKCJ1c2J2aWRlb19OZXdGcmFtZSgkJXAsJWQuKSIsIHV2ZCwgZnJhbWVudW0pOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgInVzYnZpZGVvX05ld0ZyYW1lKCQlcCwlZC4pXG4iLCB1dmQsCisJCQkgZnJhbWVudW0pOwogCiAJLyogSWYgd2UncmUgbm90IGdyYWJiaW5nIGEgZnJhbWUgcmlnaHQgbm93IGFuZCB0aGUgb3RoZXIgZnJhbWUgaXMgKi8KIAkvKiAgcmVhZHkgdG8gYmUgZ3JhYmJlZCBpbnRvLCB0aGVuIHVzZSBpdCBpbnN0ZWFkICovCkBAIC0xOTU1LDEyICsxOTkwLDE0IEBACiAJc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSA9ICZ1dmQtPmZyYW1lW2ZyYW1lTnVtXTsKIAogCWlmICh1dmQtPmRlYnVnID49IDIpCi0JCWluZm8oIiVzKCQlcCwlZC4pIiwgX19mdW5jX18sIHV2ZCwgZnJhbWVOdW0pOworCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwgIiVzKCQlcCwlZC4pXG4iLCBfX2Z1bmNfXywgdXZkLAorCQkJIGZyYW1lTnVtKTsKIAogCXN3aXRjaCAoZnJhbWUtPmZyYW1lU3RhdGUpIHsKIAljYXNlIEZyYW1lU3RhdGVfVW51c2VkOgogCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQotCQkJaW5mbygiJXM6IEZyYW1lU3RhdGVfVW51c2VkIiwgX19mdW5jX18pOworCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsICIlczogRnJhbWVTdGF0ZV9VbnVzZWRcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJY2FzZSBGcmFtZVN0YXRlX1JlYWR5OgogCWNhc2UgRnJhbWVTdGF0ZV9HcmFiYmluZzoKQEAgLTE5NzAsNyArMjAwNyw5IEBACiAJcmVkbzoKIAkJaWYgKCFDQU1FUkFfSVNfT1BFUkFUSU9OQUwodXZkKSkgewogCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKLQkJCQlpbmZvKCIlczogQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCAoMSkiLCBfX2Z1bmNfXyk7CisJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCSAiJXM6IENhbWVyYSBpcyBub3Qgb3BlcmF0aW9uYWwgKDEpXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJbnRyaWVzID0gMDsKQEAgLTE5NzksMjQgKzIwMTgsMzMgQEAKIAkJCXNpZ25hbFBlbmRpbmcgPSBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKIAkJCWlmICghQ0FNRVJBX0lTX09QRVJBVElPTkFMKHV2ZCkpIHsKIAkJCQlpZiAodXZkLT5kZWJ1ZyA+PSAyKQotCQkJCQlpbmZvKCIlczogQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCAoMikiLCBfX2Z1bmNfXyk7CisJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJICIlczogQ2FtZXJhIGlzIG5vdCAiCisJCQkJCQkgIm9wZXJhdGlvbmFsICgyKVxuIiwgX19mdW5jX18pOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJYXNzZXJ0KHV2ZC0+ZmJ1ZiAhPSBOVUxMKTsKIAkJCWlmIChzaWduYWxQZW5kaW5nKSB7CiAJCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKLQkJCQkJaW5mbygiJXM6IFNpZ25hbD0kJTA4eCIsIF9fZnVuY19fLCBzaWduYWxQZW5kaW5nKTsKKwkJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCSIlczogU2lnbmFsPSQlMDh4XG4iLCBfX2Z1bmNfXywKKwkJCQkJc2lnbmFsUGVuZGluZyk7CiAJCQkJaWYgKHV2ZC0+ZmxhZ3MgJiBGTEFHU19SRVRSWV9WSURJT0NTWU5DKSB7CiAJCQkJCXVzYnZpZGVvX1Rlc3RQYXR0ZXJuKHV2ZCwgMSwgMCk7CiAJCQkJCXV2ZC0+Y3VyZnJhbWUgPSAtMTsKIAkJCQkJdXZkLT5zdGF0cy5mcmFtZV9udW0rKzsKIAkJCQkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKLQkJCQkJCWluZm8oIiVzOiBGb3JjZWQgdGVzdCBwYXR0ZXJuIHNjcmVlbiIsIF9fZnVuY19fKTsKKwkJCQkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCQkJCSAiJXM6IEZvcmNlZCB0ZXN0ICIKKwkJCQkJCQkgInBhdHRlcm4gc2NyZWVuXG4iLAorCQkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXJldHVybiAwOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8qIFN0YW5kYXJkIGFuc3dlcjogSW50ZXJydXB0ZWQhICovCiAJCQkJCWlmICh1dmQtPmRlYnVnID49IDIpCi0JCQkJCQlpbmZvKCIlczogSW50ZXJydXB0ZWQhIiwgX19mdW5jX18pOworCQkJCQkJZGV2X2luZm8oJnV2ZC0+ZGV2LT5kZXYsCisJCQkJCQkJICIlczogSW50ZXJydXB0ZWQhXG4iLAorCQkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXJldHVybiAtRUlOVFI7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTIwMTAsOCArMjA1OCwxMCBAQAogCQkJfQogCQl9IHdoaWxlIChmcmFtZS0+ZnJhbWVTdGF0ZSA9PSBGcmFtZVN0YXRlX0dyYWJiaW5nKTsKIAkJaWYgKHV2ZC0+ZGVidWcgPj0gMikgewotCQkJaW5mbygiJXM6IEdyYWJiaW5nIGRvbmU7IHN0YXRlPSVkLiAoJWx1LiBieXRlcykiLAotCQkJICAgICBfX2Z1bmNfXywgZnJhbWUtPmZyYW1lU3RhdGUsIGZyYW1lLT5zZXFSZWFkX0xlbmd0aCk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIiVzOiBHcmFiYmluZyBkb25lOyBzdGF0ZT0lZC4gKCVsdS4gYnl0ZXMpXG4iLAorCQkJCSBfX2Z1bmNfXywgZnJhbWUtPmZyYW1lU3RhdGUsCisJCQkJIGZyYW1lLT5zZXFSZWFkX0xlbmd0aCk7CiAJCX0KIAkJaWYgKGZyYW1lLT5mcmFtZVN0YXRlID09IEZyYW1lU3RhdGVfRXJyb3IpIHsKIAkJCWludCByZXQgPSB1c2J2aWRlb19OZXdGcmFtZSh1dmQsIGZyYW1lTnVtKTsKQEAgLTIwNDgsNyArMjA5OCw5IEBACiAJCX0KIAkJZnJhbWUtPmZyYW1lU3RhdGUgPSBGcmFtZVN0YXRlX0RvbmVfSG9sZDsKIAkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKLQkJCWluZm8oIiVzOiBFbnRlcmVkIEZyYW1lU3RhdGVfRG9uZV9Ib2xkIHN0YXRlLiIsIF9fZnVuY19fKTsKKwkJCWRldl9pbmZvKCZ1dmQtPmRldi0+ZGV2LAorCQkJCSAiJXM6IEVudGVyZWQgRnJhbWVTdGF0ZV9Eb25lX0hvbGQgc3RhdGUuXG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBGcmFtZVN0YXRlX0RvbmVfSG9sZDoKQEAgLTIwNTksNyArMjExMSw5IEBACiAJCSAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSB3aWxkIHRvIHJvYW0gZnJlZWx5LgogCQkgKi8KIAkJaWYgKHV2ZC0+ZGVidWcgPj0gMikKLQkJCWluZm8oIiVzOiBGcmFtZVN0YXRlX0RvbmVfSG9sZCBzdGF0ZS4iLCBfX2Z1bmNfXyk7CisJCQlkZXZfaW5mbygmdXZkLT5kZXYtPmRldiwKKwkJCQkgIiVzOiBGcmFtZVN0YXRlX0RvbmVfSG9sZCBzdGF0ZS5cbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3ZpY2FtLmMKaW5kZXggMmViNDU4Mi4uN2ExMjdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby92aWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdmljYW0uYwpAQCAtNDcyLDkgKzQ3Miw4IEBACiBzdGF0aWMgaW50CiB2aWNhbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHZpY2FtX2NhbWVyYSAqY2FtID0KLQkgICAgKHN0cnVjdCB2aWNhbV9jYW1lcmEgKikgZGV2LT5wcml2OworCXN0cnVjdCB2aWNhbV9jYW1lcmEgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKIAlEQkcoIm9wZW5cbiIpOwogCiAJaWYgKCFjYW0pIHsKQEAgLTQ4OCwyMCArNDg3LDI0IEBACiAJICogcmVseSBvbiB0aGlzIGZhY3QgZm9yZXZlci4KIAkgKi8KIAorCWxvY2tfa2VybmVsKCk7CiAJaWYgKGNhbS0+b3Blbl9jb3VudCA+IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgInZpY2FtX29wZW4gY2FsbGVkIG9uIGFscmVhZHkgb3BlbmVkIGNhbWVyYSIpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJY2FtLT5yYXdfaW1hZ2UgPSBrbWFsbG9jKFZJQ0FNX01BWF9SRUFEX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2FtLT5yYXdfaW1hZ2UpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAljYW0tPmZyYW1lYnVmID0gcnZtYWxsb2MoVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOwogCWlmICghY2FtLT5mcmFtZWJ1ZikgewogCQlrZnJlZShjYW0tPnJhd19pbWFnZSk7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC01MDksNiArNTEyLDcgQEAKIAlpZiAoIWNhbS0+Y250cmxidWYpIHsKIAkJa2ZyZWUoY2FtLT5yYXdfaW1hZ2UpOwogCQlydmZyZWUoY2FtLT5mcmFtZWJ1ZiwgVklDQU1fTUFYX0ZSQU1FX1NJWkUgKiBWSUNBTV9GUkFNRVMpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNTI2LDYgKzUzMCw3IEBACiAJY2FtLT5vcGVuX2NvdW50Kys7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYW07CisJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03OTUsNiArODAwLDcgQEAKIAkubmFtZSAJCT0gIlZpQ2FtLWJhc2VkIFVTQiBDYW1lcmEiLAogCS5mb3BzIAkJPSAmdmljYW1fZm9wcywKIAkubWlub3IgCQk9IC0xLAorCS5yZWxlYXNlIAk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLwpAQCAtODU5LDkgKzg2NSw4IEBACiAKIAltdXRleF9pbml0KCZjYW0tPmNhbV9sb2NrKTsKIAotCW1lbWNweSgmY2FtLT52ZGV2LCAmdmljYW1fdGVtcGxhdGUsCi0JICAgICAgIHNpemVvZiAodmljYW1fdGVtcGxhdGUpKTsKLQljYW0tPnZkZXYucHJpdiA9IGNhbTsJLy8gc29ydCBvZiBhIHJldmVyc2UgbWFwcGluZyBmb3IgdGhvc2UgZnVuY3Rpb25zIHRoYXQgZ2V0IHZkZXYgb25seQorCW1lbWNweSgmY2FtLT52ZGV2LCAmdmljYW1fdGVtcGxhdGUsIHNpemVvZih2aWNhbV90ZW1wbGF0ZSkpOworCXZpZGVvX3NldF9kcnZkYXRhKCZjYW0tPnZkZXYsIGNhbSk7CiAKIAljYW0tPnVkZXYgPSBkZXY7CiAJY2FtLT5idWxrRW5kcG9pbnQgPSBidWxrRW5kcG9pbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwppbmRleCBjMzE3ZWQ3Li45ZTRmNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKQEAgLTQ1LDEwICs0NSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAotI2lmZGVmIENPTkZJR19LTU9ECi0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJ1c2J2aXNpb24uaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCBjb3JlX2RlYnVnOwpAQCAtODQsNyArODAsOCBAQAogI2lmZGVmIFVTQlZJU0lPTl9ERUJVRwogCSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIHsgXAogCQlpZiAoY29yZV9kZWJ1ZyAmIChsZXZlbCkpIFwKLQkJCWluZm8oIlslczolZF0gIiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOyBcCisJCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6WyVzOiVkXSAiIGZtdCwgXAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOyBcCiAJfQogI2Vsc2UKIAkjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWkyYy5jCmluZGV4IGE2ZDAwODUuLjkyNDI3ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24taTJjLmMKQEAgLTQ3LDcgKzQ3LDggQEAKIAogI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgeyBcCiAJCWlmIChpMmNfZGVidWcgJiAobGV2ZWwpKSBcCi0JCQlpbmZvKCJbJXM6JWRdICIgZm10LCBfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOlslczolZF0gIiBmbXQsIFwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsgXAogCX0KIAogc3RhdGljIGludCB1c2J2aXNpb25faTJjX3dyaXRlKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwppbmRleCBiOTc3MTE2Li43N2FlYjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwpAQCAtNjksMTAgKzY5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCi0jaWZkZWYgQ09ORklHX0tNT0QKLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgInVzYnZpc2lvbi5oIgogI2luY2x1ZGUgInVzYnZpc2lvbi1jYXJkcy5oIgogCkBAIC05OCw3ICs5NCw4IEBACiAjaWZkZWYgVVNCVklTSU9OX0RFQlVHCiAJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgeyBcCiAJCWlmICh2aWRlb19kZWJ1ZyAmIChsZXZlbCkpIFwKLQkJCWluZm8oIlslczolZF0gIiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOyBcCisJCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6WyVzOiVkXSAiIGZtdCwgXAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyAsICMjIGFyZ3MpOyBcCiAJfQogI2Vsc2UKIAkjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQpAQCAtMzYwLDEzICszNTcsMTIgQEAKICAqLwogc3RhdGljIGludCB1c2J2aXNpb25fdjRsMl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCBlcnJDb2RlID0gMDsKIAogCVBERUJVRyhEQkdfSU8sICJvcGVuIik7CiAKKwlsb2NrX2tlcm5lbCgpOwogCXVzYnZpc2lvbl9yZXNldF9wb3dlck9mZlRpbWVyKHVzYnZpc2lvbik7CiAKIAlpZiAodXNidmlzaW9uLT51c2VyKQpAQCAtNDI0LDYgKzQyMCw3IEBACiAJdXNidmlzaW9uX2VtcHR5X2ZyYW1lcXVldWVzKHVzYnZpc2lvbik7CiAKIAlQREVCVUcoREJHX0lPLCAic3VjY2VzcyIpOworCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyQ29kZTsKIH0KIApAQCAtNDM3LDkgKzQzNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgdXNidmlzaW9uX3Y0bDJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlQREVCVUcoREJHX0lPLCAiY2xvc2UiKTsKIAltdXRleF9sb2NrKCZ1c2J2aXNpb24tPmxvY2spOwpAQCAtNDg0LDkgKzQ3OSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX3JlZ2lzdGVyIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCBlcnJDb2RlOwogCiAJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaG9zdChyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpCkBAIC01MDUsOSArNDk4LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfcmVnaXN0ZXIgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGVyckNvZGU7CiAKIAlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKQEAgLTUyNiw5ICs1MTcsNyBAQAogc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKIAkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdmMpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlzdHJsY3B5KHZjLT5kcml2ZXIsICJVU0JWaXNpb24iLCBzaXplb2YodmMtPmRyaXZlcikpOwogCXN0cmxjcHkodmMtPmNhcmQsCkBAIC01NDgsOSArNTM3LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2lucHV0ICp2aSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgY2hhbjsKIAogCWlmICgodmktPmluZGV4ID49IHVzYnZpc2lvbi0+dmlkZW9faW5wdXRzKSB8fCAodmktPmluZGV4IDwgMCkgKQpAQCAtNjAzLDkgKzU5MCw3IEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmlucHV0KQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJKmlucHV0ID0gdXNidmlzaW9uLT5jdGxfaW5wdXQ7CiAJcmV0dXJuIDA7CkBAIC02MTMsOSArNTk4LDcgQEAKIAogc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpbnB1dCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICgoaW5wdXQgPj0gdXNidmlzaW9uLT52aWRlb19pbnB1dHMpIHx8IChpbnB1dCA8IDApICkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MzIsOSArNjE1LDggQEAKIAogc3RhdGljIGludCB2aWRpb2Nfc19zdGQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaWQpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKIAl1c2J2aXNpb24tPnR2bm9ybUlkPSppZDsKIAogCW11dGV4X2xvY2soJnVzYnZpc2lvbi0+bG9jayk7CkBAIC02NTAsOSArNjMyLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICghdXNidmlzaW9uLT5oYXZlX3R1bmVyIHx8IHZ0LT5pbmRleCkJLy8gT25seSB0dW5lciAwCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjcxLDkgKzY1MSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAkvLyBPbmx5IG5vIG9yIG9uZSB0dW5lciBmb3Igbm93CiAJaWYgKCF1c2J2aXNpb24tPmhhdmVfdHVuZXIgfHwgdnQtPmluZGV4KQpAQCAtNjg3LDkgKzY2NSw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmcmVxKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJZnJlcS0+dHVuZXIgPSAwOyAvLyBPbmx5IG9uZSB0dW5lcgogCWlmKHVzYnZpc2lvbi0+cmFkaW8pIHsKQEAgLTcwNSw5ICs2ODEsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3kgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCS8vIE9ubHkgbm8gb3Igb25lIHR1bmVyIGZvciBub3cKIAlpZiAoIXVzYnZpc2lvbi0+aGF2ZV90dW5lciB8fCBmcmVxLT50dW5lcikKQEAgLTcyMSw5ICs2OTUsNyBAQAogCiBzdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYXVkaW8gKmEpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAltZW1zZXQoYSwwLHNpemVvZigqYSkpOwogCWlmKHVzYnZpc2lvbi0+cmFkaW8pIHsKQEAgLTc0OCw5ICs3MjAsNyBAQAogc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGlkPWN0cmwtPmlkOwogCiAJbWVtc2V0KGN0cmwsMCxzaXplb2YoKmN0cmwpKTsKQEAgLTc2Nyw5ICs3MzcsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBWSURJT0NfR19DVFJMLCBjdHJsKTsKIAogCXJldHVybiAwOwpAQCAtNzc4LDkgKzc0Niw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFZJRElPQ19TX0NUUkwsIGN0cmwpOwogCiAJcmV0dXJuIDA7CkBAIC03ODksOSArNzU1LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMgKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnZyKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXQ7CiAKIAlSRVNUUklDVF9UT19SQU5HRSh2ci0+Y291bnQsMSxVU0JWSVNJT05fTlVNRlJBTUVTKTsKQEAgLTgxOSw5ICs3ODMsNyBAQAogc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYgKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqdmIpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHVzYnZpc2lvbl9mcmFtZSAqZnJhbWU7CiAKIAkvKiBGSVhNRSA6IG11c3QgY29udHJvbApAQCAtODU3LDkgKzgxOSw3IEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX3FidWYgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnZiKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCB1c2J2aXNpb25fZnJhbWUgKmZyYW1lOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKIApAQCAtODk2LDkgKzg1Niw3IEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX2RxYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICp2YikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0OwogCXN0cnVjdCB1c2J2aXNpb25fZnJhbWUgKmY7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwpAQCAtOTM5LDkgKzg5Nyw3IEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgYj1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAKIAl1c2J2aXNpb24tPnN0cmVhbWluZyA9IFN0cmVhbV9PbjsKQEAgLTk1Myw5ICs5MDksNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9Ci0JCShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCBiPVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAogCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKQEAgLTk4OCw5ICs5NDIsNyBAQAogc3RhdGljIGludCB2aWRpb2NfZ19mbXRfdmlkX2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqdmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJdmYtPmZtdC5waXgud2lkdGggPSB1c2J2aXNpb24tPmN1cndpZHRoOwogCXZmLT5mbXQucGl4LmhlaWdodCA9IHVzYnZpc2lvbi0+Y3VyaGVpZ2h0OwogCXZmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gdXNidmlzaW9uLT5wYWxldHRlLmZvcm1hdDsKQEAgLTEwMDYsOSArOTU4LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICp2ZikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgZm9ybWF0SWR4OwogCiAJLyogRmluZCByZXF1ZXN0ZWQgZm9ybWF0IGluIGF2YWlsYWJsZSBvbmVzICovCkBAIC0xMDM2LDkgKzk4Niw3IEBACiBzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqdmYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldDsKIAogCWlmKCAwICE9IChyZXQ9dmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAoZmlsZSwgcHJpdiwgdmYpKSApIHsKQEAgLTEwNjYsOSArMTAxNCw3IEBACiBzdGF0aWMgc3NpemVfdCB1c2J2aXNpb25fdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgbm9ibG9jayA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKIApAQCAtMTE3NywxMCArMTEyMyw3IEBACiAJCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKIAl2b2lkICpwb3M7CiAJdTMyIGk7Ci0KLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCVBERUJVRyhEQkdfTU1BUCwgIm1tYXAiKTsKIApAQCAtMTIzNyw5ICsxMTgwLDcgQEAKICAqLwogc3RhdGljIGludCB1c2J2aXNpb25fcmFkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPQotCQkoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgZXJyQ29kZSA9IDA7CiAKIAlQREVCVUcoREJHX0lPLCAiJXM6IiwgX19mdW5jX18pOwpAQCAtMTI4OSw5ICsxMjMwLDcgQEAKIAogc3RhdGljIGludCB1c2J2aXNpb25fcmFkaW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0KLQkJKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IGVyckNvZGUgPSAwOwogCiAJUERFQlVHKERCR19JTywgIiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKaW5kZXggNmVmM2U1Mi4uZjE2YWFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCkBAIC04Myw2ICs4MywyMiBAQAogCX0sCiAJewogCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAorCQkuc2VsZWN0b3IJPSBQVV9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFX0NPTlRST0wsCisJCS5pbmRleAkJPSA2LAorCQkuc2l6ZQkJPSAyLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9SQU5HRQorCQkJCXwgVVZDX0NPTlRST0xfUkVTVE9SRSB8IFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAorCQkuc2VsZWN0b3IJPSBQVV9XSElURV9CQUxBTkNFX0NPTVBPTkVOVF9DT05UUk9MLAorCQkuaW5kZXgJCT0gNywKKwkJLnNpemUJCT0gNCwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKKwkJCQl8IFVWQ19DT05UUk9MX1JFU1RPUkUgfCBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfUFJPQ0VTU0lORywKIAkJLnNlbGVjdG9yCT0gUFVfQkFDS0xJR0hUX0NPTVBFTlNBVElPTl9DT05UUk9MLAogCQkuaW5kZXgJCT0gOCwKIAkJLnNpemUJCT0gMiwKQEAgLTExNCw2ICsxMzAsNjAgQEAKIAkJCQl8IFVWQ19DT05UUk9MX0dFVF9ERUYgfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAogCX0sCiAJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAorCQkuc2VsZWN0b3IJPSBQVV9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFX0FVVE9fQ09OVFJPTCwKKwkJLmluZGV4CQk9IDEyLAorCQkuc2l6ZQkJPSAxLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9DVVIKKwkJCQl8IFVWQ19DT05UUk9MX0dFVF9ERUYgfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAorCQkuc2VsZWN0b3IJPSBQVV9XSElURV9CQUxBTkNFX0NPTVBPTkVOVF9BVVRPX0NPTlRST0wsCisJCS5pbmRleAkJPSAxMywKKwkJLnNpemUJCT0gMSwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfQ1VSCisJCQkJfCBVVkNfQ09OVFJPTF9HRVRfREVGIHwgVVZDX0NPTlRST0xfUkVTVE9SRSwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfUFJPQ0VTU0lORywKKwkJLnNlbGVjdG9yCT0gUFVfRElHSVRBTF9NVUxUSVBMSUVSX0NPTlRST0wsCisJCS5pbmRleAkJPSAxNCwKKwkJLnNpemUJCT0gMiwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKKwkJCQl8IFVWQ19DT05UUk9MX1JFU1RPUkUsCisJfSwKKwl7CisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX1BST0NFU1NJTkcsCisJCS5zZWxlY3Rvcgk9IFBVX0RJR0lUQUxfTVVMVElQTElFUl9MSU1JVF9DT05UUk9MLAorCQkuaW5kZXgJCT0gMTUsCisJCS5zaXplCQk9IDIsCisJCS5mbGFncwkJPSBVVkNfQ09OVFJPTF9TRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX1JBTkdFCisJCQkJfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAorCQkuc2VsZWN0b3IJPSBQVV9BTkFMT0dfVklERU9fU1RBTkRBUkRfQ09OVFJPTCwKKwkJLmluZGV4CQk9IDE2LAorCQkuc2l6ZQkJPSAxLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfR0VUX0NVUiwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfUFJPQ0VTU0lORywKKwkJLnNlbGVjdG9yCT0gUFVfQU5BTE9HX0xPQ0tfU1RBVFVTX0NPTlRST0wsCisJCS5pbmRleAkJPSAxNywKKwkJLnNpemUJCT0gMSwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX0dFVF9DVVIsCisJfSwKKwl7CisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfU0NBTk5JTkdfTU9ERV9DT05UUk9MLAorCQkuaW5kZXgJCT0gMCwKKwkJLnNpemUJCT0gMSwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfQ1VSCisJCQkJfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAorCX0sCisJewogCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCiAJCS5zZWxlY3Rvcgk9IENUX0FFX01PREVfQ09OVFJPTCwKIAkJLmluZGV4CQk9IDEsCkBAIC0xNDAsNiArMjEwLDE0IEBACiAJfSwKIAl7CiAJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfRVhQT1NVUkVfVElNRV9SRUxBVElWRV9DT05UUk9MLAorCQkuaW5kZXgJCT0gNCwKKwkJLnNpemUJCT0gMSwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfQ1VSCisJCQkJfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCiAJCS5zZWxlY3Rvcgk9IENUX0ZPQ1VTX0FCU09MVVRFX0NPTlRST0wsCiAJCS5pbmRleAkJPSA1LAogCQkuc2l6ZQkJPSAyLApAQCAtMTQ4LDYgKzIyNiw3OCBAQAogCX0sCiAJewogCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IENUX0ZPQ1VTX1JFTEFUSVZFX0NPTlRST0wsCisJCS5pbmRleAkJPSA2LAorCQkuc2l6ZQkJPSAyLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9SQU5HRQorCQkJCXwgVVZDX0NPTlRST0xfQVVUT19VUERBVEUsCisJfSwKKwl7CisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfSVJJU19BQlNPTFVURV9DT05UUk9MLAorCQkuaW5kZXgJCT0gNywKKwkJLnNpemUJCT0gMiwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKKwkJCQl8IFVWQ19DT05UUk9MX1JFU1RPUkUgfCBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfQ0FNRVJBLAorCQkuc2VsZWN0b3IJPSBDVF9JUklTX1JFTEFUSVZFX0NPTlRST0wsCisJCS5pbmRleAkJPSA4LAorCQkuc2l6ZQkJPSAxLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9DVVIKKwkJCQl8IFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IENUX1pPT01fQUJTT0xVVEVfQ09OVFJPTCwKKwkJLmluZGV4CQk9IDksCisJCS5zaXplCQk9IDIsCisJCS5mbGFncwkJPSBVVkNfQ09OVFJPTF9TRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX1JBTkdFCisJCQkJfCBVVkNfQ09OVFJPTF9SRVNUT1JFIHwgVVZDX0NPTlRST0xfQVVUT19VUERBVEUsCisJfSwKKwl7CisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfWk9PTV9SRUxBVElWRV9DT05UUk9MLAorCQkuaW5kZXgJCT0gMTAsCisJCS5zaXplCQk9IDMsCisJCS5mbGFncwkJPSBVVkNfQ09OVFJPTF9TRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX1JBTkdFCisJCQkJfCBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfQ0FNRVJBLAorCQkuc2VsZWN0b3IJPSBDVF9QQU5USUxUX0FCU09MVVRFX0NPTlRST0wsCisJCS5pbmRleAkJPSAxMSwKKwkJLnNpemUJCT0gOCwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKKwkJCQl8IFVWQ19DT05UUk9MX1JFU1RPUkUgfCBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSwKKwl9LAorCXsKKwkJLmVudGl0eQkJPSBVVkNfR1VJRF9VVkNfQ0FNRVJBLAorCQkuc2VsZWN0b3IJPSBDVF9QQU5USUxUX1JFTEFUSVZFX0NPTlRST0wsCisJCS5pbmRleAkJPSAxMiwKKwkJLnNpemUJCT0gNCwKKwkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKKwkJCQl8IFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IENUX1JPTExfQUJTT0xVVEVfQ09OVFJPTCwKKwkJLmluZGV4CQk9IDEzLAorCQkuc2l6ZQkJPSAyLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9SQU5HRQorCQkJCXwgVVZDX0NPTlRST0xfUkVTVE9SRSB8IFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFLAorCX0sCisJeworCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19DQU1FUkEsCisJCS5zZWxlY3Rvcgk9IENUX1JPTExfUkVMQVRJVkVfQ09OVFJPTCwKKwkJLmluZGV4CQk9IDE0LAorCQkuc2l6ZQkJPSAyLAorCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9SQU5HRQorCQkJCXwgVVZDX0NPTlRST0xfQVVUT19VUERBVEUsCisJfSwKKwl7CisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKIAkJLnNlbGVjdG9yCT0gQ1RfRk9DVVNfQVVUT19DT05UUk9MLAogCQkuaW5kZXgJCT0gMTcsCiAJCS5zaXplCQk9IDEsCkBAIC0xNTUsMzUgKzMwNSwxMSBAQAogCQkJCXwgVVZDX0NPTlRST0xfR0VUX0RFRiB8IFVWQ19DT05UUk9MX1JFU1RPUkUsCiAJfSwKIAl7Ci0JCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX1BST0NFU1NJTkcsCi0JCS5zZWxlY3Rvcgk9IFBVX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkVfQVVUT19DT05UUk9MLAotCQkuaW5kZXgJCT0gMTIsCisJCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX0NBTUVSQSwKKwkJLnNlbGVjdG9yCT0gQ1RfUFJJVkFDWV9DT05UUk9MLAorCQkuaW5kZXgJCT0gMTgsCiAJCS5zaXplCQk9IDEsCiAJCS5mbGFncwkJPSBVVkNfQ09OVFJPTF9TRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX0NVUgotCQkJCXwgVVZDX0NPTlRST0xfR0VUX0RFRiB8IFVWQ19DT05UUk9MX1JFU1RPUkUsCi0JfSwKLQl7Ci0JCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX1BST0NFU1NJTkcsCi0JCS5zZWxlY3Rvcgk9IFBVX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkVfQ09OVFJPTCwKLQkJLmluZGV4CQk9IDYsCi0JCS5zaXplCQk9IDIsCi0JCS5mbGFncwkJPSBVVkNfQ09OVFJPTF9TRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX1JBTkdFCi0JCQkJfCBVVkNfQ09OVFJPTF9SRVNUT1JFIHwgVVZDX0NPTlRST0xfQVVUT19VUERBVEUsCi0JfSwKLQl7Ci0JCS5lbnRpdHkJCT0gVVZDX0dVSURfVVZDX1BST0NFU1NJTkcsCi0JCS5zZWxlY3Rvcgk9IFBVX1dISVRFX0JBTEFOQ0VfQ09NUE9ORU5UX0FVVE9fQ09OVFJPTCwKLQkJLmluZGV4CQk9IDEzLAotCQkuc2l6ZQkJPSAxLAotCQkuZmxhZ3MJCT0gVVZDX0NPTlRST0xfU0VUX0NVUiB8IFVWQ19DT05UUk9MX0dFVF9DVVIKLQkJCQl8IFVWQ19DT05UUk9MX0dFVF9ERUYgfCBVVkNfQ09OVFJPTF9SRVNUT1JFLAotCX0sCi0JewotCQkuZW50aXR5CQk9IFVWQ19HVUlEX1VWQ19QUk9DRVNTSU5HLAotCQkuc2VsZWN0b3IJPSBQVV9XSElURV9CQUxBTkNFX0NPTVBPTkVOVF9DT05UUk9MLAotCQkuaW5kZXgJCT0gNywKLQkJLnNpemUJCT0gNCwKLQkJLmZsYWdzCQk9IFVWQ19DT05UUk9MX1NFVF9DVVIgfCBVVkNfQ09OVFJPTF9HRVRfUkFOR0UKIAkJCQl8IFVWQ19DT05UUk9MX1JFU1RPUkUgfCBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSwKIAl9LAogfTsKQEAgLTU5Miw3ICs3MTgsNyBAQAogCWlmIChjdHJsID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGF0YSA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGttYWxsb2MoY3RybC0+aW5mby0+c2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTcxMSw3ICs4MzcsMTcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBlbnRpdHktPm5jb250cm9sczsgKytpKSB7CiAJCWN0cmwgPSAmZW50aXR5LT5jb250cm9sc1tpXTsKLQkJaWYgKGN0cmwtPmluZm8gPT0gTlVMTCB8fCAhY3RybC0+ZGlydHkpCisJCWlmIChjdHJsLT5pbmZvID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKiBSZXNldCB0aGUgbG9hZGVkIGZsYWcgZm9yIGF1dG8tdXBkYXRlIGNvbnRyb2xzIHRoYXQgd2VyZQorCQkgKiBtYXJrZWQgYXMgbG9hZGVkIGluIHV2Y19jdHJsX2dldC91dmNfY3RybF9zZXQgdG8gcHJldmVudAorCQkgKiB1dmNfY3RybF9nZXQgZnJvbSB1c2luZyB0aGUgY2FjaGVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKGN0cmwtPmluZm8tPmZsYWdzICYgVVZDX0NPTlRST0xfQVVUT19VUERBVEUpCisJCQljdHJsLT5sb2FkZWQgPSAwOworCisJCWlmICghY3RybC0+ZGlydHkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIXJvbGxiYWNrKQpAQCAtNzI3LDkgKzg2Myw2IEBACiAJCQkgICAgICAgdXZjX2N0cmxfZGF0YShjdHJsLCBVVkNfQ1RSTF9EQVRBX0JBQ0tVUCksCiAJCQkgICAgICAgY3RybC0+aW5mby0+c2l6ZSk7CiAKLQkJaWYgKChjdHJsLT5pbmZvLT5mbGFncyAmIFVWQ19DT05UUk9MX0dFVF9DVVIpID09IDApCi0JCQljdHJsLT5sb2FkZWQgPSAwOwotCiAJCWN0cmwtPmRpcnR5ID0gMDsKIAogCQlpZiAocmV0IDwgMCkKQEAgLTc4Nyw4ICs5MjAsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJaWYgKChjdHJsLT5pbmZvLT5mbGFncyAmIFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFKSA9PSAwKQotCQkJY3RybC0+bG9hZGVkID0gMTsKKwkJY3RybC0+bG9hZGVkID0gMTsKIAl9CiAKIAl4Y3RybC0+dmFsdWUgPSB1dmNfZ2V0X2xlX3ZhbHVlKApAQCAtODM5LDggKzk3MSw3IEBACiAJCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCWlmICgoY3RybC0+aW5mby0+ZmxhZ3MgJiBVVkNfQ09OVFJPTF9BVVRPX1VQREFURSkgPT0gMCkKLQkJCWN0cmwtPmxvYWRlZCA9IDE7CisJCWN0cmwtPmxvYWRlZCA9IDE7CiAJfQogCiAJaWYgKCFjdHJsLT5kaXJ0eSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCmluZGV4IDdlMTAyMDMuLmQ3YWQwNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKQEAgLTE2NjMsNyArMTY2Myw3IEBACiAJcmV0dXJuIHV2Y192aWRlb19zdXNwZW5kKCZkZXYtPnZpZGVvKTsKIH0KIAotc3RhdGljIGludCB1dmNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBfX3V2Y19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGludCByZXNldCkKIHsKIAlzdHJ1Y3QgdXZjX2RldmljZSAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlpbnQgcmV0OwpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKIAkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKIAlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzID09IFNDX1ZJREVPQ09OVFJPTCkgewotCQlpZiAoKHJldCA9IHV2Y19jdHJsX3Jlc3VtZV9kZXZpY2UoZGV2KSkgPCAwKQorCQlpZiAocmVzZXQgJiYgKHJldCA9IHV2Y19jdHJsX3Jlc3VtZV9kZXZpY2UoZGV2KSkgPCAwKQogCQkJcmV0dXJuIHJldDsKIAogCQlyZXR1cm4gdXZjX3N0YXR1c19yZXN1bWUoZGV2KTsKQEAgLTE2ODcsNiArMTY4NywxNiBAQAogCXJldHVybiB1dmNfdmlkZW9fcmVzdW1lKCZkZXYtPnZpZGVvKTsKIH0KIAorc3RhdGljIGludCB1dmNfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiBfX3V2Y19yZXN1bWUoaW50ZiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdXZjX3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gX191dmNfcmVzdW1lKGludGYsIDEpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cAogICovCkBAIC0xOTAyLDYgKzE5MTIsMjQgQEAKIAkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAorCS8qIENvbXBhcSBQcmVzYXJpbyBCMTIwMCAtIEJpc29uIEVsZWN0cm9uaWNzICovCisJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKKwkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCisJICAuaWRWZW5kb3IJCT0gMHg1OTg2LAorCSAgLmlkUHJvZHVjdAkJPSAweDAxMDQsCisJICAuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNTX1ZJREVPLAorCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCisJICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKKwkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCisJLyogQWNlciBUcmF2ZWxtYXRlIDc3MjAgLSBCaXNvbiBFbGVjdHJvbmljcyAqLworCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCisJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAorCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKKwkgIC5pZFByb2R1Y3QJCT0gMHgwMTA1LAorCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKKwkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAorCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCisJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAogCS8qIE1lZGlvbiBBa295YSBNaW5pIEUxMjEwIC0gQmlzb24gRWxlY3Ryb25pY3MgKi8KIAl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQogCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKQEAgLTE5MjAsNiArMTk0OCwyNCBAQAogCSAgLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDEsCiAJICAuYkludGVyZmFjZVByb3RvY29sCT0gMCwKIAkgIC5kcml2ZXJfaW5mbwkJPSBVVkNfUVVJUktfUFJPQkVfTUlOTUFYIH0sCisJLyogIEZ1aml0c3UgQW1pbG8gU0kyNjM2IC0gQmlzb24gRWxlY3Ryb25pY3MgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDU5ODYsCisJICAuaWRQcm9kdWN0CQk9IDB4MDIwMiwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVggfSwKKwkvKiAgQWR2ZW50IDQyMTEgLSBCaXNvbiBFbGVjdHJvbmljcyAqLworCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCisJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLAorCSAgLmlkVmVuZG9yCQk9IDB4NTk4NiwKKwkgIC5pZFByb2R1Y3QJCT0gMHgwMjAzLAorCSAgLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19WSURFTywKKwkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAorCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCisJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX01JTk1BWCB9LAogCS8qIEJpc29uIEVsZWN0cm9uaWNzICovCiAJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKIAkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8sCkBAIC0xOTUyLDYgKzE5OTgsNyBAQAogCQkuZGlzY29ubmVjdAk9IHV2Y19kaXNjb25uZWN0LAogCQkuc3VzcGVuZAk9IHV2Y19zdXNwZW5kLAogCQkucmVzdW1lCQk9IHV2Y19yZXN1bWUsCisJCS5yZXNldF9yZXN1bWUJPSB1dmNfcmVzZXRfcmVzdW1lLAogCQkuaWRfdGFibGUJPSB1dmNfaWRzLAogCQkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfc3RhdHVzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfc3RhdHVzLmMKaW5kZXggNzVlNjc4YS4uNWQ2MGIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19zdGF0dXMuYwpAQCAtMTc3LDEwICsxNzcsMTYgQEAKIAogCXV2Y19pbnB1dF9pbml0KGRldik7CiAKLQlkZXYtPmludF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmIChkZXYtPmludF91cmIgPT0gTlVMTCkKKwlkZXYtPnN0YXR1cyA9IGt6YWxsb2MoVVZDX01BWF9TVEFUVVNfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+c3RhdHVzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZGV2LT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2LT5pbnRfdXJiID09IE5VTEwpIHsKKwkJa2ZyZWUoZGV2LT5zdGF0dXMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LCBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKIAogCS8qIEZvciBoaWdoLXNwZWVkIGludGVycnVwdCBlbmRwb2ludHMsIHRoZSBiSW50ZXJ2YWwgdmFsdWUgaXMgdXNlZCBhcwpAQCAtMTkyLDcgKzE5OCw3IEBACiAJCWludGVydmFsID0gZmxzKGludGVydmFsKSAtIDE7CiAKIAl1c2JfZmlsbF9pbnRfdXJiKGRldi0+aW50X3VyYiwgZGV2LT51ZGV2LCBwaXBlLAotCQlkZXYtPnN0YXR1cywgc2l6ZW9mIGRldi0+c3RhdHVzLCB1dmNfc3RhdHVzX2NvbXBsZXRlLAorCQlkZXYtPnN0YXR1cywgVVZDX01BWF9TVEFUVVNfU0laRSwgdXZjX3N0YXR1c19jb21wbGV0ZSwKIAkJZGV2LCBpbnRlcnZhbCk7CiAKIAlyZXR1cm4gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRfdXJiLCBHRlBfS0VSTkVMKTsKQEAgLTIwMiw2ICsyMDgsNyBAQAogewogCXVzYl9raWxsX3VyYihkZXYtPmludF91cmIpOwogCXVzYl9mcmVlX3VyYihkZXYtPmludF91cmIpOworCWtmcmVlKGRldi0+c3RhdHVzKTsKIAl1dmNfaW5wdXRfY2xlYW51cChkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwppbmRleCBkN2JkNzFiLi43OGU0YzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKQEAgLTQwMCwxNSArNDAwLDEzIEBACiAKIHN0YXRpYyBpbnQgdXZjX3Y0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OwogCXN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbzsKIAlzdHJ1Y3QgdXZjX2ZoICpoYW5kbGU7CiAJaW50IHJldCA9IDA7CiAKIAl1dmNfdHJhY2UoVVZDX1RSQUNFX0NBTExTLCAidXZjX3Y0bDJfb3BlblxuIik7CiAJbXV0ZXhfbG9jaygmdXZjX2RyaXZlci5vcGVuX211dGV4KTsKLQl2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQl2aWRlbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCXZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCWlmICh2aWRlby0+ZGV2LT5zdGF0ZSAmIFVWQ19ERVZfRElTQ09OTkVDVEVEKSB7CiAJCXJldCA9IC1FTk9ERVY7CkBAIC00NDAsOCArNDM4LDcgQEAKIAogc3RhdGljIGludCB1dmNfdjRsMl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCXN0cnVjdCB1dmNfdmlkZW9fZGV2aWNlICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHV2Y19maCAqaGFuZGxlID0gKHN0cnVjdCB1dmNfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAl1dmNfdHJhY2UoVVZDX1RSQUNFX0NBTExTLCAidXZjX3Y0bDJfcmVsZWFzZVxuIik7CkBAIC04NDUsMTAgKzg0Miw2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoISh2aWRlby0+c3RyZWFtaW5nLT5jdXJfZm9ybWF0LT5mbGFncyAmCi0JCSAgICBVVkNfRk1UX0ZMQUdfQ09NUFJFU1NFRCkpCi0JCQl2aWRlby0+cXVldWUuZmxhZ3MgfD0gVVZDX1FVRVVFX0RST1BfSU5DT01QTEVURTsKLQogCQlyYi0+Y291bnQgPSByZXQ7CiAJCXJldCA9IDA7CiAJCWJyZWFrOwpAQCAtMTAzMSw4ICsxMDI0LDcgQEAKIAogc3RhdGljIGludCB1dmNfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlzdHJ1Y3QgdXZjX3ZpZGVvX2RldmljZSAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCB1dmNfYnVmZmVyICp1bmluaXRpYWxpemVkX3ZhcihidWZmZXIpOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgYWRkciwgc3RhcnQsIHNpemU7CkBAIC0xMDg1LDggKzEwNzcsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHV2Y192NGwyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHV2Y192aWRlb19kZXZpY2UgKnZpZGVvID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHV2Y192aWRlb19kZXZpY2UgKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXV2Y190cmFjZShVVkNfVFJBQ0VfQ0FMTFMsICJ1dmNfdjRsMl9wb2xsXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwppbmRleCA2ODU0YWM3Li5iN2JiMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdmlkZW8uYwpAQCAtNDU1LDcgKzQ1NSw4IEBACiAJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggLSByZXQpOwogCiAJCS8qIFByb2Nlc3MgdGhlIGhlYWRlciBhZ2Fpbi4gKi8KLQkJdXZjX3ZpZGVvX2RlY29kZV9lbmQodmlkZW8sIGJ1ZiwgbWVtLCByZXQpOworCQl1dmNfdmlkZW9fZGVjb2RlX2VuZCh2aWRlbywgYnVmLCBtZW0sCisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGgpOwogCiAJCWlmIChidWYtPnN0YXRlID09IFVWQ19CVUZfU1RBVEVfRE9ORSB8fAogCQkgICAgYnVmLT5zdGF0ZSA9PSBVVkNfQlVGX1NUQVRFX0VSUk9SKQpAQCAtNTEyLDcgKzUxMyw3IEBACiAJICAgIHZpZGVvLT5idWxrLnBheWxvYWRfc2l6ZSA+PSB2aWRlby0+YnVsay5tYXhfcGF5bG9hZF9zaXplKSB7CiAJCWlmICghdmlkZW8tPmJ1bGsuc2tpcF9wYXlsb2FkICYmIGJ1ZiAhPSBOVUxMKSB7CiAJCQl1dmNfdmlkZW9fZGVjb2RlX2VuZCh2aWRlbywgYnVmLCB2aWRlby0+YnVsay5oZWFkZXIsCi0JCQkJdmlkZW8tPmJ1bGsuaGVhZGVyX3NpemUpOworCQkJCXZpZGVvLT5idWxrLnBheWxvYWRfc2l6ZSk7CiAJCQlpZiAoYnVmLT5zdGF0ZSA9PSBVVkNfQlVGX1NUQVRFX0RPTkUgfHwKIAkJCSAgICBidWYtPnN0YXRlID09IFVWQ19CVUZfU1RBVEVfRVJST1IpCiAJCQkJYnVmID0gdXZjX3F1ZXVlX25leHRfYnVmZmVyKCZ2aWRlby0+cXVldWUsIGJ1Zik7CkBAIC02NTUsNyArNjU2LDcgQEAKIAlpZiAoc2l6ZSA+IFVWQ19NQVhfRlJBTUVfU0laRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlucGFja2V0cyA9IChzaXplICsgcHNpemUgLSAxKSAvIHBzaXplOworCW5wYWNrZXRzID0gRElWX1JPVU5EX1VQKHNpemUsIHBzaXplKTsKIAlpZiAobnBhY2tldHMgPiBVVkNfTUFYX0lTT19QQUNLRVRTKQogCQlucGFja2V0cyA9IFVWQ19NQVhfSVNPX1BBQ0tFVFM7CiAKQEAgLTk3MCw2ICs5NzEsMTEgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKHZpZGVvLT5zdHJlYW1pbmctPmN1cl9mb3JtYXQtPmZsYWdzICYgVVZDX0ZNVF9GTEFHX0NPTVBSRVNTRUQpCisJCXZpZGVvLT5xdWV1ZS5mbGFncyAmPSB+VVZDX1FVRVVFX0RST1BfSU5DT01QTEVURTsKKwllbHNlCisJCXZpZGVvLT5xdWV1ZS5mbGFncyB8PSBVVkNfUVVFVUVfRFJPUF9JTkNPTVBMRVRFOworCiAJaWYgKChyZXQgPSB1dmNfcXVldWVfZW5hYmxlKCZ2aWRlby0+cXVldWUsIDEpKSA8IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCmluZGV4IGJhZmUzNDAuLjlhNmJjMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaApAQCAtMzAzLDYgKzMwMyw4IEBACiAjZGVmaW5lIFVWQ19NQVhfRlJBTUVfU0laRQkoMTYqMTAyNCoxMDI0KQogLyogTWF4aW11bSBudW1iZXIgb2YgdmlkZW8gYnVmZmVycy4gKi8KICNkZWZpbmUgVVZDX01BWF9WSURFT19CVUZGRVJTCTMyCisvKiBNYXhpbXVtIHN0YXR1cyBidWZmZXIgc2l6ZSBpbiBieXRlcyBvZiBpbnRlcnJ1cHQgVVJCLiAqLworI2RlZmluZSBVVkNfTUFYX1NUQVRVU19TSVpFCTE2CiAKICNkZWZpbmUgVVZDX0NUUkxfQ09OVFJPTF9USU1FT1VUCTMwMAogI2RlZmluZSBVVkNfQ1RSTF9TVFJFQU1JTkdfVElNRU9VVAkxMDAwCkBAIC02MzQsNyArNjM2LDcgQEAKIAkvKiBTdGF0dXMgSW50ZXJydXB0IEVuZHBvaW50ICovCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICppbnRfZXA7CiAJc3RydWN0IHVyYiAqaW50X3VyYjsKLQlfX3U4IHN0YXR1c1sxNl07CisJX191OCAqc3RhdHVzOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCiAJLyogVmlkZW8gU3RyZWFtaW5nIGludGVyZmFjZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwppbmRleCA3OTkzN2QxLi45MjhjYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCkBAIC0zNiwxMCArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCi0jaWZkZWYgQ09ORklHX0tNT0QKLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKLQogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwppbmRleCA4OGNhMTMxLi44NDY3NjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCkBAIC02MCwxMCArNjAsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKLSNpZmRlZiBDT05GSUdfS01PRAotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkJpbGwgRGlya3MsIEp1c3RpbiBTY2hvZW1hbiwgR2VyZCBLbm9yciIpOwpAQCAtMTg3LDkgKzE4MywxMSBAQAogCQlOVUxMCiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19lbmNvZGluZ1tdID0gewotCQkiTGF5ZXIgSSIsCi0JCSJMYXllciBJSSIsCi0JCSJMYXllciBJSUkiLAorCQkiTVBFRy0xLzIgTGF5ZXIgSSIsCisJCSJNUEVHLTEvMiBMYXllciBJSSIsCisJCSJNUEVHLTEvMiBMYXllciBJSUkiLAorCQkiTVBFRy0yLzQgQUFDIiwKKwkJIkFDLTMiLAogCQlOVUxMCiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sMV9iaXRyYXRlW10gPSB7CkBAIC0yNDMsNiArMjQxLDI4IEBACiAJCSIzMjAga2JwcyIsCiAJCU5VTEwKIAl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2FjM19iaXRyYXRlW10gPSB7CisJCSIzMiBrYnBzIiwKKwkJIjQwIGticHMiLAorCQkiNDgga2JwcyIsCisJCSI1NiBrYnBzIiwKKwkJIjY0IGticHMiLAorCQkiODAga2JwcyIsCisJCSI5NiBrYnBzIiwKKwkJIjExMiBrYnBzIiwKKwkJIjEyOCBrYnBzIiwKKwkJIjE2MCBrYnBzIiwKKwkJIjE5MiBrYnBzIiwKKwkJIjIyNCBrYnBzIiwKKwkJIjI1NiBrYnBzIiwKKwkJIjMyMCBrYnBzIiwKKwkJIjM4NCBrYnBzIiwKKwkJIjQ0OCBrYnBzIiwKKwkJIjUxMiBrYnBzIiwKKwkJIjU3NiBrYnBzIiwKKwkJIjY0MCBrYnBzIiwKKwkJTlVMTAorCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbW9kZVtdID0gewogCQkiU3RlcmVvIiwKIAkJIkpvaW50IFN0ZXJlbyIsCkBAIC0yNzEsNiArMjkxLDcgQEAKIAlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19lbmNvZGluZ1tdID0gewogCQkiTVBFRy0xIiwKIAkJIk1QRUctMiIsCisJCSJNUEVHLTQgQVZDIiwKIAkJTlVMTAogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYXNwZWN0W10gPSB7CkBAIC0zMTEsNiArMzMyLDggQEAKIAkJCXJldHVybiBtcGVnX2F1ZGlvX2wyX2JpdHJhdGU7CiAJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgogCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDNfYml0cmF0ZTsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FDM19CSVRSQVRFOgorCQkJcmV0dXJuIG1wZWdfYXVkaW9fYWMzX2JpdHJhdGU7CiAJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFOgogCQkJcmV0dXJuIG1wZWdfYXVkaW9fbW9kZTsKIAkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOgpAQCAtMzM1LDYyICszNTgsNzMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2dldF9tZW51KTsKIAorLyogUmV0dXJuIHRoZSBjb250cm9sIG5hbWUuICovCitjb25zdCBjaGFyICp2NGwyX2N0cmxfZ2V0X25hbWUodTMyIGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwkvKiBVU0VSIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOiAJcmV0dXJuICJVc2VyIENvbnRyb2xzIjsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogCXJldHVybiAiVm9sdW1lIjsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IAlyZXR1cm4gIk11dGUiOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRTogCXJldHVybiAiQmFsYW5jZSI7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOiAJcmV0dXJuICJCYXNzIjsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRTogCXJldHVybiAiVHJlYmxlIjsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOiAJcmV0dXJuICJMb3VkbmVzcyI7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiAJcmV0dXJuICJCcmlnaHRuZXNzIjsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOiAJcmV0dXJuICJDb250cmFzdCI7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiAJcmV0dXJuICJTYXR1cmF0aW9uIjsKKwljYXNlIFY0TDJfQ0lEX0hVRTogCQlyZXR1cm4gIkh1ZSI7CisKKwkvKiBNUEVHIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOiAJCXJldHVybiAiTVBFRyBFbmNvZGVyIENvbnRyb2xzIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUTogcmV0dXJuICJBdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kiOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzogCXJldHVybiAiQXVkaW8gRW5jb2RpbmciOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOiAJcmV0dXJuICJBdWRpbyBMYXllciBJIEJpdHJhdGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOiAJcmV0dXJuICJBdWRpbyBMYXllciBJSSBCaXRyYXRlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURTogCXJldHVybiAiQXVkaW8gTGF5ZXIgSUlJIEJpdHJhdGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19BQUNfQklUUkFURTogCXJldHVybiAiQXVkaW8gQUFDIEJpdHJhdGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19BQzNfQklUUkFURTogCXJldHVybiAiQXVkaW8gQUMtMyBCaXRyYXRlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERTogCQlyZXR1cm4gIkF1ZGlvIFN0ZXJlbyBNb2RlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046IHJldHVybiAiQXVkaW8gU3RlcmVvIE1vZGUgRXh0ZW5zaW9uIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6IAlyZXR1cm4gIkF1ZGlvIEVtcGhhc2lzIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOiAJCXJldHVybiAiQXVkaW8gQ1JDIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURTogCQlyZXR1cm4gIkF1ZGlvIE11dGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzogCXJldHVybiAiVmlkZW8gRW5jb2RpbmciOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6IAlyZXR1cm4gIlZpZGVvIEFzcGVjdCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOiAJcmV0dXJuICJWaWRlbyBCIEZyYW1lcyI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOiAJcmV0dXJuICJWaWRlbyBHT1AgU2l6ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOiAJcmV0dXJuICJWaWRlbyBHT1AgQ2xvc3VyZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOiAJcmV0dXJuICJWaWRlbyBQdWxsZG93biI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERTogCXJldHVybiAiVmlkZW8gQml0cmF0ZSBNb2RlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURTogCXJldHVybiAiVmlkZW8gQml0cmF0ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzogCXJldHVybiAiVmlkZW8gUGVhayBCaXRyYXRlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjogcmV0dXJuICJWaWRlbyBUZW1wb3JhbCBEZWNpbWF0aW9uIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURTogCQlyZXR1cm4gIlZpZGVvIE11dGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVVjoJcmV0dXJuICJWaWRlbyBNdXRlIFlVViI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOiAJcmV0dXJuICJTdHJlYW0gVHlwZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOiAJcmV0dXJuICJTdHJlYW0gUE1UIFByb2dyYW0gSUQiOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOiAJcmV0dXJuICJTdHJlYW0gQXVkaW8gUHJvZ3JhbSBJRCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86IAlyZXR1cm4gIlN0cmVhbSBWaWRlbyBQcm9ncmFtIElEIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6IAlyZXR1cm4gIlN0cmVhbSBQQ1IgUHJvZ3JhbSBJRCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86IHJldHVybiAiU3RyZWFtIFBFUyBBdWRpbyBJRCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86IHJldHVybiAiU3RyZWFtIFBFUyBWaWRlbyBJRCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOglyZXR1cm4gIlN0cmVhbSBWQkkgRm9ybWF0IjsKKworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2dldF9uYW1lKTsKKwogLyogRmlsbCBpbiBhIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqLwogaW50IHY0bDJfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKQogewotCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IHY0bDJfY3RybF9nZXRfbmFtZShxY3RybC0+aWQpOwogCiAJcWN0cmwtPmZsYWdzID0gMDsKLQlzd2l0Y2ggKHFjdHJsLT5pZCkgewotCS8qIFVTRVIgY29udHJvbHMgKi8KLQljYXNlIFY0TDJfQ0lEX1VTRVJfQ0xBU1M6IAluYW1lID0gIlVzZXIgQ29udHJvbHMiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogCW5hbWUgPSAiVm9sdW1lIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiAJbmFtZSA9ICJNdXRlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOiAJbmFtZSA9ICJCYWxhbmNlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOiAJbmFtZSA9ICJCYXNzIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6IAluYW1lID0gIlRyZWJsZSI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6IAluYW1lID0gIkxvdWRuZXNzIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiAJbmFtZSA9ICJCcmlnaHRuZXNzIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogCW5hbWUgPSAiQ29udHJhc3QiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IAluYW1lID0gIlNhdHVyYXRpb24iOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hVRTogCQluYW1lID0gIkh1ZSI7IGJyZWFrOwotCi0JLyogTVBFRyBjb250cm9scyAqLwotCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzogCQluYW1lID0gIk1QRUcgRW5jb2RlciBDb250cm9scyI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROiBuYW1lID0gIkF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzogCW5hbWUgPSAiQXVkaW8gRW5jb2RpbmcgTGF5ZXIiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSSBCaXRyYXRlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJIEJpdHJhdGUiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSUlJIEJpdHJhdGUiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERTogCQluYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOiBuYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIEV4dGVuc2lvbiI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzogCW5hbWUgPSAiQXVkaW8gRW1waGFzaXMiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOiAJCW5hbWUgPSAiQXVkaW8gQ1JDIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEU6IAkJbmFtZSA9ICJBdWRpbyBNdXRlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOiAJbmFtZSA9ICJWaWRlbyBFbmNvZGluZyI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6IAluYW1lID0gIlZpZGVvIEFzcGVjdCI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzogCW5hbWUgPSAiVmlkZW8gQiBGcmFtZXMiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6IAluYW1lID0gIlZpZGVvIEdPUCBTaXplIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOiAJbmFtZSA9ICJWaWRlbyBHT1AgQ2xvc3VyZSI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjogCW5hbWUgPSAiVmlkZW8gUHVsbGRvd24iOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIE1vZGUiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURTogCW5hbWUgPSAiVmlkZW8gQml0cmF0ZSI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUs6IAluYW1lID0gIlZpZGVvIFBlYWsgQml0cmF0ZSI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOiBuYW1lID0gIlZpZGVvIFRlbXBvcmFsIERlY2ltYXRpb24iOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURTogCQluYW1lID0gIlZpZGVvIE11dGUiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURV9ZVVY6CW5hbWUgPSAiVmlkZW8gTXV0ZSBZVVYiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6IAluYW1lID0gIlN0cmVhbSBUeXBlIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOiAJbmFtZSA9ICJTdHJlYW0gUE1UIFByb2dyYW0gSUQiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTzogCW5hbWUgPSAiU3RyZWFtIEF1ZGlvIFByb2dyYW0gSUQiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTzogCW5hbWUgPSAiU3RyZWFtIFZpZGVvIFByb2dyYW0gSUQiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6IAluYW1lID0gIlN0cmVhbSBQQ1IgUHJvZ3JhbSBJRCI7IGJyZWFrOwotCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPOiBuYW1lID0gIlN0cmVhbSBQRVMgQXVkaW8gSUQiOyBicmVhazsKLQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTzogbmFtZSA9ICJTdHJlYW0gUEVTIFZpZGVvIElEIjsgYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOgluYW1lID0gIlN0cmVhbSBWQkkgRm9ybWF0IjsgYnJlYWs7Ci0KLQlkZWZhdWx0OgorCWlmIChuYW1lID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwotCX0KKwogCXN3aXRjaCAocWN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CkBAIC00MDcsNiArNDQxLDcgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQUMzX0JJVFJBVEU6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOgogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzoKQEAgLTQ5Myw3ICs1MjgsNyBAQAogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAogCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xLAotCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQzMsIDEsCiAJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIpOwogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCkBAIC01MTAsNiArNTQ1LDEzIEBACiAJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLLAogCQkJCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMyMEssIDEsCiAJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FBQ19CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDY0MDAsIDEsIDMyMDAwMDApOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19BQzNfQklUUkFURToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMkssCisJCQkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0MEssIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzM4NEspOwogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFOgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCiAJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPLApAQCAtNTM1LDcgKzU3Nyw3IEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCiAJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSwKLQkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLCAxLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzRfQVZDLCAxLAogCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIpOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CiAJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKQEAgLTU5NCwxMiArNjM2LDE3IEBACiBFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZCk7CiAKIC8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgYmFzZWQgb24gdGhlIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQKLSAgIHRoZSBtZW51LiBUaGUgcWN0cmwgcG9pbnRlciBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLiAqLworICAgdGhlIG1lbnUuIFRoZSBxY3RybCBwb2ludGVyIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGlnbm9yZWQuCisgICBJZiBtZW51X2l0ZW1zIGlzIE5VTEwsIHRoZW4gdGhlIG1lbnUgaXRlbXMgYXJlIHJldHJpZXZlZCB1c2luZworICAgdjRsMl9jdHJsX2dldF9tZW51LiAqLwogaW50IHY0bDJfY3RybF9xdWVyeV9tZW51KHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCiAJICAgICAgIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQogewogCWludCBpOwogCisJcW1lbnUtPnJlc2VydmVkID0gMDsKKwlpZiAobWVudV9pdGVtcyA9PSBOVUxMKQorCQltZW51X2l0ZW1zID0gdjRsMl9jdHJsX2dldF9tZW51KHFtZW51LT5pZCk7CiAJaWYgKG1lbnVfaXRlbXMgPT0gTlVMTCB8fAogCSAgICAocWN0cmwgJiYgKHFtZW51LT5pbmRleCA8IHFjdHJsLT5taW5pbXVtIHx8IHFtZW51LT5pbmRleCA+IHFjdHJsLT5tYXhpbXVtKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjA3LDExICs2NTQsMzEgQEAKIAlpZiAobWVudV9pdGVtc1tpXSA9PSBOVUxMIHx8IG1lbnVfaXRlbXNbaV1bMF0gPT0gJ1wwJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc25wcmludGYocW1lbnUtPm5hbWUsIHNpemVvZihxbWVudS0+bmFtZSksIG1lbnVfaXRlbXNbcW1lbnUtPmluZGV4XSk7Ci0JcW1lbnUtPnJlc2VydmVkID0gMDsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X21lbnUpOwogCisvKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnltZW51IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgdmFsaWQKKyAgIG1lbnUgaXRlbXMgKHRlcm1pbmF0ZWQgYnkgVjRMMl9DVFJMX01FTlVfSURTX0VORCkuCisgICBVc2UgdGhpcyBpZiB0aGVyZSBhcmUgJ2hvbGVzJyBpbiB0aGUgbGlzdCBvZiB2YWxpZCBtZW51IGl0ZW1zLiAqLworaW50IHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIGNvbnN0IHUzMiAqaWRzKQoreworCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zID0gdjRsMl9jdHJsX2dldF9tZW51KHFtZW51LT5pZCk7CisKKwlxbWVudS0+cmVzZXJ2ZWQgPSAwOworCWlmIChtZW51X2l0ZW1zID09IE5VTEwgfHwgaWRzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgqaWRzICE9IFY0TDJfQ1RSTF9NRU5VX0lEU19FTkQpIHsKKwkJaWYgKCppZHMrKyA9PSBxbWVudS0+aW5kZXgpIHsKKwkJCXNucHJpbnRmKHFtZW51LT5uYW1lLCBzaXplb2YocW1lbnUtPm5hbWUpLAorCQkJCSAgICAgICBtZW51X2l0ZW1zW3FtZW51LT5pbmRleF0pOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKTsKKwogLyogY3RybF9jbGFzc2VzIHBvaW50cyB0byBhbiBhcnJheSBvZiB1MzIgcG9pbnRlcnMsIHRoZSBsYXN0IGVsZW1lbnQgaXMKICAgIGEgTlVMTCBwb2ludGVyLiBFYWNoIHUzMiBhcnJheSBpcyBhIDAtdGVybWluYXRlZCBhcnJheSBvZiBjb250cm9sIElEcy4KICAgIEVhY2ggYXJyYXkgbXVzdCBiZSBzb3J0ZWQgbG93IHRvIGhpZ2ggYW5kIGJlbG9uZyB0byB0aGUgc2FtZSBjb250cm9sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2LmMKaW5kZXggMTU1ZmRlYy4uY2NkNjU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXYuYwpAQCAtNDIsNiArNDIsNyBAQAogCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBkZXYpOworCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHZmZC0+aW5kZXgpOwogfQogCkBAIC00OSw2ICs1MCw3IEBACiAJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGRldik7CisKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlLipzXG4iLCAoaW50KXNpemVvZih2ZmQtPm5hbWUpLCB2ZmQtPm5hbWUpOwogfQogCkBAIC01OCwxMiArNjAsMTYgQEAKIAlfX0FUVFJfTlVMTAogfTsKIAorLyoKKyAqCUFjdGl2ZSBkZXZpY2VzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZpY2VbVklERU9fTlVNX0RFVklDRVNdOworc3RhdGljIERFRklORV9NVVRFWCh2aWRlb2Rldl9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX0JJVE1BUCh2aWRlb19udW1zW1ZGTF9UWVBFX01BWF0sIFZJREVPX05VTV9ERVZJQ0VTKTsKKwogc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2aWNlX2FsbG9jKHZvaWQpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOwotCi0JdmZkID0ga3phbGxvYyhzaXplb2YoKnZmZCksIEdGUF9LRVJORUwpOwotCXJldHVybiB2ZmQ7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fZGV2aWNlX2FsbG9jKTsKIApAQCAtNzMsMTYgKzc5LDUyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHZpZGVvX2RldmljZV9yZWxlYXNlKTsKIAordm9pZCB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpCit7CisJLyogRG8gbm90aGluZyAqLworCS8qIE9ubHkgdmFsaWQgd2hlbiB0aGUgdmlkZW9fZGV2aWNlIHN0cnVjdCBpcyBhIHN0YXRpYy4gKi8KK30KK0VYUE9SVF9TWU1CT0wodmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHkpOworCisvKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGlzIGdvbmUuICovCitzdGF0aWMgdm9pZCB2NGwyX2NoYXJkZXZfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHZpZGVvX2RldmljZSwgY2Rldi5rb2JqKTsKKworCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOworCWlmICh2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gIT0gdmZkKSB7CisJCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJLyogRnJlZSB1cCB0aGlzIGRldmljZSBmb3IgcmV1c2UgKi8KKwl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gPSBOVUxMOworCWNsZWFyX2JpdCh2ZmQtPm51bSwgdmlkZW9fbnVtc1t2ZmQtPnZmbF90eXBlXSk7CisJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKKworCS8qIFJlbGVhc2UgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KKwl2ZmQtPmNkZXZfcmVsZWFzZShrb2JqKTsKKwkvKiBSZWxlYXNlIHZpZGVvX2RldmljZSBhbmQgcGVyZm9ybSBvdGhlcgorCSAgIGNsZWFudXBzIGFzIG5lZWRlZC4gKi8KKwlpZiAodmZkLT5yZWxlYXNlKQorCQl2ZmQtPnJlbGVhc2UodmZkKTsKK30KKworLyogVGhlIG5ldyBrb2JqX3R5cGUgZm9yIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB2NGwyX2t0eXBlX2NkZXZfZGVmYXVsdCA9IHsKKwkucmVsZWFzZSA9IHY0bDJfY2hhcmRldl9yZWxlYXNlLAorfTsKKwogc3RhdGljIHZvaWQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpjZCkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsIGRldik7CiAKLSNpZiAxCi0JLyogbmVlZGVkIHVudGlsIGFsbCBkcml2ZXJzIGFyZSBmaXhlZCAqLwotCWlmICghdmZkLT5yZWxlYXNlKQotCQlyZXR1cm47Ci0jZW5kaWYKLQl2ZmQtPnJlbGVhc2UodmZkKTsKKwkvKiBJdCdzIG5vdyBzYWZlIHRvIGRlbGV0ZSB0aGUgY2hhciBkZXZpY2UuCisJICAgVGhpcyB3aWxsIGVpdGhlciB0cmlnZ2VyIHRoZSB2NGwyX2NoYXJkZXZfcmVsZWFzZSBpbW1lZGlhdGVseSAoaWYKKwkgICB0aGUgcmVmY291bnQgZ29lcyB0byAwKSBvciBsYXRlciB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgdGhlCisJICAgY2hhcmFjdGVyIGRldmljZSBjbG9zZXMgaXQuICovCisJY2Rldl9kZWwoJnZmZC0+Y2Rldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgdmlkZW9fY2xhc3MgPSB7CkBAIC05MSw4NyArMTMzLDEyIEBACiAJLmRldl9yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKIH07CiAKLS8qCi0gKglBY3RpdmUgZGV2aWNlcwotICovCi0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZpY2VbVklERU9fTlVNX0RFVklDRVNdOwotc3RhdGljIERFRklORV9NVVRFWCh2aWRlb2Rldl9sb2NrKTsKLQogc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gdmlkZW9fZGV2aWNlW2ltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKV07CiB9CiBFWFBPUlRfU1lNQk9MKHZpZGVvX2RldmRhdGEpOwogCi0vKgotICoJT3BlbiBhIHZpZGVvIGRldmljZSAtIEZJWE1FOiBPYnNvbGV0ZWQKLSAqLwotc3RhdGljIGludCB2aWRlb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmZsOwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOwotCi0JaWYgKG1pbm9yID49IFZJREVPX05VTV9ERVZJQ0VTKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlsb2NrX2tlcm5lbCgpOwotCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwotCXZmbCA9IHZpZGVvX2RldmljZVttaW5vcl07Ci0JaWYgKHZmbCA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JCXJlcXVlc3RfbW9kdWxlKCJjaGFyLW1ham9yLSVkLSVkIiwgVklERU9fTUFKT1IsIG1pbm9yKTsKLQkJbXV0ZXhfbG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JCXZmbCA9IHZpZGVvX2RldmljZVttaW5vcl07Ci0JCWlmICh2ZmwgPT0gTlVMTCkgewotCQkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKLQkJCXVubG9ja19rZXJuZWwoKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCW9sZF9mb3BzID0gZmlsZS0+Zl9vcDsKLQlmaWxlLT5mX29wID0gZm9wc19nZXQodmZsLT5mb3BzKTsKLQlpZiAoZmlsZS0+Zl9vcC0+b3BlbikKLQkJZXJyID0gZmlsZS0+Zl9vcC0+b3Blbihpbm9kZSwgZmlsZSk7Ci0JaWYgKGVycikgewotCQlmb3BzX3B1dChmaWxlLT5mX29wKTsKLQkJZmlsZS0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKLQl9Ci0JZm9wc19wdXQob2xkX2ZvcHMpOwotCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBvcGVuL3JlbGVhc2UgaGVscGVyIGZ1bmN0aW9ucyAtLSBoYW5kbGUgZXhjbHVzaXZlIG9wZW5zCi0gKiBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCi0gKi8KLWludCB2aWRlb19leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmwgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCWludCByZXR2YWwgPSAwOwotCi0JbXV0ZXhfbG9jaygmdmZsLT5sb2NrKTsKLQlpZiAodmZsLT51c2VycykKLQkJcmV0dmFsID0gLUVCVVNZOwotCWVsc2UKLQkJdmZsLT51c2VycysrOwotCW11dGV4X3VubG9jaygmdmZsLT5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotRVhQT1JUX1NZTUJPTCh2aWRlb19leGNsdXNpdmVfb3Blbik7Ci0KLWludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmwgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCi0JdmZsLT51c2Vycy0tOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh2aWRlb19leGNsdXNpdmVfcmVsZWFzZSk7Ci0KIC8qKgogICogZ2V0X2luZGV4IC0gYXNzaWduIHN0cmVhbSBudW1iZXIgYmFzZWQgb24gcGFyZW50IGRldmljZQogICogQHZkZXY6IHZpZGVvX2RldmljZSB0byBhc3NpZ24gaW5kZXggbnVtYmVyIHRvLCB2ZGV2LT5kZXYgc2hvdWxkIGJlIGFzc2lnbmVkCkBAIC0yNTIsMzMgKzIxOSwyOSBAQAogCQkJCQlpbnQgaW5kZXgpCiB7CiAJaW50IGkgPSAwOwotCWludCBiYXNlOwotCWludCBlbmQ7CiAJaW50IHJldDsKLQljaGFyICpuYW1lX2Jhc2U7CisJaW50IG1pbm9yX29mZnNldCA9IDA7CisJaW50IG1pbm9yX2NudCA9IFZJREVPX05VTV9ERVZJQ0VTOworCWNvbnN0IGNoYXIgKm5hbWVfYmFzZTsKKwl2b2lkICpwcml2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmZkKTsKKworCS8qIHRoZSByZWxlYXNlIGNhbGxiYWNrIE1VU1QgYmUgcHJlc2VudCAqLworCUJVR19PTighdmZkLT5yZWxlYXNlKTsKIAogCWlmICh2ZmQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6Ci0JCWJhc2UgPSBNSU5PUl9WRkxfVFlQRV9HUkFCQkVSX01JTjsKLQkJZW5kID0gTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NQVgrMTsKIAkJbmFtZV9iYXNlID0gInZpZGVvIjsKIAkJYnJlYWs7CiAJY2FzZSBWRkxfVFlQRV9WVFg6Ci0JCWJhc2UgPSBNSU5PUl9WRkxfVFlQRV9WVFhfTUlOOwotCQllbmQgPSBNSU5PUl9WRkxfVFlQRV9WVFhfTUFYKzE7CiAJCW5hbWVfYmFzZSA9ICJ2dHgiOwogCQlicmVhazsKIAljYXNlIFZGTF9UWVBFX1ZCSToKLQkJYmFzZSA9IE1JTk9SX1ZGTF9UWVBFX1ZCSV9NSU47Ci0JCWVuZCA9IE1JTk9SX1ZGTF9UWVBFX1ZCSV9NQVgrMTsKIAkJbmFtZV9iYXNlID0gInZiaSI7CiAJCWJyZWFrOwogCWNhc2UgVkZMX1RZUEVfUkFESU86Ci0JCWJhc2UgPSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU47Ci0JCWVuZCA9IE1JTk9SX1ZGTF9UWVBFX1JBRElPX01BWCsxOwogCQluYW1lX2Jhc2UgPSAicmFkaW8iOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjg3LDI4ICsyNTAsNzAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJdmZkLT52ZmxfdHlwZSA9IHR5cGU7CisKKyNpZmRlZiBDT05GSUdfVklERU9fRklYRURfTUlOT1JfUkFOR0VTCisJLyogS2VlcCB0aGUgcmFuZ2VzIGZvciB0aGUgZmlyc3QgZm91ciB0eXBlcyBmb3IgaGlzdG9yaWNhbAorCSAqIHJlYXNvbnMuCisJICogTmV3ZXIgZGV2aWNlcyAobm90IHlldCBpbiBwbGFjZSkgc2hvdWxkIHVzZSB0aGUgcmFuZ2UKKwkgKiBvZiAxMjgtMTkxIGFuZCBqdXN0IHBpY2sgdGhlIGZpcnN0IGZyZWUgbWlub3IgdGhlcmUKKwkgKiAobmV3IHN0eWxlKS4gKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CisJCW1pbm9yX29mZnNldCA9IDA7CisJCW1pbm9yX2NudCA9IDY0OworCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1JBRElPOgorCQltaW5vcl9vZmZzZXQgPSA2NDsKKwkJbWlub3JfY250ID0gNjQ7CisJCWJyZWFrOworCWNhc2UgVkZMX1RZUEVfVlRYOgorCQltaW5vcl9vZmZzZXQgPSAxOTI7CisJCW1pbm9yX2NudCA9IDMyOworCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1ZCSToKKwkJbWlub3Jfb2Zmc2V0ID0gMjI0OworCQltaW5vcl9jbnQgPSAzMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWlub3Jfb2Zmc2V0ID0gMTI4OworCQltaW5vcl9jbnQgPSA2NDsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJY2Rldl9pbml0KCZ2ZmQtPmNkZXYsIHZmZC0+Zm9wcyk7CisJdmZkLT5jZGV2Lm93bmVyID0gdmZkLT5mb3BzLT5vd25lcjsKIAkvKiBwaWNrIGEgbWlub3IgbnVtYmVyICovCiAJbXV0ZXhfbG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JaWYgKG5yID49IDAgICYmICBuciA8IGVuZC1iYXNlKSB7Ci0JCS8qIHVzZSB0aGUgb25lIHRoZSBkcml2ZXIgYXNrZWQgZm9yICovCi0JCWkgPSBiYXNlICsgbnI7Ci0JCWlmIChOVUxMICE9IHZpZGVvX2RldmljZVtpXSkgewotCQkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKLQkJCXJldHVybiAtRU5GSUxFOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdXNlIGZpcnN0IGZyZWUgKi8KLQkJZm9yIChpID0gYmFzZTsgaSA8IGVuZDsgaSsrKQotCQkJaWYgKE5VTEwgPT0gdmlkZW9fZGV2aWNlW2ldKQotCQkJCWJyZWFrOwotCQlpZiAoaSA9PSBlbmQpIHsKLQkJCW11dGV4X3VubG9jaygmdmlkZW9kZXZfbG9jayk7Ci0JCQlyZXR1cm4gLUVORklMRTsKLQkJfQorCW5yID0gZmluZF9uZXh0X3plcm9fYml0KHZpZGVvX251bXNbdHlwZV0sIG1pbm9yX2NudCwgbnIgPT0gLTEgPyAwIDogbnIpOworCWlmIChuciA9PSBtaW5vcl9jbnQpCisJCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCh2aWRlb19udW1zW3R5cGVdLCBtaW5vcl9jbnQpOworCWlmIChuciA9PSBtaW5vcl9jbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgZ2V0IGEgZnJlZSBrZXJuZWwgbnVtYmVyXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKKwkJcmV0dXJuIC1FTkZJTEU7CiAJfQotCXZpZGVvX2RldmljZVtpXSA9IHZmZDsKLQl2ZmQtPnZmbF90eXBlID0gdHlwZTsKLQl2ZmQtPm1pbm9yID0gaTsKKyNpZmRlZiBDT05GSUdfVklERU9fRklYRURfTUlOT1JfUkFOR0VTCisJLyogMS1vbi0xIG1hcHBpbmcgb2Yga2VybmVsIG51bWJlciB0byBtaW5vciBudW1iZXIgKi8KKwlpID0gbnI7CisjZWxzZQorCS8qIFRoZSBrZXJuZWwgbnVtYmVyIGFuZCBtaW5vciBudW1iZXJzIGFyZSBpbmRlcGVuZGVudCAqLworCWZvciAoaSA9IDA7IGkgPCBWSURFT19OVU1fREVWSUNFUzsgaSsrKQorCQlpZiAodmlkZW9fZGV2aWNlW2ldID09IE5VTEwpCisJCQlicmVhazsKKwlpZiAoaSA9PSBWSURFT19OVU1fREVWSUNFUykgeworCQltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBnZXQgYSBmcmVlIG1pbm9yXG4iKTsKKwkJcmV0dXJuIC1FTkZJTEU7CisJfQorI2VuZGlmCisJdmZkLT5taW5vciA9IGkgKyBtaW5vcl9vZmZzZXQ7CisJdmZkLT5udW0gPSBucjsKKwlzZXRfYml0KG5yLCB2aWRlb19udW1zW3R5cGVdKTsKKwlCVUdfT04odmlkZW9fZGV2aWNlW3ZmZC0+bWlub3JdKTsKKwl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gPSB2ZmQ7CiAKIAlyZXQgPSBnZXRfaW5kZXgodmZkLCBpbmRleCk7CiAJdmZkLT5pbmRleCA9IHJldDsKQEAgLTMyMCwzNSArMzI1LDQxIEBACiAJCWdvdG8gZmFpbF9taW5vcjsKIAl9CiAKLQltdXRleF9pbml0KCZ2ZmQtPmxvY2spOwotCisJcmV0ID0gY2Rldl9hZGQoJnZmZC0+Y2RldiwgTUtERVYoVklERU9fTUFKT1IsIHZmZC0+bWlub3IpLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjZGV2X2FkZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsX21pbm9yOworCX0KIAkvKiBzeXNmcyBjbGFzcyAqLwotCW1lbXNldCgmdmZkLT5kZXYsIDB4MDAsIHNpemVvZih2ZmQtPmRldikpOworCW1lbXNldCgmdmZkLT5kZXYsIDAsIHNpemVvZih2ZmQtPmRldikpOworCS8qIFRoZSBtZW1zZXQgYWJvdmUgY2xlYXJlZCB0aGUgZGV2aWNlJ3MgZHJ2ZGF0YSwgc28KKwkgICBwdXQgYmFjayB0aGUgY29weSB3ZSBtYWRlIGVhcmxpZXIuICovCisJdmlkZW9fc2V0X2RydmRhdGEodmZkLCBwcml2KTsKIAl2ZmQtPmRldi5jbGFzcyA9ICZ2aWRlb19jbGFzczsKIAl2ZmQtPmRldi5kZXZ0ID0gTUtERVYoVklERU9fTUFKT1IsIHZmZC0+bWlub3IpOwogCWlmICh2ZmQtPnBhcmVudCkKIAkJdmZkLT5kZXYucGFyZW50ID0gdmZkLT5wYXJlbnQ7Ci0Jc3ByaW50Zih2ZmQtPmRldi5idXNfaWQsICIlcyVkIiwgbmFtZV9iYXNlLCBpIC0gYmFzZSk7CisJc3ByaW50Zih2ZmQtPmRldi5idXNfaWQsICIlcyVkIiwgbmFtZV9iYXNlLCBucik7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZmQtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWxfbWlub3I7CisJCWdvdG8gZGVsX2NkZXY7CiAJfQotCi0jaWYgMQotCS8qIG5lZWRlZCB1bnRpbCBhbGwgZHJpdmVycyBhcmUgZml4ZWQgKi8KLQlpZiAoIXZmZC0+cmVsZWFzZSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9kZXY6IFwiJXNcIiBoYXMgbm8gcmVsZWFzZSBjYWxsYmFjay4gIgotCQkgICAgICAgIlBsZWFzZSBmaXggeW91ciBkcml2ZXIgZm9yIHByb3BlciBzeXNmcyBzdXBwb3J0LCBzZWUgIgotCQkgICAgICAgImh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzM2ODUwL1xuIiwgdmZkLT5uYW1lKTsKLSNlbmRpZgorCS8qIFJlbWVtYmVyIHRoZSBjZGV2J3MgcmVsZWFzZSBmdW5jdGlvbiAqLworCXZmZC0+Y2Rldl9yZWxlYXNlID0gdmZkLT5jZGV2LmtvYmoua3R5cGUtPnJlbGVhc2U7CisJLyogSW5zdGFsbCBvdXIgb3duICovCisJdmZkLT5jZGV2LmtvYmoua3R5cGUgPSAmdjRsMl9rdHlwZV9jZGV2X2RlZmF1bHQ7CiAJcmV0dXJuIDA7CiAKK2RlbF9jZGV2OgorCWNkZXZfZGVsKCZ2ZmQtPmNkZXYpOworCiBmYWlsX21pbm9yOgogCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwogCXZpZGVvX2RldmljZVt2ZmQtPm1pbm9yXSA9IE5VTEw7Ci0JdmZkLT5taW5vciA9IC0xOworCWNsZWFyX2JpdCh2ZmQtPm51bSwgdmlkZW9fbnVtc1t0eXBlXSk7CiAJbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKKwl2ZmQtPm1pbm9yID0gLTE7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fcmVnaXN0ZXJfZGV2aWNlX2luZGV4KTsKQEAgLTM2Myw0MiArMzc0LDI5IEBACiAKIHZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQogewotCW11dGV4X2xvY2soJnZpZGVvZGV2X2xvY2spOwotCWlmICh2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gIT0gdmZkKQotCQlwYW5pYygidmlkZW9kZXY6IGJhZCB1bnJlZ2lzdGVyIik7Ci0KLQl2aWRlb19kZXZpY2VbdmZkLT5taW5vcl0gPSBOVUxMOwogCWRldmljZV91bnJlZ2lzdGVyKCZ2ZmQtPmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZ2aWRlb2Rldl9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0wodmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UpOwogCiAvKgotICogVmlkZW8gZnMgb3BlcmF0aW9ucwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkub3BlbgkJPSB2aWRlb19vcGVuLAotfTsKLQotLyoKICAqCUluaXRpYWxpc2UgdmlkZW8gZm9yIGxpbnV4CiAgKi8KLQogc3RhdGljIGludCBfX2luaXQgdmlkZW9kZXZfaW5pdCh2b2lkKQogeworCWRldl90IGRldiA9IE1LREVWKFZJREVPX01BSk9SLCAwKTsKIAlpbnQgcmV0OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTGludXggdmlkZW8gY2FwdHVyZSBpbnRlcmZhY2U6IHYyLjAwXG4iKTsKLQlpZiAocmVnaXN0ZXJfY2hyZGV2KFZJREVPX01BSk9SLCBWSURFT19OQU1FLCAmdmlkZW9fZm9wcykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9fZGV2OiB1bmFibGUgdG8gZ2V0IG1ham9yICVkXG4iLCBWSURFT19NQUpPUik7Ci0JCXJldHVybiAtRUlPOworCXJldCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBWSURFT19OVU1fREVWSUNFUywgVklERU9fTkFNRSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidmlkZW9kZXY6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsCisJCQkJVklERU9fTUFKT1IpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZ2aWRlb19jbGFzcyk7CiAJaWYgKHJldCA8IDApIHsKLQkJdW5yZWdpc3Rlcl9jaHJkZXYoVklERU9fTUFKT1IsIFZJREVPX05BTUUpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBWSURFT19OVU1fREVWSUNFUyk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvX2RldjogY2xhc3NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNDA4LDggKzQwNiwxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmlkZW9kZXZfZXhpdCh2b2lkKQogeworCWRldl90IGRldiA9IE1LREVWKFZJREVPX01BSk9SLCAwKTsKKwogCWNsYXNzX3VucmVnaXN0ZXIoJnZpZGVvX2NsYXNzKTsKLQl1bnJlZ2lzdGVyX2NocmRldihWSURFT19NQUpPUiwgVklERU9fTkFNRSk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgVklERU9fTlVNX0RFVklDRVMpOwogfQogCiBtb2R1bGVfaW5pdCh2aWRlb2Rldl9pbml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwppbmRleCAxNDBlZjkyLi4xNTVjOWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtNzQ2LDE4ICs3NDYsNiBAQAogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdmVybGF5KGZpbGUsCiAJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwotI2lmIDEKLQkJLyogVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSBzaG91bGQgbm90IHN1cHBvcnQgVklESU9DX0VOVU1fRk1UCi0JCSAqIGFjY29yZGluZyB0byB0aGUgc3BlYy4gVGhlIGJ0dHYgYW5kIHNhYTcxMzQgZHJpdmVycyBzdXBwb3J0Ci0JCSAqIGl0IHRob3VnaCwgc28ganVzdCB3YXJuIHRoYXQgdGhpcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlCi0JCSAqIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLiAqLwotCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmJpX2NhcCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGlvY19lbnVtX2ZtdF92YmlfY2FwIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjYuMjghXG4iKTsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF92YmlfY2FwKGZpbGUsIGZoLCBmKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CiAJCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dCkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0KGZpbGUsIGZoLCBmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKaW5kZXggMWVkZGE0NS4uMWVmYzVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKQEAgLTMwLDE2ICszMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotI2lmZGVmIENPTkZJR19LTU9ECiAjaW5jbHVkZSA8bGludXgva21vZC5oPgotI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1zZ2kuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CkBAIC04MTAsNyArODA2LDcgQEAKIAlkcHJpbnRrKCJ2aW5vX2ZyZWVfYnVmZmVyX3dpdGhfY291bnQoKTogY291bnQgPSAlZFxuIiwgY291bnQpOwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pKTsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKCh2b2lkICopZmItPmRlc2NfdGFibGUudmlydHVhbFtpXSkpOwogCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsCiAJCQkJIGZiLT5kZXNjX3RhYmxlLmRtYV9jcHVbVklOT19QQUdFX1JBVElPICogaV0sCiAJCQkJIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKQEAgLTg4OCw3ICs4ODQsNyBAQAogCQkJCWRtYV9kYXRhX2FkZHIgKyBWSU5PX1BBR0VfU0laRSAqIGo7CiAJCX0KIAotCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pKTsKKwkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZSgodm9pZCAqKWZiLT5kZXNjX3RhYmxlLnZpcnR1YWxbaV0pKTsKIAl9CiAKIAkvKiBwYWdlX2NvdW50IG5lZWRzIHRvIGJlIHNldCBhbnl3YXksIGJlY2F1c2UgdGhlIGRlc2NyaXB0b3IgdGFibGUgaGFzCkBAIC05NzUsNyArOTcxLDcgQEAKIAkJCQlkbWFfZGF0YV9hZGRyICsgVklOT19QQUdFX1NJWkUgKiBqOwogCQl9CiAKLQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSk7CisJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoKHZvaWQgKilmYi0+ZGVzY190YWJsZS52aXJ0dWFsW2ldKSk7CiAJfQogCiAJLyogcGFnZV9jb3VudCBuZWVkcyB0byBiZSBzZXQgYW55d2F5LCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIHRhYmxlIGhhcwpAQCAtNDAyNSw4ICs0MDIxLDcgQEAKIAogc3RhdGljIGludCB2aW5vX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3Qgdmlub19jaGFubmVsX3NldHRpbmdzICp2Y3MgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldCA9IDA7CiAJZHByaW50aygib3BlbigpOiBjaGFubmVsID0gJWNcbiIsCiAJICAgICAgICh2Y3MtPmNoYW5uZWwgPT0gVklOT19DSEFOTkVMX0EpID8gJ0EnIDogJ0InKTsKQEAgLTQwNTcsOCArNDA1Miw3IEBACiAKIHN0YXRpYyBpbnQgdmlub19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlkcHJpbnRrKCJjbG9zZSgpOlxuIik7CiAKIAltdXRleF9sb2NrKCZ2Y3MtPm11dGV4KTsKQEAgLTQxMDEsOCArNDA5NSw3IEBACiAKIHN0YXRpYyBpbnQgdmlub19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKQEAgLTQyMDcsOCArNDIwMCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmlub19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwdCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAl1bnNpZ25lZCBpbnQgb3V0Z29pbmc7CiAJdW5zaWduZWQgaW50IHJldCA9IDA7CiAKQEAgLTQyNDgsOCArNDI0MCw3IEBACiBzdGF0aWMgaW50IHZpbm9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAogI2lmZGVmIFZJTk9fREVCVUcKIAlzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CkBAIC00MzU2LDggKzQzNDcsNyBAQAogc3RhdGljIGludCB2aW5vX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB2aW5vX2NoYW5uZWxfc2V0dGluZ3MgKnZjcyA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHZpbm9fY2hhbm5lbF9zZXR0aW5ncyAqdmNzID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0OwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdmNzLT5tdXRleCkpCkBAIC00NjQxLDcgKzQ2MzEsNyBAQAogCX0KIAl2aW5vX2luaXRfc3RhZ2UrKzsKIAotI2lmIGRlZmluZWQoQ09ORklHX0tNT0QpICYmIGRlZmluZWQoTU9EVUxFKQorI2lmZGVmIE1PRFVMRQogCXJlcXVlc3RfbW9kdWxlKCJzYWE3MTkxIik7CiAJcmVxdWVzdF9tb2R1bGUoImluZHljYW0iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCA4YmE4ZGFhLi42NWM4YWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtODk4LDkgKzg5OCwxMSBAQAogCiAJcHJpbnRrKEtFUk5fREVCVUcgInZpdmk6IG9wZW4gY2FsbGVkIChtaW5vcj0lZClcbiIsIG1pbm9yKTsKIAorCWxvY2tfa2VybmVsKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ2aXZpX2Rldmxpc3QsIHZpdmlfZGV2bGlzdCkKIAkJaWYgKGRldi0+dmZkLT5taW5vciA9PSBtaW5vcikKIAkJCWdvdG8gZm91bmQ7CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAtRU5PREVWOwogCiBmb3VuZDoKQEAgLTkyNSw4ICs5MjcsMTAgQEAKIAl9CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKLQlpZiAocmV0dmFsKQorCWlmIChyZXR2YWwpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCWZoLT5kZXYgICAgICA9IGRldjsKQEAgLTk1NSw2ICs5NTksNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB2aXZpX2J1ZmZlciksIGZoKTsKIAogCXZpdmlfc3RhcnRfdGhyZWFkKGZoKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKaW5kZXggMzUyOTMwMjkuLjQ1YmU5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jCkBAIC0yNCw4ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgotCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCmluZGV4IDJmZjAwYmMuLmIyZGJlNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKQEAgLTExMyw2ICsxMTMsNyBAQAogCXNpZ25lZCBjaGFyIGNvbnRyYXN0OwogCXNpZ25lZCBjaGFyIGNvbG9yOwogCXNpZ25lZCBjaGFyIGh1ZTsKKwl1bnNpZ25lZCBsb25nIGluX3VzZTsKIH07CiAKIC8qCkBAIC0xODQsMTAgKzE4NSwyNSBAQAogc3RhdGljIHNzaXplX3Qgdzk5NjZfdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CiAKK3N0YXRpYyBpbnQgdzk5NjZfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHc5OTY2X2RldiAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KDAsICZjYW0tPmluX3VzZSkgPyAtRUJVU1kgOiAwOworfQorCitzdGF0aWMgaW50IHc5OTY2X2V4Y2x1c2l2ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB3OTk2Nl9kZXYgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwljbGVhcl9iaXQoMCwgJmNhbS0+aW5fdXNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdzk5NjZfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCisJLm9wZW4gICAgICAgICAgID0gdzk5NjZfZXhjbHVzaXZlX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gdzk5NjZfZXhjbHVzaXZlX3JlbGVhc2UsCiAJLmlvY3RsICAgICAgICAgID0gdzk5NjZfdjRsX2lvY3RsLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLApAQCAtMTk4LDYgKzIxNCw3IEBACiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB3OTk2Nl90ZW1wbGF0ZSA9IHsKIAkubmFtZSAgICAgICAgICAgPSBXOTk2Nl9EUklWRVJOQU1FLAogCS5mb3BzICAgICAgICAgICA9ICZ3OTk2Nl9mb3BzLAorCS5yZWxlYXNlIAk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAogfTsKIAogLyoKQEAgLTMzMiw3ICszNDksNyBAQAogCiAvLyBGaWxsIGluIHRoZSB2aWRlb19kZXZpY2Ugc3RydWN0IGFuZCByZWdpc3RlciB1cyB0byB2NGwKIAltZW1jcHkoJmNhbS0+dmRldiwgJnc5OTY2X3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IHZpZGVvX2RldmljZSkpOwotCWNhbS0+dmRldi5wcml2ID0gY2FtOworCXZpZGVvX3NldF9kcnZkYXRhKCZjYW0tPnZkZXYsIGNhbSk7CiAKIAlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTcxMyw4ICs3MzAsNyBAQAogc3RhdGljIGludCB3OTk2Nl92NGxfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHc5OTY2X2RldiAqY2FtID0gdmRldi0+cHJpdjsKKwlzdHJ1Y3Qgdzk5NjZfZGV2ICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3dpdGNoKGNtZCkKIAl7CkBAIC04NzIsOCArODg4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHc5OTY2X3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICBfX3VzZXIgKmJ1ZiwKIAkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB3OTk2Nl9kZXYgKmNhbSA9IHZkZXYtPnByaXY7CisJc3RydWN0IHc5OTY2X2RldiAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAl1bnNpZ25lZCBjaGFyIGFkZHIgPSAweGEwOwkvLyBFQ1AsIHJlYWQsIENDRC10cmFuc2ZlciwgMDAwMDAKIAl1bnNpZ25lZCBjaGFyIF9fdXNlciAqZGVzdCA9ICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWJ1ZjsKIAl1bnNpZ25lZCBsb25nIGRsZWZ0ID0gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2YuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCmluZGV4IDE2OGJhYWIuLmRjZDQ1ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBwYXJhbV9udlsyNF07IC8qIG51bWJlciBvZiB2YWx1ZXMgcGVyIHBhcmFtZXRlciAqLwogCi0jaWZkZWYgQ09ORklHX0tNT0QKKyNpZmRlZiBDT05GSUdfTU9EVUxFUwogbW9kdWxlX3BhcmFtKG92bW9kX2xvYWQsIGJvb2wsIDA2NDQpOwogI2VuZGlmCiBtb2R1bGVfcGFyYW0oc2ltY2FtcywgdXNob3J0LCAwNjQ0KTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogbW9kdWxlX3BhcmFtKHNwZWNpZmljX2RlYnVnLCBib29sLCAwNjQ0KTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0tNT0QKKyNpZmRlZiBDT05GSUdfTU9EVUxFUwogTU9EVUxFX1BBUk1fREVTQyhvdm1vZF9sb2FkLAogCQkgIlxuPDB8MT4gQXV0b21hdGljICdvdmNhbWNoaXAnIG1vZHVsZSBsb2FkaW5nLiIKIAkJICJcbjAgZGlzYWJsZWQsIDEgZW5hYmxlZC4iCkBAIC05MTEsNyArOTExLDYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBXOTk2OENGX1VSQlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFc5OTY4Q0ZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOwotCQljYW0tPnVyYltpXSA9IHVyYjsKIAkJaWYgKCF1cmIpIHsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAJCQkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2pdKTsKQEAgLTkxOSw2ICs5MTgsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQljYW0tPnVyYltpXSA9IHVyYjsKIAkJdXJiLT5kZXYgPSB1ZGV2OwogCQl1cmItPmNvbnRleHQgPSAodm9pZCopY2FtOwogCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodWRldiwgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODczOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93bTg3MzkuYwppbmRleCA5NWM3OWFkLi41NGFjM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODczOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204NzM5LmMKQEAgLTI3NCwxMCArMjc0LDggQEAKIAkJCWNsaWVudC0+YWRkciA8PCAxLCBjbGllbnQtPmFkYXB0ZXItPm5hbWUpOwogCiAJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzM5X3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJa2ZyZWUoY2xpZW50KTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXN0YXRlLT52b2xfbCA9IDB4MTc7IC8qIDBkQiAqLwogCXN0YXRlLT52b2xfciA9IDB4MTc7IC8qIDBkQiAqLwogCXN0YXRlLT5tdXRlZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYwppbmRleCAwYzMyODc3Li42YTA5MDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKQEAgLTY1Nyw3ICs2NTcsNyBAQAogCWlmICghZG93bl9yZWFkX3RyeWxvY2soJnpjMDMwMV9kZXZfbG9jaykpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmNhbS0+cHJvYmUpKSB7CiAJCXVwX3JlYWQoJnpjMDMwMV9kZXZfbG9jayk7CkBAIC03MzksNyArNzM5LDcgQEAKIAogCWRvd25fd3JpdGUoJnpjMDMwMV9kZXZfbG9jayk7CiAKLQljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwljYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCiAJemMwMzAxX3N0b3BfdHJhbnNmZXIoY2FtKTsKIAl6YzAzMDFfcmVsZWFzZV9idWZmZXJzKGNhbSk7CkBAIC03NTksNyArNzU5LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiB6YzAzMDFfcmVhZChzdHJ1Y3QgZmlsZSogZmlscCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90KiBmX3BvcykKIHsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IHpjMDMwMV9kZXZpY2UgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7CiAJc3RydWN0IHpjMDMwMV9mcmFtZV90KiBmLCAqIGk7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCWxvbmcgdGltZW91dDsKQEAgLTg2Niw3ICs4NjYsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHpjMDMwMV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgemMwMzAxX2ZyYW1lX3QqIGY7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKQEAgLTk0MSw3ICs5NDEsNyBAQAogCiBzdGF0aWMgaW50IHpjMDMwMV9tbWFwKHN0cnVjdCBmaWxlKiBmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxwKSk7CisJc3RydWN0IHpjMDMwMV9kZXZpY2UgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAogCQkgICAgICBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CiAJdm9pZCAqcG9zOwpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKIHN0YXRpYyBpbnQgemMwMzAxX2lvY3RsX3Y0bDIoc3RydWN0IGlub2RlKiBpbm9kZSwgc3RydWN0IGZpbGUqIGZpbHAsCiAJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQogewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAogCXN3aXRjaCAoY21kKSB7CiAKQEAgLTE4OTEsNyArMTg5MSw3IEBACiBzdGF0aWMgaW50IHpjMDMwMV9pb2N0bChzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlscCwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbHApKTsKKwlzdHJ1Y3QgemMwMzAxX2RldmljZSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNhbS0+ZmlsZW9wX211dGV4KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE1ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi9LY29uZmlnCkBAIC0wLDAgKzEsNzMgQEAKK2NvbmZpZyBWSURFT19aT1JBTgorCXRyaXN0YXRlICJab3JhbiBaUjM2MDU3LzM2MDY3IFZpZGVvIEZvciBMaW51eCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBJMkNfQUxHT0JJVCAmJiBWSURFT19WNEwxICYmIFZJUlRfVE9fQlVTCisJaGVscAorCSAgU2F5IFkgZm9yIHN1cHBvcnQgZm9yIE1KUEVHIGNhcHR1cmUgY2FyZHMgYmFzZWQgb24gdGhlIFpvcmFuCisJICAzNjA1Ny8zNjA2NyBQQ0kgY29udHJvbGxlciBjaGlwc2V0LiBUaGlzIGluY2x1ZGVzIHRoZSBJb21lZ2EKKwkgIEJ1eiwgUGlubmFjbGUgREMxMCsgYW5kIHRoZSBMaW51eCBNZWRpYSBMYWJzIExNTDMzLiBUaGVyZSBpcworCSAgYSBkcml2ZXIgaG9tZXBhZ2UgYXQgPGh0dHA6Ly9tanBlZy5zZi5uZXQvZHJpdmVyLXpvcmFuLz4uIEZvcgorCSAgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3Jhbj4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpyMzYwNjcuCisKK2NvbmZpZyBWSURFT19aT1JBTl9EQzMwCisJdHJpc3RhdGUgIlBpbm5hY2xlL01pcm8gREMzMCgrKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU4KKwlzZWxlY3QgVklERU9fQURWNzE3NSBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTworCXNlbGVjdCBWSURFT19WUFgzMjIwIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFBpbm5hY2xlL01pcm8gREMzMCgrKSBNSlBFRyBjYXB0dXJlL3BsYXliYWNrCisJICBjYXJkLiBUaGlzIGFsc28gc3VwcG9ydHMgcmVhbGx5IG9sZCBEQzEwIGNhcmRzIGJhc2VkIG9uIHRoZQorCSAgenIzNjA1MCBNSlBFRyBjb2RlYyBhbmQgenIzNjAxNiBWRkUuCisKK2NvbmZpZyBWSURFT19aT1JBTl9aUjM2MDYwCisJdHJpc3RhdGUgIlpvcmFuIFpSMzYwNjAiCisJZGVwZW5kcyBvbiBWSURFT19aT1JBTgorCWhlbHAKKwkgIFNheSBZIHRvIHN1cHBvcnQgWm9yYW4gYm9hcmRzIGJhc2VkIG9uIDM2MDYwIGNoaXBzLgorCSAgVGhpcyBpbmNsdWRlcyBJb21lZ2EgQnV6LCBQaW5uYWNsZSBEQzEwLCBMaW51eCBtZWRpYSBMYWJzIDMzCisJICBhbmQgMzMgUjEwIGFuZCBBdmVyTWVkaWEgNiBib2FyZHMuCisKK2NvbmZpZyBWSURFT19aT1JBTl9CVVoKKwl0cmlzdGF0ZSAiSW9tZWdhIEJ1eiBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU5fWlIzNjA2MAorCXNlbGVjdCBWSURFT19TQUE3MTExIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJc2VsZWN0IFZJREVPX1NBQTcxODUgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSW9tZWdhIEJ1eiBNSlBFRyBjYXB0dXJlL3BsYXliYWNrIGNhcmQuCisKK2NvbmZpZyBWSURFT19aT1JBTl9EQzEwCisJdHJpc3RhdGUgIlBpbm5hY2xlL01pcm8gREMxMCgrKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fWk9SQU5fWlIzNjA2MAorCXNlbGVjdCBWSURFT19TQUE3MTEwIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJc2VsZWN0IFZJREVPX0FEVjcxNzUgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgUGlubmFjbGUvTWlybyBEQzEwKCspIE1KUEVHIGNhcHR1cmUvcGxheWJhY2sKKwkgIGNhcmQuCisKK2NvbmZpZyBWSURFT19aT1JBTl9MTUwzMworCXRyaXN0YXRlICJMaW51eCBNZWRpYSBMYWJzIExNTDMzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19aT1JBTl9aUjM2MDYwCisJc2VsZWN0IFZJREVPX0JUODE5IGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJc2VsZWN0IFZJREVPX0JUODU2IGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIExpbnV4IE1lZGlhIExhYnMgTE1MMzMgTUpQRUcgY2FwdHVyZS9wbGF5YmFjaworCSAgY2FyZC4KKworY29uZmlnIFZJREVPX1pPUkFOX0xNTDMzUjEwCisJdHJpc3RhdGUgIkxpbnV4IE1lZGlhIExhYnMgTE1MMzNSMTAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX1pPUkFOX1pSMzYwNjAKKwlzZWxlY3QgVklERU9fU0FBNzExNCBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTworCXNlbGVjdCBWSURFT19BRFY3MTcwIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJaGVscAorCSAgc3VwcG9ydCBmb3IgdGhlIExpbnV4IE1lZGlhIExhYnMgTE1MMzNSMTAgTUpQRUcgY2FwdHVyZS9wbGF5YmFjaworCSAgY2FyZC4KKworY29uZmlnIFZJREVPX1pPUkFOX0FWUzZFWUVTCisJdHJpc3RhdGUgIkF2ZXJNZWRpYSA2IEV5ZXMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFZJREVPX1pPUkFOX1pSMzYwNjAgJiYgRVhQRVJJTUVOVEFMICYmIFZJREVPX1Y0TDEKKwlzZWxlY3QgVklERU9fQlQ4NTYgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KKwlzZWxlY3QgVklERU9fS1MwMTI3IGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIEF2ZXJNZWRpYSA2IEV5ZXMgdmlkZW8gc3VydmVpbGxhbmNlIGNhcmQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNjMTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK3pyMzYwNjctb2Jqcwk6PQl6b3Jhbl9wcm9jZnMubyB6b3Jhbl9kZXZpY2UubyBcCisJCQl6b3Jhbl9kcml2ZXIubyB6b3Jhbl9jYXJkLm8KKworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOKSArPSB6cjM2MDY3Lm8gdmlkZW9jb2RlYy5vCitvYmotJChDT05GSUdfVklERU9fWk9SQU5fREMzMCkgKz0genIzNjA1MC5vIHpyMzYwMTYubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX1pSMzYwNjApICs9IHpyMzYwNjAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2NvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3ZpZGVvY29kZWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2NvZGVjLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vdmlkZW9jb2RlYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vdmlkZW9jb2RlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi92aWRlb2NvZGVjLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4MmJlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fY2FyZC5jCkBAIC0wLDAgKzEsMTY3MCBAQAorLyoKKyAqIFpvcmFuIHpyMzYwNTcvenIzNjA2NyBQQ0kgY29udHJvbGxlciBkcml2ZXIsIGZvciB0aGUKKyAqIFBpbm5hY2xlL01pcm8gREMxMC9EQzEwKy9EQzMwL0RDMzArLCBJb21lZ2EgQnV6LCBMaW51eAorICogTWVkaWEgTGFicyBMTUwzMy9MTUwzM1IxMC4KKyAqCisgKiBUaGlzIHBhcnQgaGFuZGxlcyBjYXJkLXNwZWNpZmljIGRhdGEgYW5kIGRldGVjdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKKyAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInZpZGVvY29kZWMuaCIKKyNpbmNsdWRlICJ6b3Jhbi5oIgorI2luY2x1ZGUgInpvcmFuX2NhcmQuaCIKKyNpbmNsdWRlICJ6b3Jhbl9kZXZpY2UuaCIKKyNpbmNsdWRlICJ6b3Jhbl9wcm9jZnMuaCIKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgem9yYW5fZm9ybWF0c1tdOworCitzdGF0aWMgaW50IGNhcmRbQlVaX01BWF0gPSB7IC0xLCAtMSwgLTEsIC0xIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FyZCwgIlRoZSB0eXBlIG9mIGNhcmQiKTsKKworc3RhdGljIGludCBlbmNvZGVyW0JVWl9NQVhdID0geyAtMSwgLTEsIC0xLCAtMSB9OworbW9kdWxlX3BhcmFtX2FycmF5KGVuY29kZXIsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY29kZXIsICJpMmMgVFYgZW5jb2RlciIpOworCitzdGF0aWMgaW50IGRlY29kZXJbQlVaX01BWF0gPSB7IC0xLCAtMSwgLTEsIC0xIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZGVjb2RlciwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjb2RlciwgImkyYyBUViBkZWNvZGVyIik7CisKKy8qCisgICBUaGUgdmlkZW8gbWVtIGFkZHJlc3Mgb2YgdGhlIHZpZGVvIGNhcmQuCisgICBUaGUgZHJpdmVyIGhhcyBhIGxpdHRsZSBkYXRhYmFzZSBmb3Igc29tZSB2aWRlb2NhcmRzCisgICB0byBkZXRlcm1pbmUgaXQgZnJvbSB0aGVyZS4gSWYgeW91ciB2aWRlbyBjYXJkIGlzIG5vdCBpbiB0aGVyZQorICAgeW91IGhhdmUgZWl0aGVyIHRvIGdpdmUgaXQgdG8gdGhlIGRyaXZlciBhcyBhIHBhcmFtZXRlcgorICAgb3Igc2V0IGluIGluIGEgVklESU9DU0ZCVUYgaW9jdGwKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aWRtZW07CS8qIGRlZmF1bHQgPSAwIC0gVmlkZW8gbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworbW9kdWxlX3BhcmFtKHZpZG1lbSwgdWxvbmcsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh2aWRtZW0sICJEZWZhdWx0IHZpZGVvIG1lbW9yeSBiYXNlIGFkZHJlc3MiKTsKKworLyoKKyAgIERlZmF1bHQgaW5wdXQgYW5kIHZpZGVvIG5vcm0gYXQgc3RhcnR1cCBvZiB0aGUgZHJpdmVyLgorKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBkZWZhdWx0X2lucHV0OwkvKiBkZWZhdWx0IDAgPSBDb21wb3NpdGUsIDEgPSBTLVZpZGVvICovCittb2R1bGVfcGFyYW0oZGVmYXVsdF9pbnB1dCwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfaW5wdXQsCisJCSAiRGVmYXVsdCBpbnB1dCAoMD1Db21wb3NpdGUsIDE9Uy1WaWRlbywgMj1JbnRlcm5hbCkiKTsKKworc3RhdGljIGludCBkZWZhdWx0X211eCA9IDE7CS8qIDYgRXllcyBpbnB1dCBzZWxlY3Rpb24gKi8KK21vZHVsZV9wYXJhbShkZWZhdWx0X211eCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmYXVsdF9tdXgsCisJCSAiRGVmYXVsdCA2IEV5ZXMgbXV4IHNldHRpbmcgKElucHV0IHNlbGVjdGlvbikiKTsKKworc3RhdGljIGludCBkZWZhdWx0X25vcm07CS8qIGRlZmF1bHQgMCA9IFBBTCwgMSA9IE5UU0MgMiA9IFNFQ0FNICovCittb2R1bGVfcGFyYW0oZGVmYXVsdF9ub3JtLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X25vcm0sICJEZWZhdWx0IG5vcm0gKDA9UEFMLCAxPU5UU0MsIDI9U0VDQU0pIik7CisKKy8qIC9kZXYvdmlkZW9OLCAtMSBmb3IgYXV0b2RldGVjdCAqLworc3RhdGljIGludCB2aWRlb19ucltCVVpfTUFYXSA9IHstMSwgLTEsIC0xLCAtMX07Cittb2R1bGVfcGFyYW1fYXJyYXkodmlkZW9fbnIsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW8gZGV2aWNlIG51bWJlciAoLTE9QXV0bykiKTsKKworLyoKKyAgIE51bWJlciBhbmQgc2l6ZSBvZiBncmFiIGJ1ZmZlcnMgZm9yIFZpZGVvIDQgTGludXgKKyAgIFRoZSB2YXN0IG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IG5lZWQgbW9yZSB0aGFuIDIsCisgICB0aGUgdmVyeSBwb3B1bGFyIEJUVFYgZHJpdmVyIGFjdHVhbGx5IGRvZXMgT05MWSBoYXZlIDIuCisgICBUaW1lIHNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMgbWlnaHQgbmVlZCBtb3JlLCB0aGUgbWF4aW11bQorICAgaXMgVklERU9fTUFYX0ZSQU1FIChkZWZpbmVkIGluIDxsaW51eC92aWRlb2Rldi5oPikuCisKKyAgIFRoZSBzaXplIGlzIHNldCBzbyB0aGF0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIHJlcXVlc3QKKyAgIGNhbiBiZSBzYXRpc2ZpZWQuIERlY3JlYXNlICBpdCwgaWYgYmlncGh5c19hcmVhIGFsbG9jJ2QKKyAgIG1lbW9yeSBpcyBsb3cuIElmIHlvdSBkb24ndCBoYXZlIHRoZSBiaWdwaHlzX2FyZWEgcGF0Y2gsCisgICBzZXQgaXQgdG8gMTI4IEtCLiBXaWxsIHlvdSBhbGxvdyBvbmx5IHRvIGdyYWIgc21hbGwKKyAgIGltYWdlcyB3aXRoIFY0TCwgYnV0IHRoYXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nLgorCisgICB2NGxfYnVmc2l6ZSBoYXMgdG8gYmUgZ2l2ZW4gaW4gS0IgIQorCisqLworCitpbnQgdjRsX25idWZzID0gMjsKK2ludCB2NGxfYnVmc2l6ZSA9IDEyODsJCS8qIEV2ZXJ5Ym9keSBzaG91bGQgYmUgYWJsZSB0byB3b3JrIHdpdGggdGhpcyBzZXR0aW5nICovCittb2R1bGVfcGFyYW0odjRsX25idWZzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2NGxfbmJ1ZnMsICJNYXhpbXVtIG51bWJlciBvZiBWNEwgYnVmZmVycyB0byB1c2UiKTsKK21vZHVsZV9wYXJhbSh2NGxfYnVmc2l6ZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModjRsX2J1ZnNpemUsICJNYXhpbXVtIHNpemUgcGVyIFY0TCBidWZmZXIgKGluIGtCKSIpOworCitpbnQganBnX25idWZzID0gMzI7CitpbnQganBnX2J1ZnNpemUgPSA1MTI7CQkvKiBtYXggc2l6ZSBmb3IgMTAwJSBxdWFsaXR5IGZ1bGwtUEFMIGZyYW1lICovCittb2R1bGVfcGFyYW0oanBnX25idWZzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhqcGdfbmJ1ZnMsICJNYXhpbXVtIG51bWJlciBvZiBKUEcgYnVmZmVycyB0byB1c2UiKTsKK21vZHVsZV9wYXJhbShqcGdfYnVmc2l6ZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoanBnX2J1ZnNpemUsICJNYXhpbXVtIHNpemUgcGVyIEpQRyBidWZmZXIgKGluIGtCKSIpOworCitpbnQgcGFzc190aHJvdWdoID0gMDsJCS8qIDE9UGFzcyB0aHJvdWdoIFRWIHNpZ25hbCB3aGVuIGRldmljZSBpcyBub3QgdXNlZCAqLworCQkJCS8qIDA9U2hvdyBjb2xvciBiYXIgd2hlbiBkZXZpY2UgaXMgbm90IHVzZWQgKExNTDMzOiBvbmx5IGlmIGxtbDMzZHBhdGg9MSkgKi8KK21vZHVsZV9wYXJhbShwYXNzX3Rocm91Z2gsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhc3NfdGhyb3VnaCwKKwkJICJQYXNzIFRWIHNpZ25hbCB0aHJvdWdoIHRvIFRWLW91dCB3aGVuIGlkbGluZyIpOworCitpbnQgenIzNjA2N19kZWJ1ZyA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHpyMzYwNjdfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtNSkiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJab3Jhbi0zNjA1Ny8zNjA2NyBKUEVHIGNvZGVjIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU2VyZ3VlaSBNaXJpZG9ub3YiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHpyMzYwNjdfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX1pPUkFOLCBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MDU3LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgenIzNjA2N19wY2lfdGJsKTsKKworaW50IHpvcmFuX251bTsJCQkvKiBudW1iZXIgb2YgQnV6cyBpbiB1c2UgKi8KK3N0cnVjdCB6b3JhbiAqem9yYW5bQlVaX01BWF07CisKKy8qIHZpZGVvY29kZWMgYnVzIGZ1bmN0aW9ucyBaUjM2MDYwICovCitzdGF0aWMgdTMyCit6cjM2MDYwX3JlYWQgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKKwkgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKwlfX3UzMiBkYXRhOworCisJaWYgKHBvc3Rfb2ZmaWNlX3dhaXQoenIpCisJICAgIHx8IHBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAxLCByZWcgPj4gOCkKKwkgICAgfHwgcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDIsIHJlZyAmIDB4ZmYpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgMCwgMykgJiAweGZmOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorenIzNjA2MF93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgMSwgcmVnID4+IDgpCisJICAgIHx8IHBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAyLCByZWcgJiAweGZmKSkgeworCQlyZXR1cm47CisJfQorCisJcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDMsIHZhbCAmIDB4ZmYpOworfQorCisvKiB2aWRlb2NvZGVjIGJ1cyBmdW5jdGlvbnMgWlIzNjA1MCAqLworc3RhdGljIHUzMgorenIzNjA1MF9yZWFkIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7CisJX191MzIgZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMSwgMCwgcmVnID4+IDIpKSB7CS8vIHJlZy4gSElHSEJZVEVTCisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgMCwgcmVnICYgMHgwMykgJiAweGZmOwkvLyByZWcuIExPV0JZVEVTICsgcmVhZAorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorenIzNjA1MF93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQorCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMSwgMCwgcmVnID4+IDIpKSB7CS8vIHJlZy4gSElHSEJZVEVTCisJCXJldHVybjsKKwl9CisKKwlwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgcmVnICYgMHgwMywgdmFsICYgMHhmZik7CS8vIHJlZy4gTE9XQllURVMgKyB3ci4gZGF0YQorfQorCisvKiB2aWRlb2NvZGVjIGJ1cyBmdW5jdGlvbnMgWlIzNjAxNiAqLworc3RhdGljIHUzMgorenIzNjAxNl9yZWFkIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCisJICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZykKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7CisJX191MzIgZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZGF0YSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDIsIHJlZyAmIDB4MDMpICYgMHhmZjsJLy8gcmVhZAorCXJldHVybiBkYXRhOworfQorCisvKiBoYWNrIGZvciBpbiB6b3Jhbl9kZXZpY2UuYyAqLwordm9pZAorenIzNjAxNl93cml0ZSAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAorCSAgICAgICB1MTYgICAgICAgICAgICAgICAgcmVnLAorCSAgICAgICB1MzIgICAgICAgICAgICAgICAgdmFsKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGNvZGVjLT5tYXN0ZXJfZGF0YS0+ZGF0YTsKKworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKSkgeworCQlyZXR1cm47CisJfQorCisJcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDIsIHJlZyAmIDB4MDMsIHZhbCAmIDB4MGZmKTsJLy8gd3IuIGRhdGEKK30KKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIHZvaWQKK2RjMTBfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBkYzEwX2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJLyogUGl4ZWwgY2xvY2sgc2VsZWN0aW9uICovCisJR1BJTyh6ciwgNCwgMCk7CisJR1BJTyh6ciwgNSwgMSk7CisJLyogRW5hYmxlIHRoZSB2aWRlbyBidXMgc3luYyBzaWduYWxzICovCisJR1BJTyh6ciwgNywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYzEwcGx1c19pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IGRjMTBwbHVzX2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworfQorCitzdGF0aWMgdm9pZAorYnV6X2luaXQgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogYnV6X2luaXQoKVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJLyogc29tZSBzdHVmZiBmcm9tIElvbWVnYSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4ZmMsIDB4OTA2ODBmMTUpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4MGMsIDB4MDAwMTIwMjApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoenItPnBjaV9kZXYsIDB4ZTgsIDB4YzAyMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbG1sMzNfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBsbWwzM19pbml0KClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCUdQSU8oenIsIDIsIDEpOwkJLy8gU2V0IENvbXBvc2l0ZSBpbnB1dC9vdXRwdXQKK30KKworc3RhdGljIHZvaWQKK2F2czZleWVzX2luaXQgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJLy8gQXZlck1lZGlhIDYtRXllcyBvcmlnaW5hbCBkcml2ZXIgYnkgQ2hyaXN0ZXIgV2VpbmlnZWwKKworCS8vIExpZnRlZCBzdHJhaWdodCBmcm9tIENocmlzdGVyJ3Mgb2xkIGRyaXZlciBhbmQKKwkvLyBtb2RpZmllZCBzbGlnaHRseSBieSBNYXJ0aW4gU2FtdWVsc3Nvbi4KKworCWludCBtdXggPSBkZWZhdWx0X211eDsgLyogMSA9IEJUODY2LCA3ID0gVklEMSAqLworCisJR1BJTyh6ciwgNCwgMSk7IC8qIEJ0ODY2IFNMRUVQIG9uICovCisJdWRlbGF5KDIpOworCisJR1BJTyh6ciwgMCwgMSk7IC8qIFpSMzYwNjAgL1JFU0VUIG9uICovCisJR1BJTyh6ciwgMSwgMCk7IC8qIFpSMzYwNjAgL1NMRUVQIG9uICovCisJR1BJTyh6ciwgMiwgbXV4ICYgMSk7ICAgLyogTVVYIFMwICovCisJR1BJTyh6ciwgMywgMCk7IC8qIC9GUkFNRSBvbiAqLworCUdQSU8oenIsIDQsIDApOyAvKiBCdDg2NiBTTEVFUCBvZmYgKi8KKwlHUElPKHpyLCA1LCBtdXggJiAyKTsgICAvKiBNVVggUzEgKi8KKwlHUElPKHpyLCA2LCAwKTsgLyogPyAqLworCUdQSU8oenIsIDcsIG11eCAmIDQpOyAgIC8qIE1VWCBTMiAqLworCit9CisKK3N0YXRpYyBjaGFyICoKK2kyY2lkX3RvX21vZHVsZW5hbWUgKHUxNiBpMmNfaWQpCit7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlzd2l0Y2ggKGkyY19pZCkgeworCWNhc2UgSTJDX0RSSVZFUklEX1NBQTcxMTA6CisJCW5hbWUgPSAic2FhNzExMCI7CisJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX1NBQTcxMTFBOgorCQluYW1lID0gInNhYTcxMTEiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9TQUE3MTE0OgorCQluYW1lID0gInNhYTcxMTQiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9TQUE3MTg1QjoKKwkJbmFtZSA9ICJzYWE3MTg1IjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfQURWNzE3MDoKKwkJbmFtZSA9ICJhZHY3MTcwIjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfQURWNzE3NToKKwkJbmFtZSA9ICJhZHY3MTc1IjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfQlQ4MTk6CisJCW5hbWUgPSAiYnQ4MTkiOworCQlicmVhazsKKwljYXNlIEkyQ19EUklWRVJJRF9CVDg1NjoKKwkJbmFtZSA9ICJidDg1NiI7CisJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX0JUODY2OgorCQluYW1lID0gImJ0ODY2IjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfVlBYMzIyMDoKKwkJbmFtZSA9ICJ2cHgzMjIwIjsKKwkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfS1MwMTI3OgorCQluYW1lID0gImtzMDEyNyI7CisJCWJyZWFrOworCX0KKworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY2hhciAqCitjb2RlY2lkX3RvX21vZHVsZW5hbWUgKHUxNiBjb2RlY2lkKQoreworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJc3dpdGNoIChjb2RlY2lkKSB7CisJY2FzZSBDT0RFQ19UWVBFX1pSMzYwNjA6CisJCW5hbWUgPSAienIzNjA2MCI7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9aUjM2MDUwOgorCQluYW1lID0gInpyMzYwNTAiOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfWlIzNjAxNjoKKwkJbmFtZSA9ICJ6cjM2MDE2IjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisKKy8vIHN0cnVjdCB0dm5vcm0geworLy8gICAgICB1MTYgV3QsIFdhLCBIU3RhcnQsIEhTeW5jU3RhcnQsIEh0LCBIYSwgVlN0YXJ0OworLy8gfTsKKworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwc3FwaXhlbCA9IHsgOTQ0LCA3NjgsIDgzLCA4ODAsIDYyNSwgNTc2LCAxNiB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwc3FwaXhlbCA9IHsgNzgwLCA2NDAsIDUxLCA3MTYsIDUyNSwgNDgwLCAxMiB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwY2NpcjYwMSA9IHsgODY0LCA3MjAsIDc1LCA4MDQsIDYyNSwgNTc2LCAxOCB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMSA9IHsgODU4LCA3MjAsIDU3LCA3ODgsIDUyNSwgNDgwLCAxNiB9OworCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2xtbDMzID0geyA4NjQsIDcyMCwgNzUrMzQsIDgwNCwgNjI1LCA1NzYsIDE4IH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBjY2lyNjAxX2xtbDMzID0geyA4NTgsIDcyMCwgNTcrMzQsIDc4OCwgNTI1LCA0ODAsIDE2IH07CisKKy8qIFRoZSBEQzEwICg1Ny8xNi81MCkgdXNlcyBWQWN0aXZlIGFzIEhTeW5jLCBzbyBIU3RhcnQgbXVzdCBiZSAwICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBzcXBpeGVsX2RjMTAgPSB7IDk0NCwgNzY4LCAwLCA4ODAsIDYyNSwgNTc2LCAwIH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBzcXBpeGVsX2RjMTAgPSB7IDc4MCwgNjQwLCAwLCA3MTYsIDUyNSwgNDgwLCAxMiB9OworCisvKiBGSVhNRTogSSBjYW5ub3Qgc3dhcCBVIGFuZCBWIGluIHNhYTcxMTQsIHNvIGkgZG8gb25lCisgKiBwaXhlbCBsZWZ0IHNoaWZ0IGluIHpvcmFuICg3NSAtPiA3NCkKKyAqIChNYXhpbSBZZXZ0eXVzaGtpbiA8bWF4QGxpbnV4bWVkaWFsYWJzLmNvbT4pICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2xtMzNyMTAgPSB7IDg2NCwgNzIwLCA3NCs1NCwgODA0LCA2MjUsIDU3NiwgMTggfTsKK3N0YXRpYyBzdHJ1Y3QgdHZub3JtIGY2MGNjaXI2MDFfbG0zM3IxMCA9IHsgODU4LCA3MjAsIDU2KzU0LCA3ODgsIDUyNSwgNDgwLCAxNiB9OworCisvKiBGSVhNRTogVGhlIGtzMDEyNyBzZWVtIGluY2FwYWJsZSBvZiBzd2FwcGluZyBVIGFuZCBWLCB0b28sIHdoaWNoIGlzIHdoeSBJCisgKiBjb3B5IE1heGltJ3MgbGVmdCBzaGlmdCBoYWNrIGZvciB0aGUgNiBFeWVzLgorICoKKyAqIENocmlzdGVyJ3MgZHJpdmVyIHVzZWQgdGhlIHVuc2hpZnRlZCBub3JtcywgdGhvdWdoLi4uCisgKiAvU2FtICAqLworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwY2NpcjYwMV9hdnM2ZXllcyA9IHsgODY0LCA3MjAsIDc0LCA4MDQsIDYyNSwgNTc2LCAxOCB9Oworc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMV9hdnM2ZXllcyA9IHsgODU4LCA3MjAsIDU2LCA3ODgsIDUyNSwgNDgwLCAxNiB9OworCitzdGF0aWMgc3RydWN0IGNhcmRfaW5mbyB6b3Jhbl9jYXJkc1tOVU1fQ0FSRFNdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudHlwZSA9IERDMTBfb2xkLAorCQkubmFtZSA9ICJEQzEwKG9sZCkiLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfVlBYMzIyMCwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDUwLAorCQkudmlkZW9fdmZlID0gQ09ERUNfVFlQRV9aUjM2MDE2LAorCisJCS5pbnB1dHMgPSAzLAorCQkuaW5wdXQgPSB7CisJCQl7IDEsICJDb21wb3NpdGUiIH0sCisJCQl7IDIsICJTLVZpZGVvIiB9LAorCQkJeyAwLCAiSW50ZXJuYWwvY29tcCIgfQorCQl9LAorCQkubm9ybXMgPSAzLAorCQkudHZuID0geworCQkJJmY1MHNxcGl4ZWxfZGMxMCwKKwkJCSZmNjBzcXBpeGVsX2RjMTAsCisJCQkmZjUwc3FwaXhlbF9kYzEwCisJCX0sCisJCS5qcGVnX2ludCA9IDAsCisJCS52c3luY19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKKwkJLmdwaW8gPSB7IDIsIDEsIC0xLCAzLCA3LCAwLCA0LCA1IH0sCisJCS5ncGlvX3BvbCA9IHsgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCB9LAorCQkuZ3BjcyA9IHsgLTEsIDAgfSwKKwkJLnZmZV9wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJLmd3c19ub3RfY29ubmVjdGVkID0gMCwKKwkJLmlucHV0X211eCA9IDAsCisJCS5pbml0ID0gJmRjMTBfaW5pdCwKKwl9LCB7CisJCS50eXBlID0gREMxMF9uZXcsCisJCS5uYW1lID0gIkRDMTAobmV3KSIsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTEwLAorCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQURWNzE3NSwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAzLAorCQkuaW5wdXQgPSB7CisJCQkJeyAwLCAiQ29tcG9zaXRlIiB9LAorCQkJCXsgNywgIlMtVmlkZW8iIH0sCisJCQkJeyA1LCAiSW50ZXJuYWwvY29tcCIgfQorCQkJfSwKKwkJLm5vcm1zID0gMywKKwkJLnR2biA9IHsKKwkJCQkmZjUwc3FwaXhlbCwKKwkJCQkmZjYwc3FwaXhlbCwKKwkJCQkmZjUwc3FwaXhlbH0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS5ncGlvID0geyAzLCAwLCA2LCAxLCAyLCAtMSwgNCwgNSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IC0xLCAxfSwKKwkJLnZmZV9wb2wgPSB7IDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAgfSwKKwkJLmd3c19ub3RfY29ubmVjdGVkID0gMCwKKwkJLmlucHV0X211eCA9IDAsCisJCS5pbml0ID0gJmRjMTBwbHVzX2luaXQsCisJfSwgeworCQkudHlwZSA9IERDMTBwbHVzLAorCQkubmFtZSA9ICJEQzEwcGx1cyIsCisJCS52ZW5kb3JfaWQgPSBQQ0lfVkVORE9SX0lEX01JUk8sCisJCS5kZXZpY2VfaWQgPSBQQ0lfREVWSUNFX0lEX01JUk9fREMxMFBMVVMsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTEwLAorCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQURWNzE3NSwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAzLAorCQkuaW5wdXQgPSB7CisJCQl7IDAsICJDb21wb3NpdGUiIH0sCisJCQl7IDcsICJTLVZpZGVvIiB9LAorCQkJeyA1LCAiSW50ZXJuYWwvY29tcCIgfQorCQl9LAorCQkubm9ybXMgPSAzLAorCQkudHZuID0geworCQkJJmY1MHNxcGl4ZWwsCisJCQkmZjYwc3FwaXhlbCwKKwkJCSZmNTBzcXBpeGVsCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS5ncGlvID0geyAzLCAwLCA2LCAxLCAyLCAtMSwgNCwgNSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IC0xLCAxIH0sCisJCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAorCQkuaW5pdCA9ICZkYzEwcGx1c19pbml0LAorCX0sIHsKKwkJLnR5cGUgPSBEQzMwLAorCQkubmFtZSA9ICJEQzMwIiwKKwkJLmkyY19kZWNvZGVyID0gSTJDX0RSSVZFUklEX1ZQWDMyMjAsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9BRFY3MTc1LAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNTAsCisJCS52aWRlb192ZmUgPSBDT0RFQ19UWVBFX1pSMzYwMTYsCisKKwkJLmlucHV0cyA9IDMsCisJCS5pbnB1dCA9IHsKKwkJCXsgMSwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgMiwgIlMtVmlkZW8iIH0sCisJCQl7IDAsICJJbnRlcm5hbC9jb21wIiB9CisJCX0sCisJCS5ub3JtcyA9IDMsCisJCS50dm4gPSB7CisJCQkmZjUwc3FwaXhlbF9kYzEwLAorCQkJJmY2MHNxcGl4ZWxfZGMxMCwKKwkJCSZmNTBzcXBpeGVsX2RjMTAKKwkJfSwKKwkJLmpwZWdfaW50ID0gMCwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkuZ3BpbyA9IHsgMiwgMSwgLTEsIDMsIDcsIDAsIDQsIDUgfSwKKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCisJCS5ncGNzID0geyAtMSwgMCB9LAorCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAorCQkuaW5wdXRfbXV4ID0gMCwKKwkJLmluaXQgPSAmZGMxMF9pbml0LAorCX0sIHsKKwkJLnR5cGUgPSBEQzMwcGx1cywKKwkJLm5hbWUgPSAiREMzMHBsdXMiLAorCQkudmVuZG9yX2lkID0gUENJX1ZFTkRPUl9JRF9NSVJPLAorCQkuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9NSVJPX0RDMzBQTFVTLAorCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfVlBYMzIyMCwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzUsCisJCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA1MCwKKwkJLnZpZGVvX3ZmZSA9IENPREVDX1RZUEVfWlIzNjAxNiwKKworCQkuaW5wdXRzID0gMywKKwkJLmlucHV0ID0geworCQkJeyAxLCAiQ29tcG9zaXRlIiB9LAorCQkJeyAyLCAiUy1WaWRlbyIgfSwKKwkJCXsgMCwgIkludGVybmFsL2NvbXAiIH0KKwkJfSwKKwkJLm5vcm1zID0gMywKKwkJLnR2biA9IHsKKwkJCSZmNTBzcXBpeGVsX2RjMTAsCisJCQkmZjYwc3FwaXhlbF9kYzEwLAorCQkJJmY1MHNxcGl4ZWxfZGMxMAorCQl9LAorCQkuanBlZ19pbnQgPSAwLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS5ncGlvID0geyAyLCAxLCAtMSwgMywgNywgMCwgNCwgNSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IC0xLCAwIH0sCisJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAorCQkuaW5pdCA9ICZkYzEwX2luaXQsCisJfSwgeworCQkudHlwZSA9IExNTDMzLAorCQkubmFtZSA9ICJMTUwzMyIsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9CVDgxOSwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0JUODU2LAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNjAsCisKKwkJLmlucHV0cyA9IDIsCisJCS5pbnB1dCA9IHsKKwkJCXsgMCwgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgNywgIlMtVmlkZW8iIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2xtbDMzLAorCQkJJmY2MGNjaXI2MDFfbG1sMzMsCisJCQlOVUxMCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCisJCS5ncGlvID0geyAxLCAtMSwgMywgNSwgNywgLTEsIC0xLCAtMSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IDMsIDEgfSwKKwkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKwkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCisJCS5pbml0ID0gJmxtbDMzX2luaXQsCisJfSwgeworCQkudHlwZSA9IExNTDMzUjEwLAorCQkubmFtZSA9ICJMTUwzM1IxMCIsCisJCS52ZW5kb3JfaWQgPSBQQ0lfVkVORE9SX0lEX0VMRUNUUk9OSUNERVNJR05HTUJILAorCQkuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9MTUxfMzNSMTAsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTE0LAorCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQURWNzE3MCwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAyLAorCQkuaW5wdXQgPSB7CisJCQl7IDAsICJDb21wb3NpdGUiIH0sCisJCQl7IDcsICJTLVZpZGVvIiB9CisJCX0sCisJCS5ub3JtcyA9IDIsCisJCS50dm4gPSB7CisJCQkmZjUwY2NpcjYwMV9sbTMzcjEwLAorCQkJJmY2MGNjaXI2MDFfbG0zM3IxMCwKKwkJCU5VTEwKKwkJfSwKKwkJLmpwZWdfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCisJCS52c3luY19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKKwkJLmdwaW8gPSB7IDEsIC0xLCAzLCA1LCA3LCAtMSwgLTEsIC0xIH0sCisJCS5ncGlvX3BvbCA9IHsgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCB9LAorCQkuZ3BjcyA9IHsgMywgMSB9LAorCQkudmZlX3BvbCA9IHsgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCB9LAorCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAxLAorCQkuaW5wdXRfbXV4ID0gMCwKKwkJLmluaXQgPSAmbG1sMzNfaW5pdCwKKwl9LCB7CisJCS50eXBlID0gQlVaLAorCQkubmFtZSA9ICJCdXoiLAorCQkudmVuZG9yX2lkID0gUENJX1ZFTkRPUl9JRF9JT01FR0EsCisJCS5kZXZpY2VfaWQgPSBQQ0lfREVWSUNFX0lEX0lPTUVHQV9CVVosCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTExQSwKKwkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX1NBQTcxODVCLAorCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNjAsCisKKwkJLmlucHV0cyA9IDIsCisJCS5pbnB1dCA9IHsKKwkJCXsgMywgIkNvbXBvc2l0ZSIgfSwKKwkJCXsgNywgIlMtVmlkZW8iIH0KKwkJfSwKKwkJLm5vcm1zID0gMywKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxLAorCQkJJmY2MGNjaXI2MDEsCisJCQkmZjUwY2NpcjYwMQorCQl9LAorCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKKwkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAorCQkuZ3BpbyA9IHsgMSwgLTEsIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwkJLmdwY3MgPSB7IDMsIDEgfSwKKwkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKwkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCisJCS5pbml0ID0gJmJ1el9pbml0LAorCX0sIHsKKwkJLnR5cGUgPSBBVlM2RVlFUywKKwkJLm5hbWUgPSAiNi1FeWVzIiwKKwkJLyogQXZlck1lZGlhIGNob3NlIG5vdCB0byBicmFuZCB0aGUgNi1FeWVzLiBUaHVzIGl0CisJCSAgIGNhbid0IGJlIGF1dG9kZXRlY3RlZCwgYW5kIHJlcXVpcmVzIGNhcmQ9eC4gKi8KKwkJLnZlbmRvcl9pZCA9IC0xLAorCQkuZGV2aWNlX2lkID0gLTEsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9LUzAxMjcsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9CVDg2NiwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAxMCwKKwkJLmlucHV0ID0geworCQkJeyAwLCAiQ29tcG9zaXRlIDEiIH0sCisJCQl7IDEsICJDb21wb3NpdGUgMiIgfSwKKwkJCXsgMiwgIkNvbXBvc2l0ZSAzIiB9LAorCQkJeyA0LCAiQ29tcG9zaXRlIDQiIH0sCisJCQl7IDUsICJDb21wb3NpdGUgNSIgfSwKKwkJCXsgNiwgIkNvbXBvc2l0ZSA2IiB9LAorCQkJeyA4LCAiUy1WaWRlbyAxIiB9LAorCQkJeyA5LCAiUy1WaWRlbyAyIiB9LAorCQkJezEwLCAiUy1WaWRlbyAzIiB9LAorCQkJezE1LCAiWUNiQ3IiIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2F2czZleWVzLAorCQkJJmY2MGNjaXI2MDFfYXZzNmV5ZXMsCisJCQlOVUxMCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCisJCS5ncGlvID0geyAxLCAwLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwvLyBWYWxpZGl0eSB1bmtub3duIC9TYW0KKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkuZ3BjcyA9IHsgMywgMSB9LAkJCS8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkudmZlX3BvbCA9IHsgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LCAgLy8gVmFsaWRpdHkgdW5rbm93biAvU2FtCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCisJCS5pbnB1dF9tdXggPSAxLAorCQkuaW5pdCA9ICZhdnM2ZXllc19pbml0LAorCX0KKworfTsKKworLyoKKyAqIEkyQyBmdW5jdGlvbnMKKyAqLworLyogc29mdHdhcmUgSTJDIGZ1bmN0aW9ucyAqLworc3RhdGljIGludAorem9yYW5faTJjX2dldHNkYSAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBkYXRhOworCisJcmV0dXJuIChidHJlYWQoWlIzNjA1N19JMkNCUikgPj4gMSkgJiAxOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9pMmNfZ2V0c2NsICh2b2lkICpkYXRhKQoreworCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGRhdGE7CisKKwlyZXR1cm4gYnRyZWFkKFpSMzYwNTdfSTJDQlIpICYgMTsKK30KKworc3RhdGljIHZvaWQKK3pvcmFuX2kyY19zZXRzZGEgKHZvaWQgKmRhdGEsCisJCSAgaW50ICAgc3RhdGUpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJenItPmkyY2JyIHw9IDI7CisJZWxzZQorCQl6ci0+aTJjYnIgJj0gfjI7CisJYnR3cml0ZSh6ci0+aTJjYnIsIFpSMzYwNTdfSTJDQlIpOworfQorCitzdGF0aWMgdm9pZAorem9yYW5faTJjX3NldHNjbCAodm9pZCAqZGF0YSwKKwkJICBpbnQgICBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBkYXRhOworCisJaWYgKHN0YXRlKQorCQl6ci0+aTJjYnIgfD0gMTsKKwllbHNlCisJCXpyLT5pMmNiciAmPSB+MTsKKwlidHdyaXRlKHpyLT5pMmNiciwgWlIzNjA1N19JMkNCUik7Cit9CisKK3N0YXRpYyBpbnQKK3pvcmFuX2kyY19jbGllbnRfcmVnaXN0ZXIgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOworCWludCByZXMgPSAwOworCisJZHByaW50aygyLAorCQlLRVJOX0RFQlVHICIlczogaTJjX2NsaWVudF9yZWdpc3RlcigpIC0gZHJpdmVyIGlkID0gJWRcbiIsCisJCVpSX0RFVk5BTUUoenIpLCBjbGllbnQtPmRyaXZlci0+aWQpOworCisJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJaWYgKHpyLT51c2VyID4gMCkgeworCQkvKiB3ZSdyZSBhbHJlYWR5IGJ1c3ksIHNvIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8KKwkJICogdGhlbS4uLiBDb3VsZCBkbyBhIGxvdCBvZiBzdHVmZiBoZXJlLCBidXQgdGhpcworCQkgKiBpcyBlYXNpZXN0LiAoRGlkIEkgZXZlciBtZW50aW9uIEknbSBhIGxhenkgYXNzPykKKwkJICovCisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBjbGllbnRyZWdfdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJaWYgKGNsaWVudC0+ZHJpdmVyLT5pZCA9PSB6ci0+Y2FyZC5pMmNfZGVjb2RlcikKKwkJenItPmRlY29kZXIgPSBjbGllbnQ7CisJZWxzZSBpZiAoY2xpZW50LT5kcml2ZXItPmlkID09IHpyLT5jYXJkLmkyY19lbmNvZGVyKQorCQl6ci0+ZW5jb2RlciA9IGNsaWVudDsKKwllbHNlIHsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBjbGllbnRyZWdfdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCitjbGllbnRyZWdfdW5sb2NrX2FuZF9yZXR1cm46CisJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9pMmNfY2xpZW50X3VucmVnaXN0ZXIgKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOworCWludCByZXMgPSAwOworCisJZHByaW50aygyLCBLRVJOX0RFQlVHICIlczogaTJjX2NsaWVudF91bnJlZ2lzdGVyKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCWlmICh6ci0+dXNlciA+IDApIHsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGNsaWVudHVucmVnX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCS8qIHRyeSB0byBsb2NhdGUgaXQgKi8KKwlpZiAoY2xpZW50ID09IHpyLT5lbmNvZGVyKSB7CisJCXpyLT5lbmNvZGVyID0gTlVMTDsKKwl9IGVsc2UgaWYgKGNsaWVudCA9PSB6ci0+ZGVjb2RlcikgeworCQl6ci0+ZGVjb2RlciA9IE5VTEw7CisJCXNucHJpbnRmKFpSX0RFVk5BTUUoenIpLCBzaXplb2YoWlJfREVWTkFNRSh6cikpLCAiTUpQRUdbJWRdIiwgenItPmlkKTsKKwl9CitjbGllbnR1bnJlZ191bmxvY2tfYW5kX3JldHVybjoKKwltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHpvcmFuX2kyY19iaXRfZGF0YV90ZW1wbGF0ZSA9IHsKKwkuc2V0c2RhID0gem9yYW5faTJjX3NldHNkYSwKKwkuc2V0c2NsID0gem9yYW5faTJjX3NldHNjbCwKKwkuZ2V0c2RhID0gem9yYW5faTJjX2dldHNkYSwKKwkuZ2V0c2NsID0gem9yYW5faTJjX2dldHNjbCwKKwkudWRlbGF5ID0gMTAsCisJLnRpbWVvdXQgPSAxMDAsCit9OworCitzdGF0aWMgaW50Cit6b3Jhbl9yZWdpc3Rlcl9pMmMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJbWVtY3B5KCZ6ci0+aTJjX2FsZ28sICZ6b3Jhbl9pMmNfYml0X2RhdGFfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEpKTsKKwl6ci0+aTJjX2FsZ28uZGF0YSA9IHpyOworCXpyLT5pMmNfYWRhcHRlci5pZCA9IEkyQ19IV19CX1pSMzYwNjc7CisJenItPmkyY19hZGFwdGVyLmNsaWVudF9yZWdpc3RlciA9IHpvcmFuX2kyY19jbGllbnRfcmVnaXN0ZXI7CisJenItPmkyY19hZGFwdGVyLmNsaWVudF91bnJlZ2lzdGVyID0gem9yYW5faTJjX2NsaWVudF91bnJlZ2lzdGVyOworCXN0cmxjcHkoenItPmkyY19hZGFwdGVyLm5hbWUsIFpSX0RFVk5BTUUoenIpLAorCQlzaXplb2YoenItPmkyY19hZGFwdGVyLm5hbWUpKTsKKwlpMmNfc2V0X2FkYXBkYXRhKCZ6ci0+aTJjX2FkYXB0ZXIsIHpyKTsKKwl6ci0+aTJjX2FkYXB0ZXIuYWxnb19kYXRhID0gJnpyLT5pMmNfYWxnbzsKKwl6ci0+aTJjX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZ6ci0+cGNpX2Rldi0+ZGV2OworCXJldHVybiBpMmNfYml0X2FkZF9idXMoJnpyLT5pMmNfYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl91bnJlZ2lzdGVyX2kyYyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJnpyLT5pMmNfYWRhcHRlcik7Cit9CisKKy8qIENoZWNrIGEgem9yYW5fcGFyYW1zIHN0cnVjdCBmb3IgY29ycmVjdG5lc3MsIGluc2VydCBkZWZhdWx0IHBhcmFtcyAqLworCitpbnQKK3pvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyAoc3RydWN0IHpvcmFuICAgICAgICAgICAgICAqenIsCisJCQkgIHN0cnVjdCB6b3Jhbl9qcGdfc2V0dGluZ3MgKnNldHRpbmdzKQoreworCWludCBlcnIgPSAwLCBlcnIwID0gMDsKKworCWRwcmludGsoNCwKKwkJS0VSTl9ERUJVRworCQkiJXM6IGNoZWNrX2pwZ19zZXR0aW5ncygpIC0gZGVjOiAlZCwgSGRjbTogJWQsIFZkY206ICVkLCBUZGNtOiAlZFxuIiwKKwkJWlJfREVWTkFNRSh6ciksIHNldHRpbmdzLT5kZWNpbWF0aW9uLCBzZXR0aW5ncy0+SG9yRGNtLAorCQlzZXR0aW5ncy0+VmVyRGNtLCBzZXR0aW5ncy0+VG1wRGNtKTsKKwlkcHJpbnRrKDQsCisJCUtFUk5fREVCVUcKKwkJIiVzOiBjaGVja19qcGdfc2V0dGluZ3MoKSAtIHg6ICVkLCB5OiAlZCwgdzogJWQsIHk6ICVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwgc2V0dGluZ3MtPmltZ194LCBzZXR0aW5ncy0+aW1nX3ksCisJCXNldHRpbmdzLT5pbWdfd2lkdGgsIHNldHRpbmdzLT5pbWdfaGVpZ2h0KTsKKwkvKiBDaGVjayBkZWNpbWF0aW9uLCBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGRlY2ltYXRpb24gPSAxLCAyLCA0ICovCisJc3dpdGNoIChzZXR0aW5ncy0+ZGVjaW1hdGlvbikgeworCWNhc2UgMToKKworCQlzZXR0aW5ncy0+SG9yRGNtID0gMTsKKwkJc2V0dGluZ3MtPlZlckRjbSA9IDE7CisJCXNldHRpbmdzLT5UbXBEY20gPSAxOworCQlzZXR0aW5ncy0+ZmllbGRfcGVyX2J1ZmYgPSAyOworCQlzZXR0aW5ncy0+aW1nX3ggPSAwOworCQlzZXR0aW5ncy0+aW1nX3kgPSAwOworCQlzZXR0aW5ncy0+aW1nX3dpZHRoID0gQlVaX01BWF9XSURUSDsKKwkJc2V0dGluZ3MtPmltZ19oZWlnaHQgPSBCVVpfTUFYX0hFSUdIVCAvIDI7CisJCWJyZWFrOworCWNhc2UgMjoKKworCQlzZXR0aW5ncy0+SG9yRGNtID0gMjsKKwkJc2V0dGluZ3MtPlZlckRjbSA9IDE7CisJCXNldHRpbmdzLT5UbXBEY20gPSAyOworCQlzZXR0aW5ncy0+ZmllbGRfcGVyX2J1ZmYgPSAxOworCQlzZXR0aW5ncy0+aW1nX3ggPSAoQlVaX01BWF9XSURUSCA9PSA3MjApID8gOCA6IDA7CisJCXNldHRpbmdzLT5pbWdfeSA9IDA7CisJCXNldHRpbmdzLT5pbWdfd2lkdGggPQorCQkgICAgKEJVWl9NQVhfV0lEVEggPT0gNzIwKSA/IDcwNCA6IEJVWl9NQVhfV0lEVEg7CisJCXNldHRpbmdzLT5pbWdfaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQgLyAyOworCQlicmVhazsKKwljYXNlIDQ6CisKKwkJaWYgKHpyLT5jYXJkLnR5cGUgPT0gREMxMF9uZXcpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0RFQlVHCisJCQkJIiVzOiBjaGVja19qcGdfc2V0dGluZ3MoKSAtIEhEZWMgYnkgNCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBEQzEwXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCWVycjArKzsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0dGluZ3MtPkhvckRjbSA9IDQ7CisJCXNldHRpbmdzLT5WZXJEY20gPSAyOworCQlzZXR0aW5ncy0+VG1wRGNtID0gMjsKKwkJc2V0dGluZ3MtPmZpZWxkX3Blcl9idWZmID0gMTsKKwkJc2V0dGluZ3MtPmltZ194ID0gKEJVWl9NQVhfV0lEVEggPT0gNzIwKSA/IDggOiAwOworCQlzZXR0aW5ncy0+aW1nX3kgPSAwOworCQlzZXR0aW5ncy0+aW1nX3dpZHRoID0KKwkJICAgIChCVVpfTUFYX1dJRFRIID09IDcyMCkgPyA3MDQgOiBCVVpfTUFYX1dJRFRIOworCQlzZXR0aW5ncy0+aW1nX2hlaWdodCA9IEJVWl9NQVhfSEVJR0hUIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAwOgorCisJCS8qIFdlIGhhdmUgdG8gY2hlY2sgdGhlIGRhdGEgdGhlIHVzZXIgaGFzIHNldCAqLworCisJCWlmIChzZXR0aW5ncy0+SG9yRGNtICE9IDEgJiYgc2V0dGluZ3MtPkhvckRjbSAhPSAyICYmCisJCSAgICAoenItPmNhcmQudHlwZSA9PSBEQzEwX25ldyB8fCBzZXR0aW5ncy0+SG9yRGNtICE9IDQpKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPlZlckRjbSAhPSAxICYmIHNldHRpbmdzLT5WZXJEY20gIT0gMikKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5UbXBEY20gIT0gMSAmJiBzZXR0aW5ncy0+VG1wRGNtICE9IDIpCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+ZmllbGRfcGVyX2J1ZmYgIT0gMSAmJgorCQkgICAgc2V0dGluZ3MtPmZpZWxkX3Blcl9idWZmICE9IDIpCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+aW1nX3ggPCAwKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPmltZ195IDwgMCkKKwkJCWVycjArKzsKKwkJaWYgKHNldHRpbmdzLT5pbWdfd2lkdGggPCAwKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPmltZ19oZWlnaHQgPCAwKQorCQkJZXJyMCsrOworCQlpZiAoc2V0dGluZ3MtPmltZ194ICsgc2V0dGluZ3MtPmltZ193aWR0aCA+IEJVWl9NQVhfV0lEVEgpCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+aW1nX3kgKyBzZXR0aW5ncy0+aW1nX2hlaWdodCA+CisJCSAgICBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQllcnIwKys7CisJCWlmIChzZXR0aW5ncy0+SG9yRGNtICYmIHNldHRpbmdzLT5WZXJEY20pIHsKKwkJCWlmIChzZXR0aW5ncy0+aW1nX3dpZHRoICUKKwkJCSAgICAoMTYgKiBzZXR0aW5ncy0+SG9yRGNtKSAhPSAwKQorCQkJCWVycjArKzsKKwkJCWlmIChzZXR0aW5ncy0+aW1nX2hlaWdodCAlCisJCQkgICAgKDggKiBzZXR0aW5ncy0+VmVyRGNtKSAhPSAwKQorCQkJCWVycjArKzsKKwkJfQorCisJCWlmIChlcnIwKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGNoZWNrX2pwZ19zZXR0aW5ncygpIC0gZXJyb3IgaW4gcGFyYW1zIGZvciBkZWNpbWF0aW9uID0gMFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQllcnIrKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBjaGVja19qcGdfc2V0dGluZ3MoKSAtIGRlY2ltYXRpb24gPSAlZCwgbXVzdCBiZSAwLCAxLCAyIG9yIDRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgc2V0dGluZ3MtPmRlY2ltYXRpb24pOworCQllcnIrKzsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNldHRpbmdzLT5qcGdfY29tcC5xdWFsaXR5ID4gMTAwKQorCQlzZXR0aW5ncy0+anBnX2NvbXAucXVhbGl0eSA9IDEwMDsKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLnF1YWxpdHkgPCA1KQorCQlzZXR0aW5ncy0+anBnX2NvbXAucXVhbGl0eSA9IDU7CisJaWYgKHNldHRpbmdzLT5qcGdfY29tcC5BUFBuIDwgMCkKKwkJc2V0dGluZ3MtPmpwZ19jb21wLkFQUG4gPSAwOworCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQVBQbiA+IDE1KQorCQlzZXR0aW5ncy0+anBnX2NvbXAuQVBQbiA9IDE1OworCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQVBQX2xlbiA8IDApCisJCXNldHRpbmdzLT5qcGdfY29tcC5BUFBfbGVuID0gMDsKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkFQUF9sZW4gPiA2MCkKKwkJc2V0dGluZ3MtPmpwZ19jb21wLkFQUF9sZW4gPSA2MDsKKwlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkNPTV9sZW4gPCAwKQorCQlzZXR0aW5ncy0+anBnX2NvbXAuQ09NX2xlbiA9IDA7CisJaWYgKHNldHRpbmdzLT5qcGdfY29tcC5DT01fbGVuID4gNjApCisJCXNldHRpbmdzLT5qcGdfY29tcC5DT01fbGVuID0gNjA7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3pvcmFuX29wZW5faW5pdF9wYXJhbXMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJaW50IGk7CisKKwkvKiBVc2VyIG11c3QgZXhwbGljaXRseSBzZXQgYSB3aW5kb3cgKi8KKwl6ci0+b3ZlcmxheV9zZXR0aW5ncy5pc19zZXQgPSAwOworCXpyLT5vdmVybGF5X21hc2sgPSBOVUxMOworCXpyLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0ZSRUU7CisKKwl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMDsKKwl6ci0+djRsX292ZXJsYXlfYWN0aXZlID0gMDsKKwl6ci0+djRsX2dyYWJfZnJhbWUgPSBOT19HUkFCX0FDVElWRTsKKwl6ci0+djRsX2dyYWJfc2VxID0gMDsKKwl6ci0+djRsX3NldHRpbmdzLndpZHRoID0gMTkyOworCXpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0ID0gMTQ0OworCXpyLT52NGxfc2V0dGluZ3MuZm9ybWF0ID0gJnpvcmFuX2Zvcm1hdHNbN107CS8qIFlVWTIgLSBZVVYtNDoyOjIgcGFja2VkICovCisJenItPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmUgPQorCSAgICB6ci0+djRsX3NldHRpbmdzLndpZHRoICoKKwkgICAgKCh6ci0+djRsX3NldHRpbmdzLmZvcm1hdC0+ZGVwdGggKyA3KSAvIDgpOworCisJLyogRE1BIHJpbmcgc3R1ZmYgZm9yIFY0TCAqLworCXpyLT52NGxfcGVuZF90YWlsID0gMDsKKwl6ci0+djRsX3BlbmRfaGVhZCA9IDA7CisJenItPnY0bF9zeW5jX3RhaWwgPSAwOworCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCWZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgeworCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KKwl9CisJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVaX01BWF9GUkFNRTsgaSsrKSB7CisJCXpyLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsJLyogbm90aGluZyBnb2luZyBvbiAqLworCX0KKwl6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKKwl6ci0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkvKiBTZXQgbmVjZXNzYXJ5IHBhcmFtcyBhbmQgY2FsbCB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MgdG8gc2V0IHRoZSBkZWZhdWx0cyAqLworCXpyLT5qcGdfc2V0dGluZ3MuZGVjaW1hdGlvbiA9IDE7CisJenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5xdWFsaXR5ID0gNTA7CS8qIGRlZmF1bHQgY29tcHJlc3Npb24gZmFjdG9yIDggKi8KKwlpZiAoenItPmNhcmQudHlwZSAhPSBCVVopCisJCXpyLT5qcGdfc2V0dGluZ3Mub2RkX2V2ZW4gPSAxOworCWVsc2UKKwkJenItPmpwZ19zZXR0aW5ncy5vZGRfZXZlbiA9IDA7CisJenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBuID0gMDsKKwl6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9sZW4gPSAwOwkvKiBObyBBUFBuIG1hcmtlciAqLworCW1lbXNldCh6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLCAwLAorCSAgICAgICBzaXplb2YoenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSkpOworCXpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2xlbiA9IDA7CS8qIE5vIENPTSBtYXJrZXIgKi8KKwltZW1zZXQoenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fZGF0YSwgMCwKKwkgICAgICAgc2l6ZW9mKHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2RhdGEpKTsKKwl6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLmpwZWdfbWFya2VycyA9CisJICAgIEpQRUdfTUFSS0VSX0RIVCB8IEpQRUdfTUFSS0VSX0RRVDsKKwlpID0gem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLCAmenItPmpwZ19zZXR0aW5ncyk7CisJaWYgKGkpCisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHpvcmFuX29wZW5faW5pdF9wYXJhbXMoKSBpbnRlcm5hbCBlcnJvclxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKworCWNsZWFyX2ludGVycnVwdF9jb3VudGVycyh6cik7CisJenItPnRlc3RpbmcgPSAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK3Rlc3RfaW50ZXJydXB0cyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgdGltZW91dCwgaWNyOworCisJY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHpyKTsKKworCXpyLT50ZXN0aW5nID0gMTsKKwlpY3IgPSBidHJlYWQoWlIzNjA1N19JQ1IpOworCWJ0d3JpdGUoMHg3ODAwMDAwMCB8IFpSMzYwNTdfSUNSX0ludFBpbkVuLCBaUjM2MDU3X0lDUik7CisJcHJlcGFyZV90b193YWl0KCZ6ci0+dGVzdF9xLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dChIWik7CisJZmluaXNoX3dhaXQoJnpyLT50ZXN0X3EsICZ3YWl0KTsKKwlidHdyaXRlKDAsIFpSMzYwNTdfSUNSKTsKKwlidHdyaXRlKDB4NzgwMDAwMDAsIFpSMzYwNTdfSVNSKTsKKwl6ci0+dGVzdGluZyA9IDA7CisJZHByaW50ayg1LCBLRVJOX0lORk8gIiVzOiBUZXN0aW5nIGludGVycnVwdHMuLi5cbiIsIFpSX0RFVk5BTUUoenIpKTsKKwlpZiAodGltZW91dCkgeworCQlkcHJpbnRrKDEsICI6IHRpbWUgc3BlbnQ6ICVkXG4iLCAxICogSFogLSB0aW1lb3V0KTsKKwl9CisJaWYgKHpyMzYwNjdfZGVidWcgPiAxKQorCQlwcmludF9pbnRlcnJ1cHRzKHpyKTsKKwlidHdyaXRlKGljciwgWlIzNjA1N19JQ1IpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorenIzNjA1N19pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWludCBqLCBlcnI7CisJaW50IHR3byA9IDI7CisJaW50IHplcm8gPSAwOworCisJZHByaW50aygxLAorCQlLRVJOX0lORk8KKwkJIiVzOiB6cjM2MDU3X2luaXQoKSAtIGluaXRpYWxpemluZyBjYXJkWyVkXSwgenI9JXBcbiIsCisJCVpSX0RFVk5BTUUoenIpLCB6ci0+aWQsIHpyKTsKKworCS8qIGRlZmF1bHQgc2V0dXAgb2YgYWxsIHBhcmFtZXRlcnMgd2hpY2ggd2lsbCBwZXJzaXN0IGJldHdlZW4gb3BlbnMgKi8KKwl6ci0+dXNlciA9IDA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ6ci0+djRsX2NhcHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnpyLT5qcGdfY2FwcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmenItPnRlc3RfcSk7CisJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisKKwl6ci0+YnVmZmVyLmJhc2UgPSAodm9pZCAqKSB2aWRtZW07CisJenItPmJ1ZmZlci53aWR0aCA9IDA7CisJenItPmJ1ZmZlci5oZWlnaHQgPSAwOworCXpyLT5idWZmZXIuZGVwdGggPSAwOworCXpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lID0gMDsKKworCS8qIEF2b2lkIG5vbnNlbnNlIHNldHRpbmdzIGZyb20gdXNlciBmb3IgZGVmYXVsdCBpbnB1dC9ub3JtICovCisJaWYgKGRlZmF1bHRfbm9ybSA8IFZJREVPX01PREVfUEFMICYmCisJICAgIGRlZmF1bHRfbm9ybSA+IFZJREVPX01PREVfU0VDQU0pCisJCWRlZmF1bHRfbm9ybSA9IFZJREVPX01PREVfUEFMOworCXpyLT5ub3JtID0gZGVmYXVsdF9ub3JtOworCWlmICghKHpyLT50aW1pbmcgPSB6ci0+Y2FyZC50dm5benItPm5vcm1dKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX1dBUk5JTkcKKwkJCSIlczogenIzNjA1N19pbml0KCkgLSBkZWZhdWx0IFRWIHN0YW5kYXJkIG5vdCBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUuIFBBTCB3aWxsIGJlIHVzZWQuXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQl6ci0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCQl6ci0+dGltaW5nID0genItPmNhcmQudHZuW3pyLT5ub3JtXTsKKwl9CisKKwlpZiAoZGVmYXVsdF9pbnB1dCA+IHpyLT5jYXJkLmlucHV0cy0xKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fV0FSTklORworCQkJIiVzOiBkZWZhdWx0X2lucHV0IHZhbHVlICVkIG91dCBvZiByYW5nZSAoMC0lZClcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgZGVmYXVsdF9pbnB1dCwgenItPmNhcmQuaW5wdXRzLTEpOworCQlkZWZhdWx0X2lucHV0ID0gMDsKKwl9CisJenItPmlucHV0ID0gZGVmYXVsdF9pbnB1dDsKKworCS8qIFNob3VsZCB0aGUgZm9sbG93aW5nIGJlIHJlc2V0IGF0IGV2ZXJ5IG9wZW4gPyAqLworCXpyLT5odWUgPSAzMjc2ODsKKwl6ci0+Y29udHJhc3QgPSAzMjc2ODsKKwl6ci0+c2F0dXJhdGlvbiA9IDMyNzY4OworCXpyLT5icmlnaHRuZXNzID0gMzI3Njg7CisKKwkvKiBkZWZhdWx0IHNldHVwICh3aWxsIGJlIHJlcGVhdGVkIGF0IGV2ZXJ5IG9wZW4pICovCisJem9yYW5fb3Blbl9pbml0X3BhcmFtcyh6cik7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgKmJlZm9yZSogZG9pbmcgYW55dGhpbmcgdG8gdGhlIGhhcmR3YXJlCisJICogaW4gY2FzZSBhbGxvY2F0aW9uIGZhaWxzICovCisJenItPnN0YXRfY29tID0ga3phbGxvYyhCVVpfTlVNX1NUQVRfQ09NICogNCwgR0ZQX0tFUk5FTCk7CisJenItPnZpZGVvX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXpyLT5zdGF0X2NvbSB8fCAhenItPnZpZGVvX2RldikgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6cjM2MDU3X2luaXQoKSAtIGttYWxsb2MgKFNUQVRfQ09NKSBmYWlsZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKwlmb3IgKGogPSAwOyBqIDwgQlVaX05VTV9TVEFUX0NPTTsgaisrKSB7CisJCXpyLT5zdGF0X2NvbVtqXSA9IGNwdV90b19sZTMyKDEpOyAvKiBtYXJrIGFzIHVuYXZhaWxhYmxlIHRvIHpyMzYwNTcgKi8KKwl9CisKKwkvKgorCSAqICAgTm93IGFkZCB0aGUgdGVtcGxhdGUgYW5kIHJlZ2lzdGVyIHRoZSBkZXZpY2UgdW5pdC4KKwkgKi8KKwltZW1jcHkoenItPnZpZGVvX2RldiwgJnpvcmFuX3RlbXBsYXRlLCBzaXplb2Yoem9yYW5fdGVtcGxhdGUpKTsKKwlzdHJjcHkoenItPnZpZGVvX2Rldi0+bmFtZSwgWlJfREVWTkFNRSh6cikpOworCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh6ci0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19uclt6ci0+aWRdKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0X3VucmVnaXN0ZXI7CisKKwl6b3Jhbl9pbml0X2hhcmR3YXJlKHpyKTsKKwlpZiAoenIzNjA2N19kZWJ1ZyA+IDIpCisJCWRldGVjdF9ndWVzdF9hY3Rpdml0eSh6cik7CisJdGVzdF9pbnRlcnJ1cHRzKHpyKTsKKwlpZiAoIXBhc3NfdGhyb3VnaCkgeworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfRU5BQkxFX09VVFBVVCwgJnplcm8pOworCQllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX0lOUFVULCAmdHdvKTsKKwl9CisKKwl6ci0+em9yYW5fcHJvYyA9IE5VTEw7CisJenItPmluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKKworZXhpdF91bnJlZ2lzdGVyOgorCXpvcmFuX3VucmVnaXN0ZXJfaTJjKHpyKTsKK2V4aXRfZnJlZToKKwlrZnJlZSh6ci0+c3RhdF9jb20pOworCWtmcmVlKHpyLT52aWRlb19kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl9yZWxlYXNlIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWlmICghenItPmluaXRpYWxpemVkKQorCQlnb3RvIGV4aXRfZnJlZTsKKwkvKiB1bnJlZ2lzdGVyIHZpZGVvY29kZWMgYnVzICovCisJaWYgKHpyLT5jb2RlYykgeworCQlzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIgKm1hc3RlciA9IHpyLT5jb2RlYy0+bWFzdGVyX2RhdGE7CisKKwkJdmlkZW9jb2RlY19kZXRhY2goenItPmNvZGVjKTsKKwkJa2ZyZWUobWFzdGVyKTsKKwl9CisJaWYgKHpyLT52ZmUpIHsKKwkJc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXIgPSB6ci0+dmZlLT5tYXN0ZXJfZGF0YTsKKworCQl2aWRlb2NvZGVjX2RldGFjaCh6ci0+dmZlKTsKKwkJa2ZyZWUobWFzdGVyKTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGkyYyBidXMgKi8KKwl6b3Jhbl91bnJlZ2lzdGVyX2kyYyh6cik7CisJLyogZGlzYWJsZSBQQ0kgYnVzLW1hc3RlcmluZyAqLworCXpvcmFuX3NldF9wY2lfbWFzdGVyKHpyLCAwKTsKKwkvKiBwdXQgY2hpcCBpbnRvIHJlc2V0ICovCisJYnR3cml0ZSgwLCBaUjM2MDU3X1NQR1BQQ1IpOworCWZyZWVfaXJxKHpyLT5wY2lfZGV2LT5pcnEsIHpyKTsKKwkvKiB1bm1hcCBhbmQgZnJlZSBtZW1vcnkgKi8KKwlrZnJlZSh6ci0+c3RhdF9jb20pOworCXpvcmFuX3Byb2NfY2xlYW51cCh6cik7CisJaW91bm1hcCh6ci0+enIzNjA1N19tZW0pOworCXBjaV9kaXNhYmxlX2RldmljZSh6ci0+cGNpX2Rldik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoenItPnZpZGVvX2Rldik7CitleGl0X2ZyZWU6CisJa2ZyZWUoenIpOworfQorCit2b2lkCit6b3Jhbl92ZGV2X3JlbGVhc2UgKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJa2ZyZWUodmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIgKiBfX2RldmluaXQKK3pvcmFuX3NldHVwX3ZpZGVvY29kZWMgKHN0cnVjdCB6b3JhbiAqenIsCisJCQlpbnQgICAgICAgICAgIHR5cGUpCit7CisJc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptID0gTlVMTDsKKworCW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW0pIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogem9yYW5fc2V0dXBfdmlkZW9jb2RlYygpIC0gbm8gbWVtb3J5XG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gbTsKKwl9CisKKwkvKiBtYWdpYyBhbmQgdHlwZSBhcmUgdW51c2VkIGZvciBtYXN0ZXIgc3RydWN0LiBNYWtlcyBzZW5zZSBvbmx5IGF0CisJICAgY29kZWMgc3RydWN0cy4KKwkgICBJbiB0aGUgcGFzdCwgLnR5cGUgd2VyZSBpbml0aWFsaXplZCB0byB0aGUgb2xkIFY0TDEgLmhhcmR3YXJlCisJICAgdmFsdWUsIGFzIFZJRF9IQVJEV0FSRV9aUjM2MDY3CisJICovCisJbS0+bWFnaWMgPSAwTDsKKwltLT50eXBlID0gMDsKKworCW0tPmZsYWdzID0gQ09ERUNfRkxBR19FTkNPREVSIHwgQ09ERUNfRkxBR19ERUNPREVSOworCXN0cm5jcHkobS0+bmFtZSwgWlJfREVWTkFNRSh6ciksIHNpemVvZihtLT5uYW1lKSk7CisJbS0+ZGF0YSA9IHpyOworCisJc3dpdGNoICh0eXBlKQorCXsKKwljYXNlIENPREVDX1RZUEVfWlIzNjA2MDoKKwkJbS0+cmVhZHJlZyA9IHpyMzYwNjBfcmVhZDsKKwkJbS0+d3JpdGVyZWcgPSB6cjM2MDYwX3dyaXRlOworCQltLT5mbGFncyB8PSBDT0RFQ19GTEFHX0pQRUcgfCBDT0RFQ19GTEFHX1ZGRTsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1pSMzYwNTA6CisJCW0tPnJlYWRyZWcgPSB6cjM2MDUwX3JlYWQ7CisJCW0tPndyaXRlcmVnID0genIzNjA1MF93cml0ZTsKKwkJbS0+ZmxhZ3MgfD0gQ09ERUNfRkxBR19KUEVHOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfWlIzNjAxNjoKKwkJbS0+cmVhZHJlZyA9IHpyMzYwMTZfcmVhZDsKKwkJbS0+d3JpdGVyZWcgPSB6cjM2MDE2X3dyaXRlOworCQltLT5mbGFncyB8PSBDT0RFQ19GTEFHX1ZGRTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG07Cit9CisKKy8qCisgKiAgIFNjYW4gZm9yIGEgQnV6IGNhcmQgKGFjdHVhbGx5IGZvciB0aGUgUENJIGNvbnRyb2xsZXIgWlIzNjA1NyksCisgKiAgIHJlcXVlc3QgdGhlIGlycSBhbmQgbWFwIHRoZSBpbyBtZW1vcnkKKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK2ZpbmRfenIzNjA1NyAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGxhdGVuY3ksIG5lZWRfbGF0ZW5jeTsKKwlzdHJ1Y3Qgem9yYW4gKnpyOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCByZXN1bHQ7CisJc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXJfdmZlID0gTlVMTDsKKwlzdHJ1Y3QgdmlkZW9jb2RlY19tYXN0ZXIgKm1hc3Rlcl9jb2RlYyA9IE5VTEw7CisJaW50IGNhcmRfbnVtOworCWNoYXIgKmkyY19lbmNfbmFtZSwgKmkyY19kZWNfbmFtZSwgKmNvZGVjX25hbWUsICp2ZmVfbmFtZTsKKworCXpvcmFuX251bSA9IDA7CisJd2hpbGUgKHpvcmFuX251bSA8IEJVWl9NQVggJiYKKwkgICAgICAgKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfWk9SQU4sIFBDSV9ERVZJQ0VfSURfWk9SQU5fMzYwNTcsIGRldikpICE9IE5VTEwpIHsKKwkJY2FyZF9udW0gPSBjYXJkW3pvcmFuX251bV07CisJCXpyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghenIpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBremFsbG9jIGZhaWxlZFxuIiwKKwkJCQlaT1JBTl9OQU1FKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXpyLT5wY2lfZGV2ID0gZGV2OworCQkvL3pyLT56cjM2MDU3X21lbSA9IE5VTEw7CisJCXpyLT5pZCA9IHpvcmFuX251bTsKKwkJc25wcmludGYoWlJfREVWTkFNRSh6ciksIHNpemVvZihaUl9ERVZOQU1FKHpyKSksICJNSlBFR1sldV0iLCB6ci0+aWQpOworCQlzcGluX2xvY2tfaW5pdCgmenItPnNwaW5sb2NrKTsKKwkJbXV0ZXhfaW5pdCgmenItPnJlc291cmNlX2xvY2spOworCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJCWdvdG8genJfZnJlZV9tZW07CisJCXpyLT56cjM2MDU3X2FkciA9IHBjaV9yZXNvdXJjZV9zdGFydCh6ci0+cGNpX2RldiwgMCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHpyLT5wY2lfZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sCisJCQkJICAgICAmenItPnJldmlzaW9uKTsKKwkJaWYgKHpyLT5yZXZpc2lvbiA8IDIpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IFpvcmFuIFpSMzYwNTcgKHJldiAlZCkgaXJxOiAlZCwgbWVtb3J5OiAweCUwOHguXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCB6ci0+cmV2aXNpb24sIHpyLT5wY2lfZGV2LT5pcnEsCisJCQkJenItPnpyMzYwNTdfYWRyKTsKKworCQkJaWYgKGNhcmRfbnVtID09IC0xKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gbm8gY2FyZCBzcGVjaWZpZWQsIHBsZWFzZSB1c2UgdGhlIGNhcmQ9WCBpbnNtb2Qgb3B0aW9uXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJZ290byB6cl9mcmVlX21lbTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBpOworCQkJdW5zaWduZWQgc2hvcnQgc3NfdmVuZG9yLCBzc19kZXZpY2U7CisKKwkJCXNzX3ZlbmRvciA9IHpyLT5wY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCQkJc3NfZGV2aWNlID0genItPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9JTkZPCisJCQkJIiVzOiBab3JhbiBaUjM2MDY3IChyZXYgJWQpIGlycTogJWQsIG1lbW9yeTogMHglMDh4XG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCB6ci0+cmV2aXNpb24sIHpyLT5wY2lfZGV2LT5pcnEsCisJCQkJenItPnpyMzYwNTdfYWRyKTsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IHN1YnN5c3RlbSB2ZW5kb3I9MHglMDR4IGlkPTB4JTA0eFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgc3NfdmVuZG9yLCBzc19kZXZpY2UpOworCQkJaWYgKGNhcmRfbnVtID09IC0xKSB7CisJCQkJZHByaW50aygzLAorCQkJCQlLRVJOX0RFQlVHCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSB0cnlpbmcgdG8gYXV0b2RldGVjdCBjYXJkIHR5cGVcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlmb3IgKGk9MDtpPE5VTV9DQVJEUztpKyspIHsKKwkJCQkJaWYgKHNzX3ZlbmRvciA9PSB6b3Jhbl9jYXJkc1tpXS52ZW5kb3JfaWQgJiYKKwkJCQkJICAgIHNzX2RldmljZSA9PSB6b3Jhbl9jYXJkc1tpXS5kZXZpY2VfaWQpIHsKKwkJCQkJCWRwcmludGsoMywKKwkJCQkJCQlLRVJOX0RFQlVHCisJCQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGNhcmQgJXMgZGV0ZWN0ZWRcbiIsCisJCQkJCQkJWlJfREVWTkFNRSh6ciksCisJCQkJCQkJem9yYW5fY2FyZHNbaV0ubmFtZSk7CisJCQkJCQljYXJkX251bSA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaSA9PSBOVU1fQ0FSRFMpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSB1bmtub3duIGNhcmRcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJCWdvdG8genJfZnJlZV9tZW07CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGNhcmRfbnVtIDwgMCB8fCBjYXJkX251bSA+PSBOVU1fQ0FSRFMpIHsKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBpbnZhbGlkIGNhcmRudW0gJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGNhcmRfbnVtKTsKKwkJCWdvdG8genJfZnJlZV9tZW07CisJCX0KKworCQkvKiBldmVuIHRob3VnaCB3ZSBtYWtlIHRoaXMgYSBub24gcG9pbnRlciBhbmQgdGh1cworCQkgKiB0aGVvcmV0aWNhbGx5IGFsbG93IGZvciBtYWtpbmcgY2hhbmdlcyB0byB0aGlzIHN0cnVjdAorCQkgKiBvbiBhIHBlci1pbmRpdmlkdWFsIGNhcmQgYmFzaXMgYXQgcnVudGltZSwgdGhpcyBpcworCQkgKiBzdHJvbmdseSBkaXNjb3VyYWdlZC4gVGhpcyBzdHJ1Y3R1cmUgaXMgaW50ZW5kZWQgdG8KKwkJICoga2VlcCBnZW5lcmFsIGNhcmQgaW5mb3JtYXRpb24sIG5vIHNldHRpbmdzIG9yIGFueXRoaW5nICovCisJCXpyLT5jYXJkID0gem9yYW5fY2FyZHNbY2FyZF9udW1dOworCQlzbnByaW50ZihaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKFpSX0RFVk5BTUUoenIpKSwKKwkJCSAiJXNbJXVdIiwgenItPmNhcmQubmFtZSwgenItPmlkKTsKKworCQl6ci0+enIzNjA1N19tZW0gPSBpb3JlbWFwX25vY2FjaGUoenItPnpyMzYwNTdfYWRyLCAweDEwMDApOworCQlpZiAoIXpyLT56cjM2MDU3X21lbSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGlvcmVtYXAgZmFpbGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCWdvdG8genJfZnJlZV9tZW07CisJCX0KKworCQlyZXN1bHQgPSByZXF1ZXN0X2lycSh6ci0+cGNpX2Rldi0+aXJxLAorCQkJCSAgICAgem9yYW5faXJxLAorCQkJCSAgICAgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgWlJfREVWTkFNRSh6ciksCisJCQkJICAgICAodm9pZCAqKSB6cik7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlpZiAocmVzdWx0ID09IC1FSU5WQUwpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBiYWQgaXJxIG51bWJlciBvciBoYW5kbGVyXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAtRUJVU1kpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBJUlEgJWQgYnVzeSwgY2hhbmdlIHlvdXIgUG5QIGNvbmZpZyBpbiBCSU9TXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgenItPnBjaV9kZXYtPmlycSk7CisJCQl9IGVsc2UgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGNhbid0IGFzc2lnbiBpcnEsIGVycm9yIGNvZGUgJWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCByZXN1bHQpOworCQkJfQorCQkJZ290byB6cl91bm1hcDsKKwkJfQorCisJCS8qIHNldCBQQ0kgbGF0ZW5jeSB0aW1lciAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSh6ci0+cGNpX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsCisJCQkJICAgICAmbGF0ZW5jeSk7CisJCW5lZWRfbGF0ZW5jeSA9IHpyLT5yZXZpc2lvbiA+IDEgPyAzMiA6IDQ4OworCQlpZiAobGF0ZW5jeSAhPSBuZWVkX2xhdGVuY3kpIHsKKwkJCWRwcmludGsoMiwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IENoYW5naW5nIFBDSSBsYXRlbmN5IGZyb20gJWQgdG8gJWQuXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBsYXRlbmN5LCBuZWVkX2xhdGVuY3kpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHpyLT5wY2lfZGV2LAorCQkJCQkgICAgICBQQ0lfTEFURU5DWV9USU1FUiwKKwkJCQkJICAgICAgbmVlZF9sYXRlbmN5KTsKKwkJfQorCisJCXpyMzYwNTdfcmVzdGFydCh6cik7CisJCS8qIGkyYyAqLworCQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBpMmMgYnVzLi4uXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCisJCS8qIGkyYyBkZWNvZGVyICovCisJCWlmIChkZWNvZGVyW3pyLT5pZF0gIT0gLTEpIHsKKwkJCWkyY19kZWNfbmFtZSA9IGkyY2lkX3RvX21vZHVsZW5hbWUoZGVjb2Rlclt6ci0+aWRdKTsKKwkJCXpyLT5jYXJkLmkyY19kZWNvZGVyID0gZGVjb2Rlclt6ci0+aWRdOworCQl9IGVsc2UgaWYgKHpyLT5jYXJkLmkyY19kZWNvZGVyICE9IDApIHsKKwkJCWkyY19kZWNfbmFtZSA9CisJCQkJaTJjaWRfdG9fbW9kdWxlbmFtZSh6ci0+Y2FyZC5pMmNfZGVjb2Rlcik7CisJCX0gZWxzZSB7CisJCQlpMmNfZGVjX25hbWUgPSBOVUxMOworCQl9CisKKwkJaWYgKGkyY19kZWNfbmFtZSkgeworCQkJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZShpMmNfZGVjX25hbWUpKSA8IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmFpbGVkIHRvIGxvYWQgbW9kdWxlICVzOiAlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkyY19kZWNfbmFtZSwgcmVzdWx0KTsKKwkJCX0KKwkJfQorCisJCS8qIGkyYyBlbmNvZGVyICovCisJCWlmIChlbmNvZGVyW3pyLT5pZF0gIT0gLTEpIHsKKwkJCWkyY19lbmNfbmFtZSA9IGkyY2lkX3RvX21vZHVsZW5hbWUoZW5jb2Rlclt6ci0+aWRdKTsKKwkJCXpyLT5jYXJkLmkyY19lbmNvZGVyID0gZW5jb2Rlclt6ci0+aWRdOworCQl9IGVsc2UgaWYgKHpyLT5jYXJkLmkyY19lbmNvZGVyICE9IDApIHsKKwkJCWkyY19lbmNfbmFtZSA9CisJCQkJaTJjaWRfdG9fbW9kdWxlbmFtZSh6ci0+Y2FyZC5pMmNfZW5jb2Rlcik7CisJCX0gZWxzZSB7CisJCQlpMmNfZW5jX25hbWUgPSBOVUxMOworCQl9CisKKwkJaWYgKGkyY19lbmNfbmFtZSkgeworCQkJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZShpMmNfZW5jX25hbWUpKSA8IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmFpbGVkIHRvIGxvYWQgbW9kdWxlICVzOiAlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6ciksIGkyY19lbmNfbmFtZSwgcmVzdWx0KTsKKwkJCX0KKwkJfQorCisJCWlmICh6b3Jhbl9yZWdpc3Rlcl9pMmMoenIpIDwgMCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIGNhbid0IGluaXRpYWxpemUgaTJjIGJ1c1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlnb3RvIHpyX2ZyZWVfaXJxOworCQl9CisKKwkJZHByaW50aygyLAorCQkJS0VSTl9JTkZPICIlczogSW5pdGlhbGl6aW5nIHZpZGVvY29kZWMgYnVzLi4uXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCisJCWlmICh6ci0+Y2FyZC52aWRlb19jb2RlYyAhPSAwICYmCisJCSAgICAoY29kZWNfbmFtZSA9CisJCSAgICAgY29kZWNpZF90b19tb2R1bGVuYW1lKHpyLT5jYXJkLnZpZGVvX2NvZGVjKSkgIT0gTlVMTCkgeworCQkJaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZShjb2RlY19uYW1lKSkgPCAwKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZhaWxlZCB0byBsb2FkIG1vZHVsZXMgJXM6ICVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgY29kZWNfbmFtZSwgcmVzdWx0KTsKKwkJCX0KKwkJfQorCQlpZiAoenItPmNhcmQudmlkZW9fdmZlICE9IDAgJiYKKwkJICAgICh2ZmVfbmFtZSA9CisJCSAgICAgY29kZWNpZF90b19tb2R1bGVuYW1lKHpyLT5jYXJkLnZpZGVvX3ZmZSkpICE9IE5VTEwpIHsKKwkJCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUodmZlX25hbWUpKSA8IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogZmFpbGVkIHRvIGxvYWQgbW9kdWxlcyAlczogJWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCB2ZmVfbmFtZSwgcmVzdWx0KTsKKwkJCX0KKwkJfQorCisJCS8qIHJlc2V0IEpQRUcgY29kZWMgKi8KKwkJanBlZ19jb2RlY19zbGVlcCh6ciwgMSk7CisJCWpwZWdfY29kZWNfcmVzZXQoenIpOworCQkvKiB2aWRlbyBidXMgZW5hYmxlZCAqLworCQkvKiBkaXNwbGF5IGNvZGVjIHJldmlzaW9uICovCisJCWlmICh6ci0+Y2FyZC52aWRlb19jb2RlYyAhPSAwKSB7CisJCQltYXN0ZXJfY29kZWMgPSB6b3Jhbl9zZXR1cF92aWRlb2NvZGVjKHpyLAorCQkJCQkJCSAgICAgIHpyLT5jYXJkLnZpZGVvX2NvZGVjKTsKKwkJCWlmICghbWFzdGVyX2NvZGVjKQorCQkJCWdvdG8genJfdW5yZWdfaTJjOworCQkJenItPmNvZGVjID0gdmlkZW9jb2RlY19hdHRhY2gobWFzdGVyX2NvZGVjKTsKKwkJCWlmICghenItPmNvZGVjKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gbm8gY29kZWMgZm91bmRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlnb3RvIHpyX2ZyZWVfY29kZWM7CisJCQl9CisJCQlpZiAoenItPmNvZGVjLT50eXBlICE9IHpyLT5jYXJkLnZpZGVvX2NvZGVjKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gd3JvbmcgY29kZWNcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlnb3RvIHpyX2RldGFjaF9jb2RlYzsKKwkJCX0KKwkJfQorCQlpZiAoenItPmNhcmQudmlkZW9fdmZlICE9IDApIHsKKwkJCW1hc3Rlcl92ZmUgPSB6b3Jhbl9zZXR1cF92aWRlb2NvZGVjKHpyLAorCQkJCQkJCSAgICB6ci0+Y2FyZC52aWRlb192ZmUpOworCQkJaWYgKCFtYXN0ZXJfdmZlKQorCQkJCWdvdG8genJfZGV0YWNoX2NvZGVjOworCQkJenItPnZmZSA9IHZpZGVvY29kZWNfYXR0YWNoKG1hc3Rlcl92ZmUpOworCQkJaWYgKCF6ci0+dmZlKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gbm8gVkZFIGZvdW5kXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJZ290byB6cl9mcmVlX3ZmZTsKKwkJCX0KKwkJCWlmICh6ci0+dmZlLT50eXBlICE9IHpyLT5jYXJkLnZpZGVvX3ZmZSkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSA9IHdyb25nIFZGRVxuIiwKKwkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCWdvdG8genJfZGV0YWNoX3ZmZTsKKwkJCX0KKwkJfQorCQkvKiBTdWNjZXNzIHNvIGtlZXAgdGhlIHBjaV9kZXYgcmVmZXJlbmNlZCAqLworCQlwY2lfZGV2X2dldCh6ci0+cGNpX2Rldik7CisJCXpvcmFuW3pvcmFuX251bSsrXSA9IHpyOworCQljb250aW51ZTsKKworCQkvLyBJbml0IGVycm9ycworCSAgICAgIHpyX2RldGFjaF92ZmU6CisJCXZpZGVvY29kZWNfZGV0YWNoKHpyLT52ZmUpOworCSAgICAgIHpyX2ZyZWVfdmZlOgorCQlrZnJlZShtYXN0ZXJfdmZlKTsKKwkgICAgICB6cl9kZXRhY2hfY29kZWM6CisJCXZpZGVvY29kZWNfZGV0YWNoKHpyLT5jb2RlYyk7CisJICAgICAgenJfZnJlZV9jb2RlYzoKKwkJa2ZyZWUobWFzdGVyX2NvZGVjKTsKKwkgICAgICB6cl91bnJlZ19pMmM6CisJCXpvcmFuX3VucmVnaXN0ZXJfaTJjKHpyKTsKKwkgICAgICB6cl9mcmVlX2lycToKKwkJYnR3cml0ZSgwLCBaUjM2MDU3X1NQR1BQQ1IpOworCQlmcmVlX2lycSh6ci0+cGNpX2Rldi0+aXJxLCB6cik7CisJICAgICAgenJfdW5tYXA6CisJCWlvdW5tYXAoenItPnpyMzYwNTdfbWVtKTsKKwkgICAgICB6cl9mcmVlX21lbToKKwkJa2ZyZWUoenIpOworCQljb250aW51ZTsKKwl9CisJaWYgKGRldikJLyogQ2xlYW4gdXAgcmVmIGNvdW50IG9uIGVhcmx5IGV4aXQgKi8KKwkJcGNpX2Rldl9wdXQoZGV2KTsKKworCWlmICh6b3Jhbl9udW0gPT0gMCkgeworCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiTm8ga25vd24gTUpQRUcgY2FyZHMgZm91bmQuXG4iKTsKKwl9CisJcmV0dXJuIHpvcmFuX251bTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2luaXRfZGMxMF9jYXJkcyAodm9pZCkKK3sKKwlpbnQgaTsKKworCW1lbXNldCh6b3JhbiwgMCwgc2l6ZW9mKHpvcmFuKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiWm9yYW4gTUpQRUcgYm9hcmQgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJICAgICAgIE1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04sIFJFTEVBU0VfVkVSU0lPTik7CisKKwkvKiBMb29rIGZvciBjYXJkcyAqLworCWlmIChmaW5kX3pyMzYwNTcoKSA8IDApIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICh6b3Jhbl9udW0gPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiAlZCBjYXJkKHMpIGZvdW5kXG4iLCBaT1JBTl9OQU1FLAorCQl6b3Jhbl9udW0pOworCS8qIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIHdlIGhhdmUgYmVlbiBnaXZlbiwgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLworCWlmICh2NGxfbmJ1ZnMgPCAyKQorCQl2NGxfbmJ1ZnMgPSAyOworCWlmICh2NGxfbmJ1ZnMgPiBWSURFT19NQVhfRlJBTUUpCisJCXY0bF9uYnVmcyA9IFZJREVPX01BWF9GUkFNRTsKKwkvKiBUaGUgdXNlciBzcGVjZmllcyB0aGUgaW4gS0IsIHdlIHdhbnQgdGhlbSBpbiBieXRlCisJICogKGFuZCBwYWdlIGFsaWduZWQpICovCisJdjRsX2J1ZnNpemUgPSBQQUdFX0FMSUdOKHY0bF9idWZzaXplICogMTAyNCk7CisJaWYgKHY0bF9idWZzaXplIDwgMzI3NjgpCisJCXY0bF9idWZzaXplID0gMzI3Njg7CisJLyogMiBNQiBpcyBhcmJpdHJhcnkgYnV0IHN1ZmZpY2llbnQgZm9yIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGltYWdlcyAqLworCWlmICh2NGxfYnVmc2l6ZSA+IDIwNDggKiAxMDI0KQorCQl2NGxfYnVmc2l6ZSA9IDIwNDggKiAxMDI0OworCWlmIChqcGdfbmJ1ZnMgPCA0KQorCQlqcGdfbmJ1ZnMgPSA0OworCWlmIChqcGdfbmJ1ZnMgPiBCVVpfTUFYX0ZSQU1FKQorCQlqcGdfbmJ1ZnMgPSBCVVpfTUFYX0ZSQU1FOworCWpwZ19idWZzaXplID0gUEFHRV9BTElHTihqcGdfYnVmc2l6ZSAqIDEwMjQpOworCWlmIChqcGdfYnVmc2l6ZSA8IDgxOTIpCisJCWpwZ19idWZzaXplID0gODE5MjsKKwlpZiAoanBnX2J1ZnNpemUgPiAoNTEyICogMTAyNCkpCisJCWpwZ19idWZzaXplID0gNTEyICogMTAyNDsKKwkvKiBVc2UgcGFyYW1ldGVyIGZvciB2aWRtZW0gb3IgdHJ5IHRvIGZpbmQgYSB2aWRlbyBjYXJkICovCisJaWYgKHZpZG1lbSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0lORk8KKwkJCSIlczogVXNpbmcgc3VwcGxpZWQgdmlkZW8gbWVtb3J5IGJhc2UgYWRkcmVzcyBAIDB4JWx4XG4iLAorCQkJWk9SQU5fTkFNRSwgdmlkbWVtKTsKKwl9CisKKwkvKiByYW5kb20gbm9uc2Vuc2UgKi8KKwlkcHJpbnRrKDYsIEtFUk5fREVCVUcgIkpvdHRpIGlzIGVlbiBoZWxkIVxuIik7CisKKwkvKiBzb21lIG1haW5ib2FyZHMgbWlnaHQgbm90IGRvIFBDSS1QQ0kgZGF0YSB0cmFuc2ZlciB3ZWxsICovCisJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiAoUENJUENJX0ZBSUx8UENJQUdQX0ZBSUx8UENJUENJX0FMSU1BR0lLKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX1dBUk5JTkcKKwkJCSIlczogY2hpcHNldCBkb2VzIG5vdCBzdXBwb3J0IHJlbGlhYmxlIFBDSS1QQ0kgRE1BXG4iLAorCQkJWk9SQU5fTkFNRSk7CisJfQorCisJLyogdGFrZSBjYXJlIG9mIE5hdG9tYSBjaGlwc2V0IGFuZCBhIHJldmlzaW9uIDEgenIzNjA1NyAqLworCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW07IGkrKykgeworCQlzdHJ1Y3Qgem9yYW4gKnpyID0gem9yYW5baV07CisKKwkJaWYgKChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX05BVE9NQSkgJiYgenItPnJldmlzaW9uIDw9IDEpIHsKKwkJCXpyLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMgPSAxOworCQkJZHByaW50aygxLAorCQkJCUtFUk5fSU5GTworCQkJCSIlczogWlIzNjA1Ny9OYXRvbWEgYnVnLCBtYXguIGJ1ZmZlciBzaXplIGlzIDEyOEtcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQl9CisKKwkJaWYgKHpyMzYwNTdfaW5pdCh6cikgPCAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtOyBpKyspCisJCQkJem9yYW5fcmVsZWFzZSh6b3JhbltpXSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQl6b3Jhbl9wcm9jX2luaXQoenIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3VubG9hZF9kYzEwX2NhcmRzICh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bTsgaSsrKQorCQl6b3Jhbl9yZWxlYXNlKHpvcmFuW2ldKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9kYzEwX2NhcmRzKTsKK21vZHVsZV9leGl0KHVubG9hZF9kYzEwX2NhcmRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9jYXJkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NDhmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZGV2aWNlLmMKQEAgLTAsMCArMSwxNzQ3IEBACisvKgorICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQorICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4CisgKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgorICoKKyAqIFRoaXMgcGFydCBoYW5kbGVzIGRldmljZSBhY2Nlc3MgKFBDSS9JMkMvY29kZWMvLi4uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KKyAqCisgKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKKyAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgorICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAidmlkZW9jb2RlYy5oIgorI2luY2x1ZGUgInpvcmFuLmgiCisjaW5jbHVkZSAiem9yYW5fZGV2aWNlLmgiCisjaW5jbHVkZSAiem9yYW5fY2FyZC5oIgorCisjZGVmaW5lIElSUV9NQVNLICggWlIzNjA1N19JU1JfR0lSUTAgfCBcCisJCSAgIFpSMzYwNTdfSVNSX0dJUlExIHwgXAorCQkgICBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRICkKKworc3RhdGljIGludCBsbWwzM2RwYXRoOwkJLyogZGVmYXVsdCA9IDAKKwkJCQkgKiAxIHdpbGwgdXNlIGRpZ2l0YWwgcGF0aCBpbiBjYXB0dXJlCisJCQkJICogbW9kZSBpbnN0ZWFkIG9mIGFuYWxvZy4gSXQgY2FuIGJlCisJCQkJICogdXNlZCBmb3IgcGljdHVyZSBhZGp1c3RtZW50cyB1c2luZworCQkJCSAqIHRvb2wgbGlrZSB4YXd0diB3aGlsZSB3YXRjaGluZyBpbWFnZQorCQkJCSAqIG9uIFRWIG1vbml0b3IgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQuCisJCQkJICogSG93ZXZlciwgZHVlIHRvIGFic2VuY2Ugb2YgNzUgT2htCisJCQkJICogbG9hZCBvbiBCdDgxOSBpbnB1dCwgdGhlcmUgd2lsbCBiZQorCQkJCSAqIHNvbWUgaW1hZ2UgaW1wZXJmZWN0aW9ucyAqLworCittb2R1bGVfcGFyYW0obG1sMzNkcGF0aCwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxtbDMzZHBhdGgsCisJCSAiVXNlIGRpZ2l0YWwgcGF0aCBjYXB0dXJlIG1vZGUgKG9uIExNTDMzIGNhcmRzKSIpOworCitzdGF0aWMgdm9pZAorenIzNjA1N19pbml0X3ZmZSAoc3RydWN0IHpvcmFuICp6cik7CisKKy8qCisgKiBHZW5lcmFsIFB1cnBvc2UgSS9PIGFuZCBHdWVzdCBidXMgYWNjZXNzCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBiaXQgdHJpY2t5LiBXaGVuIGEgYm9hcmQgbGFja3MgYSBHUElPIGZ1bmN0aW9uLCB0aGUgY29ycmVzcG9uZGluZworICogR1BJTyBiaXQgbnVtYmVyIGluIHRoZSBjYXJkX2luZm8gc3RydWN0dXJlIGlzIHNldCB0byAwLgorICovCisKK3ZvaWQKK0dQSU8gKHN0cnVjdCB6b3JhbiAqenIsCisgICAgICBpbnQgICAgICAgICAgIGJpdCwKKyAgICAgIHVuc2lnbmVkIGludCAgdmFsdWUpCit7CisJdTMyIHJlZzsKKwl1MzIgbWFzazsKKworCS8qIE1ha2Ugc3VyZSB0aGUgYml0IG51bWJlciBpcyBsZWdhbAorCSAqIEEgYml0IG51bWJlciBvZiAtMSAobGFja2luZykgZ2l2ZXMgYSBtYXNrIG9mIDAsCisJICogbWFraW5nIGl0IGhhcm1sZXNzICovCisJbWFzayA9ICgxIDw8ICgyNCArIGJpdCkpICYgMHhmZjAwMDAwMDsKKwlyZWcgPSBidHJlYWQoWlIzNjA1N19HUFBHQ1IxKSAmIH5tYXNrOworCWlmICh2YWx1ZSkgeworCQlyZWcgfD0gbWFzazsKKwl9CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfR1BQR0NSMSk7CisJdWRlbGF5KDEpOworfQorCisvKgorICogV2FpdCB0aWwgcG9zdCBvZmZpY2UgaXMgbm8gbG9uZ2VyIGJ1c3kKKyAqLworCitpbnQKK3Bvc3Rfb2ZmaWNlX3dhaXQgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJdTMyIHBvcjsKKworLy8gICAgICB3aGlsZSAoKChwb3IgPSBidHJlYWQoWlIzNjA1N19QT1IpKSAmIChaUjM2MDU3X1BPUl9QT1BlbiB8IFpSMzYwNTdfUE9SX1BPVGltZSkpID09IFpSMzYwNTdfUE9SX1BPUGVuKSB7CisJd2hpbGUgKChwb3IgPSBidHJlYWQoWlIzNjA1N19QT1IpKSAmIFpSMzYwNTdfUE9SX1BPUGVuKSB7CisJCS8qIHdhaXQgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4gKi8KKwl9CisJaWYgKChwb3IgJiBaUjM2MDU3X1BPUl9QT1RpbWUpICYmICF6ci0+Y2FyZC5nd3Nfbm90X2Nvbm5lY3RlZCkgeworCQkvKiBJbiBMTUwzMy9CVVogXEdXUyBsaW5lIGlzIG5vdCBjb25uZWN0ZWQsIHNvIGl0IGhhcyBhbHdheXMgdGltZW91dCBzZXQgKi8KKwkJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOiBwb3AgdGltZW91dCAlMDh4XG4iLCBaUl9ERVZOQU1FKHpyKSwKKwkJCXBvcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citwb3N0X29mZmljZV93cml0ZSAoc3RydWN0IHpvcmFuICp6ciwKKwkJICAgdW5zaWduZWQgaW50ICBndWVzdCwKKwkJICAgdW5zaWduZWQgaW50ICByZWcsCisJCSAgIHVuc2lnbmVkIGludCAgdmFsdWUpCit7CisJdTMyIHBvcjsKKworCXBvciA9CisJICAgIFpSMzYwNTdfUE9SX1BPRGlyIHwgWlIzNjA1N19QT1JfUE9UaW1lIHwgKChndWVzdCAmIDcpIDw8IDIwKSB8CisJICAgICgocmVnICYgNykgPDwgMTYpIHwgKHZhbHVlICYgMHhGRik7CisJYnR3cml0ZShwb3IsIFpSMzYwNTdfUE9SKTsKKworCXJldHVybiBwb3N0X29mZmljZV93YWl0KHpyKTsKK30KKworaW50Citwb3N0X29mZmljZV9yZWFkIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgIHVuc2lnbmVkIGludCAgZ3Vlc3QsCisJCSAgdW5zaWduZWQgaW50ICByZWcpCit7CisJdTMyIHBvcjsKKworCXBvciA9IFpSMzYwNTdfUE9SX1BPVGltZSB8ICgoZ3Vlc3QgJiA3KSA8PCAyMCkgfCAoKHJlZyAmIDcpIDw8IDE2KTsKKwlidHdyaXRlKHBvciwgWlIzNjA1N19QT1IpOworCWlmIChwb3N0X29mZmljZV93YWl0KHpyKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBidHJlYWQoWlIzNjA1N19QT1IpICYgMHhGRjsKK30KKworLyoKKyAqIGRldGVjdCBndWVzdHMKKyAqLworCitzdGF0aWMgdm9pZAorZHVtcF9ndWVzdHMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJaWYgKHpyMzYwNjdfZGVidWcgPiAyKSB7CisJCWludCBpLCBndWVzdFs4XTsKKworCQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CS8vIERvbid0IHJlYWQganBlZyBjb2RlYyBoZXJlCisJCQlndWVzdFtpXSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIGksIDApOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEd1ZXN0czoiLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQkJcHJpbnRrKCIgMHglMDJ4IiwgZ3Vlc3RbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZ2V0X3RpbWUgKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlyZXR1cm4gKDEwMDAwMDAgKiB0di50dl9zZWMgKyB0di50dl91c2VjKTsKK30KKwordm9pZAorZGV0ZWN0X2d1ZXN0X2FjdGl2aXR5IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWludCB0aW1lb3V0LCBpLCBqLCByZXMsIGd1ZXN0WzhdLCBndWVzdDBbOF0sIGNoYW5nZVs4XVszXTsKKwl1bnNpZ25lZCBsb25nIHQwLCB0MTsKKworCWR1bXBfZ3Vlc3RzKHpyKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRGV0ZWN0aW5nIGd1ZXN0cyBhY3Rpdml0eSwgcGxlYXNlIHdhaXQuLi5cbiIsCisJICAgICAgIFpSX0RFVk5BTUUoenIpKTsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7CS8vIERvbid0IHJlYWQganBlZyBjb2RlYyBoZXJlCisJCWd1ZXN0MFtpXSA9IGd1ZXN0W2ldID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgaSwgMCk7CisJfQorCisJdGltZW91dCA9IDA7CisJaiA9IDA7CisJdDAgPSBnZXRfdGltZSgpOworCXdoaWxlICh0aW1lb3V0IDwgMTAwMDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJdGltZW91dCsrOworCQlmb3IgKGkgPSAxOyAoaSA8IDgpICYmIChqIDwgOCk7IGkrKykgeworCQkJcmVzID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgaSwgMCk7CisJCQlpZiAocmVzICE9IGd1ZXN0W2ldKSB7CisJCQkJdDEgPSBnZXRfdGltZSgpOworCQkJCWNoYW5nZVtqXVswXSA9ICh0MSAtIHQwKTsKKwkJCQl0MCA9IHQxOworCQkJCWNoYW5nZVtqXVsxXSA9IGk7CisJCQkJY2hhbmdlW2pdWzJdID0gcmVzOworCQkJCWorKzsKKwkJCQlndWVzdFtpXSA9IHJlczsKKwkJCX0KKwkJfQorCQlpZiAoaiA+PSA4KQorCQkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBHdWVzdHM6IiwgWlJfREVWTkFNRSh6cikpOworCisJZm9yIChpID0gMTsgaSA8IDg7IGkrKykgeworCQlwcmludGsoIiAweCUwMngiLCBndWVzdDBbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJaWYgKGogPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gYWN0aXZpdHkgZGV0ZWN0ZWQuXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogJTZkOiAlZCA9PiAweCUwMnhcbiIsIFpSX0RFVk5BTUUoenIpLAorCQkgICAgICAgY2hhbmdlW2ldWzBdLCBjaGFuZ2VbaV1bMV0sIGNoYW5nZVtpXVsyXSk7CisJfQorfQorCisvKgorICogSlBFRyBDb2RlYyBhY2Nlc3MKKyAqLworCit2b2lkCitqcGVnX2NvZGVjX3NsZWVwIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgIGludCAgICAgICAgICAgc2xlZXApCit7CisJR1BJTyh6ciwgenItPmNhcmQuZ3Bpb1taUl9HUElPX0pQRUdfU0xFRVBdLCAhc2xlZXApOworCWlmICghc2xlZXApIHsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBqcGVnX2NvZGVjX3NsZWVwKCkgLSB3YWtlIEdQSU89MHglMDh4XG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ0cmVhZChaUjM2MDU3X0dQUEdDUjEpKTsKKwkJdWRlbGF5KDUwMCk7CisJfSBlbHNlIHsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBqcGVnX2NvZGVjX3NsZWVwKCkgLSBzbGVlcCBHUElPPTB4JTA4eFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBidHJlYWQoWlIzNjA1N19HUFBHQ1IxKSk7CisJCXVkZWxheSgyKTsKKwl9Cit9CisKK2ludAoranBlZ19jb2RlY19yZXNldCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwkvKiBUYWtlIHRoZSBjb2RlYyBvdXQgb2Ygc2xlZXAgKi8KKwlqcGVnX2NvZGVjX3NsZWVwKHpyLCAwKTsKKworCWlmICh6ci0+Y2FyZC5ncGNzW0dQQ1NfSlBFR19SRVNFVF0gIT0gMHhmZikgeworCQlwb3N0X29mZmljZV93cml0ZSh6ciwgenItPmNhcmQuZ3Bjc1tHUENTX0pQRUdfUkVTRVRdLCAwLAorCQkJCSAgMCk7CisJCXVkZWxheSgyKTsKKwl9IGVsc2UgeworCQlHUElPKHpyLCB6ci0+Y2FyZC5ncGlvW1pSX0dQSU9fSlBFR19SRVNFVF0sIDApOworCQl1ZGVsYXkoMik7CisJCUdQSU8oenIsIHpyLT5jYXJkLmdwaW9bWlJfR1BJT19KUEVHX1JFU0VUXSwgMSk7CisJCXVkZWxheSgyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgU2V0IHRoZSByZWdpc3RlcnMgZm9yIHRoZSBzaXplIHdlIGhhdmUgc3BlY2lmaWVkLiBEb24ndCBib3RoZXIKKyAqICAgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhpcyB3aXRob3V0IHRoZSBaUjM2MDU3IG1hbnVhbCBpbiBmcm9udCBvZgorICogICB5b3UgW0FDXS4KKyAqCisgKiAgIFBTOiBUaGUgbWFudWFsIGlzIGZyZWUgZm9yIGRvd25sb2FkIGluIC5wZGYgZm9ybWF0IGZyb20KKyAqICAgd3d3LnpvcmFuLmNvbSAtIG5pY2VseSBkb25lIHRob3NlIGZvbGtzLgorICovCisKK3N0YXRpYyB2b2lkCit6cjM2MDU3X2FkanVzdF92ZmUgKHN0cnVjdCB6b3JhbiAgICAgICAgICAqenIsCisJCSAgICBlbnVtIHpvcmFuX2NvZGVjX21vZGUgIG1vZGUpCit7CisJdTMyIHJlZzsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6CisJCWJ0YW5kKH5aUjM2MDU3X1ZGRVNQRlJfRXh0RmwsIFpSMzYwNTdfVkZFU1BGUik7CisJCXJlZyA9IGJ0cmVhZChaUjM2MDU3X1ZGRUhDUik7CisJCWlmICgocmVnICYgKDEgPDwgMTApKSAmJiB6ci0+Y2FyZC50eXBlICE9IExNTDMzUjEwKSB7CisJCQlyZWcgKz0gKCgxIDw8IDEwKSB8IDEpOworCQl9CisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZGRUhDUik7CisJCWJyZWFrOworCWNhc2UgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTOgorCWNhc2UgQlVaX01PREVfSURMRToKKwlkZWZhdWx0OgorCQlpZiAoenItPm5vcm0gPT0gVklERU9fTU9ERV9OVFNDIHx8CisJCSAgICAoenItPmNhcmQudHlwZSA9PSBMTUwzM1IxMCAmJgorCQkgICAgIHpyLT5ub3JtID09IFZJREVPX01PREVfUEFMKSkKKwkJCWJ0YW5kKH5aUjM2MDU3X1ZGRVNQRlJfRXh0RmwsIFpSMzYwNTdfVkZFU1BGUik7CisJCWVsc2UKKwkJCWJ0b3IoWlIzNjA1N19WRkVTUEZSX0V4dEZsLCBaUjM2MDU3X1ZGRVNQRlIpOworCQlyZWcgPSBidHJlYWQoWlIzNjA1N19WRkVIQ1IpOworCQlpZiAoIShyZWcgJiAoMSA8PCAxMCkpICYmIHpyLT5jYXJkLnR5cGUgIT0gTE1MMzNSMTApIHsKKwkJCXJlZyAtPSAoKDEgPDwgMTApIHwgMSk7CisJCX0KKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFSENSKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogc2V0IGdlb21ldHJ5CisgKi8KKworc3RhdGljIHZvaWQKK3pyMzYwNTdfc2V0X3ZmZSAoc3RydWN0IHpvcmFuICAgICAgICAgICAgICAqenIsCisJCSBpbnQgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb193aWR0aCwKKwkJIGludCAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2hlaWdodCwKKwkJIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgdHZub3JtICp0dm47CisJdW5zaWduZWQgSFN0YXJ0LCBIRW5kLCBWU3RhcnQsIFZFbmQ7CisJdW5zaWduZWQgRGlzcE1vZGU7CisJdW5zaWduZWQgVmlkV2luV2lkLCBWaWRXaW5IdDsKKwl1bnNpZ25lZCBoY3JvcDEsIGhjcm9wMiwgdmNyb3AxLCB2Y3JvcDI7CisJdW5zaWduZWQgV2EsIFdlLCBIYSwgSGU7CisJdW5zaWduZWQgWCwgWSwgSG9yRGNtLCBWZXJEY207CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBtYXNrX2xpbmVfc2l6ZTsKKworCXR2biA9IHpyLT50aW1pbmc7CisKKwlXYSA9IHR2bi0+V2E7CisJSGEgPSB0dm4tPkhhOworCisJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBzZXRfdmZlKCkgLSB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwKKwkJWlJfREVWTkFNRSh6ciksIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCisJaWYgKHpyLT5ub3JtICE9IFZJREVPX01PREVfUEFMICYmCisJICAgIHpyLT5ub3JtICE9IFZJREVPX01PREVfTlRTQyAmJgorCSAgICB6ci0+bm9ybSAhPSBWSURFT19NT0RFX1NFQ0FNKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogc2V0X3ZmZSgpIC0gbm9ybSA9ICVkIG5vdCB2YWxpZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB6ci0+bm9ybSk7CisJCXJldHVybjsKKwl9CisJaWYgKHZpZGVvX3dpZHRoIDwgQlVaX01JTl9XSURUSCB8fAorCSAgICB2aWRlb19oZWlnaHQgPCBCVVpfTUlOX0hFSUdIVCB8fAorCSAgICB2aWRlb193aWR0aCA+IFdhIHx8IHZpZGVvX2hlaWdodCA+IEhhKSB7CisJCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBzZXRfdmZlOiB3PSVkIGg9JWQgbm90IHZhbGlkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworCQlyZXR1cm47CisJfQorCisJLyoqKiogenIzNjA1NyAqKioqLworCisJLyogaG9yaXpvbnRhbCAqLworCVZpZFdpbldpZCA9IHZpZGVvX3dpZHRoOworCVggPSBESVZfUk9VTkRfVVAoVmlkV2luV2lkICogNjQsIHR2bi0+V2EpOworCVdlID0gKFZpZFdpbldpZCAqIDY0KSAvIFg7CisJSG9yRGNtID0gNjQgLSBYOworCWhjcm9wMSA9IDIgKiAoKHR2bi0+V2EgLSBXZSkgLyA0KTsKKwloY3JvcDIgPSB0dm4tPldhIC0gV2UgLSBoY3JvcDE7CisJSFN0YXJ0ID0gdHZuLT5IU3RhcnQgPyB0dm4tPkhTdGFydCA6IDE7CisJLyogKFJvbmFsZCkgT3JpZ2luYWwgY29tbWVudDoKKwkgKiAifCAxIERvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0LCB0ZXN0ZWQgb24gYm90aCBhIERDMTAgYW5kIGEgREMxMCsiCisJICogdGhpcyBpcyBmYWxzZS4gSXQgaW52ZXJzZXMgY2hyb21hIHZhbHVlcyBvbiB0aGUgTE1MMzNSMTAgKHNvIENyCisJICogc3VkZGVubHkgaXMgc2hvd24gYXMgQ2IgYW5kIHJldmVyc2UsIHJlYWxseSBjb29sIGVmZmVjdCBpZiB5b3UKKwkgKiB3YW50IHRvIHNlZSBibHVlIGZhY2VzLCBub3QgdXNlZnVsIG90aGVyd2lzZSkuIFNvIGRvbid0IHVzZSB8MS4KKwkgKiBIb3dldmVyLCB0aGUgREMxMCBoYXMgJzAnIGFzIEhTdGFydCwgYnV0IGRvZXMgbmVlZCB8MSwgc28gd2UKKwkgKiB1c2UgYSBkaXJ0eSBjaGVjay4uLgorCSAqLworCUhFbmQgPSBIU3RhcnQgKyB0dm4tPldhIC0gMTsKKwlIU3RhcnQgKz0gaGNyb3AxOworCUhFbmQgLT0gaGNyb3AyOworCXJlZyA9ICgoSFN0YXJ0ICYgWlIzNjA1N19WRkVIQ1JfSG1hc2spIDw8IFpSMzYwNTdfVkZFSENSX0hTdGFydCkKKwkgICAgfCAoKEhFbmQgJiBaUjM2MDU3X1ZGRUhDUl9IbWFzaykgPDwgWlIzNjA1N19WRkVIQ1JfSEVuZCk7CisJaWYgKHpyLT5jYXJkLnZmZV9wb2wuaHN5bmNfcG9sKQorCQlyZWcgfD0gWlIzNjA1N19WRkVIQ1JfSFNQb2w7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFSENSKTsKKworCS8qIFZlcnRpY2FsICovCisJRGlzcE1vZGUgPSAhKHZpZGVvX2hlaWdodCA+IEJVWl9NQVhfSEVJR0hUIC8gMik7CisJVmlkV2luSHQgPSBEaXNwTW9kZSA/IHZpZGVvX2hlaWdodCA6IHZpZGVvX2hlaWdodCAvIDI7CisJWSA9IERJVl9ST1VORF9VUChWaWRXaW5IdCAqIDY0ICogMiwgdHZuLT5IYSk7CisJSGUgPSAoVmlkV2luSHQgKiA2NCkgLyBZOworCVZlckRjbSA9IDY0IC0gWTsKKwl2Y3JvcDEgPSAodHZuLT5IYSAvIDIgLSBIZSkgLyAyOworCXZjcm9wMiA9IHR2bi0+SGEgLyAyIC0gSGUgLSB2Y3JvcDE7CisJVlN0YXJ0ID0gdHZuLT5WU3RhcnQ7CisJVkVuZCA9IFZTdGFydCArIHR2bi0+SGEgLyAyOwkvLyAtIDE7IEZJWE1FIFNuYXBTaG90IHRpbWVzIG91dCB3aXRoIC0xIGluIDc2OCo1NzYgb24gdGhlIERDMTAgLSBMUAorCVZTdGFydCArPSB2Y3JvcDE7CisJVkVuZCAtPSB2Y3JvcDI7CisJcmVnID0gKChWU3RhcnQgJiBaUjM2MDU3X1ZGRVZDUl9WbWFzaykgPDwgWlIzNjA1N19WRkVWQ1JfVlN0YXJ0KQorCSAgICB8ICgoVkVuZCAmIFpSMzYwNTdfVkZFVkNSX1ZtYXNrKSA8PCBaUjM2MDU3X1ZGRVZDUl9WRW5kKTsKKwlpZiAoenItPmNhcmQudmZlX3BvbC52c3luY19wb2wpCisJCXJlZyB8PSBaUjM2MDU3X1ZGRVZDUl9WU1BvbDsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVWQ1IpOworCisJLyogc2NhbGVyIGFuZCBwaXhlbCBmb3JtYXQgKi8KKwlyZWcgPSAwOworCXJlZyB8PSAoSG9yRGNtIDw8IFpSMzYwNTdfVkZFU1BGUl9Ib3JEY20pOworCXJlZyB8PSAoVmVyRGNtIDw8IFpSMzYwNTdfVkZFU1BGUl9WZXJEY20pOworCXJlZyB8PSAoRGlzcE1vZGUgPDwgWlIzNjA1N19WRkVTUEZSX0Rpc3BNb2RlKTsKKwkvKiBSSjogSSBkb24ndCBrbm93LCB3aHkgdGhlIGZvbGxvd2luZyBoYXMgdG8gYmUgdGhlIG9wcG9zaXRlCisJICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgWlIzNjA2MCBzZXR0aW5nLCBidXQgb25seSB0aGlzIHdheQorCSAqIHdlIGdldCB0aGUgY29ycmVjdCBjb2xvcnMgd2hlbiB1bmNvbXByZXNzaW5nIHRvIHRoZSBzY3JlZW4gICovCisJLy9yZWcgfD0gWlIzNjA1N19WRkVTUEZSX1ZDTEtQb2w7IC8qKi8KKwkvKiBSSjogRG9uJ3Qga25vdyBpZiB0aGF0IGlzIG5lZWRlZCBmb3IgTlRTQyBhbHNvICovCisJaWYgKHpyLT5ub3JtICE9IFZJREVPX01PREVfTlRTQykKKwkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9FeHRGbDsJLy8gTkVFREVEISEhISEhISBXb2xmZ2FuZworCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfVG9wRmllbGQ7CisJaWYgKEhvckRjbSA+PSA0OCkgeworCQlyZWcgfD0gMyA8PCBaUjM2MDU3X1ZGRVNQRlJfSEZpbHRlcjsJLyogNSB0YXAgZmlsdGVyICovCisJfSBlbHNlIGlmIChIb3JEY20gPj0gMzIpIHsKKwkJcmVnIHw9IDIgPDwgWlIzNjA1N19WRkVTUEZSX0hGaWx0ZXI7CS8qIDQgdGFwIGZpbHRlciAqLworCX0gZWxzZSBpZiAoSG9yRGNtID49IDE2KSB7CisJCXJlZyB8PSAxIDw8IFpSMzYwNTdfVkZFU1BGUl9IRmlsdGVyOwkvKiAzIHRhcCBmaWx0ZXIgKi8KKwl9CisJcmVnIHw9IGZvcm1hdC0+dmZlc3BmcjsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVTUEZSKTsKKworCS8qIGRpc3BsYXkgY29uZmlndXJhdGlvbiAqLworCXJlZyA9ICgxNiA8PCBaUjM2MDU3X1ZEQ1JfTWluUGl4KQorCSAgICB8IChWaWRXaW5IdCA8PCBaUjM2MDU3X1ZEQ1JfVmlkV2luSHQpCisJICAgIHwgKFZpZFdpbldpZCA8PCBaUjM2MDU3X1ZEQ1JfVmlkV2luV2lkKTsKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9UUklUT04pCisJCS8vIHx8IHpyLT5yZXZpc2lvbiA8IDEpIC8vIFJldmlzaW9uIDEgaGFzIGFsc28gVHJpdG9uIHN1cHBvcnQKKwkJcmVnICY9IH5aUjM2MDU3X1ZEQ1JfVHJpdG9uOworCWVsc2UKKwkJcmVnIHw9IFpSMzYwNTdfVkRDUl9Ucml0b247CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRDUik7CisKKwkvKiAoUm9uYWxkKSBkb24ndCB3cml0ZSB0aGlzIGlmIG92ZXJsYXlfbWFzayA9IE5VTEwgKi8KKwlpZiAoenItPm92ZXJsYXlfbWFzaykgeworCQkvKiBXcml0ZSBvdmVybGF5IGNsaXBwaW5nIG1hc2sgZGF0YSwgYnV0IGRvbid0IGVuYWJsZSBvdmVybGF5IGNsaXBwaW5nICovCisJCS8qIFJKOiBzaW5jZSB0aGlzIG1ha2VzIG9ubHkgc2Vuc2Ugb24gdGhlIHNjcmVlbiwgd2UgdXNlCisJCSAqIHpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoIGluc3RlYWQgb2YgdmlkZW9fd2lkdGggKi8KKworCQltYXNrX2xpbmVfc2l6ZSA9IChCVVpfTUFYX1dJRFRIICsgMzEpIC8gMzI7CisJCXJlZyA9IHZpcnRfdG9fYnVzKHpyLT5vdmVybGF5X21hc2spOworCQlidHdyaXRlKHJlZywgWlIzNjA1N19NTVRSKTsKKwkJcmVnID0gdmlydF90b19idXMoenItPm92ZXJsYXlfbWFzayArIG1hc2tfbGluZV9zaXplKTsKKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfTU1CUik7CisJCXJlZyA9CisJCSAgICBtYXNrX2xpbmVfc2l6ZSAtICh6ci0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCArCisJCQkJICAgICAgMzEpIC8gMzI7CisJCWlmIChEaXNwTW9kZSA9PSAwKQorCQkJcmVnICs9IG1hc2tfbGluZV9zaXplOworCQlyZWcgPDw9IFpSMzYwNTdfT0NSX01hc2tTdHJpZGU7CisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X09DUik7CisJfQorCisJenIzNjA1N19hZGp1c3RfdmZlKHpyLCB6ci0+Y29kZWNfbW9kZSk7Cit9CisKKy8qCisgKiBTd2l0Y2ggb3ZlcmxheSBvbiBvciBvZmYKKyAqLworCit2b2lkCit6cjM2MDU3X292ZXJsYXkgKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgICAgICAgICAgIG9uKQoreworCXUzMiByZWc7CisKKwlpZiAob24pIHsKKwkJLyogZG8gdGhlIG5lY2Vzc2FyeSBzZXR0aW5ncyAuLi4gKi8KKwkJYnRhbmQoflpSMzYwNTdfVkRDUl9WaWRFbiwgWlIzNjA1N19WRENSKTsJLyogc3dpdGNoIGl0IG9mZiBmaXJzdCAqLworCisJCXpyMzYwNTdfc2V0X3ZmZSh6ciwKKwkJCQl6ci0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCwKKwkJCQl6ci0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQsCisJCQkJenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KTsKKworCQkvKiBTdGFydCBhbmQgbGVuZ3RoIG9mIGVhY2ggbGluZSBNVVNUIGJlIDQtYnl0ZSBhbGlnbmVkLgorCQkgKiBUaGlzIHNob3VsZCBiZSBhbGxyZWFkeSBjaGVja2VkIGJlZm9yZSB0aGUgY2FsbCB0byB0aGlzIHJvdXRpbmUuCisJCSAqIEFsbCBlcnJvciBtZXNzYWdlcyBhcmUgaW50ZXJuYWwgZHJpdmVyIGNoZWNraW5nIG9ubHkhICovCisKKwkJLyogdmlkZW8gZGlzcGxheSB0b3AgYW5kIGJvdHRvbSByZWdpc3RlcnMgKi8KKwkJcmVnID0gKGxvbmcpIHpyLT5idWZmZXIuYmFzZSArCisJCSAgICB6ci0+b3ZlcmxheV9zZXR0aW5ncy54ICoKKwkJICAgICgoenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0LT5kZXB0aCArIDcpIC8gOCkgKworCQkgICAgenItPm92ZXJsYXlfc2V0dGluZ3MueSAqCisJCSAgICB6ci0+YnVmZmVyLmJ5dGVzcGVybGluZTsKKwkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRUUik7CisJCWlmIChyZWcgJiAzKQorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB6cjM2MDU3X292ZXJsYXkoKSAtIHZpZGVvX2FkZHJlc3Mgbm90IGFsaWduZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQlpZiAoenItPm92ZXJsYXlfc2V0dGluZ3MuaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQgLyAyKQorCQkJcmVnICs9IHpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lOworCQlidHdyaXRlKHJlZywgWlIzNjA1N19WREJSKTsKKworCQkvKiB2aWRlbyBzdHJpZGUsIHN0YXR1cywgYW5kIGZyYW1lIGdyYWIgcmVnaXN0ZXIgKi8KKwkJcmVnID0genItPmJ1ZmZlci5ieXRlc3BlcmxpbmUgLQorCQkgICAgenItPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggKgorCQkgICAgKCh6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoICsgNykgLyA4KTsKKwkJaWYgKHpyLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCA+IEJVWl9NQVhfSEVJR0hUIC8gMikKKwkJCXJlZyArPSB6ci0+YnVmZmVyLmJ5dGVzcGVybGluZTsKKwkJaWYgKHJlZyAmIDMpCisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHpyMzYwNTdfb3ZlcmxheSgpIC0gdmlkZW9fc3RyaWRlIG5vdCBhbGlnbmVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVnID0gKHJlZyA8PCBaUjM2MDU3X1ZTU0ZHUl9EaXNwU3RyaWRlKTsKKwkJcmVnIHw9IFpSMzYwNTdfVlNTRkdSX1ZpZE92ZjsJLyogY2xlYXIgb3ZlcmZsb3cgc3RhdHVzICovCisJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZTU0ZHUik7CisKKwkJLyogU2V0IG92ZXJsYXkgY2xpcHBpbmcgKi8KKwkJaWYgKHpyLT5vdmVybGF5X3NldHRpbmdzLmNsaXBjb3VudCA+IDApCisJCQlidG9yKFpSMzYwNTdfT0NSX092bEVuYWJsZSwgWlIzNjA1N19PQ1IpOworCisJCS8qIC4uLiBhbmQgc3dpdGNoIGl0IG9uICovCisJCWJ0b3IoWlIzNjA1N19WRENSX1ZpZEVuLCBaUjM2MDU3X1ZEQ1IpOworCX0gZWxzZSB7CisJCS8qIFN3aXRjaCBpdCBvZmYgKi8KKwkJYnRhbmQoflpSMzYwNTdfVkRDUl9WaWRFbiwgWlIzNjA1N19WRENSKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgb3ZlcmxheSBtYXNrIGhhcyBvbmUgYml0IGZvciBlYWNoIHBpeGVsIG9uIGEgc2NhbiBsaW5lLAorICogIGFuZCB0aGUgbWF4aW11bSB3aW5kb3cgc2l6ZSBpcyBCVVpfTUFYX1dJRFRIICogQlVaX01BWF9IRUlHSFQgcGl4ZWxzLgorICovCisKK3ZvaWQKK3dyaXRlX292ZXJsYXlfbWFzayAoc3RydWN0IGZpbGUgICAgICAgKmZpbGUsCisJCSAgICBzdHJ1Y3QgdmlkZW9fY2xpcCAqdnAsCisJCSAgICBpbnQgICAgICAgICAgICAgICAgY291bnQpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCXVuc2lnbmVkIG1hc2tfbGluZV9zaXplID0gKEJVWl9NQVhfV0lEVEggKyAzMSkgLyAzMjsKKwl1MzIgKm1hc2s7CisJaW50IHgsIHksIHdpZHRoLCBoZWlnaHQ7CisJdW5zaWduZWQgaSwgaiwgazsKKwl1MzIgcmVnOworCisJLyogZmlsbCBtYXNrIHdpdGggb25lIGJpdHMgKi8KKwltZW1zZXQoZmgtPm92ZXJsYXlfbWFzaywgfjAsIG1hc2tfbGluZV9zaXplICogNCAqIEJVWl9NQVhfSEVJR0hUKTsKKwlyZWcgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJLyogcGljayB1cCBsb2NhbCBjb3B5IG9mIGNsaXAgKi8KKwkJeCA9IHZwW2ldLng7CisJCXkgPSB2cFtpXS55OworCQl3aWR0aCA9IHZwW2ldLndpZHRoOworCQloZWlnaHQgPSB2cFtpXS5oZWlnaHQ7CisKKwkJLyogdHJpbSBjbGlwcyB0aGF0IGV4dGVuZCBiZXlvbmQgdGhlIHdpbmRvdyAqLworCQlpZiAoeCA8IDApIHsKKwkJCXdpZHRoICs9IHg7CisJCQl4ID0gMDsKKwkJfQorCQlpZiAoeSA8IDApIHsKKwkJCWhlaWdodCArPSB5OworCQkJeSA9IDA7CisJCX0KKwkJaWYgKHggKyB3aWR0aCA+IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoKSB7CisJCQl3aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoIC0geDsKKwkJfQorCQlpZiAoeSArIGhlaWdodCA+IGZoLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCkgeworCQkJaGVpZ2h0ID0gZmgtPm92ZXJsYXlfc2V0dGluZ3MuaGVpZ2h0IC0geTsKKwkJfQorCisJCS8qIGlnbm9yZSBkZWdlbmVyYXRlIGNsaXBzICovCisJCWlmIChoZWlnaHQgPD0gMCkgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHdpZHRoIDw9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYXBwbHkgY2xpcCBmb3IgZWFjaCBzY2FuIGxpbmUgKi8KKwkJZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisJCQkvKiByZXNldCBiaXQgZm9yIGVhY2ggcGl4ZWwgKi8KKwkJCS8qIHRoaXMgY2FuIGJlIG9wdGltaXplZCBsYXRlciBpZiBuZWVkIGJlICovCisJCQltYXNrID0gZmgtPm92ZXJsYXlfbWFzayArICh5ICsgaikgKiBtYXNrX2xpbmVfc2l6ZTsKKwkJCWZvciAoayA9IDA7IGsgPCB3aWR0aDsgKytrKSB7CisJCQkJbWFza1soeCArIGspIC8gMzJdICY9CisJCQkJICAgIH4oKHUzMikgMSA8PCAoeCArIGspICUgMzIpOworCQkJfQorCQl9CisJfQorfQorCisvKiBFbmFibGUvRGlzYWJsZSB1bmNvbXByZXNzZWQgbWVtb3J5IGdyYWJiaW5nIG9mIHRoZSAzNjA1NyAqLworCit2b2lkCit6cjM2MDU3X3NldF9tZW1ncmFiIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgICAgIGludCAgICAgICAgICAgbW9kZSkKK3sKKwlpZiAobW9kZSkgeworCQkvKiBXZSBvbmx5IGNoZWNrIFNuYXBTaG90IGFuZCBub3QgRnJhbWVHcmFiIGhlcmUuICBTbmFwU2hvdD09MQorCQkgKiBtZWFucyBhIGNhcHR1cmUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IEZyYW1lR3JhYj09MQorCQkgKiBkb2Vzbid0IG5lY2Vzc2FyeSBtZWFuIHRoYXQuICBJdCdzIG1vcmUgY29ycmVjdCB0byBzYXkgYSAxCisJCSAqIHRvIDAgdHJhbnNpdGlvbiBpbmRpY2F0ZXMgYSBjYXB0dXJlIGNvbXBsZXRlZC4gIElmIGEKKwkJICogY2FwdHVyZSBpcyBwZW5kaW5nIHdoZW4gY2FwdHVyaW5nIGlzIHR1bmVkIG9mZiwgRnJhbWVHcmFiCisJCSAqIHdpbGwgYmUgc3R1Y2sgYXQgMSB1bnRpbCBjYXB0dXJpbmcgaXMgdHVybmVkIGJhY2sgb24uCisJCSAqLworCQlpZiAoYnRyZWFkKFpSMzYwNTdfVlNTRkdSKSAmIFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90KQorCQkJZHByaW50aygxLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogenIzNjA1N19zZXRfbWVtZ3JhYigxKSB3aXRoIFNuYXBTaG90IG9uIT9cbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCisJCS8qIHN3aXRjaCBvbiBWU3luYyBpbnRlcnJ1cHRzICovCisJCWJ0d3JpdGUoSVJRX01BU0ssIFpSMzYwNTdfSVNSKTsJLy8gQ2xlYXIgSW50ZXJydXB0cworCQlidG9yKHpyLT5jYXJkLnZzeW5jX2ludCwgWlIzNjA1N19JQ1IpOwkvLyBTVworCisJCS8qIGVuYWJsZSBTbmFwU2hvdCAqLworCQlidG9yKFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90LCBaUjM2MDU3X1ZTU0ZHUik7CisKKwkJLyogU2V0IHpyMzYwNTcgdmlkZW8gZnJvbnQgZW5kICBhbmQgZW5hYmxlIHZpZGVvICovCisJCXpyMzYwNTdfc2V0X3ZmZSh6ciwgenItPnY0bF9zZXR0aW5ncy53aWR0aCwKKwkJCQl6ci0+djRsX3NldHRpbmdzLmhlaWdodCwKKwkJCQl6ci0+djRsX3NldHRpbmdzLmZvcm1hdCk7CisKKwkJenItPnY0bF9tZW1ncmFiX2FjdGl2ZSA9IDE7CisJfSBlbHNlIHsKKwkJLyogc3dpdGNoIG9mZiBWU3luYyBpbnRlcnJ1cHRzICovCisJCWJ0YW5kKH56ci0+Y2FyZC52c3luY19pbnQsIFpSMzYwNTdfSUNSKTsJLy8gU1cKKworCQl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMDsKKwkJenItPnY0bF9ncmFiX2ZyYW1lID0gTk9fR1JBQl9BQ1RJVkU7CisKKwkJLyogcmVlbmFibGUgZ3JhYmJpbmcgdG8gc2NyZWVuIGlmIGl0IHdhcyBydW5uaW5nICovCisJCWlmICh6ci0+djRsX292ZXJsYXlfYWN0aXZlKSB7CisJCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOworCQl9IGVsc2UgeworCQkJYnRhbmQoflpSMzYwNTdfVkRDUl9WaWRFbiwgWlIzNjA1N19WRENSKTsKKwkJCWJ0YW5kKH5aUjM2MDU3X1ZTU0ZHUl9TbmFwU2hvdCwgWlIzNjA1N19WU1NGR1IpOworCQl9CisJfQorfQorCitpbnQKK3dhaXRfZ3JhYl9wZW5kaW5nIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB3YWl0IHVudGlsIGFsbCBwZW5kaW5nIGdyYWJzIGFyZSBmaW5pc2hlZCAqLworCisJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh6ci0+djRsX2NhcHEsCisJCQkoenItPnY0bF9wZW5kX3RhaWwgPT0genItPnY0bF9wZW5kX2hlYWQpKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBTZXQgdXAgdGhlIEJ1ei1zcGVjaWZpYyBNSlBFRyBwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2ZyYW1lIChzdHJ1Y3Qgem9yYW4gKnpyLAorCSAgIGludCAgICAgICAgICAgdmFsKQoreworCUdQSU8oenIsIHpyLT5jYXJkLmdwaW9bWlJfR1BJT19KUEVHX0ZSQU1FXSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3NldF92aWRlb2J1c19kaXIgKHN0cnVjdCB6b3JhbiAqenIsCisJCSAgaW50ICAgICAgICAgICB2YWwpCit7CisJc3dpdGNoICh6ci0+Y2FyZC50eXBlKSB7CisJY2FzZSBMTUwzMzoKKwljYXNlIExNTDMzUjEwOgorCQlpZiAobG1sMzNkcGF0aCA9PSAwKQorCQkJR1BJTyh6ciwgNSwgdmFsKTsKKwkJZWxzZQorCQkJR1BJTyh6ciwgNSwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUdQSU8oenIsIHpyLT5jYXJkLmdwaW9bWlJfR1BJT19WSURfRElSXSwKKwkJICAgICB6ci0+Y2FyZC5ncGlvX3BvbFtaUl9HUElPX1ZJRF9ESVJdID8gIXZhbCA6IHZhbCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2luaXRfanBlZ19xdWV1ZSAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpbnQgaTsKKworCS8qIHJlLWluaXRpYWxpemUgRE1BIHJpbmcgc3R1ZmYgKi8KKwl6ci0+anBnX3F1ZV9oZWFkID0gMDsKKwl6ci0+anBnX2RtYV9oZWFkID0gMDsKKwl6ci0+anBnX2RtYV90YWlsID0gMDsKKwl6ci0+anBnX3F1ZV90YWlsID0gMDsKKwl6ci0+anBnX3NlcV9udW0gPSAwOworCXpyLT5KUEVHX2Vycm9yID0gMDsKKwl6ci0+bnVtX2Vycm9ycyA9IDA7CisJenItPmpwZ19lcnJfc2VxID0gMDsKKwl6ci0+anBnX2Vycl9zaGlmdCA9IDA7CisJenItPmpwZ19xdWV1ZWRfbnVtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgenItPmpwZ19idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKKwkJenItPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwkvKiBub3RoaW5nIGdvaW5nIG9uICovCisJfQorCWZvciAoaSA9IDA7IGkgPCBCVVpfTlVNX1NUQVRfQ09NOyBpKyspIHsKKwkJenItPnN0YXRfY29tW2ldID0gY3B1X3RvX2xlMzIoMSk7CS8qIG1hcmsgYXMgdW5hdmFpbGFibGUgdG8genIzNjA1NyAqLworCX0KK30KKworc3RhdGljIHZvaWQKK3pyMzYwNTdfc2V0X2pwZyAoc3RydWN0IHpvcmFuICAgICAgICAgICp6ciwKKwkJIGVudW0gem9yYW5fY29kZWNfbW9kZSAgbW9kZSkKK3sKKwlzdHJ1Y3QgdHZub3JtICp0dm47CisJdTMyIHJlZzsKKworCXR2biA9IHpyLT50aW1pbmc7CisKKwkvKiBhc3NlcnQgUF9SZXNldCwgZGlzYWJsZSBjb2RlIHRyYW5zZmVyLCBkZWFzc2VydCBBY3RpdmUgKi8KKwlidHdyaXRlKDAsIFpSMzYwNTdfSlBDKTsKKworCS8qIE1KUEVHIGNvbXByZXNzaW9uIG1vZGUgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKworCWNhc2UgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTOgorCWRlZmF1bHQ6CisJCXJlZyA9IFpSMzYwNTdfSk1DX01KUEdDbXBNb2RlOworCQlicmVhazsKKworCWNhc2UgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6CisJCXJlZyA9IFpSMzYwNTdfSk1DX01KUEdFeHBNb2RlOworCQlyZWcgfD0gWlIzNjA1N19KTUNfU3luY01zdHI7CisJCS8qIFJKOiBUaGUgZm9sbG93aW5nIGlzIGV4cGVyaW1lbnRhbCAtIGltcHJvdmVzIHRoZSBvdXRwdXQgdG8gc2NyZWVuICovCisJCS8vaWYoenItPmpwZ19zZXR0aW5ncy5WRklGT19GQikgcmVnIHw9IFpSMzYwNTdfSk1DX1ZGSUZPX0ZCOyAvLyBObywgaXQgZG9lc24ndC4gU00KKwkJYnJlYWs7CisKKwljYXNlIEJVWl9NT0RFX1NUSUxMX0NPTVBSRVNTOgorCQlyZWcgPSBaUjM2MDU3X0pNQ19KUEdDbXBNb2RlOworCQlicmVhazsKKworCWNhc2UgQlVaX01PREVfU1RJTExfREVDT01QUkVTUzoKKwkJcmVnID0gWlIzNjA1N19KTUNfSlBHRXhwTW9kZTsKKwkJYnJlYWs7CisKKwl9CisJcmVnIHw9IFpSMzYwNTdfSk1DX0pQRzsKKwlpZiAoenItPmpwZ19zZXR0aW5ncy5maWVsZF9wZXJfYnVmZiA9PSAxKQorCQlyZWcgfD0gWlIzNjA1N19KTUNfRmxkX3Blcl9idWZmOworCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0pNQyk7CisKKwkvKiB2ZXJ0aWNhbCAqLworCWJ0b3IoWlIzNjA1N19WRkVWQ1JfVlNQb2wsIFpSMzYwNTdfVkZFVkNSKTsKKwlyZWcgPSAoNiA8PCBaUjM2MDU3X1ZTUF9Wc3luY1NpemUpIHwKKwkgICAgICAodHZuLT5IdCA8PCBaUjM2MDU3X1ZTUF9Gcm1Ub3QpOworCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZTUCk7CisJcmVnID0gKCh6ci0+anBnX3NldHRpbmdzLmltZ195ICsgdHZuLT5WU3RhcnQpIDw8IFpSMzYwNTdfRlZBUF9OQVkpIHwKKwkgICAgICAoenItPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0IDw8IFpSMzYwNTdfRlZBUF9QQVkpOworCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0ZWQVApOworCisJLyogaG9yaXpvbnRhbCAqLworCWlmICh6ci0+Y2FyZC52ZmVfcG9sLmhzeW5jX3BvbCkKKwkJYnRvcihaUjM2MDU3X1ZGRUhDUl9IU1BvbCwgWlIzNjA1N19WRkVIQ1IpOworCWVsc2UKKwkJYnRhbmQoflpSMzYwNTdfVkZFSENSX0hTUG9sLCBaUjM2MDU3X1ZGRUhDUik7CisJcmVnID0gKCh0dm4tPkhTeW5jU3RhcnQpIDw8IFpSMzYwNTdfSFNQX0hzeW5jU3RhcnQpIHwKKwkgICAgICAodHZuLT5XdCA8PCBaUjM2MDU3X0hTUF9MaW5lVG90KTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19IU1ApOworCXJlZyA9ICgoenItPmpwZ19zZXR0aW5ncy5pbWdfeCArCisJCXR2bi0+SFN0YXJ0ICsgNCkgPDwgWlIzNjA1N19GSEFQX05BWCkgfAorCSAgICAgICh6ci0+anBnX3NldHRpbmdzLmltZ193aWR0aCA8PCBaUjM2MDU3X0ZIQVBfUEFYKTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19GSEFQKTsKKworCS8qIGZpZWxkIHByb2Nlc3MgcGFyYW1ldGVycyAqLworCWlmICh6ci0+anBnX3NldHRpbmdzLm9kZF9ldmVuKQorCQlyZWcgPSBaUjM2MDU3X0ZQUF9PZGRfRXZlbjsKKwllbHNlCisJCXJlZyA9IDA7CisKKwlidHdyaXRlKHJlZywgWlIzNjA1N19GUFApOworCisJLyogU2V0IHByb3BlciBWQ0xLIFBvbGFyaXR5LCBlbHNlIGNvbG9ycyB3aWxsIGJlIHdyb25nIGR1cmluZyBwbGF5YmFjayAqLworCS8vYnRvcihaUjM2MDU3X1ZGRVNQRlJfVkNMS1BvbCwgWlIzNjA1N19WRkVTUEZSKTsKKworCS8qIGNvZGUgYmFzZSBhZGRyZXNzICovCisJcmVnID0gdmlydF90b19idXMoenItPnN0YXRfY29tKTsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19KQ0JBKTsKKworCS8qIEZJRk8gdGhyZXNob2xkIChGSUZPIGlzIDE2MC4gZG91YmxlIHdvcmRzKSAqLworCS8qIE5PVEU6IGRlY2ltYWwgdmFsdWVzIGhlcmUgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKworCWNhc2UgQlVaX01PREVfU1RJTExfQ09NUFJFU1M6CisJY2FzZSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M6CisJCWlmICh6ci0+Y2FyZC50eXBlICE9IEJVWikKKwkJCXJlZyA9IDE0MDsKKwkJZWxzZQorCQkJcmVnID0gNjA7CisJCWJyZWFrOworCisJY2FzZSBCVVpfTU9ERV9TVElMTF9ERUNPTVBSRVNTOgorCWNhc2UgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6CisJCXJlZyA9IDIwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlZyA9IDgwOworCQlicmVhazsKKworCX0KKwlidHdyaXRlKHJlZywgWlIzNjA1N19KQ0ZUKTsKKwl6cjM2MDU3X2FkanVzdF92ZmUoenIsIG1vZGUpOworCit9CisKK3ZvaWQKK3ByaW50X2ludGVycnVwdHMgKHN0cnVjdCB6b3JhbiAqenIpCit7CisJaW50IHJlcywgbm9lcnIgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdHMgcmVjZWl2ZWQ6IiwgWlJfREVWTkFNRSh6cikpOworCWlmICgocmVzID0genItPmZpZWxkX2NvdW50ZXIpIDwgLTEgfHwgcmVzID4gMSkgeworCQlwcmludGsoIiBGRDolZCIsIHJlcyk7CisJfQorCWlmICgocmVzID0genItPmludHJfY291bnRlcl9HSVJRMSkgIT0gMCkgeworCQlwcmludGsoIiBHSVJRMTolZCIsIHJlcyk7CisJCW5vZXJyKys7CisJfQorCWlmICgocmVzID0genItPmludHJfY291bnRlcl9HSVJRMCkgIT0gMCkgeworCQlwcmludGsoIiBHSVJRMDolZCIsIHJlcyk7CisJCW5vZXJyKys7CisJfQorCWlmICgocmVzID0genItPmludHJfY291bnRlcl9Db2RSZXBJUlEpICE9IDApIHsKKwkJcHJpbnRrKCIgQ29kUmVwSVJROiVkIiwgcmVzKTsKKwkJbm9lcnIrKzsKKwl9CisJaWYgKChyZXMgPSB6ci0+aW50cl9jb3VudGVyX0pQRUdSZXBJUlEpICE9IDApIHsKKwkJcHJpbnRrKCIgSlBFR1JlcElSUTolZCIsIHJlcyk7CisJCW5vZXJyKys7CisJfQorCWlmICh6ci0+SlBFR19tYXhfbWlzc2VkKSB7CisJCXByaW50aygiIEpQRUcgZGVsYXlzOiBtYXg9JWQgbWluPSVkIiwgenItPkpQRUdfbWF4X21pc3NlZCwKKwkJICAgICAgIHpyLT5KUEVHX21pbl9taXNzZWQpOworCX0KKwlpZiAoenItPkVORF9ldmVudF9taXNzZWQpIHsKKwkJcHJpbnRrKCIgRU5EcyBtaXNzZWQ6ICVkIiwgenItPkVORF9ldmVudF9taXNzZWQpOworCX0KKwkvL2lmICh6ci0+anBnX3F1ZXVlZF9udW0pIHsKKwlwcmludGsoIiBxdWV1ZV9zdGF0ZT0lbGQvJWxkLyVsZC8lbGQiLCB6ci0+anBnX3F1ZV90YWlsLAorCSAgICAgICB6ci0+anBnX2RtYV90YWlsLCB6ci0+anBnX2RtYV9oZWFkLCB6ci0+anBnX3F1ZV9oZWFkKTsKKwkvL30KKwlpZiAoIW5vZXJyKSB7CisJCXByaW50aygiOiBubyBpbnRlcnJ1cHRzIGRldGVjdGVkLiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3ZvaWQKK2NsZWFyX2ludGVycnVwdF9jb3VudGVycyAoc3RydWN0IHpvcmFuICp6cikKK3sKKwl6ci0+aW50cl9jb3VudGVyX0dJUlExID0gMDsKKwl6ci0+aW50cl9jb3VudGVyX0dJUlEwID0gMDsKKwl6ci0+aW50cl9jb3VudGVyX0NvZFJlcElSUSA9IDA7CisJenItPmludHJfY291bnRlcl9KUEVHUmVwSVJRID0gMDsKKwl6ci0+ZmllbGRfY291bnRlciA9IDA7CisJenItPklSUTFfaW4gPSAwOworCXpyLT5JUlExX291dCA9IDA7CisJenItPkpQRUdfaW4gPSAwOworCXpyLT5KUEVHX291dCA9IDA7CisJenItPkpQRUdfMCA9IDA7CisJenItPkpQRUdfMSA9IDA7CisJenItPkVORF9ldmVudF9taXNzZWQgPSAwOworCXpyLT5KUEVHX21pc3NlZCA9IDA7CisJenItPkpQRUdfbWF4X21pc3NlZCA9IDA7CisJenItPkpQRUdfbWluX21pc3NlZCA9IDB4N2ZmZmZmZmY7Cit9CisKK3N0YXRpYyB1MzIKK2NvdW50X3Jlc2V0X2ludGVycnVwdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwl1MzIgaXNyOworCisJaWYgKChpc3IgPSBidHJlYWQoWlIzNjA1N19JU1IpICYgMHg3ODAwMDAwMCkpIHsKKwkJaWYgKGlzciAmIFpSMzYwNTdfSVNSX0dJUlExKSB7CisJCQlidHdyaXRlKFpSMzYwNTdfSVNSX0dJUlExLCBaUjM2MDU3X0lTUik7CisJCQl6ci0+aW50cl9jb3VudGVyX0dJUlExKys7CisJCX0KKwkJaWYgKGlzciAmIFpSMzYwNTdfSVNSX0dJUlEwKSB7CisJCQlidHdyaXRlKFpSMzYwNTdfSVNSX0dJUlEwLCBaUjM2MDU3X0lTUik7CisJCQl6ci0+aW50cl9jb3VudGVyX0dJUlEwKys7CisJCX0KKwkJaWYgKGlzciAmIFpSMzYwNTdfSVNSX0NvZFJlcElSUSkgeworCQkJYnR3cml0ZShaUjM2MDU3X0lTUl9Db2RSZXBJUlEsIFpSMzYwNTdfSVNSKTsKKwkJCXpyLT5pbnRyX2NvdW50ZXJfQ29kUmVwSVJRKys7CisJCX0KKwkJaWYgKGlzciAmIFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEpIHsKKwkJCWJ0d3JpdGUoWlIzNjA1N19JU1JfSlBFR1JlcElSUSwgWlIzNjA1N19JU1IpOworCQkJenItPmludHJfY291bnRlcl9KUEVHUmVwSVJRKys7CisJCX0KKwl9CisJcmV0dXJuIGlzcjsKK30KKwordm9pZAoranBlZ19zdGFydCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwlpbnQgcmVnOworCisJenItPmZyYW1lX251bSA9IDA7CisKKwkvKiBkZWFzc2VydCBQX3Jlc2V0LCBkaXNhYmxlIGNvZGUgdHJhbnNmZXIsIGRlYXNzZXJ0IEFjdGl2ZSAqLworCWJ0d3JpdGUoWlIzNjA1N19KUENfUF9SZXNldCwgWlIzNjA1N19KUEMpOworCS8qIHN0b3AgZmx1c2hpbmcgdGhlIGludGVybmFsIGNvZGUgYnVmZmVyICovCisJYnRhbmQoflpSMzYwNTdfTUNUQ1JfQ0ZsdXNoLCBaUjM2MDU3X01DVENSKTsKKwkvKiBlbmFibGUgY29kZSB0cmFuc2ZlciAqLworCWJ0b3IoWlIzNjA1N19KUENfQ29kVHJuc0VuLCBaUjM2MDU3X0pQQyk7CisKKwkvKiBjbGVhciBJUlFzICovCisJYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JU1IpOworCS8qIGVuYWJsZSB0aGUgSlBFRyBJUlFzICovCisJYnR3cml0ZSh6ci0+Y2FyZC5qcGVnX2ludCB8CisJCQlaUjM2MDU3X0lDUl9KUEVHUmVwSVJRIHwKKwkJCVpSMzYwNTdfSUNSX0ludFBpbkVuLAorCQlaUjM2MDU3X0lDUik7CisKKwlzZXRfZnJhbWUoenIsIDApOwkvLyBcRlJBTUUKKworCS8qIHNldCB0aGUgSlBFRyBjb2RlYyBndWVzdCBJRCAqLworCXJlZyA9ICh6ci0+Y2FyZC5ncGNzWzFdIDw8IFpSMzYwNTdfSkNHSV9KUEVHdWVzdElEKSB8CisJICAgICAgICgwIDw8IFpSMzYwNTdfSkNHSV9KUEVHdWVzdFJlZyk7CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfSkNHSSk7CisKKwlpZiAoenItPmNhcmQudmlkZW9fdmZlID09IENPREVDX1RZUEVfWlIzNjAxNiAmJgorCSAgICB6ci0+Y2FyZC52aWRlb19jb2RlYyA9PSBDT0RFQ19UWVBFX1pSMzYwNTApIHsKKwkJLyogRW5hYmxlIHByb2Nlc3Npbmcgb24gdGhlIFpSMzYwMTYgKi8KKwkJaWYgKHpyLT52ZmUpCisJCQl6cjM2MDE2X3dyaXRlKHpyLT52ZmUsIDAsIDEpOworCisJCS8qIGxvYWQgdGhlIGFkZHJlc3Mgb2YgdGhlIEdPIHJlZ2lzdGVyIGluIHRoZSBaUjM2MDUwIGxhdGNoICovCisJCXBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAwLCAwKTsKKwl9CisKKwkvKiBhc3NlcnQgQWN0aXZlICovCisJYnRvcihaUjM2MDU3X0pQQ19BY3RpdmUsIFpSMzYwNTdfSlBDKTsKKworCS8qIGVuYWJsZSB0aGUgR28gZ2VuZXJhdGlvbiAqLworCWJ0b3IoWlIzNjA1N19KTUNfR29fZW4sIFpSMzYwNTdfSk1DKTsKKwl1ZGVsYXkoMzApOworCisJc2V0X2ZyYW1lKHpyLCAxKTsJLy8gL0ZSQU1FCisKKwlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBqcGVnX3N0YXJ0XG4iLCBaUl9ERVZOQU1FKHpyKSk7Cit9CisKK3ZvaWQKK3pyMzYwNTdfZW5hYmxlX2pwZyAoc3RydWN0IHpvcmFuICAgICAgICAgICp6ciwKKwkJICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSAgbW9kZSkKK3sKKwlzdGF0aWMgaW50IHplcm87CisJc3RhdGljIGludCBvbmUgPSAxOworCXN0cnVjdCB2ZmVfc2V0dGluZ3MgY2FwOworCWludCBmaWVsZF9zaXplID0KKwkgICAgenItPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplIC8genItPmpwZ19zZXR0aW5ncy5maWVsZF9wZXJfYnVmZjsKKworCXpyLT5jb2RlY19tb2RlID0gbW9kZTsKKworCWNhcC54ID0genItPmpwZ19zZXR0aW5ncy5pbWdfeDsKKwljYXAueSA9IHpyLT5qcGdfc2V0dGluZ3MuaW1nX3k7CisJY2FwLndpZHRoID0genItPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGg7CisJY2FwLmhlaWdodCA9IHpyLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodDsKKwljYXAuZGVjaW1hdGlvbiA9CisJICAgIHpyLT5qcGdfc2V0dGluZ3MuSG9yRGNtIHwgKHpyLT5qcGdfc2V0dGluZ3MuVmVyRGNtIDw8IDgpOworCWNhcC5xdWFsaXR5ID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5xdWFsaXR5OworCisJc3dpdGNoIChtb2RlKSB7CisKKwljYXNlIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzogeworCQlzdHJ1Y3QganBlZ19hcHBfbWFya2VyIGFwcDsKKwkJc3RydWN0IGpwZWdfY29tX21hcmtlciBjb207CisKKwkJLyogSW4gbW90aW9uIGNvbXByZXNzIG1vZGUsIHRoZSBkZWNvZGVyIG91dHB1dCBtdXN0IGJlIGVuYWJsZWQsIGFuZAorCQkgKiB0aGUgdmlkZW8gYnVzIGRpcmVjdGlvbiBzZXQgdG8gaW5wdXQuCisJCSAqLworCQlzZXRfdmlkZW9idXNfZGlyKHpyLCAwKTsKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZvbmUpOworCQllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX0lOUFVULCAmemVybyk7CisKKwkJLyogVGFrZSB0aGUgSlBFRyBjb2RlYyBhbmQgdGhlIFZGRSBvdXQgb2Ygc2xlZXAgKi8KKwkJanBlZ19jb2RlY19zbGVlcCh6ciwgMCk7CisKKwkJLyogc2V0IEpQRUcgYXBwL2NvbSBtYXJrZXIgKi8KKwkJYXBwLmFwcG4gPSB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUG47CisJCWFwcC5sZW4gPSB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9sZW47CisJCW1lbWNweShhcHAuZGF0YSwgenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwgNjApOworCQl6ci0+Y29kZWMtPmNvbnRyb2woenItPmNvZGVjLCBDT0RFQ19TX0pQRUdfQVBQX0RBVEEsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBqcGVnX2FwcF9tYXJrZXIpLCAmYXBwKTsKKworCQljb20ubGVuID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuOworCQltZW1jcHkoY29tLmRhdGEsIHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2RhdGEsIDYwKTsKKwkJenItPmNvZGVjLT5jb250cm9sKHpyLT5jb2RlYywgQ09ERUNfU19KUEVHX0NPTV9EQVRBLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QganBlZ19jb21fbWFya2VyKSwgJmNvbSk7CisKKwkJLyogU2V0dXAgdGhlIEpQRUcgY29kZWMgKi8KKwkJenItPmNvZGVjLT5jb250cm9sKHpyLT5jb2RlYywgQ09ERUNfU19KUEVHX1REU19CWVRFLAorCQkJCSAgIHNpemVvZihpbnQpLCAmZmllbGRfc2l6ZSk7CisJCXpyLT5jb2RlYy0+c2V0X3ZpZGVvKHpyLT5jb2RlYywgenItPnRpbWluZywgJmNhcCwKKwkJCQkgICAgICZ6ci0+Y2FyZC52ZmVfcG9sKTsKKwkJenItPmNvZGVjLT5zZXRfbW9kZSh6ci0+Y29kZWMsIENPREVDX0RPX0NPTVBSRVNTSU9OKTsKKworCQkvKiBTZXR1cCB0aGUgVkZFICovCisJCWlmICh6ci0+dmZlKSB7CisJCQl6ci0+dmZlLT5jb250cm9sKHpyLT52ZmUsIENPREVDX1NfSlBFR19URFNfQllURSwKKwkJCQkJIHNpemVvZihpbnQpLCAmZmllbGRfc2l6ZSk7CisJCQl6ci0+dmZlLT5zZXRfdmlkZW8oenItPnZmZSwgenItPnRpbWluZywgJmNhcCwKKwkJCQkJICAgJnpyLT5jYXJkLnZmZV9wb2wpOworCQkJenItPnZmZS0+c2V0X21vZGUoenItPnZmZSwgQ09ERUNfRE9fQ09NUFJFU1NJT04pOworCQl9CisKKwkJaW5pdF9qcGVnX3F1ZXVlKHpyKTsKKwkJenIzNjA1N19zZXRfanBnKHpyLCBtb2RlKTsJLy8gXFBfUmVzZXQsIC4uLiBWaWRlbyBwYXJhbSwgRklGTworCisJCWNsZWFyX2ludGVycnVwdF9jb3VudGVycyh6cik7CisJCWRwcmludGsoMiwgS0VSTl9JTkZPICIlczogZW5hYmxlX2pwZyhNT1RJT05fQ09NUFJFU1MpXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlicmVhazsKKwl9CisKKwljYXNlIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTOgorCQkvKiBJbiBtb3Rpb24gZGVjb21wcmVzc2lvbiBtb2RlLCB0aGUgZGVjb2RlciBvdXRwdXQgbXVzdCBiZSBkaXNhYmxlZCwgYW5kCisJCSAqIHRoZSB2aWRlbyBidXMgZGlyZWN0aW9uIHNldCB0byBvdXRwdXQuCisJCSAqLworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfRU5BQkxFX09VVFBVVCwgJnplcm8pOworCQlzZXRfdmlkZW9idXNfZGlyKHpyLCAxKTsKKwkJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJm9uZSk7CisKKwkJLyogVGFrZSB0aGUgSlBFRyBjb2RlYyBhbmQgdGhlIFZGRSBvdXQgb2Ygc2xlZXAgKi8KKwkJanBlZ19jb2RlY19zbGVlcCh6ciwgMCk7CisJCS8qIFNldHVwIHRoZSBWRkUgKi8KKwkJaWYgKHpyLT52ZmUpIHsKKwkJCXpyLT52ZmUtPnNldF92aWRlbyh6ci0+dmZlLCB6ci0+dGltaW5nLCAmY2FwLAorCQkJCQkgICAmenItPmNhcmQudmZlX3BvbCk7CisJCQl6ci0+dmZlLT5zZXRfbW9kZSh6ci0+dmZlLCBDT0RFQ19ET19FWFBBTlNJT04pOworCQl9CisJCS8qIFNldHVwIHRoZSBKUEVHIGNvZGVjICovCisJCXpyLT5jb2RlYy0+c2V0X3ZpZGVvKHpyLT5jb2RlYywgenItPnRpbWluZywgJmNhcCwKKwkJCQkgICAgICZ6ci0+Y2FyZC52ZmVfcG9sKTsKKwkJenItPmNvZGVjLT5zZXRfbW9kZSh6ci0+Y29kZWMsIENPREVDX0RPX0VYUEFOU0lPTik7CisKKwkJaW5pdF9qcGVnX3F1ZXVlKHpyKTsKKwkJenIzNjA1N19zZXRfanBnKHpyLCBtb2RlKTsJLy8gXFBfUmVzZXQsIC4uLiBWaWRlbyBwYXJhbSwgRklGTworCisJCWNsZWFyX2ludGVycnVwdF9jb3VudGVycyh6cik7CisJCWRwcmludGsoMiwgS0VSTl9JTkZPICIlczogZW5hYmxlX2pwZyhNT1RJT05fREVDT01QUkVTUylcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCWJyZWFrOworCisJY2FzZSBCVVpfTU9ERV9JRExFOgorCWRlZmF1bHQ6CisJCS8qIHNodXQgZG93biBwcm9jZXNzaW5nICovCisJCWJ0YW5kKH4oenItPmNhcmQuanBlZ19pbnQgfCBaUjM2MDU3X0lDUl9KUEVHUmVwSVJRKSwKKwkJICAgICAgWlIzNjA1N19JQ1IpOworCQlidHdyaXRlKHpyLT5jYXJkLmpwZWdfaW50IHwgWlIzNjA1N19JQ1JfSlBFR1JlcElSUSwKKwkJCVpSMzYwNTdfSVNSKTsKKwkJYnRhbmQoflpSMzYwNTdfSk1DX0dvX2VuLCBaUjM2MDU3X0pNQyk7CS8vIFxHb19lbgorCisJCW1zbGVlcCg1MCk7CisKKwkJc2V0X3ZpZGVvYnVzX2Rpcih6ciwgMCk7CisJCXNldF9mcmFtZSh6ciwgMSk7CS8vIC9GUkFNRQorCQlidG9yKFpSMzYwNTdfTUNUQ1JfQ0ZsdXNoLCBaUjM2MDU3X01DVENSKTsJLy8gL0NGbHVzaAorCQlidHdyaXRlKDAsIFpSMzYwNTdfSlBDKTsJLy8gXFBfUmVzZXQsXENvZFRybnNFbixcQWN0aXZlCisJCWJ0YW5kKH5aUjM2MDU3X0pNQ19WRklGT19GQiwgWlIzNjA1N19KTUMpOworCQlidGFuZCh+WlIzNjA1N19KTUNfU3luY01zdHIsIFpSMzYwNTdfSk1DKTsKKwkJanBlZ19jb2RlY19yZXNldCh6cik7CisJCWpwZWdfY29kZWNfc2xlZXAoenIsIDEpOworCQl6cjM2MDU3X2FkanVzdF92ZmUoenIsIG1vZGUpOworCisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9FTkFCTEVfT1VUUFVULCAmb25lKTsKKwkJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJnplcm8pOworCisJCWRwcmludGsoMiwgS0VSTl9JTkZPICIlczogZW5hYmxlX2pwZyhJRExFKVxuIiwgWlJfREVWTkFNRSh6cikpOworCQlicmVhazsKKworCX0KK30KKworLyogd2hlbiB0aGlzIGlzIGNhbGxlZCB0aGUgc3BpbmxvY2sgbXVzdCBiZSBoZWxkICovCit2b2lkCit6b3Jhbl9mZWVkX3N0YXRfY29tIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCS8qIG1vdmUgZnJhbWVzIGZyb20gcGVuZGluZyBxdWV1ZSB0byBETUEgKi8KKworCWludCBmcmFtZSwgaSwgbWF4X3N0YXRfY29tOworCisJbWF4X3N0YXRfY29tID0KKwkgICAgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09CisJICAgICAxKSA/IEJVWl9OVU1fU1RBVF9DT00gOiAoQlVaX05VTV9TVEFUX0NPTSA+PiAxKTsKKworCXdoaWxlICgoenItPmpwZ19kbWFfaGVhZCAtIHpyLT5qcGdfZG1hX3RhaWwpIDwgbWF4X3N0YXRfY29tICYmCisJICAgICAgIHpyLT5qcGdfZG1hX2hlYWQgPCB6ci0+anBnX3F1ZV9oZWFkKSB7CisKKwkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19kbWFfaGVhZCAmIEJVWl9NQVNLX0ZSQU1FXTsKKwkJaWYgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09IDEpIHsKKwkJCS8qIGZpbGwgMSBzdGF0X2NvbSBlbnRyeSAqLworCQkJaSA9ICh6ci0+anBnX2RtYV9oZWFkIC0KKwkJCSAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgQlVaX01BU0tfU1RBVF9DT007CisJCQlpZiAoISh6ci0+c3RhdF9jb21baV0gJiBjcHVfdG9fbGUzMigxKSkpCisJCQkJYnJlYWs7CisJCQl6ci0+c3RhdF9jb21baV0gPQorCQkJICAgIGNwdV90b19sZTMyKHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLmZyYWdfdGFiX2J1cyk7CisJCX0gZWxzZSB7CisJCQkvKiBmaWxsIDIgc3RhdF9jb20gZW50cmllcyAqLworCQkJaSA9ICgoenItPmpwZ19kbWFfaGVhZCAtCisJCQkgICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiAxKSAqIDI7CisJCQlpZiAoISh6ci0+c3RhdF9jb21baV0gJiBjcHVfdG9fbGUzMigxKSkpCisJCQkJYnJlYWs7CisJCQl6ci0+c3RhdF9jb21baV0gPQorCQkJICAgIGNwdV90b19sZTMyKHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLmZyYWdfdGFiX2J1cyk7CisJCQl6ci0+c3RhdF9jb21baSArIDFdID0KKwkJCSAgICBjcHVfdG9fbGUzMih6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5mcmFnX3RhYl9idXMpOworCQl9CisJCXpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID0gQlVaX1NUQVRFX0RNQTsKKwkJenItPmpwZ19kbWFfaGVhZCsrOworCisJfQorCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUykKKwkJenItPmpwZ19xdWV1ZWRfbnVtKys7Cit9CisKKy8qIHdoZW4gdGhpcyBpcyBjYWxsZWQgdGhlIHNwaW5sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQKK3pvcmFuX3JlYXBfc3RhdF9jb20gKHN0cnVjdCB6b3JhbiAqenIpCit7CisJLyogbW92ZSBmcmFtZXMgZnJvbSBETUEgcXVldWUgdG8gZG9uZSBxdWV1ZSAqLworCisJaW50IGk7CisJdTMyIHN0YXRfY29tOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGRpZjsKKwlzdHJ1Y3Qgem9yYW5fanBnX2J1ZmZlciAqYnVmZmVyOworCWludCBmcmFtZTsKKworCS8qIEluIG1vdGlvbiBkZWNvbXByZXNzIHdlIGRvbid0IGhhdmUgYSBoYXJkd2FyZSBmcmFtZSBjb3VudGVyLAorCSAqIHdlIGp1c3QgY291bnQgdGhlIGludGVycnVwdHMgaGVyZSAqLworCisJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKSB7CisJCXpyLT5qcGdfc2VxX251bSsrOworCX0KKwl3aGlsZSAoenItPmpwZ19kbWFfdGFpbCA8IHpyLT5qcGdfZG1hX2hlYWQpIHsKKwkJaWYgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQlpID0gKHpyLT5qcGdfZG1hX3RhaWwgLQorCQkJICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiBCVVpfTUFTS19TVEFUX0NPTTsKKwkJZWxzZQorCQkJaSA9ICgoenItPmpwZ19kbWFfdGFpbCAtCisJCQkgICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiAxKSAqIDIgKyAxOworCisJCXN0YXRfY29tID0gbGUzMl90b19jcHUoenItPnN0YXRfY29tW2ldKTsKKworCQlpZiAoKHN0YXRfY29tICYgMSkgPT0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWZyYW1lID0genItPmpwZ19wZW5kW3pyLT5qcGdfZG1hX3RhaWwgJiBCVVpfTUFTS19GUkFNRV07CisJCWJ1ZmZlciA9ICZ6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZidWZmZXItPmJzLnRpbWVzdGFtcCk7CisKKwkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgeworCQkJYnVmZmVyLT5icy5sZW5ndGggPSAoc3RhdF9jb20gJiAweDdmZmZmZikgPj4gMTsKKworCQkJLyogdXBkYXRlIHNlcXVlbmNlIG51bWJlciB3aXRoIHRoZSBoZWxwIG9mIHRoZSBjb3VudGVyIGluIHN0YXRfY29tICovCisKKwkJCXNlcSA9ICgoc3RhdF9jb20gPj4gMjQpICsgenItPmpwZ19lcnJfc2VxKSAmIDB4ZmY7CisJCQlkaWYgPSAoc2VxIC0genItPmpwZ19zZXFfbnVtKSAmIDB4ZmY7CisJCQl6ci0+anBnX3NlcV9udW0gKz0gZGlmOworCQl9IGVsc2UgeworCQkJYnVmZmVyLT5icy5sZW5ndGggPSAwOworCQl9CisJCWJ1ZmZlci0+YnMuc2VxID0KKwkJICAgIHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09CisJCSAgICAyID8gKHpyLT5qcGdfc2VxX251bSA+PiAxKSA6IHpyLT5qcGdfc2VxX251bTsKKwkJYnVmZmVyLT5zdGF0ZSA9IEJVWl9TVEFURV9ET05FOworCisJCXpyLT5qcGdfZG1hX3RhaWwrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlcnJvcl9oYW5kbGVyIChzdHJ1Y3Qgem9yYW4gKnpyLAorCSAgICAgICB1MzIgICAgICAgICAgIGFzdGF0LAorCSAgICAgICB1MzIgICAgICAgICAgIHN0YXQpCit7CisJLyogVGhpcyBpcyBKUEVHIGVycm9yIGhhbmRsaW5nIHBhcnQgKi8KKwlpZiAoKHpyLT5jb2RlY19tb2RlICE9IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgJiYKKwkgICAgKHpyLT5jb2RlY19tb2RlICE9IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKSkgeworCQkvL2RwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBlcnJvcjogZXJyb3IgaGFuZGxpbmcgcmVxdWVzdCBpbiBtb2RlICVkXG4iLCBaUl9ERVZOQU1FKHpyKSwgenItPmNvZGVjX21vZGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKChzdGF0ICYgMSkgPT0gMCAmJgorCSAgICB6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MgJiYKKwkgICAgenItPmpwZ19kbWFfdGFpbCAtIHpyLT5qcGdfcXVlX3RhaWwgPj0KKwkgICAgIHpyLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycykgeworCQkvKiBObyBmcmVlIGJ1ZmZlcnMuLi4gKi8KKwkJem9yYW5fcmVhcF9zdGF0X2NvbSh6cik7CisJCXpvcmFuX2ZlZWRfc3RhdF9jb20oenIpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT5qcGdfY2FwcSk7CisJCXpyLT5KUEVHX21pc3NlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoenItPkpQRUdfZXJyb3IgIT0gMSkgeworCQkvKgorCQkgKiBGaXJzdCBlbnRyeTogZXJyb3IganVzdCBoYXBwZW5lZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbgorCQkgKgorCQkgKiBJbiBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M6CisJCSAqCisJCSAqIFBvc3NpYmxlIGdsaXRjaCBpbiBUViBzaWduYWwuIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQKKwkJICogc3RvcCB0aGUgY29kZWMgYW5kIHdhaXQgZm9yIGdvb2QgcXVhbGl0eSBzaWduYWwgYmVmb3JlCisJCSAqIHJlc3RhcnRpbmcgaXQgdG8gYXZvaWQgZnVydGhlciBwcm9ibGVtcworCQkgKgorCQkgKiBJbiBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzoKKwkJICoKKwkJICogQmFkIEpQRUcgZnJhbWU6IHdlIGhhdmUgdG8gbWFyayBpdCBhcyBwcm9jZXNzZWQgKGNvZGVjIGNyYXNoZWQKKwkJICogYW5kIHdhcyBub3QgYWJsZSB0byBkbyBpdCBpdHNlbGYpLCBhbmQgdG8gcmVtb3ZlIGl0IGZyb20gcXVldWUuCisJCSAqLworCQlidGFuZCh+WlIzNjA1N19KTUNfR29fZW4sIFpSMzYwNTdfSk1DKTsKKwkJdWRlbGF5KDEpOworCQlzdGF0ID0gc3RhdCB8IChwb3N0X29mZmljZV9yZWFkKHpyLCA3LCAwKSAmIDMpIDw8IDg7CisJCWJ0d3JpdGUoMCwgWlIzNjA1N19KUEMpOworCQlidG9yKFpSMzYwNTdfTUNUQ1JfQ0ZsdXNoLCBaUjM2MDU3X01DVENSKTsKKwkJanBlZ19jb2RlY19yZXNldCh6cik7CisJCWpwZWdfY29kZWNfc2xlZXAoenIsIDEpOworCQl6ci0+SlBFR19lcnJvciA9IDE7CisJCXpyLT5udW1fZXJyb3JzKys7CisKKwkJLyogUmVwb3J0IGVycm9yICovCisJCWlmICh6cjM2MDY3X2RlYnVnID4gMSAmJiB6ci0+bnVtX2Vycm9ycyA8PSA4KSB7CisJCQlsb25nIGZyYW1lOworCQkJZnJhbWUgPQorCQkJICAgIHpyLT5qcGdfcGVuZFt6ci0+anBnX2RtYV90YWlsICYgQlVaX01BU0tfRlJBTUVdOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBKUEVHIGVycm9yIHN0YXQ9MHglMDh4KDB4JTA4eCkgcXVldWVfc3RhdGU9JWxkLyVsZC8lbGQvJWxkIHNlcT0lbGQgZnJhbWU9JWxkLiBDb2RlYyBzdG9wcGVkLiAiLAorCQkJICAgICAgIFpSX0RFVk5BTUUoenIpLCBzdGF0LCB6ci0+bGFzdF9pc3IsCisJCQkgICAgICAgenItPmpwZ19xdWVfdGFpbCwgenItPmpwZ19kbWFfdGFpbCwKKwkJCSAgICAgICB6ci0+anBnX2RtYV9oZWFkLCB6ci0+anBnX3F1ZV9oZWFkLAorCQkJICAgICAgIHpyLT5qcGdfc2VxX251bSwgZnJhbWUpOworCQkJcHJpbnRrKCJzdGF0X2NvbSBmcmFtZXM6Iik7CisJCQl7CisJCQkJaW50IGksIGo7CisJCQkJZm9yIChqID0gMDsgaiA8IEJVWl9OVU1fU1RBVF9DT007IGorKykgeworCQkJCQlmb3IgKGkgPSAwOworCQkJCQkgICAgIGkgPCB6ci0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7CisJCQkJCSAgICAgaSsrKSB7CisJCQkJCQlpZiAobGUzMl90b19jcHUoenItPnN0YXRfY29tW2pdKSA9PQorCQkJCQkJICAgIHpyLT5qcGdfYnVmZmVycy4KKwkJCQkJCSAgICBidWZmZXJbaV0uCisJCQkJCQkgICAgZnJhZ190YWJfYnVzKSB7CisJCQkJCQkJcHJpbnRrKCIlIGQtPiVkIiwKKwkJCQkJCQkgICAgICAgaiwgaSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQl9CisJCS8qIEZpbmQgYW4gZW50cnkgaW4gc3RhdF9jb20gYW5kIHJvdGF0ZSBjb250ZW50cyAqLworCQl7CisJCQlpbnQgaTsKKworCQkJaWYgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQkJaSA9ICh6ci0+anBnX2RtYV90YWlsIC0KKwkJCQkgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIEJVWl9NQVNLX1NUQVRfQ09NOworCQkJZWxzZQorCQkJCWkgPSAoKHpyLT5qcGdfZG1hX3RhaWwgLQorCQkJCSAgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIDEpICogMjsKKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUykgeworCQkJCS8qIE1pbWljIHpyMzYwNjcgb3BlcmF0aW9uICovCisJCQkJenItPnN0YXRfY29tW2ldIHw9IGNwdV90b19sZTMyKDEpOworCQkJCWlmICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSAhPSAxKQorCQkJCQl6ci0+c3RhdF9jb21baSArIDFdIHw9IGNwdV90b19sZTMyKDEpOworCQkJCS8qIFJlZmlsbCAqLworCQkJCXpvcmFuX3JlYXBfc3RhdF9jb20oenIpOworCQkJCXpvcmFuX2ZlZWRfc3RhdF9jb20oenIpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKKwkJCQkvKiBGaW5kIGFuIGVudHJ5IGluIHN0YXRfY29tIGFnYWluIGFmdGVyIHJlZmlsbCAqLworCQkJCWlmICh6ci0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKQorCQkJCQlpID0gKHpyLT5qcGdfZG1hX3RhaWwgLQorCQkJCQkgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmCisJCQkJCSAgICBCVVpfTUFTS19TVEFUX0NPTTsKKwkJCQllbHNlCisJCQkJCWkgPSAoKHpyLT5qcGdfZG1hX3RhaWwgLQorCQkJCQkgICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiAxKSAqIDI7CisJCQl9CisJCQlpZiAoaSkgeworCQkJCS8qIFJvdGF0ZSBzdGF0X2NvbW0gZW50cmllcyB0byBtYWtlIGN1cnJlbnQgZW50cnkgZmlyc3QgKi8KKwkJCQlpbnQgajsKKwkJCQlfX2xlMzIgYnVzX2FkZHJbQlVaX05VTV9TVEFUX0NPTV07CisKKwkJCQkvKiBIZXJlIHdlIGFyZSBjb3B5aW5nIHRoZSBzdGF0X2NvbSBhcnJheSwgd2hpY2gKKwkJCQkgKiBpcyBhbHJlYWR5IGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzbworCQkJCSAqIG5vIGVuZGlhbiBjb252ZXJzaW9ucyBoZXJlCisJCQkJICovCisJCQkJbWVtY3B5KGJ1c19hZGRyLCB6ci0+c3RhdF9jb20sCisJCQkJICAgICAgIHNpemVvZihidXNfYWRkcikpOworCQkJCWZvciAoaiA9IDA7IGogPCBCVVpfTlVNX1NUQVRfQ09NOyBqKyspIHsKKwkJCQkJenItPnN0YXRfY29tW2pdID0KKwkJCQkJICAgIGJ1c19hZGRyWyhpICsgaikgJgorCQkJCQkJICAgICBCVVpfTUFTS19TVEFUX0NPTV07CisKKwkJCQl9CisJCQkJenItPmpwZ19lcnJfc2hpZnQgKz0gaTsKKwkJCQl6ci0+anBnX2Vycl9zaGlmdCAmPSBCVVpfTUFTS19TVEFUX0NPTTsKKwkJCX0KKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpCisJCQkJenItPmpwZ19lcnJfc2VxID0genItPmpwZ19zZXFfbnVtOwkvKiArIDE7ICovCisJCX0KKwl9CisKKwkvKiBOb3cgdGhlIHN0YXRfY29tbSBidWZmZXIgaXMgcmVhZHkgZm9yIHJlc3RhcnQgKi8KKwlkbyB7CisJCWludCBzdGF0dXMsIG1vZGU7CisKKwkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgeworCQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0dFVF9TVEFUVVMsICZzdGF0dXMpOworCQkJbW9kZSA9IENPREVDX0RPX0NPTVBSRVNTSU9OOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gMDsKKwkJCW1vZGUgPSBDT0RFQ19ET19FWFBBTlNJT047CisJCX0KKwkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTIHx8CisJCSAgICAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKKwkJCS8qKioqKioqKioqIFJFU1RBUlQgY29kZSAqKioqKioqKioqKioqLworCQkJanBlZ19jb2RlY19yZXNldCh6cik7CisJCQl6ci0+Y29kZWMtPnNldF9tb2RlKHpyLT5jb2RlYywgbW9kZSk7CisJCQl6cjM2MDU3X3NldF9qcGcoenIsIHpyLT5jb2RlY19tb2RlKTsKKwkJCWpwZWdfc3RhcnQoenIpOworCisJCQlpZiAoenItPm51bV9lcnJvcnMgPD0gOCkKKwkJCQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IFJlc3RhcnRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKworCQkJenItPkpQRUdfbWlzc2VkID0gMDsKKwkJCXpyLT5KUEVHX2Vycm9yID0gMjsKKwkJCS8qKioqKioqKioqIEVuZCBSRVNUQVJUIGNvZGUgKioqKioqKioqKiovCisJCX0KKwl9IHdoaWxlICgwKTsKK30KKworaXJxcmV0dXJuX3QKK3pvcmFuX2lycSAoaW50ICAgICAgICAgICAgIGlycSwKKwkgICB2b2lkICAgICAgICAgICAqZGV2X2lkKQoreworCXUzMiBzdGF0LCBhc3RhdDsKKwlpbnQgY291bnQ7CisJc3RydWN0IHpvcmFuICp6cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJenIgPSBkZXZfaWQ7CisJY291bnQgPSAwOworCisJaWYgKHpyLT50ZXN0aW5nKSB7CisJCS8qIFRlc3RpbmcgaW50ZXJydXB0cyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCXdoaWxlICgoc3RhdCA9IGNvdW50X3Jlc2V0X2ludGVycnVwdCh6cikpKSB7CisJCQlpZiAoY291bnQrKyA+IDEwMCkgeworCQkJCWJ0YW5kKH5aUjM2MDU3X0lDUl9JbnRQaW5FbiwgWlIzNjA1N19JQ1IpOworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBJUlEgbG9ja3VwIHdoaWxlIHRlc3RpbmcsIGlzcj0weCUwOHgsIGNsZWFyZWQgaW50IG1hc2tcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBzdGF0KTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT50ZXN0X3EpOworCQkJfQorCQl9CisJCXpyLT5sYXN0X2lzciA9IHN0YXQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCXdoaWxlICgxKSB7CisJCS8qIGdldC9jbGVhciBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KKwkJc3RhdCA9IGNvdW50X3Jlc2V0X2ludGVycnVwdCh6cik7CisJCWFzdGF0ID0gc3RhdCAmIElSUV9NQVNLOworCQlpZiAoIWFzdGF0KSB7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKDQsCisJCQlLRVJOX0RFQlVHCisJCQkiem9yYW5faXJxOiBhc3RhdDogMHglMDh4LCBtYXNrOiAweCUwOHhcbiIsCisJCQlhc3RhdCwgYnRyZWFkKFpSMzYwNTdfSUNSKSk7CisJCWlmIChhc3RhdCAmIHpyLT5jYXJkLnZzeW5jX2ludCkgewkvLyBTVworCisJCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MgfHwKKwkJCSAgICB6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1MpIHsKKwkJCQkvKiBjb3VudCBtaXNzZWQgaW50ZXJydXB0cyAqLworCQkJCXpyLT5KUEVHX21pc3NlZCsrOworCQkJfQorCQkJLy9wb3N0X29mZmljZV9yZWFkKHpyLDEsMCk7CisJCQkvKiBJbnRlcnJ1cHRzIG1heSBzdGlsbCBoYXBwZW4gd2hlbgorCQkJICogenItPnY0bF9tZW1ncmFiX2FjdGl2ZSBpcyBzd2l0Y2hlZCBvZmYuCisJCQkgKiBXZSBzaW1wbHkgaWdub3JlIHRoZW0gKi8KKworCQkJaWYgKHpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpIHsKKworCQkJCS8qIEEgbG90IG1vcmUgY2hlY2tzIHNob3VsZCBiZSBoZXJlIC4uLiAqLworCQkJCWlmICgoYnRyZWFkKFpSMzYwNTdfVlNTRkdSKSAmCisJCQkJICAgICBaUjM2MDU3X1ZTU0ZHUl9TbmFwU2hvdCkgPT0gMCkKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9XQVJOSU5HCisJCQkJCQkiJXM6IEJ1eklSUSB3aXRoIFNuYXBTaG90IG9mZiA/Pz9cbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lICE9IE5PX0dSQUJfQUNUSVZFKSB7CisJCQkJCS8qIFRoZXJlIGlzIGEgZ3JhYiBvbiBhIGZyYW1lIGdvaW5nIG9uLCBjaGVjayBpZiBpdCBoYXMgZmluaXNoZWQgKi8KKworCQkJCQlpZiAoKGJ0cmVhZChaUjM2MDU3X1ZTU0ZHUikgJgorCQkJCQkgICAgIFpSMzYwNTdfVlNTRkdSX0ZyYW1lR3JhYikgPT0KKwkJCQkJICAgIDApIHsKKwkJCQkJCS8qIGl0IGlzIGZpbmlzaGVkLCBub3RpZnkgdGhlIHVzZXIgKi8KKworCQkJCQkJenItPnY0bF9idWZmZXJzLmJ1ZmZlclt6ci0+djRsX2dyYWJfZnJhbWVdLnN0YXRlID0gQlVaX1NUQVRFX0RPTkU7CisJCQkJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW3pyLT52NGxfZ3JhYl9mcmFtZV0uYnMuc2VxID0genItPnY0bF9ncmFiX3NlcTsKKwkJCQkJCWRvX2dldHRpbWVvZmRheSgmenItPnY0bF9idWZmZXJzLmJ1ZmZlclt6ci0+djRsX2dyYWJfZnJhbWVdLmJzLnRpbWVzdGFtcCk7CisJCQkJCQl6ci0+djRsX2dyYWJfZnJhbWUgPSBOT19HUkFCX0FDVElWRTsKKwkJCQkJCXpyLT52NGxfcGVuZF90YWlsKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lID09IE5PX0dSQUJfQUNUSVZFKQorCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT52NGxfY2FwcSk7CisKKwkJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIGdyYWIgcXVldWVkICovCisKKwkJCQlpZiAoenItPnY0bF9ncmFiX2ZyYW1lID09IE5PX0dSQUJfQUNUSVZFICYmCisJCQkJICAgIHpyLT52NGxfcGVuZF90YWlsICE9IHpyLT52NGxfcGVuZF9oZWFkKSB7CisKKwkJCQkJaW50IGZyYW1lID0genItPnY0bF9wZW5kW3pyLT52NGxfcGVuZF90YWlsICYKKwkJCQkJCQkgVjRMX01BU0tfRlJBTUVdOworCQkJCQl1MzIgcmVnOworCisJCQkJCXpyLT52NGxfZ3JhYl9mcmFtZSA9IGZyYW1lOworCisJCQkJCS8qIFNldCB6cjM2MDU3IHZpZGVvIGZyb250IGVuZCBhbmQgZW5hYmxlIHZpZGVvICovCisKKwkJCQkJLyogQnVmZmVyIGFkZHJlc3MgKi8KKworCQkJCQlyZWcgPQorCQkJCQkgICAgenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uCisJCQkJCSAgICBmYnVmZmVyX2J1czsKKwkJCQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRUUik7CisJCQkJCWlmICh6ci0+djRsX3NldHRpbmdzLmhlaWdodCA+CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQkJCQlyZWcgKz0KKwkJCQkJCSAgICB6ci0+djRsX3NldHRpbmdzLgorCQkJCQkJICAgIGJ5dGVzcGVybGluZTsKKwkJCQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRCUik7CisKKwkJCQkJLyogdmlkZW8gc3RyaWRlLCBzdGF0dXMsIGFuZCBmcmFtZSBncmFiIHJlZ2lzdGVyICovCisJCQkJCXJlZyA9IDA7CisJCQkJCWlmICh6ci0+djRsX3NldHRpbmdzLmhlaWdodCA+CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVCAvIDIpCisJCQkJCQlyZWcgKz0KKwkJCQkJCSAgICB6ci0+djRsX3NldHRpbmdzLgorCQkJCQkJICAgIGJ5dGVzcGVybGluZTsKKwkJCQkJcmVnID0KKwkJCQkJICAgIChyZWcgPDwKKwkJCQkJICAgICBaUjM2MDU3X1ZTU0ZHUl9EaXNwU3RyaWRlKTsKKwkJCQkJcmVnIHw9IFpSMzYwNTdfVlNTRkdSX1ZpZE92ZjsKKwkJCQkJcmVnIHw9IFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90OworCQkJCQlyZWcgfD0gWlIzNjA1N19WU1NGR1JfRnJhbWVHcmFiOworCQkJCQlidHdyaXRlKHJlZywgWlIzNjA1N19WU1NGR1IpOworCisJCQkJCWJ0b3IoWlIzNjA1N19WRENSX1ZpZEVuLAorCQkJCQkgICAgIFpSMzYwNTdfVkRDUik7CisJCQkJfQorCQkJfQorCisJCQkvKiBldmVuIGlmIHdlIGRvbid0IGdyYWIsIHdlIGRvIHdhbnQgdG8gaW5jcmVtZW50CisJCQkgKiB0aGUgc2VxdWVuY2UgY291bnRlciB0byBzZWUgbG9zdCBmcmFtZXMgKi8KKwkJCXpyLT52NGxfZ3JhYl9zZXErKzsKKwkJfQorI2lmIChJUlFfTUFTSyAmIFpSMzYwNTdfSVNSX0NvZFJlcElSUSkKKwkJaWYgKGFzdGF0ICYgWlIzNjA1N19JU1JfQ29kUmVwSVJRKSB7CisJCQl6ci0+aW50cl9jb3VudGVyX0NvZFJlcElSUSsrOworCQkJSURFQlVHKHByaW50aworCQkJICAgICAgIChLRVJOX0RFQlVHICIlczogWlIzNjA1N19JU1JfQ29kUmVwSVJRXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKSk7CisJCQlidGFuZCh+WlIzNjA1N19JQ1JfQ29kUmVwSVJRLCBaUjM2MDU3X0lDUik7CisJCX0KKyNlbmRpZgkJCQkvKiAoSVJRX01BU0sgJiBaUjM2MDU3X0lTUl9Db2RSZXBJUlEpICovCisKKyNpZiAoSVJRX01BU0sgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKQorCQlpZiAoYXN0YXQgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKSB7CisKKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyB8fAorCQkJICAgIHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgeworCQkJCWlmICh6cjM2MDY3X2RlYnVnID4gMSAmJgorCQkJCSAgICAoIXpyLT5mcmFtZV9udW0gfHwgenItPkpQRUdfZXJyb3IpKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICIlczogZmlyc3QgZnJhbWUgcmVhZHk6IHN0YXRlPTB4JTA4eCBvZGRfZXZlbj0lZCBmaWVsZF9wZXJfYnVmZj0lZCBkZWxheT0lZFxuIiwKKwkJCQkJICAgICAgIFpSX0RFVk5BTUUoenIpLCBzdGF0LAorCQkJCQkgICAgICAgenItPmpwZ19zZXR0aW5ncy5vZGRfZXZlbiwKKwkJCQkJICAgICAgIHpyLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgICBmaWVsZF9wZXJfYnVmZiwKKwkJCQkJICAgICAgIHpyLT5KUEVHX21pc3NlZCk7CisJCQkJCXsKKwkJCQkJCWNoYXIgc2NbXSA9ICIwMDAwIjsKKwkJCQkJCWNoYXIgc3ZbNV07CisJCQkJCQlpbnQgaTsKKwkJCQkJCXN0cmNweShzdiwgc2MpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCQkJCWlmIChsZTMyX3RvX2NwdSh6ci0+c3RhdF9jb21baV0pICYgMSkKKwkJCQkJCQkJc3ZbaV0gPSAnMSc7CisJCQkJCQl9CisJCQkJCQlzdls0XSA9IDA7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCQkgICAgICAgIiVzOiBzdGF0X2NvbT0lcyBxdWV1ZV9zdGF0ZT0lbGQvJWxkLyVsZC8lbGRcbiIsCisJCQkJCQkgICAgICAgWlJfREVWTkFNRSh6ciksIHN2LAorCQkJCQkJICAgICAgIHpyLT5qcGdfcXVlX3RhaWwsCisJCQkJCQkgICAgICAgenItPmpwZ19kbWFfdGFpbCwKKwkJCQkJCSAgICAgICB6ci0+anBnX2RtYV9oZWFkLAorCQkJCQkJICAgICAgIHpyLT5qcGdfcXVlX2hlYWQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHpyLT5KUEVHX21pc3NlZCA+IHpyLT5KUEVHX21heF9taXNzZWQpCS8vIEdldCBzdGF0aXN0aWNzCisJCQkJCQl6ci0+SlBFR19tYXhfbWlzc2VkID0KKwkJCQkJCSAgICB6ci0+SlBFR19taXNzZWQ7CisJCQkJCWlmICh6ci0+SlBFR19taXNzZWQgPAorCQkJCQkgICAgenItPkpQRUdfbWluX21pc3NlZCkKKwkJCQkJCXpyLT5KUEVHX21pbl9taXNzZWQgPQorCQkJCQkJICAgIHpyLT5KUEVHX21pc3NlZDsKKwkJCQl9CisKKwkJCQlpZiAoenIzNjA2N19kZWJ1ZyA+IDIgJiYgenItPmZyYW1lX251bSA8IDYpIHsKKwkJCQkJaW50IGk7CisJCQkJCXByaW50aygiJXM6IHNlcT0lbGQgc3RhdF9jb206IiwKKwkJCQkJICAgICAgIFpSX0RFVk5BTUUoenIpLCB6ci0+anBnX3NlcV9udW0pOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCQlwcmludGsoIiAlMDh4IiwKKwkJCQkJCSAgICAgICBsZTMyX3RvX2NwdSh6ci0+c3RhdF9jb21baV0pKTsKKwkJCQkJfQorCQkJCQlwcmludGsoIlxuIik7CisJCQkJfQorCQkJCXpyLT5mcmFtZV9udW0rKzsKKwkJCQl6ci0+SlBFR19taXNzZWQgPSAwOworCQkJCXpyLT5KUEVHX2Vycm9yID0gMDsKKwkJCQl6b3Jhbl9yZWFwX3N0YXRfY29tKHpyKTsKKwkJCQl6b3Jhbl9mZWVkX3N0YXRfY29tKHpyKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnpyLT5qcGdfY2FwcSk7CisJCQl9IC8qZWxzZSB7CisJCQkgICAgICBkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogSlBFRyBpbnRlcnJ1cHQgd2hpbGUgbm90IGluIG1vdGlvbiAoZGUpY29tcHJlc3MgbW9kZSFcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCX0qLworCQl9CisjZW5kaWYJCQkJLyogKElSUV9NQVNLICYgWlIzNjA1N19JU1JfSlBFR1JlcElSUSkgKi8KKworCQkvKiBEQVRFUlIsIHRvbyBtYW55IGZpZWxkcyBtaXNzZWQsIGVycm9yIHByb2Nlc3NpbmcgKi8KKwkJaWYgKChhc3RhdCAmIHpyLT5jYXJkLmpwZWdfaW50KSB8fAorCQkgICAgenItPkpQRUdfbWlzc2VkID4gMjUgfHwKKwkJICAgIHpyLT5KUEVHX2Vycm9yID09IDEJfHwKKwkJICAgICgoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpICYmCisJCSAgICAgKHpyLT5mcmFtZV9udW0gJiAoenItPkpQRUdfbWlzc2VkID4KKwkJCQkgICAgICAgenItPmpwZ19zZXR0aW5ncy5maWVsZF9wZXJfYnVmZikpKSkgeworCQkJZXJyb3JfaGFuZGxlcih6ciwgYXN0YXQsIHN0YXQpOworCQl9CisKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ID4gMTApIHsKKwkJCWRwcmludGsoMiwgS0VSTl9XQVJOSU5HICIlczogaXJxIGxvb3AgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGNvdW50KTsKKwkJCWlmIChjb3VudCA+IDIwKSB7CisJCQkJYnRhbmQoflpSMzYwNTdfSUNSX0ludFBpbkVuLCBaUjM2MDU3X0lDUik7CisJCQkJZHByaW50aygyLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IElSUSBsb2NrdXAsIGNsZWFyZWQgaW50IG1hc2tcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQl6ci0+bGFzdF9pc3IgPSBzdGF0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZAorem9yYW5fc2V0X3BjaV9tYXN0ZXIgKHN0cnVjdCB6b3JhbiAqenIsCisJCSAgICAgIGludCAgICAgICAgICAgc2V0X21hc3RlcikKK3sKKwlpZiAoc2V0X21hc3RlcikgeworCQlwY2lfc2V0X21hc3Rlcih6ci0+cGNpX2Rldik7CisJfSBlbHNlIHsKKwkJdTE2IGNvbW1hbmQ7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoenItPnBjaV9kZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJCWNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHpyLT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgY29tbWFuZCk7CisJfQorfQorCit2b2lkCit6b3Jhbl9pbml0X2hhcmR3YXJlIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWludCBqLCB6ZXJvID0gMDsKKworCS8qIEVuYWJsZSBidXMtbWFzdGVyaW5nICovCisJem9yYW5fc2V0X3BjaV9tYXN0ZXIoenIsIDEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYm9hcmQgKi8KKwlpZiAoenItPmNhcmQuaW5pdCkgeworCQl6ci0+Y2FyZC5pbml0KHpyKTsKKwl9CisKKwlqID0genItPmNhcmQuaW5wdXRbenItPmlucHV0XS5tdXhzZWw7CisKKwlkZWNvZGVyX2NvbW1hbmQoenIsIDAsIE5VTEwpOworCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJnpyLT5ub3JtKTsKKwlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX0lOUFVULCAmaik7CisKKwllbmNvZGVyX2NvbW1hbmQoenIsIDAsIE5VTEwpOworCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfTk9STSwgJnpyLT5ub3JtKTsKKwllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX0lOUFVULCAmemVybyk7CisKKwkvKiB0b2dnbGUgSlBFRyBjb2RlYyBzbGVlcCB0byBzeW5jIFBMTCAqLworCWpwZWdfY29kZWNfc2xlZXAoenIsIDEpOworCWpwZWdfY29kZWNfc2xlZXAoenIsIDApOworCisJLyogc2V0IGluZGl2aWR1YWwgaW50ZXJydXB0IGVuYWJsZXMgKHdpdGhvdXQgR0lSUTEpCisJICogYnV0IGRvbid0IGdsb2JhbCBlbmFibGUgdW50aWwgem9yYW5fb3BlbigpICovCisKKwkvL2J0d3JpdGUoSVJRX01BU0sgJiB+WlIzNjA1N19JU1JfR0lSUTEsIFpSMzYwNTdfSUNSKTsgIC8vIFNXCisJLy8gSXQgbG9va3MgbGlrZSB1c2luZyBvbmx5IEpQRUdSZXBJUlFFbiBpcyBub3QgYWx3YXlzIHJlbGlhYmxlLAorCS8vIG1heSBiZSB3aGVuIEpQRUcgY29kZWMgY3Jhc2hlcyBpdCB3b24ndCBnZW5lcmF0ZSBJUlE/IFNvLAorCSAvKkNQKi8JCQkvLyAgICAgICAgYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JQ1IpOyAvLyBFbmFibGUgVnN5bmMgaW50ZXJydXB0cyB0b28uIFNNICAgIFdIWSA/IExQCisJICAgIHpyMzYwNTdfaW5pdF92ZmUoenIpOworCisJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKworCWJ0d3JpdGUoSVJRX01BU0ssIFpSMzYwNTdfSVNSKTsJLy8gQ2xlYXJzIGludGVycnVwdHMKK30KKwordm9pZAorenIzNjA1N19yZXN0YXJ0IChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCWJ0d3JpdGUoMCwgWlIzNjA1N19TUEdQUENSKTsKKwltZGVsYXkoMSk7CisJYnRvcihaUjM2MDU3X1NQR1BQQ1JfU29mdFJlc2V0LCBaUjM2MDU3X1NQR1BQQ1IpOworCW1kZWxheSgxKTsKKworCS8qIGFzc2VydCBQX1Jlc2V0ICovCisJYnR3cml0ZSgwLCBaUjM2MDU3X0pQQyk7CisJLyogc2V0IHVwIEdQSU8gZGlyZWN0aW9uIC0gYWxsIG91dHB1dCAqLworCWJ0d3JpdGUoWlIzNjA1N19TUEdQUENSX1NvZnRSZXNldCB8IDAsIFpSMzYwNTdfU1BHUFBDUik7CisKKwkvKiBzZXQgdXAgR1BJTyBwaW5zIGFuZCBndWVzdCBidXMgdGltaW5nICovCisJYnR3cml0ZSgoMHg4MSA8PCAyNCkgfCAweDg4ODgsIFpSMzYwNTdfR1BQR0NSMSk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIHZpZGVvIGZyb250IGVuZAorICovCisKK3N0YXRpYyB2b2lkCit6cjM2MDU3X2luaXRfdmZlIChzdHJ1Y3Qgem9yYW4gKnpyKQoreworCXUzMiByZWc7CisKKwlyZWcgPSBidHJlYWQoWlIzNjA1N19WRkVTUEZSKTsKKwlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbjsKKwlyZWcgJj0gflpSMzYwNTdfVkZFU1BGUl9WQ0xLUG9sOworCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfRXh0Rmw7CisJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9Ub3BGaWVsZDsKKwlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVTUEZSKTsKKwlyZWcgPSBidHJlYWQoWlIzNjA1N19WRENSKTsKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9UUklUT04pCisJCS8vIHx8IHpyLT5yZXZpc2lvbiA8IDEpIC8vIFJldmlzaW9uIDEgaGFzIGFsc28gVHJpdG9uIHN1cHBvcnQKKwkJcmVnICY9IH5aUjM2MDU3X1ZEQ1JfVHJpdG9uOworCWVsc2UKKwkJcmVnIHw9IFpSMzYwNTdfVkRDUl9Ucml0b247CisJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkRDUik7Cit9CisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZGVjb2RlciBhbmQgZW5jb2RlciBjaGlwcyB1c2luZyBpMmMgYnVzCisgKi8KKworaW50CitkZWNvZGVyX2NvbW1hbmQgKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgICAgICAgICAgIGNtZCwKKwkJIHZvaWQgICAgICAgICAqZGF0YSkKK3sKKwlpZiAoenItPmRlY29kZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoenItPmNhcmQudHlwZSA9PSBMTUwzMyAmJgorCSAgICAoY21kID09IERFQ09ERVJfU0VUX05PUk0gfHwgY21kID09IERFQ09ERVJfU0VUX0lOUFVUKSkgeworCQlpbnQgcmVzOworCisJCS8vIEJ0ODE5IG5lZWRzIHRvIHJlc2V0IGl0cyBGSUZPIGJ1ZmZlciB1c2luZyAjRlJTVCBwaW4gYW5kCisJCS8vIExNTDMzIGNhcmQgdXNlcyBHUElPKDcpIGZvciB0aGF0LgorCQlHUElPKHpyLCA3LCAwKTsKKwkJcmVzID0genItPmRlY29kZXItPmRyaXZlci0+Y29tbWFuZCh6ci0+ZGVjb2RlciwgY21kLCBkYXRhKTsKKwkJLy8gUHVsbCAjRlJTVCBoaWdoLgorCQlHUElPKHpyLCA3LCAxKTsKKwkJcmV0dXJuIHJlczsKKwl9IGVsc2UKKwkJcmV0dXJuIHpyLT5kZWNvZGVyLT5kcml2ZXItPmNvbW1hbmQoenItPmRlY29kZXIsIGNtZCwKKwkJCQkJCSAgICBkYXRhKTsKK30KKworaW50CitlbmNvZGVyX2NvbW1hbmQgKHN0cnVjdCB6b3JhbiAqenIsCisJCSBpbnQgICAgICAgICAgIGNtZCwKKwkJIHZvaWQgICAgICAgICAqZGF0YSkKK3sKKwlpZiAoenItPmVuY29kZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHpyLT5lbmNvZGVyLT5kcml2ZXItPmNvbW1hbmQoenItPmVuY29kZXIsIGNtZCwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RldmljZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM2YzhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQorICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4CisgKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgorICoKKyAqIFRoaXMgcGFydCBoYW5kbGVzIGNhcmQtc3BlY2lmaWMgZGF0YSBhbmQgZGV0ZWN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFNlcmd1ZWkgTWlyaWRvbm92IDxtaXJzZXZAY2ljZXNlLm14PgorICoKKyAqIEN1cnJlbnRseSBtYWludGFpbmVkIGJ5OgorICogICBSb25hbGQgQnVsdGplICAgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKiAgIExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlPgorICogICBNYWlsaW5nbGlzdCAgICAgIDxtanBlZy11c2Vyc0BsaXN0cy5zZi5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1pPUkFOX0RFVklDRV9IX18KKyNkZWZpbmUgX19aT1JBTl9ERVZJQ0VfSF9fCisKKy8qIGdlbmVyYWwgcHVycG9zZSBJL08gKi8KK2V4dGVybiB2b2lkIEdQSU8oc3RydWN0IHpvcmFuICp6ciwKKwkJIGludCBiaXQsCisJCSB1bnNpZ25lZCBpbnQgdmFsdWUpOworCisvKiBjb2RlYyAob3IgYWN0dWFsbHk6IGd1ZXN0IGJ1cykgYWNjZXNzICovCitleHRlcm4gaW50IHBvc3Rfb2ZmaWNlX3dhaXQoc3RydWN0IHpvcmFuICp6cik7CitleHRlcm4gaW50IHBvc3Rfb2ZmaWNlX3dyaXRlKHN0cnVjdCB6b3JhbiAqenIsCisJCQkgICAgIHVuc2lnbmVkIGd1ZXN0LAorCQkJICAgICB1bnNpZ25lZCByZWcsCisJCQkgICAgIHVuc2lnbmVkIHZhbHVlKTsKK2V4dGVybiBpbnQgcG9zdF9vZmZpY2VfcmVhZChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgIHVuc2lnbmVkIGd1ZXN0LAorCQkJICAgIHVuc2lnbmVkIHJlZyk7CisKK2V4dGVybiB2b2lkIGRldGVjdF9ndWVzdF9hY3Rpdml0eShzdHJ1Y3Qgem9yYW4gKnpyKTsKKworZXh0ZXJuIHZvaWQganBlZ19jb2RlY19zbGVlcChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgICBpbnQgc2xlZXApOworZXh0ZXJuIGludCBqcGVnX2NvZGVjX3Jlc2V0KHN0cnVjdCB6b3JhbiAqenIpOworCisvKiB6cjM2MHg3IGFjY2VzcyB0byByYXcgY2FwdHVyZSAqLworZXh0ZXJuIHZvaWQgenIzNjA1N19vdmVybGF5KHN0cnVjdCB6b3JhbiAqenIsCisJCQkgICAgaW50IG9uKTsKK2V4dGVybiB2b2lkIHdyaXRlX292ZXJsYXlfbWFzayhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICBzdHJ1Y3QgdmlkZW9fY2xpcCAqdnAsCisJCQkgICAgICAgaW50IGNvdW50KTsKK2V4dGVybiB2b2lkIHpyMzYwNTdfc2V0X21lbWdyYWIoc3RydWN0IHpvcmFuICp6ciwKKwkJCQlpbnQgbW9kZSk7CitleHRlcm4gaW50IHdhaXRfZ3JhYl9wZW5kaW5nKHN0cnVjdCB6b3JhbiAqenIpOworCisvKiBpbnRlcnJ1cHRzICovCitleHRlcm4gdm9pZCBwcmludF9pbnRlcnJ1cHRzKHN0cnVjdCB6b3JhbiAqenIpOworZXh0ZXJuIHZvaWQgY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHN0cnVjdCB6b3JhbiAqenIpOworZXh0ZXJuIGlycXJldHVybl90IHpvcmFuX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisvKiBKUEVHIGNvZGVjIGFjY2VzcyAqLworZXh0ZXJuIHZvaWQganBlZ19zdGFydChzdHJ1Y3Qgem9yYW4gKnpyKTsKK2V4dGVybiB2b2lkIHpyMzYwNTdfZW5hYmxlX2pwZyhzdHJ1Y3Qgem9yYW4gKnpyLAorCQkJICAgICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSBtb2RlKTsKK2V4dGVybiB2b2lkIHpvcmFuX2ZlZWRfc3RhdF9jb20oc3RydWN0IHpvcmFuICp6cik7CisKKy8qIGdlbmVyYWwgKi8KK2V4dGVybiB2b2lkIHpvcmFuX3NldF9wY2lfbWFzdGVyKHN0cnVjdCB6b3JhbiAqenIsCisJCQkJIGludCBzZXRfbWFzdGVyKTsKK2V4dGVybiB2b2lkIHpvcmFuX2luaXRfaGFyZHdhcmUoc3RydWN0IHpvcmFuICp6cik7CitleHRlcm4gdm9pZCB6cjM2MDU3X3Jlc3RhcnQoc3RydWN0IHpvcmFuICp6cik7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0IHpvcmFuX2Zvcm1hdHNbXTsKKworZXh0ZXJuIGludCB2NGxfbmJ1ZnM7CitleHRlcm4gaW50IHY0bF9idWZzaXplOworZXh0ZXJuIGludCBqcGdfbmJ1ZnM7CitleHRlcm4gaW50IGpwZ19idWZzaXplOworZXh0ZXJuIGludCBwYXNzX3Rocm91Z2g7CisKKy8qIGkyYyAqLworZXh0ZXJuIGludCBkZWNvZGVyX2NvbW1hbmQoc3RydWN0IHpvcmFuICp6ciwKKwkJCSAgIGludCBjbWQsCisJCQkgICB2b2lkICpkYXRhKTsKK2V4dGVybiBpbnQgZW5jb2Rlcl9jb21tYW5kKHN0cnVjdCB6b3JhbiAqenIsCisJCQkgICBpbnQgY21kLAorCQkJICAgdm9pZCAqZGF0YSk7CisKKyNlbmRpZgkJCQkvKiBfX1pPUkFOX0RFVklDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGU3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCkBAIC0wLDAgKzEsNDY0OSBAQAorLyoKKyAqIFpvcmFuIHpyMzYwNTcvenIzNjA2NyBQQ0kgY29udHJvbGxlciBkcml2ZXIsIGZvciB0aGUKKyAqIFBpbm5hY2xlL01pcm8gREMxMC9EQzEwKy9EQzMwL0RDMzArLCBJb21lZ2EgQnV6LCBMaW51eAorICogTWVkaWEgTGFicyBMTUwzMy9MTUwzM1IxMC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2VyZ3VlaSBNaXJpZG9ub3YgPG1pcnNldkBjaWNlc2UubXg+CisgKgorICogQ2hhbmdlcyBmb3IgQlVaIGJ5IFdvbGZnYW5nIFNjaGVyciA8c2NoZXJyQG5ldDR5b3UubmV0PgorICoKKyAqIENoYW5nZXMgZm9yIERDMTAvREMzMCBieSBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KKyAqCisgKiBDaGFuZ2VzIGZvciBMTUwzM1IxMCBieSBNYXhpbSBZZXZ0eXVzaGtpbiA8bWF4QGxpbnV4bWVkaWFsYWJzLmNvbT4KKyAqCisgKiBDaGFuZ2VzIGZvciB2aWRlb2RldjIvdjRsMiBieSBSb25hbGQgQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+CisgKgorICogQmFzZWQgb24KKyAqCisgKiBNaXJvIERDMTAgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV29sZmdhbmcgU2NoZXJyIDxzY2hlcnJAbmV0NHlvdS5uZXQ+CisgKgorICogSW9tZWdhIEJ1eiBkcml2ZXIgdmVyc2lvbiAxLjAKKyAqIENvcHlyaWdodCAoQykgMTk5OSBSYWluZXIgSm9oYW5uaSA8UmFpbmVyQEpvaGFubmkuZGU+CisgKgorICogYnV6LjAuMC4zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggRGF2ZSBQZXJrcyA8ZHBlcmtzQGlibS5uZXQ+CisgKgorICogYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2RlZmluZSAgICAgTUFQX05SKHgpICAgICAgIHZpcnRfdG9fcGFnZSh4KQorI2RlZmluZSAgICAgWk9SQU5fVklEX1RZUEUgICggXAorCQkJCVZJRF9UWVBFX0NBUFRVUkUgfCBcCisJCQkJVklEX1RZUEVfT1ZFUkxBWSB8IFwKKwkJCQlWSURfVFlQRV9DTElQUElORyB8IFwKKwkJCQlWSURfVFlQRV9GUkFNRVJBTSB8IFwKKwkJCQlWSURfVFlQRV9TQ0FMRVMgfCBcCisJCQkJVklEX1RZUEVfTUpQRUdfREVDT0RFUiB8IFwKKwkJCQlWSURfVFlQRV9NSlBFR19FTkNPREVSIFwKKwkJCSAgICAgKQorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSAiem9yYW4uaCIKKyNpbmNsdWRlICJ6b3Jhbl9kZXZpY2UuaCIKKyNpbmNsdWRlICJ6b3Jhbl9jYXJkLmgiCisKKwkvKiB3ZSBkZWNsYXJlIHNvbWUgY2FyZCB0eXBlIGRlZmluaXRpb25zIGhlcmUsIHRoZXkgbWVhbgorCSAqIHRoZSBzYW1lIGFzIHRoZSB2NGwxIFpPUkFOX1ZJRF9UWVBFIGFib3ZlLCBleGNlcHQgaXQncyB2NGwyICovCisjZGVmaW5lIFpPUkFOX1Y0TDJfVklEX0ZMQUdTICggXAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyB8XAorCQkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfFwKKwkJCQlWNEwyX0NBUF9WSURFT19PVVRQVVQgfFwKKwkJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIFwKKwkJCSAgICAgICkKKworCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fVjRMMV9DT01QQVQpCisjZGVmaW5lIFpGTVQocGFsLCBmY2MsIGNzKSBcCisJLnBhbGV0dGUgPSAocGFsKSwgLmZvdXJjYyA9IChmY2MpLCAuY29sb3JzcGFjZSA9IChjcykKKyNlbHNlCisjZGVmaW5lIFpGTVQocGFsLCBmY2MsIGNzKSBcCisJLmZvdXJjYyA9IChmY2MpLCAuY29sb3JzcGFjZSA9IChjcykKKyNlbmRpZgorCitjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0IHpvcmFuX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjE1LWJpdCBSR0IgTEUiLAorCQlaRk1UKFZJREVPX1BBTEVUVEVfUkdCNTU1LAorCQkgICAgIFY0TDJfUElYX0ZNVF9SR0I1NTUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKKwkJLmRlcHRoID0gMTUsCisJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKKwkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKKwkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTU1fFpSMzYwNTdfVkZFU1BGUl9FcnJEaWZ8CisJCQkgICBaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAorCX0sIHsKKwkJLm5hbWUgPSAiMTUtYml0IFJHQiBCRSIsCisJCVpGTVQoLTEsCisJCSAgICAgVjRMMl9QSVhfRk1UX1JHQjU1NVgsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKKwkJLmRlcHRoID0gMTUsCisJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKKwkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKKwkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTU1fFpSMzYwNTdfVkZFU1BGUl9FcnJEaWYsCisJfSwgeworCQkubmFtZSA9ICIxNi1iaXQgUkdCIExFIiwKKwkJWkZNVChWSURFT19QQUxFVFRFX1JHQjU2NSwKKwkJICAgICBWNEwyX1BJWF9GTVRfUkdCNTY1LCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCisJCS5kZXB0aCA9IDE2LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjU2NXxaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmfAorCQkJICAgWlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbiwKKwl9LCB7CisJCS5uYW1lID0gIjE2LWJpdCBSR0IgQkUiLAorCQlaRk1UKC0xLAorCQkgICAgIFY0TDJfUElYX0ZNVF9SR0I1NjVYLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCisJCS5kZXB0aCA9IDE2LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjU2NXxaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmLAorCX0sIHsKKwkJLm5hbWUgPSAiMjQtYml0IFJHQiIsCisJCVpGTVQoVklERU9fUEFMRVRURV9SR0IyNCwKKwkJICAgICBWNEwyX1BJWF9GTVRfQkdSMjQsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKKwkJLmRlcHRoID0gMjQsCisJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKKwkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKKwkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCODg4fFpSMzYwNTdfVkZFU1BGUl9QYWNrMjQsCisJfSwgeworCQkubmFtZSA9ICIzMi1iaXQgUkdCIExFIiwKKwkJWkZNVChWSURFT19QQUxFVFRFX1JHQjMyLAorCQkgICAgIFY0TDJfUElYX0ZNVF9CR1IzMiwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAorCQkuZGVwdGggPSAzMiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODh8WlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbiwKKwl9LCB7CisJCS5uYW1lID0gIjMyLWJpdCBSR0IgQkUiLAorCQlaRk1UKC0xLAorCQkgICAgIFY0TDJfUElYX0ZNVF9SR0IzMiwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAorCQkuZGVwdGggPSAzMiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODgsCisJfSwgeworCQkubmFtZSA9ICI0OjI6MiwgcGFja2VkLCBZVVlWIiwKKwkJWkZNVChWSURFT19QQUxFVFRFX1lVVjQyMiwKKwkJICAgICBWNEwyX1BJWF9GTVRfWVVZViwgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSksCisJCS5kZXB0aCA9IDE2LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1lVVjQyMiwKKwl9LCB7CisJCS5uYW1lID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAorCQlaRk1UKFZJREVPX1BBTEVUVEVfVVlWWSwKKwkJICAgICBWNEwyX1BJWF9GTVRfVVlWWSwgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSksCisJCS5kZXB0aCA9IDE2LAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1lVVjQyMnxaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAorCX0sIHsKKwkJLm5hbWUgPSAiSGFyZHdhcmUtZW5jb2RlZCBNb3Rpb24tSlBFRyIsCisJCVpGTVQoLTEsCisJCSAgICAgVjRMMl9QSVhfRk1UX01KUEVHLCBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNKSwKKwkJLmRlcHRoID0gMCwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9QTEFZQkFDSyB8CisJCQkgWk9SQU5fRk9STUFUX0NPTVBSRVNTRUQsCisJfQorfTsKKyNkZWZpbmUgTlVNX0ZPUk1BVFMgQVJSQVlfU0laRSh6b3Jhbl9mb3JtYXRzKQorCisvLyBSSjogVGVzdCBvbmx5IC0gd2FudCB0byB0ZXN0IEJVWl9VU0VfSElNRU0gZXZlbiB3aGVuIENPTkZJR19CSUdQSFlTX0FSRUEgaXMgZGVmaW5lZAorCisKK3N0YXRpYyBpbnQgbG9ja19ub3JtOwkvKiAwID0gZGVmYXVsdCAxID0gRG9uJ3QgY2hhbmdlIFRWIHN0YW5kYXJkIChub3JtKSAqLworbW9kdWxlX3BhcmFtKGxvY2tfbm9ybSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG9ja19ub3JtLCAiUHJldmVudCBub3JtIGNoYW5nZXMgKDEgPSBpZ25vcmUsID4xID0gZmFpbCkiKTsKKworCS8qIHNtYWxsIGhlbHBlciBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgYnVmZmVyc2l6ZXMgZm9yIHY0bDIKKwkgKiB3ZSBjYWxjdWxhdGUgdGhlIG5lYXJlc3QgaGlnaGVyIHBvd2VyLW9mLXR3bywgd2hpY2gKKwkgKiB3aWxsIGJlIHRoZSByZWNvbW1lbmRlZCBidWZmZXJzaXplICovCitzdGF0aWMgX191MzIKK3pvcmFuX3Y0bDJfY2FsY19idWZzaXplIChzdHJ1Y3Qgem9yYW5fanBnX3NldHRpbmdzICpzZXR0aW5ncykKK3sKKwlfX3U4IGRpdiA9IHNldHRpbmdzLT5WZXJEY20gKiBzZXR0aW5ncy0+SG9yRGNtICogc2V0dGluZ3MtPlRtcERjbTsKKwlfX3UzMiBudW0gPSAoMTAyNCAqIDUxMikgLyAoZGl2KTsKKwlfX3UzMiByZXN1bHQgPSAyOworCisJbnVtLS07CisJd2hpbGUgKG51bSkgeworCQludW0gPj49IDE7CisJCXJlc3VsdCA8PD0gMTsKKwl9CisKKwlpZiAocmVzdWx0ID4ganBnX2J1ZnNpemUpCisJCXJldHVybiBqcGdfYnVmc2l6ZTsKKwlpZiAocmVzdWx0IDwgODE5MikKKwkJcmV0dXJuIDgxOTI7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZm9yd2FyZCByZWZlcmVuY2VzICovCitzdGF0aWMgdm9pZCB2NGxfZmJ1ZmZlcl9mcmVlKHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIGpwZ19mYnVmZmVyX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUpOworCisvKgorICogICBBbGxvY2F0ZSB0aGUgVjRMIGdyYWIgYnVmZmVycworICoKKyAqICAgVGhlc2UgaGF2ZSB0byBiZSBweXNpY2FsbHkgY29udGlndW91cy4KKyAqICAgSWYgdjRsX2J1ZnNpemUgPD0gTUFYX0tNQUxMT0NfTUVNIHdlIHVzZSBrbWFsbG9jCisgKiAgIGVsc2Ugd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZW0gd2l0aCBiaWdwaHlzYXJlYV9hbGxvY19wYWdlcworICogICBpZiB0aGUgYmlncGh5c2FyZWEgcGF0Y2ggaXMgcHJlc2VudCBpbiB0aGUga2VybmVsLAorICogICBlbHNlIHdlIHRyeSB0byB1c2UgaGlnaCBtZW1vcnkgKGlmIHRoZSB1c2VyIGhhcyBib290ZXQKKyAqICAgTGludXggd2l0aCB0aGUgbmVjZXNzYXJ5IG1lbW9yeSBsZWZ0IG92ZXIpLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitnZXRfaGlnaF9tZW0gKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKy8qCisgKiBDaGVjayBpZiB0aGVyZSBpcyB1c2FibGUgbWVtb3J5IGF0IHRoZSBlbmQgb2YgTGludXggbWVtb3J5CisgKiBvZiBhdCBsZWFzdCBzaXplLiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBtZW1vcnksCisgKiByZXR1cm4gMCBvbiBmYWlsdXJlLgorICoKKyAqIFRoZSBpZGVhIGlzIGZyb20gQWxleGFuZHJvIFJ1YmluaSdzIGJvb2sgIkxpbnV4IGRldmljZSBkcml2ZXJzIi4KKyAqIFRoZSBkcml2ZXIgZnJvbSBoaW0gd2hpY2ggaXMgZG93bmxvYWRhYmxlIGZyb20gTydSZWlsbHkncworICogd2ViIHNpdGUgbWlzc2VzIHRoZSAidmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSIgcGFydAorICogKGFuZCB0aGVyZWZvcmUgZG9lc24ndCB3b3JrIGF0IGFsbCAtIGF0IGxlYXN0IHdpdGggMi4yLngga2VybmVscykuCisgKgorICogSXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IHRvIG1lbnRpb24gdGhhdCBUSElTIElTIERBTkdFUk9VUywKKyAqIGlmIG1vcmUgdGhhbiBvbmUgZHJpdmVyIGF0IGEgdGltZSBoYXMgdGhlIGlkZWEgdG8gdXNlIHRoaXMgbWVtb3J5ISEhIQorICovCisKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKm1lbTsKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgbG9uZyBoaV9tZW1fcGg7CisJdW5zaWduZWQgbG9uZyBpOworCisJLyogTWFwIHRoZSBoaWdoIG1lbW9yeSB0byB1c2VyIHNwYWNlICovCisKKwloaV9tZW1fcGggPSB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpOworCisJbWVtID0gaW9yZW1hcChoaV9tZW1fcGgsIHNpemUpOworCWlmICghbWVtKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSICIlczogZ2V0X2hpZ2hfbWVtKCkgLSBpb3JlbWFwIGZhaWxlZFxuIiwKKwkJCVpPUkFOX05BTUUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCS8qIENoZWNrIGlmIGl0IGlzIG1lbW9yeSAqLworCQljID0gaSAmIDB4ZmY7CisJCXdyaXRlYihjLCBtZW0gKyBpKTsKKwkJaWYgKHJlYWRiKG1lbSArIGkpICE9IGMpCisJCQlicmVhazsKKwkJYyA9IDI1NSAtIGM7CisJCXdyaXRlYihjLCBtZW0gKyBpKTsKKwkJaWYgKHJlYWRiKG1lbSArIGkpICE9IGMpCisJCQlicmVhazsKKwkJd3JpdGViKDAsIG1lbSArIGkpOwkvKiB6ZXJvIG91dCBtZW1vcnkgKi8KKworCQkvKiBnaXZlIHRoZSBrZXJuZWwgYWlyIHRvIGJyZWF0aCAqLworCQlpZiAoKGkgJiAweDNmZmZmKSA9PSAweDNmZmZmKQorCQkJc2NoZWR1bGUoKTsKKwl9CisKKwlpb3VubWFwKG1lbSk7CisKKwlpZiAoaSAhPSBzaXplKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGdldF9oaWdoX21lbSgpIC0gcmVxdWVzdGVkICVsdSwgYXZhaWwgJWx1XG4iLAorCQkJWk9SQU5fTkFNRSwgc2l6ZSwgaSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBoaV9tZW1fcGg7Cit9CisKK3N0YXRpYyBpbnQKK3Y0bF9mYnVmZmVyX2FsbG9jIChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJaW50IGksIG9mZjsKKwl1bnNpZ25lZCBjaGFyICptZW07CisJdW5zaWduZWQgbG9uZyBwbWVtID0gMDsKKworCS8qIHdlIG1pZ2h0IGhhdmUgb2xkIGJ1ZmZlcnMgbHlpbmcgYXJvdW5kLi4uICovCisJaWYgKGZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCkgeworCQl2NGxfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgeworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyKQorCQkJZHByaW50aygyLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIGJ1ZmZlciAlZCBhbGxyZWFkeSBhbGxvY2F0ZWQhP1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisKKwkJLy91ZGVsYXkoMjApOworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplIDw9IE1BWF9LTUFMTE9DX01FTSkgeworCQkJLyogVXNlIGttYWxsb2MgKi8KKworCQkJbWVtID0ga21hbGxvYyhmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFtZW0pIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIGttYWxsb2MgZm9yIFY0TCBidWYgJWQgZmFpbGVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisJCQkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQl9CisJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIgPSBtZW07CisJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXJfcGh5cyA9CisJCQkgICAgdmlydF90b19waHlzKG1lbSk7CisJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXJfYnVzID0KKwkJCSAgICB2aXJ0X3RvX2J1cyhtZW0pOworCQkJZm9yIChvZmYgPSAwOyBvZmYgPCBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCQkgICAgIG9mZiArPSBQQUdFX1NJWkUpCisJCQkJU2V0UGFnZVJlc2VydmVkKE1BUF9OUihtZW0gKyBvZmYpKTsKKwkJCWRwcmludGsoNCwKKwkJCQlLRVJOX0lORk8KKwkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBWNEwgZnJhbWUgJWQgbWVtIDB4JWx4IChidXM6IDB4JWx4KVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgaSwgKHVuc2lnbmVkIGxvbmcpIG1lbSwKKwkJCQl2aXJ0X3RvX2J1cyhtZW0pKTsKKwkJfSBlbHNlIHsKKworCQkJLyogVXNlIGhpZ2ggbWVtb3J5IHdoaWNoIGhhcyBiZWVuIGxlZnQgYXQgYm9vdCB0aW1lICovCisKKwkJCS8qIE9rLiwgT2suIHRoaXMgaXMgYW4gZXZpbCBoYWNrIC0gd2UgbWFrZQorCQkJICogdGhlIGFzc3VtcHRpb24gdGhhdCBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlCisJCQkgKiB0aGUgc2FtZSBhcyBidXMgYWRkcmVzc2VzICh0cnVlIGF0IGxlYXN0CisJCQkgKiBmb3IgSW50ZWwgcHJvY2Vzc29ycykuIFRoZSB3aG9sZSBtZXRob2Qgb2YKKwkJCSAqIG9idGFpbmluZyBhbmQgdXNpbmcgdGhpcyBtZW1vcnkgaXMgbm90IHZlcnkKKwkJCSAqIG5pY2UgLSBidXQgSSBob3BlIGl0IHNhdmVzIHNvbWUgcG9vciB1c2VycworCQkJICogZnJvbSBrZXJuZWwgaGFja2luZywgd2hpY2ggbWlnaHQgaGF2ZSBldmVuCisJCQkgKiBtb3JlIGV2aWwgcmVzdWx0cyAqLworCisJCQlpZiAoaSA9PSAwKSB7CisJCQkJaW50IHNpemUgPQorCQkJCSAgICBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMgKgorCQkJCSAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisKKwkJCQlwbWVtID0gZ2V0X2hpZ2hfbWVtKHNpemUpOworCQkJCWlmIChwbWVtID09IDApIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIGdldF9oaWdoX21lbSAoc2l6ZSA9ICVkIEtCKSBmb3IgVjRMIGJ1ZnMgZmFpbGVkXG4iLAorCQkJCQkJWlJfREVWTkFNRSh6ciksIHNpemUgPj4gMTApOworCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQkJfQorCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbMF0uZmJ1ZmZlciA9IE5VTEw7CisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlclswXS5mYnVmZmVyX3BoeXMgPSBwbWVtOworCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbMF0uZmJ1ZmZlcl9idXMgPSBwbWVtOworCQkJCWRwcmludGsoNCwKKwkJCQkJS0VSTl9JTkZPCisJCQkJCSIlczogdjRsX2ZidWZmZXJfYWxsb2MoKSAtIHVzaW5nICVkIEtCIGhpZ2ggbWVtb3J5XG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgc2l6ZSA+PiAxMCk7CisJCQl9IGVsc2UgeworCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlciA9IE5VTEw7CisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX3BoeXMgPQorCQkJCSAgICBwbWVtICsgaSAqIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXJfYnVzID0KKwkJCQkgICAgcG1lbSArIGkgKiBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCQl9CisJCX0KKwl9CisKKwlmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKiBmcmVlIHRoZSBWNEwgZ3JhYiBidWZmZXJzICovCitzdGF0aWMgdm9pZAordjRsX2ZidWZmZXJfZnJlZSAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCBpLCBvZmY7CisJdW5zaWduZWQgY2hhciAqbWVtOworCisJZHByaW50ayg0LCBLRVJOX0lORk8gIiVzOiB2NGxfZmJ1ZmZlcl9mcmVlKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgeworCQlpZiAoIWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgPD0gTUFYX0tNQUxMT0NfTUVNKSB7CisJCQltZW0gPSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXI7CisJCQlmb3IgKG9mZiA9IDA7IG9mZiA8IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCSAgICAgb2ZmICs9IFBBR0VfU0laRSkKKwkJCQlDbGVhclBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7CisJCQlrZnJlZSgodm9pZCAqKSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIpOworCQl9CisJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlciA9IE5VTEw7CisJfQorCisJZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJZmgtPnY0bF9idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkID0gMDsKK30KKworLyoKKyAqICAgQWxsb2NhdGUgdGhlIE1KUEVHIGdyYWIgYnVmZmVycy4KKyAqCisgKiAgIElmIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgaXMgc21hbGxlciB0aGFuIE1BWF9LTUFMTE9DX01FTSwKKyAqICAga21hbGxvYyBpcyB1c2VkIHRvIHJlcXVlc3QgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYXJlYSwKKyAqICAgZWxzZSB3ZSBhbGxvY2F0ZSB0aGUgbWVtb3J5IGluIGZyYW1nZW50cyB3aXRoIGdldF96ZXJvZWRfcGFnZS4KKyAqCisgKiAgIElmIGEgTmF0b21hIGNoaXBzZXQgaXMgcHJlc2VudCBhbmQgdGhpcyBpcyBhIHJldmlzaW9uIDEgenIzNjA1NywKKyAqICAgZWFjaCBNSlBFRyBidWZmZXIgbmVlZHMgdG8gYmUgcGh5c2ljYWxseSBjb250aWd1b3VzLgorICogICAoUko6IFRoaXMgc3RhdGVtZW50IGlzIGZyb20gRGF2ZSBQZXJrcycgb3JpZ2luYWwgZHJpdmVyLAorICogICBJIGNvdWxkIG5ldmVyIGNoZWNrIGl0IGJlY2F1c2UgSSBoYXZlIGEgenIzNjA2NykKKyAqICAgVGhlIGRyaXZlciBjYXJlcyBhYm91dCB0aGlzIGJlY2F1c2UgaXQgcmVkdWNlcyB0aGUgYnVmZmVyCisgKiAgIHNpemUgdG8gTUFYX0tNQUxMT0NfTUVNIGluIHRoYXQgY2FzZSAod2hpY2ggZm9yY2VzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbikuCisgKgorICogICBSSjogVGhlIGNvbnRlbnRzIGdyYWIgYnVmZmVycyBuZWVkcyBuZXZlciBiZSBhY2Nlc3NlZCBpbiB0aGUgZHJpdmVyLgorICogICAgICAgVGhlcmVmb3JlIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWxsb2NhdGUgdGhlbSB3aXRoIHZtYWxsb2MgaW4gb3JkZXIKKyAqICAgICAgIHRvIGdldCBhIGNvbnRpZ3VvdXMgdmlydHVhbCBtZW1vcnkgc3BhY2UuCisgKiAgICAgICBJIGRvbid0IHVuZGVyc3RhbmQgd2h5IG1hbnkgb3RoZXIgZHJpdmVycyBmaXJzdCBhbGxvY2F0ZSB0aGVtIHdpdGgKKyAqICAgICAgIHZtYWxsb2MgKHdoaWNoIHVzZXMgaW50ZXJuYWxseSBhbHNvIGdldF96ZXJvZWRfcGFnZSwgYnV0IGRlbGl2ZXJzIHlvdQorICogICAgICAgdmlydHVhbCBhZGRyZXNzZXMpIGFuZCB0aGVuIGFnYWluIGhhdmUgdG8gbWFrZSBhIGxvdCBvZiBlZmZvcnRzCisgKiAgICAgICB0byBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MuCisgKgorICogICBCZW4gQ2FwcGVyOgorICogICAgICAgT24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzIChzdWNoIGFzIHBwYykgc29tZSBleHRyYSBzdGVwcworICogICAgICAgYXJlIG5lZWRlZC4gV2hlbiByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZSBzdGF0X2NvbSBhcnJheQorICogICAgICAgYW5kIGZyYWdtZW50IGJ1ZmZlcnMsIHRoZSBkZXZpY2UgZXhwZWN0cyB0byBzZWUgbGl0dGxlLQorICogICAgICAgZW5kaWFuIHZhbHVlcy4gVGhlIHVzZSBvZiBjcHVfdG9fbGUzMigpIGFuZCBsZTMyX3RvX2NwdSgpCisgKiAgICAgICBpbiB0aGlzIGZ1bmN0aW9uIChhbmQgb25lIG9yIHR3byBvdGhlcnMgaW4gem9yYW5fZGV2aWNlLmMpCisgKiAgICAgICBlbnN1cmUgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIGFsd2F5cyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbgorICogICAgICAgZm9ybSwgcmVnYXJkbGVzcyBvZiBhcmNoaXRlY3R1cmUuIFRoZSB6cjM2MDU3IGRvZXMgVmVyeSBCYWQKKyAqICAgICAgIFRoaW5ncyBvbiBiaWcgZW5kaWFuIGFyY2hpdGVjdHVyZXMgaWYgdGhlIHN0YXRfY29tIGFycmF5CisgKiAgICAgICBhbmQgZnJhZ21lbnQgYnVmZmVycyBhcmUgbm90IGxpdHRsZS1lbmRpYW4uCisgKi8KKworc3RhdGljIGludAoranBnX2ZidWZmZXJfYWxsb2MgKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgaSwgaiwgb2ZmOworCXVuc2lnbmVkIGxvbmcgbWVtOworCisJLyogd2UgbWlnaHQgaGF2ZSBvbGQgYnVmZmVycyBseWluZyBhcm91bmQgKi8KKwlpZiAoZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKSB7CisJCWpwZ19mYnVmZmVyX2ZyZWUoZmlsZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiKQorCQkJZHByaW50aygyLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczoganBnX2ZidWZmZXJfYWxsb2MoKSAtIGJ1ZmZlciAlZCBhbGxyZWFkeSBhbGxvY2F0ZWQhP1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisKKwkJLyogQWxsb2NhdGUgZnJhZ21lbnQgdGFibGUgZm9yIHRoaXMgYnVmZmVyICovCisKKwkJbWVtID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAobWVtID09IDApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczoganBnX2ZidWZmZXJfYWxsb2MoKSAtIGdldF96ZXJvZWRfcGFnZSAoZnJhZ190YWIpIGZhaWxlZCBmb3IgYnVmZmVyICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBpKTsKKwkJCWpwZ19mYnVmZmVyX2ZyZWUoZmlsZSk7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYiA9IChfX2xlMzIgKikgbWVtOworCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiX2J1cyA9CisJCSAgICB2aXJ0X3RvX2J1cygodm9pZCAqKSBtZW0pOworCisJCS8vaWYgKGFsbG9jX2NvbnRpZykgeworCQlpZiAoZmgtPmpwZ19idWZmZXJzLm5lZWRfY29udGlndW91cykgeworCQkJbWVtID0KKwkJCSAgICAodW5zaWduZWQgbG9uZykga21hbGxvYyhmaC0+anBnX2J1ZmZlcnMuCisJCQkJCQkgICAgYnVmZmVyX3NpemUsCisJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAobWVtID09IDApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczoganBnX2ZidWZmZXJfYWxsb2MoKSAtIGttYWxsb2MgZmFpbGVkIGZvciBidWZmZXIgJWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBpKTsKKwkJCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCX0KKwkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0gPQorCQkJICAgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCh2b2lkICopIG1lbSkpOworCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsxXSA9CisJCQkgICAgY3B1X3RvX2xlMzIoKChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgLyA0KSA8PCAxKSB8IDEpOworCQkJZm9yIChvZmYgPSAwOyBvZmYgPCBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCQkgICAgIG9mZiArPSBQQUdFX1NJWkUpCisJCQkJU2V0UGFnZVJlc2VydmVkKE1BUF9OUihtZW0gKyBvZmYpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGpwZ19idWZzaXplIGlzIGFsbHJlYXkgcGFnZSBhbGlnbmVkICovCisJCQlmb3IgKGogPSAwOworCQkJICAgICBqIDwgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOworCQkJICAgICBqKyspIHsKKwkJCQltZW0gPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCQkJaWYgKG1lbSA9PSAwKSB7CisJCQkJCWRwcmludGsoMSwKKwkJCQkJCUtFUk5fRVJSCisJCQkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBnZXRfemVyb2VkX3BhZ2UgZmFpbGVkIGZvciBidWZmZXIgJWRcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7CisJCQkJCWpwZ19mYnVmZmVyX2ZyZWUoZmlsZSk7CisJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCQl9CisKKwkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqXSA9CisJCQkJICAgIGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCh2b2lkICopIG1lbSkpOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMiAqIGogKworCQkJCQkJCQkgICAxXSA9CisJCQkJICAgIGNwdV90b19sZTMyKChQQUdFX1NJWkUgLyA0KSA8PCAxKTsKKwkJCQlTZXRQYWdlUmVzZXJ2ZWQoTUFQX05SKG1lbSkpOworCQkJfQorCisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqIC0gMV0gfD0gY3B1X3RvX2xlMzIoMSk7CisJCX0KKwl9CisKKwlkcHJpbnRrKDQsCisJCUtFUk5fREVCVUcgIiVzOiBqcGdfZmJ1ZmZlcl9hbGxvYygpIC0gJWQgS0IgYWxsb2NhdGVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwKKwkJKGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyAqCisJCSBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUpID4+IDEwKTsKKworCWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGZyZWUgdGhlIE1KUEVHIGdyYWIgYnVmZmVycyAqLworc3RhdGljIHZvaWQKK2pwZ19mYnVmZmVyX2ZyZWUgKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgaSwgaiwgb2ZmOworCXVuc2lnbmVkIGNoYXIgKm1lbTsKKworCWRwcmludGsoNCwgS0VSTl9ERUJVRyAiJXM6IGpwZ19mYnVmZmVyX2ZyZWUoKVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJZm9yIChpID0gMDsgaSA8IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCWlmICghZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYikKKwkJCWNvbnRpbnVlOworCisJCS8vaWYgKGFsbG9jX2NvbnRpZykgeworCQlpZiAoZmgtPmpwZ19idWZmZXJzLm5lZWRfY29udGlndW91cykgeworCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0pIHsKKwkJCQltZW0gPSAodW5zaWduZWQgY2hhciAqKSBidXNfdG9fdmlydChsZTMyX3RvX2NwdSgKKwkJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlswXSkpOworCQkJCWZvciAob2ZmID0gMDsKKwkJCQkgICAgIG9mZiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCQkgICAgIG9mZiArPSBQQUdFX1NJWkUpCisJCQkJCUNsZWFyUGFnZVJlc2VydmVkKE1BUF9OUgorCQkJCQkJCSAgKG1lbSArIG9mZikpOworCQkJCWtmcmVlKG1lbSk7CisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlswXSA9IDA7CisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsxXSA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGogPSAwOworCQkJICAgICBqIDwgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOworCQkJICAgICBqKyspIHsKKwkJCQlpZiAoIWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uCisJCQkJICAgIGZyYWdfdGFiWzIgKiBqXSkKKwkJCQkJYnJlYWs7CisJCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQoTUFQX05SCisJCQkJCQkgIChidXNfdG9fdmlydAorCQkJCQkJICAgKGxlMzJfdG9fY3B1CisJCQkJCQkgICAgKGZoLT5qcGdfYnVmZmVycy4KKwkJCQkJCSAgICAgYnVmZmVyW2ldLmZyYWdfdGFiWzIgKgorCQkJCQkJCQkgICAgICAgal0pKSkpOworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykKKwkJCQkJICBidXNfdG9fdmlydAorCQkJCQkJICAobGUzMl90b19jcHUKKwkJCQkJCSAgIChmaC0+anBnX2J1ZmZlcnMuCisJCQkJCQkgICAgICBidWZmZXJbaV0uCisJCQkJCQkgICAgICBmcmFnX3RhYlsyICogal0pKSk7CisJCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogal0gPQorCQkJCSAgICAwOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMiAqIGogKworCQkJCQkJCQkgICAxXSA9IDA7CisJCQl9CisJCX0KKworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uCisJCQkgIGZyYWdfdGFiKTsKKwkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYiA9IE5VTEw7CisJfQorCisJZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkID0gMDsKK30KKworLyoKKyAqICAgVjRMIEJ1ZmZlciBncmFiYmluZworICovCisKK3N0YXRpYyBpbnQKK3pvcmFuX3Y0bF9zZXRfZm9ybWF0IChzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAgICpmaWxlLAorCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKwkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0ICpmb3JtYXQpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCBicHA7CisKKwkvKiBDaGVjayBzaXplIGFuZCBmb3JtYXQgb2YgdGhlIGdyYWIgd2FudGVkICovCisKKwlpZiAoaGVpZ2h0IDwgQlVaX01JTl9IRUlHSFQgfHwgd2lkdGggPCBCVVpfTUlOX1dJRFRIIHx8CisJICAgIGhlaWdodCA+IEJVWl9NQVhfSEVJR0hUIHx8IHdpZHRoID4gQlVaX01BWF9XSURUSCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB2NGxfc2V0X2Zvcm1hdCgpIC0gd3JvbmcgZnJhbWUgc2l6ZSAoJWR4JWQpXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHdpZHRoLCBoZWlnaHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlicHAgPSAoZm9ybWF0LT5kZXB0aCArIDcpIC8gODsKKworCS8qIENoZWNrIGFnYWluc3QgYXZhaWxhYmxlIGJ1ZmZlciBzaXplICovCisJaWYgKGhlaWdodCAqIHdpZHRoICogYnBwID4gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bF9zZXRfZm9ybWF0KCkgLSB2aWRlbyBidWZmZXIgc2l6ZSAoJWQga0IpIGlzIHRvbyBzbWFsbFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgPj4gMTApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBUaGUgdmlkZW8gZnJvbnQgZW5kIG5lZWRzIDQtYnl0ZSBhbGluZ2VkIGxpbmUgc2l6ZXMgKi8KKworCWlmICgoYnBwID09IDIgJiYgKHdpZHRoICYgMSkpIHx8IChicHAgPT0gMyAmJiAod2lkdGggJiAzKSkpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX3NldF9mb3JtYXQoKSAtIHdyb25nIGZyYW1lIGFsaW5nbWVudFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmgtPnY0bF9zZXR0aW5ncy53aWR0aCA9IHdpZHRoOworCWZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ID0gaGVpZ2h0OworCWZoLT52NGxfc2V0dGluZ3MuZm9ybWF0ID0gZm9ybWF0OworCWZoLT52NGxfc2V0dGluZ3MuYnl0ZXNwZXJsaW5lID0gYnBwICogZmgtPnY0bF9zZXR0aW5ncy53aWR0aDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl92NGxfcXVldWVfZnJhbWUgKHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgaW50ICAgICAgICAgIG51bSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzID0gMDsKKworCWlmICghZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB2NGxfcXVldWVfZnJhbWUoKSAtIGJ1ZmZlcnMgbm90IHlldCBhbGxvY2F0ZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FTk9NRU07CisJfQorCisJLyogTm8gZ3JhYmJpbmcgb3V0c2lkZSB0aGUgYnVmZmVyIHJhbmdlISAqLworCWlmIChudW0gPj0gZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzIHx8IG51bSA8IDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX3F1ZXVlX2ZyYW1lKCkgLSBidWZmZXIgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIG51bSk7CisJCXJlcyA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCQl6ci0+djRsX2J1ZmZlcnMgPSBmaC0+djRsX2J1ZmZlcnM7CisJCQlmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fQUNUSVZFOworCQl9IGVsc2UgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB2NGxfcXVldWVfZnJhbWUoKSAtIGFub3RoZXIgc2Vzc2lvbiBpcyBhbHJlYWR5IGNhcHR1cmluZ1xuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBtYWtlIHN1cmUgYSBncmFiIGlzbid0IGdvaW5nIG9uIGN1cnJlbnRseSB3aXRoIHRoaXMgYnVmZmVyICovCisJaWYgKCFyZXMpIHsKKwkJc3dpdGNoICh6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBCVVpfU1RBVEVfUEVORDoKKwkJCWlmICh6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJCQlmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKKwkJCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCX0KKwkJCXJlcyA9IC1FQlVTWTsJLyogd2hhdCBhcmUgeW91IGRvaW5nPyAqLworCQkJYnJlYWs7CisJCWNhc2UgQlVaX1NUQVRFX0RPTkU6CisJCQlkcHJpbnRrKDIsCisJCQkJS0VSTl9XQVJOSU5HCisJCQkJIiVzOiB2NGxfcXVldWVfZnJhbWUoKSAtIHF1ZXVlaW5nIGJ1ZmZlciAlZCBpbiBzdGF0ZSBET05FIT9cbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIG51bSk7CisJCWNhc2UgQlVaX1NUQVRFX1VTRVI6CisJCQkvKiBzaW5jZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdW51c2VkIGJ1ZmZlciB0aGVyZSdzIHJvb20gZm9yIGF0IGxlYXN0CisJCQkgKiBvbmUgbW9yZSBwZW5kW10gZW50cnkgKi8KKwkJCXpyLT52NGxfcGVuZFt6ci0+djRsX3BlbmRfaGVhZCsrICYKKwkJCQkJVjRMX01BU0tfRlJBTUVdID0gbnVtOworCQkJenItPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID0gQlVaX1NUQVRFX1BFTkQ7CisJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMubGVuZ3RoID0KKwkJCSAgICBmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSAqCisJCQkgICAgenItPnY0bF9zZXR0aW5ncy5oZWlnaHQ7CisJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0gPQorCQkJICAgIHpyLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXJlcyAmJiB6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpCisJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAordjRsX2dyYWIgKHN0cnVjdCBmaWxlICAgICAgICpmaWxlLAorCSAgc3RydWN0IHZpZGVvX21tYXAgKm1wKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgcmVzID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CisJCWlmICh6b3Jhbl9mb3JtYXRzW2ldLnBhbGV0dGUgPT0gbXAtPmZvcm1hdCAmJgorCQkgICAgem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIFpPUkFOX0ZPUk1BVF9DQVBUVVJFICYmCisJCSAgICAhKHpvcmFuX2Zvcm1hdHNbaV0uZmxhZ3MgJiBaT1JBTl9GT1JNQVRfQ09NUFJFU1NFRCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTlVNX0ZPUk1BVFMgfHwgem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSAwKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bF9ncmFiKCkgLSB3cm9uZyBieXRlcy1wZXItcGl4ZWwgZm9ybWF0XG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRvIG1pbmltaXplIHRoZSB0aW1lIHNwZW50IGluIHRoZSBJUlEgcm91dGluZSwgd2UgYXZvaWQgc2V0dGluZyB1cAorCSAqIHRoZSB2aWRlbyBmcm9udCBlbmQgdGhlcmUuCisJICogSWYgdGhpcyBncmFiIGhhcyBkaWZmZXJlbnQgcGFyYW1ldGVycyBmcm9tIGEgcnVubmluZyBzdHJlYW1pbmcgY2FwdHVyZQorCSAqIHdlIHN0b3AgdGhlIHN0cmVhbWluZyBjYXB0dXJlIGFuZCBzdGFydCBpdCBvdmVyIGFnYWluLgorCSAqLworCWlmICh6ci0+djRsX21lbWdyYWJfYWN0aXZlICYmCisJICAgICh6ci0+djRsX3NldHRpbmdzLndpZHRoICE9IG1wLT53aWR0aCB8fAorCSAgICAgenItPnY0bF9zZXR0aW5ncy5oZWlnaHQgIT0gbXAtPmhlaWdodCB8fAorCSAgICAgenItPnY0bF9zZXR0aW5ncy5mb3JtYXQtPnBhbGV0dGUgIT0gbXAtPmZvcm1hdCkpIHsKKwkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisJaWYgKChyZXMgPSB6b3Jhbl92NGxfc2V0X2Zvcm1hdChmaWxlLAorCQkJCQltcC0+d2lkdGgsCisJCQkJCW1wLT5oZWlnaHQsCisJCQkJCSZ6b3Jhbl9mb3JtYXRzW2ldKSkpCisJCXJldHVybiByZXM7CisJenItPnY0bF9zZXR0aW5ncyA9IGZoLT52NGxfc2V0dGluZ3M7CisKKwkvKiBxdWV1ZSB0aGUgZnJhbWUgaW4gdGhlIHBlbmRpbmcgcXVldWUgKi8KKwlpZiAoKHJlcyA9IHpvcmFuX3Y0bF9xdWV1ZV9mcmFtZShmaWxlLCBtcC0+ZnJhbWUpKSkgeworCQlmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBwdXQgdGhlIDM2MDU3IGludG8gZnJhbWUgZ3JhYmJpbmcgbW9kZSAqLworCWlmICghcmVzICYmICF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQorCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAxKTsKKworCS8vZHByaW50ayg0LCBLRVJOX0lORk8gIiVzOiBGcmFtZSBncmFiIDMuLi5cbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBTeW5jIG9uIGEgVjRMIGJ1ZmZlcgorICovCisKK3N0YXRpYyBpbnQKK3Y0bF9zeW5jIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgIGludCAgICAgICAgICBmcmFtZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogdjRsX3N5bmMoKSAtIG5vIGdyYWIgYWN0aXZlIGZvciB0aGlzIHNlc3Npb25cbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNoZWNrIHBhc3NlZC1pbiBmcmFtZSBudW1iZXIgKi8KKwlpZiAoZnJhbWUgPj0gZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzIHx8IGZyYW1lIDwgMCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUiAiJXM6IHY0bF9zeW5jKCkgLSBmcmFtZSAlZCBpcyBpbnZhbGlkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGZyYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgaWYgaXMgYnVmZmVyIHdhcyBxdWV1ZWQgYXQgYWxsICovCisJaWYgKHpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID09IEJVWl9TVEFURV9VU0VSKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bF9zeW5jKCkgLSBhdHRlbXB0IHRvIHN5bmMgb24gYSBidWZmZXIgd2hpY2ggd2FzIG5vdCBxdWV1ZWQ/XG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwkvKiB3YWl0IG9uIHRoaXMgYnVmZmVyIHRvIGdldCByZWFkeSAqLworCWlmICghd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoenItPnY0bF9jYXBxLAorCQkJCSh6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSAhPSBCVVpfU1RBVEVfUEVORCksCisJCQkJMTAqSFopKQorCQlyZXR1cm4gLUVUSU1FOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCS8qIGJ1ZmZlciBzaG91bGQgbm93IGJlIGluIEJVWl9TVEFURV9ET05FICovCisJaWYgKHpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlICE9IEJVWl9TVEFURV9ET05FKQorCQlkcHJpbnRrKDIsCisJCQlLRVJOX0VSUiAiJXM6IHY0bF9zeW5jKCkgLSBpbnRlcm5hbCBzdGF0ZSBlcnJvclxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKworCXpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CisJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0gPSB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHN0cmVhbWluZyBjYXB0dXJlIGhhcyBmaW5pc2hlZCAqLworCWlmICh6ci0+djRsX3BlbmRfdGFpbCA9PSB6ci0+djRsX3BlbmRfaGVhZCkgeworCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKKwkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fQUNUSVZFKSB7CisJCQlmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0genItPnY0bF9idWZmZXJzLmFjdGl2ZSA9CisJCQkgICAgWk9SQU5fRlJFRTsKKwkJCXpyLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgUXVldWUgYSBNSlBFRyBidWZmZXIgZm9yIGNhcHR1cmUvcGxheWJhY2sKKyAqLworCitzdGF0aWMgaW50Cit6b3Jhbl9qcGdfcXVldWVfZnJhbWUgKHN0cnVjdCBmaWxlICAgICAgICAgICpmaWxlLAorCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG51bSwKKwkJICAgICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSBtb2RlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXMgPSAwOworCisJLyogQ2hlY2sgaWYgYnVmZmVycyBhcmUgYWxsb2NhdGVkICovCisJaWYgKCFmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGpwZ19xdWV1ZV9mcmFtZSgpIC0gYnVmZmVycyBub3QgeWV0IGFsbG9jYXRlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogTm8gZ3JhYmJpbmcgb3V0c2lkZSB0aGUgYnVmZmVyIHJhbmdlISAqLworCWlmIChudW0gPj0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzIHx8IG51bSA8IDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3F1ZXVlX2ZyYW1lKCkgLSBidWZmZXIgJWQgb3V0IG9mIHJhbmdlXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIG51bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdoYXQgaXMgdGhlIGNvZGVjIG1vZGUgcmlnaHQgbm93PyAqLworCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9JRExFKSB7CisJCXpyLT5qcGdfc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOworCX0gZWxzZSBpZiAoenItPmNvZGVjX21vZGUgIT0gbW9kZSkgeworCQkvKiB3cm9uZyBjb2RlYyBtb2RlIGFjdGl2ZSAtIGludmFsaWQgKi8KKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3F1ZXVlX2ZyYW1lKCkgLSBjb2RlYyBpbiB3cm9uZyBtb2RlXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCWlmICh6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJCXpyLT5qcGdfYnVmZmVycyA9IGZoLT5qcGdfYnVmZmVyczsKKwkJCWZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IGpwZ19xdWV1ZV9mcmFtZSgpIC0gYW5vdGhlciBzZXNzaW9uIGlzIGFscmVhZHkgY2FwdHVyaW5nXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FQlVTWTsKKwkJfQorCX0KKworCWlmICghcmVzICYmIHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX0lETEUpIHsKKwkJLyogT2sgbG9hZCB1cCB0aGUganBlZyBjb2RlYyAqLworCQl6cjM2MDU3X2VuYWJsZV9qcGcoenIsIG1vZGUpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICghcmVzKSB7CisJCXN3aXRjaCAoenItPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlKSB7CisJCWNhc2UgQlVaX1NUQVRFX0RPTkU6CisJCQlkcHJpbnRrKDIsCisJCQkJS0VSTl9XQVJOSU5HCisJCQkJIiVzOiBqcGdfcXVldWVfZnJhbWUoKSAtIHF1ZWluZyBmcmFtZSBpbiBCVVpfU1RBVEVfRE9ORSBzdGF0ZSE/XG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJY2FzZSBCVVpfU1RBVEVfVVNFUjoKKwkJCS8qIHNpbmNlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB1bnVzZWQgYnVmZmVyIHRoZXJlJ3Mgcm9vbSBmb3IgYXQKKwkJCSAqbGVhc3Qgb25lIG1vcmUgcGVuZFtdIGVudHJ5ICovCisJCQl6ci0+anBnX3BlbmRbenItPmpwZ19xdWVfaGVhZCsrICYgQlVaX01BU0tfRlJBTUVdID0KKwkJCSAgICBudW07CisJCQl6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPSBCVVpfU1RBVEVfUEVORDsKKwkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXSA9CisJCQkgICAgenItPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dOworCQkJem9yYW5fZmVlZF9zdGF0X2NvbSh6cik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBCVVpfU1RBVEVfRE1BOgorCQljYXNlIEJVWl9TVEFURV9QRU5EOgorCQkJaWYgKHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQkJCWZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCQkJCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJfQorCQkJcmVzID0gLUVCVVNZOwkvKiB3aGF0IGFyZSB5b3UgZG9pbmc/ICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKCFyZXMgJiYgenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2pwZ19xYnVmIChzdHJ1Y3QgZmlsZSAgICAgICAgICAqZmlsZSwKKwkgIGludCAgICAgICAgICAgICAgICAgICBmcmFtZSwKKwkgIGVudW0gem9yYW5fY29kZWNfbW9kZSBtb2RlKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgcmVzID0gMDsKKworCS8qIERvZXMgdGhlIHVzZXIgd2FudCB0byBzdG9wIHN0cmVhbWluZz8gKi8KKwlpZiAoZnJhbWUgPCAwKSB7CisJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBtb2RlKSB7CisJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IGpwZ19xYnVmKC0xKSAtIHNlc3Npb24gbm90IGFjdGl2ZVxuIiwKKwkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9IHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPQorCQkJICAgIFpPUkFOX0ZSRUU7CisJCQl6ci0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCXpyMzYwNTdfZW5hYmxlX2pwZyh6ciwgQlVaX01PREVfSURMRSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczoganBnX3FidWYoKSAtIHN0b3Agc3RyZWFtaW5nIGJ1dCBub3QgaW4gc3RyZWFtaW5nIG1vZGVcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoKHJlcyA9IHpvcmFuX2pwZ19xdWV1ZV9mcmFtZShmaWxlLCBmcmFtZSwgbW9kZSkpKQorCQlyZXR1cm4gcmVzOworCisJLyogU3RhcnQgdGhlIGpwZWcgY29kZWMgd2hlbiB0aGUgZmlyc3QgZnJhbWUgaXMgcXVldWVkICAqLworCWlmICghcmVzICYmIHpyLT5qcGdfcXVlX2hlYWQgPT0gMSkKKwkJanBlZ19zdGFydCh6cik7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogICBTeW5jIG9uIGEgTUpQRUcgYnVmZmVyCisgKi8KKworc3RhdGljIGludAoranBnX3N5bmMgKHN0cnVjdCBmaWxlICAgICAgICpmaWxlLAorCSAgc3RydWN0IHpvcmFuX3N5bmMgKmJzKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmcmFtZTsKKworCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3N5bmMoKSAtIGNhcHR1cmUgaXMgbm90IGN1cnJlbnRseSBhY3RpdmVcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MgJiYKKwkgICAgenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IGpwZ19zeW5jKCkgLSBjb2RlYyBub3QgaW4gc3RyZWFtaW5nIG1vZGVcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHpyLT5qcGdfY2FwcSwKKwkJCSh6ci0+anBnX3F1ZV90YWlsICE9IHpyLT5qcGdfZG1hX3RhaWwgfHwKKwkJCSB6ci0+anBnX2RtYV90YWlsID09IHpyLT5qcGdfZG1hX2hlYWQpLAorCQkJMTAqSFopKSB7CisJCWludCBpc3I7CisKKwkJYnRhbmQoflpSMzYwNTdfSk1DX0dvX2VuLCBaUjM2MDU3X0pNQyk7CisJCXVkZWxheSgxKTsKKwkJenItPmNvZGVjLT5jb250cm9sKHpyLT5jb2RlYywgQ09ERUNfR19TVEFUVVMsCisJCQkJCSAgIHNpemVvZihpc3IpLCAmaXNyKTsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczoganBnX3N5bmMoKSAtIHRpbWVvdXQ6IGNvZGVjIGlzcj0weCUwMnhcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgaXNyKTsKKworCQlyZXR1cm4gLUVUSU1FOworCisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICh6ci0+anBnX2RtYV90YWlsICE9IHpyLT5qcGdfZG1hX2hlYWQpCisJCWZyYW1lID0genItPmpwZ19wZW5kW3pyLT5qcGdfcXVlX3RhaWwrKyAmIEJVWl9NQVNLX0ZSQU1FXTsKKwllbHNlCisJCWZyYW1lID0genItPmpwZ19wZW5kW3pyLT5qcGdfcXVlX3RhaWwgJiBCVVpfTUFTS19GUkFNRV07CisKKwkvKiBidWZmZXIgc2hvdWxkIG5vdyBiZSBpbiBCVVpfU1RBVEVfRE9ORSAqLworCWlmICh6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSAhPSBCVVpfU1RBVEVfRE9ORSkKKwkJZHByaW50aygyLAorCQkJS0VSTl9FUlIgIiVzOiBqcGdfc3luYygpIC0gaW50ZXJuYWwgc3RhdGUgZXJyb3JcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisKKwkqYnMgPSB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5iczsKKwlicy0+ZnJhbWUgPSBmcmFtZTsKKwl6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOworCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdID0genItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorem9yYW5fb3Blbl9pbml0X3Nlc3Npb24gKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKworCS8qIFBlciBkZWZhdWx0LCBtYXAgdGhlIFY0TCBCdWZmZXJzICovCisJZmgtPm1hcF9tb2RlID0gWk9SQU5fTUFQX01PREVfUkFXOworCisJLyogdGFrZSBvdmVyIHRoZSBjYXJkJ3MgY3VycmVudCBzZXR0aW5ncyAqLworCWZoLT5vdmVybGF5X3NldHRpbmdzID0genItPm92ZXJsYXlfc2V0dGluZ3M7CisJZmgtPm92ZXJsYXlfc2V0dGluZ3MuaXNfc2V0ID0gMDsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQgPSB6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQ7CisJZmgtPm92ZXJsYXlfYWN0aXZlID0gWk9SQU5fRlJFRTsKKworCS8qIHY0bCBzZXR0aW5ncyAqLworCWZoLT52NGxfc2V0dGluZ3MgPSB6ci0+djRsX3NldHRpbmdzOworCisJLyogdjRsX2J1ZmZlcnMgKi8KKwltZW1zZXQoJmZoLT52NGxfYnVmZmVycywgMCwgc2l6ZW9mKHN0cnVjdCB6b3Jhbl92NGxfc3RydWN0KSk7CisJZm9yIChpID0gMDsgaSA8IFZJREVPX01BWF9GUkFNRTsgaSsrKSB7CisJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsJLyogbm90aGluZyBnb2luZyBvbiAqLworCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmJzLmZyYW1lID0gaTsKKwl9CisJZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJZmgtPnY0bF9idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkID0gMDsKKwlmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKKwlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgPSB2NGxfYnVmc2l6ZTsKKwlmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMgPSB2NGxfbmJ1ZnM7CisKKwkvKiBqcGcgc2V0dGluZ3MgKi8KKwlmaC0+anBnX3NldHRpbmdzID0genItPmpwZ19zZXR0aW5nczsKKworCS8qIGpwZ19idWZmZXJzICovCisJbWVtc2V0KCZmaC0+anBnX2J1ZmZlcnMsIDAsIHNpemVvZihzdHJ1Y3Qgem9yYW5fanBnX3N0cnVjdCkpOworCWZvciAoaSA9IDA7IGkgPCBCVVpfTUFYX0ZSQU1FOyBpKyspIHsKKwkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwkvKiBub3RoaW5nIGdvaW5nIG9uICovCisJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uYnMuZnJhbWUgPSBpOworCX0KKwlmaC0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzID0genItPmpwZ19idWZmZXJzLm5lZWRfY29udGlndW91czsKKwlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwlmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQgPSAwOworCWZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9IGpwZ19idWZzaXplOworCWZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyA9IGpwZ19uYnVmczsKK30KKworc3RhdGljIHZvaWQKK3pvcmFuX2Nsb3NlX2VuZF9zZXNzaW9uIChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisKKwkvKiBvdmVybGF5ICovCisJaWYgKGZoLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7CisJCWZoLT5vdmVybGF5X2FjdGl2ZSA9IHpyLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAwOworCQlpZiAoIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpCisJCQl6cjM2MDU3X292ZXJsYXkoenIsIDApOworCQl6ci0+b3ZlcmxheV9tYXNrID0gTlVMTDsKKwl9CisKKwkvKiB2NGwgY2FwdHVyZSAqLworCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOworCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPQorCQkgICAgWk9SQU5fRlJFRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCisJLyogdjRsIGJ1ZmZlcnMgKi8KKwlpZiAoZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCB8fAorCSAgICBmaC0+djRsX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKKwkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKKwl9CisKKwkvKiBqcGcgY2FwdHVyZSAqLworCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKwkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0KKwkJICAgIFpPUkFOX0ZSRUU7CisJfQorCisJLyoganBnIGJ1ZmZlcnMgKi8KKwlpZiAoZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCB8fAorCSAgICBmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKKwkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwl9Cit9CisKKy8qCisgKiAgIE9wZW4gYSB6b3JhbiBjYXJkLiBSaWdodCBub3cgdGhlIGZsYWdzIHN0dWZmIGlzIGp1c3QgcGxheWluZworICovCisKK3N0YXRpYyBpbnQKK3pvcmFuX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJICAgIHN0cnVjdCBmaWxlICAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB6b3JhbiAqenIgPSBOVUxMOworCXN0cnVjdCB6b3Jhbl9maCAqZmg7CisJaW50IGksIHJlcywgZmlyc3Rfb3BlbiA9IDAsIGhhdmVfbW9kdWxlX2xvY2tzID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJLyogZmluZCB0aGUgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bTsgaSsrKSB7CisJCWlmICh6b3JhbltpXS0+dmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgeworCQkJenIgPSB6b3JhbltpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCF6cikgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogZGV2aWNlIG5vdCBmb3VuZCFcbiIsIFpPUkFOX05BTUUpOworCQlyZXMgPSAtRU5PREVWOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJLyogc2VlIGZzL2RldmljZS5jIC0gdGhlIGtlcm5lbCBhbHJlYWR5IGxvY2tzIGR1cmluZyBvcGVuKCksCisJICogc28gbG9ja2luZyBvdXJzZWx2ZXMgb25seSBjYXVzZXMgZGVhZGxvY2tzICovCisJLyptdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KKworCWlmICghenItPmRlY29kZXIpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgIiVzOiBubyBUViBkZWNvZGVyIGxvYWRlZCBmb3IgZGV2aWNlIVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmVzID0gLUVJTzsKKwkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOworCX0KKworCS8qIHRyeSB0byBncmFiIGEgbW9kdWxlIGxvY2sgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gYWNxdWlyZSBteSBvd24gbG9jayEgUEFOSUMhXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXMgPSAtRU5PREVWOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCWlmICghdHJ5X21vZHVsZV9nZXQoenItPmRlY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gZ3JhYiBvd25lcnNoaXAgb2YgaTJjIGRlY29kZXJcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FSU87CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCWlmICh6ci0+ZW5jb2RlciAmJgorCSAgICAhdHJ5X21vZHVsZV9nZXQoenItPmVuY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gZ3JhYiBvd25lcnNoaXAgb2YgaTJjIGVuY29kZXJcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FSU87CisJCW1vZHVsZV9wdXQoenItPmRlY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwloYXZlX21vZHVsZV9sb2NrcyA9IDE7CisKKwlpZiAoenItPnVzZXIgPj0gMjA0OCkgeworCQlkcHJpbnRrKDEsIEtFUk5fRVJSICIlczogdG9vIG1hbnkgdXNlcnMgKCVkKSBvbiBkZXZpY2VcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgenItPnVzZXIpOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHpvcmFuX29wZW4oJXMsIHBpZD1bJWRdKSwgdXNlcnMoLSk9JWRcbiIsCisJCVpSX0RFVk5BTUUoenIpLCBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgenItPnVzZXIpOworCisJLyogbm93LCBjcmVhdGUgdGhlIG9wZW4oKS1zcGVjaWZpYyBmaWxlX29wcyBzdHJ1Y3QgKi8KKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6b3Jhbl9maCksIEdGUF9LRVJORUwpOworCWlmICghZmgpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogem9yYW5fb3BlbigpIC0gYWxsb2NhdGlvbiBvZiB6b3Jhbl9maCBmYWlsZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKKwl9CisJLyogdXNlZCB0byBiZSBCVVpfTUFYX1dJRFRIL0hFSUdIVCwgYnV0IHRoYXQgZ2l2ZXMgb3ZlcmZsb3dzCisJICogb24gbm9ybS1jaGFuZ2UhICovCisJZmgtPm92ZXJsYXlfbWFzayA9CisJICAgIGttYWxsb2MoKCg3NjggKyAzMSkgLyAzMikgKiA1NzYgKiA0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZoLT5vdmVybGF5X21hc2spIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogem9yYW5fb3BlbigpIC0gYWxsb2NhdGlvbiBvZiBvdmVybGF5X21hc2sgZmFpbGVkXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlrZnJlZShmaCk7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwlpZiAoenItPnVzZXIrKyA9PSAwKQorCQlmaXJzdF9vcGVuID0gMTsKKworCS8qbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KKworCS8qIGRlZmF1bHQgc2V0dXAgLSBUT0RPOiBsb29rIGF0IGZsYWdzICovCisJaWYgKGZpcnN0X29wZW4pIHsJLyogRmlyc3QgZGV2aWNlIG9wZW4gKi8KKwkJenIzNjA1N19yZXN0YXJ0KHpyKTsKKwkJem9yYW5fb3Blbl9pbml0X3BhcmFtcyh6cik7CisJCXpvcmFuX2luaXRfaGFyZHdhcmUoenIpOworCisJCWJ0b3IoWlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKKwl9CisKKwkvKiBzZXQgZmlsZV9vcHMgc3R1ZmYgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKKwlmaC0+enIgPSB6cjsKKwl6b3Jhbl9vcGVuX2luaXRfc2Vzc2lvbihmaWxlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKKworb3Blbl91bmxvY2tfYW5kX3JldHVybjoKKwkvKiBpZiB3ZSBncmFiYmVkIGxvY2tzLCByZWxlYXNlIHRoZW0gYWNjb3JkaW5nbHkgKi8KKwlpZiAoaGF2ZV9tb2R1bGVfbG9ja3MpIHsKKwkJbW9kdWxlX3B1dCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5kcml2ZXIub3duZXIpOworCQlpZiAoenItPmVuY29kZXIpIHsKKwkJCW1vZHVsZV9wdXQoenItPmVuY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKKwkJfQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwl9CisKKwkvKiBpZiB0aGVyZSdzIG5vIGRldmljZSBmb3VuZCwgd2UgZGlkbid0IG9idGFpbiB0aGUgbG9jayBlaXRoZXIgKi8KKwlpZiAoenIpIHsKKwkJLyptdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsqLworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50Cit6b3Jhbl9jbG9zZSAoc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgIHN0cnVjdCBmaWxlICAqZmlsZSkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHpvcmFuX2Nsb3NlKCVzLCBwaWQ9WyVkXSksIHVzZXJzKCspPSVkXG4iLAorCQlaUl9ERVZOQU1FKHpyKSwgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksIHpyLT51c2VyKTsKKworCS8qIGtlcm5lbCBsb2NrcyAoZnMvZGV2aWNlLmMpLCBzbyBkb24ndCBkbyB0aGF0IG91cnNlbHZlcworCSAqIChwcmV2ZW50cyBkZWFkbG9ja3MpICovCisJLyptdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KKworCXpvcmFuX2Nsb3NlX2VuZF9zZXNzaW9uKGZpbGUpOworCisJaWYgKHpyLT51c2VyLS0gPT0gMSkgewkvKiBMYXN0IHByb2Nlc3MgKi8KKwkJLyogQ2xlYW4gdXAgSlBFRyBwcm9jZXNzICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKKwkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKKwkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQlidGFuZCh+WlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKKworCQlpZiAoenIzNjA2N19kZWJ1ZyA+IDEpCisJCQlwcmludF9pbnRlcnJ1cHRzKHpyKTsKKworCQkvKiBPdmVybGF5IG9mZiAqLworCQl6ci0+djRsX292ZXJsYXlfYWN0aXZlID0gMDsKKwkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKKwkJenItPm92ZXJsYXlfbWFzayA9IE5VTEw7CisKKwkJLyogY2FwdHVyZSBvZmYgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6ci0+djRsX2NhcHEpOworCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKKwkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOworCQl6b3Jhbl9zZXRfcGNpX21hc3Rlcih6ciwgMCk7CisKKwkJaWYgKCFwYXNzX3Rocm91Z2gpIHsJLyogU3dpdGNoIHRvIGNvbG9yIGJhciAqLworCQkJaW50IHplcm8gPSAwLCB0d28gPSAyOworCQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZ6ZXJvKTsKKwkJCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ0d28pOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShmaC0+b3ZlcmxheV9tYXNrKTsKKwlrZnJlZShmaCk7CisKKwkvKiByZWxlYXNlIGxvY2tzIG9uIHRoZSBpMmMgbW9kdWxlcyAqLworCW1vZHVsZV9wdXQoenItPmRlY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKKwlpZiAoenItPmVuY29kZXIpIHsKKwkJIG1vZHVsZV9wdXQoenItPmVuY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKKwl9CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwkvKm11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOyovCisKKwlkcHJpbnRrKDQsIEtFUk5fSU5GTyAiJXM6IHpvcmFuX2Nsb3NlKCkgZG9uZVxuIiwgWlJfREVWTkFNRSh6cikpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3QKK3pvcmFuX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICBjaGFyICAgICAgICBfX3VzZXIgKmRhdGEsCisJICAgIHNpemVfdCAgICAgICBjb3VudCwKKwkgICAgbG9mZl90ICAgICAgKnBwb3MpCit7CisJLyogd2Ugc2ltcGx5IGRvbid0IHN1cHBvcnQgcmVhZCgpICh5ZXQpLi4uICovCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QKK3pvcmFuX3dyaXRlIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgIGNvbnN0IGNoYXIgIF9fdXNlciAqZGF0YSwKKwkgICAgIHNpemVfdCAgICAgICBjb3VudCwKKwkgICAgIGxvZmZfdCAgICAgICpwcG9zKQoreworCS8qIC4uLmFuZCB0aGUgc2FtZSBnb2VzIGZvciB3cml0ZSgpICovCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorc2V0dXBfZmJ1ZmZlciAoc3RydWN0IGZpbGUgICAgICAgICAgICAgICAqZmlsZSwKKwkgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqYmFzZSwKKwkgICAgICAgY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCAqZm10LAorCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKwkgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3BlcmxpbmUpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCisJLyogKFJvbmFsZCkgdjRsL3Y0bDIgZ3VpZGVsaW5lcyAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIERvbid0IGFsbG93IGZyYW1lIGJ1ZmZlciBvdmVybGF5IGlmIFBDSSBvciBBR1AgaXMgYnVnZ3ksIG9yIG9uCisJICAgQUxpIE1hZ2lrICh0aGF0IG5lZWRzIHZlcnkgbG93IGxhdGVuY3kgd2hpbGUgdGhlIGNhcmQgbmVlZHMgYQorCSAgIGhpZ2hlciB2YWx1ZSBhbHdheXMpICovCisKKwlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfRkFJTCB8IFBDSUFHUF9GQUlMIHwgUENJUENJX0FMSU1BR0lLKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIHdlIG5lZWQgYSBieXRlc3BlcmxpbmUgdmFsdWUsIGV2ZW4gaWYgbm90IGdpdmVuICovCisJaWYgKCFieXRlc3BlcmxpbmUpCisJCWJ5dGVzcGVybGluZSA9IHdpZHRoICogKChmbXQtPmRlcHRoICsgNykgJiB+NykgLyA4OworCisjaWYgMAorCWlmICh6ci0+b3ZlcmxheV9hY3RpdmUpIHsKKwkJLyogZHpqZWUuLi4gc3R1cGlkIHVzZXJzLi4uIGRvbid0IGV2ZW4gYm90aGVyIHRvIHR1cm4gb2ZmCisJCSAqIG92ZXJsYXkgYmVmb3JlIGNoYW5naW5nIHRoZSBtZW1vcnkgbG9jYXRpb24uLi4KKwkJICogbm9ybWFsbHksIHdlIHdvdWxkIHJldHVybiBlcnJvcnMgaGVyZS4gSG93ZXZlciwgb25lIG9mCisJCSAqIHRoZSB0b29scyB0aGF0IGRvZXMgdGhpcyBpcy4uLiB4YXd0diEgYW5kIHNpbmNlIHhhd3R2CisJCSAqIGlzIHVzZWQgYnkgKy8tIDk5JSBvZiB0aGUgdXNlcnMsIHdlJ2QgcmF0aGVyIGJlIHVzZXItCisJCSAqIGZyaWVuZGx5IGFuZCBzaWxlbnRseSBkbyBhcyBpZiBub3RoaW5nIHdlbnQgd3JvbmcgKi8KKwkJZHByaW50aygzLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gZm9yY2VkIG92ZXJsYXkgdHVybm9mZiBiZWNhdXNlIGZyYW1lYnVmZmVyIGNoYW5nZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7CisJfQorI2VuZGlmCisKKwlpZiAoIShmbXQtPmZsYWdzICYgWk9SQU5fRk9STUFUX09WRVJMQVkpKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX2ZidWZmZXIoKSAtIG5vIHZhbGlkIG92ZXJsYXkgZm9ybWF0IGdpdmVuXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGhlaWdodCA8PSAwIHx8IHdpZHRoIDw9IDAgfHwgYnl0ZXNwZXJsaW5lIDw9IDApIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKKwkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gaW52YWxpZCBoZWlnaHQvd2lkdGgvYnBsIHZhbHVlICglZHwlZHwlZClcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgd2lkdGgsIGhlaWdodCwgYnl0ZXNwZXJsaW5lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChieXRlc3BlcmxpbmUgJiAzKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX2ZidWZmZXIoKSAtIGJ5dGVzcGVybGluZSAoJWQpIG11c3QgYmUgNC1ieXRlIGFsaWduZWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgYnl0ZXNwZXJsaW5lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJenItPmJ1ZmZlci5iYXNlID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBiYXNlICYgfjMpOworCXpyLT5idWZmZXIuaGVpZ2h0ID0gaGVpZ2h0OworCXpyLT5idWZmZXIud2lkdGggPSB3aWR0aDsKKwl6ci0+YnVmZmVyLmRlcHRoID0gZm10LT5kZXB0aDsKKwl6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQgPSBmbXQ7CisJenItPmJ1ZmZlci5ieXRlc3BlcmxpbmUgPSBieXRlc3BlcmxpbmU7CisKKwkvKiBUaGUgdXNlciBzaG91bGQgc2V0IG5ldyB3aW5kb3cgcGFyYW1ldGVycyAqLworCXpyLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitzZXR1cF93aW5kb3cgKHN0cnVjdCBmaWxlICAgICAgICpmaWxlLAorCSAgICAgIGludCAgICAgICAgICAgICAgICB4LAorCSAgICAgIGludCAgICAgICAgICAgICAgICB5LAorCSAgICAgIGludCAgICAgICAgICAgICAgICB3aWR0aCwKKwkgICAgICBpbnQgICAgICAgICAgICAgICAgaGVpZ2h0LAorCSAgICAgIHN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqY2xpcHMsCisJICAgICAgaW50ICAgICAgICAgICAgICAgIGNsaXBjb3VudCwKKwkgICAgICB2b2lkICAgICAgICAgICAgICBfX3VzZXIgKmJpdG1hcCkKK3sKKwlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CisJc3RydWN0IHZpZGVvX2NsaXAgKnZjcCA9IE5VTEw7CisJaW50IG9uLCBlbmQ7CisKKworCWlmICghenItPmJ1ZmZlci5iYXNlKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gZnJhbWUgYnVmZmVyIGhhcyB0byBiZSBzZXQgZmlyc3RcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gbm8gb3ZlcmxheSBmb3JtYXQgc2V0XG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRoZSB2aWRlbyBmcm9udCBlbmQgbmVlZHMgNC1ieXRlIGFsaW5nZWQgbGluZSBzaXplcywgd2UgY29ycmVjdCB0aGF0CisJICogc2lsZW50bHkgaGVyZSBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAoenItPmJ1ZmZlci5kZXB0aCA9PSAxNSB8fCB6ci0+YnVmZmVyLmRlcHRoID09IDE2KSB7CisJCWVuZCA9ICh4ICsgd2lkdGgpICYgfjE7CS8qIHJvdW5kIGRvd24gKi8KKwkJeCA9ICh4ICsgMSkgJiB+MTsJLyogcm91bmQgdXAgKi8KKwkJd2lkdGggPSBlbmQgLSB4OworCX0KKworCWlmICh6ci0+YnVmZmVyLmRlcHRoID09IDI0KSB7CisJCWVuZCA9ICh4ICsgd2lkdGgpICYgfjM7CS8qIHJvdW5kIGRvd24gKi8KKwkJeCA9ICh4ICsgMykgJiB+MzsJLyogcm91bmQgdXAgKi8KKwkJd2lkdGggPSBlbmQgLSB4OworCX0KKworCWlmICh3aWR0aCA+IEJVWl9NQVhfV0lEVEgpCisJCXdpZHRoID0gQlVaX01BWF9XSURUSDsKKwlpZiAoaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCisJCWhlaWdodCA9IEJVWl9NQVhfSEVJR0hUOworCisJLyogQ2hlY2sgZm9yIHZhaWxkIHBhcmFtZXRlcnMgKi8KKwlpZiAod2lkdGggPCBCVVpfTUlOX1dJRFRIIHx8IGhlaWdodCA8IEJVWl9NSU5fSEVJR0hUIHx8CisJICAgIHdpZHRoID4gQlVaX01BWF9XSURUSCB8fCBoZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBzZXR1cF93aW5kb3coKSAtIHdpZHRoID0gJWQgb3IgaGVpZ2h0ID0gJWQgaW52YWxpZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB3aWR0aCwgaGVpZ2h0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmgtPm92ZXJsYXlfc2V0dGluZ3MueCA9IHg7CisJZmgtPm92ZXJsYXlfc2V0dGluZ3MueSA9IHk7CisJZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggPSB3aWR0aDsKKwlmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQgPSBoZWlnaHQ7CisJZmgtPm92ZXJsYXlfc2V0dGluZ3MuY2xpcGNvdW50ID0gY2xpcGNvdW50OworCisJLyoKKwkgKiBJZiBhbiBvdmVybGF5IGlzIHJ1bm5pbmcsIHdlIGhhdmUgdG8gc3dpdGNoIGl0IG9mZgorCSAqIGFuZCBzd2l0Y2ggaXQgb24gYWdhaW4gaW4gb3JkZXIgdG8gZ2V0IHRoZSBuZXcgc2V0dGluZ3MgaW4gZWZmZWN0LgorCSAqCisJICogV2UgYWxzbyB3YW50IHRvIGF2b2lkIHRoYXQgdGhlIG92ZXJsYXkgbWFzayBpcyB3cml0dGVuCisJICogd2hlbiBhbiBvdmVybGF5IGlzIHJ1bm5pbmcuCisJICovCisKKwlvbiA9IHpyLT52NGxfb3ZlcmxheV9hY3RpdmUgJiYgIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgJiYKKwkgICAgenItPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKKwkgICAgZmgtPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUU7CisJaWYgKG9uKQorCQl6cjM2MDU3X292ZXJsYXkoenIsIDApOworCisJLyoKKwkgKiAgIFdyaXRlIHRoZSBvdmVybGF5IG1hc2sgaWYgY2xpcHMgYXJlIHdhbnRlZC4KKwkgKiAgIFdlIHByZWZlciBhIGJpdG1hcC4KKwkgKi8KKwlpZiAoYml0bWFwKSB7CisJCS8qIGZha2UgdmFsdWUgLSBpdCBqdXN0IG1lYW5zIHdlIHdhbnQgY2xpcHMgKi8KKwkJZmgtPm92ZXJsYXlfc2V0dGluZ3MuY2xpcGNvdW50ID0gMTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoZmgtPm92ZXJsYXlfbWFzaywgYml0bWFwLAorCQkJCSAgICh3aWR0aCAqIGhlaWdodCArIDcpIC8gOCkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIGlmIChjbGlwY291bnQgPiAwKSB7CisJCS8qIHdyaXRlIG91ciBvd24gYml0bWFwIGZyb20gdGhlIGNsaXBzICovCisJCXZjcCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqIChjbGlwY291bnQgKyA0KSk7CisJCWlmICh2Y3AgPT0gTlVMTCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBzZXR1cF93aW5kb3coKSAtIEFsbG9jIG9mIGNsaXAgbWFzayBmYWlsZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAodmNwLCBjbGlwcywgc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqIGNsaXBjb3VudCkpIHsKKwkJCXZmcmVlKHZjcCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQl3cml0ZV9vdmVybGF5X21hc2soZmlsZSwgdmNwLCBjbGlwY291bnQpOworCQl2ZnJlZSh2Y3ApOworCX0KKworCWZoLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDE7CisJaWYgKGZoLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCisJICAgIHpyLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFKQorCQl6ci0+b3ZlcmxheV9zZXR0aW5ncyA9IGZoLT5vdmVybGF5X3NldHRpbmdzOworCisJaWYgKG9uKQorCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOworCisJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwlyZXR1cm4gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworfQorCitzdGF0aWMgaW50CitzZXR1cF9vdmVybGF5IChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgICAgaW50ICAgICAgICAgIG9uKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKworCS8qIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8sIHJldHVybiBpbW1lZGlhdGx5ICovCisJaWYgKChvbiAmJiBmaC0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSkgfHwKKwkgICAgKCFvbiAmJiBmaC0+b3ZlcmxheV9hY3RpdmUgPT0gWk9SQU5fRlJFRSkpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgd2hldGhlciB3ZSdyZSB0b3VjaGluZyBzb21lb25lIGVsc2UncyBvdmVybGF5ICovCisJaWYgKG9uICYmIHpyLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCisJICAgIGZoLT5vdmVybGF5X2FjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7CisJCWRwcmludGsoMSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHNldHVwX292ZXJsYXkoKSAtIG92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUgZm9yIGFub3RoZXIgc2Vzc2lvblxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKCFvbiAmJiB6ci0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSAmJgorCSAgICBmaC0+b3ZlcmxheV9hY3RpdmUgPT0gWk9SQU5fRlJFRSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBzZXR1cF9vdmVybGF5KCkgLSB5b3UgY2Fubm90IGNhbmNlbCBzb21lb25lIGVsc2UncyBzZXNzaW9uXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChvbiA9PSAwKSB7CisJCXpyLT5vdmVybGF5X2FjdGl2ZSA9IGZoLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0ZSRUU7CisJCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAwOworCQkvKiBXaGVuIGEgZ3JhYiBpcyBydW5uaW5nLCB0aGUgdmlkZW8gc2ltcGx5CisJCSAqIHdvbid0IGJlIHN3aXRjaGVkIG9uIGFueSBtb3JlICovCisJCWlmICghenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKKwkJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7CisJCXpyLT5vdmVybGF5X21hc2sgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmICghenItPmJ1ZmZlci5iYXNlIHx8ICFmaC0+b3ZlcmxheV9zZXR0aW5ncy5pc19zZXQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogc2V0dXBfb3ZlcmxheSgpIC0gYnVmZmVyIG9yIHdpbmRvdyBub3Qgc2V0XG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHNldHVwX292ZXJsYXkoKSAtIG5vIG92ZXJsYXkgZm9ybWF0IHNldFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl6ci0+b3ZlcmxheV9hY3RpdmUgPSBmaC0+b3ZlcmxheV9hY3RpdmUgPSBaT1JBTl9MT0NLRUQ7CisJCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAxOworCQl6ci0+b3ZlcmxheV9tYXNrID0gZmgtPm92ZXJsYXlfbWFzazsKKwkJenItPm92ZXJsYXlfc2V0dGluZ3MgPSBmaC0+b3ZlcmxheV9zZXR0aW5nczsKKwkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQorCQkJenIzNjA1N19vdmVybGF5KHpyLCAxKTsKKwkJLyogV2hlbiBhIGdyYWIgaXMgcnVubmluZywgdGhlIHZpZGVvIHdpbGwgYmUKKwkJICogc3dpdGNoZWQgb24gd2hlbiBncmFiIGlzIGZpbmlzaGVkICovCisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwlyZXR1cm4gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworfQorCisJLyogZ2V0IHRoZSBzdGF0dXMgb2YgYSBidWZmZXIgaW4gdGhlIGNsaWVudHMgYnVmZmVyIHF1ZXVlICovCitzdGF0aWMgaW50Cit6b3Jhbl92NGwyX2J1ZmZlcl9zdGF0dXMgKHN0cnVjdCBmaWxlICAgICAgICAqZmlsZSwKKwkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYsCisJCQkgIGludCAgICAgICAgICAgICAgICAgbnVtKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKworCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKworCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6CisKKwkJLyogY2hlY2sgcmFuZ2UgKi8KKwkJaWYgKG51bSA8IDAgfHwgbnVtID49IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyB8fAorCQkgICAgIWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogdjRsMl9idWZmZXJfc3RhdHVzKCkgLSB3cm9uZyBudW1iZXIgb3IgYnVmZmVycyBub3QgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQlidWYtPmxlbmd0aCA9IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKworCQkvKiBnZXQgYnVmZmVyICovCisJCWJ1Zi0+Ynl0ZXN1c2VkID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLmxlbmd0aDsKKwkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSA9PSBCVVpfU1RBVEVfRE9ORSB8fAorCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID09IEJVWl9TVEFURV9VU0VSKSB7CisJCQlidWYtPnNlcXVlbmNlID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLnNlcTsKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOworCQkJYnVmLT50aW1lc3RhbXAgPQorCQkJICAgIGZoLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5icy50aW1lc3RhbXA7CisJCX0gZWxzZSB7CisJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOworCQl9CisKKwkJaWYgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0IDw9IEJVWl9NQVhfSEVJR0hUIC8gMikKKwkJCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKKwkJZWxzZQorCQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKworCQlicmVhazsKKworCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKKwljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgorCisJCS8qIGNoZWNrIHJhbmdlICovCisJCWlmIChudW0gPCAwIHx8IG51bSA+PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwKKwkJICAgICFmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IHY0bDJfYnVmZmVyX3N0YXR1cygpIC0gd3JvbmcgbnVtYmVyIG9yIGJ1ZmZlcnMgbm90IGFsbG9jYXRlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJ1Zi0+dHlwZSA9IChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1JFQykgPworCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIDoKKwkJCSAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCQlidWYtPmxlbmd0aCA9IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKworCQkvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIG9ubHkgd3JpdHRlbiBhZnRlciBmcmFtZSBoYXMgYmVlbiBjYXB0dXJlZCAqLworCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID09IEJVWl9TVEFURV9ET05FIHx8CisJCSAgICBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPT0gQlVaX1NUQVRFX1VTRVIpIHsKKwkJCWJ1Zi0+c2VxdWVuY2UgPSBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMuc2VxOworCQkJYnVmLT50aW1lc3RhbXAgPQorCQkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5icy50aW1lc3RhbXA7CisJCQlidWYtPmJ5dGVzdXNlZCA9CisJCQkgICAgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLmJzLmxlbmd0aDsKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOworCQl9IGVsc2UgeworCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJfQorCisJCS8qIHdoaWNoIGZpZWxkcyBhcmUgdGhlc2U/ICovCisJCWlmIChmaC0+anBnX3NldHRpbmdzLlRtcERjbSAhPSAxKQorCQkJYnVmLT5maWVsZCA9CisJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy4KKwkJCSAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfVE9QIDogVjRMMl9GSUVMRF9CT1RUT007CisJCWVsc2UKKwkJCWJ1Zi0+ZmllbGQgPQorCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuCisJCQkgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1NFUV9UQiA6CisJCQkgICAgVjRMMl9GSUVMRF9TRVFfQlQ7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCWRwcmludGsoNSwKKwkJCUtFUk5fRVJSCisJCQkiJXM6IHY0bDJfYnVmZmVyX3N0YXR1cygpIC0gaW52YWxpZCBidWZmZXIgdHlwZXxtYXBfbW9kZSAoJWR8JWQpXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgZmgtPm1hcF9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCWJ1Zi0+aW5kZXggPSBudW07CisJYnVmLT5tLm9mZnNldCA9IGJ1Zi0+bGVuZ3RoICogbnVtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3pvcmFuX3NldF9ub3JtIChzdHJ1Y3Qgem9yYW4gKnpyLAorCQlpbnQgICAgICAgICAgIG5vcm0pIC8qIFZJREVPX01PREVfKiAqLworeworCWludCBub3JtX2VuY29kZXIsIG9uOworCisJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSB8fAorCSAgICB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9XQVJOSU5HCisJCQkiJXM6IHNldF9ub3JtKCkgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAobG9ja19ub3JtICYmIG5vcm0gIT0genItPm5vcm0pIHsKKwkJaWYgKGxvY2tfbm9ybSA+IDEpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IHNldF9ub3JtKCkgLSBUViBzdGFuZGFyZCBpcyBsb2NrZWQsIGNhbiBub3Qgc3dpdGNoIG5vcm1cbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IHNldF9ub3JtKCkgLSBUViBzdGFuZGFyZCBpcyBsb2NrZWQsIG5vcm0gd2FzIG5vdCBjaGFuZ2VkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCW5vcm0gPSB6ci0+bm9ybTsKKwkJfQorCX0KKworCWlmIChub3JtICE9IFZJREVPX01PREVfQVVUTyAmJgorCSAgICAobm9ybSA8IDAgfHwgbm9ybSA+PSB6ci0+Y2FyZC5ub3JtcyB8fAorCSAgICAgIXpyLT5jYXJkLnR2bltub3JtXSkpIHsKKwkJZHByaW50aygxLAorCQkJS0VSTl9FUlIgIiVzOiBzZXRfbm9ybSgpIC0gdW5zdXBwb3J0ZWQgbm9ybSAlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBub3JtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5vcm0gPT0gVklERU9fTU9ERV9BVVRPKSB7CisJCWludCBzdGF0dXM7CisKKwkJLyogaWYgd2UgaGF2ZSBhdXRvZGV0ZWN0LCAuLi4gKi8KKwkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSBjYXBzOworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUywgJmNhcHMpOworCQlpZiAoIShjYXBzLmZsYWdzICYgVklERU9fREVDT0RFUl9BVVRPKSkgeworCQkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IG5vcm09YXV0byB1bnN1cHBvcnRlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOworCisJCS8qIGxldCBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwkJc3NsZWVwKDIpOworCisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogc2V0X25vcm0oKSAtIG5vIG5vcm0gZGV0ZWN0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJLyogcmVzZXQgbm9ybSAqLworCQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfTlRTQykKKwkJCW5vcm0gPSBWSURFT19NT0RFX05UU0M7CisJCWVsc2UgaWYgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX1NFQ0FNKQorCQkJbm9ybSA9IFZJREVPX01PREVfU0VDQU07CisJCWVsc2UKKwkJCW5vcm0gPSBWSURFT19NT0RFX1BBTDsKKwl9CisJenItPnRpbWluZyA9IHpyLT5jYXJkLnR2bltub3JtXTsKKwlub3JtX2VuY29kZXIgPSBub3JtOworCisJLyogV2Ugc3dpdGNoIG92ZXJsYXkgb2ZmIGFuZCBvbiBzaW5jZSBhIGNoYW5nZSBpbiB0aGUKKwkgKiBub3JtIG5lZWRzIGRpZmZlcmVudCBWRkUgc2V0dGluZ3MgKi8KKwlvbiA9IHpyLT5vdmVybGF5X2FjdGl2ZSAmJiAhenItPnY0bF9tZW1ncmFiX2FjdGl2ZTsKKwlpZiAob24pCisJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7CisKKwlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX05PUk0sICZub3JtKTsKKwllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX05PUk0sICZub3JtX2VuY29kZXIpOworCisJaWYgKG9uKQorCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOworCisJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwl6ci0+bm9ybSA9IG5vcm07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorem9yYW5fc2V0X2lucHV0IChzdHJ1Y3Qgem9yYW4gKnpyLAorCQkgaW50ICAgICAgICAgICBpbnB1dCkKK3sKKwlpbnQgcmVhbGlucHV0OworCisJaWYgKGlucHV0ID09IHpyLT5pbnB1dCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFIHx8CisJICAgIHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX1dBUk5JTkcKKwkJCSIlczogc2V0X2lucHV0KCkgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IHpyLT5jYXJkLmlucHV0cykgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBzZXRfaW5wdXQoKSAtIHVubnN1cHBvcnRlZCBpbnB1dCAlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBpbnB1dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlYWxpbnB1dCA9IHpyLT5jYXJkLmlucHV0W2lucHV0XS5tdXhzZWw7CisJenItPmlucHV0ID0gaW5wdXQ7CisKKwlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX0lOUFVULCAmcmVhbGlucHV0KTsKKworCXJldHVybiAwOworfQorCisvKgorICogICBpb2N0bCByb3V0aW5lCisgKi8KKworc3RhdGljIGludAorem9yYW5fZG9faW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBmaWxlICAqZmlsZSwKKwkJdW5zaWduZWQgaW50ICBjbWQsCisJCXZvaWQgICAgICAgICAqYXJnKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwkvKiBDQVJFRlVMOiB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBoZXJlICovCisJc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyBzZXR0aW5nczsKKworCS8qIHdlIG1pZ2h0IGhhdmUgb2xkZXIgYnVmZmVycyBseWluZyBhcm91bmQuLi4gV2UgZG9uJ3Qgd2FudAorCSAqIHRvIHdhaXQsIGJ1dCB3ZSBkbyB3YW50IHRvIHRyeSBjbGVhbmluZyB0aGVtIHVwIEFTQVAuIFNvCisJICogd2UgdHJ5IHRvIG9idGFpbiB0aGUgbG9jayBhbmQgZnJlZSB0aGVtLiBJZiB0aGF0IGZhaWxzLCB3ZQorCSAqIGRvbid0IGRvIGFueXRoaW5nIGFuZCB3YWl0IGZvciB0aGUgbmV4dCB0dXJuLiBJbiB0aGUgZW5kLAorCSAqIHpvcmFuX2Nsb3NlKCkgb3IgYSBuZXcgYWxsb2NhdGlvbiB3aWxsIHN0aWxsIGZyZWUgdGhlbS4uLgorCSAqIFRoaXMgaXMganVzdCBhICd0aGUgc29vbmVyIHRoZSBiZXR0ZXInIGV4dHJhICdmZWF0dXJlJworCSAqCisJICogV2UgZG9uJ3QgZnJlZSB0aGUgYnVmZmVycyByaWdodCBvbiBtdW5tYXAoKSBiZWNhdXNlIHRoYXQKKwkgKiBjYXVzZXMgb29wc2VzIChrZnJlZSgpIGluc2lkZSBtdW5tYXAoKSBvb3BzZXMgZm9yIG5vCisJICogYXBwYXJlbnQgcmVhc29uIC0gaXQncyBhbHNvIG5vdCByZXByb2R1Y2VhYmxlIGluIGFueSB3YXksCisJICogYnV0IG1vdmluZyB0aGUgZnJlZSBjb2RlIG91dHNpZGUgdGhlIG11bm1hcCgpIGhhbmRsZXIgZml4ZXMKKwkgKiBhbGwgdGhpcy4uLiBJZiBzb21lb25lIGtub3dzIHdoeSwgcGxlYXNlIGV4cGxhaW4gbWUgKFJvbmFsZCkKKwkgKi8KKwlpZiAobXV0ZXhfdHJ5bG9jaygmenItPnJlc291cmNlX2xvY2spKSB7CisJCS8qIHdlIG9idGFpbmVkIGl0ISBMZXQncyB0cnkgdG8gZnJlZSBzb21lIHRoaW5ncyAqLworCQlpZiAoZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKQorCQkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwkJaWYgKGZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCkKKwkJCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7CisKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgVklESU9DR0NBUDoKKwl7CisJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICp2Y2FwID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ0dDQVBcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQltZW1zZXQodmNhcCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5KSk7CisJCXN0cm5jcHkodmNhcC0+bmFtZSwgWlJfREVWTkFNRSh6ciksIHNpemVvZih2Y2FwLT5uYW1lKS0xKTsKKwkJdmNhcC0+dHlwZSA9IFpPUkFOX1ZJRF9UWVBFOworCisJCXZjYXAtPmNoYW5uZWxzID0genItPmNhcmQuaW5wdXRzOworCQl2Y2FwLT5hdWRpb3MgPSAwOworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXZjYXAtPm1heHdpZHRoID0gQlVaX01BWF9XSURUSDsKKwkJdmNhcC0+bWF4aGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7CisJCXZjYXAtPm1pbndpZHRoID0gQlVaX01JTl9XSURUSDsKKwkJdmNhcC0+bWluaGVpZ2h0ID0gQlVaX01JTl9IRUlHSFQ7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dDSEFOOgorCXsKKwkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjaGFuID0gYXJnOworCQlpbnQgY2hhbm5lbCA9IHZjaGFuLT5jaGFubmVsOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ0dDSEFOIC0gY2hhbm5lbD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB2Y2hhbi0+Y2hhbm5lbCk7CisKKwkJbWVtc2V0KHZjaGFuLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NoYW5uZWwpKTsKKwkJaWYgKGNoYW5uZWwgPiB6ci0+Y2FyZC5pbnB1dHMgfHwgY2hhbm5lbCA8IDApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DR0NIQU4gb24gbm90IGV4aXN0aW5nIGNoYW5uZWwgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGNoYW5uZWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzdHJjcHkodmNoYW4tPm5hbWUsIHpyLT5jYXJkLmlucHV0W2NoYW5uZWxdLm5hbWUpOworCisJCXZjaGFuLT50dW5lcnMgPSAwOworCQl2Y2hhbi0+ZmxhZ3MgPSAwOworCQl2Y2hhbi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXZjaGFuLT5ub3JtID0genItPm5vcm07CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCQl2Y2hhbi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCQkvKiBSSjogdGhlIGRvY3VtZW50YXRpb24gYXQgaHR0cDovL3JvYWRydW5uZXIuc3dhbnNlYS5saW51eC5vcmcudWsvdjRsYXBpLnNodG1sIHNheXM6CisJCSAqCisJCSAqICogIlRoZSBWSURJT0NTQ0hBTiBpb2N0bCB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBzd2l0Y2hlcyB0aGUgY2FwdHVyZSB0byB0aGlzIGlucHV0LiIKKwkJICogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl4KKwkJICogKiBUaGUgZmFtb3MgQlRUViBkcml2ZXIgaGFzIGl0IGltcGxlbWVudGVkIHdpdGggYSBzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBhcmd1bWVudAorCQkgKiAqIGFuZCB3ZSBmb2xsb3cgaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucworCQkgKiAqCisJCSAqICogQlRXOiB0aGlzIGlzIHRoZSBvbmx5IHdheSB0aGUgdXNlciBjYW4gc2V0IHRoZSBub3JtIQorCQkgKi8KKworCWNhc2UgVklESU9DU0NIQU46CisJeworCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmNoYW4gPSBhcmc7CisJCWludCByZXM7CisKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBWSURJT0NTQ0hBTiAtIGNoYW5uZWw9JWQsIG5vcm09JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgdmNoYW4tPmNoYW5uZWwsIHZjaGFuLT5ub3JtKTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCWlmICgocmVzID0gem9yYW5fc2V0X2lucHV0KHpyLCB2Y2hhbi0+Y2hhbm5lbCkpKQorCQkJZ290byBzY2hhbl91bmxvY2tfYW5kX3JldHVybjsKKwkJaWYgKChyZXMgPSB6b3Jhbl9zZXRfbm9ybSh6ciwgdmNoYW4tPm5vcm0pKSkKKwkJCWdvdG8gc2NoYW5fdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworCXNjaGFuX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHUElDVDoKKwl7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlICp2cGljdCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHUElDVFxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW1lbXNldCh2cGljdCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7CisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJdnBpY3QtPmh1ZSA9IHpyLT5odWU7CisJCXZwaWN0LT5icmlnaHRuZXNzID0genItPmJyaWdodG5lc3M7CisJCXZwaWN0LT5jb250cmFzdCA9IHpyLT5jb250cmFzdDsKKwkJdnBpY3QtPmNvbG91ciA9IHpyLT5zYXR1cmF0aW9uOworCQlpZiAoZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7CisJCQl2cGljdC0+ZGVwdGggPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoOworCQkJdnBpY3QtPnBhbGV0dGUgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPnBhbGV0dGU7CisJCX0gZWxzZSB7CisJCQl2cGljdC0+ZGVwdGggPSAwOworCQl9CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NQSUNUOgorCXsKKwkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnZwaWN0ID0gYXJnOworCQlpbnQgaTsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ1NQSUNUIC0gYnJpPSVkLCBodWU9JWQsIGNvbD0lZCwgY29uPSVkLCBkZXA9JWQsIHBhbD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB2cGljdC0+YnJpZ2h0bmVzcywgdnBpY3QtPmh1ZSwKKwkJCXZwaWN0LT5jb2xvdXIsIHZwaWN0LT5jb250cmFzdCwgdnBpY3QtPmRlcHRoLAorCQkJdnBpY3QtPnBhbGV0dGUpOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CisJCQljb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0ICpmbXQgPSAmem9yYW5fZm9ybWF0c1tpXTsKKworCQkJaWYgKGZtdC0+cGFsZXR0ZSAhPSAtMSAmJgorCQkJICAgIGZtdC0+ZmxhZ3MgJiBaT1JBTl9GT1JNQVRfT1ZFUkxBWSAmJgorCQkJICAgIGZtdC0+cGFsZXR0ZSA9PSB2cGljdC0+cGFsZXR0ZSAmJgorCQkJICAgIGZtdC0+ZGVwdGggPT0gdnBpY3QtPmRlcHRoKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IE5VTV9GT1JNQVRTKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ1NQSUNUIC0gSW52YWxpZCBwYWxldHRlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCB2cGljdC0+cGFsZXR0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsIHZwaWN0KTsKKworCQl6ci0+aHVlID0gdnBpY3QtPmh1ZTsKKwkJenItPmNvbnRyYXN0ID0gdnBpY3QtPmNvbnRyYXN0OworCQl6ci0+c2F0dXJhdGlvbiA9IHZwaWN0LT5jb2xvdXI7CisJCXpyLT5icmlnaHRuZXNzID0gdnBpY3QtPmJyaWdodG5lc3M7CisKKwkJZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0ID0gJnpvcmFuX2Zvcm1hdHNbaV07CisKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DQ0FQVFVSRToKKwl7CisJCWludCAqb24gPSBhcmcsIHJlczsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NDQVBUVVJFIC0gb249JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKm9uKTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IHNldHVwX292ZXJsYXkoZmlsZSwgKm9uKTsKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdndpbiA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHV0lOXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KHZ3aW4sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSk7CisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJdndpbi0+eCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLng7CisJCXZ3aW4tPnkgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy55OworCQl2d2luLT53aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoOworCQl2d2luLT5oZWlnaHQgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQ7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCQl2d2luLT5jbGlwY291bnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NTV0lOOgorCXsKKwkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdndpbiA9IGFyZzsKKwkJaW50IHJlczsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ1NXSU4gLSB4PSVkLCB5PSVkLCB3PSVkLCBoPSVkLCBjbGlwY291bnQ9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgdndpbi0+eCwgdndpbi0+eSwgdndpbi0+d2lkdGgsCisJCQl2d2luLT5oZWlnaHQsIHZ3aW4tPmNsaXBjb3VudCk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPQorCQkgICAgc2V0dXBfd2luZG93KGZpbGUsIHZ3aW4tPngsIHZ3aW4tPnksIHZ3aW4tPndpZHRoLAorCQkJCSB2d2luLT5oZWlnaHQsIHZ3aW4tPmNsaXBzLAorCQkJCSB2d2luLT5jbGlwY291bnQsIE5VTEwpOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dGQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmJ1ZiA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHRkJVRlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJKnZidWYgPSB6ci0+YnVmZmVyOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DU0ZCVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICp2YnVmID0gYXJnOworCQlpbnQgaSwgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ1NGQlVGIC0gYmFzZT0lcCwgdz0lZCwgaD0lZCwgZGVwdGg9JWQsIGJwbD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCB2YnVmLT5iYXNlLCB2YnVmLT53aWR0aCwKKwkJCXZidWYtPmhlaWdodCwgdmJ1Zi0+ZGVwdGgsIHZidWYtPmJ5dGVzcGVybGluZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCisJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSB2YnVmLT5kZXB0aCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DU0ZCVUYgLSBpbnZhbGlkIGZidWYgZGVwdGggJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHZidWYtPmRlcHRoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPQorCQkgICAgc2V0dXBfZmJ1ZmZlcihmaWxlLCB2YnVmLT5iYXNlLCAmem9yYW5fZm9ybWF0c1tpXSwKKwkJCQkgIHZidWYtPndpZHRoLCB2YnVmLT5oZWlnaHQsCisJCQkJICB2YnVmLT5ieXRlc3BlcmxpbmUpOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NZTkM6CisJeworCQlpbnQgKmZyYW1lID0gYXJnLCByZXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DU1lOQyAtIGZyYW1lPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICpmcmFtZSk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSB2NGxfc3luYyhmaWxlLCAqZnJhbWUpOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJaWYgKCFyZXMpCisJCQl6ci0+djRsX3N5bmNfdGFpbCsrOworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ01DQVBUVVJFOgorCXsKKwkJc3RydWN0IHZpZGVvX21tYXAgKnZtYXAgPSBhcmc7CisJCWludCByZXM7CisKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBWSURJT0NNQ0FQVFVSRSAtIGZyYW1lPSVkLCBnZW9tPSVkeCVkLCBmbXQ9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgdm1hcC0+ZnJhbWUsIHZtYXAtPndpZHRoLCB2bWFwLT5oZWlnaHQsCisJCQl2bWFwLT5mb3JtYXQpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmVzID0gdjRsX2dyYWIoZmlsZSwgdm1hcCk7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ0dNQlVGOgorCXsKKwkJc3RydWN0IHZpZGVvX21idWYgKnZtYnVmID0gYXJnOworCQlpbnQgaSwgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHTUJVRlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCXZtYnVmLT5zaXplID0KKwkJICAgIGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyAqCisJCSAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCXZtYnVmLT5mcmFtZXMgPSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7CisJCWZvciAoaSA9IDA7IGkgPCB2bWJ1Zi0+ZnJhbWVzOyBpKyspIHsKKwkJCXZtYnVmLT5vZmZzZXRzW2ldID0KKwkJCSAgICBpICogZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQl9CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkIHx8IGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DR01CVUYgLSBidWZmZXJzIGFscmVhZHkgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQlpZiAodjRsX2ZidWZmZXJfYWxsb2MoZmlsZSkpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBWNEwgYnVmZmVycyAqLworCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisJdjRsMXJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NHVU5JVDoKKwl7CisJCXN0cnVjdCB2aWRlb191bml0ICp2dW5pdCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHVU5JVFxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCXZ1bml0LT52aWRlbyA9IHpyLT52aWRlb19kZXYtPm1pbm9yOworCQl2dW5pdC0+dmJpID0gVklERU9fTk9fVU5JVDsKKwkJdnVuaXQtPnJhZGlvID0gVklERU9fTk9fVU5JVDsKKwkJdnVuaXQtPmF1ZGlvID0gVklERU9fTk9fVU5JVDsKKwkJdnVuaXQtPnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVDsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJCS8qCisJCSAqIFJKOiBJbiBwcmluY2lwYWwgd2UgY291bGQgc3VwcG9ydCBzdWJjYXB0dXJlcyBmb3IgVjRMIGdyYWJiaW5nLgorCQkgKiAgICAgTm90IGV2ZW4gdGhlIGZhbW91cyBCVFRWIGRyaXZlciBoYXMgdGhlbSwgaG93ZXZlci4KKwkJICogICAgIElmIHRoZXJlIHNob3VsZCBiZSBhIHN0cm9uZyBkZW1hbmQsIG9uZSBjb3VsZCBjb25zaWRlcgorCQkgKiAgICAgdG8gaW1wbGVtZW50IHRoZW0uCisJCSAqLworCWNhc2UgVklESU9DR0NBUFRVUkU6CisJeworCQlkcHJpbnRrKDMsIEtFUk5fRVJSICIlczogVklESU9DR0NBUFRVUkUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DU0NBUFRVUkU6CisJeworCQlkcHJpbnRrKDMsIEtFUk5fRVJSICIlczogVklESU9DU0NBUFRVUkUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQlicmVhazsKKworCWNhc2UgQlVaSU9DX0dfUEFSQU1TOgorCXsKKwkJc3RydWN0IHpvcmFuX3BhcmFtcyAqYnBhcmFtcyA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBCVVpJT0NfR19QQVJBTVNcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQltZW1zZXQoYnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCB6b3Jhbl9wYXJhbXMpKTsKKwkJYnBhcmFtcy0+bWFqb3JfdmVyc2lvbiA9IE1BSk9SX1ZFUlNJT047CisJCWJwYXJhbXMtPm1pbm9yX3ZlcnNpb24gPSBNSU5PUl9WRVJTSU9OOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlicGFyYW1zLT5ub3JtID0genItPm5vcm07CisJCWJwYXJhbXMtPmlucHV0ID0genItPmlucHV0OworCisJCWJwYXJhbXMtPmRlY2ltYXRpb24gPSBmaC0+anBnX3NldHRpbmdzLmRlY2ltYXRpb247CisJCWJwYXJhbXMtPkhvckRjbSA9IGZoLT5qcGdfc2V0dGluZ3MuSG9yRGNtOworCQlicGFyYW1zLT5WZXJEY20gPSBmaC0+anBnX3NldHRpbmdzLlZlckRjbTsKKwkJYnBhcmFtcy0+VG1wRGNtID0gZmgtPmpwZ19zZXR0aW5ncy5UbXBEY207CisJCWJwYXJhbXMtPmZpZWxkX3Blcl9idWZmID0gZmgtPmpwZ19zZXR0aW5ncy5maWVsZF9wZXJfYnVmZjsKKwkJYnBhcmFtcy0+aW1nX3ggPSBmaC0+anBnX3NldHRpbmdzLmltZ194OworCQlicGFyYW1zLT5pbWdfeSA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3k7CisJCWJwYXJhbXMtPmltZ193aWR0aCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoOworCQlicGFyYW1zLT5pbWdfaGVpZ2h0ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0OworCQlicGFyYW1zLT5vZGRfZXZlbiA9IGZoLT5qcGdfc2V0dGluZ3Mub2RkX2V2ZW47CisKKwkJYnBhcmFtcy0+cXVhbGl0eSA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eTsKKwkJYnBhcmFtcy0+QVBQbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQbjsKKwkJYnBhcmFtcy0+QVBQX2xlbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbjsKKwkJbWVtY3B5KGJwYXJhbXMtPkFQUF9kYXRhLAorCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwKKwkJICAgICAgIHNpemVvZihicGFyYW1zLT5BUFBfZGF0YSkpOworCQlicGFyYW1zLT5DT01fbGVuID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuOworCQltZW1jcHkoYnBhcmFtcy0+Q09NX2RhdGEsCisJCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLAorCQkgICAgICAgc2l6ZW9mKGJwYXJhbXMtPkNPTV9kYXRhKSk7CisJCWJwYXJhbXMtPmpwZWdfbWFya2VycyA9CisJCSAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLmpwZWdfbWFya2VyczsKKworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlicGFyYW1zLT5WRklGT19GQiA9IDA7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgQlVaSU9DX1NfUEFSQU1TOgorCXsKKwkJc3RydWN0IHpvcmFuX3BhcmFtcyAqYnBhcmFtcyA9IGFyZzsKKwkJaW50IHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX1NfUEFSQU1TXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IGJwYXJhbXMtPmRlY2ltYXRpb247CisJCXNldHRpbmdzLkhvckRjbSA9IGJwYXJhbXMtPkhvckRjbTsKKwkJc2V0dGluZ3MuVmVyRGNtID0gYnBhcmFtcy0+VmVyRGNtOworCQlzZXR0aW5ncy5UbXBEY20gPSBicGFyYW1zLT5UbXBEY207CisJCXNldHRpbmdzLmZpZWxkX3Blcl9idWZmID0gYnBhcmFtcy0+ZmllbGRfcGVyX2J1ZmY7CisJCXNldHRpbmdzLmltZ194ID0gYnBhcmFtcy0+aW1nX3g7CisJCXNldHRpbmdzLmltZ195ID0gYnBhcmFtcy0+aW1nX3k7CisJCXNldHRpbmdzLmltZ193aWR0aCA9IGJwYXJhbXMtPmltZ193aWR0aDsKKwkJc2V0dGluZ3MuaW1nX2hlaWdodCA9IGJwYXJhbXMtPmltZ19oZWlnaHQ7CisJCXNldHRpbmdzLm9kZF9ldmVuID0gYnBhcmFtcy0+b2RkX2V2ZW47CisKKwkJc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eSA9IGJwYXJhbXMtPnF1YWxpdHk7CisJCXNldHRpbmdzLmpwZ19jb21wLkFQUG4gPSBicGFyYW1zLT5BUFBuOworCQlzZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuID0gYnBhcmFtcy0+QVBQX2xlbjsKKwkJbWVtY3B5KHNldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLCBicGFyYW1zLT5BUFBfZGF0YSwKKwkJICAgICAgIHNpemVvZihicGFyYW1zLT5BUFBfZGF0YSkpOworCQlzZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuID0gYnBhcmFtcy0+Q09NX2xlbjsKKwkJbWVtY3B5KHNldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLCBicGFyYW1zLT5DT01fZGF0YSwKKwkJICAgICAgIHNpemVvZihicGFyYW1zLT5DT01fZGF0YSkpOworCQlzZXR0aW5ncy5qcGdfY29tcC5qcGVnX21hcmtlcnMgPSBicGFyYW1zLT5qcGVnX21hcmtlcnM7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9JRExFKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IEJVWklPQ19TX1BBUkFNUyBjYWxsZWQsIGJ1dCBCdXogaW4gY2FwdHVyZS9wbGF5YmFjayBtb2RlXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHNwYXJhbXNfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBDaGVjayB0aGUgcGFyYW1zIGZpcnN0IGJlZm9yZSBvdmVyd3JpdGluZyBvdXIKKwkJICogbnRlcm5hbCB2YWx1ZXMgKi8KKwkJaWYgKHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyh6ciwgJnNldHRpbmdzKSkgeworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gc3BhcmFtc191bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWZoLT5qcGdfc2V0dGluZ3MgPSBzZXR0aW5nczsKKwlzcGFyYW1zX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHpvcmFuX3JlcXVlc3RidWZmZXJzICpicmVxID0gYXJnOworCQlpbnQgcmVzID0gMDsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IEJVWklPQ19SRVFCVUZTIC0gY291bnQ9JWx1LCBzaXplPSVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBicmVxLT5jb3VudCwgYnJlcS0+c2l6ZSk7CisKKwkJLyogRW5mb3JjZSByZWFzb25hYmxlIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMgKi8KKwkJaWYgKGJyZXEtPmNvdW50IDwgNCkKKwkJCWJyZXEtPmNvdW50ID0gNDsJLyogQ291bGQgYmUgY2hvb3NlbiBzbWFsbGVyICovCisJCWlmIChicmVxLT5jb3VudCA+IGpwZ19uYnVmcykKKwkJCWJyZXEtPmNvdW50ID0ganBnX25idWZzOworCQlicmVxLT5zaXplID0gUEFHRV9BTElHTihicmVxLT5zaXplKTsKKwkJaWYgKGJyZXEtPnNpemUgPCA4MTkyKQorCQkJYnJlcS0+c2l6ZSA9IDgxOTI7CS8qIEFyYml0cmFyeSAqLworCQkvKiBicmVxLT5zaXplIGlzIGxpbWl0ZWQgYnkgMSBwYWdlIGZvciB0aGUgc3RhdF9jb20KKwkJICogdGFibGVzIHRvIGEgTWF4aW11bSBvZiAyIE1CICovCisJCWlmIChicmVxLT5zaXplID4ganBnX2J1ZnNpemUpCisJCQlicmVxLT5zaXplID0ganBnX2J1ZnNpemU7CisJCWlmIChmaC0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzICYmCisJCSAgICBicmVxLT5zaXplID4gTUFYX0tNQUxMT0NfTUVNKQorCQkJYnJlcS0+c2l6ZSA9IE1BWF9LTUFMTE9DX01FTTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwgZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBCVVpJT0NfUkVRQlVGUyAtIGJ1ZmZlcnMgYWxscmVhZHkgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FQlVTWTsKKwkJCWdvdG8ganBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzID0gYnJlcS0+Y291bnQ7CisJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9IGJyZXEtPnNpemU7CisKKwkJaWYgKGpwZ19mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQlyZXMgPSAtRU5PTUVNOworCQkJZ290byBqcGdyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBNSlBFRyBidWZmZXJzIC0gY291bGQKKwkJICogYWxzbyBiZSAqX1BMQVksIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBoZXJlICovCisJCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX0pQR19SRUM7CisJanBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19RQlVGX0NBUFQ6CisJeworCQlpbnQgKmZyYW1lID0gYXJnLCByZXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX1FCVUZfQ0FQVCAtIGZyYW1lPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksICpmcmFtZSk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSBqcGdfcWJ1ZihmaWxlLCAqZnJhbWUsIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUyk7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgQlVaSU9DX1FCVUZfUExBWToKKwl7CisJCWludCAqZnJhbWUgPSBhcmcsIHJlczsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBCVVpJT0NfUUJVRl9QTEFZIC0gZnJhbWU9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKmZyYW1lKTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJlcyA9IGpwZ19xYnVmKGZpbGUsICpmcmFtZSwgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIEJVWklPQ19TWU5DOgorCXsKKwkJc3RydWN0IHpvcmFuX3N5bmMgKmJzeW5jID0gYXJnOworCQlpbnQgcmVzOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19TWU5DXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlyZXMgPSBqcGdfc3luYyhmaWxlLCBic3luYyk7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgQlVaSU9DX0dfU1RBVFVTOgorCXsKKwkJc3RydWN0IHpvcmFuX3N0YXR1cyAqYnN0YXQgPSBhcmc7CisJCWludCBub3JtLCBpbnB1dCwgc3RhdHVzLCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19HX1NUQVRVU1xuIiwgWlJfREVWTkFNRSh6cikpOworCisJCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9JRExFKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IEJVWklPQ19HX1NUQVRVUyBjYWxsZWQgYnV0IEJ1eiBpbiBjYXB0dXJlL3BsYXliYWNrIG1vZGVcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpbnB1dCA9IHpyLT5jYXJkLmlucHV0W2JzdGF0LT5pbnB1dF0ubXV4c2VsOworCQlub3JtID0gVklERU9fTU9ERV9BVVRPOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfSURMRSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBCVVpJT0NfR19TVEFUVVMgY2FsbGVkLCBidXQgQnV6IGluIGNhcHR1cmUvcGxheWJhY2sgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBnc3RhdF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfSU5QVVQsICZpbnB1dCk7CisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOworCisJCS8qIHNsZWVwIDEgc2Vjb25kICovCisJCXNzbGVlcCgxKTsKKworCQkvKiBHZXQgc3RhdHVzIG9mIHZpZGVvIGRlY29kZXIgKi8KKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0dFVF9TVEFUVVMsICZzdGF0dXMpOworCisJCS8qIHJlc3RvcmUgcHJldmlvdXMgaW5wdXQgYW5kIG5vcm0gKi8KKwkJaW5wdXQgPSB6ci0+Y2FyZC5pbnB1dFt6ci0+aW5wdXRdLm11eHNlbDsKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9JTlBVVCwgJmlucHV0KTsKKwkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOworCWdzdGF0X3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoIXJlcykgeworCQkJYnN0YXQtPnNpZ25hbCA9CisJCQkgICAgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX0dPT0QpID8gMSA6IDA7CisJCQlpZiAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfTlRTQykKKwkJCQlic3RhdC0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX1NFQ0FNKQorCQkJCWJzdGF0LT5ub3JtID0gVklERU9fTU9ERV9TRUNBTTsKKwkJCWVsc2UKKwkJCQlic3RhdC0+bm9ybSA9IFZJREVPX01PREVfUEFMOworCisJCQlic3RhdC0+Y29sb3IgPQorCQkJICAgIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19DT0xPUikgPyAxIDogMDsKKwkJfQorCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCQkvKiBUaGUgbmV3IHZpZGVvNGxpbnV4MiBjYXB0dXJlIGludGVyZmFjZSAtIG11Y2ggbmljZXIgdGhhbiB2aWRlbzRsaW51eDEsIHNpbmNlCisJCSAqIGl0IGFsbG93cyBmb3IgaW50ZWdyYXRpbmcgdGhlIEpQRUcgY2FwdHVyaW5nIGNhbGxzIGluc2lkZSBzdGFuZGFyZCB2NGwyCisJCSAqLworCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1FVRVJZQ0FQXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwkJc3RybmNweShjYXAtPmNhcmQsIFpSX0RFVk5BTUUoenIpLCBzaXplb2YoY2FwLT5jYXJkKS0xKTsKKwkJc3RybmNweShjYXAtPmRyaXZlciwgInpvcmFuIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKS0xKTsKKwkJc25wcmludGYoY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pLCAiUENJOiVzIiwKKwkJCSBwY2lfbmFtZSh6ci0+cGNpX2RldikpOworCQljYXAtPnZlcnNpb24gPQorCQkgICAgS0VSTkVMX1ZFUlNJT04oTUFKT1JfVkVSU0lPTiwgTUlOT1JfVkVSU0lPTiwKKwkJCQkgICBSRUxFQVNFX1ZFUlNJT04pOworCQljYXAtPmNhcGFiaWxpdGllcyA9IFpPUkFOX1Y0TDJfVklEX0ZMQUdTOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19FTlVNX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCA9IGFyZzsKKwkJaW50IGluZGV4ID0gZm10LT5pbmRleCwgbnVtID0gLTEsIGksIGZsYWcgPSAwLCB0eXBlID0KKwkJICAgIGZtdC0+dHlwZTsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTV9GTVQgLSBpbmRleD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPmluZGV4KTsKKworCQlzd2l0Y2ggKGZtdC0+dHlwZSkgeworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJCWZsYWcgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQkJZmxhZyA9IFpPUkFOX0ZPUk1BVF9QTEFZQkFDSzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJCWZsYWcgPSBaT1JBTl9GT1JNQVRfT1ZFUkxBWTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfRU5VTV9GTVQgLSB1bmtub3duIHR5cGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CisJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIGZsYWcpCisJCQkJbnVtKys7CisJCQlpZiAobnVtID09IGZtdC0+aW5kZXgpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZtdC0+aW5kZXggPCAwIC8qIGxhdGUsIGJ1dCBub3QgdG9vIGxhdGUgKi8gIHx8CisJCSAgICBpID09IE5VTV9GT1JNQVRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKKwkJZm10LT5pbmRleCA9IGluZGV4OworCQlmbXQtPnR5cGUgPSB0eXBlOworCQlzdHJuY3B5KGZtdC0+ZGVzY3JpcHRpb24sIHpvcmFuX2Zvcm1hdHNbaV0ubmFtZSwgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pLTEpOworCQlmbXQtPnBpeGVsZm9ybWF0ID0gem9yYW5fZm9ybWF0c1tpXS5mb3VyY2M7CisJCWlmICh6b3Jhbl9mb3JtYXRzW2ldLmZsYWdzICYgWk9SQU5fRk9STUFUX0NPTVBSRVNTRUQpCisJCQlmbXQtPmZsYWdzIHw9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKKwkJaW50IHR5cGUgPSBmbXQtPnR5cGU7CisKKwkJZHByaW50ayg1LCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfRk1UXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKKwkJZm10LT50eXBlID0gdHlwZTsKKworCQlzd2l0Y2ggKGZtdC0+dHlwZSkgeworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKworCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQlmbXQtPmZtdC53aW4udy5sZWZ0ID0gZmgtPm92ZXJsYXlfc2V0dGluZ3MueDsKKwkJCWZtdC0+Zm10Lndpbi53LnRvcCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLnk7CisJCQlmbXQtPmZtdC53aW4udy53aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoOworCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0KKwkJCSAgICBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQ7CisJCQlpZiAoZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggKiAyID4KKwkJCSAgICBCVVpfTUFYX0hFSUdIVCkKKwkJCQlmbXQtPmZtdC53aW4uZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCQllbHNlCisJCQkJZm10LT5mbXQud2luLmZpZWxkID0gVjRMMl9GSUVMRF9UT1A7CisKKwkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQlicmVhazsKKworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKworCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQlpZiAoZm10LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAmJgorCQkJICAgIGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcpIHsKKworCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9CisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3Mud2lkdGg7CisJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0OworCQkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSAqCisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0OworCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9CisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5mb3VyY2M7CisJCQkJZm10LT5mbXQucGl4LmNvbG9yc3BhY2UgPQorCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmZvcm1hdC0+Y29sb3JzcGFjZTsKKwkJCQlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0KKwkJCQkgICAgZmgtPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmU7CisJCQkJaWYgKEJVWl9NQVhfSEVJR0hUIDwKKwkJCQkgICAgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICogMikpCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCQkJZWxzZQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgVjRMMl9GSUVMRF9UT1A7CisKKwkJCX0gZWxzZSB7CisKKwkJCQlmbXQtPmZtdC5waXgud2lkdGggPQorCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvCisJCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuSG9yRGNtOworCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQorCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ19oZWlnaHQgLworCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy5WZXJEY20gKgorCQkJCSAgICAgZmgtPmpwZ19zZXR0aW5ncy5UbXBEY20pOworCQkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJCSAgICB6b3Jhbl92NGwyX2NhbGNfYnVmc2l6ZSgmZmgtPgorCQkJCQkJCSAgICBqcGdfc2V0dGluZ3MpOworCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9CisJCQkJICAgIFY0TDJfUElYX0ZNVF9NSlBFRzsKKwkJCQlpZiAoZmgtPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0gMSkKKwkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KKwkJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLgorCQkJCQkgICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9TRVFfQlQgOgorCQkJCQkgICAgIFY0TDJfRklFTERfU0VRX0JUKTsKKwkJCQllbHNlCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KKwkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfVE9QIDoKKwkJCQkJICAgICBWNEwyX0ZJRUxEX0JPVFRPTSk7CisKKwkJCQlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKKwkJCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9CisJCQkJICAgIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJCQl9CisKKwkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfR19GTVQgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPnR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7CisJCWludCBpLCByZXMgPSAwOworCQlfX2xlMzIgcHJpbnRmb3JtYXQ7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfRk1UIC0gdHlwZT0lZCwgIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPnR5cGUpOworCisJCXN3aXRjaCAoZm10LT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCisJCQlkcHJpbnRrKDMsICJ4PSVkLCB5PSVkLCB3PSVkLCBoPSVkLCBjbnQ9JWQsIG1hcD0weCVwXG4iLAorCQkJCWZtdC0+Zm10Lndpbi53LmxlZnQsIGZtdC0+Zm10Lndpbi53LnRvcCwKKwkJCQlmbXQtPmZtdC53aW4udy53aWR0aCwKKwkJCQlmbXQtPmZtdC53aW4udy5oZWlnaHQsCisJCQkJZm10LT5mbXQud2luLmNsaXBjb3VudCwKKwkJCQlmbXQtPmZtdC53aW4uYml0bWFwKTsKKwkJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCXJlcyA9CisJCQkgICAgc2V0dXBfd2luZG93KGZpbGUsIGZtdC0+Zm10Lndpbi53LmxlZnQsCisJCQkJCSBmbXQtPmZtdC53aW4udy50b3AsCisJCQkJCSBmbXQtPmZtdC53aW4udy53aWR0aCwKKwkJCQkJIGZtdC0+Zm10Lndpbi53LmhlaWdodCwKKwkJCQkJIChzdHJ1Y3QgdmlkZW9fY2xpcCBfX3VzZXIgKikKKwkJCQkJICAgZm10LT5mbXQud2luLmNsaXBzLAorCQkJCQkgZm10LT5mbXQud2luLmNsaXBjb3VudCwKKwkJCQkJIGZtdC0+Zm10Lndpbi5iaXRtYXApOworCQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQlyZXR1cm4gcmVzOworCQkJYnJlYWs7CisKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisKKwkJCXByaW50Zm9ybWF0ID0KKwkJCSAgICBfX2NwdV90b19sZTMyKGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJCQlkcHJpbnRrKDMsICJzaXplPSVkeCVkLCBmbXQ9MHgleCAoJTQuNHMpXG4iLAorCQkJCWZtdC0+Zm10LnBpeC53aWR0aCwgZm10LT5mbXQucGl4LmhlaWdodCwKKwkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQsCisJCQkJKGNoYXIgKikgJnByaW50Zm9ybWF0KTsKKworCQkJLyogd2UgY2FuIGJlIHJlcXVlc3RlZCB0byBkbyBKUEVHL3JhdyBwbGF5YmFjay9jYXB0dXJlICovCisJCQlpZiAoIQorCQkJICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCQkgICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkJCSAgICAgIGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PQorCQkJICAgICAgVjRMMl9QSVhfRk1UX01KUEVHKSkpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1NfRk1UIC0gdW5rbm93biB0eXBlICVkLzB4JXgoJTQuNHMpIGNvbWJpbmF0aW9uXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlLAorCQkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQsCisJCQkJCShjaGFyICopICZwcmludGZvcm1hdCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHKSB7CisJCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQkJc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOworCisJCQkJaWYgKGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgfHwKKwkJCQkgICAgZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJCQlkcHJpbnRrKDEsCisJCQkJCQlLRVJOX0VSUgorCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSBjYW5ub3QgY2hhbmdlIGNhcHR1cmUgbW9kZVxuIiwKKwkJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQkJcmVzID0gLUVCVVNZOworCQkJCQlnb3RvIHNmbXRqcGdfdW5sb2NrX2FuZF9yZXR1cm47CisJCQkJfQorCisJCQkJLyogd2UgYWN0dWFsbHkgbmVlZCB0byBzZXQgJ3JlYWwnIHBhcmFtZXRlcnMgbm93ICovCisJCQkJaWYgKChmbXQtPmZtdC5waXguaGVpZ2h0ICogMikgPgorCQkJCSAgICBCVVpfTUFYX0hFSUdIVCkKKwkJCQkJc2V0dGluZ3MuVG1wRGNtID0gMTsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlRtcERjbSA9IDI7CisJCQkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IDA7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPD0KKwkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0IC8gMikKKwkJCQkJc2V0dGluZ3MuVmVyRGNtID0gMjsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlZlckRjbSA9IDE7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8PQorCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDQpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDQ7CisJCQkJZWxzZSBpZiAoZm10LT5mbXQucGl4LndpZHRoIDw9CisJCQkJCSBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDIpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDI7CisJCQkJZWxzZQorCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSAxOworCQkJCWlmIChzZXR0aW5ncy5UbXBEY20gPT0gMSkKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAyOworCQkJCWVsc2UKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAxOworCisJCQkJLyogY2hlY2sgKi8KKwkJCQlpZiAoKHJlcyA9CisJCQkJICAgICB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsCisJCQkJCQkJICAgICAgJnNldHRpbmdzKSkpCisJCQkJCWdvdG8gc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjsKKworCQkJCS8qIGl0J3Mgb2ssIHNvIHNldCB0aGVtICovCisJCQkJZmgtPmpwZ19zZXR0aW5ncyA9IHNldHRpbmdzOworCisJCQkJLyogdGVsbCB0aGUgdXNlciB3aGF0IHdlIGFjdHVhbGx5IGRpZCAqLworCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9CisJCQkJICAgIHNldHRpbmdzLmltZ193aWR0aCAvIHNldHRpbmdzLkhvckRjbTsKKwkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KKwkJCQkgICAgc2V0dGluZ3MuaW1nX2hlaWdodCAqIDIgLworCQkJCSAgICAoc2V0dGluZ3MuVG1wRGNtICogc2V0dGluZ3MuVmVyRGNtKTsKKwkJCQlpZiAoc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KKwkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfU0VRX1RCIDoKKwkJCQkJICAgICBWNEwyX0ZJRUxEX1NFUV9CVCk7CisJCQkJZWxzZQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1RPUCA6CisJCQkJCSAgICAgVjRMMl9GSUVMRF9CT1RUT00pOworCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9CisJCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+CisJCQkJCQkJICAgIGpwZ19zZXR0aW5ncyk7CisJCQkJZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9CisJCQkJICAgIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisKKwkJCQkvKiB3ZSBoZXJlYnkgYWJ1c2UgdGhpcyB2YXJpYWJsZSB0byBzaG93IHRoYXQKKwkJCQkgKiB3ZSdyZSBnb25uYSBkbyBtanBlZyBjYXB0dXJlICovCisJCQkJZmgtPm1hcF9tb2RlID0KKwkJCQkgICAgKGZtdC0+dHlwZSA9PQorCQkJCSAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSA/CisJCQkJICAgIFpPUkFOX01BUF9NT0RFX0pQR19SRUMgOgorCQkJCSAgICBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWTsKKwkJCXNmbXRqcGdfdW5sb2NrX2FuZF9yZXR1cm46CisJCQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKQorCQkJCQlpZiAoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID09CisJCQkJCSAgICB6b3Jhbl9mb3JtYXRzW2ldLmZvdXJjYykKKwkJCQkJCWJyZWFrOworCQkJCWlmIChpID09IE5VTV9GT1JNQVRTKSB7CisJCQkJCWRwcmludGsoMSwKKwkJCQkJCUtFUk5fRVJSCisJCQkJCQkiJXM6IFZJRElPQ19TX0ZNVCAtIHVua25vd24vdW5zdXBwb3J0ZWQgZm9ybWF0IDB4JXggKCU0LjRzKVxuIiwKKwkJCQkJCVpSX0RFVk5BTUUoenIpLAorCQkJCQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0LAorCQkJCQkJKGNoYXIgKikgJnByaW50Zm9ybWF0KTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCB8fAorCQkJCSAgICAoZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCAmJgorCQkJCSAgICAgZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPQorCQkJCSAgICAgWk9SQU5fRlJFRSkpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogVklESU9DX1NfRk1UIC0gY2Fubm90IGNoYW5nZSBjYXB0dXJlIG1vZGVcbiIsCisJCQkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQkJCXJlcyA9IC1FQlVTWTsKKwkJCQkJZ290byBzZm10djRsX3VubG9ja19hbmRfcmV0dXJuOworCQkJCX0KKwkJCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA+IEJVWl9NQVhfSEVJR0hUKQorCQkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KKwkJCQkJICAgIEJVWl9NQVhfSEVJR0hUOworCQkJCWlmIChmbXQtPmZtdC5waXgud2lkdGggPiBCVVpfTUFYX1dJRFRIKQorCQkJCQlmbXQtPmZtdC5waXgud2lkdGggPSBCVVpfTUFYX1dJRFRIOworCisJCQkJaWYgKChyZXMgPQorCQkJCSAgICAgem9yYW5fdjRsX3NldF9mb3JtYXQoZmlsZSwKKwkJCQkJCQkgIGZtdC0+Zm10LnBpeC4KKwkJCQkJCQkgIHdpZHRoLAorCQkJCQkJCSAgZm10LT5mbXQucGl4LgorCQkJCQkJCSAgaGVpZ2h0LAorCQkJCQkJCSAgJnpvcmFuX2Zvcm1hdHMKKwkJCQkJCQkgIFtpXSkpKQorCQkJCQlnb3RvIHNmbXR2NGxfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJCQkvKiB0ZWxsIHRoZSB1c2VyIHRoZQorCQkJCSAqIHJlc3VsdHMvbWlzc2luZyBzdHVmZiAqLworCQkJCWZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQorCQkJCQlmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZTsKKwkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJCQkJZmgtPnY0bF9zZXR0aW5ncy5oZWlnaHQgKgorCQkJCQlmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZTsKKwkJCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9CisJCQkJCWZoLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5jb2xvcnNwYWNlOworCQkJCWlmIChCVVpfTUFYX0hFSUdIVCA8CisJCQkJICAgIChmaC0+djRsX3NldHRpbmdzLmhlaWdodCAqIDIpKQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQkJCWVsc2UKKwkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KKwkJCQkJICAgIFY0TDJfRklFTERfVE9QOworCisJCQkJZmgtPm1hcF9tb2RlID0gWk9SQU5fTUFQX01PREVfUkFXOworCQkJc2ZtdHY0bF91bmxvY2tfYW5kX3JldHVybjoKKwkJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMywgInVuc3VwcG9ydGVkXG4iKTsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1NfRk1UIC0gdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19GQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZiID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX0ZCVUZcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQltZW1zZXQoZmIsIDAsIHNpemVvZigqZmIpKTsKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlmYi0+YmFzZSA9IHpyLT5idWZmZXIuYmFzZTsKKwkJZmItPmZtdC53aWR0aCA9IHpyLT5idWZmZXIud2lkdGg7CisJCWZiLT5mbXQuaGVpZ2h0ID0genItPmJ1ZmZlci5oZWlnaHQ7CisJCWlmICh6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpIHsKKwkJCWZiLT5mbXQucGl4ZWxmb3JtYXQgPQorCQkJCWZoLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdC0+Zm91cmNjOworCQl9CisJCWZiLT5mbXQuYnl0ZXNwZXJsaW5lID0genItPmJ1ZmZlci5ieXRlc3BlcmxpbmU7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCQlmYi0+Zm10LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwkJZmItPmZtdC5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJZmItPmZsYWdzID0gVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWTsKKwkJZmItPmNhcGFiaWxpdHkgPSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkc7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfRkJVRjoKKwl7CisJCWludCBpLCByZXMgPSAwOworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7CisJCV9fbGUzMiBwcmludGZvcm1hdCA9IF9fY3B1X3RvX2xlMzIoZmItPmZtdC5waXhlbGZvcm1hdCk7CisKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiBWSURJT0NfU19GQlVGIC0gYmFzZT0weCVwLCBzaXplPSVkeCVkLCBicGw9JWQsIGZtdD0weCV4ICglNC40cylcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgZmItPmJhc2UsIGZiLT5mbXQud2lkdGgsIGZiLT5mbXQuaGVpZ2h0LAorCQkJZmItPmZtdC5ieXRlc3BlcmxpbmUsIGZiLT5mbXQucGl4ZWxmb3JtYXQsCisJCQkoY2hhciAqKSAmcHJpbnRmb3JtYXQpOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKQorCQkJaWYgKHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjID09IGZiLT5mbXQucGl4ZWxmb3JtYXQpCisJCQkJYnJlYWs7CisJCWlmIChpID09IE5VTV9GT1JNQVRTKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TX0ZCVUYgLSBmb3JtYXQ9MHgleCAoJTQuNHMpIG5vdCBhbGxvd2VkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBmYi0+Zm10LnBpeGVsZm9ybWF0LAorCQkJCShjaGFyICopICZwcmludGZvcm1hdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmVzID0KKwkJICAgIHNldHVwX2ZidWZmZXIoZmlsZSwgZmItPmJhc2UsICZ6b3Jhbl9mb3JtYXRzW2ldLAorCQkJCSAgZmItPmZtdC53aWR0aCwgZmItPmZtdC5oZWlnaHQsCisJCQkJICBmYi0+Zm10LmJ5dGVzcGVybGluZSk7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX09WRVJMQVk6CisJeworCQlpbnQgKm9uID0gYXJnLCByZXM7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1BSRVZJRVcgLSBvbj0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCAqb24pOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmVzID0gc2V0dXBfb3ZlcmxheShmaWxlLCAqb24pOworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSA9IGFyZzsKKwkJaW50IHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1JFUUJVRlMgLSB0eXBlPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIHJlcS0+dHlwZSk7CisKKwkJaWYgKHJlcS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogb25seSBNRU1PUllfTU1BUCBjYXB0dXJlIGlzIHN1cHBvcnRlZCwgbm90ICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCByZXEtPm1lbW9yeSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCB8fCBmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19SRVFCVUZTIC0gYnVmZmVycyBhbGxyZWFkeSBhbGxvY2F0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVCVVNZOworCQkJZ290byB2NGwycmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJaWYgKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcgJiYKKwkJICAgIHJlcS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKworCQkJLyogY29udHJvbCB1c2VyIGlucHV0ICovCisJCQlpZiAocmVxLT5jb3VudCA8IDIpCisJCQkJcmVxLT5jb3VudCA9IDI7CisJCQlpZiAocmVxLT5jb3VudCA+IHY0bF9uYnVmcykKKwkJCQlyZXEtPmNvdW50ID0gdjRsX25idWZzOworCQkJZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzID0gcmVxLT5jb3VudDsKKworCQkJaWYgKHY0bF9mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCS8qIFRoZSBuZXh0IG1tYXAgd2lsbCBtYXAgdGhlIFY0TCBidWZmZXJzICovCisJCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7CisKKwkJfSBlbHNlIGlmIChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1JFQyB8fAorCQkJICAgZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKSB7CisKKwkJCS8qIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHNpemUgb3Vyc2VsdmVzIG5vdyAqLworCQkJaWYgKHJlcS0+Y291bnQgPCA0KQorCQkJCXJlcS0+Y291bnQgPSA0OworCQkJaWYgKHJlcS0+Y291bnQgPiBqcGdfbmJ1ZnMpCisJCQkJcmVxLT5jb3VudCA9IGpwZ19uYnVmczsKKwkJCWZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyA9IHJlcS0+Y291bnQ7CisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgPQorCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+anBnX3NldHRpbmdzKTsKKworCQkJaWYgKGpwZ19mYnVmZmVyX2FsbG9jKGZpbGUpKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCS8qIFRoZSBuZXh0IG1tYXAgd2lsbCBtYXAgdGhlIE1KUEVHIGJ1ZmZlcnMgKi8KKwkJCWlmIChyZXEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX0pQR19SRUM7CisJCQllbHNlCisJCQkJZmgtPm1hcF9tb2RlID0gWk9SQU5fTUFQX01PREVfSlBHX1BMQVk7CisKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1JFUUJVRlMgLSB1bmtub3duIHR5cGUgJWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIHJlcS0+dHlwZSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byB2NGwycmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJdjRsMnJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7CisJCV9fdTMyIHR5cGUgPSBidWYtPnR5cGU7CisJCWludCBpbmRleCA9IGJ1Zi0+aW5kZXgsIHJlczsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ19RVUVSWUJVRiAtIGluZGV4PSVkLCB0eXBlPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+aW5kZXgsIGJ1Zi0+dHlwZSk7CisKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwkJYnVmLT50eXBlID0gdHlwZTsKKwkJYnVmLT5pbmRleCA9IGluZGV4OworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmVzID0gem9yYW5fdjRsMl9idWZmZXJfc3RhdHVzKGZpbGUsIGJ1ZiwgYnVmLT5pbmRleCk7CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1FCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKKwkJaW50IHJlcyA9IDAsIGNvZGVjX21vZGUsIGJ1Zl90eXBlOworCisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcgIiVzOiBWSURJT0NfUUJVRiAtIHR5cGU9JWQsIGluZGV4PSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgYnVmLT5pbmRleCk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCXJlcyA9IHpvcmFuX3Y0bF9xdWV1ZV9mcmFtZShmaWxlLCBidWYtPmluZGV4KTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlICYmCisJCQkgICAgZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9MT0NLRUQpCisJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMSk7CisJCQlicmVhazsKKworCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKSB7CisJCQkJYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwkJCQljb2RlY19tb2RlID0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M7CisJCQl9IGVsc2UgeworCQkJCWJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJCWNvZGVjX21vZGUgPSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M7CisJCQl9CisKKwkJCWlmIChidWYtPnR5cGUgIT0gYnVmX3R5cGUpIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7CisJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCXJlcyA9CisJCQkgICAgem9yYW5fanBnX3F1ZXVlX2ZyYW1lKGZpbGUsIGJ1Zi0+aW5kZXgsCisJCQkJCQkgIGNvZGVjX21vZGUpOworCQkJaWYgKHJlcyAhPSAwKQorCQkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9JRExFICYmCisJCQkgICAgZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9MT0NLRUQpIHsKKwkJCQl6cjM2MDU3X2VuYWJsZV9qcGcoenIsIGNvZGVjX21vZGUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1FCVUYgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCXFidWZfdW5sb2NrX2FuZF9yZXR1cm46CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0RRQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7CisJCWludCByZXMgPSAwLCBidWZfdHlwZSwgbnVtID0gLTE7CS8qIGNvbXBpbGVyIGJvcmtzIGhlcmUgKD8pICovCisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0RRQlVGIC0gdHlwZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCQljYXNlIFpPUkFOX01BUF9NT0RFX1JBVzoKKwkJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IFZJRElPQ19RQlVGIC0gaW52YWxpZCBidWYtPnR5cGU9JWQgZm9yIG1hcF9tb2RlPSVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT50eXBlLCBmaC0+bWFwX21vZGUpOworCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKworCQkJbnVtID0genItPnY0bF9wZW5kW3pyLT52NGxfc3luY190YWlsICYgVjRMX01BU0tfRlJBTUVdOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLICYmCisJCQkgICAgenItPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlICE9CisJCQkgICAgQlVaX1NUQVRFX0RPTkUpIHsKKwkJCQlyZXMgPSAtRUFHQUlOOworCQkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisJCQlyZXMgPSB2NGxfc3luYyhmaWxlLCBudW0pOworCQkJaWYgKHJlcykKKwkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQkJZWxzZQorCQkJCXpyLT52NGxfc3luY190YWlsKys7CisJCQlyZXMgPSB6b3Jhbl92NGwyX2J1ZmZlcl9zdGF0dXMoZmlsZSwgYnVmLCBudW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgorCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgorCQl7CisJCQlzdHJ1Y3Qgem9yYW5fc3luYyBiczsKKworCQkJaWYgKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWSkKKwkJCQlidWZfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCQkJZWxzZQorCQkJCWJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJCQlpZiAoYnVmLT50eXBlICE9IGJ1Zl90eXBlKSB7CisJCQkJZHByaW50aygxLAorCQkJCQlLRVJOX0VSUgorCQkJCQkiJXM6IFZJRElPQ19RQlVGIC0gaW52YWxpZCBidWYtPnR5cGU9JWQgZm9yIG1hcF9tb2RlPSVkXG4iLAorCQkJCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT50eXBlLCBmaC0+bWFwX21vZGUpOworCQkJCXJlcyA9IC1FSU5WQUw7CisJCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKworCQkJbnVtID0KKwkJCSAgICB6ci0+anBnX3BlbmRbenItPgorCQkJCQkganBnX3F1ZV90YWlsICYgQlVaX01BU0tfRlJBTUVdOworCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYKKwkJCSAgICB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgIT0KKwkJCSAgICBCVVpfU1RBVEVfRE9ORSkgeworCQkJCXJlcyA9IC1FQUdBSU47CisJCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJCXJlcyA9IGpwZ19zeW5jKGZpbGUsICZicyk7CisJCQlpZiAocmVzKQorCQkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47CisJCQlyZXMgPQorCQkJICAgIHpvcmFuX3Y0bDJfYnVmZmVyX3N0YXR1cyhmaWxlLCBidWYsIGJzLmZyYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX0RRQlVGIC0gdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT50eXBlKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJZHFidWZfdW5sb2NrX2FuZF9yZXR1cm46CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCXsKKwkJaW50IHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NUUkVBTU9OXG4iLCBaUl9ERVZOQU1FKHpyKSk7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgkvKiByYXcgY2FwdHVyZSAqLworCQkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fQUNUSVZFIHx8CisJCQkgICAgZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9BQ1RJVkUpIHsKKwkJCQlyZXMgPSAtRUJVU1k7CisJCQkJZ290byBzdHJtb25fdW5sb2NrX2FuZF9yZXR1cm47CisJCQl9CisKKwkJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KKwkJCSAgICBaT1JBTl9MT0NLRUQ7CisJCQl6ci0+djRsX3NldHRpbmdzID0gZmgtPnY0bF9zZXR0aW5nczsKKworCQkJenItPnY0bF9zeW5jX3RhaWwgPSB6ci0+djRsX3BlbmRfdGFpbDsKKwkJCWlmICghenItPnY0bF9tZW1ncmFiX2FjdGl2ZSAmJgorCQkJICAgIHpyLT52NGxfcGVuZF9oZWFkICE9IHpyLT52NGxfcGVuZF90YWlsKSB7CisJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCQkvKiB3aGF0IGlzIHRoZSBjb2RlYyBtb2RlIHJpZ2h0IG5vdz8gKi8KKwkJCWlmICh6ci0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0FDVElWRSB8fAorCQkJICAgIGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fQUNUSVZFKSB7CisJCQkJcmVzID0gLUVCVVNZOworCQkJCWdvdG8gc3RybW9uX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCisJCQl6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0gZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9CisJCQkgICAgWk9SQU5fTE9DS0VEOworCisJCQlpZiAoenItPmpwZ19xdWVfaGVhZCAhPSB6ci0+anBnX3F1ZV90YWlsKSB7CisJCQkJLyogU3RhcnQgdGhlIGpwZWcgY29kZWMgd2hlbiB0aGUgZmlyc3QgZnJhbWUgaXMgcXVldWVkICAqLworCQkJCWpwZWdfc3RhcnQoenIpOworCQkJfQorCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX1NUUkVBTU9OIC0gaW52YWxpZCBtYXAgbW9kZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHN0cm1vbl91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCXN0cm1vbl91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCXsKKwkJaW50IGksIHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NUUkVBTU9GRlxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCQljYXNlIFpPUkFOX01BUF9NT0RFX1JBVzoJLyogcmF3IGNhcHR1cmUgKi8KKwkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUgJiYKKwkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJCQlyZXMgPSAtRVBFUk07CS8qIHN0YXkgb2ZmIG90aGVyJ3Mgc2V0dGluZ3MhICovCisJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkKKwkJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJCS8qIHVubG9hZCBjYXB0dXJlICovCisJCQlpZiAoenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykKKwkJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0KKwkJCQkgICAgQlVaX1NUQVRFX1VTRVI7CisJCQlmaC0+djRsX2J1ZmZlcnMgPSB6ci0+djRsX2J1ZmZlcnM7CisKKwkJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KKwkJCSAgICBaT1JBTl9GUkVFOworCisJCQl6ci0+djRsX2dyYWJfc2VxID0gMDsKKwkJCXpyLT52NGxfcGVuZF9oZWFkID0genItPnY0bF9wZW5kX3RhaWwgPSAwOworCQkJenItPnY0bF9zeW5jX3RhaWwgPSAwOworCisJCQlicmVhazsKKworCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFICYmCisJCQkgICAgenItPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7CisJCQkJcmVzID0gLUVQRVJNOwkvKiBzdGF5IG9mZiBvdGhlcidzIHNldHRpbmdzISAqLworCQkJCWdvdG8gc3RybW9mZl91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJCWlmICh6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpCisJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOworCisJCQlyZXMgPQorCQkJICAgIGpwZ19xYnVmKGZpbGUsIC0xLAorCQkJCSAgICAgKGZoLT5tYXBfbW9kZSA9PQorCQkJCSAgICAgIFpPUkFOX01BUF9NT0RFX0pQR19SRUMpID8KKwkJCQkgICAgIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUyA6CisJCQkJICAgICBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyk7CisJCQlpZiAocmVzKQorCQkJCWdvdG8gc3RybW9mZl91bmxvY2tfYW5kX3JldHVybjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfU1RSRUFNT0ZGIC0gaW52YWxpZCBtYXAgbW9kZSAlZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwlzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1FVRVJZQ1RSTCAtIGlkPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPmlkKTsKKworCQkvKiB3ZSBvbmx5IHN1cHBvcnQgaHVlL3NhdHVyYXRpb24vY29udHJhc3QvYnJpZ2h0bmVzcyAqLworCQlpZiAoY3RybC0+aWQgPCBWNEwyX0NJRF9CUklHSFRORVNTIHx8CisJCSAgICBjdHJsLT5pZCA+IFY0TDJfQ0lEX0hVRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQllbHNlIHsKKwkJCWludCBpZCA9IGN0cmwtPmlkOworCQkJbWVtc2V0KGN0cmwsIDAsIHNpemVvZigqY3RybCkpOworCQkJY3RybC0+aWQgPSBpZDsKKwkJfQorCisJCXN3aXRjaCAoY3RybC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQnJpZ2h0bmVzcyIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQ29udHJhc3QiLCBzaXplb2YoY3RybC0+bmFtZSktMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJc3RybmNweShjdHJsLT5uYW1lLCAiU2F0dXJhdGlvbiIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkh1ZSIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3RybC0+bWluaW11bSA9IDA7CisJCWN0cmwtPm1heGltdW0gPSA2NTUzNTsKKwkJY3RybC0+c3RlcCA9IDE7CisJCWN0cmwtPmRlZmF1bHRfdmFsdWUgPSAzMjc2ODsKKwkJY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfQ1RSTCAtIGlkPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPmlkKTsKKworCQkvKiB3ZSBvbmx5IHN1cHBvcnQgaHVlL3NhdHVyYXRpb24vY29udHJhc3QvYnJpZ2h0bmVzcyAqLworCQlpZiAoY3RybC0+aWQgPCBWNEwyX0NJRF9CUklHSFRORVNTIHx8CisJCSAgICBjdHJsLT5pZCA+IFY0TDJfQ0lEX0hVRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQljdHJsLT52YWx1ZSA9IHpyLT5icmlnaHRuZXNzOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljdHJsLT52YWx1ZSA9IHpyLT5jb250cmFzdDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQljdHJsLT52YWx1ZSA9IHpyLT5zYXR1cmF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJY3RybC0+dmFsdWUgPSB6ci0+aHVlOworCQkJYnJlYWs7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCXN0cnVjdCB2aWRlb19waWN0dXJlIHBpY3Q7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfQ1RSTCAtIGlkPSVkXG4iLAorCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPmlkKTsKKworCQkvKiB3ZSBvbmx5IHN1cHBvcnQgaHVlL3NhdHVyYXRpb24vY29udHJhc3QvYnJpZ2h0bmVzcyAqLworCQlpZiAoY3RybC0+aWQgPCBWNEwyX0NJRF9CUklHSFRORVNTIHx8CisJCSAgICBjdHJsLT5pZCA+IFY0TDJfQ0lEX0hVRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjdHJsLT52YWx1ZSA8IDAgfHwgY3RybC0+dmFsdWUgPiA2NTUzNSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfU19DVFJMIC0gaW52YWxpZCB2YWx1ZSAlZCBmb3IgaWQ9JWRcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksIGN0cmwtPnZhbHVlLCBjdHJsLT5pZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQl6ci0+YnJpZ2h0bmVzcyA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQl6ci0+Y29udHJhc3QgPSBjdHJsLT52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQl6ci0+c2F0dXJhdGlvbiA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJenItPmh1ZSA9IGN0cmwtPnZhbHVlOworCQkJYnJlYWs7CisJCX0KKwkJcGljdC5icmlnaHRuZXNzID0genItPmJyaWdodG5lc3M7CisJCXBpY3QuY29udHJhc3QgPSB6ci0+Y29udHJhc3Q7CisJCXBpY3QuY29sb3VyID0genItPnNhdHVyYXRpb247CisJCXBpY3QuaHVlID0genItPmh1ZTsKKworCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsICZwaWN0KTsKKworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpzdGQgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0VOVU1TVEQgLSBpbmRleD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBzdGQtPmluZGV4KTsKKworCQlpZiAoc3RkLT5pbmRleCA8IDAgfHwgc3RkLT5pbmRleCA+PSAoenItPmNhcmQubm9ybXMgKyAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQllbHNlIHsKKwkJCWludCBpZCA9IHN0ZC0+aW5kZXg7CisJCQltZW1zZXQoc3RkLCAwLCBzaXplb2YoKnN0ZCkpOworCQkJc3RkLT5pbmRleCA9IGlkOworCQl9CisKKwkJaWYgKHN0ZC0+aW5kZXggPT0genItPmNhcmQubm9ybXMpIHsKKwkJCS8qIGlmIHdlIGhhdmUgYXV0b2RldGVjdCwgLi4uICovCisJCQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5IGNhcHM7CisJCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUywKKwkJCQkJJmNhcHMpOworCQkJaWYgKGNhcHMuZmxhZ3MgJiBWSURFT19ERUNPREVSX0FVVE8pIHsKKwkJCQlzdGQtPmlkID0gVjRMMl9TVERfQUxMOworCQkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiQXV0b2RldGVjdCIsIHNpemVvZihzdGQtPm5hbWUpLTEpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3dpdGNoIChzdGQtPmluZGV4KSB7CisJCWNhc2UgMDoKKwkJCXN0ZC0+aWQgPSBWNEwyX1NURF9QQUw7CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlBBTCIsIHNpemVvZihzdGQtPm5hbWUpLTEpOworCQkJc3RkLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxOworCQkJc3RkLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDI1OworCQkJc3RkLT5mcmFtZWxpbmVzID0genItPmNhcmQudHZuWzBdLT5IdDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzdGQtPmlkID0gVjRMMl9TVERfTlRTQzsKKwkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiTlRTQyIsIHNpemVvZihzdGQtPm5hbWUpLTEpOworCQkJc3RkLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxMDAxOworCQkJc3RkLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDMwMDAwOworCQkJc3RkLT5mcmFtZWxpbmVzID0genItPmNhcmQudHZuWzFdLT5IdDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdGQtPmlkID0gVjRMMl9TVERfU0VDQU07CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlNFQ0FNIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CisJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CisJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CisJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMl0tPkh0OworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCQlpbnQgbm9ybTsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19TVERcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCW5vcm0gPSB6ci0+bm9ybTsKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJc3dpdGNoIChub3JtKSB7CisJCWNhc2UgVklERU9fTU9ERV9QQUw6CisJCQkqc3RkID0gVjRMMl9TVERfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJKnN0ZCA9IFY0TDJfU1REX05UU0M7CisJCQlicmVhazsKKwkJY2FzZSBWSURFT19NT0RFX1NFQ0FNOgorCQkJKnN0ZCA9IFY0TDJfU1REX1NFQ0FNOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQlpbnQgbm9ybSA9IC0xLCByZXMgPSAwOworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19TX1NURCAtIG5vcm09MHglbGx4XG4iLAorCQkJWlJfREVWTkFNRSh6ciksICh1bnNpZ25lZCBsb25nIGxvbmcpKnN0ZCk7CisKKwkJaWYgKCgqc3RkICYgVjRMMl9TVERfUEFMKSAmJiAhKCpzdGQgJiB+VjRMMl9TVERfUEFMKSkKKwkJCW5vcm0gPSBWSURFT19NT0RFX1BBTDsKKwkJZWxzZSBpZiAoKCpzdGQgJiBWNEwyX1NURF9OVFNDKSAmJiAhKCpzdGQgJiB+VjRMMl9TVERfTlRTQykpCisJCQlub3JtID0gVklERU9fTU9ERV9OVFNDOworCQllbHNlIGlmICgoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSAmJiAhKCpzdGQgJiB+VjRMMl9TVERfU0VDQU0pKQorCQkJbm9ybSA9IFZJREVPX01PREVfU0VDQU07CisJCWVsc2UgaWYgKCpzdGQgPT0gVjRMMl9TVERfQUxMKQorCQkJbm9ybSA9IFZJREVPX01PREVfQVVUTzsKKwkJZWxzZSB7CisJCQlkcHJpbnRrKDEsCisJCQkJS0VSTl9FUlIKKwkJCQkiJXM6IFZJRElPQ19TX1NURCAtIGludmFsaWQgbm9ybSAweCVsbHhcbiIsCisJCQkJWlJfREVWTkFNRSh6ciksICh1bnNpZ25lZCBsb25nIGxvbmcpKnN0ZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJaWYgKChyZXMgPSB6b3Jhbl9zZXRfbm9ybSh6ciwgbm9ybSkpKQorCQkJZ290byBzc3RkX3VubG9ja19hbmRfcmV0dXJuOworCisJCXJlcyA9IHdhaXRfZ3JhYl9wZW5kaW5nKHpyKTsKKwlzc3RkX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCXsKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmlucCA9IGFyZzsKKwkJaW50IHN0YXR1czsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTUlOUFVUIC0gaW5kZXg9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgaW5wLT5pbmRleCk7CisKKwkJaWYgKGlucC0+aW5kZXggPCAwIHx8IGlucC0+aW5kZXggPj0genItPmNhcmQuaW5wdXRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVsc2UgeworCQkJaW50IGlkID0gaW5wLT5pbmRleDsKKwkJCW1lbXNldChpbnAsIDAsIHNpemVvZigqaW5wKSk7CisJCQlpbnAtPmluZGV4ID0gaWQ7CisJCX0KKworCQlzdHJuY3B5KGlucC0+bmFtZSwgenItPmNhcmQuaW5wdXRbaW5wLT5pbmRleF0ubmFtZSwKKwkJCXNpemVvZihpbnAtPm5hbWUpIC0gMSk7CisJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJCWlucC0+c3RkID0gVjRMMl9TVERfQUxMOworCisJCS8qIEdldCBzdGF0dXMgb2YgdmlkZW8gZGVjb2RlciAqLworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKCEoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKKwkJCWlucC0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fUE9XRVI7CisJCQlpbnAtPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwkJfQorCQlpZiAoIShzdGF0dXMgJiBERUNPREVSX1NUQVRVU19DT0xPUikpCisJCQlpbnAtPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX0NPTE9SOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19HX0lOUFVUOgorCXsKKwkJaW50ICppbnB1dCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19JTlBVVFxuIiwgWlJfREVWTkFNRSh6cikpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJKmlucHV0ID0genItPmlucHV0OworCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwl7CisJCWludCAqaW5wdXQgPSBhcmcsIHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfSU5QVVQgLSBpbnB1dD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCAqaW5wdXQpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJaWYgKChyZXMgPSB6b3Jhbl9zZXRfaW5wdXQoenIsICppbnB1dCkpKQorCQkJZ290byBzaW5wdXRfdW5sb2NrX2FuZF9yZXR1cm47CisKKwkJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KKwkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOworCXNpbnB1dF91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0VOVU1PVVRQVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9vdXRwdXQgKm91dHAgPSBhcmc7CisKKwkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0VOVU1PVVRQVVQgLSBpbmRleD0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBvdXRwLT5pbmRleCk7CisKKwkJaWYgKG91dHAtPmluZGV4ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1zZXQob3V0cCwgMCwgc2l6ZW9mKCpvdXRwKSk7CisJCW91dHAtPmluZGV4ID0gMDsKKwkJb3V0cC0+dHlwZSA9IFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HVkdBT1ZFUkxBWTsKKwkJc3RybmNweShvdXRwLT5uYW1lLCAiQXV0b2RldGVjdCIsIHNpemVvZihvdXRwLT5uYW1lKS0xKTsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19PVVRQVVQ6CisJeworCQlpbnQgKm91dHB1dCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19PVVRQVVRcbiIsIFpSX0RFVk5BTUUoenIpKTsKKworCQkqb3V0cHV0ID0gMDsKKworCQlyZXR1cm4gMDsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19PVVRQVVQ6CisJeworCQlpbnQgKm91dHB1dCA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU19PVVRQVVQgLSBvdXRwdXQ9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKm91dHB1dCk7CisKKwkJaWYgKCpvdXRwdXQgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwkJLyogY3JvcHBpbmcgKHN1Yi1mcmFtZSBjYXB0dXJlKSAqLworCWNhc2UgVklESU9DX0NST1BDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwID0gYXJnOworCQlpbnQgdHlwZSA9IGNyb3BjYXAtPnR5cGUsIHJlcyA9IDA7CisKKwkJZHByaW50aygzLCBLRVJOX0VSUiAiJXM6IFZJRElPQ19DUk9QQ0FQIC0gdHlwZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjcm9wY2FwLT50eXBlKTsKKworCQltZW1zZXQoY3JvcGNhcCwgMCwgc2l6ZW9mKCpjcm9wY2FwKSk7CisJCWNyb3BjYXAtPnR5cGUgPSB0eXBlOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAmJgorCQkgICAgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCSAgICAgZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVykpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX0NST1BDQVAgLSBzdWJjYXB0dXJlIG9ubHkgc3VwcG9ydGVkIGZvciBjb21wcmVzc2VkIGNhcHR1cmVcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gY3JvcGNhcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSBjcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IEJVWl9NQVhfV0lEVEg7CisJCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSBCVVpfTUFYX0hFSUdIVDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSBjcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gQlVaX01JTl9XSURUSDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSBCVVpfTUlOX0hFSUdIVDsKKwljcm9wY2FwX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19DUk9QOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKKwkJaW50IHR5cGUgPSBjcm9wLT50eXBlLCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9FUlIgIiVzOiBWSURJT0NfR19DUk9QIC0gdHlwZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjcm9wLT50eXBlKTsKKworCQltZW1zZXQoY3JvcCwgMCwgc2l6ZW9mKCpjcm9wKSk7CisJCWNyb3AtPnR5cGUgPSB0eXBlOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAmJgorCQkgICAgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCSAgICAgZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVykpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogVklESU9DX0dfQ1JPUCAtIHN1YmNhcHR1cmUgb25seSBzdXBwb3J0ZWQgZm9yIGNvbXByZXNzZWQgY2FwdHVyZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBnY3JvcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWNyb3AtPmMudG9wID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfeTsKKwkJY3JvcC0+Yy5sZWZ0ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfeDsKKwkJY3JvcC0+Yy53aWR0aCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoOworCQljcm9wLT5jLmhlaWdodCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodDsKKworCWdjcm9wX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0NST1A6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCQlpbnQgcmVzID0gMDsKKworCQlzZXR0aW5ncyA9IGZoLT5qcGdfc2V0dGluZ3M7CisKKwkJZHByaW50aygzLAorCQkJS0VSTl9FUlIKKwkJCSIlczogVklESU9DX1NfQ1JPUCAtIHR5cGU9JWQsIHg9JWQseT0lZCx3PSVkLGg9JWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgY3JvcC0+dHlwZSwgY3JvcC0+Yy5sZWZ0LCBjcm9wLT5jLnRvcCwKKwkJCWNyb3AtPmMud2lkdGgsIGNyb3AtPmMuaGVpZ2h0KTsKKworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwgZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfU19DUk9QIC0gY2Fubm90IGNoYW5nZSBzZXR0aW5ncyB3aGlsZSBhY3RpdmVcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVCVVNZOworCQkJZ290byBzY3JvcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICYmCisJCSAgICAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJICAgICBmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfUkFXKSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBWSURJT0NfR19DUk9QIC0gc3ViY2FwdHVyZSBvbmx5IHN1cHBvcnRlZCBmb3IgY29tcHJlc3NlZCBjYXB0dXJlXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIHNjcm9wX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJLyogbW92ZSBpbnRvIGEgZm9ybSB0aGF0IHdlIHVuZGVyc3RhbmQgKi8KKwkJc2V0dGluZ3MuaW1nX3ggPSBjcm9wLT5jLmxlZnQ7CisJCXNldHRpbmdzLmltZ195ID0gY3JvcC0+Yy50b3A7CisJCXNldHRpbmdzLmltZ193aWR0aCA9IGNyb3AtPmMud2lkdGg7CisJCXNldHRpbmdzLmltZ19oZWlnaHQgPSBjcm9wLT5jLmhlaWdodDsKKworCQkvKiBjaGVjayB2YWxpZGl0eSAqLworCQlpZiAoKHJlcyA9IHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyh6ciwgJnNldHRpbmdzKSkpCisJCQlnb3RvIHNjcm9wX3VubG9ja19hbmRfcmV0dXJuOworCisJCS8qIGFjY2VwdCAqLworCQlmaC0+anBnX3NldHRpbmdzID0gc2V0dGluZ3M7CisKKwlzY3JvcF91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCXJldHVybiByZXM7CisJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfSlBFR0NPTVA6CisJeworCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcyA9IGFyZzsKKworCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19KUEVHQ09NUFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpKTsKKworCQltZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOworCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlwYXJhbXMtPnF1YWxpdHkgPSBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLnF1YWxpdHk7CisJCXBhcmFtcy0+QVBQbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQbjsKKwkJbWVtY3B5KHBhcmFtcy0+QVBQX2RhdGEsCisJCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLAorCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuKTsKKwkJcGFyYW1zLT5BUFBfbGVuID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuOworCQltZW1jcHkocGFyYW1zLT5DT01fZGF0YSwKKwkJICAgICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2RhdGEsCisJCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9sZW4pOworCQlwYXJhbXMtPkNPTV9sZW4gPSBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9sZW47CisJCXBhcmFtcy0+anBlZ19tYXJrZXJzID0KKwkJICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuanBlZ19tYXJrZXJzOworCisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0pQRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisJCWludCByZXMgPSAwOworCisJCXNldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHCisJCQkiJXM6IFZJRElPQ19TX0pQRUdDT01QIC0gcXVhbGl0eT0lZCwgQVBQTj0lZCwgQVBQX2xlbj0lZCwgQ09NX2xlbj0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBwYXJhbXMtPnF1YWxpdHksIHBhcmFtcy0+QVBQbiwKKwkJCXBhcmFtcy0+QVBQX2xlbiwgcGFyYW1zLT5DT01fbGVuKTsKKworCQlzZXR0aW5ncy5qcGdfY29tcCA9ICpwYXJhbXM7CisKKwkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUgfHwKKwkJICAgIGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fV0FSTklORworCQkJCSIlczogVklESU9DX1NfSlBFR0NPTVAgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSk7CisJCQlyZXMgPSAtRUJVU1k7CisJCQlnb3RvIHNqcGVnY191bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCisJCWlmICgocmVzID0gem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLCAmc2V0dGluZ3MpKSkKKwkJCWdvdG8gc2pwZWdjX3VubG9ja19hbmRfcmV0dXJuOworCQlpZiAoIWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQpCisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgPQorCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+anBnX3NldHRpbmdzKTsKKwkJZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcCA9ICpwYXJhbXMgPSBzZXR0aW5ncy5qcGdfY29tcDsKKwlzanBlZ2NfdW5sb2NrX2FuZF9yZXR1cm46CisJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19RVUVSWVNURDoJLyogd2h5IGlzIHRoaXMgdXNlZnVsPyAqLworCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKworCQlkcHJpbnRrKDMsCisJCQlLRVJOX0RFQlVHICIlczogVklESU9DX1FVRVJZX1NURCAtIHN0ZD0weCVsbHhcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKKworCQlpZiAoKnN0ZCA9PSBWNEwyX1NURF9BTEwgfHwgKnN0ZCA9PSBWNEwyX1NURF9OVFNDIHx8CisJCSAgICAqc3RkID09IFY0TDJfU1REX1BBTCB8fCAoKnN0ZCA9PSBWNEwyX1NURF9TRUNBTSAmJgorCQkJCQkgICAgIHpyLT5jYXJkLm5vcm1zID09IDMpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiAtRUlOVkFMOworCX0KKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19UUllfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7CisJCWludCByZXMgPSAwOworCisJCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19UUllfRk1UIC0gdHlwZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPnR5cGUpOworCisJCXN3aXRjaCAoZm10LT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQlpZiAoZm10LT5mbXQud2luLncud2lkdGggPiBCVVpfTUFYX1dJRFRIKQorCQkJCWZtdC0+Zm10Lndpbi53LndpZHRoID0gQlVaX01BWF9XSURUSDsKKwkJCWlmIChmbXQtPmZtdC53aW4udy53aWR0aCA8IEJVWl9NSU5fV0lEVEgpCisJCQkJZm10LT5mbXQud2luLncud2lkdGggPSBCVVpfTUlOX1dJRFRIOworCQkJaWYgKGZtdC0+Zm10Lndpbi53LmhlaWdodCA+IEJVWl9NQVhfSEVJR0hUKQorCQkJCWZtdC0+Zm10Lndpbi53LmhlaWdodCA9IEJVWl9NQVhfSEVJR0hUOworCQkJaWYgKGZtdC0+Zm10Lndpbi53LmhlaWdodCA8IEJVWl9NSU5fSEVJR0hUKQorCQkJCWZtdC0+Zm10Lndpbi53LmhlaWdodCA9IEJVWl9NSU5fSEVJR0hUOworCisJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQkJaWYgKGZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPiAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHKSB7CisJCQkJc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOworCisJCQkJLyogd2UgYWN0dWFsbHkgbmVlZCB0byBzZXQgJ3JlYWwnIHBhcmFtZXRlcnMgbm93ICovCisJCQkJaWYgKChmbXQtPmZtdC5waXguaGVpZ2h0ICogMikgPgorCQkJCSAgICBCVVpfTUFYX0hFSUdIVCkKKwkJCQkJc2V0dGluZ3MuVG1wRGNtID0gMTsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlRtcERjbSA9IDI7CisJCQkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IDA7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPD0KKwkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0IC8gMikKKwkJCQkJc2V0dGluZ3MuVmVyRGNtID0gMjsKKwkJCQllbHNlCisJCQkJCXNldHRpbmdzLlZlckRjbSA9IDE7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8PQorCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDQpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDQ7CisJCQkJZWxzZSBpZiAoZm10LT5mbXQucGl4LndpZHRoIDw9CisJCQkJCSBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDIpCisJCQkJCXNldHRpbmdzLkhvckRjbSA9IDI7CisJCQkJZWxzZQorCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSAxOworCQkJCWlmIChzZXR0aW5ncy5UbXBEY20gPT0gMSkKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAyOworCQkJCWVsc2UKKwkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAxOworCisJCQkJLyogY2hlY2sgKi8KKwkJCQlpZiAoKHJlcyA9CisJCQkJICAgICB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsCisJCQkJCQkJICAgICAgJnNldHRpbmdzKSkpCisJCQkJCWdvdG8gdHJ5Zm10X3VubG9ja19hbmRfcmV0dXJuOworCisJCQkJLyogdGVsbCB0aGUgdXNlciB3aGF0IHdlIGFjdHVhbGx5IGRpZCAqLworCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9CisJCQkJICAgIHNldHRpbmdzLmltZ193aWR0aCAvIHNldHRpbmdzLkhvckRjbTsKKwkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KKwkJCQkgICAgc2V0dGluZ3MuaW1nX2hlaWdodCAqIDIgLworCQkJCSAgICAoc2V0dGluZ3MuVG1wRGNtICogc2V0dGluZ3MuVmVyRGNtKTsKKwkJCQlpZiAoc2V0dGluZ3MuVG1wRGNtID09IDEpCisJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CisJCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KKwkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfU0VRX1RCIDoKKwkJCQkJICAgICBWNEwyX0ZJRUxEX1NFUV9CVCk7CisJCQkJZWxzZQorCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQorCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCisJCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1RPUCA6CisJCQkJCSAgICAgVjRMMl9GSUVMRF9CT1RUT00pOworCisJCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZzZXR0aW5ncyk7CisJCQl9IGVsc2UgaWYgKGZtdC0+dHlwZSA9PQorCQkJCSAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQkJCWludCBpOworCisJCQkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCisJCQkJCWlmICh6b3Jhbl9mb3JtYXRzW2ldLmZvdXJjYyA9PQorCQkJCQkgICAgZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KQorCQkJCQkJYnJlYWs7CisJCQkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKKwkJCQkJcmVzID0gLUVJTlZBTDsKKwkJCQkJZ290byB0cnlmbXRfdW5sb2NrX2FuZF9yZXR1cm47CisJCQkJfQorCisJCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA+IEJVWl9NQVhfV0lEVEgpCisJCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9IEJVWl9NQVhfV0lEVEg7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8IEJVWl9NSU5fV0lEVEgpCisJCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9IEJVWl9NSU5fV0lEVEg7CisJCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCkKKwkJCQkJZm10LT5mbXQucGl4LmhlaWdodCA9CisJCQkJCSAgICBCVVpfTUFYX0hFSUdIVDsKKwkJCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA8IEJVWl9NSU5fSEVJR0hUKQorCQkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KKwkJCQkJICAgIEJVWl9NSU5fSEVJR0hUOworCQkJfSBlbHNlIHsKKwkJCQlyZXMgPSAtRUlOVkFMOworCQkJCWdvdG8gdHJ5Zm10X3VubG9ja19hbmRfcmV0dXJuOworCQkJfQorCQl0cnlmbXRfdW5sb2NrX2FuZF9yZXR1cm46CisJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkJcmV0dXJuIHJlczsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsIEtFUk5fREVCVUcgIiVzOiBVTktOT1dOIGlvY3RsIGNtZDogMHgleFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50Cit6b3Jhbl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgIHN0cnVjdCBmaWxlICAqZmlsZSwKKwkgICAgIHVuc2lnbmVkIGludCAgY21kLAorCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgem9yYW5fZG9faW9jdGwpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit6b3Jhbl9wb2xsIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgcG9sbF90YWJsZSAgKndhaXQpCit7CisJc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOworCWludCByZXMgPSAwLCBmcmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogd2Ugc2hvdWxkIGNoZWNrIHdoZXRoZXIgYnVmZmVycyBhcmUgcmVhZHkgdG8gYmUgc3luY2VkIG9uCisJICogKHcvbyB3YWl0cyAtIE9fTk9OQkxPQ0spIGhlcmUKKwkgKiBpZiByZWFkeSBmb3IgcmVhZCAoc3luYyksIHJldHVybiBQT0xMSU58UE9MTFJETk9STSwKKwkgKiBpZiByZWFkeSBmb3Igd3JpdGUgKHN5bmMpLCByZXR1cm4gUE9MTE9VVHxQT0xMV1JOT1JNLAorCSAqIGlmIGVycm9yLCByZXR1cm4gUE9MTEVSUiwKKwkgKiBpZiBubyBidWZmZXJzIHF1ZXVlZCBvciBzbywgcmV0dXJuIFBPTExOVkFMCisJICovCisKKwltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCQlwb2xsX3dhaXQoZmlsZSwgJnpyLT52NGxfY2FwcSwgd2FpdCk7CisJCWZyYW1lID0genItPnY0bF9wZW5kW3pyLT52NGxfc3luY190YWlsICYgVjRMX01BU0tfRlJBTUVdOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiAlcygpIHJhdyAtIGFjdGl2ZT0lYywgc3luY190YWlsPSVsdS8lYywgcGVuZF90YWlsPSVsdSwgcGVuZF9oZWFkPSVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBfX2Z1bmNfXywKKwkJCSJGQUwiW2ZoLT52NGxfYnVmZmVycy5hY3RpdmVdLCB6ci0+djRsX3N5bmNfdGFpbCwKKwkJCSJVUE1EIlt6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZV0sCisJCQl6ci0+djRsX3BlbmRfdGFpbCwgenItPnY0bF9wZW5kX2hlYWQpOworCQkvKiBQcm9jZXNzIGlzIHRoZSBvbmUgY2FwdHVyaW5nPyAqLworCQlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCisJCSAgICAvKiBCdWZmZXIgcmVhZHkgdG8gRFFCVUY/ICovCisJCSAgICB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9PSBCVVpfU1RBVEVfRE9ORSkKKwkJCXJlcyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCisJCWJyZWFrOworCisJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgorCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisJCXBvbGxfd2FpdChmaWxlLCAmenItPmpwZ19jYXBxLCB3YWl0KTsKKwkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19xdWVfdGFpbCAmIEJVWl9NQVNLX0ZSQU1FXTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogJXMoKSBqcGcgLSBhY3RpdmU9JWMsIHF1ZV90YWlsPSVsdS8lYywgcXVlX2hlYWQ9JWx1LCBkbWE9JWx1LyVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBfX2Z1bmNfXywKKwkJCSJGQUwiW2ZoLT5qcGdfYnVmZmVycy5hY3RpdmVdLCB6ci0+anBnX3F1ZV90YWlsLAorCQkJIlVQTUQiW3pyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlXSwKKwkJCXpyLT5qcGdfcXVlX2hlYWQsIHpyLT5qcGdfZG1hX3RhaWwsIHpyLT5qcGdfZG1hX2hlYWQpOworCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCisJCSAgICB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9PSBCVVpfU1RBVEVfRE9ORSkgeworCQkJaWYgKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDKQorCQkJCXJlcyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCQllbHNlCisJCQkJcmVzID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6b3Jhbl9wb2xsKCkgLSBpbnRlcm5hbCBlcnJvciwgdW5rbm93biBtYXBfbW9kZT0lZFxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBmaC0+bWFwX21vZGUpOworCQlyZXMgPSBQT0xMTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKKworLyoKKyAqIFRoaXMgbWFwcyB0aGUgYnVmZmVycyB0byB1c2VyIHNwYWNlLgorICoKKyAqIERlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgZmgtPm1hcF9tb2RlCisgKiB0aGUgVjRMIG9yIHRoZSBNSlBFRyBidWZmZXJzIGFyZSBtYXBwZWQKKyAqIHBlciBidWZmZXIgb3IgYWxsIHRvZ2V0aGVyCisgKgorICogTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29ubmVjdCB0byBzb21lCisgKiB1bm1hcCBzaWduYWwgZXZlbnQgdG8gdW5tYXAgdGhlIGRlLWFsbG9jYXRlCisgKiB0aGUgYnVmZmVyIGFjY29yZGluZ2x5ICh6b3Jhbl92bV9jbG9zZSgpKQorICovCisKK3N0YXRpYyB2b2lkCit6b3Jhbl92bV9vcGVuIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgem9yYW5fbWFwcGluZyAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwltYXAtPmNvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCit6b3Jhbl92bV9jbG9zZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHpvcmFuX21hcHBpbmcgKm1hcCA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaWxlICpmaWxlID0gbWFwLT5maWxlOworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwlpbnQgaTsKKworCW1hcC0+Y291bnQtLTsKKwlpZiAobWFwLT5jb3VudCA9PSAwKSB7CisJCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7CisJCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKKwkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKKworCQkJZHByaW50aygzLCBLRVJOX0lORk8gIiVzOiBtdW5tYXAoTUpQRUcpXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0ubWFwID09IG1hcCkgeworCQkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCA9CisJCQkJCSAgICBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWtmcmVlKG1hcCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykKKwkJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5tYXApCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzKSB7CisJCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOworCisJCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgeworCQkJCQlqcGdfcWJ1ZihmaWxlLCAtMSwgenItPmNvZGVjX21vZGUpOworCQkJCQl6ci0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCQkJenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9CisJCQkJCSAgICBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0KKwkJCQkJICAgIFpPUkFOX0ZSRUU7CisJCQkJfQorCQkJCS8vanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKKwkJCQlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKKwkJCQlmaC0+anBnX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQgPSAxOworCisJCQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCisJCQlkcHJpbnRrKDMsIEtFUk5fSU5GTyAiJXM6IG11bm1hcChWNEwpXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKSB7CisJCQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwID09IG1hcCkgeworCQkJCQkvKiB1bnF1ZXVlL3VubWFwICovCisJCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwID0KKwkJCQkJICAgIE5VTEw7CisJCQkJfQorCQkJfQorCQkJa2ZyZWUobWFwKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKQorCQkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMpIHsKKwkJCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJCQlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCQkJCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKKwkJCQkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CisJCQkJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPQorCQkJCQkgICAgZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9CisJCQkJCSAgICBaT1JBTl9GUkVFOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJCQl9CisJCQkJLy92NGxfZmJ1ZmZlcl9mcmVlKGZpbGUpOworCQkJCWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOworCQkJCWZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDE7CisKKwkJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogbXVubWFwKCkgLSBpbnRlcm5hbCBlcnJvciAtIHVua25vd24gbWFwIG1vZGUgJWRcbiIsCisJCQkgICAgICAgWlJfREVWTkFNRSh6ciksIGZoLT5tYXBfbW9kZSk7CisJCQlicmVhazsKKworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHpvcmFuX3ZtX29wcyA9IHsKKwkub3BlbiA9IHpvcmFuX3ZtX29wZW4sCisJLmNsb3NlID0gem9yYW5fdm1fY2xvc2UsCit9OworCitzdGF0aWMgaW50Cit6b3Jhbl9tbWFwIChzdHJ1Y3QgZmlsZSAgICAgICAgICAgKmZpbGUsCisJICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIHBhZ2UsIHN0YXJ0ID0gdm1hLT52bV9zdGFydCwgdG9kbywgcG9zLCBmcmFnbGVuOworCWludCBmaXJzdCwgbGFzdDsKKwlzdHJ1Y3Qgem9yYW5fbWFwcGluZyAqbWFwOworCWludCByZXMgPSAwOworCisJZHByaW50aygzLAorCQlLRVJOX0lORk8gIiVzOiBtbWFwKCVzKSBvZiAweCUwOGx4LTB4JTA4bHggKHNpemU9JWx1KVxuIiwKKwkJWlJfREVWTkFNRSh6ciksCisJCWZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcgPyAiVjRMIiA6ICJNSlBFRyIsCisJCXZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBzaXplKTsKKworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpIHx8ICEodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHx8CisJICAgICEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkgeworCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiBtbWFwKCkgLSBubyBNQVBfU0hBUkVEL1BST1Rfe1JFQUQsV1JJVEV9IGdpdmVuXG4iLAorCQkJWlJfREVWTkFNRSh6cikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgeworCisJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgorCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6CisKKwkJLyogbG9jayAqLworCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJLyogTWFwIHRoZSBNSlBFRyBidWZmZXJzICovCisJCWlmICghZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB6b3Jhbl9tbWFwKE1KUEVHKSAtIGJ1ZmZlcnMgbm90IHlldCBhbGxvY2F0ZWRcbiIsCisJCQkJWlJfREVWTkFNRSh6cikpOworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8ganBnX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKworCQlmaXJzdCA9IG9mZnNldCAvIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJbGFzdCA9IGZpcnN0IC0gMSArIHNpemUgLyBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCWlmIChvZmZzZXQgJSBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgIT0gMCB8fAorCQkgICAgc2l6ZSAlIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAhPSAwIHx8IGZpcnN0IDwgMCB8fAorCQkgICAgbGFzdCA8IDAgfHwgZmlyc3QgPj0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzIHx8CisJCSAgICBsYXN0ID49IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycykgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiBtbWFwKE1KUEVHKSAtIG9mZnNldD0lbHUgb3Igc2l6ZT0lbHUgaW52YWxpZCBmb3IgYnVmc2l6ZT0lZCBhbmQgbnVtYnVmcz0lZFxuIiwKKwkJCQlaUl9ERVZOQU1FKHpyKSwgb2Zmc2V0LCBzaXplLAorCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSwKKwkJCQlmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8ganBnX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47CisJCX0KKwkJZm9yIChpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CisJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5tYXApIHsKKwkJCQlkcHJpbnRrKDEsCisJCQkJCUtFUk5fRVJSCisJCQkJCSIlczogbW1hcChNSlBFRykgLSBidWZmZXIgJWQgYWxyZWFkeSBtYXBwZWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBpKTsKKwkJCQlyZXMgPSAtRUJVU1k7CisJCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIG1hcCB0aGVzZSBidWZmZXJzICh2NGxfYnVmZmVyc1tpXSkgKi8KKwkJbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuX21hcHBpbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtYXApIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIGpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJCW1hcC0+ZmlsZSA9IGZpbGU7CisJCW1hcC0+Y291bnQgPSAxOworCisJCXZtYS0+dm1fb3BzID0gJnpvcmFuX3ZtX29wczsKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9ET05URVhQQU5EOworCQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IG1hcDsKKworCQlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCWZvciAoaiA9IDA7CisJCQkgICAgIGogPCBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7CisJCQkgICAgIGorKykgeworCQkJCWZyYWdsZW4gPQorCQkJCSAgICAobGUzMl90b19jcHUoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS4KKwkJCQkgICAgIGZyYWdfdGFiWzIgKiBqICsgMV0pICYgfjEpIDw8IDE7CisJCQkJdG9kbyA9IHNpemU7CisJCQkJaWYgKHRvZG8gPiBmcmFnbGVuKQorCQkJCQl0b2RvID0gZnJhZ2xlbjsKKwkJCQlwb3MgPQorCQkJCSAgICBsZTMyX3RvX2NwdShmaC0+anBnX2J1ZmZlcnMuCisJCQkJICAgIGJ1ZmZlcltpXS5mcmFnX3RhYlsyICogal0pOworCQkJCS8qIHNob3VsZCBqdXN0IGJlIHBvcyBvbiBpMzg2ICovCisJCQkJcGFnZSA9IHZpcnRfdG9fcGh5cyhidXNfdG9fdmlydChwb3MpKQorCQkJCQkJCQk+PiBQQUdFX1NISUZUOworCQkJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwKKwkJCQkJCQl0b2RvLCBQQUdFX1NIQVJFRCkpIHsKKwkJCQkJZHByaW50aygxLAorCQkJCQkJS0VSTl9FUlIKKwkJCQkJCSIlczogem9yYW5fbW1hcChWNEwpIC0gcmVtYXBfcGZuX3JhbmdlIGZhaWxlZFxuIiwKKwkJCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCQkJcmVzID0gLUVBR0FJTjsKKwkJCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJCQl9CisJCQkJc2l6ZSAtPSB0b2RvOworCQkJCXN0YXJ0ICs9IHRvZG87CisJCQkJaWYgKHNpemUgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGxlMzJfdG9fY3B1KGZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uCisJCQkJICAgIGZyYWdfdGFiWzIgKiBqICsgMV0pICYgMSkKKwkJCQkJYnJlYWs7CS8qIHdhcyBsYXN0IGZyYWdtZW50ICovCisJCQl9CisJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCA9IG1hcDsKKwkJCWlmIChzaXplID09IDApCisJCQkJYnJlYWs7CisKKwkJfQorCWpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOgorCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgorCisJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKKworCQkvKiBNYXAgdGhlIFY0TCBidWZmZXJzICovCisJCWlmICghZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgeworCQkJZHByaW50aygxLAorCQkJCUtFUk5fRVJSCisJCQkJIiVzOiB6b3Jhbl9tbWFwKFY0TCkgLSBidWZmZXJzIG5vdCB5ZXQgYWxsb2NhdGVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpKTsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisKKwkJZmlyc3QgPSBvZmZzZXQgLyBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7CisJCWxhc3QgPSBmaXJzdCAtIDEgKyBzaXplIC8gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQlpZiAob2Zmc2V0ICUgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplICE9IDAgfHwKKwkJICAgIHNpemUgJSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgIT0gMCB8fCBmaXJzdCA8IDAgfHwKKwkJICAgIGxhc3QgPCAwIHx8IGZpcnN0ID49IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyB8fAorCQkgICAgbGFzdCA+PSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUpIHsKKwkJCWRwcmludGsoMSwKKwkJCQlLRVJOX0VSUgorCQkJCSIlczogbW1hcChWNEwpIC0gb2Zmc2V0PSVsdSBvciBzaXplPSVsdSBpbnZhbGlkIGZvciBidWZzaXplPSVkIGFuZCBudW1idWZzPSVkXG4iLAorCQkJCVpSX0RFVk5BTUUoenIpLCBvZmZzZXQsIHNpemUsCisJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplLAorCQkJCWZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byB2NGxfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJfQorCQlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiBtbWFwKFY0TCkgLSBidWZmZXIgJWQgYWxyZWFkeSBtYXBwZWRcbiIsCisJCQkJCVpSX0RFVk5BTUUoenIpLCBpKTsKKwkJCQlyZXMgPSAtRUJVU1k7CisJCQkJZ290byB2NGxfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIG1hcCB0aGVzZSBidWZmZXJzICh2NGxfYnVmZmVyc1tpXSkgKi8KKwkJbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuX21hcHBpbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtYXApIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOworCQl9CisJCW1hcC0+ZmlsZSA9IGZpbGU7CisJCW1hcC0+Y291bnQgPSAxOworCisJCXZtYS0+dm1fb3BzID0gJnpvcmFuX3ZtX29wczsKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9ET05URVhQQU5EOworCQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IG1hcDsKKworCQlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXRvZG8gPSBzaXplOworCQkJaWYgKHRvZG8gPiBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUpCisJCQkJdG9kbyA9IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKKwkJCXBhZ2UgPSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXJfcGh5czsKKwkJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSA+PiBQQUdFX1NISUZULAorCQkJCQkJCXRvZG8sIFBBR0VfU0hBUkVEKSkgeworCQkJCWRwcmludGsoMSwKKwkJCQkJS0VSTl9FUlIKKwkJCQkJIiVzOiB6b3Jhbl9tbWFwKFY0TClpIC0gcmVtYXBfcGZuX3JhbmdlIGZhaWxlZFxuIiwKKwkJCQkJWlJfREVWTkFNRSh6cikpOworCQkJCXJlcyA9IC1FQUdBSU47CisJCQkJZ290byB2NGxfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKKwkJCX0KKwkJCXNpemUgLT0gdG9kbzsKKwkJCXN0YXJ0ICs9IHRvZG87CisJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCA9IG1hcDsKKwkJCWlmIChzaXplID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl2NGxfbW1hcF91bmxvY2tfYW5kX3JldHVybjoKKwkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkcHJpbnRrKDEsCisJCQlLRVJOX0VSUgorCQkJIiVzOiB6b3Jhbl9tbWFwKCkgLSBpbnRlcm5hbCBlcnJvciAtIHVua25vd24gbWFwIG1vZGUgJWRcbiIsCisJCQlaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpvcmFuX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB6b3Jhbl9vcGVuLAorCS5yZWxlYXNlID0gem9yYW5fY2xvc2UsCisJLmlvY3RsID0gem9yYW5faW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCisjZW5kaWYKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5yZWFkID0gem9yYW5fcmVhZCwKKwkud3JpdGUgPSB6b3Jhbl93cml0ZSwKKwkubW1hcCA9IHpvcmFuX21tYXAsCisJLnBvbGwgPSB6b3Jhbl9wb2xsLAorfTsKKworc3RydWN0IHZpZGVvX2RldmljZSB6b3Jhbl90ZW1wbGF0ZSBfX2RldmluaXRkYXRhID0geworCS5uYW1lID0gWk9SQU5fTkFNRSwKKwkuZm9wcyA9ICZ6b3Jhbl9mb3BzLAorCS5yZWxlYXNlID0gJnpvcmFuX3ZkZXZfcmVsZWFzZSwKKwkubWlub3IgPSAtMQorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fcHJvY2ZzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fcHJvY2ZzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX3Byb2Nmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX3Byb2Nmcy5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX3Byb2Nmcy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjAxNi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwMTYuYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDE2LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjAxNi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDE2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdmlkZW8venIzNjAxNi5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pyMzYwMTYuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pyMzYwNTAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDUwLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA1MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA1MC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNTAuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDUwLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1Ny5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDU3LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdmlkZW8venIzNjA1Ny5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pyMzYwNTcuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDYwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pyMzYwNjAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS92aWRlby96cjM2MDYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA2MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNjAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4venIzNjA2MC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYwNjAuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96cjM2MDYwLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NDJhN2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcwICswLDAgQEAKLS8qCi0gKiBab3JhbiB6cjM2MDU3L3pyMzYwNjcgUENJIGNvbnRyb2xsZXIgZHJpdmVyLCBmb3IgdGhlCi0gKiBQaW5uYWNsZS9NaXJvIERDMTAvREMxMCsvREMzMC9EQzMwKywgSW9tZWdhIEJ1eiwgTGludXgKLSAqIE1lZGlhIExhYnMgTE1MMzMvTE1MMzNSMTAuCi0gKgotICogVGhpcyBwYXJ0IGhhbmRsZXMgY2FyZC1zcGVjaWZpYyBkYXRhIGFuZCBkZXRlY3Rpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2VyZ3VlaSBNaXJpZG9ub3YgPG1pcnNldkBjaWNlc2UubXg+Ci0gKgotICogQ3VycmVudGx5IG1haW50YWluZWQgYnk6Ci0gKiAgIFJvbmFsZCBCdWx0amUgICAgPHJidWx0amVAcm9uYWxkLmJpdGZyZWFrLm5ldD4KLSAqICAgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+Ci0gKiAgIE1haWxpbmdsaXN0ICAgICAgPG1qcGVnLXVzZXJzQGxpc3RzLnNmLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2VuY29kZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJ2aWRlb2NvZGVjLmgiCi0jaW5jbHVkZSAiem9yYW4uaCIKLSNpbmNsdWRlICJ6b3Jhbl9jYXJkLmgiCi0jaW5jbHVkZSAiem9yYW5fZGV2aWNlLmgiCi0jaW5jbHVkZSAiem9yYW5fcHJvY2ZzLmgiCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0IHpvcmFuX2Zvcm1hdHNbXTsKLQotc3RhdGljIGludCBjYXJkW0JVWl9NQVhdID0geyAtMSwgLTEsIC0xLCAtMSB9OwotbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNhcmQsICJUaGUgdHlwZSBvZiBjYXJkIik7Ci0KLXN0YXRpYyBpbnQgZW5jb2RlcltCVVpfTUFYXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKLW1vZHVsZV9wYXJhbV9hcnJheShlbmNvZGVyLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmNvZGVyLCAiaTJjIFRWIGVuY29kZXIiKTsKLQotc3RhdGljIGludCBkZWNvZGVyW0JVWl9NQVhdID0geyAtMSwgLTEsIC0xLCAtMSB9OwotbW9kdWxlX3BhcmFtX2FycmF5KGRlY29kZXIsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlY29kZXIsICJpMmMgVFYgZGVjb2RlciIpOwotCi0vKgotICAgVGhlIHZpZGVvIG1lbSBhZGRyZXNzIG9mIHRoZSB2aWRlbyBjYXJkLgotICAgVGhlIGRyaXZlciBoYXMgYSBsaXR0bGUgZGF0YWJhc2UgZm9yIHNvbWUgdmlkZW9jYXJkcwotICAgdG8gZGV0ZXJtaW5lIGl0IGZyb20gdGhlcmUuIElmIHlvdXIgdmlkZW8gY2FyZCBpcyBub3QgaW4gdGhlcmUKLSAgIHlvdSBoYXZlIGVpdGhlciB0byBnaXZlIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBwYXJhbWV0ZXIKLSAgIG9yIHNldCBpbiBpbiBhIFZJRElPQ1NGQlVGIGlvY3RsCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdmlkbWVtOwkvKiBkZWZhdWx0ID0gMCAtIFZpZGVvIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLW1vZHVsZV9wYXJhbSh2aWRtZW0sIHVsb25nLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkbWVtLCAiRGVmYXVsdCB2aWRlbyBtZW1vcnkgYmFzZSBhZGRyZXNzIik7Ci0KLS8qCi0gICBEZWZhdWx0IGlucHV0IGFuZCB2aWRlbyBub3JtIGF0IHN0YXJ0dXAgb2YgdGhlIGRyaXZlci4KLSovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF9pbnB1dDsJLyogZGVmYXVsdCAwID0gQ29tcG9zaXRlLCAxID0gUy1WaWRlbyAqLwotbW9kdWxlX3BhcmFtKGRlZmF1bHRfaW5wdXQsIHVpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X2lucHV0LAotCQkgIkRlZmF1bHQgaW5wdXQgKDA9Q29tcG9zaXRlLCAxPVMtVmlkZW8sIDI9SW50ZXJuYWwpIik7Ci0KLXN0YXRpYyBpbnQgZGVmYXVsdF9tdXggPSAxOwkvKiA2IEV5ZXMgaW5wdXQgc2VsZWN0aW9uICovCi1tb2R1bGVfcGFyYW0oZGVmYXVsdF9tdXgsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfbXV4LAotCQkgIkRlZmF1bHQgNiBFeWVzIG11eCBzZXR0aW5nIChJbnB1dCBzZWxlY3Rpb24pIik7Ci0KLXN0YXRpYyBpbnQgZGVmYXVsdF9ub3JtOwkvKiBkZWZhdWx0IDAgPSBQQUwsIDEgPSBOVFNDIDIgPSBTRUNBTSAqLwotbW9kdWxlX3BhcmFtKGRlZmF1bHRfbm9ybSwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVmYXVsdF9ub3JtLCAiRGVmYXVsdCBub3JtICgwPVBBTCwgMT1OVFNDLCAyPVNFQ0FNKSIpOwotCi0vKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KLXN0YXRpYyBpbnQgdmlkZW9fbnJbQlVaX01BWF0gPSB7LTEsIC0xLCAtMSwgLTF9OwotbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwgInZpZGVvIGRldmljZSBudW1iZXIgKC0xPUF1dG8pIik7Ci0KLS8qCi0gICBOdW1iZXIgYW5kIHNpemUgb2YgZ3JhYiBidWZmZXJzIGZvciBWaWRlbyA0IExpbnV4Ci0gICBUaGUgdmFzdCBtYWpvcml0eSBvZiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBuZWVkIG1vcmUgdGhhbiAyLAotICAgdGhlIHZlcnkgcG9wdWxhciBCVFRWIGRyaXZlciBhY3R1YWxseSBkb2VzIE9OTFkgaGF2ZSAyLgotICAgVGltZSBzZW5zaXRpdmUgYXBwbGljYXRpb25zIG1pZ2h0IG5lZWQgbW9yZSwgdGhlIG1heGltdW0KLSAgIGlzIFZJREVPX01BWF9GUkFNRSAoZGVmaW5lZCBpbiA8bGludXgvdmlkZW9kZXYuaD4pLgotCi0gICBUaGUgc2l6ZSBpcyBzZXQgc28gdGhhdCB0aGUgbWF4aW11bSBwb3NzaWJsZSByZXF1ZXN0Ci0gICBjYW4gYmUgc2F0aXNmaWVkLiBEZWNyZWFzZSAgaXQsIGlmIGJpZ3BoeXNfYXJlYSBhbGxvYydkCi0gICBtZW1vcnkgaXMgbG93LiBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgYmlncGh5c19hcmVhIHBhdGNoLAotICAgc2V0IGl0IHRvIDEyOCBLQi4gV2lsbCB5b3UgYWxsb3cgb25seSB0byBncmFiIHNtYWxsCi0gICBpbWFnZXMgd2l0aCBWNEwsIGJ1dCB0aGF0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KLQotICAgdjRsX2J1ZnNpemUgaGFzIHRvIGJlIGdpdmVuIGluIEtCICEKLQotKi8KLQotaW50IHY0bF9uYnVmcyA9IDI7Ci1pbnQgdjRsX2J1ZnNpemUgPSAxMjg7CQkvKiBFdmVyeWJvZHkgc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRoIHRoaXMgc2V0dGluZyAqLwotbW9kdWxlX3BhcmFtKHY0bF9uYnVmcywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModjRsX25idWZzLCAiTWF4aW11bSBudW1iZXIgb2YgVjRMIGJ1ZmZlcnMgdG8gdXNlIik7Ci1tb2R1bGVfcGFyYW0odjRsX2J1ZnNpemUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHY0bF9idWZzaXplLCAiTWF4aW11bSBzaXplIHBlciBWNEwgYnVmZmVyIChpbiBrQikiKTsKLQotaW50IGpwZ19uYnVmcyA9IDMyOwotaW50IGpwZ19idWZzaXplID0gNTEyOwkJLyogbWF4IHNpemUgZm9yIDEwMCUgcXVhbGl0eSBmdWxsLVBBTCBmcmFtZSAqLwotbW9kdWxlX3BhcmFtKGpwZ19uYnVmcywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoanBnX25idWZzLCAiTWF4aW11bSBudW1iZXIgb2YgSlBHIGJ1ZmZlcnMgdG8gdXNlIik7Ci1tb2R1bGVfcGFyYW0oanBnX2J1ZnNpemUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGpwZ19idWZzaXplLCAiTWF4aW11bSBzaXplIHBlciBKUEcgYnVmZmVyIChpbiBrQikiKTsKLQotaW50IHBhc3NfdGhyb3VnaCA9IDA7CQkvKiAxPVBhc3MgdGhyb3VnaCBUViBzaWduYWwgd2hlbiBkZXZpY2UgaXMgbm90IHVzZWQgKi8KLQkJCQkvKiAwPVNob3cgY29sb3IgYmFyIHdoZW4gZGV2aWNlIGlzIG5vdCB1c2VkIChMTUwzMzogb25seSBpZiBsbWwzM2RwYXRoPTEpICovCi1tb2R1bGVfcGFyYW0ocGFzc190aHJvdWdoLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwYXNzX3Rocm91Z2gsCi0JCSAiUGFzcyBUViBzaWduYWwgdGhyb3VnaCB0byBUVi1vdXQgd2hlbiBpZGxpbmciKTsKLQotaW50IHpyMzYwNjdfZGVidWcgPSAxOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB6cjM2MDY3X2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTUpIik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiWm9yYW4tMzYwNTcvMzYwNjcgSlBFRyBjb2RlYyBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlNlcmd1ZWkgTWlyaWRvbm92Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB6cjM2MDY3X3BjaV90YmxbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9aT1JBTiwgUENJX0RFVklDRV9JRF9aT1JBTl8zNjA1NywKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCi0JezB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHpyMzYwNjdfcGNpX3RibCk7Ci0KLWludCB6b3Jhbl9udW07CQkJLyogbnVtYmVyIG9mIEJ1enMgaW4gdXNlICovCi1zdHJ1Y3Qgem9yYW4gKnpvcmFuW0JVWl9NQVhdOwotCi0vKiB2aWRlb2NvZGVjIGJ1cyBmdW5jdGlvbnMgWlIzNjA2MCAqLwotc3RhdGljIHUzMgotenIzNjA2MF9yZWFkIChzdHJ1Y3QgdmlkZW9jb2RlYyAqY29kZWMsCi0JICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZykKLXsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7Ci0JX191MzIgZGF0YTsKLQotCWlmIChwb3N0X29mZmljZV93YWl0KHpyKQotCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgMSwgcmVnID4+IDgpCi0JICAgIHx8IHBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAyLCByZWcgJiAweGZmKSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGF0YSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDAsIDMpICYgMHhmZjsKLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLXpyMzYwNjBfd3JpdGUgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKLQkgICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZywKLQkgICAgICAgdTMyICAgICAgICAgICAgICAgIHZhbCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7Ci0KLQlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikKLQkgICAgfHwgcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDEsIHJlZyA+PiA4KQotCSAgICB8fCBwb3N0X29mZmljZV93cml0ZSh6ciwgMCwgMiwgcmVnICYgMHhmZikpIHsKLQkJcmV0dXJuOwotCX0KLQotCXBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAwLCAzLCB2YWwgJiAweGZmKTsKLX0KLQotLyogdmlkZW9jb2RlYyBidXMgZnVuY3Rpb25zIFpSMzYwNTAgKi8KLXN0YXRpYyB1MzIKLXpyMzYwNTBfcmVhZCAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAotCSAgICAgIHUxNiAgICAgICAgICAgICAgICByZWcpCi17Ci0Jc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgY29kZWMtPm1hc3Rlcl9kYXRhLT5kYXRhOwotCV9fdTMyIGRhdGE7Ci0KLQlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikKLQkgICAgfHwgcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDEsIDAsIHJlZyA+PiAyKSkgewkvLyByZWcuIEhJR0hCWVRFUwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGF0YSA9IHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDAsIHJlZyAmIDB4MDMpICYgMHhmZjsJLy8gcmVnLiBMT1dCWVRFUyArIHJlYWQKLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQKLXpyMzYwNTBfd3JpdGUgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKLQkgICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZywKLQkgICAgICAgdTMyICAgICAgICAgICAgICAgIHZhbCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7Ci0KLQlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikKLQkgICAgfHwgcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDEsIDAsIHJlZyA+PiAyKSkgewkvLyByZWcuIEhJR0hCWVRFUwotCQlyZXR1cm47Ci0JfQotCi0JcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIHJlZyAmIDB4MDMsIHZhbCAmIDB4ZmYpOwkvLyByZWcuIExPV0JZVEVTICsgd3IuIGRhdGEKLX0KLQotLyogdmlkZW9jb2RlYyBidXMgZnVuY3Rpb25zIFpSMzYwMTYgKi8KLXN0YXRpYyB1MzIKLXpyMzYwMTZfcmVhZCAoc3RydWN0IHZpZGVvY29kZWMgKmNvZGVjLAotCSAgICAgIHUxNiAgICAgICAgICAgICAgICByZWcpCi17Ci0Jc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgY29kZWMtPm1hc3Rlcl9kYXRhLT5kYXRhOwotCV9fdTMyIGRhdGE7Ci0KLQlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWRhdGEgPSBwb3N0X29mZmljZV9yZWFkKHpyLCAyLCByZWcgJiAweDAzKSAmIDB4ZmY7CS8vIHJlYWQKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyogaGFjayBmb3IgaW4gem9yYW5fZGV2aWNlLmMgKi8KLXZvaWQKLXpyMzYwMTZfd3JpdGUgKHN0cnVjdCB2aWRlb2NvZGVjICpjb2RlYywKLQkgICAgICAgdTE2ICAgICAgICAgICAgICAgIHJlZywKLQkgICAgICAgdTMyICAgICAgICAgICAgICAgIHZhbCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBjb2RlYy0+bWFzdGVyX2RhdGEtPmRhdGE7Ci0KLQlpZiAocG9zdF9vZmZpY2Vfd2FpdCh6cikpIHsKLQkJcmV0dXJuOwotCX0KLQotCXBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCAyLCByZWcgJiAweDAzLCB2YWwgJiAweDBmZik7CS8vIHdyLiBkYXRhCi19Ci0KLS8qCi0gKiBCb2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICovCi0KLXN0YXRpYyB2b2lkCi1kYzEwX2luaXQgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogZGMxMF9pbml0KClcbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCS8qIFBpeGVsIGNsb2NrIHNlbGVjdGlvbiAqLwotCUdQSU8oenIsIDQsIDApOwotCUdQSU8oenIsIDUsIDEpOwotCS8qIEVuYWJsZSB0aGUgdmlkZW8gYnVzIHN5bmMgc2lnbmFscyAqLwotCUdQSU8oenIsIDcsIDApOwotfQotCi1zdGF0aWMgdm9pZAotZGMxMHBsdXNfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKLXsKLQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBkYzEwcGx1c19pbml0KClcbiIsIFpSX0RFVk5BTUUoenIpKTsKLX0KLQotc3RhdGljIHZvaWQKLWJ1el9pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IGJ1el9pbml0KClcbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCS8qIHNvbWUgc3R1ZmYgZnJvbSBJb21lZ2EgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHpyLT5wY2lfZGV2LCAweGZjLCAweDkwNjgwZjE1KTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHpyLT5wY2lfZGV2LCAweDBjLCAweDAwMDEyMDIwKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHpyLT5wY2lfZGV2LCAweGU4LCAweGMwMjAwMDAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWxtbDMzX2luaXQgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogbG1sMzNfaW5pdCgpXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQlHUElPKHpyLCAyLCAxKTsJCS8vIFNldCBDb21wb3NpdGUgaW5wdXQvb3V0cHV0Ci19Ci0KLXN0YXRpYyB2b2lkCi1hdnM2ZXllc19pbml0IChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCS8vIEF2ZXJNZWRpYSA2LUV5ZXMgb3JpZ2luYWwgZHJpdmVyIGJ5IENocmlzdGVyIFdlaW5pZ2VsCi0KLQkvLyBMaWZ0ZWQgc3RyYWlnaHQgZnJvbSBDaHJpc3RlcidzIG9sZCBkcml2ZXIgYW5kCi0JLy8gbW9kaWZpZWQgc2xpZ2h0bHkgYnkgTWFydGluIFNhbXVlbHNzb24uCi0KLQlpbnQgbXV4ID0gZGVmYXVsdF9tdXg7IC8qIDEgPSBCVDg2NiwgNyA9IFZJRDEgKi8KLQotCUdQSU8oenIsIDQsIDEpOyAvKiBCdDg2NiBTTEVFUCBvbiAqLwotCXVkZWxheSgyKTsKLQotCUdQSU8oenIsIDAsIDEpOyAvKiBaUjM2MDYwIC9SRVNFVCBvbiAqLwotCUdQSU8oenIsIDEsIDApOyAvKiBaUjM2MDYwIC9TTEVFUCBvbiAqLwotCUdQSU8oenIsIDIsIG11eCAmIDEpOyAgIC8qIE1VWCBTMCAqLwotCUdQSU8oenIsIDMsIDApOyAvKiAvRlJBTUUgb24gKi8KLQlHUElPKHpyLCA0LCAwKTsgLyogQnQ4NjYgU0xFRVAgb2ZmICovCi0JR1BJTyh6ciwgNSwgbXV4ICYgMik7ICAgLyogTVVYIFMxICovCi0JR1BJTyh6ciwgNiwgMCk7IC8qID8gKi8KLQlHUElPKHpyLCA3LCBtdXggJiA0KTsgICAvKiBNVVggUzIgKi8KLQotfQotCi1zdGF0aWMgY2hhciAqCi1pMmNpZF90b19tb2R1bGVuYW1lICh1MTYgaTJjX2lkKQotewotCWNoYXIgKm5hbWUgPSBOVUxMOwotCi0Jc3dpdGNoIChpMmNfaWQpIHsKLQljYXNlIEkyQ19EUklWRVJJRF9TQUE3MTEwOgotCQluYW1lID0gInNhYTcxMTAiOwotCQlicmVhazsKLQljYXNlIEkyQ19EUklWRVJJRF9TQUE3MTExQToKLQkJbmFtZSA9ICJzYWE3MTExIjsKLQkJYnJlYWs7Ci0JY2FzZSBJMkNfRFJJVkVSSURfU0FBNzExNDoKLQkJbmFtZSA9ICJzYWE3MTE0IjsKLQkJYnJlYWs7Ci0JY2FzZSBJMkNfRFJJVkVSSURfU0FBNzE4NUI6Ci0JCW5hbWUgPSAic2FhNzE4NSI7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX0RSSVZFUklEX0FEVjcxNzA6Ci0JCW5hbWUgPSAiYWR2NzE3MCI7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX0RSSVZFUklEX0FEVjcxNzU6Ci0JCW5hbWUgPSAiYWR2NzE3NSI7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX0RSSVZFUklEX0JUODE5OgotCQluYW1lID0gImJ0ODE5IjsKLQkJYnJlYWs7Ci0JY2FzZSBJMkNfRFJJVkVSSURfQlQ4NTY6Ci0JCW5hbWUgPSAiYnQ4NTYiOwotCQlicmVhazsKLQljYXNlIEkyQ19EUklWRVJJRF9CVDg2NjoKLQkJbmFtZSA9ICJidDg2NiI7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX0RSSVZFUklEX1ZQWDMyMjA6Ci0JCW5hbWUgPSAidnB4MzIyMCI7Ci0JCWJyZWFrOwotCWNhc2UgSTJDX0RSSVZFUklEX0tTMDEyNzoKLQkJbmFtZSA9ICJrczAxMjciOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gbmFtZTsKLX0KLQotc3RhdGljIGNoYXIgKgotY29kZWNpZF90b19tb2R1bGVuYW1lICh1MTYgY29kZWNpZCkKLXsKLQljaGFyICpuYW1lID0gTlVMTDsKLQotCXN3aXRjaCAoY29kZWNpZCkgewotCWNhc2UgQ09ERUNfVFlQRV9aUjM2MDYwOgotCQluYW1lID0gInpyMzYwNjAiOwotCQlicmVhazsKLQljYXNlIENPREVDX1RZUEVfWlIzNjA1MDoKLQkJbmFtZSA9ICJ6cjM2MDUwIjsKLQkJYnJlYWs7Ci0JY2FzZSBDT0RFQ19UWVBFX1pSMzYwMTY6Ci0JCW5hbWUgPSAienIzNjAxNiI7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBuYW1lOwotfQotCi0vLyBzdHJ1Y3QgdHZub3JtIHsKLS8vICAgICAgdTE2IFd0LCBXYSwgSFN0YXJ0LCBIU3luY1N0YXJ0LCBIdCwgSGEsIFZTdGFydDsKLS8vIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY1MHNxcGl4ZWwgPSB7IDk0NCwgNzY4LCA4MywgODgwLCA2MjUsIDU3NiwgMTYgfTsKLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY2MHNxcGl4ZWwgPSB7IDc4MCwgNjQwLCA1MSwgNzE2LCA1MjUsIDQ4MCwgMTIgfTsKLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY1MGNjaXI2MDEgPSB7IDg2NCwgNzIwLCA3NSwgODA0LCA2MjUsIDU3NiwgMTggfTsKLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY2MGNjaXI2MDEgPSB7IDg1OCwgNzIwLCA1NywgNzg4LCA1MjUsIDQ4MCwgMTYgfTsKLQotc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwY2NpcjYwMV9sbWwzMyA9IHsgODY0LCA3MjAsIDc1KzM0LCA4MDQsIDYyNSwgNTc2LCAxOCB9Owotc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMV9sbWwzMyA9IHsgODU4LCA3MjAsIDU3KzM0LCA3ODgsIDUyNSwgNDgwLCAxNiB9OwotCi0vKiBUaGUgREMxMCAoNTcvMTYvNTApIHVzZXMgVkFjdGl2ZSBhcyBIU3luYywgc28gSFN0YXJ0IG11c3QgYmUgMCAqLwotc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwc3FwaXhlbF9kYzEwID0geyA5NDQsIDc2OCwgMCwgODgwLCA2MjUsIDU3NiwgMCB9Owotc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwc3FwaXhlbF9kYzEwID0geyA3ODAsIDY0MCwgMCwgNzE2LCA1MjUsIDQ4MCwgMTIgfTsKLQotLyogRklYTUU6IEkgY2Fubm90IHN3YXAgVSBhbmQgViBpbiBzYWE3MTE0LCBzbyBpIGRvIG9uZQotICogcGl4ZWwgbGVmdCBzaGlmdCBpbiB6b3JhbiAoNzUgLT4gNzQpCi0gKiAoTWF4aW0gWWV2dHl1c2hraW4gPG1heEBsaW51eG1lZGlhbGFicy5jb20+KSAqLwotc3RhdGljIHN0cnVjdCB0dm5vcm0gZjUwY2NpcjYwMV9sbTMzcjEwID0geyA4NjQsIDcyMCwgNzQrNTQsIDgwNCwgNjI1LCA1NzYsIDE4IH07Ci1zdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBjY2lyNjAxX2xtMzNyMTAgPSB7IDg1OCwgNzIwLCA1Nis1NCwgNzg4LCA1MjUsIDQ4MCwgMTYgfTsKLQotLyogRklYTUU6IFRoZSBrczAxMjcgc2VlbSBpbmNhcGFibGUgb2Ygc3dhcHBpbmcgVSBhbmQgViwgdG9vLCB3aGljaCBpcyB3aHkgSQotICogY29weSBNYXhpbSdzIGxlZnQgc2hpZnQgaGFjayBmb3IgdGhlIDYgRXllcy4KLSAqCi0gKiBDaHJpc3RlcidzIGRyaXZlciB1c2VkIHRoZSB1bnNoaWZ0ZWQgbm9ybXMsIHRob3VnaC4uLgotICogL1NhbSAgKi8KLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY1MGNjaXI2MDFfYXZzNmV5ZXMgPSB7IDg2NCwgNzIwLCA3NCwgODA0LCA2MjUsIDU3NiwgMTggfTsKLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY2MGNjaXI2MDFfYXZzNmV5ZXMgPSB7IDg1OCwgNzIwLCA1NiwgNzg4LCA1MjUsIDQ4MCwgMTYgfTsKLQotc3RhdGljIHN0cnVjdCBjYXJkX2luZm8gem9yYW5fY2FyZHNbTlVNX0NBUkRTXSBfX2RldmluaXRkYXRhID0gewotCXsKLQkJLnR5cGUgPSBEQzEwX29sZCwKLQkJLm5hbWUgPSAiREMxMChvbGQpIiwKLQkJLmkyY19kZWNvZGVyID0gSTJDX0RSSVZFUklEX1ZQWDMyMjAsCi0JCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA1MCwKLQkJLnZpZGVvX3ZmZSA9IENPREVDX1RZUEVfWlIzNjAxNiwKLQotCQkuaW5wdXRzID0gMywKLQkJLmlucHV0ID0gewotCQkJeyAxLCAiQ29tcG9zaXRlIiB9LAotCQkJeyAyLCAiUy1WaWRlbyIgfSwKLQkJCXsgMCwgIkludGVybmFsL2NvbXAiIH0KLQkJfSwKLQkJLm5vcm1zID0gMywKLQkJLnR2biA9IHsKLQkJCSZmNTBzcXBpeGVsX2RjMTAsCi0JCQkmZjYwc3FwaXhlbF9kYzEwLAotCQkJJmY1MHNxcGl4ZWxfZGMxMAotCQl9LAotCQkuanBlZ19pbnQgPSAwLAotCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCi0JCS5ncGlvID0geyAyLCAxLCAtMSwgMywgNywgMCwgNCwgNSB9LAotCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAgfSwKLQkJLmdwY3MgPSB7IC0xLCAwIH0sCi0JCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCi0JCS5pbnB1dF9tdXggPSAwLAotCQkuaW5pdCA9ICZkYzEwX2luaXQsCi0JfSwgewotCQkudHlwZSA9IERDMTBfbmV3LAotCQkubmFtZSA9ICJEQzEwKG5ldykiLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExMCwKLQkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzUsCi0JCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA2MCwKLQotCQkuaW5wdXRzID0gMywKLQkJLmlucHV0ID0gewotCQkJCXsgMCwgIkNvbXBvc2l0ZSIgfSwKLQkJCQl7IDcsICJTLVZpZGVvIiB9LAotCQkJCXsgNSwgIkludGVybmFsL2NvbXAiIH0KLQkJCX0sCi0JCS5ub3JtcyA9IDMsCi0JCS50dm4gPSB7Ci0JCQkJJmY1MHNxcGl4ZWwsCi0JCQkJJmY2MHNxcGl4ZWwsCi0JCQkJJmY1MHNxcGl4ZWx9LAotCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKLQkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAotCQkuZ3BpbyA9IHsgMywgMCwgNiwgMSwgMiwgLTEsIDQsIDUgfSwKLQkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JCS5ncGNzID0geyAtMSwgMX0sCi0JCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCi0JCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCi0JCS5pbnB1dF9tdXggPSAwLAotCQkuaW5pdCA9ICZkYzEwcGx1c19pbml0LAotCX0sIHsKLQkJLnR5cGUgPSBEQzEwcGx1cywKLQkJLm5hbWUgPSAiREMxMHBsdXMiLAotCQkudmVuZG9yX2lkID0gUENJX1ZFTkRPUl9JRF9NSVJPLAotCQkuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9NSVJPX0RDMTBQTFVTLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExMCwKLQkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzUsCi0JCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA2MCwKLQotCQkuaW5wdXRzID0gMywKLQkJLmlucHV0ID0gewotCQkJeyAwLCAiQ29tcG9zaXRlIiB9LAotCQkJeyA3LCAiUy1WaWRlbyIgfSwKLQkJCXsgNSwgIkludGVybmFsL2NvbXAiIH0KLQkJfSwKLQkJLm5vcm1zID0gMywKLQkJLnR2biA9IHsKLQkJCSZmNTBzcXBpeGVsLAotCQkJJmY2MHNxcGl4ZWwsCi0JCQkmZjUwc3FwaXhlbAotCQl9LAotCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKLQkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAotCQkuZ3BpbyA9IHsgMywgMCwgNiwgMSwgMiwgLTEsIDQsIDUgfSwKLQkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JCS5ncGNzID0geyAtMSwgMSB9LAotCQkudmZlX3BvbCA9IHsgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCB9LAotCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAotCQkuaW5wdXRfbXV4ID0gMCwKLQkJLmluaXQgPSAmZGMxMHBsdXNfaW5pdCwKLQl9LCB7Ci0JCS50eXBlID0gREMzMCwKLQkJLm5hbWUgPSAiREMzMCIsCi0JCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9WUFgzMjIwLAotCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQURWNzE3NSwKLQkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDUwLAotCQkudmlkZW9fdmZlID0gQ09ERUNfVFlQRV9aUjM2MDE2LAotCi0JCS5pbnB1dHMgPSAzLAotCQkuaW5wdXQgPSB7Ci0JCQl7IDEsICJDb21wb3NpdGUiIH0sCi0JCQl7IDIsICJTLVZpZGVvIiB9LAotCQkJeyAwLCAiSW50ZXJuYWwvY29tcCIgfQotCQl9LAotCQkubm9ybXMgPSAzLAotCQkudHZuID0gewotCQkJJmY1MHNxcGl4ZWxfZGMxMCwKLQkJCSZmNjBzcXBpeGVsX2RjMTAsCi0JCQkmZjUwc3FwaXhlbF9kYzEwCi0JCX0sCi0JCS5qcGVnX2ludCA9IDAsCi0JCS52c3luY19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKLQkJLmdwaW8gPSB7IDIsIDEsIC0xLCAzLCA3LCAwLCA0LCA1IH0sCi0JCS5ncGlvX3BvbCA9IHsgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCB9LAotCQkuZ3BjcyA9IHsgLTEsIDAgfSwKLQkJLnZmZV9wb2wgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQkJLmd3c19ub3RfY29ubmVjdGVkID0gMCwKLQkJLmlucHV0X211eCA9IDAsCi0JCS5pbml0ID0gJmRjMTBfaW5pdCwKLQl9LCB7Ci0JCS50eXBlID0gREMzMHBsdXMsCi0JCS5uYW1lID0gIkRDMzBwbHVzIiwKLQkJLnZlbmRvcl9pZCA9IFBDSV9WRU5ET1JfSURfTUlSTywKLQkJLmRldmljZV9pZCA9IFBDSV9ERVZJQ0VfSURfTUlST19EQzMwUExVUywKLQkJLmkyY19kZWNvZGVyID0gSTJDX0RSSVZFUklEX1ZQWDMyMjAsCi0JCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9BRFY3MTc1LAotCQkudmlkZW9fY29kZWMgPSBDT0RFQ19UWVBFX1pSMzYwNTAsCi0JCS52aWRlb192ZmUgPSBDT0RFQ19UWVBFX1pSMzYwMTYsCi0KLQkJLmlucHV0cyA9IDMsCi0JCS5pbnB1dCA9IHsKLQkJCXsgMSwgIkNvbXBvc2l0ZSIgfSwKLQkJCXsgMiwgIlMtVmlkZW8iIH0sCi0JCQl7IDAsICJJbnRlcm5hbC9jb21wIiB9Ci0JCX0sCi0JCS5ub3JtcyA9IDMsCi0JCS50dm4gPSB7Ci0JCQkmZjUwc3FwaXhlbF9kYzEwLAotCQkJJmY2MHNxcGl4ZWxfZGMxMCwKLQkJCSZmNTBzcXBpeGVsX2RjMTAKLQkJfSwKLQkJLmpwZWdfaW50ID0gMCwKLQkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAotCQkuZ3BpbyA9IHsgMiwgMSwgLTEsIDMsIDcsIDAsIDQsIDUgfSwKLQkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwIH0sCi0JCS5ncGNzID0geyAtMSwgMCB9LAotCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAotCQkuaW5wdXRfbXV4ID0gMCwKLQkJLmluaXQgPSAmZGMxMF9pbml0LAotCX0sIHsKLQkJLnR5cGUgPSBMTUwzMywKLQkJLm5hbWUgPSAiTE1MMzMiLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfQlQ4MTksCi0JCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9CVDg1NiwKLQkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAotCi0JCS5pbnB1dHMgPSAyLAotCQkuaW5wdXQgPSB7Ci0JCQl7IDAsICJDb21wb3NpdGUiIH0sCi0JCQl7IDcsICJTLVZpZGVvIiB9Ci0JCX0sCi0JCS5ub3JtcyA9IDIsCi0JCS50dm4gPSB7Ci0JCQkmZjUwY2NpcjYwMV9sbWwzMywKLQkJCSZmNjBjY2lyNjAxX2xtbDMzLAotCQkJTlVMTAotCQl9LAotCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKLQkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAotCQkuZ3BpbyA9IHsgMSwgLTEsIDMsIDUsIDcsIC0xLCAtMSwgLTEgfSwKLQkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwIH0sCi0JCS5ncGNzID0geyAzLCAxIH0sCi0JCS52ZmVfcG9sID0geyAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwIH0sCi0JCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCi0JCS5pbnB1dF9tdXggPSAwLAotCQkuaW5pdCA9ICZsbWwzM19pbml0LAotCX0sIHsKLQkJLnR5cGUgPSBMTUwzM1IxMCwKLQkJLm5hbWUgPSAiTE1MMzNSMTAiLAotCQkudmVuZG9yX2lkID0gUENJX1ZFTkRPUl9JRF9FTEVDVFJPTklDREVTSUdOR01CSCwKLQkJLmRldmljZV9pZCA9IFBDSV9ERVZJQ0VfSURfTE1MXzMzUjEwLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExNCwKLQkJLmkyY19lbmNvZGVyID0gSTJDX0RSSVZFUklEX0FEVjcxNzAsCi0JCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA2MCwKLQotCQkuaW5wdXRzID0gMiwKLQkJLmlucHV0ID0gewotCQkJeyAwLCAiQ29tcG9zaXRlIiB9LAotCQkJeyA3LCAiUy1WaWRlbyIgfQotCQl9LAotCQkubm9ybXMgPSAyLAotCQkudHZuID0gewotCQkJJmY1MGNjaXI2MDFfbG0zM3IxMCwKLQkJCSZmNjBjY2lyNjAxX2xtMzNyMTAsCi0JCQlOVUxMCi0JCX0sCi0JCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAotCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCi0JCS5ncGlvID0geyAxLCAtMSwgMywgNSwgNywgLTEsIC0xLCAtMSB9LAotCQkuZ3Bpb19wb2wgPSB7IDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAgfSwKLQkJLmdwY3MgPSB7IDMsIDEgfSwKLQkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKLQkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKLQkJLmlucHV0X211eCA9IDAsCi0JCS5pbml0ID0gJmxtbDMzX2luaXQsCi0JfSwgewotCQkudHlwZSA9IEJVWiwKLQkJLm5hbWUgPSAiQnV6IiwKLQkJLnZlbmRvcl9pZCA9IFBDSV9WRU5ET1JfSURfSU9NRUdBLAotCQkuZGV2aWNlX2lkID0gUENJX0RFVklDRV9JRF9JT01FR0FfQlVaLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfU0FBNzExMUEsCi0JCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9TQUE3MTg1QiwKLQkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAotCi0JCS5pbnB1dHMgPSAyLAotCQkuaW5wdXQgPSB7Ci0JCQl7IDMsICJDb21wb3NpdGUiIH0sCi0JCQl7IDcsICJTLVZpZGVvIiB9Ci0JCX0sCi0JCS5ub3JtcyA9IDMsCi0JCS50dm4gPSB7Ci0JCQkmZjUwY2NpcjYwMSwKLQkJCSZmNjBjY2lyNjAxLAotCQkJJmY1MGNjaXI2MDEKLQkJfSwKLQkJLmpwZWdfaW50ID0gWlIzNjA1N19JU1JfR0lSUTEsCi0JCS52c3luY19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMCwKLQkJLmdwaW8gPSB7IDEsIC0xLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLQkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JCS5ncGNzID0geyAzLCAxIH0sCi0JCS52ZmVfcG9sID0geyAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwIH0sCi0JCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCi0JCS5pbnB1dF9tdXggPSAwLAotCQkuaW5pdCA9ICZidXpfaW5pdCwKLQl9LCB7Ci0JCS50eXBlID0gQVZTNkVZRVMsCi0JCS5uYW1lID0gIjYtRXllcyIsCi0JCS8qIEF2ZXJNZWRpYSBjaG9zZSBub3QgdG8gYnJhbmQgdGhlIDYtRXllcy4gVGh1cyBpdAotCQkgICBjYW4ndCBiZSBhdXRvZGV0ZWN0ZWQsIGFuZCByZXF1aXJlcyBjYXJkPXguICovCi0JCS52ZW5kb3JfaWQgPSAtMSwKLQkJLmRldmljZV9pZCA9IC0xLAotCQkuaTJjX2RlY29kZXIgPSBJMkNfRFJJVkVSSURfS1MwMTI3LAotCQkuaTJjX2VuY29kZXIgPSBJMkNfRFJJVkVSSURfQlQ4NjYsCi0JCS52aWRlb19jb2RlYyA9IENPREVDX1RZUEVfWlIzNjA2MCwKLQotCQkuaW5wdXRzID0gMTAsCi0JCS5pbnB1dCA9IHsKLQkJCXsgMCwgIkNvbXBvc2l0ZSAxIiB9LAotCQkJeyAxLCAiQ29tcG9zaXRlIDIiIH0sCi0JCQl7IDIsICJDb21wb3NpdGUgMyIgfSwKLQkJCXsgNCwgIkNvbXBvc2l0ZSA0IiB9LAotCQkJeyA1LCAiQ29tcG9zaXRlIDUiIH0sCi0JCQl7IDYsICJDb21wb3NpdGUgNiIgfSwKLQkJCXsgOCwgIlMtVmlkZW8gMSIgfSwKLQkJCXsgOSwgIlMtVmlkZW8gMiIgfSwKLQkJCXsxMCwgIlMtVmlkZW8gMyIgfSwKLQkJCXsxNSwgIllDYkNyIiB9Ci0JCX0sCi0JCS5ub3JtcyA9IDIsCi0JCS50dm4gPSB7Ci0JCQkmZjUwY2NpcjYwMV9hdnM2ZXllcywKLQkJCSZmNjBjY2lyNjAxX2F2czZleWVzLAotCQkJTlVMTAotCQl9LAotCQkuanBlZ19pbnQgPSBaUjM2MDU3X0lTUl9HSVJRMSwKLQkJLnZzeW5jX2ludCA9IFpSMzYwNTdfSVNSX0dJUlEwLAotCQkuZ3BpbyA9IHsgMSwgMCwgMywgLTEsIC0xLCAtMSwgLTEsIC0xIH0sLy8gVmFsaWRpdHkgdW5rbm93biAvU2FtCi0JCS5ncGlvX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCAvLyBWYWxpZGl0eSB1bmtub3duIC9TYW0KLQkJLmdwY3MgPSB7IDMsIDEgfSwJCQkvLyBWYWxpZGl0eSB1bmtub3duIC9TYW0KLQkJLnZmZV9wb2wgPSB7IDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwgIC8vIFZhbGlkaXR5IHVua25vd24gL1NhbQotCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAxLAotCQkuaW5wdXRfbXV4ID0gMSwKLQkJLmluaXQgPSAmYXZzNmV5ZXNfaW5pdCwKLQl9Ci0KLX07Ci0KLS8qCi0gKiBJMkMgZnVuY3Rpb25zCi0gKi8KLS8qIHNvZnR3YXJlIEkyQyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQKLXpvcmFuX2kyY19nZXRzZGEgKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgZGF0YTsKLQotCXJldHVybiAoYnRyZWFkKFpSMzYwNTdfSTJDQlIpID4+IDEpICYgMTsKLX0KLQotc3RhdGljIGludAotem9yYW5faTJjX2dldHNjbCAodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gKHN0cnVjdCB6b3JhbiAqKSBkYXRhOwotCi0JcmV0dXJuIGJ0cmVhZChaUjM2MDU3X0kyQ0JSKSAmIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi16b3Jhbl9pMmNfc2V0c2RhICh2b2lkICpkYXRhLAotCQkgIGludCAgIHN0YXRlKQotewotCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGRhdGE7Ci0KLQlpZiAoc3RhdGUpCi0JCXpyLT5pMmNiciB8PSAyOwotCWVsc2UKLQkJenItPmkyY2JyICY9IH4yOwotCWJ0d3JpdGUoenItPmkyY2JyLCBaUjM2MDU3X0kyQ0JSKTsKLX0KLQotc3RhdGljIHZvaWQKLXpvcmFuX2kyY19zZXRzY2wgKHZvaWQgKmRhdGEsCi0JCSAgaW50ICAgc3RhdGUpCi17Ci0Jc3RydWN0IHpvcmFuICp6ciA9IChzdHJ1Y3Qgem9yYW4gKikgZGF0YTsKLQotCWlmIChzdGF0ZSkKLQkJenItPmkyY2JyIHw9IDE7Ci0JZWxzZQotCQl6ci0+aTJjYnIgJj0gfjE7Ci0JYnR3cml0ZSh6ci0+aTJjYnIsIFpSMzYwNTdfSTJDQlIpOwotfQotCi1zdGF0aWMgaW50Ci16b3Jhbl9pMmNfY2xpZW50X3JlZ2lzdGVyIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKLQlpbnQgcmVzID0gMDsKLQotCWRwcmludGsoMiwKLQkJS0VSTl9ERUJVRyAiJXM6IGkyY19jbGllbnRfcmVnaXN0ZXIoKSAtIGRyaXZlciBpZCA9ICVkXG4iLAotCQlaUl9ERVZOQU1FKHpyKSwgY2xpZW50LT5kcml2ZXItPmlkKTsKLQotCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCWlmICh6ci0+dXNlciA+IDApIHsKLQkJLyogd2UncmUgYWxyZWFkeSBidXN5LCBzbyB3ZSBrZWVwIGEgcmVmZXJlbmNlIHRvCi0JCSAqIHRoZW0uLi4gQ291bGQgZG8gYSBsb3Qgb2Ygc3R1ZmYgaGVyZSwgYnV0IHRoaXMKLQkJICogaXMgZWFzaWVzdC4gKERpZCBJIGV2ZXIgbWVudGlvbiBJJ20gYSBsYXp5IGFzcz8pCi0JCSAqLwotCQlyZXMgPSAtRUJVU1k7Ci0JCWdvdG8gY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQotCWlmIChjbGllbnQtPmRyaXZlci0+aWQgPT0genItPmNhcmQuaTJjX2RlY29kZXIpCi0JCXpyLT5kZWNvZGVyID0gY2xpZW50OwotCWVsc2UgaWYgKGNsaWVudC0+ZHJpdmVyLT5pZCA9PSB6ci0+Y2FyZC5pMmNfZW5jb2RlcikKLQkJenItPmVuY29kZXIgPSBjbGllbnQ7Ci0JZWxzZSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQotY2xpZW50cmVnX3VubG9ja19hbmRfcmV0dXJuOgotCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotem9yYW5faTJjX2NsaWVudF91bnJlZ2lzdGVyIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCB6b3JhbiAqenIgPSAoc3RydWN0IHpvcmFuICopIGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKLQlpbnQgcmVzID0gMDsKLQotCWRwcmludGsoMiwgS0VSTl9ERUJVRyAiJXM6IGkyY19jbGllbnRfdW5yZWdpc3RlcigpXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQlpZiAoenItPnVzZXIgPiAwKSB7Ci0JCXJlcyA9IC1FQlVTWTsKLQkJZ290byBjbGllbnR1bnJlZ191bmxvY2tfYW5kX3JldHVybjsKLQl9Ci0KLQkvKiB0cnkgdG8gbG9jYXRlIGl0ICovCi0JaWYgKGNsaWVudCA9PSB6ci0+ZW5jb2RlcikgewotCQl6ci0+ZW5jb2RlciA9IE5VTEw7Ci0JfSBlbHNlIGlmIChjbGllbnQgPT0genItPmRlY29kZXIpIHsKLQkJenItPmRlY29kZXIgPSBOVUxMOwotCQlzbnByaW50ZihaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKFpSX0RFVk5BTUUoenIpKSwgIk1KUEVHWyVkXSIsIHpyLT5pZCk7Ci0JfQotY2xpZW50dW5yZWdfdW5sb2NrX2FuZF9yZXR1cm46Ci0JbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSB6b3Jhbl9pMmNfYml0X2RhdGFfdGVtcGxhdGUgPSB7Ci0JLnNldHNkYSA9IHpvcmFuX2kyY19zZXRzZGEsCi0JLnNldHNjbCA9IHpvcmFuX2kyY19zZXRzY2wsCi0JLmdldHNkYSA9IHpvcmFuX2kyY19nZXRzZGEsCi0JLmdldHNjbCA9IHpvcmFuX2kyY19nZXRzY2wsCi0JLnVkZWxheSA9IDEwLAotCS50aW1lb3V0ID0gMTAwLAotfTsKLQotc3RhdGljIGludAotem9yYW5fcmVnaXN0ZXJfaTJjIChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCW1lbWNweSgmenItPmkyY19hbGdvLCAmem9yYW5faTJjX2JpdF9kYXRhX3RlbXBsYXRlLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhKSk7Ci0JenItPmkyY19hbGdvLmRhdGEgPSB6cjsKLQl6ci0+aTJjX2FkYXB0ZXIuaWQgPSBJMkNfSFdfQl9aUjM2MDY3OwotCXpyLT5pMmNfYWRhcHRlci5jbGllbnRfcmVnaXN0ZXIgPSB6b3Jhbl9pMmNfY2xpZW50X3JlZ2lzdGVyOwotCXpyLT5pMmNfYWRhcHRlci5jbGllbnRfdW5yZWdpc3RlciA9IHpvcmFuX2kyY19jbGllbnRfdW5yZWdpc3RlcjsKLQlzdHJsY3B5KHpyLT5pMmNfYWRhcHRlci5uYW1lLCBaUl9ERVZOQU1FKHpyKSwKLQkJc2l6ZW9mKHpyLT5pMmNfYWRhcHRlci5uYW1lKSk7Ci0JaTJjX3NldF9hZGFwZGF0YSgmenItPmkyY19hZGFwdGVyLCB6cik7Ci0JenItPmkyY19hZGFwdGVyLmFsZ29fZGF0YSA9ICZ6ci0+aTJjX2FsZ287Ci0JenItPmkyY19hZGFwdGVyLmRldi5wYXJlbnQgPSAmenItPnBjaV9kZXYtPmRldjsKLQlyZXR1cm4gaTJjX2JpdF9hZGRfYnVzKCZ6ci0+aTJjX2FkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZAotem9yYW5fdW5yZWdpc3Rlcl9pMmMgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JaTJjX2RlbF9hZGFwdGVyKCZ6ci0+aTJjX2FkYXB0ZXIpOwotfQotCi0vKiBDaGVjayBhIHpvcmFuX3BhcmFtcyBzdHJ1Y3QgZm9yIGNvcnJlY3RuZXNzLCBpbnNlcnQgZGVmYXVsdCBwYXJhbXMgKi8KLQotaW50Ci16b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MgKHN0cnVjdCB6b3JhbiAgICAgICAgICAgICAgKnpyLAotCQkJICBzdHJ1Y3Qgem9yYW5fanBnX3NldHRpbmdzICpzZXR0aW5ncykKLXsKLQlpbnQgZXJyID0gMCwgZXJyMCA9IDA7Ci0KLQlkcHJpbnRrKDQsCi0JCUtFUk5fREVCVUcKLQkJIiVzOiBjaGVja19qcGdfc2V0dGluZ3MoKSAtIGRlYzogJWQsIEhkY206ICVkLCBWZGNtOiAlZCwgVGRjbTogJWRcbiIsCi0JCVpSX0RFVk5BTUUoenIpLCBzZXR0aW5ncy0+ZGVjaW1hdGlvbiwgc2V0dGluZ3MtPkhvckRjbSwKLQkJc2V0dGluZ3MtPlZlckRjbSwgc2V0dGluZ3MtPlRtcERjbSk7Ci0JZHByaW50ayg0LAotCQlLRVJOX0RFQlVHCi0JCSIlczogY2hlY2tfanBnX3NldHRpbmdzKCkgLSB4OiAlZCwgeTogJWQsIHc6ICVkLCB5OiAlZFxuIiwKLQkJWlJfREVWTkFNRSh6ciksIHNldHRpbmdzLT5pbWdfeCwgc2V0dGluZ3MtPmltZ195LAotCQlzZXR0aW5ncy0+aW1nX3dpZHRoLCBzZXR0aW5ncy0+aW1nX2hlaWdodCk7Ci0JLyogQ2hlY2sgZGVjaW1hdGlvbiwgc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBkZWNpbWF0aW9uID0gMSwgMiwgNCAqLwotCXN3aXRjaCAoc2V0dGluZ3MtPmRlY2ltYXRpb24pIHsKLQljYXNlIDE6Ci0KLQkJc2V0dGluZ3MtPkhvckRjbSA9IDE7Ci0JCXNldHRpbmdzLT5WZXJEY20gPSAxOwotCQlzZXR0aW5ncy0+VG1wRGNtID0gMTsKLQkJc2V0dGluZ3MtPmZpZWxkX3Blcl9idWZmID0gMjsKLQkJc2V0dGluZ3MtPmltZ194ID0gMDsKLQkJc2V0dGluZ3MtPmltZ195ID0gMDsKLQkJc2V0dGluZ3MtPmltZ193aWR0aCA9IEJVWl9NQVhfV0lEVEg7Ci0JCXNldHRpbmdzLT5pbWdfaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQgLyAyOwotCQlicmVhazsKLQljYXNlIDI6Ci0KLQkJc2V0dGluZ3MtPkhvckRjbSA9IDI7Ci0JCXNldHRpbmdzLT5WZXJEY20gPSAxOwotCQlzZXR0aW5ncy0+VG1wRGNtID0gMjsKLQkJc2V0dGluZ3MtPmZpZWxkX3Blcl9idWZmID0gMTsKLQkJc2V0dGluZ3MtPmltZ194ID0gKEJVWl9NQVhfV0lEVEggPT0gNzIwKSA/IDggOiAwOwotCQlzZXR0aW5ncy0+aW1nX3kgPSAwOwotCQlzZXR0aW5ncy0+aW1nX3dpZHRoID0KLQkJICAgIChCVVpfTUFYX1dJRFRIID09IDcyMCkgPyA3MDQgOiBCVVpfTUFYX1dJRFRIOwotCQlzZXR0aW5ncy0+aW1nX2hlaWdodCA9IEJVWl9NQVhfSEVJR0hUIC8gMjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCi0JCWlmICh6ci0+Y2FyZC50eXBlID09IERDMTBfbmV3KSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9ERUJVRwotCQkJCSIlczogY2hlY2tfanBnX3NldHRpbmdzKCkgLSBIRGVjIGJ5IDQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgREMxMFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQllcnIwKys7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNldHRpbmdzLT5Ib3JEY20gPSA0OwotCQlzZXR0aW5ncy0+VmVyRGNtID0gMjsKLQkJc2V0dGluZ3MtPlRtcERjbSA9IDI7Ci0JCXNldHRpbmdzLT5maWVsZF9wZXJfYnVmZiA9IDE7Ci0JCXNldHRpbmdzLT5pbWdfeCA9IChCVVpfTUFYX1dJRFRIID09IDcyMCkgPyA4IDogMDsKLQkJc2V0dGluZ3MtPmltZ195ID0gMDsKLQkJc2V0dGluZ3MtPmltZ193aWR0aCA9Ci0JCSAgICAoQlVaX01BWF9XSURUSCA9PSA3MjApID8gNzA0IDogQlVaX01BWF9XSURUSDsKLQkJc2V0dGluZ3MtPmltZ19oZWlnaHQgPSBCVVpfTUFYX0hFSUdIVCAvIDI7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQotCQkvKiBXZSBoYXZlIHRvIGNoZWNrIHRoZSBkYXRhIHRoZSB1c2VyIGhhcyBzZXQgKi8KLQotCQlpZiAoc2V0dGluZ3MtPkhvckRjbSAhPSAxICYmIHNldHRpbmdzLT5Ib3JEY20gIT0gMiAmJgotCQkgICAgKHpyLT5jYXJkLnR5cGUgPT0gREMxMF9uZXcgfHwgc2V0dGluZ3MtPkhvckRjbSAhPSA0KSkKLQkJCWVycjArKzsKLQkJaWYgKHNldHRpbmdzLT5WZXJEY20gIT0gMSAmJiBzZXR0aW5ncy0+VmVyRGNtICE9IDIpCi0JCQllcnIwKys7Ci0JCWlmIChzZXR0aW5ncy0+VG1wRGNtICE9IDEgJiYgc2V0dGluZ3MtPlRtcERjbSAhPSAyKQotCQkJZXJyMCsrOwotCQlpZiAoc2V0dGluZ3MtPmZpZWxkX3Blcl9idWZmICE9IDEgJiYKLQkJICAgIHNldHRpbmdzLT5maWVsZF9wZXJfYnVmZiAhPSAyKQotCQkJZXJyMCsrOwotCQlpZiAoc2V0dGluZ3MtPmltZ194IDwgMCkKLQkJCWVycjArKzsKLQkJaWYgKHNldHRpbmdzLT5pbWdfeSA8IDApCi0JCQllcnIwKys7Ci0JCWlmIChzZXR0aW5ncy0+aW1nX3dpZHRoIDwgMCkKLQkJCWVycjArKzsKLQkJaWYgKHNldHRpbmdzLT5pbWdfaGVpZ2h0IDwgMCkKLQkJCWVycjArKzsKLQkJaWYgKHNldHRpbmdzLT5pbWdfeCArIHNldHRpbmdzLT5pbWdfd2lkdGggPiBCVVpfTUFYX1dJRFRIKQotCQkJZXJyMCsrOwotCQlpZiAoc2V0dGluZ3MtPmltZ195ICsgc2V0dGluZ3MtPmltZ19oZWlnaHQgPgotCQkgICAgQlVaX01BWF9IRUlHSFQgLyAyKQotCQkJZXJyMCsrOwotCQlpZiAoc2V0dGluZ3MtPkhvckRjbSAmJiBzZXR0aW5ncy0+VmVyRGNtKSB7Ci0JCQlpZiAoc2V0dGluZ3MtPmltZ193aWR0aCAlCi0JCQkgICAgKDE2ICogc2V0dGluZ3MtPkhvckRjbSkgIT0gMCkKLQkJCQllcnIwKys7Ci0JCQlpZiAoc2V0dGluZ3MtPmltZ19oZWlnaHQgJQotCQkJICAgICg4ICogc2V0dGluZ3MtPlZlckRjbSkgIT0gMCkKLQkJCQllcnIwKys7Ci0JCX0KLQotCQlpZiAoZXJyMCkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBjaGVja19qcGdfc2V0dGluZ3MoKSAtIGVycm9yIGluIHBhcmFtcyBmb3IgZGVjaW1hdGlvbiA9IDBcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJZXJyKys7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIKLQkJCSIlczogY2hlY2tfanBnX3NldHRpbmdzKCkgLSBkZWNpbWF0aW9uID0gJWQsIG11c3QgYmUgMCwgMSwgMiBvciA0XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIHNldHRpbmdzLT5kZWNpbWF0aW9uKTsKLQkJZXJyKys7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzZXR0aW5ncy0+anBnX2NvbXAucXVhbGl0eSA+IDEwMCkKLQkJc2V0dGluZ3MtPmpwZ19jb21wLnF1YWxpdHkgPSAxMDA7Ci0JaWYgKHNldHRpbmdzLT5qcGdfY29tcC5xdWFsaXR5IDwgNSkKLQkJc2V0dGluZ3MtPmpwZ19jb21wLnF1YWxpdHkgPSA1OwotCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQVBQbiA8IDApCi0JCXNldHRpbmdzLT5qcGdfY29tcC5BUFBuID0gMDsKLQlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkFQUG4gPiAxNSkKLQkJc2V0dGluZ3MtPmpwZ19jb21wLkFQUG4gPSAxNTsKLQlpZiAoc2V0dGluZ3MtPmpwZ19jb21wLkFQUF9sZW4gPCAwKQotCQlzZXR0aW5ncy0+anBnX2NvbXAuQVBQX2xlbiA9IDA7Ci0JaWYgKHNldHRpbmdzLT5qcGdfY29tcC5BUFBfbGVuID4gNjApCi0JCXNldHRpbmdzLT5qcGdfY29tcC5BUFBfbGVuID0gNjA7Ci0JaWYgKHNldHRpbmdzLT5qcGdfY29tcC5DT01fbGVuIDwgMCkKLQkJc2V0dGluZ3MtPmpwZ19jb21wLkNPTV9sZW4gPSAwOwotCWlmIChzZXR0aW5ncy0+anBnX2NvbXAuQ09NX2xlbiA+IDYwKQotCQlzZXR0aW5ncy0+anBnX2NvbXAuQ09NX2xlbiA9IDYwOwotCWlmIChlcnIpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi12b2lkCi16b3Jhbl9vcGVuX2luaXRfcGFyYW1zIChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCWludCBpOwotCi0JLyogVXNlciBtdXN0IGV4cGxpY2l0bHkgc2V0IGEgd2luZG93ICovCi0JenItPm92ZXJsYXlfc2V0dGluZ3MuaXNfc2V0ID0gMDsKLQl6ci0+b3ZlcmxheV9tYXNrID0gTlVMTDsKLQl6ci0+b3ZlcmxheV9hY3RpdmUgPSBaT1JBTl9GUkVFOwotCi0JenItPnY0bF9tZW1ncmFiX2FjdGl2ZSA9IDA7Ci0JenItPnY0bF9vdmVybGF5X2FjdGl2ZSA9IDA7Ci0JenItPnY0bF9ncmFiX2ZyYW1lID0gTk9fR1JBQl9BQ1RJVkU7Ci0JenItPnY0bF9ncmFiX3NlcSA9IDA7Ci0JenItPnY0bF9zZXR0aW5ncy53aWR0aCA9IDE5MjsKLQl6ci0+djRsX3NldHRpbmdzLmhlaWdodCA9IDE0NDsKLQl6ci0+djRsX3NldHRpbmdzLmZvcm1hdCA9ICZ6b3Jhbl9mb3JtYXRzWzRdOwkvKiBZVVkyIC0gWVVWLTQ6MjoyIHBhY2tlZCAqLwotCXpyLT52NGxfc2V0dGluZ3MuYnl0ZXNwZXJsaW5lID0KLQkgICAgenItPnY0bF9zZXR0aW5ncy53aWR0aCAqCi0JICAgICgoenItPnY0bF9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoICsgNykgLyA4KTsKLQotCS8qIERNQSByaW5nIHN0dWZmIGZvciBWNEwgKi8KLQl6ci0+djRsX3BlbmRfdGFpbCA9IDA7Ci0JenItPnY0bF9wZW5kX2hlYWQgPSAwOwotCXpyLT52NGxfc3luY190YWlsID0gMDsKLQl6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKLQlmb3IgKGkgPSAwOyBpIDwgVklERU9fTUFYX0ZSQU1FOyBpKyspIHsKLQkJenItPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwkvKiBub3RoaW5nIGdvaW5nIG9uICovCi0JfQotCXpyLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEJVWl9NQVhfRlJBTUU7IGkrKykgewotCQl6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KLQl9Ci0JenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0JenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JLyogU2V0IG5lY2Vzc2FyeSBwYXJhbXMgYW5kIGNhbGwgem9yYW5fY2hlY2tfanBnX3NldHRpbmdzIHRvIHNldCB0aGUgZGVmYXVsdHMgKi8KLQl6ci0+anBnX3NldHRpbmdzLmRlY2ltYXRpb24gPSAxOwotCXpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eSA9IDUwOwkvKiBkZWZhdWx0IGNvbXByZXNzaW9uIGZhY3RvciA4ICovCi0JaWYgKHpyLT5jYXJkLnR5cGUgIT0gQlVaKQotCQl6ci0+anBnX3NldHRpbmdzLm9kZF9ldmVuID0gMTsKLQllbHNlCi0JCXpyLT5qcGdfc2V0dGluZ3Mub2RkX2V2ZW4gPSAwOwotCXpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQbiA9IDA7Ci0JenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuID0gMDsJLyogTm8gQVBQbiBtYXJrZXIgKi8KLQltZW1zZXQoenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwgMCwKLQkgICAgICAgc2l6ZW9mKHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2RhdGEpKTsKLQl6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9sZW4gPSAwOwkvKiBObyBDT00gbWFya2VyICovCi0JbWVtc2V0KHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2RhdGEsIDAsCi0JICAgICAgIHNpemVvZih6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhKSk7Ci0JenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5qcGVnX21hcmtlcnMgPQotCSAgICBKUEVHX01BUktFUl9ESFQgfCBKUEVHX01BUktFUl9EUVQ7Ci0JaSA9IHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyh6ciwgJnpyLT5qcGdfc2V0dGluZ3MpOwotCWlmIChpKQotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB6b3Jhbl9vcGVuX2luaXRfcGFyYW1zKCkgaW50ZXJuYWwgZXJyb3JcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0KLQljbGVhcl9pbnRlcnJ1cHRfY291bnRlcnMoenIpOwotCXpyLT50ZXN0aW5nID0gMDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0Ci10ZXN0X2ludGVycnVwdHMgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0JaW50IHRpbWVvdXQsIGljcjsKLQotCWNsZWFyX2ludGVycnVwdF9jb3VudGVycyh6cik7Ci0KLQl6ci0+dGVzdGluZyA9IDE7Ci0JaWNyID0gYnRyZWFkKFpSMzYwNTdfSUNSKTsKLQlidHdyaXRlKDB4NzgwMDAwMDAgfCBaUjM2MDU3X0lDUl9JbnRQaW5FbiwgWlIzNjA1N19JQ1IpOwotCXByZXBhcmVfdG9fd2FpdCgmenItPnRlc3RfcSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQoSFopOwotCWZpbmlzaF93YWl0KCZ6ci0+dGVzdF9xLCAmd2FpdCk7Ci0JYnR3cml0ZSgwLCBaUjM2MDU3X0lDUik7Ci0JYnR3cml0ZSgweDc4MDAwMDAwLCBaUjM2MDU3X0lTUik7Ci0JenItPnRlc3RpbmcgPSAwOwotCWRwcmludGsoNSwgS0VSTl9JTkZPICIlczogVGVzdGluZyBpbnRlcnJ1cHRzLi4uXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0JaWYgKHRpbWVvdXQpIHsKLQkJZHByaW50aygxLCAiOiB0aW1lIHNwZW50OiAlZFxuIiwgMSAqIEhaIC0gdGltZW91dCk7Ci0JfQotCWlmICh6cjM2MDY3X2RlYnVnID4gMSkKLQkJcHJpbnRfaW50ZXJydXB0cyh6cik7Ci0JYnR3cml0ZShpY3IsIFpSMzYwNTdfSUNSKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQKLXpyMzYwNTdfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKLXsKLQlpbnQgaiwgZXJyOwotCWludCB0d28gPSAyOwotCWludCB6ZXJvID0gMDsKLQotCWRwcmludGsoMSwKLQkJS0VSTl9JTkZPCi0JCSIlczogenIzNjA1N19pbml0KCkgLSBpbml0aWFsaXppbmcgY2FyZFslZF0sIHpyPSVwXG4iLAotCQlaUl9ERVZOQU1FKHpyKSwgenItPmlkLCB6cik7Ci0KLQkvKiBkZWZhdWx0IHNldHVwIG9mIGFsbCBwYXJhbWV0ZXJzIHdoaWNoIHdpbGwgcGVyc2lzdCBiZXR3ZWVuIG9wZW5zICovCi0JenItPnVzZXIgPSAwOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmenItPnY0bF9jYXBxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ6ci0+anBnX2NhcHEpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnpyLT50ZXN0X3EpOwotCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCXpyLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCi0JenItPmJ1ZmZlci5iYXNlID0gKHZvaWQgKikgdmlkbWVtOwotCXpyLT5idWZmZXIud2lkdGggPSAwOwotCXpyLT5idWZmZXIuaGVpZ2h0ID0gMDsKLQl6ci0+YnVmZmVyLmRlcHRoID0gMDsKLQl6ci0+YnVmZmVyLmJ5dGVzcGVybGluZSA9IDA7Ci0KLQkvKiBBdm9pZCBub25zZW5zZSBzZXR0aW5ncyBmcm9tIHVzZXIgZm9yIGRlZmF1bHQgaW5wdXQvbm9ybSAqLwotCWlmIChkZWZhdWx0X25vcm0gPCBWSURFT19NT0RFX1BBTCAmJgotCSAgICBkZWZhdWx0X25vcm0gPiBWSURFT19NT0RFX1NFQ0FNKQotCQlkZWZhdWx0X25vcm0gPSBWSURFT19NT0RFX1BBTDsKLQl6ci0+bm9ybSA9IGRlZmF1bHRfbm9ybTsKLQlpZiAoISh6ci0+dGltaW5nID0genItPmNhcmQudHZuW3pyLT5ub3JtXSkpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9XQVJOSU5HCi0JCQkiJXM6IHpyMzYwNTdfaW5pdCgpIC0gZGVmYXVsdCBUViBzdGFuZGFyZCBub3Qgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLiBQQUwgd2lsbCBiZSB1c2VkLlxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJenItPm5vcm0gPSBWSURFT19NT0RFX1BBTDsKLQkJenItPnRpbWluZyA9IHpyLT5jYXJkLnR2blt6ci0+bm9ybV07Ci0JfQotCi0JaWYgKGRlZmF1bHRfaW5wdXQgPiB6ci0+Y2FyZC5pbnB1dHMtMSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX1dBUk5JTkcKLQkJCSIlczogZGVmYXVsdF9pbnB1dCB2YWx1ZSAlZCBvdXQgb2YgcmFuZ2UgKDAtJWQpXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGRlZmF1bHRfaW5wdXQsIHpyLT5jYXJkLmlucHV0cy0xKTsKLQkJZGVmYXVsdF9pbnB1dCA9IDA7Ci0JfQotCXpyLT5pbnB1dCA9IGRlZmF1bHRfaW5wdXQ7Ci0KLQkvKiBTaG91bGQgdGhlIGZvbGxvd2luZyBiZSByZXNldCBhdCBldmVyeSBvcGVuID8gKi8KLQl6ci0+aHVlID0gMzI3Njg7Ci0JenItPmNvbnRyYXN0ID0gMzI3Njg7Ci0JenItPnNhdHVyYXRpb24gPSAzMjc2ODsKLQl6ci0+YnJpZ2h0bmVzcyA9IDMyNzY4OwotCi0JLyogZGVmYXVsdCBzZXR1cCAod2lsbCBiZSByZXBlYXRlZCBhdCBldmVyeSBvcGVuKSAqLwotCXpvcmFuX29wZW5faW5pdF9wYXJhbXMoenIpOwotCi0JLyogYWxsb2NhdGUgbWVtb3J5ICpiZWZvcmUqIGRvaW5nIGFueXRoaW5nIHRvIHRoZSBoYXJkd2FyZQotCSAqIGluIGNhc2UgYWxsb2NhdGlvbiBmYWlscyAqLwotCXpyLT5zdGF0X2NvbSA9IGt6YWxsb2MoQlVaX05VTV9TVEFUX0NPTSAqIDQsIEdGUF9LRVJORUwpOwotCXpyLT52aWRlb19kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF6ci0+c3RhdF9jb20gfHwgIXpyLT52aWRlb19kZXYpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIKLQkJCSIlczogenIzNjA1N19pbml0KCkgLSBrbWFsbG9jIChTVEFUX0NPTSkgZmFpbGVkXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfZnJlZTsKLQl9Ci0JZm9yIChqID0gMDsgaiA8IEJVWl9OVU1fU1RBVF9DT007IGorKykgewotCQl6ci0+c3RhdF9jb21bal0gPSBjcHVfdG9fbGUzMigxKTsgLyogbWFyayBhcyB1bmF2YWlsYWJsZSB0byB6cjM2MDU3ICovCi0JfQotCi0JLyoKLQkgKiAgIE5vdyBhZGQgdGhlIHRlbXBsYXRlIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlIHVuaXQuCi0JICovCi0JbWVtY3B5KHpyLT52aWRlb19kZXYsICZ6b3Jhbl90ZW1wbGF0ZSwgc2l6ZW9mKHpvcmFuX3RlbXBsYXRlKSk7Ci0Jc3RyY3B5KHpyLT52aWRlb19kZXYtPm5hbWUsIFpSX0RFVk5BTUUoenIpKTsKLQllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoenItPnZpZGVvX2RldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnJbenItPmlkXSk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXhpdF91bnJlZ2lzdGVyOwotCi0Jem9yYW5faW5pdF9oYXJkd2FyZSh6cik7Ci0JaWYgKHpyMzYwNjdfZGVidWcgPiAyKQotCQlkZXRlY3RfZ3Vlc3RfYWN0aXZpdHkoenIpOwotCXRlc3RfaW50ZXJydXB0cyh6cik7Ci0JaWYgKCFwYXNzX3Rocm91Z2gpIHsKLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZ6ZXJvKTsKLQkJZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9JTlBVVCwgJnR3byk7Ci0JfQotCi0JenItPnpvcmFuX3Byb2MgPSBOVUxMOwotCXpyLT5pbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7Ci0KLWV4aXRfdW5yZWdpc3RlcjoKLQl6b3Jhbl91bnJlZ2lzdGVyX2kyYyh6cik7Ci1leGl0X2ZyZWU6Ci0Ja2ZyZWUoenItPnN0YXRfY29tKTsKLQlrZnJlZSh6ci0+dmlkZW9fZGV2KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZAotem9yYW5fcmVsZWFzZSAoc3RydWN0IHpvcmFuICp6cikKLXsKLQlpZiAoIXpyLT5pbml0aWFsaXplZCkKLQkJZ290byBleGl0X2ZyZWU7Ci0JLyogdW5yZWdpc3RlciB2aWRlb2NvZGVjIGJ1cyAqLwotCWlmICh6ci0+Y29kZWMpIHsKLQkJc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXIgPSB6ci0+Y29kZWMtPm1hc3Rlcl9kYXRhOwotCi0JCXZpZGVvY29kZWNfZGV0YWNoKHpyLT5jb2RlYyk7Ci0JCWtmcmVlKG1hc3Rlcik7Ci0JfQotCWlmICh6ci0+dmZlKSB7Ci0JCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbWFzdGVyID0genItPnZmZS0+bWFzdGVyX2RhdGE7Ci0KLQkJdmlkZW9jb2RlY19kZXRhY2goenItPnZmZSk7Ci0JCWtmcmVlKG1hc3Rlcik7Ci0JfQotCi0JLyogdW5yZWdpc3RlciBpMmMgYnVzICovCi0Jem9yYW5fdW5yZWdpc3Rlcl9pMmMoenIpOwotCS8qIGRpc2FibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KLQl6b3Jhbl9zZXRfcGNpX21hc3Rlcih6ciwgMCk7Ci0JLyogcHV0IGNoaXAgaW50byByZXNldCAqLwotCWJ0d3JpdGUoMCwgWlIzNjA1N19TUEdQUENSKTsKLQlmcmVlX2lycSh6ci0+cGNpX2Rldi0+aXJxLCB6cik7Ci0JLyogdW5tYXAgYW5kIGZyZWUgbWVtb3J5ICovCi0Ja2ZyZWUoenItPnN0YXRfY29tKTsKLQl6b3Jhbl9wcm9jX2NsZWFudXAoenIpOwotCWlvdW5tYXAoenItPnpyMzYwNTdfbWVtKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UoenItPnBjaV9kZXYpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHpyLT52aWRlb19kZXYpOwotZXhpdF9mcmVlOgotCWtmcmVlKHpyKTsKLX0KLQotdm9pZAotem9yYW5fdmRldl9yZWxlYXNlIChzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQotewotCWtmcmVlKHZkZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICogX19kZXZpbml0Ci16b3Jhbl9zZXR1cF92aWRlb2NvZGVjIChzdHJ1Y3Qgem9yYW4gKnpyLAotCQkJaW50ICAgICAgICAgICB0eXBlKQotewotCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbSA9IE5VTEw7Ci0KLQltID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHpvcmFuX3NldHVwX3ZpZGVvY29kZWMoKSAtIG5vIG1lbW9yeVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyogbWFnaWMgYW5kIHR5cGUgYXJlIHVudXNlZCBmb3IgbWFzdGVyIHN0cnVjdC4gTWFrZXMgc2Vuc2Ugb25seSBhdAotCSAgIGNvZGVjIHN0cnVjdHMuCi0JICAgSW4gdGhlIHBhc3QsIC50eXBlIHdlcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIG9sZCBWNEwxIC5oYXJkd2FyZQotCSAgIHZhbHVlLCBhcyBWSURfSEFSRFdBUkVfWlIzNjA2NwotCSAqLwotCW0tPm1hZ2ljID0gMEw7Ci0JbS0+dHlwZSA9IDA7Ci0KLQltLT5mbGFncyA9IENPREVDX0ZMQUdfRU5DT0RFUiB8IENPREVDX0ZMQUdfREVDT0RFUjsKLQlzdHJuY3B5KG0tPm5hbWUsIFpSX0RFVk5BTUUoenIpLCBzaXplb2YobS0+bmFtZSkpOwotCW0tPmRhdGEgPSB6cjsKLQotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDT0RFQ19UWVBFX1pSMzYwNjA6Ci0JCW0tPnJlYWRyZWcgPSB6cjM2MDYwX3JlYWQ7Ci0JCW0tPndyaXRlcmVnID0genIzNjA2MF93cml0ZTsKLQkJbS0+ZmxhZ3MgfD0gQ09ERUNfRkxBR19KUEVHIHwgQ09ERUNfRkxBR19WRkU7Ci0JCWJyZWFrOwotCWNhc2UgQ09ERUNfVFlQRV9aUjM2MDUwOgotCQltLT5yZWFkcmVnID0genIzNjA1MF9yZWFkOwotCQltLT53cml0ZXJlZyA9IHpyMzYwNTBfd3JpdGU7Ci0JCW0tPmZsYWdzIHw9IENPREVDX0ZMQUdfSlBFRzsKLQkJYnJlYWs7Ci0JY2FzZSBDT0RFQ19UWVBFX1pSMzYwMTY6Ci0JCW0tPnJlYWRyZWcgPSB6cjM2MDE2X3JlYWQ7Ci0JCW0tPndyaXRlcmVnID0genIzNjAxNl93cml0ZTsKLQkJbS0+ZmxhZ3MgfD0gQ09ERUNfRkxBR19WRkU7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBtOwotfQotCi0vKgotICogICBTY2FuIGZvciBhIEJ1eiBjYXJkIChhY3R1YWxseSBmb3IgdGhlIFBDSSBjb250cm9sbGVyIFpSMzYwNTcpLAotICogICByZXF1ZXN0IHRoZSBpcnEgYW5kIG1hcCB0aGUgaW8gbWVtb3J5Ci0gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1maW5kX3pyMzYwNTcgKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciBsYXRlbmN5LCBuZWVkX2xhdGVuY3k7Ci0Jc3RydWN0IHpvcmFuICp6cjsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCB2aWRlb2NvZGVjX21hc3RlciAqbWFzdGVyX3ZmZSA9IE5VTEw7Ci0Jc3RydWN0IHZpZGVvY29kZWNfbWFzdGVyICptYXN0ZXJfY29kZWMgPSBOVUxMOwotCWludCBjYXJkX251bTsKLQljaGFyICppMmNfZW5jX25hbWUsICppMmNfZGVjX25hbWUsICpjb2RlY19uYW1lLCAqdmZlX25hbWU7Ci0KLQl6b3Jhbl9udW0gPSAwOwotCXdoaWxlICh6b3Jhbl9udW0gPCBCVVpfTUFYICYmCi0JICAgICAgIChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1pPUkFOLCBQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MDU3LCBkZXYpKSAhPSBOVUxMKSB7Ci0JCWNhcmRfbnVtID0gY2FyZFt6b3Jhbl9udW1dOwotCQl6ciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB6b3JhbiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXpyKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0ga3phbGxvYyBmYWlsZWRcbiIsCi0JCQkJWk9SQU5fTkFNRSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQl6ci0+cGNpX2RldiA9IGRldjsKLQkJLy96ci0+enIzNjA1N19tZW0gPSBOVUxMOwotCQl6ci0+aWQgPSB6b3Jhbl9udW07Ci0JCXNucHJpbnRmKFpSX0RFVk5BTUUoenIpLCBzaXplb2YoWlJfREVWTkFNRSh6cikpLCAiTUpQRUdbJXVdIiwgenItPmlkKTsKLQkJc3Bpbl9sb2NrX2luaXQoJnpyLT5zcGlubG9jayk7Ci0JCW11dGV4X2luaXQoJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCi0JCQlnb3RvIHpyX2ZyZWVfbWVtOwotCQl6ci0+enIzNjA1N19hZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoenItPnBjaV9kZXYsIDApOwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZSh6ci0+cGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLAotCQkJCSAgICAgJnpyLT5yZXZpc2lvbik7Ci0JCWlmICh6ci0+cmV2aXNpb24gPCAyKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9JTkZPCi0JCQkJIiVzOiBab3JhbiBaUjM2MDU3IChyZXYgJWQpIGlycTogJWQsIG1lbW9yeTogMHglMDh4LlxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgenItPnJldmlzaW9uLCB6ci0+cGNpX2Rldi0+aXJxLAotCQkJCXpyLT56cjM2MDU3X2Fkcik7Ci0KLQkJCWlmIChjYXJkX251bSA9PSAtMSkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIG5vIGNhcmQgc3BlY2lmaWVkLCBwbGVhc2UgdXNlIHRoZSBjYXJkPVggaW5zbW9kIG9wdGlvblxuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJCWdvdG8genJfZnJlZV9tZW07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaTsKLQkJCXVuc2lnbmVkIHNob3J0IHNzX3ZlbmRvciwgc3NfZGV2aWNlOwotCi0JCQlzc192ZW5kb3IgPSB6ci0+cGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvcjsKLQkJCXNzX2RldmljZSA9IHpyLT5wY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOwotCQkJZHByaW50aygxLAotCQkJCUtFUk5fSU5GTwotCQkJCSIlczogWm9yYW4gWlIzNjA2NyAocmV2ICVkKSBpcnE6ICVkLCBtZW1vcnk6IDB4JTA4eFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgenItPnJldmlzaW9uLCB6ci0+cGNpX2Rldi0+aXJxLAotCQkJCXpyLT56cjM2MDU3X2Fkcik7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9JTkZPCi0JCQkJIiVzOiBzdWJzeXN0ZW0gdmVuZG9yPTB4JTA0eCBpZD0weCUwNHhcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIHNzX3ZlbmRvciwgc3NfZGV2aWNlKTsKLQkJCWlmIChjYXJkX251bSA9PSAtMSkgewotCQkJCWRwcmludGsoMywKLQkJCQkJS0VSTl9ERUJVRwotCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gdHJ5aW5nIHRvIGF1dG9kZXRlY3QgY2FyZCB0eXBlXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQkJZm9yIChpPTA7aTxOVU1fQ0FSRFM7aSsrKSB7Ci0JCQkJCWlmIChzc192ZW5kb3IgPT0gem9yYW5fY2FyZHNbaV0udmVuZG9yX2lkICYmCi0JCQkJCSAgICBzc19kZXZpY2UgPT0gem9yYW5fY2FyZHNbaV0uZGV2aWNlX2lkKSB7Ci0JCQkJCQlkcHJpbnRrKDMsCi0JCQkJCQkJS0VSTl9ERUJVRwotCQkJCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBjYXJkICVzIGRldGVjdGVkXG4iLAotCQkJCQkJCVpSX0RFVk5BTUUoenIpLAotCQkJCQkJCXpvcmFuX2NhcmRzW2ldLm5hbWUpOwotCQkJCQkJY2FyZF9udW0gPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGkgPT0gTlVNX0NBUkRTKSB7Ci0JCQkJCWRwcmludGsoMSwKLQkJCQkJCUtFUk5fRVJSCi0JCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gdW5rbm93biBjYXJkXG4iLAotCQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJCQlnb3RvIHpyX2ZyZWVfbWVtOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjYXJkX251bSA8IDAgfHwgY2FyZF9udW0gPj0gTlVNX0NBUkRTKSB7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gaW52YWxpZCBjYXJkbnVtICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBjYXJkX251bSk7Ci0JCQlnb3RvIHpyX2ZyZWVfbWVtOwotCQl9Ci0KLQkJLyogZXZlbiB0aG91Z2ggd2UgbWFrZSB0aGlzIGEgbm9uIHBvaW50ZXIgYW5kIHRodXMKLQkJICogdGhlb3JldGljYWxseSBhbGxvdyBmb3IgbWFraW5nIGNoYW5nZXMgdG8gdGhpcyBzdHJ1Y3QKLQkJICogb24gYSBwZXItaW5kaXZpZHVhbCBjYXJkIGJhc2lzIGF0IHJ1bnRpbWUsIHRoaXMgaXMKLQkJICogc3Ryb25nbHkgZGlzY291cmFnZWQuIFRoaXMgc3RydWN0dXJlIGlzIGludGVuZGVkIHRvCi0JCSAqIGtlZXAgZ2VuZXJhbCBjYXJkIGluZm9ybWF0aW9uLCBubyBzZXR0aW5ncyBvciBhbnl0aGluZyAqLwotCQl6ci0+Y2FyZCA9IHpvcmFuX2NhcmRzW2NhcmRfbnVtXTsKLQkJc25wcmludGYoWlJfREVWTkFNRSh6ciksIHNpemVvZihaUl9ERVZOQU1FKHpyKSksCi0JCQkgIiVzWyV1XSIsIHpyLT5jYXJkLm5hbWUsIHpyLT5pZCk7Ci0KLQkJenItPnpyMzYwNTdfbWVtID0gaW9yZW1hcF9ub2NhY2hlKHpyLT56cjM2MDU3X2FkciwgMHgxMDAwKTsKLQkJaWYgKCF6ci0+enIzNjA1N19tZW0pIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBpb3JlbWFwIGZhaWxlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlnb3RvIHpyX2ZyZWVfbWVtOwotCQl9Ci0KLQkJcmVzdWx0ID0gcmVxdWVzdF9pcnEoenItPnBjaV9kZXYtPmlycSwKLQkJCQkgICAgIHpvcmFuX2lycSwKLQkJCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwKLQkJCQkgICAgIFpSX0RFVk5BTUUoenIpLAotCQkJCSAgICAgKHZvaWQgKikgenIpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJaWYgKHJlc3VsdCA9PSAtRUlOVkFMKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gYmFkIGlycSBudW1iZXIgb3IgaGFuZGxlclxuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gLUVCVVNZKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGZpbmRfenIzNjA1NygpIC0gSVJRICVkIGJ1c3ksIGNoYW5nZSB5b3VyIFBuUCBjb25maWcgaW4gQklPU1xuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIHpyLT5wY2lfZGV2LT5pcnEpOwotCQkJfSBlbHNlIHsKLQkJCQlkcHJpbnRrKDEsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBjYW4ndCBhc3NpZ24gaXJxLCBlcnJvciBjb2RlICVkXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSwgcmVzdWx0KTsKLQkJCX0KLQkJCWdvdG8genJfdW5tYXA7Ci0JCX0KLQotCQkvKiBzZXQgUENJIGxhdGVuY3kgdGltZXIgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoenItPnBjaV9kZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAotCQkJCSAgICAgJmxhdGVuY3kpOwotCQluZWVkX2xhdGVuY3kgPSB6ci0+cmV2aXNpb24gPiAxID8gMzIgOiA0ODsKLQkJaWYgKGxhdGVuY3kgIT0gbmVlZF9sYXRlbmN5KSB7Ci0JCQlkcHJpbnRrKDIsCi0JCQkJS0VSTl9JTkZPCi0JCQkJIiVzOiBDaGFuZ2luZyBQQ0kgbGF0ZW5jeSBmcm9tICVkIHRvICVkLlxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgbGF0ZW5jeSwgbmVlZF9sYXRlbmN5KTsKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZSh6ci0+cGNpX2RldiwKLQkJCQkJICAgICAgUENJX0xBVEVOQ1lfVElNRVIsCi0JCQkJCSAgICAgIG5lZWRfbGF0ZW5jeSk7Ci0JCX0KLQotCQl6cjM2MDU3X3Jlc3RhcnQoenIpOwotCQkvKiBpMmMgKi8KLQkJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBJbml0aWFsaXppbmcgaTJjIGJ1cy4uLlxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQotCQkvKiBpMmMgZGVjb2RlciAqLwotCQlpZiAoZGVjb2Rlclt6ci0+aWRdICE9IC0xKSB7Ci0JCQlpMmNfZGVjX25hbWUgPSBpMmNpZF90b19tb2R1bGVuYW1lKGRlY29kZXJbenItPmlkXSk7Ci0JCQl6ci0+Y2FyZC5pMmNfZGVjb2RlciA9IGRlY29kZXJbenItPmlkXTsKLQkJfSBlbHNlIGlmICh6ci0+Y2FyZC5pMmNfZGVjb2RlciAhPSAwKSB7Ci0JCQlpMmNfZGVjX25hbWUgPQotCQkJCWkyY2lkX3RvX21vZHVsZW5hbWUoenItPmNhcmQuaTJjX2RlY29kZXIpOwotCQl9IGVsc2UgewotCQkJaTJjX2RlY19uYW1lID0gTlVMTDsKLQkJfQotCi0JCWlmIChpMmNfZGVjX25hbWUpIHsKLQkJCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoaTJjX2RlY19uYW1lKSkgPCAwKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGZhaWxlZCB0byBsb2FkIG1vZHVsZSAlczogJWRcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpLCBpMmNfZGVjX25hbWUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBpMmMgZW5jb2RlciAqLwotCQlpZiAoZW5jb2Rlclt6ci0+aWRdICE9IC0xKSB7Ci0JCQlpMmNfZW5jX25hbWUgPSBpMmNpZF90b19tb2R1bGVuYW1lKGVuY29kZXJbenItPmlkXSk7Ci0JCQl6ci0+Y2FyZC5pMmNfZW5jb2RlciA9IGVuY29kZXJbenItPmlkXTsKLQkJfSBlbHNlIGlmICh6ci0+Y2FyZC5pMmNfZW5jb2RlciAhPSAwKSB7Ci0JCQlpMmNfZW5jX25hbWUgPQotCQkJCWkyY2lkX3RvX21vZHVsZW5hbWUoenItPmNhcmQuaTJjX2VuY29kZXIpOwotCQl9IGVsc2UgewotCQkJaTJjX2VuY19uYW1lID0gTlVMTDsKLQkJfQotCi0JCWlmIChpMmNfZW5jX25hbWUpIHsKLQkJCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoaTJjX2VuY19uYW1lKSkgPCAwKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGZhaWxlZCB0byBsb2FkIG1vZHVsZSAlczogJWRcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpLCBpMmNfZW5jX25hbWUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoem9yYW5fcmVnaXN0ZXJfaTJjKHpyKSA8IDApIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogZmluZF96cjM2MDU3KCkgLSBjYW4ndCBpbml0aWFsaXplIGkyYyBidXNcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJZ290byB6cl9mcmVlX2lycTsKLQkJfQotCi0JCWRwcmludGsoMiwKLQkJCUtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyB2aWRlb2NvZGVjIGJ1cy4uLlxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQotCQlpZiAoenItPmNhcmQudmlkZW9fY29kZWMgIT0gMCAmJgotCQkgICAgKGNvZGVjX25hbWUgPQotCQkgICAgIGNvZGVjaWRfdG9fbW9kdWxlbmFtZSh6ci0+Y2FyZC52aWRlb19jb2RlYykpICE9IE5VTEwpIHsKLQkJCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoY29kZWNfbmFtZSkpIDwgMCkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBmYWlsZWQgdG8gbG9hZCBtb2R1bGVzICVzOiAlZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGNvZGVjX25hbWUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHpyLT5jYXJkLnZpZGVvX3ZmZSAhPSAwICYmCi0JCSAgICAodmZlX25hbWUgPQotCQkgICAgIGNvZGVjaWRfdG9fbW9kdWxlbmFtZSh6ci0+Y2FyZC52aWRlb192ZmUpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfbW9kdWxlKHZmZV9uYW1lKSkgPCAwKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGZhaWxlZCB0byBsb2FkIG1vZHVsZXMgJXM6ICVkXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSwgdmZlX25hbWUsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiByZXNldCBKUEVHIGNvZGVjICovCi0JCWpwZWdfY29kZWNfc2xlZXAoenIsIDEpOwotCQlqcGVnX2NvZGVjX3Jlc2V0KHpyKTsKLQkJLyogdmlkZW8gYnVzIGVuYWJsZWQgKi8KLQkJLyogZGlzcGxheSBjb2RlYyByZXZpc2lvbiAqLwotCQlpZiAoenItPmNhcmQudmlkZW9fY29kZWMgIT0gMCkgewotCQkJbWFzdGVyX2NvZGVjID0gem9yYW5fc2V0dXBfdmlkZW9jb2RlYyh6ciwKLQkJCQkJCQkgICAgICB6ci0+Y2FyZC52aWRlb19jb2RlYyk7Ci0JCQlpZiAoIW1hc3Rlcl9jb2RlYykKLQkJCQlnb3RvIHpyX3VucmVnX2kyYzsKLQkJCXpyLT5jb2RlYyA9IHZpZGVvY29kZWNfYXR0YWNoKG1hc3Rlcl9jb2RlYyk7Ci0JCQlpZiAoIXpyLT5jb2RlYykgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIG5vIGNvZGVjIGZvdW5kXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQkJZ290byB6cl9mcmVlX2NvZGVjOwotCQkJfQotCQkJaWYgKHpyLT5jb2RlYy0+dHlwZSAhPSB6ci0+Y2FyZC52aWRlb19jb2RlYykgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIHdyb25nIGNvZGVjXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQkJZ290byB6cl9kZXRhY2hfY29kZWM7Ci0JCQl9Ci0JCX0KLQkJaWYgKHpyLT5jYXJkLnZpZGVvX3ZmZSAhPSAwKSB7Ci0JCQltYXN0ZXJfdmZlID0gem9yYW5fc2V0dXBfdmlkZW9jb2RlYyh6ciwKLQkJCQkJCQkgICAgenItPmNhcmQudmlkZW9fdmZlKTsKLQkJCWlmICghbWFzdGVyX3ZmZSkKLQkJCQlnb3RvIHpyX2RldGFjaF9jb2RlYzsKLQkJCXpyLT52ZmUgPSB2aWRlb2NvZGVjX2F0dGFjaChtYXN0ZXJfdmZlKTsKLQkJCWlmICghenItPnZmZSkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBmaW5kX3pyMzYwNTcoKSAtIG5vIFZGRSBmb3VuZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJCWdvdG8genJfZnJlZV92ZmU7Ci0JCQl9Ci0JCQlpZiAoenItPnZmZS0+dHlwZSAhPSB6ci0+Y2FyZC52aWRlb192ZmUpIHsKLQkJCQlkcHJpbnRrKDEsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogZmluZF96cjM2MDU3KCkgPSB3cm9uZyBWRkVcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCQlnb3RvIHpyX2RldGFjaF92ZmU7Ci0JCQl9Ci0JCX0KLQkJLyogU3VjY2VzcyBzbyBrZWVwIHRoZSBwY2lfZGV2IHJlZmVyZW5jZWQgKi8KLQkJcGNpX2Rldl9nZXQoenItPnBjaV9kZXYpOwotCQl6b3Jhblt6b3Jhbl9udW0rK10gPSB6cjsKLQkJY29udGludWU7Ci0KLQkJLy8gSW5pdCBlcnJvcnMKLQkgICAgICB6cl9kZXRhY2hfdmZlOgotCQl2aWRlb2NvZGVjX2RldGFjaCh6ci0+dmZlKTsKLQkgICAgICB6cl9mcmVlX3ZmZToKLQkJa2ZyZWUobWFzdGVyX3ZmZSk7Ci0JICAgICAgenJfZGV0YWNoX2NvZGVjOgotCQl2aWRlb2NvZGVjX2RldGFjaCh6ci0+Y29kZWMpOwotCSAgICAgIHpyX2ZyZWVfY29kZWM6Ci0JCWtmcmVlKG1hc3Rlcl9jb2RlYyk7Ci0JICAgICAgenJfdW5yZWdfaTJjOgotCQl6b3Jhbl91bnJlZ2lzdGVyX2kyYyh6cik7Ci0JICAgICAgenJfZnJlZV9pcnE6Ci0JCWJ0d3JpdGUoMCwgWlIzNjA1N19TUEdQUENSKTsKLQkJZnJlZV9pcnEoenItPnBjaV9kZXYtPmlycSwgenIpOwotCSAgICAgIHpyX3VubWFwOgotCQlpb3VubWFwKHpyLT56cjM2MDU3X21lbSk7Ci0JICAgICAgenJfZnJlZV9tZW06Ci0JCWtmcmVlKHpyKTsKLQkJY29udGludWU7Ci0JfQotCWlmIChkZXYpCS8qIENsZWFuIHVwIHJlZiBjb3VudCBvbiBlYXJseSBleGl0ICovCi0JCXBjaV9kZXZfcHV0KGRldik7Ci0KLQlpZiAoem9yYW5fbnVtID09IDApIHsKLQkJZHByaW50aygxLCBLRVJOX0lORk8gIk5vIGtub3duIE1KUEVHIGNhcmRzIGZvdW5kLlxuIik7Ci0JfQotCXJldHVybiB6b3Jhbl9udW07Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1pbml0X2RjMTBfY2FyZHMgKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQltZW1zZXQoem9yYW4sIDAsIHNpemVvZih6b3JhbikpOwotCXByaW50ayhLRVJOX0lORk8gIlpvcmFuIE1KUEVHIGJvYXJkIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCSAgICAgICBNQUpPUl9WRVJTSU9OLCBNSU5PUl9WRVJTSU9OLCBSRUxFQVNFX1ZFUlNJT04pOwotCi0JLyogTG9vayBmb3IgY2FyZHMgKi8KLQlpZiAoZmluZF96cjM2MDU3KCkgPCAwKSB7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAoem9yYW5fbnVtID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogJWQgY2FyZChzKSBmb3VuZFxuIiwgWk9SQU5fTkFNRSwKLQkJem9yYW5fbnVtKTsKLQkvKiBjaGVjayB0aGUgcGFyYW1ldGVycyB3ZSBoYXZlIGJlZW4gZ2l2ZW4sIGFkanVzdCBpZiBuZWNlc3NhcnkgKi8KLQlpZiAodjRsX25idWZzIDwgMikKLQkJdjRsX25idWZzID0gMjsKLQlpZiAodjRsX25idWZzID4gVklERU9fTUFYX0ZSQU1FKQotCQl2NGxfbmJ1ZnMgPSBWSURFT19NQVhfRlJBTUU7Ci0JLyogVGhlIHVzZXIgc3BlY2ZpZXMgdGhlIGluIEtCLCB3ZSB3YW50IHRoZW0gaW4gYnl0ZQotCSAqIChhbmQgcGFnZSBhbGlnbmVkKSAqLwotCXY0bF9idWZzaXplID0gUEFHRV9BTElHTih2NGxfYnVmc2l6ZSAqIDEwMjQpOwotCWlmICh2NGxfYnVmc2l6ZSA8IDMyNzY4KQotCQl2NGxfYnVmc2l6ZSA9IDMyNzY4OwotCS8qIDIgTUIgaXMgYXJiaXRyYXJ5IGJ1dCBzdWZmaWNpZW50IGZvciB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbWFnZXMgKi8KLQlpZiAodjRsX2J1ZnNpemUgPiAyMDQ4ICogMTAyNCkKLQkJdjRsX2J1ZnNpemUgPSAyMDQ4ICogMTAyNDsKLQlpZiAoanBnX25idWZzIDwgNCkKLQkJanBnX25idWZzID0gNDsKLQlpZiAoanBnX25idWZzID4gQlVaX01BWF9GUkFNRSkKLQkJanBnX25idWZzID0gQlVaX01BWF9GUkFNRTsKLQlqcGdfYnVmc2l6ZSA9IFBBR0VfQUxJR04oanBnX2J1ZnNpemUgKiAxMDI0KTsKLQlpZiAoanBnX2J1ZnNpemUgPCA4MTkyKQotCQlqcGdfYnVmc2l6ZSA9IDgxOTI7Ci0JaWYgKGpwZ19idWZzaXplID4gKDUxMiAqIDEwMjQpKQotCQlqcGdfYnVmc2l6ZSA9IDUxMiAqIDEwMjQ7Ci0JLyogVXNlIHBhcmFtZXRlciBmb3IgdmlkbWVtIG9yIHRyeSB0byBmaW5kIGEgdmlkZW8gY2FyZCAqLwotCWlmICh2aWRtZW0pIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9JTkZPCi0JCQkiJXM6IFVzaW5nIHN1cHBsaWVkIHZpZGVvIG1lbW9yeSBiYXNlIGFkZHJlc3MgQCAweCVseFxuIiwKLQkJCVpPUkFOX05BTUUsIHZpZG1lbSk7Ci0JfQotCi0JLyogcmFuZG9tIG5vbnNlbnNlICovCi0JZHByaW50ayg2LCBLRVJOX0RFQlVHICJKb3R0aSBpcyBlZW4gaGVsZCFcbiIpOwotCi0JLyogc29tZSBtYWluYm9hcmRzIG1pZ2h0IG5vdCBkbyBQQ0ktUENJIGRhdGEgdHJhbnNmZXIgd2VsbCAqLwotCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9GQUlMfFBDSUFHUF9GQUlMfFBDSVBDSV9BTElNQUdJSykpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9XQVJOSU5HCi0JCQkiJXM6IGNoaXBzZXQgZG9lcyBub3Qgc3VwcG9ydCByZWxpYWJsZSBQQ0ktUENJIERNQVxuIiwKLQkJCVpPUkFOX05BTUUpOwotCX0KLQotCS8qIHRha2UgY2FyZSBvZiBOYXRvbWEgY2hpcHNldCBhbmQgYSByZXZpc2lvbiAxIHpyMzYwNTcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtOyBpKyspIHsKLQkJc3RydWN0IHpvcmFuICp6ciA9IHpvcmFuW2ldOwotCi0JCWlmICgocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9OQVRPTUEpICYmIHpyLT5yZXZpc2lvbiA8PSAxKSB7Ci0JCQl6ci0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzID0gMTsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0lORk8KLQkJCQkiJXM6IFpSMzYwNTcvTmF0b21hIGJ1ZywgbWF4LiBidWZmZXIgc2l6ZSBpcyAxMjhLXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJfQotCi0JCWlmICh6cjM2MDU3X2luaXQoenIpIDwgMCkgewotCQkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bTsgaSsrKQotCQkJCXpvcmFuX3JlbGVhc2Uoem9yYW5baV0pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJem9yYW5fcHJvY19pbml0KHpyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci11bmxvYWRfZGMxMF9jYXJkcyAodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW07IGkrKykKLQkJem9yYW5fcmVsZWFzZSh6b3JhbltpXSk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfZGMxMF9jYXJkcyk7Ci1tb2R1bGVfZXhpdCh1bmxvYWRfZGMxMF9jYXJkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkMzY5Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0OSArMCwwIEBACi0vKgotICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQotICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4Ci0gKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgotICoKLSAqIFRoaXMgcGFydCBoYW5kbGVzIGRldmljZSBhY2Nlc3MgKFBDSS9JMkMvY29kZWMvLi4uKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTZXJndWVpIE1pcmlkb25vdiA8bWlyc2V2QGNpY2VzZS5teD4KLSAqCi0gKiBDdXJyZW50bHkgbWFpbnRhaW5lZCBieToKLSAqICAgUm9uYWxkIEJ1bHRqZSAgICA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgotICogICBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZT4KLSAqICAgTWFpbGluZ2xpc3QgICAgICA8bWpwZWctdXNlcnNAbGlzdHMuc2YubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9fZW5jb2Rlci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAidmlkZW9jb2RlYy5oIgotI2luY2x1ZGUgInpvcmFuLmgiCi0jaW5jbHVkZSAiem9yYW5fZGV2aWNlLmgiCi0jaW5jbHVkZSAiem9yYW5fY2FyZC5oIgotCi0jZGVmaW5lIElSUV9NQVNLICggWlIzNjA1N19JU1JfR0lSUTAgfCBcCi0JCSAgIFpSMzYwNTdfSVNSX0dJUlExIHwgXAotCQkgICBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRICkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgem9yYW5fZm9ybWF0c1tdOwotCi1zdGF0aWMgaW50IGxtbDMzZHBhdGg7CQkvKiBkZWZhdWx0ID0gMAotCQkJCSAqIDEgd2lsbCB1c2UgZGlnaXRhbCBwYXRoIGluIGNhcHR1cmUKLQkJCQkgKiBtb2RlIGluc3RlYWQgb2YgYW5hbG9nLiBJdCBjYW4gYmUKLQkJCQkgKiB1c2VkIGZvciBwaWN0dXJlIGFkanVzdG1lbnRzIHVzaW5nCi0JCQkJICogdG9vbCBsaWtlIHhhd3R2IHdoaWxlIHdhdGNoaW5nIGltYWdlCi0JCQkJICogb24gVFYgbW9uaXRvciBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dC4KLQkJCQkgKiBIb3dldmVyLCBkdWUgdG8gYWJzZW5jZSBvZiA3NSBPaG0KLQkJCQkgKiBsb2FkIG9uIEJ0ODE5IGlucHV0LCB0aGVyZSB3aWxsIGJlCi0JCQkJICogc29tZSBpbWFnZSBpbXBlcmZlY3Rpb25zICovCi0KLW1vZHVsZV9wYXJhbShsbWwzM2RwYXRoLCBib29sLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobG1sMzNkcGF0aCwKLQkJICJVc2UgZGlnaXRhbCBwYXRoIGNhcHR1cmUgbW9kZSAob24gTE1MMzMgY2FyZHMpIik7Ci0KLXN0YXRpYyB2b2lkCi16cjM2MDU3X2luaXRfdmZlIChzdHJ1Y3Qgem9yYW4gKnpyKTsKLQotLyoKLSAqIEdlbmVyYWwgUHVycG9zZSBJL08gYW5kIEd1ZXN0IGJ1cyBhY2Nlc3MKLSAqLwotCi0vKgotICogVGhpcyBpcyBhIGJpdCB0cmlja3kuIFdoZW4gYSBib2FyZCBsYWNrcyBhIEdQSU8gZnVuY3Rpb24sIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBHUElPIGJpdCBudW1iZXIgaW4gdGhlIGNhcmRfaW5mbyBzdHJ1Y3R1cmUgaXMgc2V0IHRvIDAuCi0gKi8KLQotdm9pZAotR1BJTyAoc3RydWN0IHpvcmFuICp6ciwKLSAgICAgIGludCAgICAgICAgICAgYml0LAotICAgICAgdW5zaWduZWQgaW50ICB2YWx1ZSkKLXsKLQl1MzIgcmVnOwotCXUzMiBtYXNrOwotCi0JLyogTWFrZSBzdXJlIHRoZSBiaXQgbnVtYmVyIGlzIGxlZ2FsCi0JICogQSBiaXQgbnVtYmVyIG9mIC0xIChsYWNraW5nKSBnaXZlcyBhIG1hc2sgb2YgMCwKLQkgKiBtYWtpbmcgaXQgaGFybWxlc3MgKi8KLQltYXNrID0gKDEgPDwgKDI0ICsgYml0KSkgJiAweGZmMDAwMDAwOwotCXJlZyA9IGJ0cmVhZChaUjM2MDU3X0dQUEdDUjEpICYgfm1hc2s7Ci0JaWYgKHZhbHVlKSB7Ci0JCXJlZyB8PSBtYXNrOwotCX0KLQlidHdyaXRlKHJlZywgWlIzNjA1N19HUFBHQ1IxKTsKLQl1ZGVsYXkoMSk7Ci19Ci0KLS8qCi0gKiBXYWl0IHRpbCBwb3N0IG9mZmljZSBpcyBubyBsb25nZXIgYnVzeQotICovCi0KLWludAotcG9zdF9vZmZpY2Vfd2FpdCAoc3RydWN0IHpvcmFuICp6cikKLXsKLQl1MzIgcG9yOwotCi0vLyAgICAgIHdoaWxlICgoKHBvciA9IGJ0cmVhZChaUjM2MDU3X1BPUikpICYgKFpSMzYwNTdfUE9SX1BPUGVuIHwgWlIzNjA1N19QT1JfUE9UaW1lKSkgPT0gWlIzNjA1N19QT1JfUE9QZW4pIHsKLQl3aGlsZSAoKHBvciA9IGJ0cmVhZChaUjM2MDU3X1BPUikpICYgWlIzNjA1N19QT1JfUE9QZW4pIHsKLQkJLyogd2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiAqLwotCX0KLQlpZiAoKHBvciAmIFpSMzYwNTdfUE9SX1BPVGltZSkgJiYgIXpyLT5jYXJkLmd3c19ub3RfY29ubmVjdGVkKSB7Ci0JCS8qIEluIExNTDMzL0JVWiBcR1dTIGxpbmUgaXMgbm90IGNvbm5lY3RlZCwgc28gaXQgaGFzIGFsd2F5cyB0aW1lb3V0IHNldCAqLwotCQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHBvcCB0aW1lb3V0ICUwOHhcbiIsIFpSX0RFVk5BTUUoenIpLAotCQkJcG9yKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQKLXBvc3Rfb2ZmaWNlX3dyaXRlIChzdHJ1Y3Qgem9yYW4gKnpyLAotCQkgICB1bnNpZ25lZCBpbnQgIGd1ZXN0LAotCQkgICB1bnNpZ25lZCBpbnQgIHJlZywKLQkJICAgdW5zaWduZWQgaW50ICB2YWx1ZSkKLXsKLQl1MzIgcG9yOwotCi0JcG9yID0KLQkgICAgWlIzNjA1N19QT1JfUE9EaXIgfCBaUjM2MDU3X1BPUl9QT1RpbWUgfCAoKGd1ZXN0ICYgNykgPDwgMjApIHwKLQkgICAgKChyZWcgJiA3KSA8PCAxNikgfCAodmFsdWUgJiAweEZGKTsKLQlidHdyaXRlKHBvciwgWlIzNjA1N19QT1IpOwotCi0JcmV0dXJuIHBvc3Rfb2ZmaWNlX3dhaXQoenIpOwotfQotCi1pbnQKLXBvc3Rfb2ZmaWNlX3JlYWQgKHN0cnVjdCB6b3JhbiAqenIsCi0JCSAgdW5zaWduZWQgaW50ICBndWVzdCwKLQkJICB1bnNpZ25lZCBpbnQgIHJlZykKLXsKLQl1MzIgcG9yOwotCi0JcG9yID0gWlIzNjA1N19QT1JfUE9UaW1lIHwgKChndWVzdCAmIDcpIDw8IDIwKSB8ICgocmVnICYgNykgPDwgMTYpOwotCWJ0d3JpdGUocG9yLCBaUjM2MDU3X1BPUik7Ci0JaWYgKHBvc3Rfb2ZmaWNlX3dhaXQoenIpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIGJ0cmVhZChaUjM2MDU3X1BPUikgJiAweEZGOwotfQotCi0vKgotICogZGV0ZWN0IGd1ZXN0cwotICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2d1ZXN0cyAoc3RydWN0IHpvcmFuICp6cikKLXsKLQlpZiAoenIzNjA2N19kZWJ1ZyA+IDIpIHsKLQkJaW50IGksIGd1ZXN0WzhdOwotCi0JCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsJLy8gRG9uJ3QgcmVhZCBqcGVnIGNvZGVjIGhlcmUKLQkJCWd1ZXN0W2ldID0gcG9zdF9vZmZpY2VfcmVhZCh6ciwgaSwgMCk7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICIlczogR3Vlc3RzOiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7Ci0JCQlwcmludGsoIiAweCUwMngiLCBndWVzdFtpXSk7Ci0JCX0KLQkJcHJpbnRrKCJcbiIpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1nZXRfdGltZSAodm9pZCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXJldHVybiAoMTAwMDAwMCAqIHR2LnR2X3NlYyArIHR2LnR2X3VzZWMpOwotfQotCi12b2lkCi1kZXRlY3RfZ3Vlc3RfYWN0aXZpdHkgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JaW50IHRpbWVvdXQsIGksIGosIHJlcywgZ3Vlc3RbOF0sIGd1ZXN0MFs4XSwgY2hhbmdlWzhdWzNdOwotCXVuc2lnbmVkIGxvbmcgdDAsIHQxOwotCi0JZHVtcF9ndWVzdHMoenIpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXRlY3RpbmcgZ3Vlc3RzIGFjdGl2aXR5LCBwbGVhc2Ugd2FpdC4uLlxuIiwKLQkgICAgICAgWlJfREVWTkFNRSh6cikpOwotCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHsJLy8gRG9uJ3QgcmVhZCBqcGVnIGNvZGVjIGhlcmUKLQkJZ3Vlc3QwW2ldID0gZ3Vlc3RbaV0gPSBwb3N0X29mZmljZV9yZWFkKHpyLCBpLCAwKTsKLQl9Ci0KLQl0aW1lb3V0ID0gMDsKLQlqID0gMDsKLQl0MCA9IGdldF90aW1lKCk7Ci0Jd2hpbGUgKHRpbWVvdXQgPCAxMDAwMCkgewotCQl1ZGVsYXkoMTApOwotCQl0aW1lb3V0Kys7Ci0JCWZvciAoaSA9IDE7IChpIDwgOCkgJiYgKGogPCA4KTsgaSsrKSB7Ci0JCQlyZXMgPSBwb3N0X29mZmljZV9yZWFkKHpyLCBpLCAwKTsKLQkJCWlmIChyZXMgIT0gZ3Vlc3RbaV0pIHsKLQkJCQl0MSA9IGdldF90aW1lKCk7Ci0JCQkJY2hhbmdlW2pdWzBdID0gKHQxIC0gdDApOwotCQkJCXQwID0gdDE7Ci0JCQkJY2hhbmdlW2pdWzFdID0gaTsKLQkJCQljaGFuZ2Vbal1bMl0gPSByZXM7Ci0JCQkJaisrOwotCQkJCWd1ZXN0W2ldID0gcmVzOwotCQkJfQotCQl9Ci0JCWlmIChqID49IDgpCi0JCQlicmVhazsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEd1ZXN0czoiLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7Ci0JCXByaW50aygiIDB4JTAyeCIsIGd1ZXN0MFtpXSk7Ci0JfQotCXByaW50aygiXG4iKTsKLQlpZiAoaiA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBhY3Rpdml0eSBkZXRlY3RlZC5cbiIsIFpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiAlNmQ6ICVkID0+IDB4JTAyeFxuIiwgWlJfREVWTkFNRSh6ciksCi0JCSAgICAgICBjaGFuZ2VbaV1bMF0sIGNoYW5nZVtpXVsxXSwgY2hhbmdlW2ldWzJdKTsKLQl9Ci19Ci0KLS8qCi0gKiBKUEVHIENvZGVjIGFjY2VzcwotICovCi0KLXZvaWQKLWpwZWdfY29kZWNfc2xlZXAgKHN0cnVjdCB6b3JhbiAqenIsCi0JCSAgaW50ICAgICAgICAgICBzbGVlcCkKLXsKLQlHUElPKHpyLCB6ci0+Y2FyZC5ncGlvW1pSX0dQSU9fSlBFR19TTEVFUF0sICFzbGVlcCk7Ci0JaWYgKCFzbGVlcCkgewotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IGpwZWdfY29kZWNfc2xlZXAoKSAtIHdha2UgR1BJTz0weCUwOHhcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgYnRyZWFkKFpSMzYwNTdfR1BQR0NSMSkpOwotCQl1ZGVsYXkoNTAwKTsKLQl9IGVsc2UgewotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IGpwZWdfY29kZWNfc2xlZXAoKSAtIHNsZWVwIEdQSU89MHglMDh4XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGJ0cmVhZChaUjM2MDU3X0dQUEdDUjEpKTsKLQkJdWRlbGF5KDIpOwotCX0KLX0KLQotaW50Ci1qcGVnX2NvZGVjX3Jlc2V0IChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCS8qIFRha2UgdGhlIGNvZGVjIG91dCBvZiBzbGVlcCAqLwotCWpwZWdfY29kZWNfc2xlZXAoenIsIDApOwotCi0JaWYgKHpyLT5jYXJkLmdwY3NbR1BDU19KUEVHX1JFU0VUXSAhPSAweGZmKSB7Ci0JCXBvc3Rfb2ZmaWNlX3dyaXRlKHpyLCB6ci0+Y2FyZC5ncGNzW0dQQ1NfSlBFR19SRVNFVF0sIDAsCi0JCQkJICAwKTsKLQkJdWRlbGF5KDIpOwotCX0gZWxzZSB7Ci0JCUdQSU8oenIsIHpyLT5jYXJkLmdwaW9bWlJfR1BJT19KUEVHX1JFU0VUXSwgMCk7Ci0JCXVkZWxheSgyKTsKLQkJR1BJTyh6ciwgenItPmNhcmQuZ3Bpb1taUl9HUElPX0pQRUdfUkVTRVRdLCAxKTsKLQkJdWRlbGF5KDIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogICBTZXQgdGhlIHJlZ2lzdGVycyBmb3IgdGhlIHNpemUgd2UgaGF2ZSBzcGVjaWZpZWQuIERvbid0IGJvdGhlcgotICogICB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGlzIHdpdGhvdXQgdGhlIFpSMzYwNTcgbWFudWFsIGluIGZyb250IG9mCi0gKiAgIHlvdSBbQUNdLgotICoKLSAqICAgUFM6IFRoZSBtYW51YWwgaXMgZnJlZSBmb3IgZG93bmxvYWQgaW4gLnBkZiBmb3JtYXQgZnJvbQotICogICB3d3cuem9yYW4uY29tIC0gbmljZWx5IGRvbmUgdGhvc2UgZm9sa3MuCi0gKi8KLQotc3RhdGljIHZvaWQKLXpyMzYwNTdfYWRqdXN0X3ZmZSAoc3RydWN0IHpvcmFuICAgICAgICAgICp6ciwKLQkJICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSAgbW9kZSkKLXsKLQl1MzIgcmVnOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzoKLQkJYnRhbmQoflpSMzYwNTdfVkZFU1BGUl9FeHRGbCwgWlIzNjA1N19WRkVTUEZSKTsKLQkJcmVnID0gYnRyZWFkKFpSMzYwNTdfVkZFSENSKTsKLQkJaWYgKChyZWcgJiAoMSA8PCAxMCkpICYmIHpyLT5jYXJkLnR5cGUgIT0gTE1MMzNSMTApIHsKLQkJCXJlZyArPSAoKDEgPDwgMTApIHwgMSk7Ci0JCX0KLQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFSENSKTsKLQkJYnJlYWs7Ci0JY2FzZSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M6Ci0JY2FzZSBCVVpfTU9ERV9JRExFOgotCWRlZmF1bHQ6Ci0JCWlmICh6ci0+bm9ybSA9PSBWSURFT19NT0RFX05UU0MgfHwKLQkJICAgICh6ci0+Y2FyZC50eXBlID09IExNTDMzUjEwICYmCi0JCSAgICAgenItPm5vcm0gPT0gVklERU9fTU9ERV9QQUwpKQotCQkJYnRhbmQoflpSMzYwNTdfVkZFU1BGUl9FeHRGbCwgWlIzNjA1N19WRkVTUEZSKTsKLQkJZWxzZQotCQkJYnRvcihaUjM2MDU3X1ZGRVNQRlJfRXh0RmwsIFpSMzYwNTdfVkZFU1BGUik7Ci0JCXJlZyA9IGJ0cmVhZChaUjM2MDU3X1ZGRUhDUik7Ci0JCWlmICghKHJlZyAmICgxIDw8IDEwKSkgJiYgenItPmNhcmQudHlwZSAhPSBMTUwzM1IxMCkgewotCQkJcmVnIC09ICgoMSA8PCAxMCkgfCAxKTsKLQkJfQotCQlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVIQ1IpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiBzZXQgZ2VvbWV0cnkKLSAqLwotCi1zdGF0aWMgdm9pZAotenIzNjA1N19zZXRfdmZlIChzdHJ1Y3Qgem9yYW4gICAgICAgICAgICAgICp6ciwKLQkJIGludCAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3dpZHRoLAotCQkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9faGVpZ2h0LAotCQkgY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCAqZm9ybWF0KQotewotCXN0cnVjdCB0dm5vcm0gKnR2bjsKLQl1bnNpZ25lZCBIU3RhcnQsIEhFbmQsIFZTdGFydCwgVkVuZDsKLQl1bnNpZ25lZCBEaXNwTW9kZTsKLQl1bnNpZ25lZCBWaWRXaW5XaWQsIFZpZFdpbkh0OwotCXVuc2lnbmVkIGhjcm9wMSwgaGNyb3AyLCB2Y3JvcDEsIHZjcm9wMjsKLQl1bnNpZ25lZCBXYSwgV2UsIEhhLCBIZTsKLQl1bnNpZ25lZCBYLCBZLCBIb3JEY20sIFZlckRjbTsKLQl1MzIgcmVnOwotCXVuc2lnbmVkIG1hc2tfbGluZV9zaXplOwotCi0JdHZuID0genItPnRpbWluZzsKLQotCVdhID0gdHZuLT5XYTsKLQlIYSA9IHR2bi0+SGE7Ci0KLQlkcHJpbnRrKDIsIEtFUk5fSU5GTyAiJXM6IHNldF92ZmUoKSAtIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAotCQlaUl9ERVZOQU1FKHpyKSwgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodCk7Ci0KLQlpZiAoenItPm5vcm0gIT0gVklERU9fTU9ERV9QQUwgJiYKLQkgICAgenItPm5vcm0gIT0gVklERU9fTU9ERV9OVFNDICYmCi0JICAgIHpyLT5ub3JtICE9IFZJREVPX01PREVfU0VDQU0pIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIgIiVzOiBzZXRfdmZlKCkgLSBub3JtID0gJWQgbm90IHZhbGlkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIHpyLT5ub3JtKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmlkZW9fd2lkdGggPCBCVVpfTUlOX1dJRFRIIHx8Ci0JICAgIHZpZGVvX2hlaWdodCA8IEJVWl9NSU5fSEVJR0hUIHx8Ci0JICAgIHZpZGVvX3dpZHRoID4gV2EgfHwgdmlkZW9faGVpZ2h0ID4gSGEpIHsKLQkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IHNldF92ZmU6IHc9JWQgaD0lZCBub3QgdmFsaWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioqKiB6cjM2MDU3ICoqKiovCi0KLQkvKiBob3Jpem9udGFsICovCi0JVmlkV2luV2lkID0gdmlkZW9fd2lkdGg7Ci0JWCA9IChWaWRXaW5XaWQgKiA2NCArIHR2bi0+V2EgLSAxKSAvIHR2bi0+V2E7Ci0JV2UgPSAoVmlkV2luV2lkICogNjQpIC8gWDsKLQlIb3JEY20gPSA2NCAtIFg7Ci0JaGNyb3AxID0gMiAqICgodHZuLT5XYSAtIFdlKSAvIDQpOwotCWhjcm9wMiA9IHR2bi0+V2EgLSBXZSAtIGhjcm9wMTsKLQlIU3RhcnQgPSB0dm4tPkhTdGFydCA/IHR2bi0+SFN0YXJ0IDogMTsKLQkvKiAoUm9uYWxkKSBPcmlnaW5hbCBjb21tZW50OgotCSAqICJ8IDEgRG9lc24ndCBoYXZlIGFueSBlZmZlY3QsIHRlc3RlZCBvbiBib3RoIGEgREMxMCBhbmQgYSBEQzEwKyIKLQkgKiB0aGlzIGlzIGZhbHNlLiBJdCBpbnZlcnNlcyBjaHJvbWEgdmFsdWVzIG9uIHRoZSBMTUwzM1IxMCAoc28gQ3IKLQkgKiBzdWRkZW5seSBpcyBzaG93biBhcyBDYiBhbmQgcmV2ZXJzZSwgcmVhbGx5IGNvb2wgZWZmZWN0IGlmIHlvdQotCSAqIHdhbnQgdG8gc2VlIGJsdWUgZmFjZXMsIG5vdCB1c2VmdWwgb3RoZXJ3aXNlKS4gU28gZG9uJ3QgdXNlIHwxLgotCSAqIEhvd2V2ZXIsIHRoZSBEQzEwIGhhcyAnMCcgYXMgSFN0YXJ0LCBidXQgZG9lcyBuZWVkIHwxLCBzbyB3ZQotCSAqIHVzZSBhIGRpcnR5IGNoZWNrLi4uCi0JICovCi0JSEVuZCA9IEhTdGFydCArIHR2bi0+V2EgLSAxOwotCUhTdGFydCArPSBoY3JvcDE7Ci0JSEVuZCAtPSBoY3JvcDI7Ci0JcmVnID0gKChIU3RhcnQgJiBaUjM2MDU3X1ZGRUhDUl9IbWFzaykgPDwgWlIzNjA1N19WRkVIQ1JfSFN0YXJ0KQotCSAgICB8ICgoSEVuZCAmIFpSMzYwNTdfVkZFSENSX0htYXNrKSA8PCBaUjM2MDU3X1ZGRUhDUl9IRW5kKTsKLQlpZiAoenItPmNhcmQudmZlX3BvbC5oc3luY19wb2wpCi0JCXJlZyB8PSBaUjM2MDU3X1ZGRUhDUl9IU1BvbDsKLQlidHdyaXRlKHJlZywgWlIzNjA1N19WRkVIQ1IpOwotCi0JLyogVmVydGljYWwgKi8KLQlEaXNwTW9kZSA9ICEodmlkZW9faGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQgLyAyKTsKLQlWaWRXaW5IdCA9IERpc3BNb2RlID8gdmlkZW9faGVpZ2h0IDogdmlkZW9faGVpZ2h0IC8gMjsKLQlZID0gKFZpZFdpbkh0ICogNjQgKiAyICsgdHZuLT5IYSAtIDEpIC8gdHZuLT5IYTsKLQlIZSA9IChWaWRXaW5IdCAqIDY0KSAvIFk7Ci0JVmVyRGNtID0gNjQgLSBZOwotCXZjcm9wMSA9ICh0dm4tPkhhIC8gMiAtIEhlKSAvIDI7Ci0JdmNyb3AyID0gdHZuLT5IYSAvIDIgLSBIZSAtIHZjcm9wMTsKLQlWU3RhcnQgPSB0dm4tPlZTdGFydDsKLQlWRW5kID0gVlN0YXJ0ICsgdHZuLT5IYSAvIDI7CS8vIC0gMTsgRklYTUUgU25hcFNob3QgdGltZXMgb3V0IHdpdGggLTEgaW4gNzY4KjU3NiBvbiB0aGUgREMxMCAtIExQCi0JVlN0YXJ0ICs9IHZjcm9wMTsKLQlWRW5kIC09IHZjcm9wMjsKLQlyZWcgPSAoKFZTdGFydCAmIFpSMzYwNTdfVkZFVkNSX1ZtYXNrKSA8PCBaUjM2MDU3X1ZGRVZDUl9WU3RhcnQpCi0JICAgIHwgKChWRW5kICYgWlIzNjA1N19WRkVWQ1JfVm1hc2spIDw8IFpSMzYwNTdfVkZFVkNSX1ZFbmQpOwotCWlmICh6ci0+Y2FyZC52ZmVfcG9sLnZzeW5jX3BvbCkKLQkJcmVnIHw9IFpSMzYwNTdfVkZFVkNSX1ZTUG9sOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZGRVZDUik7Ci0KLQkvKiBzY2FsZXIgYW5kIHBpeGVsIGZvcm1hdCAqLwotCXJlZyA9IDA7Ci0JcmVnIHw9IChIb3JEY20gPDwgWlIzNjA1N19WRkVTUEZSX0hvckRjbSk7Ci0JcmVnIHw9IChWZXJEY20gPDwgWlIzNjA1N19WRkVTUEZSX1ZlckRjbSk7Ci0JcmVnIHw9IChEaXNwTW9kZSA8PCBaUjM2MDU3X1ZGRVNQRlJfRGlzcE1vZGUpOwotCS8qIFJKOiBJIGRvbid0IGtub3csIHdoeSB0aGUgZm9sbG93aW5nIGhhcyB0byBiZSB0aGUgb3Bwb3NpdGUKLQkgKiBvZiB0aGUgY29ycmVzcG9uZGluZyBaUjM2MDYwIHNldHRpbmcsIGJ1dCBvbmx5IHRoaXMgd2F5Ci0JICogd2UgZ2V0IHRoZSBjb3JyZWN0IGNvbG9ycyB3aGVuIHVuY29tcHJlc3NpbmcgdG8gdGhlIHNjcmVlbiAgKi8KLQkvL3JlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfVkNMS1BvbDsgLyoqLwotCS8qIFJKOiBEb24ndCBrbm93IGlmIHRoYXQgaXMgbmVlZGVkIGZvciBOVFNDIGFsc28gKi8KLQlpZiAoenItPm5vcm0gIT0gVklERU9fTU9ERV9OVFNDKQotCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX0V4dEZsOwkvLyBORUVERUQhISEhISEhIFdvbGZnYW5nCi0JcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9Ub3BGaWVsZDsKLQlpZiAoSG9yRGNtID49IDQ4KSB7Ci0JCXJlZyB8PSAzIDw8IFpSMzYwNTdfVkZFU1BGUl9IRmlsdGVyOwkvKiA1IHRhcCBmaWx0ZXIgKi8KLQl9IGVsc2UgaWYgKEhvckRjbSA+PSAzMikgewotCQlyZWcgfD0gMiA8PCBaUjM2MDU3X1ZGRVNQRlJfSEZpbHRlcjsJLyogNCB0YXAgZmlsdGVyICovCi0JfSBlbHNlIGlmIChIb3JEY20gPj0gMTYpIHsKLQkJcmVnIHw9IDEgPDwgWlIzNjA1N19WRkVTUEZSX0hGaWx0ZXI7CS8qIDMgdGFwIGZpbHRlciAqLwotCX0KLQlyZWcgfD0gZm9ybWF0LT52ZmVzcGZyOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZGRVNQRlIpOwotCi0JLyogZGlzcGxheSBjb25maWd1cmF0aW9uICovCi0JcmVnID0gKDE2IDw8IFpSMzYwNTdfVkRDUl9NaW5QaXgpCi0JICAgIHwgKFZpZFdpbkh0IDw8IFpSMzYwNTdfVkRDUl9WaWRXaW5IdCkKLQkgICAgfCAoVmlkV2luV2lkIDw8IFpSMzYwNTdfVkRDUl9WaWRXaW5XaWQpOwotCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1RSSVRPTikKLQkJLy8gfHwgenItPnJldmlzaW9uIDwgMSkgLy8gUmV2aXNpb24gMSBoYXMgYWxzbyBUcml0b24gc3VwcG9ydAotCQlyZWcgJj0gflpSMzYwNTdfVkRDUl9Ucml0b247Ci0JZWxzZQotCQlyZWcgfD0gWlIzNjA1N19WRENSX1RyaXRvbjsKLQlidHdyaXRlKHJlZywgWlIzNjA1N19WRENSKTsKLQotCS8qIChSb25hbGQpIGRvbid0IHdyaXRlIHRoaXMgaWYgb3ZlcmxheV9tYXNrID0gTlVMTCAqLwotCWlmICh6ci0+b3ZlcmxheV9tYXNrKSB7Ci0JCS8qIFdyaXRlIG92ZXJsYXkgY2xpcHBpbmcgbWFzayBkYXRhLCBidXQgZG9uJ3QgZW5hYmxlIG92ZXJsYXkgY2xpcHBpbmcgKi8KLQkJLyogUko6IHNpbmNlIHRoaXMgbWFrZXMgb25seSBzZW5zZSBvbiB0aGUgc2NyZWVuLCB3ZSB1c2UKLQkJICogenItPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggaW5zdGVhZCBvZiB2aWRlb193aWR0aCAqLwotCi0JCW1hc2tfbGluZV9zaXplID0gKEJVWl9NQVhfV0lEVEggKyAzMSkgLyAzMjsKLQkJcmVnID0gdmlydF90b19idXMoenItPm92ZXJsYXlfbWFzayk7Ci0JCWJ0d3JpdGUocmVnLCBaUjM2MDU3X01NVFIpOwotCQlyZWcgPSB2aXJ0X3RvX2J1cyh6ci0+b3ZlcmxheV9tYXNrICsgbWFza19saW5lX3NpemUpOwotCQlidHdyaXRlKHJlZywgWlIzNjA1N19NTUJSKTsKLQkJcmVnID0KLQkJICAgIG1hc2tfbGluZV9zaXplIC0gKHpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoICsKLQkJCQkgICAgICAzMSkgLyAzMjsKLQkJaWYgKERpc3BNb2RlID09IDApCi0JCQlyZWcgKz0gbWFza19saW5lX3NpemU7Ci0JCXJlZyA8PD0gWlIzNjA1N19PQ1JfTWFza1N0cmlkZTsKLQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfT0NSKTsKLQl9Ci0KLQl6cjM2MDU3X2FkanVzdF92ZmUoenIsIHpyLT5jb2RlY19tb2RlKTsKLX0KLQotLyoKLSAqIFN3aXRjaCBvdmVybGF5IG9uIG9yIG9mZgotICovCi0KLXZvaWQKLXpyMzYwNTdfb3ZlcmxheSAoc3RydWN0IHpvcmFuICp6ciwKLQkJIGludCAgICAgICAgICAgb24pCi17Ci0JdTMyIHJlZzsKLQotCWlmIChvbikgewotCQkvKiBkbyB0aGUgbmVjZXNzYXJ5IHNldHRpbmdzIC4uLiAqLwotCQlidGFuZCh+WlIzNjA1N19WRENSX1ZpZEVuLCBaUjM2MDU3X1ZEQ1IpOwkvKiBzd2l0Y2ggaXQgb2ZmIGZpcnN0ICovCi0KLQkJenIzNjA1N19zZXRfdmZlKHpyLAotCQkJCXpyLT5vdmVybGF5X3NldHRpbmdzLndpZHRoLAotCQkJCXpyLT5vdmVybGF5X3NldHRpbmdzLmhlaWdodCwKLQkJCQl6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQpOwotCi0JCS8qIFN0YXJ0IGFuZCBsZW5ndGggb2YgZWFjaCBsaW5lIE1VU1QgYmUgNC1ieXRlIGFsaWduZWQuCi0JCSAqIFRoaXMgc2hvdWxkIGJlIGFsbHJlYWR5IGNoZWNrZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHRoaXMgcm91dGluZS4KLQkJICogQWxsIGVycm9yIG1lc3NhZ2VzIGFyZSBpbnRlcm5hbCBkcml2ZXIgY2hlY2tpbmcgb25seSEgKi8KLQotCQkvKiB2aWRlbyBkaXNwbGF5IHRvcCBhbmQgYm90dG9tIHJlZ2lzdGVycyAqLwotCQlyZWcgPSAobG9uZykgenItPmJ1ZmZlci5iYXNlICsKLQkJICAgIHpyLT5vdmVybGF5X3NldHRpbmdzLnggKgotCQkgICAgKCh6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoICsgNykgLyA4KSArCi0JCSAgICB6ci0+b3ZlcmxheV9zZXR0aW5ncy55ICoKLQkJICAgIHpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lOwotCQlidHdyaXRlKHJlZywgWlIzNjA1N19WRFRSKTsKLQkJaWYgKHJlZyAmIDMpCi0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IHpyMzYwNTdfb3ZlcmxheSgpIC0gdmlkZW9fYWRkcmVzcyBub3QgYWxpZ25lZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCWlmICh6ci0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCAvIDIpCi0JCQlyZWcgKz0genItPmJ1ZmZlci5ieXRlc3BlcmxpbmU7Ci0JCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZEQlIpOwotCi0JCS8qIHZpZGVvIHN0cmlkZSwgc3RhdHVzLCBhbmQgZnJhbWUgZ3JhYiByZWdpc3RlciAqLwotCQlyZWcgPSB6ci0+YnVmZmVyLmJ5dGVzcGVybGluZSAtCi0JCSAgICB6ci0+b3ZlcmxheV9zZXR0aW5ncy53aWR0aCAqCi0JCSAgICAoKHpyLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdC0+ZGVwdGggKyA3KSAvIDgpOwotCQlpZiAoenItPm92ZXJsYXlfc2V0dGluZ3MuaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQgLyAyKQotCQkJcmVnICs9IHpyLT5idWZmZXIuYnl0ZXNwZXJsaW5lOwotCQlpZiAocmVnICYgMykKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogenIzNjA1N19vdmVybGF5KCkgLSB2aWRlb19zdHJpZGUgbm90IGFsaWduZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZWcgPSAocmVnIDw8IFpSMzYwNTdfVlNTRkdSX0Rpc3BTdHJpZGUpOwotCQlyZWcgfD0gWlIzNjA1N19WU1NGR1JfVmlkT3ZmOwkvKiBjbGVhciBvdmVyZmxvdyBzdGF0dXMgKi8KLQkJYnR3cml0ZShyZWcsIFpSMzYwNTdfVlNTRkdSKTsKLQotCQkvKiBTZXQgb3ZlcmxheSBjbGlwcGluZyAqLwotCQlpZiAoenItPm92ZXJsYXlfc2V0dGluZ3MuY2xpcGNvdW50ID4gMCkKLQkJCWJ0b3IoWlIzNjA1N19PQ1JfT3ZsRW5hYmxlLCBaUjM2MDU3X09DUik7Ci0KLQkJLyogLi4uIGFuZCBzd2l0Y2ggaXQgb24gKi8KLQkJYnRvcihaUjM2MDU3X1ZEQ1JfVmlkRW4sIFpSMzYwNTdfVkRDUik7Ci0JfSBlbHNlIHsKLQkJLyogU3dpdGNoIGl0IG9mZiAqLwotCQlidGFuZCh+WlIzNjA1N19WRENSX1ZpZEVuLCBaUjM2MDU3X1ZEQ1IpOwotCX0KLX0KLQotLyoKLSAqIFRoZSBvdmVybGF5IG1hc2sgaGFzIG9uZSBiaXQgZm9yIGVhY2ggcGl4ZWwgb24gYSBzY2FuIGxpbmUsCi0gKiAgYW5kIHRoZSBtYXhpbXVtIHdpbmRvdyBzaXplIGlzIEJVWl9NQVhfV0lEVEggKiBCVVpfTUFYX0hFSUdIVCBwaXhlbHMuCi0gKi8KLQotdm9pZAotd3JpdGVfb3ZlcmxheV9tYXNrIChzdHJ1Y3QgZmlsZSAgICAgICAqZmlsZSwKLQkJICAgIHN0cnVjdCB2aWRlb19jbGlwICp2cCwKLQkJICAgIGludCAgICAgICAgICAgICAgICBjb3VudCkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JdW5zaWduZWQgbWFza19saW5lX3NpemUgPSAoQlVaX01BWF9XSURUSCArIDMxKSAvIDMyOwotCXUzMiAqbWFzazsKLQlpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKLQl1bnNpZ25lZCBpLCBqLCBrOwotCXUzMiByZWc7Ci0KLQkvKiBmaWxsIG1hc2sgd2l0aCBvbmUgYml0cyAqLwotCW1lbXNldChmaC0+b3ZlcmxheV9tYXNrLCB+MCwgbWFza19saW5lX3NpemUgKiA0ICogQlVaX01BWF9IRUlHSFQpOwotCXJlZyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkvKiBwaWNrIHVwIGxvY2FsIGNvcHkgb2YgY2xpcCAqLwotCQl4ID0gdnBbaV0ueDsKLQkJeSA9IHZwW2ldLnk7Ci0JCXdpZHRoID0gdnBbaV0ud2lkdGg7Ci0JCWhlaWdodCA9IHZwW2ldLmhlaWdodDsKLQotCQkvKiB0cmltIGNsaXBzIHRoYXQgZXh0ZW5kIGJleW9uZCB0aGUgd2luZG93ICovCi0JCWlmICh4IDwgMCkgewotCQkJd2lkdGggKz0geDsKLQkJCXggPSAwOwotCQl9Ci0JCWlmICh5IDwgMCkgewotCQkJaGVpZ2h0ICs9IHk7Ci0JCQl5ID0gMDsKLQkJfQotCQlpZiAoeCArIHdpZHRoID4gZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGgpIHsKLQkJCXdpZHRoID0gZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggLSB4OwotCQl9Ci0JCWlmICh5ICsgaGVpZ2h0ID4gZmgtPm92ZXJsYXlfc2V0dGluZ3MuaGVpZ2h0KSB7Ci0JCQloZWlnaHQgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQgLSB5OwotCQl9Ci0KLQkJLyogaWdub3JlIGRlZ2VuZXJhdGUgY2xpcHMgKi8KLQkJaWYgKGhlaWdodCA8PSAwKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAod2lkdGggPD0gMCkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBhcHBseSBjbGlwIGZvciBlYWNoIHNjYW4gbGluZSAqLwotCQlmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKLQkJCS8qIHJlc2V0IGJpdCBmb3IgZWFjaCBwaXhlbCAqLwotCQkJLyogdGhpcyBjYW4gYmUgb3B0aW1pemVkIGxhdGVyIGlmIG5lZWQgYmUgKi8KLQkJCW1hc2sgPSBmaC0+b3ZlcmxheV9tYXNrICsgKHkgKyBqKSAqIG1hc2tfbGluZV9zaXplOwotCQkJZm9yIChrID0gMDsgayA8IHdpZHRoOyArK2spIHsKLQkJCQltYXNrWyh4ICsgaykgLyAzMl0gJj0KLQkJCQkgICAgfigodTMyKSAxIDw8ICh4ICsgaykgJSAzMik7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qIEVuYWJsZS9EaXNhYmxlIHVuY29tcHJlc3NlZCBtZW1vcnkgZ3JhYmJpbmcgb2YgdGhlIDM2MDU3ICovCi0KLXZvaWQKLXpyMzYwNTdfc2V0X21lbWdyYWIgKHN0cnVjdCB6b3JhbiAqenIsCi0JCSAgICAgaW50ICAgICAgICAgICBtb2RlKQotewotCWlmIChtb2RlKSB7Ci0JCS8qIFdlIG9ubHkgY2hlY2sgU25hcFNob3QgYW5kIG5vdCBGcmFtZUdyYWIgaGVyZS4gIFNuYXBTaG90PT0xCi0JCSAqIG1lYW5zIGEgY2FwdHVyZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBidXQgRnJhbWVHcmFiPT0xCi0JCSAqIGRvZXNuJ3QgbmVjZXNzYXJ5IG1lYW4gdGhhdC4gIEl0J3MgbW9yZSBjb3JyZWN0IHRvIHNheSBhIDEKLQkJICogdG8gMCB0cmFuc2l0aW9uIGluZGljYXRlcyBhIGNhcHR1cmUgY29tcGxldGVkLiAgSWYgYQotCQkgKiBjYXB0dXJlIGlzIHBlbmRpbmcgd2hlbiBjYXB0dXJpbmcgaXMgdHVuZWQgb2ZmLCBGcmFtZUdyYWIKLQkJICogd2lsbCBiZSBzdHVjayBhdCAxIHVudGlsIGNhcHR1cmluZyBpcyB0dXJuZWQgYmFjayBvbi4KLQkJICovCi0JCWlmIChidHJlYWQoWlIzNjA1N19WU1NGR1IpICYgWlIzNjA1N19WU1NGR1JfU25hcFNob3QpCi0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9XQVJOSU5HCi0JCQkJIiVzOiB6cjM2MDU3X3NldF9tZW1ncmFiKDEpIHdpdGggU25hcFNob3Qgb24hP1xuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJLyogc3dpdGNoIG9uIFZTeW5jIGludGVycnVwdHMgKi8KLQkJYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JU1IpOwkvLyBDbGVhciBJbnRlcnJ1cHRzCi0JCWJ0b3IoenItPmNhcmQudnN5bmNfaW50LCBaUjM2MDU3X0lDUik7CS8vIFNXCi0KLQkJLyogZW5hYmxlIFNuYXBTaG90ICovCi0JCWJ0b3IoWlIzNjA1N19WU1NGR1JfU25hcFNob3QsIFpSMzYwNTdfVlNTRkdSKTsKLQotCQkvKiBTZXQgenIzNjA1NyB2aWRlbyBmcm9udCBlbmQgIGFuZCBlbmFibGUgdmlkZW8gKi8KLQkJenIzNjA1N19zZXRfdmZlKHpyLCB6ci0+djRsX3NldHRpbmdzLndpZHRoLAotCQkJCXpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0LAotCQkJCXpyLT52NGxfc2V0dGluZ3MuZm9ybWF0KTsKLQotCQl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMTsKLQl9IGVsc2UgewotCQkvKiBzd2l0Y2ggb2ZmIFZTeW5jIGludGVycnVwdHMgKi8KLQkJYnRhbmQofnpyLT5jYXJkLnZzeW5jX2ludCwgWlIzNjA1N19JQ1IpOwkvLyBTVwotCi0JCXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgPSAwOwotCQl6ci0+djRsX2dyYWJfZnJhbWUgPSBOT19HUkFCX0FDVElWRTsKLQotCQkvKiByZWVuYWJsZSBncmFiYmluZyB0byBzY3JlZW4gaWYgaXQgd2FzIHJ1bm5pbmcgKi8KLQkJaWYgKHpyLT52NGxfb3ZlcmxheV9hY3RpdmUpIHsKLQkJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlidGFuZCh+WlIzNjA1N19WRENSX1ZpZEVuLCBaUjM2MDU3X1ZEQ1IpOwotCQkJYnRhbmQoflpSMzYwNTdfVlNTRkdSX1NuYXBTaG90LCBaUjM2MDU3X1ZTU0ZHUik7Ci0JCX0KLQl9Ci19Ci0KLWludAotd2FpdF9ncmFiX3BlbmRpbmcgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgZ3JhYnMgYXJlIGZpbmlzaGVkICovCi0KLQlpZiAoIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpCi0JCXJldHVybiAwOwotCi0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHpyLT52NGxfY2FwcSwKLQkJCSh6ci0+djRsX3BlbmRfdGFpbCA9PSB6ci0+djRsX3BlbmRfaGVhZCkpOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIFNldCB1cCB0aGUgQnV6LXNwZWNpZmljIE1KUEVHIHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfZnJhbWUgKHN0cnVjdCB6b3JhbiAqenIsCi0JICAgaW50ICAgICAgICAgICB2YWwpCi17Ci0JR1BJTyh6ciwgenItPmNhcmQuZ3Bpb1taUl9HUElPX0pQRUdfRlJBTUVdLCB2YWwpOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X3ZpZGVvYnVzX2RpciAoc3RydWN0IHpvcmFuICp6ciwKLQkJICBpbnQgICAgICAgICAgIHZhbCkKLXsKLQlzd2l0Y2ggKHpyLT5jYXJkLnR5cGUpIHsKLQljYXNlIExNTDMzOgotCWNhc2UgTE1MMzNSMTA6Ci0JCWlmIChsbWwzM2RwYXRoID09IDApCi0JCQlHUElPKHpyLCA1LCB2YWwpOwotCQllbHNlCi0JCQlHUElPKHpyLCA1LCAxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJR1BJTyh6ciwgenItPmNhcmQuZ3Bpb1taUl9HUElPX1ZJRF9ESVJdLAotCQkgICAgIHpyLT5jYXJkLmdwaW9fcG9sW1pSX0dQSU9fVklEX0RJUl0gPyAhdmFsIDogdmFsKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotaW5pdF9qcGVnX3F1ZXVlIChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCWludCBpOwotCi0JLyogcmUtaW5pdGlhbGl6ZSBETUEgcmluZyBzdHVmZiAqLwotCXpyLT5qcGdfcXVlX2hlYWQgPSAwOwotCXpyLT5qcGdfZG1hX2hlYWQgPSAwOwotCXpyLT5qcGdfZG1hX3RhaWwgPSAwOwotCXpyLT5qcGdfcXVlX3RhaWwgPSAwOwotCXpyLT5qcGdfc2VxX251bSA9IDA7Ci0JenItPkpQRUdfZXJyb3IgPSAwOwotCXpyLT5udW1fZXJyb3JzID0gMDsKLQl6ci0+anBnX2Vycl9zZXEgPSAwOwotCXpyLT5qcGdfZXJyX3NoaWZ0ID0gMDsKLQl6ci0+anBnX3F1ZXVlZF9udW0gPSAwOwotCWZvciAoaSA9IDA7IGkgPCB6ci0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgewotCQl6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KLQl9Ci0JZm9yIChpID0gMDsgaSA8IEJVWl9OVU1fU1RBVF9DT007IGkrKykgewotCQl6ci0+c3RhdF9jb21baV0gPSBjcHVfdG9fbGUzMigxKTsJLyogbWFyayBhcyB1bmF2YWlsYWJsZSB0byB6cjM2MDU3ICovCi0JfQotfQotCi1zdGF0aWMgdm9pZAotenIzNjA1N19zZXRfanBnIChzdHJ1Y3Qgem9yYW4gICAgICAgICAgKnpyLAotCQkgZW51bSB6b3Jhbl9jb2RlY19tb2RlICBtb2RlKQotewotCXN0cnVjdCB0dm5vcm0gKnR2bjsKLQl1MzIgcmVnOwotCi0JdHZuID0genItPnRpbWluZzsKLQotCS8qIGFzc2VydCBQX1Jlc2V0LCBkaXNhYmxlIGNvZGUgdHJhbnNmZXIsIGRlYXNzZXJ0IEFjdGl2ZSAqLwotCWJ0d3JpdGUoMCwgWlIzNjA1N19KUEMpOwotCi0JLyogTUpQRUcgY29tcHJlc3Npb24gbW9kZSAqLwotCXN3aXRjaCAobW9kZSkgewotCi0JY2FzZSBCVVpfTU9ERV9NT1RJT05fQ09NUFJFU1M6Ci0JZGVmYXVsdDoKLQkJcmVnID0gWlIzNjA1N19KTUNfTUpQR0NtcE1vZGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzoKLQkJcmVnID0gWlIzNjA1N19KTUNfTUpQR0V4cE1vZGU7Ci0JCXJlZyB8PSBaUjM2MDU3X0pNQ19TeW5jTXN0cjsKLQkJLyogUko6IFRoZSBmb2xsb3dpbmcgaXMgZXhwZXJpbWVudGFsIC0gaW1wcm92ZXMgdGhlIG91dHB1dCB0byBzY3JlZW4gKi8KLQkJLy9pZih6ci0+anBnX3NldHRpbmdzLlZGSUZPX0ZCKSByZWcgfD0gWlIzNjA1N19KTUNfVkZJRk9fRkI7IC8vIE5vLCBpdCBkb2Vzbid0LiBTTQotCQlicmVhazsKLQotCWNhc2UgQlVaX01PREVfU1RJTExfQ09NUFJFU1M6Ci0JCXJlZyA9IFpSMzYwNTdfSk1DX0pQR0NtcE1vZGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBCVVpfTU9ERV9TVElMTF9ERUNPTVBSRVNTOgotCQlyZWcgPSBaUjM2MDU3X0pNQ19KUEdFeHBNb2RlOwotCQlicmVhazsKLQotCX0KLQlyZWcgfD0gWlIzNjA1N19KTUNfSlBHOwotCWlmICh6ci0+anBnX3NldHRpbmdzLmZpZWxkX3Blcl9idWZmID09IDEpCi0JCXJlZyB8PSBaUjM2MDU3X0pNQ19GbGRfcGVyX2J1ZmY7Ci0JYnR3cml0ZShyZWcsIFpSMzYwNTdfSk1DKTsKLQotCS8qIHZlcnRpY2FsICovCi0JYnRvcihaUjM2MDU3X1ZGRVZDUl9WU1BvbCwgWlIzNjA1N19WRkVWQ1IpOwotCXJlZyA9ICg2IDw8IFpSMzYwNTdfVlNQX1ZzeW5jU2l6ZSkgfAotCSAgICAgICh0dm4tPkh0IDw8IFpSMzYwNTdfVlNQX0ZybVRvdCk7Ci0JYnR3cml0ZShyZWcsIFpSMzYwNTdfVlNQKTsKLQlyZWcgPSAoKHpyLT5qcGdfc2V0dGluZ3MuaW1nX3kgKyB0dm4tPlZTdGFydCkgPDwgWlIzNjA1N19GVkFQX05BWSkgfAotCSAgICAgICh6ci0+anBnX3NldHRpbmdzLmltZ19oZWlnaHQgPDwgWlIzNjA1N19GVkFQX1BBWSk7Ci0JYnR3cml0ZShyZWcsIFpSMzYwNTdfRlZBUCk7Ci0KLQkvKiBob3Jpem9udGFsICovCi0JaWYgKHpyLT5jYXJkLnZmZV9wb2wuaHN5bmNfcG9sKQotCQlidG9yKFpSMzYwNTdfVkZFSENSX0hTUG9sLCBaUjM2MDU3X1ZGRUhDUik7Ci0JZWxzZQotCQlidGFuZCh+WlIzNjA1N19WRkVIQ1JfSFNQb2wsIFpSMzYwNTdfVkZFSENSKTsKLQlyZWcgPSAoKHR2bi0+SFN5bmNTdGFydCkgPDwgWlIzNjA1N19IU1BfSHN5bmNTdGFydCkgfAotCSAgICAgICh0dm4tPld0IDw8IFpSMzYwNTdfSFNQX0xpbmVUb3QpOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0hTUCk7Ci0JcmVnID0gKCh6ci0+anBnX3NldHRpbmdzLmltZ194ICsKLQkJdHZuLT5IU3RhcnQgKyA0KSA8PCBaUjM2MDU3X0ZIQVBfTkFYKSB8Ci0JICAgICAgKHpyLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoIDw8IFpSMzYwNTdfRkhBUF9QQVgpOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0ZIQVApOwotCi0JLyogZmllbGQgcHJvY2VzcyBwYXJhbWV0ZXJzICovCi0JaWYgKHpyLT5qcGdfc2V0dGluZ3Mub2RkX2V2ZW4pCi0JCXJlZyA9IFpSMzYwNTdfRlBQX09kZF9FdmVuOwotCWVsc2UKLQkJcmVnID0gMDsKLQotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0ZQUCk7Ci0KLQkvKiBTZXQgcHJvcGVyIFZDTEsgUG9sYXJpdHksIGVsc2UgY29sb3JzIHdpbGwgYmUgd3JvbmcgZHVyaW5nIHBsYXliYWNrICovCi0JLy9idG9yKFpSMzYwNTdfVkZFU1BGUl9WQ0xLUG9sLCBaUjM2MDU3X1ZGRVNQRlIpOwotCi0JLyogY29kZSBiYXNlIGFkZHJlc3MgKi8KLQlyZWcgPSB2aXJ0X3RvX2J1cyh6ci0+c3RhdF9jb20pOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0pDQkEpOwotCi0JLyogRklGTyB0aHJlc2hvbGQgKEZJRk8gaXMgMTYwLiBkb3VibGUgd29yZHMpICovCi0JLyogTk9URTogZGVjaW1hbCB2YWx1ZXMgaGVyZSAqLwotCXN3aXRjaCAobW9kZSkgewotCi0JY2FzZSBCVVpfTU9ERV9TVElMTF9DT01QUkVTUzoKLQljYXNlIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzoKLQkJaWYgKHpyLT5jYXJkLnR5cGUgIT0gQlVaKQotCQkJcmVnID0gMTQwOwotCQllbHNlCi0JCQlyZWcgPSA2MDsKLQkJYnJlYWs7Ci0KLQljYXNlIEJVWl9NT0RFX1NUSUxMX0RFQ09NUFJFU1M6Ci0JY2FzZSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzoKLQkJcmVnID0gMjA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmVnID0gODA7Ci0JCWJyZWFrOwotCi0JfQotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X0pDRlQpOwotCXpyMzYwNTdfYWRqdXN0X3ZmZSh6ciwgbW9kZSk7Ci0KLX0KLQotdm9pZAotcHJpbnRfaW50ZXJydXB0cyAoc3RydWN0IHpvcmFuICp6cikKLXsKLQlpbnQgcmVzLCBub2VyciA9IDA7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0cyByZWNlaXZlZDoiLCBaUl9ERVZOQU1FKHpyKSk7Ci0JaWYgKChyZXMgPSB6ci0+ZmllbGRfY291bnRlcikgPCAtMSB8fCByZXMgPiAxKSB7Ci0JCXByaW50aygiIEZEOiVkIiwgcmVzKTsKLQl9Ci0JaWYgKChyZXMgPSB6ci0+aW50cl9jb3VudGVyX0dJUlExKSAhPSAwKSB7Ci0JCXByaW50aygiIEdJUlExOiVkIiwgcmVzKTsKLQkJbm9lcnIrKzsKLQl9Ci0JaWYgKChyZXMgPSB6ci0+aW50cl9jb3VudGVyX0dJUlEwKSAhPSAwKSB7Ci0JCXByaW50aygiIEdJUlEwOiVkIiwgcmVzKTsKLQkJbm9lcnIrKzsKLQl9Ci0JaWYgKChyZXMgPSB6ci0+aW50cl9jb3VudGVyX0NvZFJlcElSUSkgIT0gMCkgewotCQlwcmludGsoIiBDb2RSZXBJUlE6JWQiLCByZXMpOwotCQlub2VycisrOwotCX0KLQlpZiAoKHJlcyA9IHpyLT5pbnRyX2NvdW50ZXJfSlBFR1JlcElSUSkgIT0gMCkgewotCQlwcmludGsoIiBKUEVHUmVwSVJROiVkIiwgcmVzKTsKLQkJbm9lcnIrKzsKLQl9Ci0JaWYgKHpyLT5KUEVHX21heF9taXNzZWQpIHsKLQkJcHJpbnRrKCIgSlBFRyBkZWxheXM6IG1heD0lZCBtaW49JWQiLCB6ci0+SlBFR19tYXhfbWlzc2VkLAotCQkgICAgICAgenItPkpQRUdfbWluX21pc3NlZCk7Ci0JfQotCWlmICh6ci0+RU5EX2V2ZW50X21pc3NlZCkgewotCQlwcmludGsoIiBFTkRzIG1pc3NlZDogJWQiLCB6ci0+RU5EX2V2ZW50X21pc3NlZCk7Ci0JfQotCS8vaWYgKHpyLT5qcGdfcXVldWVkX251bSkgewotCXByaW50aygiIHF1ZXVlX3N0YXRlPSVsZC8lbGQvJWxkLyVsZCIsIHpyLT5qcGdfcXVlX3RhaWwsCi0JICAgICAgIHpyLT5qcGdfZG1hX3RhaWwsIHpyLT5qcGdfZG1hX2hlYWQsIHpyLT5qcGdfcXVlX2hlYWQpOwotCS8vfQotCWlmICghbm9lcnIpIHsKLQkJcHJpbnRrKCI6IG5vIGludGVycnVwdHMgZGV0ZWN0ZWQuIik7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotdm9pZAotY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzIChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCXpyLT5pbnRyX2NvdW50ZXJfR0lSUTEgPSAwOwotCXpyLT5pbnRyX2NvdW50ZXJfR0lSUTAgPSAwOwotCXpyLT5pbnRyX2NvdW50ZXJfQ29kUmVwSVJRID0gMDsKLQl6ci0+aW50cl9jb3VudGVyX0pQRUdSZXBJUlEgPSAwOwotCXpyLT5maWVsZF9jb3VudGVyID0gMDsKLQl6ci0+SVJRMV9pbiA9IDA7Ci0JenItPklSUTFfb3V0ID0gMDsKLQl6ci0+SlBFR19pbiA9IDA7Ci0JenItPkpQRUdfb3V0ID0gMDsKLQl6ci0+SlBFR18wID0gMDsKLQl6ci0+SlBFR18xID0gMDsKLQl6ci0+RU5EX2V2ZW50X21pc3NlZCA9IDA7Ci0JenItPkpQRUdfbWlzc2VkID0gMDsKLQl6ci0+SlBFR19tYXhfbWlzc2VkID0gMDsKLQl6ci0+SlBFR19taW5fbWlzc2VkID0gMHg3ZmZmZmZmZjsKLX0KLQotc3RhdGljIHUzMgotY291bnRfcmVzZXRfaW50ZXJydXB0IChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCXUzMiBpc3I7Ci0KLQlpZiAoKGlzciA9IGJ0cmVhZChaUjM2MDU3X0lTUikgJiAweDc4MDAwMDAwKSkgewotCQlpZiAoaXNyICYgWlIzNjA1N19JU1JfR0lSUTEpIHsKLQkJCWJ0d3JpdGUoWlIzNjA1N19JU1JfR0lSUTEsIFpSMzYwNTdfSVNSKTsKLQkJCXpyLT5pbnRyX2NvdW50ZXJfR0lSUTErKzsKLQkJfQotCQlpZiAoaXNyICYgWlIzNjA1N19JU1JfR0lSUTApIHsKLQkJCWJ0d3JpdGUoWlIzNjA1N19JU1JfR0lSUTAsIFpSMzYwNTdfSVNSKTsKLQkJCXpyLT5pbnRyX2NvdW50ZXJfR0lSUTArKzsKLQkJfQotCQlpZiAoaXNyICYgWlIzNjA1N19JU1JfQ29kUmVwSVJRKSB7Ci0JCQlidHdyaXRlKFpSMzYwNTdfSVNSX0NvZFJlcElSUSwgWlIzNjA1N19JU1IpOwotCQkJenItPmludHJfY291bnRlcl9Db2RSZXBJUlErKzsKLQkJfQotCQlpZiAoaXNyICYgWlIzNjA1N19JU1JfSlBFR1JlcElSUSkgewotCQkJYnR3cml0ZShaUjM2MDU3X0lTUl9KUEVHUmVwSVJRLCBaUjM2MDU3X0lTUik7Ci0JCQl6ci0+aW50cl9jb3VudGVyX0pQRUdSZXBJUlErKzsKLQkJfQotCX0KLQlyZXR1cm4gaXNyOwotfQotCi12b2lkCi1qcGVnX3N0YXJ0IChzdHJ1Y3Qgem9yYW4gKnpyKQotewotCWludCByZWc7Ci0KLQl6ci0+ZnJhbWVfbnVtID0gMDsKLQotCS8qIGRlYXNzZXJ0IFBfcmVzZXQsIGRpc2FibGUgY29kZSB0cmFuc2ZlciwgZGVhc3NlcnQgQWN0aXZlICovCi0JYnR3cml0ZShaUjM2MDU3X0pQQ19QX1Jlc2V0LCBaUjM2MDU3X0pQQyk7Ci0JLyogc3RvcCBmbHVzaGluZyB0aGUgaW50ZXJuYWwgY29kZSBidWZmZXIgKi8KLQlidGFuZCh+WlIzNjA1N19NQ1RDUl9DRmx1c2gsIFpSMzYwNTdfTUNUQ1IpOwotCS8qIGVuYWJsZSBjb2RlIHRyYW5zZmVyICovCi0JYnRvcihaUjM2MDU3X0pQQ19Db2RUcm5zRW4sIFpSMzYwNTdfSlBDKTsKLQotCS8qIGNsZWFyIElSUXMgKi8KLQlidHdyaXRlKElSUV9NQVNLLCBaUjM2MDU3X0lTUik7Ci0JLyogZW5hYmxlIHRoZSBKUEVHIElSUXMgKi8KLQlidHdyaXRlKHpyLT5jYXJkLmpwZWdfaW50IHwKLQkJCVpSMzYwNTdfSUNSX0pQRUdSZXBJUlEgfAotCQkJWlIzNjA1N19JQ1JfSW50UGluRW4sCi0JCVpSMzYwNTdfSUNSKTsKLQotCXNldF9mcmFtZSh6ciwgMCk7CS8vIFxGUkFNRQotCi0JLyogc2V0IHRoZSBKUEVHIGNvZGVjIGd1ZXN0IElEICovCi0JcmVnID0gKHpyLT5jYXJkLmdwY3NbMV0gPDwgWlIzNjA1N19KQ0dJX0pQRUd1ZXN0SUQpIHwKLQkgICAgICAgKDAgPDwgWlIzNjA1N19KQ0dJX0pQRUd1ZXN0UmVnKTsKLQlidHdyaXRlKHJlZywgWlIzNjA1N19KQ0dJKTsKLQotCWlmICh6ci0+Y2FyZC52aWRlb192ZmUgPT0gQ09ERUNfVFlQRV9aUjM2MDE2ICYmCi0JICAgIHpyLT5jYXJkLnZpZGVvX2NvZGVjID09IENPREVDX1RZUEVfWlIzNjA1MCkgewotCQkvKiBFbmFibGUgcHJvY2Vzc2luZyBvbiB0aGUgWlIzNjAxNiAqLwotCQlpZiAoenItPnZmZSkKLQkJCXpyMzYwMTZfd3JpdGUoenItPnZmZSwgMCwgMSk7Ci0KLQkJLyogbG9hZCB0aGUgYWRkcmVzcyBvZiB0aGUgR08gcmVnaXN0ZXIgaW4gdGhlIFpSMzYwNTAgbGF0Y2ggKi8KLQkJcG9zdF9vZmZpY2Vfd3JpdGUoenIsIDAsIDAsIDApOwotCX0KLQotCS8qIGFzc2VydCBBY3RpdmUgKi8KLQlidG9yKFpSMzYwNTdfSlBDX0FjdGl2ZSwgWlIzNjA1N19KUEMpOwotCi0JLyogZW5hYmxlIHRoZSBHbyBnZW5lcmF0aW9uICovCi0JYnRvcihaUjM2MDU3X0pNQ19Hb19lbiwgWlIzNjA1N19KTUMpOwotCXVkZWxheSgzMCk7Ci0KLQlzZXRfZnJhbWUoenIsIDEpOwkvLyAvRlJBTUUKLQotCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IGpwZWdfc3RhcnRcbiIsIFpSX0RFVk5BTUUoenIpKTsKLX0KLQotdm9pZAotenIzNjA1N19lbmFibGVfanBnIChzdHJ1Y3Qgem9yYW4gICAgICAgICAgKnpyLAotCQkgICAgZW51bSB6b3Jhbl9jb2RlY19tb2RlICBtb2RlKQotewotCXN0YXRpYyBpbnQgemVybzsKLQlzdGF0aWMgaW50IG9uZSA9IDE7Ci0Jc3RydWN0IHZmZV9zZXR0aW5ncyBjYXA7Ci0JaW50IGZpZWxkX3NpemUgPQotCSAgICB6ci0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgLyB6ci0+anBnX3NldHRpbmdzLmZpZWxkX3Blcl9idWZmOwotCi0JenItPmNvZGVjX21vZGUgPSBtb2RlOwotCi0JY2FwLnggPSB6ci0+anBnX3NldHRpbmdzLmltZ194OwotCWNhcC55ID0genItPmpwZ19zZXR0aW5ncy5pbWdfeTsKLQljYXAud2lkdGggPSB6ci0+anBnX3NldHRpbmdzLmltZ193aWR0aDsKLQljYXAuaGVpZ2h0ID0genItPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0OwotCWNhcC5kZWNpbWF0aW9uID0KLQkgICAgenItPmpwZ19zZXR0aW5ncy5Ib3JEY20gfCAoenItPmpwZ19zZXR0aW5ncy5WZXJEY20gPDwgOCk7Ci0JY2FwLnF1YWxpdHkgPSB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLnF1YWxpdHk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQotCWNhc2UgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTOiB7Ci0JCXN0cnVjdCBqcGVnX2FwcF9tYXJrZXIgYXBwOwotCQlzdHJ1Y3QganBlZ19jb21fbWFya2VyIGNvbTsKLQotCQkvKiBJbiBtb3Rpb24gY29tcHJlc3MgbW9kZSwgdGhlIGRlY29kZXIgb3V0cHV0IG11c3QgYmUgZW5hYmxlZCwgYW5kCi0JCSAqIHRoZSB2aWRlbyBidXMgZGlyZWN0aW9uIHNldCB0byBpbnB1dC4KLQkJICovCi0JCXNldF92aWRlb2J1c19kaXIoenIsIDApOwotCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfRU5BQkxFX09VVFBVVCwgJm9uZSk7Ci0JCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ6ZXJvKTsKLQotCQkvKiBUYWtlIHRoZSBKUEVHIGNvZGVjIGFuZCB0aGUgVkZFIG91dCBvZiBzbGVlcCAqLwotCQlqcGVnX2NvZGVjX3NsZWVwKHpyLCAwKTsKLQotCQkvKiBzZXQgSlBFRyBhcHAvY29tIG1hcmtlciAqLwotCQlhcHAuYXBwbiA9IHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQbjsKLQkJYXBwLmxlbiA9IHpyLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbjsKLQkJbWVtY3B5KGFwcC5kYXRhLCB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLCA2MCk7Ci0JCXpyLT5jb2RlYy0+Y29udHJvbCh6ci0+Y29kZWMsIENPREVDX1NfSlBFR19BUFBfREFUQSwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGpwZWdfYXBwX21hcmtlciksICZhcHApOwotCi0JCWNvbS5sZW4gPSB6ci0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9sZW47Ci0JCW1lbWNweShjb20uZGF0YSwgenItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fZGF0YSwgNjApOwotCQl6ci0+Y29kZWMtPmNvbnRyb2woenItPmNvZGVjLCBDT0RFQ19TX0pQRUdfQ09NX0RBVEEsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbV9tYXJrZXIpLCAmY29tKTsKLQotCQkvKiBTZXR1cCB0aGUgSlBFRyBjb2RlYyAqLwotCQl6ci0+Y29kZWMtPmNvbnRyb2woenItPmNvZGVjLCBDT0RFQ19TX0pQRUdfVERTX0JZVEUsCi0JCQkJICAgc2l6ZW9mKGludCksICZmaWVsZF9zaXplKTsKLQkJenItPmNvZGVjLT5zZXRfdmlkZW8oenItPmNvZGVjLCB6ci0+dGltaW5nLCAmY2FwLAotCQkJCSAgICAgJnpyLT5jYXJkLnZmZV9wb2wpOwotCQl6ci0+Y29kZWMtPnNldF9tb2RlKHpyLT5jb2RlYywgQ09ERUNfRE9fQ09NUFJFU1NJT04pOwotCi0JCS8qIFNldHVwIHRoZSBWRkUgKi8KLQkJaWYgKHpyLT52ZmUpIHsKLQkJCXpyLT52ZmUtPmNvbnRyb2woenItPnZmZSwgQ09ERUNfU19KUEVHX1REU19CWVRFLAotCQkJCQkgc2l6ZW9mKGludCksICZmaWVsZF9zaXplKTsKLQkJCXpyLT52ZmUtPnNldF92aWRlbyh6ci0+dmZlLCB6ci0+dGltaW5nLCAmY2FwLAotCQkJCQkgICAmenItPmNhcmQudmZlX3BvbCk7Ci0JCQl6ci0+dmZlLT5zZXRfbW9kZSh6ci0+dmZlLCBDT0RFQ19ET19DT01QUkVTU0lPTik7Ci0JCX0KLQotCQlpbml0X2pwZWdfcXVldWUoenIpOwotCQl6cjM2MDU3X3NldF9qcGcoenIsIG1vZGUpOwkvLyBcUF9SZXNldCwgLi4uIFZpZGVvIHBhcmFtLCBGSUZPCi0KLQkJY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHpyKTsKLQkJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBlbmFibGVfanBnKE1PVElPTl9DT01QUkVTUylcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1M6Ci0JCS8qIEluIG1vdGlvbiBkZWNvbXByZXNzaW9uIG1vZGUsIHRoZSBkZWNvZGVyIG91dHB1dCBtdXN0IGJlIGRpc2FibGVkLCBhbmQKLQkJICogdGhlIHZpZGVvIGJ1cyBkaXJlY3Rpb24gc2V0IHRvIG91dHB1dC4KLQkJICovCi0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9FTkFCTEVfT1VUUFVULCAmemVybyk7Ci0JCXNldF92aWRlb2J1c19kaXIoenIsIDEpOwotCQllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX0lOUFVULCAmb25lKTsKLQotCQkvKiBUYWtlIHRoZSBKUEVHIGNvZGVjIGFuZCB0aGUgVkZFIG91dCBvZiBzbGVlcCAqLwotCQlqcGVnX2NvZGVjX3NsZWVwKHpyLCAwKTsKLQkJLyogU2V0dXAgdGhlIFZGRSAqLwotCQlpZiAoenItPnZmZSkgewotCQkJenItPnZmZS0+c2V0X3ZpZGVvKHpyLT52ZmUsIHpyLT50aW1pbmcsICZjYXAsCi0JCQkJCSAgICZ6ci0+Y2FyZC52ZmVfcG9sKTsKLQkJCXpyLT52ZmUtPnNldF9tb2RlKHpyLT52ZmUsIENPREVDX0RPX0VYUEFOU0lPTik7Ci0JCX0KLQkJLyogU2V0dXAgdGhlIEpQRUcgY29kZWMgKi8KLQkJenItPmNvZGVjLT5zZXRfdmlkZW8oenItPmNvZGVjLCB6ci0+dGltaW5nLCAmY2FwLAotCQkJCSAgICAgJnpyLT5jYXJkLnZmZV9wb2wpOwotCQl6ci0+Y29kZWMtPnNldF9tb2RlKHpyLT5jb2RlYywgQ09ERUNfRE9fRVhQQU5TSU9OKTsKLQotCQlpbml0X2pwZWdfcXVldWUoenIpOwotCQl6cjM2MDU3X3NldF9qcGcoenIsIG1vZGUpOwkvLyBcUF9SZXNldCwgLi4uIFZpZGVvIHBhcmFtLCBGSUZPCi0KLQkJY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHpyKTsKLQkJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBlbmFibGVfanBnKE1PVElPTl9ERUNPTVBSRVNTKVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJVWl9NT0RFX0lETEU6Ci0JZGVmYXVsdDoKLQkJLyogc2h1dCBkb3duIHByb2Nlc3NpbmcgKi8KLQkJYnRhbmQofih6ci0+Y2FyZC5qcGVnX2ludCB8IFpSMzYwNTdfSUNSX0pQRUdSZXBJUlEpLAotCQkgICAgICBaUjM2MDU3X0lDUik7Ci0JCWJ0d3JpdGUoenItPmNhcmQuanBlZ19pbnQgfCBaUjM2MDU3X0lDUl9KUEVHUmVwSVJRLAotCQkJWlIzNjA1N19JU1IpOwotCQlidGFuZCh+WlIzNjA1N19KTUNfR29fZW4sIFpSMzYwNTdfSk1DKTsJLy8gXEdvX2VuCi0KLQkJbXNsZWVwKDUwKTsKLQotCQlzZXRfdmlkZW9idXNfZGlyKHpyLCAwKTsKLQkJc2V0X2ZyYW1lKHpyLCAxKTsJLy8gL0ZSQU1FCi0JCWJ0b3IoWlIzNjA1N19NQ1RDUl9DRmx1c2gsIFpSMzYwNTdfTUNUQ1IpOwkvLyAvQ0ZsdXNoCi0JCWJ0d3JpdGUoMCwgWlIzNjA1N19KUEMpOwkvLyBcUF9SZXNldCxcQ29kVHJuc0VuLFxBY3RpdmUKLQkJYnRhbmQoflpSMzYwNTdfSk1DX1ZGSUZPX0ZCLCBaUjM2MDU3X0pNQyk7Ci0JCWJ0YW5kKH5aUjM2MDU3X0pNQ19TeW5jTXN0ciwgWlIzNjA1N19KTUMpOwotCQlqcGVnX2NvZGVjX3Jlc2V0KHpyKTsKLQkJanBlZ19jb2RlY19zbGVlcCh6ciwgMSk7Ci0JCXpyMzYwNTdfYWRqdXN0X3ZmZSh6ciwgbW9kZSk7Ci0KLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZvbmUpOwotCQllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX0lOUFVULCAmemVybyk7Ci0KLQkJZHByaW50aygyLCBLRVJOX0lORk8gIiVzOiBlbmFibGVfanBnKElETEUpXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0JCWJyZWFrOwotCi0JfQotfQotCi0vKiB3aGVuIHRoaXMgaXMgY2FsbGVkIHRoZSBzcGlubG9jayBtdXN0IGJlIGhlbGQgKi8KLXZvaWQKLXpvcmFuX2ZlZWRfc3RhdF9jb20gKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JLyogbW92ZSBmcmFtZXMgZnJvbSBwZW5kaW5nIHF1ZXVlIHRvIERNQSAqLwotCi0JaW50IGZyYW1lLCBpLCBtYXhfc3RhdF9jb207Ci0KLQltYXhfc3RhdF9jb20gPQotCSAgICAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0KLQkgICAgIDEpID8gQlVaX05VTV9TVEFUX0NPTSA6IChCVVpfTlVNX1NUQVRfQ09NID4+IDEpOwotCi0Jd2hpbGUgKCh6ci0+anBnX2RtYV9oZWFkIC0genItPmpwZ19kbWFfdGFpbCkgPCBtYXhfc3RhdF9jb20gJiYKLQkgICAgICAgenItPmpwZ19kbWFfaGVhZCA8IHpyLT5qcGdfcXVlX2hlYWQpIHsKLQotCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX2RtYV9oZWFkICYgQlVaX01BU0tfRlJBTUVdOwotCQlpZiAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0gMSkgewotCQkJLyogZmlsbCAxIHN0YXRfY29tIGVudHJ5ICovCi0JCQlpID0gKHpyLT5qcGdfZG1hX2hlYWQgLQotCQkJICAgICB6ci0+anBnX2Vycl9zaGlmdCkgJiBCVVpfTUFTS19TVEFUX0NPTTsKLQkJCWlmICghKHpyLT5zdGF0X2NvbVtpXSAmIGNwdV90b19sZTMyKDEpKSkKLQkJCQlicmVhazsKLQkJCXpyLT5zdGF0X2NvbVtpXSA9Ci0JCQkgICAgY3B1X3RvX2xlMzIoenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uZnJhZ190YWJfYnVzKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGZpbGwgMiBzdGF0X2NvbSBlbnRyaWVzICovCi0JCQlpID0gKCh6ci0+anBnX2RtYV9oZWFkIC0KLQkJCSAgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIDEpICogMjsKLQkJCWlmICghKHpyLT5zdGF0X2NvbVtpXSAmIGNwdV90b19sZTMyKDEpKSkKLQkJCQlicmVhazsKLQkJCXpyLT5zdGF0X2NvbVtpXSA9Ci0JCQkgICAgY3B1X3RvX2xlMzIoenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uZnJhZ190YWJfYnVzKTsKLQkJCXpyLT5zdGF0X2NvbVtpICsgMV0gPQotCQkJICAgIGNwdV90b19sZTMyKHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLmZyYWdfdGFiX2J1cyk7Ci0JCX0KLQkJenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPSBCVVpfU1RBVEVfRE1BOwotCQl6ci0+anBnX2RtYV9oZWFkKys7Ci0KLQl9Ci0JaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKQotCQl6ci0+anBnX3F1ZXVlZF9udW0rKzsKLX0KLQotLyogd2hlbiB0aGlzIGlzIGNhbGxlZCB0aGUgc3BpbmxvY2sgbXVzdCBiZSBoZWxkICovCi1zdGF0aWMgdm9pZAotem9yYW5fcmVhcF9zdGF0X2NvbSAoc3RydWN0IHpvcmFuICp6cikKLXsKLQkvKiBtb3ZlIGZyYW1lcyBmcm9tIERNQSBxdWV1ZSB0byBkb25lIHF1ZXVlICovCi0KLQlpbnQgaTsKLQl1MzIgc3RhdF9jb207Ci0JdW5zaWduZWQgaW50IHNlcTsKLQl1bnNpZ25lZCBpbnQgZGlmOwotCXN0cnVjdCB6b3Jhbl9qcGdfYnVmZmVyICpidWZmZXI7Ci0JaW50IGZyYW1lOwotCi0JLyogSW4gbW90aW9uIGRlY29tcHJlc3Mgd2UgZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGZyYW1lIGNvdW50ZXIsCi0JICogd2UganVzdCBjb3VudCB0aGUgaW50ZXJydXB0cyBoZXJlICovCi0KLQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpIHsKLQkJenItPmpwZ19zZXFfbnVtKys7Ci0JfQotCXdoaWxlICh6ci0+anBnX2RtYV90YWlsIDwgenItPmpwZ19kbWFfaGVhZCkgewotCQlpZiAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0gMSkKLQkJCWkgPSAoenItPmpwZ19kbWFfdGFpbCAtCi0JCQkgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIEJVWl9NQVNLX1NUQVRfQ09NOwotCQllbHNlCi0JCQlpID0gKCh6ci0+anBnX2RtYV90YWlsIC0KLQkJCSAgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIDEpICogMiArIDE7Ci0KLQkJc3RhdF9jb20gPSBsZTMyX3RvX2NwdSh6ci0+c3RhdF9jb21baV0pOwotCi0JCWlmICgoc3RhdF9jb20gJiAxKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZnJhbWUgPSB6ci0+anBnX3BlbmRbenItPmpwZ19kbWFfdGFpbCAmIEJVWl9NQVNLX0ZSQU1FXTsKLQkJYnVmZmVyID0gJnpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdOwotCQlkb19nZXR0aW1lb2ZkYXkoJmJ1ZmZlci0+YnMudGltZXN0YW1wKTsKLQotCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKSB7Ci0JCQlidWZmZXItPmJzLmxlbmd0aCA9IChzdGF0X2NvbSAmIDB4N2ZmZmZmKSA+PiAxOwotCi0JCQkvKiB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyIHdpdGggdGhlIGhlbHAgb2YgdGhlIGNvdW50ZXIgaW4gc3RhdF9jb20gKi8KLQotCQkJc2VxID0gKChzdGF0X2NvbSA+PiAyNCkgKyB6ci0+anBnX2Vycl9zZXEpICYgMHhmZjsKLQkJCWRpZiA9IChzZXEgLSB6ci0+anBnX3NlcV9udW0pICYgMHhmZjsKLQkJCXpyLT5qcGdfc2VxX251bSArPSBkaWY7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXItPmJzLmxlbmd0aCA9IDA7Ci0JCX0KLQkJYnVmZmVyLT5icy5zZXEgPQotCQkgICAgenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0KLQkJICAgIDIgPyAoenItPmpwZ19zZXFfbnVtID4+IDEpIDogenItPmpwZ19zZXFfbnVtOwotCQlidWZmZXItPnN0YXRlID0gQlVaX1NUQVRFX0RPTkU7Ci0KLQkJenItPmpwZ19kbWFfdGFpbCsrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWVycm9yX2hhbmRsZXIgKHN0cnVjdCB6b3JhbiAqenIsCi0JICAgICAgIHUzMiAgICAgICAgICAgYXN0YXQsCi0JICAgICAgIHUzMiAgICAgICAgICAgc3RhdCkKLXsKLQkvKiBUaGlzIGlzIEpQRUcgZXJyb3IgaGFuZGxpbmcgcGFydCAqLwotCWlmICgoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKSAmJgotCSAgICAoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpKSB7Ci0JCS8vZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yOiBlcnJvciBoYW5kbGluZyByZXF1ZXN0IGluIG1vZGUgJWRcbiIsIFpSX0RFVk5BTUUoenIpLCB6ci0+Y29kZWNfbW9kZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKHN0YXQgJiAxKSA9PSAwICYmCi0JICAgIHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUyAmJgotCSAgICB6ci0+anBnX2RtYV90YWlsIC0genItPmpwZ19xdWVfdGFpbCA+PQotCSAgICAgenItPmpwZ19idWZmZXJzLm51bV9idWZmZXJzKSB7Ci0JCS8qIE5vIGZyZWUgYnVmZmVycy4uLiAqLwotCQl6b3Jhbl9yZWFwX3N0YXRfY29tKHpyKTsKLQkJem9yYW5fZmVlZF9zdGF0X2NvbSh6cik7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKLQkJenItPkpQRUdfbWlzc2VkID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh6ci0+SlBFR19lcnJvciAhPSAxKSB7Ci0JCS8qCi0JCSAqIEZpcnN0IGVudHJ5OiBlcnJvciBqdXN0IGhhcHBlbmVkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uCi0JCSAqCi0JCSAqIEluIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzoKLQkJICoKLQkJICogUG9zc2libGUgZ2xpdGNoIGluIFRWIHNpZ25hbC4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZAotCQkgKiBzdG9wIHRoZSBjb2RlYyBhbmQgd2FpdCBmb3IgZ29vZCBxdWFsaXR5IHNpZ25hbCBiZWZvcmUKLQkJICogcmVzdGFydGluZyBpdCB0byBhdm9pZCBmdXJ0aGVyIHByb2JsZW1zCi0JCSAqCi0JCSAqIEluIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTOgotCQkgKgotCQkgKiBCYWQgSlBFRyBmcmFtZTogd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHByb2Nlc3NlZCAoY29kZWMgY3Jhc2hlZAotCQkgKiBhbmQgd2FzIG5vdCBhYmxlIHRvIGRvIGl0IGl0c2VsZiksIGFuZCB0byByZW1vdmUgaXQgZnJvbSBxdWV1ZS4KLQkJICovCi0JCWJ0YW5kKH5aUjM2MDU3X0pNQ19Hb19lbiwgWlIzNjA1N19KTUMpOwotCQl1ZGVsYXkoMSk7Ci0JCXN0YXQgPSBzdGF0IHwgKHBvc3Rfb2ZmaWNlX3JlYWQoenIsIDcsIDApICYgMykgPDwgODsKLQkJYnR3cml0ZSgwLCBaUjM2MDU3X0pQQyk7Ci0JCWJ0b3IoWlIzNjA1N19NQ1RDUl9DRmx1c2gsIFpSMzYwNTdfTUNUQ1IpOwotCQlqcGVnX2NvZGVjX3Jlc2V0KHpyKTsKLQkJanBlZ19jb2RlY19zbGVlcCh6ciwgMSk7Ci0JCXpyLT5KUEVHX2Vycm9yID0gMTsKLQkJenItPm51bV9lcnJvcnMrKzsKLQotCQkvKiBSZXBvcnQgZXJyb3IgKi8KLQkJaWYgKHpyMzYwNjdfZGVidWcgPiAxICYmIHpyLT5udW1fZXJyb3JzIDw9IDgpIHsKLQkJCWxvbmcgZnJhbWU7Ci0JCQlmcmFtZSA9Ci0JCQkgICAgenItPmpwZ19wZW5kW3pyLT5qcGdfZG1hX3RhaWwgJiBCVVpfTUFTS19GUkFNRV07Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IEpQRUcgZXJyb3Igc3RhdD0weCUwOHgoMHglMDh4KSBxdWV1ZV9zdGF0ZT0lbGQvJWxkLyVsZC8lbGQgc2VxPSVsZCBmcmFtZT0lbGQuIENvZGVjIHN0b3BwZWQuICIsCi0JCQkgICAgICAgWlJfREVWTkFNRSh6ciksIHN0YXQsIHpyLT5sYXN0X2lzciwKLQkJCSAgICAgICB6ci0+anBnX3F1ZV90YWlsLCB6ci0+anBnX2RtYV90YWlsLAotCQkJICAgICAgIHpyLT5qcGdfZG1hX2hlYWQsIHpyLT5qcGdfcXVlX2hlYWQsCi0JCQkgICAgICAgenItPmpwZ19zZXFfbnVtLCBmcmFtZSk7Ci0JCQlwcmludGsoInN0YXRfY29tIGZyYW1lczoiKTsKLQkJCXsKLQkJCQlpbnQgaSwgajsKLQkJCQlmb3IgKGogPSAwOyBqIDwgQlVaX05VTV9TVEFUX0NPTTsgaisrKSB7Ci0JCQkJCWZvciAoaSA9IDA7Ci0JCQkJCSAgICAgaSA8IHpyLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsKLQkJCQkJICAgICBpKyspIHsKLQkJCQkJCWlmIChsZTMyX3RvX2NwdSh6ci0+c3RhdF9jb21bal0pID09Ci0JCQkJCQkgICAgenItPmpwZ19idWZmZXJzLgotCQkJCQkJICAgIGJ1ZmZlcltpXS4KLQkJCQkJCSAgICBmcmFnX3RhYl9idXMpIHsKLQkJCQkJCQlwcmludGsoIiUgZC0+JWQiLAotCQkJCQkJCSAgICAgICBqLCBpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwcmludGsoIlxuIik7Ci0JCQl9Ci0JCX0KLQkJLyogRmluZCBhbiBlbnRyeSBpbiBzdGF0X2NvbSBhbmQgcm90YXRlIGNvbnRlbnRzICovCi0JCXsKLQkJCWludCBpOwotCi0JCQlpZiAoenItPmpwZ19zZXR0aW5ncy5UbXBEY20gPT0gMSkKLQkJCQlpID0gKHpyLT5qcGdfZG1hX3RhaWwgLQotCQkJCSAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgQlVaX01BU0tfU1RBVF9DT007Ci0JCQllbHNlCi0JCQkJaSA9ICgoenItPmpwZ19kbWFfdGFpbCAtCi0JCQkJICAgICAgenItPmpwZ19lcnJfc2hpZnQpICYgMSkgKiAyOwotCQkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKSB7Ci0JCQkJLyogTWltaWMgenIzNjA2NyBvcGVyYXRpb24gKi8KLQkJCQl6ci0+c3RhdF9jb21baV0gfD0gY3B1X3RvX2xlMzIoMSk7Ci0JCQkJaWYgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtICE9IDEpCi0JCQkJCXpyLT5zdGF0X2NvbVtpICsgMV0gfD0gY3B1X3RvX2xlMzIoMSk7Ci0JCQkJLyogUmVmaWxsICovCi0JCQkJem9yYW5fcmVhcF9zdGF0X2NvbSh6cik7Ci0JCQkJem9yYW5fZmVlZF9zdGF0X2NvbSh6cik7Ci0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6ci0+anBnX2NhcHEpOwotCQkJCS8qIEZpbmQgYW4gZW50cnkgaW4gc3RhdF9jb20gYWdhaW4gYWZ0ZXIgcmVmaWxsICovCi0JCQkJaWYgKHpyLT5qcGdfc2V0dGluZ3MuVG1wRGNtID09IDEpCi0JCQkJCWkgPSAoenItPmpwZ19kbWFfdGFpbCAtCi0JCQkJCSAgICAgenItPmpwZ19lcnJfc2hpZnQpICYKLQkJCQkJICAgIEJVWl9NQVNLX1NUQVRfQ09NOwotCQkJCWVsc2UKLQkJCQkJaSA9ICgoenItPmpwZ19kbWFfdGFpbCAtCi0JCQkJCSAgICAgIHpyLT5qcGdfZXJyX3NoaWZ0KSAmIDEpICogMjsKLQkJCX0KLQkJCWlmIChpKSB7Ci0JCQkJLyogUm90YXRlIHN0YXRfY29tbSBlbnRyaWVzIHRvIG1ha2UgY3VycmVudCBlbnRyeSBmaXJzdCAqLwotCQkJCWludCBqOwotCQkJCV9fbGUzMiBidXNfYWRkcltCVVpfTlVNX1NUQVRfQ09NXTsKLQotCQkJCS8qIEhlcmUgd2UgYXJlIGNvcHlpbmcgdGhlIHN0YXRfY29tIGFycmF5LCB3aGljaAotCQkJCSAqIGlzIGFscmVhZHkgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvCi0JCQkJICogbm8gZW5kaWFuIGNvbnZlcnNpb25zIGhlcmUKLQkJCQkgKi8KLQkJCQltZW1jcHkoYnVzX2FkZHIsIHpyLT5zdGF0X2NvbSwKLQkJCQkgICAgICAgc2l6ZW9mKGJ1c19hZGRyKSk7Ci0JCQkJZm9yIChqID0gMDsgaiA8IEJVWl9OVU1fU1RBVF9DT007IGorKykgewotCQkJCQl6ci0+c3RhdF9jb21bal0gPQotCQkJCQkgICAgYnVzX2FkZHJbKGkgKyBqKSAmCi0JCQkJCQkgICAgIEJVWl9NQVNLX1NUQVRfQ09NXTsKLQotCQkJCX0KLQkJCQl6ci0+anBnX2Vycl9zaGlmdCArPSBpOwotCQkJCXpyLT5qcGdfZXJyX3NoaWZ0ICY9IEJVWl9NQVNLX1NUQVRfQ09NOwotCQkJfQotCQkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykKLQkJCQl6ci0+anBnX2Vycl9zZXEgPSB6ci0+anBnX3NlcV9udW07CS8qICsgMTsgKi8KLQkJfQotCX0KLQotCS8qIE5vdyB0aGUgc3RhdF9jb21tIGJ1ZmZlciBpcyByZWFkeSBmb3IgcmVzdGFydCAqLwotCWRvIHsKLQkJaW50IHN0YXR1cywgbW9kZTsKLQotCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKSB7Ci0JCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX1NUQVRVUywgJnN0YXR1cyk7Ci0JCQltb2RlID0gQ09ERUNfRE9fQ09NUFJFU1NJT047Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSAwOwotCQkJbW9kZSA9IENPREVDX0RPX0VYUEFOU0lPTjsKLQkJfQotCQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MgfHwKLQkJICAgIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19HT09EKSkgewotCQkJLyoqKioqKioqKiogUkVTVEFSVCBjb2RlICoqKioqKioqKioqKiovCi0JCQlqcGVnX2NvZGVjX3Jlc2V0KHpyKTsKLQkJCXpyLT5jb2RlYy0+c2V0X21vZGUoenItPmNvZGVjLCBtb2RlKTsKLQkJCXpyMzYwNTdfc2V0X2pwZyh6ciwgenItPmNvZGVjX21vZGUpOwotCQkJanBlZ19zdGFydCh6cik7Ci0KLQkJCWlmICh6ci0+bnVtX2Vycm9ycyA8PSA4KQotCQkJCWRwcmludGsoMiwgS0VSTl9JTkZPICIlczogUmVzdGFydFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCi0JCQl6ci0+SlBFR19taXNzZWQgPSAwOwotCQkJenItPkpQRUdfZXJyb3IgPSAyOwotCQkJLyoqKioqKioqKiogRW5kIFJFU1RBUlQgY29kZSAqKioqKioqKioqKi8KLQkJfQotCX0gd2hpbGUgKDApOwotfQotCi1pcnFyZXR1cm5fdAotem9yYW5faXJxIChpbnQgICAgICAgICAgICAgaXJxLAotCSAgIHZvaWQgICAgICAgICAgICpkZXZfaWQpCi17Ci0JdTMyIHN0YXQsIGFzdGF0OwotCWludCBjb3VudDsKLQlzdHJ1Y3Qgem9yYW4gKnpyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl6ciA9IGRldl9pZDsKLQljb3VudCA9IDA7Ci0KLQlpZiAoenItPnRlc3RpbmcpIHsKLQkJLyogVGVzdGluZyBpbnRlcnJ1cHRzICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJd2hpbGUgKChzdGF0ID0gY291bnRfcmVzZXRfaW50ZXJydXB0KHpyKSkpIHsKLQkJCWlmIChjb3VudCsrID4gMTAwKSB7Ci0JCQkJYnRhbmQoflpSMzYwNTdfSUNSX0ludFBpbkVuLCBaUjM2MDU3X0lDUik7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IElSUSBsb2NrdXAgd2hpbGUgdGVzdGluZywgaXNyPTB4JTA4eCwgY2xlYXJlZCBpbnQgbWFza1xuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIHN0YXQpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPnRlc3RfcSk7Ci0JCQl9Ci0JCX0KLQkJenItPmxhc3RfaXNyID0gc3RhdDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKDEpIHsKLQkJLyogZ2V0L2NsZWFyIGludGVycnVwdCBzdGF0dXMgYml0cyAqLwotCQlzdGF0ID0gY291bnRfcmVzZXRfaW50ZXJydXB0KHpyKTsKLQkJYXN0YXQgPSBzdGF0ICYgSVJRX01BU0s7Ci0JCWlmICghYXN0YXQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JCWRwcmludGsoNCwKLQkJCUtFUk5fREVCVUcKLQkJCSJ6b3Jhbl9pcnE6IGFzdGF0OiAweCUwOHgsIG1hc2s6IDB4JTA4eFxuIiwKLQkJCWFzdGF0LCBidHJlYWQoWlIzNjA1N19JQ1IpKTsKLQkJaWYgKGFzdGF0ICYgenItPmNhcmQudnN5bmNfaW50KSB7CS8vIFNXCi0KLQkJCWlmICh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUyB8fAotCQkJICAgIHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgewotCQkJCS8qIGNvdW50IG1pc3NlZCBpbnRlcnJ1cHRzICovCi0JCQkJenItPkpQRUdfbWlzc2VkKys7Ci0JCQl9Ci0JCQkvL3Bvc3Rfb2ZmaWNlX3JlYWQoenIsMSwwKTsKLQkJCS8qIEludGVycnVwdHMgbWF5IHN0aWxsIGhhcHBlbiB3aGVuCi0JCQkgKiB6ci0+djRsX21lbWdyYWJfYWN0aXZlIGlzIHN3aXRjaGVkIG9mZi4KLQkJCSAqIFdlIHNpbXBseSBpZ25vcmUgdGhlbSAqLwotCi0JCQlpZiAoenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkgewotCi0JCQkJLyogQSBsb3QgbW9yZSBjaGVja3Mgc2hvdWxkIGJlIGhlcmUgLi4uICovCi0JCQkJaWYgKChidHJlYWQoWlIzNjA1N19WU1NGR1IpICYKLQkJCQkgICAgIFpSMzYwNTdfVlNTRkdSX1NuYXBTaG90KSA9PSAwKQotCQkJCQlkcHJpbnRrKDEsCi0JCQkJCQlLRVJOX1dBUk5JTkcKLQkJCQkJCSIlczogQnV6SVJRIHdpdGggU25hcFNob3Qgb2ZmID8/P1xuIiwKLQkJCQkJCVpSX0RFVk5BTUUoenIpKTsKLQotCQkJCWlmICh6ci0+djRsX2dyYWJfZnJhbWUgIT0gTk9fR1JBQl9BQ1RJVkUpIHsKLQkJCQkJLyogVGhlcmUgaXMgYSBncmFiIG9uIGEgZnJhbWUgZ29pbmcgb24sIGNoZWNrIGlmIGl0IGhhcyBmaW5pc2hlZCAqLwotCi0JCQkJCWlmICgoYnRyZWFkKFpSMzYwNTdfVlNTRkdSKSAmCi0JCQkJCSAgICAgWlIzNjA1N19WU1NGR1JfRnJhbWVHcmFiKSA9PQotCQkJCQkgICAgMCkgewotCQkJCQkJLyogaXQgaXMgZmluaXNoZWQsIG5vdGlmeSB0aGUgdXNlciAqLwotCi0JCQkJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW3pyLT52NGxfZ3JhYl9mcmFtZV0uc3RhdGUgPSBCVVpfU1RBVEVfRE9ORTsKLQkJCQkJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbenItPnY0bF9ncmFiX2ZyYW1lXS5icy5zZXEgPSB6ci0+djRsX2dyYWJfc2VxOwotCQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZ6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW3pyLT52NGxfZ3JhYl9mcmFtZV0uYnMudGltZXN0YW1wKTsKLQkJCQkJCXpyLT52NGxfZ3JhYl9mcmFtZSA9IE5PX0dSQUJfQUNUSVZFOwotCQkJCQkJenItPnY0bF9wZW5kX3RhaWwrKzsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh6ci0+djRsX2dyYWJfZnJhbWUgPT0gTk9fR1JBQl9BQ1RJVkUpCi0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPnY0bF9jYXBxKTsKLQotCQkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgZ3JhYiBxdWV1ZWQgKi8KLQotCQkJCWlmICh6ci0+djRsX2dyYWJfZnJhbWUgPT0gTk9fR1JBQl9BQ1RJVkUgJiYKLQkJCQkgICAgenItPnY0bF9wZW5kX3RhaWwgIT0genItPnY0bF9wZW5kX2hlYWQpIHsKLQotCQkJCQlpbnQgZnJhbWUgPSB6ci0+djRsX3BlbmRbenItPnY0bF9wZW5kX3RhaWwgJgotCQkJCQkJCSBWNExfTUFTS19GUkFNRV07Ci0JCQkJCXUzMiByZWc7Ci0KLQkJCQkJenItPnY0bF9ncmFiX2ZyYW1lID0gZnJhbWU7Ci0KLQkJCQkJLyogU2V0IHpyMzYwNTcgdmlkZW8gZnJvbnQgZW5kIGFuZCBlbmFibGUgdmlkZW8gKi8KLQotCQkJCQkvKiBCdWZmZXIgYWRkcmVzcyAqLwotCi0JCQkJCXJlZyA9Ci0JCQkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS4KLQkJCQkJICAgIGZidWZmZXJfYnVzOwotCQkJCQlidHdyaXRlKHJlZywgWlIzNjA1N19WRFRSKTsKLQkJCQkJaWYgKHpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0ID4KLQkJCQkJICAgIEJVWl9NQVhfSEVJR0hUIC8gMikKLQkJCQkJCXJlZyArPQotCQkJCQkJICAgIHpyLT52NGxfc2V0dGluZ3MuCi0JCQkJCQkgICAgYnl0ZXNwZXJsaW5lOwotCQkJCQlidHdyaXRlKHJlZywgWlIzNjA1N19WREJSKTsKLQotCQkJCQkvKiB2aWRlbyBzdHJpZGUsIHN0YXR1cywgYW5kIGZyYW1lIGdyYWIgcmVnaXN0ZXIgKi8KLQkJCQkJcmVnID0gMDsKLQkJCQkJaWYgKHpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0ID4KLQkJCQkJICAgIEJVWl9NQVhfSEVJR0hUIC8gMikKLQkJCQkJCXJlZyArPQotCQkJCQkJICAgIHpyLT52NGxfc2V0dGluZ3MuCi0JCQkJCQkgICAgYnl0ZXNwZXJsaW5lOwotCQkJCQlyZWcgPQotCQkJCQkgICAgKHJlZyA8PAotCQkJCQkgICAgIFpSMzYwNTdfVlNTRkdSX0Rpc3BTdHJpZGUpOwotCQkJCQlyZWcgfD0gWlIzNjA1N19WU1NGR1JfVmlkT3ZmOwotCQkJCQlyZWcgfD0gWlIzNjA1N19WU1NGR1JfU25hcFNob3Q7Ci0JCQkJCXJlZyB8PSBaUjM2MDU3X1ZTU0ZHUl9GcmFtZUdyYWI7Ci0JCQkJCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZTU0ZHUik7Ci0KLQkJCQkJYnRvcihaUjM2MDU3X1ZEQ1JfVmlkRW4sCi0JCQkJCSAgICAgWlIzNjA1N19WRENSKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIGV2ZW4gaWYgd2UgZG9uJ3QgZ3JhYiwgd2UgZG8gd2FudCB0byBpbmNyZW1lbnQKLQkJCSAqIHRoZSBzZXF1ZW5jZSBjb3VudGVyIHRvIHNlZSBsb3N0IGZyYW1lcyAqLwotCQkJenItPnY0bF9ncmFiX3NlcSsrOwotCQl9Ci0jaWYgKElSUV9NQVNLICYgWlIzNjA1N19JU1JfQ29kUmVwSVJRKQotCQlpZiAoYXN0YXQgJiBaUjM2MDU3X0lTUl9Db2RSZXBJUlEpIHsKLQkJCXpyLT5pbnRyX2NvdW50ZXJfQ29kUmVwSVJRKys7Ci0JCQlJREVCVUcocHJpbnRrCi0JCQkgICAgICAgKEtFUk5fREVCVUcgIiVzOiBaUjM2MDU3X0lTUl9Db2RSZXBJUlFcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpKTsKLQkJCWJ0YW5kKH5aUjM2MDU3X0lDUl9Db2RSZXBJUlEsIFpSMzYwNTdfSUNSKTsKLQkJfQotI2VuZGlmCQkJCS8qIChJUlFfTUFTSyAmIFpSMzYwNTdfSVNSX0NvZFJlcElSUSkgKi8KLQotI2lmIChJUlFfTUFTSyAmIFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEpCi0JCWlmIChhc3RhdCAmIFpSMzYwNTdfSVNSX0pQRUdSZXBJUlEpIHsKLQotCQkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTIHx8Ci0JCQkgICAgenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfTU9USU9OX0NPTVBSRVNTKSB7Ci0JCQkJaWYgKHpyMzYwNjdfZGVidWcgPiAxICYmCi0JCQkJICAgICghenItPmZyYW1lX251bSB8fCB6ci0+SlBFR19lcnJvcikpIHsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkgICAgICAgIiVzOiBmaXJzdCBmcmFtZSByZWFkeTogc3RhdGU9MHglMDh4IG9kZF9ldmVuPSVkIGZpZWxkX3Blcl9idWZmPSVkIGRlbGF5PSVkXG4iLAotCQkJCQkgICAgICAgWlJfREVWTkFNRSh6ciksIHN0YXQsCi0JCQkJCSAgICAgICB6ci0+anBnX3NldHRpbmdzLm9kZF9ldmVuLAotCQkJCQkgICAgICAgenItPmpwZ19zZXR0aW5ncy4KLQkJCQkJICAgICAgIGZpZWxkX3Blcl9idWZmLAotCQkJCQkgICAgICAgenItPkpQRUdfbWlzc2VkKTsKLQkJCQkJewotCQkJCQkJY2hhciBzY1tdID0gIjAwMDAiOwotCQkJCQkJY2hhciBzdls1XTsKLQkJCQkJCWludCBpOwotCQkJCQkJc3RyY3B5KHN2LCBzYyk7Ci0JCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkJCQkJaWYgKGxlMzJfdG9fY3B1KHpyLT5zdGF0X2NvbVtpXSkgJiAxKQotCQkJCQkJCQlzdltpXSA9ICcxJzsKLQkJCQkJCX0KLQkJCQkJCXN2WzRdID0gMDsKLQkJCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkJCSAgICAgICAiJXM6IHN0YXRfY29tPSVzIHF1ZXVlX3N0YXRlPSVsZC8lbGQvJWxkLyVsZFxuIiwKLQkJCQkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgc3YsCi0JCQkJCQkgICAgICAgenItPmpwZ19xdWVfdGFpbCwKLQkJCQkJCSAgICAgICB6ci0+anBnX2RtYV90YWlsLAotCQkJCQkJICAgICAgIHpyLT5qcGdfZG1hX2hlYWQsCi0JCQkJCQkgICAgICAgenItPmpwZ19xdWVfaGVhZCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoenItPkpQRUdfbWlzc2VkID4genItPkpQRUdfbWF4X21pc3NlZCkJLy8gR2V0IHN0YXRpc3RpY3MKLQkJCQkJCXpyLT5KUEVHX21heF9taXNzZWQgPQotCQkJCQkJICAgIHpyLT5KUEVHX21pc3NlZDsKLQkJCQkJaWYgKHpyLT5KUEVHX21pc3NlZCA8Ci0JCQkJCSAgICB6ci0+SlBFR19taW5fbWlzc2VkKQotCQkJCQkJenItPkpQRUdfbWluX21pc3NlZCA9Ci0JCQkJCQkgICAgenItPkpQRUdfbWlzc2VkOwotCQkJCX0KLQotCQkJCWlmICh6cjM2MDY3X2RlYnVnID4gMiAmJiB6ci0+ZnJhbWVfbnVtIDwgNikgewotCQkJCQlpbnQgaTsKLQkJCQkJcHJpbnRrKCIlczogc2VxPSVsZCBzdGF0X2NvbToiLAotCQkJCQkgICAgICAgWlJfREVWTkFNRSh6ciksIHpyLT5qcGdfc2VxX251bSk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQkJCXByaW50aygiICUwOHgiLAotCQkJCQkJICAgICAgIGxlMzJfdG9fY3B1KHpyLT5zdGF0X2NvbVtpXSkpOwotCQkJCQl9Ci0JCQkJCXByaW50aygiXG4iKTsKLQkJCQl9Ci0JCQkJenItPmZyYW1lX251bSsrOwotCQkJCXpyLT5KUEVHX21pc3NlZCA9IDA7Ci0JCQkJenItPkpQRUdfZXJyb3IgPSAwOwotCQkJCXpvcmFuX3JlYXBfc3RhdF9jb20oenIpOwotCQkJCXpvcmFuX2ZlZWRfc3RhdF9jb20oenIpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKLQkJCX0gLyplbHNlIHsKLQkJCSAgICAgIGRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBKUEVHIGludGVycnVwdCB3aGlsZSBub3QgaW4gbW90aW9uIChkZSljb21wcmVzcyBtb2RlIVxuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJfSovCi0JCX0KLSNlbmRpZgkJCQkvKiAoSVJRX01BU0sgJiBaUjM2MDU3X0lTUl9KUEVHUmVwSVJRKSAqLwotCi0JCS8qIERBVEVSUiwgdG9vIG1hbnkgZmllbGRzIG1pc3NlZCwgZXJyb3IgcHJvY2Vzc2luZyAqLwotCQlpZiAoKGFzdGF0ICYgenItPmNhcmQuanBlZ19pbnQpIHx8Ci0JCSAgICB6ci0+SlBFR19taXNzZWQgPiAyNSB8fAotCQkgICAgenItPkpQRUdfZXJyb3IgPT0gMQl8fAotCQkgICAgKCh6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUykgJiYKLQkJICAgICAoenItPmZyYW1lX251bSAmICh6ci0+SlBFR19taXNzZWQgPgotCQkJCSAgICAgICB6ci0+anBnX3NldHRpbmdzLmZpZWxkX3Blcl9idWZmKSkpKSB7Ci0JCQllcnJvcl9oYW5kbGVyKHpyLCBhc3RhdCwgc3RhdCk7Ci0JCX0KLQotCQljb3VudCsrOwotCQlpZiAoY291bnQgPiAxMCkgewotCQkJZHByaW50aygyLCBLRVJOX1dBUk5JTkcgIiVzOiBpcnEgbG9vcCAlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgY291bnQpOwotCQkJaWYgKGNvdW50ID4gMjApIHsKLQkJCQlidGFuZCh+WlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKLQkJCQlkcHJpbnRrKDIsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogSVJRIGxvY2t1cCwgY2xlYXJlZCBpbnQgbWFza1xuIiwKLQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXpyLT5sYXN0X2lzciA9IHN0YXQ7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi12b2lkCi16b3Jhbl9zZXRfcGNpX21hc3RlciAoc3RydWN0IHpvcmFuICp6ciwKLQkJICAgICAgaW50ICAgICAgICAgICBzZXRfbWFzdGVyKQotewotCWlmIChzZXRfbWFzdGVyKSB7Ci0JCXBjaV9zZXRfbWFzdGVyKHpyLT5wY2lfZGV2KTsKLQl9IGVsc2UgewotCQl1MTYgY29tbWFuZDsKLQotCQlwY2lfcmVhZF9jb25maWdfd29yZCh6ci0+cGNpX2RldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQkJY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfTUFTVEVSOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoenItPnBjaV9kZXYsIFBDSV9DT01NQU5ELCBjb21tYW5kKTsKLQl9Ci19Ci0KLXZvaWQKLXpvcmFuX2luaXRfaGFyZHdhcmUgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JaW50IGosIHplcm8gPSAwOwotCi0JLyogRW5hYmxlIGJ1cy1tYXN0ZXJpbmcgKi8KLQl6b3Jhbl9zZXRfcGNpX21hc3Rlcih6ciwgMSk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBib2FyZCAqLwotCWlmICh6ci0+Y2FyZC5pbml0KSB7Ci0JCXpyLT5jYXJkLmluaXQoenIpOwotCX0KLQotCWogPSB6ci0+Y2FyZC5pbnB1dFt6ci0+aW5wdXRdLm11eHNlbDsKLQotCWRlY29kZXJfY29tbWFuZCh6ciwgMCwgTlVMTCk7Ci0JZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOwotCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfSU5QVVQsICZqKTsKLQotCWVuY29kZXJfY29tbWFuZCh6ciwgMCwgTlVMTCk7Ci0JZW5jb2Rlcl9jb21tYW5kKHpyLCBFTkNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOwotCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ6ZXJvKTsKLQotCS8qIHRvZ2dsZSBKUEVHIGNvZGVjIHNsZWVwIHRvIHN5bmMgUExMICovCi0JanBlZ19jb2RlY19zbGVlcCh6ciwgMSk7Ci0JanBlZ19jb2RlY19zbGVlcCh6ciwgMCk7Ci0KLQkvKiBzZXQgaW5kaXZpZHVhbCBpbnRlcnJ1cHQgZW5hYmxlcyAod2l0aG91dCBHSVJRMSkKLQkgKiBidXQgZG9uJ3QgZ2xvYmFsIGVuYWJsZSB1bnRpbCB6b3Jhbl9vcGVuKCkgKi8KLQotCS8vYnR3cml0ZShJUlFfTUFTSyAmIH5aUjM2MDU3X0lTUl9HSVJRMSwgWlIzNjA1N19JQ1IpOyAgLy8gU1cKLQkvLyBJdCBsb29rcyBsaWtlIHVzaW5nIG9ubHkgSlBFR1JlcElSUUVuIGlzIG5vdCBhbHdheXMgcmVsaWFibGUsCi0JLy8gbWF5IGJlIHdoZW4gSlBFRyBjb2RlYyBjcmFzaGVzIGl0IHdvbid0IGdlbmVyYXRlIElSUT8gU28sCi0JIC8qQ1AqLwkJCS8vICAgICAgICBidHdyaXRlKElSUV9NQVNLLCBaUjM2MDU3X0lDUik7IC8vIEVuYWJsZSBWc3luYyBpbnRlcnJ1cHRzIHRvby4gU00gICAgV0hZID8gTFAKLQkgICAgenIzNjA1N19pbml0X3ZmZSh6cik7Ci0KLQl6cjM2MDU3X2VuYWJsZV9qcGcoenIsIEJVWl9NT0RFX0lETEUpOwotCi0JYnR3cml0ZShJUlFfTUFTSywgWlIzNjA1N19JU1IpOwkvLyBDbGVhcnMgaW50ZXJydXB0cwotfQotCi12b2lkCi16cjM2MDU3X3Jlc3RhcnQgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JYnR3cml0ZSgwLCBaUjM2MDU3X1NQR1BQQ1IpOwotCW1kZWxheSgxKTsKLQlidG9yKFpSMzYwNTdfU1BHUFBDUl9Tb2Z0UmVzZXQsIFpSMzYwNTdfU1BHUFBDUik7Ci0JbWRlbGF5KDEpOwotCi0JLyogYXNzZXJ0IFBfUmVzZXQgKi8KLQlidHdyaXRlKDAsIFpSMzYwNTdfSlBDKTsKLQkvKiBzZXQgdXAgR1BJTyBkaXJlY3Rpb24gLSBhbGwgb3V0cHV0ICovCi0JYnR3cml0ZShaUjM2MDU3X1NQR1BQQ1JfU29mdFJlc2V0IHwgMCwgWlIzNjA1N19TUEdQUENSKTsKLQotCS8qIHNldCB1cCBHUElPIHBpbnMgYW5kIGd1ZXN0IGJ1cyB0aW1pbmcgKi8KLQlidHdyaXRlKCgweDgxIDw8IDI0KSB8IDB4ODg4OCwgWlIzNjA1N19HUFBHQ1IxKTsKLX0KLQotLyoKLSAqIGluaXRpYWxpemUgdmlkZW8gZnJvbnQgZW5kCi0gKi8KLQotc3RhdGljIHZvaWQKLXpyMzYwNTdfaW5pdF92ZmUgKHN0cnVjdCB6b3JhbiAqenIpCi17Ci0JdTMyIHJlZzsKLQotCXJlZyA9IGJ0cmVhZChaUjM2MDU3X1ZGRVNQRlIpOwotCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuOwotCXJlZyAmPSB+WlIzNjA1N19WRkVTUEZSX1ZDTEtQb2w7Ci0JcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9FeHRGbDsKLQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1RvcEZpZWxkOwotCWJ0d3JpdGUocmVnLCBaUjM2MDU3X1ZGRVNQRlIpOwotCXJlZyA9IGJ0cmVhZChaUjM2MDU3X1ZEQ1IpOwotCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1RSSVRPTikKLQkJLy8gfHwgenItPnJldmlzaW9uIDwgMSkgLy8gUmV2aXNpb24gMSBoYXMgYWxzbyBUcml0b24gc3VwcG9ydAotCQlyZWcgJj0gflpSMzYwNTdfVkRDUl9Ucml0b247Ci0JZWxzZQotCQlyZWcgfD0gWlIzNjA1N19WRENSX1RyaXRvbjsKLQlidHdyaXRlKHJlZywgWlIzNjA1N19WRENSKTsKLX0KLQotLyoKLSAqIEludGVyZmFjZSB0byBkZWNvZGVyIGFuZCBlbmNvZGVyIGNoaXBzIHVzaW5nIGkyYyBidXMKLSAqLwotCi1pbnQKLWRlY29kZXJfY29tbWFuZCAoc3RydWN0IHpvcmFuICp6ciwKLQkJIGludCAgICAgICAgICAgY21kLAotCQkgdm9pZCAgICAgICAgICpkYXRhKQotewotCWlmICh6ci0+ZGVjb2RlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmICh6ci0+Y2FyZC50eXBlID09IExNTDMzICYmCi0JICAgIChjbWQgPT0gREVDT0RFUl9TRVRfTk9STSB8fCBjbWQgPT0gREVDT0RFUl9TRVRfSU5QVVQpKSB7Ci0JCWludCByZXM7Ci0KLQkJLy8gQnQ4MTkgbmVlZHMgdG8gcmVzZXQgaXRzIEZJRk8gYnVmZmVyIHVzaW5nICNGUlNUIHBpbiBhbmQKLQkJLy8gTE1MMzMgY2FyZCB1c2VzIEdQSU8oNykgZm9yIHRoYXQuCi0JCUdQSU8oenIsIDcsIDApOwotCQlyZXMgPSB6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5jb21tYW5kKHpyLT5kZWNvZGVyLCBjbWQsIGRhdGEpOwotCQkvLyBQdWxsICNGUlNUIGhpZ2guCi0JCUdQSU8oenIsIDcsIDEpOwotCQlyZXR1cm4gcmVzOwotCX0gZWxzZQotCQlyZXR1cm4genItPmRlY29kZXItPmRyaXZlci0+Y29tbWFuZCh6ci0+ZGVjb2RlciwgY21kLAotCQkJCQkJICAgIGRhdGEpOwotfQotCi1pbnQKLWVuY29kZXJfY29tbWFuZCAoc3RydWN0IHpvcmFuICp6ciwKLQkJIGludCAgICAgICAgICAgY21kLAotCQkgdm9pZCAgICAgICAgICpkYXRhKQotewotCWlmICh6ci0+ZW5jb2RlciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4genItPmVuY29kZXItPmRyaXZlci0+Y29tbWFuZCh6ci0+ZW5jb2RlciwgY21kLCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZhODZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogWm9yYW4genIzNjA1Ny96cjM2MDY3IFBDSSBjb250cm9sbGVyIGRyaXZlciwgZm9yIHRoZQotICogUGlubmFjbGUvTWlybyBEQzEwL0RDMTArL0RDMzAvREMzMCssIElvbWVnYSBCdXosIExpbnV4Ci0gKiBNZWRpYSBMYWJzIExNTDMzL0xNTDMzUjEwLgotICoKLSAqIFRoaXMgcGFydCBoYW5kbGVzIGNhcmQtc3BlY2lmaWMgZGF0YSBhbmQgZGV0ZWN0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFNlcmd1ZWkgTWlyaWRvbm92IDxtaXJzZXZAY2ljZXNlLm14PgotICoKLSAqIEN1cnJlbnRseSBtYWludGFpbmVkIGJ5OgotICogICBSb25hbGQgQnVsdGplICAgIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+Ci0gKiAgIExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlPgotICogICBNYWlsaW5nbGlzdCAgICAgIDxtanBlZy11c2Vyc0BsaXN0cy5zZi5uZXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX1pPUkFOX0RFVklDRV9IX18KLSNkZWZpbmUgX19aT1JBTl9ERVZJQ0VfSF9fCi0KLS8qIGdlbmVyYWwgcHVycG9zZSBJL08gKi8KLWV4dGVybiB2b2lkIEdQSU8oc3RydWN0IHpvcmFuICp6ciwKLQkJIGludCBiaXQsCi0JCSB1bnNpZ25lZCBpbnQgdmFsdWUpOwotCi0vKiBjb2RlYyAob3IgYWN0dWFsbHk6IGd1ZXN0IGJ1cykgYWNjZXNzICovCi1leHRlcm4gaW50IHBvc3Rfb2ZmaWNlX3dhaXQoc3RydWN0IHpvcmFuICp6cik7Ci1leHRlcm4gaW50IHBvc3Rfb2ZmaWNlX3dyaXRlKHN0cnVjdCB6b3JhbiAqenIsCi0JCQkgICAgIHVuc2lnbmVkIGd1ZXN0LAotCQkJICAgICB1bnNpZ25lZCByZWcsCi0JCQkgICAgIHVuc2lnbmVkIHZhbHVlKTsKLWV4dGVybiBpbnQgcG9zdF9vZmZpY2VfcmVhZChzdHJ1Y3Qgem9yYW4gKnpyLAotCQkJICAgIHVuc2lnbmVkIGd1ZXN0LAotCQkJICAgIHVuc2lnbmVkIHJlZyk7Ci0KLWV4dGVybiB2b2lkIGRldGVjdF9ndWVzdF9hY3Rpdml0eShzdHJ1Y3Qgem9yYW4gKnpyKTsKLQotZXh0ZXJuIHZvaWQganBlZ19jb2RlY19zbGVlcChzdHJ1Y3Qgem9yYW4gKnpyLAotCQkJICAgICBpbnQgc2xlZXApOwotZXh0ZXJuIGludCBqcGVnX2NvZGVjX3Jlc2V0KHN0cnVjdCB6b3JhbiAqenIpOwotCi0vKiB6cjM2MHg3IGFjY2VzcyB0byByYXcgY2FwdHVyZSAqLwotZXh0ZXJuIHZvaWQgenIzNjA1N19vdmVybGF5KHN0cnVjdCB6b3JhbiAqenIsCi0JCQkgICAgaW50IG9uKTsKLWV4dGVybiB2b2lkIHdyaXRlX292ZXJsYXlfbWFzayhzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBzdHJ1Y3QgdmlkZW9fY2xpcCAqdnAsCi0JCQkgICAgICAgaW50IGNvdW50KTsKLWV4dGVybiB2b2lkIHpyMzYwNTdfc2V0X21lbWdyYWIoc3RydWN0IHpvcmFuICp6ciwKLQkJCQlpbnQgbW9kZSk7Ci1leHRlcm4gaW50IHdhaXRfZ3JhYl9wZW5kaW5nKHN0cnVjdCB6b3JhbiAqenIpOwotCi0vKiBpbnRlcnJ1cHRzICovCi1leHRlcm4gdm9pZCBwcmludF9pbnRlcnJ1cHRzKHN0cnVjdCB6b3JhbiAqenIpOwotZXh0ZXJuIHZvaWQgY2xlYXJfaW50ZXJydXB0X2NvdW50ZXJzKHN0cnVjdCB6b3JhbiAqenIpOwotZXh0ZXJuIGlycXJldHVybl90IHpvcmFuX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi0vKiBKUEVHIGNvZGVjIGFjY2VzcyAqLwotZXh0ZXJuIHZvaWQganBlZ19zdGFydChzdHJ1Y3Qgem9yYW4gKnpyKTsKLWV4dGVybiB2b2lkIHpyMzYwNTdfZW5hYmxlX2pwZyhzdHJ1Y3Qgem9yYW4gKnpyLAotCQkJICAgICAgIGVudW0gem9yYW5fY29kZWNfbW9kZSBtb2RlKTsKLWV4dGVybiB2b2lkIHpvcmFuX2ZlZWRfc3RhdF9jb20oc3RydWN0IHpvcmFuICp6cik7Ci0KLS8qIGdlbmVyYWwgKi8KLWV4dGVybiB2b2lkIHpvcmFuX3NldF9wY2lfbWFzdGVyKHN0cnVjdCB6b3JhbiAqenIsCi0JCQkJIGludCBzZXRfbWFzdGVyKTsKLWV4dGVybiB2b2lkIHpvcmFuX2luaXRfaGFyZHdhcmUoc3RydWN0IHpvcmFuICp6cik7Ci1leHRlcm4gdm9pZCB6cjM2MDU3X3Jlc3RhcnQoc3RydWN0IHpvcmFuICp6cik7Ci0KLS8qIGkyYyAqLwotZXh0ZXJuIGludCBkZWNvZGVyX2NvbW1hbmQoc3RydWN0IHpvcmFuICp6ciwKLQkJCSAgIGludCBjbWQsCi0JCQkgICB2b2lkICpkYXRhKTsKLWV4dGVybiBpbnQgZW5jb2Rlcl9jb21tYW5kKHN0cnVjdCB6b3JhbiAqenIsCi0JCQkgICBpbnQgY21kLAotCQkJICAgdm9pZCAqZGF0YSk7Ci0KLSNlbmRpZgkJCQkvKiBfX1pPUkFOX0RFVklDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzZmNTk2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUxICswLDAgQEAKLS8qCi0gKiBab3JhbiB6cjM2MDU3L3pyMzYwNjcgUENJIGNvbnRyb2xsZXIgZHJpdmVyLCBmb3IgdGhlCi0gKiBQaW5uYWNsZS9NaXJvIERDMTAvREMxMCsvREMzMC9EQzMwKywgSW9tZWdhIEJ1eiwgTGludXgKLSAqIE1lZGlhIExhYnMgTE1MMzMvTE1MMzNSMTAuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFNlcmd1ZWkgTWlyaWRvbm92IDxtaXJzZXZAY2ljZXNlLm14PgotICoKLSAqIENoYW5nZXMgZm9yIEJVWiBieSBXb2xmZ2FuZyBTY2hlcnIgPHNjaGVyckBuZXQ0eW91Lm5ldD4KLSAqCi0gKiBDaGFuZ2VzIGZvciBEQzEwL0RDMzAgYnkgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBza3luZXQuYmU+Ci0gKgotICogQ2hhbmdlcyBmb3IgTE1MMzNSMTAgYnkgTWF4aW0gWWV2dHl1c2hraW4gPG1heEBsaW51eG1lZGlhbGFicy5jb20+Ci0gKgotICogQ2hhbmdlcyBmb3IgdmlkZW9kZXYyL3Y0bDIgYnkgUm9uYWxkIEJ1bHRqZSA8cmJ1bHRqZUByb25hbGQuYml0ZnJlYWsubmV0PgotICoKLSAqIEJhc2VkIG9uCi0gKgotICogTWlybyBEQzEwIGRyaXZlcgotICogQ29weXJpZ2h0IChDKSAxOTk5IFdvbGZnYW5nIFNjaGVyciA8c2NoZXJyQG5ldDR5b3UubmV0PgotICoKLSAqIElvbWVnYSBCdXogZHJpdmVyIHZlcnNpb24gMS4wCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgUmFpbmVyIEpvaGFubmkgPFJhaW5lckBKb2hhbm5pLmRlPgotICoKLSAqIGJ1ei4wLjAuMwotICogQ29weXJpZ2h0IChDKSAxOTk4IERhdmUgUGVya3MgPGRwZXJrc0BpYm0ubmV0PgotICoKLSAqIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgotICogQ29weXJpZ2h0IChDKSAxOTk2LDk3LDk4IFJhbHBoICBNZXR6bGVyIChyamttQHRocC51bmkta29lbG4uZGUpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgKG1vY21AdGhwLnVuaS1rb2Vsbi5kZSkKLSAqCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNkZWZpbmUgICAgIE1BUF9OUih4KSAgICAgICB2aXJ0X3RvX3BhZ2UoeCkKLSNkZWZpbmUgICAgIFpPUkFOX1ZJRF9UWVBFICAoIFwKLQkJCQlWSURfVFlQRV9DQVBUVVJFIHwgXAotCQkJCVZJRF9UWVBFX09WRVJMQVkgfCBcCi0JCQkJVklEX1RZUEVfQ0xJUFBJTkcgfCBcCi0JCQkJVklEX1RZUEVfRlJBTUVSQU0gfCBcCi0JCQkJVklEX1RZUEVfU0NBTEVTIHwgXAotCQkJCVZJRF9UWVBFX01KUEVHX0RFQ09ERVIgfCBcCi0JCQkJVklEX1RZUEVfTUpQRUdfRU5DT0RFUiBcCi0JCQkgICAgICkKLQotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSAidmlkZW9jb2RlYy5oIgotCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotCi0jaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2VuY29kZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgInpvcmFuLmgiCi0jaW5jbHVkZSAiem9yYW5fZGV2aWNlLmgiCi0jaW5jbHVkZSAiem9yYW5fY2FyZC5oIgotCi0JLyogd2UgZGVjbGFyZSBzb21lIGNhcmQgdHlwZSBkZWZpbml0aW9ucyBoZXJlLCB0aGV5IG1lYW4KLQkgKiB0aGUgc2FtZSBhcyB0aGUgdjRsMSBaT1JBTl9WSURfVFlQRSBhYm92ZSwgZXhjZXB0IGl0J3MgdjRsMiAqLwotI2RlZmluZSBaT1JBTl9WNEwyX1ZJRF9GTEFHUyAoIFwKLQkJCQlWNEwyX0NBUF9TVFJFQU1JTkcgfFwKLQkJCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHxcCi0JCQkJVjRMMl9DQVBfVklERU9fT1VUUFVUIHxcCi0JCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSBcCi0JCQkgICAgICApCi0KLQotI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUKQotI2RlZmluZSBaRk1UKHBhbCwgZmNjLCBjcykgXAotCS5wYWxldHRlID0gKHBhbCksIC5mb3VyY2MgPSAoZmNjKSwgLmNvbG9yc3BhY2UgPSAoY3MpCi0jZWxzZQotI2RlZmluZSBaRk1UKHBhbCwgZmNjLCBjcykgXAotCS5mb3VyY2MgPSAoZmNjKSwgLmNvbG9yc3BhY2UgPSAoY3MpCi0jZW5kaWYKLQotY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCB6b3Jhbl9mb3JtYXRzW10gPSB7Ci0JewotCQkubmFtZSA9ICIxNS1iaXQgUkdCIExFIiwKLQkJWkZNVChWSURFT19QQUxFVFRFX1JHQjU1NSwKLQkJICAgICBWNEwyX1BJWF9GTVRfUkdCNTU1LCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCi0JCS5kZXB0aCA9IDE1LAotCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8Ci0JCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCi0JCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjU1NXxaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmfAotCQkJICAgWlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbiwKLQl9LCB7Ci0JCS5uYW1lID0gIjE1LWJpdCBSR0IgQkUiLAotCQlaRk1UKC0xLAotCQkgICAgIFY0TDJfUElYX0ZNVF9SR0I1NTVYLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCi0JCS5kZXB0aCA9IDE1LAotCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8Ci0JCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCi0JCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjU1NXxaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmLAotCX0sIHsKLQkJLm5hbWUgPSAiMTYtYml0IFJHQiBMRSIsCi0JCVpGTVQoVklERU9fUEFMRVRURV9SR0I1NjUsCi0JCSAgICAgVjRMMl9QSVhfRk1UX1JHQjU2NSwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAotCQkuZGVwdGggPSAxNiwKLQkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAotCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAotCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I1NjV8WlIzNjA1N19WRkVTUEZSX0VyckRpZnwKLQkJCSAgIFpSMzYwNTdfVkZFU1BGUl9MaXR0bGVFbmRpYW4sCi0JfSwgewotCQkubmFtZSA9ICIxNi1iaXQgUkdCIEJFIiwKLQkJWkZNVCgtMSwKLQkJICAgICBWNEwyX1BJWF9GTVRfUkdCNTY1LCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCi0JCS5kZXB0aCA9IDE2LAotCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8Ci0JCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCi0JCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjU2NXxaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmLAotCX0sIHsKLQkJLm5hbWUgPSAiMjQtYml0IFJHQiIsCi0JCVpGTVQoVklERU9fUEFMRVRURV9SR0IyNCwKLQkJICAgICBWNEwyX1BJWF9GTVRfQkdSMjQsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKLQkJLmRlcHRoID0gMjQsCi0JCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKLQkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKLQkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCODg4fFpSMzYwNTdfVkZFU1BGUl9QYWNrMjQsCi0JfSwgewotCQkubmFtZSA9ICIzMi1iaXQgUkdCIExFIiwKLQkJWkZNVChWSURFT19QQUxFVFRFX1JHQjMyLAotCQkgICAgIFY0TDJfUElYX0ZNVF9CR1IzMiwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAotCQkuZGVwdGggPSAzMiwKLQkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAotCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAotCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODh8WlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbiwKLQl9LCB7Ci0JCS5uYW1lID0gIjMyLWJpdCBSR0IgQkUiLAotCQlaRk1UKC0xLAotCQkgICAgIFY0TDJfUElYX0ZNVF9SR0IzMiwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAotCQkuZGVwdGggPSAzMiwKLQkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAotCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAotCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODgsCi0JfSwgewotCQkubmFtZSA9ICI0OjI6MiwgcGFja2VkLCBZVVlWIiwKLQkJWkZNVChWSURFT19QQUxFVFRFX1lVVjQyMiwKLQkJICAgICBWNEwyX1BJWF9GTVRfWVVZViwgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSksCi0JCS5kZXB0aCA9IDE2LAotCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8Ci0JCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCi0JCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1lVVjQyMiwKLQl9LCB7Ci0JCS5uYW1lID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAotCQlaRk1UKFZJREVPX1BBTEVUVEVfVVlWWSwKLQkJICAgICBWNEwyX1BJWF9GTVRfVVlWWSwgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSksCi0JCS5kZXB0aCA9IDE2LAotCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8Ci0JCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCi0JCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1lVVjQyMnxaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAotCX0sIHsKLQkJLm5hbWUgPSAiSGFyZHdhcmUtZW5jb2RlZCBNb3Rpb24tSlBFRyIsCi0JCVpGTVQoLTEsCi0JCSAgICAgVjRMMl9QSVhfRk1UX01KUEVHLCBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNKSwKLQkJLmRlcHRoID0gMCwKLQkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAotCQkJIFpPUkFOX0ZPUk1BVF9QTEFZQkFDSyB8Ci0JCQkgWk9SQU5fRk9STUFUX0NPTVBSRVNTRUQsCi0JfQotfTsKLSNkZWZpbmUgTlVNX0ZPUk1BVFMgQVJSQVlfU0laRSh6b3Jhbl9mb3JtYXRzKQotCi0vLyBSSjogVGVzdCBvbmx5IC0gd2FudCB0byB0ZXN0IEJVWl9VU0VfSElNRU0gZXZlbiB3aGVuIENPTkZJR19CSUdQSFlTX0FSRUEgaXMgZGVmaW5lZAotCi0KLWV4dGVybiBpbnQgdjRsX25idWZzOwotZXh0ZXJuIGludCB2NGxfYnVmc2l6ZTsKLWV4dGVybiBpbnQganBnX25idWZzOwotZXh0ZXJuIGludCBqcGdfYnVmc2l6ZTsKLWV4dGVybiBpbnQgcGFzc190aHJvdWdoOwotCi1zdGF0aWMgaW50IGxvY2tfbm9ybTsJLyogMCA9IGRlZmF1bHQgMSA9IERvbid0IGNoYW5nZSBUViBzdGFuZGFyZCAobm9ybSkgKi8KLW1vZHVsZV9wYXJhbShsb2NrX25vcm0sIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxvY2tfbm9ybSwgIlByZXZlbnQgbm9ybSBjaGFuZ2VzICgxID0gaWdub3JlLCA+MSA9IGZhaWwpIik7Ci0KLQkvKiBzbWFsbCBoZWxwZXIgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGJ1ZmZlcnNpemVzIGZvciB2NGwyCi0JICogd2UgY2FsY3VsYXRlIHRoZSBuZWFyZXN0IGhpZ2hlciBwb3dlci1vZi10d28sIHdoaWNoCi0JICogd2lsbCBiZSB0aGUgcmVjb21tZW5kZWQgYnVmZmVyc2l6ZSAqLwotc3RhdGljIF9fdTMyCi16b3Jhbl92NGwyX2NhbGNfYnVmc2l6ZSAoc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyAqc2V0dGluZ3MpCi17Ci0JX191OCBkaXYgPSBzZXR0aW5ncy0+VmVyRGNtICogc2V0dGluZ3MtPkhvckRjbSAqIHNldHRpbmdzLT5UbXBEY207Ci0JX191MzIgbnVtID0gKDEwMjQgKiA1MTIpIC8gKGRpdik7Ci0JX191MzIgcmVzdWx0ID0gMjsKLQotCW51bS0tOwotCXdoaWxlIChudW0pIHsKLQkJbnVtID4+PSAxOwotCQlyZXN1bHQgPDw9IDE7Ci0JfQotCi0JaWYgKHJlc3VsdCA+IGpwZ19idWZzaXplKQotCQlyZXR1cm4ganBnX2J1ZnNpemU7Ci0JaWYgKHJlc3VsdCA8IDgxOTIpCi0JCXJldHVybiA4MTkyOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotc3RhdGljIHZvaWQgdjRsX2ZidWZmZXJfZnJlZShzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZCBqcGdfZmJ1ZmZlcl9mcmVlKHN0cnVjdCBmaWxlICpmaWxlKTsKLQotLyoKLSAqICAgQWxsb2NhdGUgdGhlIFY0TCBncmFiIGJ1ZmZlcnMKLSAqCi0gKiAgIFRoZXNlIGhhdmUgdG8gYmUgcHlzaWNhbGx5IGNvbnRpZ3VvdXMuCi0gKiAgIElmIHY0bF9idWZzaXplIDw9IE1BWF9LTUFMTE9DX01FTSB3ZSB1c2Uga21hbGxvYwotICogICBlbHNlIHdlIHRyeSB0byBhbGxvY2F0ZSB0aGVtIHdpdGggYmlncGh5c2FyZWFfYWxsb2NfcGFnZXMKLSAqICAgaWYgdGhlIGJpZ3BoeXNhcmVhIHBhdGNoIGlzIHByZXNlbnQgaW4gdGhlIGtlcm5lbCwKLSAqICAgZWxzZSB3ZSB0cnkgdG8gdXNlIGhpZ2ggbWVtb3J5IChpZiB0aGUgdXNlciBoYXMgYm9vdGV0Ci0gKiAgIExpbnV4IHdpdGggdGhlIG5lY2Vzc2FyeSBtZW1vcnkgbGVmdCBvdmVyKS4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2hpZ2hfbWVtICh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0vKgotICogQ2hlY2sgaWYgdGhlcmUgaXMgdXNhYmxlIG1lbW9yeSBhdCB0aGUgZW5kIG9mIExpbnV4IG1lbW9yeQotICogb2YgYXQgbGVhc3Qgc2l6ZS4gUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgbWVtb3J5LAotICogcmV0dXJuIDAgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGUgaWRlYSBpcyBmcm9tIEFsZXhhbmRybyBSdWJpbmkncyBib29rICJMaW51eCBkZXZpY2UgZHJpdmVycyIuCi0gKiBUaGUgZHJpdmVyIGZyb20gaGltIHdoaWNoIGlzIGRvd25sb2FkYWJsZSBmcm9tIE8nUmVpbGx5J3MKLSAqIHdlYiBzaXRlIG1pc3NlcyB0aGUgInZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkiIHBhcnQKLSAqIChhbmQgdGhlcmVmb3JlIGRvZXNuJ3Qgd29yayBhdCBhbGwgLSBhdCBsZWFzdCB3aXRoIDIuMi54IGtlcm5lbHMpLgotICoKLSAqIEl0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeSB0byBtZW50aW9uIHRoYXQgVEhJUyBJUyBEQU5HRVJPVVMsCi0gKiBpZiBtb3JlIHRoYW4gb25lIGRyaXZlciBhdCBhIHRpbWUgaGFzIHRoZSBpZGVhIHRvIHVzZSB0aGlzIG1lbW9yeSEhISEKLSAqLwotCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICptZW07Ci0JdW5zaWduZWQgY2hhciBjOwotCXVuc2lnbmVkIGxvbmcgaGlfbWVtX3BoOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCS8qIE1hcCB0aGUgaGlnaCBtZW1vcnkgdG8gdXNlciBzcGFjZSAqLwotCi0JaGlfbWVtX3BoID0gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KTsKLQotCW1lbSA9IGlvcmVtYXAoaGlfbWVtX3BoLCBzaXplKTsKLQlpZiAoIW1lbSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUiAiJXM6IGdldF9oaWdoX21lbSgpIC0gaW9yZW1hcCBmYWlsZWRcbiIsCi0JCQlaT1JBTl9OQU1FKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkvKiBDaGVjayBpZiBpdCBpcyBtZW1vcnkgKi8KLQkJYyA9IGkgJiAweGZmOwotCQl3cml0ZWIoYywgbWVtICsgaSk7Ci0JCWlmIChyZWFkYihtZW0gKyBpKSAhPSBjKQotCQkJYnJlYWs7Ci0JCWMgPSAyNTUgLSBjOwotCQl3cml0ZWIoYywgbWVtICsgaSk7Ci0JCWlmIChyZWFkYihtZW0gKyBpKSAhPSBjKQotCQkJYnJlYWs7Ci0JCXdyaXRlYigwLCBtZW0gKyBpKTsJLyogemVybyBvdXQgbWVtb3J5ICovCi0KLQkJLyogZ2l2ZSB0aGUga2VybmVsIGFpciB0byBicmVhdGggKi8KLQkJaWYgKChpICYgMHgzZmZmZikgPT0gMHgzZmZmZikKLQkJCXNjaGVkdWxlKCk7Ci0JfQotCi0JaW91bm1hcChtZW0pOwotCi0JaWYgKGkgIT0gc2l6ZSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBnZXRfaGlnaF9tZW0oKSAtIHJlcXVlc3RlZCAlbHUsIGF2YWlsICVsdVxuIiwKLQkJCVpPUkFOX05BTUUsIHNpemUsIGkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gaGlfbWVtX3BoOwotfQotCi1zdGF0aWMgaW50Ci12NGxfZmJ1ZmZlcl9hbGxvYyAoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCWludCBpLCBvZmY7Ci0JdW5zaWduZWQgY2hhciAqbWVtOwotCXVuc2lnbmVkIGxvbmcgcG1lbSA9IDA7Ci0KLQkvKiB3ZSBtaWdodCBoYXZlIG9sZCBidWZmZXJzIGx5aW5nIGFyb3VuZC4uLiAqLwotCWlmIChmaC0+djRsX2J1ZmZlcnMucmVhZHlfdG9fYmVfZnJlZWQpIHsKLQkJdjRsX2ZidWZmZXJfZnJlZShmaWxlKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKLQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcikKLQkJCWRwcmludGsoMiwKLQkJCQlLRVJOX1dBUk5JTkcKLQkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBidWZmZXIgJWQgYWxscmVhZHkgYWxsb2NhdGVkIT9cbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCi0JCS8vdWRlbGF5KDIwKTsKLQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSA8PSBNQVhfS01BTExPQ19NRU0pIHsKLQkJCS8qIFVzZSBrbWFsbG9jICovCi0KLQkJCW1lbSA9IGttYWxsb2MoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghbWVtKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBrbWFsbG9jIGZvciBWNEwgYnVmICVkIGZhaWxlZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCQkJCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7Ci0JCQkJcmV0dXJuIC1FTk9CVUZTOwotCQkJfQotCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyID0gbWVtOwotCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX3BoeXMgPQotCQkJICAgIHZpcnRfdG9fcGh5cyhtZW0pOwotCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX2J1cyA9Ci0JCQkgICAgdmlydF90b19idXMobWVtKTsKLQkJCWZvciAob2ZmID0gMDsgb2ZmIDwgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQotCQkJCVNldFBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7Ci0JCQlkcHJpbnRrKDQsCi0JCQkJS0VSTl9JTkZPCi0JCQkJIiVzOiB2NGxfZmJ1ZmZlcl9hbGxvYygpIC0gVjRMIGZyYW1lICVkIG1lbSAweCVseCAoYnVzOiAweCVseClcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGksICh1bnNpZ25lZCBsb25nKSBtZW0sCi0JCQkJdmlydF90b19idXMobWVtKSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCS8qIFVzZSBoaWdoIG1lbW9yeSB3aGljaCBoYXMgYmVlbiBsZWZ0IGF0IGJvb3QgdGltZSAqLwotCi0JCQkvKiBPay4sIE9rLiB0aGlzIGlzIGFuIGV2aWwgaGFjayAtIHdlIG1ha2UKLQkJCSAqIHRoZSBhc3N1bXB0aW9uIHRoYXQgcGh5c2ljYWwgYWRkcmVzc2VzIGFyZQotCQkJICogdGhlIHNhbWUgYXMgYnVzIGFkZHJlc3NlcyAodHJ1ZSBhdCBsZWFzdAotCQkJICogZm9yIEludGVsIHByb2Nlc3NvcnMpLiBUaGUgd2hvbGUgbWV0aG9kIG9mCi0JCQkgKiBvYnRhaW5pbmcgYW5kIHVzaW5nIHRoaXMgbWVtb3J5IGlzIG5vdCB2ZXJ5Ci0JCQkgKiBuaWNlIC0gYnV0IEkgaG9wZSBpdCBzYXZlcyBzb21lIHBvb3IgdXNlcnMKLQkJCSAqIGZyb20ga2VybmVsIGhhY2tpbmcsIHdoaWNoIG1pZ2h0IGhhdmUgZXZlbgotCQkJICogbW9yZSBldmlsIHJlc3VsdHMgKi8KLQotCQkJaWYgKGkgPT0gMCkgewotCQkJCWludCBzaXplID0KLQkJCQkgICAgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzICoKLQkJCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOwotCi0JCQkJcG1lbSA9IGdldF9oaWdoX21lbShzaXplKTsKLQkJCQlpZiAocG1lbSA9PSAwKSB7Ci0JCQkJCWRwcmludGsoMSwKLQkJCQkJCUtFUk5fRVJSCi0JCQkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSBnZXRfaGlnaF9tZW0gKHNpemUgPSAlZCBLQikgZm9yIFY0TCBidWZzIGZhaWxlZFxuIiwKLQkJCQkJCVpSX0RFVk5BTUUoenIpLCBzaXplID4+IDEwKTsKLQkJCQkJcmV0dXJuIC1FTk9CVUZTOwotCQkJCX0KLQkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyWzBdLmZidWZmZXIgPSBOVUxMOwotCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbMF0uZmJ1ZmZlcl9waHlzID0gcG1lbTsKLQkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyWzBdLmZidWZmZXJfYnVzID0gcG1lbTsKLQkJCQlkcHJpbnRrKDQsCi0JCQkJCUtFUk5fSU5GTwotCQkJCQkiJXM6IHY0bF9mYnVmZmVyX2FsbG9jKCkgLSB1c2luZyAlZCBLQiBoaWdoIG1lbW9yeVxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIHNpemUgPj4gMTApOwotCQkJfSBlbHNlIHsKLQkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIgPSBOVUxMOwotCQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcl9waHlzID0KLQkJCQkgICAgcG1lbSArIGkgKiBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7Ci0JCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyX2J1cyA9Ci0JCQkJICAgIHBtZW0gKyBpICogZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQkJfQotCQl9Ci0JfQotCi0JZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZnJlZSB0aGUgVjRMIGdyYWIgYnVmZmVycyAqLwotc3RhdGljIHZvaWQKLXY0bF9mYnVmZmVyX2ZyZWUgKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKLQlpbnQgaSwgb2ZmOwotCXVuc2lnbmVkIGNoYXIgKm1lbTsKLQotCWRwcmludGsoNCwgS0VSTl9JTkZPICIlczogdjRsX2ZidWZmZXJfZnJlZSgpXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKLQkJaWYgKCFmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplIDw9IE1BWF9LTUFMTE9DX01FTSkgewotCQkJbWVtID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyOwotCQkJZm9yIChvZmYgPSAwOyBvZmYgPCBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7Ci0JCQkgICAgIG9mZiArPSBQQUdFX1NJWkUpCi0JCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQoTUFQX05SKG1lbSArIG9mZikpOwotCQkJa2ZyZWUoKHZvaWQgKikgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5mYnVmZmVyKTsKLQkJfQotCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLmZidWZmZXIgPSBOVUxMOwotCX0KLQotCWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCWZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDA7Ci19Ci0KLS8qCi0gKiAgIEFsbG9jYXRlIHRoZSBNSlBFRyBncmFiIGJ1ZmZlcnMuCi0gKgotICogICBJZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIGlzIHNtYWxsZXIgdGhhbiBNQVhfS01BTExPQ19NRU0sCi0gKiAgIGttYWxsb2MgaXMgdXNlZCB0byByZXF1ZXN0IGEgcGh5c2ljYWxseSBjb250aWd1b3VzIGFyZWEsCi0gKiAgIGVsc2Ugd2UgYWxsb2NhdGUgdGhlIG1lbW9yeSBpbiBmcmFtZ2VudHMgd2l0aCBnZXRfemVyb2VkX3BhZ2UuCi0gKgotICogICBJZiBhIE5hdG9tYSBjaGlwc2V0IGlzIHByZXNlbnQgYW5kIHRoaXMgaXMgYSByZXZpc2lvbiAxIHpyMzYwNTcsCi0gKiAgIGVhY2ggTUpQRUcgYnVmZmVyIG5lZWRzIHRvIGJlIHBoeXNpY2FsbHkgY29udGlndW91cy4KLSAqICAgKFJKOiBUaGlzIHN0YXRlbWVudCBpcyBmcm9tIERhdmUgUGVya3MnIG9yaWdpbmFsIGRyaXZlciwKLSAqICAgSSBjb3VsZCBuZXZlciBjaGVjayBpdCBiZWNhdXNlIEkgaGF2ZSBhIHpyMzYwNjcpCi0gKiAgIFRoZSBkcml2ZXIgY2FyZXMgYWJvdXQgdGhpcyBiZWNhdXNlIGl0IHJlZHVjZXMgdGhlIGJ1ZmZlcgotICogICBzaXplIHRvIE1BWF9LTUFMTE9DX01FTSBpbiB0aGF0IGNhc2UgKHdoaWNoIGZvcmNlcyBjb250aWd1b3VzIGFsbG9jYXRpb24pLgotICoKLSAqICAgUko6IFRoZSBjb250ZW50cyBncmFiIGJ1ZmZlcnMgbmVlZHMgbmV2ZXIgYmUgYWNjZXNzZWQgaW4gdGhlIGRyaXZlci4KLSAqICAgICAgIFRoZXJlZm9yZSB0aGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIHRoZW0gd2l0aCB2bWFsbG9jIGluIG9yZGVyCi0gKiAgICAgICB0byBnZXQgYSBjb250aWd1b3VzIHZpcnR1YWwgbWVtb3J5IHNwYWNlLgotICogICAgICAgSSBkb24ndCB1bmRlcnN0YW5kIHdoeSBtYW55IG90aGVyIGRyaXZlcnMgZmlyc3QgYWxsb2NhdGUgdGhlbSB3aXRoCi0gKiAgICAgICB2bWFsbG9jICh3aGljaCB1c2VzIGludGVybmFsbHkgYWxzbyBnZXRfemVyb2VkX3BhZ2UsIGJ1dCBkZWxpdmVycyB5b3UKLSAqICAgICAgIHZpcnR1YWwgYWRkcmVzc2VzKSBhbmQgdGhlbiBhZ2FpbiBoYXZlIHRvIG1ha2UgYSBsb3Qgb2YgZWZmb3J0cwotICogICAgICAgdG8gZ2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzLgotICoKLSAqICAgQmVuIENhcHBlcjoKLSAqICAgICAgIE9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcyAoc3VjaCBhcyBwcGMpIHNvbWUgZXh0cmEgc3RlcHMKLSAqICAgICAgIGFyZSBuZWVkZWQuIFdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc3RhdF9jb20gYXJyYXkKLSAqICAgICAgIGFuZCBmcmFnbWVudCBidWZmZXJzLCB0aGUgZGV2aWNlIGV4cGVjdHMgdG8gc2VlIGxpdHRsZS0KLSAqICAgICAgIGVuZGlhbiB2YWx1ZXMuIFRoZSB1c2Ugb2YgY3B1X3RvX2xlMzIoKSBhbmQgbGUzMl90b19jcHUoKQotICogICAgICAgaW4gdGhpcyBmdW5jdGlvbiAoYW5kIG9uZSBvciB0d28gb3RoZXJzIGluIHpvcmFuX2RldmljZS5jKQotICogICAgICAgZW5zdXJlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBhbHdheXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KLSAqICAgICAgIGZvcm0sIHJlZ2FyZGxlc3Mgb2YgYXJjaGl0ZWN0dXJlLiBUaGUgenIzNjA1NyBkb2VzIFZlcnkgQmFkCi0gKiAgICAgICBUaGluZ3Mgb24gYmlnIGVuZGlhbiBhcmNoaXRlY3R1cmVzIGlmIHRoZSBzdGF0X2NvbSBhcnJheQotICogICAgICAgYW5kIGZyYWdtZW50IGJ1ZmZlcnMgYXJlIG5vdCBsaXR0bGUtZW5kaWFuLgotICovCi0KLXN0YXRpYyBpbnQKLWpwZ19mYnVmZmVyX2FsbG9jIChzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JaW50IGksIGosIG9mZjsKLQl1bnNpZ25lZCBsb25nIG1lbTsKLQotCS8qIHdlIG1pZ2h0IGhhdmUgb2xkIGJ1ZmZlcnMgbHlpbmcgYXJvdW5kICovCi0JaWYgKGZoLT5qcGdfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCkgewotCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgewotCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYikKLQkJCWRwcmludGsoMiwKLQkJCQlLRVJOX1dBUk5JTkcKLQkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBidWZmZXIgJWQgYWxscmVhZHkgYWxsb2NhdGVkIT9cbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCi0JCS8qIEFsbG9jYXRlIGZyYWdtZW50IHRhYmxlIGZvciB0aGlzIGJ1ZmZlciAqLwotCi0JCW1lbSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKG1lbSA9PSAwKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBnZXRfemVyb2VkX3BhZ2UgKGZyYWdfdGFiKSBmYWlsZWQgZm9yIGJ1ZmZlciAlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7Ci0JCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOwotCQkJcmV0dXJuIC1FTk9CVUZTOwotCQl9Ci0JCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWIgPSAoX19sZTMyICopIG1lbTsKLQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYl9idXMgPQotCQkgICAgdmlydF90b19idXMoKHZvaWQgKikgbWVtKTsKLQotCQkvL2lmIChhbGxvY19jb250aWcpIHsKLQkJaWYgKGZoLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMpIHsKLQkJCW1lbSA9Ci0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MoZmgtPmpwZ19idWZmZXJzLgotCQkJCQkJICAgIGJ1ZmZlcl9zaXplLAotCQkJCQkJICAgIEdGUF9LRVJORUwpOwotCQkJaWYgKG1lbSA9PSAwKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IGpwZ19mYnVmZmVyX2FsbG9jKCkgLSBrbWFsbG9jIGZhaWxlZCBmb3IgYnVmZmVyICVkXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSwgaSk7Ci0JCQkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKLQkJCQlyZXR1cm4gLUVOT0JVRlM7Ci0JCQl9Ci0JCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzBdID0KLQkJCSAgICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygodm9pZCAqKSBtZW0pKTsKLQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMV0gPQotCQkJICAgIGNwdV90b19sZTMyKCgoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplIC8gNCkgPDwgMSkgfCAxKTsKLQkJCWZvciAob2ZmID0gMDsgb2ZmIDwgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQotCQkJCVNldFBhZ2VSZXNlcnZlZChNQVBfTlIobWVtICsgb2ZmKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBqcGdfYnVmc2l6ZSBpcyBhbGxyZWF5IHBhZ2UgYWxpZ25lZCAqLwotCQkJZm9yIChqID0gMDsKLQkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKLQkJCSAgICAgaisrKSB7Ci0JCQkJbWVtID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQkJCWlmIChtZW0gPT0gMCkgewotCQkJCQlkcHJpbnRrKDEsCi0JCQkJCQlLRVJOX0VSUgotCQkJCQkJIiVzOiBqcGdfZmJ1ZmZlcl9hbGxvYygpIC0gZ2V0X3plcm9lZF9wYWdlIGZhaWxlZCBmb3IgYnVmZmVyICVkXG4iLAotCQkJCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCQkJCQlqcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOwotCQkJCQlyZXR1cm4gLUVOT0JVRlM7Ci0JCQkJfQotCi0JCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogal0gPQotCQkJCSAgICBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygodm9pZCAqKSBtZW0pKTsKLQkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqICsKLQkJCQkJCQkJICAgMV0gPQotCQkJCSAgICBjcHVfdG9fbGUzMigoUEFHRV9TSVpFIC8gNCkgPDwgMSk7Ci0JCQkJU2V0UGFnZVJlc2VydmVkKE1BUF9OUihtZW0pKTsKLQkJCX0KLQotCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5mcmFnX3RhYlsyICogaiAtIDFdIHw9IGNwdV90b19sZTMyKDEpOwotCQl9Ci0JfQotCi0JZHByaW50ayg0LAotCQlLRVJOX0RFQlVHICIlczoganBnX2ZidWZmZXJfYWxsb2MoKSAtICVkIEtCIGFsbG9jYXRlZFxuIiwKLQkJWlJfREVWTkFNRSh6ciksCi0JCShmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgKgotCQkgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplKSA+PiAxMCk7Ci0KLQlmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0vKiBmcmVlIHRoZSBNSlBFRyBncmFiIGJ1ZmZlcnMgKi8KLXN0YXRpYyB2b2lkCi1qcGdfZmJ1ZmZlcl9mcmVlIChzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JaW50IGksIGosIG9mZjsKLQl1bnNpZ25lZCBjaGFyICptZW07Ci0KLQlkcHJpbnRrKDQsIEtFUk5fREVCVUcgIiVzOiBqcGdfZmJ1ZmZlcl9mcmVlKClcbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykgewotCQlpZiAoIWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWIpCi0JCQljb250aW51ZTsKLQotCQkvL2lmIChhbGxvY19jb250aWcpIHsKLQkJaWYgKGZoLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXMpIHsKLQkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzBdKSB7Ci0JCQkJbWVtID0gKHVuc2lnbmVkIGNoYXIgKikgYnVzX3RvX3ZpcnQobGUzMl90b19jcHUoCi0JCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0pKTsKLQkJCQlmb3IgKG9mZiA9IDA7Ci0JCQkJICAgICBvZmYgPCBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemU7Ci0JCQkJICAgICBvZmYgKz0gUEFHRV9TSVpFKQotCQkJCQlDbGVhclBhZ2VSZXNlcnZlZChNQVBfTlIKLQkJCQkJCQkgIChtZW0gKyBvZmYpKTsKLQkJCQlrZnJlZShtZW0pOwotCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMF0gPSAwOwotCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMV0gPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChqID0gMDsKLQkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKLQkJCSAgICAgaisrKSB7Ci0JCQkJaWYgKCFmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLgotCQkJCSAgICBmcmFnX3RhYlsyICogal0pCi0JCQkJCWJyZWFrOwotCQkJCUNsZWFyUGFnZVJlc2VydmVkKE1BUF9OUgotCQkJCQkJICAoYnVzX3RvX3ZpcnQKLQkJCQkJCSAgIChsZTMyX3RvX2NwdQotCQkJCQkJICAgIChmaC0+anBnX2J1ZmZlcnMuCi0JCQkJCQkgICAgIGJ1ZmZlcltpXS5mcmFnX3RhYlsyICoKLQkJCQkJCQkJICAgICAgIGpdKSkpKTsKLQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpCi0JCQkJCSAgYnVzX3RvX3ZpcnQKLQkJCQkJCSAgKGxlMzJfdG9fY3B1Ci0JCQkJCQkgICAoZmgtPmpwZ19idWZmZXJzLgotCQkJCQkJICAgICAgYnVmZmVyW2ldLgotCQkJCQkJICAgICAgZnJhZ190YWJbMiAqIGpdKSkpOwotCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWJbMiAqIGpdID0KLQkJCQkgICAgMDsKLQkJCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqICsKLQkJCQkJCQkJICAgMV0gPSAwOwotCQkJfQotCQl9Ci0KLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLgotCQkJICBmcmFnX3RhYik7Ci0JCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uZnJhZ190YWIgPSBOVUxMOwotCX0KLQotCWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCWZoLT5qcGdfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDA7Ci19Ci0KLS8qCi0gKiAgIFY0TCBCdWZmZXIgZ3JhYmJpbmcKLSAqLwotCi1zdGF0aWMgaW50Ci16b3Jhbl92NGxfc2V0X2Zvcm1hdCAoc3RydWN0IGZpbGUgICAgICAgICAgICAgICAqZmlsZSwKLQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0JCSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKLQkJICAgICAgY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCAqZm9ybWF0KQotewotCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKLQlpbnQgYnBwOwotCi0JLyogQ2hlY2sgc2l6ZSBhbmQgZm9ybWF0IG9mIHRoZSBncmFiIHdhbnRlZCAqLwotCi0JaWYgKGhlaWdodCA8IEJVWl9NSU5fSEVJR0hUIHx8IHdpZHRoIDwgQlVaX01JTl9XSURUSCB8fAotCSAgICBoZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCB8fCB3aWR0aCA+IEJVWl9NQVhfV0lEVEgpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIKLQkJCSIlczogdjRsX3NldF9mb3JtYXQoKSAtIHdyb25nIGZyYW1lIHNpemUgKCVkeCVkKVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB3aWR0aCwgaGVpZ2h0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYnBwID0gKGZvcm1hdC0+ZGVwdGggKyA3KSAvIDg7Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IGF2YWlsYWJsZSBidWZmZXIgc2l6ZSAqLwotCWlmIChoZWlnaHQgKiB3aWR0aCAqIGJwcCA+IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB2NGxfc2V0X2Zvcm1hdCgpIC0gdmlkZW8gYnVmZmVyIHNpemUgKCVkIGtCKSBpcyB0b28gc21hbGxcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplID4+IDEwKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogVGhlIHZpZGVvIGZyb250IGVuZCBuZWVkcyA0LWJ5dGUgYWxpbmdlZCBsaW5lIHNpemVzICovCi0KLQlpZiAoKGJwcCA9PSAyICYmICh3aWR0aCAmIDEpKSB8fCAoYnBwID09IDMgJiYgKHdpZHRoICYgMykpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHY0bF9zZXRfZm9ybWF0KCkgLSB3cm9uZyBmcmFtZSBhbGluZ21lbnRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZoLT52NGxfc2V0dGluZ3Mud2lkdGggPSB3aWR0aDsKLQlmaC0+djRsX3NldHRpbmdzLmhlaWdodCA9IGhlaWdodDsKLQlmaC0+djRsX3NldHRpbmdzLmZvcm1hdCA9IGZvcm1hdDsKLQlmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSA9IGJwcCAqIGZoLT52NGxfc2V0dGluZ3Mud2lkdGg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotem9yYW5fdjRsX3F1ZXVlX2ZyYW1lIChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIGludCAgICAgICAgICBudW0pCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlcyA9IDA7Ci0KLQlpZiAoIWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIKLQkJCSIlczogdjRsX3F1ZXVlX2ZyYW1lKCkgLSBidWZmZXJzIG5vdCB5ZXQgYWxsb2NhdGVkXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXMgPSAtRU5PTUVNOwotCX0KLQotCS8qIE5vIGdyYWJiaW5nIG91dHNpZGUgdGhlIGJ1ZmZlciByYW5nZSEgKi8KLQlpZiAobnVtID49IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyB8fCBudW0gPCAwKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHY0bF9xdWV1ZV9mcmFtZSgpIC0gYnVmZmVyICVkIGlzIG91dCBvZiByYW5nZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBudW0pOwotCQlyZXMgPSAtRUlOVkFMOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKLQkJaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgewotCQkJenItPnY0bF9idWZmZXJzID0gZmgtPnY0bF9idWZmZXJzOwotCQkJZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0FDVElWRTsKLQkJfSBlbHNlIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogdjRsX3F1ZXVlX2ZyYW1lKCkgLSBhbm90aGVyIHNlc3Npb24gaXMgYWxyZWFkeSBjYXB0dXJpbmdcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmVzID0gLUVCVVNZOwotCQl9Ci0JfQotCi0JLyogbWFrZSBzdXJlIGEgZ3JhYiBpc24ndCBnb2luZyBvbiBjdXJyZW50bHkgd2l0aCB0aGlzIGJ1ZmZlciAqLwotCWlmICghcmVzKSB7Ci0JCXN3aXRjaCAoenItPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlKSB7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgQlVaX1NUQVRFX1BFTkQ6Ci0JCQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7Ci0JCQkJZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0JCQkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCQl9Ci0JCQlyZXMgPSAtRUJVU1k7CS8qIHdoYXQgYXJlIHlvdSBkb2luZz8gKi8KLQkJCWJyZWFrOwotCQljYXNlIEJVWl9TVEFURV9ET05FOgotCQkJZHByaW50aygyLAotCQkJCUtFUk5fV0FSTklORwotCQkJCSIlczogdjRsX3F1ZXVlX2ZyYW1lKCkgLSBxdWV1ZWluZyBidWZmZXIgJWQgaW4gc3RhdGUgRE9ORSE/XG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBudW0pOwotCQljYXNlIEJVWl9TVEFURV9VU0VSOgotCQkJLyogc2luY2UgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHVudXNlZCBidWZmZXIgdGhlcmUncyByb29tIGZvciBhdCBsZWFzdAotCQkJICogb25lIG1vcmUgcGVuZFtdIGVudHJ5ICovCi0JCQl6ci0+djRsX3BlbmRbenItPnY0bF9wZW5kX2hlYWQrKyAmCi0JCQkJCVY0TF9NQVNLX0ZSQU1FXSA9IG51bTsKLQkJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSA9IEJVWl9TVEFURV9QRU5EOwotCQkJenItPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLmxlbmd0aCA9Ci0JCQkgICAgZmgtPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmUgKgotCQkJICAgIHpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0OwotCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dID0KLQkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV07Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyZXMgJiYgenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKQotCQl6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID0gZmgtPnY0bF9idWZmZXJzLmFjdGl2ZTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXY0bF9ncmFiIChzdHJ1Y3QgZmlsZSAgICAgICAqZmlsZSwKLQkgIHN0cnVjdCB2aWRlb19tbWFwICptcCkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JaW50IHJlcyA9IDAsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZPUk1BVFM7IGkrKykgewotCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5wYWxldHRlID09IG1wLT5mb3JtYXQgJiYKLQkJICAgIHpvcmFuX2Zvcm1hdHNbaV0uZmxhZ3MgJiBaT1JBTl9GT1JNQVRfQ0FQVFVSRSAmJgotCQkgICAgISh6b3Jhbl9mb3JtYXRzW2ldLmZsYWdzICYgWk9SQU5fRk9STUFUX0NPTVBSRVNTRUQpKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IE5VTV9GT1JNQVRTIHx8IHpvcmFuX2Zvcm1hdHNbaV0uZGVwdGggPT0gMCkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB2NGxfZ3JhYigpIC0gd3JvbmcgYnl0ZXMtcGVyLXBpeGVsIGZvcm1hdFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBUbyBtaW5pbWl6ZSB0aGUgdGltZSBzcGVudCBpbiB0aGUgSVJRIHJvdXRpbmUsIHdlIGF2b2lkIHNldHRpbmcgdXAKLQkgKiB0aGUgdmlkZW8gZnJvbnQgZW5kIHRoZXJlLgotCSAqIElmIHRoaXMgZ3JhYiBoYXMgZGlmZmVyZW50IHBhcmFtZXRlcnMgZnJvbSBhIHJ1bm5pbmcgc3RyZWFtaW5nIGNhcHR1cmUKLQkgKiB3ZSBzdG9wIHRoZSBzdHJlYW1pbmcgY2FwdHVyZSBhbmQgc3RhcnQgaXQgb3ZlciBhZ2Fpbi4KLQkgKi8KLQlpZiAoenItPnY0bF9tZW1ncmFiX2FjdGl2ZSAmJgotCSAgICAoenItPnY0bF9zZXR0aW5ncy53aWR0aCAhPSBtcC0+d2lkdGggfHwKLQkgICAgIHpyLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICE9IG1wLT5oZWlnaHQgfHwKLQkgICAgIHpyLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5wYWxldHRlICE9IG1wLT5mb3JtYXQpKSB7Ci0JCXJlcyA9IHdhaXRfZ3JhYl9wZW5kaW5nKHpyKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JfQotCWlmICgocmVzID0gem9yYW5fdjRsX3NldF9mb3JtYXQoZmlsZSwKLQkJCQkJbXAtPndpZHRoLAotCQkJCQltcC0+aGVpZ2h0LAotCQkJCQkmem9yYW5fZm9ybWF0c1tpXSkpKQotCQlyZXR1cm4gcmVzOwotCXpyLT52NGxfc2V0dGluZ3MgPSBmaC0+djRsX3NldHRpbmdzOwotCi0JLyogcXVldWUgdGhlIGZyYW1lIGluIHRoZSBwZW5kaW5nIHF1ZXVlICovCi0JaWYgKChyZXMgPSB6b3Jhbl92NGxfcXVldWVfZnJhbWUoZmlsZSwgbXAtPmZyYW1lKSkpIHsKLQkJZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JLyogcHV0IHRoZSAzNjA1NyBpbnRvIGZyYW1lIGdyYWJiaW5nIG1vZGUgKi8KLQlpZiAoIXJlcyAmJiAhenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKLQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMSk7Ci0KLQkvL2RwcmludGsoNCwgS0VSTl9JTkZPICIlczogRnJhbWUgZ3JhYiAzLi4uXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogU3luYyBvbiBhIFY0TCBidWZmZXIKLSAqLwotCi1zdGF0aWMgaW50Ci12NGxfc3luYyAoc3RydWN0IGZpbGUgKmZpbGUsCi0JICBpbnQgICAgICAgICAgZnJhbWUpCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHY0bF9zeW5jKCkgLSBubyBncmFiIGFjdGl2ZSBmb3IgdGhpcyBzZXNzaW9uXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBjaGVjayBwYXNzZWQtaW4gZnJhbWUgbnVtYmVyICovCi0JaWYgKGZyYW1lID49IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyB8fCBmcmFtZSA8IDApIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIgIiVzOiB2NGxfc3luYygpIC0gZnJhbWUgJWQgaXMgaW52YWxpZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBmcmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIENoZWNrIGlmIGlzIGJ1ZmZlciB3YXMgcXVldWVkIGF0IGFsbCAqLwotCWlmICh6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9PSBCVVpfU1RBVEVfVVNFUikgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB2NGxfc3luYygpIC0gYXR0ZW1wdCB0byBzeW5jIG9uIGEgYnVmZmVyIHdoaWNoIHdhcyBub3QgcXVldWVkP1xuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FUFJPVE87Ci0JfQotCi0JLyogd2FpdCBvbiB0aGlzIGJ1ZmZlciB0byBnZXQgcmVhZHkgKi8KLQlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHpyLT52NGxfY2FwcSwKLQkJCQkoenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgIT0gQlVaX1NUQVRFX1BFTkQpLAotCQkJCTEwKkhaKSkKLQkJcmV0dXJuIC1FVElNRTsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQkvKiBidWZmZXIgc2hvdWxkIG5vdyBiZSBpbiBCVVpfU1RBVEVfRE9ORSAqLwotCWlmICh6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSAhPSBCVVpfU1RBVEVfRE9ORSkKLQkJZHByaW50aygyLAotCQkJS0VSTl9FUlIgIiVzOiB2NGxfc3luYygpIC0gaW50ZXJuYWwgc3RhdGUgZXJyb3JcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0KLQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZSA9IEJVWl9TVEFURV9VU0VSOwotCWZoLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdID0genItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQkvKiBDaGVjayBpZiBzdHJlYW1pbmcgY2FwdHVyZSBoYXMgZmluaXNoZWQgKi8KLQlpZiAoenItPnY0bF9wZW5kX3RhaWwgPT0genItPnY0bF9wZW5kX2hlYWQpIHsKLQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMCk7Ci0JCWlmICh6ci0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0FDVElWRSkgewotCQkJZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9IHpyLT52NGxfYnVmZmVycy5hY3RpdmUgPQotCQkJICAgIFpPUkFOX0ZSRUU7Ci0JCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgIFF1ZXVlIGEgTUpQRUcgYnVmZmVyIGZvciBjYXB0dXJlL3BsYXliYWNrCi0gKi8KLQotc3RhdGljIGludAotem9yYW5fanBnX3F1ZXVlX2ZyYW1lIChzdHJ1Y3QgZmlsZSAgICAgICAgICAqZmlsZSwKLQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgICBudW0sCi0JCSAgICAgICBlbnVtIHpvcmFuX2NvZGVjX21vZGUgbW9kZSkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVzID0gMDsKLQotCS8qIENoZWNrIGlmIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCAqLwotCWlmICghZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBqcGdfcXVldWVfZnJhbWUoKSAtIGJ1ZmZlcnMgbm90IHlldCBhbGxvY2F0ZWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIE5vIGdyYWJiaW5nIG91dHNpZGUgdGhlIGJ1ZmZlciByYW5nZSEgKi8KLQlpZiAobnVtID49IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyB8fCBudW0gPCAwKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGpwZ19xdWV1ZV9mcmFtZSgpIC0gYnVmZmVyICVkIG91dCBvZiByYW5nZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBudW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiB3aGF0IGlzIHRoZSBjb2RlYyBtb2RlIHJpZ2h0IG5vdz8gKi8KLQlpZiAoenItPmNvZGVjX21vZGUgPT0gQlVaX01PREVfSURMRSkgewotCQl6ci0+anBnX3NldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKLQl9IGVsc2UgaWYgKHpyLT5jb2RlY19tb2RlICE9IG1vZGUpIHsKLQkJLyogd3JvbmcgY29kZWMgbW9kZSBhY3RpdmUgLSBpbnZhbGlkICovCi0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGpwZ19xdWV1ZV9mcmFtZSgpIC0gY29kZWMgaW4gd3JvbmcgbW9kZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgewotCQlpZiAoenItPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7Ci0JCQl6ci0+anBnX2J1ZmZlcnMgPSBmaC0+anBnX2J1ZmZlcnM7Ci0JCQlmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fQUNUSVZFOwotCQl9IGVsc2UgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBqcGdfcXVldWVfZnJhbWUoKSAtIGFub3RoZXIgc2Vzc2lvbiBpcyBhbHJlYWR5IGNhcHR1cmluZ1xuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQlpZiAoIXJlcyAmJiB6ci0+Y29kZWNfbW9kZSA9PSBCVVpfTU9ERV9JRExFKSB7Ci0JCS8qIE9rIGxvYWQgdXAgdGhlIGpwZWcgY29kZWMgKi8KLQkJenIzNjA1N19lbmFibGVfanBnKHpyLCBtb2RlKTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXJlcykgewotCQlzd2l0Y2ggKHpyLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSkgewotCQljYXNlIEJVWl9TVEFURV9ET05FOgotCQkJZHByaW50aygyLAotCQkJCUtFUk5fV0FSTklORwotCQkJCSIlczoganBnX3F1ZXVlX2ZyYW1lKCkgLSBxdWVpbmcgZnJhbWUgaW4gQlVaX1NUQVRFX0RPTkUgc3RhdGUhP1xuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCWNhc2UgQlVaX1NUQVRFX1VTRVI6Ci0JCQkvKiBzaW5jZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdW51c2VkIGJ1ZmZlciB0aGVyZSdzIHJvb20gZm9yIGF0Ci0JCQkgKmxlYXN0IG9uZSBtb3JlIHBlbmRbXSBlbnRyeSAqLwotCQkJenItPmpwZ19wZW5kW3pyLT5qcGdfcXVlX2hlYWQrKyAmIEJVWl9NQVNLX0ZSQU1FXSA9Ci0JCQkgICAgbnVtOwotCQkJenItPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID0gQlVaX1NUQVRFX1BFTkQ7Ci0JCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0gPQotCQkJICAgIHpyLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXTsKLQkJCXpvcmFuX2ZlZWRfc3RhdF9jb20oenIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgQlVaX1NUQVRFX0RNQToKLQkJY2FzZSBCVVpfU1RBVEVfUEVORDoKLQkJCWlmICh6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUpIHsKLQkJCQlmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKLQkJCQl6ci0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKLQkJCX0KLQkJCXJlcyA9IC1FQlVTWTsJLyogd2hhdCBhcmUgeW91IGRvaW5nPyAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmICghcmVzICYmIHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgewotCQl6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0gZmgtPmpwZ19idWZmZXJzLmFjdGl2ZTsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1qcGdfcWJ1ZiAoc3RydWN0IGZpbGUgICAgICAgICAgKmZpbGUsCi0JICBpbnQgICAgICAgICAgICAgICAgICAgZnJhbWUsCi0JICBlbnVtIHpvcmFuX2NvZGVjX21vZGUgbW9kZSkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JaW50IHJlcyA9IDA7Ci0KLQkvKiBEb2VzIHRoZSB1c2VyIHdhbnQgdG8gc3RvcCBzdHJlYW1pbmc/ICovCi0JaWYgKGZyYW1lIDwgMCkgewotCQlpZiAoenItPmNvZGVjX21vZGUgPT0gbW9kZSkgewotCQkJaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBqcGdfcWJ1ZigtMSkgLSBzZXNzaW9uIG5vdCBhY3RpdmVcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPSB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0KLQkJCSAgICBaT1JBTl9GUkVFOwotCQkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCQl6cjM2MDU3X2VuYWJsZV9qcGcoenIsIEJVWl9NT0RFX0lETEUpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IGpwZ19xYnVmKCkgLSBzdG9wIHN0cmVhbWluZyBidXQgbm90IGluIHN0cmVhbWluZyBtb2RlXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JaWYgKChyZXMgPSB6b3Jhbl9qcGdfcXVldWVfZnJhbWUoZmlsZSwgZnJhbWUsIG1vZGUpKSkKLQkJcmV0dXJuIHJlczsKLQotCS8qIFN0YXJ0IHRoZSBqcGVnIGNvZGVjIHdoZW4gdGhlIGZpcnN0IGZyYW1lIGlzIHF1ZXVlZCAgKi8KLQlpZiAoIXJlcyAmJiB6ci0+anBnX3F1ZV9oZWFkID09IDEpCi0JCWpwZWdfc3RhcnQoenIpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqICAgU3luYyBvbiBhIE1KUEVHIGJ1ZmZlcgotICovCi0KLXN0YXRpYyBpbnQKLWpwZ19zeW5jIChzdHJ1Y3QgZmlsZSAgICAgICAqZmlsZSwKLQkgIHN0cnVjdCB6b3Jhbl9zeW5jICpicykKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZnJhbWU7Ci0KLQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGpwZ19zeW5jKCkgLSBjYXB0dXJlIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHpyLT5jb2RlY19tb2RlICE9IEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTICYmCi0JICAgIHpyLT5jb2RlY19tb2RlICE9IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUykgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBqcGdfc3luYygpIC0gY29kZWMgbm90IGluIHN0cmVhbWluZyBtb2RlXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCF3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh6ci0+anBnX2NhcHEsCi0JCQkoenItPmpwZ19xdWVfdGFpbCAhPSB6ci0+anBnX2RtYV90YWlsIHx8Ci0JCQkgenItPmpwZ19kbWFfdGFpbCA9PSB6ci0+anBnX2RtYV9oZWFkKSwKLQkJCTEwKkhaKSkgewotCQlpbnQgaXNyOwotCi0JCWJ0YW5kKH5aUjM2MDU3X0pNQ19Hb19lbiwgWlIzNjA1N19KTUMpOwotCQl1ZGVsYXkoMSk7Ci0JCXpyLT5jb2RlYy0+Y29udHJvbCh6ci0+Y29kZWMsIENPREVDX0dfU1RBVFVTLAotCQkJCQkgICBzaXplb2YoaXNyKSwgJmlzcik7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGpwZ19zeW5jKCkgLSB0aW1lb3V0OiBjb2RlYyBpc3I9MHglMDJ4XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGlzcik7Ci0KLQkJcmV0dXJuIC1FVElNRTsKLQotCX0KLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoenItPmpwZ19kbWFfdGFpbCAhPSB6ci0+anBnX2RtYV9oZWFkKQotCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX3F1ZV90YWlsKysgJiBCVVpfTUFTS19GUkFNRV07Ci0JZWxzZQotCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX3F1ZV90YWlsICYgQlVaX01BU0tfRlJBTUVdOwotCi0JLyogYnVmZmVyIHNob3VsZCBub3cgYmUgaW4gQlVaX1NUQVRFX0RPTkUgKi8KLQlpZiAoenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgIT0gQlVaX1NUQVRFX0RPTkUpCi0JCWRwcmludGsoMiwKLQkJCUtFUk5fRVJSICIlczoganBnX3N5bmMoKSAtIGludGVybmFsIHN0YXRlIGVycm9yXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCi0JKmJzID0genItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uYnM7Ci0JYnMtPmZyYW1lID0gZnJhbWU7Ci0JenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsKLQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXSA9IHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXpvcmFuX29wZW5faW5pdF9zZXNzaW9uIChzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0KLQkvKiBQZXIgZGVmYXVsdCwgbWFwIHRoZSBWNEwgQnVmZmVycyAqLwotCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX1JBVzsKLQotCS8qIHRha2Ugb3ZlciB0aGUgY2FyZCdzIGN1cnJlbnQgc2V0dGluZ3MgKi8KLQlmaC0+b3ZlcmxheV9zZXR0aW5ncyA9IHpyLT5vdmVybGF5X3NldHRpbmdzOwotCWZoLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDA7Ci0JZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0ID0genItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0OwotCWZoLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0KLQkvKiB2NGwgc2V0dGluZ3MgKi8KLQlmaC0+djRsX3NldHRpbmdzID0genItPnY0bF9zZXR0aW5nczsKLQotCS8qIHY0bF9idWZmZXJzICovCi0JbWVtc2V0KCZmaC0+djRsX2J1ZmZlcnMsIDAsIHNpemVvZihzdHJ1Y3Qgem9yYW5fdjRsX3N0cnVjdCkpOwotCWZvciAoaSA9IDA7IGkgPCBWSURFT19NQVhfRlJBTUU7IGkrKykgewotCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0gQlVaX1NUQVRFX1VTRVI7CS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KLQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5icy5mcmFtZSA9IGk7Ci0JfQotCWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCWZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDA7Ci0JZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0JZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplID0gdjRsX2J1ZnNpemU7Ci0JZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzID0gdjRsX25idWZzOwotCi0JLyoganBnIHNldHRpbmdzICovCi0JZmgtPmpwZ19zZXR0aW5ncyA9IHpyLT5qcGdfc2V0dGluZ3M7Ci0KLQkvKiBqcGdfYnVmZmVycyAqLwotCW1lbXNldCgmZmgtPmpwZ19idWZmZXJzLCAwLCBzaXplb2Yoc3RydWN0IHpvcmFuX2pwZ19zdHJ1Y3QpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlVaX01BWF9GUkFNRTsgaSsrKSB7Ci0JCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPSBCVVpfU1RBVEVfVVNFUjsJLyogbm90aGluZyBnb2luZyBvbiAqLwotCQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLmJzLmZyYW1lID0gaTsKLQl9Ci0JZmgtPmpwZ19idWZmZXJzLm5lZWRfY29udGlndW91cyA9IHpyLT5qcGdfYnVmZmVycy5uZWVkX2NvbnRpZ3VvdXM7Ci0JZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkID0gMDsKLQlmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0gWk9SQU5fRlJFRTsKLQlmaC0+anBnX2J1ZmZlcnMuYnVmZmVyX3NpemUgPSBqcGdfYnVmc2l6ZTsKLQlmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgPSBqcGdfbmJ1ZnM7Ci19Ci0KLXN0YXRpYyB2b2lkCi16b3Jhbl9jbG9zZV9lbmRfc2Vzc2lvbiAoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCi0JLyogb3ZlcmxheSAqLwotCWlmIChmaC0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSkgewotCQlmaC0+b3ZlcmxheV9hY3RpdmUgPSB6ci0+b3ZlcmxheV9hY3RpdmUgPSBaT1JBTl9GUkVFOwotCQl6ci0+djRsX292ZXJsYXlfYWN0aXZlID0gMDsKLQkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQotCQkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKLQkJenItPm92ZXJsYXlfbWFzayA9IE5VTEw7Ci0JfQotCi0JLyogdjRsIGNhcHR1cmUgKi8KLQlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKLQkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KLQkJICAgIFpPUkFOX0ZSRUU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCX0KLQotCS8qIHY0bCBidWZmZXJzICovCi0JaWYgKGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgfHwKLQkgICAgZmgtPnY0bF9idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKSB7Ci0JCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7Ci0JfQotCi0JLyoganBnIGNhcHR1cmUgKi8KLQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7Ci0JCXpyMzYwNTdfZW5hYmxlX2pwZyh6ciwgQlVaX01PREVfSURMRSk7Ci0JCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCQl6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0gZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9Ci0JCSAgICBaT1JBTl9GUkVFOwotCX0KLQotCS8qIGpwZyBidWZmZXJzICovCi0JaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwKLQkgICAgZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKSB7Ci0JCWpwZ19mYnVmZmVyX2ZyZWUoZmlsZSk7Ci0JfQotfQotCi0vKgotICogICBPcGVuIGEgem9yYW4gY2FyZC4gUmlnaHQgbm93IHRoZSBmbGFncyBzdHVmZiBpcyBqdXN0IHBsYXlpbmcKLSAqLwotCi1zdGF0aWMgaW50Ci16b3Jhbl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCSAgICBzdHJ1Y3QgZmlsZSAgKmZpbGUpCi17Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gTlVMTDsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoOwotCWludCBpLCByZXMsIGZpcnN0X29wZW4gPSAwLCBoYXZlX21vZHVsZV9sb2NrcyA9IDA7Ci0KLQkvKiBmaW5kIHRoZSBkZXZpY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtOyBpKyspIHsKLQkJaWYgKHpvcmFuW2ldLT52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSB7Ci0JCQl6ciA9IHpvcmFuW2ldOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIXpyKSB7Ci0JCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiBkZXZpY2Ugbm90IGZvdW5kIVxuIiwgWk9SQU5fTkFNRSk7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKLQl9Ci0KLQkvKiBzZWUgZnMvZGV2aWNlLmMgLSB0aGUga2VybmVsIGFscmVhZHkgbG9ja3MgZHVyaW5nIG9wZW4oKSwKLQkgKiBzbyBsb2NraW5nIG91cnNlbHZlcyBvbmx5IGNhdXNlcyBkZWFkbG9ja3MgKi8KLQkvKm11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsqLwotCi0JaWYgKCF6ci0+ZGVjb2RlcikgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUiAiJXM6IG5vIFRWIGRlY29kZXIgbG9hZGVkIGZvciBkZXZpY2UhXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXMgPSAtRUlPOwotCQlnb3RvIG9wZW5fdW5sb2NrX2FuZF9yZXR1cm47Ci0JfQotCi0JLyogdHJ5IHRvIGdyYWIgYSBtb2R1bGUgbG9jayAqLwotCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGZhaWxlZCB0byBhY3F1aXJlIG15IG93biBsb2NrISBQQU5JQyFcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKLQl9Ci0JaWYgKCF0cnlfbW9kdWxlX2dldCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5kcml2ZXIub3duZXIpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGZhaWxlZCB0byBncmFiIG93bmVyc2hpcCBvZiBpMmMgZGVjb2RlclxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmVzID0gLUVJTzsKLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCWdvdG8gb3Blbl91bmxvY2tfYW5kX3JldHVybjsKLQl9Ci0JaWYgKHpyLT5lbmNvZGVyICYmCi0JICAgICF0cnlfbW9kdWxlX2dldCh6ci0+ZW5jb2Rlci0+ZHJpdmVyLT5kcml2ZXIub3duZXIpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IGZhaWxlZCB0byBncmFiIG93bmVyc2hpcCBvZiBpMmMgZW5jb2RlclxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmVzID0gLUVJTzsKLQkJbW9kdWxlX3B1dCh6ci0+ZGVjb2Rlci0+ZHJpdmVyLT5kcml2ZXIub3duZXIpOwotCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQotCWhhdmVfbW9kdWxlX2xvY2tzID0gMTsKLQotCWlmICh6ci0+dXNlciA+PSAyMDQ4KSB7Ci0JCWRwcmludGsoMSwgS0VSTl9FUlIgIiVzOiB0b28gbWFueSB1c2VycyAoJWQpIG9uIGRldmljZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB6ci0+dXNlcik7Ci0JCXJlcyA9IC1FQlVTWTsKLQkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQotCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogem9yYW5fb3BlbiglcywgcGlkPVslZF0pLCB1c2VycygtKT0lZFxuIiwKLQkJWlJfREVWTkFNRSh6ciksIGN1cnJlbnQtPmNvbW0sIHRhc2tfcGlkX25yKGN1cnJlbnQpLCB6ci0+dXNlcik7Ci0KLQkvKiBub3csIGNyZWF0ZSB0aGUgb3BlbigpLXNwZWNpZmljIGZpbGVfb3BzIHN0cnVjdCAqLwotCWZoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpvcmFuX2ZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmaCkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB6b3Jhbl9vcGVuKCkgLSBhbGxvY2F0aW9uIG9mIHpvcmFuX2ZoIGZhaWxlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQkvKiB1c2VkIHRvIGJlIEJVWl9NQVhfV0lEVEgvSEVJR0hULCBidXQgdGhhdCBnaXZlcyBvdmVyZmxvd3MKLQkgKiBvbiBub3JtLWNoYW5nZSEgKi8KLQlmaC0+b3ZlcmxheV9tYXNrID0KLQkgICAga21hbGxvYygoKDc2OCArIDMxKSAvIDMyKSAqIDU3NiAqIDQsIEdGUF9LRVJORUwpOwotCWlmICghZmgtPm92ZXJsYXlfbWFzaykgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiB6b3Jhbl9vcGVuKCkgLSBhbGxvY2F0aW9uIG9mIG92ZXJsYXlfbWFzayBmYWlsZWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCWtmcmVlKGZoKTsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBvcGVuX3VubG9ja19hbmRfcmV0dXJuOwotCX0KLQotCWlmICh6ci0+dXNlcisrID09IDApCi0JCWZpcnN0X29wZW4gPSAxOwotCi0JLyptdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsqLwotCi0JLyogZGVmYXVsdCBzZXR1cCAtIFRPRE86IGxvb2sgYXQgZmxhZ3MgKi8KLQlpZiAoZmlyc3Rfb3BlbikgewkvKiBGaXJzdCBkZXZpY2Ugb3BlbiAqLwotCQl6cjM2MDU3X3Jlc3RhcnQoenIpOwotCQl6b3Jhbl9vcGVuX2luaXRfcGFyYW1zKHpyKTsKLQkJem9yYW5faW5pdF9oYXJkd2FyZSh6cik7Ci0KLQkJYnRvcihaUjM2MDU3X0lDUl9JbnRQaW5FbiwgWlIzNjA1N19JQ1IpOwotCX0KLQotCS8qIHNldCBmaWxlX29wcyBzdHVmZiAqLwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwotCWZoLT56ciA9IHpyOwotCXpvcmFuX29wZW5faW5pdF9zZXNzaW9uKGZpbGUpOwotCi0JcmV0dXJuIDA7Ci0KLW9wZW5fdW5sb2NrX2FuZF9yZXR1cm46Ci0JLyogaWYgd2UgZ3JhYmJlZCBsb2NrcywgcmVsZWFzZSB0aGVtIGFjY29yZGluZ2x5ICovCi0JaWYgKGhhdmVfbW9kdWxlX2xvY2tzKSB7Ci0JCW1vZHVsZV9wdXQoenItPmRlY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKLQkJaWYgKHpyLT5lbmNvZGVyKSB7Ci0JCQltb2R1bGVfcHV0KHpyLT5lbmNvZGVyLT5kcml2ZXItPmRyaXZlci5vd25lcik7Ci0JCX0KLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JfQotCi0JLyogaWYgdGhlcmUncyBubyBkZXZpY2UgZm91bmQsIHdlIGRpZG4ndCBvYnRhaW4gdGhlIGxvY2sgZWl0aGVyICovCi0JaWYgKHpyKSB7Ci0JCS8qbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci16b3Jhbl9jbG9zZSAoc3RydWN0IGlub2RlICppbm9kZSwKLQkgICAgIHN0cnVjdCBmaWxlICAqZmlsZSkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0KLQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6IHpvcmFuX2Nsb3NlKCVzLCBwaWQ9WyVkXSksIHVzZXJzKCspPSVkXG4iLAotCQlaUl9ERVZOQU1FKHpyKSwgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksIHpyLT51c2VyKTsKLQotCS8qIGtlcm5lbCBsb2NrcyAoZnMvZGV2aWNlLmMpLCBzbyBkb24ndCBkbyB0aGF0IG91cnNlbHZlcwotCSAqIChwcmV2ZW50cyBkZWFkbG9ja3MpICovCi0JLyptdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ki8KLQotCXpvcmFuX2Nsb3NlX2VuZF9zZXNzaW9uKGZpbGUpOwotCi0JaWYgKHpyLT51c2VyLS0gPT0gMSkgewkvKiBMYXN0IHByb2Nlc3MgKi8KLQkJLyogQ2xlYW4gdXAgSlBFRyBwcm9jZXNzICovCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenItPmpwZ19jYXBxKTsKLQkJenIzNjA1N19lbmFibGVfanBnKHpyLCBCVVpfTU9ERV9JRExFKTsKLQkJenItPmpwZ19idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOwotCi0JCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCQlidGFuZCh+WlIzNjA1N19JQ1JfSW50UGluRW4sIFpSMzYwNTdfSUNSKTsKLQotCQlpZiAoenIzNjA2N19kZWJ1ZyA+IDEpCi0JCQlwcmludF9pbnRlcnJ1cHRzKHpyKTsKLQotCQkvKiBPdmVybGF5IG9mZiAqLwotCQl6ci0+djRsX292ZXJsYXlfYWN0aXZlID0gMDsKLQkJenIzNjA1N19vdmVybGF5KHpyLCAwKTsKLQkJenItPm92ZXJsYXlfbWFzayA9IE5VTEw7Ci0KLQkJLyogY2FwdHVyZSBvZmYgKi8KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6ci0+djRsX2NhcHEpOwotCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKLQkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBaT1JBTl9GUkVFOwotCQl6b3Jhbl9zZXRfcGNpX21hc3Rlcih6ciwgMCk7Ci0KLQkJaWYgKCFwYXNzX3Rocm91Z2gpIHsJLyogU3dpdGNoIHRvIGNvbG9yIGJhciAqLwotCQkJaW50IHplcm8gPSAwLCB0d28gPSAyOwotCQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0VOQUJMRV9PVVRQVVQsICZ6ZXJvKTsKLQkJCWVuY29kZXJfY29tbWFuZCh6ciwgRU5DT0RFUl9TRVRfSU5QVVQsICZ0d28pOwotCQl9Ci0JfQotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlrZnJlZShmaC0+b3ZlcmxheV9tYXNrKTsKLQlrZnJlZShmaCk7Ci0KLQkvKiByZWxlYXNlIGxvY2tzIG9uIHRoZSBpMmMgbW9kdWxlcyAqLwotCW1vZHVsZV9wdXQoenItPmRlY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKLQlpZiAoenItPmVuY29kZXIpIHsKLQkJIG1vZHVsZV9wdXQoenItPmVuY29kZXItPmRyaXZlci0+ZHJpdmVyLm93bmVyKTsKLQl9Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0KLQkvKm11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOyovCi0KLQlkcHJpbnRrKDQsIEtFUk5fSU5GTyAiJXM6IHpvcmFuX2Nsb3NlKCkgZG9uZVxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QKLXpvcmFuX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLAotCSAgICBjaGFyICAgICAgICBfX3VzZXIgKmRhdGEsCi0JICAgIHNpemVfdCAgICAgICBjb3VudCwKLQkgICAgbG9mZl90ICAgICAgKnBwb3MpCi17Ci0JLyogd2Ugc2ltcGx5IGRvbid0IHN1cHBvcnQgcmVhZCgpICh5ZXQpLi4uICovCi0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHNzaXplX3QKLXpvcmFuX3dyaXRlIChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkgICAgIGNvbnN0IGNoYXIgIF9fdXNlciAqZGF0YSwKLQkgICAgIHNpemVfdCAgICAgICBjb3VudCwKLQkgICAgIGxvZmZfdCAgICAgICpwcG9zKQotewotCS8qIC4uLmFuZCB0aGUgc2FtZSBnb2VzIGZvciB3cml0ZSgpICovCi0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludAotc2V0dXBfZmJ1ZmZlciAoc3RydWN0IGZpbGUgICAgICAgICAgICAgICAqZmlsZSwKLQkgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqYmFzZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCAqZm10LAotCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAotCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3BlcmxpbmUpCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCi0JLyogKFJvbmFsZCkgdjRsL3Y0bDIgZ3VpZGVsaW5lcyAqLwotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCS8qIERvbid0IGFsbG93IGZyYW1lIGJ1ZmZlciBvdmVybGF5IGlmIFBDSSBvciBBR1AgaXMgYnVnZ3ksIG9yIG9uCi0JICAgQUxpIE1hZ2lrICh0aGF0IG5lZWRzIHZlcnkgbG93IGxhdGVuY3kgd2hpbGUgdGhlIGNhcmQgbmVlZHMgYQotCSAgIGhpZ2hlciB2YWx1ZSBhbHdheXMpICovCi0KLQlpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfRkFJTCB8IFBDSUFHUF9GQUlMIHwgUENJUENJX0FMSU1BR0lLKSkKLQkJcmV0dXJuIC1FTlhJTzsKLQotCS8qIHdlIG5lZWQgYSBieXRlc3BlcmxpbmUgdmFsdWUsIGV2ZW4gaWYgbm90IGdpdmVuICovCi0JaWYgKCFieXRlc3BlcmxpbmUpCi0JCWJ5dGVzcGVybGluZSA9IHdpZHRoICogKChmbXQtPmRlcHRoICsgNykgJiB+NykgLyA4OwotCi0jaWYgMAotCWlmICh6ci0+b3ZlcmxheV9hY3RpdmUpIHsKLQkJLyogZHpqZWUuLi4gc3R1cGlkIHVzZXJzLi4uIGRvbid0IGV2ZW4gYm90aGVyIHRvIHR1cm4gb2ZmCi0JCSAqIG92ZXJsYXkgYmVmb3JlIGNoYW5naW5nIHRoZSBtZW1vcnkgbG9jYXRpb24uLi4KLQkJICogbm9ybWFsbHksIHdlIHdvdWxkIHJldHVybiBlcnJvcnMgaGVyZS4gSG93ZXZlciwgb25lIG9mCi0JCSAqIHRoZSB0b29scyB0aGF0IGRvZXMgdGhpcyBpcy4uLiB4YXd0diEgYW5kIHNpbmNlIHhhd3R2Ci0JCSAqIGlzIHVzZWQgYnkgKy8tIDk5JSBvZiB0aGUgdXNlcnMsIHdlJ2QgcmF0aGVyIGJlIHVzZXItCi0JCSAqIGZyaWVuZGx5IGFuZCBzaWxlbnRseSBkbyBhcyBpZiBub3RoaW5nIHdlbnQgd3JvbmcgKi8KLQkJZHByaW50aygzLAotCQkJS0VSTl9FUlIKLQkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gZm9yY2VkIG92ZXJsYXkgdHVybm9mZiBiZWNhdXNlIGZyYW1lYnVmZmVyIGNoYW5nZWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7Ci0JfQotI2VuZGlmCi0KLQlpZiAoIShmbXQtPmZsYWdzICYgWk9SQU5fRk9STUFUX09WRVJMQVkpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHNldHVwX2ZidWZmZXIoKSAtIG5vIHZhbGlkIG92ZXJsYXkgZm9ybWF0IGdpdmVuXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGhlaWdodCA8PSAwIHx8IHdpZHRoIDw9IDAgfHwgYnl0ZXNwZXJsaW5lIDw9IDApIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIKLQkJCSIlczogc2V0dXBfZmJ1ZmZlcigpIC0gaW52YWxpZCBoZWlnaHQvd2lkdGgvYnBsIHZhbHVlICglZHwlZHwlZClcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgd2lkdGgsIGhlaWdodCwgYnl0ZXNwZXJsaW5lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChieXRlc3BlcmxpbmUgJiAzKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHNldHVwX2ZidWZmZXIoKSAtIGJ5dGVzcGVybGluZSAoJWQpIG11c3QgYmUgNC1ieXRlIGFsaWduZWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgYnl0ZXNwZXJsaW5lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JenItPmJ1ZmZlci5iYXNlID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBiYXNlICYgfjMpOwotCXpyLT5idWZmZXIuaGVpZ2h0ID0gaGVpZ2h0OwotCXpyLT5idWZmZXIud2lkdGggPSB3aWR0aDsKLQl6ci0+YnVmZmVyLmRlcHRoID0gZm10LT5kZXB0aDsKLQl6ci0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQgPSBmbXQ7Ci0JenItPmJ1ZmZlci5ieXRlc3BlcmxpbmUgPSBieXRlc3BlcmxpbmU7Ci0KLQkvKiBUaGUgdXNlciBzaG91bGQgc2V0IG5ldyB3aW5kb3cgcGFyYW1ldGVycyAqLwotCXpyLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1zZXR1cF93aW5kb3cgKHN0cnVjdCBmaWxlICAgICAgICpmaWxlLAotCSAgICAgIGludCAgICAgICAgICAgICAgICB4LAotCSAgICAgIGludCAgICAgICAgICAgICAgICB5LAotCSAgICAgIGludCAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICBpbnQgICAgICAgICAgICAgICAgaGVpZ2h0LAotCSAgICAgIHN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqY2xpcHMsCi0JICAgICAgaW50ICAgICAgICAgICAgICAgIGNsaXBjb3VudCwKLQkgICAgICB2b2lkICAgICAgICAgICAgICBfX3VzZXIgKmJpdG1hcCkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0Jc3RydWN0IHZpZGVvX2NsaXAgKnZjcCA9IE5VTEw7Ci0JaW50IG9uLCBlbmQ7Ci0KLQotCWlmICghenItPmJ1ZmZlci5iYXNlKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gZnJhbWUgYnVmZmVyIGhhcyB0byBiZSBzZXQgZmlyc3RcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHNldHVwX3dpbmRvdygpIC0gbm8gb3ZlcmxheSBmb3JtYXQgc2V0XG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIFRoZSB2aWRlbyBmcm9udCBlbmQgbmVlZHMgNC1ieXRlIGFsaW5nZWQgbGluZSBzaXplcywgd2UgY29ycmVjdCB0aGF0Ci0JICogc2lsZW50bHkgaGVyZSBpZiBuZWNlc3NhcnkKLQkgKi8KLQlpZiAoenItPmJ1ZmZlci5kZXB0aCA9PSAxNSB8fCB6ci0+YnVmZmVyLmRlcHRoID09IDE2KSB7Ci0JCWVuZCA9ICh4ICsgd2lkdGgpICYgfjE7CS8qIHJvdW5kIGRvd24gKi8KLQkJeCA9ICh4ICsgMSkgJiB+MTsJLyogcm91bmQgdXAgKi8KLQkJd2lkdGggPSBlbmQgLSB4OwotCX0KLQotCWlmICh6ci0+YnVmZmVyLmRlcHRoID09IDI0KSB7Ci0JCWVuZCA9ICh4ICsgd2lkdGgpICYgfjM7CS8qIHJvdW5kIGRvd24gKi8KLQkJeCA9ICh4ICsgMykgJiB+MzsJLyogcm91bmQgdXAgKi8KLQkJd2lkdGggPSBlbmQgLSB4OwotCX0KLQotCWlmICh3aWR0aCA+IEJVWl9NQVhfV0lEVEgpCi0JCXdpZHRoID0gQlVaX01BWF9XSURUSDsKLQlpZiAoaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCi0JCWhlaWdodCA9IEJVWl9NQVhfSEVJR0hUOwotCi0JLyogQ2hlY2sgZm9yIHZhaWxkIHBhcmFtZXRlcnMgKi8KLQlpZiAod2lkdGggPCBCVVpfTUlOX1dJRFRIIHx8IGhlaWdodCA8IEJVWl9NSU5fSEVJR0hUIHx8Ci0JICAgIHdpZHRoID4gQlVaX01BWF9XSURUSCB8fCBoZWlnaHQgPiBCVVpfTUFYX0hFSUdIVCkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBzZXR1cF93aW5kb3coKSAtIHdpZHRoID0gJWQgb3IgaGVpZ2h0ID0gJWQgaW52YWxpZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB3aWR0aCwgaGVpZ2h0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZmgtPm92ZXJsYXlfc2V0dGluZ3MueCA9IHg7Ci0JZmgtPm92ZXJsYXlfc2V0dGluZ3MueSA9IHk7Ci0JZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggPSB3aWR0aDsKLQlmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQgPSBoZWlnaHQ7Ci0JZmgtPm92ZXJsYXlfc2V0dGluZ3MuY2xpcGNvdW50ID0gY2xpcGNvdW50OwotCi0JLyoKLQkgKiBJZiBhbiBvdmVybGF5IGlzIHJ1bm5pbmcsIHdlIGhhdmUgdG8gc3dpdGNoIGl0IG9mZgotCSAqIGFuZCBzd2l0Y2ggaXQgb24gYWdhaW4gaW4gb3JkZXIgdG8gZ2V0IHRoZSBuZXcgc2V0dGluZ3MgaW4gZWZmZWN0LgotCSAqCi0JICogV2UgYWxzbyB3YW50IHRvIGF2b2lkIHRoYXQgdGhlIG92ZXJsYXkgbWFzayBpcyB3cml0dGVuCi0JICogd2hlbiBhbiBvdmVybGF5IGlzIHJ1bm5pbmcuCi0JICovCi0KLQlvbiA9IHpyLT52NGxfb3ZlcmxheV9hY3RpdmUgJiYgIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgJiYKLQkgICAgenItPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKLQkgICAgZmgtPm92ZXJsYXlfYWN0aXZlICE9IFpPUkFOX0ZSRUU7Ci0JaWYgKG9uKQotCQl6cjM2MDU3X292ZXJsYXkoenIsIDApOwotCi0JLyoKLQkgKiAgIFdyaXRlIHRoZSBvdmVybGF5IG1hc2sgaWYgY2xpcHMgYXJlIHdhbnRlZC4KLQkgKiAgIFdlIHByZWZlciBhIGJpdG1hcC4KLQkgKi8KLQlpZiAoYml0bWFwKSB7Ci0JCS8qIGZha2UgdmFsdWUgLSBpdCBqdXN0IG1lYW5zIHdlIHdhbnQgY2xpcHMgKi8KLQkJZmgtPm92ZXJsYXlfc2V0dGluZ3MuY2xpcGNvdW50ID0gMTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoZmgtPm92ZXJsYXlfbWFzaywgYml0bWFwLAotCQkJCSAgICh3aWR0aCAqIGhlaWdodCArIDcpIC8gOCkpIHsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlIGlmIChjbGlwY291bnQgPiAwKSB7Ci0JCS8qIHdyaXRlIG91ciBvd24gYml0bWFwIGZyb20gdGhlIGNsaXBzICovCi0JCXZjcCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqIChjbGlwY291bnQgKyA0KSk7Ci0JCWlmICh2Y3AgPT0gTlVMTCkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBzZXR1cF93aW5kb3coKSAtIEFsbG9jIG9mIGNsaXAgbWFzayBmYWlsZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCSAgICAodmNwLCBjbGlwcywgc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSAqIGNsaXBjb3VudCkpIHsKLQkJCXZmcmVlKHZjcCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl3cml0ZV9vdmVybGF5X21hc2soZmlsZSwgdmNwLCBjbGlwY291bnQpOwotCQl2ZnJlZSh2Y3ApOwotCX0KLQotCWZoLT5vdmVybGF5X3NldHRpbmdzLmlzX3NldCA9IDE7Ci0JaWYgKGZoLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCi0JICAgIHpyLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFKQotCQl6ci0+b3ZlcmxheV9zZXR0aW5ncyA9IGZoLT5vdmVybGF5X3NldHRpbmdzOwotCi0JaWYgKG9uKQotCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOwotCi0JLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KLQlyZXR1cm4gd2FpdF9ncmFiX3BlbmRpbmcoenIpOwotfQotCi1zdGF0aWMgaW50Ci1zZXR1cF9vdmVybGF5IChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkgICAgICAgaW50ICAgICAgICAgIG9uKQotewotCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKLQotCS8qIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8sIHJldHVybiBpbW1lZGlhdGx5ICovCi0JaWYgKChvbiAmJiBmaC0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSkgfHwKLQkgICAgKCFvbiAmJiBmaC0+b3ZlcmxheV9hY3RpdmUgPT0gWk9SQU5fRlJFRSkpCi0JCXJldHVybiAwOwotCi0JLyogY2hlY2sgd2hldGhlciB3ZSdyZSB0b3VjaGluZyBzb21lb25lIGVsc2UncyBvdmVybGF5ICovCi0JaWYgKG9uICYmIHpyLT5vdmVybGF5X2FjdGl2ZSAhPSBaT1JBTl9GUkVFICYmCi0JICAgIGZoLT5vdmVybGF5X2FjdGl2ZSA9PSBaT1JBTl9GUkVFKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHNldHVwX292ZXJsYXkoKSAtIG92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUgZm9yIGFub3RoZXIgc2Vzc2lvblxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JaWYgKCFvbiAmJiB6ci0+b3ZlcmxheV9hY3RpdmUgIT0gWk9SQU5fRlJFRSAmJgotCSAgICBmaC0+b3ZlcmxheV9hY3RpdmUgPT0gWk9SQU5fRlJFRSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBzZXR1cF9vdmVybGF5KCkgLSB5b3UgY2Fubm90IGNhbmNlbCBzb21lb25lIGVsc2UncyBzZXNzaW9uXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCWlmIChvbiA9PSAwKSB7Ci0JCXpyLT5vdmVybGF5X2FjdGl2ZSA9IGZoLT5vdmVybGF5X2FjdGl2ZSA9IFpPUkFOX0ZSRUU7Ci0JCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAwOwotCQkvKiBXaGVuIGEgZ3JhYiBpcyBydW5uaW5nLCB0aGUgdmlkZW8gc2ltcGx5Ci0JCSAqIHdvbid0IGJlIHN3aXRjaGVkIG9uIGFueSBtb3JlICovCi0JCWlmICghenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkKLQkJCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7Ci0JCXpyLT5vdmVybGF5X21hc2sgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWlmICghenItPmJ1ZmZlci5iYXNlIHx8ICFmaC0+b3ZlcmxheV9zZXR0aW5ncy5pc19zZXQpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogc2V0dXBfb3ZlcmxheSgpIC0gYnVmZmVyIG9yIHdpbmRvdyBub3Qgc2V0XG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICghZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IHNldHVwX292ZXJsYXkoKSAtIG5vIG92ZXJsYXkgZm9ybWF0IHNldFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl6ci0+b3ZlcmxheV9hY3RpdmUgPSBmaC0+b3ZlcmxheV9hY3RpdmUgPSBaT1JBTl9MT0NLRUQ7Ci0JCXpyLT52NGxfb3ZlcmxheV9hY3RpdmUgPSAxOwotCQl6ci0+b3ZlcmxheV9tYXNrID0gZmgtPm92ZXJsYXlfbWFzazsKLQkJenItPm92ZXJsYXlfc2V0dGluZ3MgPSBmaC0+b3ZlcmxheV9zZXR0aW5nczsKLQkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlKQotCQkJenIzNjA1N19vdmVybGF5KHpyLCAxKTsKLQkJLyogV2hlbiBhIGdyYWIgaXMgcnVubmluZywgdGhlIHZpZGVvIHdpbGwgYmUKLQkJICogc3dpdGNoZWQgb24gd2hlbiBncmFiIGlzIGZpbmlzaGVkICovCi0JfQotCi0JLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KLQlyZXR1cm4gd2FpdF9ncmFiX3BlbmRpbmcoenIpOwotfQotCi0JLyogZ2V0IHRoZSBzdGF0dXMgb2YgYSBidWZmZXIgaW4gdGhlIGNsaWVudHMgYnVmZmVyIHF1ZXVlICovCi1zdGF0aWMgaW50Ci16b3Jhbl92NGwyX2J1ZmZlcl9zdGF0dXMgKHN0cnVjdCBmaWxlICAgICAgICAqZmlsZSwKLQkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYsCi0JCQkgIGludCAgICAgICAgICAgICAgICAgbnVtKQotewotCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKLQotCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKLQotCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7Ci0JY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6Ci0KLQkJLyogY2hlY2sgcmFuZ2UgKi8KLQkJaWYgKG51bSA8IDAgfHwgbnVtID49IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyB8fAotCQkgICAgIWZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogdjRsMl9idWZmZXJfc3RhdHVzKCkgLSB3cm9uZyBudW1iZXIgb3IgYnVmZmVycyBub3QgYWxsb2NhdGVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlidWYtPmxlbmd0aCA9IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKLQotCQkvKiBnZXQgYnVmZmVyICovCi0JCWJ1Zi0+Ynl0ZXN1c2VkID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLmxlbmd0aDsKLQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSA9PSBCVVpfU1RBVEVfRE9ORSB8fAotCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID09IEJVWl9TVEFURV9VU0VSKSB7Ci0JCQlidWYtPnNlcXVlbmNlID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltudW1dLmJzLnNlcTsKLQkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOwotCQkJYnVmLT50aW1lc3RhbXAgPQotCQkJICAgIGZoLT52NGxfYnVmZmVycy5idWZmZXJbbnVtXS5icy50aW1lc3RhbXA7Ci0JCX0gZWxzZSB7Ci0JCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCQl9Ci0KLQkJaWYgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0IDw9IEJVWl9NQVhfSEVJR0hUIC8gMikKLQkJCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKLQkJZWxzZQotCQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQotCQlicmVhazsKLQotCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKLQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgotCi0JCS8qIGNoZWNrIHJhbmdlICovCi0JCWlmIChudW0gPCAwIHx8IG51bSA+PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwKLQkJICAgICFmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IHY0bDJfYnVmZmVyX3N0YXR1cygpIC0gd3JvbmcgbnVtYmVyIG9yIGJ1ZmZlcnMgbm90IGFsbG9jYXRlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWJ1Zi0+dHlwZSA9IChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1JFQykgPwotCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIDoKLQkJCSAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOwotCQlidWYtPmxlbmd0aCA9IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKLQotCQkvKiB0aGVzZSB2YXJpYWJsZXMgYXJlIG9ubHkgd3JpdHRlbiBhZnRlciBmcmFtZSBoYXMgYmVlbiBjYXB0dXJlZCAqLwotCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLnN0YXRlID09IEJVWl9TVEFURV9ET05FIHx8Ci0JCSAgICBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgPT0gQlVaX1NUQVRFX1VTRVIpIHsKLQkJCWJ1Zi0+c2VxdWVuY2UgPSBmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW251bV0uYnMuc2VxOwotCQkJYnVmLT50aW1lc3RhbXAgPQotCQkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5icy50aW1lc3RhbXA7Ci0JCQlidWYtPmJ5dGVzdXNlZCA9Ci0JCQkgICAgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltudW1dLmJzLmxlbmd0aDsKLQkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOwotCQl9IGVsc2UgewotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQkJfQotCi0JCS8qIHdoaWNoIGZpZWxkcyBhcmUgdGhlc2U/ICovCi0JCWlmIChmaC0+anBnX3NldHRpbmdzLlRtcERjbSAhPSAxKQotCQkJYnVmLT5maWVsZCA9Ci0JCQkgICAgZmgtPmpwZ19zZXR0aW5ncy4KLQkJCSAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfVE9QIDogVjRMMl9GSUVMRF9CT1RUT007Ci0JCWVsc2UKLQkJCWJ1Zi0+ZmllbGQgPQotCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuCi0JCQkgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1NFUV9UQiA6Ci0JCQkgICAgVjRMMl9GSUVMRF9TRVFfQlQ7Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCWRwcmludGsoNSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHY0bDJfYnVmZmVyX3N0YXR1cygpIC0gaW52YWxpZCBidWZmZXIgdHlwZXxtYXBfbW9kZSAoJWR8JWQpXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgZmgtPm1hcF9tb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCWJ1Zi0+aW5kZXggPSBudW07Ci0JYnVmLT5tLm9mZnNldCA9IGJ1Zi0+bGVuZ3RoICogbnVtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXpvcmFuX3NldF9ub3JtIChzdHJ1Y3Qgem9yYW4gKnpyLAotCQlpbnQgICAgICAgICAgIG5vcm0pIC8qIFZJREVPX01PREVfKiAqLwotewotCWludCBub3JtX2VuY29kZXIsIG9uOwotCi0JaWYgKHpyLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSB8fAotCSAgICB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9XQVJOSU5HCi0JCQkiJXM6IHNldF9ub3JtKCkgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAobG9ja19ub3JtICYmIG5vcm0gIT0genItPm5vcm0pIHsKLQkJaWYgKGxvY2tfbm9ybSA+IDEpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX1dBUk5JTkcKLQkJCQkiJXM6IHNldF9ub3JtKCkgLSBUViBzdGFuZGFyZCBpcyBsb2NrZWQsIGNhbiBub3Qgc3dpdGNoIG5vcm1cbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmV0dXJuIC1FUEVSTTsKLQkJfSBlbHNlIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX1dBUk5JTkcKLQkJCQkiJXM6IHNldF9ub3JtKCkgLSBUViBzdGFuZGFyZCBpcyBsb2NrZWQsIG5vcm0gd2FzIG5vdCBjaGFuZ2VkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCW5vcm0gPSB6ci0+bm9ybTsKLQkJfQotCX0KLQotCWlmIChub3JtICE9IFZJREVPX01PREVfQVVUTyAmJgotCSAgICAobm9ybSA8IDAgfHwgbm9ybSA+PSB6ci0+Y2FyZC5ub3JtcyB8fAotCSAgICAgIXpyLT5jYXJkLnR2bltub3JtXSkpIHsKLQkJZHByaW50aygxLAotCQkJS0VSTl9FUlIgIiVzOiBzZXRfbm9ybSgpIC0gdW5zdXBwb3J0ZWQgbm9ybSAlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBub3JtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG5vcm0gPT0gVklERU9fTU9ERV9BVVRPKSB7Ci0JCWludCBzdGF0dXM7Ci0KLQkJLyogaWYgd2UgaGF2ZSBhdXRvZGV0ZWN0LCAuLi4gKi8KLQkJc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSBjYXBzOwotCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUywgJmNhcHMpOwotCQlpZiAoIShjYXBzLmZsYWdzICYgVklERU9fREVDT0RFUl9BVVRPKSkgewotCQkJZHByaW50aygxLCBLRVJOX0VSUiAiJXM6IG5vcm09YXV0byB1bnN1cHBvcnRlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOwotCi0JCS8qIGxldCBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KLQkJc3NsZWVwKDIpOwotCi0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfU1RBVFVTLCAmc3RhdHVzKTsKLQkJaWYgKCEoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfR09PRCkpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogc2V0X25vcm0oKSAtIG5vIG5vcm0gZGV0ZWN0ZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJLyogcmVzZXQgbm9ybSAqLwotCQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfTlRTQykKLQkJCW5vcm0gPSBWSURFT19NT0RFX05UU0M7Ci0JCWVsc2UgaWYgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX1NFQ0FNKQotCQkJbm9ybSA9IFZJREVPX01PREVfU0VDQU07Ci0JCWVsc2UKLQkJCW5vcm0gPSBWSURFT19NT0RFX1BBTDsKLQl9Ci0JenItPnRpbWluZyA9IHpyLT5jYXJkLnR2bltub3JtXTsKLQlub3JtX2VuY29kZXIgPSBub3JtOwotCi0JLyogV2Ugc3dpdGNoIG92ZXJsYXkgb2ZmIGFuZCBvbiBzaW5jZSBhIGNoYW5nZSBpbiB0aGUKLQkgKiBub3JtIG5lZWRzIGRpZmZlcmVudCBWRkUgc2V0dGluZ3MgKi8KLQlvbiA9IHpyLT5vdmVybGF5X2FjdGl2ZSAmJiAhenItPnY0bF9tZW1ncmFiX2FjdGl2ZTsKLQlpZiAob24pCi0JCXpyMzYwNTdfb3ZlcmxheSh6ciwgMCk7Ci0KLQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX05PUk0sICZub3JtKTsKLQllbmNvZGVyX2NvbW1hbmQoenIsIEVOQ09ERVJfU0VUX05PUk0sICZub3JtX2VuY29kZXIpOwotCi0JaWYgKG9uKQotCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOwotCi0JLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KLQl6ci0+bm9ybSA9IG5vcm07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotem9yYW5fc2V0X2lucHV0IChzdHJ1Y3Qgem9yYW4gKnpyLAotCQkgaW50ICAgICAgICAgICBpbnB1dCkKLXsKLQlpbnQgcmVhbGlucHV0OwotCi0JaWYgKGlucHV0ID09IHpyLT5pbnB1dCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFIHx8Ci0JICAgIHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX1dBUk5JTkcKLQkJCSIlczogc2V0X2lucHV0KCkgY2FsbGVkIHdoaWxlIGluIHBsYXliYWNrL2NhcHR1cmUgbW9kZVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IHpyLT5jYXJkLmlucHV0cykgewotCQlkcHJpbnRrKDEsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBzZXRfaW5wdXQoKSAtIHVubnN1cHBvcnRlZCBpbnB1dCAlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBpbnB1dCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJlYWxpbnB1dCA9IHpyLT5jYXJkLmlucHV0W2lucHV0XS5tdXhzZWw7Ci0JenItPmlucHV0ID0gaW5wdXQ7Ci0KLQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX0lOUFVULCAmcmVhbGlucHV0KTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogICBpb2N0bCByb3V0aW5lCi0gKi8KLQotc3RhdGljIGludAotem9yYW5fZG9faW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCXN0cnVjdCBmaWxlICAqZmlsZSwKLQkJdW5zaWduZWQgaW50ICBjbWQsCi0JCXZvaWQgICAgICAgICAqYXJnKQotewotCXN0cnVjdCB6b3Jhbl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHpvcmFuICp6ciA9IGZoLT56cjsKLQkvKiBDQVJFRlVMOiB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBoZXJlICovCi0Jc3RydWN0IHpvcmFuX2pwZ19zZXR0aW5ncyBzZXR0aW5nczsKLQotCS8qIHdlIG1pZ2h0IGhhdmUgb2xkZXIgYnVmZmVycyBseWluZyBhcm91bmQuLi4gV2UgZG9uJ3Qgd2FudAotCSAqIHRvIHdhaXQsIGJ1dCB3ZSBkbyB3YW50IHRvIHRyeSBjbGVhbmluZyB0aGVtIHVwIEFTQVAuIFNvCi0JICogd2UgdHJ5IHRvIG9idGFpbiB0aGUgbG9jayBhbmQgZnJlZSB0aGVtLiBJZiB0aGF0IGZhaWxzLCB3ZQotCSAqIGRvbid0IGRvIGFueXRoaW5nIGFuZCB3YWl0IGZvciB0aGUgbmV4dCB0dXJuLiBJbiB0aGUgZW5kLAotCSAqIHpvcmFuX2Nsb3NlKCkgb3IgYSBuZXcgYWxsb2NhdGlvbiB3aWxsIHN0aWxsIGZyZWUgdGhlbS4uLgotCSAqIFRoaXMgaXMganVzdCBhICd0aGUgc29vbmVyIHRoZSBiZXR0ZXInIGV4dHJhICdmZWF0dXJlJwotCSAqCi0JICogV2UgZG9uJ3QgZnJlZSB0aGUgYnVmZmVycyByaWdodCBvbiBtdW5tYXAoKSBiZWNhdXNlIHRoYXQKLQkgKiBjYXVzZXMgb29wc2VzIChrZnJlZSgpIGluc2lkZSBtdW5tYXAoKSBvb3BzZXMgZm9yIG5vCi0JICogYXBwYXJlbnQgcmVhc29uIC0gaXQncyBhbHNvIG5vdCByZXByb2R1Y2VhYmxlIGluIGFueSB3YXksCi0JICogYnV0IG1vdmluZyB0aGUgZnJlZSBjb2RlIG91dHNpZGUgdGhlIG11bm1hcCgpIGhhbmRsZXIgZml4ZXMKLQkgKiBhbGwgdGhpcy4uLiBJZiBzb21lb25lIGtub3dzIHdoeSwgcGxlYXNlIGV4cGxhaW4gbWUgKFJvbmFsZCkKLQkgKi8KLQlpZiAobXV0ZXhfdHJ5bG9jaygmenItPnJlc291cmNlX2xvY2spKSB7Ci0JCS8qIHdlIG9idGFpbmVkIGl0ISBMZXQncyB0cnkgdG8gZnJlZSBzb21lIHRoaW5ncyAqLwotCQlpZiAoZmgtPmpwZ19idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkKQotCQkJanBnX2ZidWZmZXJfZnJlZShmaWxlKTsKLQkJaWYgKGZoLT52NGxfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCkKLQkJCXY0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgVklESU9DR0NBUDoKLQl7Ci0JCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICp2Y2FwID0gYXJnOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ0dDQVBcbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCQltZW1zZXQodmNhcCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5KSk7Ci0JCXN0cm5jcHkodmNhcC0+bmFtZSwgWlJfREVWTkFNRSh6ciksIHNpemVvZih2Y2FwLT5uYW1lKS0xKTsKLQkJdmNhcC0+dHlwZSA9IFpPUkFOX1ZJRF9UWVBFOwotCi0JCXZjYXAtPmNoYW5uZWxzID0genItPmNhcmQuaW5wdXRzOwotCQl2Y2FwLT5hdWRpb3MgPSAwOwotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCXZjYXAtPm1heHdpZHRoID0gQlVaX01BWF9XSURUSDsKLQkJdmNhcC0+bWF4aGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7Ci0JCXZjYXAtPm1pbndpZHRoID0gQlVaX01JTl9XSURUSDsKLQkJdmNhcC0+bWluaGVpZ2h0ID0gQlVaX01JTl9IRUlHSFQ7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ0dDSEFOOgotCXsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjaGFuID0gYXJnOwotCQlpbnQgY2hhbm5lbCA9IHZjaGFuLT5jaGFubmVsOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ0dDSEFOIC0gY2hhbm5lbD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB2Y2hhbi0+Y2hhbm5lbCk7Ci0KLQkJbWVtc2V0KHZjaGFuLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NoYW5uZWwpKTsKLQkJaWYgKGNoYW5uZWwgPiB6ci0+Y2FyZC5pbnB1dHMgfHwgY2hhbm5lbCA8IDApIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DR0NIQU4gb24gbm90IGV4aXN0aW5nIGNoYW5uZWwgJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGNoYW5uZWwpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlzdHJjcHkodmNoYW4tPm5hbWUsIHpyLT5jYXJkLmlucHV0W2NoYW5uZWxdLm5hbWUpOwotCi0JCXZjaGFuLT50dW5lcnMgPSAwOwotCQl2Y2hhbi0+ZmxhZ3MgPSAwOwotCQl2Y2hhbi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCXZjaGFuLT5ub3JtID0genItPm5vcm07Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQl2Y2hhbi0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCQkvKiBSSjogdGhlIGRvY3VtZW50YXRpb24gYXQgaHR0cDovL3JvYWRydW5uZXIuc3dhbnNlYS5saW51eC5vcmcudWsvdjRsYXBpLnNodG1sIHNheXM6Ci0JCSAqCi0JCSAqICogIlRoZSBWSURJT0NTQ0hBTiBpb2N0bCB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBzd2l0Y2hlcyB0aGUgY2FwdHVyZSB0byB0aGlzIGlucHV0LiIKLQkJICogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl4KLQkJICogKiBUaGUgZmFtb3MgQlRUViBkcml2ZXIgaGFzIGl0IGltcGxlbWVudGVkIHdpdGggYSBzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBhcmd1bWVudAotCQkgKiAqIGFuZCB3ZSBmb2xsb3cgaXQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucwotCQkgKiAqCi0JCSAqICogQlRXOiB0aGlzIGlzIHRoZSBvbmx5IHdheSB0aGUgdXNlciBjYW4gc2V0IHRoZSBub3JtIQotCQkgKi8KLQotCWNhc2UgVklESU9DU0NIQU46Ci0JewotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdmNoYW4gPSBhcmc7Ci0JCWludCByZXM7Ci0KLQkJZHByaW50aygzLAotCQkJS0VSTl9ERUJVRwotCQkJIiVzOiBWSURJT0NTQ0hBTiAtIGNoYW5uZWw9JWQsIG5vcm09JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgdmNoYW4tPmNoYW5uZWwsIHZjaGFuLT5ub3JtKTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCWlmICgocmVzID0gem9yYW5fc2V0X2lucHV0KHpyLCB2Y2hhbi0+Y2hhbm5lbCkpKQotCQkJZ290byBzY2hhbl91bmxvY2tfYW5kX3JldHVybjsKLQkJaWYgKChyZXMgPSB6b3Jhbl9zZXRfbm9ybSh6ciwgdmNoYW4tPm5vcm0pKSkKLQkJCWdvdG8gc2NoYW5fdW5sb2NrX2FuZF9yZXR1cm47Ci0KLQkJLyogTWFrZSBzdXJlIHRoZSBjaGFuZ2VzIGNvbWUgaW50byBlZmZlY3QgKi8KLQkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOwotCXNjaGFuX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NHUElDVDoKLQl7Ci0JCXN0cnVjdCB2aWRlb19waWN0dXJlICp2cGljdCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHUElDVFxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCW1lbXNldCh2cGljdCwgMCwgc2l6ZW9mKHN0cnVjdCB2aWRlb19waWN0dXJlKSk7Ci0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJdnBpY3QtPmh1ZSA9IHpyLT5odWU7Ci0JCXZwaWN0LT5icmlnaHRuZXNzID0genItPmJyaWdodG5lc3M7Ci0JCXZwaWN0LT5jb250cmFzdCA9IHpyLT5jb250cmFzdDsKLQkJdnBpY3QtPmNvbG91ciA9IHpyLT5zYXR1cmF0aW9uOwotCQlpZiAoZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0KSB7Ci0JCQl2cGljdC0+ZGVwdGggPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPmRlcHRoOwotCQkJdnBpY3QtPnBhbGV0dGUgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5mb3JtYXQtPnBhbGV0dGU7Ci0JCX0gZWxzZSB7Ci0JCQl2cGljdC0+ZGVwdGggPSAwOwotCQl9Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ1NQSUNUOgotCXsKLQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnZwaWN0ID0gYXJnOwotCQlpbnQgaTsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IFZJRElPQ1NQSUNUIC0gYnJpPSVkLCBodWU9JWQsIGNvbD0lZCwgY29uPSVkLCBkZXA9JWQsIHBhbD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB2cGljdC0+YnJpZ2h0bmVzcywgdnBpY3QtPmh1ZSwKLQkJCXZwaWN0LT5jb2xvdXIsIHZwaWN0LT5jb250cmFzdCwgdnBpY3QtPmRlcHRoLAotCQkJdnBpY3QtPnBhbGV0dGUpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7Ci0JCQljb25zdCBzdHJ1Y3Qgem9yYW5fZm9ybWF0ICpmbXQgPSAmem9yYW5fZm9ybWF0c1tpXTsKLQotCQkJaWYgKGZtdC0+cGFsZXR0ZSAhPSAtMSAmJgotCQkJICAgIGZtdC0+ZmxhZ3MgJiBaT1JBTl9GT1JNQVRfT1ZFUkxBWSAmJgotCQkJICAgIGZtdC0+cGFsZXR0ZSA9PSB2cGljdC0+cGFsZXR0ZSAmJgotCQkJICAgIGZtdC0+ZGVwdGggPT0gdnBpY3QtPmRlcHRoKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpID09IE5VTV9GT1JNQVRTKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ1NQSUNUIC0gSW52YWxpZCBwYWxldHRlICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCB2cGljdC0+cGFsZXR0ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlkZWNvZGVyX2NvbW1hbmQoenIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsIHZwaWN0KTsKLQotCQl6ci0+aHVlID0gdnBpY3QtPmh1ZTsKLQkJenItPmNvbnRyYXN0ID0gdnBpY3QtPmNvbnRyYXN0OwotCQl6ci0+c2F0dXJhdGlvbiA9IHZwaWN0LT5jb2xvdXI7Ci0JCXpyLT5icmlnaHRuZXNzID0gdnBpY3QtPmJyaWdodG5lc3M7Ci0KLQkJZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0ID0gJnpvcmFuX2Zvcm1hdHNbaV07Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DQ0FQVFVSRToKLQl7Ci0JCWludCAqb24gPSBhcmcsIHJlczsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NDQVBUVVJFIC0gb249JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgKm9uKTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCXJlcyA9IHNldHVwX292ZXJsYXkoZmlsZSwgKm9uKTsKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NHV0lOOgotCXsKLQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdndpbiA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHV0lOXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbWVtc2V0KHZ3aW4sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSk7Ci0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJdndpbi0+eCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLng7Ci0JCXZ3aW4tPnkgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy55OwotCQl2d2luLT53aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoOwotCQl2d2luLT5oZWlnaHQgPSBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQ7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQl2d2luLT5jbGlwY291bnQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NTV0lOOgotCXsKLQkJc3RydWN0IHZpZGVvX3dpbmRvdyAqdndpbiA9IGFyZzsKLQkJaW50IHJlczsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IFZJRElPQ1NXSU4gLSB4PSVkLCB5PSVkLCB3PSVkLCBoPSVkLCBjbGlwY291bnQ9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgdndpbi0+eCwgdndpbi0+eSwgdndpbi0+d2lkdGgsCi0JCQl2d2luLT5oZWlnaHQsIHZ3aW4tPmNsaXBjb3VudCk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPQotCQkgICAgc2V0dXBfd2luZG93KGZpbGUsIHZ3aW4tPngsIHZ3aW4tPnksIHZ3aW4tPndpZHRoLAotCQkJCSB2d2luLT5oZWlnaHQsIHZ3aW4tPmNsaXBzLAotCQkJCSB2d2luLT5jbGlwY291bnQsIE5VTEwpOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ0dGQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX2J1ZmZlciAqdmJ1ZiA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHRkJVRlxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJKnZidWYgPSB6ci0+YnVmZmVyOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DU0ZCVUY6Ci0JewotCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyICp2YnVmID0gYXJnOwotCQlpbnQgaSwgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IFZJRElPQ1NGQlVGIC0gYmFzZT0lcCwgdz0lZCwgaD0lZCwgZGVwdGg9JWQsIGJwbD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCB2YnVmLT5iYXNlLCB2YnVmLT53aWR0aCwKLQkJCXZidWYtPmhlaWdodCwgdmJ1Zi0+ZGVwdGgsIHZidWYtPmJ5dGVzcGVybGluZSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCi0JCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSB2YnVmLT5kZXB0aCkKLQkJCQlicmVhazsKLQkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DU0ZCVUYgLSBpbnZhbGlkIGZidWYgZGVwdGggJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIHZidWYtPmRlcHRoKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPQotCQkgICAgc2V0dXBfZmJ1ZmZlcihmaWxlLCB2YnVmLT5iYXNlLCAmem9yYW5fZm9ybWF0c1tpXSwKLQkJCQkgIHZidWYtPndpZHRoLCB2YnVmLT5oZWlnaHQsCi0JCQkJICB2YnVmLT5ieXRlc3BlcmxpbmUpOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ1NZTkM6Ci0JewotCQlpbnQgKmZyYW1lID0gYXJnLCByZXM7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DU1lOQyAtIGZyYW1lPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksICpmcmFtZSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPSB2NGxfc3luYyhmaWxlLCAqZnJhbWUpOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJaWYgKCFyZXMpCi0JCQl6ci0+djRsX3N5bmNfdGFpbCsrOwotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ01DQVBUVVJFOgotCXsKLQkJc3RydWN0IHZpZGVvX21tYXAgKnZtYXAgPSBhcmc7Ci0JCWludCByZXM7Ci0KLQkJZHByaW50aygzLAotCQkJS0VSTl9ERUJVRwotCQkJIiVzOiBWSURJT0NNQ0FQVFVSRSAtIGZyYW1lPSVkLCBnZW9tPSVkeCVkLCBmbXQ9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgdm1hcC0+ZnJhbWUsIHZtYXAtPndpZHRoLCB2bWFwLT5oZWlnaHQsCi0JCQl2bWFwLT5mb3JtYXQpOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJcmVzID0gdjRsX2dyYWIoZmlsZSwgdm1hcCk7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ0dNQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX21idWYgKnZtYnVmID0gYXJnOwotCQlpbnQgaSwgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHTUJVRlxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCXZtYnVmLT5zaXplID0KLQkJICAgIGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycyAqCi0JCSAgICBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7Ci0JCXZtYnVmLT5mcmFtZXMgPSBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7Ci0JCWZvciAoaSA9IDA7IGkgPCB2bWJ1Zi0+ZnJhbWVzOyBpKyspIHsKLQkJCXZtYnVmLT5vZmZzZXRzW2ldID0KLQkJCSAgICBpICogZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWlmIChmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkIHx8IGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DR01CVUYgLSBidWZmZXJzIGFscmVhZHkgYWxsb2NhdGVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQlpZiAodjRsX2ZidWZmZXJfYWxsb2MoZmlsZSkpIHsKLQkJCXJlcyA9IC1FTk9NRU07Ci0JCQlnb3RvIHY0bDFyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBWNEwgYnVmZmVycyAqLwotCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7Ci0JdjRsMXJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NHVU5JVDoKLQl7Ci0JCXN0cnVjdCB2aWRlb191bml0ICp2dW5pdCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NHVU5JVFxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCXZ1bml0LT52aWRlbyA9IHpyLT52aWRlb19kZXYtPm1pbm9yOwotCQl2dW5pdC0+dmJpID0gVklERU9fTk9fVU5JVDsKLQkJdnVuaXQtPnJhZGlvID0gVklERU9fTk9fVU5JVDsKLQkJdnVuaXQtPmF1ZGlvID0gVklERU9fTk9fVU5JVDsKLQkJdnVuaXQtPnRlbGV0ZXh0ID0gVklERU9fTk9fVU5JVDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JCS8qCi0JCSAqIFJKOiBJbiBwcmluY2lwYWwgd2UgY291bGQgc3VwcG9ydCBzdWJjYXB0dXJlcyBmb3IgVjRMIGdyYWJiaW5nLgotCQkgKiAgICAgTm90IGV2ZW4gdGhlIGZhbW91cyBCVFRWIGRyaXZlciBoYXMgdGhlbSwgaG93ZXZlci4KLQkJICogICAgIElmIHRoZXJlIHNob3VsZCBiZSBhIHN0cm9uZyBkZW1hbmQsIG9uZSBjb3VsZCBjb25zaWRlcgotCQkgKiAgICAgdG8gaW1wbGVtZW50IHRoZW0uCi0JCSAqLwotCWNhc2UgVklESU9DR0NBUFRVUkU6Ci0JewotCQlkcHJpbnRrKDMsIEtFUk5fRVJSICIlczogVklESU9DR0NBUFRVUkUgbm90IHN1cHBvcnRlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DU0NBUFRVUkU6Ci0JewotCQlkcHJpbnRrKDMsIEtFUk5fRVJSICIlczogVklESU9DU0NBUFRVUkUgbm90IHN1cHBvcnRlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQlVaSU9DX0dfUEFSQU1TOgotCXsKLQkJc3RydWN0IHpvcmFuX3BhcmFtcyAqYnBhcmFtcyA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBCVVpJT0NfR19QQVJBTVNcbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCQltZW1zZXQoYnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCB6b3Jhbl9wYXJhbXMpKTsKLQkJYnBhcmFtcy0+bWFqb3JfdmVyc2lvbiA9IE1BSk9SX1ZFUlNJT047Ci0JCWJwYXJhbXMtPm1pbm9yX3ZlcnNpb24gPSBNSU5PUl9WRVJTSU9OOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlicGFyYW1zLT5ub3JtID0genItPm5vcm07Ci0JCWJwYXJhbXMtPmlucHV0ID0genItPmlucHV0OwotCi0JCWJwYXJhbXMtPmRlY2ltYXRpb24gPSBmaC0+anBnX3NldHRpbmdzLmRlY2ltYXRpb247Ci0JCWJwYXJhbXMtPkhvckRjbSA9IGZoLT5qcGdfc2V0dGluZ3MuSG9yRGNtOwotCQlicGFyYW1zLT5WZXJEY20gPSBmaC0+anBnX3NldHRpbmdzLlZlckRjbTsKLQkJYnBhcmFtcy0+VG1wRGNtID0gZmgtPmpwZ19zZXR0aW5ncy5UbXBEY207Ci0JCWJwYXJhbXMtPmZpZWxkX3Blcl9idWZmID0gZmgtPmpwZ19zZXR0aW5ncy5maWVsZF9wZXJfYnVmZjsKLQkJYnBhcmFtcy0+aW1nX3ggPSBmaC0+anBnX3NldHRpbmdzLmltZ194OwotCQlicGFyYW1zLT5pbWdfeSA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3k7Ci0JCWJwYXJhbXMtPmltZ193aWR0aCA9IGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoOwotCQlicGFyYW1zLT5pbWdfaGVpZ2h0ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0OwotCQlicGFyYW1zLT5vZGRfZXZlbiA9IGZoLT5qcGdfc2V0dGluZ3Mub2RkX2V2ZW47Ci0KLQkJYnBhcmFtcy0+cXVhbGl0eSA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eTsKLQkJYnBhcmFtcy0+QVBQbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQbjsKLQkJYnBhcmFtcy0+QVBQX2xlbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2xlbjsKLQkJbWVtY3B5KGJwYXJhbXMtPkFQUF9kYXRhLAotCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBfZGF0YSwKLQkJICAgICAgIHNpemVvZihicGFyYW1zLT5BUFBfZGF0YSkpOwotCQlicGFyYW1zLT5DT01fbGVuID0genItPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuOwotCQltZW1jcHkoYnBhcmFtcy0+Q09NX2RhdGEsCi0JCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLAotCQkgICAgICAgc2l6ZW9mKGJwYXJhbXMtPkNPTV9kYXRhKSk7Ci0JCWJwYXJhbXMtPmpwZWdfbWFya2VycyA9Ci0JCSAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLmpwZWdfbWFya2VyczsKLQotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlicGFyYW1zLT5WRklGT19GQiA9IDA7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQlVaSU9DX1NfUEFSQU1TOgotCXsKLQkJc3RydWN0IHpvcmFuX3BhcmFtcyAqYnBhcmFtcyA9IGFyZzsKLQkJaW50IHJlcyA9IDA7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX1NfUEFSQU1TXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IGJwYXJhbXMtPmRlY2ltYXRpb247Ci0JCXNldHRpbmdzLkhvckRjbSA9IGJwYXJhbXMtPkhvckRjbTsKLQkJc2V0dGluZ3MuVmVyRGNtID0gYnBhcmFtcy0+VmVyRGNtOwotCQlzZXR0aW5ncy5UbXBEY20gPSBicGFyYW1zLT5UbXBEY207Ci0JCXNldHRpbmdzLmZpZWxkX3Blcl9idWZmID0gYnBhcmFtcy0+ZmllbGRfcGVyX2J1ZmY7Ci0JCXNldHRpbmdzLmltZ194ID0gYnBhcmFtcy0+aW1nX3g7Ci0JCXNldHRpbmdzLmltZ195ID0gYnBhcmFtcy0+aW1nX3k7Ci0JCXNldHRpbmdzLmltZ193aWR0aCA9IGJwYXJhbXMtPmltZ193aWR0aDsKLQkJc2V0dGluZ3MuaW1nX2hlaWdodCA9IGJwYXJhbXMtPmltZ19oZWlnaHQ7Ci0JCXNldHRpbmdzLm9kZF9ldmVuID0gYnBhcmFtcy0+b2RkX2V2ZW47Ci0KLQkJc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eSA9IGJwYXJhbXMtPnF1YWxpdHk7Ci0JCXNldHRpbmdzLmpwZ19jb21wLkFQUG4gPSBicGFyYW1zLT5BUFBuOwotCQlzZXR0aW5ncy5qcGdfY29tcC5BUFBfbGVuID0gYnBhcmFtcy0+QVBQX2xlbjsKLQkJbWVtY3B5KHNldHRpbmdzLmpwZ19jb21wLkFQUF9kYXRhLCBicGFyYW1zLT5BUFBfZGF0YSwKLQkJICAgICAgIHNpemVvZihicGFyYW1zLT5BUFBfZGF0YSkpOwotCQlzZXR0aW5ncy5qcGdfY29tcC5DT01fbGVuID0gYnBhcmFtcy0+Q09NX2xlbjsKLQkJbWVtY3B5KHNldHRpbmdzLmpwZ19jb21wLkNPTV9kYXRhLCBicGFyYW1zLT5DT01fZGF0YSwKLQkJICAgICAgIHNpemVvZihicGFyYW1zLT5DT01fZGF0YSkpOwotCQlzZXR0aW5ncy5qcGdfY29tcC5qcGVnX21hcmtlcnMgPSBicGFyYW1zLT5qcGVnX21hcmtlcnM7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9JRExFKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IEJVWklPQ19TX1BBUkFNUyBjYWxsZWQsIGJ1dCBCdXogaW4gY2FwdHVyZS9wbGF5YmFjayBtb2RlXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHNwYXJhbXNfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQkvKiBDaGVjayB0aGUgcGFyYW1zIGZpcnN0IGJlZm9yZSBvdmVyd3JpdGluZyBvdXIKLQkJICogbnRlcm5hbCB2YWx1ZXMgKi8KLQkJaWYgKHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyh6ciwgJnNldHRpbmdzKSkgewotCQkJcmVzID0gLUVJTlZBTDsKLQkJCWdvdG8gc3BhcmFtc191bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCi0JCWZoLT5qcGdfc2V0dGluZ3MgPSBzZXR0aW5nczsKLQlzcGFyYW1zX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEJVWklPQ19SRVFCVUZTOgotCXsKLQkJc3RydWN0IHpvcmFuX3JlcXVlc3RidWZmZXJzICpicmVxID0gYXJnOwotCQlpbnQgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IEJVWklPQ19SRVFCVUZTIC0gY291bnQ9JWx1LCBzaXplPSVsdVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBicmVxLT5jb3VudCwgYnJlcS0+c2l6ZSk7Ci0KLQkJLyogRW5mb3JjZSByZWFzb25hYmxlIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMgKi8KLQkJaWYgKGJyZXEtPmNvdW50IDwgNCkKLQkJCWJyZXEtPmNvdW50ID0gNDsJLyogQ291bGQgYmUgY2hvb3NlbiBzbWFsbGVyICovCi0JCWlmIChicmVxLT5jb3VudCA+IGpwZ19uYnVmcykKLQkJCWJyZXEtPmNvdW50ID0ganBnX25idWZzOwotCQlicmVxLT5zaXplID0gUEFHRV9BTElHTihicmVxLT5zaXplKTsKLQkJaWYgKGJyZXEtPnNpemUgPCA4MTkyKQotCQkJYnJlcS0+c2l6ZSA9IDgxOTI7CS8qIEFyYml0cmFyeSAqLwotCQkvKiBicmVxLT5zaXplIGlzIGxpbWl0ZWQgYnkgMSBwYWdlIGZvciB0aGUgc3RhdF9jb20KLQkJICogdGFibGVzIHRvIGEgTWF4aW11bSBvZiAyIE1CICovCi0JCWlmIChicmVxLT5zaXplID4ganBnX2J1ZnNpemUpCi0JCQlicmVxLT5zaXplID0ganBnX2J1ZnNpemU7Ci0JCWlmIChmaC0+anBnX2J1ZmZlcnMubmVlZF9jb250aWd1b3VzICYmCi0JCSAgICBicmVxLT5zaXplID4gTUFYX0tNQUxMT0NfTUVNKQotCQkJYnJlcS0+c2l6ZSA9IE1BWF9LTUFMTE9DX01FTTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJaWYgKGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgfHwgZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBCVVpJT0NfUkVRQlVGUyAtIGJ1ZmZlcnMgYWxscmVhZHkgYWxsb2NhdGVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IC1FQlVTWTsKLQkJCWdvdG8ganBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0KLQkJZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzID0gYnJlcS0+Y291bnQ7Ci0JCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9IGJyZXEtPnNpemU7Ci0KLQkJaWYgKGpwZ19mYnVmZmVyX2FsbG9jKGZpbGUpKSB7Ci0JCQlyZXMgPSAtRU5PTUVNOwotCQkJZ290byBqcGdyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQkvKiBUaGUgbmV4dCBtbWFwIHdpbGwgbWFwIHRoZSBNSlBFRyBidWZmZXJzIC0gY291bGQKLQkJICogYWxzbyBiZSAqX1BMQVksIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBoZXJlICovCi0JCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX0pQR19SRUM7Ci0JanBncmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEJVWklPQ19RQlVGX0NBUFQ6Ci0JewotCQlpbnQgKmZyYW1lID0gYXJnLCByZXM7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogQlVaSU9DX1FCVUZfQ0FQVCAtIGZyYW1lPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksICpmcmFtZSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPSBqcGdfcWJ1ZihmaWxlLCAqZnJhbWUsIEJVWl9NT0RFX01PVElPTl9DT01QUkVTUyk7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQlVaSU9DX1FCVUZfUExBWToKLQl7Ci0JCWludCAqZnJhbWUgPSBhcmcsIHJlczsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBCVVpJT0NfUUJVRl9QTEFZIC0gZnJhbWU9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgKmZyYW1lKTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCXJlcyA9IGpwZ19xYnVmKGZpbGUsICpmcmFtZSwgQlVaX01PREVfTU9USU9OX0RFQ09NUFJFU1MpOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEJVWklPQ19TWU5DOgotCXsKLQkJc3RydWN0IHpvcmFuX3N5bmMgKmJzeW5jID0gYXJnOwotCQlpbnQgcmVzOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19TWU5DXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPSBqcGdfc3luYyhmaWxlLCBic3luYyk7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQlVaSU9DX0dfU1RBVFVTOgotCXsKLQkJc3RydWN0IHpvcmFuX3N0YXR1cyAqYnN0YXQgPSBhcmc7Ci0JCWludCBub3JtLCBpbnB1dCwgc3RhdHVzLCByZXMgPSAwOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IEJVWklPQ19HX1NUQVRVU1xuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCWlmICh6ci0+Y29kZWNfbW9kZSAhPSBCVVpfTU9ERV9JRExFKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IEJVWklPQ19HX1NUQVRVUyBjYWxsZWQgYnV0IEJ1eiBpbiBjYXB0dXJlL3BsYXliYWNrIG1vZGVcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpbnB1dCA9IHpyLT5jYXJkLmlucHV0W2JzdGF0LT5pbnB1dF0ubXV4c2VsOwotCQlub3JtID0gVklERU9fTU9ERV9BVVRPOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlpZiAoenItPmNvZGVjX21vZGUgIT0gQlVaX01PREVfSURMRSkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBCVVpJT0NfR19TVEFUVVMgY2FsbGVkLCBidXQgQnV6IGluIGNhcHR1cmUvcGxheWJhY2sgbW9kZVxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBnc3RhdF91bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCi0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfSU5QVVQsICZpbnB1dCk7Ci0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfTk9STSwgJm5vcm0pOwotCi0JCS8qIHNsZWVwIDEgc2Vjb25kICovCi0JCXNzbGVlcCgxKTsKLQotCQkvKiBHZXQgc3RhdHVzIG9mIHZpZGVvIGRlY29kZXIgKi8KLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0dFVF9TVEFUVVMsICZzdGF0dXMpOwotCi0JCS8qIHJlc3RvcmUgcHJldmlvdXMgaW5wdXQgYW5kIG5vcm0gKi8KLQkJaW5wdXQgPSB6ci0+Y2FyZC5pbnB1dFt6ci0+aW5wdXRdLm11eHNlbDsKLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9JTlBVVCwgJmlucHV0KTsKLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX1NFVF9OT1JNLCAmenItPm5vcm0pOwotCWdzdGF0X3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlpZiAoIXJlcykgewotCQkJYnN0YXQtPnNpZ25hbCA9Ci0JCQkgICAgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX0dPT0QpID8gMSA6IDA7Ci0JCQlpZiAoc3RhdHVzICYgREVDT0RFUl9TVEFUVVNfTlRTQykKLQkJCQlic3RhdC0+bm9ybSA9IFZJREVPX01PREVfTlRTQzsKLQkJCWVsc2UgaWYgKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX1NFQ0FNKQotCQkJCWJzdGF0LT5ub3JtID0gVklERU9fTU9ERV9TRUNBTTsKLQkJCWVsc2UKLQkJCQlic3RhdC0+bm9ybSA9IFZJREVPX01PREVfUEFMOwotCi0JCQlic3RhdC0+Y29sb3IgPQotCQkJICAgIChzdGF0dXMgJiBERUNPREVSX1NUQVRVU19DT0xPUikgPyAxIDogMDsKLQkJfQotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCQkvKiBUaGUgbmV3IHZpZGVvNGxpbnV4MiBjYXB0dXJlIGludGVyZmFjZSAtIG11Y2ggbmljZXIgdGhhbiB2aWRlbzRsaW51eDEsIHNpbmNlCi0JCSAqIGl0IGFsbG93cyBmb3IgaW50ZWdyYXRpbmcgdGhlIEpQRUcgY2FwdHVyaW5nIGNhbGxzIGluc2lkZSBzdGFuZGFyZCB2NGwyCi0JCSAqLwotCi0JY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1FVRVJZQ0FQXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKLQkJc3RybmNweShjYXAtPmNhcmQsIFpSX0RFVk5BTUUoenIpLCBzaXplb2YoY2FwLT5jYXJkKS0xKTsKLQkJc3RybmNweShjYXAtPmRyaXZlciwgInpvcmFuIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKS0xKTsKLQkJc25wcmludGYoY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pLCAiUENJOiVzIiwKLQkJCSBwY2lfbmFtZSh6ci0+cGNpX2RldikpOwotCQljYXAtPnZlcnNpb24gPQotCQkgICAgS0VSTkVMX1ZFUlNJT04oTUFKT1JfVkVSU0lPTiwgTUlOT1JfVkVSU0lPTiwKLQkJCQkgICBSRUxFQVNFX1ZFUlNJT04pOwotCQljYXAtPmNhcGFiaWxpdGllcyA9IFpPUkFOX1Y0TDJfVklEX0ZMQUdTOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19FTlVNX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCA9IGFyZzsKLQkJaW50IGluZGV4ID0gZm10LT5pbmRleCwgbnVtID0gLTEsIGksIGZsYWcgPSAwLCB0eXBlID0KLQkJICAgIGZtdC0+dHlwZTsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTV9GTVQgLSBpbmRleD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPmluZGV4KTsKLQotCQlzd2l0Y2ggKGZtdC0+dHlwZSkgewotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJCWZsYWcgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgotCQkJZmxhZyA9IFpPUkFOX0ZPUk1BVF9QTEFZQkFDSzsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKLQkJCWZsYWcgPSBaT1JBTl9GT1JNQVRfT1ZFUkxBWTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfRU5VTV9GTVQgLSB1bmtub3duIHR5cGUgJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7Ci0JCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIGZsYWcpCi0JCQkJbnVtKys7Ci0JCQlpZiAobnVtID09IGZtdC0+aW5kZXgpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGZtdC0+aW5kZXggPCAwIC8qIGxhdGUsIGJ1dCBub3QgdG9vIGxhdGUgKi8gIHx8Ci0JCSAgICBpID09IE5VTV9GT1JNQVRTKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT5pbmRleCA9IGluZGV4OwotCQlmbXQtPnR5cGUgPSB0eXBlOwotCQlzdHJuY3B5KGZtdC0+ZGVzY3JpcHRpb24sIHpvcmFuX2Zvcm1hdHNbaV0ubmFtZSwgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pLTEpOwotCQlmbXQtPnBpeGVsZm9ybWF0ID0gem9yYW5fZm9ybWF0c1tpXS5mb3VyY2M7Ci0JCWlmICh6b3Jhbl9mb3JtYXRzW2ldLmZsYWdzICYgWk9SQU5fRk9STUFUX0NPTVBSRVNTRUQpCi0JCQlmbXQtPmZsYWdzIHw9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfR19GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQkJaW50IHR5cGUgPSBmbXQtPnR5cGU7Ci0KLQkJZHByaW50ayg1LCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfRk1UXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT50eXBlID0gdHlwZTsKLQotCQlzd2l0Y2ggKGZtdC0+dHlwZSkgewotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKLQotCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCQlmbXQtPmZtdC53aW4udy5sZWZ0ID0gZmgtPm92ZXJsYXlfc2V0dGluZ3MueDsKLQkJCWZtdC0+Zm10Lndpbi53LnRvcCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLnk7Ci0JCQlmbXQtPmZtdC53aW4udy53aWR0aCA9IGZoLT5vdmVybGF5X3NldHRpbmdzLndpZHRoOwotCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0KLQkJCSAgICBmaC0+b3ZlcmxheV9zZXR0aW5ncy5oZWlnaHQ7Ci0JCQlpZiAoZmgtPm92ZXJsYXlfc2V0dGluZ3Mud2lkdGggKiAyID4KLQkJCSAgICBCVVpfTUFYX0hFSUdIVCkKLQkJCQlmbXQtPmZtdC53aW4uZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCQllbHNlCi0JCQkJZm10LT5mbXQud2luLmZpZWxkID0gVjRMMl9GSUVMRF9UT1A7Ci0KLQkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCQlicmVhazsKLQotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKLQotCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCQlpZiAoZm10LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAmJgotCQkJICAgIGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcpIHsKLQotCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9Ci0JCQkJICAgIGZoLT52NGxfc2V0dGluZ3Mud2lkdGg7Ci0JCQkJZm10LT5mbXQucGl4LmhlaWdodCA9Ci0JCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0OwotCQkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPQotCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSAqCi0JCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0OwotCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9Ci0JCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5mb3VyY2M7Ci0JCQkJZm10LT5mbXQucGl4LmNvbG9yc3BhY2UgPQotCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmZvcm1hdC0+Y29sb3JzcGFjZTsKLQkJCQlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKLQkJCQlpZiAoQlVaX01BWF9IRUlHSFQgPAotCQkJCSAgICAoZmgtPnY0bF9zZXR0aW5ncy5oZWlnaHQgKiAyKSkKLQkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KLQkJCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQkJCQllbHNlCi0JCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9Ci0JCQkJCSAgICBWNEwyX0ZJRUxEX1RPUDsKLQotCQkJfSBlbHNlIHsKLQotCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9Ci0JCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoIC8KLQkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5Ib3JEY207Ci0JCQkJZm10LT5mbXQucGl4LmhlaWdodCA9Ci0JCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX2hlaWdodCAvCi0JCQkJICAgIChmaC0+anBnX3NldHRpbmdzLlZlckRjbSAqCi0JCQkJICAgICBmaC0+anBnX3NldHRpbmdzLlRtcERjbSk7Ci0JCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9Ci0JCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+Ci0JCQkJCQkJICAgIGpwZ19zZXR0aW5ncyk7Ci0JCQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0KLQkJCQkgICAgVjRMMl9QSVhfRk1UX01KUEVHOwotCQkJCWlmIChmaC0+anBnX3NldHRpbmdzLlRtcERjbSA9PSAxKQotCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQotCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCi0JCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1NFUV9CVCA6Ci0JCQkJCSAgICAgVjRMMl9GSUVMRF9TRVFfQlQpOwotCQkJCWVsc2UKLQkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KLQkJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLgotCQkJCQkgICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9UT1AgOgotCQkJCQkgICAgIFY0TDJfRklFTERfQk9UVE9NKTsKLQotCQkJCWZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAwOwotCQkJCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0KLQkJCQkgICAgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKLQkJCX0KLQotCQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ19HX0ZNVCAtIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQkJaW50IGksIHJlcyA9IDA7Ci0JCV9fbGUzMiBwcmludGZvcm1hdDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU19GTVQgLSB0eXBlPSVkLCAiLAotCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7Ci0KLQkJc3dpdGNoIChmbXQtPnR5cGUpIHsKLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6Ci0KLQkJCWRwcmludGsoMywgIng9JWQsIHk9JWQsIHc9JWQsIGg9JWQsIGNudD0lZCwgbWFwPTB4JXBcbiIsCi0JCQkJZm10LT5mbXQud2luLncubGVmdCwgZm10LT5mbXQud2luLncudG9wLAotCQkJCWZtdC0+Zm10Lndpbi53LndpZHRoLAotCQkJCWZtdC0+Zm10Lndpbi53LmhlaWdodCwKLQkJCQlmbXQtPmZtdC53aW4uY2xpcGNvdW50LAotCQkJCWZtdC0+Zm10Lndpbi5iaXRtYXApOwotCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkJcmVzID0KLQkJCSAgICBzZXR1cF93aW5kb3coZmlsZSwgZm10LT5mbXQud2luLncubGVmdCwKLQkJCQkJIGZtdC0+Zm10Lndpbi53LnRvcCwKLQkJCQkJIGZtdC0+Zm10Lndpbi53LndpZHRoLAotCQkJCQkgZm10LT5mbXQud2luLncuaGVpZ2h0LAotCQkJCQkgKHN0cnVjdCB2aWRlb19jbGlwIF9fdXNlciAqKQotCQkJCQkgICBmbXQtPmZtdC53aW4uY2xpcHMsCi0JCQkJCSBmbXQtPmZtdC53aW4uY2xpcGNvdW50LAotCQkJCQkgZm10LT5mbXQud2luLmJpdG1hcCk7Ci0JCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJCXJldHVybiByZXM7Ci0JCQlicmVhazsKLQotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKLQotCQkJcHJpbnRmb3JtYXQgPQotCQkJICAgIF9fY3B1X3RvX2xlMzIoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQkJCWRwcmludGsoMywgInNpemU9JWR4JWQsIGZtdD0weCV4ICglNC40cylcbiIsCi0JCQkJZm10LT5mbXQucGl4LndpZHRoLCBmbXQtPmZtdC5waXguaGVpZ2h0LAotCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCwKLQkJCQkoY2hhciAqKSAmcHJpbnRmb3JtYXQpOwotCi0JCQlpZiAoZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA+IDApIHsKLQkJCQlkcHJpbnRrKDUsCi0JCQkJCUtFUk5fRVJSICIlczogYnBsIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJLyogd2UgY2FuIGJlIHJlcXVlc3RlZCB0byBkbyBKUEVHL3JhdyBwbGF5YmFjay9jYXB0dXJlICovCi0JCQlpZiAoIQotCQkJICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8Ci0JCQkgICAgIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKLQkJCSAgICAgIGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PQotCQkJICAgICAgVjRMMl9QSVhfRk1UX01KUEVHKSkpIHsKLQkJCQlkcHJpbnRrKDEsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogVklESU9DX1NfRk1UIC0gdW5rbm93biB0eXBlICVkLzB4JXgoJTQuNHMpIGNvbWJpbmF0aW9uXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSwgZm10LT50eXBlLAotCQkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQsCi0JCQkJCShjaGFyICopICZwcmludGZvcm1hdCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHKSB7Ci0JCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCQkJc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOwotCi0JCQkJaWYgKGZoLT52NGxfYnVmZmVycy5hbGxvY2F0ZWQgfHwKLQkJCQkgICAgZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkgewotCQkJCQlkcHJpbnRrKDEsCi0JCQkJCQlLRVJOX0VSUgotCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSBjYW5ub3QgY2hhbmdlIGNhcHR1cmUgbW9kZVxuIiwKLQkJCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCQkJcmVzID0gLUVCVVNZOwotCQkJCQlnb3RvIHNmbXRqcGdfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQkJfQotCi0JCQkJLyogd2UgYWN0dWFsbHkgbmVlZCB0byBzZXQgJ3JlYWwnIHBhcmFtZXRlcnMgbm93ICovCi0JCQkJaWYgKChmbXQtPmZtdC5waXguaGVpZ2h0ICogMikgPgotCQkJCSAgICBCVVpfTUFYX0hFSUdIVCkKLQkJCQkJc2V0dGluZ3MuVG1wRGNtID0gMTsKLQkJCQllbHNlCi0JCQkJCXNldHRpbmdzLlRtcERjbSA9IDI7Ci0JCQkJc2V0dGluZ3MuZGVjaW1hdGlvbiA9IDA7Ci0JCQkJaWYgKGZtdC0+Zm10LnBpeC5oZWlnaHQgPD0KLQkJCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0IC8gMikKLQkJCQkJc2V0dGluZ3MuVmVyRGNtID0gMjsKLQkJCQllbHNlCi0JCQkJCXNldHRpbmdzLlZlckRjbSA9IDE7Ci0JCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA8PQotCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDQpCi0JCQkJCXNldHRpbmdzLkhvckRjbSA9IDQ7Ci0JCQkJZWxzZSBpZiAoZm10LT5mbXQucGl4LndpZHRoIDw9Ci0JCQkJCSBmaC0+anBnX3NldHRpbmdzLmltZ193aWR0aCAvIDIpCi0JCQkJCXNldHRpbmdzLkhvckRjbSA9IDI7Ci0JCQkJZWxzZQotCQkJCQlzZXR0aW5ncy5Ib3JEY20gPSAxOwotCQkJCWlmIChzZXR0aW5ncy5UbXBEY20gPT0gMSkKLQkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAyOwotCQkJCWVsc2UKLQkJCQkJc2V0dGluZ3MuZmllbGRfcGVyX2J1ZmYgPSAxOwotCi0JCQkJLyogY2hlY2sgKi8KLQkJCQlpZiAoKHJlcyA9Ci0JCQkJICAgICB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsCi0JCQkJCQkJICAgICAgJnNldHRpbmdzKSkpCi0JCQkJCWdvdG8gc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjsKLQotCQkJCS8qIGl0J3Mgb2ssIHNvIHNldCB0aGVtICovCi0JCQkJZmgtPmpwZ19zZXR0aW5ncyA9IHNldHRpbmdzOwotCi0JCQkJLyogdGVsbCB0aGUgdXNlciB3aGF0IHdlIGFjdHVhbGx5IGRpZCAqLwotCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9Ci0JCQkJICAgIHNldHRpbmdzLmltZ193aWR0aCAvIHNldHRpbmdzLkhvckRjbTsKLQkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KLQkJCQkgICAgc2V0dGluZ3MuaW1nX2hlaWdodCAqIDIgLwotCQkJCSAgICAoc2V0dGluZ3MuVG1wRGNtICogc2V0dGluZ3MuVmVyRGNtKTsKLQkJCQlpZiAoc2V0dGluZ3MuVG1wRGNtID09IDEpCi0JCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9Ci0JCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KLQkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfU0VRX1RCIDoKLQkJCQkJICAgICBWNEwyX0ZJRUxEX1NFUV9CVCk7Ci0JCQkJZWxzZQotCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQotCQkJCQkgICAgKGZoLT5qcGdfc2V0dGluZ3MuCi0JCQkJCSAgICAgb2RkX2V2ZW4gPyBWNEwyX0ZJRUxEX1RPUCA6Ci0JCQkJCSAgICAgVjRMMl9GSUVMRF9CT1RUT00pOwotCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9Ci0JCQkJICAgIHpvcmFuX3Y0bDJfY2FsY19idWZzaXplKCZmaC0+Ci0JCQkJCQkJICAgIGpwZ19zZXR0aW5ncyk7Ci0JCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9Ci0JCQkJICAgIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKLQotCQkJCS8qIHdlIGhlcmVieSBhYnVzZSB0aGlzIHZhcmlhYmxlIHRvIHNob3cgdGhhdAotCQkJCSAqIHdlJ3JlIGdvbm5hIGRvIG1qcGVnIGNhcHR1cmUgKi8KLQkJCQlmaC0+bWFwX21vZGUgPQotCQkJCSAgICAoZm10LT50eXBlID09Ci0JCQkJICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpID8KLQkJCQkgICAgWk9SQU5fTUFQX01PREVfSlBHX1JFQyA6Ci0JCQkJICAgIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOwotCQkJc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjoKLQkJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCi0JCQkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0KLQkJCQkJICAgIHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjKQotCQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKLQkJCQkJZHByaW50aygxLAotCQkJCQkJS0VSTl9FUlIKLQkJCQkJCSIlczogVklESU9DX1NfRk1UIC0gdW5rbm93bi91bnN1cHBvcnRlZCBmb3JtYXQgMHgleCAoJTQuNHMpXG4iLAotCQkJCQkJWlJfREVWTkFNRSh6ciksCi0JCQkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQsCi0JCQkJCQkoY2hhciAqKSAmcHJpbnRmb3JtYXQpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkIHx8Ci0JCQkJICAgIChmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkICYmCi0JCQkJICAgICBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9Ci0JCQkJICAgICBaT1JBTl9GUkVFKSkgewotCQkJCQlkcHJpbnRrKDEsCi0JCQkJCQlLRVJOX0VSUgotCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSBjYW5ub3QgY2hhbmdlIGNhcHR1cmUgbW9kZVxuIiwKLQkJCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCQkJcmVzID0gLUVCVVNZOwotCQkJCQlnb3RvIHNmbXR2NGxfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQkJfQotCQkJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCi0JCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQotCQkJCQkgICAgQlVaX01BWF9IRUlHSFQ7Ci0JCQkJaWYgKGZtdC0+Zm10LnBpeC53aWR0aCA+IEJVWl9NQVhfV0lEVEgpCi0JCQkJCWZtdC0+Zm10LnBpeC53aWR0aCA9IEJVWl9NQVhfV0lEVEg7Ci0KLQkJCQlpZiAoKHJlcyA9Ci0JCQkJICAgICB6b3Jhbl92NGxfc2V0X2Zvcm1hdChmaWxlLAotCQkJCQkJCSAgZm10LT5mbXQucGl4LgotCQkJCQkJCSAgd2lkdGgsCi0JCQkJCQkJICBmbXQtPmZtdC5waXguCi0JCQkJCQkJICBoZWlnaHQsCi0JCQkJCQkJICAmem9yYW5fZm9ybWF0cwotCQkJCQkJCSAgW2ldKSkpCi0JCQkJCWdvdG8gc2ZtdHY0bF91bmxvY2tfYW5kX3JldHVybjsKLQotCQkJCS8qIHRlbGwgdGhlIHVzZXIgdGhlCi0JCQkJICogcmVzdWx0cy9taXNzaW5nIHN0dWZmICovCi0JCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9Ci0JCQkJCWZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICoKLQkJCQkJZmgtPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmU7Ci0JCQkJaWYgKEJVWl9NQVhfSEVJR0hUIDwKLQkJCQkgICAgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICogMikpCi0JCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9Ci0JCQkJCSAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCQkJZWxzZQotCQkJCQlmbXQtPmZtdC5waXguZmllbGQgPQotCQkJCQkgICAgVjRMMl9GSUVMRF9UT1A7Ci0KLQkJCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9SQVc7Ci0JCQlzZm10djRsX3VubG9ja19hbmRfcmV0dXJuOgotCQkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkJfQotCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZHByaW50aygzLCAidW5zdXBwb3J0ZWRcbiIpOwotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfU19GTVQgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBmbXQtPnR5cGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX0ZCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX0dfRkJVRlxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCW1lbXNldChmYiwgMCwgc2l6ZW9mKCpmYikpOwotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCWZiLT5iYXNlID0genItPmJ1ZmZlci5iYXNlOwotCQlmYi0+Zm10LndpZHRoID0genItPmJ1ZmZlci53aWR0aDsKLQkJZmItPmZtdC5oZWlnaHQgPSB6ci0+YnVmZmVyLmhlaWdodDsKLQkJaWYgKHpyLT5vdmVybGF5X3NldHRpbmdzLmZvcm1hdCkgewotCQkJZmItPmZtdC5waXhlbGZvcm1hdCA9Ci0JCQkJZmgtPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0LT5mb3VyY2M7Ci0JCX0KLQkJZmItPmZtdC5ieXRlc3BlcmxpbmUgPSB6ci0+YnVmZmVyLmJ5dGVzcGVybGluZTsKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0JCWZiLT5mbXQuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwotCQlmYi0+Zm10LmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOwotCQlmYi0+ZmxhZ3MgPSBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZOwotCQlmYi0+Y2FwYWJpbGl0eSA9IFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORzsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19GQlVGOgotCXsKLQkJaW50IGksIHJlcyA9IDA7Ci0JCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYiA9IGFyZzsKLQkJX19sZTMyIHByaW50Zm9ybWF0ID0gX19jcHVfdG9fbGUzMihmYi0+Zm10LnBpeGVsZm9ybWF0KTsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6IFZJRElPQ19TX0ZCVUYgLSBiYXNlPTB4JXAsIHNpemU9JWR4JWQsIGJwbD0lZCwgZm10PTB4JXggKCU0LjRzKVxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBmYi0+YmFzZSwgZmItPmZtdC53aWR0aCwgZmItPmZtdC5oZWlnaHQsCi0JCQlmYi0+Zm10LmJ5dGVzcGVybGluZSwgZmItPmZtdC5waXhlbGZvcm1hdCwKLQkJCShjaGFyICopICZwcmludGZvcm1hdCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCi0JCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mb3VyY2MgPT0gZmItPmZtdC5waXhlbGZvcm1hdCkKLQkJCQlicmVhazsKLQkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DX1NfRkJVRiAtIGZvcm1hdD0weCV4ICglNC40cykgbm90IGFsbG93ZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGZiLT5mbXQucGl4ZWxmb3JtYXQsCi0JCQkJKGNoYXIgKikgJnByaW50Zm9ybWF0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPQotCQkgICAgc2V0dXBfZmJ1ZmZlcihmaWxlLCBmYi0+YmFzZSwgJnpvcmFuX2Zvcm1hdHNbaV0sCi0JCQkJICBmYi0+Zm10LndpZHRoLCBmYi0+Zm10LmhlaWdodCwKLQkJCQkgIGZiLT5mbXQuYnl0ZXNwZXJsaW5lKTsKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfT1ZFUkxBWToKLQl7Ci0JCWludCAqb24gPSBhcmcsIHJlczsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfUFJFVklFVyAtIG9uPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksICpvbik7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPSBzZXR1cF9vdmVybGF5KGZpbGUsICpvbik7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxID0gYXJnOwotCQlpbnQgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfUkVRQlVGUyAtIHR5cGU9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgcmVxLT50eXBlKTsKLQotCQlpZiAocmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBvbmx5IE1FTU9SWV9NTUFQIGNhcHR1cmUgaXMgc3VwcG9ydGVkLCBub3QgJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIHJlcS0+bWVtb3J5KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWlmIChmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkIHx8IGZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQpIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DX1JFUUJVRlMgLSBidWZmZXJzIGFsbHJlYWR5IGFsbG9jYXRlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRUJVU1k7Ci0JCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVyAmJgotCQkgICAgcmVxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCi0JCQkvKiBjb250cm9sIHVzZXIgaW5wdXQgKi8KLQkJCWlmIChyZXEtPmNvdW50IDwgMikKLQkJCQlyZXEtPmNvdW50ID0gMjsKLQkJCWlmIChyZXEtPmNvdW50ID4gdjRsX25idWZzKQotCQkJCXJlcS0+Y291bnQgPSB2NGxfbmJ1ZnM7Ci0JCQlmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnMgPSByZXEtPmNvdW50OwotCi0JCQlpZiAodjRsX2ZidWZmZXJfYWxsb2MoZmlsZSkpIHsKLQkJCQlyZXMgPSAtRU5PTUVNOwotCQkJCWdvdG8gdjRsMnJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQotCQkJLyogVGhlIG5leHQgbW1hcCB3aWxsIG1hcCB0aGUgVjRMIGJ1ZmZlcnMgKi8KLQkJCWZoLT5tYXBfbW9kZSA9IFpPUkFOX01BUF9NT0RFX1JBVzsKLQotCQl9IGVsc2UgaWYgKGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDIHx8Ci0JCQkgICBmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1BMQVkpIHsKLQotCQkJLyogd2UgbmVlZCB0byBjYWxjdWxhdGUgc2l6ZSBvdXJzZWx2ZXMgbm93ICovCi0JCQlpZiAocmVxLT5jb3VudCA8IDQpCi0JCQkJcmVxLT5jb3VudCA9IDQ7Ci0JCQlpZiAocmVxLT5jb3VudCA+IGpwZ19uYnVmcykKLQkJCQlyZXEtPmNvdW50ID0ganBnX25idWZzOwotCQkJZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzID0gcmVxLT5jb3VudDsKLQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9Ci0JCQkgICAgem9yYW5fdjRsMl9jYWxjX2J1ZnNpemUoJmZoLT5qcGdfc2V0dGluZ3MpOwotCi0JCQlpZiAoanBnX2ZidWZmZXJfYWxsb2MoZmlsZSkpIHsKLQkJCQlyZXMgPSAtRU5PTUVNOwotCQkJCWdvdG8gdjRsMnJlcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQotCQkJLyogVGhlIG5leHQgbW1hcCB3aWxsIG1hcCB0aGUgTUpQRUcgYnVmZmVycyAqLwotCQkJaWYgKHJlcS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQkJZmgtPm1hcF9tb2RlID0gWk9SQU5fTUFQX01PREVfSlBHX1JFQzsKLQkJCWVsc2UKLQkJCQlmaC0+bWFwX21vZGUgPSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWTsKLQotCQl9IGVsc2UgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfUkVRQlVGUyAtIHVua25vd24gdHlwZSAlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgcmVxLT50eXBlKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHY0bDJyZXFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQl2NGwycmVxYnVmX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJX191MzIgdHlwZSA9IGJ1Zi0+dHlwZTsKLQkJaW50IGluZGV4ID0gYnVmLT5pbmRleCwgcmVzOwotCi0JCWRwcmludGsoMywKLQkJCUtFUk5fREVCVUcKLQkJCSIlczogVklESU9DX1FVRVJZQlVGIC0gaW5kZXg9JWQsIHR5cGU9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT5pbmRleCwgYnVmLT50eXBlKTsKLQotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwotCQlidWYtPnR5cGUgPSB0eXBlOwotCQlidWYtPmluZGV4ID0gaW5kZXg7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXMgPSB6b3Jhbl92NGwyX2J1ZmZlcl9zdGF0dXMoZmlsZSwgYnVmLCBidWYtPmluZGV4KTsKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfUUJVRjoKLQl7Ci0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCQlpbnQgcmVzID0gMCwgY29kZWNfbW9kZSwgYnVmX3R5cGU7Ci0KLQkJZHByaW50aygzLAotCQkJS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19RQlVGIC0gdHlwZT0lZCwgaW5kZXg9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgYnVmLT50eXBlLCBidWYtPmluZGV4KTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJc3dpdGNoIChmaC0+bWFwX21vZGUpIHsKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6Ci0JCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBWSURJT0NfUUJVRiAtIGludmFsaWQgYnVmLT50eXBlPSVkIGZvciBtYXBfbW9kZT0lZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgZmgtPm1hcF9tb2RlKTsKLQkJCQlyZXMgPSAtRUlOVkFMOwotCQkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQotCQkJcmVzID0gem9yYW5fdjRsX3F1ZXVlX2ZyYW1lKGZpbGUsIGJ1Zi0+aW5kZXgpOwotCQkJaWYgKHJlcykKLQkJCQlnb3RvIHFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQlpZiAoIXpyLT52NGxfbWVtZ3JhYl9hY3RpdmUgJiYKLQkJCSAgICBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0xPQ0tFRCkKLQkJCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKLQkJCWlmIChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1BMQVkpIHsKLQkJCQlidWZfdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOwotCQkJCWNvZGVjX21vZGUgPSBCVVpfTU9ERV9NT1RJT05fREVDT01QUkVTUzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCQkJY29kZWNfbW9kZSA9IEJVWl9NT0RFX01PVElPTl9DT01QUkVTUzsKLQkJCX0KLQotCQkJaWYgKGJ1Zi0+dHlwZSAhPSBidWZfdHlwZSkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBWSURJT0NfUUJVRiAtIGludmFsaWQgYnVmLT50eXBlPSVkIGZvciBtYXBfbW9kZT0lZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSwgZmgtPm1hcF9tb2RlKTsKLQkJCQlyZXMgPSAtRUlOVkFMOwotCQkJCWdvdG8gcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQotCQkJcmVzID0KLQkJCSAgICB6b3Jhbl9qcGdfcXVldWVfZnJhbWUoZmlsZSwgYnVmLT5pbmRleCwKLQkJCQkJCSAgY29kZWNfbW9kZSk7Ci0JCQlpZiAocmVzICE9IDApCi0JCQkJZ290byBxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJaWYgKHpyLT5jb2RlY19tb2RlID09IEJVWl9NT0RFX0lETEUgJiYKLQkJCSAgICBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0xPQ0tFRCkgewotCQkJCXpyMzYwNTdfZW5hYmxlX2pwZyh6ciwgY29kZWNfbW9kZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfUUJVRiAtIHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSk7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0JcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfRFFCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJaW50IHJlcyA9IDAsIGJ1Zl90eXBlLCBudW0gPSAtMTsJLyogY29tcGlsZXIgYm9ya3MgaGVyZSAoPykgKi8KLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRFFCVUYgLSB0eXBlPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGJ1Zi0+dHlwZSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7Ci0JCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgotCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJCQlkcHJpbnRrKDEsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7Ci0JCQkJcmVzID0gLUVJTlZBTDsKLQkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCi0JCQludW0gPSB6ci0+djRsX3BlbmRbenItPnY0bF9zeW5jX3RhaWwgJiBWNExfTUFTS19GUkFNRV07Ci0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgJiYKLQkJCSAgICB6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW251bV0uc3RhdGUgIT0KLQkJCSAgICBCVVpfU1RBVEVfRE9ORSkgewotCQkJCXJlcyA9IC1FQUdBSU47Ci0JCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQkJCXJlcyA9IHY0bF9zeW5jKGZpbGUsIG51bSk7Ci0JCQlpZiAocmVzKQotCQkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQllbHNlCi0JCQkJenItPnY0bF9zeW5jX3RhaWwrKzsKLQkJCXJlcyA9IHpvcmFuX3Y0bDJfYnVmZmVyX3N0YXR1cyhmaWxlLCBidWYsIG51bSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6Ci0JCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1BMQVk6Ci0JCXsKLQkJCXN0cnVjdCB6b3Jhbl9zeW5jIGJzOwotCi0JCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19QTEFZKQotCQkJCWJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7Ci0JCQllbHNlCi0JCQkJYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0KLQkJCWlmIChidWYtPnR5cGUgIT0gYnVmX3R5cGUpIHsKLQkJCQlkcHJpbnRrKDEsCi0JCQkJCUtFUk5fRVJSCi0JCQkJCSIlczogVklESU9DX1FCVUYgLSBpbnZhbGlkIGJ1Zi0+dHlwZT0lZCBmb3IgbWFwX21vZGU9JWRcbiIsCi0JCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUsIGZoLT5tYXBfbW9kZSk7Ci0JCQkJcmVzID0gLUVJTlZBTDsKLQkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCi0JCQludW0gPQotCQkJICAgIHpyLT5qcGdfcGVuZFt6ci0+Ci0JCQkJCSBqcGdfcXVlX3RhaWwgJiBCVVpfTUFTS19GUkFNRV07Ci0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAmJgotCQkJICAgIHpyLT5qcGdfYnVmZmVycy5idWZmZXJbbnVtXS5zdGF0ZSAhPQotCQkJICAgIEJVWl9TVEFURV9ET05FKSB7Ci0JCQkJcmVzID0gLUVBR0FJTjsKLQkJCQlnb3RvIGRxYnVmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQkJcmVzID0ganBnX3N5bmMoZmlsZSwgJmJzKTsKLQkJCWlmIChyZXMpCi0JCQkJZ290byBkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjsKLQkJCXJlcyA9Ci0JCQkgICAgem9yYW5fdjRsMl9idWZmZXJfc3RhdHVzKGZpbGUsIGJ1ZiwgYnMuZnJhbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfRFFCVUYgLSB1bnN1cHBvcnRlZCB0eXBlICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBidWYtPnR5cGUpOwotCQkJcmVzID0gLUVJTlZBTDsKLQkJCWdvdG8gZHFidWZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQlkcWJ1Zl91bmxvY2tfYW5kX3JldHVybjoKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JewotCQlpbnQgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU1RSRUFNT05cbiIsIFpSX0RFVk5BTUUoenIpKTsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJc3dpdGNoIChmaC0+bWFwX21vZGUpIHsKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6CS8qIHJhdyBjYXB0dXJlICovCi0JCQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9BQ1RJVkUgfHwKLQkJCSAgICBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0FDVElWRSkgewotCQkJCXJlcyA9IC1FQlVTWTsKLQkJCQlnb3RvIHN0cm1vbl91bmxvY2tfYW5kX3JldHVybjsKLQkJCX0KLQotCQkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPQotCQkJICAgIFpPUkFOX0xPQ0tFRDsKLQkJCXpyLT52NGxfc2V0dGluZ3MgPSBmaC0+djRsX3NldHRpbmdzOwotCi0JCQl6ci0+djRsX3N5bmNfdGFpbCA9IHpyLT52NGxfcGVuZF90YWlsOwotCQkJaWYgKCF6ci0+djRsX21lbWdyYWJfYWN0aXZlICYmCi0JCQkgICAgenItPnY0bF9wZW5kX2hlYWQgIT0genItPnY0bF9wZW5kX3RhaWwpIHsKLQkJCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAxKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKLQkJCS8qIHdoYXQgaXMgdGhlIGNvZGVjIG1vZGUgcmlnaHQgbm93PyAqLwotCQkJaWYgKHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fQUNUSVZFIHx8Ci0JCQkgICAgZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9BQ1RJVkUpIHsKLQkJCQlyZXMgPSAtRUJVU1k7Ci0JCQkJZ290byBzdHJtb25fdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQl9Ci0KLQkJCXpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPSBmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID0KLQkJCSAgICBaT1JBTl9MT0NLRUQ7Ci0KLQkJCWlmICh6ci0+anBnX3F1ZV9oZWFkICE9IHpyLT5qcGdfcXVlX3RhaWwpIHsKLQkJCQkvKiBTdGFydCB0aGUganBlZyBjb2RlYyB3aGVuIHRoZSBmaXJzdCBmcmFtZSBpcyBxdWV1ZWQgICovCi0JCQkJanBlZ19zdGFydCh6cik7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfU1RSRUFNT04gLSBpbnZhbGlkIG1hcCBtb2RlICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBmaC0+bWFwX21vZGUpOwotCQkJcmVzID0gLUVJTlZBTDsKLQkJCWdvdG8gc3RybW9uX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0Jc3RybW9uX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQlpbnQgaSwgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU1RSRUFNT0ZGXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7Ci0JCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgkvKiByYXcgY2FwdHVyZSAqLwotCQkJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSAmJgotCQkJICAgIHpyLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSkgewotCQkJCXJlcyA9IC1FUEVSTTsJLyogc3RheSBvZmYgb3RoZXIncyBzZXR0aW5ncyEgKi8KLQkJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQl9Ci0JCQlpZiAoenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFKQotCQkJCWdvdG8gc3RybW9mZl91bmxvY2tfYW5kX3JldHVybjsKLQotCQkJLyogdW5sb2FkIGNhcHR1cmUgKi8KLQkJCWlmICh6ci0+djRsX21lbWdyYWJfYWN0aXZlKSB7Ci0JCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKQotCQkJCXpyLT52NGxfYnVmZmVycy5idWZmZXJbaV0uc3RhdGUgPQotCQkJCSAgICBCVVpfU1RBVEVfVVNFUjsKLQkJCWZoLT52NGxfYnVmZmVycyA9IHpyLT52NGxfYnVmZmVyczsKLQotCQkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9IGZoLT52NGxfYnVmZmVycy5hY3RpdmUgPQotCQkJICAgIFpPUkFOX0ZSRUU7Ci0KLQkJCXpyLT52NGxfZ3JhYl9zZXEgPSAwOwotCQkJenItPnY0bF9wZW5kX2hlYWQgPSB6ci0+djRsX3BlbmRfdGFpbCA9IDA7Ci0JCQl6ci0+djRsX3N5bmNfdGFpbCA9IDA7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKLQkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlID09IFpPUkFOX0ZSRUUgJiYKLQkJCSAgICB6ci0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKLQkJCQlyZXMgPSAtRVBFUk07CS8qIHN0YXkgb2ZmIG90aGVyJ3Mgc2V0dGluZ3MhICovCi0JCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQkJaWYgKHpyLT5qcGdfYnVmZmVycy5hY3RpdmUgPT0gWk9SQU5fRlJFRSkKLQkJCQlnb3RvIHN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm47Ci0KLQkJCXJlcyA9Ci0JCQkgICAganBnX3FidWYoZmlsZSwgLTEsCi0JCQkJICAgICAoZmgtPm1hcF9tb2RlID09Ci0JCQkJICAgICAgWk9SQU5fTUFQX01PREVfSlBHX1JFQykgPwotCQkJCSAgICAgQlVaX01PREVfTU9USU9OX0NPTVBSRVNTIDoKLQkJCQkgICAgIEJVWl9NT0RFX01PVElPTl9ERUNPTVBSRVNTKTsKLQkJCWlmIChyZXMpCi0JCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ19TVFJFQU1PRkYgLSBpbnZhbGlkIG1hcCBtb2RlICVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBmaC0+bWFwX21vZGUpOwotCQkJcmVzID0gLUVJTlZBTDsKLQkJCWdvdG8gc3RybW9mZl91bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCXN0cm1vZmZfdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfUVVFUllDVFJMIC0gaWQ9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgY3RybC0+aWQpOwotCi0JCS8qIHdlIG9ubHkgc3VwcG9ydCBodWUvc2F0dXJhdGlvbi9jb250cmFzdC9icmlnaHRuZXNzICovCi0JCWlmIChjdHJsLT5pZCA8IFY0TDJfQ0lEX0JSSUdIVE5FU1MgfHwKLQkJICAgIGN0cmwtPmlkID4gVjRMMl9DSURfSFVFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJaW50IGlkID0gY3RybC0+aWQ7Ci0JCQltZW1zZXQoY3RybCwgMCwgc2l6ZW9mKCpjdHJsKSk7Ci0JCQljdHJsLT5pZCA9IGlkOwotCQl9Ci0KLQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJCcmlnaHRuZXNzIiwgc2l6ZW9mKGN0cmwtPm5hbWUpLTEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJDb250cmFzdCIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJTYXR1cmF0aW9uIiwgc2l6ZW9mKGN0cmwtPm5hbWUpLTEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9DSURfSFVFOgotCQkJc3RybmNweShjdHJsLT5uYW1lLCAiSHVlIiwgc2l6ZW9mKGN0cmwtPm5hbWUpLTEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljdHJsLT5taW5pbXVtID0gMDsKLQkJY3RybC0+bWF4aW11bSA9IDY1NTM1OwotCQljdHJsLT5zdGVwID0gMTsKLQkJY3RybC0+ZGVmYXVsdF92YWx1ZSA9IDMyNzY4OwotCQljdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfR19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfR19DVFJMIC0gaWQ9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgY3RybC0+aWQpOwotCi0JCS8qIHdlIG9ubHkgc3VwcG9ydCBodWUvc2F0dXJhdGlvbi9jb250cmFzdC9icmlnaHRuZXNzICovCi0JCWlmIChjdHJsLT5pZCA8IFY0TDJfQ0lEX0JSSUdIVE5FU1MgfHwKLQkJICAgIGN0cmwtPmlkID4gVjRMMl9DSURfSFVFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJCWN0cmwtPnZhbHVlID0genItPmJyaWdodG5lc3M7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJCWN0cmwtPnZhbHVlID0genItPmNvbnRyYXN0OwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJCWN0cmwtPnZhbHVlID0genItPnNhdHVyYXRpb247Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCQljdHJsLT52YWx1ZSA9IHpyLT5odWU7Ci0JCQlicmVhazsKLQkJfQotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU19DVFJMIC0gaWQ9JWRcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgY3RybC0+aWQpOwotCi0JCS8qIHdlIG9ubHkgc3VwcG9ydCBodWUvc2F0dXJhdGlvbi9jb250cmFzdC9icmlnaHRuZXNzICovCi0JCWlmIChjdHJsLT5pZCA8IFY0TDJfQ0lEX0JSSUdIVE5FU1MgfHwKLQkJICAgIGN0cmwtPmlkID4gVjRMMl9DSURfSFVFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGN0cmwtPnZhbHVlIDwgMCB8fCBjdHJsLT52YWx1ZSA+IDY1NTM1KSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ19TX0NUUkwgLSBpbnZhbGlkIHZhbHVlICVkIGZvciBpZD0lZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgY3RybC0+dmFsdWUsIGN0cmwtPmlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJCXpyLT5icmlnaHRuZXNzID0gY3RybC0+dmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJCXpyLT5jb250cmFzdCA9IGN0cmwtPnZhbHVlOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJCXpyLT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCQl6ci0+aHVlID0gY3RybC0+dmFsdWU7Ci0JCQlicmVhazsKLQkJfQotCQlwaWN0LmJyaWdodG5lc3MgPSB6ci0+YnJpZ2h0bmVzczsKLQkJcGljdC5jb250cmFzdCA9IHpyLT5jb250cmFzdDsKLQkJcGljdC5jb2xvdXIgPSB6ci0+c2F0dXJhdGlvbjsKLQkJcGljdC5odWUgPSB6ci0+aHVlOwotCi0JCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9TRVRfUElDVFVSRSwgJnBpY3QpOwotCi0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19FTlVNU1REOgotCXsKLQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnN0ZCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTVNURCAtIGluZGV4PSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIHN0ZC0+aW5kZXgpOwotCi0JCWlmIChzdGQtPmluZGV4IDwgMCB8fCBzdGQtPmluZGV4ID49ICh6ci0+Y2FyZC5ub3JtcyArIDEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJaW50IGlkID0gc3RkLT5pbmRleDsKLQkJCW1lbXNldChzdGQsIDAsIHNpemVvZigqc3RkKSk7Ci0JCQlzdGQtPmluZGV4ID0gaWQ7Ci0JCX0KLQotCQlpZiAoc3RkLT5pbmRleCA9PSB6ci0+Y2FyZC5ub3JtcykgewotCQkJLyogaWYgd2UgaGF2ZSBhdXRvZGV0ZWN0LCAuLi4gKi8KLQkJCXN0cnVjdCB2aWRlb19kZWNvZGVyX2NhcGFiaWxpdHkgY2FwczsKLQkJCWRlY29kZXJfY29tbWFuZCh6ciwgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTLAotCQkJCQkmY2Fwcyk7Ci0JCQlpZiAoY2Fwcy5mbGFncyAmIFZJREVPX0RFQ09ERVJfQVVUTykgewotCQkJCXN0ZC0+aWQgPSBWNEwyX1NURF9BTEw7Ci0JCQkJc3RybmNweShzdGQtPm5hbWUsICJBdXRvZGV0ZWN0Iiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzd2l0Y2ggKHN0ZC0+aW5kZXgpIHsKLQkJY2FzZSAwOgotCQkJc3RkLT5pZCA9IFY0TDJfU1REX1BBTDsKLQkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiUEFMIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7Ci0JCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMF0tPkh0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXN0ZC0+aWQgPSBWNEwyX1NURF9OVFNDOwotCQkJc3RybmNweShzdGQtPm5hbWUsICJOVFNDIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7Ci0JCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMV0tPkh0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXN0ZC0+aWQgPSBWNEwyX1NURF9TRUNBTTsKLQkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiU0VDQU0iLCBzaXplb2Yoc3RkLT5uYW1lKS0xKTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAyNTsKLQkJCXN0ZC0+ZnJhbWVsaW5lcyA9IHpyLT5jYXJkLnR2blsyXS0+SHQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX1NURDoKLQl7Ci0JCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7Ci0JCWludCBub3JtOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX1NURFxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJbm9ybSA9IHpyLT5ub3JtOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlzd2l0Y2ggKG5vcm0pIHsKLQkJY2FzZSBWSURFT19NT0RFX1BBTDoKLQkJCSpzdGQgPSBWNEwyX1NURF9QQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBWSURFT19NT0RFX05UU0M6Ci0JCQkqc3RkID0gVjRMMl9TVERfTlRTQzsKLQkJCWJyZWFrOwotCQljYXNlIFZJREVPX01PREVfU0VDQU06Ci0JCQkqc3RkID0gVjRMMl9TVERfU0VDQU07Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX1NURDoKLQl7Ci0JCWludCBub3JtID0gLTEsIHJlcyA9IDA7Ci0JCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfU1REIC0gbm9ybT0weCVsbHhcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKLQotCQlpZiAoKCpzdGQgJiBWNEwyX1NURF9QQUwpICYmICEoKnN0ZCAmIH5WNEwyX1NURF9QQUwpKQotCQkJbm9ybSA9IFZJREVPX01PREVfUEFMOwotCQllbHNlIGlmICgoKnN0ZCAmIFY0TDJfU1REX05UU0MpICYmICEoKnN0ZCAmIH5WNEwyX1NURF9OVFNDKSkKLQkJCW5vcm0gPSBWSURFT19NT0RFX05UU0M7Ci0JCWVsc2UgaWYgKCgqc3RkICYgVjRMMl9TVERfU0VDQU0pICYmICEoKnN0ZCAmIH5WNEwyX1NURF9TRUNBTSkpCi0JCQlub3JtID0gVklERU9fTU9ERV9TRUNBTTsKLQkJZWxzZSBpZiAoKnN0ZCA9PSBWNEwyX1NURF9BTEwpCi0JCQlub3JtID0gVklERU9fTU9ERV9BVVRPOwotCQllbHNlIHsKLQkJCWRwcmludGsoMSwKLQkJCQlLRVJOX0VSUgotCQkJCSIlczogVklESU9DX1NfU1REIC0gaW52YWxpZCBub3JtIDB4JWxseFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlpZiAoKHJlcyA9IHpvcmFuX3NldF9ub3JtKHpyLCBub3JtKSkpCi0JCQlnb3RvIHNzdGRfdW5sb2NrX2FuZF9yZXR1cm47Ci0KLQkJcmVzID0gd2FpdF9ncmFiX3BlbmRpbmcoenIpOwotCXNzdGRfdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19FTlVNSU5QVVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wID0gYXJnOwotCQlpbnQgc3RhdHVzOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19FTlVNSU5QVVQgLSBpbmRleD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBpbnAtPmluZGV4KTsKLQotCQlpZiAoaW5wLT5pbmRleCA8IDAgfHwgaW5wLT5pbmRleCA+PSB6ci0+Y2FyZC5pbnB1dHMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZSB7Ci0JCQlpbnQgaWQgPSBpbnAtPmluZGV4OwotCQkJbWVtc2V0KGlucCwgMCwgc2l6ZW9mKCppbnApKTsKLQkJCWlucC0+aW5kZXggPSBpZDsKLQkJfQotCi0JCXN0cm5jcHkoaW5wLT5uYW1lLCB6ci0+Y2FyZC5pbnB1dFtpbnAtPmluZGV4XS5uYW1lLAotCQkJc2l6ZW9mKGlucC0+bmFtZSkgLSAxKTsKLQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJaW5wLT5zdGQgPSBWNEwyX1NURF9BTEw7Ci0KLQkJLyogR2V0IHN0YXR1cyBvZiB2aWRlbyBkZWNvZGVyICovCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJZGVjb2Rlcl9jb21tYW5kKHpyLCBERUNPREVSX0dFVF9TVEFUVVMsICZzdGF0dXMpOwotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlpZiAoIShzdGF0dXMgJiBERUNPREVSX1NUQVRVU19HT09EKSkgewotCQkJaW5wLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9OT19QT1dFUjsKLQkJCWlucC0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fU0lHTkFMOwotCQl9Ci0JCWlmICghKHN0YXR1cyAmIERFQ09ERVJfU1RBVFVTX0NPTE9SKSkKLQkJCWlucC0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fQ09MT1I7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gYXJnOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX0lOUFVUXG4iLCBaUl9ERVZOQU1FKHpyKSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkqaW5wdXQgPSB6ci0+aW5wdXQ7Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJaW50ICppbnB1dCA9IGFyZywgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfU19JTlBVVCAtIGlucHV0PSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksICppbnB1dCk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlpZiAoKHJlcyA9IHpvcmFuX3NldF9pbnB1dCh6ciwgKmlucHV0KSkpCi0JCQlnb3RvIHNpbnB1dF91bmxvY2tfYW5kX3JldHVybjsKLQotCQkvKiBNYWtlIHN1cmUgdGhlIGNoYW5nZXMgY29tZSBpbnRvIGVmZmVjdCAqLwotCQlyZXMgPSB3YWl0X2dyYWJfcGVuZGluZyh6cik7Ci0Jc2lucHV0X3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfRU5VTU9VVFBVVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX291dHB1dCAqb3V0cCA9IGFyZzsKLQotCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfRU5VTU9VVFBVVCAtIGluZGV4PSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIG91dHAtPmluZGV4KTsKLQotCQlpZiAob3V0cC0+aW5kZXggIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW1lbXNldChvdXRwLCAwLCBzaXplb2YoKm91dHApKTsKLQkJb3V0cC0+aW5kZXggPSAwOwotCQlvdXRwLT50eXBlID0gVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0dWR0FPVkVSTEFZOwotCQlzdHJuY3B5KG91dHAtPm5hbWUsICJBdXRvZGV0ZWN0Iiwgc2l6ZW9mKG91dHAtPm5hbWUpLTEpOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX09VVFBVVDoKLQl7Ci0JCWludCAqb3V0cHV0ID0gYXJnOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX09VVFBVVFxuIiwgWlJfREVWTkFNRSh6cikpOwotCi0JCSpvdXRwdXQgPSAwOwotCi0JCXJldHVybiAwOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX09VVFBVVDoKLQl7Ci0JCWludCAqb3V0cHV0ID0gYXJnOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19TX09VVFBVVCAtIG91dHB1dD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCAqb3V0cHV0KTsKLQotCQlpZiAoKm91dHB1dCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCQkvKiBjcm9wcGluZyAoc3ViLWZyYW1lIGNhcHR1cmUpICovCi0JY2FzZSBWSURJT0NfQ1JPUENBUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXAgPSBhcmc7Ci0JCWludCB0eXBlID0gY3JvcGNhcC0+dHlwZSwgcmVzID0gMDsKLQotCQlkcHJpbnRrKDMsIEtFUk5fRVJSICIlczogVklESU9DX0NST1BDQVAgLSB0eXBlPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGNyb3BjYXAtPnR5cGUpOwotCi0JCW1lbXNldChjcm9wY2FwLCAwLCBzaXplb2YoKmNyb3BjYXApKTsKLQkJY3JvcGNhcC0+dHlwZSA9IHR5cGU7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWlmIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICYmCi0JCSAgICAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJICAgICBmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfUkFXKSkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfQ1JPUENBUCAtIHN1YmNhcHR1cmUgb25seSBzdXBwb3J0ZWQgZm9yIGNvbXByZXNzZWQgY2FwdHVyZVxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBjcm9wY2FwX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0KLQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IGNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKLQkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gQlVaX01BWF9XSURUSDsKLQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IEJVWl9NQVhfSEVJR0hUOwotCQljcm9wY2FwLT5kZWZyZWN0LnRvcCA9IGNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7Ci0JCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSBCVVpfTUlOX1dJRFRIOwotCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IEJVWl9NSU5fSEVJR0hUOwotCWNyb3BjYXBfdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQlyZXR1cm4gcmVzOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19HX0NST1A6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOwotCQlpbnQgdHlwZSA9IGNyb3AtPnR5cGUsIHJlcyA9IDA7Ci0KLQkJZHByaW50aygzLCBLRVJOX0VSUiAiJXM6IFZJRElPQ19HX0NST1AgLSB0eXBlPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGNyb3AtPnR5cGUpOwotCi0JCW1lbXNldChjcm9wLCAwLCBzaXplb2YoKmNyb3ApKTsKLQkJY3JvcC0+dHlwZSA9IHR5cGU7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICYmCi0JCSAgICAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJICAgICBmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfUkFXKSkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBWSURJT0NfR19DUk9QIC0gc3ViY2FwdHVyZSBvbmx5IHN1cHBvcnRlZCBmb3IgY29tcHJlc3NlZCBjYXB0dXJlXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGdjcm9wX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0KLQkJY3JvcC0+Yy50b3AgPSBmaC0+anBnX3NldHRpbmdzLmltZ195OwotCQljcm9wLT5jLmxlZnQgPSBmaC0+anBnX3NldHRpbmdzLmltZ194OwotCQljcm9wLT5jLndpZHRoID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfd2lkdGg7Ci0JCWNyb3AtPmMuaGVpZ2h0ID0gZmgtPmpwZ19zZXR0aW5ncy5pbWdfaGVpZ2h0OwotCi0JZ2Nyb3BfdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXJldHVybiByZXM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1NfQ1JPUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7Ci0JCWludCByZXMgPSAwOwotCi0JCXNldHRpbmdzID0gZmgtPmpwZ19zZXR0aW5nczsKLQotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0VSUgotCQkJIiVzOiBWSURJT0NfU19DUk9QIC0gdHlwZT0lZCwgeD0lZCx5PSVkLHc9JWQsaD0lZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBjcm9wLT50eXBlLCBjcm9wLT5jLmxlZnQsIGNyb3AtPmMudG9wLAotCQkJY3JvcC0+Yy53aWR0aCwgY3JvcC0+Yy5oZWlnaHQpOwotCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCB8fCBmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ19TX0NST1AgLSBjYW5ub3QgY2hhbmdlIHNldHRpbmdzIHdoaWxlIGFjdGl2ZVxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRUJVU1k7Ci0JCQlnb3RvIHNjcm9wX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKLQkJICAgIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAotCQkgICAgIGZoLT5tYXBfbW9kZSA9PSBaT1JBTl9NQVBfTU9ERV9SQVcpKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IFZJRElPQ19HX0NST1AgLSBzdWJjYXB0dXJlIG9ubHkgc3VwcG9ydGVkIGZvciBjb21wcmVzc2VkIGNhcHR1cmVcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmVzID0gLUVJTlZBTDsKLQkJCWdvdG8gc2Nyb3BfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQkvKiBtb3ZlIGludG8gYSBmb3JtIHRoYXQgd2UgdW5kZXJzdGFuZCAqLwotCQlzZXR0aW5ncy5pbWdfeCA9IGNyb3AtPmMubGVmdDsKLQkJc2V0dGluZ3MuaW1nX3kgPSBjcm9wLT5jLnRvcDsKLQkJc2V0dGluZ3MuaW1nX3dpZHRoID0gY3JvcC0+Yy53aWR0aDsKLQkJc2V0dGluZ3MuaW1nX2hlaWdodCA9IGNyb3AtPmMuaGVpZ2h0OwotCi0JCS8qIGNoZWNrIHZhbGlkaXR5ICovCi0JCWlmICgocmVzID0gem9yYW5fY2hlY2tfanBnX3NldHRpbmdzKHpyLCAmc2V0dGluZ3MpKSkKLQkJCWdvdG8gc2Nyb3BfdW5sb2NrX2FuZF9yZXR1cm47Ci0KLQkJLyogYWNjZXB0ICovCi0JCWZoLT5qcGdfc2V0dGluZ3MgPSBzZXR0aW5nczsKLQotCXNjcm9wX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGFyYW1zID0gYXJnOwotCi0JCWRwcmludGsoMywgS0VSTl9ERUJVRyAiJXM6IFZJRElPQ19HX0pQRUdDT01QXG4iLAotCQkJWlJfREVWTkFNRSh6cikpOwotCi0JCW1lbXNldChwYXJhbXMsIDAsIHNpemVvZigqcGFyYW1zKSk7Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCXBhcmFtcy0+cXVhbGl0eSA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAucXVhbGl0eTsKLQkJcGFyYW1zLT5BUFBuID0gZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5BUFBuOwotCQltZW1jcHkocGFyYW1zLT5BUFBfZGF0YSwKLQkJICAgICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQVBQX2RhdGEsCi0JCSAgICAgICBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9sZW4pOwotCQlwYXJhbXMtPkFQUF9sZW4gPSBmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wLkFQUF9sZW47Ci0JCW1lbWNweShwYXJhbXMtPkNPTV9kYXRhLAotCQkgICAgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5DT01fZGF0YSwKLQkJICAgICAgIGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2xlbik7Ci0JCXBhcmFtcy0+Q09NX2xlbiA9IGZoLT5qcGdfc2V0dGluZ3MuanBnX2NvbXAuQ09NX2xlbjsKLQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgPQotCQkgICAgZmgtPmpwZ19zZXR0aW5ncy5qcGdfY29tcC5qcGVnX21hcmtlcnM7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1NfSlBFR0NPTVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcyA9IGFyZzsKLQkJaW50IHJlcyA9IDA7Ci0KLQkJc2V0dGluZ3MgPSBmaC0+anBnX3NldHRpbmdzOwotCi0JCWRwcmludGsoMywKLQkJCUtFUk5fREVCVUcKLQkJCSIlczogVklESU9DX1NfSlBFR0NPTVAgLSBxdWFsaXR5PSVkLCBBUFBOPSVkLCBBUFBfbGVuPSVkLCBDT01fbGVuPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIHBhcmFtcy0+cXVhbGl0eSwgcGFyYW1zLT5BUFBuLAotCQkJcGFyYW1zLT5BUFBfbGVuLCBwYXJhbXMtPkNPTV9sZW4pOwotCi0JCXNldHRpbmdzLmpwZ19jb21wID0gKnBhcmFtczsKLQotCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSB8fAotCQkgICAgZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9XQVJOSU5HCi0JCQkJIiVzOiBWSURJT0NfU19KUEVHQ09NUCBjYWxsZWQgd2hpbGUgaW4gcGxheWJhY2svY2FwdHVyZSBtb2RlXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IC1FQlVTWTsKLQkJCWdvdG8gc2pwZWdjX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChyZXMgPSB6b3Jhbl9jaGVja19qcGdfc2V0dGluZ3MoenIsICZzZXR0aW5ncykpKQotCQkJZ290byBzanBlZ2NfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCWlmICghZmgtPmpwZ19idWZmZXJzLmFsbG9jYXRlZCkKLQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSA9Ci0JCQkgICAgem9yYW5fdjRsMl9jYWxjX2J1ZnNpemUoJmZoLT5qcGdfc2V0dGluZ3MpOwotCQlmaC0+anBnX3NldHRpbmdzLmpwZ19jb21wID0gKnBhcmFtcyA9IHNldHRpbmdzLmpwZ19jb21wOwotCXNqcGVnY191bmxvY2tfYW5kX3JldHVybjoKLQkJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1FVRVJZU1REOgkvKiB3aHkgaXMgdGhpcyB1c2VmdWw/ICovCi0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOwotCi0JCWRwcmludGsoMywKLQkJCUtFUk5fREVCVUcgIiVzOiBWSURJT0NfUVVFUllfU1REIC0gc3RkPTB4JWxseFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCAodW5zaWduZWQgbG9uZyBsb25nKSpzdGQpOwotCi0JCWlmICgqc3RkID09IFY0TDJfU1REX0FMTCB8fCAqc3RkID09IFY0TDJfU1REX05UU0MgfHwKLQkJICAgICpzdGQgPT0gVjRMMl9TVERfUEFMIHx8ICgqc3RkID09IFY0TDJfU1REX1NFQ0FNICYmCi0JCQkJCSAgICAgenItPmNhcmQubm9ybXMgPT0gMykpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1RSWV9GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQkJaW50IHJlcyA9IDA7Ci0KLQkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1RSWV9GTVQgLSB0eXBlPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGZtdC0+dHlwZSk7Ci0KLQkJc3dpdGNoIChmbXQtPnR5cGUpIHsKLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6Ci0JCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJCWlmIChmbXQtPmZtdC53aW4udy53aWR0aCA+IEJVWl9NQVhfV0lEVEgpCi0JCQkJZm10LT5mbXQud2luLncud2lkdGggPSBCVVpfTUFYX1dJRFRIOwotCQkJaWYgKGZtdC0+Zm10Lndpbi53LndpZHRoIDwgQlVaX01JTl9XSURUSCkKLQkJCQlmbXQtPmZtdC53aW4udy53aWR0aCA9IEJVWl9NSU5fV0lEVEg7Ci0JCQlpZiAoZm10LT5mbXQud2luLncuaGVpZ2h0ID4gQlVaX01BWF9IRUlHSFQpCi0JCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0gQlVaX01BWF9IRUlHSFQ7Ci0JCQlpZiAoZm10LT5mbXQud2luLncuaGVpZ2h0IDwgQlVaX01JTl9IRUlHSFQpCi0JCQkJZm10LT5mbXQud2luLncuaGVpZ2h0ID0gQlVaX01JTl9IRUlHSFQ7Ci0KLQkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6Ci0JCQlpZiAoZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQkJaWYgKGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTUpQRUcpIHsKLQkJCQlzZXR0aW5ncyA9IGZoLT5qcGdfc2V0dGluZ3M7Ci0KLQkJCQkvKiB3ZSBhY3R1YWxseSBuZWVkIHRvIHNldCAncmVhbCcgcGFyYW1ldGVycyBub3cgKi8KLQkJCQlpZiAoKGZtdC0+Zm10LnBpeC5oZWlnaHQgKiAyKSA+Ci0JCQkJICAgIEJVWl9NQVhfSEVJR0hUKQotCQkJCQlzZXR0aW5ncy5UbXBEY20gPSAxOwotCQkJCWVsc2UKLQkJCQkJc2V0dGluZ3MuVG1wRGNtID0gMjsKLQkJCQlzZXR0aW5ncy5kZWNpbWF0aW9uID0gMDsKLQkJCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA8PQotCQkJCSAgICBmaC0+anBnX3NldHRpbmdzLmltZ19oZWlnaHQgLyAyKQotCQkJCQlzZXR0aW5ncy5WZXJEY20gPSAyOwotCQkJCWVsc2UKLQkJCQkJc2V0dGluZ3MuVmVyRGNtID0gMTsKLQkJCQlpZiAoZm10LT5mbXQucGl4LndpZHRoIDw9Ci0JCQkJICAgIGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoIC8gNCkKLQkJCQkJc2V0dGluZ3MuSG9yRGNtID0gNDsKLQkJCQllbHNlIGlmIChmbXQtPmZtdC5waXgud2lkdGggPD0KLQkJCQkJIGZoLT5qcGdfc2V0dGluZ3MuaW1nX3dpZHRoIC8gMikKLQkJCQkJc2V0dGluZ3MuSG9yRGNtID0gMjsKLQkJCQllbHNlCi0JCQkJCXNldHRpbmdzLkhvckRjbSA9IDE7Ci0JCQkJaWYgKHNldHRpbmdzLlRtcERjbSA9PSAxKQotCQkJCQlzZXR0aW5ncy5maWVsZF9wZXJfYnVmZiA9IDI7Ci0JCQkJZWxzZQotCQkJCQlzZXR0aW5ncy5maWVsZF9wZXJfYnVmZiA9IDE7Ci0KLQkJCQkvKiBjaGVjayAqLwotCQkJCWlmICgocmVzID0KLQkJCQkgICAgIHpvcmFuX2NoZWNrX2pwZ19zZXR0aW5ncyh6ciwKLQkJCQkJCQkgICAgICAmc2V0dGluZ3MpKSkKLQkJCQkJZ290byB0cnlmbXRfdW5sb2NrX2FuZF9yZXR1cm47Ci0KLQkJCQkvKiB0ZWxsIHRoZSB1c2VyIHdoYXQgd2UgYWN0dWFsbHkgZGlkICovCi0JCQkJZm10LT5mbXQucGl4LndpZHRoID0KLQkJCQkgICAgc2V0dGluZ3MuaW1nX3dpZHRoIC8gc2V0dGluZ3MuSG9yRGNtOwotCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQotCQkJCSAgICBzZXR0aW5ncy5pbWdfaGVpZ2h0ICogMiAvCi0JCQkJICAgIChzZXR0aW5ncy5UbXBEY20gKiBzZXR0aW5ncy5WZXJEY20pOwotCQkJCWlmIChzZXR0aW5ncy5UbXBEY20gPT0gMSkKLQkJCQkJZm10LT5mbXQucGl4LmZpZWxkID0KLQkJCQkJICAgIChmaC0+anBnX3NldHRpbmdzLgotCQkJCQkgICAgIG9kZF9ldmVuID8gVjRMMl9GSUVMRF9TRVFfVEIgOgotCQkJCQkgICAgIFY0TDJfRklFTERfU0VRX0JUKTsKLQkJCQllbHNlCi0JCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9Ci0JCQkJCSAgICAoZmgtPmpwZ19zZXR0aW5ncy4KLQkJCQkJICAgICBvZGRfZXZlbiA/IFY0TDJfRklFTERfVE9QIDoKLQkJCQkJICAgICBWNEwyX0ZJRUxEX0JPVFRPTSk7Ci0KLQkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0KLQkJCQkgICAgem9yYW5fdjRsMl9jYWxjX2J1ZnNpemUoJnNldHRpbmdzKTsKLQkJCX0gZWxzZSBpZiAoZm10LT50eXBlID09Ci0JCQkJICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQkJaW50IGk7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZPUk1BVFM7IGkrKykKLQkJCQkJaWYgKHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjID09Ci0JCQkJCSAgICBmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQpCi0JCQkJCQlicmVhazsKLQkJCQlpZiAoaSA9PSBOVU1fRk9STUFUUykgewotCQkJCQlyZXMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIHRyeWZtdF91bmxvY2tfYW5kX3JldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAoZm10LT5mbXQucGl4LndpZHRoID4gQlVaX01BWF9XSURUSCkKLQkJCQkJZm10LT5mbXQucGl4LndpZHRoID0gQlVaX01BWF9XSURUSDsKLQkJCQlpZiAoZm10LT5mbXQucGl4LndpZHRoIDwgQlVaX01JTl9XSURUSCkKLQkJCQkJZm10LT5mbXQucGl4LndpZHRoID0gQlVaX01JTl9XSURUSDsKLQkJCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA+IEJVWl9NQVhfSEVJR0hUKQotCQkJCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0KLQkJCQkJICAgIEJVWl9NQVhfSEVJR0hUOwotCQkJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0IDwgQlVaX01JTl9IRUlHSFQpCi0JCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQotCQkJCQkgICAgQlVaX01JTl9IRUlHSFQ7Ci0JCQl9IGVsc2UgewotCQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQkJZ290byB0cnlmbXRfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQl9Ci0JCXRyeWZtdF91bmxvY2tfYW5kX3JldHVybjoKLQkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCQlyZXR1cm4gcmVzOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRwcmludGsoMSwgS0VSTl9ERUJVRyAiJXM6IFVOS05PV04gaW9jdGwgY21kOiAweCV4XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGNtZCk7Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JCWJyZWFrOwotCi0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLXpvcmFuX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCSAgICAgc3RydWN0IGZpbGUgICpmaWxlLAotCSAgICAgdW5zaWduZWQgaW50ICBjbWQsCi0JICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB6b3Jhbl9kb19pb2N0bCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXpvcmFuX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLAotCSAgICBwb2xsX3RhYmxlICAqd2FpdCkKLXsKLQlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0JaW50IHJlcyA9IDAsIGZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciBidWZmZXJzIGFyZSByZWFkeSB0byBiZSBzeW5jZWQgb24KLQkgKiAody9vIHdhaXRzIC0gT19OT05CTE9DSykgaGVyZQotCSAqIGlmIHJlYWR5IGZvciByZWFkIChzeW5jKSwgcmV0dXJuIFBPTExJTnxQT0xMUkROT1JNLAotCSAqIGlmIHJlYWR5IGZvciB3cml0ZSAoc3luYyksIHJldHVybiBQT0xMT1VUfFBPTExXUk5PUk0sCi0JICogaWYgZXJyb3IsIHJldHVybiBQT0xMRVJSLAotCSAqIGlmIG5vIGJ1ZmZlcnMgcXVldWVkIG9yIHNvLCByZXR1cm4gUE9MTE5WQUwKLQkgKi8KLQotCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7Ci0JY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6Ci0JCXBvbGxfd2FpdChmaWxlLCAmenItPnY0bF9jYXBxLCB3YWl0KTsKLQkJZnJhbWUgPSB6ci0+djRsX3BlbmRbenItPnY0bF9zeW5jX3RhaWwgJiBWNExfTUFTS19GUkFNRV07Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCQlkcHJpbnRrKDMsCi0JCQlLRVJOX0RFQlVHCi0JCQkiJXM6ICVzKCkgcmF3IC0gYWN0aXZlPSVjLCBzeW5jX3RhaWw9JWx1LyVjLCBwZW5kX3RhaWw9JWx1LCBwZW5kX2hlYWQ9JWx1XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIF9fZnVuY19fLAotCQkJIkZBTCJbZmgtPnY0bF9idWZmZXJzLmFjdGl2ZV0sIHpyLT52NGxfc3luY190YWlsLAotCQkJIlVQTUQiW3pyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlXSwKLQkJCXpyLT52NGxfcGVuZF90YWlsLCB6ci0+djRsX3BlbmRfaGVhZCk7Ci0JCS8qIFByb2Nlc3MgaXMgdGhlIG9uZSBjYXB0dXJpbmc/ICovCi0JCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKLQkJICAgIC8qIEJ1ZmZlciByZWFkeSB0byBEUUJVRj8gKi8KLQkJICAgIHpyLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID09IEJVWl9TVEFURV9ET05FKQotCQkJcmVzID0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6Ci0JY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKLQkJcG9sbF93YWl0KGZpbGUsICZ6ci0+anBnX2NhcHEsIHdhaXQpOwotCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX3F1ZV90YWlsICYgQlVaX01BU0tfRlJBTUVdOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZHByaW50aygzLAotCQkJS0VSTl9ERUJVRwotCQkJIiVzOiAlcygpIGpwZyAtIGFjdGl2ZT0lYywgcXVlX3RhaWw9JWx1LyVjLCBxdWVfaGVhZD0lbHUsIGRtYT0lbHUvJWx1XG4iLAotCQkJWlJfREVWTkFNRSh6ciksIF9fZnVuY19fLAotCQkJIkZBTCJbZmgtPmpwZ19idWZmZXJzLmFjdGl2ZV0sIHpyLT5qcGdfcXVlX3RhaWwsCi0JCQkiVVBNRCJbenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGVdLAotCQkJenItPmpwZ19xdWVfaGVhZCwgenItPmpwZ19kbWFfdGFpbCwgenItPmpwZ19kbWFfaGVhZCk7Ci0JCWlmIChmaC0+anBnX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUgJiYKLQkJICAgIHpyLT5qcGdfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID09IEJVWl9TVEFURV9ET05FKSB7Ci0JCQlpZiAoZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX0pQR19SRUMpCi0JCQkJcmVzID0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJCWVsc2UKLQkJCQlyZXMgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHpvcmFuX3BvbGwoKSAtIGludGVybmFsIGVycm9yLCB1bmtub3duIG1hcF9tb2RlPSVkXG4iLAotCQkJWlJfREVWTkFNRSh6ciksIGZoLT5tYXBfbW9kZSk7Ci0JCXJlcyA9IFBPTExOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotCi0vKgotICogVGhpcyBtYXBzIHRoZSBidWZmZXJzIHRvIHVzZXIgc3BhY2UuCi0gKgotICogRGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiBmaC0+bWFwX21vZGUKLSAqIHRoZSBWNEwgb3IgdGhlIE1KUEVHIGJ1ZmZlcnMgYXJlIG1hcHBlZAotICogcGVyIGJ1ZmZlciBvciBhbGwgdG9nZXRoZXIKLSAqCi0gKiBOb3RlIHRoYXQgd2UgbmVlZCB0byBjb25uZWN0IHRvIHNvbWUKLSAqIHVubWFwIHNpZ25hbCBldmVudCB0byB1bm1hcCB0aGUgZGUtYWxsb2NhdGUKLSAqIHRoZSBidWZmZXIgYWNjb3JkaW5nbHkgKHpvcmFuX3ZtX2Nsb3NlKCkpCi0gKi8KLQotc3RhdGljIHZvaWQKLXpvcmFuX3ZtX29wZW4gKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCB6b3Jhbl9tYXBwaW5nICptYXAgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQotCW1hcC0+Y291bnQrKzsKLX0KLQotc3RhdGljIHZvaWQKLXpvcmFuX3ZtX2Nsb3NlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgem9yYW5fbWFwcGluZyAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBtYXAtPmZpbGU7Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCWludCBpOwotCi0JbWFwLT5jb3VudC0tOwotCWlmIChtYXAtPmNvdW50ID09IDApIHsKLQkJc3dpdGNoIChmaC0+bWFwX21vZGUpIHsKLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUkVDOgotCQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgotCi0JCQlkcHJpbnRrKDMsIEtFUk5fSU5GTyAiJXM6IG11bm1hcChNSlBFRylcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKLQkJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS5tYXAgPT0gbWFwKSB7Ci0JCQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0ubWFwID0KLQkJCQkJICAgIE5VTEw7Ci0JCQkJfQotCQkJfQotCQkJa2ZyZWUobWFwKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVyczsgaSsrKQotCQkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCkKLQkJCQkJYnJlYWs7Ci0JCQlpZiAoaSA9PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMpIHsKLQkJCQltdXRleF9sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7Ci0KLQkJCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7Ci0JCQkJCWpwZ19xYnVmKGZpbGUsIC0xLCB6ci0+Y29kZWNfbW9kZSk7Ci0JCQkJCXpyLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCQkJCQl6ci0+anBnX2J1ZmZlcnMuYWN0aXZlID0KLQkJCQkJICAgIGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgPQotCQkJCQkgICAgWk9SQU5fRlJFRTsKLQkJCQl9Ci0JCQkJLy9qcGdfZmJ1ZmZlcl9mcmVlKGZpbGUpOwotCQkJCWZoLT5qcGdfYnVmZmVycy5hbGxvY2F0ZWQgPSAwOwotCQkJCWZoLT5qcGdfYnVmZmVycy5yZWFkeV90b19iZV9mcmVlZCA9IDE7Ci0KLQkJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6Ci0KLQkJCWRwcmludGsoMywgS0VSTl9JTkZPICIlczogbXVubWFwKFY0TClcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspIHsKLQkJCQlpZiAoZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5tYXAgPT0gbWFwKSB7Ci0JCQkJCS8qIHVucXVldWUvdW5tYXAgKi8KLQkJCQkJZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcltpXS5tYXAgPQotCQkJCQkgICAgTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCQlrZnJlZShtYXApOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzOyBpKyspCi0JCQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwKQotCQkJCQlicmVhazsKLQkJCWlmIChpID09IGZoLT52NGxfYnVmZmVycy5udW1fYnVmZmVycykgewotCQkJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKLQkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7Ci0JCQkJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOwotCQkJCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKLQkJCQkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9Ci0JCQkJCSAgICBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KLQkJCQkJICAgIFpPUkFOX0ZSRUU7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwotCQkJCX0KLQkJCQkvL3Y0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7Ci0JCQkJZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7Ci0JCQkJZmgtPnY0bF9idWZmZXJzLnJlYWR5X3RvX2JlX2ZyZWVkID0gMTsKLQotCQkJCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCQkJfQotCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBtdW5tYXAoKSAtIGludGVybmFsIGVycm9yIC0gdW5rbm93biBtYXAgbW9kZSAlZFxuIiwKLQkJCSAgICAgICBaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKLQkJCWJyZWFrOwotCi0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgem9yYW5fdm1fb3BzID0gewotCS5vcGVuID0gem9yYW5fdm1fb3BlbiwKLQkuY2xvc2UgPSB6b3Jhbl92bV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBpbnQKLXpvcmFuX21tYXAgKHN0cnVjdCBmaWxlICAgICAgICAgICAqZmlsZSwKLQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IHpvcmFuX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgem9yYW4gKnpyID0gZmgtPnpyOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCWludCBpLCBqOwotCXVuc2lnbmVkIGxvbmcgcGFnZSwgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0LCB0b2RvLCBwb3MsIGZyYWdsZW47Ci0JaW50IGZpcnN0LCBsYXN0OwotCXN0cnVjdCB6b3Jhbl9tYXBwaW5nICptYXA7Ci0JaW50IHJlcyA9IDA7Ci0KLQlkcHJpbnRrKDMsCi0JCUtFUk5fSU5GTyAiJXM6IG1tYXAoJXMpIG9mIDB4JTA4bHgtMHglMDhseCAoc2l6ZT0lbHUpXG4iLAotCQlaUl9ERVZOQU1FKHpyKSwKLQkJZmgtPm1hcF9tb2RlID09IFpPUkFOX01BUF9NT0RFX1JBVyA/ICJWNEwiIDogIk1KUEVHIiwKLQkJdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHNpemUpOwotCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgISh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgfHwKLQkgICAgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKSB7Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IG1tYXAoKSAtIG5vIE1BUF9TSEFSRUQvUFJPVF97UkVBRCxXUklURX0gZ2l2ZW5cbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZmgtPm1hcF9tb2RlKSB7Ci0KLQljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19SRUM6Ci0JY2FzZSBaT1JBTl9NQVBfTU9ERV9KUEdfUExBWToKLQotCQkvKiBsb2NrICovCi0JCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQkvKiBNYXAgdGhlIE1KUEVHIGJ1ZmZlcnMgKi8KLQkJaWYgKCFmaC0+anBnX2J1ZmZlcnMuYWxsb2NhdGVkKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IHpvcmFuX21tYXAoTUpQRUcpIC0gYnVmZmVycyBub3QgeWV0IGFsbG9jYXRlZFxuIiwKLQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQlyZXMgPSAtRU5PTUVNOwotCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCi0JCWZpcnN0ID0gb2Zmc2V0IC8gZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQlsYXN0ID0gZmlyc3QgLSAxICsgc2l6ZSAvIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZTsKLQkJaWYgKG9mZnNldCAlIGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAhPSAwIHx8Ci0JCSAgICBzaXplICUgZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplICE9IDAgfHwgZmlyc3QgPCAwIHx8Ci0JCSAgICBsYXN0IDwgMCB8fCBmaXJzdCA+PSBmaC0+anBnX2J1ZmZlcnMubnVtX2J1ZmZlcnMgfHwKLQkJICAgIGxhc3QgPj0gZmgtPmpwZ19idWZmZXJzLm51bV9idWZmZXJzKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IG1tYXAoTUpQRUcpIC0gb2Zmc2V0PSVsdSBvciBzaXplPSVsdSBpbnZhbGlkIGZvciBidWZzaXplPSVkIGFuZCBudW1idWZzPSVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpLCBvZmZzZXQsIHNpemUsCi0JCQkJZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcl9zaXplLAotCQkJCWZoLT5qcGdfYnVmZmVycy5udW1fYnVmZmVycyk7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBqcGdfbW1hcF91bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCQlmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKLQkJCWlmIChmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLm1hcCkgewotCQkJCWRwcmludGsoMSwKLQkJCQkJS0VSTl9FUlIKLQkJCQkJIiVzOiBtbWFwKE1KUEVHKSAtIGJ1ZmZlciAlZCBhbHJlYWR5IG1hcHBlZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCQkJCXJlcyA9IC1FQlVTWTsKLQkJCQlnb3RvIGpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogbWFwIHRoZXNlIGJ1ZmZlcnMgKHY0bF9idWZmZXJzW2ldKSAqLwotCQltYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgem9yYW5fbWFwcGluZyksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1hcCkgewotCQkJcmVzID0gLUVOT01FTTsKLQkJCWdvdG8ganBnX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQkJbWFwLT5maWxlID0gZmlsZTsKLQkJbWFwLT5jb3VudCA9IDE7Ci0KLQkJdm1hLT52bV9vcHMgPSAmem9yYW5fdm1fb3BzOwotCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQ7Ci0JCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOwotCi0JCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewotCQkJZm9yIChqID0gMDsKLQkJCSAgICAgaiA8IGZoLT5qcGdfYnVmZmVycy5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsKLQkJCSAgICAgaisrKSB7Ci0JCQkJZnJhZ2xlbiA9Ci0JCQkJICAgIChsZTMyX3RvX2NwdShmaC0+anBnX2J1ZmZlcnMuYnVmZmVyW2ldLgotCQkJCSAgICAgZnJhZ190YWJbMiAqIGogKyAxXSkgJiB+MSkgPDwgMTsKLQkJCQl0b2RvID0gc2l6ZTsKLQkJCQlpZiAodG9kbyA+IGZyYWdsZW4pCi0JCQkJCXRvZG8gPSBmcmFnbGVuOwotCQkJCXBvcyA9Ci0JCQkJICAgIGxlMzJfdG9fY3B1KGZoLT5qcGdfYnVmZmVycy4KLQkJCQkgICAgYnVmZmVyW2ldLmZyYWdfdGFiWzIgKiBqXSk7Ci0JCQkJLyogc2hvdWxkIGp1c3QgYmUgcG9zIG9uIGkzODYgKi8KLQkJCQlwYWdlID0gdmlydF90b19waHlzKGJ1c190b192aXJ0KHBvcykpCi0JCQkJCQkJCT4+IFBBR0VfU0hJRlQ7Ci0JCQkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLAotCQkJCQkJCXRvZG8sIFBBR0VfU0hBUkVEKSkgewotCQkJCQlkcHJpbnRrKDEsCi0JCQkJCQlLRVJOX0VSUgotCQkJCQkJIiVzOiB6b3Jhbl9tbWFwKFY0TCkgLSByZW1hcF9wZm5fcmFuZ2UgZmFpbGVkXG4iLAotCQkJCQkJWlJfREVWTkFNRSh6cikpOwotCQkJCQlyZXMgPSAtRUFHQUlOOwotCQkJCQlnb3RvIGpwZ19tbWFwX3VubG9ja19hbmRfcmV0dXJuOwotCQkJCX0KLQkJCQlzaXplIC09IHRvZG87Ci0JCQkJc3RhcnQgKz0gdG9kbzsKLQkJCQlpZiAoc2l6ZSA9PSAwKQotCQkJCQlicmVhazsKLQkJCQlpZiAobGUzMl90b19jcHUoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltpXS4KLQkJCQkgICAgZnJhZ190YWJbMiAqIGogKyAxXSkgJiAxKQotCQkJCQlicmVhazsJLyogd2FzIGxhc3QgZnJhZ21lbnQgKi8KLQkJCX0KLQkJCWZoLT5qcGdfYnVmZmVycy5idWZmZXJbaV0ubWFwID0gbWFwOwotCQkJaWYgKHNpemUgPT0gMCkKLQkJCQlicmVhazsKLQotCQl9Ci0JanBnX21tYXBfdW5sb2NrX2FuZF9yZXR1cm46Ci0JCW11dGV4X3VubG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCWJyZWFrOwotCi0JY2FzZSBaT1JBTl9NQVBfTU9ERV9SQVc6Ci0KLQkJbXV0ZXhfbG9jaygmenItPnJlc291cmNlX2xvY2spOwotCi0JCS8qIE1hcCB0aGUgVjRMIGJ1ZmZlcnMgKi8KLQkJaWYgKCFmaC0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkKSB7Ci0JCQlkcHJpbnRrKDEsCi0JCQkJS0VSTl9FUlIKLQkJCQkiJXM6IHpvcmFuX21tYXAoVjRMKSAtIGJ1ZmZlcnMgbm90IHlldCBhbGxvY2F0ZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmVzID0gLUVOT01FTTsKLQkJCWdvdG8gdjRsX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQotCQlmaXJzdCA9IG9mZnNldCAvIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZTsKLQkJbGFzdCA9IGZpcnN0IC0gMSArIHNpemUgLyBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemU7Ci0JCWlmIChvZmZzZXQgJSBmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUgIT0gMCB8fAotCQkgICAgc2l6ZSAlIGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSAhPSAwIHx8IGZpcnN0IDwgMCB8fAotCQkgICAgbGFzdCA8IDAgfHwgZmlyc3QgPj0gZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzIHx8Ci0JCSAgICBsYXN0ID49IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSkgewotCQkJZHByaW50aygxLAotCQkJCUtFUk5fRVJSCi0JCQkJIiVzOiBtbWFwKFY0TCkgLSBvZmZzZXQ9JWx1IG9yIHNpemU9JWx1IGludmFsaWQgZm9yIGJ1ZnNpemU9JWQgYW5kIG51bWJ1ZnM9JWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6ciksIG9mZnNldCwgc2l6ZSwKLQkJCQlmaC0+djRsX2J1ZmZlcnMuYnVmZmVyX3NpemUsCi0JCQkJZmgtPnY0bF9idWZmZXJzLm51bV9idWZmZXJzKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0JCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewotCQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IG1tYXAoVjRMKSAtIGJ1ZmZlciAlZCBhbHJlYWR5IG1hcHBlZFxuIiwKLQkJCQkJWlJfREVWTkFNRSh6ciksIGkpOwotCQkJCXJlcyA9IC1FQlVTWTsKLQkJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogbWFwIHRoZXNlIGJ1ZmZlcnMgKHY0bF9idWZmZXJzW2ldKSAqLwotCQltYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgem9yYW5fbWFwcGluZyksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1hcCkgewotCQkJcmVzID0gLUVOT01FTTsKLQkJCWdvdG8gdjRsX21tYXBfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQkJbWFwLT5maWxlID0gZmlsZTsKLQkJbWFwLT5jb3VudCA9IDE7Ci0KLQkJdm1hLT52bV9vcHMgPSAmem9yYW5fdm1fb3BzOwotCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQ7Ci0JCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOwotCi0JCWZvciAoaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewotCQkJdG9kbyA9IHNpemU7Ci0JCQlpZiAodG9kbyA+IGZoLT52NGxfYnVmZmVycy5idWZmZXJfc2l6ZSkKLQkJCQl0b2RvID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOwotCQkJcGFnZSA9IGZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0uZmJ1ZmZlcl9waHlzOwotCQkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlID4+IFBBR0VfU0hJRlQsCi0JCQkJCQkJdG9kbywgUEFHRV9TSEFSRUQpKSB7Ci0JCQkJZHByaW50aygxLAotCQkJCQlLRVJOX0VSUgotCQkJCQkiJXM6IHpvcmFuX21tYXAoVjRMKWkgLSByZW1hcF9wZm5fcmFuZ2UgZmFpbGVkXG4iLAotCQkJCQlaUl9ERVZOQU1FKHpyKSk7Ci0JCQkJcmVzID0gLUVBR0FJTjsKLQkJCQlnb3RvIHY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQkJc2l6ZSAtPSB0b2RvOwotCQkJc3RhcnQgKz0gdG9kbzsKLQkJCWZoLT52NGxfYnVmZmVycy5idWZmZXJbaV0ubWFwID0gbWFwOwotCQkJaWYgKHNpemUgPT0gMCkKLQkJCQlicmVhazsKLQkJfQotCXY0bF9tbWFwX3VubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRwcmludGsoMSwKLQkJCUtFUk5fRVJSCi0JCQkiJXM6IHpvcmFuX21tYXAoKSAtIGludGVybmFsIGVycm9yIC0gdW5rbm93biBtYXAgbW9kZSAlZFxuIiwKLQkJCVpSX0RFVk5BTUUoenIpLCBmaC0+bWFwX21vZGUpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgem9yYW5fZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHpvcmFuX29wZW4sCi0JLnJlbGVhc2UgPSB6b3Jhbl9jbG9zZSwKLQkuaW9jdGwgPSB6b3Jhbl9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKLSNlbmRpZgotCS5sbHNlZWsgPSBub19sbHNlZWssCi0JLnJlYWQgPSB6b3Jhbl9yZWFkLAotCS53cml0ZSA9IHpvcmFuX3dyaXRlLAotCS5tbWFwID0gem9yYW5fbW1hcCwKLQkucG9sbCA9IHpvcmFuX3BvbGwsCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIHpvcmFuX3RlbXBsYXRlIF9fZGV2aW5pdGRhdGEgPSB7Ci0JLm5hbWUgPSBaT1JBTl9OQU1FLAotCS5mb3BzID0gJnpvcmFuX2ZvcHMsCi0JLnJlbGVhc2UgPSAmem9yYW5fdmRldl9yZWxlYXNlLAotCS5taW5vciA9IC0xCi19OwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzY0eHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCmluZGV4IDE4ZDFjNGIuLjdjZGFjOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCkBAIC01Miw3ICs1Miw3IEBACiAKIAogLyogRGVidWcgbWFjcm8gKi8KLSNkZWZpbmUgREJHKHguLi4pIGlmIChkZWJ1ZykgaW5mbyh4KQorI2RlZmluZSBEQkcoeC4uLikgaWYgKGRlYnVnKSBwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FIHgpCiAKIAogLyogSW5pdCBtZXRob2RzLCBuZWVkIHRvIGZpbmQgbmljZXIgbmFtZXMgZm9yIHRoZXNlCkBAIC0xMTYsNiArMTE2LDcgQEAKIAlpbnQgaGVpZ2h0OwogCWludCBtZXRob2Q7CiAJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IHVzZXJzOwogfTsKIAogCkBAIC0xMjcsNyArMTI4LDcgQEAKIAogCXVuc2lnbmVkIGNoYXIgKnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cmFuc2Zlcl9idWZmZXIpIHsKLQkJaW5mbygia21hbGxvYyglZCkgZmFpbGVkIiwgc2l6ZSk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImttYWxsb2MoJWQpIGZhaWxlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQzLDcgKzE0NCw4IEBACiAJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKIAogCWlmIChzdGF0dXMgPCAwKQotCQlpbmZvKCJGYWlsZWQgc2VuZGluZyBjb250cm9sIG1lc3NhZ2UsIGVycm9yICVkLiIsIHN0YXR1cyk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCSJGYWlsZWQgc2VuZGluZyBjb250cm9sIG1lc3NhZ2UsIGVycm9yICVkLlxuIiwgc3RhdHVzKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zMDMsMTEgKzMwNSwxMSBAQAogCQlEQkcoImJ1ZmZlciA6ICVkICVkIiwgY2FtLT5idWZmZXJbMF0sIGNhbS0+YnVmZmVyWzFdKTsKIAkJREJHKCJidWxrIDogbj0lZCBzaXplPSVkIiwgbiwgYWN0dWFsX2xlbmd0aCk7CiAJCWlmIChuIDwgMCkgewotCQkJaW5mbygiZXJyb3IgcmVhZGluZyBidWxrIG1zZyIpOworCQkJZGV2X2VycigmY2FtLT51ZGV2LT5kZXYsICJlcnJvciByZWFkaW5nIGJ1bGsgbXNnXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmIChhY3R1YWxfbGVuZ3RoIDwgMCB8fCBhY3R1YWxfbGVuZ3RoID4gQlVGRkVSX1NJWkUpIHsKLQkJCWluZm8oIndyb25nIG51bWJlciBvZiBieXRlcyIpOworCQkJZGV2X2VycigmY2FtLT51ZGV2LT5kZXYsICJ3cm9uZyBudW1iZXIgb2YgYnl0ZXNcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNjQxLDQyICs2NDMsNDcgQEAKIAogCURCRygienIzNjR4eF9vcGVuIik7CiAKLQljYW0tPnNraXAgPSAyOworCW11dGV4X2xvY2soJmNhbS0+bG9jayk7CiAKLQllcnIgPSB2aWRlb19leGNsdXNpdmVfb3Blbihpbm9kZSwgZmlsZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKGNhbS0+dXNlcnMpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAoIWNhbS0+ZnJhbWVidWYpIHsKIAkJY2FtLT5mcmFtZWJ1ZiA9IHZtYWxsb2NfMzIoTUFYX0ZSQU1FX1NJWkUgKiBGUkFNRVMpOwogCQlpZiAoIWNhbS0+ZnJhbWVidWYpIHsKLQkJCWluZm8oInZtYWxsb2NfMzIgZmFpbGVkISIpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlkZXZfZXJyKCZjYW0tPnVkZXYtPmRldiwgInZtYWxsb2NfMzIgZmFpbGVkIVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQltdXRleF9sb2NrKCZjYW0tPmxvY2spOwogCWZvciAoaSA9IDA7IGluaXRbY2FtLT5tZXRob2RdW2ldLnNpemUgIT0gLTE7IGkrKykgewogCQllcnIgPQogCQkgICAgc2VuZF9jb250cm9sX21zZyh1ZGV2LCAxLCBpbml0W2NhbS0+bWV0aG9kXVtpXS52YWx1ZSwKIAkJCQkgICAgIDAsIGluaXRbY2FtLT5tZXRob2RdW2ldLmJ5dGVzLAogCQkJCSAgICAgaW5pdFtjYW0tPm1ldGhvZF1baV0uc2l6ZSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlpbmZvKCJlcnJvciBkdXJpbmcgb3BlbiBzZXF1ZW5jZTogJWQiLCBpKTsKLQkJCW11dGV4X3VubG9jaygmY2FtLT5sb2NrKTsKLQkJCXJldHVybiBlcnI7CisJCQlkZXZfZXJyKCZjYW0tPnVkZXYtPmRldiwKKwkJCQkiZXJyb3IgZHVyaW5nIG9wZW4gc2VxdWVuY2U6ICVkXG4iLCBpKTsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCisJY2FtLT5za2lwID0gMjsKKwljYW0tPnVzZXJzKys7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKIAogCS8qIEFkZGVkIHNvbWUgZGVsYXkgaGVyZSwgc2luY2Ugb3BlbmluZy9jbG9zaW5nIHRoZSBjYW1lcmEgcXVpY2tseSwKIAkgKiBsaWtlIEVraWdhIGRvZXMgZHVyaW5nIGl0cyBzdGFydHVwLCBjYW4gY3Jhc2ggdGhlIHdlYmNhbQogCSAqLwogCW1kZWxheSgxMDApOworCWVyciA9IDA7CiAKK291dDoKIAltdXRleF91bmxvY2soJmNhbS0+bG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogCkBAIC02OTcsMjggKzcwNCwzMCBAQAogCXVkZXYgPSBjYW0tPnVkZXY7CiAKIAltdXRleF9sb2NrKCZjYW0tPmxvY2spOworCisJY2FtLT51c2Vycy0tOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCWVyciA9CiAJCSAgICBzZW5kX2NvbnRyb2xfbXNnKHVkZXYsIDEsIGluaXRbY2FtLT5tZXRob2RdW2ldLnZhbHVlLAogCQkJCSAgICAgMCwgaW5pdFtpXVtjYW0tPm1ldGhvZF0uYnl0ZXMsCiAJCQkJICAgICBpbml0W2NhbS0+bWV0aG9kXVtpXS5zaXplKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWluZm8oImVycm9yIGR1cmluZyByZWxlYXNlIHNlcXVlbmNlIik7Ci0JCQltdXRleF91bmxvY2soJmNhbS0+bG9jayk7Ci0JCQlyZXR1cm4gZXJyOworCQkJZGV2X2VycigmdWRldi0+ZGV2LCAiZXJyb3IgZHVyaW5nIHJlbGVhc2Ugc2VxdWVuY2VcbiIpOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKLQogCS8qIEFkZGVkIHNvbWUgZGVsYXkgaGVyZSwgc2luY2Ugb3BlbmluZy9jbG9zaW5nIHRoZSBjYW1lcmEgcXVpY2tseSwKIAkgKiBsaWtlIEVraWdhIGRvZXMgZHVyaW5nIGl0cyBzdGFydHVwLCBjYW4gY3Jhc2ggdGhlIHdlYmNhbQogCSAqLwogCW1kZWxheSgxMDApOworCWVyciA9IDA7CiAKK291dDoKIAltdXRleF91bmxvY2soJmNhbS0+bG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogCkBAIC04MDEsMTMgKzgxMCwxNCBAQAogCiAJREJHKCJwcm9iaW5nLi4uIik7CiAKLQlpbmZvKERSSVZFUl9ERVNDICIgY29tcGF0aWJsZSB3ZWJjYW0gcGx1Z2dlZCIpOwotCWluZm8oIm1vZGVsICUwNHg6JTA0eCBkZXRlY3RlZCIsIHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCi0JICAgICB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJZGV2X2luZm8oJmludGYtPmRldiwgRFJJVkVSX0RFU0MgIiBjb21wYXRpYmxlIHdlYmNhbSBwbHVnZ2VkXG4iKTsKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAibW9kZWwgJTA0eDolMDR4IGRldGVjdGVkXG4iLAorCQkgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCiAJY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpyMzY0eHhfY2FtZXJhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNhbSA9PSBOVUxMKSB7Ci0JCWluZm8oImNhbTogb3V0IG9mIG1lbW9yeSAhIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImNhbTogb3V0IG9mIG1lbW9yeSAhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCS8qIHNhdmUgdGhlIGluaXQgbWV0aG9kIHVzZWQgYnkgdGhpcyBjYW1lcmEgKi8KQEAgLTgxNSw3ICs4MjUsNyBAQAogCiAJY2FtLT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKGNhbS0+dmRldiA9PSBOVUxMKSB7Ci0JCWluZm8oImNhbS0+dmRldjogb3V0IG9mIG1lbW9yeSAhIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImNhbS0+dmRldjogb3V0IG9mIG1lbW9yeSAhXG4iKTsKIAkJa2ZyZWUoY2FtKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtODI3LDcgKzgzNyw3IEBACiAJY2FtLT51ZGV2ID0gdWRldjsKIAogCWlmICgoY2FtLT5idWZmZXIgPSBrbWFsbG9jKEJVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlpbmZvKCJjYW0tPmJ1ZmZlcjogb3V0IG9mIG1lbW9yeSAhIik7CisJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsICJjYW0tPmJ1ZmZlcjogb3V0IG9mIG1lbW9yeSAhXG4iKTsKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoY2FtLT52ZGV2KTsKIAkJa2ZyZWUoY2FtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC04MzUsMTcgKzg0NSwxNyBAQAogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSAxOgotCQlpbmZvKCIxNjB4MTIwIG1vZGUgc2VsZWN0ZWQiKTsKKwkJZGV2X2luZm8oJnVkZXYtPmRldiwgIjE2MHgxMjAgbW9kZSBzZWxlY3RlZFxuIik7CiAJCWNhbS0+d2lkdGggPSAxNjA7CiAJCWNhbS0+aGVpZ2h0ID0gMTIwOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCWluZm8oIjY0MHg0ODAgbW9kZSBzZWxlY3RlZCIpOworCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiNjQweDQ4MCBtb2RlIHNlbGVjdGVkXG4iKTsKIAkJY2FtLT53aWR0aCA9IDY0MDsKIAkJY2FtLT5oZWlnaHQgPSA0ODA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWluZm8oIjMyMHgyNDAgbW9kZSBzZWxlY3RlZCIpOworCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiMzIweDI0MCBtb2RlIHNlbGVjdGVkXG4iKTsKIAkJY2FtLT53aWR0aCA9IDMyMDsKIAkJY2FtLT5oZWlnaHQgPSAyNDA7CiAJCWJyZWFrOwpAQCAtODY1LDcgKzg3NSw3IEBACiAKIAllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoY2FtLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CiAJaWYgKGVycikgewotCQlpbmZvKCJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkIik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiIpOwogCQl2aWRlb19kZXZpY2VfcmVsZWFzZShjYW0tPnZkZXYpOwogCQlrZnJlZShjYW0tPmJ1ZmZlcik7CiAJCWtmcmVlKGNhbSk7CkBAIC04NzQsNyArODg0LDggQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKIAotCWluZm8oRFJJVkVSX0RFU0MgIiBjb250cm9sbGluZyB2aWRlbyBkZXZpY2UgJWQiLCBjYW0tPnZkZXYtPm1pbm9yKTsKKwlkZXZfaW5mbygmdWRldi0+ZGV2LCBEUklWRVJfREVTQyAiIGNvbnRyb2xsaW5nIHZpZGVvIGRldmljZSAlZFxuIiwKKwkJIGNhbS0+dmRldi0+bWlub3IpOwogCXJldHVybiAwOwogfQogCkBAIC04ODQsNyArODk1LDcgQEAKIAlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlkZXZfc2V0X2RydmRhdGEoJmludGYtPmRldiwgTlVMTCk7Ci0JaW5mbyhEUklWRVJfREVTQyAiIHdlYmNhbSB1bnBsdWdnZWQiKTsKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCBEUklWRVJfREVTQyAiIHdlYmNhbSB1bnBsdWdnZWRcbiIpOwogCWlmIChjYW0tPnZkZXYpCiAJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+dmRldik7CiAJY2FtLT52ZGV2ID0gTlVMTDsKQEAgLTkxMywxNiArOTI0LDE2IEBACiAJaW50IHJldHZhbDsKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnpyMzY0eHhfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQotCQlpbmZvKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkISIpOworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogdXNiX3JlZ2lzdGVyIGZhaWxlZCFcbiIpOwogCWVsc2UKLQkJaW5mbyhEUklWRVJfREVTQyAiIG1vZHVsZSBsb2FkZWQiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9ERVNDICJcbiIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIAogc3RhdGljIHZvaWQgX19leGl0IHpyMzY0eHhfZXhpdCh2b2lkKQogewotCWluZm8oRFJJVkVSX0RFU0MgIiBtb2R1bGUgdW5sb2FkZWQiKTsKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX0RFU0MgIiBtb2R1bGUgdW5sb2FkZWRcbiIpOwogCXVzYl9kZXJlZ2lzdGVyKCZ6cjM2NHh4X2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKaW5kZXggYTM4MDA1MC4uY2VhNDY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKQEAgLTE4NSw3ICsxODUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNsYXNzIG1lbXN0aWNrX2hvc3RfY2xhc3MgPSB7Ci0JLm5hbWUgICAgICAgPSAibWVtc3RpY2tfaG9zdCIsCisJLm5hbWUgICAgICAgID0gIm1lbXN0aWNrX2hvc3QiLAogCS5kZXZfcmVsZWFzZSA9IG1lbXN0aWNrX2ZyZWUKIH07CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogICogQHNnIC0gVFBDIGFyZ3VtZW50CiAgKi8KIHZvaWQgbWVtc3RpY2tfaW5pdF9yZXFfc2coc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKm1ycSwgdW5zaWduZWQgY2hhciB0cGMsCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCisJCQkgIGNvbnN0IHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCiB7CiAJbXJxLT50cGMgPSB0cGM7CiAJaWYgKHRwYyAmIDgpCkBAIC0yOTQsNyArMjk0LDcgQEAKICAqIHVzZXIgc3VwcGxpZWQgYnVmZmVyLgogICovCiB2b2lkIG1lbXN0aWNrX2luaXRfcmVxKHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICptcnEsIHVuc2lnbmVkIGNoYXIgdHBjLAotCQkgICAgICAgdm9pZCAqYnVmLCBzaXplX3QgbGVuZ3RoKQorCQkgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuZ3RoKQogewogCW1ycS0+dHBjID0gdHBjOwogCWlmICh0cGMgJiA4KQpAQCAtNDM5LDcgKzQzOSw3IEBACiAJaWYgKCFob3N0LT5jYXJkKSB7CiAJCWlmIChtZW1zdGlja19wb3dlcl9vbihob3N0KSkKIAkJCWdvdG8gb3V0X3Bvd2VyX29mZjsKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKGhvc3QtPmNhcmQtPnN0b3ApCiAJCWhvc3QtPmNhcmQtPnN0b3AoaG9zdC0+Y2FyZCk7CiAKIAljYXJkID0gbWVtc3RpY2tfYWxsb2NfY2FyZChob3N0KTsKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCQkJICAgIHx8ICEoaG9zdC0+Y2FyZC0+Y2hlY2soaG9zdC0+Y2FyZCkpKSB7CiAJCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmhvc3QtPmNhcmQtPmRldik7CiAJCQkJaG9zdC0+Y2FyZCA9IE5VTEw7Ci0JCQl9IGVsc2UKKwkJCX0gZWxzZSBpZiAoaG9zdC0+Y2FyZC0+c3RhcnQpCiAJCQkJaG9zdC0+Y2FyZC0+c3RhcnQoaG9zdC0+Y2FyZCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwppbmRleCA0NGIxODE3Li42ZTI5MWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwpAQCAtMzAsNiArMzAsOCBAQAogI2RlZmluZSBNU1BST19CTE9DS19TSUdOQVRVUkUgICAgICAgIDB4YTVjMwogI2RlZmluZSBNU1BST19CTE9DS19NQVhfQVRUUklCVVRFUyAgIDQxCiAKKyNkZWZpbmUgTVNQUk9fQkxPQ0tfUEFSVF9TSElGVCAzCisKIGVudW0gewogCU1TUFJPX0JMT0NLX0lEX1NZU0lORk8gICAgICAgICA9IDB4MTAsCiAJTVNQUk9fQkxPQ0tfSURfTU9ERUxOQU1FICAgICAgID0gMHgxNSwKQEAgLTE5NSw3ICsxOTcsNyBAQAogc3RhdGljIGludCBtc3Byb19ibG9ja19kaXNrX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IGRpc2stPnByaXZhdGVfZGF0YTsKLQlpbnQgZGlza19pZCA9IGRpc2stPmZpcnN0X21pbm9yID4+IE1FTVNUSUNLX1BBUlRfU0hJRlQ7CisJaW50IGRpc2tfaWQgPSBNSU5PUihkaXNrX2RldnQoZGlzaykpID4+IE1TUFJPX0JMT0NLX1BBUlRfU0hJRlQ7CiAKIAltdXRleF9sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOwogCkBAIC04MjYsNyArODI4LDcgQEAKIAogCWlmIChtc2ItPmVqZWN0KSB7CiAJCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkKLQkJCWVuZF9xdWV1ZWRfcmVxdWVzdChyZXEsIC1FTk9ERVYpOworCQkJX19ibGtfZW5kX3JlcXVlc3QocmVxLCAtRU5PREVWLCBibGtfcnFfYnl0ZXMocmVxKSk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTg3Nyw2ICs4NzksNyBAQAogCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKIAlpbnQgcmMgPSAwOwogCit0cnlfYWdhaW46CiAJaWYgKG1zYi0+Y2FwcyAmIE1FTVNUSUNLX0NBUF9QQVI0KQogCQlyYyA9IG1zcHJvX2Jsb2NrX3NldF9pbnRlcmZhY2UoY2FyZCwgTUVNU1RJQ0tfU1lTX1BBUjQpOwogCWVsc2UKQEAgLTkzMCw2ICs5MzMsMTggQEAKIAkJcmMgPSBtZW1zdGlja19zZXRfcndfYWRkcihjYXJkKTsKIAkJaWYgKCFyYykKIAkJCXJjID0gbXNwcm9fYmxvY2tfc2V0X2ludGVyZmFjZShjYXJkLCBtc2ItPnN5c3RlbSk7CisKKwkJaWYgKCFyYykgeworCQkJbXNsZWVwKDE1MCk7CisJCQlyYyA9IG1zcHJvX2Jsb2NrX3dhaXRfZm9yX2NlZChjYXJkKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCWlmIChtc2ItPmNhcHMgJiBNRU1TVElDS19DQVBfUEFSOCkgeworCQkJCW1zYi0+Y2FwcyAmPSB+TUVNU1RJQ0tfQ0FQX1BBUjg7CisJCQkJZ290byB0cnlfYWdhaW47CisJCQl9CisJCX0KIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMTExNywxNCArMTEzMiwxNiBAQAogCQlyZXR1cm4gLUVJTzsKIAogCW1zYi0+Y2FwcyA9IGhvc3QtPmNhcHM7CisKKwltc2xlZXAoMTUwKTsKKwlyYyA9IG1zcHJvX2Jsb2NrX3dhaXRfZm9yX2NlZChjYXJkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwogCXJjID0gbXNwcm9fYmxvY2tfc3dpdGNoX2ludGVyZmFjZShjYXJkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCW1zbGVlcCgyMDApOwotCXJjID0gbXNwcm9fYmxvY2tfd2FpdF9mb3JfY2VkKGNhcmQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwogCWRldl9kYmcoJmNhcmQtPmRldiwgImNhcmQgYWN0aXZhdGVkXG4iKTsKIAlpZiAobXNiLT5zeXN0ZW0gIT0gTUVNU1RJQ0tfU1lTX1NFUklBTCkKIAkJbXNiLT5jYXBzIHw9IE1FTVNUSUNLX0NBUF9BVVRPX0dFVF9JTlQ7CkBAIC0xMTkyLDEyICsxMjA5LDEyIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAoKGRpc2tfaWQgPDwgTUVNU1RJQ0tfUEFSVF9TSElGVCkgPiAyNTUpIHsKKwlpZiAoKGRpc2tfaWQgPDwgTVNQUk9fQkxPQ0tfUEFSVF9TSElGVCkgPiAyNTUpIHsKIAkJcmMgPSAtRU5PU1BDOwogCQlnb3RvIG91dF9yZWxlYXNlX2lkOwogCX0KIAotCW1zYi0+ZGlzayA9IGFsbG9jX2Rpc2soMSA8PCBNRU1TVElDS19QQVJUX1NISUZUKTsKKwltc2ItPmRpc2sgPSBhbGxvY19kaXNrKDEgPDwgTVNQUk9fQkxPQ0tfUEFSVF9TSElGVCk7CiAJaWYgKCFtc2ItPmRpc2spIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9yZWxlYXNlX2lkOwpAQCAtMTIyMCw3ICsxMjM3LDcgQEAKIAkJCQkgICBNU1BST19CTE9DS19NQVhfUEFHRVMgKiBtc2ItPnBhZ2Vfc2l6ZSk7CiAKIAltc2ItPmRpc2stPm1ham9yID0gbWFqb3I7Ci0JbXNiLT5kaXNrLT5maXJzdF9taW5vciA9IGRpc2tfaWQgPDwgTUVNU1RJQ0tfUEFSVF9TSElGVDsKKwltc2ItPmRpc2stPmZpcnN0X21pbm9yID0gZGlza19pZCA8PCBNU1BST19CTE9DS19QQVJUX1NISUZUOwogCW1zYi0+ZGlzay0+Zm9wcyA9ICZtc19ibG9ja19iZG9wczsKIAltc2ItPnVzYWdlX2NvdW50ID0gMTsKIAltc2ItPmRpc2stPnByaXZhdGVfZGF0YSA9IG1zYjsKQEAgLTE0MTYsNyArMTQzMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWVtc3RpY2tfZGV2aWNlX2lkIG1zcHJvX2Jsb2NrX2lkX3RibFtdID0gewogCXtNRU1TVElDS19NQVRDSF9BTEwsIE1FTVNUSUNLX1RZUEVfUFJPLCBNRU1TVElDS19DQVRFR09SWV9TVE9SQUdFX0RVTywKLQkgTUVNU1RJQ0tfQ0xBU1NfR0VORVJJQ19EVU99LAorCSBNRU1TVElDS19DTEFTU19EVU99LAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2hvc3Qvam1iMzh4X21zLmMgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3Qvam1iMzh4X21zLmMKaW5kZXggMzQ4NWM2My4uMmZiOTVhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9qbWIzOHhfbXMuYwpAQCAtODEsNiArODEsOCBAQAogI2RlZmluZSBUUENfQ09ERV9TWl9NQVNLICAgICAgIDB4MDAwMDA3MDAKICNkZWZpbmUgVFBDX0RBVEFfU1pfTUFTSyAgICAgICAweDAwMDAwMDA3CiAKKyNkZWZpbmUgSE9TVF9DT05UUk9MX1RERUxBWV9FTiAweDAwMDQwMDAwCisjZGVmaW5lIEhPU1RfQ09OVFJPTF9IV19PQ19QICAgMHgwMDAxMDAwMAogI2RlZmluZSBIT1NUX0NPTlRST0xfUkVTRVRfUkVRIDB4MDAwMDgwMDAKICNkZWZpbmUgSE9TVF9DT05UUk9MX1JFSSAgICAgICAweDAwMDA0MDAwCiAjZGVmaW5lIEhPU1RfQ09OVFJPTF9MRUQgICAgICAgMHgwMDAwMDQwMApAQCAtODgsNiArOTAsNyBAQAogI2RlZmluZSBIT1NUX0NPTlRST0xfUkVTRVQgICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgSE9TVF9DT05UUk9MX1BPV0VSX0VOICAweDAwMDAwMDgwCiAjZGVmaW5lIEhPU1RfQ09OVFJPTF9DTE9DS19FTiAgMHgwMDAwMDA0MAorI2RlZmluZSBIT1NUX0NPTlRST0xfUkVPICAgICAgIDB4MDAwMDAwMDgKICNkZWZpbmUgSE9TVF9DT05UUk9MX0lGX1NISUZUICA0CiAKICNkZWZpbmUgSE9TVF9DT05UUk9MX0lGX1NFUklBTCAweDAKQEAgLTEzMywxMSArMTM2LDE1IEBACiAjZGVmaW5lIFBBRF9QVV9QRF9PTl9NU19TT0NLMSAweDBmMGYwMDAwCiAKICNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF80ME1IWiAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF81ME1IWiAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF81ME1IWiAgIDB4MDAwMDAwMGEKICNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF82ME1IWiAgIDB4MDAwMDAwMDgKICNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF82Ml81TUhaIDB4MDAwMDAwMGMKICNkZWZpbmUgQ0xPQ0tfQ09OVFJPTF9PRkYgICAgIDB4MDAwMDAwMDAKIAorI2RlZmluZSBQQ0lfQ1RMX0NMT0NLX0RMWV9BRERSICAgMHgwMDAwMDBiMAorI2RlZmluZSBQQ0lfQ1RMX0NMT0NLX0RMWV9NQVNLX0EgMHgwMDAwMGYwMAorI2RlZmluZSBQQ0lfQ1RMX0NMT0NLX0RMWV9NQVNLX0IgMHgwMDAwZjAwMAorCiBlbnVtIHsKIAlDTURfUkVBRFkgICAgPSAweDAxLAogCUZJRk9fUkVBRFkgICA9IDB4MDIsCkBAIC0zNjcsOCArMzc0LDcgQEAKIAkJcmV0dXJuIGhvc3QtPnJlcS0+ZXJyb3I7CiAJfQogCi0JZGV2X2RiZygmbXNoLT5kZXYsICJjb250cm9sICUwOHhcbiIsCi0JCXJlYWRsKGhvc3QtPmFkZHIgKyBIT1NUX0NPTlRST0wpKTsKKwlkZXZfZGJnKCZtc2gtPmRldiwgImNvbnRyb2wgJTA4eFxuIiwgcmVhZGwoaG9zdC0+YWRkciArIEhPU1RfQ09OVFJPTCkpOwogCWRldl9kYmcoJm1zaC0+ZGV2LCAic3RhdHVzICUwOHhcbiIsIHJlYWRsKGhvc3QtPmFkZHIgKyBJTlRfU1RBVFVTKSk7CiAJZGV2X2RiZygmbXNoLT5kZXYsICJoc3RhdHVzICUwOHhcbiIsIHJlYWRsKGhvc3QtPmFkZHIgKyBTVEFUVVMpKTsKIApAQCAtNjM3LDcgKzY0Myw3IEBACiAJCW5kZWxheSgyMCk7CiAJfQogCWRldl9kYmcoJmhvc3QtPmNoaXAtPnBkZXYtPmRldiwgInJlc2V0X3JlcSB0aW1lb3V0XG4iKTsKLQlyZXR1cm4gLUVJTzsKKwkvKiByZXR1cm4gLUVJTzsgKi8KIAogcmVzZXRfbmV4dDoKIAl3cml0ZWwoSE9TVF9DT05UUk9MX1JFU0VUIHwgSE9TVF9DT05UUk9MX0NMT0NLX0VOCkBAIC02ODAsNyArNjg2LDkgQEAKIAogCQkJaG9zdF9jdGwgPSA3OwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX1BPV0VSX0VOCi0JCQkJIHwgSE9TVF9DT05UUk9MX0NMT0NLX0VOOworCQkJCSAgICB8IEhPU1RfQ09OVFJPTF9DTE9DS19FTgorCQkJCSAgICB8IEhPU1RfQ09OVFJPTF9IV19PQ19QCisJCQkJICAgIHwgSE9TVF9DT05UUk9MX1RERUxBWV9FTjsKIAkJCXdyaXRlbChob3N0X2N0bCwgaG9zdC0+YWRkciArIEhPU1RfQ09OVFJPTCk7CiAKIAkJCXdyaXRlbChob3N0LT5pZCA/IFBBRF9QVV9QRF9PTl9NU19TT0NLMQpAQCAtNzA0LDMzICs3MTIsNDAgQEAKIAkJYnJlYWs7CiAJY2FzZSBNRU1TVElDS19JTlRFUkZBQ0U6CiAJCWhvc3RfY3RsICY9IH4oMyA8PCBIT1NUX0NPTlRST0xfSUZfU0hJRlQpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaG9zdC0+Y2hpcC0+cGRldiwKKwkJCQkgICAgICBQQ0lfQ1RMX0NMT0NLX0RMWV9BRERSLAorCQkJCSAgICAgICZjbG9ja19kZWxheSk7CisJCWNsb2NrX2RlbGF5ICY9IGhvc3QtPmlkID8gflBDSV9DVExfQ0xPQ0tfRExZX01BU0tfQgorCQkJCQk6IH5QQ0lfQ1RMX0NMT0NLX0RMWV9NQVNLX0E7CiAKIAkJaWYgKHZhbHVlID09IE1FTVNUSUNLX1NFUklBTCkgewogCQkJaG9zdF9jdGwgJj0gfkhPU1RfQ09OVFJPTF9GQVNUX0NMSzsKKwkJCWhvc3RfY3RsICY9IH5IT1NUX0NPTlRST0xfUkVPOwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX0lGX1NFUklBTAogCQkJCSAgICA8PCBIT1NUX0NPTlRST0xfSUZfU0hJRlQ7CiAJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfUkVJOwogCQkJY2xvY2tfY3RsID0gQ0xPQ0tfQ09OVFJPTF80ME1IWjsKLQkJCWNsb2NrX2RlbGF5ID0gMDsKIAkJfSBlbHNlIGlmICh2YWx1ZSA9PSBNRU1TVElDS19QQVI0KSB7Ci0JCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfRkFTVF9DTEs7CisJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfRkFTVF9DTEsgfCBIT1NUX0NPTlRST0xfUkVPOwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX0lGX1BBUjQKIAkJCQkgICAgPDwgSE9TVF9DT05UUk9MX0lGX1NISUZUOwogCQkJaG9zdF9jdGwgJj0gfkhPU1RfQ09OVFJPTF9SRUk7CiAJCQljbG9ja19jdGwgPSBDTE9DS19DT05UUk9MXzQwTUhaOwotCQkJY2xvY2tfZGVsYXkgPSA0OworCQkJY2xvY2tfZGVsYXkgfD0gaG9zdC0+aWQgPyAoNCA8PCAxMikgOiAoNCA8PCA4KTsKIAkJfSBlbHNlIGlmICh2YWx1ZSA9PSBNRU1TVElDS19QQVI4KSB7CiAJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfRkFTVF9DTEs7CiAJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfSUZfUEFSOAogCQkJCSAgICA8PCBIT1NUX0NPTlRST0xfSUZfU0hJRlQ7Ci0JCQlob3N0X2N0bCAmPSB+SE9TVF9DT05UUk9MX1JFSTsKLQkJCWNsb2NrX2N0bCA9IENMT0NLX0NPTlRST0xfNjBNSFo7Ci0JCQljbG9ja19kZWxheSA9IDA7CisJCQlob3N0X2N0bCAmPSB+KEhPU1RfQ09OVFJPTF9SRUkgfCBIT1NUX0NPTlRST0xfUkVPKTsKKwkJCWNsb2NrX2N0bCA9IENMT0NLX0NPTlRST0xfNTBNSFo7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJd3JpdGVsKGhvc3RfY3RsLCBob3N0LT5hZGRyICsgSE9TVF9DT05UUk9MKTsKIAkJd3JpdGVsKGNsb2NrX2N0bCwgaG9zdC0+YWRkciArIENMT0NLX0NPTlRST0wpOwotCQl3cml0ZWwoY2xvY2tfZGVsYXksIGhvc3QtPmFkZHIgKyBDTE9DS19ERUxBWSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoaG9zdC0+Y2hpcC0+cGRldiwKKwkJCQkgICAgICAgUENJX0NUTF9DTE9DS19ETFlfQUREUiwKKwkJCQkgICAgICAgY2xvY2tfZGVsYXkpOwogCQlicmVhazsKIAl9OwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vTWFrZWZpbGUKaW5kZXggMmMyZTM5YS4uYjA5ODJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogIyBJbiB0aGUgZnV0dXJlLCBzb21lIG9mIHRoZXNlIHNob3VsZCBiZSBidWlsdCBjb25kaXRpb25hbGx5LgogIwogCi1pMm9fY29yZS15CQkrPSBpb3AubyBkcml2ZXIubyBkZXZpY2UubyBkZWJ1Zy5vIHBjaS5vIGV4ZWMtb3NtLm8KK2kyb19jb3JlLXkJCSs9IGlvcC5vIGRyaXZlci5vIGRldmljZS5vIGRlYnVnLm8gcGNpLm8gZXhlYy1vc20ubyBtZW1vcnkubwogaTJvX2J1cy15CQkrPSBidXMtb3NtLm8KIGkyb19jb25maWcteQkJKz0gY29uZmlnLW9zbS5vCiBvYmotJChDT05GSUdfSTJPKQkrPSBpMm9fY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwppbmRleCA4Nzc0YzY3Li41NGMyZTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCiAJcmVzLnZpcnQgPSBOVUxMOwogCi0JaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmcmVzLCByZXNsZW4sIEdGUF9LRVJORUwpKQorCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJnJlcywgcmVzbGVuKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwppbmRleCA2Y2JjYzIxLi41NmZhZWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0zODgsOCArMzg4LDggQEAKIAogCWRldiA9ICZjLT5wZGV2LT5kZXY7CiAKLQlpZiAoaTJvX2RtYV9yZWFsbG9jCi0JICAgIChkZXYsICZjLT5kbGN0LCBsZTMyX3RvX2NwdShzYi0+ZXhwZWN0ZWRfbGN0X3NpemUpLCBHRlBfS0VSTkVMKSkKKwlpZiAoaTJvX2RtYV9yZWFsbG9jKGRldiwgJmMtPmRsY3QsCisJCQkJCWxlMzJfdG9fY3B1KHNiLT5leHBlY3RlZF9sY3Rfc2l6ZSkpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwppbmRleCA0MjM4ZGU5Li5hM2ZhYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJaWYgKElTX0VSUihtc2cpKQogCQlyZXR1cm4gUFRSX0VSUihtc2cpOwogCi0JaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlciwgZnJhZ3NpemUsIEdGUF9LRVJORUwpKSB7CisJaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlciwgZnJhZ3NpemUpKSB7CiAJCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTMzOSw3ICszMzksNyBAQAogCWlmIChJU19FUlIobXNnKSkKIAkJcmV0dXJuIFBUUl9FUlIobXNnKTsKIAotCWlmIChpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGZyYWdzaXplLCBHRlBfS0VSTkVMKSkgeworCWlmIChpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGZyYWdzaXplKSkgewogCQlpMm9fbXNnX25vcChjLCBtc2cpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02MzQsOSArNjM0LDcgQEAKIAkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CiAJCQlwID0gJihzZ19saXN0W3NnX2luZGV4XSk7CiAJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLwotCQkJaWYgKGkyb19kbWFfYWxsb2MKLQkJCSAgICAoJmMtPnBkZXYtPmRldiwgcCwgc2dfc2l6ZSwKLQkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKSkgeworCQkJaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgcCwgc2dfc2l6ZSkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKIAkJCQkgICAgICAgYy0+bmFtZSwgc2dfc2l6ZSwgaSwgc2dfY291bnQpOwpAQCAtNzgwLDEyICs3NzgsMTEgQEAKIAl1MzIgc2l6ZSA9IDA7CiAJdTMyIHJlcGx5X3NpemUgPSAwOwogCXUzMiByY29kZSA9IDA7Ci0Jdm9pZCAqc2dfbGlzdFtTR19UQUJMRVNJWkVdOworCXN0cnVjdCBpMm9fZG1hIHNnX2xpc3RbU0dfVEFCTEVTSVpFXTsKIAl1MzIgc2dfb2Zmc2V0ID0gMDsKIAl1MzIgc2dfY291bnQgPSAwOwogCWludCBzZ19pbmRleCA9IDA7CiAJdTMyIGkgPSAwOwotCXZvaWQgKnAgPSBOVUxMOwogCWkyb19zdGF0dXNfYmxvY2sgKnNiOwogCXN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnOwogCXVuc2lnbmVkIGludCBpb3A7CkBAIC04NDIsNiArODM5LDcgQEAKIAltZW1zZXQoc2dfbGlzdCwgMCwgc2l6ZW9mKHNnX2xpc3RbMF0pICogU0dfVEFCTEVTSVpFKTsKIAlpZiAoc2dfb2Zmc2V0KSB7CiAJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CisJCXN0cnVjdCBpMm9fZG1hICpwOwogCiAJCWlmIChzZ19vZmZzZXQgKiA0ID49IHNpemUpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKQEAgLTg3MSwyMiArODY5LDIyIEBACiAJCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCQl9CiAJCQlzZ19zaXplID0gc2dbaV0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOworCQkJcCA9ICYoc2dfbGlzdFtzZ19pbmRleF0pOworCQkJaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgcCwgc2dfc2l6ZSkpIHsKIAkJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zZmVyICovCi0JCQlwID0ga21hbGxvYyhzZ19zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghcCkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlIFNHIGJ1ZmZlciAtIHNpemUgPSAlZCBidWZmZXIgbnVtYmVyICVkIG9mICVkXG4iLAogCQkJCSAgICAgICBjLT5uYW1lLCBzZ19zaXplLCBpLCBzZ19jb3VudCk7CiAJCQkJcmNvZGUgPSAtRU5PTUVNOwogCQkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQkJfQotCQkJc2dfbGlzdFtzZ19pbmRleCsrXSA9IHA7CS8vIHNnbGlzdCBpbmRleGVkIHdpdGggaW5wdXQgZnJhbWUsIG5vdCBvdXIgaW50ZXJuYWwgZnJhbWUuCisJCQlzZ19pbmRleCsrOwogCQkJLyogQ29weSBpbiB0aGUgdXNlcidzIFNHIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KIAkJCWlmIChzZ1tpXS4KIAkJCSAgICBmbGFnX2NvdW50ICYgMHgwNDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSICovICkgewogCQkJCS8vIFRPRE8gNjRiaXQgZml4CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJICAgIChwLCAodm9pZCBfX3VzZXIgKilzZ1tpXS5hZGRyX2J1cywKKwkJCQkgICAgKHAtPnZpcnQsICh2b2lkIF9fdXNlciAqKXNnW2ldLmFkZHJfYnVzLAogCQkJCSAgICAgc2dfc2l6ZSkpIHsKIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgU0cgYnVmICVkIEZST00gdXNlclxuIiwKQEAgLTg5NSw4ICs4OTMsNyBAQAogCQkJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJCQl9CiAJCQl9Ci0JCQkvL1RPRE8gNjRiaXQgZml4Ci0JCQlzZ1tpXS5hZGRyX2J1cyA9IHZpcnRfdG9fYnVzKHApOworCQkJc2dbaV0uYWRkcl9idXMgPSBwLT5waHlzOwogCQl9CiAJfQogCkBAIC05MDgsNyArOTA1LDcgQEAKIAl9CiAKIAlpZiAoc2dfb2Zmc2V0KSB7Ci0JCXUzMiBybXNnWzEyOF07CisJCXUzMiBybXNnW0kyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRV07CiAJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KIAkJdTMyIGo7CiAJCS8vIFRPRE8gNjRiaXQgZml4CkBAIC05NDIsMTEgKzkzOSwxMSBAQAogCQkJCXNnX3NpemUgPSBzZ1tqXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CiAJCQkJLy8gVE9ETyA2NGJpdCBmaXgKIAkJCQlpZiAoY29weV90b191c2VyCi0JCQkJICAgICgodm9pZCBfX3VzZXIgKilzZ1tqXS5hZGRyX2J1cywgc2dfbGlzdFtqXSwKKwkJCQkgICAgKCh2b2lkIF9fdXNlciAqKXNnW2pdLmFkZHJfYnVzLCBzZ19saXN0W2pdLnZpcnQsCiAJCQkJICAgICBzZ19zaXplKSkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5ICVwIFRPIHVzZXIgJXhcbiIsCi0JCQkJCSAgICAgICBjLT5uYW1lLCBzZ19saXN0W2pdLAorCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXS52aXJ0LAogCQkJCQkgICAgICAgc2dbal0uYWRkcl9idXMpOwogCQkJCQlyY29kZSA9IC1FRkFVTFQ7CiAJCQkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwpAQCAtOTczLDcgKzk3MCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNnX2luZGV4OyBpKyspCi0JCWtmcmVlKHNnX2xpc3RbaV0pOworCQlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJnNnX2xpc3RbaV0pOwogCiBjbGVhbnVwOgogCWtmcmVlKHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCmluZGV4IGRhNzE1ZTEuLmJlMmI1OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKIAogCQlzaXplID0gaHJ0LT5udW1fZW50cmllcyAqIGhydC0+ZW50cnlfbGVuIDw8IDI7CiAJCWlmIChzaXplID4gYy0+aHJ0LmxlbikgewotCQkJaWYgKGkyb19kbWFfcmVhbGxvYyhkZXYsICZjLT5ocnQsIHNpemUsIEdGUF9LRVJORUwpKQorCQkJaWYgKGkyb19kbWFfcmVhbGxvYyhkZXYsICZjLT5ocnQsIHNpemUpKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJZWxzZQogCQkJCWhydCA9IGMtPmhydC52aXJ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9tZW1vcnkuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjYzk1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vbWVtb3J5LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKglGdW5jdGlvbnMgdG8gaGFuZGxlIEkyTyBtZW1vcnkKKyAqCisgKglQdWxsZWQgZnJvbSB0aGUgaW5saW5lcyBpbiBpMm8gaGVhZGVycyBhbmQgdW5pbmxpbmVkCisgKgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNvcmUuaCIKKworLyogUHJvdGVjdHMgb3VyIDMyLzY0Yml0IG1hc2sgc3dpdGNoaW5nICovCitzdGF0aWMgREVGSU5FX01VVEVYKG1lbV9sb2NrKTsKKworLyoqCisgKglpMm9fc2dfdGFibGVzaXplIC0gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIFNHTAorICoJQGM6IEkyTyBjb250cm9sbGVyIGZvciB3aGljaCB0aGUgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGRvbmUKKyAqCUBib2R5X3NpemU6IG1heGltdW0gYm9keSBzaXplIHVzZWQgZm9yIG1lc3NhZ2UgaW4gMzItYml0IHdvcmRzLgorICoKKyAqCVJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgU0cgZWxlbWVudHMgaW4gYSBTRyBsaXN0LgorICovCit1MTYgaTJvX3NnX3RhYmxlc2l6ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUxNiBib2R5X3NpemUpCit7CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwl1MTYgc2dfY291bnQgPQorCSAgICAoc2ItPmluYm91bmRfZnJhbWVfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgaTJvX21lc3NhZ2UpIC8gNCkgLQorCSAgICBib2R5X3NpemU7CisKKwlpZiAoYy0+cGFlX3N1cHBvcnQpIHsKKwkJLyoKKwkJICogZm9yIDY0LWJpdCBhIFNHIGF0dHJpYnV0ZSBlbGVtZW50IG11c3QgYmUgYWRkZWQgYW5kIGVhY2gKKwkJICogU0cgZWxlbWVudCBuZWVkcyAxMiBieXRlcyBpbnN0ZWFkIG9mIDguCisJCSAqLworCQlzZ19jb3VudCAtPSAyOworCQlzZ19jb3VudCAvPSAzOworCX0gZWxzZQorCQlzZ19jb3VudCAvPSAyOworCisJaWYgKGMtPnNob3J0X3JlcSAmJiAoc2dfY291bnQgPiA4KSkKKwkJc2dfY291bnQgPSA4OworCisJcmV0dXJuIHNnX2NvdW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTJvX3NnX3RhYmxlc2l6ZSk7CisKKworLyoqCisgKglpMm9fZG1hX21hcF9zaW5nbGUgLSBNYXAgcG9pbnRlciB0byBjb250cm9sbGVyIGFuZCBmaWxsIGluIEkyTyBtZXNzYWdlLgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKglAcHRyOiBwb2ludGVyIHRvIHRoZSBkYXRhIHdoaWNoIHNob3VsZCBiZSBtYXBwZWQKKyAqCUBzaXplOiBzaXplIG9mIGRhdGEgaW4gYnl0ZXMKKyAqCUBkaXJlY3Rpb246IERNQV9UT19ERVZJQ0UgLyBETUFfRlJPTV9ERVZJQ0UKKyAqCUBzZ19wdHI6IHBvaW50ZXIgdG8gdGhlIFNHIGxpc3QgaW5zaWRlIHRoZSBJMk8gbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IERNQSBoYW5kbGluZyBhbmQgYWxzbyB3cml0ZXMgdGhlIEkyTworICoJU0dMIGVsZW1lbnRzIGludG8gdGhlIEkyTyBtZXNzYWdlLiBGb3IgZGV0YWlscyBvbiBETUEgaGFuZGxpbmcgc2VlIGFsc28KKyAqCWRtYV9tYXBfc2luZ2xlKCkuIFRoZSBwb2ludGVyIHNnX3B0ciB3aWxsIG9ubHkgYmUgc2V0IHRvIHRoZSBlbmQgb2YgdGhlCisgKglTRyBsaXN0IGlmIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgorICoKKyAqCVJldHVybnMgRE1BIGFkZHJlc3Mgd2hpY2ggbXVzdCBiZSBjaGVja2VkIGZvciBmYWlsdXJlcyB1c2luZworICoJZG1hX21hcHBpbmdfZXJyb3IoKS4KKyAqLworZG1hX2FkZHJfdCBpMm9fZG1hX21hcF9zaW5nbGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB2b2lkICpwdHIsCisJCQkJCSAgICBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCQkJICAgIHUzMiAqKiBzZ19wdHIpCit7CisJdTMyIHNnX2ZsYWdzOworCXUzMiAqbXB0ciA9ICpzZ19wdHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4ZDQwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4ZDAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmMtPnBkZXYtPmRldiwgcHRyLCBzaXplLCBkaXJlY3Rpb24pOworCWlmICghZG1hX21hcHBpbmdfZXJyb3IoJmMtPnBkZXYtPmRldiwgZG1hX2FkZHIpKSB7CisjaWZkZWYgQ09ORklHX0kyT19FWFRfQURBUFRFQ19ETUE2NAorCQlpZiAoKHNpemVvZihkbWFfYWRkcl90KSA+IDQpICYmIGMtPnBhZV9zdXBwb3J0KSB7CisJCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoMHg3QzAyMDAwMik7CisJCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoUEFHRV9TSVpFKTsKKwkJfQorI2VuZGlmCisKKwkJKm1wdHIrKyA9IGNwdV90b19sZTMyKHNnX2ZsYWdzIHwgc2l6ZSk7CisJCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2xvdyhkbWFfYWRkcikpOworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUNfRE1BNjQKKwkJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkKKwkJCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2hpZ2goZG1hX2FkZHIpKTsKKyNlbmRpZgorCQkqc2dfcHRyID0gbXB0cjsKKwl9CisJcmV0dXJuIGRtYV9hZGRyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTJvX2RtYV9tYXBfc2luZ2xlKTsKKworLyoqCisgKglpMm9fZG1hX21hcF9zZyAtIE1hcCBhIFNHIExpc3QgdG8gY29udHJvbGxlciBhbmQgZmlsbCBpbiBJMk8gbWVzc2FnZS4KKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoJQHNnOiBTRyBsaXN0IHRvIGJlIG1hcHBlZAorICoJQHNnX2NvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFNHIGxpc3QKKyAqCUBkaXJlY3Rpb246IERNQV9UT19ERVZJQ0UgLyBETUFfRlJPTV9ERVZJQ0UKKyAqCUBzZ19wdHI6IHBvaW50ZXIgdG8gdGhlIFNHIGxpc3QgaW5zaWRlIHRoZSBJMk8gbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IERNQSBoYW5kbGluZyBhbmQgYWxzbyB3cml0ZXMgdGhlIEkyTworICoJU0dMIGVsZW1lbnRzIGludG8gdGhlIEkyTyBtZXNzYWdlLiBGb3IgZGV0YWlscyBvbiBETUEgaGFuZGxpbmcgc2VlIGFsc28KKyAqCWRtYV9tYXBfc2coKS4gVGhlIHBvaW50ZXIgc2dfcHRyIHdpbGwgb25seSBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgU0cKKyAqCWxpc3QgaWYgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKgorICoJUmV0dXJucyAwIG9uIGZhaWx1cmUgb3IgMSBvbiBzdWNjZXNzLgorICovCitpbnQgaTJvX2RtYV9tYXBfc2coc3RydWN0IGkyb19jb250cm9sbGVyICpjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCSAgICBpbnQgc2dfY291bnQsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwgdTMyICoqIHNnX3B0cikKK3sKKwl1MzIgc2dfZmxhZ3M7CisJdTMyICptcHRyID0gKnNnX3B0cjsKKworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXNnX2NvdW50ID0gZG1hX21hcF9zZygmYy0+cGRldi0+ZGV2LCBzZywgc2dfY291bnQsIGRpcmVjdGlvbik7CisJaWYgKCFzZ19jb3VudCkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0CisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkgeworCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoMHg3QzAyMDAwMik7CisJCSptcHRyKysgPSBjcHVfdG9fbGUzMihQQUdFX1NJWkUpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKHNnX2NvdW50LS0gPiAwKSB7CisJCWlmICghc2dfY291bnQpCisJCQlzZ19mbGFncyB8PSAweEMwMDAwMDAwOworCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoc2dfZmxhZ3MgfCBzZ19kbWFfbGVuKHNnKSk7CisJCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2xvdyhzZ19kbWFfYWRkcmVzcyhzZykpKTsKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0CisJCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgYy0+cGFlX3N1cHBvcnQpCisJCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoaTJvX2RtYV9oaWdoKHNnX2RtYV9hZGRyZXNzKHNnKSkpOworI2VuZGlmCisJCXNnID0gc2dfbmV4dChzZyk7CisJfQorCSpzZ19wdHIgPSBtcHRyOworCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMm9fZG1hX21hcF9zZyk7CisKKy8qKgorICoJaTJvX2RtYV9hbGxvYyAtIEFsbG9jYXRlIERNQSBtZW1vcnkKKyAqCUBkZXY6IHN0cnVjdCBkZXZpY2UgcG9pbnRlciB0byB0aGUgUENJIGRldmljZSBvZiB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUBhZGRyOiBpMm9fZG1hIHN0cnVjdCB3aGljaCBzaG91bGQgZ2V0IHRoZSBETUEgYnVmZmVyCisgKglAbGVuOiBsZW5ndGggb2YgdGhlIG5ldyBETUEgbWVtb3J5CisgKgorICoJQWxsb2NhdGUgYSBjb2hlcmVudCBETUEgbWVtb3J5IGFuZCB3cml0ZSB0aGUgcG9pbnRlcnMgaW50byBhZGRyLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FTk9NRU0gb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkciwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlpbnQgZG1hXzY0ID0gMDsKKworCW11dGV4X2xvY2soJm1lbV9sb2NrKTsKKwlpZiAoKHNpemVvZihkbWFfYWRkcl90KSA+IDQpICYmIChwZGV2LT5kbWFfbWFzayA9PSBETUFfNjRCSVRfTUFTSykpIHsKKwkJZG1hXzY0ID0gMTsKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJCQltdXRleF91bmxvY2soJm1lbV9sb2NrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJYWRkci0+dmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGxlbiwgJmFkZHItPnBoeXMsIEdGUF9LRVJORUwpOworCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBkbWFfNjQpCisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogdW5hYmxlIHRvIHNldCA2NC1iaXQgRE1BIik7CisJbXV0ZXhfdW5sb2NrKCZtZW1fbG9jayk7CisKKwlpZiAoIWFkZHItPnZpcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGFkZHItPnZpcnQsIDAsIGxlbik7CisJYWRkci0+bGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMm9fZG1hX2FsbG9jKTsKKworCisvKioKKyAqCWkyb19kbWFfZnJlZSAtIEZyZWUgRE1BIG1lbW9yeQorICoJQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlIG9mIHRoZSBJMk8gY29udHJvbGxlcgorICoJQGFkZHI6IGkyb19kbWEgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBETUEgYnVmZmVyCisgKgorICoJRnJlZSBhIGNvaGVyZW50IERNQSBtZW1vcnkgYW5kIHNldCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYWRkciB0byBOVUxMLgorICovCit2b2lkIGkyb19kbWFfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpMm9fZG1hICphZGRyKQoreworCWlmIChhZGRyLT52aXJ0KSB7CisJCWlmIChhZGRyLT5waHlzKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBhZGRyLT5sZW4sIGFkZHItPnZpcnQsCisJCQkJCSAgYWRkci0+cGh5cyk7CisJCWVsc2UKKwkJCWtmcmVlKGFkZHItPnZpcnQpOworCQlhZGRyLT52aXJ0ID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMm9fZG1hX2ZyZWUpOworCisKKy8qKgorICoJaTJvX2RtYV9yZWFsbG9jIC0gUmVhbGxvYyBETUEgbWVtb3J5CisgKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCisgKglAYWRkcjogcG9pbnRlciB0byBhIGkyb19kbWEgc3RydWN0IERNQSBidWZmZXIKKyAqCUBsZW46IG5ldyBsZW5ndGggb2YgbWVtb3J5CisgKgorICoJSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBhbGxvY2F0ZWQgaW4gdGhlIGFkZHIsIGZyZWUgaXQgZmlyc3QuIElmIGxlbiA+IDAKKyAqCXRoYW4gdHJ5IHRvIGFsbG9jYXRlIGl0IGFuZCB3cml0ZSB0aGUgYWRkcmVzc2VzIGJhY2sgdG8gdGhlIGFkZHIKKyAqCXN0cnVjdHVyZS4gSWYgbGVuID09IDAgc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gTlVMTC4KKyAqCisgKglSZXR1cm5zIHRoZSAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RtYV9yZWFsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIsIHNpemVfdCBsZW4pCit7CisJaTJvX2RtYV9mcmVlKGRldiwgYWRkcik7CisKKwlpZiAobGVuKQorCQlyZXR1cm4gaTJvX2RtYV9hbGxvYyhkZXYsIGFkZHIsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyb19kbWFfcmVhbGxvYyk7CisKKy8qCisgKglpMm9fcG9vbF9hbGxvYyAtIEFsbG9jYXRlIGFuIHNsYWIgY2FjaGUgYW5kIG1lbXBvb2wKKyAqCUBtZW1wb29sOiBwb2ludGVyIHRvIHN0cnVjdCBpMm9fcG9vbCB0byB3cml0ZSBkYXRhIGludG8uCisgKglAbmFtZTogbmFtZSB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IGNhY2hlCisgKglAc2l6ZTogc2l6ZSBvZiBlYWNoIG9iamVjdAorICoJQG1pbl9ucjogbWluaW11bSBudW1iZXIgb2Ygb2JqZWN0cworICoKKyAqCUZpcnN0IGFsbG9jYXRlcyBhIHNsYWIgY2FjaGUgd2l0aCBuYW1lIGFuZCBzaXplLiBUaGVuIGFsbG9jYXRlcyBhCisgKgltZW1wb29sIHdoaWNoIHVzZXMgdGhlIHNsYWIgY2FjaGUgZm9yIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX3Bvb2xfYWxsb2Moc3RydWN0IGkyb19wb29sICpwb29sLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBzaXplX3Qgc2l6ZSwgaW50IG1pbl9ucikKK3sKKwlwb29sLT5uYW1lID0ga21hbGxvYyhzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wtPm5hbWUpCisJCWdvdG8gZXhpdDsKKwlzdHJjcHkocG9vbC0+bmFtZSwgbmFtZSk7CisKKwlwb29sLT5zbGFiID0KKwkgICAga21lbV9jYWNoZV9jcmVhdGUocG9vbC0+bmFtZSwgc2l6ZSwgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIXBvb2wtPnNsYWIpCisJCWdvdG8gZnJlZV9uYW1lOworCisJcG9vbC0+bWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChtaW5fbnIsIHBvb2wtPnNsYWIpOworCWlmICghcG9vbC0+bWVtcG9vbCkKKwkJZ290byBmcmVlX3NsYWI7CisKKwlyZXR1cm4gMDsKKworZnJlZV9zbGFiOgorCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5zbGFiKTsKKworZnJlZV9uYW1lOgorCWtmcmVlKHBvb2wtPm5hbWUpOworCitleGl0OgorCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTJvX3Bvb2xfYWxsb2MpOworCisvKgorICoJaTJvX3Bvb2xfZnJlZSAtIEZyZWUgc2xhYiBjYWNoZSBhbmQgbWVtcG9vbCBhZ2FpbgorICoJQG1lbXBvb2w6IHBvaW50ZXIgdG8gc3RydWN0IGkyb19wb29sIHdoaWNoIHNob3VsZCBiZSBmcmVlZAorICoKKyAqCU5vdGUgdGhhdCB5b3UgaGF2ZSB0byByZXR1cm4gYWxsIG9iamVjdHMgdG8gdGhlIG1lbXBvb2wgYWdhaW4gYmVmb3JlCisgKgljYWxsaW5nIGkyb19wb29sX2ZyZWUoKS4KKyAqLwordm9pZCBpMm9fcG9vbF9mcmVlKHN0cnVjdCBpMm9fcG9vbCAqcG9vbCkKK3sKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+bWVtcG9vbCk7CisJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPnNsYWIpOworCWtmcmVlKHBvb2wtPm5hbWUpOworfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGkyb19wb29sX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKaW5kZXggNjg1YTg5NS4uNjEwZWYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCkBAIC0xODYsMzEgKzE4NiwyOSBAQAogCQl9CiAJfQogCi0JaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzLCA4LCBHRlBfS0VSTkVMKSkgeworCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJmMtPnN0YXR1cywgOCkpIHsKIAkJaTJvX3BjaV9mcmVlKGMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5ocnQsIHNpemVvZihpMm9faHJ0KSwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5ocnQsIHNpemVvZihpMm9faHJ0KSkpIHsKIAkJaTJvX3BjaV9mcmVlKGMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5kbGN0LCA4MTkyLCBHRlBfS0VSTkVMKSkgeworCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJmMtPmRsY3QsIDgxOTIpKSB7CiAJCWkyb19wY2lfZnJlZShjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrLCBzaXplb2YoaTJvX3N0YXR1c19ibG9jayksCi0JCQkgIEdGUF9LRVJORUwpKSB7CisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrLCBzaXplb2YoaTJvX3N0YXR1c19ibG9jaykpKSB7CiAJCWkyb19wY2lfZnJlZShjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKGkyb19kbWFfYWxsb2MKLQkgICAgKGRldiwgJmMtPm91dF9xdWV1ZSwKLQkgICAgIEkyT19NQVhfT1VUQk9VTkRfTVNHX0ZSQU1FUyAqIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqCi0JICAgICBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5vdXRfcXVldWUsCisJCUkyT19NQVhfT1VUQk9VTkRfTVNHX0ZSQU1FUyAqIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqCisJCQkJc2l6ZW9mKHUzMikpKSB7CiAJCWkyb19wY2lfZnJlZShjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMTBjNDRkMy4uNWVmZjhhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC0yMSw3ICsyMSw3IEBACiAKIGNvbmZpZyBNRkRfU001MDFfR1BJTwogCWJvb2wgIkV4cG9ydCBHUElPIHZpYSBHUElPIGxheWVyIgotCWRlcGVuZHMgb24gTUZEX1NNNTAxICYmIEhBVkVfR1BJT19MSUIKKwlkZXBlbmRzIG9uIE1GRF9TTTUwMSAmJiBHUElPTElCCiAJIC0tLWhlbHAtLS0KIAkgVGhpcyBvcHRpb24gdXNlcyB0aGUgZ3BpbyBsaWJyYXJ5IGxheWVyIHRvIGV4cG9ydCB0aGUgNjQgR1BJTwogCSBsaW5lcyBvbiB0aGUgU001MDEuIFRoZSBwbGF0Zm9ybSBkYXRhIGlzIHVzZWQgdG8gc3VwcGx5IHRoZQpAQCAtMjksNyArMjksNyBAQAogCiBjb25maWcgTUZEX0FTSUMzCiAJYm9vbCAiU3VwcG9ydCBmb3IgQ29tcGFxIEFTSUMzIgotCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBIQVZFX0dQSU9fTElCICYmIEFSTQorCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBHUElPTElCICYmIEFSTQogCSAtLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQVNJQzMgbXVsdGlmdW5jdGlvbiBjaGlwIGZvdW5kIG9uIG1hbnkKIAkgIFBEQXMgKG1haW5seSBpUEFRIGFuZCBIVEMgYmFzZWQgb25lcykKQEAgLTUwLDYgKzUwLDE1IEBACiAJICBIVEMgTWFnaWNpYW4gZGV2aWNlcywgcmVzcGVjdGl2ZWx5LiBBY3R1YWwgZnVuY3Rpb25hbGl0eSBpcwogCSAgaGFuZGxlZCBieSB0aGUgbGVkcy1wYXNpYzMgYW5kIGRzMXdtIGRyaXZlcnMuCiAKK2NvbmZpZyBVQ0IxNDAwX0NPUkUKKwl0cmlzdGF0ZSAiUGhpbGlwcyBVQ0IxNDAwIENvcmUgZHJpdmVyIgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBVQ0IxNDAwIGNvcmUgZnVuY3Rpb25zLgorCSAgVGhlIFVDQjE0MDAgaXMgYW4gQUM5NyBhdWRpbyBjb2RlYy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWNiMTQwMF9jb3JlLgorCiBjb25maWcgTUZEX1RNSU8KIAlib29sCiAJZGVmYXVsdCBuCkBAIC03OCw2ICs4Nyw0NCBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFRvc2hpYmEgTW9iaWxlIElPIENvbnRyb2xsZXIgVEM2MzkzWEIKIAorY29uZmlnIE1GRF9XTTg0MDAKKwl0cmlzdGF0ZSAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NDAwIgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBXb2xmc29uIE1pY3JvZWxlY3JvbmljcyBXTTg0MDAgUE1JQyBhbmQgYXVkaW8KKwkgIENPREVDLiAgVGhpcyBkcml2ZXIgYWRkcyBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nCisJICB0aGUgZGV2aWNlLCBhZGRpdGlvbmFsIGRyaXZlcnMgbXVzdCBiZSBlbmFibGVkIGluIG9yZGVyIHRvIHVzZQorCSAgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRldmljZS4KKworY29uZmlnIE1GRF9XTTgzNTAKKwl0cmlzdGF0ZQorCitjb25maWcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV8wCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV8xCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV8yCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV8zCisJYm9vbAorCWRlcGVuZHMgb24gTUZEX1dNODM1MAorCitjb25maWcgTUZEX1dNODM1MF9JMkMKKwl0cmlzdGF0ZSAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIHdpdGggSTJDIgorCXNlbGVjdCBNRkRfV004MzUwCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBUaGUgV004MzUwIGlzIGFuIGludGVncmF0ZWQgYXVkaW8gYW5kIHBvd2VyIG1hbmFnZW1lbnQKKwkgIHN1YnN5c3RlbSB3aXRoIHdhdGNoZG9nIGFuZCBSVEMgZnVuY3Rpb25hbGl0eSBmb3IgZW1iZWRkZWQKKwkgIHN5c3RlbXMuICBUaGlzIG9wdGlvbiBlbmFibGVzIGNvcmUgc3VwcG9ydCBmb3IgdGhlIFdNODM1MCB3aXRoCisJICBJMkMgYXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlLiAgQWRkaXRpb25hbCBvcHRpb25zIG11c3QgYmUKKwkgIHNlbGVjdGVkIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY2hpcC4KKwogZW5kbWVudQogCiBtZW51ICJNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDAzYWQyMzkuLjc1OWIxZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0xMiw2ICsxMiwxMSBAQAogb2JqLSQoQ09ORklHX01GRF9UQzYzODdYQikJKz0gdGM2Mzg3eGIubwogb2JqLSQoQ09ORklHX01GRF9UQzYzOTNYQikJKz0gdGM2MzkzeGIubwogCitvYmotJChDT05GSUdfTUZEX1dNODQwMCkJKz0gd204NDAwLWNvcmUubword204MzUwLW9ianMJCQk6PSB3bTgzNTAtY29yZS5vIHdtODM1MC1yZWdtYXAubyB3bTgzNTAtZ3Bpby5vCitvYmotJChDT05GSUdfTUZEX1dNODM1MCkJKz0gd204MzUwLm8KK29iai0kKENPTkZJR19NRkRfV004MzUwX0kyQykJKz0gd204MzUwLWkyYy5vCisKIG9iai0kKENPTkZJR19NRkRfQ09SRSkJCSs9IG1mZC1jb3JlLm8KIAogb2JqLSQoQ09ORklHX01DUCkJCSs9IG1jcC1jb3JlLm8KQEAgLTIyLDMgKzI3LDQgQEAKIGlmZXEgKCQoQ09ORklHX1NBMTEwMF9BU1NBQkVUKSx5KQogb2JqLSQoQ09ORklHX01DUF9VQ0IxMjAwKQkrPSB1Y2IxeDAwLWFzc2FiZXQubwogZW5kaWYKK29iai0kKENPTkZJR19VQ0IxNDAwX0NPUkUpCSs9IHVjYjE0MDBfY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hc2ljMy5jIGIvZHJpdmVycy9tZmQvYXNpYzMuYwppbmRleCBiYzJhODA3Li5iYTVhYTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hc2ljMy5jCisrKyBiL2RyaXZlcnMvbWZkL2FzaWMzLmMKQEAgLTMxMiw3ICszMTIsNiBAQAogCXN0cnVjdCBhc2ljMyAqYXNpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXVuc2lnbmVkIGxvbmcgY2xrc2VsID0gMDsKIAl1bnNpZ25lZCBpbnQgaXJxLCBpcnFfYmFzZTsKLQlpbnQgbWFwX3NpemU7CiAJaW50IHJldDsKIAogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CkBAIC01MzQsNiArNTMzLDcgQEAKIAlzdHJ1Y3QgYXNpYzMgKmFzaWM7CiAJc3RydWN0IHJlc291cmNlICptZW07CiAJdW5zaWduZWQgbG9uZyBjbGtzZWw7CisJaW50IG1hcF9zaXplOwogCWludCByZXQgPSAwOwogCiAJYXNpYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc2ljMyksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMTQwMF9jb3JlLmMgYi9kcml2ZXJzL21mZC91Y2IxNDAwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgxNTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdWNiMTQwMF9jb3JlLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3JlIGZ1bmN0aW9ucyBmb3I6CisgKiAgUGhpbGlwcyBVQ0IxNDAwIG11bHRpZnVuY3Rpb24gY2hpcAorICoKKyAqIEJhc2VkIG9uIHVjYjE0MDBfdHMuYzoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglTZXB0ZW1iZXIgMjUsIDIwMDYKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBTcGxpdGluZyBkb25lIGJ5OiBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICogSWYgc29tZXRoaW5nIGRvZXNudCB3b3JrIGFuZCBpdCB3b3JrZWQgYmVmb3JlIHNwbGl0aW5nLCBlLW1haWwgbWUsCisgKiBkb250IGJvdGhlciBOaWNvbGFzIHBsZWFzZSA7LSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHVjYjF4MDAtKi5jIGNvcHlyaWdodGVkIGJ5IFJ1c3NlbGwgS2luZworICogY292ZXJpbmcgdGhlIFVDQjExMDAsIFVDQjEyMDAgYW5kIFVDQjEzMDAuLiAgU3VwcG9ydCBmb3IgdGhlIFVDQjE0MDAgaGFzCisgKiBiZWVuIG1hZGUgc2VwYXJhdGUgZnJvbSB1Y2IxeDAwLWNvcmUvdWNiMXgwMC10cyBvbiBSdXNzZWxsJ3MgcmVxdWVzdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWNiMTQwMC5oPgorCitzdGF0aWMgaW50IHVjYjE0MDBfY29yZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdWNiMTQwMCAqdWNiOworCXN0cnVjdCB1Y2IxNDAwX3RzIHVjYl90czsKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7CisKKwltZW1zZXQoJnVjYl90cywgMCwgc2l6ZW9mKHVjYl90cykpOworCisJdWNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVjYjE0MDApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVjYikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCB1Y2IpOworCisJYWM5NyA9IHRvX2FjOTdfdChkZXYpOworCisJdWNiX3RzLmlkID0gdWNiMTQwMF9yZWdfcmVhZChhYzk3LCBVQ0JfSUQpOworCWlmICh1Y2JfdHMuaWQgIT0gVUNCX0lEXzE0MDApIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnIwOworCX0KKworCS8qIFRPVUNIU0NSRUVOICovCisJdWNiX3RzLmFjOTcgPSBhYzk3OworCXVjYi0+dWNiMTQwMF90cyA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidWNiMTQwMF90cyIsIC0xKTsKKwlpZiAoIXVjYi0+dWNiMTQwMF90cykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSh1Y2ItPnVjYjE0MDBfdHMsICZ1Y2JfdHMsCisJCQkJCXNpemVvZih1Y2JfdHMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh1Y2ItPnVjYjE0MDBfdHMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyMTsKKworCXJldHVybiAwOworCitlcnIxOgorCXBsYXRmb3JtX2RldmljZV9wdXQodWNiLT51Y2IxNDAwX3RzKTsKK2VycjA6CisJa2ZyZWUodWNiKTsKK2VycjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVjYjE0MDBfY29yZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB1Y2IxNDAwICp1Y2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHVjYi0+dWNiMTQwMF90cyk7CisJa2ZyZWUodWNiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHVjYjE0MDBfY29yZV9kcml2ZXIgPSB7CisJLm5hbWUJPSAidWNiMTQwMF9jb3JlIiwKKwkuYnVzCT0gJmFjOTdfYnVzX3R5cGUsCisJLnByb2JlCT0gdWNiMTQwMF9jb3JlX3Byb2JlLAorCS5yZW1vdmUJPSB1Y2IxNDAwX2NvcmVfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdWNiMTQwMF9jb3JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ1Y2IxNDAwX2NvcmVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVjYjE0MDBfY29yZV9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnVjYjE0MDBfY29yZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1Y2IxNDAwX2NvcmVfaW5pdCk7Cittb2R1bGVfZXhpdCh1Y2IxNDAwX2NvcmVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUGhpbGlwcyBVQ0IxNDAwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhN2E1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKQEAgLTAsMCArMSwxMjczIEBACisvKgorICogd204MzUwLWNvcmUuYyAgLS0gIERldmljZSBhY2Nlc3MgZm9yIFdvbGZzb24gV004MzUwCisgKgorICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QsIE1hcmsgQnJvd24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3dkdC5oPgorCisjZGVmaW5lIFdNODM1MF9VTkxPQ0tfS0VZCQkweDAwMTMKKyNkZWZpbmUgV004MzUwX0xPQ0tfS0VZCQkJMHgwMDAwCisKKyNkZWZpbmUgV004MzUwX0NMT0NLX0NPTlRST0xfMQkJMHgyOAorI2RlZmluZSBXTTgzNTBfQUlGX1RFU1QJCQkweDc0CisKKy8qIGRlYnVnICovCisjZGVmaW5lIFdNODM1MF9CVVNfREVCVUcgMAorI2lmIFdNODM1MF9CVVNfREVCVUcKKyNkZWZpbmUgZHVtcChyZWdzLCBzcmMpIGRvIHsgXAorCWludCBpXzsgXAorCXUxNiAqc3JjXyA9IHNyYzsgXAorCXByaW50ayhLRVJOX0RFQlVHKTsgXAorCWZvciAoaV8gPSAwOyBpXyA8IHJlZ3M7IGlfKyspIFwKKwkJcHJpbnRrKCIgMHglNC40eCIsICpzcmNfKyspOyBcCisJcHJpbnRrKCJcbiIpOyBcCit9IHdoaWxlICgwKTsKKyNlbHNlCisjZGVmaW5lIGR1bXAoYnl0ZXMsIHNyYykKKyNlbmRpZgorCisjZGVmaW5lIFdNODM1MF9MT0NLX0RFQlVHIDAKKyNpZiBXTTgzNTBfTE9DS19ERUJVRworI2RlZmluZSBsZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoZm9ybWF0LCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBsZGJnKGZvcm1hdCwgYXJnLi4uKQorI2VuZGlmCisKKy8qCisgKiBXTTgzNTAgRGV2aWNlIElPCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoaW9fbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChyZWdfbG9ja19tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGF1eGFkY19tdXRleCk7CisKKy8qIFBlcmZvcm0gYSBwaHlzaWNhbCByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCB3bTgzNTBfcGh5c19yZWFkKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgdTggcmVnLCBpbnQgbnVtX3JlZ3MsCisJCQkgICAgdTE2ICpkZXN0KQoreworCWludCBpLCByZXQ7CisJaW50IGJ5dGVzID0gbnVtX3JlZ3MgKiAyOworCisJZGV2X2RiZyh3bTgzNTAtPmRldiwgInZvbGF0aWxlIHJlYWRcbiIpOworCXJldCA9IHdtODM1MC0+cmVhZF9kZXYod204MzUwLCByZWcsIGJ5dGVzLCAoY2hhciAqKWRlc3QpOworCisJZm9yIChpID0gcmVnOyBpIDwgcmVnICsgbnVtX3JlZ3M7IGkrKykgeworCQkvKiBDYWNoZSBpcyBDUFUgZW5kaWFuICovCisJCWRlc3RbaSAtIHJlZ10gPSBiZTE2X3RvX2NwdShkZXN0W2kgLSByZWddKTsKKworCQkvKiBTYXRpc2Z5IG5vbi12b2xhdGlsZSBiaXRzIGZyb20gY2FjaGUgKi8KKwkJZGVzdFtpIC0gcmVnXSAmPSB3bTgzNTBfcmVnX2lvX21hcFtpXS52b2w7CisJCWRlc3RbaSAtIHJlZ10gfD0gd204MzUwLT5yZWdfY2FjaGVbaV07CisKKwkJLyogTWFzayBvdXQgbm9uLXJlYWRhYmxlIGJpdHMgKi8KKwkJZGVzdFtpIC0gcmVnXSAmPSB3bTgzNTBfcmVnX2lvX21hcFtpXS5yZWFkYWJsZTsKKwl9CisKKwlkdW1wKG51bV9yZWdzLCBkZXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX3JlYWQoc3RydWN0IHdtODM1MCAqd204MzUwLCB1OCByZWcsIGludCBudW1fcmVncywgdTE2ICpkZXN0KQoreworCWludCBpOworCWludCBlbmQgPSByZWcgKyBudW1fcmVnczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYnl0ZXMgPSBudW1fcmVncyAqIDI7CisKKwlpZiAod204MzUwLT5yZWFkX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgocmVnICsgbnVtX3JlZ3MgLSAxKSA+IFdNODM1MF9NQVhfUkVHSVNURVIpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImludmFsaWQgcmVnICV4XG4iLAorCQkJcmVnICsgbnVtX3JlZ3MgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyh3bTgzNTAtPmRldiwKKwkJIiVzIFIlZCgweCUyLjJ4KSAlZCByZWdzXG4iLCBfX2Z1bmNfXywgcmVnLCByZWcsIG51bV9yZWdzKTsKKworI2lmIFdNODM1MF9CVVNfREVCVUcKKwkvKiB3ZSBjYW4gX3NhZmVseV8gcmVhZCBhbnkgcmVnaXN0ZXIsIGJ1dCB3YXJuIGlmIHJlYWQgbm90IHN1cHBvcnRlZCAqLworCWZvciAoaSA9IHJlZzsgaSA8IGVuZDsgaSsrKSB7CisJCWlmICghd204MzUwX3JlZ19pb19tYXBbaV0ucmVhZGFibGUpCisJCQlkZXZfd2Fybih3bTgzNTAtPmRldiwKKwkJCQkicmVnIFIlZCBpcyBub3QgcmVhZGFibGVcbiIsIGkpOworCX0KKyNlbmRpZgorCisJLyogaWYgYW55IHZvbGF0aWxlIHJlZ2lzdGVycyBhcmUgcmVxdWlyZWQsIHRoZW4gcmVhZCBiYWNrIGFsbCAqLworCWZvciAoaSA9IHJlZzsgaSA8IGVuZDsgaSsrKQorCQlpZiAod204MzUwX3JlZ19pb19tYXBbaV0udm9sKQorCQkJcmV0dXJuIHdtODM1MF9waHlzX3JlYWQod204MzUwLCByZWcsIG51bV9yZWdzLCBkZXN0KTsKKworCS8qIG5vIHZvbGF0aWxlcywgdGhlbiBjYWNoZSBpcyBnb29kICovCisJZGV2X2RiZyh3bTgzNTAtPmRldiwgImNhY2hlIHJlYWRcbiIpOworCW1lbWNweShkZXN0LCAmd204MzUwLT5yZWdfY2FjaGVbcmVnXSwgYnl0ZXMpOworCWR1bXAobnVtX3JlZ3MsIGRlc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3JlZ19sb2NrZWQoc3RydWN0IHdtODM1MCAqd204MzUwLCB1OCByZWcpCit7CisJaWYgKHJlZyA9PSBXTTgzNTBfU0VDVVJJVFkgfHwKKwkgICAgd204MzUwLT5yZWdfY2FjaGVbV004MzUwX1NFQ1VSSVRZXSA9PSBXTTgzNTBfVU5MT0NLX0tFWSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHJlZyA9PSBXTTgzNTBfR1BJT19DT05GSUdVUkFUSU9OX0lfTykgfHwKKwkgICAgKHJlZyA+PSBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMSAmJgorCSAgICAgcmVnIDw9IFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF80KSB8fAorCSAgICAocmVnID49IFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8xICYmCisJICAgICByZWcgPD0gV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzMpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfd3JpdGUoc3RydWN0IHdtODM1MCAqd204MzUwLCB1OCByZWcsIGludCBudW1fcmVncywgdTE2ICpzcmMpCit7CisJaW50IGk7CisJaW50IGVuZCA9IHJlZyArIG51bV9yZWdzOworCWludCBieXRlcyA9IG51bV9yZWdzICogMjsKKworCWlmICh3bTgzNTAtPndyaXRlX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgocmVnICsgbnVtX3JlZ3MgLSAxKSA+IFdNODM1MF9NQVhfUkVHSVNURVIpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImludmFsaWQgcmVnICV4XG4iLAorCQkJcmVnICsgbnVtX3JlZ3MgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaXQncyBnZW5lcmFsbHkgbm90IGEgZ29vZCBpZGVhIHRvIHdyaXRlIHRvIFJPIG9yIGxvY2tlZCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSByZWc7IGkgPCBlbmQ7IGkrKykgeworCQlpZiAoIXdtODM1MF9yZWdfaW9fbWFwW2ldLndyaXRhYmxlKSB7CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LAorCQkJCSJhdHRlbXB0ZWQgd3JpdGUgdG8gcmVhZCBvbmx5IHJlZyBSJWRcbiIsIGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoaXNfcmVnX2xvY2tlZCh3bTgzNTAsIGkpKSB7CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LAorCQkJICAgICAgICJhdHRlbXB0ZWQgd3JpdGUgdG8gbG9ja2VkIHJlZyBSJWRcbiIsIGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzcmNbaSAtIHJlZ10gJj0gd204MzUwX3JlZ19pb19tYXBbaV0ud3JpdGFibGU7CisKKwkJd204MzUwLT5yZWdfY2FjaGVbaV0gPQorCQkJKHdtODM1MC0+cmVnX2NhY2hlW2ldICYgfndtODM1MF9yZWdfaW9fbWFwW2ldLndyaXRhYmxlKQorCQkJfCBzcmNbaSAtIHJlZ107CisKKwkJc3JjW2kgLSByZWddID0gY3B1X3RvX2JlMTYoc3JjW2kgLSByZWddKTsKKwl9CisKKwkvKiBBY3R1YWxseSB3cml0ZSBpdCBvdXQgKi8KKwlyZXR1cm4gd204MzUwLT53cml0ZV9kZXYod204MzUwLCByZWcsIGJ5dGVzLCAoY2hhciAqKXNyYyk7Cit9CisKKy8qCisgKiBTYWZlIHJlYWQsIG1vZGlmeSwgd3JpdGUgbWV0aG9kcworICovCitpbnQgd204MzUwX2NsZWFyX2JpdHMoc3RydWN0IHdtODM1MCAqd204MzUwLCB1MTYgcmVnLCB1MTYgbWFzaykKK3sKKwl1MTYgZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmaW9fbXV0ZXgpOworCWVyciA9IHdtODM1MF9yZWFkKHdtODM1MCwgcmVnLCAxLCAmZGF0YSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAicmVhZCBmcm9tIHJlZyBSJWQgZmFpbGVkXG4iLCByZWcpOworCQlnb3RvIG91dDsKKwl9CisKKwlkYXRhICY9IH5tYXNrOworCWVyciA9IHdtODM1MF93cml0ZSh3bTgzNTAsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJ3cml0ZSB0byByZWcgUiVkIGZhaWxlZFxuIiwgcmVnKTsKK291dDoKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2NsZWFyX2JpdHMpOworCitpbnQgd204MzUwX3NldF9iaXRzKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgdTE2IHJlZywgdTE2IG1hc2spCit7CisJdTE2IGRhdGE7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmlvX211dGV4KTsKKwllcnIgPSB3bTgzNTBfcmVhZCh3bTgzNTAsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgInJlYWQgZnJvbSByZWcgUiVkIGZhaWxlZFxuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGF0YSB8PSBtYXNrOworCWVyciA9IHdtODM1MF93cml0ZSh3bTgzNTAsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJ3cml0ZSB0byByZWcgUiVkIGZhaWxlZFxuIiwgcmVnKTsKK291dDoKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3NldF9iaXRzKTsKKwordTE2IHdtODM1MF9yZWdfcmVhZChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCByZWcpCit7CisJdTE2IGRhdGE7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmlvX211dGV4KTsKKwllcnIgPSB3bTgzNTBfcmVhZCh3bTgzNTAsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJyZWFkIGZyb20gcmVnIFIlZCBmYWlsZWRcbiIsIHJlZyk7CisKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gZGF0YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdfcmVhZCk7CisKK2ludCB3bTgzNTBfcmVnX3dyaXRlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgcmV0OworCXUxNiBkYXRhID0gdmFsOworCisJbXV0ZXhfbG9jaygmaW9fbXV0ZXgpOworCXJldCA9IHdtODM1MF93cml0ZSh3bTgzNTAsIHJlZywgMSwgJmRhdGEpOworCWlmIChyZXQpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJ3cml0ZSB0byByZWcgUiVkIGZhaWxlZFxuIiwgcmVnKTsKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ193cml0ZSk7CisKK2ludCB3bTgzNTBfYmxvY2tfcmVhZChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBzdGFydF9yZWcsIGludCByZWdzLAorCQkgICAgICB1MTYgKmRlc3QpCit7CisJaW50IGVyciA9IDA7CisKKwltdXRleF9sb2NrKCZpb19tdXRleCk7CisJZXJyID0gd204MzUwX3JlYWQod204MzUwLCBzdGFydF9yZWcsIHJlZ3MsIGRlc3QpOworCWlmIChlcnIpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJibG9jayByZWFkIHN0YXJ0aW5nIGZyb20gUiVkIGZhaWxlZFxuIiwKKwkJCXN0YXJ0X3JlZyk7CisJbXV0ZXhfdW5sb2NrKCZpb19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9ibG9ja19yZWFkKTsKKworaW50IHdtODM1MF9ibG9ja193cml0ZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBzdGFydF9yZWcsIGludCByZWdzLAorCQkgICAgICAgdTE2ICpzcmMpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZpb19tdXRleCk7CisJcmV0ID0gd204MzUwX3dyaXRlKHdtODM1MCwgc3RhcnRfcmVnLCByZWdzLCBzcmMpOworCWlmIChyZXQpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJibG9jayB3cml0ZSBzdGFydGluZyBhdCBSJWQgZmFpbGVkXG4iLAorCQkJc3RhcnRfcmVnKTsKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2Jsb2NrX3dyaXRlKTsKKworaW50IHdtODM1MF9yZWdfbG9jayhzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJdTE2IGtleSA9IFdNODM1MF9MT0NLX0tFWTsKKwlpbnQgcmV0OworCisJbGRiZyhfX2Z1bmNfXyk7CisJbXV0ZXhfbG9jaygmaW9fbXV0ZXgpOworCXJldCA9IHdtODM1MF93cml0ZSh3bTgzNTAsIFdNODM1MF9TRUNVUklUWSwgMSwgJmtleSk7CisJaWYgKHJldCkKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImxvY2sgZmFpbGVkXG4iKTsKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ19sb2NrKTsKKworaW50IHdtODM1MF9yZWdfdW5sb2NrKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwl1MTYga2V5ID0gV004MzUwX1VOTE9DS19LRVk7CisJaW50IHJldDsKKworCWxkYmcoX19mdW5jX18pOworCW11dGV4X2xvY2soJmlvX211dGV4KTsKKwlyZXQgPSB3bTgzNTBfd3JpdGUod204MzUwLCBXTTgzNTBfU0VDVVJJVFksIDEsICZrZXkpOworCWlmIChyZXQpCisJCWRldl9lcnIod204MzUwLT5kZXYsICJ1bmxvY2sgZmFpbGVkXG4iKTsKKwltdXRleF91bmxvY2soJmlvX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ191bmxvY2spOworCitzdGF0aWMgdm9pZCB3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEpCit7CisJbXV0ZXhfbG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworCisJaWYgKHdtODM1MC0+aXJxW2lycV0uaGFuZGxlcikKKwkJd204MzUwLT5pcnFbaXJxXS5oYW5kbGVyKHdtODM1MCwgaXJxLCB3bTgzNTAtPmlycVtpcnFdLmRhdGEpOworCWVsc2UgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiaXJxICVkIG5vYm9keSBjYXJlZC4gbm93IG1hc2tlZC5cbiIsCisJCQlpcnEpOworCQl3bTgzNTBfbWFza19pcnEod204MzUwLCBpcnEpOworCX0KKworCW11dGV4X3VubG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworfQorCisvKgorICogd204MzUwX2lycV93b3JrZXIgYWN0dWFsbHkgaGFuZGxlcyB0aGUgaW50ZXJydXB0cy4gIFNpbmNlIGFsbAorICogaW50ZXJydXB0cyBhcmUgY2xlYXIgb24gcmVhZCB0aGUgSVJRIGxpbmUgd2lsbCBiZSByZWFzc2VydGVkIGFuZAorICogdGhlIHBoeXNpY2FsIElSUSB3aWxsIGJlIGhhbmRsZWQgYWdhaW4gaWYgYW5vdGhlciBpbnRlcnJ1cHQgaXMKKyAqIGFzc2VydGVkIHdoaWxlIHdlIHJ1biAtIGluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cyB0aGlzIGlzIGEKKyAqIHJhcmUgb2NjdXJyZW5jZSBzbyB3ZSBzYXZlIEkyQy9TUEkgcmVhZHMuCisgKi8KK3N0YXRpYyB2b2lkIHdtODM1MF9pcnFfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtODM1MCwgaXJxX3dvcmspOworCXUxNiBsZXZlbF9vbmUsIHN0YXR1czEsIHN0YXR1czIsIGNvbXA7CisKKwkvKiBUT0RPOiBVc2UgYmxvY2sgcmVhZHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZT8gKi8KKwlsZXZlbF9vbmUgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfU1lTVEVNX0lOVEVSUlVQVFMpCisJCSYgfndtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9TWVNURU1fSU5URVJSVVBUU19NQVNLKTsKKwlzdGF0dXMxID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMSkKKwkJJiB+d204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLKTsKKwlzdGF0dXMyID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMikKKwkJJiB+d204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLKTsKKwljb21wID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVUykKKwkJJiB+d204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLKTsKKworCS8qIG92ZXIgY3VycmVudCAqLworCWlmIChsZXZlbF9vbmUgJiBXTTgzNTBfT0NfSU5UKSB7CisJCXUxNiBvYzsKKworCQlvYyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVUyk7CisJCW9jICY9IH53bTgzNTBfcmVnX3JlYWQod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfT1ZFUl9DVVJSRU5UX0lOVF9TVEFUVVNfTUFTSyk7CisKKwkJaWYgKG9jICYgV004MzUwX09DX0xTX0VJTlQpCS8qIGxpbWl0IHN3aXRjaCAqLworCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX09DX0xTKTsKKwl9CisKKwkvKiB1bmRlciB2b2x0YWdlICovCisJaWYgKGxldmVsX29uZSAmIFdNODM1MF9VVl9JTlQpIHsKKwkJdTE2IHV2OworCisJCXV2ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVUyk7CisJCXV2ICY9IH53bTgzNTBfcmVnX3JlYWQod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0spOworCisJCWlmICh1diAmIFdNODM1MF9VVl9EQzFfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9EQzEpOworCQlpZiAodXYgJiBXTTgzNTBfVVZfREMyX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfREMyKTsKKwkJaWYgKHV2ICYgV004MzUwX1VWX0RDM19FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1VWX0RDMyk7CisJCWlmICh1diAmIFdNODM1MF9VVl9EQzRfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9EQzQpOworCQlpZiAodXYgJiBXTTgzNTBfVVZfREM1X0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfREM1KTsKKwkJaWYgKHV2ICYgV004MzUwX1VWX0RDNl9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1VWX0RDNik7CisJCWlmICh1diAmIFdNODM1MF9VVl9MRE8xX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfTERPMSk7CisJCWlmICh1diAmIFdNODM1MF9VVl9MRE8yX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfTERPMik7CisJCWlmICh1diAmIFdNODM1MF9VVl9MRE8zX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfTERPMyk7CisJCWlmICh1diAmIFdNODM1MF9VVl9MRE80X0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfTERPNCk7CisJfQorCisJLyogY2hhcmdlciwgUlRDICovCisJaWYgKHN0YXR1czEpIHsKKwkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX0JBVF9IT1RfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOworCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9DSEdfQkFUX0NPTERfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEKTsKKwkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX0JBVF9GQUlMX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0NIR19CQVRfRkFJTCk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19UT19FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTyk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19FTkRfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9DSEdfRU5EKTsKKwkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX1NUQVJUX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1NUQVJUKTsKKwkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX0ZBU1RfUkRZX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0NIR19GQVNUX1JEWSk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19WQkFUVF9MVF8zUDlfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19WQkFUVF9MVF8zUDFfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19WQkFUVF9MVF8yUDg1X0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1KTsKKwkJaWYgKHN0YXR1czEgJiBXTTgzNTBfUlRDX0FMTV9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1JUQ19BTE0pOworCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9SVENfU0VDX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfUlRDX1NFQyk7CisJCWlmIChzdGF0dXMxICYgV004MzUwX1JUQ19QRVJfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9SVENfUEVSKTsKKwl9CisKKwkvKiBjdXJyZW50IHNpbmssIHN5c3RlbSwgYXV4IGFkYyAqLworCWlmIChzdGF0dXMyKSB7CisJCWlmIChzdGF0dXMyICYgV004MzUwX0NTMV9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0NTMSk7CisJCWlmIChzdGF0dXMyICYgV004MzUwX0NTMl9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0NTMik7CisKKwkJaWYgKHN0YXR1czIgJiBXTTgzNTBfU1lTX0hZU1RfQ09NUF9GQUlMX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX1NZU19IWVNUX0NPTVBfRkFJTCk7CisJCWlmIChzdGF0dXMyICYgV004MzUwX1NZU19DSElQX0dUMTE1X0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX1NZU19DSElQX0dUMTE1KTsKKwkJaWYgKHN0YXR1czIgJiBXTTgzNTBfU1lTX0NISVBfR1QxNDBfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfU1lTX0NISVBfR1QxNDApOworCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9TWVNfV0RPR19UT19FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAorCQkJCQkJV004MzUwX0lSUV9TWVNfV0RPR19UTyk7CisKKwkJaWYgKHN0YXR1czIgJiBXTTgzNTBfQVVYQURDX0RBVEFSRFlfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQVVYQURDX0RBVEFSRFkpOworCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9BVVhBRENfRENPTVA0X0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDQpOworCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9BVVhBRENfRENPTVAzX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDMpOworCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9BVVhBRENfRENPTVAyX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDIpOworCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9BVVhBRENfRENPTVAxX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDEpOworCisJCWlmIChzdGF0dXMyICYgV004MzUwX1VTQl9MSU1JVF9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1VTQl9MSU1JVCk7CisJfQorCisJLyogd2FrZSwgY29kZWMsIGV4dCAqLworCWlmIChjb21wKSB7CisJCWlmIChjb21wICYgV004MzUwX1dLVVBfT0ZGX1NUQVRFX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX1dLVVBfT0ZGX1NUQVRFKTsKKwkJaWYgKGNvbXAgJiBXTTgzNTBfV0tVUF9ISUJfU1RBVEVfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfV0tVUF9ISUJfU1RBVEUpOworCQlpZiAoY29tcCAmIFdNODM1MF9XS1VQX0NPTlZfRkFVTFRfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfV0tVUF9DT05WX0ZBVUxUKTsKKwkJaWYgKGNvbXAgJiBXTTgzNTBfV0tVUF9XRE9HX1JTVF9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAorCQkJCQkJV004MzUwX0lSUV9XS1VQX1dET0dfUlNUKTsKKwkJaWYgKGNvbXAgJiBXTTgzNTBfV0tVUF9HUF9QV1JfT05fRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfV0tVUF9HUF9QV1JfT04pOworCQlpZiAoY29tcCAmIFdNODM1MF9XS1VQX09OS0VZX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfV0tVUF9PTktFWSk7CisJCWlmIChjb21wICYgV004MzUwX1dLVVBfR1BfV0FLRVVQX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX1dLVVBfR1BfV0FLRVVQKTsKKworCQlpZiAoY29tcCAmIFdNODM1MF9DT0RFQ19KQ0tfREVUX0xfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKKwkJCQkJCVdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MKTsKKwkJaWYgKGNvbXAgJiBXTTgzNTBfQ09ERUNfSkNLX0RFVF9SX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQlXTTgzNTBfSVJRX0NPREVDX0pDS19ERVRfUik7CisJCWlmIChjb21wICYgV004MzUwX0NPREVDX01JQ1NDRF9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAorCQkJCQkJV004MzUwX0lSUV9DT0RFQ19NSUNTQ0QpOworCQlpZiAoY29tcCAmIFdNODM1MF9DT0RFQ19NSUNEX0VJTlQpCisJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfQ09ERUNfTUlDRCk7CisKKwkJaWYgKGNvbXAgJiBXTTgzNTBfRVhUX1VTQl9GQl9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIpOworCQlpZiAoY29tcCAmIFdNODM1MF9FWFRfV0FMTF9GQl9FSU5UKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAorCQkJCQkJV004MzUwX0lSUV9FWFRfV0FMTF9GQik7CisJCWlmIChjb21wICYgV004MzUwX0VYVF9CQVRfRkJfRUlOVCkKKwkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKKwl9CisKKwlpZiAobGV2ZWxfb25lICYgV004MzUwX0dQX0lOVCkgeworCQlpbnQgaTsKKwkJdTE2IGdwaW87CisKKwkJZ3BpbyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0lOVF9TVEFUVVMpOworCQlncGlvICY9IH53bTgzNTBfcmVnX3JlYWQod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJaWYgKGdwaW8gJiAoMSA8PCBpKSkKKwkJCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCisJCQkJCQkJV004MzUwX0lSUV9HUElPKGkpKTsKKwkJfQorCX0KKworCWVuYWJsZV9pcnEod204MzUwLT5jaGlwX2lycSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzNTBfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGF0YTsKKworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCXNjaGVkdWxlX3dvcmsoJndtODM1MC0+aXJxX3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgd204MzUwX3JlZ2lzdGVyX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCisJCQl2b2lkICgqaGFuZGxlcikgKHN0cnVjdCB3bTgzNTAgKiwgaW50LCB2b2lkICopLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPiBXTTgzNTBfTlVNX0lSUSB8fCAhaGFuZGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod204MzUwLT5pcnFbaXJxXS5oYW5kbGVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJbXV0ZXhfbG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworCXdtODM1MC0+aXJxW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7CisJd204MzUwLT5pcnFbaXJxXS5kYXRhID0gZGF0YTsKKwltdXRleF91bmxvY2soJndtODM1MC0+aXJxX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ2lzdGVyX2lycSk7CisKK2ludCB3bTgzNTBfZnJlZV9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+IFdNODM1MF9OVU1fSVJRKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJndtODM1MC0+aXJxX211dGV4KTsKKwl3bTgzNTAtPmlycVtpcnFdLmhhbmRsZXIgPSBOVUxMOworCW11dGV4X3VubG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2ZyZWVfaXJxKTsKKworaW50IHdtODM1MF9tYXNrX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1Q6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9DSEdfQkFUX0hPVF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX0JBVF9DT0xEX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUw6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9DSEdfQkFUX0ZBSUxfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19UTzoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NIR19UT19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0VORDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NIR19FTkRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19TVEFSVDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NIR19TVEFSVF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX0ZBU1RfUkRZX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9SVENfUEVSOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fUlRDX1BFUl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfUlRDX1NFQzoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1JUQ19TRUNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1JUQ19BTE06CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9SVENfQUxNX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5OgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzNQOV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NIR19WQkFUVF9MVF8zUDFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1OgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzJQODVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NTMToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NTMV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ1MyOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ1MyX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VU0JfTElNSVQ6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9VU0JfTElNSVRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQVRBUkRZOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQVVYQURDX0RBVEFSRFlfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDQ6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9BVVhBRENfRENPTVA0X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVAzOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQVVYQURDX0RDT01QM19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMjoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0FVWEFEQ19EQ09NUDJfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDE6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9BVVhBRENfRENPTVAxX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9TWVNfSFlTVF9DT01QX0ZBSUw6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9TWVNfSFlTVF9DT01QX0ZBSUxfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTE1OgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX0NISVBfR1QxMTVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTQwOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX0NISVBfR1QxNDBfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1NZU19XRE9HX1RPOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX1dET0dfVE9fRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0xETzQ6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9VVl9MRE80X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VVl9MRE8zOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfTERPM19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfVVZfTERPMjoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1VWX0xETzJfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0xETzE6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9VVl9MRE8xX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VVl9EQzY6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9VVl9EQzZfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDNToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1VWX0RDNV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfVVZfREM0OgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfREM0X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VVl9EQzM6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9VVl9EQzNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDMjoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1VWX0RDMl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfVVZfREMxOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfREMxX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9PQ19MUzoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fT0NfTFNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0VYVF9VU0JfRkI6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9FWFRfVVNCX0ZCX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9FWFRfV0FMTF9GQjoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0VYVF9XQUxMX0ZCX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9FWFRfQkFUX0ZCOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fRVhUX0JBVF9GQl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fQ09ERUNfSkNLX0RFVF9MX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX1I6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9DT0RFQ19KQ0tfREVUX1JfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NPREVDX01JQ1NDRDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NPREVDX01JQ1NDRF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDRDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0NPREVDX01JQ0RfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfT0ZGX1NUQVRFOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9PRkZfU1RBVEVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfSElCX1NUQVRFOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9ISUJfU1RBVEVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfQ09OVl9GQVVMVDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfQ09OVl9GQVVMVF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfV0tVUF9XRE9HX1JTVDoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfT0ZGX1NUQVRFX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9XS1VQX0dQX1BXUl9PTjoKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfR1BfUFdSX09OX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9XS1VQX09OS0VZOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9PTktFWV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfV0tVUF9HUF9XQUtFVVA6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9XS1VQX0dQX1dBS0VVUF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygwKToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQMF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxKToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQMV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygyKToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQMl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygzKToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQM19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg0KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQNF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg1KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQNV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg2KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQNl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg3KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQN19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg4KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQOF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg5KToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQOV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxMCk6CisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJICAgICAgIFdNODM1MF9JTV9HUDEwX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9HUElPKDExKToKKwkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCisJCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkgICAgICAgV004MzUwX0lNX0dQMTFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0dQSU8oMTIpOgorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAorCQkJCSAgICAgICBXTTgzNTBfSU1fR1AxMl9FSU5UKTsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIkF0dGVtcHRpbmcgdG8gbWFzayB1bmtub3duIElSUSAlZFxuIiwKKwkJCSBpcnEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfbWFza19pcnEpOworCitpbnQgd204MzUwX3VubWFza19pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKQoreworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfSE9UOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fQ0hHX0JBVF9IT1RfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRDoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCQkgV004MzUwX0lNX0NIR19CQVRfQ09MRF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fQ0hHX0JBVF9GQUlMX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DSEdfVE86CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DSEdfVE9fRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19FTkQ6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DSEdfRU5EX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DSEdfU1RBUlQ6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DSEdfU1RBUlRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCQkgV004MzUwX0lNX0NIR19GQVNUX1JEWV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfUlRDX1BFUjoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCQkgV004MzUwX0lNX1JUQ19QRVJfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1JUQ19TRUM6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9SVENfU0VDX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9SVENfQUxNOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fUlRDX0FMTV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCQkgV004MzUwX0lNX0NIR19WQkFUVF9MVF8zUDlfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDE6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DSEdfVkJBVFRfTFRfM1AxX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAorCQkJCQkgV004MzUwX0lNX0NIR19WQkFUVF9MVF8yUDg1X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9DUzE6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DUzFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0NTMjoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX0NTMl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfVVNCX0xJTUlUOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fVVNCX0xJTUlUX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9BVVhBRENfREFUQVJEWToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX0FVWEFEQ19EQVRBUkRZX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVA0OgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fQVVYQURDX0RDT01QNF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMzoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX0FVWEFEQ19EQ09NUDNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDI6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9BVVhBRENfRENPTVAyX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVAxOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fQVVYQURDX0RDT01QMV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfU1lTX0hZU1RfQ09NUF9GQUlMOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fU1lTX0hZU1RfQ09NUF9GQUlMX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9TWVNfQ0hJUF9HVDExNToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX1NZU19DSElQX0dUMTE1X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9TWVNfQ0hJUF9HVDE0MDoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX1NZU19DSElQX0dUMTQwX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9TWVNfV0RPR19UTzoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAorCQkJCQkgV004MzUwX0lNX1NZU19XRE9HX1RPX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VVl9MRE80OgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX1VWX0xETzRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0xETzM6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fVVZfTERPM19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfVVZfTERPMjoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9MRE8yX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9VVl9MRE8xOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX1VWX0xETzFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDNjoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzZfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDNToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDNDoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDMzoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDMjoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzJfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1VWX0RDMToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9VVl9EQzFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX09DX0xTOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fT0NfTFNfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0VYVF9VU0JfRkI6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fRVhUX1VTQl9GQl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfRVhUX1dBTExfRkI6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fRVhUX1dBTExfRkJfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0VYVF9CQVRfRkI6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fRVhUX0JBVF9GQl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0NPREVDX0pDS19ERVRfTF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0NPREVDX0pDS19ERVRfUl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDU0NEOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0NPREVDX01JQ1NDRF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDRDoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9DT0RFQ19NSUNEX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9XS1VQX09GRl9TVEFURToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9XS1VQX09GRl9TVEFURV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfV0tVUF9ISUJfU1RBVEU6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fV0tVUF9ISUJfU1RBVEVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfQ09OVl9GQVVMVDoKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9XS1VQX0NPTlZfRkFVTFRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfV0RPR19SU1Q6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fV0tVUF9PRkZfU1RBVEVfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfR1BfUFdSX09OOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX1dLVVBfR1BfUFdSX09OX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9XS1VQX09OS0VZOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX1dLVVBfT05LRVlfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX1dLVVBfR1BfV0FLRVVQOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX1dLVVBfR1BfV0FLRVVQX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9HUElPKDApOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0dQMF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxKToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9HUDFfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0dQSU8oMik6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1AyX0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9HUElPKDMpOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0dQM19FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg0KToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9HUDRfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0dQSU8oNSk6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1A1X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9HUElPKDYpOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0dQNl9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTyg3KToKKwkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKKwkJCQkJIFdNODM1MF9JTV9HUDdfRUlOVCk7CisJY2FzZSBXTTgzNTBfSVJRX0dQSU8oOCk6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1A4X0VJTlQpOworCWNhc2UgV004MzUwX0lSUV9HUElPKDkpOgorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAorCQkJCQkgV004MzUwX0lNX0dQOV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxMCk6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1AxMF9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxMSk6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1AxMV9FSU5UKTsKKwljYXNlIFdNODM1MF9JUlFfR1BJTygxMik6CisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCisJCQkJCSBXTTgzNTBfSU1fR1AxMl9FSU5UKTsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIkF0dGVtcHRpbmcgdG8gdW5tYXNrIHVua25vd24gSVJRICVkXG4iLAorCQkJIGlycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF91bm1hc2tfaXJxKTsKKworLyoKKyAqIENhY2hlIGlzIGFsd2F5cyBob3N0IGVuZGlhbi4KKyAqLworc3RhdGljIGludCB3bTgzNTBfY3JlYXRlX2NhY2hlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IG1vZGUpCit7CisJaW50IGksIHJldCA9IDA7CisJdTE2IHZhbHVlOworCWNvbnN0IHUxNiAqcmVnX21hcDsKKworCXN3aXRjaCAobW9kZSkgeworI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzAKKwljYXNlIDA6CisJCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTBfZGVmYXVsdHM7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMQorCWNhc2UgMToKKwkJcmVnX21hcCA9IHdtODM1MF9tb2RlMV9kZWZhdWx0czsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MF9DT05GSUdfTU9ERV8yCisJY2FzZSAyOgorCQlyZWdfbWFwID0gd204MzUwX21vZGUyX2RlZmF1bHRzOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzMKKwljYXNlIDM6CisJCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTNfZGVmYXVsdHM7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkNvbmZpZ3VyYXRpb24gbW9kZSAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODM1MC0+cmVnX2NhY2hlID0KKwkgICAga3phbGxvYyhzaXplb2YodTE2KSAqIChXTTgzNTBfTUFYX1JFR0lTVEVSICsgMSksIEdGUF9LRVJORUwpOworCWlmICh3bTgzNTAtPnJlZ19jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFJlYWQgdGhlIGluaXRpYWwgY2FjaGUgc3RhdGUgYmFjayBmcm9tIHRoZSBkZXZpY2UgLSB0aGlzIGlzCisJICogYSBQTUlDIHNvIHRoZSBkZXZpY2UgbWFueSBub3QgYmUgaW4gYSB2aXJnaW4gc3RhdGUgYW5kIHdlCisJICogY2FuJ3QgcmVseSBvbiB0aGUgc2lsaWNvbiB2YWx1ZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IFdNODM1MF9NQVhfUkVHSVNURVI7IGkrKykgeworCQkvKiBhdWRpbyByZWdpc3RlciByYW5nZSAqLworCQlpZiAod204MzUwX3JlZ19pb19tYXBbaV0ucmVhZGFibGUgJiYKKwkJICAgIChpIDwgV004MzUwX0NMT0NLX0NPTlRST0xfMSB8fCBpID4gV004MzUwX0FJRl9URVNUKSkgeworCQkJcmV0ID0gd204MzUwLT5yZWFkX2Rldih3bTgzNTAsIGksIDIsIChjaGFyICopJnZhbHVlKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCQkgICAgICAgImZhaWxlZCB0byByZWFkIGluaXRpYWwgY2FjaGUgdmFsdWVcbiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdmFsdWUgPSBiZTE2X3RvX2NwdSh2YWx1ZSk7CisJCQl2YWx1ZSAmPSB3bTgzNTBfcmVnX2lvX21hcFtpXS5yZWFkYWJsZTsKKwkJCXdtODM1MC0+cmVnX2NhY2hlW2ldID0gdmFsdWU7CisJCX0gZWxzZQorCQkJd204MzUwLT5yZWdfY2FjaGVbaV0gPSByZWdfbWFwW2ldOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfY3JlYXRlX2NhY2hlKTsKKworLyoKKyAqIFJlZ2lzdGVyIGEgY2xpZW50IGRldmljZS4gIFRoaXMgaXMgbm9uLWZhdGFsIHNpbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAqIGZhaWwgdGhlIGVudGlyZSBkZXZpY2UgaW5pdCBkdWUgdG8gYSBzaW5nbGUgcGxhdGZvcm0gZGV2aWNlIGZhaWxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHdtODM1MF9jbGllbnRfZGV2X3JlZ2lzdGVyKHN0cnVjdCB3bTgzNTAgKndtODM1MCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKnBkZXYpCit7CisJaW50IHJldDsKKworCSpwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIC0xKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgJXNcbiIsIG5hbWUpOworCQlyZXR1cm47CisJfQorCisJKCpwZGV2KS0+ZGV2LnBhcmVudCA9IHdtODM1MC0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKCpwZGV2LCB3bTgzNTApOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoKnBkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyICVzOiAlZFxuIiwgbmFtZSwgcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCgqcGRldik7CisJCSpwZGV2ID0gTlVMTDsKKwl9Cit9CisKK2ludCB3bTgzNTBfZGV2aWNlX2luaXQoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxLAorCQkgICAgICAgc3RydWN0IHdtODM1MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1MTYgaWQxLCBpZDIsIG1hc2ssIG1vZGU7CisKKwkvKiBnZXQgV004MzUwIHJldmlzaW9uIGFuZCBjb25maWcgbW9kZSAqLworCXdtODM1MC0+cmVhZF9kZXYod204MzUwLCBXTTgzNTBfUkVTRVRfSUQsIHNpemVvZihpZDEpLCAmaWQxKTsKKwl3bTgzNTAtPnJlYWRfZGV2KHdtODM1MCwgV004MzUwX0lELCBzaXplb2YoaWQyKSwgJmlkMik7CisKKwlpZDEgPSBiZTE2X3RvX2NwdShpZDEpOworCWlkMiA9IGJlMTZfdG9fY3B1KGlkMik7CisKKwlpZiAoaWQxID09IDB4NjE0MykgeworCQlzd2l0Y2ggKChpZDIgJiBXTTgzNTBfQ0hJUF9SRVZfTUFTSykgPj4gMTIpIHsKKwkJY2FzZSBXTTgzNTBfUkVWX0U6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkZvdW5kIFJldiBFIGRldmljZVxuIik7CisJCQl3bTgzNTAtPnJldiA9IFdNODM1MF9SRVZfRTsKKwkJCWJyZWFrOworCQljYXNlIFdNODM1MF9SRVZfRjoKKwkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiRm91bmQgUmV2IEYgZGV2aWNlXG4iKTsKKwkJCXdtODM1MC0+cmV2ID0gV004MzUwX1JFVl9GOworCQkJYnJlYWs7CisJCWNhc2UgV004MzUwX1JFVl9HOgorCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJGb3VuZCBSZXYgRyBkZXZpY2VcbiIpOworCQkJd204MzUwLT5yZXYgPSBXTTgzNTBfUkVWX0c7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIEZvciBzYWZldHkgd2UgcmVmdXNlIHRvIHJ1biBvbiB1bmtub3duIGhhcmR3YXJlICovCisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkZvdW5kIHVua25vd24gcmV2XG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiRGV2aWNlIHdpdGggSUQgJXggaXMgbm90IGEgV004MzUwXG4iLAorCQkJIGlkMSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCW1vZGUgPSBpZDIgJiBXTTgzNTBfQ09ORl9TVFNfTUFTSyA+PiAxMDsKKwltYXNrID0gaWQyICYgV004MzUwX0NVU1RfSURfTUFTSzsKKwlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkNvbmZpZyBtb2RlICVkLCBST00gbWFzayAlZFxuIiwgbW9kZSwgbWFzayk7CisKKwlyZXQgPSB3bTgzNTBfY3JlYXRlX2NhY2hlKHdtODM1MCwgbW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTgzNTA6IGZhaWxlZCB0byBjcmVhdGUgcmVnaXN0ZXIgY2FjaGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwZGF0YS0+aW5pdCkgeworCQlyZXQgPSBwZGF0YS0+aW5pdCh3bTgzNTApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIod204MzUwLT5kZXYsICJQbGF0Zm9ybSBpbml0KCkgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwltdXRleF9pbml0KCZ3bTgzNTAtPmlycV9tdXRleCk7CisJSU5JVF9XT1JLKCZ3bTgzNTAtPmlycV93b3JrLCB3bTgzNTBfaXJxX3dvcmtlcik7CisJaWYgKGlycSAhPSBOT19JUlEpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB3bTgzNTBfaXJxLCAwLAorCQkJCSAgIndtODM1MCIsIHdtODM1MCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsCisJCQkJcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXdtODM1MC0+Y2hpcF9pcnEgPSBpcnE7CisKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTX01BU0ssIDB4MCk7CisKKwl3bTgzNTBfY2xpZW50X2Rldl9yZWdpc3Rlcih3bTgzNTAsICJ3bTgzNTAtY29kZWMiLAorCQkJCSAgICYod204MzUwLT5jb2RlYy5wZGV2KSk7CisJd204MzUwX2NsaWVudF9kZXZfcmVnaXN0ZXIod204MzUwLCAid204MzUwLWdwaW8iLAorCQkJCSAgICYod204MzUwLT5ncGlvLnBkZXYpKTsKKwl3bTgzNTBfY2xpZW50X2Rldl9yZWdpc3Rlcih3bTgzNTAsICJ3bTgzNTAtcG93ZXIiLAorCQkJCSAgICYod204MzUwLT5wb3dlci5wZGV2KSk7CisJd204MzUwX2NsaWVudF9kZXZfcmVnaXN0ZXIod204MzUwLCAid204MzUwLXJ0YyIsICYod204MzUwLT5ydGMucGRldikpOworCXdtODM1MF9jbGllbnRfZGV2X3JlZ2lzdGVyKHdtODM1MCwgIndtODM1MC13ZHQiLCAmKHdtODM1MC0+d2R0LnBkZXYpKTsKKworCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUod204MzUwLT5yZWdfY2FjaGUpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfZGV2aWNlX2luaXQpOworCit2b2lkIHdtODM1MF9kZXZpY2VfZXhpdChzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzNTAtPnBtaWMucGRldik7IGkrKykKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5wbWljLnBkZXZbaV0pOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT53ZHQucGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5ydGMucGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5wb3dlci5wZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bTgzNTAtPmdwaW8ucGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5jb2RlYy5wZGV2KTsKKworCWZyZWVfaXJxKHdtODM1MC0+Y2hpcF9pcnEsIHdtODM1MCk7CisJZmx1c2hfd29yaygmd204MzUwLT5pcnFfd29yayk7CisJa2ZyZWUod204MzUwLT5yZWdfY2FjaGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2RldmljZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJXTTgzNTAgQXVkaW9QbHVzIFBNSUMgY29yZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1ncGlvLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjk5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93bTgzNTAtZ3Bpby5jCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogd204MzUwLWNvcmUuYyAgLS0gIERldmljZSBhY2Nlc3MgZm9yIFdvbGZzb24gV004MzUwCisgKgorICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3BtaWMuaD4KKworc3RhdGljIGludCBncGlvX3NldF9kaXIoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZ3BpbywgaW50IGRpcikKK3sKKwlpbnQgcmV0OworCisJd204MzUwX3JlZ191bmxvY2sod204MzUwKTsKKwlpZiAoZGlyID09IFdNODM1MF9HUElPX0RJUl9PVVQpCisJCXJldCA9IHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKKwkJCQkJV004MzUwX0dQSU9fQ09ORklHVVJBVElPTl9JX08sCisJCQkJCTEgPDwgZ3Bpbyk7CisJZWxzZQorCQlyZXQgPSB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgIFdNODM1MF9HUElPX0NPTkZJR1VSQVRJT05fSV9PLAorCQkJCSAgICAgIDEgPDwgZ3Bpbyk7CisJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBncGlvX3NldF9kZWJvdW5jZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBncGlvLCBpbnQgZGIpCit7CisJaWYgKGRiID09IFdNODM1MF9HUElPX0RFQk9VTkNFX09OKQorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fREVCT1VOQ0UsCisJCQkJICAgICAgIDEgPDwgZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fREVCT1VOQ0UsIDEgPDwgZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19zZXRfZnVuYyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBncGlvLCBpbnQgZnVuYykKK3sKKwl1MTYgcmVnOworCisJd204MzUwX3JlZ191bmxvY2sod204MzUwKTsKKwlzd2l0Y2ggKGdwaW8pIHsKKwljYXNlIDA6CisJCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8xKQorCQkgICAgJiB+V004MzUwX0dQMF9GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzEsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgMCkpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8xKQorCQkgICAgJiB+V004MzUwX0dQMV9GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzEsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgNCkpOworCQlicmVhazsKKwljYXNlIDI6CisJCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8xKQorCQkgICAgJiB+V004MzUwX0dQMl9GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzEsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgOCkpOworCQlicmVhazsKKwljYXNlIDM6CisJCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8xKQorCQkgICAgJiB+V004MzUwX0dQM19GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzEsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgMTIpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMikKKwkJICAgICYgfldNODM1MF9HUDRfRk5fTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8yLAorCQkJCSByZWcgfCAoKGZ1bmMgJiAweGYpIDw8IDApKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMikKKwkJICAgICYgfldNODM1MF9HUDVfRk5fTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8yLAorCQkJCSByZWcgfCAoKGZ1bmMgJiAweGYpIDw8IDQpKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMikKKwkJICAgICYgfldNODM1MF9HUDZfRk5fTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8yLAorCQkJCSByZWcgfCAoKGZ1bmMgJiAweGYpIDw8IDgpKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMikKKwkJICAgICYgfldNODM1MF9HUDdfRk5fTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8yLAorCQkJCSByZWcgfCAoKGZ1bmMgJiAweGYpIDw8IDEyKSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzMpCisJCSAgICAmIH5XTTgzNTBfR1A4X0ZOX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMywKKwkJCQkgcmVnIHwgKChmdW5jICYgMHhmKSA8PCAwKSk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzMpCisJCSAgICAmIH5XTTgzNTBfR1A5X0ZOX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfR1BJT19GVU5DVElPTl9TRUxFQ1RfMywKKwkJCQkgcmVnIHwgKChmdW5jICYgMHhmKSA8PCA0KSk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8zKQorCQkgICAgJiB+V004MzUwX0dQMTBfRk5fTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8zLAorCQkJCSByZWcgfCAoKGZ1bmMgJiAweGYpIDw8IDgpKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzMpCisJCSAgICAmIH5XTTgzNTBfR1AxMV9GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzMsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgMTIpKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzQpCisJCSAgICAmIH5XTTgzNTBfR1AxMl9GTl9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0dQSU9fRlVOQ1RJT05fU0VMRUNUXzQsCisJCQkJIHJlZyB8ICgoZnVuYyAmIDB4ZikgPDwgMCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3bTgzNTBfcmVnX2xvY2sod204MzUwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19zZXRfcHVsbF91cChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBncGlvLCBpbnQgdXApCit7CisJaWYgKHVwKQorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0dQSU9fUElOX1BVTExfVVBfQ09OVFJPTCwKKwkJCQkgICAgICAgMSA8PCBncGlvKTsKKwllbHNlCisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19QSU5fUFVMTF9VUF9DT05UUk9MLAorCQkJCQkgMSA8PCBncGlvKTsKK30KKworc3RhdGljIGludCBncGlvX3NldF9wdWxsX2Rvd24oc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZ3BpbywgaW50IGRvd24pCit7CisJaWYgKGRvd24pCisJCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAorCQkJCSAgICAgICBXTTgzNTBfR1BJT19QVUxMX0RPV05fQ09OVFJPTCwKKwkJCQkgICAgICAgMSA8PCBncGlvKTsKKwllbHNlCisJCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCisJCQkJCSBXTTgzNTBfR1BJT19QVUxMX0RPV05fQ09OVFJPTCwKKwkJCQkJIDEgPDwgZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19zZXRfcG9sYXJpdHkoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZ3BpbywgaW50IHBvbCkKK3sKKwlpZiAocG9sID09IFdNODM1MF9HUElPX0FDVElWRV9ISUdIKQorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKKwkJCQkgICAgICAgV004MzUwX0dQSU9fUElOX1BPTEFSSVRZX1RZUEUsCisJCQkJICAgICAgIDEgPDwgZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fUElOX1BPTEFSSVRZX1RZUEUsCisJCQkJCSAxIDw8IGdwaW8pOworfQorCitzdGF0aWMgaW50IGdwaW9fc2V0X2ludmVydChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBncGlvLCBpbnQgaW52ZXJ0KQoreworCWlmIChpbnZlcnQgPT0gV004MzUwX0dQSU9fSU5WRVJUX09OKQorCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0dQSU9fSU5UX01PREUsIDEgPDwgZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAorCQkJCQkgV004MzUwX0dQSU9fSU5UX01PREUsIDEgPDwgZ3Bpbyk7Cit9CisKK2ludCB3bTgzNTBfZ3Bpb19jb25maWcoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZ3BpbywgaW50IGRpciwgaW50IGZ1bmMsCisJCSAgICAgICBpbnQgcG9sLCBpbnQgcHVsbCwgaW50IGludmVydCwgaW50IGRlYm91bmNlKQoreworCS8qIG1ha2Ugc3VyZSB3ZSBuZXZlciBwdWxsIHVwIGFuZCBkb3duIGF0IHRoZSBzYW1lIHRpbWUgKi8KKwlpZiAocHVsbCA9PSBXTTgzNTBfR1BJT19QVUxMX05PTkUpIHsKKwkJaWYgKGdwaW9fc2V0X3B1bGxfdXAod204MzUwLCBncGlvLCAwKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoZ3Bpb19zZXRfcHVsbF9kb3duKHdtODM1MCwgZ3BpbywgMCkpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgaWYgKHB1bGwgPT0gV004MzUwX0dQSU9fUFVMTF9VUCkgeworCQlpZiAoZ3Bpb19zZXRfcHVsbF9kb3duKHdtODM1MCwgZ3BpbywgMCkpCisJCQlnb3RvIGVycjsKKwkJaWYgKGdwaW9fc2V0X3B1bGxfdXAod204MzUwLCBncGlvLCAxKSkKKwkJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAocHVsbCA9PSBXTTgzNTBfR1BJT19QVUxMX0RPV04pIHsKKwkJaWYgKGdwaW9fc2V0X3B1bGxfdXAod204MzUwLCBncGlvLCAwKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoZ3Bpb19zZXRfcHVsbF9kb3duKHdtODM1MCwgZ3BpbywgMSkpCisJCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZ3Bpb19zZXRfaW52ZXJ0KHdtODM1MCwgZ3BpbywgaW52ZXJ0KSkKKwkJZ290byBlcnI7CisJaWYgKGdwaW9fc2V0X3BvbGFyaXR5KHdtODM1MCwgZ3BpbywgcG9sKSkKKwkJZ290byBlcnI7CisJaWYgKGdwaW9fc2V0X2RlYm91bmNlKHdtODM1MCwgZ3BpbywgZGVib3VuY2UpKQorCQlnb3RvIGVycjsKKwlpZiAoZ3Bpb19zZXRfZGlyKHdtODM1MCwgZ3BpbywgZGlyKSkKKwkJZ290byBlcnI7CisJcmV0dXJuIGdwaW9fc2V0X2Z1bmMod204MzUwLCBncGlvLCBmdW5jKTsKKworZXJyOgorCXJldHVybiAtRUlPOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2dwaW9fY29uZmlnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1pMmMuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZlMjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWkyYy5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogd204MzUwLWkyYy5jICAtLSAgR2VuZXJpYyBJMkMgZHJpdmVyIGZvciBXb2xmc29uIFdNODM1MCBQTUlDCisgKgorICogVGhpcyBkcml2ZXIgZGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgV004MzUwIGZvciB0aGUgRnJlZXNjYWxlIGkuTVgzMkFEUy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2NvcmUuaD4KKworc3RhdGljIGludCB3bTgzNTBfaTJjX3JlYWRfZGV2aWNlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgY2hhciByZWcsCisJCQkJICBpbnQgYnl0ZXMsIHZvaWQgKmRlc3QpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZCh3bTgzNTAtPmkyY19jbGllbnQsICZyZWcsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBpMmNfbWFzdGVyX3JlY3Yod204MzUwLT5pMmNfY2xpZW50LCBkZXN0LCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2kyY193cml0ZV9kZXZpY2Uoc3RydWN0IHdtODM1MCAqd204MzUwLCBjaGFyIHJlZywKKwkJCQkgICBpbnQgYnl0ZXMsIHZvaWQgKnNyYykKK3sKKwkvKiB3ZSBhZGQgMSBieXRlIGZvciBkZXZpY2UgcmVnaXN0ZXIgKi8KKwl1OCBtc2dbKFdNODM1MF9NQVhfUkVHSVNURVIgPDwgMSkgKyAxXTsKKworCWlmIChieXRlcyA+ICgoV004MzUwX01BWF9SRUdJU1RFUiA8PCAxKSArIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZ1swXSA9IHJlZzsKKwltZW1jcHkoJm1zZ1sxXSwgc3JjLCBieXRlcyk7CisJcmV0dXJuIGkyY19tYXN0ZXJfc2VuZCh3bTgzNTAtPmkyY19jbGllbnQsIG1zZywgYnl0ZXMgKyAxKTsKK30KKworc3RhdGljIGludCB3bTgzNTBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MDsKKwlpbnQgcmV0ID0gMDsKKworCXdtODM1MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTgzNTApLCBHRlBfS0VSTkVMKTsKKwlpZiAod204MzUwID09IE5VTEwpIHsKKwkJa2ZyZWUoaTJjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204MzUwKTsKKwl3bTgzNTAtPmRldiA9ICZpMmMtPmRldjsKKwl3bTgzNTAtPmkyY19jbGllbnQgPSBpMmM7CisJd204MzUwLT5yZWFkX2RldiA9IHdtODM1MF9pMmNfcmVhZF9kZXZpY2U7CisJd204MzUwLT53cml0ZV9kZXYgPSB3bTgzNTBfaTJjX3dyaXRlX2RldmljZTsKKworCXJldCA9IHdtODM1MF9kZXZpY2VfaW5pdCh3bTgzNTAsIGkyYy0+aXJxLCBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUod204MzUwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODM1MF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwl3bTgzNTBfZGV2aWNlX2V4aXQod204MzUwKTsKKwlrZnJlZSh3bTgzNTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTgzNTBfaTJjX2lkW10gPSB7CisgICAgICAgeyAid204MzUwIiwgMCB9LAorICAgICAgIHsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTgzNTBfaTJjX2lkKTsKKworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204MzUwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAid204MzUwIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB3bTgzNTBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSB3bTgzNTBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3bTgzNTBfaTJjX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd204MzUwX2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3bTgzNTBfaTJjX2RyaXZlcik7Cit9CisvKiBpbml0IGVhcmx5IHNvIGNvbnN1bWVyIGRldmljZXMgY2FuIGNvbXBsZXRlIHN5c3RlbSBib290ICovCitzdWJzeXNfaW5pdGNhbGwod204MzUwX2kyY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODM1MF9pMmNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ3bTgzNTBfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bTgzNTBfaTJjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBzdXBwb3J0IGZvciB0aGUgV004MzUwIEF1ZGlvUGx1cyBQTUlDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0Njc4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1yZWdtYXAuYwpAQCAtMCwwICsxLDEzNDcgQEAKKy8qCisgKiB3bTgzNTAtcmVnbWFwLmMgIC0tICBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIHJlZ2lzdGVyIG1hcAorICoKKyAqIFRoaXMgZmlsZSBzcGxpdHMgb3V0IHRoZSB0YWJsZXMgZGVzY3JpYmluZyB0aGUgZGVmYXVsdHMgYW5kIGFjY2VzcworICogc3RhdHVzIG9mIHRoZSBXTTgzNTAgcmVnaXN0ZXJzIHNpbmNlIHRoZXkgYXJlIHJhdGhlciBsYXJnZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2NvcmUuaD4KKworI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzAKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTBfbW9kZTBfZGVmYXVsdHNbXSA9IHsKKwkweDE3RkYsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDEwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMiAqLworCTB4MTAwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMDA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICAtIFBvd2VyIFVwIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjggIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMwICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDNGRkYsICAgICAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNSAgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQjAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBMT1VUMSBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gUk9VVDEgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIExPVVQyIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBST1VUMiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgLSBBSUYgVGVzdCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgxRkZGLCAgICAgLyogUjEyOCAtIEdQSU8gRGVib3VuY2UgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJMHgwM0ZDLCAgICAgLyogUjEzMCAtIEdQSU8gUHVsbCBkb3duIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzIC0gR1BJTyBDb250cm9sICovCisJMHgwRkZDLCAgICAgLyogUjEzNCAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKSAqLworCTB4MEZGQywgICAgIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgwMDEzLCAgICAgLyogUjE0MCAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDIgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzICovCisJMHgwMDAzLCAgICAgLyogUjE0MyAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJMHgwMDAyLCAgICAgLyogUjE0NSAtIERpZ2l0aXNlciBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1MSAqLworCTB4NzAwMCwgICAgIC8qIFIxNTIgLSBBVVgxIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU0IC0gQVVYMyBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTUgLSBBVVg0IFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NyAtIExJTkUgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTggLSBCQVRUIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTYyICovCisJMHgwMDAwLCAgICAgLyogUjE2MyAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAtIEdlbmVyaWMgY29tcGFyYXRvciAxICovCisJMHgwMDAwLCAgICAgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJMHgwMDAwLCAgICAgLyogUjE2NiAtIEdlbmVyaWMgY29tcGFyYXRvciAzICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAtIEdlbmVyaWMgY29tcGFyYXRvciA0ICovCisJMHhBMDBGLCAgICAgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwkweDBCMDYsICAgICAvKiBSMTY5IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzAgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEEgKi8KKwkweDAwMDAsICAgICAvKiBSMTczIC0gQ1NBIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc0IC0gQ3VycmVudCBTaW5rIERyaXZlciBCICovCisJMHgwMDAwLCAgICAgLyogUjE3NSAtIENTQiBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAtIERDREMvTERPIHJlcXVlc3RlZCAqLworCTB4MDAyRCwgICAgIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJMHgwMDAwLCAgICAgLyogUjE3OCAtIERDREMgU2xlZXAgb3B0aW9ucyAqLworCTB4MDAyNSwgICAgIC8qIFIxNzkgLSBQb3dlci1jaGVjayBjb21wYXJhdG9yICovCisJMHgwMDBFLCAgICAgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTgxIC0gRENEQzEgVGltZW91dHMgKi8KKwkweDEwMDYsICAgICAvKiBSMTgyIC0gRENEQzEgTG93IFBvd2VyICovCisJMHgwMDE4LCAgICAgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0IC0gRENEQzIgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg1ICovCisJMHgwMDAwLCAgICAgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg3IC0gRENEQzMgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTg4IC0gRENEQzMgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTkwIC0gRENEQzQgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTkxIC0gRENEQzQgTG93IFBvd2VyICovCisJMHgwMDA4LCAgICAgLyogUjE5MiAtIERDREM1IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzIC0gRENEQzUgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTk0ICovCisJMHgwMDAwLCAgICAgLyogUjE5NSAtIERDREM2IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTk2IC0gRENEQzYgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTk3IC0gRENEQzYgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjE5OCAqLworCTB4MDAwMywgICAgIC8qIFIxOTkgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbCAqLworCTB4MDAxQywgICAgIC8qIFIyMDAgLSBMRE8xIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDIgLSBMRE8xIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDMgLSBMRE8yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDUgLSBMRE8yIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDYgLSBMRE8zIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDggLSBMRE8zIExvdyBQb3dlciAqLworCTB4MDAxQiwgICAgIC8qIFIyMDkgLSBMRE80IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMTEgLSBMRE80IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIyMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEzICovCisJMHgwMDAwLCAgICAgLyogUjIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTUgLSBWQ0NfRkFVTFQgTWFza3MgKi8KKwkweDAwMUYsICAgICAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KKwkweDkwMDAsICAgICAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgKi8KKwkweDQwMDAsICAgICAvKiBSMjIwIC0gUkFNIEJJU1QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4ICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAqLworCTB4RTAwMCwgICAgIC8qIFIyMzAgLSBHUElPIFBpbiBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMxICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgKi8KKwkweDAwMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4MDAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDAsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjQzICovCisJMHgwMDAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MDAwMCwgICAgIC8qIFIyNDggKi8KKwkweDAwMDAsICAgICAvKiBSMjQ5ICovCisJMHgwMDAwLCAgICAgLyogUjI1MCAqLworCTB4MDAwMCwgICAgIC8qIFIyNTEgKi8KKwkweDAwMDAsICAgICAvKiBSMjUyICovCisJMHgwMDAwLCAgICAgLyogUjI1MyAqLworCTB4MDAwMCwgICAgIC8qIFIyNTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjU1ICovCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MF9DT05GSUdfTU9ERV8xCisKKyN1bmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorI2RlZmluZSBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorCitjb25zdCB1MTYgd204MzUwX21vZGUxX2RlZmF1bHRzW10gPSB7CisJMHgxN0ZGLCAgICAgLyogUjAgICAtIFJlc2V0L0lEICovCisJMHgxMDAwLCAgICAgLyogUjEgICAtIElEICovCisJMHgwMDAwLCAgICAgLyogUjIgKi8KKwkweDEwMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDAxNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgIC0gUG93ZXIgVXAgSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0IwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gTE9VVDEgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIFJPVVQxIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBMT1VUMiBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gUk9VVDIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2IC0gQUlGIFRlc3QgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDNGQywgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MDBGQiwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDA0RkUsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MDMxMiwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgxMDAzLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDEzMzEsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMywgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAtIEN1cnJlbnQgU2luayBEcml2ZXIgQiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAwMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDA2MiwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAyNiwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDA2MiwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgLSBEQ0RDNSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyNiwgICAgIC8qIFIxOTUgLSBEQ0RDNiBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAtIERDREM2IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMDYsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMDYsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5ICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAtIFJBTSBCSVNUIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0ICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3ICovCisJMHgwMDAwLCAgICAgLyogUjIyOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzICovCisJMHgwMDAwLCAgICAgLyogUjIzNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMjM2ICovCisJMHgwMDAwLCAgICAgLyogUjIzNyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzggKi8KKwkweDAwMDAsICAgICAvKiBSMjM5ICovCisJMHgwMDAwLCAgICAgLyogUjI0MCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjQyICovCisJMHgwMDAwLCAgICAgLyogUjI0MyAqLworCTB4MDAwMCwgICAgIC8qIFIyNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ1ICovCisJMHgwMDAwLCAgICAgLyogUjI0NiAqLworCTB4MDAwMCwgICAgIC8qIFIyNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ4ICovCisJMHgwMDAwLCAgICAgLyogUjI0OSAqLworCTB4MDAwMCwgICAgIC8qIFIyNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMjUxICovCisJMHgwMDAwLCAgICAgLyogUjI1MiAqLworCTB4MDAwMCwgICAgIC8qIFIyNTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjU0ICovCisJMHgwMDAwLCAgICAgLyogUjI1NSAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMgorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1MF9tb2RlMl9kZWZhdWx0c1tdID0geworCTB4MTdGRiwgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MTAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMCwgICAgIC8qIFIyICovCisJMHgxMDAyLCAgICAgLyogUjMgICAtIFN5c3RlbSBDb250cm9sIDEgKi8KKwkweDAwMTQsICAgICAvKiBSNCAgIC0gU3lzdGVtIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAgLSBTeXN0ZW0gSGliZXJuYXRlICovCisJMHg4QTAwLCAgICAgLyogUjYgICAtIEludGVyZmFjZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjcgKi8KKwkweDgwMDAsICAgICAvKiBSOCAgIC0gUG93ZXIgbWdtdCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSOSAgIC0gUG93ZXIgbWdtdCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTAgIC0gUG93ZXIgbWdtdCAoMykgKi8KKwkweDIwMDAsICAgICAvKiBSMTEgIC0gUG93ZXIgbWdtdCAoNCkgKi8KKwkweDBFMDAsICAgICAvKiBSMTIgIC0gUG93ZXIgbWdtdCAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMgIC0gUG93ZXIgbWdtdCAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQgIC0gUG93ZXIgbWdtdCAoNykgKi8KKwkweDAwMDAsICAgICAvKiBSMTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTYgIC0gUlRDIFNlY29uZHMvTWludXRlcyAqLworCTB4MDEwMCwgICAgIC8qIFIxNyAgLSBSVEMgSG91cnMvRGF5ICovCisJMHgwMTAxLCAgICAgLyogUjE4ICAtIFJUQyBEYXRlL01vbnRoICovCisJMHgxNDAwLCAgICAgLyogUjE5ICAtIFJUQyBZZWFyICovCisJMHgwMDAwLCAgICAgLyogUjIwICAtIEFsYXJtIFNlY29uZHMvTWludXRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMSAgLSBBbGFybSBIb3Vycy9EYXkgKi8KKwkweDAwMDAsICAgICAvKiBSMjIgIC0gQWxhcm0gRGF0ZS9Nb250aCAqLworCTB4MDMyMCwgICAgIC8qIFIyMyAgLSBSVEMgVGltZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjI0ICAtIFN5c3RlbSBJbnRlcnJ1cHRzICovCisJMHgwMDAwLCAgICAgLyogUjI1ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyNiAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjcgIC0gUG93ZXIgVXAgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICAtIFBvd2VyIFVwIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNiAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNyAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM4ICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM5ICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDQwLCAgICAgLyogUjQwICAtIENsb2NrIENvbnRyb2wgMSAqLworCTB4MDAwMCwgICAgIC8qIFI0MSAgLSBDbG9jayBDb250cm9sIDIgKi8KKwkweDNCMDAsICAgICAvKiBSNDIgIC0gRkxMIENvbnRyb2wgMSAqLworCTB4NzA4NiwgICAgIC8qIFI0MyAgLSBGTEwgQ29udHJvbCAyICovCisJMHhDMjI2LCAgICAgLyogUjQ0ICAtIEZMTCBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSNDUgIC0gRkxMIENvbnRyb2wgNCAqLworCTB4MDAwMCwgICAgIC8qIFI0NiAqLworCTB4MDAwMCwgICAgIC8qIFI0NyAqLworCTB4MDAwMCwgICAgIC8qIFI0OCAgLSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI0OSAqLworCTB4MDBDMCwgICAgIC8qIFI1MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI1MSAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI1MiAqLworCTB4MDA0MCwgICAgIC8qIFI1MyAgLSBEQUMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1NCAgLSBEQUMgQ2xvY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI1NSAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAqLworCTB4MDAwMCwgICAgIC8qIFI1NyAqLworCTB4NDAwMCwgICAgIC8qIFI1OCAgLSBEQUMgTXV0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1OSAgLSBEQUMgTXV0ZSBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSNjAgIC0gREFDIFNpZGUgKi8KKwkweDAwMDAsICAgICAvKiBSNjEgKi8KKwkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMDAsICAgICAvKiBSNjMgKi8KKwkweDgwMDAsICAgICAvKiBSNjQgIC0gQURDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNjUgKi8KKwkweDAwQzAsICAgICAvKiBSNjYgIC0gQURDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNjcgIC0gQURDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNjggIC0gQURDIERpdmlkZXIgKi8KKwkweDAwMDAsICAgICAvKiBSNjkgKi8KKwkweDAwNDAsICAgICAvKiBSNzAgIC0gQURDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNzEgKi8KKwkweDAzMDMsICAgICAvKiBSNzIgIC0gSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3MyAgLSBJTjMgSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NCAgLSBNaWMgQmlhcyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc1ICovCisJMHgwMDAwLCAgICAgLyogUjc2ICAtIE91dHB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc3ICAtIEphY2sgRGV0ZWN0ICovCisJMHgwMDAwLCAgICAgLyogUjc4ICAtIEFudGkgUG9wIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzkgKi8KKwkweDAwNDAsICAgICAvKiBSODAgIC0gTGVmdCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwNDAsICAgICAvKiBSODEgIC0gUmlnaHQgSW5wdXQgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjgyICovCisJMHgwMDAwLCAgICAgLyogUjgzICovCisJMHgwMDAwLCAgICAgLyogUjg0ICovCisJMHgwMDAwLCAgICAgLyogUjg1ICovCisJMHgwMDAwLCAgICAgLyogUjg2ICovCisJMHgwMDAwLCAgICAgLyogUjg3ICovCisJMHgwODAwLCAgICAgLyogUjg4ICAtIExlZnQgTWl4ZXIgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFI4OSAgLSBSaWdodCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkwICovCisJMHgwMDAwLCAgICAgLyogUjkxICovCisJMHgwMDAwLCAgICAgLyogUjkyICAtIE9VVDMgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MyAgLSBPVVQ0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgIC0gT3V0cHV0IExlZnQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk3ICAtIE91dHB1dCBSaWdodCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTggIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwgKi8KKwkweDAwMDAsICAgICAvKiBSOTkgIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwIC0gSW5wdXQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzICovCisJMHgwMEU0LCAgICAgLyogUjEwNCAtIExPVVQxIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDUgLSBST1VUMSBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA2IC0gTE9VVDIgVm9sdW1lICovCisJMHgwMkU0LCAgICAgLyogUjEwNyAtIFJPVVQyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTA5ICovCisJMHgwMDAwLCAgICAgLyogUjExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTEgLSBCRUVQIFZvbHVtZSAqLworCTB4MEEwMCwgICAgIC8qIFIxMTIgLSBBSSBGb3JtYXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzIC0gQURDIERBQyBDT01QICovCisJMHgwMDIwLCAgICAgLyogUjExNCAtIEFJIEFEQyBDb250cm9sICovCisJMHgwMDIwLCAgICAgLyogUjExNSAtIEFJIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjExNiAtIEFJRiBUZXN0ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAzRkMsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDA4RkIsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwQ0ZFLCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAzMTIsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMywgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgyMzMxLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1IC0gQ1NCIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMDJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMEUsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwMkUsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMEUsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyIC0gRENEQzUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgLSBEQ0RDNSBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMjYsICAgICAvKiBSMTk1IC0gRENEQzYgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxOTYgLSBEQ0RDNiBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDFBLCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDEwLCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDBBLCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDFBLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgLSBSQU0gQklTVCAxICovCisJMHgwMDAwLCAgICAgLyogUjIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMjIzICovCisJMHgwMDAwLCAgICAgLyogUjIyNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2ICovCisJMHgwMDAwLCAgICAgLyogUjIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggKi8KKwkweDAwMDAsICAgICAvKiBSMjI5ICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgKi8KKwkweDAwMDAsICAgICAvKiBSMjMyICovCisJMHgwMDAwLCAgICAgLyogUjIzMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHgwMDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwMCwgICAgIC8qIFIyNDMgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjI0OCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMjUwICovCisJMHgwMDAwLCAgICAgLyogUjI1MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjUzICovCisJMHgwMDAwLCAgICAgLyogUjI1NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNTUgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzMKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTBfbW9kZTNfZGVmYXVsdHNbXSA9IHsKKwkweDE3RkYsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDEwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMiAqLworCTB4MTAwMCwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMDA0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICAtIFBvd2VyIFVwIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjggIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMwICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDNGRkYsICAgICAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNSAgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQjAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBMT1VUMSBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gUk9VVDEgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIExPVVQyIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBST1VUMiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgLSBBSUYgVGVzdCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgxRkZGLCAgICAgLyogUjEyOCAtIEdQSU8gRGVib3VuY2UgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJMHgwM0ZDLCAgICAgLyogUjEzMCAtIEdQSU8gUHVsbCBkb3duIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzIC0gR1BJTyBDb250cm9sICovCisJMHgwQTdCLCAgICAgLyogUjEzNCAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKSAqLworCTB4MDZGRSwgICAgIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgxMzEyLCAgICAgLyogUjE0MCAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDEgKi8KKwkweDEwMzAsICAgICAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCTB4MjIzMSwgICAgIC8qIFIxNDIgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzICovCisJMHgwMDAzLCAgICAgLyogUjE0MyAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJMHgwMDAyLCAgICAgLyogUjE0NSAtIERpZ2l0aXNlciBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1MSAqLworCTB4NzAwMCwgICAgIC8qIFIxNTIgLSBBVVgxIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU0IC0gQVVYMyBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTUgLSBBVVg0IFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NyAtIExJTkUgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTggLSBCQVRUIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTYyICovCisJMHgwMDAwLCAgICAgLyogUjE2MyAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAtIEdlbmVyaWMgY29tcGFyYXRvciAxICovCisJMHgwMDAwLCAgICAgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJMHgwMDAwLCAgICAgLyogUjE2NiAtIEdlbmVyaWMgY29tcGFyYXRvciAzICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAtIEdlbmVyaWMgY29tcGFyYXRvciA0ICovCisJMHhBMDBGLCAgICAgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwkweDBCMDYsICAgICAvKiBSMTY5IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzAgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEEgKi8KKwkweDAwMDAsICAgICAvKiBSMTczIC0gQ1NBIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc0IC0gQ3VycmVudCBTaW5rIERyaXZlciBCICovCisJMHgwMDAwLCAgICAgLyogUjE3NSAtIENTQiBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAtIERDREMvTERPIHJlcXVlc3RlZCAqLworCTB4MDAyRCwgICAgIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJMHgwMDAwLCAgICAgLyogUjE3OCAtIERDREMgU2xlZXAgb3B0aW9ucyAqLworCTB4MDAyNSwgICAgIC8qIFIxNzkgLSBQb3dlci1jaGVjayBjb21wYXJhdG9yICovCisJMHgwMDBFLCAgICAgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTgxIC0gRENEQzEgVGltZW91dHMgKi8KKwkweDEwMDYsICAgICAvKiBSMTgyIC0gRENEQzEgTG93IFBvd2VyICovCisJMHgwMDE4LCAgICAgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0IC0gRENEQzIgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg1ICovCisJMHgwMDBFLCAgICAgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTg3IC0gRENEQzMgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTg4IC0gRENEQzMgTG93IFBvd2VyICovCisJMHgwMDI2LCAgICAgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTkwIC0gRENEQzQgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTkxIC0gRENEQzQgTG93IFBvd2VyICovCisJMHgwMDA4LCAgICAgLyogUjE5MiAtIERDREM1IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzIC0gRENEQzUgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTk0ICovCisJMHgwMDI2LCAgICAgLyogUjE5NSAtIERDREM2IENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTk2IC0gRENEQzYgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTk3IC0gRENEQzYgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjE5OCAqLworCTB4MDAwMywgICAgIC8qIFIxOTkgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbCAqLworCTB4MDAxQywgICAgIC8qIFIyMDAgLSBMRE8xIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDIgLSBMRE8xIExvdyBQb3dlciAqLworCTB4MDAxQywgICAgIC8qIFIyMDMgLSBMRE8yIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDUgLSBMRE8yIExvdyBQb3dlciAqLworCTB4MDAxQywgICAgIC8qIFIyMDYgLSBMRE8zIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDggLSBMRE8zIExvdyBQb3dlciAqLworCTB4MDAxRiwgICAgIC8qIFIyMDkgLSBMRE80IENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMTEgLSBMRE80IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIyMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEzICovCisJMHgwMDAwLCAgICAgLyogUjIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTUgLSBWQ0NfRkFVTFQgTWFza3MgKi8KKwkweDAwMUYsICAgICAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KKwkweDkwMDAsICAgICAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgKi8KKwkweDQwMDAsICAgICAvKiBSMjIwIC0gUkFNIEJJU1QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4ICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAqLworCTB4RTAwMCwgICAgIC8qIFIyMzAgLSBHUElPIFBpbiBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMxICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgKi8KKwkweDAwMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4MDAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDAsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjQzICovCisJMHgwMDAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MDAwMCwgICAgIC8qIFIyNDggKi8KKwkweDAwMDAsICAgICAvKiBSMjQ5ICovCisJMHgwMDAwLCAgICAgLyogUjI1MCAqLworCTB4MDAwMCwgICAgIC8qIFIyNTEgKi8KKwkweDAwMDAsICAgICAvKiBSMjUyICovCisJMHgwMDAwLCAgICAgLyogUjI1MyAqLworCTB4MDAwMCwgICAgIC8qIFIyNTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjU1ICovCit9OworI2VuZGlmCisKKy8qIFRoZSByZWdpc3RlciBkZWZhdWx0cyBmb3IgdGhlIGNvbmZpZyBtb2RlIHVzZWQgbXVzdCBiZSBjb21waWxlZCBpbiBidXQKKyAqIGR1ZSB0byB0aGUgaW1wYWN0IG9uIGtlcm5lbCBzaXplIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUKKyAqLworI2lmbmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorI3dhcm5pbmcgTm8gV004MzUwIGNvbmZpZyBtb2RlcyBzdXBwb3J0ZWQgLSBzZWxlY3QgYXQgbGVhc3Qgb25lIG9mIHRoZQorI3dhcm5pbmcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV9uIG9wdGlvbnMgZnJvbSB0aGUgYm9hcmQgZHJpdmVyLgorI2VuZGlmCisKKy8qCisgKiBBY2Nlc3MgbWFza3MuCisgKi8KKworY29uc3Qgc3RydWN0IHdtODM1MF9yZWdfYWNjZXNzIHdtODM1MF9yZWdfaW9fbWFwW10gPSB7CisJLyogIHJlYWQgICAgd3JpdGUgdm9sYXRpbGUgKi8KKwl7IDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgfSwgLyogUjAgICAtIFJlc2V0L0lEICovCisJeyAweDdDRkYsIDB4MEMwMCwgMHg3RkZGIH0sIC8qIFIxICAgLSBJRCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMiAqLworCXsgMHhCRTNCLCAweEJFM0IsIDB4ODAwMCB9LCAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCXsgMHhGQ0Y3LCAweEZDRjcsIDB4RjgwMCB9LCAvKiBSNCAgIC0gU3lzdGVtIENvbnRyb2wgMiAqLworCXsgMHg4MEZGLCAweDgwRkYsIDB4ODAwMCB9LCAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCXsgMHhGQjBFLCAweEZCMEUsIDB4MDAwMCB9LCAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcgKi8KKwl7IDB4RTUzNywgMHhFNTM3LCAweEZGRkYgfSwgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJeyAweDBGRjMsIDB4MEZGMywgMHhGRkZGIH0sIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCXsgMHgwMDhGLCAweDAwOEYsIDB4RkZGRiB9LCAvKiBSMTAgIC0gUG93ZXIgbWdtdCAoMykgKi8KKwl7IDB4NkQzQywgMHg2RDNDLCAweEZGRkYgfSwgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJeyAweDFGOEYsIDB4MUY4RiwgMHhGRkZGIH0sIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCXsgMHg4RjNGLCAweDhGM0YsIDB4RkZGRiB9LCAvKiBSMTMgIC0gUG93ZXIgbWdtdCAoNikgKi8KKwl7IDB4MDAwMywgMHgwMDAzLCAweEZGRkYgfSwgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNSAqLworCXsgMHg3RjdGLCAweDdGN0YsIDB4RkZGRiB9LCAvKiBSMTYgIC0gUlRDIFNlY29uZHMvTWludXRlcyAqLworCXsgMHgwNzNGLCAweDA3M0YsIDB4RkZGRiB9LCAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCXsgMHgxRjNGLCAweDFGM0YsIDB4RkZGRiB9LCAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwl7IDB4M0ZGRiwgMHgwMEZGLCAweEZGRkYgfSwgLyogUjE5ICAtIFJUQyBZZWFyICovCisJeyAweDdGN0YsIDB4N0Y3RiwgMHgwMDAwIH0sIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwl7IDB4MEYzRiwgMHgwRjNGLCAweDAwMDAgfSwgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCXsgMHgxRjNGLCAweDFGM0YsIDB4MDAwMCB9LCAvKiBSMjIgIC0gQWxhcm0gRGF0ZS9Nb250aCAqLworCXsgMHhFRjdGLCAweEVBN0YsIDB4RkZGRiB9LCAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCXsgMHgzQkZGLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwl7IDB4RkVFNywgMHgwMDAwLCAweEZGRkYgfSwgLyogUjI1ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCXsgMHgzNUZGLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJeyAweDBGM0YsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIyNyAgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzICovCisJeyAweDBGM0YsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwl7IDB4ODAwMCwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJeyAweDFGRkYsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwl7IDB4RUY3RiwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCXsgMHgzRkZGLCAweDNGRkYsIDB4MDAwMCB9LCAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCXsgMHhGRUU3LCAweEZFRTcsIDB4MDAwMCB9LCAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwl7IDB4RjVGRiwgMHhGNUZGLCAweDAwMDAgfSwgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJeyAweDBGM0YsIDB4MEYzRiwgMHgwMDAwIH0sIC8qIFIzNSAgLSBQb3dlciBVcCBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwl7IDB4MEYzRiwgMHgwRjNGLCAweDAwMDAgfSwgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50IHN0YXR1cyBNYXNrICovCisJeyAweDgwMDAsIDB4ODAwMCwgMHgwMDAwIH0sIC8qIFIzNyAgLSBPdmVyIEN1cnJlbnQgSW50IHN0YXR1cyBNYXNrICovCisJeyAweDFGRkYsIDB4MUZGRiwgMHgwMDAwIH0sIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCXsgMHhFRjdGLCAweEVGN0YsIDB4MDAwMCB9LCAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRTdGF0dXMgTWFzayAqLworCXsgMHhDOUY3LCAweEM5RjcsIDB4RkZGRiB9LCAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJeyAweDgwMDEsIDB4ODAwMSwgMHgwMDAwIH0sIC8qIFI0MSAgLSBDbG9jayBDb250cm9sIDIgKi8KKwl7IDB4RkZGNywgMHhGRkY3LCAweEZGRkYgfSwgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwl7IDB4RkJGRiwgMHhGQkZGLCAweDAwMDAgfSwgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGLCAweDAwMDAgfSwgLyogUjQ0ICAtIEZMTCBDb250cm9sIDMgKi8KKwl7IDB4MDAzMywgMHgwMDMzLCAweDAwMDAgfSwgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NyAqLworCXsgMHgzMDMzLCAweDMwMzMsIDB4MDAwMCB9LCAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjQ5ICovCisJeyAweDgxRkYsIDB4ODFGRiwgMHhGRkZGIH0sIC8qIFI1MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTCAqLworCXsgMHg4MUZGLCAweDgxRkYsIDB4RkZGRiB9LCAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyICovCisJeyAweDBGRkYsIDB4MEZGRiwgMHhGRkZGIH0sIC8qIFI1MyAgLSBEQUMgTFIgUmF0ZSAqLworCXsgMHgwMDE3LCAweDAwMTcsIDB4MDAwMCB9LCAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1NiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTcgKi8KKwl7IDB4NDAwMCwgMHg0MDAwLCAweDAwMDAgfSwgLyogUjU4ICAtIERBQyBNdXRlICovCisJeyAweDcwMDAsIDB4NzAwMCwgMHgwMDAwIH0sIC8qIFI1OSAgLSBEQUMgTXV0ZSBWb2x1bWUgKi8KKwl7IDB4M0MwMCwgMHgzQzAwLCAweDAwMDAgfSwgLyogUjYwICAtIERBQyBTaWRlICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2MSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzICovCisJeyAweDgzMDMsIDB4ODMwMywgMHhGRkZGIH0sIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjUgKi8KKwl7IDB4ODFGRiwgMHg4MUZGLCAweEZGRkYgfSwgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJeyAweDgxRkYsIDB4ODFGRiwgMHhGRkZGIH0sIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCXsgMHgwRkZGLCAweDBGRkYsIDB4MDAwMCB9LCAvKiBSNjggIC0gQURDIERpdmlkZXIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5ICovCisJeyAweDBGRkYsIDB4MEZGRiwgMHhGRkZGIH0sIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzEgKi8KKwl7IDB4MDcwNywgMHgwNzA3LCAweEZGRkYgfSwgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwl7IDB4QzBDMCwgMHhDMEMwLCAweEZGRkYgfSwgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJeyAweEMwOUYsIDB4QzA5RiwgMHhGRkZGIH0sIC8qIFI3NCAgLSBNaWMgQmlhcyBDb250cm9sICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NSAqLworCXsgMHgwRjE1LCAweDBGMTUsIDB4RkZGRiB9LCAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwl7IDB4QzAwMCwgMHhDMDAwLCAweEZGRkYgfSwgLyogUjc3ICAtIEphY2sgRGV0ZWN0ICovCisJeyAweDAzRkYsIDB4MDNGRiwgMHgwMDAwIH0sIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OSAqLworCXsgMHhFMUZDLCAweEUxRkMsIDB4ODAwMCB9LCAvKiBSODAgIC0gTGVmdCBJbnB1dCBWb2x1bWUgKi8KKwl7IDB4RTFGQywgMHhFMUZDLCAweDgwMDAgfSwgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjgzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjg2ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NyAqLworCXsgMHg5ODA3LCAweDk4MDcsIDB4RkZGRiB9LCAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJeyAweDk4MEIsIDB4OTgwQiwgMHhGRkZGIH0sIC8qIFI4OSAgLSBSaWdodCBNaXhlciBDb250cm9sICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTEgKi8KKwl7IDB4ODkwOSwgMHg4OTA5LCAweEZGRkYgfSwgLyogUjkyICAtIE9VVDMgTWl4ZXIgQ29udHJvbCAqLworCXsgMHg5RTA3LCAweDlFMDcsIDB4RkZGRiB9LCAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUgKi8KKwl7IDB4MEVFRSwgMHgwRUVFLCAweDAwMDAgfSwgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCXsgMHhFMEVFLCAweEUwRUUsIDB4MDAwMCB9LCAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCXsgMHgwRTBGLCAweDBFMEYsIDB4MDAwMCB9LCAvKiBSOTggIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwgKi8KKwl7IDB4RTBFMSwgMHhFMEUxLCAweDAwMDAgfSwgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJeyAweDgwMEUsIDB4ODAwRSwgMHgwMDAwIH0sIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAyICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDMgKi8KKwl7IDB4RTFGQywgMHhFMUZDLCAweEZGRkYgfSwgLyogUjEwNCAtIExPVVQxIFZvbHVtZSAqLworCXsgMHhFMUZDLCAweEUxRkMsIDB4RkZGRiB9LCAvKiBSMTA1IC0gUk9VVDEgVm9sdW1lICovCisJeyAweEUxRkMsIDB4RTFGQywgMHhGRkZGIH0sIC8qIFIxMDYgLSBMT1VUMiBWb2x1bWUgKi8KKwl7IDB4RTdGQywgMHhFN0ZDLCAweEZGRkYgfSwgLyogUjEwNyAtIFJPVVQyIFZvbHVtZSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMCAqLworCXsgMHg4MEUwLCAweDgwRTAsIDB4RkZGRiB9LCAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwl7IDB4QkYwMCwgMHhCRjAwLCAweDAwMDAgfSwgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCXsgMHgwMEYxLCAweDAwRjEsIDB4MDAwMCB9LCAvKiBSMTEzIC0gQURDIERBQyBDT01QICovCisJeyAweDAwRjgsIDB4MDBGOCwgMHgwMDAwIH0sIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCXsgMHg0MEZCLCAweDQwRkIsIDB4MDAwMCB9LCAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwl7IDB4N0MzMCwgMHg3QzMwLCAweDAwMDAgfSwgLyogUjExNiAtIEFJRiBUZXN0ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExOCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE5ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNyAqLworCXsgMHgxRkZGLCAweDFGRkYsIDB4MDAwMCB9LCAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCXsgMHgxRkZGLCAweDFGRkYsIDB4MDAwMCB9LCAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJeyAweDFGRkYsIDB4MUZGRiwgMHgwMDAwIH0sIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJeyAweDFGRkYsIDB4MUZGRiwgMHgwMDAwIH0sIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzIgKi8KKwl7IDB4MDBDMCwgMHgwMEMwLCAweDAwMDAgfSwgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCXsgMHgxRkZGLCAweDFGRkYsIDB4MDAwMCB9LCAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJeyAweDFGRkYsIDB4MUZGRiwgMHgwMDAwIH0sIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCXsgMHgwMDBGLCAweDAwMEYsIDB4MDAwMCB9LCAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCXsgMHhGMEZGLCAweEYwRkYsIDB4QTAwMCB9LCAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJeyAweDM3MDcsIDB4MzcwNywgMHgwMDAwIH0sIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTEgKi8KKwl7IDB4N0ZGRiwgMHg3MDAwLCAweEZGRkYgfSwgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwl7IDB4N0ZGRiwgMHg3MDAwLCAweEZGRkYgfSwgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwl7IDB4N0ZGRiwgMHg3MDAwLCAweEZGRkYgfSwgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwl7IDB4N0ZGRiwgMHg3MDAwLCAweEZGRkYgfSwgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwl7IDB4MEZGRiwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJeyAweDBGRkYsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwl7IDB4MEZGRiwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCXsgMHgwRkZGLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2MSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYyICovCisJeyAweDAwMEYsIDB4MDAwRiwgMHgwMDAwIH0sIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwl7IDB4RkZGRiwgMHhGRkZGLCAweDAwMDAgfSwgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJeyAweEZGRkYsIDB4RkZGRiwgMHgwMDAwIH0sIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwl7IDB4QkZGRiwgMHhCRkZGLCAweDgwMDAgfSwgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwl7IDB4RkZGRiwgMHg0RkZGLCAweEIwMDAgfSwgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwl7IDB4MDA3RiwgMHgwMDdGLCAweDAwMDAgfSwgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3MSAqLworCXsgMHg5MDNGLCAweDkwM0YsIDB4RkZGRiB9LCAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJeyAweEUzMzMsIDB4RTMzMywgMHhGRkZGIH0sIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCXsgMHg5MDNGLCAweDkwM0YsIDB4RkZGRiB9LCAvKiBSMTc0IC0gQ3VycmVudCBTaW5rIERyaXZlciBCICovCisJeyAweEUzMzMsIDB4RTMzMywgMHhGRkZGIH0sIC8qIFIxNzUgLSBDU0IgRmxhc2ggY29udHJvbCAqLworCXsgMHg4RjNGLCAweDhGM0YsIDB4RkZGRiB9LCAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJeyAweDMzMkQsIDB4MzMyRCwgMHgwMDAwIH0sIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJeyAweDAwMkQsIDB4MDAyRCwgMHgwMDAwIH0sIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwl7IDB4NTE3NywgMHg1MTc3LCAweDgwMDAgfSwgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwl7IDB4MDQ3RiwgMHgwNDdGLCAweDAwMDAgfSwgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJeyAweDczN0YsIDB4NzM3RiwgMHgwMDAwIH0sIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwl7IDB4NTM1QiwgMHg1MzVCLCAweDAwMDAgfSwgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxODUgKi8KKwl7IDB4MDQ3RiwgMHgwNDdGLCAweDAwMDAgfSwgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJeyAweDczN0YsIDB4NzM3RiwgMHgwMDAwIH0sIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwl7IDB4MDQ3RiwgMHgwNDdGLCAweDAwMDAgfSwgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJeyAweDczN0YsIDB4NzM3RiwgMHgwMDAwIH0sIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwl7IDB4NTM1QiwgMHg1MzVCLCAweDAwMDAgfSwgLyogUjE5MiAtIERDREM1IENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE5MyAtIERDREM1IFRpbWVvdXRzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxOTQgKi8KKwl7IDB4MDQ3RiwgMHgwNDdGLCAweDAwMDAgfSwgLyogUjE5NSAtIERDREM2IENvbnRyb2wgKi8KKwl7IDB4RkZDMCwgMHhGRkMwLCAweDAwMDAgfSwgLyogUjE5NiAtIERDREM2IFRpbWVvdXRzICovCisJeyAweDczN0YsIDB4NzM3RiwgMHgwMDAwIH0sIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5OCAqLworCXsgMHhGRkQzLCAweEZGRDMsIDB4MDAwMCB9LCAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwl7IDB4NDQxRiwgMHg0NDFGLCAweDAwMDAgfSwgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCXsgMHhGRkMwLCAweEZGQzAsIDB4MDAwMCB9LCAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCXsgMHgzMzFGLCAweDMzMUYsIDB4MDAwMCB9LCAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwl7IDB4NDQxRiwgMHg0NDFGLCAweDAwMDAgfSwgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCXsgMHhGRkMwLCAweEZGQzAsIDB4MDAwMCB9LCAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCXsgMHgzMzFGLCAweDMzMUYsIDB4MDAwMCB9LCAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwl7IDB4NDQxRiwgMHg0NDFGLCAweDAwMDAgfSwgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCXsgMHhGRkMwLCAweEZGQzAsIDB4MDAwMCB9LCAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCXsgMHgzMzFGLCAweDMzMUYsIDB4MDAwMCB9LCAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwl7IDB4NDQxRiwgMHg0NDFGLCAweDAwMDAgfSwgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCXsgMHhGRkMwLCAweEZGQzAsIDB4MDAwMCB9LCAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCXsgMHgzMzFGLCAweDMzMUYsIDB4MDAwMCB9LCAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxMiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjEzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMTQgKi8KKwl7IDB4OEYzRiwgMHg4RjNGLCAweDAwMDAgfSwgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCXsgMHhGRjNGLCAweEUwM0YsIDB4MDAwMCB9LCAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwl7IDB4RUYyRiwgMHhFMDJGLCAweDAwMDAgfSwgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJeyAweEYzRkYsIDB4QjNGRiwgMHhjMDAwIH0sIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJeyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIyMTkgKi8KKwl7IDB4MDlGRiwgMHgwMUZGLCAweDAwMDAgfSwgLyogUjIyMCAtIFJBTSBCSVNUIDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMjIyICovCisJeyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIyMjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNCAqLworCXsgMHg4RjNGLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjIyNyAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI4ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMjkgKi8KKwl7IDB4RkZGRiwgMHgxRkZGLCAweEZGRkYgfSwgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCXsgMHhGRkZGLCAweDFGRkYsIDB4RkZGRiB9LCAvKiBSMjMxICovCisJeyAweEZGRkYsIDB4MUZGRiwgMHhGRkZGIH0sIC8qIFIyMzIgKi8KKwl7IDB4RkZGRiwgMHgxRkZGLCAweEZGRkYgfSwgLyogUjIzMyAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM0ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzNiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM3ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzOSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQwICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0MiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQzICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0NSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNDcgKi8KKwl7IDB4RkZGRiwgMHgwMDEwLCAweEZGRkYgfSwgLyogUjI0OCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ5ICovCisJeyAweEZGRkYsIDB4MDAxMCwgMHhGRkZGIH0sIC8qIFIyNTAgKi8KKwl7IDB4RkZGRiwgMHgwMDEwLCAweEZGRkYgfSwgLyogUjI1MSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjUyICovCisJeyAweEZGRkYsIDB4MDAxMCwgMHhGRkZGIH0sIC8qIFIyNTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1NCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjU1ICovCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwY2VkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3JlIGRyaXZlciBmb3IgV004NDAwLgorICoKKyAqIENvcHlyaWdodCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC1wcml2YXRlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC1hdWRpby5oPgorCitzdGF0aWMgc3RydWN0IHsKKwl1MTYgIHJlYWRhYmxlOyAgICAvKiBNYXNrIG9mIHJlYWRhYmxlIGJpdHMgKi8KKwl1MTYgIHdyaXRhYmxlOyAgICAvKiBNYXNrIG9mIHdyaXRhYmxlIGJpdHMgKi8KKwl1MTYgIHZvbDsgICAgICAgICAvKiBNYXNrIG9mIHZvbGF0aWxlIGJpdHMgKi8KKwlpbnQgIGlzX2NvZGVjOyAgICAvKiBSZWdpc3RlciBjb250cm9sbGVkIGJ5IGNvZGVjIHJlc2V0ICovCisJdTE2ICBkZWZhdWx0X3ZhbDsgLyogVmFsdWUgb24gcmVzZXQgKi8KK30gcmVnX2RhdGFbXSA9IHsKKwl7IDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDAsIDB4NjE3MiB9LCAvKiBSMCAqLworCXsgMHg3MDAwLCAweDAwMDAsIDB4ODAwMCwgMCwgMHgwMDAwIH0sIC8qIFIxICovCisJeyAweEZGMTcsIDB4RkYxNywgMHgwMDAwLCAwLCAweDAwMDAgfSwgLyogUjIgKi8KKwl7IDB4RUJGMywgMHhFQkYzLCAweDAwMDAsIDEsIDB4NjAwMCB9LCAvKiBSMyAqLworCXsgMHgzQ0YzLCAweDNDRjMsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0ICAqLworCXsgMHhGMUY4LCAweEYxRjgsIDB4MDAwMCwgMSwgMHg0MDUwIH0sIC8qIFI1ICAqLworCXsgMHhGQzFGLCAweEZDMUYsIDB4MDAwMCwgMSwgMHg0MDAwIH0sIC8qIFI2ICAqLworCXsgMHhERkRFLCAweERGREUsIDB4MDAwMCwgMSwgMHgwMUM4IH0sIC8qIFI3ICAqLworCXsgMHhGQ0ZDLCAweEZDRkMsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI4ICAqLworCXsgMHhFRkZGLCAweEVGRkYsIDB4MDAwMCwgMSwgMHgwMDQwIH0sIC8qIFI5ICAqLworCXsgMHhFRkZGLCAweEVGRkYsIDB4MDAwMCwgMSwgMHgwMDQwIH0sIC8qIFIxMCAqLworCXsgMHgyN0Y3LCAweDI3RjcsIDB4MDAwMCwgMSwgMHgwMDA0IH0sIC8qIFIxMSAqLworCXsgMHgwMUZGLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMEMwIH0sIC8qIFIxMiAqLworCXsgMHgwMUZGLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMEMwIH0sIC8qIFIxMyAqLworCXsgMHgxRkVGLCAweDFGRUYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFIxNCAqLworCXsgMHgwMTYzLCAweDAxNjMsIDB4MDAwMCwgMSwgMHgwMTAwIH0sIC8qIFIxNSAqLworCXsgMHgwMUZGLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMEMwIH0sIC8qIFIxNiAqLworCXsgMHgwMUZGLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMEMwIH0sIC8qIFIxNyAqLworCXsgMHgxRkZGLCAweDBGRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFIxOCAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMSwgMHgxMDAwIH0sIC8qIFIxOSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMSwgMHgxMDEwIH0sIC8qIFIyMCAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMSwgMHgxMDEwIH0sIC8qIFIyMSAqLworCXsgMHgwRkRELCAweDBGREQsIDB4MDAwMCwgMSwgMHg4MDAwIH0sIC8qIFIyMiAqLworCXsgMHgxRkZGLCAweDFGRkYsIDB4MDAwMCwgMSwgMHgwODAwIH0sIC8qIFIyMyAqLworCXsgMHgwMDAwLCAweDAxREYsIDB4MDAwMCwgMSwgMHgwMDhCIH0sIC8qIFIyNCAqLworCXsgMHgwMDAwLCAweDAxREYsIDB4MDAwMCwgMSwgMHgwMDhCIH0sIC8qIFIyNSAqLworCXsgMHgwMDAwLCAweDAxREYsIDB4MDAwMCwgMSwgMHgwMDhCIH0sIC8qIFIyNiAqLworCXsgMHgwMDAwLCAweDAxREYsIDB4MDAwMCwgMSwgMHgwMDhCIH0sIC8qIFIyNyAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFIyOCAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFIyOSAqLworCXsgMHgwMDAwLCAweDAwNzcsIDB4MDAwMCwgMSwgMHgwMDY2IH0sIC8qIFIzMCAqLworCXsgMHgwMDAwLCAweDAwMzMsIDB4MDAwMCwgMSwgMHgwMDIyIH0sIC8qIFIzMSAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDc5IH0sIC8qIFIzMiAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDc5IH0sIC8qIFIzMyAqLworCXsgMHgwMDAwLCAweDAwMDMsIDB4MDAwMCwgMSwgMHgwMDAzIH0sIC8qIFIzNCAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAzIH0sIC8qIFIzNSAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFIzNiAqLworCXsgMHgwMDAwLCAweDAwM0YsIDB4MDAwMCwgMSwgMHgwMTAwIH0sIC8qIFIzNyAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFIzOCAqLworCXsgMHgwMDAwLCAweDAwMEYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFIzOSAqLworCXsgMHgwMDAwLCAweDAwRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0MCAqLworCXsgMHgwMDAwLCAweDAxQjcsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0MSAqLworCXsgMHgwMDAwLCAweDAxQjcsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0MiAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0MyAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0NCAqLworCXsgMHgwMDAwLCAweDAwRkQsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0NSAqLworCXsgMHgwMDAwLCAweDAwRkQsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0NiAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0NyAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0OCAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI0OSAqLworCXsgMHgwMDAwLCAweDAxRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1MCAqLworCXsgMHgwMDAwLCAweDAxQjMsIDB4MDAwMCwgMSwgMHgwMTgwIH0sIC8qIFI1MSAqLworCXsgMHgwMDAwLCAweDAwNzcsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1MiAqLworCXsgMHgwMDAwLCAweDAwNzcsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1MyAqLworCXsgMHgwMDAwLCAweDAwRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1NCAqLworCXsgMHgwMDAwLCAweDAwMDEsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1NSAqLworCXsgMHgwMDAwLCAweDAwM0YsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1NiAqLworCXsgMHgwMDAwLCAweDAwNEYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1NyAqLworCXsgMHgwMDAwLCAweDAwRkQsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI1OCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI1OSAqLworCXsgMHgxRkZGLCAweDFGRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI2MCAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI2MSAqLworCXsgMHgwM0ZGLCAweDAzRkYsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI2MiAqLworCXsgMHgwMDdGLCAweDAwN0YsIDB4MDAwMCwgMSwgMHgwMDAwIH0sIC8qIFI2MyAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2NCAqLworCXsgMHhERkZGLCAweERGRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2NSAqLworCXsgMHhERkZGLCAweERGRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2NiAqLworCXsgMHhERkZGLCAweERGRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2NyAqLworCXsgMHhERkZGLCAweERGRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2OCAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI2OSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMCwgMHg0NDAwIH0sIC8qIFI3MCAqLworCXsgMHgyM0ZGLCAweDIzRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI3MSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMCwgMHg0NDAwIH0sIC8qIFI3MiAqLworCXsgMHgyM0ZGLCAweDIzRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI3MyAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI3NCAqLworCXsgMHgwMDBFLCAweDAwMEUsIDB4MDAwMCwgMCwgMHgwMDA4IH0sIC8qIFI3NSAqLworCXsgMHhFMDBGLCAweEUwMEYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI3NiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI3NyAqLworCXsgMHgwM0MwLCAweDAzQzAsIDB4MDAwMCwgMCwgMHgwMkMwIH0sIC8qIFI3OCAqLworCXsgMHhGRkZGLCAweDAwMDAsIDB4ZmZmZiwgMCwgMHgwMDAwIH0sIC8qIFI3OSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI4MCAqLworCXsgMHhGRkZGLCAweDAwMDAsIDB4ZmZmZiwgMCwgMHgwMDAwIH0sIC8qIFI4MSAqLworCXsgMHgyQkZGLCAweDAwMDAsIDB4ZmZmZiwgMCwgMHgwMDAwIH0sIC8qIFI4MiAqLworCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMCwgMHgwMDAwIH0sIC8qIFI4MyAqLworCXsgMHg4MEZGLCAweDgwRkYsIDB4MDAwMCwgMCwgMHgwMGZmIH0sIC8qIFI4NCAqLworfTsKKworc3RhdGljIGludCB3bTg0MDBfcmVhZChzdHJ1Y3Qgd204NDAwICp3bTg0MDAsIHU4IHJlZywgaW50IG51bV9yZWdzLCB1MTYgKmRlc3QpCit7CisJaW50IGksIHJldCA9IDA7CisKKwlCVUdfT04ocmVnICsgbnVtX3JlZ3MgLSAxID4gQVJSQVlfU0laRSh3bTg0MDAtPnJlZ19jYWNoZSkpOworCisJLyogSWYgdGhlcmUgYXJlIGFueSB2b2xhdGlsZSByZWFkcyB0aGVuIHJlYWQgYmFjayB0aGUgZW50aXJlIGJsb2NrICovCisJZm9yIChpID0gcmVnOyBpIDwgcmVnICsgbnVtX3JlZ3M7IGkrKykKKwkJaWYgKHJlZ19kYXRhW2ldLnZvbCkgeworCQkJcmV0ID0gd204NDAwLT5yZWFkX2Rldih3bTg0MDAtPmlvX2RhdGEsIHJlZywKKwkJCQkJICAgICAgIG51bV9yZWdzLCBkZXN0KTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspCisJCQkJZGVzdFtpXSA9IGJlMTZfdG9fY3B1KGRlc3RbaV0pOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJLyogT3RoZXJ3aXNlIHVzZSB0aGUgY2FjaGUgKi8KKwltZW1jcHkoZGVzdCwgJndtODQwMC0+cmVnX2NhY2hlW3JlZ10sIG51bV9yZWdzICogc2l6ZW9mKHUxNikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX3dyaXRlKHN0cnVjdCB3bTg0MDAgKndtODQwMCwgdTggcmVnLCBpbnQgbnVtX3JlZ3MsCisJCQl1MTYgKnNyYykKK3sKKwlpbnQgcmV0LCBpOworCisJQlVHX09OKHJlZyArIG51bV9yZWdzIC0gMSA+IEFSUkFZX1NJWkUod204NDAwLT5yZWdfY2FjaGUpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CisJCUJVR19PTighcmVnX2RhdGFbcmVnICsgaV0ud3JpdGFibGUpOworCQl3bTg0MDAtPnJlZ19jYWNoZVtyZWcgKyBpXSA9IHNyY1tpXTsKKwkJc3JjW2ldID0gY3B1X3RvX2JlMTYoc3JjW2ldKTsKKwl9CisKKwkvKiBEbyB0aGUgYWN0dWFsIEkvTyAqLworCXJldCA9IHdtODQwMC0+d3JpdGVfZGV2KHdtODQwMC0+aW9fZGF0YSwgcmVnLCBudW1fcmVncywgc3JjKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd204NDAwX3JlZ19yZWFkIC0gU2luZ2xlIHJlZ2lzdGVyIHJlYWQKKyAqCisgKiBAd204NDAwOiBQb2ludGVyIHRvIHdtODQwMCBjb250cm9sIHN0cnVjdHVyZQorICogQHJlZzogICAgUmVnaXN0ZXIgdG8gcmVhZAorICoKKyAqIEByZXR1cm4gIFJlYWQgdmFsdWUKKyAqLwordTE2IHdtODQwMF9yZWdfcmVhZChzdHJ1Y3Qgd204NDAwICp3bTg0MDAsIHU4IHJlZykKK3sKKwl1MTYgdmFsOworCisJbXV0ZXhfbG9jaygmd204NDAwLT5pb19sb2NrKTsKKworCXdtODQwMF9yZWFkKHdtODQwMCwgcmVnLCAxLCAmdmFsKTsKKworCW11dGV4X3VubG9jaygmd204NDAwLT5pb19sb2NrKTsKKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg0MDBfcmVnX3JlYWQpOworCitpbnQgd204NDAwX2Jsb2NrX3JlYWQoc3RydWN0IHdtODQwMCAqd204NDAwLCB1OCByZWcsIGludCBjb3VudCwgdTE2ICpkYXRhKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ3bTg0MDAtPmlvX2xvY2spOworCisJcmV0ID0gd204NDAwX3JlYWQod204NDAwLCByZWcsIGNvdW50LCBkYXRhKTsKKworCW11dGV4X3VubG9jaygmd204NDAwLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg0MDBfYmxvY2tfcmVhZCk7CisKKy8qKgorICogd204NDAwX3NldF9iaXRzIC0gQml0bWFzayB3cml0ZQorICoKKyAqIEB3bTg0MDA6IFBvaW50ZXIgdG8gd204NDAwIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAcmVnOiAgICBSZWdpc3RlciB0byBhY2Nlc3MKKyAqIEBtYXNrOiAgIE1hc2sgb2YgYml0cyB0byBjaGFuZ2UKKyAqIEB2YWw6ICAgIFZhbHVlIHRvIHNldCBmb3IgbWFza2VkIGJpdHMKKyAqLworaW50IHdtODQwMF9zZXRfYml0cyhzdHJ1Y3Qgd204NDAwICp3bTg0MDAsIHU4IHJlZywgdTE2IG1hc2ssIHUxNiB2YWwpCit7CisJdTE2IHRtcDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmd204NDAwLT5pb19sb2NrKTsKKworCXJldCA9IHdtODQwMF9yZWFkKHdtODQwMCwgcmVnLCAxLCAmdG1wKTsKKwl0bXAgPSAodG1wICYgfm1hc2spIHwgdmFsOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gd204NDAwX3dyaXRlKHdtODQwMCwgcmVnLCAxLCAmdG1wKTsKKworCW11dGV4X3VubG9jaygmd204NDAwLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg0MDBfc2V0X2JpdHMpOworCisvKioKKyAqIHdtODQwMF9yZXNldF9jb2RlY19yZWdfY2FjaGUgLSBSZXNldCBjYWNoZWQgY29kZWMgcmVnaXN0ZXJzIHRvCisgKiB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAqLwordm9pZCB3bTg0MDBfcmVzZXRfY29kZWNfcmVnX2NhY2hlKHN0cnVjdCB3bTg0MDAgKndtODQwMCkKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJndtODQwMC0+aW9fbG9jayk7CisKKwkvKiBSZXNldCBhbGwgY29kZWMgcmVnaXN0ZXJzIHRvIHRoZWlyIGluaXRpYWwgdmFsdWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg0MDAtPnJlZ19jYWNoZSk7IGkrKykKKwkJaWYgKHJlZ19kYXRhW2ldLmlzX2NvZGVjKQorCQkJd204NDAwLT5yZWdfY2FjaGVbaV0gPSByZWdfZGF0YVtpXS5kZWZhdWx0X3ZhbDsKKworCW11dGV4X3VubG9jaygmd204NDAwLT5pb19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODQwMF9yZXNldF9jb2RlY19yZWdfY2FjaGUpOworCisvKgorICogd204NDAwX2luaXQgLSBHZW5lcmljIGluaXRpYWxpc2F0aW9uCisgKgorICogVGhlIFdNODQwMCBjYW4gYmUgY29uZmlndXJlZCBhcyBlaXRoZXIgYW4gSTJDIG9yIFNQSSBkZXZpY2UuICBQcm9iZQorICogZnVuY3Rpb25zIGZvciBlYWNoIGJ1cyBzZXQgdXAgdGhlIGFjY2Vzc29ycyB0aGVuIGNhbGwgaW50byB0aGlzIHRvCisgKiBzZXQgdXAgdGhlIGRldmljZSBpdHNlbGYuCisgKi8KK3N0YXRpYyBpbnQgd204NDAwX2luaXQoc3RydWN0IHdtODQwMCAqd204NDAwLAorCQkgICAgICAgc3RydWN0IHdtODQwMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwl1MTYgcmVnOworCWludCByZXQsIGk7CisKKwltdXRleF9pbml0KCZ3bTg0MDAtPmlvX2xvY2spOworCisJd204NDAwLT5kZXYtPmRyaXZlcl9kYXRhID0gd204NDAwOworCisJLyogQ2hlY2sgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgV004NDAwICovCisJcmV0ID0gd204NDAwLT5yZWFkX2Rldih3bTg0MDAtPmlvX2RhdGEsIFdNODQwMF9SRVNFVF9JRCwgMSwgJnJlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod204NDAwLT5kZXYsICJDaGlwIElEIHJlZ2lzdGVyIHJlYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChiZTE2X3RvX2NwdShyZWcpICE9IHJlZ19kYXRhW1dNODQwMF9SRVNFVF9JRF0uZGVmYXVsdF92YWwpIHsKKwkJZGV2X2Vycih3bTg0MDAtPmRldiwgIkRldmljZSBpcyBub3QgYSBXTTg0MDAsIElEIGlzICV4XG4iLAorCQkJYmUxNl90b19jcHUocmVnKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFdlIGRvbid0IGtub3cgd2hhdCBzdGF0ZSB0aGUgaGFyZHdhcmUgaXMgaW4gYW5kIHNpbmNlIHRoaXMKKwkgKiBpcyBhIFBNSUMgd2UgY2FuJ3QgcmVzZXQgaXQgc2FmZWx5IHNvIGluaXRpYWxpc2UgdGhlIHJlZ2lzdGVyCisJICogY2FjaGUgZnJvbSB0aGUgaGFyZHdhcmUuCisJICovCisJcmV0ID0gd204NDAwLT5yZWFkX2Rldih3bTg0MDAtPmlvX2RhdGEsIDAsCisJCQkgICAgICAgQVJSQVlfU0laRSh3bTg0MDAtPnJlZ19jYWNoZSksCisJCQkgICAgICAgd204NDAwLT5yZWdfY2FjaGUpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKHdtODQwMC0+ZGV2LCAiUmVnaXN0ZXIgY2FjaGUgcmVhZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NDAwLT5yZWdfY2FjaGUpOyBpKyspCisJCXdtODQwMC0+cmVnX2NhY2hlW2ldID0gYmUxNl90b19jcHUod204NDAwLT5yZWdfY2FjaGVbaV0pOworCisJLyogSWYgdGhlIGNvZGVjIGlzIGluIHJlc2V0IHVzZSBoYXJkIGNvZGVkIHZhbHVlcyAqLworCWlmICghKHdtODQwMC0+cmVnX2NhY2hlW1dNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzFdICYgV004NDAwX0NPREVDX0VOQSkpCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODQwMC0+cmVnX2NhY2hlKTsgaSsrKQorCQkJaWYgKHJlZ19kYXRhW2ldLmlzX2NvZGVjKQorCQkJCXdtODQwMC0+cmVnX2NhY2hlW2ldID0gcmVnX2RhdGFbaV0uZGVmYXVsdF92YWw7CisKKwlyZXQgPSB3bTg0MDBfcmVhZCh3bTg0MDAsIFdNODQwMF9JRCwgMSwgJnJlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod204NDAwLT5kZXYsICJJRCByZWdpc3RlciByZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJlZyA9IChyZWcgJiBXTTg0MDBfQ0hJUF9SRVZfTUFTSykgPj4gV004NDAwX0NISVBfUkVWX1NISUZUOworCWRldl9pbmZvKHdtODQwMC0+ZGV2LCAiV004NDAwIHJldmlzaW9uICV4XG4iLCByZWcpOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5wbGF0Zm9ybV9pbml0KSB7CisJCXJldCA9IHBkYXRhLT5wbGF0Zm9ybV9pbml0KHdtODQwMC0+ZGV2KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X2Vycih3bTg0MDAtPmRldiwgIlBsYXRmb3JtIGluaXQgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCX0gZWxzZQorCQlkZXZfd2Fybih3bTg0MDAtPmRldiwgIk5vIHBsYXRmb3JtIGluaXRpYWxpc2F0aW9uIHN1cHBsaWVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdtODQwMF9yZWxlYXNlKHN0cnVjdCB3bTg0MDAgKndtODQwMCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODQwMC0+cmVndWxhdG9ycyk7IGkrKykKKwkJaWYgKHdtODQwMC0+cmVndWxhdG9yc1tpXS5uYW1lKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJndtODQwMC0+cmVndWxhdG9yc1tpXSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCitzdGF0aWMgaW50IHdtODQwMF9pMmNfcmVhZCh2b2lkICppb19kYXRhLCBjaGFyIHJlZywgaW50IGNvdW50LCB1MTYgKmRlc3QpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGlvX2RhdGE7CisJc3RydWN0IGkyY19tc2cgeGZlclsyXTsKKwlpbnQgcmV0OworCisJLyogV3JpdGUgcmVnaXN0ZXIgKi8KKwl4ZmVyWzBdLmFkZHIgPSBpMmMtPmFkZHI7CisJeGZlclswXS5mbGFncyA9IDA7CisJeGZlclswXS5sZW4gPSAxOworCXhmZXJbMF0uYnVmID0gJnJlZzsKKworCS8qIFJlYWQgZGF0YSAqLworCXhmZXJbMV0uYWRkciA9IGkyYy0+YWRkcjsKKwl4ZmVyWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJeGZlclsxXS5sZW4gPSBjb3VudCAqIHNpemVvZih1MTYpOworCXhmZXJbMV0uYnVmID0gKHU4ICopZGVzdDsKKworCXJldCA9IGkyY190cmFuc2ZlcihpMmMtPmFkYXB0ZXIsIHhmZXIsIDIpOworCWlmIChyZXQgPT0gMikKKwkJcmV0ID0gMDsKKwllbHNlIGlmIChyZXQgPj0gMCkKKwkJcmV0ID0gLUVJTzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2kyY193cml0ZSh2b2lkICppb19kYXRhLCBjaGFyIHJlZywgaW50IGNvdW50LCBjb25zdCB1MTYgKnNyYykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gaW9fZGF0YTsKKwl1OCAqbXNnOworCWludCByZXQ7CisKKwkvKiBXZSBhZGQgMSBieXRlIGZvciBkZXZpY2UgcmVnaXN0ZXIgLSBpZGVhbGx5IEkyQyB3b3VsZCBnYXRoZXIuICovCisJbXNnID0ga21hbGxvYygoY291bnQgKiBzaXplb2YodTE2KSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAobXNnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnWzBdID0gcmVnOworCW1lbWNweSgmbXNnWzFdLCBzcmMsIGNvdW50ICogc2l6ZW9mKHUxNikpOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGkyYywgbXNnLCAoY291bnQgKiBzaXplb2YodTE2KSkgKyAxKTsKKworCWlmIChyZXQgPT0gKGNvdW50ICogMikgKyAxKQorCQlyZXQgPSAwOworCWVsc2UgaWYgKHJldCA+PSAwKQorCQlyZXQgPSAtRUlPOworCisJa2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd204NDAwICp3bTg0MDA7CisJaW50IHJldDsKKworCXdtODQwMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg0MDApLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NDAwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJd204NDAwLT5pb19kYXRhID0gaTJjOworCXdtODQwMC0+cmVhZF9kZXYgPSB3bTg0MDBfaTJjX3JlYWQ7CisJd204NDAwLT53cml0ZV9kZXYgPSB3bTg0MDBfaTJjX3dyaXRlOworCXdtODQwMC0+ZGV2ID0gJmkyYy0+ZGV2OworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIHdtODQwMCk7CisKKwlyZXQgPSB3bTg0MDBfaW5pdCh3bTg0MDAsIGkyYy0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBzdHJ1Y3RfZXJyOworCisJcmV0dXJuIDA7CisKK3N0cnVjdF9lcnI6CisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgTlVMTCk7CisJa2ZyZWUod204NDAwKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODQwMF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwl3bTg0MDBfcmVsZWFzZSh3bTg0MDApOworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIE5VTEwpOworCWtmcmVlKHdtODQwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODQwMF9pMmNfaWRbXSA9IHsKKyAgICAgICB7ICJ3bTg0MDAiLCAwIH0sCisgICAgICAgeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODQwMF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NDAwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004NDAwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgICAgPSB3bTg0MDBfaTJjX3Byb2JlLAorCS5yZW1vdmUgICA9IHdtODQwMF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHdtODQwMF9pMmNfaWQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHdtODQwMF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PREVWOworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg0MDBfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KHdtODQwMF9tb2R1bGVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTg0MDBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJndtODQwMF9pMmNfZHJpdmVyKTsKKyNlbmRpZgorfQorbW9kdWxlX2V4aXQod204NDAwX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IGE3MjZmM2IuLmVmZDNhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0xNSw3ICsxNSw3IEBACiAKIGNvbmZpZyBBVE1FTF9QV00KIAl0cmlzdGF0ZSAiQXRtZWwgQVQzMi9BVDkxIFBXTSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVZSMzIgfHwgQVJDSF9BVDkxCisJZGVwZW5kcyBvbiBBVlIzMiB8fCBBUkNIX0FUOTFTQU05MjYzIHx8IEFSQ0hfQVQ5MVNBTTlSTCB8fCBBUkNIX0FUOTFDQVA5CiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXZpY2UgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBQV00gY2hhbm5lbHMKIAkgIG9uIGNlcnRhaW4gQXRtZWwgcHJjb2Vzc29ycy4gIFB1bHNlIFdpZHRoIE1vZHVsYXRpb24gaXMgdXNlZCBmb3IKQEAgLTQwOSw2ICs0MDksNyBAQAogCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWRlcGVuZHMgb24gSFdNT04KIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gUkZLSUxMCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEZuLUZ4IGtleXMgb24gRWVlIFBDIGxhcHRvcHMuCiAJICBJdCBhbHNvIGFkZHMgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIGNhbWVyYS93bGFuIG9uL29mZi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZWVwYy1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9lZWVwYy1sYXB0b3AuYwppbmRleCBmYWNkYjk4Li4xZWU4NTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZWVlcGMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL2VlZXBjLWxhcHRvcC5jCkBAIC00NTAsMTIgKzQ1MCwxNCBAQAogCWludCB2YWx1ZSA9IDA7CiAKIAlyZWFkX2FjcGlfaW50KE5VTEwsIEVFRVBDX0VDX0ZBTl9QV00sICZ2YWx1ZSk7CisJdmFsdWUgPSB2YWx1ZSAqIDI1NSAvIDEwMDsKIAlyZXR1cm4gKHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQgZWVlcGNfc2V0X2Zhbl9wd20oaW50IHZhbHVlKQogewotCXZhbHVlID0gU0VOU09SU19MSU1JVCh2YWx1ZSwgMCwgMTAwKTsKKwl2YWx1ZSA9IFNFTlNPUlNfTElNSVQodmFsdWUsIDAsIDI1NSk7CisJdmFsdWUgPSB2YWx1ZSAqIDEwMCAvIDI1NTsKIAllY193cml0ZShFRUVQQ19FQ19TQzAyLCB2YWx1ZSk7CiB9CiAKQEAgLTUyMCwxNSArNTIyLDIzIEBACiAJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihfbmFtZSwgX21vZGUsIHNob3dfIyNfbmFtZSwgc3RvcmVfIyNfbmFtZSwgMCk7CiAKIEVFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBlZWVwY19nZXRfZmFuX3JwbSwgTlVMTCk7Ci1FRUVQQ19DUkVBVEVfU0VOU09SX0FUVFIoZmFuMV9wd20sIFNfSVJVR08gfCBTX0lXVVNSLAorRUVFUENfQ1JFQVRFX1NFTlNPUl9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJIGVlZXBjX2dldF9mYW5fcHdtLCBlZWVwY19zZXRfZmFuX3B3bSk7CiBFRUVQQ19DUkVBVEVfU0VOU09SX0FUVFIocHdtMV9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJIGVlZXBjX2dldF9mYW5fY3RybCwgZWVlcGNfc2V0X2Zhbl9jdHJsKTsKIAorc3RhdGljIHNzaXplX3QKK3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZWVlcGNcbiIpOworfQorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwsIDApOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaHdtb25fYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2hwLXdtaS5jIGIvZHJpdmVycy9taXNjL2hwLXdtaS5jCmluZGV4IDZkNDA3YzIuLjVkYWJmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9ocC13bWkuYworKysgYi9kcml2ZXJzL21pc2MvaHAtd21pLmMKQEAgLTMwOSw3ICszMDksNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkIGhwX3dtaV9ub3RpZnkodTMyIHZhbHVlLCB2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgaHBfd21pX25vdGlmeSh1MzIgdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3BvbnNlID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcGhhbnRvbS5jIGIvZHJpdmVycy9taXNjL3BoYW50b20uYwppbmRleCBkYWY1ODU2Li5hYmRlYmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcGhhbnRvbS5jCisrKyBiL2RyaXZlcnMvbWlzYy9waGFudG9tLmMKQEAgLTM5OSw5ICszOTksOSBAQAogCQlnb3RvIGVycl9pcnE7CiAJfQogCi0JaWYgKElTX0VSUihkZXZpY2VfY3JlYXRlX2RydmRhdGEocGhhbnRvbV9jbGFzcywgJnBkZXYtPmRldiwKLQkJCQkJIE1LREVWKHBoYW50b21fbWFqb3IsIG1pbm9yKSwKLQkJCQkJIE5VTEwsICJwaGFudG9tJXUiLCBtaW5vcikpKQorCWlmIChJU19FUlIoZGV2aWNlX2NyZWF0ZShwaGFudG9tX2NsYXNzLCAmcGRldi0+ZGV2LAorCQkJCSBNS0RFVihwaGFudG9tX21ham9yLCBtaW5vciksIE5VTEwsCisJCQkJICJwaGFudG9tJXUiLCBtaW5vcikpKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBjcmVhdGUgZGV2aWNlXG4iKTsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwaHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1LmggYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnUuaAppbmRleCA0MGRmN2NiLi5mOTNmMDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnUuaAorKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnUuaApAQCAtMzAsOSArMzAsOSBAQAogLyoKICAqIFNpemUgdXNlZCB0byBtYXAgR1JVIEdTZWcKICAqLwotI2lmIGRlZmluZWQgQ09ORklHX0lBNjQKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0KQogI2RlZmluZSBHUlVfR1NFR19QQUdFU0laRQkoMjU2ICogMTAyNFVMKQotI2VsaWYgZGVmaW5lZCBDT05GSUdfWDg2XzY0CisjZWxpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCiAjZGVmaW5lIEdSVV9HU0VHX1BBR0VTSVpFCSgyNTYgKiAxMDI0VUwpCQkvKiBaWlogMk1CID8/PyAqLwogI2Vsc2UKICNlcnJvciAiVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1X2luc3RydWN0aW9ucy5oIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1X2luc3RydWN0aW9ucy5oCmluZGV4IDBkYzM2MjIuLjQ4NzYyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydV9pbnN0cnVjdGlvbnMuaAorKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVfaW5zdHJ1Y3Rpb25zLmgKQEAgLTI2LDcgKzI2LDcgQEAKICAqIEFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgZnVuY3Rpb25zCiAgKi8KIAotI2lmIGRlZmluZWQgQ09ORklHX0lBNjQKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0KQogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KICNkZWZpbmUgX19mbHVzaF9jYWNoZShwKQkJaWE2NF9mYyhwKQpAQCAtMzYsNyArMzYsNyBAQAogCQkJYmFycmllcigpOwkJCQkJXAogCQkJKigodm9sYXRpbGUgaW50ICopKHApKSA9IHY7IC8qIGZvcmNlIHN0LnJlbCAqLwlcCiAJCX0gd2hpbGUgKDApCi0jZWxpZiBkZWZpbmVkIENPTkZJR19YODZfNjQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKICNkZWZpbmUgX19mbHVzaF9jYWNoZShwKQkJY2xmbHVzaChwKQogI2RlZmluZSBncnVfb3JkZXJlZF9zdG9yZV9pbnQocCx2KQkJCQkJXAogCQlkbyB7CQkJCQkJCVwKQEAgLTI5OSw2ICsyOTksNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGdydV9zdGFydF9pbnN0cnVjdGlvbihzdHJ1Y3QgZ3J1X2luc3RydWN0aW9uICppbnMsIGludCBvcDMyKQogewogCWdydV9vcmRlcmVkX3N0b3JlX2ludChpbnMsIG9wMzIpOworCWdydV9mbHVzaF9jYWNoZShpbnMpOwogfQogCiAKQEAgLTYwNCw4ICs2MDUsOSBAQAogc3RhdGljIGlubGluZSBpbnQgZ3J1X2NoZWNrX3N0YXR1cyh2b2lkICpjYikKIHsKIAlzdHJ1Y3QgZ3J1X2NvbnRyb2xfYmxvY2tfc3RhdHVzICpjYnMgPSAodm9pZCAqKWNiOwotCWludCByZXQgPSBjYnMtPmlzdGF0dXM7CisJaW50IHJldDsKIAorCXJldCA9IGNicy0+aXN0YXR1czsKIAlpZiAocmV0ID09IENCU19DQUxMX09TKQogCQlyZXQgPSBncnVfY2hlY2tfc3RhdHVzX3Byb2MoY2IpOwogCXJldHVybiByZXQ7CkBAIC02MTcsNyArNjE5LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdydV93YWl0KHZvaWQgKmNiKQogewogCXN0cnVjdCBncnVfY29udHJvbF9ibG9ja19zdGF0dXMgKmNicyA9ICh2b2lkICopY2I7Ci0JaW50IHJldCA9IGNicy0+aXN0YXR1czs7CisJaW50IHJldCA9IGNicy0+aXN0YXR1czsKIAogCWlmIChyZXQgIT0gQ0JTX0lETEUpCiAJCXJldCA9IGdydV93YWl0X3Byb2MoY2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMKaW5kZXggM2QzMzAxNS4uOGMzODlkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZhdWx0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmF1bHQuYwpAQCAtMjE0LDEyICsyMTQsMTQgQEAKIH0KIAogLyoKLSAqCiAgKiBhdG9taWNfcHRlX2xvb2t1cAogICoKICAqIENvbnZlcnQgYSB1c2VyIHZpcnR1YWwgYWRkcmVzcyB0byBhIHBoeXNpY2FsIGFkZHJlc3MKICAqIE9ubHkgc3VwcG9ydHMgSW50ZWwgbGFyZ2UgcGFnZXMgKDJNQiBvbmx5KSBvbiB4ODZfNjQuCiAgKglaWlogLSBodWdlcGFnZSBzdXBwb3J0IGlzIGluY29tcGxldGUKKyAqCisgKiBOT1RFOiBtbWFwX3NlbSBpcyBhbHJlYWR5IGhlbGQgb24gZW50cnkgdG8gdGhpcyBmdW5jdGlvbi4gVGhpcworICogZ3VhcmFudGVlcyBleGlzdGVuY2Ugb2YgdGhlIHBhZ2UgdGFibGVzLgogICovCiBzdGF0aWMgaW50IGF0b21pY19wdGVfbG9va3VwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCWludCB3cml0ZSwgdW5zaWduZWQgbG9uZyAqcGFkZHIsIGludCAqcGFnZXNoaWZ0KQpAQCAtMjI5LDkgKzIzMSw2IEBACiAJcHVkX3QgKnB1ZHA7CiAJcHRlX3QgcHRlOwogCi0JV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwkJLyogWlpaIGRlYnVnICovCi0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXBnZHAgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIHZhZGRyKTsKIAlpZiAodW5saWtlbHkocGdkX25vbmUoKnBnZHApKSkKIAkJZ290byBlcnI7CkBAIC0yNTAsOCArMjQ5LDYgQEAKICNlbmRpZgogCQlwdGUgPSAqcHRlX29mZnNldF9rZXJuZWwocG1kcCwgdmFkZHIpOwogCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCiAJaWYgKHVubGlrZWx5KCFwdGVfcHJlc2VudChwdGUpIHx8CiAJCSAgICAgKHdyaXRlICYmICghcHRlX3dyaXRlKHB0ZSkgfHwgIXB0ZV9kaXJ0eShwdGUpKSkpKQogCQlyZXR1cm4gMTsKQEAgLTMyNCw2ICszMjEsNyBAQAogCSAqIEF0b21pYyBsb29rdXAgaXMgZmFzdGVyICYgdXN1YWxseSB3b3JrcyBldmVuIGlmIGNhbGxlZCBpbiBub24tYXRvbWljCiAJICogY29udGV4dC4KIAkgKi8KKwlybWIoKTsJLyogTXVzdC9jaGVjayBtc19yYW5nZV9hY3RpdmUgYmVmb3JlIGxvYWRpbmcgUFRFcyAqLwogCXJldCA9IGF0b21pY19wdGVfbG9va3VwKHZtYSwgdmFkZHIsIHdyaXRlLCAmcGFkZHIsICZwYWdlc2hpZnQpOwogCWlmIChyZXQpIHsKIAkJaWYgKCFjYikKQEAgLTU0Myw2ICs1NDEsNyBAQAogCQl1Y2JudW0gPSBnZXRfY2JfbnVtYmVyKCh2b2lkICopZXhjZGV0LmNiKTsKIAkJY2JybnVtID0gdGhyZWFkX2Nicl9udW1iZXIoZ3RzLCB1Y2JudW0pOwogCQljYmUgPSBnZXRfY2JlX2J5X2luZGV4KGd0cy0+dHNfZ3J1LCBjYnJudW0pOworCQlwcmVmZXRjaHcoY2JlKTsJCS8qIEhhcm1sZXNzIG9uIGhhcmR3YXJlLCByZXF1aXJlZCBmb3IgZW11bGF0b3IgKi8KIAkJZXhjZGV0Lm9wYyA9IGNiZS0+b3BjY3B5OwogCQlleGNkZXQuZXhvcGMgPSBjYmUtPmV4b3BjY3B5OwogCQlleGNkZXQuZWNhdXNlID0gY2JlLT5lY2F1c2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmaWxlLmMgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVmaWxlLmMKaW5kZXggMjNjOTFmNS4uNWMwMjdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1ZmlsZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWZpbGUuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAodm1hLT52bV9zdGFydCAmIChHUlVfR1NFR19QQUdFU0laRSAtIDEpIHx8Ci0JCQl2bWEtPnZtX2VuZCAmIChHUlVfR1NFR19QQUdFU0laRSAtIDEpKQorCSAgICAJCQl2bWEtPnZtX2VuZCAmIChHUlVfR1NFR19QQUdFU0laRSAtIDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZtYS0+dm1fZmxhZ3MgfD0KQEAgLTM5OCw2ICszOTgsMTIgQEAKIAlpcnEgPSBnZXRfYmFzZV9pcnEoKTsKIAlmb3IgKGNoaXAgPSAwOyBjaGlwIDwgR1JVX0NISVBMRVRTX1BFUl9CTEFERTsgY2hpcCsrKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGlycSArIGNoaXAsIGdydV9pbnRyLCAwLCBpZCwgTlVMTCk7CisJCS8qIFRPRE86IGZpeCBpcnEgaGFuZGxpbmcgb24geDg2LiBGb3Igbm93IGlnbm9yZSBmYWlsdXJlcyBiZWNhdXNlCisJCSAqIGludGVycnVwdHMgYXJlIG5vdCByZXF1aXJlZCAmIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkICovCisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiISEhV0FSTklORzogR1JVIGlnbm9yaW5nIHJlcXVlc3QgZmFpbHVyZSEhIVxuIik7CisJCQlyZXQgPSAwOworCQl9CiAJCWlmIChyZXQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwKIAkJCSAgICAgICBHUlVfRFJJVkVSX0lEX1NUUik7CkBAIC00NDUsNiArNDUxLDkgQEAKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBncnVfc3RhdGUpICoKIAkJCSAgICAgIEdSVV9DSElQTEVUU19QRVJfQkxBREUpOwogCisJaWYgKCFJU19VVigpKQorCQlyZXR1cm47CisKIAlmb3IgKGkgPSAwOyBpIDwgR1JVX0NISVBMRVRTX1BFUl9CTEFERTsgaSsrKQogCQlmcmVlX2lycShJUlFfR1JVICsgaSwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWhhbmRsZXMuaCBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWhhbmRsZXMuaAppbmRleCBkMTYwMzFkLi5iNjMwMThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVoYW5kbGVzLmgKKysrIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1aGFuZGxlcy5oCkBAIC05MSwxMiArOTEsNyBAQAogI2RlZmluZSBHU0VHUE9GRihoKSAJCSgoaCkgJiAoR1JVX1NJWkUgLSAxKSkKIAogLyogQ29udmVydCBhbiBhcmJpdHJhcnkgaGFuZGxlIGFkZHJlc3MgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgR1JVIHNlZ21lbnQgKi8KLSNpZm5kZWYgX19QTFVHSU5fXwogI2RlZmluZSBHUlVCQVNFKGgpCQkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGgpICYgfihHUlVfU0laRSAtIDEpKSkKLSNlbHNlCi1leHRlcm4gdm9pZCAqZ211X2dydWJhc2Uodm9pZCAqaCk7Ci0jZGVmaW5lIEdSVUJBU0UoaCkJCWdtdV9ncnViYXNlKGgpCi0jZW5kaWYKIAogLyogR2VuZXJhbCBhZGRyZXNzaW5nIG1hY3Jvcy4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2dzZWdfYmFzZV9hZGRyZXNzKHZvaWQgKmJhc2UsIGludCBjdHhudW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCmluZGV4IGRmZDQ5YWYuLjg4MGM1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCkBAIC0xMjIsNiArMTIyLDcgQEAKIAlzdHJ1Y3QgZ3J1X2NvbnRyb2xfYmxvY2tfZXh0ZW5kZWQgKmNiZTsKIAogCWNiZSA9IGdldF9jYmUoR1JVQkFTRShjYiksIGdldF9jYl9udW1iZXIoY2IpKTsKKwlwcmVmZXRjaHcoY2JlKTsgICAgICAgICAvKiBIYXJtbGVzcyBvbiBoYXJkd2FyZSwgcmVxdWlyZWQgZm9yIGVtdWxhdG9yICovCiAJZXhjZGV0LT5vcGMgPSBjYmUtPm9wY2NweTsKIAlleGNkZXQtPmV4b3BjID0gY2JlLT5leG9wY2NweTsKIAlleGNkZXQtPmVjYXVzZSA9IGNiZS0+ZWNhdXNlOwpAQCAtNDY2LDcgKzQ2Nyw3IEBACiAJU1RBVChtZXNxX3NlbmQpOwogCUJVR19PTihieXRlcyA8IHNpemVvZihpbnQpIHx8IGJ5dGVzID4gMiAqIEdSVV9DQUNIRV9MSU5FX0JZVEVTKTsKIAotCWNsaW5lcyA9IChieXRlcyArIEdSVV9DQUNIRV9MSU5FX0JZVEVTIC0gMSkgLyBHUlVfQ0FDSEVfTElORV9CWVRFUzsKKwljbGluZXMgPSBESVZfUk9VTkRfVVAoYnl0ZXMsIEdSVV9DQUNIRV9MSU5FX0JZVEVTKTsKIAlpZiAoZ3J1X2dldF9jcHVfcmVzb3VyY2VzKGJ5dGVzLCAmY2IsICZkc3IpKQogCQlyZXR1cm4gTVFFX0JVR19OT19SRVNPVVJDRVM7CiAJbWVtY3B5KGRzciwgbWVzZywgYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jCmluZGV4IDBlZWI4ZGQuLmUxMWUxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVtYWluLmMKQEAgLTQzMiw3ICs0MzIsMjIgQEAKIAlyZXR1cm4gR1JVX0hBTkRMRV9CWVRFUzsKIH0KIAotLyogcmV3cml0ZSBpbiBhc3NlbWJseSAmIHVzZSBsb3RzIG9mIHByZWZldGNoICovCitzdGF0aWMgdm9pZCBncnVfcHJlZmV0Y2hfY29udGV4dCh2b2lkICpnc2VnLCB2b2lkICpjYiwgdm9pZCAqY2JlLCB1bnNpZ25lZCBsb25nIGNicm1hcCwKKwkJCQl1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlpbnQgaSwgc2NyOworCisJcHJlZmV0Y2hfZGF0YShnc2VnICsgR1JVX0RTX0JBU0UsIGxlbmd0aCAvIEdSVV9DQUNIRV9MSU5FX0JZVEVTLAorCQkgICAgICBHUlVfQ0FDSEVfTElORV9CWVRFUyk7CisKKwlmb3JfZWFjaF9jYnJfaW5fYWxsb2NhdGlvbl9tYXAoaSwgJmNicm1hcCwgc2NyKSB7CisJCXByZWZldGNoX2RhdGEoY2IsIDEsIEdSVV9DQUNIRV9MSU5FX0JZVEVTKTsKKwkJcHJlZmV0Y2hfZGF0YShjYmUgKyBpICogR1JVX0hBTkRMRV9TVFJJREUsIDEsCisJCQkgICAgICBHUlVfQ0FDSEVfTElORV9CWVRFUyk7CisJCWNiICs9IEdSVV9IQU5ETEVfU1RSSURFOworCX0KK30KKwogc3RhdGljIHZvaWQgZ3J1X2xvYWRfY29udGV4dF9kYXRhKHZvaWQgKnNhdmUsIHZvaWQgKmdydWJhc2UsIGludCBjdHhudW0sCiAJCQkJICB1bnNpZ25lZCBsb25nIGNicm1hcCwgdW5zaWduZWQgbG9uZyBkc3JtYXApCiB7CkBAIC00NDEsMjAgKzQ1NiwxMSBAQAogCWludCBpLCBzY3I7CiAKIAlnc2VnID0gZ3J1YmFzZSArIGN0eG51bSAqIEdSVV9HU0VHX1NUUklERTsKLQlsZW5ndGggPSBod2VpZ2h0NjQoZHNybWFwKSAqIEdSVV9EU1JfQVVfQllURVM7Ci0JcHJlZmV0Y2hfZGF0YShnc2VnICsgR1JVX0RTX0JBU0UsIGxlbmd0aCAvIEdSVV9DQUNIRV9MSU5FX0JZVEVTLAotCQkgICAgICBHUlVfQ0FDSEVfTElORV9CWVRFUyk7Ci0KIAljYiA9IGdzZWcgKyBHUlVfQ0JfQkFTRTsKIAljYmUgPSBncnViYXNlICsgR1JVX0NCRV9CQVNFOwotCWZvcl9lYWNoX2Nicl9pbl9hbGxvY2F0aW9uX21hcChpLCAmY2JybWFwLCBzY3IpIHsKLQkJcHJlZmV0Y2hfZGF0YShjYiwgMSwgR1JVX0NBQ0hFX0xJTkVfQllURVMpOwotCQlwcmVmZXRjaF9kYXRhKGNiZSArIGkgKiBHUlVfSEFORExFX1NUUklERSwgMSwKLQkJCSAgICAgIEdSVV9DQUNIRV9MSU5FX0JZVEVTKTsKLQkJY2IgKz0gR1JVX0hBTkRMRV9TVFJJREU7Ci0JfQorCWxlbmd0aCA9IGh3ZWlnaHQ2NChkc3JtYXApICogR1JVX0RTUl9BVV9CWVRFUzsKKwlncnVfcHJlZmV0Y2hfY29udGV4dChnc2VnLCBjYiwgY2JlLCBjYnJtYXAsIGxlbmd0aCk7CiAKLQljYiA9IGdzZWcgKyBHUlVfQ0JfQkFTRTsKIAlmb3JfZWFjaF9jYnJfaW5fYWxsb2NhdGlvbl9tYXAoaSwgJmNicm1hcCwgc2NyKSB7CiAJCXNhdmUgKz0gZ3J1X2NvcHlfaGFuZGxlKGNiLCBzYXZlKTsKIAkJc2F2ZSArPSBncnVfY29weV9oYW5kbGUoY2JlICsgaSAqIEdSVV9IQU5ETEVfU1RSSURFLCBzYXZlKTsKQEAgLTQ3MiwxNSArNDc4LDE2IEBACiAJaW50IGksIHNjcjsKIAogCWdzZWcgPSBncnViYXNlICsgY3R4bnVtICogR1JVX0dTRUdfU1RSSURFOwotCiAJY2IgPSBnc2VnICsgR1JVX0NCX0JBU0U7CiAJY2JlID0gZ3J1YmFzZSArIEdSVV9DQkVfQkFTRTsKKwlsZW5ndGggPSBod2VpZ2h0NjQoZHNybWFwKSAqIEdSVV9EU1JfQVVfQllURVM7CisJZ3J1X3ByZWZldGNoX2NvbnRleHQoZ3NlZywgY2IsIGNiZSwgY2JybWFwLCBsZW5ndGgpOworCiAJZm9yX2VhY2hfY2JyX2luX2FsbG9jYXRpb25fbWFwKGksICZjYnJtYXAsIHNjcikgewogCQlzYXZlICs9IGdydV9jb3B5X2hhbmRsZShzYXZlLCBjYik7CiAJCXNhdmUgKz0gZ3J1X2NvcHlfaGFuZGxlKHNhdmUsIGNiZSArIGkgKiBHUlVfSEFORExFX1NUUklERSk7CiAJCWNiICs9IEdSVV9IQU5ETEVfU1RSSURFOwogCX0KLQlsZW5ndGggPSBod2VpZ2h0NjQoZHNybWFwKSAqIEdSVV9EU1JfQVVfQllURVM7CiAJbWVtY3B5KHNhdmUsIGdzZWcgKyBHUlVfRFNfQkFTRSwgbGVuZ3RoKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL0tjb25maWcKaW5kZXggYzBiNDFlOC4uZjJlZWIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9LY29uZmlnCkBAIC0zLDEzICszLDE0IEBACiAjCiAKIG1lbnVjb25maWcgTU1DCi0JdHJpc3RhdGUgIk1NQy9TRCBjYXJkIHN1cHBvcnQiCisJdHJpc3RhdGUgIk1NQy9TRC9TRElPIGNhcmQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQogCWhlbHAKLQkgIE1NQyBpcyB0aGUgIm11bHRpLW1lZGlhIGNhcmQiIGJ1cyBwcm90b2NvbC4KKwkgIFRoaXMgc2VsZWN0cyBNdWx0aU1lZGlhQ2FyZCwgU2VjdXJlIERpZ2l0YWwgYW5kIFNlY3VyZQorCSAgRGlnaXRhbCBJL08gc3VwcG9ydC4KIAotCSAgSWYgeW91IHdhbnQgTU1DIHN1cHBvcnQsIHlvdSBzaG91bGQgc2F5IFkgaGVyZSBhbmQgYWxzbwotCSAgdG8gdGhlIHNwZWNpZmljIGRyaXZlciBmb3IgeW91ciBNTUMgaW50ZXJmYWNlLgorCSAgSWYgeW91IHdhbnQgTU1DL1NEL1NESU8gc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZAorCSAgYWxzbyB0byB5b3VyIHNwZWNpZmljIGhvc3QgY29udHJvbGxlciBkcml2ZXIuCiAKIGNvbmZpZyBNTUNfREVCVUcKIAlib29sICJNTUMgZGVidWdnaW5nIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9LY29uZmlnIGIvZHJpdmVycy9tbWMvY2FyZC9LY29uZmlnCmluZGV4IGRkMGYzOTguLjNmMmE5MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9jYXJkL0tjb25maWcKQEAgLTIsNyArMiw3IEBACiAjIE1NQy9TRCBjYXJkIGRyaXZlcnMKICMKIAotY29tbWVudCAiTU1DL1NEIENhcmQgRHJpdmVycyIKK2NvbW1lbnQgIk1NQy9TRC9TRElPIENhcmQgRHJpdmVycyIKIAogY29uZmlnIE1NQ19CTE9DSwogCXRyaXN0YXRlICJNTUMgYmxvY2sgZGV2aWNlIGRyaXZlciIKQEAgLTM0LDcgKzM0LDYgQEAKIAogY29uZmlnIFNESU9fVUFSVAogCXRyaXN0YXRlICJTRElPIFVBUlQvR1BTIGNsYXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNTUMKIAloZWxwCiAJICBTRElPIGZ1bmN0aW9uIGRyaXZlciBmb3IgU0RJTyBjYXJkcyB0aGF0IGltcGxlbWVudHMgdGhlIFVBUlQKIAkgIGNsYXNzLCBhcyB3ZWxsIGFzIHRoZSBHUFMgY2xhc3Mgd2hpY2ggYXBwZWFycyBsaWtlIGEgVUFSVC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCA2OTg2ZjM5Li4yNGM5N2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ19oZWxwZXJzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CkBAIC01Nyw3ICs1OCw2IEBACiAJc3RydWN0IG1tY19xdWV1ZSBxdWV1ZTsKIAogCXVuc2lnbmVkIGludAl1c2FnZTsKLQl1bnNpZ25lZCBpbnQJYmxvY2tfYml0czsKIAl1bnNpZ25lZCBpbnQJcmVhZF9vbmx5OwogfTsKIApAQCAtODMsNyArODMsNyBAQAogCW11dGV4X2xvY2soJm9wZW5fbG9jayk7CiAJbWQtPnVzYWdlLS07CiAJaWYgKG1kLT51c2FnZSA9PSAwKSB7Ci0JCWludCBkZXZpZHggPSBtZC0+ZGlzay0+Zmlyc3RfbWlub3IgPj4gTU1DX1NISUZUOworCQlpbnQgZGV2aWR4ID0gTUlOT1IoZGlza19kZXZ0KG1kLT5kaXNrKSkgPj4gTU1DX1NISUZUOwogCQlfX2NsZWFyX2JpdChkZXZpZHgsIGRldl91c2UpOwogCiAJCXB1dF9kaXNrKG1kLT5kaXNrKTsKQEAgLTIxNSw4ICsyMTUsNyBAQAogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kID0gbXEtPmRhdGE7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gbWQtPnF1ZXVlLmNhcmQ7CiAJc3RydWN0IG1tY19ibGtfcmVxdWVzdCBicnE7Ci0JaW50IHJldCA9IDEsIGRhdGFfc2l6ZSwgaTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCByZXQgPSAxOwogCiAJbW1jX2NsYWltX2hvc3QoY2FyZC0+aG9zdCk7CiAKQEAgLTIzMiwxMyArMjMxLDExIEBACiAJCWlmICghbW1jX2NhcmRfYmxvY2thZGRyKGNhcmQpKQogCQkJYnJxLmNtZC5hcmcgPDw9IDk7CiAJCWJycS5jbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMSB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7Ci0JCWJycS5kYXRhLmJsa3N6ID0gMSA8PCBtZC0+YmxvY2tfYml0czsKKwkJYnJxLmRhdGEuYmxrc3ogPSA1MTI7CiAJCWJycS5zdG9wLm9wY29kZSA9IE1NQ19TVE9QX1RSQU5TTUlTU0lPTjsKIAkJYnJxLnN0b3AuYXJnID0gMDsKIAkJYnJxLnN0b3AuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMUIgfCBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7Ci0JCWJycS5kYXRhLmJsb2NrcyA9IHJlcS0+bnJfc2VjdG9ycyA+PiAobWQtPmJsb2NrX2JpdHMgLSA5KTsKLQkJaWYgKGJycS5kYXRhLmJsb2NrcyA+IGNhcmQtPmhvc3QtPm1heF9ibGtfY291bnQpCi0JCQlicnEuZGF0YS5ibG9ja3MgPSBjYXJkLT5ob3N0LT5tYXhfYmxrX2NvdW50OworCQlicnEuZGF0YS5ibG9ja3MgPSByZXEtPm5yX3NlY3RvcnM7CiAKIAkJaWYgKGJycS5kYXRhLmJsb2NrcyA+IDEpIHsKIAkJCS8qIFNQSSBtdWx0aWJsb2NrIHdyaXRlcyB0ZXJtaW5hdGUgdXNpbmcgYSBzcGVjaWFsCkBAIC0yNzAsMjQgKzI2Nyw2IEBACiAKIAkJbW1jX3F1ZXVlX2JvdW5jZV9wcmUobXEpOwogCi0JCS8qCi0JCSAqIEFkanVzdCB0aGUgc2cgbGlzdCBzbyBpdCBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZQotCQkgKiByZXF1ZXN0LgotCQkgKi8KLQkJaWYgKGJycS5kYXRhLmJsb2NrcyAhPQotCQkgICAgKHJlcS0+bnJfc2VjdG9ycyA+PiAobWQtPmJsb2NrX2JpdHMgLSA5KSkpIHsKLQkJCWRhdGFfc2l6ZSA9IGJycS5kYXRhLmJsb2NrcyAqIGJycS5kYXRhLmJsa3N6OwotCQkJZm9yX2VhY2hfc2coYnJxLmRhdGEuc2csIHNnLCBicnEuZGF0YS5zZ19sZW4sIGkpIHsKLQkJCQlkYXRhX3NpemUgLT0gc2ctPmxlbmd0aDsKLQkJCQlpZiAoZGF0YV9zaXplIDw9IDApIHsKLQkJCQkJc2ctPmxlbmd0aCArPSBkYXRhX3NpemU7Ci0JCQkJCWkrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJxLmRhdGEuc2dfbGVuID0gaTsKLQkJfQotCiAJCW1tY193YWl0X2Zvcl9yZXEoY2FyZC0+aG9zdCwgJmJycS5tcnEpOwogCiAJCW1tY19xdWV1ZV9ib3VuY2VfcG9zdChtcSk7CkBAIC0zNzIsMTYgKzM1MSwxMSBAQAogCWlmIChycV9kYXRhX2RpcihyZXEpICE9IFJFQUQpIHsKIAkJaWYgKG1tY19jYXJkX3NkKGNhcmQpKSB7CiAJCQl1MzIgYmxvY2tzOwotCQkJdW5zaWduZWQgaW50IGJ5dGVzOwogCiAJCQlibG9ja3MgPSBtbWNfc2RfbnVtX3dyX2Jsb2NrcyhjYXJkKTsKIAkJCWlmIChibG9ja3MgIT0gKHUzMiktMSkgewotCQkJCWlmIChjYXJkLT5jc2Qud3JpdGVfcGFydGlhbCkKLQkJCQkJYnl0ZXMgPSBibG9ja3MgPDwgbWQtPmJsb2NrX2JpdHM7Ci0JCQkJZWxzZQotCQkJCQlieXRlcyA9IGJsb2NrcyA8PCA5OwogCQkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKLQkJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJ5dGVzKTsKKwkJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJsb2NrcyA8PCA5KTsKIAkJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTQzMSwxMyArNDA1LDYgQEAKIAkgKi8KIAltZC0+cmVhZF9vbmx5ID0gbW1jX2Jsa19yZWFkb25seShjYXJkKTsKIAotCS8qCi0JICogQm90aCBTRCBhbmQgTU1DIHNwZWNpZmljYXRpb25zIHN0YXRlIChhbHRob3VnaCBhIGJpdAotCSAqIHVuY2xlYXJseSBpbiB0aGUgTU1DIGNhc2UpIHRoYXQgYSBibG9jayBzaXplIG9mIDUxMgotCSAqIGJ5dGVzIG11c3QgYWx3YXlzIGJlIHN1cHBvcnRlZCBieSB0aGUgY2FyZC4KLQkgKi8KLQltZC0+YmxvY2tfYml0cyA9IDk7Ci0KIAltZC0+ZGlzayA9IGFsbG9jX2Rpc2soMSA8PCBNTUNfU0hJRlQpOwogCWlmIChtZC0+ZGlzayA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC00NzUsNyArNDQyLDcgQEAKIAogCXNwcmludGYobWQtPmRpc2stPmRpc2tfbmFtZSwgIm1tY2JsayVkIiwgZGV2aWR4KTsKIAotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKG1kLT5xdWV1ZS5xdWV1ZSwgMSA8PCBtZC0+YmxvY2tfYml0cyk7CisJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUobWQtPnF1ZXVlLnF1ZXVlLCA1MTIpOwogCiAJaWYgKCFtbWNfY2FyZF9zZChjYXJkKSAmJiBtbWNfY2FyZF9ibG9ja2FkZHIoY2FyZCkpIHsKIAkJLyoKQEAgLTUxMyw3ICs0ODAsNyBAQAogCiAJbW1jX2NsYWltX2hvc3QoY2FyZC0+aG9zdCk7CiAJY21kLm9wY29kZSA9IE1NQ19TRVRfQkxPQ0tMRU47Ci0JY21kLmFyZyA9IDEgPDwgbWQtPmJsb2NrX2JpdHM7CisJY21kLmFyZyA9IDUxMjsKIAljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMSB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOwogCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgNSk7CiAJbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKQEAgLTUzMiw2ICs0OTksOCBAQAogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kOwogCWludCBlcnI7CiAKKwljaGFyIGNhcF9zdHJbMTBdOworCiAJLyoKIAkgKiBDaGVjayB0aGF0IHRoZSBjYXJkIHN1cHBvcnRzIHRoZSBjb21tYW5kIGNsYXNzKGVzKSB3ZSBuZWVkLgogCSAqLwpAQCAtNTQ2LDEwICs1MTUsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyAlbGx1S2lCICVzXG4iLAorCXN0cmluZ19nZXRfc2l6ZShnZXRfY2FwYWNpdHkobWQtPmRpc2spIDw8IDksIFNUUklOR19VTklUU18yLAorCQkJY2FwX3N0ciwgc2l6ZW9mKGNhcF9zdHIpKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgJXMgJXMgJXNcbiIsCiAJCW1kLT5kaXNrLT5kaXNrX25hbWUsIG1tY19jYXJkX2lkKGNhcmQpLCBtbWNfY2FyZF9uYW1lKGNhcmQpLAotCQkodW5zaWduZWQgbG9uZyBsb25nKShnZXRfY2FwYWNpdHkobWQtPmRpc2spID4+IDEpLAotCQltZC0+cmVhZF9vbmx5ID8gIihybykiIDogIiIpOworCQljYXBfc3RyLCBtZC0+cmVhZF9vbmx5ID8gIihybykiIDogIiIpOwogCiAJbW1jX3NldF9kcnZkYXRhKGNhcmQsIG1kKTsKIAlhZGRfZGlzayhtZC0+ZGlzayk7CkBAIC02MTUsMTQgKzU4NSwxOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtbWNfYmxrX2luaXQodm9pZCkKIHsKLQlpbnQgcmVzID0gLUVOT01FTTsKKwlpbnQgcmVzOwogCiAJcmVzID0gcmVnaXN0ZXJfYmxrZGV2KE1NQ19CTE9DS19NQUpPUiwgIm1tYyIpOwogCWlmIChyZXMpCiAJCWdvdG8gb3V0OwogCi0JcmV0dXJuIG1tY19yZWdpc3Rlcl9kcml2ZXIoJm1tY19kcml2ZXIpOworCXJlcyA9IG1tY19yZWdpc3Rlcl9kcml2ZXIoJm1tY19kcml2ZXIpOworCWlmIChyZXMpCisJCWdvdG8gb3V0MjsKIAorCXJldHVybiAwOworIG91dDI6CisJdW5yZWdpc3Rlcl9ibGtkZXYoTU1DX0JMT0NLX01BSk9SLCAibW1jIik7CiAgb3V0OgogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMgYi9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKaW5kZXggZjI2YjAxZC4uYjkyYjE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYwpAQCAtMTA0MCw3ICsxMDQwLDcgQEAKIAogfTsKIAotc3RhdGljIHN0cnVjdCBtdXRleCBtbWNfdGVzdF9sb2NrOworc3RhdGljIERFRklORV9NVVRFWChtbWNfdGVzdF9sb2NrKTsKIAogc3RhdGljIHZvaWQgbW1jX3Rlc3RfcnVuKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0LCBpbnQgdGVzdGNhc2UpCiB7CkBAIC0xMTcxLDggKzExNzEsNiBAQAogCWlmICgoY2FyZC0+dHlwZSAhPSBNTUNfVFlQRV9NTUMpICYmIChjYXJkLT50eXBlICE9IE1NQ19UWVBFX1NEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQltdXRleF9pbml0KCZtbWNfdGVzdF9sb2NrKTsKLQogCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2FyZC0+ZGV2LCAmZGV2X2F0dHJfdGVzdCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCAzZGVlOTdlLi40MDY5ODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0zMSw3ICszMSw3IEBACiAJLyoKIAkgKiBXZSBvbmx5IGxpa2Ugbm9ybWFsIGJsb2NrIHJlcXVlc3RzLgogCSAqLwotCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSAmJiAhYmxrX3BjX3JlcXVlc3QocmVxKSkgeworCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSkgewogCQlibGtfZHVtcF9ycV9mbGFncyhyZXEsICJNTUMgYmFkIHJlcXVlc3QiKTsKIAkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKIAl9CkBAIC0xMzEsNiArMTMxLDcgQEAKIAltcS0+cmVxID0gTlVMTDsKIAogCWJsa19xdWV1ZV9wcmVwX3JxKG1xLT5xdWV1ZSwgbW1jX3ByZXBfcmVxdWVzdCk7CisJYmxrX3F1ZXVlX29yZGVyZWQobXEtPnF1ZXVlLCBRVUVVRV9PUkRFUkVEX0RSQUlOLCBOVUxMKTsKIAogI2lmZGVmIENPTkZJR19NTUNfQkxPQ0tfQk9VTkNFCiAJaWYgKGhvc3QtPm1heF9od19zZWdzID09IDEpIHsKQEAgLTE0MiwxMiArMTQzLDE5IEBACiAJCQlib3VuY2VzeiA9IGhvc3QtPm1heF9yZXFfc2l6ZTsKIAkJaWYgKGJvdW5jZXN6ID4gaG9zdC0+bWF4X3NlZ19zaXplKQogCQkJYm91bmNlc3ogPSBob3N0LT5tYXhfc2VnX3NpemU7CisJCWlmIChib3VuY2VzeiA+IChob3N0LT5tYXhfYmxrX2NvdW50ICogNTEyKSkKKwkJCWJvdW5jZXN6ID0gaG9zdC0+bWF4X2Jsa19jb3VudCAqIDUxMjsKIAotCQltcS0+Ym91bmNlX2J1ZiA9IGttYWxsb2MoYm91bmNlc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIW1xLT5ib3VuY2VfYnVmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGFsbG9jYXRlICIKLQkJCQkiYm91bmNlIGJ1ZmZlclxuIiwgbW1jX2NhcmRfbmFtZShjYXJkKSk7Ci0JCX0gZWxzZSB7CisJCWlmIChib3VuY2VzeiA+IDUxMikgeworCQkJbXEtPmJvdW5jZV9idWYgPSBrbWFsbG9jKGJvdW5jZXN6LCBHRlBfS0VSTkVMKTsKKwkJCWlmICghbXEtPmJvdW5jZV9idWYpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvICIKKwkJCQkJImFsbG9jYXRlIGJvdW5jZSBidWZmZXJcbiIsCisJCQkJCW1tY19jYXJkX25hbWUoY2FyZCkpOworCQkJfQorCQl9CisKKwkJaWYgKG1xLT5ib3VuY2VfYnVmKSB7CiAJCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KG1xLT5xdWV1ZSwgQkxLX0JPVU5DRV9BTlkpOwogCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1xLT5xdWV1ZSwgYm91bmNlc3ogLyA1MTIpOwogCQkJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKG1xLT5xdWV1ZSwgYm91bmNlc3ogLyA1MTIpOwpAQCAtMTc1LDcgKzE4Myw4IEBACiAKIAlpZiAoIW1xLT5ib3VuY2VfYnVmKSB7CiAJCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQobXEtPnF1ZXVlLCBsaW1pdCk7Ci0JCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtcS0+cXVldWUsIGhvc3QtPm1heF9yZXFfc2l6ZSAvIDUxMik7CisJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtcS0+cXVldWUsCisJCQltaW4oaG9zdC0+bWF4X2Jsa19jb3VudCwgaG9zdC0+bWF4X3JlcV9zaXplIC8gNTEyKSk7CiAJCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhtcS0+cXVldWUsIGhvc3QtPm1heF9waHlzX3NlZ3MpOwogCQlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKG1xLT5xdWV1ZSwgaG9zdC0+bWF4X2h3X3NlZ3MpOwogCQlibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShtcS0+cXVldWUsIGhvc3QtPm1heF9zZWdfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCmluZGV4IDY0YjA1YzYuLjljNTBlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCkBAIC0yNDgsOCArMjQ4LDEyIEBACiAKIAlzZ19pbml0X29uZSgmc2csIGRhdGFfYnVmLCBsZW4pOwogCi0JaWYgKGNhcmQpCi0JCW1tY19zZXRfZGF0YV90aW1lb3V0KCZkYXRhLCBjYXJkKTsKKwkvKgorCSAqIFRoZSBzcGVjIHN0YXRlcyB0aGF0IENTUiBhbmQgQ0lEIGFjY2Vzc2VzIGhhdmUgYSB0aW1lb3V0CisJICogb2YgNjQgY2xvY2sgY3ljbGVzLgorCSAqLworCWRhdGEudGltZW91dF9ucyA9IDA7CisJZGF0YS50aW1lb3V0X2Nsa3MgPSA2NDsKIAogCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggNGVhYjc5ZS4uZmI5OWNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTE2NSw2ICsxNjUsMzYgQEAKIH0KIAogLyoKKyAqIFRlc3QgaWYgdGhlIGNhcmQgc3VwcG9ydHMgaGlnaC1zcGVlZCBtb2RlIGFuZCwgaWYgc28sIHN3aXRjaCB0byBpdC4KKyAqLworc3RhdGljIGludCBzZGlvX2VuYWJsZV9ocyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJaW50IHJldDsKKwl1OCBzcGVlZDsKKworCWlmICghKGNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1NEX0hJR0hTUEVFRCkpCisJCXJldHVybiAwOworCisJaWYgKCFjYXJkLT5jY2NyLmhpZ2hfc3BlZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gbW1jX2lvX3J3X2RpcmVjdChjYXJkLCAwLCAwLCBTRElPX0NDQ1JfU1BFRUQsIDAsICZzcGVlZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNwZWVkIHw9IFNESU9fU1BFRURfRUhTOworCisJcmV0ID0gbW1jX2lvX3J3X2RpcmVjdChjYXJkLCAxLCAwLCBTRElPX0NDQ1JfU1BFRUQsIHNwZWVkLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbW1jX2NhcmRfc2V0X2hpZ2hzcGVlZChjYXJkKTsKKwltbWNfc2V0X3RpbWluZyhjYXJkLT5ob3N0LCBNTUNfVElNSU5HX1NEX0hTKTsKKworCXJldHVybiAwOworfQorCisvKgogICogSG9zdCBpcyBiZWluZyByZW1vdmVkLiBGcmVlIHVwIHRoZSBjdXJyZW50IGNhcmQuCiAgKi8KIHN0YXRpYyB2b2lkIG1tY19zZGlvX3JlbW92ZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCkBAIC0zMzMsMTAgKzM2MywyNiBAQAogCQlnb3RvIHJlbW92ZTsKIAogCS8qCi0JICogTm8gc3VwcG9ydCBmb3IgaGlnaC1zcGVlZCB5ZXQsIHNvIGp1c3Qgc2V0Ci0JICogdGhlIGNhcmQncyBtYXhpbXVtIHNwZWVkLgorCSAqIFN3aXRjaCB0byBoaWdoLXNwZWVkIChpZiBzdXBwb3J0ZWQpLgogCSAqLwotCW1tY19zZXRfY2xvY2soaG9zdCwgY2FyZC0+Y2lzLm1heF9kdHIpOworCWVyciA9IHNkaW9fZW5hYmxlX2hzKGNhcmQpOworCWlmIChlcnIpCisJCWdvdG8gcmVtb3ZlOworCisJLyoKKwkgKiBDaGFuZ2UgdG8gdGhlIGNhcmQncyBtYXhpbXVtIHNwZWVkLgorCSAqLworCWlmIChtbWNfY2FyZF9oaWdoc3BlZWQoY2FyZCkpIHsKKwkJLyoKKwkJICogVGhlIFNESU8gc3BlY2lmaWNhdGlvbiBkb2Vzbid0IG1lbnRpb24gaG93CisJCSAqIHRoZSBDSVMgdHJhbnNmZXIgc3BlZWQgcmVnaXN0ZXIgcmVsYXRlcyB0bworCQkgKiBoaWdoLXNwZWVkLCBidXQgaXQgc2VlbXMgdGhhdCA1MCBNSHogaXMKKwkJICogbWFuZGF0b3J5LgorCQkgKi8KKwkJbW1jX3NldF9jbG9jayhob3N0LCA1MDAwMDAwMCk7CisJfSBlbHNlIHsKKwkJbW1jX3NldF9jbG9jayhob3N0LCBjYXJkLT5jaXMubWF4X2R0cik7CisJfQogCiAJLyoKIAkgKiBTd2l0Y2ggdG8gd2lkZXIgYnVzIChpZiBzdXBwb3J0ZWQpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lycS5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lycS5jCmluZGV4IGMyOTJlMTIuLmJiMTkyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pcnEuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faXJxLmMKQEAgLTUsNiArNSw4IEBACiAgKiBDcmVhdGVkOiAgICAgSnVuZSAxOCwgMjAwNwogICogQ29weXJpZ2h0OiAgIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgogICoKKyAqIENvcHlyaWdodCAyMDA4IFBpZXJyZSBPc3NtYW4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdApAQCAtMTA3LDExICsxMDksMTQgQEAKIAogCQkvKgogCQkgKiBHaXZlIG90aGVyIHRocmVhZHMgYSBjaGFuY2UgdG8gcnVuIGluIHRoZSBwcmVzZW5jZSBvZgotCQkgKiBlcnJvcnMuICBGSVhNRTogZGV0ZXJtaW5lIGlmIGR1ZSB0byBjYXJkIHJlbW92YWwgYW5kCi0JCSAqIHBvc3NpYmx5IGV4aXQgdGhpcyB0aHJlYWQgaWYgc28uCisJCSAqIGVycm9ycy4KIAkJICovCi0JCWlmIChyZXQgPCAwKQotCQkJc3NsZWVwKDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQogCiAJCS8qCiAJCSAqIEFkYXB0aXZlIHBvbGxpbmcgZnJlcXVlbmN5IGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uCkBAIC0xNTQsNyArMTU5LDggQEAKIAlpZiAoIWhvc3QtPnNkaW9faXJxcysrKSB7CiAJCWF0b21pY19zZXQoJmhvc3QtPnNkaW9faXJxX3RocmVhZF9hYm9ydCwgMCk7CiAJCWhvc3QtPnNkaW9faXJxX3RocmVhZCA9Ci0JCQlrdGhyZWFkX3J1bihzZGlvX2lycV90aHJlYWQsIGhvc3QsICJrc2Rpb3JxZCIpOworCQkJa3RocmVhZF9ydW4oc2Rpb19pcnFfdGhyZWFkLCBob3N0LCAia3NkaW9pcnFkLyVzIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdCkpOwogCQlpZiAoSVNfRVJSKGhvc3QtPnNkaW9faXJxX3RocmVhZCkpIHsKIAkJCWludCBlcnIgPSBQVFJfRVJSKGhvc3QtPnNkaW9faXJxX3RocmVhZCk7CiAJCQlob3N0LT5zZGlvX2lycXMtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCBlYThkN2EzLi5kZmE1ODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC0yLDcgKzIsNyBAQAogIyBNTUMvU0QgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKICMKIAotY29tbWVudCAiTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzIgorY29tbWVudCAiTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMiCiAKIGNvbmZpZyBNTUNfQVJNTU1DSQogCXRyaXN0YXRlICJBUk0gQU1CQSBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIHN1cHBvcnQiCkBAIC0xMTQsNiArMTE0LDE3IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNTUNfQVRNRUxNQ0lfRE1BCisJYm9vbCAiQXRtZWwgTUNJIERNQSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTU1DX0FUTUVMTUNJICYmIERNQV9FTkdJTkUgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBoYXZlIHRoZSBBdG1lbCBNQ0kgZHJpdmVyIHVzZSBhIERNQSBlbmdpbmUgdG8KKwkgIGRvIGRhdGEgdHJhbnNmZXJzIGFuZCB0aHVzIGluY3JlYXNlIHRoZSB0aHJvdWdocHV0IGFuZAorCSAgcmVkdWNlIHRoZSBDUFUgdXRpbGl6YXRpb24uIE5vdGUgdGhhdCB0aGlzIGlzIGhpZ2hseQorCSAgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2F1c2UgdGhlIGRyaXZlciB0byBsb2NrIHVwLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTU1DX0lNWAogCXRyaXN0YXRlICJNb3Rvcm9sYSBpLk1YIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfSU1YCkBAIC0xNDEsMjEgKzE1MiwyMiBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRpZm1fc2QuCiAKIGNvbmZpZyBNTUNfU1BJCi0JdHJpc3RhdGUgIk1NQy9TRCBvdmVyIFNQSSIKLQlkZXBlbmRzIG9uIE1NQyAmJiBTUElfTUFTVEVSICYmICFISUdITUVNICYmIEhBU19ETUEKKwl0cmlzdGF0ZSAiTU1DL1NEL1NESU8gb3ZlciBTUEkiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmICFISUdITUVNICYmIEhBU19ETUEKIAlzZWxlY3QgQ1JDNwogCXNlbGVjdCBDUkNfSVRVX1QKIAloZWxwCi0JICBTb21lIHN5c3RlbXMgYWNjc3MgTU1DL1NEIGNhcmRzIHVzaW5nIGEgU1BJIGNvbnRyb2xsZXIgaW5zdGVhZCBvZgotCSAgdXNpbmcgYSAibmF0aXZlIiBNTUMvU0QgY29udHJvbGxlci4gIFRoaXMgaGFzIGEgZGlzYWR2YW50YWdlIG9mCi0JICBiZWluZyByZWxhdGl2ZWx5IGhpZ2ggb3ZlcmhlYWQsIGJ1dCBhIGNvbXBlbnNhdGluZyBhZHZhbnRhZ2Ugb2YKLQkgIHdvcmtpbmcgb24gbWFueSBzeXN0ZW1zIHdpdGhvdXQgZGVkaWNhdGVkIE1NQy9TRCBjb250cm9sbGVycy4KKwkgIFNvbWUgc3lzdGVtcyBhY2NzcyBNTUMvU0QvU0RJTyBjYXJkcyB1c2luZyBhIFNQSSBjb250cm9sbGVyCisJICBpbnN0ZWFkIG9mIHVzaW5nIGEgIm5hdGl2ZSIgTU1DL1NEL1NESU8gY29udHJvbGxlci4gIFRoaXMgaGFzIGEKKwkgIGRpc2FkdmFudGFnZSBvZiBiZWluZyByZWxhdGl2ZWx5IGhpZ2ggb3ZlcmhlYWQsIGJ1dCBhIGNvbXBlbnNhdGluZworCSAgYWR2YW50YWdlIG9mIHdvcmtpbmcgb24gbWFueSBzeXN0ZW1zIHdpdGhvdXQgZGVkaWNhdGVkIE1NQy9TRC9TRElPCisJICBjb250cm9sbGVycy4KIAogCSAgSWYgdW5zdXJlLCBvciBpZiB5b3VyIHN5c3RlbSBoYXMgbm8gU1BJIG1hc3RlciBkcml2ZXIsIHNheSBOLgogCiBjb25maWcgTU1DX1MzQwogCXRyaXN0YXRlICJTYW1zdW5nIFMzQyBTRC9NTUMgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCAmJiBNTUMKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyBhIGRyaXZlciBmb3IgdGhlIE1DSSBpbnRlcmZhY2UgZm91bmQgaW4KICAgICAgICAgICBTYW1zdW5nJ3MgUzNDMjQxMCwgUzNDMjQxMiwgUzNDMjQ0MCwgUzNDMjQ0MiBDUFVzLgpAQCAtMTY2LDcgKzE3OCw3IEBACiAKIGNvbmZpZyBNTUNfU0RSSUNPSF9DUwogCXRyaXN0YXRlICJNTUMvU0QgZHJpdmVyIGZvciBSaWNvaCBCYXkxQ29udHJvbGxlcnMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTU1DICYmIFBDSSAmJiBQQ01DSUEKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQQ0kgJiYgUENNQ0lBCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3VyIE5vdGVib29rIHJlcG9ydHMgYSBSaWNvaCBCYXkxQ29udHJvbGxlciBQQ01DSUEKIAkgIGNhcmQgd2hlbmV2ZXIgeW91IGluc2VydCBhIE1NQyBvciBTRCBjYXJkIGludG8gdGhlIGNhcmQgc2xvdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaCBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaAppbmRleCAyNmJkODBlLi5iNTgzNjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS1yZWdzLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2ktcmVncy5oCkBAIC0yNSw4ICsyNSwxMCBAQAogI2RlZmluZSBNQ0lfU0RDUgkJMHgwMDBjCS8qIFNEIENhcmQgLyBTRElPICovCiAjIGRlZmluZSBNQ0lfU0RDU0VMX1NMT1RfQQkoICAwIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCiAjIGRlZmluZSBNQ0lfU0RDU0VMX1NMT1RfQgkoICAxIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCi0jIGRlZmluZSBNQ0lfU0RDQlVTXzFCSVQJKCAgMCA8PCAgNykJLyogMS1iaXQgZGF0YSBidXMgKi8KLSMgZGVmaW5lIE1DSV9TRENCVVNfNEJJVAkoICAxIDw8ICA3KQkvKiA0LWJpdCBkYXRhIGJ1cyAqLworIyBkZWZpbmUgTUNJX1NEQ1NFTF9NQVNLCSggIDMgPDwgIDApCisjIGRlZmluZSBNQ0lfU0RDQlVTXzFCSVQJKCAgMCA8PCAgNikJLyogMS1iaXQgZGF0YSBidXMgKi8KKyMgZGVmaW5lIE1DSV9TRENCVVNfNEJJVAkoICAyIDw8ICA2KQkvKiA0LWJpdCBkYXRhIGJ1cyAqLworIyBkZWZpbmUgTUNJX1NEQ0JVU19NQVNLCSggIDMgPDwgIDYpCiAjZGVmaW5lIE1DSV9BUkdSCQkweDAwMTAJLyogQ29tbWFuZCBBcmd1bWVudCAqLwogI2RlZmluZSBNQ0lfQ01EUgkJMHgwMDE0CS8qIENvbW1hbmQgKi8KICMgZGVmaW5lIE1DSV9DTURSX0NNRE5CKHgpCSgoeCkgPDwgIDApCS8qIENvbW1hbmQgT3Bjb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwppbmRleCAwYmQwNmY1Li43YTNmMjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzMsNjQgKzM1LDE3OCBAQAogI2luY2x1ZGUgImF0bWVsLW1jaS1yZWdzLmgiCiAKICNkZWZpbmUgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUwkoTUNJX0RDUkNFIHwgTUNJX0RUT0UgfCBNQ0lfT1ZSRSB8IE1DSV9VTlJFKQorI2RlZmluZSBBVE1DSV9ETUFfVEhSRVNIT0xECTE2CiAKIGVudW0gewogCUVWRU5UX0NNRF9DT01QTEVURSA9IDAsCi0JRVZFTlRfREFUQV9FUlJPUiwKLQlFVkVOVF9EQVRBX0NPTVBMRVRFLAotCUVWRU5UX1NUT1BfU0VOVCwKLQlFVkVOVF9TVE9QX0NPTVBMRVRFLAogCUVWRU5UX1hGRVJfQ09NUExFVEUsCisJRVZFTlRfREFUQV9DT01QTEVURSwKKwlFVkVOVF9EQVRBX0VSUk9SLAogfTsKIAorZW51bSBhdG1lbF9tY2lfc3RhdGUgeworCVNUQVRFX0lETEUgPSAwLAorCVNUQVRFX1NFTkRJTkdfQ01ELAorCVNUQVRFX1NFTkRJTkdfREFUQSwKKwlTVEFURV9EQVRBX0JVU1ksCisJU1RBVEVfU0VORElOR19TVE9QLAorCVNUQVRFX0RBVEFfRVJST1IsCit9OworCitzdHJ1Y3QgYXRtZWxfbWNpX2RtYSB7CisjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKKwlzdHJ1Y3QgZG1hX2NsaWVudAkJY2xpZW50OworCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGF0YV9kZXNjOworI2VuZGlmCit9OworCisvKioKKyAqIHN0cnVjdCBhdG1lbF9tY2kgLSBNTUMgY29udHJvbGxlciBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBhbGwgc2xvdHMKKyAqIEBsb2NrOiBTcGlubG9jayBwcm90ZWN0aW5nIHRoZSBxdWV1ZSBhbmQgYXNzb2NpYXRlZCBkYXRhLgorICogQHJlZ3M6IFBvaW50ZXIgdG8gTU1JTyByZWdpc3RlcnMuCisgKiBAc2c6IFNjYXR0ZXJsaXN0IGVudHJ5IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgYnkgUElPIGNvZGUsIGlmIGFueS4KKyAqIEBwaW9fb2Zmc2V0OiBPZmZzZXQgaW50byB0aGUgY3VycmVudCBzY2F0dGVybGlzdCBlbnRyeS4KKyAqIEBjdXJfc2xvdDogVGhlIHNsb3Qgd2hpY2ggaXMgY3VycmVudGx5IHVzaW5nIHRoZSBjb250cm9sbGVyLgorICogQG1ycTogVGhlIHJlcXVlc3QgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvbiBAY3VyX3Nsb3QsCisgKglvciBOVUxMIGlmIHRoZSBjb250cm9sbGVyIGlzIGlkbGUuCisgKiBAY21kOiBUaGUgY29tbWFuZCBjdXJyZW50bHkgYmVpbmcgc2VudCB0byB0aGUgY2FyZCwgb3IgTlVMTC4KKyAqIEBkYXRhOiBUaGUgZGF0YSBjdXJyZW50bHkgYmVpbmcgdHJhbnNmZXJyZWQsIG9yIE5VTEwgaWYgbm8gZGF0YQorICoJdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MuCisgKiBAZG1hOiBETUEgY2xpZW50IHN0YXRlLgorICogQGRhdGFfY2hhbjogRE1BIGNoYW5uZWwgYmVpbmcgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZGF0YSB0cmFuc2Zlci4KKyAqIEBjbWRfc3RhdHVzOiBTbmFwc2hvdCBvZiBTUiB0YWtlbiB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIGN1cnJlbnQKKyAqCWNvbW1hbmQuIE9ubHkgdmFsaWQgd2hlbiBFVkVOVF9DTURfQ09NUExFVEUgaXMgcGVuZGluZy4KKyAqIEBkYXRhX3N0YXR1czogU25hcHNob3Qgb2YgU1IgdGFrZW4gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50CisgKglkYXRhIHRyYW5zZmVyLiBPbmx5IHZhbGlkIHdoZW4gRVZFTlRfREFUQV9DT01QTEVURSBvcgorICoJRVZFTlRfREFUQV9FUlJPUiBpcyBwZW5kaW5nLgorICogQHN0b3BfY21kcjogVmFsdWUgdG8gYmUgbG9hZGVkIGludG8gQ01EUiB3aGVuIHRoZSBzdG9wIGNvbW1hbmQgaXMKKyAqCXRvIGJlIHNlbnQuCisgKiBAdGFza2xldDogVGFza2xldCBydW5uaW5nIHRoZSByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisgKiBAcGVuZGluZ19ldmVudHM6IEJpdG1hc2sgb2YgZXZlbnRzIGZsYWdnZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKgl0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2tsZXQuCisgKiBAY29tcGxldGVkX2V2ZW50czogQml0bWFzayBvZiBldmVudHMgd2hpY2ggdGhlIHN0YXRlIG1hY2hpbmUgaGFzCisgKglwcm9jZXNzZWQuCisgKiBAc3RhdGU6IFRhc2tsZXQgc3RhdGUuCisgKiBAcXVldWU6IExpc3Qgb2Ygc2xvdHMgd2FpdGluZyBmb3IgYWNjZXNzIHRvIHRoZSBjb250cm9sbGVyLgorICogQG5lZWRfY2xvY2tfdXBkYXRlOiBVcGRhdGUgdGhlIGNsb2NrIHJhdGUgYmVmb3JlIHRoZSBuZXh0IHJlcXVlc3QuCisgKiBAbmVlZF9yZXNldDogUmVzZXQgY29udHJvbGxlciBiZWZvcmUgbmV4dCByZXF1ZXN0LgorICogQG1vZGVfcmVnOiBWYWx1ZSBvZiB0aGUgTVIgcmVnaXN0ZXIuCisgKiBAYnVzX2h6OiBUaGUgcmF0ZSBvZiBAbWNrIGluIEh6LiBUaGlzIGZvcm1zIHRoZSBiYXNpcyBmb3IgTU1DIGJ1cworICoJcmF0ZSBhbmQgdGltZW91dCBjYWxjdWxhdGlvbnMuCisgKiBAbWFwYmFzZTogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1JTyByZWdpc3RlcnMuCisgKiBAbWNrOiBUaGUgcGVyaXBoZXJhbCBidXMgY2xvY2sgaG9va2VkIHVwIHRvIHRoZSBNTUMgY29udHJvbGxlci4KKyAqIEBwZGV2OiBQbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KKyAqIEBzbG90OiBTbG90cyBzaGFyaW5nIHRoaXMgTU1DIGNvbnRyb2xsZXIuCisgKgorICogTG9ja2luZworICogPT09PT09PQorICoKKyAqIEBsb2NrIGlzIGEgc29mdGlycS1zYWZlIHNwaW5sb2NrIHByb3RlY3RpbmcgQHF1ZXVlIGFzIHdlbGwgYXMKKyAqIEBjdXJfc2xvdCwgQG1ycSBhbmQgQHN0YXRlLiBUaGVzZSBtdXN0IGFsd2F5cyBiZSB1cGRhdGVkCisgKiBhdCB0aGUgc2FtZSB0aW1lIHdoaWxlIGhvbGRpbmcgQGxvY2suCisgKgorICogQGxvY2sgYWxzbyBwcm90ZWN0cyBtb2RlX3JlZyBhbmQgbmVlZF9jbG9ja191cGRhdGUgc2luY2UgdGhlc2UgYXJlCisgKiB1c2VkIHRvIHN5bmNocm9uaXplIG1vZGUgcmVnaXN0ZXIgdXBkYXRlcyB3aXRoIHRoZSBxdWV1ZQorICogcHJvY2Vzc2luZy4KKyAqCisgKiBUaGUgQG1ycSBmaWVsZCBvZiBzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgaXMgYWxzbyBwcm90ZWN0ZWQgYnkgQGxvY2ssCisgKiBhbmQgbXVzdCBhbHdheXMgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBzbG90IGlzIGFkZGVkIHRvCisgKiBAcXVldWUuCisgKgorICogQHBlbmRpbmdfZXZlbnRzIGFuZCBAY29tcGxldGVkX2V2ZW50cyBhcmUgYWNjZXNzZWQgdXNpbmcgYXRvbWljIGJpdAorICogb3BlcmF0aW9ucywgc28gdGhleSBkb24ndCBuZWVkIGFueSBsb2NraW5nLgorICoKKyAqIE5vbmUgb2YgdGhlIGZpZWxkcyB0b3VjaGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBuZWVkIGFueQorICogbG9ja2luZy4gSG93ZXZlciwgb3JkZXJpbmcgaXMgaW1wb3J0YW50OiBCZWZvcmUgRVZFTlRfREFUQV9FUlJPUiBvcgorICogRVZFTlRfREFUQV9DT01QTEVURSBpcyBzZXQgaW4gQHBlbmRpbmdfZXZlbnRzLCBhbGwgZGF0YS1yZWxhdGVkCisgKiBpbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgYW5kIEBkYXRhX3N0YXR1cyB1cGRhdGVkIHdpdGggYQorICogc25hcHNob3Qgb2YgU1IuIFNpbWlsYXJseSwgYmVmb3JlIEVWRU5UX0NNRF9DT01QTEVURSBpcyBzZXQsIHRoZQorICogQ01EUkRZIGludGVydXB0IG11c3QgYmUgZGlzYWJsZWQgYW5kIEBjbWRfc3RhdHVzIHVwZGF0ZWQgd2l0aCBhCisgKiBzbmFwc2hvdCBvZiBTUiwgYW5kIGJlZm9yZSBFVkVOVF9YRkVSX0NPTVBMRVRFIGNhbiBiZSBzZXQsIHRoZQorICogYnl0ZXNfeGZlcmVkIGZpZWxkIG9mIEBkYXRhIG11c3QgYmUgd3JpdHRlbi4gVGhpcyBpcyBlbnN1cmVkIGJ5CisgKiB1c2luZyBiYXJyaWVycy4KKyAqLwogc3RydWN0IGF0bWVsX21jaSB7Ci0Jc3RydWN0IG1tY19ob3N0CQkqbW1jOworCXNwaW5sb2NrX3QJCWxvY2s7CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CiAJdW5zaWduZWQgaW50CQlwaW9fb2Zmc2V0OwogCisJc3RydWN0IGF0bWVsX21jaV9zbG90CSpjdXJfc2xvdDsKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKmNtZDsKIAlzdHJ1Y3QgbW1jX2RhdGEJCSpkYXRhOwogCisJc3RydWN0IGF0bWVsX21jaV9kbWEJZG1hOworCXN0cnVjdCBkbWFfY2hhbgkJKmRhdGFfY2hhbjsKKwogCXUzMgkJCWNtZF9zdGF0dXM7CiAJdTMyCQkJZGF0YV9zdGF0dXM7Ci0JdTMyCQkJc3RvcF9zdGF0dXM7CiAJdTMyCQkJc3RvcF9jbWRyOwogCi0JdTMyCQkJbW9kZV9yZWc7Ci0JdTMyCQkJc2RjX3JlZzsKLQogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0OwogCXVuc2lnbmVkIGxvbmcJCXBlbmRpbmdfZXZlbnRzOwogCXVuc2lnbmVkIGxvbmcJCWNvbXBsZXRlZF9ldmVudHM7CisJZW51bSBhdG1lbF9tY2lfc3RhdGUJc3RhdGU7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKIAotCWludAkJCXByZXNlbnQ7Ci0JaW50CQkJZGV0ZWN0X3BpbjsKLQlpbnQJCQl3cF9waW47Ci0KLQkvKiBGb3IgZGV0ZWN0IHBpbiBkZWJvdW5jaW5nICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJZGV0ZWN0X3RpbWVyOwotCisJYm9vbAkJCW5lZWRfY2xvY2tfdXBkYXRlOworCWJvb2wJCQluZWVkX3Jlc2V0OworCXUzMgkJCW1vZGVfcmVnOwogCXVuc2lnbmVkIGxvbmcJCWJ1c19oejsKIAl1bnNpZ25lZCBsb25nCQltYXBiYXNlOwogCXN0cnVjdCBjbGsJCSptY2s7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdFtBVE1FTF9NQ0lfTUFYX05SX1NMT1RTXTsKIH07CiAKLSNkZWZpbmUgYXRtY2lfaXNfY29tcGxldGVkKGhvc3QsIGV2ZW50KQkJCQlcCi0JdGVzdF9iaXQoZXZlbnQsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKQorLyoqCisgKiBzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgLSBNTUMgc2xvdCBzdGF0ZQorICogQG1tYzogVGhlIG1tY19ob3N0IHJlcHJlc2VudGluZyB0aGlzIHNsb3QuCisgKiBAaG9zdDogVGhlIE1NQyBjb250cm9sbGVyIHRoaXMgc2xvdCBpcyB1c2luZy4KKyAqIEBzZGNfcmVnOiBWYWx1ZSBvZiBTRENSIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIHVzaW5nIHRoaXMgc2xvdC4KKyAqIEBtcnE6IG1tY19yZXF1ZXN0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgb3Igd2FpdGluZyB0byBiZQorICoJcHJvY2Vzc2VkLCBvciBOVUxMIHdoZW4gdGhlIHNsb3QgaXMgaWRsZS4KKyAqIEBxdWV1ZV9ub2RlOiBMaXN0IG5vZGUgZm9yIHBsYWNpbmcgdGhpcyBub2RlIGluIHRoZSBAcXVldWUgbGlzdCBvZgorICoJJnN0cnVjdCBhdG1lbF9tY2kuCisgKiBAY2xvY2s6IENsb2NrIHJhdGUgY29uZmlndXJlZCBieSBzZXRfaW9zKCkuIFByb3RlY3RlZCBieSBob3N0LT5sb2NrLgorICogQGZsYWdzOiBSYW5kb20gc3RhdGUgYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QuCisgKiBAZGV0ZWN0X3BpbjogR1BJTyBwaW4gdXNlZCBmb3IgY2FyZCBkZXRlY3Rpb24sIG9yIG5lZ2F0aXZlIGlmIG5vdAorICoJYXZhaWxhYmxlLgorICogQHdwX3BpbjogR1BJTyBwaW4gdXNlZCBmb3IgY2FyZCB3cml0ZSBwcm90ZWN0IHNlbmRpbmcsIG9yIG5lZ2F0aXZlCisgKglpZiBub3QgYXZhaWxhYmxlLgorICogQGRldGVjdF90aW1lcjogVGltZXIgdXNlZCBmb3IgZGVib3VuY2luZyBAZGV0ZWN0X3BpbiBpbnRlcnJ1cHRzLgorICovCitzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgeworCXN0cnVjdCBtbWNfaG9zdAkJKm1tYzsKKwlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0OworCisJdTMyCQkJc2RjX3JlZzsKKworCXN0cnVjdCBtbWNfcmVxdWVzdAkqbXJxOworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWVfbm9kZTsKKworCXVuc2lnbmVkIGludAkJY2xvY2s7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisjZGVmaW5lIEFUTUNJX0NBUkRfUFJFU0VOVAkwCisjZGVmaW5lIEFUTUNJX0NBUkRfTkVFRF9JTklUCTEKKyNkZWZpbmUgQVRNQ0lfU0hVVERPV04JCTIKKworCWludAkJCWRldGVjdF9waW47CisJaW50CQkJd3BfcGluOworCisJc3RydWN0IHRpbWVyX2xpc3QJZGV0ZWN0X3RpbWVyOworfTsKKwogI2RlZmluZSBhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsIGV2ZW50KQkJXAogCXRlc3RfYW5kX2NsZWFyX2JpdChldmVudCwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKQotI2RlZmluZSBhdG1jaV90ZXN0X2FuZF9zZXRfY29tcGxldGVkKGhvc3QsIGV2ZW50KQkJXAotCXRlc3RfYW5kX3NldF9iaXQoZXZlbnQsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKQogI2RlZmluZSBhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIGV2ZW50KQkJCVwKIAlzZXRfYml0KGV2ZW50LCAmaG9zdC0+Y29tcGxldGVkX2V2ZW50cykKICNkZWZpbmUgYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgZXZlbnQpCQkJCVwKIAlzZXRfYml0KGV2ZW50LCAmaG9zdC0+cGVuZGluZ19ldmVudHMpCi0jZGVmaW5lIGF0bWNpX2NsZWFyX3BlbmRpbmcoaG9zdCwgZXZlbnQpCQkJXAotCWNsZWFyX2JpdChldmVudCwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKQogCiAvKgogICogVGhlIGRlYnVnZnMgc3R1ZmYgYmVsb3cgaXMgbW9zdGx5IG9wdGltaXplZCBhd2F5IHdoZW4KQEAgLTk4LDE0ICsyMTQsMTUgQEAKICAqLwogc3RhdGljIGludCBhdG1jaV9yZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHMtPnByaXZhdGU7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0CSptcnEgPSBob3N0LT5tcnE7CisJc3RydWN0IGF0bWVsX21jaV9zbG90CSpzbG90ID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKmNtZDsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKnN0b3A7CiAJc3RydWN0IG1tY19kYXRhCQkqZGF0YTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBnZXQgYSBjb25zaXN0ZW50IHNuYXBzaG90ICovCi0Jc3Bpbl9sb2NrX2lycSgmaG9zdC0+bW1jLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNsb3QtPmhvc3QtPmxvY2spOworCW1ycSA9IHNsb3QtPm1ycTsKIAogCWlmIChtcnEpIHsKIAkJY21kID0gbXJxLT5jbWQ7CkBAIC0xMzAsNyArMjQ3LDcgQEAKIAkJCQlzdG9wLT5yZXNwWzJdLCBzdG9wLT5lcnJvcik7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxKCZob3N0LT5tbWMtPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzbG90LT5ob3N0LT5sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkzLDEwICszMTAsMTYgQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBHcmFiIGEgbW9yZSBvciBsZXNzIGNvbnNpc3RlbnQgc25hcHNob3QgKi8KLQlzcGluX2xvY2tfaXJxKCZob3N0LT5tbWMtPmxvY2spOworCS8qCisJICogR3JhYiBhIG1vcmUgb3IgbGVzcyBjb25zaXN0ZW50IHNuYXBzaG90LiBOb3RlIHRoYXQgd2UncmUKKwkgKiBub3QgZGlzYWJsaW5nIGludGVycnVwdHMsIHNvIElNUiBhbmQgU1IgbWF5IG5vdCBiZQorCSAqIGNvbnNpc3RlbnQuCisJICovCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwljbGtfZW5hYmxlKGhvc3QtPm1jayk7CiAJbWVtY3B5X2Zyb21pbyhidWYsIGhvc3QtPnJlZ3MsIE1DSV9SRUdTX1NJWkUpOwotCXNwaW5fdW5sb2NrX2lycSgmaG9zdC0+bW1jLT5sb2NrKTsKKwljbGtfZGlzYWJsZShob3N0LT5tY2spOworCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKIAogCXNlcV9wcmludGYocywgIk1SOlx0MHglMDh4JXMlcyBDTEtESVY9JXVcbiIsCiAJCQlidWZbTUNJX01SIC8gNF0sCkBAIC0yMTYsNiArMzM5LDggQEAKIAlhdG1jaV9zaG93X3N0YXR1c19yZWcocywgIlNSIiwgYnVmW01DSV9TUiAvIDRdKTsKIAlhdG1jaV9zaG93X3N0YXR1c19yZWcocywgIklNUiIsIGJ1ZltNQ0lfSU1SIC8gNF0pOwogCisJa2ZyZWUoYnVmKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMzIsMTQgKzM1NywxMyBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgdm9pZCBhdG1jaV9pbml0X2RlYnVnZnMoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3N0YXRpYyB2b2lkIGF0bWNpX2luaXRfZGVidWdmcyhzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QpCiB7Ci0Jc3RydWN0IG1tY19ob3N0CSptbWM7Ci0Jc3RydWN0IGRlbnRyeQkqcm9vdDsKLQlzdHJ1Y3QgZGVudHJ5CSpub2RlOwotCXN0cnVjdCByZXNvdXJjZQkqcmVzOworCXN0cnVjdCBtbWNfaG9zdAkJKm1tYyA9IHNsb3QtPm1tYzsKKwlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gc2xvdC0+aG9zdDsKKwlzdHJ1Y3QgZGVudHJ5CQkqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5CQkqbm9kZTsKIAotCW1tYyA9IGhvc3QtPm1tYzsKIAlyb290ID0gbW1jLT5kZWJ1Z2ZzX3Jvb3Q7CiAJaWYgKCFyb290KQogCQlyZXR1cm47CkBAIC0yNTEsMTAgKzM3NSwxMSBAQAogCWlmICghbm9kZSkKIAkJZ290byBlcnI7CiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoaG9zdC0+cGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCW5vZGUtPmRfaW5vZGUtPmlfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlcSIsIFNfSVJVU1IsIHJvb3QsIHNsb3QsICZhdG1jaV9yZXFfZm9wcyk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKIAotCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZXEiLCBTX0lSVVNSLCByb290LCBob3N0LCAmYXRtY2lfcmVxX2ZvcHMpOworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInN0YXRlIiwgU19JUlVTUiwgcm9vdCwgKHUzMiAqKSZob3N0LT5zdGF0ZSk7CiAJaWYgKCFub2RlKQogCQlnb3RvIGVycjsKIApAQCAtMjcxLDI1ICszOTYsNyBAQAogCXJldHVybjsKIAogZXJyOgotCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwKLQkJImZhaWxlZCB0byBpbml0aWFsaXplIGRlYnVnZnMgZm9yIGNvbnRyb2xsZXJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBhdG1jaV9lbmFibGUoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKLXsKLQljbGtfZW5hYmxlKGhvc3QtPm1jayk7Ci0JbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSUVOKTsKLQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7Ci0JbWNpX3dyaXRlbChob3N0LCBTRENSLCBob3N0LT5zZGNfcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgYXRtY2lfZGlzYWJsZShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQotewotCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7Ci0KLQkvKiBTdGFsbCB1bnRpbCB3cml0ZSBpcyBjb21wbGV0ZSwgdGhlbiBkaXNhYmxlIHRoZSBidXMgY2xvY2sgKi8KLQltY2lfcmVhZGwoaG9zdCwgU1IpOwotCWNsa19kaXNhYmxlKGhvc3QtPm1jayk7CisJZGV2X2VycigmbW1jLT5jbGFzc19kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWJ1Z2ZzIGZvciBzbG90XG4iKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbnNfdG9fY2xvY2tzKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCkBAIC0yOTksNyArNDA2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYXRtY2lfc2V0X3RpbWVvdXQoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKLQkJCSAgICAgIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKKwkJc3RydWN0IGF0bWVsX21jaV9zbG90ICpzbG90LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7CiAJc3RhdGljIHVuc2lnbmVkCWR0b211bF90b19zaGlmdFtdID0gewogCQkwLCA0LCA3LCA4LCAxMCwgMTIsIDE2LCAyMApAQCAtMzIyLDcgKzQyOSw3IEBACiAJCWR0b2N5YyA9IDE1OwogCX0KIAotCWRldl92ZGJnKCZob3N0LT5tbWMtPmNsYXNzX2RldiwgInNldHRpbmcgdGltZW91dCB0byAldSBjeWNsZXNcbiIsCisJZGV2X3ZkYmcoJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LCAic2V0dGluZyB0aW1lb3V0IHRvICV1IGN5Y2xlc1xuIiwKIAkJCWR0b2N5YyA8PCBkdG9tdWxfdG9fc2hpZnRbZHRvbXVsXSk7CiAJbWNpX3dyaXRlbChob3N0LCBEVE9SLCAoTUNJX0RUT01VTChkdG9tdWwpIHwgTUNJX0RUT0NZQyhkdG9jeWMpKSk7CiB9CkBAIC0zNzUsMTUgKzQ4MiwxMiBAQAogfQogCiBzdGF0aWMgdm9pZCBhdG1jaV9zdGFydF9jb21tYW5kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCi0JCQkJc3RydWN0IG1tY19jb21tYW5kICpjbWQsCi0JCQkJdTMyIGNtZF9mbGFncykKKwkJc3RydWN0IG1tY19jb21tYW5kICpjbWQsIHUzMiBjbWRfZmxhZ3MpCiB7Ci0JLyogTXVzdCByZWFkIGhvc3QtPmNtZCBhZnRlciB0ZXN0aW5nIGV2ZW50IGZsYWdzICovCi0Jc21wX3JtYigpOwogCVdBUk5fT04oaG9zdC0+Y21kKTsKIAlob3N0LT5jbWQgPSBjbWQ7CiAKLQlkZXZfdmRiZygmaG9zdC0+bW1jLT5jbGFzc19kZXYsCisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwKIAkJCSJzdGFydCBjb21tYW5kOiBBUkdSPTB4JTA4eCBDTURSPTB4JTA4eFxuIiwKIAkJCWNtZC0+YXJnLCBjbWRfZmxhZ3MpOwogCkBAIC0zOTEsMzQgKzQ5NSwxNTcgQEAKIAltY2lfd3JpdGVsKGhvc3QsIENNRFIsIGNtZF9mbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbmRfc3RvcF9jbWQoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3N0YXRpYyB2b2lkIHNlbmRfc3RvcF9jbWQoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewotCXN0cnVjdCBhdG1lbF9tY2kgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJYXRtY2lfc3RhcnRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wLCBob3N0LT5zdG9wX2NtZHIpOwogCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBNQ0lfQ01EUkRZKTsKIH0KIAotc3RhdGljIHZvaWQgYXRtY2lfcmVxdWVzdF9lbmQoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQorI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCitzdGF0aWMgdm9pZCBhdG1jaV9kbWFfY2xlYW51cChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQogewotCXN0cnVjdCBhdG1lbF9tY2kgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBtbWNfZGF0YQkJCSpkYXRhID0gaG9zdC0+ZGF0YTsKIAotCVdBUk5fT04oaG9zdC0+Y21kIHx8IGhvc3QtPmRhdGEpOwotCWhvc3QtPm1ycSA9IE5VTEw7Ci0KLQlhdG1jaV9kaXNhYmxlKGhvc3QpOwotCi0JbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJZG1hX3VubWFwX3NnKCZob3N0LT5wZGV2LT5kZXYsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCisJCSAgICAgKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkgICAgICA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpKTsKIH0KIAorc3RhdGljIHZvaWQgYXRtY2lfc3RvcF9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBob3N0LT5kYXRhX2NoYW47CisKKwlpZiAoY2hhbikgeworCQljaGFuLT5kZXZpY2UtPmRldmljZV90ZXJtaW5hdGVfYWxsKGNoYW4pOworCQlhdG1jaV9kbWFfY2xlYW51cChob3N0KTsKKwl9IGVsc2UgeworCQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwkJbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBETUEgZHJpdmVyIGZyb20gdGFza2xldCBjb250ZXh0LiAqLworc3RhdGljIHZvaWQgYXRtY2lfZG1hX2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gYXJnOworCXN0cnVjdCBtbWNfZGF0YQkJKmRhdGEgPSBob3N0LT5kYXRhOworCisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBjb21wbGV0ZVxuIik7CisKKwlhdG1jaV9kbWFfY2xlYW51cChob3N0KTsKKworCS8qCisJICogSWYgdGhlIGNhcmQgd2FzIHJlbW92ZWQsIGRhdGEgd2lsbCBiZSBOVUxMLiBObyBwb2ludCB0cnlpbmcKKwkgKiB0byBzZW5kIHRoZSBzdG9wIGNvbW1hbmQgb3Igd2FpdGluZyBmb3IgTkJVU1kgaW4gdGhpcyBjYXNlLgorCSAqLworCWlmIChkYXRhKSB7CisJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKworCQkvKgorCQkgKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gc2F5cywgd2UgaGF2ZQorCQkgKiB0byB3YWl0IGZvciBOT1RCVVNZIGV2ZW4gYWZ0ZXIgYmxvY2sgcmVhZAorCQkgKiBvcGVyYXRpb25zLgorCQkgKgorCQkgKiBXaGVuIHRoZSBETUEgdHJhbnNmZXIgaXMgY29tcGxldGUsIHRoZSBjb250cm9sbGVyCisJCSAqIG1heSBzdGlsbCBiZSByZWFkaW5nIHRoZSBDUkMgZnJvbSB0aGUgY2FyZCwgaS5lLgorCQkgKiB0aGUgZGF0YSB0cmFuc2ZlciBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgd2UKKwkJICogaGF2ZW4ndCBzZWVuIGFsbCB0aGUgcG90ZW50aWFsIGVycm9yIGJpdHMgeWV0LgorCQkgKgorCQkgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBzY2hlZHVsZSBhIGRpZmZlcmVudAorCQkgKiB0YXNrbGV0IHRvIGZpbmlzaCB0aGluZ3MgdXAgd2hlbiB0aGUgZGF0YSB0cmFuc2ZlcgorCQkgKiBpcyBjb21wbGV0ZWx5IGRvbmUuCisJCSAqCisJCSAqIFdlIG1heSBub3QgY29tcGxldGUgdGhlIG1tYyByZXF1ZXN0IGhlcmUgYW55d2F5CisJCSAqIGJlY2F1c2UgdGhlIG1tYyBsYXllciBtYXkgY2FsbCBiYWNrIGFuZCBjYXVzZSB1cyB0bworCQkgKiB2aW9sYXRlIHRoZSAiZG9uJ3Qgc3VibWl0IG5ldyBvcGVyYXRpb25zIGZyb20gdGhlCisJCSAqIGNvbXBsZXRpb24gY2FsbGJhY2siIHJ1bGUgb2YgdGhlIGRtYSBlbmdpbmUKKwkJICogZnJhbWV3b3JrLgorCQkgKi8KKwkJbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2F0bWNpX3N1Ym1pdF9kYXRhX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdAkJKnNnOworCXVuc2lnbmVkIGludAkJCWk7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JCWRpcmVjdGlvbjsKKworCS8qCisJICogV2UgZG9uJ3QgZG8gRE1BIG9uICJjb21wbGV4IiB0cmFuc2ZlcnMsIGkuZS4gd2l0aAorCSAqIG5vbi13b3JkLWFsaWduZWQgYnVmZmVycyBvciBsZW5ndGhzLiBBbHNvLCB3ZSBkb24ndCBib3RoZXIKKwkgKiB3aXRoIGFsbCB0aGUgRE1BIHNldHVwIG92ZXJoZWFkIGZvciBzaG9ydCB0cmFuc2ZlcnMuCisJICovCisJaWYgKGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6IDwgQVRNQ0lfRE1BX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRhdGEtPmJsa3N6ICYgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JfZWFjaF9zZyhkYXRhLT5zZywgc2csIGRhdGEtPnNnX2xlbiwgaSkgeworCQlpZiAoc2ctPm9mZnNldCAmIDMgfHwgc2ctPmxlbmd0aCAmIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2hhbm5lbCwgd2UgY2FuJ3QgZG8gRE1BICovCisJY2hhbiA9IGhvc3QtPmRtYS5jaGFuOworCWlmIChjaGFuKSB7CisJCWRtYV9jaGFuX2dldChjaGFuKTsKKwkJaG9zdC0+ZGF0YV9jaGFuID0gY2hhbjsKKwl9CisKKwlpZiAoIWNoYW4pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCWVsc2UKKwkJZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKworCWRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW4sCisJCQlkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24sCisJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlob3N0LT5kbWEuZGF0YV9kZXNjID0gZGVzYzsKKwlkZXNjLT5jYWxsYmFjayA9IGF0bWNpX2RtYV9jb21wbGV0ZTsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGhvc3Q7CisJZGVzYy0+dHhfc3VibWl0KGRlc2MpOworCisJLyogR28hICovCisJY2hhbi0+ZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKKworCXJldHVybiAwOworfQorCisjZWxzZSAvKiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQSAqLworCitzdGF0aWMgaW50IGF0bWNpX3N1Ym1pdF9kYXRhX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWNpX3N0b3BfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJLyogRGF0YSB0cmFuc2ZlciB3YXMgc3RvcHBlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX05PVEJVU1kpOworfQorCisjZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KKwogLyoKICAqIFJldHVybnMgYSBtYXNrIG9mIGludGVycnVwdCBmbGFncyB0byBiZSBlbmFibGVkIGFmdGVyIHRoZSB3aG9sZQogICogcmVxdWVzdCBoYXMgYmVlbiBwcmVwYXJlZC4KICAqLwotc3RhdGljIHUzMiBhdG1jaV9zdWJtaXRfZGF0YShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19kYXRhICpkYXRhKQorc3RhdGljIHUzMiBhdG1jaV9zdWJtaXRfZGF0YShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0JdTMyCQkJaWZsYWdzOworCXUzMiBpZmxhZ3M7CiAKIAlkYXRhLT5lcnJvciA9IC1FSU5QUk9HUkVTUzsKIApAQCAtNDI2LDc1ICs2NTMsODkgQEAKIAlob3N0LT5zZyA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IGRhdGE7CiAKLQltY2lfd3JpdGVsKGhvc3QsIEJMS1IsIE1DSV9CQ05UKGRhdGEtPmJsb2NrcykKLQkJCXwgTUNJX0JMS0xFTihkYXRhLT5ibGtzeikpOwotCWRldl92ZGJnKCZtbWMtPmNsYXNzX2RldiwgIkJMS1I9MHglMDh4XG4iLAotCQkJTUNJX0JDTlQoZGF0YS0+YmxvY2tzKSB8IE1DSV9CTEtMRU4oZGF0YS0+Ymxrc3opKTsKLQogCWlmbGFncyA9IEFUTUNJX0RBVEFfRVJST1JfRkxBR1M7Ci0JaG9zdC0+c2cgPSBkYXRhLT5zZzsKLQlob3N0LT5waW9fb2Zmc2V0ID0gMDsKLQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQotCQlpZmxhZ3MgfD0gTUNJX1JYUkRZOwotCWVsc2UKLQkJaWZsYWdzIHw9IE1DSV9UWFJEWTsKKwlpZiAoYXRtY2lfc3VibWl0X2RhdGFfZG1hKGhvc3QsIGRhdGEpKSB7CisJCWhvc3QtPmRhdGFfY2hhbiA9IE5VTEw7CisKKwkJLyoKKwkJICogRXJyYXRhOiBNTUMgZGF0YSB3cml0ZSBvcGVyYXRpb24gd2l0aCBsZXNzIHRoYW4gMTIKKwkJICogYnl0ZXMgaXMgaW1wb3NzaWJsZS4KKwkJICoKKwkJICogRXJyYXRhOiBNQ0kgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAoVERSKSBGSUZPCisJCSAqIGNvcnJ1cHRpb24gd2hlbiBsZW5ndGggaXMgbm90IG11bHRpcGxlIG9mIDQuCisJCSAqLworCQlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCAxMgorCQkJCXx8IChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeikgJiAzKQorCQkJaG9zdC0+bmVlZF9yZXNldCA9IHRydWU7CisKKwkJaG9zdC0+c2cgPSBkYXRhLT5zZzsKKwkJaG9zdC0+cGlvX29mZnNldCA9IDA7CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCisJCQlpZmxhZ3MgfD0gTUNJX1JYUkRZOworCQllbHNlCisJCQlpZmxhZ3MgfD0gTUNJX1RYUkRZOworCX0KIAogCXJldHVybiBpZmxhZ3M7CiB9CiAKLXN0YXRpYyB2b2lkIGF0bWNpX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQorc3RhdGljIHZvaWQgYXRtY2lfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAorCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QpCiB7Ci0Jc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0Jc3RydWN0IG1tY19kYXRhCQkqZGF0YTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQJKmNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEJCSpkYXRhOwogCXUzMgkJCWlmbGFnczsKLQl1MzIJCQljbWRmbGFncyA9IDA7CisJdTMyCQkJY21kZmxhZ3M7CisKKwltcnEgPSBzbG90LT5tcnE7CisJaG9zdC0+Y3VyX3Nsb3QgPSBzbG90OworCWhvc3QtPm1ycSA9IG1ycTsKKworCWhvc3QtPnBlbmRpbmdfZXZlbnRzID0gMDsKKwlob3N0LT5jb21wbGV0ZWRfZXZlbnRzID0gMDsKKwlob3N0LT5kYXRhX3N0YXR1cyA9IDA7CisKKwlpZiAoaG9zdC0+bmVlZF9yZXNldCkgeworCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfU1dSU1QpOworCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfTUNJRU4pOworCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7CisJCWhvc3QtPm5lZWRfcmVzZXQgPSBmYWxzZTsKKwl9CisJbWNpX3dyaXRlbChob3N0LCBTRENSLCBzbG90LT5zZGNfcmVnKTsKIAogCWlmbGFncyA9IG1jaV9yZWFkbChob3N0LCBJTVIpOwogCWlmIChpZmxhZ3MpCi0JCWRldl93YXJuKCZtbWMtPmNsYXNzX2RldiwgIldBUk5JTkc6IElNUj0weCUwOHhcbiIsCi0JCQkJbWNpX3JlYWRsKGhvc3QsIElNUikpOworCQlkZXZfd2Fybigmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJXQVJOSU5HOiBJTVI9MHglMDh4XG4iLAorCQkJCWlmbGFncyk7CiAKLQlXQVJOX09OKGhvc3QtPm1ycSAhPSBOVUxMKTsKLQotCS8qCi0JICogV2UgbWF5ICJrbm93IiB0aGUgY2FyZCBpcyBnb25lIGV2ZW4gdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYW4KLQkgKiBlbGVjdHJpY2FsIGNvbm5lY3Rpb24uIElmIHNvLCB3ZSByZWFsbHkgbmVlZCB0byBjb21tdW5pY2F0ZQotCSAqIHRoaXMgdG8gdGhlIE1NQyBjb3JlIHNpbmNlIHRoZXJlIHdvbid0IGJlIGFueSBtb3JlCi0JICogaW50ZXJydXB0cyBhcyB0aGUgY2FyZCBpcyBjb21wbGV0ZWx5IHJlbW92ZWQuIE90aGVyd2lzZSwKLQkgKiB0aGUgTU1DIGNvcmUgbWlnaHQgYmVsaWV2ZSB0aGUgY2FyZCBpcyBzdGlsbCB0aGVyZSBldmVuCi0JICogdGhvdWdoIHRoZSBjYXJkIHdhcyBqdXN0IHJlbW92ZWQgdmVyeSBzbG93bHkuCi0JICovCi0JaWYgKCFob3N0LT5wcmVzZW50KSB7Ci0JCW1ycS0+Y21kLT5lcnJvciA9IC1FTk9NRURJVU07Ci0JCW1tY19yZXF1ZXN0X2RvbmUobW1jLCBtcnEpOwotCQlyZXR1cm47CisJaWYgKHVubGlrZWx5KHRlc3RfYW5kX2NsZWFyX2JpdChBVE1DSV9DQVJEX05FRURfSU5JVCwgJnNsb3QtPmZsYWdzKSkpIHsKKwkJLyogU2VuZCBpbml0IHNlcXVlbmNlICg3NCBjbG9jayBjeWNsZXMpICovCisJCW1jaV93cml0ZWwoaG9zdCwgQ01EUiwgTUNJX0NNRFJfU1BDTURfSU5JVCk7CisJCXdoaWxlICghKG1jaV9yZWFkbChob3N0LCBTUikgJiBNQ0lfQ01EUkRZKSkKKwkJCWNwdV9yZWxheCgpOwogCX0KLQotCWhvc3QtPm1ycSA9IG1ycTsKLQlob3N0LT5wZW5kaW5nX2V2ZW50cyA9IDA7Ci0JaG9zdC0+Y29tcGxldGVkX2V2ZW50cyA9IDA7Ci0KLQlhdG1jaV9lbmFibGUoaG9zdCk7Ci0KLQkvKiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJsb2NrcyBvZiB3ZWlyZCBsZW5ndGhzLiAqLwogCWRhdGEgPSBtcnEtPmRhdGE7CiAJaWYgKGRhdGEpIHsKLQkJaWYgKGRhdGEtPmJsb2NrcyA+IDEgJiYgZGF0YS0+Ymxrc3ogJiAzKQotCQkJZ290byBmYWlsOwotCQlhdG1jaV9zZXRfdGltZW91dChob3N0LCBkYXRhKTsKKwkJYXRtY2lfc2V0X3RpbWVvdXQoaG9zdCwgc2xvdCwgZGF0YSk7CisKKwkJLyogTXVzdCBzZXQgYmxvY2sgY291bnQvc2l6ZSBiZWZvcmUgc2VuZGluZyBjb21tYW5kICovCisJCW1jaV93cml0ZWwoaG9zdCwgQkxLUiwgTUNJX0JDTlQoZGF0YS0+YmxvY2tzKQorCQkJCXwgTUNJX0JMS0xFTihkYXRhLT5ibGtzeikpOworCQlkZXZfdmRiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJCTEtSPTB4JTA4eFxuIiwKKwkJCU1DSV9CQ05UKGRhdGEtPmJsb2NrcykgfCBNQ0lfQkxLTEVOKGRhdGEtPmJsa3N6KSk7CiAJfQogCiAJaWZsYWdzID0gTUNJX0NNRFJEWTsKIAljbWQgPSBtcnEtPmNtZDsKLQljbWRmbGFncyA9IGF0bWNpX3ByZXBhcmVfY29tbWFuZChtbWMsIGNtZCk7CisJY21kZmxhZ3MgPSBhdG1jaV9wcmVwYXJlX2NvbW1hbmQoc2xvdC0+bW1jLCBjbWQpOwogCWF0bWNpX3N0YXJ0X2NvbW1hbmQoaG9zdCwgY21kLCBjbWRmbGFncyk7CiAKIAlpZiAoZGF0YSkKLQkJaWZsYWdzIHw9IGF0bWNpX3N1Ym1pdF9kYXRhKG1tYywgZGF0YSk7CisJCWlmbGFncyB8PSBhdG1jaV9zdWJtaXRfZGF0YShob3N0LCBkYXRhKTsKIAogCWlmIChtcnEtPnN0b3ApIHsKLQkJaG9zdC0+c3RvcF9jbWRyID0gYXRtY2lfcHJlcGFyZV9jb21tYW5kKG1tYywgbXJxLT5zdG9wKTsKKwkJaG9zdC0+c3RvcF9jbWRyID0gYXRtY2lfcHJlcGFyZV9jb21tYW5kKHNsb3QtPm1tYywgbXJxLT5zdG9wKTsKIAkJaG9zdC0+c3RvcF9jbWRyIHw9IE1DSV9DTURSX1NUT1BfWEZFUjsKIAkJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkpCiAJCQlob3N0LT5zdG9wX2NtZHIgfD0gTUNJX0NNRFJfVFJESVJfUkVBRDsKQEAgLTUxMSw1OSArNzUyLDE1NiBAQAogCSAqIHByZXBhcmVkIHlldC4pCiAJICovCiAJbWNpX3dyaXRlbChob3N0LCBJRVIsIGlmbGFncyk7Cit9CiAKLQlyZXR1cm47CitzdGF0aWMgdm9pZCBhdG1jaV9xdWV1ZV9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCisJCXN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJZGV2X3ZkYmcoJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LCAicXVldWUgcmVxdWVzdDogc3RhdGU9JWRcbiIsCisJCQlob3N0LT5zdGF0ZSk7CiAKLWZhaWw6Ci0JYXRtY2lfZGlzYWJsZShob3N0KTsKLQlob3N0LT5tcnEgPSBOVUxMOwotCW1ycS0+Y21kLT5lcnJvciA9IC1FSU5WQUw7Ci0JbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwlzbG90LT5tcnEgPSBtcnE7CisJaWYgKGhvc3QtPnN0YXRlID09IFNUQVRFX0lETEUpIHsKKwkJaG9zdC0+c3RhdGUgPSBTVEFURV9TRU5ESU5HX0NNRDsKKwkJYXRtY2lfc3RhcnRfcmVxdWVzdChob3N0LCBzbG90KTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZzbG90LT5xdWV1ZV9ub2RlLCAmaG9zdC0+cXVldWUpOworCX0KKwlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWNpX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHNsb3QtPmhvc3Q7CisJc3RydWN0IG1tY19kYXRhCQkqZGF0YTsKKworCVdBUk5fT04oc2xvdC0+bXJxKTsKKworCS8qCisJICogV2UgbWF5ICJrbm93IiB0aGUgY2FyZCBpcyBnb25lIGV2ZW4gdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYW4KKwkgKiBlbGVjdHJpY2FsIGNvbm5lY3Rpb24uIElmIHNvLCB3ZSByZWFsbHkgbmVlZCB0byBjb21tdW5pY2F0ZQorCSAqIHRoaXMgdG8gdGhlIE1NQyBjb3JlIHNpbmNlIHRoZXJlIHdvbid0IGJlIGFueSBtb3JlCisJICogaW50ZXJydXB0cyBhcyB0aGUgY2FyZCBpcyBjb21wbGV0ZWx5IHJlbW92ZWQuIE90aGVyd2lzZSwKKwkgKiB0aGUgTU1DIGNvcmUgbWlnaHQgYmVsaWV2ZSB0aGUgY2FyZCBpcyBzdGlsbCB0aGVyZSBldmVuCisJICogdGhvdWdoIHRoZSBjYXJkIHdhcyBqdXN0IHJlbW92ZWQgdmVyeSBzbG93bHkuCisJICovCisJaWYgKCF0ZXN0X2JpdChBVE1DSV9DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncykpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJsb2NrcyBvZiB3ZWlyZCBsZW5ndGhzLiAqLworCWRhdGEgPSBtcnEtPmRhdGE7CisJaWYgKGRhdGEgJiYgZGF0YS0+YmxvY2tzID4gMSAmJiBkYXRhLT5ibGtzeiAmIDMpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVJTlZBTDsKKwkJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJfQorCisJYXRtY2lfcXVldWVfcmVxdWVzdChob3N0LCBzbG90LCBtcnEpOwogfQogCiBzdGF0aWMgdm9pZCBhdG1jaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewotCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHNsb3QtPmhvc3Q7CisJdW5zaWduZWQgaW50CQlpOworCisJc2xvdC0+c2RjX3JlZyAmPSB+TUNJX1NEQ0JVU19NQVNLOworCXN3aXRjaCAoaW9zLT5idXNfd2lkdGgpIHsKKwljYXNlIE1NQ19CVVNfV0lEVEhfMToKKwkJc2xvdC0+c2RjX3JlZyB8PSBNQ0lfU0RDQlVTXzFCSVQ7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF80OgorCQlzbG90LT5zZGNfcmVnID0gTUNJX1NEQ0JVU180QklUOworCQlicmVhazsKKwl9CiAKIAlpZiAoaW9zLT5jbG9jaykgeworCQl1bnNpZ25lZCBpbnQgY2xvY2tfbWluID0gfjBVOwogCQl1MzIgY2xrZGl2OwogCi0JCS8qIFNldCBjbG9jayByYXRlICovCi0JCWNsa2RpdiA9IERJVl9ST1VORF9VUChob3N0LT5idXNfaHosIDIgKiBpb3MtPmNsb2NrKSAtIDE7CisJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CisJCWlmICghaG9zdC0+bW9kZV9yZWcpIHsKKwkJCWNsa19lbmFibGUoaG9zdC0+bWNrKTsKKwkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7CisJCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfTUNJRU4pOworCQl9CisKKwkJLyoKKwkJICogVXNlIG1pcnJvciBvZiBpb3MtPmNsb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIG1tYworCQkgKiBjb3JlIGlvcyB1cGRhdGUgd2hlbiBmaW5kaW5nIHRoZSBtaW5pbXVtLgorCQkgKi8KKwkJc2xvdC0+Y2xvY2sgPSBpb3MtPmNsb2NrOworCQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJCQlpZiAoaG9zdC0+c2xvdFtpXSAmJiBob3N0LT5zbG90W2ldLT5jbG9jaworCQkJCQkmJiBob3N0LT5zbG90W2ldLT5jbG9jayA8IGNsb2NrX21pbikKKwkJCQljbG9ja19taW4gPSBob3N0LT5zbG90W2ldLT5jbG9jazsKKwkJfQorCisJCS8qIENhbGN1bGF0ZSBjbG9jayBkaXZpZGVyICovCisJCWNsa2RpdiA9IERJVl9ST1VORF9VUChob3N0LT5idXNfaHosIDIgKiBjbG9ja19taW4pIC0gMTsKIAkJaWYgKGNsa2RpdiA+IDI1NSkgewogCQkJZGV2X3dhcm4oJm1tYy0+Y2xhc3NfZGV2LAogCQkJCSJjbG9jayAldSB0b28gc2xvdzsgdXNpbmcgJWx1XG4iLAotCQkJCWlvcy0+Y2xvY2ssIGhvc3QtPmJ1c19oeiAvICgyICogMjU2KSk7CisJCQkJY2xvY2tfbWluLCBob3N0LT5idXNfaHogLyAoMiAqIDI1NikpOwogCQkJY2xrZGl2ID0gMjU1OwogCQl9CiAKKwkJLyoKKwkJICogV1JQUk9PRiBhbmQgUkRQUk9PRiBwcmV2ZW50IG92ZXJydW5zL3VuZGVycnVucyBieQorCQkgKiBzdG9wcGluZyB0aGUgY2xvY2sgd2hlbiB0aGUgRklGTyBpcyBmdWxsL2VtcHR5LgorCQkgKiBUaGlzIHN0YXRlIGlzIG5vdCBleHBlY3RlZCB0byBsYXN0IGZvciBsb25nLgorCQkgKi8KIAkJaG9zdC0+bW9kZV9yZWcgPSBNQ0lfTVJfQ0xLRElWKGNsa2RpdikgfCBNQ0lfTVJfV1JQUk9PRgogCQkJCQl8IE1DSV9NUl9SRFBST09GOwotCX0KIAotCXN3aXRjaCAoaW9zLT5idXNfd2lkdGgpIHsKLQljYXNlIE1NQ19CVVNfV0lEVEhfMToKLQkJaG9zdC0+c2RjX3JlZyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgTU1DX0JVU19XSURUSF80OgotCQlob3N0LT5zZGNfcmVnID0gTUNJX1NEQ0JVU180QklUOwotCQlicmVhazsKKwkJaWYgKGxpc3RfZW1wdHkoJmhvc3QtPnF1ZXVlKSkKKwkJCW1jaV93cml0ZWwoaG9zdCwgTVIsIGhvc3QtPm1vZGVfcmVnKTsKKwkJZWxzZQorCQkJaG9zdC0+bmVlZF9jbG9ja191cGRhdGUgPSB0cnVlOworCisJCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwl9IGVsc2UgeworCQlib29sIGFueV9zbG90X2FjdGl2ZSA9IGZhbHNlOworCisJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CisJCXNsb3QtPmNsb2NrID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCQkJaWYgKGhvc3QtPnNsb3RbaV0gJiYgaG9zdC0+c2xvdFtpXS0+Y2xvY2spIHsKKwkJCQlhbnlfc2xvdF9hY3RpdmUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghYW55X3Nsb3RfYWN0aXZlKSB7CisJCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfTUNJRElTKTsKKwkJCWlmIChob3N0LT5tb2RlX3JlZykgeworCQkJCW1jaV9yZWFkbChob3N0LCBNUik7CisJCQkJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKKwkJCX0KKwkJCWhvc3QtPm1vZGVfcmVnID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmaG9zdC0+bG9jayk7CiAJfQogCiAJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKLQljYXNlIE1NQ19QT1dFUl9PTjoKLQkJLyogU2VuZCBpbml0IHNlcXVlbmNlICg3NCBjbG9jayBjeWNsZXMpICovCi0JCWF0bWNpX2VuYWJsZShob3N0KTsKLQkJbWNpX3dyaXRlbChob3N0LCBDTURSLCBNQ0lfQ01EUl9TUENNRF9JTklUKTsKLQkJd2hpbGUgKCEobWNpX3JlYWRsKGhvc3QsIFNSKSAmIE1DSV9DTURSRFkpKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWF0bWNpX2Rpc2FibGUoaG9zdCk7CisJY2FzZSBNTUNfUE9XRVJfVVA6CisJCXNldF9iaXQoQVRNQ0lfQ0FSRF9ORUVEX0lOSVQsICZzbG90LT5mbGFncyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qCiAJCSAqIFRPRE86IE5vbmUgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgQVZSMzItYmFzZWQKIAkJICogYm9hcmRzIGFsbG93IE1NQyBwb3dlciB0byBiZSB0dXJuZWQgb2ZmLiBJbXBsZW1lbnQKIAkJICogcG93ZXIgY29udHJvbCB3aGVuIHRoaXMgY2FuIGJlIHRlc3RlZCBwcm9wZXJseS4KKwkJICoKKwkJICogV2UgYWxzbyBuZWVkIHRvIGhvb2sgdGhpcyBpbnRvIHRoZSBjbG9jayBtYW5hZ2VtZW50CisJCSAqIHNvbWVob3cgc28gdGhhdCBuZXdseSBpbnNlcnRlZCBjYXJkcyBhcmVuJ3QKKwkJICogc3ViamVjdGVkIHRvIGEgZmFzdCBjbG9jayBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZQorCQkgKiB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIG1heGltdW0gcmF0ZSBpcy4gQ3VycmVudGx5LAorCQkgKiB0aGVyZSdzIG5vIHdheSB0byBhdm9pZCB0aGlzLCBhbmQgdGhlcmUgbmV2ZXIgd2lsbAorCQkgKiBiZSBmb3IgYm9hcmRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwb3dlciBjb250cm9sLgogCQkgKi8KIAkJYnJlYWs7CiAJfQpAQCAtNTcxLDMxICs5MDksODIgQEAKIAogc3RhdGljIGludCBhdG1jaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCiB7Ci0JaW50CQkJcmVhZF9vbmx5ID0gMDsKLQlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlpbnQJCQlyZWFkX29ubHkgPSAtRU5PU1lTOworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdCA9IG1tY19wcml2KG1tYyk7CiAKLQlpZiAoZ3Bpb19pc192YWxpZChob3N0LT53cF9waW4pKSB7Ci0JCXJlYWRfb25seSA9IGdwaW9fZ2V0X3ZhbHVlKGhvc3QtPndwX3Bpbik7CisJaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+d3BfcGluKSkgeworCQlyZWFkX29ubHkgPSBncGlvX2dldF92YWx1ZShzbG90LT53cF9waW4pOwogCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgJXNcbiIsCiAJCQkJcmVhZF9vbmx5ID8gInJlYWQtb25seSIgOiAicmVhZC13cml0ZSIpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJm1tYy0+Y2xhc3NfZGV2LAotCQkJIm5vIHBpbiBmb3IgY2hlY2tpbmcgcmVhZC1vbmx5IHN3aXRjaC4iCi0JCQkiIEFzc3VtaW5nIHdyaXRlLWVuYWJsZS5cbiIpOwogCX0KIAogCXJldHVybiByZWFkX29ubHk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGF0bWNpX29wcyA9IHsKK3N0YXRpYyBpbnQgYXRtY2lfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQoreworCWludAkJCXByZXNlbnQgPSAtRU5PU1lTOworCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdCA9IG1tY19wcml2KG1tYyk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChzbG90LT5kZXRlY3RfcGluKSkgeworCQlwcmVzZW50ID0gIWdwaW9fZ2V0X3ZhbHVlKHNsb3QtPmRldGVjdF9waW4pOworCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgJXNwcmVzZW50XG4iLAorCQkJCXByZXNlbnQgPyAiIiA6ICJub3QgIik7CisJfQorCisJcmV0dXJuIHByZXNlbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGF0bWNpX29wcyA9IHsKIAkucmVxdWVzdAk9IGF0bWNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBhdG1jaV9zZXRfaW9zLAogCS5nZXRfcm8JCT0gYXRtY2lfZ2V0X3JvLAorCS5nZXRfY2QJCT0gYXRtY2lfZ2V0X2NkLAogfTsKIAotc3RhdGljIHZvaWQgYXRtY2lfY29tbWFuZF9jb21wbGV0ZShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAotCQkJc3RydWN0IG1tY19jb21tYW5kICpjbWQsIHUzMiBzdGF0dXMpCisvKiBDYWxsZWQgd2l0aCBob3N0LT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGF0bWNpX3JlcXVlc3RfZW5kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQorCV9fcmVsZWFzZXMoJmhvc3QtPmxvY2spCisJX19hY3F1aXJlcygmaG9zdC0+bG9jaykKIHsKKwlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QJKnNsb3QgPSBOVUxMOworCXN0cnVjdCBtbWNfaG9zdAkJKnByZXZfbW1jID0gaG9zdC0+Y3VyX3Nsb3QtPm1tYzsKKworCVdBUk5fT04oaG9zdC0+Y21kIHx8IGhvc3QtPmRhdGEpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIE1NQyBjbG9jayByYXRlIGlmIG5lY2Vzc2FyeS4gVGhpcyBtYXkgYmUKKwkgKiBuZWNlc3NhcnkgaWYgc2V0X2lvcygpIGlzIGNhbGxlZCB3aGVuIGEgZGlmZmVyZW50IHNsb3QgaXMKKwkgKiBidXN5IHRyYW5zZmVyaW5nIGRhdGEuCisJICovCisJaWYgKGhvc3QtPm5lZWRfY2xvY2tfdXBkYXRlKQorCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7CisKKwlob3N0LT5jdXJfc2xvdC0+bXJxID0gTlVMTDsKKwlob3N0LT5tcnEgPSBOVUxMOworCWlmICghbGlzdF9lbXB0eSgmaG9zdC0+cXVldWUpKSB7CisJCXNsb3QgPSBsaXN0X2VudHJ5KGhvc3QtPnF1ZXVlLm5leHQsCisJCQkJc3RydWN0IGF0bWVsX21jaV9zbG90LCBxdWV1ZV9ub2RlKTsKKwkJbGlzdF9kZWwoJnNsb3QtPnF1ZXVlX25vZGUpOworCQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAibGlzdCBub3QgZW1wdHk6ICVzIGlzIG5leHRcbiIsCisJCQkJbW1jX2hvc3RuYW1lKHNsb3QtPm1tYykpOworCQlob3N0LT5zdGF0ZSA9IFNUQVRFX1NFTkRJTkdfQ01EOworCQlhdG1jaV9zdGFydF9yZXF1ZXN0KGhvc3QsIHNsb3QpOworCX0gZWxzZSB7CisJCWRldl92ZGJnKCZob3N0LT5wZGV2LT5kZXYsICJsaXN0IGVtcHR5XG4iKTsKKwkJaG9zdC0+c3RhdGUgPSBTVEFURV9JRExFOworCX0KKworCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKwltbWNfcmVxdWVzdF9kb25lKHByZXZfbW1jLCBtcnEpOworCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWNpX2NvbW1hbmRfY29tcGxldGUoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKKwkJCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQoreworCXUzMgkJc3RhdHVzID0gaG9zdC0+Y21kX3N0YXR1czsKKwogCS8qIFJlYWQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNhcmQgKHVwIHRvIDE2IGJ5dGVzKSAqLwogCWNtZC0+cmVzcFswXSA9IG1jaV9yZWFkbChob3N0LCBSU1BSKTsKIAljbWQtPnJlc3BbMV0gPSBtY2lfcmVhZGwoaG9zdCwgUlNQUik7CkBAIC02MTIsMTEgKzEwMDEsMTIgQEAKIAkJY21kLT5lcnJvciA9IDA7CiAKIAlpZiAoY21kLT5lcnJvcikgewotCQlkZXZfZGJnKCZob3N0LT5tbWMtPmNsYXNzX2RldiwKKwkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAogCQkJImNvbW1hbmQgZXJyb3I6IHN0YXR1cz0weCUwOHhcbiIsIHN0YXR1cyk7CiAKIAkJaWYgKGNtZC0+ZGF0YSkgewogCQkJaG9zdC0+ZGF0YSA9IE5VTEw7CisJCQlhdG1jaV9zdG9wX2RtYShob3N0KTsKIAkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCBNQ0lfTk9UQlVTWQogCQkJCQl8IE1DSV9UWFJEWSB8IE1DSV9SWFJEWQogCQkJCQl8IEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpOwpAQCAtNjI2LDE0NiArMTAxNiwyMjIgQEAKIAogc3RhdGljIHZvaWQgYXRtY2lfZGV0ZWN0X2NoYW5nZSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGF0bWVsX21jaSAqaG9zdCA9IChzdHJ1Y3QgYXRtZWxfbWNpICopZGF0YTsKLQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSA9IGhvc3QtPm1ycTsKLQlpbnQgcHJlc2VudDsKKwlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QJKnNsb3QgPSAoc3RydWN0IGF0bWVsX21jaV9zbG90ICopZGF0YTsKKwlib29sCQkJcHJlc2VudDsKKwlib29sCQkJcHJlc2VudF9vbGQ7CiAKIAkvKgotCSAqIGF0bWNpX3JlbW92ZSgpIHNldHMgZGV0ZWN0X3BpbiB0byAtMSBiZWZvcmUgZnJlZWluZyB0aGUKLQkgKiBpbnRlcnJ1cHQuIFdlIG11c3Qgbm90IHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0IGlmIGl0IGhhcwotCSAqIGJlZW4gZnJlZWQuCisJICogYXRtY2lfY2xlYW51cF9zbG90KCkgc2V0cyB0aGUgQVRNQ0lfU0hVVERPV04gZmxhZyBiZWZvcmUKKwkgKiBmcmVlaW5nIHRoZSBpbnRlcnJ1cHQuIFdlIG11c3Qgbm90IHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0CisJICogaWYgaXQgaGFzIGJlZW4gZnJlZWQsIGFuZCBpZiB3ZSdyZSBzaHV0dGluZyBkb3duLCBpdAorCSAqIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGV0aGVyIHRoZSBjYXJkIGlzIHByZXNlbnQgb3Igbm90LgogCSAqLwogCXNtcF9ybWIoKTsKLQlpZiAoIWdwaW9faXNfdmFsaWQoaG9zdC0+ZGV0ZWN0X3BpbikpCisJaWYgKHRlc3RfYml0KEFUTUNJX1NIVVRET1dOLCAmc2xvdC0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQllbmFibGVfaXJxKGdwaW9fdG9faXJxKGhvc3QtPmRldGVjdF9waW4pKTsKLQlwcmVzZW50ID0gIWdwaW9fZ2V0X3ZhbHVlKGhvc3QtPmRldGVjdF9waW4pOworCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEoc2xvdC0+ZGV0ZWN0X3BpbikpOworCXByZXNlbnQgPSAhZ3Bpb19nZXRfdmFsdWUoc2xvdC0+ZGV0ZWN0X3Bpbik7CisJcHJlc2VudF9vbGQgPSB0ZXN0X2JpdChBVE1DSV9DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CiAKLQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAiZGV0ZWN0IGNoYW5nZTogJWQgKHdhcyAlZClcbiIsCi0JCQlwcmVzZW50LCBob3N0LT5wcmVzZW50KTsKKwlkZXZfdmRiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJkZXRlY3QgY2hhbmdlOiAlZCAod2FzICVkKVxuIiwKKwkJCXByZXNlbnQsIHByZXNlbnRfb2xkKTsKIAotCWlmIChwcmVzZW50ICE9IGhvc3QtPnByZXNlbnQpIHsKLQkJZGV2X2RiZygmaG9zdC0+bW1jLT5jbGFzc19kZXYsICJjYXJkICVzXG4iLAorCWlmIChwcmVzZW50ICE9IHByZXNlbnRfb2xkKSB7CisJCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBzbG90LT5ob3N0OworCQlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKKworCQlkZXZfZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgImNhcmQgJXNcbiIsCiAJCQlwcmVzZW50ID8gImluc2VydGVkIiA6ICJyZW1vdmVkIik7Ci0JCWhvc3QtPnByZXNlbnQgPSBwcmVzZW50OwogCi0JCS8qIFJlc2V0IGNvbnRyb2xsZXIgaWYgY2FyZCBpcyBnb25lICovCi0JCWlmICghcHJlc2VudCkgewotCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX1NXUlNUKTsKLQkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCB+MFVMKTsKLQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9NQ0lFTik7Ci0JCX0KKwkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCQlpZiAoIXByZXNlbnQpCisJCQljbGVhcl9iaXQoQVRNQ0lfQ0FSRF9QUkVTRU5ULCAmc2xvdC0+ZmxhZ3MpOworCQllbHNlCisJCQlzZXRfYml0KEFUTUNJX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKTsKIAogCQkvKiBDbGVhbiB1cCBxdWV1ZSBpZiBwcmVzZW50ICovCisJCW1ycSA9IHNsb3QtPm1ycTsKIAkJaWYgKG1ycSkgewotCQkJLyoKLQkJCSAqIFJlc2V0IGNvbnRyb2xsZXIgdG8gdGVybWluYXRlIGFueSBvbmdvaW5nCi0JCQkgKiBjb21tYW5kcyBvciBkYXRhIHRyYW5zZmVycy4KLQkJCSAqLwotCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX1NXUlNUKTsKKwkJCWlmIChtcnEgPT0gaG9zdC0+bXJxKSB7CisJCQkJLyoKKwkJCQkgKiBSZXNldCBjb250cm9sbGVyIHRvIHRlcm1pbmF0ZSBhbnkgb25nb2luZworCQkJCSAqIGNvbW1hbmRzIG9yIGRhdGEgdHJhbnNmZXJzLgorCQkJCSAqLworCQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7CisJCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSUVOKTsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIE1SLCBob3N0LT5tb2RlX3JlZyk7CiAKLQkJCWlmICghYXRtY2lfaXNfY29tcGxldGVkKGhvc3QsIEVWRU5UX0NNRF9DT01QTEVURSkpCi0JCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKLQotCQkJaWYgKG1ycS0+ZGF0YSAmJiAhYXRtY2lfaXNfY29tcGxldGVkKGhvc3QsCi0JCQkJCQlFVkVOVF9EQVRBX0NPTVBMRVRFKSkgewogCQkJCWhvc3QtPmRhdGEgPSBOVUxMOwotCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCWhvc3QtPmNtZCA9IE5VTEw7CisKKwkJCQlzd2l0Y2ggKGhvc3QtPnN0YXRlKSB7CisJCQkJY2FzZSBTVEFURV9JRExFOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNUQVRFX1NFTkRJTkdfQ01EOgorCQkJCQltcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCQlpZiAoIW1ycS0+ZGF0YSkKKwkJCQkJCWJyZWFrOworCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCQljYXNlIFNUQVRFX1NFTkRJTkdfREFUQToKKwkJCQkJbXJxLT5kYXRhLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCWF0bWNpX3N0b3BfZG1hKGhvc3QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNUQVRFX0RBVEFfQlVTWToKKwkJCQljYXNlIFNUQVRFX0RBVEFfRVJST1I6CisJCQkJCWlmIChtcnEtPmRhdGEtPmVycm9yID09IC1FSU5QUk9HUkVTUykKKwkJCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCQlpZiAoIW1ycS0+c3RvcCkKKwkJCQkJCWJyZWFrOworCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCQljYXNlIFNUQVRFX1NFTkRJTkdfU1RPUDoKKwkJCQkJbXJxLT5zdG9wLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWF0bWNpX3JlcXVlc3RfZW5kKGhvc3QsIG1ycSk7CisJCQl9IGVsc2UgeworCQkJCWxpc3RfZGVsKCZzbG90LT5xdWV1ZV9ub2RlKTsKKwkJCQltcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCWlmIChtcnEtPmRhdGEpCisJCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCWlmIChtcnEtPnN0b3ApCisJCQkJCW1ycS0+c3RvcC0+ZXJyb3IgPSAtRU5PTUVESVVNOworCisJCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkJCW1tY19yZXF1ZXN0X2RvbmUoc2xvdC0+bW1jLCBtcnEpOworCQkJCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAJCQl9Ci0JCQlpZiAobXJxLT5zdG9wICYmICFhdG1jaV9pc19jb21wbGV0ZWQoaG9zdCwKLQkJCQkJCUVWRU5UX1NUT1BfQ09NUExFVEUpKQotCQkJCW1ycS0+c3RvcC0+ZXJyb3IgPSAtRU5PTUVESVVNOwotCi0JCQlob3N0LT5jbWQgPSBOVUxMOwotCQkJYXRtY2lfcmVxdWVzdF9lbmQoaG9zdC0+bW1jLCBtcnEpOwogCQl9CisJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIAotCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIDApOworCQltbWNfZGV0ZWN0X2NoYW5nZShzbG90LT5tbWMsIDApOwogCX0KIH0KIAogc3RhdGljIHZvaWQgYXRtY2lfdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgcHJpdikKIHsKLQlzdHJ1Y3QgbW1jX2hvc3QJCSptbWMgPSAoc3RydWN0IG1tY19ob3N0ICopcHJpdjsKLQlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gKHN0cnVjdCBhdG1lbF9tY2kgKilwcml2OwogCXN0cnVjdCBtbWNfcmVxdWVzdAkqbXJxID0gaG9zdC0+bXJxOwogCXN0cnVjdCBtbWNfZGF0YQkJKmRhdGEgPSBob3N0LT5kYXRhOworCXN0cnVjdCBtbWNfY29tbWFuZAkqY21kID0gaG9zdC0+Y21kOworCWVudW0gYXRtZWxfbWNpX3N0YXRlCXN0YXRlID0gaG9zdC0+c3RhdGU7CisJZW51bSBhdG1lbF9tY2lfc3RhdGUJcHJldl9zdGF0ZTsKKwl1MzIJCQlzdGF0dXM7CiAKLQlkZXZfdmRiZygmbW1jLT5jbGFzc19kZXYsCi0JCSJ0YXNrbGV0OiBwZW5kaW5nL2NvbXBsZXRlZC9tYXNrICVseC8lbHgvJXhcbiIsCi0JCWhvc3QtPnBlbmRpbmdfZXZlbnRzLCBob3N0LT5jb21wbGV0ZWRfZXZlbnRzLAorCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CisKKwlzdGF0ZSA9IGhvc3QtPnN0YXRlOworCisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJInRhc2tsZXQ6IHN0YXRlICV1IHBlbmRpbmcvY29tcGxldGVkL21hc2sgJWx4LyVseC8leFxuIiwKKwkJc3RhdGUsIGhvc3QtPnBlbmRpbmdfZXZlbnRzLCBob3N0LT5jb21wbGV0ZWRfZXZlbnRzLAogCQltY2lfcmVhZGwoaG9zdCwgSU1SKSk7CiAKLQlpZiAoYXRtY2lfdGVzdF9hbmRfY2xlYXJfcGVuZGluZyhob3N0LCBFVkVOVF9DTURfQ09NUExFVEUpKSB7Ci0JCS8qCi0JCSAqIGhvc3QtPmNtZCBtdXN0IGJlIHNldCB0byBOVUxMIGJlZm9yZSB0aGUgaW50ZXJydXB0Ci0JCSAqIGhhbmRsZXIgc2VlcyBFVkVOVF9DTURfQ09NUExFVEUKLQkJICovCi0JCWhvc3QtPmNtZCA9IE5VTEw7Ci0JCXNtcF93bWIoKTsKLQkJYXRtY2lfc2V0X2NvbXBsZXRlZChob3N0LCBFVkVOVF9DTURfQ09NUExFVEUpOwotCQlhdG1jaV9jb21tYW5kX2NvbXBsZXRlKGhvc3QsIG1ycS0+Y21kLCBob3N0LT5jbWRfc3RhdHVzKTsKKwlkbyB7CisJCXByZXZfc3RhdGUgPSBzdGF0ZTsKIAotCQlpZiAoIW1ycS0+Y21kLT5lcnJvciAmJiBtcnEtPnN0b3AKLQkJCQkmJiBhdG1jaV9pc19jb21wbGV0ZWQoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSkKLQkJCQkmJiAhYXRtY2lfdGVzdF9hbmRfc2V0X2NvbXBsZXRlZChob3N0LAotCQkJCQlFVkVOVF9TVE9QX1NFTlQpKQotCQkJc2VuZF9zdG9wX2NtZChob3N0LT5tbWMsIG1ycS0+ZGF0YSk7Ci0JfQotCWlmIChhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsIEVWRU5UX1NUT1BfQ09NUExFVEUpKSB7Ci0JCS8qCi0JCSAqIGhvc3QtPmNtZCBtdXN0IGJlIHNldCB0byBOVUxMIGJlZm9yZSB0aGUgaW50ZXJydXB0Ci0JCSAqIGhhbmRsZXIgc2VlcyBFVkVOVF9TVE9QX0NPTVBMRVRFCi0JCSAqLwotCQlob3N0LT5jbWQgPSBOVUxMOwotCQlzbXBfd21iKCk7Ci0JCWF0bWNpX3NldF9jb21wbGV0ZWQoaG9zdCwgRVZFTlRfU1RPUF9DT01QTEVURSk7Ci0JCWF0bWNpX2NvbW1hbmRfY29tcGxldGUoaG9zdCwgbXJxLT5zdG9wLCBob3N0LT5zdG9wX3N0YXR1cyk7Ci0JfQotCWlmIChhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsIEVWRU5UX0RBVEFfRVJST1IpKSB7Ci0JCXUzMiBzdGF0dXMgPSBob3N0LT5kYXRhX3N0YXR1czsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNUQVRFX0lETEU6CisJCQlicmVhazsKIAotCQlkZXZfdmRiZygmbW1jLT5jbGFzc19kZXYsICJkYXRhIGVycm9yOiBzdGF0dXM9JTA4eFxuIiwgc3RhdHVzKTsKKwkJY2FzZSBTVEFURV9TRU5ESU5HX0NNRDoKKwkJCWlmICghYXRtY2lfdGVzdF9hbmRfY2xlYXJfcGVuZGluZyhob3N0LAorCQkJCQkJRVZFTlRfQ01EX0NPTVBMRVRFKSkKKwkJCQlicmVhazsKIAotCQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfRVJST1IpOwotCQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfQ09NUExFVEUpOworCQkJaG9zdC0+Y21kID0gTlVMTDsKKwkJCWF0bWNpX3NldF9jb21wbGV0ZWQoaG9zdCwgRVZFTlRfQ01EX0NPTVBMRVRFKTsKKwkJCWF0bWNpX2NvbW1hbmRfY29tcGxldGUoaG9zdCwgbXJxLT5jbWQpOworCQkJaWYgKCFtcnEtPmRhdGEgfHwgY21kLT5lcnJvcikgeworCQkJCWF0bWNpX3JlcXVlc3RfZW5kKGhvc3QsIGhvc3QtPm1ycSk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CiAKLQkJaWYgKHN0YXR1cyAmIE1DSV9EVE9FKSB7Ci0JCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwKLQkJCQkJImRhdGEgdGltZW91dCBlcnJvclxuIik7Ci0JCQlkYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNJX0RDUkNFKSB7Ci0JCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImRhdGEgQ1JDIGVycm9yXG4iKTsKLQkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoJm1tYy0+Y2xhc3NfZGV2LAotCQkJCQkiZGF0YSBGSUZPIGVycm9yIChzdGF0dXM9JTA4eClcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQlwcmV2X3N0YXRlID0gc3RhdGUgPSBTVEFURV9TRU5ESU5HX0RBVEE7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFNUQVRFX1NFTkRJTkdfREFUQToKKwkJCWlmIChhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsCisJCQkJCQlFVkVOVF9EQVRBX0VSUk9SKSkgeworCQkJCWF0bWNpX3N0b3BfZG1hKGhvc3QpOworCQkJCWlmIChkYXRhLT5zdG9wKQorCQkJCQlzZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOworCQkJCXN0YXRlID0gU1RBVEVfREFUQV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsCisJCQkJCQlFVkVOVF9YRkVSX0NPTVBMRVRFKSkKKwkJCQlicmVhazsKKworCQkJYXRtY2lfc2V0X2NvbXBsZXRlZChob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwkJCXByZXZfc3RhdGUgPSBzdGF0ZSA9IFNUQVRFX0RBVEFfQlVTWTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgU1RBVEVfREFUQV9CVVNZOgorCQkJaWYgKCFhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsCisJCQkJCQlFVkVOVF9EQVRBX0NPTVBMRVRFKSkKKwkJCQlicmVhazsKKworCQkJaG9zdC0+ZGF0YSA9IE5VTEw7CisJCQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfQ09NUExFVEUpOworCQkJc3RhdHVzID0gaG9zdC0+ZGF0YV9zdGF0dXM7CisJCQlpZiAodW5saWtlbHkoc3RhdHVzICYgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUykpIHsKKwkJCQlpZiAoc3RhdHVzICYgTUNJX0RUT0UpIHsKKwkJCQkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkJCSJkYXRhIHRpbWVvdXQgZXJyb3JcbiIpOworCQkJCQlkYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7CisJCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0lfRENSQ0UpIHsKKwkJCQkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkJCSJkYXRhIENSQyBlcnJvclxuIik7CisJCQkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJCQkiZGF0YSBGSUZPIGVycm9yIChzdGF0dXM9JTA4eClcbiIsCisJCQkJCQlzdGF0dXMpOworCQkJCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKKwkJCQlkYXRhLT5lcnJvciA9IDA7CisJCQl9CisKKwkJCWlmICghZGF0YS0+c3RvcCkgeworCQkJCWF0bWNpX3JlcXVlc3RfZW5kKGhvc3QsIGhvc3QtPm1ycSk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisKKwkJCXByZXZfc3RhdGUgPSBzdGF0ZSA9IFNUQVRFX1NFTkRJTkdfU1RPUDsKKwkJCWlmICghZGF0YS0+ZXJyb3IpCisJCQkJc2VuZF9zdG9wX2NtZChob3N0LCBkYXRhKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgU1RBVEVfU0VORElOR19TVE9QOgorCQkJaWYgKCFhdG1jaV90ZXN0X2FuZF9jbGVhcl9wZW5kaW5nKGhvc3QsCisJCQkJCQlFVkVOVF9DTURfQ09NUExFVEUpKQorCQkJCWJyZWFrOworCisJCQlob3N0LT5jbWQgPSBOVUxMOworCQkJYXRtY2lfY29tbWFuZF9jb21wbGV0ZShob3N0LCBtcnEtPnN0b3ApOworCQkJYXRtY2lfcmVxdWVzdF9lbmQoaG9zdCwgaG9zdC0+bXJxKTsKKwkJCWdvdG8gdW5sb2NrOworCisJCWNhc2UgU1RBVEVfREFUQV9FUlJPUjoKKwkJCWlmICghYXRtY2lfdGVzdF9hbmRfY2xlYXJfcGVuZGluZyhob3N0LAorCQkJCQkJRVZFTlRfWEZFUl9DT01QTEVURSkpCisJCQkJYnJlYWs7CisKKwkJCXN0YXRlID0gU1RBVEVfREFUQV9CVVNZOworCQkJYnJlYWs7CiAJCX0KKwl9IHdoaWxlIChzdGF0ZSAhPSBwcmV2X3N0YXRlKTsKIAotCQlpZiAoaG9zdC0+cHJlc2VudCAmJiBkYXRhLT5zdG9wCi0JCQkJJiYgYXRtY2lfaXNfY29tcGxldGVkKGhvc3QsIEVWRU5UX0NNRF9DT01QTEVURSkKLQkJCQkmJiAhYXRtY2lfdGVzdF9hbmRfc2V0X2NvbXBsZXRlZCgKLQkJCQkJaG9zdCwgRVZFTlRfU1RPUF9TRU5UKSkKLQkJCXNlbmRfc3RvcF9jbWQoaG9zdC0+bW1jLCBkYXRhKTsKKwlob3N0LT5zdGF0ZSA9IHN0YXRlOwogCi0JCWhvc3QtPmRhdGEgPSBOVUxMOwotCX0KLQlpZiAoYXRtY2lfdGVzdF9hbmRfY2xlYXJfcGVuZGluZyhob3N0LCBFVkVOVF9EQVRBX0NPTVBMRVRFKSkgewotCQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfQ09NUExFVEUpOwotCi0JCWlmICghYXRtY2lfaXNfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfRVJST1IpKSB7Ci0JCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKLQkJCWRhdGEtPmVycm9yID0gMDsKLQkJfQotCi0JCWhvc3QtPmRhdGEgPSBOVUxMOwotCX0KLQotCWlmIChob3N0LT5tcnEgJiYgIWhvc3QtPmNtZCAmJiAhaG9zdC0+ZGF0YSkKLQkJYXRtY2lfcmVxdWVzdF9lbmQobW1jLCBob3N0LT5tcnEpOwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRtY2lfcmVhZF9kYXRhX3BpbyhzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQpAQCAtNzg3LDYgKzEyNTMsNyBAQAogCQkJbmJ5dGVzICs9IDQ7CiAKIAkJCWlmIChvZmZzZXQgPT0gc2ctPmxlbmd0aCkgeworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHNnX3BhZ2Uoc2cpKTsKIAkJCQlob3N0LT5zZyA9IHNnID0gc2dfbmV4dChzZyk7CiAJCQkJaWYgKCFzZykKIAkJCQkJZ290byBkb25lOwpAQCAtODE1LDkgKzEyODIsMTEgQEAKIAkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCAoTUNJX05PVEJVU1kgfCBNQ0lfUlhSRFkKIAkJCQkJCXwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUykpOwogCQkJaG9zdC0+ZGF0YV9zdGF0dXMgPSBzdGF0dXM7CisJCQlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbmJ5dGVzOworCQkJc21wX3dtYigpOwogCQkJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfREFUQV9FUlJPUik7CiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAJfSB3aGlsZSAoc3RhdHVzICYgTUNJX1JYUkRZKTsKIApAQCAtODMwLDEwICsxMjk5LDggQEAKIAltY2lfd3JpdGVsKGhvc3QsIElEUiwgTUNJX1JYUkRZKTsKIAltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX05PVEJVU1kpOwogCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7Ci0JYXRtY2lfc2V0X2NvbXBsZXRlZChob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKLQlpZiAoZGF0YS0+c3RvcCAmJiBhdG1jaV9pc19jb21wbGV0ZWQoaG9zdCwgRVZFTlRfQ01EX0NPTVBMRVRFKQotCQkJJiYgIWF0bWNpX3Rlc3RfYW5kX3NldF9jb21wbGV0ZWQoaG9zdCwgRVZFTlRfU1RPUF9TRU5UKSkKLQkJc2VuZF9zdG9wX2NtZChob3N0LT5tbWMsIGRhdGEpOworCXNtcF93bWIoKTsKKwlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKIH0KIAogc3RhdGljIHZvaWQgYXRtY2lfd3JpdGVfZGF0YV9waW8oc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKQEAgLTg4Niw5ICsxMzUzLDExIEBACiAJCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgKE1DSV9OT1RCVVNZIHwgTUNJX1RYUkRZCiAJCQkJCQl8IEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpKTsKIAkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwkJCXNtcF93bWIoKTsKIAkJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX0RBVEFfRVJST1IpOwogCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7Ci0JCQlicmVhazsKKwkJCXJldHVybjsKIAkJfQogCX0gd2hpbGUgKHN0YXR1cyAmIE1DSV9UWFJEWSk7CiAKQEAgLTkwMSwzOCArMTM3MCwyNiBAQAogCW1jaV93cml0ZWwoaG9zdCwgSURSLCBNQ0lfVFhSRFkpOwogCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBNQ0lfTk9UQlVTWSk7CiAJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKLQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOwotCWlmIChkYXRhLT5zdG9wICYmIGF0bWNpX2lzX2NvbXBsZXRlZChob3N0LCBFVkVOVF9DTURfQ09NUExFVEUpCi0JCQkmJiAhYXRtY2lfdGVzdF9hbmRfc2V0X2NvbXBsZXRlZChob3N0LCBFVkVOVF9TVE9QX1NFTlQpKQotCQlzZW5kX3N0b3BfY21kKGhvc3QtPm1tYywgZGF0YSk7CisJc21wX3dtYigpOworCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOwogfQogCi1zdGF0aWMgdm9pZCBhdG1jaV9jbWRfaW50ZXJydXB0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCB1MzIgc3RhdHVzKQorc3RhdGljIHZvaWQgYXRtY2lfY21kX2ludGVycnVwdChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCB1MzIgc3RhdHVzKQogewotCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJbWNpX3dyaXRlbChob3N0LCBJRFIsIE1DSV9DTURSRFkpOwogCi0JaWYgKGF0bWNpX2lzX2NvbXBsZXRlZChob3N0LCBFVkVOVF9TVE9QX1NFTlQpKSB7Ci0JCWhvc3QtPnN0b3Bfc3RhdHVzID0gc3RhdHVzOwotCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9TVE9QX0NPTVBMRVRFKTsKLQl9IGVsc2UgewotCQlob3N0LT5jbWRfc3RhdHVzID0gc3RhdHVzOwotCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9DTURfQ09NUExFVEUpOwotCX0KLQorCWhvc3QtPmNtZF9zdGF0dXMgPSBzdGF0dXM7CisJc21wX3dtYigpOworCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX0NNRF9DT01QTEVURSk7CiAJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhdG1jaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBtbWNfaG9zdAkJKm1tYyA9IGRldl9pZDsKLQlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gZGV2X2lkOwogCXUzMgkJCXN0YXR1cywgbWFzaywgcGVuZGluZzsKIAl1bnNpZ25lZCBpbnQJCXBhc3NfY291bnQgPSAwOwogCi0Jc3Bpbl9sb2NrKCZtbWMtPmxvY2spOwotCiAJZG8gewogCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgU1IpOwogCQltYXNrID0gbWNpX3JlYWRsKGhvc3QsIElNUik7CkBAIC05NDQsMTMgKzE0MDEsMTggQEAKIAkJCW1jaV93cml0ZWwoaG9zdCwgSURSLCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTCiAJCQkJCXwgTUNJX1JYUkRZIHwgTUNJX1RYUkRZKTsKIAkJCXBlbmRpbmcgJj0gbWNpX3JlYWRsKGhvc3QsIElNUik7CisKIAkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOwogCQkJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfREFUQV9FUlJPUik7CiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAkJfQogCQlpZiAocGVuZGluZyAmIE1DSV9OT1RCVVNZKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgKE1DSV9OT1RCVVNZCi0JCQkJCSAgICAgICB8IEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpKTsKKwkJCW1jaV93cml0ZWwoaG9zdCwgSURSLAorCQkJCQlBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTIHwgTUNJX05PVEJVU1kpOworCQkJaWYgKCFob3N0LT5kYXRhX3N0YXR1cykKKwkJCQlob3N0LT5kYXRhX3N0YXR1cyA9IHN0YXR1czsKKwkJCXNtcF93bWIoKTsKIAkJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX0RBVEFfQ09NUExFVEUpOwogCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiAJCX0KQEAgLTk2MCwxOCArMTQyMiwxNSBAQAogCQkJYXRtY2lfd3JpdGVfZGF0YV9waW8oaG9zdCk7CiAKIAkJaWYgKHBlbmRpbmcgJiBNQ0lfQ01EUkRZKQotCQkJYXRtY2lfY21kX2ludGVycnVwdChtbWMsIHN0YXR1cyk7CisJCQlhdG1jaV9jbWRfaW50ZXJydXB0KGhvc3QsIHN0YXR1cyk7CiAJfSB3aGlsZSAocGFzc19jb3VudCsrIDwgNSk7CiAKLQlzcGluX3VubG9jaygmbW1jLT5sb2NrKTsKLQogCXJldHVybiBwYXNzX2NvdW50ID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGF0bWNpX2RldGVjdF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBtbWNfaG9zdAkJKm1tYyA9IGRldl9pZDsKLQlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QJKnNsb3QgPSBkZXZfaWQ7CiAKIAkvKgogCSAqIERpc2FibGUgaW50ZXJydXB0cyB1bnRpbCB0aGUgcGluIGhhcyBzdGFiaWxpemVkIGFuZCBjaGVjawpAQCAtOTc5LDE5ICsxNDM4LDE3NiBAQAogCSAqIG1pZGRsZSBvZiB0aGUgdGltZXIgcm91dGluZSB3aGVuIHRoaXMgaW50ZXJydXB0IHRyaWdnZXJzLgogCSAqLwogCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCW1vZF90aW1lcigmaG9zdC0+ZGV0ZWN0X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCkpOworCW1vZF90aW1lcigmc2xvdC0+ZGV0ZWN0X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRtZWxfbWNpICoKK2RtYV9jbGllbnRfdG9fYXRtZWxfbWNpKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCBhdG1lbF9tY2ksIGRtYS5jbGllbnQpOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50IGF0bWNpX2RtYV9ldmVudChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LAorCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3Q7CisJZW51bSBkbWFfc3RhdGVfY2xpZW50CXJldCA9IERNQV9OQUs7CisKKwlob3N0ID0gZG1hX2NsaWVudF90b19hdG1lbF9tY2koY2xpZW50KTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIERNQV9SRVNPVVJDRV9BVkFJTEFCTEU6CisJCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7CisJCWlmICghaG9zdC0+ZG1hLmNoYW4pIHsKKwkJCWhvc3QtPmRtYS5jaGFuID0gY2hhbjsKKwkJCXJldCA9IERNQV9BQ0s7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOworCisJCWlmIChyZXQgPT0gRE1BX0FDSykKKwkJCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJCSJVc2luZyAlcyBmb3IgRE1BIHRyYW5zZmVyc1xuIiwKKwkJCQkJY2hhbi0+ZGV2LmJ1c19pZCk7CisJCWJyZWFrOworCisJY2FzZSBETUFfUkVTT1VSQ0VfUkVNT1ZFRDoKKwkJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwkJaWYgKGhvc3QtPmRtYS5jaGFuID09IGNoYW4pIHsKKwkJCWhvc3QtPmRtYS5jaGFuID0gTlVMTDsKKwkJCXJldCA9IERNQV9BQ0s7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOworCisJCWlmIChyZXQgPT0gRE1BX0FDSykKKwkJCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJCSJMb3N0ICVzLCBmYWxsaW5nIGJhY2sgdG8gUElPXG4iLAorCQkJCQljaGFuLT5kZXYuYnVzX2lkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KKworc3RhdGljIGludCBfX2luaXQgYXRtY2lfaW5pdF9zbG90KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCisJCXN0cnVjdCBtY2lfc2xvdF9wZGF0YSAqc2xvdF9kYXRhLCB1bnNpZ25lZCBpbnQgaWQsCisJCXUzMiBzZGNfcmVnKQoreworCXN0cnVjdCBtbWNfaG9zdAkJCSptbWM7CisJc3RydWN0IGF0bWVsX21jaV9zbG90CQkqc2xvdDsKKworCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QpLCAmaG9zdC0+cGRldi0+ZGV2KTsKKwlpZiAoIW1tYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbG90ID0gbW1jX3ByaXYobW1jKTsKKwlzbG90LT5tbWMgPSBtbWM7CisJc2xvdC0+aG9zdCA9IGhvc3Q7CisJc2xvdC0+ZGV0ZWN0X3BpbiA9IHNsb3RfZGF0YS0+ZGV0ZWN0X3BpbjsKKwlzbG90LT53cF9waW4gPSBzbG90X2RhdGEtPndwX3BpbjsKKwlzbG90LT5zZGNfcmVnID0gc2RjX3JlZzsKKworCW1tYy0+b3BzID0gJmF0bWNpX29wczsKKwltbWMtPmZfbWluID0gRElWX1JPVU5EX1VQKGhvc3QtPmJ1c19oeiwgNTEyKTsKKwltbWMtPmZfbWF4ID0gaG9zdC0+YnVzX2h6IC8gMjsKKwltbWMtPm9jcl9hdmFpbAk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworCWlmIChzbG90X2RhdGEtPmJ1c193aWR0aCA+PSA0KQorCQltbWMtPmNhcHMgfD0gTU1DX0NBUF80X0JJVF9EQVRBOworCisJbW1jLT5tYXhfaHdfc2VncyA9IDY0OworCW1tYy0+bWF4X3BoeXNfc2VncyA9IDY0OworCW1tYy0+bWF4X3JlcV9zaXplID0gMzI3NjggKiA1MTI7CisJbW1jLT5tYXhfYmxrX3NpemUgPSAzMjc2ODsKKwltbWMtPm1heF9ibGtfY291bnQgPSA1MTI7CisKKwkvKiBBc3N1bWUgY2FyZCBpcyBwcmVzZW50IGluaXRpYWxseSAqLworCXNldF9iaXQoQVRNQ0lfQ0FSRF9QUkVTRU5ULCAmc2xvdC0+ZmxhZ3MpOworCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPmRldGVjdF9waW4pKSB7CisJCWlmIChncGlvX3JlcXVlc3Qoc2xvdC0+ZGV0ZWN0X3BpbiwgIm1tY19kZXRlY3QiKSkgeworCQkJZGV2X2RiZygmbW1jLT5jbGFzc19kZXYsICJubyBkZXRlY3QgcGluIGF2YWlsYWJsZVxuIik7CisJCQlzbG90LT5kZXRlY3RfcGluID0gLUVCVVNZOworCQl9IGVsc2UgaWYgKGdwaW9fZ2V0X3ZhbHVlKHNsb3QtPmRldGVjdF9waW4pKSB7CisJCQljbGVhcl9iaXQoQVRNQ0lfQ0FSRF9QUkVTRU5ULCAmc2xvdC0+ZmxhZ3MpOworCQl9CisJfQorCisJaWYgKCFncGlvX2lzX3ZhbGlkKHNsb3QtPmRldGVjdF9waW4pKQorCQltbWMtPmNhcHMgfD0gTU1DX0NBUF9ORUVEU19QT0xMOworCisJaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+d3BfcGluKSkgeworCQlpZiAoZ3Bpb19yZXF1ZXN0KHNsb3QtPndwX3BpbiwgIm1tY193cCIpKSB7CisJCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgIm5vIFdQIHBpbiBhdmFpbGFibGVcbiIpOworCQkJc2xvdC0+d3BfcGluID0gLUVCVVNZOworCQl9CisJfQorCisJaG9zdC0+c2xvdFtpZF0gPSBzbG90OworCW1tY19hZGRfaG9zdChtbWMpOworCisJaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+ZGV0ZWN0X3BpbikpIHsKKwkJaW50IHJldDsKKworCQlzZXR1cF90aW1lcigmc2xvdC0+ZGV0ZWN0X3RpbWVyLCBhdG1jaV9kZXRlY3RfY2hhbmdlLAorCQkJCSh1bnNpZ25lZCBsb25nKXNsb3QpOworCisJCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKHNsb3QtPmRldGVjdF9waW4pLAorCQkJCWF0bWNpX2RldGVjdF9pbnRlcnJ1cHQsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJtbWMtZGV0ZWN0Iiwgc2xvdCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9kYmcoJm1tYy0+Y2xhc3NfZGV2LAorCQkJCSJjb3VsZCBub3QgcmVxdWVzdCBJUlEgJWQgZm9yIGRldGVjdCBwaW5cbiIsCisJCQkJZ3Bpb190b19pcnEoc2xvdC0+ZGV0ZWN0X3BpbikpOworCQkJZ3Bpb19mcmVlKHNsb3QtPmRldGVjdF9waW4pOworCQkJc2xvdC0+ZGV0ZWN0X3BpbiA9IC1FQlVTWTsKKwkJfQorCX0KKworCWF0bWNpX2luaXRfZGVidWdmcyhzbG90KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtY2lfY2xlYW51cF9zbG90KHN0cnVjdCBhdG1lbF9tY2lfc2xvdCAqc2xvdCwKKwkJdW5zaWduZWQgaW50IGlkKQoreworCS8qIERlYnVnZnMgc3R1ZmYgaXMgY2xlYW5lZCB1cCBieSBtbWMgY29yZSAqLworCisJc2V0X2JpdChBVE1DSV9TSFVURE9XTiwgJnNsb3QtPmZsYWdzKTsKKwlzbXBfd21iKCk7CisKKwltbWNfcmVtb3ZlX2hvc3Qoc2xvdC0+bW1jKTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPmRldGVjdF9waW4pKSB7CisJCWludCBwaW4gPSBzbG90LT5kZXRlY3RfcGluOworCisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBpbiksIHNsb3QpOworCQlkZWxfdGltZXJfc3luYygmc2xvdC0+ZGV0ZWN0X3RpbWVyKTsKKwkJZ3Bpb19mcmVlKHBpbik7CisJfQorCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPndwX3BpbikpCisJCWdwaW9fZnJlZShzbG90LT53cF9waW4pOworCisJc2xvdC0+aG9zdC0+c2xvdFtpZF0gPSBOVUxMOworCW1tY19mcmVlX2hvc3Qoc2xvdC0+bW1jKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgYXRtY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwotCXN0cnVjdCBhdG1lbF9tY2kgKmhvc3Q7Ci0Jc3RydWN0IG1tY19ob3N0ICptbWM7Ci0Jc3RydWN0IHJlc291cmNlICpyZWdzOwotCWludCBpcnE7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgYXRtZWxfbWNpCQkqaG9zdDsKKwlzdHJ1Y3QgcmVzb3VyY2UJCQkqcmVnczsKKwl1bnNpZ25lZCBpbnQJCQlucl9zbG90czsKKwlpbnQJCQkJaXJxOworCWludAkJCQlyZXQ7CiAKIAlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXJlZ3MpCkBAIC0xMDAzLDE1ICsxNjE5LDEzIEBACiAJaWYgKGlycSA8IDApCiAJCXJldHVybiBpcnE7CiAKLQltbWMgPSBtbWNfYWxsb2NfaG9zdChzaXplb2Yoc3RydWN0IGF0bWVsX21jaSksICZwZGV2LT5kZXYpOwotCWlmICghbW1jKQorCWhvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtZWxfbWNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOwogCWhvc3QtPnBkZXYgPSBwZGV2OwotCWhvc3QtPm1tYyA9IG1tYzsKLQlob3N0LT5kZXRlY3RfcGluID0gcGRhdGEtPmRldGVjdF9waW47Ci0JaG9zdC0+d3BfcGluID0gcGRhdGEtPndwX3BpbjsKKwlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmhvc3QtPnF1ZXVlKTsKIAogCWhvc3QtPm1jayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jaV9jbGsiKTsKIAlpZiAoSVNfRVJSKGhvc3QtPm1jaykpIHsKQEAgLTEwMzEsMTE4ICsxNjQ1LDEwMiBAQAogCiAJaG9zdC0+bWFwYmFzZSA9IHJlZ3MtPnN0YXJ0OwogCi0JbW1jLT5vcHMgPSAmYXRtY2lfb3BzOwotCW1tYy0+Zl9taW4gPSAoaG9zdC0+YnVzX2h6ICsgNTExKSAvIDUxMjsKLQltbWMtPmZfbWF4ID0gaG9zdC0+YnVzX2h6IC8gMjsKLQltbWMtPm9jcl9hdmFpbAk9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OwotCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzRfQklUX0RBVEE7CisJdGFza2xldF9pbml0KCZob3N0LT50YXNrbGV0LCBhdG1jaV90YXNrbGV0X2Z1bmMsICh1bnNpZ25lZCBsb25nKWhvc3QpOwogCi0JbW1jLT5tYXhfaHdfc2VncyA9IDY0OwotCW1tYy0+bWF4X3BoeXNfc2VncyA9IDY0OwotCW1tYy0+bWF4X3JlcV9zaXplID0gMzI3NjggKiA1MTI7Ci0JbW1jLT5tYXhfYmxrX3NpemUgPSAzMjc2ODsKLQltbWMtPm1heF9ibGtfY291bnQgPSA1MTI7Ci0KLQl0YXNrbGV0X2luaXQoJmhvc3QtPnRhc2tsZXQsIGF0bWNpX3Rhc2tsZXRfZnVuYywgKHVuc2lnbmVkIGxvbmcpbW1jKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXRtY2lfaW50ZXJydXB0LCAwLCBwZGV2LT5kZXYuYnVzX2lkLCBtbWMpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXRtY2lfaW50ZXJydXB0LCAwLCBwZGV2LT5kZXYuYnVzX2lkLCBob3N0KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKIAotCS8qIEFzc3VtZSBjYXJkIGlzIHByZXNlbnQgaWYgd2UgZG9uJ3QgaGF2ZSBhIGRldGVjdCBwaW4gKi8KLQlob3N0LT5wcmVzZW50ID0gMTsKLQlpZiAoZ3Bpb19pc192YWxpZChob3N0LT5kZXRlY3RfcGluKSkgewotCQlpZiAoZ3Bpb19yZXF1ZXN0KGhvc3QtPmRldGVjdF9waW4sICJtbWNfZGV0ZWN0IikpIHsKLQkJCWRldl9kYmcoJm1tYy0+Y2xhc3NfZGV2LCAibm8gZGV0ZWN0IHBpbiBhdmFpbGFibGVcbiIpOwotCQkJaG9zdC0+ZGV0ZWN0X3BpbiA9IC0xOwotCQl9IGVsc2UgewotCQkJaG9zdC0+cHJlc2VudCA9ICFncGlvX2dldF92YWx1ZShob3N0LT5kZXRlY3RfcGluKTsKLQkJfQorI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCisJaWYgKHBkYXRhLT5kbWFfc2xhdmUpIHsKKwkJc3RydWN0IGRtYV9zbGF2ZSAqc2xhdmUgPSBwZGF0YS0+ZG1hX3NsYXZlOworCisJCXNsYXZlLT50eF9yZWcgPSByZWdzLT5zdGFydCArIE1DSV9URFI7CisJCXNsYXZlLT5yeF9yZWcgPSByZWdzLT5zdGFydCArIE1DSV9SRFI7CisKKwkJLyogVHJ5IHRvIGdyYWIgYSBETUEgY2hhbm5lbCAqLworCQlob3N0LT5kbWEuY2xpZW50LmV2ZW50X2NhbGxiYWNrID0gYXRtY2lfZG1hX2V2ZW50OworCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIGhvc3QtPmRtYS5jbGllbnQuY2FwX21hc2spOworCQlob3N0LT5kbWEuY2xpZW50LnNsYXZlID0gc2xhdmU7CisKKwkJZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcigmaG9zdC0+ZG1hLmNsaWVudCk7CisJCWRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KCZob3N0LT5kbWEuY2xpZW50KTsKKwl9IGVsc2UgeworCQlkZXZfbm90aWNlKCZwZGV2LT5kZXYsICJETUEgbm90IGF2YWlsYWJsZSwgdXNpbmcgUElPXG4iKTsKIAl9Ci0JaWYgKGdwaW9faXNfdmFsaWQoaG9zdC0+d3BfcGluKSkgewotCQlpZiAoZ3Bpb19yZXF1ZXN0KGhvc3QtPndwX3BpbiwgIm1tY193cCIpKSB7Ci0JCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgIm5vIFdQIHBpbiBhdmFpbGFibGVcbiIpOwotCQkJaG9zdC0+d3BfcGluID0gLTE7Ci0JCX0KLQl9CisjZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCi0JbW1jX2FkZF9ob3N0KG1tYyk7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChob3N0LT5kZXRlY3RfcGluKSkgewotCQlzZXR1cF90aW1lcigmaG9zdC0+ZGV0ZWN0X3RpbWVyLCBhdG1jaV9kZXRlY3RfY2hhbmdlLAotCQkJCSh1bnNpZ25lZCBsb25nKWhvc3QpOwotCi0JCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKGhvc3QtPmRldGVjdF9waW4pLAotCQkJCWF0bWNpX2RldGVjdF9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJCSJtbWMtZGV0ZWN0IiwgbW1jKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2RiZygmbW1jLT5jbGFzc19kZXYsCi0JCQkJImNvdWxkIG5vdCByZXF1ZXN0IElSUSAlZCBmb3IgZGV0ZWN0IHBpblxuIiwKLQkJCQlncGlvX3RvX2lycShob3N0LT5kZXRlY3RfcGluKSk7Ci0JCQlncGlvX2ZyZWUoaG9zdC0+ZGV0ZWN0X3Bpbik7Ci0JCQlob3N0LT5kZXRlY3RfcGluID0gLTE7Ci0JCX0KKwkvKiBXZSBuZWVkIGF0IGxlYXN0IG9uZSBzbG90IHRvIHN1Y2NlZWQgKi8KKwlucl9zbG90cyA9IDA7CisJcmV0ID0gLUVOT0RFVjsKKwlpZiAocGRhdGEtPnNsb3RbMF0uYnVzX3dpZHRoKSB7CisJCXJldCA9IGF0bWNpX2luaXRfc2xvdChob3N0LCAmcGRhdGEtPnNsb3RbMF0sCisJCQkJTUNJX1NEQ1NFTF9TTE9UX0EsIDApOworCQlpZiAoIXJldCkKKwkJCW5yX3Nsb3RzKys7CisJfQorCWlmIChwZGF0YS0+c2xvdFsxXS5idXNfd2lkdGgpIHsKKwkJcmV0ID0gYXRtY2lfaW5pdF9zbG90KGhvc3QsICZwZGF0YS0+c2xvdFsxXSwKKwkJCQlNQ0lfU0RDU0VMX1NMT1RfQiwgMSk7CisJCWlmICghcmV0KQorCQkJbnJfc2xvdHMrKzsKIAl9CiAKLQlkZXZfaW5mbygmbW1jLT5jbGFzc19kZXYsCi0JCQkiQXRtZWwgTUNJIGNvbnRyb2xsZXIgYXQgMHglMDhseCBpcnEgJWRcbiIsCi0JCQlob3N0LT5tYXBiYXNlLCBpcnEpOworCWlmICghbnJfc2xvdHMpCisJCWdvdG8gZXJyX2luaXRfc2xvdDsKIAotCWF0bWNpX2luaXRfZGVidWdmcyhob3N0KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJIkF0bWVsIE1DSSBjb250cm9sbGVyIGF0IDB4JTA4bHggaXJxICVkLCAldSBzbG90c1xuIiwKKwkJCWhvc3QtPm1hcGJhc2UsIGlycSwgbnJfc2xvdHMpOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9pbml0X3Nsb3Q6CisjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKKwlpZiAocGRhdGEtPmRtYV9zbGF2ZSkKKwkJZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKCZob3N0LT5kbWEuY2xpZW50KTsKKyNlbmRpZgorCWZyZWVfaXJxKGlycSwgaG9zdCk7CiBlcnJfcmVxdWVzdF9pcnE6CiAJaW91bm1hcChob3N0LT5yZWdzKTsKIGVycl9pb3JlbWFwOgogCWNsa19wdXQoaG9zdC0+bWNrKTsKIGVycl9jbGtfZ2V0OgotCW1tY19mcmVlX2hvc3QobW1jKTsKKwlrZnJlZShob3N0KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IF9fZXhpdCBhdG1jaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgYXRtZWxfbWNpICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludAkJaTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCi0JaWYgKGhvc3QpIHsKLQkJLyogRGVidWdmcyBzdHVmZiBpcyBjbGVhbmVkIHVwIGJ5IG1tYyBjb3JlICovCi0KLQkJaWYgKGdwaW9faXNfdmFsaWQoaG9zdC0+ZGV0ZWN0X3BpbikpIHsKLQkJCWludCBwaW4gPSBob3N0LT5kZXRlY3RfcGluOwotCi0JCQkvKiBNYWtlIHN1cmUgdGhlIHRpbWVyIGRvZXNuJ3QgZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJCWhvc3QtPmRldGVjdF9waW4gPSAtMTsKLQkJCXNtcF93bWIoKTsKLQotCQkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGluKSwgaG9zdC0+bW1jKTsKLQkJCWRlbF90aW1lcl9zeW5jKCZob3N0LT5kZXRlY3RfdGltZXIpOwotCQkJZ3Bpb19mcmVlKHBpbik7Ci0JCX0KLQotCQltbWNfcmVtb3ZlX2hvc3QoaG9zdC0+bW1jKTsKLQotCQljbGtfZW5hYmxlKGhvc3QtPm1jayk7Ci0JCW1jaV93cml0ZWwoaG9zdCwgSURSLCB+MFVMKTsKLQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSURJUyk7Ci0JCW1jaV9yZWFkbChob3N0LCBTUik7Ci0JCWNsa19kaXNhYmxlKGhvc3QtPm1jayk7Ci0KLQkJaWYgKGdwaW9faXNfdmFsaWQoaG9zdC0+d3BfcGluKSkKLQkJCWdwaW9fZnJlZShob3N0LT53cF9waW4pOwotCi0JCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIGhvc3QtPm1tYyk7Ci0JCWlvdW5tYXAoaG9zdC0+cmVncyk7Ci0KLQkJY2xrX3B1dChob3N0LT5tY2spOwotCi0JCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJCWlmIChob3N0LT5zbG90W2ldKQorCQkJYXRtY2lfY2xlYW51cF9zbG90KGhvc3QtPnNsb3RbaV0sIGkpOwogCX0KKworCWNsa19lbmFibGUoaG9zdC0+bWNrKTsKKwltY2lfd3JpdGVsKGhvc3QsIElEUiwgfjBVTCk7CisJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSURJUyk7CisJbWNpX3JlYWRsKGhvc3QsIFNSKTsKKwljbGtfZGlzYWJsZShob3N0LT5tY2spOworCisjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKKwlpZiAoaG9zdC0+ZG1hLmNsaWVudC5zbGF2ZSkKKwkJZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKCZob3N0LT5kbWEuY2xpZW50KTsKKyNlbmRpZgorCisJZnJlZV9pcnEocGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSwgaG9zdCk7CisJaW91bm1hcChob3N0LT5yZWdzKTsKKworCWNsa19wdXQoaG9zdC0+bWNrKTsKKwlrZnJlZShob3N0KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCmluZGV4IDc1MDNiODEuLjA3ZmFmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCkBAIC05NSw4ICs5NSw2IEBACiAgKiByZWFkcyB3aGljaCB0YWtlcyBub3doZXJlIG5lYXIgdGhhdCBsb25nLiAgT2xkZXIgY2FyZHMgbWF5IGJlIGFibGUgdG8gdXNlCiAgKiBzaG9ydGVyIHRpbWVvdXRzIC4uLiBidXQgd2h5IGJvdGhlcj8KICAqLwotI2RlZmluZSByZWFkYmxvY2tfdGltZW91dAlrdGltZV9zZXQoMCwgMTAwICogMTAwMCAqIDEwMDApCi0jZGVmaW5lIHdyaXRlYmxvY2tfdGltZW91dAlrdGltZV9zZXQoMCwgMjUwICogMTAwMCAqIDEwMDApCiAjZGVmaW5lIHIxYl90aW1lb3V0CQlrdGltZV9zZXQoMywgMCkKIAogCkBAIC0yMjAsOSArMjE4LDkgQEAKIAlyZXR1cm4gbW1jX3NwaV9za2lwKGhvc3QsIHRpbWVvdXQsIHNpemVvZihob3N0LT5kYXRhLT5zdGF0dXMpLCAwKTsKIH0KIAotc3RhdGljIGludCBtbWNfc3BpX3JlYWR0b2tlbihzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0KQorc3RhdGljIGludCBtbWNfc3BpX3JlYWR0b2tlbihzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBrdGltZV90IHRpbWVvdXQpCiB7Ci0JcmV0dXJuIG1tY19zcGlfc2tpcChob3N0LCByZWFkYmxvY2tfdGltZW91dCwgMSwgMHhmZik7CisJcmV0dXJuIG1tY19zcGlfc2tpcChob3N0LCB0aW1lb3V0LCAxLCAweGZmKTsKIH0KIAogCkBAIC02MDUsNyArNjAzLDggQEAKICAqIFJldHVybiBuZWdhdGl2ZSBlcnJubywgZWxzZSBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50Ci1tbWNfc3BpX3dyaXRlYmxvY2soc3RydWN0IG1tY19zcGlfaG9zdCAqaG9zdCwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK21tY19zcGlfd3JpdGVibG9jayhzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LAorCWt0aW1lX3QgdGltZW91dCkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gaG9zdC0+c3BpOwogCWludAkJCXN0YXR1cywgaTsKQEAgLTY3Myw3ICs2NzIsNyBAQAogCQlpZiAoc2NyYXRjaC0+c3RhdHVzW2ldICE9IDApCiAJCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIG1tY19zcGlfd2FpdF91bmJ1c3koaG9zdCwgd3JpdGVibG9ja190aW1lb3V0KTsKKwlyZXR1cm4gbW1jX3NwaV93YWl0X3VuYnVzeShob3N0LCB0aW1lb3V0KTsKIH0KIAogLyoKQEAgLTY5Myw3ICs2OTIsOCBAQAogICogU1RPUF9UUkFOU01JU1NJT04gY29tbWFuZC4KICAqLwogc3RhdGljIGludAotbW1jX3NwaV9yZWFkYmxvY2soc3RydWN0IG1tY19zcGlfaG9zdCAqaG9zdCwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK21tY19zcGlfcmVhZGJsb2NrKHN0cnVjdCBtbWNfc3BpX2hvc3QgKmhvc3QsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsCisJa3RpbWVfdCB0aW1lb3V0KQogewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBob3N0LT5zcGk7CiAJaW50CQkJc3RhdHVzOwpAQCAtNzA3LDcgKzcwNyw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJc3RhdHVzID0gc2NyYXRjaC0+c3RhdHVzWzBdOwogCWlmIChzdGF0dXMgPT0gMHhmZiB8fCBzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbW1jX3NwaV9yZWFkdG9rZW4oaG9zdCk7CisJCXN0YXR1cyA9IG1tY19zcGlfcmVhZHRva2VuKGhvc3QsIHRpbWVvdXQpOwogCiAJaWYgKHN0YXR1cyA9PSBTUElfVE9LRU5fU0lOR0xFKSB7CiAJCWlmIChob3N0LT5kbWFfZGV2KSB7CkBAIC03NzgsNiArNzc4LDggQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXVuc2lnbmVkCQluX3NnOwogCWludAkJCW11bHRpcGxlID0gKGRhdGEtPmJsb2NrcyA+IDEpOworCXUzMgkJCWNsb2NrX3JhdGU7CisJa3RpbWVfdAkJCXRpbWVvdXQ7CiAKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQogCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CkBAIC03ODYsNiArNzg4LDE0IEBACiAJbW1jX3NwaV9zZXR1cF9kYXRhX21lc3NhZ2UoaG9zdCwgbXVsdGlwbGUsIGRpcmVjdGlvbik7CiAJdCA9ICZob3N0LT50OwogCisJaWYgKHQtPnNwZWVkX2h6KQorCQljbG9ja19yYXRlID0gdC0+c3BlZWRfaHo7CisJZWxzZQorCQljbG9ja19yYXRlID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwl0aW1lb3V0ID0ga3RpbWVfYWRkX25zKGt0aW1lX3NldCgwLCAwKSwgZGF0YS0+dGltZW91dF9ucyArCisJCQlkYXRhLT50aW1lb3V0X2Nsa3MgKiAxMDAwMDAwIC8gY2xvY2tfcmF0ZSk7CisKIAkvKiBIYW5kbGUgc2NhdHRlcmxpc3Qgc2VnbWVudHMgb25lIGF0IGEgdGltZSwgd2l0aCBzeW5jaCBmb3IKIAkgKiBlYWNoIDUxMi1ieXRlIGJsb2NrCiAJICovCkBAIC04MzIsOSArODQyLDkgQEAKIAkJCQl0LT5sZW4pOwogCiAJCQlpZiAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCi0JCQkJc3RhdHVzID0gbW1jX3NwaV93cml0ZWJsb2NrKGhvc3QsIHQpOworCQkJCXN0YXR1cyA9IG1tY19zcGlfd3JpdGVibG9jayhob3N0LCB0LCB0aW1lb3V0KTsKIAkJCWVsc2UKLQkJCQlzdGF0dXMgPSBtbWNfc3BpX3JlYWRibG9jayhob3N0LCB0KTsKKwkJCQlzdGF0dXMgPSBtbWNfc3BpX3JlYWRibG9jayhob3N0LCB0LCB0aW1lb3V0KTsKIAkJCWlmIChzdGF0dXMgPCAwKQogCQkJCWJyZWFrOwogCkBAIC05MTcsNyArOTI3LDcgQEAKIAkJCWlmIChzY3JhdGNoLT5zdGF0dXNbdG1wXSAhPSAwKQogCQkJCXJldHVybjsKIAkJfQotCQl0bXAgPSBtbWNfc3BpX3dhaXRfdW5idXN5KGhvc3QsIHdyaXRlYmxvY2tfdGltZW91dCk7CisJCXRtcCA9IG1tY19zcGlfd2FpdF91bmJ1c3koaG9zdCwgdGltZW91dCk7CiAJCWlmICh0bXAgPCAwICYmICFkYXRhLT5lcnJvcikKIAkJCWRhdGEtPmVycm9yID0gdG1wOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKaW5kZXggYzE2MDI4OC4uMWI5ZmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIH07CiAKLXZvaWQgbW1jX29tYXBfZmNsa19vZmZkZWxheShzdHJ1Y3QgbW1jX29tYXBfc2xvdCAqc2xvdCkKK3N0YXRpYyB2b2lkIG1tY19vbWFwX2ZjbGtfb2ZmZGVsYXkoc3RydWN0IG1tY19vbWFwX3Nsb3QgKnNsb3QpCiB7CiAJdW5zaWduZWQgbG9uZyB0aWNrX25zOwogCkBAIC0xODIsNyArMTgyLDcgQEAKIAl9CiB9CiAKLXZvaWQgbW1jX29tYXBfZmNsa19lbmFibGUoc3RydWN0IG1tY19vbWFwX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBlbmFibGUpCitzdGF0aWMgdm9pZCBtbWNfb21hcF9mY2xrX2VuYWJsZShzdHJ1Y3QgbW1jX29tYXBfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGVuYWJsZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNDU1LDcgKzE0NTUsOSBAQAogCiAJaG9zdC0+aXJxID0gaXJxOwogCWhvc3QtPnBoeXNfYmFzZSA9IGhvc3QtPm1lbV9yZXMtPnN0YXJ0OwotCWhvc3QtPnZpcnRfYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgSU9fQUREUkVTUyhob3N0LT5waHlzX2Jhc2UpOworCWhvc3QtPnZpcnRfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJaWYgKCFob3N0LT52aXJ0X2Jhc2UpCisJCWdvdG8gZXJyX2lvcmVtYXA7CiAKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJaG9zdC0+aWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1tY19pY2siKTsKQEAgLTE1MTAsNiArMTUxMiw4IEBACiAJCWNsa19wdXQoaG9zdC0+aWNsayk7CiAJfQogZXJyX2ZyZWVfbW1jX2hvc3Q6CisJaW91bm1hcChob3N0LT52aXJ0X2Jhc2UpOworZXJyX2lvcmVtYXA6CiAJa2ZyZWUoaG9zdCk7CiBlcnJfZnJlZV9tZW1fcmVnaW9uOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKQEAgLTE1MzYsNiArMTU0MCw3IEBACiAJaWYgKGhvc3QtPmZjbGsgJiYgIUlTX0VSUihob3N0LT5mY2xrKSkKIAkJY2xrX3B1dChob3N0LT5mY2xrKTsKIAorCWlvdW5tYXAoaG9zdC0+dmlydF9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCiAJCQkgICBwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYwppbmRleCA1NTA5M2FkLi5lYmZhYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCS8qCiAJICogQmxvY2sgbGVuZ3RoIHJlZ2lzdGVyIGlzIG9ubHkgMTAgYml0cyBiZWZvcmUgUFhBMjd4LgogCSAqLwotCW1tYy0+bWF4X2Jsa19zaXplID0gKGNwdV9pc19weGEyMXgoKSB8fCBjcHVfaXNfcHhhMjV4KCkpID8gMTAyMyA6IDIwNDg7CisJbW1jLT5tYXhfYmxrX3NpemUgPSBjcHVfaXNfcHhhMjV4KCkgPyAxMDIzIDogMjA0ODsKIAogCS8qCiAJICogQmxvY2sgY291bnQgcmVnaXN0ZXIgaXMgMTYgYml0cy4KQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJIE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNDsKIAltbWMtPmNhcHMgPSAwOwogCWhvc3QtPmNtZGF0ID0gMDsKLQlpZiAoIWNwdV9pc19weGEyMXgoKSAmJiAhY3B1X2lzX3B4YTI1eCgpKSB7CisJaWYgKCFjcHVfaXNfcHhhMjV4KCkpIHsKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfNF9CSVRfREFUQSB8IE1NQ19DQVBfU0RJT19JUlE7CiAJCWhvc3QtPmNtZGF0IHw9IENNREFUX1NESU9fSU5UX0VOOwogCQlpZiAoY3B1X2lzX3B4YTMwMCgpIHx8IGNwdV9pc19weGEzMTAoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCmluZGV4IGZjYjE0YzIuLjliZDcwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwpAQCAtMTQ0LDcgKzE0NCw4IEBACiAJCQkgIFNESENJX1FVSVJLXzMyQklUX0RNQV9TSVpFIHwKIAkJCSAgU0RIQ0lfUVVJUktfMzJCSVRfQURNQV9TSVpFIHwKIAkJCSAgU0RIQ0lfUVVJUktfUkVTRVRfQUZURVJfUkVRVUVTVCB8Ci0JCQkgIFNESENJX1FVSVJLX0JST0tFTl9TTUFMTF9QSU87CisJCQkgIFNESENJX1FVSVJLX0JST0tFTl9TTUFMTF9QSU8gfAorCQkJICBTREhDSV9RVUlSS19GT1JDRV9ISUdIU1BFRUQ7CiAJfQogCiAJLyoKQEAgLTMyNiw3ICszMjcsNyBAQAogCiAJewogCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX01BUlZFTEwsCi0JCS5kZXZpY2UgICAgICAgICA9IFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9DQUZFX1NELAorCQkuZGV2aWNlICAgICAgICAgPSBQQ0lfREVWSUNFX0lEX01BUlZFTExfODhBTFAwMV9TRCwKIAkJLnN1YnZlbmRvciAgICAgID0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZSAgICAgID0gUENJX0FOWV9JRCwKIAkJLmRyaXZlcl9kYXRhICAgID0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9jYWZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IGUzYTgxMzMuLjMwZjY0YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2l6ZV90IGJsa3NpemUsIGxlbiwgY2h1bms7Ci0JdTMyIHNjcmF0Y2g7CisJdTMyIHVuaW5pdGlhbGl6ZWRfdmFyKHNjcmF0Y2gpOwogCXU4ICpidWY7CiAKIAlEQkcoIlBJTyByZWFkaW5nXG4iKTsKQEAgLTExNTQsNyArMTE1NCw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKLQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CisJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBtc2Vjc190b19qaWZmaWVzKDIwMCkpOwogfQogCiBzdGF0aWMgdm9pZCBzZGhjaV90YXNrbGV0X2ZpbmlzaCh1bnNpZ25lZCBsb25nIHBhcmFtKQpAQCAtMTI2Niw5ICsxMjY2LDMxIEBACiAJCQlTREhDSV9JTlRfSU5ERVgpKQogCQlob3N0LT5jbWQtPmVycm9yID0gLUVJTFNFUTsKIAotCWlmIChob3N0LT5jbWQtPmVycm9yKQorCWlmIChob3N0LT5jbWQtPmVycm9yKSB7CiAJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpbmlzaF90YXNrbGV0KTsKLQllbHNlIGlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX1JFU1BPTlNFKQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBUaGUgaG9zdCBjYW4gc2VuZCBhbmQgaW50ZXJydXB0IHdoZW4gdGhlIGJ1c3kgc3RhdGUgaGFzCisJICogZW5kZWQsIGFsbG93aW5nIHVzIHRvIHdhaXQgd2l0aG91dCB3YXN0aW5nIENQVSBjeWNsZXMuCisJICogVW5mb3J0dW5hdGVseSB0aGlzIGlzIG92ZXJsb2FkZWQgb24gdGhlICJkYXRhIGNvbXBsZXRlIgorCSAqIGludGVycnVwdCwgc28gd2UgbmVlZCB0byB0YWtlIHNvbWUgY2FyZSB3aGVuIGhhbmRsaW5nCisJICogaXQuCisJICoKKwkgKiBOb3RlOiBUaGUgMS4wIHNwZWNpZmljYXRpb24gaXMgYSBiaXQgYW1iaWd1b3VzIGFib3V0IHRoaXMKKwkgKiAgICAgICBmZWF0dXJlIHNvIHRoZXJlIG1pZ2h0IGJlIHNvbWUgcHJvYmxlbXMgd2l0aCBvbGRlcgorCSAqICAgICAgIGNvbnRyb2xsZXJzLgorCSAqLworCWlmIChob3N0LT5jbWQtPmZsYWdzICYgTU1DX1JTUF9CVVNZKSB7CisJCWlmIChob3N0LT5jbWQtPmRhdGEpCisJCQlEQkcoIkNhbm5vdCB3YWl0IGZvciBidXN5IHNpZ25hbCB3aGVuIGFsc28gIgorCQkJCSJkb2luZyBhIGRhdGEgdHJhbnNmZXIiKTsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKworCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX1JFU1BPTlNFKQogCQlzZGhjaV9maW5pc2hfY29tbWFuZChob3N0KTsKIH0KIApAQCAtMTI3OCwxMSArMTMwMCwxNiBAQAogCiAJaWYgKCFob3N0LT5kYXRhKSB7CiAJCS8qCi0JCSAqIEEgZGF0YSBlbmQgaW50ZXJydXB0IGlzIHNlbnQgdG9nZXRoZXIgd2l0aCB0aGUgcmVzcG9uc2UKLQkJICogZm9yIHRoZSBzdG9wIGNvbW1hbmQuCisJCSAqIFRoZSAiZGF0YSBjb21wbGV0ZSIgaW50ZXJydXB0IGlzIGFsc28gdXNlZCB0bworCQkgKiBpbmRpY2F0ZSB0aGF0IGEgYnVzeSBzdGF0ZSBoYXMgZW5kZWQuIFNlZSBjb21tZW50CisJCSAqIGFib3ZlIGluIHNkaGNpX2NtZF9pcnEoKS4KIAkJICovCi0JCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX0RBVEFfRU5EKQotCQkJcmV0dXJuOworCQlpZiAoaG9zdC0+Y21kICYmIChob3N0LT5jbWQtPmZsYWdzICYgTU1DX1JTUF9CVVNZKSkgeworCQkJaWYgKGludG1hc2sgJiBTREhDSV9JTlRfREFUQV9FTkQpIHsKKwkJCQlzZGhjaV9maW5pc2hfY29tbWFuZChob3N0KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KIAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHb3QgZGF0YSBpbnRlcnJ1cHQgMHglMDh4IGV2ZW4gIgogCQkJInRob3VnaCBubyBkYXRhIG9wZXJhdGlvbiB3YXMgaW4gcHJvZ3Jlc3MuXG4iLApAQCAtMTYwNCw3ICsxNjMxLDggQEAKIAltbWMtPmZfbWF4ID0gaG9zdC0+bWF4X2NsazsKIAltbWMtPmNhcHMgPSBNTUNfQ0FQXzRfQklUX0RBVEEgfCBNTUNfQ0FQX1NESU9fSVJROwogCi0JaWYgKGNhcHMgJiBTREhDSV9DQU5fRE9fSElTUEQpCisJaWYgKChjYXBzICYgU0RIQ0lfQ0FOX0RPX0hJU1BEKSB8fAorCQkoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfRk9SQ0VfSElHSFNQRUVEKSkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfU0RfSElHSFNQRUVEOwogCiAJbW1jLT5vY3JfYXZhaWwgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCmluZGV4IDE5N2Q0YTAuLjMxZjRiMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKQEAgLTIwOCw2ICsyMDgsOCBAQAogI2RlZmluZSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwJCQkoMTw8MTIpCiAvKiBDb250cm9sbGVyIGhhcyBhbiBpc3N1ZSB3aXRoIGJ1ZmZlciBiaXRzIGZvciBzbWFsbCB0cmFuc2ZlcnMgKi8KICNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX1NNQUxMX1BJTwkJCSgxPDwxMykKKy8qIENvbnRyb2xsZXIgc3VwcG9ydHMgaGlnaCBzcGVlZCBidXQgZG9lc24ndCBoYXZlIHRoZSBjYXBzIGJpdCBzZXQgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfRk9SQ0VfSElHSFNQRUVECQkJKDE8PDE0KQogCiAJaW50CQkJaXJxOwkJLyogRGV2aWNlIElSUSAqLwogCXZvaWQgX19pb21lbSAqCQlpb2FkZHI7CQkvKiBNYXBwZWQgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCmluZGV4IDllNjQ3YTAuLmJhMmI0MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKQEAgLTE1OSwxMCArMTU5LDEwIEBACiAjZGVmaW5lIFNUQVRVU19UT19URVhUKGEpIFwKIAlkbyB7IFwKIAkJaWYgKHN0YXR1cyAmIFRNSU9fU1RBVF8jI2EpIFwKLQkJCXByaW50ZigjYSk7IFwKKwkJCXByaW50aygjYSk7IFwKIAl9IHdoaWxlICgwKQogCi12b2lkIGRlYnVnX3N0YXR1cyh1MzIgc3RhdHVzKQordm9pZCBwcl9kZWJ1Z19zdGF0dXModTMyIHN0YXR1cykKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAic3RhdHVzOiAlMDh4ID0gIiwgc3RhdHVzKTsKIAlTVEFUVVNfVE9fVEVYVChDQVJEX1JFTU9WRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9mdGwuYyBiL2RyaXZlcnMvbXRkL2Z0bC5jCmluZGV4IGYzNGYyMGMuLjliZjU4MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2Z0bC5jCisrKyBiL2RyaXZlcnMvbXRkL2Z0bC5jCkBAIC0xMDA1LDYgKzEwMDUsMjkgQEAKIAlyZXR1cm4gZnRsX3dyaXRlKCh2b2lkICopZGV2LCBidWYsIGJsb2NrLCAxKTsKIH0KIAorc3RhdGljIGludCBmdGxfZGlzY2FyZHNlY3Qoc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2VjdG9yLCB1bnNpZ25lZCBucl9zZWN0cykKK3sKKwlwYXJ0aXRpb25fdCAqcGFydCA9ICh2b2lkICopZGV2OworCXVpbnQzMl90IGJzaXplID0gMSA8PCBwYXJ0LT5oZWFkZXIuRXJhc2VVbml0U2l6ZTsKKworCURFQlVHKDEsICJGVEwgZXJhc2Ugc2VjdG9yICVsZCBmb3IgJWQgc2VjdG9yc1xuIiwKKwkgICAgICBzZWN0b3IsIG5yX3NlY3RzKTsKKworCXdoaWxlIChucl9zZWN0cykgeworCQl1aW50MzJfdCBvbGRfYWRkciA9IHBhcnQtPlZpcnR1YWxCbG9ja01hcFtzZWN0b3JdOworCQlpZiAob2xkX2FkZHIgIT0gMHhmZmZmZmZmZikgeworCQkJcGFydC0+VmlydHVhbEJsb2NrTWFwW3NlY3Rvcl0gPSAweGZmZmZmZmZmOworCQkJcGFydC0+RVVOSW5mb1tvbGRfYWRkci9ic2l6ZV0uRGVsZXRlZCsrOworCQkJaWYgKHNldF9iYW1fZW50cnkocGFydCwgb2xkX2FkZHIsIDApKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJCW5yX3NlY3RzLS07CisJCXNlY3RvcisrOworCX0KKworCXJldHVybiAwOworfQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIGZ0bF9mcmVlcGFydChwYXJ0aXRpb25fdCAqcGFydCkKQEAgLTEwNjksNiArMTA5Miw3IEBACiAJLmJsa3NpemUgCT0gU0VDVE9SX1NJWkUsCiAJLnJlYWRzZWN0CT0gZnRsX3JlYWRzZWN0LAogCS53cml0ZXNlY3QJPSBmdGxfd3JpdGVzZWN0LAorCS5kaXNjYXJkCT0gZnRsX2Rpc2NhcmRzZWN0LAogCS5nZXRnZW8JCT0gZnRsX2dldGdlbywKIAkuYWRkX210ZAk9IGZ0bF9hZGRfbXRkLAogCS5yZW1vdmVfZGV2CT0gZnRsX3JlbW92ZV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYwppbmRleCA5MDkyNGZiLi5kNjAwYzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKQEAgLTExOCw3ICsxMTgsOCBAQAogCQlERUJVRygyLCAiUmVtYXBwaW5nIHdpbmRvdyBmcm9tIDB4JTguOHggdG8gMHglOC44eCIsCiAJCSAgICAgIGRldi0+b2Zmc2V0LCBtcnEuQ2FyZE9mZnNldCk7CiAJCW1ycS5QYWdlID0gMDsKLQkJaWYoIChyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKHdpbiwgJm1ycSkpICE9IENTX1NVQ0NFU1MpIHsKKwkJcmV0ID0gcGNtY2lhX21hcF9tZW1fcGFnZSh3aW4sICZtcnEpOworCQlpZiAocmV0ICE9IDApIHsKIAkJCWNzX2Vycm9yKGRldi0+cF9kZXYsIE1hcE1lbVBhZ2UsIHJldCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtMzI2LDkgKzMyNyw4IEBACiAKIAlERUJVRygyLCAiZGV2ID0gJXAgb24gPSAlZCB2cHAgPSAlZFxuIiwgZGV2LCBvbiwgZGV2LT52cHApOwogCXJldCA9IHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbihsaW5rLCAmbW9kKTsKLQlpZihyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXQgIT0gMCkKIAkJY3NfZXJyb3IobGluaywgTW9kaWZ5Q29uZmlndXJhdGlvbiwgcmV0KTsKLQl9CiB9CiAKIApAQCAtMzY4LDE0ICszNjgsMTQgQEAKIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSBSRVRVUk5fRklSU1RfVFVQTEU7CiAKIAlyYyA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKTsKLQl3aGlsZShyYyA9PSBDU19TVUNDRVNTKSB7CisJd2hpbGUgKHJjID09IDApIHsKIAkJcmMgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKLQkJaWYocmMgIT0gQ1NfU1VDQ0VTUykgeworCQlpZiAocmMgIT0gMCkgewogCQkJY3NfZXJyb3IobGluaywgR2V0VHVwbGVEYXRhLCByYyk7CiAJCQlicmVhazsKIAkJfQotCQlyYyA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JCWlmKHJjICE9IENTX1NVQ0NFU1MpIHsKKwkJcmMgPSBwY21jaWFfcGFyc2VfdHVwbGUoJnR1cGxlLCAmcGFyc2UpOworCQlpZiAocmMgIT0gMCkgewogCQkJY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgcmMpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ5MywxOCArNDkzLDExIEBACiAJaW50IGxhc3RfcmV0ID0gMCwgbGFzdF9mbiA9IDA7CiAJaW50IHJldDsKIAlpbnQgaTsKLQljb25maWdfaW5mb190IHQ7CiAJc3RhdGljIGNoYXIgKnByb2Jlc1tdID0geyAiamVkZWNfcHJvYmUiLCAiY2ZpX3Byb2JlIiB9OwogCWludCBuZXdfbmFtZSA9IDA7CiAKIAlERUJVRygzLCAibGluaz0weCVwIiwgbGluayk7CiAKLQlERUJVRygyLCAiVmFsaWRhdGluZyBDSVMiKTsKLQlyZXQgPSBwY21jaWFfdmFsaWRhdGVfY2lzKGxpbmssIE5VTEwpOwotCWlmKHJldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKLQl9Ci0KIAljYXJkX3NldHRpbmdzKGRldiwgbGluaywgJm5ld19uYW1lKTsKIAogCWRldi0+cGNtY2lhX21hcC5waHlzID0gTk9fWElQOwpAQCAtNTcxLDEwICs1NjQsNyBAQAogCWRldi0+cGNtY2lhX21hcC5tYXBfcHJpdl8xID0gKHVuc2lnbmVkIGxvbmcpZGV2OwogCWRldi0+cGNtY2lhX21hcC5tYXBfcHJpdl8yID0gKHVuc2lnbmVkIGxvbmcpbGluay0+d2luOwogCi0JREVCVUcoMiwgIkdldHRpbmcgY29uZmlndXJhdGlvbiIpOwotCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmdCkpOwotCURFQlVHKDIsICJWY2MgPSAlZCBWcHAxID0gJWQgVnBwMiA9ICVkIiwgdC5WY2MsIHQuVnBwMSwgdC5WcHAyKTsKLQlkZXYtPnZwcCA9ICh2cHApID8gdnBwIDogdC5WcHAxOworCWRldi0+dnBwID0gKHZwcCkgPyB2cHAgOiBsaW5rLT5zb2NrZXQuc29ja2V0LlZwcDsKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSAwOwogCWlmKHNldHZwcCA9PSAyKSB7CiAJCWxpbmstPmNvbmYuVnBwID0gZGV2LT52cHA7CkBAIC01ODMsMTYgKzU3MywxMCBAQAogCX0KIAogCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUlk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gdC5Db25maWdCYXNlOwotCWxpbmstPmNvbmYuU3RhdHVzID0gdC5TdGF0dXM7Ci0JbGluay0+Y29uZi5QaW4gPSB0LlBpbjsKLQlsaW5rLT5jb25mLkNvcHkgPSB0LkNvcHk7Ci0JbGluay0+Y29uZi5FeHRTdGF0dXMgPSB0LkV4dFN0YXR1czsKIAlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMDsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSB0LlByZXNlbnQ7CiAJREVCVUcoMiwgIlNldHRpbmcgQ29uZmlndXJhdGlvbiIpOwogCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwotCWlmKHJldCAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCByZXQpOwogCQlpZiAoZGV2LT53aW5fYmFzZSkgewogCQkJaW91bm1hcChkZXYtPndpbl9iYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKaW5kZXggMGQ3Yzg4My4uZmQ3YTEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zdW5fdWZsYXNoLmMKQEAgLTEsMTMgKzEsMTAgQEAKLS8qCi0gKgotICogc3VuX3VmbGFzaCAtIERyaXZlciBpbXBsZW1lbnRhdGlvbiBmb3IgdXNlci1wcm9ncmFtbWFibGUgZmxhc2gKLSAqIHByZXNlbnQgb24gbWFueSBTdW4gTWljcm9zeXN0ZW1zIFNNRSBib2FyZHNldHMuCisvKiBzdW5fdWZsYXNoLmMgLSBEcml2ZXIgZm9yIHVzZXItcHJvZ3JhbW1hYmxlIGZsYXNoIG9uCisgKiAgICAgICAgICAgICAgICBTdW4gTWljcm9zeXN0ZW1zIFNNRSBib2FyZHNldHMuCiAgKgogICogVGhpcyBkcml2ZXIgZG9lcyBOT1QgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIE9CUC1mbGFzaCBmb3IKICAqIHNhZmV0eSByZWFzb25zLS0gdXNlIDxsaW51eD4vZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYyBpbnN0ZWFkLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMSBFcmljIEJyb3dlciAoZWJyb3dlckB1c2EubmV0KQotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNiw4ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8YXNtL2VidXMuaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTI2LDY3ICsyMyw2NSBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KIAogI2RlZmluZSBVRkxBU0hfT0JQTkFNRQkiZmxhc2hwcm9tIgotI2RlZmluZSBVRkxBU0hfREVWTkFNRSAJInVzZXJmbGFzaCIKKyNkZWZpbmUgRFJJVkVSX05BTUUJInN1bl91Zmxhc2giCisjZGVmaW5lIFBGWAkJRFJJVkVSX05BTUUgIjogIgogCiAjZGVmaW5lIFVGTEFTSF9XSU5ET1dfU0laRQkweDIwMDAwMAogI2RlZmluZSBVRkxBU0hfQlVTV0lEVEgJCTEJCQkvKiBFQnVzIGlzIDgtYml0ICovCiAKIE1PRFVMRV9BVVRIT1IoIkVyaWMgQnJvd2VyIDxlYnJvd2VyQHVzYS5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVzZXItcHJvZ3JhbW1hYmxlIGZsYXNoIGRldmljZSBvbiBTdW4gTWljcm9zeXN0ZW1zIGJvYXJkc2V0cyIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInVzZXJmbGFzaCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoRFJJVkVSX05BTUUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjIuMCIpOworTU9EVUxFX1ZFUlNJT04oIjIuMSIpOwogCi1zdGF0aWMgTElTVF9IRUFEKGRldmljZV9saXN0KTsKIHN0cnVjdCB1Zmxhc2hfZGV2IHsKIAljb25zdCBjaGFyCQkqbmFtZTsJLyogZGV2aWNlIG5hbWUgKi8KIAlzdHJ1Y3QgbWFwX2luZm8gCW1hcDsJLyogbXRkIG1hcCBpbmZvICovCiAJc3RydWN0IG10ZF9pbmZvCQkqbXRkOwkvKiBtdGQgaW5mbyAqLwogfTsKIAotCiBzdHJ1Y3QgbWFwX2luZm8gdWZsYXNoX21hcF90ZW1wbCA9IHsKIAkubmFtZSA9CQkiU1VOVyw/Pz8tPz8/PyIsCiAJLnNpemUgPQkJVUZMQVNIX1dJTkRPV19TSVpFLAogCS5iYW5rd2lkdGggPQlVRkxBU0hfQlVTV0lEVEgsCiB9OwogCi1pbnQgdWZsYXNoX2RldmluaXQoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoraW50IHVmbGFzaF9kZXZpbml0KHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCXN0cnVjdCB1Zmxhc2hfZGV2ICp1cDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAotCXJlcyA9ICZlZGV2LT5yZXNvdXJjZVswXTsKLQotCWlmIChlZGV2LT5udW1fYWRkcnMgIT0gMSkgeworCWlmIChvcC0+cmVzb3VyY2VbMV0uZmxhZ3MpIHsKIAkJLyogTm9uLUNGSSB1c2VyZmxhc2ggZGV2aWNlLS0gb25jZSBJIGZpbmQgb25lIHdlCiAJCSAqIGNhbiB3b3JrIG9uIHN1cHBvcnRpbmcgaXQuCiAJCSAqLwotCQlwcmludGsoIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgYXQgMHglbGx4ICglZCByZWdzKTogIiBcCi0JCQkiZW1haWwgZWJyb3dlckB1c2EubmV0XG4iLAotCQkgICAgICAgZHAtPmZ1bGxfbmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAotCQkgICAgICAgZWRldi0+bnVtX2FkZHJzKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5zdXBwb3J0ZWQgZGV2aWNlIGF0ICVzLCAweCVsbHhcbiIsCisJCSAgICAgICBkcC0+ZnVsbF9uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKW9wLT5yZXNvdXJjZVswXS5zdGFydCk7CiAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJdXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWZsYXNoX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghdXApCisJaWYgKCF1cCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgc3RydWN0IHVmbGFzaF9kZXZcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAkvKiBjb3B5IGRlZmF1bHRzIGFuZCB0d2VhayBwYXJhbWV0ZXJzICovCiAJbWVtY3B5KCZ1cC0+bWFwLCAmdWZsYXNoX21hcF90ZW1wbCwgc2l6ZW9mKHVmbGFzaF9tYXBfdGVtcGwpKTsKLQl1cC0+bWFwLnNpemUgPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0KSArIDFVTDsKKworCXVwLT5tYXAuc2l6ZSA9IHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSk7CiAKIAl1cC0+bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgTlVMTCk7CiAJaWYgKHVwLT5uYW1lICYmIDAgPCBzdHJsZW4odXAtPm5hbWUpKQogCQl1cC0+bWFwLm5hbWUgPSAoY2hhciAqKXVwLT5uYW1lOwogCi0JdXAtPm1hcC5waHlzID0gcmVzLT5zdGFydDsKKwl1cC0+bWFwLnBoeXMgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7CiAKLQl1cC0+bWFwLnZpcnQgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgdXAtPm1hcC5zaXplKTsKKwl1cC0+bWFwLnZpcnQgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIHVwLT5tYXAuc2l6ZSwKKwkJCQkgIERSSVZFUl9OQU1FKTsKIAlpZiAoIXVwLT5tYXAudmlydCkgewotCQlwcmludGsoIiVzOiBGYWlsZWQgdG8gbWFwIGRldmljZS5cbiIsIGRwLT5mdWxsX25hbWUpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gbWFwIGRldmljZS5cbiIpOwogCQlrZnJlZSh1cCk7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05Nyw3ICs5Miw3IEBACiAJLyogTVREIHJlZ2lzdHJhdGlvbiAqLwogCXVwLT5tdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZ1cC0+bWFwKTsKIAlpZiAoIXVwLT5tdGQpIHsKLQkJaW91bm1hcCh1cC0+bWFwLnZpcnQpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHVwLT5tYXAudmlydCwgdXAtPm1hcC5zaXplKTsKIAkJa2ZyZWUodXApOwogCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMDcsMzIgKzEwMiwzNCBAQAogCiAJYWRkX210ZF9kZXZpY2UodXAtPm10ZCk7CiAKLQlkZXZfc2V0X2RydmRhdGEoJmVkZXYtPm9mZGV2LmRldiwgdXApOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgdXApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHVmbGFzaF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgdWZsYXNoX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSB0b19lYnVzX2RldmljZSgmZGV2LT5kZXYpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1c2VyIiwgTlVMTCkpCisJLyogRmxhc2hwcm9tIG11c3QgaGF2ZSB0aGUgInVzZXIiIHByb3BlcnR5IGluIG9yZGVyIHRvCisJICogYmUgdXNlZCBieSB0aGlzIGRyaXZlci4KKwkgKi8KKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1c2VyIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHVmbGFzaF9kZXZpbml0KGVkZXYsIGRwKTsKKwlyZXR1cm4gdWZsYXNoX2RldmluaXQob3AsIGRwKTsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgdWZsYXNoX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB1Zmxhc2hfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCB1Zmxhc2hfZGV2ICp1cCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCB1Zmxhc2hfZGV2ICp1cCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CiAKIAlpZiAodXAtPm10ZCkgewogCQlkZWxfbXRkX2RldmljZSh1cC0+bXRkKTsKIAkJbWFwX2Rlc3Ryb3kodXAtPm10ZCk7CiAJfQogCWlmICh1cC0+bWFwLnZpcnQpIHsKLQkJaW91bm1hcCh1cC0+bWFwLnZpcnQpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHVwLT5tYXAudmlydCwgdXAtPm1hcC5zaXplKTsKIAkJdXAtPm1hcC52aXJ0ID0gTlVMTDsKIAl9CiAKQEAgLTE0MSw3ICsxMzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB1Zmxhc2hfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVmbGFzaF9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSBVRkxBU0hfT0JQTkFNRSwKIAl9LApAQCAtMTUxLDcgKzE0OCw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1Zmxhc2hfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciB1Zmxhc2hfZHJpdmVyID0gewotCS5uYW1lCQk9IFVGTEFTSF9ERVZOQU1FLAorCS5uYW1lCQk9IERSSVZFUl9OQU1FLAogCS5tYXRjaF90YWJsZQk9IHVmbGFzaF9tYXRjaCwKIAkucHJvYmUJCT0gdWZsYXNoX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodWZsYXNoX3JlbW92ZSksCkBAIC0xNTksNyArMTU2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgdWZsYXNoX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZ1Zmxhc2hfZHJpdmVyLCAmZWJ1c19idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmdWZsYXNoX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVmbGFzaF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwppbmRleCA5ZmYwMDdjLi42ODFkNWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCisrKyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKQEAgLTMyLDYgKzMyLDE0IEBACiAJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwogfTsKIAorc3RhdGljIGludCBibGt0cmFuc19kaXNjYXJkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0xJTlVYX0JMT0NLOworCXJlcS0+Y21kWzBdID0gUkVRX0xCX09QX0RJU0NBUkQ7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZG9fYmxrdHJhbnNfcmVxdWVzdChzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHIsCiAJCQkgICAgICAgc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQpAQCAtNDQsNiArNTIsMTAgQEAKIAogCWJ1ZiA9IHJlcS0+YnVmZmVyOwogCisJaWYgKHJlcS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfTElOVVhfQkxPQ0sgJiYKKwkgICAgcmVxLT5jbWRbMF0gPT0gUkVRX0xCX09QX0RJU0NBUkQpCisJCXJldHVybiAhdHItPmRpc2NhcmQoZGV2LCBibG9jaywgbnNlY3QpOworCiAJaWYgKCFibGtfZnNfcmVxdWVzdChyZXEpKQogCQlyZXR1cm4gMDsKIApAQCAtMzY3LDYgKzM3OSwxMCBAQAogCiAJdHItPmJsa2NvcmVfcHJpdi0+cnEtPnF1ZXVlZGF0YSA9IHRyOwogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHRyLT5ibGtjb3JlX3ByaXYtPnJxLCB0ci0+Ymxrc2l6ZSk7CisJaWYgKHRyLT5kaXNjYXJkKQorCQlibGtfcXVldWVfc2V0X2Rpc2NhcmQodHItPmJsa2NvcmVfcHJpdi0+cnEsCisJCQkJICAgICAgYmxrdHJhbnNfZGlzY2FyZF9yZXF1ZXN0KTsKKwogCXRyLT5ibGtzaGlmdCA9IGZmcyh0ci0+Ymxrc2l6ZSkgLSAxOwogCiAJdHItPmJsa2NvcmVfcHJpdi0+dGhyZWFkID0ga3RocmVhZF9ydW4obXRkX2Jsa3RyYW5zX3RocmVhZCwgdHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggZTAwZDQyNC4uMWM3NDc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtMjYsMTMgKzI2LDExIEBACiAJaWYgKCFtdGQpCiAJCXJldHVybjsKIAotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShtdGRfY2xhc3MsIE5VTEwsCi0JCQkgICAgICBNS0RFVihNVERfQ0hBUl9NQUpPUiwgbXRkLT5pbmRleCoyKSwKLQkJCSAgICAgIE5VTEwsICJtdGQlZCIsIG10ZC0+aW5kZXgpOworCWRldmljZV9jcmVhdGUobXRkX2NsYXNzLCBOVUxMLCBNS0RFVihNVERfQ0hBUl9NQUpPUiwgbXRkLT5pbmRleCoyKSwKKwkJICAgICAgTlVMTCwgIm10ZCVkIiwgbXRkLT5pbmRleCk7CiAKLQlkZXZpY2VfY3JlYXRlX2RydmRhdGEobXRkX2NsYXNzLCBOVUxMLAotCQkJICAgICAgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMisxKSwKLQkJCSAgICAgIE5VTEwsICJtdGQlZHJvIiwgbXRkLT5pbmRleCk7CisJZGV2aWNlX2NyZWF0ZShtdGRfY2xhc3MsIE5VTEwsIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSksCisJCSAgICAgIE5VTEwsICJtdGQlZHJvIiwgbXRkLT5pbmRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIG10ZF9ub3RpZnlfcmVtb3ZlKHN0cnVjdCBtdGRfaW5mbyogbXRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkcGFydC5jIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCmluZGV4IGVkYjkwYjUuLjlhMDZkYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYworKysgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKQEAgLTU2NCwxMCArNTY0LDggQEAKIAogCWZvciAoIDsgcmV0IDw9IDAgJiYgKnR5cGVzOyB0eXBlcysrKSB7CiAJCXBhcnNlciA9IGdldF9wYXJ0aXRpb25fcGFyc2VyKCp0eXBlcyk7Ci0jaWZkZWYgQ09ORklHX0tNT0QKIAkJaWYgKCFwYXJzZXIgJiYgIXJlcXVlc3RfbW9kdWxlKCIlcyIsICp0eXBlcykpCiAJCQkJcGFyc2VyID0gZ2V0X3BhcnRpdGlvbl9wYXJzZXIoKnR5cGVzKTsKLSNlbmRpZgogCQlpZiAoIXBhcnNlcikgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBwYXJ0aXRpb24gcGFyc2luZyBub3QgYXZhaWxhYmxlXG4iLAogCQkJICAgICAgICp0eXBlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2Ftcy1kZWx0YS5jIGIvZHJpdmVycy9tdGQvbmFuZC9hbXMtZGVsdGEuYwppbmRleCAyNmQ0Mjk4Li43ODI5OTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Ftcy1kZWx0YS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYW1zLWRlbHRhLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiBzdGF0aWMgaW50IGFtc19kZWx0YV9uYW5kX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewotCXJldHVybiBvbWFwX2dldF9ncGlvX2RhdGFpbihBTVNfREVMVEFfR1BJT19QSU5fTkFORF9SQik7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEFNU19ERUxUQV9HUElPX1BJTl9OQU5EX1JCKTsKIH0KIAogLyoKQEAgLTE4NSw3ICsxODUsNyBAQAogCXRoaXMtPnJlYWRfYnVmID0gYW1zX2RlbHRhX3JlYWRfYnVmOwogCXRoaXMtPnZlcmlmeV9idWYgPSBhbXNfZGVsdGFfdmVyaWZ5X2J1ZjsKIAl0aGlzLT5jbWRfY3RybCA9IGFtc19kZWx0YV9od2NvbnRyb2w7Ci0JaWYgKCFvbWFwX3JlcXVlc3RfZ3BpbyhBTVNfREVMVEFfR1BJT19QSU5fTkFORF9SQikpIHsKKwlpZiAoZ3Bpb19yZXF1ZXN0KEFNU19ERUxUQV9HUElPX1BJTl9OQU5EX1JCLCAibmFuZF9yZHkiKSA9PSAwKSB7CiAJCXRoaXMtPmRldl9yZWFkeSA9IGFtc19kZWx0YV9uYW5kX3JlYWR5OwogCX0gZWxzZSB7CiAJCXRoaXMtPmRldl9yZWFkeSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmRfZWNjLmggYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmRfZWNjLmgKaW5kZXggMWVlN2Y5OS4uNTc4Yzc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kX2VjYy5oCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYXRtZWxfbmFuZF9lY2MuaApAQCAtMiw2ICsyLDkgQEAKICAqIEVycm9yIENvcnJlY3RlZCBDb2RlIENvbnRyb2xsZXIgKEVDQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCiAgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MCBkYXRhc2hlZXQgcmV2aXNpb24gQi4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFZpY3RvcgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jCmluZGV4IDk1MzQ1ZDAuLmI4MDY0YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYwpAQCAtMSw2ICsxLDkgQEAKIC8qCiAgKiBEcml2ZXIgZm9yIE9uZSBMYXB0b3AgUGVyIENoaWxkIOKAmENBRsOJ4oCZIGNvbnRyb2xsZXIsIGFrYSBNYXJ2ZWxsIDg4QUxQMDEKICAqCisgKiBUaGUgZGF0YSBzaGVldCBmb3IgdGhpcyBkZXZpY2UgY2FuIGJlIGZvdW5kIGF0OgorICogICAgaHR0cDovL3d3dy5tYXJ2ZWxsLmNvbS9wcm9kdWN0cy9wY2Nvbm4vODhBTFAwMS5qc3AKKyAqCiAgKiBDb3B5cmlnaHQgwqkgMjAwNiBSZWQgSGF0LCBJbmMuCiAgKiBDb3B5cmlnaHQgwqkgMjAwNiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKi8KQEAgLTg0Miw3ICs4NDUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9uYW5kX3RibFtdID0gewotCXsgMHgxMWFiLCAweDQxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgUENJX0RFVklDRV9JRF9NQVJWRUxMXzg4QUxQMDFfTkFORCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYwppbmRleCA5ZWJhM2YwLi5mYTEyOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NteDI3MF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jbXgyNzBfbmFuZC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAlpbnQgbXRkX3BhcnRzX25iID0gMDsKIAlpbnQgcmV0OwogCi0JaWYgKCFtYWNoaW5lX2lzX2FybWNvcmUoKSkKKwlpZiAoIShtYWNoaW5lX2lzX2FybWNvcmUoKSAmJiBjcHVfaXNfcHhhMjd4KCkpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX05BTkRfQ1MsICJOQU5EIENTIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMS5jIGIvZHJpdmVycy9uZXQvM2M1MDEuYwppbmRleCA1YmE0YmFiLi43ZDE1ZTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAlBbm5hcG9saXMgTUQgMjE0MDMKIAogICAgIEZpeGVkIChhZ2FpbiEpIHRoZSBtaXNzaW5nIGludGVycnVwdCBsb2NraW5nIG9uIFRYL1JYIHNoaWZ0aW5nLgotCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIFJlbW92ZWQgY2FsbHMgdG8gaW5pdF9ldGhlcmRldiBzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLCBhbmQKICAgICBjbGVhbmVkIHVwIG1vZHVsYXJpemF0aW9uIGp1c3QgYSBiaXQuIFRoZSBkcml2ZXIgc3RpbGwgYWxsb3dzIG9ubHkKQEAgLTI5LDE2ICsyOSwxNiBAQAogICAgIHRoZSBib2FyZC4gTm93IGdldHRpbmcgMTUwSy9zZWNvbmQgRlRQIHdpdGggYSAzYzUwMSBjYXJkLiBTdGlsbCBwbGF5aW5nCiAgICAgd2l0aCBhIFRYLVRYIG9wdGltaXNhdGlvbiB0byBzZWUgaWYgd2UgY2FuIHRvdWNoIDE4MC0yMDBLL3NlY29uZCBhcyBzZWVtcwogICAgIHRoZW9yZXRpY2FsbHkgbWF4aW11bS4KLQkJMTk5NTA0MDIgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKwkJMTk5NTA0MDIgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIENsZWFuZWQgdXAgZm9yIDIuMy54IGJlY2F1c2Ugd2UgYnJva2UgU01QIG5vdy4KLQkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKwkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogICAgIENoZWNrIHVwIHBhc3MgZm9yIDIuNS4gTm90aGluZyBzaWduaWZpY2FudCBjaGFuZ2VkCi0JCTIwMDIxMDA5IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisJCTIwMDIxMDA5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAKICAgICBGaXhlZCB6ZXJvIGZpbGwgY29ybmVyIGNhc2UKLQkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKwkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KIAogCiAgICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQotCURSVl9OQU1FICIuYzogIiBEUlZfVkVSU0lPTiAiIEFsYW4gQ294IChhbGFuQHJlZGhhdC5jb20pLlxuIjsKKwlEUlZfTkFNRSAiLmM6ICIgRFJWX1ZFUlNJT04gIiBBbGFuIENveCAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKS5cbiI7CiAKIC8qCiAgKglCcmFpbmRhbWFnZSByZW1haW5pbmc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNS5jIGIvZHJpdmVycy9uZXQvM2M1MDUuYwppbmRleCBmZGZiMmIyLi5hNDI0ODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwNS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA1LmMKQEAgLTEzMCwxMiArMTMwLDEyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIHRpbWVvdXRfbXNnW10gPSAiKioqIHRpbWVvdXQgYXQgJXM6JXMgKGxpbmUgJWQpICoqKlxuIjsKICNkZWZpbmUgVElNRU9VVF9NU0cobGluZW5vKSBcCi0JcHJpbnRrKHRpbWVvdXRfbXNnLCBmaWxlbmFtZSxfX0ZVTkNUSU9OX18sKGxpbmVubykpCisJcHJpbnRrKHRpbWVvdXRfbXNnLCBmaWxlbmFtZSxfX2Z1bmNfXywobGluZW5vKSkKIAogc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9wY2JfbXNnW10gPQogIioqKiBpbnZhbGlkIHBjYiBsZW5ndGggJWQgYXQgJXM6JXMgKGxpbmUgJWQpICoqKlxuIjsKICNkZWZpbmUgSU5WQUxJRF9QQ0JfTVNHKGxlbikgXAotCXByaW50ayhpbnZhbGlkX3BjYl9tc2csIChsZW4pLGZpbGVuYW1lLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykKKwlwcmludGsoaW52YWxpZF9wY2JfbXNnLCAobGVuKSxmaWxlbmFtZSxfX2Z1bmNfXyxfX0xJTkVfXykKIAogc3RhdGljIGNoYXIgc2VhcmNoX21zZ1tdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIiVzOiBMb29raW5nIGZvciAzYzUwNSBhZGFwdGVyIGF0IGFkZHJlc3MgJSN4Li4uIjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDkuYyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKaW5kZXggYjlkMDk3Yy4uM2E3YmM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDkuYworKysgYi9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC00MCw3ICs0MCw3IEBACiAJCXYxLjE0IDEwLzE1Lzk3IEF2b2lkZWQgd2FpdGluZy4uZGlzY2FyZCBtZXNzYWdlIGZvciBmYXN0IG1hY2hpbmVzIC1kamIKIAkJdjEuMTUgMS8zMS85OCBGYXN0ZXIgcmVjb3ZlcnkgZm9yIFR4IGVycm9ycy4gLWRqYgogCQl2MS4xNiAyLzMvOTggRGlmZmVyZW50IElEIHBvcnQgaGFuZGxpbmcgdG8gYXZvaWQgc291bmQgY2FyZHMuIC1kamIKLQkJdjEuMTggMTJNYXIyMDAxIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKwkJdjEuMTggMTJNYXIyMDAxIEFuZHJldyBNb3J0b24KIAkJCS0gQXZvaWQgYm9ndXMgZGV0ZWN0IG9mIDNjNTkwJ3MgKEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3opCiAJCQktIFJldmlld2VkIGFnYWluc3QgMS4xOCBmcm9tIHNjeWxkLmNvbQogCQl2MS4xOGEgMTdOb3YyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTE1LmMgYi9kcml2ZXJzL25ldC8zYzUxNS5jCmluZGV4IGU0ZTMyNDEuLmEwZjhiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTE1LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MTUuYwpAQCAtMTgsNyArMTgsNyBAQAogCiAJMjAwMS8xMS8xNyAtIEFkZGVkIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKIAotCTIwMDIvMTAvMjggLSBMb2NraW5nIHVwZGF0ZXMgZm9yIDIuNSAoYWxhbkByZWRoYXQuY29tKQorCTIwMDIvMTAvMjggLSBMb2NraW5nIHVwZGF0ZXMgZm9yIDIuNSAoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKQogCiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCmluZGV4IDYwMTFkNmYuLjg1ZmE0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzljcC5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCkBAIC0xMjcsNyArMTI3LDYgQEAKIAkgIChDUCktPnR4X3RhaWwgLSAoQ1ApLT50eF9oZWFkIC0gMSkKIAogI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCi0jZGVmaW5lIFJYX09GRlNFVAkJMgogI2RlZmluZSBDUF9JTlRFUk5BTF9QSFkJCTMyCiAKIC8qIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGxvZ18yKGJ5dGVzKS00OiAgMCA9PSAxNiBieXRlcyAuLiA2PT0xMDI0LCA3PT1lbmQgb2YgcGFja2V0LiAqLwpAQCAtNTUyLDE0ICs1NTEsMTQgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnggc2xvdCAlZCBzdGF0dXMgMHgleCBsZW4gJWRcbiIsCiAJCQkgICAgICAgZGV2LT5uYW1lLCByeF90YWlsLCBzdGF0dXMsIGxlbik7CiAKLQkJYnVmbGVuID0gY3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVDsKLQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IgKGJ1Zmxlbik7CisJCWJ1ZmxlbiA9IGNwLT5yeF9idWZfc3ogKyBORVRfSVBfQUxJR047CisJCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgYnVmbGVuKTsKIAkJaWYgKCFuZXdfc2tiKSB7CiAJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWdvdG8gcnhfbmV4dDsKIAkJfQogCi0JCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisJCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7CiAKIAkJZG1hX3VubWFwX3NpbmdsZSgmY3AtPnBkZXYtPmRldiwgbWFwcGluZywKIAkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTA1MSwxOSArMTA1MCwyMCBAQAogCWNwdzhfZihDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOwogfQogCi1zdGF0aWMgaW50IGNwX3JlZmlsbF9yeCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQorc3RhdGljIGludCBjcF9yZWZpbGxfcngoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjcC0+ZGV2OwogCXVuc2lnbmVkIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ1BfUlhfUklOR19TSVpFOyBpKyspIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJZG1hX2FkZHJfdCBtYXBwaW5nOwogCi0JCXNrYiA9IGRldl9hbGxvY19za2IoY3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCk7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBjcC0+cnhfYnVmX3N6ICsgTkVUX0lQX0FMSUdOKTsKIAkJaWYgKCFza2IpCiAJCQlnb3RvIGVycl9vdXQ7CiAKLQkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAKIAkJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZjcC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCiAJCQkJCSBjcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCmluZGV4IDhhNWIwZDIuLjBkYWY4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYworKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTMwOSw3ICszMDksNyBAQAogCUNmZzkzNDYJCT0gMHg1MCwKIAlDb25maWcwCQk9IDB4NTEsCiAJQ29uZmlnMQkJPSAweDUyLAotCUZsYXNoUmVnCT0gMHg1NCwKKwlUaW1lckludAk9IDB4NTQsCiAJTWVkaWFTdGF0dXMJPSAweDU4LAogCUNvbmZpZzMJCT0gMHg1OSwKIAlDb25maWc0CQk9IDB4NUEsCSAvKiBhYnNlbnQgb24gUlRMLTgxMzlBICovCkBAIC0zMjUsNiArMzI1LDcgQEAKIAlGSUZPVE1TCQk9IDB4NzAsCSAvKiBGSUZPIENvbnRyb2wgYW5kIHRlc3QuICovCiAJQ1NDUgkJPSAweDc0LAkgLyogQ2hpcCBTdGF0dXMgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCiAJUEFSQTc4CQk9IDB4NzgsCisJRmxhc2hSZWcJPSAweEQ0LAkvKiBDb21tdW5pY2F0aW9uIHdpdGggRmxhc2ggUk9NLCBmb3VyIGJ5dGVzLiAqLwogCVBBUkE3YwkJPSAweDdjLAkgLyogTWFnaWMgdHJhbnNjZWl2ZXIgcGFyYW1ldGVyIHJlZ2lzdGVyLiAqLwogCUNvbmZpZzUJCT0gMHhEOCwJIC8qIGFic2VudCBvbiBSVEwtODEzOUEgKi8KIH07CkBAIC0xNzIyLDEzICsxNzIzLDE4IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBXcml0aW5nIHRvIFR4U3RhdHVzIHRyaWdnZXJzIGEgRE1BIHRyYW5zZmVyIG9mIHRoZSBkYXRhCisJICogY29waWVkIHRvIHRwLT50eF9idWZbZW50cnldIGFib3ZlLiBVc2UgYSBtZW1vcnkgYmFycmllcgorCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2Ugc2VlcyB0aGUgdXBkYXRlZCBkYXRhLgorCSAqLworCXdtYigpOwogCVJUTF9XMzJfRiAoVHhTdGF0dXMwICsgKGVudHJ5ICogc2l6ZW9mICh1MzIpKSwKIAkJICAgdHAtPnR4X2ZsYWcgfCBtYXgobGVuLCAodW5zaWduZWQgaW50KUVUSF9aTEVOKSk7CiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAogCXRwLT5jdXJfdHgrKzsKLQl3bWIoKTsKIAogCWlmICgodHAtPmN1cl90eCAtIE5VTV9UWF9ERVNDKSA9PSB0cC0+ZGlydHlfdHgpCiAJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CkBAIC0yMDA5LDkgKzIwMTUsOSBAQAogCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KIAkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLwogCi0JCXNrYiA9IGRldl9hbGxvY19za2IgKHBrdF9zaXplICsgMik7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3Rfc2l6ZSArIE5FVF9JUF9BTElHTik7CiAJCWlmIChsaWtlbHkoc2tiKSkgewotCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGZpZWxkcy4gKi8KKwkJCXNrYl9yZXNlcnZlIChza2IsIE5FVF9JUF9BTElHTik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGZpZWxkcy4gKi8KICNpZiBSWF9CVUZfSURYID09IDMKIAkJCXdyYXBfY29weShza2IsIHJ4X3JpbmcsIHJpbmdfb2Zmc2V0KzQsIHBrdF9zaXplKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA0YTExMjk2Li4xZDhhZjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTEzODYsNyArMTM4Niw4IEBACiAKIGNvbmZpZyBDUzg5eDAKIAl0cmlzdGF0ZSAiQ1M4OXgwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENJICYmIChJU0EgfHwgTUFDSF9JWERQMjM1MSB8fCBBUkNIX0lYRFAyWDAxIHx8IEFSQ0hfUE5YMDEwWCkKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgTUFDSF9JWERQMjM1MSBcCisJCXx8IEFSQ0hfSVhEUDJYMDEgfHwgQVJDSF9QTlgwMTBYIHx8IE1BQ0hfTVgzMUFEUykKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgYQogCSAgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKQEAgLTEzOTcsNiArMTM5OCwxMSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgY3M4OXgwLgogCitjb25maWcgQ1M4OXgwX05PTklTQV9JUlEKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBDUzg5eDAgIT0gbgorCWRlcGVuZHMgb24gTUFDSF9JWERQMjM1MSB8fCBBUkNIX0lYRFAyWDAxIHx8IEFSQ0hfUE5YMDEwWCB8fCBNQUNIX01YMzFBRFMKKwogY29uZmlnIFRDMzU4MTUKIAl0cmlzdGF0ZSAiVE9TSElCQSBUQzM1ODE1IEV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBNSVBTCkBAIC0xODEzLDcgKzE4MTksNyBAQAogCiBjb25maWcgRkVDX01QQzUyeHgKIAl0cmlzdGF0ZSAiTVBDNTJ4eCBGRUMgZHJpdmVyIgotCWRlcGVuZHMgb24gUFBDX01FUkdFICYmIFBQQ19NUEM1Mnh4ICYmIFBQQ19CRVNUQ09NTV9GRUMKKwlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4ICYmIFBQQ19CRVNUQ09NTV9GRUMKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgUEhZTElCCiAJLS0taGVscC0tLQpAQCAtMTg0MCw2ICsxODQ2LDE3IEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgTkUyMDAwIGNvbXBhdGlibGUKIAkgIGNvbnRyb2xsZXIgb24gdGhlIFJlbmVzYXMgSDgvMzAwIHByb2Nlc3Nvci4KIAorY29uZmlnIEFUTDIKKwl0cmlzdGF0ZSAiQXRoZXJvcyBMMiBGYXN0IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEF0aGVyb3MgTDIgZmFzdCBldGhlcm5ldCBhZGFwdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXRsMi4KKwogc291cmNlICJkcml2ZXJzL25ldC9mc19lbmV0L0tjb25maWciCiAKIGVuZGlmICMgTkVUX0VUSEVSTkVUCkBAIC0xOTI3LDE1ICsxOTQ0LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGUxMDAwLgogCi1jb25maWcgRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQKLQlib29sICJEaXNhYmxlIFBhY2tldCBTcGxpdCBmb3IgUENJIGV4cHJlc3MgYWRhcHRlcnMiCi0JZGVwZW5kcyBvbiBFMTAwMAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsZWdhY3kgcmVjZWl2ZSBwYXRoIGZvciBQQ0kgZXhwcmVzcwotCSAgaGFyZHdhcmUuCi0KLQkgIElmIGluIGRvdWJ0LCBzYXkgTi4KLQogY29uZmlnIEUxMDAwRQogCXRyaXN0YXRlICJJbnRlbChSKSBQUk8vMTAwMCBQQ0ktRXhwcmVzcyBHaWdhYml0IEV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgKCFTUEFSQzMyIHx8IEJST0tFTikKQEAgLTIwNDYsNiArMjA1NCw3IEBACiAJdHJpc3RhdGUgIlJlYWx0ZWsgODE2OSBnaWdhYml0IGV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFJlYWx0ZWsgODE2OSBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBhZGFwdGVyLgogCkBAIC0yMjYyLDcgKzIyNzEsNyBAQAogY29uZmlnIE1WNjQzWFhfRVRICiAJdHJpc3RhdGUgIk1hcnZlbGwgRGlzY292ZXJ5ICg2NDNYWCkgYW5kIE9yaW9uIGV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNVjY0MzYwIHx8IE1WNjRYNjAgfHwgKFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyKSB8fCBQTEFUX09SSU9OCi0Jc2VsZWN0IE1JSQorCXNlbGVjdCBQSFlMSUIKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgZ2lnYWJpdCBldGhlcm5ldCBNQUNzIGluIHRoZQogCSAgTWFydmVsbCBEaXNjb3ZlcnkgUFBDL01JUFMgY2hpcHNldCBmYW1pbHkgKE1WNjQzWFgpIGFuZApAQCAtMjI4MSwxMiArMjI5MCwxMyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcWxhM3h4eC4KIAogY29uZmlnIEFUTDEKLQl0cmlzdGF0ZSAiQXR0YW5zaWMgTDEgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJBdGhlcm9zL0F0dGFuc2ljIEwxIEdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBNSUkKIAloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQXR0YW5zaWMgTDEgZ2lnYWJpdCBldGhlcm5ldCBhZGFwdGVyLgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEF0aGVyb3MvQXR0YW5zaWMgTDEgZ2lnYWJpdCBldGhlcm5ldAorCSAgYWRhcHRlci4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGF0bDEuCkBAIC0yMzAyLDYgKzIzMTIsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBhdGwxZS4KIAorY29uZmlnIEpNRQorCXRyaXN0YXRlICJKTWljcm9uKFIpIFBDSS1FeHByZXNzIEdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUENJLUV4cHJlc3MgZ2lnYWJpdCBldGhlcm5ldCBhZGFwdGVycworCSAgYmFzZWQgb24gSk1pY3JvbiBKTUMyNTAgY2hpcHNldC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgam1lLgorCiBlbmRpZiAjIE5FVERFVl8xMDAwCiAKICMKQEAgLTIzNzcsMTAgKzIzOTksMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZWhlYS4KIAorY29uZmlnIEVOSUMKKwl0cmlzdGF0ZSAiQ2lzY28gMTBHIEV0aGVybmV0IE5JQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIElORVQKKwlzZWxlY3QgSU5FVF9MUk8KKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIHN1cHBvcnQgZm9yIHRoZSBDaXNjbyAxMEcgRXRoZXJuZXQgY2FyZC4KKwogY29uZmlnIElYR0JFCiAJdHJpc3RhdGUgIkludGVsKFIpIDEwR2JFIFBDSSBFeHByZXNzIGFkYXB0ZXJzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgSU5FVAogCXNlbGVjdCBJTkVUX0xSTworCXNlbGVjdCBJTlRFTF9JT0FURE1BCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgSW50ZWwoUikgMTBHYkUgUENJIEV4cHJlc3MgZmFtaWx5IG9mCiAJICBhZGFwdGVycy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBpZGVudGlmeSB5b3VyIGFkYXB0ZXIsIGdvCkBAIC0yNDMyLDYgKzI0NjIsNyBAQAogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgSU5FVF9MUk8KKwlzZWxlY3QgSU5URUxfSU9BVERNQQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE15cmljb20gTXlyaS0xMEcgRHVhbCBQcm90b2NvbCBpbnRlcmZhY2UgaW4KIAkgIEV0aGVybmV0IG1vZGUuIElmIHRoZSBlZXByb20gb24geW91ciBib2FyZCBpcyBub3QgcmVjZW50IGVub3VnaCwKQEAgLTI0OTYsNiArMjUyNywxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgYm54MnguICBUaGlzIGlzIHJlY29tbWVuZGVkLgogCitjb25maWcgUUxHRQorCXRyaXN0YXRlICJRTG9naWMgUUxHRSAxMEdiIEV0aGVybmV0IERyaXZlciBTdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgUUxvZ2ljIElTUDhYWFggMTBHYiBFdGhlcm5ldCBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcWxnZS4KKwogc291cmNlICJkcml2ZXJzL25ldC9zZmMvS2NvbmZpZyIKIAogZW5kaWYgIyBORVRERVZfMTAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggNzYyOWM5MC4uZmEyNTEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTE1LDkgKzE1LDEyIEBACiBvYmotJChDT05GSUdfQ0FOKSArPSBjYW4vCiBvYmotJChDT05GSUdfQk9ORElORykgKz0gYm9uZGluZy8KIG9iai0kKENPTkZJR19BVEwxKSArPSBhdGx4Lworb2JqLSQoQ09ORklHX0FUTDIpICs9IGF0bHgvCiBvYmotJChDT05GSUdfQVRMMUUpICs9IGF0bDFlLwogb2JqLSQoQ09ORklHX0dJQU5GQVIpICs9IGdpYW5mYXJfZHJpdmVyLm8KIG9iai0kKENPTkZJR19URUhVVEkpICs9IHRlaHV0aS5vCitvYmotJChDT05GSUdfRU5JQykgKz0gZW5pYy8KK29iai0kKENPTkZJR19KTUUpICs9IGptZS5vCiAKIGdpYW5mYXJfZHJpdmVyLW9ianMgOj0gZ2lhbmZhci5vIFwKIAkJZ2lhbmZhcl9ldGh0b29sLm8gXApAQCAtMTExLDcgKzExNCw3IEBACiBvYmotJChDT05GSUdfTkUyMDAwKSArPSBuZS5vIDgzOTBwLm8KIG9iai0kKENPTkZJR19ORTJfTUNBKSArPSBuZTIubyA4MzkwcC5vCiBvYmotJChDT05GSUdfSFBMQU4pICs9IGhwLm8gODM5MHAubwotb2JqLSQoQ09ORklHX0hQTEFOX1BMVVMpICs9IGhwLXBsdXMubyA4MzkwcC5vCitvYmotJChDT05GSUdfSFBMQU5fUExVUykgKz0gaHAtcGx1cy5vIDgzOTAubwogb2JqLSQoQ09ORklHX1VMVFJBKSArPSBzbWMtdWx0cmEubyA4MzkwLm8KIG9iai0kKENPTkZJR19VTFRSQU1DQSkgKz0gc21jLW1jYS5vIDgzOTAubwogb2JqLSQoQ09ORklHX1VMVFJBMzIpICs9IHNtYy11bHRyYTMyLm8gODM5MC5vCkBAIC0xMjgsNiArMTMxLDcgQEAKIG9iai0kKENPTkZJR19UU0kxMDhfRVRIKSArPSB0c2kxMDhfZXRoLm8KIG9iai0kKENPTkZJR19NVjY0M1hYX0VUSCkgKz0gbXY2NDN4eF9ldGgubwogb2JqLSQoQ09ORklHX1FMQTNYWFgpICs9IHFsYTN4eHgubworb2JqLSQoQ09ORklHX1FMR0UpICs9IHFsZ2UvCiAKIG9iai0kKENPTkZJR19QUFApICs9IHBwcF9nZW5lcmljLm8KIG9iai0kKENPTkZJR19QUFBfQVNZTkMpICs9IHBwcF9hc3luYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwppbmRleCBhMGI0Yzg1Li43MzVmYzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgICAgIC0gSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KICAqCiAgKglXaXRoIG1vcmUgdGhhbiBhIGxpdHRsZSBoZWxwIGZyb207Ci0gKgktIEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+IAorICoJLSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqICAgICAgRGVyaXZlZCBmcm9tOgogICogICAgICAtIHNrZWxldG9uLmM6IEEgbmV0d29yayBkcml2ZXIgb3V0bGluZSBmb3IgbGludXguCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKaW5kZXggYmRjNGMwYi4uYTViMDc2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpAQCAtNDQyLDI0ICs0NDIsMjQgQEAKIAkJQlVHTVNHKERfTk9STUFMLCAiV0FSTklORyEgIFN0YXRpb24gYWRkcmVzcyBGRiBtYXkgY29uZnVzZSAiCiAJCSAgICAgICAiRE9TIG5ldHdvcmtpbmcgcHJvZ3JhbXMhXG4iKTsKIAotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJaWYgKEFTVEFUVVMoKSAmIFJFU0VUZmxhZykgewotCSAgCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCSAgCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIpOwogCX0KIAogCi0JQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fKTsKIAkvKiBtYWtlIHN1cmUgd2UncmUgcmVhZHkgdG8gcmVjZWl2ZSBJUlEncy4gKi8KIAlBSU5UTUFTSygwKTsKIAl1ZGVsYXkoMSk7CQkvKiBnaXZlIGl0IHRpbWUgdG8gc2V0IHRoZSBtYXNrIGJlZm9yZQogCQkJCSAqIHdlIHJlc2V0IGl0IGFnYWluLiAobWF5IG5vdCBldmVuIGJlCiAJCQkJICogbmVjZXNzYXJ5KQogCQkJCSAqLwotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJbHAtPmludG1hc2sgPSBOT1JYZmxhZyB8IFJFQ09OZmxhZzsKIAlBSU5UTUFTSyhscC0+aW50bWFzayk7Ci0JQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fKTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKQEAgLTY3MCwxNCArNjcwLDE0IEBACiAJCWZyZWVza2IgPSAwOwogCX0KIAotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlcywgc3RhdHVzOiAleFxuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sQVNUQVRVUygpKTsKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXMsIHN0YXR1czogJXhcbiIsX19GSUxFX18sX19MSU5FX18sX19mdW5jX18sQVNUQVRVUygpKTsKIAkvKiBtYWtlIHN1cmUgd2UgZGlkbid0IGlnbm9yZSBhIFRYIElSUSB3aGlsZSB3ZSB3ZXJlIGluIGhlcmUgKi8KIAlBSU5UTUFTSygwKTsKIAotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJbHAtPmludG1hc2sgfD0gVFhGUkVFZmxhZ3xFWENOQUtmbGFnOwogCUFJTlRNQVNLKGxwLT5pbnRtYXNrKTsKLQlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXMsIHN0YXR1czogJXhcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLEFTVEFUVVMoKSk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzLCBzdGF0dXM6ICV4XG4iLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fLEFTVEFUVVMoKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogCWlmIChmcmVlc2tiKSB7CkBAIC03OTgsNyArNzk4LDcgQEAKICAgICAgICAgICAgICAgICBkaWFnc3RhdHVzID0gKHN0YXR1cyA+PiA4KSAmIDB4RkY7CiAKIAkJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzOiBzdGF0dXM9JXhcbiIsCi0JCQlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sc3RhdHVzKTsKKwkJCV9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fLHN0YXR1cyk7CiAJCWRpZHNvbWV0aGluZyA9IDA7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMKaW5kZXggOGI1MTMxMy4uNzAxMjRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMKQEAgLTIzOCwxNSArMjM4LDE1IEBACiAJdV9jaGFyIGluYnl0ZTsKIAogCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlczogZGV2OiAlcCwgbHA6ICVwLCBkZXYtPm5hbWU6ICVzXG4iLAotCQlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sZGV2LGxwLGRldi0+bmFtZSk7CisJCV9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fLGRldixscCxkZXYtPm5hbWUpOwogCUJVR01TRyhEX0lOSVQsICJSZXNldHRpbmcgJXMgKHN0YXR1cz0lMDJYaClcbiIsCiAJICAgICAgIGRldi0+bmFtZSwgQVNUQVRVUygpKTsKIAotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJbHAtPmNvbmZpZyA9IFRYRU5jZmcgfCAobHAtPnRpbWVvdXQgPDwgMykgfCAobHAtPmJhY2twbGFuZSA8PCAyKTsKIAkvKiBwb3dlci11cCBkZWZhdWx0cyAqLwogCVNFVENPTkY7Ci0JQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fKTsKIAogCWlmIChyZWFsbHlfcmVzZXQpIHsKIAkJLyogcmVzZXQgdGhlIGNhcmQgKi8KQEAgLTI1NCwyMiArMjU0LDIyIEBACiAJCW1kZWxheShSRVNFVHRpbWUgKiAyKTsJLyogQ09NMjAwMjAgc2VlbXMgdG8gYmUgc2xvd2VyIHNvbWV0aW1lcyAqLwogCX0KIAkvKiBjbGVhciBmbGFncyAmIGVuZCByZXNldCAqLwotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgUkVTRVRjbGVhciB8IENPTkZJR2NsZWFyKTsKIAogCS8qIHZlcmlmeSB0aGF0IHRoZSBBUkNuZXQgc2lnbmF0dXJlIGJ5dGUgaXMgcHJlc2VudCAqLwotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAKIAljb20yMDAyMF9jb3B5X2Zyb21fY2FyZChkZXYsIDAsIDAsICZpbmJ5dGUsIDEpOwotCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJaWYgKGluYnl0ZSAhPSBURVNUdmFsdWUpIHsKLQkJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7CiAJCUJVR01TRyhEX05PUk1BTCwgInJlc2V0IGZhaWxlZDogVEVTVHZhbHVlIG5vdCBwcmVzZW50LlxuIik7CiAJCXJldHVybiAxOwogCX0KIAkvKiBlbmFibGUgZXh0ZW5kZWQgKDUxMi1ieXRlKSBwYWNrZXRzICovCiAJQUNPTU1BTkQoQ09ORklHY21kIHwgRVhUY29uZik7Ci0JQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fKTsKIAogCS8qIGRvbmUhICByZXR1cm4gc3VjY2Vzcy4gKi8KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlX2h3LmMgYi9kcml2ZXJzL25ldC9hdGwxZS9hdGwxZV9ody5jCmluZGV4IDk0OWU3NTMuLjhjYmMxYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMWUvYXRsMWVfaHcuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAgKi8KIGludCBhdGwxZV9waHlfY29tbWl0KHN0cnVjdCBhdGwxZV9odyAqaHcpCiB7Ci0Jc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKilody0+YWRhcHRlcjsKKwlzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5hZGFwdGVyOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAlpbnQgcmV0X3ZhbDsKIAl1MTYgcGh5X2RhdGE7CkBAIC00MzEsNyArNDMxLDcgQEAKIAogaW50IGF0bDFlX3BoeV9pbml0KHN0cnVjdCBhdGwxZV9odyAqaHcpCiB7Ci0Jc3RydWN0IGF0bDFlX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFlX2FkYXB0ZXIgKilody0+YWRhcHRlcjsKKwlzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5hZGFwdGVyOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAlzMzIgcmV0X3ZhbDsKIAl1MTYgcGh5X3ZhbDsKQEAgLTUyNSw3ICs1MjUsNyBAQAogICovCiBpbnQgYXRsMWVfcmVzZXRfaHcoc3RydWN0IGF0bDFlX2h3ICpodykKIHsKLQlzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYXRsMWVfYWRhcHRlciAqKWh3LT5hZGFwdGVyOworCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gaHctPmFkYXB0ZXI7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCiAJdTMyIGlkbGVfc3RhdHVzX2RhdGEgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMWUvYXRsMWVfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMWUvYXRsMWVfbWFpbi5jCmluZGV4IDc2ODViOTkuLjliNjAzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFlL2F0bDFlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9hdGwxZS9hdGwxZV9tYWluLmMKQEAgLTIzOTAsOSArMjM5MCw3IEBACiAJfQogCiAJLyogSW5pdCBHUEhZIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGR1ZSB0byBwb3dlciBzYXZpbmcgaXNzdWUgICovCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5tZGlvX2xvY2spOwogCWF0bDFlX3BoeV9pbml0KCZhZGFwdGVyLT5odyk7Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CiAJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgdG8KIAkgKiBwdXQgdGhlIGRldmljZSBpbiBhIGtub3duIGdvb2Qgc3RhcnRpbmcgc3RhdGUgKi8KIAllcnIgPSBhdGwxZV9yZXNldF9odygmYWRhcHRlci0+aHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRseC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2F0bHgvTWFrZWZpbGUKaW5kZXggY2E0NTU1My4uZTRmNjAyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRseC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9hdGx4L01ha2VmaWxlCkBAIC0xICsxLDMgQEAKIG9iai0kKENPTkZJR19BVEwxKQkrPSBhdGwxLm8KK29iai0kKENPTkZJR19BVEwyKQkrPSBhdGwyLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRseC9hdGwxLmMgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDEuYwppbmRleCBlMjNjZTc3Li4zY2Y1OWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGx4L2F0bDEuYworKysgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDEuYwpAQCAtMjQsMTYgKzI0LDEyIEBACiAgKiBmaWxlIGNhbGxlZCBDT1BZSU5HLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiBYaW9uZyBIdWFuZyA8eGlvbmdfaHVhbmdAYXR0YW5zaWMuY29tPgotICogQXR0YW5zaWMgVGVjaG5vbG9neSBDb3JwLiAzRiAxNDcsIFhpYW56aGVuZyA5dGggUm9hZCwgWmh1YmVpLAotICogWGluemh1ICAzMDIsIFRBSVdBTiwgUkVQVUJMSUMgT0YgQ0hJTkEKLSAqCisgKiBYaW9uZyBIdWFuZyA8eGlvbmcuaHVhbmdAYXRoZXJvcy5jb20+CisgKiBKaWUgWWFuZyA8amllLnlhbmdAYXRoZXJvcy5jb20+CiAgKiBDaHJpcyBTbm9vayA8Y3Nub29rQHJlZGhhdC5jb20+CiAgKiBKYXkgQ2xpYnVybiA8amNsaWJ1cm5AZ21haWwuY29tPgogICoKLSAqIFRoaXMgdmVyc2lvbiBpcyBhZGFwdGVkIGZyb20gdGhlIEF0dGFuc2ljIHJlZmVyZW5jZSBkcml2ZXIgZm9yCi0gKiBpbmNsdXNpb24gaW4gdGhlIExpbnV4IGtlcm5lbC4gIEl0IGlzIGN1cnJlbnRseSB1bmRlciBoZWF2eSBkZXZlbG9wbWVudC4KLSAqIEEgdmVyeSBpbmNvbXBsZXRlIGxpc3Qgb2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkZWFsdCB3aXRoOgorICogVGhpcyB2ZXJzaW9uIGlzIGFkYXB0ZWQgZnJvbSB0aGUgQXR0YW5zaWMgcmVmZXJlbmNlIGRyaXZlci4KICAqCiAgKiBUT0RPOgogICogQWRkIG1vcmUgZXRodG9vbCBmdW5jdGlvbnMuCkBAIC0yMTA5LDcgKzIxMDUsNiBAQAogc3RhdGljIGludCBhdGwxX3RzbyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCXN0cnVjdCB0eF9wYWNrZXRfZGVzYyAqcHRwZCkKIHsKLQkvKiBzcGlubG9jayBoZWxkICovCiAJdTggaGRyX2xlbiwgaXBfb2ZmOwogCXUzMiByZWFsX2xlbjsKIAlpbnQgZXJyOwpAQCAtMjE5Niw3ICsyMTkxLDYgQEAKIHN0YXRpYyB2b2lkIGF0bDFfdHhfbWFwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCiAJc3RydWN0IHR4X3BhY2tldF9kZXNjICpwdHBkKQogewotCS8qIHNwaW5sb2NrIGhlbGQgKi8KIAlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CiAJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKIAl1MTYgYnVmX2xlbiA9IHNrYi0+bGVuOwpAQCAtMjMwMyw3ICsyMjk3LDYgQEAKIHN0YXRpYyB2b2lkIGF0bDFfdHhfcXVldWUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgdTE2IGNvdW50LAogICAgICAgIHN0cnVjdCB0eF9wYWNrZXRfZGVzYyAqcHRwZCkKIHsKLQkvKiBzcGlubG9jayBoZWxkICovCiAJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwogCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJc3RydWN0IHR4X3BhY2tldF9kZXNjICp0cGQ7CkBAIC0yMzYxLDcgKzIzNTQsNiBAQAogCXN0cnVjdCB0eF9wYWNrZXRfZGVzYyAqcHRwZDsKIAl1MTYgZnJhZ19zaXplOwogCXUxNiB2bGFuX3RhZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBucl9mcmFncyA9IDA7CiAJdW5zaWduZWQgaW50IG1zcyA9IDA7CiAJdW5zaWduZWQgaW50IGY7CkBAIC0yMzk5LDE4ICsyMzkxLDkgQEAKIAkJfQogCX0KIAotCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKSkgewotCQkvKiBDYW4ndCBnZXQgbG9jayAtIHRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLwotCQlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChhZGFwdGVyKSkKLQkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkidHggbG9ja2VkXG4iKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7Ci0JfQotCiAJaWYgKGF0bDFfdHBkX2F2YWlsKCZhZGFwdGVyLT50cGRfcmluZykgPCBjb3VudCkgewogCQkvKiBub3QgZW5vdWdoIGRlc2NyaXB0b3JzICovCiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogCQlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChhZGFwdGVyKSkKIAkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkidHggYnVzeVxuIik7CkBAIC0yNDMyLDcgKzI0MTUsNiBAQAogCiAJdHNvID0gYXRsMV90c28oYWRhcHRlciwgc2tiLCBwdHBkKTsKIAlpZiAodHNvIDwgMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQpAQCAtMjQ0MCw3ICsyNDIyLDYgQEAKIAlpZiAoIXRzbykgewogCQlyZXRfdmFsID0gYXRsMV90eF9jc3VtKGFkYXB0ZXIsIHNrYiwgcHRwZCk7CiAJCWlmIChyZXRfdmFsIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJCX0KQEAgLTI0NDksNyArMjQzMCw3IEBACiAJYXRsMV90eF9tYXAoYWRhcHRlciwgc2tiLCBwdHBkKTsKIAlhdGwxX3R4X3F1ZXVlKGFkYXB0ZXIsIGNvdW50LCBwdHBkKTsKIAlhdGwxX3VwZGF0ZV9tYWlsYm94KGFkYXB0ZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwltbWlvd2IoKTsKIAluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpAQCAtMjY0Miw2ICsyNjIzLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIpOwogCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CkBAIC0yNjU1LDcgKzI2MzcsNiBAQAogCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwogCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gLTE7CiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKIAlhdGwxX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CiAJYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOwpAQCAtMjcyNCw2ICsyNzA1LDggQEAKIAlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgZXJyOwogCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwogCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCiAJZXJyID0gYXRsMV9zZXR1cF9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKIAlpZiAoZXJyKQpAQCAtMzAyMiw3ICszMDA1LDYgQEAKIAluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKIAluZXRkZXYtPmZlYXR1cmVzIHw9IChORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlgpOwotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOwogCiAJLyoKIAkgKiBwYXRjaCBmb3Igc29tZSBMMSBvZiBvbGQgdmVyc2lvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bHgvYXRsMi5jIGIvZHJpdmVycy9uZXQvYXRseC9hdGwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViZGM5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMi5jCkBAIC0wLDAgKzEsMzExOSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA2IC0gMjAwNyBBdGhlcm9zIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDA4IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImF0bDIuaCIKKworI2RlZmluZSBBVEwyX0RSVl9WRVJTSU9OICIyLjIuMyIKKworc3RhdGljIGNoYXIgYXRsMl9kcml2ZXJfbmFtZVtdID0gImF0bDIiOworc3RhdGljIGNvbnN0IGNoYXIgYXRsMl9kcml2ZXJfc3RyaW5nW10gPSAiQXRoZXJvcyhSKSBMMiBFdGhlcm5ldCBEcml2ZXIiOworc3RhdGljIGNoYXIgYXRsMl9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDIwMDcgQXRoZXJvcyBDb3Jwb3JhdGlvbi4iOworc3RhdGljIGNoYXIgYXRsMl9kcml2ZXJfdmVyc2lvbltdID0gQVRMMl9EUlZfVkVSU0lPTjsKKworTU9EVUxFX0FVVEhPUigiQXRoZXJvcyBDb3Jwb3JhdGlvbiA8eGlvbmcuaHVhbmdAYXRoZXJvcy5jb20+LCBDaHJpcyBTbm9vayA8Y3Nub29rQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF0aGVyb3MgRmFzdCBFdGhlcm5ldCBOZXR3b3JrIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQVRMMl9EUlZfVkVSU0lPTik7CisKKy8qCisgKiBhdGwyX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGwyX3BjaV90YmxbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FUVEFOU0lDLCBQQ0lfREVWSUNFX0lEX0FUVEFOU0lDX0wyKX0sCisJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLworCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXRsMl9wY2lfdGJsKTsKKworc3RhdGljIHZvaWQgYXRsMl9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisKK3N0YXRpYyB2b2lkIGF0bDJfY2hlY2tfb3B0aW9ucyhzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKTsKKworLyoKKyAqIGF0bDJfc3dfaW5pdCAtIEluaXRpYWxpemUgZ2VuZXJhbCBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIChzdHJ1Y3QgYXRsMl9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBhdGwyX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bDJfc3dfaW5pdChzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwyX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KKwlody0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWh3LT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CisJaHctPnN1YnN5c3RlbV92ZW5kb3JfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWh3LT5zdWJzeXN0ZW1faWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmaHctPnJldmlzaW9uX2lkKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmh3LT5wY2lfY21kX3dvcmQpOworCisJYWRhcHRlci0+d29sID0gMDsKKwlhZGFwdGVyLT5pY3QgPSA1MDAwMDsgIC8qIH4xMDBtcyAqLworCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOyAgIC8qIGhhcmR3YXJlIGluaXQgKi8KKwlhZGFwdGVyLT5saW5rX2R1cGxleCA9IEZVTExfRFVQTEVYOworCisJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7CisJaHctPnByZWFtYmxlX2xlbiA9IDc7CisJaHctPmlwZ3QgPSAweDYwOworCWh3LT5taW5faWZnID0gMHg1MDsKKwlody0+aXBncjEgPSAweDQwOworCWh3LT5pcGdyMiA9IDB4NjA7CisJaHctPnJldHJ5X2J1ZiA9IDI7CisJaHctPm1heF9yZXRyeSA9IDB4ZjsKKwlody0+bGNvbCA9IDB4Mzc7CisJaHctPmphbV9pcGcgPSA3OworCWh3LT5mY19yeGRfaGkgPSAwOworCWh3LT5mY19yeGRfbG8gPSAwOworCWh3LT5tYXhfZnJhbWVfc2l6ZSA9IGFkYXB0ZXItPm5ldGRldi0+bXR1OworCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCisJc2V0X2JpdChfX0FUTDJfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogYXRsMl9zZXRfbXVsdGkgLSBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGUgc2V0CisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhlIHNldF9tdWx0aSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG11bHRpY2FzdCBhZGRyZXNzCisgKiBsaXN0IG9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmbGFncyBhcmUgdXBkYXRlZC4gIFRoaXMgcm91dGluZSBpcworICogcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZSBmb3IgcHJvcGVyIG11bHRpY2FzdCwKKyAqIHByb21pc2N1b3VzIG1vZGUsIGFuZCBhbGwtbXVsdGkgYmVoYXZpb3IuCisgKi8KK3N0YXRpYyB2b2lkIGF0bDJfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXUzMiByY3RsOworCXUzMiBoYXNoX3ZhbHVlOworCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisJcmN0bCA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NQUNfQ1RSTCk7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJjdGwgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOworCX0gZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlyY3RsIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKwkJcmN0bCAmPSB+TUFDX0NUUkxfUFJPTUlTX0VOOworCX0gZWxzZQorCQlyY3RsICY9IH4oTUFDX0NUUkxfUFJPTUlTX0VOIHwgTUFDX0NUUkxfTUNfQUxMX0VOKTsKKworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfTUFDX0NUUkwsIHJjdGwpOworCisJLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfUlhfSEFTSF9UQUJMRSwgMCk7CisJQVRMMl9XUklURV9SRUdfQVJSQVkoaHcsIFJFR19SWF9IQVNIX1RBQkxFLCAxLCAwKTsKKworCS8qIGNvbW91dGUgbWMgYWRkcmVzc2VzJyBoYXNoIHZhbHVlICxhbmQgcHV0IGl0IGludG8gaGFzaCB0YWJsZSAqLworCWZvciAobWNfcHRyID0gbmV0ZGV2LT5tY19saXN0OyBtY19wdHI7IG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgeworCQloYXNoX3ZhbHVlID0gYXRsMl9oYXNoX21jX2FkZHIoaHcsIG1jX3B0ci0+ZG1pX2FkZHIpOworCQlhdGwyX2hhc2hfc2V0KGh3LCBoYXNoX3ZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmluZ19wdHJzKHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogUmVhZCAvIFdyaXRlIFB0ciBJbml0aWFsaXplOiAqLworCWFkYXB0ZXItPnR4ZF93cml0ZV9wdHIgPSAwOworCWF0b21pY19zZXQoJmFkYXB0ZXItPnR4ZF9yZWFkX3B0ciwgMCk7CisKKwlhZGFwdGVyLT5yeGRfcmVhZF9wdHIgPSAwOworCWFkYXB0ZXItPnJ4ZF93cml0ZV9wdHIgPSAwOworCisJYXRvbWljX3NldCgmYWRhcHRlci0+dHhzX3dyaXRlX3B0ciwgMCk7CisJYWRhcHRlci0+dHhzX25leHRfY2xlYXIgPSAwOworfQorCisvKgorICogYXRsMl9jb25maWd1cmUgLSBDb25maWd1cmUgVHJhbnNtaXQmUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0CisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IC9SeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqLworc3RhdGljIGludCBhdGwyX2NvbmZpZ3VyZShzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwyX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgdmFsdWU7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfSVNSLCAweGZmZmZmZmZmKTsKKworCS8qIHNldCBNQUMgQWRkcmVzcyAqLworCXZhbHVlID0gKCgodTMyKWh3LT5tYWNfYWRkclsyXSkgPDwgMjQpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkcls0XSkgPDwgOCkgfAorCQkoKCh1MzIpaHctPm1hY19hZGRyWzVdKSk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfU1RBX0FERFIsIHZhbHVlKTsKKwl2YWx1ZSA9ICgoKHUzMilody0+bWFjX2FkZHJbMF0pIDw8IDgpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkclsxXSkpOworCUFUTDJfV1JJVEVfUkVHKGh3LCAoUkVHX01BQ19TVEFfQUREUis0KSwgdmFsdWUpOworCisJLyogSEkgYmFzZSBhZGRyZXNzICovCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19ERVNDX0JBU0VfQUREUl9ISSwKKwkJKHUzMikoKGFkYXB0ZXItPnJpbmdfZG1hICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSA+PiAzMikpOworCisJLyogTE8gYmFzZSBhZGRyZXNzICovCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19UWERfQkFTRV9BRERSX0xPLAorCQkodTMyKShhZGFwdGVyLT50eGRfZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19UWFNfQkFTRV9BRERSX0xPLAorCQkodTMyKShhZGFwdGVyLT50eHNfZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19SWERfQkFTRV9BRERSX0xPLAorCQkodTMyKShhZGFwdGVyLT5yeGRfZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisKKwkvKiBlbGVtZW50IGNvdW50ICovCisJQVRMMl9XUklURV9SRUdXKGh3LCBSRUdfVFhEX01FTV9TSVpFLCAodTE2KShhZGFwdGVyLT50eGRfcmluZ19zaXplLzQpKTsKKwlBVEwyX1dSSVRFX1JFR1coaHcsIFJFR19UWFNfTUVNX1NJWkUsICh1MTYpYWRhcHRlci0+dHhzX3Jpbmdfc2l6ZSk7CisJQVRMMl9XUklURV9SRUdXKGh3LCBSRUdfUlhEX0JVRl9OVU0sICAodTE2KWFkYXB0ZXItPnJ4ZF9yaW5nX3NpemUpOworCisJLyogY29uZmlnIEludGVybmFsIFNSQU0gKi8KKy8qCisgICAgQVRMMl9XUklURV9SRUdXKGh3LCBSRUdfU1JBTV9UWFJBTV9FTkQsIHNyYW1fdHhfZW5kKTsKKyAgICBBVEwyX1dSSVRFX1JFR1coaHcsIFJFR19TUkFNX1RYUkFNX0VORCwgc3JhbV9yeF9lbmQpOworKi8KKworCS8qIGNvbmZpZyBJUEcvSUZHICovCisJdmFsdWUgPSAoKCh1MzIpaHctPmlwZ3QgJiBNQUNfSVBHX0lGR19JUEdUX01BU0spIDw8CisJCU1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKKwkJKCgodTMyKWh3LT5taW5faWZnICYgTUFDX0lQR19JRkdfTUlGR19NQVNLKSA8PAorCQlNQUNfSVBHX0lGR19NSUZHX1NISUZUKSB8CisJCSgoKHUzMilody0+aXBncjEgJiBNQUNfSVBHX0lGR19JUEdSMV9NQVNLKSA8PAorCQlNQUNfSVBHX0lGR19JUEdSMV9TSElGVCl8CisJCSgoKHUzMilody0+aXBncjIgJiBNQUNfSVBHX0lGR19JUEdSMl9NQVNLKSA8PAorCQlNQUNfSVBHX0lGR19JUEdSMl9TSElGVCk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfSVBHX0lGRywgdmFsdWUpOworCisJLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCisJdmFsdWUgPSAoKHUzMilody0+bGNvbCAmIE1BQ19IQUxGX0RVUExYX0NUUkxfTENPTF9NQVNLKSB8CisJCSgoKHUzMilody0+bWF4X3JldHJ5ICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9SRVRSWV9NQVNLKSA8PAorCQlNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUKSB8CisJCU1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiB8CisJCSgweGEgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCkgfAorCQkoKCh1MzIpaHctPmphbV9pcGcgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLKSA8PAorCQlNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19TSElGVCk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfSEFMRl9EVVBMWF9DVFJMLCB2YWx1ZSk7CisKKwkvKiBzZXQgSW50ZXJydXB0IE1vZGVyYXRvciBUaW1lciAqLworCUFUTDJfV1JJVEVfUkVHVyhodywgUkVHX0lSUV9NT0RVX1RJTUVSX0lOSVQsIGFkYXB0ZXItPmltdCk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQVNURVJfQ1RSTCwgTUFTVEVSX0NUUkxfSVRJTUVSX0VOKTsKKworCS8qIHNldCBJbnRlcnJ1cHQgQ2xlYXIgVGltZXIgKi8KKwlBVEwyX1dSSVRFX1JFR1coaHcsIFJFR19DTUJESVNETUFfVElNRVIsIGFkYXB0ZXItPmljdCk7CisKKwkvKiBzZXQgTVRVICovCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NVFUsIGFkYXB0ZXItPm5ldGRldi0+bXR1ICsKKwkJRU5FVF9IRUFERVJfU0laRSArIFZMQU5fU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFKTsKKworCS8qIDE1OTAgKi8KKwlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1RYX0NVVF9USFJFU0gsIDB4MTc3KTsKKworCS8qIGZsb3cgY29udHJvbCAqLworCUFUTDJfV1JJVEVfUkVHVyhodywgUkVHX1BBVVNFX09OX1RILCBody0+ZmNfcnhkX2hpKTsKKwlBVEwyX1dSSVRFX1JFR1coaHcsIFJFR19QQVVTRV9PRkZfVEgsIGh3LT5mY19yeGRfbG8pOworCisJLyogSW5pdCBtYWlsYm94ICovCisJQVRMMl9XUklURV9SRUdXKGh3LCBSRUdfTUJfVFhEX1dSX0lEWCwgKHUxNilhZGFwdGVyLT50eGRfd3JpdGVfcHRyKTsKKwlBVEwyX1dSSVRFX1JFR1coaHcsIFJFR19NQl9SWERfUkRfSURYLCAodTE2KWFkYXB0ZXItPnJ4ZF9yZWFkX3B0cik7CisKKwkvKiBlbmFibGUgRE1BIHJlYWQvd3JpdGUgKi8KKwlBVEwyX1dSSVRFX1JFR0IoaHcsIFJFR19ETUFSLCBETUFSX0VOKTsKKwlBVEwyX1dSSVRFX1JFR0IoaHcsIFJFR19ETUFXLCBETUFXX0VOKTsKKworCXZhbHVlID0gQVRMMl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19JU1IpOworCWlmICgodmFsdWUgJiBJU1JfUEhZX0xJTktET1dOKSAhPSAwKQorCQl2YWx1ZSA9IDE7IC8qIGNvbmZpZyBmYWlsZWQgKi8KKwllbHNlCisJCXZhbHVlID0gMDsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfSVNSLCAweDNmZmZmZmZmKTsKKwlBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JU1IsIDApOworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIGF0bDJfc2V0dXBfcmluZ19yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCAvIFJYIGRlc2NyaXB0b3IgcmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBzMzIgYXRsMl9zZXR1cF9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlpbnQgc2l6ZTsKKwl1OCBvZmZzZXQgPSAwOworCisJLyogcmVhbCByaW5nIERNQSBidWZmZXIgKi8KKwlhZGFwdGVyLT5yaW5nX3NpemUgPSBzaXplID0KKwkJYWRhcHRlci0+dHhkX3Jpbmdfc2l6ZSAqIDEgKyA3ICsJLyogZHdvcmQgYWxpZ24gKi8KKwkJYWRhcHRlci0+dHhzX3Jpbmdfc2l6ZSAqIDQgKyA3ICsJLyogZHdvcmQgYWxpZ24gKi8KKwkJYWRhcHRlci0+cnhkX3Jpbmdfc2l6ZSAqIDE1MzYgKyAxMjc7CS8qIDEyOGJ5dGVzIGFsaWduICovCisKKwlhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwKKwkJJmFkYXB0ZXItPnJpbmdfZG1hKTsKKwlpZiAoIWFkYXB0ZXItPnJpbmdfdmlyX2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChhZGFwdGVyLT5yaW5nX3Zpcl9hZGRyLCAwLCBhZGFwdGVyLT5yaW5nX3NpemUpOworCisJLyogSW5pdCBUWEQgUmluZyAqLworCWFkYXB0ZXItPnR4ZF9kbWEgPSBhZGFwdGVyLT5yaW5nX2RtYSA7CisJb2Zmc2V0ID0gKGFkYXB0ZXItPnR4ZF9kbWEgJiAweDcpID8gKDggLSAoYWRhcHRlci0+dHhkX2RtYSAmIDB4NykpIDogMDsKKwlhZGFwdGVyLT50eGRfZG1hICs9IG9mZnNldDsKKwlhZGFwdGVyLT50eGRfcmluZyA9IChzdHJ1Y3QgdHhfcGt0X2hlYWRlciAqKSAoYWRhcHRlci0+cmluZ192aXJfYWRkciArCisJCW9mZnNldCk7CisKKwkvKiBJbml0IFRYUyBSaW5nICovCisJYWRhcHRlci0+dHhzX2RtYSA9IGFkYXB0ZXItPnR4ZF9kbWEgKyBhZGFwdGVyLT50eGRfcmluZ19zaXplOworCW9mZnNldCA9IChhZGFwdGVyLT50eHNfZG1hICYgMHg3KSA/ICg4IC0gKGFkYXB0ZXItPnR4c19kbWEgJiAweDcpKSA6IDA7CisJYWRhcHRlci0+dHhzX2RtYSArPSBvZmZzZXQ7CisJYWRhcHRlci0+dHhzX3JpbmcgPSAoc3RydWN0IHR4X3BrdF9zdGF0dXMgKikKKwkJKCgodTggKilhZGFwdGVyLT50eGRfcmluZykgKyAoYWRhcHRlci0+dHhkX3Jpbmdfc2l6ZSArIG9mZnNldCkpOworCisJLyogSW5pdCBSWEQgUmluZyAqLworCWFkYXB0ZXItPnJ4ZF9kbWEgPSBhZGFwdGVyLT50eHNfZG1hICsgYWRhcHRlci0+dHhzX3Jpbmdfc2l6ZSAqIDQ7CisJb2Zmc2V0ID0gKGFkYXB0ZXItPnJ4ZF9kbWEgJiAxMjcpID8KKwkJKDEyOCAtIChhZGFwdGVyLT5yeGRfZG1hICYgMTI3KSkgOiAwOworCWlmIChvZmZzZXQgPiA3KQorCQlvZmZzZXQgLT0gODsKKwllbHNlCisJCW9mZnNldCArPSAoMTI4IC0gOCk7CisKKwlhZGFwdGVyLT5yeGRfZG1hICs9IG9mZnNldDsKKwlhZGFwdGVyLT5yeGRfcmluZyA9IChzdHJ1Y3QgcnhfZGVzYyAqKSAoKCh1OCAqKWFkYXB0ZXItPnR4c19yaW5nKSArCisJCShhZGFwdGVyLT50eHNfcmluZ19zaXplICogNCArIG9mZnNldCkpOworCisvKgorICogUmVhZCAvIFdyaXRlIFB0ciBJbml0aWFsaXplOgorICogICAgICBpbml0X3JpbmdfcHRycyhhZGFwdGVyKTsKKyAqLworCXJldHVybiAwOworfQorCisvKgorICogYXRsMl9pcnFfZW5hYmxlIC0gRW5hYmxlIGRlZmF1bHQgaW50ZXJydXB0IGdlbmVyYXRpb24gc2V0dGluZ3MKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRsMl9pcnFfZW5hYmxlKHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfSU1SLCBJTVJfTk9STUFMX01BU0spOworCUFUTDJfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKK30KKworLyoKKyAqIGF0bDJfaXJxX2Rpc2FibGUgLSBNYXNrIG9mZiBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiB0aGUgTklDCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0bDJfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKyAgICBBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19JTVIsIDApOworICAgIEFUTDJfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKKyAgICBzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKK30KKworI2lmZGVmIE5FVElGX0ZfSFdfVkxBTl9UWAorc3RhdGljIHZvaWQgYXRsMl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgY3RybDsKKworCWF0bDJfaXJxX2Rpc2FibGUoYWRhcHRlcik7CisJYWRhcHRlci0+dmxncnAgPSBncnA7CisKKwlpZiAoZ3JwKSB7CisJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJY3RybCA9IEFUTDJfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUFDX0NUUkwpOworCQljdHJsIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCQlBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQUNfQ1RSTCwgY3RybCk7CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJY3RybCA9IEFUTDJfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUFDX0NUUkwpOworCQljdHJsICY9IH5NQUNfQ1RSTF9STVZfVkxBTjsKKwkJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUFDX0NUUkwsIGN0cmwpOworCX0KKworCWF0bDJfaXJxX2VuYWJsZShhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgYXRsMl9yZXN0b3JlX3ZsYW4oc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdGwyX3ZsYW5fcnhfcmVnaXN0ZXIoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT52bGdycCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXRsMl9pbnRyX3J4KHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlkbyB7CisJCXJ4ZCA9IGFkYXB0ZXItPnJ4ZF9yaW5nK2FkYXB0ZXItPnJ4ZF93cml0ZV9wdHI7CisJCWlmICghcnhkLT5zdGF0dXMudXBkYXRlKQorCQkJYnJlYWs7IC8qIGVuZCBvZiB0eCAqLworCisJCS8qIGNsZWFyIHRoaXMgZmxhZyBhdCBvbmNlICovCisJCXJ4ZC0+c3RhdHVzLnVwZGF0ZSA9IDA7CisKKwkJaWYgKHJ4ZC0+c3RhdHVzLm9rICYmIHJ4ZC0+c3RhdHVzLnBrdF9zaXplID49IDYwKSB7CisJCQlpbnQgcnhfc2l6ZSA9IChpbnQpKHJ4ZC0+c3RhdHVzLnBrdF9zaXplIC0gNCk7CisJCQkvKiBhbGxvYyBuZXcgYnVmZmVyICovCisJCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgcnhfc2l6ZSArIE5FVF9JUF9BTElHTik7CisJCQlpZiAoTlVMTCA9PSBza2IpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlczogTWVtIHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQluZXRkZXYtPm5hbWUpOworCQkJCS8qCisJCQkJICogQ2hlY2sgdGhhdCBzb21lIHJ4IHNwYWNlIGlzIGZyZWUuIElmIG5vdCwKKwkJCQkgKiBmcmVlIG9uZSBhbmQgbWFyayBzdGF0cy0+cnhfZHJvcHBlZCsrLgorCQkJCSAqLworCQkJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCQlza2ItPmRldiA9IG5ldGRldjsKKwkJCW1lbWNweShza2ItPmRhdGEsIHJ4ZC0+cGFja2V0LCByeF9zaXplKTsKKwkJCXNrYl9wdXQoc2tiLCByeF9zaXplKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisjaWZkZWYgTkVUSUZfRl9IV19WTEFOX1RYCisJCQlpZiAoYWRhcHRlci0+dmxncnAgJiYgKHJ4ZC0+c3RhdHVzLnZsYW4pKSB7CisJCQkJdTE2IHZsYW5fdGFnID0gKHJ4ZC0+c3RhdHVzLnZ0YWc+PjQpIHwKKwkJCQkJKChyeGQtPnN0YXR1cy52dGFnJjcpIDw8IDEzKSB8CisJCQkJCSgocnhkLT5zdGF0dXMudnRhZyY4KSA8PCA5KTsKKwkJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwgdmxhbl90YWcpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcnhfc2l6ZTsKKwkJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCisJCQlpZiAocnhkLT5zdGF0dXMub2sgJiYgcnhkLT5zdGF0dXMucGt0X3NpemUgPD0gNjApCisJCQkJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeGQtPnN0YXR1cy5tY2FzdCkKKwkJCQlhZGFwdGVyLT5uZXRfc3RhdHMubXVsdGljYXN0Kys7CisJCQlpZiAocnhkLT5zdGF0dXMuY3JjKQorCQkJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAocnhkLT5zdGF0dXMuYWxpZ24pCisJCQkJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQl9CisKKwkJLyogYWR2YW5jZSB3cml0ZSBwdHIgKi8KKwkJaWYgKCsrYWRhcHRlci0+cnhkX3dyaXRlX3B0ciA9PSBhZGFwdGVyLT5yeGRfcmluZ19zaXplKQorCQkJYWRhcHRlci0+cnhkX3dyaXRlX3B0ciA9IDA7CisJfSB3aGlsZSAoMSk7CisKKwkvKiB1cGRhdGUgbWFpbGJveD8gKi8KKwlhZGFwdGVyLT5yeGRfcmVhZF9wdHIgPSBhZGFwdGVyLT5yeGRfd3JpdGVfcHRyOworCUFUTDJfV1JJVEVfUkVHVygmYWRhcHRlci0+aHcsIFJFR19NQl9SWERfUkRfSURYLCBhZGFwdGVyLT5yeGRfcmVhZF9wdHIpOworfQorCitzdGF0aWMgdm9pZCBhdGwyX2ludHJfdHgoc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdHhkX3JlYWRfcHRyOworCXUzMiB0eHNfd3JpdGVfcHRyOworCXN0cnVjdCB0eF9wa3Rfc3RhdHVzICp0eHM7CisJc3RydWN0IHR4X3BrdF9oZWFkZXIgKnR4cGg7CisJaW50IGZyZWVfaG9sZSA9IDA7CisKKwlkbyB7CisJCXR4c193cml0ZV9wdHIgPSAodTMyKSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhzX3dyaXRlX3B0cik7CisJCXR4cyA9IGFkYXB0ZXItPnR4c19yaW5nICsgdHhzX3dyaXRlX3B0cjsKKwkJaWYgKCF0eHMtPnVwZGF0ZSkKKwkJCWJyZWFrOyAvKiB0eCBzdG9wIGhlcmUgKi8KKworCQlmcmVlX2hvbGUgPSAxOworCQl0eHMtPnVwZGF0ZSA9IDA7CisKKwkJaWYgKCsrdHhzX3dyaXRlX3B0ciA9PSBhZGFwdGVyLT50eHNfcmluZ19zaXplKQorCQkJdHhzX3dyaXRlX3B0ciA9IDA7CisJCWF0b21pY19zZXQoJmFkYXB0ZXItPnR4c193cml0ZV9wdHIsIChpbnQpdHhzX3dyaXRlX3B0cik7CisKKwkJdHhkX3JlYWRfcHRyID0gKHUzMikgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4ZF9yZWFkX3B0cik7CisJCXR4cGggPSAoc3RydWN0IHR4X3BrdF9oZWFkZXIgKikKKwkJCSgoKHU4ICopYWRhcHRlci0+dHhkX3JpbmcpICsgdHhkX3JlYWRfcHRyKTsKKworCQlpZiAodHhwaC0+cGt0X3NpemUgIT0gdHhzLT5wa3Rfc2l6ZSkgeworCQkJc3RydWN0IHR4X3BrdF9zdGF0dXMgKm9sZF90eHMgPSB0eHM7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIiVzOiB0eHMgcGFja2V0IHNpemUgbm90IGNvbnNpc3RlbnQgd2l0aCB0eGQiCisJCQkJIiB0eGRfOjB4JTA4eCwgdHhzXzoweCUwOHghXG4iLAorCQkJCWFkYXB0ZXItPm5ldGRldi0+bmFtZSwKKwkJCQkqKHUzMiAqKXR4cGgsICoodTMyICopdHhzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkidHhkIHJlYWQgcHRyOiAweCV4XG4iLAorCQkJCXR4ZF9yZWFkX3B0cik7CisJCQl0eHMgPSBhZGFwdGVyLT50eHNfcmluZyArIHR4c193cml0ZV9wdHI7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJInR4cy1iZWhpbmQ6MHglMDh4XG4iLAorCQkJCSoodTMyICopdHhzKTsKKwkJCWlmICh0eHNfd3JpdGVfcHRyIDwgMikgeworCQkJCXR4cyA9IGFkYXB0ZXItPnR4c19yaW5nICsKKwkJCQkJKGFkYXB0ZXItPnR4c19yaW5nX3NpemUgKworCQkJCQl0eHNfd3JpdGVfcHRyIC0gMik7CisJCQl9IGVsc2UgeworCQkJCXR4cyA9IGFkYXB0ZXItPnR4c19yaW5nICsgKHR4c193cml0ZV9wdHIgLSAyKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkidHhzLWJlZm9yZToweCUwOHhcbiIsCisJCQkJKih1MzIgKil0eHMpOworCQkJdHhzID0gb2xkX3R4czsKKwkJfQorCisJCSAvKiA0Zm9yIFRQSCAqLworCQl0eGRfcmVhZF9wdHIgKz0gKCgodTMyKSh0eHBoLT5wa3Rfc2l6ZSkgKyA3KSAmIH4zKTsKKwkJaWYgKHR4ZF9yZWFkX3B0ciA+PSBhZGFwdGVyLT50eGRfcmluZ19zaXplKQorCQkJdHhkX3JlYWRfcHRyIC09IGFkYXB0ZXItPnR4ZF9yaW5nX3NpemU7CisKKwkJYXRvbWljX3NldCgmYWRhcHRlci0+dHhkX3JlYWRfcHRyLCAoaW50KXR4ZF9yZWFkX3B0cik7CisKKwkJLyogdHggc3RhdGlzdGljczogKi8KKwkJaWYgKHR4cy0+b2spIHsKKwkJCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyArPSB0eHMtPnBrdF9zaXplOworCQkJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQllbHNlCisJCQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisKKwkJaWYgKHR4cy0+ZGVmZXIpCisJCQlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucysrOworCQlpZiAodHhzLT5hYm9ydF9jb2wpCisJCQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJaWYgKHR4cy0+bGF0ZV9jb2wpCisJCQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQlpZiAodHhzLT51bmRlcnVuKQorCQkJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoZnJlZV9ob2xlKSB7CisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGFkYXB0ZXItPm5ldGRldikgJiYKKwkJCW5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bDJfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUxNiBwaHlfZGF0YSA9IDA7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCWF0bDJfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMl9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+c3RhdHNfbG9jayk7CisKKwkvKiBub3RpZnkgdXBwZXIgbGF5ZXIgbGluayBkb3duIEFTQVAgKi8KKwlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsgLyogTGluayBEb3duICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsgLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAorCQkJYXRsMl9kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCX0KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bDJfY2xlYXJfcGh5X2ludChzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXUxNiBwaHlfZGF0YTsKKwlzcGluX2xvY2soJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCWF0bDJfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgMTksICZwaHlfZGF0YSk7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnN0YXRzX2xvY2spOworfQorCisvKgorICogYXRsMl9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHB0X3JlZ3M6IENQVSByZWdpc3RlcnMgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhdGwyX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGF0YSk7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfSVNSKTsKKwlpZiAoMCA9PSBzdGF0dXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIGxpbmsgZXZlbnQgKi8KKwlpZiAoc3RhdHVzICYgSVNSX1BIWSkKKwkJYXRsMl9jbGVhcl9waHlfaW50KGFkYXB0ZXIpOworCisJLyogY2xlYXIgSVNSIHN0YXR1cywgYW5kIEVuYWJsZSBDTUIgRE1BL0Rpc2FibGUgSW50ZXJydXB0ICovCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19JU1IsIHN0YXR1cyB8IElTUl9ESVNfSU5UKTsKKworCS8qIGNoZWNrIGlmIFBDSUUgUEhZIExpbmsgZG93biAqLworCWlmIChzdGF0dXMgJiBJU1JfUEhZX0xJTktET1dOKSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsgLyogcmVzZXQgTUFDICovCisJCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX0lTUiwgMCk7CisJCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX0lNUiwgMCk7CisJCQlBVEwyX1dSSVRFX0ZMVVNIKGh3KTsKKwkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnJlc2V0X3Rhc2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCisJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3I/ICovCisJaWYgKHN0YXR1cyAmIChJU1JfRE1BUl9UT19SU1QgfCBJU1JfRE1BV19UT19SU1QpKSB7CisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfSVNSLCAwKTsKKwkJQVRMMl9XUklURV9SRUcoaHcsIFJFR19JTVIsIDApOworCQlBVEwyX1dSSVRFX0ZMVVNIKGh3KTsKKwkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBsaW5rIGV2ZW50ICovCisJaWYgKHN0YXR1cyAmIChJU1JfUEhZIHwgSVNSX01BTlVBTCkpIHsKKwkJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWF0bDJfY2hlY2tfZm9yX2xpbmsoYWRhcHRlcik7CisJfQorCisJLyogdHJhbnNtaXQgZXZlbnQgKi8KKwlpZiAoc3RhdHVzICYgSVNSX1RYX0VWRU5UKQorCQlhdGwyX2ludHJfdHgoYWRhcHRlcik7CisKKwkvKiByeCBleGNlcHRpb24gKi8KKwlpZiAoc3RhdHVzICYgSVNSX1JYX0VWRU5UKQorCQlhdGwyX2ludHJfcngoYWRhcHRlcik7CisKKwkvKiByZS1lbmFibGUgSW50ZXJydXB0ICovCisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfSVNSLCAwKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9yZXF1ZXN0X2lycShzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaW50IGZsYWdzLCBlcnIgPSAwOworCisJZmxhZ3MgPSBJUlFGX1NIQVJFRDsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWFkYXB0ZXItPmhhdmVfbXNpID0gdHJ1ZTsKKwllcnIgPSBwY2lfZW5hYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKKwlpZiAoZXJyKQorCQlhZGFwdGVyLT5oYXZlX21zaSA9IGZhbHNlOworCisJaWYgKGFkYXB0ZXItPmhhdmVfbXNpKQorCQlmbGFncyAmPSB+SVJRRl9TSEFSRUQ7CisjZW5kaWYKKworCXJldHVybiByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZhdGwyX2ludHIsIGZsYWdzLCBuZXRkZXYtPm5hbWUsCisJCW5ldGRldik7Cit9CisKKy8qCisgKiBhdGwyX2ZyZWVfcmluZ19yZXNvdXJjZXMgLSBGcmVlIFR4IC8gUlggZGVzY3JpcHRvciBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBhdGwyX2ZyZWVfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhZGFwdGVyLT5yaW5nX3NpemUsIGFkYXB0ZXItPnJpbmdfdmlyX2FkZHIsCisJCWFkYXB0ZXItPnJpbmdfZG1hKTsKK30KKworLyoKKyAqIGF0bDJfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoKKyAqIFRoZSBvcGVuIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZQorICogYWN0aXZlIGJ5IHRoZSBzeXN0ZW0gKElGRl9VUCkuICBBdCB0aGlzIHBvaW50IGFsbCByZXNvdXJjZXMgbmVlZGVkCisgKiBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkLCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MsIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBzdGFydGVkLAorICogYW5kIHRoZSBzdGFjayBpcyBub3RpZmllZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyBpbnQgYXRsMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVycjsKKwl1MzIgdmFsOworCisJLyogZGlzYWxsb3cgb3BlbiBkdXJpbmcgdGVzdCAqLworCWlmICh0ZXN0X2JpdChfX0FUTDJfVEVTVElORywgJmFkYXB0ZXItPmZsYWdzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJZXJyID0gYXRsMl9zZXR1cF9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYXRsMl9pbml0X2h3KCZhZGFwdGVyLT5odyk7CisJaWYgKGVycikgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9pbml0X2h3OworCX0KKworCS8qIGhhcmR3YXJlIGhhcyBiZWVuIHJlc2V0LCB3ZSBuZWVkIHRvIHJlbG9hZCBzb21lIHRoaW5ncyAqLworCWF0bDJfc2V0X211bHRpKG5ldGRldik7CisJaW5pdF9yaW5nX3B0cnMoYWRhcHRlcik7CisKKyNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKKwlhdGwyX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKKyNlbmRpZgorCisJaWYgKGF0bDJfY29uZmlndXJlKGFkYXB0ZXIpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2NvbmZpZzsKKwl9CisKKwllcnIgPSBhdGwyX3JlcXVlc3RfaXJxKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcV9pcnE7CisKKwljbGVhcl9iaXQoX19BVEwyX0RPV04sICZhZGFwdGVyLT5mbGFncyk7CisKKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgNCpIWik7CisKKwl2YWwgPSBBVEwyX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkVHX01BU1RFUl9DVFJMKTsKKwlBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQVNURVJfQ1RSTCwKKwkJdmFsIHwgTUFTVEVSX0NUUkxfTUFOVUFMX0lOVCk7CisKKwlhdGwyX2lycV9lbmFibGUoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKKworZXJyX2luaXRfaHc6CitlcnJfcmVxX2lycToKK2Vycl9jb25maWc6CisJYXRsMl9mcmVlX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWF0bDJfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDJfZG93bihzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwkvKiBzaWduYWwgdGhhdCB3ZSdyZSBkb3duIHNvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIG5vdAorCSAqIHJlc2NoZWR1bGUgb3VyIHdhdGNoZG9nIHRpbWVyICovCisJc2V0X2JpdChfX0FUTDJfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKTsKKworCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKKworCS8qIHJlc2V0IE1BQyB0byBkaXNhYmxlIGFsbCBSWC9UWCAqLworCWF0bDJfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKwltc2xlZXAoMSk7CisKKwlhdGwyX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lcik7CisJY2xlYXJfYml0KDAsICZhZGFwdGVyLT5jZmdfcGh5KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAtMTsKK30KKworc3RhdGljIHZvaWQgYXRsMl9mcmVlX2lycShzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChhZGFwdGVyLT5oYXZlX21zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworI2VuZGlmCit9CisKKy8qCisgKiBhdGwyX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCwgdGhpcyBpcyBub3QgYWxsb3dlZCB0byBmYWlsCisgKgorICogVGhlIGNsb3NlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGFuIGludGVyZmFjZSBpcyBkZS1hY3RpdmF0ZWQKKyAqIGJ5IHRoZSBPUy4gIFRoZSBoYXJkd2FyZSBpcyBzdGlsbCB1bmRlciB0aGUgZHJpdmVycyBjb250cm9sLCBidXQKKyAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQorICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworc3RhdGljIGludCBhdGwyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlXQVJOX09OKHRlc3RfYml0KF9fQVRMMl9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncykpOworCisJYXRsMl9kb3duKGFkYXB0ZXIpOworCWF0bDJfZnJlZV9pcnEoYWRhcHRlcik7CisJYXRsMl9mcmVlX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFR4c0ZyZWVVbml0KHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHR4c193cml0ZV9wdHIgPSAodTMyKSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhzX3dyaXRlX3B0cik7CisKKwlyZXR1cm4gKGFkYXB0ZXItPnR4c19uZXh0X2NsZWFyID49IHR4c193cml0ZV9wdHIpID8KKwkJKGludCkgKGFkYXB0ZXItPnR4c19yaW5nX3NpemUgLSBhZGFwdGVyLT50eHNfbmV4dF9jbGVhciArCisJCXR4c193cml0ZV9wdHIgLSAxKSA6CisJCShpbnQpICh0eHNfd3JpdGVfcHRyIC0gYWRhcHRlci0+dHhzX25leHRfY2xlYXIgLSAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgVHhkRnJlZUJ5dGVzKHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHR4ZF9yZWFkX3B0ciA9ICh1MzIpYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4ZF9yZWFkX3B0cik7CisKKwlyZXR1cm4gKGFkYXB0ZXItPnR4ZF93cml0ZV9wdHIgPj0gdHhkX3JlYWRfcHRyKSA/CisJCShpbnQpIChhZGFwdGVyLT50eGRfcmluZ19zaXplIC0gYWRhcHRlci0+dHhkX3dyaXRlX3B0ciArCisJCXR4ZF9yZWFkX3B0ciAtIDEpIDoKKwkJKGludCkgKHR4ZF9yZWFkX3B0ciAtIGFkYXB0ZXItPnR4ZF93cml0ZV9wdHIgLSAxKTsKK30KKworc3RhdGljIGludCBhdGwyX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgdHhfcGt0X2hlYWRlciAqdHhwaDsKKwl1MzIgb2Zmc2V0LCBjb3B5X2xlbjsKKwlpbnQgdHhzX3VudXNlZDsKKwlpbnQgdHhidWZfdW51c2VkOworCisJaWYgKHRlc3RfYml0KF9fQVRMMl9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDw9IDApKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJdHhzX3VudXNlZCA9IFR4c0ZyZWVVbml0KGFkYXB0ZXIpOworCXR4YnVmX3VudXNlZCA9IFR4ZEZyZWVCeXRlcyhhZGFwdGVyKTsKKworCWlmIChza2ItPmxlbiArIHNpemVvZihzdHJ1Y3QgdHhfcGt0X2hlYWRlcikgKyA0ICA+IHR4YnVmX3VudXNlZCB8fAorCQl0eHNfdW51c2VkIDwgMSkgeworCQkvKiBub3QgZW5vdWdoIHJlc291cmNlcyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlvZmZzZXQgPSBhZGFwdGVyLT50eGRfd3JpdGVfcHRyOworCisJdHhwaCA9IChzdHJ1Y3QgdHhfcGt0X2hlYWRlciAqKSAoKCh1OCAqKWFkYXB0ZXItPnR4ZF9yaW5nKSArIG9mZnNldCk7CisKKwkqKHUzMiAqKXR4cGggPSAwOworCXR4cGgtPnBrdF9zaXplID0gc2tiLT5sZW47CisKKwlvZmZzZXQgKz0gNDsKKwlpZiAob2Zmc2V0ID49IGFkYXB0ZXItPnR4ZF9yaW5nX3NpemUpCisJCW9mZnNldCAtPSBhZGFwdGVyLT50eGRfcmluZ19zaXplOworCWNvcHlfbGVuID0gYWRhcHRlci0+dHhkX3Jpbmdfc2l6ZSAtIG9mZnNldDsKKwlpZiAoY29weV9sZW4gPj0gc2tiLT5sZW4pIHsKKwkJbWVtY3B5KCgodTggKilhZGFwdGVyLT50eGRfcmluZykgKyBvZmZzZXQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlvZmZzZXQgKz0gKCh1MzIpKHNrYi0+bGVuICsgMykgJiB+Myk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCgodTggKilhZGFwdGVyLT50eGRfcmluZykrb2Zmc2V0LCBza2ItPmRhdGEsIGNvcHlfbGVuKTsKKwkJbWVtY3B5KCh1OCAqKWFkYXB0ZXItPnR4ZF9yaW5nLCBza2ItPmRhdGErY29weV9sZW4sCisJCQlza2ItPmxlbi1jb3B5X2xlbik7CisJCW9mZnNldCA9ICgodTMyKShza2ItPmxlbi1jb3B5X2xlbiArIDMpICYgfjMpOworCX0KKyNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKKwlpZiAoYWRhcHRlci0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCXUxNiB2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl2bGFuX3RhZyA9ICh2bGFuX3RhZyA8PCA0KSB8CisJCQkodmxhbl90YWcgPj4gMTMpIHwKKwkJCSgodmxhbl90YWcgPj4gOSkgJiAweDgpOworCQl0eHBoLT5pbnNfdmxhbiA9IDE7CisJCXR4cGgtPnZsYW4gPSB2bGFuX3RhZzsKKwl9CisjZW5kaWYKKwlpZiAob2Zmc2V0ID49IGFkYXB0ZXItPnR4ZF9yaW5nX3NpemUpCisJCW9mZnNldCAtPSBhZGFwdGVyLT50eGRfcmluZ19zaXplOworCWFkYXB0ZXItPnR4ZF93cml0ZV9wdHIgPSBvZmZzZXQ7CisKKwkvKiBjbGVhciB0eHMgYmVmb3JlIHNlbmQgKi8KKwlhZGFwdGVyLT50eHNfcmluZ1thZGFwdGVyLT50eHNfbmV4dF9jbGVhcl0udXBkYXRlID0gMDsKKwlpZiAoKythZGFwdGVyLT50eHNfbmV4dF9jbGVhciA9PSBhZGFwdGVyLT50eHNfcmluZ19zaXplKQorCQlhZGFwdGVyLT50eHNfbmV4dF9jbGVhciA9IDA7CisKKwlBVEwyX1dSSVRFX1JFR1coJmFkYXB0ZXItPmh3LCBSRUdfTUJfVFhEX1dSX0lEWCwKKwkJKGFkYXB0ZXItPnR4ZF93cml0ZV9wdHIgPj4gMikpOworCisJbW1pb3diKCk7CisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisvKgorICogYXRsMl9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0bDJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7Cit9CisKKy8qCisgKiBhdGwyX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19tdHU6IG5ldyB2YWx1ZSBmb3IgbWF4aW11bSBmcmFtZSBzaXplCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhdGwyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJaWYgKChuZXdfbXR1IDwgNDApIHx8IChuZXdfbXR1ID4gKEVUSF9EQVRBX0xFTiArIFZMQU5fU0laRSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNldCBNVFUgKi8KKwlpZiAoaHctPm1heF9mcmFtZV9zaXplICE9IG5ld19tdHUpIHsKKwkJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX01UVSwgbmV3X210dSArIEVORVRfSEVBREVSX1NJWkUgKworCQkJVkxBTl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkUpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYXRsMl9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhdGwyX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlhdGwyX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhdGwyX21paV9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqLworc3RhdGljIGludCBhdGwyX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSAwOworCQlicmVhazsKKwljYXNlIFNJT0NHTUlJUkVHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCQlpZiAoYXRsMl9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LAorCQkJZGF0YS0+cmVnX251bSAmIDB4MUYsICZkYXRhLT52YWxfb3V0KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZGF0YS0+cmVnX251bSAmIH4oMHgxRikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGF0bDJfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0sCisJCQlkYXRhLT52YWxfaW4pKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhdGwyX2lvY3RsIC0KKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKiBAY21kOgorICovCitzdGF0aWMgaW50IGF0bDJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJcmV0dXJuIGF0bDJfbWlpX2lvY3RsKG5ldGRldiwgaWZyLCBjbWQpOworI2lmZGVmIEVUSFRPT0xfT1BTX0NPTVBBVAorCWNhc2UgU0lPQ0VUSFRPT0w6CisJCXJldHVybiBldGh0b29sX2lvY3RsKGlmcik7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKgorICogYXRsMl90eF90aW1lb3V0IC0gUmVzcG9uZCB0byBhIFR4IEhhbmcKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnJlc2V0X3Rhc2spOworfQorCisvKgorICogYXRsMl93YXRjaGRvZyAtIFRpbWVyIENhbGwtYmFjaworICogQGRhdGE6IHBvaW50ZXIgdG8gbmV0ZGV2IGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCisgKi8KK3N0YXRpYyB2b2lkIGF0bDJfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDJfYWRhcHRlciAqKSBkYXRhOworCXUzMiBkcm9wX3J4ZCwgZHJvcF9yeHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdGVzdF9iaXQoX19BVEwyX0RPV04sICZhZGFwdGVyLT5mbGFncykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKKwkJZHJvcF9yeGQgPSBBVEwyX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkVHX1NUU19SWERfT1YpOworCQlkcm9wX3J4cyA9IEFUTDJfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfU1RTX1JYU19PVik7CisJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSAoZHJvcF9yeGQrZHJvcF9yeHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisKKwkJLyogUmVzZXQgdGhlIHRpbWVyICovCisJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyA0ICogSFopOworCX0KK30KKworLyoKKyAqIGF0bDJfcGh5X2NvbmZpZyAtIFRpbWVyIENhbGwtYmFjaworICogQGRhdGE6IHBvaW50ZXIgdG8gbmV0ZGV2IGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCisgKi8KK3N0YXRpYyB2b2lkIGF0bDJfcGh5X2NvbmZpZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYXRsMl9hZGFwdGVyICopIGRhdGE7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCWF0bDJfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FEVkVSVElTRSwgaHctPm1paV9hdXRvbmVnX2Fkdl9yZWcpOworCWF0bDJfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTiB8CisJCU1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KDAsICZhZGFwdGVyLT5jZmdfcGh5KTsKK30KKworc3RhdGljIGludCBhdGwyX3VwKHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlpbnQgZXJyID0gMDsKKwl1MzIgdmFsOworCisJLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCisKKwllcnIgPSBhdGwyX2luaXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FSU87CisJCXJldHVybiBlcnI7CisJfQorCisJYXRsMl9zZXRfbXVsdGkobmV0ZGV2KTsKKwlpbml0X3JpbmdfcHRycyhhZGFwdGVyKTsKKworI2lmZGVmIE5FVElGX0ZfSFdfVkxBTl9UWAorCWF0bDJfcmVzdG9yZV92bGFuKGFkYXB0ZXIpOworI2VuZGlmCisKKwlpZiAoYXRsMl9jb25maWd1cmUoYWRhcHRlcikpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfdXA7CisJfQorCisJY2xlYXJfYml0KF9fQVRMMl9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpOworCisJdmFsID0gQVRMMl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJFR19NQVNURVJfQ1RSTCk7CisJQVRMMl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfTUFTVEVSX0NUUkwsIHZhbCB8CisJCU1BU1RFUl9DVFJMX01BTlVBTF9JTlQpOworCisJYXRsMl9pcnFfZW5hYmxlKGFkYXB0ZXIpOworCitlcnJfdXA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYXRsMl9yZWluaXRfbG9ja2VkKHN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7CisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19BVEwyX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKSkKKwkJbXNsZWVwKDEpOworCWF0bDJfZG93bihhZGFwdGVyKTsKKwlhdGwyX3VwKGFkYXB0ZXIpOworCWNsZWFyX2JpdChfX0FUTDJfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGwyX3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXI7CisJYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMl9hZGFwdGVyLCByZXNldF90YXNrKTsKKworCWF0bDJfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQgYXRsMl9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgYXRsMl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCS8qIENvbmZpZyBNQUMgQ1RSTCBSZWdpc3RlciAqLworCXZhbHVlID0gTUFDX0NUUkxfVFhfRU4gfCBNQUNfQ1RSTF9SWF9FTiB8IE1BQ19DVFJMX01BQ0xQX0NMS19QSFk7CisKKwkvKiBkdXBsZXggKi8KKwlpZiAoRlVMTF9EVVBMRVggPT0gYWRhcHRlci0+bGlua19kdXBsZXgpCisJCXZhbHVlIHw9IE1BQ19DVFJMX0RVUExYOworCisJLyogZmxvdyBjb250cm9sICovCisJdmFsdWUgfD0gKE1BQ19DVFJMX1RYX0ZMT1cgfCBNQUNfQ1RSTF9SWF9GTE9XKTsKKworCS8qIFBBRCAmIENSQyAqLworCXZhbHVlIHw9IChNQUNfQ1RSTF9BRERfQ1JDIHwgTUFDX0NUUkxfUEFEKTsKKworCS8qIHByZWFtYmxlIGxlbmd0aCAqLworCXZhbHVlIHw9ICgoKHUzMilhZGFwdGVyLT5ody5wcmVhbWJsZV9sZW4gJiBNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwKKwkJTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKworCS8qIHZsYW4gKi8KKwlpZiAoYWRhcHRlci0+dmxncnApCisJCXZhbHVlIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCisJLyogZmlsdGVyIG1vZGUgKi8KKwl2YWx1ZSB8PSBNQUNfQ1RSTF9CQ19FTjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47CisJZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOworCisJLyogaGFsZiByZXRyeSBidWZmZXIgKi8KKwl2YWx1ZSB8PSAoKCh1MzIpKGFkYXB0ZXItPmh3LnJldHJ5X2J1ZiAmCisJCU1BQ19DVFJMX0hBTEZfTEVGVF9CVUZfTUFTSykpIDw8IE1BQ19DVFJMX0hBTEZfTEVGVF9CVUZfU0hJRlQpOworCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfQ1RSTCwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGF0bDJfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwyX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCByZXRfdmFsOworCXUxNiBzcGVlZCwgZHVwbGV4LCBwaHlfZGF0YTsKKwlpbnQgcmVjb25maWcgPSAwOworCisJLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aXNlICovCisJYXRsMl9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCWF0bDJfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlpZiAoIShwaHlfZGF0YSZCTVNSX0xTVEFUVVMpKSB7IC8qIGxpbmsgZG93biAqLworCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7IC8qIG9sZCBsaW5rIHN0YXRlOiBVcCAqLworCQkJdTMyIHZhbHVlOworCQkJLyogZGlzYWJsZSByeCAqLworCQkJdmFsdWUgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfTUFDX0NUUkwpOworCQkJdmFsdWUgJj0gfk1BQ19DVFJMX1JYX0VOOworCQkJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfQ1RSTCwgdmFsdWUpOworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIExpbmsgVXAgKi8KKwlyZXRfdmFsID0gYXRsMl9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisJc3dpdGNoIChody0+TWVkaWFUeXBlKSB7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJaWYgKHNwZWVkICAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQlpZiAoc3BlZWQgICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwTV9IQUxGOgorCQlpZiAoc3BlZWQgICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJfQorCS8qIGxpbmsgcmVzdWx0IGlzIG91ciBzZXR0aW5nICovCisJaWYgKHJlY29uZmlnID09IDApIHsKKwkJaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gc3BlZWQgfHwKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IHNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBkdXBsZXg7CisJCQlhdGwyX3NldHVwX21hY19jdHJsKGFkYXB0ZXIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE5JQyBMaW5rIGlzIFVwPCVkIE1icHMgJXM+XG4iLAorCQkJCWF0bDJfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSwKKwkJCQlhZGFwdGVyLT5saW5rX3NwZWVkLAorCQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KKwkJCQkJIkZ1bGwgRHVwbGV4IiA6ICJIYWxmIER1cGxleCIpOworCQl9CisKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsgLyogTGluayBkb3duIC0+IFVwICovCisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2hhbmdlIG9yaWdpbmFsIGxpbmsgc3RhdHVzICovCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQl1MzIgdmFsdWU7CisJCS8qIGRpc2FibGUgcnggKi8KKwkJdmFsdWUgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfTUFDX0NUUkwpOworCQl2YWx1ZSAmPSB+TUFDX0NUUkxfUlhfRU47CisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfTUFDX0NUUkwsIHZhbHVlKTsKKworCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCS8qIGF1dG8tbmVnLCBpbnNlcnQgdGltZXIgdG8gcmUtY29uZmlnIHBoeQorCSAqIChpZiBpbnRlcnZhbCBzbWFsbGVyIHRoYW4gNSBzZWNvbmRzLCBzb21ldGhpbmcgc3RyYW5nZSkgKi8KKwlpZiAoIXRlc3RfYml0KF9fQVRMMl9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKSB7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmYWRhcHRlci0+Y2ZnX3BoeSkpCisJCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIsIGppZmZpZXMgKyA1ICogSFopOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYXRsMl9saW5rX2NoZ190YXNrIC0gZGVhbCB3aXRoIGxpbmsgY2hhbmdlIGV2ZW50IE91dCBvZiBpbnRlcnJ1cHQgY29udGV4dAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwyX2xpbmtfY2hnX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDJfYWRhcHRlciwgbGlua19jaGdfdGFzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCWF0bDJfY2hlY2tfbGluayhhZGFwdGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDJfc2V0dXBfcGNpY21kKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjbWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisKKwlpZiAoY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKQorCQljbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwlpZiAoY21kICYgUENJX0NPTU1BTkRfSU8pCisJCWNtZCAmPSB+UENJX0NPTU1BTkRfSU87CisJaWYgKDAgPT0gKGNtZCAmIFBDSV9DT01NQU5EX01FTU9SWSkpCisJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CisJaWYgKDAgPT0gKGNtZCAmIFBDSV9DT01NQU5EX01BU1RFUikpCisJCWNtZCB8PSBQQ0lfQ09NTUFORF9NQVNURVI7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCisJLyoKKwkgKiBzb21lIG1vdGhlcmJvYXJkcyBCSU9TKFBYRS9FRkkpIGRyaXZlciBtYXkgc2V0IFBNRQorCSAqIHdoaWxlIHRoZXkgdHJhbnNmZXIgY29udHJvbCB0byBPUyAoV2luZG93cy9MaW51eCkKKwkgKiBzbyB3ZSBzaG91bGQgY2xlYXIgdGhpcyBiaXQgYmVmb3JlIE5JQyB3b3JrIG5vcm1hbGx5CisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBSRUdfUE1fQ1RSTFNUQVQsIDApOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGF0bDJfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJZGlzYWJsZV9pcnEobmV0ZGV2LT5pcnEpOworCWF0bDJfaW50cihuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKwllbmFibGVfaXJxKG5ldGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisvKgorICogYXRsMl9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqIEBlbnQ6IGVudHJ5IGluIGF0bDJfcGNpX3RibAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKgorICogYXRsMl9wcm9iZSBpbml0aWFsaXplcyBhbiBhZGFwdGVyIGlkZW50aWZpZWQgYnkgYSBwY2lfZGV2IHN0cnVjdHVyZS4KKyAqIFRoZSBPUyBpbml0aWFsaXphdGlvbiwgY29uZmlndXJpbmcgb2YgdGhlIGFkYXB0ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUsCisgKiBhbmQgYSBoYXJkd2FyZSByZXNldCBvY2N1ci4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgYXRsMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcjsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydDsKKwlpbnQgbW1pb19sZW47CisJaW50IGVycjsKKworCWNhcmRzX2ZvdW5kID0gMDsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIGF0bDIgaXMgYSBzaGFyZWQtaGlnaC0zMi1iaXQgZGV2aWNlLCBzbyB3ZSdyZSBzdHVjayB3aXRoIDMyLWJpdCBETUEKKwkgKiB1bnRpbCB0aGUga2VybmVsIGhhcyB0aGUgcHJvcGVyIGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgNjQtYml0IERNQQorCSAqIG9uIHRoZXNlIGRldmljZXMuCisJICovCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spICYmCisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdGwyOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJfZG1hOworCX0KKworCS8qIE1hcmsgYWxsIFBDSSByZWdpb25zIGFzc29jaWF0ZWQgd2l0aCBQQ0kgZGV2aWNlCisJICogcGRldiBhcyBiZWluZyByZXNlcnZlZCBieSBvd25lciBhdGwyX2RyaXZlcl9uYW1lICovCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBhdGwyX2RyaXZlcl9uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wY2lfcmVnOworCisJLyogRW5hYmxlcyBidXMtbWFzdGVyaW5nIG9uIHRoZSBkZXZpY2UgYW5kIGNhbGxzCisJICogcGNpYmlvc19zZXRfbWFzdGVyIHRvIGRvIHRoZSBuZWVkZWQgYXJjaCBzcGVjaWZpYyBzZXR0aW5ncyAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyID0gLUVOT01FTTsKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF0bDJfYWRhcHRlcikpOworCWlmICghbmV0ZGV2KQorCQlnb3RvIGVycl9hbGxvY19ldGhlcmRldjsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+aHcuYmFjayA9IGFkYXB0ZXI7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDB4MCk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDB4MCk7CisKKwlhZGFwdGVyLT5ody5tZW1fcmFuZyA9ICh1MzIpbW1pb19sZW47CisJYWRhcHRlci0+aHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmICghYWRhcHRlci0+aHcuaHdfYWRkcikgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCWF0bDJfc2V0dXBfcGNpY21kKHBkZXYpOworCisJbmV0ZGV2LT5vcGVuID0gJmF0bDJfb3BlbjsKKwluZXRkZXYtPnN0b3AgPSAmYXRsMl9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhdGwyX3htaXRfZnJhbWU7CisJbmV0ZGV2LT5nZXRfc3RhdHMgPSAmYXRsMl9nZXRfc3RhdHM7CisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYXRsMl9zZXRfbXVsdGk7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYXRsMl9zZXRfbWFjOworCW5ldGRldi0+Y2hhbmdlX210dSA9ICZhdGwyX2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5kb19pb2N0bCA9ICZhdGwyX2lvY3RsOworCWF0bDJfc2V0X2V0aHRvb2xfb3BzKG5ldGRldik7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCW5ldGRldi0+cG9sbF9jb250cm9sbGVyID0gYXRsMl9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKwluZXRkZXYtPnR4X3RpbWVvdXQgPSAmYXRsMl90eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisjZW5kaWYKKyNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBhdGwyX3ZsYW5fcnhfcmVnaXN0ZXI7CisjZW5kaWYKKwlzdHJuY3B5KG5ldGRldi0+bmFtZSwgcGNpX25hbWUocGRldiksIHNpemVvZihuZXRkZXYtPm5hbWUpIC0gMSk7CisKKwluZXRkZXYtPm1lbV9zdGFydCA9IG1taW9fc3RhcnQ7CisJbmV0ZGV2LT5tZW1fZW5kID0gbW1pb19zdGFydCArIG1taW9fbGVuOworCWFkYXB0ZXItPmJkX251bWJlciA9IGNhcmRzX2ZvdW5kOworCWFkYXB0ZXItPnBjaV91c2luZ182NCA9IGZhbHNlOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisJZXJyID0gYXRsMl9zd19pbml0KGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3N3X2luaXQ7CisKKwllcnIgPSAtRUlPOworCisjaWZkZWYgTkVUSUZfRl9IV19WTEFOX1RYCisJbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYKTsKKyNlbmRpZgorCisJLyogSW5pdCBQSFkgYXMgZWFybHkgYXMgcG9zc2libGUgZHVlIHRvIHBvd2VyIHNhdmluZyBpc3N1ZSAgKi8KKwlhdGwyX3BoeV9pbml0KCZhZGFwdGVyLT5odyk7CisKKwkvKiByZXNldCB0aGUgY29udHJvbGxlciB0bworCSAqIHB1dCB0aGUgZGV2aWNlIGluIGEga25vd24gZ29vZCBzdGFydGluZyBzdGF0ZSAqLworCisJaWYgKGF0bDJfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9yZXNldDsKKwl9CisKKwkvKiBjb3B5IHRoZSBNQUMgYWRkcmVzcyBvdXQgb2YgdGhlIEVFUFJPTSAqLworCWF0bDJfcmVhZF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5ody5tYWNfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisvKiBGSVhNRTogZG8gd2Ugc3RpbGwgbmVlZCB0aGlzPyAqLworI2lmZGVmIEVUSFRPT0xfR1BFUk1BRERSCisJbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBhZGFwdGVyLT5ody5tYWNfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0ZGV2LT5wZXJtX2FkZHIpKSB7CisjZWxzZQorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgeworI2VuZGlmCisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2VlcHJvbTsKKwl9CisKKwlhdGwyX2NoZWNrX29wdGlvbnMoYWRhcHRlcik7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmYXRsMl93YXRjaGRvZzsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXI7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyKTsKKwlhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLmZ1bmN0aW9uID0gJmF0bDJfcGh5X2NvbmZpZzsKKwlhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKKworCUlOSVRfV09SSygmYWRhcHRlci0+cmVzZXRfdGFzaywgYXRsMl9yZXNldF90YXNrKTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPmxpbmtfY2hnX3Rhc2ssIGF0bDJfbGlua19jaGdfdGFzayk7CisKKwlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsgLyogPz8gKi8KKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCS8qIGFzc3VtZSB3ZSBoYXZlIG5vIGxpbmsgZm9yIG5vdyAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJY2FyZHNfZm91bmQrKzsKKworCXJldHVybiAwOworCitlcnJfcmVzZXQ6CitlcnJfcmVnaXN0ZXI6CitlcnJfc3dfaW5pdDoKK2Vycl9lZXByb206CisJaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKK2Vycl9pb3JlbWFwOgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9wY2lfcmVnOgorZXJyX2RtYToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGF0bDJfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICogYXRsMl9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLiAgVGhlIGNvdWxkIGJlIGNhdXNlZCBieSBhCisgKiBIb3QtUGx1ZyBldmVudCwgb3IgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZnJvbQorICogbWVtb3J5LgorICovCisvKiBGSVhNRTogd3JpdGUgdGhlIG9yaWdpbmFsIE1BQyBhZGRyZXNzIGJhY2sgaW4gY2FzZSBpdCB3YXMgY2hhbmdlZCBmcm9tIGEKKyAqIEJJT1Mtc2V0IHZhbHVlLCBhcyBpbiBhdGwxIC0tIENIUyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGF0bDJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBmbHVzaF9zY2hlZHVsZWQgd29yayBtYXkgcmVzY2hlZHVsZSBvdXIgd2F0Y2hkb2cgdGFzaywgc28KKwkgKiBleHBsaWNpdGx5IGRpc2FibGUgd2F0Y2hkb2cgdGFza3MgZnJvbSBiZWluZyByZXNjaGVkdWxlZCAgKi8KKwlzZXRfYml0KF9fQVRMMl9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpOworCisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+cGh5X2NvbmZpZ190aW1lcik7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKworCWF0bDJfZm9yY2VfcHMoJmFkYXB0ZXItPmh3KTsKKworCWlvdW5tYXAoYWRhcHRlci0+aHcuaHdfYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTE2IHNwZWVkLCBkdXBsZXg7CisJdTMyIGN0cmwgPSAwOworCXUzMiB3dWZjID0gYWRhcHRlci0+d29sOworCisjaWZkZWYgQ09ORklHX1BNCisJaW50IHJldHZhbCA9IDA7CisjZW5kaWYKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJV0FSTl9PTih0ZXN0X2JpdChfX0FUTDJfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKTsKKwkJYXRsMl9kb3duKGFkYXB0ZXIpOworCX0KKworI2lmZGVmIENPTkZJR19QTQorCXJldHZhbCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisjZW5kaWYKKworCWF0bDJfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgKHUxNiAqKSZjdHJsKTsKKwlhdGwyX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICh1MTYgKikmY3RybCk7CisJaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCisJCXd1ZmMgJj0gfkFUTFhfV1VGQ19MTktDOworCisJaWYgKDAgIT0gKGN0cmwgJiBCTVNSX0xTVEFUVVMpICYmIDAgIT0gd3VmYykgeworCQl1MzIgcmV0X3ZhbDsKKwkJLyogZ2V0IGN1cnJlbnQgbGluayBzcGVlZCAmIGR1cGxleCAqLworCQlyZXRfdmFsID0gYXRsMl9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwkJaWYgKHJldF92YWwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiBnZXQgc3BlZWQmZHVwbGV4IGVycm9yIHdoaWxlIHN1c3BlbmRcbiIsCisJCQkJYXRsMl9kcml2ZXJfbmFtZSk7CisJCQlnb3RvIHdvbF9kaXM7CisJCX0KKworCQljdHJsID0gMDsKKworCQkvKiB0dXJuIG9uIG1hZ2ljIHBhY2tldCB3b2wgKi8KKwkJaWYgKHd1ZmMgJiBBVExYX1dVRkNfTUFHKQorCQkJY3RybCB8PSAoV09MX01BR0lDX0VOIHwgV09MX01BR0lDX1BNRV9FTik7CisKKwkJLyogaWdub3JlIExpbmsgQ2hnIGV2ZW50IHdoZW4gTGluayBpcyB1cCAqLworCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1dPTF9DVFJMLCBjdHJsKTsKKworCQkvKiBDb25maWcgTUFDIENUUkwgUmVnaXN0ZXIgKi8KKwkJY3RybCA9IE1BQ19DVFJMX1JYX0VOIHwgTUFDX0NUUkxfTUFDTFBfQ0xLX1BIWTsKKwkJaWYgKEZVTExfRFVQTEVYID09IGFkYXB0ZXItPmxpbmtfZHVwbGV4KQorCQkJY3RybCB8PSBNQUNfQ1RSTF9EVVBMWDsKKwkJY3RybCB8PSAoTUFDX0NUUkxfQUREX0NSQyB8IE1BQ19DVFJMX1BBRCk7CisJCWN0cmwgfD0gKCgodTMyKWFkYXB0ZXItPmh3LnByZWFtYmxlX2xlbiAmCisJCQlNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKwkJY3RybCB8PSAoKCh1MzIpKGFkYXB0ZXItPmh3LnJldHJ5X2J1ZiAmCisJCQlNQUNfQ1RSTF9IQUxGX0xFRlRfQlVGX01BU0spKSA8PAorCQkJTUFDX0NUUkxfSEFMRl9MRUZUX0JVRl9TSElGVCk7CisJCWlmICh3dWZjICYgQVRMWF9XVUZDX01BRykgeworCQkJLyogbWFnaWMgcGFja2V0IG1heWJlIEJyb2FkY2FzdCZtdWx0aWNhc3QmVW5pY2FzdCAqLworCQkJY3RybCB8PSBNQUNfQ1RSTF9CQ19FTjsKKwkJfQorCisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfTUFDX0NUUkwsIGN0cmwpOworCisJCS8qIHBjaWUgcGF0Y2ggKi8KKwkJY3RybCA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19QQ0lFX1BIWU1JU0MpOworCQljdHJsIHw9IFBDSUVfUEhZTUlTQ19GT1JDRV9SQ1ZfREVUOworCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1BDSUVfUEhZTUlTQywgY3RybCk7CisJCWN0cmwgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfUENJRV9ETExfVFhfQ1RSTDEpOworCQljdHJsIHw9IFBDSUVfRExMX1RYX0NUUkwxX1NFTF9OT1JfQ0xLOworCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1BDSUVfRExMX1RYX0NUUkwxLCBjdHJsKTsKKworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDEpOworCQlnb3RvIHN1c3BlbmRfZXhpdDsKKwl9CisKKwlpZiAoMCA9PSAoY3RybCZCTVNSX0xTVEFUVVMpICYmIDAgIT0gKHd1ZmMmQVRMWF9XVUZDX0xOS0MpKSB7CisJCS8qIGxpbmsgaXMgZG93biwgc28gb25seSBMSU5LIENIRyBXT0wgZXZlbnQgZW5hYmxlICovCisJCWN0cmwgfD0gKFdPTF9MSU5LX0NIR19FTiB8IFdPTF9MSU5LX0NIR19QTUVfRU4pOworCQlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1dPTF9DVFJMLCBjdHJsKTsKKwkJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQUNfQ1RSTCwgMCk7CisKKwkJLyogcGNpZSBwYXRjaCAqLworCQljdHJsID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1BDSUVfUEhZTUlTQyk7CisJCWN0cmwgfD0gUENJRV9QSFlNSVNDX0ZPUkNFX1JDVl9ERVQ7CisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDLCBjdHJsKTsKKwkJY3RybCA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19QQ0lFX0RMTF9UWF9DVFJMMSk7CisJCWN0cmwgfD0gUENJRV9ETExfVFhfQ1RSTDFfU0VMX05PUl9DTEs7CisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9ETExfVFhfQ1RSTDEsIGN0cmwpOworCisJCWh3LT5waHlfY29uZmlndXJlZCA9IGZhbHNlOyAvKiByZS1pbml0IFBIWSB3aGVuIHJlc3VtZSAqLworCisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgMSk7CisKKwkJZ290byBzdXNwZW5kX2V4aXQ7CisJfQorCit3b2xfZGlzOgorCS8qIFdPTCBkaXNhYmxlZCAqLworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfV09MX0NUUkwsIDApOworCisJLyogcGNpZSBwYXRjaCAqLworCWN0cmwgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDKTsKKwljdHJsIHw9IFBDSUVfUEhZTUlTQ19GT1JDRV9SQ1ZfREVUOworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9QSFlNSVNDLCBjdHJsKTsKKwljdHJsID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1BDSUVfRExMX1RYX0NUUkwxKTsKKwljdHJsIHw9IFBDSUVfRExMX1RYX0NUUkwxX1NFTF9OT1JfQ0xLOworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfUENJRV9ETExfVFhfQ1RSTDEsIGN0cmwpOworCisJYXRsMl9mb3JjZV9wcyhodyk7CisJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7IC8qIHJlLWluaXQgUEhZIHdoZW4gcmVzdW1lICovCisKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDApOworCitzdXNwZW5kX2V4aXQ6CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMl9mcmVlX2lycShhZGFwdGVyKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXRsMl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgZXJyOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJhdGwyOiBDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UgZnJvbSBzdXNwZW5kXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCUFUTDJfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSRUdfV09MX0NUUkwpOyAvKiBjbGVhciBXT0wgc3RhdHVzICovCisKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisKKwlBVEwyX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJFR19XT0xfQ1RSTCwgMCk7CisKKwllcnIgPSBhdGwyX3JlcXVlc3RfaXJxKGFkYXB0ZXIpOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikgJiYgZXJyKQorCQlyZXR1cm4gZXJyOworCisJYXRsMl9yZXNldF9odygmYWRhcHRlci0+aHcpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMl91cChhZGFwdGVyKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGF0bDJfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJYXRsMl9zdXNwZW5kKHBkZXYsIFBNU0dfU1VTUEVORCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdGwyX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSBhdGwyX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZSA9IGF0bDJfcGNpX3RibCwKKwkucHJvYmUgICAgPSBhdGwyX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGF0bDJfcmVtb3ZlKSwKKwkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KKwkuc3VzcGVuZCAgPSBhdGwyX3N1c3BlbmQsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSAgID0gYXRsMl9yZXN1bWUsCisjZW5kaWYKKwkuc2h1dGRvd24gPSBhdGwyX3NodXRkb3duLAorfTsKKworLyoKKyAqIGF0bDJfaW5pdF9tb2R1bGUgLSBEcml2ZXIgUmVnaXN0cmF0aW9uIFJvdXRpbmUKKyAqCisgKiBhdGwyX2luaXRfbW9kdWxlIGlzIHRoZSBmaXJzdCByb3V0aW5lIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMKKyAqIGxvYWRlZC4gQWxsIGl0IGRvZXMgaXMgcmVnaXN0ZXIgd2l0aCB0aGUgUENJIHN1YnN5c3RlbS4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXRsMl9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIC0gdmVyc2lvbiAlc1xuIiwgYXRsMl9kcml2ZXJfc3RyaW5nLAorCQlhdGwyX2RyaXZlcl92ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYXRsMl9jb3B5cmlnaHQpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdGwyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdGwyX2luaXRfbW9kdWxlKTsKKworLyoKKyAqIGF0bDJfZXhpdF9tb2R1bGUgLSBEcml2ZXIgRXhpdCBDbGVhbnVwIFJvdXRpbmUKKyAqCisgKiBhdGwyX2V4aXRfbW9kdWxlIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqIGZyb20gbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRsMl9leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXRsMl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXRsMl9leGl0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIGF0bDJfcmVhZF9wY2lfY2ZnKHN0cnVjdCBhdGwyX2h3ICpodywgdTMyIHJlZywgdTE2ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgcmVnLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDJfd3JpdGVfcGNpX2NmZyhzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiByZWcsIHUxNiAqdmFsdWUpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCByZWcsICp2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQlTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCVNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJU1VQUE9SVEVEX1RQKTsKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFA7CisKKwllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZDsKKworCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCWVjbWQtPnBoeV9hZGRyZXNzID0gMDsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlpZiAoYWRhcHRlci0+bGlua19zcGVlZCAhPSBTUEVFRF8wKSB7CisJCWVjbWQtPnNwZWVkID0gYWRhcHRlci0+bGlua19zcGVlZDsKKwkJaWYgKGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYKQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UKKwkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCX0gZWxzZSB7CisJCWVjbWQtPnNwZWVkID0gLTE7CisJCWVjbWQtPmR1cGxleCA9IC0xOworCX0KKworCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGwyX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0FUTDJfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQltc2xlZXAoMSk7CisKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworI2RlZmluZSBNWV9BRFZfTUFTSwkoQURWRVJUSVNFXzEwX0hBTEYgfCBcCisJCQkgQURWRVJUSVNFXzEwX0ZVTEwgfCBcCisJCQkgQURWRVJUSVNFXzEwMF9IQUxGfCBcCisJCQkgQURWRVJUSVNFXzEwMF9GVUxMKQorCisJCWlmICgoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBNWV9BRFZfTUFTSykgPT0gTVlfQURWX01BU0spIHsKKwkJCWh3LT5NZWRpYVR5cGUgPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SOworCQkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9ICBNWV9BRFZfTUFTSzsKKwkJfSBlbHNlIGlmICgoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBNWV9BRFZfTUFTSykgPT0KKwkJCQlBRFZFUlRJU0VfMTAwX0ZVTEwpIHsKKwkJCWh3LT5NZWRpYVR5cGUgPSBNRURJQV9UWVBFXzEwME1fRlVMTDsKKwkJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTAwX0ZVTEw7CisJCX0gZWxzZSBpZiAoKGVjbWQtPmFkdmVydGlzaW5nICYgTVlfQURWX01BU0spID09CisJCQkJQURWRVJUSVNFXzEwMF9IQUxGKSB7CisJCQlody0+TWVkaWFUeXBlID0gTUVESUFfVFlQRV8xMDBNX0hBTEY7CisJCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMF9IQUxGOworCQl9IGVsc2UgaWYgKChlY21kLT5hZHZlcnRpc2luZyAmIE1ZX0FEVl9NQVNLKSA9PQorCQkJCUFEVkVSVElTRV8xMF9GVUxMKSB7CisJCQlody0+TWVkaWFUeXBlID0gTUVESUFfVFlQRV8xME1fRlVMTDsKKwkJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTBfRlVMTDsKKwkJfSAgZWxzZSBpZiAoKGVjbWQtPmFkdmVydGlzaW5nICYgTVlfQURWX01BU0spID09CisJCQkJQURWRVJUSVNFXzEwX0hBTEYpIHsKKwkJCWh3LT5NZWRpYVR5cGUgPSBNRURJQV9UWVBFXzEwTV9IQUxGOworCQkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMF9IQUxGOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KF9fQVRMMl9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllY21kLT5hZHZlcnRpc2luZyA9IGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgfAorCQkJQURWRVJUSVNFRF9UUCB8IEFEVkVSVElTRURfQXV0b25lZzsKKwl9IGVsc2UgeworCQljbGVhcl9iaXQoX19BVEwyX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVzZXQgdGhlIGxpbmsgKi8KKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCWF0bDJfZG93bihhZGFwdGVyKTsKKwkJYXRsMl91cChhZGFwdGVyKTsKKwl9IGVsc2UKKwkJYXRsMl9yZXNldF9odygmYWRhcHRlci0+aHcpOworCisJY2xlYXJfYml0KF9fQVRMMl9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYXRsMl9nZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkgIT0gMDsKK30KKworc3RhdGljIHUzMiBhdGwyX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiAwOworfQorCisvKgorICogSXQncyBzYW5lIGZvciB0aGlzIHRvIGJlIGVtcHR5LCBidXQgd2UgbWlnaHQgd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgorICovCitzdGF0aWMgdm9pZCBhdGwyX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3sKK30KKworc3RhdGljIGludCBhdGwyX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworI2RlZmluZSBBVEwyX1JFR1NfTEVOIDQyCisJcmV0dXJuIHNpemVvZih1MzIpICogQVRMMl9SRUdTX0xFTjsKK30KKworc3RhdGljIHZvaWQgYXRsMl9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiAqcmVnc19idWZmID0gcDsKKwl1MTYgcGh5X2RhdGE7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKHUzMikgKiBBVEwyX1JFR1NfTEVOKTsKKworCXJlZ3MtPnZlcnNpb24gPSAoMSA8PCAyNCkgfCAoaHctPnJldmlzaW9uX2lkIDw8IDE2KSB8IGh3LT5kZXZpY2VfaWQ7CisKKwlyZWdzX2J1ZmZbMF0gID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1ZQRF9DQVApOworCXJlZ3NfYnVmZlsxXSAgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfU1BJX0ZMQVNIX0NUUkwpOworCXJlZ3NfYnVmZlsyXSAgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfU1BJX0ZMQVNIX0NPTkZJRyk7CisJcmVnc19idWZmWzNdICA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19UV1NJX0NUUkwpOworCXJlZ3NfYnVmZls0XSAgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfUENJRV9ERVZfTUlTQ19DVFJMKTsKKwlyZWdzX2J1ZmZbNV0gID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BU1RFUl9DVFJMKTsKKwlyZWdzX2J1ZmZbNl0gID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BTlVBTF9USU1FUl9JTklUKTsKKwlyZWdzX2J1ZmZbN10gID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX0lSUV9NT0RVX1RJTUVSX0lOSVQpOworCXJlZ3NfYnVmZls4XSAgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfUEhZX0VOQUJMRSk7CisJcmVnc19idWZmWzldICA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19DTUJESVNETUFfVElNRVIpOworCXJlZ3NfYnVmZlsxMF0gPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfSURMRV9TVEFUVVMpOworCXJlZ3NfYnVmZlsxMV0gPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfTURJT19DVFJMKTsKKwlyZWdzX2J1ZmZbMTJdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1NFUkRFU19MT0NLKTsKKwlyZWdzX2J1ZmZbMTNdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BQ19DVFJMKTsKKwlyZWdzX2J1ZmZbMTRdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BQ19JUEdfSUZHKTsKKwlyZWdzX2J1ZmZbMTVdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BQ19TVEFfQUREUik7CisJcmVnc19idWZmWzE2XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NQUNfU1RBX0FERFIrNCk7CisJcmVnc19idWZmWzE3XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19SWF9IQVNIX1RBQkxFKTsKKwlyZWdzX2J1ZmZbMThdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1JYX0hBU0hfVEFCTEUrNCk7CisJcmVnc19idWZmWzE5XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NQUNfSEFMRl9EVVBMWF9DVFJMKTsKKwlyZWdzX2J1ZmZbMjBdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01UVSk7CisJcmVnc19idWZmWzIxXSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19XT0xfQ1RSTCk7CisJcmVnc19idWZmWzIyXSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19TUkFNX1RYUkFNX0VORCk7CisJcmVnc19idWZmWzIzXSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19ERVNDX0JBU0VfQUREUl9ISSk7CisJcmVnc19idWZmWzI0XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19UWERfQkFTRV9BRERSX0xPKTsKKwlyZWdzX2J1ZmZbMjVdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1RYRF9NRU1fU0laRSk7CisJcmVnc19idWZmWzI2XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19UWFNfQkFTRV9BRERSX0xPKTsKKwlyZWdzX2J1ZmZbMjddID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1RYU19NRU1fU0laRSk7CisJcmVnc19idWZmWzI4XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19SWERfQkFTRV9BRERSX0xPKTsKKwlyZWdzX2J1ZmZbMjldID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1JYRF9CVUZfTlVNKTsKKwlyZWdzX2J1ZmZbMzBdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX0RNQVIpOworCXJlZ3NfYnVmZlszMV0gPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfVFhfQ1VUX1RIUkVTSCk7CisJcmVnc19idWZmWzMyXSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19ETUFXKTsKKwlyZWdzX2J1ZmZbMzNdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1BBVVNFX09OX1RIKTsKKwlyZWdzX2J1ZmZbMzRdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1BBVVNFX09GRl9USCk7CisJcmVnc19idWZmWzM1XSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NQl9UWERfV1JfSURYKTsKKwlyZWdzX2J1ZmZbMzZdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01CX1JYRF9SRF9JRFgpOworCXJlZ3NfYnVmZlszOF0gPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfSVNSKTsKKwlyZWdzX2J1ZmZbMzldID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX0lNUik7CisKKwlhdGwyX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNQ1IsICZwaHlfZGF0YSk7CisJcmVnc19idWZmWzQwXSA9ICh1MzIpcGh5X2RhdGE7CisJYXRsMl9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCXJlZ3NfYnVmZls0MV0gPSAodTMyKXBoeV9kYXRhOworfQorCitzdGF0aWMgaW50IGF0bDJfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICghYXRsMl9jaGVja19lZXByb21fZXhpc3QoJmFkYXB0ZXItPmh3KSkKKwkJcmV0dXJuIDUxMjsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bDJfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDJfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiAqZWVwcm9tX2J1ZmY7CisJaW50IGZpcnN0X2R3b3JkLCBsYXN0X2R3b3JkOworCWludCByZXRfdmFsID0gMDsKKwlpbnQgaTsKKworCWlmIChlZXByb20tPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhdGwyX2NoZWNrX2VlcHJvbV9leGlzdChodykpCisJCXJldHVybiAtRUlOVkFMOworCisJZWVwcm9tLT5tYWdpYyA9IGh3LT52ZW5kb3JfaWQgfCAoaHctPmRldmljZV9pZCA8PCAxNik7CisKKwlmaXJzdF9kd29yZCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDI7CisJbGFzdF9kd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMjsKKworCWVlcHJvbV9idWZmID0ga21hbGxvYyhzaXplb2YodTMyKSAqIChsYXN0X2R3b3JkIC0gZmlyc3RfZHdvcmQgKyAxKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFlZXByb21fYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSBmaXJzdF9kd29yZDsgaSA8IGxhc3RfZHdvcmQ7IGkrKykgeworCQlpZiAoIWF0bDJfcmVhZF9lZXByb20oaHcsIGkqNCwgJihlZXByb21fYnVmZltpLWZpcnN0X2R3b3JkXSkpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtY3B5KGJ5dGVzLCAodTggKillZXByb21fYnVmZiArIChlZXByb20tPm9mZnNldCAmIDMpLAorCQllZXByb20tPmxlbik7CisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpieXRlcykKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyICplZXByb21fYnVmZjsKKwl1MzIgKnB0cjsKKwlpbnQgbWF4X2xlbiwgZmlyc3RfZHdvcmQsIGxhc3RfZHdvcmQsIHJldF92YWwgPSAwOworCWludCBpOworCisJaWYgKGVlcHJvbS0+bGVuID09IDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChlZXByb20tPm1hZ2ljICE9IChody0+dmVuZG9yX2lkIHwgKGh3LT5kZXZpY2VfaWQgPDwgMTYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltYXhfbGVuID0gNTEyOworCisJZmlyc3RfZHdvcmQgPSBlZXByb20tPm9mZnNldCA+PiAyOworCWxhc3RfZHdvcmQgPSAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiAtIDEpID4+IDI7CisJZWVwcm9tX2J1ZmYgPSBrbWFsbG9jKG1heF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghZWVwcm9tX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHRyID0gKHUzMiAqKWVlcHJvbV9idWZmOworCisJaWYgKGVlcHJvbS0+b2Zmc2V0ICYgMykgeworCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGZpcnN0IGNoYW5nZWQgRUVQUk9NIHdvcmQgKi8KKwkJLyogb25seSB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHdvcmQgaXMgYmVpbmcgbW9kaWZpZWQgKi8KKwkJaWYgKCFhdGwyX3JlYWRfZWVwcm9tKGh3LCBmaXJzdF9kd29yZCo0LCAmKGVlcHJvbV9idWZmWzBdKSkpCisJCQlyZXR1cm4gLUVJTzsKKwkJcHRyKys7CisJfQorCWlmICgoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pICYgMykpIHsKKwkJLyoKKwkJICogbmVlZCByZWFkL21vZGlmeS93cml0ZSBvZiBsYXN0IGNoYW5nZWQgRUVQUk9NIHdvcmQKKwkJICogb25seSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgd29yZCBpcyBiZWluZyBtb2RpZmllZAorCQkgKi8KKwkJaWYgKCFhdGwyX3JlYWRfZWVwcm9tKGh3LCBsYXN0X2R3b3JkICogNCwKKwkJCSYoZWVwcm9tX2J1ZmZbbGFzdF9kd29yZCAtIGZpcnN0X2R3b3JkXSkpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRGV2aWNlJ3MgZWVwcm9tIGlzIGFsd2F5cyBsaXR0bGUtZW5kaWFuLCB3b3JkIGFkZHJlc3NhYmxlICovCisJbWVtY3B5KHB0ciwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsYXN0X2R3b3JkIC0gZmlyc3RfZHdvcmQgKyAxOyBpKyspIHsKKwkJaWYgKCFhdGwyX3dyaXRlX2VlcHJvbShodywgKChmaXJzdF9kd29yZCtpKSo0KSwgZWVwcm9tX2J1ZmZbaV0pKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZCBhdGwyX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCAgYXRsMl9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgYXRsMl9kcml2ZXJfdmVyc2lvbiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIkwyIiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLCAzMik7CisJZHJ2aW5mby0+bl9zdGF0cyA9IDA7CisJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKKwlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IGF0bDJfZ2V0X3JlZ3NfbGVuKG5ldGRldik7CisJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IGF0bDJfZ2V0X2VlcHJvbV9sZW4obmV0ZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXRsMl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDOworCXdvbC0+d29sb3B0cyA9IDA7CisKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMWF9XVUZDX0VYKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9VQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMWF9XVUZDX01DKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMWF9XVUZDX0JDKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMWF9XVUZDX01BRykKKwkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJaWYgKGFkYXB0ZXItPndvbCAmIEFUTFhfV1VGQ19MTktDKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9QSFk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgYXRsMl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICh3b2wtPndvbG9wdHMgJiAoV0FLRV9BUlAgfCBXQUtFX01BR0lDU0VDVVJFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHdvbC0+d29sb3B0cyAmIChXQUtFX01DQVNUfFdBS0VfQkNBU1R8V0FLRV9NQ0FTVCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIHRoZXNlIHNldHRpbmdzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIHdoYXQgd2UgY3VycmVudGx5IGhhdmUgKi8KKwlhZGFwdGVyLT53b2wgPSAwOworCisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCWFkYXB0ZXItPndvbCB8PSBBVExYX1dVRkNfTUFHOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJYWRhcHRlci0+d29sIHw9IEFUTFhfV1VGQ19MTktDOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRsMl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMl9yZWluaXRfbG9ja2VkKGFkYXB0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF0bDJfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBhdGwyX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGF0bDJfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBhdGwyX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gYXRsMl9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IGF0bDJfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gYXRsMl9nZXRfd29sLAorCS5zZXRfd29sCQk9IGF0bDJfc2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCQk9IGF0bDJfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gYXRsMl9zZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQJCT0gYXRsMl9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBhdGwyX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGF0bDJfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbQkJPSBhdGwyX3NldF9lZXByb20sCisJLmdldF90eF9jc3VtCQk9IGF0bDJfZ2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCisjaWZkZWYgTkVUSUZfRl9UU08KKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisjZW5kaWYKK307CisKK3N0YXRpYyB2b2lkIGF0bDJfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmF0bDJfZXRodG9vbF9vcHMpOworfQorCisjZGVmaW5lIExCWVRFU1dBUChhKSAgKCgoKGEpICYgMHgwMGZmMDBmZikgPDwgOCkgfCBcCisJKCgoYSkgJiAweGZmMDBmZjAwKSA+PiA4KSkKKyNkZWZpbmUgTE9OR1NXQVAoYSkgICAoKExCWVRFU1dBUChhKSA8PCAxNikgfCAoTEJZVEVTV0FQKGEpID4+IDE2KSkKKyNkZWZpbmUgU0hPUlRTV0FQKGEpICAoKChhKSA8PCA4KSB8ICgoYSkgPj4gOCkpCisKKy8qCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiByZXR1cm4gOiAwICBvciAgaWRsZSBzdGF0dXMgKGlmIGVycm9yKQorICovCitzdGF0aWMgczMyIGF0bDJfcmVzZXRfaHcoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXUzMiBpY3I7CisJdTE2IHBjaV9jZmdfY21kX3dvcmQ7CisJaW50IGk7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBQQ0kgcHJvYmxlbSB3aGVuIEJJT1Mgc2V0cyBNTVJCQyBpbmNvcnJlY3RseS4gKi8KKwlhdGwyX3JlYWRfcGNpX2NmZyhodywgUENJX1JFR19DT01NQU5ELCAmcGNpX2NmZ19jbWRfd29yZCk7CisJaWYgKChwY2lfY2ZnX2NtZF93b3JkICYKKwkJKENNRF9JT19TUEFDRXxDTURfTUVNT1JZX1NQQUNFfENNRF9CVVNfTUFTVEVSKSkgIT0KKwkJKENNRF9JT19TUEFDRXxDTURfTUVNT1JZX1NQQUNFfENNRF9CVVNfTUFTVEVSKSkgeworCQlwY2lfY2ZnX2NtZF93b3JkIHw9CisJCQkoQ01EX0lPX1NQQUNFfENNRF9NRU1PUllfU1BBQ0V8Q01EX0JVU19NQVNURVIpOworCQlhdGwyX3dyaXRlX3BjaV9jZmcoaHcsIFBDSV9SRUdfQ09NTUFORCwgJnBjaV9jZmdfY21kX3dvcmQpOworCX0KKworCS8qIENsZWFyIEludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nCisJICogaW50ZXJydXB0cyAmIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBldmVudHMKKwkgKi8KKwkvKiBGSVhNRSAqLworCS8qIEFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfSU1SLCAwKTsgKi8KKwkvKiBBVEwyX1dSSVRFX1JFRyhodywgUkVHX0lTUiwgMHhmZmZmZmZmZik7ICovCisKKwkvKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEuICBJdCB3aWxsIG5vdCBlZmZlY3QKKwkgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisJICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisJICovCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NQVNURVJfQ1RSTCwgTUFTVEVSX0NUUkxfU09GVF9SU1QpOworCXdtYigpOworCW1zbGVlcCgxKTsgLyogZGVsYXkgYWJvdXQgMW1zICovCisKKwkvKiBXYWl0IGF0IGxlYXN0IDEwbXMgZm9yIEFsbCBtb2R1bGUgdG8gYmUgSWRsZSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWljciA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19JRExFX1NUQVRVUyk7CisJCWlmICghaWNyKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsgLyogZGVsYXkgMSBtcyAqLworCQljcHVfcmVsYXgoKTsKKwl9CisKKwlpZiAoaWNyKQorCQlyZXR1cm4gaWNyOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ1VTVE9NX1NQSV9DU19TRVRVUCAgICAgICAgMgorI2RlZmluZSBDVVNUT01fU1BJX0NMS19ISSAgICAgICAgICAyCisjZGVmaW5lIENVU1RPTV9TUElfQ0xLX0xPICAgICAgICAgIDIKKyNkZWZpbmUgQ1VTVE9NX1NQSV9DU19IT0xEICAgICAgICAgMgorI2RlZmluZSBDVVNUT01fU1BJX0NTX0hJICAgICAgICAgICAzCisKK3N0YXRpYyBzdHJ1Y3QgYXRsMl9zcGlfZmxhc2hfZGV2IGZsYXNoX3RhYmxlW10gPQoreworLyogTUZSICAgIFdSU1IgIFJFQUQgIFBST0dSQU0gV1JFTiAgV1JESSAgUkRTUiAgUkRJRCAgU0VDVE9SX0VSQVNFIENISVBfRVJBU0UgKi8KK3siQXRtZWwiLCAweDAsICAweDAzLCAweDAyLCAgIDB4MDYsIDB4MDQsIDB4MDUsIDB4MTUsIDB4NTIsICAgICAgICAweDYyIH0sCit7IlNTVCIsICAgMHgwMSwgMHgwMywgMHgwMiwgICAweDA2LCAweDA0LCAweDA1LCAweDkwLCAweDIwLCAgICAgICAgMHg2MCB9LAoreyJTVCIsICAgIDB4MDEsIDB4MDMsIDB4MDIsICAgMHgwNiwgMHgwNCwgMHgwNSwgMHhBQiwgMHhEOCwgICAgICAgIDB4QzcgfSwKK307CisKK3N0YXRpYyBib29sIGF0bDJfc3BpX3JlYWQoc3RydWN0IGF0bDJfaHcgKmh3LCB1MzIgYWRkciwgdTMyICpidWYpCit7CisJaW50IGk7CisJdTMyIHZhbHVlOworCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19TUElfREFUQSwgMCk7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19TUElfQUREUiwgYWRkcik7CisKKwl2YWx1ZSA9IFNQSV9GTEFTSF9DVFJMX1dBSVRfUkVBRFkgfAorCQkoQ1VTVE9NX1NQSV9DU19TRVRVUCAmIFNQSV9GTEFTSF9DVFJMX0NTX1NFVFVQX01BU0spIDw8CisJCQlTUElfRkxBU0hfQ1RSTF9DU19TRVRVUF9TSElGVCB8CisJCShDVVNUT01fU1BJX0NMS19ISSAmIFNQSV9GTEFTSF9DVFJMX0NMS19ISV9NQVNLKSA8PAorCQkJU1BJX0ZMQVNIX0NUUkxfQ0xLX0hJX1NISUZUIHwKKwkJKENVU1RPTV9TUElfQ0xLX0xPICYgU1BJX0ZMQVNIX0NUUkxfQ0xLX0xPX01BU0spIDw8CisJCQlTUElfRkxBU0hfQ1RSTF9DTEtfTE9fU0hJRlQgfAorCQkoQ1VTVE9NX1NQSV9DU19IT0xEICYgU1BJX0ZMQVNIX0NUUkxfQ1NfSE9MRF9NQVNLKSA8PAorCQkJU1BJX0ZMQVNIX0NUUkxfQ1NfSE9MRF9TSElGVCB8CisJCShDVVNUT01fU1BJX0NTX0hJICYgU1BJX0ZMQVNIX0NUUkxfQ1NfSElfTUFTSykgPDwKKwkJCVNQSV9GTEFTSF9DVFJMX0NTX0hJX1NISUZUIHwKKwkJKDB4MSAmIFNQSV9GTEFTSF9DVFJMX0lOU19NQVNLKSA8PCBTUElfRkxBU0hfQ1RSTF9JTlNfU0hJRlQ7CisKKwlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1NQSV9GTEFTSF9DVFJMLCB2YWx1ZSk7CisKKwl2YWx1ZSB8PSBTUElfRkxBU0hfQ1RSTF9TVEFSVDsKKworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfU1BJX0ZMQVNIX0NUUkwsIHZhbHVlKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCW1zbGVlcCgxKTsKKwkJdmFsdWUgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfU1BJX0ZMQVNIX0NUUkwpOworCQlpZiAoISh2YWx1ZSAmIFNQSV9GTEFTSF9DVFJMX1NUQVJUKSkKKwkJCWJyZWFrOworCX0KKworCWlmICh2YWx1ZSAmIFNQSV9GTEFTSF9DVFJMX1NUQVJUKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqYnVmID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX1NQSV9EQVRBKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogZ2V0X3Blcm1hbmVudF9hZGRyZXNzCisgKiByZXR1cm4gMCBpZiBnZXQgdmFsaWQgbWFjIGFkZHJlc3MsCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3Blcm1hbmVudF9hZGRyZXNzKHN0cnVjdCBhdGwyX2h3ICpodykKK3sKKwl1MzIgQWRkclsyXTsKKwl1MzIgaSwgQ29udHJvbDsKKwl1MTYgUmVnaXN0ZXI7CisJdTggIEV0aEFkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworCWJvb2wgS2V5VmFsaWQ7CisKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihody0+cGVybV9tYWNfYWRkcikpCisJCXJldHVybiAwOworCisJQWRkclswXSA9IDA7CisJQWRkclsxXSA9IDA7CisKKwlpZiAoIWF0bDJfY2hlY2tfZWVwcm9tX2V4aXN0KGh3KSkgeyAvKiBlZXByb20gZXhpc3RzICovCisJCVJlZ2lzdGVyID0gMDsKKwkJS2V5VmFsaWQgPSBmYWxzZTsKKworCQkvKiBSZWFkIG91dCBhbGwgRUVQUk9NIGNvbnRlbnQgKi8KKwkJaSA9IDA7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoYXRsMl9yZWFkX2VlcHJvbShodywgaSArIDB4MTAwLCAmQ29udHJvbCkpIHsKKwkJCQlpZiAoS2V5VmFsaWQpIHsKKwkJCQkJaWYgKFJlZ2lzdGVyID09IFJFR19NQUNfU1RBX0FERFIpCisJCQkJCQlBZGRyWzBdID0gQ29udHJvbDsKKwkJCQkJZWxzZSBpZiAoUmVnaXN0ZXIgPT0KKwkJCQkJCShSRUdfTUFDX1NUQV9BRERSICsgNCkpCisJCQkJCQlBZGRyWzFdID0gQ29udHJvbDsKKwkJCQkJS2V5VmFsaWQgPSBmYWxzZTsKKwkJCQl9IGVsc2UgaWYgKChDb250cm9sICYgMHhmZikgPT0gMHg1QSkgeworCQkJCQlLZXlWYWxpZCA9IHRydWU7CisJCQkJCVJlZ2lzdGVyID0gKHUxNikgKENvbnRyb2wgPj4gMTYpOworCQkJCX0gZWxzZSB7CisJCQkvKiBhc3N1bWUgZGF0YSBlbmQgd2hpbGUgZW5jb3VudCBhbiBpbnZhbGlkIEtFWVdPUkQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlicmVhazsgLyogcmVhZCBlcnJvciAqLworCQkJfQorCQkJaSArPSA0OworCQl9CisKKwkJKih1MzIgKikgJkV0aEFkZHJbMl0gPSBMT05HU1dBUChBZGRyWzBdKTsKKwkJKih1MTYgKikgJkV0aEFkZHJbMF0gPSBTSE9SVFNXQVAoKih1MTYgKikgJkFkZHJbMV0pOworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKEV0aEFkZHIpKSB7CisJCQltZW1jcHkoaHctPnBlcm1fbWFjX2FkZHIsIEV0aEFkZHIsIE5PREVfQUREUkVTU19TSVpFKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKworCS8qIHNlZSBpZiBTUEkgZmxhc2ggZXhpc3RzPyAqLworCUFkZHJbMF0gPSAwOworCUFkZHJbMV0gPSAwOworCVJlZ2lzdGVyID0gMDsKKwlLZXlWYWxpZCA9IGZhbHNlOworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCWlmIChhdGwyX3NwaV9yZWFkKGh3LCBpICsgMHgxZjAwMCwgJkNvbnRyb2wpKSB7CisJCQlpZiAoS2V5VmFsaWQpIHsKKwkJCQlpZiAoUmVnaXN0ZXIgPT0gUkVHX01BQ19TVEFfQUREUikKKwkJCQkJQWRkclswXSA9IENvbnRyb2w7CisJCQkJZWxzZSBpZiAoUmVnaXN0ZXIgPT0gKFJFR19NQUNfU1RBX0FERFIgKyA0KSkKKwkJCQkJQWRkclsxXSA9IENvbnRyb2w7CisJCQkJS2V5VmFsaWQgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoKENvbnRyb2wgJiAweGZmKSA9PSAweDVBKSB7CisJCQkJS2V5VmFsaWQgPSB0cnVlOworCQkJCVJlZ2lzdGVyID0gKHUxNikgKENvbnRyb2wgPj4gMTYpOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsgLyogZGF0YSBlbmQgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOyAvKiByZWFkIGVycm9yICovCisJCX0KKwkJaSArPSA0OworCX0KKworCSoodTMyICopICZFdGhBZGRyWzJdID0gTE9OR1NXQVAoQWRkclswXSk7CisJKih1MTYgKikgJkV0aEFkZHJbMF0gPSBTSE9SVFNXQVAoKih1MTYgKikmQWRkclsxXSk7CisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoRXRoQWRkcikpIHsKKwkJbWVtY3B5KGh3LT5wZXJtX21hY19hZGRyLCBFdGhBZGRyLCBOT0RFX0FERFJFU1NfU0laRSk7CisJCXJldHVybiAwOworCX0KKwkvKiBtYXliZSBNQUMtYWRkcmVzcyBpcyBmcm9tIEJJT1MgKi8KKwlBZGRyWzBdID0gQVRMMl9SRUFEX1JFRyhodywgUkVHX01BQ19TVEFfQUREUik7CisJQWRkclsxXSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NQUNfU1RBX0FERFIgKyA0KTsKKwkqKHUzMiAqKSAmRXRoQWRkclsyXSA9IExPTkdTV0FQKEFkZHJbMF0pOworCSoodTE2ICopICZFdGhBZGRyWzBdID0gU0hPUlRTV0FQKCoodTE2ICopICZBZGRyWzFdKTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKEV0aEFkZHIpKSB7CisJCW1lbWNweShody0+cGVybV9tYWNfYWRkciwgRXRoQWRkciwgTk9ERV9BRERSRVNTX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgTUFDIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLworc3RhdGljIHMzMiBhdGwyX3JlYWRfbWFjX2FkZHIoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXUxNiBpOworCisJaWYgKGdldF9wZXJtYW5lbnRfYWRkcmVzcyhodykpIHsKKwkJLyogZm9yIHRlc3QgKi8KKwkJLyogRklYTUU6IHNob3VsZG4ndCB3ZSB1c2UgcmFuZG9tX2V0aGVyX2FkZHIoKSBoZXJlPyAqLworCQlody0+cGVybV9tYWNfYWRkclswXSA9IDB4MDA7CisJCWh3LT5wZXJtX21hY19hZGRyWzFdID0gMHgxMzsKKwkJaHctPnBlcm1fbWFjX2FkZHJbMl0gPSAweDc0OworCQlody0+cGVybV9tYWNfYWRkclszXSA9IDB4MDA7CisJCWh3LT5wZXJtX21hY19hZGRyWzRdID0gMHg1YzsKKwkJaHctPnBlcm1fbWFjX2FkZHJbNV0gPSAweDM4OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOT0RFX0FERFJFU1NfU0laRTsgaSsrKQorCQlody0+bWFjX2FkZHJbaV0gPSBody0+cGVybV9tYWNfYWRkcltpXTsKKworCXJldHVybiAwOworfQorCisvKgorICogSGFzaGVzIGFuIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIGl0cyBsb2NhdGlvbiBpbiB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1jX2FkZHIgLSB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdG8gaGFzaAorICoKKyAqIGF0bDJfaGFzaF9tY19hZGRyCisgKiAgcHVycG9zZQorICogICAgICBzZXQgaGFzaCB2YWx1ZSBmb3IgYSBtdWx0aWNhc3QgYWRkcmVzcworICogICAgICBoYXNoIGNhbGN1IHByb2Nlc3NpbmcgOgorICogICAgICAgICAgMS4gY2FsY3UgMzJiaXQgQ1JDIGZvciBtdWx0aWNhc3QgYWRkcmVzcworICogICAgICAgICAgMi4gcmV2ZXJzZSBjcmMgd2l0aCBNU0IgdG8gTFNCCisgKi8KK3N0YXRpYyB1MzIgYXRsMl9oYXNoX21jX2FkZHIoc3RydWN0IGF0bDJfaHcgKmh3LCB1OCAqbWNfYWRkcikKK3sKKwl1MzIgY3JjMzIsIHZhbHVlOworCWludCBpOworCisJdmFsdWUgPSAwOworCWNyYzMyID0gZXRoZXJfY3JjX2xlKDYsIG1jX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCXZhbHVlIHw9ICgoKGNyYzMyID4+IGkpICYgMSkgPDwgKDMxIC0gaSkpOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogU2V0cyB0aGUgYml0IGluIHRoZSBtdWx0aWNhc3QgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgaGFzaCB2YWx1ZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogaGFzaF92YWx1ZSAtIE11bHRpY2FzdCBhZGRyZXNzIGhhc2ggdmFsdWUKKyAqLworc3RhdGljIHZvaWQgYXRsMl9oYXNoX3NldChzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiBoYXNoX3ZhbHVlKQoreworCXUzMiBoYXNoX2JpdCwgaGFzaF9yZWc7CisJdTMyIG10YTsKKworCS8qIFRoZSBIQVNIIFRhYmxlICBpcyBhIHJlZ2lzdGVyIGFycmF5IG9mIDIgMzItYml0IHJlZ2lzdGVycy4KKwkgKiBJdCBpcyB0cmVhdGVkIGxpa2UgYW4gYXJyYXkgb2YgNjQgYml0cy4gIFdlIHdhbnQgdG8gc2V0CisJICogYml0IEJpdEFycmF5W2hhc2hfdmFsdWVdLiBTbyB3ZSBmaWd1cmUgb3V0IHdoYXQgcmVnaXN0ZXIKKwkgKiB0aGUgYml0IGlzIGluLCByZWFkIGl0LCBPUiBpbiB0aGUgbmV3IGJpdCwgdGhlbiB3cml0ZQorCSAqIGJhY2sgdGhlIG5ldyB2YWx1ZS4gIFRoZSByZWdpc3RlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorCSAqIHVwcGVyIDcgYml0cyBvZiB0aGUgaGFzaCB2YWx1ZSBhbmQgdGhlIGJpdCB3aXRoaW4gdGhhdAorCSAqIHJlZ2lzdGVyIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlciA1IGJpdHMgb2YgdGhlIHZhbHVlLgorCSAqLworCWhhc2hfcmVnID0gKGhhc2hfdmFsdWUgPj4gMzEpICYgMHgxOworCWhhc2hfYml0ID0gKGhhc2hfdmFsdWUgPj4gMjYpICYgMHgxRjsKKworCW10YSA9IEFUTDJfUkVBRF9SRUdfQVJSQVkoaHcsIFJFR19SWF9IQVNIX1RBQkxFLCBoYXNoX3JlZyk7CisKKwltdGEgfD0gKDEgPDwgaGFzaF9iaXQpOworCisJQVRMMl9XUklURV9SRUdfQVJSQVkoaHcsIFJFR19SWF9IQVNIX1RBQkxFLCBoYXNoX3JlZywgbXRhKTsKK30KKworLyoKKyAqIGF0bDJfaW5pdF9wY2llIC0gaW5pdCBQQ0lFIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBhdGwyX2luaXRfcGNpZShzdHJ1Y3QgYXRsMl9odyAqaHcpCit7CisgICAgdTMyIHZhbHVlOworICAgIHZhbHVlID0gTFRTU01fVEVTVF9NT0RFX0RFRjsKKyAgICBBVEwyX1dSSVRFX1JFRyhodywgUkVHX0xUU1NNX1RFU1RfTU9ERSwgdmFsdWUpOworCisgICAgdmFsdWUgPSBQQ0lFX0RMTF9UWF9DVFJMMV9ERUY7CisgICAgQVRMMl9XUklURV9SRUcoaHcsIFJFR19QQ0lFX0RMTF9UWF9DVFJMMSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBhdGwyX2luaXRfZmxhc2hfb3Bjb2RlKHN0cnVjdCBhdGwyX2h3ICpodykKK3sKKwlpZiAoaHctPmZsYXNoX3ZlbmRvciA+PSBBUlJBWV9TSVpFKGZsYXNoX3RhYmxlKSkKKwkJaHctPmZsYXNoX3ZlbmRvciA9IDA7IC8qIEFUTUVMICovCisKKwkvKiBJbml0IE9QIHRhYmxlICovCisJQVRMMl9XUklURV9SRUdCKGh3LCBSRUdfU1BJX0ZMQVNIX09QX1BST0dSQU0sCisJCWZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZFBST0dSQU0pOworCUFUTDJfV1JJVEVfUkVHQihodywgUkVHX1NQSV9GTEFTSF9PUF9TQ19FUkFTRSwKKwkJZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kU0VDVE9SX0VSQVNFKTsKKwlBVEwyX1dSSVRFX1JFR0IoaHcsIFJFR19TUElfRkxBU0hfT1BfQ0hJUF9FUkFTRSwKKwkJZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kQ0hJUF9FUkFTRSk7CisJQVRMMl9XUklURV9SRUdCKGh3LCBSRUdfU1BJX0ZMQVNIX09QX1JESUQsCisJCWZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZFJESUQpOworCUFUTDJfV1JJVEVfUkVHQihodywgUkVHX1NQSV9GTEFTSF9PUF9XUkVOLAorCQlmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRXUkVOKTsKKwlBVEwyX1dSSVRFX1JFR0IoaHcsIFJFR19TUElfRkxBU0hfT1BfUkRTUiwKKwkJZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kUkRTUik7CisJQVRMMl9XUklURV9SRUdCKGh3LCBSRUdfU1BJX0ZMQVNIX09QX1dSU1IsCisJCWZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZFdSU1IpOworCUFUTDJfV1JJVEVfUkVHQihodywgUkVHX1NQSV9GTEFTSF9PUF9SRUFELAorCQlmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRSRUFEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIEFzc3VtZXMgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCBpcyBpbiBhCisqIHBvc3QtcmVzZXQgdW5pbml0aWFsaXplZCBzdGF0ZS4gSW5pdGlhbGl6ZXMgbXVsdGljYXN0IHRhYmxlLAorKiBhbmQgIENhbGxzIHJvdXRpbmVzIHRvIHNldHVwIGxpbmsKKyogTGVhdmVzIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHMzMiBhdGwyX2luaXRfaHcoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXUzMiByZXRfdmFsID0gMDsKKworCWF0bDJfaW5pdF9wY2llKGh3KTsKKworCS8qIFplcm8gb3V0IHRoZSBNdWx0aWNhc3QgSEFTSCB0YWJsZSAqLworCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KKwlBVEwyX1dSSVRFX1JFRyhodywgUkVHX1JYX0hBU0hfVEFCTEUsIDApOworCUFUTDJfV1JJVEVfUkVHX0FSUkFZKGh3LCBSRUdfUlhfSEFTSF9UQUJMRSwgMSwgMCk7CisKKwlhdGwyX2luaXRfZmxhc2hfb3Bjb2RlKGh3KTsKKworCXJldF92YWwgPSBhdGwyX3BoeV9pbml0KGh3KTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKgorICogRGV0ZWN0cyB0aGUgY3VycmVudCBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIG9mIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogc3BlZWQgLSBTcGVlZCBvZiB0aGUgY29ubmVjdGlvbgorICogZHVwbGV4IC0gRHVwbGV4IHNldHRpbmcgb2YgdGhlIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIHMzMiBhdGwyX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwyX2h3ICpodywgdTE2ICpzcGVlZCwKKwl1MTYgKmR1cGxleCkKK3sKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGh5X2RhdGE7CisKKwkvKiBSZWFkIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKDE3KSAqLworCXJldF92YWwgPSBhdGwyX3JlYWRfcGh5X3JlZyhodywgTUlJX0FUTFhfUFNTUiwgJnBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoIShwaHlfZGF0YSAmIE1JSV9BVExYX1BTU1JfU1BEX0RQTFhfUkVTT0xWRUQpKQorCQlyZXR1cm4gQVRMWF9FUlJfUEhZX1JFUzsKKworCXN3aXRjaCAocGh5X2RhdGEgJiBNSUlfQVRMWF9QU1NSX1NQRUVEKSB7CisJY2FzZSBNSUlfQVRMWF9QU1NSXzEwME1CUzoKKwkJKnNwZWVkID0gU1BFRURfMTAwOworCQlicmVhazsKKwljYXNlIE1JSV9BVExYX1BTU1JfMTBNQlM6CisJCSpzcGVlZCA9IFNQRUVEXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQVRMWF9FUlJfUEhZX1NQRUVEOworCQlicmVhazsKKwl9CisKKwlpZiAocGh5X2RhdGEgJiBNSUlfQVRMWF9QU1NSX0RQTFgpCisJCSpkdXBsZXggPSBGVUxMX0RVUExFWDsKKwllbHNlCisJCSpkdXBsZXggPSBIQUxGX0RVUExFWDsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZHMgdGhlIHZhbHVlIGZyb20gYSBQSFkgcmVnaXN0ZXIKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiByZWdfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIFBIWSByZWdpc3RlciB0byByZWFkCisgKi8KK3N0YXRpYyBzMzIgYXRsMl9yZWFkX3BoeV9yZWcoc3RydWN0IGF0bDJfaHcgKmh3LCB1MTYgcmVnX2FkZHIsIHUxNiAqcGh5X2RhdGEpCit7CisJdTMyIHZhbDsKKwlpbnQgaTsKKworCXZhbCA9ICgodTMyKShyZWdfYWRkciAmIE1ESU9fUkVHX0FERFJfTUFTSykpIDw8IE1ESU9fUkVHX0FERFJfU0hJRlQgfAorCQlNRElPX1NUQVJUIHwKKwkJTURJT19TVVBfUFJFQU1CTEUgfAorCQlNRElPX1JXIHwKKwkJTURJT19DTEtfMjVfNCA8PCBNRElPX0NMS19TRUxfU0hJRlQ7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19NRElPX0NUUkwsIHZhbCk7CisKKwl3bWIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNRElPX1dBSVRfVElNRVM7IGkrKykgeworCQl1ZGVsYXkoMik7CisJCXZhbCA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19NRElPX0NUUkwpOworCQlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKQorCQkJYnJlYWs7CisJCXdtYigpOworCX0KKwlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKSB7CisJCSpwaHlfZGF0YSA9ICh1MTYpdmFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gQVRMWF9FUlJfUEhZOworfQorCisvKgorICogV3JpdGVzIGEgdmFsdWUgdG8gYSBQSFkgcmVnaXN0ZXIKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiByZWdfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIFBIWSByZWdpc3RlciB0byB3cml0ZQorICogZGF0YSAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFBIWQorICovCitzdGF0aWMgczMyIGF0bDJfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiByZWdfYWRkciwgdTE2IHBoeV9kYXRhKQoreworCWludCBpOworCXUzMiB2YWw7CisKKwl2YWwgPSAoKHUzMikocGh5X2RhdGEgJiBNRElPX0RBVEFfTUFTSykpIDw8IE1ESU9fREFUQV9TSElGVCB8CisJCShyZWdfYWRkciAmIE1ESU9fUkVHX0FERFJfTUFTSykgPDwgTURJT19SRUdfQUREUl9TSElGVCB8CisJCU1ESU9fU1VQX1BSRUFNQkxFIHwKKwkJTURJT19TVEFSVCB8CisJCU1ESU9fQ0xLXzI1XzQgPDwgTURJT19DTEtfU0VMX1NISUZUOworCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfTURJT19DVFJMLCB2YWwpOworCisJd21iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTURJT19XQUlUX1RJTUVTOyBpKyspIHsKKwkJdWRlbGF5KDIpOworCQl2YWwgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfTURJT19DVFJMKTsKKwkJaWYgKCEodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkKKwkJCWJyZWFrOworCisJCXdtYigpOworCX0KKworCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIEFUTFhfRVJSX1BIWTsKK30KKworLyoKKyAqIENvbmZpZ3VyZXMgUEhZIGF1dG9uZWcgYW5kIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IHNldHRpbmdzCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqLworc3RhdGljIHMzMiBhdGwyX3BoeV9zZXR1cF9hdXRvbmVnX2FkdihzdHJ1Y3QgYXRsMl9odyAqaHcpCit7CisJczMyIHJldF92YWw7CisJczE2IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisKKwkvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnID0gTUlJX0FSX0RFRkFVTFRfQ0FQX01BU0s7CisKKwkvKiBOZWVkIHRvIHBhcnNlIGF1dG9uZWdfYWR2ZXJ0aXNlZCAgYW5kIHNldCB1cAorCSAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAgRmlyc3Qgd2Ugd2lsbCBwYXJzZSBmb3IKKwkgKiBhdXRvbmVnX2FkdmVydGlzZWQgc29mdHdhcmUgb3ZlcnJpZGUuICBTaW5jZSB3ZSBjYW4gYWR2ZXJ0aXNlCisJICogYSBwbGV0aG9yYSBvZiBjb21iaW5hdGlvbnMsIHdlIG5lZWQgdG8gY2hlY2sgZWFjaCBiaXQKKwkgKiBpbmRpdmlkdWFsbHkuCisJICovCisKKwkvKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZworCSAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KKwkgKiB0aGUgIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4gKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnICY9IH5NSUlfQVJfU1BFRURfTUFTSzsKKworCS8qIE5lZWQgdG8gcGFyc2UgTWVkaWFUeXBlIGFuZCBzZXR1cCB0aGUKKwkgKiBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAqLworCXN3aXRjaCAoaHctPk1lZGlhVHlwZSkgeworCWNhc2UgTUVESUFfVFlQRV9BVVRPX1NFTlNPUjoKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PQorCQkJKE1JSV9BUl8xMFRfSERfQ0FQUyB8CisJCQlNSUlfQVJfMTBUX0ZEX0NBUFMgIHwKKwkJCU1JSV9BUl8xMDBUWF9IRF9DQVBTfAorCQkJTUlJX0FSXzEwMFRYX0ZEX0NBUFMpOworCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0KKwkJCUFEVkVSVElTRV8xMF9IQUxGIHwKKwkJCUFEVkVSVElTRV8xMF9GVUxMIHwKKwkJCUFEVkVSVElTRV8xMDBfSEFMRnwKKwkJCUFEVkVSVElTRV8xMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBNSUlfQVJfMTAwVFhfRkRfQ0FQUzsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBNSUlfQVJfMTAwVFhfSERfQ0FQUzsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDBfSEFMRjsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwTV9GVUxMOgorCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE1JSV9BUl8xMFRfRkRfQ0FQUzsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMF9GVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE1JSV9BUl8xMFRfSERfQ0FQUzsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMF9IQUxGOworCQlicmVhazsKKwl9CisKKwkvKiBmbG93IGNvbnRyb2wgZml4ZWQgdG8gZW5hYmxlIGFsbCAqLworCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE1JSV9BUl9BU01fRElSIHwgTUlJX0FSX1BBVVNFKTsKKworCWh3LT5taWlfYXV0b25lZ19hZHZfcmVnID0gbWlpX2F1dG9uZWdfYWR2X3JlZzsKKworCXJldF92YWwgPSBhdGwyX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BRFZFUlRJU0UsIG1paV9hdXRvbmVnX2Fkdl9yZWcpOworCisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXNldHMgdGhlIFBIWSBhbmQgbWFrZSBhbGwgY29uZmlnIHZhbGlkYXRlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIGJpdCAxNSBhbmQgMTIgb2YgdGhlIE1JSSBDb250cm9sIHJlZ2lzZXIgKGZvciBGMDAxIGJ1ZykKKyAqLworc3RhdGljIHMzMiBhdGwyX3BoeV9jb21taXQoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKKworCXBoeV9kYXRhID0gTUlJX0NSX1JFU0VUIHwgTUlJX0NSX0FVVE9fTkVHX0VOIHwgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUc7CisJcmV0X3ZhbCA9IGF0bDJfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkgeworCQl1MzIgdmFsOworCQlpbnQgaTsKKwkJLyogcGNpZSBzZXJkZXMgbGluayBtYXkgYmUgZG93biAhICovCisJCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CisJCQltc2xlZXAoMSk7CisJCQl2YWwgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfTURJT19DVFJMKTsKKwkJCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoMCAhPSAodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhdGwyOiBQQ0llIGxpbmsgZG93biBmb3IgYXQgbGVhc3QgMjVtcyAhXG4iKTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgczMyIGF0bDJfcGh5X2luaXQoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfdmFsOworCisJaWYgKGh3LT5waHlfY29uZmlndXJlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBFbmFibGUgUEhZICovCisJQVRMMl9XUklURV9SRUdXKGh3LCBSRUdfUEhZX0VOQUJMRSwgMSk7CisJQVRMMl9XUklURV9GTFVTSChodyk7CisJbXNsZWVwKDEpOworCisJLyogY2hlY2sgaWYgdGhlIFBIWSBpcyBpbiBwb3dlcnNhdmluZyBtb2RlICovCisJYXRsMl93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDApOworCWF0bDJfcmVhZF9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsICZwaHlfdmFsKTsKKworCS8qIDAyNEUgLyAxMjRFIDByIDAyNzQgLyAxMjc0ID8gKi8KKwlpZiAocGh5X3ZhbCAmIDB4MTAwMCkgeworCQlwaHlfdmFsICY9IH4weDEwMDA7CisJCWF0bDJfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCBwaHlfdmFsKTsKKwl9CisKKwltc2xlZXAoMSk7CisKKwkvKkVuYWJsZSBQSFkgTGlua0NoYW5nZSBJbnRlcnJ1cHQgKi8KKwlyZXRfdmFsID0gYXRsMl93cml0ZV9waHlfcmVnKGh3LCAxOCwgMHhDMDApOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCS8qIHNldHVwIEF1dG9OZWcgcGFyYW1ldGVycyAqLworCXJldF92YWwgPSBhdGwyX3BoeV9zZXR1cF9hdXRvbmVnX2Fkdihodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJLyogU1cuUmVzZXQgJiBFbi1BdXRvLU5lZyB0byByZXN0YXJ0IEF1dG8tTmVnICovCisJcmV0X3ZhbCA9IGF0bDJfcGh5X2NvbW1pdChodyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJaHctPnBoeV9jb25maWd1cmVkID0gdHJ1ZTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZCBhdGwyX3NldF9tYWNfYWRkcihzdHJ1Y3QgYXRsMl9odyAqaHcpCit7CisJdTMyIHZhbHVlOworCS8qIDAwLTBCLTZBLUY2LTAwLURDCisJICogMDogIDZBRjYwMERDICAgMTogMDAwQgorCSAqIGxvdyBkd29yZCAqLworCXZhbHVlID0gKCgodTMyKWh3LT5tYWNfYWRkclsyXSkgPDwgMjQpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkcls0XSkgPDwgOCkgIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkcls1XSkpOworCUFUTDJfV1JJVEVfUkVHX0FSUkFZKGh3LCBSRUdfTUFDX1NUQV9BRERSLCAwLCB2YWx1ZSk7CisJLyogaGlnaHQgZHdvcmQgKi8KKwl2YWx1ZSA9ICgoKHUzMilody0+bWFjX2FkZHJbMF0pIDw8IDgpIHwKKwkJKCgodTMyKWh3LT5tYWNfYWRkclsxXSkpOworCUFUTDJfV1JJVEVfUkVHX0FSUkFZKGh3LCBSRUdfTUFDX1NUQV9BRERSLCAxLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBjaGVja19lZXByb21fZXhpc3QKKyAqIHJldHVybiAwIGlmIGVlcHJvbSBleGlzdAorICovCitzdGF0aWMgaW50IGF0bDJfY2hlY2tfZWVwcm9tX2V4aXN0KHN0cnVjdCBhdGwyX2h3ICpodykKK3sKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19TUElfRkxBU0hfQ1RSTCk7CisJaWYgKHZhbHVlICYgU1BJX0ZMQVNIX0NUUkxfRU5fVlBEKSB7CisJCXZhbHVlICY9IH5TUElfRkxBU0hfQ1RSTF9FTl9WUEQ7CisJCUFUTDJfV1JJVEVfUkVHKGh3LCBSRUdfU1BJX0ZMQVNIX0NUUkwsIHZhbHVlKTsKKwl9CisJdmFsdWUgPSBBVEwyX1JFQURfUkVHVyhodywgUkVHX1BDSUVfQ0FQX0xJU1QpOworCXJldHVybiAoKHZhbHVlICYgMHhGRjAwKSA9PSAweDZDMDApID8gMCA6IDE7Cit9CisKKy8qIEZJWE1FOiBUaGlzIGRvZXNuJ3QgbG9vayByaWdodC4gLS0gQ0hTICovCitzdGF0aWMgYm9vbCBhdGwyX3dyaXRlX2VlcHJvbShzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYXRsMl9yZWFkX2VlcHJvbShzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiBPZmZzZXQsIHUzMiAqcFZhbHVlKQoreworCWludCBpOworCXUzMiAgICBDb250cm9sOworCisJaWYgKE9mZnNldCAmIDB4MykKKwkJcmV0dXJuIGZhbHNlOyAvKiBhZGRyZXNzIGRvIG5vdCBhbGlnbiAqLworCisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19WUERfREFUQSwgMCk7CisJQ29udHJvbCA9IChPZmZzZXQgJiBWUERfQ0FQX1ZQRF9BRERSX01BU0spIDw8IFZQRF9DQVBfVlBEX0FERFJfU0hJRlQ7CisJQVRMMl9XUklURV9SRUcoaHcsIFJFR19WUERfQ0FQLCBDb250cm9sKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCW1zbGVlcCgyKTsKKwkJQ29udHJvbCA9IEFUTDJfUkVBRF9SRUcoaHcsIFJFR19WUERfQ0FQKTsKKwkJaWYgKENvbnRyb2wgJiBWUERfQ0FQX1ZQRF9GTEFHKQorCQkJYnJlYWs7CisJfQorCisJaWYgKENvbnRyb2wgJiBWUERfQ0FQX1ZQRF9GTEFHKSB7CisJCSpwVmFsdWUgPSBBVEwyX1JFQURfUkVHKGh3LCBSRUdfVlBEX0RBVEEpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOyAvKiB0aW1lb3V0ICovCit9CisKK3N0YXRpYyB2b2lkIGF0bDJfZm9yY2VfcHMoc3RydWN0IGF0bDJfaHcgKmh3KQoreworCXUxNiBwaHlfdmFsOworCisJYXRsMl93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDApOworCWF0bDJfcmVhZF9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsICZwaHlfdmFsKTsKKwlhdGwyX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfREFUQSwgcGh5X3ZhbCB8IDB4MTAwMCk7CisKKwlhdGwyX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9EQkdfQUREUiwgMik7CisJYXRsMl93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0RBVEEsIDB4MzAwMCk7CisJYXRsMl93cml0ZV9waHlfcmVnKGh3LCBNSUlfREJHX0FERFIsIDMpOworCWF0bDJfd3JpdGVfcGh5X3JlZyhodywgTUlJX0RCR19EQVRBLCAwKTsKK30KKworLyogVGhpcyBpcyB0aGUgb25seSB0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYWRqdXN0IHRoZQorICogbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgdGhhdCB0aGUgZHJpdmVyIGNhbiBtYW5hZ2UuCisgKi8KKyNkZWZpbmUgQVRMMl9NQVhfTklDIDQKKworI2RlZmluZSBPUFRJT05fVU5TRVQgICAgLTEKKyNkZWZpbmUgT1BUSU9OX0RJU0FCTEVEIDAKKyNkZWZpbmUgT1BUSU9OX0VOQUJMRUQgIDEKKworLyogQWxsIHBhcmFtZXRlcnMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUsIGFzIGFuIGludGVnZXIgYXJyYXkgb2YgdmFsdWVzLgorICogVGhpcyBtYWNybyBqdXN0IHJlZHVjZXMgdGhlIG5lZWQgdG8gcmVwZWF0IHRoZSBzYW1lIGRlY2xhcmF0aW9uIGNvZGUKKyAqIG92ZXIgYW5kIG92ZXIgKHBsdXMgdGhpcyBoZWxwcyB0byBhdm9pZCB0eXBvIGJ1Z3MpLgorICovCisjZGVmaW5lIEFUTDJfUEFSQU1fSU5JVCB7WzAgLi4uIEFUTDJfTUFYX05JQ10gPSBPUFRJT05fVU5TRVR9CisjaWZuZGVmIG1vZHVsZV9wYXJhbV9hcnJheQorLyogTW9kdWxlIFBhcmFtZXRlcnMgYXJlIGFsd2F5cyBpbml0aWFsaXplZCB0byAtMSwgc28gdGhhdCB0aGUgZHJpdmVyCisgKiBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vIHVzZXIgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZQorICogdXNlciBhc2tpbmcgZm9yIHRoZSBkZWZhdWx0IHZhbHVlLgorICogVGhlIHRydWUgZGVmYXVsdCB2YWx1ZXMgYXJlIGxvYWRlZCBpbiB3aGVuIGF0bDJfY2hlY2tfb3B0aW9ucyBpcyBjYWxsZWQuCisgKgorICogVGhpcyBpcyBhIEdDQyBleHRlbnNpb24gdG8gQU5TSSBDLgorICogU2VlIHRoZSBpdGVtICJMYWJlbGVkIEVsZW1lbnRzIGluIEluaXRpYWxpemVycyIgaW4gdGhlIHNlY3Rpb24KKyAqICJFeHRlbnNpb25zIHRvIHRoZSBDIExhbmd1YWdlIEZhbWlseSIgb2YgdGhlIEdDQyBkb2N1bWVudGF0aW9uLgorICovCisKKyNkZWZpbmUgQVRMMl9QQVJBTShYLCBkZXNjKSBcCisgICAgc3RhdGljIGNvbnN0IGludCBfX2RldmluaXRkYXRhIFhbQVRMMl9NQVhfTklDICsgMV0gPSBBVEwyX1BBUkFNX0lOSVQ7IFwKKyAgICBNT0RVTEVfUEFSTShYLCAiMS0iIF9fTU9EVUxFX1NUUklORyhBVEwyX01BWF9OSUMpICJpIik7IFwKKyAgICBNT0RVTEVfUEFSTV9ERVNDKFgsIGRlc2MpOworI2Vsc2UKKyNkZWZpbmUgQVRMMl9QQVJBTShYLCBkZXNjKSBcCisgICAgc3RhdGljIGludCBfX2RldmluaXRkYXRhIFhbQVRMMl9NQVhfTklDKzFdID0gQVRMMl9QQVJBTV9JTklUOyBcCisgICAgc3RhdGljIGludCBudW1fIyNYID0gMDsgXAorICAgIG1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChYLCBYLCBpbnQsICZudW1fIyNYLCAwKTsgXAorICAgIE1PRFVMRV9QQVJNX0RFU0MoWCwgZGVzYyk7CisjZW5kaWYKKworLyoKKyAqIFRyYW5zbWl0IE1lbW9yeSBTaXplCisgKiBWYWxpZCBSYW5nZTogNjQtMjA0OAorICogRGVmYXVsdCBWYWx1ZTogMTI4CisgKi8KKyNkZWZpbmUgQVRMMl9NSU5fVFhfTUVNU0laRQkJNAkvKiA0S0IgKi8KKyNkZWZpbmUgQVRMMl9NQVhfVFhfTUVNU0laRQkJNjQJLyogNjRLQiAqLworI2RlZmluZSBBVEwyX0RFRkFVTFRfVFhfTUVNU0laRQkJOAkvKiA4S0IgKi8KK0FUTDJfUEFSQU0oVHhNZW1TaXplLCAiQnl0ZXMgb2YgVHJhbnNtaXQgTWVtb3J5Iik7CisKKy8qCisgKiBSZWNlaXZlIE1lbW9yeSBCbG9jayBDb3VudAorICogVmFsaWQgUmFuZ2U6IDE2LTUxMgorICogRGVmYXVsdCBWYWx1ZTogMTI4CisgKi8KKyNkZWZpbmUgQVRMMl9NSU5fUlhEX0NPVU5UCQkxNgorI2RlZmluZSBBVEwyX01BWF9SWERfQ09VTlQJCTUxMgorI2RlZmluZSBBVEwyX0RFRkFVTFRfUlhEX0NPVU5UCQk2NAorQVRMMl9QQVJBTShSeE1lbUJsb2NrLCAiTnVtYmVyIG9mIHJlY2VpdmUgbWVtb3J5IGJsb2NrIik7CisKKy8qCisgKiBVc2VyIFNwZWNpZmllZCBNZWRpYVR5cGUgT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMC01CisgKiAgLSAwICAgIC0gYXV0by1uZWdvdGlhdGUgYXQgYWxsIHN1cHBvcnRlZCBzcGVlZHMKKyAqICAtIDEgICAgLSBvbmx5IGxpbmsgYXQgMTAwME1icHMgRnVsbCBEdXBsZXgKKyAqICAtIDIgICAgLSBvbmx5IGxpbmsgYXQgMTAwTWJwcyBGdWxsIER1cGxleAorICogIC0gMyAgICAtIG9ubHkgbGluayBhdCAxMDBNYnBzIEhhbGYgRHVwbGV4CisgKiAgLSA0ICAgIC0gb25seSBsaW5rIGF0IDEwTWJwcyBGdWxsIER1cGxleAorICogIC0gNSAgICAtIG9ubHkgbGluayBhdCAxME1icHMgSGFsZiBEdXBsZXgKKyAqIERlZmF1bHQgVmFsdWU6IDAKKyAqLworQVRMMl9QQVJBTShNZWRpYVR5cGUsICJNZWRpYVR5cGUgU2VsZWN0Iik7CisKKy8qCisgKiBJbnRlcnJ1cHQgTW9kZXJhdGUgVGltZXIgaW4gdW5pdHMgb2YgMjA0OCBucyAofjIgdXMpCisgKiBWYWxpZCBSYW5nZTogMTAtNjU1MzUKKyAqIERlZmF1bHQgVmFsdWU6IDQ1MDAwKDkwbXMpCisgKi8KKyNkZWZpbmUgSU5UX01PRF9ERUZBVUxUX0NOVAkxMDAgLyogMjAwdXMgKi8KKyNkZWZpbmUgSU5UX01PRF9NQVhfQ05UCQk2NTAwMAorI2RlZmluZSBJTlRfTU9EX01JTl9DTlQJCTUwCitBVEwyX1BBUkFNKEludE1vZFRpbWVyLCAiSW50ZXJydXB0IE1vZGVyYXRvciBUaW1lciIpOworCisvKgorICogRmxhc2hWZW5kb3IKKyAqIFZhbGlkIFJhbmdlOiAwLTIKKyAqIDAgLSBBdG1lbAorICogMSAtIFNTVAorICogMiAtIFNUCisgKi8KK0FUTDJfUEFSQU0oRmxhc2hWZW5kb3IsICJTUEkgRmxhc2ggVmVuZG9yIik7CisKKyNkZWZpbmUgQVVUT05FR19BRFZfREVGQVVMVAkweDJGCisjZGVmaW5lIEFVVE9ORUdfQURWX01BU0sJMHgyRgorI2RlZmluZSBGTE9XX0NPTlRST0xfREVGQVVMVAlGTE9XX0NPTlRST0xfRlVMTAorCisjZGVmaW5lIEZMQVNIX1ZFTkRPUl9ERUZBVUxUCTAKKyNkZWZpbmUgRkxBU0hfVkVORE9SX01JTgkwCisjZGVmaW5lIEZMQVNIX1ZFTkRPUl9NQVgJMgorCitzdHJ1Y3QgYXRsMl9vcHRpb24geworCWVudW0geyBlbmFibGVfb3B0aW9uLCByYW5nZV9vcHRpb24sIGxpc3Rfb3B0aW9uIH0gdHlwZTsKKwljaGFyICpuYW1lOworCWNoYXIgKmVycjsKKwlpbnQgIGRlZjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIHJhbmdlX29wdGlvbiBpbmZvICovCisJCQlpbnQgbWluOworCQkJaW50IG1heDsKKwkJfSByOworCQlzdHJ1Y3QgeyAvKiBsaXN0X29wdGlvbiBpbmZvICovCisJCQlpbnQgbnI7CisJCQlzdHJ1Y3QgYXRsMl9vcHRfbGlzdCB7IGludCBpOyBjaGFyICpzdHI7IH0gKnA7CisJCX0gbDsKKwl9IGFyZzsKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bDJfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBhdGwyX29wdGlvbiAqb3B0KQoreworCWludCBpOworCXN0cnVjdCBhdGwyX29wdF9saXN0ICplbnQ7CisKKwlpZiAoKnZhbHVlID09IE9QVElPTl9VTlNFVCkgeworCQkqdmFsdWUgPSBvcHQtPmRlZjsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChvcHQtPnR5cGUpIHsKKwljYXNlIGVuYWJsZV9vcHRpb246CisJCXN3aXRjaCAoKnZhbHVlKSB7CisJCWNhc2UgT1BUSU9OX0VOQUJMRUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBFbmFibGVkXG4iLCBvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSBPUFRJT05fRElTQUJMRUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBEaXNhYmxlZFxuIiwgb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSByYW5nZV9vcHRpb246CisJCWlmICgqdmFsdWUgPj0gb3B0LT5hcmcuci5taW4gJiYgKnZhbHVlIDw9IG9wdC0+YXJnLnIubWF4KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBzZXQgdG8gJWlcbiIsIG9wdC0+bmFtZSwgKnZhbHVlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgbGlzdF9vcHRpb246CisJCWZvciAoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07CisJCQlpZiAoKnZhbHVlID09IGVudC0+aSkgeworCQkJCWlmIChlbnQtPnN0clswXSAhPSAnXDAnKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgZW50LT5zdHIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiSW52YWxpZCAlcyBzcGVjaWZpZWQgKCVpKSAlc1xuIiwKKwkJb3B0LT5uYW1lLCAqdmFsdWUsIG9wdC0+ZXJyKTsKKwkqdmFsdWUgPSBvcHQtPmRlZjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBhdGwyX2NoZWNrX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgYWxsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGZvciB2YWxpZCB1c2VyCisgKiBpbnB1dC4gIElmIGFuIGludmFsaWQgdmFsdWUgaXMgZ2l2ZW4sIG9yIGlmIG5vIHVzZXIgc3BlY2lmaWVkCisgKiB2YWx1ZSBleGlzdHMsIGEgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLiAgVGhlIGZpbmFsIHZhbHVlIGlzIHN0b3JlZAorICogaW4gYSB2YXJpYWJsZSBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdGwyX2NoZWNrX29wdGlvbnMoc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgdmFsOworCXN0cnVjdCBhdGwyX29wdGlvbiBvcHQ7CisJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOworCWlmIChiZCA+PSBBVEwyX01BWF9OSUMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJXYXJuaW5nOiBubyBjb25maWd1cmF0aW9uIGZvciBib2FyZCAjJWlcbiIsCisJCQliZCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgZGVmYXVsdHMgZm9yIGFsbCB2YWx1ZXNcbiIpOworI2lmbmRlZiBtb2R1bGVfcGFyYW1fYXJyYXkKKwkJYmQgPSBBVEwyX01BWF9OSUM7CisjZW5kaWYKKwl9CisKKwkvKiBCeXRlcyBvZiBUcmFuc21pdCBNZW1vcnkgKi8KKwlvcHQudHlwZSA9IHJhbmdlX29wdGlvbjsKKwlvcHQubmFtZSA9ICJCeXRlcyBvZiBUcmFuc21pdCBNZW1vcnkiOworCW9wdC5lcnIgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhBVEwyX0RFRkFVTFRfVFhfTUVNU0laRSk7CisJb3B0LmRlZiA9IEFUTDJfREVGQVVMVF9UWF9NRU1TSVpFOworCW9wdC5hcmcuci5taW4gPSBBVEwyX01JTl9UWF9NRU1TSVpFOworCW9wdC5hcmcuci5tYXggPSBBVEwyX01BWF9UWF9NRU1TSVpFOworI2lmZGVmIG1vZHVsZV9wYXJhbV9hcnJheQorCWlmIChudW1fVHhNZW1TaXplID4gYmQpIHsKKyNlbmRpZgorCQl2YWwgPSBUeE1lbVNpemVbYmRdOworCQlhdGwyX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0KTsKKwkJYWRhcHRlci0+dHhkX3Jpbmdfc2l6ZSA9ICgodTMyKSB2YWwpICogMTAyNDsKKyNpZmRlZiBtb2R1bGVfcGFyYW1fYXJyYXkKKwl9IGVsc2UKKwkJYWRhcHRlci0+dHhkX3Jpbmdfc2l6ZSA9ICgodTMyKW9wdC5kZWYpICogMTAyNDsKKyNlbmRpZgorCS8qIHR4cyByaW5nIHNpemU6ICovCisJYWRhcHRlci0+dHhzX3Jpbmdfc2l6ZSA9IGFkYXB0ZXItPnR4ZF9yaW5nX3NpemUgLyAxMjg7CisJaWYgKGFkYXB0ZXItPnR4c19yaW5nX3NpemUgPiAxNjApCisJCWFkYXB0ZXItPnR4c19yaW5nX3NpemUgPSAxNjA7CisKKwkvKiBSZWNlaXZlIE1lbW9yeSBCbG9jayBDb3VudCAqLworCW9wdC50eXBlID0gcmFuZ2Vfb3B0aW9uOworCW9wdC5uYW1lID0gIk51bWJlciBvZiByZWNlaXZlIG1lbW9yeSBibG9jayI7CisJb3B0LmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKEFUTDJfREVGQVVMVF9SWERfQ09VTlQpOworCW9wdC5kZWYgPSBBVEwyX0RFRkFVTFRfUlhEX0NPVU5UOworCW9wdC5hcmcuci5taW4gPSBBVEwyX01JTl9SWERfQ09VTlQ7CisJb3B0LmFyZy5yLm1heCA9IEFUTDJfTUFYX1JYRF9DT1VOVDsKKyNpZmRlZiBtb2R1bGVfcGFyYW1fYXJyYXkKKwlpZiAobnVtX1J4TWVtQmxvY2sgPiBiZCkgeworI2VuZGlmCisJCXZhbCA9IFJ4TWVtQmxvY2tbYmRdOworCQlhdGwyX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0KTsKKwkJYWRhcHRlci0+cnhkX3Jpbmdfc2l6ZSA9ICh1MzIpdmFsOworCQkvKiBGSVhNRSAqLworCQkvKiAoKHUxNil2YWwpJn4xOyAqLwkvKiBldmVuIG51bWJlciAqLworI2lmZGVmIG1vZHVsZV9wYXJhbV9hcnJheQorCX0gZWxzZQorCQlhZGFwdGVyLT5yeGRfcmluZ19zaXplID0gKHUzMilvcHQuZGVmOworI2VuZGlmCisJLyogaW5pdCBSWEQgRmxvdyBjb250cm9sIHZhbHVlICovCisJYWRhcHRlci0+aHcuZmNfcnhkX2hpID0gKGFkYXB0ZXItPnJ4ZF9yaW5nX3NpemUgLyA4KSAqIDc7CisJYWRhcHRlci0+aHcuZmNfcnhkX2xvID0gKEFUTDJfTUlOX1JYRF9DT1VOVCAvIDgpID4KKwkJKGFkYXB0ZXItPnJ4ZF9yaW5nX3NpemUgLyAxMikgPyAoQVRMMl9NSU5fUlhEX0NPVU5UIC8gOCkgOgorCQkoYWRhcHRlci0+cnhkX3Jpbmdfc2l6ZSAvIDEyKTsKKworCS8qIEludGVycnVwdCBNb2RlcmF0ZSBUaW1lciAqLworCW9wdC50eXBlID0gcmFuZ2Vfb3B0aW9uOworCW9wdC5uYW1lID0gIkludGVycnVwdCBNb2RlcmF0ZSBUaW1lciI7CisJb3B0LmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKElOVF9NT0RfREVGQVVMVF9DTlQpOworCW9wdC5kZWYgPSBJTlRfTU9EX0RFRkFVTFRfQ05UOworCW9wdC5hcmcuci5taW4gPSBJTlRfTU9EX01JTl9DTlQ7CisJb3B0LmFyZy5yLm1heCA9IElOVF9NT0RfTUFYX0NOVDsKKyNpZmRlZiBtb2R1bGVfcGFyYW1fYXJyYXkKKwlpZiAobnVtX0ludE1vZFRpbWVyID4gYmQpIHsKKyNlbmRpZgorCQl2YWwgPSBJbnRNb2RUaW1lcltiZF07CisJCWF0bDJfdmFsaWRhdGVfb3B0aW9uKCZ2YWwsICZvcHQpOworCQlhZGFwdGVyLT5pbXQgPSAodTE2KSB2YWw7CisjaWZkZWYgbW9kdWxlX3BhcmFtX2FycmF5CisJfSBlbHNlCisJCWFkYXB0ZXItPmltdCA9ICh1MTYpKG9wdC5kZWYpOworI2VuZGlmCisJLyogRmxhc2ggVmVuZG9yICovCisJb3B0LnR5cGUgPSByYW5nZV9vcHRpb247CisJb3B0Lm5hbWUgPSAiU1BJIEZsYXNoIFZlbmRvciI7CisJb3B0LmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKEZMQVNIX1ZFTkRPUl9ERUZBVUxUKTsKKwlvcHQuZGVmID0gRkxBU0hfVkVORE9SX0RFRkFVTFQ7CisJb3B0LmFyZy5yLm1pbiA9IEZMQVNIX1ZFTkRPUl9NSU47CisJb3B0LmFyZy5yLm1heCA9IEZMQVNIX1ZFTkRPUl9NQVg7CisjaWZkZWYgbW9kdWxlX3BhcmFtX2FycmF5CisJaWYgKG51bV9GbGFzaFZlbmRvciA+IGJkKSB7CisjZW5kaWYKKwkJdmFsID0gRmxhc2hWZW5kb3JbYmRdOworCQlhdGwyX3ZhbGlkYXRlX29wdGlvbigmdmFsLCAmb3B0KTsKKwkJYWRhcHRlci0+aHcuZmxhc2hfdmVuZG9yID0gKHU4KSB2YWw7CisjaWZkZWYgbW9kdWxlX3BhcmFtX2FycmF5CisJfSBlbHNlCisJCWFkYXB0ZXItPmh3LmZsYXNoX3ZlbmRvciA9ICh1OCkob3B0LmRlZik7CisjZW5kaWYKKwkvKiBNZWRpYVR5cGUgKi8KKwlvcHQudHlwZSA9IHJhbmdlX29wdGlvbjsKKwlvcHQubmFtZSA9ICJTcGVlZC9EdXBsZXggU2VsZWN0aW9uIjsKKwlvcHQuZXJyID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoTUVESUFfVFlQRV9BVVRPX1NFTlNPUik7CisJb3B0LmRlZiA9IE1FRElBX1RZUEVfQVVUT19TRU5TT1I7CisJb3B0LmFyZy5yLm1pbiA9IE1FRElBX1RZUEVfQVVUT19TRU5TT1I7CisJb3B0LmFyZy5yLm1heCA9IE1FRElBX1RZUEVfMTBNX0hBTEY7CisjaWZkZWYgbW9kdWxlX3BhcmFtX2FycmF5CisJaWYgKG51bV9NZWRpYVR5cGUgPiBiZCkgeworI2VuZGlmCisJCXZhbCA9IE1lZGlhVHlwZVtiZF07CisJCWF0bDJfdmFsaWRhdGVfb3B0aW9uKCZ2YWwsICZvcHQpOworCQlhZGFwdGVyLT5ody5NZWRpYVR5cGUgPSAodTE2KSB2YWw7CisjaWZkZWYgbW9kdWxlX3BhcmFtX2FycmF5CisJfSBlbHNlCisJCWFkYXB0ZXItPmh3Lk1lZGlhVHlwZSA9ICh1MTYpKG9wdC5kZWYpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGx4L2F0bDIuaCBiL2RyaXZlcnMvbmV0L2F0bHgvYXRsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTc0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGx4L2F0bDIuaApAQCAtMCwwICsxLDUyOSBAQAorLyogYXRsMi5oIC0tIGF0bDIgZHJpdmVyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgQXRoZXJvcyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA2IHhpb25nIGh1YW5nIDx4aW9uZy5odWFuZ0BhdGhlcm9zLmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA3IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVRMMl9IXworI2RlZmluZSBfQVRMMl9IXworCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaWZuZGVmIF9BVEwyX0hXX0hfCisjZGVmaW5lIF9BVEwyX0hXX0hfCisKKyNpZm5kZWYgX0FUTDJfT1NERVBfSF8KKyNkZWZpbmUgX0FUTDJfT1NERVBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgImF0bHguaCIKKworI2lmZGVmIEVUSFRPT0xfT1BTX0NPTVBBVAorZXh0ZXJuIGludCBldGh0b29sX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyKTsKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9DT01NQU5EX1JFR0lTVEVSCVBDSV9DT01NQU5ECisjZGVmaW5lIENNRF9NRU1fV1JUX0lOVkFMSURBVEUJUENJX0NPTU1BTkRfSU5WQUxJREFURQorI2RlZmluZSBFVEhfQUREUl9MRU4JCUVUSF9BTEVOCisKKyNkZWZpbmUgQVRMMl9XUklURV9SRUcoYSwgcmVnLCB2YWx1ZSkgKGlvd3JpdGUzMigodmFsdWUpLCBcCisJKChhKS0+aHdfYWRkciArIChyZWcpKSkpCisKKyNkZWZpbmUgQVRMMl9XUklURV9GTFVTSChhKSAoaW9yZWFkMzIoKGEpLT5od19hZGRyKSkKKworI2RlZmluZSBBVEwyX1JFQURfUkVHKGEsIHJlZykgKGlvcmVhZDMyKChhKS0+aHdfYWRkciArIChyZWcpKSkKKworI2RlZmluZSBBVEwyX1dSSVRFX1JFR0IoYSwgcmVnLCB2YWx1ZSkgKGlvd3JpdGU4KCh2YWx1ZSksIFwKKwkoKGEpLT5od19hZGRyICsgKHJlZykpKSkKKworI2RlZmluZSBBVEwyX1JFQURfUkVHQihhLCByZWcpIChpb3JlYWQ4KChhKS0+aHdfYWRkciArIChyZWcpKSkKKworI2RlZmluZSBBVEwyX1dSSVRFX1JFR1coYSwgcmVnLCB2YWx1ZSkgKGlvd3JpdGUxNigodmFsdWUpLCBcCisJKChhKS0+aHdfYWRkciArIChyZWcpKSkpCisKKyNkZWZpbmUgQVRMMl9SRUFEX1JFR1coYSwgcmVnKSAoaW9yZWFkMTYoKGEpLT5od19hZGRyICsgKHJlZykpKQorCisjZGVmaW5lIEFUTDJfV1JJVEVfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0LCB2YWx1ZSkgXAorCShpb3dyaXRlMzIoKHZhbHVlKSwgKCgoYSktPmh3X2FkZHIgKyAocmVnKSkgKyAoKG9mZnNldCkgPDwgMikpKSkKKworI2RlZmluZSBBVEwyX1JFQURfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0KSBcCisJKGlvcmVhZDMyKCgoYSktPmh3X2FkZHIgKyAocmVnKSkgKyAoKG9mZnNldCkgPDwgMikpKQorCisjZW5kaWYgLyogX0FUTDJfT1NERVBfSF8gKi8KKworc3RydWN0IGF0bDJfYWRhcHRlcjsKK3N0cnVjdCBhdGwyX2h3OworCisvKiBmdW5jdGlvbiBwcm90b3R5cGUgKi8KK3N0YXRpYyBzMzIgYXRsMl9yZXNldF9odyhzdHJ1Y3QgYXRsMl9odyAqaHcpOworc3RhdGljIHMzMiBhdGwyX3JlYWRfbWFjX2FkZHIoc3RydWN0IGF0bDJfaHcgKmh3KTsKK3N0YXRpYyBzMzIgYXRsMl9pbml0X2h3KHN0cnVjdCBhdGwyX2h3ICpodyk7CitzdGF0aWMgczMyIGF0bDJfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGF0bDJfaHcgKmh3LCB1MTYgKnNwZWVkLAorCXUxNiAqZHVwbGV4KTsKK3N0YXRpYyB1MzIgYXRsMl9oYXNoX21jX2FkZHIoc3RydWN0IGF0bDJfaHcgKmh3LCB1OCAqbWNfYWRkcik7CitzdGF0aWMgdm9pZCBhdGwyX2hhc2hfc2V0KHN0cnVjdCBhdGwyX2h3ICpodywgdTMyIGhhc2hfdmFsdWUpOworc3RhdGljIHMzMiBhdGwyX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgYXRsMl9odyAqaHcsIHUxNiByZWdfYWRkciwgdTE2ICpwaHlfZGF0YSk7CitzdGF0aWMgczMyIGF0bDJfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgYXRsMl9odyAqaHcsIHUzMiByZWdfYWRkciwgdTE2IHBoeV9kYXRhKTsKK3N0YXRpYyB2b2lkIGF0bDJfcmVhZF9wY2lfY2ZnKHN0cnVjdCBhdGwyX2h3ICpodywgdTMyIHJlZywgdTE2ICp2YWx1ZSk7CitzdGF0aWMgdm9pZCBhdGwyX3dyaXRlX3BjaV9jZmcoc3RydWN0IGF0bDJfaHcgKmh3LCB1MzIgcmVnLCB1MTYgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIGF0bDJfc2V0X21hY19hZGRyKHN0cnVjdCBhdGwyX2h3ICpodyk7CitzdGF0aWMgYm9vbCBhdGwyX3JlYWRfZWVwcm9tKHN0cnVjdCBhdGwyX2h3ICpodywgdTMyIE9mZnNldCwgdTMyICpwVmFsdWUpOworc3RhdGljIGJvb2wgYXRsMl93cml0ZV9lZXByb20oc3RydWN0IGF0bDJfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpOworc3RhdGljIHMzMiBhdGwyX3BoeV9pbml0KHN0cnVjdCBhdGwyX2h3ICpodyk7CitzdGF0aWMgaW50IGF0bDJfY2hlY2tfZWVwcm9tX2V4aXN0KHN0cnVjdCBhdGwyX2h3ICpodyk7CitzdGF0aWMgdm9pZCBhdGwyX2ZvcmNlX3BzKHN0cnVjdCBhdGwyX2h3ICpodyk7CisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb24gKi8KKworLyogQmxvY2sgSURMRSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSURMRV9TVEFUVVNfUlhNQUMJMQkvKiAxOiBSWE1BQyBpcyBub24tSURMRSAqLworI2RlZmluZSBJRExFX1NUQVRVU19UWE1BQwkyCS8qIDE6IFRYTUFDIGlzIG5vbi1JRExFICovCisjZGVmaW5lIElETEVfU1RBVFVTX0RNQVIJOAkvKiAxOiBETUFSIGlzIG5vbi1JRExFICovCisjZGVmaW5lIElETEVfU1RBVFVTX0RNQVcJNAkvKiAxOiBETUFXIGlzIG5vbi1JRExFICovCisKKy8qIE1ESU8gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNRElPX1dBSVRfVElNRVMJCTEwCisKKy8qIE1BQyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1BQ19DVFJMX0RCR19UWF9CS1BSRVNVUkUJMHgxMDAwMDAJLyogMTogVFggbWF4IGJhY2tvZmYgKi8KKyNkZWZpbmUgTUFDX0NUUkxfTUFDTFBfQ0xLX1BIWQkJMHg4MDAwMDAwCS8qIDE6IDI1TUh6IGZyb20gcGh5ICovCisjZGVmaW5lIE1BQ19DVFJMX0hBTEZfTEVGVF9CVUZfU0hJRlQJMjgKKyNkZWZpbmUgTUFDX0NUUkxfSEFMRl9MRUZUX0JVRl9NQVNLCTB4RgkJLyogTUFDIHJldHJ5IGJ1ZiB4MzJCICovCisKKy8qIEludGVybmFsIFNSQU0gUGFydGl0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19TUkFNX1RYUkFNX0VORAkweDE1MDAJLyogSW50ZXJuYWwgdGFpbCBhZGRyZXNzIG9mIFRYUkFNCisJCQkJCSAqIGRlZmF1bHQ6IDJieXRlKjEwMjQgKi8KKyNkZWZpbmUgUkVHX1NSQU1fUlhSQU1fRU5ECTB4MTUwMgkvKiBJbnRlcm5hbCB0YWlsIGFkZHJlc3Mgb2YgUlhSQU0KKwkJCQkJICogZGVmYXVsdDogMmJ5dGUqMTAyNCAqLworCisvKiBEZXNjcmlwdG9yIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RYRF9CQVNFX0FERFJfTE8JMHgxNTQ0CS8qIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIFRyYW5zbWl0CisJCQkJCSAqIERhdGEgTWVtIGxvdyAzMi1iaXQoZHdvcmQgYWxpZ24pICovCisjZGVmaW5lIFJFR19UWERfTUVNX1NJWkUJMHgxNTQ4CS8qIFRyYW5zbWl0IERhdGEgTWVtb3J5IHNpemUoYnkKKwkJCQkJICogZG91YmxlIHdvcmQgLCBtYXggMjU2S0IpICovCisjZGVmaW5lIFJFR19UWFNfQkFTRV9BRERSX0xPCTB4MTU0QwkvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBUcmFuc21pdAorCQkJCQkgKiBTdGF0dXMgTWVtb3J5IGxvdyAzMi1iaXQoZHdvcmQgd29yZAorCQkJCQkgKiBhbGlnbikgKi8KKyNkZWZpbmUgUkVHX1RYU19NRU1fU0laRQkweDE1NTAJLyogZG91YmxlIHdvcmQgdW5pdCwgbWF4IDQqMjA0NworCQkJCQkgKiBieXRlcy4gKi8KKyNkZWZpbmUgUkVHX1JYRF9CQVNFX0FERFJfTE8JMHgxNTU0CS8qIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIFRyYW5zbWl0CisJCQkJCSAqIFN0YXR1cyBNZW1vcnkgbG93IDMyLWJpdCh1bml0IDgKKwkJCQkJICogYnl0ZXMpICovCisjZGVmaW5lIFJFR19SWERfQlVGX05VTQkJMHgxNTU4CS8qIFJlY2VpdmUgRGF0YSAmIFN0YXR1cyBNZW1vcnkgYnVmZmVyCisJCQkJCSAqIG51bWJlciAodW5pdCAxNTM2Ynl0ZXMsIG1heAorCQkJCQkgKiAxNTM2KjIwNDcpICovCisKKy8qIERNQVIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfRE1BUgkweDE1ODAKKyNkZWZpbmUgICAgIERNQVJfRU4JMHgxCS8qIDE6IEVuYWJsZSBETUFSICovCisKKy8qIFRYIEN1ci1UaHJvdWdoIChlYXJseSB0eCB0aHJlc2hvbGQpIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RYX0NVVF9USFJFU0gJMHgxNTkwCS8qIFR4TWFjIGJlZ2luIHRyYW5zbWl0IHBhY2tldAorCQkJCQkgKiB0aHJlc2hvbGQodW5pdCB3b3JkKSAqLworCisvKiBETUFXIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0RNQVcJMHgxNUEwCisjZGVmaW5lICAgICBETUFXX0VOCTB4MQorCisvKiBGbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1BBVVNFX09OX1RICQkweDE1QTgJLyogUlhEIGhpZ2ggd2F0ZXJtYXJrIG9mIG92ZXJmbG93CisJCQkJCSAqIHRocmVzaG9sZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19QQVVTRV9PRkZfVEgJMHgxNUFBCS8qIFJYRCBsb3dlciB3YXRlcm1hcmsgb2Ygb3ZlcmZsb3cKKwkJCQkJICogdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKworLyogTWFpbGJveCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTUJfVFhEX1dSX0lEWAkweDE1ZjAJLyogZG91YmxlIHdvcmQgYWxpZ24gKi8KKyNkZWZpbmUgUkVHX01CX1JYRF9SRF9JRFgJMHgxNUY0CS8qIFJYRCBSZWFkIGluZGV4ICh1bml0OiAxNTM2YnlldHMpICovCisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVNSX1RJTUVSCTEJLyogSW50ZXJydXB0IHdoZW4gVGltZXIgY291bnRzIGRvd24gdG8gemVybyAqLworI2RlZmluZSBJU1JfTUFOVUFMCTIJLyogU29mdHdhcmUgbWFudWFsIGludGVycnVwdCwgZm9yIGRlYnVnLiBTZXQKKwkJCQkgKiB3aGVuIFNXX01BTl9JTlRfRU4gaXMgc2V0IGluIFRhYmxlIDUxCisJCQkJICogU2VsZW5lIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyCisJCQkJICogKE9mZnNldCAweDE0MDApLiAqLworI2RlZmluZSBJU1JfUlhGX09WCTQJLyogUlhGIG92ZXJmbG93IGludGVycnVwdCAqLworI2RlZmluZSBJU1JfVFhGX1VSCTgJLyogVFhGIHVuZGVycnVuIGludGVycnVwdCAqLworI2RlZmluZSBJU1JfVFhTX09WCTB4MTAJLyogSW50ZXJuYWwgdHJhbnNtaXQgc3RhdHVzIGJ1ZmZlciBmdWxsCisJCQkJICogaW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9SWFNfT1YJMHgyMAkvKiBJbnRlcm5hbCByZWNlaXZlIHN0YXR1cyBidWZmZXIgZnVsbAorCQkJCSAqIGludGVycnVwdCAqLworI2RlZmluZSBJU1JfTElOS19DSEcJMHg0MAkvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9IT1NUX1RYRF9VUgkweDgwCisjZGVmaW5lIElTUl9IT1NUX1JYRF9PVgkweDEwMAkvKiBIb3N0IHJ4IGRhdGEgbWVtb3J5IGZ1bGwgLCBvbmUgcHVsc2UgKi8KKyNkZWZpbmUgSVNSX0RNQVJfVE9fUlNUCTB4MjAwCS8qIERNQVIgb3AgdGltZW91dCBpbnRlcnJ1cHQuIFNXIHNob3VsZAorCQkJCSAqIGRvIFJlc2V0ICovCisjZGVmaW5lIElTUl9ETUFXX1RPX1JTVAkweDQwMAorI2RlZmluZSBJU1JfUEhZCQkweDgwMAkvKiBwaHkgaW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9UU19VUERBVEUJMHgxMDAwMAkvKiBpbnRlcnJ1cHQgYWZ0ZXIgbmV3IHR4IHBrdCBzdGF0dXMgd3JpdHRlbgorCQkJCSAqIHRvIGhvc3QgKi8KKyNkZWZpbmUgSVNSX1JTX1VQREFURQkweDIwMDAwCS8qIGludGVycnVwdCBhdGVyIG5ldyByeCBwa3Qgc3RhdHVzIHdyaXR0ZW4KKwkJCQkgKiB0byBob3N0LiAqLworI2RlZmluZSBJU1JfVFhfRUFSTFkJMHg0MDAwMAkvKiBpbnRlcnJ1cHQgd2hlbiB0eG1hYyBiZWdpbiB0cmFuc21pdCBvbmUKKwkJCQkgKiBwYWNrZXQgKi8KKworI2RlZmluZSBJU1JfVFhfRVZFTlQgKElTUl9UWEZfVVIgfCBJU1JfVFhTX09WIHwgSVNSX0hPU1RfVFhEX1VSIHxcCisJSVNSX1RTX1VQREFURSB8IElTUl9UWF9FQVJMWSkKKyNkZWZpbmUgSVNSX1JYX0VWRU5UIChJU1JfUlhGX09WIHwgSVNSX1JYU19PViB8IElTUl9IT1NUX1JYRF9PViB8XAorCSBJU1JfUlNfVVBEQVRFKQorCisjZGVmaW5lIElNUl9OT1JNQUxfTUFTSwkJKFwKKwkvKklTUl9MSU5LX0NIRwkJfCovXAorCUlTUl9NQU5VQUwJCXxcCisJSVNSX0RNQVJfVE9fUlNUCQl8XAorCUlTUl9ETUFXX1RPX1JTVAkJfFwKKwlJU1JfUEhZCQkJfFwKKwlJU1JfUEhZX0xJTktET1dOCXxcCisJSVNSX1RTX1VQREFURQkJfFwKKwlJU1JfUlNfVVBEQVRFKQorCisvKiBSZWNlaXZlIE1BQyBTdGF0aXN0aWNzIFJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfU1RTX1JYX1BBVVNFCTB4MTcwMAkvKiBOdW0gcGF1c2UgcGFja2V0cyByZWNlaXZlZCAqLworI2RlZmluZSBSRUdfU1RTX1JYRF9PVgkJMHgxNzA0CS8qIE51bSBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gUlgKKwkJCQkJICogRklGTyBvdmVyZmxvdyAqLworI2RlZmluZSBSRUdfU1RTX1JYU19PVgkJMHgxNzA4CS8qIE51bSBmcmFtZXMgZHJvcHBlZCBkdWUgdG8gUlgKKwkJCQkJICogU3RhdHVzIEJ1ZmZlciBPdmVyZmxvdyAqLworI2RlZmluZSBSRUdfU1RTX1JYX0ZJTFRFUgkweDE3MEMJLyogTnVtIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8KKwkJCQkJICogYWRkcmVzcyBmaWx0ZXJpbmcgKi8KKworLyogTUlJIGRlZmluaXRpb25zICovCisKKy8qIFBIWSBDb21tb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NNQVJUU1BFRUQJMHgxNAorI2RlZmluZSBNSUlfREJHX0FERFIJMHgxRAorI2RlZmluZSBNSUlfREJHX0RBVEEJMHgxRQorCisvKiBQQ0kgQ29tbWFuZCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUENJX1JFR19DT01NQU5ECQkweDA0CisjZGVmaW5lIENNRF9JT19TUEFDRQkJMHgwMDAxCisjZGVmaW5lIENNRF9NRU1PUllfU1BBQ0UJMHgwMDAyCisjZGVmaW5lIENNRF9CVVNfTUFTVEVSCQkweDAwMDQKKworI2RlZmluZSBNRURJQV9UWVBFXzEwME1fRlVMTAkxCisjZGVmaW5lIE1FRElBX1RZUEVfMTAwTV9IQUxGCTIKKyNkZWZpbmUgTUVESUFfVFlQRV8xME1fRlVMTAkzCisjZGVmaW5lIE1FRElBX1RZUEVfMTBNX0hBTEYJNAorCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQJMHgwMDBGCS8qIEV2ZXJ5dGhpbmcgKi8KKworLyogVGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGV0aGVybmV0IHBhY2tldCAqLworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFCQkxNAorI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJMTUxOAkvKiB3aXRoIEZDUyAqLworI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJNjQJLyogd2l0aCBGQ1MgKi8KKyNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUJCTQKKyNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUJCTB4MjAwMAorI2RlZmluZSBWTEFOX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKworc3RydWN0IHR4X3BrdF9oZWFkZXIgeworCXVuc2lnbmVkIHBrdF9zaXplOjExOworCXVuc2lnbmVkOjQ7CQkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnNfdmxhbjoxOwkJLyogdHhtYWMgc2hvdWxkIGluc2VydCB2bGFuICovCisJdW5zaWduZWQgc2hvcnQgdmxhbjsJCS8qIHZsYW4gdGFnICovCit9OworLyogRklYTUU6IHJlcGxhY2UgYWJvdmUgYml0ZmllbGRzIHdpdGggTUFTSy9TSElGVCBkZWZpbmVzIGJlbG93ICovCisjZGVmaW5lIFRYX1BLVF9IRUFERVJfU0laRV9NQVNLCQkweDdGRgorI2RlZmluZSBUWF9QS1RfSEVBREVSX1NJWkVfU0hJRlQJMAorI2RlZmluZSBUWF9QS1RfSEVBREVSX0lOU19WTEFOX01BU0sJMHgxCisjZGVmaW5lIFRYX1BLVF9IRUFERVJfSU5TX1ZMQU5fU0hJRlQJMTUKKyNkZWZpbmUgVFhfUEtUX0hFQURFUl9WTEFOX1RBR19NQVNLCTB4RkZGRgorI2RlZmluZSBUWF9QS1RfSEVBREVSX1ZMQU5fVEFHX1NISUZUCTE2CisKK3N0cnVjdCB0eF9wa3Rfc3RhdHVzIHsKKwl1bnNpZ25lZCBwa3Rfc2l6ZToxMTsKKwl1bnNpZ25lZDo1OwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBvazoxOwkJLyogY3VycmVudCBwYWNrZXQgdHJhbnNtaXR0ZWQgd2l0aG91dCBlcnJvciAqLworCXVuc2lnbmVkIGJjYXN0OjE7CS8qIGJyb2FkY2FzdCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBtY2FzdDoxOwkvKiBtdWx0aWNhc3QgcGFja2V0ICovCisJdW5zaWduZWQgcGF1c2U6MTsJLyogdHJhbnNtaWl0ZWQgYSBwYXVzZSBmcmFtZSAqLworCXVuc2lnbmVkIGN0cmw6MTsKKwl1bnNpZ25lZCBkZWZlcjoxOyAgICAJLyogY3VycmVudCBwYWNrZXQgaXMgeG1pdHRlZCB3aXRoIGRlZmVyICovCisJdW5zaWduZWQgZXhjX2RlZmVyOjE7CisJdW5zaWduZWQgc2luZ2xlX2NvbDoxOworCXVuc2lnbmVkIG11bHRpX2NvbDoxOworCXVuc2lnbmVkIGxhdGVfY29sOjE7CisJdW5zaWduZWQgYWJvcnRfY29sOjE7CisJdW5zaWduZWQgdW5kZXJ1bjoxOwkvKiBjdXJyZW50IHBhY2tldCBpcyBhYm9ydGVkCisJCQkJICogZHVlIHRvIHR4cmFtIHVuZGVycnVuICovCisJdW5zaWduZWQ6MzsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgdXBkYXRlOjE7CS8qIGFsd2F5cyAxJ2IxIGluIHR4X3N0YXR1c19idWYgKi8KK307CisvKiBGSVhNRTogcmVwbGFjZSBhYm92ZSBiaXRmaWVsZHMgd2l0aCBNQVNLL1NISUZUIGRlZmluZXMgYmVsb3cgKi8KKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19TSVpFX01BU0sJCTB4N0ZGCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfU0laRV9TSElGVAkwCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfT0tfTUFTSwkJMHgxCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfT0tfU0hJRlQJCTE2CisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfQkNBU1RfTUFTSwkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19CQ0FTVF9TSElGVAkxNworI2RlZmluZSBUWF9QS1RfU1RBVFVTX01DQVNUX01BU0sJMHgxCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfTUNBU1RfU0hJRlQJMTgKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19QQVVTRV9NQVNLCTB4MQorI2RlZmluZSBUWF9QS1RfU1RBVFVTX1BBVVNFX1NISUZUCTE5CisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfQ1RSTF9NQVNLCQkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19DVFJMX1NISUZUCTIwCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfREVGRVJfTUFTSwkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19ERUZFUl9TSElGVAkyMQorI2RlZmluZSBUWF9QS1RfU1RBVFVTX0VYQ19ERUZFUl9NQVNLCTB4MQorI2RlZmluZSBUWF9QS1RfU1RBVFVTX0VYQ19ERUZFUl9TSElGVAkyMgorI2RlZmluZSBUWF9QS1RfU1RBVFVTX1NJTkdMRV9DT0xfTUFTSwkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19TSU5HTEVfQ09MX1NISUZUCTIzCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfTVVMVElfQ09MX01BU0sJMHgxCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfTVVMVElfQ09MX1NISUZUCTI0CisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfTEFURV9DT0xfTUFTSwkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19MQVRFX0NPTF9TSElGVAkyNQorI2RlZmluZSBUWF9QS1RfU1RBVFVTX0FCT1JUX0NPTF9NQVNLCTB4MQorI2RlZmluZSBUWF9QS1RfU1RBVFVTX0FCT1JUX0NPTF9TSElGVAkyNgorI2RlZmluZSBUWF9QS1RfU1RBVFVTX1VOREVSUlVOX01BU0sJMHgxCisjZGVmaW5lIFRYX1BLVF9TVEFUVVNfVU5ERVJSVU5fU0hJRlQJMjcKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19VUERBVEVfTUFTSwkweDEKKyNkZWZpbmUgVFhfUEtUX1NUQVRVU19VUERBVEVfU0hJRlQJMzEKKworc3RydWN0IHJ4X3BrdF9zdGF0dXMgeworCXVuc2lnbmVkIHBrdF9zaXplOjExOwkvKiBwYWNrZXQgc2l6ZSwgbWF4IDIwNDcgYnl0ZXMgKi8KKwl1bnNpZ25lZDo1OwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBvazoxOwkJLyogY3VycmVudCBwYWNrZXQgcmVjZWl2ZWQgb2sgd2l0aG91dCBlcnJvciAqLworCXVuc2lnbmVkIGJjYXN0OjE7CS8qIGN1cnJlbnQgcGFja2V0IGlzIGJyb2FkY2FzdCAqLworCXVuc2lnbmVkIG1jYXN0OjE7CS8qIGN1cnJlbnQgcGFja2V0IGlzIG11bHRpY2FzdCAqLworCXVuc2lnbmVkIHBhdXNlOjE7CisJdW5zaWduZWQgY3RybDoxOworCXVuc2lnbmVkIGNyYzoxOwkJLyogcmVjZWl2ZWQgYSBwYWNrZXQgd2l0aCBjcmMgZXJyb3IgKi8KKwl1bnNpZ25lZCBjb2RlOjE7CS8qIHJlY2VpdmVkIGEgcGFja2V0IHdpdGggY29kZSBlcnJvciAqLworCXVuc2lnbmVkIHJ1bnQ6MTsJLyogcmVjZWl2ZWQgYSBwYWNrZXQgbGVzcyB0aGFuIDY0IGJ5dGVzCisJCQkJICogd2l0aCBnb29kIGNyYyAqLworCXVuc2lnbmVkIGZyYWc6MTsJLyogcmVjZWl2ZWQgYSBwYWNrZXQgbGVzcyB0aGFuIDY0IGJ5dGVzCisJCQkJICogd2l0aCBiYWQgY3JjICovCisJdW5zaWduZWQgdHJ1bmM6MTsJLyogY3VycmVudCBmcmFtZSB0cnVuY2F0ZWQgZHVlIHRvIHJ4cmFtIGZ1bGwgKi8KKwl1bnNpZ25lZCBhbGlnbjoxOwkvKiB0aGlzIHBhY2tldCBpcyBhbGlnbm1lbnQgZXJyb3IgKi8KKwl1bnNpZ25lZCB2bGFuOjE7CS8qIHRoaXMgcGFja2V0IGhhcyB2bGFuICovCisJdW5zaWduZWQ6MzsJCS8qIHJlc2VydmVkICovCisJdW5zaWduZWQgdXBkYXRlOjE7CisJdW5zaWduZWQgc2hvcnQgdnRhZzsJLyogdmxhbiB0YWcgKi8KKwl1bnNpZ25lZDoxNjsKK307CisvKiBGSVhNRTogcmVwbGFjZSBhYm92ZSBiaXRmaWVsZHMgd2l0aCBNQVNLL1NISUZUIGRlZmluZXMgYmVsb3cgKi8KKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19TSVpFX01BU0sJCTB4N0ZGCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfU0laRV9TSElGVAkwCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfT0tfTUFTSwkJMHgxCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfT0tfU0hJRlQJCTE2CisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfQkNBU1RfTUFTSwkweDEKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19CQ0FTVF9TSElGVAkxNworI2RlZmluZSBSWF9QS1RfU1RBVFVTX01DQVNUX01BU0sJMHgxCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfTUNBU1RfU0hJRlQJMTgKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19QQVVTRV9NQVNLCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1BBVVNFX1NISUZUCTE5CisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfQ1RSTF9NQVNLCQkweDEKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19DVFJMX1NISUZUCTIwCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfQ1JDX01BU0sJCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX0NSQ19TSElGVAkJMjEKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19DT0RFX01BU0sJCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX0NPREVfU0hJRlQJMjIKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19SVU5UX01BU0sJCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1JVTlRfU0hJRlQJMjMKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19GUkFHX01BU0sJCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX0ZSQUdfU0hJRlQJMjQKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19UUlVOS19NQVNLCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1RSVU5LX1NISUZUCTI1CisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfQUxJR05fTUFTSwkweDEKKyNkZWZpbmUgUlhfUEtUX1NUQVRVU19BTElHTl9TSElGVAkyNgorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1ZMQU5fTUFTSwkJMHgxCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfVkxBTl9TSElGVAkyNworI2RlZmluZSBSWF9QS1RfU1RBVFVTX1VQREFURV9NQVNLCTB4MQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1VQREFURV9TSElGVAkzMQorI2RlZmluZSBSWF9QS1RfU1RBVFVTX1ZMQU5fVEFHX01BU0sJMHhGRkZGCisjZGVmaW5lIFJYX1BLVF9TVEFUVVNfVkxBTl9UQUdfU0hJRlQJMzIKKworc3RydWN0IHJ4X2Rlc2MgeworCXN0cnVjdCByeF9wa3Rfc3RhdHVzCXN0YXR1czsKKwl1bnNpZ25lZCBjaGFyICAgICAJcGFja2V0WzE1MzYtc2l6ZW9mKHN0cnVjdCByeF9wa3Rfc3RhdHVzKV07Cit9OworCitlbnVtIGF0bDJfc3BlZWRfZHVwbGV4IHsKKwlhdGwyXzEwX2hhbGYgPSAwLAorCWF0bDJfMTBfZnVsbCA9IDEsCisJYXRsMl8xMDBfaGFsZiA9IDIsCisJYXRsMl8xMDBfZnVsbCA9IDMKK307CisKK3N0cnVjdCBhdGwyX3NwaV9mbGFzaF9kZXYgeworCWNvbnN0IGNoYXIgKm1hbnVfbmFtZTsJLyogbWFudWZhY3R1cmVyIGlkICovCisJLyogb3AtY29kZSAqLworCXU4IGNtZFdSU1I7CisJdTggY21kUkVBRDsKKwl1OCBjbWRQUk9HUkFNOworCXU4IGNtZFdSRU47CisJdTggY21kV1JESTsKKwl1OCBjbWRSRFNSOworCXU4IGNtZFJESUQ7CisJdTggY21kU0VDVE9SX0VSQVNFOworCXU4IGNtZENISVBfRVJBU0U7Cit9OworCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKGF0bDJfaHcuYykgKi8KK3N0cnVjdCBhdGwyX2h3IHsKKwl1OCBfX2lvbWVtICpod19hZGRyOworCXZvaWQgKmJhY2s7CisKKwl1OCBwcmVhbWJsZV9sZW47CisJdTggbWF4X3JldHJ5OyAgICAgICAgICAvKiBSZXRyYW5zbWlzc2lvbiBtYXhpbXVtLCBhZnRlcndhcmRzIHRoZQorCQkJCSogcGFja2V0IHdpbGwgYmUgZGlzY2FyZGVkLiAqLworCXU4IGphbV9pcGc7ICAgICAgICAgICAgLyogSVBHIHRvIHN0YXJ0IEpBTSBmb3IgY29sbGlzaW9uIGJhc2VkIGZsb3cKKwkJCQkqIGNvbnRyb2wgaW4gaGFsZi1kdXBsZXggbW9kZS4gSW4gdW5pdCBvZgorCQkJCSogOC1iaXQgdGltZS4gKi8KKwl1OCBpcGd0OyAgICAgICAgICAgICAgIC8qIERlc2lyZWQgYmFjayB0byBiYWNrIGludGVyLXBhY2tldCBnYXAuIFRoZQorCQkJCSogZGVmYXVsdCBpcyA5Ni1iaXQgdGltZS4gKi8KKwl1OCBtaW5faWZnOyAgICAgICAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIElGRyB0byBlbmZvcmNlIGluIGJldHdlZW4KKwkJCQkqIFJYIGZyYW1lcy4gRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQIGlzCisJCQkJKiBkcm9wcGVkLiAqLworCXU4IGlwZ3IxOyAgICAgICAgICAgICAgLyogNjRiaXQgQ2Fycmllci1TZW5zZSB3aW5kb3cgKi8KKwl1OCBpcGdyMjsgICAgICAgICAgICAgIC8qIDk2LWJpdCBJUEcgd2luZG93ICovCisJdTggcmV0cnlfYnVmOyAgICAgICAgICAvKiBXaGVuIGhhbGYtZHVwbGV4IG1vZGUsIHNob3VsZCBob2xkIHNvbWUKKwkJCQkqIGJ5dGVzIGZvciBtYWMgcmV0cnkgLiAoOCo0Ynl0ZXMgdW5pdCkgKi8KKworCXUxNiBmY19yeGRfaGk7CisJdTE2IGZjX3J4ZF9sbzsKKwl1MTYgbGNvbDsgICAgICAgICAgICAgIC8qIENvbGxpc2lvbiBXaW5kb3cgKi8KKwl1MTYgbWF4X2ZyYW1lX3NpemU7CisKKwl1MTYgTWVkaWFUeXBlOworCXUxNiBhdXRvbmVnX2FkdmVydGlzZWQ7CisJdTE2IHBjaV9jbWRfd29yZDsKKworCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOworCisJdTMyIG1lbV9yYW5nOworCXUzMiB0eGN3OworCXUzMiBtY19maWx0ZXJfdHlwZTsKKwl1MzIgbnVtX21jX2FkZHJzOworCXUzMiBjb2xsaXNpb25fZGVsdGE7CisJdTMyIHR4X3BhY2tldF9kZWx0YTsKKwl1MTYgcGh5X3NwZF9kZWZhdWx0OworCisJdTE2IGRldmljZV9pZDsKKwl1MTYgdmVuZG9yX2lkOworCXUxNiBzdWJzeXN0ZW1faWQ7CisJdTE2IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisJdTggcmV2aXNpb25faWQ7CisKKwkvKiBzcGkgZmxhc2ggKi8KKwl1OCBmbGFzaF92ZW5kb3I7CisKKwl1OCBkbWFfZmFpcm5lc3M7CisJdTggbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworCXU4IHBlcm1fbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworCisJLyogRklYTUUgKi8KKwkvKiBib29sIHBoeV9wcmVhbWJsZV9zdXA7ICovCisJYm9vbCBwaHlfY29uZmlndXJlZDsKK307CisKKyNlbmRpZiAvKiBfQVRMMl9IV19IXyAqLworCitzdHJ1Y3QgYXRsMl9yaW5nX2hlYWRlciB7CisgICAgLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLworICAgIHZvaWQgKmRlc2M7CisgICAgLyogcGh5c2ljYWwgYWRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKyAgICBkbWFfYWRkcl90IGRtYTsKKyAgICAvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCisgICAgdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgYXRsMl9hZGFwdGVyIHsKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKyNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisjZW5kaWYKKwl1MzIgd29sOworCXUxNiBsaW5rX3NwZWVkOworCXUxNiBsaW5rX2R1cGxleDsKKworCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF90YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2NoZ190YXNrOworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9jb25maWdfdGltZXI7CisKKwl1bnNpZ25lZCBsb25nIGNmZ19waHk7CisJYm9vbCBtYWNfZGlzYWJsZWQ7CisKKwkvKiBBbGwgRGVzY3JpcHRvciBtZW1vcnkgKi8KKwlkbWFfYWRkcl90CXJpbmdfZG1hOworCXZvaWQJCSpyaW5nX3Zpcl9hZGRyOworCWludAkJcmluZ19zaXplOworCisJc3RydWN0IHR4X3BrdF9oZWFkZXIJKnR4ZF9yaW5nOworCWRtYV9hZGRyX3QJdHhkX2RtYTsKKworCXN0cnVjdCB0eF9wa3Rfc3RhdHVzCSp0eHNfcmluZzsKKwlkbWFfYWRkcl90CXR4c19kbWE7CisKKwlzdHJ1Y3QgcnhfZGVzYwkqcnhkX3Jpbmc7CisJZG1hX2FkZHJfdAlyeGRfZG1hOworCisJdTMyIHR4ZF9yaW5nX3NpemU7ICAgICAgICAgLyogYnl0ZXMgcGVyIHVuaXQgKi8KKwl1MzIgdHhzX3Jpbmdfc2l6ZTsgICAgICAgICAvKiBkd29yZHMgcGVyIHVuaXQgKi8KKwl1MzIgcnhkX3Jpbmdfc2l6ZTsgICAgICAgICAvKiAxNTM2IGJ5dGVzIHBlciB1bml0ICovCisKKwkvKiByZWFkIC93cml0ZSBwdHI6ICovCisJLyogaG9zdCAqLworCXUzMiB0eGRfd3JpdGVfcHRyOworCXUzMiB0eHNfbmV4dF9jbGVhcjsKKwl1MzIgcnhkX3JlYWRfcHRyOworCisJLyogbmljICovCisJYXRvbWljX3QgdHhkX3JlYWRfcHRyOworCWF0b21pY190IHR4c193cml0ZV9wdHI7CisJdTMyIHJ4ZF93cml0ZV9wdHI7CisKKwkvKiBJbnRlcnJ1cHQgTW9kZXJhdG9yIHRpbWVyICggMnVzIHJlc29sdXRpb24pICovCisJdTE2IGltdDsKKwkvKiBJbnRlcnJ1cHQgQ2xlYXIgdGltZXIgKDJ1cyByZXNvbHV0aW9uKSAqLworCXUxNiBpY3Q7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIHN0cnVjdHMgZGVmaW5lZCBpbiBhdGwyX2h3LmggKi8KKwl1MzIgYmRfbnVtYmVyOyAgICAgLyogYm9hcmQgbnVtYmVyICovCisJYm9vbCBwY2lfdXNpbmdfNjQ7CisJYm9vbCBoYXZlX21zaTsKKwlzdHJ1Y3QgYXRsMl9odyBodzsKKworCXUzMiB1c3JfY21kOworCS8qIEZJWE1FICovCisJLyogdTMyIHJlZ3NfYnVmZltBVEwyX1JFR1NfTEVOXTsgKi8KKwl1MzIgcGNpX3N0YXRlWzE2XTsKKworCXUzMiAqY29uZmlnX3NwYWNlOworfTsKKworZW51bSBhdGwyX3N0YXRlX3QgeworCV9fQVRMMl9URVNUSU5HLAorCV9fQVRMMl9SRVNFVFRJTkcsCisJX19BVEwyX0RPV04KK307CisKKyNlbmRpZiAvKiBfQVRMMl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRseC9hdGx4LmMgYi9kcml2ZXJzL25ldC9hdGx4L2F0bHguYwppbmRleCBiM2U3ZmNmLi4zY2M5ZDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGx4L2F0bHguYworKysgYi9kcml2ZXJzL25ldC9hdGx4L2F0bHguYwpAQCAtMTA1LDcgKzEwNSw2IEBACiAJCQkJbmV0ZGV2LT5uYW1lKTsKIAkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwogCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJfQogCX0KIAlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwppbmRleCA1ZWUxYjA1Li4wMTliMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCkBAIC05NCw4ICs5NCw4IEBACiBzdGF0aWMgdm9pZCBhdTEwMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGludCBhdTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7Ci1zdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCB1MTYpOworc3RhdGljIGludCBhdTEwMDBfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGF1MTAwMF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCB1MTYpOwogc3RhdGljIHZvaWQgYXUxMDAwX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIHZvaWQgZW5hYmxlX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOwogCkBAIC0xOTEsNyArMTkxLDcgQEAKIC8qCiAgKiBNSUkgb3BlcmF0aW9ucwogICovCi1zdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWcpCitzdGF0aWMgaW50IGF1MTAwMF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCBpbnQgcmVnKQogewogCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CiAJdm9sYXRpbGUgdTMyICpjb25zdCBtaWlfY29udHJvbF9yZWcgPSAmYXVwLT5tYWMtPm1paV9jb250cm9sOwpAQCAtMjI1LDcgKzIyNSw4IEBACiAJcmV0dXJuIChpbnQpKm1paV9kYXRhX3JlZzsKIH0KIAotc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWcsIHUxNiB2YWx1ZSkKK3N0YXRpYyB2b2lkIGF1MTAwMF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwKKwkJCSAgICAgIGludCByZWcsIHUxNiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OwogCXZvbGF0aWxlIHUzMiAqY29uc3QgbWlpX2NvbnRyb2xfcmVnID0gJmF1cC0+bWFjLT5taWlfY29udHJvbDsKQEAgLTI0OSw3ICsyNTAsNyBAQAogCSptaWlfY29udHJvbF9yZWcgPSBtaWlfY29udHJvbDsKIH0KIAotc3RhdGljIGludCBtZGlvYnVzX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9hZGRyLCBpbnQgcmVnbnVtKQorc3RhdGljIGludCBhdTEwMDBfbWRpb2J1c19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ251bSkKIHsKIAkvKiBXQVJOSU5HOiBidXMtPnBoeV9tYXBbcGh5X2FkZHJdLmF0dGFjaGVkX2RldiA9PSBkZXYgZG9lcwogCSAqIF9OT1RfIGhvbGQgKGUuZy4gd2hlbiBQSFkgaXMgYWNjZXNzZWQgdGhyb3VnaCBvdGhlciBNQUMncyBNSUkgYnVzKSAqLwpAQCAtMjU3LDIxICsyNTgsMjEgQEAKIAogCWVuYWJsZV9tYWMoZGV2LCAwKTsgLyogbWFrZSBzdXJlIHRoZSBNQUMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKIAkJCSAgICAgKiBtaWlfYnVzIGlzIGVuYWJsZWQgKi8KLQlyZXR1cm4gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIHJlZ251bSk7CisJcmV0dXJuIGF1MTAwMF9tZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgcmVnbnVtKTsKIH0KIAotc3RhdGljIGludCBtZGlvYnVzX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ251bSwKLQkJCSB1MTYgdmFsdWUpCitzdGF0aWMgaW50IGF1MTAwMF9tZGlvYnVzX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ251bSwKKwkJCQl1MTYgdmFsdWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmNvbnN0IGRldiA9IGJ1cy0+cHJpdjsKIAogCWVuYWJsZV9tYWMoZGV2LCAwKTsgLyogbWFrZSBzdXJlIHRoZSBNQUMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKIAkJCSAgICAgKiBtaWlfYnVzIGlzIGVuYWJsZWQgKi8KLQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIHJlZ251bSwgdmFsdWUpOworCWF1MTAwMF9tZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIHJlZ251bSwgdmFsdWUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1kaW9idXNfcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3N0YXRpYyBpbnQgYXUxMDAwX21kaW9idXNfcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqY29uc3QgZGV2ID0gYnVzLT5wcml2OwogCkBAIC0yOTAsNyArMjkxLDcgQEAKIAogCWlmKGF1cC0+bWFjX2lkID09IDApIHsgLyogZ2V0IFBIWTAgKi8KICMgaWYgZGVmaW5lZChBVTFYWFhfUEhZMF9BRERSKQotCQlwaHlkZXYgPSBhdV9tYWNzW0FVMVhYWF9QSFkwX0JVU0lEXS0+bWlpX2J1cy5waHlfbWFwW0FVMVhYWF9QSFkwX0FERFJdOworCQlwaHlkZXYgPSBhdV9tYWNzW0FVMVhYWF9QSFkwX0JVU0lEXS0+bWlpX2J1cy0+cGh5X21hcFtBVTFYWFhfUEhZMF9BRERSXTsKICMgZWxzZQogCQlwcmludGsgKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiVzOiB1c2luZyBQSFktbGVzcyBzZXR1cFxuIiwKIAkJCWRldi0+bmFtZSk7CkBAIC0yOTgsNyArMjk5LDcgQEAKICMgZW5kaWYgLyogZGVmaW5lZChBVTFYWFhfUEhZMF9BRERSKSAqLwogCX0gZWxzZSBpZiAoYXVwLT5tYWNfaWQgPT0gMSkgeyAvKiBnZXQgUEhZMSAqLwogIyBpZiBkZWZpbmVkKEFVMVhYWF9QSFkxX0FERFIpCi0JCXBoeWRldiA9IGF1X21hY3NbQVUxWFhYX1BIWTFfQlVTSURdLT5taWlfYnVzLnBoeV9tYXBbQVUxWFhYX1BIWTFfQUREUl07CisJCXBoeWRldiA9IGF1X21hY3NbQVUxWFhYX1BIWTFfQlVTSURdLT5taWlfYnVzLT5waHlfbWFwW0FVMVhYWF9QSFkxX0FERFJdOwogIyBlbHNlCiAJCXByaW50ayAoS0VSTl9JTkZPIERSVl9OQU1FICI6JXM6IHVzaW5nIFBIWS1sZXNzIHNldHVwXG4iLAogCQkJZGV2LT5uYW1lKTsKQEAgLTMxMSw4ICszMTIsOCBAQAogCiAJLyogZmluZCB0aGUgZmlyc3QgKGxvd2VzdCBhZGRyZXNzKSBQSFkgb24gdGhlIGN1cnJlbnQgTUFDJ3MgTUlJIGJ1cyAqLwogCWZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IFBIWV9NQVhfQUREUjsgcGh5X2FkZHIrKykKLQkJaWYgKGF1cC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXSkgewotCQkJcGh5ZGV2ID0gYXVwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdOworCQlpZiAoYXVwLT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXSkgeworCQkJcGh5ZGV2ID0gYXVwLT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXTsKICMgaWYgIWRlZmluZWQoQVUxWFhYX1BIWV9TRUFSQ0hfSElHSEVTVF9BRERSKQogCQkJYnJlYWs7IC8qIGJyZWFrIG91dCB3aXRoIGZpcnN0IG9uZSBmb3VuZCAqLwogIyBlbmRpZgpAQCAtMzMxLDcgKzMzMiw3IEBACiAJCSAqIHRoZSBNQUMwIE1JSSBidXMgKi8KIAkJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7CiAJCQlzdHJ1Y3QgcGh5X2RldmljZSAqY29uc3QgdG1wX3BoeWRldiA9Ci0JCQkJYXVfbWFjc1swXS0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXTsKKwkJCQlhdV9tYWNzWzBdLT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXTsKIAogCQkJaWYgKCF0bXBfcGh5ZGV2KQogCQkJCWNvbnRpbnVlOyAvKiBubyBQSFkgaGVyZS4uLiAqLwpAQCAtNjUzLDYgKzY1NCw4IEBACiAKIAlhdXAgPSBkZXYtPnByaXY7CiAKKwlzcGluX2xvY2tfaW5pdCgmYXVwLT5sb2NrKTsKKwogCS8qIEFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KIAkvKiBTbm9vcGluZyB3b3JrcyBmaW5lIHdpdGggZXRoIG9uIGFsbCBhdTF4eHggKi8KIAlhdXAtPnZhZGRyID0gKHUzMilkbWFfYWxsb2Nfbm9uY29oZXJlbnQoTlVMTCwgTUFYX0JVRl9TSVpFICoKQEAgLTY5NiwyOCArNjk5LDMyIEBACiAJKmF1cC0+ZW5hYmxlID0gMDsKIAlhdXAtPm1hY19lbmFibGVkID0gMDsKIAotCWF1cC0+bWlpX2J1cy5wcml2ID0gZGV2OwotCWF1cC0+bWlpX2J1cy5yZWFkID0gbWRpb2J1c19yZWFkOwotCWF1cC0+bWlpX2J1cy53cml0ZSA9IG1kaW9idXNfd3JpdGU7Ci0JYXVwLT5taWlfYnVzLnJlc2V0ID0gbWRpb2J1c19yZXNldDsKLQlhdXAtPm1paV9idXMubmFtZSA9ICJhdTEwMDBfZXRoX21paSI7Ci0Jc25wcmludGYoYXVwLT5taWlfYnVzLmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIGF1cC0+bWFjX2lkKTsKLQlhdXAtPm1paV9idXMuaXJxID0ga21hbGxvYyhzaXplb2YoaW50KSpQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWF1cC0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlpZiAoYXVwLT5taWlfYnVzID09IE5VTEwpCisJCWdvdG8gZXJyX291dDsKKworCWF1cC0+bWlpX2J1cy0+cHJpdiA9IGRldjsKKwlhdXAtPm1paV9idXMtPnJlYWQgPSBhdTEwMDBfbWRpb2J1c19yZWFkOworCWF1cC0+bWlpX2J1cy0+d3JpdGUgPSBhdTEwMDBfbWRpb2J1c193cml0ZTsKKwlhdXAtPm1paV9idXMtPnJlc2V0ID0gYXUxMDAwX21kaW9idXNfcmVzZXQ7CisJYXVwLT5taWlfYnVzLT5uYW1lID0gImF1MTAwMF9ldGhfbWlpIjsKKwlzbnByaW50ZihhdXAtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIGF1cC0+bWFjX2lkKTsKKwlhdXAtPm1paV9idXMtPmlycSA9IGttYWxsb2Moc2l6ZW9mKGludCkqUEhZX01BWF9BRERSLCBHRlBfS0VSTkVMKTsKIAlmb3IoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7ICsraSkKLQkJYXVwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCQlhdXAtPm1paV9idXMtPmlycVtpXSA9IFBIWV9QT0xMOwogCiAJLyogaWYga25vd24sIHNldCBjb3JyZXNwb25kaW5nIFBIWSBJUlFzICovCiAjaWYgZGVmaW5lZChBVTFYWFhfUEhZX1NUQVRJQ19DT05GSUcpCiAjIGlmIGRlZmluZWQoQVUxWFhYX1BIWTBfSVJRKQogCWlmIChBVTFYWFhfUEhZMF9CVVNJRCA9PSBhdXAtPm1hY19pZCkKLQkJYXVwLT5taWlfYnVzLmlycVtBVTFYWFhfUEhZMF9BRERSXSA9IEFVMVhYWF9QSFkwX0lSUTsKKwkJYXVwLT5taWlfYnVzLT5pcnFbQVUxWFhYX1BIWTBfQUREUl0gPSBBVTFYWFhfUEhZMF9JUlE7CiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoQVUxWFhYX1BIWTFfSVJRKQogCWlmIChBVTFYWFhfUEhZMV9CVVNJRCA9PSBhdXAtPm1hY19pZCkKLQkJYXVwLT5taWlfYnVzLmlycVtBVTFYWFhfUEhZMV9BRERSXSA9IEFVMVhYWF9QSFkxX0lSUTsKKwkJYXVwLT5taWlfYnVzLT5pcnFbQVUxWFhYX1BIWTFfQUREUl0gPSBBVTFYWFhfUEhZMV9JUlE7CiAjIGVuZGlmCiAjZW5kaWYKLQltZGlvYnVzX3JlZ2lzdGVyKCZhdXAtPm1paV9idXMpOworCW1kaW9idXNfcmVnaXN0ZXIoYXVwLT5taWlfYnVzKTsKIAogCWlmIChtaWlfcHJvYmUoZGV2KSAhPSAwKSB7CiAJCWdvdG8gZXJyX291dDsKQEAgLTc1Myw3ICs3NjAsNiBAQAogCQlhdXAtPnR4X2RiX2ludXNlW2ldID0gcERCOwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZhdXAtPmxvY2spOwogCWRldi0+YmFzZV9hZGRyID0gYmFzZTsKIAlkZXYtPmlycSA9IGlycTsKIAlkZXYtPm9wZW4gPSBhdTEwMDBfb3BlbjsKQEAgLTc3NCw2ICs3ODAsMTEgQEAKIAlyZXR1cm4gZGV2OwogCiBlcnJfb3V0OgorCWlmIChhdXAtPm1paV9idXMgIT0gTlVMTCkgeworCQltZGlvYnVzX3VucmVnaXN0ZXIoYXVwLT5taWlfYnVzKTsKKwkJbWRpb2J1c19mcmVlKGF1cC0+bWlpX2J1cyk7CisJfQorCiAJLyogaGVyZSB3ZSBzaG91bGQgaGF2ZSBhIHZhbGlkIGRldiBwbHVzIGF1cC0+IHJlZ2lzdGVyIGFkZHJlc3NlcwogCSAqIHNvIHdlIGNhbiByZXNldCB0aGUgbWFjIHByb3Blcmx5LiovCiAJcmVzZXRfbWFjKGRldik7CkBAIC0xMDA0LDYgKzEwMTUsOCBAQAogCQlpZiAoZGV2KSB7CiAJCQlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQltZGlvYnVzX3VucmVnaXN0ZXIoYXVwLT5taWlfYnVzKTsKKwkJCW1kaW9idXNfZnJlZShhdXAtPm1paV9idXMpOwogCQkJZm9yIChqID0gMDsgaiA8IE5VTV9SWF9ETUE7IGorKykKIAkJCQlpZiAoYXVwLT5yeF9kYl9pbnVzZVtqXSkKIAkJCQkJUmVsZWFzZURCKGF1cCwgYXVwLT5yeF9kYl9pbnVzZVtqXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmggYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmgKaW5kZXggZjNiYWVhYS4uODI0ZWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguaApAQCAtMTA2LDcgKzEwNiw3IEBACiAJaW50IG9sZF9kdXBsZXg7CiAKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKLQlzdHJ1Y3QgbWlpX2J1cyBtaWlfYnVzOworCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwogCiAJLyogVGhlc2UgdmFyaWFibGVzIGFyZSBqdXN0IGZvciBxdWljayBhY2Nlc3MgdG8gY2VydGFpbiByZWdzIGFkZHJlc3Nlcy4gKi8KIAl2b2xhdGlsZSBtYWNfcmVnX3QgKm1hYzsgIC8qIG1hYyByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F4ODg3OTYuYyBiL2RyaXZlcnMvbmV0L2F4ODg3OTYuYwppbmRleCBhODg2YTRiLi40MjA3ZDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9heDg4Nzk2LmMKKysrIGIvZHJpdmVycy9uZXQvYXg4ODc5Ni5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl3aGlsZSAoKGVpX2luYihhZGRyICsgRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkgewogCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKkhaLzEwMCkgewogCQkJZGV2X3dhcm4oJmF4LT5kZXYtPmRldiwgIiVzOiAlcyBkaWQgbm90IGNvbXBsZXRlLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSk7CisJCQkgICAgICAgX19mdW5jX18sIGRldi0+bmFtZSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE3Myw3ICsxNzMsNyBAQAogCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CiAJCWRldl9lcnIoJmF4LT5kZXYtPmRldiwgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gJXMgIgogCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCi0JCQlkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXywKKwkJCWRldi0+bmFtZSwgX19mdW5jX18sCiAJCQllaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC0yMTUsNyArMjE1LDcgQEAKIAkJZGV2X2VycigmYXgtPmRldi0+ZGV2LAogCQkJIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gJXMgIgogCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCi0JCQlkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXywKKwkJCWRldi0+bmFtZSwgX19mdW5jX18sCiAJCQllaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjAsNyArMjYwLDcgQEAKIAlpZiAoZWlfc3RhdHVzLmRtYWluZykgewogCQlkZXZfZXJyKCZheC0+ZGV2LT5kZXYsICIlczogRE1BaW5nIGNvbmZsaWN0IGluICVzLiIKIAkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCi0JCQlkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXywKKwkJCWRldi0+bmFtZSwgX19mdW5jX18sCiAJCSAgICAgICBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC0zOTYsNyArMzk2LDcgQEAKIHsKIAlpZiAocGh5X2RlYnVnKQogCQlwcl9kZWJ1ZygiJXM6IGRldiAlcCwgJTA0eCwgJTA0eCwgJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGRldiwgcGh5X2FkZHIsIHJlZywgb3BjKTsKKwkJCV9fZnVuY19fLCBkZXYsIHBoeV9hZGRyLCByZWcsIG9wYyk7CiAKIAlheF9taWlfZWlfb3V0Yml0cyhkZXYsIDB4M2YsIDYpOwkvKiBwcmUtYW1ibGUgKi8KIAlheF9taWlfZWlfb3V0Yml0cyhkZXYsIDEsIDIpOwkJLyogZnJhbWUtc3RhcnQgKi8KQEAgLTQyMiw3ICs0MjIsNyBAQAogICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKIAogCWlmIChwaHlfZGVidWcpCi0JCXByX2RlYnVnKCIlczogJTA0eC4lMDR4ID0+IHJlYWQgJTA0eFxuIiwgX19GVU5DVElPTl9fLAorCQlwcl9kZWJ1ZygiJXM6ICUwNHguJTA0eCA9PiByZWFkICUwNHhcbiIsIF9fZnVuY19fLAogCQkJIHBoeV9hZGRyLCByZWcsIHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRldl9kYmcoJmF4LT5kZXYtPmRldiwgIiVzOiAlcCwgJTA0eCwgJTA0eCAlMDR4XG4iLAotCQlfX0ZVTkNUSU9OX18sIGRldiwgcGh5X2FkZHIsIHJlZywgdmFsdWUpOworCQlfX2Z1bmNfXywgZGV2LCBwaHlfYWRkciwgcmVnLCB2YWx1ZSk7CiAKICAgICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmZWktPnBhZ2VfbG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwppbmRleCAzZGI3ZGIxLi5iNDU4ZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogICogTUlJIG9wZXJhdGlvbnMKICAqLwogLyogV2FpdCB1bnRpbCB0aGUgcHJldmlvdXMgTURDL01ESU8gdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCAqLwotc3RhdGljIHZvaWQgbWRpb19wb2xsKHZvaWQpCitzdGF0aWMgdm9pZCBiZmluX21kaW9fcG9sbCh2b2lkKQogewogCWludCB0aW1lb3V0X2NudCA9IE1BWF9USU1FT1VUX0NOVDsKIApAQCAtMjY5LDI1ICsyNjksMjUgQEAKIH0KIAogLyogUmVhZCBhbiBvZmYtY2hpcCByZWdpc3RlciBpbiBhIFBIWSB0aHJvdWdoIHRoZSBNREMvTURJTyBwb3J0ICovCi1zdGF0aWMgaW50IG1kaW9idXNfcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCByZWdudW0pCitzdGF0aWMgaW50IGJmaW5fbWRpb2J1c19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ251bSkKIHsKLQltZGlvX3BvbGwoKTsKKwliZmluX21kaW9fcG9sbCgpOwogCiAJLyogcmVhZCBtb2RlICovCiAJYmZpbl93cml0ZV9FTUFDX1NUQUFERChTRVRfUEhZQUQoKHUxNikgcGh5X2FkZHIpIHwKIAkJCQlTRVRfUkVHQUQoKHUxNikgcmVnbnVtKSB8CiAJCQkJU1RBQlVTWSk7CiAKLQltZGlvX3BvbGwoKTsKKwliZmluX21kaW9fcG9sbCgpOwogCiAJcmV0dXJuIChpbnQpIGJmaW5fcmVhZF9FTUFDX1NUQURBVCgpOwogfQogCiAvKiBXcml0ZSBhbiBvZmYtY2hpcCByZWdpc3RlciBpbiBhIFBIWSB0aHJvdWdoIHRoZSBNREMvTURJTyBwb3J0ICovCi1zdGF0aWMgaW50IG1kaW9idXNfd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9hZGRyLCBpbnQgcmVnbnVtLAotCQkJIHUxNiB2YWx1ZSkKK3N0YXRpYyBpbnQgYmZpbl9tZGlvYnVzX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHlfYWRkciwgaW50IHJlZ251bSwKKwkJCSAgICAgIHUxNiB2YWx1ZSkKIHsKLQltZGlvX3BvbGwoKTsKKwliZmluX21kaW9fcG9sbCgpOwogCiAJYmZpbl93cml0ZV9FTUFDX1NUQURBVCgodTMyKSB2YWx1ZSk7CiAKQEAgLTI5NywxMiArMjk3LDEyIEBACiAJCQkJU1RBT1AgfAogCQkJCVNUQUJVU1kpOwogCi0JbWRpb19wb2xsKCk7CisJYmZpbl9tZGlvX3BvbGwoKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1kaW9idXNfcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3N0YXRpYyBpbnQgYmZpbl9tZGlvYnVzX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0zOTgsNyArMzk4LDcgQEAKIAogCS8qIHNlYXJjaCBmb3IgY29ubmVjdCBQSFkgZGV2aWNlICovCiAJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgaSsrKSB7Ci0JCXN0cnVjdCBwaHlfZGV2aWNlICpjb25zdCB0bXBfcGh5ZGV2ID0gbHAtPm1paV9idXMucGh5X21hcFtpXTsKKwkJc3RydWN0IHBoeV9kZXZpY2UgKmNvbnN0IHRtcF9waHlkZXYgPSBscC0+bWlpX2J1cy0+cGh5X21hcFtpXTsKIAogCQlpZiAoIXRtcF9waHlkZXYpCiAJCQljb250aW51ZTsgLyogbm8gUEhZIGhlcmUuLi4gKi8KQEAgLTgxMSwxNCArODExLDE0IEBACiB7CiAJdTMyIG9wbW9kZTsKIAotCXByX2RlYnVnKCIlczogJXNcbiIsIERSVl9OQU1FLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlczogJXNcbiIsIERSVl9OQU1FLCBfX2Z1bmNfXyk7CiAKIAkvKiBTZXQgUlggRE1BICovCiAJYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIoJihyeF9saXN0X2hlYWQtPmRlc2NfYSkpOwogCWJmaW5fd3JpdGVfRE1BMV9DT05GSUcocnhfbGlzdF9oZWFkLT5kZXNjX2EuY29uZmlnKTsKIAogCS8qIFdhaXQgTUlJIGRvbmUgKi8KLQltZGlvX3BvbGwoKTsKKwliZmluX21kaW9fcG9sbCgpOwogCiAJLyogV2UgZW5hYmxlIG9ubHkgUlggaGVyZSAqLwogCS8qIEFTVFAgICA6IEVuYWJsZSBBdXRvbWF0aWMgUGFkIFN0cmlwcGluZwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAvKiBPdXIgd2F0Y2hkb2cgdGltZWQgb3V0LiBDYWxsZWQgYnkgdGhlIG5ldHdvcmtpbmcgbGF5ZXIgKi8KIHN0YXRpYyB2b2lkIGJmaW5fbWFjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAliZmluX21hY19kaXNhYmxlKCk7CiAKQEAgLTk0OSw3ICs5NDksNyBAQAogewogCXN0cnVjdCBiZmluX21hY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXR2YWw7Ci0JcHJfZGVidWcoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCXByX2RlYnVnKCIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJLyoKIAkgKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIGlzIHZhbGlkLiAgSWYgaXRzIG5vdCwgcmVmdXNlCkBAIC05ODksNyArOTg5LDcgQEAKIHN0YXRpYyBpbnQgYmZpbl9tYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmZpbl9tYWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlwcl9kZWJ1ZygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJcHJfZGVidWcoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKQEAgLTEwNTgsMTcgKzEwNTgsMjEgQEAKIAlzZXR1cF9tYWNfYWRkcihuZGV2LT5kZXZfYWRkcik7CiAKIAkvKiBNRElPIGJ1cyBpbml0aWFsICovCi0JbHAtPm1paV9idXMucHJpdiA9IG5kZXY7Ci0JbHAtPm1paV9idXMucmVhZCA9IG1kaW9idXNfcmVhZDsKLQlscC0+bWlpX2J1cy53cml0ZSA9IG1kaW9idXNfd3JpdGU7Ci0JbHAtPm1paV9idXMucmVzZXQgPSBtZGlvYnVzX3Jlc2V0OwotCWxwLT5taWlfYnVzLm5hbWUgPSAiYmZpbl9tYWNfbWRpbyI7Ci0Jc25wcmludGYobHAtPm1paV9idXMuaWQsIE1JSV9CVVNfSURfU0laRSwgIjAiKTsKLQlscC0+bWlpX2J1cy5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7Ci0JZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgKytpKQotCQlscC0+bWlpX2J1cy5pcnFbaV0gPSBQSFlfUE9MTDsKKwlscC0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlpZiAobHAtPm1paV9idXMgPT0gTlVMTCkKKwkJZ290byBvdXRfZXJyX21kaW9idXNfYWxsb2M7CiAKLQlyYyA9IG1kaW9idXNfcmVnaXN0ZXIoJmxwLT5taWlfYnVzKTsKKwlscC0+bWlpX2J1cy0+cHJpdiA9IG5kZXY7CisJbHAtPm1paV9idXMtPnJlYWQgPSBiZmluX21kaW9idXNfcmVhZDsKKwlscC0+bWlpX2J1cy0+d3JpdGUgPSBiZmluX21kaW9idXNfd3JpdGU7CisJbHAtPm1paV9idXMtPnJlc2V0ID0gYmZpbl9tZGlvYnVzX3Jlc2V0OworCWxwLT5taWlfYnVzLT5uYW1lID0gImJmaW5fbWFjX21kaW8iOworCXNucHJpbnRmKGxwLT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiMCIpOworCWxwLT5taWlfYnVzLT5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgKytpKQorCQlscC0+bWlpX2J1cy0+aXJxW2ldID0gUEhZX1BPTEw7CisKKwlyYyA9IG1kaW9idXNfcmVnaXN0ZXIobHAtPm1paV9idXMpOwogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgTURJTyBidXMhXG4iKTsKIAkJZ290byBvdXRfZXJyX21kaW9idXNfcmVnaXN0ZXI7CkBAIC0xMTIxLDggKzExMjUsMTAgQEAKIAlmcmVlX2lycShJUlFfTUFDX1JYLCBuZGV2KTsKIG91dF9lcnJfcmVxdWVzdF9pcnE6CiBvdXRfZXJyX21paV9wcm9iZToKLQltZGlvYnVzX3VucmVnaXN0ZXIoJmxwLT5taWlfYnVzKTsKKwltZGlvYnVzX3VucmVnaXN0ZXIobHAtPm1paV9idXMpOwogb3V0X2Vycl9tZGlvYnVzX3JlZ2lzdGVyOgorCW1kaW9idXNfZnJlZShscC0+bWlpX2J1cyk7CitvdXRfZXJyX21kaW9idXNfYWxsb2M6CiAJcGVyaXBoZXJhbF9mcmVlX2xpc3QocGluX3JlcSk7CiBvdXRfZXJyX3NldHVwX3Bpbl9tdXg6CiBvdXRfZXJyX3Byb2JlX21hYzoKQEAgLTExMzksNyArMTE0NSw4IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAotCW1kaW9idXNfdW5yZWdpc3RlcigmbHAtPm1paV9idXMpOworCW1kaW9idXNfdW5yZWdpc3RlcihscC0+bWlpX2J1cyk7CisJbWRpb2J1c19mcmVlKGxwLT5taWlfYnVzKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iZmluX21hYy5oIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuaAppbmRleCBiZWZmNTEwLi4wNTJiNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iZmluX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmgKQEAgLTY2LDcgKzY2LDcgQEAKIAlpbnQgb2xkX2R1cGxleDsKIAogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7Ci0Jc3RydWN0IG1paV9idXMgbWlpX2J1czsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKIH07CiAKIGV4dGVybiB2b2lkIGJmaW5fZ2V0X2V0aGVyX2FkZHIoY2hhciAqYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmMgYi9kcml2ZXJzL25ldC9ibngyLmMKaW5kZXggMjQ4NmE2NS4uNDMwZDQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuYwpAQCAtNTcsOCArNTcsOCBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDIiCiAjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuOC4wIgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkF1ZyAxNCwgMjAwOCIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjguMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJPY3QgNywgMjAwOCIKIAogI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCiAKQEAgLTY5LDcgKzY5LDcgQEAKIAkiQnJvYWRjb20gTmV0WHRyZW1lIElJIEdpZ2FiaXQgRXRoZXJuZXQgRHJpdmVyICIgRFJWX01PRFVMRV9OQU1FICIgdiIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOwogCiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIENoYW4gPG1jaGFuQGJyb2FkY29tLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDYvNTcwOC81NzA5IERyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBOZXRYdHJlbWUgSUkgQkNNNTcwNi81NzA4LzU3MDkvNTcxNiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CiAKQEAgLTExMjcsNyArMTEyNyw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogYm54Ml9zZXRfbWFjX2xpbmsoc3RydWN0IGJueDIgKmJwKQogewogCXUzMiB2YWw7CkBAIC0xMTkzLDggKzExOTMsNiBAQAogCiAJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQogCQlibngyX2luaXRfYWxsX3J4X2NvbnRleHRzKGJwKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjQ3OCw2ICsyNDc2LDExIEBACiAJCXJldHVybiAtRU5PTUVNOwogCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoYnAtPnBkZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKIAkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnBkZXYsIG1hcHBpbmcpKSB7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAlyeF9wZy0+cGFnZSA9IHBhZ2U7CiAJcGNpX3VubWFwX2FkZHJfc2V0KHJ4X3BnLCBtYXBwaW5nLCBtYXBwaW5nKTsKIAlyeGJkLT5yeF9iZF9oYWRkcl9oaSA9ICh1NjQpIG1hcHBpbmcgPj4gMzI7CkBAIC0yNTIwLDYgKzI1MjMsMTAgQEAKIAogCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLCBicC0+cnhfYnVmX3VzZV9zaXplLAogCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnAtPnBkZXYsIG1hcHBpbmcpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCiAJcnhfYnVmLT5za2IgPSBza2I7CiAJcGNpX3VubWFwX2FkZHJfc2V0KHJ4X2J1ZiwgbWFwcGluZywgbWFwcGluZyk7CkBAIC0yNTk0LDcgKzI2MDEsNyBAQAogCXN3X2NvbnMgPSB0eHItPnR4X2NvbnM7CiAKIAl3aGlsZSAoc3dfY29ucyAhPSBod19jb25zKSB7Ci0JCXN0cnVjdCBzd19iZCAqdHhfYnVmOworCQlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJaW50IGksIGxhc3Q7CiAKQEAgLTI2MTksMjEgKzI2MjYsMTMgQEAKIAkJCX0KIAkJfQogCi0JCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIHBjaV91bm1hcF9hZGRyKHR4X2J1ZiwgbWFwcGluZyksCi0JCQlza2JfaGVhZGxlbihza2IpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJc2tiX2RtYV91bm1hcCgmYnAtPnBkZXYtPmRldiwgc2tiLCBETUFfVE9fREVWSUNFKTsKIAogCQl0eF9idWYtPnNrYiA9IE5VTEw7CiAJCWxhc3QgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwogCiAJCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKIAkJCXN3X2NvbnMgPSBORVhUX1RYX0JEKHN3X2NvbnMpOwotCi0JCQlwY2lfdW5tYXBfcGFnZShicC0+cGRldiwKLQkJCQlwY2lfdW5tYXBfYWRkcigKLQkJCQkJJnR4ci0+dHhfYnVmX3JpbmdbVFhfUklOR19JRFgoc3dfY29ucyldLAotCQkJCSAgICAgICAJbWFwcGluZyksCi0JCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplLAotCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCQl9CiAKIAkJc3dfY29ucyA9IE5FWFRfVFhfQkQoc3dfY29ucyk7CkBAIC0yNjc0LDExICsyNjczLDMxIEBACiB7CiAJc3RydWN0IHN3X3BnICpjb25zX3J4X3BnLCAqcHJvZF9yeF9wZzsKIAlzdHJ1Y3QgcnhfYmQgKmNvbnNfYmQsICpwcm9kX2JkOwotCWRtYV9hZGRyX3QgbWFwcGluZzsKIAlpbnQgaTsKLQl1MTYgaHdfcHJvZCA9IHJ4ci0+cnhfcGdfcHJvZCwgcHJvZDsKKwl1MTYgaHdfcHJvZCwgcHJvZDsKIAl1MTYgY29ucyA9IHJ4ci0+cnhfcGdfY29uczsKIAorCWNvbnNfcnhfcGcgPSAmcnhyLT5yeF9wZ19yaW5nW2NvbnNdOworCisJLyogVGhlIGNhbGxlciB3YXMgdW5hYmxlIHRvIGFsbG9jYXRlIGEgbmV3IHBhZ2UgdG8gcmVwbGFjZSB0aGUKKwkgKiBsYXN0IG9uZSBpbiB0aGUgZnJhZ3MgYXJyYXksIHNvIHdlIG5lZWQgdG8gcmVjeWNsZSB0aGF0IHBhZ2UKKwkgKiBhbmQgdGhlbiBmcmVlIHRoZSBza2IuCisJICovCisJaWYgKHNrYikgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc2hpbmZvOworCisJCXNoaW5mbyA9IHNrYl9zaGluZm8oc2tiKTsKKwkJc2hpbmZvLT5ucl9mcmFncy0tOworCQlwYWdlID0gc2hpbmZvLT5mcmFnc1tzaGluZm8tPm5yX2ZyYWdzXS5wYWdlOworCQlzaGluZm8tPmZyYWdzW3NoaW5mby0+bnJfZnJhZ3NdLnBhZ2UgPSBOVUxMOworCisJCWNvbnNfcnhfcGctPnBhZ2UgPSBwYWdlOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaHdfcHJvZCA9IHJ4ci0+cnhfcGdfcHJvZDsKKwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXByb2QgPSBSWF9QR19SSU5HX0lEWChod19wcm9kKTsKIApAQCAtMjY4NywyMCArMjcwNiw2IEBACiAJCWNvbnNfYmQgPSAmcnhyLT5yeF9wZ19kZXNjX3JpbmdbUlhfUklORyhjb25zKV1bUlhfSURYKGNvbnMpXTsKIAkJcHJvZF9iZCA9ICZyeHItPnJ4X3BnX2Rlc2NfcmluZ1tSWF9SSU5HKHByb2QpXVtSWF9JRFgocHJvZCldOwogCi0JCWlmIChpID09IDAgJiYgc2tiKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbzsKLQotCQkJc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOwotCQkJc2hpbmZvLT5ucl9mcmFncy0tOwotCQkJcGFnZSA9IHNoaW5mby0+ZnJhZ3Nbc2hpbmZvLT5ucl9mcmFnc10ucGFnZTsKLQkJCXNoaW5mby0+ZnJhZ3Nbc2hpbmZvLT5ucl9mcmFnc10ucGFnZSA9IE5VTEw7Ci0JCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGJwLT5wZGV2LCBwYWdlLCAwLCBQQUdFX1NJWkUsCi0JCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJY29uc19yeF9wZy0+cGFnZSA9IHBhZ2U7Ci0JCQlwY2lfdW5tYXBfYWRkcl9zZXQoY29uc19yeF9wZywgbWFwcGluZywgbWFwcGluZyk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCX0KIAkJaWYgKHByb2QgIT0gY29ucykgewogCQkJcHJvZF9yeF9wZy0+cGFnZSA9IGNvbnNfcnhfcGctPnBhZ2U7CiAJCQljb25zX3J4X3BnLT5wYWdlID0gTlVMTDsKQEAgLTI3ODYsNiArMjc5MSw4IEBACiAJCXNrYl9wdXQoc2tiLCBoZHJfbGVuKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkJZG1hX2FkZHJfdCBtYXBwaW5nX29sZDsKKwogCQkJZnJhZ19sZW4gPSBtaW4oZnJhZ19zaXplLCAodW5zaWduZWQgaW50KSBQQUdFX1NJWkUpOwogCQkJaWYgKHVubGlrZWx5KGZyYWdfbGVuIDw9IDQpKSB7CiAJCQkJdW5zaWduZWQgaW50IHRhaWwgPSA0IC0gZnJhZ19sZW47CkBAIC0yODA4LDkgKzI4MTUsMTAgQEAKIAkJCX0KIAkJCXJ4X3BnID0gJnJ4ci0+cnhfcGdfcmluZ1twZ19jb25zXTsKIAotCQkJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsIHBjaV91bm1hcF9hZGRyKHJ4X3BnLCBtYXBwaW5nKSwKLQkJCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCisJCQkvKiBEb24ndCB1bm1hcCB5ZXQuICBJZiB3ZSdyZSB1bmFibGUgdG8gYWxsb2NhdGUgYSBuZXcKKwkJCSAqIHBhZ2UsIHdlIG5lZWQgdG8gcmVjeWNsZSB0aGUgcGFnZSBhbmQgdGhlIERNQSBhZGRyLgorCQkJICovCisJCQltYXBwaW5nX29sZCA9IHBjaV91bm1hcF9hZGRyKHJ4X3BnLCBtYXBwaW5nKTsKIAkJCWlmIChpID09IHBhZ2VzIC0gMSkKIAkJCQlmcmFnX2xlbiAtPSA0OwogCkBAIC0yODI3LDYgKzI4MzUsOSBAQAogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAKKwkJCXBjaV91bm1hcF9wYWdlKGJwLT5wZGV2LCBtYXBwaW5nX29sZCwKKwkJCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCiAJCQlmcmFnX3NpemUgLT0gZnJhZ19sZW47CiAJCQlza2ItPmRhdGFfbGVuICs9IGZyYWdfbGVuOwogCQkJc2tiLT50cnVlc2l6ZSArPSBmcmFnX2xlbjsKQEAgLTMyNTAsNiArMzI2MSw5IEBACiAJc3RydWN0IGRldl9hZGRyX2xpc3QgKnVjX3B0cjsKIAlpbnQgaTsKIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CiAKIAlyeF9tb2RlID0gYnAtPnJ4X21vZGUgJiB+KEJOWDJfRU1BQ19SWF9NT0RFX1BST01JU0NVT1VTIHwKQEAgLTQ5NzAsMzEgKzQ5ODQsMjAgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoaiA9IDA7IGogPCBUWF9ERVNDX0NOVDsgKSB7Ci0JCQlzdHJ1Y3Qgc3dfYmQgKnR4X2J1ZiA9ICZ0eHItPnR4X2J1Zl9yaW5nW2pdOworCQkJc3RydWN0IHN3X3R4X2JkICp0eF9idWYgPSAmdHhyLT50eF9idWZfcmluZ1tqXTsKIAkJCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9idWYtPnNrYjsKLQkJCWludCBrLCBsYXN0OwogCiAJCQlpZiAoc2tiID09IE5VTEwpIHsKIAkJCQlqKys7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsCi0JCQkJCSBwY2lfdW5tYXBfYWRkcih0eF9idWYsIG1hcHBpbmcpLAotCQkJc2tiX2hlYWRsZW4oc2tiKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlza2JfZG1hX3VubWFwKCZicC0+cGRldi0+ZGV2LCBza2IsIERNQV9UT19ERVZJQ0UpOwogCiAJCQl0eF9idWYtPnNrYiA9IE5VTEw7CiAKLQkJCWxhc3QgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwotCQkJZm9yIChrID0gMDsgayA8IGxhc3Q7IGsrKykgewotCQkJCXR4X2J1ZiA9ICZ0eHItPnR4X2J1Zl9yaW5nW2ogKyBrICsgMV07Ci0JCQkJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsCi0JCQkJCXBjaV91bm1hcF9hZGRyKHR4X2J1ZiwgbWFwcGluZyksCi0JCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal0uc2l6ZSwKLQkJCQkJUENJX0RNQV9UT0RFVklDRSk7Ci0JCQl9CisJCQlqICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJaiArPSBrICsgMTsKIAkJfQogCX0KIH0KQEAgLTUwNzUsNiArNTA3OCwyMSBAQAogfQogCiBzdGF0aWMgaW50CitibngyX3NodXRkb3duX2NoaXAoc3RydWN0IGJueDIgKmJwKQoreworCXUzMiByZXNldF9jb2RlOworCisJaWYgKGJwLT5mbGFncyAmIEJOWDJfRkxBR19OT19XT0wpCisJCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9VTkxPQURfTE5LX0ROOworCWVsc2UgaWYgKGJwLT53b2wpCisJCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX1dPTDsKKwllbHNlCisJCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX05PX1dPTDsKKworCXJldHVybiBibngyX3Jlc2V0X2NoaXAoYnAsIHJlc2V0X2NvZGUpOworfQorCitzdGF0aWMgaW50CiBibngyX3Rlc3RfcmVnaXN0ZXJzKHN0cnVjdCBibngyICpicCkKIHsKIAlpbnQgcmV0OwpAQCAtNTM1Nyw4ICs1Mzc1LDExIEBACiAJZm9yIChpID0gMTQ7IGkgPCBwa3Rfc2l6ZTsgaSsrKQogCQlwYWNrZXRbaV0gPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKTsKIAotCW1hcCA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBza2ItPmRhdGEsIHBrdF9zaXplLAotCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoc2tiX2RtYV9tYXAoJmJwLT5wZGV2LT5kZXYsIHNrYiwgRE1BX1RPX0RFVklDRSkpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWFwID0gc2tiX3NoaW5mbyhza2IpLT5kbWFfbWFwc1swXTsKIAogCVJFR19XUihicCwgQk5YMl9IQ19DT01NQU5ELAogCSAgICAgICBicC0+aGNfY21kIHwgQk5YMl9IQ19DT01NQU5EX0NPQUxfTk9XX1dPX0lOVCk7CkBAIC01MzkzLDcgKzU0MTQsNyBAQAogCiAJdWRlbGF5KDUpOwogCi0JcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgbWFwLCBwa3Rfc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJc2tiX2RtYV91bm1hcCgmYnAtPnBkZXYtPmRldiwgc2tiLCBETUFfVE9fREVWSUNFKTsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlpZiAoYm54Ml9nZXRfaHdfdHhfY29ucyh0eF9uYXBpKSAhPSB0eHItPnR4X3Byb2QpCkBAIC01NTA4LDYgKzU1MjksOSBAQAogewogCXUzMiBibXNyOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChicC0+cGh5X2ZsYWdzICYgQk5YMl9QSFlfRkxBR19SRU1PVEVfUEhZX0NBUCkgewogCQlpZiAoYnAtPmxpbmtfdXApCiAJCQlyZXR1cm4gMDsKQEAgLTU2MDAsNyArNTYyNCw3IEBACiAJfSBlbHNlIGlmICgoYnAtPmxpbmtfdXAgPT0gMCkgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkpIHsKIAkJdTMyIGJtY3I7CiAKLQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisJCWJwLT5jdXJyZW50X2ludGVydmFsID0gQk5YMl9USU1FUl9JTlRFUlZBTDsKIAogCQlibngyX3JlYWRfcGh5KGJwLCBicC0+bWlpX2JtY3IsICZibWNyKTsKIApAQCAtNTYyOSw3ICs1NjUzLDcgQEAKIAkJCWJwLT5waHlfZmxhZ3MgJj0gfkJOWDJfUEhZX0ZMQUdfUEFSQUxMRUxfREVURUNUOwogCQl9CiAJfSBlbHNlCi0JCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOworCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IEJOWDJfVElNRVJfSU5URVJWQUw7CiAKIAlpZiAoY2hlY2tfbGluaykgewogCQl1MzIgdmFsOwpAQCAtNTY3NCwxMSArNTY5OCwxMSBAQAogCQl9IGVsc2UgewogCQkJYm54Ml9kaXNhYmxlX2ZvcmNlZF8yZzUoYnApOwogCQkJYnAtPnNlcmRlc19hbl9wZW5kaW5nID0gMjsKLQkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOworCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBCTlgyX1RJTUVSX0lOVEVSVkFMOwogCQl9CiAKIAl9IGVsc2UKLQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisJCWJwLT5jdXJyZW50X2ludGVydmFsID0gQk5YMl9USU1FUl9JTlRFUlZBTDsKIAogCXNwaW5fdW5sb2NrKCZicC0+cGh5X2xvY2spOwogfQpAQCAtNTk1MSwxMyArNTk3NSwxNCBAQAogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCXN0cnVjdCB0eF9iZCAqdHhiZDsKLQlzdHJ1Y3Qgc3dfYmQgKnR4X2J1ZjsKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKIAl1MzIgbGVuLCB2bGFuX3RhZ19mbGFncywgbGFzdF9mcmFnLCBtc3M7CiAJdTE2IHByb2QsIHJpbmdfcHJvZDsKIAlpbnQgaTsKIAlzdHJ1Y3QgYm54Ml9uYXBpICpibmFwaTsKIAlzdHJ1Y3QgYm54Ml90eF9yaW5nX2luZm8gKnR4cjsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc3A7CiAKIAkvKiAgRGV0ZXJtaW5lIHdoaWNoIHR4IHJpbmcgd2Ugd2lsbCBiZSBwbGFjZWQgb24gKi8KIAlpID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CkBAIC01OTg5LDcgKzYwMTQsNyBAQAogCX0KICNlbmRpZgogCWlmICgobXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkpIHsKLQkJdTMyIHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuOworCQl1MzIgdGNwX29wdF9sZW47CiAJCXN0cnVjdCBpcGhkciAqaXBoOwogCiAJCXZsYW5fdGFnX2ZsYWdzIHw9IFRYX0JEX0ZMQUdTX1NXX0xTTzsKQEAgLTYwMTMsMjEgKzYwMzgsNyBAQAogCQkJCW1zcyB8PSAodGNwX29mZiAmIDB4YykgPDwgVFhfQkRfVENQNl9PRkYyX1NITDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCi0JCQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJCXJldHVybiBORVRERVZfVFhfT0s7Ci0JCQl9Ci0KLQkJCWlwX3RjcF9sZW4gPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKLQogCQkJaXBoID0gaXBfaGRyKHNrYik7Ci0JCQlpcGgtPmNoZWNrID0gMDsKLQkJCWlwaC0+dG90X2xlbiA9IGh0b25zKG1zcyArIGlwX3RjcF9sZW4gKyB0Y3Bfb3B0X2xlbik7Ci0JCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCi0JCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAotCQkJCQkJCQkgSVBQUk9UT19UQ1AsCi0JCQkJCQkJCSAwKTsKIAkJCWlmICh0Y3Bfb3B0X2xlbiB8fCAoaXBoLT5paGwgPiA1KSkgewogCQkJCXZsYW5fdGFnX2ZsYWdzIHw9ICgoaXBoLT5paGwgLSA1KSArCiAJCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpIDw8IDg7CkBAIC02MDM2LDExICs2MDQ3LDE2IEBACiAJfSBlbHNlCiAJCW1zcyA9IDA7CiAKLQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoc2tiX2RtYV9tYXAoJmJwLT5wZGV2LT5kZXYsIHNrYiwgRE1BX1RPX0RFVklDRSkpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCXNwID0gc2tiX3NoaW5mbyhza2IpOworCW1hcHBpbmcgPSBzcC0+ZG1hX21hcHNbMF07CiAKIAl0eF9idWYgPSAmdHhyLT50eF9idWZfcmluZ1tyaW5nX3Byb2RdOwogCXR4X2J1Zi0+c2tiID0gc2tiOwotCXBjaV91bm1hcF9hZGRyX3NldCh0eF9idWYsIG1hcHBpbmcsIG1hcHBpbmcpOwogCiAJdHhiZCA9ICZ0eHItPnR4X2Rlc2NfcmluZ1tyaW5nX3Byb2RdOwogCkBAIC02MDU5LDEwICs2MDc1LDcgQEAKIAkJdHhiZCA9ICZ0eHItPnR4X2Rlc2NfcmluZ1tyaW5nX3Byb2RdOwogCiAJCWxlbiA9IGZyYWctPnNpemU7Ci0JCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoYnAtPnBkZXYsIGZyYWctPnBhZ2UsIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJcGNpX3VubWFwX2FkZHJfc2V0KCZ0eHItPnR4X2J1Zl9yaW5nW3JpbmdfcHJvZF0sCi0JCQkJbWFwcGluZywgbWFwcGluZyk7CisJCW1hcHBpbmcgPSBzcC0+ZG1hX21hcHNbaSArIDFdOwogCiAJCXR4YmQtPnR4X2JkX2hhZGRyX2hpID0gKHU2NCkgbWFwcGluZyA+PiAzMjsKIAkJdHhiZC0+dHhfYmRfaGFkZHJfbG8gPSAodTY0KSBtYXBwaW5nICYgMHhmZmZmZmZmZjsKQEAgLTYwOTcsMjAgKzYxMTAsMTMgQEAKIGJueDJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiByZXNldF9jb2RlOwogCiAJY2FuY2VsX3dvcmtfc3luYygmYnAtPnJlc2V0X3Rhc2spOwogCiAJYm54Ml9kaXNhYmxlX2ludF9zeW5jKGJwKTsKIAlibngyX25hcGlfZGlzYWJsZShicCk7CiAJZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7Ci0JaWYgKGJwLT5mbGFncyAmIEJOWDJfRkxBR19OT19XT0wpCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9VTkxPQURfTE5LX0ROOwotCWVsc2UgaWYgKGJwLT53b2wpCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX1dPTDsKLQllbHNlCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX05PX1dPTDsKLQlibngyX3Jlc2V0X2NoaXAoYnAsIHJlc2V0X2NvZGUpOworCWJueDJfc2h1dGRvd25fY2hpcChicCk7CiAJYm54Ml9mcmVlX2lycShicCk7CiAJYm54Ml9mcmVlX3NrYnMoYnApOwogCWJueDJfZnJlZV9tZW0oYnApOwpAQCAtNjQ3OSw2ICs2NDg1LDkgQEAKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBibWNyOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUFHQUlOOworCiAJaWYgKCEoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02NTM0LDYgKzY1NDMsOSBAQAogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJjOwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUFHQUlOOworCiAJLyogcGFyYW1ldGVycyBhbHJlYWR5IHZhbGlkYXRlZCBpbiBldGh0b29sX2dldF9lZXByb20gKi8KIAogCXJjID0gYm54Ml9udnJhbV9yZWFkKGJwLCBlZXByb20tPm9mZnNldCwgZWVidWYsIGVlcHJvbS0+bGVuKTsKQEAgLTY1NDgsNiArNjU2MCw5IEBACiAJc3RydWN0IGJueDIgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmM7CiAKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKIAkvKiBwYXJhbWV0ZXJzIGFscmVhZHkgdmFsaWRhdGVkIGluIGV0aHRvb2xfc2V0X2VlcHJvbSAqLwogCiAJcmMgPSBibngyX252cmFtX3dyaXRlKGJwLCBlZXByb20tPm9mZnNldCwgZWVidWYsIGVlcHJvbS0+bGVuKTsKQEAgLTY3MTIsMTEgKzY3MjcsMTEgQEAKIAkJYnAtPmF1dG9uZWcgJj0gfkFVVE9ORUdfRkxPV19DVFJMOwogCX0KIAotCXNwaW5fbG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKLQotCWJueDJfc2V0dXBfcGh5KGJwLCBicC0+cGh5X3BvcnQpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmJwLT5waHlfbG9jayk7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CisJCWJueDJfc2V0dXBfcGh5KGJwLCBicC0+cGh5X3BvcnQpOworCQlzcGluX3VubG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY5MDcsNiArNjkyMiw4IEBACiB7CiAJc3RydWN0IGJueDIgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOworCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKHU2NCkgKiBCTlgyX05VTV9URVNUUyk7CiAJaWYgKGV0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKIAkJaW50IGk7CkBAIC02OTI2LDkgKzY5NDMsOCBAQAogCQlpZiAoKGJ1ZlsyXSA9IGJueDJfdGVzdF9sb29wYmFjayhicCkpICE9IDApCiAJCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCi0JCWlmICghbmV0aWZfcnVubmluZyhicC0+ZGV2KSkgewotCQkJYm54Ml9yZXNldF9jaGlwKGJwLCBCTlgyX0RSVl9NU0dfQ09ERV9SRVNFVCk7Ci0JCX0KKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQkJYm54Ml9zaHV0ZG93bl9jaGlwKGJwKTsKIAkJZWxzZSB7CiAJCQlibngyX2luaXRfbmljKGJwLCAxKTsKIAkJCWJueDJfbmV0aWZfc3RhcnQoYnApOwpAQCAtNjk1Niw2ICs2OTcyLDggQEAKIAkJZXRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKIAogCX0KKwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCisJCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDNob3QpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNzAyMSw2ICs3MDM5LDggQEAKIAlpbnQgaTsKIAl1MzIgc2F2ZTsKIAorCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOworCiAJaWYgKGRhdGEgPT0gMCkKIAkJZGF0YSA9IDI7CiAKQEAgLTcwNDUsNiArNzA2NSwxMCBAQAogCX0KIAlSRUdfV1IoYnAsIEJOWDJfRU1BQ19MRUQsIDApOwogCVJFR19XUihicCwgQk5YMl9NSVNDX0NGRywgc2F2ZSk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54Ml9zZXRfcG93ZXJfc3RhdGUoYnAsIFBDSV9EM2hvdCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzUxNiw4ICs3NTQwLDcgQEAKIAogCWJwLT5zdGF0c190aWNrcyA9IFVTRUNfUEVSX1NFQyAmIEJOWDJfSENfU1RBVFNfVElDS1NfSENfU1RBVF9USUNLUzsKIAotCWJwLT50aW1lcl9pbnRlcnZhbCA9ICBIWjsKLQlicC0+Y3VycmVudF9pbnRlcnZhbCA9ICBIWjsKKwlicC0+Y3VycmVudF9pbnRlcnZhbCA9IEJOWDJfVElNRVJfSU5URVJWQUw7CiAKIAlicC0+cGh5X2FkZHIgPSAxOwogCkBAIC03NjA3LDcgKzc2MzAsNyBAQAogCWJwLT5yZXFfZmxvd19jdHJsID0gRkxPV19DVFJMX1JYIHwgRkxPV19DVFJMX1RYOwogCiAJaW5pdF90aW1lcigmYnAtPnRpbWVyKTsKLQlicC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVChicC0+dGltZXJfaW50ZXJ2YWwpOworCWJwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKEJOWDJfVElNRVJfSU5URVJWQUwpOwogCWJwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJwOwogCWJwLT50aW1lci5mdW5jdGlvbiA9IGJueDJfdGltZXI7CiAKQEAgLTc3MjAsNyArNzc0Myw2IEBACiAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYnAtPm1hY19hZGRyLCA2KTsKIAltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGJwLT5tYWNfYWRkciwgNik7Ci0JYnAtPm5hbWUgPSBib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWU7CiAKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CiAJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQpAQCAtNzc0Nyw3ICs3NzY5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogJXMgKCVjJWQpICVzIGZvdW5kIGF0IG1lbSAlbHgsICIKIAkJIklSUSAlZCwgbm9kZSBhZGRyICVzXG4iLAogCQlkZXYtPm5hbWUsCi0JCWJwLT5uYW1lLAorCQlib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWUsCiAJCSgoQ0hJUF9JRChicCkgJiAweGYwMDApID4+IDEyKSArICdBJywKIAkJKChDSElQX0lEKGJwKSAmIDB4MGZmMCkgPj4gNCksCiAJCWJueDJfYnVzX3N0cmluZyhicCwgc3RyKSwKQEAgLTc3ODEsNyArNzgwMyw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiByZXNldF9jb2RlOwogCiAJLyogUENJIHJlZ2lzdGVyIDQgbmVlZHMgdG8gYmUgc2F2ZWQgd2hldGhlciBuZXRpZl9ydW5uaW5nKCkgb3Igbm90LgogCSAqIE1TSSBhZGRyZXNzIGFuZCBkYXRhIG5lZWQgdG8gYmUgc2F2ZWQgaWYgdXNpbmcgTVNJIGFuZApAQCAtNzc5NSwxMyArNzgxNiw3IEBACiAJYm54Ml9uZXRpZl9zdG9wKGJwKTsKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAJZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7Ci0JaWYgKGJwLT5mbGFncyAmIEJOWDJfRkxBR19OT19XT0wpCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9VTkxPQURfTE5LX0ROOwotCWVsc2UgaWYgKGJwLT53b2wpCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX1dPTDsKLQllbHNlCi0JCXJlc2V0X2NvZGUgPSBCTlgyX0RSVl9NU0dfQ09ERV9TVVNQRU5EX05PX1dPTDsKLQlibngyX3Jlc2V0X2NoaXAoYnAsIHJlc2V0X2NvZGUpOworCWJueDJfc2h1dGRvd25fY2hpcChicCk7CiAJYm54Ml9mcmVlX3NrYnMoYnApOwogCWJueDJfc2V0X3Bvd2VyX3N0YXRlKGJwLCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmggYi9kcml2ZXJzL25ldC9ibngyLmgKaW5kZXggYzNjNTc5Zi4uNjE3ZDk1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Mi5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDIuaApAQCAtNjUyNiwxMCArNjUyNiwxNCBAQAogCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKIH07CiAKK3N0cnVjdCBzd190eF9iZCB7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7Cit9OworCiAjZGVmaW5lIFNXX1JYQkRfUklOR19TSVpFIChzaXplb2Yoc3RydWN0IHN3X2JkKSAqIFJYX0RFU0NfQ05UKQogI2RlZmluZSBTV19SWFBHX1JJTkdfU0laRSAoc2l6ZW9mKHN0cnVjdCBzd19wZykgKiBSWF9ERVNDX0NOVCkKICNkZWZpbmUgUlhCRF9SSU5HX1NJWkUgKHNpemVvZihzdHJ1Y3QgcnhfYmQpICogUlhfREVTQ19DTlQpCi0jZGVmaW5lIFNXX1RYQkRfUklOR19TSVpFIChzaXplb2Yoc3RydWN0IHN3X2JkKSAqIFRYX0RFU0NfQ05UKQorI2RlZmluZSBTV19UWEJEX1JJTkdfU0laRSAoc2l6ZW9mKHN0cnVjdCBzd190eF9iZCkgKiBUWF9ERVNDX0NOVCkKICNkZWZpbmUgVFhCRF9SSU5HX1NJWkUgKHNpemVvZihzdHJ1Y3QgdHhfYmQpICogVFhfREVTQ19DTlQpCiAKIC8qIEJ1ZmZlcmVkIGZsYXNoIChBdG1lbDogQVQ0NURCMDExQikgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KQEAgLTY1OTcsNyArNjYwMSw3IEBACiAKIHN0cnVjdCBibngyX2lycSB7CiAJaXJxX2hhbmRsZXJfdAloYW5kbGVyOwotCXUxNgkJdmVjdG9yOworCXVuc2lnbmVkIGludAl2ZWN0b3I7CiAJdTgJCXJlcXVlc3RlZDsKIAljaGFyCQluYW1lWzE2XTsKIH07CkBAIC02NjA5LDcgKzY2MTMsNyBAQAogCXUzMgkJCXR4X2JzZXFfYWRkcjsKIAogCXN0cnVjdCB0eF9iZAkJKnR4X2Rlc2NfcmluZzsKLQlzdHJ1Y3Qgc3dfYmQJCSp0eF9idWZfcmluZzsKKwlzdHJ1Y3Qgc3dfdHhfYmQJCSp0eF9idWZfcmluZzsKIAogCXUxNgkJCXR4X2NvbnM7CiAJdTE2CQkJaHdfdHhfY29uczsKQEAgLTY2NTQsNiArNjY1OCw4IEBACiAJc3RydWN0IGJueDJfdHhfcmluZ19pbmZvCXR4X3Jpbmc7CiB9OwogCisjZGVmaW5lIEJOWDJfVElNRVJfSU5URVJWQUwJCQlIWgorCiBzdHJ1Y3QgYm54MiB7CiAJLyogRmllbGRzIHVzZWQgaW4gdGhlIHR4IGFuZCBpbnRyL25hcGkgcGVyZm9ybWFuY2UgcGF0aHMgYXJlIGdyb3VwZWQgKi8KIAkvKiB0b2dldGhlciBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUuICovCkBAIC02NzAxLDkgKzY3MDcsNiBAQAogCiAJLyogRW5kIG9mIGZpZWxkcyB1c2VkIGluIHRoZSBwZXJmb3JtYW5jZSBjb2RlIHBhdGhzLiAqLwogCi0JY2hhcgkJCSpuYW1lOwotCi0JaW50CQkJdGltZXJfaW50ZXJ2YWw7CiAJaW50CQkJY3VycmVudF9pbnRlcnZhbDsKIAlzdHJ1Y3QJCQl0aW1lcl9saXN0IHRpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlyZXNldF90YXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Ml9mdy5oIGIvZHJpdmVycy9uZXQvYm54Ml9mdy5oCmluZGV4IGU0YjFkZTQuLjI0YzNjYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJfZncuaAorKysgYi9kcml2ZXJzL25ldC9ibngyX2Z3LmgKQEAgLTE1LDg1NCArMTUsODU0IEBACiAgKi8KIAogc3RhdGljIHU4IGJueDJfQ09NX2IwNkZ3VGV4dFtdID0gewotCTB4Y2QsIDB4N2MsIDB4MGQsIDB4NzAsIDB4NWMsIDB4ZDUsIDB4OTUsIDB4ZTYsIDB4ZTksIDB4ZDcsIDB4ZGQsIDB4NTIsCi0JMHg0YiwgMHg5NiwgMHhlNSwgMHgyNywgMHhiOSwgMHg1MSwgMHgxYSwgMHhhMiwgMHgyNCwgMHhlZiwgMHhhOSwgMHg5ZiwKLQkweGE0LCAweDA2LCAweDI5LCAweGU0LCAweGQ5LCAweDA4LCAweDEwLCAweDQ5LCAweDBmLCAweDM0LCAweGRkLCAweDkyLAotCTB4MTEsIDB4ODksIDB4NzcsIDB4MjQsIDB4NDAsIDB4NjEsIDB4YmMsIDB4M2IsIDB4YWUsIDB4YWMsIDB4YTYsIDB4MmQsCi0JMHgxMywgMHg0MiwgMHgzMSwgMHgzNSwgMHhhZSwgMHgwYSwgMHgzYiwgMHg3MSwgMHhiMiwgMHgwNCwgMHgzNywgMHgyZCwKLQkweDk5LCAweDM4LCAweDhjLCAweGVjLCAweDU2LCAweDY0LCAweDU5LCAweDY2LCAweDY3LCAweGQ4LCAweGQ5LCAweDRlLAotCTB4NGIsIDB4YjIsIDB4MTksIDB4YTYsIDB4ZWQsIDB4YzYsIDB4OTAsIDB4MWYsIDB4YTYsIDB4OTIsIDB4MGMsIDB4NWEsCi0JMHhlMywgMHgwMCwgMHg5MywgMHhjZCwgMHg1NiwgMHg0MSwgMHgyYSwgMHhiNSwgMHhjYiwgMHg2YywgMHg1MSwgMHhiYiwKLQkweDVlLCAweDI3LCAweDRjLCAweGIyLCAweGE5LCAweGRhLCAweDBhLCAweDNiLCAweDkzLCAweGRhLCAweDY1LCAweGYyLAotCTB4MzMsIDB4NmYsIDB4YmYsIDB4ZWYsIDB4YmUsIDB4ZmIsIDB4YTQsIDB4OTYsIDB4YWMsIDB4MzgsIDB4NGMsIDB4YTYsCi0JMHg1MiwgMHgzNSwgMHhhYSwgMHhlYSwgMHhiYSwgMHhlZiwgMHhkZSwgMHg3NywgMHg3ZiwgMHhjZSwgMHgzZCwgMHhmNywKLQkweGRjLCAweDczLCAweGJlLCAweDczLCAweGVlLCAweDdkLCAweGJhLCAweDU1LCAweGE0LCAweDU5LCAweGY0LCAweGRmLAotCTB4NTYsIDB4ZmMsIDB4MDYsIDB4N2UsIDB4ZmYsIDB4MGYsIDB4ZjYsIDB4ZGQsIDB4NzgsIDB4YmQsIDB4N2IsIDB4M2QsCi0JMHhmMywgMHg0NiwgMHg1NCwgMHgyMiwgMHg0YywgMHhjMywgMHhmOCwgMHhjNSwgMHhmMSwgMHhkYiwgMHhhOSwgMHg5ZiwKLQkweDM3LCAweGZiLCAweDMzLCAweGYxLCAweGJiLCAweDI5LCAweDI0LCAweDMyLCAweGYxLCAweDIzLCAweDkxLCAweGQwLAotCTB4ODYsIDB4NzcsIDB4YjEsIDB4NGQsIDB4ZWEsIDB4N2IsIDB4ZGUsIDB4MmYsIDB4ZTksIDB4NDgsIDB4ZmYsIDB4MTksCi0JMHhmOCwgMHg1OSwgMHg1NywgMHhhZSwgMHhiMiwgMHgzYSwgMHhlZSwgMHhhZiwgMHhmYiwgMHgxNywgMHhkNiwgMHhjZCwKLQkweGI3LCAweGVhLCAweDlmLCAweGM0LCAweDhjLCAweGY0LCAweGM1LCAweGRmLCAweGNlLCAweDNhLCAweDEyLCAweDBiLAotCTB4YTcsIDB4YmYsIDB4M2IsIDB4YmEsIDB4Y2YsIDB4MTEsIDB4YzksIDB4NTQsIDB4ZmIsIDB4YWMsIDB4OWMsIDB4ZmMsCi0JMHhjMiwgMHgyYiwgMHhjNCwgMHgyMywgMHhjMiwgMHhmMiwgMHhmNywgMHhhNCwgMHg3ZiwgMHg3ZSwgMHhlOCwgMHgxYiwKLQkweDM3LCAweGRiLCAweDZmLCAweDk1LCAweGMzLCAweDEyLCAweDMzLCAweGQzLCAweDZmLCAweDhiLCAweGQ5LCAweDIzLAotCTB4YjEsIDB4NGUsIDB4YjQsIDB4NzksIDB4YjIsIDB4ZjcsIDB4MjksIDB4NDMsIDB4NWEsIDB4ODMsIDB4YmUsIDB4Y2MsCi0JMHg4OSwgMHg3MCwgMHg1YSwgMHhjNiwgMHgyNiwgMHg2NywgMHgwZSwgMHg3OSwgMHg4NiwgMHgyMywgMHg4NSwgMHg2YiwKLQkweGQyLCAweDhlLCAweDU1LCAweDk0LCAweDk2LCAweGMxLCAweGU5LCAweDgxLCAweDliLCAweDA1LCAweGY5LCAweGIxLAotCTB4YzksIDB4NmEsIDB4NGMsIDB4YjIsIDB4YjUsIDB4NDIsIDB4OGIsIDB4ZTEsIDB4MzgsIDB4NDgsIDB4NjMsIDB4ODUsCi0JMHg3NywgMHhhNywgMHgyNSwgMHhkNiwgMHg5MCwgMHg5ZSwgMHg2ZiwgMHg3YywgMHhjOSwgMHhlMSwgMHhmOCwgMHg4OSwKLQkweGQxLCAweGFjLCAweGYzLCAweDZlLCAweDg5LCAweDM4LCAweDllLCAweDM3LCAweDhkLCAweGYxLCAweDc3LCAweDU1LAotCTB4N2YsIDB4ZTEsIDB4M2QsIDB4MWEsIDB4ZjEsIDB4YzcsIDB4MzYsIDB4ZDIsIDB4MDcsIDB4YzMsIDB4NGMsIDB4NDMsCi0JMHg2OSwgMHg2YiwgMHhiNCwgMHhhYiwgMHhhYSwgMHhmMiwgMHgwZCwgMHg3ZSwgMHhkZSwgMHhkMSwgMHhmOSwgMHg1OCwKLQkweGIzLCAweDRmLCAweGJiLCAweDM0LCAweDgxLCAweGY2LCAweDU4LCAweDI0LCAweDlkLCAweDZlLCAweDQyLCAweDFmLAotCTB4YjEsIDB4NjgsIDB4ZmEsIDB4OTksIDB4ZGYsIDB4NWEsIDB4NTYsIDB4ZjUsIDB4ZWUsIDB4ZDcsIDB4ZjUsIDB4ZWUsCi0JMHg4ZiwgMHhmYSwgMHhlZCwgMHgyNiwgMHg0NywgMHg3YiwgMHhhYSwgMHg0YywgMHgxZiwgMHgxYSwgMHhlZCwgMHg1NiwKLQkweGU5LCAweGMzLCAweGEzLCAweDQ5LCAweDk1LCAweDE2LCAweDU0LCAweGJkLCAweDUwLCAweDdhLCAweDdhLCAweGQ0LAotCTB4NTEsIDB4NjksIDB4YTcsIDB4MmUsIDB4NGYsIDB4OGQsIDB4NWEsIDB4MmEsIDB4ZWQsIDB4ZDcsIDB4YTksIDB4YWIsCi0JMHhkMywgMHgwMSwgMHg5ZCwgMHgwZSwgMHhlYSwgMHgzNCwgMHhhZCwgMHhkMywgMHg4YywgMHg0ZSwgMHg4NywgMHg3NCwKLQkweDNmLCAweDIzLCAweDNhLCAweGJmLCAweDViLCAweGE3LCAweDYzLCAweDNhLCAweDFkLCAweGQ3LCAweGU5LCAweDFlLAotCTB4OWQsIDB4ZWUsIDB4ZDUsIDB4NzQsIDB4NGQsIDB4ZTgsIDB4ZjQsIDB4NDEsIDB4NWQsIDB4N2UsIDB4NDAsIDB4ZDMsCi0JMHg3OSwgMHgxMCwgMHhmNCwgMHg3YywgMHhhNiwgMHg1MSwgMHhjYiwgMHgyZCwgMHhlNiwgMHg2YiwgMHhjOSwgMHhiZSwKLQkweDk5LCAweDk4LCAweDE0LCAweDRiLCAweDYxLCAweGM5LCAweGE5LCAweGY1LCAweGZjLCAweDdjLCAweDU0LCAweDlhLAotCTB4NjMsIDB4MzIsIDB4NTUsIDB4OGIsIDB4YzksIDB4NDUsIDB4MjUsIDB4YWUsIDB4M2YsIDB4ZjQsIDB4YmUsIDB4ZDEsCi0JMHg2YiwgMHhjYSwgMHgzMywgMHhiNSwgMHhiOCwgMHhiYywgMHg1MCwgMHg5MywgMHhkMCwgMHg1OCwgMHg2ZiwgMHg5MywKLQkweDE4LCAweDczLCAweGQ3LCAweDQ4LCAweGM2LCAweDBjLCAweDQ5LCAweDU4LCAweGYxLCAweGQ1LCAweDkyLCAweGVjLAotCTB4NGMsIDB4MDcsIDB4ZjIsIDB4NzYsIDB4NDIsIDB4ZTQsIDB4ZTUsIDB4YTgsIDB4YmYsIDB4OGUsIDB4MzEsIDB4MDksCi0JMHgyZiwgMHg3MCwgMHg1ZCwgMHgxNiwgMHg0NiwgMHg1ZiwgMHg5YSwgMHg0ZiwgMHg0OCwgMHhlNCwgMHg5OCwgMHg4NSwKLQkweGZlLCAweDViLCAweDI0LCAweGJhLCAweDIwLCAweDlkLCAweDYxLCAweGU5LCAweDRlLCAweGRjLCAweDg3LCAweDFhLAotCTB4NDMsIDB4ZDUsIDB4ODgsIDB4MGMsIDB4NTcsIDB4NDMsIDB4NTgsIDB4YWIsIDB4MTgsIDB4ZTQsIDB4YTQsIDB4MDUsCi0JMHgzZiwgMHgxMywgMHhiZiwgMHgzOCwgMHg3ZSwgMHgwOSwgMHhmYywgMHgzYywgMHhmNCwgMHhkMywgMHgyOSwgMHhiOSwKLQkweDJhLCAweGZiLCAweGM0LCAweGI4LCAweDI1LCAweDhjLCAweDVmLCAweGIyLCAweGNkLCAweDA5LCAweDIxLCAweDRkLAotCTB4MDksIDB4ZjksIDB4NDYsIDB4YWYsIDB4NGYsIDB4ZDMsIDB4MGIsIDB4YjUsIDB4NTgsIDB4MjgsIDB4N2IsIDB4NTIsCi0JMHgwZSwgMHhlNCwgMHg1YywgMHhiMSwgMHgwYywgMHhhNywgMHg1OSwgMHhmMiwgMHg2NiwgMHhjOCwgMHg5YSwgMHg0YywKLQkweGI1LCAweDRiLCAweDYxLCAweDFjLCAweGVmLCAweDRhLCAweDkyLCAweDMxLCAweGQwLCAweDc3LCAweGRlLCAweDk0LAotCTB4MDksIDB4ZmYsIDB4MWQsIDB4Y2IsIDB4ZmUsIDB4MWUsIDB4ZmIsIDB4ZDUsIDB4MzYsIDB4MjksIDB4YjgsIDB4MmYsCi0JMHg5NCwgMHhmZSwgMHgwMiwgMHhjZiwgMHhlYywgMHhlYiwgMHhjZCwgMHg4OCwgMHg0ZiwgMHhmMywgMHhkYiwgMHhjOCwKLQkweGIzLCAweGZjLCAweDY3LCAweGRiLCAweGZjLCAweDNjLCAweDlmLCAweDU5LCAweDM3LCAweDE4LCAweDMzLCAweDk4LAotCTB4MmIsIDB4YzcsIDB4ZWUsIDB4YzUsIDB4N2MsIDB4MzksIDB4ZmUsIDB4ZWEsIDB4N2MsIDB4NDEsIDB4NDcsIDB4NGIsCi0JMHgyOCwgMHg3NywgMHhkMiwgMHg5MiwgMHhjMywgMHhhNSwgMHg1YiwgMHgyNSwgMHhlYiwgMHg3YSwgMHhkZSwgMHgzZSwKLQkweDU3LCAweGUyLCAweDg2LCAweDc0LCAweDliLCAweDM5LCAweGJjLCAweGFkLCAweDU0LCAweDI1LCAweDk0LCAweDJkLAotCTB4MDUsIDB4ZmMsIDB4NjAsIDB4YmYsIDB4MTEsIDB4OTQsIDB4NzUsIDB4YTAsIDB4N2UsIDB4NmIsIDB4NjgsIDB4ZTgsCi0JMHgyNCwgMHg2OCwgMHg0ZiwgMHg5MywgMHgyZiwgMHg5MCwgMHg1OSwgMHhiNywgMHgzYiwgMHgzMSwgMHg4OSwgMHhmMSwKLQkweDE2LCAweGFiLCAweGRkLCAweGVlLCAweDc5LCAweDMxLCAweGQxLCAweDY3LCAweDNiLCAweGVhLCAweDkwLCAweDQ3LAotCTB4ZWMsIDB4OGIsIDB4N2QsIDB4YjIsIDB4YmYsIDB4MTYsIDB4YjQsIDB4OGQsIDB4ZTMsIDB4MWQsIDB4NjksIDB4ZjIsCi0JMHhiYywgMHhhYywgMHg2YiwgMHgzMiwgMHgyZiwgMHg2NSwgMHhmMCwgMHhhZCwgMHg0YywgMHhiZSwgMHgzNSwgMHg3NywKLQkweGNhLCAweGE5LCAweDJhLCAweGM3LCAweGQ4LCAweDhjLCAweGVlLCAweGViLCAweGZlLCAweDk5LCAweGQxLCAweDlkLAotCTB4NDAsIDB4ZmYsIDB4NzEsIDB4YTQsIDB4NWIsIDB4NDIsIDB4ZDksIDB4ZTMsIDB4MWUsIDB4YzYsIDB4NGYsIDB4ZTAsCi0JMHg3OSwgMHhiMywgMHgzOSwgMHg1YywgMHhkNCwgMHgzMiwgMHg5OCwgMHgwMCwgMHhlZCwgMHg3MSwgMHgzOSwgMHhhNywKLQkweGU0LCAweDcwLCAweDhiLCAweDg0LCAweDIxLCAweDg3LCAweDVjLCAweGUzLCAweGI2LCAweDg1LCAweDFiLCAweDI1LAotCTB4MWYsIDB4YjcsIDB4MmQsIDB4ZWEsIDB4Y2UsIDB4YWUsIDB4OWQsIDB4NGQsIDB4OTgsIDB4YTMsIDB4ZDYsIDB4ODIsCi0JMHhjNywgMHhlMiwgMHg5MCwgMHhjMywgMHhmMywgMHg2ZCwgMHgwNiwgMHg0YSwgMHgwYywgMHhiMSwgMHhjZCwgMHg3ZiwKLQkweDI1LCAweDA1LCAweGM5LCAweDJkLCAweDdkLCAweDJhLCAweDI0LCAweGNkLCAweDA2LCAweGVhLCAweDVkLCAweDFiLAotCTB4ZjIsIDB4NzksIDB4NDAsIDB4ZmUsIDB4NjQsIDB4YzAsIDB4OWYsIDB4OTAsIDB4ZjgsIDB4ZmIsIDB4M2EsIDB4MjMsCi0JMHg1ZCwgMHg1NSwgMHhiZSwgMHhlZiwgMHhiMywgMHgwYywgMHhmNSwgMHg2ZSwgMHgwOCwgMHhlZiwgMHgyMiwgMHg5MiwKLQkweGRjLCAweDE5LCAweGJjLCAweDFmLCAweGMyLCAweGZiLCAweDZiLCAweDY0LCAweGMyLCAweDA0LCAweDJkLCAweGE1LAotCTB4ZTcsIDB4OGQsIDB4MmMsIDB4NjgsIDB4YmMsIDB4M2QsIDB4YTIsIDB4ZTYsIDB4OGEsIDB4YmEsIDB4MTMsIDB4NzUsCi0JMHhmZCwgMHg0YywgMHhhMCwgMHhkZSwgMHgxZiwgMHg2MywgMHgyYywgMHhkMCwgMHg1YiwgMHhiMiwgMHg0MCwgMHg0YiwKLQkweDA3LCAweDY4LCAweDIxLCAweDhkLCAweDA1LCAweDIzLCAweDViLCAweDhiLCAweDIwLCAweDNmLCAweDZkLCAweGU0LAotCTB4NGUsIDB4MWYsIDB4YzEsIDB4YjMsIDB4OTgsIDB4NDYsIDB4ZmEsIDB4NzksIDB4YTYsIDB4NjgsIDB4YmYsIDB4YjcsCi0JMHhhZSwgMHhmZCwgMHg1ZSwgMHhiNCwgMHhlNywgMHgxOCwgMHg2YywgMHhlZiwgMHhjYiwgMHg3ZiwgMHg0MSwgMHhjOSwKLQkweGEyLCAweDc1LCAweDA1LCAweDdlLCAweDg0LCAweDdmLCAweDBkLCAweDdlLCAweDdjLCAweDRkLCAweGYzLCAweGUzLAotCTB4NjcsIDB4ZjIsIDB4OWIsIDB4ZTcsIDB4YzcsIDB4N2YsIDB4ZmYsIDB4MGQsIDB4ZjEsIDB4NDMsIDB4MjQsIDB4N2YsCi0JMHg5YywgMHhjZiwgMHgxMSwgMHgyOSwgMHgyOCwgMHhiZCwgMHhjNSwgMHg3ZCwgMHg0YiwgMHg3OSwgMHhhNywgMHhjZSwKLQkweDIyLCAweDlmLCAweDI4LCAweGM3LCAweGQ4LCAweDAzLCAweGI1LCAweDA4LCAweGQyLCAweGE3LCAweDkwLCAweDZlLAotCTB4MDksIDB4OGQsIDB4MWQsIDB4YmYsIDB4ODQsIDB4ZjUsIDB4ZjcsIDB4YzQsIDB4ZGMsIDB4MTksIDB4ZDgsIDB4OGQsCi0JMHg0MiwgMHhjMiwgMHg5NCwgMHg0ZSwgMHgzMSwgMHhhZiwgMHg4NywgMHhkMSwgMHhlZSwgMHhiMCwgMHhjZCwgMHhiYywKLQkweGJjLCAweDg5LCAweGY3LCAweGJmLCAweDA4LCAweDA1LCAweGY2LCAweDNkLCAweDNiLCAweGQzLCAweGY0LCAweDc2LAotCTB4NDYsIDB4M2QsIDB4NDUsIDB4YzksIDB4Y2YsIDB4OGMsIDB4OTEsIDB4OGUsIDB4ODQsIDB4NzIsIDB4MjUsIDB4NmIsCi0JMHhjMiwgMHg0OCwgMHhjNywgMHhhMSwgMHhhNywgMHg5OCwgMHgxZiwgMHgwYywgMHhmOSwgMHgzNCwgMHgwZiwgMHhhMCwKLQkweDZlLCAweGEwLCAweGIzLCAweDAyLCAweGRhLCAweDA3LCAweDQwLCAweGZiLCAweDQ2LCAweGRkLCAweDk1LCAweDAxLAotCTB4MmQsIDB4YTQsIDB4ODEsIDB4NzQsIDB4NTUsIDB4YzIsIDB4OWEsIDB4ZjcsIDB4ZTgsIDB4ZTcsIDB4YTAsIDB4ZWEsCi0JMHgyNywgMHg5YywgMHgxZSwgMHgxNCwgMHhkYSwgMHhkMCwgMHhmYywgMHgwYywgMHhmNywgMHgwMSwgMHhkYiwgMHhiMSwKLQkweDJmLCAweDVmLCAweDI3LCAweGU3LCAweGFiLCAweDQxLCAweDFmLCAweDg1LCAweGJhLCAweDNlLCAweDBhLCAweGEwLAotCTB4NDcsIDB4YjYsIDB4MTksIDB4NGUsIDB4MTQsIDB4NmIsIDB4Y2YsIDB4YWUsIDB4OGUsIDB4ZTAsIDB4ZGQsIDB4OTMsCi0JMHg5MiwgMHgzZCwgMHg3ZCwgMHhiMywgMHg4MSwgMHgzOSwgMHhhMCwgMHg1ZiwgMHhmMiwgMHg2OCwgMHgwYywgMHgzYSwKLQkweDliLCAweGZiLCAweDJjLCAweDI2LCAweGI5LCAweDM4LCAweGNiLCAweDNlLCAweGE2LCAweGM3LCAweDhkLCAweDQ4LAotCTB4NDYsIDB4ZTUsIDB4NWYsIDB4NjksIDB4NWQsIDB4YTMsIDB4ZTMsIDB4NzksIDB4M2QsIDB4OWYsIDB4MzQsIDB4ZTYsCi0JMHg0MywgMHgxYSwgMHg4MiwgMHhiOSwgMHhhNCwgMHhlYiwgMHhlNiwgMHgxMiwgMHhmMCwgMHg5YSwgMHhiYywgMHgzMCwKLQkweGExLCAweGUzLCAweDYzLCAweGRhLCAweDg2LCAweGIwLCAweGRkLCAweDc0LCAweGRkLCAweGRhLCAweDRkLCAweGEzLAotCTB4MGQsIDB4NzksIDB4OGYsIDB4M2EsIDB4MWIsIDB4ZWMsIDB4MGEsIDB4NmQsIDB4Y2EsIDB4MTAsIDB4ZmEsIDB4MjksCi0JMHhjZSwgMHgxYiwgMHg5MiwgMHg3MywgMHg2MSwgMHhhYiwgMHhkZCwgMHg3NywgMHg2YiwgMHg3OSwgMHg1ZCwgMHg5MywKLQkweGE1LCAweGU4LCAweGE2LCAweGIyLCAweDc0LCAweGM4LCAweGYwLCAweGY1LCAweDM1LCAweDZjLCAweDBiLCAweGVjLAotCTB4Y2YsIDB4ZDQsIDB4YmMsIDB4OWQsIDB4MGEsIDB4NjQsIDB4YTksIDB4MzgsIDB4ZjMsIDB4NGUsIDB4NjQsIDB4MjksCi0JMHg2OCwgMHgxZiwgMHg4MywgMHhlYywgMHgwNiwgMHg2MywgMHg2YywgMHhhNCwgMHgzOSwgMHhhOCwgMHgwMywgMHgxYSwKLQkweDRiLCAweDU5LCAweDhkLCAweDUxLCAweDM4LCAweDhlLCAweDZmLCAweDFiLCAweGNhLCAweGViLCAweDZjLCAweGMzLAotCTB4MTEsIDB4YjQsIDB4OTUsIDB4NTAsIDB4YWUsIDB4YjcsIDB4NDUsIDB4ZjYsIDB4Y2YsIDB4MDcsIDB4N2QsIDB4MWMsCi0JMHg1MSwgMHgzMiwgMHgzYiwgMHgzOSwgMHg2MywgMHg5YiwgMHhjMywgMHg2MSwgMHhjOSwgMHgwYywgMHhjZiwgMHgwZSwKLQkweGNhLCAweDUwLCAweGFkLCAweDEzLCAweDZiLCAweGZhLCAweGI2LCAweDA3LCAweGRiLCAweDc5LCAweDdkLCAweDU0LAotCTB4MWMsIDB4ZTgsIDB4NDUsIDB4Y2MsIDB4NzksIDB4MDAsIDB4M2MsIDB4YWUsIDB4NDUsIDB4YzUsIDB4NDgsIDB4YmIsCi0JMHg0OCwgMHhlYiwgMHgzMSwgMHg1NiwgMHgyNCwgMHgzMiwgMHhiYywgMHgyZSwgMHhkZiwgMHg4MCwgMHgzYSwgMHhlOCwKLQkweDdiLCAweDYwLCAweDYzLCAweDNkLCAweGM4LCAweDI3LCAweDc4LCAweDliLCAweDc1LCAweDdmLCAweGUxLCAweGMxLAotCTB4MGUsIDB4NmIsIDB4OWIsIDB4YzUsIDB4NTIsIDB4ZWEsIDB4ODksIDB4NDAsIDB4NDcsIDB4N2MsIDB4MTQsIDB4ZmIsCi0JMHg1YiwgMHhlZCwgMHg4NSwgMHg4MiwgMHg5MSwgMHgzZSwgMHg4MCwgMHgzZSwgMHg0NCwgMHhjOSwgMHg2OSwgMHhiMSwKLQkweGY2LCAweDRjLCAweGIwLCAweGVmLCAweDU1LCAweGY5LCAweGFlLCAweDAxLCAweGNhLCAweDVlLCAweDE5LCAweDk4LAotCTB4ODAsIDB4NzMsIDB4NWEsIDB4NTIsIDB4N2IsIDB4M2QsIDB4NjcsIDB4YzYsIDB4NjUsIDB4YmEsIDB4YzQsIDB4ZjksCi0JMHgyYywgMHg0OSwgMHhiMiwgMHhmYSwgMHhhNywgMHg5MiwgMHgzYiwgMHgyZCwgMHhmMiwgMHhhZCwgMHgxOSwgMHhkNiwKLQkweGZiLCAweGJhLCAweGFlLCAweGY3LCAweDNjLCAweGVhLCAweDI1LCAweGFkLCAweGExLCAweDkwLCAweDBkLCAweDNiLAotCTB4NjAsIDB4NjMsIDB4OWIsIDB4ZjQsIDB4NTksIDB4NDgsIDB4Y2QsIDB4MTEsIDB4ZmMsIDB4ODYsIDB4NjgsIDB4NjQsCi0JMHg1MCwgMHhjZiwgMHhjNywgMHg0MCwgMHhjZiwgMHg4MywgMHgxZiwgMHgyMiwgMHg3NywgMHg5NSwgMHgxYSwgMHhhMSwKLQkweDRmLCAweGZlLCAweDI3LCAweDY4LCAweDhkLCAweGNiLCAweGUzLCAweDk4LCAweGM3LCAweDRiLCAweDMzLCAweGM0LAotCTB4NTksIDB4NWYsIDB4OTcsIDB4ZTUsIDB4MTksIDB4ZTIsIDB4YWUsIDB4ZTcsIDB4NjUsIDB4N2EsIDB4MjYsIDB4ZTksCi0JMHg3ZSwgMHgwYiwgMHg3YywgMHgzZSwgMHgyNSwgMHg5YywgMHg0YiwgMHg5ZiwgMHg4YiwgMHgxNCwgMHgxOCwgMHhkMCwKLQkweGI2LCAweDFlLCAweDgzLCAweDNlLCAweGViLCAweGRkLCAweGU5LCAweGY3LCAweGQ3LCAweGFkLCAweGZiLCAweDczLAotCTB4YWEsIDB4YjYsIDB4NWMsIDB4MzQsIDB4YTksIDB4OWYsIDB4MmUsIDB4ZGYsIDB4ZTMsIDB4NTksIDB4YmQsIDB4YzcsCi0JMHhjNywgMHhkYywgMHg0ZSwgMHgzMSwgMHhiMCwgMHhhZiwgMHgzMywgMHhlMywgMHgwNSwgMHg1OCwgMHgzZiwgMHhlZSwKLQkweGViLCAweGZmLCAweDZiLCAweGFjLCAweGUxLCAweDlmLCAweDA0LCAweGIwLCAweGFhLCAweGFkLCAweGVjLCAweGRkLAotCTB4M2YsIDB4NmUsIDB4OGYsIDB4ZDcsIDB4ZWYsIDB4NmQsIDB4OGUsIDB4ZGYsIDB4OGEsIDB4MzYsIDB4MTEsIDB4YTQsCi0JMHg1NywgMHhkZSwgMHhkNywgMHhlOCwgMHhhMywgMHhhZSwgMHhlZCwgMHgyMCwgMHhmNywgMHgwNSwgMHhkYSwgMHhmYywKLQkweDA5LCAweDc4LCAweDQxLCAweGZlLCAweGJmLCAweDkzLCAweGZkLCAweGRjLCAweDE3LCAweDdlLCAweDQ3LCAweGZiLAotCTB4NzksIDB4ZmMsIDB4NGEsIDB4ZmIsIDB4YjksIDB4N2UsIDB4MmYsIDB4OWYsIDB4MjUsIDB4MmYsIDB4MzAsIDB4YjYsCi0JMHhjYywgMHhmYSwgMHhiMiwgMHhkNSwgMHgwZCwgMHg1ZSwgMHg1YiwgMHg5MCwgMHg1MywgMHhkMCwgMHg1MCwgMHhmYSwKLQkweDA3LCAweDJmLCAweDEzLCAweGYxLCAweGYxLCAweDljLCAweDJmLCAweDRmLCAweGFjLCAweDE3LCAweGQ0LCAweGYxLAotCTB4NzUsIDB4ZWYsIDB4NTAsIDB4ZWQsIDB4YTIsIDB4ZDIsIDB4YjMsIDB4ZTcsIDB4OTQsIDB4OWUsIDB4YjUsIDB4OGYsCi0JMHgxNCwgMHg4NCwgMHhmMiwgMHg3NiwgMHg0MywgMHg5OCwgMHg3YywgMHg3ZiwgMHhjNiwgMHhmZCwgMHgyYywgMHg2OCwKLQkweGI0LCAweDJkLCAweGNiLCAweGU4LCAweDJlLCAweDE4LCAweGM2LCAweDY3LCAweGU1LCAweGMwLCAweGUyLCAweDQzLAotCTB4NzIsIDB4YTAsIDB4YzQsIDB4M2UsIDB4ZDIsIDB4NzgsIDB4ZWYsIDB4YTAsIDB4YWMsIDB4MDksIDB4YmEsIDB4OTYsCi0JMHgzYSwgMHhmZCwgMHhlZCwgMHg5MCwgMHgzZiwgMHg5NiwgMHgwMSwgMHhmYiwgMHhiNSwgMHgxMiwgMHhiYSwgMHhhYiwKLQkweDc2LCAweDIxLCAweDk0LCAweDVkLCAweGU0LCAweGRlLCAweDQ1LCAweDc5LCAweGFkLCAweDVlLCAweGU3LCAweDA3LAotCTB4ZmEsIDB4YmUsIDB4NWUsIDB4YjcsIDB4MTcsIDB4NDIsIDB4NjMsIDB4YTUsIDB4NjksIDB4ZTIsIDB4NDAsIDB4MjMsCi0JMHhlYiwgMHg0NiwgMHhiNSwgMHhlZSwgMHhmOCwgMHg5YSwgMHgyOSwgMHhhZCwgMHhiMCwgMHgyZCwgMHhjNiwgMHgzYywKLQkweDc4LCAweDQ1LCAweDljLCAweDRhLCAweGRlLCAweGE1LCAweDI0LCAweDEzLCAweDIxLCAweDllLCAweGU0LCAweGIzLAotCTB4NzgsIDB4ZTEsIDB4MzQsIDB4ZjcsIDB4OWUsIDB4NDQsIDB4YzIsIDB4ZTksIDB4MmUsIDB4ZjAsIDB4OGUsIDB4NzUsCi0JMHg2ZSwgMHgwNSwgMHhhZCwgMHhiMCwgMHg3YiwgMHhlZSwgMHhmYiwgMHg4NCwgMHg3MiwgMHhmOSwgMHg0MiwgMHhlOSwKLQkweDM2LCAweGU0LCAweDIzLCAweDlhLCAweGJmLCAweDUxLCAweGQ0LCAweDYxLCAweDdmLCAweDNmLCAweDZkLCAweDkwLAotCTB4ZDYsIDB4ZTMsIDB4ZDAsIDB4MTUsIDB4NDEsIDB4YmYsIDB4YWMsIDB4OTMsIDB4ZDAsIDB4NzUsIDB4NWEsIDB4NzQsCi0JMHg5ZCwgMHg1YiwgMHhmMCwgMHg3ZSwgMHgwZSwgMHhmNSwgMHg2YywgMHg1NywgMHg4NCwgMHg3YywgMHg2MCwgMHg1OSwKLQkweDNiLCAweGU2LCAweDg1LCAweGJhLCAweDhiLCAweGU5LCAweGYwLCAweDdhLCAweGJhLCAweDZlLCAweGFhLCAweGFiLAotCTB4Y2IsIDB4ZmMsIDB4NjYsIDB4NTgsIDB4OTcsIDB4ZjIsIDB4MjQsIDB4NWEsIDB4OTcsIDB4YjEsIDB4NmMsIDB4MTAsCi0JMHhjZiwgMHg1ZCwgMHgzMiwgMHhiMSwgMHg5OCwgMHg4MSwgMHg0ZSwgMHhiYSwgMHg1ZCwgMHhmNSwgMHgxMywgMHg3NSwKLQkweGQ2LCAweGQ5LCAweDNhLCAweGQwLCAweDY0LCAweDY5LCAweDlhLCAweGI2LCAweDA0LCAweGZhLCAweDE4LCAweDY1LAotCTB4YWUsIDB4MmUsIDB4NmIsIDB4YTgsIDB4MmIsIDB4MGIsIDB4ZTQsIDB4ZTcsIDB4NWYsIDB4ODMsIDB4NzYsIDB4OGUsCi0JMHgzZCwgMHhhMiwgMHg3MSwgMHg5OCwgMHhlNywgMHhlNSwgMHgyOCwgMHg3NywgMHhmZCwgMHhmZiwgMHg1MiwgMHhmMywKLQkweGEyLCAweDYwLCAweDg2LCAweGQ1LCAweDVlLCAweGE5LCAweGZlLCAweGY2LCAweGRhLCAweDVlLCAweDAxLCAweDZlLAotCTB4NTcsIDB4YmQsIDB4NzAsIDB4OGUsIDB4YTQsIDB4YTUsIDB4MDUsIDB4NmIsIDB4M2IsIDB4MDQsIDB4NWEsIDB4YjEsCi0JMHg4NiwgMHgxZCwgMHgyMSwgMHhjYywgMHhiNywgMHg0NSwgMHhmMiwgMHhiNSwgMHhiNCwgMHg3ZSwgMHhjNywgMHhmMiwKLQkweDg4LCAweDhjLCAweGM1LCAweDgzLCAweGY5LCAweDdkLCAweGMwLCAweGY0LCAweGIxLCAweDM3LCAweGVhLCAweDk0LAotCTB4YjYsIDB4NDQsIDB4ZmMsIDB4YmQsIDB4NjgsIDB4NGEsIDB4ZmUsIDB4ZTQsIDB4MTAsIDB4NjQsIDB4OWUsIDB4ZDgsCi0JMHhiMCwgMHgwMSwgMHgzMiwgMHgxZiwgMHg1NywgMHgzNiwgMHhjNywgMHg3MCwgMHg1OCwgMHgxZiwgMHhlZiwgMHg0ZSwKLQkweGZmLCAweGJiLCAweGIwLCAweGRmLCAweDg2LCAweGY1LCAweDgyLCAweDM2LCAweGMxLCAweGQ4LCAweGVkLCAweGFiLAotCTB4NmQsIDB4YzcsIDB4NWMsIDB4NDMsIDB4YzIsIDB4NmEsIDB4N2MsIDB4OTQsIDB4OWQsIDB4NWUsIDB4M2YsIDB4YmUsCi0JMHhkMSwgMHgxMSwgMHg4YywgMHhmZiwgMHhhNywgMHhiYSwgMHhhZiwgMHhmNiwgMHhiYSwgMHhiZSwgMHhlMiwgMHg1NywKLQkweDE4LCAweDFmLCAweGVmLCAweDRlLCAweGZmLCAweGVlLCAweDc2LCAweGJmLCAweDRkLCAweGJjLCAweGFlLCAweDRkLAotCTB4YzcsIDB4ODYsIDB4MzYsIDB4YWMsIDB4MWYsIDB4OGMsIDB4ODEsIDB4NzcsIDB4YTcsIDB4ZWYsIDB4NmIsIDB4ZjEsCi0JMHhkYiwgMHhiMCwgMHg1ZSwgMHgwMywgMHg2YywgMHgyYywgMHhkZiwgMHg3MSwgMHgwZiwgMHgxZSwgMHhhOCwgMHhkYiwKLQkweDgzLCAweDA3LCAweGIwLCAweDA3LCAweDAzLCAweGQ5LCAweGRlLCAweDg4LCAweGQ3LCAweDAzLCAweGJmLCAweDhiLAotCTB4ZmUsIDB4MTYsIDB4MzEsIDB4ZGUsIDB4OWEsIDB4N2YsIDB4MTUsIDB4NTksIDB4NjgsIDB4MDEsIDB4N2UsIDB4NmEsCi0JMHhhNSwgMHg0ZiwgMHhhNSwgMHhmMSwgMHgzOSwgMHg3ZCwgMHgyYywgMHhlMiwgMHg3MSwgMHg3MSwgMHgyMiwgMHhkMiwKLQkweDBkLCAweDVkLCAweGQ5LCAweDlkLCAweGQ4LCAweGNmLCAweDhkLCAweDVmLCAweDhkLCAweDJiLCAweGRjLCAweDllLAotCTB4ZDEsIDB4NjMsIDB4ZDAsIDB4YmYsIDB4MjIsIDB4ZGYsIDB4OTksIDB4Y2YsIDB4YWQsIDB4ZmEsIDB4NWIsIDB4OWQsCi0JMHhmMCwgMHhjNywgMHg4OCwgMHhiYiwgMHg4OSwgMHhkYiwgMHgwMiwgMHhmYSwgMHgwMywgMHg3YSwgMHgwZSwgMHgxYSwKLQkweDZiLCAweDdiLCAweDMzLCAweDYzLCAweDBjLCAweGQ1LCAweDg2LCAweDBjLCAweDdmLCAweDZmLCAweGYyLCAweGZkLAotCTB4NDEsIDB4NmQsIDB4NWIsIDB4MzcsIDB4ZDIsIDB4ZmIsIDB4OWUsIDB4MGQsIDB4ZjQsIDB4MTIsIDB4ZGYsIDB4NTksCi0JMHgzMiwgMHgwNSwgMHgxOSwgMHg4OSwgMHgyYywgMHg1MCwgMHhkNywgMHgyZiwgMHg4YywgMHgyZSwgMHhjZiwgMHgxMywKLQkweGM3LCAweGY0LCAweDgzLCAweDJmLCAweGE0LCAweDk3LCAweGZjLCAweGEzLCAweDRlLCAweDY5LCAweDg1LCAweDllLAotCTB4ZWEsIDB4NGUsIDB4NTUsIDB4NTAsIDB4OWYsIDB4N2UsIDB4ZmUsIDB4ODQsIDB4ZjIsIDB4MGYsIDB4NWIsIDB4OTAsCi0JMHhjMiwgMHg4OSwgMHgwMywgMHhhZCwgMHgxMywgMHhhMCwgMHg3NSwgMHg0MiwgMHhmYiwgMHg4NiwgMHhmYiwgMHg2MSwKLQkweDQ3LCAweDIyLCAweGM3LCAweDAyLCAweDVhLCAweDZmLCAweDg5LCAweDA0LCAweDZiLCAweGIzLCAweDllLCAweGY2LAotCTB4N2EsIDB4ZmIsIDB4ZTcsIDB4ZTMsIDB4YzAsIDB4YmIsIDB4N2EsIDB4ZDUsIDB4OWUsIDB4MmMsIDB4MTAsIDB4M2IsCi0JMHg0ZSwgMHg5YywgMHgwZSwgMHhmNiwgMHhhMywgMHhmOCwgMHg3YiwgMHhhOSwgMHgzNSwgMHhjMCwgMHgwMSwgMHg5YywKLQkweDBmLCAweDcxLCAweDA4LCAweDc1LCAweDRmLCAweDMwLCAweDg3LCAweDE2LCAweGU5LCAweDVhLCAweGUwLCAweDFjLAotCTB4NTYsIDB4ZTksIDB4OGYsIDB4MzMsIDB4Y2EsIDB4NzIsIDB4MDAsIDB4ZmEsIDB4M2IsIDB4YWYsIDB4NjgsIDB4ZGQsCi0JMHgyZCwgMHg5MywgMHhhNSwgMHhmNywgMHg2OSwgMHhmYSwgMHg1YiwgMHg0MCwgMHhmZiwgMHgxOCwgMHg2NCwgMHg3YiwKLQkweDRkLCAweDc3LCAweGU1LCAweGFiLCAweGUzLCAweGM4LCAweGZiLCAweDk4LCAweDkwLCAweDNjLCAweGNlLCAweDU3LAotCTB4YTksIDB4YzcsIDB4ZjQsIDB4N2MsIDB4OWEsIDB4MzksIDB4OWYsIDB4OGQsIDB4M2EsIDB4NmUsIDB4MzMsIDB4YmUsCi0JMHhiZSwgMHg3NywgMHgwMywgMHg1ZiwgMHg0NSwgMHhmMywgMHgzNSwgMHgyNiwgMHgwZCwgMHgwYiwgMHhjYSwgMHhiZiwKLQkweDQ2LCAweGJmLCAweGU0LCAweDM1LCAweGVkLCAweGU4LCAweGMyLCAweGU4LCAweGY0LCAweGJjLCAweGY0LCAweDMzLAotCTB4MDgsIDB4OTUsIDB4MDcsIDB4ZGYsIDB4NTAsIDB4MzYsIDB4ZDAsIDB4MjAsIDB4ZGQsIDB4ZWUsIDB4MDUsIDB4Y2MsCi0JMHgzYiwgMHg4ZiwgMHhmNSwgMHgzNiwgMHg4ZSwgMHhmOSwgMHhmMiwgMHg0ZCwgMHhmZSwgMHhlNiwgMHhhYiwgMHhjZCwKLQkweGYwLCAweGU5LCAweDM5LCAweDM2LCAweDc5LCAweDQ2LCAweGZhLCAweDRkLCAweDQ1LCAweGNmLCAweDJhLCAweGJmLAotCTB4NDEsIDB4ZGYsIDB4N2QsIDB4ZDUsIDB4OGQsIDB4YmMsIDB4YWQsIDB4ZDcsIDB4MzMsIDB4NDEsIDB4ZWMsIDB4ZTAsCi0JMHgzNSwgMHhkMywgMHhkZiwgMHgxNywgMHg5YiwgMHhjNSwgMHgwZSwgMHg1YSwgMHhhMCwgMHhhMywgMHgyMywgMHg4YywKLQkweDEzLCAweDgwLCAweGY3LCAweDhjLCAweGYzLCAweDVjLCAweDhhLCAweGQwLCAweDE3LCAweDc4LCAweGExLCAweDA0LAotCTB4M2QsIDB4NzMsIDB4OWMsIDB4ZDgsIDB4YTUsIDB4NTUsIDB4ZWYsIDB4OGYsIDB4MWIsIDB4YjQsIDB4MGQsIDB4OGIsCi0JMHgyYSwgMHhkYiwgMHgyMSwgMHg4NiwgMHg0OSwgMHg3YywgMHg4NCwgMHgzMiwgMHhlNCwgMHgxNywgMHg5OSwgMHgwZiwKLQkweGU4LCAweGI4LCAweDdiLCAweDRmLCAweGQ0LCAweDc5LCAweDIxLCAweDEyLCAweGU4LCAweDg0LCAweDM1LCAweGJhLAotCTB4ZWEsIDB4NjMsIDB4MDMsIDB4MWUsIDB4MzAsIDB4ZTUsIDB4ZmIsIDB4MjAsIDB4YjcsIDB4YjcsIDB4YzMsIDB4ZmYsCi0JMHhiNywgMHgyNCwgMHg5ZiwgMHhlMiwgMHgzZSwgMHgxYSwgMHg1NCwgMHgzZSwgMHg5MiwgMHhlMSwgMHhlYywgMHg0NywKLQkweDU5LCAweDEzLCAweGNhLCAweDYwLCAweDRjLCAweDRkLCAweGNjLCAweGRmLCAweGY5LCAweDNkLCAweDk5LCAweDgwLAotCTB4OGMsIDB4ZTcsIDB4NTMsIDB4N2QsIDB4YTAsIDB4ODMsIDB4ZjgsIDB4MGUsIDB4NTgsIDB4Y2IsIDB4NDksIDB4MzEsCi0JMHg3ZSwgMHg4MCwgMHhiZiwgMHg3YiwgMHhhMywgMHhmZSwgMHhiYywgMHhmNiwgMHgyMCwgMHhkZiwgMHg4YywgMHgzYSwKLQkweDVkLCAweGJhLCAweGNlLCAweDE2LCAweDYxLCAweDFjLCAweDJhLCAweDZmLCAweGI2LCAweDIyLCAweGVkLCAweGQ5LAotCTB4NTAsIDB4ZjcsIDB4NDMsIDB4YzgsIDB4ZGYsIDB4YTIsIDB4ZmIsIDB4MmYsIDB4ZTAsIDB4ZmQsIDB4NGQsIDB4ZjgsCi0JMHgwZCwgMHhhMSwgMHhlYywgMHg2NiwgMHg5NCwgMHhiOSwgMHgyOCwgMHhiYiwgMHgxMSwgMHhmOSwgMHgwZiwgMHhlOSwKLQkweGI4LCAweDQ0LCAweGQwLCAweGE2LCAweDE1LCAweGY5LCAweDQ3LCAweGYxLCAweDFlLCAweGJhLCAweGMyLCAweDdjLAotCTB4MDUsIDB4ZWYsIDB4NmYsIDB4YzEsIDB4ZWYsIDB4ZmEsIDB4MGQsIDB4NzUsIDB4ZGEsIDB4MzcsIDB4ZTQsIDB4NGYsCi0JMHhhZSwgMHhmMiwgMHhlMCwgMHg4NSwgMHhkMiwgMHg1NSwgMHhmYSwgMHg5OSwgMHhmMiwgMHhjYywgMHhmYywgMHgyYiwKLQkweDNhLCAweDdmLCAweGZiLCAweDg2LCAweGYyLCAweGZiLCAweDgzLCAweDdjLCAweGRkLCAweDFhLCAweGMyLCAweDBlLAotCTB4OWEsIDB4MDEsIDB4ZDYsIDB4YmQsIDB4ZGEsIDB4ZjQsIDB4ZDcsIDB4ZTAsIDB4M2QsIDB4N2UsIDB4YmMsIDB4YTAsCi0JMHgxNCwgMHhiNCwgMHgyMywgMHhmNiwgMHhiZCwgMHgzZCwgMHhiYywgMHhiZSwgMHhhZiwgMHhmZiwgMHhkNiwgMHhiMCwKLQkweDk2LCAweDZmLCAweDA5LCAweDBkLCAweDlmLCAweDY0LCAweGQ5LCAweDRmLCAweDFiLCAweGQ2LCAweGQ3LCAweDc5LAotCTB4NWYsIDB4ZTMsIDB4NWEsIDB4N2UsIDB4NmIsIDB4NjgsIDB4ZjgsIDB4MzgsIDB4Y2IsIDB4ZWUsIDB4NmIsIDB4NWMsCi0JMHg1ZiwgMHg2NywgMHhiOCwgMHg3MSwgMHg2ZCwgMHgxZSwgMHg2YiwgMHhiYSwgMHgzMCwgMHg5MiwgMHhhZSwgMHg1MCwKLQkweDhlLCAweGIxLCAweDE3LCAweGFhLCAweGEzLCAweGQ5LCAweDE5LCAweGNmLCAweDliLCAweDcyLCAweDU3LCAweDEyLAotCTB4NjEsIDB4YTEsIDB4MGQsIDB4MjIsIDB4NjYsIDB4NjYsIDB4ZjksIDB4NTMsIDB4MjgsIDB4MDcsIDB4YTYsIDB4YWEsCi0JMHg4ZCwgMHgwOSwgMHg3NSwgMHhkMiwgMHhlNiwgMHhkOCwgMHhkOCwgMHhkMiwgMHhkOCwgMHg1OCwgMHg2NSwgMHgyMywKLQkweDU5LCAweDg1LCAweDY1LCAweDlmLCAweDE4LCAweDA1LCAweGY2LCAweGQyLCAweGNmLCAweDRmLCAweGUyLCAweGQ5LAotCTB4YWEsIDB4YzcsIDB4ZGYsIDB4ZTgsIDB4YjcsIDB4M2MsIDB4OWEsIDB4OWQsIDB4YTcsIDB4Y2QsIDB4NWIsIDB4MWEsCi0JMHhkZCwgMHgzNywgMHhjZiwgMHgzZCwgMHg3ZiwgMHgwYSwgMHg3YiwgMHgzZSwgMHgyNCwgMHhkMywgMHhjYSwgMHhmZSwKLQkweDkxLCAweDBlLCAweGI2LCAweDJiLCAweDhmLCAweDc2LCAweDJkLCAweDMxLCAweGFkLCAweDhjLCAweDNhLCAweDRiLAotCTB4NjEsIDB4ZDksIDB4MWYsIDB4ZjcsIDB4ZGIsIDB4MzIsIDB4NmYsIDB4MmQsIDB4MDUsIDB4N2IsIDB4YTAsIDB4NTksCi0JMHhhMiwgMHg2OSwgMHhjYSwgMHhhNCwgMHg5ZCwgMHg4MiwgMHgwZiwgMHg4MCwgMHhmOSwgMHgxYywgMHgxOSwgMHg5ZCwKLQkweDc2LCAweDI4LCAweDlmLCAweDlmLCAweDgyLCAweGRkLCAweDZmLCAweDk2LCAweDA2LCAweGE1LCAweDZmLCAweDFlLAotCTB4ZDcsIDB4NjMsIDB4OWQsIDB4YzIsIDB4NTgsIDB4ZGIsIDB4ZDQsIDB4N2UsIDB4Y2EsIDB4M2EsIDB4OTEsIDB4MDQsCi0JMHhjNiwgMHgzOSwgMHg2NCwgMHgzOCwgMHg3ZCwgMHgxOCwgMHg4ZiwgMHgxZSwgMHg3YiwgMHhhNywgMHg0YywgMHhkNSwKLQkweGI4LCAweDZmLCAweGY2LCAweDQ0LCAweGQ3LCAweGZjLCAweGY0LCAweDM5LCAweGI0LCAweDBiLCAweGZjLCAweDQzLAotCTB4OGUsIDB4NTcsIDB4MDEsIDB4M2UsIDB4ODQsIDB4MmMsIDB4YTcsIDB4NmQsIDB4MzMsIDB4MWIsIDB4ODYsIDB4OWQsCi0JMHg5ZiwgMHgwZiwgMHhlYSwgMHg5MCwgMHhhNiwgMHg2MywgMHhhMywgMHhjOSwgMHhhNSwgMHgyNCwgMHhmYSwgMHhlYSwKLQkweGE0LCAweDBlLCAweDgzLCAweGVlLCAweDBhLCAweGUzLCAweGM3LCAweGJlLCAweGQ5LCAweDBlLCAweGI2LCAweDY4LAotCTB4OTAsIDB4NzYsIDB4NjQsIDB4MGUsIDB4NzYsIDB4YTQsIDB4NTMsIDB4MGUsIDB4OTcsIDB4NTQsIDB4MWYsIDB4MTYsCi0JMHhmYiwgMHgyOCwgMHhlYSwgMHhiNiwgMHg1ZCwgMHg0YiwgMHgwZCwgMHhmMCwgMHhiMSwgMHg5MiwgMHhlNiwgMHg4YiwKLQkweGIyLCAweGQ2LCAweDc2LCAweDU4LCAweGZjLCAweDc2LCAweDdlLCAweGRmLCAweDNmLCAweGYxLCAweDMyLCAweGYxLAotCTB4ZmEsIDB4YmQsIDB4ZGYsIDB4MmMsIDB4NjEsIDB4ZDAsIDB4OTEsIDB4NDMsIDB4MWYsIDB4MWMsIDB4N2YsIDB4YWQsCi0JMHhlZiwgMHhhMCwgMHhiZiwgMHhhNCwgMHg3OSwgMHhmZSwgMHhiMiwgMHhiZSwgMHhiNiwgMHg2OSwgMHhmYywgMHg2NiwKLQkweDViLCAweGI5LCAweDVmLCAweDZiLCAweDZjLCAweGNlLCAweGY3LCAweDA5LCAweGM4LCAweDgzLCAweDQ0LCAweDcyLAotCTB4YmQsIDB4ZDAsIDB4OGIsIDB4YjUsIDB4NDEsIDB4MmQsIDB4MjMsIDB4NGYsIDB4YTIsIDB4YWMsIDB4ZGUsIDB4YzcsCi0JMHhmMiwgMHhlNSwgMHhhYiwgMHgwMCwgMHg2YywgMHg1OSwgMHhjNCwgMHgzZSwgMHgwZiwgMHhhNywgMHgzMywgMHg2ZCwKLQkweDdlLCAweGNjLCAweGViLCAweDRhLCAweDdlLCAweDE1LCAweGU0LCAweDA2LCAweDdkLCAweDE2LCAweDU3LCAweGRiLAotCTB4NzIsIDB4NGUsIDB4NGYsIDB4OGUsIDB4YmUsIDB4MzQsIDB4OTMsIDB4YzAsIDB4OWMsIDB4N2MsIDB4YmIsIDB4ZTAsCi0JMHhmMywgMHg5YSwgMHgzNiwgMHgyNywgMHgyNCwgMHhjYiwgMHg4ZSwgMHgwNSwgMHhmZiwgMHg5ZCwgMHgzNiwgMHhkZSwKLQkweDkyLCAweDk3LCAweDlkLCAweGMwLCAweGZlLCAweGQwLCAweDE2LCAweGExLCAweDdlLCAweDhkLCAweGI0LCAweDkxLAotCTB4ZjYsIDB4MzksIDB4Y2MsIDB4Y2QsIDB4OTMsIDB4NTksIDB4ZDcsIDB4OTcsIDB4YzEsIDB4NWUsIDB4ZDgsIDB4OTEsCi0JMHhmZiwgMHgxOCwgMHhiMSwgMHg4ZiwgMHhkMCwgMHhjZiwgMHhiYiwgMHgxOCwgMHhhOSwgMHg5ZiwgMHg0ZiwgMHg4MCwKLQkweDE1LCAweDllLCAweGQwLCAweDMxLCAweGU4LCAweDM5LCAweDJkLCAweDJmLCAweDY1LCAweGM4LCAweDRiLCAweDlmLAotCTB4NjUsIDB4NGEsIDB4MGYsIDB4NjgsIDB4NDcsIDB4OWQsIDB4ZmUsIDB4NmUsIDB4ZjgsIDB4NWIsIDB4ZjQsIDB4ZTUsCi0JMHgxMywgMHhhMCwgMHhjNywgMHg4NCwgMHhlZSwgMHhkOCwgMHhhNiwgMHg3ZCwgMHg4NywgMHhiNywgMHhhMiwgMHhiNCwKLQkweDZkLCAweDZkLCAweDJhLCAweGJlLCAweDNkLCAweGE3LCAweGU0LCAweGQ5LCAweDk3LCAweGVmLCAweGIwLCAweDdlLAotCTB4MWYsIDB4YzgsIDB4NTQsIDB4OTgsIDB4OTAsIDB4NDYsIDB4ZDYsIDB4ZTIsIDB4YjgsIDB4YWMsIDB4YmYsIDB4YTAsCi0JMHhlYiwgMHhjZiwgMHhhMywgMHg3ZSwgMHgwOCwgMHg3MywgMHhmMiwgMHhiYywgMHg0OSwgMHg0NSwgMHhlZiwgMHgwMiwKLQkweGY4LCAweDFlLCAweDk2LCAweGUyLCAweGFhLCAweGNjLCAweDJmLCAweDQwLCAweGU2LCAweDI5LCAweGRmLCAweDczLAotCTB4ZDgsIDB4YWYsIDB4MjAsIDB4ZmUsIDB4NmUsIDB4Y2EsIDB4N2QsIDB4NDUsIDB4ODYsIDB4NGUsIDB4ZWYsIDB4NmYsCi0JMHg2MCwgMHhjYywgMHhkNSwgMHgzMiwgMHhlOCwgMHgwMywgMHg1MywgMHgyNiwgMHgzYiwgMHhlNSwgMHhiMSwgMHg1MiwKLQkweGQyLCAweDljLCAweGFhLCAweDViLCAweGNiLCAweDVkLCAweGViLCAweGQ2LCAweDkyLCAweDMyLCAweGEwLCAweGVhLAotCTB4YTcsIDB4NTgsIDB4YmYsIDB4NTIsIDB4MjcsIDB4MDMsIDB4OGIsIDB4ZjMsIDB4NTcsIDB4NmEsIDB4NDcsIDB4MTksCi0JMHg2MCwgMHhiYiwgMHhjZCwgMHhmYywgMHgwNSwgMHhjNiwgMHgyOCwgMHgzZCwgMHg2ZiwgMHhkOSwgMHgyNSwgMHhmZSwKLQkweDZmLCAweDk0LCAweDgyLCAweDkyLCAweGIxLCAweDkwLCAweDE0LCAweDVkLCAweGVlLCAweGFiLCAweGFjLCAweDE1LAotCTB4MTEsIDB4MWIsIDB4NTgsIDB4ZTksIDB4ZjcsIDB4NDEsIDB4NjcsIDB4MjYsIDB4MTUsIDB4MTUsIDB4M2YsIDB4YTYsCi0JMHgzMSwgMHg4MSwgMHgzNSwgMHg1OCwgMHgzMSwgMHgzZCwgMHhlZiwgMHgyNSwgMHg0NywgMHhhNCwgMHgwMiwgMHgxZiwKLQkweDc4LCAweDE5LCAweDY5LCAweGIxLCAweDhhLCAweDNkLCAweGRiLCAweDFjLCAweDgxLCAweDBlLCAweDA4LCAweDY0LAotCTB4M2MsIDB4MjYsIDB4NjUsIDB4ZDQsIDB4NTksIDB4YzQsIDB4YmIsIDB4YzcsIDB4YWEsIDB4ODEsIDB4YzQsIDB4NzgsCi0JMHg5ZSwgMHgwMSwgMHgxZSwgMHhlZCwgMHg3MywgMHg3ZSwgMHhlYSwgMHhlNSwgMHhlMywgMHhmNSwgMHg3NSwgMHgwMywKLQkweDRjLCAweDRjLCAweDJjLCAweDRiLCAweDZjLCAweDRhLCAweDRjLCAweGM5LCAweDc3LCAweGM0LCAweDg5LCAweDg3LAotCTB4NDAsIDB4MGIsIDB4ZjcsIDB4NmMsIDB4YWIsIDB4YzQsIDB4ZDIsIDB4NzYsIDB4NjIsIDB4NDQsIDB4MDIsIDB4ZGIsCi0JMHhmZiwgMHgzYSwgMHg2NCwgMHhhOSwgMHhlMCwgMHgzNSwgMHgzYSwgMHg5ZCwgMHhmMiwgMHgxYywgMHhlNCwgMHhlNiwKLQkweGQ5LCAweDU1LCAweDFjLCAweDYzLCAweDQxLCAweDhlLCAweDY4LCAweDQ3LCAweDNkLCAweDM5LCAweGU3LCAweDNhLAotCTB4ZDYsIDB4ZTcsIDB4OTAsIDB4N2UsIDB4YzcsIDB4ZmQsIDB4MDAsIDB4ZjksIDB4ZjYsIDB4ODQsIDB4NDgsIDB4M2YsCi0JMHg3YywgMHgzMiwgMHhlOCwgMHhmNSwgMHhkOSwgMHgwMCwgMHhkYiwgMHhiNywgMHhkMiwgMHgzNywgMHhkNCwgMHhiMiwKLQkweDc0LCAweDExLCAweDdkLCAweGRhLCAweGE2LCAweDAxLCAweDUwLCAweDdiLCAweDA3LCAweGVhLCAweGY5LCAweDdiLAotCTB4MjMsIDB4MjgsIDB4M2IsIDB4ODQsIDB4YmEsIDB4YTQsIDB4ODEsIDB4N2UsIDB4ZmIsIDB4NzcsIDB4YjEsIDB4NjcsCi0JMHgzZCwgMHhlZiwgMHgxZSwgMHhmNywgMHhlNSwgMHgzYSwgMHg1ZCwgMHhiMywgMHg4MCwgMHhmNSwgMHg1NywgMHg3MiwKLQkweDNlLCAweGQwLCAweDI2LCAweDhjLCAweGYzLCAweDRhLCAweDdmLCAweGJiLCAweGYyLCAweDJiLCAweGY5LCAweDBjLAotCTB4NzksIDB4MWYsIDB4MjAsIDB4MTYsIDB4YjIsIDB4MTQsIDB4ZDYsIDB4MjQsIDB4NmUsIDB4NzgsIDB4MTYsIDB4YmMsCi0JMHhmZiwgMHhhNCwgMHhjMiwgMHgzNCwgMHhjNCwgMHg2ZiwgMHhhMCwgMHhiZiwgMHg0NCwgMHg0YywgMHhlMSwgMHg2MywKLQkweDY5LCAweDFmLCAweGQ3LCAweDExLCAweDViLCAweGE0LCAweGI4LCAweDM2LCAweDFhLCAweDVmLCAweGIwLCAweDJkLAotCTB4ZWIsIDB4YjEsIDB4NmQsIDB4ZmQsIDB4ZmEsIDB4YjEsIDB4Y2UsIDB4YjYsIDB4NTAsIDB4ZWUsIDB4MzgsIDB4ZTUsCi0JMHg5OSwgMHhmNiwgMHhiMSwgMHg0ZCwgMHhmNiwgMHhhNywgMHgxYSwgMHhjMSwgMHhmNywgMHg3NiwgMHg2ZCwgMHhjNywKLQkweDNmLCAweDA4LCAweGNjLCAweDA2LCAweGVjLCAweDZkLCAweGQyLCAweDg3LCAweDBhLCAweDc4LCAweDdkLCAweDIzLAotCTB4Y2EsIDB4N2UsIDB4MGUsIDB4ZmUsIDB4YjMsIDB4MGMsIDB4ZmUsIDB4OTUsIDB4YjIsIDB4OTMsIDB4MGYsIDB4NjEsCi0JMHgyZiwgMHg5NywgMHhiNywgMHhmOSwgMHgzMSwgMHgzNCwgMHhhZSwgMHg0MywgMHg4MCwgMHgxMywgMHgwMiwgMHhkYywKLQkweDY3LCAweDZhLCAweGJjLCAweGNmLCAweGI1LCAweGYxLCAweGUzLCAweDZkLCAweDg2LCAweGFhLCAweDRiLCAweDVmLAotCTB4YWIsIDB4ZGUsIDB4YzcsIDB4ZTUsIDB4MWUsIDB4ZjYsIDB4YmMsIDB4NzMsIDB4NmUsIDB4ODAsIDB4MjMsIDB4ZWIsCi0JMHhmZCwgMHhjNCwgMHhjMCwgMHgwNywgMHg4YywgMHg4OSwgMHhkNSwgMHg0ZSwgMHg0YywgMHhmMSwgMHg0NywgMHgwZCwKLQkweDZiLCAweDU4LCAweGU2LCAweDFmLCAweGJjLCAweGIwLCAweDQzLCAweDlmLCAweDkzLCAweDM4LCAweDI2LCAweGYwLAotCTB4MDcsIDB4NTksIDB4OTcsIDB4ZDgsIDB4ZTYsIDB4NTEsIDB4OGMsIDB4MTEsIDB4MTYsIDB4YWIsIDB4ODMsIDB4ZjksCi0JMHgxZiwgMHhlYiwgMHgzNiwgMHg3YywgMHhmNiwgMHhhNCwgMHg2NywgMHg2NywgMHhiZCwgMHgzYywgMHgwZiwgMHhmYSwKLQkweGZlLCAweDYyLCAweDczLCAweDEwLCAweDAzLCAweGVlLCAweDU0LCAweGZhLCAweDY0LCAweDRkLCAweDJlLCAweDAyLAotCTB4OWEsIDB4ODIsIDB4NzEsIDB4N2QsIDB4ZmYsIDB4YjQsIDB4MWQsIDB4YjQsIDB4ZGQsIDB4MDUsIDB4OWIsIDB4YjIsCi0JMHhiMywgMHhkZCwgMHhhZSwgMHhmMywgMHg0NSwgMHhlYiwgMHg2OSwgMHhhYSwgMHhjNywgMHg1NywgMHgxNiwgMHhjNiwKLQkweDY4LCAweDk0LCAweDlkLCAweDFkLCAweGU0LCAweDVkLCAweGE3LCAweGIyLCAweDJkLCAweDZiLCAweGViLCAweDQxLAotCTB4ZGIsIDB4Y2YsIDB4YjEsIDB4MzcsIDB4OTYsIDB4ZGYsIDB4NTIsIDB4NDcsIDB4ZDcsIDB4NDYsIDB4Y2MsIDB4NDcsCi0JMHgxZiwgMHhkNywgMHhjNywgMHg3YywgMHg5OSwgMHhiOCwgMHgyNywgMHhiYiwgMHhkYywgMHgwMCwgMHhkZiwgMHhkNSwKLQkweGQzLCAweDQxLCAweDhjLCAweDQ3LCAweDlhLCAweGEzLCAweDc1LCAweDNlLCAweGYyLCAweGVmLCAweGVhLCAweDMzLAotCTB4YWEsIDB4MzksIDB4M2QsIDB4OTcsIDB4YzAsIDB4OTcsIDB4NGUsIDB4YTIsIDB4ZmUsIDB4N2YsIDB4MDAsIDB4ZGQsCi0JMHg3YywgMHgyNiwgMHhlZCwgMHgwMSwgMHgxZSwgMHg0YywgMHhmYSwgMHg2ZCwgMHg5YiwgMHgzNywgMHhjMywgMHhmZCwKLQkweGRjLCAweDI3LCAweDAxLCAweDZmLCAweGRhLCAweGY1LCAweGJhLCAweGQ0LCAweGZiLCAweGUzLCAweGVhLCAweGU3LAotCTB4YWUsIDB4ZDcsIDB4MWQsIDB4MzcsIDB4ZDYsIDB4Y2QsIDB4YTksIDB4NWYsIDB4MGEsIDB4OGIsIDB4OTQsIDB4ODUsCi0JMHhmNywgMHgyMywgMHgwZCwgMHhmYywgMHhhMSwgMHgwMSwgMHhkOCwgMHg4ZSwgMHgwYywgMHhmYywgMHgxZiwgMHhmYSwKLQkweDQ1LCAweDk3LCAweGY5LCAweDQ0LCAweDNjLCAweGMzLCAweDFjLCAweGNmLCAweGMzLCAweDQ3LCAweDU2LCAweGI2LAotCTB4YzMsIDB4YjcsIDB4OGIsIDB4YzgsIDB4NDMsIDB4ODcsIDB4ZDQsIDB4ZWUsIDB4YTYsIDB4NWMsIDB4OGQsIDB4NGYsCi0JMHg1NCwgMHhkZCwgMHhmMSwgMHhjOSwgMHhlYSwgMHhjMCwgMHgzOCwgMHg3ZCwgMHgwNywgMHg1ZiwgMHhjZSwgMHg1MCwKLQkweGJmLCAweDJhLCAweDEzLCAweDA2LCAweGRhLCAweDY1LCAweDU1LCAweDNiLCAweDE1LCAweGNiLCAweGQ4LCAweGE0LAotCTB4MWYsIDB4ZTEsIDB4MWUsIDB4OWMsIDB4ZjAsIDB4YzcsIDB4OGEsIDB4OGQsIDB4ZTcsIDB4YTAsIDB4NzcsIDB4MTYsCi0JMHg2NywgMHg2MSwgMHhkNywgMHgxYywgMHgzYiwgMHg0MywgMHg1OSwgMHhkYywgMHhlNywgMHhkYSwgMHgyMywgMHg0YSwKLQkweGRlLCAweGUyLCAweGY2LCAweDE4LCAweGQ3LCAweGFmLCAweDMyLCAweGZiLCAweDVlLCAweGU4LCAweDRkLCAweDRmLAotCTB4ZWUsIDB4ODQsIDB4ZmUsIDB4N2IsIDB4MDAsIDB4ZjIsIDB4MjksIDB4NjcsIDB4YTAsIDB4ZmMsIDB4Y2UsIDB4NDAsCi0JMHg2MSwgMHg5ZCwgMHg4OSwgMHg4YiwgMHg3MSwgMHhhMiwgMHg1MywgMHhhMiwgMHg0NywgMHgxMywgMHgxMiwgMHgzOSwKLQkweDRhLCAweGZmLCAweDJiLCAweDY5LCAweGRlLCAweDI5LCAweDAyLCAweDNiLCAweGY4LCAweGUyLCAweGNkLCAweDg2LAotCTB4ZDgsIDB4ODMsIDB4MTksIDB4NDksIDB4YzIsIDB4ODcsIDB4ZWMsIDB4MzMsIDB4MmIsIDB4NDgsIDB4OGIsIDB4OTIsCi0JMHg0YywgMHg5ZCwgMHg0NiwgMHg1ZiwgMHhkMSwgMHgzMywgMHhhOCwgMHg4YiwgMHg3NiwgMHg0ZCwgMHhjYiwgMHgxNiwKLQkweDdlLCAweDFkLCAweGQyLCAweGJjLCAweGVjLCAweGVmLCAweDhmLCAweGU2LCAweGU1LCAweGY1LCAweGYxLCAweDliLAotCTB4YTEsIDB4ZDUsIDB4ZjgsIDB4MGQsIDB4ZGYsIDB4YmYsIDB4YWQsIDB4ZTMsIDB4NGUsIDB4NWYsIDB4ZDIsIDB4YmUsCi0JMHgwYywgMHhlNSwgMHg4MiwgMHhmNiwgMHg0YywgMHhmOSwgMHg2MywgMHhkMCwgMHhkZCwgMHg1ZiwgMHg4MiwgMHhmZiwKLQkweGViLCAweDQ4LCAweGFlLCAweDA0LCAweDljLCAweDllLCAweGY2LCAweGU0LCAweDY5LCAweGI3LCAweGUwLCAweDY1LAotCTB4MDcsIDB4M2MsIDB4NzksIDB4ZGQsIDB4NzUsIDB4MGEsIDB4NzksIDB4YjEsIDB4ZGYsIDB4YTYsIDB4OGUsIDB4ZmIsCi0JMHhiMSwgMHhmYiwgMHgyMSwgMHhkOSwgMHhkMywgMHg2NiwgMHhlZiwgMHhjOSwgMHg4NCwgMHgwYSwgMHg1ZSwgMHg4YiwKLQkweGQzLCAweDJjLCAweDU3LCAweGE3LCAweDBmLCAweGM5LCAweGJlLCAweDFkLCAweDJiLCAweDY2LCAweDU4LCAweDMyLAotCTB4NTcsIDB4MDMsIDB4MGIsIDB4MjYsIDB4ZjIsIDB4NGEsIDB4M2YsIDB4YmQsIDB4YTEsIDB4N2MsIDB4ZWEsIDB4ZmIsCi0JMHhiYiwgMHgwZiwgMHhjOSwgMHhkNiwgMHgxZCwgMHhiNiwgMHg3OSwgMHgyOSwgMHg0YywgMHg5YywgMHg3NiwgMHgwOCwKLQkweGY4LCAweGRmLCAweDRlLCAweGU0LCAweGMyLCAweDhlLCAweGI5LCAweDViLCAweGVjLCAweDkxLCAweDRmLCAweDBiLAotCTB4Y2YsIDB4OGMsIDB4MWQsIDB4ZTksIDB4M2EsIDB4ZWEsIDB4MjQsIDB4MWUsIDB4MGMsIDB4ZjUsIDB4MWMsIDB4NzgsCi0JMHg5MCwgMHgzZSwgMHhkZCwgMHgxOSwgMHhlNiwgMHgzZCwgMHg4OSwgMHhlZCwgMHgzMCwgMHhmMSwgMHgxYywgMHg5NywKLQkweGFlLCAweDEzLCAweDk2LCAweDI0LCAweGMxLCAweDk3LCAweDVlLCAweGM1LCAweDEzLCAweDllLCAweDVkLCAweDI1LAotCTB4YTQsIDB4ZTcsIDB4MjgsIDB4NzEsIDB4OTMsIDB4ZTIsIDB4NGQsIDB4MmYsIDB4NzgsIDB4OTMsIDB4MDIsIDB4NmYsCi0JMHhlMCwgMHg0NywgMHhmNSwgMHg5OSwgMHg5NywgMHg5MCwgMHg5ZSwgMHg5NywgMHhlNCwgMHhlMCwgMHg5YiwgMHhlMCwKLQkweDRkLCAweDJmLCAweDc4LCAweGQzLCAweDczLCAweGM2LCAweDQyLCAweDdiLCAweGY0LCAweGIxLCAweGRjLCAweDg1LAotCTB4YjQsIDB4NTksIDB4M2UsIDB4NzIsIDB4NTUsIDB4MDcsIDB4OWUsIDB4MWQsIDB4NDksIDB4MWUsIDB4OGQsIDB4NjEsCi0JMHg4YywgMHg5MCwgMHhlYywgMHhlYSwgMHgyZSwgMHhjOCwgMHhmMCwgMHgwZSwgMHhmOCwgMHg2MywgMHhmMSwgMHg0MywKLQkweDcyLCAweDAxLCAweGI2LCAweGE3LCAweDA0LCAweGJmLCAweGUwLCAweGU5LCAweDQxLCAweDdiLCAweDZjLCAweDA1LAotCTB4ZmEsIDB4YjMsIDB4NzYsIDB4OTcsIDB4MjcsIDB4YWYsIDB4ZWMsIDB4ZjgsIDB4MmIsIDB4MmYsIDB4NzEsIDB4OTUsCi0JMHhiZCwgMHg0NywgMHg0MiwgMHgwMywgMHgzMiwgMHg1ZCwgMHg1MiwgMHgzNiwgMHgyMSwgMHg5MSwgMHgwZCwgMHgyYiwKLQkweDJjLCAweDg2LCAweDM5LCAweDE2LCAweDYwLCAweDU3LCAweDc4LCAweDE2LCAweGVlLCAweDQwLCAweGJmLCAweDdmLAotCTB4NWEsIDB4MWUsIDB4MjgsIDB4NGYsIDB4ZTEsIDB4MDcsIDB4MWYsIDB4NzMsIDB4ODYsIDB4NzUsIDB4MGYsIDB4YzAsCi0JMHg4NywgMHg3YiwgMHg0OCwgMHhmNiwgMHhjZiwgMHgwMCwgMHgyZiwgMHhhNiwgMHg0MSwgMHhmNywgMHg4MCwgMHgwMywKLQkweDFmLCAweGVlLCAweDdjLCAweGEzLCAweGI0LCAweGEyLCAweDBjLCAweGJjLCAweDFkLCAweGFiLCAweDZkLCAweGY0LAotCTB4ZGQsIDB4NTYsIDB4YjAsIDB4MGUsIDB4ODMsIDB4ZjIsIDB4OTcsIDB4YjUsIDB4MDEsIDB4ZjksIDB4NmEsIDB4YWQsCi0JMHg1ZiwgMHhiZSwgMHgwYywgMHg3YiwgMHhmMiwgMHg2YywgMHhhZCwgMHgxMywgMHg3YiwgMHgyNSwgMHg4MSwgMHgzNSwKLQkweDQ5LCAweDYzLCAweDdkLCAweDVjLCAweGY5LCAweDRhLCAweDJkLCAweDI1LCAweDVmLCAweDAyLCAweGFmLCAweDllLAotCTB4YzMsIDB4NmYsIDB4YjgsIDB4OTQsIDB4OTIsIDB4NWQsIDB4YTUsIDB4N2UsIDB4YmQsIDB4NDYsIDB4NWMsIDB4MWYsCi0JMHgwNywgMHhmNCwgMHgzOCwgMHg5OCwgMHhiYiwgMHhmZCwgMHg1NCwgMHgwMSwgMHhmYiwgMHg2ZiwgMHhiMSwgMHhlNiwKLQkweGJjLCAweDU1LCAweDkxLCAweGM3LCAweDFhLCAweDE5LCAweDVmLCAweDNlLCAweGI1LCAweDZhLCAweDUzLCAweDBhLAotCTB4OWUsIDB4ZTksIDB4ZDgsIDB4NDcsIDB4MjYsIDB4YjAsIDB4MGUsIDB4MTUsIDB4ZWMsIDB4ZDMsIDB4MzEsIDB4YzUsCi0JMHhmYiwgMHgzNSwgMHg3YiwgMHg1MywgMHhmMSwgMHhlZCwgMHg0ZCwgMHgzMCwgMHhiZiwgMHhkOSwgMHhiYywgMHg3YywKLQkweDQ3LCAweGIyLCAweDczLCAweGQzLCAweGIyLCAweGVmLCAweGI4LCAweDI3LCAweGJmLCAweGUzLCAweDdhLCAweDkwLAotCTB4NjMsIDB4ZWEsIDB4ZGYsIDB4MDEsIDB4ZWEsIDB4NzUsIDB4NmIsIDB4MjIsIDB4NmMsIDB4MjgsIDB4ZmYsIDB4YzksCi0JMHhjNywgMHgyYSwgMHhiZCwgMHhkYiwgMHhiMSwgMHg2NywgMHg1MywgMHgxOSwgMHg2MywgMHg0YSwgMHg5MiwgMHg3MywKLQkweDUzLCAweGQyLCAweDM1LCAweDA3LCAweDU5LCAweDcwLCAweGQ5LCAweGQ3LCAweDhhLCAweDY5LCAweDVjLCAweDI2LAotCTB4MGYsIDB4MWMsIDB4YzcsIDB4MWUsIDB4Y2MsIDB4ODksIDB4NjMsIDB4YmUsIDB4MjUsIDB4MjksIDB4OGMsIDB4N2YsCi0JMHg1MCwgMHhiYSwgMHhkMSwgMHhjNiwgMHg0MSwgMHg5YiwgMHg0YiwgMHg2YSwgMHhlYywgMHgxNiwgMHg4YywgMHhkZCwKLQkweDI4LCAweDg3LCAweGUzLCAweDM2LCAweDY0LCAweDhkLCAweDc2LCAweGZiLCAweGZmLCAweDQ4LCAweGI2LCAweGMyLAotCTB4ZjQsIDB4NmYsIDB4MjUsIDB4N2IsIDB4ZWEsIDB4OTEsIDB4OTgsIDB4MzQsIDB4ZjMsIDB4MTksIDB4YWEsIDB4NjEsCi0JMHg4MSwgMHhlNSwgMHg1ZCwgMHg0OCwgMHg1OSwgMHhlZSwgMHhjMCwgMHg3NywgMHhmZSwgMHg4OSwgMHg2NCwgMHhjZiwKLQkweDcyLCAweGVjLCAweGI3LCAweDUwLCAweGZlLCAweDhhLCAweDY0LCAweDhmLCAweGZkLCAweDFjLCAweGY5LCAweDBiLAotCTB4NDgsIDB4ZGYsIDB4NDYsIDB4M2EsIDB4MjYsIDB4NWQsIDB4YzcsIDB4MjQsIDB4OTQsIDB4M2QsIDB4ZmIsIDB4NmQsCi0JMHhlNCwgMHgyMywgMHg0OCwgMHgwZiwgMHhhMywgMHhkZSwgMHg2ZCwgMHhhMCwgMHhlZiwgMHhhZiwgMHhkMSwgMHg1ZiwKLQkweDA2LCAweDdhLCAweGVlLCAweGMzLCAweDlhLCAweDdlLCAweDk2LCAweGIzLCAweDhjLCAweGVmLCAweDBlLCAweDQzLAotCTB4YTcsIDB4ZmQsIDB4MGYsIDB4OGYsIDB4ZjEsIDB4NDQsIDB4ZjUsIDB4YmMsIDB4YzgsIDB4M2MsIDB4NzUsIDB4MWIsCi0JMHg5ZiwgMHhhNywgMHhjMCwgMHg5MywgMHg4MywgMHhjOCwgMHg3YiwgMHhmMiwgMHg5MCwgMHg0YiwgMHgxYiwgMHg3MywKLQkweDkzLCAweDhjLCAweDliLCAweDA1LCAweGFmLCAweDE5LCAweDU4LCAweGEyLCAweDA1LCAweGZiLCAweDYwLCAweDZhLAotCTB4ZTcsIDB4ZTYsIDB4ZmIsIDB4ZTAsIDB4NDgsIDB4Y2YsIDB4MjEsIDB4NjksIDB4ZGEsIDB4MTEsIDB4Y2MsIDB4M2YsCi0JMHg5OCwgMHhhZiwgMHg2MywgMHhmZSwgMHg0OCwgMHhmMSwgMHhjMSwgMHgyZSwgMHgzYywgMHgyOCwgMHg5YywgMHg4NywKLQkweDkzLCAweDc4LCAweGRjLCAweGU4LCAweGQ5LCAweGYzLCAweDAwLCAweGY2LCAweDgxLCAweDcxLCAweDk2LCAweDc5LAotCTB4N2YsIDB4MWYsIDB4MTgsIDB4NjcsIDB4YTEsIDB4MWIsIDB4MTYsIDB4ZTAsIDB4MTcsIDB4MmUsIDB4NzQsIDB4NGEsCi0JMHhlMywgMHhiMSwgMHhiNSwgMHg3ZCwgMHhkMCwgMHg3MCwgMHhlYywgMHg1NywgMHhlZiwgMHg4MywgMHhjNiwgMHhiMywKLQkweGE4LCAweDc3LCAweDk2LCAweDNjLCAweDQzLCAweDFmLCAweGE3LCAweGM4LCAweGIzLCAweDBlLCAweGE0LCAweDlmLAotCTB4YzYsIDB4NWMsIDB4NDksIDB4N2IsIDB4MjMsIDB4NjgsIDB4ZjcsIDB4YjEsIDB4ZDAsIDB4Y2QsIDB4OTAsIDB4ZjcsCi0JMHhmYiwgMHg3NywgMHgxYywgMHhkNCwgMHhlNSwgMHhmZiwgMHhkOSwgMHgxYiwgMHg4OSwgMHhkYiwgMHg2NSwgMHgwOSwKLQkweDkxLCAweGE3LCAweGE4LCAweDViLCAweDIxLCAweDBmLCAweDZmLCAweDY5LCAweDkyLCAweGU2LCAweDAzLCAweGQyLAotCTB4NDUsIDB4ZmUsIDB4NTUsIDB4NzYsIDB4MjMsIDB4NWYsIDB4ZjAsIDB4YTIsIDB4NGUsIDB4OGIsIDB4ZTYsIDB4MjcsCi0JMHhiMCwgMHhkMSwgMHgwMCwgMHhjYiwgMHg1ZiwgMHg4MywgMHhjYywgMHgxMCwgMHhhMywgMHhiZSwgMHgyMSwgMHhmYiwKLQkweDY2LCAweDNjLCAweDE5LCAweDc3LCAweDM5LCAweGZmLCAweGVmLCAweDYzLCAweGZlLCAweDk5LCAweDFkLCAweDcxLAotCTB4NTksIDB4YjEsIDB4ZTIsIDB4ZTAsIDB4YzksIDB4MjIsIDB4NzQsIDB4ZmIsIDB4MDUsIDB4ZjEsIDB4ZjksIDB4YzAsCi0JMHgzMywgMHg4OSwgMHg1ZCwgMHhlMiwgMHgyNCwgMHg4NiwgMHhjNSwgMHg0OSwgMHhiZCwgMHgwOSwgMHgzZSwgMHgwYywKLQkweDQzLCAweGY2LCAweDczLCAweDM1LCAweGNhLCAweGNlLCAweGFiLCAweDMyLCAweDA0LCAweDk5LCAweGY4LCAweDllLAotCTB4NmIsIDB4YTcsIDB4ODAsIDB4N2YsIDB4YTAsIDB4MmYsIDB4MjgsIDB4MTcsIDB4OTQsIDB4ODksIDB4NTYsIDB4YTUsCi0JMHg5MywgMHgxNiwgMHg1YywgMHhmYiwgMHg4OSwgMHg4YSwgMHg1YywgMHgyNywgMHgwYiwgMHhlZCwgMHhhNCwgMHgxZCwKLQkweGVmLCAweDhlLCAweDI5LCAweDdiLCAweDkxLCAweDlhLCAweDMwLCAweGJhLCAweGExLCAweGEzLCAweDUzLCAweDYyLAotCTB4ZjYsIDB4N2MsIDB4YjEsIDB4MzEsIDB4YjgsIDB4YmYsIDB4OTIsIDB4OWYsIDB4MGIsIDB4YzksIDB4NTQsIDB4MGYsCi0JMHhkNywgMHg4YSwgMHhmZCwgMHgyMiwgMHg1ZiwgMHgyOSwgMHg3OCwgMHgxMSwgMHhlNywgMHgyZCwgMHhlZiwgMHg2NCwKLQkweDg3LCAweDI1LCAweDlmLCAweGVjLCAweDU5LCAweDk1LCAweGNiLCAweGIyLCAweDg4LCAweGJmLCAweDJmLCAweDg2LAotCTB4ZDQsIDB4N2EsIDB4MDQsIDB4NzQsIDB4MDcsIDB4NzMsIDB4MDksIDB4ZGUsIDB4ZjUsIDB4ZDcsIDB4YmQsIDB4ZTMsCi0JMHg1YywgMHgyOCwgMHhlYiwgMHhhYiwgMHg3YiwgMHhjNywgMHhiYSwgMHg5YywgMHhkNiwgMHg5ZiwgMHg0MSwgMHg5ZSwKLQkweGVjLCAweDI3LCAweDhhLCAweGYyLCAweDNhLCAweDY0LCAweDBmLCAweDNjLCAweDNjLCAweGNiLCAweDk0LCAweDNjLAotCTB4OWMsIDB4ODIsIDB4ZGMsIDB4YmYsIDB4MjYsIDB4YmIsIDB4ZTYsIDB4YjgsIDB4NjcsIDB4NWUsIDB4YzMsIDB4NWMsCi0JMHg5NSwgMHgyZSwgMHg4MSwgMHg4ZSwgMHg2MCwgMHg3ZiwgMHg5ZSwgMHg0YywgMHhiYiwgMHhkZCwgMHhhOSwgMHg1MywKLQkweDcyLCAweDVkLCAweDYyLCAweDEyLCAweDdlLCAweGU2LCAweDg0LCAweGU5LCAweGM5LCAweGIyLCAweDViLCAweDkwLAotCTB4ZTUsIDB4NDEsIDB4YjQsIDB4YTksIDB4N2MsIDB4MWEsIDB4YmYsIDB4NzksIDB4M2QsIDB4YjcsIDB4NDcsIDB4YzAsCi0JMHg3NywgMHhkYiwgMHgyYSwgMHgxYiwgMHg5ZiwgMHgwMSwgMHhkZiwgMHgxZiwgMHg5MiwgMHhlNCwgMHhiMSwgMHg1NSwKLQkweDVkLCAweDAzLCAweGI5LCAweGYzLCAweDc1LCAweDRkLCAweGYyLCAweGFjLCAweDI5LCAweDk1LCAweDkyLCAweDIzLAotCTB4MWYsIDB4YTMsIDB4MGUsIDB4MjksIDB4NzEsIDB4NWUsIDB4ZDAsIDB4MzEsIDB4M2MsIDB4ZGYsIDB4MmYsIDB4NDEsCi0JMHhjZiwgMHg5NCwgMHhhMCwgMHg1MywgMHhhMCwgMHg0MywgMHhiZSwgMHg4YywgMHhmMiwgMHgyZiwgMHhhMSwgMHhjZSwKLQkweDczLCAweGYwLCAweDk5LCAweDllLCAweDA1LCAweGRlLCAweDNiLCAweDA3LCAweDFjLCAweGYxLCAweDRjLCAweDI5LAotCTB4YTMsIDB4ZmQsIDB4NTcsIDB4MzUsIDB4NWYsIDB4ZDgsIDB4MmMsIDB4ZTUsIDB4ZWYsIDB4NDgsIDB4YTUsIDB4NGMsCi0JMHg3ZSwgMHhmYywgMHg0NCwgMHhhZCwgMHg2ZCwgMHhkNiwgMHhkZCwgMHg0NiwgMHg2YywgMHgwNSwgMHhjYSwgMHg0NCwKLQkweGNhLCAweGU1LCAweDgwLCAweDI3LCAweGQ0LCAweDdkLCAweDNjLCAweDFiLCAweDBhLCAweDc0LCAweDY1LCAweGNiLAotCTB4MDYsIDB4NWQsIDB4MjksIDB4ZjIsIDB4NjIsIDB4ZDUsIDB4YzcsIDB4OTAsIDB4YzQsIDB4YzQsIDB4YzUsIDB4MTksCi0JMHg2YiwgMHhmNSwgMHgwYywgMHhiNSwgMHgwOCwgMHhiYiwgMHg3OSwgMHgxZSwgMHhiZSwgMHg0NSwgMHgyYywgMHhmZCwKLQkweDJkLCAweDg5LCAweDlkLCAweGYwLCAweGJjLCAweDFmLCAweGMwLCAweDZlLCAweDE2LCAweGIwLCAweDI2LCAweDQ2LAotCTB4MDgsIDB4ZTUsIDB4NGIsIDB4N2MsIDB4NDcsIDB4YjksIDB4YTcsIDB4NmMsIDB4ODcsIDB4NzgsIDB4OTYsIDB4MjIsCi0JMHgyZiwgMHhhMywgMHhhYywgMHhhMiwgMHg3YywgMHhhZSwgMHg2ZiwgMHg4MywgMHgxZSwgMHg0ZCwgMHg5ZiwgMHgyYSwKLQkweDYzLCAweGJkLCAweDQ2LCAweGM5LCAweDhkLCAweGE3LCAweGUwLCAweGQ3LCAweGY0LCAweDk5LCAweDhkLCAweDY4LAotCTB4NWYsIDB4NWUsIDB4NjIsIDB4MWIsIDB4N2IsIDB4OTAsIDB4NTcsIDB4YjksIDB4NWUsIDB4NWUsIDB4NjIsIDB4NzksCi0JMHhhNywgMHg1YywgMHg4MCwgMHhmZiwgMHg0OSwgMHgxYSwgMHgyYSwgMHhmMywgMHg2OSwgMHhmMSwgMHhlMywgMHhjNSwKLQkweGQ0LCAweDU3LCAweGE0LCAweDE1LCAweDc5LCAweGYwLCAweDJiLCAweDViLCAweGEyLCAweDlkLCAweDhkLCAweDQ4LAotCTB4MjEsIDB4NDEsIDB4NWUsIDB4MjcsIDB4ZTQsIDB4ZmMsIDB4Y2MsIDB4MWYsIDB4MzcsIDB4MzEsIDB4MWUsIDB4OWIsCi0JMHg3NSwgMHhmOCwgMHgxYywgMHhjNCwgMHgzNywgMHhjYywgMHg3NywgMHgxMCwgMHhkZiwgMHg2MCwgMHg0YywgMHgyMywKLQkweDAyLCAweDViLCAweGE2LCAweGUyLCAweDFjLCAweDQ4LCAweGFkLCAweDNhLCAweDlmLCAweDk3LCAweGVmLCAweDdkLAotCTB4NmMsIDB4YjQsIDB4ODYsIDB4MTksIDB4ODksIDB4MjEsIDB4MzksIDB4NWYsIDB4YmIsIDB4YjAsIDB4MDIsIDB4ZmQsCi0JMHhkMSwgMHg5ZSwgMHg3ZSwgMHg0OSwgMHhlZSwgMHg1ZSwgMHhmMCwgMHhlNywgMHg2NywgMHg5YywgMHgxMiwgMHhkZSwKLQkweGUzLCAweDkxLCAweDRiLCAweGYzLCAweGI2LCAweDdiLCAweDUxLCAweDc4LCAweDA2LCAweGUyLCAweDYyLCAweGJkLAotCTB4ZmUsIDB4YTAsIDB4MDksIDB4ZmEsIDB4NmIsIDB4MzAsIDB4NjMsIDB4N2MsIDB4YmIsIDB4YzksIDB4YzcsIDB4NjcsCi0JMHgxMSwgMHg5OSwgMHg5YSwgMHhlMSwgMHg5OSwgMHgyYiwgMHg3NCwgMHgxYiwgMHg3MCwgMHhlMywgMHhlZiwgMHg0NSwKLQkweGYwLCAweDVjLCAweDY1LCAweDFlLCAweDdlLCAweGE4LCAweGVmLCAweGMzLCAweGUyLCAweGQ5LCAweGVmLCAweDhmLAotCTB4M2MsIDB4MzcsIDB4MTYsIDB4MzgsIDB4ZjcsIDB4OTAsIDB4ZGMsIDB4MGQsIDB4NzQsIDB4MjIsIDB4ZTgsIDB4YmYsCi0JMHg0YiwgMHg4ZiwgMHhkNSwgMHg3NSwgMHgyYSwgMHhjNSwgMHhmOCwgMHhiNSwgMHgyNCwgMHhhMSwgMHgyZiwgMHhiMiwKLQkweGYwLCAweDFmLCAweDczLCAweGYxLCAweDRlLCAweDhkLCAweGM3LCAweGY5LCAweDZlLCAweDIzLCAweGRlLCAweDBjLAotCTB4ZmMsIDB4YmEsIDB4OTQsIDB4N2MsIDB4YmUsIDB4MTQsIDB4NjAsIDB4YmQsIDB4MTQsIDB4NmMsIDB4YWMsIDB4NDQsCi0JMHg0NiwgMHg3YSwgMHgzZCwgMHhmOSwgMHg4MSwgMHg0YiwgMHg3ZSwgMHhmNSwgMHgyMywgMHhlZiwgMHhjYSwgMHg5MSwKLQkweGRhLCAweDJmLCAweDNiLCAweDViLCAweGFkLCAweGZmLCAweDZiLCAweDAxLCAweDhkLCAweGZjLCAweDgxLCAweDNlLAotCTB4ZTAsIDB4MjMsIDB4ZDIsIDB4NmUsIDB4YzAsIDB4OWUsIDB4MTcsIDB4ODEsIDB4YmIsIDB4OGMsIDB4MzMsIDB4OWQsCi0JMHhlYSwgMHg5ZCwgMHgwMSwgMHg2YywgMHg1MCwgMHg5OSwgMHg4MSwgMHg2ZSwgMHgzYywgMHhjMywgMHhmMywgMHg2NiwKLQkweGU4LCAweGI2LCAweDMzLCAweDUxLCAweDI5LCAweGNlLCAweDUyLCAweDJlLCAweGE1LCAweGRkLCAweGMwLCAweDdhLAotCTB4YjEsIDB4N2UsIDB4NjUsIDB4YTYsIDB4MTMsIDB4NjksIDB4MGIsIDB4NTIsIDB4NGIsIDB4ZjUsIDB4NTMsIDB4OTksCi0JMHg3MSwgMHg1NCwgMHhmYiwgMHhjYSwgMHg0YywgMHg0YSwgMHhiNSwgMHhhYiwgMHhjYywgMHhmNCwgMHgyMywgMHg3NSwKLQkweGE1LCAweGUxLCAweDBjLCAweDljLCAweGE1LCAweDMzLCAweDNkLCAweDMyLCAweDc1LCAweDEyLCAweGY2LCAweDY1LAotCTB4YzAsIDB4NTAsIDB4NzcsIDB4MzUsIDB4MjYsIDB4NjAsIDB4N2YsIDB4MjIsIDB4ZjAsIDB4YWMsIDB4MmUsIDB4OWEsCi0JMHg4MywgMHhjMCwgMHg1OCwgMHgzNywgMHgwMSwgMHg4MywgMHhkYywgMHgyNCwgMHhjZSwgMHgwOSwgMHhjZSwgMHg5ZiwKLQkweGJhLCAweGY3LCAweDNjLCAweDYzLCAweDVlLCAweDg5LCAweDRmLCAweDQ4LCAweDQ2LCAweGY2LCAweGNmLCAweDM2LAotCTB4NjIsIDB4YmYsIDB4NDYsIDB4Y2MsIDB4YTIsIDB4NzQsIDB4OWIsIDB4YzMsIDB4YzgsIDB4ZTcsIDB4Y2IsIDB4ZTQsCi0JMHhkYiwgMHhiZCwgMHhjYSwgMHg1ZiwgMHhjYiwgMHhiYSwgMHgzNywgMHgzNCwgMHg0YiwgMHg3MywgMHgxYSwgMHg2MywKLQkweGJjLCAweDkzLCAweGY2LCAweGJkLCAweDkwLCAweDNmLCAweDQ3LCAweGY3LCAweDkxLCAweDA2LCAweDNkLCAweGY1LAotCTB4ZmMsIDB4ZTAsIDB4MzksIDB4NzMsIDB4ZTYsIDB4NTcsIDB4OWMsIDB4MzMsIDB4NTMsIDB4YWUsIDB4YzksIDB4ZGYsCi0JMHg3YiwgMHhlNSwgMHhiYywgMHg5MywgMHg5NiwgMHg5NywgMHg5ZCwgMHg5NCwgMHg1YywgMHg3MCwgMHg3NiwgMHhjYSwKLQkweDM3LCAweDYxLCAweGE3LCAweDVmLCAweDcyLCAweGNlLCAweDM0LCAweDExLCAweDBiLCAweDU0LCAweGQ0LCAweGQ5LAotCTB4NWQsIDB4YjAsIDB4NTYsIDB4OGUsIDB4OGUsIDB4OWQsIDB4ZmYsIDB4NTAsIDB4OTYsIDB4NjcsIDB4ODgsIDB4OWQsCi0JMHhiZCwgMHhkYiwgMHhmNiwgMHhiOSwgMHgwNSwgMHhkYSwgMHgyZCwgMHhkMCwgMHg0MCwgMHhhYywgMHg1NiwgMHg4MCwKLQkweGZkLCAweDNiLCAweDI0LCAweGMzLCAweDJlLCAweGVkLCAweDllLCAweGIyLCAweDUxLCAweDg5LCAweDYxLCAweDdmLAotCTB4M2YsIDB4YmIsIDB4NzksIDB4ZTgsIDB4ZDUsIDB4ZjMsIDB4YjMsIDB4ZDgsIDB4NGYsIDB4NDIsIDB4ZjksIDB4YzcsCi0JMHg3MywgMHg5OSwgMHhlYiwgMHhlZSwgMHhjOCwgMHhlMywgMHgyNSwgMHhjZSwgMHhiMywgMHhiOCwgMHhiZCwgMHg1OSwKLQkweGMyLCAweDMyLCAweGEyLCAweGYwLCAweDQyLCAweGFiLCAweGJjLCAweGI4LCAweGI0LCAweDQ1LCAweDBjLCAweDU4LAotCTB4MjgsIDB4ZTMsIDB4ZGEsIDB4YTgsIDB4YmEsIDB4ZTUsIDB4NDIsIDB4OWYsIDB4NWIsIDB4ZGEsIDB4NzgsIDB4YjYsCi0JMHhmNiwgMHg4NywgMHhlMCwgMHgwZCwgMHhmZCwgMHg3ZiwgMHhjYywgMHhhZCwgMHg4ZCwgMHgzMywgMHgwOSwgMHhmMiwKLQkweGZkLCAweGQ4LCAweDVmLCAweDdjLCAweDBlLCAweDQ5LCAweGNlLCAweDg5LCAweGUzLCAweDk5LCAweDI5LCAweGY3LAotCTB4MWMsIDB4NjMsIDB4NjMsIDB4NjEsIDB4ZjEsIDB4MzEsIDB4ZjcsIDB4MjEsIDB4ZjUsIDB4YmUsIDB4ZDEsIDB4YjksCi0JMHgxNSwgMHhiOCwgMHg4ZSwgMHhmMiwgMHg4YSwgMHg3NCwgMHhkOSwgMHgxZiwgMHgzNywgMHgwNywgMHgxYywgMHg5NywKLQkweGVmLCAweGU3LCAweDFkLCAweDFiLCAweDNiLCAweDU1LCAweGMwLCAweDVlLCAweDk4LCAweDUwLCAweGY1LCAweDA3LAotCTB4ZTQsIDB4YTUsIDB4OTksIDB4NTIsIDB4YjMsIDB4YmYsIDB4M2YsIDB4MDYsIDB4ZjUsIDB4MzMsIDB4ZGYsIDB4ZDMsCi0JMHhhNywgMHg2MiwgMHg4YywgMHhlNCwgMHg5OSwgMHhkMSwgMHg2OSwgMHhlNywgMHhhMiwgMHhkZSwgMHgzZiwgMHgxMiwKLQkweGJhLCAweGIzLCAweDE3LCAweDM4LCAweGY0LCAweDY4LCAweDAzLCAweGU2LCAweDYyLCAweDViLCAweDU2LCAweGM4LAotCTB4ZTgsIDB4MzAsIDB4ODAsIDB4ZTMsIDB4ODcsIDB4OTUsIDB4Y2QsIDB4ZWQsIDB4NTUsIDB4MzEsIDB4ZTgsIDB4NTMsCi0JMHhhOSwgMHg1NiwgMHhhOSwgMHg5OCwgMHg4ZSwgMHhiYSwgMHg5MywgMHhiNywgMHg2MiwgMHhlZSwgMHgyMCwgMHhkNiwKLQkweGM3LCAweGFmLCAweDA5LCAweDY1LCAweGRkLCAweDQ4LCAweDFiLCAweDkxLCAweGJlLCAweDVmLCAweDhhLCAweGM3LAotCTB4Y2YsIDB4ZTgsIDB4ZjEsIDB4YTIsIDB4MWIsIDB4ZjIsIDB4MWYsIDB4ZDEsIDB4ZTksIDB4NjcsIDB4YjUsIDB4M2YsCi0JMHhjNSwgMHg3MSwgMHhhMiwgMHhlMiwgMHg3YywgMHhhMSwgMHg0NSwgMHhiYSwgMHg4ZiwgMHg5YSwgMHhjMCwgMHhiNiwKLQkweDA5LCAweDYwLCAweGRkLCAweDRlLCAweDQ5LCAweDFkLCAweGI1LCAweGU0LCAweGRhLCAweGEzLCAweDQxLCAweDljLAotCTB4ZTksIDB4MmIsIDB4YTMsIDB4NDksIDB4MTUsIDB4ZDcsIDB4ZmMsIDB4ZjIsIDB4YTgsIDB4NTMsIDB4NTYsIDB4ZTcsCi0JMHhlZCwgMHhmYSwgMHhlZSwgMHhlMCwgMHg4YSwgMHhiZSwgMHg1MywgMHhmOCwgMHhjYSwgMHg2OCwgMHhhZiwgMHg0YSwKLQkweGJmLCAweDNkLCAweDlhLCAweDUyLCAweGU5LCAweGFiLCAweGEzLCAweGQ3LCAweDU2LCAweDdkLCAweGZmLCAweGE4LAotCTB4YjgsIDB4OTgsIDB4OTIsIDB4Y2YsIDB4OTUsIDB4ODgsIDB4MmYsIDB4MDcsIDB4ODAsIDB4MWQsIDB4NWQsIDB4ZTgsCi0JMHg5OSwgMHg3ZSwgMHhlOCwgMHg5OSwgMHgxNCwgMHhmNCwgMHhjYywgMHgyMCwgMHhmNSwgMHgwYywgMHhmNCwgMHhmNiwKLQkweGFiLCAweGQwLCAweGRiLCAweGFlLCAweDdjLCAweDBmLCAweGYyLCAweGZhLCAweDhjLCAweGRiLCAweDA4LCAweDVjLAotCTB4ZTgsIDB4NzksIDB4ZmUsIDB4NWMsIDB4ZWQsIDB4MjcsIDB4NTYsIDB4YjAsIDB4YmUsIDB4OTUsIDB4ZDMsIDB4MTIsCi0JMHg2YiwgMHg4MywgMHgwZSwgMHhkYSwgMHhiMSwgMHhkMCwgMHgyMCwgMHg4YiwgMHg3MSwgMHhjZiwgMHg5YiwgMHg3MywKLQkweDFkLCAweGI5LCAweDg0LCAweGZhLCAweDU5LCAweDg3LCAweGZiLCAweGY4LCAweDZmLCAweDlhLCAweGU5LCAweDhmLAotCTB4NWQsIDB4OWEsIDB4ZDksIDB4MDksIDB4OWQsIDB4NDQsIDB4NzksIDB4OGYsIDB4NDksIDB4NjUsIDB4M2MsIDB4MjEsCi0JMHg0YiwgMHhmMCwgMHhjZiwgMHhkNiwgMHhlYSwgMHhhNCwgMHhmMCwgMHhjYywgMHhmZCwgMHhmZiwgMHgxMywgMHhkNCwKLQkweDRkLCAweGMxLCAweDNlLCAweDk4LCAweGIyLCAweGRjLCAweDZiLCAweGM5LCAweGE5LCAweDVlLCAweDdiLCAweGQwLAotCTB4MzIsIDB4YTgsIDB4YmIsIDB4MmMsIDB4MjksIDB4YzMsIDB4YmYsIDB4YWYsIDB4OTQsIDB4NTgsIDB4OWYsIDB4ZjUsCi0JMHhiMCwgMHgzZiwgMHg0YiwgMHg3ZSwgMHhiYiwgMHhlOSwgMHg1MiwgMHhhMCwgMHgyNywgMHgwNiwgMHgxOCwgMHg3YiwKLQkweDhjLCAweGU0LCAweDdhLCAweDdkLCAweDFiLCAweDYwLCAweDE4LCAweDhkLCAweDkwLCAweDAzLCAweDE3LCAweGZjLAotCTB4MWYsIDB4NDcsIDB4ZjksIDB4MDAsIDB4ZWYsIDB4OWEsIDB4YTAsIDB4OGMsIDB4NTgsIDB4MjgsIDB4YjYsIDB4ODUsCi0JMHgxOCwgMHgzMSwgMHhlNywgMHg4ZSwgMHhhMywgMHg4YywgMHg2ZCwgMHhlYywgMHg0NCwgMHgxMiwgMHhlNSwgMHg2MywKLQkweDkyLCAweDRjLCAweGU0LCAweGQ1LCAweGJkLCAweGI3LCAweDBlLCAweDk0LCAweGIxLCAweDhmLCAweGIwLCAweDhlLAotCTB4YzEsIDB4NzQsIDB4NmMsIDB4ZjEsIDB4Y2YsIDB4N2QsIDB4ODMsIDB4ZjIsIDB4M2UsIDB4MTUsIDB4MGYsIDB4YzgsCi0JMHg5OCwgMHgyZSwgMHhmNiwgMHgwMywgMHhjYiwgMHg5MiwgMHgyNiwgMHhkYiwgMHhlNSwgMHg1YywgMHg1NywgMHhlOSwKLQkweGMyLCAweDdiLCAweGFhLCAweDNjLCAweGI3LCAweDhiLCAweGM5LCAweGRkLCAweGQ1LCAweDE2LCAweGM5LCAweDU1LAotCTB4MWIsIDB4YWUsIDB4YTAsIDB4ZmYsIDB4ODMsIDB4M2QsIDB4NzksIDB4M2UsIDB4NjEsIDB4MGEsIDB4ZWYsIDB4NjAsCi0JMHhmOCwgMHhmYiwgMHgzYywgMHhiMiwgMHg5MywgMHg3YiwgMHgwMiwgMHg3YywgMHg4NywgMHhmZCwgMHg3ZCwgMHgwZSwKLQkweGYzLCAweDdkLCAweDE2LCAweGY2LCAweGY3LCAweDFjLCAweGVjLCAweGVmLCAweDMzLCAweGE1LCAweDM1LCAweGZkLAotCTB4ZTEsIDB4ZGIsIDB4NWQsIDB4ZWEsIDB4ODAsIDB4YTcsIDB4YjAsIDB4NjYsIDB4NjMsIDB4YzAsIDB4ZmQsIDB4YmIsCi0JMHhlMSwgMHgwZiwgMHg4YywgMHgwMCwgMHhmYiwgMHgwZiwgMHg2MSwgMHhmZCwgMHhkMiwgMHg1OCwgMHhiYiwgMHg3MSwKLQkweGRlLCAweDU1LCAweGMyLCAweDNhLCAweDBlLCAweGFhLCAweGIzLCAweGU1LCAweDU5LCAweDc1LCAweGRmLCAweGUzLAotCTB4ODcsIDB4Y2EsIDB4ZjYsIDB4M2UsIDB4NTYsIDB4MzIsIDB4NjAsIDB4MWYsIDB4MGEsIDB4ZGUsIDB4NzYsIDB4YzcsCi0JMHgwNiwgMHhmZSwgMHg1YiwgMHhkZCwgMHhjZiwgMHg4MywgMHgyZiwgMHg0MiwgMHhhZiwgMHhmYywgMHgxZCwgMHhlOCwKLQkweDdhLCAweDc2LCAweDk2LCAweGY2LCAweDFjLCAweDc1LCAweDdjLCAweGJjLCAweGVkLCAweDMyLCAweGJlLCAweDg1LAotCTB4ZmQsIDB4N2MsIDB4ZTQsIDB4YmMsIDB4YWMsIDB4MDAsIDB4NzcsIDB4NjQsIDB4MjgsIDB4YzcsIDB4ZjAsIDB4MWYsCi0JMHhlYywgMHg2NywgMHhjYSwgMHhkMiwgMHg0MywgMHgxZCwgMHg1OCwgMHhlNiwgMHg1ZSwgMHgxOSwgMHgzOCwgMHg5NiwKLQkweDAwLCAweGQ2LCAweDAzLCAweDkyLCAweDU3LCAweDY3LCAweGE5LCAweDc4LCAweDNlLCAweGJiLCAweDU1LCAweDBjLAotCTB4ZTIsIDB4M2QsIDB4ZjcsIDB4MmEsIDB4OTQsIDB4NTEsIDB4NmYsIDB4MDQsIDB4MTgsIDB4NjksIDB4NjUsIDB4YjAsCi0JMHg1ZCwgMHgzMiwgMHgzYiwgMHhkYSwgMHg5NSwgMHhlZSwgMHhiMCwgMHhkZCwgMHg5NywgMHgzMSwgMHhlZSwgMHgyZSwKLQkweDY5LCAweDA0LCAweDg2LCAweDJiLCAweDYwLCAweDhjLCAweDgzLCAweGYyLCAweDM3LCAweDJlLCAweGUzLCAweDUyLAotCTB4YmUsIDB4ZWYsIDB4MDcsIDB4NWEsIDB4NjIsIDB4ZTAsIDB4NTksIDB4ZDMsIDB4M2UsIDB4YzcsIDB4OGMsIDB4ZWQsCi0JMHhhYSwgMHhiMSwgMHhmZiwgMHg5OCwgMHhjMiwgMHg1OCwgMHgzOSwgMHg2MSwgMHhmZiwgMHhiMCwgMHgxMywgMHgxOCwKLQkweDMzLCAweDc5LCAweDhjLCAweGIyLCAweGRmLCAweDg3LCAweDc1LCAweGZiLCAweDJkLCAweDYwLCAweDIwLCAweDcyLAotCTB4ZjUsIDB4NWIsIDB4NWIsIDB4ZmMsIDB4ZmQsIDB4NDIsIDB4ZmEsIDB4NTcsIDB4ODgsIDB4MjcsIDB4MTgsIDB4ZjcsCi0JMHhmNywgMHhmZCwgMHhmMiwgMHg1NSwgMHhkYSwgMHgwNiwgMHg0MCwgMHhlZiwgMHg3MywgMHg1YiwgMHg4MiwgMHhmMywKLQkweGUzLCAweGFlLCAweDYzLCAweGJlLCAweGJkLCAweGVlLCAweDNhLCAweDhiLCAweDU2LCAweDczLCAweGQyLCAweGMxLAotCTB4OTMsIDB4NjgsIDB4NDMsIDB4YWUsIDB4OTUsIDB4ZGIsIDB4MjMsIDB4N2UsIDB4M2YsIDB4YzYsIDB4ODIsIDB4MDksCi0JMHg1OSwgMHhhNSwgMHgxZSwgMHhlOCwgMHg4MCwgMHg5YywgMHgzMywgMHg0ZiwgMHg5ZCwgMHg0MiwgMHg5ZCwgMHg0MCwKLQkweDU5LCAweDcwLCAweGE0LCAweDU4LCAweDgzLCAweDRlLCAweDY4LCAweGVkLCAweDk0LCAweDMyLCAweDc5LCAweGI2LAotCTB4NDAsIDB4M2QsIDB4ZjEsIDB4NDMsIDB4OTksIDB4ZGUsIDB4YTAsIDB4MmIsIDB4ODcsIDB4MjQsIDB4ZjAsIDB4NmIsCi0JMHg1YiwgMHgyNCwgMHg5YSwgMHg3NiwgMHhjYywgMHg3YiwgMHhkNCwgMHgxYywgMHg3ZCwgMHg3ZCwgMHhiOSwgMHg5ZiwKLQkweGY4LCAweDczLCAweDM2LCAweDYzLCAweGI3LCAweDhiLCAweGM2LCAweDllLCAweDBhLCAweDNmLCAweDdkLCAweDFmLAotCTB4NzMsIDB4NjUsIDB4MWYsIDB4OGEsIDB4NGYsIDB4ODMsIDB4NDMsIDB4YmUsIDB4MmYsIDB4YTAsIDB4ZTIsIDB4N2MsCi0JMHhjMCwgMHhjMSwgMHg4OSwgMHhiZiwgMHg4MywgMHhhZSwgMHhjZCwgMHgxMSwgMHg5NywgMHg4MCwgMHhjZiwgMHg1ZCwKLQkweDczLCAweDk0LCAweGEzLCAweGVkLCAweGQ0LCAweDY1LCAweGMwLCAweDc5LCAweDI5LCAweGVhLCAweDZiLCAweDU5LAotCTB4M2EsIDB4MDYsIDB4Y2MsIDB4NjUsIDB4ZGMsIDB4MmEsIDB4NzksIDB4Y2EsIDB4MmIsIDB4ZWYsIDB4NDgsIDB4MmMsCi0JMHgxOSwgMHgzMiwgMHgzZCwgMHhkZiwgMHgyYSwgMHhkZCwgMHgwYiwgMHg4YywgMHhhOSwgMHg3ZSwgMHhiMywgMHg1OSwKLQkweDVhLCAweDE5LCAweDU3LCAweGE1LCAweDBkLCAweDFhLCAweDkwLCAweDFjLCAweGNhLCAweGJiLCAweDE2LCAweGMyLAotCTB4MmEsIDB4MDYsIDB4NTYsIDB4MzYsIDB4YzgsIDB4YTMsIDB4N2UsIDB4ZTgsIDB4MDMsIDB4M2IsIDB4YjUsIDB4NjIsCi0JMHg3YywgMHhiNCwgMHhjOSwgMHhjNywgMHg5MCwgMHg5MCwgMHhhNSwgMHgxMiwgMHg2NCwgMHhhYywgMHgwNCwgMHgxOSwKLQkweDJiLCAweDQxLCAweGM2LCAweDRhLCAweDkwLCAweDMxLCAweDYwLCAweGJmLCAweDY3LCAweGIxLCAweGZmLCAweGNlLAotCTB4OTUsIDB4MDYsIDB4YjUsIDB4NWQsIDB4ZGYsIDB4YTMsIDB4ZWMsIDB4ZmEsIDB4ZTEsIDB4ZDIsIDB4YWIsIDB4MWUsCi0JMHhkMywgMHgyZiwgMHgyOSwgMHhkZiwgMHhiNCwgMHgxZiwgMHgzMiwgMHg0OCwgMHg1ZiwgMHgzNCwgMHhmMCwgMHg1MSwKLQkweDVmLCAweDk1LCAweGE3LCAweDY2LCAweDVmLCAweDkzLCAweDUzLCAweGIzLCAweDZiLCAweDM4LCAweDcwLCAweGFhLAotCTB4ZTQsIDB4YzksIDB4Y2IsIDB4MmUsIDB4ZmMsIDB4Y2YsIDB4NDUsIDB4NjIsIDB4YWEsIDB4NGMsIDB4NWIsIDB4YTMsCi0JMHhjMiwgMHg1NiwgMHg4NywgMHgyNCwgMHhhZiwgMHg3MCwgMHhiMiwgMHhiMiwgMHgyMywgMHhjMCwgMHg1NywgMHgwYSwKLQkweDE3LCAweDcyLCAweDZmLCAweDRhLCAweGZiLCAweDhlLCAweGQ3LCAweGU1LCAweDFjLCAweGVjLCAweGY4LCAweDUyLAotCTB4ZWQsIDB4MGQsIDB4NzksIDB4NGUsIDB4ZTEsIDB4NzEsIDB4ZjIsIDB4ZTEsIDB4N2QsIDB4ZjIsIDB4YjcsIDB4YTYsCi0JMHg3ZiwgMHg4NiwgMHg3ZiwgMHgwYSwgMHg1OCwgMHg2MywgMHhhOSwgMHg5NywgMHhiYSwgMHgyMywgMHgwMiwgMHg1YiwKLQkweDYwLCAweDE3LCAweGJhLCAweGIwLCAweGFmLCAweDBmLCAweDE4LCAweGVmLCAweDAyLCAweGE2LCAweGUxLCAweGZiLAotCTB4YWQsIDB4ZjIsIDB4ZTIsIDB4NmMsIDB4YTEsIDB4NGUsIDB4MjYsIDB4YTgsIDB4MWYsIDB4ZWMsIDB4MjMsIDB4NjIsCi0JMHhkMCwgMHg0ZSwgMHhkMSwgMHg2ZSwgMHg3MiwgMHhiZSwgMHhiNCwgMHg1MywgMHg2ZCwgMHgyZCwgMHhiYywgMHgzZiwKLQkweDU2LCAweDM5LCAweDdlLCAweGMzLCAweDE2LCAweGM2LCAweDE4LCAweGUzLCAweDBlLCAweDc5LCAweGZhLCAweGJhLAotCTB4MWMsIDB4YTgsIDB4YjIsIDB4ZWMsIDB4MzUsIDB4YWMsIDB4MGYsIDB4ZDMsIDB4MzcsIDB4YmQsIDB4YmIsIDB4ZTMsCi0JMHgxYywgMHg4ZiwgMHhmZCwgMHgwMiwgMHgzNywgMHg3NSwgMHg2MCwgMHhhZSwgMHhhNSwgMHhjZiwgMHg2YSwgMHhjYywKLQkweGRkLCAweGFmLCAweDcwLCAweGY0LCAweGU1LCAweDc4LCAweDk5LCAweDdjLCAweDcyLCAweGMxLCAweGE3LCAweGQ3LAotCTB4NTUsIDB4MGMsIDB4NzAsIDB4OTMsIDB4ZDgsIDB4ZjAsIDB4MTMsIDB4ZDgsIDB4NTcsIDB4ODUsIDB4OGIsIDB4YzIsCi0JMHgzOCwgMHgyNSwgMHg2MywgMHhiOCwgMHg4YywgMHgwZiwgMHhkNywgMHg2YiwgMHgwYywgMHg3NSwgMHg1NywgMHg0MCwKLQkweGVlLCAweDgyLCAweDdlLCAweGI5LCAweDFiLCAweGZhLCAweGU1LCAweDllLCAweGNiLCAweGVlLCAweDVmLCAweDA3LAotCTB4NzEsIDB4ZmYsIDB4ZWUsIDB4NDIsIDB4ZDgsIDB4ZTgsIDB4OTQsIDB4YjEsIDB4NmEsIDB4N2QsIDB4NWIsIDB4YzYsCi0JMHg2ZSwgMHgzNywgMHg4YiwgMHhkNSwgMHgzMiwgMHg4ZSwgMHg5YiwgMHhkYSwgMHgxMCwgMHhmZiwgMHhhMywgMHg2YywKLQkweDc4LCAweGYyLCAweDkyLCAweGNiLCAweGI4LCAweDViLCAweDcwLCAweDY3LCAweDdmLCAweDMzLCAweGZjLCAweDY1LAotCTB4YjUsIDB4MDQsIDB4NzEsIDB4ZTYsIDB4NDgsIDB4ZmEsIDB4YTIsIDB4ZjAsIDB4ZWUsIDB4N2UsIDB4NzEsIDB4ODYsCi0JMHg3OCwgMHgyMCwgMHhhZSwgMHhlZSwgMHhkOSwgMHgxOSwgMHgyYSwgMHhjZSwgMHhlNywgMHhiNywgMHgyZCwgMHhjZSwKLQkweGE4LCAweDczLCAweGE1LCAweDAyLCAweGUzLCAweGQ1LCAweGU2LCAweDRlLCAweGRiLCAweDFjLCAweDBiLCAweGZiLAotCTB4ZjcsIDB4NjUsIDB4YjgsIDB4OTcsIDB4N2QsIDB4NWQsIDB4MDYsIDB4NTksIDB4YWMsIDB4YWQsIDB4ZGQsIDB4YjEsCi0JMHgxYywgMHg1MiwgMHhmYSwgMHhlMiwgMHgyMiwgMHhmNiwgMHgwMCwgMHhkNywgMHgwYiwgMHhmZSwgMHgwMiwgMHhmNiwKLQkweGM5LCAweDE0LCAweGY0LCAweDUzLCAweDVlLCAweGY1LCAweDE3LCAweGEzLCAweDVjLCAweDY0LCAweGIyLCAweDYxLAotCTB4NDMsIDB4YTIsIDB4MjcsIDB4ZTgsIDB4MGIsIDB4ZjksIDB4YjEsIDB4OTYsIDB4NWMsIDB4ZDgsIDB4NTYsIDB4ZmEsCi0JMHgxYiwgMHhiNCwgMHgwMywgMHg5ZiwgMHg3MSwgMHg3ZiwgMHg1YSwgMHgxMywgMHg4ZCwgMHhlOSwgMHgwNiwgMHhkOCwKLQkweDU1LCAweGFjLCAweDVmLCAweDhkLCAweDMxLCAweDAxLCAweGVjLCAweGRkLCAweGU1LCAweGVmLCAweGNhLCAweGZlLAotCTB4ZjksIDB4ZTEsIDB4MTYsIDB4NWYsIDB4ZmUsIDB4MTksIDB4M2IsIDB4ZTYsIDB4ZmMsIDB4MDIsIDB4MWEsIDB4ZDYsCi0JMHhmNywgMHg2ZCwgMHg5YywgMHg5MCwgMHg1OCwgMHgzMywgMHg2YywgMHhkYSwgMHg4NywgMHhlMSwgMHg2NywgMHhlYywKLQkweDgyLCAweGFjLCAweGFjLCAweGM0LCAweGQ5LCAweGFmLCAweGJmLCAweDY3LCAweGE2LCAweDRiLCAweGVjLCAweGZiLAotCTB4YmIsIDB4MzIsIDB4M2MsIDB4N2YsIDB4YjYsIDB4ODUsIDB4YjYsIDB4NjQsIDB4MTksIDB4N2EsIDB4ZTAsIDB4YmMsCi0JMHg0OSwgMHgxYiwgMHgzYSwgMHgwZSwgMHgxYiwgMHhkNywgMHgyMSwgMHhkZiwgMHg5ZiwgMHhhNywgMHg3ZCwgMHg0YywKLQkweDlhLCAweGE3LCAweGE0LCAweDJmLCAweDcxLCAweDBhLCAweDM0LCAweDdkLCAweGRlLCAweDhkLCAweGQwLCAweDQ3LAotCTB4ZjMsIDB4ODYsIDB4NTAsIDB4ZjYsIDB4NGQsIDB4NDksIDB4OWEsIDB4NWQsIDB4MjEsIDB4M2UsIDB4ZjcsIDB4OTksCi0JMHg4ZiwgMHgwMywgMHhjMywgMHg2NiwgMHhjYywgMHhhNCwgMHg3OSwgMHg1ZCwgMHg4OCwgMHg3MiwgMHgwNCwgMHg5ZiwKLQkweDdiLCAweDc5LCAweDhkLCAweGNlLCAweDM3LCAweGU3LCAweDk1LCAweDlmLCAweGE0LCAweGY0LCAweGNjLCAweGIyLAotCTB4Y2IsIDB4ZjEsIDB4NDAsIDB4YjcsIDB4ZDIsIDB4NTksIDB4ZDcsIDB4NDEsIDB4OWYsIDB4YzQsIDB4ZjQsIDB4OTksCi0JMHgxYiwgMHhkYSwgMHgxMCwgMHhkYiwgMHhiOCwgMHgxMSwgMHg5ZCwgMHg3ZiwgMHg0NCwgMHhiMiwgMHgyNywgMHhlMywKLQkweGQwLCAweDY3LCAweGVjLCAweDJiLCAweGYwLCAweDFkLCAweDY4LCAweDIzLCAweDAzLCAweGJjLCAweDRkLCAweDdiLAotCTB4NzcsIDB4MmIsIDB4ZWMsIDB4ZGUsIDB4MzUsIDB4OGEsIDB4OWUsIDB4MTEsIDB4YjcsIDB4NWYsIDB4YTYsIDB4OGUsCi0JMHg3MywgMHhlYywgMHg1ZSwgMHhlOCwgMHhmMiwgMHg4NCwgMHg5MiwgMHhkYiwgMHg2MiwgMHhlOSwgMHg3YywgMHgyMiwKLQkweDA2LCAweDlkLCAweDFjLCAweGRiLCAweDQxLCAweDdlLCAweDdlLCAweDUwLCAweGVlLCAweDcwLCAweGM2LCAweGU1LAotCTB4NGUsIDB4YzgsIDB4Y2UsIDB4OTAsIDB4ZTMsIDB4Y2EsIDB4MzAsIDB4ZDYsIDB4NjIsIDB4OTcsIDB4MDMsIDB4YmIsCi0JMHhhMywgMHgzMCwgMHg3NCwgMHgyMywgMHhmYywgMHgyZSwgMHg4ZSwgMHhkZCwgMHhhMSwgMHhlZiwgMHg1YywgMHhmOCwKLQkweGY4LCAweGYxLCAweGNmLCAweDZhLCAweDNlLCAweDhmLCAweGIyLCAweGYzLCAweDJmLCAweDJiLCAweGRlLCAweDhjLAotCTB4YjgsIDB4MzcsIDB4NjksIDB4M2IsIDB4ZGIsIDB4MmEsIDB4MzksIDB4NTUsIDB4ZWYsIDB4MjYsIDB4NjUsIDB4OGYsCi0JMHg4YiwgMHg0YiwgMHhmNywgMHgyMiwgMHg4NSwgMHg2ZCwgMHg1ZSwgMHg4MiwgMHhiZSwgMHgwMSwgMHhlNiwgMHgyZSwKLQkweDU2LCAweDc3LCAweDIyLCAweDBmLCAweDFiLCAweGJhLCAweDk0LCAweDQ2LCAweGZhLCAweDQxLCAweGE0LCAweGFjLAotCTB4ZmIsIDB4YjksIDB4MTYsIDB4M2YsIDB4OTYsIDB4NWIsIDB4N2YsIDB4ODcsIDB4Y2MsIDB4YmYsIDB4N2YsIDB4ZmEsCi0JMHg2MSwgMHg4NSwgMHg0YiwgMHgyZiwgMHhhYSwgMHhmYiwgMHg4NywgMHgwNiwgMHhiMCwgMHg0ZSwgMHgxNiwgMHg3YSwKLQkweGE1LCAweDA1LCAweDE4LCAweDY4LCAweGU2LCAweDg0LCAweDlkLCAweDFhLCAweDBlLCAweGRkLCAweDI2LCAweDFmLAotCTB4ODEsIDB4MmYsIDB4NWYsIDB4NzEsIDB4YjksIDB4OTYsIDB4M2IsIDB4ZTUsIDB4MTMsIDB4YjcsIDB4NTAsIDB4NDYsCi0JMHg2ZSwgMHg5MywgMHg3ZCwgMHhiNywgMHg4NCwgMHg2NCwgMHg1ZiwgMHhiZiwgMHg5ZCwgMHgyMSwgMHhkZCwgMHhkNywKLQkweGJlLCAweDNmLCAweGYwLCAweGE3LCAweGJiLCAweDQ3LCAweDkyLCAweGExLCAweDAxLCAweDc5LCAweDFjLCAweDMyLAotCTB4NTYsIDB4ODAsIDB4N2MsIDB4MGQsIDB4ZDcsIDB4YzgsIDB4NzMsIDB4ZWEsIDB4N2IsIDB4ZWEsIDB4ZjksIDB4MTQsCi0JMHhiMCwgMHg3MiwgMHg4MCwgMHhmZCwgMHgxYywgMHg5OSwgMHhhOSwgMHgzNSwgMHg4OCwgMHg3NSwgMHgxNSwgMHhlMywKLQkweGM5LCAweDk2LCAweDdmLCAweGFlLCAweDcxLCAweDE1LCAweDY1LCAweDAyLCAweDNlLCAweGM4LCAweDU1LCAweGZlLAotCTB4ZmUsIDB4NTQsIDB4ZjcsIDB4ZmUsIDB4YWUsIDB4ZjIsIDB4ZWQsIDB4MGEsIDB4ZmMsIDB4NWYsIDB4OGYsIDB4MzgsCi0JMHhjZiwgMHhiZiwgMHg1ZiwgMHg3MCwgMHg1MSwgMHhlYiwgMHhkMiwgMHhlNCwgMHhkNiwgMHg1NSwgMHg3YywgMHhkNywKLQkweDRhLCAweGZmLCAweGUxLCAweGViLCAweDJkLCAweDZiLCAweGRmLCAweDJkLCAweDZjLCAweDk0LCAweGM1LCAweDIwLAotCTB4ZWUsIDB4NTYsIDB4YzYsIDB4OWMsIDB4NjksIDB4ZDMsIDB4NmQsIDB4OTMsIDB4YmEsIDB4YjAsIDB4Y2QsIDB4ZDksCi0JMHgyMywgMHg3ZiwgMHgwOSwgMHhmYiwgMHhmZSwgMHhkNSwgMHg1NSwgMHhmYiwgMHhiZSwgMHgxNywgMHhmYywgMHhkOCwKLQkweDg4LCAweDAxLCAweDFjLCAweGYzLCAweDJlLCAweGNjLCAweDY1LCAweDA0LCAweGViLCAweDc5LCAweDI3LCAweDdlLAotCTB4NzcsIDB4OTQsIDB4ZDYsIDB4YzUsIDB4ZjEsIDB4NjYsIDB4MGIsIDB4YzAsIDB4OTMsIDB4MGQsIDB4MGUsIDB4ZmIsCi0JMHg1YiwgMHgxNywgMHhjZiwgMHgyYiwgMHhlNCwgMHg2NSwgMHgzNSwgMHg1NiwgMHgzOCwgMHg3OCwgMHg0OSwgMHg2OCwKLQkweGY3LCAweGRlLCAweDkyLCAweDY4LCAweDhmLCAweGYzLCAweDU2LCAweDU3LCAweGM4LCAweDc5LCAweGRlLCAweDA4LAotCTB4ZjEsIDB4ZWMsIDB4ZGIsIDB4OTUsIDB4ZDMsIDB4MzUsIDB4ZTIsIDB4YjAsIDB4MGIsIDB4NjIsIDB4OWMsIDB4MjUsCi0JMHgwNiwgMHg3YiwgMHg0NSwgMHhjNSwgMHhhMCwgMHgyYSwgMHhhNSwgMHg2ZiwgMHgyMywgMHg0NSwgMHg3ZCwgMHhlOCwKLQkweGM3LCAweGIwLCAweDFmLCAweGE3LCAweDUwLCAweDU4LCAweDg1LCAweDdhLCAweGY2LCAweDRlLCAweGFjLCAweGMzLAotCTB4MTQsIDB4N2UsIDB4NWQsIDB4M2IsIDB4YWUsIDB4YzMsIDB4ZmUsIDB4YTUsIDB4OWMsIDB4MzIsIDB4ZjYsIDB4ZDUsCi0JMHg2MywgMHhlZSwgMHgwOCwgMHhmMSwgMHhkZCwgMHg2NiwgMHg3MSwgMHhiMCwgMHhlZiwgMHg0OCwgMHg2NCwgMHgwZSwKLQkweGI2LCAweGNlLCAweGEwLCAweDdlLCAweGUwLCAweDNjLCAweDY4LCAweDI3LCAweDRkLCAweDU5LCAweDNjLCAweGNlLAotCTB4YmQsIDB4YmUsIDB4NTksIDB4ZmQsIDB4YTAsIDB4NmUsIDB4MzAsIDB4MTcsIDB4NjUsIDB4MzcsIDB4MzIsIDB4NzksCi0JMHhjNiwgMHgzOCwgMHg0YiwgMHg1YywgMHgwMywgMHgxNywgMHg2YiwgMHhlMCwgMHhjOSwgMHgwOSwgMHhiNywgMHgwZCwKLQkweDdhLCAweDNiLCAweDJlLCAweGUxLCAweDEzLCAweDllLCAweDBjLCAweDI5LCAweGVjLCAweGRhLCAweDA3LCAweGNjLAotCTB4YjUsIDB4NTUsIDB4ZTMsIDB4ODYsIDB4YjgsIDB4NDQsIDB4NGUsIDB4NzQsIDB4NGEsIDB4MjMsIDB4NzAsIDB4NzUsCi0JMHhjMywgMHg1MSwgMHhkYSwgMHhjOCwgMHhhNCwgMHgzNSwgMHgwNCwgMHgyMSwgMHg4OCwgMHhhOCwgMHhiYiwgMHhhYywKLQkweGY2LCAweGUwLCAweGY3LCAweGE1LCAweGNmLCAweGZhLCAweGJlLCAweDEwLCAweDJmLCAweGZkLCAweDdiLCAweGFjLAotCTB4OWYsIDB4ZWQsIDB4NWUsIDB4ZDgsIDB4YTQsIDB4N2UsIDB4NzEsIDB4YWQsIDB4M2UsIDB4ZTQsIDB4ODgsIDB4YjEsCi0JMHgzNSwgMHhiNiwgMHg2MSwgMHhhYywgMHgyZCwgMHgzOSwgMHhmOCwgMHgzZCwgMHhjNiwgMHhkOCwgMHhlMCwgMHg2YiwKLQkweDM2LCAweDljLCAweGYxLCAweDY5LCAweDMwLCAweDk2LCAweGRiLCAweGE1LCAweDcyLCAweDkyLCAweDdiLCAweDk0LAotCTB4NzEsIDB4MTYsIDB4ZDMsIDB4ZjcsIDB4NTMsIDB4NGIsIDB4ZjQsIDB4NTcsIDB4ZjksIDB4ZGUsIDB4ZDIsIDB4ZWYsCi0JMHhiYiwgMHhmNCwgMHg3YiwgMHhmYSwgMHhhMywgMHgwNSwgMHhhZiwgMHgwMSwgMHgzYywgMHhkZCwgMHgwNSwgMHhmZCwKLQkweDc5LCAweGVmLCAweDRlLCAweDQ3LCAweGUxLCAweDg2LCAweDdiLCAweDU3LCAweGQ3LCAweDZjLCAweGI3LCAweGJhLAotCTB4NGYsIDB4NTQsIDB4MjksIDB4MWQsIDB4MTIsIDB4NjcsIDB4YzcsIDB4NGEsIDB4MmEsIDB4MjIsIDB4NjMsIDB4NTgsCi0JMHgwYiwgMHhlNiwgMHgzMywgMHhhNCwgMHgyNywgMHg3NSwgMHg1OCwgMHgwZSwgMHhhOCwgMHhiNSwgMHhhOSwgMHgxYywKLQkweGI3LCAweDhmLCAweDU4LCAweGExLCAweDI5LCAweDMxLCAweDJhLCAweDdjLCAweGZlLCAweDM0LCAweGQyLCAweGMzLAotCTB4YzAsIDB4M2IsIDB4N2UsIDB4ZWMsIDB4ZDIsIDB4YTgsIDB4YWMsIDB4ZTcsIDB4MjUsIDB4MzAsIDB4ODYsIDB4YjksCi0JMHg2YiwgMHg1ZCwgMHgxYywgMHg2YiwgMHgyZCwgMHhjNiwgMHhjNSwgMHhmNywgMHg0MywgMHhlYSwgMHg3ZCwgMHg2YSwKLQkweDVkLCAweDljLCAweDJiLCAweDY3LCAweDEwLCAweGNiLCAweDA0LCAweGVmLCAweGI5LCAweDE2LCAweDVjLCAweDJmLAotCTB4ZDgsIDB4ZTIsIDB4ZTMsIDB4NDEsIDB4Y2MsIDB4YWIsIDB4NTUsIDB4YWYsIDB4MGIsIDB4ZDcsIDB4NjcsIDB4NDYsCi0JMHhjZSwgMHg5OSwgMHhmNiwgMHgwOCwgMHhlNSwgMHhlZiwgMHg4NiwgMHg5ZCwgMHg1NywgMHhjYiwgMHg0NCwgMHgwNywKLQkweGUzLCAweDZkLCAweGY1LCAweDM0LCAweDZjLCAweDhjLCAweGEzLCAweGQ1LCAweDhmLCAweGJmLCAweDMxLCAweGZlLAotCTB4YzYsIDB4YjEsIDB4ZmQsIDB4MTgsIDB4NWIsIDB4NzYsIDB4NWQsIDB4OGMsIDB4YWQsIDB4N2UsIDB4M2MsIDB4OGUsCi0JMHhiNSwgMHgxNSwgMHhmZSwgMHg1MywgMHhjMSwgMHg4YiwgMHgzYiwgMHg1YywgMHhhMywgMHg2ZSwgMHg2YiwgMHg5ZSwKLQkweGY5LCAweDJmLCAweDFhLCAweDU4LCAweGM3LCAweDM4LCAweGVjLCAweDA4LCAweGQ3LCAweDMyLCAweDM4LCAweDZmLAotCTB4ZTYsIDB4OWEsIDB4MjYsIDB4YWQsIDB4YzMsIDB4ZmUsIDB4N2EsIDB4MGUsIDB4ZmEsIDB4ZWIsIDB4ZWUsIDB4YWYsCi0JMHhmZiwgMHg4NSwgMHhkNSwgMHg3NSwgMHhhNCwgMHg3ZCwgMHhlMCwgMHgzYSwgMHg3NiwgMHg4OCwgMHg0MCwgMHhjZiwKLQkweDFhLCAweDQ3LCAweGI5LCAweDg2LCAweDRjLCAweGI5LCAweDg2LCAweDdjLCAweGM3LCAweDM1LCAweGVjLCAweGQyLAotCTB4ZWYsIDB4YjgsIDB4N2UsIDB4YzAsIDB4NjksIDB4NWYsIDB4ZTAsIDB4M2QsIDB4ZDUsIDB4YWMsIDB4ZmEsIDB4MDYsCi0JMHhhYiwgMHhhYiwgMHgyNywgMHhkOCwgMHg4YiwgMHgyOSwgMHg3OSwgMHg2ZSwgMHhiMSwgMHg1OSwgMHhjYywgMHhiNCwKLQkweDNmLCAweGFmLCAweGYxLCAweDc1LCAweGYxLCAweDc2LCAweDllLCAweDVmLCAweGY1LCAweDEzLCAweDdiLCAweDA2LAotCTB4ZjMsIDB4NGEsIDB4NzAsIDB4NWUsIDB4MDcsIDB4ZTQsIDB4NzUsIDB4YzksIDB4Y2YsIDB4NDQsIDB4ZTAsIDB4MDMsCi0JMHhhNiwgMHg4MCwgMHg3MywgMHhmYSwgMHhhMSwgMHg2ZiwgMHgxOSwgMHgxZiwgMHg0NSwgMHg1OSwgMHg5NSwgMHg3OCwKLQkweDg1LCAweGI2LCAweDJlLCAweDg1LCAweGJkLCAweDQyLCAweDFkLCAweDRjLCAweDNjLCAweGYyLCAweDlhLCAweGU0LAotCTB4Y2EsIDB4ODEsIDB4OGUsIDB4NDEsIDB4ZmYsIDB4NDYsIDB4ZDAsIDB4M2YsIDB4ZjksIDB4OWMsIDB4YjksIDB4NzYsCi0JMHhiYiwgMHhhYywgMHg1OCwgMHhkYiwgMHhjNSwgMHhiNiwgMHg5NiwgMHg2NCwgMHg2ZCwgMHg1ZCwgMHhjNywgMHgzNywKLQkweGU3LCAweGJiLCAweDdiLCAweDZmLCAweDc4LCAweDRkLCAweDM2LCAweGM2LCAweDM3LCAweDU5LCAweGZiLCAweDQ5LAotCTB4MDksIDB4ZGUsIDB4MDcsIDB4NmIsIDB4YmYsIDB4ZTksIDB4M2EsIDB4MTQsIDB4NWUsIDB4MTUsIDB4YWUsIDB4MDUsCi0JMHg3OSwgMHg0MCwgMHgzYywgMHgxYywgMHg5NSwgMHg3ZiwgMHgxMywgMHhlNywgMHg3ZSwgMHgyYywgMHhhOCwgMHgzMywKLQkweGNkLCAweGE0LCAweGQxLCAweGEzLCAweDc0LCAweGM2LCAweDkwLCAweGViLCAweGNiLCAweDZiLCAweDAxLCAweGUzLAotCTB4YzQsIDB4YmEsIDB4ZmYsIDB4ZDAsIDB4MWIsIDB4OGEsIDB4YzMsIDB4Y2YsIDB4ZWQsIDB4YTYsIDB4N2UsIDB4MDksCi0JMHhmNiwgMHg3NCwgMHhiMywgMHhkYSwgMHhkMywgMHg5ZiwgMHg3NywgMHg0MywgMHg1MiwgMHg3NCwgMHg0MiwgMHgzMiwKLQkweGU1LCAweDFjLCAweDUyLCAweDE4LCAweGZmLCAweGEzLCAweGU4LCAweGViLCAweDEzLCAweGJhLCAweGFmLCAweDI5LAotCTB4ZTksIDB4ZDEsIDB4ZmEsIDB4ZTcsIDB4MjAsIDB4ZTQsIDB4ZGMsIDB4OTMsIDB4N2IsIDB4ZGMsIDB4OWQsIDB4NzIsCi0JMHg0MywgMHgxYiwgMHhmNywgMHg0MCwgMHgzMCwgMHhmZiwgMHg0MywgMHhkMiwgMHhiZCwgMHg3MywgMHhjNSwgMHg4MiwKLQkweDY3LCAweDcwLCAweDZkLCAweDc0LCAweDk1LCAweDA3LCAweGRjLCAweDY3LCAweDgxLCAweDdjLCAweGZiLCAweDdjLAotCTB4ZjAsIDB4ZTcsIDB4YmYsIDB4NmUsIDB4YWUsIDB4N2EsIDB4OWUsIDB4OWMsIDB4MzMsIDB4ZWIsIDB4NzEsIDB4YWUsCi0JMHgzZSwgMHg5NiwgMHg1ZiwgMHg5YiwgMHg2YiwgMHg1MCwgMHhiZiwgMHgwNSwgMHhiMiwgMHg2NCwgMHg1YiwgMHgxMiwKLQkweGFhLCAweGU3LCAweGNkLCAweGFhLCAweDhlLCAweDFhLCAweDYxLCAweDhjLCAweDY0LCAweGM1LCAweGI0LCAweDUzLAotCTB4NTYsIDB4MjgsIDB4ODgsIDB4NDUsIDB4ZmIsIDB4NTgsIDB4YjcsIDB4MGIsIDB4MzgsIDB4ZGMsIDB4ZTksIDB4ZTksCi0JMHg0OSwgMHhlNSwgMHg1NSwgMHg4YywgMHhkNCwgMHg1MCwgMHhmMywgMHg5YSwgMHgwMiwgMHgyNiwgMHg1YiwgMHg3NCwKLQkweDVmLCAweGY1LCAweDNlLCAweDA5LCAweGNjLCAweDNhLCAweDIxLCAweDBmLCAweDQ5LCAweDc4LCAweDVkLCAweDJjLAotCTB4MTcsIDB4ZjksIDB4YjMsIDB4OGMsIDB4ZTcsIDB4ZGEsIDB4NTYsIDB4MDYsIDB4NmIsIDB4ZmMsIDB4M2IsIDB4ZjAsCi0JMHhlMSwgMHgyYiwgMHhkMCwgMHhmYiwgMHgxZiwgMHhhMywgMHg2ZCwgMHgyOCwgMHhjMSwgMHg1ZSwgMHgwMCwgMHg5NywKLQkweDdjLCAweGY1LCAweDhhLCAweDE4LCAweDdlLCAweGEyLCAweDJlLCAweDk2LCAweGViLCAweGUzLCAweGQzLCAweDczLAotCTB4MGEsIDB4OTMsIDB4MTIsIDB4YjcsIDB4MWYsIDB4MDksIDB4ZGQsIDB4ZDUsIDB4MWIsIDB4ODYsIDB4OWYsIDB4NTEsCi0JMHhmMCwgMHg2MiwgMHgwZSwgMHg3MSwgMHhkYywgMHgyMSwgMHhiOSwgMHgwMywgMHhlYiwgMHg3MywgMHg3YSwgMHhiMSwKLQkweDEwLCAweGRhLCAweDU1LCAweDBhLCAweDY0LCAweDE1LCAweDdlLCAweDY1LCAweGNkLCAweDRlLCAweDlkLCAweDA3LAotCTB4M2YsIDB4OWUsIDB4ZDIsIDB4OTgsIDB4OGYsIDB4ZTcsIDB4MzUsIDB4MTUsIDB4ZWQsIDB4YjMsIDB4MzAsIDB4MzYsCi0JMHg1NCwgMHhhYywgMHgxZCwgMHg5MiwgMHg2OSwgMHg5NywgMHhiMSwgMHg5ZCwgMHg2ZSwgMHgyOSwgMHhjNiwgMHgzMywKLQkweDU3LCAweDM3LCAweGFlLCAweGYyLCAweGM4LCAweDM2LCAweGUxLCAweGYzLCAweGE1LCAweGE4LCAweGJmLCAweDJiLAotCTB4ZmEsIDB4YmMsIDB4ZTMsIDB4MjksIDB4MjUsIDB4NWYsIDB4NDEsIDB4NWMsIDB4OTgsIDB4ZmUsIDB4MTEsIDB4Y2YsCi0JMHhhYiwgMHhiYSwgMHhjZCwgMHgxMSwgMHgzZSwgMHg5NywgMHgyOSwgMHgwMywgMHhjYSwgMHg2NywgMHgwMiwgMHgyZiwKLQkweGVmLCAweDkwLCAweGNjLCAweDk4LCAweGE1LCAweDcwLCAweGNiLCAweDYzLCAweDI1LCAweGVlLCAweDE3LCAweGUyLAotCTB4ZmYsIDB4ZDcsIDB4ODEsIDB4ZmQsIDB4MjMsIDB4NTgsIDB4MzMsIDB4ZmEsIDB4MDEsIDB4MWMsIDB4OWIsIDB4ZmIsCi0JMHgwMiwgMHg2NSwgMHg1NSwgMHhmMywgMHg5NywgMHhlYywgMHg4YiwgMHgwZiwgMHg2ZCwgMHgyMywgMHhjNiwgMHg3OCwKLQkweGExLCAweGY0LCAweDk4LCAweGUyLCAweGRmLCAweDhhLCAweDA0LCAweGIxLCAweDczLCAweDg1LCAweDA1LCAweDBiLAotCTB4ZDksIDB4NzAsIDB4NDgsIDB4OTIsIDB4NzMsIDB4ZmYsIDB4MTYsIDB4MzIsIDB4ZDQsIDB4MGYsIDB4MWYsIDB4ODksCi0JMHhmNSwgMHg0NCwgMHg5ZCwgMHg1ZiwgMHgwZCwgMHgwMSwgMHg3MywgMHgxOSwgMHhjZSwgMHhiYiwgMHhhNCwgMHg2OCwKLQkweDQ2LCAweGE1LCAweGE4LCAweGVlLCAweGZlLCAweGYxLCAweDNjLCAweDM3LCAweGFjLCAweDYyLCAweDNiLCAweDQ1LAotCTB4OTMsIDB4OTgsIDB4M2YsIDB4YmQsIDB4MmQsIDB4YjgsIDB4ZmIsIDB4NTcsIDB4MzQsIDB4ZDksIDB4OGUsIDB4NzksCi0JMHg5NiwgMHg0ZiwgMHg0OSwgMHg3NCwgMHhlZSwgMHhhMCwgMHgzNCwgMHhjYywgMHgzZCwgMHgyNCwgMHg4ZCwgMHhjNywKLQkweDg4LCAweGYxLCAweDE4LCAweGJiLCAweDM3LCAweDZlLCAweDZkLCAweDE0LCAweDYyLCAweGVlLCAweDZmLCAweDYxLAotCTB4ZWMsIDB4NDMsIDB4ZjIsIDB4MDMsIDB4MzcsIDB4YTAsIDB4ZTksIDB4YmEsIDB4YWQsIDB4ZDIsIDB4Y2EsIDB4M2EsCi0JMHg0MSwgMHg5ZSwgMHhjZiwgMHhjNCwgMHgwOSwgMHgzYywgMHgxNywgMHg3NywgMHhmYywgMHgxOCwgMHhhOSwgMHgzYSwKLQkweDU3LCAweDQxLCAweDVhLCAweGUxLCAweGI5LCAweDM4LCAweGRmLCAweGJmLCAweDY2LCAweGZhLCAweGE5LCAweDhmLAotCTB4ZjcsIDB4N2QsIDB4ZGYsIDB4ODMsIDB4NmQsIDB4NTIsIDB4NzUsIDB4ZDgsIDB4NjIsIDB4ZmQsIDB4ZjcsIDB4YTEsCi0JMHgzOSwgMHg5NCwgMHhlNywgMHhlNywgMHg4MywgMHgzYiwgMHgzYSwgMHgwNiwgMHg3YywgMHg1ZiwgMHhiYiwgMHg0MCwKLQkweDlmLCAweGMxLCAweGU0LCAweGI3LCAweDk4LCAweGYzLCAweDA1LCAweGYwLCAweGY5LCAweDFhLCAweDc1LCAweGJmLAotCTB4ODcsIDB4NzcsIDB4MjQsIDB4NTAsIDB4Y2YsIDB4ZjIsIDB4MzEsIDB4MWYsIDB4ZjMsIDB4MDksIDB4ZjAsIDB4ZjksCi0JMHhmZCwgMHg5ZCwgMHg0NiwgMHhmYSwgMHg3ZiwgMHg1ZiwgMHg5ZCwgMHgxZCwgMHgyMCwgMHhhNiwgMHhkOCwgMHhjNiwKLQkweGIzLCAweDNmLCAweDYwLCAweDU1LCAweGFlLCAweGVkLCAweDc3LCAweGIxLCAweGI2LCAweDhkLCAweGVhLCAweGFjLAotCTB4YTUsIDB4NTgsIDB4YTIsIDB4MGYsIDB4OTUsIDB4YzcsIDB4OWEsIDB4ZjEsIDB4OWUsIDB4MWMsIDB4N2QsIDB4YWQsCi0JMHhiYywgMHg4ZSwgMHg4MSwgMHg5MiwgMHg0ZSwgMHhlMiwgMHhlOCwgMHgwMCwgMHg5MywgMHhiMywgMHhjZiwgMHhjZCwKLQkweGVlLCAweDAzLCAweDA3LCAweDdlLCAweDEyLCAweGQ3LCAweDM4LCAweGExLCAweDY4LCAweDFlLCAweGRlLCAweGUwLAotCTB4MjMsIDB4MWMsIDB4YzYsIDB4ZmUsIDB4NWIsIDB4ODQsIDB4MGMsIDB4NGQsIDB4NDIsIDB4ZWYsIDB4MGMsIDB4ODUsCi0JMHhiOSwgMHgyNywgMHg5YSwgMHhiNSwgMHhmZiwgMHhlOCwgMHhkMCwgMHg1NywgMHgwZSwgMHg4ZCwgMHhhMSwgMHgwZiwKLQkweGUzLCAweGQ4LCAweDFiLCAweDMyLCAweDA1LCAweDlkLCAweDNiLCAweDVkLCAweDRiLCAweGFhLCAweDZmLCAweDc4LAotCTB4MzIsIDB4MDksIDB4ZGUsIDB4ZGIsIDB4NjIsIDB4ZjksIDB4N2YsIDB4ODEsIDB4OGMsIDB4YmMsIDB4MDEsIDB4MGMsCi0JMHhiYSwgMHgwNSwgMHhmYywgMHgzNCwgMHhmNCwgMHhiZCwgMHg5MCwgMHgwZiwgMHhlOCwgMHhmOCwgMHg0ZiwgMHg4YywKLQkweGYxLCAweDZmLCAweGU4LCAweGFhLCAweGEyLCAweDhmLCAweGVmLCAweGUyLCAweGQzLCAweDQ4LCAweGJmLCAweGQwLAotCTB4ZWMsIDB4Y2IsIDB4YzgsIDB4Y2IsIDB4N2EsIDB4OGQsIDB4OWIsIDB4NTAsIDB4ZmUsIDB4YTgsIDB4OGEsIDB4ZmIsCi0JMHhmOSwgMHg3MywgMHhiMiwgMHhiNSwgMHg3ZiwgMHgxMCwgMHhjNSwgMHgzYSwgMHg3MywgMHg1ZSwgMHg1ZiwgMHg0MSwKLQkweDNkLCAweGFlLCAweDZmLCAweGFmLCAweDNlLCAweDBmLCAweDZkLCAweDU2LCAweDNhLCAweDI5LCAweGU3LCAweDVhLAotCTB4ZjAsIDB4NzUsIDB4ODksIDB4ODksIDB4ODAsIDB4YTksIDB4NWQsIDB4YjYsIDB4N2IsIDB4NzYsIDB4MWIsIDB4Y2YsCi0JMHgxYiwgMHgxYiwgMHgxYywgMHg4NSwgMHhlNywgMHgzYiwgMHhjMiwgMHgxMiwgMHg5NCwgMHhkZCwgMHg4ZSwgMHgzMiwKLQkweGM2LCAweDI1LCAweGRlLCAweDg1LCAweGI1LCAweDYxLCAweDU5LCAweDE2LCAweDc5LCAweDhlLCAweDc1LCAweGI1LAotCTB4MWUsIDB4ODcsIDB4NjMsIDB4MGMsIDB4YjcsIDB4YWMsIDB4YTcsIDB4ODksIDB4NzMsIDB4ZTksIDB4ZDgsIDB4ZjAsCi0JMHhmZCwgMHgwMCwgMHhjYiwgMHhkZSwgMHhhNSwgMHhjYiwgMHgyMiwgMHg3YSwgMHg3ZSwgMHhiNywgMHhlYiwgMHg2ZiwKLQkweDY3LCAweGVkLCAweDIzLCAweDk5LCAweDU1LCAweDNjLCAweDRhLCAweGZhLCAweDYyLCAweGFhLCAweDVkLCAweGM2LAotCTB4ZjQsIDB4NjUsIDB4ZTcsIDB4MzAsIDB4ZDYsIDB4MjMsIDB4OTIsIDB4ZjYsIDB4ZGEsIDB4YjksIDB4NDcsIDB4ODYsCi0JMHhjMiwgMHg4MSwgMHg1ZiwgMHg5OCwgMHg1MCwgMHhiZSwgMHg5ZSwgMHg2NSwgMHhmOCwgMHg3NywgMHg4NCwgMHhjZSwKLQkweDVkLCAweDc2LCAweDBmLCAweGRhLCAweGJmLCAweDUzLCAweDNlLCAweGRjLCAweGRiLCAweDI0LCAweDhiLCAweGIzLAotCTB4MzEsIDB4N2QsIDB4M2YsIDB4MzEsIDB4YTEsIDB4ZjYsIDB4NDksIDB4N2UsIDB4OWMsIDB4ZjksIDB4MWYsIDB4NmQsCi0JMHhlMywgMHg3NywgMHhjYiwgMHg4NiwgMHhjMywgMHhmMiwgMHgwZSwgMHhjZCwgMHhkZiwgMHg3NywgMHhhOSwgMHhmYiwKLQkweDNjLCAweGJjLCAweDY3LCAweDUyLCAweDJjLCAweGZmLCAweDQ0LCAweGJkLCAweDNmLCAweDNkLCAweGRmLCAweGEwLAotCTB4ZWEsIDB4OWYsIDB4OWUsIDB4ZGYsIDB4NzgsIDB4MjcsIDB4ODcsIDB4NjUsIDB4ZWYsIDB4NjYsIDB4NGMsIDB4NDEsCi0JMHg5NiwgMHg2NiwgMHgxYSwgMHg2NCwgMHg3OSwgMHhkZSwgMHhhMiwgMHg4ZiwgMHg5NCwgMHg2ZSwgMHg1YywgMHhmYiwKLQkweGY2LCAweDQ1LCAweDdmLCAweGE3LCAweGU2LCAweGM5LCAweDMwLCAweGQ2LCAweDZmLCAweDcxLCAweDcwLCAweDVhLAotCTB4MmEsIDB4ODMsIDB4ZjQsIDB4MDEsIDB4ZDQsIDB4YmQsIDB4M2IsIDB4YzgsIDB4NDgsIDB4MDMsIDB4ZjAsIDB4NWYsCi0JMHhjMSwgMHhhYiwgMHgzOCwgMHg4YywgMHhiZCwgMHhiNiwgMHg2YSwgMHgxZiwgMHhlYSwgMHhjNywgMHhkYSwgMHhjZiwKLQkweDIyLCAweDhmLCAweDBjLCAweGM5LCAweGY1LCAweDRmLCAweDI5LCAweGJhLCAweDJhLCAweDhhLCAweDU3LCAweGMxLAotCTB4YjcsIDB4NDUsIDB4ZWMsIDB4OWYsIDB4ZGYsIDB4MTcsIDB4ODUsIDB4MzUsIDB4N2UsIDB4N2MsIDB4NTAsIDB4ZjMsCi0JMHhmYywgMHhhZiwgMHg3NSwgMHhmYSwgMHg4OCwgMHhlYywgMHgzYiwgMHhmZSwgMHgxOSwgMHhkMCwgMHhkYSwgMHhlNCwKLQkweGRmLCAweDJkLCAweDkyLCAweGZhLCAweGVmLCAweDM2LCAweDIyLCAweGVhLCAweGRiLCAweDk1LCAweDg4LCAweGYzLAotCTB4MDgsIDB4Y2EsIDB4MTgsIDB4N2IsIDB4N2EsIDB4NDQsIDB4Y2QsIDB4ODMsIDB4ZjcsIDB4ZDcsIDB4MGEsIDB4ZjIsCi0JMHhhYiwgMHhlZSwgMHg2NCwgMHgwNCwgMHhmZSwgMHgwZiwgMHhlZiwgMHgwOCwgMHgzNSwgMHhlYiwgMHhmZSwgMHg3NiwKLQkweGU5LCAweDc1LCAweDFjLCAweDk3LCAweDdkLCAweGQwLCAweGVmLCAweDc5LCAweGUwLCAweDQwLCAweGRlLCAweGFiLAotCTB4OWEsIDB4MDgsIDB4ZDcsIDB4OGYsIDB4MTksIDB4YzgsIDB4YjIsIDB4ZWYsIDB4NWIsIDB4MDcsIDB4NjcsIDB4ZmQsCi0JMHg2MSwgMHhlNSwgMHgwMywgMHhhYywgMHhmYSwgMHhlOSwgMHhiYSwgMHg3YywgMHg1YywgMHhmNiwgMHg5NywgMHg5NCwKLQkweGJmLCAweGFlLCAweGNlLCAweGU4LCAweGE2LCAweGIxLCAweDI3LCAweDg3LCAweDk0LCAweDBlLCAweDhmLCAweDg1LAotCTB4ODYsIDB4YWIsIDB4NjksIDB4YzksIDB4OWYsIDB4ZGMsIDB4OGQsIDB4NzEsIDB4MTgsIDB4ZmIsIDB4Y2EsIDB4ZTgsCi0JMHhiMywgMHhiMCwgMHhiZCwgMHhiMiwgMHhhZiwgMHhlNiwgMHg4ZiwgMHgzZCwgMHg1OSwgMHhlMiwgMHhmYiwgMHgyNCwKLQkweGVjLCAweDIyLCAweGRmLCAweGU3LCAweDEyLCAweDYxLCAweDE1LCAweGNkLCAweGJmLCAweDBlLCAweDZkLCAweDFiLAotCTB4MzQsIDB4NmYsIDB4NzksIDB4OWYsIDB4OWUsIDB4ZWQsIDB4YjksIDB4ZmYsIDB4M2UsIDB4NmUsIDB4NGEsIDB4NzMsCi0JMHgwZSwgMHhlZiwgMHhkOSwgMHgyNiwgMHhlOCwgMHg2ZiwgMHgxMiwgMHg3YSwgMHg5YSwgMHhmZSwgMHhlOCwgMHhjMywKLQkweGIyLCAweDUyLCAweDllLCAweDk2LCAweGYzLCAweGU1LCAweDQwLCAweGNlLCAweDc4LCAweGI3LCAweDk5LCAweGI0LAotCTB4ZGYsIDB4YTksIDB4ZWYsIDB4MzYsIDB4NjcsIDB4YjAsIDB4MGUsIDB4ZWIsIDB4NzksIDB4OTUsIDB4NWIsIDB4ZjcsCi0JMHhmZCwgMHhkMSwgMHg1ZiwgMHg5OCwgMHhmZSwgMHgzNywgMHg4MCwgMHhiNywgMHhhOSwgMHg3YiwgMHg0YSwgMHhlYiwKLQkweGU1LCAweDlkLCAweGZkLCAweDJjLCAweDliLCAweDhjLCAweGVkLCAweGZiLCAweDc3LCAweGFkLCAweDNhLCAweGVhLAotCTB4ZGUsIDB4YzcsIDB4ZjUsIDB4ZmQsIDB4YTYsIDB4ZTcsIDB4ZjQsIDB4OWQsIDB4NzgsIDB4ZjIsIDB4NzMsIDB4NGMsCi0JMHhkMywgMHg3YiwgMHgxZCwgMHhmNiwgMHgxZSwgMHhmYiwgMHg3YywgMHg1NCwgMHhhZiwgMHgxYiwgMHhkMiwgMHg0NSwKLQkweDNlLCAweDUzLCAweDBmLCAweGFkLCAweGU4LCAweGYzLCAweDRlLCAweDUzLCAweDhmLCAweDUxLCAweDdmLCAweGJmLAotCTB4YWMsIDB4YTEsIDB4NmUsIDB4NWMsIDB4YjYsIDB4ZTcsIDB4YjcsIDB4NDgsIDB4YzEsIDB4NWQsIDB4NmIsIDB4OTYsCi0JMHgxZCwgMHhkNywgMHhmNywgMHhkOCwgMHg4MiwgMHhiYiwgMHhkNSwgMHgyYywgMHgwYiwgMHhlZSwgMHg1YiwgMHg5MSwKLQkweDVmLCAweDhjLCAweGUxLCAweDIxLCAweGFkLCAweDhkLCAweGU5LCAweGU3LCAweGIxLCAweGJhLCAweDZmLCAweDc0LAotCTB4ODIsIDB4M2UsIDB4MjMsIDB4ZTgsIDB4ZTMsIDB4ZjYsIDB4ZjAsIDB4ZTUsIDB4NzcsIDB4YjEsIDB4ZjksIDB4ZGQsCi0JMHgxNCwgMHg2NSwgMHhkMSwgMHhlMCwgMHgzNywgMHhkZCwgMHhmNCwgMHg3YiwgMHg4MCwgMHg1NSwgMHhiNiwgMHhjYSwKLQkweGE0LCAweGEyLCAweGE3LCAweGEwLCAweGVlLCAweDI3LCAweDY0LCAweGRkLCAweDI2LCAweDE5LCAweDMyLCAweGZkLAotCTB4ZmMsIDB4ZTQsIDB4ZTIsIDB4NDYsIDB4MzksIDB4NjUsIDB4ZjksIDB4ZjUsIDB4MzEsIDB4NjksIDB4MmUsIDB4NjAsCi0JMHgxYywgMHhiZSwgMHhkZiwgMHhlYywgMHgxYiwgMHg4MSwgMHhhOCwgMHhmZSwgMHg0ZSwgMHhjOSwgMHg0NSwgMHg5YiwKLQkweGNmLCAweDUzLCAweGRlLCAweDBiLCAweDg1LCAweGQ1LCAweGJiLCAweDkwLCAweDA1LCAweDE1LCAweDk3LCAweDE0LAotCTB4MjMsIDB4YjgsIDB4OTMsIDB4YzgsIDB4NmYsIDB4ZDYsIDB4NDUsIDB4OWUsIDB4YTksIDB4ZjIsIDB4YmIsIDB4YWQsCi0JMHhkYiwgMHhkNCwgMHhiZCwgMHgxMSwgMHhmZiwgMHgyYywgMHg4ZSwgMHg3NCwgMHg3NSwgMHgyYiwgMHg5ZCwgMHg1YywKLQkweGE5LCAweDE2LCAweGM5LCAweDUzLCAweDFkLCAweDg3LCAweDhkLCAweGVhLCAweDM4LCAweDJjLCAweDc5LCAweDNjLAotCTB4MDIsIDB4MWUsIDB4ZmYsIDB4M2YsIDB4YmQsIDB4MmUsIDB4YzEsIDB4NzcsIDB4NWYsIDB4M2MsIDB4ZWIsIDB4ZTEsCi0JMHg3OSwgMHhkMCwgMHhhMywgMHg2YSwgMHgyZSwgMHhkNCwgMHhkMSwgMHg2OCwgMHhmYiwgMHhkZSwgMHhiMCwgMHhkYSwKLQkweGJiLCAweGVhLCAweDliLCAweDc4LCAweGM4LCAweDI3LCAweGJmLCAweDcxLCAweDg3LCAweDdlLCAweDJkLCAweGYxLAotCTB4NWIsIDB4ZjYsIDB4MTEsIDB4ZjUsIDB4M2QsIDB4NDcsIDB4YTUsIDB4Y2EsIDB4NzUsIDB4ZTUsIDB4MzcsIDB4ZWMsCi0JMHg2MywgMHg3NSwgMHhmMiwgMHgxOCwgMHhkNiwgMHg2MywgMHg2ZCwgMHg2OSwgMHg5MywgMHg2NiwgMHg3ZiwgMHhkZCwKLQkweGY5LCAweDJkLCAweDQ4LCAweGE1LCAweDFhLCAweGRjLCAweGEzLCAweGRjLCAweGIyLCAweGMyLCAweDNkLCAweDIxLAotCTB4YmUsIDB4NWYsIDB4YWIsIDB4YmUsIDB4NjcsIDB4YTksIDB4YTgsIDB4ZWYsIDB4NDMsIDB4MmMsIDB4N2UsIDB4NjcsCi0JMHgwOSwgMHhkYiwgMHhiMSwgMHgwNywgMHhjZiwgMHgzYywgMHg0NywgMHhkZCwgMHg4YiwgMHgxNCwgMHgzYSwgMHhhNywKLQkweDNhLCAweDgxLCAweGY0LCAweDIxLCAweGM5LCAweGE5LCAweDM4LCAweDU3LCAweDBiLCAweGYyLCAweDkzLCAweDZhLAotCTB4ZWMsIDB4NjIsIDB4ZjUsIDB4N2UsIDB4ZDksIDB4NzcsIDB4ZjIsIDB4MDEsIDB4N2UsIDB4NDMsIDB4YTMsIDB4YmUsCi0JMHhjMywgMHhjZiwgMHhiYSwgMHhhNCwgMHgzMSwgMHgyZSwgMHg1MywgMHg2YSwgMHhkZSwgMHg4NSwgMHhiNSwgMHg2ZiwKLQkweDMzLCAweDdjLCAweDM5LCAweDZhLCAweGUzLCAweDlhLCAweDE2LCAweGFhLCAweDJkLCAweGEwLCAweDMxLCAweGE0LAotCTB4ZWYsIDB4NTIsIDB4MTIsIDB4ZmYsIDB4MDYsIDB4ZjMsIDB4NmYsIDB4ZTYsIDB4ZmQsIDB4M2MsIDB4OGYsIDB4ZTcsCi0JMHg2NSwgMHhmYiwgMHg0YSwgMHhiYywgMHgyYiwgMHg5OSwgMHhkNCwgMHg3ZSwgMHgzMSwgMHg2MywgMHg2NSwgMHg4YywKLQkweGM3LCAweDUzLCAweGM2LCAweGVkLCAweGQ0LCAweDA0LCAweGI0LCAweDdmLCAweDU0LCAweDEyLCAweDNjLCAweGNiLAotCTB4ZDUsIDB4NzMsIDB4NjksIDB4YTksIDB4OWIsIDB4MGIsIDB4ZWYsIDB4ODcsIDB4ZmEsIDB4ZjMsIDB4ZTEsIDB4MzcsCi0JMHgyNywgMHhmOSwgMHg1MiwgMHhmZCwgMHhmNywgMHgzMiwgMHhlYSwgMHg5YiwgMHg3MCwgMHhmNSwgMHg3ZCwgMHhjYSwKLQkweDQ0LCAweGY1LCAweDQxLCAweGI5LCAweGFmLCAweGI0LCAweDU1LCAweDdmLCAweDJiLCAweDEzLCAweDkzLCAweGZiLAotCTB4YWEsIDB4NmYsIDB4MjgsIDB4OWUsIDB4ZTYsIDB4ZDUsIDB4NzcsIDB4M2UsIDB4NTEsIDB4YmQsIDB4NjYsIDB4NzEsCi0JMHhkNSwgMHhjNywgMHhkYSwgMHhmNywgMHgzZSwgMHg3NiwgMHhkZCwgMHhiNywgMHgxZiwgMHg1MSwgMHg5OSwgMHg1OCwKLQkweGZjLCAweDY1LCAweGRmLCAweGZjLCAweDNjLCAweDJjLCAweGZjLCAweGVlLCAweGUzLCAweDI1LCAweDc3LCAweDVhLAotCTB4MWUsIDB4MmIsIDB4N2IsIDB4ZGUsIDB4MWQsIDB4MmUsIDB4YjEsIDB4ZDQsIDB4MTYsIDB4MzksIDB4MWYsIDB4Y2YsCi0JMHgwYywgMHg3ZSwgMHhjZiwgMHg2OSwgMHgwZiwgMHg1NSwgMHg2NiwgMHgxYiwgMHhhMSwgMHhhZiwgMHgxYiwgMHg5NSwKLQkweDJkLCAweDYxLCAweDdlLCAweDcxLCAweDk2LCAweDdiLCAweDNlLCAweDgyLCAweDM5LCAweGRhLCAweGU2LCAweDI1LAotCTB4ZjksIDB4NTQsIDB4MWIsIDB4ZTMsIDB4NGMsIDB4NzcsIDB4YzAsIDB4NzcsIDB4ZmIsIDB4YjgsIDB4ZWIsIDB4ZWIsCi0JMHhlNSwgMHhjZiwgMHgyZCwgMHhlZCwgMHg5NiwgMHhjZiwgMHg1NSwgMHg2MywgMHhhMSwgMHhjYSwgMHgwYywgMHhlZiwKLQkweGQ3LCAweGQ5LCAweDIzLCAweDY1LCAweDQ5LCAweGEyLCAweDFlLCAweGZiLCAweDg3LCAweGJjLCAweDI0LCAweGI2LAotCTB4Y2IsIDB4ZDMsIDB4YzcsIDB4N2YsIDB4ZWUsIDB4NWQsIDB4NzIsIDB4ZjAsIDB4MWUsIDB4YmEsIDB4ZTYsIDB4YmMsCi0JMHgxYiwgMHhjNCwgMHhkMiwgMHhlMCwgMHgzNywgMHgxZiwgMHg2NSwgMHhiZCwgMHhlZCwgMHg5MCwgMHgwMywgMHhkOCwKLQkweDZkLCAweGVjLCAweDM5LCAweGZhLCAweDc1LCAweDk3LCAweGI0LCAweGRlLCAweDMyLCAweDhlLCAweDVlLCAweDIzLAotCTB4OTcsIDB4NTYsIDB4ZWYsIDB4ZTQsIDB4YmUsIDB4MGUsIDB4ZDksIDB4YjYsIDB4N2MsIDB4ZmUsIDB4YWIsIDB4ZDgsCi0JMHhmMywgMHg0MSwgMHgwOSwgMHg3ZiwgMHgwMSwgMHg3NiwgMHhlMiwgMHgwYiwgMHgwZCwgMHg0YSwgMHhiNywgMHhkMywKLQkweDllLCAweDAxLCAweGYzLCAweDAzLCAweGQ3LCAweDQ3LCAweGQwLCAweGNmLCAweGZlLCAweDM2LCAweDVmLCAweDY2LAotCTB4YTcsIDB4NDUsIDB4YmUsIDB4ZDgsIDB4MjQsIDB4OTksIDB4MzYsIDB4ZmEsIDB4OGQsIDB4ZjIsIDB4MmIsIDB4ZjQsCi0JMHg1NywgMHhmZCwgMHgzZSwgMHg0YiwgMHhjOSwgMHg5ZiwgMHg3MSwgMHg4ZiwgMHhkNywgMHgzOCwgMHg5NywgMHg2NCwKLQkweGUyLCAweDdmLCAweGM5LCAweDI3LCAweDY1LCAweDIyLCAweGMxLCAweGI5LCAweDNjLCAweDJjLCAweDg1LCAweGYyLAotCTB4YTMsIDB4ZjgsIDB4NzEsIDB4OWUsIDB4YTQsIDB4ZmIsIDB4NWYsIDB4ZTgsIDB4YjMsIDB4ZmIsIDB4MzEsIDB4MjksCi0JMHhjZSwgMHhhNCwgMHg2NSwgMHg2YSwgMHg3ZSwgMHg5MiwgMHhkZiwgMHhlNCwgMHg4ZSwgMHhkYywgMHhhMSwgMHhjZSwKLQkweGI0LCAweGVjLCAweDQ0LCAweDMyLCAweGQ0LCAweDY3LCAweDRkLCAweGYxLCAweGFlLCAweDgyLCAweDlhLCAweGNmLAotCTB4MjQsIDB4ZTYsIDB4ZjMsIDB4NGEsIDB4MWIsIDB4ZWYsIDB4NzgsIDB4NWYsIDB4ODIsIDB4ZmUsIDB4MzUsIDB4NGUsCi0JMHg1MCwgMHgwZSwgMHg2ZCwgMHhiMywgMHgyYiwgMHhjNCwgMHhmYywgMHg1ZSwgMHhmOCwgMHhhYiwgMHgyYywgMHhkYiwKLQkweDJiLCAweGUxLCAweGEzLCAweGFiLCAweDdhLCAweDFlLCAweGU1LCAweGZhLCAweDZjLCAweDU1LCAweGI1LCAweGZmLAotCTB4YWYsIDB4NjgsIDB4OGIsIDB4N2EsIDB4NDcsIDB4ODMsIDB4YjYsIDB4NDEsIDB4MWQsIDB4YjYsIDB4ZTUsIDB4M2MsCi0JMHg3NywgMHhjMywgMHg0ZiwgMHgwZSwgMHhlOCwgMHg4MiwgMHgxYywgMHgyNiwgMHhlYSwgMHhmOSwgMHhkZCwgMHhiYywKLQkweDgxLCAweGRmLCAweDExLCAweGUyLCAweDRkLCAweGYwLCAweDhiLCAweDNjLCAweDBlLCAweDZiLCAweDFlLCAweGZmLAotCTB4M2QsIDB4ZmEsIDB4MGYsIDB4ZDYsIDB4ZTAsIDB4MGUsIDB4OTQsIDB4OTksIDB4ZmEsIDB4MWIsIDB4YmMsIDB4NzcsCi0JMHhjMiwgMHg3NywgMHhmMiwgMHg5YywgMHhmNSwgMHhmNywgMHhiNywgMHhmOSwgMHhiMiwgMHg0NiwgMHg3YSwgMHgzNiwKLQkweGUzLCAweGY5LCAweDdiLCAweGRiLCAweGZkLCAweDc1LCAweGQ5LCAweDBiLCAweDdlLCAweGYxLCAweDFlLCAweDY1LAotCTB4OWYsIDB4YmEsIDB4OGYsIDB4OWYsIDB4MTksIDB4ZGYsIDB4MGIsIDB4ZDksIDB4MDksIDB4ZTYsIDB4ZDUsIDB4MDcsCi0JMHgxOSwgMHhlMywgMHgzOSwgMHgwMSwgMHhlYiwgMHhkNywgMHhmMywgMHhjNCwgMHhiNywgMHg3YiwgMHg2MSwgMHhmYSwKLQkweGZhLCAweDBlLCAweGU3LCAweDBhLCAweDRjLCAweGY4LCAweDQ1LCAweGY1LCAweGZkLCAweDBkLCAweGY0LCAweGU0LAotCTB4YmIsIDB4NTcsIDB4YmYsIDB4YmYsIDB4YjksIDB4ZjIsIDB4MWEsIDB4MGYsIDB4YjQsIDB4ZmIsIDB4MzYsIDB4Y2EsCi0JMHgwNCwgMHg0ZiwgMHg1YSwgMHg3NSwgMHg5YiwgMHhiZCwgMHhjMCwgMHhhNywgMHg4YywgMHg3ZiwgMHgyNiwgMHgxMywKLQkweDlmLCAweDkwLCAweDYwLCAweDFjLCAweGVmLCAweDM2LCAweGZhLCAweDc5LCAweDQzLCAweDAzLCAweDdkLCAweGYwLAotCTB4NjksIDB4ZDUsIDB4MWQsIDB4OTUsIDB4MDQsIDB4ZWYsIDB4YmMsIDB4MjQsIDB4NDMsIDB4N2IsIDB4ZDUsIDB4N2QsCi0JMHg4NSwgMHgxNywgMHhkNiwgMHg3ZCwgMHg0MywgMHg5NSwgMHg5MiwgMHhhNywgMHhkNywgMHg2NCwgMHg2NSwgMHhlNCwKLQkweDQ3LCAweDYyLCAweDhiLCAweDc1LCAweDM1LCAweDY1LCAweDg1LCAweGZkLCAweDRlLCAweDcyLCAweDllLCAweDg5LAotCTB4MDcsIDB4ZDQsIDB4M2MsIDB4NGQsIDB4ZjgsIDB4NGQsIDB4YmMsIDB4NWIsIDB4NjAsIDB4ODYsIDB4MmEsIDB4ZjMsCi0JMHg1YywgMHg3NywgMHhhNCwgMHg0YiwgMHg3YywgMHgwZSwgMHhjZSwgMHgzNywgMHg5NSwgMHg1ZSwgMHhjMSwgMHhiOCwKLQkweDJjLCAweGEzLCAweDZlLCAweGU0LCAweGZiLCAweGI0LCAweDNlLCAweGZmLCAweGJjLCAweGE3LCAweDlkLCAweDY3LAotCTB4ZjAsIDB4NzksIDB4OTQsIDB4OTUsIDB4OTcsIDB4MzYsIDB4YTcsIDB4ZWQsIDB4ZTMsIDB4NGEsIDB4MGUsIDB4MWUsCi0JMHgwNiwgMHhkZiwgMHhmZiwgMHgwNCwgMHg3NSwgMHgxZiwgMHg0NSwgMHhjYSwgMHgzOSwgMHhhNiwgMHg1NywgMHhkNywKLQkweDlkLCAweGZjLCAweGZlLCAweGIwLCAweDBjLCAweDQyLCAweDJlLCAweDk4LCAweDdmLCAweDU4LCAweDhhLCAweGVhLAotCTB4ZWUsIDB4MTAsIDB4ZDIsIDB4MzIsIDB4OWYsIDB4YTksIDB4ZWIsIDB4MWQsIDB4NmQsIDB4NGYsIDB4NDksIDB4Y2IsCi0JMHg1ZSwgMHhmZCwgMHhkZCwgMHg1NiwgMHgyMCwgMHg0ZiwgMHg3YiwgMHg3NCwgMHhiYiwgMHhmMSwgMHg1NSwgMHg1ZSwKLQkweDNkLCAweDcwLCAweDE5LCAweGRlLCAweDg4LCAweGFlLCAweGUyLCAweDBkLCAweDdmLCAweGFjLCAweDYyLCAweDdiLAotCTB4ODAsIDB4MzUsIDB4ZmMsIDB4MzksIDB4ZjgsIDB4NTgsIDB4YzMsIDB4OTcsIDB4ZjMsIDB4NDksIDB4ODksIDB4NDAsCi0JMHg4ZSwgMHhjMywgMHg2YiwgMHg3MiwgMHgwYywgMHhkYywgMHhlMywgMHhlZiwgMHg5OSwgMHgyOSwgMHg5ZSwgMHhkYiwKLQkweDI5LCAweDNlLCAweDUzLCAweDBlLCAweDI5LCAweGJmLCAweDVjLCAweGM3LCAweGZhLCAweGI1LCAweGJlLCAweGYxLAotCTB4OTcsIDB4YWMsIDB4ZjUsIDB4ODUsIDB4ZjYsIDB4MDAsIDB4M2YsIDB4ZmMsIDB4ZDMsIDB4ZjYsIDB4YzEsIDB4ZDcsCi0JMHhkYSwgMHhkNywgMHhmNiwgMHhjMSwgMHgzNSwgMHhiZiwgMHhhMSwgMHg3ZCwgMHhiMCwgMHg1MSwgMHgyZSwgMHhlYiwKLQkweDY1LCAweGNhLCAweDg0LCAweDNjLCAweDcxLCAweGJkLCAweDI4LCAweDRmLCAweDk0LCAweDIzLCAweGYyLCAweDkyLAotCTB4ZmEsIDB4YjQsIDB4OTEsIDB4YmUsIDB4NTMsIDB4ZTIsIDB4YTIsIDB4ZmEsIDB4M2UsIDB4NjIsIDB4MWEsIDB4M2EsCi0JMHhhOCwgMHgzZCwgMHg1NCwgMHg4NiwgMHg1ZiwgMHg1ZSwgMHg1YywgMHhiYSwgMHg0OSwgMHhjOSwgMHhmNCwgMHhkMywKLQkweDM1LCAweGVhLCAweGE1LCAweDJiLCAweGNkLCAweDdkLCAweGJkLCAweGNlLCAweGNkLCAweDZmLCAweGQwLCAweGI5LAotCTB4ZjksIDB4NTUsIDB4OWQsIDB4ZGIsIDB4YTYsIDB4ZmQsIDB4YTUsIDB4N2YsIDB4OGEsIDB4Y2UsIDB4OGQsIDB4ZDcsCi0JMHg5ZCwgMHg4NSwgMHgwNCwgMHhlNywgMHgyMCwgMHgxMiwgMHhjYSwgMHhmNiwgMHgzNiwgMHhjYiwgMHhhZSwgMHhkOSwKLQkweGI4LCAweDhjLCAweGNjLCAweGVjLCAweDk2LCAweDNmLCAweDlhLCAweDk5LCAweDU2LCAweGY3LCAweDgyLCAweGZlLAotCTB4Y2EsIDB4NGQsIDB4MjYsIDB4ZWUsIDB4MGYsIDB4NzksIDB4ZjIsIDB4NjEsIDB4ZjgsIDB4YmIsIDB4MTMsIDB4OWQsCi0JMHgwZCwgMHhiMiwgMHhlYiwgMHhmZCwgMHhlYSwgMHg3YywgMHhjZiwgMHhjYywgMHg4NiwgMHgzYSwgMHg4NCwgMHg5MSwKLQkweGU3LCAweDljLCAweDZiLCAweGJiLCAweDU2LCAweDg4LCAweDc3LCAweGM0LCAweDFhLCAweDY1LCAweDIyLCAweGRlLAotCTB4MjIsIDB4YmIsIDB4ODEsIDB4OWQsIDB4MGEsIDB4NTcsIDB4YjksIDB4ZWEsIDB4OWIsIDB4ZWQsIDB4OGMsIDB4M2EsCi0JMHgzZiwgMHhlOSwgMHhkZSwgMHhlZSwgMHg4ZiwgMHgwYiwgMHgzZSwgMHhiNCwgMHg5YSwgMHhmMiwgMHhlNywgMHhiNSwKLQkweDZlLCAweGY1LCAweGZkLCAweGYxLCAweDBiLCAweGE1LCAweDNmLCAweDZmLCAweDViLCAweDlmLCAweGU3LCAweGYzLAotCTB4N2YsIDB4NDIsIDB4OWQsIDB4MzgsIDB4NzgsIDB4NTUsIDB4N2YsIDB4ZGYsIDB4MjYsIDB4YWMsIDB4ZjgsIDB4NTksCi0JMHgyYywgMHg4ZiwgMHhhYiwgMHg3YiwgMHg0YywgMHgxNywgMHhjMywgMHhlNCwgMHg5NywgMHhmMiwgMHg5YiwgMHgxMiwKLQkweGQ5LCAweDMwLCAweDMwLCAweGNlLCAweDJjLCAweDkwLCAweGI0LCAweDQzLCAweDlmLCAweDRmLCAweGUzLCAweDRmLAotCTB4ZTgsIDB4ZmYsIDB4N2QsIDB4ZWEsIDB4M2MsIDB4NzUsIDB4MDUsIDB4YmMsIDB4ZjEsIDB4NTQsIDB4YmMsIDB4MzUsCi0JMHgxZiwgMHgyNywgMHhhZSwgMHg1ZiwgMHhiYiwgMHhiMywgMHg3YiwgMHgzOSwgMHhiZSwgMHhmNywgMHhiZiwgMHhmMSwKLQkweGQyLCAweGIxLCAweDdmLCAweDFkLCAweDlmLCAweGQxLCAweDNlLCAweGI4LCAweDNhLCAweGNiLCAweGRhLCAweGVjLAotCTB4ZmYsIDB4NTAsIDB4ZjgsIDB4ZGYsIDB4ZWMsIDB4NjcsIDB4NGIsIDB4YzQsIDB4NzYsIDB4ZjYsIDB4OTEsIDB4YjIsCi0JMHhmNCwgMHg2ZiwgMHg1NywgMHhiMSwgMHgyNiwgMHhmMiwgMHhiNywgMHg4MiwgMHg3NSwgMHgzYSwgMHg5NiwgMHgwOCwKLQkweGVjLCAweDc5LCAweGE4LCAweGViLCAweDZjLCAweGJkLCAweDFmLCAweGM4LCAweDNlLCAweDYyLCAweGVhLCAweDBlLAotCTB4YzQsIDB4ZGEsIDB4ZmYsIDB4YmQsIDB4NjEsIDB4NGMsIDB4MjUsIDB4MTMsIDB4YmEsIDB4YWIsIDB4MzQsIDB4MmQsCi0JMHhlMSwgMHhiOSwgMHgzMSwgMHg4OSwgMHgxYywgMHg2MywgMHhmYywgMHgzYSwgMHgyMywgMHhjNSwgMHhiOCwgMHgyNywKLQkweGY3LCAweGI5LCAweGViLCAweDdkLCAweDkzLCAweDJlLCAweDYzLCAweDIzLCAweGVkLCAweDBmLCAweGNiLCAweGQwLAotCTB4YzksIDB4NDcsIDB4MjUsIDB4M2EsIDB4YzcsIDB4NzcsIDB4ZWIsIDB4Y2UsIDB4MmUsIDB4YTAsIDB4OGYsIDB4YjYsCi0JMHg0OCwgMHgzOSwgMHhjZSwgMHgxOCwgMHg2ZSwgMHg1NCwgMHg5ZCwgMHgwNSwgMHg5ZiwgMHgxZiwgMHg1ZiwgMHg5MCwKLQkweDIyLCAweGIwLCAweDQyLCAweDVlLCAweGU5LCAweDE2LCAweGE0LCAweGFiLCAweGJlLCAweGM0LCAweGY0LCAweDc2LAotCTB4ZWUsIDB4MjksIDB4ZjgsIDB4OTgsIDB4YTEsIDB4ODksIDB4NzIsIDB4NTQsIDB4ZGQsIDB4YzksIDB4MzksIDB4MWYsCi0JMHg2NywgMHg1ZCwgMHhmOCwgMHhlZiwgMHg3MywgMHhjNCwgMHgxOSwgMHhkMCwgMHgxZCwgMHg2MywgMHgxMiwgMHg2MiwKLQkweDNlLCAweDNjLCAweGI3LCAweDg2LCAweDMzLCAweGE4LCAweDEzLCAweDg2LCAweGRjLCAweGI4LCAweDQ0LCAweDRlLAotCTB4ZjksIDB4NzMsIDB4ZTcsIDB4M2YsIDB4NTIsIDB4MzIsIDB4MTYsIDB4NzYsIDB4NGIsIDB4ZjgsIDB4MTgsIDB4OWYsCi0JMHhlYiwgMHhmZCwgMHgyMSwgMHg2MiwgMHg3NywgMHhkOCwgMHg4NiwgMHhiMywgMHg5ZiwgMHg0NSwgMHg3ZiwgMHg3YywKLQkweDk3LCAweGQxLCAweGRmLCAweGMyLCAweDIyLCAweDVmLCAweGY5LCAweGM3LCAweGZlLCAweGNmLCAweDA0LCAweGNhLAotCTB4ZmUsIDB4ZmYsIDB4MDcsIDB4M2IsIDB4OTcsIDB4MjIsIDB4OWEsIDB4YjAsIDB4NGUsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkweGNkLCAweDdjLCAweDBkLCAweDcwLCAweDViLCAweGQ3LCAweDk1LCAweGRlLCAweGMxLCAweDAzLCAweDQwLCAweDgyLAorCTB4MTAsIDB4NDUsIDB4M2QsIDB4NTIsIDB4MzAsIDB4MGQsIDB4M2IsIDB4NGMsIDB4ODIsIDB4NDcsIDB4M2MsIDB4OTIsCisJMHhiMCwgMHhjOSwgMHg2NCwgMHg5ZiwgMHg2NCwgMHg0NiwgMHg2NiwgMHgxMiwgMHhhYywgMHgwNSwgMHgwMywgMHhhNCwKKwkweDRjLCAweDI3LCAweGVhLCAweDkyLCAweGI2LCAweDE5LCAweDQ3LCAweDZkLCAweDM1LCAweDA5LCAweDE3LCAweDkyLAorCTB4MTIsIDB4ZGIsIDB4NGQsIDB4YTcsIDB4OWEsIDB4YzYsIDB4ZTksIDB4MmEsIDB4MWIsIDB4YzcsIDB4ODIsIDB4NDEsCisJMHhjYSwgMHg1MSwgMHg1MiwgMHg4YSwgMHg2MCwgMHgyNCwgMHg0YSwgMHhmMiwgMHg3NCwgMHhiMywgMHhiYiwgMHgwYywKKwkweDQ4LCAweDRhLCAweDhlLCAweDAzLCAweDA5LCAweDk2LCAweGVjLCAweDc1LCAweGRjLCAweGFkLCAweGIzLCAweDYyLAorCTB4NjgsIDB4YWQsIDB4ZWMsIDB4NGQsIDB4YjMsIDB4YWQsIDB4OWQsIDB4NDksIDB4M2EsIDB4OWEsIDB4YTksIDB4YjcsCisJMHg1NSwgMHg5NSwgMHhhNCwgMHhmOSwgMHg5OSwgMHhmZSwgMHhiOCwgMHg0OSwgMHhhNiwgMHg3NSwgMHhiYiwgMHhmMSwKKwkweGJlLCAweDdlLCAweGRmLCAweDdkLCAweGY3LCAweDExLCAweDIwLCAweGM1LCAweDI4LCAweGRlLCAweGVjLCAweDY0LAorCTB4NjYsIDB4MzksIDB4ODMsIDB4YjksIDB4ZWYsIDB4ZGUsIDB4NzcsIDB4N2YsIDB4Y2UsIDB4M2QsIDB4ZjcsIDB4ZmMsCisJMHg3YywgMHhlNywgMHhkZSwgMHhmYiwgMHg3OCwgMHg4NywgMHg0OCwgMHg1NCwgMHhmNCwgMHhkZiwgMHg0NiwgMHhmYywKKwkweGZhLCAweGZmLCAweGU5LCAweDNmLCAweGRiLCAweGIzLCAweGY1LCAweGRkLCAweGZkLCAweGVmLCAweDY2LCAweGRlLAorCTB4MzAsIDB4NDIsIDB4MjEsIDB4YTYsIDB4NDEsIDB4ZmMsIDB4NjIsIDB4ZjgsIDB4NmQsIDB4ZDUsIDB4Y2YsIDB4ZWIsCisJMHhmZCwgMHg5OSwgMHhmOCwgMHg2ZCwgMHgwYiwgMHg4OCwgMHg4YywgMHhmZiwgMHg0NCwgMHgyNCwgMHhiMCwgMHhlNiwKKwkweDVkLCAweDY0LCAweDlkLCAweGZhLCAweGFlLCAweGZiLCAweDRiLCAweDNhLCAweGQyLCAweDdmLCAweDA2LCAweDdlLAorCTB4ODksIDB4ZWIsIDB4NTcsIDB4NTksIDB4MTksIDB4ZjcsIDB4ZDcsIDB4ZmQsIDB4MGIsIDB4ZWEsIDB4ZTYsIDB4MWIsCisJMHhmNSwgMHg0ZiwgMHgyMiwgMHg0NiwgMHg1YSwgMHg0NiwgMHhiMiwgMHhiNiwgMHg0NCwgMHg4MiwgMHhlOSwgMHg5ZiwKKwkweDhmLCAweGVjLCAweGIxLCAweDQ1LCAweDMyLCAweDk1LCAweGRlLCAweDQ0LCAweDRlLCAweGRlLCAweDc0LCAweDBiLAorCTB4YjEsIDB4OTAsIDB4YjAsIDB4ZmMsIDB4ZWQsIDB4ZTksIDB4NWYsIDB4MWMsIDB4ZmMsIDB4ZmEsIDB4ZWQsIDB4ZDYsCisJMHhlYiwgMHg3MywgMHg0MSwgMHg4OSwgMHg5OCwgMHhlOSwgMHgzNywgMHhjNCwgMHhlYywgMHg5NiwgMHg0OCwgMHgwNywKKwkweGRhLCAweDdjLCAweGE5LCAweGU3LCAweDQ5LCAweDQzLCAweDVhLCAweGZjLCAweGJlLCAweGNjLCAweGYxLCAweDYwLAorCTB4NWEsIDB4NDYsIDB4ZjcsIDB4NGUsIDB4MWQsIDB4NzQsIDB4MGQsIDB4NWIsIDB4MGEsIDB4MzcsIDB4YTcsIDB4ZWQsCisJMHg0NCwgMHg1MSwgMHg5YSwgMHgwNywgMHgyNiwgMHhmYiwgMHg2ZiwgMHgxNywgMHhlNCwgMHg0NywgMHhmNywgMHg1NiwKKwkweDIyLCAweDkyLCAweGFkLCAweDE2LCAweDlhLCAweDBkLCAweGRiLCAweDQ2LCAweDFhLCAweDI5LCAweGJjLCAweDJkLAorCTB4MmQsIDB4OTEsIDB4ODYsIDB4ZjQsIDB4NmMsIDB4ZTMsIDB4MjUsIDB4OWIsIDB4ZTMsIDB4MGYsIDB4NjAsIDB4ZmMsCisJMHhiNywgMHg0OSwgMHhjOCwgMHg3NiwgMHhkZCwgMHg0OSwgMHg4YywgMHhiZiwgMHhhMywgMHhmMiwgMHhhNiwgMHhmYiwKKwkweDU4LCAweGM4LCAweDFiLCAweGRiLCAweDQ4LCAweDFmLCAweDA4LCAweDMyLCAweDBkLCAweGE0LCAweDMzLCAweDIzLAorCTB4OWQsIDB4MTUsIDB4OTUsIDB4NmYsIDB4ZjAsIDB4ZjIsIDB4ODMsIDB4M2EsIDB4MWYsIDB4ODksIDB4N2EsIDB4YjQsCisJMHg0YiwgMHgxMywgMHg2OCwgMHg4ZiwgMHg4NCwgMHhkMiwgMHhlOSwgMHgyNiwgMHhmNCwgMHgxMSwgMHgwOSwgMHhhNywKKwkweDk3LCAweDdlLCAweDdiLCAweDUxLCAweGQ1LCAweDNiLCAweGFjLCAweGViLCAweDNkLCAweDEwLCAweGY2LCAweGRhLAorCTB4NGQsIDB4OGUsIDB4NzQsIDB4NTcsIDB4OTgsIDB4Y2UsIDB4OGUsIDB4NzQsIDB4YTksIDB4ZjQsIDB4NGIsIDB4MjMsCisJMHg0OSwgMHg5NSwgMHhjZSwgMHhhOSwgMHg3YSwgMHg4MSwgMHhmNCwgMHhjMiwgMHg4OCwgMHhhZCwgMHhkMiwgMHhiNCwKKwkweDJlLCAweDFmLCAweDFlLCAweDQ5LCAweGE4LCAweDc0LCAweGE3LCAweDRlLCAweDQ3LCAweDc1LCAweDNhLCAweGE2LAorCTB4ZDMsIDB4NWQsIDB4M2EsIDB4ZGQsIDB4YWQsIDB4ZDMsIDB4NzEsIDB4OWQsIDB4ZWUsIDB4ZDUsIDB4ZmQsIDB4M2MsCisJMHhhMCwgMHhmMywgMHg5ZiwgMHhkMCwgMHhlOSwgMHg3ZSwgMHg5ZCwgMHgzZSwgMHhhYywgMHhkMywgMHgwMywgMHgzYSwKKwkweDdkLCAweDQ0LCAweGQzLCAweDU1LCAweGQwLCAweGU5LCAweDk0LCAweDJlLCAweDlmLCAweGQxLCAweDc0LCAweDNlLAorCTB4MDEsIDB4N2EsIDB4ZmUsIDB4NzEsIDB4YTMsIDB4OTYsIDB4NWIsIDB4Y2MsIDB4MzcsIDB4MjEsIDB4N2IsIDB4YTYsCisJMHgyMiwgMHg1MiwgMHgyYywgMHgwNSwgMHgyNSwgMHhhNywgMHhkNiwgMHhmMywgMHhlMywgMHg2MSwgMHg4OSwgMHg0NiwKKwkweDY0LCAweGEyLCAweDFhLCAweDkxLCAweDJiLCAweDRhLCAweDVjLCAweDdmLCAweGU0LCAweDdlLCAweGJkLCAweGM3LAorCTB4OTQsIDB4YTcsIDB4YWIsIDB4MzEsIDB4YjksIDB4NTAsIDB4OTUsIDB4YzAsIDB4NjgsIDB4NGYsIDB4OTMsIDB4MTgsCisJMHg0NywgMHg2ZiwgMHg5NiwgMHg4YywgMHgxOSwgMHg5MCwgMHhhMCwgMHhlMiwgMHg2YiwgMHg0MiwgMHhiMiwgMHg1MywKKwkweGVkLCAweGM4LCAweDViLCAweDcxLCAweDkxLCAweGM1LCAweGIwLCAweGI3LCAweDhlLCAweDExLCAweDA5LCAweDllLAorCTB4ZTAsIDB4YmEsIDB4M2MsIDB4MzcsIDB4NzIsIDB4NjksIDB4MzYsIDB4MmUsIDB4YTEsIDB4ZTksIDB4MDQsIDB4ZmEsCisJMHg2ZiwgMHg5NiwgMHhmMCwgMHgwOSwgMHhlOSwgMHgwOCwgMHg0YSwgMHg1NywgMHhmYywgMHg2MywgMHhhOCwgMHgzMSwKKwkweDU4LCAweDA5LCAweGM5LCAweDUwLCAweDI1LCAweDgwLCAweGI1LCAweDhhLCAweDQwLCAweDRlLCAweDlhLCAweGYxLAorCTB4MzMsIDB4ZjEsIDB4OGIsIDB4ZTEsIDB4MTcsIDB4YzcsIDB4ZWYsIDB4YWYsIDB4ZDAsIDB4NGYsIDB4ODcsIDB4ZTQsCisJMHgyYSwgMHhlYywgMHgxMywgMHhlMywgMHg5NiwgMHgzMCwgMHg3ZSwgMHhjOSwgMHgzMiwgMHhjNywgMHg4NSwgMHgzNCwKKwkweGM1LCAweGU1LCAweGViLCAweDNkLCAweDFlLCAweDRkLCAweDE3LCAweGFhLCAweDkxLCAweDQwLCAweGY2LCAweGE0LAorCTB4ZWMsIDB4Y2YsIDB4MzksIDB4OTIsIDB4MzAsIDB4ZWMsIDB4YTgsIDB4ZTQsIDB4Y2QsIDB4NDAsIDB4NjIsIDB4NmYsCisJMHhhYSwgMHg0ZCwgMHgwYSwgMHg2MywgMHg3OCwgMHg1NywgMHg5MiwgMHg4YywgMHg4MSwgMHhiZSwgMHhmMywgMHhhNiwKKwkweDhjLCAweDdiLCAweGVmLCAweDU4LCAweGY2LCAweDdmLCAweGExLCAweGFmLCAweDk2LCAweDQ5LCAweGMxLCAweGJkLAorCTB4NTAsIDB4ZmEsIDB4ZDcsIDB4NzgsIDB4NjYsIDB4NWYsIDB4MmYsIDB4ODYsIDB4M2MsIDB4OWEsIDB4ZGYsIDB4NDAsCisJMHg5ZSwgMHhlNSwgMHhlZSwgMHgyNiwgMHgyZiwgMHhjZiwgMHg2NywgMHhkNiwgMHhmNSwgMHhjNywgMHhmNCwgMHhlNywKKwkweGNhLCAweGIxLCAweDdiLCAweDMwLCAweDVmLCAweDhlLCAweGJmLCAweDMyLCAweDVmLCAweGQwLCAweGQxLCAweDFjLAorCTB4YzgsIDB4OWQsIDB4NGMsIDB4YzgsIDB4YTEsIDB4ZDIsIDB4MWQsIDB4OTIsIDB4NzUsIDB4NWMsIDB4NzcsIDB4OGYsCisJMHgyMywgMHgzMSwgMHg0MywgMHhiYSwgMHhjYywgMHgxYywgMHhkZSwgMHg5NiwgMHgyYiwgMHgxMiwgMHhjOCwgMHg5NiwKKwkweDdjLCAweDdlLCAweGIwLCAweGRmLCAweDEwLCAweGNhLCAweGRhLCAweDUxLCAweGJmLCAweDI1LCAweDMwLCAweDc4LAorCTB4MTIsIDB4YjQsIDB4YTcsIDB4YzksIDB4MTcsIDB4YzgsIDB4YWMsIDB4ZDMsIDB4MTUsIDB4ZGYsIDB4OGIsIDB4ZjEsCisJMHhlNiwgMHgyYiwgMHg1ZCwgMHhjZSwgMHhiMiwgMHg5OCwgMHhlOCwgMHhiMywgMHgwZCwgMHg3NSwgMHhjOCwgMHgyMywKKwkweGY2LCAweGM1LCAweDNlLCAweGQ5LCAweDVmLCAweDMzLCAweGRhLCAweGM2LCAweGYwLCAweDhlLCAweDM0LCAweGI5LAorCTB4NmUsIDB4ZDYsIDB4MzEsIDB4OTksIDB4OTcsIDB4MzksIDB4ZjAsIDB4NmQsIDB4OGUsIDB4N2MsIDB4OGIsIDB4NzYsCisJMHhjOCwgMHhhOSwgMHgwYSwgMHhjNywgMHg1OCwgMHg4ZiwgMHhlZSwgMHg1YiwgMHhmZiwgMHg5ZSwgMHhkMSwgMHgxZCwKKwkweDQ3LCAweGZmLCAweDMxLCAweGE0LCAweDFiLCAweDAyLCAweGQ5LCAweDYzLCAweDJlLCAweGM2LCAweDhmLCAweGUzLAorCTB4NzksIDB4YmQsIDB4MzksIDB4NWMsIDB4ZDEsIDB4MzIsIDB4MTgsIDB4MDcsIDB4ZWQsIDB4MzEsIDB4MzksIDB4YTcsCisJMHhlNCwgMHg3MCwgMHg4MywgMHgwNCwgMHgyMSwgMHg4NywgMHg1YywgMHhlMywgMHhkNiwgMHgxMywgMHhlZiwgMHg5MSwKKwkweDdjLCAweGNjLCAweDRhLCAweGQwLCAweDc2LCAweDc2LCAweDZlLCAweDZkLCAweGMyLCAweDFjLCAweGI1LCAweDE1LAorCTB4OWMsIDB4OGUsIDB4NDEsIDB4MGUsIDB4OTcsIDB4NWIsIDB4MGQsIDB4OTQsIDB4MTgsIDB4NjIsIDB4OTksIDB4ZmYsCisJMHg0OCwgMHgwYSwgMHg5MiwgMHg1YiwgMHhmOCwgMHhiZCwgMHg4MCwgMHg0NCwgMHgwZCwgMHhkNCwgMHhiYiwgMHgyNSwKKwkweGUwLCAweGYxLCAweDgwLCAweGZjLCAweGM5LCAweDgwLCAweDNmLCAweDAxLCAweGQxLCAweGY2LCAweDQxLCAweDNhLAorCTB4MmIsIDB4N2MsIDB4ZGYsIDB4OWIsIDB4MzAsIDB4ZDQsIDB4YmIsIDB4NDEsIDB4YmMsIDB4MGIsIDB4NDksIDB4NzIsCisJMHhhYiwgMHhmZiwgMHg3ZSwgMHgxMCwgMHhlZiwgMHg2ZiwgMHg5NiwgMHg3MSwgMHgxMywgMHhiNCwgMHg5NCwgMHg5ZSwKKwkweDM3LCAweGIyLCAweGEwLCAweGYxLCAweGNlLCAweDkwLCAweDlhLCAweDJiLCAweGVhLCAweDhlLCAweGQ3LCAweGY1LAorCTB4MzMsIDB4OGUsIDB4N2EsIDB4ZmYsIDB4MGEsIDB4NjMsIDB4ODEsIDB4ZGUsIDB4NTIsIDB4MDIsIDB4YjQsIDB4YjQsCisJMHg4MywgMHgxNiwgMHhkMiwgMHg1OCwgMHgzMCwgMHhiMiwgMHhkNSwgMHgxMCwgMHhmMiwgMHg5MywgMHg0NiwgMHhlZSwKKwkweGY0LCAweDYxLCAweDNjLCAweDhiLCAweDY5LCAweGE0LCAweDlmLCAweDY3LCAweDhhLCAweGY2LCAweGJiLCAweGViLAorCTB4ZGEsIDB4ZWYsIDB4NDYsIDB4N2IsIDB4OGUsIDB4YzEsIDB4ZjYsIDB4OWUsIDB4ZmMsIDB4MTcsIDB4OTQsIDB4MmMsCisJMHgyNiwgMHhhZSwgMHhjMywgMHg4ZiwgMHhlMCwgMHhhZiwgMHhjMSwgMHg4ZiwgMHg3ZiwgMHhhMywgMHhmOSwgMHhmMSwKKwkweGQ3LCAweGYyLCAweDliLCAweGU3LCAweGM3LCAweDdmLCAweGZhLCAweDBkLCAweGYxLCAweDQzLCAweDI0LCAweDdmLAorCTB4OGMsIDB4Y2YsIDB4MjEsIDB4MjksIDB4MjgsIDB4YmIsIDB4NDUsIDB4YmQsIDB4YTUsIDB4YmMsIDB4ZDMsIDB4NjYsCisJMHg5MSwgMHg0ZiwgMHg5NCwgMHg2MywgMHhlOCwgMHg0MCwgMHgzNSwgMHg4NCwgMHhmNCwgMHg0OSwgMHhhNCwgMHgxYiwKKwkweDAyLCAweGEzLCAweGM3LCAweGFlLCAweDYyLCAweGZkLCAweDVkLCAweDMxLCAweGI3LCAweGZhLCAweDdlLCAweGEzLAorCTB4MTAsIDB4MzcsIDB4YTUsIDB4NDMsIDB4Y2MsIDB4NzcsIDB4YzMsIDB4NjksIDB4YjcsIDB4NWIsIDB4NjYsIDB4NWUsCisJMHg3ZSwgMHg4MCwgMHhmNywgMHg2ZiwgMHgwNiwgMHg3YywgMHhmZiwgMHg5ZSwgMHg5ZCwgMHg2YSwgMHg3YSwgMHgyMywKKwkweGEzLCAweDllLCAweGMyLCAweGU0LCAweDY3LCAweGM2LCAweDQ4LCAweDg3LCAweDAyLCAweGI5LCAweDUyLCAweDYyLAorCTB4ZGMsIDB4NDgsIDB4YzcsIDB4NjAsIDB4YTcsIDB4OTgsIDB4MWYsIDB4MDgsIDB4NzgsIDB4MzQsIDB4ZjcsIDB4YTMsCisJMHhhZSwgMHg2ZiwgMHhiMywgMHg3YywgMHhkYSwgMHhmYiwgMHg0MSwgMHhmYiwgMHg1YSwgMHhkYiwgMHg5NSwgMHgwMSwKKwkweDJkLCAweGE0LCAweDgxLCAweDc0LCAweDE1LCAweDgyLCAweDlhLCAweGY3LCAweGU4LCAweGU3LCAweDgwLCAweGVhLAorCTB4MjcsIDB4OTgsIDB4MWUsIDB4MTAsIDB4ZmEsIDB4ZDAsIDB4ZmMsIDB4MTQsIDB4ZjUsIDB4ODAsIDB4ZWQsIDB4ZDgsCisJMHg5NywgMHg2NywgMHg5MywgMHhmMywgMHgxNSwgMHhiZiwgMHg4ZiwgMHg0MiwgMHg3ZCwgMHgxZiwgMHhhMCwgMHg0NywKKwkweDM2LCAweDE5LCAweDc2LCAweDE4LCAweDZiLCAweGNmLCAweGFlLCAweDBlLCAweGUzLCAweGRkLCAweDk3LCAweDI0LAorCTB4N2IsIDB4ZmEsIDB4NzYsIDB4MDMsIDB4NzMsIDB4NDAsIDB4YmYsIDB4ZTQsIDB4ZDEsIDB4MjgsIDB4NmMsIDB4MzYsCisJMHhmNSwgMHgyYywgMHgyMiwgMHhiOSwgMHgxOCwgMHhjYiwgMHgzZSwgMHhhMiwgMHhjNywgMHgwZCwgMHg0OSwgMHg0NiwKKwkweGU1LCAweGJmLCAweGQyLCAweDUyLCAweGEzLCAweGUzLCAweDc5LCAweDNkLCAweDlmLCAweDM0LCAweGU2LCAweDQzLAorCTB4MWEsIDB4ZmMsIDB4YjksIDB4YTQsIDB4ZWIsIDB4ZTYsIDB4ZTIsIDB4ZjMsIDB4OWEsIDB4YmMsIDB4MzAsIDB4NjEsCisJMHhlMywgMHgyMywgMHhkYSwgMHg4NywgMHhiMCwgMHhkZCwgMHg2NCwgMHhkZCwgMHhkYSwgMHg0ZCwgMHhhMiwgMHgwZCwKKwkweDc5LCAweDhmLCAweDNhLCAweDZiLCAweGZjLCAweDBhLCAweDdkLCAweGNhLCAweDIwLCAweGZhLCAweDI5LCAweGNlLAorCTB4MWEsIDB4OTIsIDB4NzMsIDB4ZTAsIDB4YWIsIDB4OWQsIDB4YjcsIDB4NjksIDB4NzksIDB4YWQsIDB4YzksIDB4NTIsCisJMHg3OCwgMHg1ZCwgMHg1OSwgMHgzYSwgMHg2OCwgMHg3OCwgMHhmNiwgMHgxYSwgMHhiZSwgMHgwNSwgMHhmZSwgMHg2NywKKwkweDYyLCAweGQ2LCAweDRhLCAweGY5LCAweGIyLCAweDU0LCAweDljLCAweDdhLCAweDJiLCAweGIyLCAweGU0LCAweGI3LAorCTB4OGYsIDB4NDAsIDB4NzYsIDB4ZmQsIDB4MzEsIDB4ZDYsIDB4ZDIsIDB4ZWMsIDB4ZDcsIDB4MDEsIDB4OGQsIDB4YTUsCisJMHhhYywgMHhjNiwgMHgyOCwgMHgxYywgMHhjNywgMHhmMywgMHgwZCwgMHg3MywgMHhhYiwgMHg3YywgMHhjMywgMHg2MSwKKwkweGI0LCAweDk1LCAweDQwLCAweGFlLCAweGE3LCAweDU5LCAweGY2LCAweGNkLCAweGZhLCAweDdkLCAweDFjLCAweDU2LAorCTB4MzIsIDB4YmIsIDB4NzcsIDB4Y2EsIDB4MzIsIDB4ODcsIDB4ODIsIDB4OTIsIDB4MTksIDB4OWEsIDB4MTksIDB4OTAsCisJMHhjMSwgMHg2YSwgMHgwNywgMHhkNiwgMHhmNCwgMHgwZCwgMHgxNywgMHhiZSwgMHhmMywgMHhkZCwgMHg2MSwgMHhiMSwKKwkweDYxLCAweDE3LCAweDMxLCAweGU3LCAweDdlLCAweGYwLCAweGI4LCAweDFhLCAweDE2LCAweDIzLCAweGVkLCAweDIwLAorCTB4YWQsIDB4YzcsIDB4NTgsIDB4YTEsIDB4ZDAsIDB4ZDAsIDB4YWEsIDB4N2MsIDB4MDMsIDB4ZWEsIDB4YTAsIDB4ZWYsCisJMHhmZSwgMHhiNSwgMHhmNSwgMHgyMCwgMHg5ZiwgMHhlMCwgMHg2ZCwgMHhkNiwgMHg3OSwgMHhkMywgMHg4NSwgMHgxZiwKKwkweGQ2LCAweDNlLCAweDhiLCAweGE1LCAweGI0LCAweDEzLCAweGJlLCAweDhkLCAweGY4LCAweDEwLCAweGY0LCAweDViLAorCTB4ZTksIDB4NDIsIDB4YzEsIDB4NDgsIDB4ZWYsIDB4NDcsIDB4MWYsIDB4YTIsIDB4ZTQsIDB4YjQsIDB4NTgsIDB4N2QsCisJMHhkYSwgMHhkNywgMHg3YiwgMHg1NSwgMHhiZSwgMHhhMywgMHg5ZiwgMHhiMiwgMHgzNywgMHgwNywgMHg0YywgMHhjMCwKKwkweDM5LCAweDJkLCAweDI4LCAweDVkLCAweGNmLCAweDk5LCAweDMxLCAweDk5LCAweDJjLCAweDI5LCAweDRjLCAweDIzLAorCTB4YzksIDB4Y2EsIDB4MWYsIDB4NDksIDB4ZWUsIDB4YjQsIDB4YzgsIDB4MzcsIDB4YTcsIDB4NTgsIDB4ZWYsIDB4MDUsCisJMHg1ZCwgMHhlZiwgMHg3OSwgMHhkNCwgMHg0YiwgMHgyNiwgMHgwNiwgMHgwMywgMHgxNiwgMHhmYywgMHg4MCwgMHgwNSwKKwkweDM1LCAweGU5LCAweDRkLCAweDIwLCAweDM1LCAweDg3LCAweGYxLCAweDFiLCAweGE0LCAweDkzLCAweDQxLCAweDNkLAorCTB4MGYsIDB4MDMsIDB4M2QsIDB4MGYsIDB4N2UsIDB4ODgsIDB4ZGMsIDB4NTMsIDB4NmEsIDB4ODQsIDB4M2QsIDB4ZjksCisJMHgyZiwgMHhhMCwgMHgzNSwgMHgyNiwgMHg1ZiwgMHhjMCwgMHgzYywgMHgyZSwgMHg0ZCwgMHgxMSwgMHg2NywgMHhiZCwKKwkweDIwLCAweDhiLCAweDUzLCAweGM0LCAweDVkLCAweGNmLCAweGNiLCAweGU0LCAweDU0LCAweGQyLCAweGY5LCAweDI2LAorCTB4ZjgsIDB4N2MsIDB4NGEsIDB4MzgsIDB4OTcsIDB4NWUsIDB4MDcsIDB4MjksIDB4MzAsIDB4YTAsIDB4OTUsIDB4NzgsCisJMHgxYywgMHhmNiwgMHhhYywgMHg2NywgMHhhYiwgMHhkNywgMHg1ZiwgMHg5NywgMHhlZSwgMHhjZiwgMHhhZSwgMHg1OCwKKwkweDcyLCAweGM1LCAweGE0LCAweDdkLCAweGJhLCAweDU2LCAweGM3LCAweGIzLCAweDVhLCAweGM3LCAweDQ3LCAweDlkLAorCTB4MGUsIDB4MzEsIDB4YTAsIDB4ZDcsIDB4OTksIDB4YjEsIDB4MDIsIDB4YmMsIDB4MWYsIDB4ZjUsIDB4ZmEsIDB4N2YsCisJMHgxYiwgMHgzNSwgMHhmYywgMHgzMywgMHgwMCwgMHhhYywgMHg2YSwgMHgyOSwgMHg3ZiwgMHhmNywgMHhiNywgMHhkMywKKwkweGYxLCAweDdhLCAweGRkLCAweGU2LCAweGY4LCAweDJkLCAweDY4LCAweDEzLCAweDQyLCAweDdhLCAweDdkLCAweGJkLAorCTB4NDYsIDB4MWYsIDB4NzUsIDB4NmQsIDB4MDcsIDB4YTgsIDB4MTcsIDB4NjgsIDB4ZjMsIDB4MDcsIDB4ZTAsIDB4MDUsCisJMHhmOSwgMHhmZiwgMHg1NiwgMHhmNCwgMHhiOSwgMHgzNywgMHhmOCwgMHg5NiwgMHhmNCwgMHg3OSwgMHhlYywgMHg3YSwKKwkweGZhLCAweDVjLCAweGFmLCAweGNiLCAweDY3LCAweGM5LCAweDBiLCAweDhjLCAweDJkLCAweDMzLCAweDllLCAweDZjLAorCTB4NzUsIDB4ODEsIDB4ZDcsIDB4MDksIDB4YzgsIDB4MjksIDB4NjgsIDB4MjgsIDB4ZmQsIDB4OGQsIDB4OWIsIDB4MDksCisJMHg3OSwgMHg3OCwgMHhjZSwgMHg5MywgMHgyNywgMHhkNiwgMHhmMywgMHhlYiwgMHg3OCwgMHhiNiwgMHg3NywgMHhiMCwKKwkweDdhLCAweDQ1LCAweGQ5LCAweGQ5LCAweDczLCAweGNhLCAweGNlLCAweDVhLCAweDg3LCAweDBiLCAweDQyLCAweDc5LAorCTB4YmIsIDB4MmQsIDB4NDgsIDB4YmUsIDB4M2YsIDB4ZWQsIDB4N2MsIDB4MTYsIDB4MzQsIDB4NWEsIDB4ODksIDB4ODQsCisJMHhkMSwgMHg1NSwgMHgzMCwgMHg4YywgMHhjZiwgMHhjYSwgMHhmZSwgMHhmOSwgMHg4NywgMHg2NSwgMHg3ZiwgMHg4OSwKKwkweDdkLCAweGE0LCAweGYxLCAweGRlLCAweDQ2LCAweDU5LCAweDEzLCAweDZjLCAweDJkLCAweDZkLCAweGZhLCAweDFiLAorCTB4MDEsIDB4NmYsIDB4MmMsIDB4MDMsIDB4ZmUsIDB4NmIsIDB4MjksIDB4NzAsIDB4NGYsIDB4ZjUsIDB4NjIsIDB4MjAsCisJMHgzYiwgMHg0ZiwgMHhkZCwgMHg0NSwgMHg3OSwgMHhiNSwgMHhkZSwgMHhlNiwgMHhmYiwgMHhmNiwgMHhiZSwgMHg2NiwKKwkweGZmLCAweDA2LCAweDRiLCAweDkzLCAweGM0LCAweDgwLCAweDQ2LCAweGQ2LCAweGUxLCAweDlhLCAweDUxLCAweDM3LAorCTB4MmYsIDB4OTgsIDB4ZGUsIDB4OWMsIDB4M2YsIDB4MDksIDB4M2UsIDB4NTEsIDB4YWYsIDB4YzksIDB4MzcsIDB4ZjgsCisJMHhjMCwgMHgxMCwgMHg3NSwgMHg5NiwgMHhjZiwgMHhlMiwgMHgwNiwgMHhkMywgMHhkNCwgMHgzYiwgMHgwOSwgMHgwNSwKKwkweDQxLCAweDQ2LCAweDJlLCAweGM2LCAweDNhLCAweDc3LCAweDgwLCAweGNlLCAweGI1LCAweDNhLCAweGNkLCAweDc1LAorCTB4MTQsIDB4NmQsIDB4NDMsIDB4NTgsIDB4MzYsIDB4ODAsIDB4ZTcsIDB4NGUsIDB4MTksIDB4OWYsIDB4Y2YsIDB4NjAsCisJMHhjYywgMHgzYiwgMHg3NSwgMHhkZiwgMHhhYiwgMHg3YywgMHgwYywgMHhmYSwgMHg0OCwgMHhlOCwgMHhmNSwgMHhkOCwKKwkweGUwLCAweGRiLCAweDQxLCAweDk0LCAweDM5LCAweGJhLCAweGFjLCAweGExLCAweGFlLCAweGNjLCAweDVmLCAweGI3LAorCTB4OGYsIDB4NjIsIDB4N2MsIDB4ZmEsIDB4OGEsIDB4NjEsIDB4OGQsIDB4N2YsIDB4NWMsIDB4MzcsIDB4YzcsIDB4ZjUsCisJMHhlZSwgMHhmYiwgMHg4NywgMHg0MiwgMHhkZCwgMHhiOCwgMHg1MCwgMHgyYSwgMHg5OCwgMHg0MSwgMHgyNSwgMHhhMywKKwkweDJmLCAweGZjLCAweDRlLCAweDRkLCAweDQ2LCAweDgxLCAweDk3LCAweDU1LCAweDJmLCAweGU0LCAweDMxLCAweDY5LAorCTB4NjksIDB4MDYsIDB4NGYsIDB4MDcsIDB4NDEsIDB4MmIsIDB4NzgsIDB4ZDcsIDB4MWUsIDB4MDAsIDB4ZmYsIDB4OWEsCisJMHgyNSwgMHg1ZiwgMHg0ZCwgMHhlYiwgMHg3NywgMHgyYywgMHgwZiwgMHhjOSwgMHg2OCwgMHhjYywgMHhmNywgMHg0NywKKwkweGI3LCAweDk5LCAweDFlLCAweGU2LCAweDQ1LCAweDlkLCAweGQyLCAweDhmLCAweDgzLCAweDllLCAweDBlLCAweDk4LAorCTB4OTIsIDB4M2YsIDB4MzksIDB4MDgsIDB4NTksIDB4MjMsIDB4MjYsIDB4NmIsIDB4ODAsIDB4YWMsIDB4YzUsIDB4OTQsCisJMHhhZCwgMHgzNywgMHg2YywgMHhkNiwgMHhjNywgMHhiYiwgMHhkMywgMHhiZiwgMHgxNywgMHhmNCwgMHhkYSwgMHhiMCwKKwkweDllLCAweGRmLCAweGM2LCAweDFmLCAweGJiLCAweDZkLCAweGE1LCAweGVkLCAweGE4LCAweDYzLCAweDQ4LCAweDUwLAorCTB4OGQsIDB4OGYsIDB4YjIsIDB4ZDMsIDB4YWIsIDB4YzcsIDB4MzcsIDB4ZGEsIDB4ZmQsIDB4ZjEsIDB4MWYsIDB4ZDEsCisJMHg3ZCwgMHhiNSwgMHhkNSwgMHhmNSwgMHgxNSwgMHhiYiwgMHhjZSwgMHhmOCwgMHg3OCwgMHg3NywgMHhmYSwgMHhhMywKKwkweDliLCAweGJkLCAweDM2LCAweGIxLCAweGJhLCAweDM2LCAweGVkLCAweDZiLCAweGRhLCAweGIwLCAweGJlLCAweDNmLAorCTB4MDYsIDB4ZGUsIDB4OWQsIDB4YmUsIDB4YWIsIDB4ZDksIDB4NmIsIDB4YzMsIDB4N2EsIDB4MGQsIDB4ZjAsIDB4NmQsCisJMHg3YywgMHg0NywgMHhkOSwgMHhkZiwgMHg1ZiwgMHgyNywgMHhmYiwgMHhmYiwgMHgyMSwgMHhmYiwgMHhiZSwgMHg0YywKKwkweGFkLCAweGM1LCAweGM5LCAweDdlLCAweGJjLCAweGMzLCAweDM4LCAweDg3LCAweGQ4LCAweGFhLCAweDE2LCAweGQ3LAorCTB4ODQsIDB4NGUsIDB4MzQsIDB4MDMsIDB4YjcsIDB4YjQsIDB4MzAsIDB4OTYsIDB4ZDEsIDB4YjgsIDB4OTgsIDB4YjEsCisJMHgwZCwgMHg3MSwgMHhiMCwgMHhkOCwgMHgyMSwgMHhlOSwgMHg4MiwgMHg4ZCwgMHhlYSwgMHg4YSwgMHhlZiwgMHhhMywKKwkweGMyLCAweDU1LCAweDYyLCAweDBhLCAweDJmLCAweDY3LCAweGY0LCAweDE4LCAweDhjLCAweDZiLCAweGM4LCAweDc3LAorCTB4ZTYsIDB4NzMsIDB4MmIsIDB4NzEsIDB4NGUsIDB4MDcsIDB4ZTIsIDB4MjAsIDB4ZTIsIDB4NWQsIDB4ZTIsIDB4MjUsCisJMHg5ZiwgMHg3ZSwgMHg5ZiwgMHg5ZSwgMHgwMywgMHg0NiwgMHg0ZCwgMHgyNywgMHgzMiwgMHhjNiwgMHg2MCwgMHg3NSwKKwkweGQwLCAweGYwLCAweDc0LCAweDgyLCAweGVmLCAweDBmLCAweDY4LCAweDlmLCAweGI2LCAweDk2LCAweGRlLCAweGI3LAorCTB4YWYsIDB4YTEsIDB4OTcsIDB4YjgsIDB4MmEsIDB4MjEsIDB4MTMsIDB4OTAsIDB4OTEsIDB4ZDAsIDB4MDksIDB4ZGEsCisJMHhkOCwgMHhlNywgMHg0NiwgMHgxNiwgMHg2NywgMHg4OSwgMHgxZiwgMHhmYSwgMHhjMCwgMHgxNywgMHhkMiwgMHg0YiwKKwkweGZlLCAweDUxLCAweDk3LCAweDViLCAweDYwLCAweDFmLCAweGJhLCAweDUyLCAweDY1LCAweGQ0LCAweDY3LCAweDdjLAorCTB4M2QsIDB4YWUsIDB4ZTIsIDB4YjIsIDB4NjYsIDB4YTQsIDB4MDgsIDB4OWUsIDB4NDAsIDB4ZWIsIDB4MzgsIDB4NjgsCisJMHgxZCwgMHhkNywgMHgzMSwgMHhkOSwgMHgzZSwgMHhkOCwgMHhlZiwgMHhkMCwgMHhiNCwgMHg0ZiwgMHhlYiwgMHg4ZCwKKwkweDIxLCAweDdmLCAweDZkLCAweDU2LCAweGQzLCAweDVlLCAweGVmLCAweDc3LCAweDNjLCAweGZjLCAweDc1LCAweDRmLAorCTB4MGYsIDB4NjUsIDB4YzYsIDB4MmEsIDB4MTAsIDB4YjMsIDB4OGQsIDB4MmIsIDB4ZjksIDB4MDAsIDB4ZjYsIDB4MzMsCisJMHhjNCwgMHhkMywgMHhhNSwgMHgxNiwgMHhkZiwgMHhmZiwgMHg3MiwgMHgzZSwgMHhmNCwgMHhmZiwgMHhkNCwgMHg3OSwKKwkweDdmLCAweDBlLCAweGNkLCAweGQyLCAweDc5LCAweDgyLCAweDczLCAweDU4LCAweGExLCAweDNmLCAweGM2LCAweGRkLAorCTB4OGQsIDB4ZmQsIDB4YjAsIDB4OWIsIDB4NzksIDB4NDUsIDB4ZWIsIDB4NGUsIDB4ZDksIDB4NWIsIDB4N2EsIDB4YTcsCisJMHhhNiwgMHhiZiwgMHgxOSwgMHhmNCwgMHg4ZiwgMHg0MiwgMHhiNiwgMHg2YiwgMHgzNiwgMHgyMywgMHg1ZiwgMHgxOSwKKwkweDQzLCAweGRlLCAweGMzLCAweDYyLCAweGU0LCAweDcxLCAweGJlLCAweDQyLCAweGZiLCAweGExLCAweGU3LCAweDEzLAorCTB4ZTUsIDB4N2MsIDB4ZDYsIDB4ZGEsIDB4OTYsIDB4ZjUsIDB4ZjgsIDB4ZmEsIDB4OGUsIDB4MzUsIDB4N2MsIDB4MTUsCisJMHhjZCwgMHhkNywgMHg4OCwgMHgzNCwgMHg5YywgMHg1MCwgMHg3MSwgMHgyZCwgMHhmYSwgMHgyNSwgMHhhZiwgMHhlOSwKKwkweGJmLCAweDllLCAweDFiLCAweDk5LCAweDljLCAweDk1LCAweGJlLCAweGIwLCAweDkwLCAweGJlLCAweDM4LCAweGNiLAorCTB4ZmEsIDB4MWIsIDB4YTQsIDB4Y2IsIDB4YjksIDB4ODgsIDB4NzksIDB4ZTcsIDB4YjEsIDB4ZGUsIDB4YzYsIDB4YjQsCisJMHgyNywgMHhkZiwgMHhlNCwgMHg2ZiwgMHhiZSwgMHgxMiwgMHg0NSwgMHgyYywgMHhjZCwgMHhiMSwgMHhjOSwgMHgzMywKKwkweGQyLCAweDZmLCAweDJhLCAweDdhLCAweDU2LCAweGY4LCAweDBkLCAweGZhLCAweDNlLCAweDU2LCAweDU5LCAweGNiLAorCTB4ZGIsIDB4N2EsIDB4M2IsIDB4ZTMsIDB4YzcsIDB4ZWMsIDB4ZGYsIDB4MzUsIDB4M2QsIDB4YmQsIDB4NTgsIDB4MmYsCisJMHg2NiwgMHg2ZiwgMHg4NiwgMHg3ZCwgMHgwYywgMHhkMSwgMHgzNiwgMHg4MiwgMHhmNywgMHhkYywgMHg1ZiwgMHg1OSwKKwkweDBhLCAweDExLCAweDgzLCAweDVmLCAweDI4LCAweDg1LCAweDk1LCAweGNkLCAweGNiLCAweDNhLCAweDJkLCAweDVhLAorCTB4M2YsIDB4NmUsIDB4ZDMsIDB4YmUsIDB4MjMsIDB4YWMsIDB4NmMsIDB4YjYsIDB4MTgsIDB4MjYsIDB4NzEsIDB4MDksCisJMHhjYSwgMHg5MCwgMHg5ZiwgMHg2NywgMHhkZSwgMHhhNywgMHhlMywgMHhkZSwgMHg1ZCwgMHg2MSwgMHhmYiwgMHgwZiwKKwkweDQzLCAweGJlLCAweDRkLCAweGE4LCAweGQxLCAweDU1LCAweDFmLCAweDkzLCAweGJiLCAweGMwLCAweDcyLCAweGVmLAorCTB4ODQsIDB4ZGMsIDB4ZGUsIDB4ODksIDB4YjgsIDB4M2IsIDB4MjEsIDB4ZjksIDB4MTQsIDB4ZjUsIDB4NjgsIDB4NDAsCisJMHhjNSwgMHgyNiwgMHg4NiwgMHhiZCwgMHgwZiwgMHg2NSwgMHg0ZCwgMHgyOCwgMHg4MywgMHgxMywgMHgzMywgMHgzMSwKKwkweDdmLCAweGZiLCAweDc3LCAweDY1LCAweDFjLCAweDMyLCAweDllLCAweDRmLCAweGY1LCAweDgyLCAweDBlLCAweGRhLAorCTB4NjAsIDB4NjAsIDB4MWMsIDB4M2IsIDB4YzUsIDB4YjgsIDB4MWQsIDB4N2YsIDB4ZmQsIDB4NjEsIDB4NmYsIDB4NWUsCisJMHhiYiwgMHg5MCwgMHg0NywgMHgwYywgMHg5ZiwgMHhlYSwgMHhkNCwgMHg3NSwgMHgzNiwgMHgwOCwgMHhmNywgMHg3ZiwKKwkweGYyLCAweDY2LCAweDBiLCAweGQyLCAweGVlLCAweDM1LCAweDc1LCAweGRmLCAweDhmLCAweGZjLCAweDdiLCAweDc1LAorCTB4ZmYsIDB4MDUsIDB4YmMsIDB4ZGYsIDB4ODYsIDB4ZGYsIDB4MjAsIDB4Y2EsIDB4NmUsIDB4NDcsIDB4OTksIDB4ODMsCisJMHhiMiwgMHhmNywgMHgyMCwgMHhmZiwgMHg3ZSwgMHhiZCwgMHgxZiwgMHhlMCwgMHhiNywgMHg2OSwgMHg0MSwgMHhmZSwKKwkweDMxLCAweGJjLCAweDg3LCAweGFkLCAweDMwLCAweDVmLCAweGM2LCAweGZiLCAweGY3LCAweGUyLCAweGY3LCAweGVlLAorCTB4MzUsIDB4NzUsIDB4ZGEsIDB4ZDYsIDB4ZTQsIDB4M2YsIDB4YjUsIDB4YzIsIDB4ODMsIDB4MGIsIDB4YTUsIDB4OWYsCisJMHg2OSwgMHhiYiwgMHg0NiwgMHg3OSwgMHg2NiwgMHhmZSwgMHg5NCwgMHg3ZSwgMHhmNywgMHhjZSwgMHhkMCwgMHhlYSwKKwkweGYyLCAweDFkLCAweDdlLCAweGJlLCAweDZlLCAweDBkLCAweDNiLCAweGIxLCAweDg2LCAweDNlLCAweGM2LCAweDdjLAorCTB4YmIsIDB4ZjYsIDB4NWQsIDB4NmYsIDB4ZjcsIDB4ZTIsIDB4ZjQsIDB4OTIsIDB4ZGYsIDB4OGUsIDB4N2UsIDB4ZWQsCisJMHhjZSwgMHgzNSwgMHg2MywgMHgzYywgMHhkZiwgMHg1MCwgMHhjYiwgMHgzNywgMHgwNywgMHg4NiwgMHg0ZSwgMHhiMiwKKwkweGVjLCAweDcyLCAweGMzLCAweGVhLCAweDNhLCAweDZmLCAweGQ2LCAweGU1LCAweDM3LCAweDA2LCAweDg2LCAweDk0LAorCTB4OGYsIDB4YmIsIDB4YWIsIDB4NzEsIDB4NzUsIDB4OWQsIDB4NjQsIDB4NjMsIDB4NmQsIDB4MWUsIDB4MzUsIDB4NWIsCisJMHgxOCwgMHg0YSwgMHgyZiwgMHg1MywgMHg4ZSwgMHhhMSwgMHgwYiwgMHhkZiwgMHgxYSwgMHhjOSwgMHg0ZSwgMHhiOSwKKwkweGVlLCAweDg0LCAweGIzLCAweDE0LCAweDBmLCAweDBhLCAweDdkLCAweDEwLCAweGIxLCAweDJhLCAweGNiLCAweDVmLAorCTB4NDYsIDB4MzksIDB4YjAsIDB4NGMsIDB4NzUsIDB4NTQsIDB4NjgsIDB4OTMsIDB4ZDYsIDB4YzcsIDB4YTQsIDB4MDksCisJMHg4ZCwgMHg0OSwgMHg1NSwgMHgzNiwgMHg5NCwgMHg1NSwgMHgxOCwgMHhmMiwgMHhmOSwgMHgxMSwgMHg2MCwgMHgxZSwKKwkweGZkLCAweGZjLCAweDAyLCAweDllLCAweDEzLCAweGY1LCAweGI4LCAweDE3LCAweGZkLCAweDJlLCAweDhkLCAweDY0LAorCTB4NjcsIDB4ZTksIDB4ZjMsIDB4MmUsIDB4OGUsIDB4ZWMsIDB4OTksIDB4YTUsIDB4Y2UsIDB4NWYsIDB4ODIsIDB4Y2UsCisJMHgwNywgMHg2NCwgMHg1MiwgMHhmOSwgMHgzZiwgMHhkMiwgMHhjMSwgMHg3NiwgMHg0YiwgMHgyMywgMHg5ZCwgMHgwYiwKKwkweDRjLCAweDk3LCAweDQ3LCAweGVjLCAweDg1LCAweGEwLCAweGVjLCAweDhiLCAweDc5LCAweDZkLCAweDk5LCAweDRmLAorCTB4MmMsIDB4ZjgsIDB4M2EsIDB4MTAsIDB4OTUsIDB4NzAsIDB4OWEsIDB4MzIsIDB4NjksIDB4YTUsIDB4ODAsIDB4YmQsCisJMHgzMSwgMHg5ZiwgMHgyNywgMHg0NywgMHgyNiwgMHg2ZCwgMHhjYSwgMHhlNywgMHg4NywgMHgxYSwgMHhhNCwgMHgyNSwKKwkweDJhLCAweDBkLCAweGNhLCAweGRlLCAweDNjLCAweGE1LCAweGM3LCAweGJhLCAweDg0LCAweGIxLCAweDM2LCAweDI5LAorCTB4N2QsIDB4Y2EsIDB4ZGEsIDB4YTEsIDB4MzgsIDB4YzYsIDB4MzksIDB4NjgsIDB4ZDgsIDB4YmQsIDB4MTgsIDB4OGYsCisJMHg5MSwgMHg3MiwgMHg4NywgMHg0YywgMHg1NCwgMHhhOSwgMHgzNywgMHhkYiwgMHhjMiwgMHhiNSwgMHhmOCwgMHhmOCwKKwkweDNjLCAweGRhLCAweGY5LCAweDcxLCAweDE5LCAweGM3LCAweDJiLCAweDAzLCAweDk3LCAweDQxLCAweDk2LCAweGQzLAorCTB4OTYsIDB4OTksIDB4MGQsIDB4YzIsIDB4Y2YsIDB4Y2YsIDB4ZmEsIDB4NzUsIDB4NDgsIDB4ZDMsIDB4ZDksIDB4OTEsCisJMHhlNCwgMHg0MiwgMHgxMiwgMHg3ZCwgMHg3NSwgMHhkMCwgMHg4NiwgMHhjMSwgMHg3NiwgMHgwNSwgMHhmMSwgMHg2MywKKwkweGRmLCAweDZjLCAweDA3LCAweDVmLCAweDM0LCAweDQwLCAweDNmLCAweDcyLCAweDFlLCAweDdlLCAweGE0LCAweDQzLAorCTB4MGUsIDB4OTUsIDB4NTQsIDB4MWYsIDB4MDksIDB4ZjYsIDB4NTEsIDB4ZDQsIDB4NmQsIDB4M2IsIDB4MTcsIDB4MWEsCisJMHgxMCwgMHhkYiwgMHgyNCwgMHhjZCwgMHgxNywgMHhhNSwgMHhkNiwgMHg3NiwgMHg0OCwgMHhiYywgMHg3NiwgMHg1ZSwKKwkweGRmLCAweDNmLCAweDc3LCAweDMzLCAweGIxLCAweDdhLCAweGRkLCAweDhmLCAweDRhLCAweDEwLCAweDc0LCAweGU0LAorCTB4ZDAsIDB4MDcsIDB4YzcsIDB4YWYsIDB4ZjUsIDB4ZWQsIDB4ZjcsIDB4OTcsIDB4MzQsIDB4OTcsIDB4YWYsIDB4ZTksCisJMHg2YiwgMHg5MywgMHg4ZSwgMHhiOSwgMHhhYywgMHg0NCwgMHhlZSwgMHhkNywgMHgxYSwgMHg1YiwgMHhjNSwgMHgwMCwKKwkweDkwLCAweDA3LCAweDA5LCAweGU1LCAweDdhLCAweDYwLCAweDE3LCAweGFiLCAweDAzLCAweDVhLCAweDQ2LCAweDVlLAorCTB4NDAsIDB4NTksIDB4N2QsIDB4NmMsIDB4ZTMsIDB4YzksIDB4NTcsIDB4MDEsIDB4OTgsIDB4YWUsIDB4MDgsIDB4M2QsCisJMHgwZiwgMHhhNiwgMHgzMywgMHhhZCwgMHhkZSwgMHg1ZSwgMHhkMywgMHhmNSwgMHhlMiwgMHgxOSwgMHhjOCwgMHgwZCwKKwkweGZhLCAweDJjLCAweGFlLCAweGI0LCAweGU1LCAweDljLCAweDVlLCAweDE4LCAweGI5LCAweDM0LCAweDE1LCAweGM3LAorCTB4OWMsIDB4M2MsIDB4YmYsIDB4ZTAsIDB4ZjEsIDB4OWEsIDB4M2UsIDB4MjcsIDB4MjAsIDB4OGIsIDB4NzYsIDB4MDIsCisJMHg3MSwgMHgzMywgMHg3ZCwgMHg3YywgMHg0MiwgMHg1ZSwgMHhiMiwgMHg3ZCwgMHhmZiwgMHg0MywgMHg1ZiwgMHg4NCwKKwkweGZhLCAweDU1LCAweGQyLCAweDQ2LCAweGRhLCAweGNmLCAweDYzLCAweDZlLCAweGFlLCAweGNjLCAweDM4LCAweDllLAorCTB4MGMsIDB4ZjYsIDB4YzAsIDB4OGYsIDB4N2MsIDB4MjMsIDB4NjQsIDB4MWQsIDB4NjYsIDB4N2MsIDB4NzUsIDB4MjUsCisJMHg1NCwgMHgzZiwgMHgxZiwgMHgxZiwgMHgyYiwgMHgzYywgMHhhZiwgMHhmNywgMHg3ZSwgMHhjZiwgMHg2YiwgMHg3OSwKKwkweDU5LCAweDgyLCAweGJjLCAweGY0LCAweDI2LCAweDRjLCAweGU5LCAweDA2LCAweGVkLCAweGE4LCAweGQzLCAweGQ3LAorCTB4ODUsIDB4MzgsIDB4ODcsIDB4MzEsIDB4NzQsIDB4MWMsIDB4ZjQsIDB4OTgsIDB4YjAsIDB4MWQsIDB4OWIsIDB4MzQsCisJMHg2NiwgMHhmZiwgMHg3NywgMHg2MSwgMHhmYSwgMHhiNiwgMHg1NiwgMHhiNSwgMHhhZiwgMHg3YywgMHg1ZSwgMHhjOSwKKwkweGIzLCAweDI3LCAweGRmLCAweDQxLCAweGZkLCAweGRlLCAweDk3LCAweGE5LCAweDIwLCAweDIxLCAweDhkLCAweGQ0LAorCTB4ZjYsIDB4NGYsIDB4NTksIDB4ZmYsIDB4MzksIDB4NWQsIDB4ZmYsIDB4NTksIDB4ZDQsIDB4MGYsIDB4NjAsIDB4NGUsCisJMHhhZSwgMHhiYiwgMHg1NywgMHhkMSwgMHhmYiwgMHgxYywgMHhmOCwgMHgxZSwgMHg5NCwgMHhlMiwgMHg4YSwgMHhjYywKKwkweDNmLCAweDA3LCAweDk5LCAweGE3LCAweDdjLCAweDlmLCAweDg3LCAweGJlLCAweDgyLCAweGY4LCAweDdiLCAweDI5LAorCTB4ZjcsIDB4NjUsIDB4MTksIDB4M2MsIDB4OWQsIDB4NmIsIDB4ZTAsIDB4NWUsIDB4NjcsIDB4YzIsIDB4NjAsIDB4ZWMsCisJMHg0OSwgMHg5OSwgMHhlYywgMHg5MCwgMHhjNywgMHg0YiwgMHg0OSwgMHg3MywgMHhhMiwgMHg2ZSwgMHgyZCwgMHg3NywKKwkweGFjLCAweDVhLCAweDRiLCAweGNhLCAweDgwLCAweGFhLCAweDlmLCAweDYyLCAweGZkLCAweDcyLCAweDlkLCAweDBjLAorCTB4Y2MsIDB4Y2YsIDB4NWUsIDB4YWYsIDB4MWQsIDB4NjUsIDB4ODAsIDB4ZWQsIDB4ZDYsIDB4YzMsIDB4ZTksIDB4ZGMsCisJMHgxYiwgMHg3NCwgMHhkZCwgMHg0NSwgMHg4NywgMHhmYiwgMHhiOCwgMHg4ZCwgMHg1MiwgMHg1MCwgMHgzMiwgMHgxNiwKKwkweDkwLCAweGEyLCAweDQzLCAweGJkLCAweGNhLCAweDI2LCAweDQyLCAweDYyLCAweDAxLCAweDJiLCAweDdkLCAweDEwLAorCTB4NzQsIDB4NjYsIDB4NTIsIDB4NjEsIDB4ZjEsIDB4ZjYsIDB4MTIsIDB4YzYsIDB4YjEsIDB4MDYsIDB4NGIsIDB4YTYsCisJMHhlYiwgMHg1ZSwgMHhiMiwgMHg0NSwgMHhjYSwgMHg4OCwgMHgzZCwgMHgxNywgMHg5MSwgMHgxNiwgMHgyYiwgMHhkMCwKKwkweGQ5LCAweDY4LCAweDA4LCAweDM2LCAweGMwLCAweDk3LCAweGYxLCAweDg4LCAweGNjLCAweGExLCAweGNlLCAweDNjLAorCTB4ZGUsIDB4M2QsIDB4NWUsIDB4ZjEsIDB4MjUsIDB4YzYsIDB4NzUsIDB4MGQsIDB4ZjAsIDB4NjgsIDB4OGYsIDB4ZmQsCisJMHhmZiwgMHhkYywgMHg3YywgMHhhYywgMHhiZSwgMHhhZSwgMHg4ZiwgMHg4OSwgMHg4OSwgMHg2NSwgMHg4OSwgMHg0ZCwKKwkweDg5LCAweDI5LCAweGY5LCAweDhlLCAweDM4LCAweGYxLCAweDIwLCAweDY4LCAweGExLCAweGNlLCAweGI2LCAweDQ4LAorCTB4MjQsIDB4NmQsIDB4YzUsIDB4ODcsIDB4YzUsIDB4ZjcsIDB4ZmQsIDB4OTcsIDB4MjEsIDB4NGIsIDB4MDUsIDB4YjcsCisJMHhkMSwgMHhlZSwgMHg5MCwgMHg2NywgMHgyMCwgMHgzNywgMHhlNywgMHg1NywgMHg3MCwgMHg0YywgMHgwMiwgMHg3MiwKKwkweDQ0LCAweDNmLCAweGVhLCAweGNhLCAweDM5LCAweGM3LCAweDRlLCAweDdjLCAweDBlLCAweGU5LCAweGI3LCAweDlkLAorCTB4ZGYsIDB4MjIsIDB4ZGYsIDB4OWUsIDB4MTAsIDB4ZTksIDB4NDMsIDB4MmMsIDB4MDQsIDB4YmIsIDB4M2UsIDB4ZTMsCisJMHg2MywgMHhmYiwgMHgxNiwgMHhjNiwgMHg2NCwgMHg1YSwgMHg5NiwgMHhhZSwgMHhhMCwgMHg0ZiwgMHhjYiwgMHgzNCwKKwkweDAwLCAweDZhLCAweGVmLCAweDQyLCAweDNkLCAweDRmLCAweDM3LCAweGZjLCAweGIyLCAweDgzLCAweGE4LCAweDRiLAorCTB4MWEsIDB4MTgsIDB4MmYsIDB4N2YsIDB4MDcsIDB4M2EsIDB4ZWIsIDB4YmEsIDB4ZjcsIDB4MzksIDB4OGIsIDB4NzUsCisJMHhiNiwgMHhlNiwgMHgzOSwgMHhhYywgMHhiZiwgMHg5MiwgMHhmMywgMHhmZSwgMHg1NiwgMHhlMSwgMHhmZSwgMHhhYSwKKwkweGY0LCAweGI1LCAweGE5LCAweDc4LCAweDhlLCAweGNmLCAweDkwLCAweGY3LCAweDdlLCAweDYyLCAweGExLCAweDg0LAorCTB4YzIsIDB4OWEsIDB4YzQsIDB4MGQsIDB4ZTcsIDB4YzEsIDB4ZmIsIDB4NGYsIDB4MmEsIDB4NGMsIDB4NDMsIDB4ZmMsCisJMHgwNiwgMHhmYSwgMHg0YiwgMHhjNCwgMHgxNCwgMHgxZSwgMHg5NiwgMHhmNiwgMHg3MCwgMHgxZCwgMHhiMSwgMHg0NSwKKwkweDBhLCAweDZiLCAweGUzLCAweGUzLCAweDBiLCAweGI2LCAweDY1LCAweDNkLCAweGI2LCAweGFkLCAweDVmLCAweDNmLAorCTB4ZDYsIDB4ZDksIDB4MTQsIDB4YzgsIDB4MWQsIDB4YTMsIDB4M2MsIDB4ZDMsIDB4M2YsIDB4YjYsIDB4Y2EsIDB4YmUsCisJMHg1NCwgMHgyMywgMHhmOCwgMHhkZSwgMHhhNiwgMHhmZCwgMHhmOCwgMHhmYiwgMHg4MCwgMHhkOSwgMHg4MCwgMHhiZCwKKwkweDRkLCAweGNiLCAweGE5LCAweGQ5LCAweDllLCAweGY3LCAweGEwLCAweGVjLCAweDE3LCAweGUwLCAweDNmLCAweGNiLAorCTB4ZjYsIDB4MzcsIDB4NzgsIDB4N2UsIDB4ZjIsIDB4NjEsIDB4ZTgsIDB4ZjIsIDB4ZGMsIDB4MjYsIDB4NmYsIDB4ZWYsCisJMHg4YSwgMHhlYiwgMHhlMCwgMHhlMywgMHgwNCwgMHgxZiwgMHhmNywgMHg5OSwgMHgxYSwgMHhlZiwgMHg3MywgMHg2ZCwKKwkweGJjLCAweDdkLCAweDJlLCAweDQzLCAweGQ1LCAweDY1LCAweGFjLCAweDU1LCAweDFmLCAweDViLCAweDUyLCAweDg3LAorCTB4NWQsIDB4ZjcsIDB4OWMsIDB4ZTMsIDB4ZTMsIDB4YzgsIDB4ZWQsIDB4ZjAsIDB4YTEsIDB4MjEsIDB4Y2QsIDB4ZWIsCisJMHg2NiwgMHhmMCwgMHg5YSwgMHgxOCwgMHgyNSwgMHgyMiwgMHg4OSwgMHgzNiwgMHg2MiwgMHg4YSwgMHgwNywgMHgxYiwKKwkweDZhLCAweDU4LCAweGU2LCAweDZmLCAweGRjLCAweGEwLCAweGNkLCAweDc4LCAweDhmLCAweDM4LCAweDg2LCAweGI0LAorCTB4NmYsIDB4ZDcsIDB4NzgsIDB4ODYsIDB4ZDgsIDB4ZTYsIDB4MzEsIDB4OGMsIDB4MTEsIDB4OTQsIDB4NDQsIDB4M2IsCisJMHhmMywgMHg3ZiwgMHhhOSwgMHhkYiwgMHhmMCwgMHhkOSwgMHg5NSwgMHhlZSwgMHhhZCwgMHhmNSwgMHhmMiwgMHgzYywKKwkweDAwLCAweDNhLCAweDM5LCAweDFmLCAweDdmLCAweGVmLCAweGI1LCAweDQzLCAweGQ5LCAweDkzLCAweDlhLCAweDVjLAorCTB4ZjgsIDB4MzQsIDB4ZjksIDB4ZTMsIDB4OTIsIDB4YjYsIDB4YjgsIDB4YjQsIDB4ODEsIDB4YjYsIDB4N2IsIDB4ZTAsCisJMHg1MywgMHhiNiwgMHhiNiwgMHhiMSwgMHg0ZiwgMHg3ZiwgMHhlYywgMHg3YSwgMHg5YSwgMHhlYSwgMHhmMSwgMHg1NSwKKwkweDAyLCAweDYzLCAweDM0LCAweGNhLCAweGQ2LCAweDc2LCAweGYyLCAweGFlLCAweDQzLCAweGY5LCAweDk2LCAweGRhLAorCTB4N2EsIDB4ZDAsIDB4ZjcsIDB4NzMsIDB4ZWMsIDB4YjUsIDB4ZTUsIDB4ZWYsIDB4YWQsIDB4YTMsIDB4NmIsIDB4MmQsCisJMHhlNiwgMHhkYiwgMHg4NiwgMHg3NywgMHhhNCwgMHhjOSwgMHg4NCwgMHg1ZCwgMHg3MiwgMHg2NSwgMHg4NywgMHhlMywKKwkweGUzLCAweGJiLCAweDdhLCAweDNhLCAweDg4LCAweGYxLCAweDQ4LCAweDMzLCAweDY5LCAweGYwLCAweDMxLCAweDM5LAorCTB4N2YsIDB4NWMsIDB4MWIsIDB4ZDIsIDB4OTMsIDB4ZDYsIDB4ZTcsIDB4NDQsIDB4ZmIsIDB4ZjUsIDB4YmMsIDB4NmUsCisJMHhkMywgMHg3NSwgMHg5MiwgMHg2OCwgMHhmYiwgMHhjNywgMHg5OCwgMHgwMywgMHg5ZiwgMHgzOSwgMHgwZiwgMHgxZiwKKwkweDFiLCAweDI2LCAweGJkLCAweDdlLCAweGEyLCAweGViLCAweGM1LCAweDAwLCAweGQ0LCAweDE5LCAweDlmLCAweDRmLAorCTB4NmQsIDB4N2EsIDB4OGQsIDB4YjYsIDB4YWYsIDB4MTksIDB4ZDcsIDB4NzIsIDB4NTYsIDB4ZGIsIDB4OTEsIDB4ZjcsCisJMHhkNCwgMHhjZCwgMHhhZiwgMHg0ZiwgMHgwYSwgMHhmMywgMHg5NCwgMHg4YiwgMHg3NywgMHgyMSwgMHhmNSwgMHg2MywKKwkweGEzLCAweDdlLCAweGY4LCAweDkxLCAweDBjLCAweDYyLCAweDIxLCAweGM2LCAweDQ4LCAweGQ3LCAweGM0LCAweDQ3LAorCTB4M2MsIDB4NDcsIDB4MWMsIDB4Y2IsIDB4MjMsIDB4NWUsIDB4NTYsIDB4N2UsIDB4YzQsIDB4ZjMsIDB4OTEsIDB4YzgsCisJMHhjMywgMHg5ZSwgMHg1NCwgMHhlZiwgMHhhNSwgMHg4YywgMHg4ZCwgMHg4ZCwgMHg1NywgMHg5YywgMHhiMSwgMHhiZCwKKwkweDk1LCAweGZlLCAweDMxLCAweGM2LCAweDExLCAweDllLCAweGNjLCAweGExLCAweDdlLCAweDQ1LCAweGM2LCAweDBkLAorCTB4YjQsIDB4Y2IsIDB4YWEsIDB4NzYsIDB4NmEsIDB4MWYsIDB4NjgsIDB4OWQsIDB4N2UsIDB4ODQsIDB4ZmEsIDB4MzgsCisJMHhlZSwgMHg4ZCwgMHgxNSwgMHgxOSwgMHhjYiwgMHhjMSwgMHgwNiwgMHhjZCwgMHhjZiwgMHhjMCwgMHhjNywgMHhkOSwKKwkweDU2LCAweDg2LCAweDcyLCAweGI5LCAweGM3LCAweGIxLCAweDg2LCAweDk1LCAweGVjLCAweGM1LCAweGFjLCAweDUxLAorCTB4YWUsIDB4NjUsIDB4NzksIDB4ZTYsIDB4MWQsIDB4YjAsIDB4YTEsIDB4YWUsIDB4ZGMsIDB4MGQsIDB4NWIsIDB4ZjgsCisJMHgxMCwgMHg2NCwgMHg1NSwgMHhjZSwgMHhjMCwgMHgxMCwgMHg5ZSwgMHg4MSwgMHhmMSwgMHgzYSwgMHgxMywgMHgxMywKKwkweGUzLCAweDc4LCAweDg3LCAweDg0LCAweDhmLCAweGM0LCAweDI1LCAweDc0LCAweDg0LCAweGIxLCAweDU4LCAweGQyLAorCTB4YmMsIDB4NWIsIDB4MDQsIDB4M2UsIDB4ZjEsIDB4YzUsIDB4ZGIsIDB4MGQsIDB4YjEsIDB4MDYsIDB4MzIsIDB4OTIsCisJMHg0NCwgMHgzYywgMHhkOSwgMHg2YiwgMHg5NiwgMHg5MSwgMHgxNiwgMHgyNSwgMHg5OSwgMHgzYSwgMHg4ZCwgMHhiZSwKKwkweGMyLCAweDY3LCAweDUwLCAweDE3LCAweGVkLCAweDlhLCAweDE2LCAweDEzLCAweGY4LCAweGI1LCAweDRiLCAweDc0LAorCTB4ZDEsIDB4ZDMsIDB4OTUsIDB4ZTgsIDB4ZTIsIDB4ZWEsIDB4M2QsIDB4OTQsIDB4YzEsIDB4OTUsIDB4M2QsIDB4MTQsCisJMHhiZSwgMHg3ZiwgMHg0MywgMHhlZiwgMHhmZCwgMHgzYywgMHhhYiwgMHhlMywgMHgxYSwgMHhjYSwgMHgwOCwgMHg3ZCwKKwkweDliLCAweDhhLCAweGNkLCAweDYwLCAweGM3LCAweDlmLCAweDQ1LCAweDJjLCAweDZjLCAweDRiLCAweGFlLCAweDA0LAorCTB4Y2MsIDB4OWUsIDB4NzYsIDB4ZTUsIDB4MjksIDB4YTcsIDB4ZTAsIDB4NjYsIDB4ZmIsIDB4NWQsIDB4YjksIDB4ZWMsCisJMHhkOCwgMHg4NSwgMHhiYywgMHg1OCwgMHg2ZiwgMHhkMCwgMHhkZSwgMHhmZCwgMHg0ZiwgMHhlNywgMHhmZCwgMHhiMiwKKwkweGFiLCAweGQ1LCAweGRhLCAweDk1LCAweDA5LCAweDE0LCAweGRjLCAweDY2LCAweDNiLCAweDJhLCAweDM3LCAweGE1LAorCTB4MGYsIDB4Y2EsIDB4OWUsIDB4MmQsIDB4NGIsIDB4NjYsIDB4NTAsIDB4MzIsIDB4MzcsIDB4MDEsIDB4MTcsIDB4YzYsCisJMHhmMywgMHhjYSwgMHg1NiwgMHhiZCwgMHhhNiwgMHhlMiwgMHhlYiwgMHgwNywgMHhiYSwgMHgwZSwgMHhjYSwgMHhjNiwKKwkweDJkLCAweDk2LCAweDc5LCAweDM1LCAweDQ4LCAweGNjLCAweDc2LCAweDEwLCAweGIxLCAweDgwLCAweDE1LCAweGNmLAorCTB4MDUsIDB4NmQsIDB4NzMsIDB4YTcsIDB4NTgsIDB4YzMsIDB4OWYsIDB4MTYsIDB4OWUsIDB4ZGIsIDB4ZGEsIDB4ZDIsCisJMHg3OSwgMHhjNCwgMHg4ZSwgMHg3ZiwgMHgyMiwgMHhkMCwgMHhiZCwgMHhmZiwgMHgxMywgMHg4YywgMHhlZiwgMHhjZSwKKwkweDMwLCAweGVmLCAweDRhLCAweDY0LCAweDhiLCAweDg5LCAweGU3LCAweDk4LCAweDc0LCAweDFlLCAweDRmLCAweDQ4LAorCTB4MTIsIDB4N2MsIDB4ZTksIDB4NTEsIDB4M2MsIDB4ZTEsIDB4ZjksIDB4NTEsIDB4NWMsIDB4YmEsIDB4OGYsIDB4MTAsCisJMHg0MywgMHgyOSwgMHhkZSwgMHhmNCwgMHg4MCwgMHgzNywgMHgyOSwgMHhmMCwgMHgwNiwgMHgzMSwgMHg1NSwgMHhhZiwKKwkweDc5LCAweDE1LCAweGU5LCAweGIyLCAweDI0LCAweDA3LCAweDdlLCAweDAwLCAweGRlLCAweGY0LCAweDgwLCAweDM3LAorCTB4ZGQsIDB4NjcsIDB4MTIsIDB4NjgsIDB4OGYsIDB4M2UsIDB4MTYsIDB4M2IsIDB4OTEsIDB4NDYsIDB4ZTUsIDB4ODMsCisJMHgzNywgMHhiNCwgMHhlMywgMHhkOSwgMHg5NiwgMHhlNCwgMHg5MSwgMHgwOCwgMHhjNiwgMHgwOCwgMHhjOCwgMHg4ZSwKKwkweGFlLCAweDgyLCAweDBjLCAweDZkLCAweDQxLCAweDZjLCAweDE2LCAweDNiLCAweDI4LCAweDE3LCAweGUxLCAweDg3LAorCTB4NGEsIDB4ODgsIDB4MTEsIDB4OWUsIDB4MWEsIDB4YjAsIDB4NDYsIDB4OTcsIDB4NjAsIDB4NGIsIDB4YWIsIDB4ZjcsCisJMHhiOCwgMHhmMiwgMHhmMiwgMHg5NiwgMHhiZiwgMHg3MCwgMHhlMywgMHgzNywgMHg1OCwgMHhiYiwgMHgyNCwgMHhkMCwKKwkweDJmLCAweDkzLCAweDI1LCAweGU1LCAweDFmLCAweGUyLCAweGQ5LCAweGEwLCAweGMyLCAweDY1LCAweDk4LCAweDYzLAorCTB4MDEsIDB4M2UsIDB4ODYsIDB4ZTcsIDB4ZDEsIDB4MzYsIDB4NmMsIDB4ZmQsIDB4YTcsIDB4ZTUsIDB4YTEsIDB4YjksCisJMHgwOSwgMHhmYywgMHgxMCwgMHg2ZiwgMHg0ZSwgMHhiMSwgMHhlZSwgMHg3ZSwgMHhjNCwgMHg3MywgMHgwZiwgMHhjYiwKKwkweGJlLCAweDI5LCAweDYwLCAweGM3LCAweDM0LCAweGU4LCAweGVlLCAweGI3LCAweDExLCAweGNmLCAweGNkLCAweDM3LAorCTB4NGEsIDB4MGIsIDB4Y2EsIDB4YzAsIDB4ZGIsIDB4ZDEsIDB4ZWEsIDB4ZGEsIDB4MzgsIDB4NmUsIDB4MDksIDB4ZWIsCisJMHgzMCwgMHgyMCwgMHg3ZiwgMHg1NiwgMHhlZCwgMHg5NywgMHhhZiwgMHg1NSwgMHhmYiwgMHhlNCwgMHg0ZiwgMHhlMCwKKwkweDViLCAweGNlLCAweDU3LCAweDNiLCAweGEwLCAweDJiLCAweDcxLCAweGFjLCAweDQ5LCAweDFhLCAweGViLCAweGUzLAorCTB4YzgsIDB4NzMsIDB4ZDUsIDB4OTQsIDB4M2MsIDB4MGIsIDB4NWUsIDB4M2QsIDB4ODMsIDB4ZGYsIDB4NTAsIDB4MjksCisJMHgyNSwgMHgzYiwgMHg0YSwgMHg3ZCwgMHg3YSwgMHg4ZCwgMHhiOCwgMHgzZSwgMHgzNiwgMHhlOCwgMHhiMSwgMHgzMSwKKwkweDc3LCAweGViLCAweGM5LCAweDAyLCAweGY0LCAweDZmLCAweGJlLCAweDZhLCAweGJmLCAweDVlLCAweDk2LCAweDhmLAorCTB4MzcsIDB4NzIsIDB4OGYsIDB4ZjcsIDB4ZDQsIDB4OGEsIDB4N2YsIDB4MjksIDB4YjgsIDB4YTYsIDB4NmQsIDB4MWQsCisJMHgxZSwgMHhjNywgMHgzYSwgMHg5NCwgMHhhMSwgMHhhNywgMHhhMywgMHg4YSwgMHhmNywgMHgzNSwgMHhkZiwgMHg1MywKKwkweGY2LCAweDdjLCAweDhmLCAweDNmLCAweGJmLCAweDk5LCAweGJjLCAweDdjLCAweDViLCAweGIyLCAweDQ3LCAweDI3LAorCTB4NjUsIDB4Y2YsIDB4MzEsIDB4NTcsIDB4M2UsIDB4ZWMsIDB4YjgsIDB4OTAsIDB4NjMsIDB4ZGEsIDB4ZTIsIDB4N2UsCisJMHhkYSwgMHhmOCwgMHhjNCwgMHg3OCwgMHhkMCwgMHg1MCwgMHhiMSwgMHg5NCwgMHg4NywgMHg1YiwgMHg3YSwgMHgzNywKKwkweDQzLCAweDY3LCAweDUzLCAweDE5LCAweDYzLCAweDQyLCAweDkyLCAweDQ3LCAweDI3LCAweGE0LCAweGYzLCAweDI4LAorCTB4NjQsIDB4YzEsIDB4NjEsIDB4NWYsIDB4NGIsIDB4YTYsIDB4NzEsIDB4OGQsIDB4M2MsIDB4NzAsIDB4MWMsIDB4NmIsCisJMHgyMCwgMHgyNywgMHhiNiwgMHhmOSwgMHhiYSwgMHhhNCwgMHgzMCwgMHhmZSwgMHgwMSwgMHhlOSwgMHg0MiwgMHgxYiwKKwkweDFiLCAweDZkLCAweGFlLCAweGFhLCAweGIxLCAweDliLCAweDMxLCAweDc2LCAweGEzLCAweDFjLCAweDhhLCAweDU5LAorCTB4OTAsIDB4MzUsIDB4ZmEsIDB4ZjAsIDB4ZmYsIDB4MjUsIDB4ZDksIDB4MzIsIDB4ZDMsIDB4OWYsIDB4NGEsIDB4ZjYsCisJMHhkNCwgMHg0NywgMHgyMywgMHgxMiwgMHhlNSwgMHgzMywgMHg0YywgMHhjMywgMHgwOSwgMHg5NiwgMHg3NywgMHgyMiwKKwkweDY1LCAweGI5LCAweDhkLCAweDM4LCAweGZhLCAweGU3LCAweDkyLCAweDNkLCAweGNiLCAweGIxLCAweDVmLCAweDQ3LAorCTB4ZjksIDB4Y2IsIDB4OTIsIDB4OWQsIDB4ZmUsIDB4MDUsIDB4ZjIsIDB4MTcsIDB4OTEsIDB4YmUsIDB4ODEsIDB4NzQsCisJMHg1NCwgMHgzYSwgMHhhNywgMHgyNSwgMHg5MCwgMHgzZCwgMHhmYiwgMHgyZCwgMHhlNCwgMHg0MywgMHg0OCwgMHgwZiwKKwkweGExLCAweGRlLCAweDc2LCAweGQwLCAweGY3LCAweGE3LCAweGU4LCAweDJmLCAweDAzLCAweDliLCAweGY3LCAweDNiLAorCTB4OWEsIDB4N2UsIDB4OTYsIDB4YjMsIDB4OGMsIDB4ZWYsIDB4MGUsIDB4YzEsIDB4YTYsIDB4ZmQsIDB4NjcsIDB4ZDgsCisJMHgzNCwgMHhmZCwgMHgzYywgMHhjZiwgMHgzYywgMHg2ZCwgMHgxYiwgMHg5ZiwgMHgyNywgMHhjMCwgMHg5MywgMHgwMywKKwkweGM4LCAweGJiLCAweGYyLCAweGIwLCAweDQzLCAweDdmLCAweGIzLCAweDRkLCAweGM2LCAweGNjLCAweDgyLCAweDFiLAorCTB4MDUsIDB4YWUsIDB4NjgsIDB4ODYsIDB4MWUsIDB4NGMsIDB4NmMsIDB4NWQsIDB4NWYsIDB4MGYsIDB4MGUsIDB4NzcsCisJMHgxZiwgMHg5NCwgMHhhNiwgMHgyZCwgMHhmZSwgMHhmYywgMHhmZCwgMHhmOSwgMHhkYSwgMHhlNiwgMHg0ZiwgMHgxNCwKKwkweDFmLCAweGFjLCAweGMyLCAweDI3LCAweDg0LCAweGYzLCAweGIwLCAweGUzLCAweDVmLCAweDMwLCAweGJhLCAweDc3LAorCTB4M2QsIDB4MDQsIDB4M2QsIDB4MzAsIDB4Y2UsIDB4MzIsIDB4ZWYsIDB4ZTksIDB4ODEsIDB4NzEsIDB4MTYsIDB4YjYsCisJMHhlMSwgMHgwNCwgMHg2MiwgMHhjNCwgMHgxMywgMHgxZCwgMHhkMiwgMHgzOCwgMHg1ZCwgMHhkMywgMHg4MywgMHg4NiwKKwkweGU5LCAweDVmLCAweGFkLCAweDA3LCAweDhkLCAweDY3LCAweDUxLCAweGVmLCAweDJjLCAweDc5LCAweDg2LCAweDNlLAorCTB4NGUsIDB4OTEsIDB4NjcsIDB4ZWQsIDB4NDgsIDB4M2YsIDB4OGQsIDB4YjksIDB4OTIsIDB4ZjYsIDB4NDYsIDB4ZDAsCisJMHhlZSwgMHhlMSwgMHhhMiwgMHhkYiwgMHgyMSwgMHhlZiwgMHgwZiwgMHg2YywgMHgzOSwgMHhhMCwgMHhjYiwgMHhmZiwKKwkweGQyLCAweDFkLCAweDhlLCAweDU5LCAweDczLCAweDEyLCAweDIwLCAweDRmLCAweDUxLCAweGI3LCAweDRjLCAweDFlLAorCTB4ZGUsIDB4ZGMsIDB4MjQsIDB4ZDEsIDB4ZmQsIDB4ZDIsIDB4NDksIDB4ZmUsIDB4OTUsIDB4NzcsIDB4MjIsIDB4NWYsCisJMHg3MCwgMHhjMywgMHg3NiwgMHhiMywgMHhlNiwgMHgyNywgMHg3MCwgMHg1MiwgMHgzZiwgMHhjYiwgMHg1ZiwgMHg4NSwKKwkweGNjLCAweDEwLCAweGFmLCAweGJlLCAweDI2LCAweDdiLCAweGE2LCAweDVjLCAweDE5LCAweDczLCAweDM4LCAweGZmLAorCTB4ZWYsIDB4NjMsIDB4ZmUsIDB4OTksIDB4MmQsIDB4MzEsIDB4NTksIDB4NGEsIDB4YzQsIDB4YzAsIDB4OTMsIDB4NzksCisJMHhkOCwgMHhmNiwgMHg4YiwgMHhlMiwgMHhmMSwgMHg4MSwgMHhlNywgMHgwMiwgMHgzYiwgMHhjNCwgMHg4ZSwgMHgwZiwKKwkweDg5LCAweDlkLCAweGZhLCAweDAxLCAweGY4LCAweDMwLCAweDA0LCAweGQ5LCAweGNmLCAweDU1LCAweDI5LCAweDNiLAorCTB4YWYsIDB4YzgsIDB4MjAsIDB4NjQsIDB4ZTIsIDB4N2IsIDB4OGUsIDB4OTUsIDB4MDIsIDB4MTYsIDB4ODIsIDB4YmQsCisJMHhhMCwgMHg1YywgMHg1MCwgMHgyNiwgMHg1YSwgMHg5NCwgMHg0ZCwgMHgzYSwgMHhlMSwgMHg1OCwgMHg0ZiwgMHg5NCwKKwkweGU1LCAweDU2LCAweDM5LCAweGQxLCAweDQ2LCAweGRhLCAweGYxLCAweDZlLCAweDVhLCAweGY5LCAweDhiLCAweGQ0LAorCTB4YjgsIDB4ZDEsIDB4MDUsIDB4MWIsIDB4OWQsIDB4MTIsIDB4YjMsIDB4YmIsIDB4ZDgsIDB4ZTgsIDB4ZGYsIDB4MjEsCisJMHhjOSwgMHgxZiwgMHgwZCwgMHhjOCwgMHg0NCwgMHgzNywgMHhkNywgMHg4YSwgMHhmZCwgMHgyMiwgMHg1ZiwgMHgyZSwKKwkweGI4LCAweDIxLCAweGZiLCAweDc1LCAweGY3LCAweDY0LCAweDdiLCAweDQyLCAweDNlLCAweGQ5LCAweGJkLCAweDIyLAorCTB4OTcsIDB4NzMsIDB4MjIsIDB4OWUsIDB4NWUsIDB4MGMsIDB4YWEsIDB4ZjUsIDB4ZjAsIDB4ZTksIDB4ZjYsIDB4ZTcsCisJMHhlMiwgMHhiZiwgMHhlYiwgMHhhYiwgMHg3YiwgMHhjNywgMHhiOSwgMHg1MCwgMHhkNiwgMHg1NywgMHg3NCwgMHgyNywKKwkweDcxLCAweDJkLCAweGFkLCAweGFmLCAweDQxLCAweDllLCAweGFjLCAweDI3LCAweDhhLCAweDcyLCAweDE5LCAweGIyLAorCTB4MDcsIDB4MWUsIDB4OWUsIDB4NjUsIDB4NGEsIDB4MWUsIDB4NGUsIDB4NDAsIDB4ZWUsIDB4NWYsIDB4OTUsIDB4MWQsCisJMHg0NywgMHhhOSwgMHgzMywgMHhhZiwgMHg2MiwgMHhhZSwgMHhjYSwgMHg5NiwgMHhjMCwgMHg0NiwgMHhiMCwgMHgzZiwKKwkweDU3LCAweDI2LCAweDlkLCAweGFlLCAweGQ0LCAweDI5LCAweGI5LCAweDM1LCAweGJlLCAweDE3LCAweDMxLCAweGU3LAorCTB4YjgsIDB4ZTksIDB4Y2EsIDB4YTIsIDB4NTMsIDB4OTAsIDB4YzUsIDB4MDEsIDB4YjQsIDB4MjksIDB4N2YsIDB4MWEsCisJMHhiZiwgMHg0ZiwgMHhlOSwgMHhiOSwgMHgzZCwgMHgwYSwgMHhiZSwgMHg1YiwgMHg4OSwgMHgzOSwgMHhlMywgMHhmNywKKwkweGMxLCAweGY3LCAweDg3LCAweDI1LCAweDM5LCAweGJkLCAweDYyLCAweDZiLCAweDIwLCAweDc3LCAweDllLCAweGFkLAorCTB4NDksIDB4OWUsIDB4MzUsIDB4YTUsIDB4NWMsIDB4YjIsIDB4ZTUsIDB4MjMsIDB4YjQsIDB4MjEsIDB4MjUsIDB4Y2UsCisJMHgwYiwgMHgzNiwgMHg4NiwgMHg2NywgMHhlYywgMHgyNSwgMHhkOCwgMHg5OSwgMHgxMiwgMHg2YywgMHgwYSwgMHg2YywKKwkweGM4LCAweDlmLCAweGEwLCAweGZjLCAweDU5LCAweGQ0LCAweDc5LCAweDA2LCAweGYxLCAweGQzLCAweDc5LCAweDYwLAorCTB4YmYsIDB4NzMsIDB4YzAsIDB4MTQsIDB4NGYsIDB4OTcsIDB4MzIsIDB4M2EsIDB4OTYsIDB4NTUsIDB4ZjMsIDB4ODUsCisJMHhjZiwgMHg1MiwgMHhiMSwgMHg4ZiwgMHg5NCwgMHhlNywgMHhkNCwgMHg3ZCwgMHgxZSwgMHhiNSwgMHhiNiwgMHg1OSwKKwkweDY3LCAweDEzLCAweDcxLCAweDE2LCAweDI4LCAweDEzLCAweDk5LCAweDliLCAweGYzLCAweDc5LCAweDQyLCAweGRiLAorCTB4YzcsIDB4ZjMsIDB4MTksIDB4ZGYsIDB4NTYsIDB4MzYsIDB4YWYsIDB4YjEsIDB4OTUsIDB4MjIsIDB4MmYsIDB4NTYsCisJMHgzYywgMHgzYywgMHg0OSwgMHg3YywgMHg1YywgMHg5YywgMHg0YSwgMHhhYywgMHg5YywgMHg2MywgMHgxNiwgMHhlMSwKKwkweDM3LCAweDk3LCAweDExLCAweDY3LCAweDQ0LCAweGQyLCAweGRmLCAweDk0LCAweGM4LCAweDcxLCAweGQ3LCAweGZkLAorCTB4MjEsIDB4ZmMsIDB4NjYsIDB4MDEsIDB4NmIsIDB4NjIsIDB4MDQsIDB4NTAsIDB4YmUsIDB4YzAsIDB4NzcsIDB4OTQsCisJMHg3YiwgMHhjYSwgMHg3NiwgMHg4MCwgMHhlNywgMHgxOSwgMHhmMiwgMHgxMiwgMHhjYSwgMHhjYSwgMHgyYSwgMHhmZSwKKwkweGZhLCAweDE2LCAweGU4LCAweGQxLCAweGY0LCAweGE5LCAweDMyLCAweGQ2LCAweDZiLCAweDk0LCAweGRjLCAweDU4LAorCTB4MGEsIDB4MzEsIDB4NGUsIDB4YWYsIDB4ZDksIDB4ODgsIDB4ZjYsIDB4NzMsIDB4MGIsIDB4NmMsIDB4NjMsIDB4MGQsCisJMHhmMCwgMHgzYSwgMHhkNSwgMHg0YiwgMHgwYiwgMHgyYywgMHhlZiwgMHg5MCwgMHg4YiwgMHg4OCwgMHg0NSwgMHg0OSwKKwkweDQzLCAweDc5LCAweDM2LCAweDJkLCAweGRlLCAweGRlLCAweDMxLCAweGVkLCAweDE1LCAweDY5LCAweDQ1LCAweDFlLAorCTB4ZmMsIDB4Y2EsIDB4OTYsIDB4ZTgsIDB4NjcsIDB4NDMsIDB4NTIsIDB4ODgsIDB4OTMsIDB4ZDcsIDB4NzEsIDB4NTksCisJMHg5ZSwgMHhmYSwgMHg0YywgMHgxMywgMHhmNywgMHg2NiwgMHhiMywgMHgzNiwgMHg5ZiwgMHhmZCwgMHhiZCwgMHgwZSwKKwkweGYzLCAweDJkLCAweGVjLCAweDc1LCAweDcwLCAweDdmLCAweDIzLCAweDA0LCAweDVmLCAweGE2LCAweGY2LCAweDNjLAorCTB4OTAsIDB4MjYsIDB4ZWEsIDB4ZTIsIDB4NWYsIDB4YmUsIDB4ZjcsIDB4YjAsIDB4NTEsIDB4MGQsIDB4M2YsIDB4MTIsCisJMHg0ZiwgMHg3MiwgMHhiZSwgMHg1NiwgMHg2MSwgMHgwOSwgMHhmNiwgMHhhMywgMHgyZCwgMHg3ZCwgMHg0OSwgMHhlZSwKKwkweDNkLCAweGUxLCAweGNkLCAweGNmLCAweDM4LCAweDI1LCAweGJjLCAweDRiLCAweDIzLCAweDU3LCAweDY3LCAweDJkLAorCTB4ZTcsIDB4MGEsIDB4MzAsIDB4NDUsIDB4MmUsIDB4ZTYsIDB4NjAsIDB4YmQsIDB4NDYsIDB4OWIsIDB4NjAsIDB4YmYsCisJMHgwNiwgMHgzMiwgMHhjNiwgMHg5OSwgMHgyNiwgMHgwZiwgMHg5ZiwgMHg4NSwgMHg2NCwgMHg2MiwgMHg4YSwgMHhlNywKKwkweDllLCAweGIwLCAweDZkLCAweGMwLCAweDkwLCAweGJmLCAweDFiLCAweGMyLCAweDczLCAweDg1LCAweDc5LCAweGM0LAorCTB4YTQsIDB4NWUsIDB4M2MsIDB4OGIsIDB4NjcsIDB4YWYsIDB4M2YsIDB4ZjIsIDB4ZGMsIDB4MzgsIDB4YzEsIDB4YjksCisJMHgwNywgMHhlNCwgMHg1ZSwgMHhhMCwgMHgxMywgMHg0MSwgMHhmZiwgMHg5ZCwgMHg3YSwgMHhhYywgMHhjZSwgMHg1MywKKwkweDI5LCAweGVlLCAweDY1LCAweDRiLCAweDEyLCAweGY2LCAweDIyLCAweDhiLCAweDU4LCAweDMyLCAweDE3LCAweGViLAorCTB4ZDAsIDB4ZDgsIDB4OWMsIDB4ZWYsIDB4ZDYsIDB4NjIsIDB4NGYsIDB4M2YsIDB4YzYsIDB4NGIsIDB4YzksIDB4ZTcsCisJMHg0YiwgMHgzZSwgMHhkNiwgMHg0YiwgMHhjMSwgMHhjNywgMHg0YSwgMHg2OCwgMHhiOCwgMHhjNywgMHg5NSwgMHgxZiwKKwkweDNhLCAweGU0LCAweDU3LCAweDFmLCAweGYyLCAweDhlLCAweDFjLCAweGFlLCAweGZlLCAweGIyLCAweGYzLCAweGNkLAorCTB4ZmEsIDB4YmYsIDB4NjYsIDB4ZDAsIDB4YzgsIDB4MWYsIDB4ZTgsIDB4MDMsIDB4M2UsIDB4MjIsIDB4ZWQsIDB4MDYsCisJMHhmYywgMHg3OSwgMHgxMSwgMHhiOCwgMHhjYiwgMHgzOCwgMHhkMywgMHhhMSwgMHhkZSwgMHgxOSwgMHhjMCwgMHgwNiwKKwkweGU1LCAweDI5LCAweGQ4LCAweGM2LCAweDMzLCAweDNjLCAweGYzLCAweDg1LCAweDZkLCAweDNiLCAweDEzLCAweDk2LAorCTB4ZTIsIDB4MGMsIDB4ZTUsIDB4NTIsIDB4ZGEsIDB4MGMsIDB4YWMsIDB4MTcsIDB4ZWIsIDB4OTcsIDB4YTcsIDB4M2EsCisJMHg5MCwgMHgzNiwgMHgyMywgMHg0ZCwgMHhhOCwgMHg3ZSwgMHhjYSwgMHg1MywgMHhiNiwgMHg2YSwgMHg1ZiwgMHg5ZSwKKwkweDRhLCAweGE5LCAweDc2LCAweGU1LCAweGE5LCAweDNlLCAweGE0LCAweDhlLCAweDM0LCAweDljLCAweDQxLCAweGUwLAorCTB4NzQsIDB4YTYsIDB4NWIsIDB4MjYsIDB4NGUsIDB4YzIsIDB4YmYsIDB4ZjQsIDB4MWIsIDB4ZWEsIDB4YmUsIDB4YzQsCisJMHgzOCwgMHhmYywgMHg0ZiwgMHgwOCwgMHg1MSwgMHhkNiwgMHgxNSwgMHg3MywgMHgwMCwgMHgxOCwgMHg2YiwgMHgxYiwKKwkweDMwLCAweGM4LCAweDM2LCAweGIxLCAweDhmLCAweDczLCAweGZlLCAweGI0LCAweGJkLCAweGNiLCAweGRjLCAweGZmLAorCTB4OGEsIDB4M2YsIDB4MjgsIDB4MTksIDB4ZDksIDB4MzcsIDB4ZDMsIDB4MDgsIDB4N2QsIDB4MGQsIDB4OTksIDB4NDUsCisJMHhlOSwgMHgzMiwgMHg4NywgMHg5MCwgMHhjZiwgMHhjZiwgMHg5MSwgMHg2ZiwgMHhmNywgMHhhYiwgMHhkOCwgMHgyZCwKKwkweGViLCAweGM0LCAweGEyLCAweDEyLCAweDRkLCAweDYzLCAweDhjLCAweGI3LCAweGQyLCAweGJlLCAweDA3LCAweGYyLAorCTB4NjcsIDB4ZWIsIDB4M2UsIDB4ZDIsIDB4YTAsIDB4YTcsIDB4OWUsIDB4MWYsIDB4M2MsIDB4ZWIsIDB4Y2QsIDB4ZmMsCisJMHg4YSwgMHhiMywgMHg1ZSwgMHhjYSwgMHgzNSwgMHhmOSwgMHg3YiwgMHhiZiwgMHgyYywgMHhkYiwgMHg2OSwgMHg3OSwKKwkweGM5LCAweDRlLCAweGM5LCAweDQ1LCAweDdiLCAweGFiLCAweGZjLCAweDM5LCAweGZjLCAweGY0LCAweDI1LCAweDdiLAorCTB4YmEsIDB4ODksIDB4NTgsIDB4YTAsIDB4YWMsIDB4Y2UsIDB4Y2YsIDB4ZmMsIDB4YjUsIDB4YjIsIDB4ZjUsIDB4M2UsCisJMHhmYSwgMHg4ZiwgMHg2NCwgMHg3MSwgMHg4YSwgMHhkOCwgMHhkOSwgMHhkZCwgMHhiZSwgMHhjNywgMHgyOSwgMHhkMCwKKwkweDZmLCAweDgxLCAweDA2LCAweDYyLCAweGI1LCAweDAyLCAweGZjLCAweGRmLCAweDQxLCAweDE5LCAweDcyLCAweGU4LAorCTB4ZjcsIDB4OTQsIDB4OGYsIDB4OGEsIDB4MGYsIDB4NzksIDB4ZmEsIDB4ZWMsIDB4ZTQsIDB4NjEsIDB4NTcsIDB4OTcsCisJMHg2NywgMHhhMCwgMHg0ZiwgMHg0MiwgMHhmOSwgMHhjNywgMHhmMywgMHgxYywgMHhkNywgMHhkZCwgMHg5NiwgMHgyZiwKKwkweDk0LCAweDM4LCAweGNmLCAweGUyLCAweGU2LCAweGE4LCAweDA0LCAweDY1LCAweDU4LCAweGUxLCAweDg1LCAweDE2LAorCTB4NzksIDB4NzEsIDB4NjEsIDB4ODMsIDB4MTgsIDB4ZjAsIDB4NTAsIDB4YzYsIDB4MmQsIDB4NjEsIDB4NzUsIDB4ZDMsCisJMHg4NCwgMHhmMSwgMHhiNywgMHhiNCwgMHhmMiwgMHhiZSwgMHhkOCwgMHg4NywgMHhjMSwgMHgxYiwgMHhlZSwgMHgwNSwKKwkweDYwLCAweDZlLCAweGFkLCAweDljLCAweDg5LCAweDlmLCAweGVmLCAweDgzLCAweDdlLCAweGYxLCAweDM5LCAweDIwLAorCTB4MzksIDB4M2IsIDB4ODYsIDB4NjcsIDB4YTYsIDB4ZDQsIDB4MzksIDB4ZWUsIDB4OTMsIDB4MDUsIDB4YzUsIDB4YzMsCisJMHhkYywgMHhlMywgMHhlYSwgMHg3ZCwgMHhhMywgMHg3ZCwgMHgwNywgMHg3MCwgMHgxZCwgMHhlNSwgMHgxNSwgMHhlOSwKKwkweGEyLCAweDM3LCAweDZlLCAweDBlLCAweDM4LCAweDJlLCAweGRmLCAweGQ3LCAweGE0LCAweGNlLCAweGZmLCAweDBhLAorCTB4ZDAsIDB4ODUsIDB4NzEsIDB4NTUsIDB4YmYsIDB4NWYsIDB4MmUsIDB4NGQsIDB4ZWQsIDB4OGYsIDB4N2EsIDB4ZmEsCisJMHgzMSwgMHhhMCwgMHg5ZiwgMHhmOSwgMHg5ZSwgMHhmMSwgMHgxNSwgMHhmNywgMHg0YiwgMHg1ZSwgMHgxOSwgMHg5OSwKKwkweGI0LCAweGJmLCAweGExLCAweGY1LCAweDQ3LCAweDAyLCAweDc3LCAweGY3LCAweDAwLCAweDg3LCAweDFlLCAweDY5LAorCTB4YzAsIDB4NWMsIDB4YWMsIDB4NDQsIDB4MjIsIDB4NjAsIDB4YjQsIDB4MWIsIDB4YzAsIDB4ZjEsIDB4NDMsIDB4Y2EsCisJMHhlNywgMHhmNiwgMHhhOCwgMHhmZCwgMHhlOCwgMHg1MywgMHhhOSwgMHgxNiwgMHgyOSwgMHg5YiwgMHhiNiwgMHhiYSwKKwkweDE3LCAweGI3LCAweDY0LCAweDZlLCAweDIxLCAweGQ2LCAweGM3LCAweGFmLCAweDA5LCAweDY1LCAweDVkLCAweDQ4LAorCTB4MWIsIDB4OTEsIDB4YmUsIDB4NGIsIDB4OGEsIDB4YzcsIDB4YTYsIDB4ZjUsIDB4NzgsIDB4ZTEsIDB4MzUsIDB4ZjksCisJMHgzZSwgMHg5ZCwgMHg3ZSwgMHg0NCwgMHhjNywgMHg1MywgMHgxYywgMHgyNywgMHgyYywgMHhmNiwgMHgxNywgMHg5YiwKKwkweGE1LCAweGViLCAweDg4LCAweDA5LCAweDZjLCAweDFiLCAweDA3LCAweGQ2LCAweGVkLCAweDkwLCAweGQ0LCAweDkxLAorCTB4ODQsIDB4ZGMsIDB4NzIsIDB4YzQsIDB4ZGYsIDB4NzMsIDB4ZmEsIDB4MGYsIDB4MjMsIDB4NDksIDB4YjUsIDB4YzcsCisJMHhmOSwgMHhkZCwgMHgxMSwgMHg3YiwgMHg4ZSwgMHhlOSwgMHg2YiwgMHhmYSwgMHhmZSwgMHhkZSwgMHgxNSwgMHg3ZCwKKwkweGFmLCAweGVmLCAweDQ3LCAweDIzLCAweDNkLCAweDJhLCAweGZkLCAweDZmLCAweDIzLCAweDI5LCAweDk1LCAweGJlLAorCTB4M2UsIDB4NzIsIDB4NGIsIDB4YzUsIDB4OGIsIDB4OGYsIDB4OGEsIDB4ZjMsIDB4MjksIDB4ZjksIDB4NWMsIDB4ODksCisJMHhmOCwgMHhiMiwgMHgxZiwgMHhkOCwgMHhkMSwgMHg4MSwgMHg5ZCwgMHhlOSwgMHg4MywgMHg5ZCwgMHg0OSwgMHhjMSwKKwkweGNlLCAweDBjLCAweGQwLCAweGNlLCAweGMwLCAweDZlLCAweGJmLCAweDAyLCAweGJiLCAweGVkLCAweGM4LCAweGY3LAorCTB4MjAsIDB4YWYsIDB4NGYsIDB4M2IsIDB4OGQsIDB4YzAsIDB4ODUsIDB4YWUsIDB4ZWIsIDB4Y2QsIDB4ZDUsIDB4N2EsCisJMHg2MiwgMHgwOSwgMHhlYiwgMHg1YiwgMHgzZSwgMHgyZCwgMHg5MSwgMHg1NiwgMHhkOCwgMHhhMCwgMHgyZCwgMHgyNywKKwkweDFhLCAweDY0LCAweDNlLCAweGU2LCAweGJhLCAweDQ3LCAweDFkLCAweDViLCAweGFlLCAweGEyLCAweDdlLCAweGQ2LAorCTB4YTYsIDB4MWUsIDB4YmYsIDB4MTQsIDB4NjUsIDB4M2MsIDB4NzYsIDB4NzUsIDB4NmEsIDB4MmIsIDB4NmMsIDB4MTIsCisJMHhlNSwgMHgzZCwgMHgyMiwgMHhlNSwgMHhiMSwgMHhiOCwgMHgyYywgMHgyMCwgMHgzZSwgMHhhYiwgMHhkNSwgMHg0OSwKKwkweGUxLCAweDk5LCAweGZhLCAweGZmLCAweDVkLCAweGQ0LCAweDRkLCAweGMxLCAweDNmLCAweDk4LCAweGIyLCAweGQ4LAorCTB4OTMsIDB4OTAsIDB4NTMsIDB4M2QsIDB4ZDYsIDB4NDAsIDB4YzIsIDB4YTAsIDB4ZWQsIDB4NGEsIDB4YzgsIDB4MWMsCisJMHg2MiwgMHhmZCwgMHg3MiwgMHg4OSwgMHhmNSwgMHg1OSwgMHgwZiwgMHhmYSwgMHg1OSwgMHhmMiwgMHhkYSwgMHg0ZCwKKwkweDk2LCAweDdjLCAweDNiLCAweGQxLCAweGNmLCAweDdkLCAweGM4LCAweDUwLCAweGFlLCAweGM3LCAweGYzLCAweDAxLAorCTB4ODYsIDB4ZDEsIDB4MDgsIDB4MzksIDB4NzAsIDB4YzAsIDB4ZmYsIDB4MzEsIDB4OTQsIDB4ZjcsIDB4ZjMsIDB4YmUsCisJMHgwNywgMHhjYSwgMHg4OCwgMHg4NSwgMHg3ZSwgMHgxYywgMHgyNSwgMHg0NiwgMHhjYywgMHgzOSwgMHg2MywgMHgyOCwKKwkweDYzLCAweDFiLCAweDJiLCAweDllLCAweDQ0LCAweGY5LCAweGE4LCAweDI0LCAweGUzLCAweDc5LCAweDc1LCAweGY3LAorCTB4YWMsIDB4MWQsIDB4NjUsIDB4ZWMsIDB4MjMsIDB4YTgsIDB4ZjcsIDB4NjMsIDB4ZmUsIDB4OGYsIDB4OTIsIDB4YTMsCisJMHhhMCwgMHhlZCwgMHg5NywgMHhmNywgMHhhYSwgMHhiZCwgMHg4MSwgMHg4YywgMHhlOSwgMHg0MCwgMHgxZiwgMHg1OCwKKwkweDk2LCAweDM0LCAweGQ5LCAweDJlLCAweGU3LCAweDM4LCAweGNhLCAweDE2LCAweGRlLCAweDU3LCAweGUxLCAweDE5LAorCTB4NWUsIDB4NDQsIDB4ZWUsIDB4YWQsIDB4MzQsIDB4NGIsIDB4YWUsIDB4ZDIsIDB4NzAsIDB4MWQsIDB4ZmIsIDB4ZWYsCisJMHhlYiwgMHhlNCwgMHg3MiwgMHhkYywgMHgxNCwgMHhkZSwgMHg4MywgMHhmMCwgMHhmNCwgMHgzYywgMHhiNCwgMHg5NSwKKwkweDNhLCAweDMxLCAweGMwLCAweDczLCAweDAzLCAweGY4LCAweDViLCAweGFjLCAweDA1LCAweGZjLCAweGVmLCAweDM5LAorCTB4ZjgsIDB4ZGYsIDB4YTcsIDB4NGIsIDB4MzUsIDB4ZmIsIDB4ZTEsIDB4ZjksIDB4NWQsIDB4ZGEsIDB4ODAsIDB4MjcsCisJMHhiMSwgMHg2NiwgMHhhMywgMHhjMCwgMHhmZCwgMHgzYiwgMHgxMSwgMHgwZiwgMHgwYywgMHgwMywgMHhmYiwgMHgwZiwKKwkweDYyLCAweGZkLCAweGQyLCAweDU4LCAweGJiLCAweDMxLCAweGRlLCAweDE3LCAweGMyLCAweDNhLCAweDBlLCAweGE4LAorCTB4NzMsIDB4ZTYsIDB4MTksIDB4NzUsIDB4ZTcsIDB4ZTIsIDB4NDcsIDB4Y2EsIDB4ZjcsIDB4M2UsIDB4NWUsIDB4MzIsCisJMHhlMCwgMHgxZiwgMHgwYSwgMHhlZSwgMHg2NiwgMHhkYiwgMHgwMiwgMHhmZSwgMHg1YiwgMHhkMSwgMHhlNywgMHg4MSwKKwkweDE3LCAweDYxLCAweDU3LCAweDdlLCAweDA2LCAweGJhLCAweGNlLCAweGNmLCAweGQwLCAweDlmLCAweGEzLCAweDhlLAorCTB4ODcsIDB4YjcsIDB4MWQsIDB4ZWUsIDB4NzUsIDB4NDEsIDB4OWYsIDB4MGYsIDB4MmYsIDB4Y2IsIDB4MTIsIDB4NzAsCisJMHg0NywgMHg4NiwgMHg3MiwgMHg4YywgMHhmOCwgMHhjMSwgMHg3YSwgMHg3YSwgMHg0ZSwgMHhiYSwgMHg2OSwgMHgwMywKKwkweGU3LCAweGE4LCAweDJiLCAweGZkLCAweGQzLCAweDcxLCAweDYwLCAweDNkLCAweDIwLCAweDc5LCAweDc1LCAweGFlLAorCTB4OGEsIDB4ZTcsIDB4YjMsIDB4MWIsIDB4YzUsIDB4MjAsIDB4ZGUsIDB4NzMsIDB4NmUsIDB4NDAsIDB4MTksIDB4ZWQsCisJMHg4NiwgMHg4ZiwgMHg5MSwgMHg5NiwgMHgwNiwgMHhkYSwgMHgyNCwgMHhiMywgMHhhNSwgMHg0ZCwgMHhkOSwgMHgwZSwKKwkweGNiLCAweDc5LCAweDA5LCAweGUzLCAweGVlLCAweDkwLCAweDQ2LCAweDYwLCAweGI4LCAweDAyLCAweGM2LCAweDM4LAorCTB4MjAsIDB4ZmYsIDB4ZDUsIDB4ZTEsIDB4MWUsIDB4OTUsIDB4MTcsIDB4ZmIsIDB4ODEsIDB4OTYsIDB4MDgsIDB4NzgsCisJMHhkNiwgMHhiNCwgMHhjNywgMHgzNiwgMHgyMywgMHgzYiwgMHhhYSwgMHhlYywgMHgzZiwgMHhhMiwgMHgzMCwgMHg1NiwKKwkweDRlLCAweGQ4LCAweDNmLCAweGZjLCAweDA0LCAweGM2LCAweDRjLCAweDRlLCAweDUzLCAweGY2LCAweDdiLCAweGIxLAorCTB4NmUsIDB4YmYsIDB4MGQsIDB4MGMsIDB4NDQsIDB4YWUsIDB4N2UsIDB4NzUsIDB4ODMsIDB4YTcsIDB4MmYsIDB4YTQsCisJMHg3ZiwgMHg4OSwgMHg3OCwgMHg4MiwgMHg2NywgMHgwMCwgMHg1ZSwgMHg1YywgMHhiZSwgMHg0MiwgMHg1YiwgMHgzZiwKKwkweGU4LCAweDlkLCAweGRkLCAweGUwLCAweDlmLCAweDI1LCAweDc3LCAweDRlLCAweDdiLCAweGZlLCAweGJhLCAweGYzLAorCTB4MmMsIDB4NWEsIDB4MWQsIDB4OTUsIDB4NzYsIDB4OWUsIDB4NGEsIDB4MWIsIDB4NzIsIDB4OGIsIDB4ZGMsIDB4MTksCisJMHhmMiwgMHhmYSwgMHgzMSwgMHg0ZSwgMHg5OCwgMHg5MCwgMHg1NSwgMHhkYSwgMHg4MSwgMHg3NiwgMHhjOCwgMHgzOSwKKwkweGYzLCAweGI0LCAweDI5LCAweGI0LCAweDA5LCAweDk0LCAweDA1LCAweDViLCAweDhhLCAweDU1LCAweGQ4LCAweDg0LAorCTB4OTYsIDB4MGUsIDB4OTksIDB4MjMsIDB4Y2YsIDB4NGUsIDB4ZDAsIDB4NGUsIDB4ZmMsIDB4NDgsIDB4MjYsIDB4ZDcsCisJMHhkOCwgMHhjYSwgMHg0MSwgMHhmMSwgMHhlMywgMHhkYSwgMHg2NiwgMHgwOSwgMHhhNywgMHg2ZCwgMHhmMywgMHgzZSwKKwkweDM1LCAweDQ3LCAweGNmLCAweDVlLCAweGVlLCAweDIzLCAweGZlLCAweDljLCAweGM5LCAweDU4LCAweDZkLCAweGEyLAorCTB4YjEsIDB4YTcsIDB4YzIsIDB4NGYsIDB4ZGYsIDB4YzcsIDB4NWMsIDB4ZDksIDB4ODcsIDB4ZTIsIDB4ZDMsIDB4YzAsCisJMHhhMCwgMHgxNywgMHgwYiwgMHhhOCwgMHgzZCwgMHgzZiwgMHhlMCwgMHhlMCwgMHhmOCwgMHhjZiwgMHg2MCwgMHg2YiwKKwkweDczLCAweGM0LCAweDI1LCAweGUwLCAweDczLCAweGU3LCAweDUxLCAweGNhLCAweGQxLCAweDY2LCAweGRhLCAweDMyLAorCTB4ZTAsIDB4YmMsIDB4MTQsIDB4ZWQsIDB4YjUsIDB4MmMsIDB4NGMsIDB4MDMsIDB4NzMsIDB4MTksIDB4NzcsIDB4NDgsCisJMHg5ZSwgMHhmMiwgMHhjYSwgMHhiYiwgMHgwYSwgMHgwYiwgMHg4NiwgMHg0YywgMHhjZSwgMHhiNiwgMHg0OCwgMHhkNywKKwkweDA5LCAweGVlLCAweGFmLCAweDllLCAweDhhLCAweDRhLCAweDBiLCAweGY3LCAweDU4LCAweGU5LCAweDgzLCAweGZhLAorCTB4MjUsIDB4ODcsIDB4ZjIsIDB4Y2UsIDB4MTMsIDB4NDEsIDB4YjUsIDB4MWYsIDB4MzYsIDB4NjcsIDB4OTAsIDB4NDcsCisJMHg3ZCwgMHhiMCwgMHgwNywgMHg1NiwgMHg2YSwgMHhjOSwgMHhkOCwgMHhkNiwgMHhlNCwgMHg2MSwgMHg0OCwgMHhjOCwKKwkweDUyLCAweDA5LCAweDMyLCAweDU2LCAweDgyLCAweDhjLCAweDk1LCAweDIwLCAweDYzLCAweDI1LCAweGM4LCAweDE4LAorCTB4YjAsIDB4ZGYsIDB4NzksIDB4ZTgsIDB4ZGYsIDB4YjksIDB4ZDIsIDB4ODAsIDB4ZjYsIDB4ZWIsIDB4YmIsIDB4OTQsCisJMHg1ZiwgMHgzZiwgMHg1NCwgMHg3YSwgMHhjNSwgMHg2NSwgMHhmYSwgMHhhYywgMHg4YSwgMHg0ZCwgMHhmYiwgMHgyMCwKKwkweDgzLCAweDhjLCAweDQ1LCAweGZkLCAweDE4LCAweGY1LCAweDE1LCAweDc5LCAweDcyLCAweGU2LCAweDU1LCAweDM5LAorCTB4MzUsIDB4NTMsIDB4YzMsIDB4ODEsIDB4MTMsIDB4MjUsIDB4NTcsIDB4NWUsIDB4NzIsIDB4MTAsIDB4N2YsIDB4Y2UsCisJMHgxMywgMHg1MywgMHg2NSwgMHg1YSwgMHgxYiwgMHgxNSwgMHhiNiwgMHgzYSwgMHgyOCwgMHg3OSwgMHg4NSwgMHg5MywKKwkweDk1LCAweDFmLCAweDAxLCAweGJlLCAweDUyLCAweGI4LCAweDkwLCAweGJhLCAweDI5LCAweDZkLCAweDViLCAweDJlLAorCTB4Y2IsIDB4MzksIDB4ZjgsIDB4ZjEsIDB4ODUsIDB4ZWEsIDB4NmIsIDB4ZjIsIDB4OGMsIDB4YzIsIDB4ZTMsIDB4ZTQsCisJMHhjMywgMHgzYiwgMHhlNSwgMHhhNywgMHhhNiwgMHg3NywgMHg5ZSwgMHg3ZiwgMHgwYSwgMHg1OCwgMHg2MywgMHhhMSwKKwkweDg3LCAweGI2LCAweDIzLCAweDA0LCAweDVmLCAweDYwLCAweDE1LCAweDNhLCAweGExLCAweGQ3LCAweGZiLCAweDhkLAorCTB4MWIsIDB4ODEsIDB4NjksIDB4ZjgsIDB4N2UsIDB4YTMsIDB4YmMsIDB4MzgsIDB4NTMsIDB4YTgsIDB4OTMsIDB4MDksCisJMHhkYSwgMHgwNywgMHhlYiwgMHhiMCwgMHgxOCwgMHhmNCwgMHg1MywgMHhmNCwgMHg5YiwgMHg5YywgMHgyZiwgMHhmZCwKKwkweGQ0LCAweDRmLCAweDM3LCAweGYwLCAweDBlLCAweDU3LCAweGY5LCAweDU4LCAweDZjLCAweDAzLCAweGY3LCAweDFiLAorCTB4NjMsIDB4MzYsIDB4NzksIDB4N2EsIDB4NTksIDB4ZjYsIDB4NTcsIDB4NTgsIDB4ZjYsIDB4MmEsIDB4ZDYsIDB4ODcsCisJMHhlOSwgMHgwZiwgMHhkYywgMHg3YiwgMHg2MywgMHgxYywgMHg4ZiwgMHhmZCwgMHgwMiwgMHgzNywgMHhiNSwgMHg2MywKKwkweGFlLCAweGE1LCAweDhmLCAweDY4LCAweGNjLCAweGRkLCAweGE3LCAweDcwLCAweGY0LCAweGI1LCAweDc4LCAweDk5LAorCTB4N2MsIDB4NzIsIDB4YzAsIDB4YTcsIDB4Y2IsIDB4NmEsIDB4M2YsIDB4NzAsIDB4OWQsIDB4N2QsIDB4ZTIsIDB4MjcsCisJMHhhMCwgMHg1NywgMHg4NSwgMHgyYiwgMHhjMiwgMHgzZCwgMHg0YiwgMHhlZSwgMHhlNywgMHg3MiwgMHhhZiwgMHhiOCwKKwkweGRlLCAweDYyLCAweGE4LCAweDdiLCAweDAzLCAweDcyLCAweDBmLCAweGVjLCAweGNiLCAweGJkLCAweGIwLCAweDJmLAorCTB4ZjcsIDB4NWQsIDB4NzMsIDB4MDcsIDB4ZGEsIDB4M2YsIDB4MDMsIDB4ZTgsIDB4MmEsIDB4MDQsIDB4OGQsIDB4MGUsCisJMHgxOSwgMHhhZCwgMHhkNCwgMHhiNywgMHhlNSwgMHgzZSwgMHhlZSwgMHg3YSwgMHhmYiwgMHhiNiwgMHhkYywgMHhkMywKKwkweDRkLCAweGFkLCAweGQ5LCAweDBiLCAweGE0LCAweDZjLCAweGI4LCAweDcyLCAweGM5LCAweGUxLCAweGJlLCAweDliLAorCTB4N2YsIDB4NmYsIDB4N2UsIDB4M2QsIDB4ZmMsIDB4MTUsIDB4NjgsIDB4ZjYsIDB4ZjcsIDB4OWMsIDB4NDMsIDB4ZTksCisJMHgyYiwgMHhjMiwgMHhmYiwgMHhmMywgMHhjNSwgMHgyOSwgMHhlMiwgMHg4MSwgMHg5OCwgMHhiYSwgMHgxNywgMHg2MywKKwkweGE4LCAweDdkLCAweDNlLCAweGFmLCAweDZkLCAweDcxLCAweDRhLCAweDlkLCAweDMxLCAweDE1LCAweGI4LCAweDc3LAorCTB4NmQsIDB4NmUsIDB4YjUsIDB4Y2MsIDB4ZDEsIDB4YTAsIDB4NzcsIDB4MWYsIDB4OTMsIDB4YmEsIDB4ZWMsIDB4ZDksCisJMHgzMiwgMHhjOCwgMHg2MiwgMHhiNSwgMHg3NiwgMHhjZiwgMHg3MSwgMHg1MCwgMHhkOSwgMHg4YiwgMHgyYiwgMHhkMCwKKwkweDAxLCAweGFlLCAweDE3LCAweGUyLCAweDA1LCAweGU4LCAweGM5LCAweDA0LCAweGVjLCAweDUzLCAweDVlLCAweGY1LAorCTB4MTcsIDB4YTEsIDB4NWMsIDB4NjQsIDB4YjIsIDB4NDEsIDB4NDMsIDB4YzIsIDB4YzcsIDB4MTksIDB4MGIsIDB4NzksCisJMHg3YiwgMHgyZCwgMHhiOSwgMHhhMCwgMHhhNSwgMHhlYywgMHgzNywgMHg2OCwgMHgwNywgMHgzZSwgMHhhMywgMHg3ZSwKKwkweDI2LCAweGM2LCAweDFiLCAweGQzLCAweDBkLCAweGYwLCAweGFiLCAweDU4LCAweGJmLCAweDJhLCAweGY3LCAweDA0LAorCTB4YTAsIDB4YmIsIDB4OGIsIDB4ZGYsIDB4OTEsIDB4N2QsIDB4YjMsIDB4ZGQsIDB4Y2QsIDB4OWUsIDB4ZmMsIDB4NzMsCisJMHgxZiwgMHg5OSwgMHhmMywgMHhmMywgMHg2OSwgMHg1OCwgMHhkZCwgMHhiNywgMHg3MSwgMHg1YywgMHgyMiwgMHg1MSwKKwkweGY4LCAweGI0LCAweDBmLCAweDIwLCAweGNlLCAweGQ4LCAweDAxLCAweDU5LCAweDU5LCAweDhhLCAweGIxLCAweDVmLAorCTB4NGYsIDB4NjcsIDB4MjYsIDB4NGIsIDB4ZWMsIDB4ZmIsIDB4M2IsIDB4MzIsIDB4MzQsIDB4NWIsIDB4NmEsIDB4YTYsCisJMHgyZiwgMHg1OSwgMHg4NCwgMHgxZCwgMHg1OCwgMHgzNiwgMHhlOSwgMHg0MywgMHhjNywgMHhlMCwgMHhlMywgMHhkYSwKKwkweGU1LCAweGZiLCAweGIzLCAweGY0LCAweDhmLCAweDQ5LCAweGYzLCAweDk0LCAweGY0LCAweGM2LCAweDRmLCAweDgxLAorCTB4YTYsIDB4Y2YsIDB4M2IsIDB4MjEsIDB4YzYsIDB4NjgsIDB4ZWUsIDB4MjAsIDB4Y2EsIDB4ZmUsIDB4NWMsIDB4OTIsCisJMHg2NiwgMHg2NywgMHg4MCwgMHhjZiwgMHhiZCwgMHhlNiwgMHgxNywgMHg4MCwgMHg2MSwgMHgzMywgMHg2NiwgMHhkMiwKKwkweGJjLCAweDM1LCAweDQwLCAweDM5LCAweDQyLCAweGNjLCAweGJkLCAweDU4LCAweGEzLCAweGYzLCAweDA3LCAweGIzLAorCTB4MmEsIDB4NGUsIDB4NTIsIDB4NzYsIDB4NjYsIDB4ZDEsIDB4ZTEsIDB4NzgsIDB4YTAsIDB4NWIsIDB4ZDksIDB4YWMsCisJMHg1YiwgMHg2MSwgMHg0ZiwgMHgyMiwgMHhmYSwgMHhmYywgMHgwZCwgMHg2ZCwgMHg4OCwgMHg2ZCwgMHg5YywgMHg5MCwKKwkweGNlLCAweDNmLCAweDJhLCAweGQ5LCAweDkzLCAweDMxLCAweGQ4LCAweDMzLCAweGY2LCAweGU1LCAweGM3LCAweDBlLAorCTB4ZjQsIDB4OTEsIDB4M2UsIDB4ZGUsIDB4YTYsIDB4YmYsIDB4YmIsIDB4MDMsIDB4N2UsIDB4ZWYsIDB4NjYsIDB4NDUsCisJMHhjZiwgMHhiMCwgMHhkMywgMHgyNywgMHgxMywgMHhjNywgMHgzOCwgMHg3NiwgMHgwZiwgMHg2YywgMHg3OSwgMHg1YywKKwkweGM5LCAweDZkLCAweGIxLCAweGI0LCAweDFjLCAweDhmLCAweGMwLCAweDI2LCAweDQ3LCAweGI2LCAweDkwLCAweDlmLAorCTB4ZWYsIDB4OTMsIDB4YmIsIDB4ZWMsIDB4MzEsIDB4YjksIDB4MWIsIDB4YjIsIDB4MzMsIDB4NjgsIDB4M2IsIDB4MzIsCisJMHg4NCwgMHhiNSwgMHhkOCwgMHg2MSwgMHhjMywgMHhlZiwgMHgyOCwgMHgwYywgMHhkZCwgMHg4OCwgMHhiOCwgMHg4YiwKKwkweDYzLCAweGI3LCAweGViLCAweGZiLCAweDE3LCAweDFlLCAweDdlLCAweGZjLCAweDRhLCAweGQ1LCAweGUzLCAweDUxLAorCTB4NzYsIDB4ZjYsIDB4NDksIDB4YzUsIDB4OWIsIDB4NjEsIDB4NjcsIDB4OWIsIDB4ZjYsIDB4YjMsIDB4MmQsIDB4OTIsCisJMHg1MywgMHhmNSwgMHhiNiwgMHgyOSwgMHg3ZiwgMHg1YywgMHg1YywgMHhiOCwgMHgxZiwgMHgyOSwgMHg3YywgMHhmMywKKwkweDAyLCAweGVjLCAweDBkLCAweDMwLCAweDc3LCAweGIxLCAweGIyLCAweDE1LCAweDc5LCAweGY4LCAweGQwLCAweDg1LAorCTB4MzQsIDB4ZDIsIDB4ZjcsIDB4MjEsIDB4NjUsIDB4ZGQsIDB4MDcsIDB4OWEsIDB4YmQsIDB4YmQsIDB4ZGMsIDB4YjUsCisJMHhmNywgMHhiOCwgMHgyNCwgMHhmMCwgMHgwMSwgMHg4NSwgMHg0YiwgMHhhZiwgMHhhOCwgMHgzYiwgMHg4MCwgMHg4OCwKKwkweGExLCAweDQ3LCAweGIyLCAweGIwLCAweDJiLCAweGNkLCAweGMwLCAweDQwLCAweDUzLCAweGM3LCAweGFkLCAweGQ0LAorCTB4NTAsIDB4NjAsIDB4YmIsIDB4N2MsIDB4MTAsIDB4YjEsIDB4N2MsIDB4ZDksIDB4ZTEsIDB4NWEsIDB4NmUsIDB4OTUsCisJMHgwNywgMHhkZiwgMHg0YiwgMHgxOSwgMHhkOSwgMHgyZSwgMHg3YiwgMHhkZSwgMHgxYiwgMHg5MCwgMHgzZCwgMHg3ZCwKKwkweDU2LCAweDg2LCAweDc0LCAweGRmLCAweGYyLCAweDJlLCAweDNmLCAweDllLCAweGVlLCAweDFhLCAweDRlLCAweDA2LAorCTB4ZmEsIDB4ZTUsIDB4MGIsIDB4OTAsIDB4YjEsIDB4MDIsIDB4ZTQsIDB4NmIsIDB4YTgsIDB4NGEsIDB4OWUsIDB4ZDMsCisJMHhkZSwgMHhkMywgMHhjZSwgMHhhNywgMHg4MCwgMHg5NSwgMHg3ZCwgMHhlYywgMHg2NywgMHhjYiwgMHg1NCwgMHhiNSwKKwkweDQxLCAweDEyLCAweDM3LCAweDcwLCAweDNmLCAweDM5LCAweGUxLCAweDlkLCAweDcxLCAweGRjLCAweDQwLCAweDk5LAorCTB4NDAsIDB4MGMsIDB4NzIsIDB4ODMsIDB4YTcsIDB4OWYsIDB4ZWEsIDB4ZWUsIDB4ZGQsIDB4MGQsIDB4OWUsIDB4NWYsCisJMHg0MSwgMHhmYywgMHhlYiwgMHgxMiwgMHhlNywgMHg3OSwgMHg3NywgMHgwZCwgMHhiZSwgMHhhMSwgMHg2ZCwgMHg2OSwKKwkweDY4LCAweGUzLCAweDBhLCAweGJlLCAweDZiLCAweDYxLCAweGZjLCAweGYwLCAweDg3LCAweGNkLCAweGI1LCAweDZmLAorCTB4MDcsIDB4ZDYsIDB4Y2EsIDB4YTIsIDB4YmYsIDB4ZWYsIDB4MzYsIDB4ODcsIDB4MzksIDB4ZDMsIDB4YTcsIDB4NWIsCisJMHgyNiwgMHg2ZCwgMHg2MSwgMHhhYiwgMHhiZCwgMHg0YiwgMHhmZSwgMHgwYywgMHhmZSwgMHhmZCwgMHg2YiwgMHgyYiwKKwkweGZlLCAweDdkLCAweDM3LCAweGY4LCAweGIxLCAweDE2LCAweDAzLCAweGQ4LCAweGU2LCAweDNkLCAweDk4LCAweGNiLAorCTB4MzAsIDB4ZDYsIDB4ZjMsIDB4NmUsIDB4ZmMsIDB4ZWUsIDB4MmEsIDB4YWQsIDB4ZGEsIDB4YzcsIDB4OWIsIDB4MjksCisJMHgwMCwgMHg0ZiwgMHgzNiwgMHhkOCwgMHhlYywgMHg2ZiwgMHhkNSwgMHg3ZSwgMHg1ZSwgMHgyMSwgMHgyZiwgMHgyYiwKKwkweDdiLCAweDg1LCAweDAzLCAweDU3LCAweDg1LCAweDdlLCAweGVmLCAweDc1LCAweDA5LCAweDc3LCAweGRiLCAweGFmLAorCTB4NzcsIDB4MDYsIDB4ZWMsIDB4ZTcsIDB4OGQsIDB4MDAsIDB4Y2YsIDB4YzEsIDB4MWQsIDB4MzksIDB4NWQsIDB4MjUsCisJMHgwZSwgMHhiYiwgMHgyOCwgMHhjNiwgMHg1OSwgMHg2MiwgMHhiMCwgMHg5NywgMHhkNSwgMHgxZSwgMHg1NCwgMHhiOSwKKwkweGY0LCAweDJkLCAweGE0LCAweGE4LCAweDBmLCAweGZiLCAweDE4LCAweGY0LCAweGY2LCAweDI5LCAweDE0LCAweDU2LAorCTB4YTEsIDB4OWQsIDB4YmQsIDB4MWIsIDB4ZWIsIDB4MzAsIDB4ODEsIDB4NWYsIDB4ZTcsIDB4OTYsIDB4NWIsIDB4YTEsCisJMHhiZiwgMHg5NCwgMHg1MywgMHhlZSwgMHg3ZCwgMHg3NSwgMHg5YiwgMHg1YiwgMHgwMiwgMHg3YywgMHhiNywgMHhkZSwKKwkweDNlLCAweGQ4LCAweGI3LCAweDI1LCAweDc0LCAweDE0LCAweGJlLCAweGNlLCAweGEwLCAweDdkLCAweGUwLCAweDNjLAorCTB4ZTgsIDB4MjcsIDB4NGQsIDB4OTksIDB4M2YsIDB4NDYsIDB4NWQsIDB4NWYsIDB4YWYsIDB4YmUsIDB4NWYsIDB4ZDcsCisJMHg5ZiwgMHg4YiwgMHhmMiwgMHgxYiwgMHg5OSwgMHgzYywgMHhmNywgMHgzOCwgMHg0YiwgMHg1YywgMHgwMywgMHgwNywKKwkweDZiLCAweGUwLCAweGNhLCAweDcxLCAweGE3LCAweDk1LCAweDM2LCAweDVkLCAweDgyLCAweGM3LCAweDVkLCAweDE5LAorCTB4NTQsIDB4ZDgsIDB4YjUsIDB4MTcsIDB4OTgsIDB4NmIsIDB4YTMsIDB4YzYsIDB4MGQsIDB4MzEsIDB4MDksIDB4MWQsCisJMHhlZiwgMHg5MCwgMHg0NiwgMHhlMCwgMHhlYSwgMHg4NiwgMHgyMywgMHhmNCwgMHg5MSwgMHhjOSwgMHhjNCwgMHgyMCwKKwkweDg0LCAweDIwLCAweGE0LCAweGVlLCAweDkzLCAweDVhLCAweDAzLCAweGRmLCAweDk3LCAweGRlLCAweGM0LCAweGY3LAorCTB4ODUsIDB4NzgsIDB4ZTksIDB4NTEsIDB4YWMsIDB4OWYsIDB4ZTUsIDB4NWMsIDB4NWMsIDB4YTcsIDB4N2UsIDB4YjEsCisJMHg1NiwgMHgxZiwgMHg3MiwgMHhjNCwgMHhiZCwgMHgzNSwgMHhiNiwgMHhlMSwgMHg1ZSwgMHg1YiwgMHg3MiwgMHhlMCwKKwkweDdiLCAweGRjLCAweDYzLCAweDQzLCAweGFjLCAweGQ5LCAweDcwLCAweGM2LCAweGEzLCAweGMxLCAweDU4LCAweDZjLAorCTB4OTMsIDB4ZjIsIDB4NDksIDB4ZWEsIDB4MjgsIDB4ZjcsIDB4NTksIDB4NGMsIDB4MmYsIDB4NGUsIDB4MmQsIDB4MzEsCisJMHg1ZSwgMHhlNSwgMHhmYiwgMHg4NCwgMHg3ZSwgMHhkZiwgMHhhOSwgMHhkZiwgMHgzMywgMHgxZSwgMHgyZCwgMHhiOCwKKwkweDBkLCAweGUwLCAweGU5LCAweDBlLCAweGQ4LCAweGNmLCAweGZiLCAweGI3LCAweGRhLCAweDBhLCAweDM3LCAweGRjLAorCTB4YmYsIDB4YjIsIDB4NjYsIDB4M2IsIDB4ZDUsIDB4ZGQsIDB4YTIsIDB4NzIsIDB4ZTksIDB4YTAsIDB4ZDgsIDB4NWIsCisJMHg5NiwgMHg1MiwgMHgyMSwgMHgxOSwgMHhjNSwgMHg1YSwgMHgzMCwgMHg5ZiwgMHgyMSwgMHgzZCwgMHhhOSwgMHg0MywKKwkweGIyLCAweDVmLCAweGFkLCAweDRkLCAweGY5LCAweDk4LCAweDc1LCAweDM4LCAweDExLCAweDk4LCAweDEwLCAweGEzLAorCTB4Y2MsIDB4ZTcsIDB4NGYsIDB4MjMsIDB4M2QsIDB4MDQsIDB4YmMsIDB4ZTMsIDB4ZWQsIDB4NWQsIDB4MWEsIDB4ZTUsCisJMHhkNSwgMHhiYywgMHgwNCwgMHhjNiwgMHgzMCwgMHg3NywgMHhhYywgMHhkYSwgMHhjNywgMHhhYSwgMHhlZCwgMHg3MSwKKwkweGYxLCAweGZkLCAweGEwLCAweDdhLCAweDlmLCAweDVhLCAweGI1LCAweGNmLCAweDk1LCAweDMzLCAweDg4LCAweDY1LAorCTB4ZmMsIDB4ZjcsIDB4NWMsIDB4MGIsIDB4YWUsIDB4MTcsIDB4N2MsIDB4ZjEsIDB4MzEsIDB4N2YsIDB4Y2YsIDB4YWIsCisJMHg0NSwgMHhhZiwgMHgwYiwgMHhkNywgMHg2NywgMHg0YSwgMHhjZSwgMHg5OSwgMHhkNiwgMHgzMCwgMHhlNSwgMHhlZiwKKwkweGI2LCAweGFkLCAweDM3LCAweGM5LCAweDc4LCAweDNiLCAweGY3LCAweGRiLCAweGVhLCAweDY5LCAweDU4LCAweGJiLAorCTB4OGYsIDB4NTYsIDB4M2YsIDB4ZmUsIDB4ZGEsIDB4ZmQsIDB4MzcsIDB4OGUsIDB4ZWQsIDB4ZWQsIDB4YjEsIDB4NjUsCisJMHg1NywgMHhlZCwgMHhiMSwgMHhkNSwgMHg4ZiwgMHhjNywgMHhiMSwgMHgzNiwgMHgyMiwgMHg3ZSwgMHgyYSwgMHhiOCwKKwkweDMxLCAweDliLCAweDZiLCAweGQ0LCAweDk1LCAweDk4LCAweDY1LCAweGZlLCAweGNiLCAweDA2LCAweGQ2LCAweDMxLAorCTB4MDYsIDB4M2YsIDB4YzIsIDB4YjUsIDB4ZjQsIDB4Y2YsIDB4OWUsIDB4YjksIDB4YTYsIDB4YzksIDB4YzQsIDB4MjEsCisJMHg2ZiwgMHgzZCwgMHgwNywgMHhiYywgMHg3NSwgMHhmNywgMHhkNiwgMHhmZiwgMHhlMiwgMHhjYSwgMHgzYSwgMHhkMiwKKwkweDNmLCAweDcwLCAweDFkLCAweGRiLCAweDQ1LCAweDYwLCAweDY3LCAweDhkLCAweDIzLCAweDVjLCAweDQzLCAweGE2LAorCTB4NWMsIDB4NDMsIDB4YmUsIDB4ZTMsIDB4MWEsIDB4NzYsIDB4ZWEsIDB4NzcsIDB4NWMsIDB4M2YsIDB4ZTAsIDB4YjQsCisJMHgyZiwgMHgwMiwgMHg2MywgMHgzOCwgMHg1OSwgMHhmNSwgMHgxZCwgMHg1NCwgMHg2NywgMHhiNywgMHhhZiwgMHg4YiwKKwkweDI5LCAweDc5LCAweDY2LCAweDNlLCAweDJhLCAweDY2LCAweGRhLCAweDliLCAweGQ3LCAweGQ4LCAweGFhLCAweGZkLAorCTB4NzYsIDB4OWUsIDB4NWYsIDB4ZjUsIDB4MTEsIDB4N2IsIDB4ZmEsIDB4ZjMsIDB4OGEsIDB4NzMsIDB4NWUsIDB4ZmIsCisJMHhlNSwgMHhiMiwgMHhlNCwgMHhhNywgMHg0MiwgMHg4OCwgMHgwMSwgMHg1MywgMHhjMCwgMHgzOSwgMHg3ZCwgMHhiMCwKKwkweGI3LCAweGRjLCAweDFmLCAweDQ1LCAweDU5LCAweDg1LCAweDc4LCAweDg1LCAweGJlLCAweDJlLCAweDA1LCAweDVkLAorCTB4YTEsIDB4MGQsIDB4MjYsIDB4MWUsIDB4NzksIDB4NTUsIDB4NzIsIDB4NzMsIDB4YmUsIDB4OGQsIDB4NDEsIDB4ZmYsCisJMHg4NiwgMHhkZiwgMHgzZiwgMHhmOSwgMHg5YywgMHhiOSwgMHg2NSwgMHhiMywgMHgyYywgMHgyNSwgMHgzNiwgMHg4YiwKKwkweDk1LCAweDU4LCAweDkwLCAweGRhLCAweGJhLCAweDhlLCAweGFkLCAweGNmLCAweDc3LCAweGU3LCAweGZlLCAweDYwLAorCTB4NGQsIDB4MzYsIDB4YzYsIDB4ZDYsIDB4NTksIDB4ZmIsIDB4YmQsIDB4ZTIsIDB4YmYsIDB4ZjcsIDB4ZDcsIDB4N2UsCisJMHhkZCwgMHg3NSwgMHgyOCwgMHhiYywgMHgyMiwgMHg1YywgMHgwYiwgMHhmMiwgMHg4MCwgMHg3OCwgMHgzOCwgMHgyYywKKwkweDlmLCAweDhhLCAweDUxLCAweDFmLCAweDBiLCAweGVhLCAweDdjLCAweDMzLCAweDY5LCAweDc0LCAweDJiLCAweDliLAorCTB4MzEsIDB4ZTgsIDB4NzgsIDB4ZjIsIDB4NWEsIDB4YzAsIDB4MzgsIDB4OTEsIDB4YWUsIDB4N2YsIDB4ZTEsIDB4MGUsCisJMHhjNiwgMHgxMCwgMHhlNywgMHg3NiwgMHhkMSwgMHhiZSwgMHhmOCwgMHgzYSwgMHgxZCwgMHg1NSwgMHgzYSwgMHhmZCwKKwkweDc5LCAweDI3LCAweDIwLCAweDQ1LCAweDNiLCAweDIwLCAweDEzLCAweGY2LCAweDQxLCAweDg1LCAweGYxLCAweDNmLAorCTB4ODQsIDB4YmUsIDB4MWUsIDB4ZDQsIDB4N2QsIDB4NGQsIDB4NDgsIDB4YjcsIDB4YjYsIDB4M2YsIDB4MDcsIDB4MjAsCisJMHhlNywgMHhhZSwgMHhkYywgMHhlNywgMHg2YywgMHg5NSwgMHhkYiwgMHg1YSwgMHhhOSwgMHgwMywgMHhmZSwgMHhmYywKKwkweDBmLCAweDRhLCAweGQ3LCAweGQ2LCAweGE1LCAweDA0LCAweDIyLCAweDgzLCAweDViLCAweGMyLCAweDJiLCAweDNjLAorCTB4YTAsIDB4OWUsIDB4ZjksIDB4ZjIsIDB4ZWQsIDB4ZjEsIDB4YzEsIDB4OWIsIDB4ZmYsIDB4YWEsIDB4YjksIDB4ZWEsCisJMHg3OSwgMHg3MiwgMHhjZSwgMHhhYywgMHhjNywgMHhiOSwgMHg3YSwgMHg1OCwgMHhiZSwgMHgzNiwgMHg1NywgMHhiZiwKKwkweDdlLCAweDMzLCAweDY0LCAweGM5LCAweDRhLCAweDQ4LCAweGEwLCAweDllLCAweDM3LCAweDJiLCAweDM2LCAweDZhLAorCTB4OTgsIDB4N2IsIDB4MjQsIDB4NGIsIDB4YTYsIDB4OTUsIDB4NGEsIDB4MDQsIDB4ZmMsIDB4YmQsIDB4NjgsIDB4MGYsCisJMHhlYiwgMHg3NiwgMHgwMiwgMHg4NywgMHhkYiwgMHhkZCwgMHhkZCwgMHhhOSwgMHhiYywgMHhkYSwgMHgyMywgMHgzNSwKKwkweGQ0LCAweGJjLCAweDI2LCAweDgwLCAweGM5LCAweGU2LCAweDlkLCAweDU3LCAweGRjLCAweDRmLCAweDAyLCAweGIzLAorCTB4OGUsIDB4Y2IsIDB4YzMsIDB4MTIsIDB4NWMsIDB4YjUsIDB4OTcsIDB4OGIsIDB4ZmMsIDB4NTksIDB4ZWUsIDB4ZTcsCisJMHg1YSwgMHg4OSwgMHgwYywgMHhkNiwgMHhmOCwgMHhjMywgMHg4OCwgMHhlMSwgMHhjYiwgMHhiMCwgMHhmYiwgMHgxZiwKKwkweGExLCAweDZmLCAweDI4LCAweGMxLCAweDVmLCAweDAwLCAweDk3LCAweDdjLCAweGVkLCAweGJhLCAweDE4LCAweDdlLAorCTB4YmMsIDB4NmUsIDB4MmYsIDB4ZDcsIDB4YzMsIDB4YTcsIDB4ZTcsIDB4MTQsIDB4MjYsIDB4MjUsIDB4NmUsIDB4M2YsCisJMHgxYywgMHhiOCwgMHhhNywgMHgyNywgMHg4OCwgMHgzOCwgMHhhMywgMHhlMCwgMHg0NiwgMHg2YywgMHhlMiwgMHhiOCwKKwkweDgzLCAweDcyLCAweDE3LCAweGQ2LCAweGU3LCAweGY0LCAweDdjLCAweDIxLCAweGIwLCAweGEzLCAweGU0LCAweGNiLAorCTB4MmEsIDB4ZTIsIDB4Y2EsIDB4YWEsIDB4OTUsIDB4NWEsIDB4MDYsIDB4M2YsIDB4OWUsIDB4ZDQsIDB4OTgsIDB4OGYsCisJMHhlNywgMHgzNSwgMHg2NSwgMHgxZCwgMHhiMywgMHg3MCwgMHg2ZiwgMHhhOCwgMHg1OCwgMHgzZCwgMHgyOCwgMHg5MywKKwkweDBlLCAweGY3LCAweDc2LCAweGJhLCAweGE0LCAweDE4LCAweGNiLCAweGRjLCAweGQ0LCAweGI4LCAweGMyLCAweDIzLAorCTB4Y2IsIDB4NDQsIDB4Y2MsIDB4OTcsIDB4YTIsIDB4ZmQsIDB4MmUsIDB4ZWIsIDB4ZjMsIDB4OGUsIDB4MjcsIDB4OTUsCisJMHg3YywgMHhmOSwgMHhmYiwgMHhjMiwgMHg4YywgMHg4ZiwgMHg3OCwgMHg1ZSwgMHhkNSwgMHg2NSwgMHgwZSwgMHhmMywKKwkweDc5LCAweDhlLCAweDMyLCAweGEwLCAweDYyLCAweDI2LCAweGYwLCAweGYyLCAweDIxLCAweGM5LCAweDhjLCAweDI2LAorCTB4MTQsIDB4NmUsIDB4NzksIDB4YmMsIDB4NDQsIDB4N2QsIDB4MjEsIDB4ZmUsIDB4YmYsIDB4MGMsIDB4ZWMsIDB4MWYsCisJMHhjMiwgMHg5YSwgMHgzMSwgMHgwZSwgMHhlMCwgMHhkOCwgMHhkNCwgMHgwYiwgMHg5NCwgMHg1NSwgMHhjYywgMHg1ZiwKKwkweGEyLCAweDE3LCAweGRiLCAweDM3LCAweDExLCAweDYzLCAweDVjLCAweDI4LCAweDdkLCAweDVjLCAweGYxLCAweDZmLAorCTB4NDksIDB4ZmMsIDB4YmQsIDB4NzMsIDB4ODUsIDB4MDUsIDB4MGIsIDB4ZDksIDB4NjAsIDB4NDAsIDB4OTIsIDB4NDcsCisJMHgzZiwgMHgwMywgMHgxOSwgMHgxYSwgMHg0MSwgMHg4YywgMHhjNCwgMHg3YSwgMHhhMiwgMHhjZSwgMHhhZiwgMHgwNiwKKwkweDgxLCAweGI5LCAweDBjLCAweGZiLCAweDQ2LCAweDI5LCAweDlhLCAweDYxLCAweDI5LCAweGFhLCAweDdiLCAweDgwLAorCTB4M2MsIDB4Y2YsIDB4MGQsIDB4YWEsIDB4YmQsIDB4OWQsIDB4YTIsIDB4NDksIDB4Y2MsIDB4OWYsIDB4ZDksIDB4ZTQsCisJMHhkZiwgMHgwMywgMHgyYywgMHg5YSwgMHg2YywgMHhjNywgMHgzYywgMHhjYiwgMHgyNywgMHgyNCwgMHg3YywgMHhmNCwKKwkweDgwLCAweDM0LCAweDFjLCAweDdkLCAweDU4LCAweDFhLCAweGE3LCAweDg5LCAweGYxLCAweGI4LCAweDc3LCAweDZmLAorCTB4ZGMsIDB4ZDEsIDB4MjgsIDB4YzQsIDB4ZGMsIDB4NWYsIDB4YzUsIDB4ZDgsIDB4MDcsIDB4ZTUsIDB4ODcsIDB4OGUsCisJMHg0ZiwgMHhkMywgMHg4NiwgMHg4ZCwgMHhkMiwgMHhjMiwgMHgzYSwgMHg3ZSwgMHhkZSwgMHhjNywgMHhlMywgMHg3NywKKwkweDgwLCAweDFlLCAweGNlLCAweDNmLCAweGExLCAweDcxLCAweGRmLCAweDFkLCAweDc1LCAweGIxLCAweDZiLCAweDgzLAorCTB4OGUsIDB4NWQsIDB4ZDksIDB4ZWUsIDB4MzIsIDB4N2MsIDB4ZjYsIDB4MzEsIDB4MDksIDB4ZGIsIDB4N2UsIDB4ZmIsCisJMHhlZCwgMHhhOCwgMHgxNywgMHhhZiwgMHhiYiwgMHgwMywgMHhjMSwgMHgzYSwgMHhmYSwgMHg0ZSwgMHg0MCwgMHgwYiwKKwkweDcxLCAweDBmLCAweGNmLCAweGRiLCAweDU5LCAweGU2LCAweDlkLCAweGY5LCAweDFiLCAweGU1LCAweDc0LCAweDcwLAorCTB4ZjUsIDB4ZjgsIDB4ZGIsIDB4ZWEsIDB4ZWEsIDB4ZmEsIDB4NjUsIDB4N2UsIDB4OWIsIDB4YjAsIDB4MTcsIDB4ZjMsCisJMHhmNywgMHg4NywgMHhlYiwgMHhkYSwgMHg3ZCwgMHhkNywgMHhmNCwgMHg1MiwgMHgyZiwgMHhmNiwgMHhmMCwgMHhlMiwKKwkweDIwLCAweGNlLCAweDIxLCAweDU1LCAweDg3LCAweDczLCAweDU2LCAweDdmLCAweDJmLCAweDlhLCAweDQzLCAweDc5LAorCTB4N2UsIDB4ZDYsIDB4YmYsIDB4M2IsIDB4NjQsIDB4NjAsIDB4MmUsIDB4NTYsIDB4ODEsIDB4ZjEsIDB4OGIsIDB4YzksCisJMHg2ZiwgMHgzMywgMHg2NywgMHgwYiwgMHhhMCwgMHhmYiwgMHg2NiwgMHg3NSwgMHhlZiwgMHg4OCwgMHg3NywgMHgzNywKKwkweDUwLCAweDJmLCAweGUxLCAweGUxLCAweDRmLCAweGU2LCAweGUzLCAweDU4LCAweGYzLCAweDc3LCAweDc1LCAweDE4LAorCTB4ZTksIDB4ZmYsIDB4N2UsIDB4NTMsIDB4YjYsIDB4OWYsIDB4ZjgsIDB4NjYsIDB4MTMsIDB4Y2YsIDB4MjEsIDB4ODEsCisJMHg5YiwgMHgyOSwgMHg2NywgMHhkZiwgMHg4MSwgMHg5YywgMHgzNSwgMHhhYSwgMHg3MywgMHg5ZiwgMHg2MiwgMHg4OSwKKwkweGYxLCAweDVjLCAweDFlLCAweGYyLCAweGMzLCAweGZiLCAweDdiLCAweDhjLCAweGZiLCAweGYyLCAweDdhLCAweDNmLAorCTB4OTYsIDB4NzQsIDB4MTIsIDB4ZDMsIDB4ZmIsIDB4ZjEsIDB4MDEsIDB4ZmIsIDB4NWMsIDB4ZWYsIDB4OWUsIDB4YjIsCisJMHgxZiwgMHhiMywgMHg1MSwgMHhkZSwgMHhlMiwgMHg4YSwgMHhlNiwgMHhhMSwgMHgzNSwgMHhmMSwgMHhjYSwgMHgyMSwKKwkweGQ4LCAweDgyLCAweDc5LCAweGM4LCAweGYzLCAweDVlLCAweGQ4LCAweGMwLCAweGMxLCAweDIwLCAweGY1LCAweDMzLAorCTB4YWEsIDB4NjMsIDB4NTksIDB4OWIsIDB4NzEsIDB4N2IsIDB4NjAsIDB4MTQsIDB4N2QsIDB4MTgsIDB4ZDMsIDB4YWYsCisJMHhjOSwgMHgwNCwgMHhlYywgMHhmZiwgMHg2NCwgMHgzNSwgMHhhOSwgMHhiZSwgMHhlOSwgMHhjOSwgMHhjNCwgMHg3OSwKKwkweDlmLCAweDhjLCAweGU1LCAweDVmLCAweDgzLCAweGJjLCAweGJlLCAweDA2LCAweDNjLCAweGJjLCAweDAxLCAweGZjLAorCTB4MzQsIDB4ZjQsIDB4NWEsIDB4ZmQsIDB4OTYsIDB4ZGUsIDB4OGIsIDB4OGEsIDB4NzAsIDB4MmYsIDB4MWUsIDB4NzYsCisJMHhiMywgMHhlOCwgMHg2MSwgMHhjZCwgMHhkOCwgMHgyNCwgMHhkMiwgMHg3ZiwgMHgxZSwgMHhmNSwgMHhlNCwgMHhmNSwKKwkweGRmLCAweDZhLCAweDc5LCAweDZiLCAweDQyLCAweGY5LCAweDYzLCAweDZhLCAweDBmLCAweGQyLCAweDliLCAweDkzLAorCTB4YTUsIDB4NjMsIDB4OTUsIDB4MzAsIDB4NjQsIDB4OGUsIDB4ZjMsIDB4ZmEsIDB4NTMsIDB4ZDQsIDB4YTMsIDB4YWMsCisJMHhmNSwgMHhlOCwgMHhiMywgMHhkOSwgMHhhOCwgMHhiMiwgMHg4ZiwgMHgzOSwgMHhjOCwgMHg1MiwgMHg1ZSwgMHhjNSwKKwkweDExLCAweGMwLCAweGY3LCAweDBlLCAweGRiLCAweDNkLCAweGI3LCAweDg5LCAweDY3LCAweDlmLCAweDBkLCAweGI2LAorCTB4OGEsIDB4MmQsIDB4ZGEsIDB4ODMsIDB4ZTIsIDB4OTcsIDB4ZGQsIDB4ODksIDB4MzIsIDB4Y2EsIDB4ZDksIDB4OGQsCisJMHg1OCwgMHgxYiwgMHg5NiwgMHg2NSwgMHg5MSwgMHhlNywgMHg1OCwgMHgzNywgMHhlOSwgMHg3MSwgMHgzOCwgMHg0NiwKKwkweDc3LCAweGYzLCAweDZhLCAweDlhLCAweDM4LCAweDk3LCAweGY2LCAweDM1LCAweGRmLCAweDM1LCAweGIwLCAweGVjLAorCTB4NDYsIDB4NWQsIDB4MTYsIDB4ZDIsIDB4ZjMsIDB4MWIsIDB4ZDIsIDB4ZGYsIDB4ZDIsIDB4NWEsIDB4ODcsIDB4MzMsCisJMHgyYiwgMHhkOCwgMHg5OCwgMHhmNCwgMHg0NSwgMHg1NCwgMHhiYiwgMHg4YywgMHhlOSwgMHhjOSwgMHhjZSwgMHgyMSwKKwkweGFjLCAweDQ3LCAweDI4LCAweDFkLCAweGU0LCAweDk5LCAweDJjLCAweGY4LCAweGViLCAweGViLCAweDQ0LCAweDVjLAorCTB4YzUsIDB4OWQsIDB4MDksIDB4YzMsIDB4YmIsIDB4YmIsIDB4NzQsIDB4ZWUsIDB4OWEsIDB4ZmIsIDB4ZDksIDB4ZGUsCisJMHg1ZCwgMHhmNywgMHhhMSwgMHg5ZSwgMHgyNiwgMHg5OSwgMHg5ZiwgMHg4OSwgMHhlOCwgMHg3YiwgMHg5MywgMHg3MSwKKwkweGE1LCAweGIzLCAweGY5LCAweDMxLCAweGU2LCAweGZmLCAweGM3LCAweDI2LCAweDdlLCAweGM3LCAweDZjLCAweGQ4LAorCTB4MmMsIDB4NmYsIDB4ZDcsIDB4ZmMsIDB4YmQsIDB4NTEsIDB4ZGQsIDB4MzMsIDB4YTIsIDB4MmUsIDB4MTQsIDB4ZTcsCisJMHhkZSwgMHg1MCwgMHhlZiwgMHg0ZiwgMHhjZiwgMHgzNiwgMHhhOCwgMHhmYSwgMHhhNywgMHg2NywgMHhkNywgMHhkZSwKKwkweDE1LCAweDYyLCAweGQ5LCAweGRiLCAweGI4LCAweGJmLCAweDIxLCAweDBiLCAweDUzLCAweDBkLCAweGIyLCAweDM4LAorCTB4MWIsIDB4NjAsIDB4YmMsIDB4OTYsIDB4NmUsIDB4YWMsIDB4N2QsIDB4MGIsIDB4YTMsIDB4YmYsIDB4NWIsIDB4NzMsCisJMHg2NSwgMHgwOCwgMHhlYiwgMHgzNywgMHgzZiwgMHgzMCwgMHgyOSwgMHhlNSwgMHgwMSwgMHhjNiwgMHgyMywgMHhlYSwKKwkweDNlLCAweDIwLCAweDY0LCAweGE0LCAweDAxLCAweDU4LCAweGI0LCAweGUwLCAweDk2LCAweDZkLCAweGVlLCAweDAzLAorCTB4YjcsIDB4NjgsIDB4YmQsIDB4N2UsIDB4NDUsIDB4YzcsIDB4N2MsIDB4ZTQsIDB4OTEsIDB4MjEsIDB4YjksIDB4YmUsCisJMHgwOSwgMHg0NSwgMHg1NywgMHg1OSwgMHhmMSwgMHhjYSwgMHhmZiwgMHhkNiwgMHg4OCwgMHhmZCwgMHhmMywgMHg3YiwKKwkweGEzLCAweGEwLCAweGM2LCAweGIyLCAweGZiLCAweDM1LCAweGNmLCAweGZmLCAweDRhLCAweGE3LCAweDhmLCAweGNhLAorCTB4OWUsIDB4NjMsIDB4YmYsIDB4MGYsIDB4NWEsIDB4OWIsIDB4YmMsIDB4M2IsIDB4NGYsIDB4NTIsIDB4ZmYsIDB4M2QsCisJMHg0OSwgMHg0OCwgMHg3ZCwgMHhjZiwgMHgxMiwgMHhiMiwgMHgxZiwgMHg0NSwgMHgxOSwgMHhmNywgMHhjMSwgMHgxZSwKKwkweDU1LCAweGYzLCAweGUwLCAweGJkLCAweGJhLCAweDgyLCAweGZjLCAweGFhLCAweGZiLCAweDIxLCAweDdlLCAweDJjLAorCTB4YzYsIDB4YmIsIDB4NGIsIDB4NTEsIDB4ZGQsIDB4ZGYsIDB4MGUsIDB4YmQsIDB4OGUsIDB4NjMsIDB4YjIsIDB4MDcsCisJMHhiZSwgMHgyNiwgMHgwZiwgMHg0YywgMHhjYSwgMHhmYiwgMHg1ZSwgMHhlMywgMHhjMSwgMHhmYSwgMHgzMSwgMHg3ZCwKKwkweDU5LCAweGY2LCAweGUyLCAweDdjLCAweGZmLCAweGRlLCAweDQxLCAweDUwLCAweGM1LCAweDIzLCAweDJiLCAweDdiLAorCTB4MDYsIDB4YmEsIDB4N2MsIDB4NGMsIDB4ZjYsIDB4OTUsIDB4ZDQsIDB4ZGUsIDB4ODEsIDB4M2EsIDB4MmYsIDB4OWMsCisJMHg4NCwgMHg0ZSwgMHgwZSwgMHgyYSwgMHg3ZiwgMHgxMiwgMHgwOSwgMHgwYywgMHg1NSwgMHhkMiwgMHg5MiwgMHgzZiwKKwkweGI5LCAweDEzLCAweGUzLCAweDcwLCAweDFmLCAweDJlLCAweGEzLCAweGNmLCAweGU1LCAweDc2LCAweGNiLCAweDllLAorCTB4YWEsIDB4MzcsIDB4ZjYsIDB4ZGUsIDB4MTIsIDB4ZGYsIDB4MjcsIDB4ZTEsIDB4YTMsIDB4ZjksIDB4M2UsIDB4MTcsCisJMHgwZiwgMHhhYSwgMHg5MywgMHg4NSwgMHg1YiwgMHhkMSwgMHhiNiwgMHg0MSwgMHhmMywgMHg5NiwgMHhmNywgMHhmYywKKwkweGQ5LCAweDllLCAweGZhLCAweGY3LCAweDRmLCAweDRjLCAweDg5LCAweGU2LCAweGYwLCAweDllLCAweDZkLCAweGZjLAorCTB4ZmUsIDB4ZjYsIDB4YzIsIDB4NjcsIDB4MzAsIDB4MzYsIDB4N2UsIDB4NDQsIDB4OTYsIDB4ZTYsIDB4MjYsIDB4NjUsCisJMHg3OSwgMHhjZSwgMHg5NywgMHgzMywgMHhkZSwgMHhiOSwgMHgyNiwgMHhlZCwgMHg3NywgMHhlYiwgMHgzYiwgMHhkNywKKwkweDE5LCAweGFjLCAweGMzLCAweDZhLCAweDVlLCAweGU1LCAweDU2LCAweDdkLCAweDhmLCAweGY0LCAweDc1LCAweGQzLAorCTB4ZmIsIDB4MjYsIDB4NzAsIDB4YmIsIDB4YmEsIDB4M2YsIDB4YjUsIDB4NWEsIDB4ZGUsIDB4ZDksIDB4Y2YsIDB4NTcsCisJMHg0YywgMHg5ZSwgMHgzMywgMHg3OCwgMHg3NywgMHhjMCwgMHhkYSwgMHhlYiwgMHhkZSwgMHhjNywgMHhmNCwgMHhiZCwKKwkweGFiLCAweGFmLCAweGU5LCAweGJiLCAweGZhLCAweGU0LCAweGU3LCAweGE4LCAweGE2LCAweGY3LCAweDU2LCAweGU4LAorCTB4MWUsIDB4ZmIsIDB4N2MsIDB4NGMsIDB4YWYsIDB4MWIsIDB4ZDIsIDB4NzksIDB4M2UsIDB4YWIsIDB4YmIsIDB4YTYsCisJMHhmYSwgMHhlYywgMHhkNSwgMHhkNCwgMHg2MywgMHhkNCwgMHhkZiwgMHg3YiwgMHg2YiwgMHhhOCwgMHgxYiwgMHg5NywKKwkweGVkLCAweGU5LCAweDFiLCAweGZjLCAweDNiLCAweGUwLCAweDJjLCAweDNiLCAweGE2LCAweGVmLCAweGQ3LCAweGY5LAorCTB4NzcsIDB4YmUsIDB4NTksIDB4ZTYsIDB4ZGYsIDB4MDMsIDB4MjMsIDB4YmYsIDB4YjgsIDB4OWYsIDB4ODgsIDB4YjQsCisJMHgzYSwgMHhhYSwgMHg5ZiwgMHg0NywgMHhlYiwgMHhiZSwgMHgxZCwgMHhmMiwgMHhmYiwgMHgwYywgMHhhMSwgMHg4ZiwKKwkweDNiLCAweDgzLCAweGQ3LCAweGRlLCAweDExLCAweGU3LCAweGI3LCAweDU0LCAweDk0LCAweDQ1LCAweDgzLCAweGRmLAorCTB4NzgsIDB4MzMsIDB4MDYsIDB4MDMsIDB4NmUsIDB4ZGEsIDB4MjgsIDB4N2IsIDB4MTUsIDB4M2QsIDB4MDUsIDB4NzUsCisJMHg1NywgMHgyMiwgMHhlYiwgMHgzNCwgMHhjOSwgMHhhMCwgMHhlOSwgMHhlNSwgMHhmNywgMHhjZSwgMHhhZiwgMHg5NSwKKwkweDUzLCAweDk2LCAweDZmLCAweDhhLCAweDQ4LCAweDk0LCAweGRmLCAweDcwLCAweGYxLCAweGZkLCAweDdhLCAweGRmLAorCTB4MmUsIDB4ODQsIDB4ZjUsIDB4ZjcsIDB4NTMsIDB4MGUsIDB4ZGEsIDB4N2MsIDB4OWUsIDB4ZjIsIDB4NWUsIDB4MjgsCisJMHhhYywgMHhkYywgMHhkMSwgMHgyYywgMHhhOCwgMHgzZCwgMHg1MiwgMHgwMCwgMHg3MywgMHg3ZCwgMHg1NywgMHg5MiwKKwkweGRmLCAweGIwLCAweDhiLCAweDNjLCAweDVkLCAweGUxLCAweGI3LCAweDVjLCAweGRiLCAweGQ1LCAweDFkLCAweDE2LAorCTB4ZWYsIDB4NWMsIDB4OTAsIDB4NzQsIDB4NzUsIDB4MjksIDB4OWIsIDB4NWMsIDB4YWUsIDB4MTQsIDB4YzksIDB4NTMsCisJMHhlZCwgMHg1NywgMHhjMywgMHhkYSwgMHhhZiwgMHg5MiwgMHhjNywgMHhjMywgMHhlMCwgMHhmMSwgMHg1ZiwgMHhlYiwKKwkweDc1LCAweDYxLCAweGZiLCAweDhjLCAweGJhLCAweDBiLCAweDllLCAweDg5LCAweGYxLCAweDZjLCAweGVhLCAweDMxLAorCTB4MzUsIDB4MTcsIDB4ZGEsIDB4NjgsIDB4YjQsIDB4N2QsIDB4NDcsIDB4NTAsIDB4ZTksIDB4YWUsIDB4ZmEsIDB4NDYsCisJMHgxZSwgMHhmMiwgMHhjOSwgMHg2ZiwgMHhkZSwgMHg2MSwgMHg1ZiwgMHg0YiwgMHhmYywgMHhiNiwgMHg3ZCwgMHg1OCwKKwkweDdkLCAweDY3LCAweDUyLCAweGFlLCAweDcwLCAweDVkLCAweGY5LCAweDRkLCAweGZiLCAweDY4LCAweDlkLCAweDNjLAorCTB4MDYsIDB4ZjUsIDB4NTgsIDB4OWIsIDB4NWEsIDB4MjUsIDB4ZWEsIDB4YWQsIDB4M2IsIDB4YmYsIDB4NTEsIDB4MjksCisJMHg1NywgMHhmYywgMHhmYiwgMHg5ZCwgMHgxYiwgMHg5NiwgMHhhOCwgMHgxMywgMHhhMiwgMHg2MiwgMHg2YywgMHhlZiwKKwkweDNiLCAweDliLCAweGIyLCAweGZhLCAweDZlLCAweDI1LCAweGMxLCAweGVmLCAweDJlLCAweGUxLCAweDNiLCAweDc2LAorCTB4ZTEsIDB4OTksIDB4NjcsIDB4YmEsIDB4YmIsIDB4OTEsIDB4YzIsIDB4ZTYsIDB4NTQsIDB4YzYsIDB4OTEsIDB4M2UsCisJMHgyYywgMHgzOSwgMHhiNSwgMHhlNywgMHhkNiwgMHg4YywgMHhmYywgMHg1ZSwgMHgzNSwgMHg3NiwgMHhiMSwgMHhmMiwKKwkweDgwLCAweGVjLCAweDM5LCAweGY5LCAweDEwLCAweGJmLCAweGVkLCAweDUxLCAweGRmLCAweGU1LCAweDY3LCAweDFkLAorCTB4ZDIsIDB4MTgsIDB4OTMsIDB4MDksIDB4MzUsIDB4ZWYsIDB4NDIsIDB4ZWQsIDB4OWIsIDB4MTEsIDB4YzUsIDB4ZmIsCisJMHg1YywgMHgyYiwgMHhkNywgMHhiNCwgMHg1MCwgMHg2OSwgMHgwNiwgMHg4ZCwgMHgwMSwgMHg3ZCwgMHhjNywgMHg5MywKKwkweDU4LCAweGRjLCAweDlmLCAweDdmLCAweDk0LCAweGY3LCAweDA2LCAweDVkLCAweDllLCAweGRkLCAweGVkLCAweDI5LAorCTB4ZjEsIDB4MGUsIDB4NjcsIDB4NTIsIDB4YzcsIDB4ZTgsIDB4ZGMsIDB4YjcsIDB4ZTMsIDB4ZDksIDB4MDAsIDB4NjUsCisJMHhkYywgMHg0YSwgMHg4ZCwgMHhjMywgMHhmYSwgMHg4NywgMHgyNSwgMHhjZSwgMHg3MywgMHg2NSwgMHgzZCwgMHg5NywKKwkweGU2LCAweGJhLCAweGI5LCAweGYwLCAweGRlLCAweGFhLCAweDM3LCAweDFmLCAweDdlLCAweDBiLCAweDkzLCAweDJmLAorCTB4ZDUsIDB4N2YsIDB4YzcsIDB4YTMsIDB4YmUsIDB4MTEsIDB4NTcsIDB4ZGYsIDB4Y2QsIDB4OGMsIDB4NTcsIDB4M2UsCisJMHgyMSwgMHgxZiwgMHgyYiwgMHg2ZCwgMHhkNCwgMHhkZiwgMHhmMCwgMHg0NCwgMHhlNCwgMHg2MywgMHg5NSwgMHhkNywKKwkweDE0LCAweDRmLCAweGYzLCAweGVhLCAweGZiLCAweGEzLCAweGIwLCAweDVlLCAweGIzLCAweDk4LCAweGVhLCAweGEzLAorCTB4ZjYsIDB4MWQsIDB4OTIsIDB4NTUsIDB4ZjcsIDB4NGQsIDB4NGEsIDB4NTgsIDB4YzYsIDB4ZTcsIDB4N2YsIDB4ZDksCisJMHhiNywgMHg0OCwgMHg4ZiwgMHgwOCwgMHhiZiwgMHg0NywgMHhiOSwgMHhlNCwgMHg0YywgMHhjYSwgMHhlMywgMHg3MywKKwkweGFlLCAweDdiLCAweDk3LCAweDQzLCAweDVjLCAweGI3LCAweDQxLCAweDk2LCAweDYzLCAweGEzLCAweDNiLCAweGJlLAorCTB4NjcsIDB4YjcsIDB4MDUsIDB4Y2EsIDB4MzMsIDB4OGQsIDB4YjAsIDB4ZDcsIDB4YzQsIDB4MTIsIDB4MTIsIDB4NjUsCisJMHg3ZSwgMHg3ZSwgMHg4NiwgMHg3YSwgMHgxYSwgMHhjMiwgMHgxYywgMHgyZCwgMHhmMywgMHhhYSwgMHg3YywgMHhhNiwKKwkweDk1LCAweDdiLCAweDVlLCAweDc3LCAweDIxLCAweDhlLCAweGZjLCAweGI4LCAweGUzLCAweGQ5LCAweGU1LCAweGNmLAorCTB4MmQsIDB4ZWMsIDB4OTQsIDB4Y2YsIDB4NTUsIDB4MjIsIDB4ODEsIDB4ZjIsIDB4MTQsIDB4ZWYsIDB4ZmEsIDB4NTksCisJMHhjMywgMHg3MywgMHg5MiwgMHg0NCwgMHgzZCwgMHhmNiwgMHgwZiwgMHg3OSwgMHg4OSwgMHg2ZiwgMHg5NiwgMHhhNywKKwkweDhlLCAweGZkLCAweGMyLCAweGJkLCAweDZhLCAweGUzLCAweDNkLCAweDZjLCAweGNkLCAweGIyLCAweGUzLCAweGVmLAorCTB4ZWIsIDB4MjEsIDB4ODYsIDB4M2YsIDB4YzIsIDB4N2EsIDB4OWIsIDB4MjEsIDB4MDcsIDB4ZjAsIDB4ZGIsIDB4ZDAsCisJMHgzOSwgMHhjNiwgMHg5OCwgMHg1NywgMHhiNSwgMHhkZCwgMHgzMiwgMHg4ZSwgMHhkYywgMHgyYywgMHg1NywgMHg1NywKKwkweGVlLCAweDBhLCAweDVmLCAweDg2LCAweDZjLCAweDI3LCAweDNjLCAweGZlLCAweGFiLCAweDdkLCAweGYwLCAweDAzLAorCTB4MTIsIDB4ZmMsIDB4MjIsIDB4ZmMsIDB4YzQsIDB4MTcsIDB4MWIsIDB4OTQsIDB4NmQsIDB4YTcsIDB4M2YsIDB4NDMsCisJMHhmYywgMHg4MSwgMHgxOCwgMHgyMywgMHg4NCwgMHg3ZSwgMHgxZSwgMHg2YywgMHhmNSwgMHg2NCwgMHg3NiwgMHg1MiwKKwkweGU0LCAweGNiLCAweDRkLCAweDkyLCAweDY5LCAweDY1LCAweDBjLCAweDJiLCAweGJmLCAweGMyLCAweDdlLCAweGQ1LAorCTB4ZWIsIDB4NTksIDB4NGEsIDB4YmUsIDB4NDIsIDB4MWQsIDB4YWYsIDB4NzIsIDB4MmUsIDB4YzksIDB4ZjgsIDB4OGYsCisJMHhlNSwgMHg5MywgMHgzMiwgMHgxZSwgMHhlNywgMHg1YywgMHgxZSwgMHg5MSwgMHhjMiwgMHhkYywgMHg2MywgMHhmOCwKKwkweDcxLCAweDllLCAweGE0LCAweGZiLCAweDFmLCAweGU4LCAweDdiLCAweDA0LCAweGEzLCAweDUyLCAweDljLCAweDRhLAorCTB4Y2IsIDB4YzQsIDB4ZWMsIDB4NWUsIDB4N2UsIDB4YTMsIDB4M2IsIDB4N2MsIDB4OTcsIDB4M2EsIDB4NWYsIDB4YjMsCisJMHhlMiwgMHhjOSwgMHg0MCwgMHg2ZiwgMHg2MiwgMHg4MiwgMHhmNywgMHgyNiwgMHhkNCwgMHg3YywgMHhmNiwgMHg2MiwKKwkweDNlLCAweGRmLCAweDZhLCAweGU1LCAweGRkLCAweGYzLCAweGFiLCAweGIwLCAweGJmLCAweGM2LCAweDcxLCAweGNhLAorCTB4YTEsIDB4NjUsIDB4NzYsIDB4MDYsIDB4OTgsIDB4ZGYsIDB4OGQsIDB4ZDgsIDB4OTksIDB4NjUsIDB4YmIsIDB4MjUsCisJMHg3OCwgMHg2NCwgMHhjNSwgMHhjZSwgMHhhMywgMHg1YywgMHg5ZiwgMHhmMywgMHhhYSwgMHhmNiwgMHhmZiwgMHgxMSwKKwkweDZkLCAweDUxLCAweGVmLCAweDg4LCAweGRmLCAweGQ2LCAweGFmLCAweGMzLCAweGI2LCAweDljLCAweGU3LCAweDRlLAorCTB4YzQsIDB4ZWMsIDB4M2UsIDB4NWQsIDB4OTAsIDB4YzMsIDB4NzgsIDB4M2QsIDB4YmYsIDB4YTMsIDB4NmIsIDB4ZjgsCisJMHgxZCwgMHgyMiwgMHhkZSwgMHgwNCwgMHhiZiwgMHhjOCwgMHhlMywgMHhhMCwgMHhlNiwgMHhmMSwgMHg5YiwgMHhlOCwKKwkweGRmLCAweDVmLCAweDgzLCAweGJiLCAweDUwLCAweDY2LCAweGVhLCAweDZmLCAweDAzLCAweGRmLCAweDBhLCAweGRmLAorCTB4YzksIDB4NzMsIDB4ZDYsIDB4N2YsIDB4YjAsIDB4ZDUsIDB4OTMsIDB4MzUsIDB4ZDIsIDB4YjMsIDB4MWUsIDB4Y2YsCisJMHgzYiwgMHhkYiwgMHhiYywgMHg3NSwgMHhkOSwgMHgwZCwgMHg3ZSwgMHhmMSwgMHg0ZSwgMHg2NywgMHhhZiwgMHhmYSwKKwkweDRlLCAweDIwLCAweDMzLCAweGI2LCAweDFiLCAweGIyLCAweGUzLCAweGNmLCAweGFiLCAweDE3LCAweDMyLCAweGM2LAorCTB4MzMsIDB4MGIsIDB4ZDYsIDB4YWYsIDB4ZTcsIDB4ODksIDB4ZTcsIDB4ZjcsIDB4ODIsIDB4ZGMsIDB4NzcsIDB4YjAsCisJMHgzOSwgMHg1NywgMHg2MCwgMHhjMiwgMHgyZiwgMHhhYiwgMHhlZiwgMHg4MiwgMHg2MCwgMHgyNywgMHhkZiwgMHhiNiwKKwkweGYyLCAweDVkLCAweGQwLCAweGY1LCAweGQ3LCAweDc4LCAweGEwLCAweGNkLCAweGYzLCAweDUxLCAweDI2LCAweDc4LAorCTB4ZDIsIDB4YTIsIDB4ZGIsIDB4ZWMsIDB4MDYsIDB4M2UsIDB4ZTUsIDB4NWUsIDB4NmMsIDB4MzIsIDB4ZmUsIDB4YTAsCisJMHhmOCwgMHhlMywgMHhiOCwgMHhkYiwgMHgxOSwgMHg3MywgMHgwZSwgMHhmNiwgMHhmNywgMHgyMiwgMHhiZSwgMHg1NiwKKwkweGY3LCAweDY1LCAweGUyLCAweGJjLCAweDdmLCAweDkzLCAweDBjLCAweGVjLCAweDU2LCAweDc3LCAweDI3LCAweDJlLAorCTB4YWMsIDB4ZmEsIDB4YjYsIDB4MmIsIDB4MjUsIDB4NGYsIDB4ZDUsIDB4NjQsIDB4NjUsIDB4ZjgsIDB4MjcsIDB4NjIsCisJMHg0OSwgMHhlMiwgMHgyNiwgMHhjYSwgMHgwYSwgMHhmYiwgMHhkZCwgMHhjYiwgMHg3OSwgMHhjNiwgMHgxZiwgMHg1MiwKKwkweGYzLCAweDM0LCAweDExLCAweGMzLCAweGYxLCAweDllLCAweDgzLCAweDE5LCAweDI4LCAweGNmLCAweDcyLCAweGRkLAorCTB4OTEsIDB4MmUsIDB4ZjAsIDB4ZDksIDB4M2YsIDB4NmIsIDB4NTUsIDB4NzYsIDB4MDUsIDB4ZTMsIDB4YjIsIDB4OGMsCisJMHhiNiwgMHg5MSwgMHhlZiwgMHhkMywgMHhmYSwgMHgyYywgMHhmNiwgMHhjMywgMHg2ZCwgMHhiYywgMHgwZiwgMHg5MCwKKwkweDQ3LCAweGQ5LCAweGRjLCAweGMyLCAweGZhLCAweGI0LCAweDdkLCAweDVjLCAweGM5LCAweGMxLCAweDIzLCAweGUwLAorCTB4ZmIsIDB4MWYsIDB4YTMsIDB4ZWUsIDB4NjMsIDB4NDgsIDB4MzksIDB4YzcsIDB4ZjQsIDB4Y2EsIDB4YmEsIDB4OTMsCisJMHhkZiwgMHgxZiwgMHg5MCwgMHgwMSwgMHhjOCwgMHgwNSwgMHhmMywgMHg4ZiwgMHg0OCwgMHg1MSwgMHhkZCwgMHg2MywKKwkweDQyLCAweDNhLCAweGM3LCAweDY3LCAweGRhLCAweDdhLCAweDViLCAweGZiLCAweDUzLCAweGQyLCAweGIyLCAweDViLAorCTB4N2YsIDB4NGYsIDB4ZTYsIDB4Y2IsIDB4ZDMsIDB4MmUsIDB4ZGQsIDB4NmUsIDB4NmMsIDB4ODUsIDB4NTcsIDB4MGYsCisJMHg1ZCwgMHg4MywgMHgzNywgMHhjMiwgMHgyYiwgMHg3OCwgMHhjMywgMHgxYiwgMHhlYiwgMHhmMSwgMHgzNiwgMHgxZiwKKwkweDZiLCAweDc4LCAweDczLCAweGYwLCAweGIwLCAweDg2LCAweDI3LCAweGU3LCAweDdiLCAweDI1LCAweDA0LCAweDM5LAorCTB4MGUsIDB4ZDYsIDB4ZTQsIDB4MTgsIDB4YjgsIDB4YzcsIDB4ZDMsIDB4OTksIDB4MDksIDB4OWUsIDB4MjEsIDB4MmEsCisJMHgzZSwgMHg1MywgMHgwZSwgMHgyOSwgMHhiZiwgMHg1YywgMHhjNywgMHhmYSwgMHhiNSwgMHg3ZSwgMHhjZiwgMHgyZiwKKwkweDU5LCAweGViLCAweDk3LCAweGRiLCAweDdjLCAweGZjLCAweGYwLCAweDc3LCAweGQzLCAweDgzLCAweDBiLCAweDZkLAorCTB4MzUsIDB4M2QsIDB4YjgsIDB4ZjksIDB4MzcsIDB4YTQsIDB4MDcsIDB4NmIsIDB4ZTUsIDB4YjIsIDB4NWUsIDB4YTYsCisJMHg0YywgMHhjOCwgMHgxMywgMHhkNywgMHg4YiwgMHhmMiwgMHg0NCwgMHgzOSwgMHgyMiwgMHgyZiwgMHg2OSwgMHg0ZiwKKwkweDFiLCAweDE5LCAweDNiLCAweGM1LCAweGFmLCAweGE4LCAweGVmLCAweDM2LCAweDI2LCAweDYxLCAweDgzLCAweGRhLAorCTB4MDIsIDB4NzMsIDB4NzMsIDB4MzEsIDB4MjksIDB4MmUsIDB4YmMsIDB4NGYsIDB4YzksIDB4ZjQsIDB4NTMsIDB4NTUsCisJMHhkYSwgMHhhNSwgMHhlYiwgMHhjZCwgMHg3ZCwgMHhiNSwgMHhjZCwgMHhjZCwgMHhhZiwgMHhiMSwgMHhiOSwgMHhmOSwKKwkweDE1LCAweDliLCAweGRiLCAweGFhLCAweGUzLCAweGE1LCAweGJmLCAweDhiLCAweGNkLCAweDhkLCAweGQ1LCAweDlkLAorCTB4Y2IsIDB4ZjgsIDB4NjcsIDB4MzIsIDB4MTIsIDB4YzgsIDB4ZjYsIDB4NDQsIDB4NjUsIDB4MDcsIDB4ZmMsIDB4YzgsCisJMHhmMCwgMHhkNCwgMHg0ZSwgMHhmOSwgMHg5NywgMHg1MywgMHg5MywgMHhlYSwgMHg4ZSwgMHhkMiwgMHg1ZiwgMHgzOCwKKwkweGM5LCAweGY4LCAweDAzLCAweDAxLCAweDU3LCAweDNlLCAweDgwLCAweDc4LCAweDc3LCAweGJjLCAweGEzLCAweDQxLAorCTB4NzYsIDB4YmMsIDB4NGIsIDB4OWQsIDB4MzUsIDB4OWEsIDB4ZDksIDB4NDAsIDB4YmIsIDB4NzAsIDB4MTcsIDB4M2MsCisJMHhlNywgMHg1OCwgMHg0ZSwgMHgyMiwgMHhjMCwgMHhmYiwgMHg2YSwgMHg4ZCwgMHgzMiwgMHgxZSwgMHg2YiwgMHg5NiwKKwkweDlkLCAweGMwLCAweDRlLCAweDg1LCAweDFiLCAweDFjLCAweGY1LCAweDJkLCAweDc5LCAweDQ2LCAweDlkLCAweGU1LAorCTB4ZGMsIDB4YjIsIDB4ZDksIDB4MWIsIDB4MTcsIDB4N2MsIDB4NjgsIDB4MzEsIDB4ZTUsIDB4YWIsIDB4ZDUsIDB4NWIsCisJMHhkNCwgMHg3NywgMHhkMSwgMHgxNywgMHg0YSwgMHhkNSwgMHhkNiwgMHhkNSwgMHg3OSwgMHgzZSwgMHhmZiwgMHg3YiwKKwkweGQ0LCAweDg5LCAweDgxLCAweDU3LCAweGY1LCAweDc3LCAweDdmLCAweDgyLCAweDhhLCAweDlmLCAweGM1LCAweGI5LAorCTB4MzEsIDB4NzUsIDB4YTcsIDB4ZWEsIDB4NGEsIDB4OTAsIDB4ZmMsIDB4NTIsIDB4NzEsIDB4NTMsIDB4M2MsIDB4MWIsCisJMHgwNCwgMHhjNiwgMHg5OSwgMHgwMSwgMHg5MiwgMHhiNiwgMHgxOSwgMHhmMywgMHg2OSwgMHhmYywgMHgwOSwgMHhmYiwKKwkweGJmLCAweDQ3LCAweDlkLCAweGVkLCAweDJlLCAweDgxLCAweDM3LCAweGFlLCAweGRhLCAweGZiLCAweGNkLCAweGM3LAorCTB4ODgsIDB4ZWIsIDB4NmIsIDB4ZjcsIDB4ODcsIDB4YWYsIDB4YzUsIDB4ZjcsIDB4ZGUsIDB4YjcsIDB4NjcsIDB4ZmEsCisJMHgxYywgMHg0MiwgMHhlZiwgMHgxNSwgMHhlOSwgMHgxOCwgMHg1YywgMHg5ZCwgMHhhYiwgMHhhZCwgMHhmNywgMHg3ZiwKKwkweDI5LCAweDg4LCAweGY1LCAweGY4LCAweDdmLCAweDBmLCAweDg4LCAweGVkLCAweGFjLCAweGMzLCAweDczLCAweGUyLAorCTB4YTgsIDB4MzgsIDB4MzAsIDB4NDMsIDB4ZmUsIDB4OTYsIDB4YjEsIDB4NGUsIDB4ZDMsIDB4NzEsIDB4ZGYsIDB4OWYsCisJMHgwNywgMHgzYSwgMHhjZiwgMHhkNiwgMHhjNywgMHg4MSwgMHhlYywgMHgyMywgMHhhMiwgMHhlZSwgMHg2MywgMHhkNCwKKwkweGZlLCAweDBmLCAweDBlLCAweGY3LCAweDc3LCAweDMyLCAweDgxLCAweDdiLCAweDRhLCAweDkzLCAweDEyLCAweDNjLAorCTB4M2EsIDB4MmEsIDB4YTEsIDB4NjksIDB4ZWUsIDB4YTUsIDB4NjcsIDB4YTQsIDB4MTgsIDB4NzMsIDB4ZTUsIDB4NjMsCisJMHhjZSwgMHhlYSwgMHhkOCwgMHhhNCwgMHhkMywgMHg1OCwgMHg0YiwgMHhmYiwgMHgyMywgMHgzMiwgMHg3OCwgMHhmMiwKKwkweDMxLCAweDA5LCAweDFmLCAweGU1LCAweGJiLCAweDU1LCAweGU3LCAweDI4LCAweGIwLCAweDQ3LCAweDFiLCAweDY0LAorCTB4MmUsIDB4YzYsIDB4ZmQsIDB4ZTQsIDB4YjAsIDB4M2EsIDB4OTcsIDB4NWUsIDB4MWUsIDB4N2IsIDB4MmQsIDB4NWMsCisJMHgwNCwgMHg1NiwgMHhjOCwgMHgyYiwgMHhkYiwgMHg4MiwgMHg3NCwgMHgyNSwgMHg5NiwgMHgzOCwgMHhiYywgMHg5OSwKKwkweDNhLCAweDg1LCAweDE4LCAweDMzLCAweDMwLCAweDNlLCAweDE3LCAweDU2LCAweGY3LCAweDgzLCAweDk2LCAweDYzLAorCTB4YWMsIDB4OGIsIDB4ZjgsIDB4ZmQsIDB4MjgsIDB4NzEsIDB4MDYsIDB4NmMsIDB4YzcsIDB4YTgsIDB4NDQsIDB4OTksCisJMHgwZiwgMHgxZSwgMHhhZCwgMHhlMSwgMHgwYywgMHhkYSwgMHg4NCwgMHg0MSwgMHgyNywgMHgyNiwgMHhhMSwgMHg1MywKKwkweGRlLCAweGRjLCAweGY5LCAweDhmLCAweDk1LCAweDhjLCAweDEzLCAweDNiLCAweDI1LCAweDM4LCAweGNkLCAweGU3LAorCTB4ZmEsIDB4NzgsIDB4ODgsIDB4ZDgsIDB4MWQsIDB4YmUsIDB4ZTEsIDB4ZWMsIDB4NjcsIDB4ZDEsIDB4MWYsIDB4ZGYsCisJMHg2NSwgMHhmNCwgMHgzNywgMHhiYSwgMHhjOCwgMHg5NywgMHhmZiwgMHhiNiwgMHhmZiwgMHg0MywgMHg4MSwgMHhiMiwKKwkweGZmLCAweGZmLCAweDAxLCAweGU2LCAweDhlLCAweDlhLCAweDIxLCAweGMwLCAweDRlLCAweDAwLCAweDAwLCAweDAwIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYm54Ml9DT01fYjA2RndEYXRhWygweDAvNCkgKyAxXSA9IHsgMHgwIH07CiBzdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3Um9kYXRhWygweDE0LzQpICsgMV0gPSB7Ci0JMHgwODAwMGYwNCwgMHgwODAwMGY0YywgMHgwODAwMGY4MCwgMHgwODAwMGZjYywgMHgwODAwMTAwMCwgMHgwMDAwMDAwMAorCTB4MDgwMDBlN2MsIDB4MDgwMDBlYzQsIDB4MDgwMDBlZjgsIDB4MDgwMDBmNDQsIDB4MDgwMDBmNzgsIDB4MDAwMDAwMDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZndfaW5mbyBibngyX2NvbV9md18wNiA9IHsKLQkvKiBGaXJtd2FyZSB2ZXJzaW9uOiA0LjAuNSAqLworCS8qIEZpcm13YXJlIHZlcnNpb246IDQuNC4yICovCiAJLnZlcl9tYWpvcgkJCT0gMHg0LAotCS52ZXJfbWlub3IJCQk9IDB4MCwKLQkudmVyX2ZpeAkJCT0gMHg1LAorCS52ZXJfbWlub3IJCQk9IDB4NCwKKwkudmVyX2ZpeAkJCT0gMHgyLAogCiAJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDAwZjgsCiAKIAkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAotCS50ZXh0X2xlbgkJCT0gMHg0ZWFjLAorCS50ZXh0X2xlbgkJCT0gMHg0ZWJjLAogCS50ZXh0X2luZGV4CQkJPSAweDAsCiAJLmd6X3RleHQJCQk9IGJueDJfQ09NX2IwNkZ3VGV4dCwKIAkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX0NPTV9iMDZGd1RleHQpLApAQCAtODcyLDE1ICs4NzIsMTUgQEAKIAkuZGF0YV9pbmRleAkJCT0gMHgwLAogCS5kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndEYXRhLAogCi0JLnNic3NfYWRkcgkJCT0gMHgwODAwNGVlMCwKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDA0ZjAwLAogCS5zYnNzX2xlbgkJCT0gMHgzOCwKIAkuc2Jzc19pbmRleAkJCT0gMHgwLAogCi0JLmJzc19hZGRyCQkJPSAweDA4MDA0ZjE4LAorCS5ic3NfYWRkcgkJCT0gMHgwODAwNGYzOCwKIAkuYnNzX2xlbgkJCT0gMHhiYywKIAkuYnNzX2luZGV4CQkJPSAweDAsCiAKLQkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDRlYWMsCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA0ZWJjLAogCS5yb2RhdGFfbGVuCQkJPSAweDE0LAogCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKIAkucm9kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndSb2RhdGEsCkBAIC05MDIsMTIzMSArOTAyLDEyMzIgQEAKIAkubWlwc192aWV3X2Jhc2UgPSAweDgwMDAwMDAsCiB9OwogCi0KIHN0YXRpYyB1OCBibngyX0NQX2IwNkZ3VGV4dFtdID0gewotCTB4OWQsIDB4YmMsIDB4MGQsIDB4NzgsIDB4MTMsIDB4ZTcsIDB4OTksIDB4MmUsIDB4N2MsIDB4Y2YsIDB4NDgsIDB4YjIsCi0JMHg2NSwgMHg1YiwgMHhiNiwgMHhjNywgMHhiNiwgMHgwYywgMHgyMiwgMHg2NSwgMHg0MSwgMHg4MywgMHg0NywgMHgyMCwKLQkweDYyLCAweDI3LCAweDFkLCAweDgxLCAweDQ5LCAweDk0LCAweGFjLCAweDM2LCAweGE4LCAweGM2LCAweDAxLCAweDkzLAotCTB4OTAsIDB4YzYsIDB4MzQsIDB4YjQsIDB4NzUsIDB4N2EsIDB4ZDIsIDB4OGQsIDB4NjIsIDB4MGMsIDB4MjEsIDB4ODQsCi0JMHgxMCwgMHg2NywgMHg5YiwgMHg5ZSwgMHhlMywgMHg3YywgMHg1ZiwgMHhjZSwgMHg1YSwgMHgzNSwgMHgwNiwgMHgwYywKLQkweGM4LCAweDk2LCAweDMxLCAweDBlLCAweDkwLCAweGZkLCAweDdhLCAweDlkLCAweDE4LCAweDZjLCAweDMwLCAweDQ5LAotCTB4NjUsIDB4OGIsIDB4MzQsIDB4NzQsIDB4OTcsIDB4ZjQsIDB4YTMsIDB4NDUsIDB4MDcsIDB4ZjIsIDB4ZTMsIDB4ZmMsCi0JMHgzNSwgMHhhNCwgMHhlZCwgMHg3NiwgMHhkYiwgMHgzZCwgMHgzOSwgMHg4OSwgMHgwZiwgMHgyNSwgMHg4NCwgMHhiNCwKLQkweGRkLCAweGZjLCAweGI0LCAweGRkLCAweDJkLCAweDY5LCAweDliLCAweGNjLCAweDc3LCAweDNmLCAweDIzLCAweDA5LAotCTB4MGMsIDB4NGQsIDB4N2YsIDB4ZjYsIDB4ZjMsIDB4NzUsIDB4Y2QsIDB4NjUsIDB4Y2QsIDB4Y2MsIDB4ZmIsIDB4ZjMsCi0JMHhiYywgMHhjZiwgMHhmYiwgMHgzYywgMHhmNywgMHg3MywgMHgzZiwgMHhlZiwgMHhiYywgMHgzMywgMHhiMywgMHg4MCwKLQkweDYyLCAweGU0LCAweGZlLCAweDRhLCAweDc5LCAweDVjLCAweDVkLCAweGRmLCAweGJlLCAweDFhLCAweDhiLCAweGFlLAotCTB4MzYsIDB4ZTUsIDB4ZGMsIDB4ZTksIDB4ODIsIDB4MTMsIDB4N2YsIDB4ZTEsIDB4OWYsIDB4ZmYsIDB4MmYsIDB4MmQsCi0JMHgzOCwgMHhlNSwgMHhjZiwgMHgwMSwgMHg2OCwgMHhmOSwgMHg3ZSwgMHhlNSwgMHg4MCwgMHg1YiwgMHg4ZCwgMHgzYywKLQkweGYzLCAweDVmLCAweDFhLCAweDBjLCAweGI4LCAweDFkLCAweDkxLCAweDllLCAweGQ2LCAweGQ1LCAweDA2LCAweDEwLAotCTB4NGQsIDB4ZDUsIDB4ZmEsIDB4OTcsIDB4ZTAsIDB4MjMsIDB4MmIsIDB4ZWUsIDB4NzUsIDB4NDIsIDB4YWUsIDB4ZmYsCi0JMHg1NSwgMHhlNCwgMHhmNywgMHg5ZCwgMHhkZiwgMHhiOSwgMHg1NiwgMHg3ZiwgMHg3ZiwgMHhjOCwgMHgwMSwgMHhiNywKLQkweDE2LCAweGU5LCAweDgwLCAweDM2LCAweDE3LCAweGVlLCAweDk5LCAweGFjLCAweGYzLCAweGY1LCAweDc5LCAweGRiLAotCTB4MTUsIDB4OTQsIDB4ZTUsIDB4ZGIsIDB4M2EsIDB4NjcsIDB4N2QsIDB4NjcsIDB4OWUsIDB4MmYsIDB4NTYsIDB4MTQsCi0JMHhkMSwgMHg3MCwgMHgzYywgMHg4ZCwgMHhlNiwgMHhiYSwgMHhkZSwgMHg0ZSwgMHhhYiwgMHhkNCwgMHgwOCwgMHhjMSwKLQkweDZkLCAweDE4LCAweDJkLCAweGJkLCAweDhhLCAweDI3LCAweGJjLCAweDdlLCAweDExLCAweDNjLCAweDg1LCAweDA2LAotCTB4ZTIsIDB4NTcsIDB4NDQsIDB4ZDAsIDB4N2MsIDB4ZTUsIDB4NTgsIDB4NzEsIDB4ZGMsIDB4MTksIDB4NzEsIDB4YTMsCi0JMHgyOSwgMHhlZCwgMHg4ZSwgMHg3ZiwgMHgyYSwgMHg2MiwgMHg2MCwgMHg1OSwgMHhmYSwgMHhmYSwgMHg2MiwgMHg5NCwKLQkweGI5LCAweGQxLCAweDlkLCAweGZlLCAweGE4LCAweDI4LCAweGRiLCAweDVlLCAweDczLCAweGVlLCAweGZmLCAweGVjLAotCTB4YWEsIDB4ZWMsIDB4ZmYsIDB4NjksIDB4MzEsIDB4NjcsIDB4MDQsIDB4ZDgsIDB4OWMsIDB4YjAsIDB4YWMsIDB4ODIsCi0JMHhjOCwgMHg2ZCwgMHhiNywgMHhhOSwgMHgxMSwgMHhjMywgMHg3NywgMHgxMCwgMHg4YiwgMHhkMSwgMHhhYSwgMHhlMSwKLQkweGUxLCAweDJkLCAweGY1LCAweGJmLCAweDU0LCAweDRlLCAweDBjLCAweGIyLCAweGUxLCAweDUxLCAweDA3LCAweGEyLAotCTB4ZGEsIDB4MzMsIDB4ZmMsIDB4M2YsIDB4NmIsIDB4NTYsIDB4NGIsIDB4ZDgsIDB4YzAsIDB4ZGUsIDB4ZDEsIDB4ZjMsCi0JMHhiYywgMHhlZSwgMHhiNCwgMHhhZiwgMHg2ZCwgMHhkYSwgMHgzMywgMHg2YiwgMHhkNiwgMHhlZCwgMHhlMSwgMHg2NywKLQkweGYwLCAweGU4LCAweGE4LCAweGZjLCAweGJlLCAweDFiLCAweDlkLCAweDc1LCAweDBhLCAweDI2LCAweDZmLCAweDViLAotCTB4MGIsIDB4ODcsIDB4NjEsIDB4YTAsIDB4N2IsIDB4OGYsIDB4ZTIsIDB4ZWMsIDB4YWEsIDB4NTMsIDB4MTEsIDB4ZjUsCi0JMHhlYSwgMHhjMSwgMHgxOCwgMHg5NSwgMHhlZiwgMHgzNCwgMHgxMCwgMHgyYiwgMHg4YywgMHg4NCwgMHg5ZCwgMHhlZiwKLQkweDI0LCAweDIyLCAweDlhLCAweGMzLCAweGIwLCAweGFjLCAweDYwLCAweDY4LCAweDNhLCAweDFjLCAweDE1LCAweDk2LAotCTB4ZjUsIDB4YjQsIDB4ZTksIDB4ODEsIDB4ZmYsIDB4OGIsIDB4Y2YsIDB4MjEsIDB4M2UsIDB4ZGMsIDB4MGMsIDB4ZDUsCi0JMHg3OCwgMHgwZSwgMHg1ZCwgMHhjMywgMHhjZiwgMHhlMSwgMHhiMSwgMHg1ZCwgMHhjNSwgMHg5OCwgMHhhYywgMHhlMiwKLQkweDc4LCAweDkzLCAweDNlLCAweDdjLCAweDY3LCAweDllLCAweGY0LCAweDJkLCAweDcyLCAweGQ0LCAweGYxLCAweDcwLAotCTB4NjMsIDB4ZDIsIDB4ZjEsIDB4MDYsIDB4ZmYsIDB4NGIsIDB4OTksIDB4ZjMsIDB4ZDYsIDB4ZTQsIDB4ZjQsIDB4OGIsCi0JMHg2NSwgMHgzNiwgMHhiMywgMHg0YywgMHhmNywgMHg2NSwgMHg2NSwgMHhlMiwgMHhjMywgMHgxMSwgMHhiYywgMHg5NCwKLQkweDUwLCAweGIwLCAweDNlLCAweDU0LCAweDg2LCAweDY4LCAweDg1LCAweDhjLCAweGQ3LCAweGIyLCAweDQ2LCAweGNkLAotCTB4YjMsIDB4ZDYsIDB4YTQsIDB4MjYsIDB4N2QsIDB4NGQsIDB4ZTAsIDB4NjUsIDB4ZGUsIDB4ZGIsIDB4MTIsIDB4M2EsCi0JMHg2MywgMHg2NSwgMHhiYywgMHhkMiwgMHg1ZSwgMHgzYiwgMHg2ZCwgMHg2NywgMHgyNSwgMHhhZiwgMHgzYiwgMHg5MSwKLQkweDRjLCAweDIwLCAweDU2LCAweDE2LCAweGI5LCAweDhkLCAweGU3LCAweGJhLCAweGY5LCAweGFlLCAweGUyLCAweDc2LAotCTB4YmYsIDB4OTcsIDB4NzAsIDB4N2YsIDB4YjEsIDB4ZDQsIDB4NTAsIDB4MWYsIDB4MmMsIDB4YTcsIDB4MDEsIDB4YmQsCi0JMHg0MiwgMHg5OSwgMHg4ZiwgMHg5YSwgMHg2YiwgMHhlMSwgMHgzMiwgMHgxZSwgMHgxMCwgMHg1YiwgMHhlMywgMHhiOCwKLQkweDdlLCAweDY4LCAweDYxLCAweDdhLCAweGJlLCAweGJlLCAweGI0LCAweGViLCAweGM2LCAweDk2LCAweGE0LCAweDY1LAotCTB4NmQsIDB4MzMsIDB4YTMsIDB4ZDcsIDB4MTUsIDB4ZDEsIDB4MjAsIDB4NGUsIDB4MjYsIDB4OWEsIDB4ZTEsIDB4OGUsCi0JMHgwNCwgMHhmYywgMHhlNywgMHgxMCwgMHhjNiwgMHg5MiwgMHhiNCwgMHgxNywgMHhjZiwgMHgyNiwgMHhlMCwgMHg2YywKLQkweDk4LCAweGU3LCAweDQ1LCAweDU3LCAweDNhLCAweDgyLCAweDFiLCAweGQzLCAweDI2LCAweDFhLCAweGQzLCAweDdmLAotCTB4ZGUsIDB4YjIsIDB4NmUsIDB4NGUsIDB4ZmEsIDB4MzksIDB4ODYsIDB4OGYsIDB4YWMsIDB4ZWMsIDB4MTgsIDB4NjQsCi0JMHg3YywgMHhkOSwgMHhmZiwgMHhkZCwgMHhjOSwgMHgyYiwgMHhiMCwgMHg5ZCwgMHg3MywgMHhiNCwgMHg5NSwgMHhmMywKLQkweGI3LCAweDNjLCAweDk0LCAweDg5LCAweDE2LCAweDQxLCAweDM3LCAweGNmLCAweDIxLCAweDgyLCAweGE1LCAweDY5LAotCTB4ODMsIDB4NzMsIDB4MWEsIDB4YzEsIDB4OTIsIDB4NjQsIDB4OGQsIDB4MzYsIDB4OGMsIDB4ZjksIDB4ODgsIDB4ZmEsCi0JMHhiMiwgMHgzNiwgMHhiZCwgMHg4MywgMHhlMywgMHg2ZCwgMHgwZCwgMHgzNCwgMHhhMywgMHg5NCwgMHgzNiwgMHg5MiwKLQkweDVhLCAweDE0LCAweDQ2LCAweDAzLCAweGZiLCAweDVmLCAweGYxLCAweDE3LCAweGY0LCAweDdmLCAweDJiLCAweGZiLAotCTB4N2YsIDB4OTcsIDB4ZmQsIDB4NjcsIDB4ZWMsIDB4ZmUsIDB4ZTEsIDB4YmMsIDB4ODksIDB4ZTcsIDB4NmUsIDB4ZGEsCi0JMHhlMywgMHhmNiwgMHg5NCwgMHhkMywgMHhiOSwgMHgzYywgMHhlOSwgMHhjNSwgMHhiNiwgMHg5NCwgMHg0OSwgMHg5YiwKLQkweDkzLCAweDViLCAweDNlLCAweDZjLCAweDE5LCAweDljLCAweDg5LCAweGFkLCAweDgzLCAweGJhLCAweGVmLCAweDc5LAotCTB4ZmUsIDB4ZGUsIDB4MzQsIDB4NzIsIDB4MDUsIDB4MzYsIDB4MGYsIDB4MmEsIDB4ZDgsIDB4NmYsIDB4NWMsIDB4ODEsCi0JMHgyZSwgMHhmZSwgMHhkZSwgMHgzYiwgMHgzOCwgMHgwYiwgMHg4ZiwgMHgwZSwgMHgzYSwgMHgxMCwgMHhhZSwgMHhiYSwKLQkweDc0LCAweDFjLCAweDkzLCAweDhlLCAweDJiLCAweDEwLCAweDFmLCAweGYxLCAweGEzLCAweDJiLCAweGYxLCAweGEyLAotCTB4YWQsIDB4YzMsIDB4ZDIsIDB4YzgsIDB4ZmYsIDB4OWIsIDB4ZjcsIDB4NjMsIDB4ZmEsIDB4OGUsIDB4MWYsIDB4YWIsCi0JMHgxMywgMHgxYSwgMHhiYSwgMHg5MiwgMHgwZSwgMHhiMSwgMHg0YiwgMHhmZSwgMHhmZCwgMHg5MiwgMHhmNywgMHgzNCwKLQkweDZjLCAweDRhLCAweGU3LCAweGViLCAweDhiLCAweDlmLCAweGY5LCAweGQxLCAweDkwLCAweDk4LCAweGEwLCAweDlmLAotCTB4ZDQsIDB4ZDMsIDB4NDcsIDB4NGMsIDB4N2MsIDB4MzcsIDB4NWQsIDB4ODcsIDB4N2YsIDB4NGEsIDB4MDcsIDB4ZjEsCi0JMHg4ZiwgMHhkNCwgMHhjMywgMHhiNywgMHhkMiwgMHg3ZSwgMHgxYywgMHg0OSwgMHhjZiwgMHhjNCwgMHg1MywgMHg2OSwKLQkweDFmLCAweGJlLCAweDQ5LCAweGZkLCAweDNmLCAweDk5LCAweDZlLCAweGE2LCAweGVkLCAweDZhLCAweDM4LCAweDljLAotCTB4MTYsIDB4ZmQsIDB4MTUsIDB4NTAsIDB4ZGUsIDB4NjIsIDB4NmMsIDB4MWEsIDB4YWMsIDB4MDksIDB4OWUsIDB4YTQsCi0JMHg2ZCwgMHhmYywgMHhhMywgMHg3OSwgMHgxMywgMHgzMiwgMHg5NSwgMHhmNSwgMHhiNiwgMHg0ZCwgMHg2ZCwgMHhlMywKLQkweGY1LCAweGVkLCAweDgzLCAweDM1LCAweGQxLCAweDJiLCAweDE1LCAweGNiLCAweDUyLCAweDQzLCAweGI1LCAweGUxLAotCTB4MTMsIDB4YWEsIDB4OGEsIDB4NDksIDB4YWYsIDB4ZWUsIDB4Y2YsIDB4YTgsIDB4YmEsIDB4M2YsIDB4MGEsIDB4MTcsCi0JMHgxMiwgMHhiNCwgMHhlZCwgMHg3OCwgMHhiNSwgMHgzZSwgMHgxNCwgMHhhNywgMHg0ZCwgMHg3OCwgMHg4ZCwgMHg3ZCwKLQkweDQwLCAweDk5LCAweGVlLCAweDhmLCAweGFiLCAweDZlLCAweDZjLCAweDRkLCAweGVhLCAweDdiLCAweGUzLCAweGFhLAotCTB4MDcsIDB4ZjEsIDB4NzQsIDB4MzEsIDB4ZmUsIDB4NmQsIDB4NTAsIDB4ZWYsIDB4ODksIDB4YWIsIDB4OWYsIDB4NDUsCi0JMHhiYywgMHhkMiwgMHhiMiwgMHhiZSwgMHgxOSwgMHg0MiwgMHhmYiwgMHhmNCwgMHgwOCwgMHhhMiwgMHhkNSwgMHgxMSwKLQkweGM0LCAweDY2LCAweDQ1LCAweGJjLCAweDQ4LCAweDI2LCAweDgxLCAweDc3LCAweDdiLCAweDBkLCAweGRmLCAweGJmLAotCTB4MjgsIDB4Y2QsIDB4ZjgsIDB4NmEsIDB4YjMsIDB4ZWUsIDB4ZjcsIDB4YWIsIDB4YjUsIDB4ZjEsIDB4NjEsIDB4NzUsCi0JMHgxMSwgMHg1ZCwgMHgxMiwgMHg3ZSwgMHg1ZiwgMHg2NCwgMHgxOSwgMHgzYSwgMHhlYywgMHg2YiwgMHgwYSwgMHgzNCwKLQkweGMzLCAweDgzLCAweDRkLCAweGM5LCAweGViLCAweDEwLCAweGYzLCAweGQ2LCAweGI0LCAweGVjLCAweDU0LCAweDZiLAotCTB4Y2UsIDB4OWIsIDB4YWEsIDB4M2UsIDB4ZDEsIDB4YWMsIDB4NWEsIDB4ZDYsIDB4MDcsIDB4MGIsIDB4ZGYsIDB4YjUsCi0JMHhmYywgMHhkMywgMHgyYywgMHg2YiwgMHhjMSwgMHg0MiwgMHhlOSwgMHhkMywgMHg4ZiwgMHg4YSwgMHg4OCwgMHg4OSwKLQkweDk1LCAweGY2LCAweDFjLCAweDE0LCAweGUzLCAweGVjLCAweDYwLCAweDI1LCAweGZiLCAweGQwLCAweGYwLCAweGNmLAotCTB4ZDcsIDB4ZWEsIDB4YzEsIDB4YjUsIDB4NmEsIDB4MzEsIDB4ZGUsIDB4MWEsIDB4MjksIDB4YzYsIDB4NjksIDB4OGUsCi0JMHhlNywgMHg5NywgMHg4MywgMHgzZSwgMHhmYywgMHg3YSwgMHhkMCwgMHhiMiwgMHhiZSwgMHg2OCwgMHhmZSwgMHgzNSwKLQkweDA2LCAweDJhLCAweGZiLCAweGYxLCAweDRmLCAweGUzLCAweDVlLCAweGZjLCAweDFiLCAweDc1LCAweDdiLCAweDI2LAotCTB4MTEsIDB4N2QsIDB4YTAsIDB4MGEsIDB4N2EsIDB4NzQsIDB4NWMsIDB4MzksIDB4NzksIDB4NjcsIDB4MTksIDB4NmEsCi0JMHg5YiwgMHhjYiwgMHgxNCwgMHhiZCwgMHg2OSwgMHgwNywgMHg3NCwgMHhkZiwgMHg5NSwgMHg4YSwgMHgxNywgMHhlNywKLQkweDUyLCAweDFhLCAweDdlLCAweDlhLCAweGFhLCAweDA5LCAweGZmLCAweDgwLCAweDdkLCAweGZlLCAweDg3LCAweGY5LAotCTB4YjQsIDB4OTUsIDB4OTksIDB4MjYsIDB4N2EsIDB4MTMsIDB4MWQsIDB4NTEsIDB4Y2YsIDB4NDksIDB4ZWEsIDB4MzksCi0JMHg0OSwgMHgzZCwgMHgyNywgMHhhOSwgMHg2NywgMHhjYSwgMHg3MCwgMHgyNCwgMHg0OSwgMHgzZCwgMHg1MywgMHg3NywKLQkweGRmLCAweGE0LCAweDRkLCAweDNjLCAweDk5LCAweGE0LCAweDhlLCAweDkzLCAweDMyLCAweDQ3LCAweDYxLCAweGZhLAotCTB4ZTcsIDB4YTcsIDB4ZjAsIDB4ZjcsIDB4ZjYsIDB4ZGMsIDB4YmQsIDB4NmMsIDB4ZmQsIDB4MzcsIDB4YWYsIDB4OGMsCi0JMHhlOSwgMHhmZSwgMHg2OSwgMHg1OSwgMHhmYywgMHg5MSwgMHhiMSwgMHhiZCwgMHg2NCwgMHhjNSwgMHgzNCwgMHgxOSwKLQkweDk3LCAweDhjLCAweGNmLCAweGQ2LCAweDlmLCAweGJmLCAweDVkLCAweGY5LCAweGFhLCAweDgyLCAweDYyLCAweGNiLAotCTB4ZGEsIDB4NjUsIDB4ZTYsIDB4ZWUsIDB4N2IsIDB4ZjMsIDB4ZTMsIDB4ZmIsIDB4OGMsIDB4OTIsIDB4YjUsIDB4OGIsCi0JMHg3ZiwgMHg3MiwgMHg1MywgMHhkZiwgMHhjMSwgMHhhOCwgMHhiYSwgMHg4OCwgMHhlNywgMHg3YSwgMHgzYywgMHg4YSwKLQkweDliLCAweDBhLCAweDJmLCAweDNkLCAweGJmLCAweGI2LCAweDVhLCAweGU2LCAweGMzLCAweDdmLCAweGUxLCAweDljLAotCTB4ZjYsIDB4NjQsIDB4ZjcsIDB4ZjcsIDB4NDUsIDB4OWUsIDB4Y2IsIDB4NTgsIDB4MDQsIDB4NTMsIDB4YzUsIDB4MDYsCi0JMHhiYywgMHhiNCwgMHg5NywgMHg0NSwgMHhiOSwgMHg3YiwgMHg4OCwgMHhhYiwgMHg5MSwgMHg3NiwgMHgzNCwgMHhkNywKLQkweGVmLCAweGI1LCAweGZiLCAweDI4LCAweGU4LCAweDEzLCAweGJiLCAweDU3LCAweGYwLCAweGVlLCAweDc1LCAweDBhLAotCTB4NGUsIDB4ODQsIDB4MGMsIDB4ZGEsIDB4Y2MsIDB4MTAsIDB4ZmQsIDB4MWEsIDB4MjgsIDB4ZWMsIDB4ODMsIDB4ZGIsCi0JMHgxMywgMHg4OSwgMHgyMCwgMHhkMSwgMHgwYiwgMHg3NywgMHg1MSwgMHgyNCwgMHg4YywgMHhmOSwgMHhiZCwgMHgzNSwKLQkweGViLCAweGNlLCAweDQyLCAweDBmLCAweGY2LCAweDJhLCAweDdhLCAweDMzLCAweDUwLCAweDZiLCAweDhlLCAweDUxLAotCTB4OGYsIDB4NTcsIDB4MmEsIDB4YmEsIDB4YmYsIDB4NDAsIDB4ODEsIDB4NWIsIDB4NjEsIDB4YjksIDB4NDAsIDB4NmEsCi0JMHgwOCwgMHg1YiwgMHhkMywgMHhmMiwgMHgzYiwgMHgwYywgMHgyMywgMHhmNSwgMHhlYiwgMHg3YywgMHg1ZiwgMHhiNCwKLQkweGViLCAweDc2LCAweGRhLCAweGY1LCAweDU5LCAweDhlLCAweDVkLCAweGY3LCAweDEzLCAweDFmLCAweGRkLCAweGFlLAotCTB4YzgsIDB4M2EsIDB4MWMsIDB4NDgsIDB4YzAsIDB4NWQsIDB4MTAsIDB4ZDksIDB4ODAsIDB4ZTcsIDB4MTIsIDB4MWYsCi0JMHg1NywgMHhlNywgMHhjYiwgMHgyOSwgMHgyYywgMHhlNywgMHg0ZiwgMHg0ZCwgMHg5NSwgMHhlNSwgMHgwZCwgMHgyYiwKLQkweGVhLCAweGNkLCAweGNhLCAweDUyLCAweGRjLCAweDM3LCAweDg0LCAweDFkLCAweDQ5LCAweGE5LCAweDFiLCAweGIxLAotCTB4ZWIsIDB4M2EsIDB4ZDksIDB4NDcsIDB4NzcsIDB4YTIsIDB4YTYsIDB4ZTksIDB4NjYsIDB4NDUsIDB4MGYsIDB4M2YsCi0JMHg4ZSwgMHhkYSwgMHhlOCwgMHgzYiwgMHg5YywgMHhjMywgMHgyZSwgMHhlOCwgMHhlNywgMHhkNywgMHgyMSwgMHgyYiwKLQkweGNiLCAweGJjLCAweDU0LCAweDU2LCAweDhlLCAweGM1LCAweDI5LCAweDI4LCAweGI3LCAweDI3LCAweGUxLCAweGYxLAotCTB4MTksIDB4NTUsIDB4MzksIDB4NWYsIDB4ODQsIDB4NzIsIDB4MGIsIDB4ZTcsIDB4NGYsIDB4MzUsIDB4ZmMsIDB4YjgsCi0JMHg4NSwgMHgzNiwgMHhiNCwgMHg2MSwgMHg5NywgMHg4NSwgMHg0ZCwgMHhhMSwgMHg0YSwgMHhmYSwgMHg1YiwgMHgzMywKLQkweGNhLCAweDg4LCAweDg3LCAweDFiLCAweDM1LCAweDQ0LCAweGNiLCAweDIzLCAweDYxLCAweGU1LCAweGQ2LCAweGY0LAotCTB4Y2UsIDB4OWMsIDB4ZmUsIDB4OWYsIDB4YWUsIDB4YTQsIDB4N2MsIDB4NGEsIDB4NjMsIDB4ZjIsIDB4ZjIsIDB4ZWIsCi0JMHgxZiwgMHhlNSwgMHhjNywgMHg3NywgMHhkOSwgMHhmNSwgMHhiOSwgMHgwNSwgMHg5ZiwgMHg1YywgMHhiZSwgMHg1NiwKLQkweDFiLCAweDgxLCAweGMyLCAweDc4LCAweDUxLCAweDQ0LCAweGZkLCAweGVhLCAweDhjLCAweGQyLCAweGQxLCAweGEwLAotCTB4Y2IsIDB4YmUsIDB4ZTYsIDB4YzAsIDB4OTAsIDB4MzMsIDB4ZWEsIDB4NzMsIDB4ZTAsIDB4ZjcsIDB4NTYsIDB4NzQsCi0JMHg5NSwgMHg1YywgMHgyYiwgMHg0NiwgMHhhYywgMHhiOSwgMHhkNiwgMHhlNywgMHg0NCwgMHg2ZCwgMHg3OCwgMHgzMywKLQkweGZkLCAweDZkLCAweDcyLCAweDU1LCAweDAzLCAweGVmLCAweDA1LCAweGNjLCAweDkzLCAweGE4LCAweGYxLCAweDZmLAotCTB4ODYsIDB4ZmMsIDB4ZmUsIDB4OTAsIDB4MzYsIDB4ZDIsIDB4MjAsIDB4NzUsIDB4NTksIDB4NDYsIDB4NmMsIDB4NGUsCi0JMHhkNywgMHg0ZSwgMHhjMiwgMHg4YiwgMHhjZCwgMHhiNCwgMHhiZiwgMHhjMiwgMHg4OCwgMHg2ZSwgMHgyZSwgMHg3MywKLQkweDM4LCAweDcxLCAweDg4LCAweDM4LCAweGVjLCAweDMwLCAweDdhLCAweDUwLCAweGM4LCAweDMxLCAweDMyLCAweDNlLAotCTB4ZTIsIDB4ZjEsIDB4MDQsIDB4ZjAsIDB4NjIsIDB4YmYsIDB4ODUsIDB4ODYsIDB4OTAsIDB4MDcsIDB4NGIsIDB4NmMsCi0JMHhkYiwgMHgzYywgMHhhYSwgMHhkYywgMHg5OCwgMHhmYywgMHhkOCwgMHgxYSwgMHg3MiwgMHgxNiwgMHg0NSwgMHhkNSwKLQkweDQ4LCAweGMwLCAweDc3LCAweDlhLCAweGQxLCAweGJjLCAweDIwLCAweDUyLCAweGFiLCAweDM5LCAweDExLCAweDU3LAotCTB4OWEsIDB4ZDIsIDB4ZGQsIDB4Y2EsIDB4ZjIsIDB4NzQsIDB4OGYsIDB4YjIsIDB4YzQsIDB4YzYsIDB4OWMsIDB4YTMsCi0JMHhjYSwgMHhkMiwgMHhiNCwgMHgwNywgMHhhOSwgMHg3ZSwgMHgwNSwgMHgzYiwgMHg0MiwgMHg5NCwgMHhhYiwgMHgzYSwKLQkweDZiLCAweGM3LCAweGU5LCAweDdlLCAweDk1LCAweDE4LCAweGY5LCAweDJlLCAweDMxLCAweDUyLCAweDBmLCAweDgzLAotCTB4N2QsIDB4M2YsIDB4OWQsIDB4YTgsIDB4YzQsIDB4NTEsIDB4NjIsIDB4ZTEsIDB4NGYsIDB4NTIsIDB4ZTUsIDB4MmEsCi0JMHg4YSwgMHhhZiwgMHhjMCwgMHg4ZiwgMHg0NywgMHhjYSwgMHgzMCwgMHgzNiwgMHgzOCwgMHg4YiwgMHhiZiwgMHhlYiwKLQkweGYwLCAweGNhLCAweDg4LCAweDY1LCAweDc1LCAweDliLCAweDk2LCAweDc1LCAweGMwLCAweDNjLCAweGFhLCAweDM0LAotCTB4YjAsIDB4Y2YsIDB4YTgsIDB4MzMsIDB4MWUsIDB4MmQsIDB4OGMsIDB4MDQsIDB4Y2MsIDB4YWQsIDB4ZWMsIDB4ZDMsCi0JMHgxMSwgMHg4OSwgMHgyYiwgMHg1MSwgMHhmNiwgMHg3NywgMHgyMywgMHhmYiwgMHg1YiwgMHg5YSwgMHhlYiwgMHgyZiwKLQkweGRiLCAweGFmLCAweGM4LCAweDIyLCAweGY1LCAweGYyLCAweDc1LCAweGMyLCAweGFjLCAweDAzLCAweDFjLCAweDRjLAotCTB4MDQsIDB4ODIsIDB4ZjksIDB4N2EsIDB4NGIsIDB4NTksIDB4ZTcsIDB4YzYsIDB4MGIsIDB4NzUsIDB4ODAsIDB4ZTEsCi0JMHg0NCwgMHg5MCwgMHg3MywgMHgyYSwgMHhiNiwgMHhlZSwgMHg2NywgMHhlYywgMHhmOSwgMHgxYSwgMHg5YywgMHg0NiwKLQkweDNkLCAweDVhLCAweDg3LCAweDg1LCAweDQ3LCAweDg0LCAweGQ1LCAweGVjLCAweDNjLCAweDQ5LCAweGZjLCAweDc0LAotCTB4ZGIsIDB4MzEsIDB4NmIsIDB4ZDIsIDB4MjEsIDB4NzEsIDB4MzQsIDB4ODgsIDB4NWUsIDB4ZmEsIDB4NzUsIDB4NTcsCi0JMHg1MiwgMHg2YywgMHhiYywgMHhmZSwgMHhjYiwgMHg4OSwgMHg4MCwgMHg4MiwgMHg2ZiwgMHgwNCwgMHgzMiwgMHhjZCwKLQkweGE1LCAweDI4LCAweGM3LCAweGJhLCAweDkwLCAweGQ4LCAweGE2LCAweGY5LCAweGU1LCAweGU3LCAweDBjLCAweDNkLAotCTB4YmMsIDB4NDIsIDB4ZTEsIDB4OWMsIDB4MDUsIDB4ZjQsIDB4YTYsIDB4YTUsIDB4MGEsIDB4MTAsIDB4MTgsIDB4MDMsCi0JMHhjZSwgMHhhNCwgMHhjYSwgMHhiMSwgMHhkYSwgMHg3NCwgMHg0MCwgMHhhZCwgMHgwOCwgMHhhMiwgMHgyNywgMHgzZCwKLQkweDE1LCAweGQ3LCAweDRkLCAweGUyLCAweGI0LCAweGI0LCAweDE3LCAweGE0LCAweDVmLCAweDk3LCAweDYwLCAweDk5LAotCTB4OTYsIDB4YjUsIDB4NjksIDB4MzcsIDB4ZGIsIDB4NzYsIDB4MDcsIDB4MzIsIDB4NDEsIDB4OTUsIDB4ZjEsIDB4ZWEsCi0JMHgxMCwgMHgyZiwgMHg5YywgMHg2NCwgMHg1YywgMHg2YSwgMHgzMCwgMHg1YywgMHg2OCwgMHhkMywgMHhjYSwgMHhkMSwKLQkweDYwLCAweGZlLCAweGQ2LCAweDVhLCAweGI2LCAweDRhLCAweGVlLCAweDVkLCAweGM0LCAweGY3LCAweDQyLCAweGY2LAotCTB4ZmIsIDB4YjYsIDB4YTEsIDB4ZmIsIDB4NDcsIDB4NzksIDB4OTIsIDB4NDksIDB4NjUsIDB4YWYsIDB4YzcsIDB4MTksCi0JMHg3MywgMHgzNiwgMHhiMSwgMHhkZCwgMHgyZCwgMHg2YywgMHg3NywgMHhhZCwgMHhhNiwgMHg0NywgMHhlMywgMHgxNywKLQkweGNhLCAweDY1LCAweDgyLCAweDBlLCAweGU4LCAweDlhLCAweDk0LCAweDZkLCAweDY0LCAweGJiLCAweGFiLCAweGQ5LAotCTB4NmUsIDB4OGYsIDB4MjYsIDB4ZjIsIDB4ZmQsIDB4ZDYsIDB4NWEsIDB4YmIsIDB4NGEsIDB4ZWUsIDB4NjUsIDB4ZWQsCi0JMHgyMywgMHhkYiwgMHg2ZSwgMHhiZCwgMHhiNCwgMHg2YiwgMHg4ZSwgMHhlNiwgMHhmYSwgMHgzYSwgMHg5MSwgMHg0MCwKLQkweGJmLCAweDIzLCAweGMyLCAweDE4LCAweDU5LCAweDFmLCAweGYwLCAweDc3LCAweDMxLCAweDVlLCAweDM2LCAweDMyLAotCTB4NzYsIDB4NjQsIDB4NmQsIDB4NjIsIDB4NmEsIDB4YmMsIDB4NDIsIDB4ZmMsIDB4NjIsIDB4MTksIDB4YjksIDB4MjYsCi0JMHhlNSwgMHhjNCwgMHhkNiwgMHgyNiwgMHhhOSwgMHg2NywgMHg4OSwgMHgyZiwgMHgzZSwgMHhlYSwgMHg1NywgMHhiMCwKLQkweGM1LCAweDg5LCAweGMzLCAweDA5LCAweGUyLCAweDNmLCAweGJlLCAweDQ2LCAweGJiLCAweGYzLCAweGEzLCAweDM5LAotCTB4NWQsIDB4ODMsIDB4YjYsIDB4NWQsIDB4OGMsIDB4NjMsIDB4NjYsIDB4MDUsIDB4NmQsIDB4M2QsIDB4NmIsIDB4NmYsCi0JMHhjYiwgMHhkOCwgMHhmNiwgMHhhNCwgMHhkZCwgMHg3NiwgMHg1YywgMHg2OSwgMHg0ZSwgMHhkNywgMHg2YSwgMHgxNSwKLQkweDhjLCAweDk5LCAweGM3LCAweDJmLCAweDYwLCAweGU3LCAweGVjLCAweDY4LCAweDcxLCAweDI0LCAweGQwLCAweGI0LAotCTB4OWUsIDB4OTMsIDB4ZTQsIDB4NjYsIDB4N2MsIDB4ZmIsIDB4Y2UsIDB4YmMsIDB4NmUsIDB4ZGEsIDB4NDUsIDB4MGYsCi0JMHhlZCwgMHgzMCwgMHgzYiwgMHhiZiwgMHg0ZCwgMHg2MiwgMHg3MCwgMHhjNCwgMHgzOCwgMHhhOCwgMHgzNSwgMHg1OCwKLQkweGJiLCAweDRiLCAweGZlLCAweDkzLCAweDZiLCAweGQ0LCAweDNmLCAweGNhLCAweDZiLCAweDM1LCAweDU4LCAweDNkLAotCTB4ZmMsIDB4MGQsIDB4ZGEsIDB4OTksIDB4ZWUsIDB4MTMsIDB4M2IsIDB4ZWMsIDB4YmEsIDB4MjAsIDB4OTcsIDB4YzgsCi0JMHgyNCwgMHhiMiwgMHg4OSwgMHg0YywgMHhmZiwgMHgzNywgMHhjYiwgMHhjZCwgMHhhNCwgMHg3ZSwgMHgwNCwgMHgxYiwKLQkweDJiLCAweDI5LCAweGNmLCAweDM2LCAweGYyLCAweDk5LCAweGEzLCAweGNhLCAweDY3LCAweDI5LCAweDRmLCAweGM2LAotCTB4ZTUsIDB4YzUsIDB4NjMsIDB4NDksIDB4OTEsIDB4NDcsIDB4ODksIDB4Y2UsIDB4ODgsIDB4Y2MsIDB4YzQsIDB4ZjksCi0JMHg2NCwgMHgyMCwgMHhmZSwgMHgzNCwgMHg0NCwgMHhiNiwgMHg2ZSwgMHhhNSwgMHg0NSwgMHhlYSwgMHgyNywgMHg3YiwKLQkweDc4LCAweDJmLCAweDJmLCAweDIzLCAweGI0LCAweDcyLCAweDViLCAweGI2LCAweGFjLCAweDRjLCAweGI3LCAweDcyLAotCTB4YWUsIDB4NWQsIDB4YzYsIDB4ZmQsIDB4YTUsIDB4MjgsIDB4NzMsIDB4ZDIsIDB4ZDYsIDB4YTQsIDB4ZWQsIDB4OWYsCi0JMHg1OSwgMHg1MSwgMHg2ZCwgMHgxMywgMHhhZiwgMHg3OSwgMHgzOSwgMHg0ZiwgMHg2ZSwgMHhjNiwgMHg3NSwgMHgzZCwKLQkweDc4LCAweDhiLCAweDQzLCAweDY5LCAweGY2LCAweDQ4LCAweGJjLCAweGE2LCAweDdkLCAweGE2LCAweDUyLCAweDRlLAotCTB4M2MsIDB4OTMsIDB4NTgsIDB4YmEsIDB4YjQsIDB4YzQsIDB4YjgsIDB4MWEsIDB4ZGYsIDB4MTgsIDB4ZjEsIDB4NjEsCi0JMHg4NCwgMHg3MywgMHhmYiwgMHg2MiwgMHg0MiwgMHhlMiwgMHhlYiwgMHg0YywgMHgzYywgMHg5MSwgMHhmMiwgMHhlMCwKLQkweDg1LCAweDg0LCAweDFmLCAweDhmLCAweDMzLCAweGZlLCAweDRjLCAweDI0LCAweDBjLCAweDFjLCAweDRhLCAweDc5LAotCTB4ZjEsIDB4M2MsIDB4ZWQsIDB4NzksIDB4MzQsIDB4ZTUsIDB4YTMsIDB4YmQsIDB4ZDQsIDB4NjEsIDB4MzgsIDB4ZDUsCi0JMHg2YywgMHg4ZiwgMHhlMSwgMHhkOSwgMHhjNCwgMHhhYiwgMHgzMiwgMHhkNiwgMHhhMCwgMHg4YywgMHg3NSwgMHg4YiwKLQkweDNkLCAweGQ2LCAweDdjLCAweDljLCAweDlmLCAweDc5LCAweDYxLCAweDFlLCAweDRlLCAweDI1LCAweDZjLCAweDFjLAotCTB4ZTgsIDB4NTksIDB4ZTYsIDB4OTAsIDB4NzksIDB4YTAsIDB4Y2QsIDB4MGUsIDB4MDgsIDB4MTYsIDB4ZTgsIDB4ZmQsCi0JMHg3MSwgMHg1OCwgMHhkOCwgMHg2ZiwgMHhjZSwgMHhhMCwgMHhmZiwgMHhmNywgMHg1MCwgMHg1ZSwgMHhlYSwgMHg5NCwKLQkweGUzLCAweDg3LCAweGFiLCAweDJjLCAweDVhLCAweDFhLCAweDA5LCAweGM0LCAweDdhLCAweGE5LCAweDc3LCAweDY3LAotCTB4NDQsIDB4ZjQsIDB4OTAsIDB4ZDUsIDB4ZmIsIDB4OGEsIDB4ZjQsIDB4NTEsIDB4NDUsIDB4YjgsIDB4ZGEsIDB4OTUsCi0JMHgwMywgMHg3MSwgMHhhYiwgMHhjNCwgMHgxMCwgMHg3ZCwgMHgwNywgMHg4OCwgMHhiMywgMHhjMCwgMHhmYywgMHhmZCwKLQkweDRlLCAweDhlLCAweDZmLCAweDI1LCAweGM3LCAweDZjLCAweGEyLCAweGMwLCAweGE4LCAweGQ1LCAweDJhLCAweDI5LAotCTB4ZmIsIDB4ZjEsIDB4M2YsIDB4ODgsIDB4ODEsIDB4YTIsIDB4YTMsIDB4MzUsIDB4YjksIDB4ZjksIDB4MmEsIDB4NzcsCi0JMHg1MCwgMHg1ZSwgMHgzZiwgMHg5MCwgMHg5ZiwgMHgxNywgMHhjYiwgMHhkYSwgMHg2OSwgMHhlNiwgMHhlNywgMHhhNiwKLQkweDFhLCAweGZlLCAweDRhLCAweDNkLCAweDNlLCAweDQ0LCAweDhiLCAweDE4LCAweDQ5LCAweDU0LCAweDIxLCAweGFlLAotCTB4YTksIDB4YjksIDB4YjYsIDB4YTMsIDB4NGEsIDB4MDEsIDB4ZjMsIDB4MDcsIDB4OGMsIDB4OGIsIDB4ZWYsIDB4OTcsCi0JMHgyMiwgMHhlYSwgMHg5NCwgMHhmYSwgMHg4OCwgMHgxNiwgMHg0NCwgMHgwMiwgMHhjMSwgMHhiOSwgMHhlYSwgMHg1NCwKLQkweDliLCAweDExLCAweDFjLCAweDkwLCAweGJlLCAweGUyLCAweDk0LCAweGY1LCAweDUyLCAweDJjLCAweDE4LCAweDQ5LAotCTB4ZTQsIDB4NzEsIDB4ZTMsIDB4M2YsIDB4NTMsIDB4Y2YsIDB4NGIsIDB4MWYsIDB4OWIsIDB4YWEsIDB4NTMsIDB4OTEsCi0JMHg1MywgMHhmNCwgMHhhYSwgMHhhMiwgMHg3NSwgMHg1MCwgMHhmNCwgMHhlNywgMHhjNCwgMHg0YSwgMHg3MywgMHg1MSwKLQkweDRlLCAweGU2LCAweDk5LCAweDY4LCAweDRiLCAweGE4LCAweGQ4LCAweDMwLCAweGM4LCAweGJlLCAweDUyLCAweDBhLAotCTB4MzYsIDB4ODcsIDB4OTYsIDB4NjAsIDB4YzgsIDB4NmIsIDB4ZDMsIDB4NDUsIDB4YjQsIDB4MjYsIDB4MWEsIDB4NjksCi0JMHg2MywgMHhjNCwgMHg5OSwgMHg3MSwgMHgzYiwgMHg3ZSwgMHhkYSwgMHhmZSwgMHgzMywgMHg5YiwgMHgzZSwgMHhiMSwKLQkweDJjLCAweGZkLCAweDIwLCAweGQ2LCAweDI2LCAweDAzLCAweGZlLCAweDkzLCAweDc4LCAweDEwLCAweDZkLCAweDY5LAotCTB4MTcsIDB4NjIsIDB4YzMsIDB4MWUsIDB4NzQsIDB4YjIsIDB4NmYsIDB4YjUsIDB4NGYsIDB4ZmMsIDB4NDksIDB4NDMsCi0JMHhlNywgMHhlOCwgMHg4OSwgMHgxNywgMHg1NCwgMHhkYSwgMHg2NywgMHhlNywgMHhhOCwgMHg5NywgMHhjNywgMHgzNCwKLQkweDFlLCAweDZlLCAweDNjLCAweGM0LCAweGUzLCAweDI4LCAweGU3LCAweGJmLCAweDgzLCAweDE4LCAweDljLCAweDRlLAotCTB4OTgsIDB4YjgsIDB4OWYsIDB4MzIsIDB4OGQsIDB4MjcsIDB4ZWEsIDB4YjEsIDB4OTEsIDB4ZjIsIDB4OGQsIDB4MjUsCi0JMHgxYywgMHhmMCwgMHg0ZiwgMHgwYiwgMHhlMywgMHgzZSwgMHhlYSwgMHhmMiwgMHhjOSwgMHg0NCwgMHg1OCwgMHg3OSwKLQkweDgwLCAweGZmLCAweDBmLCAweDUxLCAweDI2LCAweGM5LCAweDQ3LCAweGQ2LCAweGQxLCAweDBlLCAweGEyLCAweGQzLAotCTB4NjgsIDB4MjcsIDB4NmEsIDB4YWQsIDB4YzMsIDB4OWUsIDB4MDcsIDB4ODgsIDB4N2YsIDB4NWMsIDB4M2UsIDB4NTcsCi0JMHhiYSwgMHgxNiwgMHg0MywgMHg3ZSwgMHhiZSwgMHg4MCwgMHhhMSwgMHgxNCwgMHg2MiwgMHhlZSwgMHg0OCwgMHg1ZCwKLQkweDYzLCAweDQxLCAweDZmLCAweGViLCAweDg2LCAweGMyLCAweDQ4LCAweGZiLCAweDQzLCAweDNmLCAweGFkLCAweDlmLAotCTB4ODUsIDB4OTMsIDB4OWMsIDB4MTMsIDB4YTcsIDB4NmQsIDB4ZTMsIDB4NTEsIDB4YzUsIDB4NjUsIDB4MTgsIDB4YjYsCi0JMHgyZiwgMHhhYiwgMHhlMywgMHhlZCwgMHhiOSwgMHhiYywgMHg0YSwgMHg5NywgMHgzOCwgMHhjNiwgMHgzZSwgMHg0NCwKLQkweDZmLCAweGEyLCAweDBiLCAweGQxLCAweGMzLCAweDcxLCAweDZiLCAweGM4LCAweGY2LCAweDc3LCAweGYxLCAweDM5LAotCTB4MjcsIDB4NzUsIDB4ZjQsIDB4NWQsIDB4YzYsIDB4NmYsIDB4ZDEsIDB4ODUsIDB4OTQsIDB4ZGIsIDB4Y2EsIDB4YjYsCi0JMHg0NCwgMHgxZSwgMHgzYiwgMHgxNiwgMHhmYSwgMHhmZSwgMHhkMCwgMHg3NiwgMHhhNiwgMHhjYSwgMHg1MywgMHg4NywKLQkweGVkLCAweDdiLCAweDBjLCAweGVjLCAweGQ4LCAweDUzLCAweDRiLCAweGJiLCAweGZiLCAweGE1LCAweGU1LCAweGFmLAotCTB4MTgsIDB4NjAsIDB4ZGQsIDB4YTksIDB4YjIsIDB4MDgsIDB4MmYsIDB4NDAsIDB4YWUsIDB4NWQsIDB4NjksIDB4NzMsCi0JMHgxMywgMHhlZiwgMHgxZCwgMHhhNiwgMHhhZCwgMHg0OSwgMHhiYiwgMHg5NiwgMHhiNSwgMHhlNSwgMHg0MiwgMHhkYywKLQkweDI4LCAweDg4LCAweDE2LCAweDMxLCAweDZlLCAweDFjLCAweDRhLCAweDA0LCAweGMyLCAweDJmLCAweGQ4LCAweGIxLAotCTB4Y2QsIDB4NDksIDB4ZGIsIDB4OTAsIDB4ZjksIDB4ZWYsIDB4YjYsIDB4ZTcsIDB4N2UsIDB4ZDksIDB4ODUsIDB4YjksCi0JMHg5ZiwgMHhiYywgMHhjMCwgMHg5MSwgMHhmYSwgMHg5MywgMHg1MywgMHg3ZCwgMHgyYSwgMHgzYiwgMHhlZiwgMHhjZSwKLQkweDNlLCAweGJkLCAweGM3LCAweGI2LCAweGQzLCAweDk0LCAweGUwLCAweDlmLCAweDAzLCAweDhlLCAweDAxLCAweGNlLAotCTB4YjMsIDB4NzksIDB4MTUsIDB4YzcsIDB4NWYsIDB4YzksIDB4NzgsIDB4NTIsIDB4YzAsIDB4ODMsIDB4NzksIDB4ZTQsCi0JMHhmMCwgMHhhNywgMHg1MCwgMHgzYywgMHg5MCwgMHhiMSwgMHg4YSwgMHhmOCwgMHhiYiwgMHgyOSwgMHgxNCwgMHgwOCwKLQkweDE3LCAweDI5LCAweDM3LCAweGUwLCAweGVlLCAweDYxLCAweDA3LCAweDBhLCAweDA2LCAweDE0LCAweDNjLCAweDZiLAotCTB4ZDYsIDB4ZTUsIDB4ZWMsIDB4NDMsIDB4ZTYsIDB4ZmIsIDB4MmEsIDB4ZGIsIDB4M2UsIDB4ZTYsIDB4OGMsIDB4Y2IsCi0JMHg3YywgMHhjYiwgMHgxYywgMHg3YiwgMHhlMCwgMHhlYiwgMHg1MywgMHhlMCwgMHgyMSwgMHg2ZSwgMHg5NCwgMHgxOCwKLQkweDMyLCAweGQ3LCAweDFhLCAweGNhLCAweGZiLCAweDY0LCAweGFlLCAweDQ5LCAweDFiLCAweDc3LCAweDg3LCAweGIxLAotCTB4OTEsIDB4ZjYsIDB4NTAsIDB4YmEsIDB4ZmIsIDB4N2EsIDB4ZGMsIDB4YzcsIDB4NzIsIDB4MWIsIDB4NzgsIDB4NmYsCi0JMHhjMywgMHg2OCwgMHgyNSwgMHgwZiwgMHgyZiwgMHg4ZiwgMHg2OSwgMHgzYywgMHhlYSwgMHg3MSwgMHhlZiwgMHg3MCwKLQkweDBkLCAweGEyLCAweDk1LCAweDdhLCAweGQwLCAweGFmLCAweDNhLCAweDUwLCAweDM5LCAweDIwLCAweDNhLCAweDU1LAotCTB4YjEsIDB4NzIsIDB4ODEsIDB4MDIsIDB4ZjMsIDB4ZWEsIDB4NDIsIDB4YTgsIDB4NzMsIDB4M2YsIDB4YzksIDB4MzcsCi0JMHhmZiwgMHg5YywgMHhhYywgMHgzZiwgMHg5YSwgMHgzMiwgMHg4NywgMHg2ZSwgMHg4ZSwgMHhmZCwgMHg5ZiwgMHhlZCwKLQkweDM5LCAweDljLCAweDMzLCAweDJlLCAweDdkLCAweDQ4LCAweDJjLCAweGI1LCAweGU3LCAweGYxLCAweDRmLCAweGY4LAotCTB4ZmUsIDB4NzMsIDB4OWMsIDB4OGYsIDB4MmUsIDB4OTYsIDB4ZjksIDB4YzMsIDB4ZjksIDB4YzUsIDB4ODUsIDB4ZjksCi0JMHg5ZCwgMHhjYSwgMHg0OSwgMHgyNSwgMHhhZSwgMHhlYiwgMHhlMSwgMHgyMSwgMHg5YiwgMHhjMywgMHhmOCwgMHg5OSwKLQkweGNmLCAweGU5LCAweDcxLCAweGQxLCAweDM5LCAweDM5LCAweDhiLCAweDViLCAweDM1LCAweGUwLCAweDJmLCAweDMwLAotCTB4ZWUsIDB4YzAsIDB4M2QsIDB4OWMsIDB4YTcsIDB4MDMsIDB4MDksIDB4NzUsIDB4YTksIDB4MGIsIDB4ZWEsIDB4NGMsCi0JMHgxNywgMHgxMywgMHhkYiwgMHgxMSwgMHg1MywgMHhjNywgMHhiYSwgMHg2MSwgMHhlNiwgMHg0YSwgMHhjMywgMHhhNSwKLQkweGU4LCAweGQyLCAweDE0LCAweGY3LCAweGY2LCAweGJhLCAweDQ1LCAweDkyLCAweGYzLCAweGZhLCAweGNiLCAweDBkLAotCTB4YTgsIDB4MjUsIDB4OGMsIDB4ZWYsIDB4M2IsIDB4MzQsIDB4MzgsIDB4MGIsIDB4MGMsIDB4NDUsIDB4NGQsIDB4ZDQsCi0JMHgzNSwgMHgyMiwgMHg1ZSwgMHgwMSwgMHg2NywgMHg5OSwgMHgwMSwgMHg4NSwgMHgzOSwgMHgyZCwgMHg3YSwgMHgzNSwKLQkweDA4LCAweGI2LCAweDQ0LCAweDBiLCAweDhjLCAweDA3LCAweDcxLCAweDRmLCAweDEyLCAweDU2LCAweDcxLCAweDg0LAotCTB4ZjksIDB4NGUsIDB4YzQsIDB4MjAsIDB4ODcsIDB4MGQsIDB4ZjgsIDB4MGEsIDB4OTQsIDB4MDcsIDB4YjEsIDB4OWEsCi0JMHhiYywgMHg2MSwgMHhjZCwgMHhiMCwgMHhjOCwgMHhlMSwgMHgyMSwgMHg5ZiwgMHgzMCwgMHhmYywgMHhhZCwgMHg2MCwKLQkweDhlLCAweGRkLCAweGFjLCAweDA3LCAweDI3LCAweDk5LCAweDY3LCAweGFlLCAweGE2LCAweGVlLCAweDQ3LCAweDEyLAotCTB4MGYsIDB4YTIsIDB4MjEsIDB4NzksIDB4ZGMsIDB4ZjIsIDB4OTAsIDB4MjcsIDB4MTYsIDB4MTgsIDB4MzUsIDB4ZTcsCi0JMHhiYiwgMHgxMCwgMHhhMywgMHgwZiwgMHgwYiwgMHhmZiwgMHg2OSwgMHhjMywgMHg0MywgMHhmNCwgMHhiZiwgMHg3NCwKLQkweDQyLCAweDdkLCAweDg2LCAweGVjLCAweDAxLCAweDFkLCAweGEzLCAweGViLCAweDcxLCAweGZmLCAweGU4LCAweDRjLAotCTB4ZmEsIDB4ZWEsIDB4MDYsIDB4ZmEsIDB4MmEsIDB4YjksIDB4NTAsIDB4ZmYsIDB4MGQsIDB4YjgsIDB4NmYsIDB4ZjgsCi0JMHgwNiwgMHhkYywgMHhiYiwgMHhjYiwgMHgwOCwgMHg2ZSwgMHhhMCwgMHhhZSwgMHhkNywgMHgwYywgMHgzMywgMHgxMCwKLQkweDRlLCAweDkzLCAweDc2LCAweGYzLCAweGJhLCAweDEyLCAweDNlLCAweDQ4LCAweDVkLCAweGU0LCAweGY0LCAweDk0LAotCTB4NDEsIDB4OWUsIDB4YTMsIDB4ZmMsIDB4YjMsIDB4YzUsIDB4NGIsIDB4ZjEsIDB4ODIsIDB4N2EsIDB4YzUsIDB4YmYsCi0JMHhiNywgMHhlZSwgMHhmYiwgMHhjYywgMHhiZCwgMHg0NSwgMHg3NiwgMHg0NCwgMHg2NywgMHgxOCwgMHhhZiwgMHg1YSwKLQkweDhmLCAweDZhLCAweDBhLCAweDBhLCAweDIyLCAweDg4LCAweGNmLCAweGFlLCAweDdmLCAweGQ5LCAweDdhLCAweDZjLAotCTB4OTUsIDB4NWMsIDB4YmYsIDB4ZDUsIDB4ODksIDB4NjIsIDB4OTUsIDB4ZDcsIDB4YTQsIDB4Y2QsIDB4MWQsIDB4MzIsCi0JMHg0NywgMHg0NCwgMHhkYSwgMHg0ZiwgMHg2YSwgMHgzMywgMHg2MywgMHhmNSwgMHg1ZCwgMHgyOCwgMHg0ZiwgMHhkZSwKLQkweDQ3LCAweGFjLCAweDdkLCAweDNhLCAweGUxLCAweDQ1LCAweDRmLCAweDMyLCAweGNiLCAweDlkLCAweDZlLCAweDRmLAotCTB4MGIsIDB4NjcsIDB4NzIsIDB4YTMsIDB4YjgsIDB4NTcsIDB4ZTIsIDB4NDYsIDB4MTQsIDB4ZWIsIDB4ZjksIDB4YmIsCi0JMHhhOCwgMHg1NywgMHg2ZiwgMHg4ZSwgMHg4MywgMHhjOSwgMHhiYywgMHhkMSwgMHhjOCwgMHhiOSwgMHhhMCwgMHhiZCwKLQkweGY2LCAweDNhLCAweDUwLCAweDY0LCAweDM0LCAweDY1LCAweDZkLCAweGI1LCAweDc3LCAweDg1LCAweDhkLCAweDRiLAotCTB4NjUsIDB4YmQsIDB4ZGQsIDB4MzYsIDB4MmUsIDB4OTUsIDB4YjIsIDB4OWUsIDB4NjAsIDB4OTIsIDB4YTcsIDB4NzcsCi0JMHgxNSwgMHhlZCwgMHg3NSwgMHgyNiwgMHg0YSwgMHg3YSwgMHg1YiwgMHg3MCwgMHgyZiwgMHhlNywgMHg3OCwgMHgyZCwKLQkweDc5LCAweGY2LCAweDA5LCAweGIzLCAweDNjLCAweGM3LCAweDNmLCAweDliLCAweDcwLCAweDc3LCAweDMyLCAweDhhLAotCTB4ZDYsIDB4NjQsIDB4NGQsIDB4ZjQsIDB4YjQsIDB4YWMsIDB4MjUsIDB4YjksIDB4YjIsIDB4ZDgsIDB4MTksIDB4YWQsCi0JMHgxNiwgMHg1ZCwgMHgzYywgMHg5NywgMHhjMywgMHgwOCwgMHhiZCwgMHgyOSwgMHhjYiwgMHhkOSwgMHg3NCwgMHhjZCwKLQkweGFmLCAweGU0LCAweDY1LCAweGVmLCAweDQ2LCAweDhjLCAweGY5LCAweGM1LCAweGVjLCAweDQ4LCAweDMzLCAweGFjLAotCTB4YTQsIDB4YzgsIDB4MWQsIDB4YjcsIDB4N2MsIDB4Y2MsIDB4MTksIDB4M2QsIDB4MTEsIDB4YmQsIDB4N2QsIDB4YjEsCi0JMHhjMywgMHhlOCwgMHhmOCwgMHhiMSwgMHgxMiwgMHhjNCwgMHhhZCwgMHg5NCwgMHhhMSwgMHhhNCwgMHhiNywgMHgxMywKLQkweGFmLCAweDg0LCAweDc0LCAweGRmLCAweGI3LCAweDE1LCAweGZkLCAweGZjLCAweDA2LCAweGZjLCAweDE4LCAweDNmLAotCTB4ZTcsIDB4YjUsIDB4ODIsIDB4ZGUsIDB4MDksIDB4M2MsIDB4OTYsIDB4N2UsIDB4MWQsIDB4NjcsIDB4MjksIDB4YWIsCi0JMHhkYSwgMHhmYiwgMHhiMSwgMHhiNSwgMHhjYywgMHgyMCwgMHgxOCwgMHgxNCwgMHhiYiwgMHg5NSwgMHhiNywgMHhkMywKLQkweDUzLCAweDZkLCAweGYxLCAweDA2LCAweGFjLCAweGRlLCAweDI1LCAweGY2LCAweGE3LCAweDA3LCAweGUzLCAweGEwLAotCTB4N2MsIDB4NjYsIDB4OTksIDB4NjAsIDB4OWMsIDB4YzQsIDB4MWYsIDB4Y2EsIDB4ZGYsIDB4NGMsIDB4ZDksIDB4MmMsCi0JMHhmYSwgMHgwNywgMHhlZCwgMHhjMCwgMHgxZSwgMHhjMywgMHg0MywgMHgzNiwgMHgwZSwgMHgzYSwgMHhmYiwgMHhlNCwKLQkweGM4LCAweGViLCAweDM5LCAweGEyLCAweGI0LCAweDhlLCAweDVlLCAweDUzLCAweDhjLCAweDYyLCAweDVmLCAweGNlLAotCTB4MGYsIDB4YjIsIDB4NmIsIDB4MGEsIDB4MTcsIDB4ZWIsIDB4ZmUsIDB4ZDIsIDB4MWEsIDB4ZjEsIDB4NWUsIDB4NWEsCi0JMHhiNywgMHg4YywgMHgzOSwgMHg1NiwgMHgzOSwgMHhjNywgMHhmMywgMHg1ZSwgMHg2ZiwgMHhkYywgMHgyYSwgMHhjZSwKLQkweDhlLCAweGE1LCAweGU5LCAweDU1LCAweDQ1LCAweDZjLCAweDMyLCAweDQ4LCAweGVlLCAweGRlLCAweDg5LCAweGFiLAotCTB4NDIsIDB4N2EsIDB4Y2IsIDB4YjcsIDB4MTUsIDB4MjksIDB4YWIsIDB4ODcsIDB4MzcsIDB4MjgsIDB4ZjksIDB4N2UsCi0JMHg3ZSwgMHg4NCwgMHhkMywgMHgyMywgMHhkMiwgMHg4NywgMHhmNCwgMHgzNSwgMHhjMSwgMHg5YywgMHhlYiwgMHg1MiwKLQkweDdmLCAweDRhLCAweGQ5LCAweGYzLCAweGE5LCAweDliLCAweDQzLCAweGU0LCAweDc1LCAweDJiLCAweDM4LCAweGNjLAotCTB4OTIsIDB4NWUsIDB4MTksIDB4OTMsIDB4YTksIDB4ZGMsIDB4M2IsIDB4MmEsIDB4ZjMsIDB4YmEsIDB4NDAsIDB4NTksCi0JMHg0ZiwgMHgyYywgMHgyOSwgMHhlYSwgMHhhZCwgMHg1NywgMHhlZSwgMHgyMSwgMHg5NiwgMHgxNCwgMHhlZSwgMHhhYywKLQkweDUxLCAweGVlLCAweGI2LCAweDZkLCAweGJlLCAweDBhLCAweDIzLCAweGZkLCAweGQ3LCAweDI4LCAweDZkLCAweGMzLAotCTB4YTIsIDB4MDMsIDB4MzcsIDB4YzcsIDB4M2UsIDB4OGQsIDB4NjMsIDB4ZjcsIDB4YTIsIDB4OGYsIDB4ZmUsIDB4ZmIsCi0JMHg0YSwgMHg2ZiwgMHg5ZCwgMHg3MiwgMHgxZiwgMHg3ZCwgMHhhMywgMHg3MywgMHg5NywgMHg4YSwgMHhjOSwgMHgyYSwKLQkweDg1LCAweDc4LCAweDQ3LCAweGZlLCAweDZiLCAweGY4LCAweDk0LCAweGQ2LCAweGUxLCAweGVmLCAweDNiLCAweDI1LAotCTB4YmUsIDB4NjQsIDB4NzAsIDB4MDMsIDB4NWEsIDB4NzksIDB4NmYsIDB4YTksIDB4ZTksIDB4NDIsIDB4NDYsIDB4YWIsCi0JMHhkNSwgMHgzNCwgMHhhYywgMHhjMCwgMHhlYSwgMHhlNCwgMHgyYSwgMHhiNCwgMHgyNSwgMHg4YiwgMHhjOSwgMHg3MywKLQkweDY1LCAweGJjLCAweDc5LCAweGI5LCAweGYzLCAweGYzLCAweGY4LCAweDIwLCAweDVhLCAweDkyLCAweDg4LCAweGNmLAotCTB4ODgsIDB4MDQsIDB4M2EsIDB4NjYsIDB4MzgsIDB4ZTgsIDB4ZDIsIDB4YzUsIDB4NzUsIDB4Y2EsIDB4ZmQsIDB4ZTksCi0JMHgxYSwgMHg2NSwgMHhjZCwgMHhhZSwgMHg3MiwgMHg2NCwgMHhiMSwgMHhlNywgMHg2MSwgMHgzNCwgMHhlZCwgMHhhOSwKLQkweDU3LCAweGVlLCAweGRlLCAweDUzLCAweDg1LCAweDQ5LCAweGNkLCAweGIyLCAweDljLCAweGExLCAweDdhLCAweGE1LAotCTB4NzUsIDB4OGYsIDB4NjUsIDB4ZGQsIDB4NjQsIDB4NDYsIDB4OWIsIDB4OGEsIDB4YzksIDB4NzcsIDB4YjcsIDB4YjEsCi0JMHhiZCwgMHhkNiwgMHg1MSwgMHhlOSwgMHhlNywgMHhmMiwgMHg3NiwgMHg0ZCwgMHg2NSwgMHhlMywgMHg5ZSwgMHg4NywKLQkweGIxLCAweDgyLCAweDY1LCAweDVmLCAweDA5LCAweDQ1LCAweDViLCAweDRhLCAweDU5LCAweDU2LCAweDc0LCAweGQ2LAotCTB4M2EsIDB4ZmEsIDB4MTksIDB4ZjYsIDB4MjEsIDB4ZTUsIDB4MTcsIDB4NGMsIDB4NjksIDB4NjcsIDB4MzEsIDB4YWYsCi0JMHg0OSwgMHg1YiwgMHg1OSwgMHhkZCwgMHg4OSwgMHhkZSwgMHgxZSwgMHhjZiwgMHhlYSwgMHgyZCwgMHgyYywgMHg3YSwKLQkweDViLCAweDRlLCAweDVkLCAweGJhLCAweDdhLCAweDdkLCAweDNjLCAweDVjLCAweGY0LCAweDc1LCAweDFmLCAweGQ2LAotCTB4YTQsIDB4NjUsIDB4NGMsIDB4MzMsIDB4ODksIDB4MDMsIDB4Y2QsIDB4YjQsIDB4ZGIsIDB4NzYsIDB4YjQsIDB4NTIsCi0JMHhhZiwgMHg3MSwgMHgyZCwgMHg2YiwgMHg5ZiwgMHgxNywgMHg3ZCwgMHg0YiwgMHhmNywgMHg0ZiwgMHg3MiwgMHhlYywKLQkweGFkLCAweDQ5LCAweGQxLCAweDRiLCAweDMzLCAweGNiLCAweGRiLCAweGY3LCAweGU5LCAweGRiLCAweDUzLCAweGNiLAotCTB4NWMsIDB4M2EsIDB4NTcsIDB4ZmIsIDB4MTMsIDB4YzIsIDB4MjcsIDB4MGEsIDB4YzgsIDB4N2QsIDB4MGEsIDB4ZDgsCi0JMHg1ZSwgMHg5NiwgMHgyYiwgMHg4YSwgMHhiZCwgMHgzOCwgMHg2OCwgMHgyZiwgMHhjZiwgMHg5OCwgMHhjNSwgMHhkOCwKLQkweGU0LCAweDk1LCAweDMxLCAweDY2LCAweGY1LCAweDBjLCAweDE1LCAweDU4LCAweGM3LCAweDdiLCAweDJlLCAweGRlLAotCTB4MmIsIDB4MGMsIDB4MTUsIDB4ZTIsIDB4MmQsIDB4NWIsIDB4NTcsIDB4NTksIDB4M2UsIDB4OTgsIDB4ZjcsIDB4ZjMsCi0JMHhhMSwgMHgwYiwgMHhmZCwgMHgxYywgMHhhYiwgMHhjZSwgMHhkYSwgMHhkOCwgMHgyNiwgMHg1NywgMHg5NiwgMHgzMywKLQkweGU2LCAweGI5LCAweDhkLCAweDY1LCAweDBkLCAweDk4LCAweDc5LCAweDZlLCAweDIzLCAweDcxLCAweGVlLCAweDUzLAotCTB4YzIsIDB4MTUsIDB4NmMsIDB4MWUsIDB4ZDYsIDB4OTYsIDB4ZWIsIDB4YjcsIDB4Y2IsIDB4MGMsIDB4ZDAsIDB4NGYsCi0JMHg4NSwgMHhmYiwgMHg0NSwgMHg5NCwgMHhiNiwgMHgzZCwgMHhhNywgMHg2OCwgMHhhYiwgMHg5MiwgMHg4YiwgMHgwMSwKLQkweDFiLCAweDc5LCAweGJmLCAweDk0LCAweGY3LCAweDVmLCAweDBiLCAweGI5LCAweDcwLCAweGQ1LCAweDM0LCAweGU5LAotCTB4ZmIsIDB4MDYsIDB4NzQsIDB4ZWMsIDB4OGEsIDB4YTIsIDB4N2MsIDB4NjEsIDB4MDAsIDB4OTMsIDB4ZjYsIDB4N2EsCi0JMHg1OSwgMHg5ZSwgMHhhNywgMHhiYiwgMHg3MCwgMHhkZiwgMHhhZSwgMHg4ZiwgMHhhZCwgMHgzMiwgMHg5YiwgMHgzYiwKLQkweDFhLCAweGIxLCAweDcxLCAweDQ1LCAweGM1LCAweDhlLCAweDQ1LCAweGMyLCAweGQ3LCAweDVkLCAweDhjLCAweDU3LAotCTB4ZTQsIDB4Y2UsIDB4OTIsIDB4MGIsIDB4YjgsIDB4NGEsIDB4YzgsIDB4YjksIDB4ODUsIDB4NzMsIDB4MDYsIDB4MzIsCi0JMHhiNywgMHhhYiwgMHhkMCwgMHhiNCwgMHg4OCwgMHg3MCwgMHhjZiwgMHg5OSwgMHgzNiwgMHhlNywgMHgxNiwgMHhlZSwKLQkweGZkLCAweGNkLCAweGU0LCAweGQxLCAweDI5LCAweGRjLCAweGZiLCAweDAyLCAweDRmLCAweDYxLCAweGFlLCAweGQ2LAotCTB4OGMsIDB4NDQsIDB4YWYsIDB4MDcsIDB4ZWUsIDB4ODgsIDB4ZGUsIDB4YmMsIDB4NTksIDB4ZTksIDB4YzQsIDB4ZjIsCi0JMHg5MCwgMHg2MSwgMHhjYSwgMHgxYSwgMHhjMCwgMHhmNSwgMHg4YSwgMHgxZSwgMHgzYywgMHg4NywgMHgyMCwgMHhlMywKLQkweGM3LCAweDhmLCAweDMwLCAweDMyLCAweGY4LCAweDBmLCAweDJlLCAweGYxLCAweDhiLCAweGNkLCAweGU5LCAweDhiLAotCTB4ZjIsIDB4ZGMsIDB4NGQsIDB4NzksIDB4ZGMsIDB4NTksIDB4NzksIDB4Y2MsIDB4NzMsIDB4NTQsIDB4ZTQsIDB4YjMsCi0JMHhmNSwgMHgyZSwgMHhlMiwgMHhmMCwgMHg3ZiwgMHhiNywgMHhlZCwgMHg3NiwgMHg4OSwgMHg5ZCwgMHg0YiwgMHhmYywKLQkweDc3LCAweGM2LCAweDkzLCAweDcwLCAweDcxLCAweDVlLCAweGNmLCAweDlkLCAweGM0LCAweGFiLCAweDBmLCAweDE3LAotCTB4MTYsIDB4MjEsIDB4NDQsIDB4N2IsIDB4YWYsIDB4MzAsIDB4M2EsIDB4OTgsIDB4Y2YsIDB4N2YsIDB4NmMsIDB4YzUsCi0JMHg5ZCwgMHhhNCwgMHhkZiwgMHgwNiwgMHhiNCwgMHhhMiwgMHg0OCwgMHg5NCwgMHhiMiwgMHgzNSwgMHgyYSwgMHgzNywKLQkweDBkLCAweDhmLCAweGIzLCAweDlmLCAweDBlLCAweGU2LCAweDI5LCAweDFlLCAweDNjLCAweDQwLCAweDVjLCAweDc5LAotCTB4ODAsIDB4ZmUsIDB4ZjQsIDB4MDAsIDB4NjMsIDB4ZjMsIDB4MDMsIDB4YTMsIDB4ZmYsIDB4OGIsIDB4ZDcsIDB4YTcsCi0JMHhkOSwgMHhiZiwgMHgzNywgMHgyNywgMHhmMywgMHhmNiwgMHhlNSwgMHg2NCwgMHg5YywgMHgxMywgMHhmZCwgMHg2ZSwKLQkweDIxLCAweDE2LCAweDQ4LCAweDljLCAweDAzLCAweDY1LCAweGIyLCAweDcwLCAweGRhLCAweDJjLCAweGE0LCAweGFlLAotCTB4ZjUsIDB4NjAsIDB4MDYsIDB4MDksIDB4ZDcsIDB4YzUsIDB4M2MsIDB4MzUsIDB4MWYsIDB4MmIsIDB4NjUsIDB4MWUsCi0JMHg1ZCwgMHhiOCwgMHg4NywgMHgzMiwgMHgwNiwgMHg0MywgMHhiZiwgMHhiMSwgMHg1MCwgMHgyMSwgMHg1OCwgMHg3NCwKLQkweGY5LCAweGZkLCAweGVjLCAweGJjLCAweDFlLCAweGJmLCAweGMwLCAweDU5LCAweDE1LCAweGM5LCAweDkxLCAweGU4LAotCTB4ZWYsIDB4ZmQsIDB4MzYsIDB4MDcsIDB4N2IsIDB4OGQsIDB4M2UsIDB4ZDksIDB4YjYsIDB4ZWIsIDB4YzQsIDB4N2MsCi0JMHgzMSwgMHg5NSwgMHgzNSwgMHhhMywgMHg1MSwgMHg2YywgMHhlMiwgMHhiOCwgMHg1NywgMHgwZiwgMHgzZiwgMHg5YSwKLQkweGQzLCAweDRiLCAweDdlLCAweGJjLCAweGUyLCAweGQzLCAweDFlLCAweGRhLCAweDc0LCAweDM2LCAweGI3LCAweDZhLAotCTB4MWQsIDB4MTUsIDB4MmUsIDB4NWUsIDB4YzksIDB4ZmYsIDB4YzIsIDB4YzUsIDB4YzUsIDB4N2YsIDB4ODQsIDB4OTcsCi0JMHg0ZiwgMHhlMywgMHg3ZiwgMHgyNywgMHgzOSwgMHhhNywgMHg3MCwgMHhlOSwgMHgzYSwgMHhmNCwgMHhkMCwgMHg4ZiwKLQkweDBhLCAweDAzLCAweDc1LCAweGQ4LCAweDNhLCAweDdhLCAweGY5LCAweDFjLCAweDVkLCAweDJlLCAweDhmLCAweDNkLAotCTB4MDcsIDB4Y2MsIDB4YzMsIDB4NWMsIDB4ODIsIDB4YWQsIDB4N2UsIDB4YmYsIDB4MmEsIDB4N2QsIDB4NWIsIDB4NjgsCi0JMHgzNywgMHg2ZiwgMHhjOCwgMHg3MiwgMHhhNywgMHg0YSwgMHhiOSwgMHgzNiwgMHg5NSwgMHg5ZiwgMHhlNywgMHhkYiwKLQkweDk5LCAweDdhLCAweDRkLCAweDJkLCAweDQwLCAweDcxLCAweDllLCAweDM3LCAweDc4LCAweDczLCAweGI5LCAweDBlLAotCTB4ZjMsIDB4OWIsIDB4YTQsIDB4ZTgsIDB4NGIsIDB4YzYsIDB4OTAsIDB4Y2QsIDB4NWYsIDB4YzUsIDB4NWUsIDB4MmUsCi0JMHhjNSwgMHg4MywgMHhmOCwgMHhiNCwgMHgyMiwgMHg0MywgMHg2YywgMHgyNSwgMHg0OCwgMHg3ZiwgMHhkNiwgMHhjMywKLQkweDRkLCAweDBjLCAweDM1LCAweDY3LCAweDEzLCAweDg4LCAweDM5LCAweDIyLCAweDRkLCAweDhkLCAweDZiLCAweDEyLAotCTB4NzMsIDB4YjUsIDB4NjcsIDB4NzIsIDB4ZjksIDB4ZjEsIDB4N2UsIDB4YzYsIDB4MWUsIDB4ZDUsIDB4OTAsIDB4YjUsCi0JMHgxOSwgMHhkYSwgMHhjMywgMHhiMCwgMHhlOCwgMHhhNywgMHg0MywgMHhiOSwgMHg5OCwgMHgwYiwgMHg0NywgMHhjOSwKLQkweDE1LCAweDE5LCAweDU3LCAweDBkLCAweGM5LCAweDkxLCAweDFhLCAweDk1LCAweGE1LCAweGMzLCAweDUyLCAweDg3LAotCTB4ZjYsIDB4NzAsIDB4MTksIDB4NjcsIDB4Y2MsIDB4OGUsIDB4YjcsIDB4MGMsIDB4OWUsIDB4MDEsIDB4ZTEsIDB4OGEsCi0JMHgzYSwgMHgzNiwgMHg5MCwgMHg5YiwgMHg5NCwgMHgwYywgMHhmOCwgMHg2OSwgMHhlZiwgMHg5NSwgMHgyOCwgMHhkZSwKLQkweDFkLCAweGMxLCAweGZhLCAweDUxLCAweDBkLCAweDQ1LCAweGJiLCAweDJkLCAweDZiLCAweDZlLCAweGE4LCAweDFiLAotCTB4NmIsIDB4ZDMsIDB4Y2IsIDB4MGIsIDB4MjQsIDB4OWYsIDB4NzMsIDB4ZjYsIDB4MTEsIDB4MmIsIDB4ODgsIDB4MmIsCi0JMHhlYiwgMHg5MiwgMHgwYSwgMHg2ZSwgMHgyNCwgMHgwNywgMHg4OCwgMHhhMiwgMHg5OSwgMHhkYywgMHg1ZCwgMHhmMCwKLQkweGM1LCAweGVhLCAweDljLCAweDFkLCAweDcxLCAweGQxLCAweDRlLCAweDU2LCAweGYxLCAweDdlLCAweDBiLCAweGIxLAotCTB4YTcsIDB4ODUsIDB4NTgsIDB4NjIsIDB4NTksIDB4MWYsIDB4NWUsIDB4OGIsIDB4Y2UsIDB4OTIsIDB4YzgsIDB4MWQsCi0JMHhjNCwgMHhhMCwgMHgxYSwgMHhlNiwgMHgwZiwgMHhjMiwgMHgzOSwgMHhhZSwgMHg0NSwgMHgxYiwgMHhiMSwgMHhiYiwKLQkweGIwLCAweGNmLCAweGNlLCAweGYxLCAweGE4LCAweDQ3LCAweGM2LCAweGQ1LCAweDM0LCAweGUzLCAweDMyLCAweDY1LAotCTB4N2YsIDB4OWUsIDB4N2MsIDB4YmQsIDB4ODMsIDB4N2UsIDB4NTQsIDB4ZGUsIDB4YjcsIDB4ODEsIDB4ZjEsIDB4ZDksCi0JMHg4MywgMHhiMiwgMHg4MSwgMHg2YiwgMHhiMCwgMHg5MSwgMHhkOCwgMHg3ZSwgMHhkZiwgMHgyZSwgMHgzZiwgMHg1MiwKLQkweDhiLCAweDZlLCAweGEwLCAweDdjLCAweDBmLCAweDYyLCAweDdkLCAweGQyLCAweDkwLCAweGJjLCAweDJlLCAweDFhLAotCTB4NWMsIDB4ZjQsIDB4MjAsIDB4ZmIsIDB4YTUsIDB4N2QsIDB4ZWMsIDB4OTIsIDB4MWMsIDB4YjEsIDB4MDQsIDB4NGIsCi0JMHg5YSwgMHg4MSwgMHg2MCwgMHg5ZiwgMHg2MCwgMHg4ZSwgMHg4YywgMHhmZiwgMHgzNiwgMHg1OSwgMHhjZiwgMHg4MiwKLQkweGQxLCAweDM3LCAweDc1LCAweDNlLCAweGE2LCAweDcyLCAweDM5LCAweDU5LCAweDFiLCAweDZjLCAweGM2LCAweDdjLAotCTB4YzYsIDB4MmYsIDB4YjEsIDB4MjEsIDB4OGQsIDB4NzksIDB4NmYsIDB4OTEsIDB4NjIsIDB4ZjgsIDB4ZjYsIDB4ZDMsCi0JMHgxNywgMHgyNSwgMHgxNywgMHhiYiwgMHhhZSwgMHgyZiwgMHgxZiwgMHhhZiwgMHhmNSwgMHhjYywgMHg2MiwgMHg0NywKLQkweDI3LCAweGIxLCAweDQyLCAweDZmLCAweGZmLCAweGFkLCAweGEyLCAweGFmLCAweDNiLCAweGE1LCAweGZjLCAweDE4LAotCTB4MDcsIDB4YzcsIDB4NWUsIDB4YzcsIDB4ZDAsIDB4OTgsIDB4NWIsIDB4MTksIDB4MWQsIDB4OTMsIDB4YmUsIDB4MjYsCi0JMHhkMCwgMHg5YiwgMHhmZSwgMHg3MywgMHg3ZCwgMHg0ZCwgMHg1ZCwgMHgxMywgMHg1YSwgMHg3NCwgMHhjOSwgMHgzYSwKLQkweGQyLCAweDhkLCAweGI5LCAweGRjLCAweDc1LCAweGU5LCAweDI1LCAweDljLCAweDVlLCAweGU2LCAweDQ0LCAweDZjLAotCTB4Y2YsIDB4OGIsIDB4ZWUsIDB4ZTQsIDB4YzUsIDB4YjUsIDB4OGEsIDB4ZmUsIDB4YzQsIDB4NzYsIDB4ZGIsIDB4MDcsCi0JMHg5YiwgMHhkMywgMHg2MiwgMHg5MywgMHhjYywgMHhlZiwgMHhjYywgMHgzOSwgMHhmNiwgMHhiMywgMHgxYiwgMHg1OSwKLQkweDVmLCAweDU4LCAweGIzLCAweGFiLCAweGQ3LCAweGJlLCAweDc3LCAweGQwLCAweGZjLCAweDJiLCAweDY0LCAweGVjLAotCTB4NmIsIDB4OGIsIDB4ZTksIDB4N2YsIDB4OGMsIDB4OTMsIDB4YzQsIDB4YmQsIDB4NjAsIDB4YzgsIDB4ODcsIDB4YzIsCi0JMHgwYSwgMHg1OSwgMHg1YiwgMHhiYSwgMHhiOCwgMHgxZSwgMHhiMSwgMHg2MSwgMHgxNywgMHg2OSwgMHg4NCwgMHg4ZCwKLQkweDJiLCAweDBkLCAweGM0LCAweGI4LCAweDFhLCAweGNlLCAweDc3LCAweDE2LCAweDRiLCAweGQ2LCAweGQzLCAweDg2LAotCTB4NmUsIDB4MTEsIDB4MWIsIDB4NzIsIDB4NjUsIDB4NmQsIDB4ZTgsIDB4MGYsIDB4ZDcsIDB4M2MsIDB4NTQsIDB4OTAsCi0JMHhhZiwgMHg2YSwgMHg2NSwgMHg3NiwgMHgyZSwgMHhkYSwgMHhhOCwgMHhkYywgMHg5YSwgMHhiMywgMHhhYiwgMHhjZiwKLQkweGE2LCAweGJmLCAweDUzLCAweDkwLCAweGNiLCAweDkxLCAweDJlLCAweDJiLCAweGZmLCAweDQ5LCAweDNhLCAweGI4LAotCTB4ZTYsIDB4MmYsIDB4ZDAsIDB4ODEsIDB4NjAsIDB4YmUsIDB4ZTQsIDB4MzEsIDB4YTIsIDB4ODMsIDB4OTksIDB4NTMsCi0JMHhmYywgMHhmMiwgMHg5MywgMHhmNCwgMHg1MCwgMHg5YiwgMHhkMywgMHhjMywgMHg2MiwgMHg2MiwgMHg0OCwgMHgyNSwKLQkweDcxLCAweDRmLCAweDM4LCAweDRiLCAweDAwLCAweDRmLCAweDZhLCAweDc5LCAweDNkLCAweDM4LCAweDczLCAweDdhLAotCTB4ZDAsIDB4ZmYsIDB4NDAsIDB4MGYsIDB4ZjcsIDB4MTMsIDB4NWYsIDB4NGIsIDB4ZDksIDB4NTYsIDB4MzEsIDB4OGYsCi0JMHg3NywgMHhhOSwgMHg4NywgMHg4ZCwgMHhjMywgMHg4YiwgMHhmMSwgMHgwMCwgMHg3ZCwgMHg2OSwgMHg4MywgMHhiZCwKLQkweDVlLCAweDIzLCAweGNmLCAweGVmLCAweDVjLCAweDk3LCAweGU4LCAweDY2LCAweDI1LCAweGU1LCAweGY3LCAweDE3LAotCTB4YTgsIDB4OTgsIDB4NDEsIDB4MWQsIDB4ZjgsIDB4NmMsIDB4M2MsIDB4OTUsIDB4M2UsIDB4MWEsIDB4OTUsIDB4ZGIsCi0JMHg4NywgMHgwNSwgMHhlMywgMHgzZSwgMHhhNiwgMHgwZSwgMHgzYSwgMHgxOCwgMHgwNywgMHhmZSwgMHg1NCwgMHg5ZSwKLQkweDIxLCAweGZkLCAweDdmLCAweDdjLCAweDQxLCAweDU3LCAweDdmLCAweGJjLCAweGRjLCAweDhmLCAweGE5LCAweDAzLAotCTB4NzksIDB4MjYsIDB4MjIsIDB4NmIsIDB4ZWMsIDB4ZjIsIDB4N2MsIDB4NDQsIDB4ZjQsIDB4NjEsIDB4NGMsIDB4ZDEsCi0JMHg4MywgMHg2NSwgMHgxZCwgMHgzMSwgMHhlNywgMHgyMSwgMHg1NiwgMHhhOSwgMHhmNywgMHg0YiwgMHgxYywgMHhlZCwKLQkweDI3LCAweGE2LCAweDM4LCAweDk4LCAweGI3LCAweDE3LCAweDQ0LCAweGEyLCAweDE0LCAweDViLCAweGJkLCAweDgxLAotCTB4NGMsIDB4YTcsIDB4Y2UsIDB4ODEsIDB4NGUsIDB4OWMsIDB4MzEsIDB4OGQsIDB4OWUsIDB4YjUsIDB4ZjgsIDB4MmIsCi0JMHg3NCwgMHg3OSwgMHgyZCwgMHgxYywgMHg2MCwgMHgzYiwgMHg5YiwgMHg5MiwgMHg0NSwgMHg1OCwgMHg1NywgMHg0NywKLQkweGQzLCAweDVjLCAweGU5LCAweGMxLCAweGNlLCAweDY0LCAweGJjLCAweDg1LCAweGQwLCAweGMyLCAweGQ4LCAweDc0LAotCTB4ZTYsIDB4ZjYsIDB4NDQsIDB4NDAsIDB4NmYsIDB4ZGUsIDB4NDAsIDB4YmUsIDB4YjYsIDB4YmMsIDB4ZDcsIDB4MGQsCi0JMHhiZiwgMHg5MiwgMHg4ZCwgMHhjZiwgMHgwMywgMHhhYSwgMHhhYywgMHg3ZiwgMHg1ZSwgMHhjOSwgMHhiMSwgMHg3NywKLQkweGRiLCAweDc5LCAweGFjLCAweDdmLCAweDlhLCAweGY0LCAweGUzLCAweDQ3LCAweDNjLCAweDJkLCAweDc1LCAweGE5LAotCTB4YjMsIDB4YjksIDB4MGEsIDB4OTYsIDB4Y2YsIDB4ZDUsIDB4ZTMsIDB4NTEsIDB4YzUsIDB4YjIsIDB4MTYsIDB4ODQsCi0JMHg5YywgMHhmNiwgMHhmZCwgMHhlZCwgMHhlOSwgMHhkYSwgMHg5NiwgMHhkYiwgMHhkNCwgMHhkNywgMHhhZCwgMHhlYywKLQkweDlhLCAweGFiLCAweGFlLCAweDQ1LCAweDk5LCAweDBjLCAweDFkLCAweGZmLCAweGEzLCAweGNmLCAweDFkLCAweDgyLAotCTB4OTAsIDB4ZTcsIDB4NDEsIDB4NmUsIDB4NjMsIDB4MjUsIDB4MGUsIDB4ZTUsIDB4ZDYsIDB4MWQsIDB4NWQsIDB4OTEsCi0JMHhjMywgMHg1ZiwgMHgzZSwgMHg2MCwgMHg0OCwgMHhiZSwgMHgyNiwgMHg3YSwgMHg5MiwgMHhmZSwgMHhjNCwgMHg5ZSwKLQkweDFlLCAweDI4LCAweDE0LCAweDFjLCAweGVkLCAweDRhLCAweDJmLCAweGU0LCAweDNjLCAweGZlLCAweDg3LCAweDM1LAotCTB4ZWEsIDB4OWQsIDB4NWEsIDB4NzYsIDB4ODksIDB4OWEsIDB4N2QsIDB4OGUsIDB4MjAsIDB4NjUsIDB4ZjMsIDB4ZTUsCi0JMHhlNiwgMHgxMCwgMHg1NywgMHgxYSwgMHgzMCwgMHg3YywgMHg0OSwgMHg5YiwgMHg5MiwgMHg2ZiwgMHhlNywgMHhkYiwKLQkweGVjLCAweDJkLCAweDE0LCAweDVlLCAweDU1LCAweDgxLCAweDQyLCAweGUyLCAweGUzLCAweDZmLCAweGFjLCAweDgzLAotCTB4OTcsIDB4YjQsIDB4YjcsIDB4ZDEsIDB4OTUsIDB4NmQsIDB4NmYsIDB4MGYsIDB4Y2IsIDB4NDgsIDB4ZDksIDB4MDIsCi0JMHhkNiwgMHg3OSwgMHgzNywgMHhjNywgMHg3ZiwgMHhmMywgMHg2NSwgMHgzZSwgMHg3NywgMHg1OSwgMHgxOSwgMHg2NiwKLQkweDc4LCAweGM2LCAweDViLCAweGQ2LCAweGZlLCAweDRiLCAweGNhLCAweDdjLCAweGRhLCAweDc5LCAweDY5LCAweDE5LAotCTB4MjcsIDB4NjYsIDB4MWIsIDB4YWYsIDB4NWIsIDB4YzcsIDB4MmYsIDB4MjksIDB4MzMsIDB4NzAsIDB4NTksIDB4OTksCi0JMHg2YiwgMHgzMSwgMHg1NiwgMHhmNywgMHhiOCwgMHgzNSwgMHg5NCwgMHg5ZCwgMHg5YiwgMHgwYywgMHg1ZCwgMHhkMCwKLQkweDNkLCAweDIzLCAweGUyLCAweGZlLCAweGQyLCAweDc1LCAweGYzLCAweDc0LCAweGYyLCAweDRkLCAweDc5LCAweDE2LAotCTB4ZTUsIDB4NDYsIDB4MjYsIDB4M2IsIDB4MzcsIDB4NzEsIDB4OTksIDB4MWIsIDB4ZDcsIDB4ODIsIDB4ZmMsIDB4ZGMsCi0JMHgzYywgMHg5MCwgMHhhYiwgMHg5ZiwgMHg2ZiwgMHgzNywgMHg1NiwgMHg3MCwgMHg2OSwgMHhiYiwgMHhmOSwgMHhlYiwKLQkweDhlLCAweGNiLCAweGU0LCAweDllLCAweGI4LCAweGFjLCAweDVjLCAweDUxLCAweGUxLCAweDI3LCAweGQ3LCAweGZiLAotCTB4ODEsIDB4ZTMsIDB4ZDIsIDB4ZWIsIDB4ZmYsIDB4NDMsIDB4YmQsIDB4ZjQsIDB4ZmMsIDB4OWEsIDB4ZGMsIDB4NzksCi0JMHg1ZSwgMHhmZiwgMHhkNiwgMHg2NSwgMHhmNywgMHgxZCwgMHg5NywgMHg5ZCwgMHgzZiwgMHhhMywgMHg3ZSwgMHg3MiwKLQkweDNmLCAweGFiLCAweDJlLCAweGViLCAweGM3LCAweDVlLCAweDgzLCAweGM3LCAweDczLCAweDE3LCAweDcwLCAweDAzLAotCTB4OGQsIDB4MDUsIDB4MDgsIDB4OTgsIDB4NGUsIDB4MDUsIDB4N2UsIDB4ZTIsIDB4ODcsIDB4ZmYsIDB4ZjksIDB4Y2IsCi0JMHhkNiwgMHhlMiwgMHgxYiwgMHgyZiwgMHhlMCwgMHhjNywgMHgyNSwgMHg1YywgMHgzNSwgMHg1NiwgMHgxOCwgMHg5MSwKLQkweDM4LCAweDI4LCAweDNjLCAweDU1LCAweGY4LCAweGUyLCAweDI3LCAweGYxLCAweGVmLCAweGIyLCAweDU4LCAweDUxLAotCTB4YTQsIDB4MWUsIDB4ZmUsIDB4YjEsIDB4OTksIDB4ZmUsIDB4YjcsIDB4MTIsIDB4YjIsIDB4MWUsIDB4ZmIsIDB4N2IsCi0JMHg3MiwgMHgyZSwgMHhjMywgMHg3NywgMHgwOCwgMHgzMywgMHhmZCwgMHgzZiwgMHg0ZCwgMHg5NSwgMHhiOCwgMHg1MSwKLQkweGU2LCAweGMxLCAweDhkLCAweDg5LCAweDRmLCAweGFlLCAweGE3LCAweDQ2LCAweGEwLCAweDJjLCAweGFiLCAweGY3LAotCTB4MzEsIDB4YWYsIDB4ODQsIDB4ZjMsIDB4YTYsIDB4NzksIDB4OTgsIDB4ZjIsIDB4ZDcsIDB4MmMsIDB4NzksIDB4YWUsCi0JMHg3YSwgMHhiMiwgMHgzZSwgMHhjYywgMHgxOCwgMHg5ZiwgMHg3ZCwgMHg4ZSwgMHhiYywgMHgyNCwgMHhhZCwgMHhmYiwKLQkweGEyLCAweDRhLCAweGY2LCAweDU5LCAweGYxLCAweGJhLCAweGQwLCAweDQ3LCAweGU0LCAweDQ1LCAweDlkLCAweDk0LAotCTB4Y2IsIDB4NjIsIDB4NWYsIDB4YzAsIDB4ODYsIDB4ODQsIDB4NjUsIDB4M2QsIDB4YzcsIDB4ZmMsIDB4NWMsIDB4ZjYsCi0JMHgyMCwgMHhmYywgMHgyMiwgMHhmNSwgMHgzYiwgMHg2YiwgMHhjMiwgMHhlYiwgMHhjNCwgMHhkYiwgMHhjNiwgMHhkNCwKLQkweGY2LCAweGZjLCAweDI4LCAweDhmLCAweDk4LCAweGNjLCAweDEzLCAweGVkLCAweDEzLCAweDc1LCAweGNjLCAweGE4LAotCTB4NmQsIDB4M2YsIDB4NDAsIDB4YmYsIDB4OWIsIDB4MWYsIDB4ZDAsIDB4ZmQsIDB4N2QsIDB4ZjgsIDB4M2YsIDB4OTYsCi0JMHhiZiwgMHg1YSwgMHgwZiwgMHgwZSwgMHgyOSwgMHhmOSwgMHhmNSwgMHhlZiwgMHhjYiwgMHhkNywgMHhiOSwgMHhjYiwKLQkweDYyLCAweDJlLCAweDhlLCAweDZmLCAweGJmLCAweGJkLCAweGQ2LCAweDVkLCAweDQwLCAweGFjLCAweDQ0LCAweGNjLAotCTB4MTksIDB4OTksIDB4ZTksIDB4ZGYsIDB4OWEsIDB4YjAsIDB4YzcsIDB4NDksIDB4NWUsIDB4YTksIDB4ZTAsIDB4NjQsCi0JMHhmZCwgMHg0YywgMHhmZiwgMHhhNiwgMHg5NCwgMHgxNywgMHgzYiwgMHgxOCwgMHhkMywgMHg4YiwgMHg4YywgMHg3YSwKLQkweDNjLCAweDllLCAweDUyLCAweDcxLCAweGNmLCAweDIzLCAweDVlLCAweGFjLCAweDIxLCAweDY3LCAweDZkLCAweGVmLAotCTB4ZmQsIDB4MWEsIDB4OGMsIDB4YWIsIDB4OWMsIDB4YjgsIDB4OWIsIDB4ZjYsIDB4YjcsIDB4OTYsIDB4YWUsIDB4MjMsCi0JMHhmOSwgMHhjMywgMHhmYSwgMHg1ZSwgMHgyNywgMHhlYSwgMHhhZSwgMHgyYSwgMHg0MywgMHhiYywgMHhiYSwgMHgxMCwKLQkweGRmLCAweDMzLCAweDFkLCAweGNjLCAweGY3LCAweDRhLCAweDMwLCAweDY0LCAweDczLCAweDY5LCAweGM5LCAweGUxLAotCTB4MDUsIDB4MTMsIDB4NDUsIDB4NmYsIDB4MGUsIDB4N2IsIDB4YmQsIDB4ZjUsIDB4OTMsIDB4ZTMsIDB4YzEsIDB4N2YsCi0JMHg1OCwgMHg5OSwgMHhlYSwgMHgxZCwgMHgzNiwgMHg4ZSwgMHgzYiwgMHgyMiwgMHhhNiwgMHgxZCwgMHg3MywgMHg4MSwKLQkweDJjLCAweDlmLCAweGViLCAweGJhLCAweGU0LCAweDc5LCAweDc3LCAweGIzLCAweDMyLCAweDNiLCAweDEyLCAweDk4LAotCTB4NTgsIDB4YWMsIDB4MzgsIDB4MTAsIDB4MGUsIDB4OTQsIDB4YzUsIDB4Y2EsIDB4MjMsIDB4NjEsIDB4MmMsIDB4NGIsCi0JMHg3NywgMHhmOSwgMHg3YywgMHhmNiwgMHgzMywgMHhmNCwgMHgwOCwgMHhjZSwgMHgyZCwgMHgzMiwgMHg5OSwgMHhmYiwKLQkweGMzLCAweGI5LCAweDhjLCAweGJhLCAweDZmLCAweGE0LCAweDVlLCAweGI3LCAweDk4LCAweDFmLCAweDU5LCAweDE5LAotCTB4ZGIsIDB4ZWYsIDB4ZGQsIDB4ODgsIDB4MzEsIDB4MDcsIDB4NWIsIDB4NGIsIDB4ZmQsIDB4M2EsIDB4YTgsIDB4YzcsCi0JMHg5ZiwgMHhlNywgMHhmNCwgMHgyYiwgMHgzYSwgMHgyZCwgMHgxOSwgMHhmYiwgMHg5ZCwgMHg3NSwgMHg5MiwgMHhmYSwKLQkweDc1LCAweGIzLCAweDNkLCAweDM3LCAweGRiLCAweDJiLCAweDFhLCAweGJiLCAweDU0LCAweGNmLCAweDg1LCAweDk0LAotCTB4NjcsIDB4OTksIDB4MmQsIDB4YzMsIDB4NDIsIDB4NzksIDB4ODYsIDB4ZTksIDB4OGYsIDB4MmEsIDB4MzIsIDB4MWUsCi0JMHhjMSwgMHhmNywgMHgzZiwgMHgzNywgMHhhNiwgMHgxZiwgMHg0ZiwgMHhjOSwgMHg1NSwgMHg0NCwgMHhmZiwgMHg3ZSwKLQkweGVhLCAweDVmLCAweDMwLCAweDVjLCAweGU2LCAweGEwLCAweDRlLCAweGQ2LCAweGJiLCAweDdhLCAweDgwLCAweDk3LAotCTB4OTgsIDB4Y2MsIDB4MmEsIDB4YTgsIDB4MzIsIDB4MjIsIDB4NzgsIDB4YWEsIDB4ZDksIDB4ODMsIDB4YjcsIDB4MTIsCi0JMHhhNSwgMHhmNiwgMHhiOCwgMHhhZiwgMHg5YSwgMHg2YiwgMHg1OSwgMHg0ZiwgMHg4NiwgMHhmYywgMHhmOCwgMHg4NSwKLQkweDUxLCAweDFiLCAweDVlLCAweGEwLCAweGVhLCAweGNjLCAweDFmLCAweGJkLCAweDQ4LCAweDEwLCAweDY3LCAweGJiLAotCTB4OTIsIDB4YjMsIDB4MzgsIDB4NWYsIDB4NWUsIDB4NmMsIDB4NGQsIDB4YTIsIDB4OWQsIDB4ZjYsIDB4ZTQsIDB4NzcsCi0JMHg0NCwgMHg4MCwgMHgzMywgMHgwOSwgMHgyMywgMHhiOCwgMHg4NSwgMHhmZCwgMHgwZiwgMHg3YiwgMHhlYiwgMHhjOSwKLQkweGQzLCAweGQ1LCAweDQ2LCAweGQyLCAweGJkLCAweDc4LCAweDUxLCAweGM0LCAweDg4LCAweDZmLCAweGMzLCAweGNmLAotCTB4YWMsIDB4MjEsIDB4ZTIsIDB4N2MsIDB4NDEsIDB4NDgsIDB4ZDYsIDB4MWMsIDB4NjcsIDB4ZTMsIDB4MTksIDB4Y2QsCi0JMHg4MSwgMHgxNywgMHg4MywgMHhjYywgMHg4NywgMHgyYiwgMHgxYywgMHgyOCwgMHgzMSwgMHhkZSwgMHhiNiwgMHg3ZSwKLQkweGUwLCAweDk1LCAweDdlLCAweDY0LCAweDJjLCAweDMzLCAweDM4LCAweDBlLCAweGM1LCAweGM2LCAweGMyLCAweGFkLAotCTB4YzksIDB4N2EsIDB4ZWEsIDB4ZmIsIDB4ZjIsIDB4ZmUsIDB4ZmYsIDB4OGYsIDB4MzUsIDB4ZTksIDB4OTUsIDB4ZmUsCi0JMHg3NSwgMHhjZCwgMHhhZiwgMHg3MiwgMHgwYywgMHg3ZiwgMHgxNCwgMHhiYiwgMHhiZiwgMHg2ZiwgMHhiZCwgMHg2NCwKLQkweGI3LCAweDc5LCAweGJiLCAweDNiLCAweDFiLCAweDRmLCAweGE1LCAweGJkLCAweGI3LCAweDM4LCAweDNlLCAweDY5LAotCTB4MzMsIDB4ZGYsIDB4OGYsIDB4ZTgsIDB4ZWQsIDB4OGMsIDB4NWIsIDB4ZmMsIDB4NzksIDB4NmIsIDB4NTIsIDB4ZjQsCi0JMHgyNywgMHg3OCwgMHg3NSwgMHhkMiwgMHhjMiwgMHgzNCwgMHgzOSwgMHg3ZiwgMHhkNiwgMHgyZSwgMHgxYiwgMHhhNywKLQkweGJlLCAweGJhLCAweDY4LCAweDQzLCAweDhjLCAweGUxLCAweDNlLCAweGQ4LCAweGJiLCAweDNiLCAweDM0LCAweDNiLAotCTB4OWYsIDB4ZGIsIDB4Y2MsIDB4MWMsIDB4NjAsIDB4YzgsIDB4NWIsIDB4OGUsIDB4YWQsIDB4MjYsIDB4ZWQsIDB4Y2UsCi0JMHg1MCwgMHhlNywgMHgzOCwgMHg2MSwgMHhlMSwgMHhhNCwgMHgyOSwgMHhlNywgMHgyZSwgMHg0YywgMHg3YSwgMHgxZCwKLQkweGQ4LCAweDY2LCAweDNhLCAweGIxLCAweGNlLCAweDUwLCAweDc1LCAweGI5LCAweGVlLCAweDA4LCAweGM5LCAweGI5LAotCTB4MGIsIDB4ZmUsIDB4NmEsIDB4MDUsIDB4M2IsIDB4MTgsIDB4M2UsIDB4ZDYsIDB4MWIsIDB4NWQsIDB4N2UsIDB4YjksCi0JMHhiZSwgMHgyNCwgMHgyNCwgMHhlNywgMHgwYSwgMHhkYSwgMHhhOCwgMHg5MywgMHhiOCwgMHhhNiwgMHg2MCwgMHg4MywKLQkweDIxLCAweGNmLCAweDRkLCAweGIzLCAweGZjLCAweDM5LCAweDA2LCAweGNiLCAweGRhLCAweDYxLCAweDM2LCAweDVjLAotCTB4NTcsIDB4YzIsIDB4NzIsIDB4NjcsIDB4NGQsIDB4ZTEsIDB4ODMsIDB4ODcsIDB4ZWYsIDB4OTgsIDB4MWYsIDB4ODgsCi0JMHg0NywgMHgwYiwgMHhhMCwgMHhjNywgMHg4YSwgMHhlOCwgMHhhNywgMHg1YiwgMHg3YiwgMHg2NywgMHhiMywgMHg5ZSwKLQkweDQyLCAweDZlLCAweGUwLCAweGY0LCAweDZkLCAweDg3LCAweGM0LCAweGNmLCAweDgwLCAweGZmLCAweGE3LCAweDRjLAotCTB4YjIsIDB4ODYsIDB4YmMsIDB4ZjMsIDB4YTgsIDB4NTksIDB4YzMsIDB4N2YsIDB4OWEsIDB4ZjMsIDB4NTYsIDB4NmUsCi0JMHgzOCwgMHhkYiwgMHg1ZiwgMHg4NSwgMHhiZSwgMHhhZSwgMHg0OCwgMHg5OSwgMHgxNywgMHgyYywgMHg2MywgMHhhZSwKLQkweDEwLCAweDI3LCAweGJlLCAweDhmLCAweDhjLCAweDM5LCAweGIxLCAweDI1LCAweDY5LCAweDY4LCAweDA3LCAweDZkLAotCTB4ZmUsIDB4ZTcsIDB4YTQsIDB4MmUsIDB4OWMsIDB4Y2MsIDB4Y2YsIDB4MDMsIDB4ZGEsIDB4ODQsIDB4OTIsIDB4M2YsCi0JMHg5ZiwgMHgyZCwgMHhkOCwgMHg0MCwgMHgzZSwgMHgyZiwgMHhmOCwgMHgxNiwgMHhiNywgMHg5ZSwgMHhhZCwgMHgxNywKLQkweGFhLCAweGUxLCAweGY2LCAweGM3LCAweDUyLCAweDFlLCAweDFlLCAweDFhLCAweDBmLCAweGFmLCAweDdmLCAweDRkLAotCTB4Y2EsIDB4ZTcsIDB4NmYsIDB4NGIsIDB4YzEsIDB4ZGYsIDB4OWEsIDB4Y2EsIDB4ZGIsIDB4NjUsIDB4ZGUsIDB4YjcsCi0JMHgwNSwgMHhkYiwgMHgyYywgMHg3MiwgMHhkNiwgMHg2YywgMHg2ZSwgMHhkNiwgMHgyNSwgMHhiOSwgMHgwZiwgMHhlNCwKLQkweGI5LCAweGRmLCAweGUxLCAweDNiLCAweDllLCAweGEzLCAweGFkLCAweGJiLCAweDk4LCAweDBmLCAweDZjLCAweDMzLAotCTB4ZTIsIDB4NTEsIDB4NzksIDB4MGUsIDB4NjksIDB4ODQsIDB4NzQsIDB4NWYsIDB4ODEsIDB4ZTIsIDB4YzcsIDB4ZDYsCi0JMHhiYSwgMHhkZiwgMHg3MiwgMHgzZSwgMHhjOSwgMHg5MywgMHg1MywgMHg5ZiwgMHgyOSwgMHhjYSwgMHhjZSwgMHg4NywKLQkweGY4LCAweDk5LCAweDYwLCAweDgwLCAweDlmLCAweGY5LCAweDkyLCAweGNmLCAweGRmLCAweGM1LCAweDdlLCAweDM2LAotCTB4YTcsIDB4YTYsIDB4ZmEsIDB4ODAsIDB4ODIsIDB4OWIsIDB4ZDgsIDB4NTYsIDB4NDMsIDB4MDgsIDB4Y2UsIDB4YTUsCi0JMHg3NSwgMHhiZiwgMHhiMSwgMHgzMiwgMHhkZSwgMHhlYywgMHgzMywgMHhjOCwgMHgyYywgMHhlNiwgMHg4MSwgMHgzNiwKLQkweDY3LCAweGY3LCAweGU5LCAweGRjLCAweDVmLCAweDI3LCAweGZiLCAweDhlLCAweDE0LCAweDBjLCAweGQzLCAweGE3LAotCTB4MzYsIDB4YTUsIDB4YzUsIDB4OWUsIDB4YjIsIDB4N2EsIDB4OGQsIDB4ZmYsIDB4MDEsIDB4ZmUsIDB4OTgsIDB4YjgsCi0JMHgzNywgMHg4OSwgMHg1OCwgMHg0MSwgMHg0NCwgMHhmMCwgMHhjNywgMHhlZCwgMHg3ZiwgMHgyOSwgMHg1NSwgMHg0NywKLQkweDBlLCAweDJmLCAweGNmLCAweGYyLCAweGRkLCAweDljLCAweDY3LCAweDhmLCAweGZmLCAweGM1LCAweGQ0LCAweGY1LAotCTB4YjgsIDB4NjcsIDB4NGYsIDB4MTgsIDB4ZWIsIDB4ZjYsIDB4YTAsIDB4YWUsIDB4ODgsIDB4NzIsIDB4MTcsIDB4ODYsCi0JMHgwMiwgMHhmZSwgMHg1MSwgMHg2OCwgMHhmZSwgMHg2NywgMHhhOCwgMHg4NywgMHgxMywgMHg5NCwgMHhlZCwgMHhlNCwKLQkweDI1LCAweGIyLCAweDg5LCAweGRlLCAweGUwLCAweGJmLCAweDJmLCAweGUxLCAweDQ2LCAweDJhLCAweGY0LCAweGExLAotCTB4MTUsIDB4YjcsIDB4NzksIDB4ODYsIDB4ZDcsIDB4YmYsIDB4MzEsIDB4ZTEsIDB4NDcsIDB4YzYsIDB4ZTYsIDB4YWMsCi0JMHhhZSwgMHgyMiwgMHhjOSwgMHgxZiwgMHhiYiwgMHg5MywgMHhmMSwgMHgyOCwgMHhkMywgMHhlMSwgMHhkYywgMHg5YywKLQkweGVhLCAweDYxLCAweDk5LCAweGNmLCAweDMzLCAweDA5LCAweGI5LCAweDE3LCAweGZkLCAweDlhLCAweDBhLCAweGRkLAotCTB4YWYsIDB4MzIsIDB4N2UsIDB4ZjYsIDB4OWIsIDB4NjIsIDB4YjMsIDB4MzUsIDB4YTIsIDB4OTMsIDB4MjAsIDB4MmIsCi0JMHhjNiwgMHgzZCwgMHg5MSwgMHg0MCwgMHg0YiwgMHgxZCwgMHhhZiwgMHg2YiwgMHgwYiwgMHgxMCwgMHhhYiwgMHg4OCwKLQkweDA4LCAweDI3LCAweGY0LCAweGZhLCAweDZiLCAweGM3LCAweDdkLCAweDdlLCAweDczLCAweDFjLCAweGZlLCAweDJiLAotCTB4YzcsIDB4YTcsIDB4OGEsIDB4NDAsIDB4NmUsIDB4ZmYsIDB4ODksIDB4YjksIDB4OWYsIDB4ZDcsIDB4YmYsIDB4MzYsCi0JMHgzMSwgMHgxYiwgMHg2YSwgMHgyNCwgMHg2ZSwgMHgyZCwgMHhhOSwgMHgzZiwgMHg2NywgMHhjZCwgMHg4ZSwgMHgxOCwKLQkweDk5LCAweDkzLCAweDk0LCAweGUxLCAweGMzLCAweDZiLCAweGY1LCAweGY4LCAweDBjLCAweGM3LCAweDg5LCAweDg3LAotCTB4YjQsIDB4MjksIDB4N2QsIDB4YmMsIDB4MWYsIDB4ZmEsIDB4ZmYsIDB4ZGIsIDB4NDcsIDB4M2UsIDB4YjYsIDB4ODksCi0JMHhmYywgMHgxMiwgMHhkZiwgMHg3MiwgMHg3MywgMHhhYSwgMHhlNiwgMHhjNywgMHhhMiwgMHg3MCwgMHg0ZSwgMHgzOSwKLQkweDFmLCAweGM5LCAweDdjLCAweGFjLCAweGIyLCAweGFjLCAweDU2LCAweGMzLCAweDk3LCAweDdiLCAweGZlLCAweDA3LAotCTB4ZGEsIDB4Y2IsIDB4ODksIDB4ZWIsIDB4OWMsIDB4NTgsIDB4NGMsIDB4N2IsIDB4NmYsIDB4ZjgsIDB4NmIsIDB4MjcsCi0JMHhhMiwgMHhiZSwgMHg0MiwgMHhjNiwgMHg1MCwgMHhkOSwgMHg1MywgMHhmMCwgMHg0YywgMHhkZCwgMHhhNCwgMHgzNSwKLQkweDYxLCAweGQ0LCAweGExLCAweDIxLCAweDJkLCAweGNmLCAweDYzLCAweDFkLCAweGI0LCAweDYzLCAweDBiLCAweDhmLAotCTB4OWIsIDB4NzIsIDB4NWYsIDB4ZjAsIDB4MjQsIDB4MWUsIDB4NzMsIDB4ZDAsIDB4MjYsIDB4ZGMsIDB4ODYsIDB4ZGUsCi0JMHhmMiwgMHgwZiwgMHg0YSwgMHgxOSwgMHg4YSwgMHgyMywgMHhjZSwgMHhlMCwgMHgwNCwgMHhmNCwgMHhmMCwgMHg3YSwKLQkweDcyLCAweDYzLCAweDdmLCAweGM1LCAweDNjLCAweDUzLCAweGQ0LCAweGZlLCAweDRlLCAweDIyLCAweDYwLCAweDA2LAotCTB4NzIsIDB4ZjEsIDB4ZTcsIDB4MmMsIDB4ZTcsIDB4ZWIsIDB4ZGQsIDB4ODQsIDB4YjEsIDB4ZWUsIDB4YjksIDB4ZGMsCi0JMHhmOSwgMHhiZiwgMHhhNSwgMHhhNiwgMHhlNiwgMHhiZiwgMHg2MiwgMHg3NywgMHg2ZSwgMHhmNywgMHhlNiwgMHgwNCwKLQkweGRlLCAweDc3LCAweGQ0LCAweGUzLCAweGZkLCAweGZkLCAweDY2LCAweDAxLCAweGYzLCAweDM2LCAweGIxLCAweDQ3LAotCTB4YjcsIDB4N2IsIDB4NmIsIDB4MDIsIDB4OTMsIDB4NGUsIDB4NWUsIDB4M2IsIDB4NmIsIDB4Y2UsIDB4MjIsIDB4NzYsCi0JMHhhOSwgMHhiYywgMHgxNiwgMHg5NiwgMHg1OCwgMHgxMCwgMHhkMywgMHgxOCwgMHg0NywgMHg4YiwgMHgyMywgMHg1ZSwKLQkweDc3LCAweGYxLCAweDM4LCAweGI0LCAweDIyLCAweGEzLCAweDhjLCAweDc5LCAweDMxLCAweDFhLCAweDFkLCAweDdkLAotCTB4YmEsIDB4YmYsIDB4YzksIDB4NTEsIDB4YzcsIDB4ZmMsIDB4ZDgsIDB4YWYsIDB4YjgsIDB4OGMsIDB4NmYsIDB4MzEsCi0JMHhjZiwgMHg5NywgMHhmNSwgMHhhYSwgMHgzMCwgMHhjNywgMHhlZCwgMHg2NCwgMHg4NSwgMHg5ZCwgMHhkMywgMHhkNCwKLQkweDg4LCAweDQyLCAweGNjLCAweDJiLCAweGMzLCAweGJkLCAweGRhLCAweDg2LCAweGM1LCAweDZhLCAweGE0LCAweDFmLAotCTB4YjcsIDB4ZDYsIDB4YmIsIDB4MWIsIDB4Y2IsIDB4YzcsIDB4ZjMsIDB4M2EsIDB4NDEsIDB4Y2MsIDB4MTMsIDB4NjEsCi0JMHgwZSwgMHg2MywgMHg0MCwgMHgyZCwgMHg4ZCwgMHg4OCwgMHg2ZSwgMHhmYywgMHg4ZCwgMHg3ZCwgMHg2MywgMHgyMiwKLQkweGFiLCAweGU2LCAweGVlLCAweDFkLCAweGYzLCAweDE0LCAweGEzLCAweDM4LCAweDRjLCAweDRjLCAweGZhLCAweDU3LAotCTB4ZGYsIDB4N2YsIDB4YWUsIDB4ZGUsIDB4NjQsIDB4OTEsIDB4ZTAsIDB4YmEsIDB4Y2IsIDB4OTAsIDB4ZmYsIDB4YjYsCi0JMHgzZCwgMHhiOSwgMHhkZCwgMHg5MSwgMHg2MywgMHgzMSwgMHg3NywgMHhjMCwgMHhiMiwgMHgxOCwgMHgwZiwgMHg3ZCwKLQkweDUwLCAweDY2LCAweDcxLCAweDNjLCAweGY0LCAweDI5LCAweGNlLCAweDRkLCAweDViLCAweGVhLCAweDIzLCAweGViLAotCTB4MzMsIDB4NGUsIDB4M2IsIDB4ZDYsIDB4YmIsIDB4MGIsIDB4MjMsIDB4ZTEsIDB4YmIsIDB4ZGUsIDB4MzYsIDB4N2UsCi0JMHg2ZiwgMHhiZCwgMHg5NSwgMHg2MCwgMHg1ZSwgMHg0ZCwgMHhkZiwgMHgyZCwgMHgyMCwgMHg2ZSwgMHg2ZiwgMHgzNywKLQkweDlkLCAweDRkLCAweDRiLCAweDE1LCAweDA1LCAweGRkLCAweGM2LCAweDNjLCAweGFkLCAweDg4LCAweGYxLCAweDY4LAotCTB4MTMsIDB4ZmQsIDB4MzcsIDB4ZTYsIDB4MzUsIDB4ODIsIDB4ZmIsIDB4YzEsIDB4NzIsIDB4YTksIDB4YjUsIDB4NmIsCi0JMHg1ZCwgMHg5MSwgMHg4ZCwgMHg3NywgMHg4ZCwgMHhkNCwgMHg4YiwgMHhjZiwgMHg5ZiwgMHhiZiwgMHhlYiwgMHgzOSwKLQkweGEzLCAweDE5LCAweGRkLCAweGU5LCAweDQxLCAweGY0LCAweGE0LCAweGIzLCAweGZkLCAweDY0LCAweDMwLCAweGZiLAotCTB4MTMsIDB4ZmEsIDB4NTksIDB4YmIsIDB4YjYsIDB4MzAsIDB4MjIsIDB4MWMsIDB4ZWIsIDB4ZTgsIDB4NWQsIDB4MDcsCi0JMHg4YywgMHgyOCwgMHhiNiwgMHhhNCwgMHgzNywgMHhkZSwgMHg3NSwgMHhiNiwgMHhiZSwgMHg5ZiwgMHhmZiwgMHhiMywKLQkweDc1LCAweDg2LCAweDUwLCAweGZlLCAweDg5LCAweDc1LCAweDRhLCAweDIyLCAweGQyLCAweDQ3LCAweDk4LCAweDdkLAotCTB4NmMsIDB4YmMsIDB4NmIsIDB4ZGQsIDB4YTIsIDB4YWYsIDB4NjMsIDB4NzMsIDB4N2EsIDB4ZGQsIDB4OWYsIDB4ZWQsCi0JMHhhNywgMHg5NCwgMHg3NSwgMHg4YSwgMHgyMywgMHgxZCwgMHhhZCwgMHgzNywgMHgwNSwgMHgzNiwgMHhkZSwgMHg5NSwKLQkweDVhLCAweGQ0LCAweGMzLCAweDNlLCAweDU2LCAweDMxLCAweDhlLCAweDY0LCAweGViLCAweDQ0LCAweDE1LCAweGM3LAotCTB4MjcsIDB4ZWEsIDB4YTAsIDB4MjgsIDB4ZDIsIDB4ZDMsIDB4M2EsIDB4M2YsIDB4ZjAsIDB4N2IsIDB4NmIsIDB4NWUsCi0JMHg2ZiwgMHg4MSwgMHhhZCwgMHgwMywgMHgxNywgMHg3NSwgMHhmMCwgMHhhOCwgMHhlOSwgMHhjYywgMHgwNCwgMHgxYywKLQkweGI2LCAweDBlLCAweDNhLCAweDdjLCAweGQ0LCAweDQxLCAweDFmLCAweDc1LCAweDkwLCAweGE5LCAweDM2LCAweGMyLAotCTB4ZWYsIDB4NTEsIDB4MDcsIDB4ZjMsIDB4YzYsIDB4ZDYsIDB4YWUsIDB4MmQsIDB4OGEsIDB4YzAsIDB4ZTksIDB4MzAsCi0JMHg1ZSwgMHg3NywgMHgzOCwgMHgzOSwgMHgxNywgMHgyZSwgMHg2MywgMHgyZCwgMHhmNSwgMHhiNiwgMHhmMSwgMHhhZSwKLQkweDM5LCAweDhiLCAweDZjLCAweDlkLCAweDdmLCAweGQ5LCAweDFkLCAweGQ4LCAweDYwLCAweGVmLCAweGRkLCAweGRiLAotCTB4OTQsIDB4NmUsIDB4ZTMsIDB4ZDEsIDB4YzQsIDB4ZTMsIDB4NjEsIDB4MWUsIDB4ZGQsIDB4Y2MsIDB4NGQsIDB4ZWUsCi0JMHhhMCwgMHhhZSwgMHgxYSwgMHgzOSwgMHg4ZSwgMHgxNSwgMHg5NCwgMHhhYiwgMHg5ZCwgMHhiZiwgMHg1YiwgMHhmOCwKLQkweGJiLCAweDgzLCAweGJmLCAweDY1LCAweDdlLCAweGQ0LCAweDBiLCAweGIyLCAweGM1LCAweDJlLCAweGM4LCAweGU2LAotCTB4YTAsIDB4M2MsIDB4MWUsIDB4NjIsIDB4OTQsIDB4OGMsIDB4NjksIDB4ZTIsIDB4Y2IsIDB4MzcsIDB4MDUsIDB4NjIsCi0JMHg2YywgMHhlMywgMHhhOSwgMHg2MiwgMHhkOSwgMHhmNywgMHhlNCwgMHgzMiwgMHhlMiwgMHgzZSwgMHgyNywgMHg0NCwKLQkweDNlLCAweGJkLCAweDY1LCAweDFkLCAweDMyLCAweGM0LCAweGQ4LCAweGRmLCAweDY1LCAweDMxLCAweDk2LCAweGIyLAotCTB4OTUsIDB4NzEsIDB4N2UsIDB4NWUsIDB4NTksIDB4MzQsIDB4MzQsIDB4ZGQsIDB4NjMsIDB4YzAsIDB4ZTcsIDB4MzYsCi0JMHhlMiwgMHhlOCwgMHg0ZCwgMHgyNywgMHhhOCwgMHgwMywgMHhiMSwgMHg5MywgMHgwNywgMHhhOSwgMHhiZiwgMHg0ZSwKLQkweDc0LCAweDE5LCAweDI3LCAweGY0LCAweGVjLCAweGRlLCAweDg5LCAweGJkLCAweDk0LCAweDIxLCAweDQ4LCAweDdlLAotCTB4ZTgsIDB4ODEsIDB4MzMsIDB4YTIsIDB4ZmIsIDB4MWIsIDB4MWQsIDB4NWQsIDB4NDEsIDB4MTcsIDB4NjgsIDB4Y2IsCi0JMHhjNSwgMHg2MiwgMHhjYiwgMHg3MSwgMHhjNiwgMHgzNSwgMHhjMSwgMHgzYSwgMHhiNywgMHhkNiwgMHg2NiwgMHhlMywKLQkweDVmLCAweDdjLCAweGJlLCAweDBiLCAweDFlLCAweDZkLCAweDRkLCAweDJhLCAweDFmLCAweDBiLCAweDNjLCAweDVhLAotCTB4NmIsIDB4NDIsIDB4ZmMsIDB4NGEsIDB4ZDYsIDB4ZmMsIDB4YzMsIDB4NzYsIDB4MmMsIDB4M2YsIDB4OWUsIDB4N2UsCi0JMHhiMSwgMHgxOCwgMHg2NSwgMHhiNiwgMHg4ZiwgMHg5NSwgMHgzOSwgMHg4ZCwgMHg2YywgMHhiYiwgMHgxYSwgMHhkYiwKLQkweDZkLCAweDc2LCAweDY4LCAweGI4LCAweGU4LCAweDIzLCAweGJhLCAweGQ2LCAweGVjLCAweDkwLCAweDdkLCAweGFlLAotCTB4ZjQsIDB4ZmUsIDB4NTQsIDB4YWUsIDB4NWUsIDB4MTYsIDB4MjcsIDB4MTYsIDB4YmIsIDB4NmMsIDB4OWMsIDB4NjAsCi0JMHgxYiwgMHhjNSwgMHhjMCwgMHg5MiwgMHhjNCwgMHhlNSwgMHhmZCwgMHg0YiwgMHg3ZiwgMHhkMiwgMHg2ZiwgMHg1NywKLQkweDg1LCAweDhhLCAweDA5LCAweGZiLCAweDk5LCAweGNiLCAweDkxLCAweDc0LCAweDBjLCAweDgzLCAweGM5LCAweGE5LAotCTB4N2IsIDB4ZjksIDB4ZjQsIDB4YTMsIDB4NmMsIDB4ZmYsIDB4NzAsIDB4OWMsIDB4ZmEsIDB4OTgsIDB4NjUsIDB4YzgsCi0JMHgzZSwgMHgzZiwgMHhkOSwgMHhkYiwgMHgzNywgMHg3NSwgMHg1ZiwgMHg5ZiwgMHhjOCwgMHg1NiwgMHg1OCwgMHg0MiwKLQkweDAwLCAweGMxLCAweDAxLCAweGUyLCAweDRjLCAweGI0LCAweDU5LCAweGVhLCAweDViLCAweGQ2LCAweDFiLCAweGYzLAotCTB4ODIsIDB4YzgsIDB4NTQsIDB4MzksIDB4MzEsIDB4MzgsIDB4MTcsIDB4MTgsIDB4ZTgsIDB4OTMsIDB4N2QsIDB4NTcsCi0JMHg0NywgMHg2MywgMHhhYiwgMHg5OSwgMHg5NywgMHg0NSwgMHgyYiwgMHg2YiwgMHhiNSwgMHg0ZCwgMHhhYSwgMHhlYywKLQkweDk5LCAweDNhLCAweGY2LCAweGU1LCAweDZlLCAweGEzLCAweDQ2LCAweGViLCAweDU2LCAweDMzLCAweDg3LCAweDg4LAotCTB4ZGQsIDB4N2IsIDB4ODEsIDB4NjksIDB4MjUsIDB4ZTIsIDB4NmIsIDB4MTUsIDB4NDYsIDB4YjQsIDB4YTcsIDB4MDIsCi0JMHg3MywgMHhlMSwgMHhhZiwgMHhiNCwgMHhmMSwgMHgzMiwgMHhmZSwgMHg5NCwgMHg2YSwgMHgwNCwgMHg1NywgMHhkYSwKLQkweDM4LCAweGY4LCAweGExLCAweDM1LCAweGM0LCAweGI4LCAweGY0LCAweDk1LCAweGI5LCAweDNmLCAweDI4LCAweGNlLAotCTB4ZTYsIDB4ZDksIDB4ZDEsIDB4NzUsIDB4ZDMsIDB4MzgsIDB4NTcsIDB4YmYsIDB4NTgsIDB4YTAsIDB4ZmIsIDB4NTMsCi0JMHg4YSwgMHhlOCwgMHg0OCwgMHhiOCwgMHg0OSwgMHgwMiwgMHhkYiwgMHhjOCwgMHg3NSwgMHg3ZiwgMHgzMywgMHgzNywKLQkweDgyLCAweDgzLCAweGZjLCAweGZmLCAweGYzLCAweGViLCAweDY1LCAweDBmLCAweGFhLCAweDY1LCAweDA1LCAweDAzLAotCTB4ZjMsIDB4YzIsIDB4MTUsIDB4MWMsIDB4YzMsIDB4OGIsIDB4YmMsIDB4ZGYsIDB4OTMsIDB4N2UsIDB4ZGIsIDB4M2EsCi0JMHgzYiwgMHhjZCwgMHhlOCwgMHg1ZiwgMHhjNiwgMHg0MCwgMHgzMiwgMHgzMCwgMHhhZSwgMHg2YiwgMHg5MywgMHhlYSwKLQkweDdmLCAweDc2LCAweDRmLCAweDFkLCAweGRjLCAweDY1LCAweDFjLCAweGNiLCAweGY3LCAweDAyLCAweGI1LCAweDVhLAotCTB4OWYsIDB4YWEsIDB4OTYsIDB4ODgsIDB4NWUsIDB4MDcsIDB4YzYsIDB4N2YsIDB4M2MsIDB4NjUsIDB4YWYsIDB4NDcsCi0JMHg5ZSwgMHgxZiwgMHhkYSwgMHg2YiwgMHgxZCwgMHgzZCwgMHg0MywgMHhmNCwgMHhhOSwgMHgyMSwgMHgyZCwgMHgxYSwKLQkweGE3LCAweGRlLCAweGRkLCAweDU1LCAweDFjLCAweGYzLCAweDU3LCAweGU2LCAweGRlLCAweDZhLCAweDhmLCAweGIzLAotCTB4ZDIsIDB4OTgsIDB4YzEsIDB4MzEsIDB4MmEsIDB4ZDAsIDB4ZTYsIDB4ZmUsIDB4MmMsIDB4YjcsIDB4ZWUsIDB4ZDksCi0JMHg0MCwgMHgzNiwgMHgzMywgMHg2NCwgMHgzNSwgMHhkMiwgMHgwNiwgMHgwYiwgMHg1OCwgMHhlNywgMHg0NiwgMHg3MywKLQkweGRmLCAweGY0LCAweGFlLCAweDNhLCAweGRkLCAweGY3LCAweDE1LCAweGM2LCAweGNlLCAweGQwLCAweGRjLCAweDVmLAotCTB4NWIsIDB4NTEsIDB4Y2QsIDB4NjksIDB4N2UsIDB4OTMsIDB4YTMsIDB4YmUsIDB4MjcsIDB4MjEsIDB4NjUsIDB4NjUsCi0JMHg1ZSwgMHg4ZCwgMHhlOCwgMHg1YywgMHhlNSwgMHg1ZCwgMHgwYiwgMHhkNSwgMHg4MSwgMHhmMCwgMHg1YywgMHg3YiwKLQkweGZjLCAweGMwLCAweGRkLCAweGE5LCAweDA0LCAweGI2LCAweDI3LCAweGE1LCAweDRkLCAweDA1LCAweGNiLCAweDAyLAotCTB4ZWYsIDB4NTgsIDB4ZmUsIDB4NjksIDB4MDksIDB4NmMsIDB4NGQsIDB4ZmYsIDB4MjksIDB4YWUsIDB4MzcsIDB4MjgsCi0JMHg3MSwgMHhiZiwgMHgyNSwgMHgwZSwgMHgzZCwgMHg5YSwgMHg3ZCwgMHhjNiwgMHgzNSwgMHg1YiwgMHhkNiwgMHg5NCwKLQkweDY1LCAweDBmLCAweGQyLCAweDVkLCAweDg5LCAweDAwLCAweGRjLCAweGE1LCAweGM0LCAweGJhLCAweGIxLCAweDgwLAotCTB4M2MsIDB4MTMsIDB4ZjUsIDB4MjIsIDB4ZDMsIDB4MmMsIDB4NjUsIDB4NmEsIDB4YjQsIDB4MzEsIDB4NjQsIDB4YzgsCi0JMHhjNCwgMHg2NCwgMHg3ZCwgMHhiMiwgMHhhNywgMHgyNCwgMHhiYiwgMHg5ZiwgMHg4MiwgMHg4NiwgMHg1NywgMHhhZCwKLQkweDZiLCAweDY3LCAweGM4LCAweDlkLCAweDlhLCAweDBjLCAweDY5LCAweDQzLCAweGMxLCAweGZjLCAweDQwLCAweDE1LAotCTB4NmEsIDB4NTcsIDB4YmUsIDB4ZmUsIDB4NjYsIDB4NDEsIDB4YTAsIDB4ODAsIDB4YjgsIDB4MmQsIDB4ZmUsIDB4NjQsCi0JMHhiNCwgMHg5ZiwgMHhjNCwgMHhiZiwgMHhkMywgMHhkNywgMHg2NSwgMHg2ZiwgMHhkOSwgMHgxNiwgMHhhOSwgMHhjNywKLQkweGI2LCAweGU2LCAweDIyLCAweGE1LCAweDM5LCAweGM5LCAweDMzLCAweDY0LCAweDlmLCAweGIyLCAweDY1LCAweGRkLAotCTB4MTQsIDB4NzgsIDB4Y2IsIDB4OGEsIDB4NTYsIDB4NTMsIDB4MWUsIDB4ZjIsIDB4OWYsIDB4NmMsIDB4NWQsIDB4MjksCi0JMHg5MywgMHhkYiwgMHgzMywgMHhhNCwgMHgzNCwgMHhkYywgMHgyNSwgMHgzYSwgMHg3OSwgMHhkNiwgMHg4YywgMHg5MywKLQkweDVkLCAweDBiLCAweGJlLCAweDFlLCAweDhiLCAweGJkLCAweDZkLCAweDI4LCAweGY2LCAweGIzLCAweGNhLCAweDY1LAotCTB4NGEsIDB4MzksIDB4ZTMsIDB4OTUsIDB4ZDMsIDB4M2YsIDB4NjIsIDB4ZTcsIDB4ZGYsIDB4NjEsIDB4NjIsIDB4YTEsCi0JMHhmMCwgMHgzNSwgMHhjOSwgMHhhMSwgMHg5YywgMHg3OCwgMHhjZSwgMHhhOCwgMHhjMCwgMHhiMywgMHg1YSwgMHg5NiwKLQkweGZiLCAweDEwLCAweDUzLCAweGYwLCAweDZhLCAweDYyLCAweDVlLCAweDg2LCAweDFlLCAweDQyLCAweDBlLCAweDY5LAotCTB4YWMsIDB4M2IsIDB4YWYsIDB4ZmMsIDB4M2IsIDB4ZjMsIDB4MmIsIDB4ZTAsIDB4OTUsIDB4NTQsIDB4M2IsIDB4MWUsCi0JMHg5NSwgMHg3NSwgMHgzZCwgMHhhNSwgMHhhNiwgMHhhOSwgMHhkNiwgMHgyMSwgMHhmZCwgMHhiNSwgMHg2MywgMHg1YiwKLQkweDVhLCAweGRhLCAweDNhLCAweDE2LCAweDNiLCAweDYwLCAweGY0LCAweGU3LCAweDY0LCAweDE1LCAweGNjLCAweDNjLAotCTB4MTYsIDB4N2IsIDB4Y2UsIDB4NzgsIDB4ZGMsIDB4OWUsIDB4M2IsIDB4NzksIDB4N2UsIDB4ZDYsIDB4NjMsIDB4MGEsCi0JMHhiNiwgMHgxNCwgMHg0MywgMHgyNSwgMHgwZiwgMHg3NywgMHgxOCwgMHg3NywgMHhjMCwgMHg1MSwgMHhmMSwgMHg3NSwKLQkweGRhLCAweDllLCAweGVjLCAweGJmLCAweGI5LCAweDEzLCAweGNlLCAweDBhLCAweDE3LCAweDdkLCAweGYzLCAweDZlLAotCTB4YjgsIDB4MmEsIDB4ODQsIDB4ZmIsIDB4ZTYsIDB4NzksIDB4NjksIDB4OTQsIDB4ZjcsIDB4NDUsIDB4YjcsIDB4ZTcsCi0JMHg2ZCwgMHhkZCwgMHgzYSwgMHg4OSwgMHhhNywgMHhkZCwgMHg5MiwgMHgyNywgMHgxOSwgMHhlNSwgMHhkNCwgMHg5MSwKLQkweGRlLCAweDQyLCAweDhlLCAweDhjLCAweDUyLCAweDYyLCAweDEzLCAweGUzLCAweDkwLCAweGJiLCAweDljLCAweDY1LAotCTB4ZGUsIDB4YTMsIDB4ZGUsIDB4ZTcsIDB4ZjUsIDB4OTYsIDB4OTAsIDB4MTMsIDB4NWIsIDB4ZDYsIDB4ODcsIDB4ZTQsCi0JMHhjNCwgMHhmMywgMHgwMywgMHhiNSwgMHgxOSwgMHg4MywgMHhmMSwgMHgwMywgMHhiNywgMHhlOSwgMHg0ZCwgMHg3MSwKLQkweGU2LCAweDg4LCAweGFiLCAweDhkLCAweGYzLCAweDU2LCAweDZjLCAweDk1LCAweDk0LCAweGQxLCAweDdkLCAweDMxLAotCTB4MjUsIDB4ZGYsIDB4YzcsIDB4MDIsIDB4ZjgsIDB4YWIsIDB4MmMsIDB4YjgsIDB4MjIsIDB4YjIsIDB4OTYsIDB4MmYsCi0JMHg2YiwgMHhiOCwgMHgwZCwgMHhmMiwgMHhjYywgMHhiMCwgMHg1OSwgMHhjNiwgMHhlZiwgMHg5MiwgMHg3NSwgMHg0MSwKLQkweDQ0LCAweDI3LCAweDVjLCAweDMwLCAweDMyLCAweDA3LCAweDY1LCAweGNlLCAweGE2LCAweDViLCAweDA4LCAweDJjLAotCTB4ZmMsIDB4MWQsIDB4NzMsIDB4MGIsIDB4OTksIDB4OWYsIDB4OWEsIDB4NGMsIDB4OWQsIDB4OTIsIDB4MDksIDB4ZmEsCi0JMHhjOCwgMHg5MSwgMHg5ZiwgMHg4MCwgMHhkZSwgMHg5YywgMHhhMCwgMHhhZSwgMHgxYiwgMHg0MywgMHhiMiwgMHgwZiwKLQkweGMwLCAweGU5LCAweDRiLCAweGMwLCAweGU2LCAweGM1LCAweGU2LCAweDY5LCAweDdjLCAweDA2LCAweGE1LCAweGNjLAotCTB4MDUsIDB4ZTcsIDB4OGUsIDB4YWQsIDB4NDAsIDB4NTksIDB4NDUsIDB4ZDQsIDB4NTcsIDB4OGMsIDB4NmIsIDB4NzgsCi0JMHhkZSwgMHg0NiwgMHhiZSwgMHhmZiwgMHgwNSwgMHg5NCwgMHhhZCwgMHg2YywgMHg0MSwgMHg4MiwgMHg2MywgMHgyZiwKLQkweDM1LCAweGJlLCAweGM0LCAweDZiLCAweDBmLCAweGEzLCAweDJmLCAweGU5LCAweGUyLCAweDM4LCAweGZlLCAweGQ1LAotCTB4MmEsIDB4YWIsIDB4MTYsIDB4ZDksIDB4NGMsIDB4NmYsIDB4MDksIDB4ZjMsIDB4ZjQsIDB4YTgsIDB4YWQsIDB4MGIsCi0JMHg2MiwgMHg2MywgMHg1MiwgMHhiOCwgMHg0OCwgMHg2ZCwgMHg3NCwgMHgzZCwgMHg5OCwgMHgyYiwgMHg1NywgMHhlYiwKLQkweDJkLCAweDZkLCAweDRhLCAweDA3LCAweDZkLCAweGI2LCAweDliLCAweDNhLCAweDk3LCAweGIyLCAweDk2LCAweGI1LAotCTB4M2MsIDB4MzAsIDB4NDksIDB4MWQsIDB4NzcsIDB4ZjAsIDB4ZGMsIDB4ZjAsIDB4YmYsIDB4MDUsIDB4ZjUsIDB4OWEsCi0JMHg0MiwgMHg5YywgMHhiMiwgMHhlMiwgMHg5YSwgMHg4ZiwgMHg3NiwgMHhhOSwgMHhhZSwgMHgxMiwgMHhkZSwgMHhiMiwKLQkweDM0LCAweDc0LCAweGFlLCAweDQ0LCAweGY2LCAweDIxLCAweDY3LCAweGVkLCAweGY0LCAweDY4LCAweDRlLCAweDk3LAotCTB4ZTcsIDB4ZWYsIDB4ZWEsIDB4MzYsIDB4NWUsIDB4YjUsIDB4YWYsIDB4M2IsIDB4ZWMsIDB4ZWIsIDB4ZTEsIDB4ZGMsCi0JMHhmNSwgMHhhMywgMHhiYywgMHhmZSwgMHgzZCwgMHg1ZSwgMHhlZiwgMHhhMSwgMHhlZSwgMHhkNSwgMHgyYiwgMHhhNCwKLQkweGZlLCAweDVhLCAweDUzLCAweGVhLCAweDMzLCAweDQ1LCAweDMxLCAweGJhLCAweDczLCAweGYzLCAweGQxLCAweGQxLAotCTB4OWEsIDB4MmQsIDB4ZGIsIDB4ZDMsIDB4OWEsIDB4NmQsIDB4YzMsIDB4YzksIDB4MzYsIDB4ZTIsIDB4ZDEsIDB4NjIsCi0JMHg5OCwgMHgyOCwgMHg2MSwgMHg5YywgMHgzZiwgMHg2YiwgMHg4OCwgMHg1YywgMHg5YywgMHhiYiwgMHhiNCwgMHhjOCwKLQkweGQ1LCAweGM2LCAweGI4LCAweGQyLCAweGY1LCAweDQyLCAweDMxLCAweGUyLCAweDFkLCAweDMzLCAweDZjLCAweDNiLAotCTB4M2MsIDB4N2EsIDB4OTcsIDB4ZWMsIDB4OGYsIDB4N2IsIDB4NWIsIDB4NjksIDB4ZjAsIDB4YzksIDB4YjYsIDB4Y2EsCi0JMHgyNCwgMHg3OSwgMHhlMiwgMHg0MywgMHhhNiwgMHgzMywgMHg1YywgMHhlNywgMHg5OCwgMHg5NywgMHgyOSwgMHg4NCwKLQkweDExLCAweDNiLCAweGFmLCAweDdjLCAweDY0LCAweGUzLCAweDQzLCAweDIyLCAweGQ1LCAweGMwLCAweDRjLCAweDI2LAotCTB4MWUsIDB4NjQsIDB4MGUsIDB4MTIsIDB4NGMsIDB4NTMsIDB4YjcsIDB4YWQsIDB4NDQsIDB4ZWMsIDB4YTMsIDB4ZjYsCi0JMHgxZSwgMHgzOSwgMHhlNywgMHhjNCwgMHgwYSwgMHgzNCwgMHhlOCwgMHgwZSwgMHhjYywgMHgwYiwgMHhjZiwgMHg2MCwKLQkweDI2LCAweDQzLCAweGJiLCAweDM0LCAweDBiLCAweDFkLCAweGJhLCAweGZmLCAweDU2LCAweDdjLCAweGM2LCAweDIzLAotCTB4ZjUsIDB4MGUsIDB4YTYsIDB4MzIsIDB4ZWIsIDB4OGEsIDB4MzksIDB4YTcsIDB4ZGYsIDB4YTAsIDB4MWMsIDB4ZGIsCi0JMHgwMywgMHgyMiwgMHhjNywgMHhkNywgMHg3MywgMHg3MiwgMHhiNCwgMHgzMCwgMHg2NiwgMHg5OSwgMHhkYSwgMHhjZCwKLQkweDgxLCAweDllLCAweDBiLCAweDdhLCAweDdiLCAweGMxLCAweGQ2LCAweGRiLCAweGMzLCAweDNjLCAweDJmLCAweDY0LAotCTB4YmUsIDB4NWMsIDB4ODAsIDB4MTMsIDB4NzUsIDB4ZGUsIDB4ZGMsIDB4N2UsIDB4MzcsIDB4YzksIDB4N2QsIDB4MDQsCi0JMHg3ZiwgMHhjZiwgMHg3YywgMHg2OSwgMHhiNSwgMHhhMSwgMHg4NywgMHgxZCwgMHgzNiwgMHg2NywgMHg3NiwgMHgyMywKLQkweDZlLCAweGYzLCAweDUxLCAweDc5LCAweDc2LCAweDVlLCAweDg2LCAweGM3LCAweGVkLCAweDcyLCAweDJlLCAweGVhLAotCTB4YTQsIDB4MDQsIDB4NGYsIDB4ZTQsIDB4ZmMsIDB4NDUsIDB4ZjYsIDB4MmUsIDB4N2MsIDB4YzMsIDB4ZmUsIDB4YmQsCi0JMHg5NywgMHg3MywgMHhlYiwgMHhhMiwgMHhhZiwgMHhlNiwgMHg2MywgMHg5NCwgMHhhYywgMHg4MSwgMHg2ZiwgMHhiNCwKLQkweDdkLCAweDdmLCAweDA4LCAweGM3LCAweGVjLCAweGZmLCAweDk5LCAweDZjLCAweGZlLCAweDgyLCAweDZlLCAweDUzLAotCTB4ZjYsIDB4ZmMsIDB4OTQsIDB4NjAsIDB4OTMsIDB4M2MsIDB4OGIsIDB4NGMsIDB4NGIsIDB4NGUsIDB4N2QsIDB4M2QsCi0JMHhiNiwgMHg3MCwgMHg1NCwgMHg2ZSwgMHg4MywgMHgxYywgMHg0MywgMHgxMywgMHg5YiwgMHhlOCwgMHg0NCwgMHg5ZiwKLQkweDY2LCAweDdhLCAweGQzLCAweDc1LCAweDUzLCAweDczLCAweDBmLCAweDEzLCAweGZiLCAweGViLCAweDdlLCAweDZmLAotCTB4NDUsIDB4ZWQsIDB4N2MsIDB4ZTQsIDB4OTQsIDB4NzUsIDB4YzAsIDB4MzgsIDB4MTEsIDB4YTIsIDB4MDcsIDB4YWYsCi0JMHgyYiwgMHhiMCwgMHhmNSwgMHg3YiwgMHhmZSwgMHgyZSwgMHg3YiwgMHg5ZiwgMHgyMCwgMHg2NSwgMHg3ZSwgMHgyMSwKLQkweDIxLCAweDcxLCAweDc0LCAweDM2LCAweDUyLCAweGE2LCAweGM4LCAweGU2LCAweDZjLCAweGRlLCAweGMxLCAweDM5LAotCTB4ZTksIDB4NGUsIDB4MDYsIDB4YTIsIDB4NTcsIDB4ZjIsIDB4ZGUsIDB4MDQsIDB4NjMsIDB4ZDksIDB4MjYsIDB4ZWEsCi0JMHgzMywgMHhkNiwgMHgyYywgMHgzYywgMHhhOCwgMHgwZCwgMHg3YiwgMHg2OSwgMHg2MywgMHhlMywgMHhhNiwgMHg2NSwKLQkweDFkLCAweDI0LCAweDQ2LCAweDk0LCAweGNmLCAweDUzLCAweDkxLCAweGE5LCAweDZlLCAweDQzLCAweDkyLCAweGIxLAotCTB4ZTksIDB4YTAsIDB4ZDEsIDB4ZjAsIDB4OTksIDB4MDIsIDB4YzQsIDB4ZmQsIDB4NmUsIDB4ZTgsIDB4YmUsIDB4YWQsCi0JMHgxYywgMHhjZCwgMHg0MywgMHg5YywgMHhhZiwgMHgxMywgMHhhNiwgMHhmMCwgMHgzMywgMHhlNywgMHhmOSwgMHhhNSwKLQkweDMwLCAweGMyLCAweDhiLCAweDFkLCAweGZmLCAweDZhLCAweDRkLCAweGRhLCAweGNmLCAweDUxLCAweGJiLCAweGZlLAotCTB4MjcsIDB4NjUsIDB4NjgsIDB4MTcsIDB4ZTcsIDB4MmQsIDB4ZTcsIDB4MWMsIDB4YmYsIDB4MTcsIDB4OTAsIDB4ZTcsCi0JMHhlMCwgMHg0MCwgMHg2ZCwgMHg2ZiwgMHhjMywgMHgzYSwgMHg5MSwgMHhlMSwgMHg0MCwgMHhjOCwgMHgxOSwgMHgzYiwKLQkweDg4LCAweDQwLCAweGYzLCAweDA2LCAweGU1LCAweDIyLCAweDA3LCAweGJmLCAweDcyLCAweGNjLCAweGM0LCAweDY4LAotCTB4ZGQsIDB4OGIsIDB4ZTQsIDB4MGIsIDB4NTIsIDB4YmYsIDB4MTAsIDB4NGYsIDB4OWIsIDB4Y2YsIDB4NWIsIDB4MzUsCi0JMHhkMywgMHhiZiwgMHg2NywgMHgxZCwgMHgzMiwgMHhkNCwgMHhmNSwgMHhkNCwgMHg3NiwgMHhhYywgMHg5NCwgMHg2ZCwKLQkweDk1LCAweGIwLCAweGFkLCAweDdiLCAweDAzLCAweGJhLCAweGI5LCAweDgzLCAweDZkLCAweDNkLCAweDkzLCAweDM4LAotCTB4MTEsIDB4NzQsIDB4YjMsIDB4YWQsIDB4MjcsIDB4NGMsIDB4ZTEsIDB4ZTAsIDB4Y2UsIDB4YTYsIDB4MjYsIDB4Y2UsCi0JMHg2ZCwgMHg1NywgMHgzMiwgMHhlMCwgMHhkYiwgMHg0NiwgMHhiOSwgMHgyNCwgMHgzNywgMHhiYSwgMHgzMywgMHgyMSwKLQkweGVmLCAweDc0LCAweDdjLCAweDlkLCAweGUzLCAweDg5LCAweGI2LCAweGJiLCAweGQwLCAweGYwLCAweDUwLCAweDE5LAotCTB4ZWQsIDB4YTcsIDB4MWMsIDB4NzksIDB4NWIsIDB4ZDcsIDB4N2QsIDB4YzQsIDB4M2IsIDB4ZGMsIDB4Y2IsIDB4MzIsCi0JMHg2ZiwgMHgwNiwgMHg2NiwgMHhlMywgMHg5NSwgMHg1MCwgMHhjMywgMHhjYSwgMHhkOSwgMHg3MCwgMHhjNiwgMHgwZSwKLQkweDI5LCAweDgxLCAweGE2LCAweDBkLCAweDRhLCAweDVjLCAweDEzLCAweDViLCAweGJjLCAweDI3LCAweGE1LCAweDA3LAotCTB4MWIsIDB4MjEsIDB4ZDgsIDB4ZGQsIDB4NDIsIDB4N2QsIDB4Y2MsIDB4YzYsIDB4ODcsIDB4MGIsIDB4NDUsIDB4MmUsCi0JMHg2NywgMHgzOCwgMHhlOCwgMHgwOCwgMHg3NCwgMHgzYywgMHhjZiwgMHhmOSwgMHgyZCwgMHg5YiwgMHg5NywgMHhjZCwKLQkweGZiLCAweGQyLCAweGY2LCAweGJlLCAweGNlLCAweDE2LCAweGY0LCAweGE1LCAweDRmLCAweGJkLCAweDc3LCAweGMwLAotCTB4ODAsIDB4ZjMsIDB4NjgsIDB4ZGQsIDB4YTMsIDB4MTYsIDB4ZWMsIDB4NzcsIDB4NDAsIDB4MWEsIDB4NjQsIDB4MWUsCi0JMHg1YSwgMHg2NCwgMHgxZSwgMHg4YSwgMHhlOSwgMHg0ZiwgMHgzNywgMHg1MSwgMHhlZSwgMHhmNSwgMHhiNiwgMHhkYywKLQkweGIzLCAweDMxLCAweDZjLCAweGNhLCAweDdhLCAweDkyLCAweDUzLCAweGJiLCAweDA3LCAweDNkLCAweGM0LCAweGNlLAotCTB4YzAsIDB4ZjksIDB4MmUsIDB4ZjYsIDB4ZjMsIDB4MjYsIDB4NjUsIDB4OWUsIDB4NDcsIDB4YmQsIDB4NGYsIDB4MzYsCi0JMHgwYiwgMHgzZiwgMHg3YywgMHgxOCwgMHhiZCwgMHhjOSwgMHhmYywgMHgzYiwgMHgyMiwgMHgwYSwgMHg1MiwgMHgwMSwKLQkweGU5LCAweGUzLCAweDYxLCAweGYyLCAweGE1LCAweDJlLCAweDZiLCAweGIyLCAweDVhLCAweGFlLCAweGVmLCAweDY1LAotCTB4MmUsIDB4MWQsIDB4ZDUsIDB4ZTgsIDB4MGYsIDB4ZDQsIDB4M2IsIDB4ZjQsIDB4ZDksIDB4ZDAsIDB4MjcsIDB4Y2UsCi0JMHgzOCwgMHhhMiwgMHhmNCwgMHgwMSwgMHhkMywgMHg3YiwgMHg5ZSwgMHhkOCwgMHg3MCwgMHgxNCwgMHgxZCwgMHgxNiwKLQkweDJhLCAweDZjLCAweDdiLCAweGY4LCAweGY5LCAweDg4LCAweGYxLCAweDBiLCAweDQ1LCAweDYyLCAweDdiLCAweDg2LAotCTB4M2EsIDB4NjAsIDB4YjYsIDB4ZGYsIDB4MmUsIDB4M2EsIDB4MjgsIDB4YTUsIDB4Y2YsIDB4OGUsIDB4MDUsIDB4NzQsCi0JMHhmZiwgMHgyYiwgMHg5NCwgMHg2NywgMHgwNywgMHhlNSwgMHg1OSwgMHg5MSwgMHg5ZCwgMHg0MywgMHhkZiwgMHgxNiwKLQkweDQ1LCAweDdjLCAweDNhLCAweGQwLCAweGJjLCAweDlhLCAweGQ3LCAweGI3LCAweDUzLCAweDllLCAweDQwLCAweGFmLAotCTB4ODIsIDB4YTEsIDB4ZTYsIDB4NmUsIDB4ZjIsIDB4YjEsIDB4MGUsIDB4ZWEsIDB4ZTAsIDB4YTIsIDB4M2MsIDB4NmUsCi0JMHg3YiwgMHhjZSwgMHgzYSwgMHhjOCwgMHgwNSwgMHgwYSwgMHg5OSwgMHhmZiwgMHgwYiwgMHg3ZSwgMHg2YiwgMHgxOCwKLQkweGE2LCAweDlkLCAweGVlLCAweGU3LCAweDhjLCAweDQ0LCAweGJkLCAweDJhLCAweDBhLCAweDBkLCAweGMxLCAweDgwLAotCTB4NmEsIDB4NWUsIDB4NzMsIDB4NzEsIDB4NmUsIDB4Y2EsIDB4NzEsIDB4NDgsIDB4ZGIsIDB4NmIsIDB4ZWYsIDB4NjksCi0JMHhjZSwgMHhlNiwgMHhlYSwgMHgxZiwgMHg1OSwgMHhhMywgMHg1ZSwgMHhlMSwgMHg2NywgMHhiMiwgMHhkZSwgMHgyNCwKLQkweDZiLCAweDMyLCAweDcxLCAweDRmLCAweDc2LCAweDRmLCAweGI1LCAweDhiLCAweDNhLCAweGM5LCAweDVlLCAweDdmLAotCTB4NDEsIDB4NzMsIDB4ZTQsIDB4ZjIsIDB4NjYsIDB4YjksIDB4ZmUsIDB4ODEsIDB4ZjUsIDB4YWMsIDB4NWQsIDB4NWUsCi0JMHhjYSwgMHhiOSwgMHg2YywgMHgyZSwgMHg1YywgMHg2YywgMHg5NywgMHhmYiwgMHhjMCwgMHg3YSwgMHg1MSwgMHg3MywKLQkweDRlLCAweDI5LCAweDk3LCAweDdmLCAweDg2LCAweDc3LCAweGUyLCAweDZiLCAweDRlLCAweDYyLCAweDVlLCAweGUxLAotCTB4ZGMsIDB4YzUsIDB4MzgsIDB4NjksIDB4OWMsIDB4YWEsIDB4MzksIDB4NWQsIDB4ZDcsIDB4YzksIDB4MzgsIDB4MzYsCi0JMHg3NSwgMHgxZiwgMHg5OCwgMHg4NSwgMHgyNywgMHhlZCwgMHgxYywgMHhiNywgMHg2YiwgMHhiZSwgMHgwMywgMHgyNywKLQkweDc2LCAweDE2LCAweGQwLCAweDI3LCAweGEzLCAweDlhLCAweGFjLCAweDg3LCAweDQ1LCAweDRiLCAweDcyLCAweDdiLAotCTB4NTUsIDB4MjQsIDB4NmYsIDB4MGMsIDB4ZmEsIDB4ZDUsIDB4YWIsIDB4NmQsIDB4NmUsIDB4MTgsIDB4NTUsIDB4ZmYsCi0JMHhkYywgMHg3ZSwgMHgzYiwgMHhlMSwgMHgyZSwgMHg5ZCwgMHhkOCwgMHg2ZiwgMHhlNCwgMHgzOSwgMHhjYiwgMHg4OSwKLQkweDQ3LCAweDU1LCAweGUyLCAweGU0LCAweDgwLCAweGI5LCAweDU4LCAweDYyLCAweGIzLCAweDlmLCAweGY1LCAweDgzLAotCTB4MzEsIDB4NzUsIDB4MmEsIDB4YjcsIDB4NTksIDB4ZWQsIDB4NDEsIDB4NTksIDB4ZDcsIDB4MzYsIDB4MDcsIDB4NjQsCi0JMHg5ZiwgMHhhOSwgMHhlYywgMHgxOSwgMHg5NSwgMHhiZSwgMHg4YSwgMHg3MiwgMHhlYiwgMHgzYywgMHg5ZiwgMHhjNCwKLQkweDM1LCAweGYyLCAweDdkLCAweDA5LCAweGRmLCAweGY4LCAweDIwLCAweGM3LCAweGRkLCAweGY0LCAweDYwLCAweGQ0LAotCTB4OTYsIDB4ZjMsIDB4NTcsIDB4ZDYsIDB4NGEsIDB4MmQsIDB4MzMsIDB4NDMsIDB4YzMsIDB4YTUsIDB4YjIsIDB4NDcsCi0JMHg3MywgMHhiMiwgMHhjNywgMHgzZSwgMHg3MSwgMHg5ZCwgMHg0YSwgMHhmYSwgMHg5OSwgMHhkYSwgMHg2NiwgMHg3ZSwKLQkweDRmLCAweGI3LCAweGFjLCAweDYxLCAweGNhLCAweDNkLCAweDA1LCAweDVkLCAweGM0LCAweGExLCAweGE4LCAweGQ2LAotCTB4YzAsIDB4MzgsIDB4YWYsIDB4ZmIsIDB4ZDYsIDB4NzAsIDB4M2UsIDB4ZTIsIDB4NWUsIDB4ZDksIDB4Y2IsIDB4OWUsCi0JMHg4ZiwgMHg5MSwgMHg4NSwgMHhjOCwgMHhhZSwgMHgyNSwgMHhjYSwgMHg3ZSwgMHg4NywgMHhlYywgMHhmYSwgMHgyMSwKLQkweGVkLCAweDFlLCAweDVkLCAweGE5LCAweGRmLCAweDU5LCAweDE5LCAweGFmLCAweDkzLCAweGIxLCAweGYwLCAweGUyLAotCTB4M2UsIDB4ZWEsIDB4MjEsIDB4ZWEsIDB4NTUsIDB4ZDYsIDB4NDEsIDB4YjYsIDB4NWMsIDB4NTgsIDB4YWIsIDB4OTAsCi0JMHgzNSwgMHgxYSwgMHg4OSwgMHhiZCwgMHhiZiwgMHhiNSwgMHg1YSwgMHgyZiwgMHgyOSwgMHgzYiwgMHg3NSwgMHg0ZiwKLQkweDc5LCAweDc1LCAweDRjLCAweDllLCAweDgzLCAweDhkLCAweGU2LCAweGQ2LCAweGIxLCAweDFiLCAweGZmLCAweGUwLAotCTB4MzksIDB4ZDgsIDB4MDQsIDB4NmQsIDB4MDksIDB4ZDEsIDB4MmQsIDB4ZTQsIDB4NzYsIDB4NzEsIDB4NzQsIDB4NjMsCi0JMHgzNCwgMHg1MSwgMHhhYiwgMHg2ZCwgMHg4NSwgMHgyNiwgMHhlYiwgMHhiNywgMHhmYywgMHhlYiwgMHhjNiwgMHhhMSwKLQkweDA0LCAweGEyLCAweDA1LCAweDU3LCAweDk1LCAweDkzLCAweDZmLCAweDIxLCAweGVhLCAweDYwLCAweDhjLCAweDdhLAotCTB4MjIsIDB4NTEsIDB4ZGIsIDB4YjQsIDB4OWQsIDB4NjMsIDB4ZjIsIDB4YWYsIDB4ZWMsIDB4YzYsIDB4NzAsIDB4YTIsCi0JMHhlMSwgMHg0YiwgMHg4YywgMHgyMywgMHhmZSwgMHgxMiwgMHg5YiwgMHhlYiwgMHg0NCwgMHhmZiwgMHhjYiwgMHgwMSwKLQkweGUyLCAweGMwLCAweGU2LCAweGRjLCAweDFhLCAweDUyLCAweDZiLCAweGUyLCAweGQ3LCAweDk0LCAweGRmLCAweDE2LAotCTB4OTIsIDB4ZjUsIDB4ZmUsIDB4NTQsIDB4YjksIDB4MDksIDB4ZTYsIDB4ZDMsIDB4YTcsIDB4YjAsIDB4YjYsIDB4NWYsCi0JMHhjMSwgMHhiMywgMHhjNiwgMHgyOSwgMHhhYywgMHgxOSwgMHgxMiwgMHg3OSwgMHg0ZSwgMHhhMSwgMHhhZCwgMHhmZiwKLQkweGZiLCAweGQ4LCAweGRmLCAweDNmLCAweDFkLCAweDhkLCAweGI2LCAweDZlLCAweDNhLCAweGIwLCAweDYxLCAweGQ3LAotCTB4MTEsIDB4ZWMsIDB4NDgsIDB4NWEsIDB4ZDgsIDB4MWUsIDB4ZjIsIDB4NjAsIDB4ZmQsIDB4M2UsIDB4MDUsIDB4Y2IsCi0JMHgwMywgMHhjNywgMHhiMCwgMHg3NSwgMHg5NywgMHg4NSwgMHgzOSwgMHhhMSwgMHg0ZSwgMHgzNCwgMHg5OSwgMHgyNSwKLQkweDI4LCAweGFjLCAweDk4LCAweGI3LCAweDRlLCAweDY1LCAweGI5LCAweGQ2LCAweGUxLCAweDhlLCAweGRjLCAweGZlLAotCTB4ZTUsIDB4NDMsIDB4YzQsIDB4MDIsIDB4MTUsIDB4M2UsIDB4NDMsIDB4ZjYsIDB4MjYsIDB4NDcsIDB4OTUsIDB4ZGIsCi0JMHhkMywgMHg4ZCwgMHg0YSwgMHg0YiwgMHhlZSwgMHgzOSwgMHhlMiwgMHhhZCwgMHhlOSwgMHg4ZiwgMHg5OSwgMHhmZiwKLQkweGM0LCAweGIxLCAweDNmLCAweDc0LCAweDBhLCAweDQzLCAweDQzLCAweGJmLCAweDJlLCAweGNkLCAweGZhLCAweGNiLAotCTB4MDQsIDB4YjksIDB4ODMsIDB4ZTQsIDB4MWMsIDB4MjYsIDB4NmQsIDB4ZWEsIDB4NGYsIDB4YmQsIDB4MzcsIDB4MjQsCi0JMHg3NiwgMHgzNywgMHg4OSwgMHg5ZiwgMHgwZSwgMHg5ZSwgMHhjNiwgMHhlOSwgMHhjMSwgMHg3ZiwgMHhjMSwgMHgxMiwKLQkweDRkLCAweGYyLCAweDM0LCAweGFiLCAweGQzLCAweDE5LCAweGIxLCAweGFjLCAweDNkLCAweGY1LCAweDcxLCAweGFiLAotCTB4ZGEsIDB4NzgsIDB4YWIsIDB4MGMsIDB4YzUsIDB4NjUsIDB4OTgsIDB4MTYsIDB4NzksIDB4MGQsIDB4ZGIsIDB4MzUsCi0JMHhiNiwgMHg5NSwgMHgzYywgMHg4NCwgMHg5ZCwgMHg4YywgMHhlYiwgMHhiZSwgMHhjOCwgMHgxZCwgMHhmMCwgMHgyNSwKLQkweDMzLCAweDY2LCAweDI1LCAweGEyLCAweDNiLCAweDJiLCAweGExLCAweGI3LCAweDU3LCAweDM4LCAweDhjLCAweDhlLAotCTB4N2YsIDB4NTYsIDB4ZWEsIDB4NzAsIDB4NmIsIDB4ZmEsIDB4MzQsIDB4N2UsIDB4MzEsIDB4NjgsIDB4ZWYsIDB4YzksCi0JMHg2YSwgMHhmOSwgMHhiNiwgMHg2MiwgMHg3NSwgMHg2ZSwgMHgwZiwgMHhlOSwgMHg0ZCwgMHhmZiwgMHg1NSwgMHg4OSwKLQkweGM2LCAweDY1LCAweDJmLCAweDRmLCAweDExLCAweDczLCAweDgyLCAweGRiLCAweDA2LCAweDI1LCAweGRmLCAweDZjLAotCTB4ODEsIDB4YmIsIDB4NTcsIDB4Y2YsIDB4MmMsIDB4MjUsIDB4Y2YsIDB4ZmUsIDB4Y2EsIDB4ODIsIDB4ZjgsIDB4OGMsCi0JMHgyYSwgMHhkYSwgMHhhNSwgMHg0MywgMHhkMSwgMHg4MywgMHg4NiwgMHhkYSwgMHg4OSwgMHhlMywgMHhhNiwgMHgzZSwKLQkweGYxLCAweDViLCAweDg3LCAweDMxLCAweGY0LCAweDJkLCAweGQ0LCAweDYxLCAweDU1LCAweDVhLCAweDFmLCAweGJhLAotCTB4ODYsIDB4NzksIDB4ZDgsIDB4ZDYsIDB4M2UsIDB4MTMsIDB4YzksIDB4M2UsIDB4YmQsIDB4YTUsIDB4YzMsIDB4ZDEsCi0JMHg4MywgMHhmYiwgMHgwMiwgMHgzNSwgMHhlZCwgMHhlZiwgMHg5MSwgMHhjYiwgMHg3OSwgMHg4OCwgMHgyOSwgMHg3ZCwKLQkweGUzLCAweDIzLCAweGNjLCAweDEzLCAweDdiLCAweGIwLCAweDYxLCAweDVmLCAweDA0LCAweGViLCAweGY3LCAweDk4LAotCTB4ZTgsIDB4ZWUsIDB4MWIsIDB4YTEsIDB4NmMsIDB4MmYsIDB4OTUsIDB4Y2EsIDB4MWUsIDB4OTYsIDB4ZTYsIDB4NTAsCi0JMHhmYywgMHg2NiwgMHgxNSwgMHg4MSwgMHgyOCwgMHhmYiwgMHg2YywgMHg1MCwgMHgyMywgMHgwMSwgMHhiZiwgMHhhYSwKLQkweDMwLCAweGZhLCAweDhmLCAweDNiLCAweGIxLCAweDg5LCAweDY1LCAweDdhLCAweDkzLCAweGI0LCAweGI5LCAweDNlLAotCTB4MzcsIDB4ZTMsIDB4ZTUsIDB4NGMsIDB4MGMsIDB4OGYsIDB4ZjksIDB4NzAsIDB4NzAsIDB4Y2MsIDB4ODMsIDB4YTEsCi0JMHgzMSwgMHg4ZCwgMHg0NywgMHgzMSwgMHgxZSwgMHgxYiwgMHg5MCwgMHhiZCwgMHgyMCwgMHg1ZSwgMHgzYywgMHg3ZCwKLQkweGMwLCAweDhkLCAweGNkLCAweGJiLCAweDNkLCAweDk4LCAweDFkLCAweDk5LCAweDg2LCAweDAzLCAweDA3LCAweDhhLAotCTB4YjEsIDB4OTcsIDB4ZDcsIDB4MmIsIDB4MTYsIDB4ZmEsIDB4ZjEsIDB4MjQsIDB4YWYsIDB4ZjcsIDB4ZWYsIDB4NzYsCi0JMHg3MSwgMHgxZSwgMHhlNiwgMHhlMCwgMHgzMCwgMHgwZCwgMHg3YiwgMHg2OCwgMHhhYywgMHgwNCwgMHhjOSwgMHgwMSwKLQkweDlhLCAweDNjLCAweDM5LCAweGViLCAweGRiLCAweGNjLCAweDMwLCAweDQ2LCAweDBmLCAweDMwLCAweDM2LCAweGVlLAotCTB4MzMsIDB4OTEsIDB4NjAsIDB4M2YsIDB4M2IsIDB4YTgsIDB4YWIsIDB4NmUsIDB4ZTIsIDB4ZGEsIDB4ODYsIDB4MzEsCi0JMHhjMSwgMHhmOCwgMHg1NSwgMHhiOCwgMHhhOSwgMHg1NywgMHg2ZiwgMHg2YSwgMHg1NCwgMHg4YywgMHhlOCwgMHgyMiwKLQkweDdiLCAweGJmLCAweDk3LCAweGJjLCAweGRmLCAweGI1LCAweDBhLCAweDBkLCAweDA5LCAweGRkLCAweDZjLCAweDQ0LAotCTB4MjcsIDB4NGUsIDB4NzIsIDB4ZGMsIDB4ZmYsIDB4MTcsIDB4ZmQsIDB4NzYsIDB4YjEsIDB4NDMsIDB4ZWYsIDB4YjksCi0JMHg1MSwgMHgzZCwgMHg4MiwgMHg5ZCwgMHhlOSwgMHhhMywgMHhlNCwgMHhlYSwgMHg0MCwgMHg3OCwgMHhmZiwgMHgxMSwKLQkweGYyLCAweGI3LCAweGUzLCAweGM0LCAweDlmLCAweDM3LCAweDJkLCAweDlmLCAweGExLCAweGUyLCAweGQ2LCAweDQ3LAotCTB4OGMsIDB4ZjAsIDB4ZmIsIDB4NGEsIDB4YTAsIDB4ZmQsIDB4NTcsIDB4ZDQsIDB4YzEsIDB4NjcsIDB4MGYsIDB4YTgsCi0JMHhiOCwgMHg2NSwgMHhlNywgMHg2MiwgMHhhNCwgMHg0MiwgMHg1MSwgMHhlYywgMHg1OCwgMHhhNCwgMHhlMiwgMHhlNiwKLQkweDdkLCAweDQ3LCAweDg4LCAweGZiLCAweDEzLCAweDM2LCAweDRmLCAweGNlLCAweGE0LCAweDFlLCAweDQ2LCAweGIwLAotCTB4NTcsIDB4ZDYsIDB4YjgsIDB4ZGQsIDB4OGMsIDB4ZGYsIDB4YTUsIDB4NzgsIDB4YTYsIDB4OWYsIDB4MzksIDB4YjQsCi0JMHg1OSwgMHg4YSwgMHgxMywgMHg0MywgMHg0NywgMHg2OCwgMHg4ZiwgMHhhNSwgMHgzOCwgMHhkZSwgMHg2ZiwgMHg0YywKLQkweGZjLCAweGQ0LCAweDUxLCAweDhhLCAweGE3LCAweDc5LCAweGJlLCAweDkzLCAweGU3LCAweDBiLCAweDA3LCAweDhjLAotCTB4ZmUsIDB4MGUsIDB4YjUsIDB4MTQsIDB4MGIsIDB4ZjYsIDB4ZDcsIDB4YTMsIDB4YmYsIDB4NGYsIDB4NmMsIDB4NTMsCi0JMHg0MywgMHhmYiwgMHg1OCwgMHg1ZCwgMHg0ZSwgMHhmNywgMHhhMiwgMHg3MywgMHgyZiwgMHgzNiwgMHg1MiwgMHg1NywKLQkweGY3LCAweGVkLCAweGVjLCAweDY0LCAweDdmLCAweDNlLCAweGVhLCAweGZjLCAweDA4LCAweDFlLCAweDYzLCAweDVlLAotCTB4YjcsIDB4YmQsIDB4Y2YsIDB4ODcsIDB4NzMsIDB4NDksIDB4YzMsIDB4ZmYsIDB4NDUsIDB4YzUsIDB4MzAsIDB4OGIsCi0JMHg5NCwgMHg4MCwgMHhmNiwgMHgwYywgMHg3YywgMHgzOCwgMHg5ZCwgMHgyZSwgMHhjNiwgMHhhNiwgMHg4MSwgMHg5OSwKLQkweGY4LCAweDI5LCAweGVkLCAweGYzLCAweGQxLCAweGRkLCAweGQyLCAweGRmLCAweDA0LCAweGUzLCAweGMzLCAweDJjLAotCTB4M2MsIDB4M2QsIDB4NjIsIDB4YjIsIDB4NmQsIDB4OTksIDB4MjcsIDB4ODksIDB4MzksIDB4ZGQsIDB4NzAsIDB4MjUsCi0JMHhjNSwgMHgzNywgMHhhMiwgMHgzYiwgMHg2OSwgMHgxNiwgMHhjNCwgMHhjNCwgMHg2MywgMHg0OCwgMHhmNywgMHhlYiwKLQkweDNkLCAweGI3LCAweGE5LCAweGMyLCAweGFiLCAweDU1LCAweGVhLCAweGQyLCAweDgxLCAweDQ5LCAweDRkLCAweDhmLAotCTB4NTcsIDB4YTgsIDB4ZjEsIDB4N2UsIDB4ZTYsIDB4YWYsIDB4ZjEsIDB4NGEsIDB4ZjUsIDB4MTgsIDB4OWUsIDB4ZWUsCi0JMHg3NywgMHg2MiwgMHhkZSwgMHg0MiwgMHg5NSwgMHhkNywgMHhlMywgMHhlNywgMHgxOSwgMHhkYiwgMHhlMiwgMHhiMywKLQkweDU1LCAweDEzLCAweDdiLCAweDZkLCAweDU5LCAweDExLCAweDJmLCAweDIwLCAweGI3LCAweDJmLCAweDVmLCAweDU4LAotCTB4YzMsIDB4ZjgsIDB4ZTUsIDB4MTAsIDB4ZGIsIDB4OGIsIDB4OTUsIDB4YWEsIDB4NGUsIDB4ZWEsIDB4ZmQsIDB4MzQsCi0JMHg0NiwgMHg2OCwgMHhkNywgMHg0ZiwgMHhmMCwgMHgzOCwgMHgzYywgMHg2OCwgMHg3NSwgMHgyZSwgMHgyNywgMHhlNywKLQkweDllLCAweDEzLCAweGIwLCAweDNhLCAweDZmLCAweDMzLCAweDBkLCAweDVmLCAweDgxLCAweDFhLCAweDg4LCAweDdlLAotCTB4MDUsIDB4YTcsIDB4NzEsIDB4NjgsIDB4NDQsIDB4Y2EsIDB4YzAsIDB4ZWQsIDB4OGQsIDB4MzAsIDB4YWYsIDB4ZWUsCi0JMHhiMywgMHgzYSwgMHg3NywgMHg5YSwgMHg3MywgMHg1MCwgMHg2ZiwgMHhlNywgMHhjNiwgMHgzZiwgMHgyZiwgMHhjZCwKLQkweDYyLCAweGE2LCAweGY4LCAweDkxLCAweGJkLCAweGE3LCAweDBhLCAweGJmLCAweDYyLCAweDNiLCAweGVmLCAweDBmLAotCTB4OTYsIDB4YTMsIDB4YWEsIDB4NTIsIDB4ZmMsIDB4ZTAsIDB4MTQsIDB4ZGUsIDB4ZTksIDB4N2YsIDB4MGQsIDB4ZTcsCi0JMHhmYSwgMHgyZCwgMHgyYywgMHgwOCwgMHg1OSwgMHg3MCwgMHg4NiwgMHg2YSwgMHhjZCwgMHg0NiwgMHhmNSwgMHgxYSwKLQkweDYyLCAweDg0LCAweDgyLCAweDliLCAweGU2LCAweDdlLCAweDFmLCAweGVmLCAweGQyLCAweGZmLCAweDZmLCAweDllLAotCTB4NmIsIDB4ZDksIDB4YjIsIDB4ZjQsIDB4NjIsIDB4YTEsIDB4YjUsIDB4YTMsIDB4NWEsIDB4ZmMsIDB4YzYsIDB4YjQsCi0JMHhmNywgMHhkMywgMHhmYywgMHhlOSwgMHgzYywgMHgzOCwgMHhiZiwgMHhhZiwgMHg0YiwgMHg3MiwgMHhlMSwgMHhkMywKLQkweDE4LCAweDFlLCAweDM0LCAweGEyLCAweDZiLCAweGYzLCAweDcyLCAweGY2LCAweDlmLCAweGE2LCAweDBlLCAweDJjLAotCTB4ZWMsIDB4MzQsIDB4NGYsIDB4ZWMsIDB4YWIsIDB4YzAsIDB4YmMsIDB4ZjMsIDB4Y2MsIDB4MWEsIDB4YWYsIDB4OWIsCi0JMHg0ZCwgMHhkYiwgMHg1OSwgMHhiMCwgMHgzMCwgMHg2MCwgMHgyZSwgMHg1MywgMHhmZiwgMHgzNywgMHhmZCwgMHhmNCwKLQkweDM0LCAweDBlLCAweDBlLCAweGU1LCAweGYxLCAweGRhLCAweDg3LCAweDQ2LCAweGZhLCAweDc5LCAweDc2LCAweGNmLAotCTB4YmIsIDB4MTcsIDB4MGQsIDB4YzksIDB4YTMsIDB4ZjYsIDB4ZmEsIDB4YzMsIDB4NjEsIDB4ZTIsIDB4NjMsIDB4ZjYsCi0JMHgxOSwgMHhhMSwgMHg4NiwgMHg5MSwgMHg3NCwgMHgyMywgMHhiMSwgMHgyMSwgMHg4YSwgMHhlZiwgMHhhNiwgMHgyMywKLQkweGM0LCAweDg3LCAweDMwLCAweGYxLCAweGExLCAweDllLCAweGY4LCAweDYwLCAweDEyLCAweDFmLCAweGVhLCAweDg4LAotCTB4MGYsIDB4NDEsIDB4ZmIsIDB4ZDksIDB4YjksIDB4YWMsIDB4NDcsIDB4MGYsIDB4OGQsIDB4YmUsIDB4ODYsIDB4ODIsCi0JMHg4MSwgMHg1MywgMHg3MCwgMHgwZCwgMHhjOCwgMHgzZSwgMHgzNSwgMHg4YiwgMHhmYywgMHhhNCwgMHg1NiwgMHg2YiwKLQkweGMzLCAweDFjLCAweDQ1LCAweGY2LCAweDBjLCAweDBlLCAweGE1LCAweDRmLCAweGExLCAweDY4LCAweDQwLCAweGUzLAotCTB4NTgsIDB4NjQsIDB4YWYsIDB4NDAsIDB4NGQsIDB4YjgsIDB4ODcsIDB4NTgsIDB4ZmQsIDB4NmIsIDB4YTMsIDB4YjYsCi0JMHhjNywgMHg4YiwgMHhkYSwgMHhiZCwgMHhkNSwgMHgzMCwgMHhmYSwgMHgxNywgMHhhYSwgMHg3MywgMHg5NSwgMHhlOCwKLQkweGU3LCAweGJjLCAweDFjLCAweDY3LCAweDI1LCAweDY2LCAweGVkLCAweGQ2LCAweDMwLCAweDliLCAweGM3LCAweDNmLAotCTB4MjUsIDB4NmIsIDB4MjYsIDB4ZGUsIDB4NzQsIDB4YzAsIDB4M2IsIDB4OWQsIDB4NzQsIDB4NjcsIDB4MDYsIDB4OTksCi0JMHgwMCwgMHg1OSwgMHhhZCwgMHhkNywgMHg4NywgMHgyYiwgMHgwZiwgMHg5ZiwgMHg1NiwgMHgxNSwgMHg2NCwgMHgzZSwKLQkweDI3LCAweDMxLCAweGFmLCAweDM2LCAweGQ4LCAweGFkLCAweDMyLCAweDViLCAweGQ3LCAweDA0LCAweGMzLCAweDc5LAotCTB4YTgsIDB4ODgsIDB4OTAsIDB4NDUsIDB4Y2MsIDB4NjQsIDB4N2UsIDB4NjEsIDB4YjUsIDB4OTksIDB4NDUsIDB4ZDgsCi0JMHg1MiwgMHhhNywgMHhjYSwgMHg3ZSwgMHg4ZCwgMHhhMywgMHgxMiwgMHhhMywgMHhhNiwgMHgzMywgMHg0NiwgMHgxNCwKLQkweGY3LCAweGM1LCAweGVmLCAweDk5LCAweDBlLCAweDBmLCAweDhhLCAweGZhLCAweDJjLCAweGViLCAweDFiLCAweDIxLAotCTB4MGQsIDB4OWUsIDB4NDgsIDB4MjAsIDB4YmEsIDB4ODEsIDB4NjksIDB4ZTQsIDB4ZTcsIDB4ZTYsIDB4ODUsIDB4NzEsCi0JMHg1MywgMHhmYSwgMHgzMCwgMHgwNiwgMHgzOCwgMHhiZSwgMHhlNSwgMHhlOSwgMHhmYywgMHhiYiwgMHg5YywgMHg3ZiwKLQkweGZhLCAweGVmLCAweGUyLCAweDNiLCAweGExLCAweDU3LCAweGVlLCAweDlkLCAweDBlLCAweDQzLCAweDdiLCAweDQwLAotCTB4ZWQsIDB4MjgsIDB4MjcsIDB4MDcsIDB4M2YsIDB4Y2MsIDB4YjgsIDB4YTcsIDB4NGMsIDB4N2UsIDB4NWUsIDB4NDEsCi0JMHhjYiwgMHg0MCwgMHgxYywgMHg1NSwgMHhhMSwgMHg1MywgMHg0YSwgMHg0YywgMHhmNiwgMHgzMiwgMHgyOSwgMHg5NSwKLQkweGY4LCAweGZjLCAweDZlLCAweGVhLCAweDdhLCAweDQxLCAweDg2LCAweGI2LCAweGUyLCAweGMzLCAweGI3LCAweDQ2LAotCTB4NDUsIDB4YjcsIDB4MzUsIDB4NDMsIDB4M2IsIDB4MzksIDB4OGUsIDB4MzcsIDB4ZTYsIDB4MWUsIDB4MTYsIDB4OWMsCi0JMHgzYywgMHgzMiwgMHgwYiwgMHg4ZSwgMHgyMywgMHhkMywgMHg5OCwgMHg5YiwgMHhkNiwgMHhjYywgMHhiZCwgMHhmMiwKLQkweGZjLCAweGJmLCAweGE4LCAweGEyLCAweDE3LCAweDg1LCAweGQ4LCAweGExLCAweGY3LCAweGM3LCAweGQ4LCAweGY2LAotCTB4MDcsIDB4OGUsIDB4YzMsIDB4ZDgsIDB4NDQsIDB4MGMsIDB4M2UsIDB4OWEsIDB4ZmUsIDB4MGUsIDB4NzUsIDB4NzksCi0JMHgyOCwgMHg5NywgMHgyZiwgMHhhZCwgMHg0MiwgMHhhMiwgMHg1NywgMHhmNiwgMHhlMywgMHg5ZCwgMHhjMiwgMHhhYywKLQkweDAxLCAweGJkLCAweDc5LCAweDliLCAweDYyLCAweDA0LCAweDZmLCAweDU2LCAweDRlLCAweDYxLCAweGM2LCAweDQwLAotCTB4OTAsIDB4NzMsIDB4YTksIDB4NjEsIDB4NTksIDB4NWYsIDB4MWUsIDB4M2YsIDB4MDUsIDB4ODMsIDB4NTcsIDB4MTEsCi0JMHg4MywgMHhhZCwgMHhjNSwgMHgzZiwgMHgzNSwgMHhlMywgMHhjYywgMHg3MSwgMHg3NCwgMHhkMywgMHhhOSwgMHhlOCwKLQkweDJkLCAweDczLCAweDE1LCAweGQ5LCAweDliLCAweDYzLCAweDljLCAweDZmLCAweDY1LCAweDFkLCAweGNmLCAweDQwLAotCTB4MWQsIDB4ZWUsIDB4ZTQsIDB4OTgsIDB4OWIsIDB4MzgsIDB4NmYsIDB4YWYsIDB4MmQsIDB4YjQsIDB4YjAsIDB4NjgsCi0JMHhhMSwgMHhiZSwgMHhiNywgMHhjOCwgMHgxMSwgMHg3ZCwgMHhhMCwgMHgwMiwgMHg5OSwgMHg4ZSwgMHg2YSwgMHhkYSwKLQkweGNkLCAweDdkLCAweDBiLCAweGY0LCAweGYwLCAweGFiLCAweGM0LCAweDVkLCAweGUyLCAweDM0LCAweDM2LCAweDMxLAotCTB4ZWUsIDB4YjQsIDB4MzEsIDB4MTYsIDB4MTUsIDB4NDcsIDB4ZjQsIDB4MWUsIDB4ZTYsIDB4YTgsIDB4ZWYsIDB4ZGYsCi0JMHhlZCwgMHg4OCwgMHg4NiwgMHhlNCwgMHg3ZCwgMHhhMywgMHg3ZiwgMHhjMCwgMHg2MiwgMHhiOCwgMHg0MywgMHg2NSwKLQkweGM0LCAweDQxLCAweDNkLCAweGYzLCAweDFhLCAweGY0LCAweGJkLCAweDc3LCAweDkyLCAweDkzLCAweGZlLCAweDg0LAotCTB4ZmMsIDB4YWUsIDB4ZmEsIDB4YWEsIDB4YTMsIDB4YzQsIDB4YTgsIDB4MTEsIDB4M2MsIDB4OWEsIDB4M2UsIDB4ODIsCi0JMHhiZCwgMHhlOSwgMHgxNCwgMHg3NiwgMHhhNSwgMHg3NywgMHgyOCwgMHg0MywgMHhmNiwgMHhiMywgMHgzYSwgMHg0NSwKLQkweGRlLCAweGFkLCAweDhiLCAweDk2LCAweDI5LCAweDVmLCAweDQ2LCAweDY5LCAweGU4LCAweDliLCAweGQ2LCAweDUwLAotCTB4ODUsIDB4OGEsIDB4ZjIsIDB4NTAsIDB4MTAsIDB4MzcsIDB4ZjUsIDB4YzUsIDB4ZTEsIDB4ODgsIDB4YmMsIDB4NjcsCi0JMHhjOSwgMHg3YiwgMHhkOSwgMHhlYiwgMHhjNywgMHgwZCwgMHhkYywgMHhkOCwgMHg1NywgMHg4YywgMHhkOCwgMHg3ZSwKLQkweGNiLCAweGVhLCAweGE5LCAweDc3LCAweDYyLCAweGNkLCAweDc4LCAweDFkLCAweDk2LCAweDBkLCAweDNjLCAweDY2LAotCTB4Y2QsIDB4NjYsIDB4Y2MsIDB4ZjksIDB4ZjgsIDB4NWEsIDB4MGYsIDB4ZWUsIDB4ZGUsIDB4ZWYsIDB4NDEsIDB4NmIsCi0JMHg1ZiwgMHgxNCwgMHhiZSwgMHg0OCwgMHgwOSwgMHg3ZiwgMHgwNywgMHhjYywgMHgyNSwgMHgzMCwgMHgyNiwgMHgyNiwKLQkweDYwLCAweGY0LCAweGRjLCAweGUwLCAweDA4LCAweDFjLCAweDBhLCAweGFiLCAweDFlLCAweDdjLCAweDk1LCAweDM4LAotCTB4YmUsIDB4OWMsIDB4YjgsIDB4MTMsIDB4MWIsIDB4YjcsIDB4NTAsIDB4MWUsIDB4ZjEsIDB4ZTIsIDB4MWUsIDB4ZDYsCi0JMHhiZiwgMHg4NSwgMHg3MywgMHhmZiwgMHhlZSwgMHhhMiwgMHg0MywgMHhjNCwgMHgwMiwgMHhkOSwgMHg4MywgMHhhOCwKLQkweDYxLCAweGMzLCAweGI4LCAweDliLCAweGJhLCAweDcyLCAweDIzLCAweDc2LCAweGIwLCAweDEyLCAweDM3LCAweGVlLAotCTB4ZjYsIDB4ZTMsIDB4ZWUsIDB4NzEsIDB4MGYsIDB4MWEsIDB4ZmEsIDB4YWMsIDB4YzUsIDB4ODcsIDB4Y2QsIDB4ZjgsCi0JMHg0YSwgMHgwZCwgMHgwNiwgMHg1YSwgMHhjNywgMHhiZCwgMHhmOCwgMHhkYiwgMHgzZSwgMHhkZCwgMHg3NywgMHgzMywKLQkweDczLCAweGZlLCAweDExLCAweDMzLCAweDg4LCAweGJmLCAweDFmLCAweGY3LCAweGUxLCAweGY2LCAweGJlLCAweDEzLAotCTB4OTIsIDB4NDcsIDB4MmUsIDB4NzEsIDB4MzIsIDB4ZjYsIDB4M2MsIDB4MzQsIDB4M2UsIDB4MTMsIDB4MmIsIDB4ZmIsCi0JMHhmNCwgMHhmMywgMHgxMywgMHhlNCwgMHg3NiwgMHg5ZCwgMHgwNywgMHg0ZCwgMHgzYywgMHgzMCwgMHhhZSwgMHhhMiwKLQkweDg1LCAweGVkLCAweDdjLCAweGJlLCAweDZmLCAweDE2LCAweDNhLCAweDBlLCAweGQ2LCAweDUzLCAweDg2LCAweDg1LAotCTB4NTgsIDB4M2UsIDB4ZTAsIDB4ODQsIDB4NDksIDB4MTYsIDB4OGYsIDB4MmYsIDB4MDAsIDB4Y2QsIDB4MDMsIDB4MTMsCi0JMHhjYywgMHhlMywgMHgxZSwgMHhjNiwgMHg4ZSwgMHg1ZSwgMHgxMywgMHhmNywgMHg4ZSwgMHhjYiwgMHhmOSwgMHgxMSwKLQkweGZiLCAweDVkLCAweGQ4LCAweGY3LCAweGY3LCAweDJkLCAweGM0LCAweDY3LCAweDA3LCAweDU0LCAweGUyLCAweDQwLAotCTB4MjEsIDB4ODYsIDB4NTYsIDB4MmEsIDB4ZjgsIDB4NWIsIDB4NWUsIDB4ZGYsIDB4OTYsIDB4OTQsIDB4YmQsIDB4Y2MsCi0JMHg0MCwgMHg2OCwgMHg2NywgMHhlMCwgMHg1MCwgMHgwNSwgMHgzOSwgMHhjMywgMHhhMiwgMHg3ZCwgMHhkOSwgMHhlYiwKLQkweDhmLCAweDEyLCAweGU3LCAweDhiLCAweDg4LCAweGYzLCAweDI1LCAweGU0LCAweGIwLCAweDM3LCAweDBjLCAweDFmLAotCTB4YzEsIDB4MjMsIDB4YzQsIDB4ZTUsIDB4YTMsIDB4MDMsIDB4OWQsIDB4OGMsIDB4M2IsIDB4YTUsIDB4NzgsIDB4OTIsCi0JMHg3MSwgMHhhMCwgMHg4ZiwgMHhlNywgMHhhNywgMHg3NiwgMHgxYSwgMHgxZCwgMHg0NSwgMHhjNCwgMHhlOSwgMHg1NywKLQkweDg5LCAweGJmLCAweDNkLCAweGM0LCAweDhjLCAweGZiLCAweGZhLCAweDE4LCAweGVlLCAweDc3LCAweDMyLCAweDA3LAotCTB4YjgsIDB4MmEsIDB4M2EsIDB4ZGYsIDB4YzMsIDB4MWMsIDB4ZWIsIDB4NjYsIDB4MjUsIDB4ZTAsIDB4N2IsIDB4MGIsCi0JMHhhNSwgMHg3MCwgMHhlYywgMHhhYiwgMHg0NCwgMHhjMywgMHg2ZSwgMHgyOSwgMHgyMywgMHhmOCwgMHhhNSwgMHg0MiwKLQkweDNkLCAweGUwLCAweGE0LCAweGNlLCAweDhmLCAweGMxLCAweGVhLCAweDc3LCAweDcwLCAweGJjLCAweDM1LCAweDI2LAotCTB4MTksIDB4MzgsIDB4ZGUsIDB4MzAsIDB4NzUsIDB4ZWQsIDB4YmIsIDB4YzQsIDB4ZGEsIDB4MGYsIDB4ODksIDB4YTksCi0JMHhmZSwgMHhlOSwgMHhmNSwgMHg2OCwgMHgzNCwgMHg0YywgMHgxZSwgMHhjNywgMHg3MCwgMHhiYSwgMHhkZiwgMHgzMCwKLQkweDY1LCAweDlmLCAweGRjLCAweDliLCAweGU0LCAweDc5LCAweDkzLCAweGQzLCAweDE5LCAweDMzLCAweDBkLCAweGYxLAotCTB4YzMsIDB4MTEsIDB4OGUsIDB4NDcsIDB4OTUsIDB4YmMsIDB4MDQsIDB4OGUsIDB4MzEsIDB4ZTAsIDB4OWQsIDB4N2QsCi0JMHg4YiwgMHgzOSwgMHgyZSwgMHg4OSwgMHhhNSwgMHgxMiwgMHhlZiwgMHg0NiwgMHgyOCwgMHhlYiwgMHg2MiwgMHhhYywKLQkweGEwLCAweDNlLCAweDFhLCAweGZiLCAweDU0LCAweGE0LCAweDBlLCAweDQ2LCAweDcwLCAweGVmLCAweDllLCAweDZjLAotCTB4MWMsIDB4NmUsIDB4MGYsIDB4YzUsIDB4NmYsIDB4NjMsIDB4MWMsIDB4MGUsIDB4MTcsIDB4MzMsIDB4MGUsIDB4YmIsCi0JMHgyMiwgMHgyMiwgMHg5YiwgMHgxMywgMHhjMywgMHg4YywgMHhkYiwgMHg1YiwgMHg5MiwgMHg2MSwgMHgzNCwgMHg3MSwKLQkweDBlLCAweDI3LCAweDUyLCAweGVjLCAweGI3LCAweDZmLCAweDI2LCAweDllLCAweDQ5LCAweDc5LCAweDE4LCAweGIzLAotCTB4MzQsIDB4MWUsIDB4NDQsIDB4YjUsIDB4OTEsIDB4NjksIDB4M2MsIDB4ZmMsIDB4M2MsIDB4ZTYsIDB4ZjAsIDB4MzAsCi0JMHhlYywgMHg2YiwgMHg2ZCwgMHg3ZCwgMHgwYSwgMHhlMiwgMHhjZCwgMHhkOSwgMHhlNywgMHg2NSwgMHhjZiwgMHhhNCwKLQkweDA0LCAweDliLCAweDY1LCAweDJkLCAweGYzLCAweGRlLCAweDcyLCAweGQ5LCAweGZiLCAweGQ5LCAweDlmLCAweGZjLAotCTB4M2UsIDB4Y2EsIDB4ODksIDB4NGYsIDB4NjUsIDB4MzksIDB4MWMsIDB4ZmEsIDB4NzksIDB4NDgsIDB4NzAsIDB4YjcsCi0JMHg4NiwgMHhiOCwgMHgyYiwgMHhmYiwgMHg3MywgMHgyYywgMHg2YiwgMHg1NSwgMHg2MCwgMHgyYSwgMHgxZSwgMHhmZCwKLQkweGVmLCAweDhmLCAweGEzLCAweGY2LCAweDdlLCAweDU2LCAweGMxLCAweDI0LCAweGUyLCAweDVmLCAweDkyLCAweGY4LAotCTB4YzcsIDB4MzEsIDB4NzQsIDB4NWQsIDB4NGYsIDB4MGMsIDB4YTQsIDB4NGMsIDB4ZmYsIDB4OTgsIDB4MjQsIDB4MDYsCi0JMHgxMiwgMHhhNywgMHg4ZiwgMHgxMCwgMHhhNywgMHg5ZiwgMHgyMiwgMHg0ZSwgMHg3ZiwgMHg5MywgMHgzOCwgMHhmZCwKLQkweDI0LCAweDMxLCAweDIxLCAweGJiLCAweGE2LCAweGQ3LCAweDI0LCAweGNmLCAweDJmLCAweDM4LCAweDFmLCAweGVmLAotCTB4ZDksIDB4NmIsIDB4OGIsIDB4ZDUsIDB4ZDQsIDB4ZDUsIDB4YWMsIDB4MDEsIDB4NzksIDB4ZTcsIDB4NDcsIDB4M2YsCi0JMHgyNCwgMHg3NiwgMHhmZiwgMHgxMywgMHhjZSwgMHg5MywgMHhiZiwgMHgyYSwgMHhiYiwgMHhlZiwgMHhhYSwgMHhiMSwKLQkweGFmLCAweDFiLCAweGVlLCAweGJlLCAweDVhLCAweGFkLCAweDA3LCAweGY2LCAweGI3LCAweDAyLCAweDRjLCAweGUxLAotCTB4YTIsIDB4MDUsIDB4N2QsIDB4NmQsIDB4NzAsIDB4ZjQsIDB4ZDUsIDB4MWUsIDB4M2EsIDB4MjksIDB4Y2YsIDB4NDMsCi0JMHhhNywgMHg0OSwgMHg1ZSwgMHhkZiwgMHgyNiwgMHg3YiwgMHhiZCwgMHgwZiwgMHhjOSwgMHg3ZSwgMHhhZCwgMHg2NSwKLQkweGJjLCAweGU3LCAweGVhLCAweGFiLCAweDM1LCAweGRmLCAweDgyLCAweDhkLCAweDZkLCAweGZlLCAweDQ5LCAweGZiLAotCTB4NWUsIDB4Y2QsIDB4ZmIsIDB4OGYsIDB4NTAsIDB4NWYsIDB4MTksIDB4YjYsIDB4OTksIDB4NGEsIDB4Y2EsIDB4N2UsCi0JMHhkNCwgMHg5OSwgMHg3OCwgMHgyMiwgMHgyZCwgMHhiZiwgMHg2YiwgMHg1YiwgMHgxMiwgMHhlYSwgMHhlMywgMHg4OCwKLQkweDU1LCAweDBiLCAweDFmLCAweDBmLCAweGUzLCAweGQ2LCAweDNlLCAweDBmLCAweGVkLCAweDIwLCAweDhlLCAweDMyLAotCTB4ZmEsIDB4ZDYsIDB4ZmQsIDB4ZTMsIDB4ZjUsIDB4ZjQsIDB4YjUsIDB4YzcsIDB4MmMsIDB4MmQsIDB4MTIsIDB4NjgsCi0JMHgxOSwgMHgyNywgMHhlNywgMHg1OSwgMHgzZiwgMHhiZSwgMHgxOCwgMHg0YiwgMHgwNywgMHgyYywgMHhjYiwgMHg3MywKLQkweDhkLCAweDExLCAweGRlLCAweGEwLCAweGY4LCAweGUxLCAweGEyLCAweDBmLCAweDNhLCAweGU4LCAweDU3LCAweDZiLAotCTB4ZjcsIDB4MDcsIDB4YjQsIDB4YjcsIDB4ODgsIDB4YTcsIDB4ZWIsIDB4ZWEsIDB4MGYsIDB4ZDMsIDB4M2UsIDB4OGMsCi0JMHhmMywgMHg0ZCwgMHhjNCwgMHg1MiwgMHg2NywgMHgyNCwgMHhjMCwgMHgzYywgMHhkMSwgMHg0MywgMHhkYiwgMHhmNywKLQkweGUyLCAweDdjLCAweDQyLCAweGZjLCAweDRiLCAweGVmLCAweGY4LCAweDJlLCAweDczLCAweDkzLCAweDBlLCAweGZhLAotCTB4YzYsIDB4MDcsIDB4ODksIDB4ZWIsIDB4ZTksIDB4NGIsIDB4NjEsIDB4MWUsIDB4MzMsIDB4ZTksIDB4MGIsIDB4NmUsCi0JMHhiYywgMHg5MywgMHgzMCwgMHhlOCwgMHg3NywgMHgxZSwgMHhiYywgMHg5YiwgMHhhOCwgMHg2MywgMHg5ZiwgMHg0MSwKLQkweDk2LCAweGY1LCAweDYzLCAweGEzLCAweGZkLCAweGRlLCAweDc1LCAweDRkLCAweGZjLCAweDViLCAweDRhLCAweDRkLAotCTB4ZmYsIDB4MmMsIDB4YjUsIDB4MDIsIDB4ZDEsIDB4NGEsIDB4MGQsIDB4N2YsIDB4MzcsIDB4ZmUsIDB4MzcsIDB4ZjgsCi0JMHgxOSwgMHhlMywgMHhmNiwgMHg5YSwgMHgzZSwgMHg3MCwgMHgwZSwgMHgxMSwgMHgyMiwgMHgwZiwgMHg5YywgMHgzOCwKLQkweDI4LCAweGNmLCAweGU5LCAweDUwLCAweDFiLCAweDlkLCAweGViLCAweGQwLCAweDk5LCAweGRiLCAweGVhLCAweDk5LAotCTB4NzMsIDB4MGUsIDB4MjcsIDB4ZmIsIDB4MjQsIDB4MmIsIDB4NjYsIDB4ZDksIDB4MGYsIDB4ZmEsIDB4OGIsIDB4ZjEsCi0JMHhjMCwgMHhmZSwgMHhjMywgMHhmNCwgMHg5MSwgMHgwMiwgMHgyYywgMHg3OCwgMHhjNCwgMHg4ZCwgMHhiZiwgMHgzYiwKLQkweDM4LCAweDIyLCAweDZiLCAweDRiLCAweDgyLCAweDk5LCAweGZlLCAweDIxLCAweDEyLCAweDg1LCAweDMwLCAweGI5LAotCTB4ZGUsIDB4ZmQsIDB4N2IsIDB4NDYsIDB4MzAsIDB4OTAsIDB4ZTMsIDB4NzksIDB4MWYsIDB4ODQsIDB4ZTIsIDB4NWYsCi0JMHg1MSwgMHg3MSwgMHg5OCwgMHgzYywgMHgyMiwgMHgxMCwgMHhiZiwgMHg5YSwgMHgzNiwgMHgyNiwgMHhlZiwgMHhiOCwKLQkweDQ5LCAweGVjLCAweDVmLCAweDQxLCAweDFiLCAweGViLCAweGU2LCAweDdjLCAweDdlLCAweDgzLCAweGUzLCAweGQ4LAotCTB4NDEsIDB4MWIsIDB4MWIsIDB4NGQsIDB4Y2MsIDB4YzQsIDB4NTYsIDB4ZGEsIDB4NTgsIDB4OWMsIDB4MzYsIDB4MTYsCi0JMHhhNywgMHgzZCwgMHhjNSwgMHg2OSwgMHg2MywgMHhmMiwgMHg2ZSwgMHg3ZSwgMHg5YywgMHgzNiwgMHgxNiwgMHhhNywKLQkweDhkLCAweGM1LCAweDUzLCAweDhiLCAweGYxLCAweDE0LCAweDk5LCAweGM2LCAweGFlLCAweDkxLCAweDQ1LCAweGM0LAotCTB4MzEsIDB4NzksIDB4YjYsIDB4YzYsIDB4NzksIDB4YjgsIDB4ZWQsIDB4NmYsIDB4YzgsIDB4ZDksIDB4NmYsIDB4ZTAsCi0JMHhhMSwgMHhlMCwgMHg0ZSwgMHhmYSwgMHhlNCwgMHg2MywgMHg0MywgMHhjNCwgMHgzYiwgMHhkYSwgMHhjMSwgMHhhMiwKLQkweGI0LCAweDcwLCAweGZjLCAweDdhLCAweGU2LCAweGIxLCAweGM3LCAweGM4LCAweGYzLCAweDU1LCAweDNjLCAweDZiLAotCTB4NGEsIDB4MWUsIDB4NmMsIDB4ZjIsIDB4OWMsIDB4YjEsIDB4MjYsIDB4MjksIDB4MWMsIDB4ZWMsIDB4MTgsIDB4MzYsCi0JMHhmNCwgMHgwMywgMHgzNywgMHg5MSwgMHgxNywgMHg1NiwgMHg5MiwgMHg5NywgMHg4YywgMHgyYywgMHgwMCwgMHg1ZSwKLQkweDFjLCAweDEyLCAweDE5LCAweGM1LCAweGM3LCAweGIzLCAweGZiLCAweDRmLCAweDhmLCAweGY3LCAweGQ3LCAweDQ0LAotCTB4MWIsIDB4NjUsIDB4N2QsIDB4ODgsIDB4OWMsIDB4NjQsIDB4ZjEsIDB4YjAsIDB4NzAsIDB4YmMsIDB4YzMsIDB4ZTQsCi0JMHg0OCwgMHg3YSwgMHhmOCwgMHhkZiwgMHgyMSwgMHgxYywgMHhhZiwgMHgxMiwgMHg2NSwgMHg3YiwgMHhmNCwgMHhmMCwKLQkweDNiLCAweDMwLCAweGQ2LCAweGZkLCAweDUyLCAweGIxLCAweDE2LCAweGJmLCAweDE2LCAweDBhLCAweGM0LCAweDlmLAotCTB4NTQsIDB4NTQsIDB4MzQsIDB4OTMsIDB4ZWYsIDB4ZGQsIDB4YmMsIDB4ZDMsIDB4ODksIDB4OWUsIDB4ZDAsIDB4NjIsCi0JMHg3YywgMHg4NSwgMHg5YywgMHg2ZiwgMHhmNSwgMHgzNSwgMHgyYSwgMHg5NiwgMHhlYywgMHhhMywgMHgyZCwgMHg1NSwKLQkweDBhLCAweGM3LCAweGQyLCAweGMzLCAweGU3LCAweDMwLCAweDYxLCAweGFmLCAweDEzLCAweDhlLCAweGE2LCAweDhlLAotCTB4NWIsIDB4NTUsIDB4ODYsIDB4NjAsIDB4MTEsIDB4YjEsIDB4ZWQsIDB4ZWEsIDB4MzcsIDB4MmQsIDB4YjcsIDB4YWMsCi0JMHgzNSwgMHg5MSwgMHgwMywgMHgwZSwgMHhmNywgMHg0NywgMHg1ZiwgMHg3MCwgMHgxMiwgMHhmNywgMHhkNywgMHg5MywKLQkweDA3LCAweDNlLCAweDkxLCAweGUzLCAweDgxLCAweDA3LCAweGZiLCAweDBkLCAweGVkLCAweDA3LCAweGM0LCAweDhiLAotCTB4ZmQsIDB4M2MsIDB4ZGYsIDB4Y2EsIDB4NzMsIDB4YWIsIDB4ZGYsIDB4ZTAsIDB4N2MsIDB4MDQsIDB4OWEsIDB4NjYsCi0JMHg5MCwgMHgxYiwgMHhiZSwgMHg0MywgMHg5OSwgMHg3YiwgMHgyOSwgMHg3MywgMHg4MiwgMHhmNiwgMHg5ZiwgMHhlZSwKLQkweGQ1LCAweDkwLCAweDFjLCAweDMzLCAweDMwLCAweGRlLCAweGViLCAweDQ1LCAweGRmLCAweDU4LCAweDEwLCAweDRmLAotCTB4ZjYsIDB4ZmEsIDB4YjAsIDB4OTMsIDB4ZmMsIDB4ZjAsIDB4NzAsIDB4YWYsIDB4ZjgsIDB4ZTIsIDB4NGMsIDB4ZjQsCi0JMHg4ZiwgMHhjZCwgMHhjNCwgMHgzNywgMHg5MiwgMHhiMiwgMHgzZSwgMHhmNSwgMHgyZSwgMHg1NiwgMHg1NywgMHg4OCwKLQkweDdlLCAweGM0LCAweDJmLCAweGM5LCAweGFmLCAweDkzLCAweDdhLCAweDRmLCAweDhjLCAweDYzLCAweDhhLCAweDc5LAotCTB4ZjUsIDB4NDMsIDB4MzEsIDB4ZTgsIDB4NDMsIDB4OWMsIDB4YzEsIDB4OGYsIDB4ODcsIDB4YmUsIDB4MjAsIDB4MzEsCi0JMHg1MiwgMHg3YywgMHg1MiwgMHhjMywgMHgxMywgMHhlNCwgMHgzYywgMHhhNSwgMHhjNCwgMHhkNSwgMHg5MiwgMHg0OCwKLQkweDRkLCAweGY0LCAweDBiLCAweDhhLCAweDFlLCAweDdiLCAweDQ1LCAweGI1LCAweGFjLCAweDRhLCAweDg5LCAweGUxLAotCTB4MDcsIDB4MzUsIDB4ZjIsIDB4MGYsIDB4MTMsIDB4MzcsIDB4ZGIsIDB4MzEsIDB4NWIsIDB4YzMsIDB4ZjQsIDB4ZGQsCi0JMHg5NSwgMHhhOCwgMHhkYSwgMHhkZCwgMHg4NywgMHhmZiwgMHg1NiwgMHgxOSwgMHhmZiwgMHg2MCwgMHgxYSwgMHg2MywKLQkweGZkLCAweDM0LCAweDYyLCAweGZiLCAweGVjLCAweGJlLCAweDkzLCAweGQzLCAweDY3LCAweDkxLCAweDMzLCAweGJmLAotCTB4YTEsIDB4ZDYsIDB4NjYsIDB4YmUsIDB4MGIsIDB4ZmQsIDB4ZDAsIDB4NjksIDB4ODcsIDB4M2UsIDB4NzEsIDB4OTQsCi0JMHhmMSwgMHhjMSwgMHg0NSwgMHhmYiwgMHg5YywgMHgzMSwgMHhhZSwgMHhkMSwgMHg3ZiwgMHg2YiwgMHg4ZiwgMHg1NiwKLQkweGMxLCAweDg4LCAweDVmLCAweGFiLCAweDNhLCAweDJkLCAweDU0LCAweDhhLCAweDNjLCAweGExLCAweGYyLCAweDZjLAotCTB4NmUsIDB4MTQsIDB4MjYsIDB4ZjYsIDB4NGIsIDB4NmMsIDB4NzAsIDB4NDAsIDB4MjMsIDB4MGUsIDB4ZmYsIDB4M2QsCi0JMHg3ZCwgMHhlNiwgMHg0ZSwgMHgzYiwgMHgxZSwgMHgxZCwgMHhiNiwgMHg5ZiwgMHg4NSwgMHg3NiwgMHg4ZSwgMHhjNywKLQkweGU5LCAweDI3LCAweDhiLCAweGQxLCAweGQxLCAweGVmLCAweDQxLCAweGJiLCAweDFkLCAweDhiLCAweDFlLCAweGIzLAotCTB4MmEsIDB4ZTgsIDB4MzMsIDB4MWQsIDB4ZmIsIDB4MDMsIDB4NGQsIDB4MzcsIDB4ZDIsIDB4NjcsIDB4YWUsIDB4YmIsCi0JMHg0NiwgMHhlMiwgMHhkOCwgMHg2MSwgMHhmMiwgMHg1ZiwgMHhjMywgMHhiYywgMHg4ZSwgMHhmOCwgMHhiMiwgMHhiNSwKLQkweGRlLCAweGU4LCAweDc4LCAweDllLCAweDMyLCAweGRkLCAweDRmLCAweGZiLCAweDdmLCAweDk3LCAweDNjLCAweGU3LAotCTB4ZGMsIDB4OWUsIDB4NDMsIDB4ZDQsIDB4OTksIDB4NjYsIDB4ZmIsIDB4YzMsIDB4Y2YsIDB4OTIsIDB4M2UsIDB4ZGIsCi0JMHgzNywgMHg2MiwgMHhmYywgMHgyZCwgMHg3MSwgMHgyZiwgMHg0NiwgMHg1ZiwgMHhmYSwgMHgzNywgMHhjNiwgMHhlYywKLQkweGUyLCAweDUwLCAweGZjLCAweGY2LCAweDYyLCAweDA0LCAweDcxLCAweDFmLCAweDY1LCAweGZkLCAweDM4LCAweGE5LAotCTB4ZjcsIDB4NmYsIDB4OTAsIDB4NzcsIDB4OGYsIDB4NDMsIDB4MjYsIDB4NjUsIDB4ZjEsIDB4ZTAsIDB4ODMsIDB4YTQsCi0JMHhkOCwgMHhkOSwgMHg4OSwgMHhmZiwgMHg1OSwgMHg4OSwgMHhmOCwgMHgyNiwgMHhjNiwgMHhlMCwgMHhhMCwgMHhlNiwKLQkweDkwLCAweGI1LCAweGYwLCAweDk5LCAweDU4LCAweDczLCAweGYwLCAweDFhLCAweGNhLCAweDVjLCAweDQ3LCAweGZmLAotCTB4MDMsIDB4ZTYsIDB4MGMsIDB4NDcsIDB4NzAsIDB4Y2YsIDB4MWUsIDB4YzksIDB4MzEsIDB4ZDAsIDB4MjAsIDB4YjksCi0JMHhkYSwgMHhiYywgMHg1MCwgMHhjMCwgMHgzYywgMHg0MywgMHhhYywgMHg1OCwgMHgzYiwgMHg3NiwgMHg5OCwgMHg3MSwKLQkweDQyLCAweGQ2LCAweDk2LCAweDkxLCAweGYxLCAweDE5LCAweDYxLCAweGJjLCAweGRhLCAweDViLCAweDZmLCAweGJmLAotCTB4ZDMsIDB4NzAsIDB4ZmYsIDB4NTgsIDB4M2QsIDB4NWUsIDB4ZTksIDB4OWQsIDB4ODksIDB4ZmIsIDB4OTgsIDB4ZWIsCi0JMHhjNCwgMHg5OCwgMHhlYiwgMHhjNCwgMHhjNiwgMHhiYywgMHg4OCwgMHgxZCwgMHg5OCwgMHhjNiwgMHg4MywgMHhiMiwKLQkweDFkLCAweDk4LCAweGMzLCAweDgzLCAweGIyLCAweDhkLCAweGE5LCAweGY4LCAweDJhLCAweGYzLCAweDk3LCAweDBkLAotCTB4YzQsIDB4ZjMsIDB4MWUsIDB4ZGEsIDB4ZTMsIDB4ZmYsIDB4ZTAsIDB4ZGMsIDB4MGYsIDB4ZDAsIDB4ZGUsIDB4YWIsCi0JMHg4OSwgMHhmNywgMHg2ZiwgMHhlZSwgMHgwMiwgMHhlZSwgMHhiNCwgMHhmNSwgMHg3MywgMHg4NCwgMHg3YSwgMHg1NCwKLQkweGYwLCAweDE1LCAweGZhLCAweDQ0LCAweDE1LCAweDYzLCAweDUyLCAweDM3LCAweGU3LCAweDdjLCAweGU3LCAweGEwLAotCTB4MTEsIDB4MGMsIDB4YWIsIDB4MDEsIDB4ZWQsIDB4MDksIDB4Y2UsIDB4NzMsIDB4ZDcsIDB4ODgsIDB4OGEsIDB4NDcsCi0JMHhmYiwgMHgxNywgMHg2MywgMHgzZSwgMHg2MywgMHhjYSwgMHhiNiwgMHhhMSwgMHgwOSwgMHhiYiwgMHg3YywgMHgzNywKLQkweGZkLCAweGUxLCAweDZlLCAweGZhLCAweGM5LCAweDdiLCAweGY0LCAweDkzLCAweGM5LCAweDk1LCAweGYyLCAweDNlLAotCTB4YTksIDB4OTMsIDB4MzksIDB4ZmYsIDB4YzMsIDB4NTgsIDB4OTMsIDB4OTAsIDB4NzgsIDB4YTcsIDB4ZjcsIDB4MGMsCi0JMHhhOSwgMHhjYywgMHhiNSwgMHg2OCwgMHg5ZiwgMHg1ZCwgMHhjYywgMHg1MSwgMHg2ZSwgMHhhNywgMHg2ZCwgMHgzZSwKLQkweDNhLCAweDI0LCAweDNlLCAweDI0LCAweDM5LCAweDhiLCAweDExLCAweGRlLCAweDQ2LCAweGRiLCAweDdjLCAweDdlLAotCTB4NDgsIDB4ZmMsIDB4YTMsIDB4MTQsIDB4YjcsIDB4ZWUsIDB4OTQsIDB4ZmQsIDB4YTYsIDB4YTUsIDB4ZjgsIDB4ZWMsCi0JMHhiZSwgMHhjMywgMHg5NCwgMHhlZiwgMHgwOCwgMHg3NiwgMHhkMSwgMHgyZSwgMHg0YiwgMHg2OSwgMHg5NywgMHhmNywKLQkweDUxLCAweGFmLCAweDFlLCAweGRhLCAweGU1LCAweDA2LCAweGUyLCAweDUwLCAweDA5LCAweGVkLCAweGYyLCAweDVlLAotCTB4ZjIsIDB4ODEsIDB4Y2EsIDB4OWMsIDB4NWQsIDB4ZmUsIDB4ZGQsIDB4ZjgsIDB4YzIsIDB4OGEsIDB4NmMsIDB4OGMsCi0JMHhmMCwgMHg0MiwgMHhkZCwgMHgyZCwgMHhlZiwgMHhmNywgMHg1OSwgMHhkNiwgMHhlZCwgMHg2NiwgMHhhNiwgMHg2OSwKLQkweDA2LCAweDc0LCAweGI2LCAweDFkLCAweGMxLCAweGIyLCAweGI0LCAweDEzLCAweGU1LCAweDdkLCAweDExLCAweDJjLAotCTB4NGQsIDB4ZDYsIDB4YjQsIDB4OWYsIDB4NTUsIDB4MjIsIDB4YzgsIDB4Y2MsIDB4YzgsIDB4ZjIsIDB4NDAsIDB4NTcsCi0JMHg5ZiwgMHg3YywgMHhkZiwgMHg0MywgMHgyMywgMHgwNywgMHhlMSwgMHhmOCwgMHhhZiwgMHhjZCwgMHg3ZSwgMHg1MywKLQkweGU0LCAweGYzLCAweDdmLCAweDAxLCAweDdmLCAweDVjLCAweDQyLCAweDk5LCAweDNhLCAweGNkLCAweDhmLCAweGFjLAotCTB4YzksIDB4ZWMsIDB4ZjcsIDB4MDcsIDB4OWMsIDB4YjcsIDB4ZjEsIDB4N2MsIDB4MTYsIDB4ZGIsIDB4YTgsIDB4MWEsCi0JMHg3NywgMHgzYSwgMHhiZiwgMHg5OCwgMHhmNCwgMHg2MCwgMHhmYSwgMHhiOCwgMHg4OSwgMHhiZiwgMHhjZCwgMHhiNiwKLQkweGUzLCAweDJlLCAweDg4LCAweDM0LCAweGUyLCAweGI5LCAweDg0LCAweDgyLCAweDY5LCAweGM2LCAweGQzLCAweGY4LAotCTB4OTEsIDB4YmQsIDB4MmUsIDB4NTAsIDB4ODksIDB4ZjIsIDB4ZGQsIDB4ZjYsIDB4OWEsIDB4MDIsIDB4MGUsIDB4MjQsCi0JMHhmNCwgMHhmNiwgMHgzNCwgMHhjZiwgMHhjYiwgMHgwZSwgMHg3YSwgMHg1MSwgMHhiYywgMHg1YiwgMHhjMSwgMHgyZCwKLQkweDAxLCAweDJmLCAweDRhLCAweGY5LCAweGRiLCAweDQzLCAweGJlLCAweGQ5LCAweDFkLCAweDVhLCAweDZlLCAweDZkLAotCTB4NTksIDB4MjUsIDB4ZjYsIDB4ZWQsIDB4MDUsIDB4MGUsIDB4OTYsIDB4OTQsIDB4MGIsIDB4MGUsIDB4MWUsIDB4MzAsCi0JMHg2NSwgMHhlZCwgMHhkMiwgMHg0MCwgMHg3NywgMHhhMiwgMHgxMiwgMHg4NSwgMHhiYiwgMHg2YiwgMHg5YSwgMHgxYSwKLQkweDUxLCAweDYzLCAweGJlLCAweGMzLCAweGZhLCAweDA1LCAweDA3LCAweDNmLCAweDViLCAweDIxLCAweGViLCAweGY2LAotCTB4NGYsIDB4NDksIDB4OGMsIDB4MWIsIDB4OTIsIDB4NzksIDB4Y2QsIDB4YzYsIDB4NTAsIDB4ZTcsIDB4ZDgsIDB4NWIsCi0JMHg5YSwgMHhlOCwgMHg2NSwgMHgxMywgMHgzOSwgMHg4YSwgMHhkYSwgMHhmNywgMHhhNiwgMHg1ZCwgMHhjNiwgMHgxNywKLQkweDM5LCAweDRhLCAweDBjLCAweDkwLCAweGY4LCAweDcyLCAweDBhLCAweGVkLCAweGZkLCAweGE3LCAweDY4LCAweGZmLAotCTB4YjIsIDB4OGUsIDB4YzEsIDB4YmMsIDB4NzcsIDB4ODEsIDB4ODUsIDB4ZTIsIDB4ODUsIDB4OTksIDB4NjAsIDB4MzEsCi0JMHhhMiwgMHgxNSwgMHgxNSwgMHhjNCwgMHg2ZiwgMHhmYSwgMHgwMCwgMHg1ZSwgMHgzMCwgMHhmNSwgMHg5NiwgMHg4NywKLQkweDFjLCAweGQxLCAweDg3LCAweDhhLCAweGEwLCAweGFmLCAweDdiLCAweDViLCAweGU5LCAweGMxLCAweGM2LCAweGMwLAotCTB4MDgsIDB4ZmEsIDB4YzgsIDB4MDUsIDB4ZjMsIDB4ZjksIDB4ZjgsIDB4YmEsIDB4M2QsIDB4OGMsIDB4NmYsIDB4OGUsCi0JMHg4YiwgMHhmOSwgMHhiOCwgMHgxNiwgMHg4YSwgMHhmZiwgMHg4ZSwgMHgzYywgMHhjMCwgMHgzZiwgMHg5YiwgMHgxOCwKLQkweGVkLCAweGIwLCAweDdkLCAweDI3LCAweDkwLCAweGQ5LCAweDQ0LCAweDdiLCAweDBkLCAweDhmLCAweDg3LCAweGU5LAotCTB4MjMsIDB4MjMsIDB4ODIsIDB4N2QsIDB4ZjIsIDB4MzUsIDB4YTMsIDB4MTcsIDB4MGEsIDB4OTgsIDB4M2YsIDB4MTYsCi0JMHgzMywgMHgwZiwgMHgzOSwgMHg5ZCwgMHhiNCwgMHgzYSwgMHhkZCwgMHhiNCwgMHg2YiwgMHhlNywgMHhhMiwgMHg5OSwKLQkweDUwLCAweGQzLCAweDM3LCAweGUwLCAweDlkLCAweDVkLCAweDMzLCAweDUxLCAweDQ4LCAweDVmLCAweGFhLCAweDQ4LAotCTB4Y2EsIDB4MGIsIDB4NTUsIDB4ZWEsIDB4YTcsIDB4ZDksIDB4NmYsIDB4ZWMsIDB4M2QsIDB4MDQsIDB4ZGEsIDB4MDMsCi0JMHg4ZSwgMHhkYSwgMHg3NSwgMHg0OSwgMHg0NSwgMHgyNywgMHhmNiwgMHhlYiwgMHgyZCwgMHhhNSwgMHhlYSwgMHg0YywKLQkweDc4LCAweDk4LCAweGFmLCAweDk0LCAweGE0LCAweDNkLCAweDAwLCAweGI5LCAweDMyLCAweDU4LCAweGVmLCAweGE3LAotCTB4YmIsIDB4NWMsIDB4MjgsIDB4MzcsIDB4OGMsIDB4ZTgsIDB4MzMsIDB4Y2MsIDB4ODEsIDB4MWMsIDB4YTMsIDB4NGUsCi0JMHhmYywgMHhjYywgMHg5NiwgMHg2YiwgMHgxYSwgMHg4YSwgMHg0NywgMHg2ZiwgMHhjMCwgMHhlOSwgMHg1ZCwgMHg3ZSwKLQkweGE4LCAweGJjLCAweDc2LCAweDc2LCAweGNmLCAweDFjLCAweDE0LCAweDhjLCAweDEyLCAweDA4LCAweGQyLCAweDhiLAotCTB4ZjEsIDB4ZDYsIDB4MmUsIDB4MTUsIDB4YWUsIDB4ZDEsIDB4YmYsIDB4YzEsIDB4ODcsIDB4YmIsIDB4MTQsIDB4Y2MsCi0JMHg5ZiwgMHhhNywgMHhhMCwgMHg2OCwgMHg3OCwgMHg4NCwgMHgzYSwgMHgxMSwgMHhlZSwgMHg0NSwgMHgzZiwgMHg0ZCwKLQkweGMxLCAweGU2LCAweDVkLCAweDViLCAweDkyLCAweGMyLCAweGVkLCAweGM5LCAweGU5LCAweDA2LCAweDJiLCAweDYxLAotCTB4ZWUsIDB4N2UsIDB4ZDMsIDB4YWEsIDB4MzAsIDB4OGMsIDB4ZDgsIDB4MmQsIDB4YWEsIDB4YjUsIDB4YjgsIDB4NzIsCi0JMHg0MSwgMHhhMCwgMHg2NSwgMHg4MCwgMHgzOCwgMHhmZCwgMHgxMiwgMHg3ZCwgMHhlMCwgMHg2NCwgMHg3ZiwgMHhkYywKLQkweGYyLCAweDE4LCAweDhiLCAweDg5LCAweGI1LCAweDUxLCAweDM0LCAweDMwLCAweDM3LCAweDk3LCAweGJjLCAweDdiLAotCTB4OWIsIDB4OWQsIDB4ZWYsIDB4Y2EsIDB4N2UsIDB4NjMsIDB4MjcsIDB4ZmMsIDB4NjMsIDB4MGYsIDB4ZTMsIDB4NzgsCi0JMHhjMiwgMHg4ZCwgMHhjNSwgMHg2MywgMHhhNSwgMHhiOCwgMHg4ZSwgMHgzOSwgMHg3NSwgMHg5OCwgMHhkYywgMHgyMSwKLQkweGJjLCAweDJmLCAweGNiLCAweGYxLCAweDllLCAweDI3LCAweGM3LCAweGZiLCAweDE1LCAweGIyLCAweDFjLCAweDZmLAotCTB4ODAsIDB4YjksIDB4NWEsIDB4OTUsIDB4NTEsIDB4OGEsIDB4NWIsIDB4MDYsIDB4MGMsIDB4YzYsIDB4ODAsIDB4NTIsCi0JMHgzNCwgMHhkYiwgMHhlYiwgMHgwMSwgMHgxYSwgMHg2ZSwgMHhhMywgMHhmZiwgMHg3ZSwgMHg5ZSwgMHhmOSwgMHhmOCwKLQkweGNkLCAweDNiLCAweDAzLCAweGJlLCAweDFkLCAweDhhLCAweDhmLCAweDcxLCAweDQwLCAweGRhLCAweDNmLCAweDRjLAotCTB4ZGMsIDB4ZjAsIDB4NjEsIDB4NGUsIDB4YWYsIDB4MTEsIDB4NWMsIDB4OGEsIDB4YzAsIDB4ZjksIDB4NDMsIDB4ZDQsCi0JMHhlNSwgMHhlMiwgMHhiMSwgMHgxYiwgMHgxMCwgMHhhNiwgMHhlZSwgMHhjMiwgMHhmYiwgMHgwZSwgMHhlNywgMHhjNiwKLQkweDMxLCAweDQxLCAweGQ5LCAweDlkLCAweDc4LCAweDZmLCAweDcwLCAweDE2LCAweDVlLCAweDNkLCAweDkwLCAweGNkLAotCTB4YzMsIDB4MDMsIDB4N2QsIDB4MTMsIDB4YjIsIDB4NWUsIDB4ZmMsIDB4MzUsIDB4ODYsIDB4ZDcsIDB4N2IsIDB4MjQsCi0JMHgwZiwgMHhmZiwgMHg0MSwgMHhiZiwgMHhkZSwgMHg1ZiwgMHgyYSwgMHhlYiwgMHg4NCwgMHhmNCwgMHhlNywgMHhhZiwKLQkweDJlLCAweDcwLCAweDMwLCAweGJlLCAweGU4LCAweGZlLCAweGVmLCAweDNiLCAweGUyLCAweGYyLCAweDFjLCAweGQ5LAotCTB4ZmYsIDB4MDgsIDB4ZWYsIDB4N2YsIDB4OWYsIDB4ZjEsIDB4ZmMsIDB4MzYsIDB4NWUsIDB4OGYsIDB4NTUsIDB4MzIsCi0JMHhkNywgMHg1ZSwgMHgxOCwgMHgzZiwgMHhlZiwgMHhlMiwgMHhmNSwgMHhjNywgMHgzOCwgMHg5NywgMHg2NSwgMHg0NiwKLQkweDRkLCAweGVjLCAweDE1LCAweGU1LCAweDA4LCAweDcxLCAweGMzLCAweDgxLCAweDFkLCAweDIxLCAweDNkLCAweGJhLAotCTB4YzMsIDB4Y2UsIDB4YTEsIDB4OWQsIDB4OTgsIDB4NDgsIDB4NWYsIDB4OWQsIDB4ZjMsIDB4YzEsIDB4NGEsIDB4OTQsCi0JMHhlYywgMHg5NiwgMHhmYywgMHhjNSwgMHg5MCwgMHhmNSwgMHg5ZiwgMHhmZSwgMHgxMiwgMHhlNiwgMHg0ZiwgMHg5NSwKLQkweDE3LCAweGVjLCAweDMzLCAweGJmLCAweGZmLCAweDA5LCAweGVlLCAweDhhLCAweDQ4LCAweDMzLCAweDQyLCAweDdkLAotCTB4ZjksIDB4N2QsIDB4NTAsIDB4ODcsIDB4ZDAsIDB4OWQsIDB4N2UsIDB4MTAsIDB4ZWQsIDB4YmIsIDB4ZjQsIDB4NzYsCi0JMHg1OSwgMHgxZiwgMHg3YSwgMHgyNSwgMHgxNCwgMHhiNywgMHhjYSwgMHg4ZCwgMHg0ZSwgMHhiOCwgMHgxNiwgMHgxOCwKLQkweGNkLCAweGNjLCAweDVkLCAweDYyLCAweGRmLCAweDU2LCAweDhhLCAweDE5LCAweDNiLCAweDhlLCAweDYxLCAweGYzLAotCTB4YjAsIDB4MWUsIDB4ZGMsIDB4YTEsIDB4MTgsIDB4Y2MsIDB4ZjcsIDB4MzQsIDB4MWMsIDB4MWEsIDB4MmMsIDB4YzAsCi0JMHhkZCwgMHg3YiwgMHg1YSwgMHgxOSwgMHhkYiwgMHg0YywgMHhlMiwgMHg2NiwgMHg4ZCwgMHhmZiwgMHgxYywgMHhkZSwKLQkweGM3LCAweDQ5LCAweDUzLCAweGRlLCAweDExLCAweDJhLCAweDQyLCAweGFiLCAweDI2LCAweDdiLCAweDgwLCAweDk4LAotCTB4NzksIDB4NGUsIDB4YmIsIDB4ZTQsIDB4M2QsIDB4NzEsIDB4NGYsIDB4OTEsIDB4OTEsIDB4N2YsIDB4ZGYsIDB4ZGYsCi0JMHg2MCwgMHhhZSwgMHgzOCwgMHg4OSwgMHhmZCwgMHg4MywgMHhiMiwgMHgyZSwgMHg1MCwgMHhhNSwgMHgxYywgMHhlZiwKLQkweDlmLCAweGViLCAweGViLCAweDIyLCAweGU2LCAweDNmLCAweDY0LCAweDY2LCAweDcwLCAweDdlLCAweDYxLCAweDI1LAotCTB4MzAsIDB4NWQsIDB4NDEsIDB4ZTgsIDB4ZDMsIDB4MDEsIDB4ZjksIDB4OWUsIDB4MGQsIDB4ZmYsIDB4ZGUsIDB4YjMsCi0JMHhmYywgMHg1ZiwgMHg5MCwgMHg3NiwgMHg0YSwgMHhjYiwgMHhiMiwgMHg2YiwgMHgwNSwgMHgzZiwgMHhhYSwgMHg5NCwKLQkweGY3LCAweDAxLCAweDhmLCAweDI3LCAweDJiLCAweGNhLCAweGIzLCAweGNmLCAweDljLCAweGZmLCAweDU0LCAweDFmLAotCTB4NmYsIDB4NTgsIDB4N2UsIDB4YmIsIDB4OGQsIDB4N2MsIDB4ZGQsIDB4ZDcsIDB4YWQsIDB4YTgsIDB4NTcsIDB4Y2EsCi0JMHgxNywgMHhiMCwgMHg2ZCwgMHhmMSwgMHhjYiwgMHgyYSwgMHg2NSwgMHgxZCwgMHg3MSwgMHg1NCwgMHgwZCwgMHg1NSwKLQkweDI5LCAweGFkLCAweDQzLCAweDk3LCAweGI3LCAweGZiLCAweDlhLCAweDE1LCAweDZkLCAweDk2LCAweGYzLCAweDdjLAotCTB4MzksIDB4OGIsIDB4ZjcsIDB4YTUsIDB4NmMsIDB4ZmUsIDB4ZmUsIDB4MGIsIDB4YjksIDB4YjYsIDB4MGEsIDB4YzksCi0JMHg1MywgMHhiMywgMHg2NSwgMHhlZSwgMHhlZSwgMHg5NywgMHhmZCwgMHg0YiwgMHg1MSwgMHg5YywgMHhhOCwgMHg5ZiwKLQkweGRhLCAweDVlLCAweGJlLCAweGVmLCAweGVmLCAweDVjLCAweGQyLCAweDVlLCAweGI2LCAweDZjLCAweDU1LCAweDE1LAotCTB4OGEsIDB4YTUsIDB4N2MsIDB4MDYsIDB4ZmYsIDB4OGYsIDB4YmQsIDB4ODYsIDB4NzAsIDB4YzYsIDB4ZGUsIDB4NzMsCi0JMHhiOCwgMHhjZCwgMHg2YywgMHg4OCwgMHgxNiwgMHhlMSwgMHgzMywgMHg1MCwgMHhhZiwgMHg4YSwgMHhjZiwgMHgyZiwKLQkweGIyLCAweGI5LCAweDZkLCAweGI0LCAweGI5LCAweDg4LCAweGY5LCAweGFkLCAweGRiLCAweDg4LCAweDNlLCAweGU0LAotCTB4NDYsIDB4MjYsIDB4ZTMsIDB4ODYsIDB4ZGUsIDB4NzIsIDB4NWUsIDB4MzksIDB4YTQsIDB4ZGMsIDB4MWQsIDB4ZDAsCi0JMHhkYiwgMHhkZiwgMHgyMywgMHhkNywgMHg3OCwgMHgzOSwgMHgxMCwgMHhiNywgMHg0YSwgMHgwZCwgMHhjMywgMHhkNywKLQkweGFiLCAweGU4LCAweGU2LCAweDFhLCAweGM2LCAweGIyLCAweDE3LCAweDk5LCAweDNmLCAweGI2LCAweDA1LCAweDdhLAotCTB4ZWMsIDB4ZTcsIDB4OGIsIDB4NGEsIDB4NjQsIDB4MDUsIDB4YWUsIDB4YjQsIDB4YmYsIDB4ZGQsIDB4ZDIsIDB4MGMsCi0JMHgyMywgMHhmNSwgMHhiMiwgMHhhYywgMHg3NywgMHhmMSwgMHg3NywgMHgwYywgMHhmMywgMHhlZCwgMHg2YiwgMHg2ZCwKLQkweDA4LCAweGRhLCAweGZmLCAweDU3LCAweGU1LCAweGJlLCAweGVmLCAweGQyLCAweDgyLCAweDFhLCAweGZiLCAweGZmLAotCTB4MWQsIDB4OTgsIDB4OWIsIDB4YmEsIDB4YjAsIDB4MmUsIDB4OGMsIDB4NGQsIDB4YTYsIDB4NjUsIDB4M2QsIDB4NjcsCi0JMHg1YSwgMHgzOCwgMHg3MywgMHg3MSwgMHhiZiwgMHhmMywgMHgwYSwgMHgwNywgMHhmMywgMHgwZCwgMHg1MiwgMHhhYywKLQkweDU4LCAweGY2LCAweGZiLCAweDU0LCAweDE3LCAweGRmLCAweDk3LCAweDU4LCAweDdhLCAweGM5LCAweDdlLCAweDY3LAotCTB4ZjksIDB4YWUsIDB4NDIsIDB4YTUsIDB4ZmQsIDB4ZmQsIDB4YjEsIDB4NzksIDB4OGIsIDB4OWMsIDB4NzgsIDB4MjksCi0JMHg1MSwgMHgxNiwgMHhmMywgMHhmMCwgMHhmNywgMHhlNiwgMHg0NSwgMHgwNSwgMHg1OCwgMHg0ZiwgMHg0ZSwgMHhkNiwKLQkweDc0LCAweGQ1LCAweDMzLCAweDM4LCAweDY3LCAweDdmLCAweGM3LCAweDIxLCAweDFlLCAweDkyLCAweGVmLCAweDM3LAotCTB4OWMsIDB4NDgsIDB4ZDAsIDB4YTcsIDB4MDcsIDB4YmIsIDB4NDMsIDB4ZmIsIDB4ZWQsIDB4YmUsIDB4NWYsIDB4YzcsCi0JMHhhNiwgMHg1MSwgMHg3OSwgMHhlNiwgMHhkNywgMHg4YywgMHhkNSwgMHg4OSwgMHg0OSwgMHhjNiwgMHgzNywgMHg2OSwKLQkweDRiLCAweGYyLCAweDZlLCAweDNkLCAweGQzLCAweGM2LCAweDVjLCAweDU1LCAweDc1LCAweDA0LCAweDcxLCAweDNiLAotCTB4ZTMsIDB4Y2EsIDB4MmIsIDB4MDksIDB4ZGEsIDB4ZTksIDB4NDIsIDB4YmQsIDB4ZTMsIDB4ZGIsIDB4ZTQsIDB4MDYsCi0JMHg2NSwgMHgxMSwgMHgzZCwgMHhmOCwgMHhhZSwgMHhkMiwgMHg4MiwgMHgzMSwgMHhkNiwgMHg5ZiwgMHg0OCwgMHg4OCwKLQkweDJkLCAweDU2LCAweGM2LCAweDBhLCAweDM5LCAweDk2LCAweDQzLCAweGU0LCAweGEzLCAweDJmLCAweDI3LCAweDM0LAotCTB4OWMsIDB4YWIsIDB4ZjcsIDB4MjAsIDB4NDUsIDB4N2UsIDB4ZmEsIDB4NTIsIDB4NDIsIDB4YjgsIDB4OWEsIDB4MTcsCi0JMHg0ZiwgMHgwYywgMHhjYSwgMHhmYSwgMHg2MCwgMHgyMywgMHgxYSwgMHgxMiwgMHhiMiwgMHgzNiwgMHhlYywgMHhjNSwKLQkweGUzLCAweDIzLCAweDVlLCAweGRhLCAweGEzLCAweDY1LCAweDZkLCAweGEyLCAweGVkLCAweGI2LCAweDZhLCAweDEzLAotCTB4ZWMsIDB4NTMsIDB4ZDYsIDB4MTQsIDB4YTMsIDB4YjgsIDB4YTksIDB4YjcsIDB4MTIsIDB4NGYsIDB4OGMsIDB4ZjgsCi0JMHhmMCwgMHgzZCwgMHhmMiwgMHhmMSwgMHgzZSwgMHhkNiwgMHg3YiwgMHgyNSwgMHhlMSwgMHg0NywgMHg2ZiwgMHhjYSwKLQkweDg3LCAweGU3LCAweGM5LCAweGNiLCAweGI3LCAweGYyLCAweDVjLCAweGJlLCAweDA1LCAweDU2LCAweDYwLCAweDA0LAotCTB4OTEsIDB4NDgsIDB4MWQsIDB4NjMsIDB4NmMsIDB4YmMsIDB4MDIsIDB4NmIsIDB4NTcsIDB4MWUsIDB4ODEsIDB4ZGEsCi0JMHg3YiwgMHg5NCwgMHhjNywgMHhmNSwgMHg4YywgMHhkNSwgMHhkNywgMHgyMywgMHgzOSwgMHgxOCwgMHg0MSwgMHg3MiwKLQkweGU0LCAweDg3LCAweGU4LCAweDE5LCAweDk0LCAweDcxLCAweGM5LCAweDM3LCAweGExLCAweDY0LCAweDZmLCAweDkxLAotCTB4ODEsIDB4ZjksIDB4OGMsIDB4YTcsIDB4NDMsIDB4MjMsIDB4ZDIsIDB4NGYsIDB4MjUsIDB4ZmIsIDB4ZmUsIDB4NGIsCi0JMHhkYiwgMHhmZiwgMHg5OSwgMHhiNSwgMHhmNiwgMHhmMywgMHhkMiwgMHhmNiwgMHg5MSwgMHgzZiwgMHhkMSwgMHhiZSwKLQkweGU4LCAweDJhLCAweGZmLCAweDZlLCAweDlmLCAweGFjLCAweDczLCAweGI4LCAweGQ5LCAweGE2LCAweDA3LCAweDhlLAotCTB4NDgsIDB4NjYsIDB4NjUsIDB4MjksIDB4ZjQsIDB4ZTgsIDB4NzYsIDB4YzUsIDB4NjgsIDB4MmEsIDB4NTEsIDB4MjYsCi0JMHhiMSwgMHgzZCwgMHgyZCwgMHhlZiwgMHg3MSwgMHgxNSwgMHhlMiwgMHg3OSwgMHg3MiwgMHgwMiwgMHg1NywgMHg0OCwKLQkweGQ3LCAweGJlLCAweDRkLCAweGRiLCAweDU5LCAweDQyLCAweDhjLCAweDM5LCAweDYzLCAweDdlLCAweDFhLCAweDcxLAotCTB4NGQsIDB4ZjQsIDB4NTcsIDB4ODgsIDB4NTcsIDB4ZmIsIDB4ZGQsIDB4NzgsIDB4MzcsIDB4YzQsIDB4OTgsIDB4NmQsCi0JMHhlZiwgMHhhMSwgMHhmNiwgMHhlMCwgMHgyNywgMHgwOSwgMHgyZiwgMHhlNywgMHhhYiwgMHgzNiwgMHg2MywgMHgzOCwKLQkweGU2LCAweDAyLCAweDU1LCAweGQ5LCAweDZiLCAweDI3LCAweDEyLCAweDZkLCAweGQ4LCAweDRmLCAweDc5LCAweDVmLAotCTB4NDksIDB4OWMsIDB4ZTcsIDB4ZmMsIDB4YWMsIDB4YTMsIDB4ZmUsIDB4NDUsIDB4ZGYsIDB4ZjEsIDB4OWMsIDB4YWUsCi0JMHhiYiwgMHhhOSwgMHhlYiwgMHg5OSwgMHg3OCwgMHgzMSwgMHhmMSwgMHgzMCwgMHg5ZSwgMHhhMCwgMHhmYywgMHg4ZiwKLQkweGY3LCAweDFiLCAweGQxLCAweDM5LCAweGNhLCAweDMxLCAweDFjLCAweDFhLCAweDJhLCAweDI0LCAweDdlLCAweGJiLAotCTB4NzEsIDB4MzcsIDB4YjMsIDB4ZTQsIDB4NDksIDB4ZTksIDB4MmIsIDB4MjksIDB4NmIsIDB4OTMsIDB4MGEsIDB4YjksCi0JMHhjNywgMHgzMSwgMHg4YywgMHhmMywgMHhkZSwgMHg0ZiwgMHhmOCwgMHgzYiwgMHhiYywgMHhiMCwgMHg5YywgMHg3ZCwKLQkweDg4LCAweDdlLCAweGZjLCAweDc2LCAweDFlLCAweGQwLCAweDQ1LCAweDdlLCAweGIzLCAweGJjLCAweGZlLCAweDk4LAotCTB4Y2QsIDB4NzksIDB4YmEsIDB4OTMsIDB4YWQsIDB4ZTgsIDB4ZTksIDB4N2YsIDB4OWYsIDB4N2MsIDB4OGUsIDB4MzgsCi0JMHhlNCwgMHhhZCwgMHhhNywgMHhhZCwgMHg2NywgMHhiMCwgMHgzZCwgMHhmNSwgMHhlZiwgMHg1NSwgMHg1OSwgMHhlZSwKLQkweGY5LCAweDZhLCAweDk1LCAweGVjLCAweGViLCAweDNkLCAweDkxLCAweDI4LCAweGM0LCAweDRiLCAweGFjLCAweGIzLAotCTB4MzYsIDB4ZTQsIDB4Y2EsIDB4M2QsIDB4MmYsIDB4MzksIDB4ODYsIDB4NWUsIDB4ZTIsIDB4NmEsIDB4OGEsIDB4N2QsCi0JMHgyNCwgMHhlYywgMHgzNiwgMHhhYSwgMHg5NCwgMHhiZCwgMHhmNCwgMHhjMywgMHhmMiwgMHg4NSwgMHg1NSwgMHg0YSwKLQkweDkyLCAweGU3LCAweDdkLCAweGM5LCAweDFmLCAweGUyLCAweGQ5LCAweDQ3LCAweGIyLCAweDNhLCAweGRjLCAweDZmLAotCTB4YjYsIDB4NjEsIDB4MjgsIDB4NzUsIDB4MmEsIDB4ZDcsIDB4ZGUsIDB4OGYsIDB4YTcsIDB4YmMsIDB4OWIsIDB4MjYsCi0JMHhlZiwgMHhiYSwgMHhlNCwgMHhkZiwgMHg3YiwgMHhjOSwgMHgzZSwgMHhjZiwgMHg3YSwgMHgyYSwgMHg1ZCwgMHg0NiwKLQkweGRlLCAweDVjLCAweDRjLCAweDViLCAweDJiLCAweDg4LCAweDc5LCAweDE5LCAweDRmLCAweGRiLCAweDE2LCAweDY4LAotCTB4ZDgsIDB4NzUsIDB4Y2QsIDB4OWMsIDB4MmEsIDB4OTQsIDB4NjksIDB4ZWUsIDB4NWYsIDB4ZDcsIDB4YmYsIDB4Y2MsCi0JMHg3ZSwgMHhjYSwgMHg2MiwgMHgxNSwgMHg5MSwgMHg4YywgMHhiZCwgMHgwNywgMHgyYSwgMHg3NCwgMHg0ZCwgMHgzNSwKLQkweDczLCAweDY4LCAweDc5LCAweDJlLCAweDFjLCAweGMzLCAweGRiLCAweDg5LCAweGNhLCAweDU4LCAweDY1LCAweGE0LAotCTB4OWMsIDB4NzgsIDB4N2IsIDB4MGUsIDB4YmQsIDB4YzMsIDB4YzQsIDB4NzYsIDB4ZjIsIDB4ZTUsIDB4ZDIsIDB4YmUsCi0JMHg0YSwgMHhiOCwgMHhlZCwgMHgzNSwgMHhiYywgMHgyYiwgMHgzMCwgMHg2MywgMHhmNywgMHgyYywgMHhmOCwgMHg3NiwKLQkweGNmLCAweDI0LCAweDVmLCAweDYxLCAweDZlLCAweDE5LCAweGIyLCAweGFjLCAweDlmLCAweDJmLCAweGI0LCAweGFjLAotCTB4MmIsIDB4NzksIDB4MTQsIDB4ZjEsIDB4MzgsIDB4MWIsIDB4MTIsIDB4M2YsIDB4OGQsIDB4YTIsIDB4ZDYsIDB4ZjYsCi0JMHg1NywgMHgwMywgMHg3NSwgMHhmNiwgMHhmZiwgMHg0NiwgMHhmYSwgMHg3YSwgMHg0NywgMHg2OCwgMHhmZSwgMHhmOCwKLQkweGMzLCAweGExLCAweGI5LCAweGUzLCAweGQ1LCAweDUwLCAweDA3LCAweGE2LCAweGMxLCAweGMxLCAweGI2LCAweDNlLAotCTB4NzcsIDB4OGQsIDB4ODUsIDB4NDYsIDB4ZmEsIDB4ZjAsIDB4MWEsIDB4NTMsIDB4ZjgsIDB4NTAsIDB4MWIsIDB4ZjksCi0JMHg1MCwgMHg0ZiwgMHhjOCwgMHgxOCwgMHgzZiwgMHg4MiwgMHgxYiwgMHhjOSwgMHg5NywgMHhkZCwgMHgwMywgMHgzZSwKLQkweGY2LCAweDIzLCAweGY5LCAweGI1LCAweDMzLCAweDMzLCAweDliLCAweDNjLCAweGZiLCAweGQzLCAweDBiLCAweDg1LAotCTB4MWIsIDB4YjUsIDB4OTAsIDB4MWIsIDB4MWQsIDB4NDUsIDB4Y2IsIDB4ZjgsIDB4MzEsIDB4ZGMsIDB4Y2EsIDB4MzIsCi0JMHgxZSwgMHhlNiwgMHhmZCwgMHg3ZCwgMHhlOSwgMHgxZiwgMHg5MiwgMHg3NywgMHg1OCwgMHg4YywgMHgzOSwgMHgxOSwKLQkweGRjLCAweGNjLCAweGI2LCAweDhiLCAweDA3LCAweDlhLCAweDcwLCAweGY3LCAweGY4LCAweDBhLCAweGFjLCAweDFkLAotCTB4YjcsIDB4YjAsIDB4M2MsIDB4MzQsIDB4ODEsIDB4ZTUsIDB4ZTMsIDB4ZTQsIDB4OWEsIDB4ZTMsIDB4NzksIDB4N2YsCi0JMHgxNSwgMHg5ZSwgMHhiNCwgMHg4MiwgMHgzYywgMHg0OSwgMHhlMiwgMHhkMCwgMHgyYSwgMHg3YiwgMHgxZCwgMHg0ZCwKLQkweGE1LCAweDFmLCAweDM2LCAweDI0LCAweGU0LCAweDlkLCAweDliLCAweDM4LCAweDU2LCAweDhmLCAweDBiLCAweDU2LAotCTB4M2YsIDB4ODgsIDB4NGQsIDB4ZTMsIDB4YjIsIDB4MmUsIDB4ZmIsIDB4ZjUsIDB4ZDAsIDB4OWMsIDB4ZjEsIDB4ZDcsCi0JMHhkMSwgMHgzMCwgMHgzZSwgMHgxNCwgMHg5YSwgMHgzNywgMHgzZSwgMHg0MiwgMHhiOSwgMHgxMywgMHg5NCwgMHhhZCwKLQkweDNmLCAweDU0LCAweDMzLCAweDNlLCAweDE4LCAweDBhLCAweDhlLCAweGVmLCAweDBkLCAweDA1LCAweGM2LCAweDliLAotCTB4YjEsIDB4NzUsIDB4N2MsIDB4MTUsIDB4YjYsIDB4OGMsIDB4YjcsIDB4NjMsIDB4ZjMsIDB4YjgsIDB4ZTAsIDB4ZmMsCi0JMHgyNCwgMHg5NiwgMHg4ZCwgMHg5ZiwgMHhjMSwgMHhkMiwgMHhmMSwgMHg5NywgMHhkMSwgMHgzOCwgMHg3ZSwgMHgwYSwKLQkweDRiLCAweGM2LCAweDdmLCAweDg4LCAweGE2LCAweGYxLCAweDFmLCAweDczLCAweDJjLCAweGIyLCAweGNlLCAweDJiLAotCTB4NmIsIDB4YmMsIDB4ZjksIDB4NjcsIDB4NmEsIDB4ZjksIDB4ZjcsIDB4NDQsIDB4ZjMsIDB4ZGYsIDB4ZDcsIDB4NzAsCi0JMHgyMSwgMHhhYSwgMHhiZCwgMHg4MSwgMHhlZSwgMHgzZCwgMHhmMiwgMHhiZCwgMHhjMSwgMHg1YSwgMHg2ZCwgMHg5MywKLQkweGZkLCAweGJlLCAweGMxLCAweGNiLCAweGIyLCAweDRmLCAweDFkLCAweDQ1LCAweGM2LCAweGU1LCAweGVmLCAweGM1LAotCTB4Y2IsIDB4NzcsIDB4MzEsIDB4ZTQsIDB4MzksIDB4ZTcsIDB4MjQsIDB4YmEsIDB4ZDIsIDB4ZTcsIDB4YWQsIDB4YTgsCi0JMHgyNiwgMHg2NSwgMHhkZSwgMHhjMCwgMHhlNiwgMHgzZCwgMHhmMiwgMHgzZSwgMHg3MSwgMHgwNiwgMHg1ZCwgMHg0OSwKLQkweDc5LCAweDBlLCAweDJmLCAweGVmLCAweGEwLCAweGJmLCAweDgxLCAweDJkLCAweGEzLCAweGI2LCAweGFmLCAweGExLAotCTB4NzEsIDB4NDgsIDB4ZGUsIDB4ODksIDB4NjksIDB4YzMsIDB4NzUsIDB4YzksIDB4OGMsIDB4YmQsIDB4NTYsIDB4NWUsCi0JMHg2NiwgMHhlMCwgMHhlZiwgMHg2NywgMHhlMCwgMHg0MSwgMHhlNiwgMHgwNCwgMHgwNSwgMHhlNCwgMHhmZCwgMHhjNSwKLQkweGU4LCAweDdjLCAweDI0LCAweDZlLCAweDE1LCAweDFhLCAweDFlLCAweGNjLCAweDg4LCAweDE4LCAweDk5LCAweDc3LAotCTB4MWQsIDB4YzUsIDB4ZTgsIDB4ZTAsIDB4YjUsIDB4ZmIsIDB4NzYsIDB4YzIsIDB4ZWYsIDB4MzMsIDB4NDQsIDB4ZjcsCi0JMHg4MSwgMHhkOCwgMHgyOCwgMHg2MywgMHhlYywgMHg4NiwgMHg3ZCwgMHgxOSwgMHhmMiwgMHg4YiwgMHgwZSwgMHhmOCwKLQkweGY5LCAweDdmLCAweDdiLCAweDUyLCAweGY2LCAweDIxLCAweDZkLCAweDQyLCAweDc0LCAweDlmLCAweGU4LCAweGIwLAotCTB4OTksIDB4M2EsIDB4OWMsIDB4NjQsIDB4ZGMsIDB4OTAsIDB4NjcsIDB4MzgsIDB4NDYsIDB4NzAsIDB4MmIsIDB4NjQsCi0JMHg5ZCwgMHg1MiwgMHhjNSwgMHhmNywgMHgwNiwgMHhlNSwgMHg3OSwgMHg4MywgMHhkZSwgMHhmMSwgMHgyNSwgMHhmYSwKLQkweGY0LCAweDg3LCAweGNhLCAweDBmLCAweDUxLCAweDc2LCAweDQwLCAweGY4LCAweGQyLCAweDA0LCAweDdhLCAweDg0LAotCTB4NmYsIDB4NDcsIDB4MTQsIDB4MjMsIDB4MTUsIDB4MzgsIDB4MGIsIDB4Y2YsIDB4MDEsIDB4YzEsIDB4NWQsIDB4MjcsCi0JMHg0YSwgMHhjNiwgMHhlNCwgMHhmYiwgMHgzOCwgMHg0MCwgMHgzMSwgMHhmMywgMHgxMiwgMHgxYywgMHgyMCwgMHhhNywKLQkweDNkLCAweDcwLCAweDBhLCAweGQ4LCAweDI3LCAweGViLCAweDU2LCAweGFmLCAweDYxLCAweDcyLCAweDQ4LCAweGU2LAotCTB4YWQsIDB4OGQsIDB4ZjMsIDB4MjYsIDB4N2UsIDB4ZjgsIDB4N2QsIDB4MGMsIDB4MGYsIDB4NzksIDB4ZTgsIDB4ZTMsCi0JMHgxMywgMHgxYywgMHhjNywgMHhlYiwgMHg3OCwgMHg3NCwgMHg4ZiwgMHgzYywgMHgxNywgMHg5OSwgMHg4OSwgMHgzNiwKLQkweGQ2LCAweDNiLCAweGMxLCAweDNjLCAweGJmLCAweDc1LCAweGNjLCAweGU0LCAweDc4LCAweDU2LCAweGExLCAweGYzLAotCTB4YzAsIDB4MTcsIDB4NzgsIDB4NGMsIDB4YzMsIDB4NDMsIDB4MDcsIDB4ZDYsIDB4NzEsIDB4OGMsIDB4NzEsIDB4NzQsCi0JMHg4YywgMHg3NSwgMHhmMywgMHg2OCwgMHhjNSwgMHhjNiwgMHg5ZCwgMHgyNiwgMHhiOSwgMHhhMCwgMHhkOCwgMHhiNCwKLQkweDQ2LCAweDNmLCAweDZiLCAweGU1LCAweDk4LCAweGE0LCAweDhmLCAweGQ1LCAweGY4LCAweDE5LCAweDMxLCAweGE2LAotCTB4MjksIDB4YjQsIDB4MWEsIDB4ZTcsIDB4NmMsIDB4YmYsIDB4NWIsIDB4OGQsIDB4MmQsIDB4ZmQsIDB4NDYsIDB4ZjAsCi0JMHgyNCwgMHg1NiwgMHg2MywgMHgzMywgMHhjZiwgMHgxZiwgMHhhNSwgMHhlZiwgMHhjZiwgMHgyMSwgMHgxNywgMHhiYywKLQkweDkzLCAweGJlLCAweGJkLCAweDc4LCAweDc4LCAweDQyLCAweGJlLCAweDlkLCAweDgwLCAweGJlLCAweDVkLCAweDMyLAotCTB4MWYsIDB4NmQsIDB4ZjAsIDB4OGQsIDB4NjUsIDB4NTAsIDB4M2UsIDB4YzYsIDB4ZWMsIDB4NzksIDB4MjcsIDB4ZWUsCi0JMHgyYSwgMHg0MywgMHgzOSwgMHhiZSwgMHgxMSwgMHg5MiwgMHgzZCwgMHgwYiwgMHgzZiwgMHg0MCwgMHhmMSwgMHgzZSwKLQkweDkxLCAweGY1LCAweDg3LCAweDZjLCAweGZiLCAweDFjLCAweDczLCAweGYxLCAweDUzLCAweDljLCAweDgzLCAweGZjLAotCTB4YjMsIDB4ZjEsIDB4NWYsIDB4ZTAsIDB4NjAsIDB4NmEsIDB4OTIsIDB4YjgsIDB4N2EsIDB4OWEsIDB4YzcsIDB4ZTUsCi0JMHhjZiwgMHhhNSwgMHhiZCwgMHg3NiwgMHg4ZSwgMHg5MiwgMHhkZCwgMHhmZiwgMHhlZCwgMHhjNCwgMHg4YywgMHgzZSwKLQkweDU5LCAweGRmLCAweDZkLCAweDg2LCAweDJmLCAweDI5LCAweDdjLCAweDI3LCAweGIzLCAweDhkLCAweGY5LCAweDRhLAotCTB4N2IsIDB4ZDgsIDB4ZTYsIDB4M2YsIDB4NDYsIDB4OGMsIDB4YmMsIDB4YTcsIDB4ZjksIDB4ZGIsIDB4OGEsIDB4ODcsCi0JMHhiYywgMHgyNywgMHg4OCwgMHgxNSwgMHg2OSwgMHgzZCwgMHg3YSwgMHgzMywgMHhmNSwgMHg1YiwgMHhmNCwgMHhjOCwKLQkweDhmLCAweGUwLCAweDdjLCAweGM0LCAweDg5LCAweDQyLCAweGU2LCAweDM3LCAweGExLCAweDkwLCAweGU4LCAweDU5LAotCTB4ZGUsIDB4OTUsIDB4Y2QsIDB4ZTgsIDB4ODUsIDB4YzQsIDB4Y2MsIDB4ODIsIDB4YmUsIDB4MGMsIDB4ZTcsIDB4MjcsCi0JMHgzMywgMHhiZiwgMHgwMCwgMHg3ZSwgMHhjZSwgMHhjZCwgMHgwZCwgMHg2OCwgMHhlYiwgMHg4ZiwgMHg3MiwgMHg2ZSwKLQkweDNlLCAweDQ1LCAweDFiLCAweDliLCAweGEwLCAweGJkLCAweDQ4LCAweDRlLCAweGY0LCAweDMyLCAweDY1LCAweDc0LAotCTB4ZTUsIDB4YmUsIDB4YzksIDB4OTMsIDB4ZDEsIDB4OWQsIDB4ZDAsIDB4NGQsIDB4YmYsIDB4NWEsIDB4OTUsIDB4N2QsCi0JMHgyNywgMHgwNSwgMHhmNiwgMHhiMywgMHhlNywgMHgzMCwgMHhmMCwgMHgwNiwgMHg2ZCwgMHgzMywgMHhjZiwgMHg2NywKLQkweDJjLCAweGFiLCAweDlkLCAweGY2LCAweGQ1LCAweDNmLCAweDJhLCAweGJlLCAweGIyLCAweGI0LCAweDJhLCAweGZiLAotCTB4YmUsIDB4ZWUsIDB4NTQsIDB4YWUsIDB4OTMsIDB4YWYsIDB4ZWIsIDB4MjAsIDB4MzYsIDB4ZTYsIDB4ZWYsIDB4ZmYsCi0JMHgwOCwgMHg3NywgMHgzMiwgMHg3ZSwgMHg5ZCwgMHg1OSwgMHg3OCwgMHgyYSwgMHg2NywgMHhmMywgMHhkMywgMHhhYiwKLQkweGIzLCAweGY4LCAweGY1LCAweDQ5LCAweGRmLCAweDBiLCAweGZhLCAweDJiLCAweGZiLCAweGRiLCAweDNiLCAweGQ5LAotCTB4NmYsIDB4MWYsIDB4MDEsIDB4Y2YsIDB4MjYsIDB4MGEsIDB4ZTQsIDB4MjksIDB4YzEsIDB4NjIsIDB4MTcsIDB4NTQsCi0JMHhhZiwgMHgwYiwgMHg4NSwgMHg4YywgMHgwMSwgMHhkNSwgMHhkOCwgMHhlNCwgMHhiNSwgMHg3MCwgMHhhMywgMHg1OSwKLQkweDgwLCAweDQzLCAweDc1LCAweGI3LCAweDAwLCAweDE1LCAweGYxLCAweDE2LCAweDk3LCAweGZkLCAweDRlLCAweGRlLAotCTB4ZWYsIDB4YmYsIDB4ZjQsIDB4ODcsIDB4ZWYsIDB4ZTQsIDB4OWQsIDB4YjEsIDB4ZjMsIDB4ZTEsIDB4NTIsIDB4ZTMsCi0JMHg3NiwgMHhiYywgMHg2MiwgMHhjNywgMHgwOSwgMHgwNSwgMHgyNSwgMHg3MywgMHg2NSwgMHg1ZCwgMHhkMiwgMHg4ZiwKLQkweDE3LCAweDhkLCAweDVhLCAweDdmLCAweDg1LCAweDNjLCAweDZmLCAweDUyLCAweGNlLCAweDVhLCAweDcxLCAweGFmLAotCTB4YmMsIDB4ODcsIDB4ZjcsIDB4YzcsIDB4ZjYsIDB4OGYsIDB4M2YsIDB4ODcsIDB4YWQsIDB4YmIsIDB4YzIsIDB4OTAsCi0JMHhmNywgMHgzYiwgMHg5YywgMHg0NiwgMHhhMSwgMHgzNywgMHgyYiwgMHhiZiwgMHhjOCwgMHgyNiwgMHhlYiwgMHg0NCwKLQkweGI3LCAweDcxLCAweDFjLCAweDY3LCAweGU4LCAweDhiLCAweDY3LCAweGVjLCAweDc1LCAweDJhLCAweGI3LCAweGYxLAotCTB4ZDcsIDB4MDgsIDB4NTYsIDB4ZTQsIDB4YzcsIDB4MmYsIDB4MzksIDB4OGQsIDB4OTIsIDB4ZDUsIDB4NDEsIDB4ZjYsCi0JMHhmZCwgMHhkYSwgMHg2YSwgMHhjMSwgMHhmZSwgMHgyZCwgMHhjOSwgMHgzMywgMHhmNiwgMHg5YSwgMHhhYywgMHhjYiwKLQkweGY4LCAweDBmLCAweGViLCAweDJkLCAweDZmLCAweDI1LCAweGNiLCAweDNlLCAweDk1LCAweGJiLCAweDNmLCAweDI5LAotCTB4ZWIsIDB4MzgsIDB4YTYsIDB4N2MsIDB4YmIsIDB4Y2EsIDB4NjksIDB4ZDcsIDB4MTEsIDB4YmQsIDB4NWYsIDB4YWMsCi0JMHhiMywgMHg4OSwgMHhiYywgMHg3YSwgMHhiNiwgMHg3MSwgMHhjYSwgMHhlYSwgMHhmNCwgMHhjYSwgMHgxOCwgMHhkNiwKLQkweDVjLCAweDU2LCAweDQ3LCAweGQ2LCAweDA4LCAweDM0LCAweGU5LCAweDM3LCAweDJjLCAweDYzLCAweGVlLCAweDRhLAotCTB4ZmYsIDB4NjEsIDB4OWYsIDB4YjIsIDB4N2UsIDB4NWIsIDB4NjAsIDB4OTQsIDB4ZTAsIDB4NmMsIDB4NDUsIDB4NzYsCi0JMHg0ZCwgMHhlNSwgMHhhMiwgMHg4YywgMHhlZCwgMHhkNSwgMHhiMiwgMHhlZiwgMHhhZSwgMHhkMCwgMHgzZSwgMHhiNywKLQkweGZiLCAweDM1LCAweDJmLCAweGQ2LCAweDdiLCAweDMwLCAweDM3LCAweGRlLCAweDRhLCAweGZiLCAweDlkLCAweDlhLAotCTB4NDcsIDB4NmQsIDB4YWUsIDB4ZTMsIDB4OTgsIDB4MzIsIDB4ZWUsIDB4ZGYsIDB4NzgsIDB4MmYsIDB4ZWQsIDB4ZTcsCi0JMHhmMywgMHhiOSwgMHg3ZSwgMHg0NSwgMHgxZSwgMHhlZiwgMHg5NCwgMHgzZSwgMHg0NCwgMHhhZSwgMHhkZSwgMHg1YywKLQkweDFkLCAweDNkLCAweDFjLCAweGI1LCAweGZiLCAweDU3LCAweDExLCAweGRlLCAweDkzLCAweGVmLCAweGQzLCAweGIyLAotCTB4MGEsIDB4MTYsIDB4ZTYsIDB4ZGIsIDB4YzgsIDB4ZDAsIDB4MGYsIDB4YWQsIDB4Y2UsIDB4NDIsIDB4YzYsIDB4YWIsCi0JMHhiMywgMHhmNSwgMHgwZiwgMHg2MiwgMHg3MywgMHg0MiwgMHhmNCwgMHgyYywgMHhkZiwgMHg3MCwgMHgyNSwgMHgyZSwKLQkweGRiLCAweGZjLCAweGNiLCAweGM1LCAweDVjLCAweGY2LCAweDFhLCAweDBjLCAweDY5LCAweDcxLCAweGVjLCAweGFmLAotCTB4OTMsIDB4NzcsIDB4YzgsIDB4NWMsIDB4ZjQsIDB4ODUsIDB4MzgsIDB4NzEsIDB4YjAsIDB4OTAsIDB4MzgsIDB4MWEsCi0JMHhiNywgMHhmNywgMHg5NCwgMHgxYywgMHgzNCwgMHhmNSwgMHhlOCwgMHhiMywgMHhmMiwgMHg4ZCwgMHhiMiwgMHhhYiwKLQkweGVjLCAweGI1LCAweGE3LCAweGE2LCAweDIxLCAweGM4LCAweGY1LCAweGZjLCAweDdhLCAweDUyLCAweGZlLCAweGFmLAotCTB4ODgsIDB4YjYsIDB4MjMsIDB4NzIsIDB4ODksIDB4MGQsIDB4NTAsIDB4YmEsIDB4ODQsIDB4YmMsIDB4ZWIsIDB4NTQsCi0JMHgxYiwgMHgyMywgMHg2NywgMHhjNCwgMHgyYiwgMHgyOSwgMHhkOSwgMHg3ZiwgMHhmMCwgMHg1YiwgMHgyYiwgMHg1ZSwKLQkweDJkLCAweGZiLCAweDFjLCAweGE3LCAweGQ2LCAweDI5LCAweDIwLCAweDk3LCAweDBiLCAweDg0LCAweGNiLCAweDk0LAotCTB4ZmMsIDB4ZmIsIDB4NGUsIDB4MTcsIDB4ZmYsIDB4NmUsIDB4YTUsIDB4Y2QsIDB4OWMsIDB4YjMsIDB4ZGYsIDB4NTEsCi0JMHg5MywgMHhiMywgMHgwOCwgMHgxYSwgMHg5MiwgMHhmMiwgMHhhZCwgMHg1MiwgMHg3ZCwgMHg2MiwgMHgzOSwgMHg2YSwKLQkweDMzLCAweDM1LCAweDBlLCAweDY3LCAweDhlLCAweDkzLCAweDg0LCAweGIxLCAweDgyLCAweDc2LCAweGIzLCAweDI1LAotCTB4MTAsIDB4YjYsIDB4ZGYsIDB4YzUsIDB4NWEsIDB4OTYsIDB4YWMsIDB4MDksIDB4M2UsIDB4Y2UsIDB4MWMsIDB4ZmEsCi0JMHgxZCwgMHg5NiwgMHhiZiwgMHgyNSwgMHhmZCwgMHgzZCwgMHg2YiwgMHhjOCwgMHgyYiwgMHg2MywgMHhjYSwgMHg2MywKLQkweGMzLCAweDI5LCAweGZhLCAweDA2LCAweGY1LCAweDE4LCAweDExLCAweGZmLCAweGYwLCAweGEwLCAweDIyLCAweDEyLAotCTB4YTYsIDB4ZmYsIDB4NGEsIDB4NGMsIDB4OTcsIDB4ZjcsIDB4YjgsIDB4ZjQsIDB4YmQsIDB4NzEsIDB4OTgsIDB4YzQsCi0JMHhmYywgMHgxZSwgMHhkYSwgMHg5MSwgMHhlYywgMHg1YiwgMHhkNiwgMHhmZCwgMHgyYiwgMHgxOSwgMHg1YiwgMHg4ZSwKLQkweDVmLCAweDc4LCAweGM2LCAweDJmLCAweDFjLCAweGUwLCAweGQ5LCAweGVhLCAweGRjLCAweGRlLCAweDY2LCAweGY3LAotCTB4NmMsIDB4YzYsIDB4M2MsIDB4Y2IsIDB4N2UsIDB4NmUsIDB4ZGYsIDB4NjYsIDB4NjMsIDB4OGEsIDB4NjYsIDB4ZTgsCi0JMHg4NywgMHg3ZSwgMHhlNSwgMHhlOCwgMHhjNCwgMHhkMywgMHgwYiwgMHg4YywgMHg4ZSwgMHhjMywgMHg2YSwgMHg2NiwKLQkweGM4LCAweDQ3LCAweDdjLCAweGI5LCAweGRlLCAweDExLCAweGRkLCAweGM5LCAweGZmLCAweGZlLCAweGQ3LCAweGVjLAotCTB4NmYsIDB4YWIsIDB4NDgsIDB4NWQsIDB4M2QsIDB4YjgsIDB4NGEsIDB4OTUsIDB4ZmQsIDB4NDAsIDB4Y2QsIDB4MTgsCi0JMHhlYiwgMHg5NSwgMHg3NywgMHgwNiwgMHhmNCwgMHg5NiwgMHhhNywgMHg5NCwgMHg0ZSwgMHg2YywgMHgwOCwgMHgxOSwKLQkweGNkLCAweGVkLCAweDhhLCAweGRlLCAweGY0LCAweDBmLCAweDhhLCAweGVlLCAweDBmLCAweDI5LCAweDUyLCAweDJlLAotCTB4YzgsIDB4YmMsIDB4ZWIsIDB4NjIsIDB4M2MsIDB4NzUsIDB4YjEsIDB4OGYsIDB4MDMsIDB4MDksIDB4M2QsIDB4NWMsCi0JMHhjNSwgMHhiMiwgMHg2NywgMHg0ZCwgMHhjMywgMHhmNywgMHgzZSwgMHhkYiwgMHhmYywgMHg1NywgMHgxZSwgMHgzYiwKLQkweGVkLCAweGY3LCAweGM0LCAweGE1LCAweDdjLCAweDc0LCAweGJlLCAweGNiLCAweGZlLCAweGJlLCAweDY5LCAweDBiLAotCTB4ZTMsIDB4YWUsIDB4N2MsIDB4MjMsIDB4MzgsIDB4MDYsIDB4YWQsIDB4NmYsIDB4MjYsIDB4NGQsIDB4NGMsIDB4ZWYsCi0JMHhiOSwgMHgwZCwgMHhiMiwgMHhlNywgMHhhMCwgMHg4OSwgMHgwOSwgMHhiYSwgMHgwNywgMHhkZSwgMHg0OCwgMHgyNywKKwkweDlkLCAweGJjLCAweDBkLCAweDc4LCAweDFiLCAweGU1LCAweDk1LCAweDM2LCAweDdjLCAweGNmLCAweDQ4LCAweGIyLAorCTB4NjUsIDB4NWIsIDB4YjYsIDB4YzcsIDB4OGUsIDB4OWMsIDB4MjgsIDB4NmMsIDB4OWEsIDB4NjgsIDB4ZjAsIDB4MjgsCisJMHg1MSwgMHhiMCwgMHg2OSwgMHg0NywgMHg4OSwgMHgwMywgMHg4MiwgMHg1NSwgMHg4OSwgMHhlYSwgMHg5OCwgMHhjNCwKKwkweDgxLCAweDUwLCAweDljLCAweDEyLCAweDVhLCAweGIzLCAweDRiLCAweDViLCAweGUxLCAweGZjLCAweDYwLCAweDQyLAorCTB4YTAsIDB4YTEsIDB4YjAsIDB4ZWYsIDB4OWEsIDB4ZWYsIDB4NjUsIDB4NWYsIDB4YWIsIDB4YjYsIDB4OTMsIDB4MzgsCisJMHg4OSwgMHgyYywgMHgzOSwgMHg4ZSwgMHgyMSwgMHg2MSwgMHhiZiwgMHg1ZSwgMHg4YiwgMHg4OSwgMHg5ZCwgMHgzOCwKKwkweDgwLCAweDZjLCAweDg1LCAweDM2LCAweGRkLCAweDBkLCAweDdkLCAweGQzLCAweDhkLCAweDM2LCAweDA5LCAweDYwLAorCTB4ZmUsIDB4ZGEsIDB4NDAsIDB4YmIsIDB4MmMsIDB4ZWQsIDB4Y2IsIDB4MDcsIDB4ZGUsIDB4MTQsIDB4NDIsIDB4ZDgsCisJMHhiNiwgMHg0MCwgMHhiNywgMHgzZiwgMHgxYiwgMHg1YSwgMHhjYSwgMHhiYywgMHhmNywgMHgxOSwgMHg0OSwgMHg4OSwKKwkweDEzLCAweDI4LCAweGVkLCAweDdlLCAweGJlLCAweGFlLCAweGI5LCAweGFjLCAweDk5LCAweDc5LCAweDdlLCAweGNlLAorCTB4NzMsIDB4OWUsIDB4NzMsIDB4ZWUsIDB4NzMsIDB4OWYsIDB4NjcsIDB4OWUsIDB4MTksIDB4M2YsIDB4NTAsIDB4OGEsCisJMHhmYywgMHg1ZiwgMHgzOSwgMHg4ZiwgMHg0ZiwgMHgzNywgMHg2YywgMHg1YywgMHhiZCwgMHg2MCwgMHhjMSwgMHhhNywKKwkweDFiLCAweGU0LCAweGRjLCAweDM5LCAweGRkLCAweGU5LCAweGM0LCAweDlmLCAweGY5LCAweGU3LCAweGZmLCAweDczLAorCTB4MGIsIDB4N2UsIDB4Y2MsIDB4OWYsIDB4MDMsIDB4ZDAsIDB4MGEsIDB4ZmQsIDB4Y2IsIDB4MDEsIDB4YjcsIDB4MWEsCisJMHg3MSwgMHhkZSwgMHhkYywgMHg2OCwgMHhjMCwgMHhlZCwgMHg4OCwgMHg0YywgMHhiNCwgMHhhZCwgMHgzNiwgMHg4MCwKKwkweDY4LCAweGJhLCAweGNlLCAweGJmLCAweDA0LCAweDdmLCAweGIwLCAweGUyLCAweDVlLCAweDI3LCAweGU0LCAweGZhLAorCTB4YTcsIDB4MjIsIDB4MWYsIDB4NzQsIDB4N2UsIDB4ZWYsIDB4NzIsIDB4ZmQsIDB4YmQsIDB4MjEsIDB4MDcsIDB4ZGMsCisJMHg1YSwgMHgyNCwgMHgwZSwgMHg2ZCwgMHgyZSwgMHhkYywgMHhiMywgMHg1OCwgMHhlNywgMHg5YiwgMHhmMywgMHhiZSwKKwkweGE5LCAweGEwLCAweGEyLCAweGQwLCAweGQ2LCAweDY5LCAweGViLCAweDdiLCAweGYzLCAweDdjLCAweGIxLCAweDkyLAorCTB4ODgsIDB4ODYsIDB4MjMsIDB4MTksIDB4YjQsIDB4ZDQsIDB4ZjcsIDB4NzUsIDB4NWEsIDB4ZTUsIDB4NDYsIDB4MDgsCisJMHg2ZSwgMHhjMywgMHg2OCwgMHhlZCwgMHg1MywgMHgzYywgMHhlMSwgMHhmNSwgMHg4YiwgMHhlMCwgMHgyOSwgMHgzNiwKKwkweDEwLCAweGJmLCAweDI4LCAweDgyLCAweDk2LCAweDRiLCAweGM2LCAweDRhLCAweGUzLCAweGNlLCAweDg4LCAweDFiLAorCTB4Y2QsIDB4MTksIDB4NzcsIDB4ZmMsIDB4MmYsIDB4MjIsIDB4MDYsIDB4OTYsIDB4NjUsIDB4NjYsIDB4OTUsIDB4YTIsCisJMHhjMiwgMHg4ZCwgMHg5ZSwgMHhjYywgMHhlYiwgMHgyNSwgMHhiOSwgMHhmNiwgMHhlYSwgMHhmMywgMHhmZiwgMHg4MywKKwkweGQzLCAweDcyLCAweGZmLCAweGE3LCAweGM3LCAweDljLCAweDExLCAweDYwLCAweDUzLCAweGMyLCAweGIyLCAweDhhLAorCTB4MjIsIDB4MzcsIDB4ZGMsIDB4YTAsIDB4NDYsIDB4MGMsIDB4ZGYsIDB4M2UsIDB4MmMsIDB4NDYsIDB4OWIsIDB4ODYsCisJMHhmYiwgMHgzNiwgMHgzNywgMHhmYywgMHhhNywgMHg3MiwgMHg3NCwgMHg5MCwgMHgwZCwgMHg4ZiwgMHgzYSwgMHgxMCwKKwkweGQ1LCAweDhlLCAweGYzLCAweGZmLCAweGVjLCAweGQ5LCAweGFkLCAweDYxLCAweDAzLCAweGJiLCAweDQ3LCAweGNmLAorCTB4ZjAsIDB4YmEsIDB4ZDMsIDB4YmUsIDB4ZDYsIDB4YmQsIDB4NmIsIDB4ZjYsIDB4ZWMsIDB4OWIsIDB4YzIsIDB4YzcsCisJMHhmMSwgMHhlMCwgMHhhOCwgMHhmYywgMHhiZSwgMHgxNSwgMHg5ZCwgMHhmNSwgMHgwYSwgMHgyNiwgMHg2ZiwgMHg1OCwKKwkweDA3LCAweDg3LCAweDYxLCAweGEwLCAweDY3LCAweDk3LCAweGUyLCAweGVjLCAweGFhLCAweDU3LCAweDExLCAweGY1LAorCTB4ZWEsIDB4YzEsIDB4MTgsIDB4MjcsIDB4YzEsIDB4NjksIDB4MjAsIDB4NTYsIDB4MWMsIDB4MDksIDB4M2IsIDB4ZGYsCisJMHg0ZSwgMHg0NCwgMHgzNCwgMHg4NywgMHg2MSwgMHg1OSwgMHhjMSwgMHhkMCwgMHgwYywgMHgzOCwgMHhhYSwgMHgyYywKKwkweGViLCAweDA5LCAweGQzLCAweDAzLCAweGZmLCAweDk3LCAweDllLCAweDQyLCAweDdjLCAweGI4LCAweDA1LCAweGFhLAorCTB4ZjEsIDB4MTQsIDB4YmEsIDB4ODYsIDB4OWYsIDB4YzIsIDB4NDMsIDB4M2IsIDB4NGIsIDB4MzEsIDB4MzksIDB4OGQsCisJMHhlMywgMHg0ZCwgMHhmOSwgMHhmMCwgMHhiZCwgMHg3OSwgMHhkMiwgMHhiNywgMHhjOCwgMHg1MSwgMHhjZiwgMHhjMywKKwkweDhkLCAweDQ5LCAweGM3LCAweDZiLCAweGZjLCAweDJmLCAweDY1LCAweGNlLCAweDU4LCAweDkzLCAweDMzLCAweGNlLAorCTB4OTUsIDB4ZDksIDB4YzQsIDB4MzIsIDB4M2QsIDB4MTcsIDB4OTQsIDB4ODksIDB4MGYsIDB4NDcsIDB4ZjAsIDB4NWMsCisJMHg0MiwgMHhjMSwgMHhmYSwgMHg1MCwgMHgwNSwgMHhhMiwgMHg1NSwgMHgzMiwgMHg1ZSwgMHhjYiwgMHgxYSwgMHgzNSwKKwkweDRmLCAweDU5LCAweDkzLCAweDlhLCAweGY0LCAweDM1LCAweDgxLCAweGU3LCAweDc5LCAweDZmLCAweDczLCAweGU4LAorCTB4MGQsIDB4MmIsIDB4ZWIsIDB4OTUsIDB4ZjYsIDB4YmUsIDB4NGUsIDB4MWIsIDB4NWEsIDB4YzksIDB4ZWIsIDB4NGUsCisJMHhhNCwgMHgxMiwgMHg4OCwgMHg1NSwgMHg0NCwgMHg2ZSwgMHhlNCwgMHhiOSwgMHg2ZSwgMHhiZSwgMHhhMywgMHhiOCwKKwkweGRkLCAweGVmLCAweDI2LCAweGRjLCAweDVmLCAweDJhLCAweDM3LCAweGQ0LCAweDdiLCAweDJhLCAweGUxLCAweGM0LAorCTB4MGIsIDB4OTQsIDB4ZjksIDB4OTAsIDB4YjksIDB4MGUsIDB4MmUsIDB4ZTMsIDB4NmUsIDB4YjEsIDB4MzksIDB4OGUsCisJMHhlYiwgMHg0NywgMHgxNiwgMHg2NiwgMHgxNCwgMHhlYSwgMHg0YiwgMHhiYiwgMHg2ZSwgMHg2YywgMHg0ZSwgMHg1OSwKKwkweGQ2LCAweDU2LCAweDMzLCAweDdhLCAweDQ1LCAweDA5LCAweDBkLCAweGUyLCAweDU4LCAweGEyLCAweDA1LCAweGVlLAorCTB4NDgsIDB4YzAsIDB4N2YsIDB4MWEsIDB4NjEsIDB4MmMsIDB4YzksIDB4NzgsIDB4ZjEsIDB4NjQsIDB4MDIsIDB4Y2UsCisJMHhjNiwgMHg3OSwgMHg1ZSwgMHg3NCwgMHg2NSwgMHgyMiwgMHhiOCwgMHgzYSwgMHg2MywgMHhhMiwgMHgyOSwgMHhmMywKKwkweGE3LCAweDJkLCAweGViLCAweGRhLCAweDk0LCAweDlmLCAweDYzLCAweGY4LCAweDgzLCAweDk1LCAweDFiLCAweDgzLAorCTB4OGMsIDB4MmYsIDB4ZjcsIDB4YmYsIDB4MjcsIDB4NzUsIDB4MTEsIDB4YjYsIDB4NzEsIDB4OGUsIDB4YjYsIDB4NzAsCisJMHhmZSwgMHg5NiwgMHg4NywgMHhiMiwgMHhkMSwgMHgxMiwgMHhlOCwgMHhlNiwgMHg2OSwgMHg0NCwgMHhiMCwgMHgzNCwKKwkweDYzLCAweDcwLCAweDRlLCAweDIzLCAweDU4LCAweDkyLCAweGFhLCAweGQ1LCAweDg2LCAweDMxLCAweDFmLCAweDUxLAorCTB4NWYsIDB4Y2UsIDB4YjYsIDB4YjcsIDB4NzMsIDB4YmMsIDB4NmQsIDB4ODEsIDB4MTYsIDB4OTQsIDB4ZDMsIDB4NDYsCisJMHhkMiwgMHg4YiwgMHhjMiwgMHg2OCwgMHg2NCwgMHhmZiwgMHgyYiwgMHhmZSwgMHg4YywgMHhmZSwgMHhhZiwgMHg2NywKKwkweGZmLCAweGVmLCAweGIwLCAweGZmLCAweGFjLCAweGRkLCAweDNmLCAweDljLCAweGQ3LCAweGYwLCAweGRjLCAweDRkLAorCTB4N2IsIDB4ZGMsIDB4OTYsIDB4NzYsIDB4M2EsIDB4OTcsIDB4YTcsIDB4YmMsIDB4ZDgsIDB4OWEsIDB4MzYsIDB4NjksCisJMHg3MywgMHg3MiwgMHhjYiwgMHg4NywgMHhjZCwgMHg4MywgMHhiMywgMHhiMCwgMHg2NSwgMHg1MCwgMHhmNywgMHgzZCwKKwkweGNkLCAweGRmLCAweGRkLCAweDIzLCAweDE3LCAweDYxLCAweGQzLCAweGEwLCAweDgyLCAweDNkLCAweGM2LCAweDQ1LAorCTB4ZTgsIDB4ZTIsIDB4ZWYsIDB4ZGQsIDB4ODMsIDB4YjMsIDB4ZjEsIDB4ZTAsIDB4YTAsIDB4MDMsIDB4ZTEsIDB4NjksCisJMHhlNywgMHg4ZiwgMHg2MywgMHhkMiwgMHg3MSwgMHgxMSwgMHhlMiwgMHgyMywgMHg3ZSwgMHg3NCwgMHgyNSwgMHg5ZSwKKwkweGI3LCAweDc1LCAweDU4LCAweDFlLCAweGY5LCAweDVlLCAweGMxLCAweDlmLCAweGU5LCAweDNiLCAweDdlLCAweGFjLAorCTB4NGUsIDB4NjgsIDB4ZTgsIDB4NGEsIDB4ODksIDB4MWYsIDB4YjgsIDB4NjksIDB4OWIsIDB4ZTIsIDB4MDcsIDB4YmYsCisJMHgwNiwgMHgyYSwgMHgzNCwgMHg3NCwgMHg2NywgMHgwYSwgMHhmNywgMHgxNSwgMHgzOCwgMHgzOSwgMHg2ZiwgMHg2YiwKKwkweDM0LCAweDM3LCAweGI2LCAweGE2LCAweGM0LCAweDI2LCAweGE0LCAweDRkLCAweGIxLCAweDBiLCAweGY5LCAweDVkLAorCTB4NGQsIDB4YmIsIDB4MmIsIDB4ODUsIDB4N2YsIDB4NmYsIDB4MjksIDB4ODIsIDB4ZjcsIDB4NmIsIDB4NzgsIDB4YjMsCisJMHg0MSwgMHhhZSwgMHhkMywgMHhkZSwgMHg0MywgMHg1MiwgMHhhNiwgMHgxZiwgMHhmYiwgMHhkMiwgMHhlMiwgMHhhNywKKwkweDdlLCAweDM0LCAweDI2LCAweDI2LCAweGQ4LCAweDdlLCAweDAzLCAweGRiLCAweDM2LCAweGYxLCAweGNmLCAweDk5LAorCTB4N2EsIDB4ZmMsIDB4NTMsIDB4MjYsIDB4ODgsIDB4N2YsIDB4YTQsIDB4MWUsIDB4YmYsIDB4OTMsIDB4ZjEsIDB4ZTMsCisJMHg2MCwgMHg2NiwgMHgxNiwgMHhiZSwgMHg5ZCwgMHhmMSwgMHhlMSwgMHg1YiwgMHg5YywgMHhiZiwgMHhjNywgMHgzMywKKwkweDJkLCAweGI0LCAweDdkLCAweDBkLCAweDA3LCAweDMyLCAweGEyLCAweGZmLCAweDIyLCAweDhlLCAweGI3LCAweDE0LAorCTB4ZGQsIDB4ODMsIDB4YjUsIDB4YzEsIDB4NjMsIDB4YjQsIDB4YWQsIDB4N2YsIDB4MzQsIDB4YWYsIDB4NDEsIDB4YjYsCisJMHhiYSwgMHhjMSwgMHhiNiwgMHhjOSwgMHhhZCwgMHhiYywgMHhiZSwgMHg2ZCwgMHhiMCwgMHgzNiwgMHg3YSwgMHg4OSwKKwkweDYyLCAweDU5LCAweDZhLCAweGE4LCAweDJlLCAweDdjLCAweDU0LCAweDU1LCAweDMxLCAweGU5LCAweGQ1LCAweGZkLAorCTB4NTksIDB4NTUsIDB4ZjcsIDB4NDcsIDB4ZTEsIDB4NDIsIDB4ODIsIDB4YmUsIDB4MTEsIDB4YWYsIDB4ZDEsIDB4ODcsCisJMHhlMiwgMHhiNCwgMHgyOSwgMHhhZiwgMHgzMSwgMHhjYywgMHhmMSwgMHhlOCwgMHhmZSwgMHhiOCwgMHhlYSwgMHhjNiwKKwkweDk2LCAweDk0LCAweGJlLCAweDNiLCAweGFlLCAweDdhLCAweDEwLCAweGNmLCAweDk0LCAweGUyLCAweDE3LCAweDgzLAorCTB4N2EsIDB4NmYsIDB4NWMsIDB4ZmQsIDB4M2MsIDB4ZTIsIDB4ZDUsIDB4OTYsIDB4ZjUsIDB4YWQsIDB4MTAsIDB4MzYsCisJMHhjZSwgMHg4OCwgMHgyMCwgMHg1YSwgMHgxMywgMHg0MSwgMHg2YywgMHg3NiwgMHhjNCwgMHg4YiwgMHg1NCwgMHgwYSwKKwkweDc4LCAweGE3LCAweGNmLCAweGYwLCAweGZkLCAweDliLCAweGQyLCAweDgyLCAweGJmLCAweDY5LCAweGQxLCAweGZkLAorCTB4N2UsIDB4YjUsIDB4MmUsIDB4M2UsIDB4YWMsIDB4MmUsIDB4YTIsIDB4NGIsIDB4YzMsIDB4ZWYsIDB4OGIsIDB4MmMsCisJMHg0MywgMHg4NywgMHg3ZCwgMHg0ZCwgMHg4MSwgMHg2NiwgMHg3OCwgMHhkMCwgMHg5ZCwgMHhiYSwgMHgwMiwgMHgzMSwKKwkweDZmLCAweDZkLCAweGViLCAweDBlLCAweGI1LCAweGY2LCAweDhjLCAweGE5LCAweGVhLCAweDEzLCAweDJkLCAweGFhLAorCTB4NjUsIDB4ZmQsIDB4NzIsIDB4ZTEsIDB4M2IsIDB4OTYsIDB4N2YsIDB4YmEsIDB4NjUsIDB4MmQsIDB4NTgsIDB4MjgsCisJMHg3ZCwgMHhmYSwgMHg1MSwgMHgxNSwgMHgzMSwgMHhiMSwgMHhkMiwgMHg5ZSwgMHhjMywgMHg1MiwgMHg5YywgMHgxYSwKKwkweGFjLCAweDY2LCAweDFmLCAweDFhLCAweGZlLCAweGY1LCAweDcyLCAweDNkLCAweGI4LCAweDRlLCAweDJkLCAweGM1LAorCTB4OWIsIDB4MjMsIDB4YTUsIDB4MzgsIDB4YzksIDB4ZjEsIDB4ZmMsIDB4ZTcsIDB4YTAsIDB4MGYsIDB4YmYsIDB4MWUsCisJMHhiNCwgMHhhYywgMHgyZiwgMHg5OSwgMHg3ZiwgMHg4OSwgMHg4MSwgMHhlYSwgMHg3ZSwgMHhmYywgMHhkMywgMHhiOCwKKwkweDE3LCAweGJmLCAweGUwLCAweGRjLCAweGJjLCAweDkxLCAweDg4LCAweGRlLCAweDM1LCAweDBkLCAweDdhLCAweDc0LAorCTB4NWMsIDB4MzksIDB4ZjYsIDB4ZDUsIDB4MGEsIDB4ZDQsIDB4YjUsIDB4NTQsIDB4MjgsIDB4N2EsIDB4ZjMsIDB4NzYsCisJMHhlOCwgMHhiZSwgMHg0YiwgMHgxNCwgMHgyZiwgMHg0ZSwgMHhhNywgMHgzNSwgMHhmYywgMHgzNCwgMHg1ZCwgMHgxYiwKKwkweGZlLCAweDIxLCAweGZiLCAweGZjLCAweGFkLCAweGY5LCAweDg0LCAweDk1LCAweDlkLCAweDJlLCAweDdhLCAweDEzLAorCTB4MWQsIDB4NTEsIDB4Y2YsIDB4MjksIDB4ZWEsIDB4MzksIDB4NDUsIDB4M2QsIDB4YTcsIDB4YTgsIDB4NjcsIDB4Y2EsCisJMHg3MCwgMHgzMCwgMHg0NSwgMHgzZCwgMHg1MywgMHg3NywgMHhkZiwgMHhhMiwgMHg0ZCwgMHgzZCwgMHhjZSwgMHg3OSwKKwkweDNjLCAweDYwLCAweGNmLCAweDYzLCAweDk4LCAweGYzLCAweGY1LCAweDE3LCAweGY4LCAweDVmLCAweDM2LCAweGI2LAorCTB4M2UsIDB4NmYsIDB4ZmQsIDB4YWQsIDB4NTcsIDB4YzYsIDB4ZDQsIDB4M2QsIDB4M2QsIDB4ODcsIDB4NWYsIDB4MzIsCisJMHhiNiwgMHhlNywgMHhhYywgMHg5OCwgMHgyNiwgMHhlMywgMHg5MiwgMHhmMSwgMHhkOSwgMHhmYSwgMHhmMywgMHg2ZiwKKwkweDU0LCAweGI2LCAweDI4LCAweDI4LCAweGI1LCAweGFjLCAweDlkLCAweDY2LCAweGZlLCAweGJlLCAweGI3LCAweDMwLAorCTB4YmUsIDB4MWIsIDB4OTQsIDB4OWMsIDB4NWQsIDB4ZWQsIDB4NzQsIDB4NTMsIDB4ZGYsIDB4YzEsIDB4YTgsIDB4YmEsCisJMHg4YywgMHhlNywgMHg3YSwgMHgzYywgMHg4YSwgMHhiOSwgMHhjNSwgMHhlNywgMHg5ZiwgMHg1ZiwgMHg1YiwgMHgyMywKKwkweGYzLCAweGUxLCAweDNmLCAweDdiLCAweDRlLCAweDdiLCAweGI0LCAweGZiLCAweGJiLCAweDhkLCAweGU3LCAweDMyLAorCTB4MTYsIDB4YjEsIDB4NDUsIDB4YjEsIDB4MDEsIDB4MmYsIDB4ZWQsIDB4ZTUsIDB4ZjIsIDB4ZmMsIDB4M2QsIDB4YzQsCisJMHhkNSwgMHhjOCwgMHg0NiwgMHhiNCwgMHgzNCwgMHgzYywgMHg2YSwgMHhmNywgMHg1MSwgMHg5NCwgMHgxNCwgMHhiZiwKKwkweDUxLCAweGYwLCAweGNlLCAweDE1LCAweDBhLCAweDhlLCAweDg2LCAweDBjLCAweGRhLCAweGNjLCAweDEwLCAweDcxLAorCTB4MDEsIDB4MjgsIDB4NGUsIDB4YzIsIDB4ZWQsIDB4ODksIDB4NDQsIDB4OTAsIDB4ZTgsIDB4ODMsIDB4YmIsIDB4MjQsCisJMHgxMiwgMHhjNiwgMHhmYywgMHhiZSwgMHhkYSwgMHhmNiwgMHg1MywgMHhkMCwgMHg4MywgMHg3ZCwgMHg4YSwgMHhkZSwKKwkweDAyLCAweGQ0LCAweDk5LCAweDYzLCAweGQ0LCAweGUzLCAweDI1LCAweDhhLCAweGVlLCAweDJmLCAweDUyLCAweGUwLAorCTB4NTYsIDB4NTgsIDB4MmUsIDB4OTAsIDB4MWUsIDB4YzIsIDB4OTYsIDB4OGMsIDB4ZmMsIDB4MGUsIDB4YzMsIDB4NDgsCisJMHhmZiwgMHhiNiwgMHhkMCwgMHgxNywgMHhlZCwgMHg3ZSwgMHgyMywgMHhlZCwgMHhmZSwgMHgxNCwgMHhjNywgMHhhZSwKKwkweGZiLCAweDg5LCAweGFmLCAweDZlLCAweDU3LCAweGE0LCAweDFkLCAweDdiLCAweDEzLCAweDcwLCAweDE3LCAweDQ1LAorCTB4MzYsIDB4ZTAsIDB4YTksIDB4NDQsIDB4ZjUsIDB4ZjQsIDB4NDIsIDB4MzksIDB4ODUsIDB4ZTUsIDB4ZmMsIDB4ZTksCisJMHhhOSwgMHhiMiwgMHhiYywgMHg2NiwgMHg0NSwgMHhiZCwgMHgzOSwgMHg1OSwgMHg0YSwgMHg5MywgMHg0MywgMHhkOCwKKwkweDllLCAweDkyLCAweGJhLCAweDExLCAweGJiLCAweGFlLCAweDkzLCAweDdkLCAweGY0LCAweDI0LCAweDZhLCAweDliLAorCTB4YWYsIDB4NTUsIDB4ZjQsIDB4ZjAsIDB4MjMsIDB4YTgsIDB4OGIsIDB4YmUsIDB4Y2QsIDB4MzksIDB4ZWMsIDB4ODIsCisJMHg3ZSwgMHhhNiwgMHgxZCwgMHgzOSwgMHg1OSwgMHhlNiwgMHhhNSwgMHg3MywgMHg3MiwgMHgyYywgMHg0ZSwgMHg0MywKKwkweGI5LCAweDI5LCAweDA1LCAweDhmLCAweGNmLCAweDk4LCAweDk2LCAweGY3LCAweDY1LCAweDI4LCAweGQ3LCAweDcxLAorCTB4ZmUsIDB4NTQsIDB4YzMsIDB4OGYsIDB4ZWIsIDB4NjgsIDB4NDMsIDB4MWIsIDB4NzYsIDB4NWEsIDB4ZTgsIDB4MGUsCisJMHg1NSwgMHhkMywgMHg1NywgMHg1YiwgMHg1MCwgMHg0MSwgMHhiZiwgMHhiYywgMHg1MywgMHg0MywgMHhiNCwgMHgzMiwKKwkweDEyLCAweDU2LCAweGFlLCAweGNmLCAweDBjLCAweGU3LCAweGY1LCAweDdmLCAweGI0LCAweDlhLCAweGYyLCAweDI5LAorCTB4NGQsIDB4YTksIDB4MGIsIDB4YWYsIDB4NTcsIDB4ZTYsIDB4ZTMsIDB4ZGUsIDB4ODUsIDB4ZDcsIDB4M2QsIDB4NDUsCisJMHgxZiwgMHg1ZiwgMHhiZSwgMHg0ZSwgMHgxYiwgMHg4MSwgMHhjMiwgMHg3OCwgMHg1MywgMHg0MiwgMHhmZCwgMHhlYSwKKwkweDI2LCAweGFiLCAweDA1LCAweDVkLCAweGY2LCAweDM1LCAweDA3LCAweDg2LCAweDljLCAweDUxLCAweDlmLCAweDAzLAorCTB4MWYsIDB4NTgsIDB4ZDEsIDB4NTUsIDB4NzIsIDB4YWQsIDB4MTQsIDB4YjEsIDB4OTYsIDB4M2EsIDB4OWYsIDB4MTMsCisJMHg3NSwgMHhlMSwgMHg0ZCwgMHhmNCwgMHhiNywgMHhjOSwgMHg1NSwgMHg4ZCwgMHhiYywgMHgxNywgMHgzMCwgMHg4ZiwKKwkweGExLCAweGQ2LCAweGJmLCAweDA5LCAweGYyLCAweGZiLCAweDdkLCAweGRhLCAweDQ4LCAweGEzLCAweGQ0LCAweDY1LAorCTB4MTksIDB4YjEsIDB4MzksIDB4NWQsIDB4M2IsIDB4MDYsIDB4MmYsIDB4MzYsIDB4ZDEsIDB4ZmUsIDB4OGEsIDB4MjMsCisJMHhiYSwgMHhiOSwgMHhjYywgMHhlMSwgMHhjNCwgMHg3ZSwgMHhlMiwgMHhiOCwgMHhjMywgMHhlOCwgMHg0NSwgMHgzMSwKKwkweGM3LCAweGM4LCAweGY4LCAweDhhLCAweDQ3LCAweDEyLCAweGMwLCAweGIzLCAweGZkLCAweDE2LCAweDFhLCAweDQzLAorCTB4MWUsIDB4MmMsIDB4YjEsIDB4NmQsIDB4ZjMsIDB4OTAsIDB4NzIsIDB4NzUsIDB4ZWEsIDB4NDMsIDB4NmIsIDB4YzgsCisJMHg1OSwgMHgxMiwgMHg1NSwgMHgyMywgMHgwMSwgMHhkZiwgMHg0OSwgMHhiMiwgMHg4MSwgMHhhMiwgMHg0OCwgMHg5ZCwKKwkweGU2LCAweDQ0LCAweDVjLCAweDY5LCAweGNlLCAweGY0LCAweDI4LCAweGNiLCAweDMzLCAweGJkLCAweGNhLCAweDkyLAorCTB4OGMsIDB4YjQsIDB4N2QsIDB4NDgsIDB4NTksIDB4OWEsIDB4ZjEsIDB4MjAsIDB4ZGQsIDB4YWYsIDB4NjAsIDB4N2IsCisJMHg4OCwgMHg3MiwgMHhkNSwgMHhlNCwgMHhlYywgMHgzOCwgMHhkMywgMHhhZiwgMHgxMiwgMHg2MywgMHhkZiwgMHgyMSwKKwkweGM2LCAweGVhLCAweDYxLCAweGIwLCAweGVmLCAweDI3LCAweDEyLCAweGQ1LCAweDM4LCAweDQ0LCAweDJjLCAweGZkLAorCTB4NzEsIDB4NWEsIDB4NTcsIDB4NTEsIDB4N2EsIDB4MTEsIDB4NWUsIDB4MTksIDB4YTksIDB4YzAsIDB4ZDgsIDB4YTAsCisJMHhjOSwgMHhkZiwgMHhmNSwgMHg3OCwgMHg2MSwgMHhjNCwgMHhiMiwgMHg3YSwgMHg0YywgMHhjYiwgMHhkYSwgMHg2YiwKKwkweDFlLCAweDUyLCAweDFhLCAweGQ5LCAweDY3LCAweGQ0LCAweDE5LCAweDhmLCAweDE2LCAweDQ3LCAweDAyLCAweGU2LAorCTB4MTYsIDB4ZjYsIDB4ZTksIDB4ODgsIDB4YzQsIDB4OTUsIDB4MjgsIDB4ZmIsIDB4YmIsIDB4OWEsIDB4ZmQsIDB4MmQsCisJMHhjZCwgMHhmNywgMHg5NywgMHhlYiwgMHg1NywgMHg2NCwgMHg5MSwgMHg3YSwgMHg4NSwgMHgzYSwgMHg2MSwgMHhkNiwKKwkweDAxLCAweGY2LCAweDI1LCAweDAyLCAweGMxLCAweDQyLCAweGJkLCAweGE1LCAweGFjLCAweDczLCAweGY1LCAweGQ5LAorCTB4M2EsIDB4YzAsIDB4NzAsIDB4MjIsIDB4YzgsIDB4MzksIDB4MTUsIDB4NWIsIDB4ZjcsIDB4MzMsIDB4NzYsIDB4N2QsCisJMHg4MywgMHgxOCwgMHhkYiwgMHg4MCwgMHhiNiwgMHg2MSwgMHhjMSwgMHhkZiwgMHg2YiwgMHhkNCwgMHhkYywgMHgzYywKKwkweGU1LCAweGIwLCAweDU2LCAweDYyLCAweDVlLCAweDBlLCAweDZmLCAweDgzLCAweGU4LCAweGEzLCAweDVmLCAweDc3LAorCTB4YTUsIDB4YzQsIDB4YzYsIDB4ZWYsIDB4ZjksIDB4NzIsIDB4MjIsIDB4YTAsIDB4ZTAsIDB4YjEsIDB4NDAsIDB4YjYsCisJMHhhNSwgMHgxYywgMHg5NSwgMHg2OCwgMHgwZiwgMHg4OSwgMHg2ZCwgMHg2ZSwgMHhmYywgMHhmMiwgMHg1MywgMHg4NiwKKwkweDFlLCAweDVlLCAweGExLCAweDcwLCAweGNlLCAweDAyLCAweDdhLCAweGYzLCAweDUyLCAweDA1LCAweDA4LCAweDhjLAorCTB4MDEsIDB4NmYsIDB4YTQsIDB4MmIsIDB4YjEsIDB4ZGEsIDB4NzQsIDB4NDAsIDB4YWQsIDB4MGEsIDB4YTIsIDB4MzcsCisJMHgzMywgMHgzNSwgMHgyZSwgMHg5OCwgMHhjNCwgMHg3OCwgMHg2OSwgMHgyZiwgMHg0OCwgMHhiZiwgMHgyZSwgMHhjMywKKwkweDMyLCAweDJkLCAweDY3LCAweGQzLCAweDZlLCAweGI2LCAweGVkLCAweDBlLCAweDY0LCAweDgzLCAweDJhLCAweGUzLAorCTB4ZGQsIDB4N2UsIDB4NWUsIDB4MzgsIDB4NDYsIDB4ZmMsIDB4NmYsIDB4MzQsIDB4NWMsIDB4YzQsIDB4ZmYsIDB4NGEsCisJMHgzNCwgMHg5YSwgMHhiZiwgMHhiMywgMHg5NiwgMHhhZCwgMHg5MiwgMHg3YiwgMHg4NSwgMHg3NiwgMHhlMCwgMHgyZSwKKwkweDY2LCAweGJmLCAweDZmLCAweDE5LCAweGJhLCAweDdmLCAweDk0LCAweDI3LCAweGQ5LCAweDc0LCAweGVlLCAweDdhLAorCTB4OWMsIDB4MzEsIDB4YWIsIDB4OWIsIDB4ZWQsIDB4NmUsIDB4NjYsIDB4YmIsIDB4ZWIsIDB4MzQsIDB4M2QsIDB4MWEsCisJMHgzZiwgMHg1YiwgMHgyZSwgMHgxYiwgMHg3NCwgMHg0MCwgMHhkNywgMHhhNCwgMHg2YywgMHgxMywgMHhkYiwgMHg1ZCwKKwkweGNkLCAweDc2LCAweDdiLCAweDM1LCAweDkxLCAweGVmLCAweDc3LCAweGQ2LCAweGJhLCAweDU1LCAweDcyLCAweDJmLAorCTB4NjcsIDB4MWYsIDB4YjksIDB4NzYsIDB4ZWYsIDB4OTEsIDB4NzYsIDB4Y2QsIDB4ZDEsIDB4N2MsIDB4NWYsIDB4NDcsCisJMHgxMywgMHhlOCwgMHg3NywgMHg0NCwgMHgxOCwgMHg2MywgMHgxYiwgMHgwMiwgMHhmZSwgMHgyZSwgMHhjNiwgMHhkYiwKKwkweDI2LCAweGM2LCAweDhlLCAweDljLCAweDRkLCAweDRjLCAweDhkLCAweDc3LCAweDg4LCAweDlmLCAweDJiLCAweDIzLAorCTB4ZDcsIDB4YTQsIDB4OWMsIDB4ZDgsIDB4ZGEsIDB4MjQsIDB4ZjUsIDB4MmMsIDB4ZjEsIDB4YzUsIDB4NDcsIDB4ZmQsCisJMHgwYSwgMHhiNiwgMHgzOCwgMHg3MSwgMHgyMCwgMHg0MSwgMHhmYywgMHhjNywgMHgzNywgMHg2OCwgMHg3NywgMHg3ZSwKKwkweGI0LCAweDY0LCAweDZhLCAweGIxLCAweDY2LCAweDI3LCAweGUzLCAweGEwLCAweDU5LCAweDQ1LCAweDViLCAweGNmLAorCTB4ZDksIDB4ZGIsIDB4MzIsIDB4YjYsIDB4M2QsIDB4NjksIDB4YjcsIDB4MWQsIDB4NTcsIDB4NWEsIDB4MzIsIDB4NzUsCisJMHg1YSwgMHgxNSwgMHg2MywgMHhlZSwgMHg5MSwgMHhiMywgMHhkOCwgMHgzOSwgMHgyNywgMHg1YSwgMHgxYSwgMHgwOSwKKwkweDM0LCAweGFmLCAweGU3LCAweDI0LCAweGI5LCAweDE5LCAweGRmLCAweGJlLCAweDM3LCAweGFmLCAweDg3LCAweDc2LAorCTB4ZDEsIDB4NGIsIDB4M2IsIDB4Y2MsIDB4Y2QsIDB4NmYsIDB4NzMsIDB4NjYsIDB4OGYsIDB4MmEsIDB4MTgsIDB4MDcsCisJMHhiNSwgMHgxNiwgMHhlYiwgMHg3NiwgMHhjYSwgMHg3ZiwgMHg3MiwgMHg5NSwgMHg4NiwgMHhjNywgMHg3OCwgMHhhZCwKKwkweDE2LCAweGFiLCAweDg3LCAweGJmLCAweDQ3LCAweDNiLCAweGQzLCAweDdkLCAweDYyLCAweDg3LCAweDVkLCAweDY3LAorCTB4ZTUsIDB4MTIsIDB4OTksIDB4NDQsIDB4MzYsIDB4OTEsIDB4YTksIDB4OGYsIDB4ZTUsIDB4NjYsIDB4NTEsIDB4M2YsCisJMHg4MiwgMHg4ZCwgMHhkNSwgMHg5NCwgMHg2NywgMHgyYiwgMHhmOSwgMHhkMCwgMHgyMSwgMHhlNSwgMHhmMywgMHg5NCwKKwkweDI3LCAweGViLCAweGYyLCAweGUyLCAweGExLCAweDk0LCAweGM4LCAweGEzLCAweDQ0LCAweDY3LCAweDQ2LCAweDY2LAorCTB4ZTEsIDB4NGMsIDB4MmEsIDB4MTAsIDB4N2YsIDB4MDIsIDB4MjIsIDB4NWIsIDB4OGYsIDB4ZDIsIDB4MmEsIDB4ZjUsCisJMHg1MywgMHhiZCwgMHhiYywgMHg1NywgMHg5MCwgMHgxMSwgMHg1YSwgMHhhNSwgMHgyZCwgMHg1YiwgMHg0ZSwgMHhhNiwKKwkweGViLCAweDM5LCAweGQ3LCAweDJlLCAweGUzLCAweDZmLCAweGNiLCAweDUxLCAweGUxLCAweGE0LCAweGFkLCAweDQ5LAorCTB4ZGIsIDB4ZmYsIDB4NjEsIDB4NDUsIDB4YjUsIDB4NmUsIDB4NWUsIDB4ZjMsIDB4NzIsIDB4OWUsIDB4ZGMsIDB4ZTQsCisJMHgwNSwgMHg3YSwgMHhmMCwgMHgzYSwgMHg4NywgMHhkMiwgMHhlMiwgMHg5MSwgMHg3OCwgMHg0ZCwgMHhmYiwgMHg0YywKKwkweGE3LCAweDlkLCAweDM4LCAweDllLCAweDU4LCAweGJhLCAweGI0LCAweGNjLCAweGY4LCAweDM0LCAweDFlLCAweDFiLAorCTB4ZjEsIDB4NjEsIDB4ODQsIDB4NzMsIDB4ZmIsIDB4NmMsIDB4NDIsIDB4ZTIsIDB4ZWIsIDB4MmMsIDB4M2MsIDB4OWEsCisJMHhmNiwgMHhlMCwgMHg5OSwgMHg4NCwgMHgxZiwgMHg4ZiwgMHgzMCwgMHhmZSwgMHg0YywgMHgyNCwgMHgwYywgMHhlYywKKwkweDRmLCAweDdiLCAweGYxLCAweDM0LCAweGVkLCAweDc5LCAweDM0LCAweGVkLCAweGEzLCAweGJkLCAweGQ0LCAweDYzLAorCTB4MzgsIDB4ZGQsIDB4NjYsIDB4OGYsIDB4ZTEsIDB4YzksIDB4YzQsIDB4YmYsIDB4Y2IsIDB4NTgsIDB4ODMsIDB4MzIsCisJMHhkNiwgMHhjZCwgMHhmNiwgMHg1OCwgMHgwYiwgMHg3MSwgMHg3ZSwgMHhkNiwgMHhkOSwgMHg3OSwgMHgzOCwgMHg5MSwKKwkweGIwLCAweDcxLCAweGEwLCAweDc3LCAweDk5LCAweDQzLCAweGU2LCAweDgxLCAweDM2LCAweDNiLCAweDIwLCAweDU4LAorCTB4YTAsIDB4ZjcsIDB4YzcsIDB4NjEsIDB4NjEsIDB4OGYsIDB4MzksIDB4OTMsIDB4ZmUsIDB4ZGYsIDB4NGIsIDB4NzksCisJMHhhOSwgMHg1MywgMHg4ZSwgMHgxZiwgMHhhZSwgMHg4YSwgMHg2OCwgMHg3OSwgMHgyNCwgMHgxMCwgMHhlYiwgMHhhMywKKwkweGRlLCAweDlkLCAweDExLCAweGQxLCAweDQzLCAweDRlLCAweGVmLCAweDJiLCAweDMyLCAweDg3LCAweDE0LCAweGUxLAorCTB4N2EsIDB4OTcsIDB4MGMsIDB4YzQsIDB4YWQsIDB4MzIsIDB4NDMsIDB4ZjQsIDB4MWQsIDB4MjAsIDB4Y2UsIDB4MDIsCisJMHhmMywgMHhmNywgMHgzOCwgMHgzOSwgMHhiZSwgMHg5YiwgMHgzOCwgMHg2NiwgMHgxMywgMHg0NSwgMHg0NiwgMHg5ZCwKKwkweDU2LCAweDRkLCAweGQ5LCAweDhmLCAweDdjLCAweDI0LCAweDA2LCAweDhhLCAweDhlLCAweGZlLCAweDM2LCAweDNmLAorCTB4NWYsIDB4YmEsIDB4ODMsIDB4ZjIsIDB4ZmEsIDB4ODEsIDB4YzIsIDB4YmMsIDB4NTgsIDB4ZDYsIDB4MGUsIDB4YjMsCisJMHgzMCwgMHgzNywgMHgzNSwgMHhmMCwgMHg1NywgMHhlYiwgMHhmMSwgMHgyMSwgMHg1YSwgMHhjNCwgMHg0OCwgMHg2MiwKKwkweDFhLCAweGUyLCAweDlhLCAweDlhLCAweDZmLCAweDNiLCAweGFhLCAweDE0LCAweDMxLCAweGZmLCAweGMwLCAweGI4LAorCTB4ZjgsIDB4N2UsIDB4MzksIDB4YTIsIDB4NGUsIDB4YTksIDB4OGYsIDB4NjgsIDB4NTEsIDB4MjQsIDB4MTAsIDB4OWMsCisJMHhhYiwgMHg0ZSwgMHhiNSwgMHgxOSwgMHhjMSwgMHgwMSwgMHhlOSwgMHgyYiwgMHg0ZSwgMHg1OSwgMHhjZiwgMHhjNywKKwkweDgyLCAweDkxLCAweDQ0LCAweDAxLCAweDM3LCAweGZlLCAweDNiLCAweGY1LCAweDJlLCAweGQ0LCAweGE5LCAweGM4LAorCTB4MjksIDB4N2EsIDB4NTUsIDB4NzEsIDB4NzQsIDB4NTAsIDB4ZjQsIDB4ZTcsIDB4YzQsIDB4NGEsIDB4NzMsIDB4N2EsCisJMHg1ZSwgMHhlNiwgMHg1OSwgMHg5YywgMHgxNywgMHg2MiwgMHgwZSwgMHhlNywgMHhlYiwgMHg4NSwgMHg3ZSwgMHgyZiwKKwkweGU1LCAweGI2LCAweDkwLCAweDBlLCAweDVkLCAweDhjLCAweDRkLCAweDM2LCAweGU3LCAweDVjLCAweDk1LCAweGNmLAorCTB4NWIsIDB4MzgsIDB4NGYsIDB4ZWEsIDB4NzYsIDB4ZWEsIDB4ZmEsIDB4YjMsIDB4OGUsIDB4ZGMsIDB4NzksIDB4OWQsCisJMHhlZiwgMHhhMywgMHhmYSwgMHhkMiwgMHhiNSwgMHgxOCwgMHgwYSwgMHgzYSwgMHgwMywgMHg4NiwgMHhkMiwgMHg4OCwKKwkweGI5LCAweDIzLCAweGY1LCAweDRkLCAweGNlLCAweGJlLCAweGI2LCAweDBkLCAweGY0LCAweGVmLCAweDdiLCAweDRmLAorCTB4MzUsIDB4N2MsIDB4MTYsIDB4OWIsIDB4YTksIDB4MTcsIDB4YTcsIDB4NmQsIDB4NjcsIDB4NTEsIDB4YzUsIDB4NjUsCisJMHgyYywgMHhiMSwgMHhmZCwgMHg0OSwgMHgxZCwgMHg1ZiwgMHg5MSwgMHhlZiwgMHgyMywgMHg2YSwgMHhlNywgMHgyYywKKwkweDUwLCAweDViLCAweGYyLCAweGU3LCAweDc3LCAweDUzLCAweGRmLCAweDMyLCAweDBlLCAweDE1LCAweDNmLCAweDIwLAorCTB4OTcsIDB4N2QsIDB4MjcsIDB4ZjQsIDB4NTksIDB4NjQsIDB4NmQsIDB4Y2MsIDB4NzYsIDB4ZDIsIDB4ZGYsIDB4YWYsCisJMHg2MiwgMHg1ZCwgMHhlMiwgMHhkZiwgMHhiOCwgMHhjNCwgMHg1MiwgMHhjNCwgMHg0YiwgMHhlOCwgMHhkNywgMHg0NSwKKwkweGY0LCAweGQ1LCAweDZiLCAweDMyLCAweGY3LCAweGEwLCAweDNkLCAweDE1LCAweDA4LCAweDk3LCAweDI4LCAweGY3LAorCTB4ZTAsIDB4ZDYsIDB4OGMsIDB4MGIsIDB4YjEsIDB4NjEsIDB4MGYsIDB4ZDYsIDB4NTEsIDB4MjcsIDB4Y2UsIDB4YTQsCisJMHhmOCwgMHhiOSwgMHg4NiwgMHg3NSwgMHhhMywgMHg0NywgMHg2NywgMHgzYSwgMHhlOSwgMHgzNywgMHhlYiwgMHg0NiwKKwkweGJkLCAweDNjLCAweGE2LCAweGYzLCAweDcwLCAweDYzLCAweDM1LCAweDhmLCAweDNkLCAweGI0LCAweGNiLCAweDM2LAorCTB4YzYsIDB4ODYsIDB4MjMsIDB4MDksIDB4MTMsIDB4OWQsIDB4ZDQsIDB4ZDUsIDB4MTMsIDB4ODksIDB4MDYsIDB4ZGMsCisJMHg0YiwgMHhiZCwgMHgxZCwgMHg0YSwgMHg3YywgMHg4YSwgMHgzYSwgMHgwYSwgMHhhMywgMHg4MywgMHg3MywgMHhmYywKKwkweDU4LCAweDQyLCAweGI1LCAweGYzLCAweGFiLCAweGRiLCAweDMzLCAweGZmLCAweDYyLCAweDQ1LCAweGE3LCAweDhiLAorCTB4OWMsIDB4YTIsIDB4MGIsIDB4OTksIDB4Y2YsIDB4OGYsIDB4ZTgsIDB4ODEsIDB4ZmUsIDB4M2IsIDB4NTUsIDB4MTcsCisJMHhmNSwgMHhkOCwgMHhiNiwgMHhjYiwgMHhjMCwgMHhmNiwgMHg1ZCwgMHg3NSwgMHhiNCwgMHhiYiwgMHg4YywgMHhlNSwKKwkweGFmLCAweDFhLCAweGEwLCAweDBlLCAweGE2LCAweGVhLCAweGUxLCAweDA4LCAweDc5LCAweDgxLCAweGU4LCAweDQxLAorCTB4ZGEsIDB4YmMsIDB4OGYsIDB4NjMsIDB4ZWUsIDB4ZTYsIDB4M2QsIDB4MWYsIDB4MWUsIDB4NGYsIDB4N2MsIDB4OTcsCisJMHhiZiwgMHhjMywgMHhjYSwgMHg1ZCwgMHgxOSwgMHhmMSwgMHg3OSwgMHhmMSwgMHhiNywgMHg3ZiwgMHg3MCwgMHhlNCwKKwkweDYyLCAweDZmLCAweGExLCAweGRjLCAweDE2LCAweDk2LCAweGIzLCAweGFjLCAweGNkLCAweDY3LCAweGUzLCAweDRhLAorCTB4NTEsIDB4YjQsIDB4ODQsIDB4NzEsIDB4NjUsIDB4N2YsIDB4MjIsIDB4MTAsIDB4N2UsIDB4YzYsIDB4OGUsIDB4N2QsCisJMHg0ZSwgMHhkYSwgMHg4ZSwgMHhkOCwgMHg0NywgMHg4ZiwgMHg2ZCwgMHgxYiwgMHhjYiwgMHhjZSwgMHhkYSwgMHhjNiwKKwkweGU0LCAweDU5LCAweDBlLCAweGQ1LCAweDlmLCAweDlhLCAweGVhLCAweDczLCAweDM5LCAweGJiLCAweDcwLCAweDI2LAorCTB4ZjUsIDB4NWUsIDB4ZGIsIDB4OGUsIDB4ZDMsIDB4ODIsIDB4OGYsIDB4MGUsIDB4MzgsIDB4MDYsIDB4OWMsIDB4NjgsCisJMHgzMywgMHgyZiwgMHhhNSwgMHhiZSwgMHhhYiwgMHgxOSwgMHg2ZiwgMHg4YSwgMHg3OCwgMHgzMCwgMHg0ZiwgMHgxZCwKKwkweGZlLCAweDBiLCAweDk0LCAweDBlLCAweDY0LCAweGFkLCAweDEyLCAweGZlLCAweDZlLCAweDBlLCAweDg5LCAweGJlLAorCTB4YWYsIDB4YzIsIDB4YWQsIDB4YzMsIDB4MGUsIDB4MTQsIDB4MGQsIDB4MjgsIDB4NzgsIDB4ZDIsIDB4YWMsIDB4YzcsCisJMHg5MCwgMHgzNywgMHg4NywgMHhiYiwgMHg2YSwgMHhmMiwgMHg1MiwgMHg3YiwgMHg5ZSwgMHgyZSwgMHgxZSwgMHgzZiwKKwkweGZhLCAweDhjLCAweGM0LCAweDg1LCAweDdiLCAweDQ3LCAweDNkLCAweGYwLCAweDI1LCAweDE1LCAweDc4LCAweDg4LAorCTB4MmIsIDB4NjUsIDB4NDYsIDB4M2QsIDB4ZjUsIDB4YWEsIDB4YTEsIDB4MzIsIDB4NjksIDB4ZTIsIDB4NmIsIDB4MTksCisJMHhkMiwgMHhhNiwgMHgwNywgMHhjMiwgMHhiOCwgMHg5MywgMHhmMywgMHg1MiwgMHhmZSwgMHhjMCwgMHg5NSwgMHhiOCwKKwkweDgzLCAweGU1LCAweDM2LCAweGYwLCAweGRlLCAweDg2LCAweGQxLCAweDZhLCAweDFlLCAweDVlLCAweDFlLCAweGQzLAorCTB4NzksIDB4MzQsIDB4ZTAsIDB4ZjYsIDB4ZTEsIDB4NWEsIDB4NDQsIDB4YWIsIDB4ZjUsIDB4YTAsIDB4NWYsIDB4NzUsCisJMHhhMCwgMHg3YSwgMHg0MCwgMHhmNCwgMHhhZSwgMHg2MiwgMHhlNSwgMHgwMiwgMHgwNSwgMHhlNiwgMHhhNywgMHg4YiwKKwkweGExLCAweGNlLCAweGZkLCAweDM4LCAweGRmLCAweGZkLCAweDUzLCAweGIyLCAweGJlLCAweDZjLCAweDBkLCAweGQ5LAorCTB4OTgsIDB4MmUsIDB4M2EsIDB4MTYsIDB4M2IsIDB4ZjksIDB4NTcsIDB4Y2UsIDB4ODUsIDB4YzgsIDB4MmIsIDB4N2QsCisJMHg0OCwgMHhhYywgMHgxNSwgMHgxZCwgMHg3ZiwgMHgxMiwgMHgzNiwgMHgzMCwgMHhiMiwgMHg1NCwgMHg3NCwgMHhiMSwKKwkweGNjLCAweDQ3LCAweDdkLCAweDAxLCAweDY3LCAweGU3LCAweDdmLCAweDJhLCAweDY3LCAweDk1LCAweGI4LCAweGFmLAorCTB4ODcsIDB4ODcsIDB4NmMsIDB4OGUsIDB4ZTMsIDB4NjcsIDB4YmUsIDB4YTgsIDB4YzcsIDB4NDUsIDB4ZTcsIDB4ZTQsCisJMHgzNCwgMHg2ZSwgMHhkNSwgMHg4MCwgMHhiZiwgMHhjOCwgMHhiOCwgMHgxOSwgMHhiNywgMHg3MSwgMHg5ZSwgMHhmNiwKKwkweDI2LCAweGQ0LCAweGE1LCAweDJlLCAweGE4LCAweGIzLCAweDVjLCAweDRjLCAweDljLCAweDQ3LCAweDRjLCAweDFkLAorCTB4ZWQsIDB4YzMsIDB4Y2MsIDB4YjUsIDB4ODYsIDB4Y2IsIDB4ZDEsIDB4YTUsIDB4MjksIDB4ZWUsIDB4NmQsIDB4ZjUsCisJMHg4YiwgMHgyNCwgMHhhNywgMHhmNiwgMHg1NywgMHgxYSwgMHg1MCwgMHhjYiwgMHgxOCwgMHhmZiwgMHhiNywgMHg2YiwKKwkweDcwLCAweDE2LCAweDE5LCAweDhhLCAweDlhLCAweGE4LCAweDZmLCAweDQyLCAweGJjLCAweDBhLCAweGNlLCAweDBhLAorCTB4MDMsIDB4MGEsIDB4NzMsIDB4NjYsIDB4ZjQsIDB4NjksIDB4MTAsIDB4ZWMsIDB4ODksIDB4MTYsIDB4MTksIDB4ZjcsCisJMHhlMCwgMHhiNiwgMHgxNCwgMHhhYywgMHhkMiwgMHgwOCwgMHhmMywgMHhhMSwgMHg4OCwgMHg0MSwgMHg4ZSwgMHgxYiwKKwkweGYwLCAweDE1LCAweGQxLCAweDNmLCAweDU2LCAweDkzLCAweDU3LCAweGFjLCAweDFkLCAweDE2LCAweDM5LCAweDNjLAorCTB4ZTQsIDB4MWIsIDB4ODYsIDB4YmYsIDB4MGQsIDB4Y2MsIDB4ZTEsIDB4NWIsIDB4ZjQsIDB4ZTAsIDB4MjQsIDB4ZjMsCisJMHhkOCwgMHhkNSwgMHhkNCwgMHhmZCwgMHg0OCwgMHhlMiwgMHgxZSwgMHgzNCwgMHhhNiwgMHg4ZSwgMHg1OCwgMHgxZSwKKwkweGYyLCAweGM4LCAweDIyLCAweGEzLCAweGY2LCAweDRjLCAweDE3LCAweDYyLCAweGY0LCAweDBkLCAweGUxLCAweDQ3LAorCTB4NmIsIDB4ZTgsIDB4MWIsIDB4M2UsIDB4NjQsIDB4MTIsIDB4ZWEsIDB4NzEsIDB4YjIsIDB4MGIsIDB4NzQsIDB4OGMsCisJMHhhZSwgMHhjNywgMHhkNywgMHg0NiwgMHg2NywgMHg2MSwgMHgzYywgMHhiMSwgMHgwMSwgMHg3NywgMHg2NiwgMHhjOCwKKwkweDk1LCAweGZhLCAweGFmLCAweGMyLCAweDFkLCAweGMzLCAweDU3LCAweGUxLCAweGY2LCAweDlkLCAweDQ2LCAweDcwLAorCTB4MDMsIDB4NzUsIDB4YmQsIDB4NzYsIDB4OTgsIDB4ODEsIDB4NzIsIDB4YmEsIDB4YjQsIDB4NWIsIDB4ZDAsIDB4OTUsCisJMHhmMCwgMHg0NSwgMHhlYSwgMHgyMiwgMHhhZiwgMHhhNywgMHgyYywgMHgwYSwgMHgxYywgMHhlNiwgMHg1ZiwgMHgyZCwKKwkweDVlLCAweDhhLCAweDE3LCAweDM1LCAweDI4LCAweGZlLCAweGRkLCAweGY1LCAweDJmLCAweDMxLCAweGI3LCAweDE3LAorCTB4ZDksIDB4MTEsIDB4OWQsIDB4NjksIDB4ZmMsIDB4YzAsIDB4N2EsIDB4NTAsIDB4YTMsIDB4N2YsIDB4NDcsIDB4MTAsCisJMHg5ZiwgMHhkMywgMHhmMCwgMHhiYywgMHhmNSwgMHhkMCwgMHgyYSwgMHhiOSwgMHg3ZSwgMHg5YiwgMHgxMywgMHhhNSwKKwkweDJhLCAweGFmLCAweDQ5LCAweDliLCAweDgyLCAweDRiLCAweDc1LCAweDQ0LCAweGUyLCAweDhmLCAweDZiLCAweDMzLAorCTB4NmIsIDB4MjUsIDB4Y2YsIDB4OTYsIDB4MjcsIDB4MmYsIDB4MjQsIDB4MTYsIDB4M2YsIDB4OTEsIDB4ZjAsIDB4YTIsCisJMHgzNywgMHg5NSwgMHhlMywgMHg1NiwgMHgzNywgMHg2NSwgMHg4NCwgMHg1MywgMHhiOSwgMHg1MSwgMHhkYSwgMHgyNywKKwkweDcxLCAweDI1LCAweDhhLCAweGY1LCAweGZjLCAweDVkLCAweGQyLCAweGE3LCAweGI3LCAweGM0LCAweDkxLCAweDYwLAorCTB4OWIsIDB4NGQsIDB4OWMsIDB4MGIsIDB4ZGEsIDB4NmIsIDB4OWYsIDB4MDMsIDB4MjUsIDB4NDYsIDB4NzMsIDB4Y2UsCisJMHg1NiwgMHhmYiwgMHg1NiwgMHhkMCwgMHg1NiwgMHgzNSwgMHg1NCwgMHhmNCwgMHhmNSwgMHg3MCwgMHhhYywgMHhiNCwKKwkweDU1LCAweGQ2LCAweGJiLCAweDgzLCAweGJhLCAweGYwLCAweGY0LCAweGFkLCAweGEyLCAweGJkLCAweGNlLCAweDQyLAorCTB4NTksIDB4NWYsIDB4MmIsIDB4ZjEsIDB4MDEsIDB4OGMsIDB4ZWIsIDB4MTYsIDB4OGUsIDB4OWEsIDB4OTUsIDB4NzksCisJMHg3ZSwgMHhkYSwgMHg4YywgMHg1YiwgMHg1MywgMHg1MSwgMHhiNCwgMHhhNSwgMHg2YSwgMHhhMywgMHgyNywgMHg2NSwKKwkweGFkLCAweGNhLCAweDk1LCAweGMzLCAweGIwLCAweDY4LCAweDhkLCAweGU4LCAweDYyLCAweDMyLCAweDhmLCAweGE3LAorCTB4N2EsIDB4NzMsIDB4OGUsIDB4ZDMsIDB4ZTksIDB4OWEsIDB4NWYsIDB4MjksIDB4YzgsIDB4ZGUsIDB4ODMsIDB4MTgsCisJMHhmMywgMHg4ZiwgMHgzOSwgMHg5MSwgMHgxNiwgMHg1OCwgMHgyOSwgMHg5MSwgMHgzYiwgMHg2ZSwgMHhmOSwgMHg5OCwKKwkweDUzLCAweDdhLCAweDIyLCAweGZhLCAweGM2LCAweGM1LCAweDBlLCAweGEzLCAweGUzLCAweDE1LCAweDI1LCAweDg4LAorCTB4ZWIsIDB4MjksIDB4NDMsIDB4NTksIDB4NWYsIDB4MjcsIDB4NWUsIDB4MDgsIDB4ZTksIDB4YmUsIDB4ZWYsIDB4MmEsCisJMHhmYSwgMHg5OSwgMHgwZCwgMHg3OCwgMHgwNSwgMHgzZiwgMHhlMywgMHhiNSwgMHhhMiwgMHhiZSwgMHgwOSwgMHgzYywKKwkweDk0LCAweDc5LCAweDE1LCAweGE3LCAweDI4LCAweGFiLCAweGRhLCAweGY3LCAweGExLCAweGI1LCAweGNjLCAweDc4LAorCTB4ODYsIDB4ZTMsIDB4NzcsIDB4MmIsIDB4NmYsIDB4NjUsIDB4YTYsIDB4ZGEsIDB4ZTIsIDB4NTUsIDB4NTgsIDB4YmQsCisJMHg1MywgMHhlYywgMHg0ZiwgMHgwZiwgMHhjNiwgMHg4OSwgMHhiZCwgMHg2ZCwgMHg2NiwgMHg4NSwgMHg3MCwgMHg3OSwKKwkweDg5LCAweDRmLCAweDk0LCAweGJmLCAweDQ1LCAweGIwLCAweDg1LCAweGZlLCAweDQxLCAweDNiLCAweGIwLCAweGM3LAorCTB4ZDAsIDB4NmEsIDB4NjMsIDB4YjIsIDB4MzMsIDB4MDksIDB4MWIsIDB4NGIsIDB4NzMsIDB4N2EsIDB4OGUsIDB4MjgsCisJMHg2ZCwgMHhhMywgMHhiZSwgMHg1MiwgMHg5NCwgMHhmYSwgMHhmMiwgMHg3ZSwgMHg5MCwgMHg1YiwgMHhiMywgMHgzOCwKKwkweDU3LCAweGY3LCAweDNmLCAweGFkLCAweDExLCAweGVmLCAweGY5LCAweDc1LCAweDJiLCAweDk4LCAweDgzLCAweDU1LAorCTB4NzIsIDB4M2MsIDB4ZWYsIDB4ZjYsIDB4YzUsIDB4YWQsIDB4ZDIsIDB4ZGMsIDB4NTgsIDB4OWEsIDB4N2YsIDB4YTAsCisJMHg4OCwgMHg0ZCwgMHgwNiwgMHhjOSwgMHhlZCwgMHgzYiwgMHg3MSwgMHg2OSwgMHg0OCwgMHg2ZiwgMHhmZCwgMHhhZSwKKwkweDIyLCAweDY1LCAweGY1LCAweGYwLCAweDA2LCAweGE1LCAweGQwLCAweGNmLCAweGNiLCAweDM4LCAweDM5LCAweDIyLAorCTB4N2QsIDB4NDgsIDB4NWYsIDB4MTMsIDB4Y2MsIDB4YzksIDB4NzIsIDB4NjMsIDB4MTAsIDB4NWYsIDB4N2EsIDB4YzQsCisJMHg5ZSwgMHg0YiwgMHhmMSwgMHgyNywgMHgzZiwgMHg5NiwgMHg3MywgMHg0YywgMHhhZSwgMHgzZSwgMHgxZiwgMHgwZiwKKwkweDE3LCAweGVkLCAweGQ1LCAweDg3LCAweGI1LCAweDk5LCAweDE1LCAweDU4LCAweGNkLCAweGJjLCAweDc2LCAweDc1LAorCTB4YTYsIDB4ODUsIDB4YmEsIDB4ZGYsIDB4NDgsIDB4N2MsIDB4NjcsIDB4NDYsIDB4YTAsIDB4ZTUsIDB4NzQsIDB4N2MsCisJMHhjZSwgMHgzZSwgMHg3NCwgMHhmZiwgMHgyNCwgMHg1NiwgMHhmMCwgMHhmZSwgMHhjZiwgMHg5ZCwgMHhhOCwgMHg2OCwKKwkweDYxLCAweDc5LCAweGZiLCAweGJlLCAweDI5LCAweGY4LCAweDdkLCAweGFlLCAweGNjLCAweDQ3LCAweDc4LCAweDk4LAorCTB4MWQsIDB4ZTcsIDB4ZjcsIDB4ZGEsIDB4MWMsIDB4YjEsIDB4YzUsIDB4Y2UsIDB4YmQsIDB4YWUsIDB4YjYsIDB4ZTcsCisJMHg1YywgMHgzOCwgMHg4MiwgMHg4NSwgMHg2MywgMHg2NiwgMHgzMSwgMHhmMywgMHhhZiwgMHhiYSwgMHhlMCwgMHhmOSwKKwkweDljLCAweDUwLCAweDY3LCAweDE2LCAweDVhLCAweGMwLCAweDAzLCAweGU5LCAweDRiLCAweGY0LCAweDcyLCAweGEyLAorCTB4MjYsIDB4YTcsIDB4OTcsIDB4NGYsIDB4MmEsIDB4N2IsIDB4M2UsIDB4NzYsIDB4ZWMsIDB4NDksIDB4NDgsIDB4ZGYsCisJMHg0NSwgMHgzNiwgMHgyZiwgMHg2ZCwgMHhjYywgMHg5NCwgMHgyMiwgMHhlZSwgMHgxNSwgMHgxZCwgMHg0OSwgMHg3YiwKKwkweGJhLCAweDVmLCAweDY0LCAweDVhLCAweGJiLCAweDUzLCAweGVjLCAweGQ4LCAweGMyLCAweDA4LCAweDY1LCAweGU4LAorCTB4YjYsIDB4ZTcsIDB4MmQsIDB4YzcsIDB4MjUsIDB4OGYsIDB4OWMsIDB4MTcsIDB4OWYsIDB4NjUsIDB4NGMsIDB4ODUsCisJMHhiZSwgMHg2ZiwgMHg3MywgMHhlNSwgMHhmOCwgMHg2NiwgMHg4MSwgMHgyYiwgMHg1OCwgMHhkNiwgMHg4MCwgMHg1OSwKKwkweGUwLCAweDBhLCAweDMyLCAweGU2LCAweGJmLCAweDAwLCAweDYzLCAweDlkLCAweDNkLCAweGRlLCAweDM1LCAweGY5LAorCTB4YjYsIDB4YmIsIDB4Y2MsIDB4MDAsIDB4ZWQsIDB4NWEsIDB4YjgsIDB4NTQsIDB4NDQsIDB4NTksIDB4YjMsIDB4MmIsCisJMHhjMywgMHhiOSwgMHg5NSwgMHhkYywgMHgwNiwgMHhiOCwgMHg5MywgMHhmNywgMHhjYiwgMHg3OSwgMHhmZiwgMHhjNSwKKwkweDkwLCAweDBiLCAweDk3LCAweDRlLCAweDk3LCAweGJlLCAweGFmLCAweDQyLCAweGM3LCAweGNlLCAweDI4LCAweDJhLAorCTB4MTcsIDB4MDYsIDB4MzAsIDB4NjksIDB4NzMsIDB4ODksIDB4MDIsIDB4ZWYsIDB4NzUsIDB4ZTEsIDB4OGUsIDB4OWQsCisJMHgxZiwgMHg1YSwgMHgxNSwgMHgzNiwgMHgxNywgMHgzMywgMHg2MiwgMHhlMywgMHg4YSwgMHg4YSwgMHhlZCwgMHg4YiwKKwkweDg0LCAweGZmLCAweGJhLCAweDg4LCAweGVmLCAweGU0LCAweGEyLCAweGMyLCAweGFkLCAweDVkLCAweDY1LCAweGU0LAorCTB4YjAsIDB4YzIsIDB4ZTEsIDB4MDIsIDB4ZDksIDB4OWIsIDB4NTQsIDB4NjgsIDB4NWEsIDB4NDQsIDB4YjgsIDB4ZGMsCisJMHgyYywgMHg5YiwgMHhjMywgMHgwYSwgMHg5NywgMHhmZCwgMHg1NiwgMHhlYSwgMHhkMCwgMHgxNCwgMHgyZSwgMHg3YiwKKwkweDk2LCAweDczLCAweDMwLCAweGY3LCAweDY5LCAweDYxLCAweDdlLCAweGVmLCAweDgxLCAweDNiLCAweGEyLCAweGI3LAorCTB4NmMsIDB4NTIsIDB4M2EsIDB4YjEsIDB4M2MsIDB4NjQsIDB4OTgsIDB4OTIsIDB4NTMsIDB4NWYsIDB4YTksIDB4ZTgsCisJMHhjMSwgMHhkMywgMHgwOCwgMHgxMiwgMHg2ZiwgMHg1ZiwgMHhjNiwgMHhjOCwgMHg2MCwgMHhkYywgMHgyNSwgMHg3NiwKKwkweGI0LCAweDI5LCAweDczLCAweDRlLCAweDllLCAweDViLCAweDI5LCAweDhmLCAweDNiLCAweDI3LCAweDhmLCAweDc5LAorCTB4MWEsIDB4MmEsIDB4OWUsIDB4NmMsIDB4NzAsIDB4MTEsIDB4YjcsIDB4ZmUsIDB4MGUsIDB4NmQsIDB4M2IsIDB4NTUsCisJMHgyYywgMHhiMSwgMHhiOSwgMHhmOSwgMHhkZiwgMHgxMSwgMHg3ZiwgMHgyZiwgMHgyYSwgMHhjZCwgMHg5NSwgMHgwNywKKwkweDNhLCAweGU5LCAweGRmLCAweGVmLCAweDJmLCAweDJjLCAweDQxLCAweDY4LCAweDlhLCAweDgyLCAweDJhLCAweGEzLAorCTB4ODMsIDB4ZjksIDB4ZjEsIDB4ODcsIDB4NTYsIDB4ZGMsIDB4NDksIDB4M2EsIDB4NmIsIDB4NDAsIDB4MmIsIDB4ODksCisJMHg0NCwgMHgyOSwgMHg1YiwgMHg5MywgMHg3MiwgMHhjZCwgMHhmMCwgMHgyMCwgMHhmYiwgMHhlOSwgMHgyMCwgMHhlZiwKKwkweGY3LCAweGUwLCAweDJlLCAweGRhLCAweGNlLCAweDVkLCAweDhjLCAweDY1LCAweDc3LCAweDMxLCAweDk2LCAweGRkLAorCTB4MzUsIDB4ZmEsIDB4MmYsIDB4YmMsIDB4M2UsIDB4ZGQsIDB4ZmUsIDB4YmQsIDB4MjksIDB4NTUsIDB4YjAsIDB4NjUsCisJMHgyNywgMHhlMywgMHg4MiwgMHhlOCwgMHg3NywgMHgzMywgMHg3ZCwgMHg0NywgMHhlMiwgMHgwMiwgMHgyOCwgMHg5MywKKwkweDg1LCAweDkzLCAweDljLCAweGM3LCAweDI1LCAweDlhLCAweDFlLCAweGNjLCAweGUyLCAweGViLCAweGFlLCAweDczLAorCTB4NzksIDB4NWYsIDB4MjEsIDB4YjYsIDB4YzgsIDB4M2MsIDB4YmEsIDB4NzAsIDB4MWIsIDB4NjUsIDB4MGMsIDB4ODYsCisJMHhmZSwgMHhjYiwgMHg0MiwgMHg5NSwgMHhmOCwgMHhlZSwgMHg4NSwgMHhmNywgMHg3MywgMHhmMywgMHg3YSwgMHhlNCwKKwkweDJjLCAweDA3LCAweDU0LCAweGM0LCAweDRlLCAweGU5LCAweGYzLCAweDdiLCAweDZjLCAweDRlLCAweGYxLCAweGEyLAorCTB4YzksIDB4ZGMsIDB4NmQsIDB4ZTcsIDB4ZDEsIDB4ZjksIDB4NjIsIDB4MmEsIDB4NmIsIDB4NDcsIDB4YTMsIDB4ZTgsCisJMHhlNiwgMHhiOCwgMHg1NywgMHgwZiwgMHgzZiwgMHg5NiwgMHhkNywgMHg0YiwgMHg2MSwgMHhiYywgMHgwYSwgMHhkNSwKKwkweGUyLCAweGExLCAweGZmLCAweGU0LCAweDcyLCAweDk1LCAweGI2LCAweDUxLCAweGUxLCAweGI2LCAweGQ1LCAweGZjLAorCTB4MmYsIDB4ZGMsIDB4ZDYsIDB4Y2IsIDB4ZmYsIDB4YzIsIDB4NzMsIDB4YTcsIDB4ZjMsIDB4YmYsIDB4MTMsIDB4ZmUsCisJMHhlOSwgMHg2MiwgMHhjNywgMHhmNSwgMHhlOCwgMHhkZCwgMHg2NSwgMHg1OSwgMHhjNSwgMHg4MSwgMHg3YSwgMHg2YywKKwkweDE5LCAweGZkLCAweDQ4LCAweGJjLCAweGJjLCAweDQwLCAweDFlLCAweDdiLCAweDBlLCAweGU4LCAweDQ3LCAweDJlLAorCTB4YzEsIDB4MjIsIDB4YmYsIDB4NWYsIDB4OTUsIDB4YmUsIDB4MmQsIDB4NmMsIDB4MzQsIDB4YWYsIDB4NjIsIDB4OWYsCisJMHg4YywgMHg4MCwgMHhkNSwgMHg1MywgMHhmZCwgMHhhMiwgMHhkMCwgMHg0NiwgMHg0MSwgMHhkZiwgMHhjNSwgMHhmNCwKKwkweDczLCAweDY4LCAweDJlLCAweGVhLCAweDdiLCAweDY1LCAweDQ2LCAweGVhLCAweDM2LCAweDI5LCAweDRiLCAweDg3LAorCTB4YTcsIDB4OTYsIDB4ZWYsIDB4MjAsIDB4MWYsIDB4M2UsIDB4NGQsIDB4NWQsIDB4MTcsIDB4ZmMsIDB4YzgsIDB4OWIsCisJMHhjZiwgMHgyYiwgMHg5OCwgMHg0YiwgMHhhNCwgMHg0NCwgMHg5NywgMHgzMiwgMHhiZSwgMHg1YywgMHhhZSwgMHgyOCwKKwkweGI2LCAweDc0LCAweGU0LCAweDZjLCAweDFmLCAweGEyLCAweGI3LCAweGY4LCAweGY0LCAweDEyLCAweDQzLCAweGVjLAorCTB4MjgsIDB4NDgsIDB4NWMsIDB4ZDEsIDB4YzMsIDB4Y2QsIDB4ODQsIDB4ZWQsIDB4NTMsIDB4MDksIDB4YzQsIDB4MWMsCisJMHg5MSwgMHhlNiwgMHhhNiwgMHhiNSwgMHg4OSwgMHhiOSwgMHhkYSwgMHhmMSwgMHg3YywgMHgyZSwgMHhiYSwgMHg4NywKKwkweDM4LCAweGFlLCAweDFhLCAweGIyLCAweDBlLCAweDQyLCAweDViLCAweDE5LCAweDE2LCAweGRkLCAweDc1LCAweDI4LAorCTB4ZTcsIDB4ZjIsIDB4Y2UsIDB4MjgsIDB4NzksIDB4OTcsIDB4NmEsIDB4Y2IsIDB4ZTgsIDB4OGMsIDB4ODgsIDB4NmMsCisJMHg1MiwgMHg4NywgMHhiMiwgMHg1ZiwgMHhjMCwgMHhiZiwgMHg3MiwgMHhiYSwgMHhhOCwgMHg4MCwgMHg2NywgMHg0MCwKKwkweDc4LCAweDk3LCAweDhlLCAweDBkLCAweDhjLCAweGYzLCAweDY1LCAweDAzLCAweDdlLCAweGZhLCAweDQyLCAweDM1LAorCTB4NGEsIDB4MWYsIDB4ODgsIDB4NjAsIDB4ZmQsIDB4YTgsIDB4ODYsIDB4OTIsIDB4MDcsIDB4MmMsIDB4NmIsIDB4NmUsCisJMHhhOCwgMHg4NywgMHg1YywgMHhmNiwgMHhiMiwgMHgyMiwgMHhjOSwgMHg5ZCwgMHg5YywgMHg0OSwgMHg2MiwgMHgxNiwKKwkweGYxLCAweGFkLCAweDNkLCAweGE1LCAweGUwLCAweDZhLCAweGM2LCAweGQzLCAweDI4LCAweDcxLCAweGE4LCAweGRkLAorCTB4YzYsIDB4MzksIDB4YWIsIDB4NzMsIDB4NGUsIDB4YzQsIDB4NDUsIDB4MWIsIDB4NWEsIDB4YzUsIDB4ZmIsIDB4YWQsCisJMHhjNCwgMHhjMCwgMHg1NiwgMHg2MiwgMHg5YSwgMHg2NSwgMHhiZCwgMHg3ZiwgMHgzOSwgMHgzYSwgMHhjYiwgMHgyMiwKKwkweDM3LCAweDEzLCAweDBiLCAweDZiLCAweGM5LCAweDg5LCAweDI1LCAweDdlLCAweDVmLCAweDhlLCAweDM1LCAweDhjLAorCTB4ZmQsIDB4YzUsIDB4NDksIDB4M2IsIDB4OWYsIDB4YTIsIDB4ZWUsIDB4MTgsIDB4YTMsIDB4MzIsIDB4OGMsIDB4NzEsCisJMHg5NCwgMHhmZCwgMHg2OSwgMHg3MiwgMHg1YywgMHhlMSwgMHhiYiwgMHg5NSwgMHhjOSwgMHgwZCwgMHg4YywgMHg3NSwKKwkweDFlLCAweDU0LCAweDBjLCAweDVjLCAweDg2LCAweDNiLCAweDE5LCAweGNmLCAweGVmLCAweGQ4LCAweGU5LCAweDQ3LAorCTB4N2EsIDB4ZDEsIDB4NTUsIDB4OTQsIDB4ZWYsIDB4MWUsIDB4YWMsIDB4NGYsIDB4MTksIDB4OTIsIDB4NDMsIDB4NDUsCisJMHg4MywgMHg4YiwgMHhjOCwgMHhiNywgMHgzMywgMHg4MiwgMHgzYiwgMHg5MiwgMHg4ZiwgMHg5NSwgMHg2MSwgMHg0OSwKKwkweDBiLCAweDEwLCAweDRjLCAweDE2LCAweGYwLCAweDJkLCAweDJhLCAweDZiLCAweDQ3LCAweDMwLCAweDkyLCAweGU3LAorCTB4NjMsIDB4ZGIsIDB4MzksIDB4NWUsIDB4MjQsIDB4ZWIsIDB4NzAsIDB4MmQsIDB4OTgsIDB4Y2YsIDB4NTgsIDB4MjAsCisJMHhmNiwgMHhhNSwgMHgzMSwgMHhjNywgMHgyYywgMHg1MSwgMHgwYywgMHhkZiwgMHgxZSwgMHhmYSwgMHhhOSwgMHhlNCwKKwkweDNkLCAweDU3LCAweDI0LCAweDBiLCAweGIxLCAweDRmLCAweGNmLCAweDJlLCAweDc2LCAweDc0LCAweDEyLCAweDQ3LAorCTB4ZjQsIDB4OGQsIDB4YmYsIDB4NTMsIDB4ZjQsIDB4ZjYsIDB4MTMsIDB4Y2EsIDB4MmIsIDB4ZDgsIDB4MzcsIDB4ZjYsCisJMHgyYSwgMHg4NiwgMHhjNiwgMHhkYywgMHhjYSwgMHhlOCwgMHg5OCwgMHhmNCwgMHgzNSwgMHg4MSwgMHhiZSwgMHhjYywKKwkweDlmLCAweGVhLCAweDZiLCAweGVhLCAweGZhLCAweGNiLCAweGEyLCAweGYzLCAweGQ2LCAweDZjLCAweGFlLCAweGNlLAorCTB4ZTcsIDB4ODksIDB4NGIsIDB4Y2YsIDB4ZTMsIDB4YzcsIDB4MzIsIDB4MjcsIDB4NjIsIDB4OTcsIDB4NWUsIDB4ZjQsCisJMHhhNCwgMHhjZSwgMHhhZCwgMHgwYiwgMHhmNCwgMHgyNywgMHhiNiwgMHhkOSwgMHhmZSwgMHhkOSwgMHg5MiwgMHgxMSwKKwkweDdiLCAweDU1LCAweDE5LCAweDMzLCAweDJmLCAweGNlLCAweGU3LCAweDJjLCAweGI1LCAweGQ0LCAweDQxLCAweDlmLAorCTB4N2QsIDB4NmYsIDB4OWYsIDB4ZjksIDB4MjksIDB4NjQsIDB4ZWQsIDB4NmIsIDB4OGIsIDB4ZTksIDB4OWIsIDB4ZDUsCisJMHgyOCwgMHgyNiwgMHgyNiwgMHgwNiwgMHg0MywgMHgzZSwgMHgxNCwgMHg1NywgMHhjOSwgMHgzYSwgMHhjZSwgMHhiOSwKKwkweGRjLCAweDdmLCAweGMzLCAweDRlLCAweDg2LCAweDY0LCAweDFiLCAweDczLCAweDFhLCAweDg5LCAweDdmLCAweGI1LAorCTB4OWMsIDB4ZWYsIDB4MWMsIDB4Y2UsIDB4YWMsIDB4YTcsIDB4MGQsIDB4NWQsIDB4MjcsIDB4MzYsIDB4ZTQsIDB4Y2EsCisJMHhkOSwgMHhkMCwgMHg0NywgMHhkNywgMHgxNywgMHg1NCwgMHg5MCwgMHhmYiwgMHg2OSwgMHgxNSwgMHg3NiwgMHhkZSwKKwkweGQ3LCAweGE0LCAweDVjLCAweDlmLCAweGI3LCAweGFiLCAweGNmLCAweDY3LCAweDFlLCAweDJkLCAweGNhLCAweGU3LAorCTB4NjYsIDB4MTcsIDB4OTQsIDB4ZmYsIDB4MzgsIDB4MWQsIDB4NWMsIDB4ZjYsIDB4NjcsIDB4ZTgsIDB4NDAsIDB4ZTIsCisJMHg4MSwgMHhlNCwgMHgwNCwgMHhhMiwgMHg4MywgMHhmMywgMHhmMywgMHhmMiwgMHhmZSwgMHg0NCwgMHgzNSwgMHg3MSwKKwkweGVmLCAweDQyLCAweDVkLCAweGNjLCAweGNjLCAweGViLCAweDYyLCAweDMxLCAweGIxLCAweDRiLCAweGZlLCAweDViLAorCTB4MzgsIDB4NjUsIDB4N2EsIDB4ZjEsIDB4YTIsIDB4MjYsIDB4ZTMsIDB4NWUsIDB4OGMsIDB4ZjUsIDB4MWMsIDB4YWYsCisJMHg5YiwgMHhiYSwgMHg1OCwgMHgxZSwgMHhhYSwgMHg0NCwgMHhmMCwgMHhiYywgMHg3OCwgMHg1MCwgMHhjYiwgMHhkOCwKKwkweGYxLCAweDIxLCAweDc5LCAweGE2LCAweGZjLCAweGY2LCAweGUzLCAweDA1LCAweGVhLCAweGUyLCAweDhlLCAweGUxLAorCTB4YzUsIDB4YjgsIDB4OGIsIDB4ZmUsIDB4OTQsIDB4ZTMsIDB4OTAsIDB4YjksIDB4ZDgsIDB4YjAsIDB4NzYsIDB4NTgsCisJMHhkYSwgMHgxNCwgMHg4YywgMHhmYiwgMHhkOSwgMHhkOSwgMHg3MSwgMHhmZSwgMHg3MSwgMHg1ZSwgMHhmZSwgMHgwYSwKKwkweGU1LCAweDk3LCAweDY3LCAweDA3LCAweGIyLCAweDE2LCAweDJkLCAweGNmLCAweDExLCAweDY0LCAweDJjLCAweGM2LAorCTB4MTQsIDB4ZGMsIDB4YjEsIDB4YWMsIDB4ODMsIDB4ZTYsIDB4M2MsIDB4YzQsIDB4YWEsIDB4ZjUsIDB4N2UsIDB4ODksCisJMHg4ZiwgMHhmZCwgMHhjNCwgMHgwMywgMHgwNywgMHhmMywgMHhjOCwgMHhhMiwgMHg0OCwgMHg5NCwgMHhmZSwgMHhhYywKKwkweDVlLCAweGU1LCAweDgwLCAweDVhLCAweGVmLCAweDQwLCAweDI3LCAweGRlLCAweDMwLCAweDhkLCAweGRlLCAweDc1LAorCTB4ZjgsIDB4MTQsIDB4YmEsIDB4YmMsIDB4MTYsIDB4ZjYsIDB4YjIsIDB4OWQsIDB4ZWUsIDB4NTQsIDB4MDksIDB4ZGEsCisJMHhlYiwgMHg2OSwgMHg1NiwgMHgyYiwgMHgzZCwgMHhkOCwgMHg5MSwgMHg4YSwgMHhiNywgMHgxMiwgMHgxNiwgMHgxOCwKKwkweDczLCAweDFhLCAweGZlLCAweDJhLCAweDExLCAweGQwLCAweDViLCAweDM2LCAweDkwLCAweGI3LCAweDJjLCAweGVmLAorCTB4NzMsIDB4YzMsIDB4YWYsIDB4ZTQsIDB4NzIsIDB4YjQsIDB4MDEsIDB4NTUsIDB4ZDYsIDB4MDksIDB4MjMsIDB4OTQsCisJMHhiZCwgMHhjNywgMHhjZSwgMHhmNywgMHhmYywgMHhkMywgMHhhNSwgMHgxZiwgMHgzZiwgMHhlMiwgMHgxOSwgMHhhOSwKKwkweGViLCAweDQ3LCAweGU5LCAweDVjLCAweDA1LCAweGNiLCAweGU3LCAweGVhLCAweGYxLCAweGE4LCAweDYyLCAweDU5LAorCTB4MGIsIDB4NDIsIDB4NGUsIDB4ZmIsIDB4ZmUsIDB4YjYsIDB4NGMsIDB4NWQsIDB4ZWIsIDB4MGQsIDB4ZWEsIDB4YWIsCisJMHg1NiwgMHg2ZSwgMHg2ZCwgMHg1MiwgMHhkNywgMHhhMiwgMHg0YywgMHgwYSwgMHg4ZSwgMHhmYywgMHhkMSwgMHhmNSwKKwkweGY5LCAweDIwLCAweGU0LCAweGI5LCAweDg5LCAweGRiLCAweDU4LCAweDg5LCAweGZkLCAweGY5LCAweGY1LCAweDM5LAorCTB4NTcsIDB4ZTQsIDB4YmQsIDB4MmYsIDB4ZWYsIDB4MzUsIDB4MjQsIDB4NmYsIDB4MTEsIDB4OWQsIDB4NGIsIDB4N2YsCisJMHg2MiwgMHgwYiwgMHhkNywgMHgxNSwgMHgwYiwgMHgwNiwgMHg3NiwgMHg2NSwgMHgxNiwgMHhkMiwgMHgxNiwgMHg3ZiwKKwkweDZiLCAweDhkLCAweDdhLCAweGE3LCAweDk2LCAweGJkLCAweDUxLCAweGNkLCAweGFkLCAweGI3LCAweDRiLCAweGQ5LAorCTB4NDIsIDB4YjksIDB4OGIsIDB4ODksIDB4MDksIDB4OGQsIDB4MTgsIDB4M2UsIDB4YWYsIDB4NGQsIDB4YzksIDB4NzUsCisJMHgwYiwgMHg2ZCwgMHhkZSwgMHhjNiwgMHg3MiwgMHhkMiwgMHhhZSwgMHhlMCwgMHhlZiwgMHg3ZiwgMHg1OSwgMHhmYiwKKwkweGNlLCAweDZiLCAweGFmLCAweGQ1LCAweDk1LCAweDZiLCAweGVmLCAweGVlLCAweDYyLCAweGM5LCAweGRkLCAweGZiLAorCTB4NTMsIDB4NDUsIDB4YWMsIDB4ZjMsIDB4NGUsIDB4OWUsIDB4MDcsIDB4MTYsIDB4Y2EsIDB4N2MsIDB4ZWEsIDB4ODIsCisJMHgzMiwgMHhjNCwgMHg3OSwgMHhlMywgMHg0ZCwgMHg2YiwgMHhjZiwgMHg3OSwgMHg2NSwgMHg5NiwgMHgzYiwgMHhjZiwKKwkweDJmLCAweGUzLCAweGM0LCAweDFjLCAweGUzLCAweDU1LCAweGViLCAweGM4LCAweDc5LCAweDY1LCAweGQyLCAweDE3LAorCTB4OTQsIDB4YjksIDB4MWMsIDB4NjMsIDB4ZjUsIDB4OGYsIDB4NTgsIDB4NDMsIDB4YjksIDB4YjksIDB4YzksIDB4ZDIsCisJMHg3ZCwgMHhkYywgMHgzMywgMHgyMywgMHhhZCwgMHg3ZiwgMHg3NSwgMHhjNSwgMHgzYywgMHhiZCwgMHg2MywgMHhhNiwKKwkweDQzLCAweDllLCAweGQ5LCAweGI4LCAweDkxLCAweGNkLCAweGNkLCAweDRkLCAweDVjLCAweGU2LCAweGM2LCAweGI1LAorCTB4YTAsIDB4MzAsIDB4MzcsIDB4ZDcsIDB4ZTUsIDB4ZWIsIDB4MTcsIDB4ZGEsIDB4YmQsIDB4YWUsIDB4ZTgsIDB4ZmMsCisJMHg3NiwgMHgwYiwgMHhkNywgMHhhZiwgMHhiOCwgMHg0MCwgMHhlZSwgMHhlZiwgMHg1YywgMHg1MCwgMHhlZSwgMHhiNywKKwkweDdmLCAweGE0LCAweGRlLCAweDJmLCAweDFjLCAweGU3LCAweDVmLCAweDNmLCAweGEwLCAweDllLCAweDdmLCAweGRlLAorCTB4OWMsIDB4M2YsIDB4MmYsIDB4ZTgsIDB4YmYsIDB4ZWEsIDB4ODIsIDB4ZjIsIDB4MzUsIDB4MTcsIDB4OTQsIDB4N2YsCisJMHg1OSwgMHhmZCwgMHhmOCwgMHg3ZSwgMHhkNiwgMHg1ZCwgMHg1MCwgMHhjZiwgMHg1ZSwgMHhhYiwgMHhjNiwgMHg1MywKKwkweDY3LCAweDdkLCAweDFlLCAweDRkLCAweDQ1LCAweDA4LCAweDk4LCAweDRlLCAweDA1LCAweDdlLCAweGZhLCAweGJlLAorCTB4ZmYsIDB4ZTksIDB4MGIsIDB4ZDYsIDB4YWMsIDB4OWIsIDB4Y2UsIDB4ZmEsIDB4ZmUsIDB4NzksIDB4OWMsIDB4MzMsCisJMHg1NiwgMHgxYywgMHg5MSwgMHgxOCwgMHg1NiwgMHg0NCwgMHhlZSwgMHgyYywgMHgzYywgMHhiMCwgMHg0ZSwgMHgzYiwKKwkweDk3LCAweDY3LCAweDE1LCAweDYyLCAweDY1LCAweDQ1LCAweGFjLCAweDI0LCAweGQyLCAweDAwLCAweGZmLCAweGQ4LAorCTB4MmMsIDB4ZmYsIDB4OWIsIDB4MDksIDB4NTksIDB4YjcsIDB4ZmMsIDB4ODAsIDB4NWMsIDB4Y2EsIDB4ZjAsIDB4ZWQsCisJMHhjNywgMHgyYywgMHhmZiwgMHg0ZiwgMHhkMywgMHg2ZiwgMHgxNSwgMHhhMywgMHhjMiwgMHg4MywgMHhhYiwgMHgxMywKKwkweDFmLCAweDVmLCAweDRmLCAweDhkLCAweDQwLCAweDU5LCAweGQ2LCAweGUwLCAweDYzLCAweDdlLCAweDA1LCAweGU3LAorCTB4MzUsIDB4ZjMsIDB4MzAsIDB4ZTUsIDB4YWYsIDB4NDUsIDB4ZjIsIDB4M2QsIDB4ZjUsIDB4NTgsIDB4NDMsIDB4OTgsCisJMHhmMSwgMHgzOSwgMHhmNywgMHhiYywgMHg3NiwgMHg0OSwgMHg0NiwgMHhmNywgMHg0NSwgMHg5NSwgMHhkYywgMHgzMywKKwkweGQ5LCAweGY2LCAweGQwLCAweDFmLCAweGM4LCAweDc3LCAweDNhLCAweDI5LCAweDk3LCAweGM1LCAweGJlLCAweDgwLAorCTB4MGQsIDB4MDksIDB4Y2IsIDB4N2EsIDB4OGEsIDB4NzksIDB4YWEsIDB4M2MsIDB4ZWIsIDB4ZmYsIDB4NzksIDB4ZmEsCisJMHhmNywgMHhkNiwgMHg4NCwgMHhkNywgMHg4OSwgMHhiNywgMHg4YywgMHhhOSwgMHhlZCwgMHhmOSwgMHg1MSwgMHgxOSwKKwkweDMxLCAweDk5LCAweDJmLCAweGQ5LCAweDI3LCAweGVhLCAweDk4LCAweDUxLCAweGI3LCAweDcxLCAweDJmLCAweGZkLAorCTB4NmUsIDB4N2UsIDB4NDAsIDB4ZjcsIDB4MjcsIDB4ZjEsIDB4ZWYsIDB4OTYsIDB4YmYsIDB4NDYsIDB4MGYsIDB4MGUsCisJMHgyOSwgMHg4NSwgMHg3NSwgMHhlMiwgMHgwYiwgMHhkNywgMHg4MywgMHgyYiwgMHg2MiwgMHgyZSwgMHg4ZSwgMHg2ZiwKKwkweDhmLCAweGNkLCAweGY3LCAweDhiLCAweDg4LCAweDcxLCAweDg4LCAweDM5LCAweDIzLCAweGIzLCAweGZjLCAweDViLAorCTB4MTIsIDB4ZjYsIDB4MzgsIDB4YzksIDB4MTcsIDB4MTUsIDB4MWMsIDB4NmIsIDB4OTgsIDB4ZTUsIDB4ZWYsIDB4NGUsCisJMHg3YiwgMHhiMSwgMHg5ZCwgMHhmMSwgMHhiOCwgMHhjNCwgMHg2OCwgMHhjMCwgMHgyMywgMHg2OSwgMHgxNSwgMHhiNywKKwkweGRkLCAweGVmLCAweGM1LCAweDVhLCAweDcyLCAweGQxLCAweDhkLCAweDdkLCAweGRmLCAweDgwLCAweDcxLCAweGE5LAorCTB4MTMsIDB4YjcsIDB4ZDIsIDB4ZmUsIDB4ZDYsIDB4ZjUsIDB4MTUsIDB4ZGIsIDB4MzksIDB4YzgsIDB4ZmEsIDB4M2UsCisJMHgyNywgMHhlYSwgMHgyZiwgMHhhZCwgMHg0MCwgMHhiYywgMHhhNiwgMHgxOCwgMHhkZiwgMHgzNywgMHgxZCwgMHhjYywKKwkweDdiLCAweGNhLCAweDMwLCAweDY0LCAweDYzLCAweGEyLCAweGU0LCAweGIyLCAweDgyLCAweDczLCAweGEyLCAweDM3LAorCTB4ODcsIDB4YmQsIDB4MmUsIDB4ZjksIDB4ZjEsIDB4NTgsIDB4ZmUsIDB4NWIsIDB4MmIsIDB4NWIsIDB4YjMsIDB4ZGQsCisJMHhjNiwgMHg1ZiwgMHg0NywgMHhjNCwgMHhiNCwgMHhlMywgMHgyNSwgMHg5MCwgMHhlMywgMHg2OSwgMHg1ZCwgMHhlNywKKwkweDNkLCAweDU3LCAweDZlLCAweDUxLCAweGU2LCAweDQ0LCAweDAyLCAweDEzLCAweDhiLCAweDE1LCAweDA3LCAweGMyLAorCTB4ODEsIDB4OGEsIDB4NTgsIDB4NjUsIDB4MjQsIDB4OGMsIDB4NjUsIDB4OTksIDB4MmUsIDB4OWYsIDB4Y2YsIDB4N2UsCisJMHg1NiwgMHgxZCwgMHhjMSwgMHhlOSwgMHg0NSwgMHgyNiwgMHg3MywgMHg2MCwgMHgzOCwgMHg5NywgMHg1MSwgMHhmNywKKwkweDRkLCAweGQ0LCAweGViLCAweDY2LCAweGYzLCAweDBmLCAweDU2LCAweGQ2LCAweGY2LCAweDdiLCAweDM3LCAweDYyLAorCTB4OWEsIDB4NjUsIDB4YWQsIDB4YTMsIDB4N2UsIDB4MWQsIDB4ZDQsIDB4ZTMsIDB4Y2YsIDB4ZjIsIDB4ZmEsIDB4MTUsCisJMHg5ZCwgMHg5NiwgMHg4ZCwgMHhmZCwgMHhkZSwgMHgzYSwgMHg0NiwgMHhmZCwgMHhiYSwgMHhkOSwgMHg5ZSwgMHg5YiwKKwkweGVkLCAweDk1LCAweDhjLCAweDlkLCAweGFmLCAweGU3LCAweDYyLCAweGNhLCAweGIzLCAweGNjLCAweDk2LCAweGExLAorCTB4NTIsIDB4OWUsIDB4ZjUsIDB4ZjksIDB4YTMsIDB4NGEsIDB4MDEsIDB4YjcsIDB4ZmYsIDB4ZDQsIDB4OTgsIDB4NWUsCisJMHg5OSwgMHg5MiwgMHg4MywgMHg4OCwgMHhmZSwgMHhmZCwgMHhkNCwgMHhiZiwgMHg2MCwgMHhiOCwgMHhjYywgMHg0MSwKKwkweGJkLCAweGFjLCAweGZiLCAweGY0LCAweDAyLCAweGEzLCAweDRjLCAweGQ2LCAweDE1LCAweDRjLCAweDMzLCAweDIyLAorCTB4ZjgsIDB4NzYsIDB4OGIsIDB4MDcsIDB4NmYsIDB4MjYsIDB4Y2EsIDB4ZWQsIDB4NzEsIDB4NWYsIDB4M2EsIDB4ZDcsCisJMHhiMiwgMHgxZSwgMHgwZiwgMHhmOSwgMHhmMSwgMHg3MywgMHhhMywgMHgyZSwgMHhiYywgMHg0MCwgMHhkNSwgMHgzMSwKKwkweGE5LCAweDc5LCAweDkxLCAweDIwLCAweGNlLCAweDc2LCAweGE1LCAweDY2LCAweDczLCAweGJlLCAweGJjLCAweGQ4LAorCTB4OTIsIDB4YzIsIDB4NDYsIDB4ZGEsIDB4OTMsIDB4ZGYsIDB4MTEsIDB4MDEsIDB4ZGUsIDB4NDgsIDB4MTgsIDB4YzEsCisJMHhjZCwgMHhlYywgMHg3ZiwgMHhkOCwgMHhkYiwgMHg0MCwgMHhmZSwgMHhhZCwgMHgzNiwgMHg5MSwgMHhhYSwgMHhjNSwKKwkweDRiLCAweDIyLCAweDQ2LCAweDdjLCAweDJiLCAweGZlLCAweGMzLCAweDFhLCAweDIyLCAweGNlLCAweDE3LCAweDg1LAorCTB4NjQsIDB4NmQsIDB4NmUsIDB4MGUsIDB4OGUsIDB4NmIsIDB4MGUsIDB4M2MsIDB4MWIsIDB4OWMsIDB4OGUsIDB4MjgsCisJMHhkZCwgMHhiMSwgMHhjYywgMHg3OCwgMHhjYiwgMHhmYSwgMHhhMSwgMHg1NywgMHhmYSwgMHg5MSwgMHhiMSwgMHhmYywKKwkweDg2LCAweGUzLCAweDUwLCAweDZjLCAweDJjLCAweGRjLCAweDkyLCAweDZhLCAweGEwLCAweGJlLCAweDJmLCAweGVjLAorCTB4ZmYsIDB4ZGYsIDB4YWQsIDB4NDksIDB4YWYsIDB4ZjQsIDB4Y2YsIDB4NWMsIDB4OWUsIDB4ZjEsIDB4ZWMsIDB4YzgsCisJMHgxZiwgMHhjNSwgMHhlZSwgMHg5NywgMHhhYywgMHhlNywgMHhlYywgMHgzNiwgMHgxNywgMHhiOSwgMHg3MywgMHg3MSwKKwkweDUwLCAweGRhLCAweGZiLCAweDE3LCAweDhlLCAweDRmLCAweGRhLCAweDJjLCAweGY0LCAweDIzLCAweDdhLCAweGNiLAorCTB4YmEsIDB4YzUsIDB4OWYsIDB4YjcsIDB4YTQsIDB4NDQsIDB4N2YsIDB4ODIsIDB4NTcsIDB4YzcsIDB4MmMsIDB4NGMsCisJMHg5NywgMHhmMywgMHg4NywgMHhlZCwgMHhiMiwgMHg3MSwgMHhlYSwgMHhhYiwgMHg4YiwgMHgzNiwgMHhjNCwgMHhkOCwKKwkweGNiLCAweDNjLCAweDRlLCAweDc2LCAweDUxLCAweDY4LCAweDc2LCAweDllLCAweGI2LCAweDg5LCAweGRjLCAweDdlLAorCTB4YzgsIDB4NWIsIDB4ODksIDB4MmQsIDB4MjYsIDB4ZWQsIDB4Y2UsIDB4NTAsIDB4MmYsIDB4NzYsIDB4NDIsIDB4NzIsCisJMHg1MywgMHgzOSwgMHg3NywgMHg2MSwgMHhkMiwgMHhlYiwgMHhjMCwgMHg1NiwgMHhkMywgMHg4OSwgMHg3NiwgMHg0MywKKwkweGQ1LCAweGU1LCAweGJhLCAweDIzLCAweDI0LCAweGU3LCAweDJlLCAweGY4LCAweDZiLCAweDE0LCAweDZjLCAweDBmLAorCTB4YWIsIDB4NTgsIDB4NmYsIDB4NzQsIDB4ZjksIDB4ZTUsIDB4ZmEsIDB4OTIsIDB4OTAsIDB4OWMsIDB4MmIsIDB4NTgsCisJMHg0MywgMHg5ZCwgMHhjNCwgMHgzNSwgMHgwNSwgMHgxYiwgMHgwYywgMHg3OSwgMHhiZSwgMHg5OCwgMHhlMywgMHhiZSwKKwkweDMxLCAweDU4LCAweGQ2LCAweDc2LCAweGIzLCAweGYxLCAweDhhLCAweDMyLCAweDQ4LCAweDljLCAweDE3LCAweDJlLAorCTB4ZjcsIDB4ZGUsIDB4Y2QsIDB4ZjMsIDB4MDMsIDB4NzEsIDB4MTIsIDB4MzEsIDB4M2QsIDB4NTYsIDB4NDIsIDB4M2YsCisJMHhkZCwgMHhkMiwgMHgzNywgMHg4NywgMHhmNSwgMHgxNCwgMHg3MiwgMHgxYywgMHhhNywgMHg2ZiwgMHgxYiwgMHgyNCwKKwkweDdlLCAweDA2LCAweGZjLCAweDNmLCAweDY1LCAweGYyLCAweDM0LCAweGU0LCAweDlkLCAweDQ3LCAweGNkLCAweDFhLAorCTB4ZmUsIDB4OTMsIDB4OWMsIDB4YjcsIDB4NGEsIDB4YzMsIDB4YjksIDB4ZjEsIDB4MDcsIDB4ZDAsIDB4ZGIsIDB4NGIsCisJMHg5NCwgMHg3OSwgMHhjMSwgMHgwYSwgMHhlNiwgMHgwMCwgMHg3MSwgMHhlMiwgMHhmYiwgMHhjOCwgMHg5OCwgMHgxMywKKwkweDliLCAweDUzLCAweDg2LCAweGI2LCAweGNmLCAweGU2LCAweDZlLCAweDRlLCAweGVhLCAweGMyLCAweGM5LCAweDFjLAorCTB4M2YsIDB4YTAsIDB4NGQsIDB4MjgsIDB4ODUsIDB4ZjMsIDB4MzksIDB4ODIsIDB4MGQsIDB4ZTQsIDB4ZTIsIDB4ODIsCisJMHg2ZiwgMHg3MSwgMHhlYiwgMHhjOSwgMHgwNiwgMHg0OSwgMHhkYiwgMHhkYywgMHhmZSwgMHg1OCwgMHhkYSwgMHhjMywKKwkweDQzLCAweGUzLCAweGUxLCAweGY1LCAweGFmLCAweDRkLCAweGZiLCAweGZjLCAweDZiLCAweGQyLCAweGYwLCAweGI3LAorCTB4YTUsIDB4MGIsIDB4NzYsIDB4NTksIDB4ZjAsIDB4NmQsIDB4YzEsIDB4MzYsIDB4OGIsIDB4N2MsIDB4MzMsIDB4OTcsCisJMHg3MywgMHg3NSwgMHg0OSwgMHg0ZSwgMHgwMywgMHg3OSwgMHgzZSwgMHhmNiwgMHhkZSwgMHhjZCwgMHg0ZiwgMHhkMSwKKwkweGQ2LCAweDVkLCAweGU0LCAweGYyLCAweDViLCAweDhkLCAweDc4LCAweDU0LCAweDllLCAweGQ3LCAweDE5LCAweDIxLAorCTB4ZGQsIDB4NTcsIDB4YTQsIDB4ZjgsIDB4YjEsIDB4YTUsIDB4ZmUsIDB4NzcsIDB4OWMsIDB4NGYsIDB4NzIsIDB4ZGMsCisJMHhmNCwgMHhhNywgMHg0YSwgMHg3MiwgMHhmMywgMHgyMSwgMHg3ZSwgMHgyNiwgMHgxOCwgMHhlMCwgMHg2NywgMHgxZSwKKwkweGU0LCAweGYzLCAweDc3LCAweGIxLCAweDlmLCAweDRkLCAweGU5LCAweGE5LCAweDNlLCAweGEwLCAweGUwLCAweDFhLAorCTB4YjYsIDB4ZDUsIDB4MTgsIDB4ODIsIDB4NzMsIDB4NjksIDB4ZmQsIDB4N2YsIDB4NTksIDB4NTksIDB4ZWYsIDB4ZDQsCisJMHg3ZCwgMHgxMSwgMHgyMCwgMHg4NywgMHg4MCwgMHhiMywgMHhhZCwgMHg1ZSwgMHhjZSwgMHgxNSwgMHgzNCwgMHg4NiwKKwkweGU1LCAweDVjLCAweDQxLCAweDliLCAweDkxLCAweDkzLCAweDRmLCAweDdjLCAweGI3LCAweDliLCAweGI4LCAweDdkLAorCTB4ZWUsIDB4ZmMsIDB4NDIsIDB4MmMsIDB4MzIsIDB4NzEsIDB4N2IsIDB4MGEsIDB4YjEsIDB4YTIsIDB4ODgsIDB4NjAsCisJMHg5MSwgMHhkYiwgMHhmZiwgMHg1YywgMHhiYSwgMHg5ZSwgMHg1YywgMHg1YywgMHg5ZSwgMHg3ZiwgMHhiYiwgMHgzOSwKKwkweGU3LCAweDFlLCAweGZmLCAweGIzLCAweGU5LCAweDJiLCAweDcxLCAweGRiLCAweGFlLCAweDMwLCAweGRhLCAweDc3LAorCTB4YzksIDB4ODYsIDB4MjMsIDB4ZTYsIDB4NjAsIDB4YTEsIDB4ODAsIDB4N2YsIDB4MTQsIDB4OWEsIDB4ZmYsIDB4MzgsCisJMHg3NSwgMHg3MiwgMHg5NCwgMHg3MiwgMHgxZSwgMHgzYiwgMHg0ZiwgMHg0ZSwgMHhkMSwgMHgyMSwgMHhmYywgMHg3NywKKwkweDI0LCAweGRjLCAweDQ4LCAweDg3LCAweGRlLCAweGI3LCAweGUyLCAweDM2LCAweGU3LCAweGYwLCAweGZhLCAweGVmLAorCTB4NGMsIDB4ZjgsIDB4OTEsIDB4YjUsIDB4YjksIDB4ZTcsIDB4YmYsIDB4YmIsIDB4MjUsIDB4NDcsIDB4ZWMsIDB4NDksCisJMHhjNSwgMHhhMywgMHg0YywgMHg3OSwgMHhmMywgMHhmMywgMHhhYiwgMHg4NywgMHg2NSwgMHg2ZSwgMHhkZiwgMHg0OCwKKwkweGM4LCAweGJkLCAweGU4LCAweDM3LCAweDU0LCAweGU4LCAweDdlLCAweDk1LCAweGIxLCAweGI0LCAweGRmLCAweDE0LAorCTB4ZmIsIDB4YjUsIDB4ZWMsIDB4NjcsIDB4ZmIsIDB4YWMsIDB4MTgsIDB4ZjcsIDB4NDQsIDB4MDIsIDB4YWQsIDB4ZjUsCisJMHhiYywgMHhhZSwgMHgyZCwgMHg0MCwgMHhhYywgMHg4YSwgMHg3YSwgMHgyYSwgMHgzNSwgMHhiYywgMHhmZSwgMHhiYSwKKwkweDcxLCAweDlmLCAweGRmLCAweDFjLCAweDg3LCAweGZmLCAweDkyLCAweGYxLCAweGE5LCAweDIyLCAweDkwLCAweGEzLAorCTB4YWIsIDB4MWYsIDB4ODcsIDB4MDUsIDB4NWUsIDB4ZmYsIDB4YmEsIDB4YzQsIDB4MWMsIDB4YTgsIDB4OTEsIDB4YjgsCisJMHhiNSwgMHhhNCwgMHhlMSwgMHhiNCwgMHgzNSwgMHgyNywgMHg2MiwgMHg2NCwgMHg4ZiwgMHg1MSwgMHg4NiwgMHhmNywKKwkweDJmLCAweGQ3LCAweGUzLCAweDMzLCAweDFkLCAweDQ3LCAweGVmLCAweGQ1LCAweGE2LCAweGY0LCAweGYxLCAweDVlLAorCTB4ZTgsIDB4ZmYsIDB4NmYsIDB4MWYsIDB4ODUsIDB4MzgsIDB4NDcsIDB4N2IsIDB4NjgsIDB4OTAsIDB4MzEsIDB4NDgsCisJMHhiYywgMHgyYiwgMHg2MiwgMHhjZSwgMHgyOSwgMHg2MywgMHhmOSwgMHg1NCwgMHhlMSwgMHhiOSwgMHg0NywgMHg3ZSwKKwkweDVjLCAweDBhLCAweGU3LCAweDFhLCAweDM2LCAweDBmLCAweGNlLCAweGM1LCAweDMwLCAweGNiLCAweGVhLCAweDM2LAorCTB4N2MsIDB4ZjksIDB4ZTcsIDB4NjcsIDB4OWMsIDB4YjMsIDB4Y2MsIDB4ZDEsIDB4MmIsIDB4OWMsIDB4NTgsIDB4NGMsCisJMHgzZiwgMHg2OCwgMHhmYywgMHg0YiwgMHgyNywgMHhhMiwgMHhiZSwgMHg2MiwgMHhjNiwgMHg1NiwgMHg1OSwgMHgxNywKKwkweDNhLCAweDVlLCAweDNmLCAweDY5LCAweDRkLCAweDE4LCAweGY1LCAweDY4LCAweGNjLCAweGM4LCAweGYzLCAweDRjLAorCTB4MDcsIDB4ZWQsIDB4ZGIsIDB4YzIsIDB4MjMsIDB4YTYsIDB4ZGMsIDB4MTcsIDB4OWMsIDB4ODksIDB4YzcsIDB4MWMsCisJMHhiNCwgMHgxNSwgMHhiNywgMHhhMSwgMHhiNywgMHhmZSwgMHhiZCwgMHg1MiwgMHg4MSwgMHhkMiwgMHg4OCwgMHgzMywKKwkweDM4LCAweDAxLCAweDNkLCAweGJjLCAweDVlLCAweGExLCAweDFmLCAweDU2LCAweGNkLCAweDMzLCAweDY1LCAweDBhLAorCTB4ZGUsIDB4NGUsIDB4MDQsIDB4Y2MsIDB4NDAsIDB4M2UsIDB4MmUsIDB4OWQsIDB4ZTIsIDB4ZGMsIDB4YmQsIDB4OTMsCisJMHgzMCwgMHhkYSwgMHg5ZiwgMHhjYSwgMHg5ZiwgMHhmZiwgMHgyMiwgMHgzZCwgMHgzNSwgMHhhNywgMHgxNSwgMHg3YiwKKwkweDc0LCAweGJiLCAweDM3LCAweDI1LCAweGYwLCAweDllLCAweGEzLCAweDAxLCAweGVmLCAweGVkLCAweDMxLCAweDhiLAorCTB4OTgsIDB4OGIsIDB4ODksIDB4OWQsIDB4YmEsIDB4ZGQsIDB4NWIsIDB4MTIsIDB4OTgsIDB4NzQsIDB4ZjIsIDB4ZGEsCisJMHgyOSwgMHg3MywgMHgzNiwgMHgzMSwgMHg0ZCwgMHhlNSwgMHhiNSwgMHhiMCwgMHhkOCwgMHg1OSwgMHg0YywgMHg2MywKKwkweDdjLCAweDJkLCAweDhkLCAweDc4LCAweGRkLCAweGE1LCAweGUzLCAweGQwLCAweDRhLCAweDhjLCAweDBhLCAweGU2LAorCTB4YmEsIDB4NjgsIDB4NzIsIDB4MjQsIDB4NzUsIDB4N2YsIDB4YjMsIDB4YTMsIDB4OWUsIDB4MzksIDB4YWYsIDB4NWYsCisJMHg3MSwgMHgxOSwgMHhkZiwgMHg2MywgMHg1ZSwgMHgyZiwgMHg2YiwgMHg2MSwgMHg2MSwgMHhkYSwgMHhhNCwgMHg5MywKKwkweDE1LCAweDc2LCAweDRjLCAweDU3LCAweDIzLCAweDBhLCAweGIxLCAweGIwLCAweDAyLCAweGI3LCAweDZiLCAweDFiLAorCTB4M2UsIDB4YWIsIDB4NDYsIDB4ZmEsIDB4NzEsIDB4N2QsIDB4ODMsIDB4YmIsIDB4YTksIDB4NzIsIDB4YmMsIDB4YTAsCisJMHgxMywgMHhjNCwgMHgzYywgMHgxMSwgMHhlNiwgMHgyNSwgMHgwNiwgMHhkNCwgMHhmMiwgMHg4OCwgMHhlOCwgMHhjNiwKKwkweGRmLCAweDk0LCAweDFjLCAweDEzLCAweDU5LCAweDM1LCAweDc3LCAweGRmLCAweGQ4LCAweDNiLCAweDI1LCAweDI4LAorCTB4MGQsIDB4MTMsIDB4YWIsIDB4N2UsIDB4ZTIsIDB4ZmIsIDB4ZWYsIDB4ZDUsIDB4M2IsIDB4NWEsIDB4MjIsIDB4NzgsCisJMHhlZiwgMHgzMiwgMHhlNCwgMHhiZiwgMHg2ZCwgMHg1YiwgMHg2ZSwgMHg3NywgMHhlNCwgMHg4MywgMHg5OCwgMHgzYiwKKwkweDYwLCAweDU5LCAweDhjLCAweDkzLCAweDNlLCAweDI4LCAweGIzLCAweDM5LCAweDFlLCAweGZhLCAweDFhLCAweGU3LAorCTB4NjYsIDB4NGQsIDB4ZmEsIDB4MGYsIDB4ZDYsIDB4ZTcsIDB4OWMsIDB4MzYsIDB4MDcsIDB4NzAsIDB4MTcsIDB4NDcsCisJMHgzYSwgMHg2ZSwgMHg3OSwgMHhjYiwgMHhmOCwgMHhjMCwgMHg3YSwgMHgzMywgMHhjMSwgMHg1YywgMHhkOSwgMHg5MCwKKwkweDY3LCAweDQzLCAweDczLCAweGIwLCAweGNkLCAweDc0LCAweDM2LCAweDJmLCAweDU1LCAweDE0LCAweGY0LCAweDE4LAorCTB4ZjMsIDB4YjQsIDB4MTIsIDB4YzYsIDB4YTksIDB4NmUsIDB4ZmEsIDB4NzUsIDB4Y2MsIDB4NmIsIDB4MDQsIDB4ZjcsCisJMHg4MCwgMHhlNSwgMHhkMiwgMHhlYiwgMHhkNiwgMHhiOSwgMHgyMiwgMHg3NywgMHhkZSwgMHgzMiwgMHhkMiwgMHgyMCwKKwkweDU4LCAweDEwLCAweDZlLCAweDdiLCAweGNhLCAweDY4LCAweDQxLCAweDRmLCAweDY2LCAweDEwLCAweGJkLCAweDk5LAorCTB4NWMsIDB4M2YsIDB4NTksIDB4Y2MsIDB4ZjksIDB4OTgsIDB4N2UsIDB4ZDYsIDB4YWQsIDB4MmIsIDB4OGUsIDB4MDgsCisJMHhmNywgMHgzYSwgMHg3MywgMHhjYiwgMHg1ZSwgMHgyMywgMHg4YSwgMHhjZCwgMHg5OSwgMHgzYiwgMHg2ZiwgMHgzOSwKKwkweGQ1LCAweGQwLCAweGNmLCAweGZmLCAweGI5LCAweDNhLCAweDQzLCAweGE4LCAweGZjLCAweGQ4LCAweDNhLCAweDY1LAorCTB4MTEsIDB4ZTksIDB4YTMsIDB4ZTMsIDB4OTYsIDB4YTcsIDB4OGMsIDB4M2IsIDB4NmYsIDB4NjksIDB4NWYsIDB4ZjQsCisJMHg0ZCwgMHg2YywgMHhjYSwgMHhiNCwgMHhmZiwgMHhjOSwgMHg3ZSwgMHhjYSwgMHg1OSwgMHhhNywgMHgzNCwgMHg3MiwKKwkweGE4LCAweGVkLCAweDlhLCAweGMwLCAweDlkLCAweGI3LCAweGE0LCAweDE3LCAweGY1LCAweGIyLCAweDhmLCAweDU1LAorCTB4OGMsIDB4MmYsIDB4YjksIDB4M2EsIDB4NTEsIDB4YzYsIDB4ZjYsIDB4OGYsIDB4ZDMsIDB4NDEsIDB4NDksIDB4NjQsCisJMHhhMiwgMHg2ZCwgMHg3ZSwgMHhlMCwgMHgwMywgMHg2YiwgMHg1ZSwgMHg1ZiwgMHg5MSwgMHhhZCwgMHgwMywgMHgxNywKKwkweDc1LCAweGYwLCAweGEwLCAweGU5LCAweGNjLCAweDA2LCAweDFjLCAweGI2LCAweDBlLCAweDNhLCAweDdjLCAweGQ0LAorCTB4NDEsIDB4OTIsIDB4M2EsIDB4YzgsIDB4ZDYsIDB4MTgsIDB4ZTEsIDB4NzcsIDB4YTksIDB4ODMsIDB4NzksIDB4NjMsCisJMHhlYiwgMHhkNiwgMHg5NSwgMHg0NCwgMHhlMCwgMHg3NCwgMHgxOCwgMHhhZiwgMHgzYSwgMHg5YywgMHg5YywgMHgwYiwKKwkweDk3LCAweGIxLCAweDhlLCAweDdhLCAweGJiLCAweGYzLCAweDk2LCAweDhiLCAweDE3LCAweGQ5LCAweDNhLCAweGZmLAorCTB4YjIsIDB4M2IsIDB4YjAsIDB4YzEsIDB4ZGUsIDB4M2IsIDB4ZDcsIDB4OWQsIDB4NTksIDB4YzMsIDB4YTMsIDB4OTksCisJMHhjNywgMHg3ZCwgMHgzYywgMHg3YSwgMHg5OCwgMHhiMywgMHhkYywgMHg0YywgMHg1ZCwgMHgzNSwgMHg3MSwgMHgxYywKKwkweDJiLCAweDI4LCAweGQ3LCAweDQ2LCAweGZlLCAweDZlLCAweGU1LCAweGVmLCAweDBlLCAweGZlLCAweDk2LCAweGY5LAorCTB4NTEsIDB4Y2YsIDB4Y2EsIDB4MTYsIDB4M2IsIDB4MmIsIDB4OWIsIDB4ODMsIDB4ZjIsIDB4NzgsIDB4ODgsIDB4NTcsCisJMHgzMiwgMHgyNiwgMHhmNywgMHg1NywgMHhhZSwgMHgwOSwgMHhjNCwgMHhkOCwgMHhjNiwgMHhmZCwgMHhhNSwgMHhiMiwKKwkweDZmLCAweGM4LCAweDY1LCAweGM0LCAweDdkLCAweDRlLCAweDg4LCAweDdjLCAweDdhLCAweDZiLCAweDNiLCAweGIyLAorCTB4YzQsIDB4ZGUsIDB4ZGYsIDB4ZTcsIDB4YjAsIDB4OTcsIDB4YjIsIDB4NTUsIDB4NzAsIDB4N2UsIDB4NWUsIDB4NTgsCisJMHgzNCwgMHgzNCwgMHhjMywgMHg2MywgMHhjMCwgMHhlNywgMHgzNiwgMHhlMiwgMHhjYywgMHhmOSwgMHgxMywgMHhkNCwKKwkweDgxLCAweGQ4LCAweGM5LCAweDNkLCAweGQ0LCAweDVmLCAweDI3LCAweGViLCAweDFjLCAweDY1LCAweDJjLCAweGRiLAorCTB4Y2QsIDB4ZmUsIDB4ZWQsIDB4ZjUsIDB4ZGIsIDB4YjAsIDB4ZmQsIDB4OWMsIDB4MGMsIDB4YmEsIDB4NzksIDB4OWMsCisJMHhlZCwgMHhlZCwgMHgzNSwgMHg3ZSwgMHg1MywgMHg3NiwgMHhiNCwgMHg1ZSwgMHhmNiwgMHg1MywgMHgzYSwgMHgzMSwKKwkweDZjLCAweGNmLCAweGJiLCAweDQyLCAweDJlLCAweDczLCAweDExLCAweDc5LCAweDgyLCAweDY1LCAweGZkLCAweGQ0LAorCTB4NjgsIDB4OWMsIDB4ZWYsIDB4YjAsIDB4ZWQsIDB4ZWEsIDB4NTAsIDB4OWIsIDB4M2IsIDB4ZTAsIDB4YzYsIDB4OTAsCisJMHhiZCwgMHgwNiwgMHg2ZSwgMHg1OSwgMHg0NSwgMHhiNiwgMHg3ZCwgMHg4OSwgMHgyYywgMHg3NSwgMHhjZCwgMHg5YiwKKwkweDY4LCAweDc4LCAweGViLCAweGQyLCAweDFmLCAweDkwLCAweDI3LCAweDhhLCAweGZjLCAweDczLCAweDcwLCAweDkyLAorCTB4MzEsIDB4MzUsIDB4YWEsIDB4YzUsIDB4ZGIsIDB4NDUsIDB4ZDYsIDB4MzIsIDB4YzMsIDB4MTksIDB4YmUsIDB4MTYsCisJMHhmMSwgMHgxNiwgMHgyNywgMHhmYiwgMHg2YiwgMHgyNiwgMHhhNywgMHgzYywgMHg5NSwgMHhjNywgMHhlZSwgMHg3ZCwKKwkweDY5LCAweDNkLCAweGI2LCAweDVmLCAweGM5LCAweGYxLCAweGQzLCAweGRlLCAweGIxLCAweDQyLCAweGZjLCAweDA5LAorCTB4OTIsIDB4Y2YsIDB4N2EsIDB4ZTAsIDB4OGMsIDB4ZTgsIDB4ZmUsIDB4MjYsIDB4NDcsIDB4NTcsIDB4ZDAsIDB4MDUsCisJMHhmYSwgMHg1OCwgMHhhOSwgMHhjOCwgMHgxYiwgMHhhNywgMHhlYywgMHg4MiwgMHhjNywgMHg2ZSwgMHg2ZCwgMHg4ZCwKKwkweDhkLCAweGQxLCAweGYxLCAweGY5LCAweDJlLCAweDc4LCAweGI0LCAweGI1LCAweGU5LCAweDQyLCAweGVjLCAweGYyLAorCTB4NjgsIDB4NmQsIDB4MDksIDB4ZjEsIDB4NzcsIDB4NTksIDB4YWIsIDB4MGYsIDB4ZGIsIDB4ZGMsIDB4ZTMsIDB4NDgsCisJMHhlNiwgMHhhNSwgMHg1MiwgMHhkOSwgMHg4YiwgMHg0NywgMHhkZiwgMHhhZiwgMHg3MCwgMHgxYSwgMHhiOSwgMHg3NiwKKwkweDM1LCAweGI2LCAweGRiLCAweGUyLCAweGQwLCAweDcwLCAweGNlLCAweDc3LCAweDc1LCAweGFkLCAweGM1LCAweDIxLAorCTB4ZmIsIDB4NWYsIDB4ODksIDB4NGEsIDB4ZTksIDB4N2MsIDB4YmQsIDB4MWMsIDB4N2UsIDB4MmQsIDB4NzYsIDB4ZDksCisJMHhmOCwgMHhjNSwgMHgzNiwgMHg0YSwgMHg4MSwgMHgyNSwgMHg4OSwgMHgwYiwgMHhmYiwgMHg5NywgMHhmZSwgMHhhNCwKKwkweGRmLCAweGFlLCAweDJhLCAweDE1LCAweDEzLCAweGY2LCAweGIzLCAweDkyLCAweDgzLCAweDk5LCAweDE4LCAweDA2LAorCTB4NTMsIDB4NTMsIDB4ZjcsIDB4ZTgsIDB4ZTksIDB4ODcsIDB4ZDgsIDB4ZmUsIDB4ODEsIDB4MzgsIDB4ZTcsIDB4NjksCisJMHhiNiwgMHgyMSwgMHhmYiwgMHhmNywgMHg2NCwgMHhjZiwgMHhkZSwgMHhkNCwgMHhmZCwgMHg3YSwgMHgyMiwgMHg1YiwKKwkweDY1LCAweDE5LCAweDgxLCAweDBkLCAweDdiLCAweDg5LCAweDdmLCAweGQxLCAweDE2LCAweGE5LCAweDZmLCAweDU5LAorCTB4YWYsIDB4Y2QsIDB4MGIsIDB4MjIsIDB4M2IsIDB4Y2QsIDB4ODksIDB4YzEsIDB4YjksIDB4YzAsIDB4NDAsIDB4NTIsCisJMHhmNiwgMHg1MywgMHg5ZCwgMHg4OSwgMHhhZCwgMHg2NiwgMHgxZSwgMHgxOSwgMHhhZCwgMHhhZSwgMHhkMywgMHhiYSwKKwkweDU1LCAweGQ5LCAweDBiLCAweGY1LCAweGMxLCAweDk3LCAweDdiLCAweDhjLCAweDVhLCAweGFkLCAweDQ3LCAweGNkLAorCTB4ZWUsIDB4NjcsIDB4N2MsIDB4ZDksIDB4MGQsIDB4Y2MsIDB4MmUsIDB4MTMsIDB4MGMsIDB4YTgsIDB4MzIsIDB4YTIsCisJMHhiZCwgMHg1NSwgMHg5OCwgMHgwYiwgMHg3ZiwgMHhiNSwgMHg4ZCwgMHhjYiwgMHhmMSwgMHg2ZiwgMHhhYiwgMHg0NiwKKwkweDcwLCAweGE1LCAweGYwLCAweDRhLCAweGY1LCAweDdkLCAweDZiLCAweDg4LCAweGRjLCAweGU0LCAweGVlLCAweGI5LAorCTB4ZmYsIDB4YTcsIDB4MzQsIDB4YmYsIDB4ZWUsIDB4ZDQsIDB4M2UsIDB4OWQsIDB4ZjMsIDB4ZjIsIDB4ZjMsIDB4MDUsCisJMHhiYSwgMHgzZiwgMHhhZCwgMHg4OCwgMHg4ZSwgMHg4NCwgMHg0YiwgMHgyNSwgMHhiMCwgMHg5NSwgMHg3MSwgMHhmNiwKKwkweGJmLCAweGU2LCAweDQ2LCAweGIwLCAweDhmLCAweGZmLCAweDdmLCAweDc2LCAweGE1LCAweGVjLCAweDRkLCAweGI1LAorCTB4YWMsIDB4NjAsIDB4NjAsIDB4NWUsIDB4YjgsIDB4OGEsIDB4NjMsIDB4NzgsIDB4OTYsIDB4ZjcsIDB4N2IsIDB4MzMsCisJMHg2ZiwgMHg1OSwgMHhhNywgMHhhNiwgMHgxYiwgMHhmZCwgMHhjYiwgMHgxOCwgMHhlYywgMHgwNiwgMHhjNiwgMHg3NSwKKwkweDZkLCAweDUyLCAweGZkLCAweGVmLCAweGVlLCAweDk1LCAweDgzLCAweGJiLCAweDgyLCAweDYzLCAweGY5LCAweDdlLAorCTB4YTAsIDB4NGUsIDB4NGIsIDB4YWEsIDB4YTUsIDB4NjUsIDB4YTIsIDB4ZDcsIDB4ODEsIDB4ZjEsIDB4NTcsIDB4YTYsCisJMHgzYywgMHgzYiwgMHgyOCwgMHhmMCwgMHg1OSwgMHg3YiwgMHg1ZCwgMHhhNSwgMHg3NywgMHg4OCwgMHhiZSwgMHgzZSwKKwkweGE0LCAweDQ1LCAweGUzLCAweGQ0LCAweGJiLCAweDdiLCAweDFhLCAweGM3LCAweDdjLCAweGY3LCAweGRjLCAweDJmLAorCTB4ZDksIDB4ZTMsIDB4YWMsIDB4MzYsIDB4NjYsIDB4NzIsIDB4OGMsIDB4MGEsIDB4YjQsIDB4YjksIDB4ZmYsIDB4OTksCisJMHg1ZiwgMHg3ZiwgMHg2ZCwgMHgyNCwgMHhmYiwgMHgxYSwgMHhiMiwgMHg5YSwgMHhlOCwgMHgxYiwgMHg0NSwgMHhhYywKKwkweDczLCAweGI1LCAweGY5LCAweGYwLCAweDhjLCAweGFlLCAweDdhLCAweGRkLCAweDc3LCAweDM3LCAweDZkLCAweDM0LAorCTB4MzQsIDB4ZjcsIDB4ZDcsIDB4MTYsIDB4NmQsIDB4ZGEsIDB4ZmMsIDB4MTYsIDB4NDcsIDB4N2QsIDB4NWIsIDB4YzIsCisJMHg4ZSwgMHg1NSwgMHg5YywgMHg1NywgMHgyMywgMHgzYSwgMHg1NywgMHg3OSwgMHhjNywgMHg0MiwgMHg0ZCwgMHgyMCwKKwkweDNjLCAweGQ3LCAweDFlLCAweDNmLCAweDcwLCAweDZiLCAweDNhLCAweDgxLCAweDZkLCAweDI5LCAweDY5LCAweDUzLAorCTB4YzEsIDB4YjIsIDB4YzAsIDB4ZGIsIDB4OTYsIDB4N2YsIDB4N2EsIDB4MDIsIDB4NWIsIDB4MzIsIDB4OWYsIDB4YzQsCisJMHg0ZCwgMHgwNywgMHhjOSwgMHg4ZCwgMHhmNSwgMHhkNiwgMHgzOCwgMHhmNCwgMHg2OCwgMHhlZSwgMHhkOSwgMHhkNCwKKwkweDFjLCAweDU5LCAweGRiLCAweDk2LCAweGJkLCAweDQ1LCAweGI3LCAweDI0LCAweDAyLCAweDcwLCAweDk3LCAweDEzLAorCTB4ODMsIDB4YzcsIDB4MDIsIDB4ZjIsIDB4MmMsIDB4ZDMsIDB4OGIsIDB4NmMsIDB4OGIsIDB4OTQsIDB4YTksIDB4ZDUsCisJMHhjNiwgMHg5MCwgMHgyNSwgMHg3MywgMHg5NCwgMHhiNSwgMHhkMCwgMHhmZSwgMHhiMiwgMHhkYywgMHgzZSwgMHgwOSwKKwkweDFhLCAweDVlLCAweDhkLCAweGFlLCAweGJkLCAweDQxLCAweGFlLCAweGQ3LCAweDZjLCAweDQ4LCAweDFiLCAweDBhLAorCTB4ZTYsIDB4MDcsIDB4YTYsIDB4YTEsIDB4NmUsIDB4ZTUsIDB4YWIsIDB4YWYsIDB4MTcsIDB4MDUsIDB4OGEsIDB4MTgsCisJMHg0ZiwgMHhjNCwgMHhiNywgMHg4YywgMHg4ZCwgMHhjNywgMHhmMCwgMHgxYiwgMHg2MiwgMHg5MCwgMHhlYywgMHgxOSwKKwkweDRiLCAweDRhLCAweDNkLCAweGI2LCAweDM1LCAweDE3LCAweDY5LCAweGYxLCAweDUzLCAweDQzLCAweGY2LCAweDJmLAorCTB4NWIsIDB4ZDYsIDB4MzUsIDB4ODEsIDB4MzcsIDB4YWQsIDB4NjgsIDB4MGQsIDB4ZTUsIDB4MjEsIDB4NWYsIDB4Y2IsCisJMHhkNSwgMHg5NSwgMHgzMiwgMHhmOSwgMHhiZCwgMHg0MCwgMHg0YSwgMHhlMywgMHgyZCwgMHhhMiwgMHg5MywgMHgyNywKKwkweGNkLCAweDM4LCAweGIzLCAweDAxLCAweGMxLCAweGZkLCAweDBmLCAweDYyLCAweDZmLCAweDE5LCAweDhhLCAweGZkLAorCTB4OGMsIDB4NzEsIDB4OTksIDB4NTIsIDB4YzksIDB4MzgsIDB4ZWEsIDB4ZjQsIDB4OGYsIDB4ZDgsIDB4ZWIsIDB4MDUsCisJMHgxZCwgMHhjNCwgMHg2OCwgMHhlMSwgMHg5NywgMHg5MiwgMHhmMywgMHgzOSwgMHhmMSwgMHg5NCwgMHg1MSwgMHg4NSwKKwkweDI3LCAweGI1LCAweDFjLCAweDU3LCAweDIzLCAweGQ2LCAweGUxLCAweDA3LCAweDg5LCAweDc5LCAweDU5LCAweDdhLAorCTB4MDgsIDB4MzksIDB4YWYsIDB4ZDEsIDB4N2UsIDB4NDYsIDB4ZjksIDB4MGQsIDB4ZmQsIDB4MWMsIDB4NzgsIDB4MjEsCisJMHhiZCwgMHgxMSwgMHgwZiwgMHhjYSwgMHgxYSwgMHhhMiwgMHg1MiwgMHhkYiwgMHg1YywgMHhlNywgMHg5MCwgMHhmZSwKKwkweDM2LCAweDYyLCAweDZiLCAweDQ2LCAweGRhLCAweGZhLCAweDIwLCAweGI2LCAweGQ3LCAweGQ4LCAweDlkLCAweDk3LAorCTB4NTUsIDB4YjAsIDB4ZmMsIDB4ODMsIDB4ZDgsIDB4NTMsIDB4YzYsIDB4ZTMsIDB4ZjYsIDB4ZGMsIDB4YzksIDB4NzMsCisJMHhhZiwgMHg1ZSwgMHg1MywgMHgzMCwgMHhhZiwgMHgxNCwgMHgyYSwgMHhmMywgMHgwNiwgMHg4NywgMHg3MSwgMHgzMywKKwkweDFjLCAweDU1LCAweGRmLCAweGE0LCAweGVkLCAweGM5LCAweGJlLCAweDlhLCAweGFmLCAweGMyLCAweDU5LCAweGU1LAorCTB4YTIsIDB4NmYsIDB4ZGUsIDB4MGEsIDB4NTcsIDB4OTUsIDB4NzAsIDB4ZjUsIDB4MDIsIDB4OGYsIDB4OGUsIDB4ZjIsCisJMHhiZSwgMHhlOCwgMHgzNiwgMHhkYywgMHgyNiwgMHhiYSwgMHg3NSwgMHgxMiwgMHg4NywgMHg3YSwgMHgyNCwgMHhhZiwKKwkweDMzLCAweDJhLCAweGE5LCAweDIzLCAweGJkLCAweDk1LCAweDljLCAweDFlLCAweGU1LCAweGM0LCAweDRjLCAweGM2LAorCTB4NDcsIDB4MzcsIDB4ZjMsIDB4YjcsIDB4YjYsIDB4NzcsIDB4YTksIDB4ZjcsIDB4NzksIDB4N2QsIDB4NjUsIDB4ZTQsCisJMHhmMCwgMHg5NiwgMHhmNSwgMHgzZSwgMHgzOSwgMHhmYywgMHhmYywgMHg0MCwgMHg1ZCwgMHhkNiwgMHgyMCwgMHg0ZSwKKwkweGUxLCAweDA2LCAweGJkLCAweDM5LCAweDRlLCAweGJjLCAweDU5LCAweDZkLCAweDljLCAweGIxLCAweDYyLCAweGFiLAorCTB4YTQsIDB4OGMsIDB4ZWUsIDB4OGIsIDB4MjksIDB4ODUsIDB4M2UsIDB4MTYsIDB4YzAsIDB4M2YsIDB4Y2QsIDB4ODIsCisJMHgyYiwgMHgyMiwgMHhjZiwgMHgxNCwgMHg2NCwgMHhiZCwgMHhiOCwgMHg1MSwgMHg5ZSwgMHhmNSwgMHhiNSwgMHhjOCwKKwkweGY4LCAweDVkLCAweGIyLCAweGVlLCAweDg2LCAweGU4LCAweDg0LCAweDBiLCAweDQ2LCAweDc2LCAweDlmLCAweGNjLAorCTB4ZDksIDB4MGMsIDB4MGIsIDB4ODEsIDB4ODUsIDB4YmYsIDB4NjcsIDB4MmUsIDB4MjQsIDB4ZjMsIDB4NTMsIDB4OWIsCisJMHhhZCwgMHg1NywgMHhiMiwgMHg0MSwgMHgxZiwgMHgzOSwgMHhmZCwgMHhhMywgMHhkMCwgMHg1YiwgMHgxMiwgMHhkNCwKKwkweDc1LCAweDUzLCAweDQ4LCAweDllLCAweGRmLCAweDNiLCAweDdkLCAweDA5LCAweGQ4LCAweDNjLCAweGRlLCAweDNjLAorCTB4ODksIDB4Y2YsIDB4YTEsIDB4OWMsIDB4YjksIDB4ZWIsIDB4ZGMsIDB4YjEsIDB4MTUsIDB4YTgsIDB4YTgsIDB4OGEsCisJMHhmYSwgMHg0YSwgMHg3MSwgMHgxOSwgMHhjZiwgMHhkNywgMHgzMCwgMHgzZiwgMHhmOSwgMHgyMiwgMHgyYSwgMHg1NiwKKwkweGI2LCAweDIyLCAweGMxLCAweGIxLCAweDk3LCAweDFiLCAweDdmLCAweGM1LCAweDZiLCAweGY3LCAweDIxLCAweDk5LAorCTB4NzIsIDB4NzEsIDB4MWMsIDB4M2YsIDB4YjEsIDB4MmEsIDB4NmEsIDB4NDQsIDB4MzYsIDB4ZDMsIDB4NWIsIDB4NjYsCisJMHgzMCwgMHg5ZiwgMHhiNiwgMHg3NSwgMHg0MSwgMHhkYywgMHg0ZSwgMHgwOSwgMHg0NywgMHhhYSwgMHg4YiwgMHhhZSwKKwkweDA3LCAweDczLCAweGZiLCAweDFhLCAweGJkLCAweDc1LCAweDhkLCAweGQyLCAweDQxLCAweDliLCAweGVkLCAweGExLAorCTB4Y2UsIDB4YTUsIDB4YWMsIDB4NjUsIDB4MmQsIDB4MGYsIDB4OWMsIDB4YTYsIDB4OGUsIDB4M2IsIDB4NzgsIDB4NmUsCisJMHhmOCwgMHhkZiwgMHg4NCwgMHg3YSwgMHg1OSwgMHgzMSwgMHg0ZSwgMHg1OCwgMHg3MSwgMHhjZCwgMHg0NywgMHhiYiwKKwkweDU0LCAweDU3LCAweDA5LCAweDlmLCAweDVhLCAweDFhLCAweDdhLCAweDhmLCAweGY3LCAweGI1LCAweGJjLCAweDlkLAorCTB4OWUsIDB4YjksIDB4MjUsIDB4YTcsIDB4Y2IsIDB4MzAsIDB4NzUsIDB4ZjksIDB4NmYsIDB4ZjYsIDB4NzUsIDB4ODcsCisJMHg3ZCwgMHhiZCwgMHgyMywgMHg3ZiwgMHhmZCwgMHhjYywgMHgyZCwgMHgzZCwgMHhjNiwgMHhjYiwgMHhiYywgMHhkZSwKKwkweDRiLCAweGRkLCAweGFiLCAweDE3LCAweDQ5LCAweGZkLCAweDc1LCAweGE2LCAweGQ0LCAweDY3LCAweDRhLCAweDY1LAorCTB4ZjQsIDB4ZTQsIDB4ZTcsIDB4ZTMsIDB4NTAsIDB4N2UsIDB4M2UsIDB4MjYsIDB4ZjIsIDB4NmQsIDB4MzgsIDB4ZDksCisJMHg0NiwgMHgzYywgMHg1YSwgMHgwYSwgMHgxMywgMHg2NSwgMHgwMSwgMHhjMSwgMHg3OSwgMHg5MSwgMHg4YiwgMHg3MywKKwkweDk3LCAweDExLCAweGI5LCAweGQ2LCAweDMwLCAweGRlLCAweDc1LCAweDNkLCAweDUzLCAweDhhLCAweDc4LCAweGM3LAorCTB4NGMsIDB4ZGIsIDB4MGUsIDB4Y2YsIDB4ZGMsIDB4MjIsIDB4ZmIsIDB4ZGUsIDB4ZGUsIDB4NTIsIDB4MWEsIDB4N2QsCisJMHhiMiwgMHg2NSwgMHgyMywgMHg0NSwgMHgyZSwgMHg3YiwgMHhhZiwgMHhlOSwgMHgwYywgMHhkNywgMHgzYiwgMHhlNiwKKwkweDY1LCAweDhiLCAweDYxLCAweGM0LCAweGNlLCAweDI4LCAweDJlLCAweDhmLCAweGUwLCAweDQzLCAweDIyLCAweGRkLAorCTB4YzgsIDB4Y2MsIDB4MmIsIDB4MWUsIDB4NjQsIDB4Y2UsIDB4MTQsIDB4Y2MsIDB4NTAsIDB4YjcsIDB4NmQsIDB4NDQsCisJMHhlYywgMHg0MywgMHhmNiwgMHhkZSwgMHgzNywgMHhlNywgMHhjNCwgMHgwYSwgMHgzNCwgMHhlYSwgMHgwZSwgMHhjYywKKwkweDBiLCAweGNmLCAweDY0LCAweGU2LCAweDQ1LCAweGJiLCAweDM0LCAweDhiLCAweDFkLCAweGJhLCAweGZmLCAweDdhLAorCTB4MmMsIDB4YjcsIDB4ZWIsIDB4ZWQsIDB4NGIsIDB4NjcsIDB4ZGIsIDB4NGIsIDB4MzksIDB4YTcsIDB4OGYsIDB4NTEsCisJMHg4ZSwgMHg2ZCwgMHgwMSwgMHg5MSwgMHhlMywgMHg5YiwgMHg3OSwgMHgzOSwgMHg1YSwgMHgxOSwgMHg0YiwgMHg0ZCwKKwkweGVkLCAweGRhLCAweDQwLCAweGVmLCAweDU5LCAweGJkLCAweDNkLCAweDYzLCAweGViLCAweGVkLCAweDNlLCAweDllLAorCTB4MTcsIDB4MzMsIDB4YmYsIDB4MmYsIDB4YzIsIDB4ZDEsIDB4N2EsIDB4NmYsIDB4N2UsIDB4MWYsIDB4OWIsIDB4ZTQsCisJMHg2YSwgMHg4MiwgMHhiZiwgMHgwZCwgMHg3ZiwgMHhiZCwgMHhkYSwgMHhkMCwgMHhjMywgMHgwZSwgMHg5YiwgMHhkNywKKwkweGJiLCAweDExLCAweGI3LCAweDM5LCAweGIzLCAweDNjLCAweGYzLCAweGFlLCAweGMwLCAweDIzLCAweDc2LCAweDM5LAorCTB4MTcsIDB4NzUsIDB4NTIsIDB4ODYsIDB4NDcsIDB4ZjMsIDB4ZmUsIDB4MjIsIDB4N2IsIDB4MGUsIDB4MWUsIDB4YjMsCisJMHg3ZiwgMHhlZiwgMHhlNiwgMHhkYywgMHhiYSwgMHhlOCwgMHhhYiwgMHg4NSwgMHgxOCwgMHgyNSwgMHhlYiwgMHhlZCwKKwkweGZmLCAweGMzLCAweGY2LCAweGZkLCAweDIxLCAweDFjLCAweGI3LCAweGZmLCAweDY3LCAweDczLCAweGY5LCAweDE2LAorCTB4N2EsIDB4NGMsIDB4ZDksIDB4M2IsIDB4NTMsIDB4ODYsIDB4NmUsIDB4N2IsIDB4MGYsIDB4YjksIDB4YWMsIDB4MDEsCisJMHg1YywgMHg4OSwgMHhjZCwgMHg5YSwgMHhhYywgMHgwNywgMHg5MywgMHhmYiwgMHg2OCwgMHg2MiwgMHgxMywgMHg5ZCwKKwkweDQ4LCAweDZhLCAweGE2LCAweDM3LCAweDUzLCAweDNmLCAweDM1LCAweDU3LCAweDMyLCAweGIxLCAweGE3LCAweGZlLAorCTB4MDMsIDB4MmIsIDB4NmEsIDB4ZTcsIDB4NGYsIDB4MjcsIDB4YWMsIDB4YmQsIDB4YzYsIDB4ZDEsIDB4MTAsIDB4M2QsCisJMHhiOCwgMHhiZCwgMHhjOCwgMHhkNiwgMHg2ZiwgMHhiOCwgMHhjZCwgMHhkZSwgMHhmZiwgMHg0NywgMHg5OSwgMHg5ZiwKKwkweDQ5LCAweDQ4LCAweDFjLCAweDlkLCAweDgzLCAweGI0LCAweDY5LCAweGM3LCAweGUyLCAweDk2LCAweGVkLCAweDljLAorCTB4OTMsIDB4OWUsIDB4NTQsIDB4MjAsIDB4N2EsIDB4MDksIDB4ZWYsIDB4NGQsIDB4MzAsIDB4OTYsIDB4NzUsIDB4NTMsCisJMHg5ZiwgMHhiMSwgMHgxNiwgMHhlMSwgMHg2NywgMHg2YiwgMHhiMCwgMHg5YiwgMHgzNiwgMHgzNiwgMHg2ZSwgMHg1YSwKKwkweGQ2LCAweDNlLCAweDYyLCAweDQ0LCAweGU1LCAweDNjLCAweDE1LCAweGQ5LCAweDlhLCAweDM1LCAweDQ4LCAweDMxLAorCTB4MzYsIDB4ZWQsIDB4MzMsIDB4MWEsIDB4M2YsIDB4NTcsIDB4ODQsIDB4YjgsIDB4ZGYsIDB4MGQsIDB4ZGQsIDB4YjcsCisJMHg4NSwgMHhhMywgMHhiOSwgMHg5NywgMHhmMywgMHg3NSwgMHhkNCwgMHgxNCwgMHhkZSwgMHhlOCwgMHgzYywgMHhiMywKKwkweDE0LCAweDQ2LCAweDc4LCAweGIxLCAweGUzLCAweDI3LCAweGQ2LCAweGE0LCAweGZkLCAweGVjLCAweGI4LCAweGViLAorCTB4NWYsIDB4MjgsIDB4YzMsIDB4NDYsIDB4NzEsIDB4ZGUsIDB4NGEsIDB4Y2UsIDB4ZjEsIDB4YmIsIDB4MDEsIDB4NzksCisJMHg3ZSwgMHgwZCwgMHhkNCwgMHhmNSwgMHgzNSwgMHhiNiwgMHg4YiwgMHgwYywgMHg3YiwgMHg0MywgMHhjZSwgMHhkOCwKKwkweDNlLCAweDA0LCAweDVhLCAweDM2LCAweDI4LCAweGU3LCAweDcyLCAweDgzLCAweDRiLCAweGM2LCAweDRjLCAweDhjLAorCTB4ZDYsIDB4M2YsIDB4NGIsIDB4MWUsIDB4MjMsIDB4ZjUsIDB4OGIsIDB4ZjEsIDB4ODQsIDB4ZjksIDB4YjQsIDB4NTUsCisJMHgzYiwgMHhlMywgMHhmYiwgMHhkNiwgMHg3ZSwgMHg0MywgMHg1ZCwgMHg0ZiwgMHg2ZCwgMHhjNywgMHhjYSwgMHhkOSwKKwkweDU2LCAweDE5LCAweGRiLCAweGJhLCAweDNkLCAweGEwLCAweDliLCAweGRiLCAweGQ5LCAweGQ2LCAweGYxLCAweGM0LAorCTB4ZDEsIDB4YTAsIDB4OWIsIDB4NmQsIDB4M2QsIDB4NmEsIDB4NGEsIDB4NmUsIDB4ZTAsIDB4NmMsIDB4NmUsIDB4ZTYsCisJMHhkYywgMHg3NiwgMHhhNSwgMHgwMiwgMHhiZSwgMHhhZCwgMHg5NCwgMHg0YiwgMHhmMiwgMHhiNywgMHhhZiwgMHgyNiwKKwkweGU0LCAweDVkLCAweDhmLCAweDZmLCAweDcyLCAweDNjLCAweGQxLCAweDhkLCAweDJlLCAweDM0LCAweGRlLCAweDViLAorCTB4NDEsIDB4ZmIsIDB4YTksIDB4NDQsIDB4YzEsIDB4ZDYsIDB4NzUsIDB4MWYsIDB4ZjEsIDB4MGUsIDB4YjcsIDB4YjMsCisJMHhjYywgMHhlYiwgMHg4MSwgMHgzOSwgMHg3OCwgMHgyMSwgMHhkNCwgMHhiOCwgMHg3MiwgMHgwZSwgMHg5YywgMHhlNCwKKwkweDIxLCAweDgxLCAweGU2LCAweDBkLCAweDRhLCAweDVjLCAweDEzLCAweDViLCAweGJjLCAweDJkLCAweGFkLCAweDA3LAorCTB4OWIsIDB4MjAsIDB4ZDgsIDB4ZGQsIDB4NGEsIDB4N2QsIDB4Y2MsIDB4YzEsIDB4ZmIsIDB4MGIsIDB4NDUsIDB4MmUsCisJMHg2NywgMHgzOCwgMHhlOCwgMHgwOCwgMHg3NCwgMHgzYywgMHhjZCwgMHhmOSwgMHhhZCwgMHg5OCwgMHg5NywgMHhjYiwKKwkweDUzLCAweDMzLCAweGY2LCAweDdlLCAweGNkLCAweDU2LCAweDI0LCAweDMzLCAweDI3LCAweGRlLCAweGRkLCAweDZiLAorCTB4YzAsIDB4NzksIDB4YTgsIDB4ZmUsIDB4NDEsIDB4MGIsIDB4ZjYsIDB4YmIsIDB4MjEsIDB4OGQsIDB4MzIsIDB4MGYsCisJMHhhZCwgMHgzMiwgMHgwZiwgMHhhNSwgMHhmNCwgMHhhNywgMHg2YiwgMHgyOCwgMHhmNywgMHg3YSwgMHg1YiwgMHhlZSwKKwkweDM5LCAweDE4LCAweDM2LCAweDY1LCAweGZkLCAweGNiLCAweGE5LCAweGRkLCAweDg2LCAweDVlLCAweDYyLCAweDY3LAorCTB4ZTAsIDB4NGMsIDB4MTcsIDB4ZmIsIDB4NzksIDB4OWQsIDB4MzIsIDB4Y2YsIDB4YTMsIDB4ZGUsIDB4MjcsIDB4NWIsCisJMHg4NCwgMHhiNywgMHhkZSwgMHg4NywgMHhiZSwgMHg1NCwgMHhlMSwgMHhkZCwgMHgxMSwgMHgwNSwgMHhlOSwgMHg4MCwKKwkweGY0LCAweDcxLCAweDFmLCAweDc5LCAweDVjLCAweDk3LCAweDM1LCAweDU5LCAweDIzLCAweGQ3LCAweDc3LCAweDMzLAorCTB4ZjcsIDB4OGYsIDB4NmEsIDB4ZjQsIDB4MDcsIDB4ZWEsIDB4MWQsIDB4ZmEsIDB4MWMsIDB4ZTgsIDB4MTMsIDB4NmYsCisJMHgzOCwgMHhhMiwgMHhmNCwgMHgwMSwgMHhkMywgMHg3YiwgMHg4NiwgMHhkOCwgMHg3MCwgMHgwOCwgMHgxZCwgMHgxNiwKKwkweGFhLCAweDZjLCAweDdiLCAweGY4LCAweGQ5LCAweDg4LCAweGYxLCAweGExLCAweDIyLCAweGIxLCAweDNkLCAweDRiLAorCTB4MWQsIDB4YTgsIDB4OWMsIDB4MTMsIDB4ZDEsIDB4NDEsIDB4MzksIDB4N2QsIDB4NzYsIDB4MmMsIDB4YTAsIDB4ZmIsCisJMHg1ZiwgMHhhMCwgMHgzYywgMHhkYiwgMHgyOSwgMHhjZiwgMHg4YSwgMHhkYywgMHgxYywgMHhmYSwgMHgzNiwgMHgyYiwKKwkweGUyLCAweGQzLCAweDgxLCAweDk2LCAweGQ1LCAweGJjLCAweGJlLCAweDhkLCAweGYyLCAweDA0LCAweGZhLCAweDE0LAorCTB4MGMsIDB4YjUsIDB4ZjQsIDB4OTAsIDB4MmIsIDB4NzYsIDB4NTAsIDB4MDcsIDB4ZTcsIDB4ZTQsIDB4NzEsIDB4ZGIsCisJMHg3MywgMHhkNiwgMHg0MSwgMHgyZSwgMHg1MCwgMHg4YywgMHhiZCwgMHhhNiwgMHhlMCwgMHhiNywgMHg4NiwgMHg2MSwKKwkweGRhLCAweGU5LCAweDFlLCAweGNlLCAweDQ4LCAweGQ0LCAweGFiLCAweGEyLCAweGQ4LCAweDEwLCAweDBjLCAweGE4LAorCTB4ZTEsIDB4MzUsIDB4MTcsIDB4ZTcsIDB4YTYsIDB4MTIsIDB4ZmIsIDB4YjUsIDB4ZGQsIDB4ZjYsIDB4NWUsIDB4ZTUsCisJMHgxYywgMHhiNywgMHhmYiwgMHg4MywgMHgzNSwgMHhlYSwgMHgxNSwgMHg3ZSwgMHgyNiwgMHhlYiwgMHg2MywgMHhiMiwKKwkweDg2LCAweGQ0LCAweGViLCAweGM5LCAweGVkLCAweGQ3LCAweDcyLCAweDUxLCAweDI3LCAweGI5LCAweGViLCAweGNmLAorCTB4NjgsIDB4YzIsIDB4N2QsIDB4MGIsIDB4ZTUsIDB4N2YsIDB4NjksIDB4M2QsIDB4NjksIDB4OTcsIDB4OTcsIDB4NzIsCisJMHgyZSwgMHg5YiwgMHhhMywgMHg5NywgMHhkYSwgMHhlNSwgMHg3ZSwgMHg2OSwgMHgzZCwgMHhhYiwgMHgzOSwgMHhhNywKKwkweDk0LCAweDJiLCAweDNjLCAweDJmLCAweDNjLCAweGZhLCAweDBkLCAweDI3LCAweDMxLCAweGFmLCAweDc4LCAweGVlLAorCTB4NjIsIDB4MWMsIDB4MzMsIDB4NGUsIDB4ZDQsIDB4OWUsIDB4YWMsIDB4ZWYsIDB4NjQsIDB4MWMsIDB4OWIsIDB4YmEsCisJMHg3ZiwgMHhjYiwgMHhjMiwgMHhlMywgMHg3NiwgMHgxZSwgMHhkZSwgMHg0NSwgMHgzZSwgMHg3YiwgMHg3NCwgMHg0NywKKwkweDExLCAweDg0LCAweGEzLCAweGNhLCAweGZhLCAweDVkLCAweDczLCAweGQ5LCAweGI5LCAweDVjLCAweDU2LCAweGY2LAorCTB4MzUsIDB4NWQsIDB4NjYsIDB4NzMsIDB4YzMsIDB4YTgsIDB4MmEsIDB4YjgsIDB4ZmIsIDB4NDksIDB4N2IsIDB4ZjgsCisJMHg4NCwgMHhiYiwgMHg3NCwgMHg2MiwgMHg4ZiwgMHg1MSwgMHhlMCwgMHgyYywgMHg0NywgMHgxZiwgMHg1NCwgMHg4OSwKKwkweDkzLCAweDAzLCAweGU2LCAweDYyLCAweDg5LCAweGNkLCAweDdlLCAweGQ2LCAweDBmLCAweGM2LCAweGQ0LCAweGE5LAorCTB4ZGMsIDB4ZTYsIDB4NzYsIDB4MGYsIDB4MmEsIDB4YmEsIDB4YjYsIDB4M2EsIDB4MjAsIDB4ZmIsIDB4NDcsIDB4NjUsCisJMHgyZiwgMHhhOCwgMHhmNCwgMHg1NSwgMHg5MiwgMHg1ZiwgMHg5NywgMHhmYSwgMHgzOCwgMHhhZSwgMHg1MSwgMHhlOCwKKwkweDRiLCAweGY4LCAweGM2LCAweGZiLCAweGE1LCAweDg1LCAweDdkLCAweDg2LCAweDUxLCAweDViLCAweGNlLCAweDVmLAorCTB4NTksIDB4MmIsIDB4YjUsIDB4ZWMsIDB4NGMsIDB4MGQsIDB4ZTcsIDB4Y2IsIDB4MWUsIDB4Y2QsIDB4Y2IsIDB4MWUsCisJMHhmYiwgMHhkOCwgMHg3NSwgMHhiNSwgMHhhOSwgMHhmYiwgMHhlZSwgMHg4MiwgMHhmOSwgMHhlNywgMHg1ZCwgMHhmMiwKKwkweDBjLCAweDQ2LCAweGQ2LCAweDVjLCAweGU1LCAweDllLCAweDgyLCAweDJlLCAweGUyLCAweDUwLCAweDU0LCAweDZiLAorCTB4NjQsIDB4OWMsIDB4ZDcsIDB4N2QsIDB4NmIsIDB4MzksIDB4MWYsIDB4NzEsIDB4YWYsIDB4ZWMsIDB4NTEsIDB4MmYsCisJMHhjNCwgMHhjOCwgMHg2MiwgMHhlNCwgMHhkNiwgMHgzZSwgMHg2NSwgMHg5ZiwgMHg0NSwgMHg2ZSwgMHhiZCwgMHg5MywKKwkweDc2LCAweDhmLCAweGFlLCAweGY0LCAweGVmLCAweGFkLCAweGFjLCAweGQ3LCAweGM5LCAweDU4LCAweDc4LCAweDZlLAorCTB4N2YsIDB4ZjQsIDB4MTAsIDB4ZjUsIDB4M2EsIDB4Y2MsIDB4N2IsIDB4OWIsIDB4Y2YsIDB4YWUsIDB4YTcsIDB4YzgsCisJMHg5YSwgMHg5MiwgMHhjNCwgMHhkZSwgMHhkZiwgMHg1OSwgMHg2ZCwgMHhlNywgMHg5NSwgMHg5ZCwgMHhiYSwgMHg1NywKKwkweGJjLCAweDI2LCAweDI2LCAweGNmLCAweGRjLCAweDQ2LCAweGYzLCAweGViLCAweGVlLCAweDRkLCAweDFmLCAweDc5LAorCTB4ZTYsIDB4MzYsIDB4NDEsIDB4NWIsIDB4NDIsIDB4NzQsIDB4MzMsIDB4YjksIDB4NWQsIDB4MWMsIDB4M2QsIDB4MTgsCisJMHg0ZCwgMHhkNCwgMHg2OSwgMHg1YiwgMHhhMCwgMHhjOSwgMHg3YSwgMHgzMywgMHhmZiwgMHg3YSwgMHhiMCwgMHgzZiwKKwkweDgxLCAweDY4LCAweGQxLCAweGE1LCAweDk1LCAweGU0LCAweDViLCAweDg4LCAweDNhLCAweDE4LCAweGEzLCAweDFlLAorCTB4NGQsIDB4ZDQsIDB4MzUsIDB4NmYsIDB4ZTMsIDB4OTgsIDB4ZmMsIDB4MmIsIDB4N2IsIDB4MzAsIDB4OWMsIDB4NjgsCisJMHhmYywgMHgyYiwgMHhjNiwgMHgxMSwgMHg3ZiwgMHg5OSwgMHhjZCwgMHg3NSwgMHhlMiwgMHg3ZiwgMHhiZCwgMHg5NywKKwkweDM4LCAweGIwLCAweDI5LCAweGJmLCAweGU2LCAweGQ1LCAweDk2LCAweGY4LCAweDM1LCAweGU1LCAweGI3LCAweDg1LAorCTB4NjQsIDB4YmQsIDB4NGYsIDB4MmEsIDB4MzcsIDB4YzEsIDB4M2MsIDB4ZmYsIDB4MDQsIDB4ZDYsIDB4ZjUsIDB4MmIsCisJMHg3OCwgMHhkMiwgMHgzOCwgMHg4MSwgMHhiNSwgMHg0MywgMHgyMiwgMHhjZiwgMHgwOSwgMHhhYywgMHhlOSwgMHg3ZiwKKwkweDA5LCAweDdiLCAweGZhLCAweDY3LCAweGEwLCAweGM5LCAweGQ2LCAweDRkLCAweDA3LCAweDM2LCAweGVjLCAweDNjLAorCTB4ODgsIDB4ZWQsIDB4MjksIDB4MGIsIDB4ZGIsIDB4NDIsIDB4MWUsIDB4YWMsIDB4N2YsIDB4NTgsIDB4YzEsIDB4ZjIsCisJMHhjMCwgMHg2MSwgMHg2YywgMHhkOSwgMHg2OSwgMHhlMSwgMHhlMiwgMHg1MCwgMHgyNywgMHg5YSwgMHhjZCwgMHgzMiwKKwkweDE0LCAweDU3LCAweGNkLCAweDZiLCAweDU3LCAweDU5LCAweGFlLCAweDZkLCAweGI4LCAweDIzLCAweGJmLCAweDJmLAorCTB4NzksIDB4M2YsIDB4YjEsIDB4NDAsIDB4ODUsIDB4Y2YsIDB4OTAsIDB4M2QsIDB4YzcsIDB4NTEsIDB4ZTUsIDB4YTYsCisJMHg0YywgMHg5MywgMHhkMiwgMHg5YSwgMHg3ZiwgMHg2NiwgMHg3OSwgMHg3ZCwgMHhhNiwgMHhhOCwgMHgwMiwgMHhhNSwKKwkweDcxLCAweGVjLCAweDA5LCAweDlkLCAweGMwLCAweGQwLCAweGQwLCAweDA3LCAweGU1LCAweDM5LCAweDdmLCAweDk5LAorCTB4MjAsIDB4NzcsIDB4OTAsIDB4OWMsIDB4YzMsIDB4YTQsIDB4NGQsIDB4N2QsIDB4ZDIsIDB4ZmIsIDB4NDAsIDB4NjIsCisJMHg3NywgMHg5MywgMHhmOCwgMHhlOSwgMHhlMCwgMHg0OSwgMHg5YywgMHgxYywgMHhmYywgMHgzNywgMHgyYywgMHhkMSwKKwkweDI0LCAweDdmLCAweGI0LCAweDNhLCAweDlkLCAweDExLCAweGNiLCAweGRhLCAweGQ1LCAweDEwLCAweGI3LCAweDZhLAorCTB4OGMsIDB4NWYsIDB4YjAsIDB4ZWQsIDB4MGEsIDB4NGMsIDB4OGYsIDB4YmMsIDB4ODgsIDB4NmQsIDB4MWEsIDB4ZGIsCisJMHg0YSwgMHhlZCwgMHhjNywgMHgwZSwgMHhjNiwgMHg3NSwgMHg1ZiwgMHhlNCwgMHg2NiwgMHhmOCwgMHg1MiwgMHg1OSwKKwkweGIzLCAweDFhLCAweGQxLCAweDFkLCAweGQ1LCAweGQwLCAweDM3LCAweDU2LCAweDM5LCAweDhjLCAweDhlLCAweDdmLAorCTB4NTUsIDB4ZWEsIDB4NzEsIDB4N2QsIDB4ZTYsIDB4MjQsIDB4N2UsIDB4M2UsIDB4NjgsIDB4ZWYsIDB4YTUsIDB4NmEsCisJMHhmZCwgMHhhZSwgMHg2MiwgMHg3NSwgMHg2ZSwgMHgwYiwgMHhlOSwgMHhjZCwgMHhmZiwgMHg0MywgMHg4OSwgMHhjNiwKKwkweDRiLCAweDY5LCAweDUzLCAweDI1LCAweGNjLCAweDA5LCAweDZlLCAweDE4LCAweDk0LCAweDFjLCAweGIxLCAweDE1LAorCTB4ZWUsIDB4M2UsIDB4M2QsIDB4YmIsIDB4OTQsIDB4M2MsIDB4ZmIsIDB4ZWUsIDB4MDUsIDB4ZjEsIDB4OTksIDB4ZDMsCisJMHg2OCwgMHg5NywgMHgwZSwgMHg0NSwgMHgwZiwgMHgxYSwgMHg2YSwgMHgyNywgMHg4ZSwgMHg5OCwgMHhmYSwgMHhjNCwKKwkweGVmLCAweDFjLCAweGM2LCAweGQwLCAweDc3LCAweDUwLCAweDhmLCAweDU1LCAweDE5LCAweDdkLCAweGU4LCAweDMyLAorCTB4ZTYsIDB4NjEsIDB4NWIsIDB4OTIsIDB4MjYsIDB4NTIsIDB4NDksIDB4YmQsIDB4YjUsIDB4YzMsIDB4ZDEsIDB4OGIsCisJMHgzYiwgMHgwMiwgMHhiNSwgMHgxYiwgMHhkZiwgMHgyNSwgMHg5NywgMHhmMywgMHgxMCwgMHg1MywgMHg5MiwgMHhlMywKKwkweDIzLCAweGNjLCAweDVmLCAweDdiLCAweGIxLCAweGUxLCAweGUxLCAweDA4LCAweGQ2LCAweGVmLCAweDMyLCAweGQxLAorCTB4OTMsIDB4MWMsIDB4YTEsIDB4NmMsIDB4M2YsIDB4MmMsIDB4OTcsIDB4YmQsIDB4MzQsIDB4MmQsIDB4YTEsIDB4ZjgsCisJMHhiNSwgMHgyYSwgMHgwMiwgMHg1MSwgMHhmNiwgMHhkOSwgMHhhOCwgMHg0NiwgMHgwMiwgMHg3ZSwgMHg1NSwgMHg2MSwKKwkweGY0LCAweDFmLCAweDc3LCAweGEyLCAweDliLCAweDY1LCAweGZhLCAweDUyLCAweGI0LCAweGI5LCAweGE0LCAweDliLAorCTB4ZjEsIDB4NzIsIDB4MTYsIDB4ODYsIDB4YzcsIDB4N2MsIDB4ZDgsIDB4MzcsIDB4ZTYsIDB4YzEsIDB4ZDAsIDB4OTgsCisJMHhjNiwgMHhhMywgMHgxNCwgMHgwZiwgMHgwZCwgMHhjOCwgMHg5ZSwgMHgxNCwgMHgyZiwgMHg5ZSwgMHhkOCwgMHhlYiwKKwkweGM2LCAweGE2LCAweDA3LCAweDNjLCAweDk4LCAweDEzLCAweDk5LCAweDhlLCAweGJkLCAweDdiLCAweDRiLCAweGIxLAorCTB4OWIsIDB4ZDcsIDB4YWIsIDB4MTYsIDB4ZmEsIDB4ZjEsIDB4MzgsIDB4YWYsIDB4ZjcsIDB4M2YsIDB4ZTAsIDB4ZTIsCisJMHgzYywgMHg1YywgMHg4YywgMHgwMywgMHgzNCwgMHhlYywgMHhhMSwgMHhiMSwgMHgzMiwgMHhhNCwgMHgwNiwgMHg2OCwKKwkweGYyLCAweGU0LCAweGFjLCAweDZmLCAweDMxLCAweGMzLCAweDE4LCAweGRkLCAweGNiLCAweGQ4LCAweGY4LCAweGIwLAorCTB4ODksIDB4MDQsIDB4ZmIsIDB4ZDksIDB4NGUsIDB4NWQsIDB4ZjUsIDB4MTAsIDB4ZDcsIDB4MzYsIDB4OGMsIDB4MDksCisJMHhjNiwgMHhhZiwgMHhjMiwgMHgzNSwgMHg3ZCwgMHg3YSwgMHg3MywgMHg5MywgMHg2MiwgMHg0NCwgMHgxNywgMHhkOSwKKwkweGZiLCAweGI0LCAweGU0LCAweGJkLCAweGFkLCAweDU1LCAweDY4LCAweDRjLCAweGU4LCAweDY2LCAweDEzLCAweDNhLAorCTB4NzEsIDB4OGMsIDB4ZTMsIDB4ZmUsIDB4N2YsIDB4ZTgsIDB4YjcsIDB4OGIsIDB4MWQsIDB4N2EsIDB4ZWYsIDB4ZDUsCisJMHhlYSwgMHg0MSwgMHhlYywgMHhjOCwgMHgxYywgMHgyMiwgMHg1NywgMHgwNywgMHhjMiwgMHg3YiwgMHgwZSwgMHg5MiwKKwkweGJmLCAweDFkLCAweDIxLCAweGZlLCAweGJjLCAweDZlLCAweGY5LCAweDBjLCAweDE1LCAweGQ3LCAweGRmLCAweDZmLAorCTB4ODQsIDB4ZGYsIDB4NTMsIDB4MDIsIDB4MWIsIDB4N2YsIDB4NDUsIDB4MWQsIDB4N2MsIDB4N2UsIDB4YWYsIDB4OGEsCisJMHhlYiwgMHg3NiwgMHgyYywgMHg0NiwgMHgzYSwgMHgxNCwgMHhjNSwgMHhmNiwgMHg0NSwgMHgyYSwgMHhhZSwgMHg3ZCwKKwkweGY4LCAweDIwLCAweDcxLCAweDdmLCAweGMyLCAweGU2LCAweGM5LCAweGQ5LCAweGY0LCAweDdkLCAweDA4LCAweGY2LAorCTB4YzksIDB4OWEsIDB4YmMsIDB4OWIsIDB4ZjEsIDB4YmIsIDB4MWMsIDB4YzcsIDB4ZmIsIDB4M2IsIDB4ZTksIDB4YjcsCisJMHhlNSwgMHgzOCwgMHgzYSwgMHg3NCwgMHg5MCwgMHhmNiwgMHg1OCwgMHg4ZSwgMHgyMywgMHhmZCwgMHhjNiwgMHhjNCwKKwkweDRmLCAweDFkLCAweGU1LCAweDc4LCAweDgyLCAweGU3LCAweDNiLCAweDc4LCAweGJlLCAweDcwLCAweGMwLCAweGU4LAorCTB4ZWYsIDB4NTAsIDB4Y2IsIDB4YjEsIDB4NjAsIDB4NGYsIDB4MDMsIDB4ZmEsIDB4OTMsIDB4NjIsIDB4OWIsIDB4MWEsCisJMHgzNiwgMHg4ZSwgMHhkNSwgMHhlNywgMHg3NSwgMHgyZiwgMHgzYSwgMHhmNywgMHhlMiwgMHg0ZSwgMHhlYSwgMHhlYSwKKwkweDhlLCAweDFkLCAweDlkLCAweGVjLCAweGNmLCAweDQ3LCAweDlkLCAweDFmLCAweGM0LCAweDQzLCAweGNjLCAweGViLAorCTB4YjYsIDB4MjUsIDB4N2QsIDB4MzgsIDB4OWQsIDB4MzIsIDB4ZmMsIDB4NWYsIDB4NTIsIDB4MGMsIDB4YjMsIDB4NDQsCisJMHgwOSwgMHg2OCwgMHhjNywgMHhlMSwgMHhjMywgMHhjOSwgMHg0YywgMHgyOSwgMHhiYSwgMHgwNywgMHg2NiwgMHhlMSwKKwkweGE3LCAweGI0LCAweGNmLCAweDA3LCAweDFmLCAweDkwLCAweGZlLCAweDI2LCAweDE4LCAweDFmLCAweDY2LCAweGUzLAorCTB4ODksIDB4MTEsIDB4OTMsIDB4NmQsIDB4Y2IsIDB4M2MsIDB4NDksIDB4Y2MsIDB4ZTksIDB4ODEsIDB4MmIsIDB4MjUsCisJMHhiZSwgMHgxMSwgMHhkZCwgMHg0MSwgMHhiMywgMHgyMCwgMHgyNiwgMHgxZSwgMHg0NiwgMHhhNiwgMHg1ZiwgMHhlZiwKKwkweGJkLCAweDQxLCAweDE1LCAweDVlLCAweGFkLCAweDUyLCAweDk3LCAweDBlLCAweDRjLCAweDZhLCAweDdhLCAweGJjLAorCTB4NGEsIDB4OGQsIDB4ZjcsIDB4MzMsIDB4N2YsIDB4OGQsIDB4NTcsIDB4YWIsIDB4ODcsIDB4ZjEsIDB4NDQsIDB4YmYsCisJMHgxMywgMHhmMywgMHgxNiwgMHhhYSwgMHhiYywgMHgxZSwgMHgzZiwgMHhjMywgMHhkOCwgMHgxNiwgMHg5ZiwgMHhhMywKKwkweDlhLCAweGQ4LCAweDZkLCAweGNiLCAweDhhLCAweDc4LCAweDExLCAweGI5LCAweDdkLCAweGU1LCAweGMyLCAweDVhLAorCTB4YzYsIDB4MmYsIDB4ODcsIDB4ZDgsIDB4NWUsIDB4YWMsIDB4NWMsIDB4NzUsIDB4NTIsIDB4ZWYsIDB4MjcsIDB4MzEsCisJMHg0MiwgMHhiYiwgMHg3ZSwgMHg5NCwgMHhjNywgMHg4MSwgMHg0MSwgMHhhYiwgMHg3MywgMHgzOSwgMHgzOSwgMHhmNywKKwkweGM1LCAweDAxLCAweGFiLCAweGYzLCAweDA2LCAweGQzLCAweGYwLCAweDE1LCAweGE5LCAweDgxLCAweGU4LCAweGRkLAorCTB4MzgsIDB4ODksIDB4ZmQsIDB4MjMsIDB4NTIsIDB4MDYsIDB4NmUsIDB4NmYsIDB4ODQsIDB4NzksIDB4NzUsIDB4ZDIsCisJMHhlYSwgMHhkYywgMHg2MSwgMHg1ZSwgMHg4YywgMHgwNiwgMHgzYiwgMHgzNywgMHhmZSwgMHg1NSwgMHg3OSwgMHgwZSwKKwkweDMzLCAweGM1LCAweDhmLCAweDY0LCAweDBkLCAweDY0LCAweDEyLCAweGJmLCAweDYyLCAweDNiLCAweGVmLCAweDBkLAorCTB4NTYsIDB4NjIsIDB4NWEsIDB4YjUsIDB4ZjgsIDB4YzEsIDB4MDksIDB4YmMsIDB4ZGQsIDB4ZmYsIDB4MjIsIDB4NGUsCisJMHhmNywgMHg1YiwgMHg1OCwgMHgxMCwgMHhiMiwgMHhlMCwgMHgwYywgMHhkNSwgMHg5OSwgMHg0ZCwgMHhlYSwgMHg2NSwKKwkweGM0LCAweDA4LCAweDA1LCAweGQ3LCAweGNjLCAweDdkLCAweDA5LCAweGVmLCAweGQwLCAweGZmLCAweGFmLCAweDlkLAorCTB4NmIsIDB4ZDksIDB4YjIsIDB4ZjQsIDB4NjEsIDB4YTEsIDB4YjUsIDB4YmQsIDB4NDYsIDB4ZmMsIDB4YzYsIDB4YjQsCisJMHhmNywgMHhmNSwgMHg3YywgMHg3MiwgMHgxZSwgMHg1YywgMHhkOCwgMHhiNywgMHgyNiwgMHhiOSwgMHhmMCwgMHg0OSwKKwkweDBjLCAweDBmLCAweDFhLCAweGQxLCAweDc1LCAweDA1LCAweDM5LCAweGZiLCAweDRmLCAweDUyLCAweDA3LCAweDE2LAorCTB4NzYsIDB4OTgsIDB4NDcsIDB4MWYsIDB4YWUsIDB4YzIsIDB4YmMsIDB4MzMsIDB4Y2MsIDB4MWEsIDB4YWYsIDB4OTgsCisJMHg0MywgMHhkYiwgMHg1OSwgMHhiMCwgMHgzMCwgMHg2MCwgMHgyZSwgMHg1MywgMHhkZiwgMHhhNCwgMHg5ZiwgMHg5ZSwKKwkweGM0LCAweGJlLCAweGExLCAweDAyLCAweDVlLCAweGZiLCAweGQwLCAweDQ0LCAweDNmLCAweGNmLCAweGVkLCAweDY1LAorCTB4ZjcsIDB4YTIsIDB4MzEsIDB4NzUsIDB4YzgsIDB4NWUsIDB4N2YsIDB4MzgsIDB4NDAsIDB4N2MsIDB4Y2MsIDB4M2QsCisJMHhkMywgMHhkNCwgMHgzMCwgMHg5MiwgMHg2OSwgMHgyMiwgMHgzNiwgMHg0NCwgMHhmMSwgMHhjZiwgMHg5OSwgMHgwOCwKKwkweGYxLCAweDIxLCAweDRjLCAweDdjLCAweDY4LCAweDIwLCAweDNlLCAweDk4LCAweGM0LCAweDg3LCAweDdhLCAweGUyLAorCTB4NDMsIDB4ZDAsIDB4N2UsIDB4ZDYsIDB4MmYsIDB4NmIsIDB4ZTYsIDB4NDMsIDB4YTMsIDB4MmYsIDB4YTIsIDB4NjgsCisJMHhlMCwgMHgwNCwgMHg1YywgMHhmNCwgMHg4MSwgMHhlMywgMHhhNiwgMHg0NSwgMHg3ZSwgMHg1MiwgMHhhNywgMHhhZCwKKwkweGMxLCAweGM1LCAweDRhLCAweDU0LCAweGYzLCAweDYyLCAweDI4LCAweDczLCAweDAyLCAweDI1LCAweDAzLCAweDFhLAorCTB4YzcsIDB4MjIsIDB4ZmIsIDB4MzMsIDB4NmEsIDB4YzMsIDB4YmQsIDB4YzQsIDB4ZWEsIDB4NWYsIDB4MWIsIDB4NzUsCisJMHhiZCwgMHg1ZSwgMHhkNCwgMHhlZCwgMHhhZSwgMHg4MSwgMHhkMSwgMHhiZiwgMHg1MCwgMHg5ZCwgMHhhYiwgMHg0NCwKKwkweGJmLCAweGUwLCAweGU1LCAweDM4LCAweGFiLCAweDMxLCAweGZiLCAweDAxLCAweDBkLCAweDczLCAweDc4LCAweGZjLAorCTB4NTMsIDB4YWEsIDB4NzYsIDB4ZTIsIDB4NzUsIDB4MDcsIDB4YmMsIDB4MzMsIDB4NDgsIDB4NzcsIDB4NjYsIDB4OTIsCisJMHgwOSwgMHg5MCwgMHhkNSwgMHg3YSwgMHg3ZCwgMHhiOCwgMHhlNCwgMHhjMCwgMHg0OSwgMHg1NSwgMHg0MSwgMHhmNiwKKwkweDBiLCAweDEyLCAweGYzLCAweGVhLCAweDgyLCAweDNkLCAweGFhLCAweDJhLCAweDZiLCAweDQ4LCAweGM0LCAweDcwLAorCTB4MWUsIDB4MmEsIDB4MjIsIDB4NjQsIDB4MTEsIDB4YjMsIDB4OTgsIDB4NWYsIDB4NTgsIDB4NmIsIDB4Y2MsIDB4MTIsCisJMHg2YywgMHhhZSwgMHg1NywgMHg2NSwgMHg2ZiwgMHhjOCwgMHgyMSwgMHg4OSwgMHg1MSwgMHgzMywgMHgxOCwgMHgyMywKKwkweDRhLCAweDkzLCAweGYxLCAweGRiLCAweDY2LCAweGMwLCAweDgzLCAweDkyLCAweGE0LCAweDY1LCAweDNkLCAweDE2LAorCTB4ZDIsIDB4ZTAsIDB4ODksIDB4MDQsIDB4YTIsIDB4MWIsIDB4OTgsIDB4NDYsIDB4N2UsIDB4NjEsIDB4NWUsIDB4MTgsCisJMHhkNywgMHg2NCwgMHgwZSwgMHg2MCwgMHg4MCwgMHhlMywgMHg1YiwgMHg5ZSwgMHgyOSwgMHhiYywgMHhlMywgMHhmOSwKKwkweGM5LCAweDdmLCAweGU3LCAweGRlLCAweDE1LCAweGJkLCAweDY0LCAweGY3LCAweDBjLCAweDE4LCAweGRhLCAweDVkLAorCTB4NmEsIDB4YmMsIDB4OTIsIDB4MWMsIDB4ZmMsIDB4MDAsIDB4ZTMsIDB4OWUsIDB4MzIsIDB4NzksIDB4YTMsIDB4ODIsCisJMHhkNiwgMHg4MSwgMHgzOCwgMHhhNiwgMHg4NSwgMHg3ZSwgMHhhMCwgMHhjNCwgMHhhYSwgMHg3NSwgMHhiZiwgMHg1ZiwKKwkweGE5LCAweGM2LCAweDhkLCAweDBmLCAweDUwLCAweGQ3LCAweDBiLCAweDI2LCAweDY4LCAweDJiLCAweDNlLCAweDdjLAorCTB4NjcsIDB4NTQsIDB4NzQsIDB4NWIsIDB4M2IsIDB4YjQsIDB4ODMsIDB4ZTMsIDB4OTgsIDB4OTgsIDB4N2IsIDB4NDAsCisJMHg3MCwgMHhmMiwgMHhhMCwgMHgxYiwgMHg4ZSwgMHg4MywgMHhkMywgMHg5OSwgMHg5YiwgMHhkNiwgMHhjZiwgMHhiZCwKKwkweGE0LCAweGUzLCAweGRmLCAweDU0LCAweGQxLCAweDhiLCAweGYwLCAweDZiLCAweGJkLCAweDNmLCAweGFlLCAweDE4LAorCTB4ZGEsIDB4MmYsIDB4OTUsIDB4MDMsIDB4ZTQsIDB4NmMsIDB4NWUsIDB4M2MsIDB4OTYsIDB4MzksIDB4NGMsIDB4NWQsCisJMHhlZSwgMHhjZiwgMHhlNywgMHg0YiwgMHhhYiwgMHg5MCwgMHhlOCwgMHg5MywgMHg3ZCwgMHg4MSwgMHgyNywgMHgzMCwKKwkweDdiLCAweDQwLCAweDZmLCAweGQ5LCAweGFhLCAweDE4LCAweGMxLCAweDZiLCAweDk1LCAweDEzLCAweDk4LCAweDM5LAorCTB4MTAsIDB4ZTQsIDB4NWMsIDB4NmEsIDB4NTgsIDB4OTYsIDB4MmMsIDB4ZTAsIDB4YTcsIDB4NjAsIDB4ZjAsIDB4MmEsCisJMHg2MiwgMHhiMCwgMHhiNSwgMHhmOCwgMHhhNywgMHg2NiwgMHg5YywgMHgzOSwgMHg4ZSwgMHg2ZSwgMHgzYSwgMHgxNSwKKwkweGJkLCAweDc1LCAweGFlLCAweDIyLCAweGZiLCAweDgwLCAweDhjLCAweDMzLCAweDZkLCAweGFjLCAweGUzLCAweDE5LAorCTB4YTgsIDB4YzcsIDB4NTcsIDB4MzksIDB4ZTYsIDB4NjYsIDB4Y2UsIDB4ZGIsIDB4OGIsIDB4MGIsIDB4MmQsIDB4MmMsCisJMHg1YSwgMHhhOCwgMHhlZiwgMHgyZSwgMHg3MSwgMHg0NCwgMHhlZiwgMHhhYSwgMHg0MiwgMHhiNiwgMHhhMywgMHg4NiwKKwkweDc2LCAweDczLCAweGM3LCAweDAyLCAweDNkLCAweGZjLCAweDAzLCAweGUyLCAweDJlLCAweDcxLCAweDFhLCAweGRkLAorCTB4OGMsIDB4M2IsIDB4NmIsIDB4MTgsIDB4OGIsIDB4NGEsIDB4MjMsIDB4N2EsIDB4MmYsIDB4NzMsIDB4ZDQsIDB4ZjcsCisJMHg2ZSwgMHg3NSwgMHg0NCwgMHg0MywgMHhmMiwgMHgxZSwgMHhkMSwgMHhkZiwgMHg2MywgMHgzMSwgMHhkYywgMHhhMSwKKwkweDBhLCAweGUyLCAweGEwLCAweDllLCAweDdkLCAweDExLCAweGZhLCAweGVlLCAweGFmLCAweDkyLCAweDkzLCAweGZlLAorCTB4OTgsIDB4ZmMsIDB4YWUsIDB4ZTYsIDB4ZDIsIDB4NDMsIDB4YzQsIDB4YTgsIDB4MTEsIDB4M2MsIDB4OTgsIDB4MzksCisJMHg4OCwgMHhkZCwgMHg5OSwgMHgzNCwgMHg3NiwgMHg2NiwgMHhiNiwgMHgyOSwgMHg0MywgMHhmNiwgMHhiMywgMHg0NSwKKwkweDQ1LCAweGRlLCAweDk5LCAweDhiLCAweDU2LCAweDI4LCAweDVmLCAweDQ2LCAweDc5LCAweGU4LCAweDViLCAweGQ2LAorCTB4NTAsIDB4OTUsIDB4OGEsIDB4Y2EsIDB4NTAsIDB4MTAsIDB4ZDcsIDB4MjQsIDB4ZTMsIDB4NzAsIDB4NDQsIDB4ZGUsCisJMHhiNSwgMHhlNCwgMHg3ZCwgMHhlZCwgMHhmNSwgMHhlMywgMHgwNiwgMHhhZSwgMHg0ZSwgMHg5NiwgMHgyMiwgMHhiNiwKKwkweGM3LCAweGIyLCAweDdhLCAweDFiLCAweDljLCAweDU4LCAweDNiLCAweDVlLCAweDhmLCAweDY1LCAweDAzLCAweDBmLAorCTB4NTksIDB4NzMsIDB4MTgsIDB4NzMsIDB4M2UsIDB4YmMsIDB4ZGMsIDB4ODMsIDB4NWIsIDB4ZjcsIDB4NzgsIDB4ZDAsCisJMHg5NiwgMHg4YywgMHhjMiwgMHgxNywgMHgyOSwgMHhlMywgMHhlZiwgMHg4MCwgMHhiOSwgMHgwNCwgMHhjNiwgMHhjNCwKKwkweDA0LCAweDhjLCAweGRlLCAweGFiLCAweDFjLCAweDgxLCAweGZkLCAweDYxLCAweGQ1LCAweDgzLCAweGJmLCAweDIxLAorCTB4OGUsIDB4MmYsIDB4MjcsIDB4ZWUsIDB4YzQsIDB4YzYsIDB4MmQsIDB4NTQsIDB4NDYsIDB4YmMsIDB4YjgsIDB4OGQsCisJMHhmNSwgMHhhZiwgMHhlMywgMHhkYywgMHhiZiwgMHhiMywgMHg2OCwgMHgzZiwgMHhiMSwgMHg0MCwgMHhmNiwgMHg0MiwKKwkweDZhLCAweGQ4LCAweDMwLCAweGVlLCAweGE2LCAweGFlLCAweGRjLCAweDg4LCAweGVkLCAweGFiLCAweGM2LCAweGQ1LAorCTB4MGYsIDB4ZjgsIDB4NzEsIDB4ZWIsIDB4YjgsIDB4MDcsIDB4OGQsIDB4NDksIDB4NmIsIDB4ZjEsIDB4MDEsIDB4MzMsCisJMHhiZSwgMHg1MiwgMHg4MywgMHg4MSwgMHhiNiwgMHg3MSwgMHgyZiwgMHhiZSwgMHg5MiwgMHhkNCwgMHg3ZCwgMHhkNywKKwkweDMyLCAweGU3LCAweDFmLCAweDMxLCAweDgzLCAweGY4LCAweDVmLCAweGUzLCAweDNlLCAweGRjLCAweDk0LCAweDNjLAorCTB4MmEsIDB4NzksIDB4ZTQsIDB4MTIsIDB4MjcsIDB4NjMsIDB4Y2YsIDB4YmQsIDB4ZTMsIDB4YjMsIDB4YjAsIDB4MzIsCisJMHhhOSwgMHg5ZiwgMHg5OSwgMHgyMCwgMHhiNywgMHhlYiwgMHhkYywgMHg2NywgMHhlMiwgMHhhZSwgMHg3MSwgMHgxNSwKKwkweGFkLCAweDZjLCAweGU3LCAweGM2LCAweGU0LCAweDZjLCAweDc0LCAweGVjLCAweDZiLCAweGEwLCAweDBjLCAweDBiLAorCTB4YjEsIDB4N2MsIDB4YzAsIDB4MDksIDB4OTMsIDB4MmMsIDB4MWUsIDB4NWYsIDB4MDQsIDB4NWEsIDB4MDYsIDB4MjYsCisJMHg5OCwgMHhjNywgMHhkZCwgMHg4NywgMHhlZCwgMHg3ZCwgMHgyNiwgMHg2ZSwgMHgxZiwgMHg5NywgMHhmMywgMHg4MywKKwkweGY2LCAweDNiLCAweGFlLCAweGVmLCAweDNkLCAweGJjLCAweDEwLCAweDlmLCAweDFmLCAweDUwLCAweDg5LCAweDAzLAorCTB4YzUsIDB4MTgsIDB4NWEsIDB4YTksIDB4ZTAsIDB4MmIsIDB4YmMsIDB4YmUsIDB4MzUsIDB4MjUsIDB4N2IsIDB4OTAsCisJMHg4MSwgMHhkMCwgMHg4ZSwgMHhjMCwgMHhmZSwgMHgyYSwgMHg3MiwgMHg4NiwgMHg0NSwgMHgwZiwgMHhlNywgMHhhZSwKKwkweDNmLCAweDQ4LCAweDljLCAweDJmLCAweDIxLCAweGNlLCAweDk3LCAweDkxLCAweGMzLCAweDVlLCAweDM1LCAweDdjLAorCTB4MTAsIDB4ZjcsIDB4MTMsIDB4OTcsIDB4MGYsIDB4MGQsIDB4NzQsIDB4MzIsIDB4ZWUsIDB4OTQsIDB4ZTMsIDB4NzEsCisJMHhjNiwgMHg4MSwgMHgyNCwgMHhjZiwgMHg0ZiwgMHhlYywgMHgzMCwgMHgzYSwgMHg0YSwgMHg4OCwgMHhkMywgMHgzZiwKKwkweDIwLCAweGZlLCAweGY2LCAweDEyLCAweDMzLCAweGVlLCAweDQ4LCAweDMyLCAweGRjLCAweGVmLCAweDYwLCAweDBlLAorCTB4NzAsIDB4NjksIDB4NzQsIDB4YmUsIDB4ODcsIDB4MzksIDB4ZDYsIDB4YjUsIDB4NGEsIDB4YzAsIDB4ZjcsIDB4MjYsCisJMHhjYSwgMHhlMSwgMHg3OCwgMHhiOCwgMHgxYSwgMHg4ZCwgMHgwZiwgMHg0OCwgMHgxOSwgMHhjMSwgMHgyZiwgMHgxNSwKKwkweGVhLCAweDVlLCAweDI3LCAweDc1LCAweDdlLCAweDE4LCAweDU2LCAweGJmLCAweDgzLCAweGUzLCAweGFkLCAweDM1LAorCTB4YzksIDB4YzAsIDB4ZjEsIDB4OWEsIDB4YTksIDB4NmIsIDB4ZmYsIDB4NGMsIDB4YWMsIDB4N2QsIDB4OWYsIDB4OTgsCisJMHhlYSwgMHg5ZiwgMHhkMSwgMHg4MCwgMHgyNiwgMHhjMywgMHhlNCwgMHg3MSwgMHgxOCwgMHgyNywgMHhmYiwgMHgwZCwKKwkweDUzLCAweGY2LCAweGU0LCAweGJkLCAweDRlLCAweDllLCAweDM3LCAweDM5LCAweDgzLCAweDMxLCAweGQzLCAweDEwLAorCTB4M2YsIDB4MWMsIDB4ZTEsIDB4NzgsIDB4NTQsIDB4YzksIDB4NGIsIDB4ZTAsIDB4MTgsIDB4MDMsIDB4ZGUsIDB4N2UsCisJMHg3OCwgMHgzMSwgMHhjNywgMHgyNSwgMHhiMSwgMHg1NCwgMHhlMiwgMHhkZCwgMHgwOCwgMHg2NSwgMHg1ZCwgMHg4YywKKwkweDE1LCAweGQ0LCAweDQ3LCAweDUzLCAweDUyLCAweDQ1LCAweDdhLCAweDVmLCAweDA0LCAweGI3LCAweGVmLCAweGNhLAorCTB4YzUsIDB4ZTEsIDB4OGQsIDB4YTEsIDB4ZjgsIDB4MGQsIDB4OGMsIDB4YzMsIDB4ZTEsIDB4NTIsIDB4YzYsIDB4NjEsCisJMHg1NywgMHg0NCwgMHg2NCwgMHg3MywgMHg2MiwgMHg5OCwgMHg3MSwgMHg3YiwgMHg3MywgMHgyYSwgMHg4YywgMHg2NiwKKwkweGNlLCAweGUxLCAweDQ0LCAweDlhLCAweGZkLCAweDI2LCAweDY3LCAweGUxLCAweDc4LCAweGRhLCAweGMzLCAweDk4LAorCTB4YTUsIDB4ZjEsIDB4MjAsIDB4YWEsIDB4OGQsIDB4NGMsIDB4ZTcsIDB4ZTEsIDB4ZTcsIDB4NzEsIDB4MzEsIDB4MGYsCisJMHhjMywgMHhiZSwgMHhiNiwgMHgyNiwgMHhhOSwgMHgyMCwgMHhkZSwgMHhhMiwgMHhkOCwgMHg3YywgMHhmZSwgMHg3OCwKKwkweDVhLCAweGIwLCAweDU5LCAweGQ2LCAweDMyLCAweGVmLCAweGFlLCAweDk0LCAweDNkLCAweGE4LCAweGZkLCAweGE5LAorCTB4OTcsIDB4NTAsIDB4NDksIDB4N2MsIDB4YWEsIDB4YzgsIDB4ZTMsIDB4ZDAsIDB4Y2YsIDB4NDIsIDB4ODIsIDB4YmIsCisJMHhiNSwgMHhjNCwgMHg1ZCwgMHhkOSwgMHg0ZiwgMHg2NCwgMHg1OSwgMHhhYiwgMHgwMiwgMHg1MywgMHhmMSwgMHhlOCwKKwkweGZmLCAweGZiLCAweDMwLCAweDZhLCAweGVmLCAweGFiLCAweDE1LCAweDRjLCAweDIyLCAweGZlLCAweGE1LCAweDg4LAorCTB4N2YsIDB4MWMsIDB4NDMsIDB4ZDcsIDB4OTUsIDB4YzQsIDB4NDAsIDB4Y2EsIDB4ZjQsIDB4OGYsIDB4MjksIDB4NjIsCisJMHgyMCwgMHg3MSwgMHhmYSwgMHgyMCwgMHg3MSwgMHhmYSwgMHhkYiwgMHhjNCwgMHhlOSwgMHg2ZiwgMHgxMSwgMHhhNywKKwkweDFmLCAweDI3LCAweDI2LCAweGU0LCAweGQ2LCAweGY0LCAweDlhLCAweGU1LCAweGI5LCAweDBhLCAweGU3LCAweGUzLAorCTB4MWQsIDB4N2IsIDB4NmQsIDB4YjEsIDB4ODYsIDB4YmEsIDB4OWEsIDB4M2QsIDB4YTAsIDB4NjAsIDB4OGUsIDB4YTEsCisJMHhlZiwgMHgxNywgMHhiYiwgMHhmZiwgMHgzMSwgMHhlNywgMHhjOSwgMHgzZiwgMHgyZCwgMHhiNywgMHhlNywgMHhiNywKKwkweDI5LCAweGQ5LCAweDAzLCAweDc3LCAweGIyLCAweDRlLCAweGViLCAweDg1LCAweGZkLCAweDBkLCAweDAxLCAweDUzLAorCTB4YjgsIDB4NjgsIDB4NTEsIDB4NzIsIDB4MGQsIDB4MWMsIDB4YzksIDB4YmEsIDB4ZmQsIDB4YzcsIDB4ZTQsIDB4ZjksCisJMHhlZCwgMHg3NCwgMHhjOSwgMHhlYiwgMHhkNywgMHhjOCwgMHgxZSwgMHhlZCwgMHhmZCwgMHhiMiwgMHgzNywgMHg2YywKKwkweDE5LCAweGVmLCAweGI5LCAweDkyLCAweDc1LCAweGU2LCAweDliLCAweGIwLCAweGIxLCAweGNkLCAweDNmLCAweDY5LAorCTB4ZGYsIDB4YWIsIDB4N2QsIDB4ZWYsIDB4N2UsIDB4ZWEsIDB4MmIsIDB4Y2IsIDB4MzYsIDB4ZDMsIDB4MjksIDB4ZDksCisJMHgxNywgMHgzYiwgMHgwYiwgMHg4ZiwgMHg2NiwgMHhlNCwgMHg3NywgMHg1ZCwgMHg2YiwgMHg0MiwgMHhkZCwgMHg4ZiwKKwkweDU4LCAweDhkLCAweGYwLCAweGYxLCAweDMwLCAweGFlLCAweDRmLCAweDdhLCAweDY4LCAweDA3LCAweDcxLCAweDU0LAorCTB4ZDAsIDB4YjcsIDB4YmUsIDB4MzYsIDB4ZGUsIDB4NDAsIDB4NWYsIDB4N2IsIDB4YzgsIDB4ZDIsIDB4MjIsIDB4ODEsCisJMHhkNiwgMHg3MSwgMHg3MiwgMHg5ZSwgMHhmNSwgMHhlMywgMHg4YiwgMHhiMSwgMHg3NCwgMHhjMCwgMHhiMiwgMHgzYywKKwkweDk3LCAweDE5LCAweGUxLCAweDBkLCAweDhhLCAweDFmLCAweDJlLCAweGZhLCAweGEwLCAweDgzLCAweDdlLCAweGI1LAorCTB4NmUsIDB4NGYsIDB4NDAsIDB4N2IsIDB4OTMsIDB4NzgsIDB4ZGEsIDB4ZGUsIDB4NzAsIDB4ODAsIDB4ZjYsIDB4NjEsCisJMHg5YywgMHg2OSwgMHgyNiwgMHg5NiwgMHgzYSwgMHgyMywgMHgwMSwgMHhlNiwgMHg4OSwgMHgxZSwgMHhkYSwgMHhiZSwKKwkweDE3LCAweDY3LCAweDEyLCAweGUyLCAweDVmLCAweDdhLCAweGM3LCAweDNmLCAweDMzLCAweDM3LCAweGU5LCAweGEwLAorCTB4NmYsIDB4ZmMsIDB4MzIsIDB4MzEsIDB4OGIsIDB4M2UsIDB4ZTAsIDB4YzYsIDB4ZGIsIDB4MDksIDB4ODMsIDB4ZmUsCisJMHhlNiwgMHhjMSwgMHgzYiwgMHg4OSwgMHg3YSwgMHhmNiwgMHgxNSwgMHg2NCwgMHgxOSwgMHgzZiwgMHhlZSwgMHgxYywKKwkweDBmLCAweGQzLCAweGNmLCAweGFlLCAweGU0LCAweDIxLCAweGVmLCAweDUzLCAweGQ3LCAweGM2LCAweGJmLCAweGEzLAorCTB4ZDQsIDB4ZjYsIDB4Y2YsIDB4NTYsIDB4YWIsIDB4MTAsIDB4YWQsIDB4ZDYsIDB4ZjAsIDB4ZjUsIDB4ZjEsIDB4Y2YsCisJMHhlMiwgMHgzZiwgMHgxOCwgMHhiNywgMHhkNywgMHgyNiwgMHhjMSwgMHgzOSwgMHg0NCwgMHg4OCwgMHgzYywgMHg3MCwKKwkweDYyLCAweDlmLCAweDNjLCAweDRiLCAweDQ0LCAweDVkLCAweDc0LCAweGFlLCAweDQzLCAweDY3LCAweDZlLCAweGFiLAorCTB4NjcsIDB4NGYsIDB4M2IsIDB4OWMsIDB4ZWMsIDB4OTMsIDB4YWMsIDB4OTgsIDB4NjUsIDB4N2YsIDB4ZDksIDB4NWYsCisJMHg4YSwgMHhiYiwgMHhmNiwgMHgxYywgMHhhMCwgMHg4ZiwgMHgxNCwgMHg2MSwgMHhjMSwgMHhmZCwgMHg2ZSwgMHg3YywKKwkweDdkLCAweGRmLCAweDA4LCAweGI5LCAweDgzLCAweDhhLCAweDk5LCAweGNjLCAweDk1LCAweDg2LCAweDQ4LCAweDE0LAorCTB4NjYsIDB4MGUsIDB4NDcsIDB4NzAsIDB4ZGIsIDB4YWUsIDB4MTEsIDB4MGMsIDB4ZTQsIDB4NzksIDB4NWUsIDB4MjgsCisJMHgxNCwgMHhmZiwgMHg5ZiwgMHgyYSwgMHgwZSwgMHg5MCwgMHg0NywgMHgwNCwgMHhkYSwgMHgzZiwgMHg0MywgMHgxYiwKKwkweGFiLCAweDg4LCAweDA0LCAweGUyLCAweDMyLCAweGVlLCAweDE2LCAweGRhLCAweDU4LCAweDBmLCAweGU3LCAweDMzLAorCTB4Y2QsIDB4NzEsIDB4MjQsIDB4NjgsIDB4NjMsIDB4OGYsIDB4NTEsIDB4ZmUsIDB4ZWQsIDB4YjQsIDB4YjEsIDB4MzgsCisJMHg2ZCwgMHgyYywgMHg0ZSwgMHg3YiwgMHg4YSwgMHhkMywgMHhjNiwgMHhlNCwgMHg5ZCwgMHhmZCwgMHgzOCwgMHg2ZCwKKwkweDJjLCAweDRlLCAweDFiLCAweDhiLCAweGE3LCAweDE3LCAweDYzLCAweDk0LCAweDRjLCAweDYzLCAweGNiLCAweDQ4LAorCTB4MDMsIDB4NzEsIDB4NGMsIDB4YjEsIDB4YTMsIDB4NTIsIDB4ZjYsIDB4ODYsIDB4Y2YsIDB4OTIsIDB4YjMsIDB4NWYsCisJMHhjNSwgMHg0MywgMHg0MSwgMHgzMywgMHg3ZCwgMHhiMiwgMHg3NywgMHg2OCwgMHg4NCwgMHg5YywgMHhjNywgMHg4ZCwKKwkweGRmLCAweDY0LCAweDg0LCAweGUzLCAweDM3LCAweDMwLCAweDhmLCAweDNkLCAweDRjLCAweDllLCAweGFmLCAweGUyLAorCTB4NDksIDB4NTMsIDB4ZjIsIDB4NjAsIDB4OTMsIDB4ZTcsIDB4OGMsIDB4MzUsIDB4MjksIDB4ZTEsIDB4NmIsIDB4ODcsCisJMHg3MSwgMHg0NywgMHgzZiwgMHg3MCwgMHgyZCwgMHg3OSwgMHg2MSwgMHgzNSwgMHg3OSwgMHhjOSwgMHhkZSwgMHgwNSwKKwkweGZjLCAweGZkLCAweGYwLCAweDAxLCAweGRhLCAweGJjLCAweGY4LCAweDYzLCAweDZlLCAweGFmLCAweGViLCAweGYxLAorCTB4ZmUsIDB4NWEsIDB4ZGYsIDB4ZDUsIDB4ZjQsIDB4YzEsIDB4N2IsIDB4NTksIDB4ZDcsIDB4ZjksIDB4YjAsIDB4ZDQsCisJMHgzOSwgMHhjMCwgMHhiNiwgMHhmNSwgMHhmMCwgMHg2ZiwgMHgzOCwgMHhmZiwgMHhhZCwgMHhmNywgMHg1NywgMHhlMywKKwkweGVkLCAweDVkLCAweDdhLCAweGY4LCAweDdkLCAweDYyLCAweDVlLCAweGI1LCAweGMzLCAweDVhLCAweGZjLCAweDk5LAorCTB4NTAsIDB4NjAsIDB4ZTMsIDB4NjcsIDB4ZDQsIDB4MWMsIDB4ZGYsIDB4NmIsIDB4ZDksIDB4ZTEsIDB4YzQsIDB4ZmUsCisJMHhkMCwgMHg2MiwgMHg3OCwgMHgxNiwgMHgxNCwgMHgzOCwgMHgxZiwgMHg2ZCwgMHhhOSwgMHg1YSwgMHgzOCwgMHg5NiwKKwkweDFlLCAweDNlLCAweDRkLCAweGFlLCAweDkyLCAweDY0LCAweGZiLCAweGEzLCAweGU5LCAweDIzLCAweGM0LCAweDkwLAorCTB4ZmIsIDB4ZjAsIDB4MDIsIDB4ZjMsIDB4ZjMsIDB4OTEsIDB4NGYsIDB4YmYsIDB4NGUsIDB4ZWUsIDB4ZTgsIDB4YzYsCisJMHgxOCwgMHgzOSwgMHhlMCwgMHg4MSwgMHhmZSwgMHhlOCwgMHhlNywgMHg5YywgMHhjNCwgMHg3ZCwgMHhjZiwgMHg4MiwKKwkweDcyLCAweGE0LCAweDg3LCAweDg0LCAweDJiLCAweDk2LCAweGUzLCAweGQ5LCAweDdlLCAweDQzLCAweGJiLCAweDU2LAorCTB4YzksIDB4ZjEsIDB4YzIsIDB4MmQsIDB4M2MsIDB4N2YsIDB4YjMsIDB4ZGYsIDB4MzgsIDB4MzMsIDB4OGMsIDB4YzAsCisJMHhjNCwgMHg2OSwgMHg3MiwgMHhjMywgMHhmNywgMHg4NywgMHgyNCwgMHg4NiwgMHgxZCwgMHhhNCwgMHg4ZiwgMHhmYiwKKwkweDExLCAweDRlLCAweDZhLCAweDM4LCAweDM0LCAweDY2LCAweDYwLCAweDdlLCAweGQyLCAweDhiLCAweDQ3LCAweGM2LAorCTB4ODIsIDB4ZjgsIDB4MGMsIDB4N2QsIDB4MzcsIDB4NDMsIDB4N2UsIDB4ZjgsIDB4ZTksIDB4YTQsIDB4ZjgsIDB4ZTIsCisJMHgyYywgMHg4YywgMHg4ZiwgMHhjZCwgMHhiMiwgMHhmNywgMHg1NCwgMHg3YSwgMHg4YywgMHg1ZiwgMHhjMCwgMHg1MywKKwkweDJkLCAweDNlLCAweDQ5LCAweDZlLCAweDlkLCAweGQyLCAweDdiLCAweDYzLCAweDFjLCAweDRmLCAweGNjLCAweGFiLAorCTB4ZWYsIDB4OGYsIDB4NDEsIDB4MWYsIDB4MDIsIDB4YWUsIDB4ZjgsIDB4NzAsIDB4ZTgsIDB4OGIsIDB4MTIsIDB4MWYsCisJMHhjNSwgMHgxZiwgMHgzNSwgMHg4YywgMHg5MywgMHhlZiwgMHgxNCwgMHgxMywgMHg1MywgMHg0YiwgMHgyMywgMHhiNSwKKwkweGVmLCAweGJkLCAweGFjLCAweGU4LCAweGQ5LCAweGE3LCAweDU1LCAweGNiLCAweDdhLCAweDY5LCAweGExLCAweDA2LAorCTB4ZGYsIDB4M2UsIDB4OGQsIDB4ZGMsIDB4YzMsIDB4NjQsIDB4ZWMsIDB4MTYsIDB4M2YsIDB4ZDUsIDB4MzAsIDB4ZTMsCisJMHg4MSwgMHg2YSwgMHg0YywgMHg3YiwgMHgyMCwgMHg4OSwgMHhiZiwgMHhhZCwgMHg4ZSwgMHg3ZiwgMHg2ZSwgMHgzYSwKKwkweGUzLCAweGZjLCAweDc0LCAweGUyLCAweDdhLCAweDY1LCAweGYyLCAweGQ4LCAweDBjLCAweDM3LCAweGY5LCAweGYyLAorCTB4ODQsIDB4NWEsIDB4ZDcsIDB4YmEsIDB4MWYsIDB4ZmEsIDB4ZmUsIDB4OTMsIDB4OGEsIDB4ZWUsIDB4N2IsIDB4OGMsCisJMHhiMSwgMHhjMSwgMHg0NSwgMHgxYiwgMHg3NSwgMHg4YywgMHg2YiwgMHhmNCwgMHhkZCwgMHhiYSwgMHg0MywgMHhkMywKKwkweDYwLCAweGM0LCAweDJmLCAweDU3LCAweDVkLCAweDE2LCAweDZjLCAweDc5LCAweGFlLCAweGE4LCAweGNjLCAweGU1LAorCTB4NDUsIDB4ODIsIDB4M2IsIDB4MTIsIDB4MTcsIDB4MWMsIDB4YjIsIDB4ZmYsIDB4MTMsIDB4ZWQsIDB4ZjQsIDB4OTcsCisJMHgxNSwgMHg3NiwgMHgyYywgMHgzYSwgMHg2MCwgMHhlZiwgMHg4ZiwgMHhkYiwgMHgzMCwgMHgxZSwgMHhhNywgMHg4ZiwKKwkweDJjLCAweDQ2LCAweGQ5LCAweDgwLCAweDA3LCAweDVmLCAweGIzLCAweGUzLCAweGQwLCAweDQzLCAweDU2LCAweDE1LAorCTB4ZmQsIDB4ZTUsIDB4ZjYsIDB4M2QsIDB4ODEsIDB4ZjYsIDB4YWIsIDB4ZTksIDB4MmYsIDB4YjUsIDB4OTcsIDB4NDksCisJMHgwYywgMHg2MywgMHhkYywgMHg0ZSwgMHgxOSwgMHhlNiwgMHgzMCwgMHhiMSwgMHhlNSwgMHhhMSwgMHgwNiwgMHg2MywKKwkweGUyLCAweDc1LCAweGU0LCAweDdjLCAweDY2LCAweDZiLCAweDVmLCAweDM1LCAweGZlLCAweGUxLCAweGZlLCAweGZkLAorCTB4ZjYsIDB4NWEsIDB4YzgsIDB4NmQsIDB4M2MsIDB4NGYsIDB4ZjYsIDB4ZjksIDB4NmMsIDB4ZmYsIDB4ODgsIDB4ZjEsCisJMHhmNywgMHg5ZCwgMHg4YywgMHg3OSwgMHgzMSwgMHhmYSwgMHhkMSwgMHg5NiwgMHgzZSwgMHg2YiwgMHhmMSwgMHhmNywKKwkweDE3LCAweGM2LCAweDU3LCAweDU2LCAweDIwLCAweGM4LCAweDk4LCAweGU0LCAweDQ2LCAweDZmLCAweDlmLCAweGRlLAorCTB4ZGYsIDB4Y2EsIDB4MTgsIDB4NzQsIDB4NjIsIDB4YTEsIDB4NDksIDB4NTksIDB4M2MsIDB4ZDgsIDB4ZDEsIDB4MjcsCisJMHg5OCwgMHg3YSwgMHhmNCwgMHhhNiwgMHg2YSwgMHhjNCwgMHhmZiwgMHhhNywgMHhjNiwgMHhmMSwgMHg3ZCwgMHhjZCwKKwkweDdlLCAweGY2LCAweDM3LCAweDBiLCAweDZiLCAweGY3LCAweDVkLCAweDQ2LCAweDk5LCAweGViLCAweGU5LCAweDgzLAorCTB4Y2MsIDB4YWIsIDB4OTksIDB4ZWYsIDB4YWMsIDB4ZGUsIDB4MjUsIDB4N2UsIDB4ODEsIDB4NDYsIDB4YzksIDB4ZDMsCisJMHgzYSwgMHhjZCwgMHg4MCwgMHhmOSwgMHgwNiwgMHg3ZCwgMHhhOCwgMHg4OCwgMHg1YywgMHhlNywgMHg0MSwgMHg2MiwKKwkweDU5LCAweDMxLCAweDIxLCAweGIzLCAweGNjLCAweDA4LCAweDYzLCAweDIxLCAweDZkLCAweDU0LCAweGRlLCAweGUxLAorCTB4OTgsIDB4NDYsIDB4NWUsIDB4MzcsIDB4OWYsIDB4ZjMsIDB4NTEsIDB4OTIsIDB4ZjEsIDB4MDAsIDB4ZTQsIDB4MTAsCisJMHgyMCwgMHgzZSwgMHg2MSwgMHg5NCwgMHgyMCwgMHgzOCwgMHhlYSwgMHhlNywgMHg3MSwgMHgzMSwgMHgwZiwgMHgyYSwKKwkweDIyLCAweGEzLCAweGEyLCAweDY2LCAweDk0LCAweDc1LCAweDg3LCAweDQ3LCAweDZjLCAweDViLCAweGZjLCAweDA3LAorCTB4Y2UsIDB4N2IsIDB4ODIsIDB4YjYsIDB4N2UsIDB4MjMsIDB4YjEsIDB4N2UsIDB4NjIsIDB4MjcsIDB4ZDAsIDB4ZmIsCisJMHg3MCwgMHhjZSwgMHhiNiwgMHg1MywgMHg2YywgMHhiZiwgMHg4NSwgMHg5OCwgMHhmNywgMHgxZSwgMHg2ZCwgMHhiNiwKKwkweDg3LCAweGYzLCAweGJkLCAweDYzLCAweGQwLCAweDA4LCAweGQ2LCAweGE5LCAweDAxLCAweDZkLCAweDljLCAweGYzLAorCTB4ZGMsIDB4MzUsIDB4YTIsIDB4YTIsIDB4YWYsIDB4N2YsIDB4MzEsIDB4ODYsIDB4OTksIDB4MDcsIDB4NzUsIDB4MGYsCisJMHg4OSwgMHg4ZiwgMHg0OCwgMHg5OSwgMHhjMywgMHhlOCwgMHhhNCwgMHg4ZiwgMHhmYywgMHg2YSwgMHhhMSwgMHg4MiwKKwkweGQ4LCAweDE3LCAweGU0LCAweDFkLCAweDUxLCAweDI3LCAweGYzLCAweGZkLCAweGZiLCAweGIwLCAweDM2LCAweDcxLAorCTB4YzQsIDB4MmEsIDB4MzcsIDB4ZjQsIDB4ZGUsIDB4MjEsIDB4OTUsIDB4NzksIDB4MTYsIDB4NmQsIDB4YjMsIDB4OGIsCisJMHhmOSwgMHhjOSwgMHgxMiwgMHhlNiwgMHgyNywgMHhkZCwgMHg3OSwgMHhiYiwgMHgzYywgMHg0ZSwgMHgzYiwgMHhlYywKKwkweDYzLCAweDFjLCAweDdiLCAweDdkLCAweDI4LCAweDE3LCAweGY3LCAweDdlLCAweGJjLCAweGMzLCAweDhmLCAweGY5LAorCTB4OTcsIDB4OTcsIDB4ZTMsIDB4OTksIDB4ODcsIDB4NzMsIDB4YjIsIDB4ZWQsIDB4YTQsIDB4NGQsIDB4M2UsIDB4NGQsCisJMHgzZCwgMHhkZiwgMHg0YSwgMHhiZCwgMHhiZSwgMHg5MiwgMHgxMiwgMHg4YywgMHgwYSwgMHhlMiwgMHg1OSwgMHhmMiwKKwkweGU4LCAweGY1LCAweGU0LCAweDAyLCAweDJmLCAweGE1LCAweDcyLCAweDM2LCAweGY5LCAweGY1LCAweGYxLCAweDJiLAorCTB4YWIsIDB4NzIsIDB4ZjEsIDB4YzEsIDB4MGIsIDB4ZjUsIDB4MDEsIDB4NzksIDB4MjcsIDB4Y2YsIDB4YjIsIDB4OTYsCisJMHg5OCwgMHhkOSwgMHg3NiwgMHhmMiwgMHgxYSwgMHhiNiwgMHgxZCwgMHgyMSwgMHgzNywgMHg3MiwgMHg2MiwgMHg2NiwKKwkweDMyLCAweDgyLCAweGE1LCAweGE5LCAweGRhLCAweGU2LCAweGI5LCAweGIyLCAweDg5LCAweDYzLCAweDY2LCAweDhlLAorCTB4MDMsIDB4YmEsIDB4OTIsIDB4ZjIsIDB4Y2QsIDB4MGYsIDB4MGQsIDB4NjUsIDB4Y2MsIDB4OWQsIDB4ZmUsIDB4MjYsCisJMHhmZiwgMHg5ZCwgMHg5MSwgMHgxYiwgMHhmZiwgMHgwYywgMHhlZSwgMHhiOCwgMHg4MiwgMHgzMiwgMHhhNSwgMHhjOCwKKwkweDFkLCAweDI3LCAweGYzLCAweGRmLCAweDE5LCAweGI5LCAweGMxLCAweGZlLCAweGNlLCAweDg4LCAweDFiLCAweGQzLAorCTB4YzYsIDB4OWQsIDB4Y2UsIDB4MmYsIDB4YTUsIDB4M2MsIDB4OTgsIDB4MzEsIDB4N2UsIDB4OTYsIDB4ODMsIDB4YmEsCisJMHg4YiwgMHgyMiwgMHg0ZCwgMHg3OCwgMHgyYSwgMHhhMSwgMHg2MCwgMHhiYSwgMHhmMSwgMHhiZiwgMHhmMSwgMHhiMiwKKwkweGJkLCAweDI2LCAweDUwLCAweDhkLCAweDk5LCAweDBmLCAweGM4LCAweDdhLCAweDQyLCAweDU0LCAweGRlLCAweDg5LAorCTB4NjksIDB4N2UsIDB4ODIsIDB4ZTcsIDB4MjUsIDB4YzQsIDB4ZDMsIDB4OGEsIDB4MDcsIDB4MTQsIDB4M2MsIDB4MWQsCisJMHhmMCwgMHhhMiwgMHg5OCwgMHhiZiwgMHg3ZCwgMHhlNCwgMHg5YSwgMHhjZSwgMHg4NSwgMHhjYiwgMHhhZCwgMHhjZCwKKwkweGFiLCAweGM0LCAweGJlLCAweDM5LCAweDg3LCAweGZiLCAweGE2LCAweDU1LCAweDBhLCAweDA2LCAweGVlLCAweDM1LAorCTB4NjUsIDB4ZGQsIDB4ZDIsIDB4NDAsIDB4NGYsIDB4YTIsIDB4OWEsIDB4ZmMsIDB4YmEsIDB4YjYsIDB4YmQsIDB4MDksCisJMHhiNSwgMHhlNiwgMHgyZiwgMHgxYywgMHhkNSwgMHgyOCwgMHhkYSwgMHg3NywgMHg2MywgMHg5NSwgMHhhYywgMHhkOSwKKwkweDdmLCAweDliLCAweDczLCAweGQ2LCAweDRkLCAweGVjLCAweGVhLCAweDRhLCAweGU1LCAweGUyLCAweDY3LCAweDUzLAorCTB4ZmEsIDB4MTcsIDB4OWEsIDB4ZTgsIDB4YTUsIDB4OWIsIDB4ZmMsIDB4NDQsIDB4NGQsIDB4OWUsIDB4YjIsIDB4Y2IsCisJMHg5NCwgMHg0NSwgMHgwZSwgMHgxMSwgMHg3ZiwgMHg2NiwgMHhlMSwgMHgxMCwgMHhmMywgMHgxYSwgMHg4OSwgMHhhNSwKKwkweDY1LCAweDNjLCAweGNhLCAweGM5LCAweDFiLCAweDdmLCAweGM5LCAweDU4LCAweDdhLCAweDY3LCAweDI4LCAweDFiLAorCTB4OTQsIDB4MmYsIDB4ZDAsIDB4NTQsIDB4OTEsIDB4OGIsIDB4ZDMsIDB4MDcsIDB4YjAsIDB4MmYsIDB4YTQsIDB4YjcsCisJMHhhYywgMHg3NiwgMHg0NCwgMHg5ZiwgMHg2MSwgMHgwZSwgMHgxNiwgMHg1ZSwgMHhjYywgMHg5YywgMHg3YywgMHg3OSwKKwkweDYwLCAweDA0LCAweDViLCAweGM5LCAweDAzLCAweGI3LCAweDMwLCAweDE3LCAweDZmLCAweGE1LCAweDZkLCAweGI2LAorCTB4ZWYsIDB4NjIsIDB4NmMsIDB4NzMsIDB4OWMsIDB4Y2IsIDB4YzUsIDB4YjUsIDB4NTAsIDB4N2MsIDB4MzUsIDB4MzksCisJMHg0MCwgMHg4NywgMHg0NywgMHgxNSwgMHg3YiwgMHgxNSwgMHhkZiwgMHgwOSwgMHhiNCwgMHhiZSwgMHg0MSwgMHg4YywKKwkweGFlLCAweDYzLCAweGRjLCAweDEwLCAweDdiLCAweGRmLCAweDllLCAweGQyLCAweGRiLCAweGE5LCAweDgwLCAweGFhLAorCTB4NzIsIDB4ZTYsIDB4OGUsIDB4NzcsIDB4OGQsIDB4MzUsIDB4ZDAsIDB4NmYsIDB4YWMsIDB4NGUsIDB4MzcsIDB4ZWQsCisJMHhkYSwgMHhiOSwgMHg2OCwgMHgxNiwgMHg3MywgMHhjZSwgMHhhYiwgMHhkMCwgMHhiZCwgMHg4MywgMHhmNiwgMHg0ZiwKKwkweDVmLCAweGJhLCAweGI3LCAweDBmLCAweGU0LCAweDY3LCAweGVhLCAweDE2LCAweGNlLCAweDVmLCAweDc2LCAweDFmLAorCTB4MDIsIDB4NjcsIDB4NWEsIDB4NTAsIDB4ZDcsIDB4NWMsIDB4ZTQsIDB4MTAsIDB4MTksIDB4ZjQsIDB4OTYsIDB4YjcsCisJMHhjOSwgMHhkMywgMHgzYSwgMHg5OCwgMHg5ZiwgMHhhZSwgMHg2NywgMHgyZSwgMHgxZiwgMHg2MywgMHgyZSwgMHgxZiwKKwkweDYzLCAweGJkLCAweGQ0LCAweDBlLCAweDc5LCAweDRlLCAweDY0LCAweGI0LCAweDFjLCAweDY3LCAweGZlLCAweGYzLAorCTB4MzUsIDB4ZjIsIDB4OWYsIDB4MWQsIDB4ZjcsIDB4OGIsIDB4NWMsIDB4ZDMsIDB4NzEsIDB4ZDcsIDB4ZGUsIDB4YWIsCisJMHg5MCwgMHhhNCwgMHgzZCwgMHhkZCwgMHhjOSwgMHg2YiwgMHg3ZCwgMHhmNywgMHg1ZiwgMHg4YywgMHgzYiwgMHg5OCwKKwkweGM3LCAweGM3LCAweGM2LCAweDE2LCAweGEzLCAweDlmLCAweDk5LCAweGU4LCAweGM2LCAweGJkLCAweDlmLCAweDQ1LAorCTB4MTcsIDB4ZjksIDB4ZDQsIDB4MTIsIDB4NjIsIDB4ZjQsIDB4ZWEsIDB4ODcsIDB4NDcsIDB4NmMsIDB4Y2MsIDB4MTYsCisJMHhjYywgMHg3ZiwgMHgyZCwgMHgwZCwgMHhiYywgMHg0OSwgMHg0ZSwgMHhkNiwgMHg5ZiwgMHgzYSwgMHg2MCwgMHhmMywKKwkweDM0LCAweDE3LCAweGUzLCAweDQzLCAweDMxLCAweDcxLCAweDI5LCAweGJjLCAweGNiLCAweGU4LCAweDU4LCAweGE2LAorCTB4NWEsIDB4OGIsIDB4NGIsIDB4MTYsIDB4MDYsIDB4N2EsIDB4ZGYsIDB4YTYsIDB4YWYsIDB4NTYsIDB4ZWQsIDB4NTMsCisJMHg1MSwgMHgzZCwgMHgyMCwgMHhiOSwgMHgzYSwgMHhmOSwgMHgxMSwgMHgzMSwgMHhmYSwgMHgwNSwgMHg2MiwgMHg3NCwKKwkweGY5LCAweDllLCAweDVjLCAweDVlLCAweDllLCAweDYwLCAweGRlLCAweDU1LCAweDZkLCAweGU0LCAweDcyLCAweGYzLAorCTB4ZWQsIDB4N2QsIDB4YjIsIDB4ZjcsIDB4YzYsIDB4OGQsIDB4ZTcsIDB4NjgsIDB4ZmIsIDB4NDcsIDB4ZjMsIDB4YjYsCisJMHg3ZiwgMHgyYywgMHg4ZiwgMHhjMSwgMHgxNiwgMHg3MywgMHhmMywgMHgzNywgMHg2ZCwgMHhmYywgMHhjZCwgMHhlNSwKKwkweGU2LCAweGYzLCAweDA3LCAweDhjLCAweDhlLCAweDMwLCAweDMxLCAweGZhLCAweDMzLCAweDdiLCAweGE0LCAweDdmLAorCTB4MGQsIDB4ZDUsIDB4YzQsIDB4OTMsIDB4MWEsIDB4NjIsIDB4NDksIDB4YzUsIDB4ODAsIDB4YWMsIDB4Y2YsIDB4MDQsCisJMHhkYSwgMHhjNywgMHg1NSwgMHg5ZiwgMHhkZCwgMHhjNywgMHgyNiwgMHhjYSwgMHhkNiwgMHg5ZCwgMHg5MiwgMHg3NywKKwkweDZjLCAweDBkLCAweDZkLCAweDgzLCAweDEyLCAweDMwLCAweGFmLCAweGExLCAweDNlLCAweGY3LCAweGE1LCAweGFmLAorCTB4NDIsIDB4N2IsIDB4ZmYsIDB4MmMsIDB4ZWMsIDB4MWYsIDB4OTIsIDB4ZjgsIDB4MjIsIDB4ZWQsIDB4NGIsIDB4MmUsCisJMHhlZSwgMHhjNCwgMHhmYiwgMHhiYiwgMHg2NiwgMHhlMywgMHhmZCwgMHg5MSwgMHg3MywgMHg3OSwgMHhmOCwgMHhlNiwKKwkweDU0LCAweGY0LCAweDVlLCAweDg2LCAweGQ3LCAweGU1LCAweDkyLCAweDg3LCAweGJmLCAweGM0LCAweDNjLCAweGZjLAorCTB4NmQsIDB4NDUsIDB4ZDYsIDB4MTAsIDB4NTUsIDB4ZGMsIDB4YjgsIDB4YzAsIDB4YzEsIDB4ZjgsIDB4YTIsIDB4ZmIsCisJMHg1ZiwgMHg3NCwgMHhjNCwgMHhlNSwgMHgzOSwgMHhiMiwgMHhmZiwgMHg3ZSwgMHhkZSwgMHg3ZiwgMHg5ZSwgMHhmMSwKKwkweDdjLCAweDgwLCAweDMzLCAweDExLCAweGFkLCAweDc2LCAweGUwLCAweDk5LCAweDg1LCAweGYxLCAweGE4LCAweDhiLAorCTB4ZDcsIDB4N2IsIDB4YzksIDB4NTMsIDB4NjYsIDB4MWEsIDB4MDcsIDB4ZTksIDB4OWIsIDB4YjUsIDB4ZTEsIDB4ZjksCisJMHgwZSwgMHgwNywgMHhjZSwgMHg5OCwgMHg3YSwgMHhjYiwgMHg2ZSwgMHg1ZSwgMHg3YiwgMHgzNiwgMHgyMywgMHhiZSwKKwkweDE4LCAweDI2LCAweDdlLCAweDJkLCAweGNhLCAweGZiLCAweGEyLCAweGJjLCAweDhmLCAweDAxLCAweGY3LCAweDZjLAorCTB4ZGEsIDB4ZWIsIDB4NmIsIDB4MjksIDB4YmQsIDB4ZmYsIDB4NTksIDB4ZGEsIDB4NjksIDB4ZjUsIDB4NTksIDB4M2IsCisJMHgyZCwgMHhlYywgMHhkMywgMHg4MiwgMHhiYiwgMHgyYSwgMHhkMiwgMHg4MiwgMHg1MCwgMHhiMiwgMHhiMCwgMHg1ZiwKKwkweDZiLCAweDNmLCAweDdhLCAweDMyLCAweGY3LCAweDYwLCAweGUzLCAweDRlLCAweDdkLCAweGEzLCAweGFjLCAweDExLAorCTB4YmQsIDB4MTAsIDB4OGEsIDB4NWIsIDB4OTUsIDB4NDYsIDB4MjcsIDB4NWMsIDB4MGIsIDB4OGMsIDB4MTYsIDB4ZTYsCisJMHgyZiwgMHhiMSwgMHhlZiwgMHgyYSwgMHhhNSwgMHhiNCwgMHhkZiwgMHhjMywgMHhkOCwgMHgzNCwgMHhhYywgMHgwNywKKwkweGI3LCAweDJiLCAweDA2LCAweGUzLCAweDg2LCAweDg2LCAweGZkLCAweDgzLCAweDQ1LCAweGI4LCAweDc1LCAweDU3LAorCTB4MWIsIDB4ZjYsIDB4ZjUsIDB4OWIsIDB4YzQsIDB4Y2YsIDB4NWEsIDB4ZmYsIDB4NjksIDB4YmMsIDB4ODcsIDB4NjMsCisJMHhhNiwgMHhiYywgMHhhZiwgMHg1NCwgMHg4MiwgMHgzNiwgMHg0ZCwgMHhmNiwgMHgyOSwgMHgzMSwgMHhmYiwgMHg5YywKKwkweDdlLCAweGRlLCAweDNiLCAweGUwLCAweDllLCAweDEyLCAweGEzLCAweGYwLCAweDJlLCAweGJmLCAweGMxLCAweDdjLAorCTB4NzEsIDB4MTIsIDB4N2IsIDB4MDYsIDB4NjUsIDB4NmQsIDB4NjAsIDB4OWEsIDB4NzIsIDB4YTQsIDB4N2YsIDB4YWUsCisJMHhhZiwgMHg4YiwgMHhkOCwgMHg3ZiwgMHhhZiwgMHg5OSwgMHhjNSwgMHg5OSwgMHg4NSwgMHhkNSwgMHhjMCwgMHgwYywKKwkweDA1LCAweGExLCAweGNmLCAweDA0LCAweGU0LCAweDViLCAweDM1LCAweGZjLCAweDdiLCAweGQ3LCAweGYyLCAweDdmLAorCTB4NTEsIDB4ZGEsIDB4YTksIDB4YTksIDB4YzgsIDB4YWQsIDB4MTcsIDB4YmMsIDB4NWUsIDB4MmQsIDB4ZWYsIDB4ZjIsCisJMHgxZCwgMHg0OSwgMHhjZCwgMHhhYywgMHhjYywgMHgzZCwgMHg3NywgMHhmZSwgMHhhNCwgMHgzZSwgMHg1ZSwgMHhiMywKKwkweGZjLCAweDc2LCAweDFiLCAweDg1LCAweGJhLCAweGFmLCAweDVhLCAweDUxLCAweGFmLCAweDk0LCAweDJmLCAweDYyLAorCTB4ZGIsIDB4ZTIsIDB4OWYsIDB4ZDMsIDB4OTQsIDB4NzYsIDB4ZTIsIDB4YTksIDB4MWEsIDB4OWEsIDB4YTYsIDB4YjQsCisJMHgwZCwgMHg1ZCwgMHhkOCwgMHhlZSwgMHg4YiwgMHg1NiwgMHhiNCwgMHg0NSwgMHhjZSwgMHgwYiwgMHhlNSwgMHhkYywKKwkweGQzLCAweDUwLCAweDJhLCAweDY1LCAweDBiLCAweGY3LCAweDlmLCAweGM5LCAweGI3LCAweDU1LCAweDRjLCAweGFlLAorCTB4OWEsIDB4MmIsIDB4NzMsIDB4NmIsIDB4YmYsIDB4ZWMsIDB4YWQsIDB4OGEsIDB4ZTIsIDB4NjgsIDB4YzMsIDB4ZDQsCisJMHhmNiwgMHgwYSwgMHg3ZCwgMHg3ZiwgMHhlZiwgMHhiYywgMHhmNiwgMHg3MiwgMHg2NSwgMHg2NywgMHhiMSwgMHg0ZCwKKwkweDI5LCAweDlmLCAweGM1LCAweGZmLCAweDZiLCAweGFmLCAweDIzLCAweGJjLCAweDYxLCAweGVmLCAweDkzLCAweGRjLAorCTB4NmEsIDB4MzYsIDB4NDYsIDB4NGIsIDB4ZjAsIDB4MzksIDB4YTgsIDB4OTcsIDB4YzYsIDB4ZTcsIDB4OTcsIDB4ZDgsCisJMHhmYywgMHgzNiwgMHhkYSwgMHg1MiwgMHhjMiwgMHgxYywgMHhkNywgMHg2ZCwgMHg0NCwgMHhlZiwgMHg3NSwgMHgyMywKKwkweDliLCAweDY1LCAweDVjLCAweDZlLCAweDNkLCAweGEzLCAweGVjLCAweDU3LCAweDZlLCAweDBkLCAweGU4LCAweDFiLAorCTB4ZGYsIDB4MjUsIDB4ZGYsIDB4NzgsIDB4M2UsIDB4MTAsIDB4MjcsIDB4ZDYsIDB4MWIsIDB4YmUsIDB4M2UsIDB4NDUsCisJMHgzNywgMHhkNywgMHgzMiwgMHhhNiwgMHgzZCwgMHhjYiwgMHgxYywgMHg3MiwgMHg0ZCwgMHhhMCwgMHhkNywgMHg3ZSwKKwkweGM2LCAweGE4LCAweDQ0LCAweDU2LCAweGUwLCAweDEyLCAweGZiLCAweGJiLCAweDJjLCAweDJkLCAweDMwLCAweGQyLAorCTB4Y2YsIDB4Y2IsIDB4OWEsIDB4MTcsIDB4N2YsIDB4YzcsIDB4MzAsIDB4ZGYsIDB4YmUsIDB4YjYsIDB4MDYsIDB4NDEsCisJMHhmYiwgMHhmZiwgMHhhYSwgMHhmYywgMHhiNywgMHg1YiwgMHg1YSwgMHg1MSwgMHg2YiwgMHhmZiwgMHhiZiwgMHgxOSwKKwkweDczLCAweGQzLCAweDY3LCAweGQ3LCAweDg2LCAweGQxLCAweDZkLCAweDVhLCAweGQ2LCAweDUzLCAweGE2LCAweDg1LAorCTB4MzcsIDB4Y2UsIDB4ZWQsIDB4ZDEsIDB4NWUsIDB4ZTEsIDB4NjAsIDB4Y2UsIDB4NDEsIDB4MTcsIDB4OGUsIDB4ZTUsCisJMHhiZSwgMHg1ZCwgMHg3NSwgMHhlZSwgMHhmZCwgMHg4YywgMHhhNSwgMHhlNywgMHhlZCwgMHhkMSwgMHg5NiwgMHhmNywKKwkweGUyLCAweGFiLCAweGVkLCAweDZmLCAweDkzLCAweGNkLCAweDViLCAweGU0LCAweGM0LCAweDczLCAweDg5LCAweDhhLAorCTB4OTgsIDB4ODcsIDB4YmYsIDB4MzcsIDB4MmQsIDB4MmEsIDB4YzIsIDB4ZmEsIDB4MTAsIDB4MzksIDB4ZGYsIDB4YTUsCisJMHhjNywgMHg3MSwgMHhkYSwgMHhmZSwgMHg0NiwgMHg0MywgMHgzYywgMHgyNCwgMHhkZiwgMHg2NiwgMHgzOCwgMHg5YSwKKwkweDUwLCAweDcxLCAweDZjLCAweGIwLCAweDI3LCAweGI0LCAweGM3LCAweGVlLCAweGZiLCAweDU1LCAweDc0LCAweDhmLAorCTB4Y2EsIDB4NzMsIDB4YmYsIDB4MTYsIDB4YWMsIDB4NGUsIDB4NGMsIDB4ZGEsIDB4N2IsIDB4ZGEsIDB4MzYsIDB4YTcsCisJMHgyNCwgMHhmNywgMHhkNiwgMHhiMywgMHg2YiwgMHg5OCwgMHhhZiwgMHhhYSwgMHg4ZSwgMHgyMCwgMHg2ZSwgMHg2MiwKKwkweDdjLCAweDc5LCAweDIxLCAweDQxLCAweDNiLCAweDVkLCAweGE4LCAweDc3LCAweDdjLCAweDk3LCAweDFjLCAweGExLAorCTB4MjIsIDB4YTIsIDB4MDcsIDB4ZGYsIDB4NTEsIDB4NWEsIDB4YzksIDB4YzUsIDB4ZGMsIDB4OTgsIDB4NDgsIDB4ODgsCisJMHgyZCwgMHhjYSwgMHhiNywgMHg5ZCwgMHg2ZSwgMHhjNiwgMHg3ZSwgMHg3MiwgMHhkMiwgMHhlNywgMHgxMywgMHgxYSwKKwkweDRlLCAweDM3LCAweDc4LCAweDkwLCAweDI2LCAweDQ3LCAweDdkLCAweDJlLCAweGUxLCAweGM2LCAweDYzLCAweGU0LAorCTB4YTgsIDB4OGYsIDB4MGUsIDB4Y2EsIDB4MWEsIDB4NjEsIDB4MTMsIDB4MWEsIDB4MTMsIDB4YjIsIDB4M2UsIDB4NGMsCisJMHhkZSwgMHgzNSwgMHhlMiwgMHhhNSwgMHgzZCwgMHg1YSwgMHg1NiwgMHgzNywgMHg2ZCwgMHhiNywgMHg0ZCwgMHg5YiwKKwkweDYwLCAweDlmLCAweGIyLCAweGFlLCAweDE4LCAweGM1LCAweDM1LCAweGU0LCAweDFkLCAweDhmLCAweDhlLCAweGY4LAorCTB4ZjAsIDB4N2QsIDB4NzIsIDB4ZjMsIDB4MjQsIDB4ZWIsIDB4YmQsIDB4OTAsIDB4ZjAsIDB4YTMsIDB4MmYsIDB4ZWQsCisJMHhjMywgMHhkMywgMHhlNCwgMHhlOCwgMHg1YiwgMHg3OCwgMHgyZSwgMHhkZiwgMHgwOSwgMHgyYiwgMHgzMiwgMHg4MiwKKwkweGU0LCAweGMxLCAweDg3LCAweDUxLCAweGQ2LCAweDc3LCAweDExLCAweGQ2LCAweGFkLCAweDNjLCAweDA4LCAweGI1LAorCTB4ZWYsIDB4MTAsIDB4OGYsIDB4MmIsIDB4MTksIDB4YjMsIDB4YWYsIDB4NDQsIDB4NmEsIDB4MzAsIDB4ODIsIDB4ZDQsCisJMHhjOCwgMHg4ZiwgMHhkMCwgMHgzYiwgMHgyOCwgMHhlMywgMHg5MiwgMHhlZiwgMHgzZCwgMHhjOSwgMHhiZSwgMHgyNywKKwkweDcyLCAweGJkLCAweDNlLCAweDJmLCAweDg2LCAweDQ2LCAweGE0LCAweDlmLCAweDZhLCAweGY2LCAweGZkLCAweGU3LAorCTB4YjYsIDB4ZmYsIDB4MWYsIDB4ZDYsIDB4YmEsIDB4MWIsIDB4YTUsIDB4ZWQsIDB4ODMsIDB4OWYsIDB4ZDAsIDB4YmUsCisJMHhlOCwgMHhhYSwgMHhmMCwgMHg5ZSwgMHhhMSwgMHhhYywgMHg3NSwgMHhiOCwgMHhkOSwgMHhhNiwgMHgwNywgMHg4ZSwKKwkweDQ4LCAweDc2LCAweDY1LCAweDM5LCAweGY0LCAweGU4LCAweDM2LCAweGM1LCAweDY4LCAweDJlLCAweDUzLCAweDI2LAorCTB4YjEsIDB4MmQsIDB4MjMsIDB4ZWYsIDB4OGQsIDB4MTUsIDB4ZTMsIDB4NjksIDB4ZTIsIDB4YTMsIDB4MmIsIDB4YTQsCisJMHg2YiwgMHhkZiwgMHhhNSwgMHhlZCwgMHgyYywgMHgyMSwgMHhhNiwgMHhiYywgMHg2MSwgMHg3ZSwgMHgwNiwgMHg3MSwKKwkweDRkLCAweGY0LCAweDU3LCAweDhjLCAweDFmLCAweGY0LCAweGJiLCAweGYxLCAweDRlLCAweDI4LCAweDgyLCAweGRjLAorCTB4YjcsIDB4YmQsIDB4M2MsIDB4ZjgsIDB4NzEsIDB4YzIsIDB4Y2IsIDB4ZjksIDB4YWEsIDB4Y2IsIDB4MWEsIDB4OGUsCisJMHhiOSwgMHhjMCwgMHhiNCwgMHhkYywgMHhiNSwgMHhhMywgMHg4OSwgMHgzNSwgMHhkOCwgMHg0MywgMHg3OSwgMHg1ZiwKKwkweDQ4LCAweDljLCAweGUxLCAweGZjLCAweGI0LCAweDUzLCAweGZmLCAweGEyLCAweGVmLCAweDc4LCAweDVlLCAweGQ3LAorCTB4M2QsIDB4ZDQsIDB4ZjUsIDB4MmMsIDB4M2MsIDB4OWIsIDB4YjgsIDB4MGYsIDB4OGYsIDB4NTIsIDB4ZmUsIDB4NDcsCisJMHhmYSwgMHg4ZCwgMHhlOCwgMHhjNSwgMHhjYSwgMHg2MSwgMHhlMiwgMHg2NSwgMHgzMSwgMHg4ZSwgMHhiMSwgMHhlZCwKKwkweDViLCAweDk5LCAweDI5LCAweDRmLCAweDRhLCAweDVmLCAweDI5LCAweDU5LCAweDlmLCAweDU0LCAweGYwLCAweGNlLAorCTB4YTIsIDB4YzMsIDB4MTgsIDB4ZTcsIDB4YmQsIDB4MWYsIDB4ZjMsIDB4NzcsIDB4NzgsIDB4NjEsIDB4MjUsIDB4ZmIsCisJMHgxMCwgMHhmZCwgMHhmOCwgMHhlZCwgMHg1YywgMHhhMCwgMHg4YiwgMHgzYywgMHg2NywgMHg3OSwgMHhjMywgMHg2MSwKKwkweDZjLCAweDFkLCAweDkyLCAweDZiLCAweDZkLCAweGU4LCAweGVkLCAweDdmLCAweDBmLCAweDhlLCAweDEwLCAweDcxLAorCTB4YzgsIDB4ZGIsIDB4NDAsIDB4NWIsIDB4Y2YsIDB4NjIsIDB4NWIsIDB4ZmEsIDB4YzMsIDB4NjksIDB4MzksIDB4MGUsCisJMHhmYSwgMHhjYSwgMHgzNCwgMHhkOSwgMHg4YiwgMHg3YywgMHgzNCwgMHg1MSwgMHg4YywgMHhlNywgMHg1OCwgMHg2NywKKwkweDVkLCAweGM4LCAweDk1LCAweDdmLCAweDY2LCAweDcyLCAweDk4LCAweGZjLCAweGM5LCAweDg5LCAweDM0LCAweGZiLAorCTB4NDgsIDB4ZDgsIDB4NmQsIDB4NGMsIDB4NTMsIDB4NzYsIDB4ZDMsIDB4MGYsIDB4MmIsIDB4MTcsIDB4NGUsIDB4NTMsCisJMHg1MiwgMHg0MywgMHhjMiwgMHhlZCwgMHg3ZiwgMHg4NCwgMHgyNywgMHhlZiwgMHhjZiwgMHhlOSwgMHg3MCwgMHg4ZiwKKwkweGI5LCAweDA2LCAweDQzLCAweGU5LCAweDFmLCAweDE3LCAweGRhLCAweDliLCAweGYyLCAweDJlLCAweDljLCAweGJjLAorCTB4OWYsIDB4NTMsIDB4NzgsIDB4NTcsIDB4MjcsIDB4ZjcsIDB4NGMsIDB4ZWIsIDB4ZGIsIDB4OTksIDB4MGEsIDB4ZjIsCisJMHhlNywgMHg1MiwgMHhkYSwgMHg1YSwgMHg1MSwgMHhjYywgMHhjYiwgMHhiOCwgMHhiYSwgMHg2NiwgMHg4MSwgMHg4NiwKKwkweDlkLCAweDk3LCAweGQ1LCAweDRkLCAweDQzLCAweDg1LCAweGU2LCAweGZjLCAweDc1LCAweGMzLCAweGYzLCAweGVjLAorCTB4YTcsIDB4MjIsIDB4NTYsIDB4MTUsIDB4ZDksIDB4NjMsIDB4ZWYsIDB4ODMsIDB4MGEsIDB4NWQsIDB4NTYsIDB4YzMsCisJMHhiOCwgMHgyMiwgMHhjZiwgMHg4NiwgMHg2MywgMHg3OCwgMHgyYiwgMHg1MSwgMHgxZCwgMHhhYiwgMHg4ZSwgMHg1NCwKKwkweDEyLCAweDZmLCAweDRmLCAweGEzLCAweDZmLCAweGQ4LCAweDg5LCAweDBhLCAweGYyLCAweGU2LCAweGYyLCAweDY0LAorCTB4MzUsIDB4ZGMsIDB4ZjYsIDB4M2EsIDB4ZGUsIDB4NDUsIDB4ZTQsIDB4MmIsIDB4YjMsIDB4YzksIDB4NDksIDB4NjYsCisJMHhhMSwgMHg5MiwgMHhiYywgMHhjNCwgMHgxMywgMHhiMiwgMHhhYywgMHg5ZiwgMHgyZCwgMHhiNCwgMHhhYywgMHg0YiwKKwkweDc4LCAweDk0LCAweGYwLCAweDM4LCAweDE1LCAweDEyLCAweDNmLCAweDhkLCAweGEyLCAweGNlLCAweGY2LCAweDU3LAorCTB4MDMsIDB4ZjUsIDB4ZjYsIDB4ZmYsIDB4MjYsIDB4ZmEsIDB4N2EsIDB4NDcsIDB4NjgsIDB4ZmUsIDB4ZjgsIDB4N2QsCisJMHhhMSwgMHhiOSwgMHhlMywgMHgzNSwgMHg1MCwgMHgwNywgMHhhNiwgMHhjMywgMHhjMSwgMHhiNiwgMHhiZSwgMHg3MCwKKwkweDk5LCAweDg1LCAweDI2LCAweGZhLCAweGYwLCAweDVhLCAweDUzLCAweDc4LCAweGQxLCAweDFhLCAweGYyLCAweGEyLAorCTB4ZGUsIDB4OTAsIDB4MzEsIDB4N2UsIDB4MTAsIDB4NTcsIDB4MzMsIDB4Y2UsIDB4YjksIDB4MDcsIDB4N2MsIDB4ZWMsCisJMHg0NywgMHg3MiwgMHg2YywgMHg2NywgMHg3NiwgMHgwZSwgMHhmOSwgMHhmNiwgMHg2NywgMHgxNiwgMHgwYSwgMHg0NywKKwkweDZhLCAweDI1LCAweDQ3LCAweDNhLCAweDg0LCAweGQ2LCAweGYxLCAweGMzLCAweGI4LCAweDllLCAweDY1LCAweDNjLAorCTB4ZTQsIDB4MmEsIDB4YzksIDB4Y2MsIDB4OGYsIDB4ZDAsIDB4OTcsIDB4YjEsIDB4YjAsIDB4M2QsIDB4OTQsIDB4YzUsCisJMHhiNSwgMHg2YywgMHhiYiwgMHg3NCwgMHhhMCwgMHg5OSwgMHhkYywgMHg3MCwgMHgwNSwgMHhkNiwgMHg4ZCwgMHhjYiwKKwkweGJiLCAweDUyLCAweDEzLCAweDU4LCAweDNlLCAweDRlLCAweGNlLCAweDM5LCAweDVlLCAweGYwLCAweDU3LCAweGUxLAorCTB4NGIsIDB4MmIsIDB4YzgsIDB4OTcsIDB4NjQsIDB4MmQsIDB4NmQsIDB4OTUsIDB4YmQsIDB4OTYsIDB4YTYsIDB4ZDIsCisJMHgwZiwgMHgxYiwgMHgxMywgMHhmMiwgMHg5ZSwgMHg1MCwgMHgxYywgMHhhYiwgMHhjNywgMHgwNSwgMHhhYiwgMHhlZiwKKwkweDQxLCAweGY3LCAweGI4LCAweGFjLCAweGNkLCAweDdlLCAweDMzLCAweDc0LCAweGYxLCAweGY4LCAweGFiLCAweDY4LAorCTB4MWMsIDB4MWYsIDB4MGEsIDB4Y2QsIDB4MWIsIDB4MWYsIDB4YTEsIDB4ZGMsIDB4MDksIDB4Y2EsIDB4ZDYsIDB4MWYsCisJMHhhYSwgMHgxZCwgMHgxZiwgMHgwYywgMHgwNSwgMHhjNywgMHg3NywgMHg4NywgMHgwMiwgMHhlMywgMHgyZCwgMHhkOCwKKwkweDMyLCAweGJlLCAweDBhLCAweDliLCAweGM3LCAweDM3LCAweDYyLCAweGQzLCAweGI4LCAweGUwLCAweGZjLCAweDI0LAorCTB4OTYsIDB4OGQsIDB4YmYsIDB4ODEsIDB4YTUsIDB4ZTMsIDB4Y2YsIDB4YTMsIDB4NjksIDB4ZmMsIDB4MDQsIDB4OTYsCisJMHg4YywgMHhmZiwgMHgwOCwgMHhjZCwgMHhlMywgMHhhZiwgMHg3MCwgMHgyYywgMHhiMiwgMHhkNiwgMHgyYiwgMHhlYiwKKwkweGJjLCAweDg1LCAweGU3LCAweDZhLCAweDUzLCAweGY3LCAweDI0LCAweGNiLCAweDVhLCAweDg2LCAweDdjLCAweGJmLAorCTB4NDMsIDB4ZTYsIDB4ZDAsIDB4ODUsIDB4OTUsIDB4ZGEsIDB4NmIsIDB4ZTgsIDB4ZDksIDB4MjUsIDB4ZGYsIDB4MjQsCisJMHhhYywgMHhkMywgMHhiYSwgMHhlNSwgMHhmOSwgMHhhMywgMHhmNywgMHg3OSwgMHhkOSwgMHg2MywgMHg0ZiwgMHgxYiwKKwkweDNiLCAweGZmLCAweGJkLCAweGJjLCAweGM5LCAweGIzLCAweGNmLCAweDE4LCAweGU1LCAweDFiLCAweDE4LCAweGYyLAorCTB4ZWMsIDB4NzMsIDB4MTIsIDB4NWQsIDB4OTksIDB4ZGYsIDB4NWEsIDB4NTEsIDB4NGQsIDB4Y2EsIDB4Y2EsIDB4ZjcsCisJMHgzZiwgMHhjNCwgMHgxZSwgMHg1ZSwgMHhjMywgMHg0MywgMHhiYiwgMHgyNiwgMHhjOSwgMHg1OSwgMHhiMiwgMHhmNiwKKwkweDVhLCAweGNkLCAweGJiLCAweGYzLCAweGU0LCAweDliLCAweDU2LCAweGYyLCAweGNlLCAweGZlLCAweDZiLCAweDQ4LAorCTB4OGQsIDB4MDIsIDB4ZTMsIDB4MGYsIDB4OGIsIDB4MWYsIDB4YWUsIDB4YTEsIDB4MWYsIDB4NjYsIDB4YzUsIDB4MjcsCisJMHhlMywgMHhjNCwgMHhlNCwgMHhhZiwgMHg3OCwgMHg3MCwgMHgwZiwgMHg3OSwgMHg0OSwgMHgxMSwgMHhiMiwgMHgyMywKKwkweGE1LCAweDc4LCAweDY2LCAweDMwLCAweDZlLCAweGNkLCAweDMxLCAweDNjLCAweDI4LCAweDhmLCAweDE4LCAweGQ5LAorCTB4NGIsIDB4MTgsIDB4NjcsIDB4NWYsIDB4ZTEsIDB4YjUsIDB4ODksIDB4N2UsIDB4ZjgsIDB4N2QsIDB4NDYsIDB4YzAsCisJMHgzNywgMHg4NywgMHhlNywgMHhjNywgMHg4NiwgMHhiMiwgMHhlNCwgMHgxNCwgMHgxZCwgMHg5OCwgMHhlNCwgMHg3ZiwKKwkweGM5LCAweDQxLCAweDgxLCAweDZlLCAweDBjLCAweDBkLCAweDg5LCAweDNlLCAweDViLCAweGE4LCAweDRmLCAweGMxLAorCTB4NDUsIDB4YmQsIDB4YTMsIDB4ODksIDB4NzgsIDB4NjgsIDB4MjksIDB4ODIsIDB4ODcsIDB4MmEsIDB4Y2EsIDB4MWUsCisJMHhlOCwgMHhhNCwgMHhiZiwgMHhlYSwgMHhiMSwgMHg5ZiwgMHgzMCwgMHgxNiwgMHhmNCwgMHgyOSwgMHgzZiwgMHhjMiwKKwkweDczLCAweGNjLCAweDE5LCAweDRhLCAweDFmLCAweDIwLCAweGZmLCAweDIwLCAweDU2LCAweDU2LCAweDQ0LCAweDE0LAorCTB4NjMsIDB4NzksIDB4ZTAsIDB4MTQsIDB4OWUsIDB4MTksIDB4NzEsIDB4YzIsIDB4OWQsIDB4NzQsIDB4NjIsIDB4ODIsCisJMHgzOCwgMHhlOSwgMHg0OCwgMHhjYSwgMHhmMywgMHg3YSwgMHg4ZCwgMHhiMiwgMHhjOCwgMHhiYSwgMHhkMCwgMHgwOSwKKwkweDY0LCAweGVkLCAweGU3LCAweDY5LCAweGYyLCAweDNjLCAweGU0LCAweDQ1LCAweGJiLCAweDFmLCAweDI3LCAweDY1LAorCTB4ZWYsIDB4MjEsIDB4OTYsIDB4NzYsIDB4YTUsIDB4NWUsIDB4NDIsIDB4ZDMsIDB4OTAsIDB4MDcsIDB4NzMsIDB4OTIsCisJMHgxMywgMHhjYywgMHg1ZiwgMHg1ZSwgMHg0NSwgMHg2YSwgMHhkNywgMHgyYywgMHg3YywgMHg5NSwgMHgzYywgMHg3MCwKKwkweDY2LCAweGQyLCAweDg0LCAweDQ2LCAweGJkLCAweGRkLCAweDM0LCAweDY2LCAweDIyLCAweGJhLCAweDc3LCAweDE1LAorCTB4NTYsIDB4ZWUsIDB4ZmQsIDB4MjIsIDB4OGYsIDB4ZTksIDB4YjgsIDB4N2UsIDB4NmYsIDB4M2IsIDB4M2UsIDB4M2YsCisJMHgxNiwgMHg0NywgMHhlYiwgMHg1OCwgMHgwZiwgMHg4ZiwgMHgzNiwgMHg1YywgMHhiNywgMHhhMywgMHgxMiwgMHhlOSwKKwkweDkwLCAweGM2LCAweDljLCAweGJhLCAweDhkLCAweDM5LCAweGI1LCAweGYwLCAweGExLCAweGQ1LCAweDc4LCAweDg2LAorCTB4YjgsIDB4MTMsIDB4MGMsIDB4YWQsIDB4YzYsIDB4ODQsIDB4ZWQsIDB4OGIsIDB4YjIsIDB4OTcsIDB4NzEsIDB4MzUsCisJMHgzNiwgMHgzMSwgMHg1ZiwgMHgxZSwgMHhjNiwgMHg2YSwgMHg3NCwgMHhmMSwgMHhkYSwgMHgwZSwgMHg3YiwgMHgwZSwKKwkweDBlLCAweDYzLCAweDMxLCAweGYzLCAweGExLCAweGY3LCAweDJmLCAweDNmLCAweDhjLCAweDJiLCAweGY2LCAweDQ4LAorCTB4ZGYsIDB4YTcsIDB4OTEsIDB4ZGEsIDB4YjksIDB4ODYsIDB4NmQsIDB4NjYsIDB4ZDEsIDB4MzIsIDB4ZjYsIDB4NDMsCisJMHg3YywgMHg3ZSwgMHgwNywgMHg2ZSwgMHhhYiwgMHg0NCwgMHgyNSwgMHg5ZSwgMHgwZiwgMHgwNSwgMHg1YSwgMHhmYiwKKwkweDk0LCAweDFmLCAweGRhLCAweDZkLCAweDZmLCAweGEyLCAweDFmLCAweDZmLCAweDY1LCAweGI5LCAweDQ3LCAweGQyLAorCTB4MjcsIDB4ZDAsIDB4OWIsIDB4OWEsIDB4M2EsIDB4YTcsIDB4ZjYsIDB4N2IsIDB4ZWQsIDB4OGMsIDB4MDcsIDB4MmYsCisJMHg2MywgMHhkZiwgMHhjOCwgMHgyNCwgMHhiMSwgMHhmNywgMHgyNCwgMHg4ZiwgMHgwYiwgMHg5ZiwgMHg1ZiwgMHg3YiwKKwkweGVkLCAweDdjLCAweDI2LCAweDY3LCAweDM3LCAweDkyLCAweGJmLCAweGM4LCAweDNhLCAweDcwLCAweDBiLCAweDdjLAorCTB4MjksIDB4ZTEsIDB4NDQsIDB4ZDksIDB4YWQsIDB4MzMsIDB4YTEsIDB4NmYsIDB4MGMsIDB4ZGIsIDB4MWMsIDB4YzksCisJMHg4OCwgMHg5MSwgMHgxYiwgMHhiNSwgMHg3YywgMHg1NywgMHhmMSwgMHg5MCwgMHgxYiwgMHgwNSwgMHhiMSwgMHgyMiwKKwkweGEzLCAweDQ3LCAweGFmLCAweGE1LCAweGJlLCAweDRiLCAweGVlLCAweDdmLCAweDE5LCAweGNlLCAweGZiLCAweDlkLAorCTB4MjgsIDB4NGUsIDB4Y2EsIDB4ZGEsIDB4YzksIDB4MDQsIDB4N2EsIDB4MzMsIDB4ZjIsIDB4ZmUsIDB4NmUsIDB4NTYsCisJMHgyZiwgMHgyNiwgMHhhZSwgMHgxNiwgMHgyNSwgMHhiMywgMHg4YywgMHhmZCwgMHhkOSwgMHhmOSwgMHg0NSwgMHg5MCwKKwkweDc3LCAweGYxLCAweGFmLCAweGMyLCAweDlhLCAweGZlLCAweDI4LCAweGJhLCAweDRjLCAweDc5LCAweDU3LCAweDI3LAorCTB4MzcsIDB4ZmUsIDB4MzksIDB4MGQsIDB4MmYsIDB4YTMsIDB4OWIsIDB4ZjEsIDB4YTcsIDB4OGQsIDB4OTgsIDB4ZjgsCisJMHg1NSwgMHhmYiwgMHg1OSwgMHhlOCwgMHhjYiwgMHhlOCwgMHgxOSwgMHgyYywgMHhiYywgMHhiYiwgMHgyZSwgMHg2ZCwKKwkweDNlLCAweDRmLCAweGJkLCAweGI5LCAweGYyLCAweGRmLCAweGVjLCAweDkxLCAweDM2LCAweDc1LCAweGQzLCAweGFmLAorCTB4NGUsIDB4Y2IsIDB4YmQsIDB4OGIsIDB4MDMsIDB4ZmIsIDB4MTksIDB4MzYsIDB4ZWQsIDB4ZTMsIDB4MzUsIDB4ZjQsCisJMHhlZSwgMHgyYSwgMHg4YywgMHg5OSwgMHhiOSwgMHg0MSwgMHhlMCwgMHgzNSwgMHhmNCwgMHg4ZiwgMHhjYSwgMHhkOCwKKwkweGFmLCAweDlmLCAweDk2LCAweDdiLCAweGM3LCAweDc4LCAweGFhLCAweDNlLCAweDBhLCAweDc1LCAweDFkLCAweGI0LAorCTB4ZTcsIDB4YzIsIDB4ZmQsIDB4OGYsIDB4ZmIsIDB4NmUsIDB4ZDAsIDB4YTcsIDB4ZWMsIDB4NmYsIDB4ZjAsIDB4ZTQsCisJMHhiZSwgMHg4MSwgMHgwNCwgMHgzYywgMHg5OSwgMHg5MCwgMHg3NywgMHhmYiwgMHhkNSwgMHhjNSwgMHgyZSwgMHhhOCwKKwkweDVlLCAweDE3LCAweDhhLCAweDE5LCAweDJmLCAweDZhLCAweGQwLCAweGVkLCAweGI1LCAweDcwLCAweDM1LCAweGM3LAorCTB4YjIsIDB4YmYsIDB4ZmUsIDB4M2EsIDB4NjYsIDB4MWEsIDB4ZjEsIDB4NTYsIDB4OTcsIDB4ZmQsIDB4Y2UsIDB4ZTEsCisJMHg4YSwgMHhiZiwgMHhmZSwgMHhlOCwgMHgzYiwgMHg4NywgMHg2ZiwgMHgxMCwgMHg2NywgMHgxNSwgMHg5NCwgMHgxYiwKKwkweDM3LCAweGUxLCAweDA1LCAweDNiLCAweGE2LCAweDI4LCAweDI4LCAweDliLCAweDJiLCAweGViLCAweDk4LCAweDdlLAorCTB4M2MsIDB4NmIsIDB4ZDQsIDB4ZjksIDB4YWIsIDB4ZTQsIDB4ZjksIDB4OTQsIDB4NzIsIDB4Y2EsIDB4OTIsIDB4NmYsCisJMHgwNiwgMHg2YywgMHhjYiwgMHhmYywgMHhiMSwgMHgzZCwgMHhmMSwgMHg0ZiwgMHg2MSwgMHhjYiwgMHhjZSwgMHgzMCwKKwkweGU0LCAweGZkLCAweDE1LCAweGE3LCAweGExLCAweDc5LCAweDczLCAweGZjLCAweDRhLCAweDY0LCAweDkzLCAweGJkLAorCTB4ZTQsIDB4YjcsIDB4MTIsIDB4OWMsIDB4ZGUsIDB4YTAsIDB4OWYsIDB4YmUsIDB4MjEsIDB4N2IsIDB4YTYsIDB4YzgsCisJMHg5OSwgMHhmZSwgMHgxMiwgMHhjMSwgMHhhYSwgMHhjMiwgMHgzOCwgMHg2NSwgMHhhZiwgMHhhOSwgMHg5MiwgMHgxYiwKKwkweGFiLCAweDVkLCAweDQ3LCAweGNhLCAweDRhLCAweGJkLCAweDM3LCAweGVjLCAweDM1LCAweDVjLCAweDk3LCAweGYxLAorCTB4NWIsIDB4ZWIsIDB4NGQsIDB4NmYsIDB4MzUsIDB4Y2IsIDB4MWUsIDB4Y2UsIDB4ZGYsIDB4OWYsIDB4MTQsIDB4OWYsCisJMHgzMywgMHhlNSwgMHgxYiwgMHg1NiwgMHg0ZSwgMHhiYiwgMHg4ZSwgMHhlOCwgMHhmNywgMHg1YywgMHg5ZCwgMHhlZSwKKwkweDk0LCAweDgzLCAweGI4LCAweDc5LCAweGMyLCAweGVhLCAweGY0LCAweGNhLCAweDE4LCAweGVlLCAweGJjLCAweGEwLAorCTB4OGUsIDB4YWMsIDB4MmIsIDB4NjgsIDB4ZDIsIDB4NmYsIDB4NTgsIDB4YzYsIDB4ZGMsIDB4OTUsIDB4ZjksIDB4NjgsCisJMHg5ZiwgMHhiMiwgMHhkZSwgMHg1YiwgMHg2NCwgMHg5NCwgMHhlMSwgMHg1NCwgMHg1NSwgMHg2ZSwgMHgxZCwgMHhlNiwKKwkweDljLCAweDhjLCAweDNkLCAweDM1LCAweGIyLCAweDRmLCAweGFmLCAweGQ4LCAweDNlLCAweGI3LCAweGZiLCAweDM1LAorCTB4Y2YsIDB4ZDUsIDB4ZmIsIDB4YmIsIDB4ZmMsIDB4NzgsIDB4YWIsIDB4ZWQsIDB4NzcsIDB4ODYsIDB4MWUsIDB4YjQsCisJMHg3OSwgMHg5MSwgMHg2MywgMHhjYSwgMHhiOCwgMHg0YiwgMHg2YSwgMHhjZSwgMHhlZiwgMHhlNywgMHgyYiwgMHhmOSwKKwkweDdlLCAweDQ1LCAweDFlLCAweGVmLCAweDk0LCAweDNlLCAweDQ0LCAweGFlLCAweDg3LCAweGYzLCAweDc1LCAweGY0LAorCTB4NzAsIDB4ZDQsIDB4ZWUsIDB4NWYsIDB4NjUsIDB4YmUsIDB4NTUsIDB4ZTgsIDB4OTMsIDB4ZmUsIDB4YjgsIDB4YjAsCisJMHhkMCwgMHg0NiwgMHg1NiwgMHhlYywgMHhiMywgMHhiMywgMHg5OCwgMHhiMSwgMHhlZCwgMHg1NCwgMHhjMywgMHgzZCwKKwkweGQ4LCAweDk0LCAweDEwLCAweDNkLCAweGNiLCAweGI3LCAweDYwLCAweDg5LCAweGUxLCAweDM2LCAweDU3LCAweDczLAorCTB4ZDEsIDB4NWYsIDB4MmYsIDB4YzMsIDB4OTAsIDB4MTYsIDB4YzcsIDB4OWUsIDB4N2EsIDB4NzksIDB4NDcsIDB4Y2UsCisJMHg0NSwgMHg5ZiwgMHg4OCwgMHhhMywgMHhjNCwgMHgyOCwgMHg5NiwgMHhmZCwgMHhjNywgMHhmNiwgMHgxZSwgMHg5NCwKKwkweDdkLCAweGE2LCAweDFlLCAweDdkLCAweDUyLCAweGJlLCAweDU1LCAweDc2LCAweGE5LCAweGJkLCAweDVlLCAweGQ1LAorCTB4M2MsIDB4MDQsIDB4YjksIDB4NmUsIDB4ZTIsIDB4ZGEsIDB4ZjMsIDB4ZjIsIDB4ZmUsIDB4MTIsIDB4ZGEsIDB4OGUsCisJMHhiZCwgMHgyNywgMHhkYSwgMHg5NCwgMHg3NywgMHhlOCwgMHhmYSwgMHgxMiwgMHhmMiwgMHgyZSwgMHg1NywgMHg1ZCwKKwkweDhjLCAweGZjLCAweDEyLCAweDJmLCAweGE0LCAweDY1LCAweGJmLCAweGMyLCAweGVmLCAweGFjLCAweDc4LCAweDhkLAorCTB4ZWMsIDB4OGIsIDB4OWMsIDB4NWEsIDB4YTcsIDB4ODgsIDB4YjgsIDB4MTYsIDB4MDgsIDB4NTcsIDB4MjgsIDB4ODUsCisJMHhmNywgMHhiOSwgMHhjZSwgMHhmZCwgMHg1ZCwgMHg0ZiwgMHg5YiwgMHgzOSwgMHg2ZCwgMHhiZiwgMHg4MywgMHgyNywKKwkweDY3LCAweDExLCAweDM0LCAweGE2LCAweGU0LCAweDliLCAweGE3LCAweGZhLCAweGM0LCAweDcyLCAweGQ0LCAweDY1LAorCTB4NmIsIDB4MWQsIDB4Y2UsIDB4M2MsIDB4N2YsIDB4MDksIDB4NjMsIDB4MDUsIDB4ZWQsIDB4NjYsIDB4NzMsIDB4MjAsCisJMHg2YywgMHhiZiwgMHg2YiwgMHhiNiwgMHgyYywgMHg1NSwgMHgxYiwgMHg3YywgMHgwNCwgMHg3YSwgMHhmYiwgMHhkYiwKKwkweDJjLCAweDdmLCAweDVkLCAweGU2LCAweGZiLCAweGQ2LCAweDkwLCAweDU3LCAweGM2LCAweDU0LCAweGMwLCAweDg4LAorCTB4MTMsIDB4ZjQsIDB4MGQsIDB4ZWEsIDB4MzEsIDB4MjIsIDB4ZmUsIDB4ZTEsIDB4NDEsIDB4NTUsIDB4MjQsIDB4NGMsCisJMHgzZiwgMHg5NiwgMHhmOCwgMHgyZiwgMHhlZiwgMHhhOSwgMHhlOSwgMHhiYiwgMHhlMywgMHgzMCwgMHhkMSwgMHhjOCwKKwkweDFjLCAweGRkLCAweDY1LCAweGVmLCAweDczLCAweGQ2LCAweGZkLCAweDJiLCAweDE5LCAweDg3LCAweDhlLCAweDljLAorCTB4ZGQsIDB4MTMsIDB4MjAsIDB4N2MsIDB4ZTEsIDB4YzcsIDB4MzUsIDB4ZjksIDB4YmQsIDB4ZDAsIDB4ZWUsIDB4MzksCisJMHg4YywgMHg4ZiwgMHg5NiwgMHhmZCwgMHg5YywgMHg3ZiwgMHg4ZCwgMHg4ZCwgMHgyZCwgMHg5YSwgMHhhMSwgMHhlZiwKKwkweGZmLCAweDk1LCAweGEzLCAweDEzLCAweDRmLCAweDJjLCAweDMwLCAweDNhLCAweDBlLCAweGE4LCAweGQ5LCAweDIxLAorCTB4MWYsIDB4NzEsIDB4ZTYsIDB4NGEsIDB4NDcsIDB4NzQsIDB4MDcsIDB4ZmYsIDB4ZmIsIDB4NWYsIDB4YjQsIDB4YmYsCisJMHhhMSwgMHgyMiwgMHg3NSwgMHhmNSwgMHhlMCwgMHgyYSwgMHg1NSwgMHhmNiwgMHgwZiwgMHhiNSwgMHg2MCwgMHhhYywKKwkweDRmLCAweGRlLCAweDdkLCAweGQwLCAweDViLCAweGJmLCAweGFkLCAweDc0LCAweDYyLCAweDQzLCAweGM4LCAweDY4LAorCTB4ZDksIDB4YTgsIDB4ZTgsIDB4Y2QsIDB4N2YsIDB4YWYsIDB4ZTgsIDB4ZmUsIDB4OTAsIDB4MjIsIDB4ZTUsIDB4ODIsCisJMHhiMiwgMHhiNiwgMHg3NywgMHgzNiwgMHhmNiwgMHhiYSwgMHhkOCwgMHhjNywgMHhkZSwgMHg4NCwgMHgxZSwgMHg5ZSwKKwkweGM2LCAweGIyLCAweGE3LCAweDRjLCAweGMzLCAweGY3LCAweDFlLCAweGRiLCAweGZjLCAweDA5LCAweDhmLCAweDFkLAorCTB4ZjYsIDB4M2IsIDB4ZWMsIDB4NTIsIDB4M2UsIDB4M2EsIDB4ZGYsIDB4NjUsIDB4N2YsIDB4OGYsIDB4YjgsIDB4OTUsCisJMHgzMSwgMHg0NSwgMHhiZSwgMHgzNSwgMHgxYywgMHg4MywgMHg5NiwgMHg5YywgMHg0NSwgMHgxMywgMHhkMywgMHg3YiwKKwkweDZmLCAweDgwLCAweGU0LCAweGMwLCAweDM3LCAweDRmLCAweDQ3LCAweGE5LCAweDA3LCAweGRlLCAweDQ4LCAweDI3LAogCTB4ZTYsIDB4MmUsIDB4MzAsIDB4N2MsIDB4OGIsIDB4NTQsIDB4YmIsIDB4N2UsIDB4MzAsIDB4YWEsIDB4NGEsIDB4N2QsCi0JMHhkZCwgMHgzZiwgMHgwOCwgMHg2OSwgMHgyMywgMHg2MywgMHg2OSwgMHg3MywgMHhjYiwgMHhlZCwgMHgzYSwgMHgwYiwKLQkweGQ0LCAweGNmLCAweGMwLCAweDc1LCAweGY1LCAweGFmLCAweGU1LCAweDViLCAweDQ2LCAweDVhLCAweGE1LCAweDIxLAotCTB4NzUsIDB4ZTIsIDB4M2IsIDB4MzUsIDB4ZmMsIDB4YjEsIDB4N2EsIDB4ODIsIDB4MmIsIDB4YmYsIDB4YjIsIDB4MzAsCi0JMHg0ZCwgMHhlYSwgMHhjOSwgMHg5ZSwgMHhiMSwgMHgzYiwgMHg3MCwgMHhhZiwgMHhmZCwgMHgzZCwgMHgxNiwgMHhmMSwKLQkweDQ3LCAweDNkLCAweGZhLCAweDE1LCAweGYyLCAweGNmLCAweDYyLCAweDQ1LCAweGI4LCAweGE3LCAweGYwLCAweDg0LAotCTB4NTYsIDB4NzQsIDB4MzMsIDB4OGUsIDB4NjksIDB4MjEsIDB4YmQsIDB4ZTcsIDB4MGEsIDB4ZDUsIDB4ODMsIDB4YzIsCi0JMHhjOCwgMHg2MywgMHhiMiwgMHg2ZiwgMHg2NiwgMHhlZiwgMHgzYywgMHgzNSwgMHhiYiwgMHhiZiwgMHgyNiwgMHhjNiwKLQkweDc2LCAweDhmLCAweGZmLCAweGQxLCAweGU3LCAweGI4LCAweGVjLCAweGFiLCAweGQ4LCAweDk0LCAweGY3LCAweDViLAotCTB4ZWMsIDB4MzUsIDB4YzUsIDB4ZDYsIDB4ODQsIDB4MjMsIDB4YjcsIDB4NWYsIDB4MzAsIDB4M2YsIDB4YjcsIDB4MWEsCi0JMHhkYSwgMHhjOCwgMHhmNSwgMHhkNywgMHhjOCwgMHgzNywgMHgzMSwgMHgzOSwgMHhkNiwgMHhiNSwgMHgwOSwgMHg1OSwKLQkweDRkLCAweGZhLCAweGZmLCAweDAwLCAweDg1LCAweDU3LCAweDBmLCAweGU3LCAweGU4LCAweDU5LCAweDAwLCAweDAwLAorCTB4ZGQsIDB4M2YsIDB4MDgsIDB4NjksIDB4MjMsIDB4NmIsIDB4NjksIDB4NzMsIDB4MmIsIDB4ZWQsIDB4M2EsIDB4MGIsCisJMHhkNCwgMHhjZiwgMHhjMSwgMHhmNSwgMHhlOSwgMHg1ZiwgMHhjYiwgMHgzNywgMHg4YiwgMHhiNCwgMHg2YSwgMHg0MywKKwkweGVhLCAweGM0LCAweDc3LCAweDY4LCAweGY4LCAweDYzLCAweGY1LCAweDA0LCAweDU3LCAweDdlLCAweDY1LCAweDYxLAorCTB4YmEsIDB4ZDQsIDB4OTMsIDB4M2QsIDB4NjYsIDB4MzcsIDB4ZTMsIDB4NzYsIDB4ZmIsIDB4YmIsIDB4MmIsIDB4ZTIsCisJMHg4ZiwgMHg3YSwgMHhmNCwgMHg2ZSwgMHg3MiwgMHhkNSwgMHg1MiwgMHg0NSwgMHg3OCwgMHhhYSwgMHhjNCwgMHhhMiwKKwkweDM2LCAweGUyLCAweDYxLCAweDI3LCAweGI0LCAweDkwLCAweGRlLCAweDdiLCAweDkxLCAweGVhLCAweDQxLCAweDcxLAorCTB4NjQsIDB4NTQsIDB4ZjYsIDB4ZDksIDB4ZWMsIDB4OWUsIDB4YTcsIDB4ZTYsIDB4ZjYsIDB4ZTMsIDB4YzQsIDB4ZDgsCisJMHhlZSwgMHg5MSwgMHgzZiwgMHhmYSwgMHhkYywgMHg5NywgMHg3ZCwgMHg5NSwgMHg5YSwgMHhmMiwgMHhjZSwgMHg4ZSwKKwkweGZkLCAweDllLCAweDQ4LCAweDViLCAweGMyLCAweDkxLCAweGRmLCAweDVmLCAweDU4LCAweDk4LCAweDViLCAweDBkLAorCTB4NmIsIDB4OTgsIDB4MTcsIDB4YWMsIDB4OTUsIDB4NmYsIDB4NjMsIDB4NzIsIDB4YWMsIDB4ZWIsIDB4MTIsIDB4YjIsCisJMHgwYSwgMHhmNSwgMHg3ZiwgMHgwMSwgMHgyOCwgMHhmYywgMHhmYywgMHg0MCwgMHgzOCwgMHg1YSwgMHgwMCwgMHgwMCwKIAkweDAwIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYm54Ml9DUF9iMDZGd0RhdGFbKDB4ODQvNCkgKyAxXSA9IHsKQEAgLTIxMzcsNDggKzIxMzgsNDggQEAKIAkweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLAogCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAgfTsKIHN0YXRpYyBjb25zdCB1MzIgYm54Ml9DUF9iMDZGd1JvZGF0YVsoMHgxMzAvNCkgKyAxXSA9IHsKLQkweDA4MDAxZjFjLCAweDA4MDAxZGE4LCAweDA4MDAxZWY4LCAweDA4MDAxZWQ0LCAweDA4MDAxZWIwLCAweDA4MDAxZThjLAotCTB4MDgwMDFlNjQsIDB4MDgwMDFlM2MsIDB4MDgwMDFlMTAsIDB4MDgwMDIwMTQsIDB4MDgwMDIwMDQsIDB4MDgwMDFkYzQsCi0JMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWY0NCwgMHgwODAwMWY0NCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwKLQkweDA4MDAxZmY0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZmU0LAotCTB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsCi0JMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwKLQkweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZmQ0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZmM0LAotCTB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsCi0JMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwgMHgwODAwMWRjNCwKLQkweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZGM0LCAweDA4MDAxZmFjLAotCTB4MDgwMDFkYzQsIDB4MDgwMDFkYzQsIDB4MDgwMDFmOWMsIDB4MDgwMDFmOGMsIDB4MDgwMDMxZTgsIDB4MDgwMDMxZjAsCi0JMHgwODAwMzFiOCwgMHgwODAwMzFjNCwgMHgwODAwMzFkMCwgMHgwODAwMzFkYywgMHgwODAwNTY0NCwgMHgwODAwNTYwNCwKLQkweDA4MDA1NWQwLCAweDA4MDA1NWE0LCAweDA4MDA1NTgwLCAweDA4MDA1NTNjLCAweDAwMDAwMDAwIH07CisJMHgwODAwMWU4YywgMHgwODAwMWQxOCwgMHgwODAwMWU2OCwgMHgwODAwMWU0NCwgMHgwODAwMWUyMCwgMHgwODAwMWRmYywKKwkweDA4MDAxZGQ0LCAweDA4MDAxZGFjLCAweDA4MDAxZDgwLCAweDA4MDAxZjg0LCAweDA4MDAxZjc0LCAweDA4MDAxZDM0LAorCTB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFlYjQsIDB4MDgwMDFlYjQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsCisJMHgwODAwMWY2NCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWY1NCwKKwkweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LAorCTB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsCisJMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWY0NCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWYzNCwKKwkweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZDM0LAorCTB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsIDB4MDgwMDFkMzQsCisJMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWQzNCwgMHgwODAwMWYxYywKKwkweDA4MDAxZDM0LCAweDA4MDAxZDM0LCAweDA4MDAxZjBjLCAweDA4MDAxZWZjLCAweDA4MDAzMjA4LCAweDA4MDAzMjEwLAorCTB4MDgwMDMxZDgsIDB4MDgwMDMxZTQsIDB4MDgwMDMxZjAsIDB4MDgwMDMxZmMsIDB4MDgwMDU2OTQsIDB4MDgwMDU2NTQsCisJMHgwODAwNTYyMCwgMHgwODAwNTVmNCwgMHgwODAwNTVkMCwgMHgwODAwNTU4YywgMHgwMDAwMDAwMCB9OwogCiBzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9jcF9md18wNiA9IHsKLQkvKiBGaXJtd2FyZSB2ZXJzaW9uOiA0LjAuNSAqLworCS8qIEZpcm13YXJlIHZlcnNpb246IDQuNC4yMiAqLwogCS52ZXJfbWFqb3IJCQk9IDB4NCwKLQkudmVyX21pbm9yCQkJPSAweDAsCi0JLnZlcl9maXgJCQk9IDB4NSwKKwkudmVyX21pbm9yCQkJPSAweDQsCisJLnZlcl9maXgJCQk9IDB4MTYsCiAKLQkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDA3OCwKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDA4MCwKIAogCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDAwMDAsCi0JLnRleHRfbGVuCQkJPSAweDU5ZTQsCisJLnRleHRfbGVuCQkJPSAweDVhMzQsCiAJLnRleHRfaW5kZXgJCQk9IDB4MCwKIAkuZ3pfdGV4dAkJCT0gYm54Ml9DUF9iMDZGd1RleHQsCiAJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9DUF9iMDZGd1RleHQpLAogCi0JLmRhdGFfYWRkcgkJCT0gMHgwODAwNWI0MCwKKwkuZGF0YV9hZGRyCQkJPSAweDA4MDA1YjgwLAogCS5kYXRhX2xlbgkJCT0gMHg4NCwKIAkuZGF0YV9pbmRleAkJCT0gMHgwLAogCS5kYXRhCQkJCT0gYm54Ml9DUF9iMDZGd0RhdGEsCiAKLQkuc2Jzc19hZGRyCQkJPSAweDA4MDA1YmM0LAorCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDVjMDQsCiAJLnNic3NfbGVuCQkJPSAweGU5LAogCS5zYnNzX2luZGV4CQkJPSAweDAsCiAKLQkuYnNzX2FkZHIJCQk9IDB4MDgwMDVjYjAsCisJLmJzc19hZGRyCQkJPSAweDA4MDA1Y2YwLAogCS5ic3NfbGVuCQkJPSAweDVkOCwKIAkuYnNzX2luZGV4CQkJPSAweDAsCiAKLQkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDU5ZTQsCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA1YTM0LAogCS5yb2RhdGFfbGVuCQkJPSAweDEzMCwKIAkucm9kYXRhX2luZGV4CQkJPSAweDAsCiAJLnJvZGF0YQkJCQk9IGJueDJfQ1BfYjA2RndSb2RhdGEsCkBAIC0yMjAxLDc2MSArMjIwMiw3NjEgQEAKIH07CiAKIHN0YXRpYyB1OCBibngyX1JYUF9iMDZGd1RleHRbXSA9IHsKLQkweGVjLCAweDViLCAweDVkLCAweDcwLCAweDVjLCAweGQ3LCAweDVkLCAweGZmLCAweGRmLCAweGIzLCAweDJiLCAweDY5LAotCTB4MmQsIDB4NGIsIDB4ZjIsIDB4OTUsIDB4YmMsIDB4NzEsIDB4NTYsIDB4YTksIDB4OTIsIDB4ZWMsIDB4NWEsIDB4NTcsCi0JMHhkMiwgMHhhNiwgMHgxMiwgMHhlMSwgMHhjYSwgMHg2YywgMHgxMiwgMHg3NSwgMHhkOCwgMHg2OSwgMHhiNiwgMHhiYiwKLQkweGIyLCAweGEzLCAweGI0LCAweDY2LCAweDQ2LCAweDQ5LCAweDBkLCAweGNkLCAweGI0LCAweDY1LCAweDEwLCAweGJiLAotCTB4MGUsIDB4YTQsIDB4MGYsIDB4MGMsIDB4YzYsIDB4NDAsIDB4MjYsIDB4ODAsIDB4YzEsIDB4Y2IsIDB4NGEsIDB4NzEsCi0JMHg5NCwgMHg3NCwgMHhhZCwgMHhkZCwgMHhkYSwgMHgwYSwgMHg4NiwgMHg2OSwgMHg2MSwgMHg5NCwgMHhkNSwgMHg4NywKLQkweDUzLCAweDY2LCAweGFkLCAweDRkLCAweGNiLCAweDRiLCAweDk5LCAweGQ2LCAweGIxLCAweGVhLCAweGI4LCAweDI2LAotCTB4MGYsIDB4M2MsIDB4YTQsIDB4OTQsIDB4Y2UsIDB4NjQsIDB4MjAsIDB4MzMsIDB4MzUsIDB4YjIsIDB4NjMsIDB4ZmIsCi0JMHg4MSwgMHg4ZiwgMHhjMCwgMHg0YywgMHg0OSwgMHgyMCwgMHg2ZSwgMHgyZSwgMHhiZiwgMHhkZiwgMHhiOSwgMHhmNywKLQkweGNhLCAweDJiLCAweDQ1LCAweGQwLCAweDNjLCAweGYwLCAweDc4LCAweGNmLCAweDhjLCAweGU2LCAweGRlLCAweDdiLAotCTB4Y2UsIDB4ZmYsIDB4ZmMsIDB4Y2YsIDB4ZmYsIDB4ZmIsIDB4ZTMsIDB4YWMsIDB4ZmQsIDB4M2IsIDB4MWQsIDB4ZDIsCi0JMHgyZSwgMHhkZSwgMHhlOCwgMHhjNCwgMHg1ZiwgMHhlYSwgMHhjOCwgMHgzMywgMHg0NywgMHg0NywgMHhlZiwgMHgxZiwKLQkweGJkLCAweDlmLCAweGRmLCAweDIxLCAweGMzLCAweDA4LCAweGYzLCAweDY5LCAweDQ4LCAweDMwLCAweDgyLCAweDExLAotCTB4OGMsIDB4NjAsIDB4MDQsIDB4MjMsIDB4MTgsIDB4YzEsIDB4MDgsIDB4NDYsIDB4MzAsIDB4ODIsIDB4MTEsIDB4OGMsCi0JMHg2MCwgMHgwNCwgMHgyMywgMHgxOCwgMHhjMSwgMHgwOCwgMHg0NiwgMHgzMCwgMHg4MiwgMHgxMSwgMHg4YywgMHg2MCwKLQkweDA0LCAweDIzLCAweDE4LCAweGMxLCAweDA4LCAweDQ2LCAweDMwLCAweDgyLCAweDExLCAweDhjLCAweDYwLCAweDA0LAotCTB4MjMsIDB4MTgsIDB4YzEsIDB4MDgsIDB4NDYsIDB4MzAsIDB4ODIsIDB4MTEsIDB4OGMsIDB4NjAsIDB4MDQsIDB4MjMsCi0JMHgxOCwgMHhjMSwgMHgwOCwgMHg0NiwgMHgzMCwgMHg4MiwgMHgxMSwgMHg4YywgMHg2MCwgMHgwNCwgMHgyMywgMHgxOCwKLQkweGMxLCAweDA4LCAweDQ2LCAweDMwLCAweGZlLCAweDNmLCAweDQ3LCAweDQ4LCAweGM0LCAweGU0LCAweGIzLCAweGQzLAotCTB4ZmIsIDB4OTMsIDB4ODgsIDB4NGEsIDB4YzcsIDB4OGYsIDB4NjYsIDB4MmQsIDB4ODksIDB4ODQsIDB4ZDIsIDB4OTcsCi0JMHg5ZSwgMHgyZSwgMHg1OCwgMHgyMiwgMHg5OSwgMHhmYSwgMHg3MCwgMHgzYywgMHgyNywgMHgzZiwgMHg3MSwgMHg4YSwKLQkweGQxLCAweGIwLCAweDcwLCAweGZlLCAweGVlLCAweGY0LCAweGFkLCAweGUzLCAweGU3LCAweDFmLCAweDRhLCAweGJjLAotCTB4YjMsIDB4MTAsIDB4OTIsIDB4ODgsIDB4OTksIDB4N2UsIDB4NjMsIDB4ZDQsIDB4MWMsIDB4OTQsIDB4NDgsIDB4MWYsCi0JMHhmNiwgMHg3YywgMHg2ZCwgMHg2OCwgMHg2ZCwgMHg5NywgMHg3NCwgMHhmOSwgMHhiOCwgMHg0NCwgMHg2YSwgMHhlNSwKLQkweDg0LCAweDdkLCAweDQwLCAweDg2LCAweGNkLCAweDhiLCAweDEyLCAweDk2LCAweDBjLCAweGNlLCAweDU4LCAweGE5LAotCTB4OGIsIDB4OTQsIDB4Y2EsIDB4MDYsIDB4NzEsIDB4NDgsIDB4YTksIDB4MWUsIDB4OTEsIDB4MmIsIDB4MjEsIDB4NDIsCi0JMHg3ZCwgMHhjYiwgMHhjOCwgMHg1NiwgMHgzZSwgMHg3MCwgMHgzMiwgMHg2MSwgMHg5YywgMHg2YiwgMHhlMSwgMHhiZCwKLQkweGUxLCAweGNmLCAweDQ3LCAweDQ0LCAweGE1LCAweDEzLCAweGM5LCAweDZjLCAweDY4LCAweDQyLCAweDZhLCAweGYzLAotCTB4OGUsIDB4MzMsIDB4NjMsIDB4N2YsIDB4MGMsIDB4MzgsIDB4N2EsIDB4NjQsIDB4YzYsIDB4NzIsIDB4YmYsIDB4YjMsCi0JMHhmNiwgMHhjNywgMHhjZCwgMHg3MSwgMHhiOSwgMHgxMywgMHg3MywgMHgyMSwgMHg1MSwgMHhkNiwgMHg1ZCwgMHhmOCwKLQkweDhiLCAweDFiLCAweGI5LCAweGQzLCAweDVmLCAweDM2LCAweGIyLCAweDhiLCAweDFkLCAweDUyLCAweGFhLCAweDM4LAotCTB4NTIsIDB4YjAsIDB4MjUsIDB4OTMsIDB4YjUsIDB4NzcsIDB4NjAsIDB4ZmQsIDB4MDMsIDB4YTcsIDB4YjAsIDB4YjEsCi0JMHg2NywgMHhkOCwgMHhjYywgMHg0OSwgMHg4YiwgMHg2NCwgMHhhMiwgMHgzMSwgMHhjMCwgMHhjYywgMHgxYiwgMHhiOSwKLQkweGIzLCAweDdmLCAweGRkLCAweDIxLCAweGVkLCAweGEwLCAweDI3LCAweGM1LCAweGVmLCAweDBmLCAweDljLCAweDkwLAotCTB4NjUsIDB4NjEsIDB4OWQsIDB4ZTcsIDB4ZTMsIDB4YmIsIDB4NDEsIDB4YmMsIDB4N2MsIDB4MjcsIDB4Y2UsIDB4MmIsCi0JMHhjZSwgMHhmOSwgMHhhMSwgMHg5OCwgMHg3YywgMHhiMywgMHgxMSwgMHg5NSwgMHg2ZiwgMHgzNCwgMHg0YywgMHg3OSwKLQkweGE1LCAweGQxLCAweDI3LCAweDE3LCAweDFhLCAweDhlLCAweGYzLCAweDBkLCAweGRiLCAweDcxLCAweGRlLCAweGMwLAotCTB4ZGYsIDB4N2YsIDB4ZDgsIDB4MWIsIDB4M2MsIDB4NjAsIDB4MTQsIDB4OGQsIDB4ZjEsIDB4YzYsIDB4NTcsIDB4M2IsCi0JMHhhNCwgMHgyYiwgMHgxMSwgMHgxNywgMHhkNSwgMHgyMSwgMHhkMywgMHg5NSwgMHg5OCwgMHhjYywgMHg1NCwgMHhjYSwKLQkweGM2LCAweDYzLCAweDY3LCAweGU3LCAweDhjLCAweGM5LCAweGIzLCAweDU1LCAweDljLCAweDE5LCAweGM2LCAweDljLAotCTB4MTQsIDB4NGIsIDB4ZjYsIDB4Y2IsIDB4NDYsIDB4YWUsIDB4MzEsIDB4NmIsIDB4M2MsIDB4N2UsIDB4YjYsIDB4MGIsCi0JMHgzNCwgMHhmMiwgMHhmYywgMHgzZCwgMHg0NiwgMHhmNiwgMHhmNCwgMHgyZCwgMHhjOSwgMHhkYSwgMHg5NCwgMHg3MSwKLQkweGMyLCAweGZjLCAweDNjLCAweGM0LCAweDllLCAweDJkLCAweDkzLCAweGU2LCAweDU2LCAweDhmLCAweDVlLCAweGM3LAotCTB4NTEsIDB4NjksIDB4ZTcsIDB4NzgsIDB4MzYsIDB4NjUsIDB4OTksIDB4MjUsIDB4MjEsIDB4N2QsIDB4N2EsIDB4ZWUsCi0JMHg4MiwgMHg0YiwgMHhmMywgMHg4YSwgMHg5MSwgMHgzZCwgMHhkYiwgMHg2MSwgMHhlNCwgMHhjZSwgMHg4NCwgMHg0MSwKLQkweDg3LCAweGY0LCAweDg1LCAweDg0LCAweGZiLCAweDA2LCAweDYyLCAweDc5LCAweGE5LCAweGUzLCAweDBjLCAweDMxLAotCTB4NTUsIDB4OWEsIDB4NzIsIDB4MDUsIDB4Y2QsIDB4YTAsIDB4ZTUsIDB4OWIsIDB4MTUsIDB4ZjAsIDB4NTAsIDB4MDEsCi0JMHgwZiwgMHgxNSwgMHhmMiwgMHgxNiwgMHg5NywgMHhmMywgMHg0MywgMHgzZSwgMHg2ZiwgMHg4ZSwgMHhmMywgMHg3NywKLQkweDM2LCAweDY5LCAweDRmLCAweGM0LCAweDMzLCAweGNhLCAweGU3LCAweGQzLCAweDcxLCAweGZlLCAweGRkLCAweDI2LAotCTB4YWYsIDB4ZTQsIDB4YzcsIDB4NzEsIDB4NWUsIDB4YjEsIDB4NjMsIDB4YTAsIDB4ZGQsIDB4YjksIDB4YTAsIDB4YWMsCi0JMHgzMiwgMHg3OCwgMHhiMSwgMHg4MCwgMHg5ZiwgMHhiMiwgMHg5ZSwgMHgwMywgMHgwZiwgMHhiMywgMHhlMCwgMHg2ZiwKLQkweDA1LCAweGJjLCAweDU1LCAweDQxLCAweGM3LCAweDRmLCAweDNiLCAweGFmLCAweDY4LCAweGU0LCAweDg2LCAweDM2LAotCTB4ZTQsIDB4MTUsIDB4YTcsIDB4OGMsIDB4ZjMsIDB4NGIsIDB4MGEsIDB4YjIsIDB4ZGUsIDB4MjksIDB4ZjksIDB4MDUsCi0JMHg1MywgMHhhNiwgMHg5NiwgMHhmYywgMHhmZCwgMHhiZSwgMHgxZCwgMHgxYywgMHg5MSwgMHg4MywgMHg5NSwgMHgxZSwKLQkweGM4LCAweDg2LCAweGIyLCAweDRjLCAweGQ4LCAweDIyLCAweDBlLCAweDY0LCAweDU0LCAweDRhLCAweDJhLCAweDExLAotCTB4MjMsIDB4NmYsIDB4MWYsIDB4ZDcsIDB4ZmEsIDB4NWYsIDB4YjIsIDB4MjQsIDB4OTMsIDB4YjcsIDB4MjksIDB4NDcsCi0JMHg4OSwgMHhlNywgMHhlZCwgMHg2MiwgMHgyYywgMHgwYywgMHg3YiwgMHg1YiwgMHhiMiwgMHg4YSwgMHg2NiwgMHg1OCwKLQkweDI4LCAweGM3LCAweDQ0LCAweGVjLCAweGY3LCAweDIxLCAweGNiLCAweDI3LCAweGNiLCAweDkyLCAweGY5LCAweDc0LAotCTB4ZDksIDB4OTcsIDB4YjEsIDB4MmIsIDB4ZGYsIDB4Y2YsIDB4OTQsIDB4M2YsIDB4ZDUsIDB4MjksIDB4ZWQsIDB4ZWEsCi0JMHg5ZSwgMHgxNiwgMHhmOSwgMHgwZCwgMHhlYywgMHgyNSwgMHhlZSwgMHg0ZCwgMHg3YiwgMHhiMSwgMHhjZiwgMHg4NSwKLQkweDczLCAweGY3LCAweDI2LCAweDllLCAweDEwLCAweDIxLCAweDZjLCAweGE5LCAweGJmLCAweDQ1LCAweGZiLCAweDg4LAotCTB4MTgsIDB4NTksIDB4YWIsIDB4MTgsIDB4MGIsIDB4MDEsIDB4MmUsIDB4MmYsIDB4YTUsIDB4NTEsIDB4NmYsIDB4YWUsCi0JMHgyNSwgMHg2YiwgMHhkZCwgMHgwYSwgMHhjZCwgMHhkOCwgMHg4OSwgMHg3OCwgMHg0OSwgMHg2ZSwgMHg4NSwgMHgyZSwKLQkweGRiLCAweDdhLCAweDZlLCAweDQ3LCAweGQ2LCAweDcyLCAweDY0LCAweDE5LCAweGQ4LCAweDlmLCAweDgzLCAweDNmLAotCTB4NWMsIDB4MDQsIDB4NDcsIDB4NWYsIDB4MmEsIDB4ZWIsIDB4ZjksIDB4NGUsIDB4ZWMsIDB4NGYsIDB4YjYsIDB4MDAsCi0JMHg2NywgMHhiYiwgMHgyNCwgMHg5MiwgMHgzNSwgMHhjYywgMHg1ZiwgMHg3NiwgMHhlNywgMHhiYiwgMHg1ZCwgMHhiYywKLQkweGE1LCAweGZlLCAweDc2LCAweDhkLCAweDViLCAweGU0LCAweDY1LCAweDc3LCAweGZlLCAweDBlLCAweDE3LCAweDc3LAotCTB4ZTksIDB4M2UsIDB4Y2MsIDB4MDMsIDB4ZmYsIDB4ZTAsIDB4YzQsIDB4OTAsIDB4YTEsIDB4ZTcsIDB4N2IsIDB4ZTksCi0JMHg0ZiwgMHhiZiwgMHg1ZSwgMHhiZSwgMHgxNSwgMHg1YSwgMHhiNiwgMHgxZCwgMHhjOSwgMHg4ZCwgMHgwZSwgMHg0ZSwKLQkweDBjLCAweDFhLCAweDJlLCAweGJlLCAweDEzLCAweGVlLCAweGJlLCAweGJiLCAweDVkLCAweDdjLCAweDgzLCAweDEzLAotCTB4NDksIDB4YzMsIDB4YzUsIDB4YjcsIDB4NTQsIDB4ZDYsIDB4N2IsIDB4MjUsIDB4NWYsIDB4MjYsIDB4ZWMsIDB4ZTAsCi0JMHg4NCwgMHg2NSwgMHhkYywgMHgyZCwgMHg1MywgMHhkZCwgMHg4MywgMHgxMywgMHg3YiwgMHgwZCwgMHg3NSwgMHhjZiwKLQkweDRlLCAweDk3LCAweDhmLCAweDg0LCAweDRmLCAweGMzLCAweDRlLCAweDRkLCAweDAzLCAweGNmLCAweGQ1LCAweGYzLAotCTB4MDMsIDB4NTksIDB4YWIsIDB4NzQsIDB4ZGYsIDB4NGUsIDB4N2QsIDB4M2UsIDB4Y2YsIDB4ZDQsIDB4NzMsIDB4ZjcsCi0JMHg5MSwgMHgyZSwgMHg5ZSwgMHg1ZCwgMHgxOCwgMHhkZCwgMHg3NCwgMHhlZSwgMHhjZiwgMHhkYywgMHg5NiwgMHhjZiwKLQkweDc2LCAweDY3LCAweGYyLCAweDNjLCAweDg5LCAweDg0LCAweGQzLCAweGUxLCAweGQxLCAweDk5LCAweGYyLCAweDExLAotCTB4YzksIDB4NTYsIDB4ZTIsIDB4MzIsIDB4M2QsIDB4YjIsIDB4NDMsIDB4YTYsIDB4Y2MsIDB4ZmUsIDB4YTksIDB4ODMsCi0JMHhjMiwgMHhkOCwgMHgxMywgMHgxOSwgMHgyZCwgMHg3OCwgMHgzYSwgMHhjYywgMHg4OSwgMHgyMSwgMHhkMywgMHhlMCwKLQkweGYxLCAweDYwLCAweDVkLCAweDIyLCAweDA2LCAweGUwLCAweGZiLCAweGViLCAweDYxLCAweDc5LCAweGJlLCAweDYxLAotCTB4NDgsIDB4YWIsIDB4ZjYsIDB4Y2YsIDB4ODQsIDB4YjksIDB4MDYsIDB4M2IsIDB4N2MsIDB4YjYsIDB4NDIsIDB4M2IsCi0JMHhhNiwgMHhjZCwgMHg0YSwgMHhhNiwgMHgwNiwgMHgzYiwgMHhiZCwgMHhhMCwgMHg3ZCwgMHhiNSwgMHg5ZCwgMHg3YSwKLQkweDJkLCAweDE2LCAweDA1LCAweGFlLCAweDk4LCAweGI2LCAweGNjLCAweDlhLCAweGI0LCAweDQ5LCAweDY2LCAweDUyLAotCTB4OGEsIDB4NWMsIDB4ZjcsIDB4N2MsIDB4MjcsIDB4YjYsIDB4MjgsIDB4ZGYsIDB4ODUsIDB4MGQsIDB4ODgsIDB4OTksCi0JMHg0ZCwgMHg3MSwgMHg5ZSwgMHhmMCwgMHg0ZCwgMHhiMCwgMHhhNiwgMHhlYiwgMHg3NywgMHgyMSwgMHhmOCwgMHg1ZCwKLQkweDIxLCAweDQ1LCAweDU4LCAweDI5LCAweGVhLCAweDU4LCAweGQxLCAweDgwLCAweDJkLCAweDM2LCAweGVlLCAweGVlLAotCTB4NzQsIDB4NjMsIDB4NWQsIDB4MDQsIDB4ZmUsIDB4ZDksIDB4MDEsIDB4MWYsIDB4YmYsIDB4MDcsIDB4ZmUsIDB4ZDcsCi0JMHg2NywgMHg2NCwgMHhjZiwgMHgzOCwgMHgwZSwgMHg2MiwgMHg0ZiwgMHg1NCwgMHgwOSwgMHhmZCwgMHgwZiwgMHhiZSwKLQkweGRlLCAweGUwLCAweDVhLCAweDA3LCAweGU2LCAweGM1LCAweDljLCAweGI2LCAweGJiLCAweGMxLCAweDlmLCAweGUzLAotCTB4NGMsIDB4ZDgsIDB4NzEsIDB4MjksIDB4ZDksIDB4YmIsIDB4YjAsIDB4YWYsIDB4NDUsIDB4YmEsIDB4MmQsIDB4ZGEsCi0JMHgzYiwgMHg3ZCwgMHg3YSwgMHgyNywgMHhjZSwgMHgzMywgMHhmOCwgMHhkZCwgMHg4NSwgMHhmMywgMHgzYSwgMHgzMSwKLQkweDE3LCAweDliLCAweGE2LCAweDFmLCAweGE3LCAweDE4LCAweGIzLCAweGRjLCAweGY4LCAweDI5LCAweDcyLCAweDE1LAotCTB4YjQsIDB4NzIsIDB4OGYsIDB4ODYsIDB4OGIsIDB4YjQsIDB4YTUsIDB4NTMsIDB4NzIsIDB4YTMsIDB4ZGMsIDB4MmIsCi0JMHg1NywgMHhhMiwgMHhlNCwgMHgxZiwgMHgzOCwgMHgyYiwgMHg4OCwgMHg4NywgMHg1MSwgMHgwMywgMHhmNCwgMHg5MywKLQkweDZlLCAweGM2LCAweGJmLCAweGRkLCAweGRlLCAweGI3LCAweDcxLCAweGFmLCAweDdiLCAweDg2LCAweDk4LCAweGExLAotCTB4NzQsIDB4OTcsIDB4ZTQsIDB4ZjQsIDB4OWMsIDB4MjgsIDB4MzUsIDB4YmEsIDB4ZDMsIDB4NWIsIDB4ZWYsIDB4MzIsCi0JMHgwZSwgMHg5YywgMHg1MSwgMHgzMiwgMHhmNCwgMHgyMCwgMHg2MiwgMHgxNiwgMHhjZSwgMHhiYSwgMHg2YywgMHgzOSwKLQkweGNlLCAweDY1LCAweGZiLCAweGM3LCAweGYwLCAweDc5LCAweDI1LCAweDJkLCAweGQ2LCAweDdhLCAweDk3LCAweGI0LAotCTB4NDMsIDB4OWUsIDB4MTUsIDB4YTMsIDB4NDksIDB4ODYsIDB4MzEsIDB4MzksIDB4NTEsIDB4ZTEsIDB4OWUsIDB4YTIsCi0JMHg4NCwgMHgyZCwgMHhjMiwgMHgxMCwgMHhmZSwgMHg0NywgMHg4MCwgMHgwYiwgMHg0OSwgMHgxYiwgMHg3YywgMHhmMSwKLQkweGEyLCAweDFkLCAweDI1LCAweGJkLCAweGJiLCAweDVjLCAweGY4LCAweDZlLCAweDljLCAweDQxLCAweGRhLCAweGU5LAotCTB4N2IsIDB4OGUsIDB4ZjYsIDB4YmQsIDB4NmMsIDB4NDgsIDB4NjUsIDB4YzYsIDB4ZTcsIDB4ZTEsIDB4NDksIDB4MjMsCi0JMHg5NCwgMHg3NywgMHhiNiwgMHgxYiwgMHhhMSwgMHg1ZiwgMHhhNiwgMHg4NywgMHg4YSwgMHhhNiwgMHhkMiwgMHhiYSwKLQkweDE2LCAweGM5LCAweDk1LCAweGVmLCAweDk1LCAweDE5LCAweDFiLCAweGU3LCAweDU5LCAweDYxLCAweGQwLCAweGNjLAotCTB4MzgsIDB4MzMsIDB4NTAsIDB4MGMsIDB4MjksIDB4NzgsIDB4NTgsIDB4MGYsIDB4NjUsIDB4ZTUsIDB4ZDMsIDB4ZmEsCi0JMHgxNiwgMHhjZSwgMHgyYiwgMHgxYSwgMHg2MSwgMHg4YiwgMHg2NywgMHhmYywgMHhiMiwgMHgyNywgMHgxZiwgMHhkYSwKLQkweDlkLCAweDJkLCAweGQ5LCAweDcyLCAweDA3LCAweGJmLCAweDQxLCAweDQ3LCAweGJiLCAweGE2LCAweDIzLCAweDk0LAotCTB4ZDYsIDB4YmEsIDB4MzMsIDB4NTQsIDB4ZGEsIDB4OGYsIDB4ZmYsIDB4MDQsIDB4ZGQsIDB4ODQsIDB4MDcsIDB4N2MsCi0JMHg3MCwgMHhhZiwgMHg4NSwgMHhiZCwgMHgxMSwgMHhkMCwgMHhkOCwgMHhkOSwgMHg0NCwgMHg3ZiwgMHgzYiwgMHhlMSwKLQkweDIxLCAweGFiLCAweDg4LCAweDc3LCAweDg2LCAweGU2LCAweGRiLCAweDcwLCAweGY5LCAweGY2LCAweDY1LCAweGY1LAotCTB4MmEsIDB4NjQsIDB4ZjUsIDB4YmUsIDB4MzMsIDB4YjQsIDB4OGYsIDB4MzgsIDB4NTIsIDB4YzAsIDB4MDEsIDB4YjksCi0JMHg5YiwgMHg4YywgMHg1NywgMHg4YywgMHg1MSwgMHhlNiwgMHgwNiwgMHgyZSwgMHhmOCwgMHg4MSwgMHgwYSwgMHhhNSwKLQkweDNiLCAweDI0LCAweDY3LCAweGVhLCAweDFjLCAweDAwLCAweGQ4LCAweDMxLCAweGQxLCAweDMxLCAweGRlLCAweDIyLAotCTB4OGYsIDB4ZGUsIDB4YjcsIDB4OTUsIDB4ZDAsIDB4NzYsIDB4OTMsIDB4YWYsIDB4MzIsIDB4MGYsIDB4ZmMsIDB4MzEsCi0JMHg2OCwgMHg1YiwgMHg0YiwgMHgyOCwgMHhjZCwgMHg1YSwgMHgwNywgMHg2NCwgMHgyZSwgMHg5MSwgMHg5NiwgMHhmNCwKLQkweDFiLCAweGIyLCAweDVjLCAweDU2LCAweDdiLCAweDVhLCAweDY1LCAweDk3LCAweDRjLCAweDQyLCAweDQ2LCAweGI1LAotCTB4MzEsIDB4ZTQsIDB4YWYsIDB4OTEsIDB4MGUsIDB4MDksIDB4ZGQsIDB4Y2YsIDB4M2MsIDB4MTAsIDB4MDMsIDB4YWQsCi0JMHg2YiwgMHgwOSwgMHg1MywgMHg2ZSwgMHgzOSwgMHg2YSwgMHgxMCwgMHhmYiwgMHg0NywgMHhhMCwgMHg4NywgMHg0MywKLQkweGQ0LCAweGE5LCAweGYyLCAweGUwLCAweDA4LCAweDEzLCAweGEyLCAweGNjLCAweDdiLCAweDVhLCAweDg1LCAweGI4LAotCTB4YjksIDB4MzYsIDB4MWMsIDB4MzMsIDB4ODUsIDB4ZjMsIDB4YzgsIDB4OTUsIDB4OTMsIDB4ZGMsIDB4NGIsIDB4ZmUsCi0JMHhkYywgMHgzZCwgMHgxZiwgMHhlNiwgMHhjZiwgMHg1ZiwgMHhhNywgMHhjYywgMHgyOCwgMHgzYiwgMHhkOCwgMHgxOCwKLQkweDc4LCAweGNjLCAweGRhLCAweGJmLCAweGUwLCAweGM5LCAweGU2LCAweDRlLCAweGI5LCAweDYyLCAweDhhLCAweDUxLAotCTB4YjMsIDB4ZWYsIDB4NjgsIDB4OTIsIDB4MWYsIDB4NzksIDB4ZWUsIDB4ZGUsIDB4YzIsIDB4MzMsIDB4NzEsIDB4NmMsCi0JMHhjZiwgMHhmNywgMHhlMSwgMHgyYSwgMHhjZiwgMHg3NCwgMHhjZiwgMHg5ZSwgMHhiMSwgMHhkNiwgMHgxMiwgMHg2MSwKLQkweGQ5LCAweDJjLCAweDVmLCAweGU4LCAweDUyLCAweDBhLCAweDY1LCAweGRhLCAweDQ2LCAweGFiLCAweGU0LCAweDUxLAotCTB4OGYsIDB4ZDgsIDB4ZmIsIDB4MTAsIDB4NTQsIDB4MWUsIDB4NTcsIDB4MzIsIDB4ZmEsIDB4MjAsIDB4NzEsIDB4ZmUsCi0JMHgyMywgMHg3OSwgMHgxYSwgMHg4YiwgMHgyYiwgMHg0MywgMHhmMiwgMHgzYSwgMHhmNywgMHhmYiwgMHhmYSwgMHhlMiwKLQkweDVjLCAweGIzLCAweDZkLCAweGJmLCAweGVhLCAweGQ5LCAweGY2LCAweGZiLCAweGNlLCAweGU4LCAweDNlLCAweDVmLAotCTB4ZWYsIDB4OTAsIDB4ZDcsIDB4ODcsIDB4ZjYsIDB4MDgsIDB4ZjQsIDB4ZmMsIDB4N2YsIDB4ZWQsIDB4YTEsIDB4YWQsCi0JMHg0NCwgMHhiNiwgMHhlYywgMHgyOSwgMHg2ZSwgMHhiMywgMHg2NywgMHhiNywgMHhjOCwgMHgyZiwgMHhkMSwgMHg4NywKLQkweGJhLCAweGJkLCAweDk4LCAweGUxLCAweGZiLCAweDk0LCAweDhmLCAweDA3LCAweGJhLCAweGQxLCAweGI2LCAweGNhLAotCTB4YjksIDB4ZWQsIDB4N2MsIDB4OTEsIDB4MzgsIDB4ODgsIDB4OGIsIDB4N2IsIDB4MDksIDB4ZTMsIDB4ZTcsIDB4NTQsCi0JMHhhOCwgMHg0MywgMHhiNiwgMHhjZCwgMHhhYiwgMHgxOCwgMHgxMywgMHg3OCwgMHg1NywgMHg4OCwgMHg0MywgMHhjZCwKLQkweGY5LCAweDk1LCAweDczLCAweDI2LCAweGJlLCAweGM3LCAweGYxLCAweGI0LCAweDI0LCAweDVmLCAweGE3LCAweDNmLAotCTB4NzEsIDB4M2YsIDB4ZjMsIDB4ZWQsIDB4NGQsIDB4MmYsIDB4N2UsIDB4NzYsIDB4NGMsIDB4ODUsIDB4ZDMsIDB4NTEsCi0JMHhjNCwgMHg0ZiwgMHg5OSwgMHgyYywgMHg5NSwgMHg4ZiwgMHhhMywgMHgyNiwgMHg5MiwgMHhlMiwgMHg1ZCwgMHg2OSwKLQkweGRhLCAweDQ3LCAweGM3LCAweDE4LCAweDYyLCAweGU0LCAweDY0LCAweGE5LCAweGNlLCAweGJhLCAweDA4LCAweDYxLAotCTB4MGMsIDB4ZmIsIDB4OTAsIDB4YTMsIDB4MjMsIDB4NmEsIDB4MmUsIDB4NTIsIDB4ZmMsIDB4NTgsIDB4OWEsIDB4NzEsCi0JMHgzOSwgMHgyZSwgMHhmMSwgMHhmYSwgMHgzYiwgMHhhOCwgMHgzYiwgMHg0YywgMHhjOSwgMHg2YSwgMHg1YiwgMHhmYiwKLQkweGIzLCAweDVlLCAweGQyLCAweDViLCAweDQyLCAweDBkLCAweDExLCAweDRlLCAweDRiLCAweDU4LCAweGE1LCAweDViLAotCTB4MjMsIDB4ZDMsIDB4YTksIDB4MGUsIDB4ZDQsIDB4NWEsIDB4MTMsIDB4YmQsIDB4NmEsIDB4ZjUsIDB4NjAsIDB4NmYsCi0JMHg2OCwgMHg3NSwgMHhjZiwgMHg1NCwgMHg0YiwgMHhiYSwgMHhkOCwgMHhhYiwgMHhlNiwgMHg0NCwgMHgxNiwgMHhjYiwKLQkweGEyLCAweDUwLCAweGQ3LCAweGM0LCAweDBlLCAweDBiLCAweGJlLCAweDU3LCAweDNmLCAweGZiLCAweDU5LCAweDk1LAotCTB4MGUsIDB4NDEsIDB4YjcsIDB4NzIsIDB4NmMsIDB4MjksIDB4MTUsIDB4NjYsIDB4MGQsIDB4MTksIDB4OWYsIDB4OTQsCi0JMHg2MywgMHhhOCwgMHgxYiwgMHg5ZiwgMHg5MSwgMHhlOSwgMHgzMiwgMHhlOCwgMHhkMiwgMHg3YywgMHhjNywgMHhjMCwKLQkweDZmLCAweDFmLCAweDcwLCAweDkzLCAweGY2LCAweDI4LCAweDYyLCAweGFjLCAweDRiLCAweDNiLCAweDY4LCAweGNlLAotCTB4ZTQsIDB4NTgsIDB4MjcsIDB4YTUsIDB4OTgsIDB4NTcsIDB4ZGUsIDB4ODEsIDB4ZmQsIDB4ZDAsIDB4NWYsIDB4ZmUsCi0JMHg1OSwgMHg5NiwgMHhhZCwgMHgxZCwgMHg5MiwgMHg3NywgMHhlMywgMHgwMywgMHhlZCwgMHgxNSwgMHg2YiwgMHgzNywKLQkweGJkLCAweGI1LCAweDZiLCAweDU4LCAweGEzLCAweGZkLCAweGVlLCAweDZjLCAweGQyLCAweGUxLCAweDk3LCAweDc1LAotCTB4YWQsIDB4NzMsIDB4ZDksIDB4ZTYsIDB4M2IsIDB4NjEsIDB4ZmYsIDB4NzYsIDB4ZDQsIDB4ODUsIDB4N2QsIDB4N2QsCi0JMHg3NCwgMHhkOSwgMHhmYSwgMHhkYywgMHgyZSwgMHg2OSwgMHgzNywgMHhhOSwgMHgzNywgMHg5YywgMHgxMywgMHg2NSwKLQkweDhjLCAweGM1LCAweGZhLCAweDE1LCAweDBmLCAweGQ3LCAweDViLCAweGMwLCAweGQ1LCAweDQxLCAweGJhLCAweDMxLAotCTB4YzIsIDB4NTgsIDB4MDcsIDB4N2QsIDB4YTgsIDB4NzksIDB4ZjIsIDB4MWIsIDB4YjEsIDB4ODYsIDB4YjAsIDB4ZGYsCi0JMHhmMSwgMHg3MCwgMHg3ZCwgMHhhYiwgMHgwOSwgMHgxNywgMHhkNywgMHhmOCwgMHhlNCwgMHg5OSwgMHgzOCwgMHhiYiwKLQkweDlkLCAweGJjLCAweDkxLCAweDFmLCAweGVhLCAweDgwLCAweGZhLCAweDQ4LCAweDFhLCAweDkzLCAweDg4LCAweGVkLAotCTB4OTMsIDB4MGQsIDB4NWQsIDB4ZGIsIDB4MTksIDB4YjksIDB4MGEsIDB4NmEsIDB4YWUsIDB4YzYsIDB4OGIsIDB4YTAsCi0JMHgxMSwgMHhiNSwgMHg1OCwgMHg2MywgMHhkMCwgMHhhYiwgMHhiNywgMHg2OSwgMHg0NywgMHg2YiwgMHhkYSwgMHgxZSwKLQkweDE5LCAweDc3LCAweDRhLCAweGRhLCAweGFlLCAweDJlLCAweGI5LCAweDc2LCAweDY1LCAweDUxLCAweDM3LCAweDk3LAotCTB4NjQsIDB4NmYsIDB4YmQsIDB4YmEsIDB4Y2IsIDB4ZmQsIDB4YmYsIDB4ZGIsIDB4YTYsIDB4ODQsIDB4YjQsIDB4M2UsCi0JMHg5OSwgMHhkZiwgMHg2OCwgMHg2MywgMHg3NywgMHgyMiwgMHhhZSwgMHgzYiwgMHhlZiwgMHgzMiwgMHhjZiwgMHg0YywKLQkweDMyLCAweDA3LCAweDRkLCAweDMyLCAweDc3LCAweDE4LCAweDVlLCAweDNjLCAweDhjLCAweDM3LCAweGUxLCAweDg4LAotCTB4MDMsIDB4YzcsIDB4OGEsIDB4NjcsIDB4YmYsIDB4NzMsIDB4MWUsIDB4MmUsIDB4YmYsIDB4ZmUsIDB4ZjQsIDB4NjMsCi0JMHhlYSwgMHg5ZiwgMHhkZiwgMHhiNSwgMHg3OSwgMHg1ZCwgMHg5OSwgMHhlZSwgMHg3NywgMHhhYiwgMHg4ZSwgMHhjNywKLQkweGIwLCAweDc1LCAweGQwLCAweDFmLCAweDlmLCAweDUyLCAweGIwLCAweGFmLCAweDVjLCAweGRkLCAweGQ1LCAweDA3LAotCTB4N2MsIDB4MWYsIDB4YjYsIDB4YzcsIDB4NTcsIDB4NWYsIDB4YjcsIDB4NmUsIDB4ZmQsIDB4ZWQsIDB4Y2EsIDB4ODAsCi0JMHgzYSwgMHhjZCwgMHg5MCwgMHhlZiwgMHg0YywgMHg5OCwgMHhiNCwgMHgzNCwgMHgyNiwgMHhiMCwgMHg1ZiwgMHg4ZSwKLQkweDMwLCAweDM3LCAweGU2LCAweGMxLCAweGM3LCAweDYxLCAweDczLCAweGQ4LCAweDljLCAweDI2LCAweGVlLCAweGE4LAotCTB4MDAsIDB4MjcsIDB4NmEsIDB4YzksIDB4NzQsIDB4OWIsIDB4YTcsIDB4ZTcsIDB4NmYsIDB4ZjMsIDB4N2MsIDB4ZTAsCi0JMHhkZSwgMHhjOSwgMHg2ZiwgMHgzYywgMHhiZiwgMHhlZCwgMHhkMSwgMHg3MywgMHhhMywgMHhjYiwgMHhhNSwgMHhjNywKLQkweDVmLCAweDFmLCAweDM0LCAweDM3LCAweDdmLCAweGFmLCAweGY0LCAweDdhLCAweGYyLCAweGM0LCAweGZiLCAweDMzLAotCTB4MWUsIDB4NWQsIDB4ZDQsIDB4NGQsIDB4MzMsIDB4NGQsIDB4ZDQsIDB4Y2IsIDB4YmIsIDB4YzAsIDB4YTMsIDB4NmIsCi0JMHg4ZCwgMHhhMiwgMHg0YSwgMHhhMywgMHg3NiwgMHg0OSwgMHgzMSwgMHg2NywgMHgyNSwgMHhjNiwgMHgzMiwgMHg2MiwKLQkweDQxLCAweDI3LCAweDA5LCAweDdiLCAweDBhLCAweGJiLCAweDZlLCAweDk2LCAweGE5LCAweGU3LCAweDViLCAweDg4LAotCTB4ZDUsIDB4ZDQsIDB4ZmIsIDB4N2IsIDB4MzIsIDB4NTMsIDB4ZWUsIDB4YjcsIDB4NWIsIDB4MGQsIDB4ZmEsIDB4NmIsCi0JMHgyMiwgMHhiOSwgMHgyMiwgMHhjMywgMHhmNiwgMHg4YSwgMHhhZSwgMHhhMSwgMHgxMiwgMHhmMSwgMHgxMywgMHg0MiwKLQkweGQ5LCAweGRlLCAweDkyLCAweDAxLCAweDVkLCAweGRiLCAweGJjLCAweDI3LCAweDE2LCAweGU0LCAweDMyLCAweDU5LAotCTB4ODEsIDB4OGYsIDB4ZWQsIDB4ZmIsIDB4NTcsIDB4NDcsIDB4ZDcsIDB4YTQsIDB4MDgsIDB4NmYsIDB4ZDcsIDB4YjcsCi0JMHhjMSwgMHhmNSwgMHhiYSwgMHhjNiwgMHg0MywgMHg3YywgMHhjZCwgMHhiOCwgMHgwYywgMHg2OSwgMHhkYiwgMHhlNywKLQkweGUzLCAweGIzLCAweDY0LCAweGI2LCAweGUxLCAweGUzLCAweDBjLCAweDIzLCAweDJlLCAweDIzLCAweDA2LCAweGVjLAotCTB4ZmIsIDB4YmMsIDB4NjcsIDB4MmYsIDB4N2MsIDB4ZmYsIDB4YmUsIDB4YzMsIDB4NWEsIDB4NDgsIDB4YTUsIDB4YmYsCi0JMHhlYSwgMHhjZCwgMHg3ZCwgMHg4ZiwgMHgzMiwgMHhjMCwgMHhiNywgMHgyZiwgMHhmNywgMHgxNywgMHhiZCwgMHg3OCwKLQkweDUzLCAweDM0LCAweDMyLCAweDBkLCAweGNhLCAweDgwLCAweGI2LCAweDAyLCAweGZkLCAweDZiLCAweGZiLCAweDg0LAotCTB4Y2YsIDB4NTQsIDB4M2UsIDB4ODksIDB4OTgsIDB4ZDUsIDB4ZWQsIDB4ZDYsIDB4MGYsIDB4ZTgsIDB4YWYsIDB4MzIsCi0JMHgwZCwgMHhjZSwgMHhhZCwgMHhiNSwgMHg2NSwgMHhlZCwgMHgxNiwgMHhjZiwgMHg5NywgMHgwZSwgMHg2MiwgMHg2ZSwKLQkweDEyLCAweDdmLCAweDk0LCAweDFkLCAweDYxLCAweDBlLCAweGUxLCAweDNkLCAweGUzLCAweGMxLCAweGM5LCAweDU4LAotCTB4MTYsIDB4YjksIDB4MmIsIDB4NzMsIDB4NjgsIDB4MWMsIDB4ZGYsIDB4ODYsIDB4ZDcsIDB4NjcsIDB4NjksIDB4YjksCi0JMHg1NywgMHg1MSwgMHhhYiwgMHg0MCwgMHg5ZSwgMHgwMywgMHhlMCwgMHgyNywgMHgyZSwgMHhlMywgMHgwZCwgMHhlOCwKLQkweDdjLCAweDIzLCAweDllLCAweDZkLCAweGMwLCAweDE0LCAweDZmLCAweGMzLCAweGI4LCAweGIxLCAweDZmLCAweGJjLAotCTB4ZjEsIDB4YTYsIDB4YzMsIDB4NzgsIDB4ZjAsIDB4NTcsIDB4ZGEsIDB4NWYsIDB4ZTIsIDB4YTAsIDB4ZGQsIDB4ZWYsCi0JMHhkNSwgMHgzMiwgMHhjNiwgMHg2MywgMHg5NSwgMHgwOSwgMHhlMywgMHhmMSwgMHgwYSwgMHhmNywgMHhhOCwgMHhhZiwKLQkweGY1LCAweDg4LCAweDE1LCAweGNmLCAweDJhLCAweGQ0LCAweGE5LCAweGZiLCAweGJhLCAweDcwLCAweGU2LCAweDA5LAotCTB4ZDgsIDB4NDYsIDB4ZDEsIDB4OTgsIDB4MWMsIDB4ZGEsIDB4MjUsIDB4ZjksIDB4NjQsIDB4MGYsIDB4NjgsIDB4N2UsCi0JMHgwOCwgMHhjZiwgMHg1NiwgMHhjYywgMHhmZiwgMHgzYywgMHhlNiwgMHg2MSwgMHg0NywgMHg0OSwgMHhmYSwgMHhjNywKLQkweDBlLCAweGRkLCAweDViLCAweDRlLCAweDk5LCAweGE0LCAweDcxLCAweGMwLCAweGIzLCAweGFkLCAweDM3LCAweDRkLAotCTB4ZDcsIDB4OTYsIDB4OWUsIDB4YzYsIDB4ZjcsIDB4NGUsIDB4Y2MsIDB4N2YsIDB4MDEsIDB4NGYsIDB4ZTQsIDB4YjIsCi0JMHg3ZCwgMHhmZSwgMHgzYywgMHg3ZCwgMHg3MCwgMHgwYywgMHhmMywgMHgwZiwgMHgwMCwgMHhjNywgMHgxZiwgMHhlMCwKLQkweGZkLCAweDVlLCAweGJjLCAweGZmLCAweGRlLCAweDk2LCAweGJkLCAweGJmLCAweGNiLCAweGIzLCAweDMxLCAweDlmLAotCTB4ZGQsIDB4MzIsIDB4ZWYsIDB4YzcsIDB4NmYsIDB4OWUsIDB4MjcsIDB4ZDIsIDB4YmQsIDB4MGEsIDB4YzYsIDB4NTcsCi0JMHgyMywgMHhiMiwgMHg3YiwgMHhhNSwgMHg1ZCwgMHg1NCwgMHhjZCwgMHg4ZCwgMHhlMSwgMHhhYSwgMHg2NiwgMHg0YSwKLQkweGNmLCAweDBhLCAweGUzLCAweGY3LCAweDBmLCAweGIwLCAweGM3LCAweDEyLCAweGI1LCAweDBhLCAweGE1LCAweDUxLAotCTB4YjcsIDB4ZGEsIDB4NDcsIDB4OWYsIDB4MzksIDB4YmEsIDB4NzcsIDB4ODEsIDB4Y2YsIDB4ZTIsIDB4ZDEsIDB4ZDEsCi0JMHgzYSwgMHg2MSwgMHhmOCwgMHg3ZSwgMHhlYywgMHhlOCwgMHhkZSwgMHhmYSwgMHgzZiwgMHgwMCwgMHgxNiwgMHg3MiwKLQkweGE5LCAweGY4LCAweGY4LCAweDA5LCAweDdmLCAweDdlLCAweGNiLCAweDk5LCAweDVhLCAweGI2LCAweDM4LCAweDkzLAotCTB4N2UsIDB4ZmYsIDB4Y2MsIDB4ZDEsIDB4NmMsIDB4OTUsIDB4NzUsIDB4NDIsIDB4MjIsIDB4MjYsIDB4YmEsIDB4MTYsCi0JMHgyZiwgMHgxZSwgMHgyZCwgMHgyMCwgMHgzZiwgMHg4NiwgMHgzNCwgMHgyZCwgMHhmZSwgMHgzYSwgMHhkNywgMHhhOCwKLQkweDg3LCAweGVkLCAweDY4LCAweDIzLCAweDVkLCAweGNkLCAweDc4LCAweDk4LCAweDY3LCAweDg4LCAweGU3LCAweDE4LAotCTB4ZjAsIDB4MjQsIDB4ODEsIDB4ODcsIDB4ZjksIDB4YzYsIDB4YTUsIDB4MzcsIDB4YmUsIDB4YjAsIDB4MWQsIDB4NmQsCi0JMHhjNCwgMHhjNSwgMHhiMywgMHg3YywgMHg3YywgMHgzZCwgMHhhMiwgMHg1NiwgMHg3ZSwgMHg0OCwgMHg3YSwgMHg0ZCwKLQkweGQ2LCAweGI2LCAweDZlLCAweGFjLCAweDY5LCAweDkxLCAweGZjLCAweDY5LCAweGU2LCAweGVjLCAweDdkLCAweGRlLAotCTB4MzcsIDB4Y2EsIDB4MTgsIDB4ZjQsIDB4ZGMsIDB4NzEsIDB4YzUsIDB4NzksIDB4M2UsIDB4YjEsIDB4OTYsIDB4NjIsCi0JMHhiOSwgMHg4MiwgMHhlZiwgMHg0NSwgMHgxZiwgMHg1NiwgMHg3OSwgMHhiMCwgMHg5ZCwgMHg0ZCwgMHg3YywgMHhiNywKLQkweDc4LCAweGIyLCAweGU2LCAweDk5LCAweDdlLCAweGVmLCAweGQ5LCAweDRjLCAweDBiLCAweDQwLCAweGExLCAweDg3LAotCTB4ZWUsIDB4MGQsIDB4M2QsIDB4ZjgsIDB4N2MsIDB4NjIsIDB4NjEsIDB4OTUsIDB4YjQsIDB4MjUsIDB4YzEsIDB4YWIsCi0JMHg0ZiwgMHhkYiwgMHg0NywgMHhkNSwgMHgxZiwgMHhmNywgMHgyNiwgMHhmMSwgMHhlNywgMHg5ZiwgMHhlNywgMHhjYiwKLQkweDgwLCAweDc0LCAweGYxLCAweDA5LCAweDViLCAweGZlLCAweDUwLCAweGVmLCAweDljLCAweDg0LCAweGRmLCAweGYxLAotCTB4MWUsIDB4YzQsIDB4NzEsIDB4OTYsIDB4NmQsIDB4Y2EsIDB4YmUsIDB4MGQsIDB4N2EsIDB4MjcsIDB4MmYsIDB4MDYsCi0JMHg3YSwgMHgwOSwgMHhjNSwgMHg5YSwgMHgyZSwgMHhjZSwgMHg5ZSwgMHhmNSwgMHg0OSwgMHhiOSwgMHgwYSwgMHg1YywKLQkweDE5LCAweGY0LCAweDk1LCAweDZlLCAweDZmLCAweDM0LCAweDg1LCAweGY4LCAweGI4LCAweDA2LCAweGZiLCAweGJjLAotCTB4NmMsIDB4ZjEsIDB4M2UsIDB4MjYsIDB4Y2MsIDB4N2MsIDB4MjcsIDB4YTUsIDB4ZmEsIDB4YmYsIDB4MDAsIDB4ODYsCi0JMHhmNSwgMHhkNSwgMHhlZCwgMHhiYiwgMHg5NiwgMHgwNSwgMHhjMCwgMHgyYywgMHg2MiwgMHhlZCwgMHg4NCwgMHgxYiwKLQkweDk3LCAweDE5LCAweGRiLCAweDFkLCAweDg1LCAweGRhLCAweGEzLCAweDYwLCAweGZkLCAweGI3LCAweGMzLCAweDNhLAotCTB4ZWIsIDB4MzYsIDB4ZWMsIDB4NzYsIDB4NzcsIDB4MjEsIDB4YzgsIDB4MzksIDB4ZjMsIDB4ODksIDB4ZDksIDB4MDUsCi0JMHhjNCwgMHhmMCwgMHhhYSwgMHhhNSwgMHg3NiwgMHgyYiwgMHg2ZCwgMHg5MSwgMHg4OSwgMHgyYSwgMHg2MiwgMHgxMiwKLQkweGJhLCAweGRlLCAweDQ0LCAweDdjLCAweDQxLCAweGZlLCAweDUzLCAweGViLCAweGExLCAweGM1LCAweDFhLCAweDM2LAotCTB4N2IsIDB4ZDQsIDB4ZTcsIDB4NjgsIDB4NTcsIDB4OWEsIDB4ZjIsIDB4ZDAsIDB4MjksIDB4ZTQsIDB4ZTUsIDB4OTEsCi0JMHhjNywgMHg5MCwgMHg3MywgMHgyMCwgMHhhZiwgMHg1MywgMHg0NSwgMHg3NCwgMHhmMiwgMHhiNCwgMHg5MSwgMHgzNywKLQkweDdlLCAweGFiLCAweDYwLCAweGI5LCAweDdkLCAweDgwLCAweGNlLCAweDY3LCAweGUyLCAweGYyLCAweDE4LCAweDNhLAotCTB4ZDUsIDB4YTEsIDB4ZTMsIDB4NGMsIDB4NWUsIDB4YzcsIDB4OWIsIDB4N2UsIDB4NzMsIDB4NTIsIDB4YjUsIDB4YTMsCi0JMHhjNiwgMHg0MCwgMHgwMSwgMHg4YSwgMHgwYSwgMHhjNywgMHgxYywgMHgxNCwgMHhkOSwgMHgzYiwgMHg4NywgMHhiOCwKLQkweDgyLCAweDM4LCAweGJjLCAweDc3LCAweDE1LCAweGQxLCAweGVkLCAweDE0LCAweGUxLCAweDk1LCAweDg0LCAweDRmLAotCTB4ODUsIDB4YTQsIDB4ZTUsIDB4MTQsIDB4ZWYsIDB4NDMsIDB4NjQsIDB4MGYsIDB4ZmEsIDB4MzEsIDB4ZTIsIDB4ZGMsCi0JMHgxYiwgMHhjNiwgMHg3MywgMHgxYywgMHg3ZiwgMHhmYiwgMHg1MSwgMHg1YiwgMHg5OSwgMHhhOCwgMHg5MSwgMHhiNywKLQkweDgxLCAweDA3LCAweDJjLCAweGY3LCAweDZjLCAweDA3LCAweDZmLCAweDc2LCAweDRiLCAweDdiLCAweDA0LCAweDdiLAotCTB4MDgsIDB4MWYsIDB4MDYsIDB4MWQsIDB4N2IsIDB4NDAsIDB4OGYsIDB4N2IsIDB4M2UsIDB4NzEsIDB4ODQsIDB4NGYsCi0JMHg4OSwgMHhmNCwgMHhjZiwgMHg0OSwgMHg4ZiwgMHhkMiwgMHg3YiwgMHhjMiwgMHg1MiwgMHg0OCwgMHg3MSwgMHhhZCwKLQkweDAzLCAweGYwLCAweGRjLCAweDg3LCAweDM1LCAweGJkLCAweGNmLCAweGJkLCAweDU3LCAweGNhLCAweGRmLCAweGE2LAotCTB4MWIsIDB4NzMsIDB4MDYsIDB4ZGUsIDB4NTEsIDB4NGYsIDB4YTUsIDB4NGMsIDB4ZTksIDB4YWYsIDB4YjksIDB4YjAsCi0JMHg3YiwgMHg1NywgMHhiZiwgMHhkNCwgMHhjZCwgMHhiYiwgMHgyOSwgMHg2NSwgMHhiOSwgMHhiNCwgMHgyOSwgMHhkNCwKLQkweGM0LCAweDc5LCAweDQ4LCAweDM1LCAweDNjLCAweGM4LCAweGZiLCAweDE5LCAweGMyLCAweGIwLCAweGFmLCAweDM1LAotCTB4MzUsIDB4OGMsIDB4MzksIDB4NDgsIDB4ZjksIDB4YjksIDB4NzMsIDB4NGEsIDB4ZmQsIDB4NmYsIDB4ZjcsIDB4MmUsCi0JMHhjZCwgMHgzNSwgMHg4NSwgMHhmNiwgMHgxNSwgMHhlYywgMHhmZiwgMHg0MywgMHhlZCwgMHgyYiwgMHhhMiwgMHhlMiwKLQkweDllLCAweGFmLCAweGUwLCAweDdiLCAweDkxLCAweGRmLCAweDdlLCAweDJlLCAweGZlLCAweGVkLCAweGJiLCAweGRjLAotCTB4NzgsIDB4ZWYsIDB4YzgsIDB4YjQsIDB4Y2QsIDB4M2IsIDB4MGMsIDB4NDcsIDB4MmUsIDB4ZGIsIDB4NDUsIDB4ZTMsCi0JMHg5MSwgMHg0ZCwgMHg3NSwgMHg2NiwgMHg1MiwgMHhlNywgMHhlNywgMHgwMiwgMHg2NCwgMHhiZiwgMHg1ZSwgMHhkNywKLQkweDNkLCAweDliLCAweDVjLCAweGE5LCAweDQ3LCAweGU0LCAweGVhLCAweDUyLCAweGJiLCAweGFjLCAweDJmLCAweGI4LAotCTB4MzYsIDB4YmYsIDB4YmUsIDB4NDAsIDB4M2IsIDB4MzcsIDB4ZTUsIDB4ZWQsIDB4MjUsIDB4MGIsIDB4NmIsIDB4NDksCi0JMHhmYywgMHhmNSwgMHhjOCwgMHhmNSwgMHhhNSwgMHhjZCwgMHg3NSwgMHhlNywgMHg4NSwgMHhjNiwgMHhjMywgMHhhMCwKLQkweGE1LCAweDQ3LCAweDQyLCAweDk2LCAweGEzLCAweGZiLCAweGFmLCAweDFjLCAweDcyLCAweDVmLCAweDUxLCAweGM2LAotCTB4MjUsIDB4NWYsIDB4ZTksIDB4NDcsIDB4MGYsIDB4ODgsIDB4ZTQsIDB4MWMsIDB4NjYsIDB4MGUsIDB4ODIsIDB4ZmUsCi0JMHgyYiwgMHg5ZiwgMHg0MCwgMHg2ZCwgMHg5MiwgMHg4MCwgMHhmMywgMHhmNCwgMHhlYiwgMHg3YiwgMHhjNSwgMHg0ZiwKLQkweDg1LCAweDdiLCAweGE0LCAweGQ1LCAweGZhLCAweGEzLCAweDZlLCAweDM3LCAweDU3LCAweDk5LCAweDZlLCAweDlmLAotCTB4NmEsIDB4ZjksIDB4ZjksIDB4ZmEsIDB4NzUsIDB4ZTAsIDB4MWUsIDB4ODEsIDB4OWQsIDB4ZDIsIDB4MzYsIDB4NmQsCi0JMHhkOCwgMHhhYywgMHgyOSwgMHhjYiwgMHg0MywgMHg4OSwgMHg2YSwgMHg1MSwgMHgxOCwgMHgxZiwgMHg1MiwgMHgzOCwKLQkweGQzLCAweGMwLCAweGJlLCAweDI0LCAweGU0LCAweGIxLCAweDQzLCAweGQ3LCAweDQyLCAweDE5LCAweDA1LCAweGRkLAotCTB4Y2UsIDB4Y2QsIDB4NDgsIDB4YmUsIDB4ZjEsIDB4OWIsIDB4OTgsIDB4Y2YsIDB4YzgsIDB4NTQsIDB4NjMsIDB4MGMsCi0JMHg2NywgMHg5ZCwgMHhhNCwgMHhkZCwgMHhmNiwgMHg0OCwgMHgzYiwgMHhjZiwgMHg0OSwgMHg4MSwgMHhjNiwgMHg4NywKLQkweGE0LCAweDcwLCAweDdhLCAweDQ2LCAweDBlLCAweDU3LCAweDQ4LCAweDI3LCAweGVmLCAweDE5LCAweDEzLCAweGM5LAotCTB4OWMsIDB4MGMsIDB4YzcsIDB4OTcsIDB4NTAsIDB4M2IsIDB4YjksIDB4ZmUsIDB4OTgsIDB4OTYsIDB4YzIsIDB4MTksCi0JMHhlMCwgMHhhOCwgMHhmMCwgMHgxZSwgMHhhMCwgMHgxZiwgMHg3NiwgMHgzMywgMHhhYywgMHhmYiwgMHg5YSwgMHgyOSwKLQkweDFkLCAweDc3LCAweDM4LCAweGZmLCAweDQzLCAweGU4LCAweGE5LCAweGJmLCAweGI4LCAweDFmLCAweDcwLCAweDc5LAotCTB4ZjQsIDB4NDAsIDB4OTMsIDB4YTgsIDB4OTcsIDB4MTcsIDB4MmIsIDB4ZTgsIDB4ZjcsIDB4ZWMsIDB4MTAsIDB4NmIsCi0JMHgyZiwgMHhhNSwgMHhlZSwgMHhlZiwgMHg5MywgMHg1YSwgMHg2NSwgMHhkOCwgMHg1NCwgMHg4YSwgMHgzNSwgMHgxNSwKLQkweDc1LCAweGMxLCAweDM1LCAweGZhLCAweDc3LCAweDRjLCAweDg1LCAweGFkLCAweDNlLCAweDU5LCAweGFhLCAweDE0LAotCTB4ZDEsIDB4MzcsIDB4MmIsIDB4ZWYsIDB4NWUsIDB4MDMsIDB4MTYsIDB4NjAsIDB4YjksIDB4NzEsIDB4MmYsIDB4YTMsCi0JMHhjOCwgMHgzNywgMHhlYSwgMHhjZiwgMHhjNiwgMHgyNywgMHg0MSwgMHg2MywgMHgyNiwgMHg2ZSwgMHhjYSwgMHg3MSwKLQkweGQwLCAweDg3LCAweGY3LCAweDQ1LCAweGQ4LCAweGY4LCAweDFjLCAweDZiLCAweGI4LCAweDBjLCAweGQ2LCAweGQyLAotCTB4NzIsIDB4ZTQsIDB4ZWMsIDB4MjQsIDB4NjgsIDB4ZTgsIDB4OTIsIDB4ZmUsIDB4M2YsIDB4YTEsIDB4OGYsIDB4M2QsCi0JMHg4MSwgMHgzOSwgMHg3ZSwgMHgyNywgMHg2MCwgMHhhZiwgMHg1ZiwgMHhjNCwgMHgzYiwgMHg2MSwgMHg2MywgMHg3OCwKLQkweDUyLCAweDBlLCAweDdkLCAweDc4LCAweDlhLCAweGEwLCAweDI1LCAweGUyLCAweGY2LCAweDI2LCAweDg3LCAweGUyLAotCTB4NTIsIDB4M2IsIDB4ZmQsIDB4YTAsIDB4NGMsIDB4MmQsIDB4M2UsIDB4MDgsIDB4ZmMsIDB4M2YsIDB4NDIsIDB4NWYsCi0JMHg4MCwgMHhmYywgMHhiNiwgMHhjOCwgMHhiMywgMHg1OCwgMHhmZiwgMHhmMSwgMHg5YywgMHg5ZCwgMHgzZCwgMHhkYSwKLQkweDM3LCAweGU2LCAweDM4LCAweGNmLCAweGU3LCAweDQxLCAweGVjLCAweDQ3LCAweDhmLCAweDUxLCAweGM5LCAweDQ4LAotCTB4YTEsIDB4YzIsIDB4YjMsIDB4YTAsIDB4M2IsIDB4ZDQsIDB4NTMsIDB4ZjksIDB4ZDMsIDB4OTMsIDB4OWUsIDB4OGUsCi0JMHg3YiwgMHgyNCwgMHgxNywgMHgyZCwgMHhiMiwgMHhiZiwgMHg0MCwgMHg5ZSwgMHg1OCwgMHgxOCwgMHhjZCwgMHg5NiwKLQkweDEzLCAweDY2LCAweDU2LCAweDExLCAweDU3LCAweDUyLCAweDk4LCAweDFiLCAweGRjLCAweGI5LCAweDg4LCAweDU4LAotCTB4NzMsIDB4ZTgsIDB4NmQsIDB4ZDMsIDB4NWMsIDB4M2IsIDB4ZWUsIDB4ZGQsIDB4MWQsIDB4MTAsIDB4ZDcsIDB4OWIsCi0JMHgzMiwgMHgwZSwgMHgxYiwgMHhlYiwgMHg5ZiwgMHgxYiwgMHg0MSwgMHgyZCwgMHhmYywgMHgxNiwgMHg2YSwgMHhjOSwKLQkweDg0LCAweDI3LCAweDgzLCAweDMxLCAweGNmLCAweDM2LCAweGRhLCAweDliLCAweDZjLCAweDAyLCAweDdhLCAweGFlLAotCTB4NDAsIDB4ZjcsIDB4MTUsIDB4ZDgsIDB4MDEsIDB4NjIsIDB4ZjUsIDB4MmIsIDB4MWIsIDB4ZjYsIDB4MzEsIDB4ZDYsCi0JMHg1NCwgMHg2MywgMHg3NiwgMHhjYSwgMHhkZiwgMHg1NCwgMHgxMywgMHhjOSwgMHgzNSwgMHhkOCwgMHhjZiwgMHg3NSwKLQkweGY0LCAweDAyLCAweDZiLCAweGU4LCAweDU1LCAweGQ3LCAweGQxLCAweGQ3LCAweDJkLCAweDk2LCAweDBmLCAweDgxLAotCTB4N2UsIDB4ZDYsIDB4OTQsIDB4ZmMsIDB4OGUsIDB4ZTksIDB4NWEsIDB4YTcsIDB4Y2QsIDB4N2EsIDB4ZTEsIDB4MmUsCi0JMHg3ZCwgMHhiNywgMHgyYiwgMHg0ZiwgMHhmNCwgMHhiMCwgMHhkNywgMHg2NCwgMHg1ZiwgMHhjZSwgMHg3YiwgMHhlOSwKLQkweGFiLCAweGQwLCAweGUzLCAweDlhLCAweGM5LCAweDc1LCAweDdmLCAweDFmLCAweDdiLCAweDAxLCAweGRmLCAweDdlLAotCTB4NDgsIDB4MGIsIDB4ZWQsIDB4ODcsIDB4N2IsIDB4MDgsIDB4ZDMsIDB4YTMsIDB4ZmQsIDB4MjQsIDB4YWYsIDB4ZjEsCi0JMHhkMSwgMHg2NiwgMHhlYiwgMHhkZCwgMHhhZSwgMHg5ZiwgMHhlOSwgMHgzYSwgMHhjYiwgMHhiYywgMHgyMiwgMHhiZSwKLQkweGZkLCAweGJlLCAweGU3LCAweGIwLCAweGFmLCAweGNiLCAweDBlLCAweDIxLCAweDc2LCAweDM3LCAweDFjLCAweDc5LAotCTB4YzEsIDB4ZGUsIDB4ZWMsIDB4NzcsIDB4MDcsIDB4MmEsIDB4YmUsIDB4OWMsIDB4MjgsIDB4YzcsIDB4NDMsIDB4NzIsCi0JMHhhMiwgMHg5MSwgMHg4MCwgMHg0ZiwgMHg1MCwgMHg4NiwgMHg1NiwgMHg5MywgMHgwYywgMHg0NSwgMHhiZSwgMHg1ZSwKLQkweDExLCAweDc5LCAweGI5LCAweGMyLCAweDM1LCAweDJkLCAweGMzLCAweDU4LCAweDM2LCAweGQ0LCAweGNlLCAweGJiLAotCTB4NzUsIDB4ZDgsIDB4ZTUsIDB4ZGYsIDB4Y2IsIDB4ZTEsIDB4NzksIDB4OTEsIDB4YjMsIDB4NTgsIDB4NWYsIDB4YWUsCi0JMHhkMCwgMHg1NywgMHg0NywgMHg1MCwgMHhiZiwgMHhlZSwgMHg5NCwgMHhkYSwgMHgwMiwgMHg3YSwgMHhiMiwgMHg4YSwKLQkweDRjLCAweDY1LCAweDFmLCAweDYwLCAweGJlLCAweDg5LCAweGM4LCAweGJhLCAweGJlLCAweDkzLCAweDE1LCAweDE5LAotCTB4M2MsIDB4MTcsIDB4OTYsIDB4ZjAsIDB4MzksIDB4MzQsIDB4N2YsIDB4OTAsIDB4ZmQsIDB4ZjksIDB4MjEsIDB4ZmYsCi0JMHg4ZSwgMHhkNiwgMHhmNSwgMHhmOSwgMHg1MiwgMHgxOSwgMHg3YiwgMHgyYiwgMHhmZCwgMHgzYSwgMHg0ZSwgMHg5NiwKLQkweGVhLCAweDA1LCAweGM5LCAweDU3LCAweDc5LCAweDE2LCAweDllLCAweDBiLCAweDcxLCAweGFjLCAweGE1LCAweDY0LAotCTB4ZmEsIDB4ZjQsIDB4ODgsIDB4M2MsIDB4OGIsIDB4MzMsIDB4ZDAsIDB4ZmYsIDB4ZTEsIDB4OGMsIDB4NzEsIDB4MjksCi0JMHg5ZSwgMHhjNSwgMHg3YywgMHhmZCwgMHg5YSwgMHgyYywgMHgyYywgMHgxNSwgMHhhNCwgMHg1NiwgMHhiZCwgMHhkMCwKLQkweDc0LCAweGY3LCAweDhlLCAweGVmLCAweDg1LCAweGU2LCAweDVlLCAweGY2LCAweDEwLCAweGZiLCAweDE5LCAweGY0LAotCTB4YWEsIDB4MTYsIDB4YmUsIDB4MjEsIDB4YjMsIDB4ZmEsIDB4ZjQsIDB4ZDQsIDB4ZTYsIDB4M2IsIDB4ZTMsIDB4ZTYsCi0JMHgxZSwgMHg3NiwgMHg0MiwgMHg2NiwgMHgyYiwgMHgyOSwgMHgyOSwgMHg5ZCwgMHgxZSwgMHhkMSwgMHg3NywgMHgwZCwKLQkweDZkLCAweGU5LCAweGVhLCAweGQzLCAweDM3LCAweDkwLCAweDJiLCAweDI2LCAweGY0LCAweDlkLCAweGYxLCAweDJkLAotCTB4NzksIDB4ZDQsIDB4OWUsIDB4OTUsIDB4MjcsIDB4YWQsIDB4ODMsIDB4NzIsIDB4MDIsIDB4ZjUsIDB4ZjUsIDB4YTcsCi0JMHhkMSwgMHhlYiwgMHhjNywgMHhiYiwgMHhhOSwgMHg0NywgMHhkMCwgMHg2YiwgMHhiMSwgMHgwNywgMHg3NSwgMHg2NCwKLQkweGRjLCAweGZlLCAweGI4LCAweGY5LCAweDNjLCAweDI0LCAweDdiLCAweGI1LCAweGNlLCAweDNjLCAweGY5LCAweDVmLAotCTB4NGUsIDB4MDYsIDB4NzksIDB4ZWYsIDB4MDYsIDB4N2EsIDB4YzcsIDB4OGMsIDB4ODYsIDB4MzMsIDB4NWMsIDB4YjgsCi0JMHgyYSwgMHhlMSwgMHg4NiwgMHhjZCwgMHgxNywgMHgwOCwgMHhiNywgMHg2MCwgMHg3OCwgMHg3MCwgMHgwNiwgMHhlMCwKLQkweDQyLCAweDcyLCAweGQxLCAweDBlLCAweGMzLCAweDQ2LCAweDI2LCAweGMwLCAweDI3LCAweDYyLCAweGZjLCAweDY4LAotCTB4YTcsIDB4NTcsIDB4MDcsIDB4ZWYsIDB4NDAsIDB4NmUsIDB4YmQsIDB4YmQsIDB4ZmYsIDB4MzUsIDB4NmYsIDB4ZmYsCi0JMHhiMywgMHhkZSwgMHhmZSwgMHhjYiwgMHgxYiwgMHhmYiwgMHhmZCwgMHhmYywgMHhmYSwgMHgxMywgMHg0NywgMHg5YSwKLQkweGU4LCAweDdhLCAweGFkLCAweGVjLCAweGMyLCAweGNmLCAweDdhLCAweDc0LCAweDVkLCAweGRlLCAweGEwLCAweGNiLAotCTB4ODcsIDB4ODcsIDB4M2MsIDB4MzUsIDB4Y2YsIDB4OGMsIDB4Y2QsIDB4OGMsIDB4ZDEsIDB4ZmQsIDB4OTAsIDB4YTMsCi0JMHgyMywgMHgzOSwgMHgxYiwgMHhiZSwgMHg1MSwgMHg0OSwgMHg4YywgMHgxNSwgMHhmNSwgMHg5ZCwgMHg5YSwgMHg5MiwKLQkweGI1LCAweGU4LCAweGFjLCAweDRjLCAweDU4LCAweDg5LCAweGIxLCAweDY5LCAweDA5LCAweGMxLCAweDk2LCAweDE5LAotCTB4NWIsIDB4NDIsIDB4NTIsIDB4NjMsIDB4Y2MsIDB4YzEsIDB4MzMsIDB4NmYsIDB4NmYsIDB4NGYsIDB4ZWIsIDB4ZDUsCi0JMHgyNiwgMHg1YSwgMHg0MywgMHgyZiwgMHg5MSwgMHg0NiwgMHg5NywgMHhkNiwgMHhjOCwgMHhjMCwgMHg2ZCwgMHg1YSwKLQkweDVkLCAweDc4LCAweDk3LCAweGQ2LCAweGFiLCAweGU1LCAweDI2LCAweGY4LCAweDczLCAweDYxLCAweDBmLCAweDNlLAotCTB4ZGMsIDB4MDQsIDB4NGYsIDB4N2IsIDB4NjYsIDB4NWQsIDB4NDEsIDB4N2IsIDB4MjYsIDB4NmQsIDB4M2YsIDB4MGIsCi0JMHhkZiwgMHg5MCwgMHhjOCwgMHg4ZSwgMHg3NCwgMHhmNSwgMHhlOCwgMHg3ZCwgMHgwMywgMHg4ZSwgMHg0NCwgMHg1MCwKLQkweDZmLCAweGI0LCAweDYyLCAweDZkLCAweGJkLCAweGNhLCAweDVhLCAweDQ0LCAweGVkLCAweDZkLCAweDk1LCAweDQxLAotCTB4ZDgsIDB4MmMsIDB4NzUsIDB4ZTcsIDB4ZGUsIDB4MGQsIDB4M2UsIDB4YWEsIDB4NmIsIDB4MDIsIDB4NDcsIDB4OWUsCi0JMHhiNCwgMHg0OSwgMHhjYiwgMHg4ZiwgMHg5ZCwgMHg5NywgMHhhMywgMHg4MywgMHg3NiwgMHg0OSwgMHg4NiwgMHhjYywKLQkweDU2LCAweDljLCAweDVmLCAweDZiLCAweDY4LCAweDljLCAweDQ5LCAweGQyLCAweGIyLCAweDMyLCAweGQ0LCAweDZmLAotCTB4N2UsIDB4MGYsIDB4N2MsIDB4OGUsIDB4NTcsIDB4MGQsIDB4YTksIDB4NTksIDB4ODksIDB4ZDgsIDB4NzksIDB4ZTAsCi0JMHhkOCwgMHgwZiwgMHhkZCwgMHhkNCwgMHg0NiwgMHg0OCwgMHg4ZiwgMHhjOCwgMHg2MSwgMHhkOCwgMHg3NywgMHg0ZCwKLQkweGU3LCAweDQ1LCAweGRhLCAweDcxLCAweDYyLCAweGEyLCAweDg4LCAweDVhLCAweGU3LCAweDJmLCAweDc1LCAweDZlLAotCTB4NzMsIDB4OWMsIDB4MWIsIDB4YzgsIDB4NmYsIDB4MTMsIDB4NWIsIDB4NmMsIDB4NGYsIDB4OWQsIDB4NzMsIDB4NmQsCi0JMHg0ZiwgMHg5ZCwgMHg0MywgMHgwZiwgMHg3YywgMHgzMiwgMHgyMiwgMHg2ZCwgMHhjYiwgMHhmMCwgMHg5ZiwgMHg5NywKLQkweGY2LCAweGI4LCAweGY1LCAweGRjLCAweDRiLCAweGZjLCAweGRkLCAweDA5LCAweGYxLCAweGVlLCAweDY0LCAweDU4LAotCTB4YWMsIDB4OTMsIDB4M2EsIDB4MWYsIDB4NDAsIDB4ZGUsIDB4ZTMsIDB4MzIsIDB4N2QsIDB4ODYsIDB4MzEsIDB4ZDUsCi0JMHg5MiwgMHg4MSwgMHg5MywgMHhkNCwgMHgwNywgMHhlYiwgMHg5YSwgMHg4NSwgMHhkMSwgMHgwMiwgMHg3YywgMHg2NCwKLQkweDA2LCAweDcxLCAweDQxLCAweDJkLCAweGRmLCAweDk0LCAweDgyLCAweDQ1LCAweDM5LCAweDc0LCAweDQ5LCAweGZiLAotCTB4MzIsIDB4ZmEsIDB4ZjEsIDB4NjUsIDB4YzQsIDB4ODYsIDB4ZTUsIDB4OTgsIDB4YjQsIDB4YzAsIDB4YjcsIDB4ZDQsCi0JMHhiOSwgMHhhOCwgMHg1MSwgMHg5YSwgMHg3ZiwgMHgxNywgMHhmZSwgMHhjMCwgMHhkZiwgMHg3MCwgMHg1MCwgMHg1YiwKLQkweDllLCAweDhiLCAweDE5LCAweGY0LCAweDJkLCAweDc1LCAweDhlLCAweDc2LCAweDhlLCAweDcyLCAweGVhLCAweDFjLAotCTB4ZWQsIDB4OWMsIDB4NzQsIDB4ZjgsIDB4ZmUsIDB4ODIsIDB4ZjcsIDB4NzMsIDB4MjMsIDB4ZmEsIDB4OWUsIDB4ZmEsCi0JMHg4NiwgMHg0ZCwgMHg1ZSwgMHg3ZSwgMHgyMCwgMHhkOSwgMHgyYSwgMHg2YiwgMHg0NCwgMHhmMiwgMHgyMywgMHhkZCwKLQkweGE4LCAweDY1LCAweDc2LCAweDY1LCAweGVkLCAweDgxLCAweGIxLCAweDc1LCAweGY5LCAweGE4LCAweDdjLCAweGRkLAotCTB4ZjksIDB4MTEsIDB4ZjgsIDB4MjIsIDB4MWYsIDB4Y2QsIDB4N2MsIDB4OTEsIDB4YTcsIDB4MmUsIDB4NjksIDB4ZDEsCi0JMHg3YywgMHhmOSwgMHhmYywgMHg0MCwgMHhkMCwgMHhlMCwgMHg2NywgMHhlZiwgMHhjOSwgMHgxOCwgMHhmMCwgMHg3ZiwKLQkweDExLCAweDMxLCAweGEwLCAweDBmLCAweGNmLCAweDI3LCAweGYwLCAweDQ0LCAweDRhLCAweDNiLCAweDQ3LCAweGRlLAotCTB4YzksIDB4ZWIsIDB4NzUsIDB4ZDQsIDB4OGQsIDB4M2UsIDB4OWYsIDB4NTMsIDB4NzgsIDB4N2YsIDB4NTUsIDB4YTYsCi0JMHhlNywgMHg5ZCwgMHhlMywgMHhjOCwgMHhhYiwgMHhiYywgMHg0MywgMHhlZiwgMHg3MSwgMHhlZiwgMHg4MywgMHhiNywKLQkweGYyLCAweGZlLCAweGFhLCAweGI4LCAweGYyLCAweDQ5LCAweDk4LCAweDM1LCAweGMxLCAweGZiLCAweGQyLCAweDU2LAotCTB4NTksIDB4MzQsIDB4YzcsIDB4OGUsIDB4OTgsIDB4YWUsIDB4YzMsIDB4MGYsIDB4ZDcsIDB4MTksIDB4MjcsIDB4MjgsCi0JMHhhMywgMHhlYiwgMHg5MiwgMHg5ZCwgMHhlNywgMHhmZCwgMHg5NywgMHg4YiwgMHg2ZiwgMHhhYSwgMHhlZSwgMHhjNywKLQkweDhkLCAweGU2LCAweDNkLCAweDM2LCAweGUwLCAweGZhLCAweDAwLCAweDQ3LCAweGJhLCAweGQ2LCAweDI4LCAweDNmLAotCTB4YzQsIDB4OWMsIDB4ZGUsIDB4YTYsIDB4NTgsIDB4ZDMsIDB4YmMsIDB4NmYsIDB4NGMsIDB4OWUsIDB4NDMsIDB4MWQsCi0JMHhmMCwgMHg5YSwgMHhiZCwgMHg0OSwgMHhhZSwgMHg1MywgMHhhYywgMHg4NSwgMHg2YSwgMHhmNSwgMHg0OSwgMHhmOCwKLQkweDY0LCAweDBiLCAweDYyLCAweDk5LCAweDI5LCAweGViLCAweGU1LCAweDU2LCAweGE5LCAweGExLCAweGRlLCAweDU5LAotCTB4NWMsIDB4NjIsIDB4MmMsIDB4MjQsIDB4ZWQsIDB4ZWQsIDB4OTgsIDB4NzcsIDB4ZTMsIDB4MTcsIDB4NjMsIDB4ZWQsCi0JMHg3YSwgMHgxOSwgMHg3OSwgMHgxNiwgMHhiZSwgMHhiZCwgMHg1ZSwgMHg4ZSwgMHhlMiwgMHhkOSwgMHg4NywgMHhhNywKLQkweDg1LCAweDY3LCAweDFjLCAweGNmLCAweDI0LCAweDllLCAweDIzLCAweDc4LCAweDhlLCAweGUwLCAweDY5LCAweDYxLAotCTB4NmYsIDB4MGMsIDB4NGYsIDB4YmYsIDB4NjcsIDB4MjAsIDB4YWUsIDB4ZGIsIDB4N2MsIDB4OTcsIDB4ZjQsIDB4NzksCi0JMHhhOCwgMHgxNSwgMHgyZCwgMHhlNiwgMHhiNCwgMHhiMCwgMHg5ZCwgMHg0MywgMHgxZiwgMHg5MSwgMHgxZCwgMHg2MSwKLQkweGFkLCAweGM3LCAweDlhLCAweGVmLCAweDAzLCAweGM3LCAweGI0LCAweGQ4LCAweDk3LCAweDE3LCAweDhkLCAweGZkLAotCTB4NDMsIDB4Y2MsIDB4MGIsIDB4NTUsIDB4ZTQsIDB4ODUsIDB4ZjcsIDB4NzYsIDB4YTMsIDB4N2YsIDB4MzQsIDB4MGYsCi0JMHhlOCwgMHhiYiwgMHhhMywgMHg3OSwgMHg3YywgMHhmMywgMHgxZCwgMHgzZCwgMHg2ZiwgMHg3NCwgMHgwNiwgMHg3OSwKLQkweDhhLCAweGYxLCAweGQzLCAweGMxLCAweDllLCAweDNjLCAweGUyLCAweGY4LCAweDJlLCAweGY4LCAweDVmLCAweDA2LAotCTB4NzEsIDB4MWIsIDB4ZWYsIDB4MGIsIDB4OTcsIDB4NzYsIDB4YmIsIDB4MzksIDB4MTUsIDB4ZjksIDB4NTYsIDB4NmQsCi0JMHhiZCwgMHhhZiwgMHhiMSwgMHhiMSwgMHg2NywgMHhiYiwgMHhkZSwgMHhhMCwgMHgxMywgMHgzOCwgMHgxMiwgMHhkNSwKLQkweDA1LCAweGY4LCAweGUwLCAweGY3LCAweGVkLCAweGUzLCAweGJhLCAweGI2LCAweGEzLCAweDJlLCAweDllLCAweDQ1LAotCTB4OGQsIDB4OWEsIDB4OWIsIDB4NjMsIDB4MGQsIDB4NzMsIDB4MGMsIDB4N2QsIDB4MDksIDB4ZmEsIDB4YjMsIDB4MjgsCi0JMHg3YiwgMHg3MiwgMHhlNiwgMHgwMiwgMHg1ZCwgMHg4YiwgMHg0NiwgMHhhNSwgMHg5ZCwgMHg3OSwgMHhlMCwgMHgwNiwKLQkweGNlLCAweDAzLCAweDVmLCAweDhiLCAweDBlLCAweDY0LCAweGY2LCAweDA4LCAweDZhLCAweDQyLCAweGM3LCAweDA5LAotCTB4NWIsIDB4ZmIsIDB4MjUsIDB4ZmUsIDB4MzgsIDB4NjMsIDB4OGUsIDB4NjAsIDB4YmYsIDB4MjksIDB4ZWUsIDB4YmQsCi0JMHgzYSwgMHhlMiwgMHhlZSwgMHhhNCwgMHhmZSwgMHhiZCwgMHgxOCwgMHhjNiwgMHg2NSwgMHg2MywgMHhlZiwgMHgxZCwKLQkweGMwLCAweGM1LCAweDc5LCAweGRlLCAweDY5LCAweDhiLCAweGVjLCAweDlmLCAweDczLCAweDZiLCAweDVhLCAweDY1LAotCTB4MzUsIDB4ZTMsIDB4ZmIsIDB4MzksIDB4MGYsIDB4MWYsIDB4ZDcsIDB4OTUsIDB4ZjcsIDB4ZGIsIDB4YzYsIDB4MWUsCi0JMHhjOCwgMHgwOCwgMHhmZSwgMHgwMCwgMHgxZCwgMHg5ZiwgMHg0MCwgMHhmZCwgMHg3YywgMHgxMSwgMHg3YSwgMHg3OSwKLQkweDBkLCAweDNhLCAweGI5LCAweDU0LCAweGE2LCAweGFkLCAweDBmLCAweGMzLCAweGVlLCAweDIxLCAweGMzLCAweDQ5LAotCTB4ZTIsIDB4MWEsIDB4ZDEsIDB4NjcsIDB4NWYsIDB4MmMsIDB4MjMsIDB4NzYsIDB4MzIsIDB4ZmUsIDB4YTksIDB4NWYsCi0JMHg4ZCwgMHhiMiwgMHgzZSwgMHg2NCwgMHgxZSwgMHg3NCwgMHhmMSwgMHhmNCwgMHhiOSwgMHg3MCwgMHhlMiwgMHhhZiwKLQkweGVkLCAweGQ2LCAweGY0LCAweGQ0LCAweGY0LCAweDNkLCAweDE4LCAweGU1LCAweDA0LCAweDFiLCAweGU0LCAweDZmLAotCTB4MDQsIDB4MWEsIDB4ZTYsIDB4MGIsIDB4NTEsIDB4N2QsIDB4MGYsIDB4YWYsIDB4MzgsIDB4NDcsIDB4M2UsIDB4NDYsCi0JMHgyNCwgMHgzYiwgMHhlNywgMHhlZiwgMHhlYiwgMHhjNiwgMHhiZSwgMHgxZCwgMHg0ZCwgMHhiOCwgMHhlZSwgMHhkYywKLQkweGMyLCAweDgzLCAweGYyLCAweDc4LCAweGUwLCAweGZhLCAweGQ2LCAweGJhLCAweDNmLCAweDYxLCAweDE2LCAweDM3LAotCTB4ZWUsIDB4ODYsIDB4OTksIDB4N2YsIDB4YTksIDB4OWIsIDB4MTQsIDB4ZjYsIDB4ZmIsIDB4ZmEsIDB4ZTksIDB4ZjMsCi0JMHg3YSwgMHg4MSwgMHhjNCwgMHg2YywgMHg1MSwgMHg1OCwgMHhhYiwgMHg1MCwgMHg0NywgMHg2MywgMHhmMCwgMHg2YiwKLQkweDEzLCAweGY4LCAweDZkLCAweGE5LCAweDk2LCAweGRiLCAweDQ0LCAweGY1LCAweGIwLCAweDM3LCAweDY2LCAweGFkLAotCTB4ZGMsIDB4N2MsIDB4ZTYsIDB4YWYsIDB4NzgsIDB4NjcsIDB4YTIsIDB4OWYsIDB4M2UsIDB4YzUsIDB4YmEsIDB4NTksCi0JMHhlNywgMHgxOSwgMHhjMCwgMHg3NCwgMHg2YywgMHhhMSwgMHhlZCwgMHgxNywgMHgzZCwgMHgzOCwgMHhhZSwgMHgyNywKLQkweGE1LCAweDg4LCAweDNhLCAweDM0LCAweDM3LCAweDg3LCAweDhhLCAweDFlLCAweGYxLCAweDViLCAweGE1LCAweGY5LAotCTB4YmIsIDB4MTYsIDB4ZWYsIDB4ZjAsIDB4ODYsIDB4ZTMsIDB4ZDMsIDB4YTAsIDB4YjEsIDB4NjgsIDB4NjYsIDB4NzgsCi0JMHg2ZiwgMHgwNiwgMHgxYywgMHhiZCwgMHg1YiwgMHg3MCwgMHg4YywgMHg3YiwgMHgzOCwgMHhjNiwgMHhhNSwgMHg3NCwKLQkweDY2LCAweDAyLCAweGJlLCAweDk2LCAweDQxLCAweDdlLCAweGVmLCAweDM3LCAweDFmLCAweDkxLCAweDRmLCAweGEwLAotCTB4YjksIDB4YzYsIDB4ZGMsIDB4ZDksIDB4MTEsIDB4ZTgsIDB4YzksIDB4NzEsIDB4ZjYsIDB4ZGIsIDB4ODcsIDB4NDAsCi0JMHhmNywgMHg3NywgMHg5MCwgMHg1YiwgMHhmZCwgMHg5YSwgMHhhNywgMHgxNCwgMHgwYiwgMHgyMSwgMHg4NywgMHgxZCwKLQkweGQxLCAweGJmLCAweGMzLCAweDE2LCAweDRkLCAweDEzLCAweGY2LCAweGFhLCAweDhjLCAweGUxLCAweDI0LCAweGRhLAotCTB4N2IsIDB4ZTQsIDB4YjcsIDB4NTksIDB4ZTQsIDB4MmEsIDB4ZjIsIDB4ZDksIDB4MjksIDB4MjUsIDB4ZDMsIDB4NzgsCi0JMHgzOCwgMHg4NCwgMHhiYSwgMHgyNiwgMHgzYiwgMHg0NywgMHgzZiwgMHg5MiwgMHg4MSwgMHg1MCwgMHhiYSwgMHgxNSwKLQkweDM1LCAweGE5LCAweDIzLCAweDZmLCAweGRiLCAweGZjLCAweDc3LCAweDBhLCAweGIzLCAweDcyLCAweGIxLCAweDZlLAotCTB4ZTIsIDB4ZjksIDB4NWQsIDB4ZTgsIDB4ZTEsIDB4NGYsIDB4ZjEsIDB4ZmUsIDB4NzYsIDB4MGYsIDB4ZWEsIDB4M2UsCi0JMHhhYywgMHg2NCwgMHg2MCwgMHhiYiwgMHg0OSwgMHg1ZCwgMHhjZiwgMHhiMCwgMHg4ZSwgMHhhOCwgMHgyMSwgMHhkZiwKLQkweDJhLCAweGU0LCAweDFhLCAweGQ0LCAweDU1LCAweDYzLCAweGFjLCAweDVkLCAweDlmLCAweDViLCAweGJjLCAweDI2LAotCTB4OTcsIDB4ZTYsIDB4ZjksIDB4M2IsIDB4MjgsIDB4ZjMsIDB4ZjIsIDB4NDEsIDB4YzYsIDB4MDMsIDB4NzMsIDB4MjYsCi0JMHg4NSwgMHhiOSwgMHgyNSwgMHhjNiwgMHgzMiwgMHg3YywgMHgzNywgMHhlMCwgMHg0MCwgMHgzZCwgMHhhOCwgMHgxMSwKLQkweDUwLCAweDZiLCAweGFmLCAweDViLCAweDQ5LCAweGYwLCAweDc5LCAweDRkLCAweDJlLCAweGNlLCAweDg3LCAweDY1LAotCTB4ZDEsIDB4NjIsIDB4NWQsIDB4MjQsIDB4ZjEsIDB4MmMsIDB4NjAsIDB4MmYsIDB4MmUsIDB4ZmQsIDB4OTMsIDB4NmIsCi0JMHgxMywgMHg4NCwgMHg0NywgMHhjZiwgMHg1MywgMHg0NCwgMHg1ZCwgMHhmNywgMHg4OCwgMHhkZSwgMHhmYiwgMHhkMywKLQkweGY0LCAweDRjLCAweDlhLCAweDlhLCAweGZiLCAweGJjLCAweDgyLCAweDVjLCAweGE0LCAweDNmLCAweGU5LCAweGRmLAotCTB4MjgsIDB4NTgsIDB4MWIsIDB4MWMsIDB4ODMsIDB4Y2QsIDB4YjIsIDB4NzYsIDB4NjcsIDB4M2YsIDB4ODAsIDB4ZjcsCi0JMHgzYSwgMHhkNywgMHhjOSwgMHgzYiwgMHg5ZSwgMHgwYiwgMHhmZCwgMHg5MCwgMHgwZCwgMHhmZCwgMHg5ZSwgMHg3NywKLQkweDYyLCAweGM4LCAweGEzLCAweDhhLCAweGJlLCAweDVlLCAweGQyLCAweGIxLCAweGEwLCAweDU0LCAweDI5LCAweDIwLAotCTB4YTcsIDB4MjAsIDB4MDYsIDB4ZDgsIDB4YmQsIDB4YjAsIDB4YzUsIDB4NDksIDB4ZTgsIDB4NzIsIDB4MGMsIDB4NzAsCi0JMHg1YiwgMHg3MiwgMHhjOSwgMHg2YSwgMHg0OSwgMHhkNywgMHg2NSwgMHg2YSwgMHhlNSwgMHhmNiwgMHhmZCwgMHg0ZCwKLQkweDFlLCAweGZlLCAweGEzLCAweDU2LCAweDYxLCAweDViLCAweGYwLCAweDIxLCAweGI1LCAweDFhLCAweGM1LCAweDEzLAotCTB4ZjEsIDB4NzgsIDB4MTUsIDB4ZmQsIDB4NDUsIDB4OTksIDB4ZjcsIDB4NDMsIDB4ZTgsIDB4MGQsIDB4Y2EsIDB4YmMsCi0JMHgzYiwgMHg0OSwgMHhlMiwgMHgzOSwgMHhjMiwgMHhmYiwgMHgyMiwgMHgyZiwgMHhhZSwgMHgxMSwgMHgzZiwgMHhlOSwKLQkweGYwLCAweGUzLCAweDBiLCAweDZiLCAweDQ5LCAweGM2LCAweDE3LCAweGJmLCAweDllLCAweDc0LCAweDZkLCAweGUxLAotCTB4NDQsIDB4ODUsIDB4MzEsIDB4ODQsIDB4NzYsIDB4ZGQsIDB4OGYsIDB4YjgsIDB4NDUsIDB4NWIsIDB4NzAsIDB4NmIsCi0JMHhjOSwgMHhhNSwgMHhhYSwgMHgyYiwgMHhiMywgMHhlOSwgMHhjNiwgMHgwNSwgMHg5ZCwgMHgyMywgMHgwZSwgMHg4OCwKLQkweDA1LCAweDFiLCAweGEzLCAweGVjLCAweGIwLCAweGE2LCAweDczLCAweGMwLCAweDc5LCAweGM5LCAweGU4LCAweDI3LAotCTB4NjUsIDB4ZjYsIDB4YWEsIDB4NjQsIDB4OTYsIDB4NDYsIDB4ZTQsIDB4MDUsIDB4MWQsIDB4YjcsIDB4ZmMsIDB4OTgsCi0JMHhjNSwgMHgxYSwgMHg5MiwgMHhiZiwgMHgxZiwgMHgyNywgMHhlNSwgMHhmOSwgMHhkMywgMHhkNywgMHgyNCwgMHhmYiwKLQkweDIyLCAweGUzLCAweGQ2LCAweDcwLCAweDZjLCAweDg3LCAweGMxLCAweDU4LCAweGU1LCAweDQ4LCAweDFkLCAweGI5LAotCTB4ZTksIDB4MTEsIDB4OWIsIDB4ZmYsIDB4MTYsIDB4MjAsIDB4ODQsIDB4OWUsIDB4Y2UsIDB4OTEsIDB4ZDYsIDB4ZDEsCi0JMHg4NCwgMHgxZCwgMHgzNywgMHhmYSwgMHg5ZiwgMHhkOCwgMHg2MSwgMHgzMCwgMHgzNywgMHgwZSwgMHg5YiwgMHg0ZiwKLQkweDg5LCAweDdmLCAweDFmLCAweGQ1LCAweDI2LCAweDRmLCAweGU5LCAweGJiLCAweDBhLCAweGI4LCAweGVkLCAweGRjLAotCTB4ZmIsIDB4ZmEsIDB4NzcsIDB4OTQsIDB4MWIsIDB4MjksIDB4Y2EsIDB4MWEsIDB4ZGYsIDB4YWIsIDB4OWMsIDB4MmYsCi0JMHg0NiwgMHg2ZSwgMHhhNCwgMHg1YSwgMHhhNCwgMHg3NCwgMHg4NywgMHhlMywgMHgzYywgMHgzOSwgMHhmYSwgMHhjMCwKLQkweDZlLCAweGY3LCAweGRmLCAweDhiLCAweDNjLCAweDdkLCAweDg3LCAweDFiLCAweDBiLCAweDdlLCAweGNkLCAweGZiLAotCTB4ZmUsIDB4M2EsIDB4OWUsIDB4YjQsIDB4NmQsIDB4ZTYsIDB4NWIsIDB4ZTYsIDB4NDcsIDB4ZWEsIDB4MGQsIDB4Y2YsCi0JMHgyNSwgMHhiZSwgMHgzMywgMHhmNywgMHhjZSwgMHgyMiwgMHhmNywgMHgzMiwgMHg1ZiwgMHhlZSwgMHg5MiwgMHgxYywKLQkweDdmLCAweGU3LCAweDUzLCAweDdhLCAweGJlLCAweGU4LCAweGQ2LCAweGQyLCAweDFlLCAweDVjLCAweDc1LCAweDRhLAotCTB4YTYsIDB4YWIsIDB4YWMsIDB4YTEsIDB4MmUsIDB4MjIsIDB4OTcsIDB4MGQsIDB4YzEsIDB4NTYsIDB4OTksIDB4ZDMsCi0JMHg4ZSwgMHgyMywgMHg5ZiwgMHhmMywgMHhmNywgMHg2OSwgMHhhYywgMHgyZCwgMHg3MCwgMHg1ZiwgMHgyMiwgMHgxOSwKLQkweDU3LCAweGNkLCAweGJmLCAweDJiLCAweGRkLCAweDhjLCAweGYyLCAweDNlLCAweGVhLCAweGZjLCAweDEwLCAweGY0LAotCTB4ZmUsIDB4MTUsIDB4ZjYsIDB4MTYsIDB4MDMsIDB4ZGEsIDB4NDYsIDB4YjIsIDB4MmYsIDB4NTEsIDB4ZjYsIDB4ZWUsCi0JMHhlZiwgMHhkNywgMHhkMiwgMHhlZCwgMHhmYSwgMHgwMCwgMHhlYiwgMHg4MCwgMHhjZiwgMHg0MCwgMHgyZSwgMHgwNywKLQkweGVjLCAweDZiLCAweGNjLCAweGRkLCAweGZmLCAweGE2LCAweGFjLCAweGUxLCAweGU0LCAweDUzLCAweDA2LCAweDdkLAotCTB4MWIsIDB4ZGYsIDB4NGIsIDB4MjEsIDB4NTksIDB4ODgsIDB4OTIsIDB4N2YsIDB4YzgsIDB4Y2IsIDB4YTAsIDB4ZWYsCi0JMHg2YywgMHgyNywgMHg4NywgMHhhZCwgMHgzMiwgMHhmOCwgMHgwYiwgMHhjOCwgMHg4MCwgMHhiMiwgMHhmNCwgMHg2NSwKLQkweGMwLCAweGY3LCAweDA5LCAweGU4LCAweDhiLCAweDNkLCAweDQzLCAweGJmLCAweGVlLCAweDIzLCAweDRiLCAweDBkLAotCTB4ZjcsIDB4ZWMsIDB4NTIsIDB4YTUsIDB4OTksIDB4NjYsIDB4ZDIsIDB4NGIsIDB4OWQsIDB4OWUsIDB4OTcsIDB4OWMsCi0JMHhkNiwgMHhlZiwgMHhhYywgMHhlNCwgMHhhYSwgMHhlNywgMHg2NSwgMHg3ZiwgMHg3NSwgMHg1NiwgMHgxZSwgMHhiNSwKLQkweDFlLCAweDA2LCAweGJmLCAweDU3LCAweDljLCAweDgyLCAweGE1LCAweDdiLCAweDk1LCAweGIxLCAweDNjLCAweGNlLAotCTB4MmUsIDB4OGMsIDB4ZjQsIDB4Y2EsIDB4NGQsIDB4ZDQsIDB4MWQsIDB4Y2YsIDB4MmUsIDB4OWEsIDB4ZjIsIDB4M2YsCi0JMHg5ZCwgMHg1YiwgMHg1ZiwgMHg2YywgMHg1YiwgMHhkNSwgMHgxOSwgMHhmZiwgMHg3YywgMHg2ZCwgMHgyNywgMHg2OSwKLQkweDY4LCAweGMyLCAweGFkLCAweGViLCAweDI0LCAweDZlLCAweDlhLCAweDUxLCAweDNiLCAweGJlLCAweDZkLCAweDIzLAotCTB4OTIsIDB4YTIsIDB4ZGIsIDB4MTAsIDB4NjgsIDB4ZDQsIDB4NjUsIDB4OGEsIDB4NzEsIDB4NDIsIDB4MTcsIDB4YjYsCi0JMHgyMiwgMHhkMiwgMHhhZSwgMHhhYiwgMHgyYSwgMHg4ZCwgMHg4MSwgMHhlNSwgMHhhNiwgMHg3ZiwgMHhkOCwgMHhjMywKLQkweDBhLCAweDg1LCAweDc1LCAweDA4LCAweDIxLCAweGQ1LCAweGI4LCAweGU5LCAweGQ2LCAweDY5LCAweDIxLCAweDRlLAotCTB4ZmYsIDB4MmQsIDB4OGMsIDB4ODcsIDB4Y2QsIDB4NGEsIDB4ZDIsIDB4OTYsIDB4NGQsIDB4MTEsIDB4MmUsIDB4ODgsCi0JMHhiMiwgMHgzZCwgMHg2YywgMHhhMywgMHg0YSwgMHgwMSwgMHhlZCwgMHg3OSwgMHg3YiwgMHg5OSwgMHgzNCwgMHgzNiwKLQkweDY1LCAweDA1LCAweDM2LCAweDVlLCAweDM2LCAweGY1LCAweDgxLCAweDA3LCAweGE2LCAweGQxLCAweDc5LCAweGJmLAotCTB4ZGYsIDB4NzcsIDB4ZWUsIDB4NzUsIDB4NmMsIDB4MTMsIDB4ODQsIDB4YjQsIDB4NDgsIDB4OTEsIDB4ZWYsIDB4MzksCi0JMHhmNywgMHhkYywgMHg3MywgMHhjZSwgMHgzZCwgMHhkZiwgMHhmZiwgMHhlZiwgMHhmYiwgMHhkZCwgMHg4YywgMHgzZCwKLQkweDI4LCAweDNmLCAweGQyLCAweDVjLCAweDNlLCAweGUzLCAweDkzLCAweDAwLCAweDdjLCAweDUyLCAweDgzLCAweDJkLAotCTB4OTAsIDB4MzYsIDB4MjcsIDB4NzYsIDB4NTMsIDB4ZTgsIDB4NTMsIDB4ODYsIDB4NDEsIDB4ZWIsIDB4YjgsIDB4ZjEsCi0JMHg5YiwgMHg2ZCwgMHg3MywgMHg3ZiwgMHhjYiwgMHg1OSwgMHhmOCwgMHhlZSwgMHhlZSwgMHg3ZCwgMHg2ZCwgMHg3ZSwKLQkweGNlLCAweGQ3LCAweGY4LCAweGI3LCAweDdmLCAweGYyLCAweDZhLCAweDY4LCAweDgzLCAweDMyLCAweDgzLCAweGZkLAotCTB4YmMsIDB4YTEsIDB4N2EsIDB4ZDYsIDB4MDEsIDB4MmYsIDB4MzEsIDB4MzcsIDB4MWQsIDB4ZDMsIDB4ZmMsIDB4NDMsCi0JMHg3OCwgMHg5YSwgMHgzYSwgMHhlYSwgMHgyYSwgMHg3NCwgMHhkNCwgMHgxMCwgMHg3NSwgMHhkNywgMHhmMCwgMHhiYywKLQkweGNiLCAweGZjLCAweDQwLCAweDU0LCAweGZlLCAweDM4LCAweDQ1LCAweDNkLCAweDFjLCAweDk3LCAweDNmLCAweDRjLAotCTB4M2QsIDB4OGIsIDB4ZmQsIDB4MjQsIDB4OGEsIDB4Y2MsIDB4NTEsIDB4ZGUsIDB4OTgsIDB4YzksIDB4ZDEsIDB4NGYsCi0JMHg1MiwgMHg3ZiwgMHgzZSwgMHhlZCwgMHgzZSwgMHhhZCwgMHg3NiwgMHgyMCwgMHg2ZSwgMHhlNSwgMHhkNywgMHg4NywKLQkweDU1LCAweGRmLCAweDFjLCAweGQzLCAweGRhLCAweDZlLCAweGRjLCAweGVhLCAweDkyLCAweDFiLCAweDE3LCAweDhjLAotCTB4OGUsIDB4MGQsIDB4NGYsIDB4NDcsIDB4MDMsIDB4MjMsIDB4MGIsIDB4YjQsIDB4NGIsIDB4YzksIDB4NTgsIDB4ZDYsCi0JMHg2YSwgMHg5NCwgMHg0MywgMHg1MSwgMHhlNiwgMHg5ZSwgMHg1MywgMHhkNCwgMHhjZiwgMHhiMCwgMHg4NSwgMHhiZCwKLQkweDc2LCAweGQ2LCAweDZhLCAweGYyLCAweGVjLCAweDRmLCAweGFjLCAweDRlLCAweGNmLCAweDFlLCAweGYzLCAweGY0LAotCTB4MmMsIDB4ZWYsIDB4YTUsIDB4NjgsIDB4MDMsIDB4MjAsIDB4OTMsIDB4ODksIDB4OTksIDB4NTEsIDB4MmIsIDB4MDksCi0JMHg5YiwgMHg4NywgMHhlYiwgMHg0NSwgMHhjZSwgMHgxZiwgMHg5NywgMHhlMywgMHg4YiwgMHg0NywgMHhlMSwgMHg3ZiwKLQkweGY3LCAweGRhLCAweDdiLCAweDY5LCAweDU3LCAweGVkLCAweDIxLCAweGUyLCAweDcxLCAweGIwLCAweGZlLCAweDk3LAotCTB4ZWEsIDB4ZTYsIDB4N2EsIDB4ZDQsIDB4OWIsIDB4OGIsIDB4ZjcsIDB4MjEsIDB4ZTcsIDB4ZDMsIDB4YWMsIDB4ZDcsCi0JMHgzNiwgMHgzMiwgMHg5ZiwgMHhhMywgMHg3YiwgMHhhZCwgMHgxZCwgMHhiYiwgMHhhNywgMHhiMiwgMHhlZSwgMHg2NCwKLQkweGMxLCAweGYxLCAweGIwLCAweDYxLCAweGY4LCAweDg1LCAweDJmLCAweGY0LCAweDhkLCAweDA4LCAweGQ3LCAweGU0LAotCTB4N2EsIDB4YWQsIDB4OTIsIDB4ZGUsIDB4MGYsIDB4ZmQsIDB4MzIsIDB4Y2QsIDB4ZmYsIDB4OWMsIDB4NTcsIDB4YmIsCi0JMHg0MiwgMHhiYywgMHgxMiwgMHhlZCwgMHg1YywgMHhjNSwgMHgzNiwgMHg3ZCwgMHhjNSwgMHg5YiwgMHhhZiwgMHhiZiwKLQkweDVkLCAweDlhLCAweGEzLCAweDU1LCAweGUzLCAweDk5LCAweDViLCAweDYxLCAweDNiLCAweDJlLCAweGI5LCAweDQ1LAotCTB4ZmUsIDB4OTYsIDB4Y2IsIDB4MTEsIDB4YTcsIDB4NDEsIDB4ZjYsIDB4ZGEsIDB4MWIsIDB4ZWIsIDB4ZTYsIDB4ZDgsCi0JMHg4NiwgMHgzZSwgMHhlMywgMHgxMywgMHgwNCwgMHhhNywgMHgwMywgMHg5ZSwgMHg2ZiwgMHhiMSwgMHg4OSwgMHg3ZSwKLQkweDkzLCAweDc3LCAweGRkLCAweGE0LCAweDM5LCAweDk5LCAweGI4LCAweGQ1LCAweDU5LCAweGY3LCAweDFlLCAweDliLAotCTB4MmEsIDB4NzYsIDB4MzgsIDB4NmUsIDB4NTEsIDB4NzcsIDB4MzYsIDB4NDYsIDB4YTUsIDB4OTUsIDB4M2MsIDB4NTQsCi0JMHg1NiwgMHgzZiwgMHgzZSwgMHhlNCwgMHgxOCwgMHhjYywgMHg0NSwgMHhkNCwgMHgzOSwgMHhkMiwgMHhjZSwgMHg5YywKLQkweGZkLCAweDViLCAweDdhLCAweDZlLCAweDJkLCAweGY0LCAweDA5LCAweDcwLCAweDBkLCAweDNlLCAweGY5LCAweDRjLAotCTB4YmUsIDB4OTcsIDB4YjksIDB4NWUsIDB4Y2MsIDB4ZGYsIDB4Y2MsIDB4ZjksIDB4NWQsIDB4ZWYsIDB4OWMsIDB4MTMsCi0JMHg2ZSwgMHhjZSwgMHhiYSwgMHg1ZiwgMHhiMiwgMHgxNywgMHgwYywgMHhmZiwgMHhhNSwgMHgxZCwgMHhmMCwgMHg1ZSwKLQkweDJiLCAweGRhLCAweDBiLCAweGI0LCAweDA5LCAweDlmLCAweDM3LCAweDhmLCAweDZmLCAweDFiLCAweDdhLCAweGQ0LAotCTB4MzYsIDB4OWMsIDB4MmEsIDB4OTAsIDB4M2YsIDB4YzksIDB4OTcsIDB4M2UsIDB4M2YsIDB4ZmEsIDB4M2EsIDB4OGYsCi0JMHgzYywgMHg0YSwgMHgzZCwgMHgzYiwgMHgyOCwgMHg2NywgMHgwYiwgMHgzYywgMHg5YiwgMHg5NCwgMHhkNiwgMHhiNCwKLQkweDM2LCAweDlmLCAweDNiLCAweGE4LCAweDk4LCAweGFjLCAweGVlLCAweGU5LCAweGM0LCAweDRiLCAweDM5LCAweDE5LAotCTB4OTYsIDB4YWIsIDB4MmUsIDB4Y2YsIDB4MmMsIDB4NTEsIDB4Y2MsIDB4MDQsIDB4NWIsIDB4YWEsIDB4ZGUsIDB4N2YsCi0JMHhiZiwgMHg5ZSwgMHg1OSwgMHg1OCwgMHg3ZCwgMHhjNiwgMHgxOCwgMHhjNiwgMHgzZSwgMHhlZiwgMHhkMSwgMHhiYiwKLQkweDU1LCAweGNmLCAweDM2LCAweDUzLCAweDQzLCAweDlmLCAweGFmLCAweGViLCAweDM5LCAweDg1LCAweGExLCAweDEzLAotCTB4NTksIDB4ZGYsIDB4MGYsIDB4NDcsIDB4ZjgsIDB4MGMsIDB4ZDcsIDB4YTUsIDB4Y2YsIDB4YzcsIDB4YjUsIDB4YzgsCi0JMHg3YiwgMHhkZCwgMHhiMCwgMHhkOCwgMHhmZCwgMHgxMiwgMHhkYywgMHgwOSwgMHhkMSwgMHhkZiwgMHhjOSwgMHgzYSwKLQkweDcyLCAweDAwLCAweGIyLCAweGJhLCAweGQ5LCAweDYwLCAweDYwLCAweGM2LCAweDhkLCAweGFmLCAweDkxLCAweGIxLAotCTB4YWUsIDB4ZTEsIDB4MWMsIDB4MTEsIDB4YWIsIDB4YzAsIDB4OGYsIDB4M2UsIDB4ZjUsIDB4OTMsIDB4ZGIsIDB4OTgsCi0JMHgyZiwgMHhlMywgMHhmOSwgMHhlYiwgMHgwMywgMHg5OCwgMHhkZiwgMHhmMSwgMHhlYSwgMHhlYSwgMHg1MywgMHhkYiwKLQkweGM5LCAweGFiLCAweGEzLCAweDVhLCAweDFmLCAweGU0LCAweDMzLCAweDk0LCAweDYzLCAweDllLCAweDE5LCAweGU5LAotCTB4ZjIsIDB4MWUsIDB4OWUsIDB4NjcsIDB4N2IsIDB4NWIsIDB4MWQsIDB4MWQsIDB4OTMsIDB4ZGUsIDB4ZmUsIDB4ZmMsCi0JMHhmYiwgMHg2MSwgMHgwOSwgMHhiNywgMHg1MywgMHhjNywgMHg0NSwgMHgyNSwgMHgzOSwgMHhjZCwgMHg5OCwgMHgwNSwKLQkweGI2LCAweDZiLCAweDljLCAweDczLCAweDdkLCAweGIxLCAweDJlLCAweGNlLCAweGZjLCAweDlmLCAweGJhLCAweDM4LAotCTB4NjMsIDB4N2QsIDB4YTQsIDB4YmMsIDB4MTMsIDB4ZDYsIDB4M2MsIDB4ZDYsIDB4ZTcsIDB4ZDMsIDB4YjUsIDB4NTgsCi0JMHg0MywgMHg1NywgMHhiZiwgMHg3NiwgMHgxZiwgMHhhZCwgMHhkMCwgMHhmMSwgMHg4NywgMHgwNSwgMHhkYSwgMHhhYiwKLQkweDk0LCAweGU2LCAweDk0LCAweGZmLCAweDNlLCAweGM1LCAweGIzLCAweGU1LCAweDFlLCAweGFmLCAweDcyLCAweDhmLAotCTB4YzMsIDB4NGIsIDB4OGEsIDB4ODMsIDB4N2MsIDB4NTgsIDB4NjUsIDB4ZjgsIDB4NzQsIDB4ODEsIDB4M2EsIDB4YTYsCi0JMHg0NSwgMHhlNiwgMHg2NywgMHg3YywgMHgzZCwgMHgzMywgMHhlNiwgMHhmOSwgMHhiOCwgMHhmOSwgMHhmNSwgMHgwZCwKLQkweGFhLCAweDY3LCAweGUwLCAweGRkLCAweDM4LCAweDIzLCAweDllLCAweDdkLCAweGU5LCAweDkyLCAweGI5LCAweDBiLAotCTB4YjQsIDB4YmIsIDB4NDksIDB4ZjQsIDB4NDUsIDB4MDMsIDB4NzMsIDB4MGIsIDB4YWMsIDB4NGQsIDB4MTIsIDB4OGIsCi0JMHgzMiwgMHgyYywgMHhhYywgMHhmYiwgMHg4ZiwgMHhkOCwgMHhhNywgMHgyMCwgMHg2ZiwgMHgzMSwgMHg3OSwgMHg3ZiwKLQkweDhhLCAweDNlLCAweDdkLCAweDAzLCAweDdjLCAweGUzLCAweGQ2LCAweGJhLCAweGYzLCAweGRkLCAweDUxLCAweGYxLAotCTB4MDksIDB4NmIsIDB4ZTksIDB4MWUsIDB4ZWYsIDB4OTAsIDB4NjYsIDB4ZjIsIDB4YjksIDB4NjMsIDB4ZGYsIDB4MTAsCi0JMHhmYSwgMHg2MCwgMHhiYywgMHhjZSwgMHgyMiwgMHgxNiwgMHg2MCwgMHhlYywgMHgxMSwgMHhkNywgMHhkOCwgMHg2MywKLQkweGFlLCAweGM4LCAweGJlLCAweDE2LCAweDJmLCAweGFmLCAweGQ0LCAweGEyLCAweGJjLCAweDQyLCAweDdlLCAweGNiLAotCTB4YTgsIDB4ZmYsIDB4M2QsIDB4YTQsIDB4M2EsIDB4MmIsIDB4M2YsIDB4ZDUsIDB4NmIsIDB4NzAsIDB4MmMsIDB4NzYsCi0JMHg0YywgMHg3OSwgMHg0ZiwgMHg2YSwgMHg3OCwgMHgyZiwgMHhlNiwgMHhhZCwgMHgzZCwgMHhkNiwgMHg2MSwgMHg3YywKLQkweDJiLCAweDViLCAweGY1LCAweDRkLCAweDU4LCAweGM3LCAweGQxLCAweGFlLCAweDcwLCAweDdlLCAweGYyLCAweDA2LAotCTB4NzksIDB4ODQsIDB4M2EsIDB4Y2YsIDB4MWYsIDB4ZTcsIDB4ZDMsIDB4YzMsIDB4NmYsIDB4NzMsIDB4M2MsIDB4ZjksCi0JMHhiZiwgMHgxYSwgMHg4YiwgMHhlMCwgMHhjYiwgMHhhYSwgMHhkZiwgMHhlNywgMHhjYiwgMHgxZCwgMHhlZiwgMHg1NSwKLQkweGRiLCAweDA0LCAweGNhLCAweDVkLCAweDc1LCAweDdkLCAweGQyLCAweDk2LCAweGM4LCAweGY0LCAweDBhLCAweDVkLAotCTB4ZDIsIDB4ZmQsIDB4ZGMsIDB4ZmYsIDB4ZjMsIDB4Y2MsIDB4ZWQsIDB4NDIsIDB4ZGUsIDB4NTYsIDB4YTMsIDB4Y2QsCi0JMHgwOSwgMHhhNSwgMHg0ZCwgMHgwNiwgMHhiNCwgMHg4OSwgMHgyOCwgMHg2ZCwgMHgxOCwgMHhlZiwgMHgzZCwgMHhlNSwKLQkweGYxLCAweDViLCAweDBiLCAweGNlLCAweDhiLCAweGI5LCAweDVhLCAweGU4LCAweGJhLCAweDdkLCAweGQ0LCAweGY5LAotCTB4Y2YsIDB4NzYsIDB4NjgsIDB4N2QsIDB4ZDAsIDB4YTEsIDB4ZWUsIDB4NWIsIDB4MGIsIDB4N2QsIDB4YzYsIDB4ZjYsCi0JMHg1NiwgMHhmNSwgMHg0NywgMHg0YywgMHhiYywgMHgxNSwgMHhkNywgMHgzYywgMHg2OCwgMHgxMCwgMHhmYSwgMHg3OSwKLQkweDZlLCAweDBhLCAweGJlLCAweDFhLCAweDcxLCAweDZmLCAweDM1LCAweGI0LCAweGZhLCAweDhlLCAweDc3LCAweDVlLAotCTB4ZjMsIDB4NGEsIDB4MWIsIDB4Y2EsIDB4MDAsIDB4ZjUsIDB4ZTYsIDB4M2EsIDB4Y2MsIDB4YjcsIDB4MjcsIDB4ZGEsCi0JMHgwNywgMHhmZSwgMHhmYSwgMHgxOSwgMHhmYSwgMHgzNywgMHg2YiwgMHgzYywgMHgxMSwgMHg4NCwgMHhjYywgMHhkZiwKLQkweDljLCAweDZhLCAweGY3LCAweDYyLCAweDM4LCAweDA3LCAweDZkLCAweGM0LCAweGFkLCAweDUzLCAweDExLCAweGM2LAotCTB4MTQsIDB4NjgsIDB4ZjcsIDB4NDgsIDB4YzMsIDB4MzQsIDB4ZTIsIDB4NTcsIDB4ZTgsIDB4ZjEsIDB4MjUsIDB4YjUsCi0JMHg0NywgMHg3ZCwgMHhiOCwgMHg3ZiwgMHgwNywgMHg3MSwgMHg3ZSwgMHhiOCwgMHgzZSwgMHg4YSwgMHhlNywgMHg3YSwKLQkweDBkLCAweDE2LCAweDIxLCAweGJhLCAweDQ1LCAweGNmLCAweDc0LCAweDZlLCAweDJhLCAweDExLCAweDNiLCAweDJjLAotCTB4NWUsIDB4ZGYsIDB4YjgsIDB4YWIsIDB4ZmEsIDB4NjAsIDB4NjUsIDB4NWYsIDB4MGYsIDB4Y2EsIDB4OWUsIDB4OGEsCi0JMHhiZCwgMHg2MCwgMHgxYywgMHgwZCwgMHgxZiwgMHg3ZSwgMHhjNiwgMHhkOCwgMHg4MywgMHg3YywgMHhiMSwgMHg0ZiwKLQkweGYxLCAweDUxLCAweGMxLCAweGExLCAweDQ1LCAweDljLCAweDI1LCAweDdkLCAweGQyLCAweDY1LCAweGY4LCAweGUxLAotCTB4MmUsIDB4Y2UsIDB4OTAsIDB4N2UsIDB4NzcsIDB4ZjksIDB4ZTQsIDB4YTQsIDB4OWIsIDB4NjIsIDB4N2QsIDB4MGMsCi0JMHhmYSwgMHhlMCwgMHhhNCwgMHg4YywgMHgyMCwgMHgyZSwgMHgxOCwgMHgwOSwgMHhiNiwgMHgzMiwgMHhhZiwgMHgwYywKLQkweGRmLCAweDMwLCAweGU3LCAweGU1LCAweDFlLCAweGZiLCAweDk4LCAweDMzLCAweDk1LCAweDczLCAweDBiLCAweGRjLAotCTB4M2IsIDB4NjUsIDB4ZGIsIDB4YzQsIDB4ZGUsIDB4NzMsIDB4NTMsIDB4ZGMsIDB4YWYsIDB4YzksIDB4NDMsIDB4YjAsCi0JMHg2ZCwgMHg0ZCwgMHhiYiwgMHhmOCwgMHhlNSwgMHg1OSwgMHgwYywgMHhlMCwgMHg3NywgMHgxMCwgMHhmMiwgMHhjMCwKLQkweGIxLCAweGY4LCAweDVkLCAweDU4LCAweDk2LCAweDc3LCAweDJmLCAweGY4LCAweGI2LCAweDNkLCAweDIwLCAweDZmLAotCTB4M2IsIDB4ZTUsIDB4OTMsIDB4YTcsIDB4ZGMsIDB4ZjUsIDB4M2MsIDB4MDMsIDB4MzcsIDB4YzcsIDB4OWEsIDB4YjUsCi0JMHhlMywgMHhiOCwgMHg3OSwgMHgyOSwgMHg5NywgMHg5NywgMHhkYywgMHhhNSwgMHhmNSwgMHg5NiwgMHhkMiwgMHg5MiwKLQkweGYyLCAweGJmLCAweDhjLCAweDMzLCAweGJjLCAweDdlLCAweGFmLCAweDI1LCAweDg2LCAweDdlLCAweGE0LCAweGNkLAotCTB4NjcsIDB4NmIsIDB4N2YsIDB4ZDUsIDB4YjYsIDB4YzAsIDB4ZDcsIDB4N2YsIDB4ZTQsIDB4NDcsIDB4ZjIsIDB4ZTUsCi0JMHhiMiwgMHhlYywgMHg1MiwgMHhmZCwgMHhiZiwgMHhkYSwgMHg3MywgMHhkNSwgMHhiYSwgMHhkZiwgMHhmNywgMHg2ZiwKLQkweGE5LCAweGRmLCAweGI1LCAweGZlLCAweGEzLCAweGYxLCAweGMxLCAweDk2LCAweGU5LCAweDdhLCAweDlkLCAweGYwLAotCTB4OTgsIDB4NTcsIDB4NTcsIDB4NTgsIDB4OGQsIDB4ZjcsIDB4MGUsIDB4NzgsIDB4N2EsIDB4MjEsIDB4YTUsIDB4YmUsCi0JMHg3MywgMHhjYSwgMHhhNiwgMHg3ZSwgMHhlMCwgMHg3ZSwgMHg5YSwgMHhlNSwgMHhlMCwgMHhlYywgMHg2ZCwgMHhkMCwKLQkweGM0LCAweGQ3LCAweGMxLCAweDhjLCAweGZiLCAweDdjLCAweGRkLCAweGQxLCAweGVhLCAweGY5LCAweGMyLCAweDk2LAotCTB4NzQsIDB4OWYsIDB4YTMsIDB4ZWYsIDB4ZTQsIDB4NDAsIDB4OGYsIDB4YjYsIDB4NDksIDB4NjYsIDB4M2MsIDB4MjgsCi0JMHhjOSwgMHg3MywgMHgxYiwgMHg2MiwgMHhjNiwgMHhkNywgMHgyNSwgMHhmZiwgMHg0MSwgMHhkZSwgMHhiNCwgMHg0ZiwKLQkweDdkLCAweDUxLCAweGY0LCAweGRmLCAweDI5LCAweDVjLCAweGRiLCAweGYwLCAweDMzLCAweGU0LCAweDc5LCAweDlmLAotCTB4N2YsIDB4Y2YsIDB4YWUsIDB4ZTMsIDB4ZDEsIDB4OWQsIDB4MWUsIDB4OGYsIDB4ZjIsIDB4YmUsIDB4NjUsIDB4ZWEsCi0JMHgxZiwgMHgxOCwgMHhkYiwgMHg3ZCwgMHg4ZSwgMHg3YiwgMHgzNCwgMHhjZiwgMHg3NSwgMHg5ZiwgMHgzMywgMHhmMSwKLQkweDdhLCAweGVkLCAweDczLCAweDdkLCAweDk1LCAweGU3LCAweDcwLCAweGJmLCAweDQ3LCAweGIxLCAweDYxLCAweDk4LAotCTB4N2IsIDB4ZDcsIDB4MjAsIDB4N2MsIDB4YmEsIDB4M2UsIDB4ZGEsIDB4MWMsIDB4ZGEsIDB4ZWYsIDB4Y2QsIDB4ZWUsCi0JMHgyZSwgMHgyMSwgMHhiZiwgMHgyNywgMHgzYywgMHg5ZSwgMHhhMywgMHhiZSwgMHg4OSwgMHg3OCwgMHhmYSwgMHg2NiwKLQkweGM1LCAweGJlLCAweDhjLCAweDE4LCAweGZjLCAweDA5LCAweDczLCAweDIyLCAweDU1LCAweGY2LCAweGU1LCAweDcxLAotCTB4ZjMsIDB4NmUsIDB4MzUsIDB4ZjYsIDB4ZTUsIDB4NGUsIDB4NmYsIDB4MWUsIDB4ZmYsIDB4OWUsIDB4YWYsIDB4NTcsCi0JMHhmYywgMHhiNiwgMHhhZiwgMHg1NywgMHhlYSwgMHg3ZCwgMHg1YSwgMHg5ZiwgMHhmNiwgMHhiNSwgMHhiOCwgMHhhZiwKLQkweGVhLCAweDk4LCAweDJmLCAweGJmLCAweDZhLCAweGRlLCAweDI1LCAweDhiLCAweDk4LCAweDhkLCAweDNlLCAweDY1LAotCTB4MjIsIDB4NjcsIDB4MzAsIDB4ZDMsIDB4ZDYsIDB4NTksIDB4OGIsIDB4YjgsIDB4MGYsIDB4ZTcsIDB4YzcsIDB4OTIsCi0JMHg4ZSwgMHhkYywgMHhkNiwgMHhkOCwgMHhmYSwgMHhmNCwgMHhlYywgMHg5OCwgMHhlNiwgMHg3OSwgMHhlNiwgMHg1YywKLQkweDRmLCAweGVmLCAweDQ0LCAweDc3LCAweDQzLCAweGFlLCAweDVlLCAweDg5LCAweGFjLCAweDYwLCAweDhhLCAweDY2LAotCTB4NGUsIDB4YTQsIDB4NjEsIDB4ODcsIDB4NTIsIDB4NWEsIDB4MmYsIDB4ZmIsIDB4MmUsIDB4ZjYsIDB4M2IsIDB4YTgsCi0JMHg3OCwgMHhhZSwgMHgzNSwgMHhjZSwgMHg3MywgMHhmMiwgMHg5MCwgMHg1ZCwgMHhkNiwgMHhkYSwgMHg0ZCwgMHhkMywKLQkweDUwLCAweGYxLCAweDQ0LCAweGQzLCAweDhiLCAweDNlLCAweGRmLCAweDkzLCAweDlmLCAweDY2LCAweDRlLCAweDFjLAotCTB4OWMsIDB4MjksIDB4MGYsIDB4ODcsIDB4YjYsIDB4ZjcsIDB4ZGEsIDB4NzksIDB4MjEsIDB4NjYsIDB4N2YsIDB4NTgsCi0JMHg4ZSwgMHgyOCwgMHg3NiwgMHhmOCwgMHgxNSwgMHhkYywgMHhkZiwgMHhjNywgMHhmOCwgMHgzMiwgMHgxMSwgMHg1MiwKLQkweDRjLCAweDcwLCAweDIyLCAweDM2LCAweDAxLCAweDU5LCAweGNjLCAweGJhLCAweGM0LCAweGY4LCAweGFmLCAweDU1LAotCTB4YWMsIDB4ZmYsIDB4OWMsIDB4ZDAsIDB4Y2YsIDB4MjIsIDB4YTYsIDB4ZTAsIDB4NTksIDB4MzksIDB4ZWMsIDB4NmUsCi0JMHg3NiwgMHg5NywgMHhjNCwgMHhmOCwgMHhiZiwgMHg1OSwgMHhhZCwgMHgwOSwgMHgzNSwgMHhjYSwgMHg4NCwgMHgxYiwKLQkweDZhLCAweDRhLCAweDk3LCAweDhjLCAweDBjLCAweDhjLCAweDA2LCAweDUzLCAweDZiLCAweDI2LCAweDlkLCAweDY4LAotCTB4ZDMsIDB4YWUsIDB4MTIsIDB4NjQsIDB4YmMsIDB4MDQsIDB4ZmQsIDB4NWYsIDB4OGEsIDB4MDUsIDB4NDYsIDB4MTQsCi0JMHg5YiwgMHhmNiwgMHg2NSwgMHg0OSwgMHhiNywgMHhkMywgMHhjZiwgMHhhNywgMHgzZSwgMHhmOSwgMHg4YSwgMHhkYywKLQkweGI0LCAweGI3LCAweGNhLCAweGNkLCAweDFlLCAweGUyLCAweDMxLCAweGZiLCAweGQxLCAweGE2LCAweDJlLCAweDE5LAotCTB4NDQsIDB4NWYsIDB4MTIsIDB4N2QsIDB4NGQsIDB4Y2EsIDB4OGYsIDB4MWEsIDB4OWYsIDB4NDEsIDB4NjcsIDB4ZGQsCi0JMHhiNCwgMHhhOSwgMHhhYiwgMHhlZSwgMHhlMiwgMHgyZiwgMHhkZSwgMHhmNSwgMHg2ZiwgMHhhMCwgMHgwOSwgMHhiMSwKLQkweDFkLCAweGRiLCAweGQwLCAweGE2LCAweDhlLCAweGIzLCAweGViLCAweGZhLCAweDNiLCAweGQxLCAweGJlLCAweDE3LAotCTB4NzMsIDB4MzQsIDB4ZTgsIDB4ZmIsIDB4NTksIDB4Y2UsIDB4NzYsIDB4NTMsIDB4ZTcsIDB4YWMsIDB4MTksIDB4YjMsCi0JMHhhZSwgMHhhZSwgMHhmZCwgMHhmYiwgMHgzNiwgMHg4MywgMHg0ZiwgMHhmOCwgMHg5NCwgMHhmNCwgMHhjZSwgMHhhNSwKLQkweGU0LCAweGUxLCAweDhlLCAweGRhLCAweGY2LCAweGJmLCAweGVhLCAweGRhLCAweGFkLCAweGIyLCAweGE2LCAweDhkLAotCTB4NjQsIDB4MzgsIDB4ZDYsIDB4NWUsIDB4ZGIsIDB4ZWYsIDB4ZjMsIDB4OTMsIDB4ZGYsIDB4ZWUsIDB4YzAsIDB4ZmIsCi0JMHg0MiwgMHg2NiwgMHhhYywgMHhhNCwgMHhjNiwgMHg1MiwgMHgzNywgMHhhMywgMHg1YywgMHhlYiwgMHhjMywgMHhiYSwKLQkweDY3LCAweDc4LCAweGNkLCAweDY3LCAweGY4LCAweDJjLCAweGYzLCAweDdhLCAweGI3LCAweGQ5LCAweDhmLCAweDY3LAotCTB4OTgsIDB4MTMsIDB4NjAsIDB4NWUsIDB4ODMsIDB4M2MsIDB4YmIsIDB4NWEsIDB4OWMsIDB4YzUsIDB4MzEsIDB4OWYsCi0JMHhjZCwgMHgzNywgMHg2NCwgMHgyYSwgMHhiYywgMHhlNywgMHhlYiwgMHg5NSwgMHg1OCwgMHgwNSwgMHhhYiwgMHhiNiwKLQkweGFiLCAweGUwLCAweGU3LCAweDg0LCAweDQ5LCAweDNiLCAweGFkLCAweDQ5LCAweGM1LCAweDZlLCAweDgwLCAweGNlLAotCTB4ODcsIDB4NDAsIDB4ZTcsIDB4MDcsIDB4ODMsIDB4OGMsIDB4MGIsIDB4OWIsIDB4M2QsIDB4NWEsIDB4M2IsIDB4MzIsCi0JMHg1MiwgMHhmYSwgMHgwZCwgMHg2NCwgMHg5YywgMHgzYywgMHgwYSwgMHg5ZiwgMHhhMiwgMHg2NCwgMHg3OSwgMHhmOCwKLQkweDhjLCAweDAxLCAweGQ4LCAweDM0LCAweDU3LCAweDgyLCAweDlhLCAweDc3LCAweDQwLCAweDdjLCAweDNmLCAweDdmLAotCTB4NWQsIDB4NDYsIDB4YTYsIDB4OTgsIDB4MTMsIDB4MjAsIDB4M2YsIDB4MzMsIDB4YWUsIDB4NGYsIDB4ZTEsIDB4ZGUsCi0JMHgyZCwgMHg4YywgMHg3NSwgMHgyMSwgMHhjMywgMHg2MywgMHhlMCwgMHhkNywgMHg5MCwgMHgzOCwgMHhkMywgMHhkYiwKLQkweDI0LCAweDM3LCAweDNlLCAweGE2LCAweDNlLCAweDQwLCAweDM3LCAweDZjLCAweGQ0LCAweDI5LCAweDc3LCAweDU0LAotCTB4MjYsIDB4YWYsIDB4NmMsIDB4ODIsIDB4YWMsIDB4MzIsIDB4ZWUsIDB4ZDcsIDB4OWMsIDB4NDYsIDB4MzksIDB4YWMsCi0JMHhiZSwgMHgzOSwgMHg3ZCwgMHgwZSwgMHhlNiwgMHhlMSwgMHg0YywgMHg4ZCwgMHhkOSwgMHhjOCwgMHhlZCwgMHhhMSwKLQkweDk4LCAweGI0LCAweDhlLCAweGNhLCAweGNjLCAweGFjLCAweGFkLCAweDc4LCAweDk3LCAweDk0LCAweGRjLCAweDJlLAotCTB4OTMsIDB4NzYsIDB4ZDksIDB4N2QsIDB4NzEsIDB4ZTgsIDB4MmEsIDB4ZmEsIDB4ZjIsIDB4M2YsIDB4ODgsIDB4OTgsCi0JMHhiMywgMHhkYywgMHhiZCwgMHg4MSwgMHgzMSwgMHg3MSwgMHg3MiwgMHhiYSwgMHg3YSwgMHgwZSwgMHhjNSwgMHhjOCwKLQkweGUwLCAweGRlLCAweDJmLCAweGRiLCAweDhjLCAweGNjLCAweDMwLCAweDNlLCAweGZlLCAweGEwLCAweDljLCAweDhhLAotCTB4NzIsIDB4NGQsIDB4OGUsIDB4NjUsIDB4ZWQsIDB4OTYsIDB4M2MsIDB4YzIsIDB4YmQsIDB4ZmQsIDB4YzcsIDB4ZTMsCi0JMHhlNSwgMHg5NywgMHgzMSwgMHg1ZiwgMHg1YywgMHhiYSwgMHg1ZiwgMHgxZCwgMHhkMywgMHhiOCwgMHhmZSwgMHg1NCwKLQkweDRkLCAweDBjLCAweDZiLCAweGYyLCAweDA1LCAweDI2LCAweDhlLCAweGJkLCAweDJlLCAweDEzLCAweDhiLCAweGE0LAotCTB4MGYsIDB4NmQsIDB4N2MsIDB4NDAsIDB4N2UsIDB4ZTEsIDB4ZjQsIDB4ZGEsIDB4NGYsIDB4NjgsIDB4YWQsIDB4MzEsCi0JMHg5MSwgMHg2MiwgMHg3ZCwgMHhhNiwgMHhkOSwgMHg0OSwgMHhkYSwgMHhmMywgMHgxMiwgMHgxYSwgMHhmYywgMHgxYSwKLQkweGFlLCAweDE5LCAweGQ3LCAweGU2LCAweGRkLCAweDVlLCAweGY3LCAweDA5LCAweGYxLCAweDcxLCAweDIwLCAweDliLAotCTB4NTMsIDB4OGQsIDB4ODEsIDB4NGYsIDB4Y2EsIDB4ZDcsIDB4ZjcsIDB4NzEsIDB4OGMsIDB4YzEsIDB4ODEsIDB4NDgsCi0JMHg4MCwgMHhiNCwgMHg3YSwgMHhlZiwgMHgyZSwgMHhlMiwgMHg2NywgMHg2YSwgMHhmMywgMHg3ZiwgMHgwZiwgMHgxYywKLQkweGRiLCAweDNiLCAweDkwLCAweDM4LCAweGMzLCAweDE4LCAweDM2LCAweGVjLCAweDNjLCAweGJhLCAweGMxLCAweGJjLAotCTB4NmIsIDB4MmUsIDB4YjcsIDB4NGUsIDB4YjQsIDB4N2UsIDB4NzYsIDB4ZmMsIDB4MWYsIDB4MGUsIDB4ZjEsIDB4MTAsCi0JMHg4OSwgMHg1OCwgMHhhMywgMHhjNSwgMHgzYywgMHgzOCwgMHg3NSwgMHgxYywgMHg2YiwgMHgyYSwgMHhjYywgMHhiOSwKLQkweDExLCAweGNiLCAweGRmLCAweDI0LCAweDk3LCAweGZiLCAweDJjLCAweDc5LCAweDIwLCAweDk0LCAweDhhLCAweDViLAotCTB4YjIsIDB4MjUsIDB4N2UsIDB4NGUsIDB4YjAsIDB4MjYsIDB4ZWIsIDB4MmIsIDB4OGIsIDB4ODksIDB4MWMsIDB4YzcsCi0JMHg4NywgMHhhNiwgMHgzOSwgMHg1ZiwgMHg1YywgMHhlMywgMHg5NSwgMHhlNCwgMHg5NiwgMHg3MiwgMHhmOSwgMHgyOSwKLQkweDU3LCAweDAyLCAweGM5LCAweDdiLCAweDNlLCAweDJjLCAweGIzLCAweDE2LCAweDZlLCAweGJkLCAweGZhLCAweDc5LAotCTB4MzgsIDB4MDUsIDB4ZWEsIDB4MGEsIDB4N2IsIDB4YzIsIDB4NjAsIDB4MGUsIDB4MjcsIDB4OGYsIDB4NzcsIDB4MmYsCi0JMHhiMiwgMHhmZCwgMHhlNCwgMHg0MywgMHhhNiwgMHg3ZCwgMHgwNiwgMHhlZCwgMHgwNiwgMHgwZiwgMHhlYiwgMHgzNCwKLQkweDc1LCAweGJjLCAweGJiLCAweDc4LCAweDZjLCAweDgzLCAweDg5LCAweGJmLCAweDk3LCAweDE1LCAweGZmLCAweGY1LAotCTB4NTYsIDB4NGQsIDB4NGMsIDB4OTMsIDB4MGEsIDB4OGMsIDB4MTcsIDB4YzYsIDB4MDIsIDB4NjMsIDB4MDUsIDB4YWIsCi0JMHhhZiwgMHgwOSwgMHhiNCwgMHg1YSwgMHg3MCwgMHg5OSwgMHhhYiwgMHhmMSwgMHg3MywgMHg1NiwgMHhjYywgMHhmNywKLQkweDhiLCAweDNjLCAweGE5LCAweDE4LCAweDI5LCAweGQ2LCAweDE0LCAweDJkLCAweGY1LCAweDg1LCAweDBlLCAweDJkLAotCTB4MzAsIDB4YzcsIDB4MWYsIDB4NTEsIDB4N2QsIDB4NzAsIDB4NzgsIDB4YjEsIDB4NTUsIDB4ZjIsIDB4ZjYsIDB4N2EsCi0JMHhjOSwgMHhhYiwgMHg4YywgMHg0NywgMHg1NSwgMHgwNywgMHg1OCwgMHhjZSwgMHgzZCwgMHhlOCwgMHhlMywgMHhiZSwKLQkweDFmLCAweDU3LCAweDVjLCAweGM0LCAweGViLCAweDg1LCAweDRlLCAweGI0LCAweDk5LCAweDZiLCAweGRlLCAweDUxLAotCTB4ZDcsIDB4NWYsIDB4NWQsIDB4OTcsIDB4NGQsIDB4ZDgsIDB4OTYsIDB4NTUsIDB4NWYsIDB4OTMsIDB4NjUsIDB4NWYsCi0JMHg3ZCwgMHgyZCwgMHhmNiwgMHhiNCwgMHg1YywgMHgyNywgMHhkZiwgMHg5NCwgMHhmYywgMHg5YywgMHhiYiwgMHhlYiwKLQkweGU1LCAweGRjLCAweDFmLCAweGMzLCAweDljLCAweDljLCAweDViLCAweDMyLCAweGExLCAweGExLCAweGE2LCAweGJlLAotCTB4NTMsIDB4NTMsIDB4YzEsIDB4NWIsIDB4MmIsIDB4ZjksIDB4NTMsIDB4YjQsIDB4MTcsIDB4MmIsIDB4YjUsIDB4NzIsCi0JMHhkYywgMHg3YiwgMHgwNiwgMHhiZSwgMHg0OCwgMHgxZSwgMHg3ZSwgMHg0NSwgMHhjZSwgMHhmYiwgMHhmZSwgMHg4MCwKLQkweGY3LCAweDJiLCAweGNmLCAweDdmLCAweGMxLCAweDllLCAweDlhLCAweGI1LCAweGNlLCAweDZlLCAweGQ1LCAweGQ0LAotCTB4ZDksIDB4YmYsIDB4OGQsIDB4NjcsIDB4NTksIDB4NjMsIDB4Y2YsIDB4OTUsIDB4MWIsIDB4YzAsIDB4YmIsIDB4MGQsCi0JMHhjNCwgMHg4OSwgMHg1NCwgMHhjNiwgMHg1MywgMHhjNywgMHhhYiwgMHgyZSwgMHhkNywgMHhiOSwgMHg3NiwgMHg3OSwKLQkweDczLCAweDA1LCAweGExLCAweGU3LCAweDBmLCAweDRlLCAweGY5LCAweDYzLCAweDRlLCAweDRhLCAweDYzLCAweDdmLAotCTB4MjIsIDB4MTYsIDB4YjQsIDB4MzgsIDB4YzYsIDB4ZTgsIDB4ZmIsIDB4YjQsIDB4N2IsIDB4MTIsIDB4N2EsIDB4OWMsCi0JMHgzYSwgMHg5ZiwgMHhlZiwgMHhlZCwgMHhjMCwgMHhkNywgMHhhMywgMHgyZSwgMHhhMCwgMHgzZSwgMHg1NywgMHgxYiwKLQkweDEwLCAweGNmLCAweDQzLCAweGQ3LCAweDhmLCAweDk0LCAweDM0LCAweDk3LCAweDFmLCAweGZiLCAweDZhLCAweDMwLAotCTB4MzEsIDB4OTMsIDB4NTUsIDB4ZGQsIDB4MDAsIDB4N2YsIDB4YWYsIDB4ZjQsIDB4MjYsIDB4ZjMsIDB4NDEsIDB4NjcsCi0JMHgyNCwgMHg1MCwgMHg1ZCwgMHhhNywgMHg2MSwgMHg2YywgMHhjNiwgMHg5YSwgMHg0NiwgMHgwYiwgMHg3NCwgMHg4MywKLQkweGM4LCAweDU1LCAweGYwLCAweGM2LCAweDZiLCAweDBiLCAweGU0LCAweGQ3LCAweDYwLCAweGJiLCAweDg5LCAweGFmLAotCTB4OTYsIDB4NzYsIDB4NTgsIDB4ZDIsIDB4YWUsIDB4YjUsIDB4Y2YsIDB4YmMsIDB4MTMsIDB4YTEsIDB4N2YsIDB4MzIsCi0JMHg5YywgMHhlYywgMHg4NywgMHg5ZiwgMHhhZCwgMHhkOCwgMHgwMywgMHhlNiwgMHgyYiwgMHgwZiwgMHgyMiwgMHgxZSwKLQkweGFiLCAweGNlLCAweGIxLCAweDQwLCAweGJlLCAweGM2LCAweGQ5LCAweDlmLCAweDg1LCAweDVmLCAweGI5LCAweDUyLAotCTB4ZjcsIDB4YzgsIDB4MTcsIDB4MjcsIDB4MzUsIDB4YjcsIDB4MzksIDB4YjcsIDB4ZDAsIDB4YTIsIDB4M2EsIDB4NzYsCi0JMHhhZSwgMHgzOCwgMHg4NiwgMHg3MywgMHg5MSwgMHhhZCwgMHhkNiwgMHg1MCwgMHhkZSwgMHhlYiwgMHgwZiwgMHg0YiwKLQkweGIxLCAweGM4LCAweGI2LCAweDc0LCAweDM1LCAweGU4LCAweGI5LCAweGZiLCAweGI1LCAweDFkLCAweDViLCAweGU2LAotCTB4ZTEsIDB4MmIsIDB4MTYsIDB4MTcsIDB4MWQsIDB4ZmMsIDB4ZjcsIDB4ZTAsIDB4YmYsIDB4MGYsIDB4ZmYsIDB4YmIsCi0JMHgyNSwgMHgzZCwgMHg0ZCwgMHhmZiwgMHg5NSwgMHhiNSwgMHg5YywgMHg5NiwgMHhiYSwgMHhmNSwgMHhlOSwgMHgyMywKLQkweDc1LCAweDI5LCAweDBlLCAweDJjLCAweGVmLCAweGM1LCAweDM5LCAweGY5LCAweDYyLCAweGJkLCAweDljLCAweDMwLAotCTB4NGYsIDB4ZWEsIDB4ZWIsIDB4MDgsIDB4ZTYsIDB4NGIsIDB4ZmQsIDB4NWEsIDB4NWYsIDB4NzUsIDB4MGQsIDB4Y2IsCi0JMHhmMiwgMHhlYSwgMHg1ZSwgMHhlNCwgMHhlOSwgMHg2NiwgMHgzOSwgMHg1YywgMHhmNCwgMHg2YiwgMHg1NywgMHgzMSwKLQkweDM5LCAweDUyLCAweGE5LCAweDVkLCAweDQ5LCAweDI2LCAweDM4LCAweGY0LCAweGM5LCAweDIzLCAweGQ5LCAweDI5LAotCTB4YzUsIDB4MTMsIDB4NTgsIDB4ZDYsIDB4ZDAsIDB4ZjUsIDB4NDcsIDB4MjYsIDB4MTYsIDB4ZGYsIDB4N2UsIDB4NjQsCi0JMHgwNSwgMHgxMywgMHg4ZSwgMHg3YiwgMHg4YiwgMHhhYiwgMHg2MSwgMHg4NiwgMHg4OCwgMHhhNSwgMHhlMywgMHhiNywKLQkweDcyLCAweGVhLCAweGJiLCAweDYxLCAweGRmLCAweDdlLCAweGNjLCAweDQzLCAweDljLCAweDFkLCAweGY0LCAweDRjLAotCTB4ZjMsIDB4MGEsIDB4NzYsIDB4ZDcsIDB4YzQsIDB4YTMsIDB4YzQsIDB4OTEsIDB4ZjIsIDB4YjksIDB4NmEsIDB4ZWMsCi0JMHg0NywgMHgwOCwgMHhlNywgMHgyZiwgMHgwMSwgMHhjYiwgMHhjOSwgMHg2MSwgMHgxZiwgMHgzZiwgMHhlZCwgMHgzNCwKLQkweDdlLCAweDIwLCAweDcxLCAweGE2LCAweDg5LCAweDJhLCAweGVjLCAweDkxLCAweDhmLCAweDM1LCAweDdkLCAweDA5LAotCTB4NzMsIDB4NjUsIDB4ZTQsIDB4NzcsIDB4YTUsIDB4NDcsIDB4ZTUsIDB4NTcsIDB4YTUsIDB4MzEsIDB4YzgsIDB4ZjcsCi0JMHgwNCwgMHhlNiwgMHgzYywgMHgyMCwgMHg2ZiwgMHg5NiwgMHhmNiwgMHhjOSwgMHhiNSwgMHhkMiwgMHhiOCwgMHhiYywKLQkweDUxLCAweGRhLCAweDhkLCAweDk4LCAweDZhLCAweDk0LCAweDU4LCAweDRmLCAweDBmLCAweDJiLCAweDNkLCAweDJjLAotCTB4MDcsIDB4Y2YsIDB4MmIsIDB4MDYsIDB4ZjAsIDB4MTYsIDB4ZmQsIDB4OWUsIDB4ZTMsIDB4ZWEsIDB4NjcsIDB4MTMsCi0JMHg1ZiwgMHg5ZiwgMHhmOCwgMHgzNSwgMHhlMywgMHg3OSwgMHg2MiwgMHgzMywgMHg4YiwgMHgyNSwgMHgxZiwgMHhjMywKLQkweDcxLCAweGI0LCAweDBiLCAweDZiLCAweGRiLCAweGZjLCAweDM2LCAweDY1LCAweGU0LCAweDdjLCAweDI0LCAweDMwLAotCTB4N2EsIDB4M2UsIDB4MTQsIDB4NzgsIDB4NTAsIDB4YmYsIDB4NzMsIDB4NjEsIDB4YmQsIDB4YjMsIDB4MmMsIDB4OTMsCi0JMHhhZSwgMHg0MywgMHhkZSwgMHgxYywgMHgxYywgMHg4MSwgMHgyYywgMHg4YywgMHg0MiwgMHhkNSwgMHgzZiwgMHhlNCwKLQkweGFjLCAweDE3LCAweDkwLCAweDM0LCAweGY1LCAweDExLCAweGZjLCAweGNjLCAweGU0LCAweDhiLCAweGFlLCAweDY0LAotCTB4MGIsIDB4ZjMsIDB4MDEsIDB4ODMsIDB4NDcsIDB4YjMsIDB4ZDEsIDB4ZWUsIDB4NDMsIDB4ZmIsIDB4ZTcsIDB4NWUsCi0JMHg3YiwgMHhhNywgMHg2NCwgMHg2NywgMHgyNSwgMHhmNSwgMHhiZSwgMHhmYSwgMHhjMywgMHgyZiwgMHg3YiwgMHg3ZCwKLQkweDgzLCAweGU4LCAweDAzLCAweDY3LCAweDVlLCAweDY0LCAweGRmLCAweDQ1LCAweGFmLCAweDhmLCAweDY3LCAweGMyLAotCTB4NWEsIDB4N2QsIDB4NWMsIDB4ZjksIDB4MmEsIDB4NmIsIDB4OGYsIDB4OGIsIDB4N2UsIDB4ZDcsIDB4YTAsIDB4YjUsCi0JMHhmOCwgMHgwZiwgMHgzYSwgMHg4ZCwgMHg2ZSwgMHgyMywgMHgyNiwgMHhmMCwgMHg5ZiwgMHg5ZCwgMHg4YywgMHhjMSwKLQkweDhhLCAweDkwLCAweGFmLCAweGJiLCAweGEwLCAweDEzLCAweGZmLCAweGJhLCAweDc1LCAweGE1LCAweDZkLCAweDBkLAotCTB4N2QsIDB4NWMsIDB4ODUsIDB4ZDEsIDB4ZmUsIDB4NTgsIDB4YmEsIDB4MTcsIDB4ZmYsIDB4ZWQsIDB4ZTEsIDB4NzksCi0JMHg5ZiwgMHhjMCwgMHhiYiwgMHhlMSwgMHhhYywgMHgwYSwgMHhjNCwgMHg4ZCwgMHhjNywgMHgyMSwgMHhkYiwgMHgyZCwKLQkweGIyLCAweGZlLCAweDJjLCAweGU5LCAweGQ1LCAweDBiLCAweDVkLCAweDlkLCAweDgyLCAweGRjLCAweGJhLCAweGIyLAotCTB4NTAsIDB4MGEsIDB4MDUsIDB4NDYsIDB4MGEsIDB4MjksIDB4MzEsIDB4NzgsIDB4NmEsIDB4NGIsIDB4MzIsIDB4ZDEsCi0JMHg5NCwgMHg5YywgMHgxZSwgMHg0OCwgMHhmNCwgMHgzMCwgMHgwZiwgMHg5OSwgMHhlZCwgMHg3NywgMHhlNSwgMHg1MiwKLQkweDg5LCAweGY2LCAweDM4LCAweDI3LCAweDk3LCAweDA3LCAweDEyLCAweDZlLCAweDUxLCAweDg4LCAweDhiLCAweDcxLAotCTB4ZTUsIDB4MzIsIDB4NjQsIDB4ZjMsIDB4OWQsIDB4ZjMsIDB4YmIsIDB4ZTUsIDB4NDgsIDB4NDEsIDB4ZmQsIDB4ZTAsCi0JMHhkZSwgMHhiMCwgMHhiYywgMHgyMCwgMHg5NywgMHgwNiwgMHg1ZSwgMHhiOCwgMHg3NSwgMHhjOSwgMHgzZCwgMHg4NCwKLQkweDMzLCAweDI1LCAweDFmLCAweDFlLCAweGVlLCAweDMyLCAweGZiLCAweDU2LCAweDFjLCAweDkyLCAweDMwLCAweDFmLAotCTB4YTIsIDB4MzUsIDB4MzUsIDB4YTcsIDB4NTEsIDB4ZDIsIDB4ZmIsIDB4MjMsIDB4NWUsIDB4NWMsIDB4MGUsIDB4OWYsCi0JMHgzYiwgMHgzMCwgMHg2MCwgMHhlYSwgMHgyOSwgMHgwMSwgMHg3ZiwgMHg5ZiwgMHg2MSwgMHhmOCwgMHgzMSwgMHg3YywKLQkweGNlLCAweGE3LCAweDhkLCAweDNmLCAweDRmLCAweDY3LCAweDIwLCAweDNkLCAweGRiLCAweDJhLCAweGExLCAweDhiLAotCTB4ZjcsIDB4ODEsIDB4YWUsIDB4MjEsIDB4MzksIDB4ZDQsIDB4NWYsIDB4MmUsIDB4N2YsIDB4ZDMsIDB4MGQsIDB4YzUsCi0JMHgyNywgMHgxMCwgMHhhMywgMHg2MCwgMHhmZiwgMHhiMiwgMHhlZSwgMHhjNSwgMHgzNiwgMHhkMCwgMHhhNCwgMHg0OSwKLQkweGEyLCAweDJmLCAweGZhLCAweGViLCAweDM1LCAweDdhLCAweDU4LCAweDg2LCAweDhiLCAweGViLCAweDhjLCAweDJkLAotCTB4ZjMsIDB4YjEsIDB4MGQsIDB4ZmUsIDB4N2MsIDB4MDYsIDB4NTMsIDB4ZDYsIDB4NmQsIDB4ZjUsIDB4MDcsIDB4YmMsCi0JMHhlZiwgMHgyNCwgMHhiYywgMHhmNiwgMHgzZCwgMHg4MSwgMHgwNywgMHg0MiwgMHhlZCwgMHgxMiwgMHg3MiwgMHg5ZSwKLQkweGRmLCAweDQ4LCAweDZjLCAweGU0LCAweDUyLCAweGMxLCAweGVmLCAweDg3LCAweDlmLCAweDE4LCAweGYyLCAweGZkLAotCTB4NjEsIDB4ZDksIDB4YmUsIDB4NzIsIDB4ZDYsIDB4YjIsIDB4YmQsIDB4N2IsIDB4ZjEsIDB4NWIsIDB4ZGUsIDB4OWMsCi0JMHgyOSwgMHg2ZiwgMHgyYywgMHg2MiwgMHg4ZSwgMHhkOCwgMHg1YSwgMHhiNSwgMHg0ZiwgMHg2NiwgMHhlYywgMHhhNywKLQkweGYyLCAweDc0LCAweDdmLCAweGUyLCAweDE1LCAweGM1LCAweGM5LCAweDU2LCAweDllLCAweGUxLCAweDdkLCAweGM0LAotCTB4OTAsIDB4MjUsIDB4N2QsIDB4MjYsIDB4YjYsIDB4MDcsIDB4ZjQsIDB4Y2QsIDB4YzQsIDB4ZWUsIDB4YjYsIDB4ZTcsCi0JMHhhZCwgMHg2MCwgMHhjMCwgMHhmOCwgMHgyMywgMHgwZCwgMHhmMiwgMHhiZCwgMHgyOCwgMHhlYywgMHgzNiwgMHhiZiwKLQkweDYxLCAweDYxLCAweGZlLCAweGNiLCAweGJkLCAweGVkLCAweGY5LCAweDI5LCAweGVjLCAweDRiLCAweDljLCAweDQ5LAotCTB4NWEsIDB4MTMsIDB4ZDgsIDB4MWYsIDB4Y2YsIDB4ODAsIDB4MTgsIDB4NTAsIDB4MGIsIDB4NzQsIDB4ZWEsIDB4YzQsCi0JMHhmYiwgMHgyMSwgMHg3ZSwgMHhlYSwgMHhmNywgMHhkZiwgMHg3ZiwgMHgxZCwgMHg3NCwgMHgxOCwgMHhmNywgMHg2ZiwKLQkweDcwLCAweDYxLCAweDYyLCAweDMxLCAweDE3LCAweDMyLCAweGVjLCAweDYxLCAweDYwLCAweGFiLCAweGU1LCAweGQ2LAotCTB4YzcsIDB4YzYsIDB4ZmEsIDB4NzgsIDB4M2EsIDB4NjIsIDB4OTQsIDB4NjIsIDB4ZjAsIDB4MDMsIDB4MjksIDB4MTMsCi0JMHhlNCwgMHhjZCwgMHgwZSwgMHhmNCwgMHhhZiwgMHhmOSwgMHgyNCwgMHhhNSwgMHhhZiwgMHhlZSwgMHhmNywgMHg3ZCwKLQkweDU4LCAweGMxLCAweDc2LCAweDRmLCAweDE0LCAweGY2LCAweDE5LCAweDZjLCAweDllLCAweGI1LCAweDJjLCAweGE5LAotCTB4YWUsIDB4YTQsIDB4M2QsIDB4ODksIDB4ZmQsIDB4YTYsIDB4NDMsIDB4ODksIDB4NjIsIDB4NGUsIDB4NjIsIDB4MzIsCi0JMHgwZiwgMHg3ZCwgMHhmMSwgMHgxYSwgMHg2NCwgMHhmZiwgMHg1YSwgMHgyOSwgMHgxZSwgMHg0OCwgMHg2MywgMHg0ZiwKLQkweDg3LCAweDBiLCAweDQzLCAweDMyLCAweDMxLCAweGFiLCAweGRmLCAweDdlLCAweDQxLCAweGVmLCAweDBmLCAweGM5LAotCTB4NWMsIDB4MjEsIDB4ZDEsIDB4MzMsIDB4MGYsIDB4ZmUsIDB4OWIsIDB4MmYsIDB4MTAsIDB4NWYsIDB4ZDQsIDB4MWIsCi0JMHgxZiwgMHhjNSwgMHg4YywgMHg0YiwgMHg4NSwgMHhjZCwgMHhiMCwgMHgwZiwgMHg5MiwgMHhiYSwgMHgwNCwgMHhmZiwKLQkweGU3LCAweDUyLCAweGE5LCAweDA3LCAweDdjLCAweDg2LCAweGZiLCAweDI1LCAweDA3LCAweGJmLCAweGQwLCAweDk5LAotCTB4YTUsIDB4MDEsIDB4YzgsIDB4MzksIDB4ZjcsIDB4NjIsIDB4Y2IsIDB4YzIsIDB4NTYsIDB4OWMsIDB4MWQsIDB4NzEsCi0JMHg0NCwgMHg4YSwgMHgxZiwgMHhmZiwgMHgyZiwgMHhjZSwgMHhkNywgMHg3ZiwgMHhlZiwgMHgxZCwgMHg2YSwgMHhhNywKLQkweGU3LCAweDc1LCAweDVmLCAweGIwLCAweGNiLCAweDg4LCAweDAxLCAweGIyLCAweGZkLCAweGM2LCAweDZlLCAweGE3LAotCTB4MjMsIDB4NmQsIDB4OTIsIDB4YmUsIDB4OWIsIDB4NzYsIDB4YmMsIDB4NWQsIDB4NjMsIDB4NDQsIDB4ZTUsIDB4YzUsCi0JMHgwOCwgMHhlZiwgMHhiZiwgMHhiMywgMHhkMSwgMHhkMCwgMHgyZiwgMHg1YywgMHhkNywgMHhiZSwgMHg4ZSwgMHhkZiwKLQkweDU2LCAweGU5LCAweDcwLCAweGY4LCAweDZiLCAweGUzLCAweGY3LCAweGVkLCAweDhkLCAweGFjLCAweGVmLCAweDc2LAotCTB4MzgsIDB4NDksIDB4YWMsIDB4ZjUsIDB4NWIsIDB4MmYsIDB4NWYsIDB4ODAsIDB4ZWIsIDB4NzksIDB4M2UsIDB4YjMsCi0JMHhjMSwgMHg1YiwgMHg5NywgMHhmMywgMHhiNiwgMHg2MiwgMHg5ZSwgMHgxNiwgMHg2ZiwgMHhhZCwgMHg1NiwgMHhjZCwKLQkweDRmLCAweDlhLCAweGI1LCAweDEwLCAweGUzLCAweDE2LCAweGZlLCAweGIyLCAweDUxLCAweGJmLCAweDM1LCAweDg2LAotCTB4YmQsIDB4YTgsIDB4NmQsIDB4ZmYsIDB4NzksIDB4MjMsIDB4NzEsIDB4NzMsIDB4MWQsIDB4NGUsIDB4YWIsIDB4NjIsCi0JMHgzYywgMHg2ZiwgMHhiNiwgMHhiNywgMHhlMywgMHg5YSwgMHg2YiwgMHg3MiwgMHg4YywgMHhjOSwgMHg4NywgMHhjZiwKLQkweDk1LCAweDM4LCAweDNmLCAweGRiLCAweDI5LCAweDM5LCAweGExLCAweGY5LCAweDBjLCAweDgzLCAweGU1LCAweDliLAotCTB4MmIsIDB4ZGMsIDB4MmYsIDB4MTMsIDB4ZTcsIDB4MTUsIDB4NWYsIDB4MzcsIDB4OTMsIDB4YjcsIDB4ZjgsIDB4ZGQsCi0JMHgwYiwgMHhiZiwgMHg5NywgMHhhMywgMHgyZiwgMHgzMSwgMHgyNiwgMHgwNywgMHg3MSwgMHg3ZSwgMHg5NywgMHhlMSwKLQkweDUzLCAweDJkLCAweDk5LCAweGVmLCAweDYyLCAweGYxLCAweDc3LCAweDAwLCAweGU3LCAweDEyLCAweDgyLCAweDhjLAotCTB4NTEsIDB4NDYsIDB4MjksIDB4NTMsIDB4MzgsIDB4YmYsIDB4NzEsIDB4NWIsIDB4ZGUsIDB4MWQsIDB4YTAsIDB4M2MsCi0JMHgwZiwgMHhjOCwgMHg5NSwgMHg4YSwgMHgzYywgMHhlNywgMHgyMCwgMHhjZiwgMHg5NCwgMHhlNSwgMHgxYywgMHg2NCwKLQkweGRhLCAweGYwLCAweGY1LCAweDdlLCAweDdlLCAweDY3LCAweDFkLCAweDgzLCAweGJkLCAweDUyLCAweDFmLCAweGUyLAotCTB4MjUsIDB4ZjAsIDB4YjUsIDB4ZWQsIDB4N2QsIDB4MmIsIDB4MTUsIDB4ZDAsIDB4MWMsIDB4NGUsIDB4NzYsIDB4YjYsCi0JMHhjMSwgMHhmYiwgMHgwZSwgMHgwMCwgMHhkNywgMHg1NywgMHg5ZSwgMHg5MywgMHhmNCwgMHg2YywgMHgzMywgMHhiZiwKLQkweGU3LCAweGVhLCAweGUyLCAweDk5LCAweDY1LCAweGFmLCAweGYwLCAweGRmLCAweGU3LCAweDQ1LCAweGUyLCAweDRkLAotCTB4ZTksIDB4Y2YsIDB4ZjIsIDB4OWEsIDB4NzEsIDB4ZGUsIDB4MjYsIDB4OGMsIDB4MTksIDB4MDQsIDB4OWQsIDB4OWIsCi0JMHgzMSwgMHgzZiwgMHhmNywgMHhiOCwgMHhkYSwgMHgzOCwgMHhkZSwgMHgwZiwgMHg1NSwgMHhlMSwgMHg1MywgMHg3ZCwKLQkweDdhLCAweGFmLCAweGQ1LCAweDM1LCAweGIzLCAweGZkLCAweGNkLCAweGRlLCAweGZiLCAweGYxLCAweDFjLCAweDk0LAotCTB4ZWYsIDB4YzEsIDB4YjcsIDB4ZjQsIDB4ODksIDB4YzksIDB4MmYsIDB4MjksIDB4M2QsIDB4ODcsIDB4YjksIDB4MDIsCi0JMHhmOSwgMHgzNywgMHhhNCwgMHgzOSwgMHg4YywgMHgyYywgMHg2YywgMHhjYiwgMHg1ZSwgMHgxZCwgMHgxZiwgMHg1YiwKLQkweDkxLCAweGVmLCAweGFlLCAweDgwLCAweGM2LCAweGRkLCAweGQ5LCAweGMyLCAweDFhLCAweGU5LCAweDU2LCAweDFkLAotCTB4ZDQsIDB4ZTUsIDB4ZjEsIDB4MzYsIDB4ZWMsIDB4ODUsIDB4NjIsIDB4YjksIDB4MGYsIDB4YzgsIDB4ZjEsIDB4ZDIsCi0JMHgyMCwgMHhlOCwgMHgxMCwgMHg5MywgMHhhNywgMHhlMCwgMHgzNywgMHgzZiwgMHg1MywgMHhiYSwgMHg0MywgMHg5NiwKLQkweDIzLCAweGQ4LCAweDU3LCAweDQ1LCAweGM2LCAweDg2LCAweGU1LCAweGZiLCAweGYzLCAweDA5LCAweGVmLCAweDNhLAotCTB4ZTEsIDB4MmUsIDB4NWIsIDB4M2IsIDB4YjAsIDB4MDcsIDB4Y2EsIDB4MTMsIDB4ZTUsIDB4OGEsIDB4ZTMsIDB4ODIsCi0JMHg4OCwgMHg0NSwgMHgzOCwgMHhlZiwgMHhkMywgMHg0NiwgMHhiNywgMHg2MSwgMHhkZSwgMHg2MiwgMHg4NCwgMHhmMiwKLQkweGNiLCAweGJkLCAweDg1LCAweDNjLCAweDk5LCAweDY1LCAweDVjLCAweGM1LCAweDc3LCAweDM2LCAweDM2LCAweDI5LAotCTB4NTMsIDB4NzMsIDB4MTYsIDB4MDksIDB4YzUsIDB4ODEsIDB4YWUsIDB4OWMsIDB4ODEsIDB4M2YsIDB4OGYsIDB4MmYsCi0JMHg5NywgMHhmZSwgMHg3NywgMHgxNCwgMHhkNCwgMHhhMywgMHhiMCwgMHg5NSwgMHgwNSwgMHhkOCwgMHhjYSwgMHgwMiwKLQkweDZjLCAweDI0LCAweDY0LCAweGUxLCAweDVhLCAweDAxLCAweDM2LCAweGIyLCAweDAwLCAweDFiLCAweDA5LCAweDdkLAotCTB4ZjYsIDB4M2EsIDB4NjIsIDB4YmIsIDB4ZDcsIDB4YzAsIDB4NDMsIDB4YzYsIDB4ZDcsIDB4M2UsIDB4NGEsIDB4NWYsCi0JMHgxYiwgMHg3ZiwgMHhmZiwgMHgwMywgMHg0YywgMHgwMywgMHgzYSwgMHhlMSwgMHhkNCwgMHg3MSwgMHgwMCwgMHgwMCwKLQkweDAwIH07CisJMHhlYywgMHg1YiwgMHg1ZiwgMHg2YywgMHg1YiwgMHhkNywgMHg3OSwgMHhmZiwgMHhlZSwgMHgyMSwgMHgyNSwgMHg1MSwKKwkweGIyLCAweGZlLCAweDVjLCAweGM5LCAweDhjLCAweDQzLCAweDI3LCAweDRhLCAweDQzLCAweDRhLCAweDU3LCAweDEyLAorCTB4MTMsIDB4NjksIDB4ZTksIDB4OTUsIDB4YzYsIDB4MjYsIDB4MmEsIDB4NDYsIDB4MzQsIDB4MmMsIDB4MjksIDB4ZGIsCisJMHg0YSwgMHhlMywgMHgwNywgMHhjNSwgMHhmNSwgMHhkYSwgMHhhYywgMHhlYiwgMHgzMCwgMHg4MSwgMHhiMiwgMHhiMSwKKwkweGVjLCAweDYxLCAweDgzLCAweDY3LCAweGFjLCAweDQxLCAweGI2LCAweGI5LCAweDMwLCAweDQxLCAweDI5LCAweDhlLAorCTB4OTIsIDB4ZDIsIDB4MjIsIDB4NjcsIDB4MmIsIDB4NzMsIDB4YjEsIDB4NjUsIDB4ODAsIDB4NDIsIDB4NDksIDB4NzYsCisJMHhiNiwgMHhkMSwgMHg2MiwgMHhkYSwgMHhiZCwgMHg3NCwgMHg0NSwgMHgxYywgMHgwYiwgMHg4YSwgMHhlNywgMHhlNSwKKwkweGExLCAweDBmLCAweDY5LCAweDE3LCAweDYwLCAweGVkLCAweGQwLCAweDYxLCAweDg2LCAweGUyLCAweGRhLCAweDc5LAorCTB4MjgsIDB4YjYsIDB4NmMsIDB4NDAsIDB4OTYsIDB4NmMsIDB4NzEsIDB4NzMsIDB4ZjcsIDB4ZmIsIDB4OWQsIDB4N2IsCisJMHhhZiwgMHg0YywgMHgyYiwgMHgxYSwgMHg5YSwgMHg4NywgMHgzZCwgMHhkZSwgMHgwMywgMHgwOCwgMHhlNywgMHg5ZSwKKwkweDczLCAweGJlLCAweGYzLCAweDlkLCAweGVmLCAweGZiLCAweGNlLCAweGY3LCAweGY3LCAweGQwLCAweGZlLCAweGMzLAorCTB4NzYsIDB4NjksIDB4MTMsIDB4YWYsIDB4NzUsIDB4ZTAsIDB4MmYsIDB4NzUsIDB4ZWMsIDB4OTksIDB4ZTMsIDB4NjMsCisJMHgwZiwgMHhhNSwgMHgxZSwgMHhlMiwgMHgzOCwgMHhhNCwgMHhjMiwgMHg2MSwgMHhmNiwgMHg4NiwgMHgwNCwgMHgyZCwKKwkweDY4LCAweDQxLCAweDBiLCAweDVhLCAweGQwLCAweDgyLCAweDE2LCAweGI0LCAweGEwLCAweDA1LCAweDJkLCAweDY4LAorCTB4NDEsIDB4MGIsIDB4NWEsIDB4ZDAsIDB4ODIsIDB4MTYsIDB4YjQsIDB4YTAsIDB4MDUsIDB4MmQsIDB4NjgsIDB4NDEsCisJMHgwYiwgMHg1YSwgMHhkMCwgMHg4MiwgMHgxNiwgMHhiNCwgMHhhMCwgMHgwNSwgMHgyZCwgMHg2OCwgMHg0MSwgMHgwYiwKKwkweDVhLCAweGQwLCAweDgyLCAweDE2LCAweGI0LCAweGEwLCAweDA1LCAweDJkLCAweDY4LCAweDQxLCAweDBiLCAweDVhLAorCTB4ZDAsIDB4ODIsIDB4MTYsIDB4YjQsIDB4YTAsIDB4MDUsIDB4MmQsIDB4NjgsIDB4NDEsIDB4MGIsIDB4NWEsIDB4ZDAsCisJMHg4MiwgMHgxNiwgMHhiNCwgMHhhMCwgMHgwNSwgMHhlZCwgMHhmZiwgMHhiMywgMHg4NSwgMHg0NCwgMHg0YywgMHhmNiwKKwkweDFkLCAweGRlLCAweDlmLCAweDQ0LCAweDU0LCAweDNhLCAweDdlLCAweDNjLCAweDZiLCAweDQ5LCAweDI0LCAweDk0LAorCTB4YmUsIDB4ZjIsIDB4ZjQsIDB4OGMsIDB4MjUsIDB4OTIsIDB4YTksIDB4MGQsIDB4YzcsIDB4NzMsIDB4ZjIsIDB4MGIsCisJMHhhNywgMHgxMCwgMHgwZCwgMHgwYiwgMHhlNywgMHhlZiwgMHg0YiwgMHhkZiwgMHgzYSwgMHg3OSwgMHhlOSwgMHg5MSwKKwkweGM0LCAweDdiLCAweDRiLCAweDIxLCAweDg5LCAweDk4LCAweGU5LCAweGI3LCAweDQ2LCAweGNkLCAweDQxLCAweDg5LAorCTB4ZjQsIDB4NjIsIDB4Y2YsIDB4NGIsIDB4NDMsIDB4OTcsIDB4YmIsIDB4YTQsIDB4ZDMsIDB4YzcsIDB4MjUsIDB4NTIsCisJMHgyZCwgMHgyNSwgMHhlYywgMHhmZCwgMHgzMiwgMHg2YywgMHg2ZSwgMHg0OCwgMHg1OCwgMHgzMiwgMHgzOCwgMHhlMywKKwkweDdjLCAweDRkLCAweGE0LCAweDU4LCAweDMyLCAweDg4LCAweDQzLCAweDhhLCAweGI1LCAweDg4LCAweDVjLCAweDBiLAorCTB4MTEsIDB4ZWEsIDB4N2IsIDB4NDYsIDB4YjYsIDB4ZmMsIDB4YjEsIDB4OTMsIDB4MDksIDB4ZTMsIDB4NWMsIDB4MGIsCisJMHhkZiwgMHg3NSwgMHg3ZiwgMHgzZSwgMHgyMiwgMHgyYSwgMHg5ZCwgMHg0OCwgMHg2NiwgMHg0MywgMHg5MywgMHg1MiwKKwkweDVkLCAweDc0LCAweDljLCAweDM5LCAweGZiLCAweDVlLCAweGUwLCAweGU4LCAweDkxLCAweDM5LCAweGNiLCAweDFkLAorCTB4NjcsIDB4ZWQsIDB4MDcsIDB4Y2QsIDB4MDksIDB4YjksIDB4MWIsIDB4NzMsIDB4MjEsIDB4NTEsIDB4ZDYsIDB4M2QsCisJMHhmOCwgMHg4YiwgMHgxYiwgMHhiOSwgMHhiMywgMHhkZiwgMHgzMiwgMHhiMiwgMHhjYiwgMHhlZCwgMHg1MiwgMHgyYywKKwkweDNiLCAweDMyLCAweDYzLCAweDRiLCAweDI2LCAweDZiLCAweGI3LCAweDYyLCAweGZkLCAweDYzLCAweDY3LCAweDY2LAorCTB4NmIsIDB4Y2YsIDB4YjAsIDB4OTksIDB4OTMsIDB4MjYsIDB4YzksIDB4NDQsIDB4NjMsIDB4ODAsIDB4NTksIDB4MzQsCisJMHg3MiwgMHgxNywgMHhmZSwgMHhhZSwgMHg1ZCwgMHhkYSwgMHg0MCwgMHg0ZiwgMHg4YSwgMHhlMywgMHg4ZiwgMHg5ZCwKKwkweDkwLCAweDY1LCAweDYxLCAweDlkLCAweGU3LCAweDYzLCAweDVjLCAweDI3LCAweDVlLCAweDdlLCAweDEzLCAweGU3LAorCTB4MzUsIDB4ZTcsIDB4ZDIsIDB4NTAsIDB4NGMsIDB4YmUsIDB4NWIsIDB4OGYsIDB4Y2EsIDB4NzcsIDB4ZWEsIDB4YTYsCisJMHhiYywgMHg1YSwgMHhlZiwgMHg5NSwgMHhjYiwgMHg3NSwgMHhjNywgMHhmOSwgMHg4ZSwgMHhlZCwgMHgzOCwgMHg2ZiwKKwkweGUxLCAweGVmLCAweDNmLCAweGVkLCAweDJkLCAweDFlLCAweGQwLCAweDBhLCAweGM2LCAweDQ0LCAweGZkLCAweDJmLAorCTB4ZGEsIDB4YTUsIDB4MzMsIDB4MTEsIDB4MTcsIDB4ZDUsIDB4MmUsIDB4YjMsIDB4ZTUsIDB4OTgsIDB4Y2MsIDB4OTUsCisJMHg0YiwgMHhjNiwgMHgxMywgMHgxNywgMHgxNiwgMHg4YywgMHhhOSwgMHgwYiwgMHgxNSwgMHg5YywgMHgxOSwgMHhjNiwKKwkweDljLCAweDE0LCAweDhhLCAweGY2LCAweDJiLCAweDQ2LCAweGFlLCAweDNlLCAweDZmLCAweDFjLCAweGJhLCAweGQwLAorCTB4MDksIDB4MWEsIDB4NzksIDB4ZmUsIDB4MWUsIDB4MjMsIDB4N2IsIDB4ZjYsIDB4OTYsIDB4NjQsIDB4NmQsIDB4Y2EsCisJMHgzOCwgMHg2MSwgMHg3ZSwgMHgwZCwgMHg2MiwgMHhjZiwgMHg5NiwgMHg0OCwgMHg3MywgMHhiMywgMHg0NywgMHhhZiwKKwkweGUzLCAweGE4LCAweGI0LCAweDczLCAweDMyLCAweDliLCAweGIyLCAweGNjLCAweGEyLCAweDkwLCAweDNlLCAweDNkLAorCTB4NzcsIDB4ZDksIDB4YTUsIDB4ZjksIDB4YmMsIDB4OTEsIDB4YmQsIDB4ZDAsIDB4NmUsIDB4ZTQsIDB4Y2UsIDB4ODUsCisJMHg0MSwgMHg4NywgMHhmNCwgMHg4NiwgMHg4NCwgMHhmYiwgMHgwNiwgMHg2MiwgMHg3OSwgMHhhOSwgMHhlMSwgMHgwYywKKwkweDMxLCAweDU1LCAweDlhLCAweDcyLCAweDA1LCAweGNkLCAweGEwLCAweGU1LCAweGJiLCAweDY1LCAweGYwLCAweDUwLAorCTB4MDYsIDB4MGYsIDB4NjUsIDB4ZjIsIDB4MTYsIDB4OTcsIDB4NGIsIDB4NDMsIDB4M2UsIDB4NmYsIDB4OGUsIDB4ZjMsCisJMHgyMywgMHg5YiwgMHhiNCwgMHgyNywgMHhlMiwgMHgxOSwgMHhlNSwgMHhmMywgMHhlOSwgMHgzOCwgMHhmZiwgMHg2MSwKKwkweDkzLCAweDU3LCAweGYyLCAweGUzLCAweDM4LCAweGFmLCAweGRhLCAweDMxLCAweGQwLCAweGVlLCAweDVjLCAweDU2LAorCTB4NTYsIDB4MDksIDB4YmMsIDB4NTgsIDB4YzAsIDB4NGYsIDB4NTksIDB4MmYsIDB4ODAsIDB4ODcsIDB4NzksIDB4ZjAsCisJMHg3NywgMHgxZSwgMHhiYywgMHg1NSwgMHg0MCwgMHhjNywgMHgyZiwgMHgzYiwgMHhhZiwgMHg2MCwgMHhlNCwgMHg4NiwKKwkweGI2LCAweGU0LCAweDE1LCAweGE3LCAweDhjLCAweGYzLCAweDJiLCAweDBhLCAweGIyLCAweGRlLCAweDI1LCAweGY5LAorCTB4MjUsIDB4NTMsIDB4YTYsIDB4NTcsIDB4ZmMsIDB4ZmQsIDB4YmUsIDB4MWUsIDB4MWMsIDB4OTMsIDB4ODMsIDB4ZTUsCisJMHgxZSwgMHhjOCwgMHg4NiwgMHhiMiwgMHg0YywgMHhkOCwgMHgyMiwgMHgwZSwgMHg2NCwgMHg1NCwgMHg0YywgMHgyYSwKKwkweDExLCAweDIzLCAweDZmLCAweDlmLCAweGQ0LCAweGY3LCAweGJmLCAweDYyLCAweDQ5LCAweDI2LCAweDZmLCAweDUzLAorCTB4OGUsIDB4MTIsIDB4Y2YsIDB4ZGIsIDB4ODUsIDB4NTgsIDB4MTgsIDB4ZmEsIDB4YjYsIDB4NjIsIDB4MTUsIDB4Y2MsCisJMHhiMCwgMHg1MCwgMHg4ZSwgMHg4OSwgMHhkOCwgMHgxZiwgMHg0MywgMHg5NiwgMHg0NywgMHg0YiwgMHg5MiwgMHhmOSwKKwkweDUyLCAweGM5LCAweDk3LCAweGIxLCAweDJiLCAweGRmLCAweGM3LCAweDRiLCAweDVmLCAweGVjLCAweDkwLCAweDM2LAorCTB4ZjUsIDB4OTksIDB4MjYsIDB4ZjksIDB4M2QsIDB4ZWMsIDB4MjUsIDB4ZWUsIDB4M2IsIDB4ZjYsIDB4NjIsIDB4OWYsCisJMHgwYiwgMHhlNywgMHhlZSwgMHg0ZCwgMHgzYywgMHgyOSwgMHg0MiwgMHhkOCwgMHg2MiwgMHg3ZiwgMHg5MywgMHhiNiwKKwkweDExLCAweDMxLCAweGIyLCAweDU2LCAweDIxLCAweDE2LCAweDAyLCAweDVjLCAweDVlLCAweDhhLCAweGEzLCAweGRlLAorCTB4NWMsIDB4NTMsIDB4ZDYsIDB4YmEsIDB4MTUsIDB4OWEsIDB4YjMsIDB4MTMsIDB4ZjEsIDB4YTIsIDB4ZGMsIDB4MGEsCisJMHg1ZCwgMHhiNSwgMHhmNSwgMHg1YywgMHg2YiwgMHhkNiwgMHg3MiwgMHg2NCwgMHgxNSwgMHhkOCwgMHg5ZiwgMHg4MywKKwkweDNkLCAweDZjLCAweDgwLCAweGEzLCAweGRmLCAweDJkLCAweGU5LCAweGY5LCAweDBlLCAweGVjLCAweDRmLCAweDM2LAorCTB4MDEsIDB4NjcsIDB4OWIsIDB4MjQsIDB4OTIsIDB4NTUsIDB4Y2MsIDB4NWYsIDB4NzUsIDB4ZTcsIDB4YmIsIDB4NWQsCisJMHhiYywgMHhjNSwgMHhmZSwgMHgzNiwgMHg4ZCwgMHg1YiwgMHhlNCwgMHgxNSwgMHg3NywgMHhmZSwgMHgyZSwgMHgxNywKKwkweDc3LCAweGYxLCAweDAxLCAweGNjLCAweDAzLCAweGZmLCAweGUwLCAweGU0LCAweDkwLCAweGExLCAweGU3LCAweGY3LAorCTB4ZDIsIDB4OWUsIDB4N2UsIDB4YTcsIDB4NzQsIDB4MmIsIDB4YjQsIDB4NmEsIDB4M2IsIDB4OTIsIDB4MWIsIDB4MWQsCisJMHg5YywgMHgxYywgMHgzNCwgMHg1YywgMHg3YywgMHhhNywgMHhkYywgMHg3ZCwgMHhmNywgMHhiOSwgMHhmOCwgMHgwNiwKKwkweDI3LCAweDkzLCAweDg2LCAweDhiLCAweDZmLCAweGE1LCAweGE0LCAweGY3LCAweDRhLCAweGJlLCAweDQ0LCAweGQ4LAorCTB4YzEsIDB4NDksIDB4Y2IsIDB4YjgsIDB4NGYsIDB4YTYsIDB4YmIsIDB4MDcsIDB4MjcsIDB4ZmIsIDB4MGMsIDB4ZjUsCisJMHg5OSwgMHg1ZCwgMHgyZSwgMHgxZiwgMHgwOSwgMHg5ZiwgMHg4NiwgMHg1ZCwgMHg5YSwgMHgwNiwgMHg5ZSwgMHhhYiwKKwkweGU3LCAweDA3LCAweGIyLCAweDU2LCAweGYxLCAweDgxLCAweDVkLCAweGZhLCAweDdjLCAweDllLCAweGE5LCAweGU3LAorCTB4MWUsIDB4MjAsIDB4NWQsIDB4M2MsIDB4N2IsIDB4NjYsIDB4ZjQsIDB4OGUsIDB4NzMsIDB4N2YsIDB4ZTUsIDB4YjYsCisJMHg3YywgMHg3NiwgMHgzYSwgMHg5MywgMHhlNywgMHg0OSwgMHgyNCwgMHg5YywgMHgwZSwgMHg4ZiwgMHhjZSwgMHg5NSwKKwkweDhlLCAweDQ5LCAweGI2LCAweDFjLCAweDk3LCAweGQ5LCAweDkxLCAweDU2LCAweDk5LCAweDM2LCAweGZiLCAweGE3LAorCTB4MGYsIDB4MGEsIDB4N2QsIDB4NGYsIDB4NjQsIDB4NzQsIDB4YzYsIDB4YmIsIDB4YzMsIDB4OWMsIDB4MTgsIDB4MzIsCisJMHgwYiwgMHgxZSwgMHgwZiwgMHhkNiwgMHgyNCwgMHg2MiwgMHgwMCwgMHhiZSwgMHhiZiwgMHgxNiwgMHg5NiwgMHhlNywKKwkweGViLCAweDg2LCAweDM0LCAweDZiLCAweGZiLCAweDRjLCAweDk4LCAweGViLCAweGQwLCAweGMzLCAweDY3LCAweGNiLAorCTB4ZDQsIDB4NjMsIDB4ZWEsIDB4YWMsIDB4NjQsIDB4YWEsIDB4NWEsIDB4NjcsIDB4N2QsIDB4N2IsIDB4NmQsIDB4ZTMsCisJMHhkZCwgMHgxNiwgMHgwYSwgMHgwMiwgMHg3MywgMHg0YywgMHg1YiwgMHg2NiwgMHg1NSwgMHg1YSwgMHgyNCwgMHgzMywKKwkweDI1LCAweDg1LCAweGFhLCAweGJkLCAweDY1LCAweDNmLCAweGIxLCAweDY1LCAweGQ5LCAweDgwLCAweDFlLCAweDg4LAorCTB4OTksIDB4NGQsIDB4NzEsIDB4OWUsIDB4ZjAsIDB4MGQsIDB4YjAsIDB4YTYsIDB4NmIsIDB4N2IsIDB4MjEsIDB4ZDgsCisJMHhkZSwgMHg0YywgMHg4YSwgMHhiMCwgMHg1MiwgMHhkMCwgMHhmZSwgMHhhMiwgMHgwZSwgMHg3ZCwgMHhhYywgMHhkZiwKKwkweGQ3LCAweGUxLCAweGZhLCAweGJiLCAweDA4LCAweDZjLCAweGI0LCAweDFkLCAweDc2LCAweGZlLCAweDE5LCAweGQ4LAorCTB4NjAsIDB4YWYsIDB4OTEsIDB4M2QsIDB4ZTcsIDB4MzgsIDB4ZjAsIDB4M2YsIDB4NTEsIDB4MjUsIDB4YjQsIDB4NDEsCisJMHhkOCwgMHg3YiwgMHg5ZCwgMHg2YiwgMHhlZCwgMHg5OCwgMHgxNywgMHg3MywgMHhkNiwgMHhlZSwgMHgwNiwgMHg4ZiwKKwkweDhlLCAweDMzLCAweDY5LCAweGM3LCAweGE1LCAweDY4LCAweDc3LCAweDYxLCAweDVmLCAweDkzLCAweGY0LCAweDU4LAorCTB4ZDQsIDB4NzksIDB4ZGEsIDB4ZjUsIDB4MmUsIDB4OWMsIDB4NjcsIDB4NzAsIDB4ZGMsIDB4ODksIDB4ZjMsIDB4M2EsCisJMHgzMCwgMHgxNywgMHg5YiwgMHhhNSwgMHgyZCwgMHhhNywgMHhlOCwgMHhiNywgMHg1YywgMHgxZiwgMHgyYSwgMHg3MiwKKwkweDFkLCAweGI0LCAweDcyLCAweDhmLCAweDg2LCAweDhiLCAweGI0LCAweGE0LCAweDUzLCAweDcyLCAweGIzLCAweGI0LAorCTB4NTcsIDB4YWUsIDB4NDUsIDB4MjksIDB4MDMsIDB4ZTAsIDB4MmMsIDB4YzMsIDB4MjcsIDB4NDYsIDB4MGQsIDB4ZDAsCisJMHg0ZiwgMHhiYSwgMHhlOSwgMHgwMywgMHg3NywgMHg3YiwgMHg2MywgMHhlMywgMHg3ZSwgMHhmNywgMHgwYywgMHgzMSwKKwkweDQzLCAweGU5LCAweDRlLCAweGM5LCAweGU5LCAweDM5LCAweDUxLCAweDZhLCAweDc0LCAweDk3LCAweGI3LCAweGRlLAorCTB4NjksIDB4ZWMsIDB4M2YsIDB4YTcsIDB4ZTQsIDB4YzAsIDB4YzMsIDB4ZjAsIDB4NWIsIDB4MzgsIDB4ZWIsIDB4YWEsCisJMHhlNSwgMHgzOCwgMHg1NywgMHhlZCwgMHhmNywgMHg2MSwgMHhmNywgMHg0YSwgMHg5YSwgMHhhYywgMHg2YiwgMHg5ZCwKKwkweGQyLCAweDQ2LCAweDdiLCAweDM2LCAweDFhLCAweDY0LCAweDE4LCAweDkzLCAweDUzLCAweDY1LCAweGVlLCAweDI5LAorCTB4NDgsIDB4ZDgsIDB4MjIsIDB4MGMsIDB4ZTEsIDB4ZmYsIDB4MDUsIDB4NzAsIDB4MjEsIDB4NjksIDB4ODEsIDB4M2QsCisJMHg2ZSwgMHhkOCwgMHg1MSwgMHhkMiwgMHhkYiwgMHhlNSwgMHhjMiwgMHg3NywgMHhlMywgMHgwYywgMHhkMiwgMHg0ZSwKKwkweGZiLCAweDczLCAweGI0LCAweGZkLCAweDY1LCAweDQzLCAweDJhLCAweDMzLCAweGIxLCAweDA4LCAweDZiLCAweDFhLAorCTB4YTEsIDB4YmMsIDB4YjMsIDB4ZGQsIDB4NzAsIDB4ZmYsIDB4MzIsIDB4M2IsIDB4NTQsIDB4MzAsIDB4OTUsIDB4YmUsCisJMHg2ZiwgMHg5MSwgMHg1YywgMHhlOSwgMHg3ZSwgMHg5OSwgMHhiMywgMHg3MSwgMHg5ZSwgMHgxNSwgMHgwNiwgMHhjZCwKKwkweGY0LCAweDM1LCAweDAzLCAweDg1LCAweDkwLCAweDgyLCAweDk1LCAweGY1LCAweDUwLCAweDU2LCAweDNlLCAweGFkLAorCTB4ZmYsIDB4OGMsIDB4ZjMsIDB4MGEsIDB4NDYsIDB4ZDgsIDB4ZTIsIDB4MTksIDB4YmYsIDB4ZTUsIDB4YzksIDB4ODcsCisJMHhiYSwgMHg2NywgMHg0YiwgMHhiNiwgMHhkNCwgMHhjZSwgMHgzMSwgMHhlOCwgMHg2OCwgMHhkMywgMHg3NCwgMHg4NCwKKwkweGQyLCAweGZhLCAweGVlLCAweDBjLCAweDk1LCAweGY2LCAweDYzLCAweDAwLCAweDQxLCAweGVmLCAweGMwLCAweDAzLAorCTB4M2UsIDB4YjgsIDB4ZDcsIDB4YzIsIDB4ZGUsIDB4MDgsIDB4NjgsIDB4ZWMsIDB4NjgsIDB4YTAsIDB4YmYsIDB4OGQsCisJMHhmMCwgMHg5MCwgMHg1NSwgMHhjNCwgMHgzYiwgMHg0MywgMHhmMywgMHg2ZCwgMHhiOCwgMHg3YywgMHhmYiwgMHhiMiwKKwkweDdhLCAweDFkLCAweGIyLCAweGZhLCAweGM4LCAweDM5LCAweDMwLCAweDQ2LCAweDFjLCAweDI5LCAweGUwLCAweDgwLAorCTB4ZGMsIDB4NGQsIDB4ZmEsIDB4MmMsIDB4ZmEsIDB4MjksIDB4NzMsIDB4MGIsIDB4MTcsIDB4NmMsIDB4NDEsIDB4ODUsCisJMHhkMiwgMHhlZCwgMHg5MiwgMHgzMywgMHg3NSwgMHgxYywgMHgwMCwgMHhlYywgMHhiOCwgMHg2OCwgMHgzZiwgMHg2ZiwKKwkweDkxLCAweDQ3LCAweDZmLCAweDZjLCAweDI1LCAweGI0LCAweGRlLCAweGU0LCAweDJiLCAweDhjLCAweDA1LCAweDQ1LAorCTB4ZDAsIDB4YjYsIDB4OWUsIDB4NTAsIDB4OWEsIDB4YjUsIDB4NzYsIDB4YzgsIDB4NWMsIDB4MjIsIDB4NGQsIDB4ZTksCisJMHhiNywgMHg2NCwgMHhiNSwgMHhhNCwgMHhmNiwgMHgzNCwgMHg0YiwgMHg5NywgMHg0YywgMHg0MSwgMHg0NiwgMHhkNSwKKwkweDcxLCAweGM0LCAweGIwLCAweDkxLCAweDc2LCAweDA5LCAweDNkLCAweGM0LCAweDU4LCAweDEwLCAweDAzLCAweGFkLAorCTB4ZWIsIDB4MDksIDB4NTMsIDB4NmUsIDB4MzksIDB4NmEsIDB4MTAsIDB4ZmIsIDB4NDcsIDB4NzAsIDB4MGYsIDB4ODcsCisJMHg3OSwgMHhhNywgMHhjYSwgMHg4MywgMHgyMywgMHg0YywgMHg4OCwgMHgzMiwgMHhlZiwgMHg2OSwgMHgxNiwgMHhlMiwKKwkweGU2LCAweGRhLCAweDcwLCAweGNjLCAweDE0LCAweGNlLCAweDIzLCAweDVlLCAweDRlLCAweDcxLCAweDJmLCAweGY5LAorCTB4NzMsIDB4ZjcsIDB4N2MsIDB4OTIsIDB4M2YsIDB4N2YsIDB4OWQsIDB4MzIsIDB4YTMsIDB4ZWMsIDB4YTAsIDB4NjMsCisJMHhhMCwgMHhhOSwgMHgxYiwgMHg3MiwgMHgxYiwgMHg1ZCwgMHg4MCwgMHg0ZiwgMHhiNCwgMHgxZiwgMHhkNywgMHgzYSwKKwkweGRjLCAweDM3LCAweDc2LCAweGFmLCAweDVjLCAweDgzLCAweGRkLCAweGM1LCAweDk1LCAweDE4LCAweDU1LCAweDdiLAorCTB4YWYsIDB4OWUsIDB4NTMsIDB4OTYsIDB4MmYsIDB4NGYsIDB4Y2EsIDB4NjAsIDB4ZjcsIDB4MzYsIDB4MTksIDB4MTAsCisJMHhlNywgMHhjZSwgMHg3MiwgMHgzOCwgMHg1MiwgMHgyMSwgMHgwZCwgMHgyZSwgMHgyZCwgMHg3MywgMHhkNiwgMHg3YSwKKwkweDIyLCAweDJjLCAweDhkLCAweGY0LCAweDdjLCAweGVjLCAweDI4LCAweGNiLCAweDJhLCAweGY0LCAweDI5LCAweGUyLAorCTB4NmYsIDB4MTYsIDB4YjUsIDB4MjcsIDB4MmMsIDB4NGYsIDB4OGMsIDB4MTksIDB4MTIsIDB4M2YsIDB4YTQsIDB4ZTQsCisJMHhkMCwgMHhjMywgMHhjNCwgMHhmOSwgMHgxMywgMHhmMiwgMHgzOCwgMHg5ZSwgMHhlMSwgMHhmYSwgMHgxOCwgMHg3NSwKKwkweDIxLCAweDhjLCAweDVlLCAweGYzLCAweDg3LCAweGI5LCAweDQ2LCAweDVkLCAweDdmLCAweGRkLCAweGQzLCAweGY1LAorCTB4OGYsIDB4OWMsIDB4NDMsIDB4NjMsIDB4NjEsIDB4MGYsIDB4MzYsIDB4ZDIsIDB4MDAsIDB4MmIsIDB4YjgsIDB4ZWYsCisJMHg5ZCwgMHg2MCwgMHgwOSwgMHhkMywgMHhhOCwgMHgxNywgMHg4NCwgMHgyZCwgMHhlYywgMHgwMCwgMHg4YiwgMHhlMCwKKwkweGY0LCAweDE1LCAweGRhLCAweDUwLCAweGI3LCAweGU3LCAweDMzLCAweDdjLCAweDliLCAweGUyLCAweDM5LCAweGVjLAorCTB4NzcsIDB4YjIsIDB4M2YsIDB4ZWUsIDB4ZTMsIDB4N2UsIDB4YzIsIDB4NmYsIDB4OGYsIDB4YTcsIDB4YjgsIDB4MDYsCisJMHhkOSwgMHgzMSwgMHhhNiwgMHhhMiwgMHg0ZCwgMHhlMiwgMHg1YiwgMHhjMSwgMHhmZiwgMHgzNCwgMHhjNiwgMHg1NiwKKwkweGNlLCAweDk5LCAweDE4LCAweDRmLCAweGEwLCAweGI3LCAweDI0LCAweDVmLCAweGEzLCAweDFkLCAweDcxLCAweDNmLAorCTB4NjMsIDB4ZWQsIDB4YmIsIDB4OWUsIDB4ZWYsIDB4NmMsIDB4OWYsIDB4MGUsIDB4YTcsIDB4YTMsIDB4ZjAsIDB4OWQsCisJMHgzMiwgMHg1NSwgMHgyYywgMHg5ZCwgMHg0NCwgMHgzZSwgMHgyNCwgMHg4NSwgMHg3YiwgMHhkMiwgMHhkNCwgMHg4YiwKKwkweGY2LCAweDcxLCAweGY4LCAweGM2LCAweGE5LCAweDYyLCAweDhkLCAweDM5LCAweDExLCAweGRjLCAweDE3LCAweGY2LAorCTB4MjEsIDB4M2UsIDB4NDcsIDB4ZDQsIDB4NDIsIDB4YTQsIDB4NzAsIDB4NmYsIDB4OWEsIDB4M2UsIDB4MzksIDB4MmUsCisJMHhmMSwgMHhkYSwgMHg3YiwgMHhjOCwgMHgzOSwgMHg0YywgMHhjOSwgMHg2YSwgMHgxZCwgMHhmYiwgMHhmNiwgMHg1ZSwKKwkweGQyLCAweDVjLCAweDQ0LCAweGZlLCAweDEwLCAweDRlLCAweDRiLCAweDU4LCAweGE1LCAweDliLCAweDIzLCAweGIzLAorCTB4YTksIDB4NzYsIDB4ZTQsIDB4NTksIDB4OTMsIDB4N2IsIDB4ZDUsIDB4ZGEsIDB4YzEsIDB4YmQsIDB4YTEsIDB4YjUsCisJMHgzZCwgMHhkMywgMHg0ZCwgMHhlOSwgMHhjMiwgMHg1ZSwgMHhiNSwgMHgyMCwgMHhiMiwgMHg1YywgMHgxMiwgMHg4NSwKKwkweDljLCAweDI2LCAweDc2LCAweDQ0LCAweDMwLCAweDVlLCAweGZiLCAweGYyLCAweDk3LCAweDU1LCAweDNhLCAweDI0LAorCTB4ZjksIDB4YTgsIDB4OWMsIDB4NTgsIDB4NDksIDB4ODUsIDB4OTksIDB4M2YsIDB4YzYsIDB4YTcsIDB4ZTQsIDB4MDQsCisJMHg3MiwgMHhjNiwgMHg2NywgMHg2NCwgMHhiNiwgMHgwNCwgMHhiYSwgMHgzNCwgMHhkZiwgMHgzMSwgMHhmMCwgMHhkYiwKKwkweDBiLCAweGRjLCAweGE0LCAweDNkLCAweDBhLCAweGRmLCAweGVhLCAweGQyLCAweDBlLCAweDlhLCAweDMzLCAweDM5LAorCTB4ZTYsIDB4NDgsIDB4MjksIDB4YzYsIDB4OTQsIDB4ZjcsIDB4YTAsIDB4MjcsIDB4YjQsIDB4OTMsIDB4OWYsIDB4Y2IsCisJMHhhYSwgMHhkNSwgMHgyYSwgMHg3OSwgMHhkNywgMHgyZiwgMHg2OCwgMHgzZCwgMHgwZCwgMHhhNywgMHhkZiwgMHhmNSwKKwkweGQ2LCAweGFlLCAweDYzLCAweDhkLCAweGZhLCAweGJhLCAweGFiLCAweGUxLCAweGVlLCAweGJlLCAweGE1LCAweGYzLAorCTB4OWMsIDB4YWIsIDB4MzYsIDB4YmYsIDB4MDksIDB4ZmIsIDB4ODMsIDB4NTEsIDB4MTcsIDB4ZjYsIDB4Y2QsIDB4ZDEsCisJMHg1NSwgMHhlYiwgMHgyYiwgMHg1ZCwgMHhkMiwgMHg4NiwgMHg3MywgMHhjYSwgMHgzYywgMHgyNywgMHg0YSwgMHhkZiwKKwkweDhhLCAweGY1LCAweDZiLCAweDFlLCAweGFlLCAweDlmLCAweDAyLCAweDU3LCAweDNiLCAweGU5LCAweDQ2LCAweDBiLAorCTB4NjMsIDB4MWQsIDB4ZjQsIDB4MjEsIDB4ZGYsIDB4YzksIDB4NmYsIDB4ZjksIDB4MTgsIDB4YzIsIDB4YmUsIDB4ZTYsCisJMHhlMSwgMHhmYSwgMHg1ZSwgMHgwMywgMHgyZSwgMHhhZSwgMHhiMSwgMHhlNywgMHg5OSwgMHgzOCwgMHhiYiwgMHg4ZCwKKwkweGJjLCAweDkxLCAweDFmLCAweGRlLCAweDAxLCAweGVmLCAweDIzLCAweDY5LCAweDRjLCAweGMxLCAweGE3LCAweDRmLAorCTB4ZDUsIDB4NzUsIDB4NWUsIDB4NjcsIDB4ZTQsIDB4Y2EsIDB4YzgsIDB4YjcsIDB4ZWEsIDB4MmYsIDB4ODIsIDB4NDYsCisJMHhlNCwgMHg2MSwgMHhmNSwgMHgwMSwgMHgyZiwgMHhkNywgMHhhNiwgMHhhZCwgMHhhYywgMHg2YiwgMHg5ZiwgMHg0NSwKKwkweDdmLCAweDUzLCAweGQ0LCAweGY2LCAweDc0LCAweDA1LCAweDYzLCAweDlkLCAweDY3LCAweGUzLCAweDZlLCAweGFlLAorCTB4NDgsIDB4NWYsIDB4YWQsIDB4ZGMsIDB4ZTUsIDB4ZmUsIDB4YmYsIDB4NmQsIDB4NTMsIDB4NDIsIDB4ZmEsIDB4M2UsCisJMHgxOSwgMHhkNywgMHhhOCwgMHg2NywgMHg3NywgMHhjMywgMHg5ZiwgMHgzYiwgMHgxZiwgMHgzMCwgMHhiZSwgMHg0YywKKwkweDMxLCAweGY2LCAweDRjLCAweDMxLCAweDY2LCAweDE4LCAweDllLCAweDFmLCAweDhjLCAweDM3LCAweGUwLCAweDg4LAorCTB4MDMsIDB4YzcsIDB4NzksIDB4NGYsIDB4NmYsIDB4NGYsIDB4N2IsIDB4YjgsIDB4ZmMsIDB4ZGMsIDB4ZDMsIDB4ZjcsCisJMHhhNSwgMHgyZiwgMHhkZCwgMHg3MywgMHhlNywgMHhiYSwgMHg2MSwgMHhiYSwgMHhlMywgMHg2NiwgMHhlZCwgMHg4NywKKwkweDYxLCAweGY3LCAweGEwLCAweDNmLCAweDNlLCAweGFkLCAweGEwLCAweDVmLCAweGI5LCAweDlhLCAweDdiLCAweDFmLAorCTB4YjAsIDB4NzEsIDB4ZTgsIDB4MWUsIDB4M2YsIDB4ZmQsIDB4YmIsIDB4NzUsIDB4NzMsIDB4NmYsIDB4NTcsIDB4MDYsCisJMHhiYywgMHhkMywgMHgwYywgMHhmOSwgMHhjZSwgMHg4NCwgMHg0OSwgMHg0YiwgMHg3ZCwgMHgxMiwgMHhmYiwgMHhlNSwKKwkweDE4LCAweDYzLCAweDYyLCAweDFlLCAweDdjLCAweDFjLCAweDMxLCAweDg3LCAweGNkLCAweDU5LCAweGUyLCAweDhlLAorCTB4MGEsIDB4NzAsIDB4MjIsIDB4OGYsIDB4NGMsIDB4YjcsIDB4NzgsIDB4ZjcsIDB4ZmMsIDB4N2QsIDB4OWUsIDB4MGYsCisJMHhkYywgMHhiYiwgMHgzOCwgMHg0NiwgMHhmZiwgMHg3ZCwgMHg4ZiwgMHg5ZSwgMHgxYiwgMHg5ZCwgMHgyZSwgMHgzZCwKKwkweGZlLCAweGZhLCAweDgwLCAweDc5LCAweGU3LCAweDc4LCAweDc1LCAweGFmLCAweDI3LCAweDRmLCAweDdjLCAweDNmLAorCTB4ZTMsIDB4ZDEsIDB4YzUsIDB4YmIsIDB4NjksIDB4YTQsIDB4ODksIDB4ZjcsIDB4ZjIsIDB4NWYsIDB4YzAsIDB4YTMsCisJMHhmMywgMHg4YywgMHg4MiwgMHg0YSwgMHgyMywgMHg2ZiwgMHg0OSwgMHgzMSwgMHg1NiwgMHhjMSwgMHhlNiwgMHhjNSwKKwkweGMyLCAweDlkLCAweDI0LCAweGVjLCAweDY5LCAweGVjLCAweDdhLCAweGI3LCAweGM0LCAweDdiLCAweGJlLCAweDA1LAorCTB4MWYsIDB4Y2QsIDB4N2IsIDB4ZmYsIDB4NTAsIDB4ZTYsIDB4NGEsIDB4ZmQsIDB4NzYsIDB4YjMsIDB4NDEsIDB4N2IsCisJMHg0ZCwgMHgyNCwgMHhjZiwgMHhjYiwgMHhiMCwgMHg3ZCwgMHg1ZSwgMHhlNywgMHg0ZiwgMHg4OSwgMHhmOCwgMHgyOSwKKwkweGExLCAweDZjLCAweDZmLCAweGM5LCAweDgwLCAweGNlLCAweDZiLCAweDNlLCAweDE0LCAweDBiLCAweDcyLCAweDk5LAorCTB4MmEsIDB4YzMsIDB4YzYsIDB4YzYsIDB4ZmUsIDB4Y2QsIDB4ZDEsIDB4ZjksIDB4MjgsIDB4ZjIsIDB4YTUsIDB4MWIsCisJMHgzYiwgMHhlMCwgMHg3YSwgMHg1MywgMHhlMywgMHgyMSwgMHhiZSwgMHg0NiwgMHg1YywgMHg4NiwgMHhiNCwgMHg4YywKKwkweGY5LCAweGY4LCAweDJjLCAweDk5LCAweGFmLCAweGZiLCAweDM4LCAweGMzLCAweGYwLCAweGMzLCAweGYwLCAweDAxLAorCTB4NjMsIDB4YmYsIDB4ZTEsIDB4ZTksIDB4MGIsIDB4YmYsIDB4N2YsIDB4ZTgsIDB4MzAsIDB4MDcsIDB4NTIsIDB4ZTksCisJMHgzZiwgMHhmNywgMHhlNiwgMHhhZSwgMHg1MCwgMHgwNiwgMHgxOCwgMHhmYiwgMHg3MiwgMHg3ZiwgMHhkMSwgMHhmMywKKwkweDM5LCAweDA1LCAweDIzLCAweDUzLCAweGE3LCAweDBjLCAweGE4LCAweDJiLCAweGI4LCAweDdmLCAweGFkLCAweDlmLAorCTB4YjAsIDB4OTksIDB4ZjIsIDB4MTcsIDB4MTAsIDB4MWYsIDB4YmIsIDB4ZGQsIDB4YmMsIDB4MDEsIDB4YjUsIDB4NTUsCisJMHhhNiwgMHhjZSwgMHhiOSwgMHhmNSwgMHg5NiwgMHhhYywgMHhkZCwgMHhlNCwgMHhkOSwgMHhkMiwgMHg0MSwgMHhjYywKKwkweDRkLCAweGUxLCAweDhmLCAweGIyLCAweDIzLCAweGNjLCAweDYxLCAweDdjLCAweDY3LCAweDNjLCAweDM4LCAweDE5LAorCTB4Y2YsIDB4MjIsIDB4NjYsIDB4NjUsIDB4MGUsIDB4NGYsIDB4NjAsIDB4NmMsIDB4NzgsIDB4MzUsIDB4OTYsIDB4OTYsCisJMHg3YiwgMHgwNSwgMHgzOSwgMHgwYSwgMHhlNCwgMHgzOSwgMHgwMCwgMHg3ZSwgMHhlMiwgMHgzMiwgMHg1MSwgMHhjNywKKwkweDlkLCAweDZmLCAweGY5LCAweGIzLCAweDJkLCAweDk4LCAweGMyLCAweDZkLCAweDE4LCAweGQ3LCAweGY3LCAweDRkLAorCTB4ZDQsIDB4N2YsIDB4ZWMsIDB4ZDAsIDB4MWYsIDB4ZmMsIDB4YWQsIDB4YjYsIDB4OTcsIDB4NzgsIDB4NDMsIDB4ZGUsCisJMHg5NywgMHgzMSwgMHg5ZSwgMHgyOCwgMHg0ZiwgMHgxYSwgMHg4NywgMHhjYSwgMHhkYywgMHhhMywgMHg1ZSwgMHhlYSwKKwkweDExLCAweDJiLCAweDllLCAweDU1LCAweGM4LCAweDUxLCAweGM3LCAweDNhLCAweDcxLCAweGU2LCAweDI5LCAweGU4LAorCTB4NDYsIDB4YzEsIDB4OTgsIDB4MWEsIDB4ZWEsIDB4OTIsIDB4N2MsIDB4YjIsIDB4MDcsIDB4MzQsIDB4M2YsIDB4ODIsCisJMHgxZSwgMHhiMSwgMHhjMywgMHhmYSwgMHgzNSwgMHhjYywgMHg0MywgMHg4ZiwgMHg5MiwgMHhiNCwgMHg4ZiwgMHg1NiwKKwkweDVkLCAweDU3LCAweDRlLCAweGViLCAweGI4LCAweDM1LCAweGUwLCAweGU5LCAweGQ2LCAweDNmLCAweDk5LCAweGFlLAorCTB4MmUsIDB4M2QsIDB4OGQsIDB4ZjEsIDB4MmUsIDB4Y2MsIDB4ZmYsIDB4MjYsIDB4N2EsIDB4YzQsIDB4YWMsIDB4MzEsCisJMHg3ZiwgMHg5ZSwgMHgzNiwgMHgzOCwgMHg4ZSwgMHhmOSwgMHhjZiwgMHgwMSwgMHhjNywgMHg5ZiwgMHhlMCwgMHhmYiwKKwkweDdlLCAweDdjLCAweGZmLCAweGQxLCAweGI2LCAweGJkLCAweGRmLCAweGUwLCAweGQ5LCAweDk4LCAweGNmLCAweDZlLAorCTB4OWIsIDB4ZjcsIDB4ZmQsIDB4YjcsIDB4OGUsIDB4OTMsIDB4ZDIsIDB4YmQsIDB4MDYsIDB4YzYsIDB4ZDcsIDB4MjIsCisJMHhiMiwgMHhmYiwgMHg3YywgMHg5YiwgMHhhOCwgMHhhYSwgMHhlYiwgMHhjMywgMHg1NSwgMHhkNSwgMHg5NCwgMHg5ZSwKKwkweGYzLCAweGY0LCAweGRmLCAweDNmLCAweGMyLCAweDFlLCAweDRiLCAweGQ0LCAweDFhLCAweDJlLCAweDhkLCAweDc3LAorCTB4YWIsIDB4NmQsIDB4ZjQsIDB4OTksIDB4ZTMsIDB4N2QsIDB4NGIsIDB4ZWMsIDB4MGIsIDB4YzcsIDB4NDcsIDB4NmIsCisJMHg4NCwgMHhlMSwgMHhmNywgMHg4OSwgMHhlMywgMHg3ZCwgMHhiNSwgMHg5ZiwgMHgwMCwgMHgxNiwgMHg3MiwgMHgyOSwKKwkweGZiLCAweGY4LCAweDA5LCAweGZmLCAweGRhLCAweGI2LCAweDMzLCAweGI1LCAweDZjLCAweDcxLCAweDI2LCAweGVkLAorCTB4ZmUsIDB4OTksIDB4ZTMsIDB4ZDksIDB4MGEsIDB4ZjMsIDB4ODMsIDB4NDQsIDB4NGMsIDB4NzQsIDB4MWUsIDB4NWUsCisJMHgzOCwgMHgzZSwgMHg1MywgMHgwYSwgMHg0YiwgMHg0OCwgMHhkMywgMHhlMiwgMHhhZiwgMHg3MywgMHg4ZCwgMHhmNywKKwkweGIwLCAweDEzLCAweDZkLCAweGE0LCAweGFiLCAweDExLCAweDBmLCAweGUzLCAweDBjLCAweGYxLCAweDljLCAweDAwLAorCTB4OWUsIDB4MjQsIDB4ZjAsIDB4MzAsIDB4ZGUsIDB4YjgsIDB4ZjQsIDB4YzYsIDB4OTcsIDB4NzYsIDB4YTIsIDB4OGQsCisJMHhiOCwgMHg3OCwgMHg5NiwgMHg4ZiwgMHhhZiwgMHg0NywgMHhkNCwgMHhmOSwgMHhiNywgMHg0OSwgMHhhZiwgMHhjOSwKKwkweDljLCAweGQ2LCAweGY1LCAweDM1LCAweDRkLCAweDkyLCAweDNmLCAweDhiLCAweGRjLCAweGM2LCAweDFlLCAweGYzLAorCTB4YzYsIDB4NzcsIDB4OWIsIDB4YWMsIDB4YjcsIDB4ZTMsIDB4OGEsIDB4ZjMsIDB4ZWMsIDB4YjEsIDB4OTYsIDB4OGEsCisJMHg2MywgMHgwZSwgMHhlMywgMHg2NSwgMHgxZiwgMHg1NiwgMHg3OSwgMHhiMCwgMHgxZCwgMHgwZCwgMHg3YywgMHgzNywKKwkweDc5LCAweGIyLCAweGU2LCAweDk5LCAweDdlLCAweGRkLCAweGQ5LCAweDQ4LCAweDBiLCAweDQwLCAweDcxLCAweDBmLAorCTB4ZGQsIDB4NWIsIDB4ZjcsIDB4ZTAsIDB4ZjMsIDB4ODksIDB4ODUsIDB4MzUsIDB4ZDIsIDB4OTYsIDB4MDQsIDB4YWYsCisJMHgzZSwgMHg2ZCwgMHg5ZiwgMHhmNiwgMHhmZSwgMHhiOCwgMHgzNywgMHg4OSwgMHgzZiwgMHhmZiwgMHgzYywgMHg1ZiwKKwkweDA2LCAweGE0LCAweDhiLCAweDNkLCAweDc0LCAweGY5LCAweDEzLCAweDc1LCAweDczLCAweDEyLCAweDc2LCAweGM3LAorCTB4MzcsIDB4MTAsIDB4YzcsIDB4NTksIDB4YjUsIDB4MjksIDB4ZmIsIDB4MTYsIDB4ZGMsIDB4YmIsIDB4ZjYsIDB4YjEsCisJMHhhOCwgMHgyMSwgMHgxNCwgMHg3MywgMHhiOSwgMHgzOCwgMHhlYiwgMHhkNSwgMHhhMywgMHhiMiwgMHgwOSwgMHg1YywKKwkweDE5LCAweGQ0LCAweDk0LCAweDZlLCAweDVkLCAweDM0LCAweDBkLCAweGZmLCAweGI4LCAweDBlLCAweGZkLCAweGJjLAorCTB4NmEsIDB4ZjEsIDB4MmQsIDB4MjYsIDB4Y2MsIDB4NzgsIDB4MjcsIDB4YzUsIDB4ZGEsIDB4Y2YsIDB4MDEsIDB4YzMsCisJMHgzYywgMHhlYSwgMHhmNiwgMHgzYiwgMHhjYiwgMHgxMiwgMHg2MCwgMHg5NiwgMHhiMSwgMHg3NiwgMHhjYSwgMHhmNSwKKwkweGNiLCAweGY0LCAweGVkLCAweGM4LCAweGE5LCAweDUwLCAweGMzLCAweDU4LCAweGZmLCAweGUzLCAweGU0LCAweGEzLAorCTB4OGQsIDB4YjAsIDB4M2IsIDB4YmQsIDB4ODMsIDB4MjAsIDB4ZTYsIDB4MmMsIDB4MjYsIDB4ZTYsIDB4OTcsIDB4ZTAsCisJMHhjMywgMHgyYiwgMHg5NiwgMHhkYSwgMHhhZCwgMHhiNCwgMHg0NiwgMHgyNiwgMHgyYSwgMHhmMCwgMHg0OSwgMHhhOCwKKwkweDc4LCAweDEzLCAweGYxLCAweDI1LCAweDc5LCAweDVmLCAweGRmLCAweDQzLCAweDkzLCAweDM1LCAweDZjLCAweGY2LAorCTB4YTgsIDB4YWYsIDB4NTIsIDB4YWYsIDB4MzQsIDB4ZTUsIDB4YTEsIDB4MzMsIDB4ODgsIDB4Y2IsIDB4MjMsIDB4NGYsCisJMHgyMCwgMHhlNiwgMHg0MCwgMHg1ZSwgMHg2NywgMHgwYSwgMHhhOCwgMHhlMiwgMHhhOSwgMHgyMywgMHgzZiwgMHhmOCwKKwkweDgzLCAweDE5LCAweGNiLCAweGNkLCAweGZmLCAweDc1LCAweDNjLCAweDEzLCAweDk3LCAweGM3LCAweGQwLCAweDk5LAorCTB4NzYsIDB4ZWQsIDB4NjcsIDB4ZjIsIDB4ZGEsIDB4ZGYsIDB4ZjQsIDB4OWIsIDB4NTMsIDB4YWEsIDB4MGQsIDB4MzksCisJMHgwNiwgMHgxMiwgMHg0ZiwgMHg2NCwgMHgzOCwgMHhlNiwgMHhhMCwgMHg0OCwgMHgxZiwgMHhmMywgMHg0ZSwgMHhmOCwKKwkweGUxLCAweGJlLCAweDM1LCAweDc4LCAweGI3LCAweDMzLCAweDg0LCAweDU3LCAweDEyLCAweDNlLCAweDEzLCAweDkyLAorCTB4YTYsIDB4MzMsIDB4N2MsIDB4MGIsIDB4OTEsIDB4M2QsIDB4YTgsIDB4YzMsIDB4ODgsIDB4YjMsIDB4MmYsIDB4OGMsCisJMHg3ZSwgMHgwMiwgMHg3ZiwgMHhmYiwgMHg5MCwgMHg1ZiwgMHg5OSwgMHhjOCwgMHg4ZCwgMHg3NywgMHg4MCwgMHgwNywKKwkweDJjLCAweGY3LCAweGVjLCAweDA0LCAweGRmLCAweGQ1LCAweDJkLCAweDZkLCAweDExLCAweGVjLCAweDIxLCAweDNjLAorCTB4ZjIsIDB4NDMsIDB4NmIsIDB4MGYsIDB4ZTgsIDB4NzEsIDB4Y2YsIDB4MjcsIDB4OGUsIDB4ZjAsIDB4MTksIDB4OTEsCisJMHhmZSwgMHgwNSwgMHhlOSwgMHg1MSwgMHg3YSwgMHg0ZiwgMHg1OCwgMHg2NiwgMHg1MiwgMHg1YywgMHg2YiwgMHgwNywKKwkweDNjLCAweGY3LCAweDYxLCAweDRkLCAweGVmLCAweDczLCAweGRmLCAweDk0LCAweGYyLCAweGI3LCAweGU5LCAweGM2LAorCTB4OWMsIDB4ODEsIDB4NmYsIDB4ZTQsIDB4NTMsIDB4MjksIDB4NTMsIDB4ZmEsIDB4YWIsIDB4MmUsIDB4NmMsIDB4ZGYsCisJMHhkYSwgMHg1MywgMHhkZCwgMHg3YywgMHg5NywgMHg1MiwgMHg5NiwgMHg0YiwgMHg5YiwgMHg0MiwgMHhlZSwgMHg5YiwKKwkweDg3LCAweDU0LCAweGMzLCAweDgzLCAweDdjLCAweDliLCAweDIxLCAweDBjLCAweGViLCAweGQ5LCAweDJlLCAweDBkLAorCTB4NjMsIDB4MGUsIDB4NTIsIDB4N2UsIDB4ZWUsIDB4OWMsIDB4NTIsIDB4ZmYsIDB4ZDcsIDB4OWIsIDB4NGIsIDB4NjMsCisJMHg0ZSwgMHhhMSwgMHg2ZCwgMHgwNSwgMHhmYiwgMHhiZiwgMHhhOSwgMHg2ZCwgMHg0NSwgMHg1NCwgMHhkYywgMHhiMywKKwkweDE1LCAweDhjLCAweDk3LCAweDM5LCAweGY2LCAweDYzLCAweGYxLCAweGYxLCAweDdiLCAweDVjLCAweDdmLCAweGVmLAorCTB4YzgsIDB4YWMsIDB4Y2QsIDB4ZjcsIDB4MGIsIDB4NDcsIDB4YWUsIDB4ZGEsIDB4MDUsIDB4ZTMsIDB4YzAsIDB4MWQsCisJMHg3OSwgMHg2NiwgMHg1MiwgMHhjNywgMHhlNywgMHgxOSwgMHhjOCwgMHg3ZSwgMHhiMywgMHhhNiwgMHg2YiwgMHgzNSwKKwkweGI5LCAweDU2LCAweDhiLCAweGM4LCAweDNiLCAweDJiLCAweDZkLCAweGIyLCAweGI5LCAweGU0LCAweGVhLCAweGZjLAorCTB4ZTYsIDB4MTIsIDB4ZjUsIDB4ZGMsIDB4OTQsIDB4OWYsIDB4YWQsIDB4NTgsIDB4NTgsIDB4NGIsIDB4ZTIsIDB4YWYsCisJMHg0NywgMHg2ZSwgMHhhYywgMHhkYywgMHg5OSwgMHg3NywgMHg1ZSwgMHhhZSwgMHgzZiwgMHgwYSwgMHg1YSwgMHg3YSwKKwkweDI0LCAweDY0LCAweDM5LCAweGJhLCAweGVlLCAweGNhLCAweDIxLCAweGY2LCAweDE1LCAweDY0LCAweDQyLCAweGYyLAorCTB4ZTUsIDB4N2UsIDB4ZDQsIDB4N2UsIDB4MDgsIDB4Y2UsIDB4NjEsIDB4YzYsIDB4MjAsIDB4ZGMsIDB4N2YsIDB4ZjksCisJMHhmMywgMHhjOCwgMHg0ZCwgMHgxMiwgMHgzMCwgMHg5ZSwgMHg3ZSwgMHhmZCwgMHhhNiwgMHhmOCwgMHhjNSwgMHg3MCwKKwkweDhmLCAweDM0LCAweDViLCAweGRmLCAweGVjLCAweDc2LCAweDYzLCAweDk1LCAweGU5LCAweGQ2LCAweGE3LCAweDk2LAorCTB4MWYsIDB4YWYsIDB4ZGYsIDB4MDQsIDB4ZWUsIDB4MTEsIDB4ZTgsIDB4MjksIDB4NzUsIDB4ZDMsIDB4ODYsIDB4Y2UsCisJMHg5YSwgMHhiMiwgMHgzYSwgMHg5NCwgMHhhOCwgMHgxNCwgMHg4NCwgMHhmZSwgMHgyMSwgMHhjNSwgMHg3YywgMHgxMSwKKwkweGZiLCAweDkyLCAweDkwLCAweDQ3LCAweGFiLCAweGNlLCAweDg1LCAweDMyLCAweDBhLCAweDc3LCAweGJiLCAweDMwLAorCTB4MjcsIDB4ZjksIDB4ZmEsIDB4ZWYsIDB4NjMsIDB4M2UsIDB4MjMsIDB4ZDMsIDB4ZjUsIDB4NzEsIDB4OWMsIDB4NzUsCisJMHgxYSwgMHg3YSwgMHhmYiwgMHg2MCwgMHg4ZiwgMHhiNCwgMHhmMSwgMHg5YywgMHgxNCwgMHg2OCwgMHg3YywgMHg0NCwKKwkweDY2LCAweGNlLCAweGNlLCAweGM5LCAweDkxLCAweDMyLCAweGU5LCAweGU0LCAweDFiLCAweDYzLCAweDIyLCAweDk5LAorCTB4OTMsIDB4ZTEsIDB4ZjgsIDB4MGEsIDB4NzIsIDB4MjcsIDB4ZDcsIDB4MWUsIDB4ZDMsIDB4MzIsIDB4NzMsIDB4MGUsCisJMHgzOCwgMHhjYSwgMHhhYywgMHhmZiwgMHhmYiwgMHhhMSwgMHgzNywgMHhjMywgMHhiYSwgMHg3ZSwgMHg5OSwgMHhkNiwKKwkweDdlLCAweDg3LCAweGYzLCAweDZmLCAweGUzLCAweDllLCAweGZhLCAweDBiLCAweGZiLCAweDAwLCAweDk3LCAweDQ3LAorCTB4YWQsIDB4MzMsIDB4ODUsIDB4N2MsIDB4NzksIDB4YjksIDB4OGMsIDB4M2EsIDB4Y2YsIDB4MGUsIDB4MzEsIDB4ZjcsCisJMHg1MiwgMHhlYSwgMHhhMSwgMHg1ZSwgMHhhOSwgMHg5NiwgMHg4NywgMHg0ZCwgMHhhNSwgMHg5OCwgMHg1MywgMHhmMSwKKwkweDJlLCAweGI4LCAweDQ2LCAweGZiLCAweDhlLCAweGE5LCAweGIwLCAweGQ1LCAweDJiLCAweDJiLCAweGU1LCAweDAyLAorCTB4ZWEsIDB4NjUsIDB4ZTUsIDB4YmQsIDB4NjcsIDB4MTQsIDB4YzQsIDB4YjQsIDB4NWMsIDB4YmYsIDB4YTcsIDB4NmIsCisJMHgxYiwgMHhlNiwgMHg5ZiwgMHhmNSwgMHgyZiwgMHg4MCwgMHhjNiwgMHgwYywgMHgyZSwgMHhmMywgMHgyNCwgMHhlOCwKKwkweGMzLCAweGY3LCAweDMyLCAweDc0LCAweDdjLCAweDgxLCAweDM5LCAweDVjLCAweDA2LCAweDZiLCAweDY5LCAweDM5LAorCTB4NzYsIDB4NjEsIDB4MGEsIDB4MzQsIDB4NzQsIDB4NGEsIDB4ZmYsIDB4OWYsIDB4ZDEsIDB4YzYsIDB4OWUsIDB4YzQsCisJMHgxYywgMHhjNywgMHgwOSwgMHhlOCwgMHhlYiwgMHhkNywgMHhmMSwgMHg0ZCwgMHhkOCwgMHgxOCwgMHg3YSwgMHhjYSwKKwkweGExLCAweDE3LCAweGJkLCAweDA5LCAweDVhLCAweDU4LCAweDA3LCAweDQzLCAweGZlLCAweDg3LCAweGUzLCAweDUyLAorCTB4M2QsIDB4ZmIsIDB4YjAsIDB4NGMsIDB4MmYsIDB4M2YsIDB4MGMsIDB4ZmMsIDB4ZmYsIDB4OGEsIDB4YmEsIDB4MDAsCisJMHhmMSwgMHg2ZCwgMHg5OSwgMHg2NywgMHgzMSwgMHhmZiwgMHhlMywgMHgzOSwgMHgxMCwgMHgxMCwgMHg2ZCwgMHg2MywKKwkweDgxLCAweGYzLCAweGVjLCAweDBmLCAweDYyLCAweDNmLCAweDZhLCAweDhjLCAweDcyLCAweDQ2LCAweDY2LCAweGNhLAorCTB4M2MsIDB4MGIsIDB4NzcsIDB4ODcsIDB4N2MsIDB4MmEsIDB4N2YsIDB4NzYsIDB4Y2EsIDB4YmIsIDB4ZTMsIDB4MWUsCisJMHhjOSwgMHg0NSwgMHgwYiwgMHhhYywgMHgyZiwgMHgxMCwgMHgyNywgMHg5NiwgMHg0NiwgMHhiMywgMHhhNSwgMHg4NCwKKwkweDk5LCAweDU1LCAweGM0LCAweDk1LCAweDE0LCAweGM2LCAweDA2LCAweDc3LCAweDJlLCAweDIyLCAweGQ2LCAweDAyLAorCTB4NmEsIDB4ZGEsIDB4MzQsIDB4ZDcsIDB4NGUsIDB4N2EsIDB4NmYsIDB4MDYsIDB4YzQsIDB4ZjUsIDB4NjMsIDB4OTksCisJMHg4MCwgMHg4ZSwgMHhmNSwgMHgyZiwgMHg4YywgMHgyMCwgMHgxNywgMHhmZSwgMHgyOSwgMHg3MiwgMHhjOSwgMHhiOCwKKwkweDI3LCAweDgzLCAweDcxLCAweDRmLCAweDM3LCAweGRhLCAweDFhLCAweDc0LCAweDAyLCAweGY3LCAweDVjLCAweGM2LAorCTB4ZGQsIDB4OTcsIDB4YTEsIDB4MDcsIDB4ZjAsIDB4ZDUsIDB4YWYsIDB4NmUsIDB4ZTksIDB4YzcsIDB4NzgsIDB4NDMsCisJMHg4ZSwgMHhkOSwgMHgyMSwgMHhmZiwgMHg1MCwgMHg0OSwgMHgyNCwgMHhkNywgMHhhMSwgMHgzZiwgMHgzNywgMHg1MCwKKwkweDBiLCAweGFjLCAweGEzLCAweDNlLCAweGRjLCAweGI0LCAweDIzLCAweGE4LCAweDRiLCAweDBlLCAweDgzLCAweDdlLAorCTB4ZTYsIDB4OTQsIDB4MWMsIDB4YzcsIDB4NzQsIDB4YWUsIDB4ZDMsIDB4NjIsIDB4M2QsIDB4N2YsIDB4OGYsIDB4N2UsCisJMHhkNywgMHg5NSwgMHhhZiwgMHhmNiwgMHhiMCwgMHhhNiwgMHg2NCwgMHgzZCwgMHhjZSwgMHgzNywgMHhlOSwgMHg3NywKKwkweDcwLCAweDhmLCAweGViLCAweDI2LCAweGQ3LCAweGZkLCAweDdkLCAweGFjLCAweDA1LCAweDdjLCAweGZkLCAweDIxLAorCTB4MmQsIDB4ZDQsIDB4MWYsIDB4ZWUsIDB4MjEsIDB4NGMsIDB4OGYsIDB4YjYsIDB4OTMsIDB4YmMsIDB4YzYsIDB4NDcsCisJMHg5ZCwgMHhmZCwgMHg5YiwgMHg2ZSwgMHhkNywgMHhjZSwgMHg3NCwgMHg5ZSwgMHg2NSwgMHg1ZSwgMHgxMywgMHg1ZiwKKwkweDdmLCAweDNmLCAweDc0LCAweDU4LCAweGQ3LCAweDY1LCAweDg3LCAweGUwLCAweGJiLCAweGViLCAweDhlLCAweGJjLAorCTB4NjAsIDB4ZGYsIDB4NjksIDB4NzcsIDB4ZmIsIDB4Y2IsIDB4YmUsIDB4OWMsIDB4MjgsIDB4YzcsIDB4YzMsIDB4NzIsCisJMHhhYSwgMHg5ZSwgMHg4MCwgMHg0ZCwgMHg1MCwgMHg4NiwgMHg1NiwgMHg4MywgMHgwYywgMHg0NSwgMHhmZSwgMHhhYSwKKwkweDJjLCAweGYyLCAweDRhLCAweDk5LCAweDZiLCAweDVhLCAweDg2LCAweGIxLCAweDZjLCAweGE4LCAweDhkLCAweGVmLAorCTB4ZWEsIDB4ZDAsIDB4Y2IsIDB4YjcsIDB4ZTUsIDB4YzgsIDB4YTIsIDB4YzgsIDB4MDUsIDB4YWMsIDB4YWYsIDB4OTYsCisJMHg2OSwgMHhhYiwgMHgyMywgMHhjOCwgMHg1ZiwgMHg3NywgMHg0OSwgMHg3NSwgMHgwOSwgMHgzNSwgMHg1OSwgMHg1OSwKKwkweGE2LCAweGIzLCAweDlmLCAweDYzLCAweGJjLCAweDg5LCAweGM4LCAweGE2LCAweDdlLCAweDhmLCAweDE1LCAweDE5LAorCTB4YmMsIDB4MTgsIDB4OTYsIDB4ZjAsIDB4NDUsIDB4MTQsIDB4N2YsIDB4OTAsIDB4ZmQsIDB4YTUsIDB4MjEsIDB4ZmYsCisJMHg3ZCwgMHhkNiwgMHhiNSwgMHhmOSwgMHg2MiwgMHgwOSwgMHg3YiwgMHhjYiwgMHhmZCwgMHhkYSwgMHg0ZiwgMHgxNiwKKwkweDZiLCAweDMzLCAweDkyLCAweGFmLCAweGYwLCAweDJjLCAweGY0LCAweDRiLCAweDcxLCAweGFjLCAweGE1LCAweDY0LAorCTB4ZjYsIDB4ZWMsIDB4ODgsIDB4M2MsIDB4OGIsIDB4MzMsIDB4NTAsIDB4ZmYsIDB4ZTEsIDB4OGMsIDB4MDksIDB4MjksCisJMHg1YywgMHhjMCwgMHg3YywgMHhlZCwgMHhiYSwgMHgyYywgMHhhZCwgMHhjYywgMHg0OCwgMHhiNSwgMHg3MiwgMHhiOSwKKwkweGUxLCAweGRkLCAweDFkLCAweGUzLCAweGE1LCAweGM2LCAweDVhLCAweGY2LCAweDMwLCAweGViLCAweDE5LCAweGQ0LAorCTB4YWEsIDB4MTYsIDB4YzYsIDB4OTAsIDB4NTksIDB4NmQsIDB4NzYsIDB4ZmEsIDB4Y2UsIDB4ZjcsIDB4ZTIsIDB4YzYsCisJMHgxYSwgMHg3NiwgMHg1MiwgMHhlNiwgMHhjYiwgMHgyOSwgMHgyOSwgMHg5ZSwgMHgxZCwgMHhkMSwgMHg2ZiwgMHgwYSwKKwkweDJkLCAweGU5LCAweGNhLCAweGQzLCAweDM3LCAweDExLCAweDJiLCAweDI2LCAweGY1LCAweDdiLCAweGYxLCAweDJkLAorCTB4NzksIDB4Y2MsIDB4OWUsIDB4OTcsIDB4YTMsIDB4ZDYsIDB4NDEsIDB4MzksIDB4ODUsIDB4ZmMsIDB4ZmEsIDB4NGIsCisJMHg3NiwgMHhhYiwgMHhjNCwgMHhiYiwgMHg3OSwgMHg4ZiwgMHhhMCwgMHhkNywgMHg2MiwgMHgwZCwgMHhlYSwgMHhjOCwKKwkweDg0LCAweGZkLCAweGEwLCAweGY5LCAweDNjLCAweDI0LCAweGZiLCAweDRlLCAweDhkLCAweDcxLCAweGYyLCAweGJmLAorCTB4OWQsIDB4MGMsIDB4ZTIsIDB4ZGUsIDB4NGQsIDB4ZDQsIDB4OGUsIDB4MTksIDB4MGQsIDB4NjcsIDB4YjgsIDB4NzAsCisJMHgxNSwgMHhjMiwgMHgwZCwgMHg5YiwgMHgyZiwgMHgxMCwgMHg2ZSwgMHhjOSwgMHhmMCwgMHhlMCwgMHgwYywgMHhjMCwKKwkweDg1LCAweDY0LCAweGMzLCAweDBlLCAweDQzLCAweDQ3LCAweDI2LCAweGMxLCAweDI3LCAweDdjLCAweGZjLCAweDY4LAorCTB4ODcsIDB4OTcsIDB4MDcsIDB4YjcsIDB4MjIsIDB4YjYsIDB4ZGUsIDB4ZGUsIDB4ZmYsIDB4ODYsIDB4YjcsIDB4ZmYsCisJMHg1OSwgMHg2ZiwgMHhmZiwgMHhkNSwgMHhhZCwgMHhmZCwgMHg3ZSwgMHg3YywgMHhmZCwgMHg4NSwgMHgyMywgMHgwZCwKKwkweDc0LCAweGJkLCAweDUxLCAweDcyLCAweGUxLCAweGU3LCAweDNkLCAweGJhLCAweGFlLCAweDZlLCAweGQxLCAweGU1LAorCTB4YzMsIDB4NDMsIDB4OWUsIDB4OWEsIDB4NjcsIDB4ZmEsIDB4NjYsIDB4ZmEsIDB4ZTgsIDB4N2UsIDB4YzgsIDB4ZDEsCisJMHg5MSwgMHg5YywgMHgwZCwgMHhkYiwgMHgyOCwgMHgyNywgMHhjNiwgMHgwYiwgMHhmYSwgMHgyZCwgMHg0ZCwgMHhjOSwKKwkweDdhLCAweDc0LCAweDVlLCAweDI2LCAweGFkLCAweGM0LCAweGY4LCAweGFjLCAweDg0LCAweGEwLCAweGNiLCAweGY0LAorCTB4MmQsIDB4MjEsIDB4YTksIDB4ZDIsIDB4ZTcsIDB4YTAsIDB4Y2YsIDB4ZGIsIDB4M2IsIDB4ZDMsIDB4ZmEsIDB4NGUsCisJMHgwMywgMHhhZCwgMHhhMSwgMHg5NywgMHg0OSwgMHhhMywgMHg0YiwgMHg2YiwgMHg2NCwgMHhlMCwgMHgzNiwgMHhhZCwKKwkweDJlLCAweGJjLCAweDRiLCAweGViLCAweDNiLCAweGE1LCAweDA2LCAweGY4LCAweDhiLCAweDYxLCAweDBmLCAweDNlLAorCTB4ZGMsIDB4MDAsIDB4NGYsIDB4N2QsIDB4NjYsIDB4NWUsIDB4NDEsIDB4N2QsIDB4MjYsIDB4NmQsIDB4OWYsIDB4ODUsCisJMHg2ZCwgMHg0OCwgMHhhNCwgMHgzNSwgMHg1ZCwgMHgzOSwgMHhmZSwgMHhjMCwgMHg4MCwgMHgyMywgMHgxMSwgMHhlNCwKKwkweDFiLCAweGNkLCAweDU4LCAweGRiLCAweGFjLCAweDMwLCAweDE3LCAweDUxLCAweDdkLCAweGNkLCAweDMyLCAweDA4LAorCTB4OWQsIDB4ZTUsIDB4ZGQsIDB4YjksIDB4NmYsIDB4ODIsIDB4OGYsIDB4ZTksIDB4OWMsIDB4YzAsIDB4OTEsIDB4YTMsCisJMHgzNiwgMHg2OSwgMHg3OSwgMHhkZiwgMHg3OSwgMHgyNSwgMHgzYSwgMHg2OCwgMHgxNywgMHg2NSwgMHhjOCwgMHg2YywKKwkweGM2LCAweGY5LCAweGQ1LCAweGJhLCAweGM2LCAweDk5LCAweDI0LCAweDJkLCAweGU3LCAweDg3LCAweGZhLCAweGNkLAorCTB4YmYsIDB4MDcsIDB4OWYsIDB4MTMsIDB4MTUsIDB4NDMsIDB4YWEsIDB4NTYsIDB4MjIsIDB4NzYsIDB4MDksIDB4MzgsCisJMHhmNiwgMHhlMSwgMHg2ZSwgMHhhYSwgMHgyMywgMHhhNCwgMHg0NywgMHhlNCwgMHgwOCwgMHhmNCwgMHhiYiwgMHhhYSwKKwkweGUzLCAweDIyLCAweGY1LCAweDM4LCAweDMxLCAweDU5LCAweDQwLCAweGFlLCAweGYzLCAweGQ3LCAweDNhLCAweGI2LAorCTB4MzksIDB4Y2UsIDB4NGQsIDB4YzQsIDB4YjcsIDB4YzksIDB4NmQsIDB4YmEsIDB4YTcsIDB4MmUsIDB4YmEsIDB4YmEsCisJMHhhNywgMHgyZSwgMHhhMiwgMHgwNiwgMHgzZSwgMHgxZCwgMHg5MSwgMHg5NiwgMHg1NSwgMHhkOCwgMHhjZiwgMHhjYiwKKwkweDdiLCAweGRjLCAweDdjLCAweGVlLCAweDY1LCAweGZlLCAweGU2LCAweDA0LCAweDdmLCAweDc3LCAweDNhLCAweDJjLAorCTB4ZDYsIDB4NjksIDB4MWQsIDB4MGYsIDB4MjAsIDB4ZWYsIDB4MDksIDB4OTksIDB4M2QsIDB4NDcsIDB4OWYsIDB4NmEsCisJMHhjOSwgMHhjMCwgMHg2OSwgMHhkZSwgMHgwNywgMHhmMywgMHg5YSwgMHhhNSwgMHhkMSwgMHgxOSwgMHhkOCwgMHhjOCwKKwkweDFjLCAweGZjLCAweDgyLCAweDVhLCAweDdkLCAweDU3LCAweDY2LCAweDJjLCAweGNhLCAweGExLCAweDUzLCAweGRhLAorCTB4NTYsIDB4NTEsIDB4OGYsIDB4YWYsIDB4YzIsIDB4MzcsIDB4YWMsIDB4YzYsIDB4YTQsIDB4MDksIDB4YjYsIDB4YTUsCisJMHgyZSwgMHg0NiwgMHg4ZCwgMHhlMiwgMHhlMiwgMHgwNywgMHhiMCwgMHgwNywgMHhmZSwgMHg3ZSwgMHg4MywgMHhkYywKKwkweGYyLCAweDYyLCAweGNjLCAweGEwLCAweDZkLCAweGE5LCAweDhiLCAweGQ0LCAweDczLCAweGE0LCAweDUzLCAweDE3LAorCTB4YTksIDB4ZTcsIDB4YTQsIDB4YzMsIDB4YjcsIDB4MTcsIDB4N2MsIDB4NWYsIDB4MWMsIDB4ZDEsIDB4ZWYsIDB4ZDMsCisJMHgzNywgMHg2ZCwgMHhmMiwgMHhmMiwgMHg4ZiwgMHg5MiwgMHhhZCwgMHgzMCwgMHg0NywgMHgyNCwgMHgzZiwgMHhkMiwKKwkweDhkLCAweDVjLCAweGE2LCAweDJiLCAweDZiLCAweDBmLCAweDhjLCAweDZmLCAweGNhLCAweGE3LCAweGU1LCAweGViLAorCTB4ZWUsIDB4NGYsIDB4YzEsIDB4MTcsIDB4ZjksIDB4NjgsIDB4ZTQsIDB4OGIsIDB4M2MsIDB4NzUsIDB4NGEsIDB4OTMsCisJMHhlNiwgMHhjYiwgMHhlNywgMHgwNywgMHg4MiwgMHgwNiwgMHgzZiwgMHg3ZCwgMHhhNywgMHg2MywgMHhjMCwgMHhmZiwKKwkweDc1LCAweGY4LCAweDgwLCAweDVlLCAweGY0LCAweDRmLCAweGEyLCAweDQ3LCAweDQ4LCAweGJiLCAweDQ4LCAweGRlLAorCTB4YzksIDB4ZWIsIDB4MGQsIDB4ZTQsIDB4OGQsIDB4M2UsIDB4OWYsIDB4ZDMsIDB4ZjgsIDB4N2UsIDB4NWQsIDB4NjYsCisJMHgxNywgMHg5ZCwgMHg5MywgMHg4OCwgMHhhYiwgMHg3YywgMHgzYiwgMHhlZiwgMHg3MSwgMHhkZiwgMHg4MSwgMHhiNywKKwkweGYzLCAweGZlLCAweGJhLCAweGI4LCAweGYyLCAweDQ5LCAweDk4LCAweDU1LCAweGMxLCAweGY3LCAweGNhLCAweDc2LAorCTB4NTksIDB4MzQsIDB4ZmEsIDB4OGUsIDB4OTgsIDB4Y2UsIDB4YzMsIDB4OGYsIDB4ZDQsIDB4ZTgsIDB4MjcsIDB4MjgsCisJMHhhMywgMHgxYiwgMHg5MiwgMHg1ZCwgMHhlNCwgMHhmYiwgMHg5NywgMHg4YiwgMHg2ZiwgMHhiYSwgMHhlNiwgMHhmYiwKKwkweDhkLCAweGM2LCAweDNkLCAweDM2LCAweGUwLCAweDdhLCAweDAxLCAweDQ3LCAweGJhLCAweGQ2LCAweDI5LCAweDNmLAorCTB4ZjgsIDB4OWMsIDB4YmQsIDB4MGQsIDB4YmUsIDB4YTYsIDB4NzEsIDB4ZGYsIDB4YjgsIDB4M2MsIDB4ODcsIDB4M2MsCisJMHhlMCwgMHgwZCwgMHhmYiwgMHgwZSwgMHhiOSwgMHg0ZSwgMHgzMywgMHgxNywgMHhhYSwgMHhkNiwgMHhhNiwgMHg2MCwKKwkweDkzLCAweDRkLCAweGYwLCAweDY1LCAweGE2LCAweDZjLCAweDk2LCAweDlhLCAweGE1LCAweDhhLCAweDdjLCAweDY3LAorCTB4NzksIDB4ODUsIDB4YmUsIDB4OTAsIDB4YjQsIDB4YjcsIDB4NjEsIDB4ZGUsIDB4ZjUsIDB4NWYsIDB4ZjQsIDB4YjUsCisJMHg5YiwgMHgyNSwgMHhjNCwgMHg1OSwgMHhkOCwgMHhmNiwgMHg2NiwgMHgyOSwgMHg4YSwgMHhiZSwgMHgxNywgMHhiZCwKKwkweDg1LCAweDNlLCAweDhlLCAweDNlLCAweDg5LCAweDdlLCAweDA0LCAweGZkLCAweDA4LCAweDdhLCAweDBiLCAweDdiLAorCTB4NjMsIDB4ZTgsIDB4ZmQsIDB4OWEsIDB4ODEsIDB4YjgsIDB4NmUsIDB4ZjMsIDB4NWQsIDB4ZDQsIDB4ZTcsIDB4MjEsCisJMHg1NywgMHhiNCwgMHgxOCwgMHhkMywgMHhjMiwgMHg3NiwgMHgwZSwgMHg3NSwgMHg0NCwgMHg3NiwgMHg4NCwgMHhiOSwKKwkweDFlLCAweDczLCAweGJlLCAweDhmLCAweDFkLCAweGQzLCAweDYyLCAweDVkLCAweDVlLCAweDMwLCAweGY2LCAweDBkLAorCTB4MzEsIDB4MmUsIDB4NTQsIDB4MTAsIDB4MTcsIDB4M2UsIDB4ZDgsIDB4OGQsIDB4ZmEsIDB4ZDEsIDB4ZGMsIDB4YWYsCisJMHhkZiwgMHg4ZSwgMHgxNiwgMHgzMSwgMHhlNiwgMHgzNywgMHg2YSwgMHhkZSwgMHhlOCwgMHgxYywgMHhlMiwgMHgxNCwKKwkweGZkLCAweGE3LCAweDgzLCAweDNkLCAweDc5LCAweGY4LCAweGYxLCAweDJlLCAweGQ4LCAweDVmLCAweDA2LCAweDdlLAorCTB4MWIsIDB4ZGYsIDB4NGIsIDB4NmYsIDB4ZWMsIDB4NzYsIDB4NjMsIDB4MmEsIDB4ZjIsIDB4NzcsIDB4YjUsIDB4ZmQsCisJMHhiZCwgMHhjNiwgMHhjNiwgMHg5ZSwgMHg5ZCwgMHg2YSwgMHg4MywgMHgwZSwgMHhlMCwgMHg0OCwgMHg1NCwgMHg5NiwKKwkweDYwLCAweDgzLCAweDNmLCAweGI0LCAweDRmLCAweGVhLCAweGRjLCAweDhlLCAweDc3LCAweGYxLCAweDJjLCAweDcyLAorCTB4ZDQsIDB4ZGMsIDB4MDIsIDB4NzMsIDB4OTgsIDB4MTMsIDB4YTgsIDB4NGIsIDB4NTAsIDB4OWYsIDB4NDUsIDB4NTksCisJMHg5MywgMHgzMywgMHgxNiwgMHhlOCwgMHg1YywgMHgzNCwgMHgyYSwgMHg2ZCwgMHg4YywgMHgwMywgMHgzNywgMHg3MCwKKwkweDFlLCAweGY4LCAweDVhLCAweDc2LCAweDIwLCAweGIzLCAweDAzLCAweGM4LCAweDA5LCAweDFkLCAweDI3LCAweDZjLAorCTB4ZWQsIDB4OTMsIDB4ZjgsIDB4MjEsIDB4ZmEsIDB4MWMsIDB4YzEsIDB4N2UsIDB4NTMsIDB4ZGMsIDB4ZjcsIDB4NzQsCisJMHhmOCwgMHhkZCwgMHgyOSwgMHhmZCwgMHg1YiwgMHgzMSwgMHg5NCwgMHhlYiwgMHhiMywgMHhkOCwgMHg3YiwgMHgxNywKKwkweDcwLCAweDcxLCAweDllLCAweDZmLCAweGQ5LCAweDIyLCAweGZiLCAweDE2LCAweGRjLCAweDljLCAweDU2LCAweDU5LAorCTB4OGQsIDB4ZjgsIDB4N2UsIDB4ZDUsIDB4YzMsIDB4YzcsIDB4NzUsIDB4ZTUsIDB4ZmQsIDB4YTYsIDB4YjEsIDB4YzcsCisJMHg3ZCwgMHgxYiwgMHhjNiwgMHgxZCwgMHg5ZiwgMHg0MiwgMHhmZSwgMHhiYywgMHg4MSwgMHg3YiwgMHg3OSwgMHgwMywKKwkweDc3LCAweDcyLCAweGE1LCAweDQ0LCAweDVkLCAweDFmLCAweDg2LCAweGRlLCAweDQzLCAweDg2LCAweDUzLCAweGM0LAorCTB4MzUsIDB4YTIsIDB4Y2YsIDB4ZGUsIDB4MjgsIDB4YzEsIDB4NzcsIDB4ZDIsIDB4ZmYsIDB4MjksIDB4NjQsIDB4NzcsCisJMHg2ZCwgMHg2ZSwgMHg0YywgMHg3NywgMHhmMSwgMHhmNCwgMHhiYSwgMHg3MCwgMHhlMiwgMHhhZiwgMHhlZCwgMHhkNiwKKwkweGY0LCAweDU0LCAweGY1LCAweDNiLCAweDE4LCAweGU1LCAweDA0LCAweDFkLCAweGU0LCAweDZmLCAweDAzLCAweDFhLAorCTB4ZTYsIDB4NmIsIDB4NTEsIDB4ZmQsIDB4ZmUsIDB4YWUsIDB4MzgsIDB4NDcsIDB4M2UsIDB4NDYsIDB4MjQsIDB4YmIsCisJMHhlMCwgMHhlZiwgMHhlYiwgMHhjNiwgMHhiZSwgMHhkNiwgMHgwNiwgMHg1YywgMHg3NywgMHg2ZiwgMHhlMywgMHg0MSwKKwkweDc5LCAweDNjLCAweDcwLCAweGZkLCAweDkzLCAweDZmLCAweGMzLCAweDg1LCAweGFkLCAweGI3LCAweDYxLCAweGM2LAorCTB4NWYsIDB4ZGUsIDB4NGQsIDB4MGEsIDB4ZmIsIDB4ZmQsIDB4ZmIsIDB4ZTksIDB4ZjUsIDB4NmEsIDB4ODEsIDB4YzQsCisJMHg3YywgMHg0MSwgMHg5OCwgMHhhYiwgMHhmMCwgMHg4ZSwgMHhjNiwgMHg2MSwgMHhkNywgMHg1ZCwgMHhjMCwgMHg2ZiwKKwkweDRiLCAweGE1LCAweGQ0LCAweDIyLCAweGFhLCAweDg3LCAweGI1LCAweDMxLCAweDczLCAweGU1LCAweGM2LCAweDMzLAorCTB4N2YsIDB4ZGIsIDB4M2IsIDB4MTMsIDB4ZjUsIDB4ZjQsIDB4MTksIDB4ZTYsIDB4Y2QsIDB4M2EsIDB4Y2UsIDB4MDAsCisJMHhhNiwgMHg3ZCwgMHgxYiwgMHg2ZCwgMHhiZiwgMHhlZSwgMHhjMSwgMHg3MSwgMHgzZCwgMHgyOSwgMHgwNSwgMHhlNCwKKwkweGExLCAweGI5LCAweDA1LCAweDY0LCAweGY0LCAweGYwLCAweGRmLCAweDJhLCAweGNkLCAweGRmLCAweGIzLCAweGY4LAorCTB4ODYsIDB4MzcsIDB4MWMsIDB4OWYsIDB4MDUsIDB4OGQsIDB4MDUsIDB4MzMsIDB4YzMsIDB4NzcsIDB4MzMsIDB4ZTAsCisJMHhkOCwgMHhiYiwgMHgwZCwgMHhjNywgMHg4NCwgMHg4NywgMHg2MywgMHg0MiwgMHg4YSwgMHhlNywgMHgyNiwgMHg2MSwKKwkweDZiLCAweDE5LCAweGM0LCAweGY3LCAweDdlLCAweGYzLCAweDgwLCAweDdjLCAweDFlLCAweGM1LCAweDM1LCAweGU2LAorCTB4MmUsIDB4OGMsIDB4ZTAsIDB4OWUsIDB4MWMsIDB4NjcsIDB4OWYsIDB4N2QsIDB4MTgsIDB4NzQsIDB4YmYsIDB4ODYsCisJMHhkOCwgMHhlYSwgMHhlNywgMHgzYywgMHhjNSwgMHg1OCwgMHgwOCwgMHgzMSwgMHhlYywgMHg5OCwgMHhmZSwgMHgwZCwKKwkweGI2LCAweDYwLCAweDlhLCAweGQwLCAweDU3LCAweDY1LCAweDBjLCAweDI3LCAweDUxLCAweGRlLCAweDIzLCAweGJlLAorCTB4Y2QsIDB4MjMsIDB4NTYsIDB4OTEsIDB4Y2YsIDB4MGUsIDB4MjksIDB4OWEsIDB4YzYsIDB4YTMsIDB4MjEsIDB4ZTQsCisJMHgzNSwgMHhkOSwgMHgwNSwgMHhkYSwgMHg5MSwgMHgwYywgMHg4NCwgMHhkMiwgMHhjZCwgMHhjOCwgMHg0OSwgMHgxZCwKKwkweGY5LCAweDk5LCAweGNkLCAweDdmLCAweGEzLCAweDMwLCAweDJmLCAweDFiLCAweDM1LCAweDEzLCAweGZkLCAweDNhLAorCTB4ZWUsIDB4ZTEsIDB4ZGIsIDB4ZjgsIDB4YmUsIDB4ZGUsIDB4ODMsIDB4YmMsIDB4MGYsIDB4MmIsIDB4MTksIDB4ZTgsCisJMHg2ZSwgMHg1MiwgMHhlNywgMHgzMywgMHhjYywgMHgyMywgMHhhYSwgMHg4OCwgMHhiNywgMHgwYSwgMHhiMSwgMHgwNiwKKwkweDc5LCAweGQ1LCAweDM4LCAweDczLCAweGQ3LCAweGU3LCAweDk2LCAweGFmLCAweGNiLCAweDk1LCAweDQ1LCAweGZlLAorCTB4MDYsIDB4Y2EsIDB4YjgsIDB4N2MsIDB4OTAsIDB4ZmUsIDB4YzAsIDB4OWMsIDB4NGIsIDB4NjEsIDB4NmUsIDB4ODUsCisJMHhiZSwgMHgwYywgMHhlMywgMHgzYSwgMHgwYywgMHhhOCwgMHgwNywgMHgzOSwgMHgwMiwgMHg3MiwgMHhlZCwgMHg0ZCwKKwkweDJiLCAweDA5LCAweDNlLCAweGFmLCAweGNiLCAweGM2LCAweDYyLCAweDU4LCAweDk2LCAweDJkLCAweGU2LCAweDQ1LAorCTB4MTIsIDB4Y2YsIDB4MDIsIDB4NzYsIDB4NjMsIDB4ZTUsIDB4OWEsIDB4YWIsIDB4MTMsIDB4ODQsIDB4NDcsIDB4Y2QsCisJMHg1MywgMHg0MCwgMHg1ZSwgMHg3NywgMHg0MCwgMHhlZiwgMHhmZCwgMHg2NSwgMHhmNywgMHg0YywgMHg5YSwgMHgxYSwKKwkweGViLCAweGJjLCAweDE5LCAweGQ5LCAweGEwLCAweDNkLCAweGQ5LCAweDdjLCAweDkzLCAweDYyLCAweDZlLCAweDcwLAorCTB4MDIsIDB4M2EsIDB4Y2IsIDB4ZGMsIDB4OWQsIDB4ZjUsIDB4MDAsIDB4YmUsIDB4NmIsIDB4NWMsIDB4MjcsIDB4ZWYsCisJMHhlOCwgMHg5NywgMHhmYSwgMHgyMSwgMHgxYiwgMHhkYSwgMHgzZCwgMHhkZiwgMHhjNCwgMHgxMCwgMHg0NywgMHgxNSwKKwkweDZkLCAweGJkLCAweGE4LCAweDdkLCAweDQxLCAweGIxLCAweDNjLCAweDgzLCAweDk4LCAweDAyLCAweDFmLCAweGMwLAorCTB4ZGYsIDB4NzAsIDB4YTYsIDB4YTYsIDB4NzAsIDB4OTcsIDB4ZTMsIDB4ODAsIDB4ZGIsIDB4MTYsIDB4NGIsIDB4ZDYsCisJMHg4YSwgMHgzYSwgMHgyZiwgMHg1MywgMHhlNywgMHg2ZiwgMHhiZiwgMHhkZiwgMHhlNCwgMHg2MSwgMHgzZiwgMHg2YSwKKwkweDBkLCAweGJhLCAweDA1LCAweDFiLCAweDUyLCAweDZiLCAweDUxLCAweGY0LCAweGYwLCAweGM3LCAweDZiLCAweGE4LAorCTB4MmYsIDB4NGEsIDB4N2MsIDB4MWYsIDB4NDIsIDB4NmQsIDB4NTAsIDB4ZTIsIDB4ZGIsIDB4NDksIDB4MTIsIDB4ZmQsCisJMHgwOCwgMHhkZiwgMHg4YiwgMHgzYywgMHhiZiwgMHg0NiwgMHhmYywgMHhhNCwgMHhjMywgMHhmNywgMHgyZiwgMHhjYywKKwkweDI1LCAweGU5LCAweDVmLCAweGZjLCAweDdjLCAweGQyLCAweGQ1LCAweDg1LCAweDUzLCAweDY1LCAweGZhLCAweDEwLAorCTB4ZWEsIDB4NzUsIDB4M2YsIDB4ZmMsIDB4MTYsIDB4NzUsIDB4YzEsIDB4Y2QsIDB4MjUsIDB4NTcsIDB4MmEsIDB4YWUsCisJMHhjYywgMHg2NiwgMHhlYiwgMHg5NywgMHg3NSwgMHg4YywgMHhkOCwgMHgyZiwgMHgxNiwgMHg3NCwgMHg4YywgMHhiMiwKKwkweGMzLCAweDlhLCAweDhlLCAweDAxLCAweDk3LCAweDI0LCAweGEzLCAweDdiLCAweGNhLCAweGVjLCAweDc1LCAweGM5LAorCTB4YWMsIDB4OGMsIDB4YzgsIDB4MGIsIDB4ZGEsIDB4NmYsIDB4ZjksIDB4M2UsIDB4OGIsIDB4MzksIDB4NjQsIDB4MGMsCisJMHhmMiwgMHg0YiwgMHhjYSwgMHhmMywgMHg2NywgMHhhZiwgMHg0YiwgMHhmNiwgMHg0NSwgMHhmYSwgMHhhZCwgMHhlMSwKKwkweDU4LCAweGFiLCAweDQxLCAweDVmLCAweGU1LCAweDQ4LCAweDBkLCAweGIxLCAweGU5LCAweDgwLCAweGNkLCAweDdmLAorCTB4MDcsIDB4MTAsIDB4NDIsIDB4NGQsIDB4ZTcsIDB4NDgsIDB4ZjMsIDB4NjgsIDB4YzIsIDB4OGUsIDB4MWIsIDB4ZmQsCisJMHg0ZiwgMHhiNiwgMHgxYSwgMHg4YywgMHg4ZCwgMHhjMywgMHhlNiwgMHg1MywgMHhlMiwgMHhiZiwgMHg0NywgMHhiNSwKKwkweGM4LCAweDUzLCAweGZhLCAweGFkLCAweDAyLCAweDY2LCAweGJiLCAweGYwLCAweDkxLCAweGZlLCAweDFkLCAweGU1LAorCTB4NjYsIDB4OGEsIDB4YjIsIDB4YzYsIDB4NzgsIDB4OGQsIDB4ZjMsIDB4ODUsIDB4YzgsIDB4Y2QsIDB4NTQsIDB4OTMsCisJMHgxNCwgMHhlZiwgMHg3MiwgMHg5YywgMHhhMywgMHhhMywgMHhhOSwgMHhkZCwgMHhlZSwgMHhiZiwgMHgxNSwgMHhmOSwKKwkweGM2LCAweDVkLCAweGFlLCAweDJmLCAweDM4LCAweGVhLCAweDhkLCAweDVmLCAweDQxLCAweDRmLCAweGRkLCAweDY2LAorCTB4YmMsIDB4NjUsIDB4N2MsIDB4ZTQsIDB4YmQsIDB4YTEsIDB4NWYsIDB4ZTEsIDB4MzcsIDB4NjMsIDB4ZWYsIDB4M2MsCisJMHg2MiwgMHgyZiwgMHhlMywgMHg2NSwgMHg5NywgMHhlNCwgMHgwZSwgMHg2YiwgMHg5ZiwgMHhjMSwgMHhmOSwgMHg4MiwKKwkweDliLCAweDRiLCAweDdiLCAweDcwLCAweDk1LCAweDY5LCAweDk5LCAweGFkLCAweDMwLCAweDg3LCAweGRhLCAweDQwLAorCTB4MmMsIDB4MWIsIDB4ODIsIDB4YWUsIDB4MzIsIDB4YTYsIDB4OWQsIDB4NDQsIDB4M2MsIDB4ZTcsIDB4ZWYsIDB4ZDIsCisJMHg1OCwgMHg1YiwgMHhlMiwgMHhiZSwgMHg0NCwgMHgzMiwgMHhhZSwgMHhjMCwgMHhmMywgMHg5NiwgMHg0ZSwgMHhkZCwKKwkweDhjLCAweGYyLCAweDNkLCAweGVhLCAweGQyLCAweDEwLCAweGVlLCAweGZkLCAweDRmLCAweDU5LCAweDViLCAweDBjLAorCTB4NjgsIDB4MWQsIDB4YzksIDB4YmUsIDB4NGMsIDB4ZDksIDB4YmIsIDB4YmYsIDB4NWIsIDB4NGIsIDB4YjcsIDB4NmIsCisJMHgwMywgMHhjYywgMHgwMywgMHgxZSwgMHg4NywgMHg1YywgMHhmNiwgMHhkYiwgMHhkNywgMHgxOSwgMHhiYiwgMHhmZiwKKwkweDVkLCAweDU5LCAweGMzLCAweGM5LCAweGE3LCAweDBjLCAweGRhLCAweDM2LCAweGM2LCAweDJiLCAweDIxLCAweDU5LAorCTB4OGEsIDB4OTIsIDB4N2YsIDB4YzgsIDB4Y2IsIDB4YTAsIDB4ZWQsIDB4ZWMsIDB4MjQsIDB4ODcsIDB4ZWQsIDB4MzIsCisJMHhmOCwgMHg0YiwgMHhjOCwgMHg4MCwgMHhiMiwgMHhmNCwgMHg2NSwgMHhjMCwgMHhlZiwgMHg0OSwgMHhkYywgMHgxNywKKwkweDZiLCAweDg2LCAweDdlLCAweDVkLCAweDQ3LCAweDE2LCAweGViLCAweGVlLCAweGQ5LCAweGM1LCAweDcyLCAweDIzLAorCTB4Y2QsIDB4YTQsIDB4OTcsIDB4NzcsIDB4N2EsIDB4NDksIDB4NzIsIDB4ZmEsIDB4N2UsIDB4ZTcsIDB4MjUsIDB4NTcsCisJMHhiOSwgMHgyNCwgMHhmYiwgMHgyYSwgMHhmMywgMHhmMiwgMHg5OCwgMHhmNSwgMHgyOCwgMHhmOCwgMHhiZCwgMHhlNiwKKwkweGNjLCAweDU4LCAweGJhLCAweDU2LCAweDE5LCAweGNmLCAweGZmLCAweDZmLCAweGU3LCAweDU2LCAweDFiLCAweGRiLAorCTB4NTYsIDB4NzUsIDB4ODYsIDB4NWYsIDB4NWYsIDB4ZGIsIDB4NjksIDB4MWEsIDB4OWEsIDB4NzAsIDB4ZWIsIDB4M2EsCisJMHg4OSwgMHg5YiwgMHg2NiwgMHhhZCwgMHgxZCwgMHhkZiwgMHg3ZSwgMHg4OCwgMHhhNCwgMHhlOCwgMHgzNiwgMHg2NCwKKwkweDM0LCAweGVhLCAweDgyLCAweDYyLCAweDljLCAweDUwLCAweGMyLCAweGU4LCAweDQ0LCAweGRhLCAweDc1LCAweDU1LAorCTB4YjUsIDB4MzEsIDB4NjQsIDB4MzksIDB4ZTksIDB4MDcsIDB4ZDMsIDB4MDYsIDB4YTMsIDB4YjAsIDB4ODIsIDB4MTgsCisJMHg1MiwgMHg4ZCwgMHhkYiwgMHg2YSwgMHg5ZCwgMHg5NiwgMHhjNiwgMHhlOSwgMHgwNywgMHg2YiwgMHgzNywgMHg2OSwKKwkweDlhLCAweGU1LCAweGE0LCAweDJkLCAweDQ4LCAweDExLCAweDJlLCAweDg4LCAweDZlLCAweGZiLCAweGIxLCAweDhkLAorCTB4MmEsIDB4NjUsIDB4ZWMsIDB4ZmYsIDB4ZjYsIDB4NjcsIDB4ZGEsIDB4ZDAsIDB4MTYsIDB4MTUsIDB4MTgsIDB4ZmMsCisJMHhkOCwgMHhhNCwgMHhmZSwgMHhlMCwgMHg0NywgMHgyNSwgMHhlOCwgMHhiYywgMHhlNywgMHg3OSwgMHhjZiwgMHhiZCwKKwkweDhlLCAweDZkLCAweDgyLCAweDI2LCAweDJkLCAweDUyLCAweGU0LCAweDdiLCAweGNlLCAweDNkLCAweGY3LCAweDljLAorCTB4NzMsIDB4Y2YsIDB4ZmIsIDB4ZmQsIDB4YmUsIDB4Y2YsIDB4YzUsIDB4ZGEsIDB4MTMsIDB4N2QsIDB4NmIsIDB4ZTUsCisJMHg2MywgMHhmOCwgMHgxZCwgMHgyNywgMHg2NywgMHg2ZCwgMHhjOSwgMHhkOCwgMHg4MywgMHhmMiwgMHg2MywgMHhjZCwKKwkweGU1LCAweDMzLCAweDNlLCAweDA5LCAweGMwLCAweDI3LCAweDM1LCAweGI4LCAweDAyLCAweDY5LCAweDc3LCAweDYyLAorCTB4MzcsIDB4ODUsIDB4M2UsIDB4NjUsIDB4MTgsIDB4YjQsIDB4OGUsIDB4MWIsIDB4YmYsIDB4ZDksIDB4MzYsIDB4ZjcsCisJMHgzNywgMHg5ZCwgMHg4MSwgMHhlZiwgMHhlZSwgMHgwZSwgMHhiNCwgMHhmYiwgMHgzOSwgMHg1ZiwgMHhlMywgMHhkZiwKKwkweGZlLCAweGM1LCAweGFiLCAweGExLCAweDBkLCAweGNhLCAweDBjLCAweGY2LCAweGYzLCAweDk2LCAweGVhLCAweDU5LAorCTB4MDcsIDB4YmMsIDB4YzQsIDB4ZGMsIDB4NzQsIDB4NGMsIDB4ZjMsIDB4MGYsIDB4ZTEsIDB4NjksIDB4ZWEsIDB4YTgsCisJMHhhYiwgMHhkMCwgMHg1MSwgMHg0MywgMHhkNCwgMHg1ZCwgMHhjMywgMHhiMywgMHgyZSwgMHhmMywgMHgwMywgMHg1MSwKKwkweGY5LCAweGYzLCAweDE0LCAweGY1LCAweDcwLCAweDVjLCAweGZlLCAweDM0LCAweGY1LCAweDAyLCAweGY2LCAweDkzLAorCTB4MjgsIDB4MzIsIDB4NDcsIDB4NzksIDB4NjMsIDB4MjYsIDB4NDcsIDB4M2YsIDB4NDksIDB4ZmQsIDB4ZjksIDB4YjQsCisJMHhmYiwgMHhhYywgMHhkYSwgMHg4MSwgMHhiOCwgMHg5NSwgMHg1ZiwgMHgxMywgMHg1NiwgMHg3ZCwgMHhmMywgMHhiNCwKKwkweGQ2LCAweDc0LCAweGUzLCAweDU2LCAweGI3LCAweGRjLCAweDM4LCAweDZmLCAweDc0LCAweDZjLCAweDc4LCAweDNhLAorCTB4MWEsIDB4MTgsIDB4OTksIDB4YTMsIDB4NWQsIDB4NGEsIDB4YzYsIDB4YjIsIDB4ZDYsIDB4MGEsIDB4MzksIDB4MTAsCisJMHg2NSwgMHhlZSwgMHgzOSwgMHg0NSwgMHhmZCwgMHgwYywgMHg1YiwgMHhkOCwgMHg2YiwgMHg2NywgMHhhZCwgMHg2NiwKKwkweGNmLCAweGZlLCAweGM0LCAweDFhLCAweGY0LCAweGVjLCAweGQzLCAweDllLCAweDllLCAweGU1LCAweGJkLCAweDE0LAorCTB4NjgsIDB4NGEsIDB4NWIsIDB4OTQsIDB4OTgsIDB4MTksIDB4YjUsIDB4OTIsIDB4YjAsIDB4NzksIDB4YjgsIDB4OWUsCisJMHhlNywgMHhmYywgMHg3MSwgMHgzOSwgMHgzMiwgMHg3ZiwgMHgxOCwgMHhmZSwgMHg3NywgMHhhZiwgMHhiZCwgMHg4NywKKwkweDc2LCAweGQ1LCAweDFlLCAweDIyLCAweDE2LCAweDA3LCAweGViLCAweDdmLCAweGE5LCAweDYxLCAweGFlLCAweGM3LAorCTB4YmQsIDB4YjksIDB4NzgsIDB4MWYsIDB4NzIsIDB4M2UsIDB4ZWQsIDB4YzgsIDB4MDQsIDB4NmMsIDB4YzksIDB4ODgsCisJMHg2ZCwgMHhmNiwgMHg1YSwgMHgzZiwgMHg3NiwgMHg3NywgMHg3NSwgMHhkZCwgMHgxMywgMHgwNSwgMHhjNywgMHhjMywKKwkweDg1LCAweGUxLCAweDE3LCAweGJlLCAweGQwLCAweGQ3LCAweDIzLCAweDVjLCAweDkzLCAweGViLCAweGI1LCAweDQ5LAorCTB4N2EsIDB4MWYsIDB4ZjQsIDB4Y2IsIDB4MzQsIDB4ZmYsIDB4NzMsIDB4NWUsIDB4ZWQsIDB4MGEsIDB4ZjEsIDB4NGEsCisJMHhiNCwgMHg2YiwgMHgxOSwgMHhkYiwgMHhmNCwgMHg4MCwgMHgzNywgMHhkZiwgMHhiNiwgMHgwZSwgMHg2OSwgMHg4OSwKKwkweGQ2LCAweDhjLCAweDY3LCAweDZlLCAweDg1LCAweGVkLCAweGI4LCAweGU0LCAweGU2LCAweGY5LCAweDViLCAweGE5LAorCTB4NDQsIDB4OWMsIDB4MjYsIDB4ZDksIDB4NjMsIDB4YWYsIDB4NmIsIDB4OTgsIDB4NjMsIDB4MmIsIDB4ZmEsIDB4OGMsCisJMHg0ZiwgMHgxMCwgMHg5YywgMHgwZSwgMHg3OCwgMHhiZSwgMHhjNSwgMHgwNiwgMHhmYSwgMHg0ZCwgMHhkZSwgMHg3NSwKKwkweGIzLCAweGU2LCAweDY0LCAweGUyLCAweDU2LCAweDU3LCAweGMzLCAweDdiLCAweDZjLCAweGE4LCAweGRhLCAweGUxLAorCTB4YjgsIDB4NDUsIDB4ZGQsIDB4ZDksIDB4MTQsIDB4OTUsIDB4MzYsIDB4ZjIsIDB4NTAsIDB4NDUsIDB4ZmQsIDB4ZjgsCisJMHg5MCwgMHg2MywgMHhiMCwgMHgxNiwgMHg1MSwgMHhlNywgMHg2MCwgMHgwNywgMHg3MywgMHhmNiwgMHg2ZiwgMHhlYiwKKwkweGI5LCAweGI1LCAweGQyLCAweDI3LCAweGMwLCAweDM1LCAweGY4LCAweGU0LCAweDczLCAweGY5LCAweDVlLCAweGU2LAorCTB4N2EsIDB4MzEsIDB4N2YsIDB4MGIsIDB4ZTcsIDB4NzcsIDB4YmQsIDB4NzMsIDB4NGUsIDB4YjgsIDB4MzksIDB4ZWIsCisJMHg3ZSwgMHhjOSwgMHg5ZSwgMHgzNywgMHhmYywgMHg5NywgMHg3NiwgMHhjMCwgMHg3YiwgMHg2ZCwgMHg2OCwgMHhjZiwKKwkweGQxLCAweDI2LCAweDdjLCAweGQxLCAweDNjLCAweGJlLCAweDZkLCAweGQ4LCAweGEyLCAweGI2LCAweGUxLCAweDc4LAorCTB4ODEsIDB4ZmMsIDB4NDksIDB4YmUsIDB4ZjQsIDB4ZjksIDB4ZDEsIDB4ZDcsIDB4NzksIDB4ZTQsIDB4NTEsIDB4ZWEsCisJMHhkOSwgMHg0MSwgMHgzOSwgMHg1MywgMHhlMCwgMHhkOSwgMHhhNCwgMHhiNCwgMHhhNiwgMHhiNSwgMHhmMSwgMHhlYywKKwkweDg0LCAweGUyLCAweGIxLCAweDdhLCAweGE2LCAweDEzLCAweDE3LCAweDczLCAweDMyLCAweDJjLCAweDU3LCAweDVkLAorCTB4OWUsIDB4NTksIDB4YTIsIDB4OTgsIDB4MDksIDB4YjYsIDB4ZDYsIDB4YmMsIDB4ZmYsIDB4M2UsIDB4M2QsIDB4YjMsCisJMHhiMCwgMHhmYSwgMHg4YywgMHgzMSwgMHg4YywgMHg3ZCwgMHhjOSwgMHhhMywgMHg3NywgMHg5YiwgMHg5ZSwgMHg2ZCwKKwkweGE2LCAweDhlLCAweDNlLCAweDhmLCAweGVhLCAweDM5LCAweDg1LCAweGExLCAweDEzLCAweDU5LCAweGM3LCAweDBmLAorCTB4NDcsIDB4ZjgsIDB4MGMsIDB4ZDcsIDB4YTUsIDB4Y2YsIDB4YzcsIDB4YjUsIDB4YzgsIDB4N2IsIDB4M2QsIDB4YjAsCisJMHhkOCwgMHhmZCwgMHgxMiwgMHhkYywgMHgwMSwgMHhkMSwgMHhkZiwgMHhjMSwgMHgzYSwgMHg3MiwgMHgwMCwgMHhiMiwKKwkweGJhLCAweGQxLCAweDYwLCAweDVmLCAweGM2LCAweDhkLCAweGFmLCAweDkxLCAweGIxLCAweGRlLCAweGMyLCAweDM5LAorCTB4MjIsIDB4NTYsIDB4ODEsIDB4MWYsIDB4N2QsIDB4ZmMsIDB4YTcsIDB4NzcsIDB4MzAsIDB4NWYsIDB4YzYsIDB4ZjMsCisJMHhkNywgMHgwNywgMHgzMCwgMHgzZiwgMHhjZiwgMHg4MiwgMHgzMiwgMHgzNiwgMHhiNSwgMHg4ZCwgMHhiYywgMHgzYSwKKwkweGFhLCAweGY1LCAweDQxLCAweDNlLCAweDQzLCAweDM5LCAweGU2LCAweDk5LCAweDkxLCAweDJlLCAweDdmLCAweGMzLAorCTB4ZjMsIDB4NmMsIDB4NmYsIDB4NmQsIDB4YTAsIDB4NjMsIDB4ZDIsIDB4ZGIsIDB4OWYsIDB4N2YsIDB4M2YsIDB4MmMsCisJMHhlMSwgMHgwZSwgMHhlYSwgMHhiOCwgMHhhOCwgMHgyNCwgMHhhNywgMHgxOSwgMHhiMywgMHhjMCwgMHg3NiwgMHg4ZCwKKwkweDczLCAweGFlLCAweGZmLCAweGFkLCAweDhiLCAweDMzLCAweGZmLCAweGE3LCAweDJlLCAweGNlLCAweDU4LCAweDFmLAorCTB4MjksIDB4ZWYsIDB4ODQsIDB4MzUsIDB4OGYsIDB4ZjUsIDB4YzUsIDB4NzQsIDB4MmQsIDB4ZDYsIDB4ZDEsIDB4ZDUsCisJMHhhZiwgMHhkZCwgMHg0NywgMHhhYiwgMHg3NCwgMHhmYywgMHg1MSwgMHg4MSwgMHhmNiwgMHgyYSwgMHhhNSwgMHgzOSwKKwkweGU1LCAweDdmLCAweDRlLCAweGYxLCAweDZjLCAweGI5LCAweGM3LCAweGFiLCAweGRjLCAweGUzLCAweGYwLCAweDgyLAorCTB4NjIsIDB4MjAsIDB4YmYsIDB4YTYsIDB4MzIsIDB4N2MsIDB4YjIsIDB4NDAsIDB4MWQsIDB4ZDMsIDB4MmEsIDB4YjMsCisJMHgzMywgMHhiZSwgMHg5ZSwgMHgxOSwgMHhmMywgMHg3YywgMHhkYywgMHhmYywgMHg5YSwgMHgyNiwgMHhkNSwgMHgzMywKKwkweGYwLCAweDZlLCAweDljLCAweDExLCAweGNmLCAweGJlLCAweDc0LCAweDRiLCAweGU5LCAweDNjLCAweGVkLCAweDZlLAorCTB4MTIsIDB4N2QsIDB4ZDEsIDB4NDAsIDB4NjksIDB4OGUsIDB4YjUsIDB4NDksIDB4NjIsIDB4NTAsIDB4ODYsIDB4ODUsCisJMHg3NSwgMHhmZiwgMHgxMSwgMHhmYiwgMHgzOCwgMHhlNCwgMHgyZCwgMHgyNiwgMHhlZiwgMHg0ZiwgMHhkMSwgMHhhNywKKwkweDZmLCAweDgyLCAweDZmLCAweGRjLCAweGQ2LCAweDcwLCAweGJlLCAweGRiLCAweGFiLCAweDNlLCAweDYxLCAweDNkLAorCTB4ZGQsIDB4MzcsIDB4NzQsIDB4NGEsIDB4MGIsIDB4ZjksIDB4ZGMsIDB4YjEsIDB4NmYsIDB4MDgsIDB4N2QsIDB4MzAsCisJMHg1ZSwgMHg2NywgMHgxMSwgMHgwYiwgMHgzMCwgMHhmNiwgMHg4OCwgMHg2YiwgMHhlYywgMHg1MSwgMHgyYSwgMHhiMiwKKwkweGFmLCAweGQ1LCAweGNiLCAweDJiLCAweGI1LCAweDJhLCAweGFmLCAweDkwLCAweGRmLCAweDMyLCAweGVhLCAweDdmLAorCTB4MGYsIDB4YTksIDB4Y2UsIDB4Y2EsIDB4NGYsIDB4ZjUsIDB4MWEsIDB4ZmMsIDB4OGEsIDB4MWQsIDB4NTMsIDB4ZGUsCisJMHg5MywgMHgzYSwgMHhkZSwgMHg4YiwgMHg3OSwgMHg2YiwgMHgzZiwgMHhkYywgMHg2OSwgMHg3YywgMHgyYiwgMHg1YiwKKwkweGY1LCAweDRkLCAweDU4LCAweGM3LCAweGQxLCAweGFlLCAweDcwLCAweDdlLCAweGYyLCAweDA2LCAweDc5LCAweDg0LAorCTB4M2EsIDB4Y2YsIDB4MWYsIDB4ZTcsIDB4ZDMsIDB4YzMsIDB4NmYsIDB4NzMsIDB4M2MsIDB4ZjksIDB4YmYsIDB4MTYsCisJMHg4YiwgMHhlMCwgMHhjYiwgMHhhYSwgMHhkZiwgMHhlNywgMHhjYiwgMHgxZCwgMHhlZiwgMHhkNSwgMHhkYSwgMHgwNCwKKwkweGNhLCAweDVkLCAweDZkLCAweDdkLCAweGQyLCAweDk2LCAweGM4LCAweGY0LCAweDEyLCAweDVkLCAweGQyLCAweGZkLAorCTB4ZGMsIDB4ZmYsIDB4NGIsIDB4Y2MsIDB4ZWQsIDB4NDIsIDB4ZGUsIDB4OTYsIDB4YTMsIDB4Y2QsIDB4NTEsIDB4YTUsCisJMHg0ZCwgMHgwNiwgMHhiNCwgMHg4OSwgMHgyOCwgMHg2ZCwgMHgxOCwgMHhlZiwgMHgzZCwgMHhlMywgMHhmMSwgMHg1YiwKKwkweDJiLCAweGNlLCAweDhiLCAweGI5LCAweDVhLCAweGU4LCAweGJhLCAweGJkLCAweGQ0LCAweGY5LCAweGNmLCAweDc3LAorCTB4NmEsIDB4N2QsIDB4ZDAsIDB4YTEsIDB4ZWUsIDB4NWIsIDB4MDUsIDB4N2QsIDB4YzYsIDB4ZjYsIDB4NjYsIDB4ZjUsCisJMHg0NywgMHg0YywgMHhiYywgMHgxNSwgMHhkNywgMHgzYywgMHg2OCwgMHgxMCwgMHhmYSwgMHhiOSwgMHgzNCwgMHgwNSwKKwkweDVmLCAweDhkLCAweDc4LCAweGI3LCAweDNhLCAweDVhLCAweDdkLCAweGM3LCAweDNiLCAweGFmLCAweDkyLCAweGQyLAorCTB4ODYsIDB4MzIsIDB4NDAsIDB4YmQsIDB4YjksIDB4MWEsIDB4ZjMsIDB4ZWQsIDB4OGUsIDB4ZjYsIDB4ODEsIDB4YmYsCisJMHg3ZSwgMHg4MSwgMHhmZSwgMHg4ZCwgMHgxYSwgMHg0ZiwgMHgwNCwgMHgyMSwgMHhmMywgMHgzNywgMHhhNywgMHgzYSwKKwkweGJjLCAweDE4LCAweGNlLCAweDQxLCAweDFiLCAweDcxLCAweGViLCAweDU0LCAweDg0LCAweDMxLCAweDA1LCAweGRhLAorCTB4NWIsIDB4YTQsIDB4NjksIDB4MWEsIDB4ZjEsIDB4MmIsIDB4ZjQsIDB4ZjgsIDB4ODIsIDB4ZGEsIDB4YTMsIDB4M2UsCisJMHhkYywgMHhiZiwgMHg4YiwgMHgxOCwgMHgzZiwgMHg1YywgMHgxZiwgMHhjNiwgMHg3MywgMHhiZCwgMHgwNiwgMHg4YiwKKwkweDEwLCAweGRkLCAweGE0LCAweDY3LCAweDVhLCAweDlhLCAweDRhLCAweGM0LCAweDBlLCAweDhhLCAweGQ3LCAweDM3LAorCTB4ZWUsIDB4YWEsIDB4M2UsIDB4NTgsIDB4ZGEsIDB4ZDcsIDB4NDMsIDB4YjIsIDB4YmIsIDB4NmEsIDB4MmYsIDB4MTgsCisJMHg0NywgMHhjMywgMHg4NywgMHg5ZiwgMHgzMSwgMHhmNiwgMHgyMCwgMHg1ZiwgMHhlYywgMHg1MywgMHg1YywgMHg1NCwKKwkweDcwLCAweDY4LCAweDFlLCAweDY3LCAweDQ5LCAweDlmLCAweDc0LCAweDExLCAweDdlLCAweGI4LCAweDhiLCAweDMzLAorCTB4YTQsIDB4ZGYsIDB4NWQsIDB4MzksIDB4NzYsIDB4YzIsIDB4NGQsIDB4YjEsIDB4M2UsIDB4MDYsIDB4N2QsIDB4NzAsCisJMHg0YywgMHg0NiwgMHgxMCwgMHgxNywgMHg4YywgMHgwNCwgMHhkYiwgMHg5OCwgMHg1NywgMHg4NiwgMHg2ZiwgMHg5OCwKKwkweGYzLCAweDcyLCAweDhmLCAweDdkLCAweGNjLCAweDk5LCAweGNhLCAweGQ5LCAweDM5LCAweGVlLCAweDlkLCAweGIyLAorCTB4NmQsIDB4NjIsIDB4ZWYsIDB4ZDIsIDB4MTQsIDB4ZjcsIDB4NmIsIDB4ZjIsIDB4MTAsIDB4NmMsIDB4NWIsIDB4ZDMsCisJMHgyZSwgMHg3ZSwgMHg3OSwgMHgxNiwgMHgwMywgMHhmOCwgMHgxZCwgMHg4NCwgMHgzYywgMHg3MCwgMHgyYywgMHg3ZSwKKwkweGU3LCAweDE2LCAweGU1LCAweGRkLCAweGYzLCAweGJlLCAweDZkLCAweDBmLCAweGM4LCAweDNiLCAweDRlLCAweGU1LAorCTB4ZDgsIDB4NzEsIDB4NzcsIDB4MGQsIDB4Y2YsIDB4YzAsIDB4Y2QsIDB4YjEsIDB4NjYsIDB4ZWQsIDB4MzgsIDB4NmUsCisJMHg1ZSwgMHgyYSwgMHg5NSwgMHgwNSwgMHg3NywgMHg2MSwgMHg4ZCwgMHhhNSwgMHhiNCwgMHhhNCwgMHhmYywgMHhmZiwKKwkweDAzLCAweDY3LCAweDc4LCAweGZkLCAweDNlLCAweDRiLCAweDBjLCAweGZkLCAweDQ4LCAweDliLCAweGNmLCAweGQ3LAorCTB4ZmUsIDB4NmEsIDB4NmQsIDB4ODEsIDB4YWYsIDB4ZmYsIDB4YzgsIDB4OGYsIDB4ZTQsIDB4Y2IsIDB4NDUsIDB4ZDksCisJMHhhOSwgMHhmYSwgMHg3ZiwgMHhiOSwgMHhlNywgMHg2YSwgMHg3NSwgMHhiZiwgMHhlZiwgMHhkZiwgMHg1MiwgMHhiZiwKKwkweDkzLCAweDE3LCAweDYzLCAweDFhLCAweDFmLCAweDZjLCAweDlhLCAweDZlLCAweGQ0LCAweDA5LCAweDRmLCAweDc4LAorCTB4NzUsIDB4ODUsIDB4ZTUsIDB4NzgsIDB4NmYsIDB4YmYsIDB4YTcsIDB4MTcsIDB4NTIsIDB4ZWEsIDB4M2IsIDB4YTcsCisJMHg2YywgMHhlYSwgMHgwNywgMHhlZSwgMHhhNywgMHg0NSwgMHgyNiwgMHgyZSwgMHhkYywgMHgwMSwgMHg0ZCwgMHg3YywKKwkweDFkLCAweGNjLCAweGI4LCAweGNmLCAweGQ3LCAweDFkLCAweDZkLCAweDllLCAweDJmLCAweDZjLCAweDQ5LCAweGNmLAorCTB4NTksIDB4ZmEsIDB4NGUsIDB4MGUsIDB4ZjQsIDB4NjgsIDB4YmIsIDB4NjQsIDB4YzYsIDB4ODMsIDB4OTIsIDB4M2MsCisJMHgxYiwgMHg4YiwgMHgxOSwgMHg1ZiwgMHg5NywgMHhmYywgMHgwNywgMHg3OSwgMHhkMywgMHgzZSwgMHhhZCwgMHg0NSwKKwkweGExLCAweGZmLCAweDZlLCAweGUxLCAweGRhLCAweDg2LCAweDlmLCAweDIxLCAweGNmLCAweDdiLCAweGZkLCAweDdiLAorCTB4NzYsIDB4MDMsIDB4OGYsIDB4ZWUsIDB4ZjAsIDB4NzgsIDB4OTQsIDB4ZjcsIDB4MmQsIDB4NTMsIDB4ZmYsIDB4YzAsCisJMHhkOCwgMHg5ZSwgMHhiMywgMHhkYywgMHhhMywgMHg3OSwgMHhhZSwgMHhlNywgMHhhYywgMHg4OSwgMHhkNywgMHhlYiwKKwkweDlmLCAweGViLCAweGFiLCAweDNlLCAweDg3LCAweGZiLCAweGYwLCAweDdkLCAweGNkLCAweGRjLCAweDNiLCAweDA3LAorCTB4ZTEsIDB4ZDMsIDB4ZjUsIDB4ZDEsIDB4ZTYsIDB4ZDAsIDB4N2UsIDB4NmYsIDB4NzQsIDB4NzcsIDB4MGEsIDB4ZjksCisJMHgzZCwgMHhlMSwgMHhmMSwgMHgxYywgMHhmNSwgMHg0ZCwgMHhjNCwgMHhkMywgMHgzNywgMHg0YiwgMHhmNiwgMHg2NSwKKwkweGM0LCAweGUwLCAweDRmLCAweDk4LCAweDEzLCAweGE5LCAweGIxLCAweDJmLCAweDRmLCAweDk4LCAweDc3LCAweGFiLAorCTB4YjMsIDB4MmYsIDB4NzcsIDB4N2IsIDB4ZjMsIDB4ZjgsIDB4ZjcsIDB4N2MsIDB4YmQsIDB4ZTIsIDB4YjcsIDB4N2QsCisJMHhiZCwgMHhkMiwgMHhlOCwgMHhkMywgMHhmYSwgMHhiNCwgMHhhZiwgMHhlZCwgMHhhZiwgMHg4ZiwgMHhmOSwgMHhmMiwKKwkweGNiLCAweGU2LCAweDVkLCAweGIyLCAweDg4LCAweGQ5LCAweGU4LCAweDUzLCAweDI2LCAweDcyLCAweDA2LCAweDJmLAorCTB4NmQsIDB4OWQsIDB4YjEsIDB4ODgsIDB4ZmIsIDB4NzAsIDB4N2UsIDB4MjIsIDB4ZTksIDB4YzgsIDB4MWQsIDB4OGQsCisJMHhhZCwgMHg0ZiwgMHg1ZSwgMHgxOCwgMHhkMywgMHgzYywgMHg0ZiwgMHhjOSwgMHhmNSwgMHhmNCwgMHg0ZSwgMHg3NCwKKwkweDE3LCAweGU0LCAweGVhLCAweDRhLCAweDY0LCAweDA5LCAweDUzLCAweDM0LCAweDczLCAweDM0LCAweDBkLCAweDNiLAorCTB4OTQsIDB4ZDIsIDB4N2EsIDB4ZDksIDB4ZjcsIDB4YjAsIDB4ZGYsIDB4NDEsIDB4YzUsIDB4NzMsIDB4YWQsIDB4NzQsCisJMHg1ZSwgMHg5NCwgMHg0NywgMHhlYywgMHg4YSwgMHhkNiwgMHg2ZSwgMHg5YSwgMHg4NywgMHg4YSwgMHg0NywgMHg5YiwKKwkweDRmLCAweGZiLCAweDdjLCAweDRmLCAweDdlLCAweDlhLCAweDM5LCAweDNhLCAweDMxLCAweDUzLCAweDE5LCAweDBlLAorCTB4NmQsIDB4ZWIsIDB4YjUsIDB4ZjMsIDB4NDIsIDB4YmMsIDB4ZmUsIDB4YjAsIDB4MWMsIDB4NTIsIDB4ZGMsIDB4ZjAsCisJMHhhYiwgMHhiOCwgMHhiZiwgMHg5NywgMHhmMSwgMHg2NSwgMHgyMiwgMHhhNCwgMHg3OCwgMHhlMCwgMHg0NCwgMHg2YywKKwkweDEyLCAweGIyLCAweDk4LCAweDc1LCAweDg5LCAweGVmLCAweDVmLCAweGE1LCAweDM4LCAweGZmLCAweDkyLCAweGQwLAorCTB4Y2YsIDB4MjIsIDB4YTYsIDB4ZTAsIDB4MDUsIDB4MzksIDB4ZTgsIDB4NmUsIDB4NzQsIDB4MTcsIDB4YzQsIDB4ZjgsCisJMHhiZiwgMHg1OSwgMHhhZCwgMHgwOSwgMHhhZCwgMHg5MCwgMHg0OSwgMHgzNywgMHhkNCwgMHg5YywgMHgyZSwgMHgxYiwKKwkweDE5LCAweDE4LCAweDBkLCAweGE2LCAweDU2LCAweDllLCAweDcwLCAweGEyLCAweGNkLCAweDNiLCAweGNiLCAweDkwLAorCTB4ZjEsIDB4MzIsIDB4ZjQsIDB4N2YsIDB4MzksIDB4MTYsIDB4MTgsIDB4NTEsIDB4NmMsIDB4ZGEsIDB4NTcsIDB4MjQsCisJMHhkZCwgMHg0MSwgMHgzZiwgMHg5ZiwgMHhmYSwgMHhlNCwgMHgwMSwgMHhiOSwgMHg2OSwgMHg2ZiwgMHg5NiwgMHg5YiwKKwkweDViLCAweDg4LCAweGMzLCAweGVjLCAweDQ3LCAweDliLCAweGJhLCAweDY0LCAweDEwLCAweDdkLCAweDQ5LCAweGY0LAorCTB4MzUsIDB4MmIsIDB4M2YsIDB4NmEsIDB4N2MsIDB4MDYsIDB4OWQsIDB4NzUsIDB4ZDMsIDB4YTYsIDB4YWUsIDB4NWEsCisJMHhjZiwgMHg1ZiwgMHhiYywgMHhlYiwgMHgyMiwgMHg2OCwgMHg0MiwgMHg2YywgMHhjNywgMHg1NiwgMHhiNCwgMHhhOSwKKwkweGUzLCAweGVjLCAweDg2LCAweGZlLCAweDJlLCAweGI0LCAweGVmLCAweGMzLCAweDFjLCAweDRkLCAweGZhLCAweDdlLAorCTB4OTYsIDB4YjMsIDB4Y2QsIDB4ZDQsIDB4MzksIDB4ZWIsIDB4YzYsIDB4YWMsIDB4NmUsIDB4NjgsIDB4ZmYsIDB4YjEsCisJMHhkZCwgMHhlMCwgMHgxMywgMHgzZSwgMHgyNSwgMHhiZCwgMHg3MywgMHgyOSwgMHhkOSwgMHhkNSwgMHg1OSwgMHhkZiwKKwkweGZlLCAweDc3LCAweDQzLCAweGJiLCAweDRkLCAweDU2LCAweGI2LCAweDkzLCAweDBjLCAweDRmLCAweDc1LCAweGQ0LAorCTB4ZjcsIDB4ZmIsIDB4ZmMsIDB4ZTQsIDB4YjcsIDB4M2IsIDB4ZjEsIDB4YmUsIDB4MDksIDB4MTgsIDB4YmMsIDB4YTQsCisJMHhjNiwgMHg1MiwgMHgzNywgMHhhMywgMHg1YywgMHhlYiwgMHg4MywgMHg4NiwgMHg2NywgMHg3OCwgMHhjZCwgMHg2NywKKwkweGY4LCAweDJjLCAweGYzLCAweDdhLCAweDlmLCAweGIxLCAweDFmLCAweGNmLCAweDMwLCAweDI3LCAweGMwLCAweGJjLAorCTB4MDYsIDB4NzksIDB4NzYsIDB4YjksIDB4MzgsIDB4OGIsIDB4NjMsIDB4M2UsIDB4OWYsIDB4NmYsIDB4YzgsIDB4NTQsCisJMHg3OSwgMHhjZiwgMHhkNywgMHgyYiwgMHhiMSwgMHgyYSwgMHg1NiwgMHg2ZCwgMHg2NywgMHhjMSwgMHhjZiwgMHgwOSwKKwkweDkzLCAweDc2LCAweDVhLCAweDkzLCAweDhhLCAweGRkLCAweDAwLCAweDlkLCAweDBmLCAweDgwLCAweGNlLCAweDBmLAorCTB4MDUsIDB4MTksIDB4MTcsIDB4YjYsIDB4NzgsIDB4YjQsIDB4NzYsIDB4NjQsIDB4YTQsIDB4ZmMsIDB4NWIsIDB4YzgsCisJMHgzOCwgMHg3OSwgMHgxNCwgMHgzZSwgMHg0NSwgMHhkOSwgMHhmMiwgMHhmMCwgMHgxOSwgMHgwMywgMHhiMCwgMHg2OSwKKwkweGFlLCAweDA0LCAweDM1LCAweGVmLCAweDgwLCAweGY4LCAweDdlLCAweGY2LCAweGJhLCAweDhjLCAweDRjLCAweDMxLAorCTB4MjcsIDB4NDAsIDB4N2UsIDB4NjYsIDB4NWMsIDB4OWYsIDB4YzIsIDB4YmQsIDB4NWIsIDB4MTgsIDB4ZWIsIDB4NDIsCisJMHg4NiwgMHhjNywgMHhjMCwgMHhhZiwgMHgyMSwgMHg3MSwgMHhhNiwgMHhiNywgMHg0YSwgMHg2ZSwgMHg3YywgMHg0YywKKwkweDdkLCAweDgwLCAweDFlLCAweGQ4LCAweGE4LCAweGUzLCAweGVlLCAweGE4LCAweDljLCAweGI4LCAweGIyLCAweDAxLAorCTB4YjIsIDB4Y2EsIDB4YjgsIDB4NWYsIDB4NzMsIDB4MWEsIDB4OTUsIDB4YjAsIDB4ZmEsIDB4ZTYsIDB4ZjQsIDB4MzksCisJMHg5OCwgMHg4NywgMHgzMywgMHgzNSwgMHg2NiwgMHgyMywgMHhiNywgMHg5MywgMHgzMSwgMHg2OSwgMHgxYiwgMHg5NSwKKwkweDk5LCAweDBiLCAweGI2LCAweGUyLCAweDVkLCAweDUyLCAweDcyLCAweGE3LCAweDQyLCAweGRhLCAweDY1LCAweGY3LAorCTB4YzYsIDB4YTEsIDB4YWIsIDB4ZTgsIDB4Y2IsIDB4OWYsIDB4OGMsIDB4OTgsIDB4YjMsIDB4N2MsIDB4NzQsIDB4MmQsCisJMHg2MywgMHhlMiwgMHhlNCwgMHg3NCwgMHhlZCwgMHgxYywgMHg4YSwgMHg5MSwgMHhjMSwgMHhiZCwgMHhkNywgMHhkYSwKKwkweDhkLCAweGNjLCAweDMwLCAweDNlLCAweGZlLCAweGEwLCAweDkyLCAweDhhLCAweDcyLCAweDRkLCAweDhlLCAweDY1LAorCTB4ZWQsIDB4OTYsIDB4M2MsIDB4YzIsIDB4YmQsIDB4N2QsIDB4ZWEsIDB4ZjEsIDB4ZjIsIDB4Y2YsIDB4MzAsIDB4NWYsCisJMHg1YywgMHg3YSwgMHg1ZSwgMHgxZiwgMHhkMywgMHhiOCwgMHhmZSwgMHg3OCwgMHg1ZCwgMHgwYywgMHg2YiwgMHhmMiwKKwkweDA1LCAweDI2LCAweDhlLCAweGJkLCAweDJlLCAweDkzLCAweGYzLCAweGE0LCAweDBmLCAweDZkLCAweDdjLCAweDQwLAorCTB4NWUsIDB4NzMsIDB4N2EsIDB4ZWQsIDB4MjcsIDB4YjUsIDB4ZDYsIDB4OTgsIDB4NDgsIDB4YjEsIDB4M2UsIDB4ZDMsCisJMHhlMiwgMHgyNCwgMHhlZCwgMHg1OSwgMHgwOSwgMHgwZCwgMHg3ZSwgMHgxNSwgMHhkNywgMHg4YywgMHg2YiwgMHhmMywKKwkweDZlLCAweGFmLCAweGZiLCAweGE0LCAweGY4LCAweDM4LCAweDkwLCAweDhkLCAweGE5LCAweDE1LCAweDgxLCAweGRiLAorCTB4OTUsIDB4ZWIsIDB4N2IsIDB4MzksIDB4YzYsIDB4ZTAsIDB4NDAsIDB4MjQsIDB4NDAsIDB4NWEsIDB4YmQsIDB4YjcsCisJMHg5ZSwgMHhmOCwgMHg5OSwgMHhmYSwgMHhmYywgMHhkZiwgMHg4MywgMHg0ZiwgMHhlZiwgMHgxOSwgMHg0OCwgMHg5YywKKwkweDYyLCAweDBjLCAweDFiLCAweDc2LCAweGJlLCAweGI1LCAweGQ2LCAweGJjLCAweDZiLCAweDJlLCAweGI3LCAweDVhLAorCTB4YjQsIDB4N2UsIDB4NzYsIDB4ZTQsIDB4MjMsIDB4ODcsIDB4NzgsIDB4ODgsIDB4NDQsIDB4NmMsIDB4ODUsIDB4YzUsCisJMHgzYywgMHgzOCwgMHg3NSwgMHgxYywgMHg2YiwgMHgyYSwgMHhjYywgMHhiOSwgMHgxMSwgMHhjNywgMHhkZiwgMHgyYywKKwkweDk3LCAweGZiLCAweDJjLCAweDc5LCAweDMwLCAweDk0LCAweDhhLCAweDViLCAweGIyLCAweDI5LCAweDdlLCAweDU2LAorCTB4YjAsIDB4MjYsIDB4ZWIsIDB4MmIsIDB4ZjMsIDB4ODksIDB4MWMsIDB4YzcsIDB4ODcsIDB4YTYsIDB4MzksIDB4NWYsCisJMHg1YywgMHhlMywgMHg5NSwgMHhlNCwgMHhhNiwgMHg0YSwgMHhlNSwgMHgxOSwgMHg1NywgMHgwMiwgMHhjOSwgMHg3YiwKKwkweDNmLCAweGFjLCAweGIwLCAweDE2LCAweDZlLCAweGJkLCAweGZlLCAweDQ1LCAweDM4LCAweDA1LCAweGVhLCAweDhhLAorCTB4NTUsIDB4OTMsIDB4MDYsIDB4NzMsIDB4NzgsIDB4ZTIsIDB4NDgsIDB4Y2YsIDB4M2MsIDB4ZGIsIDB4ZGYsIDB4N2QsCisJMHhjNCwgMHhiNCwgMHg0ZiwgMHhhMSwgMHhkZCwgMHhlNCwgMHg2MSwgMHg5ZCwgMHhhNiwgMHg4ZSwgMHhmNCwgMHgxNCwKKwkweDlmLCAweDVhLCAweDZiLCAweGUyLCAweGVmLCAweDQ1LCAweGM1LCAweDdmLCAweGJkLCAweDVkLCAweDE3LCAweGQzLAorCTB4YTQsIDB4MDIsIDB4ZTMsIDB4ODUsIDB4YjEsIDB4YzAsIDB4NTgsIDB4YzEsIDB4ZWEsIDB4NmIsIDB4MDYsIDB4YWQsCisJMHhlNiwgMHg1YywgMHhlNiwgMHg2YSwgMHhmYywgMHg5YywgMHgxNSwgMHhmMywgMHhmZCwgMHgyMiwgMHhkZiwgMHg1NywKKwkweDhjLCAweDE0LCAweDZiLCAweDhhLCAweDk2LCAweGZhLCAweDQyLCAweDA3LCAweGU2LCAweDk4LCAweGUzLCAweDhmLAorCTB4YTgsIDB4M2UsIDB4MzgsIDB4MzgsIDB4ZGYsIDB4MjYsIDB4NzksIDB4N2IsIDB4OGQsIDB4ZTQsIDB4NTUsIDB4YzYsCisJMHhhMywgMHhhYSwgMHgwMywgMHgyYywgMHhlNywgMHg1ZSwgMHhmNCwgMHg3MSwgMHhkZiwgMHg0ZiwgMHgyOCwgMHgyZSwKKwkweGUyLCAweGNkLCAweDQyLCAweDE3LCAweGRhLCAweGNjLCAweDM1LCAweDZmLCAweDZmLCAweGU4LCAweGFmLCAweGFkLAorCTB4Y2IsIDB4MjYsIDB4NmMsIDB4Y2IsIDB4NmEsIDB4YWMsIDB4YzksIDB4YjIsIDB4YWYsIDB4YjEsIDB4MTYsIDB4N2IsCisJMHg1MiwgMHhhZSwgMHg5MywgMHg2ZiwgMHhjYSwgMHg3ZSwgMHhjZSwgMHhkZCwgMHhmNSwgMHg3MiwgMHhlZSwgMHhkZiwKKwkweGVlLCAweDMyLCAweDE4LCAweDYxLCAweGM5LCAweDg0LCAweDg2LCAweDlhLCAweGZiLCAweDhlLCAweDRmLCAweDA1LAorCTB4NmYsIDB4MmQsIDB4ZTUsIDB4NGYsIDB4ZDEsIDB4OWUsIDB4YWYsIDB4ZDYsIDB4Y2EsIDB4NzEsIDB4ZWYsIDB4MzksCisJMHg2MiwgMHhjNSwgMHhlMSwgMHg1NywgMHhlNCwgMHhiYywgMHhlZiwgMHgwZSwgMHg3OCwgMHhiZiwgMHhmYSwgMHhmYywKKwkweGZmLCAweGQ4LCAweDUzLCAweDhiLCAweGQ2LCAweGQ5LCAweGFkLCAweGJhLCAweDNhLCAweGZiLCAweGUzLCAweDc4LAorCTB4OTYsIDB4MzUsIDB4ZjYsIDB4NWMsIDB4YTUsIDB4MDksIDB4YmMsIDB4ZGIsIDB4NDQsIDB4OWMsIDB4NDgsIDB4NzUsCisJMHgzYywgMHg3NSwgMHhiYywgMHhlYSwgMHg3MiwgMHg5ZCwgMHg2YiwgMHhhNywgMHgzNywgMHg1NywgMHgxMCwgMHg3YSwKKwkweDdlLCAweDYyLCAweGNhLCAweDFmLCAweDczLCAweDRjLCAweDU2LCAweGY0LCAweDI3LCAweDYyLCAweDQxLCAweDhiLAorCTB4NjMsIDB4OGMsIDB4YmUsIDB4NGYsIDB4YmIsIDB4YzcsIDB4YTAsIDB4YzcsIDB4YTksIDB4ZjMsIDB4ZjksIDB4ZGUsCisJMHgwZSwgMHg3YywgMHgzZCwgMHhlYSwgMHgwMiwgMHhlYSwgMHg3MywgMHhiNSwgMHgwMSwgMHhmMSwgMHgzYywgMHg3NCwKKwkweGZkLCAweDQ4LCAweDU5LCAweDczLCAweGY5LCAweGIxLCAweDg3LCAweDgzLCAweDg5LCAweDk5LCAweGFjLCAweGVhLAorCTB4MDYsIDB4ZjgsIDB4N2IsIDB4ZTUsIDB4NmIsIDB4Y2MsIDB4MDcsIDB4OWQsIDB4OTIsIDB4NDAsIDB4NmQsIDB4OWQsCisJMHg4NiwgMHhiMSwgMHgxOSwgMHg2YiwgMHgxYSwgMHhhZCwgMHhkMCwgMHgwZCwgMHgyMiwgMHg1NywgMHhjMSwgMHgxYiwKKwkweDZmLCAweGNjLCAweDkxLCAweDVmLCAweDgzLCAweDFkLCAweDI2LCAweGJlLCAweDVhLCAweGQ4LCAweDZlLCAweDQ5LAorCTB4ODcsIDB4ZDYsIDB4M2UsIDB4ZjMsIDB4NGUsIDB4ODQsIDB4ZmUsIDB4YzksIDB4NzAsIDB4YjIsIDB4MWYsIDB4N2UsCisJMHhiNiwgMHg2MiwgMHgwZiwgMHg5OCwgMHhhZiwgMHg5YywgMHg0MCwgMHgzYywgMHg1NiwgMHg5YiwgMHg2MywgMHg4MSwKKwkweDdjLCAweDhkLCAweGIzLCAweDNmLCAweDBiLCAweGJmLCAweDcyLCAweGE5LCAweGVlLCAweDkxLCAweDJmLCAweDllLAorCTB4ZDAsIDB4ZGMsIDB4NjYsIDB4NjksIDB4YWUsIDB4NTUsIDB4NzUsIDB4NmMsIDB4YTksIDB4ZjgsIDB4MzAsIDB4Y2UsCisJMHg0NSwgMHgzNiwgMHg1YiwgMHg0MywgMHg3OSwgMHhhZiwgMHgzZiwgMHgyYywgMHhjNSwgMHgyMiwgMHhkYiwgMHhkMiwKKwkweGRkLCAweGE0LCAweGU3LCAweGVlLCAweGQ3LCAweDc2LCAweDZjLCAweDk5LCAweDg1LCAweGFmLCAweDU4LCAweDljLAorCTB4NzcsIDB4ZjAsIDB4YmYsIDB4MDUsIDB4ZmYsIDB4N2QsIDB4ZjgsIDB4ZGYsIDB4MjUsIDB4ZTksIDB4NjksIDB4ZmEsCisJMHhhZiwgMHhhYywgMHhlNSwgMHhiNCwgMHgzNiwgMHhhYywgMHgxZiwgMHhmNiwgMHg3MCwgMHhlMCwgMHhmNCwgMHg2YiwKKwkweDRkLCAweDljLCAweDkzLCAweDJmLCAweDM2LCAweGNhLCAweDA5LCAweGYzLCAweGE0LCAweGJlLCAweDhlLCAweDYwLAorCTB4YmUsIDB4ZDQsIDB4YWYsIDB4ZjUsIDB4ZDUsIDB4ZDYsIDB4YjAsIDB4MmMsIDB4YWYsIDB4ZWUsIDB4NDUsIDB4OWUsCisJMHg2ZSwgMHg5MSwgMHg4MywgMHg0NSwgMHhiZiwgMHg3NiwgMHgxNSwgMHg5MywgMHg0MywgMHhkNSwgMHhkYSwgMHg5NSwKKwkweDY0LCAweDgyLCAweDQzLCAweGI3LCAweDFmLCAweGNiLCAweDRlLCAweDI5LCAweDllLCAweGMwLCAweGIyLCAweDg2LAorCTB4YWUsIDB4M2YsIDB4MzYsIDB4MzksIDB4ZmYsIDB4Y2UsIDB4NjMsIDB4NGIsIDB4OTgsIDB4NzAsIDB4ZGMsIDB4OWIsCisJMHg1ZiwgMHgwZSwgMHgzMywgMHg0NCwgMHgyYywgMHgxZCwgMHhiZiwgMHg5MywgMHg1MywgMHhkZiwgMHgwZCwgMHhmYiwKKwkweGY2LCAweDYzLCAweDFlLCAweGUyLCAweGVjLCAweGUyLCAweGY2LCAweDEyLCAweDdlLCAweGQ5LCAweDhmLCAweDQ3LAorCTB4ODksIDB4MjMsIDB4ZTUsIDB4NzMsIDB4YjUsIDB4ZDgsIDB4OGYsIDB4MTAsIDB4Y2UsIDB4NWYsIDB4MDIsIDB4OTYsCisJMHg5MywgMHhjMywgMHgzZSwgMHgyZSwgMHg3NiwgMHgxOSwgMHgzZiwgMHg5MCwgMHgzOCwgMHhkMywgMHg0NCwgMHgwZCwKKwkweGY2LCAweGM4LCAweGM3LCAweDlhLCAweDVlLCAweGM0LCAweDVjLCAweDE5LCAweGY5LCAweDdkLCAweGY5LCAweDcxLAorCTB4ZjksIDB4NzUsIDB4NzksIDB4MGMsIDB4ZjIsIDB4M2QsIDB4ODksIDB4MzksIDB4ZjcsIDB4Y2IsIDB4YWYsIDB4Y2EsCisJMHg3YiwgMHhlNSwgMHg1YSwgMHg3OSwgMHg1YywgMHhkZSwgMHgyYSwgMHhlZiwgMHg0MiwgMHg0YywgMHgzNSwgMHg0YSwKKwkweGFjLCAweGE3LCAweDg3LCAweDk1LCAweDFlLCAweDk2LCAweDg5LCAweDczLCAweDhhLCAweDAxLCAweGJjLCAweDQ1LAorCTB4YmYsIDB4ZTcsIDB4ODgsIDB4ZmEsIDB4ZDksIDB4MDEsIDB4ZjIsIDB4ZjQsIDB4NmYsIDB4MTgsIDB4Y2YsIDB4MTMsCisJMHg5YiwgMHg1OSwgMHgyYywgMHhmYiwgMHgxOCwgMHg4ZSwgMHg0MywgMHhkZCwgMHg1OCwgMHhkYiwgMHhlNiwgMHgzNywKKwkweDI5LCAweDIzLCAweGU3LCAweDIyLCAweDgxLCAweGQxLCAweDczLCAweGExLCAweGMwLCAweDQzLCAweGZhLCAweDdkLAorCTB4MGIsIDB4ZWIsIDB4OWQsIDB4MTUsIDB4MzksIDB4ZTEsIDB4M2EsIDB4ZTQsIDB4Y2QsIDB4YzEsIDB4MTEsIDB4YzgsCisJMHhjMiwgMHgyOCwgMHg1NCwgMHhmZCwgMHgyMywgMHhjZSwgMHgxYSwgMHgwMSwgMHg0OSwgMHg1MywgMHgxZiwgMHhjMywKKwkweGNmLCAweDRjLCAweDllLCAweDc2LCAweDI1LCAweDViLCAweDk4LCAweDBkLCAweDE4LCAweDNjLCAweDlhLCAweDhkLAorCTB4NzYsIDB4MWYsIDB4ZGEsIDB4YmYsIDB4ZjQsIDB4ZGEsIDB4M2IsIDB4MjQsIDB4N2IsIDB4NDEsIDB4NTIsIDB4ZWYsCisJMHhhYiwgMHgzZiwgMHhmYywgMHg3MywgMHhhZiwgMHg2ZiwgMHgxMCwgMHg3ZCwgMHhlMCwgMHhjYywgMHg1NywgMHhkOCwKKwkweGY3LCAweDhhLCAweGQ3LCAweGM3LCAweDMzLCAweDYxLCAweGFkLCAweDNlLCAweGFlLCAweDdjLCAweDk1LCAweGI1LAorCTB4YzcsIDB4ODUsIDB4ZGYsIDB4MmYsIDB4MTgsIDB4NGMsIDB4ZTgsIDB4ZmIsIDB4NWQsIDB4NDYsIDB4YjcsIDB4MTEsCisJMHgxMywgMHhmOCwgMHhhZiwgMHgyZSwgMHhjNiwgMHg2MCwgMHg0NSwgMHhjOCwgMHhkNywgMHg3YSwgMHhlOCwgMHhjNCwKKwkweGJmLCAweDZmLCAweDVlLCAweDZhLCAweDViLCAweDQzLCAweDlmLCAweGQ0LCAweDYwLCAweGI0LCAweDNmLCAweDkxLAorCTB4OWUsIDB4ZjksIDB4ZGIsIDB4MWUsIDB4OWUsIDB4ZjcsIDB4MzAsIDB4ZGUsIDB4MGQsIDB4NjcsIDB4NTUsIDB4MjAsCisJMHg2ZSwgMHgzYywgMHgwZSwgMHhkOSwgMHg2ZSwgMHg5NSwgMHgzNSwgMHg2NywgMHg0OCwgMHhhZiwgMHg1ZSwgMHhlOCwKKwkweGVhLCAweDE0LCAweGU0LCAweGQ2LCAweDk1LCAweGI5LCAweDcyLCAweDI4LCAweDMwLCAweDUyLCAweDQ4LCAweDg5LAorCTB4YzEsIDB4NTMsIDB4NWIsIDB4OTIsIDB4ODksIDB4YTYsIDB4ZTQsIDB4ZTQsIDB4NDAsIDB4NjIsIDB4MGIsIDB4ZjMsCisJMHg5MCwgMHhkOSwgMHg3ZSwgMHg1NywgMHgyZSwgMHg5NSwgMHg2OSwgMHg4ZiwgMHg3MywgMHg3MiwgMHg3OSwgMHgyMCwKKwkweGUxLCAweDE2LCAweDg1LCAweGI4LCAweDE4LCAweDU3LCAweDJlLCAweDQzLCAweDM2LCAweGZmLCAweDcwLCAweDZlLAorCTB4OTcsIDB4MWMsIDB4MmEsIDB4YTgsIDB4MWYsIDB4ZGMsIDB4MWIsIDB4OTYsIDB4OTcsIDB4ZTUsIDB4ZDIsIDB4YzAsCisJMHhjYiwgMHhiNywgMHgyZSwgMHhiOSwgMHg5MywgMHgzOCwgMHg1MywgMHhmMiwgMHhlMSwgMHg4MSwgMHg2ZSwgMHhiMywKKwkweDZmLCAweGM1LCAweDIxLCAweDA5LCAweGYzLCAweDIxLCAweDVhLCAweDUzLCAweDczLCAweDU2LCAweDQ4LCAweDdhLAorCTB4NWYsIDB4YzQsIDB4OGIsIDB4Y2IsIDB4ZTEsIDB4NzMsIDB4MDcsIDB4ZWUsIDB4MzMsIDB4ZjUsIDB4OTQsIDB4ODAsCisJMHhiZiwgMHhjZiwgMHgzMCwgMHhmYywgMHgxOCwgMHgzZSwgMHhlNywgMHhkMywgMHhjNiwgMHg5ZiwgMHhhNywgMHgyYiwKKwkweDkwLCAweGJlLCAweGQwLCAweDI2LCAweGExLCAweDU3LCAweGJlLCAweDBjLCAweGJhLCAweDg2LCAweGU0LCAweDQwLAorCTB4N2YsIDB4YTUsIDB4ZjIsIDB4MGQsIDB4MzcsIDB4MTQsIDB4OWYsIDB4NDQsIDB4OGMsIDB4ODIsIDB4ZmQsIDB4Y2IsCisJMHhlYSwgMHhkMywgMHhlZCwgMHhhMCwgMHg0OSwgMHhiMywgMHg0NCwgMHg0ZiwgMHhmYiwgMHhlYiwgMHhhZCwgMHhmMCwKKwkweGIwLCAweDBjLCAweGU3LCAweDU3LCAweDFiLCAweDViLCAweGU2LCAweDYzLCAweDFiLCAweGZjLCAweGY5LCAweDBjLAorCTB4YTYsIDB4YWMsIDB4YzcsIDB4ZWEsIDB4MGYsIDB4NzgsIDB4ZGYsIDB4NDksIDB4NzgsIDB4ZWQsIDB4N2IsIDB4MDMsCisJMHgwZiwgMHg4NiwgMHgzYSwgMHgyNCwgMHhlNCwgMHhmYywgMHg3MCwgMHgxZCwgMHhiMSwgMHg5MSwgMHgwYiwgMHgwNSwKKwkweGJmLCAweDFmLCAweDdlLCAweDYyLCAweGM4LCAweGY3LCAweDg3LCAweDY1LCAweGRiLCAweGQyLCAweDU5LCAweGNiLAorCTB4YjYsIDB4OWUsIDB4ZjksIDB4NmYsIDB4N2EsIDB4NzMsIDB4YTYsIDB4YmMsIDB4YjEsIDB4ODgsIDB4MzksIDB4NjIsCisJMHhhYiwgMHhkNCwgMHgzZSwgMHg5OSwgMHhiMSwgMHg5ZiwgMHhjOSwgMHhiMywgMHhmZCwgMHg4OSwgMHg1NywgMHgxNSwKKwkweDI3LCAweDViLCAweDdkLCAweDg2LCAweGY3LCAweDExLCAweDQzLCAweDk2LCAweGY1LCAweDk5LCAweGQ4LCAweDZlLAorCTB4ZDAsIDB4MzcsIDB4MTMsIDB4YmIsIDB4YzcsIDB4OWUsIDB4YjUsIDB4ODIsIDB4MDEsIDB4ZTMsIDB4OGYsIDB4MzQsCisJMHhjOSwgMHgwZiwgMHhhMiwgMHhiMCwgMHhkYiwgMHg4OCwgMHhmMSwgMHhiMiwgMHhjYywgMHg3ZiwgMHhiOSwgMHg3NywKKwkweDNjLCAweDNmLCAweDg1LCAweDdkLCAweDg5LCAweDUzLCAweDQ5LCAweDZiLCAweDAyLCAweGZiLCAweGUzLCAweDE5LAorCTB4MTAsIDB4MDMsIDB4NmEsIDB4ODEsIDB4NGUsIDB4NWQsIDB4NzgsIDB4M2YsIDB4YzQsIDB4NGYsIDB4ZmQsIDB4ZmUsCisJMHhmYiwgMHhhZiwgMHg4NiwgMHgwZSwgMHhlMywgMHhmZSwgMHgwZCwgMHgyZSwgMHg0YywgMHgyYywgMHhlNiwgMHg0MiwKKwkweDg2LCAweDNkLCAweDBjLCAweDZjLCAweGFkLCAweGRjLCAweGZhLCAweGQ4LCAweDU4LCAweDFmLCAweDRmLCAweDQ3LAorCTB4OGMsIDB4NTIsIDB4MGMsIDB4N2UsIDB4MjAsIDB4NjUsIDB4ODIsIDB4YmMsIDB4ZDksIDB4ODksIDB4ZmUsIDB4OTUsCisJMHhiNywgMHg1MywgMHhmYSwgMHhlYSwgMHg3ZSwgMHhkZiwgMHg4NywgMHg1NSwgMHg2YywgMHhmNywgMHg2NCwgMHg2MSwKKwkweGFmLCAweGMxLCAweGU2LCAweDU5LCAweDhiLCAweDkyLCAweGVhLCAweDRlLCAweGRhLCAweDI3LCAweGIwLCAweGRmLAorCTB4NzQsIDB4MjgsIDB4NTEsIDB4Y2MsIDB4NDksIDB4NGMsIDB4NjYsIDB4YTEsIDB4MmYsIDB4ZGUsIDB4ODAsIDB4ZWMsCisJMHg1ZiwgMHgyYiwgMHhjNywgMHgwMywgMHg2OSwgMHhlYywgMHhlOSwgMHg2MCwgMHg2MSwgMHg0OCwgMHgyNiwgMHgyZiwKKwkweGU4LCAweDM3LCAweDVmLCAweGQwLCAweGZiLCAweDQzLCAweDUyLCAweDJhLCAweDI0LCAweGI2LCAweGNjLCAweDgyLAorCTB4ZmYsIDB4NjYsIDB4MGIsIDB4YzQsIDB4MTcsIDB4ZjUsIDB4YzYsIDB4NDcsIDB4MzEsIDB4ZTMsIDB4NDIsIDB4NjEsCisJMHgyMywgMHhlYywgMHg4MywgMHhhNCwgMHgyZSwgMHhjMSwgMHhmZiwgMHhiOSwgMHg1NCwgMHhkZSwgMHgwMiwgMHgzZSwKKwkweGMzLCAweGZkLCAweGIyLCAweDgzLCAweDVmLCAweGU4LCAweGNjLCAweGYyLCAweDAwLCAweGU0LCAweDljLCAweDdiLAorCTB4YjEsIDB4NjUsIDB4NmUsIDB4MzMsIDB4Y2UsIDB4OGUsIDB4MzgsIDB4MjIsIDB4YzUsIDB4OGYsIDB4ZmYsIDB4MDcsCisJMHhlNywgMHhlYiwgMHhiZiwgMHhmNywgMHg3NiwgMHhiNSwgMHhkMywgMHhiMywgMHhiYSwgMHgyZiwgMHhkOCwgMHg2NSwKKwkweGM0LCAweDAwLCAweGQ5LCAweDdlLCAweDYzLCAweGI3LCAweGQzLCAweDkxLCAweDc2LCAweDQ5LCAweGRmLCAweDQzLAorCTB4M2IsIDB4ZGUsIDB4YTEsIDB4MzEsIDB4YTIsIDB4ZjIsIDB4NjIsIDB4ODQsIDB4ZjcsIDB4ZGYsIDB4NTksIDB4NjcsCisJMHhlOCwgMHgxNywgMHg2ZSwgMHg2OCwgMHhiZiwgMHg4ZCwgMHhkZiwgMHgzNiwgMHhlOSwgMHg3NCwgMHhmOCwgMHg2YiwKKwkweGUzLCAweGY3LCAweGM2LCAweDNhLCAweGQ2LCAweDc3LCAweDNiLCAweDlkLCAweDI0LCAweGQ2LCAweGZhLCAweDlkLAorCTB4OTcsIDB4MmYsIDB4YzAsIDB4ZjUsIDB4MmMsIDB4OWYsIDB4NTksIDB4ZWIsIDB4YWQsIDB4Y2IsIDB4NzksIDB4ZGIsCisJMHgzMCwgMHg0ZiwgMHhhYiwgMHhiNywgMHg1NiwgMHg5YiwgMHhlNiwgMHgyNywgMHhjZCwgMHg1YSwgMHg4OCwgMHg3MSwKKwkweDBiLCAweGVmLCAweGFkLCAweGQzLCAweGVmLCAweDhjLCAweDYxLCAweDJmLCAweGVhLCAweGRiLCAweDdmLCAweDVkLAorCTB4NDcsIDB4ZGMsIDB4NWMsIDB4YTcsIDB4ZDMsIDB4YTYsIDB4MTgsIDB4Y2YsIDB4OWIsIDB4MWQsIDB4MWQsIDB4YjgsCisJMHhlNiwgMHg5YSwgMHgxYywgMHg2MywgMHhmMiwgMHhlMSwgMHhhNSwgMHgzMiwgMHhlNywgMHg2NywgMHgzYiwgMHgyNSwKKwkweDQ3LCAweDM1LCAweDlmLCAweDYxLCAweGIwLCAweDdjLCAweGE1LCAweGMyLCAweGZkLCAweDMyLCAweDc5LCAweDRlLAorCTB4ZjEsIDB4NzUsIDB4MzMsIDB4NzksIDB4OGIsIDB4ZGYsIDB4YmQsIDB4ZjAsIDB4M2IsIDB4MzksIDB4ZmEsIDB4MTIsCisJMHg2MywgMHgzMiwgMHg4MSwgMHhmMywgMHhiYiwgMHgwYywgMHg5ZiwgMHg2YSwgMHhjMSwgMHg3YywgMHgxMywgMHg4YiwKKwkweGJmLCAweGZkLCAweDM4LCAweDk3LCAweDEwLCAweDY0LCAweDhjLCAweDMyLCAweDRhLCAweDk5LCAweGMyLCAweGY5LAorCTB4OGQsIDB4ZGIsIDB4ZjIsIDB4ZWUsIDB4MDAsIDB4ZTUsIDB4NzksIDB4NDAsIDB4YWUsIDB4NTQsIDB4ZTUsIDB4MzksCisJMHgwNywgMHg3OSwgMHhhNiwgMHgyYywgMHhlNywgMHgyMCwgMHhkMywgMHg4NiwgMHhhZiwgMHhmNywgMHhmMSwgMHgxYiwKKwkweDZiLCAweDg0LCAweGViLCAweDI1LCAweGY1LCAweDIxLCAweDJlLCAweDgyLCAweGFmLCAweDZkLCAweDEzLCAweDk3LAorCTB4MmIsIDB4MmUsIDB4ZmUsIDB4MzAsIDB4ZjQsIDB4NWEsIDB4OTMsIDB4ZjcsIDB4MWQsIDB4MDAsIDB4YWUsIDB4YWYsCisJMHhiYywgMHgyOCwgMHhlOSwgMHgwYiwgMHgyZCwgMHhkOCwgMHg3NywgMHhiYywgMHg5YiwgMHg2NywgMHg5NiwgMHhiZCwKKwkweGMyLCAweDdmLCAweDlmLCAweDE3LCAweDg5LCAweDM3LCAweGE1LCAweDNmLCAweGNiLCAweDZiLCAweGM2LCAweDc5LAorCTB4ZWIsIDB4MzEsIDB4NjYsIDB4MTAsIDB4NzQsIDB4NmUsIDB4YzEsIDB4ZmMsIDB4ZGMsIDB4ZTMsIDB4NzIsIDB4ZTMsCisJMHg3OCwgMHgzZiwgMHg1NCwgMHg4MywgMHg0ZiwgMHhmNSwgMHhlOSwgMHhiZCwgMHg0YSwgMHhkNywgMHhjYywgMHhlYSwKKwkweDM3LCAweDVhLCAweDQ2LCAweDA2LCAweDI3LCAweDBhLCAweGU0LCAweGZiLCAweDE4LCAweGY4LCAweDk2LCAweDNlLAorCTB4MzEsIDB4ZjksIDB4MjUsIDB4YTUsIDB4ZTcsIDB4NTAsIDB4MmEsIDB4OTAsIDB4N2YsIDB4NDMsIDB4OWEsIDB4YzMsCisJMHhjOCwgMHhjMiwgMHhiNiwgMHhlYywgMHhkMSwgMHhmMSwgMHhiMSwgMHgyNSwgMHhmOSwgMHhlZSwgMHgwZSwgMHg2OCwKKwkweGRjLCAweDlkLCAweDJkLCAweGFjLCAweDk0LCAweDFlLCAweGQ1LCAweDQxLCAweGRkLCAweDFlLCAweDZmLCAweGMzLAorCTB4NWUsIDB4MjgsIDB4OTYsIDB4N2IsIDB4YmYsIDB4MWMsIDB4MjksIDB4MGYsIDB4ODIsIDB4MGUsIDB4MzEsIDB4NzksCisJMHgwNiwgMHg3ZSwgMHhmMywgMHg3MywgMHhlNSwgMHhiYiwgMHg2NCwgMHgzMSwgMHg4MiwgMHg3ZCwgMHg1NSwgMHg2NSwKKwkweDZjLCAweDU4LCAweDllLCAweDlmLCAweDhkLCAweDdiLCAweGQ3LCAweDA5LCAweDc3LCAweGQxLCAweGRhLCAweDhlLAorCTB4M2QsIDB4NTAsIDB4OWUsIDB4MjgsIDB4NTcsIDB4MWMsIDB4MTcsIDB4NDQsIDB4MmMsIDB4YzIsIDB4NzksIDB4OGYsCisJMHgxOCwgMHhkZCwgMHg4NiwgMHg3OSwgMHg4YiwgMHgxMSwgMHhjYSwgMHgyZiwgMHhmNywgMHgxNiwgMHhmMiwgMHg2NCwKKwkweDk2LCAweDcxLCAweDE1LCAweGRmLCAweGQ5LCAweGQ4LCAweGE0LCAweDRjLCAweGRkLCAweDU5LCAweDI0LCAweDE0LAorCTB4MDcsIDB4YmEsIDB4NzQsIDB4MDYsIDB4ZmUsIDB4M2MsIDB4YmUsIDB4NWMsIDB4ZmEsIDB4ZGYsIDB4NTEsIDB4NTAsCisJMHg4ZiwgMHhjMiwgMHg1NiwgMHgxNiwgMHg2MCwgMHgyYiwgMHgwYiwgMHhiMCwgMHg5MSwgMHg5MCwgMHg4NSwgMHg2YiwKKwkweDA1LCAweGQ4LCAweGM4LCAweDAyLCAweDZjLCAweDI0LCAweGY0LCAweGQ5LCAweDliLCAweDg4LCAweGVkLCAweGRlLAorCTB4MDAsIDB4MGYsIDB4MTksIDB4NWYsIDB4ZmIsIDB4MzAsIDB4N2QsIDB4NmQsIDB4ZmMsIDB4ZmQsIDB4MTcsIDB4ZWEsCisJMHg1MiwgMHg2MSwgMHg3OCwgMHhkMCwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGJueDJfUlhQX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIGNvbnN0IHUzMiBibngyX1JYUF9iMDZGd1JvZGF0YVsoMHgyNC80KSArIDFdID0gewotCTB4MDgwMDQ1OTAsIDB4MDgwMDQ1OTAsIDB4MDgwMDQ1MDgsIDB4MDgwMDQ1NDAsIDB4MDgwMDQ1NzQsIDB4MDgwMDQ1OTgsCi0JMHgwODAwNDU5OCwgMHgwODAwNDU5OCwgMHgwODAwNDQ3OCwgMHgwMDAwMDAwMCB9OworCTB4MDgwMDQ1OGMsIDB4MDgwMDQ1OGMsIDB4MDgwMDQ1MDQsIDB4MDgwMDQ1M2MsIDB4MDgwMDQ1NzAsIDB4MDgwMDQ1OTQsCisJMHgwODAwNDU5NCwgMHgwODAwNDU5NCwgMHgwODAwNDQ3NCwgMHgwMDAwMDAwMCB9OwogCiBzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9yeHBfZndfMDYgPSB7Ci0JLyogRmlybXdhcmUgdmVyc2lvbjogNC4xLjEgKi8KKwkvKiBGaXJtd2FyZSB2ZXJzaW9uOiA0LjQuMiAqLwogCS52ZXJfbWFqb3IJCQk9IDB4NCwKLQkudmVyX21pbm9yCQkJPSAweDEsCi0JLnZlcl9maXgJCQk9IDB4MSwKKwkudmVyX21pbm9yCQkJPSAweDQsCisJLnZlcl9maXgJCQk9IDB4MiwKIAogCS5zdGFydF9hZGRyCQkJPSAweDA4MDAzMWQwLAogCiAJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKLQkudGV4dF9sZW4JCQk9IDB4NzFkMCwKKwkudGV4dF9sZW4JCQk9IDB4NzFjYywKIAkudGV4dF9pbmRleAkJCT0gMHgwLAogCS5nel90ZXh0CQkJPSBibngyX1JYUF9iMDZGd1RleHQsCiAJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9SWFBfYjA2RndUZXh0KSwKQEAgLTI5NzMsNyArMjk3NCw3IEBACiAJLmJzc19sZW4JCQk9IDB4NDRjLAogCS5ic3NfaW5kZXgJCQk9IDB4MCwKIAotCS5yb2RhdGFfYWRkcgkJCT0gMHgwODAwNzFkMCwKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDcxY2MsCiAJLnJvZGF0YV9sZW4JCQk9IDB4MjQsCiAJLnJvZGF0YV9pbmRleAkJCT0gMHgwLAogCS5yb2RhdGEJCQkJPSBibngyX1JYUF9iMDZGd1JvZGF0YSwKQEAgLTI5OTYsNjg3ICsyOTk3LDYzOSBAQAogfTsKIAogc3RhdGljIHU4IGJueDJfcnYycF9wcm9jMVtdID0gewotCS8qIERhdGU6ICAgICAgICAxMi8wNy8yMDA3IDE1OjAyICovCi0JMHhkNSwgMHg1NiwgMHg0MSwgMHg2YiwgMHgxMywgMHg1MSwgMHgxMCwgMHg5ZSwgMHhkZCwgMHg2YywgMHhiYiwgMHhkYiwKLQkweDY0LCAweGIzLCAweDU5LCAweGFhLCAweGQ2LCAweDUwLCAweDUzLCAweDkzLCAweDA2LCAweDJmLCAweGFkLCAweDI5LAotCTB4NmQsIDB4YWEsIDB4ODIsIDB4NDIsIDB4YTEsIDB4OTIsIDB4NGIsIDB4YzEsIDB4ZjYsIDB4MjAsIDB4ZjUsIDB4MjIsCi0JMHgyMiwgMHhkOCwgMHg0NiwgMHhkMSwgMHg1ZiwgMHgyMSwgMHgwNiwgMHhkYiwgMHhkNCwgMHg3MywgMHgwNSwgMHgwYiwKLQkweGY1LCAweGEwLCAweDNkLCAweDU5LCAweDExLCAweGMxLCAweDA0LCAweDE0LCAweDQ0LCAweDA0LCAweDQxLCAweDQ1LAotCTB4MDQsIDB4M2QsIDB4NzgsIDB4YTgsIDB4NjAsIDB4MmYsIDB4YWQsIDB4MjIsIDB4NTYsIDB4M2MsIDB4NzgsIDB4ZDQsCi0JMHg5MywgMHgyNiwgMHhiZSwgMHgzNywgMHgzMywgMHhhZiwgMHhkZCwgMHhkZCwgMHg2NiwgMHg5YiwgMHgyYSwgMHg4MiwKLQkweDE4LCAweDY4LCAweDNmLCAweGRlLCAweGVjLCAweGJjLCAweDM3LCAweDMzLCAweGRmLCAweGNjLCAweDliLCAweDc5LAotCTB4MmUsIDB4MDAsIDB4ZTgsIDB4NTAsIDB4YWEsIDB4YTYsIDB4MDUsIDB4ODIsIDB4YTUsIDB4NjksIDB4OTYsIDB4MDAsCi0JMHgwZCwgMHhlMCwgMHhhZSwgMHg4ZCwgMHg1OCwgMHhlYSwgMHg3NywgMHgwNSwgMHhkYSwgMHhkYSwgMHg3MCwgMHg0NiwKLQkweDYyLCAweDA0LCAweDg2LCAweGJiLCAweDI1LCAweGVlLCAweDg3LCAweDI3LCAweDk5LCAweGE0LCAweGMwLCAweDlmLAotCTB4NzUsIDB4MjgsIDB4YzksIDB4ZjUsIDB4ZWUsIDB4Y2EsIDB4YzMsIDB4NmEsIDB4MGMsIDB4Y2YsIDB4NTksIDB4ZWQsCi0JMHgwNywgMHhmYywgMHhiZCwgMHg4YiwgMHgxMCwgMHgxZSwgMHhjZSwgMHg1OSwgMHg4OCwgMHgyNSwgMHg0NiwgMHhlOCwKLQkweDczLCAweDExLCAweDk2LCAweDY2LCAweDJkLCAweDM0LCAweDU3LCAweGVhLCAweGIzLCAweDcwLCAweDFmLCAweGU4LAotCTB4MjQsIDB4NWYsIDB4OTksIDB4NGQsIDB4ODgsIDB4ZmYsIDB4MjksIDB4NzgsIDB4NWYsIDB4OTAsIDB4NmIsIDB4MmIsCi0JMHgzYSwgMHg4ZCwgMHg3YSwgMHgxNSwgMHhkZSwgMHgyZiwgMHhmZSwgMHg1MCwgMHhmZiwgMHhiOCwgMHhkOCwgMHgwNywKLQkweGZjLCAweDUzLCAweGZiLCAweDVjLCAweDNjLCAweGE3LCAweDk4LCAweDkzLCAweDdlLCAweGI1LCAweDBiLCAweDgzLAotCTB4Y2EsIDB4MWYsIDB4OWIsIDB4ZTIsIDB4NGIsIDB4OTMsIDB4YjYsIDB4ODksIDB4ZGYsIDB4ZDcsIDB4ODQsIDB4ZGYsCi0JMHhjYSwgMHg2ZSwgMHgzMywgMHg3YiwgMHg0MSwgMHg3ZiwgMHg4MywgMHg3NiwgMHhlNSwgMHg3OSwgMHg4NiwgMHhiMCwKLQkweGU3LCAweGI3LCAweDAzLCAweDIwLCAweGU1LCAweGNiLCAweGY1LCAweDc1LCAweDc5LCAweDhmLCAweGZmLCAweGZiLAotCTB4NmEsIDB4YWYsIDB4M2MsIDB4YWYsIDB4MDUsIDB4YTAsIDB4NTcsIDB4ZWEsIDB4MmQsIDB4YjEsIDB4M2YsIDB4ODMsCi0JMHhiMCwgMHg0ZiwgMHg0ZiwgMHhlMiwgMHg3NywgMHgwMywgMHhmNywgMHhlZiwgMHgxMSwgMHhlNywgMHg0YSwgMHhlYywKLQkweDYyLCAweGVjLCAweDY2LCAweDFjLCAweDY3LCAweGJjLCAweGNhLCAweGI4LCAweDhiLCAweDcxLCAweDI3LCAweGUzLAotCTB4MGUsIDB4YzYsIDB4NzYsIDB4YzYsIDB4OTcsIDB4OGMsIDB4MmUsIDB4NjMsIDB4ODIsIDB4ZDEsIDB4NjEsIDB4N2MsCi0JMHhjZSwgMHg2OCwgMHgzMywgMHhjNiwgMHgxOCwgMHg1ZiwgMHgzMCwgMHhiZSwgMHg2MiwgMHhiNCwgMHgxOCwgMHg2ZiwKLQkweDMwLCAweDdlLCAweDYxLCAweGZjLCAweGFhLCAweGZjLCAweGQwLCAweDA4LCAweDFmLCAweGYxLCAweGZhLCAweDEwLAotCTB4YWYsIDB4OGYsIDB4MzAsIDB4MDIsIDB4ZjMsIDB4YTQsIDB4MDUsIDB4NzgsIDB4YmEsIDB4Y2YsIDB4NzUsIDB4MjQsCi0JMHg3OSwgMHhlNiwgMHhlZiwgMHgzZCwgMHg0YSwgMHg4ZiwgMHhmMywgMHg4NCwgMHgzYywgMHhkZCwgMHg2MywgMHhiZCwKLQkweGY2LCAweGNhLCAweDQyLCAweGEwLCAweGRlLCAweDMyLCAweDViLCAweGQ2LCAweDU5LCAweGFhLCAweDQxLCAweGRlLAotCTB4MTIsIDB4MTgsIDB4Y2YsIDB4YzQsIDB4NDgsIDB4MDIsIDB4ZWQsIDB4MzgsIDB4YWQsIDB4MjQsIDB4NTcsIDB4NmUsCi0JMHg5ZCwgMHg0YywgMHgxMCwgMHg5ZSwgMHg4YiwgMHgxMiwgMHg3ZSwgMHg2MiwgMHgzYywgMHgxZiwgMHgyMywgMHg5YywKLQkweDhjLCAweDJiLCAweDllLCAweGQ1LCAweDM5LCAweGNhLCAweDlmLCAweDY2LCAweDdlLCAweDg0LCAweGQ5LCAweDUzLAotCTB4N2UsIDB4MzUsIDB4YjMsIDB4NGIsIDB4NTgsIDB4ZDQsIDB4ZmQsIDB4ZjEsIDB4NWYsIDB4MWYsIDB4MjAsIDB4MzQsCi0JMHhmMiwgMHg0NCwgMHhlYSwgMHg5YywgMHhkZCwgMHgyNiwgMHhhMCwgMHg1ZSwgMHg5ZiwgMHhiNywgMHgwZCwgMHhiOSwKLQkweDNlLCAweDM4LCAweGZmLCAweDFhLCAweGVmLCAweGM3LCAweGUwLCAweDVjLCAweDk1LCAweGZkLCAweDRiLCAweDI4LAotCTB4OWUsIDB4ZTksIDB4ZGUsIDB4NjQsIDB4ODEsIDB4ZDYsIDB4ZTMsIDB4YzgsIDB4YmIsIDB4YTgsIDB4YjAsIDB4MWUsCi0JMHhlZSwgMHgwMywgMHg1OSwgMHg3ZiwgMHhiZSwgMHhhOCwgMHg2ZSwgMHgyMywgMHg5YywgMHg4ZiwgMHg4YiwgMHg5YywKLQkweDhmLCAweGFlLCAweDkwLCAweDdjLCAweDg0LCAweGRkLCAweGEzLCAweGNkLCAweGY3LCAweGY3LCAweDRjLCAweDI2LAotCTB4YzgsIDB4NWIsIDB4ZDgsIDB4N2QsIDB4NTMsIDB4N2MsIDB4OTMsIDB4ZjQsIDB4NzcsIDB4NzksIDB4YmMsIDB4YzAsCi0JMHgzYywgMHgxNiwgMHg4OSwgMHhjNywgMHhlNCwgMHhlNywgMHg4NiwgMHgzYywgMHg2NSwgMHgzYywgMHgzYywgMHhjOSwKLQkweDM4LCAweGY3LCAweDg2LCAweGU0LCAweDM5LCAweDJjLCAweGJlLCAweGRjLCAweDFmLCAweGU3LCAweDM5LCAweGUwLAotCTB4MWYsIDB4OWMsIDB4YzUsIDB4ZmUsIDB4ZTQsIDB4NDIsIDB4NzEsIDB4NDQsIDB4ZjksIDB4ZWIsIDB4ZTcsIDB4YjksCi0JMHg5MywgMHhmMiwgMHgwZCwgMHhkMywgMHg3OSwgMHgyOSwgMHhhZiwgMHgwMywgMHgzYywgMHhkNSwgMHg3MSwgMHg2ZCwKLQkweDE0LCAweDM0LCAweDA5LCAweDU2LCAweDMxLCAweDRmLCAweGZiLCAweDFkLCAweDVkLCAweGU3LCAweGY1LCAweDc2LAotCTB4ZWIsIDB4NDIsIDB4ZTUsIDB4NWQsIDB4NjIsIDB4MmIsIDB4MTQsIDB4MjYsIDB4MzksIDB4Y2UsIDB4MmMsIDB4ZDksCi0JMHhhMywgMHgzYSwgMHgzMCwgMHhiOCwgMHgwZSwgMHg4NiwgMHhiOCwgMHg3ZiwgMHgwNSwgMHhmOSwgMHhiMCwgMHgyYSwKLQkweDBiLCAweGIzLCAweGRlLCAweDdiLCAweDlkLCAweDg0LCAweDYyLCAweDllLCAweGVhLCAweDZhLCAweDczLCAweDVlLAotCTB4ZDUsIDB4ZGMsIDB4NTEsIDB4N2QsIDB4MDksIDB4YzUsIDB4OTUsIDB4NTIsIDB4YzQsIDB4MTcsIDB4ZWYsIDB4NTEsCi0JMHhjOCwgMHg3OSwgMHg3OSwgMHhkNiwgMHgxYSwgMHhkNCwgMHg0NywgMHgzMywgMHgzYiwgMHhiZSwgMHhmMywgMHgxYywKLQkweGM4LCAweDM1LCAweGVhLCAweDM3LCAweDI2LCAweGM3LCAweGQ1LCAweGNkLCAweGY1LCAweGRkLCAweGIxLCAweGE5LAotCTB4YmUsIDB4ZDUsIDB4N2MsIDB4ZmIsIDB4N2IsIDB4NzUsIDB4Y2UsIDB4ZjEsIDB4OWIsIDB4YTgsIDB4OTcsIDB4NWEsCi0JMHg3OSwgMHhlMCwgMHg5ZCwgMHg2NywgMHg1MSwgMHhjZiwgMHgzYywgMHhhMywgMHg2ZCwgMHhhNiwgMHhmMiwgMHgzYiwKLQkweGVkLCAweDlkLCAweDQzLCAweGIxLCAweDkwLCAweDNjLCAweDc4LCAweGU3LCAweDU3LCAweDMwLCAweDVlLCAweDdmLAotCTB4M2QsIDB4NTIsIDB4NWUsIDB4YTMsIDB4MWMsIDB4YmYsIDB4ZDYsIDB4YTQsIDB4MmYsIDB4YjcsIDB4YjEsIDB4ZGUsCi0JMHg4ZiwgMHg1YSwgMHhiOCwgMHgxZSwgMHg5ZCwgMHg1YiwgMHhlOCwgMHhmMSwgMHhmNiwgMHhmMSwgMHhlZiwgMHgzNSwKLQkweDlhLCAweDA3LCAweGRmLCAweDZhLCAweDhhLCAweGRmLCAweGM3LCAweDIxLCAweGZjLCAweDBlLCAweGZkLCAweDUzLAotCTB4N2UsIDB4MjEsIDB4YzAsIDB4ZWYsIDB4NmEsIDB4NmQsIDB4N2IsIDB4ZmMsIDB4MDIsIDB4YzcsIDB4MGYsIDB4MjEsCi0JMHhmYywgMHhiNiwgMHgzMiwgMHgwZiwgMHg2ZiwgMHhiNywgMHhlMCwgMHg0ZCwgMHhlYSwgMHhjNSwgMHg1OCwgMHhlZiwKLQkweDhkLCAweDQ3LCAweDBmLCAweGZkLCAweDFlLCAweGEyLCAweDdiLCAweDY1LCAweDE2LCAweGQ3LCAweDAyLCAweGJjLAotCTB4ZTUsIDB4NzMsIDB4ZjIsIDB4N2UsIDB4NWYsIDB4ODIsIDB4MmEsIDB4YzcsIDB4YmYsIDB4ZWMsIDB4ZTMsIDB4MjEsCi0JMHgyZSwgMHhmYywgMHg3MywgMHhkMSwgMHhmZSwgMHhlZCwgMHhhYSwgMHhlMiwgMHg4YiwgMHgzZSwgMHg2NywgMHg3MiwKLQkweDg0LCAweDhiLCAweGE4LCAweGVmLCAweDdhLCAweDc4LCAweGYzLCAweGJlLCAweGFmLCAweDVjLCAweGI4LCAweDU1LAotCTB4NTUsIDB4ZmQsIDB4NGMsIDB4ZjYsIDB4MTUsIDB4MTMsIDB4MDYsIDB4NzgsIDB4NGUsIDB4NGUsIDB4NzAsIDB4ZmYsCi0JMHhmYSwgMHgxMCwgMHhhNSwgMHgzZSwgMHg1OSwgMHgxYywgMHhjNSwgMHgzZSwgMHgwMywgMHgxZCwgMHhlYiwgMHhmZCwKLQkweDhjLCAweGQ2LCAweDlkLCAweDcxLCAweDdhLCAweDQ3LCAweDBlLCAweDk4LCAweDM2LCAweGVhLCAweDc1LCAweGM2LAotCTB4MDksIDB4M2IsIDB4NjIsIDB4NzIsIDB4NWYsIDB4MTIsIDB4M2UsIDB4OGUsIDB4YTEsIDB4N2EsIDB4NmUsIDB4YTMsCi0JMHgzZiwgMHgwNSwgMHhmYiwgMHgxMiwgMHhjNywgMHg3OSwgMHg0MCwgMHhjYSwgMHgzYiwgMHgwMiwgMHhmZCwgMHg0OCwKLQkweGU4LCAweGY0LCAweDkyLCAweDdmLCAweDM3LCAweDgxLCAweGUzLCAweDUyLCAweGZiLCAweGQyLCAweDkyLCAweGM3LAotCTB4YzUsIDB4OWEsIDB4ZWEsIDB4ZTMsIDB4ZDksIDB4MTEsIDB4ZTksIDB4NGYsIDB4MDIsIDB4MWMsIDB4OTMsIDB4ZjIsCi0JMHg0OCwgMHgyOCwgMHhmNCwgMHg3NCwgMHg1MywgMHg2ZSwgMHg0YiwgMHg5NSwgMHg3NSwgMHg1YSwgMHg5NywgMHgyZiwKLQkweGUzLCAweDMxLCAweDYzLCAweDY1LCAweDI1LCAweDJmLCAweDYwLCAweDYxLCAweDhlLCAweGRmLCAweDc5LCAweDg2LAotCTB4NzIsIDB4YTcsIDB4MWEsIDB4MjEsIDB4YjksIDB4MzksIDB4YWEsIDB4ZjgsIDB4NDgsIDB4NjAsIDB4N2MsIDB4NzMsCi0JMHhjNCwgMHhjNywgMHhlOSwgMHg2YiwgMHg4NCwgMHhhNywgMHhlMCwgMHgxOCwgMHg2MiwgMHg3NCwgMHg2MywgMHgyZSwKLQkweDViLCAweDg4LCAweDEwLCAweGY3LCAweGY2LCAweGRmLCAweDE2LCAweGUxLCAweDFlLCAweGY2LCAweDRkLCAweDRmLAotCTB4N2UsIDB4ODIsIDB4NzMsIDB4YjUsIDB4NTksIDB4OWUsIDB4YmMsIDB4NzMsIDB4NWQsIDB4ZTYsIDB4YTksIDB4ZDEsCi0JMHhmYywgMHg4ZSwgMHg3MywgMHg1ZCwgMHg5NSwgMHg5YiwgMHhkNCwgMHg5ZiwgMHhlYSwgMHg4MywgMHgyNSwgMHhhZSwKLQkweGZiLCAweDQ2LCAweGVmLCAweDFhLCAweDg5LCAweDRlLCAweGM4LCAweGZjLCAweDRmLCAweGFkLCAweGZiLCAweDk1LAotCTB4MGUsIDB4N2QsIDB4NzcsIDB4OTEsIDB4ZmUsIDB4ZjYsIDB4ZGUsIDB4NWIsIDB4NmUsIDB4YzgsIDB4MWMsIDB4ZmUsCi0JMHgxZiwgMHhkZSwgMHg1NSwgMHg1YiwgMHhiZCwgMHhhNywgMHgxYywgMHhlNiwgMHhmOSwgMHgwNCwgMHhmMywgMHg2YywKLQkweDQwLCAweDRiLCAweDA0LCAweDg5LCAweGIxLCAweDhkLCAweDI5LCAweDNjLCAweDU3LCAweDJmLCAweGQzLCAweDU4LAotCTB4YjcsIDB4NWIsIDB4NjYsIDB4NzAsIDB4YWUsIDB4M2IsIDB4ZjYsIDB4MGMsIDB4ZTksIDB4MTksIDB4MjQsIDB4NGYsCi0JMHgyYSwgMHhiYywgMHgzMiwgMHg0NSwgMHhlZiwgMHg2YywgMHgxZCwgMHg3ZSwgMHgwMSwgMHg1MCwgMHhiNiwgMHg4MiwKLQkweGE3LCAweGQ4LCAweDBkLCAweDAwLCAweDAwLCAweDAwIH07CisJLyogRGF0ZTogICAgICAgIDA1LzEzLzIwMDggMTM6NTAgKi8KKwkweGE1LCAweDU2LCAweDRmLCAweDQ4LCAweDE0LCAweDYxLCAweDE0LCAweDdmLCAweDNiLCAweGZiLCAweDY3LCAweGQ2LAorCTB4ZGQsIDB4ZDksIDB4OWQsIDB4MjUsIDB4ZmYsIDB4NmQsIDB4NjYsIDB4YjgsIDB4NDksIDB4OTcsIDB4ZDUsIDB4MTUsCisJMHhiNSwgMHgyMiwgMHgzYSwgMHgxOCwgMHg4NiwgMHgxNywgMHgyMSwgMHgzYiwgMHg4NCwgMHgyMCwgMHg0NSwgMHgwNCwKKwkweGQ5LCAweDEyLCAweGRlLCAweDgyLCAweDBlLCAweGQxLCAweDI5LCAweDY4LCAweGQxLCAweDM0LCAweDhhLCAweDBhLAorCTB4MTYsIDB4NTIsIDB4MzAsIDB4YTIsIDB4YTQsIDB4NDMsIDB4ODUsIDB4MDQsIDB4ZWQsIDB4NzQsIDB4MGEsIDB4MTIsCisJMHg4MiwgMHg4YSwgMHg4OCwgMHhlYSwgMHgxMiwgMHg3OCwgMHhhOCwgMHg0YiwgMHgxNiwgMHg2MSwgMHhkMCwgMHhhMSwKKwkweDgzLCAweDlkLCAweGJhLCAweGU0LCAweGY0LCAweGJkLCAweGVmLCAweGJkLCAweGNmLCAweDlkLCAweGY5LCAweDljLAorCTB4NTUsIDB4MjEsIDB4NDEsIDB4N2YsIDB4YmMsIDB4NmYsIDB4ZGUsIDB4N2IsIDB4ZGYsIDB4OWIsIDB4ZGYsIDB4N2IsCisJMHhlZiwgMHgzNywgMHg2NiwgMHgwMCwgMHhjMCwgMHg4MCwgMHg5MiwgMHhkMywgMHgyNiwgMHgxMCwgMHg1MiwgMHg0NiwKKwkweDI4LCAweDJlLCAweDIwLCAweDA0LCAweGYwLCAweDE4LCAweGU4LCAweDI3LCAweDZhLCAweDQ5LCAweGJiLCAweGQ0LAorCTB4Y2QsIDB4NzYsIDB4MjcsIDB4NDEsIDB4YTksIDB4MzMsIDB4MjMsIDB4ZmUsIDB4OWUsIDB4ODUsIDB4ZmUsIDB4MWMsCisJMHg2MiwgMHgxOCwgMHhmYSwgMHg3NywgMHgyMSwgMHgxZSwgMHg4NCwgMHgxNywgMHhiOSwgMHhhYywgMHhjMCwgMHhiZiwKKwkweDJlLCAweDk0LCAweGQwLCAweDZlLCAweGE4LCAweDNjLCAweDczLCAweDkyLCAweDMyLCAweGZmLCAweDEyLCAweGM3LAorCTB4N2YsIDB4MGEsIDB4MTMsIDB4MWUsIDB4MjgsIDB4YzQsIDB4MjksIDB4MGYsIDB4MjMsIDB4NzQsIDB4NjUsIDB4MjQsCisJMHgyYywgMHg5NiwgMHhkMSwgMHgxZSwgMHgxOSwgMHg4MSwgMHgxOCwgMHhlNiwgMHg5OSwgMHgxMiwgMHgwZSwgMHg2OCwKKwkweGI3LCAweDg2LCAweDRhLCAweDVkLCAweDVjLCAweDk3LCAweDQxLCAweDdlLCAweDVmLCAweGNhLCAweDM2LCAweDllLAorCTB4YzMsIDB4ZDcsIDB4MDEsIDB4YjQsIDB4YjcsIDB4MjcsIDB4MmUsIDB4OTcsIDB4MTEsIDB4YjMsIDB4MzAsIDB4MTYsCisJMHhiNywgMHhlOCwgMHg3ZCwgMHhkYSwgMHgyOCwgMHhlZCwgMHg1MiwgMHgwNywgMHhjNiwgMHgwOSwgMHhkZiwgMHgwZSwKKwkweGNlLCAweDFiLCAweGM1LCAweGJjLCAweDNmLCAweDVkLCAweGNhLCAweDhiLCAweGY5LCAweGJjLCAweDc5LCAweDVhLAorCTB4NDUsIDB4MWUsIDB4M2MsIDB4OGYsIDB4NzEsIDB4NWQsIDB4MzEsIDB4YWQsIDB4YWUsIDB4OTgsIDB4YTgsIDB4ODMsCisJMHg3OSwgMHgwMCwgMHg1NSwgMHgwNywgMHg2MiwgMHhhMywgMHhiOCwgMHgxNywgMHhmMywgMHhhZSwgMHhmMCwgMHg3YiwKKwkweDAzLCAweDljLCAweGNhLCAweDcxLCAweDdlLCAweDA3LCAweGIxLCAweGMyLCAweGY5LCAweGM0LCAweDJmLCAweGJmLAorCTB4YzcsIDB4ZmEsIDB4M2MsIDB4OGEsIDB4MjcsIDB4N2YsIDB4ZmQsIDB4NjYsIDB4NDEsIDB4M2QsIDB4NTcsIDB4ZmQsCisJMHhjMCwgMHg3YiwgMHgzZSwgMHg4YSwgMHg3YiwgMHhiYywgMHhmZSwgMHhiMCwgMHg4OSwgMHhmZiwgMHg3YiwgMHhlMSwKKwkweGVmLCAweGNmLCAweDRiLCAweGU3LCAweDZmLCAweGFiLCAweGU3LCAweGY5LCAweDIwLCAweGRlLCAweGEyLCAweDFhLAorCTB4NmYsIDB4MmYsIDB4OTksIDB4YjcsIDB4NDEsIDB4ZDgsIDB4NmQsIDB4NjQsIDB4YTUsIDB4NWYsIDB4MDQsIDB4MTAsCisJMHg3NywgMHg4OCwgMHgwMiwgMHgxMCwgMHg3NywgMHgzMiwgMHgxZSwgMHg2MywgMHhiYywgMHhjOSwgMHg3OCwgMHg4MywKKwkweGIxLCAweDkxLCAweGIxLCAweDgxLCAweGIxLCAweDllLCAweDcxLCAweDFiLCAweGUzLCAweDNiLCAweGM2LCAweDBjLAorCTB4YTMsIDB4Y2QsIDB4OTgsIDB4NjYsIDB4N2MsIDB4YzMsIDB4NjgsIDB4MzEsIDB4MjYsIDB4YjUsIDB4N2MsIDB4MmQsCisJMHg4YywgMHg3MSwgMHhjNiwgMHhiYiwgMHg4YywgMHhmYiwgMHhiNSwgMHhmOCwgMHhkZiwgMHg4YywgMHgwYiwgMHg4YywKKwkweGNkLCAweDIxLCAweGMyLCAweDQzLCAweDZjLCAweDIzLCAweGExLCAweDNjLCAweGY3LCAweDNlLCAweGJlLCAweGVlLAorCTB4YWYsIDB4ZjUsIDB4NzcsIDB4YjEsIDB4Y2MsIDB4Y2YsIDB4ZjMsIDB4Y2EsIDB4MmYsIDB4MmUsIDB4ZjksIDB4ODMsCisJMHgwZSwgMHhhZiwgMHhmZiwgMHg5ZCwgMHgwZCwgMHhmYywgMHhjOSwgMHg2ZCwgMHgyMCwgMHgxZiwgMHgxNCwgMHgzNywKKwkweGVkLCAweDUyLCAweDFkLCAweGI3LCAweDM4LCAweGJlLCAweGJlLCAweGIyLCAweDUwLCAweDYzLCAweDhmLCAweGZhLAorCTB4MGEsIDB4ZmEsIDB4N2MsIDB4MDUsIDB4ZWQsIDB4ZDEsIDB4NGUsIDB4ZGUsIDB4YTMsIDB4YTMsIDB4ZWIsIDB4ZTYsCisJMHg5NywgMHhlNiwgMHhkNCwgMHhiYiwgMHg4NywgMHgzMiwgMHg0ZiwgMHg4ZCwgMHgzOSwgMHg3ZiwgMHgxYSwgMHgyYSwKKwkweDE2LCAweGIyLCAweDM0LCAweDE3LCAweGE1LCAweDhkLCAweGVlLCAweGM1LCAweDc4LCAweDllLCAweGNiLCAweGJjLAorCTB4OWEsIDB4NGYsIDB4ZmYsIDB4NWMsIDB4ZDIsIDB4N2MsIDB4YzUsIDB4YjQsIDB4ZjksIDB4YmEsIDB4YjAsIDB4MDksCisJMHhiZiwgMHg0OSwgMHg4ZCwgMHhhNywgMHg3MywgMHhhZSwgMHhlYSwgMHg5NywgMHhjMSwgMHhjNywgMHhlMywgMHhiMSwKKwkweDhjLCAweGNjLCAweDdiLCAweGNkLCAweDkxLCAweDY2LCAweDgzLCAweDM1LCAweDg1LCAweDc2LCAweDA0LCAweGFlLAorCTB4M2IsIDB4MmEsIDB4OGUsIDB4ZjcsIDB4YjIsIDB4NDMsIDB4ZGQsIDB4NDMsIDB4ZjEsIDB4MjksIDB4MjAsIDB4OWUsCisJMHhlNywgMHgzNCwgMHg5ZSwgMHg3MywgMHg1YiwgMHhkMiwgMHhhOSwgMHgxNSwgMHhiNywgMHhhYSwgMHg1MywgMHhmNCwKKwkweGJjLCAweDBkLCAweGJjLCAweDNhLCAweDE1LCAweDg3LCAweGQxLCAweDQxLCAweDViLCAweGRlLCAweDliLCAweDhlLAorCTB4NTEsIDB4OWEsIDB4ZTMsIDB4MzYsIDB4ZTEsIDB4OTksIDB4MDQsIDB4ZTEsIDB4NzIsIDB4YTIsIDB4NGUsIDB4ZmMsCisJMHg3NSwgMHhkZCwgMHhiMSwgMHgyNCwgMHhkOSwgMHhhNywgMHg1MywgMHg2YSwgMHgzZiwgMHg1NCwgMHhiYywgMHhhYSwKKwkweDZiLCAweGEzLCAweDdhLCAweGYwLCAweDdlLCAweDc1LCAweDhmLCAweGFhLCAweDQzLCAweGRkLCAweGU3LCAweGU3LAorCTB4YmYsIDB4ZjYsIDB4YmQsIDB4ODQsIDB4NDUsIDB4YzMsIDB4Y2YsIDB4YzMsIDB4ZWQsIDB4MWUsIDB4YzIsIDB4NDgsCisJMHhhZiwgMHg4NCwgMHhlYywgMHg4YywgMHg0NSwgMHg3MSwgMHhiMywgMHg1NiwgMHgwNCwgMHhlZCwgMHg3ZCwgMHhiMywKKwkweDFmLCAweDMwLCAweGJmLCAweGIxLCAweDY3LCAweGM2LCAweGUxLCAweGZhLCAweDZjLCAweGQ1LCAweDNmLCAweDc5LAorCTB4MGUsIDB4ZWQsIDB4NDAsIDB4ZjYsIDB4MzAsIDB4Y2YsIDB4YzMsIDB4YjAsIDB4OWMsIDB4N2IsIDB4YjEsIDB4ZDcsCisJMHgwNiwgMHg2MiwgMHgwYiwgMHg5NCwgMHhhNCwgMHhhZSwgMHgxYiwgMHg4OSwgMHhkNywgMHgzMiwgMHgzZSwgMHhjYywKKwkweGU3LCAweGEyLCAweDRmLCAweGVkLCAweGZlLCAweDdkLCAweDU5LCAweGEyLCAweGZlLCAweGM3LCAweGZkLCAweDczLAorCTB4ZDMsIDB4ZWQsIDB4MDYsIDB4Y2YsIDB4NjMsIDB4YTIsIDB4MzIsIDB4NTcsIDB4MGUsIDB4ZWEsIDB4ZDcsIDB4NzMsCisJMHhkNiwgMHhiZCwgMHgyYywgMHgxNCwgMHg3YiwgMHg2YiwgMHhlOSwgMHhiMSwgMHhmYSwgMHgwZSwgMHgyYSwgMHgzZCwKKwkweDkyLCAweGM3LCAweDk1LCAweDUyLCAweGQ4LCAweGM3LCAweGNiLCAweDIxLCAweDI4LCAweDA0LCAweGU1LCAweDdmLAorCTB4YTIsIDB4YmUsIDB4MmYsIDB4MDEsIDB4N2IsIDB4YjQsIDB4ZDksIDB4YmQsIDB4YmUsIDB4ZmMsIDB4NjksIDB4MjgsCisJMHgwNCwgMHhlZCwgMHg4MSwgMHhhOSwgMHhlZCwgMHg4ZCwgMHhjZCwgMHg3YiwgMHhkMywgMHhiYywgMHg2ZSwgMHg3ZSwKKwkweDk1LCAweDRlLCAweGU0LCAweDM2LCAweGQ0LCAweDg5LCAweGZmLCAweGQ1LCAweDA1LCAweDAzLCAweDQ4LCAweDE3LAorCTB4NTAsIDB4OGYsIDB4ZmQsIDB4ZjcsIDB4OWIsIDB4YWEsIDB4N2UsIDB4NmQsIDB4ZmYsIDB4YTksIDB4ZWUsIDB4M2YsCisJMHhhYiwgMHg1YiwgMHhkMywgMHgxMSwgMHhlZiwgMHhmYiwgMHgwNywgMHhlOSwgMHg0OCwgMHg0MiwgMHhkMywgMHg4NSwKKwkweDVmLCAweGFiLCAweDU1LCAweDFkLCAweGMxLCAweGU3LCAweGYzLCAweGYzLCAweGQ0LCAweDk3LCAweDhiLCAweGVlLAorCTB4OWEsIDB4YWUsIDB4ZmIsIDB4ZjgsIDB4YWMsIDB4NjMsIDB4M2UsIDB4ODUsIDB4OWYsIDB4OGMsIDB4NWYsIDB4ZDYsCisJMHhlMiwgMHg1NSwgMHg1ZiwgMHhjZiwgMHgzMywgMHhjZiwgMHg0NiwgMHgxZiwgMHhjZCwgMHg5NSwgMHg1OSwgMHhmYywKKwkweGExLCAweGYxLCAweGRkLCAweDViLCAweGMwLCAweGJkLCAweGI4LCAweDA0LCAweDBlLCAweGYzLCAweGY2LCAweGQ5LAorCTB4YzcsIDB4NWYsIDB4OGEsIDB4ZjUsIDB4YzEsIDB4ODQsIDB4NDcsIDB4OGUsIDB4ZTIsIDB4NTksIDB4ZjUsIDB4ODcsCisJMHhmMCwgMHhhMSwgMHhmNCwgMHhjZiwgMHg2YywgMHhjMiwgMHg3NywgMHgwNiwgMHgxZSwgMHgzOCwgMHg2YSwgMHhiZiwKKwkweDZkLCAweDk5LCAweGFmLCAweDg3LCAweGY1LCAweDY0LCAweDk0LCAweGY3LCAweGZhLCAweDViLCAweDgyLCAweDc0LAorCTB4YTMsIDB4MzgsIDB4MjQsIDB4ZjcsIDB4MTQsIDB4OWEsIDB4NzgsIDB4YmYsIDB4OGIsIDB4MjksIDB4YjIsIDB4NWIsCisJMHg1MiwgMHhmNCwgMHg3ZiwgMHg1YiwgMHg4ZiwgMHg2OSwgMHg0OSwgMHhiZiwgMHg5NiwgMHgxNCwgMHg2MSwgMHg1MywKKwkweDEyLCAweGUzLCAweGIyLCAweGYwLCAweGZkLCAweDg4LCAweDc0LCAweDJmLCAweDU0LCAweGY3LCAweDViLCAweGRmLAorCTB4NmIsIDB4N2UsIDB4ZGYsIDB4YmQsIDB4NzgsIDB4ZGUsIDB4MjQsIDB4ZjYsIDB4ZDQsIDB4ZGIsIDB4MGYsIDB4NmIsCisJMHg0ZCwgMHg1ZiwgMHhlZiwgMHg3MSwgMHhmNSwgMHgzOSwgMHhkYiwgMHhjYiwgMHhiNywgMHg5YSwgMHhkYiwgMHg2NywKKwkweDM1LCAweGZhLCAweDM0LCAweGU4LCAweDJhLCAweGRkLCAweDZiLCAweDFmLCAweGM0LCAweDdhLCAweDZkLCAweDQ4LAorCTB4OWIsIDB4MzQsIDB4MWYsIDB4ODQsIDB4MjIsIDB4OGYsIDB4NjEsIDB4NjIsIDB4NTgsIDB4ZWIsIDB4MjQsIDB4ZWIsCisJMHhjNCwgMHhlNCwgMHhiOCwgMHg0YywgMHg3MywgMHg2NCwgMHg1MiwgMHg5ZCwgMHgwZiwgMHhjOCwgMHhjMSwgMHgxZiwKKwkweDllLCAweDdmLCAweDI1LCAweGNmLCAweGQzLCAweDRlLCAweDk4LCAweGNlLCAweGNkLCAweDIxLCAweGM1LCAweDk3LAorCTB4MmQsIDB4ZGYsIDB4N2YsIDB4ODYsIDB4ZjgsIDB4M2EsIDB4MzksIDB4NGQsIDB4NzgsIDB4MDIsIDB4MGUsIDB4NGIsCisJMHg0YywgMHg1NCwgMHhmNSwgMHgyZCwgMHgyZSwgMHgxMSwgMHg1MiwgMHg1ZSwgMHg3ZCwgMHg4YiwgMHg4YSwgMHhmMiwKKwkweGQwLCAweGFlLCAweGYzLCAweGY0LCAweDUxLCAweGZmLCAweDZlLCAweDZjLCAweGI1LCAweDlmLCAweDVlLCAweDlkLAorCTB4YzQsIDB4N2UsIDB4ZWEsIDB4N2EsIDB4MjcsIDB4ZTcsIDB4NDYsIDB4OWIsIDB4Y2YsIDB4NzIsIDB4OGQsIDB4ZjksCisJMHhjYywgMHhkNSwgMHg5OCwgMHg2ZiwgMHg1ZCwgMHgyZiwgMHhhZSwgMHhmMiwgMHhkZSwgMHg0NSwgMHgyMCwgMHgxYSwKKwkweDk2LCAweDFmLCAweDI0LCAweDJiLCAweDMyLCAweDIxLCAweGZiLCAweDZiLCAweDRjLCAweGQyLCAweDg3LCAweGQ0LAorCTB4OGEsIDB4NGUsIDB4ODUsIDB4MjQsIDB4NmYsIDB4ZDYsIDB4MTQsIDB4ZjksIDB4NDUsIDB4ZTgsIDB4M2MsIDB4YWIsCisJMHhmMCwgMHhjYSwgMHg4NCwgMHhmYSwgMHhlZSwgMHhmZSwgMHgwMywgMHg2NSwgMHg2YywgMHg5YSwgMHg1OSwgMHg0MCwKKwkweDBjLCAweDAwLCAweDAwLCAweDAwIH07CiAKIHN0YXRpYyB1OCBibngyX3J2MnBfcHJvYzJbXSA9IHsKLQkvKiBEYXRlOiAgICAgICAgMTIvMDcvMjAwNyAxNTowMiAqLwotCTB4ZWQsIDB4NTksIDB4NWQsIDB4NmMsIDB4NTQsIDB4YzcsIDB4MTUsIDB4OWUsIDB4YmQsIDB4YmIsIDB4N2IsIDB4ZjcsCi0JMHg3YSwgMHg3ZCwgMHhmNywgMHhhZSwgMHg3MSwgMHhhOCwgMHhmZiwgMHhmOSwgMHhiMywgMHgwOSwgMHhkOCwgMHhhOSwKLQkweDIxLCAweGNlLCAweDlhLCAweDk4LCAweDAyLCAweDU1LCAweDYzLCAweDM5LCAweDk1LCAweDgxLCAweGE2LCAweDU1LAotCTB4MGMsIDB4NDksIDB4OWIsIDB4YmUsIDB4MzUsIDB4NzYsIDB4MDIsIDB4YjYsIDB4YTksIDB4NGQsIDB4MmQsIDB4NDMsCi0JMHg4MywgMHg0YSwgMHgxYiwgMHg2NSwgMHg4NSwgMHhkNywgMHhmNiwgMHhjYiwgMHgyNiwgMHhlYSwgMHgyMiwgMHhjMCwKLQkweDI0LCAweGFhLCAweGE4LCAweDFiLCAweGE0LCAweDI4LCAweGVhLCAweGRiLCAweDU2LCAweDZhLCAweDZkLCAweGRhLAotCTB4OTcsIDB4ZmUsIDB4MTAsIDB4YjcsIDB4NGEsIDB4YTQsIDB4NDIsIDB4YTUsIDB4ZjYsIDB4YTEsIDB4NTIsIDB4ODUsCi0JMHg0NCwgMHhkYSwgMHg2MiwgMHg5OSwgMHhjNCwgMHgyMCwgMHg2MywgMHhiYSwgMHg3OSwgMHgyMSwgMHg3NSwgMHg2NywKLQkweGNlLCAweDc3LCAweGU2LCAweGVlLCAweGJkLCAweGViLCAweGI1LCAweDIxLCAweDJkLCAweDhmLCAweGRkLCAweDA3LAotCTB4MWYsIDB4NjYsIDB4ZWUsIDB4OTksIDB4MzMsIDB4ZTcsIDB4ZTcsIDB4OWIsIDB4MzMsIDB4NjcsIDB4MGUsIDB4NjUsCi0JMHg0MiwgMHgwOCwgMHg0MywgMHgyNCwgMHhiMywgMHgxYiwgMHgyNCwgMHgxNSwgMHg1NiwgMHgyMCwgMHgyMCwgMHhmMCwKLQkweDdiLCAweGFjLCAweDhjLCAweGM4LCAweDlmLCAweGIzLCAweDk2LCAweGZjLCAweDFiLCAweDE2LCAweGNmLCAweDFiLAotCTB4NTUsIDB4MzQsIDB4MGUsIDB4MDksIDB4NDUsIDB4MWQsIDB4MjEsIDB4OTIsIDB4NWUsIDB4NWEsIDB4Y2UsIDB4ZjQsCi0JMHg2NywgMHg0YywgMHg3NywgMHgxYiwgMHhhMCwgMHgzZCwgMHg0YywgMHhlYiwgMHg5OCwgMHg5ZSwgMHg2NCwgMHhiYSwKLQkweDkxLCAweGU5LCAweDU2LCAweGE2LCAweDI3LCAweDk4LCAweDdlLCAweDhmLCAweGU5LCAweDA3LCAweDRjLCAweDc3LAotCTB4YjIsIDB4M2MsIDB4ZjksIDB4NGIsIDB4ZGEsIDB4ZjIsIDB4NGYsIDB4NDAsIDB4MjQsIDB4OWIsIDB4YjQsIDB4N2UsCi0JMHgzNiwgMHhhNiwgMHg5YiwgMHhhMCwgMHhlNywgMHg3MywgMHgxYiwgMHgxNSwgMHhkZiwgMHhjZCwgMHhhNSwgMHgzYywKLQkweDFmLCAweGU2LCAweGFmLCAweDY1LCAweDQwLCAweDM3LCAweDYwLCAweGQ1LCAweDRmLCAweDkzLCAweDhmLCAweGViLAotCTB4ZjUsIDB4MjAsIDB4ZGQsIDB4MzEsIDB4ZDAsIDB4OWUsIDB4MjAsIDB4NjgsIDB4N2IsIDB4MzMsIDB4OTEsIDB4ZjQsCi0JMHg0YiwgMHgwNiwgMHhjNiwgMHg5ZCwgMHg1YiwgMHgyYywgMHhiMiwgMHgyZiwgMHg2NCwgMHgyOCwgMHgzOSwgMHhlYiwKLQkweDJkLCAweGYzLCAweDEyLCAweGU2LCAweGJmLCAweDE5LCAweDA3LCAweDdkLCAweDM5LCAweDBhLCAweGZhLCAweDRmLAotCTB4YTYsIDB4ODcsIDB4NGIsIDB4NTksIDB4YmUsIDB4Y2QsIDB4NmEsIDB4OTcsIDB4NjIsIDB4ZmQsIDB4OGMsIDB4YWQsCi0JMHg2OCwgMHg1MCwgMHgyNCwgMHg3OSwgMHg5ZCwgMHgxMCwgMHhkMCwgMHhlYiwgMHhjNywgMHgwMiwgMHhkZiwgMHhkNywKLQkweDZjLCAweGM1LCAweGVjLCAweDBmLCAweDBmLCAweDYzLCAweDVjLCAweDdiLCAweGIxLCAweDhjLCAweGY4LCAweGNmLAotCTB4NjcsIDB4YjUsIDB4ZmUsIDB4MTYsIDB4NzksIDB4M2YsIDB4MTksIDB4ODcsIDB4MWMsIDB4NTEsIDB4NmYsIDB4ZDEsCi0JMHgyNiwgMHhjOSwgMHg2NiwgMHg1MCwgMHhiMSwgMHg0ZCwgMHhjYiwgMHhjMywgMHhlZiwgMHhkYywgMHhhMywgMHhkYSwKLQkweDNmLCAweDE4LCAweGFmLCAweDRkLCAweDgwLCAweDllLCAweDY1LCAweDVhLCAweGQxLCAweDRhLCAweDY0LCAweGZiLAotCTB4ZGYsIDB4OWYsIDB4YjAsIDB4NDgsIDB4OTcsIDB4ZTQsIDB4MzYsIDB4YWYsIDB4MWYsIDB4N2YsIDB4MjMsIDB4ZmQsCi0JMHhjOCwgMHg4MiwgMHgxYSwgMHg0MCwgMHg2ZSwgMHgzYywgMHhhYSwgMHhmOCwgMHhhNCwgMHg3MSwgMHhmNSwgMHg5MCwKLQkweDdiLCAweGIwLCAweGJmLCAweDk4LCAweGZmLCAweDdmLCAweGY5LCAweDE5LCAweGZjLCAweGFmLCAweGU0LCAweGI1LAotCTB4YjMsIDB4ZmUsIDB4MWIsIDB4YTUsIDB4ZmUsIDB4OGEsIDB4ZDYsIDB4MDUsIDB4OTIsIDB4ZGIsIDB4ZmMsIDB4ZmUsCi0JMHhiOSwgMHg5NiwgMHg4OSwgMHhkMywgMHhiZiwgMHg2ZiwgMHg3NiwgMHg5NCwgMHg5MSwgMHhmZCwgMHhjZiwgMHg2MiwKLQkweGZlLCAweDc0LCAweGU3LCAweDE0LCAweGZjLCAweGI0LCAweDlmLCAweGUyLCAweDIyLCAweGEyLCAweGE5LCAweDlmLAotCTB4NjMsIDB4NTUsIDB4NzcsIDB4NGMsIDB4OGQsIDB4NWYsIDB4ZDgsIDB4NzEsIDB4MjMsIDB4OGIsIDB4ZWYsIDB4ZTEsCi0JMHgxMSwgMHgzNSwgMHgzNiwgMHhlNCwgMHgzYSwgMHhmYywgMHhmNiwgMHgwNywgMHgwOSwgMHhlMCwgMHg2OSwgMHg3MywKLQkweDg0LCAweDg2LCAweGY2LCAweDBjLCAweDdkLCAweGI3LCAweGM1LCAweDc4LCAweDE2LCAweGRmLCAweDhmLCAweDk2LAotCTB4YWEsIDB4ZjEsIDB4YjMsIDB4Y2QsIDB4NzMsIDB4MTgsIDB4MzcsIDB4ZjcsIDB4OGYsIDB4ZjEsIDB4NDIsIDB4YTMsCi0JMHg0NCwgMHhmZSwgMHg1OSwgMHg1YSwgMHhiYSwgMHg2OSwgMHg0MCwgMHgxZSwgMHg4NywgMHgzNywgMHgxYSwgMHgzMiwKLQkweGUyLCAweDY0LCAweGFmLCAweGRkLCAweDA5LCAweDNhLCAweDRhLCAweGRmLCAweGVmLCAweDA1LCAweGQyLCAweDY0LAotCTB4NzcsIDB4YTcsIDB4MTMsIDB4OWEsIDB4MDIsIDB4MjMsIDB4ZTMsIDB4Y2EsIDB4YzUsIDB4OGQsIDB4YzYsIDB4ZGQsCi0JMHg4MywgMHhlMiwgMHg2NywgMHhjYywgMHhjNSwgMHgwZiwgMHhmYiwgMHhiZiwgMHg2OSwgMHgyNSwgMHhmYywgMHg4MCwKLQkweDc2LCAweDZlLCAweDAxLCAweDM1LCAweDFiLCAweDE0LCAweDVmLCAweGI4LCAweDA4LCAweDhlLCAweGZjLCAweDdlLAotCTB4ZTYsIDB4ZjgsIDB4MTQsIDB4ZTIsIDB4NDQsIDB4ZTIsIDB4MDMsIDB4NjMsIDB4YzYsIDB4OGIsIDB4YzQsIDB4OTUsCi0JMHhlMiwgMHhhZiwgMHg5NiwgMHhmZSwgMHhkMiwgMHhmMSwgMHg1NywgMHg4MiwgMHgyMiwgMHhlMiwgMHhkYiwgMHgyYywKLQkweGFmLCAweDlmLCAweGVkLCAweDFhLCAweDYwLCAweDdiLCAweGU2LCAweGEzLCAweGRhLCAweGFmLCAweGRhLCAweDFlLAotCTB4ZDAsIDB4NzEsIDB4OWYsIDB4M2QsIDB4MDEsIDB4ODksIDB4MjcsIDB4OGQsIDB4MjMsIDB4OWYsIDB4M2UsIDB4ZTksCi0JMHhmNywgMHhlYSwgMHhmMSwgMHg4ZiwgMHg1YSwgMHhjNiwgMHhhMSwgMHg2YiwgMHhlNywgMHgxNiwgMHhjNSwgMHg2NywKLQkweDI2LCAweDI2LCAweGIyLCAweDdlLCAweDFjLCAweDZlLCAweDEwLCAweDVhLCAweDhlLCAweDk2LCAweGFmLCAweDcwLAotCTB4OTksIDB4OTMsIDB4YjgsIDB4NDQsIDB4ZGMsIDB4Y2UsIDB4NjcsIDB4YmQsIDB4ZTcsIDB4YTgsIDB4YTYsIDB4YzgsCi0JMHgzOSwgMHhmMiwgMHg5ZiwgMHgwNywgMHhlZCwgMHg5NywgMHhhMywgMHgzMSwgMHg0YSwgMHgxMCwgMHgzYiwgMHhhZSwKLQkweGNjLCAweGZhLCAweGY3LCAweDAzLCAweGJlLCAweDIzLCAweDJlLCAweDdlLCAweGQ2LCAweGI2LCAweGIxLCAweGZmLAotCTB4OTgsIDB4NTYsIDB4ZWMsIDB4NTQsIDB4ZjIsIDB4YmEsIDB4NTgsIDB4N2UsIDB4MGIsIDB4Y2IsIDB4YjcsIDB4MGIsCi0JMHhjZSwgMHhkYiwgMHg3MywgMHhlZSwgMHg3OSwgMHhkMywgMHg3MSwgMHhjYiwgMHg5ZiwgMHgzYiwgMHhlZCwgMHgzZiwKLQkweGRhLCAweGJmLCAweGY5LCAweGNhLCAweGFjLCAweDVhLCAweDVmLCAweDdiLCAweDlmLCAweDczLCAweGI4LCAweGJmLAotCTB4YzgsIDB4MzksIDB4ODQsIDB4OWMsIDB4YmYsIDB4M2MsIDB4ZWUsIDB4YjcsIDB4NmIsIDB4ODgsIDB4ZjMsIDB4NWMsCi0JMHgwZiwgMHhlMiwgMHg2NiwgMHhiZCwgMHhmNCwgMHgyYiwgMHhmZSwgMHhmMCwgMHgxOCwgMHhlMSwgMHg1ZCwgMHhiYywKLQkweDE4LCAweDQxLCAweDdjLCAweDFkLCAweGQyLCAweDVmLCAweGIwLCAweDFkLCAweDJmLCAweDdiLCAweGNlLCAweDZiLAotCTB4MDksIDB4ZjksIDB4YjUsIDB4YzMsIDB4YzQsIDB4N2UsIDB4MWQsIDB4ZGQsIDB4NTgsIDB4ZGUsIDB4Y2UsIDB4NzgsCi0JMHhjOCwgMHhmMSwgMHg3OSwgMHg5OSwgMHhiNSwgMHg0OSwgMHhmZiwgMHhlOCwgMHg5ZCwgMHg1MywgMHg5OCwgMHgxZiwKLQkweGRkLCAweDQzLCAweDI0LCAweDdkLCAweGQ1LCAweGQwLCAweGY2LCAweDg2LCAweGQ0LCAweGRmLCAweGM5LCAweDQxLAotCTB4N2MsIDB4OWYsIDB4MGMsIDB4ZjEsIDB4ZjksIDB4N2MsIDB4YWYsIDB4OWUsIDB4ZDYsIDB4NWIsIDB4ZjMsIDB4MTksCi0JMHhhYywgMHhjZiwgMHhiMSwgMHg3ZSwgMHgyNywgMHg4MiwgMHhjNCwgMHgxZiwgMHgxZCwgMHg2MywgMHhiZSwgMHhmMSwKLQkweDExLCAweGJmLCAweDlkLCAweDNmLCAweDQwLCAweDNlLCAweGI3LCAweGJmLCAweDNmLCAweDQyLCAweGU3LCAweGRkLAotCTB4MzEsIDB4NWQsIDB4M2UsIDB4YTIsIDB4Y2UsIDB4ZTgsIDB4MjksIDB4YzUsIDB4NWYsIDB4MjksIDB4YzYsIDB4YjIsCi0JMHg0YSwgMHhkMSwgMHgyYSwgMHhkMSwgMHhiZCwgMHgxNywgMHhlYiwgMHhkZSwgMHgzMCwgMHg5MSwgMHg2ZiwgMHg3YSwKLQkweGY3LCAweDgyLCAweDdlLCAweDg4LCAweGY5LCAweGY1LCAweGNlLCAweGI4LCAweGUyLCAweDVmLCAweDUzLCAweGUzLAotCTB4NGMsIDB4MjksIDB4MWEsIDB4OTcsIDB4ZjYsIDB4MjgsIDB4ZmIsIDB4YTUsIDB4ZWQsIDB4OGMsIDB4Y2YsIDB4YzEsCi0JMHg0NiwgMHhmMCwgMHhmNywgMHgxZCwgMHhhMiwgMHg4ZCwgMHhjZiwgMHgwYywgMHhlNCwgMHgyOCwgMHg1ZiwgMHg0ZCwKLQkweDBlLCAweDVmLCAweDUyLCAweDdlLCAweGE5LCAweDE2LCAweGIzLCAweGM3LCAweDE0LCAweDBkLCAweDg5LCAweDhlLAotCTB4NGQsIDB4ZWMsIDB4OTcsIDB4M2QsIDB4ZmUsIDB4ZmMsIDB4M2MsIDB4YmYsIDB4NTMsIDB4OGQsIDB4NmIsIDB4MjQsCi0JMHg5ZiwgMHgxNywgMHhiZiwgMHgxNiwgMHhjNywgMHgzOSwgMHhlNCwgMHhmYSwgMHhmNSwgMHgxMywgMHgwMywgMHg3NiwKLQkweGE3LCAweDQ4LCAweGZmLCAweDNkLCAweGQxLCAweDE0LCAweDlkLCAweGViLCAweDk4LCAweGU4LCAweDI1LCAweDNjLAotCTB4ODUsIDB4YWMsIDB4YzEsIDB4NGIsIDB4ZjgsIDB4M2UsIDB4ZmYsIDB4MGIsIDB4MmQsIDB4NTcsIDB4ZTEsIDB4NjEsCi0JMHgxNywgMHhkZiwgMHg5ZiwgMHhjMiwgMHg5NSwgMHgxMywgMHhkYSwgMHhjOSwgMHg3MSwgMHhkMCwgMHhmYiwgMHhiNiwKLQkweGUyLCAweGJlLCAweGU5LCAweDA4LCAweGE4LCAweGYxLCAweDNhLCAweDM5LCAweGI2LCAweDI5LCAweDZlLCAweDFkLAotCTB4ZGQsIDB4NmEsIDB4YmQsIDB4NGMsIDB4MDIsIDB4NzQsIDB4N2UsIDB4MWMsIDB4MjksIDB4NWYsIDB4Y2QsIDB4NDcsCi0JMHhhNCwgMHgxZCwgMHhmZSwgMHg3ZCwgMHgwNiwgMHgxMSwgMHgwZiwgMHhmYiwgMHgyOCwgMHhmOSwgMHhlNywgMHhmMywKLQkweGY2LCAweGFkLCAweDhjLCAweGI2LCAweDA3LCAweGYzLCAweGI3LCAweDVkLCAweDdkLCAweDZjLCAweGIyLCAweGFiLAotCTB4NjMsIDB4MTMsIDB4ZjYsIDB4OWIsIDB4NzUsIDB4NzgsIDB4OWYsIDB4NGQsIDB4YmMsIDB4ZWYsIDB4MzEsIDB4YjUsCi0JMHg1ZiwgMHg4MywgMHg0NywgMHg1ZiwgMHhjNSwgMHg2NywgMHg0NSwgMHg2ZiwgMHg5MSwgMHhkYywgMHg3NSwgMHhkNiwKLQkweDc3LCAweDJlLCAweDkxLCAweDdmLCAweGFkLCAweGEzLCAweDUzLCAweGQ4LCAweGZmLCAweGY2LCAweGQ0LCAweDZhLAotCTB4N2EsIDB4ZDcsIDB4YjAsIDB4OWMsIDB4NzUsIDB4ZWMsIDB4ZDcsIDB4ZDgsIDB4NDMsIDB4OGMsIDB4ZGIsIDB4ZWEsCi0JMHg3MSwgMHhjYSwgMHhmYiwgMHg1NywgMHhmYiwgMHg4NywgMHhlNCwgMHhkYiwgMHgwYiwgMHhkMywgMHhhYiwgMHhlOSwKLQkweDJiLCAweDZkLCAweDRhLCAweDgyLCAweDNmLCAweDY1LCAweGQwLCAweGMxLCAweGE4LCAweDgyLCAweDVmLCAweGYyLAotCTB4NzEsIDB4ZDMsIDB4ZmEsIDB4Y2UsIDB4MWYsIDB4YzIsIDB4N2QsIDB4MzQsIDB4ZTgsIDB4ZTYsIDB4MGIsIDB4MjUsCi0JMHhiNywgMHg5ZCwgMHhmMSwgMHgyMCwgMHhlNSwgMHgwNSwgMHhlMCwgMHg5ZiwgMHg4NSwgMHg2OSwgMHg5YywgMHg5YiwKLQkweDEzLCAweDc0LCAweDNlLCAweGJlLCAweDY4LCAweDg3LCAweDY4LCAweGZmLCAweGE4LCAweDc1LCAweDgzLCAweGVmLAotCTB4YTUsIDB4ZmMsIDB4ZmQsIDB4MDMsIDB4NzksIDB4N2QsIDB4MzYsIDB4NjgsIDB4MmYsIDB4ZTcsIDB4ZTksIDB4MWIsCi0JMHg0YywgMHg1MywgMHhiNiwgMHg1YSwgMHg1NywgMHgyYSwgMHhmMywgMHhhZCwgMHg0NSwgMHhmMiwgMHg5MSwgMHg1NywKLQkweDRiLCAweDVjLCAweDdkLCAweDhmLCAweGIwLCAweDljLCAweDhmLCAweDk4LCAweDBhLCAweDk2LCAweDMzLCAweGMwLAotCTB4ZWIsIDB4ZTcsIDB4N2MsIDB4NzIsIDB4MGMsIDB4OGYsIDB4MWMsIDB4N2YsIDB4M2UsIDB4MWEsIDB4ZTMsIDB4N2IsCi0JMHhlZiwgMHhiYywgMHhiOSwgMHg1MiwgMHhiZCwgMHhhNCwgMHg2OCwgMHhiOSwgMHg1YywgMHg4ZiwgMHg1OSwgMHg3ZCwKLQkweDJmLCAweGE0LCAweDFhLCAweDg5LCAweGI0LCAweDg1LCAweDBjLCAweGIyLCAweDc3LCAweDMyLCAweDM1LCAweDAyLAotCTB4M2YsIDB4OGQsIDB4YjMsIDB4OWYsIDB4MjIsIDB4ZjAsIDB4NTMsIDB4NGQsIDB4ZmUsIDB4OWUsIDB4ZTQsIDB4OGQsCi0JMHhmOCwgMHhmYywgMHhjZCwgMHg2YywgMHhmNiwgMHg5ZiwgMHhjNywgMHhmMywgMHhhNiwgMHg4ZSwgMHgyZiwgMHg5MSwKLQkweDM0LCAweGYyLCAweDkwLCAweGJlLCAweDNmLCAweGY1LCAweGJkLCAweDcyLCAweDRiLCAweGU3LCAweDZkLCAweGI5LAotCTB4NmYsIDB4ODEsIDB4M2UsIDB4NDEsIDB4OGEsIDB4NzMsIDB4NzQsIDB4OWMsIDB4ZjMsIDB4ZDEsIDB4ZDUsIDB4YTAsCi0JMHg4ZSwgMHgyNywgMHhmNCwgMHgxYiwgMHhmZiwgMHg4YywgMHhmYSwgMHhlNSwgMHhlZiwgMHhlNSwgMHhiMCwgMHgyMiwKLQkweGNkLCAweGIzLCAweGM3LCAweDg4LCAweGI2LCAweGY0LCAweDFkLCAweGM3LCAweDdjLCAweDY1LCAweGFiLCAweGQyLAotCTB4ZTcsIDB4MjcsIDB4MDEsIDB4OWMsIDB4ZDMsIDB4YjAsIDB4OTgsIDB4YzksIDB4ZTAsIDB4OWUsIDB4MTMsIDB4MTEsCi0JMHhkMiwgMHhhMywgMHhlZSwgMHgzMiwgMHhlMSwgMHhjMiwgMHg4YywgMHhhNiwgMHgzMiwgMHgzZSwgMHg3ZiwgMHg3OSwKLQkweGVjLCAweDJlLCAweDY2LCAweGVmLCAweDg0LCAweGM0LCAweDkzLCAweGZhLCAweDZlLCAweGYyLCAweDc5LCAweDk1LAotCTB4NzgsIDB4YjUsIDB4ZjksIDB4YmMsIDB4M2MsIDB4NGQsIDB4N2MsIDB4ZjYsIDB4MjIsIDB4ZDksIDB4ZjksIDB4MGQsCi0JMHg2YiwgMHg5YywgMHhlYiwgMHhiNCwgMHg4ZiwgMHgzYiwgMHhkNSwgMHhmOCwgMHg3OSwgMHhmYiwgMHg3NSwgMHg5YywKLQkweDc3LCAweGZiLCAweDc1LCAweGU0LCAweDViLCAweDJiLCAweDdjLCAweDExLCAweDc5LCAweGI4LCAweGYzLCAweGEyLAotCTB4NmYsIDB4ZmYsIDB4NzQsIDB4YzgsIDB4ZDAsIDB4ZTcsIDB4ZTcsIDB4N2YsIDB4ZjIsIDB4OWIsIDB4ZmQsIDB4NWQsCi0JMHhmNiwgMHhkYiwgMHhkZCwgMHhkNSwgMHhlMywgMHg5YSwgMHgzNiwgMHhmOSwgMHgxYywgMHhmNiwgMHhkZCwgMHgyZCwKLQkweGI0LCAweDU3LCAweGY5LCAweGVmLCAweDQzLCAweGY3LCAweDFlLCAweDBlLCAweGVkLCAweDYyLCAweDdkLCAweDc2LAotCTB4NzEsIDB4MWUsIDB4ZTAsIDB4ZmEsIDB4NjcsIDB4N2QsIDB4NTAsIDB4ZGYsIDB4OGIsIDB4MWEsIDB4MGYsIDB4N2MsCi0JMHgzZiwgMHgwMiwgMHhhNywgMHhkNiwgMHgyOCwgMHhlYywgMHgxNSwgMHhhZiwgMHhmMiwgMHgzOSwgMHhmOCwgMHgzNywKLQkweGQzLCAweGQ3LCAweDE4LCAweGZmLCAweDI3LCAweGI5LCAweDNlLCAweGQyLCAweGY1LCAweGRkLCAweDNkLCAweGNjLAotCTB4M2IsIDB4MTMsIDB4NmUsIDB4M2QsIDB4YTQsIDB4ZWYsIDB4MWYsIDB4MzUsIDB4MGUsIDB4MDgsIDB4MjcsIDB4NTIsCi0JMHg0YSwgMHhmYiwgMHgyNSwgMHg3ZiwgMHgwNywgMHg4MCwgMHg4ZCwgMHgzZiwgMHgwZCwgMHgzZiwgMHhjZSwgMHhiNiwKLQkweDgyLCAweGVmLCAweDBkLCAweGY4LCAweGM3LCAweGQxLCAweGZhLCAweDJkLCAweDM2LCAweGZhLCAweGRlLCAweDAxLAotCTB4NmQsIDB4ZjAsIDB4YWYsIDB4ZTksIDB4ZmEsIDB4NTcsIDB4ZTMsIDB4NzMsIDB4ODksIDB4NjksIDB4ZWQsIDB4NjYsCi0JMHhiNiwgMHhmMywgMHhiZiwgMHhmMywgMHhiYiwgMHhhNywgMHgxZSwgMHg1YiwgMHhjOSwgMHhlZiwgMHhiNCwgMHhiZSwKLQkweGFkLCAweGVmLCAweDJlLCAweGU2LCAweGNiLCAweDc2LCAweDgzLCAweDY2LCAweDc2LCAweGQzLCAweGZjLCAweDY2LAotCTB4ZTQsIDB4ZGIsIDB4NzAsIDB4ZGIsIDB4ZTksIDB4ZmIsIDB4ZDQsIDB4YTcsIDB4ZmEsIDB4NWQsIDB4NTMsIDB4ZjksCi0JMHgyNSwgMHhkMCwgMHgzMywgMHg0YywgMHgzZiwgMHhmNywgMHgxNCwgMHhlOCwgMHhiOSwgMHhhNywgMHhmYywgMHg3OSwKLQkweGM0LCAweDhjLCAweGZiLCAweGUyLCAweGRiLCAweDg2LCAweGY4LCAweGJlLCAweGUzLCAweGM2LCAweDc3LCAweDNkLAotCTB4ZWEsIDB4MDMsIDB4MTksIDB4YWYsIDB4NTUsIDB4ZTMsIDB4ZTksIDB4YzYsIDB4ZTksIDB4N2UsIDB4ZjEsIDB4N2MsCi0JMHhkOCwgMHg3MSwgMHg0YywgMHhlZCwgMHhjMiwgMHgzZCwgMHgzNywgMHhjYywgMHhlZiwgMHhjZCwgMHg0NSwgMHhmNywKLQkweDllLCAweDJhLCAweDE2LCAweGRmLCAweGM4LCAweGZmLCAweGUzLCAweDRiLCAweGYxLCAweDNkLCAweGIyLCAweGE0LAotCTB4ZjMsIDB4MWYsIDB4ZWUsIDB4NzksIDB4NWQsIDB4ZDcsIDB4MGYsIDB4NzksIDB4ZWEsIDB4N2EsIDB4ZmYsIDB4YmUsCi0JMHhkZiwgMHhhMiwgMHg3YSwgMHg3OSwgMHgzNCwgMHhlMCwgMHhlMiwgMHg4MiwgMHhmOCwgMHhhNywgMHg3OSwgMHg1ZCwKLQkweDE5LCAweGFmLCAweGRiLCAweGI3LCAweDZjLCAweGRkLCAweGI1LCAweDhjLCAweDVhLCAweGY3LCAweGI3LCAweDRmLAotCTB4OTcsIDB4ZjcsIDB4MjUsIDB4N2MsIDB4N2EsIDB4MjYsIDB4NDUsIDB4MWMsIDB4ZjEsIDB4YzEsIDB4N2QsIDB4NjEsCi0JMHgxNiwgMHhlOSwgMHg2MywgMHhmOCwgMHg3MSwgMHhiNywgMHgzNywgMHg4ZSwgMHg3YywgMHhhOCwgMHhkZiwgMHg3OSwKLQkweGZlLCAweGJhLCAweGZlLCAweDhmLCAweDlmLCAweGFlLCAweDVjLCAweGQ3LCAweDZiLCAweDc5LCAweDg4LCAweDVmLAotCTB4YjcsIDB4MTEsIDB4MjMsIDB4YmUsIDB4ZWIsIDB4NDMsIDB4NmEsIDB4NWQsIDB4YmYsIDB4NmIsIDB4NWYsIDB4M2IsCi0JMHhkOSwgMHg3NSwgMHg5OSwgMHhlZCwgMHhhYiwgMHg2MywgMHhmYiwgMHhlNCwgMHhlNywgMHg2ZCwgMHg3NCwgMHg5ZiwKLQkweDU4LCAweGQ3LCAweDg3LCAweGJjLCAweGY2LCAweGZkLCAweDdhLCAweDk1LCAweGZkLCAweDFlLCAweGY0LCAweDFkLAotCTB4YzEsIDB4ZmIsIDB4YzYsIDB4ZjUsIDB4ZmUsIDB4NGEsIDB4NWUsIDB4MmQsIDB4ZDcsIDB4NjMsIDB4OGUsIDB4ZTAsCi0JMHhlNywgMHg1NCwgMHg5MSwgMHhiYSwgMHg0NiwgMHhlZCwgMHhmZiwgMHg3YiwgMHhlOSwgMHgwMCwgMHhiZSwgMHhjNywKLQkweGU4LCAweDFkLCAweDExLCAweGI0LCAweDJlLCAweDY3LCAweDhhLCAweGY5LCAweGU1LCAweDZiLCAweDAxLCAweGYwLAotCTB4MTUsIDB4OGIsIDB4OWIsIDB4ZmEsIDB4MWUsIDB4NjYsIDB4MzksIDB4YzUsIDB4ZWMsIDB4NjYsIDB4M2QsIDB4NWQsCi0JMHgzYywgMHhmMCwgMHgzYSwgMHhlMiwgMHhlYiwgMHg2MywgMHhiZSwgMHg1MCwgMHg5MSwgMHhiZSwgMHgwNCwgMHg0NiwKLQkweGI5LCAweGFkLCAweDU0LCAweDJmLCAweDVlLCAweDM4LCAweDM5LCAweGFkLCAweGY4LCAweDYyLCAweGVlLCAweGJiLAotCTB4Y2MsIDB4YWYsIDB4ZGYsIDB4YzQsIDB4NDMsIDB4ZjAsIDB4MjMsIDB4YmQsIDB4M2YsIDB4NDQsIDB4YWYsIDB4YjMsCi0JMHg5MiwgMHhiZiwgMHhmMCwgMHg3ZSwgMHg1YSwgMHg5OCwgMHhkNiwgMHhmZSwgMHhiNiwgMHhjOSwgMHg0ZSwgMHhkNCwKLQkweGQzLCAweDE3LCAweDBhLCAweGZjLCAweDY4LCAweDc4LCAweGZjLCAweDA4LCAweGZlLCAweDk1LCAweDcxLCAweGVmLAotCTB4N2YsIDB4OTcsIDB4MDMsIDB4MTcsIDB4YWYsIDB4MTYsIDB4YzEsIDB4M2QsIDB4ZjUsIDB4ZjcsIDB4MWUsIDB4ZDgsCi0JMHhjZSwgMHgwMywgMHhhZCwgMHg1ZSwgMHhiYiwgMHgxYSwgMHhjNCwgMHg0YywgMHgxNiwgMHhmOCwgMHhlZiwgMHg2MiwKLQkweDljLCAweGJjLCAweGM4LCAweDc5LCAweGY2LCAweDdhLCAweDU0LCAweDRkLCAweDU4LCAweGEyLCAweGU3LCAweDE5LAotCTB4ZTQsIDB4ZTksIDB4OGEsIDB4NTIsIDB4ZDgsIDB4ZGQsIDB4ZjMsIDB4NTUsIDB4ZWQsIDB4MjcsIDB4Y2MsIDB4ZDcsCi0JMHhjNCwgMHg1MCwgMHg1NywgMHg3NywgMHg0NSwgMHhmMCwgMHhiZSwgMHhhOCwgMHg4OSwgMHg4MSwgMHg1NiwgMHg3MCwKLQkweDllLCAweDllLCAweDcxLCAweGZiLCAweDI5LCAweGEwLCAweGY5LCAweGZhLCAweDEyLCAweDdkLCAweGE1LCAweGRmLAotCTB4OWEsIDB4YTgsIDB4YzMsIDB4NDUsIDB4MTMsIDB4ZDcsIDB4Y2YsIDB4OTQsIDB4ZWYsIDB4ODIsIDB4ZTIsIDB4NjAsCi0JMHgxMywgMHg3MCwgMHgyMiwgMHhlYSwgMHhmZCwgMHg3OSwgMHg4YSwgMHhmMywgMHhlYywgMHhiMiwgMHg3YSwgMHgwZCwKLQkweDdkLCAweDk5LCAweDEyLCAweDRmLCAweDVmLCAweDQyLCAweGVmLCAweGE3LCAweGZkLCAweGE4LCAweGU1LCAweGQyLAotCTB4NzAsIDB4ODUsIDB4YmEsIDB4NzIsIDB4OTEsIDB4ZjMsIDB4ZDgsIDB4MjMsIDB4ZTIsIDB4MGYsIDB4NTksIDB4ZDgsCi0JMHgzNSwgMHg5MywgMHgyZCwgMHhjNCwgMHg5NSwgMHhkZSwgMHg0ZiwgMHhjYiwgMHg4MywgMHhkZSwgMHhkYSwgMHg4ZSwKLQkweGJjLCAweDdjLCAweGVjLCAweDdmLCAweDg4LCAweGY1LCAweGZjLCAweDA3LCAweGY1LCAweDMzLCAweDJiLCAweGQ4LAotCTB4MWUsIDB4MjUsIDB4MTcsIDB4ZjMsIDB4ZmIsIDB4YjgsIDB4NGYsIDB4OTQsIDB4NzQsIDB4YzcsIDB4ZmUsIDB4ZmUsCi0JMHg0ZSwgMHgxNywgMHhlOSwgMHhiNSwgMHg4NiwgMHg3MSwgMHg1NCwgMHhlMSwgMHhjMSwgMHgzOSwgMHhmOCwgMHhkNywKLQkweGI2LCAweDgwLCAweDllLCAweDZkLCAweGQxLCAweDcxLCAweGQwLCAweGYxLCAweGQyLCAweGYxLCAweDQxLCAweDFjLAotCTB4MmIsIDB4ZDAsIDB4NGYsIDB4ZGEsIDB4ZDEsIDB4ZjMsIDB4MDQsIDB4ZGQsIDB4MGYsIDB4MmQsIDB4M2QsIDB4MGIsCi0JMHhmYSwgMHhkYywgMHg2MSwgMHhmZCwgMHg4MSwgMHg2NiwgMHhjNSwgMHhmZiwgMHg5YSwgMHhmOCwgMHgxMywgMHhmNywKLQkweDFiLCAweGZlLCAweGNhLCAweGI0LCAweGIwLCAweDZmLCAweDgyLCAweGJlLCAweDhiLCAweDhjLCAweDViLCAweDk4LAotCTB4MDMsIDB4ZDIsIDB4YWEsIDB4ZjMsIDB4YWMsIDB4ZjcsIDB4OWQsIDB4YTAsIDB4Y2YsIDB4ZGYsIDB4ZDYsIDB4NjUsCi0JMHg3OCwgMHhjZCwgMHhlNywgMHg0YiwgMHg2ZCwgMHg5ZiwgMHhlMiwgMHg2ZiwgMHg2NiwgMHgxYywgMHhjYSwgMHhmNywKLQkweGU5LCAweDVlLCAweGE1LCAweDQ3LCAweDVjLCAweGRlLCAweGRiLCAweGM4LCAweGM3LCAweDRlLCAweGM0LCAweDFiLAotCTB4MjcsIDB4ODksIDB4ODcsIDB4OTIsIDB4ODgsIDB4MWEsIDB4ZDYsIDB4OTUsIDB4OTcsIDB4OTAsIDB4MWQsIDB4YTcsCi0JMHhkZiwgMHhmZiwgMHg4MCwgMHgzZSwgMHhiZiwgMHgzZCwgMHg1MSwgMHg4YSwgMHhmOSwgMHhjYSwgMHg2NywgMHhlMiwKLQkweGU0LCAweDg3LCAweDczLCAweGMwLCAweGYxLCAweDhmLCAweGNlLCAweDgyLCAweGJlLCAweDI1LCAweGJlLCAweDgyLAotCTB4ZjUsIDB4ZTUsIDB4YTcsIDB4ZTgsIDB4ZmUsIDB4YjcsIDB4MmEsIDB4MTksIDB4OTcsIDB4NTUsIDB4MzgsIDB4ZjcsCi0JMHg2OSwgMHhkNCwgMHgwZiwgMHg0YiwgMHg0YiwgMHgyMiwgMHg4NiwgMHhiYSwgMHg0ZCwgMHhkZiwgMHgwMywgMHhjMCwKLQkweDY1LCAweGM4LCAweDEzLCAweGRmLCAweGZiLCAweGUxLCAweDU0LCAweDUxLCAweGJiLCAweGYwLCAweDlkLCAweDY0LAotCTB4MTUsIDB4ZTIsIDB4NTUsIDB4ZmIsIDB4YTMsIDB4Y2EsIDB4MjgsIDB4OGEsIDB4Y2YsIDB4MzYsIDB4M2YsIDB4M2UsCi0JMHg0ZCwgMHhjNiwgMHhlNywgMHg1ZCwgMHhiNywgMHg4ZSwgMHg1YSwgMHgyZSwgMHg5NywgMHhkZSwgMHg4OSwgMHgxMiwKLQkweGI3LCAweDBmLCAweDBiLCAweGFmLCAweGEwLCAweGZiLCAweDFhLCAweGQ0LCAweGZlLCAweDk1LCAweGNiLCAweGYyLAotCTB4ZWIsIDB4MDYsIDB4NWYsIDB4OWMsIDB4NmYsIDB4ZGUsIDB4ZDMsIDB4N2EsIDB4OWQsIDB4MzIsIDB4YmQsIDB4ZGYsCi0JMHg1YiwgMHhkYywgMHg3YiwgMHg2NiwgMHg5OCwgMHhmYiwgMHhmYywgMHgzOSwgMHhmNCwgMHhhMywgMHgxMiwgMHhmMywKLQkweDY5LCAweDFhLCAweGRhLCAweGQ1LCAweGVmLCAweDUyLCAweGRmLCAweDIyLCAweDMxLCAweGNjLCAweGY5LCAweGYzLAotCTB4ZmQsIDB4YTAsIDB4YWUsIDB4YjcsIDB4MzAsIDB4YmUsIDB4YzIsIDB4NzksIDB4ZTMsIDB4MGUsIDB4ZWIsIDB4NzUsCi0JMHg4MCwgMHg2MSwgMHgzOSwgMHhkZiwgMHg0OCwgMHg3OSwgMHgzNywgMHhhMSwgMHhlYiwgMHhiNCwgMHg2MSwgMHg3ZSwKLQkweDVmLCAweGU4LCAweDNlLCAweGQ1LCAweDk3LCAweDgzLCAweDljLCAweDRmLCAweGM5LCAweDhmLCAweGExLCAweGM0LAotCTB4ZWQsIDB4MjksIDB4ZGQsIDB4NGYsIDB4ZDAsIDB4ZmQsIDB4MDUsIDB4ZDYsIDB4MDcsIDB4ZmQsIDB4MzAsIDB4NzEsCi0JMHgzMCwgMHgwMiwgMHgyYSwgMHg5YSwgMHhmYywgMHhmMSwgMHgxMSwgMHhhZSwgMHg5ZCwgMHgxOCwgMHg5OSwgMHgwNSwKLQkweGZkLCAweDg2LCAweDA4LCAweGY3LCAweDA5LCAweDI3LCAweDU4LCAweGJmLCAweDMzLCAweGZjLCAweGJlLCAweDczLAotCTB4YzgsIDB4NGYsIDB4NjUsIDB4ZDIsIDB4N2UsIDB4ZWEsIDB4NWIsIDB4MjUsIDB4OGUsIDB4NGQsIDB4YzMsIDB4YWUsCi0JMHgwMSwgMHhmNywgMHhmZCwgMHgwNiwgMHgzZSwgMHhhNiwgMHhjZSwgMHg5YiwgMHhkYywgMHgyZiwgMHhlMywgMHhiZSwKLQkweDlhLCAweDYzLCAweDhlLCAweGMwLCAweDllLCAweDgxLCAweDFjLCAweGM2LCAweDhiLCAweDc4LCAweDE3LCAweDM5LAotCTB4ZmYsIDB4ZTIsIDB4M2EsIDB4ZWYsIDB4ZjgsIDB4NDksIDB4ZmQsIDB4MWUsIDB4MmMsIDB4YmUsIDB4NGUsIDB4ZDcsCi0JMHg4NSwgMHg4MywgMHhmNCwgMHgyZSwgMHg3OSwgMHg2MSwgMHg5MiwgMHhmYiwgMHhlYSwgMHhhMiwgMHg5ZiwgMHhlYSwKLQkweGQxLCAweGFmLCAweGRiLCAweDM5LCAweDFlLCAweGU3LCAweGZiLCAweDA3LCAweGZlLCAweGJlLCAweDgxLCAweGFlLAotCTB4YmYsIDB4ZTcsIDB4ZDAsIDB4ZmYsIDB4OWMsIDB4Y2MsIDB4YTUsIDB4ODEsIDB4OTcsIDB4NjQsIDB4ODksIDB4MTcsCi0JMHhlNywgMHgyNSwgMHg4OSwgMHg0YSwgMHg4ZSwgMHhkYiwgMHhkYSwgMHgyNywgMHg0MSwgMHhjZiwgMHgzZSwgMHg4OSwKLQkweDc3LCAweGYyLCAweGMwLCAweDJiLCAweGVjLCAweDk3LCAweDFkLCAweDE0LCAweGE3LCAweGVkLCAweGU4LCAweGJmLAotCTB4NzgsIDB4ZWIsIDB4NTAsIDB4ODUsIDB4OWIsIDB4NGYsIDB4NWMsIDB4M2MsIDB4Y2YsIDB4OTEsIDB4NWUsIDB4YjUsCi0JMHg5MywgMHgzOSwgMHhlMiwgMHhhYiwgMHgxMSwgMHg4ZiwgMHhkMCwgMHhiZCwgMHg1NywgMHhlZCwgMHgyYywgMHg0MCwKLQkweGNmLCAweGM0LCAweDA0LCAweGRiLCAweDM3LCAweGY0LCAweDA1LCAweGQwLCAweDU3LCAweDM4LCAweGNlLCAweDNhLAotCTB4N2UsIDB4NTcsIDB4ZGQsIDB4M2UsIDB4MWUsIDB4ZjQsIDB4ZDUsIDB4ZjcsIDB4ZjEsIDB4ZjIsIDB4ZjcsIDB4M2IsCi0JMHhjNiwgMHhkNSwgMHhhZCwgMHg0OCwgMHg2MCwgMHg3ZCwgMHhjNywgMHg4YiwgMHhmNywgMHhhNywgMHhmYywgMHg3OCwKLQkweDUwLCAweDc4LCAweGQxLCAweGI4LCAweGY0LCAweGUyLCAweGE4LCAweGYwLCAweDljLCAweGU1LCAweDcxLCAweGUxLAotCTB4MzQsIDB4NTUsIDB4OTEsIDB4YmYsIDB4NzAsIDB4OWYsIDB4OTgsIDB4ODksIDB4ODksIDB4Y2MsIDB4ZWEsIDB4N2UsCi0JMHg3YSwgMHgxMywgMHg3ZSwgMHg0YSwgMHhiMCwgMHhkZSwgMHg3NiwgMHhmZiwgMHgwOCwgMHhlZSwgMHhhMSwgMHgzMSwKLQkweDhlLCAweGQzLCAweDVjLCAweDIzLCAweGQ3LCAweDExLCAweGFjLCAweGRmLCAweGM3LCAweGZjLCAweGNlLCAweDQwLAotCTB4M2MsIDB4MjMsIDB4ZjYsIDB4ZTEsIDB4NjksIDB4OGUsIDB4MWYsIDB4ZTMsIDB4ZWEsIDB4MDgsIDB4ZGIsIDB4ZmQsCi0JMHgxMSwgMHhlYywgMHhiNiwgMHhiNSwgMHhkZCwgMHhmZCwgMHhhZSwgMHhkZCwgMHhiYSwgMHg0ZSwgMHhmMSwgMHhjYSwKLQkweDI5LCAweDk3LCAweGI4LCAweGEwLCAweDdhLCAweGM3LCAweGJlLCAweDRhLCAweDc5LCAweDI0LCAweGNjLCAweDc2LAotCTB4NGEsIDB4YmUsIDB4NTYsIDB4ZmQsIDB4ZmYsIDB4OGUsIDB4ZjAsIDB4NTcsIDB4ZWYsIDB4NzYsIDB4ZWYsIDB4YmEsCi0JMHg1MiwgMHg1ZSwgMHgxNywgMHg5NSwgMHhlYiwgMHgzMCwgMHg4ZiwgMHhmMywgMHg2NywgMHhhZiwgMHhlMCwgMHg0ZiwKLQkweGU1LCAweDM3LCAweDJkLCAweGI3LCAweGYwLCAweDdjLCAweDc5LCAweGZkLCAweDQ3LCAweDk1LCAweDFkLCAweGZkLAotCTB4OTAsIDB4NTcsIDB4NjQsIDB4OWMsIDB4ZTgsIDB4MWUsIDB4YjIsIDB4ZGQsIDB4YmMsIDB4NzIsIDB4ODcsIDB4ZWEsCi0JMHhjMCwgMHhlOCwgMHg4NSwgMHg0MSwgMHhlNCwgMHg4MSwgMHgwYiwgMHg4MywgMHhlZiwgMHg3MiwgMHgxZCwgMHhjZSwKLQkweDdlLCAweGU5LCAweGEyLCAweGZmLCAweGFmLCAweDkyLCAweGIxLCAweGFiLCAweGY3LCAweGU3LCAweDE1LCAweGJmLAotCTB4MWUsIDB4YjUsIDB4MWUsIDB4M2QsIDB4ZjQsIDB4YmUsIDB4ZmYsIDB4MDEsIDB4ZmUsIDB4ZjAsIDB4MTEsIDB4ZGMsCi0JMHhhMCwgMHgxZCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCS8qIERhdGU6ICAgICAgICAwNS8xMy8yMDA4IDEzOjUwICovCisJMHhhZCwgMHg1OCwgMHg0ZCwgMHg2YywgMHg1NCwgMHg1NSwgMHgxNCwgMHhiZSwgMHg3ZCwgMHhmMywgMHhkYiwgMHg5OSwKKwkweDM3LCAweDNmLCAweGI0LCAweGI1LCAweGJmLCAweDY4LCAweGExLCAweDk1LCAweGQyLCAweDkyLCAweDI5LCAweDk0LAorCTB4NjksIDB4MDEsIDB4OTUsIDB4NDQsIDB4NDksIDB4MzEsIDB4MDUsIDB4OTQsIDB4ODQsIDB4NTIsIDB4NWQsIDB4MTAsCisJMHgzNywgMHhkMCwgMHgyMiwgMHhhNSwgMHg4MywgMHgyZCwgMHg2OSwgMHgyOCwgMHg2MSwgMHhjMSwgMHhjNiwgMHgwOSwKKwkweGM1LCAweGUyLCAweDYyLCAweDEyLCAweDJkLCAweGIxLCAweDE0LCAweDhjLCAweGMxLCAweDQ2LCAweDM3LCAweGM0LAorCTB4YjgsIDB4MTksIDB4ODMsIDB4NTIsIDB4ZDQsIDB4YzQsIDB4ODQsIDB4NjAsIDB4NDMsIDB4NzAsIDB4MDEsIDB4MjYsCisJMHg5YSwgMHhlMCwgMHg0MiwgMHgxMywgMHhhMiwgMHg1MCwgMHgwYiwgMHgzNiwgMHg1OCwgMHg3ZSwgMHg0NiwgMHgxNywKKwkweGNhLCAweDc4LCAweGVmLCAweGY5LCAweGNlLCAweDdkLCAweDdkLCAweDZmLCAweDNhLCAweGI1LCAweDJjLCAweGU4LAorCTB4ZTYsIDB4ZWIsIDB4YmQsIDB4ZWYsIDB4ZGMsIDB4NzMsIDB4Y2YsIDB4Y2YsIDB4NzcsIDB4Y2YsIDB4MzksIDB4NmQsCisJMHg1NCwgMHgwOCwgMHhlMSwgMHgxNiwgMHhjOSwgMHg3NCwgMHhiNSwgMHg0NCwgMHgxMSwgMHgzMiwgMHgwYSwgMHhmYywKKwkweDEyLCAweGIyLCAweDQyLCAweDc4LCAweGNhLCAweGQ1LCAweDVhLCAweDE4LCAweDgyLCAweDdmLCAweDU2LCAweDQ0LAorCTB4MDksIDB4N2UsIDB4NDgsIDB4YWIsIDB4ZWYsIDB4M2UsIDB4ZjEsIDB4YWEsIDB4ODEsIDB4ZWYsIDB4NmUsIDB4YTEsCisJMHgzMCwgMHgyMiwgMHg0NCwgMHg1MiwgMHg2MSwgMHg5NCwgMHg3MSwgMHgzZCwgMHg2MywgMHg4NiwgMHgzMSwgMHg1OCwKKwkweDAwLCAweDZjLCAweDY2LCAweDdjLCAweGMwLCAweGZiLCAweDc3LCAweDc4LCAweDdkLCAweDkzLCAweGYxLCAweDZmLAorCTB4ZGUsIDB4MzcsIDB4MTksIDB4NmYsIDB4ZjMsIDB4ZmUsIDB4ZjMsIDB4MDYsIDB4MzAsIDB4YzEsIDB4ZmIsIDB4M2YsCisJMHg0YiwgMHhkNCwgMHg3NiwgMHhhOSwgMHhmNSwgMHg3NCwgMHg1NiwgMHgyNCwgMHhlNSwgMHgxOSwgMHgyMSwgMHhjNSwKKwkweDFiLCAweGY0LCAweGJlLCAweDQ5LCAweDkwLCAweDZjLCAweDgwLCAweGRkLCAweGFmLCAweDJjLCAweDUxLCAweDcyLAorCTB4YmYsIDB4ZTcsIDB4OTEsIDB4NTMsIDB4ZmIsIDB4MzcsIDB4YjIsIDB4ZDAsIDB4M2IsIDB4ZWIsIDB4YWYsIDB4ZTEsCisJMHg1MSwgMHhlNywgMHg5NiwgMHhiNiwgMHg5YywgMHgxOCwgMHhjNiwgMHhmOSwgMHg5ZCwgMHg0YiwgMHhiMCwgMHhmZiwKKwkweDU0LCAweDRjLCAweGY5LCAweGVmLCAweDE1LCAweDQ5LCAweDQ2LCAweGQxLCAweGE4LCAweGQwLCAweDI4LCAweDQ4LAorCTB4MzYsIDB4ZWEsIDB4NDAsIDB4NDEsIDB4ZmUsIDB4OTcsIDB4NjEsIDB4YWMsIDB4M2EsIDB4NDMsIDB4ZDAsIDB4MWIsCisJMHg3MCwgMHhlOCwgMHgyZCwgMHg5ZCwgMHhhMywgMHhmNywgMHg1YSwgMHhhMSwgMHg1ZCwgMHhmZiwgMHg2NywgMHhhYywKKwkweDNmLCAweGIwLCAweGEwLCAweGZlLCAweGFlLCAweDEwLCAweGIwLCAweDM4LCAweDk2LCAweGVmLCAweDllLCAweGMyLAorCTB4MDUsIDB4ZWMsIDB4ZGYsIDB4YjcsIDB4YTAsIDB4ZmUsIDB4YzMsIDB4OTYsIDB4ZmQsIDB4M2EsIDB4NmUsIDB4ZmEsCisJMHgzYiwgMHhiMCwgMHgxYSwgMHg2MiwgMHg5ZiwgMHgyNCwgMHg1NywgMHhlOSwgMHg3OCwgMHg2YSwgMHhiZiwgMHhkOSwKKwkweDNlLCAweDE3LCAweDcwLCAweDQzLCAweDhjLCAweDIwLCAweGI1LCAweDliLCAweDAzLCAweGRjLCAweDU2LCAweGE3LAorCTB4ZWUsIDB4MmQsIDB4MTIsIDB4NmUsIDB4NDMsIDB4ZTksIDB4NTksIDB4ZWUsIDB4ZjcsIDB4OWUsIDB4YzcsIDB4ZmUsCisJMHg4ZSwgMHgwOCwgMHhmMCwgMHg3NSwgMHg3NiwgMHhlNCwgMHg0NiwgMHg0MCwgMHgwNSwgMHgyNiwgMHg5YiwgMHhlZCwKKwkweDBlLCAweGIyLCAweDdlLCAweGE0LCAweDU1LCAweDI0LCAweDgzLCAweDM4LCAweDNmLCAweDYxLCAweDJhLCAweGZiLAorCTB4MmUsIDB4Y2IsIDB4ZmMsIDB4YTksIDB4YjUsIDB4NGIsIDB4MjQsIDB4MjMsIDB4NGUsIDB4M2YsIDB4M2UsIDB4MTQsCisJMHg5MCwgMHg1YiwgMHhiNCwgMHgxYywgMHhiYiwgMHhlZiwgMHg3NiwgMHg2MywgMHg1ZCwgMHhmNSwgMHg3MSwgMHg5NCwKKwkweGU0LCAweDRmLCAweGE2LCAweGI1LCAweDFmLCAweDZhLCAweDVmLCAweGJlLCAweDgzLCAweDA4LCAweGY0LCAweDg4LAorCTB4MWEsIDB4M2YsIDB4NWQsIDB4ODYsIDB4MzgsIDB4YzksIDB4NGIsIDB4MWIsIDB4YjUsIDB4M2UsIDB4ZmMsIDB4OWMsCisJMHg1OCwgMHhhNiwgMHhmOSwgMHg4NSwgMHg3NSwgMHhiNywgMHg5NywgMHhhMCwgMHhiYywgMHg3MywgMHg0OCwgMHhkOSwKKwkweDFiLCAweDExLCAweGJiLCAweDBjLCAweDY1LCAweDg4LCAweGMxLCAweGZlLCAweGI5LCAweGZjLCAweGU2LCAweDE3LAorCTB4OTAsIDB4ZmYsIDB4YTYsIDB4ZGEsIDB4MjQsIDB4ZGIsIDB4YmEsIDB4OWIsIDB4NzEsIDB4YWUsIDB4MjQsIDB4MGUsCisJMHgxYywgMHg4OSwgMHg3YiwgMHgxNCwgMHhjNCwgMHhiYSwgMHgwNywgMHg2OCwgMHhiOSwgMHhmMiwgMHhkNywgMHhkNSwKKwkweDdlLCAweDkyLCAweDRiLCAweDM2LCAweDZhLCAweGZlLCAweGVhLCAweGI4LCAweDJiLCAweDdmLCAweGRmLCAweGM5LAorCTB4NWEsIDB4ZmMsIDB4YWYsIDB4NDUsIDB4N2MsIDB4NmUsIDB4MmUsIDB4NTMsIDB4ZjIsIDB4MzIsIDB4NDgsIDB4MzUsCisJMHhiOCwgMHhhNywgMHgyMywgMHg5MSwgMHg4ZiwgMHhmZiwgMHg2ZiwgMHhkYiwgMHhmOCwgMHhmZiwgMHg2OCwgMHg3OSwKKwkweGRjLCAweDQwLCAweGZlLCAweDZmLCAweGUwLCAweDM4LCAweDJjLCAweDYxLCAweGJlLCAweDJjLCAweGNlLCAweGMzLAorCTB4OTcsIDB4MDgsIDB4ZmQsIDB4N2UsIDB4YWIsIDB4MzUsIDB4NGEsIDB4NzEsIDB4ZGMsIDB4ODYsIDB4ZmQsIDB4ZTMsCisJMHg2ZCwgMHhlNywgMHgxMCwgMHhlZiwgMHgyZCwgMHgxNCwgMHgwNywgMHgxMSwgMHgzOCwgMHhmYSwgMHgzOSwgMHg0ZSwKKwkweDc1LCAweDg2LCAweGQ0LCAweGZhLCAweGI1LCAweDk2LCAweGVlLCAweDJmLCAweGIxLCAweGVlLCAweDcyLCAweGE5LAorCTB4ZjUsIDB4MGUsIDB4NzMsIDB4ZjcsIDB4MzgsIDB4ZTQsIDB4M2QsIDB4ODMsIDB4NTEsIDB4OGEsIDB4ZGYsIDB4MzYsCisJMHhiZSwgMHg2NSwgMHg4YiwgMHhhYiwgMHg0MCwgMHg0MSwgMHhjYSwgMHgzYiwgMHg0OCwgMHg0YiwgMHg3MywgMHg4MiwKKwkweGJlLCAweDQ3LCAweGM1LCAweGIxLCAweDM0LCAweGJlLCAweGVmLCAweDBmLCAweDUyLCAweDdkLCAweDkwLCAweGZlLAorCTB4OTEsIDB4NWMsIDB4NDksIDB4YzIsIDB4OGIsIDB4ZjMsIDB4YTksIDB4NjEsIDB4M2YsIDB4ZjksIDB4M2IsIDB4NzUsCisJMHg1NiwgMHhhZCwgMHhiNywgMHhjNiwgMHhhNiwgMHgyMCwgMHgxZiwgMHg0YiwgMHgwYywgMHhiMSwgMHg2MiwgMHgwMywKKwkweGYxLCAweGJiLCAweDY1LCAweDQwLCAweDllLCAweGU5LCAweDE1LCAweDcwLCAweDUzLCAweGZlLCAweDBhLCAweDg0LAorCTB4ZDksIDB4MDYsIDB4N2MsIDB4OGIsIDB4YmUsIDB4ZmYsIDB4NTMsIDB4OTAsIDB4YTIsIDB4NzgsIDB4NmQsIDB4MGMsCisJMHhiYiwgMHhjZiwgMHhlOSwgMHhmOCwgMHgzMCwgMHg0NiwgMHhiNCwgMHg1ZiwgMHhjMCwgMHg0NywgMHhlNSwgMHhlZiwKKwkweDkwLCAweGE5LCAweDc5LCAweGNiLCAweDc5LCAweDZiLCAweDk4LCAweDhmLCAweGI3LCAweGMwLCAweGI2LCAweDNhLAorCTB4YTAsIDB4YjcsIDB4NTYsIDB4YzksIDB4NzksIDB4ZjIsIDB4ZjAsIDB4ZDcsIDB4OTksIDB4MTcsIDB4Y2UsIDB4YWIsCisJMHg4ZCwgMHg2NywgMHgwNCwgMHg5MiwgMHg1ZiwgMHgwZSwgMHhiZSwgMHg0OSwgMHgzZSwgMHg1MywgMHg1ZCwgMHg5MiwKKwkweGYxLCAweGQ0LCAweGJjLCAweDUxLCAweDhhLCAweDdjLCAweGUyLCAweDBkLCAweGQ2LCAweDk3LCAweDYwLCAweGJmLAorCTB4N2EsIDB4ZDksIDB4YWYsIDB4ZTksIDB4ODAsIDB4OGUsIDB4YmIsIDB4ZjYsIDB4MDcsIDB4NzgsIDB4Y2MsIDB4MDQsCisJMHhiZiwgMHgzYSwgMHgxMiwgMHhkYSwgMHgyZiwgMHgyNywgMHg3ZiwgMHhkOSwgMHg5ZSwgMHhkNCwgMHhiNywgMHgzNSwKKwkweGY4LCAweGE1LCAweGFhLCAweDE2LCAweDY4LCAweGY5LCAweDU5LCAweDQ3LCAweGVmLCAweDI1LCAweDVjLCAweDM2LAorCTB4YWUsIDB4ZWQsIDB4NTAsIDB4NzksIDB4ZmQsIDB4NGIsIDB4ZTYsIDB4MTUsIDB4ZjksIDB4MzksIDB4OTksIDB4YjYsCisJMHhiZiwgMHhkMywgMHhjYSwgMHgzYywgMHhlZiwgMHhkNCwgMHhmOSwgMHg2ZSwgMHhiNCwgMHhmZiwgMHhmYiwgMHg0MywKKwkweDU0LCAweDg4LCAweDVhLCAweGFlLCAweDRjLCAweDNhLCAweGRmLCAweDA1LCAweGY4LCAweGVmLCAweGIzLCAweDc4LAorCTB4NTQsIDB4YjIsIDB4OTYsIDB4ZTMsIDB4YzQsIDB4NTgsIDB4YmEsIDB4NGUsIDB4ZTksIDB4NmIsIDB4NjcsIDB4ZmQsCisJMHg0ZCwgMHhhYywgMHhkZiwgMHhiNCwgMHhiZCwgMHg0YiwgMHg2NSwgMHhkZiwgMHg5MywgMHhkNiwgMHg3YiwgMHhkNCwKKwkweGY5LCAweDk5LCAweDdkLCAweDk3LCAweDNhLCAweDRlLCAweDc0LCAweDdmLCAweGVjLCAweGNhLCAweGE0LCAweDNhLAorCTB4NWYsIDB4YjUsIDB4YzAsIDB4M2IsIDB4MmQsIDB4YjYsIDB4ZjQsIDB4ZmQsIDB4NjgsIDB4YmQsIDB4NDcsIDB4ZjUsCisJMHgzZCwgMHgyOCwgMHg1ZSwgMHhlMCwgMHhhNSwgMHhiMywgMHhkZSwgMHhmYywgMHgyOSwgMHhlYiwgMHgwZCwgMHhmOSwKKwkweGUxLCAweDM3LCAweGNmLCAweDcxLCAweDdkLCAweDE5LCAweDUwLCAweGY3LCAweDk0LCAweGIzLCAweGRkLCAweGU1LAorCTB4YmEsIDB4Y2UsIDB4NGIsIDB4YmIsIDB4YjksIDB4MGUsIDB4ZWQsIDB4YjQsIDB4ZDcsIDB4MTMsIDB4OGYsIDB4YWQsCisJMHgyZSwgMHhhOCwgMHhiNSwgMHgyYiwgMHg0ZiwgMHg5ZiwgMHg3NCwgMHhjNCwgMHgzMywgMHgyOSwgMHgyMiwgMHg5OCwKKwkweDAzLCAweDkyLCAweDExLCAweDI1LCAweDdmLCAweDRmLCAweGNjLCAweGFkLCAweDJiLCAweGI5LCAweGY2LCAweDIzLAorCTB4MWUsIDB4OWQsIDB4NDYsIDB4ODgsIDB4ZTQsIDB4YWUsIDB4ZjcsIDB4YWIsIDB4NzMsIDB4ZDcsIDB4YWMsIDB4M2UsCisJMHg4ZSwgMHgzYSwgMHg3MywgMHg5MSwgMHhlZCwgMHg1ZCwgMHhjYywgMHhmNiwgMHg0YSwgMHg3ZCwgMHg4ZCwgMHhjNCwKKwkweDUzLCAweGZmLCAweGY1LCAweDdlLCAweGJiLCAweGJkLCAweDc3LCAweDFlLCAweGNlLCAweDdmLCAweDlmLCAweDMzLAorCTB4ZWYsIDB4ZmQsIDB4ZGMsIDB4NmYsIDB4YjgsIDB4NGYsIDB4ZmEsIDB4NzcsIDB4N2YsIDB4YTUsIDB4ZWQsIDB4ZTEsCisJMHg3YiwgMHgyMywgMHhmYSwgMHg3ZSwgMHg5MywgMHhmMiwgMHgzMiwgMHgzOSwgMHhhMCwgMHhjZSwgMHg4NywgMHgwNSwKKwkweGQzLCAweDQ0LCAweGY0LCAweGQ1LCAweGEzLCAweGFlLCAweDRkLCAweGVmLCAweDgxLCAweGZkLCAweDdkLCAweDc1LAorCTB4ZWEsIDB4ZmUsIDB4MTYsIDB4ODEsIDB4N2UsIDB4ZTMsIDB4OTYsIDB4MjEsIDB4NDUsIDB4N2QsIDB4YmYsIDB4MzgsCisJMHg5YywgMHgyZiwgMHg4ZiwgMHg1ZiwgMHhiMywgMHhkYywgMHgzOCwgMHhmYiwgMHgxNSwgMHg2NSwgMHhiZiwgMHgzNiwKKwkweDRiLCAweGJmLCAweDI4LCAweGVlLCAweGZjLCAweDNkLCAweDlmLCAweGRmLCAweDZjLCAweGE3LCAweGQwLCAweGZkLAorCTB4OWIsIDB4Y2YsIDB4OTEsIDB4NWMsIDB4MGYsIDB4Y2IsIDB4YjksIDB4ZTcsIDB4ZWQsIDB4ZGIsIDB4OTksIDB4ZTUsCisJMHg1NCwgMHg4NywgMHg0ZiwgMHgxZiwgMHhhNiwgMHg3YSwgMHgxYSwgMHhiMiwgMHhmOCwgMHhlNiwgMHhiNCwgMHg2ZiwKKwkweGUyLCAweDMxLCAweGM0LCAweDUxLCAweGM5LCAweDJkLCAweDEyLCAweDdiLCAweGMzLCAweGYzLCAweGM1LCAweGNiLAorCTB4YWQsIDB4YjYsIDB4YzcsIDB4NjYsIDB4YzYsIDB4NzUsIDB4YmMsIDB4NGQsIDB4ZjIsIDB4NzMsIDB4NzIsIDB4ODAsCisJMHhlNiwgMHhjMiwgMHg5YywgMHgzOCwgMHgxYSwgMHhiNiwgMHgzOCwgMHg0MiwgMHgxZSwgMHhmMywgMHg0YSwgMHhiZSwKKwkweGY4LCAweGU1LCAweGViLCAweDhiLCAweDlmLCAweDNlLCAweGQ0LCAweDdjLCAweDNhLCAweGUyLCAweGQ1LCAweGY2LAorCTB4MmIsIDB4NWMsIDB4NjUsIDB4ZTUsIDB4ZjMsIDB4MDAsIDB4Y2YsIDB4MjMsIDB4MTksIDB4OTMsIDB4N2UsIDB4ODksCisJMHg0ZiwgMHhhNywgMHg2OCwgMHg2OSwgMHg1NiwgMHg5YywgMHg1MSwgMHg3MiwgMHgyYiwgMHhlMiwgMHgwNywgMHhkOCwKKwkweGNlLCAweGNiLCAweDJlLCAweGY4LCAweGQxLCAweGIzLCAweDA3LCAweGViLCAweDJiLCAweDVjLCAweGRmLCAweGVlLAorCTB4NzIsIDB4OWQsIDB4ZGEsIDB4ZWUsIDB4MDcsIDB4NGUsIDB4ZDcsIDB4OTMsIDB4N2YsIDB4ZjEsIDB4MDMsIDB4ZTcsCisJMHhiNSwgMHg3ZSwgMHhkMiwgMHg2YiwgMHg2NiwgMHgzOCwgMHgzZSwgMHgyZiwgMHhiYSwgMHhkOCwgMHhlZSwgMHgxYSwKKwkweGNhLCAweDQ3LCAweGZjLCAweDBlLCAweGJkLCAweDRmLCAweGI3LCAweDY4LCAweDVkLCAweGFhLCAweGIwLCAweDQyLAorCTB4YzYsIDB4ODEsIDB4ZWQsIDB4NTksIDB4MGYsIDB4ZWMsIDB4ZjAsIDB4NzEsIDB4NWMsIDB4MWIsIDB4NzIsIDB4ZjMsCisJMHg4NSwgMHg2ZCwgMHg2ZiwgMHgwZCwgMHg5ZiwgMHhlZiwgMHhjNCwgMHhkYSwgMHhjNywgMHhmNSwgMHg2NSwgMHg5NCwKKwkweGVkLCAweDdhLCAweGFmLCAweDFlLCAweDE4LCAweDZlLCAweDQwLCAweDdmLCAweDljLCAweDM0LCAweDE1LCAweDQ2LAorCTB4ZTIsIDB4MDMsIDB4ZTMsIDB4ZjAsIDB4YTcsIDB4NzcsIDB4MjMsIDB4ZmMsIDB4YmQsIDB4YzcsIDB4NzEsIDB4NjAsCisJMHgwYywgMHg5ZiwgMHgxYSwgMHhhNCwgMHhiZSwgMHgxOSwgMHgxZSwgMHg0MiwgMHg3ZiwgMHgwZCwgMHg3YiwgMHgwNywKKwkweGUxLCAweDQ3LCAweDZmLCAweDA2LCAweGViLCAweDdiLCAweGNmLCAweDAyLCAweDFmLCAweDNjLCAweDg3LCAweDczLAorCTB4MDcsIDB4MGYsIDB4NzMsIDB4N2MsIDB4MzYsIDB4ZTYsIDB4M2YsIDB4ZDcsIDB4NzMsIDB4MWYsIDB4NzIsIDB4N2QsCisJMHhmNSwgMHhkNCwgMHhlNywgMHhjNywgMHhiOCwgMHhlZiwgMHg4YSwgMHgwNCwgMHhmNywgMHhmOSwgMHgwYywgMHhhZiwKKwkweGY3LCAweDcxLCAweDFmLCAweGI5LCAweGNkLCAweDdkLCAweGIyLCAweDM3LCAweGE3LCAweDRmLCAweDRlLCAweGExLAorCTB4NmUsIDB4OGUsIDB4NjUsIDB4NTIsIDB4NmEsIDB4NDMsIDB4ZDYsIDB4YWYsIDB4NDIsIDB4ZGQsIDB4MWYsIDB4MTUsCisJMHgwNiwgMHhlMiwgMHg2NSwgMHg5YywgMHhhZiwgMHg5MiwgMHgzNSwgMHhjMCwgMHg5MSwgMHgzNSwgMHhlOCwgMHg2YiwKKwkweGJkLCAweDg3LCAweDM4LCAweDJlLCAweDJkLCAweDk0LCAweDlmLCAweDk1LCAweDMzLCAweGUzLCAweDlhLCAweDBmLAorCTB4MzQsIDB4M2YsIDB4M2QsIDB4ZDQsIDB4YmMsIDB4NDMsIDB4ZmQsIDB4Y2EsIDB4NTgsIDB4ZjUsIDB4NzYsIDB4OGEsCisJMHhlYywgMHhhYiwgMHgxYSwgMHhjYiwgMHg5MCwgMHg3YywgMHhhNSwgMHgyOCwgMHgyNiwgMHg3ZSwgMHg1NSwgMHg4NCwKKwkweDY3LCAweDYwLCAweDZmLCAweDdjLCAweDk0LCAweGZkLCAweGVjLCAweDdmLCAweDA2LCAweDc4LCAweDg4LCAweGYzLAorCTB4YWMsIDB4ZjMsIDB4NzcsIDB4NzUsIDB4OWQsIDB4NDksIDB4ZTcsIDB4MjYsIDB4MDcsIDB4NjAsIDB4YjcsIDB4ZTYsCisJMHg3ZCwgMHhlZSwgMHg5YywgMHhhNywgMHhmMywgMHg1ZSwgMHhkMSwgMHg0YywgMHg2YiwgMHhkMSwgMHg3MywgMHg1MCwKKwkweGRkLCAweDEzLCAweDkyLCAweGY5LCAweDUyLCAweDc2LCAweGM5LCAweDU4LCAweDcwLCAweDdmLCAweDc0LCAweGYyLAorCTB4NDEsIDB4ZjEsIDB4NDUsIDB4ZjMsIDB4ZDIsIDB4Y2UsIDB4MjMsIDB4M2IsIDB4NGYsIDB4OWMsIDB4ZmMsIDB4MDgsCisJMHg1MywgMHgzZCwgMHg5NywgMHg4ZiwgMHg5NywgMHhmYSwgMHhhNywgMHgzNywgMHgzZSwgMHgzYSwgMHhmYywgMHhmZiwKKwkweGYxLCAweDNhLCAweDg1LCAweDc4LCAweGM1LCAweGQ5LCAweDZlLCAweDMzLCAweDQxLCAweDczLCAweGQ2LCAweDEzLAorCTB4NjIsIDB4ODgsIDB4ZjMsIDB4MzUsIDB4NTUsIDB4Y2YsIDB4ZWYsIDB4YjUsIDB4MDYsIDB4ZjksIDB4ZWEsIDB4N2YsCisJMHgxYSwgMHhmNiwgMHhmNCwgMHhmMywgMHgzYiwgMHhmOSwgMHg4MywgMHhmYiwgMHgzOSwgMHhmMiwgMHhlYywgMHgzMywKKwkweGJiLCAweGM3LCAweDM5LCAweGFmLCAweGNjLCAweGI3LCAweDdkLCAweDFjLCAweDg3LCAweGRiLCAweDg4LCAweDgzLAorCTB4YTksIDB4ZTMsIDB4OTAsIDB4YjAsIDB4ZTIsIDB4YTAsIDB4ZWIsIDB4ODMsIDB4NWQsIDB4NGYsIDB4OTEsIDB4ZTQsCisJMHgwYiwgMHhkNSwgMHgxOSwgMHhmMywgMHgyYSwgMHhjZCwgMHgyNywgMHgxZSwgMHhmNiwgMHg1YiwgMHhjYSwgMHgzNSwKKwkweDJiLCAweGZmLCAweGMyLCAweGVjLCAweDVmLCAweDQ4LCAweGVjLCAweDVkLCAweDY5LCAweDNmLCAweDE3LCAweGU0LAorCTB4NzMsIDB4MDEsIDB4NzksIDB4MGUsIDB4ZmIsIDB4NzgsIDB4OGYsIDB4ZTYsIDB4M2MsIDB4ZjEsIDB4NTUsIDB4NzEsCisJMHhkNCwgMHg3YSwgMHg3MywgMHhkZiwgMHg5ZCwgMHgzZCwgMHg5ZSwgMHg1NCwgMHg1MSwgMHhlOSwgMHgwNywgMHg3NSwKKwkweDQ2LCAweGU2LCAweDhkLCAweGVhLCAweDkxLCAweDY5LCAweGQ1LCAweDk5LCAweGJiLCAweDU0LCAweDdmLCAweDAzLAorCTB4YTcsIDB4ZmIsIDB4NTAsIDB4MTcsIDB4NGUsIDB4ZjcsIDB4OWQsIDB4ZTEsIDB4ZmUsIDB4YzcsIDB4NzEsIDB4NjksCisJMHhhNywgMHhiOSwgMHg1OCwgMHhjNiwgMHhhZSwgMHhjNiwgMHg1OSwgMHg2NywgMHg5YywgMHg3NiwgMHg1NCwgMHhkOSwKKwkweGVjLCAweGQwLCAweGY3LCAweGNlLCAweGQ3LCAweDk3LCAweDMxLCAweGFmLCAweDZkLCAweGEyLCAweGJlLCAweGVjLAorCTB4YjcsIDB4ZTYsIDB4NDksIDB4NjcsIDB4YmQsIDB4ZjcsIDB4M2YsIDB4NzIsIDB4YmQsIDB4ZGYsIDB4ZGUsIDB4NmMsCisJMHhkNywgMHg1ZiwgMHgyYiwgMHgyNiwgMHhkMiwgMHhkMCwgMHhkZiwgMHhjZSwgMHhmZCwgMHg3MiwgMHgxNywgMHhiZiwKKwkweGRiLCAweGViLCAweDgxLCAweDA4LCAweGRkLCAweGQ3LCAweGY1LCAweDMyLCAweGY5LCAweDI3LCAweDRhLCAweDgzLAorCTB4ZjAsIDB4YTcsIDB4NmIsIDB4MmIsIDB4YmUsIDB4NzcsIDB4ODUsIDB4YjAsIDB4NWYsIDB4MTksIDB4YzIsIDB4ZGYsCisJMHg1YiwgMHhlZCwgMHgzZSwgMHg5MywgMHhlNCwgMHgyYiwgMHg0MywgMHhjMCwgMHg1MiwgMHg3ZSwgMHhlZiwgMHgxMywKKwkweGQ2LCAweDVjLCAweDBjLCAweDNjLCAweGU5LCAweGI1LCAweGNmLCAweDhmLCAweDZlLCAweDcxLCAweGMxLCAweDhiLAorCTB4ZjcsIDB4MmYsIDB4MWEsIDB4MzAsIDB4MDcsIDB4YjYsIDB4ZDYsIDB4OTksIDB4ZjQsIDB4YmQsIDB4YTMsIDB4MDEsCisJMHhmZCwgMHgxMiwgMHhmNSwgMHg3NSwgMHhmNiwgMHhlZiwgMHgzMywgMHg5ZSwgMHgyYiwgMHgyYiwgMHg2NywgMHhlNywKKwkweDY3LCAweGZiLCAweDdjLCAweDVkLCAweDE4LCAweDFmLCAweGI1LCAweGU2LCAweDVjLCAweDdkLCAweDlmLCAweGZkLAorCTB4ZmQsIDB4MjgsIDB4YmQsIDB4YjQsIDB4OTQsIDB4NzMsIDB4YWEsIDB4N2QsIDB4YmUsIDB4NzYsIDB4ZTksIDB4NzksCisJMHg4NywgMHhlNywgMHhkMSwgMHg2MiwgMHg3MSwgMHgyOSwgMHgwZCwgMHhiZiwgMHgyNiwgMHhkMiwgMHhmOSwgMHhkZSwKKwkweGExLCAweGJhLCAweDRmLCAweGViLCAweDgzLCAweGRkLCAweGRhLCAweDhmLCAweDU5LCAweGZkLCAweGI4LCAweDdmLAorCTB4MGYsIDB4ZGIsIDB4ZjksIDB4MWIsIDB4ZmQsIDB4NWQsIDB4NWMsIDB4Y2EsIDB4ZmUsIDB4MjgsIDB4YmQsIDB4ZDgsCisJMHhkZiwgMHhjYywgMHhmMywgMHg3ZSwgMHhkMiwgMHg1YSwgMHgzYiwgMHhlNywgMHhmNCwgMHg3NiwgMHhiMiwgMHhhYiwKKwkweDg4LCAweGZiLCAweDY5LCAweGE5LCAweGFkLCAweGRmLCAweDQzLCAweGJlLCAweGE0LCAweDA5LCAweDM4LCAweGQyLAorCTB4YTQsIDB4ZjMsIDB4YTAsIDB4ZjMsIDB4YTUsIDB4ZjMsIDB4ODMsIDB4M2MsIDB4OTYsIDB4YWUsIDB4MjYsIDB4YjEsCisJMHg5NiwgMHhhZSwgMHhkNSwgMHhmNCwgMHg2MCwgMHg5YiwgMHhiYSwgMHg2NiwgMHg5YywgMHhmZiwgMHgzZiwgMHhkOCwKKwkweDFlLCAweDUzLCAweGYyLCAweDZmLCAweDhhLCAweGVmLCAweDYzLCAweDY4LCAweDgwLCAweDNmLCAweDMxLCAweGNlLAorCTB4Y2UsIDB4YzUsIDB4OWMsIDB4MDAsIDB4NmIsIDB4MWUsIDB4YzEsIDB4N2QsIDB4MTcsIDB4M2MsIDB4YmMsIDB4ZGQsCisJMHhhYywgMHhlNywgMHg0NiwgMHg2NywgMHhmZiwgMHhmZSwgMHg5MCwgMHhlYSwgMHhmMiwgMHhkOSwgMHg3ZiwgMHg3MywKKwkweGU3LCAweGNlLCAweGQ5LCAweGY5LCAweDUxLCAweGZiLCAweGE5LCAweGU0LCAweDFiLCAweDk5LCAweDhmLCAweDdlLAorCTB4ZDEsIDB4YmEsIDB4MDksIDB4N2YsIDB4NmYsIDB4ODcsIDB4N2QsIDB4ZTAsIDB4N2QsIDB4ZDgsIDB4NjcsIDB4Y2YsCisJMHg5NywgMHhlNCwgMHg0NSwgMHgyMSwgMHgzZCwgMHhmMCwgMHhjNSwgMHg0NSwgMHg4NSwgMHhlNCwgMHhjZiwgMHhmMSwKKwkweGNiLCAweGRmLCAweGQxLCAweGU3LCAweDhmLCAweDQ2LCAweDgzLCAweGQ4LCAweDJmLCAweDZiLCAweDg1LCAweDdhLAorCTB4MzcsIDB4ZjEsIDB4ZDYsIDB4MjUsIDB4OGUsIDB4ODIsIDB4ZDcsIDB4MWYsIDB4OGMsIDB4MDAsIDB4ZGYsIDB4MTcsCisJMHgyZiwgMHg0MSwgMHg0ZiwgMHhkMSwgMHgxMSwgMHhlYSwgMHg3MywgMHhmZSwgMHgzMiwgMHg4NCwgMHgzNSwgMHgzNSwKKwkweGNhLCAweDdjLCAweDJkLCAweDM3LCAweGU4LCAweGZmLCAweDY1LCAweDU5LCAweDExLCAweGUyLCAweGZmLCAweGFiLAorCTB4ZjAsIDB4YmIsIDB4MDMsIDB4NGYsIDB4ZGQsIDB4YjYsIDB4N2MsIDB4MmYsIDB4YzQsIDB4NWIsIDB4YWEsIDB4MWYsCisJMHg5MiwgMHg5NywgMHgzOCwgMHhjZSwgMHhmYywgMHhmNSwgMHhlNywgMHhmMiwgMHg1NywgMHhjNywgMHhhNSwgMHhkYywKKwkweGM4LCAweGNiLCAweGQ3LCAweGI1LCAweDRlLCAweGJlLCAweDdhLCAweDk5LCAweGFmLCAweGY3LCAweGFkLCAweGZlLAorCTB4MzYsIDB4NTcsIDB4MmYsIDB4ZmUsIDB4YWUsIDB4YjgsIDB4ZjQsIDB4ZDgsIDB4ZjgsIDB4MGIsIDB4ZGMsIDB4NWMsCisJMHhhYiwgMHhlZSwgMHgyZiwgMHg5YiwgMHgzMywgMHg3NywgMHg1NiwgMHgwYiwgMHg3YiwgMHgzZCwgMHgzYSwgMHgyNCwKKwkweGYzLCAweGZkLCAweDFmLCAweGZlLCAweGFjLCAweDVlLCAweDkyLCAweDgwLCAweDE0LCAweDAwLCAweDAwLCAweDAwIH07CiAKIHN0YXRpYyB1OCBibngyX1RQQVRfYjA2RndUZXh0W10gPSB7Ci0JMHhiZCwgMHg1OSwgMHg2ZiwgMHg3MCwgMHg1YywgMHhkNSwgMHg3ZCwgMHgzZCwgMHg2ZiwgMHhmNywgMHhlZCwgMHhlZSwKLQkweDkzLCAweGI0LCAweDkyLCAweDllLCAweDkwLCAweDBjLCAweGFiLCAweDU2LCAweDhkLCAweGY2LCAweDU5LCAweDZmLAotCTB4YTUsIDB4YzUsIDB4YWIsIDB4ZDgsIDB4NmYsIDB4MmQsIDB4YjksIDB4YWMsIDB4ODcsIDB4MzcsIDB4Y2QsIDB4YjMsCi0JMHgyYywgMHgyOSwgMHg4YiwgMHhlYywgMHhkOCwgMHhlYiwgMHg0MiwgMHg2NiwgMHhlNCwgMHgwOSwgMHgxZCwgMHgwYiwKLQkweDU5LCAweGQ4LCAweGMyLCAweDE4LCAweGEyLCAweDEyLCAweDNlLCAweGE4LCAweDEzLCAweDRmLCAweGJkLCAweGU4LAotCTB4OWYsIDB4ODUsIDB4YmQsIDB4ZDIsIDB4MjMsIDB4MDIsIDB4MmMsIDB4M2IsIDB4OTMsIDB4MGUsIDB4MWUsIDB4ZjksCi0JMHg4ZiwgMHgxOCwgMHg1OCwgMHg2YiwgMHhhMSwgMHhmZCwgMHg5MiwgMHg2OSwgMHhjMywgMHg0NCwgMHgxMywgMHgxYiwKLQkweGVjLCAweDkwLCAweDM4LCAweDRlLCAweGE3LCAweDVmLCAweGNjLCAweGI0LCAweDlkLCAweGFhLCAweDgwLCAweDI5LAotCTB4NTAsIDB4NzAsIDB4ZGMsIDB4Y2UsIDB4YTQsIDB4NjMsIDB4MGEsIDB4ZjUsIDB4ZWQsIDB4YjksIDB4NmYsIDB4NTcsCi0JMHg0NiwgMHgzOCwgMHg0ZSwgMHgzZiwgMHhkNiwgMHgzMywgMHg4YiwgMHg3NiwgMHhlZiwgMHg3YiwgMHhmNywgMHhkZSwKLQkweGRmLCAweGJkLCAweGJmLCAweDczLCAweGNlLCAweGVmLCAweGRjLCAweGNiLCAweDZhLCAweDFmLCAweGNhLCAweDUxLAotCTB4ZmEsIDB4NTcsIDB4YzksIDB4NGYsIDB4ZmIsIDB4MjMsIDB4NDMsIDB4NGYsIDB4NmYsIDB4NTgsIDB4NmIsIDB4YWQsCi0JMHg5NSwgMHhiZiwgMHg5NSwgMHgwMCwgMHg1NCwgMHhmYywgMHgzZiwgMHhmZSwgMHhmMywgMHgwMywgMHhmYSwgMHg3MiwKLQkweDFjLCAweGYyLCAweDAzLCAweGNkLCAweDY3LCAweDJmLCAweGFlLCAweGVlLCAweDMwLCAweGExLCAweGY5LCAweGVkLAotCTB4ODcsIDB4NWEsIDB4NzYsIDB4OWIsIDB4ODAsIDB4OTMsIDB4NGYsIDB4NDQsIDB4MzcsIDB4ZTMsIDB4N2YsIDB4NDQsCi0JMHhiNiwgMHg0ZSwgMHg4NSwgMHg2YywgMHhmZiwgMHgyMywgMHhmYiwgMHg4YiwgMHg3NSwgMHg2ZiwgMHhkYywgMHg2NywKLQkweDVjLCAweDNmLCAweGUxLCAweDg3LCAweGE2LCAweGRiLCAweDkzLCAweDlhLCAweGRlLCAweDBjLCAweGFkLCAweDgxLAotCTB4N2QsIDB4N2UsIDB4ZDQsIDB4YjIsIDB4MmIsIDB4ODgsIDB4YWEsIDB4ZTUsIDB4YjEsIDB4ODAsIDB4OTMsIDB4MzksCi0JMHhjMywgMHhkYSwgMHg4MywgMHg4NCwgMHg3ZSwgMHg4ZSwgMHgwYiwgMHg3MiwgMHgzOCwgMHhjNywgMHg5OSwgMHgzYywKLQkweDcwLCAweDI4LCAweGE3LCAweGUwLCAweDJhLCAweGM3LCAweDFjLCAweGNmLCAweDZiLCAweDU4LCAweGYyLCAweDdiLAotCTB4ZDMsIDB4ZjUsIDB4OTUsIDB4ZDksIDB4YzgsIDB4OTgsIDB4NTMsIDB4MDcsIDB4NDUsIDB4YzgsIDB4NDQsIDB4ZjYsCi0JMHgwZiwgMHg2YywgMHgzMywgMHg3ZSwgMHgwOCwgMHhlMSwgMHhkNCwgMHg1YywgMHgzYiwgMHgzMiwgMHhhYiwgMHhjZiwKLQkweDZhLCAweGQ4LCAweGU5LCAweDM2LCAweGY0LCAweDY5LCAweDM2LCAweGY4LCAweDhlLCAweDgyLCAweGQ0LCAweDdkLAotCTB4MWEsIDB4N2EsIDB4MGIsIDB4NzEsIDB4NjQsIDB4MGIsIDB4NTksIDB4MzgsIDB4ODUsIDB4MzEsIDB4N2UsIDB4MzQsCi0JMHg4NCwgMHhhNiwgMHgzNCwgMHg2ZCwgMHhkZCwgMHhkNCwgMHhkZCwgMHhmMiwgMHgxZCwgMHg4NCwgMHhhNywgMHhhZSwKLQkweDhiLCAweDZiLCAweDQ5LCAweDFkLCAweDZmLCAweDZmLCAweDE0LCAweGEyLCAweGQyLCAweDQ2LCAweGI2LCAweGEyLAotCTB4M2QsIDB4MGIsIDB4YmYsIDB4NmQsIDB4NTgsIDB4NWIsIDB4ZmMsIDB4MGEsIDB4M2EsIDB4YmYsIDB4NmUsIDB4YzYsCi0JMHhhNywgMHg5NCwgMHgwNywgMHgxZiwgMHhmNCwgMHhkOSwgMHhkMCwgMHgxNCwgMHgzYiwgMHhhYSwgMHgzNSwgMHhlNSwKLQkweDFiLCAweDMwLCAweDUxLCAweGQwLCAweDcxLCAweGE4LCAweDUwLCAweDg3LCAweGIxLCAweDAyLCAweDBlLCAweGY4LAotCTB4MzcsIDB4MDQsIDB4MzEsIDB4YTcsIDB4YzMsIDB4ZjksIDB4NGUsIDB4Y2IsIDB4MDEsIDB4ZWMsIDB4Y2IsIDB4MGQsCi0JMHg2MywgMHg3NywgMHgyZSwgMHg4NSwgMHhjMywgMHgwNSwgMHgxOSwgMHg2MywgMHgxNCwgMHhhMywgMHgwNSwgMHgxNSwKLQkweGMxLCAweDI5LCAweDIzLCAweGYyLCAweDczLCAweGRjLCAweGU5LCAweDk5LCAweDEwLCAweDYzLCAweDU2LCAweDA4LAotCTB4MjMsIDB4NTYsIDB4MWMsIDB4ZTMsIDB4YWUsIDB4OGYsIDB4ZWIsIDB4MGMsIDB4NjEsIDB4ZDQsIDB4YmMsIDB4MjEsCi0JMHgwNiwgMHgyYywgMHhjMywgMHgxYSwgMHg4NywgMHg2OCwgMHgzYywgMHg2ZiwgMHgxOSwgMHg5MSwgMHg0ZSwgMHgzZiwKLQkweDljLCAweGVmLCAweDliLCAweDExLCAweDhjLCAweDMzLCAweGY2LCAweDMxLCAweGFmLCAweGRmLCAweDE4LCAweDNhLAotCTB4NmYsIDB4ZjUsIDB4NzMsIDB4ZDgsIDB4NGYsIDB4YzcsIDB4YzQsIDB4NTcsIDB4ZmIsIDB4NDYsIDB4YzcsIDB4OTEsCi0JMHg4OCwgMHg0YywgMHhjMCwgMHg4NywgMHhiZSwgMHhiYSwgMHg1NiwgMHhmNiwgMHg2YiwgMHg4YSwgMHg0ZSwgMHhjMCwKLQkweDg4LCAweDczLCAweDljLCAweDZjLCAweGIwLCAweGRkLCAweGUxLCAweDE4LCAweDU5LCAweGY2LCAweDM3LCAweGEyLAotCTB4NjcsIDB4MjAsIDB4YzcsIDB4NmEsIDB4ZTAsIDB4ZWYsIDB4NzYsIDB4ZjYsIDB4NTcsIDB4ZTAsIDB4YjMsIDB4NjMsCi0JMHhkMSwgMHgxMSwgMHhmNiwgMHgzOSwgMHg2NywgMHhhOSwgMHg3OCwgMHg5MywgMHg5ZiwgMHgzZSwgMHhkZCwgMHg5MCwKLQkweDk5LCAweDU1LCAweDQyLCAweDZjLCAweDNmLCAweDA0LCAweDNlLCAweDM3LCAweDJiLCAweDcwLCAweDIyLCAweDYzLAotCTB4NjEsIDB4ODQsIDB4ZWIsIDB4ZDYsIDB4ZDgsIDB4MzYsIDB4YzksIDB4YjYsIDB4ODAsIDB4NjksIDB4NzEsIDB4N2MsCi0JMHhlOCwgMHg5ZCwgMHg4NSwgMHg5NSwgMHg5OCwgMHg1OCwgMHhjZSwgMHhjZCwgMHhlZiwgMHg2YiwgMHhlNywgMHgxOCwKLQkweDZlLCAweDMxLCAweGE3LCAweGYyLCAweDlkLCAweGNkLCAweGVlLCAweDRkLCAweGYxLCAweDg4LCAweGJhLCAweGYyLAotCTB4ZjksIDB4YjAsIDB4ZDIsIDB4YzEsIDB4MzYsIDB4NDcsIDB4NmQsIDB4YzAsIDB4MjEsIDB4MTcsIDB4NWEsIDB4ZDAsCi0JMHhkNCwgMHgzOCwgMHg4ZiwgMHg4NiwgMHhmNywgMHg3MiwgMHhjMywgMHg0YSwgMHg3NywgMHhjMSwgMHg1MSwgMHhiYSwKLQkweGU2LCAweDNiLCAweDE0LCAweDY3LCAweDVlLCAweDU1LCAweDNhLCAweDY3LCAweDY1LCAweGRjLCAweDQyLCAweDNjLAotCTB4NmIsIDB4MjksIDB4OGMsIDB4ZjksIDB4MDcsIDB4MzIsIDB4NWUsIDB4MjcsIDB4YWEsIDB4ZGMsIDB4MTQsIDB4NmIsCi0JMHg2MiwgMHgzZSwgMHg1NCwgMHg5OCwgMHhkZCwgMHhjYSwgMHg5NiwgMHg3OSwgMHgyMSwgMHhkMiwgMHhjOSwgMHhiNCwKLQkweGQyLCAweDMzLCAweDBmLCAweDJkLCAweDZjLCAweGRiLCAweDVhLCAweDZlLCAweGVhLCAweDMwLCAweGIyLCAweGFiLAotCTB4NGMsIDB4MWMsIDB4NzcsIDB4YTMsIDB4YjgsIDB4NjQsIDB4ZjksIDB4NzAsIDB4NjIsIDB4NTUsIDB4MTksIDB4NTQsCi0JMHg1MywgMHhlMSwgMHgwNywgMHhlMSwgMHhjYiwgMHgxNiwgMHhkNCwgMHgyYSwgMHg3ZSwgMHhiZiwgMHhiNiwgMHg0MywKLQkweGM1LCAweDU4LCAweDdiLCAweDhmLCAweGQyLCAweGM5LCAweDNlLCAweDAxLCAweGU2LCAweGY5LCAweDc0LCAweDJlLAotCTB4OGQsIDB4MzAsIDB4YjEsIDB4NTMsIDB4NjEsIDB4YzcsIDB4MjIsIDB4NzksIDB4ZWUsIDB4Y2QsIDB4ZGIsIDB4NTYsCi0JMHgyYywgMHhmZSwgMHhiOCwgMHhjNCwgMHg2MywgMHg4ZCwgMHgxMSwgMHg5MSwgMHg3YiwgMHg1MywgMHg2OSwgMHhjNywKLQkweGUyLCAweDY3LCAweGI5LCAweDBmLCAweDdlLCAweDUzLCAweGM1LCAweGFmLCAweGFjLCAweDAwLCAweDE2LCAweDc3LAotCTB4NTgsIDB4Y2MsIDB4YTksIDB4OGUsIDB4MjAsIDB4ZGIsIDB4Y2YsIDB4NzgsIDB4ZWQsIDB4ZjIsIDB4MzcsIDB4ZjQsCi0JMHhhZSwgMHhhZiwgMHhlYywgMHg0MywgMHg3MSwgMHgwZiwgMHg0NiwgMHhkZCwgMHgyNiwgMHhjNiwgMHg1YywgMHhkYywKLQkweDgzLCAweGVkLCAweDVjLCAweGVmLCAweGJmLCAweDA2LCAweGU0LCAweGQ3LCAweGFmLCAweGRkLCAweDZhLCAweGRiLAotCTB4YzksIDB4MzgsIDB4N2QsIDB4YjYsIDB4YjksIDB4YjgsIDB4ZGEsIDB4NWYsIDB4MGYsIDB4ZDQsIDB4YjYsIDB4ZTMsCi0JMHgzMCwgMHg3MywgMHhkYywgMHg5OSwgMHhiYywgMHgxYiwgMHg1OSwgMHhlZiwgMHg3OSwgMHg5ZCwgMHhiZSwgMHg2NSwKLQkweGI2LCAweDE2LCAweDdkLCAweGFiLCAweGJjLCAweDdkLCAweGQzLCAweGI3LCAweGNkLCAweDBhLCAweGYxLCAweDY2LAotCTB4MzIsIDB4ODgsIDB4YjMsIDB4ZTYsIDB4NDgsIDB4YTQsIDB4MTIsIDB4NTksIDB4Y2IsIDB4Y2YsIDB4N2MsIDB4NWYsCi0JMHhlMCwgMHhmYywgMHhmOSwgMHhhNCwgMHgxZiwgMHgyNywgMHg5MywgMHgyNywgMHg5MCwgMHhhZCwgMHgwMSwgMHhlNiwKLQkweDcyLCAweDkyLCAweDU3LCAweGM2LCAweGUyLCAweDA1LCAweGZlLCAweGQ3LCAweDU3LCAweDkwLCAweGViLCAweGIzLAotCTB4YjgsIDB4M2UsIDB4MDUsIDB4NjcsIDB4NGMsIDB4ODksIDB4NjksIDB4NGIsIDB4NmIsIDB4MjYsIDB4YmYsIDB4ZjYsCi0JMHg3MSwgMHgzZiwgMHhlYiwgMHhkYiwgMHhjMywgMHhjNCwgMHgyNywgMHhmMCwgMHg2ZSwgMHg2ZSwgMHgwMCwgMHgzYiwKLQkweDhiLCAweGIxLCAweGUwLCAweDQ2LCAweDhlLCAweGMyLCAweGQyLCAweDk2LCAweGM2LCAweDg5LCAweGUyLCAweDZmLAotCTB4NzIsIDB4M2MsIDB4YWQsIDB4NzUsIDB4ZTQsIDB4OGMsIDB4NGMsIDB4MWEsIDB4ODksIDB4OGIsIDB4MWQsIDB4OGEsCi0JMHhlYywgMHg5ZiwgMHhkNiwgMHhkNiwgMHhlNCwgMHg4MywgMHg4OCwgMHhkNiwgMHgxNiwgMHg5ZiwgMHg1NywgMHhkOCwKLQkweDViLCAweGI1LCAweGM3LCAweGE3LCAweDE0LCAweGVjLCAweDhkLCAweGM5LCAweDY3LCAweDViLCAweGI1LCAweDk2LAotCTB4M2MsIDB4YjQsIDB4NGEsIDB4N2IsIDB4NDgsIDB4M2IsIDB4M2IsIDB4NjUsIDB4ZjQsIDB4YmQsIDB4YWMsIDB4MjQsCi0JMHhhMiwgMHg1MywgMHg1ZSwgMHg5ZiwgMHgyMSwgMHhhZCwgMHgzNSwgMHgxZiwgMHhlMiwgMHg3YSwgMHhlMiwgMHhjYywKLQkweDA5LCAweGI0LCAweDJhLCAweGZiLCAweDY5LCAweGVkLCAweDU3LCAweDdjLCAweDcwLCAweGQxLCAweGViLCAweGYzLAotCTB4YjQsIDB4MTYsIDB4Y2YsIDB4Y2IsIDB4NzYsIDB4YzMsIDB4OGEsIDB4MmEsIDB4MjEsIDB4ZGMsIDB4OWIsIDB4ZDQsCi0JMHhiMCwgMHhhNiwgMHg0NSwgMHgzNCwgMHg3NiwgMHgyNSwgMHg4ZCwgMHhjNSwgMHgyZSwgMHg3ZiwgMHgwNCwgMHhjNywKLQkweGM5LCAweDA1LCAweGUyLCAweGNlLCAweGY5LCAweGMzLCAweDk2LCAweDMxLCAweDc0LCAweDE1LCAweGZjLCAweDg4LAotCTB4ZDYsIDB4MzgsIDB4MzgsIDB4ZTIsIDB4ODYsIDB4ZjAsIDB4MzMsIDB4ZTIsIDB4YmYsIDB4ZGIsIDB4ZDIsIDB4MzEsCi0JMHhlNiwgMHgxYSwgMHhmMSwgMHg1ZiwgMHgyMCwgMHg5MSwgMHgzYSwgMHhjNSwgMHg5YywgMHgyZCwgMHg5MSwgMHgwMywKLQkweDQ3LCAweDBhLCAweDRkLCAweGYxLCAweDUzLCAweDMwLCAweDA2LCAweGJiLCAweGM4LCAweDAxLCAweGFkLCAweDVkLAotCTB4YzYsIDB4MDAsIDB4NWQsIDB4YjUsIDB4YzksIDB4OWQsIDB4NDIsIDB4MDMsIDB4NzIsIDB4ZTQsIDB4NDMsIDB4OTcsCi0JMHhjNywgMHhhYiwgMHg2MSwgMHhhNSwgMHhiMywgMHhmMCwgMHg0YiwgMHg2YSwgMHg2YiwgMHgzNywgMHhmMSwgMHg4NSwKLQkweGVhLCAweDg4LCAweDE5LCAweDQ0LCAweGFhLCAweDM2LCAweDhhLCAweGYzLCAweGM0LCAweDRhLCAweGI2LCAweGFlLAotCTB4OGMsIDB4YjksIDB4OTQsIDB4ZjksIDB4N2MsIDB4ODcsIDB4Y2YsIDB4N2IsIDB4OTQsIDB4Y2QsIDB4ZjMsIDB4NTEsCi0JMHhmYywgMHhjYywgMHhmYSwgMHg0MiwgMHgzOCwgMHg3NSwgMHg5NSwgMHg2YywgMHgwYiwgMHhhYywgMHg2OCwgMHhkNywKLQkweDcwLCAweGY1LCAweDg1LCAweDcyLCAweDdjLCAweGZjLCAweDQyLCAweDE4LCAweDlmLCAweGJkLCAweDQwLCAweDdlLAotCTB4YmIsIDB4NjgsIDB4MmYsIDB4ODcsIDB4MTAsIDB4YTksIDB4MzYsIDB4MjEsIDB4MGEsIDB4NTYsIDB4MmIsIDB4ZGUsCi0JMHhhYiwgMHg4OSwgMHg0NSwgMHhhZiwgMHg0MCwgMHg2YSwgMHhhMywgMHhhMywgMHhlZCwgMHhjZSwgMHgxOSwgMHg0MywKLQkweDgzLCAweDQ4LCAweDM4LCAweGU3LCAweGJjLCAweGJkLCAweDcwLCAweGI0LCAweGI1LCAweGY5LCAweGYzLCAweDAyLAotCTB4M2IsIDB4OGEsIDB4N2IsIDB4MTEsIDB4YjQsIDB4M2IsIDB4YjUsIDB4YjcsIDB4OTgsIDB4OWIsIDB4Y2IsIDB4NWUsCi0JMHg2ZSwgMHgzYSwgMHhiNSwgMHg3NSwgMHhmOSwgMHhmYiwgMHhmZCwgMHgyOCwgMHgyZiwgMHgzZSwgMHg1MywgMHhlZCwKLQkweDhjLCAweDM2LCAweDk2LCAweDMzLCAweDdhLCAweDI3LCAweGI5LCAweGJlLCAweDAxLCAweGFmLCAweDZmLCAweDQ2LAotCTB4NGIsIDB4NzAsIDB4ZWYsIDB4OTcsIDB4NGEsIDB4YjksIDB4YTksIDB4YjQsIDB4MWYsIDB4ZTIsIDB4M2UsIDB4MzMsCi0JMHhmNywgMHhkZSwgMHgzZSwgMHgzZSwgMHhjNCwgMHgzZCwgMHg5NiwgMHhmMywgMHgwZCwgMHhkZiwgMHgzNiwgMHhkZiwKLQkweDMwLCAweGU3LCAweDdiLCAweDc5LCAweGM1LCAweDdjLCAweDA3LCAweDU2LCAweGNjLCAweDc3LCAweDYwLCAweGM1LAotCTB4N2MsIDB4MjksIDB4NzIsIDB4ZjUsIDB4MWYsIDB4YzQsIDB4NDgsIDB4NWQsIDB4NzEsIDB4NmMsIDB4ZDUsIDB4MWUsCi0JMHhiYywgMHg2ZCwgMHhlZSwgMHg0MSwgMHhjZSwgMHg3ZCwgMHg1NCwgMHgyYywgMHg2NSwgMHg4YSwgMHhlMywgMHg1NCwKLQkweGRhLCAweGZiLCAweDU3LCAweGNjLCAweGJkLCAweDlmLCAweDczLCAweDJmLCAweDhmLCAweGEzLCAweDUzLCAweDhiLAotCTB4ODQsIDB4ZDgsIDB4NjYsIDB4MDksIDB4YTEsIDB4ZGEsIDB4YTYsIDB4ZGUsIDB4ODksIDB4ZTYsIDB4NGMsIDB4MjcsCi0JMHhiMSwgMHg1MywgMHg4ZSwgMHhjNCwgMHhhMiwgMHgwZiwgMHhlNiwgMHg3MCwgMHhiZCwgMHgzZiwgMHg4MCwgMHhhNSwKLQkweDlhLCAweDY1LCAweDZlLCAweDU0LCAweDk2LCAweGZlLCAweGJlLCAweGE0LCAweDgwLCAweDVhLCAweGZmLCAweDZhLAotCTB4YWUsIDB4OWEsIDB4NjMsIDB4YzQsIDB4ZjQsIDB4MDEsIDB4NDUsIDB4ODgsIDB4NzMsIDB4MWIsIDB4MTMsIDB4ODMsCi0JMHg3ZSwgMHgyNCwgMHhmYSwgMHhhYSwgMHg2MCwgMHgxMiwgMHg0MywgMHg4MSwgMHgxMiwgMHgxNywgMHg1NiwgMHhmNiwKLQkweDc5LCAweGQ5LCAweGViLCAweDUzLCAweGYwLCAweGZhLCAweDA4LCAweGYxLCAweGVlLCAweDg2LCAweDBmLCAweGM1LAotCTB4MWIsIDB4MmQsIDB4NzUsIDB4ZjgsIDB4MjksIDB4MzksIDB4ZjksIDB4NWEsIDB4NjEsIDB4NTksIDB4NTcsIDB4YTQsCi0JMHg2ZSwgMHhjMCwgMHg3NywgMHhjZSwgMHgwYSwgMHgzMiwgMHhhNiwgMHg5MSwgMHg3ZCwgMHhjMSwgMHhhZiwgMHhmNCwKLQkweDI3LCAweDYwLCAweDRjLCAweGQ5LCAweGU2LCAweGM3LCAweDJiLCAweDQ5LCAweDNjLCAweDUyLCAweDBlLCAweGEzLAotCTB4ZjcsIDB4YjAsIDB4OTIsIDB4NGQsIDB4NTcsIDB4YzAsIDB4NzAsIDB4ZDYsIDB4MjgsIDB4ZDksIDB4OTQsIDB4MDYsCi0JMHhjOSwgMHgxYiwgMHhiNSwgMHhlOSwgMHhiNCwgMHg2OSwgMHg2NCwgMHhhZiwgMHhmMiwgMHg2NSwgMHg3NSwgMHhmYSwKLQkweDRlLCAweDMxLCAweGE4LCAweDFjLCAweDIzLCAweDhjLCAweDI3LCAweGRkLCAweDBiLCAweDU4LCAweDBjLCAweDM0LAotCTB4NTAsIDB4OWYsIDB4YTUsIDB4NzYsIDB4NzIsIDB4ZTAsIDB4MDUsIDB4OGQsIDB4MzUsIDB4MmQsIDB4NDQsIDB4MjIsCi0JMHhhYSwgMHgzOCwgMHhlOCwgMHhmYSwgMHhjZSwgMHgzNywgMHg0MiwgMHgyMCwgMHhkOCwgMHgxNiwgMHhjMCwgMHgzYiwKLQkweGU2LCAweGE4LCAweDU1LCAweDhmLCAweDRkLCAweGI4LCAweGRjLCAweGNhLCAweDNkLCAweDU4LCAweGE1LCAweDIyLAotCTB4MzIsIDB4YjcsIDB4NzIsIDB4YWMsIDB4MDgsIDB4YzcsIDB4ZmEsIDB4YjMsIDB4MTAsIDB4YWEsIDB4ZWEsIDB4YTAsCi0JMHgzNiwgMHhhYiwgMHhkOCwgMHhlYiwgMHg2YSwgMHg0YSwgMHg5NywgMHgyYiwgMHhiMSwgMHg2YiwgMHg0NiwgMHg0ZSwKLQkweGUxLCAweDE0LCAweGI1LCAweDgyLCAweDM1LCAweGVjLCAweDhjLCAweGFhLCAweDZjLCAweDk5LCAweDBkLCAweGExLAotCTB4N2MsIDB4ZTYsIDB4MTMsIDB4ZjEsIDB4MTgsIDB4YjUsIDB4MmYsIDB4YmQsIDB4NDEsIDB4MDgsIDB4MzMsIDB4MTksCi0JMHg4MiwgMHhjNiwgMHg3OSwgMHg4NiwgMHhjOSwgMHhlNywgMHhlYSwgMHhiNiwgMHg1YSwgMHg1YywgMHhmYiwgMHgzYSwKLQkweGI1LCAweGU5LCAweGRiLCAweDIxLCAweGY4LCAweDY3LCAweDQyLCAweDA4LCAweGNlLCAweDI4LCAweDc4LCAweGE3LAotCTB4M2QsIDB4ODQsIDB4ZmEsIDB4MzksIDB4ZjksIDB4NWIsIDB4NDEsIDB4YTMsIDB4NzksIDB4MTQsIDB4MDcsIDB4NzUsCi0JMHgzZiwgMHg2MywgMHhmYywgMHgyYiwgMHhmNCwgMHhlYiwgMHgwZCwgMHg5OCwgMHhhNCwgMHgzNiwgMHgzZiwgMHhlYSwKLQkweDZhLCAweGE4LCAweDNhLCAweDRhLCAweDJkLCAweGIwLCAweDg1LCAweDM4LCAweDQ5LCAweGZjLCAweDFmLCAweDY0LAotCTB4OGMsIDB4MzIsIDB4ZGUsIDB4MGIsIDB4NTYsIDB4MzYsIDB4MWEsIDB4NDIsIDB4MDAsIDB4YzEsIDB4MzksIDB4MjMsCi0JMHgzZCwgMHhjOSwgMHhlOCwgMHg1MiwgMHg1MywgMHhhYSwgMHhiMiwgMHg3ZCwgMHg5NiwgMHhiNSwgMHhkNywgMHgzNiwKLQkweDdiLCAweGViLCAweGZkLCAweDQyLCAweDdjLCAweDlhLCAweDZjLCAweGVhLCAweDViLCAweGEwLCAweDA2LCAweDhmLAotCTB4YzQsIDB4NjIsIDB4OTksIDB4N2UsIDB4MDUsIDB4NTgsIDB4NzMsIDB4OTYsIDB4NzYsIDB4NjQsIDB4ZTYsIDB4YmYsCi0JMHg0NCwgMHg5OCwgMHhlMywgMHgxYywgMHhkOSwgMHgyMCwgMHgzMCwgMHg2ZSwgMHg2NSwgMHgyMywgMHgwMSwgMHgxOCwKLQkweDM3LCAweDg2LCAweDUwLCAweDg3LCAweDBmLCAweDllLCAweDE3LCAweDQyLCAweGI0LCAweDU3LCAweGUzLCAweDFkLAotCTB4Y2IsIDB4MTgsIDB4MzQsIDB4ZmQsIDB4MDIsIDB4M2YsIDB4NGUsIDB4NjYsIDB4ODcsIDB4MjIsIDB4MzAsIDB4ODYsCi0JMHg3ZiwgMHhhZCwgMHg0NCwgMHhmMSwgMHhmMSwgMHg5NCwgMHg5MSwgMHhiZSwgMHhhOCwgMHgwNCwgMHg1MSwgMHgzOSwKLQkweDY3LCAweGVhLCAweDViLCAweDk0LCAweDMwLCAweGNhLCAweDE3LCAweGMyLCAweDU4LCAweDdkLCAweDM2LCAweDg4LAotCTB4YzAsIDB4NGMsIDB4MTgsIDB4YzEsIDB4NjksIDB4ZjMsIDB4ZTIsIDB4MmUsIDB4NzgsIDB4ZTMsIDB4MmMsIDB4MGUsCi0JMHhhMSwgMHgxOSwgMHhkNSwgMHhiMywgMHg2NiwgMHhmNCwgMHg1ZiwgMHgyMCwgMHhiMSwgMHgxZCwgMHg4NiwgMHhiYSwKLQkweDEwLCAweDQ1LCAweDdkLCAweGMxLCAweDQ0LCAweDM1LCAweGYzLCAweDdkLCAweGY5LCAweGFjLCAweGNjLCAweGIzLAotCTB4OGUsIDB4YjAsIDB4ZTksIDB4ZTMsIDB4ZGEsIDB4MWMsIDB4NjUsIDB4YWIsIDB4NTcsIDB4MzcsIDB4M2EsIDB4ZjksCi0JMHhlOSwgMHg1NiwgMHgzYSwgMHhlNiwgMHhlNSwgMHg5ZSwgMHgyOSwgMHgyOCwgMHhlMywgMHhiMywgMHg4YiwgMHhkNiwKLQkweDRkLCAweGIxLCAweDJmLCAweDI2LCAweGViLCAweDQ0LCAweDE5LCAweDAyLCAweDc2LCAweDhmLCAweGYyLCAweGMwLAotCTB4M2MsIDB4OGIsIDB4OTAsIDB4YTcsIDB4ZWYsIDB4NjUsIDB4NGEsIDB4YzAsIDB4MmUsIDB4NmEsIDB4ZmIsIDB4MjUsCi0JMHg2YSwgMHhmYiwgMHg4OSwgMHg5MiwgMHhiNiwgMHg1NywgMHg1MSwgMHhkYiwgMHgxNywgMHhmZSwgMHg0ZiwgMHg2ZCwKLQkweDY3LCAweGJkLCAweDlmLCAweGYxLCAweGUxLCAweGJjLCAweDE5LCAweGMyLCAweDcxLCAweGFiLCAweDY5LCAweGIxLAotCTB4MWUsIDB4MjEsIDB4NTQsIDB4YjcsIDB4ZTksIDB4YTgsIDB4NWUsIDB4YjAsIDB4ZjAsIDB4MWMsIDB4ZjcsIDB4MTYsCi0JMHg3NywgMHgxNSwgMHhmNSwgMHhmZCwgMHg5YiwgMHg1MiwgMHhmMywgMHg0YiwgMHg1ZSwgMHhlZCwgMHg3MSwgMHg3NywKLQkweDU5LCAweDEzLCAweGMyLCAweGQ0LCAweDJhLCAweDU1LCAweGU5LCAweGExLCAweDllLCAweDNmLCAweDkwLCAweGJjLAotCTB4MjksIDB4ZTIsIDB4MzEsIDB4MjMsIDB4NGUsIDB4Y2UsIDB4ZGUsIDB4MzgsIDB4ODksIDB4YTIsIDB4NDYsIDB4YzQsCi0JMHhhOCwgMHg5NywgMHg0YiwgMHhiNSwgMHg3MSwgMHgxYywgMHg3MywgMHg2NSwgMHg0ZCwgMHhlYiwgMHg2NCwgMHg0ZCwKLQkweDUzLCAweDMwLCAweDEyLCAweDJiLCAweDZhLCAweGM0LCAweGVhLCAweGJjLCAweDZjLCAweGQ3LCAweDUxLCAweDRmLAotCTB4OWQsIDB4NWMsIDB4ZDcsIDB4MTYsIDB4YzEsIDB4MzEsIDB4NmEsIDB4YTQsIDB4NGIsIDB4OWYsIDB4YjMsIDB4OWQsCi0JMHhlMywgMHg2ZCwgMHg5YiwgMHgzNSwgMHhiMiwgMHhkYiwgMHg5OSwgMHg5ZiwgMHhmMywgMHhjNCwgMHhjNSwgMHgxNCwKLQkweGFiLCAweGMzLCAweDg5LCAweDFhLCAweDZhLCAweDY3LCAweDczLCAweDA4LCAweDEzLCAweGQ0LCAweGNiLCAweGYzLAotCTB4ZjQsIDB4MTAsIDB4MmYsIDB4YjEsIDB4ZGYsIDB4YjgsIDB4NmIsIDB4NDQsIDB4NWYsIDB4MjIsIDB4YWYsIDB4YzcsCi0JMHg0YiwgMHg5YSwgMHhmOSwgMHgxMiwgMHg3ZCwgMHhjMywgMHgzOCwgMHhmMywgMHhmNCwgMHg1MywgMHgzZSwgMHg3YiwKLQkweGNkLCAweDM1LCAweDFjLCAweGU5LCAweDFmLCAweGZjLCAweDllLCAweDdmLCAweDMwLCAweGUyLCAweDdlLCAweDQ1LAotCTB4N2EsIDB4ODgsIDB4MDgsIDB4ZGUsIDB4NjgsIDB4OTEsIDB4NTgsIDB4MjQsIDB4YzYsIDB4NmYsIDB4ZTksIDB4YTcsCi0JMHhhYSwgMHg3YywgMHg2YiwgMHhmNiwgMHhiYSwgMHhjOCwgMHhjNywgMHhjYSwgMHg1NSwgMHhjOSwgMHhiZiwgMHhiMSwKLQkweGE0LCAweGM0LCAweDkzLCAweDEwLCAweDY1LCAweDc2LCAweDk4LCAweDVlLCAweGNiLCAweDhjLCAweDdmLCAweDg0LAotCTB4MTgsIDB4NzEsIDB4MWIsIDB4ZTEsIDB4YjMsIDB4MzAsIDB4ZmMsIDB4NjcsIDB4YjcsIDB4YTgsIDB4OWUsIDB4OGYsCi0JMHg1ZCwgMHg5MCwgMHg3ZSwgMHg4YiwgMHg3OSwgMHg5YSwgMHgzMiwgMHg3YiwgMHhhNywgMHg5NCwgMHg1OCwgMHg2NiwKLQkweDQwLCAweDkxLCAweGNmLCAweDc1LCAweDk0LCAweDlmLCAweDVkLCAweDIyLCAweDc3LCAweDIzLCAweGU0LCAweDZlLAotCTB4MWQsIDB4NWUsIDB4YmYsIDB4OGQsIDB4YmYsIDB4ZDQsIDB4NTUsIDB4ZGYsIDB4MDAsIDB4ZjksIDB4OWIsIDB4YWQsCi0JMHgxYiwgMHhlOSwgMHhmNywgMHg3ZiwgMHg4NSwgMHg3YiwgMHg4NywgMHgyNCwgMHg3ZiwgMHhkOSwgMHhlNiwgMHhjNywKLQkweGIzLCAweDQ5LCAweGVjLCAweDJjLCAweDgzLCAweDkxLCAweDc5LCAweDRjLCAweGM5LCAweDNhLCAweGU0LCAweDcxLAotCTB4YWEsIDB4NGMsIDB4YzksIDB4ZDIsIDB4MzEsIDB4N2QsIDB4YzksIDB4ZGYsIDB4MzcsIDB4ZjksIDB4YjYsIDB4OWYsCi0JMHhmYywgMHhlZCwgMHhhYiwgMHhiYiwgMHg5ZCwgMHhiZiwgMHg0NywgMHgzOCwgMHg4NiwgMHg4YSwgMHgyNywgMHhkYywKLQkweGUzLCAweDk4LCAweDBiLCAweDA0LCAweDExLCAweDk5LCAweDA5LCAweDIwLCAweDM0LCAweGEzLCAweGEyLCAweDkyLAotCTB4NWMsIDB4MDksIDB4ZGIsIDB4ZDksIDB4NzgsIDB4MDgsIDB4NDYsIDB4ZmEsIDB4MzUsIDB4NDQsIDB4OTAsIDB4OTgsCi0JMHhkMiwgMHhmMCwgMHhlNywgMHgyZCwgMHgwMSwgMHg5YywgMHg4OSwgMHgxOSwgMHg5OSwgMHhmZCwgMHg0YSwgMHg4NCwKLQkweDU4LCAweDFmLCAweDYxLCAweDQ0LCAweDQ2LCAweDM0LCAweGVhLCAweDJiLCAweGYyLCAweDM1LCAweGQwLCAweDFjLAotCTB4ODQsIDB4MzYsIDB4MjMsIDB4YjksIDB4MmUsIDB4MGUsIDB4ZmEsIDB4ZWMsIDB4NmMsIDB4NTQsIDB4MjMsIDB4NDYsCi0JMHg3ZiwgMHg0MCwgMHg2YywgMHg1YywgMHg5OSwgMHgxMiwgMHg2MiwgMHg3MywgMHhiYiwgMHg3OSwgMHhmMSwgMHgzZCwKLQkweGJmLCAweDQxLCAweGRkLCAweDUzLCAweDg5LCAweGQzLCAweGUyLCAweGY4LCAweDE1LCAweDMzLCAweDFhLCAweDgyLAotCTB4NDcsIDB4YmQsIDB4ZjEsIDB4NmYsIDB4YmMsIDB4Y2UsIDB4MjgsIDB4M2UsIDB4NzUsIDB4NTUsIDB4NjUsIDB4MmIsCi0JMHg3MSwgMHg0MCwgMHg2ZSwgMHg0NSwgMHhlNiwgMHhhOSwgMHg3ZCwgMHg4NywgMHg5MywgMHg0NiwgMHg3YSwgMHg4YiwKLQkweGQyLCAweGU0LCAweDM0LCAweGYzLCAweGJiLCAweDJmLCAweDE5LCAweDhiLCAweGY2LCAweGYzLCAweDlkLCAweGY3LAotCTB4MGIsIDB4NDUsIDB4MGUsIDB4ZDcsIDB4OWIsIDB4YmIsIDB4ZjEsIDB4MTcsIDB4ZTQsIDB4NzAsIDB4OTUsIDB4ZjksCi0JMHgxNCwgMHg5ZSwgMHhmNCwgMHhmNCwgMHg4OCwgMHgzOCwgMHg5OCwgMHgyZSwgMHgyNywgMHhiNywgMHgxZCwgMHg2NSwKLQkweDE3LCAweDcxLCAweGJmLCAweDczLCAweDllLCAweGJhLCAweDMyLCAweGQzLCAweGVlLCAweDY5LCAweDUxLCAweGM4LAotCTB4ZWMsIDB4NTQsIDB4N2EsIDB4ZTcsIDB4YmIsIDB4M2QsIDB4MGYsIDB4YjUsIDB4N2QsIDB4ZDYsIDB4ODcsIDB4ZDcsCi0JMHhhZCwgMHg0ZCwgMHhmNCwgMHgyYiwgMHg2OSwgMHg2NSwgMHhmYiwgMHhiYywgMHhjNCwgMHg3YywgMHg4ZiwgMHhmMiwKLQkweDRkLCAweGUyLCAweDNmLCAweDdhLCAweDk3LCAweDhhLCAweDM5LCAweDZiLCAweDkzLCAweDEyLCAweGY0LCAweGYwLAotCTB4MWYsIDB4ODAsIDB4OTMsIDB4MjksIDB4NjIsIDB4ZGYsIDB4NmYsIDB4YzcsIDB4YWMsIDB4NzMsIDB4MmIsIDB4YjAsCi0JMHhkZiwgMHg3ZCwgMHgwNywgMHg1ZiwgMHgyMywgMHhmNSwgMHgwMywgMHg0NSwgMHgyZCwgMHhkNywgMHgzYiwgMHg5OSwKLQkweGFmLCAweDY3LCAweDRhLCAweDE4LCAweDdmLCAweDkyLCAweGVkLCAweDgxLCAweDE5LCAweDY4LCAweGU1LCAweGM0LAotCTB4NzEsIDB4Y2YsIDB4NTQsIDB4MTgsIDB4ZDMsIDB4MWUsIDB4NTYsIDB4MDQsIDB4NWUsIDB4NjUsIDB4NGQsIDB4YzgsCi0JMHgyNywgMHgwZCwgMHg2YiwgMHhiZiwgMHg2MiwgMHhhNCwgMHhiYiwgMHg5NSwgMHg0NCwgMHg3NiwgMHg0ZCwgMHhhOSwKLQkweDFlLCAweGRlLCAweGNiLCAweDlhLCAweDg2LCAweGJiLCAweGE4LCAweDBiLCAweDE2LCAweGI0LCAweDEwLCAweGYxLAotCTB4ZmQsIDB4NmYsIDB4YWMsIDB4NGYsIDB4ZmYsIDB4NTEsIDB4YWEsIDB4ODcsIDB4YzksIDB4N2MsIDB4MzksIDB4YWEsCi0JMHg1YiwgMHhhOCwgMHhlZiwgMHhjNCwgMHg3MywgMHg5NywgMHhjNCwgMHgzMywgMHgzZCwgMHhjNCwgMHgxOCwgMHhlYiwKLQkweGZmLCAweDRlLCAweGUyLCAweDc5LCAweDc1LCAweDliLCAweDkxLCAweGVkLCAweGE0LCAweDc3LCAweGY2LCAweGFkLAotCTB4OGYsIDB4MTAsIDB4YWIsIDB4NzEsIDB4ZmEsIDB4ZDUsIDB4MzEsIDB4NzQsIDB4NzAsIDB4YWUsIDB4ZjQsIDB4YWMsCi0JMHgxMSwgMHhlOSwgMHgyMCwgMHgwNywgMHg1NCwgMHhmNiwgMHg3OSwgMHg4OSwgMHg3ZCwgMHg5NiwgMHg2YSwgMHhhNSwKLQkweGFmLCAweDBlLCAweGUxLCAweDU5LCAweGY2LCAweDMxLCAweDkzLCAweDhlLCAweGE3LCAweDE1LCAweDkyLCAweDAzLAotCTB4MTMsIDB4NDgsIDB4NjQsIDB4MjQsIDB4MDcsIDB4OWMsIDB4NTUsIDB4YWQsIDB4ZjQsIDB4ZjgsIDB4OTIsIDB4MDMsCi0JMHhjNCwgMHhhMCwgMHg0YiwgMHgwYywgMHgxNiwgMHg3OSwgMHgzMCwgMHgyOCwgMHg3OSwgMHg1MCwgMHg0NSwgMHgwZiwKLQkweGIxLCAweDQwLCAweDBmLCAweDUxLCAweDYxLCAweDQ3LCAweGM5LCAweDAxLCAweGM5LCAweDg5LCAweGEyLCAweDhmLAotCTB4ZTgsIDB4MmMsIDB4ZjEsIDB4NjAsIDB4OGIsIDB4MzcsIDB4OWYsIDB4NGEsIDB4ZWQsIDB4MGIsIDB4YTMsIDB4NjksCi0JMHhkYSwgMHhkMCwgMHg1NSwgMHhlNSwgMHgzZiwgMHhjNSwgMHgyZSwgMHhkMywgMHg1YywgMHhkYywgMHg0YiwgMHgyZiwKLQkweGYwLCAweDU5LCAweDViLCAweDhjLCAweDc5LCAweDBmLCAweDYzLCAweGRkLCAweDQyLCAweDc5LCAweDQwLCAweGUyLAotCTB4YmMsIDB4N2UsIDB4M2EsIDB4OGMsIDB4ZWEsIDB4NjksIDB4YzksIDB4ODMsIDB4ZWMsIDB4MjQsIDB4ZjUsIDB4NmYsCi0JMHhjOCwgMHhmMiwgMHhmZCwgMHgxMywgMHhmMSwgMHgxZiwgMHgyNSwgMHgyZSwgMHg1NCwgMHhhNSwgMHg4YiwgMHg2MywKLQkweDU0LCAweGNkLCAweGU4LCAweDY4LCAweDlkLCAweDM2LCAweDA2LCAweDE3LCAweDcwLCAweDRkLCAweGJjLCAweDFhLAotCTB4MzMsIDB4MzMsIDB4ODcsIDB4OTgsIDB4ZmYsIDB4M2QsIDB4YzksIDB4MTgsIDB4ZjcsIDB4NGEsIDB4YzcsIDB4YmQsCi0JMHhiNywgMHhjNiwgMHhmMCwgMHgzOCwgMHhlMSwgMHhmNCwgMHg1YiwgMHhlMSwgMHg5MiwgMHhhZiwgMHhkNiwgMHhkMCwKLQkweGVmLCAweDAyLCAweDdiLCAweDVjLCAweDFhLCAweDViLCAweGQzLCAweGI3LCAweDM2LCAweDg4LCAweGViLCAweDM4LAotCTB4NDksIDB4ZjQsIDB4MGYsIDB4ZTgsIDB4MGUsIDB4ZjMsIDB4MWYsIDB4YzIsIDB4ZGUsIDB4ZDIsIDB4M2IsIDB4NDUsCi0JMHhiZiwgMHhmZCwgMHhlMywgMHhkMiwgMHg3OSwgMHhmMiwgMHgxNywgMHhmZSwgMHhlMiwgMHhkZiwgMHhiZiwgMHg1NSwKLQkweDk3LCAweGNmLCAweDk3LCAweGZkLCAweGM0LCAweGUwLCAweDY2LCAweDYyLCAweGIwLCAweDliLCAweDM5LCAweGRhLAotCTB4NmIsIDB4OTEsIDB4ZGYsIDB4Y2MsIDB4NjcsIDB4NTYsIDB4MGQsIDB4NTEsIDB4MGYsIDB4OWIsIDB4ZmEsIDB4MmEsCi0JMHhhOSwgMHg2YiwgMHg4NywgMHhhOSwgMHg1MSwgMHgzZiwgMHgzNywgMHhjYiwgMHhlOSwgMHhiNywgMHgxZCwgMHhmYSwKLQkweGVkLCAweDBlLCAweDZhLCAweDY4LCAweDI3LCAweGY1LCAweDUzLCAweDYyLCAweDJiLCAweDRkLCAweDFjLCAweDY5LAotCTB4NGEsIDB4OWEsIDB4MWUsIDB4MzYsIDB4OTAsIDB4YTQsIDB4ZDcsIDB4YWUsIDB4NWIsIDB4ZjYsIDB4ZGEsIDB4MzIsCi0JMHg0ZSwgMHhlOSwgMHhhZiwgMHg4ZCwgMHhiOCwgMHgyYywgMHhiNSwgMHg0ZiwgMHgzMiwgMHgwZiwgMHg4YiwgMHgzNSwKLQkweDliLCAweGEwLCAweGRhLCAweDliLCAweDE0LCAweGQ1LCAweDk2LCAweGU3LCAweDA5LCAweDE1LCAweGRmLCAweGE1LAotCTB4ZDYsIDB4MmUsIDB4ZWQsIDB4OTAsIDB4ZTcsIDB4MGEsIDB4YWUsIDB4OGIsIDB4NmQsIDB4MTEsIDB4MzMsIDB4MTYsCi0JMHgzZCwgMHg0ZSwgMHg1YywgMHgxZCwgMHhmYiwgMHg5ZCwgMHg3MywgMHg0NiwgMHgxMSwgMHg2ZiwgMHhhMywgMHhhZSwKLQkweDdhLCAweGNiLCAweDMzLCAweDRiLCAweDdkLCAweGQ4LCAweDc0LCAweDBiLCAweDZmLCAweDFhLCAweDllLCAweDY4LAotCTB4ODksIDB4MTIsIDB4OGYsIDB4MTIsIDB4NmIsIDB4MWEsIDB4ZjIsIDB4MmYsIDB4OTYsIDB4ZTMsIDB4ZDUsIDB4MTcsCi0JMHhjMywgMHg3OCwgMHhlNSwgMHg0NSwgMHgyMSwgMHhjNiwgMHg5MywgMHhlMCwgMHg2OSwgMHg0NiwgMHg2YSwgMHhlYywKLQkweDQ2LCAweGJjLCAweGFjLCAweGM3LCAweGEyLCAweGNmLCAweDdhLCAweDllLCAweGQ1LCAweGExLCAweDY3LCAweDM1LAotCTB4MDYsIDB4MmYsIDB4ZTAsIDB4MjYsIDB4ZjUsIDB4NGIsIDB4NzIsIDB4M2EsIDB4NDEsIDB4YmUsIDB4MTUsIDB4YjEsCi0JMHhlOCwgMHg3OSwgMHhkYiwgMHgxYSwgMHgwZCwgMHg1NywgMHg4OCwgMHhiZiwgMHg2YSwgMHhlMiwgMHhlZiwgMHgzNywKLQkweGQ0LCAweGRkLCAweDZiLCAweDI1LCAweGRkLCAweDVkLCAweDliLCAweDI3LCAweDFmLCAweGRiLCAweDQyLCAweGU4LAotCTB4OTYsIDB4NmIsIDB4MjEsIDB4MGUsIDB4NDcsIDB4NmYsIDB4ZTEsIDB4NTAsIDB4ODgsIDB4MGYsIDB4YjgsIDB4ZTcsCi0JMHgxNywgMHgyYywgMHgyMywgMHhiZSwgMHg5OSwgMHg3OCwgMHg5YywgMHhiMywgMHgwYywgMHhhNywgMHg4MywgMHhkZSwKLQkweDc1LCAweGQ0LCAweGMzLCAweDI0LCAweGY1LCAweDM3LCAweDI2LCAweDcxLCAweDQ5LCAweDFjLCAweDMyLCAweDI3LAotCTB4ODcsIDB4ZDksIDB4ZTcsIDB4M2MsIDB4ZmIsIDB4NGMsIDB4OTQsIDB4YmMsIDB4ZWIsIDB4ZGIsIDB4NDgsIDB4YTQsCi0JMHhhNSwgMHg3NywgMHg4ZCwgMHgxMiwgMHg4MywgMHg4NywgMHgzZCwgMHhlZiwgMHgyYSwgMHhiZCwgMHhhYSwgMHhmNCwKLQkweGE5LCAweDMyLCAweGNlLCAweDc2LCAweDJmLCAweGNlLCAweGFlLCAweDViLCAweDM4LCAweGE0LCAweDg2LCAweGQ1LAotCTB4NDgsIDB4ZmMsIDB4N2QsIDB4MDMsIDB4MTMsIDB4Y2YsIDB4NTcsIDB4YTEsIDB4ZGEsIDB4YmMsIDB4MDcsIDB4OTcsCi0JMHgzMywgMHhkZiwgMHg1MCwgMHgyMywgMHgyNiwgMHhmNCwgMHg3YSwgMHhiYiwgMHg4OCwgMHhjNywgMHg5ZCwgMHg4NSwKLQkweDE0LCAweDVjLCAweGY3LCAweDJkLCAweGUxLCAweGQ2LCAweDE5LCAweGNlLCAweDA1LCAweGNmLCAweDdmLCAweDBlLAotCTB4YjIsIDB4ZDYsIDB4ZGMsIDB4MTQsIDB4YmUsIDB4OTgsIDB4NzEsIDB4YjEsIDB4OWYsIDB4MWUsIDB4YWMsIDB4YzksCi0JMHg1ZiwgMHhmNCwgMHg3MiwgMHgxYiwgMHhmMywgMHhiZiwgMHgxNCwgMHhhOCwgMHgyZCwgMHhhZSwgMHg1MywgMHhhNSwKLQkweDdmLCAweDFiLCAweDIzLCAweGU3LCAweGM2LCAweGNkLCAweGEyLCAweDk3LCAweDhiLCAweGU1LCAweGFmLCAweDA2LAotCTB4YTQsIDB4YTYsIDB4ZmIsIDB4ZGEsIDB4ZTQsIDB4YjgsIDB4NjksIDB4NmEsIDB4YzgsIDB4ZjIsIDB4ZDgsIDB4NWYsCi0JMHhlYSwgMHhmMiwgMHgxOCwgMHgzMSwgMHgzOCwgMHgyYSwgMHg3ZCwgMHgxNSwgMHg3ZCwgMHgwOSwgMHhjZiwgMHhlNSwKLQkweDJiLCAweDM0LCAweDc1LCAweGQ4LCAweDBmLCAweDUzLCAweGI2LCAweDM5LCAweGNhLCAweDAzLCAweDVjLCAweDgzLAotCTB4NjYsIDB4MGUsIDB4MmIsIDB4NjksIDB4OWUsIDB4M2IsIDB4MGYsIDB4MTEsIDB4NWYsIDB4ZGQsIDB4YWMsIDB4YzMsCi0JMHg1NywgMHhhZCwgMHg2NiwgMHg3MiwgMHg5OCwgMHhmNSwgMHg4OSwgMHhiNSwgMHhmOCwgMHhiMCwgMHhiOSwgMHg3YywKLQkweDdlLCAweDkzLCAweDM1LCAweDk5LCAweDM1LCAweGNjLCAweGFkLCAweDY0LCAweGZkLCAweGVlLCAweDYxLCAweGNkLAotCTB4ZTYsIDB4MjgsIDB4Y2MsIDB4ZTksIDB4NjcsIDB4MzEsIDB4ZDEsIDB4YjgsIDB4YjYsIDB4Y2QsIDB4MTgsIDB4ZGMsCi0JMHhlNiwgMHgwZiwgMHgyMSwgMHg0NywgMHhiYywgMHgxZiwgMHg2MywgMHgxZCwgMHg3MiwgMHhiOSwgMHhhNywgMHhkMywKLQkweDA1LCAweDIzLCAweDk1LCAweGM1LCAweDE4LCAweGI2LCAweDcxLCAweDRmLCAweDc5LCAweGRlLCAweDcxLCAweGZlLAotCTB4MmUsIDB4NTYsIDB4M2MsIDB4MGYsIDB4ZWYsIDB4NjUsIDB4N2QsIDB4OWIsIDB4MmMsIDB4NzEsIDB4ZmIsIDB4NDMsCi0JMHgyNCwgMHgyYywgMHhjOSwgMHhlZCwgMHg0NSwgMHhkNiwgMHhiNywgMHg0OSwgMHg4ZiwgMHhkYiwgMHg0NiwgMHg0YSwKLQkweGYyLCAweGI5LCAweGFjLCAweDU0LCAweGQ3LCAweDNlLCAweDgyLCAweGU0LCAweGYwLCAweGVkLCAweDM1LCAweDRkLAotCTB4ZTIsIDB4ZDksIDB4MGUsIDB4NGEsIDB4MWYsIDB4ZWIsIDB4YmEsIDB4YjIsIDB4MjYsIDB4YzksIDB4NWEsIDB4YjQsCi0JMHg1YywgMHg5NywgMHgzNCwgMHg3OSwgMHg3NywgMHg5MCwgMHg2OSwgMHg5YywgMHgzYSwgMHgyOCwgMHg3YywgMHhjNSwKLQkweGZiLCAweDg3LCAweDhiLCAweGVmLCAweGZhLCAweGMzLCAweGE5LCAweGQ0LCAweDdkLCAweGM4LCAweDQ0LCAweGNlLAotCTB4NmEsIDB4ZDgsIDB4ZTEsIDB4MzYsIDB4ZjQsIDB4ODUsIDB4NmMsIDB4ZjAsIDB4MWQsIDB4MDUsIDB4ZDYsIDB4MWYsCi0JMHg2YiwgMHhjOCwgMHhkYywgMHg3NiwgMHhmZiwgMHhmMCwgMHg0MSwgMHg0ZSwgMHhkMywgMHhhYSwgMHhhNywgMHhlZSwKLQkweDk2LCAweGVmLCAweGUwLCAweDkzLCAweGRjLCAweDFkLCAweGVmLCAweDFmLCAweGQyLCAweGJmLCAweGVmLCAweGZlLAotCTB4ZTEsIDB4NTksIDB4ZjIsIDB4NjMsIDB4YTIsIDB4NzgsIDB4ZmYsIDB4ZTAsIDB4N2MsIDB4YTcsIDB4YzUsIDB4OGYsCi0JMHhiOSwgMHgzYSwgMHgxYywgMHg3OCwgMHhhZiwgMHg1ZCwgMHhjNSwgMHhkNSwgMHg5YywgMHgxMSwgMHg3OSwgMHgxOSwKLQkweDA3LCAweDMwLCAweGUwLCAweGRkLCAweDM1LCAweGYwLCAweGNjLCAweDZmLCAweDBmLCAweGUxLCAweGQ3LCAweGVkLAotCTB4ZjIsIDB4YWUsIDB4MjEsIDB4MjUsIDB4ZDcsIDB4MzgsIDB4YzksIDB4ZTUsIDB4NDMsIDB4YTMsIDB4ZGUsIDB4NmMsCi0JMHg2MSwgMHgyZCwgMHhkOCwgMHhiNywgMHg1MSwgMHhjMSwgMHgwMywgMHhjOSwgMHg3YiwgMHgzYywgMHg2YywgMHg0ZiwKLQkweDE2LCAweDhjLCAweDc0LCAweDk0LCAweGNmLCAweGQ2LCAweDRkLCAweGM5LCAweDFhLCAweGY5LCAweDMwLCAweGNmLAotCTB4ODYsIDB4ZDAsIDB4MWEsIDB4ZWQsIDB4NWUsIDB4NGQsIDB4YjgsIDB4NGQsIDB4OTEsIDB4MGYsIDB4MTUsIDB4YzMsCi0JMHgzOSwgMHgwOSwgMHg3OSwgMHgxZiwgMHg5MCwgMHhiOCwgMHhlOCwgMHg1NywgMHg4YywgMHhjNSwgMHg3NywgMHhmZCwKLQkweDQ2LCAweGFhLCAweGRlLCAweGMzLCAweGNjLCAweGMzLCAweDNjLCAweGE3LCAweGM5LCAweGJmLCAweGJkLCAweGYyLAotCTB4OGMsIDB4ODcsIDB4NmQsIDB4MWMsIDB4ZjMsIDB4ZDIsIDB4NDYsIDB4NzksIDB4ZWUsIDB4ZmMsIDB4NTQsIDB4NjQsCi0JMHg1NywgMHgxOSwgMHhjZSwgMHg5MiwgMHhhMiwgMHgzMSwgMHgzNywgMHhhMCwgMHgzZSwgMHg0OSwgMHgwZCwgMHg3ZiwKLQkweDk4LCAweDFhLCAweDJlLCAweGNmLCAweDA4LCAweGJkLCAweDNjLCAweDIzLCAweDM0LCAweDJkLCAweGM2LCAweGZkLAotCTB4NDYsIDB4ZTYsIDB4MDYsIDB4ZjUsIDB4OGUsIDB4NjMsIDB4ZjYsIDB4ZjUsIDB4MmEsIDB4NDYsIDB4ZWYsIDB4MDIsCi0JMHhmNSwgMHg3ZiwgMHhiZiwgMHg1MiwgMHgxYywgMHg3MywgMHg0ZCwgMHg2OSwgMHhjYywgMHg3YiwgMHhmMywgMHg5YSwKLQkweGIyLCAweGQ5LCAweDA1LCAweDc1LCAweDA3LCAweGQxLCAweDNkLCAweDE2LCAweGI1LCAweGEzLCAweDUwLCAweDRlLAotCTB4OGUsIDB4OTksIDB4NzIsIDB4Y2QsIDB4OGMsIDB4YWQsIDB4OTUsIDB4YjEsIDB4MjksIDB4ZjgsIDB4YjAsIDB4NDUsCi0JMHhiZSwgMHhkYiwgMHgyYSwgMHhlMywgMHg3MCwgMHgyYSwgMHhlYywgMHgxNCwgMHhiNSwgMHhmNywgMHhiOSwgMHg2MCwKLQkweDQ5LCAweGJmLCAweDdjLCAweGZkLCAweGQ2LCAweDJhLCAweDM4LCAweDc1LCAweGE4LCAweDBlLCAweDk4LCAweGI1LAotCTB4MTgsIDB4ZDcsIDB4NTEsIDB4MTksIDB4MzYsIDB4OWIsIDB4OTEsIDB4ZDMsIDB4ODMsIDB4ZTgsIDB4YjcsIDB4N2UsCi0JMHgyYiwgMHhhOCwgMHg5MywgMHg3YywgMHgxZiwgMHg3OCwgMHhlYywgMHg3OSwgMHg5ZSwgMHhkNywgMHhjZCwgMHhlYiwKLQkweDg4LCAweDI1LCAweDlmLCAweGM2LCAweDE5LCAweDdkLCAweDA4LCAweGU1LCAweGFjLCAweGE1LCAweGFmLCAweDc4LAotCTB4N2EsIDB4NjIsIDB4MTMsIDB4Y2YsIDB4MGEsIDB4MzEsIDB4NjQsIDB4Y2IsIDB4NWEsIDB4NzcsIDB4ZGIsIDB4ZDgsCi0JMHhmMiwgMHhmZSwgMHhlMSwgMHg3ZCwgMHg5MSwgMHgyZCwgMHg4ZSwgMHhlMSwgMHhlYywgMHhiMSwgMHgzMiwgMHg4YywKLQkweGViLCAweDRiLCAweGRkLCAweGRkLCAweDQ3LCAweGRkLCAweGE1LCAweGI3LCAweGZjLCAweDVhLCAweDM5LCAweDc1LAotCTB4NzcsIDB4YjcsIDB4ZjUsIDB4NmQsIDB4M2MsIDB4NDYsIDB4OGUsIDB4NTcsIDB4OTgsIDB4OWYsIDB4ODgsIDB4YzcsCi0JMHhlYiwgMHhlNCwgMHg5OCwgMHhkNCwgMHhkNywgMHhhYSwgMHg5NSwgMHhlMywgMHhmZiwgMHgzMywgMHhjNywgMHg5NCwKLQkweDczLCAweGM4LCAweDdhLCAweDc4LCAweDU5LCAweDQ4LCAweDZmLCAweDU2LCAweDYxLCAweDBmLCAweDJiLCAweGRiLAotCTB4YzgsIDB4YTksIDB4NDUsIDB4OTYsIDB4ZGUsIDB4ZWYsIDB4OTIsIDB4NGYsIDB4NGIsIDB4Y2MsIDB4NGYsIDB4ZTMsCi0JMHgxZCwgMHhmOCwgMHhkNCwgMHg0OCwgMHgzZSwgMHhlZCwgMHg1YSwgMHhjMSwgMHhhNywgMHhlMywgMHhlNCwgMHg1MywKLQkweDJmLCAweGY5LCAweGQ0LCAweGQyLCAweGY2LCAweDI3LCAweGQ0LCAweDE1LCAweDIxLCAweDgyLCAweDZkLCAweDM3LAotCTB4YzUsIDB4OWIsIDB4OWUsIDB4ZmYsIDB4OTUsIDB4OWUsIDB4MzcsIDB4YWQsIDB4NzQsIDB4Y2QsIDB4NGIsIDB4N2QsCi0JMHhhYSwgMHhhNCwgMHgyNywgMHhlZSwgMHhhMSwgMHgxZiwgMHgwNiwgMHgwNiwgMHhjOCwgMHhhNywgMHhjNywgMHg0ZCwKLQkweGQxLCAweGI4LCAweDJmLCAweDY5LCAweGE0LCAweDE2LCAweGU5LCAweDZiLCAweDdhLCAweGM4LCAweGE5LCAweGI3LAotCTB4YzgsIDB4YTksIDB4YjEsIDB4NDIsIDB4NTEsIDB4YTcsIDB4MGUsIDB4NzMsIDB4ZGQsIDB4ZjcsIDB4NTMsIDB4YTcsCi0JMHg3YSwgMHgwYSwgMHg1MiwgMHhkYiwgMHgxYywgMHhlMiwgMHgzZiwgMHg4NCwgMHg0ZiwgMHhjOSwgMHhhOSwgMHhmOSwKLQkweGE0LCAweGE3LCAweDUzLCAweGQ2LCAweDZmLCAweDkwLCAweDE4LCAweDNhLCAweDJmLCAweGY5LCAweDQ0LCAweDlkLAotCTB4NzIsIDB4MGIsIDB4NGQsIDB4ZDYsIDB4NzksIDB4YWUsIDB4NjksIDB4ZDIsIDB4MzUsIDB4NmUsIDB4NzQsIDB4OTMsCi0JMHg1MywgMHg4MSwgMHg3NiwgMHhlMywgMHhlMiwgMHg1NSwgMHg2MiwgMHgzNywgMHgxNCwgMHg4MywgMHgxZSwgMHhiMSwKLQkweGU1LCAweDlhLCAweDU4LCAweDYzLCAweDU5LCAweDI3LCAweDhmLCAweDEzLCAweGZmLCAweGRkLCAweGQ0LCAweDhjLAotCTB4ZGUsIDB4ODIsIDB4OGQsIDB4NDMsIDB4ODUsIDB4OTUsIDB4N2IsIDB4Y2EsIDB4M2EsIDB4NzQsIDB4YzcsIDB4N2QsCi0JMHgxOSwgMHgwZCwgMHhkZCwgMHhiOSwgMHg5ZCwgMHhmNSwgMHhlYSwgMHg4ZSwgMHhlZCwgMHg5MiwgMHhhZiwgMHg3YSwKLQkweDQ4LCAweGYyLCAweDc1LCAweGQ0LCAweGZkLCAweDYxLCAweGUwLCAweGNlLCAweGVmLCAweGM4LCAweGZiLCAweDMzLAotCTB4MjEsIDB4NGUsIDB4NWIsIDB4ZjIsIDB4ZmUsIDB4NDEsIDB4ZmEsIDB4MWUsIDB4ZmEsIDB4NjgsIDB4NGIsIDB4ZGUsCi0JMHhhMSwgMHg3NSwgMHg0NCwgMHg1NSwgMHgxOCwgMHg5MSwgMHg0NywgMHhmMSwgMHhiOSwgMHhjOCwgMHhkNiwgMHgzOSwKLQkweGYxLCAweDgwLCAweDU3LCAweDIzLCAweDBkLCAweGJkLCAweDhmLCAweGI1LCAweDZlLCAweGIxLCAweDc0LCAweGNlLAotCTB4OWIsIDB4Y2IsIDB4MDksIDB4ZjEsIDB4MTYsIDB4ZWIsIDB4ZDQsIDB4NjksIDB4OWUsIDB4ZTksIDB4NDYsIDB4ZjIsCi0JMHg5ZiwgMHg4YiwgMHhjNSwgMHgzYSwgMHgxNSwgMHg2MywgMHhlNiwgMHhhZCwgMHhmYiwgMHg0OCwgMHg0ZiwgMHhjNywKLQkweDRlLCAweGYyLCAweGQ5LCAweDQ0LCAweDdlLCAweGI5LCAweDQ2LCAweDUxLCAweDMzLCAweDRkLCAweDIxLCAweDc2LAotCTB4OWIsIDB4ZmYsIDB4MmQsIDB4ZmEsIDB4YmYsIDB4ZjIsIDB4YWUsIDB4MTAsIDB4ZDMsIDB4OGMsIDB4ZTEsIDB4OGEsCi0JMHg4NSwgMHgwMywgMHgwMSwgMHhjNCwgMHhmYSwgMHg2ZSwgMHhiMCwgMHhhZSwgMHg1ZiwgMHhkYSwgMHg2OCwgMHg2NCwKLQkweGYyLCAweDRhLCAweGEyLCAweDc3LCAweGFiLCAweDIyLCAweGJkLCAweDllLCAweGFmLCAweGIzLCAweDhjLCAweGVmLAotCTB4YjQsIDB4ZDAsIDB4MWIsIDB4N2QsIDB4YzgsIDB4MGMsIDB4MDYsIDB4ZjksIDB4ZmQsIDB4NGQsIDB4Y2IsIDB4YTAsCi0JMHg3ZiwgMHgxNiwgMHhhMiwgMHgzZiwgMHgyNSwgMHhjNywgMHgxMCwgMHhhMiwgMHhjMywgMHg5MiwgMHhlNywgMHg4MCwKLQkweDMxLCAweDllLCAweDAzLCAweGIyLCAweGEyLCAweGMyLCAweGJjLCAweDQyLCAweDZkLCAweDMyLCAweDMyLCAweDYzLAotCTB4OGEsIDB4YzksIDB4YmUsIDB4NTEsIDB4NzgsIDB4M2EsIDB4Y2IsIDB4NjcsIDB4ZGEsIDB4NTQsIDB4MDQsIDB4N2YsCi0JMHhlZCwgMHhmOSwgMHhlNywgMHgyOCwgMHgzNSwgMHhhYiwgMHgwMSwgMHg3ZiwgMHhlMywgMHhlOSwgMHg5NiwgMHg4YSwKLQkweDNkLCAweGNmLCAweDFiLCAweDI5LCAweDU1LCAweDM5LCAweDg4LCAweGY3LCAweDJkLCAweDQzLCAweGZmLCAweDIxLAotCTB4ZTMsIDB4YTYsIDB4ZDYsIDB4M2MsIDB4YjcsIDB4MTksIDB4NTEsIDB4NzAsIDB4OGUsIDB4NmMsIDB4OWYsIDB4YmYsCi0JMHg0NiwgMHhkMSwgMHg1OCwgMHgzYiwgMHhiZSwgMHhkZiwgMHgyMiwgMHg2YiwgMHhmNywgMHgxMCwgMHhiYSwgMHg5YiwKLQkweGY3LCAweGYzLCAweGEzLCAweGEyLCAweDc2LCAweDQ2LCAweDU1LCAweDc2LCAweGQwLCAweDkzLCAweDU0LCAweGNmLAotCTB4NTQsIDB4NjMsIDB4ZWYsIDB4N2EsIDB4MjEsIDB4ZDYsIDB4YWUsIDB4NzcsIDB4YzAsIDB4MzMsIDB4NWYsIDB4ZmMsCi0JMHgwMiwgMHg2YiwgMHhkMCwgMHg4OSwgMHgxYSwgMHgyMywgMHgwZCwgMHhmYywgMHgwNCwgMHgzYiwgMHhlOSwgMHg2NSwKLQkweDUzLCAweDZkLCAweDM5LCAweGUwLCAweDFlLCAweGI5LCAweGM2LCAweDlmLCAweDYwLCAweGIzLCAweGY0LCAweGMwLAotCTB4NTYsIDB4YjUsIDB4ZjQsIDB4NWIsIDB4MWUsIDB4N2UsIDB4OGIsIDB4NzcsIDB4NDgsIDB4NGMsIDB4ZjUsIDB4ZDEsCi0JMHhhYywgMHgyOCwgMHgzNywgMHg4ZCwgMHhiZSwgMHg3OSwgMHhkNiwgMHhkYiwgMHg0YiwgMHhiMSwgMHhiYiwgMHhmNSwKLQkweDZmLCAweGNkLCAweDRiLCAweDBmLCAweDZjLCAweDQ2LCAweGI3LCAweDI4LCAweDgyLCAweGI5LCAweDc4LCAweDg2LAotCTB4YjksIDB4ODgsIDB4MzksIDB4NjEsIDB4NWEsIDB4ODYsIDB4NmEsIDB4M2IsIDB4ZTYsIDB4NTQsIDB4MmIsIDB4YzMsCi0JMHhjYSwgMHg4MywgMHhlNCwgMHg0MywgMHg1ZiwgMHhiMCwgMHg5YywgMHgxZSwgMHhjMiwgMHhhMSwgMHg3ZiwgMHhmMCwKLQkweGExLCAweGYyLCAweGE4LCAweGY0LCAweDE0LCAweDIxLCAweDZhLCAweDRkLCAweDUzLCAweDJmLCAweDRmLCAweDE3LAotCTB4ZDgsIDB4OTcsIDB4OTQsIDB4ZmUsIDB4ODMsIDB4NTgsIDB4M2YsIDB4N2EsIDB4NTMsIDB4NmMsIDB4YTYsIDB4YzcsCi0JMHhkZCwgMHg1YywgMHhmMiwgMHhiOCwgMHhiYiwgMHg2NiwgMHhkMywgMHhmNCwgMHhjMCwgMHg5YSwgMHgyMiwgMHhlZiwKLQkweGQzLCAweDUyLCAweDZkLCAweDNjLCAweDk0LCAweDNlLCAweDI4LCAweDdkLCAweDg4LCAweDVjLCAweDgzLCAweDhlLAotCTB4NmIsIDB4NDksIDB4ODksIDB4NWQsIDB4MWQsIDB4YTMsIDB4ZWQsIDB4NDYsIDB4MjQsIDB4MGIsIDB4NzksIDB4N2YsCi0JMHg3MywgMHhiYiwgMHhiZiwgMHg4MCwgMHg5ZSwgMHhmZSwgMHgxZCwgMHhjZiwgMHgwMSwgMHg3ZCwgMHgwNywgMHg2MywKLQkweDMxLCAweDgyLCAweDQyLCAweGQ0LCAweDI2LCAweGZkLCAweGU4LCAweGYzLCAweGNlLCAweDczLCAweDExLCAweDNkLAotCTB4NGQsIDB4ZGUsIDB4NWYsIDB4YTQsIDB4NGYsIDB4ZjAsIDB4ZjMsIDB4ZGMsIDB4N2MsIDB4OTAsIDB4NTgsIDB4ZmEsCi0JMHhhYywgMHg2NSwgMHhlNCwgMHg1OCwgMHgzZCwgMHhiMiwgMHg5MywgMHhiNSwgMHgzMCwgMHhhYywgMHhmYiwgMHhhOSwKLQkweGFiLCAweDU3LCAweDcyLCAweDBmLCAweGIyLCAweDllLCAweGZiLCAweGRhLCAweDIzLCAweDNjLCAweDAzLCAweDM0LAotCTB4Y2UsIDB4NjQsIDB4NDUsIDB4M2QsIDB4ZmQsIDB4ZTAsIDB4MzcsIDB4NzgsIDB4ZWUsIDB4YWQsIDB4NjksIDB4OGIsCi0JMHhkMywgMHg2ZiwgMHgyZiwgMHhlZiwgMHg5NSwgMHgwZiwgMHg0ZiwgMHg1OSwgMHgyNiwgMHgxYywgMHhlZiwgMHg3NywKLQkweDU4LCAweGVmLCAweDlhLCAweGJkLCAweDI5LCAweGU2LCAweGNjLCAweGJiLCAweGY1LCAweDhlLCAweDYyLCAweDVjLAotCTB4NmEsIDB4OTksIDB4NmQsIDB4YTEsIDB4NjUsIDB4MDMsIDB4Y2YsIDB4OGUsIDB4NzcsIDB4ODgsIDB4YTksIDB4NDcsCi0JMHg3YSwgMHg5ZiwgMHg0MCwgMHhiMSwgMHhkZiwgMHg5ZiwgMHhjZSwgMHgzNiwgMHhlOCwgMHhkYiwgMHg1OSwgMHhlZiwKLQkweDE2LCAweDg5LCAweDk1LCAweDVkLCAweGViLCAweDJkLCAweDE5LCAweGNiLCAweGEyLCAweDhjLCAweDg1LCAweGZlLAotCTB4ZDIsIDB4YjksIDB4ZGYsIDB4NDcsIDB4NWYsIDB4OTIsIDB4MDQsIDB4YWEsIDB4Y2YsIDB4M2UsIDB4NDUsIDB4NWUsCi0JMHhmOSwgMHg1YSwgMHhhYiwgMHg5MSwgMHgxZCwgMHg2MiwgMHg4YywgMHhjNywgMHhmZSwgMHg5MSwgMHg1YiwgMHgzMywKLQkweDMwLCAweDhkLCAweDAxLCAweDFmLCAweGZiLCAweDRjLCAweDU5LCAweGMwLCAweDEzLCAweDBiLCAweDNjLCAweDk3LAotCTB4NGUsIDB4YzcsIDB4ZTgsIDB4Y2IsIDB4ZTksIDB4MjMsIDB4MTcsIDB4MzQsIDB4M2MsIDB4M2EsIDB4NWIsIDB4OGUsCi0JMHhlZiwgMHhjZCwgMHg4NiwgMHhiMSwgMHg2ZiwgMHhkNiwgMHhiYiwgMHhkNywgMHhkYSwgMHg1YSwgMHhjYiwgMHhmNywKLQkweDNhLCAweDkyLCAweDQyLCAweGNjLCAweDViLCAweGViLCAweGYxLCAweDFlLCAweDNkLCAweGQ0LCAweDZhLCAweGM1LAotCTB4ODcsIDB4YzgsIDB4NTEsIDB4ZTgsIDB4M2EsIDB4NzEsIDB4NTMsIDB4ZDMsIDB4ZjIsIDB4M2QsIDB4MjYsIDB4NTgsCi0JMHgwOCwgMHg3MywgMHhiZCwgMHhkNCwgMHhjOSwgMHg2NywgMHhiYywgMHhlZiwgMHg2MywgMHhmNCwgMHg4ZiwgMHgxOSwKLQkweDg5LCAweDQxLCAweDk3LCAweDE4LCAweDc0LCAweDg5LCAweGM5LCAweDViLCAweDllLCAweDVhLCAweDYyLCAweDM5LAotCTB4NGUsIDB4MWYsIDB4ZmQsIDB4YjQsIDB4MjgsIDB4NjIsIDB4ZTMsIDB4MGIsIDB4NzEsIDB4ZGEsIDB4N2MsIDB4OTUsCi0JMHhmYywgMHg1NSwgMHhhOSwgMHhhMSwgMHhjMCwgMHhkZiwgMHhlNywgMHgyMiwgMHhmYSwgMHg4ZSwgMHg4MiwgMHhjYywKLQkweGZmLCAweDVmLCAweDk2LCAweGYyLCAweGJmLCAweDE4LCAweDJhLCAweGVhLCAweDg1LCAweGUxLCAweGNjLCAweGEzLAotCTB4MDEsIDB4ZDMsIDB4NmUsIDB4ODMsIDB4YmUsIDB4ZDUsIDB4MWQsIDB4MTksIDB4ZDYsIDB4OTAsIDB4OGQsIDB4NTYsCi0JMHhjMywgMHgxOCwgMHg5YywgMHg4NiwgMHhhZiwgMHgzNSwgMHgwYywgMHhiOSwgMHg3NiwgMHgyMCwgMHhlZiwgMHhhZCwKLQkweDUxLCAweDg4LCAweDA5LCAweGVhLCAweDliLCAweGNjLCAweGMxLCAweGJmLCAweGU3LCAweGQwLCAweGVhLCAweDYzLAotCTB4M2UsIDB4MWMsIDB4YzYsIDB4YmUsIDB4OGYsIDB4N2IsIDB4ZjAsIDB4NzEsIDB4NWUsIDB4ZGUsIDB4NzMsIDB4YzYsCi0JMHhkMiwgMHg1ZCwgMHhiOCwgMHhlZSwgMHg4ZCwgMHhmOSwgMHg1MSwgMHgzZSwgMHg4NSwgMHgyMywgMHhlZSwgMHgyNSwKLQkweDcxLCAweGE0LCAweGFlLCAweGE4LCAweGYxLCAweDY5LCAweDllLCAweDhmLCAweGFhLCAweDhmLCAweDk2LCAweGJjLAotCTB4MTAsIDB4MzksIDB4NWMsIDB4YzksIDB4ZjUsIDB4NWUsIDB4NGIsIDB4N2EsIDB4ZGUsIDB4OWYsIDB4MzUsIDB4NzIsCi0JMHg1MCwgMHgzYiwgMHg2ZCwgMHg2ZSwgMHhlNCwgMHhkYSwgMHg2ZSwgMHg4YSwgMHg4OSwgMHg1OCwgMHhiMywgMHg1NiwKLQkweDhjLCAweDI5LCAweGExLCAweDlmLCAweDQyLCAweDE5LCAweGIxLCAweDJiLCAweGNmLCAweDQ4LCAweDUyLCAweDNmLAotCTB4ZTQsIDB4NmYsIDB4OWUsIDB4NGYsIDB4NTQsIDB4MjcsIDB4ZTIsIDB4ZTcsIDB4YmEsIDB4OWMsIDB4ODcsIDB4NjQsCi0JMHg1YiwgMHhhOCwgMHhlNCwgMHg1NywgMHg5NywgMHhiZCwgMHg0OCwgMHgwNywgMHg5ZiwgMHg0OSwgMHgyZiwgMHhmMiwKLQkweGI5LCAweGU4LCAweGFiLCAweGViLCAweGI4LCAweGE1LCAweDM5LCAweDU5LCAweGJlLCAweDMxLCAweGVlLCAweGNhLAotCTB4ZmIsIDB4YWIsIDB4MTYsIDB4M2EsIDB4NjIsIDB4MDUsIDB4ZTcsIDB4MTgsIDB4ZjksIDB4YTksIDB4ZDYsIDB4OTgsCi0JMHgzZSwgMHhjYSwgMHhmMSwgMHgxYywgMHg1ZCwgMHgyNywgMHg5NywgMHgwZiwgMHhkMiwgMHgyZiwgMHhmMywgMHg5ZCwKLQkweDQyLCAweDBiLCAweGZiLCAweDQ4LCAweDJkLCAweGRiLCAweGMxLCAweGI1LCAweGZlLCAweGI2LCAweDU5LCAweDYyLAotCTB4N2IsIDB4ZDQsIDB4N2QsIDB4YzMsIDB4YTcsIDB4OWEsIDB4NzIsIDB4OWQsIDB4ODksIDB4ZDQsIDB4MjgsIDB4ZTMsCi0JMHg1OSwgMHhkMiwgMHhhNSwgMHhiNywgMHg3NiwgMHhhOCwgMHg2ZCwgMHgwOSwgMHhhZiwgMHg3ZiwgMHg1NiwgMHg5NSwKLQkweDcxLCAweDc4LCAweGYxLCAweGIwLCAweDRkLCAweDZhLCAweDk2LCAweDkxLCAweDM5LCAweDg3LCAweDg0LCAweDMzLAotCTB4MjAsIDB4Y2QsIDB4YzEsIDB4MmEsIDB4MTksIDB4NDMsIDB4NTMsIDB4NjQsIDB4ODAsIDB4ZjEsIDB4OWMsIDB4YTgsCi0JMHhmMywgMHhmNCwgMHg5MCwgMHhjZiwgMHgzOCwgMHg5ZiwgMHhlYiwgMHhkYiwgMHg1YSwgMHgwZSwgMHg4MSwgMHhkNSwKLQkweDQ5LCAweGVmLCAweGRjLCAweDVmLCAweGZhLCAweDdmLCAweDE4LCAweDJhLCAweDdkLCAweDg4LCAweGM0LCAweGUyLAotCTB4ZmYsIDB4MDIsIDB4YzcsIDB4MmEsIDB4MjYsIDB4Y2YsIDB4OTQsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkweGJkLCAweDU5LCAweDZkLCAweDcwLCAweDViLCAweDU1LCAweDdhLCAweDdlLCAweGFlLCAweDc0LCAweDI1LCAweDVkLAorCTB4ZGIsIDB4YjIsIDB4NzUsIDB4OGQsIDB4OTUsIDB4MjAsIDB4YjcsIDB4MmUsIDB4ZDYsIDB4OGQsIDB4YWYsIDB4NmMsCisJMHgxMSwgMHhiOSwgMHhlMSwgMHgyYSwgMHgzNiwgMHg0NSwgMHgxOSwgMHhlZSwgMHg5NCwgMHgxYiwgMHg3ZiwgMHgyMSwKKwkweDkyLCAweDEwLCAweDk0LCAweDQyLCAweDViLCAweDY3LCAweDk2LCAweDE5LCAweDRjLCAweGUyLCAweDRkLCAweDRjLAorCTB4MDgsIDB4NmMsIDB4YmEsIDB4Y2IsIDB4NGMsIDB4ZGQsIDB4ZDksIDB4NGMsIDB4MjMsIDB4ZmMsIDB4MTUsIDB4OTMsCisJMHhjOCwgMHgxNiwgMHg2YiwgMHgyMCwgMHgyNiwgMHgzYiwgMHgzYiwgMHg0MywgMHhjNiwgMHhmOSwgMHg3MCwgMHgwYSwKKwkweDcyLCAweDE0LCAweGRhLCAweDNmLCAweDNiLCAweGQzLCAweDY1LCAweGYwLCAweDZjLCAweDEyLCAweDEyLCAweDU4LAorCTB4ZDgsIDB4YjQsIDB4ZDMsIDB4M2YsIDB4YzksIDB4ZjQsIDB4YzcsIDB4N2EsIDB4MjEsIDB4YTEsIDB4ODEsIDB4NDIsCisJMHgzNiwgMHhlZCwgMHgwYywgMHg5ZCwgMHg1MCwgMHg2OCwgMHg0ZSwgMHg5ZiwgMHg3MywgMHgyNSwgMHgwNywgMHgxMywKKwkweGIyLCAweGZkLCAweGQ5LCAweGNjLCAweDA4LCAweDRiLCAweGU3LCAweGRlLCAweDczLCAweGNlLCAweDdiLCAweGNlLAorCTB4ZmIsIDB4M2MsIDB4Y2YsIDB4ZmIsIDB4OWMsIDB4YzMsIDB4MGEsIDB4MDUsIDB4OTUsIDB4MjgsIDB4ZmYsIDB4YWIsCisJMHhlNiwgMHhhNywgMHhmZCwgMHhjOSwgMHg1ZCwgMHhjZiwgMHhhZCwgMHg1ZSwgMHhkNSwgMHhiZSwgMHg4YSwgMHg1ZiwKKwkweDU3LCAweDJiLCAweGNiLCAweDU1LCAweDE1LCAweGZmLCAweDhmLCAweGZmLCAweGJjLCAweDgwLCAweGJlLCAweDE4LAorCTB4ODcsIDB4ZmMsIDB4NDAsIDB4ZjMsIDB4ZDgsIDB4ZjMsIDB4NzcsIDB4NzUsIDB4OTgsIDB4ZDAsIDB4YmMsIDB4ZjYsCisJMHg2MywgMHg0ZCwgMHg1YiwgMHg0ZCwgMHhjMCwgMHgyOSwgMHgyNCwgMHhhMiwgMHg5ZCwgMHhmOCwgMHgxZiwgMHg5MSwKKwkweDBkLCAweGFiLCAweDkwLCAweGVkLCAweDdmLCAweDY0LCAweDdmLCAweDdkLCAweGNmLCAweDViLCAweGY3LCAweDE5LAorCTB4ZDcsIDB4MGUsIDB4NzksIDB4YTEsIDB4ZTksIDB4ZjYsIDB4YjgsIDB4YWEsIDB4MzcsIDB4NDMsIDB4NmIsIDB4NjAsCisJMHg5ZiwgMHg5ZiwgMHhiNSwgMHhmNCwgMHhmYiwgMHg1MCwgMHhiMywgMHgzOCwgMHgxNiwgMHg3MCwgMHgzOCwgMHg2NywKKwkweDU4LCAweGRiLCAweDkwLCAweGQwLCAweDRmLCAweDQxLCAweDg1LCAweGMzLCAweDM5LCAweDhlLCAweDE1LCAweDgwLAorCTB4YmQsIDB4MzksIDB4MDUsIDB4OTcsIDB4MzksIDB4ZTYsIDB4NjgsIDB4NDEsIDB4YzMsIDB4ODIsIDB4ZDcsIDB4OWQsCisJMHhhZSwgMHhhZiwgMHhjMiwgMHg0NiwgMHhjNiwgMHg5YywgMHhkOCwgMHgyMywgMHgwMiwgMHgyNiwgMHhiMiwgMHg3ZiwKKwkweDYwLCAweDliLCAweGYxLCAweGJkLCAweDA4LCAweGE2LCAweDY2LCAweGRhLCAweDkxLCAweDU5LCAweDMxLCAweGE3LAorCTB4NjEsIDB4NzMsIDB4YmUsIDB4YTEsIDB4NGYsIDB4YjMsIDB4YzEsIDB4NzcsIDB4MTQsIDB4YTQsIDB4ZWUsIDB4ZDMsCisJMHhkMCwgMHg1YiwgMHg4YywgMHgyMywgMHg1YiwgMHhjYywgMHhjMiwgMHgyOSwgMHg4ZSwgMHhmMCwgMHhhMywgMHgyMSwKKwkweDMwLCAweGExLCAweDY5LCAweGY3LCAweDRjLCAweDJjLCAweDk3LCAweGVmLCAweDIwLCAweDM4LCAweDcxLCAweDRkLAorCTB4NWMsIDB4NGQsIDB4ZWEsIDB4NzgsIDB4NmYsIDB4OGQsIDB4MTAsIDB4ZDUsIDB4MzYsIDB4YjIsIDB4NTUsIDB4ZWQsCisJMHg1OSwgMHg3OCwgMHg2ZCwgMHhjMywgMHg1YSwgMHhlZiwgMHg1NSwgMHhkMCwgMHhmNSwgMHhjNywgMHg2NiwgMHg3YywKKwkweDQyLCAweDc5LCAweGY0LCAweDUxLCAweDhmLCAweDBkLCAweDRkLCAweGIxLCAweGEzLCAweDZhLCAweDUzLCAweGExLAorCTB4MDEsIDB4NjMsIDB4NDUsIDB4MWQsIDB4N2IsIDB4OGIsIDB4NjEsIDB4OGMsIDB4MTQsIDB4YjEsIDB4ZGIsIDB4N2IsCisJMHhhZiwgMHgxZiwgMHgzMywgMHgzYSwgMHg5YywgMHhlZiwgMHhiNSwgMHhlYywgMHhjNiwgMHg4ZSwgMHhkYywgMHgyMCwKKwkweGI2LCAweGU2LCAweDUyLCAweGQ4LCAweDU3LCAweDk0LCAweDMxLCAweDQ2LCAweDMxLCAweDVjLCAweDU0LCAweGUxLAorCTB4OWYsIDB4MzAsIDB4MjIsIDB4ZWYsIDB4ZTIsIDB4NzYsIDB4Y2YsIDB4ODQsIDB4MTgsIDB4YjEsIDB4MDIsIDB4MTgsCisJMHhiMiwgMHhlMiwgMHgxOCwgMHhjZCwgMHg3YiwgMHhiOCwgMHhjZSwgMHgwMCwgMHg4NiwgMHhjZCwgMHhlYiwgMHhhMiwKKwkweGRmLCAweDMyLCAweGFjLCAweDUxLCAweDg4LCAweGM2LCAweGQzLCAweDk2LCAweDExLCAweGU5LCAweGYyLCAweGMyLAorCTB4ZjksIDB4YjEsIDB4MTksIDB4YzEsIDB4MjgsIDB4NjMsIDB4MWYsIDB4NzEsIDB4ZmIsIDB4OGQsIDB4YTAsIDB4ZWIsCisJMHg2NiwgMHgzZiwgMHg4NywgMHhmZCwgMHg3NCwgMHg4YywgMHg3ZCwgMHhiYiwgMHg2ZiwgMHg3NCwgMHgxNCwgMHg4OSwKKwkweGM4LCAweDE4LCAweDNjLCAweGU4LCAweDBiLCAweGI3LCAweGIyLCAweDVmLCAweDUzLCAweDc0LCAweDBjLCAweDQ2LAorCTB4OWMsIDB4ZTMsIDB4NjQsIDB4ZmQsIDB4ZWQsIDB4MGUsIDB4YzcsIDB4YzgsIDB4YjIsIDB4YmYsIDB4MTEsIDB4M2QsCisJMHgwNiwgMHgzOSwgMHg1NiwgMHgwMywgMHg3ZiwgMHhiNywgMHhiMywgMHhiZiwgMHgwMiwgMHg4ZiwgMHgxZCwgMHg4YiwKKwkweDBlLCAweGIxLCAweGNmLCAweDI5LCAweDRiLCAweGM1LCAweDE5LCAweDdlLCAweGZhLCAweDc0LCAweDQzLCAweDY2LAorCTB4NTYsIDB4MDksIDB4YjAsIDB4N2QsIDB4MmYsIDB4ZjgsIDB4ZGMsIDB4YWMsIDB4YzIsIDB4YTEsIDB4OGMsIDB4ODUsCisJMHgyMSwgMHhhZSwgMHg1YiwgMHg2MywgMHhkYiwgMHgzOCwgMHhkYiwgMHg3YywgMHhhNiwgMHhjNSwgMHhmMSwgMHhhMSwKKwkweDc3LCAweDE1LCAweDk3LCAweDYyLCAweDYyLCAweDMxLCAweDM3LCAweGJmLCAweGFmLCAweDlkLCAweDYzLCAweGU0LAorCTB4NGIsIDB4MzksIDB4OTUsIDB4ZWYsIDB4NzQsIDB4ZTYsIDB4NmYsIDB4ODgsIDB4MjcsIDB4ZDUsIDB4YTUsIDB4Y2YsCisJMHgwNywgMHg5NSwgMHgwZSwgMHhiNiwgMHgzOSwgMHg2YSwgMHgwMywgMHhmNiwgMHhlNiwgMHhhMSwgMHhmOSwgMHg0ZCwKKwkweDhkLCAweGYzLCAweDY4LCAweGY4LCAweDI4LCAweDM3LCAweGE4LCAweGY0LCAweDE0LCAweDFkLCAweGE1LCAweDdiLAorCTB4YjYsIDB4NDMsIDB4NzEsIDB4NjYsIDB4NTUsIDB4YTUsIDB4NmIsIDB4NWEsIDB4YzYsIDB4MmQsIDB4YzQsIDB4MGIsCisJMHg5NiwgMHhjMiwgMHg5OCwgMHg3ZiwgMHgyMiwgMHhlMywgMHg3NSwgMHhhMiwgMHhjYSwgMHgwZCwgMHhiMSwgMHgzMiwKKwkweGU2LCAweDQxLCAweDk1LCAweGQ5LCAweGEzLCAweGFjLCAweDlmLCAweDE1LCAweDIyLCAweDlkLCAweDRjLCAweDJiLAorCTB4ZWIsIDB4NjYsIDB4YTEsIDB4MDUsIDB4NmQsIDB4NWIsIDB4Y2QsIDB4NGQsIDB4ZWMsIDB4NDMsIDB4NzYsIDB4OTksCisJMHg4OSwgMHg4MywgMHhmOSwgMHgyOCwgMHgzZSwgMHhiMCwgMHgzYywgMHgzOCwgMHhiNCwgMHhhYywgMHgwMiwgMHhhYSwKKwkweGE5LCAweGYwLCAweDgzLCAweGUwLCAweDc5LCAweDBiLCAweDZhLCAweDBkLCAweGJmLCAweDVmLCAweGRkLCAweGE0LAorCTB4NjIsIDB4YTQsIDB4N2QsIDB4OWQsIDB4ZDIsIDB4YzUsIDB4M2UsIDB4M2UsIDB4ZTYsIDB4ZjksIDB4NjgsIDB4MmUsCisJMHg4ZCwgMHgyMCwgMHhiMSwgMHg1MywgMHg2NSwgMHhjNywgMHgyMiwgMHgwNSwgMHhlZSwgMHhjZCwgMHg3YiwgMHg1NiwKKwkweDJjLCAweGZlLCAweGI0LCAweGM0LCAweDYzLCAweGFkLCAweDExLCAweDkxLCAweDdiLCAweDUzLCAweDZkLCAweGM3LAorCTB4ZTIsIDB4NzMsIDB4ZGMsIDB4MDcsIDB4YWYsIDB4YTksIDB4ZTIsIDB4ZDcsIDB4OTYsIDB4MGYsIDB4ZjMsIDB4OWIsCisJMHgyYywgMHhlNiwgMHg1NCwgMHg4NywgMHg5ZiwgMHhlZCwgMHhjNywgMHhkYywgMHg3NiwgMHhmOSwgMHgxYiwgMHg3YSwKKwkweGY3LCAweGI3LCAweGY2LCAweGExLCAweGI0LCAweDA3LCAweGMzLCAweGY5LCAweDI2LCAweGM2LCAweDVjLCAweGRhLAorCTB4ODMsIDB4NDcsIDB4YjgsIDB4ZGUsIDB4ZGYsIDB4ZmEsIDB4ZTQsIDB4ZDcsIDB4YmIsIDB4NmUsIDB4YjYsIDB4NmQsCisJMHg2NiwgMHg5YywgMHgxZSwgMHhkYiwgMHg5YywgMHg1ZiwgMHhlMSwgMHhhZCwgMHgwNywgMHhlYSwgMHhkYSwgMHhiMSwKKwkweDhmLCAweDM5LCAweGVlLCAweDRhLCAweDJlLCAweDQ3LCAweGQ2LCAweDdkLCAweDFlLCAweGQ2LCAweGQ3LCAweDRmLAorCTB4ZDcsIDB4YTEsIDB4NmYsIDB4OTksIDB4YmIsIDB4NmYsIDB4ZmEsIDB4YzYsIDB4NjksIDB4MjEsIDB4Y2UsIDB4MjQsCisJMHhmZCwgMHg5OCwgMHgzMywgMHg4NywgMHgyMiwgMHhkNSwgMHhjOCwgMHg1YSwgMHg1ZSwgMHhlNiwgMHhmYiwgMHgyYywKKwkweGU3LCAweDJmLCAweDI0LCAweGJkLCAweDM4LCAweDljLCAweDNjLCAweDg0LCAweDZjLCAweDJkLCAweDMwLCAweDkzLAorCTB4OTMsIDB4YmMsIDB4MzIsIDB4ZTYsIDB4Y2YsIDB4ZjIsIDB4YmYsIDB4OWUsIDB4YTIsIDB4NWMsIDB4OWYsIDB4YzUsCisJMHhmNSwgMHgyOSwgMHgzOCwgMHg2NiwgMHg0YSwgMHg0YywgMHg1YiwgMHg2YSwgMHgzMywgMHhmOSwgMHhiNSwgMHg4MywKKwkweGZiLCAweDU5LCAweGRmLCAweDFlLCAweDI0LCAweDNlLCAweDgxLCAweDBmLCAweDczLCAweGZkLCAweGQ4LCAweDVjLAorCTB4OGEsIDB4MDUsIDB4ZDcsIDB4NzMsIDB4NTAsIDB4N2MsIDB4NmQsIDB4NjksIDB4MWMsIDB4MmEsIDB4ZmQsIDB4MjYsCisJMHhjNywgMHhkMywgMHg2YSwgMHg0NywgMHhjZSwgMHhjOCwgMHhhNCwgMHg5MSwgMHgzOCwgMHhkNywgMHhhMSwgMHhjOCwKKwkweGZlLCAweDY5LCAweDc1LCAweDY1LCAweGMxLCAweDhmLCAweDY4LCAweDVkLCAweGU5LCAweDc5LCAweDk1LCAweGJkLAorCTB4NDEsIDB4N2QsIDB4N2EsIDB4NDIsIDB4YzEsIDB4ZjYsIDB4OTgsIDB4N2MsIDB4YjYsIDB4NDEsIDB4NmQsIDB4MjksCisJMHg0MCwgMHhhYiwgMHhiNiwgMHg3NywgMHhhOSwgMHg3MywgMHgxMywgMHg0NiwgMHhkZiwgMHg3MSwgMHgyNSwgMHgxMSwKKwkweDlkLCAweDcwLCAweGZiLCAweGVjLCAweDUyLCAweDViLCAweDBiLCAweDAxLCAweGFlLCAweDI3LCAweGNlLCAweDljLAorCTB4NDAsIDB4YWIsIDB4YjEsIDB4OWYsIDB4NTMsIDB4N2YsIDB4Y2QsIDB4MDcsIDB4ZTcsIDB4ZGMsIDB4M2UsIDB4Y2YsCisJMHhhOSwgMHhmMSwgMHg4MiwgMHg2YywgMHgzNywgMHhhYywgMHhhOCwgMHgxMiwgMHhjMCwgMHhkZCwgMHg0OSwgMHgwZCwKKwkweDJiLCAweDViLCAweDQ0LCAweDYzLCAweDc3LCAweGQyLCAweDk4LCAweGVmLCAweGY2LCAweDQ2LCAweDcwLCAweDkwLAorCTB4NWMsIDB4MjAsIDB4ZWUsIDB4OWMsIDB4M2YsIDB4NmMsIDB4MTksIDB4NDEsIDB4NzcsIDB4ZDEsIDB4OGIsIDB4NjgsCisJMHhhZCwgMHg4MywgMHhmZCwgMHhmOSwgMHgwMCwgMHg3ZSwgMHg0OSwgMHhmYywgMHhmNywgMHg1OCwgMHgzYSwgMHg0NiwKKwkweGYyLCAweDQ2LCAweGZjLCAweDU3LCAweDQ4LCAweGE0LCAweDhlLCAweDMwLCAweDY3LCAweDBiLCAweGU0LCAweGMwLAorCTB4ZmUsIDB4NjIsIDB4NTMsIDB4ZmMsIDB4MDgsIDB4OGMsIDB4ODEsIDB4NmUsIDB4NzIsIDB4NDAsIDB4NmIsIDB4OTcsCisJMHgzMSwgMHg0MCwgMHg1NywgMHg2ZCwgMHg3MiwgMHhhNywgMHhkOCwgMHg4MCwgMHgxYywgMHhmOSwgMHhkMCwgMHhlZCwKKwkweGYyLCAweDZhLCAweDUwLCAweGU5LCAweDJhLCAweGJlLCAweDRmLCAweDZkLCAweGVkLCAweDIxLCAweGJlLCAweDEwLAorCTB4OGEsIDB4OTgsIDB4N2UsIDB4YTQsIDB4ZWEsIDB4YTIsIDB4MzgsIDB4NGQsIDB4YWMsIDB4NjQsIDB4YzMsIDB4MTUsCisJMHhjYywgMHhhNSwgMHhjYywgMHhlNywgMHg0NSwgMHgzZSwgMHg1ZiwgMHhhNywgMHg3NCwgMHhjZSwgMHg0NiwgMHhmMSwKKwkweDRiLCAweGViLCAweDZiLCAweGUxLCAweDg0LCAweGFiLCAweGQ5LCAweGU2LCAweDViLCAweGQyLCAweGFlLCAweGUxLAorCTB4ZjIsIDB4Y2IsIDB4OTUsIDB4ZjgsIDB4ZjQsIDB4ZTUsIDB4MjAsIDB4YmUsIDB4N2MsIDB4OTksIDB4ZmMsIDB4Y2UsCisJMHhhMywgMHhiZCwgMHgxMiwgMHg0MiwgMHhhNCwgMHhkYSwgMHg4NCwgMHgyOCwgMHg1YSwgMHhhZCwgMHhmOCwgMHhhOCwKKwkweDM2LCAweDE2LCAweGJkLCAweDAwLCAweGE5LCAweDhkLCAweDhlLCAweGJhLCAweDM1LCAweDY3LCAweGVjLCAweDFhLAorCTB4NDAsIDB4YzIsIDB4MzksIDB4ZTUsIDB4ZWUsIDB4ODUsIDB4YTMsIDB4YWUsIDB4MmEsIDB4OWMsIDB4MTYsIDB4ZDgsCisJMHg1NCwgMHhkYSwgMHgwYiwgMHhiZiwgMHhkZCwgMHhhNSwgMHhiZSwgMHhjMywgMHhkYywgMHg5YywgMHg3NywgMHg3MywKKwkweGQzLCAweGE1LCAweGRlLCAweDUzLCAweGI4LCAweGRmLCAweDgzLCAweGNhLCAweGQyLCAweDMzLCAweGQ1LCAweGNlLAorCTB4YTgsIDB4MjMsIDB4MzksIDB4YTMsIDB4NzcsIDB4OWMsIDB4ZWIsIDB4ZWIsIDB4NzcsIDB4ZmIsIDB4NjYsIDB4ZDQsCisJMHgwNCwgMHhmNywgMHg3ZSwgMHhhMSwgMHg5YywgMHg5YiwgMHg2YSwgMHhmYiwgMHgzMSwgMHhlZSwgMHgzMywgMHg3MywKKwkweGVmLCAweGVlLCAweGUzLCAweDYzLCAweGRjLCAweDYzLCAweDM5LCAweGRmLCAweGUwLCAweDJkLCAweGYzLCAweDBkLAorCTB4NzIsIDB4YmUsIDB4ZTMsIDB4NGIsIDB4ZTYsIDB4ZGIsIDB4YmQsIDB4NjQsIDB4YmUsIDB4ZGQsIDB4NGIsIDB4ZTYsCisJMHg0YiwgMHg5MSwgMHhhYiwgMHhmZiwgMHgyMiwgMHg4NiwgMHhjMiwgMHhhNSwgMHhiMSwgMHg1NSwgMHg3YiwgMHhlMCwKKwkweDk2LCAweGI5LCAweDA3LCAweDM4LCAweGY3LCAweDAxLCAweGIxLCAweDkwLCAweDI5LCAweDhkLCAweDUzLCAweDZkLAorCTB4ZWYsIDB4NWMsIDB4MzIsIDB4ZjcsIDB4NGUsIDB4Y2UsIDB4YmQsIDB4MzgsIDB4OGUsIDB4NGUsIDB4MmQsIDB4MTIsCisJMHg2MiwgMHhhMywgMHgyNSwgMHg4NCwgMHg2YSwgMHg5YiwgMHg3YSwgMHgxNywgMHg5YSwgMHgzMywgMHg1ZCwgMHhjNCwKKwkweDRlLCAweDI1LCAweDEyLCAweGYzLCAweDFlLCAweDk4LCAweDgzLCAweGY1LCAweDVlLCAweDFmLCAweDE2LCAweDZhLAorCTB4MTcsIDB4YjksIDB4NTEsIDB4NWQsIDB4ZmUsIDB4ZmIsIDB4OWEsIDB4MDIsIDB4NmEsIDB4ZmQsIDB4MWIsIDB4YjksCisJMHgxMCwgMHhjNywgMHg4OCwgMHhlOSwgMHhmZCwgMHg4YSwgMHgxMCwgMHhhNywgMHhkNiwgMHgyNCwgMHgwNiwgMHhiYywKKwkweDQ4LCAweGY0LCAweGQ1LCAweGMwLCAweDI0LCAweDg2LCAweDdjLCAweDY1LCAweDJlLCAweDJjLCAweGVkLCAweDczLAorCTB4ZGMsIDB4ZWQsIDB4NTMsIDB4NzQsIDB4ZmIsIDB4MDgsIDB4ZjEsIDB4ZTEsIDB4YmQsIDB4NTcsIDB4YzQsIDB4NWIsCisJMHgyZCwgMHg2MSwgMHhiYywgMHg0ZCwgMHg0ZSwgMHg5ZSwgMHgyYywgMHgyZSwgMHhlYSwgMHg4YSwgMHhkNCwgMHgwZCwKKwkweDc4LCAweDRlLCAweDU5LCAweDdlLCAweGM2LCAweDM0LCAweGI0LCAweGMzLCAweGZmLCAweGFkLCAweGZlLCAweDA0LAorCTB4OGMsIDB4MjksIDB4ZGIsIDB4YmMsIDB4NzgsIDB4M2QsIDB4ODksIDB4MjcsIDB4MmIsIDB4NjEsIDB4ZjQsIDB4ZWUsCisJMHg1MywgMHhiMiwgMHhlOSwgMHgyYSwgMHgxOCwgMHhjZSwgMHg0YSwgMHgyNSwgMHg5YiwgMHhkMiwgMHgyMCwgMHg3OSwKKwkweGEzLCAweDM2LCAweDFlLCAweDM1LCAweDhkLCAweGVjLCAweDY1LCAweGJlLCAweGFjLCAweDRlLCAweGRlLCAweDJlLAorCTB4MDYsIDB4OTUsIDB4NjMsIDB4MDQsIDB4ZjEsIDB4NmMsIDB4ZmUsIDB4N2QsIDB4Y2MsIDB4ZmIsIDB4YTQsIDB4ODYsCisJMHg0OSwgMHhlZCwgMHhlNCwgMHhjMCwgMHgyNywgMHhhNCwgMHg4NiwgMHgwNSwgMHg0OCwgMHg0NCwgMHgxNSwgMHg3YiwKKwkweGYyLCAweDllLCAweGQzLCAweDhkLCAweDEwLCAweGYwLCAweGI3LCAweGY5LCAweDcwLCAweGQxLCAweDFjLCAweGI2LAorCTB4ZWEsIDB4YjEsIDB4MTYsIDB4ZTcsIDB4NWIsIDB4YjksIDB4MDcsIDB4Y2IsIDB4NTQsIDB4NDQsIDB4NjYsIDB4OTYsCisJMHg4ZSwgMHgxNSwgMHhlMSwgMHg1OCwgMHgxMSwgMHg3YywgMHg5MiwgMHgxMywgMHhhMiwgMHhkMiwgMHgzNiwgMHhlMiwKKwkweDBiLCAweDMwLCAweDE5LCAweDQ3LCAweDA0LCAweDU3LCAweDBhLCAweDViLCAweGZjLCAweGE4LCAweDA5LCAweDQzLAorCTB4NmQsIDB4NTYsIDB4YjEsIDB4M2QsIDB4YWYsIDB4MjksIDB4ZGQsIDB4NzksIDB4ZTgsIDB4NWUsIDB4ZGIsIDB4OGMsCisJMHgxZSwgMHhjNiwgMHg1MSwgMHhjNiwgMHhjMywgMHhiYSwgMHg3NiwgMHg0YywgMHg1NSwgMHgzNiwgMHg0ZSwgMHgwNywKKwkweDUwLCAweDNkLCAweGY1LCAweDk5LCAweDc4LCAweDlmLCAweDdhLCAweGY4LCAweGM2LCAweGJkLCAweGFjLCAweDE3LAorCTB4YzksIDB4MDAsIDB4YWEsIDB4ZGMsIDB4YjksIDB4ODUsIDB4ZjgsIDB4YjgsIDB4YWQsIDB4MGUsIDB4MTcsIDB4MzksCisJMHg1ZiwgMHhmNCwgMHgyZiwgMHgwMywgMHhmMCwgMHg0ZSwgMHgwNSwgMHhlMCwgMHg5YiwgMHg1MiwgMHgzMCwgMHhkMywKKwkweDFlLCAweDgwLCAweDY3LCAweDQ2LCAweGZlLCAweDU2LCAweDEwLCAweDMwLCAweGE3LCAweGIxLCAweDVkLCAweDZmLAorCTB4YzAsIDB4NzgsIDB4OWUsIDB4NDUsIDB4ZGEsIDB4ZmMsIDB4MTksIDB4MDYsIDB4ZGMsIDB4ZWYsIDB4MmEsIDB4OWUsCisJMHhjYSwgMHg2YiwgMHgwOCwgMHgxZCwgMHgxMCwgMHhhMiwgMHhkMSwgMHgxNiwgMHgyMiwgMHg5NiwgMHhmNCwgMHg2MCwKKwkweGQ2LCAweDFjLCAweDhlLCAweDA2LCAweGI4LCAweDhlLCAweDYxLCAweDRiLCAweDZhLCAweDhlLCAweDBmLCAweGVhLAorCTB4OGMsIDB4OTEsIDB4MzksIDB4YzcsIDB4YTgsIDB4MzcsIDB4NGYsIDB4YTgsIDB4NGEsIDB4ZWYsIDB4ZjQsIDB4MWUsCisJMHhjMSwgMHg5OCwgMHhmYSwgMHgxZSwgMHhmMCwgMHgwYSwgMHg1MSwgMHhkMywgMHhkNiwgMHgzNCwgMHg3MCwgMHg5ZSwKKwkweGRhLCAweDNjLCAweDEzLCAweDhiLCAweGY1LCAweDBlLCAweDI5LCAweGMwLCAweGZhLCAweDM5LCAweDFmLCAweGZjLAorCTB4NTMsIDB4ZmYsIDB4YzUsIDB4M2EsIDB4MmIsIDB4NDQsIDB4ZTEsIDB4NWUsIDB4ODEsIDB4NzcsIDB4YWQsIDB4NmMsCisJMHhiYywgMHgwMiwgMHg0NiwgMHhlYSwgMHgyNCwgMHhjMiwgMHhiOCwgMHhmNCwgMHhhMiwgMHgxMCwgMHhkYiwgMHhkYiwKKwkweDQzLCAweDc4LCAweGNkLCAweDMyLCAweDc2LCAweDdkLCAweGVjLCAweDE1LCAweGI4LCAweDk4LCAweGNjLCAweDBlLAorCTB4ZDYsIDB4NTMsIDB4YjcsIDB4YWUsIDB4MjksIDB4NTEsIDB4NTQsIDB4ZTUsIDB4OGQsIDB4Y2MsIDB4MTUsIDB4ODUsCisJMHg0YiwgMHg5ZiwgMHgzMSwgMHhmNSwgMHg5ZCwgMHg0YSwgMHgxMCwgMHg1NSwgMHgyNywgMHg4MiwgMHhlOCwgMHg5OCwKKwkweGYzLCAweGEzLCAweDYyLCAweDJhLCAweDA4LCAweGVmLCAweGE0LCAweDc5LCAweGZkLCAweDQxLCAweGI4LCAweGUzLAorCTB4NTgsIDB4MjcsIDB4ZDEsIDB4OGMsIDB4OGIsIDB4MmYsIDB4MWIsIDB4ZjMsIDB4YzcsIDB4ODksIDB4OTMsIDB4ZWQsCisJMHg4OCwgMHhlMiwgMHgzNywgMHgwNSwgMHgxMywgMHgxNywgMHgwYiwgMHg0MSwgMHhhOCwgMHgyNywgMHg3NCwgMHhkNCwKKwkweGJiLCAweGY1LCAweDRlLCAweDQ3LCAweGI1LCAweGU5LCAweDYxLCAweDVlLCAweDFjLCAweGU1LCAweDYxLCAweGI3LAorCTB4OWUsIDB4NzQsIDB4ZjEsIDB4ZDMsIDB4YTMsIDB4NzQsIDB4YjAsIDB4YWUsIDB4NmMsIDB4OTgsIDB4MjYsIDB4OTUsCisJMHhmOSwgMHhlYywgMHg5YywgMHg3NSwgMHg0MywgMHhlYywgMHg4ZiwgMHhhNSwgMHg1OSwgMHg0NywgMHgyYSwgMHhlMCwKKwkweGIzLCAweGQ3LCAweGIxLCAweDhlLCAweGIwLCAweDM4LCAweGI5LCAweGJhLCAweDVmLCAweGExLCAweGY4LCAweGVjLAorCTB4ZWYsIDB4NmEsIDB4N2UsIDB4ODgsIDB4OWEsIDB4NWYsIDB4ZmMsIDB4M2YsIDB4MzUsIDB4NWYsIDB4ODUsIDB4M2EsCisJMHhlNSwgMHhjMSwgMHg5OCwgMHgxOSwgMHhjMCwgMHg2ZiwgMHhhYywgMHhhNiwgMHg3MywgMHg4ZCwgMHgwOCwgMHgyMCwKKwkweGQ1LCAweGE2LCAweDIzLCAweDcyLCAweGMyLCAweGMyLCAweDhiLCAweGRjLCAweDViLCAweGRjLCAweDcxLCAweDZiLAorCTB4M2QsIDB4MDQsIDB4NzYsIDB4OTIsIDB4NTMsIDB4MTUsIDB4ZDQsIDB4ODYsIDB4YmIsIDB4MjcsIDB4ODIsIDB4ZDQsCisJMHgyOSwgMHg1NSwgMHg1OSwgMHg0ZiwgMHg5ZCwgMHhkZiwgMHg5MSwgMHhiYywgMHgyMSwgMHhkMiwgMHgzMSwgMHgyMywKKwkweDFlLCAweDU3LCAweDEyLCAweGE5LCAweGJmLCAweDQzLCAweDQ5LCAweDNiLCAweDYyLCAweGQ0LCAweGQxLCAweDA1LAorCTB4N2QsIDB4OTEsIDB4ODMsIDB4NWQsIDB4MmUsIDB4MDcsIDB4NjcsIDB4NjIsIDB4MjUsIDB4ZWQsIDB4NTgsIDB4NTEsCisJMHgyOCwgMHhmMSwgMHhlZiwgMHgwMSwgMHhlYSwgMHhlNywgMHhmNSwgMHhiNiwgMHg5MiwgMHg3NiwgMHhiZSwgMHg0YSwKKwkweGZmLCAweGQzLCAweGNiLCAweGYxLCAweDFlLCAweDk5LCAweDM2LCAweGIyLCAweGJkLCAweGNjLCAweGNmLCAweDI1LAorCTB4NjIsIDB4NjMsIDB4OTIsIDB4MTksIDB4OWMsIDB4YWYsIDB4YTUsIDB4YTYsIDB4MzYsIDB4MDcsIDB4MTgsIDB4ZTMsCisJMHg3NSwgMHg3MSwgMHg5YSwgMHhkZSwgMHg2MiwgMHg5OCwgMHhmZCwgMHg0NiwgMHhmMywgMHg0NiwgMHg3NCwgMHg5OCwKKwkweDdjLCAweDFmLCAweDJkLCAweDZiLCAweGU5LCAweDMwLCAweGZkLCAweGM0LCAweDI4LCAweGYzLCAweGY0LCAweDM2LAorCTB4OWYsIDB4OWQsIDB4Y2MsIDB4MWIsIDB4ZTksIDB4MmUsIDB4NTcsIDB4NTMsIDB4YTUsIDB4YWYsIDB4OTAsIDB4MzEsCisJMHg0OSwgMHg2ZiwgMHgxMSwgMHhjMSwgMHg1YiwgMHgyZCwgMHg1MiwgMHg1ZiwgMHgxYiwgMHhhOCwgMHhhZiwgMHg4YiwKKwkweGJhLCAweDJhLCAweGYxLCAweDcwLCAweDRkLCAweDg0LCAweDVhLCAweDQyLCAweDVlLCAweGM5LCAweGNiLCAweDRiLAorCTB4NDksIDB4MjEsIDB4YWEsIDB4ZWMsIDB4MjAsIDB4MmEsIDB4MjcsIDB4Y2MsIDB4ZjQsIDB4N2EsIDB4MjUsIDB4MTYsCisJMHgzMSwgMHg5NSwgMHhiYiwgMHhkOCwgMHhjZSwgMHgxYywgMHhjZSwgMHg2ZCwgMHhmMiwgMHhiYSwgMHhkZSwgMHhmNiwKKwkweDg0LCAweDEwLCAweDIxLCAweDViLCAweDQ3LCAweGNkLCAweDg0LCAweDQ5LCAweGRjLCAweGM0LCAweGZhLCAweDhlLAorCTB4YjgsIDB4Y2YsIDB4NzUsIDB4MDQsIDB4ZTcsIDB4MTYsIDB4YzgsIDB4ZTcsIDB4MDgsIDB4ZjksIDB4MWMsIDB4YzYsCisJMHg5YiwgMHhiNywgMHg3MCwgMHg5YSwgMHg1YSwgMHhlYiwgMHhlOSwgMHgyNywgMHhhNywgMHhiMywgMHhlMSwgMHhhMSwKKwkweDJkLCAweGRlLCAweDZmLCAweGYxLCAweDcxLCAweGJmLCAweGU0LCAweDM0LCAweGRiLCAweGJjLCAweDc4LCAweDIxLAorCTB4ODksIDB4Y2QsIDB4YzQsIDB4NDcsIDB4ZTYsIDB4MjksIDB4MjUsIDB4ZWIsIDB4OTAsIDB4ZGIsIDB4YTksIDB4MGEsCisJMHgyNSwgMHg0YiwgMHgxNywgMHhmNSwgMHgwZCwgMHhhNywgMHhjZiwgMHhmMCwgMHg2ZCwgMHgyZiwgMHgzOSwgMHhkZCwKKwkweDE3LCAweGJlLCAweDk1LCAweGQzLCAweDJjLCAweGJlLCAweGNjLCAweGY3LCAweDMzLCAweGY5LCAweDgzLCAweDk4LAorCTB4ZjEsIDB4ZjksIDB4MTEsIDB4OTksIDB4ZjIsIDB4MjEsIDB4MzAsIDB4YTUsIDB4OTIsIDB4NWYsIDB4MGEsIDB4ZmQsCisJMHg0MSwgMHgzNiwgMHgxZSwgMHg4MCwgMHg5MSwgMHgzZSwgMHg4OSwgMHgwOCwgMHgxMiwgMHgxMywgMHgxYSwgMHhmZSwKKwkweGFhLCAweGM1LCAweDg3LCAweDYzLCAweDMxLCAweDIzLCAweGIzLCAweDkzLCAweDNjLCAweDVkLCAweDM5LCAweDM3LAorCTB4YzQsIDB4ODgsIDB4OGMsIDB4NjgsIDB4ZDQsIDB4NTMsIDB4ZTIsIDB4YWIsIDB4YWYsIDB4ZDksIDB4MGYsIDB4NmQsCisJMHhjYSwgMHhlNSwgMHhlMCwgMHgxZSwgMHg4ZiwgMHg5ZCwgMHg4ZCwgMHg2YSwgMHgzMCwgMHg3NiwgMHhmZCwgMHg4NCwKKwkweGI4LCAweGI4LCAweDMwLCAweDIxLCAweDQ0LCAweDY3LCAweGJiLCAweDc5LCAweGVlLCAweDIzLCAweGFmLCAweDQxLAorCTB4MmQsIDB4NTQsIDB4NzEsIDB4N2UsIDB4YWUsIDB4MzQsIDB4N2UsIDB4ZDUsIDB4OTQsIDB4MDYsIDB4ZmYsIDB4MDEsCisJMHg3NywgMHhmYywgMHhlYiwgMHg2ZiwgMHgzMiwgMHg4YSwgMHhjZiwgMHhmMywgMHgxMiwgMHg5ZiwgMHg0MiwgMHgwNCwKKwkweDZjLCAweDMzLCAweDMyLCAweDRiLCAweDNkLCAweGRjLCAweDk3LCAweDM0LCAweGI4LCAweDdmLCAweDRkLCAweDRlLAorCTB4MzMsIDB4YmYsIDB4N2IsIDB4OTIsIDB4YjEsIDB4ZTgsIDB4MTYsIDB4YmUsIDB4NzMsIDB4YTksIDB4NTgsIDB4ZTIsCisJMHg3MCwgMHhiZCwgMHhiOSwgMHgxNSwgMHg3ZiwgMHhhMywgMHg3YiwgMHg1MSwgMHg2MywgMHhmZSwgMHgxMCwgMHhjZiwKKwkweGJhLCAweDFhLCAweDQ1LCAweGVjLCAweDRmLCAweDU2LCAweGEyLCAweDkxLCAweDk4LCAweDdmLCAweDgyLCAweDk4LAorCTB4ZGYsIDB4M2MsIDB4NGIsIDB4YWQsIDB4OTksIDB4NmEsIDB4NjcsIDB4N2UsIDB4MjUsIDB4ZGYsIDB4YmIsIDB4OTQsCisJMHhkZSwgMHhkOSwgMHgxZSwgMHhkNywgMHg1NywgMHgzZCwgMHgzMiwgMHhlZCwgMHhjMSwgMHg5YiwgMHhkNiwgMHg1YSwKKwkweDdhLCAweDk4LCAweGI0LCAweGYyLCAweGM4LCAweGFjLCAweGM0LCAweGZiLCAweDNhLCAweGU1LCAweDQxLCAweDYyLAorCTB4M2YsIDB4N2EsIDB4ODcsIDB4OGEsIDB4MTksIDB4NmIsIDB4YWQsIDB4ZTIsIDB4NzcsIDB4YjEsIDB4ZWYsIDB4ODMsCisJMHg5MywgMHgyOSwgMHhlMSwgMHhkZSwgMHg2YiwgMHhjNywgMHhhYywgMHg1MywgMHg0YiwgMHg3MCwgMHhkZiwgMHg3MywKKwkweDFiLCAweGFmLCAweDIzLCAweGI1LCAweDAzLCAweDI1LCAweDdkLCAweGQ3LCAweGJiLCAweDk4LCAweGFmLCAweGU3LAorCTB4Y2IsIDB4ZjgsIDB4N2UsIDB4OTYsIDB4ZWQsIDB4YmUsIDB4MjksIDB4NjgsIDB4OTUsIDB4YzQsIDB4ZjAsIDB4M2EsCisJMHg2MiwgMHg3YywgMHg5MiwgMHgzOCwgMHg3OSwgMHg3OCwgMHg1YSwgMHhlMCwgMHgwZCwgMHhkNiwgMHg4OSwgMHg0MiwKKwkweGQyLCAweGIwLCAweDc2LCAweDJhLCAweDQ2LCAweGJhLCAweDQ3LCAweDQ5LCAweDY0LCAweDU3LCAweDk2LCAweDZiLAorCTB4ZTQsIDB4ZGQsIDB4YWMsIDB4NzMsIDB4YjgsIDB4NDMsIDB4ZTAsIDB4ZTcsIDB4MTYsIDB4YjQsIDB4MDAsIDB4YjEsCisJMHhmZCwgMHg2ZiwgMHhhYywgMHg1OSwgMHhmZiwgMHg1MSwgMHhhZSwgMHg5MSwgMHhjOSwgMHg0MiwgMHgyNSwgMHg0MiwKKwkweDJkLCAweGQ0LCAweDdjLCAweDYyLCAweGI5LCAweDliLCAweDU4LCAweDNlLCAweDQ0LCAweDNlLCAweDhjLCAweGQwLAorCTB4MTMsIDB4NmMsIDB4MjYsIDB4OTYsIDB4NTcsIDB4YjQsIDB4MTksIDB4ZDksIDB4MmUsIDB4ZmEsIDB4NjksIDB4Y2YsCisJMHhlYSwgMHgwOCwgMHg3MSwgMHgxYSwgMHhhNywgMHg4NywgMHgxZCwgMHg0MSwgMHgwNywgMHhlNywgMHg0YSwgMHg0ZiwKKwkweDFiLCAweDkxLCAweDBlLCAweGUyLCAweDVmLCAweDY1LCAweDlmLCAweGQ3LCAweGQ4LCAweDY3LCAweGExLCAweDRlLAorCTB4N2EsIDB4ZWQsIDB4MDAsIDB4NWUsIDB4NjAsIDB4MWYsIDB4MzMsIDB4ZTksIDB4YjgsIDB4M2EsIDB4MjEsIDB4ZjEsCisJMHgzZiwgMHg4NiwgMHg0NCwgMHg0NiwgMHhlMiwgMHhkZiwgMHg1OSwgMHhkNiwgMHg0YSwgMHhkZiwgMHgyZiwgMHhmMSwKKwkweDRmLCAweDBjLCAweGU2LCAweDg5LCAweGMxLCAweDEyLCAweDA3LCAweDA2LCAweDI0LCAweDA3LCAweDZhLCAweGU4LAorCTB4MmIsIDB4NGUsIDB4ZDAsIDB4NTcsIDB4NTQsIDB4ZDksIDB4NTEsIDB4ZTIsIDB4NWYsIDB4ZjIsIDB4YTEsIDB4ZTQsCisJMHgyZCwgMHhiYSwgMHhjYSwgMHgxYywgMHg1OCwgMHhlZiwgMHhjZSwgMHgyNywgMHgzNSwgMHgyMCwgMHg4OCwgMHhhNiwKKwkweDQ5LCAweDQzLCAweDU3LCAweDk1LCAweGZmLCAweDE0LCAweDRmLCAweDk4LCAweGU2LCAweGZjLCAweDc2LCAweGZhLAorCTB4ODMsIDB4MmYsIDB4ZGIsIDB4NjIsIDB4Y2MsIDB4N2IsIDB4MTAsIDB4ZjcsIDB4OWMsIDB4MDgsIDB4YTksIDB4MTIsCisJMHhlNywgMHhmNSwgMHg5MywgMHg0MSwgMHg4NCwgMHgyNiwgMHgyNSwgMHgwZiwgMHhiMiwgMHhlMywgMHgxMSwgMHg2MiwKKwkweGM0LCAweGYyLCAweGZjLCAweDk2LCAweGY4LCAweDhmLCAweDEyLCAweDE3LCAweGFhLCAweGQyLCAweGNkLCAweDMxLAorCTB4NmEsIDB4YTYsIDB4NzQsIDB4YjQsIDB4NGUsIDB4MWEsIDB4MDMsIDB4MjcsIDB4NzAsIDB4NTUsIDB4YmMsIDB4MTEsCisJMHgzMywgMHgzMywgMHg3YiwgMHg5OSwgMHhmZiwgMHg2ZCwgMHhjOSwgMHgxOCwgMHhmNywgMHg0YSwgMHhjNywgMHhkZCwKKwkweDM3LCAweGM3LCAweDcwLCAweDM5LCAweGUxLCAweDZjLCAweGIxLCAweDgyLCAweDY1LCAweGFmLCAweGFkLCAweDYxLAorCTB4NGIsIDB4MWUsIDB4ZDgsIDB4OTYsIDB4YTcsIDB4ZDksIDB4MzUsIDB4M2QsIDB4YWIsIDB4ZmMsIDB4YjgsIDB4ODYsCisJMHhjMywgMHg0NCwgMHg3ZiwgMHhiZiwgMHhlZSwgMHgzMCwgMHhmZiwgMHgwMSwgMHhlYSwgMHg3ZCwgMHhlOSwgMHg5ZCwKKwkweDkyLCAweDA3LCAweGZmLCAweDc5LCAweGY5LCAweDhjLCAweGY5LCAweDJiLCAweDRmLCAweGU5LCAweGVmLCAweGRiLAorCTB4ZGUsIDB4YzUsIDB4MzMsIDB4ZTcsIDB4MTYsIDB4NjIsIDB4YjAsIDB4OTMsIDB4MTgsIDB4ZWMsIDB4NjEsIDB4OGUsCisJMHhiNiwgMHg1YiwgMHhlNCwgMHgzNiwgMHhmMywgMHg5OSwgMHg1NSwgMHgwMywgMHhmNCwgMHhkNCwgMHg0ZCwgMHg3ZCwKKwkweGQ1LCAweGQ0LCAweGI0LCAweDdkLCAweGQ0LCAweGE3LCAweDc3LCAweGNkLCAweDRhLCAweDdhLCAweDcwLCAweDg3LAorCTB4ZGEsIDB4ZDksIDB4NDEsIDB4ZGQsIDB4ZWMsIDB4NTIsIDB4MWUsIDB4NzIsIDB4YjEsIDB4OTUsIDB4MjYsIDB4OGUsCisJMHgzNCwgMHgyNSwgMHg0ZCwgMHg1ZiwgMHhlYiwgMHg2MywgMHhlZCwgMHgzOCwgMHgxNCwgMHg1ZSwgMHhmNCwgMHhkZiwKKwkweDMyLCAweDRlLCAweGU5LCAweGI5LCAweDhkLCAweGI4LCAweDJjLCAweGJmLCAweGNmLCAweGJhLCAweDNhLCAweGI0LAorCTB4MTYsIDB4YWEsIDB4YmQsIDB4NTYsIDB4NTEsIDB4NmQsIDB4NzksIDB4YzYsIDB4NTAsIDB4ZjEsIDB4MDMsIDB4ZWEsCisJMHhlYywgMHhjMiwgMHgyNiwgMHg3OSwgMHhkNiwgMHhlMCwgMHhiYSwgMHhkOCwgMHgxNiwgMHgzMSwgMHg2MywgMHhkMSwKKwkweDgzLCAweGM0LCAweGQ1LCAweGFiLCAweGRmLCAweDM5LCAweDdiLCAweDk0LCAweGYwLCAweDM2LCAweDljLCAweDU3LAorCTB4NmYsIDB4ZmEsIDB4NjgsIDB4YTksIDB4MGYsIDB4NmIsIDB4NmYsIDB4ZTIsIDB4NGQsIDB4YzMsIDB4MzMsIDB4MmQsCisJMHg1MSwgMHhlMiwgMHg1MSwgMHg2MiwgMHg0ZCwgMHg0MywgMHhlMSwgMHg5NSwgMHg0YSwgMHhiYywgMHhmMSwgMHg0YSwKKwkweDEwLCAweGFmLCAweGJmLCAweDIyLCAweGM0LCAweDY4LCAweDEyLCAweDNjLCAweGUxLCAweDA4LCAweGYxLCAweDUwLAorCTB4NzIsIDB4MGQsIDB4OGUsIDB4ZWIsIDB4YjEsIDB4ZTgsIDB4MGIsIDB4YWUsIDB4OGYsIDB4NzUsIDB4ZTgsIDB4NjMsCisJMHg4ZCwgMHg4MSwgMHhiMywgMHhiOCwgMHgyMSwgMHgwYSwgMHgyZSwgMHhhNywgMHgxMywgMHhlNCwgMHg1YiwgMHgwOSwKKwkweDhiLCAweGFlLCAweGRmLCAweGFkLCAweGQ1LCAweDcwLCAweDgxLCAweGY4LCAweDBiLCAweDExLCAweDdmLCAweGJmLAorCTB4YTMsIDB4ZTYsIDB4NWUsIDB4MmQsIDB4NmIsIDB4ZWUsIDB4YWEsIDB4MDIsIDB4ZjksIDB4ZDgsIDB4MTYsIDB4NDAsCisJMHg4ZiwgMHg1YywgMHgwYiwgMHg3MSwgMHgzOCwgMHg3YywgMHgxMywgMHg4NywgMHhhYywgMHhiZCwgMHhkYywgMHhmMywKKwkweGIzLCAweDk2LCAweDExLCAweGVmLCAweDI0LCAweDFlLCAweDY3LCAweDJjLCAweGMzLCAweGU5LCAweGEwLCAweDlmLAorCTB4MWQsIDB4NzYsIDB4MzEsIDB4NDksIDB4ZWQsIDB4OGQsIDB4NDksIDB4NWMsIDB4MTIsIDB4ODcsIDB4Y2MsIDB4YzksCisJMHgzZSwgMHhmNiwgMHgzOSwgMHhjZCwgMHgzZSwgMHg2MywgMHg2NSwgMHgzZiwgMHhmYiwgMHgxZSwgMHgxMiwgMHg2OSwKKwkweGU5LCAweDY3LCAweGEzLCAweGM0LCAweGUwLCAweDNlLCAweGQ3LCAweGNmLCAweDRhLCAweGZmLCAweDJhLCAweGJkLAorCTB4YWIsIDB4OGMsIDB4YjMsIDB4ZGQsIDB4OGQsIDB4YjMsIDB4ZmIsIDB4MjYsIDB4MGUsIDB4YTksIDB4NjEsIDB4YjUsCisJMHgxMiwgMHg3ZiwgMHgwZiwgMHg2MCwgMHhlYywgMHhhNSwgMHgxYSwgMHg4NCwgMHhjYywgMHgzYiwgMHg3MSwgMHgzZSwKKwkweGYzLCAweDgwLCAweDFhLCAweDMxLCAweGExLCAweGQ3LCAweGRiLCAweDI1LCAweDNjLCAweDZlLCAweDJlLCAweGE2LAorCTB4OTAsIDB4Y2YsIDB4YmYsIDB4MjMsIDB4ZjIsIDB4NjEsIDB4YzMsIDB4MzksIDB4ZWIsIDB4N2EsIDB4ZDIsIDB4MDEsCisJMHg3YSwgMHhjNCwgMHgxYiwgMHhjMiwgMHgxMywgMHgzMywgMHhjZSwgMHg2ZCwgMHhhMSwgMHgyZiwgMHg2YiwgMHhmMiwKKwkweDk2LCAweGZjLCAweGRkLCAweDlhLCAweGMyLCAweGZiLCAweDAyLCAweDc1LCAweGE1LCAweDc1LCAweGFhLCAweGY0LAorCTB4NzQsIDB4MjMsIDB4ZTQsIDB4ZGMsIDB4YTgsIDB4NTksIDB4ZjIsIDB4NzcsIDB4YjEsIDB4YzIsIDB4YTcsIDB4YWEsCisJMHhkNCwgMHg3MywgMHg0ZiwgMHg5YiwgMHgxYywgMHgzNywgMHg0ZCwgMHgwZCwgMHg1OSwgMHgxYywgMHhmYiwgMHgxYiwKKwkweDVkLCAweDFlLCAweDIxLCAweDA2LCAweDg3LCAweGE1LCAweGQ3LCAweGEyLCAweDJmLCAweGUxLCAweDU5LCAweDdkLAorCTB4ODksIDB4YTYsIDB4ZWUsIDB4ZjYsIDB4YzIsIDB4OTQsIDB4NmQsIDB4OGUsIDB4ZjIsIDB4MTAsIDB4ZDcsIDB4YTAsCisJMHg5OSwgMHg4MywgMHg0YSwgMHg5YSwgMHhiNSwgMHg3OSwgMHgyZiwgMHhmMSwgMHhkNSwgMHhjMywgMHgxYSwgMHg3YywKKwkweGQ5LCAweDZhLCAweDI2LCAweDg3LCAweDA1LCAweGViLCAweGQwLCAweDBkLCAweGIxLCAweGNmLCAweDVjLCAweDNjLAorCTB4ZDMsIDB4YzksIDB4ZjMsIDB4NWMsIDB4OWMsIDB4NzEsIDB4NTcsIDB4YjMsIDB4NzYsIDB4YWYsIDB4NjMsIDB4YmQsCisJMHhlNiwgMHg2OSwgMHg5MSwgMHgzOSwgMHhmZCwgMHgzMiwgMHgyNiwgMHgxYSwgMHg1NywgMHhiNSwgMHgxOSwgMHgwMywKKwkweDFiLCAweGJkLCAweDAxLCAweGU0LCAweDg4LCAweGY3LCAweDU3LCAweDU5LCAweDgzLCAweGYyLCAweGRjLCAweGQzLAorCTB4YzksIDB4YTIsIDB4OTEsIDB4Y2EsIDB4NjIsIDB4MDQsIDB4MWIsIDB4YjksIDB4YTcsIDB4M2MsIDB4MDMsIDB4MzksCisJMHhmZiwgMHgxOCwgMHgyYiwgMHg5ZCwgMHg5MSwgMHhiNywgMHhiMywgMHhiNiwgMHg4ZCwgMHg5NywgMHhiOSwgMHg3ZCwKKwkweDA1LCAweDA5LCAweDRiLCAweDcyLCAweDdiLCAweDllLCAweGI1LCAweDZkLCAweGRjLCAweGU1LCAweGI2LCAweDkxLAorCTB4OTIsIDB4N2MsIDB4YWUsIDB4MjgsIDB4ZDcsIDB4YjQsIDB4NGYsIDB4MjAsIDB4MzksIDB4N2MsIDB4NmIsIDB4M2QsCisJMHg5MywgMHg3OCwgMHg1ZSwgMHhlYiwgMHg5MywgMHhkZSwgMHgzNiwgMHg5ZiwgMHg5NywgMHgzNSwgMHg0OSwgMHhkNiwKKwkweGEyLCAweGM1LCAweGJhLCAweGE0LCAweGM5LCAweGZiLCAweDg0LCAweDRjLCAweGUzLCAweGM0LCAweDFlLCAweGUxLAorCTB4MjksIDB4ZGQsIDB4NDksIDB4OWMsIDB4ZmIsIDB4ZDAsIDB4MWIsIDB4NGMsIDB4YTUsIDB4ZWUsIDB4NDMsIDB4MjYsCisJMHgzMiwgMHhhNywgMHg2MSwgMHg1MywgMHhiZSwgMHhhMSwgMHgyZiwgMHg2MCwgMHg4MywgMHhlZiwgMHgyOCwgMHhiMCwKKwkweGZlLCAweDQ0LCAweDQzLCAweGU2LCAweDk2LCAweDNiLCAweDg5LCAweDhmLCAweDczLCAweDlhLCAweDE2LCAweDlhLAorCTB4NTgsIDB4MmUsIDB4ZGYsIDB4YzEsIDB4NjcsIDB4YjksIDB4ZGIsIDB4ZGUsIDB4NDksIDB4YTQsIDB4N2YsIDB4ZGYsCisJMHg5ZCwgMHhjNCwgMHgwYiwgMHhlNCwgMHhjNywgMHg1OCwgMHhlOSwgMHg0ZSwgMHhjMiwgMHhmOSwgMHg1ZSwgMHg4YiwKKwkweDE3LCAweDMzLCAweDYxLCAweGVjLCAweGZlLCAweGE4LCAweDVkLCAweGM1LCAweGU1LCAweDljLCAweDExLCAweDM5LAorCTB4OGUsIDB4ZGQsIDB4ZTgsIDB4NzcsIDB4ZWYsIDB4MWYsIDB4OTAsIDB4ZjUsIDB4ZGIsIDB4YmIsIDB4ZjAsIDB4NGYsCisJMHhlZCwgMHhmMiwgMHhmZSwgMHgyMSwgMHgyNSwgMHhkNywgMHgzOCwgMHhjZSwgMHhlNSwgMHg0MywgMHhhMywgMHhkZSwKKwkweGFjLCAweDY3LCAweDJkLCAweGQ4LCAweGIxLCAweDQ2LCAweGMxLCAweDQzLCAweGM5LCAweDNiLCAweDVkLCAweDZjLAorCTB4OGYsIDB4MTcsIDB4OGQsIDB4NzQsIDB4OTQsIDB4Y2YsIDB4ZWUsIDB4OTksIDB4OTAsIDB4MzUsIDB4ZjIsIDB4NzEsCisJMHg5ZSwgMHgxNywgMHhhMSwgMHgzNSwgMHhkYSwgMHhiZCwgMHhhYSwgMHhjOCwgMHgzNywgMHg0NSwgMHhhZSwgMHgyOCwKKwkweDg2LCAweDczLCAweDE4LCAweGYyLCAweDhlLCAweDIwLCAweDcxLCAweGNlLCAweGFiLCAweDE4LCAweGYzLCAweDFmLAorCTB4N2EsIDB4OGQsIDB4NTQsIDB4YmQsIDB4OGIsIDB4OTksIDB4YzcsIDB4NzksIDB4NzYsIDB4OTMsIDB4N2YsIDB4N2IsCisJMHhlNSwgMHhiOSwgMHgwZiwgMHgxYiwgMHgzOSwgMHhlNiwgMHgwNywgMHg2YiwgMHhlNCwgMHg1OSwgMHhmNCwgMHg3MywKKwkweDkxLCAweDVkLCAweDY2LCAweDM4LCAweDBiLCAweDhhLCAweGM2LCAweGRjLCAweDgwLCAweGZhLCAweDI0LCAweDM1LAorCTB4ZmMsIDB4NzEsIDB4NmEsIDB4YjgsIDB4ZjQsIDB4MmMsIDB4YmQsIDB4ZjQsIDB4MmMsIDB4NGQsIDB4ZjMsIDB4NzEsCisJMHhhZiwgMHg5MSwgMHhiOSwgMHg0ZSwgMHhiZCwgMHhlMywgMHg5OCwgMHg3ZCwgMHhiZCwgMHg4YSwgMHhkMSwgMHg3YiwKKwkweDgyLCAweGZhLCAweGJmLCAweDUzLCAweDI5LCAweDhkLCAweGI5LCAweGIyLCAweDNjLCAweGU2LCAweGRkLCAweDA1LAorCTB4NGQsIDB4ZTksIDB4Y2MsIDB4ODMsIDB4YmEsIDB4ODMsIDB4ZTgsIDB4MzYsIDB4OGIsIDB4ZGEsIDB4NTEsIDB4YWMsCisJMHgyNCwgMHhjNywgMHg0YywgMHhiOSwgMHg2NiwgMHhjNiwgMHhkNiwgMHhjYSwgMHhkOCwgMHgxNCwgMHg1YywgMHg2OSwKKwkweDkxLCAweGVmLCAweGI2LCAweGNhLCAweDM4LCAweDljLCAweDJhLCAweDNiLCAweDQ1LCAweGVkLCAweDdkLCAweGM1LAorCTB4NTcsIDB4ZDYsIDB4MmYsIDB4Y2YsIDB4MTYsIDB4NmIsIDB4MTksIDB4OWMsIDB4MzAsIDB4NDIsIDB4M2UsIDB4YjMsCisJMHgwZSwgMHhhMywgMHhiNCwgMHg4MSwgMHg0MSwgMHhiMywgMHgxOSwgMHgzOSwgMHhkZCwgMHg4ZiwgMHgyZCwgMHhkNiwKKwkweDE3LCAweDgyLCAweDNhLCAweGM5LCAweGY3LCAweDgxLCAweGE3LCAweDVlLCAweGUyLCAweDE5LCAweGRlLCAweGJjLAorCTB4ODYsIDB4NTgsIDB4ZjIsIDB4MzksIDB4MWMsIDB4ZDMsIDB4NzcsIDB4ZDEsIDB4MGYsIDB4NmUsIDB4YzUsIDB4ZWIsCisJMHhhZSwgMHg5ZSwgMHhkOCwgMHhjNCwgMHhiMywgMHg0MiwgMHgwYywgMHhkOSwgMHhiMiwgMHhkNiwgMHhkZCwgMHgzMiwKKwkweGI2LCAweGJjLCAweDkzLCAweGI4LCAweDI0LCAweGIyLCAweGE1LCAweDMxLCAweDljLCAweDZkLCAweDU2LCAweDg2LAorCTB4NzEsIDB4N2QsIDB4YTMsIDB4YmIsIDB4M2IsIDB4YTgsIDB4YmIsIDB4MTUsIDB4YTYsIDB4ZTcsIDB4YWUsIDB4NGEsCisJMHhlYSwgMHhlZSwgMHg1NiwgMHhlYiwgMHhjZiwgMHhmMSwgMHgxNCwgMHgzOSwgMHg1ZSwgMHg2NSwgMHg3ZSwgMHgyNiwKKwkweDllLCAweDBlLCAweGNiLCAweDMxLCAweGE5LCAweGFmLCAweDM1LCAweDRiLCAweGM3LCAweGZmLCAweDkwLCAweDYzLAorCTB4Y2EsIDB4MzksIDB4NjQsIDB4M2QsIDB4M2MsIDB4MmYsIDB4MGUsIDB4ZDUsIDB4Y2EsIDB4MzEsIDB4MDcsIDB4OTUsCisJMHg4ZCwgMHhlNCwgMHhkNCwgMHgzYywgMHg0YiwgMHhlZiwgMHgwZiwgMHhjOCwgMHhhNywgMHgwNSwgMHhlNiwgMHhhNywKKwkweGYxLCAweDM2LCAweDdjLCAweDZhLCAweDI0LCAweDlmLCAweDllLCAweDU4LCAweGMyLCAweGE3LCAweDgzLCAweDc5LAorCTB4ZTksIDB4YmQsIDB4MTQsIDB4YjQsIDB4YjQsIDB4ZmQsIDB4MjksIDB4NzUsIDB4NDUsIDB4MDgsIDB4N2YsIDB4ZGIsCisJMHgwZCwgMHg3MSwgMHhjNiwgMHhmNSwgMHhiZSwgMHhkMiwgMHhlZiwgMHhhNiwgMHg5NSwgMHhlZSwgMHg1OSwgMHhhOSwKKwkweDRmLCAweGQ1LCAweDA4LCAweDkyLCAweDRmLCAweDFiLCAweGM4LCAweGE3LCAweDdlLCAweGYyLCAweGU5LCAweDY5LAorCTB4NTMsIDB4MzQsIDB4ZWUsIDB4NDgsIDB4MWEsIDB4YTksIDB4NzksIDB4ZmEsIDB4OWEsIDB4NzUsIDB4ZTQsIDB4ZDQsCisJMHgzYiwgMHhlNCwgMHhkNCwgMHg0OCwgMHhiMSwgMHhhNCwgMHg1MywgMHhmYiwgMHhiOCwgMHhlZSwgMHhmYiwgMHhhOSwKKwkweDUzLCAweGViLCAweDhhLCAweDUyLCAweGRiLCAweDFjLCAweGUyLCAweDNmLCAweDgwLCAweGNmLCAweGM5LCAweGE5LAorCTB4ZDksIDB4YTQsIDB4YWIsIDB4NTMsIDB4ZDYsIDB4ZWYsIDB4OTAsIDB4ZDgsIDB4NzUsIDB4NWEsIDB4ZjIsIDB4ODksCisJMHgzYSwgMHg5NSwgMHgyZiwgMHgzNiwgMHg1OSwgMHhhNywgMHhiOSwgMHhhNiwgMHhmMSwgMHhiYywgMHg3MSwgMHhiZCwKKwkweDg3LCAweDljLCAweGYyLCAweGI1LCAweDFiLCAweGU3LCAweDJlLCAweDEzLCAweGJiLCAweDgxLCAweDE4LCAweGY0LAorCTB4ODgsIDB4MmQsIDB4ZDcsIDB4YzQsIDB4MWEsIDB4Y2IsIDB4M2EsIDB4NzksIDB4OTAsIDB4ZjgsIDB4ZWYsIDB4YTEsCisJMHg2NiwgMHhmNCwgMHgxNiwgMHg2ZCwgMHhlYywgMHgyZCwgMHgyZSwgMHhkZCwgMHg1MywgMHhkNiwgMHhhMSwgMHhkYiwKKwkweGVlLCAweGNiLCAweGI4LCAweGZmLCAweGY2LCAweGVkLCAweGFjLCAweDU3LCAweGI3LCAweDZkLCAweDk3LCAweDdjLAorCTB4NWQsIDB4ZTYsIDB4OTcsIDB4N2MsIDB4MWQsIDB4Y2UsIDB4YmYsIDB4YTYsIDB4ZGUsIDB4ZmUsIDB4MWQsIDB4NzksCisJMHhhNywgMHgyNiwgMHhjNCwgMHg1MSwgMHg0YiwgMHhkZSwgMHg0OSwgMHg0OCwgMHhkZiwgMHhhMywgMHg2MCwgMHhjOCwKKwkweDkyLCAweGY3LCAweDZhLCAweDFkLCAweDUxLCAweDE1LCAweDQ2LCAweGU0LCAweGZiLCAweGY4LCAweDRhLCAweDY0LAorCTB4YzMsIDB4NGUsIDB4ZGMsIDB4ZTcsIDB4ZDYsIDB4NDgsIDB4NDMsIDB4ZWYsIDB4NjMsIDB4YWQsIDB4OWIsIDB4MmYsCisJMHg5ZiwgMHhmZCwgMHg2NiwgMHg3OCwgMHgzZSwgMHg3YiwgMHg4NywgMHg3NSwgMHhlYSwgMHgyOCwgMHhjZiwgMHg3OSwKKwkweDQzLCAweDg1LCAweGFmLCAweGM0LCAweDdjLCAweDU4LCAweGM1LCAweDg4LCAweDc5LCAweGYzLCAweDhlLCAweGQyLAorCTB4ZDUsIDB4YjEsIDB4YzMsIDB4N2MsIDB4MzYsIDB4NTYsIDB4NTgsIDB4YWMsIDB4NTEsIDB4ZDQsIDB4NGMsIDB4NTMsCisJMHg4OCwgMHhhZCwgMHhlNiwgMHg3ZiwgMHg4YiwgMHgyZCwgMHhkZiwgMHg3YSwgMHg1NywgMHg4OCwgMHg0OSwgMHhjNiwKKwkweDcwLCAweGMxLCAweGMyLCAweDZlLCAweDFmLCAweDYyLCAweDdkLCAweGQ3LCAweDU5LCAweGQ3LCAweDNmLCAweDU4LAorCTB4NjMsIDB4NjQsIDB4MGEsIDB4NGEsIDB4YTIsIDB4NzcsIDB4ODMsIDB4MjIsIDB4YmQsIDB4OWUsIDB4YTcsIDB4YWIsCisJMHg4MiwgMHhlZiwgMHhiNCwgMHhkMCwgMHgxYiwgMHg1ZCwgMHg2MSwgMHgwNiwgMHhmZCwgMHhmYywgMHg3ZSwgMHhjNiwKKwkweDMyLCAweDIyLCAweDQ3LCAweGY4LCAweDc3LCAweDRiLCAweDRhLCAweDhlLCAweDIxLCAweDQ0LCAweDg3LCAweDI1LAorCTB4ZWYsIDB4YmIsIDB4NDYsIDB4ZDQsIDB4ZGMsIDB4NDQsIDB4NTYsIDB4NTQsIDB4OTksIDB4MTcsIDB4YTgsIDB4NGQsCisJMHg0NiwgMHg2NiwgMHg0NCwgMHg5MSwgMHgzZSwgMHgzYiwgMHgwYSwgMHg1NywgMHg2NywgMHhmOSwgMHg0YywgMHg5YiwKKwkweDg4LCAweGUwLCAweGVmLCAweDVkLCAweGZmLCAweDFjLCAweGE1LCAweDY2LCAweDM1LCAweGUwLCAweDFmLCAweDVjLAorCTB4ZGQsIDB4NTIsIDB4YjEsIDB4ZWQsIDB4MjUsIDB4MjMsIDB4YTUsIDB4MmEsIDB4N2IsIDB4NzAsIDB4YzksIDB4MzIsCisJMHhmNCwgMHg5ZiwgMHgzMiwgMHg2ZSwgMHg2YSwgMHhjZCwgMHg4YiwgMHg5ZCwgMHgzYywgMHgzZiwgMHg3MSwgMHg4ZSwKKwkweDZjLCAweDlmLCAweGI3LCAweDU2LCAweGQxLCAweDU4LCAweDNiLCAweDdlLCAweGRjLCAweDIyLCAweDZiLCAweGY3LAorCTB4MmUsIDB4ZjQsIDB4MzQsIDB4ZWYsIDB4ZTQsIDB4NDcsIDB4NDUsIDB4ZGQsIDB4OTQsIDB4YWEsIDB4NmMsIDB4YTIsCisJMHgyNywgMHgwOSwgMHg0ZCwgMHg4NSwgMHhiMCwgMHg3ZCwgMHhiNSwgMHgxMCwgMHhhYiwgMHg1NiwgMHgzYiwgMHhmOCwKKwkweDNjLCAweGQ5LCAweDE0LCAweDNmLCAweGNiLCAweDFhLCAweDc0LCAweGE4LCAweGQ2LCAweDQ4LCAweDAzLCAweGJmLAorCTB4YzAsIDB4NjYsIDB4N2EsIDB4ZDksIDB4NTQsIDB4NWIsIDB4MGUsIDB4YjgsIDB4NTMsIDB4YWUsIDB4ZjEsIDB4MTcsCisJMHhlOCwgMHg5NCwgMHgxZSwgMHhkOCwgMHgwYSwgMHg0OSwgMHhiZiwgMHhlNSwgMHhlMiwgMHhiNywgMHg3NCwgMHhhZiwKKwkweGM0LCAweGQ0LCAweDFkLCAweGM4LCAweDhhLCAweDRhLCAweGQzLCAweGU4LCAweDliLCAweDY1LCAweGJkLCAweGZkLAorCTB4MjAsIDB4YjYsIDB4NWMsIDB4N2YsIDB4NzgsIDB4NTYsIDB4N2EsIDB4NjAsIDB4MzMsIDB4YmEsIDB4NWUsIDB4MTEsCisJMHhjYywgMHhjNSwgMHhmMywgMHhjYywgMHg0NSwgMHhjYywgMHgwOSwgMHhkMiwgMHgzMiwgMHhmMCwgMHhhYywgMHhlNSwKKwkweDg0LCAweDk0LCAweDQxLCAweGU1LCAweDUxLCAweGYyLCAweGExLCAweGNmLCAweDVmLCAweDQ5LCAweDBmLCAweGUxLAorCTB4ZDAsIDB4M2YsIDB4NzgsIDB4NTAsIDB4N2QsIDB4NDAsIDB4N2EsIDB4OGEsIDB4MDAsIDB4YjUsIDB4YTYsIDB4YTksCisJMHgzNywgMHhjOCwgMHhmYywgMHhlYywgMHg0OCwgMHg0YSwgMHhmZiwgMHg0MSwgMHhhYywgMHgxZiwgMHhiOCwgMHgyMSwKKwkweDNhLCAweGU5LCAweDcxLCAweDNiLCAweGNiLCAweDFlLCAweGY3LCAweDg5LCAweGU5LCAweDM0LCAweDNkLCAweGIwLAorCTB4YTYsIDB4YzgsIDB4M2IsIDB4YjYsIDB4NTQsIDB4MWIsIDB4MGYsIDB4YTQsIDB4OGYsIDB4NGEsIDB4MWYsIDB4MjIsCisJMHhkNywgMHhhMCwgMHhlMywgMHg2YSwgMHg1MiwgMHg2MiwgMHg1NywgMHhjNywgMHg3MCwgMHhiYiwgMHgxMSwgMHhjOSwKKwkweDQyLCAweGRlLCAweGU5LCAweGRjLCAweGVhLCAweDJmLCAweGEwLCAweGE3LCAweGJmLCAweGUzLCAweDM5LCAweGEwLAorCTB4NmYsIDB4NjIsIDB4MmMsIDB4ODYsIDB4NWYsIDB4ODgsIDB4YmEsIDB4YTQsIDB4MTcsIDB4N2QsIDB4ZWUsIDB4NTksCisJMHgyZSwgMHhhMiwgMHhhNywgMHhjOSwgMHhmYiwgMHg3MywgMHhmNCwgMHgwOSwgMHg1ZSwgMHg5ZSwgMHg5OSwgMHhmNywKKwkweDEwLCAweDRiLCAweDVmLCAweGI2LCAweDBjLCAweGJkLCAweDVhLCAweDhmLCAweGVjLCAweDc4LCAweDFkLCAweGNmLAorCTB4YTgsIDB4ZjcsIDB4NTMsIDB4NTcsIDB4MmYsIDB4ZTQsIDB4MWUsIDB4NjUsIDB4M2QsIDB4ZjcsIDB4YjQsIDB4NDcsCisJMHg3OCwgMHgwNiwgMHg2OCwgMHg5YywgMHhjYSwgMHg4YSwgMHg3YSwgMHhmYSwgMHg0MSwgMHg5ZSwgMHg5NywgMHg1MSwKKwkweGRiLCAweDE2LCAweGE3LCAweGRmLCAweDVlLCAweGRjLCAweDJiLCAweDBmLCAweDdlLCAweDY4LCAweDk5LCAweDcwLAorCTB4ZGMsIDB4ZGYsIDB4NDEsIDB4YmQsIDB4N2IsIDB4OWEsIDB4ZTcsIDB4NjgsIDB4NzMsIDB4YjksIDB4ZGUsIDB4NTEsCisJMHg4YSwgMHg0YiwgMHhhZCwgMHhiMCwgMHgyZCwgMHhiNCwgMHhkYywgMHgwYiwgMHhmZCwgMHhjMSwgMHhkYiwgMHhjNCwKKwkweGI0LCAweDRlLCAweDdhLCAweDFmLCAweDVmLCAweGE5LCAweGRmLCAweDlmLCAweDRkLCAweDM3LCAweGU4LCAweDhmLAorCTB4YjAsIDB4ZGUsIDB4Y2QsIDB4MTMsIDB4MmIsIDB4NGYsIDB4YWMsIDB4YjYsIDB4NjQsIDB4MmMsIDB4ZjMsIDB4MzIsCisJMHgxNiwgMHhmYSwgMHg0YiwgMHhlNywgMHg3ZSwgMHgwZiwgMHg3ZCwgMHg0OSwgMHgxMiwgMHgwOCwgMHhjZCwgMHhmZCwKKwkweDM1LCAweDc5LCAweGU1LCAweDY5LCAweDBkLCAweDIxLCAweGJiLCAweDhiLCAweDMxLCAweGJlLCAweGZhLCAweGFmLAorCTB4ZGMsIDB4OWEsIDB4ZmUsIDB4NDksIDB4ZjQsIDB4N2IsIDB4ZDgsIDB4NjcsIDB4YzIsIDB4MDIsIDB4OWUsIDB4MzksCisJMHgwMSwgMHgzYywgMHgzZCwgMHgxOSwgMHhhMywgMHgyZiwgMHhhNywgMHg4ZiwgMHgzYywgMHhhMSwgMHhlMSwgMHhmYiwKKwkweGQzLCAweDk1LCAweGY4LCAweGQxLCAweDc0LCAweDEwLCAweDNiLCAweGE2LCAweGRkLCAweGJiLCAweGFlLCAweDBkLAorCTB4NzUsIDB4N2MsIDB4YWYsIDB4ODMsIDB4NjcsIDB4YmIsIDB4NTksIDB4NmIsIDB4MzUsIDB4M2UsIDB4YTIsIDB4ODcsCisJMHg1YSwgMHhhMSwgMHg3OCwgMHgxMCwgMHgzOSwgMHgwMCwgMHg1ZCwgMHgyNywgMHg2ZSwgMHg2YSwgMHg1YiwgMHg3ZSwKKwkweDQ0LCAweDJlLCAweDBiLCAweDYxLCAweGFlLCAweDk2LCAweDNhLCAweGY5LCAweGJjLCAweGZiLCAweDdkLCAweDg0LAorCTB4ZmUsIDB4MzEsIDB4MjMsIDB4MzEsIDB4OTgsIDB4MjcsIDB4MDYsIDB4ZjMsIDB4YzQsIDB4ZTQsIDB4NGQsIDB4NGYsCisJMHgyZCwgMHhiMSwgMHgxYywgMHhhNywgMHg4ZiwgMHg3ZSwgMHg0ZSwgMHg5NCwgMHhiMCwgMHhmMSwgMHhiNSwgMHgzOCwKKwkweDZhLCAweDllLCAweDI0LCAweDdmLCAweDU1LCAweDZhLCAweDI4LCAweGYwLCAweGNmLCAweGI5LCAweDg4LCAweGJlLAorCTB4YTksIDB4MjgsIDB4ZjMsIDB4ZmYsIDB4YjcsIDB4ZTUsIDB4ZmMsIDB4OWYsIDB4ZjEsIDB4OTcsIDB4ZjQsIDB4YzIsCisJMHg3MCwgMHg2NiwgMHhkMSwgMHg4MCwgMHhjOSwgMHg3YywgMHg4MywgMHhiZSwgMHgyMSwgMHgzZiwgMHgzNCwgMHhhOCwKKwkweDIxLCAweDFiLCAweDBkLCAweGMxLCAweDE4LCAweDk4LCAweDg0LCAweGE3LCAweDM1LCAweDA4LCAweGI5LCAweDc2LAorCTB4YTAsIDB4ZTAsIDB4YWUsIDB4NTEsIDB4ODgsIDB4MzEsIDB4ZWEsIDB4OWIsIDB4Y2MsIDB4YzEsIDB4YmYsIDB4ZTcsCisJMHhkMCwgMHhlYSwgMHg2MSwgMHgzZSwgMHgxYywgMHhjOCwgMHhiMywgMHgzNSwgMHhmMCwgMHg2OSwgMHg0MSwgMHhkZSwKKwkweDdkLCAweGM2LCAweGQyLCAweGRkLCAweGY4LCAweGMyLCAweDFkLCAweGYzLCAweDkzLCAweDQyLCAweDBhLCAweGZiLAorCTB4ZjMsIDB4MWYsIDB4ODgsIDB4ZmQsIDB4ZTEsIDB4OTIsIDB4YzYsIDB4YTcsIDB4NzksIDB4M2UsIDB4MGEsIDB4MWQsCisJMHgyOCwgMHg3YiwgMHgyMSwgMHg3MiwgMHhiOCwgMHg5YSwgMHhlYiwgMHhiZCwgMHg5YSwgMHg3NCwgMHhiZCwgMHgzZiwKKwkweDZiLCAweGU0LCAweDgwLCAweDdhLCAweGQ0LCAweDY0LCAweGIxLCAweGFiLCAweGI5LCAweDIxLCAweGM2LCAweDYyLAorCTB4ODksIDB4NDAsIDB4MjksIDB4YTYsIDB4ODQsIDB4N2UsIDB4MDQsIDB4MTUsIDB4YzQsIDB4YWUsIDB4M2MsIDB4MjMsCisJMHg0OSwgMHhmZCwgMHg5MCwgMHhiZiwgMHg3OSwgMHgzZSwgMHg1MSwgMHg5ZCwgMHg4OCwgMHg5NywgMHhlYiwgMHg3MiwKKwkweDFlLCAweDkzLCAweDZkLCAweDgxLCAweGIyLCAweDVmLCAweDVkLCAweGY0LCAweDIyLCAweDFkLCAweDdjLCAweDI2LAorCTB4YmQsIDB4YzgsIDB4NTcsIDB4YTIsIDB4MmYsIDB4ZGMsIDB4NzEsIDB4NTMsIDB4NzMsIDB4YjIsIDB4N2MsIDB4NjMsCisJMHgzNCwgMHgyZiwgMHhlZiwgMHhiNCwgMHg1YSwgMHhlOCwgMHg4OCwgMHgxNSwgMHg5YywgMHg2MiwgMHhlNCwgMHg0NywKKwkweDVhLCAweDYzLCAweGZhLCAweDMwLCAweGM3LCAweDczLCAweDc0LCAweDlkLCAweDVjLCAweGRlLCAweDQzLCAweGJmLAorCTB4Y2MsIDB4NzcsIDB4OGEsIDB4MmQsIDB4ZWMsIDB4MjMsIDB4YjUsIDB4ZWMsIDB4MmYsIDB4YjgsIDB4ZDYsIDB4MmYsCisJMHg5YSwgMHgyNSwgMHhiNiwgMHg4NywgMHhmMywgMHg2ZiwgMHg3OSwgMHg1NCwgMHg1MywgMHhhZSwgMHgzMywgMHg5MSwKKwkweDFhLCAweDY2LCAweDNjLCAweDBiLCAweGJhLCAweGY0LCAweGQ2LCAweDBlLCAweGI1LCAweDJkLCAweGUxLCAweGY2LAorCTB4Y2YsIDB4YWEsIDB4MzIsIDB4MGUsIDB4MzcsIDB4MWUsIDB4YjYsIDB4NDksIDB4Y2QsIDB4MzIsIDB4MzIsIDB4YTcsCisJMHg5MCwgMHg3MCwgMHhmYSwgMHhhNSwgMHgzOSwgMHg1OCwgMHgyNiwgMHg2MywgMHg2OCwgMHg4YSwgMHhmNCwgMHgzMywKKwkweDllLCAweDQzLCAweDYxLCAweDU3LCAweDBmLCAweGY5LCAweDhjLCAweGYzLCAweGU1LCAweDNkLCAweDFiLCAweDJhLAorCTB4MjEsIDB4YjAsIDB4MjIsIDB4ZTksIDB4OWUsIDB4ZjksIDB4Y2IsIDB4ZmYsIDB4NWYsIDB4NDMsIDB4YTUsIDB4MGYsCisJMHg5MSwgMHg1OCwgMHhmYywgMHg1ZiwgMHg2OSwgMHhkNywgMHg4YSwgMHhjMCwgMHhhOCwgMHgxYSwgMHgwMCwgMHgwMCwKKwkweDAwIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndSb2RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKIAogc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHBhdF9md18wNiA9IHsKLQkvKiBGaXJtd2FyZSB2ZXJzaW9uOiA0LjAuNSAqLworCS8qIEZpcm13YXJlIHZlcnNpb246IDQuNC4yMiAqLwogCS52ZXJfbWFqb3IJCQk9IDB4NCwKLQkudmVyX21pbm9yCQkJPSAweDAsCi0JLnZlcl9maXgJCQk9IDB4NSwKKwkudmVyX21pbm9yCQkJPSAweDQsCisJLnZlcl9maXgJCQk9IDB4MTYsCiAKLQkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDg4OCwKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDQ4OCwKIAotCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDA4MDAsCi0JLnRleHRfbGVuCQkJPSAweDFhOTAsCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDQwMCwKKwkudGV4dF9sZW4JCQk9IDB4MWFhNCwKIAkudGV4dF9pbmRleAkJCT0gMHgwLAogCS5nel90ZXh0CQkJPSBibngyX1RQQVRfYjA2RndUZXh0LAogCS5nel90ZXh0X2xlbgkJCT0gc2l6ZW9mKGJueDJfVFBBVF9iMDZGd1RleHQpLApAQCAtMzY4NiwxMSArMzYzOSwxMSBAQAogCS5kYXRhX2luZGV4CQkJPSAweDAsCiAJLmRhdGEJCQkJPSBibngyX1RQQVRfYjA2RndEYXRhLAogCi0JLnNic3NfYWRkcgkJCT0gMHgwODAwMjJjMCwKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDAxZWMwLAogCS5zYnNzX2xlbgkJCT0gMHg0NCwKIAkuc2Jzc19pbmRleAkJCT0gMHgwLAogCi0JLmJzc19hZGRyCQkJPSAweDA4MDAyMzA0LAorCS5ic3NfYWRkcgkJCT0gMHgwODAwMWYwNCwKIAkuYnNzX2xlbgkJCT0gMHg0NTAsCiAJLmJzc19pbmRleAkJCT0gMHgwLAogCkBAIC0zNzE3LDg2MiArMzY3MCw4NjIgQEAKIH07CiAKIHN0YXRpYyB1OCBibngyX1RYUF9iMDZGd1RleHRbXSA9IHsKLQkweGFkLCAweDdiLCAweDdmLCAweDcwLCAweDliLCAweDc1LCAweDdhLCAweGU3LCAweGU3LCAweGQ1LCAweDBmLCAweDViLAotCTB4YjIsIDB4NjUsIDB4NTksIDB4MGUsIDB4NGEsIDB4OTAsIDB4NzcsIDB4YmQsIDB4OGQsIDB4NWUsIDB4ZjQsIDB4Y2EsCi0JMHgxNiwgMHhkOCwgMHg0OSwgMHg1ZSwgMHgyNSwgMHhjZSwgMHhjNiwgMHg1OSwgMHhhYiwgMHg0NCwgMHg3NSwgMHgxYywKLQkweGRiLCAweDcxLCAweDFjLCAweDMwLCAweGMxLCAweGRkLCAweDNhLCAweDNkLCAweGFlLCAweGYxLCAweDI1LCAweDI2LAotCTB4MzEsIDB4MTAsIDB4YzAsIDB4ZTksIDB4YTYsIDB4N2IsIDB4NjIsIDB4OGYsIDB4ZDYsIDB4YzIsIDB4NzYsIDB4ODIsCi0JMHg0MywgMHg2NCwgMHhiZiwgMHhjZSwgMHgyYSwgMHg1OSwgMHg4NywgMHg0ZSwgMHg2NywgMHhkNiwgMHg2MCwgMHgwNywKLQkweDA3LCAweDU2LCAweDhlLCAweDYwLCAweGRiLCAweDZiLCAweGJiLCAweDczLCAweGJiLCAweDgzLCAweDhlLCAweDQwLAotCTB4ZjAsIDB4NzIsIDB4MDEsIDB4YjYsIDB4ZmQsIDB4YTMsIDB4NDcsIDB4NmYsIDB4ZWUsIDB4ZGEsIDB4Y2MsIDB4MDIsCi0JMHg1OSwgMHhhMCwgMHg0YiwgMHhhMCwgMHgzYiwgMHg3YiwgMHg1MywgMHg2NywgMHgwYiwgMHhiYywgMHhmNywgMHg3OSwKLQkweGRlLCAweDU3LCAweDRhLCAweGIyLCAweDk0LCAweDRlLCAweDY3LCAweDNhLCAweGU3LCAweDE5LCAweDhmLCAweGFjLAotCTB4ZjcsIDB4YzcsIDB4ZjMsIDB4N2QsIDB4N2UsIDB4M2YsIDB4OWYsIDB4ZTcsIDB4ZjksIDB4N2UsIDB4NWQsIDB4MGYsCi0JMHg1NCwgMHhhMCwgMHhmOCwgMHg1MywgMHhjNSwgMHhkZiwgMHhlNiwgMHhlMSwgMHhkNCwgMHhlMSwgMHg4ZCwgMHg2YiwKLQkweGY1LCAweGI1LCAweGQ2LCAweDA1LCAweDM3LCAweDVjLCAweDcyLCAweGYzLCAweGFiLCAweDBhLCAweDMwLCAweGYwLAotCTB4MDEsIDB4ZmUsIDB4NWQsIDB4M2YsIDB4NWYsIDB4ZjksIDB4ZjcsIDB4YmQsIDB4NjYsIDB4ZmQsIDB4MzgsIDB4ODEsCi0JMHg0MCwgMHg4OSwgMHgyZiwgMHhmOSwgMHg4NSwgMHhjNywgMHg5MSwgMHg0MCwgMHg2YiwgMHg5YiwgMHgwNiwgMHg4ZiwKLQkweDMzLCAweGYxLCAweDY3LCAweDg5LCAweDdkLCAweDFhLCAweDkwLCAweGNjLCAweDM1LCAweDg2LCAweGI3LCAweGUyLAotCTB4NTMsIDB4MzMsIDB4MWQsIDB4NzQsIDB4NDEsIDB4YWUsIDB4N2YsIDB4MjUsIDB4ZjEsIDB4YzksIDB4YzgsIDB4OGYsCi0JMHgzNiwgMHhhOSwgMHgxZiwgMHhjZiwgMHgzYSwgMHhlMSwgMHgwOSwgMHgyNCwgMHg0ZSwgMHgyMywgMHg1MCwgMHgwZiwKLQkweDRmLCAweDFkLCAweGRmLCAweGY5LCAweDkzLCAweDg2LCAweDZhLCAweDI3LCAweGZjLCAweDI1LCAweDVhLCAweDJkLAotCTB4MTgsIDB4MzMsIDB4OTAsIDB4ZjYsIDB4MjQsIDB4ODYsIDB4NTEsIDB4YmUsIDB4MTEsIDB4NzgsIDB4MzcsIDB4MTMsCi0JMHhkNSwgMHhjNywgMHg4MCwgMHg2OSwgMHg0NywgMHgyMiwgMHgxYSwgMHg3ZSwgMHgwOSwgMHgzYSwgMHg4ZSwgMHhlNCwKLQkweGMzLCAweDY4LCAweGU3LCAweGVmLCAweDc2LCAweGUzLCAweDMzLCAweDMzLCAweGVjLCAweDQ2LCAweGRhLCAweGM5LAotCTB4ZTcsIDB4ZjYsIDB4MzYsIDB4MDMsIDB4ZGIsIDB4MzIsIDB4M2EsIDB4OGUsIDB4MWEsIDB4ZjAsIDB4ZDQsIDB4MjYsCi0JMHgxZSwgMHhjNSwgMHg2NiwgMHg3ZSwgMHhmYSwgMHgxMywgMHgyOSwgMHhiYywgMHgzMSwgMHgxOSwgMHgwOSwgMHgzZiwKLQkweDAzLCAweGI1LCAweDVmLCAweDczLCAweGFhLCAweDI5LCAweGEwLCAweDcxLCAweDY4LCAweDUwLCAweDUxLCAweDA3LAotCTB4ZGUsIDB4NTQsIDB4ZDQsIDB4ZGUsIDB4NDksIDB4MDUsIDB4MWUsIDB4ODUsIDB4Y2YsIDB4MzUsIDB4ZTYsIDB4ZTQsCi0JMHgzMywgMHg4NSwgMHhkYiwgMHg3MiwgMHgxZSwgMHg1YywgMHg3MiwgMHhjYSwgMHhmYSwgMHhiZiwgMHg0OSwgMHg3ZCwKLQkweDJiLCAweDcwLCAweDY5LCAweDJkLCAweDE4LCAweDI3LCAweDBmLCAweGVlLCAweDg0LCAweDgyLCAweGE3LCAweDliLAotCTB4YTMsIDB4YTEsIDB4NTEsIDB4YzgsIDB4ZmQsIDB4MzAsIDB4YjYsIDB4ZTYsIDB4ZTUsIDB4NTMsIDB4YTUsIDB4ZDQsCi0JMHhhNiwgMHgzOSwgMHhhZSwgMHg5YiwgMHhlNiwgMHgxOSwgMHhiZCwgMHgxYywgMHhlOSwgMHg4MCwgMHgxYSwgMHgwMiwKLQkweDE0LCAweDhjLCAweGVhLCAweDBlLCAweDI0LCAweDAzLCAweDZkLCAweDYxLCAweDE3LCAweGQ0LCAweGQwLCAweGJkLAotCTB4ZjgsIDB4NjcsIDB4Y2EsIDB4OWMsIDB4OGMsIDB4YjksIDB4NjEsIDB4M2YsIDB4M2YsIDB4ODAsIDB4NzIsIDB4MTQsCi0JMHgwMiwgMHhiNiwgMHhkNiwgMHg5ZSwgMHhjZSwgMHg5OCwgMHhlNiwgMHgwNSwgMHhjZCwgMHg4NSwgMHgzMywgMHhkNCwKLQkweGNmLCAweDY4LCAweGVlLCAweDlmLCAweGNkLCAweDAyLCAweDc1LCAweDMzLCAweGFlLCAweDk1LCAweGQ2LCAweGY3LAotCTB4NjAsIDB4MzYsIDB4NjAsIDB4OWEsIDB4NzMsIDB4YmMsIDB4NzcsIDB4MzQsIDB4NTcsIDB4ZDIsIDB4YjMsIDB4NjksCi0JMHgzYSwgMHgzNCwgMHhkMywgMHhkYywgMHhhNywgMHhmZCwgMHhjYSwgMHhkYywgMHhmYiwgMHg2YiwgMHhjZiwgMHg5YSwKLQkweGU2LCAweDEzLCAweGZhLCAweDRkLCAweDM4LCAweDliLCAweDZkLCAweDU3LCAweGJhLCAweDE3LCAweDU2LCAweGY5LAotCTB4YjcsIDB4Y2YsIDB4OTgsIDB4YjgsIDB4YTAsIDB4MjMsIDB4ZTAsIDB4NDgsIDB4NzQsIDB4MjgsIDB4ZGIsIDB4MTcsCi0JMHhiYSwgMHg5NCwgMHg2ZCwgMHhmOSwgMHg1ZCwgMHg0YSwgMHhjNywgMHhkYywgMHhlZiwgMHgyYSwgMHg1ZCwgMHgwYiwKLQkweDAzLCAweDRhLCAweDY3LCAweDNlLCAweDg0LCAweDc5LCAweDIzLCAweDg4LCAweDM5LCAweGEzLCAweDVmLCAweDY5LAotCTB4NWYsIDB4ZTgsIDB4NTMsIDB4NmMsIDB4MzksIDB4NTIsIDB4NGEsIDB4NWIsIDB4YmUsIDB4NDQsIDB4ZWIsIDB4YmEsCi0JMHgxZSwgMHhiNywgMHg2NywgMHgxMiwgMHg5OCwgMHgzMCwgMHhjYSwgMHhiOSwgMHhjZSwgMHhiMiwgMHhmOSwgMHhhMywKLQkweDg2LCAweDY1LCAweGNhLCAweGE5LCAweGUzLCAweDU4LCAweGZlLCAweDA5LCAweGVjLCAweDljLCAweDMxLCAweGNkLAotCTB4NWMsIDB4MWMsIDB4YzgsIDB4ZTUsIDB4ODEsIDB4ZWYsIDB4MTksIDB4OTEsIDB4ZGUsIDB4MjEsIDB4YzUsIDB4MzQsCi0JMHgzYiwgMHhhMywgMHhlNiwgMHhlYSwgMHhjYiwgMHg3YSwgMHg2MywgMHhlYywgMHg2NSwgMHhmYywgMHg5MywgMHgzOSwKLQkweDFiLCAweDQ0LCAweGRhLCAweDQ3LCAweDFhLCAweGM3LCAweDY5LCAweGIzLCAweGZiLCAweDI3LCAweGUxLCAweDI5LAotCTB4NGYsIDB4OGMsIDB4ZTMsIDB4NjcsIDB4MTksIDB4NzgsIDB4Y2EsIDB4MTIsIDB4NjksIDB4NWMsIDB4YzgsIDB4OGMsCi0JMHgwNiwgMHgzYywgMHg4OCwgMHg4NCwgMHhiNiwgMHgyYiwgMHhlOSwgMHg5NCwgMHgwMywgMHhlYSwgMHhmMCwgMHhkYiwKLQkweDUwLCAweGMzLCAweGI0LCAweGM3LCAweGQyLCAweDc5LCAweDQ1LCAweDJkLCAweGJjLCAweDBjLCAweDM1LCAweGY5LAotCTB4MmIsIDB4NDUsIDB4ZWQsIDB4YWEsIDB4NzUsIDB4MjIsIDB4ZTksIDB4ODgsIDB4N2EsIDB4ZjAsIDB4YTMsIDB4MDYsCi0JMHhiMSwgMHhjOSwgMHgzOCwgMHhkNiwgMHg1YSwgMHhiNiwgMHg0OSwgMHhlMywgMHhkNiwgMHg2YiwgMHhiNiwgMHg0OSwKLQkweDYwLCAweDk0LCAweDdjLCAweDFkLCAweDI1LCAweDVmLCAweGFmLCAweGU4LCAweDZhLCAweGU4LCAweDY5LCAweDk4LAotCTB4YWIsIDB4MDcsIDB4NzUsIDB4YjksIDB4OTcsIDB4YzAsIDB4NzgsIDB4ZGUsIDB4MGMsIDB4ZmIsIDB4MTMsIDB4OTcsCi0JMHhjOCwgMHgyZiwgMHhkMiwgMHg1ZiwgMHg0YSwgMHg3OCwgMHhkMiwgMHhkNSwgMHg4OSwgMHg0ZiwgMHhjZCwgMHhkNywKLQkweDM3LCAweDg2LCAweGYwLCAweDYyLCAweDNlLCAweDg4LCAweDE3LCAweGYyLCAweDAxLCAweDNjLCAweDlmLCAweDZmLAotCTB4ODcsIDB4OTEsIDB4ODcsIDB4N2YsIDB4NjcsIDB4ZmUsIDB4OGIsIDB4ZmMsIDB4ZDgsIDB4ODQsIDB4OGYsIDB4Y2YsCi0JMHg5MywgMHg2ZiwgMHhmZiwgMHg4ZSwgMHhiYywgMHg2YiwgMHhhMCwgMHgyYywgMHg4MSwgMHhkZSwgMHgxZiwgMHg2NywKLQkweDQ2LCAweGNjLCAweDBhLCAweDBkLCAweDAzLCAweDM1LCAweDA5LCAweDJkLCAweDc5LCAweDliLCAweGUyLCAweDZiLAotCTB4YTEsIDB4MWYsIDB4ZjYsIDB4YmUsIDB4OWEsIDB4NmIsIDB4NzEsIDB4NjksIDB4NTMsIDB4NWUsIDB4YjgsIDB4YTksCi0JMHhmZiwgMHg2ZCwgMHg3OSwgMHhkMywgMHgxYywgMHhkMywgMHgwZiwgMHhhZCwgMHhkYiwgMHhkYiwgMHhmMiwgMHhhNywKLQkweDg1LCAweDVlLCAweGFkLCAweDA3LCAweGU5LCAweGZjLCAweDIwLCAweGUwLCAweDRmLCAweGYwLCAweDkzLCAweGExLAotCTB4YjgsIDB4YWIsIDB4YTksIDB4M2QsIDB4N2MsIDB4ZWUsIDB4NDEsIDB4OTcsIDB4ZWQsIDB4Y2YsIDB4ZTQsIDB4ODEsCi0JMHg3YSwgMHg3ZiwgMHhjMSwgMHgyMCwgMHgwZiwgMHhjNiwgMHhiNCwgMHgxZiwgMHgxNSwgMHg2MSwgMHhjYSwgMHhmNywKLQkweDEzLCAweGYyLCAweDE5LCAweGMzLCAweGY3LCAweGYzLCAweDFhLCAweDc5LCAweDZiLCAweDIyLCAweDhmLCAweDYxLAotCTB4ZjIsIDB4ZTcsIDB4YzEsIDB4ZGUsIDB4YWMsIDB4M2EsIDB4OWQsIDB4ODYsIDB4M2EsIDB4MzEsIDB4OGIsIDB4MzUsCi0JMHg0OCwgMHgwNiwgMHgwMywgMHhmNCwgMHhjMSwgMHgzZiwgMHg4NiwgMHg0ZCwgMHhhMywgMHgwNywgMHg1MywgMHgwNiwKLQkweGQ2LCAweDA3LCAweDEyLCAweGI0LCAweDZmLCAweDFjLCAweDhmLCAweDk2LCAweDIxLCAweDNhLCAweGYwLCAweGIxLAotCTB4YTIsIDB4ZTAsIDB4ZjUsIDB4NjgsIDB4MGYsIDB4MjYsIDB4MjksIDB4NGYsIDB4NGYsIDB4Y2UsIDB4OGIsIDB4MDcsCi0JMHhiMiwgMHgxNSwgMHhiOCwgMHgyZiwgMHg2YiwgMHhlMiwgMHhmZSwgMHgzOCwgMHgxMiwgMHgxNSwgMHg5NCwgMHgyNywKLQkweDE2LCAweDhmLCAweDg2LCAweGRmLCAweDgzLCAweDBiLCAweGVkLCAweGI5LCAweDFlLCAweGM2LCAweGQyLCAweDU2LAotCTB4MjQsIDB4Y2IsIDB4M2MsIDB4ZDgsIDB4OWEsIDB4ZjMsIDB4MzEsIDB4MWUsIDB4OTMsIDB4MzgsIDB4M2QsIDB4ZTMsCi0JMHg4MSwgMHg3YiwgMHg4MywgMHgwMywgMHhiMywgMHhjMSwgMHgzMiwgMHhjNCwgMHhlYSwgMHgxZCwgMHhmYywgMHgwZCwKLQkweGZhLCAweGRiLCAweDY2LCAweGVhLCAweGZjLCAweGRiLCAweDBjLCAweDE3LCAweDBlLCAweDE4LCAweDBlLCAweDhjLAotCTB4NjQsIDB4NGQsIDB4YjMsIDB4NWQsIDB4MzcsIDB4NzEsIDB4NzUsIDB4NDMsIDB4MDAsIDB4M2YsIDB4YTAsIDB4ZmUsCi0JMHgwZSwgMHgxOSwgMHgyMSwgMHg5YywgMHhjZCwgMHgzZiwgMHg0ZSwgMHg1ZSwgMHg4MiwgMHgzNiwgMHhiZiwgMHgwNiwKLQkweDc5LCAweDM3LCAweGM4LCAweGJiLCAweDQxLCAweGJlLCAweDBkLCAweGUxLCAweGYzLCAweDNjLCAweDYzLCAweDQ2LAotCTB4YTcsIDB4NWMsIDB4NWUsIDB4ZjIsIDB4NTAsIDB4ODksIDB4MjEsIDB4ZjIsIDB4MTEsIDB4ODksIDB4OWIsIDB4NzAsCi0JMHhjNCwgMHhkNSwgMHhmNCwgMHg1ZSwgMHgyNiwgMHhhZiwgMHhkNSwgMHhmNSwgMHhhNiwgMHhmOSwgMHhmMSwgMHgwNiwKLQkweDkxLCAweDg1LCAweDM2LCAweDc3LCAweGY0LCAweDQ4LCAweDhjLCAweGZlLCAweDU2LCAweDE1LCAweGUzLCAweGVhLAotCTB4NmYsIDB4YTksIDB4YjcsIDB4MjcsIDB4ZjMsIDB4NWUsIDB4YTQsIDB4YjIsIDB4OTYsIDB4ZGYsIDB4MWUsIDB4MmUsCi0JMHgyMywgMHhkZiwgMHhjMiwgMHg1NywgMHg1ZSwgMHg4YiwgMHgzMiwgMHg0NiwgMHhhMywgMHhmZCwgMHg4YywgMHg1MSwKLQkweGVjLCAweDIwLCAweGNmLCAweGY3LCAweDFiLCAweGQxLCAweDk2LCAweDVkLCAweDhhLCAweDBiLCAweDlkLCAweGI5LAotCTB4YTAsIDB4YmYsIDB4ZmQsIDB4MDYsIDB4M2UsIDB4MjksIDB4YWYsIDB4YzQsIDB4MjAsIDB4NjUsIDB4MGQsIDB4OTAsCi0JMHhiZiwgMHgyMCwgMHhmNiwgMHg5MSwgMHhjZiwgMHgxNywgMHg4YSwgMHg3YywgMHhjZSwgMHhlNSwgMHg2NSwgMHhhZCwKLQkweGNmLCAweGYzLCAweDVhLCAweGUyLCAweDEzLCAweGU5LCAweDE1LCAweDg5LCAweGEwLCAweDgyLCAweDBhLCAweDFmLAotCTB4NzYsIDB4ZTUsIDB4ZGUsIDB4YTIsIDB4MmQsIDB4ZWEsIDB4ZjAsIDB4YTcsIDB4YjQsIDB4YzEsIDB4OGIsIDB4OGMsCi0JMHg5MSwgMHhlZiwgMHg1ZiwgMHhmMywgMHgxNywgMHhiMSwgMHhjNywgMHg2MywgMHhiNCwgMHg4MywgMHg3YSwgMHgzYSwKLQkweDBkLCAweDFmLCAweDA2LCAweGYyLCAweDQ5LCAweDFjLCAweDk5LCAweDQxLCAweDcyLCAweDVlLCAweDNmLCAweGNlLAotCTB4NzgsIDB4NWYsIDB4MDUsIDB4YTcsIDB4NTYsIDB4OWUsIDB4MGMsIDB4NjgsIDB4MTUsIDB4ZDgsIDB4MzcsIDB4MTcsCi0JMHhjNCwgMHg3MCwgMHhiZSwgMHgwZCwgMHg0NiwgMHgzNiwgMHg4OCwgMHg4MywgMHhmNCwgMHhjZCwgMHgyYiwgMHhmMSwKLQkweGU0LCAweGZkLCAweDdlLCAweDA4LCAweGVmLCAweDQxLCAweDNjLCAweGMwLCAweDc3LCAweDllLCAweDk4LCAweDA5LAotCTB4NjIsIDB4ODgsIDB4M2EsIDB4ZGEsIDB4MWUsIDB4OGYsIDB4YjYsIDB4NzgsIDB4NzksIDB4ZWQsIDB4MDAsIDB4YWYsCi0JMHgxZCwgMHhhNSwgMHhmZSwgMHhjZiwgMHhlYiwgMHg5MywgMHgxOCwgMHhlOCwgMHg1NSwgMHg2MywgMHg0MCwgMHgxMCwKLQkweGZiLCAweDBkLCAweDA0LCAweGU4LCAweGMyLCAweDhmLCAweDMxLCAweGJmLCAweGM1LCAweGNlLCAweGYzLCAweGZiLAotCTB4YmQsIDB4ZjksIDB4MGEsIDB4Y2EsIDB4ZTksIDB4NDcsIDB4NDgsIDB4ZmIsIDB4YzQsIDB4NzQsIDB4MzcsIDB4OWIsCi0JMHhlNiwgMHg3NywgMHhmNSwgMHhlOCwgMHhkMiwgMHg0ZiwgMHg5ZCwgMHgyZSwgMHgzYywgMHg5MiwgMHg3NywgMHgyMCwKLQkweDM1LCAweDU3LCAweDgxLCAweGRmLCAweGNmLCAweGJhLCAweDcwLCAweDU3LCAweDdkLCAweDA1LCAweDBlLCAweGNkLAotCTB4MjUsIDB4MzEsIDB4MzYsIDB4NTMsIDB4ODEsIDB4YzEsIDB4MmMsIDB4NTYsIDB4ZWYsIDB4ZDcsIDB4YzcsIDB4NmEsCi0JMHhjYSwgMHhhMCwgMHgyZSwgMHhiNywgMHgyMywgMHg4NiwgMHhhYiwgMHhiNCwgMHhjMywgMHgyMywgMHg3MywgMHgzZSwKLQkweDdmLCAweGZmLCAweDRjLCAweDAwLCAweGE5LCAweDA1LCAweDJmLCAweDlmLCAweDc3LCAweGYwLCAweGY5LCAweDcyLAotCTB4ZTgsIDB4ZWIsIDB4MjMsIDB4YTksIDB4MDAsIDB4ODQsIDB4YzcsIDB4NGEsIDB4M2MsIDB4MzQsIDB4ZTcsIDB4YzUsCi0JMHg4MywgMHhkOSwgMHgwMCwgMHgwZSwgMHhjZSwgMHgzNCwgMHg2MywgMHhkYSwgMHg0OCwgMHhlMiwgMHgxOCwgMHg3MywKLQkweGM3LCAweGY3LCAweGUyLCAweDZhLCAweGVmLCAweDQxLCAweDQ1LCAweDRkLCAweDZlLCAweDUzLCAweDkyLCAweDY4LAotCTB4ODgsIDB4YmIsIDB4NzEsIDB4ODksIDB4NzksIDB4YzgsIDB4MWQsIDB4NmYsIDB4NmMsIDB4NzksIDB4OWUsIDB4YjksCi0JMHhhMSwgMHgyYywgMHgxMSwgMHhlNCwgMHg3NywgMHg3NSwgMHg4MiwgMHgzMSwgMHg5YiwgMHg3NCwgMHgzYiwgMHgzNiwKLQkweDAwLCAweDJiLCAweDI1LCAweDdlLCAweDgzLCAweGZlLCAweDZlLCAweDIzLCAweGUwLCAweGVmLCAweGNlLCAweGQ3LAotCTB4ZjksIDB4YjcsIDB4MWIsIDB4MjEsIDB4ZmYsIDB4NzYsIDB4YzYsIDB4ZDcsIDB4MzYsIDB4ZjEsIDB4NDcsIDB4YzMsCi0JMHg4MywgMHhlMywgMHhmMSwgMHg0ZiwgMHhjZCwgMHg4MSwgMHgxYSwgMHgyYiwgMHg5ZiwgMHhmOSwgMHg3NywgMHhjZSwKLQkweGE4LCAweGU5LCAweDU5LCAweGE4LCAweDNhLCAweGFiLCAweDAxLCAweDI2LCAweDE3LCAweDVjLCAweGI0LCAweDlmLAotCTB4ODIsIDB4MWEsIDB4YWQsIDB4OTksIDB4NzksIDB4M2MsIDB4ODAsIDB4ODcsIDB4OTgsIDB4NTMsIDB4ZmUsIDB4OWEsCi0JMHgzOSwgMHg2NSwgMHg3MCwgMHgyYSwgMHgxMiwgMHg5OCwgMHg4NiwgMHg5NywgMHhmYSwgMHgwNiwgMHhmNiwgMHg5ZSwKLQkweDBiLCAweGQyLCAweGU2LCAweDVkLCAweDc4LCAweDljLCAweDdjLCAweDZkLCAweGRmLCAweDE4LCAweGM0LCAweDdkLAotCTB4ZjksIDB4ODAsIDB4YmYsIDB4OGIsIDB4ZjYsIDB4N2IsIDB4MmYsIDB4MTcsIDB4ZjIsIDB4NmYsIDB4YTUsIDB4MmQsCi0JMHhkZiwgMHhjZSwgMHhhOSwgMHhlMSwgMHgwMiwgMHhmZSwgMHhhZiwgMHhmOCwgMHg1MywgMHgwYywgMHgwZSwgMHg2MCwKLQkweGZmLCAweDk0LCAweDFiLCAweDg1LCAweGEwLCAweGFjLCAweDQ1LCAweDlkLCAweDFiLCAweDJmLCAweDlhLCAweDNlLAotCTB4NGQsIDB4M2IsIDB4N2QsIDB4OTAsIDB4YmEsIDB4ZmUsIDB4NDYsIDB4ZGUsIDB4ODcsIDB4MDcsIDB4MGQsIDB4MzUsCi0JMHhmNiwgMHg3ZCwgMHhjNSwgMHg0NywgMHg5ZCwgMHg3YSwgMHhhOCwgMHgwNywgMHgyNiwgMHg5OCwgMHg1NSwgMHhmMiwKLQkweDVjLCAweDFjLCAweGUxLCAweDU1LCAweDc2LCAweGFlLCAweDNkLCAweDM0LCAweDI3LCAweDdlLCAweDQyLCAweGRiLAotCTB4MWIsIDB4ZjQsIDB4MDEsIDB4ZmEsIDB4Y2YsIDB4ZjcsIDB4YWYsIDB4YzUsIDB4YWEsIDB4MWEsIDB4NDgsIDB4NWIsCi0JMHhiOSwgMHgzYiwgMHg0NiwgMHg3ZiwgMHhiMSwgMHg3NSwgMHg3NCwgMHg2MiwgMHg0NiwgMHhmNCwgMHhhMCwgMHg0ZSwKLQkweGMzLCAweDkxLCAweGM0LCAweGJhLCAweGY1LCAweDdmLCAweDZkLCAweDVlLCAweDVhLCAweDI5LCAweGZhLCAweDA4LAotCTB4NjAsIDB4ODQsIDB4M2EsIDB4M2MsIDB4NmQsIDB4OTgsIDB4ZTYsIDB4ZDUsIDB4MGQsIDB4MWYsIDB4OWEsIDB4MmQsCi0JMHgzNywgMHg4YiwgMHg1ZSwgMHg0NCwgMHhkNiwgMHgxZiwgMHgyOCwgMHg1MiwgMHg0NywgMHg2YSwgMHgzNCwgMHhmZiwKLQkweGZmLCAweDA3LCAweDVmLCAweGY5LCAweGE2LCAweDM5LCAweDYwLCAweGM5LCAweDI3LCAweGZlLCAweGUyLCAweGEyLAotCTB4MmYsIDB4M2UsIDB4NGUsIDB4ZGEsIDB4MGUsIDB4MGMsIDB4OTAsIDB4ZGUsIDB4YzMsIDB4ODYsIDB4ZjksIDB4NTEsCi0JMHg2ZCwgMHhlMiwgMHgzMywgMHhiMywgMHg2NSwgMHg5MywgMHgzNiwgMHhiYywgMHhhYywgMHhmYywgMHg0ZiwgMHg1ZSwKLQkweDBmLCAweGUyLCAweGExLCAweDdjLCAweDBiLCAweDc1LCAweGQ3LCAweDhlLCAweDI3LCAweGE4LCAweGMzLCAweGEzLAotCTB4ODYsIDB4ZTQsIDB4YzQsIDB4MTAsIDB4ZmQsIDB4YjksIDB4OGUsIDB4ZmUsIDB4ZWQsIDB4NTIsIDB4YjYsIDB4MTksCi0JMHgzOSwgMHg2YywgMHg5ZiwgMHg0YywgMHhhMywgMHg5MywgMHhmZSwgMHhiZSwgMHg5NCwgMHg4OSwgMHhiNCwgMHgzYywKLQkweDBiLCAweDM1LCAweDRkLCAweDE5LCAweGZjLCAweDVkLCAweGQ0LCAweDcxLCAweGJiLCAweGExLCAweDc2LCAweDg5LAotCTB4NGQsIDB4ZGIsIDB4OTksIDB4OTcsIDB4NWUsIDB4Y2EsIDB4ODQsIDB4ZmMsIDB4NmQsIDB4NzksIDB4ZDEsIDB4NzcsCi0JMHg5ZCwgMHg3ZiwgMHg2YiwgMHhmZSwgMHhhYiwgMHhiNCwgMHhiZCwgMHg4MiwgMHhjZCwgMHg2YiwgMHgzYywgMHhjYywKLQkweDMzLCAweDc3LCAweGMxLCAweGI2LCAweGFiLCAweDZkLCAweGJiLCAweGQ3LCAweGUzLCAweDhkLCAweDAzLCAweDFmLAotCTB4MzIsIDB4M2YsIDB4YTUsIDB4NTcsIDB4ZGEsIDB4ZDcsIDB4NTIsIDB4YmMsIDB4NTYsIDB4YmQsIDB4MDEsIDB4ZmUsCi0JMHgzYiwgMHhlOSwgMHgwNywgMHg3YiwgMHhlOCwgMHgwNywgMHg1NywgMHgzNywgMHg3YywgMHg2YSwgMHg4NiwgMHg2ZiwKLQkweGIyLCAweGZkLCAweGEwLCAweDZkLCAweGM2LCAweGU1LCAweGVmLCAweGEwLCAweDllLCAweGI2LCAweGU5LCAweDBhLAotCTB4ZTYsIDB4ZjQsIDB4MGMsIDB4MDYsIDB4YWUsIDB4NjEsIDB4ODcsIDB4ZTQsIDB4ZWMsIDB4NTksIDB4M2QsIDB4YzksCi0JMHgzYywgMHhmMiwgMHg5YiwgMHg3MCwgMHhkNSwgMHg2MCwgMHhmNiwgMHg1OSwgMHhmZCwgMHg3MSwgMHg4NCwgMHg2ZCwKLQkweGRmLCAweGMxLCAweGMxLCAweGFjLCAweDE3LCAweGU5LCAweGJiLCAweDAyLCAweDk4LCAweDZmLCAweDA4LCAweGUwLAotCTB4NjEsIDB4ZDIsIDB4YmUsIDB4MTIsIDB4NmYsIDB4MWMsIDB4N2EsIDB4ODMsIDB4M2EsIDB4OTgsIDB4YWQsIDB4OTEsCi0JMHg2YiwgMHg0OSwgMHhmYywgMHhhNSwgMHhmZSwgMHgyOCwgMHg3MCwgMHg5MywgMHhiZCwgMHhmNiwgMHg4MiwgMHhjNCwKLQkweGU4LCAweDQyLCAweDMzLCAweDhlLCAweGU2LCAweGZiLCAweDE1LCAweDNiLCAweDZmLCAweGFhLCAweDVkLCAweDQ5LAotCTB4ZmMsIDB4YzQsIDB4OTQsIDB4NWMsIDB4YmEsIDB4NjAsIDB4MzAsIDB4YzcsIDB4NTEsIDB4MWYsIDB4ZTMsIDB4ZjQsCi0JMHhhMywgMHhkMSwgMHg1YywgMHg5ZCwgMHhiZiwgMHg5MywgMHg3ZSwgMHhmNCwgMHg3OCwgMHg0ZSwgMHg2NCwgMHg4YSwKLQkweGVhLCAweGJhLCAweGIzLCAweDk2LCAweGI1LCAweDk5LCAweGZhLCAweDMxLCAweGFjLCAweDlhLCAweDVmLCAweDFkLAotCTB4ZDAsIDB4OGUsIDB4NjEsIDB4ZGEsIDB4ZTIsIDB4MmQsIDB4YTUsIDB4ZjQsIDB4MTMsIDB4NjMsIDB4MzAsIDB4NjQsCi0JMHhhYSwgMHhjYiwgMHhiNSwgMHg0MywgMHg3OCwgMHhkYywgMHhiYSwgMHgxNiwgMHhmNCwgMHhlZiwgMHg5ZSwgMHg0OSwKLQkweDNhLCAweDFjLCAweDFhLCAweDAyLCAweDk1LCAweDg5LCAweDc2LCAweDY1LCAweDM3LCAweGViLCAweDZlLCAweGM3LAotCTB4NGMsIDB4ODcsIDB4ZDIsIDB4YjEsIDB4MjAsIDB4MzEsIDB4ZDAsIDB4YTUsIDB4NmMsIDB4NjcsIDB4Y2QsIDB4NGQsCi0JMHhiMiwgMHhlNiwgMHgyNiwgMHg1OSwgMHg3MywgMHg5MywgMHhlNCwgMHgyMywgMHhjOSwgMHg1YSwgMHhkYiwgMHg5NiwKLQkweDRmLCAweDI5LCAweDNiLCAweDQ0LCAweGZmLCAweGY0LCAweGFmLCAweGU3LCAweDBkLCAweDFiLCAweDQ3LCAweDMwLAotCTB4MDcsIDB4ZjksIDB4M2IsIDB4ZjMsIDB4NmIsIDB4MWQsIDB4MzYsIDB4YjYsIDB4NGIsIDB4MjksIDB4NDUsIDB4MmMsCi0JMHhlMywgMHhhOSwgMHhkMCwgMHg1OCwgMHhjYiwgMHg4YywgMHg5NCwgMHhkMiwgMHhjZCwgMHg3YSwgMHhkYiwgMHg2ZiwKLQkweGU5LCAweDMyLCAweDMyLCAweGZjLCAweDBlLCAweGViLCAweGVjLCAweGViLCAweGFjLCAweGIzLCAweGI5LCAweDM4LAotCTB4ZTMsIDB4NmEsIDB4Y2QsIDB4NTUsIDB4NzMsIDB4NjAsIDB4YTUsIDB4NWQsIDB4MTMsIDB4YzYsIDB4YzgsIDB4ZWYsCi0JMHg3NywgMHg2OSwgMHhiMywgMHgwMiwgMHg2YiwgMHg2OSwgMHhiYiwgMHg1MywgMHhjMSwgMHg3ZSwgMHgwZCwgMHhkNSwKLQkweGI1LCAweGNjLCAweGE5LCAweDQ3LCAweGYzLCAweGFjLCAweDAzLCAweDdhLCAweGE0LCAweGU1LCAweDdkLCAweDJhLAotCTB4ZjYsIDB4YTgsIDB4ZTYsIDB4YzYsIDB4ZDUsIDB4OWIsIDB4MDgsIDB4NzYsIDB4YjQsIDB4MzYsIDB4MWMsIDB4Y2YsCi0JMHg5NiwgMHg2MywgMHgyOCwgMHg5ZSwgMHg1YywgMHhlMSwgMHgyMSwgMHg1NiwgMHhlOSwgMHg2YSwgMHhjNiwgMHhhMywKLQkweDVjLCAweDVhLCAweDA5LCAweDI1LCAweGEyLCAweGY0LCAweDFiLCAweDI0LCAweGE3LCAweDU4LCAweDI3LCAweDI2LAotCTB4OGQsIDB4YWYsIDB4MjIsIDB4YzcsIDB4N2EsIDB4M2EsIDB4YWYsIDB4YmIsIDB4ZjAsIDB4N2EsIDB4NmUsIDB4MmQsCi0JMHhmMywgMHg1YywgMHg1NCwgMHhmNywgMHgyOSwgMHgxNSwgMHg4YywgMHhkZiwgMHgwNCwgMHgzMiwgMHg4NiwgMHhlNCwKLQkweDI3LCAweGQzLCAweDljLCAweDE3LCAweDFlLCAweGEyLCAweGQxLCAweGU0LCAweDI4LCAweDI0LCAweDY3LCAweDk5LAotCTB4YWIsIDB4ZWYsIDB4OGQsIDB4OTcsIDB4NjEsIDB4NzMsIDB4ZDQsIDB4OGYsIDB4ZDUsIDB4ZGEsIDB4ODAsIDB4ZDIsCi0JMHg5NSwgMHg4ZiwgMHhlYSwgMHhlNywgMHhmMSwgMHhiYiwgMHhjYSwgMHg5ZSwgMHg4NSwgMHgwNCwgMHg2MywgMHhiYiwKLQkweDlmLCAweGJhLCAweGE5LCAweGMwLCAweGE1LCAweGEwLCAweGYwLCAweDg4LCAweDZhLCAweGI3LCAweGU2LCAweGMwLAotCTB4YmIsIDB4NzcsIDB4MmIsIDB4MDgsIDB4NjgsIDB4NDksIDB4NWMsIDB4NjgsIDB4MGUsIDB4ZDAsIDB4YWYsIDB4YmEsCi0JMHg4OCwgMHgzMSwgMHhjMiwgMHg3MCwgMHgyZSwgMHg4NiwgMHhmYywgMHgzYiwgMHg2OCwgMHg4YiwgMHhjYSwgMHhjNSwKLQkweDNhLCAweGRhLCAweDg3LCAweGJlLCAweDQ3LCAweDFkLCAweGI2LCAweDUxLCAweDg3LCAweGRkLCAweDczLCAweDA4LAotCTB4NTQsIDB4MjQsIDB4ZmEsIDB4OTQsIDB4OGUsIDB4N2MsIDB4YmIsIDB4ZDIsIDB4OWUsIDB4NTcsIDB4YTksIDB4MjcsCi0JMHhkMSwgMHhjOSwgMHgzNywgMHg4OSwgMHg5NSwgMHhjNCwgMHg1NywgMHg0YSwgMHhiNiwgMHgxNCwgMHg3ZiwgMHhiZCwKLQkweGQxLCAweDllLCAweGZkLCAweDBlLCAweDg5LCAweGI5LCAweGNkLCAweDZiLCAweDEyLCAweDhjLCAweDQ3LCAweDA3LAotCTB4ZjksIDB4MTIsIDB4MWUsIDB4M2MsIDB4YTgsIDB4NmUsIDB4MzAsIDB4NTcsIDB4NWYsIDB4ODksIDB4MzMsIDB4NzksCi0JMHg1NiwgMHgyNCwgMHgzMCwgMHg5NSwgMHhlZiwgMHhhMSwgMHg1ZCwgMHgzNiwgMHgxNCwgMHhmZCwgMHgyYiwgMHhlMCwKLQkweGRmLCAweDM2LCAweGQzLCAweGFlLCAweDZjLCAweDViLCAweDU4LCAweGUxLCAweGVmLCAweGE1LCAweDBkLCAweDdiLAotCTB4MTcsIDB4NDIsIDB4NDIsIDB4OTcsIDB4ZWIsIDB4OGIsIDB4NmQsIDB4OTMsIDB4NzAsIDB4NjgsIDB4ZmYsIDB4OWEsCi0JMHgyZCwgMHhiZiwgMHg0MSwgMHg1YSwgMHg2MiwgMHg0ZiwgMHg2ZiwgMHhjOSwgMHg0ZiwgMHhmZCwgMHg3YiwgMHg2NiwKLQkweDkyLCAweDc4LCAweDc3LCAweDgzLCAweDliLCAweDM1LCAweGI1LCAweDg0LCAweDI5LCAweGFhLCAweDhhLCAweDlmLAotCTB4YTcsIDB4MWQsIDB4ZDAsIDB4NTIsIDB4NGEsIDB4OTcsIDB4ZjgsIDB4OTEsIDB4ZGIsIDB4NWUsIDB4ZjMsIDB4Y2UsCi0JMHgxOSwgMHhiOCwgMHgwOSwgMHgxNSwgMHhjMiwgMHg0ZSwgMHg2MiwgMHhiYSwgMHgwZiwgMHhlMywgMHhkMSwgMHg4MSwKLQkweDczLCAweDRhLCAweDhmLCAweGQyLCAweDkzLCAweDk3LCAweDFhLCAweDZjLCAweGZiLCAweDU0LCAweDFiLCAweDdkLAotCTB4YWEsIDB4OWQsIDB4ZmMsIDB4YjQsIDB4ZDMsIDB4YTcsIDB4YmEsIDB4YzksIDB4NGYsIDB4YjcsIDB4ZTUsIDB4NTMsCi0JMHhlMiwgMHg5YiwgMHhiZiwgMHhjZSwgMHhjYiwgMHhkNiwgMHhmYywgMHgxZSwgMHg0YiwgMHgyZiwgMHgzYiwgMHhmOCwKLQkweDZlLCAweDE3LCAweGU1LCAweGU4LCAweGUyLCAweDdiLCAweDdiLCAweGY4LCAweGRlLCAweDllLCAweDg1LCAweGZmLAotCTB4MmQsIDB4ZmMsIDB4NTEsIDB4MTYsIDB4M2IsIDB4ZjYsIDB4YWYsIDB4ZDcsIDB4MzQsIDB4YzksIDB4MDEsIDB4YWYsCi0JMHgxNSwgMHgzMSwgMHgwNSwgMHhkMiwgMHg4ZSwgMHg4NCwgMHhlNCwgMHg4OCwgMHg2MSwgMHhmNCwgMHgzNiwgMHhjMywKLQkweGIzLCAweDIyLCAweGYxLCAweDkzLCAweGQ2LCAweDVkLCAweGY1LCAweGNjLCAweDY3LCAweGNjLCAweGE3LCAweDllLAotCTB4MjksIDB4NjIsIDB4NjksIDB4ZTYsIDB4ZTgsIDB4ZjksIDB4MTYsIDB4MDUsIDB4NjMsIDB4ZmEsIDB4Y2QsIDB4OGMsCi0JMHg1MywgMHgxZCwgMHgxMywgMHg3OSwgMHhiNSwgMHgyYiwgMHhjYywgMHg3YiwgMHg0ZCwgMHg5MywgMHg4MiwgMHhmMSwKLQkweDBmLCAweGEyLCAweDhkLCAweGI4LCAweDJlLCAweDk0LCAweDE4LCAweDQyLCAweGM4LCAweDg4LCAweDg0LCAweDI2LAotCTB4MTQsIDB4NzUsIDB4NjgsIDB4MmIsIDB4ZDQsIDB4MjUsIDB4ZDYsIDB4ODYsIDB4ZDQsIDB4OWMsIDB4YTIsIDB4MGUsCi0JMHhkNywgMHgzYSwgMHhkNSwgMHhlNCwgMHg5YiwgMHgxNiwgMHhiZSwgMHgzZSwgMHg4OCwgMHgzNSwgMHgxNiwgMHg4NiwKLQkweDFiLCAweDQyLCAweDhjLCAweDU4LCAweDc2LCAweDA3LCAweDY5LCAweDFlLCAweGQ4LCAweGFjLCAweGUwLCAweGIyLAotCTB4ZmUsIDB4MjEsIDB4ZWQsIDB4YTgsIDB4MjYsIDB4ZDMsIDB4OGEsIDB4OGUsIDB4MGMsIDB4ZjMsIDB4NDQsIDB4NjgsCi0JMHg0YSwgMHhiMCwgMHhmYSwgMHg0MSwgMHg2MiwgMHg3NSwgMHg3OCwgMHg3YywgMHg3YywgMHgzNiwgMHgzMywgMHgxOSwKLQkweDQ5LCAweDc5LCAweDljLCAweDZhLCAweDhjLCAweDM4LCAweDNkLCAweDQ5LCAweDlhLCAweDdhLCAweDllLCAweGY4LAotCTB4OWQsIDB4NmIsIDB4ODQsIDB4ZjcsIDB4MTcsIDB4NjksIDB4NDYsIDB4OGIsIDB4MzQsIDB4YjUsIDB4MWMsIDB4MTgsCi0JMHgzNywgMHgxMywgMHhlOCwgMHg4YywgMHhiMiwgMHg1NiwgMHgzMCwgMHhlNywgMHgxZCwgMHg5MywgMHg5ZSwgMHg4MCwKLQkweGY0LCAweGNhLCAweGE3LCAweDc0LCAweDdlLCAweDRmLCAweDI5LCAweGJiLCAweDI1LCAweGE2LCAweGNhLCAweDZkLAotCTB4MmIsIDB4NTQsIDB4NzMsIDB4OGQsIDB4YWEsIDB4YzQsIDB4NjEsIDB4MmMsIDB4NWEsIDB4NmIsIDB4MGMsIDB4Y2IsCi0JMHgxYSwgMHhjMywgMHgzZiwgMHg1MywgMHhkNCwgMHhkOCwgMHgzOSwgMHg0NSwgMHg3MiwgMHg3NSwgMHg2MywgMHhmZiwKLQkweDM5LCAweGM2LCAweGQwLCAweDUxLCAweDQ1LCAweDZkLCAweDM5LCAweDRlLCAweGYxLCAweGJkLCAweDlhLCAweGQwLAotCTB4M2YsIDB4NWMsIDB4NWMsIDB4NjcsIDB4MTgsIDB4MGQsIDB4MzksIDB4YzYsIDB4NjcsIDB4ZGUsIDB4YTMsIDB4NmMsCi0JMHhjZCwgMHhiNiwgMHg2MSwgMHg2YywgMHhhZSwgMHgwZCwgMHhhMywgMHg1OSwgMHgwNSwgMHg3YiwgMHhmNCwgMHg5NSwKLQkweGI4LCAweDc0LCAweGIzLCAweGQ1LCAweGE3LCAweDU0LCAweGFkLCAweGQ2LCAweDZhLCAweDMxLCAweDEyLCAweDQwLAotCTB4YjUsIDB4NDMsIDB4ZmIsIDB4MGEsIDB4ZjYsIDB4MTYsIDB4MzEsIDB4N2UsIDB4ZTcsIDB4ODksIDB4NWUsIDB4ZTYsCi0JMHg3ZCwgMHgxMywgMHhlZiwgMHgzMywgMHg5NiwgMHgyMiwgMHgzNSwgMHg0OCwgMHhiYSwgMHgxMywgMHgyZCwgMHhjNCwKLQkweGUzLCAweDc1LCAweDRlLCAweDNiLCAweGRlLCAweGZmLCAweGM5LCAweDYzLCAweGRiLCAweDQwLCAweGY0LCAweGZmLAotCTB4ZjksIDB4N2IsIDB4NmQsIDB4NzgsIDB4MzIsIDB4NWIsIDB4ODYsIDB4OTYsIDB4MGQsIDB4YjgsIDB4MmIsIDB4ODQsCi0JMHgyYSwgMHgwNywgMHg2YiwgMHhkYywgMHg1YiwgMHhiYiwgMHg5NCwgMHgxNCwgMHhlZiwgMHg1OSwgMHhjZiwgMHg3YSwKLQkweGJlLCAweDljLCAweGU4LCAweDRkLCAweGZjLCAweDk3LCAweDA2LCAweGI5LCAweDZlLCAweGU1LCAweDhkLCAweDFiLAotCTB4YWUsIDB4MGYsIDB4N2YsIDB4YzEsIDB4NzUsIDB4MDUsIDB4Y2YsIDB4MzEsIDB4OTEsIDB4N2QsIDB4OGYsIDB4MzUsCi0JMHgyNSwgMHg5NywgMHgzMSwgMHhlMSwgMHg0YywgMHhiOCwgMHgzMCwgMHgzNCwgMHgxOSwgMHhjNiwgMHhjMSwgMHhjNSwKLQkweDIwLCAweDE2LCAweDMzLCAweGVhLCAweGMwLCAweDI1LCAweGY2LCAweDBmLCAweDdiLCAweDliLCAweDM1LCAweDNjLAotCTB4YjgsIDB4MTgsIDB4YzIsIDB4NDIsIDB4MDYsIDB4YTYsIDB4MzcsIDB4YTEsIDB4MTUsIDB4YmMsIDB4NGEsIDB4MGMsCi0JMHgwNywgMHgxNiwgMHhlYiwgMHg3MCwgMHgyZSwgMHhhMywgMHgyZCwgMHg4ZCwgMHgyYSwgMHhkMSwgMHg1NCwgMHgyZCwKLQkweDcxLCAweGM3LCAweGMzLCAweDhiLCAweDRkLCAweDc4LCAweDY4LCAweGQxLCAweGMzLCAweDc3LCAweDRjLCAweDc0LAotCTB4YzcsIDB4ZWIsIDB4ZjgsIDB4YmMsIDB4MDMsIDB4Y2YsIDB4OWUsIDB4MzQsIDB4NGQsIDB4YzEsIDB4NWQsIDB4NDMsCi0JMHg4YiwgMHhjMCwgMHhjMiwgMHgzNCwgMHg2YiwgMHhkMSwgMHgxOSwgMHhkNiwgMHhhNSwgMHhhNywgMHg4MCwgMHgwMywKLQkweDRmLCAweDM5LCAweDMwLCAweDM3LCAweDZkLCAweDYyLCAweGFmLCAweDNlLCAweDVhLCAweGViLCAweGEwLCAweGMzLAotCTB4MGYsIDB4YjAsIDB4NmUsIDB4YjgsIDB4NTksIDB4MDMsIDB4ZWYsIDB4MGQsIDB4ZDgsIDB4ZjksIDB4ZmMsIDB4MTIsCi0JMHhmMywgMHhkNCwgMHhmZCwgMHg0ZiwgMHhjNSwgMHhmMCwgMHg1NiwgMHgyNiwgMHg4ZCwgMHg2ZSwgMHhlMiwgMHhmMywKLQkweDE0LCAweDc5LCAweDc5LCAweDMzLCAweGMzLCAweDNhLCAweGI2LCAweGE4LCAweGUzLCAweDhkLCAweDhjLCAweDg3LAotCTB4ZWIsIDB4MzQsIDB4ZTEsIDB4ZTUsIDB4OGMsIDB4M2MsIDB4MjMsIDB4Y2YsIDB4ZmEsIDB4MzAsIDB4NDgsIDB4NWUsCi0JMHg1ZSwgMHhjZiwgMHg4NCwgMHhiOCwgMHg2NiwgMHgxMCwgMHgzZiwgMHhlNiwgMHg3MywgMHhmNywgMHgyZCwgMHg2YSwKLQkweGFjLCAweDViLCAweDFlLCAweGFlLCAweDFiLCAweGM2LCAweGFiLCAweDE5LCAweDFmLCAweDc5LCAweDBkLCAweGIyLAotCTB4NTYsIDB4MGQsIDB4NjIsIDB4MmMsIDB4ZDMsIDB4YjgsIDB4YjQsIDB4OTUsIDB4ODksIDB4ZGEsIDB4YWUsIDB4MzUsCi0JMHg3MiwgMHhlZCwgMHgxZCwgMHhiMywgMHhjNywgMHg4YSwgMHg0NSwgMHg1OSwgMHhhNywgMHhiNCwgMHhlZSwgMHgyMCwKLQkweDQ2LCAweDMzLCAweDZmLCAweDM4LCAweDRiLCAweGZkLCAweGY0LCAweDczLCAweGQzLCAweGNiLCAweDE2LCAweGY2LAotCTB4N2IsIDB4ZDYsIDB4ZTAsIDB4ZGYsIDB4NzMsIDB4YzAsIDB4MzksIDB4MjMsIDB4NmQsIDB4NTYsIDB4MjcsIDB4ODgsCi0JMHg3NSwgMHg1OSwgMHhhMywgMHg3ZSwgMHhiYSwgMHhiMSwgMHg4OSwgMHhlYiwgMHg2YSwgMHgwMywgMHgyZiwgMHgyOSwKLQkweGQyLCAweGVmLCAweGI4LCAweDEwLCAweDdlLCAweDRhLCAweGY0LCAweDQ1LCAweGNjLCAweGJjLCAweDAwLCAweGZjLAotCTB4MjUsIDB4ZjEsIDB4NjcsIDB4YzMsIDB4YTQsIDB4MmEsIDB4N2UsIDB4ZGYsIDB4NGYsIDB4NWMsIDB4ZDMsIDB4NWIsCi0JMHg0MCwgMHg3ZCwgMHhlYywgMHg0MSwgMHg4YywgMHg5OCwgMHg2NSwgMHhjNCwgMHhlNywgMHhkNSwgMHhjNCwgMHhiNSwKLQkweDhiLCAweDRkLCAweGFjLCAweDUzLCAweDFiLCAweDRkLCAweGYzLCAweDZmLCAweDliLCAweDYxLCAweDNhLCAweDEyLAotCTB4OWEsIDB4NWUsIDB4ZWIsIDB4MmMsIDB4N2MsIDB4YTUsIDB4MGEsIDB4ZGEsIDB4OTIsIDB4NWYsIDB4ZDEsIDB4MGEsCi0JMHgzZiwgMHg0NSwgMHg3NCwgMHhmOCwgMHgzYywgMHg0NCwgMHhhZiwgMHhjMCwgMHhkYSwgMHg0NSwgMHgxNywgMHhkNiwKLQkweDUxLCAweDllLCAweDZkLCAweDkzLCAweDVjLCAweDliLCAweGY4LCAweDI0LCAweDRhLCAweDk5LCAweDc2LCAweDRlLAotCTB4MTIsIDB4NzMsIDB4NjksIDB4M2UsIDB4YWMsIDB4YTEsIDB4OGUsIDB4ODcsIDB4NGUsIDB4OTksIDB4NjYsIDB4MzksCi0JMHg3NSwgMHhkYywgMHg0MCwgMHhmYiwgMHhlYywgMHgzZiwgMHg2MSwgMHhlMiwgMHgyNSwgMHhmZCwgMHgyNSwgMHhlYSwKLQkweDU0LCAweDIxLCAweDZlLCAweDZjLCAweGU2LCAweDNiLCAweDQxLCAweDNlLCAweGVmLCAweGMxLCAweDgxLCAweDQ5LAotCTB4ZTksIDB4OTcsIDB4ZWEsIDB4ZjgsIDB4Y2MsIDB4NDUsIDB4MWMsIDB4Y2YsIDB4YzQsIDB4ZDAsIDB4NDQsIDB4ZmQsCi0JMHg4NSwgMHg0OSwgMHhiMywgMHg5MSwgMHhlZiwgMHg4NCwgMHg0OSwgMHgyZiwgMHhiYywgMHhmOCwgMHgzNSwgMHg2YywKLQkweDNmLCAweGE1LCAweDQwLCAweDhiLCAweDhhLCAweDBlLCAweGJlLCAweDg2LCAweGY2LCAweDMzLCAweDVmLCAweDk0LAotCTB4MTMsIDB4OTgsIDB4YTUsIDB4YTYsIDB4ZDUsIDB4ODksIDB4MDIsIDB4ZjEsIDB4NzcsIDB4NTUsIDB4NjIsIDB4MDQsCi0JMHhhYywgMHhkZiwgMHg3OCwgMHg3MywgMHg1NiwgMHhjMSwgMHhkNCwgMHgzNCwgMHhmYiwgMHhiZCwgMHg4ZCwgMHgzMCwKLQkweDJiLCAweDI4LCAweGQzLCAweDFiLCAweGIzLCAweGJmLCAweDgxLCAweDY3LCAweDRlLCAweDUyLCAweDBmLCAweDRmLAotCTB4MDcsIDB4ZjEsIDB4YmQsIDB4OGMsIDB4MGIsIDB4YjcsIDB4NGUsIDB4MDksIDB4YTYsIDB4ZDMsIDB4NjIsIDB4MDcsCi0JMHgxNSwgMHhlOSwgMHg4ZiwgMHhhNCwgMHg2ZiwgMHg4OSwgMHg4NiwgMHhkZCwgMHg4YSwgMHgwMywgMHhmNSwgMHhjZiwKLQkweGI4LCAweGEwLCAweDlkLCAweDBiLCAweGMzLCAweDVkLCAweGVmLCAweDgxLCAweDU2LCAweGZmLCAweGZiLCAweGNjLAotCTB4MzUsIDB4MGUsIDB4OTQsIDB4YjEsIDB4OTcsIDB4ZWQsIDB4ZmMsIDB4NzYsIDB4OGMsIDB4ZDcsIDB4ODIsIDB4YmMsCi0JMHg4NiwgMHhkZiwgMHgyOCwgMHg4NywgMHg3MywgMHg5NSwgMHg5MywgMHgzNSwgMHhiYywgMHg0YywgMHgyMywgMHgxZSwKLQkweDczLCAweDk5LCAweGE2LCAweDkzLCAweGI1LCAweDYxLCAweGY3LCAweDc3LCAweDRjLCAweDMzLCAweGIyLCAweDQxLAotCTB4OWUsIDB4MGYsIDB4MjAsIDB4NzIsIDB4NGUsIDB4ZTMsIDB4NzMsIDB4NzYsIDB4YmQsIDB4YmMsIDB4OGUsIDB4YzcsCi0JMHg5YywgMHhmNCwgMHgyMywgMHg4OSwgMHg1NSwgMHhkNiwgMHg3YiwgMHhhYiwgMHg4NywgMHhiMiwgMHg3MSwgMHhmYiwKLQkweDBiLCAweDc5LCAweGMxLCAweDM2LCAweDYxLCAweDRiLCAweDg2LCAweGIzLCAweGQzLCAweDBhLCAweDczLCAweDc2LAotCTB4ODIsIDB4Y2YsIDB4NmUsIDB4ODEsIDB4MzMsIDB4YWUsIDB4NGUsIDB4YTQsIDB4ZTksIDB4MDcsIDB4N2IsIDB4MDMsCi0JMHgyZCwgMHg3OCwgMHhjZSwgMHg3MCwgMHhhMywgMHg1MiwgMHg1YiwgMHg4NSwgMHgwNywgMHg3YSwgMHgwMywgMHg3OCwKLQkweDhlLCAweDdkLCAweDAxLCAweDZkLCAweDE2LCAweDJiLCAweDgwLCAweDhkLCAweGI0LCAweDlmLCAweGY0LCAweDFjLAotCTB4M2YsIDB4ODQsIDB4ZjYsIDB4NmQsIDB4MDcsIDB4ZjMsIDB4OWMsIDB4ZDMsIDB4Y2EsIDB4NzMsIDB4NjUsIDB4ZjUsCi0JMHg0MCwgMHgyMSwgMHhlNywgMHhjMiwgMHgwNSwgMHhjZCwgMHhjNiwgMHg4NCwgMHgyZiwgMHg1OCwgMHgzNSwgMHg1YiwKLQkweDBkLCAweDE0LCAweGFlLCAweDYxLCAweDQxLCAweGI1LCAweDI1LCAweGE5LCAweDkwLCAweDE5LCAweGJmLCAweGU4LAotCTB4YWUsIDB4ZGYsIDB4NjUsIDB4ZmIsIDB4ZDIsIDB4ZGYsIDB4MzgsIDB4YTUsIDB4ZTcsIDB4YjgsIDB4ZmUsIDB4YmQsCi0JMHgwMiwgMHg4ZSwgMHg4NCwgMHgxYSwgMHg2YSwgMHg3MywgMHhjMiwgMHhlMywgMHg0YSwgMHgwYywgMHhiNSwgMHg4ZSwKLQkweDZiLCAweDVmLCAweGJhLCAweDgxLCAweGY3LCAweDI2LCAweDhjLCAweGU1LCAweGFmLCAweGY3LCAweGRhLCAweDVkLAotCTB4MTksIDB4Y2IsIDB4ODcsIDB4YmEsIDB4NDQsIDB4ZjcsIDB4NGYsIDB4ZTgsIDB4OTIsIDB4NjcsIDB4NTMsIDB4NGEsCi0JMHgzYiwgMHhmMywgMHg1NiwgMHhkYSwgMHg4NSwgMHg3NCwgMHgxNSwgMHg5ZiwgMHhhMSwgMHhmZSwgMHg3MSwgMHg3NCwKLQkweDUyLCAweGU4LCAweDFjLCAweGM2LCAweDc4LCAweDQ2LCAweDY2LCAweDFiLCAweGMzLCAweGQ4LCAweDZjLCAweDQ0LAotCTB4NjIsIDB4NGIsIDB4ZWMsIDB4YTEsIDB4OGYsIDB4NDAsIDB4ZTYsIDB4MTAsIDB4OGQsIDB4ODUsIDB4NTcsIDB4MTQsCi0JMHgzNSwgMHg3NSwgMHg4YiwgMHg1MywgMHgxZCwgMHg1YSwgMHg1NiwgMHhlYywgMHhiYywgMHhiNSwgMHhiNiwgMHg5OCwKLQkweGI3LCAweGQ2LCAweGU0LCAweDU2LCAweGY5LCAweDdiLCAweDU4LCAweDBmLCAweDdhLCAweDE2LCAweDRhLCAweGY1LAotCTB4YTEsIDB4NDcsIDB4ZTksIDB4YjQsIDB4NmEsIDB4NmIsIDB4YmYsIDB4YjIsIDB4NjMsIDB4YzEsIDB4YTMsIDB4NzQsCi0JMHg2NCwgMHgzZCwgMHg3OCwgMHg4NSwgMHg1OCwgMHg2YywgMHhiNiwgMHgwZiwgMHg4MSwgMHg1YiwgMHgzNywgMHhjMiwKLQkweGJiLCAweDIzLCAweGRiLCAweDhiLCAweDcyLCAweDRkLCAweDdhLCAweGM4LCAweDcyLCAweDc0LCAweDVhLCAweDc1LAotCTB4YWQsIDB4Y2UsIDB4ZGYsIDB4YzMsIDB4ZmEsIDB4ZDMsIDB4OTMsIDB4ZWYsIDB4NjMsIDB4ZmUsIDB4NDMsIDB4YzAsCi0JMHg5YiwgMHhiMCwgMHg2NywgMHgwNiwgMHg5MiwgMHgwYiwgMHhlZiwgMHhlMCwgMHhiYiwgMHg0YiwgMHhmMSwgMHgxNSwKLQkweDgwLCAweDVkLCAweGZmLCAweDk0LCAweDdlLCAweGY2LCAweDEyLCAweGQ1LCAweDFiLCAweDE0LCAweDVjLCAweGJhLAotCTB4Y2IsIDB4MDMsIDB4ZDIsIDB4NjIsIDB4Y2YsIDB4N2YsIDB4YjEsIDB4ZjUsIDB4YzIsIDB4NzQsIDB4YWYsIDB4ZDIsCi0JMHgzMSwgMHgzNywgMHhlZiwgMHhkZCwgMHg2NiwgMHhjOCwgMHgyYywgMHg2MiwgMHhkNiwgMHhkYiwgMHg0ZSwgMHgxZSwKLQkweGRhLCAweDE3LCAweDllLCAweGY2LCAweDZlLCAweDI1LCAweDRmLCAweDViLCAweDE3LCAweDNlLCAweDRmLCAweDUzLAotCTB4ZWEsIDB4Y2EsIDB4NDQsIDB4NmIsIDB4MWIsIDB4NjMsIDB4N2IsIDB4YjcsIDB4ZmUsIDB4OTEsIDB4MTksIDB4ZmUsCi0JMHgxZCwgMHhhMSwgMHhiMywgMHg1OCwgMHhkNCwgMHg2NywgMHg5MiwgMHg3YywgMHgwNSwgMHgzZCwgMHg5ZCwgMHhmOSwKLQkweDgwLCAweDI3LCAweDk5LCAweDZmLCAweGY3LCAweGI2LCAweDE5LCAweGJkLCAweGRlLCAweGFkLCAweDQ2LCAweDlmLAotCTB4YjcsIDB4ZGQsIDB4YjgsIDB4ODcsIDB4YjQsIDB4N2IsIDB4YmMsIDB4MWQsIDB4MDYsIDB4ZTMsIDB4M2EsIDB4ZGYsCi0JMHg0NywgMHhiZCwgMHhmNiwgMHg2MiwgMHgzYywgMHg3ZiwgMHgwZiwgMHhiMSwgMHg4NywgMHhkMCwgMHgxYywgMHgyMCwKLQkweDBlLCAweGYyLCAweDUyLCAweGM2LCAweDExLCAweGNhLCAweDU4LCAweDA4LCAweGI5LCAweDkxLCAweDU0LCAweGRkLAotCTB4ZDQsIDB4ZDcsIDB4OTgsIDB4NjUsIDB4YzcsIDB4MDksIDB4NmIsIDB4MTYsIDB4NTUsIDB4OTEsIDB4OTgsIDB4NmMsCi0JMHhlZCwgMHgzZSwgMHhjMSwgMHg3YywgMHg5ZiwgMHgzOCwgMHhkYSwgMHg3YSwgMHhlYiwgMHgyOSwgMHhkNCwgMHhiOCwKLQkweDEzLCAweGQyLCAweDNiLCAweGIzLCAweDFmLCAweDhlLCAweDQ2LCAweGY1LCAweGY3LCAweDEwLCAweDBkLCAweGJkLAotCTB4YzIsIDB4NjcsIDB4NDcsIDB4ZTksIDB4YmIsIDB4NjMsIDB4ZDYsIDB4ZmMsIDB4ODEsIDB4MDYsIDB4YzksIDB4MzUsCi0JMHhhMSwgMHhkYiwgMHhmMCwgMHg3OCwgMHg3NywgMHhiMiwgMHgzNywgMHhmMywgMHgyNywgMHhkNCwgMHg5NiwgMHgzYiwKLQkweDljLCAweDMyLCAweDBmLCAweDI5LCAweGZjLCAweDk2LCAweDBmLCAweDRkLCAweGU4LCAweGNhLCAweDdiLCAweDI4LAotCTB4ZDcsIDB4OTcsIDB4ZjAsIDB4MGYsIDB4MjcsIDB4NTksIDB4ZDcsIDB4MjAsIDB4N2UsIDB4NjgsIDB4OWEsIDB4ZjcsCi0JMHhiMSwgMHhhZiwgMHgzOSwgMHg5NiwgMHhhYiwgMHhjMywgMHg2NSwgMHhjYiwgMHhjNiwgMHgyZSwgMHgxYywgMHhjZCwKLQkweDg1LCAweGYxLCAweDBlLCAweGU1LCAweDczLCAweDJkLCAweGQ2LCAweGUyLCAweGVkLCAweDY5LCAweDI3LCAweGY2LAotCTB4ZTksIDB4YjcsIDB4MTcsIDB4ZWIsIDB4ODUsIDB4MDMsIDB4ZjcsIDB4YzYsIDB4MGUsIDB4MTEsIDB4M2IsIDB4MzgsCi0JMHg1MCwgMHg0ZCwgMHhmYywgMHhmNiwgMHhiMCwgMHg3NSwgMHhjZCwgMHhjOSwgMHhmZSwgMHhlZiwgMHhiNywgMHg5MSwKLQkweGIyLCAweGViLCAweDA5LCAweDc5LCAweDdjLCAweDk0LCAweDNjLCAweDM2LCAweDdiLCAweGI3LCAweDY2LCAweDU1LAotCTB4ZWYsIDB4OWQsIDB4NTksIDB4NzgsIDB4ZGMsIDB4ODksIDB4ZDEsIDB4ZDYsIDB4MzMsIDB4MjcsIDB4NGQsIDB4MGMsCi0JMHhlYSwgMHhiNywgMHhlMSwgMHhjYSwgMHhjOSwgMHhkMSwgMHgyMSwgMHgxNywgMHhmZCwgMHhlNywgMHhlNywgMHhmMSwKLQkweDdlLCAweDE4LCAweDMzLCAweGI4LCAweDQwLCAweGU0LCAweDcxLCAweGQxLCAweGM3LCAweGRjLCAweGRlLCAweDEwLAotCTB4OGYsIDB4MDYsIDB4NTgsIDB4OGIsIDB4ZjUsIDB4MDUsIDB4YzYsIDB4NjYsIDB4MDcsIDB4ZDQsIDB4MjEsIDB4ZDYsCi0JMHhlNCwgMHhhNCwgMHgzMywgMHgxMSwgMHgxZCwgMHgxOCwgMHgyMywgMHg3OCwgMHhhYywgMHgyMiwgMHgzZiwgMHg1ZSwKLQkweGU2LCAweDZlLCAweGRmLCAweDYyLCAweGQ4LCAweGJiLCAweDliLCAweGY1LCAweDI2LCAweGM0LCAweGZlLCAweGNlLAotCTB4MWIsIDB4YzUsIDB4ZWQsIDB4YjUsIDB4ODgsIDB4YzYsIDB4OTYsIDB4MjksIDB4YjcsIDB4N2IsIDB4YjEsIDB4YzksCi0JMHg3YiwgMHgwNywgMHhlYiwgMHhjNywgMHhlNSwgMHhhOCwgMHgzOSwgMHhmMiwgMHg5MiwgMHhlZSwgMHg4MywgMHg3ZiwKLQkweDUxLCAweGE3LCAweGJlLCAweGZiLCAweDMxLCAweGJhLCAweGMwLCAweDk2LCAweDJiLCAweGNhLCAweDllLCAweDdmLAotCTB4YjEsIDB4YzUsIDB4YmIsIDB4OTMsIDB4YjEsIDB4NTksIDB4NDUsIDB4MTMsIDB4MzUsIDB4MmUsIDB4MjYsIDB4YmQsCi0JMHhkMiwgMHhmMywgMHgzNSwgMHgyZCwgMHg2ZSwgMHgyMiwgMHg3ZiwgMHhlMiwgMHhhMywgMHg5OSwgMHhkNiwgMHhjZCwKLQkweGY0LCAweDg3LCAweGYwLCAweDIyLCAweDNhLCAweDk5LCAweGU2LCAweDVlLCAweDI2LCAweGNkLCAweGZlLCAweDEwLAotCTB4MzEsIDB4ZWMsIDB4ODEsIDB4OGQsIDB4M2UsIDB4ZTYsIDB4MjksIDB4ZDEsIDB4MjUsIDB4ZjUsIDB4OTgsIDB4MmYsCi0JMHhjOSwgMHgyNCwgMHg3NSwgMHhmOSwgMHg2OCwgMHhlYiwgMHhlMiwgMHgyOSwgMHhhOSwgMHhjYiwgMHhhOSwgMHhkNiwKLQkweGNjLCAweDI5LCAweDBkLCAweGVmLCAweGIwLCAweGI2LCAweGFjLCAweDhkLCAweGFiLCAweGZhLCAweDM5LCAweDI1LAotCTB4MTIsIDB4YmEsIDB4NDgsIDB4NTksIDB4NWMsIDB4ZjgsIDB4ODUsIDB4YjksIDB4NTcsIDB4OGIsIDB4MTYsIDB4NmUsCi0JMHg2MSwgMHgzYywgMHg1NSwgMHgzMywgMHgzNywgMHg4NiwgMHg5OCwgMHhmMywgMHhhYiwgMHgxNywgMHhhOSwgMHg5OCwKLQkweDQ1LCAweGE3LCAweDFiLCAweDE1LCAweDIxLCAweDc4LCAweGEyLCAweDFhLCAweGRlLCAweDNkLCAweDE5LCAweGEzLAotCTB4MWUsIDB4YWUsIDB4ZDEsIDB4M2MsIDB4NDgsIDB4YTgsIDB4MzUsIDB4YzgsIDB4NTIsIDB4ZjgsIDB4ZDgsIDB4MzMsCi0JMHhmNCwgMHhjNSwgMHg3MSwgMHhhZSwgMHg1YiwgMHhiNiwgMHgyOCwgMHgzYywgMHhjYiwgMHhmMywgMHg0MSwgMHgzZSwKLQkweDdmLCAweDdkLCAweGVkLCAweDZhLCAweGFlLCAweGZkLCAweGQxLCAweDI5LCAweGYxLCAweGQ3LCAweDU0LCAweGViLAotCTB4ODUsIDB4OTMsIDB4ZjYsIDB4ZGEsIDB4ZDEsIDB4NzgsIDB4MGMsIDB4MWYsIDB4OWUsIDB4NTQsIDB4ODcsIDB4ZGYsCi0JMHg1NSwgMHgyMiwgMHgwMywgMHgxNywgMHgxNCwgMHg1OSwgMHgxZiwgMHg3NSwgMHg1NSwgMHhiOCwgMHg2MiwgMHg4ZSwKLQkweDQ2LCAweGEzLCAweGE5LCAweGJkLCAweGE0LCAweGQ5LCAweGIyLCAweDg5LCAweGZhLCAweGI3LCAweGY4LCAweGEwLAotCTB4Y2YsIDB4MzMsIDB4Y2YsIDB4YmEsIDB4YzksIDB4OGYsIDB4Y2QsIDB4NGIsIDB4MWQsIDB4NjksIDB4OWYsIDB4MmMsCi0JMHhmNiwgMHg2YSwgMHhlYywgMHg1MywgMHhhZiwgMHhmMywgMHgxMywgMHhhNCwgMHgxZSwgMHgzYywgMHhiYiwgMHg5YiwKLQkweDdkLCAweGE4LCAweGI1LCAweDllLCAweDBiLCAweGYwLCAweDM5LCAweGQxLCAweGMzLCAweDJmLCAweDE1LCAweDg3LAotCTB4ZjYsIDB4MWUsIDB4ZjMsIDB4OTgsIDB4ZTQsIDB4OTIsIDB4MjAsIDB4NzMsIDB4ZDgsIDB4M2QsIDB4ZDIsIDB4ZDMsCi0JMHhhNiwgMHhkMywgMHhmNCwgMHg3NywgMHgzNywgMHhmZCwgMHg3ZCwgMHg5YiwgMHhmOCwgMHhiNCwgMHg0MSwgMHg5ZiwKLQkweDM2LCAweGU4LCAweGQzLCAweDg2LCAweDFhLCAweDFhLCAweDQ2LCAweDI0LCAweDMwLCAweDQ4LCAweGJiLCAweDI1LAotCTB4NDMsIDB4ZTIsIDB4ZWIsIDB4N2QsIDB4ZDgsIDB4YzcsIDB4ZGYsIDB4ZmQsIDB4YmMsIDB4N2YsIDB4OTQsIDB4N2QsCi0JMHgyZSwgMHg1NiwgMHhjOCwgMHg5YSwgMHg4NywgMHhkMSwgMHg2ZSwgMHgzYywgMHg4NiwgMHhhMSwgMHgyYywgMHg3ZSwKLQkweGU1LCAweDZkLCAweDJlLCAweDQ3LCAweGY5LCAweDFhLCAweGU5LCAweGUxLCAweGQ1LCAweGMwLCAweDMxLCAweDNjLAotCTB4YzYsIDB4M2UsIDB4ZWEsIDB4OTcsIDB4NGEsIDB4YTUsIDB4ZTYsIDB4ZWEsIDB4M2QsIDB4YWUsIDB4YTgsIDB4ODEsCi0JMHg3NiwgMHhmNiwgMHhjMywgMHg3YiwgMHhmMywgMHhmNywgMHhkMCwgMHhiZSwgMHg5MSwgMHhhMSwgMHg1NywgMHgxNCwKLQkweGY2LCAweDUyLCAweGI1LCAweDVjLCAweDliLCAweGIxLCAweDc0LCAweDI3LCAweGQ3LCAweDMxLCAweDg0LCAweDBmLAotCTB4MmIsIDB4ZGYsIDB4ZmUsIDB4MWUsIDB4NDQsIDB4YjcsIDB4M2YsIDB4NmEsIDB4MTgsIDB4ZTQsIDB4ZmEsIDB4MzYsCi0JMHgxZiwgMHhhMywgMHhlYywgMHgyOSwgMHgwNywgMHgxOSwgMHg2MywgMHhmYiwgMHhhYywgMHhmOCwgMHhlYSwgMHgyMywKLQkweDhkLCAweGViLCAweDc5LCAweDZjLCAweDZiLCAweDQ2LCAweDZhLCAweGE5LCAweDg5LCAweGM3LCAweDc1LCAweDEzLAotCTB4Y2YsIDB4ZjIsIDB4NzcsIDB4ODksIDB4YjksIDB4NmMsIDB4ZWMsIDB4ODYsIDB4NWMsIDB4ZTYsIDB4ZTAsIDB4NzMsCi0JMHhiYiwgMHhmOSwgMHg1YywgMHgwYiwgMHg1MywgMHhlNywgMHhjMiwgMHg5YywgMHhjYywgMHgwNiwgMHgwZiwgMHhjYiwKLQkweDZjLCAweDEwLCAweDM5LCAweDQzLCAweDc0LCAweDNmLCAweDhjLCAweDBiLCAweDk5LCAweDQ4LCAweGNhLCAweGU5LAotCTB4MzQsIDB4NDcsIDB4MTgsIDB4NTcsIDB4NGIsIDB4MWYsIDB4ZDEsIDB4NzcsIDB4NWYsIDB4ZGYsIDB4YTgsIDB4ZjYsCi0JMHg1MiwgMHg4NywgMHhiMSwgMHg0OSwgMHg0NSwgMHgwZCwgMHhiZCwgMHg4NiwgMHg0MiwgMHhhNywgMHgwNywgMHg4ZCwKLQkweGUxLCAweDc1LCAweGNlLCAweDY4LCAweGUwLCAweDJjLCAweGQ0LCAweGMyLCAweDIwLCAweDI1LCAweDdkLCAweDNhLAotCTB4NmYsIDB4ZTcsIDB4YmEsIDB4Y2QsIDB4YzUsIDB4NWMsIDB4ZDcsIDB4OTIsIDB4YWIsIDB4NTAsIDB4ZWUsIDB4Y2MsCi0JMHhiMiwgMHgzZSwgMHhjZiwgMHg5OSwgMHg2OSwgMHgzZiwgMHhlYiwgMHg1NSwgMHg3ZSwgMHg0ZSwgMHg2OCwgMHg4ZiwKLQkweGEwLCAweDMxLCAweDJlLCAweGI0LCAweGI0LCAweGFlLCAweDQ5LCAweDA1LCAweDVmLCAweGFmLCAweDQ0LCAweDk0LAotCTB4YjUsIDB4MGEsIDB4N2EsIDB4YjksIDB4OTYsIDB4MzYsIDB4NTksIDB4OTMsIDB4MDIsIDB4ZWUsIDB4ODQsIDB4ZDQsCi0JMHhjZSwgMHgxZSwgMHhmNiwgMHgyZCwgMHg3ZCwgMHhjYywgMHg4YiwgMHg4MiwgMHhhOSwgMHg2NSwgMHg1ZSwgMHg2YSwKLQkweGU3LCAweGEzLCAweDZkLCAweDc5LCAweGIxLCAweDhiLCAweGQ4LCAweDQ0LCAweDZjLCAweDczLCAweDE4LCAweDA3LAotCTB4YWMsIDB4NzksIDB4YjQsIDB4ODksIDB4NjksIDB4NWQsIDB4NzIsIDB4ODMsIDB4ZDgsIDB4ZTksIDB4MzAsIDB4ZjYsCi0JMHhlNywgMHhkZCwgMHhiOCwgMHg5NywgMHg3OSwgMHg3MCwgMHhiZSwgMHg5OSwgMHhiYSwgMHhmMiwgMHhiYiwgMHgzMSwKLQkweDM4LCAweDc3LCAweDNiLCAweGY2LCAweDY1LCAweDY1LCAweDllLCAweGUwLCAweGE2LCAweGZkLCAweDkyLCAweGM0LAotCTB4NDAsIDB4Y2MsIDB4M2EsIDB4YzQsIDB4M2YsIDB4NjUsIDB4NWEsIDB4NDksIDB4YTcsIDB4NDIsIDB4NWIsIDB4NzQsCi0JMHg1YSwgMHhmYSwgMHhiZSwgMHhlMCwgMHhiNiwgMHg3NSwgMHg2YywgMHhjZiwgMHgyZCwgMHg5ZCwgMHgwOSwgMHg1OSwKLQkweGFiLCAweDM0LCAweGIzLCAweGI0LCAweGY1LCAweGRhLCAweDk5LCAweDkxLCAweDM1LCAweDRkLCAweDljLCAweGQ1LAotCTB4NmQsIDB4NGMsIDB4NWIsIDB4ZDIsIDB4NjcsIDB4ODgsIDB4MzIsIDB4ZDcsIDB4NmMsIDB4MDIsIDB4ZDYsIDB4ZGQsCi0JMHg4MCwgMHg2YiwgMHgyYiwgMHg3OCwgMHhhZCwgMHhmYiwgMHgzYSwgMHhhZSwgMHhlZCwgMHgxNywgMHhlYywgMHg0YywKLQkweDVjLCAweGRiLCAweGI1LCAweDgzLCAweGI4LCAweGI2LCAweDVlLCAweDI5LCAweDYxLCAweDVhLCAweDk5LCAweDU5LAotCTB4OTQsIDB4NzAsIDB4NmQsIDB4NzUsIDB4MzEsIDB4N2YsIDB4MWYsIDB4YzYsIDB4NWUsIDB4NjIsIDB4OWUsIDB4ZGEsCi0JMHhmYSwgMHgxMSwgMHg3OCwgMHhkNiwgMHgzYiwgMHgzZSwgMHg3MywgMHg2MCwgMHg4NCwgMHhiZCwgMHg0YywgMHgxOSwKLQkweGIwLCAweGQyLCAweGM0LCAweDJkLCAweDFiLCAweGQyLCAweDY2LCAweGI5LCAweDU2LCAweDFmLCAweDJlLCAweDc3LAotCTB4YzgsIDB4NGMsIDB4M2EsIDB4OWEsIDB4MWUsIDB4NjMsIDB4OWUsIDB4NzEsIDB4YWMsIDB4NTcsIDB4ZDMsIDB4NDksCi0JMHg3OCwgMHgwMiwgMHgzNSwgMHhkYSwgMHgzZCwgMHhjNSwgMHg1ZSwgMHgyMiwgMHhlNCwgMHhkOSwgMHg0ZSwgMHg0YywKLQkweDE0LCAweDhkLCAweDdmLCAweDZhLCAweGNlLCAweDA2LCAweDg1LCAweDQ2LCAweGExLCAweGUwLCAweDQxLCAweGYyLAotCTB4MTEsIDB4MGYsIDB4NmIsIDB4ZDQsIDB4YjIsIDB4MzIsIDB4ODEsIDB4ZDcsIDB4YTMsIDB4MjEsIDB4Y2YsIDB4Y2UsCi0JMHg3YywgMHhkYSwgMHhkYiwgMHhkZCwgMHg3MCwgMHgwYiwgMHg3YSwgMHg0ZSwgMHg0OSwgMHgzZCwgMHgwYSwgMHg2MywKLQkweGM3LCAweGE5LCAweDc2LCAweGQ2LCAweDIwLCAweDBkLCAweDFkLCAweDkzLCAweDVkLCAweGVjLCAweGYxLCAweDdhLAotCTB4OTUsIDB4ZGUsIDB4MzksIDB4ZDEsIDB4YTEsIDB4ZDgsIDB4NDAsIDB4MGQsIDB4ODQsIDB4MWQsIDB4MzcsIDB4Y2UsCi0JMHg0YywgMHg0YiwgMHhmZCwgMHhmMiwgMHg3YiwgMHg5NiwgMHg3ZiwgMHg4ZCwgMHhlYiwgMHgwMSwgMHhlYSwgMHhlNywKLQkweGFhLCAweDFiLCAweDdlLCAweDEzLCAweDY3LCAweDc0LCAweGYxLCAweDRiLCAweDdlLCAweDM3LCAweDkyLCAweGQ4LAotCTB4ZDYsIDB4M2MsIDB4NmQsIDB4YmEsIDB4MzQsIDB4OTksIDB4N2QsIDB4ODcsIDB4MmMsIDB4OWIsIDB4NmUsIDB4NjUsCi0JMHg5ZCwgMHg2YiwgMHg5ZiwgMHhlYiwgMHhhMywgMHgxZCwgMHg0YiwgMHg3MywgMHhlZSwgMHgxYiwgMHhlZCwgMHhiOSwKLQkweGM1LCAweGJiLCAweDhkLCAweDM5LCAweDhmLCAweDNkLCAweGJjLCAweGM3LCAweGMzLCAweDNjLCAweGVhLCAweDM5LAotCTB4NjUsIDB4NjIsIDB4NGUsIDB4N2YsIDB4Y2IsIDB4N2MsIDB4NWMsIDB4NzMsIDB4ZDEsIDB4NmUsIDB4NWYsIDB4NjUsCi0JMHg0ZSwgMHgxNiwgMHhjYywgMHg5MiwgMHhmMCwgMHhkZSwgMHgzMSwgMHhlMywgMHg3MiwgMHg1NCwgMHgyNSwgMHhkMCwKLQkweDVjLCAweDQ2LCAweDdmLCAweGJjLCAweDE4LCAweGI3LCAweGU3LCAweDkxLCAweGM3LCAweDczLCAweGI3LCAweDdiLAotCTB4YmIsIDB4YjMsIDB4ZWMsIDB4MzMsIDB4ZDgsIDB4MDcsIDB4ZGIsIDB4YmQsIDB4ZGYsIDB4NTcsIDB4YmQsIDB4N2IsCi0JMHhiMiwgMHg0ZSwgMHhhNSwgMHgzNiwgMHgwMSwgMHg2NywgMHhjYiwgMHgyNiwgMHgxMywgMHgxZiwgMHg2ZiwgMHg4OCwKLQkweGE2LCAweDQyLCAweDBlLCAweGU2LCAweDRmLCAweGQyLCAweDMyLCAweDcyLCAweGNkLCAweGRlLCAweDdlLCAweGU2LAotCTB4ZWIsIDB4OWQsIDB4NTksIDB4YmEsIDB4MDEsIDB4N2QsIDB4YzcsIDB4YmYsIDB4NjEsIDB4NzQsIDB4YzAsIDB4MGYsCi0JMHg5OSwgMHhiMywgMHhlMSwgMHhlYiwgMHg4YywgMHhkOCwgMHgyMCwgMHhmZCwgMHgzMSwgMHhkNCwgMHhhNiwgMHg0NCwKLQkweDk3LCAweDg3LCAweDEwLCAweDVkLCAweGZhLCAweGQ4LCAweGY5LCAweDk2LCAweGY5LCAweDY0LCAweDZlLCAweDEzLAotCTB4OWYsIDB4ZWYsIDB4NjIsIDB4MmUsIDB4NGQsIDB4MzIsIDB4YjcsIDB4OGUsIDB4YTYsIDB4ZGMsIDB4OTAsIDB4NzcsCi0JMHhkNCwgMHhmZSwgMHgzNywgMHg5NSwgMHgwOCwgMHhlMywgMHgwMCwgMHhiZiwgMHhjMywgMHhlNywgMHgwMywgMHgxZCwKLQkweGNjLCAweGEzLCAweDczLCAweDdhLCAweDM0LCAweGI5LCAweDE1LCAweGU5LCAweGFlLCAweDZhLCAweGE4LCAweDdhLAotCTB4ODMsIDB4MjIsIDB4NzMsIDB4MzEsIDB4YjEsIDB4NDMsIDB4MGMsIDB4M2YsIDB4ZTEsIDB4OWEsIDB4MmUsIDB4NGQsCi0JMHhmNCwgMHhiOCwgMHg4NSwgMHhiZSwgMHg0OCwgMHg2YywgMHhlMCwgMHhmOCwgMHhiYywgMHhkZiwgMHhmZCwgMHg1ZSwKLQkweDE5LCAweDJhLCAweDU2LCAweDUwLCAweGI2LCAweDlmLCAweDU4LCAweDM5LCAweGM3LCAweGFiLCAweDY5LCAweGY4LAotCTB4YWYsIDB4YzQsIDB4NGUsIDB4N2YsIDB4OTYsIDB4OTcsIDB4ZjksIDB4NjcsIDB4MDksIDB4MGYsIDB4OGEsIDB4NmYsCi0JMHg2NCwgMHg1YSwgMHg2ZiwgMHg5ZCwgMHg4ZCwgMHgxNSwgMHhlNywgMHhhMSwgMHgxZSwgMHg2ZiwgMHhkNywgMHg4YywKLQkweDg5LCAweGFjLCAweGVlLCAweDg3LCAweGY0LCAweGZmLCAweGU1LCAweGYxLCAweDAyLCAweGQxLCAweDQxLCAweDEzLAotCTB4M2EsIDB4NzgsIDB4YmQsIDB4N2QsIDB4YTYsIDB4NTIsIDB4NjksIDB4Y2YsIDB4OWEsIDB4ZjgsIDB4MzMsIDB4NWQsCi0JMHg0ZCwgMHhiNywgMHgzOSwgMHgxOSwgMHhlZiwgMHhiYSwgMHg3YSwgMHgxNiwgMHhmOCwgMHgxOSwgMHg3MSwgMHg5NCwKLQkweGY4LCAweDk4LCAweDBiLCAweDNlLCAweGNkLCAweGE2LCAweGQ1LCAweDM0LCAweDdiLCAweDNiLCAweGIxLCAweDg1LAotCTB4YzQsIDB4OWYsIDB4NzMsIDB4NmQsIDB4MDUsIDB4OWEsIDB4OTUsIDB4NTksIDB4OTcsIDB4ZTgsIDB4YWQsIDB4MGIsCi0JMHhjOSwgMHg3YywgMHhhNSwgMHhiMiwgMHg4YiwgMHhiYSwgMHhiYywgMHg3MywgMHhiZCwgMHgxNywgMHg5NywgMHgyYywKLQkweDVkLCAweGRlLCAweDRlLCAweDVkLCAweGUyLCAweDhkLCAweGQ1LCAweDcwLCAweDVlLCAweGE4LCAweDA1LCAweGMxLAotCTB4NDQsIDB4YjksIDB4MWEsIDB4MWUsIDB4NzAsIDB4ODgsIDB4NGQsIDB4MTgsIDB4MjcsIDB4ODIsIDB4ZDUsIDB4NTAsCi0JMHhjOSwgMHg3YSwgMHg5ZSwgMHgyNCwgMHgwZSwgMHgyNiwgMHg2ZSwgMHgwYywgMHhmNCwgMHhlMSwgMHhkYiwgMHhjYywKLQkweDRiLCAweDhmLCAweGQzLCAweDZmLCAweDdmLCAweGExLCAweDM1LCAweGExLCAweGUyLCAweDNiLCAweGNkLCAweGI0LAotCTB4ZTksIDB4MjYsIDB4ZWYsIDB4ZjYsIDB4NmMsIDB4M2YsIDB4OWUsIDB4NTgsIDB4MzAsIDB4ZjEsIDB4MGMsIDB4NjMsCi0JMHhhNiwgMHgyMSwgMHg5ZSwgMHgwZSwgMHg5NCwgMHhiMywgMHhhZiwgMHg2MywgMHhlZCwgMHg1YiwgMHgzZSwgMHg2MSwKLQkweGY5LCAweGZjLCAweDY4LCAweGViLCAweDk2LCAweGY5LCAweDEwLCAweDljLCAweGRmLCAweGI2LCAweGY2LCAweDdlLAotCTB4NWEsIDB4YzMsIDB4ZjMsIDB4ZDYsIDB4ZGUsIDB4MGYsIDB4M2YsIDB4NGQsIDB4MGMsIDB4ZWIsIDB4NmEsIDB4ZjIsCi0JMHg2MywgMHg2NywgMHgwNSwgMHgyYSwgMHhhMywgMHhhNiwgMHgzOSwgMHgxYywgMHhiNywgMHhmNiwgMHgxZiwgMHg1YSwKLQkweDYzLCAweGQ2LCAweGZkLCAweGEzLCAweGZjLCAweDJjLCAweGNkLCAweGFlLCAweGZmLCAweDQ2LCAweDMwLCAweDYzLAotCTB4MzgsIDB4NDksIDB4ZjksIDB4NzcsIDB4MTAsIDB4MDcsIDB4ZjQsIDB4MTMsIDB4MDcsIDB4ZDQsIDB4MjYsIDB4ZDQsCi0JMHhlNCwgMHg2ZSwgMHhhNywgMHhjYywgMHg2OSwgMHgwYSwgMHg4NywgMHhhYSwgMHg3OSwgMHhmZCwgMHg4ZSwgMHgyMiwKLQkweDBlLCAweGE4LCAweDNhLCAweDI1LCAweGIzLCAweDNmLCAweDYyLCAweDQ1LCAweGQ4LCAweDdiLCAweDI2LCAweDNkLAotCTB4YzQsIDB4MDEsIDB4MTUsIDB4OTMsIDB4MmUsIDB4NzQsIDB4MTMsIDB4MDMsIDB4YjgsIDB4ODksIDB4ZDksIDB4YjcsCi0JMHhlNSwgMHg2YSwgMHhlMSwgMHgzZCwgMHhlMSwgMHg0NCwgMHgyNCwgMHhmZSwgMHgyMywgMHgxYywgMHhhMiwgMHhiZiwKLQkweDFkLCAweDhhLCAweDc5LCAweDk0LCAweGYwLCAweDJhLCAweDA3LCAweDc1LCAweGY2LCAweDJiLCAweDFjLCAweDBjLAotCTB4MzgsIDB4NTEsIDB4YTUsIDB4YmQsIDB4ODYsIDB4MDcsIDB4YmYsIDB4YTAsIDB4ZjYsIDB4ZjcsIDB4NjcsIDB4MjUsCi0JMHhjZSwgMHg0NywgMHg1YiwgMHhiYiwgMHg0ZiwgMHhkOSwgMHhiNSwgMHhkZiwgMHg3NywgMHg2YSwgMHg3NCwgMHg1OSwKLQkweDZhLCAweDdmLCAweGVkLCAweDg2LCAweDdlLCAweDljLCAweDllLCAweGMxLCAweDM3LCAweDU3LCAweDEzLCAweDY0LAotCTB4ZDYsIDB4NzIsIDB4Y2QsIDB4ZmEsIDB4NzgsIDB4OTQsIDB4M2QsIDB4YjgsIDB4M2EsIDB4ZDQsIDB4YTEsIDB4NDQsCi0JMHgyNywgMHhhYSwgMHg5OCwgMHgwZiwgMHg0ZSwgMHhiMywgMHhmNiwgMHg3YiwgMHgxMiwgMHhkMSwgMHg0MCwgMHhjYywKLQkweDgxLCAweDFlLCAweDM3LCAweDZkLCAweGYzLCAweDNlLCAweGZiLCAweGYxLCAweDlmLCAweGU2LCAweGMyLCAweGE0LAotCTB4NTksIDB4MDYsIDB4MTcsIDB4NmIsIDB4ZmYsIDB4ZmIsIDB4MWEsIDB4M2UsIDB4NzMsIDB4ZDIsIDB4MGYsIDB4ZGYsCi0JMHg3MSwgMHg3YSwgMHg3MCwgMHgzNSwgMHg2NywgMHhkNywgMHhmZSwgMHhlYSwgMHgwNiwgMHg3MywgMHhlNCwgMHg3MiwKLQkweGRjLCAweDg3LCAweDJiLCAweDM5LCAweDlkLCAweGZlLCAweGQ4LCAweDhmLCAweGEzLCAweGFjLCAweGZkLCAweDk3LAotCTB4YjUsIDB4MDAsIDB4M2UsIDB4Y2MsIDB4YjUsIDB4ZDAsIDB4NDcsIDB4ODMsIDB4ZjgsIDB4MzksIDB4NzEsIDB4ZjIsCi0JMHg3YSwgMHhkNiwgMHhmZSwgMHhiYiwgMHhlOCwgMHg1ZiwgMHg3MSwgMHhkNiwgMHhmZSwgMHgzNiwgMHgwYiwgMHg5NywKLQkweDY0LCAweDVhLCAweGNmLCAweDRjLCAweDViLCAweGI1LCAweGJmLCAweGMxLCAweGMxLCAweGJhLCAweGU5LCAweDQ2LAotCTB4NzQsIDB4OTksIDB4MzksIDB4YzMsIDB4ZmMsIDB4YzUsIDB4MjYsIDB4MWYsIDB4OWYsIDB4YTUsIDB4ZGUsIDB4ZjIsCi0JMHgxYiwgMHgzMCwgMHg2YiwgMHhkNSwgMHhhYSwgMHgyZCwgMHhkZSwgMHg1ZCwgMHg1YywgMHg3YiwgMHhhNSwgMHgxNSwKLQkweDczLCAweDI2LCAweDc2LCAweGFjLCAweGZmLCAweDZiLCAweGZjLCAweDQxLCAweDhkLCAweDgzLCAweDNlLCAweDk5LAotCTB4ZjAsIDB4ZGUsIDB4YzksIDB4YjgsIDB4ZjMsIDB4MjcsIDB4NGEsIDB4YjMsIDB4OTEsIDB4MTgsIDB4ZDcsIDB4YjksCi0JMHhkZCwgMHg3YiwgMHgxNywgMHhmZCwgMHhlNCwgMHg5NiwgMHhmNSwgMHhjYywgMHgyYSwgMHgwMSwgMHgzYiwgMHhlNiwKLQkweGRhLCAweDE5LCAweDczLCAweDIxLCAweGM2LCAweGRjLCAweDZhLCAweGM2LCAweGRjLCAweDkzLCAweDdhLCAweDM0LAotCTB4YjYsIDB4ODUsIDB4ZjgsIDB4ZWMsIDB4OTUsIDB4OWMsIDB4YzQsIDB4NWQsIDB4MzMsIDB4ZTksIDB4YWEsIDB4OTQsCi0JMHg2YiwgMHg3NCwgMHg0MCwgMHhlMiwgMHg2NywgMHhjNywgMHhmYSwgMHhkMSwgMHhiMywgMHg5NSwgMHgxMCwgMHg1ZCwKLQkweGUxLCAweGIzLCAweDk1LCAweGM0LCAweDIyLCAweGNjLCAweDUyLCAweDRiLCAweGNiLCAweGNlLCAweDY4LCAweGVhLAotCTB4MzYsIDB4NjcsIDB4NzQsIDB4ZjgsIDB4M2QsIDB4ZTUsIDB4MmQsIDB4ZjMsIDB4MGQsIDB4YzYsIDB4ZGMsIDB4NGUsCi0JMHhjNiwgMHhkYywgMHgyZSwgMHhjNiwgMHg1YywgMHg5YiwgMHg2MSwgMHhlMiwgMHg4NSwgMHhiOCwgMHhkYSwgMHhkZiwKLQkweGU0LCAweDg4LCAweGU4LCAweDZkLCAweDBlLCAweGFjLCAweGFlLCAweDY0LCAweDA5LCAweGYxLCAweDIyLCAweGRhLAotCTB4ZjUsIDB4MDcsIDB4ZTQsIDB4N2YsIDB4NDksIDB4OGYsIDB4ZjYsIDB4YzYsIDB4MTQsIDB4ODksIDB4YjMsIDB4MzAsCi0JMHgzZSwgMHhhMCwgMHhkYywgMHhlNSwgMHhjNSwgMHgzOCwgMHgzYiwgMHgzMCwgMHg3NywgMHhiZSwgMHhlOCwgMHgxYiwKLQkweDI1LCAweGQ5LCAweDlkLCAweDc4LCAweDVlLCAweDY3LCAweDVlLCAweDVkLCAweDIxLCAweGJlLCAweGRiLCAweDg3LAotCTB4MDksIDB4ZWEsIDB4ZDEsIDB4MWIsIDB4ZWQsIDB4YzMsIDB4MzEsIDB4ZDYsIDB4Y2QsIDB4ZmIsIDB4NTgsIDB4YWYsCi0JMHhlZiwgMHgzNywgMHgyMiwgMHgyZCwgMHhkYiwgMHhkOSwgMHgyNywgMHg1ZCwgMHgwYSwgMHhhOSwgMHhlMSwgMHhiMCwKLQkweGQyLCAweDg3LCAweDQxLCAweGZhLCAweGYwLCAweDIwLCAweGViLCAweDRiLCAweDliLCAweGYxLCAweDRiLCAweGE1LAotCTB4ODMsIDB4OTgsIDB4NjIsIDB4N2YsIDB4NWUsIDB4ZGUsIDB4NTMsIDB4NjMsIDB4NjksIDB4YzcsIDB4MTAsIDB4MDYsCi0JMHgxNiwgMHgyNCwgMHhjZiwgMHgyMSwgMHg3MCwgMHg1MywgMHhhMiwgMHgwZiwgMHg1MywgMHg0NiwgMHgxOSwgMHhmYSwKLQkweDlhLCAweDdiLCAweDk0LCAweDNiLCAweGYyLCAweDMyLCAweGE3LCAweDYzLCAweDZjLCAweDFhLCAweDhjLCAweDVkLAotCTB4OGIsIDB4NWYsIDB4MDUsIDB4YjksIDB4NjgsIDB4MGYsIDB4MzIsIDB4MTIsIDB4YWIsIDB4YzYsIDB4MmUsIDB4ZTUsCi0JMHhhZSwgMHgzOSwgMHg4OSwgMHhmNywgMHgzZSwgMHhhNSwgMHg0ZiwgMHhlMiwgMHhkOSwgMHg0OCwgMHgyOSwgMHg3NywKLQkweDRiLCAweDdjLCAweDViLCAweGIzLCAweDZkLCAweGM5LCAweDAxLCAweGIyLCAweGY3LCAweDcxLCAweDNiLCAweGYxLAotCTB4MWUsIDB4MTgsIDB4NWYsIDB4Y2UsIDB4ZWYsIDB4ODQsIDB4MTgsIDB4ODMsIDB4NmQsIDB4NjUsIDB4MGUsIDB4ZmEsCi0JMHg2OSwgMHg4NCwgMHhiNiwgMHg3MywgMHhhMCwgMHg1ZCwgMHhmZiwgMHhiMiwgMHg5OSwgMHgwZSwgMHgwYywgMHgzMCwKLQkweGE2LCAweGZhLCAweDcwLCAweGQ0LCAweDA4LCAweDk5LCAweDk3LCAweDJkLCAweDFjLCAweDUzLCAweGNhLCAweGYxLAotCTB4NWIsIDB4NTgsIDB4ZWIsIDB4NTYsIDB4YzEsIDB4YTMsIDB4NDksIDB4N2QsIDB4ZjcsIDB4MjEsIDB4NTYsIDB4ZTMsCi0JMHg0MSwgMHg4NSwgMHgyNiwgMHhiNSwgMHgyNywgMHhkMywgMHhiYSwgMHg3OCwgMHg0MiwgMHg5MSwgMHgzZSwgMHhhNSwKLQkweDE4LCAweGViLCAweDViLCAweGYwLCAweDAwLCAweDczLCAweGMyLCAweGJlLCAweGY4LCAweGJkLCAweGI4LCAweDNmLAotCTB4NTAsIDB4MDEsIDB4M2YsIDB4ZjUsIDB4ZjQsIDB4NTAsIDB4YzAsIDB4YzcsIDB4NWMsIDB4ZmIsIDB4N2IsIDB4NDUsCi0JMHgzYSwgMHg3ZiwgMHg1MSwgMHg1NiwgMHhlYywgMHhiZiwgMHhhZiwgMHg2MSwgMHhiMCwgMHg1YSwgMHhjNiwgMHhkOCwKLQkweGU2LCAweDE5LCAweDk5LCAweDI3LCAweGE1LCAweDVhLCAweDQzLCAweDMzLCAweDFhLCAweGZjLCAweGVjLCAweDdiLAotCTB4YjcsIDB4YzQsIDB4ZDUsIDB4ZDQsIDB4MTYsIDB4NjcsIDB4NDQsIDB4N2EsIDB4OWEsIDB4OGMsIDB4OWYsIDB4ZjgsCi0JMHgyZiwgMHgxNywgMHg4ZCwgMHhmNiwgMHgzNiwgMHg4OSwgMHg4ZSwgMHhiNSwgMHgxMCwgMHgzYSwgMHhhOSwgMHhhNywKLQkweGVlLCAweDVjLCAweDkwLCAweDMxLCAweGU0LCAweDI4LCAweDE3LCAweDJjLCAweDk1LCAweGNjLCAweDVkLCAweGE3LAotCTB4MTUsIDB4MjIsIDB4YWQsIDB4ZDAsIDB4OGMsIDB4ZTAsIDB4YmEsIDB4MTQsIDB4NzEsIDB4OWQsIDB4YzYsIDB4MzgsCi0JMHgzNCwgMHhjZCwgMHhjZCwgMHhjNCwgMHg3MywgMHhiZSwgMHg1MywgMHgzMiwgMHg5NywgMHg4YSwgMHg0YywgMHgxMCwKLQkweDAzLCAweDM3LCAweDExLCAweDFmLCAweGY3LCAweGQxLCAweGFiLCAweGNkLCAweDViLCAweGVhLCAweGEzLCAweDdhLAotCTB4OWIsIDB4ODIsIDB4YzcsIDB4ZTYsIDB4OWIsIDB4ZTEsIDB4NzEsIDB4OTIsIDB4ZTYsIDB4M2IsIDB4YjksIDB4MDAsCi0JMHgyZSwgMHhlNywgMHg0MiwgMHg3OCwgMHg5YiwgMHhiNCwgMHgyZiwgMHg1OSwgMHhiNCwgMHhlYiwgMHhmMCwgMHhiMywKLQkweDYyLCAweDBlLCAweDhiLCAweDMzLCAweDg3LCAweDZkLCAweGNkLCAweDJhLCAweGY0LCAweGQ3LCAweDMwLCAweDQ2LAotCTB4ZjQsIDB4YmYsIDB4ZmEsIDB4ZWMsIDB4ZDIsIDB4Y2QsIDB4MWUsIDB4ZWEsIDB4NGQsIDB4NjQsIDB4NzEsIDB4ZjEsCi0JMHg3MywgMHgxYywgMHgwZiwgMHg1OSwgMHgzOSwgMHhmYiwgMHhiNSwgMHhjZiwgMHg2NiwgMHg2YiwgMHg2OCwgMHgyYiwKLQkweGVhLCAweGJlLCAweGJhLCAweGY4LCAweGRlLCAweGJhLCAweGQ5LCAweDNmLCAweDJmLCAweGNhLCAweGRiLCAweDUzLAotCTB4YjQsIDB4MzUsIDB4NzEsIDB4OWIsIDB4NzEsIDB4OWUsIDB4ZDcsIDB4MDQsIDB4NDcsIDB4NjksIDB4NzAsIDB4OWMsCi0JMHg4YSwgMHhhMSwgMHhlYywgMHhkNCwgMHgzNSwgMHhmZSwgMHgzNSwgMHg4OSwgMHgxOSwgMHg1NiwgMHhkZSwgMHhjNywKLQkweGJlLCAweDRiLCAweDllLCAweDFlLCAweDIxLCAweDVlLCAweDM0LCAweGM5LCAweGQzLCAweDU1LCAweDhiLCAweDk3LAotCTB4MjAsIDB4NzksIDB4ZjksIDB4ZTQsIDB4YjMsIDB4MTIsIDB4YjYsIDB4MGMsIDB4NWQsIDB4N2IsIDB4MjcsIDB4NDAsCi0JMHg3ZCwgMHhlMCwgMHhkMSwgMHgxMCwgMHhmNSwgMHg3OSwgMHg2NSwgMHhhMywgMHgzYywgMHhlNywgMHhjMywgMHgxZCwKLQkweGI5LCAweDQ0LCAweGI5LCAweGU0LCAweDc5LCAweGFmLCAweGI2LCAweDA1LCAweDdiLCAweGU3LCAweDNlLCAweGFmLAotCTB4ZjcsIDB4MjAsIDB4NmQsIDB4MTEsIDB4YTAsIDB4ZjEsIDB4ZTQsIDB4ZGUsIDB4MTcsIDB4ZDUsIDB4ZDQsIDB4M2YsCi0JMHg0MiwgMHg4YSwgMHgzZCwgMHhkMywgMHgyMywgMHhkOSwgMHgzNCwgMHgxZSwgMHhjYSwgMHg3ZSwgMHhjYiwgMHhkYSwKLQkweGNiLCAweDViLCAweGI3LCAweDAxLCAweGZiLCAweDQ5LCAweGZmLCAweDYwLCAweDM1LCAweGUzLCAweGU4LCAweDdmLAotCTB4YzQsIDB4YTMsIDB4ODIsIDB4YTUsIDB4NzYsIDB4NTUsIDB4NDIsIDB4ZWEsIDB4NmUsIDB4YjQsIDB4ZTUsIDB4MzYsCi0JMHhjNSwgMHg0NCwgMHg1OSwgMHgxYywgMHhjMywgMHhlZCwgMHhjZCwgMHhkMSwgMHhkOCwgMHg2NSwgMHgzYywgMHg2NiwKLQkweGNhLCAweDVjLCAweGRjLCAweDU5LCAweGFjLCAweGMxLCAweGM0LCAweGFmLCAweDRhLCAweDNiLCAweGViLCAweDcwLAotCTB4NWIsIDB4MTEsIDB4NTMsIDB4NmQsIDB4Y2QsIDB4YmYsIDB4ZjUsIDB4YjksIDB4ZDksIDB4ODMsIDB4ZjQsIDB4ZWQsCi0JMHg1MiwgMHg3YiwgMHhiYywgMHg0YSwgMHgxYiwgMHhkNywgMHgzOSwgMHhjYSwgMHg5YywgMHhmZCwgMHhiYywgMHhmZSwKLQkweDUyLCAweDg4LCAweDk1LCAweDE5LCAweGFlLCAweGY1LCAweDBhLCAweDBlLCAweDExLCAweDNmLCAweGE1LCAweDgzLAotCTB4MjYsIDB4NzYsIDB4ZjEsIDB4ZjMsIDB4MDAsIDB4NzEsIDB4ZDYsIDB4YmIsIDB4N2EsIDB4MTUsIDB4NjYsIDB4MDMsCi0JMHgwMSwgMHg2MiwgMHg0YiwgMHhlNiwgMHg2MCwgMHhjNywgMHhkZiwgMHg0OSwgMHg0ZCwgMHg4OCwgMHg4NSwgMHgxZCwKLQkweGIyLCAweDU3LCAweGZmLCAweDZmLCAweGVkLCAweGRmLCAweGFjLCAweDI3LCAweDk2LCAweDExLCAweGQ5LCAweGJkLAotCTB4MGEsIDB4NzMsIDB4NjgsIDB4MGMsIDB4YzQsIDB4MzcsIDB4N2IsIDB4ZjUsIDB4NDIsIDB4ZDgsIDB4ODEsIDB4ZTQsCi0JMHg1NSwgMHgwNywgMHhkNCwgMHhkMywgMHhlZiwgMHhiMCwgMHgxZiwgMHg3YywgMHhhNCwgMHg1ZSwgMHgzZCwgMHhkZCwKLQkweGVhLCAweGQ0LCAweDkwLCAweDlhLCAweGYyLCAweGUwLCAweGUxLCAweGE5LCAweDBlLCAweDU0LCAweDViLCAweDczLAotCTB4YTQsIDB4NzEsIDB4ZGEsIDB4Y2MsIDB4YzEsIDB4M2UsIDB4NmMsIDB4ZjQsIDB4NTMsIDB4MTcsIDB4ZmIsIDB4YjEsCi0JMHhhYiwgMHgxYiwgMHgxZSwgMHg0NSwgMHg4YiwgMHg3NSwgMHg3ZCwgMHgwYywgMHhmYiwgMHhiMywgMHg1ZSwgMHhhNSwKLQkweDNiLCAweGViLCAweDQyLCAweGM3LCAweDVkLCAweDhmLCAweGMyLCAweGJkLCAweDdlLCAweDgwLCAweDdjLCAweGM5LAotCTB4NzUsIDB4ZjksIDB4ZmIsIDB4NmUsIDB4ZjYsIDB4NzEsIDB4YzIsIDB4NWYsIDB4MTksIDB4YzIsIDB4YWIsIDB4YzgsCi0JMHhkYiwgMHg3YSwgMHgwZCwgMHgyMywgMHg1MywgMHgyZSwgMHg2NSwgMHhiNywgMHhmMSwgMHgzNywgMHhlNiwgMHg1NSwKLQkweDZiLCAweDZmLCAweDQ4LCAweGFlLCAweDU1LCAweGM4LCAweDk5LCAweDAxLCAweDNlLCAweDIzLCAweDM5LCAweDY3LAotCTB4MTAsIDB4NTksIDB4YzYsIDB4ZjYsIDB4ZGQsIDB4ZDYsIDB4ZmIsIDB4YTcsIDB4Y2EsIDB4NmMsIDB4OTksIDB4OTIsCi0JMHhlYywgMHg2ZiwgMHhkYiwgMHhlOSwgMHgxZiwgMHhmMiwgMHg0YywgMHg1YiwgMHhmMSwgMHhkYSwgMHg3NiwgMHg4ZiwKLQkweDdkLCAweDJlLCAweDQxLCAweGVjLCAweDNlLCAweDg4LCAweDViLCAweDY5LCAweDg0LCAweGZhLCAweGE4LCAweGY4LAotCTB4ZDgsIDB4MjAsIDB4ZWEsIDB4NzMsIDB4NGMsIDB4YTgsIDB4YWIsIDB4NmMsIDB4N2UsIDB4MWYsIDB4MzQsIDB4MGEsCi0JMHhlYywgMHg0ZCwgMHgzNSwgMHhlNiwgMHg0ZCwgMHhlYSwgMHg2ZSwgMHhhNSwgMHhiYywgMHg0ZiwgMHg0NywgMHhmZCwKLQkweGI1LCAweGY3LCAweDRiLCAweGY1LCAweDU0LCAweDcwLCAweGU5LCAweDE3LCAweGRkLCAweGZmLCAweDRkLCAweGM4LAotCTB4M2QsIDB4OTcsIDB4ZjYsIDB4ODcsIDB4OGMsIDB4ZTMsIDB4NjgsIDB4NmYsIDB4YTUsIDB4NDMsIDB4ZmMsIDB4ZTcsCi0JMHgwZiwgMHg3MSwgMHhmZiwgMHgxYywgMHgxYiwgMHhkNywgMHgwYSwgMHhhMSwgMHg0ZiwgMHhkYywgMHg2YiwgMHhiOCwKLQkweDk0LCAweDJlLCAweGU2LCAweDlmLCAweDAzLCAweDUzLCAweDhlLCAweDNiLCAweGNhLCAweGYwLCAweGU3LCAweDY2LAotCTB4ZjksIDB4Y2EsIDB4MTEsIDB4ZDQsIDB4YzcsIDB4YzcsIDB4ZjgsIDB4YmMsIDB4ODIsIDB4NzYsIDB4NjIsIDB4YzgsCi0JMHgyNywgMHhmNCwgMHhhZCwgMHhlOCwgMHhhOCwgMHg5MSwgMHgxYywgMHhmMCwgMHhiYywgMHgzOSwgMHhkOCwgMHgyNywKLQkweDNhLCAweDU0LCAweGIwLCAweDhkLCAweGQ3LCAweDVmLCAweGEwLCAweDdkLCAweDlmLCAweGQ2LCAweDVkLCAweGE4LAotCTB4NWYsIDB4MjEsIDB4MzMsIDB4NDEsIDB4NzUsIDB4M2EsIDB4ODksIDB4M2QsIDB4MWUsIDB4N2IsIDB4OGYsIDB4MmMsCi0JMHg2ZCwgMHg1NiwgMHg2YiwgMHhkYSwgMHhmMCwgMHg5ZCwgMHg4ZSwgMHhmYSwgMHhlOSwgMHgzNywgMHhlOSwgMHg0ZiwKLQkweDZkLCAweGViLCAweDZmLCAweGJjLCAweDU3LCAweGQyLCAweDg5LCAweDhlLCAweGQwLCAweGZhLCAweGU3LCAweDRjLAotCTB4ZGMsIDB4MzQsIDB4OGEsIDB4YzAsIDB4ZmEsIDB4MWIsIDB4ZWQsIDB4NWYsIDB4ZTIsIDB4ZmIsIDB4MzAsIDB4NjMsCi0JMHgxMCwgMHhlOSwgMHhlYSwgMHg4NCwgMHhjYywgMHg4OSwgMHhhMiwgMHhhNCwgMHg3MywgMHgxOCwgMHhiZiwgMHg5ZiwKLQkweDFmLCAweGMzLCAweGExLCAweGFjLCAweGM4LCAweGI5LCAweDYwLCAweGY5LCAweGI2LCAweGI2LCAweGZlLCAweGJhLAotCTB4NmMsIDB4MGYsIDB4NjYsIDB4YTMsIDB4MDMsIDB4NTUsIDB4NDUsIDB4ZDksIDB4MGUsIDB4YjIsIDB4MWYsIDB4YTksCi0JMHg2NCwgMHg4ZSwgMHg3ZCwgMHg4MCwgMHgzYSwgMHgxZCwgMHhiNiwgMHg3NCwgMHhkYSwgMHgwNywgMHgzZCwgMHg3NywKLQkweDlkLCAweGVlLCAweDEwLCAweGU5LCAweDdhLCAweDEzLCAweGEyLCAweDM3LCAweGQ5LCAweDk3LCAweDYzLCAweDJmLAotCTB4NDAsIDB4YmEsIDB4ZmIsIDB4NmUsIDB4YTAsIDB4M2IsIDB4YTgsIDB4NWYsIDB4YTcsIDB4YmIsIDB4MzcsIDB4MWIsCi0JMHgzZCwgMHhlZCwgMHgyOCwgMHhkMiwgMHhmZCwgMHhjNiwgMHg1YywgMHg4OSwgMHg0NiwgMHgxYSwgMHgzYiwgMHhkNywKLQkweGE3LCAweDkxLCAweGRiLCAweDdjLCAweGQwLCAweDNjLCAweDY4LCAweGU5LCAweGUzLCAweGZiLCAweGQ2LCAweGY1LAotCTB4NmQsIDB4ZjUsIDB4MTIsIDB4MGYsIDB4ZmMsIDB4MzMsIDB4YTEsIDB4NTksIDB4NjcsIDB4MDAsIDB4NmMsIDB4MWMsCi0JMHg3NiwgMHg2MywgMHg3YywgMHhhOCwgMHg2ZiwgMHg3NSwgMHgzYiwgMHg5MywgMHg4YywgMHhlMywgMHhhMCwgMHg2NywKLQkweGZiLCAweGU3LCAweDY2LCAweDFmLCAweDFkLCAweGVjLCAweGQ3LCAweDNhLCAweDhkLCAweDFlLCAweDZmLCAweDk3LAotCTB4ZTEsIDB4MjEsIDB4MDYsIDB4YWIsIDB4NTQsIDB4YjYsIDB4NjUsIDB4NjUsIDB4MDYsIDB4MjIsIDB4YjEsIDB4NWMsCi0JMHhjNCwgMHhjNSwgMHg3OSwgMHhlOSwgMHgwYiwgMHhlZiwgMHg2MSwgMHhjZiwgMHhiMCwgMHg4MSwgMHhmNiwgMHgxZCwKLQkweGMwLCAweDQ0LCAweDdlLCAweDQwLCAweDQ5LCAweDA2LCAweGI5LCAweDhlLCAweDIxLCAweDc1LCAweDA1LCAweGFjLAotCTB4NzksIDB4YmQsIDB4YTgsIDB4YTQsIDB4MmYsIDB4MDUsIDB4MTMsIDB4ZDMsIDB4ODksIDB4OTMsIDB4ZjUsIDB4MjYsCi0JMHg4OCwgMHg1MSwgMHgzYywgMHgyYiwgMHgxMiwgMHhiMywgMHg4OSwgMHg1ZCwgMHhmNSwgMHg0ZSwgMHgxYywgMHhiNywKLQkweGIwLCAweDk4LCAweDNhLCAweGNiLCAweGRmLCAweDY5LCAweDg5LCAweDk5LCAweDNiLCAweGIzLCAweDUyLCAweGM3LAotCTB4MDgsIDB4MjcsIDB4YjUsIDB4MTEsIDB4ZmMsIDB4NjMsIDB4YmMsIDB4MzAsIDB4NWMsIDB4ODMsIDB4ZTQsIDB4N2QsCi0JMHgzNSwgMHg5MCwgMHgxZSwgMHg2MywgMHgwMiwgMHg3ZiwgMHhhOSwgMHg4NSwgMHgzYywgMHhmZCwgMHg3OSwgMHg5NywKLQkweGQyLCAweDZkLCAweGNjLCAweDdiLCAweDc3LCAweDE4LCAweDdlLCAweGY4LCAweGQ4LCAweGJmLCAweGY1LCAweDM4LAotCTB4MjMsIDB4ZWMsIDB4MzksIDB4YWMsIDB4MTksIDB4N2QsIDB4ZWIsIDB4YWQsIDB4YjksIDB4N2UsIDB4NmYsIDB4YmIsCi0JMHg2MSwgMHhlNywgMHhjMiwgMHg1YiwgMHg2NiwgMHgzZCwgMHhkZSwgMHg4ZSwgMHg5OSwgMHg0OCwgMHg2OCwgMHhjMiwKLQkweGMyLCAweDYyLCAweDA3LCAweDViLCAweDIzLCAweDM5LCAweGQzLCAweDdjLCAweDU1LCAweDJmLCAweDVjLCAweDJkLAotCTB4YjcsIDB4YmUsIDB4NGYsIDB4YjcsIDB4YzYsIDB4NzIsIDB4NGQsIDB4ZDgsIDB4NDMsIDB4ZmMsIDB4ZDQsIDB4MzYsCi0JMHhkMywgMHgwNCwgMHg3ZCwgMHgwNiwgMHgzOCwgMHgzMSwgMHgxNSwgMHhjMiwgMHhiYSwgMHhhYywgMHg3YSwgMHgzYSwKLQkweGU1LCAweGVjLCAweGM3LCAweGY0LCAweDQyLCAweDE3LCAweGIyLCAweDc5LCAweGVmLCAweDcyLCAweGQ4LCAweDQxLAotCTB4OGMsIDB4MWQsIDB4NzcsIDB4ZTAsIDB4MGUsIDB4N2QsIDB4ODMsIDB4NTIsIDB4YjAsIDB4NjIsIDB4NWEsIDB4YzEsCi0JMHhkZCwgMHhmYSwgMHgyZSwgMHg2NSwgMHhjMCwgMHhjMiwgMHgxNCwgMHhmMywgMHhjNCwgMHgyMiwgMHgwYSwgMHg2ZSwKLQkweGIyLCAweDcyLCAweGVmLCAweGM5LCAweGQ2LCAweDM4LCAweGYxLCAweGY3LCAweDFkLCAweDU5LCAweGE5LCAweGVmLAotCTB4MjYsIDB4MmUsIDB4YzYsIDB4YTksIDB4OTcsIDB4NzgsIDB4YmEsIDB4ZGYsIDB4Y2QsIDB4N2UsIDB4ZTgsIDB4YTAsCi0JMHhhMiwgMHhmNiwgMHhlYSwgMHg4YSwgMHg4ZCwgMHhmMSwgMHg2ZSwgMHg5YiwgMHhiNywgMHg3MSwgMHhlMSwgMHhhZCwKLQkweGYzLCAweGNkLCAweDVlLCAweGM5LCAweDQxLCAweGVkLCAweGJhLCAweDFhLCAweDcyLCAweDM5LCAweDAyLCAweDE4LAotCTB4YjYsIDB4NjgsIDB4YTQsIDB4NWIsIDB4ZjUsIDB4ZjksIDB4MzIsIDB4YWMsIDB4ZDYsIDB4ZmEsIDB4NzAsIDB4ZGEsCi0JMHg5MiwgMHg2MSwgMHhhMiwgMHg3NSwgMHgwYiwgMHhiMSwgMHhmNiwgMHg5MywgMHg0NiwgMHgzZiwgMHg3YiwgMHg2NSwKLQkweGQ5LCAweDM3LCAweDhkLCAweGM0LCAweDVhLCAweDljLCAweDZkLCAweGM0LCAweGIzLCAweDkxLCAweGYwLCAweGIyLAotCTB4OTIsIDB4NTQsIDB4ZDIsIDB4YWUsIDB4YzYsIDB4ZTQsIDB4M2MsIDB4NTgsIDB4NTEsIDB4NmEsIDB4ZWMsIDB4ZmEsCi0JMHgyNiwgMHgzMiwgMHg0NiwgMHg4OSwgMHhiMywgMHhkYSwgMHhhNiwgMHhiYywgMHhjYiwgMHg0OSwgMHhkOCwgMHg3MywKLQkweDllLCAweDRlLCAweGZkLCAweGZmLCAweGUwLCAweDUyLCAweDUwLCAweDlkLCAweDQ4LCAweDkyLCAweGVmLCAweDBlLAotCTB4ZTYsIDB4ZGQsIDB4NDIsIDB4OWYsIDB4OGIsIDB4ZjcsIDB4NjUsIDB4YmUsIDB4MzcsIDB4ZGMsIDB4M2EsIDB4OWUsCi0JMHg0MSwgMHhjMSwgMHg5OSwgMHg5MCwgMHgxZSwgMHgwYiwgMHhmZSwgMHhkZSwgMHgzYywgMHg2NCwgMHhkNiwgMHhjNCwKLQkweDNlLCAweGUzLCAweDUzLCAweGIzLCAweGI0LCAweGM3LCAweGQ0LCAweDMzLCAweDYzLCAweGVmLCAweDlmLCAweDY1LAotCTB4MTYsIDB4NWMsIDB4ZmUsIDB4MWQsIDB4NDYsIDB4MzMsIDB4OGUsIDB4ZTcsIDB4NWQsIDB4MzcsIDB4ZDAsIDB4OGUsCi0JMHg0ZSwgMHhkYywgMHhlMiwgMHg3MCwgMHgyMCwgMHhiYSwgMHhmZSwgMHg2ZSwgMHhhNSwgMHhiOCwgMHgwNywgMHhjNSwKLQkweDNjLCAweDkxLCAweGIyLCAweDZhLCAweDYyLCAweDE5LCAweGU1LCAweGJjLCAweDcwLCAweDUyLCAweGQ2LCAweGY4LAotCTB4NTYsIDB4ZWIsIDB4ZjgsIDB4NDksIDB4YTksIDB4OTEsIDB4YzMsIDB4YWQsIDB4MjEsIDB4NDMsIDB4ZWQsIDB4OTUsCi0JMHg5ZSwgMHhiMCwgMHg5YSwgMHg3YSwgMHhmYSwgMHg2OCwgMHg1MiwgMHg2YSwgMHhmMCwgMHgxNCwgMHg2YiwgMHhiMCwKLQkweGJhLCAweGRjLCAweGFlLCAweDQ4LCAweDFkLCAweDUzLCAweDYzLCAweDVlLCAweGE3LCAweDAzLCAweDU3LCAweDFhLAotCTB4ZDQsIDB4ZmUsIDB4MWYsIDB4NDAsIDB4MWQsIDB4YjAsIDB4ZTcsIDB4OGEsIDB4OGYsIDB4YjYsIDB4MzYsIDB4MTYsCi0JMHhmMSwgMHhmMCwgMHg2ZCwgMHhmMywgMHg4MywgMHg3MiwgMHhlZSwgMHhjNCwgMHhkMiwgMHg3MSwgMHg1MywgMHg0ZSwKLQkweGIwLCAweGIxLCAweDY5LCAweGJlLCAweDFjLCAweGVmLCAweDIxLCAweDZlLCAweDEwLCAweDZjLCAweDJjLCAweGQ3LAotCTB4MjcsIDB4NWIsIDB4MWIsIDB4NjYsIDB4M2QsIDB4ZTQsIDB4NGQsIDB4YzEsIDB4N2IsIDB4NWEsIDB4MGYsIDB4N2QsCi0JMHhhZiwgMHhjNCwgMHhhMywgMHg4ZCwgMHg5YiwgMHhiNywgMHgxMywgMHgzNywgMHgzYiwgMHgxMywgMHg2YSwgMHhjYiwKLQkweDU2LCAweGUyLCAweDY2LCAweDhkLCAweGZkLCAweDg0LCAweDBiLCAweDdkLCAweDc4LCAweGMyLCAweGIwLCAweDdiLAotCTB4MGEsIDB4YzEsIDB4Y2UsIDB4ZTYsIDB4NDksIDB4MzUsIDB4MjksIDB4YjgsIDB4ZjksIDB4ZWEsIDB4MDYsIDB4NjAsCi0JMHgzNywgMHg3MSwgMHhmMywgMHg3MiwgMHhjNiwgMHg4NSwgMHg3ZSwgMHhlMiwgMHhlNiwgMHg4ZiwgMHg5OCwgMHg4MiwKLQkweGVlLCAweDI0LCAweDZlLCAweGJlLCAweDQyLCAweDhjLCAweDc1LCAweDNlLCAweGZlLCAweDczLCAweDdjLCAweGEzLAotCTB4MzgsIDB4M2IsIDB4ZGIsIDB4NGIsIDB4ZWMsIDB4OWMsIDB4MGMsIDB4ZGUsIDB4ODgsIDB4OWQsIDB4ZmYsIDB4ZTIsCi0JMHg1ZiwgMHg2MCwgMHhlNywgMHgzZCwgMHhjNCwgMHg4NCwgMHgzZCwgMHg1OSwgMHhkOSwgMHg2NywgMHgxYSwgMHg2ZCwKLQkweDdkLCAweGUzLCAweDk0LCAweDljLCAweDZkLCAweGI5LCAweDBkLCAweGVmLCAweDllLCAweDFjLCAweDFkLCAweDIyLAotCTB4NTYsIDB4YzYsIDB4NTgsIDB4YmMsIDB4MWYsIDB4OTksIDB4MTksIDB4YWMsIDB4MjIsIDB4MmUsIDB4NzgsIDB4ZDksCi0JMHhjOSwgMHg3NSwgMHhkNywgMHhjNSwgMHg1NSwgMHhmZCwgMHg0ZCwgMHgyNSwgMHhkYSwgMHhkNSwgMHg4ZiwgMHgyOCwKLQkweGZiLCAweDY2LCAweDc1LCAweDk5LCAweDI2LCAweDRjLCAweGJhLCAweDEyLCAweGM0LCAweGM2LCAweGFjLCAweDgxLAotCTB4YWIsIDB4ODksIDB4OWQsIDB4YWIsIDB4MTYsIDB4ODEsIDB4ZGEsIDB4NDUsIDB4MWIsIDB4M2IsIDB4Y2IsIDB4ZGMsCi0JMHhhYywgMHgyYSwgMHg4YSwgMHgzZiwgMHgyMiwgMHg3NiwgMHg2NiwgMHhhZiwgMHhjYiwgMHg1MCwgMHg1YiwgMHg2YywKLQkweDYyLCAweDhjLCAweDJhLCAweDM4LCAweDFhLCAweGY1LCAweGExLCAweDY3LCAweDhhLCAweGI4LCAweGM3LCAweDlhLAotCTB4OWIsIDB4OTksIDB4MjMsIDB4M2YsIDB4ZDYsIDB4ZmIsIDB4NzEsIDB4NmMsIDB4YzEsIDB4OWUsIDB4OWIsIDB4NzUsCi0JMHgxMiwgMHhiZiwgMHhiOSwgMHhhMiwgMHg0MSwgMHg5NCwgMHgyZiwgMHhiYSwgMHhmMCwgMHgxYywgMHhmMSwgMHhmMywKLQkweDM2LCAweGRhLCAweGY5LCAweDBjLCAweGYxLCAweGYzLCAweDllLCAweDFiLCAweDY2LCAweDY3LCAweGIzLCAweDhiLAotCTB4NzgsIDB4OTUsIDB4NTgsIDB4YmUsIDB4YWUsIDB4MTYsIDB4NTEsIDB4OTksIDB4OGIsIDB4OTgsIDB4NTcsIDB4MzYsCi0JMHhmYSwgMHg3MCwgMHhjZSwgMHhjMiwgMHhjZiwgMHhkZSwgMHhlNSwgMHhiNCwgMHg2MiwgMHhjYiwgMHg1NiwgMHg0NiwKLQkweDViLCAweDg4LCAweDVkLCAweDFkLCAweGI0LCAweDZiLCAweGRiLCAweDQ5LCAweGI1LCAweGViLCAweDI1LCAweGVhLAotCTB4YTIsIDB4MzEsIDB4N2EsIDB4ZGUsIDB4YjIsIDB4YzcsIDB4NjAsIDB4NWMsIDB4NjYsIDB4MmMsIDB4NDMsIDB4YWQsCi0JMHg3MiwgMHhmZSwgMHhhYSwgMHg4MiwgMHhmNiwgMHhlZSwgMHg5ZSwgMHg4YywgMHgyNCwgMHgzZiwgMHg4MCwgMHgxZCwKLQkweDkzLCAweGIxLCAweDVjLCAweDU5LCAweGIxLCAweDFlLCAweGNhLCAweGJkLCAweDA5LCAweGRlLCAweDRiLCAweGEyLAotCTB4NmIsIDB4YTMsIDB4ZWQsIDB4ZGYsIDB4YjEsIDB4ZGMsIDB4NzEsIDB4NjIsIDB4NTcsIDB4ZDksIDB4NWIsIDB4MGQsCi0JMHhmOCwgMHgzYiwgMHg4ZCwgMHgyZSwgMHg0YywgMHgxYiwgMHg2MSwgMHg5NCwgMHg5ZiwgMHgyYiwgMHhlZSwgMHhkMSwKLQkweDllLCAweDkzLCAweDMzLCAweDdiLCAweDhmLCAweGI2LCAweDA2LCAweGJlLCAweDUzLCAweGMyLCAweDg0LCAweDQ5LAotCTB4ZTIsIDB4YmIsIDB4YTAsIDB4ZTcsIDB4OGUsIDB4YmMsIDB4ZTAsIDB4YzUsIDB4NWUsIDB4MWMsIDB4MzMsIDB4ZDQsCi0JMHhkMCwgMHg0ZiwgMHgxOCwgMHgxMywgMHhmNywgMHhjOSwgMHhmZSwgMHhmYywgMHgwZCwgMHgzMywgMHhhYSwgMHg4NywKLQkweDc5LCAweGNmLCAweGY4LCAweGRjLCAweDhjLCAweDJhLCAweDk1LCAweGM1LCAweGFmLCAweDljLCAweGNkLCAweGU1LAotCTB4NzAsIDB4YWMsIDB4OTMsIDB4MTksIDB4ODksIDB4MWEsIDB4MWEsIDB4YzMsIDB4NjMsIDB4YzQsIDB4MWMsIDB4YmYsCi0JMHg1NCwgMHg3YywgMHg5YSwgMHg2YiwgMHhhOCwgMHhjOSwgMHhhOSwgMHg4NiwgMHhlNiwgMHgxNSwgMHgxZiwgMHhkZiwKLQkweGJkLCAweDg3LCAweGY5LCAweGVkLCAweDFlLCAweGZhLCAweDQ2LCAweDY0LCAweGI5LCAweDQyLCAweDcxLCAweGUyLAotCTB4ZDIsIDB4OTcsIDB4MmQsIDB4M2MsIDB4ZWEsIDB4ZWQsIDB4ZTUsIDB4YjUsIDB4ZTksIDB4N2MsIDB4MDksIDB4ZDcsCi0JMHhmNCwgMHgwOSwgMHhhZiwgMHhlOCwgMHg5YywgMHhiMiwgMHg3MywgMHg4OCwgMHg5NiwgMHhmMywgMHgyZSwgMHg1ZiwKLQkweDgyLCAweDJkLCAweDViLCAweDI1LCAweDY1LCAweDdkLCAweDYwLCAweDMyLCAweDYwLCAweDBlLCAweGFjLCAweDk0LAotCTB4MTgsIDB4ZDYsIDB4YjAsIDB4ZDMsIDB4MTAsIDB4ZmYsIDB4MWEsIDB4MjQsIDB4OWYsIDB4N2QsIDB4MzgsIDB4NjIsCi0JMHhhYywgMHg2NiwgMHhlZiwgMHgyNiwgMHhmMywgMHhkMiwgMHgyNiwgMHg2MiwgMHhlYiwgMHg1ZSwgMHhkNiwgMHg2MCwKLQkweGQzLCAweDRjLCAweGU5LCAweDY5LCAweGIzLCAweDY5LCAweDkzLCAweGE2LCAweGU3LCAweDk0LCAweDQyLCAweDRkLAotCTB4ODgsIDB4ZjgsIDB4NjYsIDB4M2QsIDB4NmIsIDB4NzcsIDB4NWIsIDB4YmUsIDB4MDksIDB4NmYsIDB4OWUsIDB4ZDEsCi0JMHhlOCwgMHg5YiwgMHhlZCwgMHhjNCwgMHhlZiwgMHhiZCwgMHhiOCwgMHg5NywgMHhmMiwgMHg3YywgMHgyMywgMHhmZiwKLQkweDRkLCAweDI0LCAweGJmLCAweGVlLCAweGMyLCAweGM0LCAweDU0LCAweDEyLCAweDViLCAweGQ2LCAweDhmLCAweGUwLAotCTB4ZDIsIDB4ZWYsIDB4NzgsIDB4OTgsIDB4YWIsIDB4N2MsIDB4NzgsIDB4NzIsIDB4NGEsIDB4ZjIsIDB4NmIsIDB4MDksCi0JMHg2ZiwgMHhkZiwgMHg4OCwgMHg0NSwgMHgzYywgMHgwOCwgMHg1YiwgMHgzOCwgMHhlNCwgMHg4YiwgMHhlZiwgMHhkOSwKLQkweDE4LCAweGM1LCAweGNiLCAweDVlLCAweGI4LCAweGY0LCAweDNlLCAweGYzLCAweGQwLCAweGZhLCAweDdmLCAweDgxLAotCTB4NjcsIDB4ODgsIDB4NWIsIDB4ODgsIDB4MDUsIDB4MmEsIDB4NjIsIDB4ZDYsIDB4ZjksIDB4YjgsIDB4MTIsIDB4ZGUsCi0JMHg3NSwgMHhkMSwgMHgwNywgMHgyNCwgMHhhNiwgMHg1NywgMHgzMywgMHhkNiwgMHg0ZCwgMHg2MiwgMHhlNywgMHhlNSwKLQkweGUyLCAweGZjLCAweGYyLCAweGVkLCAweDkzLCAweGVhLCAweGQyLCAweDExLCAweDQ0LCAweDg4LCAweGExLCAweDMxLAotCTB4MjgsIDB4ZDgsIDB4Y2QsIDB4NDksIDB4YmMsIDB4N2IsIDB4MjUsIDB4MWEsIDB4ZDUsIDB4Y2YsIDB4MTEsIDB4ZWYsCi0JMHg4ZSwgMHhkMiwgMHhkNiwgMHgyZSwgMHg0ZCwgMHg3YywgMHgzMywgMHg4MCwgMHhiMiwgMHhjNSwgMHgxMCwgMHg3ZCwKLQkweDUyLCAweGU2LCAweDk3LCAweDdmLCAweGU1LCAweGI1LCAweGU3LCAweDk3LCAweDMyLCAweDMzLCAweDk3LCAweGYzLAotCTB4MjMsIDB4ZTgsIDB4MjgsIDB4NjMsIDB4ZWYsIDB4NTYsIDB4YWUsIDB4YTQsIDB4OTksIDB4OTMsIDB4NjcsIDB4YmQsCi0JMHhiYiwgMHg5OSwgMHhkZiwgMHhmYiwgMHg4ZCwgMHhhMCwgMHg3ZiwgMHg3NywgMHgzZSwgMHhjMCwgMHhkZiwgMHgzYSwKLQkweDdmLCAweDdmLCAweDdlLCAweDA3LCAweDlmLCAweDBmLCAweGYxLCAweDMzLCAweDhjLCAweDZjLCAweDJlLCAweDUyLAotCTB4MjEsIDB4Y2QsIDB4NDAsIDB4MzYsIDB4NjcsIDB4ZTcsIDB4YmMsIDB4NzAsIDB4ZWUsIDB4OTAsIDB4NTcsIDB4YjAsCi0JMHg2NiwgMHhkYiwgMHg5NCwgMHhmZCwgMHg1ZCwgMHhiYiwgMHhlMSwgMHhmYiwgMHhlNywgMHgzMSwgMHhiZiwgMHg5YiwKLQkweDdjLCAweDlmLCAweDM5LCAweGE5LCAweGUxLCAweGEzLCAweDkzLCAweDE2LCAweGU2LCAweDJmLCAweDEwLCAweGYzLAotCTB4MGYsIDB4YmIsIDB4OWQsIDB4ODIsIDB4MzUsIDB4N2YsIDB4NjEsIDB4OWUsIDB4OGYsIDB4NDYsIDB4MDcsIDB4ZTYsCi0JMHhlOCwgMHgwNywgMHgzZCwgMHhhNCwgMHhlYiwgMHhkMCwgMHg4MiwgMHgxNiwgMHhiZiwgMHgzNiwgMHg5ZiwgMHhmNiwKLQkweGNjLCAweGY3LCAweGYyLCAweGM5LCAweDE4LCAweGRlLCAweGI5LCAweDNlLCAweDYzLCAweGZkLCAweGE0LCAweGNjLAotCTB4OWEsIDB4MTUsIDB4ZTMsIDB4YjEsIDB4NzcsIDB4MzcsIDB4YzEsIDB4ZDMsIDB4YzIsIDB4N2UsIDB4ZDMsIDB4Y2QsCi0JMHhlNywgMHg0MywgMHhkNiwgMHhmMywgMHgzMiwgMHhmMywgMHhiZCwgMHg4ZSwgMHg5ZCwgMHgzZiwgMHhiYSwgMHhmZSwKLQkweGNlLCAweDYxLCAweDc2LCAweDZhLCAweDllLCAweGYzLCAweDhjLCAweDJkLCAweGE3LCAweGY1LCAweDljLCAweGNjLAotCTB4NjUsIDB4YmQsIDB4Y2IsIDB4YjAsIDB4ZTIsIDB4NmIsIDB4ODgsIDB4MzIsIDB4ODksIDB4N2QsIDB4MGYsIDB4OTksCi0JMHhiNiwgMHhkZiwgMHgwNiwgMHhmZCwgMHgzYiwgMHgxOSwgMHgwZiwgMHhkZiwgMHhhNiwgMHg3ZCwgMHg3NiwgMHg5ZSwKLQkweGFiLCAweGYzLCAweGRmLCAweDZkLCAweGVjLCAweGIyLCAweDY0LCAweGJlLCAweGZiLCAweDljLCAweGQ0LCAweDI0LAotCTB4YjksIDB4ZmYsIDB4NDAsIDB4ODUsIDB4NjAsIDB4ZWYsIDB4MjcsIDB4NTksIDB4YjMsIDB4NDYsIDB4MGQsIDB4ZDksCi0JMHgwMywgMHg4MCwgMHhlMiwgMHg0YSwgMHgxYywgMHg0MSwgMHhlNywgMHg3NCwgMHgxOCwgMHg2ZiwgMHhlYiwgMHhkZSwKLQkweGUyLCAweDU5LCAweDE3LCAweDg5LCAweGM5LCAweDY5LCAweGM2LCAweDY0LCAweDEwLCAweDYzLCAweDQ2LCAweDI0LAotCTB4ZmMsIDB4MzYsIDB4ZjEsIDB4NjksIDB4OWEsIDB4MGMsIDB4MWYsIDB4Y2IsIDB4M2EsIDB4ZjEsIDB4MzYsIDB4MzEsCi0JMHgyMywgMHgxNCwgMHhmYiwgMHhhYywgMHhhOCwgMHhmZCwgMHg2ZSwgMHhlOSwgMHhlZiwgMHg0YSwgMHg4NCwgMHg2YiwKLQkweDIyLCAweDJkLCAweDA3LCAweDUwLCAweDg3LCAweDBjLCAweDczLCAweGJlLCAweDU3LCAweGZiLCAweDIxLCAweDhlLAotCTB4OWYsIDB4NzAsIDB4ZTAsIDB4N2UsIDB4ZjYsIDB4N2QsIDB4YzksIDB4YmIsIDB4NzQsIDB4N2UsIDB4NmYsIDB4MWMsCi0JMHg3YSwgMHgxZiwgMHhmZiwgMHg2OCwgMHhjZSwgMHhjYSwgMHg3OSwgMHgyYywgMHg0NSwgMHhjZSwgMHg3YywgMHg3YywKLQkweDYyLCAweGQ2LCAweDZhLCAweDVhLCAweGUxLCAweDA3LCAweGQwLCAweDUyLCAweDU3LCAweGQxLCAweDM4LCAweGJjLAotCTB4OGMsIDB4MGYsIDB4Y2MsIDB4MDIsIDB4ZWYsIDB4YmQsIDB4YzcsIDB4ZjgsIDB4NzksIDB4NDksIDB4OGYsIDB4ODQsCi0JMHgxYywgMHgxNCwgMHhhNiwgMHgxMCwgMHg3NCwgMHhlMiwgMHgzZSwgMHg1ZCwgMHhlNiwgMHgyOSwgMHhlYSwgMHhmMCwKLQkweGIzLCAweDUwLCAweDg3LCAweDJlLCAweDI4LCAweDcyLCAweDg2LCAweGU3LCAweDkyLCAweDk5LCAweGFlLCAweDkxLAotCTB4NzUsIDB4MTUsIDB4YWMsIDB4NWIsIDB4ZDMsIDB4ZDgsIDB4NTUsIDB4MDYsIDB4YjUsIDB4YzUsIDB4YWQsIDB4NjgsCi0JMHhmYSwgMHhmYiwgMHhjYSwgMHhmZiwgMHgzMiwgMHgwYiwgMHhjMSwgMHg0ZiwgMHhjYywgMHg3NywgMHhiNCwgMHgxMiwKLQkweDVkLCAweDM1LCAweGVjLCAweDcxLCAweDk2LCAweDc4LCAweGFiLCAweGMzLCAweDcxLCAweDQzLCAweGY2LCAweGYxLAotCTB4N2UsIDB4ODgsIDB4ZmIsIDB4NGYsIDB4YjgsIDB4ZDAsIDB4MWUsIDB4ZmYsIDB4YjksIDB4OTksIDB4MGUsIDB4MGEsCi0JMHhjZCwgMHg1MCwgMHgyNSwgMHgyYSwgMHg4NCwgMHhiZSwgMHgzZCwgMHhkYiwgMHg3ZSwgMHgzMSwgMHgwZiwgMHhhNSwKLQkweGMzLCAweDEwLCAweGJjLCAweDJjLCAweDdlLCAweDNhLCAweDBkLCAweGQzLCAweDkwLCAweDk5LCAweGEyLCAweDg5LAotCTB4M2IsIDB4ZTMsIDB4MjMsIDB4NzgsIDB4MmYsIDB4OWUsIDB4ZmMsIDB4NGYsIDB4MWUsIDB4YTgsIDB4NGIsIDB4OTcsCi0JMHg5ZCwgMHg2YSwgMHhhMSwgMHhjOSwgMHgxOSwgMHg1NiwgMHhiYywgMHgwZCwgMHhkYSwgMHg3MCwgMHg4MywgMHg1NSwKLQkweDZmLCAweDJlLCAweGIyLCAweDc3LCAweGYyLCAweDMxLCAweGI3LCAweDQ4LCAweDhmLCAweDM5LCAweDhkLCAweGM1LAotCTB4YzksIDB4MzQsIDB4NWMsIDB4YzQsIDB4NzYsIDB4YTMsIDB4Y2QsIDB4NmEsIDB4ZmYsIDB4MzMsIDB4OGEsIDB4MWEsCi0JMHgzYSwgMHhhOCwgMHg4NCwgMHg5NSwgMHg3YiwgMHhiNSwgMHgxNCwgMHg5ZSwgMHhkMywgMHhhMywgMHhjOSwgMHgzNiwKLQkweGE1LCAweGNlLCAweGQzLCAweDk1LCAweDJmLCAweGQxLCAweDZlLCAweDI3LCAweDU2LCAweDUxLCAweDBiLCAweDk3LAotCTB4OWQsIDB4ZTUsIDB4YTgsIDB4ZGQsIDB4YTAsIDB4NzUsIDB4OTUsIDB4M2IsIDB4ZDUsIDB4ZDQsIDB4ZDcsIDB4MTgsCi0JMHg1ZiwgMHhkYiwgMHhmMywgMHgwNSwgMHhlZiwgMHhmYiwgMHg1MSwgMHgwNywgMHhkNiwgMHg1YSwgMHhmYiwgMHgwZCwKLQkweDk5LCAweGUyLCAweGJjLCAweDc0LCAweDFhLCAweGRkLCAweDkzLCAweGU2LCAweDk2LCAweDhiLCAweDcxLCAweDM1LAotCTB4ZjQsIDB4OGMsIDB4OTIsIDB4ZGUsIDB4ZWQsIDB4MjMsIDB4YTYsIDB4NzksIDB4MDAsIDB4NWEsIDB4NzgsIDB4ODEsCi0JMHg3NSwgMHhhYSwgMHgzZCwgMHhlZiwgMHhjMCwgMHgyZCwgMHhhNywgMHg4NCwgMHg2NiwgMHg4NiwgMHgzNCwgMHg4ZiwKLQkweGEwLCAweGZjLCAweDg0LCAweGI5LCAweDY1LCAweGI3LCAweGFlLCAweGE2LCAweDJlLCAweDNiLCAweGQzLCAweGZmLAotCTB4YmQsIDB4OTYsIDB4N2EsIDB4ZWIsIDB4NTAsIDB4NjQsIDB4YmYsIDB4NmQsIDB4ODQsIDB4YjgsIDB4NjIsIDB4NDQsCi0JMHhjZSwgMHhjZCwgMHhjNSwgMHhmZSwgMHg5OCwgMHg5OCwgMHhlMiwgMHg1YiwgMHhmNCwgMHg1NSwgMHg2NywgMHhjMiwKLQkweDRmLCAweDNlLCAweGQ1LCAweGQ4LCAweDFjLCAweDY0LCAweGNlLCAweDFlLCAweGM2LCAweDY1LCAweDNkLCAweGVkLAotCTB4ZWQsIDB4NmMsIDB4ODgsIDB4MTEsIDB4OWIsIDB4ODUsIDB4NTgsIDB4MDcsIDB4YzMsIDB4MzgsIDB4NDYsIDB4OGMsCi0JMHg3NywgMHgyNCwgMHg1ZiwgMHg4NiwgMHg0MiwgMHg0MCwgMHgyMywgMHgzNiwgMHhlYiwgMHg4NSwgMHg2MywgMHhkMiwKLQkweGE3LCAweGNjLCAweDY3LCAweDIyLCAweDdhLCAweDNiLCAweGZlLCAweDMzLCAweDBhLCAweDIxLCAweDcxLCAweDkxLAotCTB4MjMsIDB4ZjAsIDB4OWQsIDB4ZjgsIDB4N2IsIDB4YjMsIDB4NGEsIDB4ZDMsIDB4NWEsIDB4MjYsIDB4MTUsIDB4YWUsCi0JMHhmYiwgMHg1NCwgMHg4OCwgMHgzYSwgMHhlNiwgMHg3YiwgMHg3MiwgMHhiZSwgMHhjNSwgMHhlOCwgMHhjMSwgMHhiZCwKLQkweDkzLCAweDQxLCAweGJlLCAweDVmLCAweDg1LCAweDc1LCAweDI3LCAweGMyLCAweGI4LCAweDEyLCAweGJmLCAweDE5LAotCTB4ODUsIDB4MWEsIDB4MWIsIDB4MDMsIDB4NzksIDB4MzUsIDB4ZmEsIDB4MTEsIDB4ZmIsIDB4YWMsIDB4MzQsIDB4N2IsCi0JMHg0YSwgMHhkOSwgMHg2MywgMHgzYSwgMHg2MiwgMHg0OCwgMHg3ZiwgMHhlZSwgMHhlMiwgMHg3NywgMHgxZiwgMHg3ZiwKLQkweDQ1LCAweDlmLCAweGRmLCAweDJhLCAweDYyLCAweDlkLCAweGE5LCAweGQ2LCAweGYwLCAweGZjLCAweGNmLCAweDJiLAotCTB4ZWMsIDB4NzksIDB4NWEsIDB4OTgsIDB4Y2YsIDB4MDUsIDB4YWMsIDB4MTksIDB4ZTEsIDB4MjgsIDB4NjksIDB4OWUsCi0JMHg5ZCwgMHg5NiwgMHhiZSwgMHhhZCwgMHg2ZCwgMHhiMywgMHhhNywgMHhiOCwgMHg0ZiwgMHhmZiwgMHg1MywgMHhkZCwKLQkweDgxLCAweDJkLCAweGVjLCAweGVkLCAweDQzLCAweDlhLCAweGQ0LCAweGNiLCAweDUxLCAweGI1LCAweDE2LCAweDliLAotCTB4NzEsIDB4M2EsIDB4YzAsIDB4MjYsIDB4NWMsIDB4ZmIsIDB4MGYsIDB4OTgsIDB4MDgsIDB4YzQsIDB4OTgsIDB4ZjMsCi0JMHgzNSwgMHhiYywgMHg5YiwgMHhmOSwgMHgzMiwgMHhmYiwgMHg5ZCwgMHgzYSwgMHgzOSwgMHhlMywgMHg4MywgMHg1YiwKLQkweDRlLCAweGI4LCAweGI5LCAweGU2LCAweDE2LCAweGUyLCAweDlhLCAweDRlLCAweGJjLCAweDE2LCAweGIwLCAweDdiLAotCTB4OGQsIDB4YTMsIDB4YmMsIDB4M2UsIDB4M2UsIDB4ZTcsIDB4MjMsIDB4MTYsIDB4ZjUsIDB4ZjAsIDB4ZjcsIDB4NDYsCi0JMHhkZSwgMHhiZSwgMHg4OCwgMHgyNywgMHg5MSwgMHhlNSwgMHhkZiwgMHhlMiwgMHhjOSwgMHg0MywgMHgzYywgMHhhMCwKLQkweGUxLCAweDZhLCAweGU2LCAweDY1LCAweDVjLCAweDIxLCAweGVkLCAweGY0LCAweDljLCAweDRkLCAweDczLCAweDJhLAotCTB4MmYsIDB4NzQsIDB4NjUsIDB4YmQsIDB4NDgsIDB4YWEsIDB4ZDYsIDB4MjksIDB4ZjQsIDB4N2QsIDB4NzIsIDB4ZGUsCi0JMHhmNywgMHhkZiwgMHhiOSwgMHgwNiwgMHg5MSwgMHhkZCwgMHgwOSwgMHhmNiwgMHhjNywgMHg3YSwgMHgwMywgMHhkYSwKLQkweDAzLCAweGI0LCAweDk3LCAweDIxLCAweDZiLCAweGE4LCAweGVjLCAweDQ1LCAweGU1LCAweGRkLCAweDEwLCAweGQ2LAotCTB4NGUsIDB4OWEsIDB4MjMsIDB4YTEsIDB4ODQsIDB4NWMsIDB4MzcsIDB4Y2QsIDB4ZWEsIDB4NGQsIDB4NWEsIDB4ZTgsCi0JMHg0ZCwgMHhjNSwgMHhjNSwgMHg1YSwgMHhlNywgMHhhMiwgMHgwZSwgMHhjNiwgMHg3MSwgMHgzNiwgMHhkMywgMHhiOCwKLQkweGY0LCAweDFlLCAweGIxLCAweDUzLCAweDk4LCAweGJkLCAweGRlLCAweDI1LCAweGU3LCAweDM4LCAweGU2LCAweDMzLAotCTB4MGIsIDB4OTUsIDB4MzIsIDB4MjMsIDB4MTgsIDB4Y2YsIDB4ZmIsIDB4OTQsIDB4YjksIDB4Y2MsIDB4OTEsIDB4NGEsCi0JMHhjOSwgMHg0NSwgMHg2MywgMHhmNCwgMHg4NSwgMHhhNiwgMHg0OSwgMHhlMSwgMHhkNSwgMHgxYywgMHhhOSwgMHgyMiwKLQkweDlkLCAweDYzLCAweGE0LCAweDMzLCAweGI3LCAweDUxLCAweGViLCAweDFmLCAweDUzLCAweDQ0LCAweDY3LCAweDNlLAotCTB4ZTIsIDB4YmEsIDB4OGIsIDB4MzIsIDB4M2YsIDB4YTMsIDB4ZGUsIDB4ZmUsIDB4OTQsIDB4Y2YsIDB4OGIsIDB4ZGUsCi0JMHg4MiwgMHg3OCwgMHhhZCwgMHg0OCwgMHhlNywgMHg4OSwgMHhmYywgMHgxMiwgMHhlNiwgMHgzMiwgMHgxZiwgMHg1OCwKLQkweDdmLCAweDhmLCAweGU1LCAweDYzLCAweGFjLCAweDdkLCAweDgzLCAweGM4LCAweDMxLCAweDlmLCAweDRjLCAweDY2LAotCTB4MWEsIDB4ZmIsIDB4MjcsIDB4YzksIDB4ODcsIDB4N2QsIDB4MzYsIDB4NmYsIDB4MTAsIDB4NGYsIDB4MTcsIDB4OWYsCi0JMHgxOSwgMHhlNSwgMHhiYiwgMHhhMywgMHhkNywgMHhmZSwgMHgxNiwgMHgxZCwgMHhkOSwgMHhmYiwgMHhmZiwgMHhmNiwKLQkweDFlLCAweDQzLCAweDM5LCAweDZkLCAweDY3LCAweGY3LCAweGUxLCAweDQ3LCAweDBkLCAweGI3LCAweGNjLCAweGMzLAotCTB4ZjEsIDB4ZjIsIDB4ZjQsIDB4MTYsIDB4OGMsIDB4ZTksIDB4N2YsIDB4OGUsIDB4YmQsIDB4OTQsIDB4N2IsIDB4OWMsCi0JMHhmYSwgMHgzYywgMHg2MSwgMHg1OCwgMHhmYiwgMHhmYywgMHg3MiwgMHhmZSwgMHg4YiwgMHhiOSwgMHhmYSwgMHg2MCwKLQkweGViLCAweDE5LCAweDYyLCAweGIxLCAweGUzLCAweDhjLCAweDk5LCAweGZkLCAweGYxLCAweGM2LCAweGRlLCAweDU3LAotCTB4ZTgsIDB4NzcsIDB4YzksIDB4ZGYsIDB4OTYsIDB4YmQsIDB4NzQsIDB4NjAsIDB4MzIsIDB4ZmIsIDB4MGQsIDB4Y2MsCi0JMHhkNiwgMHgzNCwgMHgyZSwgMHgzZiwgMHhjZiwgMHg5YywgMHg3MCwgMHg5YSwgMHg3OSwgMHhjYSwgMHhjNSwgMHg5YywKLQkweDUwLCAweDlkLCAweDI1LCAweDg2LCAweDY0LCAweDllLCAweDJhLCAweDMwLCAweDRmLCAweGI5LCAweGI0LCAweGM2LAotCTB4YTUsIDB4NzksIDB4ZmMsIDB4MTUsIDB4ZjUsIDB4MjIsIDB4ZmMsIDB4NDUsIDB4NjIsIDB4ZjMsIDB4OTAsIDB4NjcsCi0JMHhlZCwgMHhmOSwgMHhhYiwgMHgzNiwgMHgzZiwgMHg4NCwgMHg0YiwgMHgzNywgMHhkYiwgMHgzMywgMHgzNCwgMHgyNywKLQkweDZiLCAweGY2LCAweGJlLCAweDRjLCAweDYzLCAweDYwLCAweDRjLCAweDY4LCAweGY3LCAweGE5LCAweGExLCAweDM0LAotCTB4NmQsIDB4MzUsIDB4NjEsIDB4NjEsIDB4ZWYsIDB4NjEsIDB4ZjYsIDB4MGIsIDB4NzIsIDB4ZGUsIDB4YWIsIDB4MGEsCi0JMHgyZSwgMHhmYSwgMHhmZSwgMHg5OCwgMHgyZSwgMHhlNywgMHgyMCwgMHg0MiwgMHhmZSwgMHhlZCwgMHhiNCwgMHhlMSwKLQkweDk4LCAweGQxLCAweGQ4LCAweDEyLCAweDUxLCAweDc2LCAweGUzLCAweDUyLCAweDMxLCAweGM3LCAweGRhLCAweDU4LAotCTB4NWEsIDB4ZWQsIDB4M2YsIDB4ODYsIDB4YzYsIDB4ZGUsIDB4MDcsIDB4ZjAsIDB4NzUsIDB4MjQsIDB4NmIsIDB4MWEsCi0JMHgwNywgMHhhNiwgMHgxMSwgMHhkMSwgMHhlZiwgMHg4MywgMHg5YywgMHgxYiwgMHhiNSwgMHg2OSwgMHhkNSwgMHhlNywKLQkweDljLCAweGM0LCAweDIzLCAweDlmLCAweDk4LCAweGFiLCAweGI1LCAweDI3LCAweDMwLCAweDRkLCAweGNjLCAweGQ4LAotCTB4YjAsIDB4NWUsIDB4NWIsIDB4ZmEsIDB4NmUsIDB4ZjEsIDB4OWUsIDB4YmQsIDB4YTcsIDB4MjQsIDB4ZmUsIDB4ZTIsCi0JMHhhMSwgMHgwZSwgMHhjYSwgMHhlMSwgMHg1YSwgMHg1MSwgMHhjNywgMHgzNSwgMHhhOCwgMHgwYiwgMHhlYiwgMHg0YywKLQkweGYxLCAweDQ1LCAweDFjLCAweGEyLCAweGJmLCAweDRkLCAweGU3LCAweDE1LCAweGU4LCAweGY1LCAweDE3LCAweDMxLAotCTB4MmMsIDB4YjUsIDB4ODksIDB4ZWYsIDB4YjQsIDB4NjUsIDB4N2MsIDB4YzQsIDB4MjksIDB4MjEsIDB4OTQsIDB4NmIsCi0JMHg5MSwgMHhmMCwgMHgyOCwgMHhlNSwgMHg2YiwgMHg2MywgMHgyZSwgMHgxZiwgMHg2NywgMHgwZSwgMHg0OSwgMHgwNywKLQkweDdjLCAweGQ2LCAweDM5LCAweGQ3LCAweDcyLCAweDJkLCAweDY0LCAweGZkLCAweDZmLCAweDgyLCAweGY0LCAweDQxLAotCTB4MGQsIDB4YjMsIDB4YjIsIDB4OWYsIDB4N2QsIDB4MDQsIDB4MTcsIDB4YTcsIDB4MGIsIDB4MzgsIDB4MWUsIDB4NGYsCi0JMHhlMiwgMHg0MCwgMHg0ZCwgMHgwMCwgMHg5MywgMHhjNiwgMHg0YSwgMHg2YiwgMHg2ZSwgMHgyMCwgMHhmZCwgMHg1NiwKLQkweDc3LCAweGY2LCAweGIwLCAweDM1LCAweDhiLCAweGRjLCAweDE2LCAweDc3LCAweGQ0LCAweGNiLCAweDc5LCAweDhmLAotCTB4MzksIDB4ZjYsIDB4NWQsIDB4ZDMsIDB4ZmEsIDB4MDgsIDB4MGUsIDB4ZTksIDB4ZGYsIDB4ODIsIDB4YmUsIDB4NDIsCi0JMHg3MiwgMHhlNywgMHgxOCwgMHhjZSwgMHhjZiwgMHg0YSwgMHgwZCwgMHg5YiwgMHg2OCwgMHhiZCwgMHg3NSwgMHg1MiwKLQkweGY0LCAweGUzLCAweDIwLCAweGU2LCAweGY1LCAweGEwLCAweGM5LCAweGMyLCAweDcwLCAweGFmLCAweGI3LCAweGFlLAotCTB4OTksIDB4YjUsIDB4YjEsIDB4NWMsIDB4NTMsIDB4NGUsIDB4Y2UsIDB4NjYsIDB4NTcsIDB4YzEsIDB4NGYsIDB4N2QsCi0JMHg1ZCwgMHg4OCwgMHhiYiwgMHg5OSwgMHg3MywgMHg0NCwgMHg5ZiwgMHg3MiwgMHgxNiwgMHhkMCwgMHg5NiwgMHgzMywKLQkweDk2LCAweDUzLCAweDMwLCAweGQ2LCAweDdjLCAweGUzLCAweDVlLCAweDhiLCAweGZjLCAweDlmLCAweGMyLCAweGI1LAotCTB4ZjMsIDB4ODksIDB4YzUsIDB4ZDksIDB4ZjgsIDB4MWYsIDB4OWIsIDB4OTcsIDB4NmUsIDB4MTIsIDB4YjksIDB4NWIsCi0JMHg3ZCwgMHhjYywgMHhlOSwgMHhlMSwgMHhkOSwgMHg2YiwgMHhmYSwgMHgxNSwgMHg5ZCwgMHg5ZSwgMHg5MywgMHg5YSwKLQkweDYxLCAweGU5LCAweGRjLCAweDllLCAweGI3LCAweGE5LCAweGMzLCAweGVmLCAweDI4LCAweDhkLCAweGFjLCAweDI3LAotCTB4ZjQsIDB4YWIsIDB4MWEsIDB4ZmEsIDB4NWIsIDB4MTMsIDB4MDYsIDB4NTYsIDB4MjcsIDB4NWMsIDB4N2QsIDB4NTcsCi0JMHg4ZCwgMHgyZCwgMHg2OCwgMHhkOSwgMHhmMCwgMHhhZSwgMHg4OSwgMHg5YiwgMHhkYiwgMHhlMCwgMHhkNCwgMHhlNCwKLQkweGZhLCAweGFjLCAweDk5LCAweDBjLCAweGM4LCAweGRmLCAweDRmLCAweGZhLCAweGE0LCAweDk2LCAweGJmLCAweDY4LAotCTB4MTQsIDB4Y2MsIDB4MzUsIDB4MmIsIDB4NmQsIDB4NmMsIDB4ZjgsIDB4ZjcsIDB4MTksIDB4ZDksIDB4MDcsIDB4NGIsCi0JMHg5YiwgMHhlYywgMHhiNSwgMHg5NywgMHhkZSwgMHg3NiwgMHgxZSwgMHhjNiwgMHhkZiwgMHhlNiwgMHg4ZSwgMHhlMCwKLQkweGFkLCAweDY5LCAweDE3LCAweDcxLCAweGE2LCAweGM4LCAweGIyLCAweDA1LCAweGQ1LCAweDFiLCAweGEyLCAweGM5LAotCTB4NzcsIDB4OTksIDB4MTcsIDB4OTcsIDB4NjYsIDB4NGIsIDB4N2UsIDB4ZjEsIDB4N2EsIDB4ZWIsIDB4ZGEsIDB4NTksCi0JMHg4NSwgMHhiNCwgMHhhYSwgMHg1MCwgMHg0NiwgMHgzOSwgMHg3ZiwgMHhhYywgMHgzYiwgMHgxMSwgMHgyZSwgMHg2MiwKLQkweDViLCAweDI3LCAweGY5LCAweGRjLCAweDk3LCAweGIxLCAweDMxLCAweDZmLCAweDI0LCAweDM3LCAweGVkLCAweGIzLAotCTB4ZTcsIDB4NWYsIDB4M2UsIDB4ZTYsIDB4ZDEsIDB4NzEsIDB4NGMsIDB4NjQsIDB4MWEsIDB4NjMsIDB4ZWYsIDB4YzksCi0JMHg3OSwgMHgxZSwgMHhmNiwgMHg2MiwgMHg5NywgMHgzMCwgMHg4ZSwgMHgxMywgMHg5OSwgMHg1MiwgMHgwZSwgMHgwZCwKLQkweGM5LCAweDM5LCAweGQ4LCAweDU4LCAweGQ4LCAweDYxLCAweGU3LCAweGM4LCAweGIwLCAweDQzLCAweDRkLCAweGYzLAotCTB4ZDcsIDB4MjcsIDB4ZDgsIDB4NjAsIDB4MzQsIDB4MWYsIDB4MDksIDB4OTUsIDB4YzMsIDB4ODksIDB4ZmQsIDB4YmEsCi0JMHhlZCwgMHgxZiwgMHhmNSwgMHhmMywgMHg2ZSwgMHg4NCwgMHg1NywgMHg0OCwgMHg1ZCwgMHg5NiwgMHg5YSwgMHhlYywKLQkweDYyLCAweDRkLCAweDVlLCAweDg5LCAweGU0LCAweDRhLCAweDE3LCAweDVlLCAweGQ3LCAweDQ0LCAweDFmLCAweDUzLAotCTB4MjUsIDB4N2QsIDB4ZTgsIDB4ZTcsIDB4ZjAsIDB4OTAsIDB4NTksIDB4ZTgsIDB4MTUsIDB4NWYsIDB4NzIsIDB4ZTMsCi0JMHg0OCwgMHhkMywgMHg5YywgMHgzOSwgMHgxYiwgMHgxNCwgMHhkOSwgMHg5ZCwgMHgzOCwgMHhjZCwgMHhmYywgMHg4YSwKLQkweDliLCAweDIzLCAweGExLCAweGQzLCAweGFjLCAweGQ5LCAweDYzLCAweDVhLCAweGM5LCAweGM3LCAweGZmLCAweDYzLAotCTB4OTEsIDB4NGYsIDB4YWQsIDB4N2YsIDB4MDEsIDB4NDcsIDB4ZjgsIDB4NzcsIDB4N2QsIDB4ZTgsIDB4ODAsIDB4NjIsCi0JMHhhZiwgMHhiNywgMHg2NiwgMHhmZSwgMHg0MywgMHg1ZiwgMHg2OSwgMHg3NiwgMHgyYSwgMHhjZiwgMHg4NiwgMHg3MywKLQkweGE3LCAweGY5LCAweDVkLCAweDY4LCAweGY5LCAweGU4LCAweDlmLCAweGU1LCAweDE4LCAweDA4LCAweGNhLCAweDc5LAotCTB4MTAsIDB4ZDEsIDB4OGIsIDB4ZWMsIDB4M2YsIDB4ODIsIDB4ZmEsIDB4MzAsIDB4ZjEsIDB4MzIsIDB4ZjUsIDB4NzEsCi0JMHhlNCwgMHhkYSwgMHhkOSwgMHgyYiwgMHgzYiwgMHg3ZiwgMHg1NSwgMHhmMCwgMHhmYSwgMHhmNiwgMHhmOCwgMHg0YiwKLQkweDliLCAweGJkLCAweGY4LCAweDk1LCAweDc5LCAweDI5LCAweDE4LCAweDYyLCAweDRlLCAweDEwLCAweDliLCAweGE2LAotCTB4MmMsIDB4MWMsIDB4ZTksIDB4MjQsIDB4M2UsIDB4ZDksIDB4NjcsIDB4OWYsIDB4MzMsIDB4NjksIDB4OTUsIDB4ZmYsCi0JMHhhMSwgMHgyOSwgMHhjYSwgMHg1MSwgMHgxOCwgMHgyNCwgMHhjZSwgMHg1ZSwgMHhjYywgMHg1OCwgMHg2NywgMHhmYiwKLQkweDA2LCAweGRlLCAweDU0LCAweDIyLCAweGNjLCAweDM1LCAweDVmLCAweGMyLCAweDQwLCAweGFkLCAweGQwLCAweDBiLAotCTB4ZjgsIDB4NzcsIDB4Y2UsIDB4YzQsIDB4YTgsIDB4ODMsIDB4M2EsIDB4YTEsIDB4NmIsIDB4M2UsIDB4YzMsIDB4NmUsCi0JMHhlZSwgMHhjOCwgMHhhNCwgMHhkMCwgMHgwNywgMHhjNiwgMHgyNiwgMHgyMywgMHg0MywgMHgzZiwgMHgwNiwgMHgzNiwKLQkweDU3LCAweDQxLCAweDRkLCAweDJkLCAweDE0LCAweGZmLCAweGRmLCAweGUzLCAweDY3LCAweDhhLCAweGQwLCAweDEyLAotCTB4M2EsIDB4MmUsIDB4MTgsIDB4Y2MsIDB4NzEsIDB4NTMsIDB4OGIsIDB4MTUsIDB4ZDQsIDB4OWQsIDB4ZGEsIDB4ZmIsCi0JMHgzZCwgMHhhNSwgMHgwMiwgMHg0ZiwgMHgzYywgMHgxNSwgMHgyMywgMHhlZiwgMHgyYiwgMHhmYywgMHhkYiwgMHg2NywKLQkweDNjLCAweGYwLCAweDllLCAweGE5LCAweDYyLCAweGNkLCAweGY1LCAweGUwLCAweDcyLCAweDMzLCAweGVkLCAweGZhLAotCTB4NTQsIDB4ODksIDB4NzcsIDB4NmIsIDB4OWYsIDB4MTQsIDB4OGYsIDB4NjcsIDB4YzMsIDB4MzAsIDB4ZTgsIDB4YjMsCi0JMHg4YiwgMHg4NiwgMHhlYywgMHgxNywgMHg3YiwgMHhhYywgMHhmYywgMHhiOSwgMHhiNCwgMHhiMSwgMHhjZSwgMHhkYSwKLQkweGFmLCAweDdhLCAweDNlLCAweGFmLCAweDg1LCAweGNlLCAweDJhLCAweDU1LCAweGY4LCAweGUwLCAweDQ0LCAweGUxLAotCTB4ZTYsIDB4NzIsIDB4OTgsIDB4MmYsIDB4YWUsIDB4NGUsIDB4NDQsIDB4ZmIsIDB4ZjcsIDB4ZDIsIDB4ZTcsIDB4ZDcsCi0JMHhhZSwgMHgwOSwgMHhiMiwgMHg5NywgMHg2MSwgMHg0ZiwgMHhiOSwgMHg0OSwgMHhmYSwgMHhkZiwgMHg2OSwgMHhmNiwKLQkweGJmLCAweGE1LCAweGJkLCAweDdmLCAweDZkLCAweGU4LCAweDExLCAweDI1LCAweGRkLCAweGU5LCAweDg3LCAweGY5LAotCTB4NTEsIDB4NzksIDB4YzIsIDB4ZmMsIDB4ZDgsIDB4OWQsIDB4ODgsIDB4ZjIsIDB4N2QsIDB4ZDksIDB4ZGYsIDB4MzMsCi0JMHhjZCwgMHg5ZiwgMHgzNiwgMHg5YiwgMHg2NiwgMHhhZSwgMHgzOSwgMHhkMiwgMHgxZiwgMHg3MCwgMHgwNiwgMHg3MCwKLQkweGE2LCAweDQxLCAweGY2LCAweDA0LCAweDFkLCAweGY4LCAweDIwLCAweGFhLCAweDg1LCAweGY2LCAweDQyLCAweGY2LAotCTB4ZTgsIDB4OTksIDB4ZTMsIDB4NTcsIDB4Y2EsIDB4ZjksIDB4YzQsIDB4M2EsIDB4N2YsIDB4OTcsIDB4YjEsIDB4MDIsCi0JMHhjZiwgMHgyZCwgMHg2YywgMHhjMiwgMHg4MCwgMHgxYiwgMHhkNiwgMHhmOSwgMHgxOSwgMHg1MywgMHhjNywgMHg5YiwKLQkweGFiLCAweDIxLCAweDc1LCAweDNiLCAweGRhLCAweGYyLCAweDA4LCAweDgyLCAweDU4LCAweGM4LCAweDFmLCAweGMxLAotCTB4YzMsIDB4MjcsIDB4NjQsIDB4YWYsIDB4NzEsIDB4YjIsIDB4ZDUsIDB4NzMsIDB4YzIsIDB4ZmMsIDB4ZmIsIDB4NTAsCi0JMHhhMiwgMHhjMCwgMHhiYywgMHg2OCwgMHg5YSwgMHgxNSwgMHg5YiwgMHgxYSwgMHg0MywgMHgyYywgMHg0NywgMHhjNCwKLQkweDE4LCAweDY5LCAweGMxLCAweGVlLCAweDQzLCAweDFmLCAweGEwLCAweDA2LCAweDY3LCAweGU3LCAweDkyLCAweDM3LAotCTB4YjMsIDB4OTcsIDB4ZWMsIDB4N2EsIDB4NWEsIDB4MDksIDB4ZTAsIDB4MDcsIDB4OTQsIDB4ZjEsIDB4ZDksIDB4YmMsCi0JMHhlMCwgMHgxNCwgMHhhMywgMHhiNSwgMHhmYiwgMHhjNCwgMHgyYSwgMHhiYywgMHhiOCwgMHgxMCwgMHhjNCwgMHg1OSwKLQkweDQzLCAweDIzLCAweDRlLCAweDgyLCAweDUyLCAweDk5LCAweDMwLCAweGFiLCAweGFiLCAweGM5LCAweDZiLCAweGE1LAotCTB4ZDMsIDB4ODksIDB4Y2UsIDB4YjgsIDB4ZjQsIDB4ODcsIDB4ZGEsIDB4OTAsIDB4NGYsIDB4YzEsIDB4YWEsIDB4NzIsCi0JMHg2OCwgMHhjYiwgMHgwZiwgMHgwMSwgMHhjMywgMHg1ZSwgMHhmNiwgMHhhYiwgMHg0ZiwgMHgyYiwgMHhkMSwgMHhmZSwKLQkweGY3LCAweDlkLCAweDQxLCAweGZjLCAweDgwLCAweGY5LCAweGU3LCAweDdiLCAweDc5LCAweDM5LCAweDViLCAweGM1LAotCTB4MWMsIDB4MzMsIDB4MTcsIDB4YTYsIDB4YWQsIDB4M2MsIDB4NzAsIDB4ZDQsIDB4NTcsIDB4ZTEsIDB4MjgsIDB4ZTMsCi0JMHhlNSwgMHg2NSwgMHhiZCwgMHg4YywgMHgzOSwgMHg0YSwgMHhjZSwgMHg1YSwgMHg0OSwgMHg3ZSwgMHg3ZiwgMHg1NCwKLQkweGNlLCAweDk0LCAweDk4LCAweGNmLCAweDZiLCAweDc2LCAweGJmLCAweGFmLCAweGNmLCAweGRmLCAweDc4LCAweDVlLAotCTB4MzksIDB4YzAsIDB4YmMsIDB4ZGUsIDB4ZDgsIDB4MWIsIDB4NTIsIDB4NWUsIDB4MzUsIDB4OTMsIDB4YmYsIDB4YWQsCi0JMHg1MCwgMHhjZSwgMHgwNywgMHhhYiwgMHg1MCwgMHg2MSwgMHhjOSwgMHg4YSwgMHhkMSwgMHg2YywgMHhhOSwgMHhhNiwKLQkweDU0LCAweDRiLCAweDJmLCAweGQ3LCAweDliLCAweDJlLCAweGZhLCAweDYwLCAweDI1LCAweDYzLCAweGZkLCAweDE4LAotCTB4NmIsIDB4NzQsIDB4ZjksIDB4MDksIDB4YTksIDB4MjUsIDB4ZWMsIDB4NWYsIDB4OTQsIDB4MmQsIDB4YzQsIDB4YzIsCi0JMHg4MiwgMHgxYiwgMHgzYywgMHg3OCwgMHgyMCwgMHhhMCwgMHhiNiwgMHhjOCwgMHg5OSwgMHhlZCwgMHg2NywgMHhmMywKLQkweDFkLCAweDJlLCAweDM5LCAweDNiLCAweGY1LCAweDVjLCAweDVlLCAweDZhLCAweGI5LCAweGU0LCAweDgyLCAweGQyLAotCTB4N2EsIDB4MjEsIDB4ZDQsIDB4NGUsIDB4OGEsIDB4OGQsIDB4ODYsIDB4NWIsIDB4M2YsIDB4OWEsIDB4ZjQsIDB4YzksCi0JMHhmOSwgMHhmYSwgMHgxMSwgMHgwNywgMHg3YiwgMHg2ZCwgMHhjZiwgMHhhNCwgMHg2OSwgMHhlZSwgMHg2OSwgMHhkNiwKLQkweDg2LCAweGI2LCAweDM4LCAweDY1LCAweDZmLCAweDM5LCAweDMyLCAweDcwLCAweDRlLCAweDUxLCAweDViLCAweDI2LAotCTB4OTQsIDB4MWIsIDB4ZTksIDB4ZmMsIDB4YjcsIDB4MmEsIDB4ODksIDB4OTEsIDB4MzQsIDB4ZTUsIDB4N2MsIDB4ZGMsCi0JMHg5MiwgMHg2OSwgMHg4YSwgMHgzMiwgMHg5NSwgMHhjZSwgMHgxNiwgMHg1NSwgMHhlMSwgMHhmMiwgMHgzNCwgMHgzNCwKLQkweDQ2LCAweDJkLCAweGNlLCAweGViLCAweDRjLCAweDRlLCAweDgxLCAweDY4LCAweGIyLCAweDFkLCAweGUyLCAweGZmLAotCTB4ZWEsIDB4ODAsIDB4NjAsIDB4YTgsIDB4NGEsIDB4ZTYsIDB4ZTQsIDB4YjksIDB4NjksIDB4YTksIDB4MzEsIDB4OGEsCi0JMHhlMCwgMHg5MywgMHgzNCwgMHhkNywgMHhjNiwgMHg5NSwgMHg4ZCwgMHhjMCwgMHhhYiwgMHg5MywgMHhmNiwgMHhkZSwKLQkweDdiLCAweGYxLCAweDJjLCAweGI4LCAweDc1LCAweGU2LCAweGUxLCAweDExLCAweGViLCAweDJjLCAweDgzLCAweGQwLAotCTB4M2YsIDB4OGMsIDB4MzMsIDB4MTksIDB4YzEsIDB4OTQsIDB4YzMsIDB4YzQsIDB4OTQsIDB4OTEsIDB4MTQsIDB4ZjEsCi0JMHg2NiwgMHg0YiwgMHhkZSwgMHgzZSwgMHg5NywgMHhhNSwgMHg3ZiwgMHg0NCwgMHg5ZiwgMHg3ZiwgMHg5YSwgMHg1OCwKLQkweGY1LCAweDI4LCAweGVjLCAweGJkLCAweGY3LCAweDg2LCAweGUyLCAweDU5LCAweDg1LCAweDQ4LCAweGFlLCAweDRiLAotCTB4ZDksIDB4OTEsIDB4OTcsIDB4MTgsIDB4OWIsIDB4NjYsIDB4OGMsIDB4YjUsIDB4MmIsIDB4ZGIsIDB4MTcsIDB4M2EsCi0JMHg5NCwgMHhlZSwgMHg4NSwgMHgxZSwgMHg2NSwgMHg3NywgMHg1ZSwgMHg3YSwgMHhkNiwgMHhjOSwgMHhkNiwgMHgwNywKLQkweDRlLCAweGVjLCAweDUyLCAweDc2LCAweGNjLCAweGY1LCAweDI5LCAweGM0LCAweGI0LCAweDAxLCAweDRmLCAweGEyLAotCTB4NWYsIDB4ZTksIDB4NTksIDB4YjAsIDB4ZTcsIDB4ZTcsIDB4NWQsIDB4ZWMsIDB4YmIsIDB4NzYsIDB4MTgsIDB4YTUsCi0JMHg3ZSwgMHg1ZSwgMHhmZSwgMHhkZiwgMHgyYiwgMHgyOCwgMHhmZiwgMHg1YiwgMHgzMSwgMHhiMCwgMHg0ZCwgMHgzMSwKLQkweGNkLCAweGRiLCAweGUyLCAweDdmLCAweDI3LCAweGY2LCAweDMwLCAweDlmLCAweDhkLCAweGIzLCAweDM2LCAweDFhLAotCTB4NTUsIDB4MTgsIDB4NjQsIDB4ZGYsIDB4MzEsIDB4YWEsIDB4ZGYsIDB4NWEsIDB4ZGMsIDB4MmYsIDB4MTMsIDB4OTksCi0JMHhlNCwgMHgzYywgMHg4NSwgMHhmOCwgMHgyYiwgMHhkMiwgMHhlNSwgMHhlNCwgMHhlMSwgMHgxZiwgMHhjOCwgMHhmZiwKLQkweDgxLCAweGEyLCAweDVjLCAweDNkLCAweDcyLCAweGE2LCAweGMwLCAweDdkLCAweGZkLCAweGJjLCAweGQ5LCAweGYxLAotCTB4YzksIDB4ZWIsIDB4NzIsIDB4MzEsIDB4ZDcsIDB4NjMsIDB4OWMsIDB4ZjgsIDB4ZjQsIDB4ODAsIDB4YTIsIDB4YTYsCi0JMHg5ZSwgMHhiMSwgMHhlNSwgMHg1YSwgMHhiYSwgMHhjYywgMHgxOCwgMHgxZSwgMHhiNSwgMHg2MiwgMHhkOCwgMHg5NiwKLQkweDZiLCAweDVkLCAweDUxLCAweGFlLCAweGI1LCAweGI5LCAweDJlLCAweGViLCAweDFjLCAweDE3LCAweGYxLCAweDdhLAotCTB4ZWIsIDB4ZTIsIDB4YTQsIDB4OWMsIDB4MzcsIDB4OTMsIDB4ZDksIDB4YTUsIDB4YzgsIDB4MjYsIDB4NzIsIDB4OWMsCi0JMHgzMCwgMHgyYiwgMHhiNCwgMHgxZSwgMHg2NSwgMHhhNywgMHg3NSwgMHhmZSwgMHg0YywgMHhjZSwgMHg3ZSwgMHhjOSwKLQkweDVlLCAweDdmLCAweDQ5LCAweDJlLCAweGE5LCAweGUzLCAweDJiLCAweGZjLCAweDFkLCAweDMzLCAweDcyLCAweDFlLAotCTB4ZGIsIDB4MzQsIDB4NWYsIDB4ZDMsIDB4ODMsIDB4N2UsIDB4OTEsIDB4ZTUsIDB4YWMsIDB4MmUsIDB4YjIsIDB4YzgsCi0JMHhiOSwgMHg5MiwgMHg5MiwgMHgzYywgMHg1ZiwgMHgyYiwgMHhjYSwgMHgyMywgMHhiNiwgMHhiYSwgMHg2ZSwgMHhhNywKLQkweGQyLCAweGZmLCAweDA5LCAweGJlLCAweDlkLCAweGIxLCAweGNmLCAweDljLCAweDk0LCAweGU0LCAweGYxLCAweDI3LAotCTB4ODQsIDB4ZmYsIDB4OGIsIDB4YWQsIDB4ZTMsIDB4ZDMsIDB4YzMsIDB4NzgsIDB4OTUsIDB4ZjcsIDB4N2YsIDB4OWUsCi0JMHgyOSwgMHhjOSwgMHhlNSwgMHhjNCwgMHhmYywgMHg1YywgMHhlOSwgMHgyYywgMHgxZCwgMHg1YiwgMHg0YSwgMHgyMywKLQkweGEyLCAweDhmLCAweGQxLCAweDhmLCAweDZjLCAweGY5LCAweGU0LCAweDJjLCAweDVkLCAweDYzLCAweGUxLCAweGIyLAotCTB4MzUsIDB4ZjcsIDB4OGEsIDB4MjYsIDB4ZDksIDB4MmYsIDB4ZTMsIDB4NmMsIDB4ZmUsIDB4ZDcsIDB4ZWQsIDB4ZDcsCi0JMHg5NCwgMHhhYiwgMHg2MCwgMHg4ZiwgMHgyYywgMHhiNCwgMHg1ZiwgMHgyNywgMHg2ZCwgMHgzOSwgMHg3MywgMHhhMiwKLQkweGUwLCAweDk5LCAweDM5LCAweDYwLCAweGNlLCAweGUwLCAweGIyLCAweDg5LCAweDExLCAweDNjLCAweGE5LCAweDliLAotCTB4ZTYsIDB4ZDMsIDB4Y2QsIDB4OWEsIDB4OWMsIDB4MTUsIDB4YmEsIDB4NTAsIDB4NmIsIDB4Y2QsIDB4ODUsIDB4YTAsCi0JMHg1NywgMHg2OSwgMHhiMiwgMHg3NywgMHgyNywgMHhlNywgMHg0ZCwgMHhmYSwgMHhhOCwgMHgwMywgMHg5MSwgMHg1ZCwKLQkweDdjLCAweGEwLCAweDY0LCAweDdiLCAweDM5LCAweDA3LCAweDk3LCAweGE2LCAweDdlLCAweDQ0LCAweDM3LCAweGE1LAotCTB4ZjMsIDB4NzAsIDB4MzIsIDB4NzMsIDB4YjksIDB4NTEsIDB4MjcsIDB4NWQsIDB4OTYsIDB4NGUsIDB4OWUsIDB4ZDUsCi0JMHhjNSwgMHg1ZiwgMHg5OSwgMHg3ZCwgMHhlOCwgMHhhYiwgMHhmMywgMHhjNCwgMHgwZiwgMHg2MywgMHhiYSwgMHhkYiwKLQkweGMyLCAweDZhLCAweDQ3LCAweDg5LCAweDRmLCAweDI2LCAweDE4LCAweDNiLCAweDhmLCAweDFiLCAweDRiLCAweDU4LAotCTB4Y2EsIDB4YmQsIDB4OGMsIDB4NTcsIDB4YWYsIDB4ZmQsIDB4Y2YsIDB4OWMsIDB4ZjgsIDB4OGIsIDB4ZGUsIDB4ZDIsCi0JMHg2ZCwgMHg5ZCwgMHg3OSwgMHhmYSwgMHhhNCwgMHhlNSwgMHhkNiwgMHhhOCwgMHhlNCwgMHhhMSwgMHgxZiwgMHgzNiwKLQkweGM5LCAweDE5LCAweGE4LCAweGYyLCAweDQ0LCAweGUwLCAweDZiLCAweGIyLCAweGJmLCAweDU1LCAweDk2LCAweDk4LAotCTB4ZmQsIDB4ZWEsIDB4MDUsIDB4NGQsIDB4NzQsIDB4YTMsIDB4MzUsIDB4OWYsIDB4ZDEsIDB4NDQsIDB4YWUsIDB4MWUsCi0JMHg3ZCwgMHhkYywgMHhmYSwgMHgxZiwgMHhjZSwgMHg5NiwgMHg0ZCwgMHhmYiwgMHgzNCwgMHg4OSwgMHgxZCwgMHhkZiwKLQkweGM2LCAweDM2LCAweDJiLCAweDI3LCAweDljLCAweDRlLCAweGRjLCAweDY2LCAweGU5LCAweGUwLCAweDY0LCAweGUyLAotCTB4NTYsIDB4ZWIsIDB4NzMsIDB4M2EsIDB4MTEsIDB4YjMsIDB4M2UsIDB4ZmYsIDB4MjQsIDB4NjEsIDB4ZWIsIDB4MjYsCi0JMHg5NywgMHhhOCwgMHhiNywgMHgzZSwgMHhlNywgMHgxMywgMHhmNiwgMHhkOSwgMHhlOSwgMHhkOSwgMHg4NCwgMHg2NiwKLQkweDdkLCAweDNlLCAweDlmLCAweDg4LCAweDU4LCAweDlmLCAweDY3LCAweDEzLCAweGI3LCAweDVjLCAweGU3LCAweDhiLAotCTB4M2YsIDB4ZmYsIDB4MGYsIDB4NGMsIDB4ZDMsIDB4ODUsIDB4NzYsIDB4ZGMsIDB4M2EsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkweGFkLCAweDdiLCAweDBkLCAweDcwLCAweDk0LCAweGY3LCAweDc5LCAweGU3LCAweGVmLCAweGJmLCAweDFmLCAweGQyLAorCTB4YWUsIDB4YjQsIDB4NWEsIDB4YWQsIDB4ZjAsIDB4ODIsIDB4NTcsIDB4ODksIDB4NTIsIDB4ZjYsIDB4ZjUsIDB4YmUsCisJMHgyYiwgMHgyZCwgMHg5NiwgMHg4MCwgMHg3NywgMHg0MSwgMHgwNCwgMHgxMSwgMHg2ZCwgMHhjZCwgMHg1NiwgMHgwOCwKKwkweDIxLCAweDQwLCAweGQ4LCAweDMyLCAweDU2LCAweDkyLCAweDI1LCAweGM3LCAweGQ0LCAweDJhLCAweGM4LCAweDIwLAorCTB4ZGIsIDB4MTgsIDB4OGIsIDB4ODYsIDB4ZTYsIDB4ZTQsIDB4ZDYsIDB4YWQsIDB4ZDYsIDB4OTIsIDB4YzAsIDB4NjAsCisJMHg1NiwgMHhiYywgMHgyMiwgMHg4MiwgMHgwOCwgMHg3NywgMHhlZSwgMHgyNiwgMHhiMiwgMHgyNSwgMHgyYywgMHhlYywKKwkweGFjLCAweDU4LCAweDNiLCAweGJkLCAweGViLCAweGM1LCAweDMzLCAweGM5LCAweDU4LCAweDY3LCAweDZjLCAweDRjLAorCTB4NzIsIDB4ZmUsIDB4YzgsIDB4NzUsIDB4M2EsIDB4M2QsIDB4ZjcsIDB4ZTYsIDB4ZWUsIDB4Y2EsIDB4ZjgsIDB4ODMsCisJMHhkOCwgMHg2ZSwgMHg4YywgMHhkZCwgMHg0YywgMHgzYSwgMHgyNywgMHg1MiwgMHhkYiwgMHhlZiwgMHhmZCwgMHg5ZSwKKwkweGY3LCAweGRkLCAweDA1LCAweGUyLCAweGJhLCAweGQzLCAweDk5LCAweGNlLCAweDY5LCAweDY2LCAweDY3LCAweGE1LAorCTB4ZjcsIDB4ZTMsIDB4ZjksIDB4M2YsIDB4ZGYsIDB4Y2YsIDB4ZWYsIDB4NzksIDB4ZmUsIDB4N2YsIDB4ZDUsIDB4MDMsCisJMHgxNSwgMHgyOCwgMHhmZSwgMHg1NCwgMHhmMSwgMHhkMywgMHgzYywgMHgzMCwgMHg3OCwgMHg3MCwgMHhkNSwgMHg4YSwKKwkweGU2LCAweDE1LCAweGY2LCAweDA1LCAweDk3LCAweGM3LCAweDIzLCAweDM3LCAweGJmLCAweGFhLCAweDgwLCAweGRlLAorCTB4MGYsIDB4ZjAsIDB4NmYsIDB4ZmEsIDB4ZjksIDB4Y2EsIDB4YmYsIDB4ZWQsIDB4MzUsIDB4ZmIsIDB4YzcsIDB4MGQsCisJMHg4NCwgMHg0YSwgMHg3YywgMHhjOSwgMHgwNywgMHgzZSwgMHg1NywgMHhlYSwgMHhkMiwgMHhkNywgMHhkYSwgMHg3NCwKKwkweGY4LCAweGRjLCAweGE5LCAweDkzLCAweGE5LCAweGRkLCAweDNhLCAweDkwLCAweGNlLCAweDM3LCAweDQ2LCAweDM3LAorCTB4ZTAsIDB4NTMsIDB4MmIsIDB4MWIsIDB4ZjYsIDB4NDAsIDB4YWUsIDB4N2YsIDB4MjUsIDB4ZjUsIDB4YzksIDB4ZDAsCisJMHg0ZiwgMHhkNiwgMHg2YSwgMHgxZiwgMHg0ZiwgMHhiOSwgMHhlMSwgMHgwYiwgMHhhNSwgMHg0ZSwgMHgyMywgMHg1NCwKKwkweDBmLCAweDVmLCAweDFkLCAweGRmLCAweGY5LCAweDBmLCAweDBkLCAweGQ1LCAweDZlLCAweDA0LCAweDRiLCAweGI0LAorCTB4NWEsIDB4MzAsIDB4NjIsIDB4MjIsIDB4ZWIsIDB4NGIsIDB4MGQsIDB4YTAsIDB4N2MsIDB4MGQsIDB4ZjAsIDB4NmUsCisJMHgyZSwgMHg2ZSwgMHg4YywgMHgwMCwgMHhlMywgMHhhZSwgMHg1NCwgMHgzYywgMHhmYSwgMHgyMiwgMHgwYywgMHgxYywKKwkweDJhLCAweDQ0LCAweGQxLCAweGNlLCAweGNmLCAweDY2LCAweGYzLCAweDMzLCAweDJiLCAweGVhLCAweDQ1LCAweGQ2LAorCTB4Y2QsIDB4ZTcsIDB4NzYsIDB4MzUsIDB4MDMsIDB4MWIsIDB4NzMsIDB4MDYsIDB4MGUsIDB4OWIsIDB4ZjAsIDB4ZDUsCisJMHhhNiwgMHgxZSwgMHhjNiwgMHgzYSwgMHg3ZSwgMHgwNywgMHg1MywgMHg4MywgMHg3OCwgMHg3ZCwgMHgyYywgMHgxNiwKKwkweDdkLCAweDBhLCAweDVhLCAweDQ2LCAweDc3LCAweDZiLCAweDgzLCAweDQwLCAweDYzLCAweDdmLCAweDlmLCAweGQyLAorCTB4N2EsIDB4ZGYsIDB4NTAsIDB4NWEsIDB4ZjcsIDB4OTgsIDB4ODIsIDB4NGYsIDB4ZjEsIDB4YjksIDB4YzYsIDB4YmMsCisJMHg3YywgMHgwZiwgMHhlMiwgMHhkNiwgMHhiYywgMHgwZiwgMHg5NywgMHhkYywgMHhiMiwgMHhmZSwgMHhlZiwgMHg1MiwKKwkweGRmLCAweDBhLCAweDFlLCAweGJkLCAweDA1LCAweGEzLCAweGU0LCAweGMxLCAweDliLCAweDUyLCAweDc4LCAweGIyLAorCTB4MzksIDB4MWUsIDB4MTksIDB4ODYsIDB4ZGMsIDB4OGYsIDB4NjIsIDB4NDMsIDB4NDEsIDB4YmUsIDB4MzUsIDB4NGEsCisJMHg2ZCwgMHg1OSwgMHhhMywgMHg4NiwgMHg2NSwgMHg5ZCwgMHgzMSwgMHhjYSwgMHg5MSwgMHgwZCwgMHg2OSwgMHgxMSwKKwkweDQwLCAweDYxLCAweGQ4LCAweDcwLCAweDIxLCAweDFkLCAweDZhLCAweDhiLCAweDdhLCAweGEwLCAweDQ1LCAweGVlLAorCTB4YzEsIDB4M2YsIDB4NTEsIDB4ZTYsIDB4NzQsIDB4YzIsIDB4MGIsIDB4ZTcsIDB4ZjksIDB4NWUsIDB4OTQsIDB4NjMsCisJMHgzZSwgMHhlNCwgMHg2OCwgMHhlZCwgMHhjOSwgMHg5YywgMHg2NSwgMHg1ZCwgMHhkMCwgMHgzZCwgMHgzOCwgMHg0MywKKwkweGZkLCAweDBjLCAweGU3LCAweGZmLCAweGM5LCAweDlhLCAweGE3LCAweDZlLCAweDQ2LCAweGY1LCAweGQyLCAweGZhLAorCTB4M2UsIDB4NGMsIDB4ODUsIDB4MmMsIDB4NmIsIDB4OWEsIDB4ZjcsIDB4MGUsIDB4ZTcsIDB4NGIsIDB4N2EsIDB4YjYsCisJMHgyYywgMHg5NywgMHg2ZSwgMHg1OSwgMHhiYiwgMHhmNSwgMHhkZiwgMHg1OCwgMHhiYiwgMHg3ZSwgMHhlYiwgMHg1OSwKKwkweGNiLCAweDdhLCAweGNjLCAweGI4LCAweDA5LCAweDY3LCAweDI3LCAweGRhLCAweGQ1LCAweDk2LCAweGQ5LCAweDI1LAorCTB4YzEsIDB4Y2QsIDB4OTMsIDB4MTYsIDB4MmUsIDB4MTgsIDB4MDgsIDB4YjksIDB4NTIsIDB4MWQsIDB4NmEsIDB4ZjMsCisJMHg2YywgMHhhNywgMHhkYSwgMHg1OCwgMHhkOCwgMHhhZSwgMHgzYSwgMHhhNiwgMHhiZiwgMHhhNSwgMHgzYSwgMHg2NywKKwkweDdiLCAweGQ1LCAweGE2LCAweDQyLCAweDA0LCAweDMzLCAweDY2LCAweDE4LCAweGQzLCAweDY2LCAweDQ2LCAweGI1LAorCTB4Y2YsIDB4ZjYsIDB4MjgsIDB4NDcsIDB4OGUsIDB4NDEsIDB4ZDUsIDB4NTYsIDB4MjgsIDB4ZDEsIDB4YmEsIDB4YWUsCisJMHhjNywgMHhjZCwgMHhiOSwgMHgxNCwgMHg4ZSwgMHg5OCwgMHhlNSwgMHg1YywgMHg2NywgMHhjMSwgMHhmYSwgMHg0OSwKKwkweGMzLCAweDAyLCAweGU1LCAweDM0LCAweDcwLCAweGI0LCAweGYwLCAweDE4LCAweGI2LCAweDRkLCAweDVhLCAweDU2LAorCTB4M2UsIDB4MDksIDB4ZTQsIDB4MGIsIDB4YzAsIDB4MGYsIDB4Y2MsIDB4NTgsIDB4NzcsIDB4YmYsIDB4YjIsIDB4YWMsCisJMHg0ZCwgMHg3MSwgMHg2YiwgMHhlOSwgMHg2NSwgMHhhMywgMHgzMSwgMHhmMSwgMHgxMiwgMHhmZSwgMHhhZiwgMHgzNSwKKwkweDE1LCAweDQ2LCAweDM2LCAweDQwLCAweDFhLCAweGM3LCAweDY4LCAweGIzLCAweGZiLCAweGM2LCAweGUwLCAweDJiLAorCTB4NGYsIDB4OGQsIDB4ZTIsIDB4MTcsIDB4MzksIDB4ZjgsIDB4Y2EsIDB4NTIsIDB4NTksIDB4NWMsIDB4YzgsIDB4MGQsCisJMHg4NywgMHg3YywgMHg4OCwgMHg0NSwgMHgzNiwgMHhhYiwgMHhlYywgMHhhMCwgMHgwYiwgMHhkYSwgMHhjMCwgMHhkYiwKKwkweGQwLCAweGEyLCAweGI0LCAweGM3LCAweGM1LCAweGYzLCAweDRhLCAweDliLCAweDdmLCAweDA5LCAweDVhLCAweGZhLAorCTB4MzcsIDB4NGEsIDB4ZWIsIDB4YWMsIDB4NzUsIDB4MjMsIDB4ZWQsIDB4OGEsIDB4ZmIsIDB4ZjAsIDB4OTMsIDB4MDYsCisJMHhiMSwgMHhjOSwgMHgyOCwgMHg1NiwgMHhkOCwgMHhiNiwgMHhjOSwgMHg2MiwgMHhkOSwgMHgzNSwgMHhkYiwgMHhhNCwKKwkweDMwLCAweDRjLCAweGJlLCAweDBlLCAweDkzLCAweGFmLCAweDk3LCAweDBkLCAweDJkLCAweGYyLCAweDI0LCAweGFjLAorCTB4YTUsIDB4N2QsIDB4ODYsIDB4ZGMsIDB4NGIsIDB4NjEsIDB4YjQsIDB4NjAsIDB4NDUsIDB4ODMsIDB4YTksIDB4NGIsCisJMHhlNCwgMHgxNywgMHhkOSwgMHgyZiwgMHhhNSwgMHg3YywgMHhkOSwgMHhlYSwgMHhkNCwgMHhhNywgMHhkNiwgMHg2YiwKKwkweDZiLCAweDIyLCAweDc4LCAweGExLCAweDEwLCAweGM2LCAweDczLCAweDg1LCAweDEwLCAweDllLCAweDJkLCAweGI0LAorCTB4YzMsIDB4MmMsIDB4MjAsIDB4YjgsIDB4YWQsIDB4ZjAsIDB4NDUsIDB4N2UsIDB4NmMsIDB4MjEsIDB4YzAsIDB4ZTcsCisJMHhjOSwgMHg3NywgMHg3MCwgMHg2YiwgMHhjMSwgMHhkMywgMHg1YiwgMHg5NiwgMHg0MiwgMHhmNywgMHg0ZiwgMHg3MywKKwkweDQzLCAweDU2LCAweDg1LCAweDhlLCAweGRlLCAweDlhLCAweDk0LCAweDllLCAweGJlLCAweDU1LCAweDA1LCAweDVhLAorCTB4ZTgsIDB4ODcsIDB4ZGQsIDB4YWYsIDB4ZTQsIDB4NWIsIDB4M2MsIDB4ZmEsIDB4NzEsIDB4M2YsIDB4YmMsIDB4ZDQsCisJMHhmZiwgMHhjNiwgMHg4MiwgMHg2NSwgMHg4ZCwgMHgxOCwgMHgwNywgMHg1NiwgMHhlZSwgMHg2YSwgMHhmOSwgMHg4YiwKKwkweGY5LCAweDZlLCAweGJkLCAweDBiLCAweGQ5LCAweDQyLCAweDFmLCAweDEwLCAweDRjLCAweGYxLCAweDliLCAweGExLAorCTB4YjgsIDB4YmQsIDB4YTksIDB4M2QsIDB4N2EsIDB4ZWUsIDB4MDEsIDB4OGYsIDB4ZTMsIDB4Y2YsIDB4ZTQsIDB4ODEsCisJMHg3YSwgMHg3ZiwgMHhjZSwgMHgyNCwgMHgwZiwgMHhlNiwgMHhlMSwgMHgyMCwgMHgyYSwgMHhhMiwgMHg5NCwgMHhlZiwKKwkweGU3LCAweGU0LCAweDMzLCAweDgxLCAweDFmLCAweDE2LCAweDc0LCAweGYyLCAweGQ2LCAweDQ0LCAweDFlLCAweGEzLAorCTB4ZTQsIDB4Y2YsIDB4ODcsIDB4NWQsIDB4MTMsIDB4ZGEsIDB4NzgsIDB4MTYsIDB4ZGEsIDB4OTEsIDB4MjksIDB4MmMsCisJMHg0NywgMHgzYSwgMHgxYywgMHhhMiwgMHgwZiwgMHhmZSwgMHgzOSwgMHgxYywgMHgxYSwgMHg1ZCwgMHgzOCwgMHg2ZSwKKwkweDYyLCAweDU1LCAweDI4LCAweDQ1LCAweGZiLCAweDI2LCAweGYxLCAweDcwLCAweDE5LCAweGUyLCAweGJkLCAweDFmLAorCTB4MmIsIDB4ODUsIDB4ZDcsIDB4ZTIsIDB4NWQsIDB4MTgsIDB4YTMsIDB4M2MsIDB4NWQsIDB4NzksIDB4M2YsIDB4ZWUsCisJMHg5ZiwgMHhhOCwgMHhjMCwgMHhiZCwgMHgxMywgMHgxNiwgMHhlZSwgMHg0YiwgMHgyMiwgMHg1NSwgMHg0MSwgMHg3OSwKKwkweDEyLCAweGM5LCAweDc4LCAweGY0LCAweDNkLCAweDc4LCAweGQwLCAweDllLCAweGVmLCAweDYyLCAweDJjLCAweDZkLAorCTB4NDAsIDB4YmEsIDB4Y2MsIDB4ODcsIDB4MGQsIDB4ZjksIDB4MDAsIDB4ZTMsIDB4MzEsIDB4OGQsIDB4ZDMsIDB4OTMsCisJMHgzZSwgMHg3OCwgMHg1NywgMHhiYiwgMHgzMCwgMHgxNSwgMHgyZSwgMHg0MywgMHhhMiwgMHhkZSwgMHhjNSwgMHg0ZiwKKwkweDM4LCAweGQ4LCAweDM2LCAweDU5LCAweDE3LCAweGRjLCAweDY4LCAweDdhLCAweGIwLCAweGQ3LCAweDc0LCAweDYxLAorCTB4NjgsIDB4YzIsIDB4YjIsIDB4ZGEsIDB4MGQsIDB4MGIsIDB4NTcsIDB4NTcsIDB4ODcsIDB4ZjAsIDB4M2MsIDB4ZjUsCisJMHg3NywgMHhjMCwgMHg4YywgMHhlMCwgMHg2YywgMHhlMSwgMHg1MSwgMHhmMiwgMHgxMiwgMHg3NiwgMHhmOCwgMHgzNSwKKwkweGM5LCAweGJiLCAweDQ5LCAweGRlLCAweDRkLCAweGYyLCAweDZkLCAweDBhLCAweDlmLCAweGU3LCAweDE5LCAweDMzLAorCTB4MDYsIDB4ZTUsIDB4ZjIsIDB4OTMsIDB4ODcsIDB4NGEsIDB4ZjQsIDB4OTMsIDB4OGYsIDB4NTgsIDB4ZDIsIDB4ODIsCisJMHgyYiwgMHhhOSwgMHg2NSwgMHg3NywgMHgzMSwgMHg3OSwgMHgyZCwgMHhhZCwgMHhiNywgMHhhYywgMHg4ZiwgMHg1NywKKwkweDhiLCAweDJjLCAweGI0LCAweGI5LCAweGFiLCAweDRiLCAweDYyLCAweGY0LCAweGY3LCAweGFhLCAweDE4LCAweDU3LAorCTB4N2YsIDB4NGIsIDB4YmQsIDB4M2QsIDB4NWUsIDB4ZjAsIDB4NjMsIDB4NzAsIDB4YzIsIDB4ZjYsIDB4ZGIsIDB4ODMsCisJMHg2NSwgMHhlNCwgMHg1YiwgMHhmOCwgMHgyYSwgMHhlOCwgMHg3MSwgMHhjNiwgMHg2OCwgMHgzYywgMHhjMywgMHgxOCwKKwkweGM1LCAweDU2LCAweGYyLCAweDdjLCAweDlmLCAweDE5LCAweDZmLCAweGQ5LCAweGFlLCAweDNjLCAweGQ4LCAweDk0LAorCTB4MGYsIDB4MDcsIDB4ZGIsIDB4NmYsIDB4ZTAsIDB4OTMsIDB4ZjIsIDB4NGEsIDB4MGMsIDB4NTIsIDB4ZDYsIDB4MTAsCisJMHhmOSwgMHgwYiwgMHg2MywgMHgzNywgMHhmOSwgMHg3YywgMHhhZSwgMHhjOCwgMHhlNywgMHg3NCwgMHg0MSwgMHhkNiwKKwkweGZhLCAweDNjLCAweGFmLCAweDI1LCAweDNlLCAweDkxLCAweDVkLCAweDk0LCAweDBhLCAweDJiLCAweDU0LCAweDA0LAorCTB4YjAsIDB4M2QsIDB4ZmYsIDB4MjYsIDB4NmQsIDB4NTEsIDB4ODcsIDB4YmYsIDB4YTAsIDB4MGQsIDB4NWUsIDB4NjAsCisJMHg4YywgMHhmYywgMHhmMCwgMHg5YSwgMHhiZiwgMHg4OCwgMHgzZCwgMHgxZSwgMHhhMSwgMHgxZCwgMHhiNCwgMHhkMywKKwkweDU5LCAweDA0LCAweGQwLCAweDViLCAweDQ4LCAweGUzLCAweGQwLCAweDI0LCAweGQyLCAweDMzLCAweGM2LCAweDMxLAorCTB4YzYsIDB4ZmIsIDB4MTIsIDB4YjgsIDB4ZjUsIDB4ZjIsIDB4NzQsIDB4NDgsIDB4YWYsIDB4YzAsIDB4ZWUsIDB4ZTksCisJMHgzMCwgMHgwNiwgMHgwYSwgMHg2ZCwgMHgzMCwgMHgyNywgMHhjMiwgMHhkOCwgMHg0NywgMHhkZiwgMHhiYywgMHg5MiwKKwkweDRjLCAweGRmLCAweDE3LCAweDg0LCAweGYwLCAweDFlLCAweGM2LCAweGZkLCAweDdjLCAweGU3LCAweGIxLCAweGM5LAorCTB4MzAsIDB4ZmEsIDB4YTksIDB4YTMsIDB4Y2QsIDB4YzksIDB4NzgsIDB4OGIsIDB4OWYsIDB4ZDcsIDB4ZjYsIDB4ZjIsCisJMHhkYSwgMHg2MSwgMHhlYSwgMHhmZiwgMHhiYywgMHgzMSwgMHg4NiwgMHhkZSwgMHg2ZSwgMHgyZCwgMHgwMSwgMHg4NCwKKwkweGIxLCAweGM3LCAweDQ0LCAweDg4LCAweDJlLCAweGZjLCAweDA4LCAweGYzLCAweDViLCAweGUyLCAweDNjLCAweGZmLAorCTB4YmUsIDB4YTcsIDB4NTAsIDB4NDEsIDB4MzksIDB4ODMsIDB4ODgsIDB4ZTgsIDB4OWYsIDB4NTgsIDB4ZGUsIDB4NjYsCisJMHhjYiwgMHhmYSwgMHhiZSwgMHgxMSwgMHhiZiwgMHhmOCwgMHg5NiwgMHhkYiwgMHg4MywgMHg4NywgMHgwYSwgMHgyZSwKKwkweDBjLCAweDRlLCAweDU3LCAweGUwLCAweDBmLCAweDI3LCAweDNjLCAweGI4LCAweGIzLCAweGJlLCAweDAyLCAweDA3LAorCTB4YTYsIDB4ZDMsIDB4MTgsIDB4OTksIDB4YWMsIDB4NDAsIDB4ZGYsIDB4MDQsIDB4OTYsIDB4ZWUsIDB4MzEsIDB4NDYsCisJMHg2YSwgMHhjYSwgMHhhMCwgMHgyZCwgMHhiNCwgMHgyMywgMHg4MSwgMHhhYiwgMHhiNCwgMHhjMywgMHg0MywgMHhkMywKKwkweDgxLCAweDYwLCAweDY2LCAweDMyLCAweDg0LCAweGMxLCAweDU5LCAweDNmLCAweDlmLCAweDc3LCAweGYxLCAweGY5LAorCTB4NzIsIDB4MTgsIDB4YWIsIDB4NjIsIDB4ODMsIDB4MjEsIDB4MDgsIDB4OGYsIDB4OTUsIDB4ZDgsIDB4M2YsIDB4ZWQsCisJMHhjNywgMHgwMywgMHgxMywgMHgyMSwgMHhlYywgMHg5YiwgMHg2YywgMHhjNiwgMHhiOCwgMHg5OSwgMHhjNiwgMHg1MSwKKwkweGU2LCAweDhlLCAweDFmLCAweDI0LCAweGI1LCAweGVlLCAweDdkLCAweDRhLCAweDRiLCAweDZmLCAweDU0LCAweDY5LAorCTB4MzQsIDB4MjQsIDB4YmQsIDB4YjgsIDB4YzQsIDB4M2MsIDB4ZTQsIDB4NGQsIDB4MzYsIDB4YjYsIDB4M2MsIDB4Y2IsCisJMHhkYywgMHg1MCwgMHg5NiwgMHgwYSwgMHhmMywgMHg2ZiwgMHhlZCwgMHgwOCwgMHg2MywgMHgzNiwgMHhlZCwgMHg3NSwKKwkweGFkLCAweDA2LCAweDE2LCAweDRiLCAweGZjLCAweDg2LCAweDgzLCAweDViLCAweGNjLCAweDUwLCAweDcwLCAweDRiLAorCTB4YTEsIDB4MmUsIDB4YjgsIDB4ZDksIDB4OGMsIDB4MDQsIDB4MzcsIDB4MzMsIDB4YmUsIDB4MzYsIDB4OGEsIDB4M2YsCisJMHg5YSwgMHgzZSwgMHgxYywgMHg0YiwgMHg3ZSwgMHg2YSwgMHhmNSwgMHhkNiwgMHhkOCwgMHhmOSwgMHgyYywgMHhiOCwKKwkweDZkLCAweDUyLCAweGNiLCAweDRlLCAweDQxLCAweDMzLCAweDU4LCAweDBkLCAweDMwLCAweDM2LCAweGViLCAweGExLAorCTB4ZmQsIDB4MTQsIDB4NmEsIDB4ZjQsIDB4NjYsIDB4ZTYsIDB4ZjEsIDB4MTAsIDB4ZjYsIDB4MzMsIDB4YTcsIDB4ZmMsCisJMHgxNSwgMHg3MywgMHg0YSwgMHhkZiwgMHhmMSwgMHg1OCwgMHg2OCwgMHgxYywgMHg3ZSwgMHhlYSwgMHgxYiwgMHhkOCwKKwkweDc1LCAweDJlLCAweDRjLCAweDliLCAweDc3LCAweGUyLCAweDUxLCAweGYyLCAweGI1LCAweDc5LCAweDRkLCAweDE4LAorCTB4ZjcsIDB4MTYsIDB4NDIsIDB4YzEsIDB4NGUsIDB4ZGEsIDB4ZWYsIDB4YmQsIDB4N2MsIDB4MjQsIDB4YjgsIDB4ODEsCisJMHhiNiwgMHg3YywgMHgzYiwgMHhhZiwgMHg0NSwgMHhlNywgMHhmMSwgMHg4ZiwgMHhlMiwgMHg0ZiwgMHgwOSwgMHhiOCwKKwkweDgwLCAweDNkLCAweGM3LCAweGJkLCAweDk4LCAweDBmLCAweGNiLCAweDVhLCAweGQ0LCAweGI5LCAweGY5LCAweDgyLAorCTB4MTUsIDB4ZDAsIDB4ZjUsIDB4ZDMsIDB4ZmIsIDB4YTgsIDB4ZWIsIDB4NmYsIDB4MTcsIDB4MDIsIDB4NzgsIDB4YzAsCisJMHhkNCwgMHgxMiwgMHgzZiwgMHg1NCwgMHgwMSwgMHhlYSwgMHhkNCwgMHg0NywgMHgzZCwgMHgzMCwgMHhjMSwgMHgyYywKKwkweDkxLCAweGU3LCAweDkyLCAweDg4LCAweDJlLCAweDcxLCAweDcyLCAweGVkLCAweDgxLCAweDY5LCAweGYxLCAweDEzLAorCTB4ZGEsIDB4ZGUsIDB4YTQsIDB4MGYsIDB4ZDAsIDB4N2YsIDB4N2UsIDB4NzgsIDB4MmQsIDB4NTYsIDB4YjUsIDB4NTAsCisJMHhkNiwgMHhjZSwgMHhkZCwgMHgwOSwgMHhmYSwgMHg4YiwgMHhhMywgMHhhMywgMHgxMywgMHg5MywgMHhhMiwgMHgwNywKKwkweDZkLCAweDFjLCAweGFlLCAweDM0LCAweDU2LCAweGFlLCAweGZhLCAweDJiLCAweGViLCAweGQyLCAweDYyLCAweGQxLAorCTB4NDcsIDB4MDgsIDB4NDMsIDB4ZDQsIDB4ZTEsIDB4NjksIDB4ZDMsIDB4YjIsIDB4YWUsIDB4YWUsIDB4ZmUsIDB4ZDAsCisJMHg2YSwgMHhiOSwgMHg1OSwgMHhmNCwgMHgyMiwgMHhiMiwgMHgzZSwgMHhhZiwgMHhhNCwgMHg4ZSwgMHhkNCwgMHhlOCwKKwkweGMxLCAweGZmLCAweDBmLCAweGJlLCAweGYyLCAweDFkLCAweGFiLCAweGQ3LCAweDk2LCAweDRmLCAweGZjLCAweGM1LAorCTB4NDMsIDB4NWYsIDB4N2MsIDB4OTQsIDB4YjQsIDB4NWQsIDB4ZTgsIDB4MjUsIDB4YmQsIDB4MDcsIDB4NGQsIDB4ZWIsCisJMHhhMywgMHhkYSwgMHhkNCwgMHg2NywgMHg1NiwgMHhjYiwgMHg1YSwgMHg3ZCwgMHg2MCwgMHg0MSwgMHhmZCwgMHgwZiwKKwkweDVlLCAweDBmLCAweDYzLCAweDdmLCAweGExLCAweDg1LCAweGJhLCAweDZiLCAweGM3LCAweDYzLCAweGQ0LCAweGUxLAorCTB4NjEsIDB4NTMsIDB4NzIsIDB4NjIsIDB4ODQsIDB4ZmUsIDB4NWMsIDB4NDcsIDB4ZmYsIDB4ZjYsIDB4YTgsIDB4OGQsCisJMHg2NiwgMHgxZSwgMHg5YiwgMHhjNywgMHhiMiwgMHhkOCwgMHg0NCwgMHg3ZiwgMHhiZiwgMHg5OCwgMHg4YiwgMHhiNSwKKwkweDNjLCAweDBkLCAweDJkLCAweDRiLCAweDE5LCAweDgyLCAweDlkLCAweGQ0LCAweDcxLCAweGJiLCAweGE5LCAweDc1LAorCTB4OGEsIDB4NGQsIDB4ZGIsIDB4OTksIDB4OTcsIDB4NWUsIDB4Y2MsIDB4NDUsIDB4ODIsIDB4NmQsIDB4MDUsIDB4ZDEsCisJMHg3NywgMHg1ZCwgMHg3MCwgMHg0MywgMHhlMSwgMHhhYiwgMHhiNCwgMHhiZCwgMHhjMiwgMHhiYSwgMHhlNSwgMHgzZSwKKwkweGU2LCAweDk5LCAweDNiLCAweGUxLCAweGQ4LCAweGQ1LCAweGIxLCAweGRkLCAweDZiLCAweGM5LCAweGM2LCAweGRlLAorCTB4MGYsIDB4OTksIDB4OWYsIDB4YjIsIDB4OGIsIDB4OWQsIDB4NmIsIDB4ODMsIDB4YmMsIDB4NTYsIDB4YmQsIDB4MWEsCisJMHhjMSwgMHgzYiwgMHhlOCwgMHgwNywgMHg3NywgMHhkMywgMHgwZiwgMHhhZSwgMHhhZSwgMHhmZSwgMHhkNCwgMHg4YSwKKwkweGRlLCAweGU0LCAweGY4LCAweDQxLCAweGRiLCAweGE0LCAweDI3LCAweGQ4LCAweDQxLCAweDNkLCAweDZkLCAweDM0LAorCTB4MTQsIDB4YTYsIDB4OGQsIDB4MWMsIDB4N2EsIDB4YWYsIDB4NjEsIDB4ODcsIDB4ZjQsIDB4ZDQsIDB4NTksIDB4MjMsCisJMHhjZCwgMHgzYywgMHhmMiwgMHhiYiwgMHhmMCwgMHhkNCwgMHg2MCwgMHhlYSwgMHg2OSwgMHhlMywgMHg1MSwgMHg0NCwKKwkweDFkLCAweGRmLCAweGMxLCAweGJlLCAweDA5LCAweDNmLCAweGIyLCAweDc3LCAweDg2LCAweDMwLCAweGQzLCAweDEwLAorCTB4YzIsIDB4ODMsIDB4YTQsIDB4N2QsIDB4MjUsIDB4ZDksIDB4ZDgsIDB4ZmYsIDB4M2EsIDB4NzUsIDB4MzAsIDB4NTUsCisJMHgyMywgMHhkNywgMHhkMiwgMHhmOCwgMHg5MSwgMHhmMSwgMHgzMCwgMHg3MCwgMHg5MywgMHhiMywgMHhmNiwgMHhhYywKKwkweGM0LCAweGU4LCAweDZjLCAweDMzLCAweDBlLCAweDE3LCAweDMyLCAweGNhLCAweGM5LCAweDliLCAweDVhLCAweDY3LAorCTB4MWEsIDB4M2YsIDB4YjcsIDB4MjQsIDB4OTcsIDB4Y2UsIDB4OWEsIDB4Y2MsIDB4NzEsIDB4ZDQsIDB4YzcsIDB4MjgsCisJMHhmZCwgMHg2OCwgMHgzOCwgMHg1ZiwgMHgxNywgMHhkYywgMHg0NCwgMHgzZiwgMHg3YSwgMHgzNCwgMHgyZiwgMHgzMiwKKwkweGM1LCAweDBkLCAweGMzLCAweDVkLCAweGNiLCAweGRhLCAweDRjLCAweGZkLCAweDk4LCAweDc2LCAweGNkLCAweGFmLAorCTB4MGUsIDB4ZTksIDB4NDcsIDB4MzEsIDB4NmUsIDB4ZjMsIDB4MzYsIDB4YTgsIDB4MzIsIDB4YzQsIDB4MTgsIDB4MGMsCisJMHg5OSwgMHhlYSwgMHg3MiwgMHhmZCwgMHgwMCwgMHgxZSwgMHhiNSwgMHhhZiwgMHg4NSwgMHg4MywgMHgzYiwgMHgyNiwKKwkweGQzLCAweDJlLCAweDk3LCAweDhlLCAweDUwLCAweDY1LCAweGFhLCAweDVkLCAweGVkLCAweDYwLCAweGRkLCAweGVkLAorCTB4OTgsIDB4ZWMsIDB4NTAsIDB4MWQsIDB4YjMsIDB4MTIsIDB4MDMsIDB4OWQsIDB4NmEsIDB4MzMsIDB4NmIsIDB4NmUsCisJMHg5YSwgMHgzNSwgMHgzNywgMHhjZCwgMHg5YSwgMHg5YiwgMHgyNiwgMHgxZiwgMHg2OSwgMHhkNiwgMHhkYSwgMHhiNiwKKwkweGMyLCAweGEwLCAweGRhLCAweDJhLCAweGZhLCAweGE3LCAweDdmLCAweDNkLCAweDZiLCAweDNhLCAweDM4LCAweDgyLAorCTB4MzksIDB4MjgsIDB4YjgsIDB4YTksIDB4YjAsIDB4YzIsIDB4ZTUsIDB4NjAsIDB4YmIsIDB4NDEsIDB4NTUsIDB4YzQsCisJMHgzMiwgMHhiZSwgMHgwYSwgMHg5ZCwgMHhiNSwgMHhjYywgMHgxYywgMHg1NCwgMHg1YiwgMHg1OCwgMHg2ZiwgMHgzMywKKwkweGI2LCAweDJlLCAweDYzLCAweDAzLCAweGVmLCAweGIwLCAweGNlLCAweGJlLCAweGM2LCAweDNhLCAweDliLCAweDRmLAorCTB4MzIsIDB4YWUsIDB4OTYsIDB4NWYsIDB4YjUsIDB4N2EsIDB4MTcsIDB4M2IsIDB4MzUsIDB4NjEsIDB4ODQsIDB4ZmMsCisJMHg3ZSwgMHg5ZiwgMHgzNiwgMHg5YiwgMHg2NywgMHgyZCwgMHg2ZCwgMHg3NywgMHgyYiwgMHhlYywgMHhkMSwgMHg1MSwKKwkweDVkLCAweGNiLCAweDljLCAweDdhLCAweGI4LCAweGMwLCAweDNhLCAweDYwLCAweGM0LCAweDVhLCAweGRlLCAweGE3LAorCTB4NjIsIDB4MGYsIDB4ZWIsIDB4NWUsIDB4NWMsIDB4YmQsIDB4ODksIDB4NjAsIDB4NDcsIDB4NmYsIDB4YzMsIDB4YjEsCisJMHg4OSwgMHg3MiwgMHhmNCwgMHgyNywgMHhkMywgMHg4YiwgMHg3YywgMHhjNCwgMHgyYSwgMHg5ZCwgMHhjZCwgMHg3OCwKKwkweDk4LCAweDRiLCAweGFiLCAweDQ4LCAweDJhLCAweDRlLCAweGJmLCAweDQxLCAweGZhLCAweDM4LCAweGViLCAweGM0LAorCTB4OTgsIDB4ZjksIDB4NTUsIDB4ZTQsIDB4NTksIDB4NGYsIDB4NjcsIDB4MGMsIDB4MGYsIDB4NWUsIDB4Y2IsIDB4YWYsCisJMHg2MCwgMHg5ZSwgMHg4YiwgMHgxYiwgMHgwMSwgMHg1NSwgMHhjMSwgMHhmOCwgMHg0ZCwgMHgyMSwgMHg2NywgMHg0YSwKKwkweDdlLCAweGIyLCAweGFjLCAweDE5LCAweGUxLCAweDIxLCAweDFlLCAweDRmLCAweDBmLCAweDQzLCAweDcyLCAweDk2LAorCTB4YjUsIDB4ZjQsIDB4OWUsIDB4NjQsIDB4MTksIDB4ZDYsIDB4YzUsIDB4ODMsIDB4NTgsIDB4YWEsIDB4ZjcsIDB4YWEsCisJMHhjZSwgMHg0MiwgMHhkYywgMHgzOCwgMHg4ZiwgMHg2ZiwgMHhhOSwgMHhiYiwgMHg2NywgMHg1MywgMHg4YywgMHhlZCwKKwkweDBjLCAweDc1LCAweDUzLCAweDgxLCAweDRiLCAweDYxLCAweGUxLCAweDExLCAweGQ1LCAweDVlLCAweGRkLCAweDg1LAorCTB4NzcsIDB4ZWYsIDB4NTIsIDB4MDgsIDB4ZTksIDB4NjksIDB4NWMsIDB4NjgsIDB4MGUsIDB4ZDEsIDB4YWYsIDB4M2EsCisJMHg4OSwgMHgzMSwgMHhhMiwgMHg3MCwgMHhjZiwgMHg0NSwgMHg4MiwgMHg1YiwgMHg2OSwgMHg4YiwgMHhjYSwgMHhiOSwKKwkweDNhLCAweGRhLCAweDg3LCAweGJlLCAweDQ3LCAweDFkLCAweGI2LCAweDUxLCAweDg3LCAweDViLCAweGE2LCAweDExLAorCTB4YWEsIDB4NDgsIDB4ZjUsIDB4YTgsIDB4OGUsIDB4NDIsIDB4YmIsIDB4NmEsIDB4MmYsIDB4NjgsIDB4ZDQsIDB4OTMsCisJMHhlOCwgMHhlNCwgMHgzYiwgMHhjNCwgMHg0YSwgMHhlMiwgMHgyYiwgMHgyNSwgMHg1YiwgMHg4YSwgMHhiZiwgMHhkZSwKKwkweDY4LCAweGNmLCAweDhjLCAweDRiLCAweDYyLCAweDZlLCAweGRkLCAweGYyLCAweDE0LCAweGUzLCAweGQxLCAweDQ1LAorCTB4YmUsIDB4ODQsIDB4MDcsIDB4MWYsIDB4YWEsIDB4MWIsIDB4YWMsIDB4YTUsIDB4NTcsIDB4OTIsIDB4NGMsIDB4OWUsCisJMHgxNSwgMHgyOSwgMHgxYywgMHgyZiwgMHg3NCwgMHhkMSwgMHgyZSwgMHhhYiwgMHg4YiwgMHhmZSwgMHgxNSwgMHgwYSwKKwkweDZlLCAweDljLCAweDZjLCAweDU3LCAweDFiLCAweDY3LCAweDE3LCAweDA1LCAweGJiLCAweDY5LCAweGMzLCAweGVlLAorCTB4ZDksIDB4ODgsIDB4ZDAsIDB4ZTUsIDB4ZmEsIDB4NjIsIDB4ZGIsIDB4MzQsIDB4NWMsIDB4ZmEsIDB4YmYsIDB4NjQsCisJMHhjYiwgMHg2ZiwgMHg5MywgMHg5NiwgMHhkOCwgMHhkMywgMHg1ZiwgMHhmMiwgMHhkMywgMHhlMCwgMHhkZCwgMHg5MywKKwkweDY5LCAweGJjLCAweGJiLCAweGRhLCAweGNiLCAweDlhLCAweDVhLCAweGMyLCAweDE0LCAweDU1LCAweGM1LCAweGVmLAorCTB4ZDMsIDB4MmUsIDB4ZTgsIDB4ODMsIDB4YWEsIDB4NTMsIDB4ZmMsIDB4YzgsIDB4ZWIsIDB4YWMsIDB4NzksIDB4YzcsCisJMHgyNCwgMHhiYywgMHg4NCwgMHgwYSwgMHg1MSwgMHgzNywgMHgzMSwgMHhkZCwgMHg4NywgMHhjOSwgMHg3OCwgMHhlZiwKKwkweDM5LCAweGQ1LCAweGE1LCAweGJhLCAweDBhLCAweDUyLCAweDgzLCAweDFkLCAweDlmLCAweDZhLCAweGEzLCAweDRmLAorCTB4YjUsIDB4OTMsIDB4OWYsIDB4NzYsIDB4ZmEsIDB4ZDQsIDB4MTYsIDB4ZjIsIDB4YjMsIDB4YzUsIDB4ZjYsIDB4MjksCisJMHhmMSwgMHhjZCwgMHhkZiwgMHhlNiwgMHg2NSwgMHg0MywgMHhlMSwgMHg2ZSwgMHg1YiwgMHgyZiwgMHg1YiwgMHhmOSwKKwkweDZlLCAweDI3LCAweGU1LCAweGU4LCAweGU0LCAweDdiLCAweDc3LCAweGYzLCAweGJkLCAweGJiLCAweDY3LCAweGZmLAorCTB4OTcsIDB4ZjAsIDB4NDcsIDB4NTksIDB4OWMsIDB4ZDgsIDB4YmYsIDB4NWUsIDB4ZDMsIDB4MjQsIDB4MDcsIDB4ZmMsCisJMHhhYywgMHg4OCwgMHgyOSwgMHg5MCwgMHg3NSwgMHhhNSwgMHgyNCwgMHg0NywgMHgwYywgMHhhMCwgMHhiYiwgMHgxOSwKKwkweGJlLCAweDQ1LCAweGE5LCAweDY3LCAweDViLCAweGI3LCAweGQ3LCAweDMzLCAweDlmLCAweDMxLCAweDlmLCAweGZhLAorCTB4OGUsIDB4MTMsIDB4NGIsIDB4MzMsIDB4NDcsIDB4Y2YsIDB4YjQsIDB4MjgsIDB4OGMsIDB4MTgsIDB4MzcsIDB4MzMsCisJMHg0ZSwgMHgwZCwgMHgxYywgMHgyOSwgMHg2OCwgMHg5ZCwgMHg1MSwgMHhkZSwgMHg2YiwgMHgxYSwgMHgxMywgMHg4YywKKwkweGJmLCAweDBmLCAweDZkLCAweGM0LCAweDc1LCAweDkxLCAweDU0LCAweDNmLCAweDIyLCAweDY2LCAweDJjLCAweDcyLAorCTB4NDQsIDB4NjksIDB4ZmQsIDB4MWIsIDB4YTAsIDB4NWQsIDB4NjQsIDB4NmQsIDB4MTgsIDB4OWMsIDB4NTYsIDB4ZGEsCisJMHg0MCwgMHhhZCwgMHg1YiwgMHg0YiwgMHhiZiwgMHg2MSwgMHhlMywgMHhlYiwgMHg3ZCwgMHg1OCwgMHg2ZSwgMHg2MywKKwkweGI4LCAweDdlLCAweDI0LCAweDg4LCAweDY1LCAweGI3LCAweDkyLCAweGU2LCAweGRlLCAweDc1LCAweDBhLCAweDk3LAorCTB4OGQsIDB4MGYsIDB4NjksIDB4NDcsIDB4MmQsIDB4OWQsIDB4NTUsIDB4MDYsIDB4NzIsIDB4Y2MsIDB4MTMsIDB4OTEsCisJMHhlMywgMHg4MiwgMHhkNSwgMHhmNywgMHgxMSwgMHhhYiwgMHhjMywgMHgxNywgMHhlMCwgMHhiMywgMHhiOSwgMHhiMSwKKwkweGQ4LCAweGEwLCAweGNmLCAweGFkLCAweDI1LCAweDg4LCAweGQzLCAweGQzLCAweGE0LCAweDY5LCAweDE0LCAweDg4LAorCTB4ZGYsIDB4YjksIDB4NDYsIDB4NzQsIDB4NGYsIDB4OTEsIDB4NjYsIDB4YmMsIDB4NDgsIDB4NTMsIDB4Y2YsIDB4ODMsCisJMHg3MSwgMHg3MywgMHgwNCwgMHg5YiwgMHhlMiwgMHhhYywgMHgxNSwgMHhjYywgMHg3OSwgMHg0NywgMHhhNSwgMHgyNywKKwkweDIwLCAweGJkLCAweGYyLCAweGUzLCAweDA2LCAweGZmLCAweDFlLCAweDU0LCAweDNiLCAweDI0LCAweGE2LCAweGNhLAorCTB4MWQsIDB4MmIsIDB4NTQsIDB4NzMsIDB4OGQsIDB4YWEsIDB4ZDQsIDB4NDEsIDB4Y2MsIDB4ZDksIDB4NmIsIDB4MGMsCisJMHhjOCwgMHgxYSwgMHgwMywgMHhiZiwgMHg1MCwgMHg1YSwgMHhlMiwgMHg5YywgMHg5MiwgMHg1YywgMHhkZCwgMHg5OCwKKwkweDM5LCAweGM3LCAweDE4LCAweDNhLCAweGFjLCAweGI0LCAweDk2LCAweDYzLCAweDE0LCAweGRmLCAweGFmLCAweDBiLAorCTB4ZmQsIDB4ODMsIDB4YzUsIDB4NzUsIDB4MDYsIDB4ZDAsIDB4OTAsIDB4NjcsIDB4N2MsIDB4MTYsIDB4N2MsIDB4NmEsCisJMHhjMywgMHg0NCwgMHgxYiwgMHg0NiwgMHhhNiwgMHhkYiwgMHgzMCwgMHgzYywgMHhhMSwgMHg3MCwgMHhiNywgMHhiMSwKKwkweDE4LCAweDk3LCAweDZlLCAweGI2LCAweGZiLCAweDk0LCAweGFhLCAweGE1LCAweDdhLCAweDJkLCAweDg2LCAweDQyLAorCTB4YTgsIDB4NzYsIDB4ZTksIDB4NWYsIDB4YzEsIDB4YWUsIDB4MjIsIDB4YzYsIDB4ZGYsIDB4NzQsIDB4YTIsIDB4OWIsCisJMHg3OSwgMHhkZiwgMHhjMiwgMHhmYiwgMHg4YywgMHhhNSwgMHg1OCwgMHgwZCwgMHhkMiwgMHhkZSwgMHg1NCwgMHgwYiwKKwkweGYxLCAweDc4LCAweDlkLCAweGRiLCAweDg5LCAweGY3LCAweDBmLCAweDdkLCAweDhlLCAweDBkLCAweDQ0LCAweGZmLAorCTB4OWYsIDB4YmYsIDB4ZDcsIDB4ODYsIDB4YzcsIDB4MjcsIDB4Y2EsIDB4ZDAsIDB4YjIsIDB4MWEsIDB4NzcsIDB4NDYsCisJMHg1MCwgMHhlNSwgMHg2MiwgMHg4ZCwgMHg3YiwgMHg3MywgMHhiYiwgMHgxYSwgMHhlNCwgMHgzZCwgMHhmYiwgMHg1OSwKKwkweGRmLCAweDk3LCAweDUzLCAweDQ2LCAweGVhLCAweDRmLCAweDFhLCAweGU0LCAweGJhLCAweDlkLCAweDM3LCAweDZlLAorCTB4YjgsIDB4ZGUsIDB4ZmQsIDB4MDUsIDB4ZDcsIDB4MTUsIDB4OWUsIDB4NjEsIDB4MjIsIDB4ZmIsIDB4MDEsIDB4NmIsCisJMHg0YSwgMHgzZSwgMHg2NywgMHhjMSwgMHg5ZCwgMHhmMiwgMHhhMCwgMHg3ZiwgMHgyYywgMHg4YSwgMHg3ZCwgMHg3MywKKwkweDYxLCAweGNjLCAweGU1LCAweGI0LCAweGRlLCAweDRiLCAweGVjLCAweDFmLCAweDc2LCAweDM1LCAweGViLCAweDc4LAorCTB4NjAsIDB4MmUsIDB4ODIsIDB4ZDksIDB4MWMsIDB4MmMsIDB4N2YsIDB4NGEsIDB4OWYsIDB4ZjcsIDB4YWIsIDB4MDQsCisJMHhmNiwgMHhjZSwgMHhkNSwgMHhlMSwgMHg1YywgMHg0ZSwgMHhiZiwgMHgzOCwgMHhhYywgMHhlMiwgMHg4MywgMHhiNSwKKwkweGM0LCAweDFkLCAweDBmLCAweGNlLCAweDM1LCAweDYxLCAweGZmLCAweDljLCAweDhmLCAweGVmLCAweDU4LCAweGQ4LAorCTB4OTIsIDB4YWMsIDB4ZTMsIDB4ZjMsIDB4MmUsIDB4M2MsIDB4N2QsIDB4ZDIsIDB4YjIsIDB4MDQsIDB4NzcsIDB4ZjUsCisJMHhjZiwgMHgwMSwgMHhiMywgMHhlMywgMHhhYywgMHg0NSwgMHg2NywgMHg1OCwgMHg5NywgMHg5ZSwgMHgwMCwgMHhmNiwKKwkweDNlLCAweGUxLCAweGMyLCAweGY0LCAweGI4LCAweDg1LCAweDVkLCAweGM2LCAweDcwLCAweGFkLCAweDhiLCAweDBlLAorCTB4ZGYsIDB4Y2IsIDB4YmEsIDB4ZTEsIDB4NjUsIDB4MGQsIDB4YmMsIDB4MjcsIDB4ZTQsIDB4ZTQsIDB4ZjMsIDB4NGIsCisJMHhjYywgMHg1MywgMHhmNywgMHgzZCwgMHg5MSwgMHhjMCwgMHg5YiwgMHhiOSwgMHgyYywgMHhiNiwgMHgxMCwgMHg5ZiwKKwkweDBmLCAweDkyLCAweDk3LCAweDM3LCAweDcyLCAweGFjLCAweDYzLCAweDczLCAweDA2LCAweDVlLCAweGNmLCAweGY5LAorCTB4YjgsIDB4NGUsIDB4MTMsIDB4NWUsIDB4Y2EsIDB4YzksIDB4MzMsIDB4ZjIsIDB4NmMsIDB4MDAsIDB4N2QsIDB4ZTQsCisJMHhlNSwgMHhiNSwgMHg1YywgMHg4NCwgMHg2YiwgMHg4NiwgMHhmMSwgMHg1MywgMHgzZSwgMHg3NywgMHhlZiwgMHg5YywKKwkweGNlLCAweGJhLCAweGU1LCAweGUzLCAweGJhLCAweDUxLCAweGJjLCAweDkyLCAweDBiLCAweDkwLCAweGQ3LCAweDMwLAorCTB4NmIsIDB4NTUsIDB4MWYsIDB4NDYsIDB4NzIsIDB4OGQsIDB4MTcsIDB4MzcsIDB4MzAsIDB4NTEsIDB4M2IsIDB4YjUsCisJMHg0NiwgMHhhZSwgMHhiZCwgMHg2MywgMHg3NSwgMHhkOSwgMHhiMSwgMHgyOCwgMHhlYiwgMHg5NCwgMHhkNiwgMHhlZCwKKwkweGMzLCAweDcwLCAweGVlLCAweDc1LCAweDc3LCAweGE5LCAweDlmLCAweDdlLCAweDY2LCAweDdjLCAweGMxLCAweGM2LAorCTB4N2UsIDB4NGYsIDB4OWIsIDB4ZmMsIDB4N2QsIDB4MWEsIDB4MzgsIDB4NjcsIDB4NjYsIDB4YWQsIDB4ZWEsIDB4MTQsCisJMHhiMSwgMHgyZSwgMHg2YiwgMHhkNCwgMHg1YiwgMHg2YiwgMHg5YSwgMHhiOCwgMHhhZSwgMHhkZSwgMHhmYiwgMHhhMiwKKwkweDkyLCAweDdlLCAweGM3LCAweDgzLCAweGU4LCAweDEzLCAweGEyLCAweDJmLCAweDYyLCAweGU2LCAweDU5LCAweGUwLAorCTB4NDcsIDB4YzQsIDB4OWYsIDB4MGQsIDB4NjMsIDB4OWEsIDB4ZjgsIDB4N2QsIDB4ODYsIDB4YjgsIDB4YTYsIDB4N2IsCisJMHgxZSwgMHhmNSwgMHg4OSwgMHgwNywgMHgzMCwgMHg2NCwgMHg5NSwgMHgxMSwgMHg5ZiwgMHg1NywgMHgxMywgMHhkNywKKwkweGNlLCAweDM1LCAweGIxLCAweDRlLCAweGFkLCAweGIxLCAweGFjLCAweGJmLCAweDZkLCAweDg2LCAweGU1LCAweDRhLAorCTB4ZTksIDB4NDYsIDB4YWQsIDB4N2IsIDB4ZmUsIDB4MmIsIDB4NTUsIDB4ZDAsIDB4MmYsIDB4MDYsIDB4OTUsIDB4M2UsCisJMHhmZiwgMHgxNiwgMHhlMiwgMHgwMywgMHhlNywgMHgyMSwgMHg3YSwgMHgwNSwgMHg1NiwgMHhjYywgMHg3OSwgMHhiMCwKKwkweDkyLCAweGYyLCAweDZjLCAweDFjLCAweGUzLCAweGRhLCAweGM0LCAweDI3LCAweDcxLCAweGNhLCAweGI0LCAweDZkLAorCTB4OGMsIDB4OTgsIDB4NGIsIDB4MGYsIDB4NjAsIDB4MzksIDB4NzUsIDB4ZGMsIDB4N2YsIDB4Y2EsIDB4YjIsIDB4Y2EsCisJMHhhOSwgMHhlMywgMHgwNiwgMHhkYSwgMHg2NywgMHhjZiwgMHgwOSwgMHgwYiwgMHgyZiwgMHgxYSwgMHgyZiwgMHg1MiwKKwkweGE3LCAweDhhLCAweGI4LCAweGIxLCAweDk5LCAweGVmLCAweDg0LCAweGY5LCAweGJjLCAweDBmLCAweDdiLCAweGM3LAorCTB4YTQsIDB4NWYsIDB4YWEsIDB4ZTMsIDB4MzMsIDB4YWYsIDB4ZTIsIDB4NTgsIDB4MmUsIDB4ODEsIDB4MjYsIDB4ZWEsCisJMHgyZiwgMHg0YSwgMHg5YSwgMHg4ZCwgMHg3YywgMHgyNywgMHg0YSwgMHg3YSwgMHhkMSwgMHhiOSwgMHhhZiwgMHg2MSwKKwkweGYzLCAweDI5LCAweDA1LCAweDNkLCAweDJlLCAweDNhLCAweGY4LCAweDFhLCAweGRhLCAweGNmLCAweDdjLCAweDUxLAorCTB4NGUsIDB4NjAsIDB4OTYsIDB4MWEsIDB4ZDcsIDB4OGUsIDB4Y2MsIDB4MTMsIDB4N2YsIDB4NTcsIDB4YTUsIDB4ODYsCisJMHhjMCwgMHhmYSwgMHg4ZCwgMHgzNywgMHhhNiwgMHgxNCwgMHg4ZSwgMHg4ZiwgMHhiMywgMHhkZiwgMHg1YiwgMHgwMywKKwkweGFiLCAweDgyLCAweDMyLCAweGJkLCAweDNlLCAweGY1LCAweDNiLCAweDc4LCAweGVhLCAweDI0LCAweGY1LCAweGYwLAorCTB4NjQsIDB4MTgsIDB4M2YsIDB4YzgsIDB4NzksIDB4YjAsIDB4ZWMsIDB4YjgsIDB4NjAsIDB4M2EsIDB4M2QsIDB4YjEsCisJMHg0ZiwgMHg0OSwgMHg3ZiwgMHgyNCwgMHg3ZCwgMHg0YiwgMHgzYywgMHhlYSwgMHg1NSwgMHgyZSwgMHhkNCwgMHgzZiwKKwkweGU1LCAweDgxLCAweDdlLCAweDJlLCAweDBhLCAweDZmLCAweGJkLCAweDBmLCAweDdhLCAweGZkLCAweDFmLCAweDMyLAorCTB4ZDcsIDB4YjgsIDB4NTAsIDB4YzYsIDB4NWUsIDB4NzYsIDB4ZDMsIDB4NzcsIDB4MTMsIDB4YmMsIDB4MTYsIDB4ZTYsCisJMHgzNSwgMHhmYywgMHg0ZSwgMHgzOSwgMHhkYywgMHg0YiwgMHhkYywgMHhhYywgMHhlMSwgMHg2NSwgMHgzYSwgMHhmMSwKKwkweDk4LCAweGM3LCAweGIyLCAweGRjLCAweGFjLCAweDBkLCAweDNiLCAweGJlLCAweDY3LCAweDU5LCAweGIxLCAweGQ1LAorCTB4ZjIsIDB4N2MsIDB4MDgsIDB4YjEsIDB4NzMsIDB4M2EsIDB4OWYsIDB4NzMsIDB4ZWEsIDB4ZTUsIDB4NzUsIDB4M2MsCisJMHhlNiwgMHhhNiwgMHgxZiwgMHg0OSwgMHhhYywgMHhiMiwgMHhkZSwgMHhkYiwgMHgzZCwgMHg5NCwgMHg4MywgMHhkYiwKKwkweDlmLCAweDJiLCAweDA4LCAweGI2LCAweDg5LCAweGRhLCAweDMyLCAweDljLCAweDFkLCAweDU3LCAweGNjLCAweGQ5LAorCTB4MjksIDB4M2UsIDB4YmIsIDB4MWUsIDB4ZWUsIDB4YTQsIDB4NzYsIDB4MjQsIDB4NGIsIDB4M2YsIDB4ZDgsIDB4MTUsCisJMHg2YSwgMHhjMSwgMHgzMywgMHhhNiwgMHgxNywgMHg5NSwgMHhmYSwgMHgxMiwgMHhkYywgMHhkZiwgMHgxZCwgMHhjMiwKKwkweDMzLCAweGVjLCAweDBiLCAweDY4LCAweGIzLCAweGM0LCAweDNjLCAweGQ4LCAweDQ4LCAweDA3LCAweDQ5LCAweGNmLAorCTB4ZjUsIDB4NjMsIDB4ZTgsIDB4ZGYsIDB4NzUsIDB4MzEsIDB4Y2YsIDB4YjksIDB4ZWQsIDB4M2MsIDB4NTcsIDB4NTYsCisJMHgwZiwgMHhjYywgMHhlNywgMHgzZCwgMHhiOCwgMHhhMCwgMHgzYiwgMHg5OCwgMHhmMCwgMHgzOSwgMHhiYiwgMHg2NiwKKwkweDZiLCAweGExLCAweGY5LCAweDZiLCAweDU4LCAweDUwLCAweDZiLCAweDQ5LCAweDJiLCAweDMyLCAweDEzLCAweDE0LAorCTB4ZGQsIDB4NjUsIDB4M2MsIDB4OGUsIDB4MmYsIDB4ZmQsIDB4OGQsIDB4NWIsIDB4N2EsIDB4OGUsIDB4ZWIsIDB4N2YsCisJMHg1NywgMHhjMCwgMHg5NSwgMHhkMiwgMHgyMiwgMHg2ZCwgMHg2ZSwgMHhmOCwgMHgzYywgMHhhOSwgMHhjZSwgMHhkNiwKKwkweDUxLCAweGZkLCAweDRiLCAweDM3LCAweGYwLCAweGRlLCAweDg0LCAweDkxLCAweGMyLCAweGY1LCAweDVlLCAweGJiLAorCTB4MzMsIDB4NjcsIDB4ZmIsIDB4NTAsIDB4YTcsIDB4ZTgsIDB4ZmUsIDB4MzEsIDB4NDMsIDB4ZjIsIDB4ZWMsIDB4YTAsCisJMHg2YSwgMHg2NywgMHhkZSwgMHhjYSwgMHg3YSwgMHg5MCwgMHhhZCwgMHhlMiwgMHgzMywgMHhkNCwgMHgzZiwgMHgwZSwKKwkweDhmLCAweDA5LCAweDlkLCAweDgzLCAweDE4LCAweGNkLCAweGM5LCAweDZjLCAweDYzLCAweDAwLCAweGViLCAweGNjLAorCTB4NTgsIDB4ZTIsIDB4MjIsIDB4N2IsIDB4ZTgsIDB4NDMsIDB4OTAsIDB4MzksIDB4NDQsIDB4ZTMsIDB4ZmMsIDB4Y2IsCisJMHg0YSwgMHgxYiwgMHhiYywgMHhjNSwgMHhhZCwgMHhmNSwgMHgyZiwgMHgyOCwgMHgyNywgMHg2ZiwgMHhhZCwgMHgyOCwKKwkweGU2LCAweGFkLCAweGU1LCAweGY5LCAweDI1LCAweGMxLCAweDJlLCAweGQ2LCAweDgzLCAweGFlLCAweGQ5LCAweDUyLAorCTB4N2QsIDB4ZTgsIDB4NTIsIDB4OWIsIDB4ZWMsIDB4ZGEsIDB4OWEsIDB4NTEsIDB4NWIsIDB4NjcsIDB4N2QsIDB4YWEsCisJMHg2MywgMHhjMiwgMHg4NywgMHg5NywgMHg4OSwgMHhjNSwgMHhhNiwgMHg3YSwgMHgxMCwgMHg1YSwgMHhiNiwgMHgwNiwKKwkweGZlLCAweGFkLCAweDEzLCAweGRkLCAweDI4LCAweGQ3LCAweGE1LCAweDg3LCAweDJjLCAweGM3LCAweDI2LCAweGJiLAorCTB4YWUsIDB4ZDUsIDB4MDUsIDB4YmIsIDB4NTgsIDB4N2YsIDB4YmEsIDB4MGEsIDB4M2QsIDB4Y2MsIDB4N2YsIDB4MDgsCisJMHhmOSwgMHg1MywgMHhjZSwgMHhjYywgMHg0MCwgMHg3MiwgMHhlMSwgMHhlZCwgMHg3YywgMHhmNywgMHg2MiwgMHg3MiwKKwkweDExLCAweGUwLCAweGQ0LCAweDNmLCAweDk1LCAweDYxLCAweDJmLCAweDUxLCAweGJkLCAweDVhLCAweGUxLCAweGQyLAorCTB4OWQsIDB4M2UsIDB4OTAsIDB4MTYsIDB4N2IsIDB4ZmUsIDB4N2MsIDB4ZWIsIDB4ODUsIDB4ZjEsIDB4NmUsIDB4ZDUsCisJMHgzMSwgMHgzZCwgMHhlMywgMHhkZiwgMHg2OCwgMHhjYSwgMHgyYywgMHg2MiwgMHhjYSwgMHhkZiwgMHg0ZSwgMHgxZSwKKwkweGRhLCAweDY3LCAweDlmLCAweGY0LCAweDZmLCAweDIwLCAweDRmLCAweDFiLCAweDY2LCAweDNmLCAweDRmLCAweDUzLAorCTB4ZWEsIDB4NGEsIDB4N2YsIDB4NmIsIDB4MWIsIDB4NjMsIDB4N2IsIDB4ODcsIDB4ZjEsIDB4OTEsIDB4MTUsIDB4ZmQsCisJMHhhNiwgMHhkMCwgMHg5OSwgMHgyYiwgMHhlYSwgMHgzMywgMHg0ZCwgMHhiZSwgMHhjMiwgMHhiZSwgMHg0ZCwgMHg4NSwKKwkweDkwLCAweDJmLCAweDVkLCAweDY4LCAweGY3LCAweGI3LCAweDk5LCAweGRkLCAweGZlLCAweDBkLCAweDY2LCAweDhmLAorCTB4YmYsIDB4ZGQsIDB4ZGMsIDB4NDksIDB4ZGEsIDB4NWQsIDB4ZmUsIDB4MGUsIDB4OTMsIDB4NzEsIDB4NWQsIDB4ZTgsCisJMHhhMSwgMHg1ZSwgMHhiYiwgMHgzMSwgMHg1YSwgMHhkOCwgMHg0OSwgMHhlYywgMHgyMSwgMHgzNCwgMHg3YiwgMHg4OSwKKwkweDgzLCAweGZjLCAweDk0LCAweDcxLCAweDg4LCAweDMyLCAweGNlLCAweDQ3LCAweGJjLCAweDQ4LCAweDZiLCAweDVlLAorCTB4ZWEsIDB4NmIsIDB4YzQsIDB4YjYsIDB4ZTMsIDB4MTEsIDB4N2IsIDB4MTYsIDB4NTUsIDB4OTEsIDB4N2EsIDB4YTAsCisJMHg3NSwgMHhjYiwgMHgwOSwgMHhlNiwgMHhmYiwgMHhkNCwgMHg5ZSwgMHhkNiwgMHg2NSwgMHhhNywgMHg1MCwgMHhlMywKKwkweDRkLCAweDQ5LCAweGVmLCAweGNjLCAweDdlLCAweDM4LCAweDFlLCAweDM3LCAweGRlLCAweDQzLCAweDNjLCAweGYyLAorCTB4MzIsIDB4OWYsIDB4MWQsIDB4YTYsIDB4ZWYsIDB4OGUsIDB4ZDgsIDB4ZjMsIDB4MDcsIDB4MWEsIDB4MjQsIDB4ZGYsCisJMHg4NCwgMHgyZCwgMHhhNiwgMHhjZiwgMHhiZiwgMHg4ZCwgMHhiZCwgMHg1OSwgMHgzMCwgMHhhNSwgMHhiNSwgMHhkYywKKwkweGVlLCAweDk2LCAweDc5LCAweGM4LCAweGZjLCAweGVmLCAweDA1LCAweGQwLCAweDg0LCAweGNlLCAweDgyLCAweDhmLAorCTB4NzIsIDB4N2QsIDB4MDksIDB4N2YsIDB4N2YsIDB4OTIsIDB4NzUsIDB4MGQsIDB4ZTIsIDB4ODcsIDB4OTYsIDB4NzUsCisJMHgyZiwgMHhmYiwgMHg5YSwgMHhhMywgMHhmOSwgMHgzYSwgMHg1YywgMHhiNiwgMHg2ZCwgMHhlYywgMHhjMSwgMHhlMSwKKwkweDdjLCAweDE0LCAweGVmLCAweDUwLCAweDNlLCAweGNmLCAweDVjLCAweDJkLCAweGRlLCAweDFlLCAweDc3LCAweDYzLAorCTB4YjcsIDB4NzEsIDB4NWIsIDB4YjEsIDB4NWUsIDB4YjgsIDB4NzAsIDB4NGYsIDB4ZTIsIDB4MDAsIDB4YjEsIDB4ODMsCisJMHgwYiwgMHhkNSwgMHhjNCwgMHg2ZiwgMHgwZiwgMHhkYSwgMHhkNywgMHhkYywgMHhlYywgMHhmZiwgMHhiZSwgMHg4ZSwKKwkweDQxLCAweGE3LCAweDllLCAweDkwLCAweGM3LCAweDlkLCAweGU0LCAweGIxLCAweGQ5LCAweGJmLCAweDYxLCAweDQyLAorCTB4ZjMsIDB4ZGYsIDB4MzEsIDB4MDEsIDB4OWYsIDB4MzcsIDB4YjUsIDB4YWIsIDB4ZjUsIDB4Y2MsIDB4NDksIDB4MGIsCisJMHg3ZCwgMHhjNiwgMHhhZCwgMHhiOCwgMHg3MiwgMHg3MiwgMHhiOCwgMHhkZiwgMHg0MywgMHhmZiwgMHhmOSwgMHg2NSwKKwkweDMyLCAweDAzLCAweDczLCAweDEyLCAweDE3LCAweDg4LCAweDNjLCAweDVlLCAweDBkLCAweDMwLCAweGI3LCAweDM3LAorCTB4MjQsIDB4ZTMsIDB4MjEsIDB4ZDYsIDB4NjIsIDB4NjMsIDB4OTYsIDB4YjEsIDB4ZDksIDB4MDEsIDB4YWQsIDB4OWYsCisJMHgzNSwgMHgzOSwgMHhlZCwgMHg0ZSwgMHhjNSwgMHg3YiwgMHg0NywgMHgwOCwgMHgxZSwgMHhhYiwgMHhjOCwgMHg4ZiwKKwkweDlmLCAweGI5LCAweDNiLCAweDMwLCAweDE3LCAweGY1LCAweGVmLCAweDYwLCAweGJkLCAweDg5LCAweGIwLCAweGJmLAorCTB4ZjMsIDB4YzcsIDB4NzEsIDB4NWIsIDB4MmQsIDB4ZTIsIDB4ODksIDB4MDUsIDB4Y2EsIDB4ZWQsIDB4OWQsIDB4NmIsCisJMHhmMiwgMHhkZiwgMHhjZSwgMHhmYSwgMHg3MSwgMHgzOSwgMHg2ZSwgMHgwZCwgMHhiZCwgMHg2OCwgMHgwNCwgMHgxMCwKKwkweDljLCAweDMzLCAweGE4LCAweGVmLCAweDBjLCAweDg2LCAweDY3LCAweGQ5LCAweDcyLCAweGM1LCAweGQ5LCAweGYzLAorCTB4Y2YsIDB4YjUsIDB4ZjgsIDB4YjcsIDB4MzEsIDB4MzYsIDB4YWIsIDB4NjgsIDB4YTIsIDB4YzYsIDB4YjksIDB4YjQsCisJMHg1ZiwgMHg3YSwgMHhiZSwgMHhhNiwgMHhiOSwgMHhiNSwgMHhlNCwgMHg0ZiwgMHg3YywgMHg3NCwgMHg1ZiwgMHhlYiwKKwkweDNhLCAweGZhLCAweDQzLCAweDc0LCAweDBlLCAweDliLCAweDk4LCAweGU2LCAweDVlLCAweDIyLCAweGNkLCAweDRjLAorCTB4ODQsIDB4MTgsIDB4NzYsIDB4ZWYsIDB4OWEsIDB4MDAsIDB4ZjMsIDB4OTQsIDB4ZTgsIDB4OTIsIDB4N2EsIDB4MmMsCisJMHg5NCwgMHg2NCwgMHg5MiwgMHhiYSwgMHhiYywgMHhhNywgMHg3NSwgMHhlZSwgMHg5NCwgMHhkNCwgMHhlNSwgMHg0YywKKwkweDZiLCAweGVlLCAweDk0LCAweDhlLCAweDc3LCAweDU4LCAweDViLCAweDU2LCAweDI0LCAweDM1LCAweGUzLCAweDljLAorCTB4OGEsIDB4NDUsIDB4NWUsIDB4YTUsIDB4MmMsIDB4MWUsIDB4ZmMsIDB4Y2EsIDB4ZGEsIDB4YTUsIDB4YzcsIDB4ZTcsCisJMHg2ZiwgMHg2MSwgMHgzYywgMHg1NSwgMHgzMywgMHgzNywgMHg0NiwgMHg5OCwgMHhmMywgMHhhYiwgMHhlNywgMHhhOCwKKwkweDk4LCAweDM5LCAweGI3LCAweDE3LCAweDE1LCAweDExLCAweGY4LCAweGUyLCAweDNhLCAweGRlLCAweDNkLCAweDk5LAorCTB4YTAsIDB4MWUsIDB4YWUsIDB4ZDEsIDB4ZGMsIDB4NDcsIDB4YTgsIDB4ZDUsIDB4YzcsIDB4NTIsIDB4ZjgsIDB4YzgsCisJMHg1MywgMHhmNCwgMHhjNSwgMHg1MSwgMHhhZSwgMHg1YiwgMHgzNiwgMHgyNywgMHgzYywgMHhjYiwgMHhmMywgMHg2MSwKKwkweDNlLCAweDdmLCAweDdkLCAweGVkLCAweDZhLCAweGFlLCAweGZkLCAweGQxLCAweDI5LCAweGYxLCAweGQ3LCAweDRjLAorCTB4ZWIsIDB4ODUsIDB4OTMsIDB4Y2UsIDB4ZGEsIDB4ZjEsIDB4NjQsIDB4MDIsIDB4MWYsIDB4OWUsIDB4ZDQsIDB4MDYsCisJMHhkZSwgMHg1NSwgMHhiMSwgMHhkZSwgMHgwYiwgMHg0YSwgMHhkNiwgMHg0NywgMHg1ZCwgMHgxNSwgMHhhZSwgMHg1OCwKKwkweGMzLCAweGYxLCAweGY4LCAweGUwLCAweDJlLCAweGQyLCAweDZjLCAweDU5LCAweDRiLCAweGZkLCAweGRiLCAweDdjLAorCTB4ZDAsIDB4ZTcsIDB4OTksIDB4NjcsIDB4YmQsIDB4ZTQsIDB4YzcsIDB4ZTEsIDB4YTUsIDB4OGUsIDB4YjQsIDB4NGYsCisJMHgxNiwgMHg3YiwgMHgzNSwgMHhmNiwgMHhhOSwgMHhkNywgMHhmOSwgMHgwOSwgMHg1MywgMHgwZiwgMHhiZSwgMHgxZCwKKwkweGNkLCAweDAxLCAweGQ0LCAweGRhLCAweGNmLCAweDg1LCAweGY4LCAweDljLCAweGU4LCAweGUxLCAweGQ3LCAweGNhLAorCTB4YTUsIDB4YmYsIDB4YzcsIDB4M2MsIDB4MjYsIDB4YjksIDB4MjQsIDB4Y2MsIDB4MWMsIDB4YjYsIDB4NTMsIDB4N2EsCisJMHhkYSwgMHg2YywgMHg5NiwgMHhmZSwgMHhlZSwgMHhhNSwgMHhiZiwgMHg2ZiwgMHgxNCwgMHg5ZiwgMHgzNiwgMHhlOSwKKwkweGQzLCAweDI2LCAweDdkLCAweGRhLCAweGQ0LCAweDIyLCAweDAzLCAweDg4LCAweDg1LCAweGZhLCAweDY4LCAweGI3LAorCTB4NzQsIDB4NDQsIDB4N2MsIDB4YmQsIDB4MDcsIDB4YmIsIDB4ZjksIDB4ZDksIDB4YzMsIDB4ZmIsIDB4ODcsIDB4ZDksCisJMHhlNywgMHg2MiwgMHg5MSwgMHhhYywgMHg3OSwgMHgxMCwgMHhlZCwgMHhlNiwgMHgyMywgMHhlOCwgMHg5ZiwgMHhjMCwKKwkweDZmLCAweGZjLCAweGNkLCAweGU1LCAweDI4LCAweDVmLCAweDJlLCAweDNkLCAweGJjLCAweDE2LCAweDNhLCAweDhhLAorCTB4NDcsIDB4ZDgsIDB4NDcsIDB4ZmQsIDB4NWEsIDB4NTUsIDB4ZWEsIDB4OWUsIDB4ZWUsIDB4NjMsIDB4NGEsIDB4MGIsCisJMHhiNSwgMHhiMywgMHgxZiwgMHhkZSwgMHg1NSwgMHhkOCwgMHg0OSwgMHhmYiwgMHhjNiwgMHhmYSwgMHg1ZiwgMHg1NiwKKwkweGVjLCAweGE1LCAweDZhLCAweGI5LCAweDM2LCAweDYzLCAweGU5LCAweDBlLCAweGFlLCAweDYzLCAweDBhLCAweDFmLAorCTB4NzYsIDB4YmUsIDB4ZmQsIDB4N2QsIDB4ODgsIDB4NmUsIDB4N2YsIDB4ZDIsIDB4ZDAsIDB4YzcsIDB4ZjUsIDB4MWQsCisJMHgzZSwgMHg4NiwgMHhkOSwgMHg1MywgMHhmNiwgMHgzMSwgMHhjNiwgMHg3NiwgMHhkYiwgMHhmMSwgMHhkNSwgMHg0MywKKwkweDFhLCAweGQ3LCAweGYzLCAweGQ4LCAweDg2LCAweDljLCAweGQ0LCAweDUyLCAweDBiLCAweDhmLCAweDFhLCAweDE2LAorCTB4OWUsIDB4ZTYsIDB4ZTcsIDB4MjIsIDB4NzMsIDB4ZDksIDB4YzgsIDB4MGQsIDB4YjksIDB4Y2MsIDB4YzUsIDB4ZTcsCisJMHg3NiwgMHhmMCwgMHhiOSwgMHgxNiwgMHhhNiwgMHhjZSwgMHhkOSwgMHg2OSwgMHg5OSwgMHgwZCwgMHgxZSwgMHg5NCwKKwkweGQ5LCAweDIwLCAweGYyLCAweGE2LCAweGU4LCAweDdlLCAweDAwLCAweDE3LCAweDcyLCAweGIxLCAweDQxLCAweGI3LAorCTB4ZGIsIDB4MWEsIDB4NjIsIDB4NWMsIDB4NWQsIDB4ZmMsIDB4ODgsIDB4YmUsIDB4ZmIsIDB4ZGEsIDB4MWEsIDB4YWQsCisJMHg5YiwgMHgzYSwgMHg0YywgMHg4YywgMHgyOSwgMHgyZCwgMHhmMiwgMHgzMywgMHhjYywgMHg2ZiwgMHhmMiwgMHhhMSwKKwkweDMxLCAweGJhLCAweGQyLCAweDFkLCAweDBmLCAweDlkLCAweDg1LCAweDM2LCAweGRmLCAweDQ3LCAweDQ5LCAweDlmLAorCTB4MmMsIDB4MzgsIDB4YjksIDB4NmUsIDB4NWQsIDB4MzEsIDB4ZDcsIDB4YjUsIDB4ZTQsIDB4MmIsIDB4ZDQsIDB4MWQsCisJMHgxMywgMHhhYywgMHhjZiwgMHhkMywgMHg1NiwgMHgzNiwgMHhjOCwgMHg3YSwgMHg1NSwgMHg5OCwgMHgxNiwgMHhkYSwKKwkweDQzLCAweDY4LCAweDRjLCAweDBhLCAweDJkLCAweGJkLCAweDczLCAweDRjLCAweGUxLCAweDFiLCAweDk1LCAweDg4LAorCTB4YjMsIDB4NTYsIDB4YzEsIDB4MjgsIDB4ZDcsIDB4YjMsIDB4MTYsIDB4NmIsIDB4NTIsIDB4YzgsIDB4OWIsIDB4OTIsCisJMHhkYSwgMHhkOSwgMHhjNSwgMHhiZSwgMHhhNSwgMHg4NywgMHg3OSwgMHg1MSwgMHgzMCwgMHhiNSwgMHhjYywgMHg0YiwKKwkweDlkLCAweDdjLCAweGI0LCAweGIxLCAweDIwLCAweDc2LCAweDExLCAweDliLCAweDg4LCAweDZkLCAweDBlLCAweGUyLAorCTB4MWUsIDB4NTMsIDB4N2EsIDB4N2YsIDB4MGIsIDB4ZTMsIDB4NDYsIDB4M2MsIDB4ZmEsIDB4MTQsIDB4YzQsIDB4NGUsCisJMHgwNywgMHhhOSwgMHgwYiwgMHgyZiwgMHg3NiwgMHgzMywgMHgwZiwgMHhlZSwgMHg2YSwgMHhhNiwgMHhhZSwgMHg4MiwKKwkweDVlLCAweGVjLCAweGIyLCAweDY3LCAweDA5LCAweDI1LCAweGZkLCAweDc5LCAweDY5LCAweDQzLCAweGM1LCAweDFhLAorCTB4MzcsIDB4ZWIsIDB4NzUsIDB4ZjQsIDB4ZTgsIDB4Y2MsIDB4MjYsIDB4ZGQsIDB4MjksIDB4YTEsIDB4NTcsIDB4OWEsCisJMHg0YiwgMHgzYSwgMHhiYSwgMHhkYiwgMHg5NCwgMHgxMywgMHhiYSwgMHgxNiwgMHhjZSwgMHgxYSwgMHgwZSwgMHg2ZSwKKwkweDJkLCAweGU5LCAweDJjLCAweDQyLCAweGI5LCAweDZhLCAweGQ2LCAweDAyLCAweDJiLCAweDZmLCAweGMwLCAweGFlLAorCTB4MTUsIDB4YmMsIDB4YjYsIDB4ZTUsIDB4M2EsIDB4NzYsIDB4Y2QsIDB4MDgsIDB4M2UsIDB4MjYsIDB4NzYsIDB4ZWQsCisJMHhkYywgMHg0YSwgMHhlYywgMHg1YSwgMHhhZiwgMHg0YSwgMHhiOCwgMHg1NSwgMHhlNiwgMHgxMiwgMHgyNSwgMHhlYywKKwkweDVhLCAweDVkLCAweGNjLCAweGQxLCAweDA3LCAweGIxLCAweDhiLCAweGI4LCAweGE2LCAweGI2LCAweDdlLCAweDA4LAorCTB4YmUsIDB4NTUsIDB4YWUsIDB4Y2YsIDB4NWMsIDB4MTgsIDB4NjIsIDB4YmYsIDB4NTIsIDB4MDYsIDB4MmMsIDB4YjYsCisJMHg3MCwgMHhjYiwgMHhlYSwgMHhhYywgMHg1NSwgMHhhZSwgMHhkNywgMHg0NywgMHhjYiwgMHg1ZCwgMHgzMiwgMHg3NywKKwkweDhlLCAweDY3LCAweDQ3LCAweDk4LCAweDRiLCAweDVjLCAweGFiLCAweGI0LCAweDZjLCAweDFhLCAweGJlLCAweDUwLAorCTB4OGQsIDB4YmUsIDB4YjMsIDB4ZDgsIDB4MmYsIDB4NDQsIDB4N2MsIDB4OWIsIDB4ODksIDB4N2IsIDB4ZTIsIDB4YzksCisJMHg0ZiwgMHhhZCwgMHhhOSwgMHhiMCwgMHhkMCwgMHg5OCwgMHg5ZiwgMHhmNywgMHgyMSwgMHhmZCwgMHg5MCwgMHg4ZiwKKwkweDc1LCAweDY4LCAweDQxLCAweDFkLCAweGMxLCAweDZiLCAweGYxLCAweDg4LCAweDZmLCAweDViLCAweDIxLCAweGViLAorCTB4ZGYsIDB4ZDIsIDB4NzAsIDB4MGIsIDB4YmEsIDB4NGUsIDB4NDksIDB4Y2QsIDB4ODksIDB4NjIsIDB4ZWIsIDB4YTksCisJMHg3NiwgMHhkNiwgMHgxOSwgMHgxZCwgMHgxZCwgMHg2MywgMHg5ZCwgMHhlYywgMHhlMywgMHhiYSwgMHg1NSwgMHhmNywKKwkweGI0LCAweGU4LCAweDQ5LCAweGY0LCAweGFjLCAweDg1LCAweGEyLCAweGFlLCAweDFiLCAweGU3LCAweGEyLCAweGE1LAorCTB4OWUsIDB4ZjgsIDB4M2QsIDB4ZGIsIDB4ODcsIDB4NDYsIDB4OGQsIDB4MTAsIDB4ZjUsIDB4ZjMsIDB4MmIsIDB4MmYsCisJMHg4MiwgMHgxNiwgMHhjZSwgMHgxOCwgMHhlMiwgMHg3YiwgMHhmYywgMHhkYiwgMHg0YywgMHg2MywgMHg2MywgMHhmMywKKwkweGI4LCAweGU1LCAweGQxLCAweDY1LCAweGJlLCAweDFkLCAweGIxLCAweGVkLCAweGI2LCAweDgxLCAweGI1LCAweGFjLAorCTB4N2QsIDB4YmEsIDB4ODcsIDB4YjYsIDB4MmEsIDB4Y2QsIDB4YjIsIDB4NmYsIDB4YjQsIDB4ZDksIDB4N2EsIDB4ZmYsCisJMHg0NiwgMHhlNiwgMHgzNSwgMHhmNiwgMHhlOSwgMHgzZSwgMHgxZiwgMHg3MywgMHhhNSwgMHhlZiwgMHg5NCwgMHg4NSwKKwkweDY5LCAweGUzLCAweDRkLCAweGViLCAweDUxLCAweGRkLCAweDQzLCAweGJiLCAweDdjLCAweDk1LCAweDc5LCAweDU3LAorCTB4NzAsIDB4NDksIDB4Y2EsIDB4N2YsIDB4ZmIsIDB4YTQsIDB4YzcsIDB4NTUsIDB4OTUsIDB4NDIsIDB4NzMsIDB4MTksCisJMHg3ZCwgMHhlZSwgMHhkNSwgMHhhNCwgMHgzMywgMHg3MywgMHgzYywgMHg5NiwgMHhiZiwgMHhjZCwgMHhiZiwgMHg2NSwKKwkweDgyLCAweGJkLCAweDA0LCAweDdiLCAweDVkLCAweGE3LCAweGJmLCAweGZiLCAweGFhLCAweGZmLCAweGVlLCAweDA5LAorCTB4YjcsIDB4YWEsIDB4NGQsIDB4YzEsIDB4ZGQsIDB4YjIsIDB4ZDYsIDB4YzIsIDB4YzcsIDB4YWIsIDB4ZTMsIDB4ODMsCisJMHgxMSwgMHgxNywgMHg3MywgMHgyNCwgMHg2OSwgMHg5OSwgMHhmOSwgMHg2NiwgMHg3ZiwgMHg4NiwgMHgzOSwgMHg3OSwKKwkweGRiLCAweDA0LCAweGQyLCAweDMyLCAweDlmLCAweDBkLCAweGFlLCAweDFlLCAweGVlLCAweDBkLCAweDQyLCAweDY2LAorCTB4NjksIDB4ZjgsIDB4MDYsIDB4YTMsIDB4MzIsIDB4NGMsIDB4OWYsIDB4OGIsIDB4YjQsIDB4YTksIDB4ZjgsIDB4NDIsCisJMHgzZiwgMHhlMiwgMHgxNywgMHgzZiwgMHg3NiwgMHhiZiwgMHg2OSwgMHgzZCwgMHg5ZSwgMHg1ZiwgMHhjYiwgMHhlNywKKwkweDNiLCAweDk5LCAweDJmLCAweGQzLCAweGNjLCAweDlmLCAweGMzLCAweDgzLCAweDVlLCAweGM4LCAweDNiLCAweDVhLAorCTB4ZTYsIDB4MGQsIDB4MTUsIDB4YTMsIDB4YWYsIDB4ZTMsIDB4OWIsIDB4N2MsIDB4M2UsIDB4ZDQsIDB4YzEsIDB4NWMsCisJMHgzOSwgMHg2ZCwgMHhjNCwgMHhkMywgMHgxYiwgMHg5MCwgMHhlZCwgMHhhYywgMHg4NiwgMHg2NiwgMHgzNCwgMHgyOCwKKwkweDk5LCAweDdkLCAweDg5LCAweDFkLCAweDEyLCAweGY4LCAweDM5LCAweGQ3LCAweGY0LCAweGU4LCAweGEyLCAweGM3LAorCTB4ZjUsIDB4ZTgsIDB4OWIsIDB4NjYsIDB4ZmQsIDB4YmYsIDB4ZTYsIDB4NmYsIDB4YTIsIDB4MDMsIDB4ZDEsIDB4Y2IsCisJMHgzNywgMHhjYiwgMHg1MCwgMHhiMSwgMHg4OCwgMHhiMiwgMHhmZCwgMHhkYywgMHhjZSwgMHgyYiwgMHg3ZSwgMHg1ZCwKKwkweGM3LCAweDdmLCAweDI2LCAweDNlLCAweGZhLCAweDRmLCAweDA1LCAweDk5LCAweDcxLCAweDk2LCAweDMwLCAweDlmLAorCTB4ZGQsIDB4NDcsIDB4YjUsIDB4MmUsIDB4OWIsIDB4NGEsIDB4MTQsIDB4NjcsIDB4OWUsIDB4M2UsIDB4N2YsIDB4ZTcsCisJMHhhNCwgMHg4NSwgMHg5MywgMHg0NiwgMHgxMCwgMHhkMiwgMHhlMywgMHg5NywgMHgyNywgMHhlNywgMHg4OSwgMHgwMCwKKwkweDlhLCAweGQwLCAweGMxLCAweGViLCAweGVkLCAweDkzLCAweDk1LCAweGFhLCAweDdkLCAweGMyLCAweGMyLCAweDVmLAorCTB4MTgsIDB4NWEsIDB4YjYsIDB4Y2QsIDB4Y2QsIDB4OTgsIDB4MzYsIDB4YjQsIDB4YjMsIDB4YzAsIDB4M2IsIDB4YzQsCisJMHg0YSwgMHhlMiwgMHg2MywgMHgxZSwgMHgwNCwgMHg3NCwgMHg4NywgMHg1NiwgMHhkMywgMHhkNCwgMHg2ZCwgMHhjNCwKKwkweDBmLCAweDEyLCAweDYzLCAweGVlLCAweDE1LCAweDE1LCAweDQ4LCAweGFhLCAweDI5LCAweDhmLCAweGU4LCAweGFkLAorCTB4MTMsIDB4ZTksIDB4NDIsIDB4YTUsIDB4ZGEsIDB4NGUsIDB4NWQsIDB4ZGUsIDB4YjEsIDB4YWEsIDB4MGMsIDB4OTcsCisJMHg2YywgMHg1ZCwgMHhkZSwgMHg0NiwgMHg1ZCwgMHhlMiwgMHhmNSwgMHhhNSwgMHg3MCwgMHg1ZiwgMHhhOCwgMHg0NSwKKwkweGE3LCAweDgyLCAweGRkLCAweDlmLCAweDU1LCAweGIyLCAweDRlLCAweGE3LCAweDg5LCAweDZmLCAweDg5LCAweDA3LAorCTB4NDMsIDB4M2QsIDB4ZjgsIDB4MmUsIDB4ZjMsIDB4Y2QsIDB4YTMsIDB4ZjQsIDB4ZDUsIDB4NWYsIDB4ZTksIDB4NGQsCisJMHhhOCwgMHhmOCwgMHg1ZSwgMHgzMywgMHhlZCwgMHhiOCwgMHhkNiwgMHhiZiwgMHg3OSwgMHgyMiwgMHg4MywgMHhjNywKKwkweDY2LCAweDJkLCAweDNjLCAweGM1LCAweDM4LCAweDY5LCAweDQ4LCAweDY2LCAweDQzLCAweGU1LCAweGVjLCAweGQ3LAorCTB4NTgsIDB4ZDMsIDB4MTYsIDB4NGUsIDB4ZDgsIDB4N2UsIDB4YmUsIDB4YWIsIDB4NzUsIDB4ZmQsIDB4NGMsIDB4MDQsCisJMHhlZSwgMHhlZiwgMHhjYSwgMHhlZiwgMHgzYiwgMHg1YiwgMHhhMywgMHgzMywgMHhmMiwgMHg5ZCwgMHhlMSwgMHhiNywKKwkweDg1LCAweDAxLCAweDQzLCAweDRiLCAweDdmLCAweGVjLCAweGFlLCAweDQwLCAweDY1LCAweGRjLCAweGIyLCAweDA2LAorCTB4OTIsIDB4NzIsIDB4YmQsIDB4YWYsIDB4MzUsIDB4NjEsIDB4ZGYsIDB4ZGYsIDB4YzMsIDB4ZWYsIDB4ZDIsIDB4NGMsCisJMHhmYSwgMHg2ZiwgMHgwNCwgMHgwYiwgMHg0NiwgMHhkMywgMHg5NCwgMHg3OSwgMHgyYiwgMHhlYiwgMHg3YiwgMHg4NiwKKwkweGY1LCAweGJkLCAweDM2LCAweGE1LCAweGE1LCAweDc3LCAweGI4LCAweDY1LCAweGZlLCAweDMyLCAweDdmLCAweGEwLAorCTB4OWEsIDB4ZDcsIDB4NmYsIDB4MmYsIDB4ZDYsIDB4ZjcsIDB4YWEsIDB4NTMsIDB4MzIsIDB4ZDMsIDB4MjMsIDB4MDYsCisJMHg4NCwgMHhiMywgMHgxNywgMHhkMiwgMHhjNSwgMHhmYSwgMHg1ZSwgMHgzMSwgMHhlNiwgMHhjMSwgMHgxNiwgMHhkNiwKKwkweDc2LCAweDJmLCAweGIxLCAweGY4LCAweGM2LCAweDdjLCAweDJkLCAweGZjLCAweDI3LCAweGRjLCAweDg4LCAweDI1LAorCTB4N2YsIDB4ODIsIDB4MDMsIDB4ZjQsIDB4YjEsIDB4MDMsIDB4MDksIDB4YjcsIDB4OGEsIDB4MmUsIDB4NzEsIDB4NTEsCisJMHg0ZiwgMHhmZiwgMHg4OCwgMHg3ZCwgMHgyMSwgMHgzNywgMHhhYSwgMHhmNCwgMHg5ZiwgMHhlMSwgMHg4MSwgMHgyZiwKKwkweGE4LCAweGU5LCAweDk5LCAweDA5LCAweDg5LCAweGVkLCAweDVkLCAweGFkLCAweDViLCAweDRlLCAweDM5LCAweDM1LAorCTB4M2QsIDB4NzAsIDB4NmEsIDB4NzgsIDB4NDEsIDB4NmEsIDB4N2EsIDB4ZWQsIDB4ZWEsIDB4MGMsIDB4NGUsIDB4NGYsCisJMHhlMiwgMHgzYiwgMHg0YiwgMHgwOSwgMHgxZSwgMHg2YiwgMHhiOSwgMHg2NiwgMHg3ZCwgMHgzMiwgMHhjZSwgMHhkZSwKKwkweDVhLCAweGViLCAweGVmLCAweDUwLCAweGYxLCAweDIzLCAweDU1LCAweGNjLCAweDAxLCAweGE3LCAweDU5LCAweGQzLAorCTB4N2QsIDB4YTksIDB4NzgsIDB4MjgsIDB4ZTEsIDB4NDIsIDB4OTcsIDB4OTcsIDB4ZjYsIDB4NzgsIDB4OWYsIDB4N2QsCisJMHhmNiwgMHg1YiwgMHhmOSwgMHgyOCwgMHg2OSwgMHg5NiwgMHhjMSwgMHhjMywgMHg5YSwgMHhmZSwgMHhiZSwgMHg4ZSwKKwkweGNmLCAweGRjLCAweGY0LCAweGJkLCAweDc3LCAweGRjLCAweDNlLCAweDVjLCAweGNkLCAweDNiLCAweDM1LCAweGJkLAorCTB4YmEsIDB4YzEsIDB4MWEsIDB4YmEsIDB4OWMsIDB4MGMsIDB4ZTAsIDB4NGEsIDB4ZGUsIDB4YTAsIDB4MGYsIDB4NjYsCisJMHg3MCwgMHg5OCwgMHgzNSwgMHhmZCwgMHhiMiwgMHgxZSwgMHhjMiwgMHg4NywgMHhmOSwgMHgxNiwgMHhmYSwgMHg2NSwKKwkweDE4LCAweGJmLCAweDI0LCAweGZlLCAweDVkLCAweGM1LCAweDlhLCAweDdlLCAweDI3LCAweDdkLCAweDJhLCAweGM5LAorCTB4OWEsIDB4ZGUsIDB4NjYsIDB4ZTMsIDB4OGQsIDB4N2QsIDB4YWQsIDB4NjcsIDB4YzYsIDB4ZWQsIDB4OWEsIDB4ZGUsCisJMHhlMCwgMHg2MiwgMHgzZCwgMHhmNCwgMHgyMiwgMHhiZSwgMHhjMCwgMHgzYywgMHg2MSwgMHhmZCwgMHg2YSwgMHg2ZCwKKwkweDgwLCAweGNmLCAweDUyLCAweDZmLCAweDg1LCAweGQ1LCAweDk4LCAweGIyLCAweDZiLCAweGQwLCAweDdhLCAweGZmLAorCTB4NzYsIDB4YWUsIDB4YmQsIDB4ZDgsIDB4OGUsIDB4MzMsIDB4MGIsIDB4NWIsIDB4NTcsIDB4YmQsIDB4ODYsIDB4M2YsCisJMHhhYSwgMHg3MSwgMHhkMSwgMHgwZiwgMHg1MywgMHhmZSwgMHgzYiwgMHgxOCwgMHg2YiwgMHhjMSwgMHg1NCwgMHg2OSwKKwkweGU2LCAweDkxLCAweGUwLCAweDNhLCAweGI3LCAweGY5LCAweGVmLCAweGE0LCAweDZmLCAweGRjLCAweGIyLCAweDhhLAorCTB4OTksIDB4MjQsIDB4ZTQsIDB4YzQsIDB4NTksIDB4M2IsIDB4ZTMsIDB4MmMsIDB4YzIsIDB4MzgsIDB4NWIsIDB4Y2EsCisJMHgzOCwgMHg3YiwgMHhkYywgMHg4OCwgMHgyNywgMHhkNiwgMHgxMywgMHg3NywgMHhiZCwgMHg5YywgMHg5NywgMHg1OCwKKwkweDZiLCAweDI2LCAweDVkLCAweDhkLCAweDcyLCAweDBkLCAweGY3LCAweDRhLCAweGNjLCAweDZjLCAweDVkLCAweDM1LAorCTB4N2MsIDB4YjYsIDB4MTIsIDB4YTIsIDB4MmIsIDB4N2MsIDB4YjYsIDB4OTgsIDB4MTgsIDB4ODMsIDB4OTksIDB4ZTksCisJMHhlMiwgMHg4MiwgMHgzYiwgMHgzZSwgMHg3OCwgMHhhYiwgMHgzYiwgMHgzZSwgMHhmMCwgMHg5ZSwgMHg3YSwgMHhkMywKKwkweDdhLCAweDlkLCAweDcxLCAweGI2LCAweDhkLCAweDcxLCAweGI2LCAweDlkLCAweDcxLCAweGQ2LCAweDY2LCAweDVhLAorCTB4NzgsIDB4MmUsIDB4YTksIDB4NjUsIDB4OWEsIDB4NWMsIDB4MzEsIDB4YTMsIDB4Y2QsIDB4ODUsIDB4YTUsIDB4OTUsCisJMHgyYywgMHgwZCwgMHg3ZSwgMHhjNCwgMHgzYiwgMHhmZiwgMHg4OCwgMHhmYywgMHg1ZiwgMHgzNCwgMHhlMiwgMHhkZCwKKwkweDA5LCAweDI1LCAweGIxLCAweDE1LCAweGM1LCAweDA3LCAweDk0LCAweGJiLCAweGJjLCAweDE4LCAweDViLCAweDdiLAorCTB4YTcsIDB4Y2YsIDB4MTcsIDB4N2QsIDB4YTMsIDB4MjQsIDB4YmIsIDB4MWIsIDB4Y2YsIDB4MWEsIDB4Y2MsIDB4YTUsCisJMHg4YiwgMHhiNCwgMHg2OCwgMHhkNiwgMHhkNSwgMHg4MywgMHgyMywgMHhkNCwgMHhhMywgMHgzZiwgMHhkZSwgMHg4MywKKwkweGEzLCAweGFjLCAweDg3LCAweGY3LCAweGIyLCAweDBlLCAweGRmLCAweDY3LCAweGM2LCAweDVhLCAweDM2LCAweGIzLAorCTB4ZmYsIDB4YjksIDB4MTQsIDB4ZDEsIDB4YTIsIDB4NTEsIDB4ZDUsIDB4ODMsIDB4M2UsIDB4ZmEsIDB4NzAsIDB4MWYsCisJMHhlYiwgMHg0NiwgMHg5YiwgMHhmOSwgMHg2YiwgMHhkNSwgMHg0MSwgMHhhYywgMHhiMCwgMHhhNywgMHgyMCwgMHhlZiwKKwkweDY5LCAweDg5LCAweDVlLCAweDU3LCAweDNmLCAweDdhLCAweDY3LCAweDI1LCAweGI3LCAweDIxLCAweDc0LCAweDUzLAorCTB4YWEsIDB4MDcsIDB4YzcsIDB4Y2QsIDB4MzIsIDB4ZjQsIDB4MzQsIDB4NzcsIDB4YTksIDB4ZGIsIDB4MGIsIDB4MzIsCisJMHg3ZiwgMHg2MywgMHgzYywgMHg5YSwgMHg4YywgMHg1NywgMHg5YiwgMHg1ZiwgMHg4NSwgMHg3YywgMHhiYywgMHgwYiwKKwkweDM5LCAweDg5LCAweDRmLCAweDczLCAweGJiLCAweGJhLCAweDczLCAweDVhLCAweDYyLCAweGJjLCAweDQ3LCAweGY1LAorCTB4NDgsIDB4MGMsIDB4OWIsIDB4ODMsIDB4ZWEsIDB4MmUsIDB4ODksIDB4NjksIDB4N2IsIDB4NjYsIDB4MmQsIDB4NzEsCisJMHgyZiwgMHg3YiwgMHgxYSwgMHhiNywgMHgxMSwgMHhjNywgMHg4MSwgMHgzMSwgMHhlNSwgMHhmZSwgMHg1ZSwgMHg4NCwKKwkweDcxLCAweGQ3LCAweDU2LCAweGU2LCAweGEyLCAweDlmLCAweGM2LCAweDY4LCAweDNiLCAweDE3LCAweGRhLCAweDhkLAorCTB4ZGYsIDB4YjEsIDB4YjIsIDB4YTEsIDB4NWUsIDB4YzYsIDB4NTQsIDB4MGYsIDB4MGUsIDB4OWIsIDB4NWYsIDB4YjYsCisJMHgyZSwgMHhkYiwgMHhmOCwgMHhhNCwgMHg5NCwgMHhkNywgMHhkNywgMHhlMywgMHg5ZSwgMHg4OSwgMHgyNSwgMHhmMCwKKwkweGU5LCAweDUyLCAweGI3LCAweDAzLCAweDQ4LCAweGQ0LCAweGY4LCAweDUwLCAweGExLCAweDRiLCAweGJkLCAweGQ5LAorCTB4ZDcsIDB4M2EsIDB4NzcsIDB4NDIsIDB4NDksIDB4ZmYsIDB4NTEsIDB4OGMsIDB4ZWYsIDB4ZjUsIDB4YjgsIDB4OWYsCisJMHg3OSwgMHg2MCwgMHg3NywgMHhmMiwgMHgxZSwgMHhkYywgMHgxNywgMHhhYSwgMHg0MCwgMHg5MCwgMHg3YSwgMHhkYSwKKwkweDFmLCAweDBhLCAweDMwLCAweGJmLCAweGZlLCAweDdlLCAweDkxLCAweGNlLCAweGIzLCAweDY1LCAweGM1LCAweGJlLAorCTB4ZmEsIDB4MWEsIDB4YjYsIDB4YWEsIDB4NjUsIDB4OGMsIDB4YWQsIDB4OWIsIDB4OTQsIDB4MzksIDB4NTEsIDB4YTYsCisJMHgzNSwgMHgzMiwgMHhhOSwgMHgyMywgMHhjOCwgMHg3ZSwgMHg3NiwgMHg3ZCwgMHg1MiwgMHgxYiwgMHg1YywgMHhlZiwKKwkweDhlLCAweDQ5LCAweGFmLCAweDkyLCAweDBiLCAweDEyLCAweGQ3LCAweGU1LCAweGUzLCAweGYxLCAweGVlLCAweDI2LAorCTB4ZDEsIDB4YjEsIDB4MWUsIDB4YzEsIDB4MjYsIDB4ZWEsIDB4NjksIDB4NGIsIDB4M2UsIDB4Y2MsIDB4MTgsIDB4NWEsCisJMHgyOCwgMHgxMywgMHg4YywgMHg5NCwgMHhjZSwgMHg1ZiwgMHhhNywgMHgxNSwgMHgyMSwgMHhhZCwgMHhjOCwgMHhhNCwKKwkweGUwLCAweGI1LCAweDBjLCAweGYxLCAweDlhLCAweGNlLCAweDM4LCAweGI0LCAweGFjLCAweDc1LCAweGM0LCAweDY5LAorCTB4ODEsIDB4NTMsIDB4MzIsIDB4NmYsIDB4OGEsIDB4MWQsIDB4MjEsIDB4YjYsIDB4NmQsIDB4MjIsIDB4ZWUsIDB4ZWQsCisJMHhhMSwgMHg1NywgMHg1YiwgMHhiNywgMHhkNCwgMHhjNywgMHg4ZCwgMHgzNiwgMHg4NSwgMHg0NywgMHg2NiwgMHg5YSwKKwkweGUxLCAweDczLCAweDkzLCAweGU2LCAweDNiLCAweGY5LCAweDEwLCAweDJlLCAweGU3LCAweDIzLCAweDc4LCAweDliLAorCTB4YjQsIDB4MmYsIDB4ZDksIDB4YjQsIDB4ZWIsIDB4ZjAsIDB4OGIsIDB4NjIsIDB4ZGUsIDB4NGEsIDB4MzIsIDB4NmYsCisJMHg2ZCwgMHg5OCwgMHg1MCwgMHhmNCwgMHhkNywgMHgyOCwgMHg4NiwgMHg4YywgMHhiZiwgMHhmZSwgMHhlYywgMHhkMiwKKwkweGNkLCAweDNlLCAweGVhLCAweDRkLCAweDY0LCAweGYxLCAweGYwLCAweDdiLCAweDE0LCAweGZiLCAweGVkLCAweDNjLAorCTB4ZmQsIDB4ZGEsIDB4NjcsIDB4NTMsIDB4MzUsIDB4YjQsIDB4MTUsIDB4NzUsIDB4NWYsIDB4NWQsIDB4N2MsIDB4NmYsCisJMHhlNSwgMHg1NCwgMHhhMSwgMHgyOCwgMHhhZiwgMHgwZSwgMHhkNywgMHhhOSwgMHgwNCwgMHhjYSwgMHg0ZSwgMHg1ZCwKKwkweGUzLCAweDU1LCAweDk3LCAweGY4LCAweDYwLCAweDY1LCAweDdkLCAweGU0LCAweGZiLCAweDVjLCAweGZmLCAweDIxLAorCTB4NjIsIDB4M2UsIDB4OGIsIDB4ZWIsIDB4NWYsIDB4YjUsIDB4ZDcsIDB4MGQsIDB4NzMsIDB4NWQsIDB4NzUsIDB4MGQsCisJMHgxZiwgMHg0NiwgMHhhZSwgMHhiZCwgMHgxMywgMHhhMiwgMHhlYywgMHg3OCwgMHgzOCwgMHg0MiwgMHhkZCwgMHg1ZCwKKwkweDU5LCAweDIzLCAweGNmLCAweDA1LCAweDcwLCAweDdiLCAweDdlLCAweDU1LCAweGI5LCAweGU0LCAweDcxLCAweDNmLAorCTB4ZmIsIDB4MDEsIDB4YzcsIDB4OTcsIDB4ODgsIDB4ZjcsIDB4Y2MsIDB4ZTcsIDB4NzksIDB4NGYsIDB4ZjAsIDB4ZDcsCisJMHg3YSwgMHg2MiwgMHg4ZCwgMHhjZiwgMHhlYiwgMHgzZCwgMHg0YywgMHg1YiwgMHg5NCwgMHhkMSwgMHg3OCwgMHg3MiwKKwkweGVmLCAweDhiLCAweGVhLCAweGU4LCAweDlmLCAweDYxLCAweDkwLCAweGJkLCAweGQwLCAweDQzLCAweDEzLCAweDU5LAorCTB4ZWMsIDB4OWYsIDB4ZjgsIDB4NjMsIDB4N2IsIDB4OGYsIDB4NmUsIDB4ZTUsIDB4NmEsIDB4ZWMsIDB4ZTEsIDB4OWEsCisJMHhmYiwgMHhhYSwgMHgxOSwgMHg0NywgMHhmZiwgMHgyZCwgMHgxOSwgMHgxNywgMHg4YywgMHhiNCwgMHhiZCwgMHgxMiwKKwkweDUyLCAweDZiLCAweGUzLCAweDJkLCAweGI3LCAweDJhLCAweDBiLCAweDY1LCAweDQ5LCAweDBjLCAweGI0LCAweDM3LAorCTB4YzcsIDB4MTMsIDB4OTcsIDB4ZjEsIDB4ODgsIDB4MjUsIDB4ZjMsIDB4NmUsIDB4NzcsIDB4YjEsIDB4ZWUsIDB4MTIsCisJMHg5NywgMHhhYSwgMHg3NiwgMHhkNiwgMHhkZSwgMHhiNiwgMHgyMiwgMHg1NiwgMHhkYSwgMHg1MCwgMHg3OCwgMHhmMywKKwkweDczLCAweDMzLCAweDA1LCAweGU5LCAweGM3LCAweGE1LCAweGRlLCAweGY4LCAweDU1LCAweDFiLCAweGQ3LCAweDM5LAorCTB4Y2MsIDB4OWMsIDB4ZmQsIDB4YWMsIDB4ZjEsIDB4NjIsIDB4ODQsIDB4ZDUsIDB4MTgsIDB4OWUsIDB4NTUsIDB4MGEsCisJMHgwNywgMHgwYywgMHgyZiwgMHhiMiwgMHg2MSwgMHgwYiwgMHhkYiwgMHhmOSwgMHhiZCwgMHg5NywgMHhmOCwgMHhlOSwKKwkweDVkLCAweGEzLCAweDBhLCAweDUzLCAweGExLCAweDEwLCAweDMxLCAweDIzLCAweDczLCAweGIwLCAweGViLCAweGZmLAorCTB4NzgsIDB4NjUsIDB4NWYsIDB4MjcsIDB4ZWEsIDB4OTIsIDB4M2QsIDB4ZjgsIDB4N2YsIDB4NmQsIDB4NWYsIDB4NjYsCisJMHgxNSwgMHhmMSwgMHg4YiwgMHhjOCwgMHhlZSwgMHg1NywgMHhjYywgMHhhMSwgMHgwOSwgMHgxMCwgMHhkMywgMHhlYywKKwkweDMyLCAweGU2LCAweGEzLCAweDJlLCAweGE0LCAweGFmLCAweGJhLCAweGEwLCAweDlkLCAweDdlLCAweDg3LCAweDdkLAorCTB4ZGUsIDB4NDMsIDB4ZjUsIDB4ZGEsIDB4ZTksIDB4NTYsIDB4YjcsIDB4OGUsIDB4YzEsIDB4ZTMsIDB4M2UsIDB4M2MsCisJMHg3OCwgMHhiYywgMHgwMywgMHhkNSwgMHhmNiwgMHg3YywgMHg2OCwgMHg5NCwgMHgzYSwgMHg3NSwgMHhiMSwgMHhiZiwKKwkweDFhLCAweGZlLCAweGQ0LCAweGMzLCAweDNlLCAweGViLCAweGVhLCAweGVhLCAweDg3LCAweGQxLCAweDYyLCAweDVmLAorCTB4MWYsIDB4YzEsIDB4OWUsIDB4MDksIDB4YmYsIDB4ZGEsIDB4MzIsIDB4ZTEsIDB4NDEsIDB4YzcsIDB4OWQsIDB4MGYsCisJMHhjMywgMHhiYiwgMHhhYSwgMHg5NywgMHg3YywgMHhjOSwgMHg3NSwgMHhmOSwgMHhmZCwgMHgyZSwgMHhmNiwgMHg2NywKKwkweGMyLCAweDVmLCAweDE5LCAweGEyLCAweDRiLCAweGM4LCAweGRiLCAweDJhLCAweDFkLCAweDQzLCAweGM3LCAweDNkLAorCTB4NmEsIDB4ODcsIDB4ZjksIDB4MzcsIDB4ZDYsIDB4NTUsIDB4N2IsIDB4Y2YsIDB4NDcsIDB4YWUsIDB4NTUsIDB4YzgsCisJMHg1OSwgMHgwMCwgMHgzZSwgMHgyMywgMHgzOSwgMHhhNywgMHgwZiwgMHgxMywgMHg4YywgMHhlZCwgMHhiYiwgMHhlYywKKwkweGY3LCAweDhmLCAweDk3LCAweDM5LCAweDMyLCAweGE1LCAweGQ5LCAweGI3LCAweGI2LCAweGQzLCAweDdlLCAweGYyLAorCTB4NGMsIDB4NmIsIDB4ZjEsIDB4ZGEsIDB4N2EsIDB4OWYsIDB4NzMsIDB4ZGUsIDB4NDAsIDB4N2MsIDB4YTEsIDB4MGYsCisJMHhjYiwgMHg2OCwgMHg4NCwgMHhmYSwgMHhiOCwgMHg1ZCwgMHhhNywgMHg1MCwgMHg5ZiwgMHg2NywgMHg0MiwgMHg1ZCwKKwkweGUyLCAweGYwLCAweGZiLCAweDgwLCAweDM5LCAweGNmLCAweDllLCAweDUzLCAweDY3LCAweGRlLCAweGE0LCAweGVlLAorCTB4MTYsIDB4Y2IsIDB4ZmIsIDB4NTUsIDB4YmUsIDB4ZGYsIDB4N2UsIDB4NWYsIDB4ZjIsIDB4MmQsIDB4YjEsIDB4NjYsCisJMHg1MCwgMHgzMCwgMHhlNywgMHgxNywgMHhkZCwgMHhmZiwgMHg1ZCwgMHhjOCwgMHgzZCwgMHg4ZiwgMHhmZSwgMHhhNywKKwkweDhjLCAweGUzLCAweDc4LCAweDc3LCAweGE1LCAweDRiLCAweGZjLCAweGU3LCAweDRmLCAweDcxLCAweGRmLCAweGY0LAorCTB4MzAsIDB4ZWYsIDB4MGIsIDB4ZmQsIDB4ODMsIDB4ZWMsIDB4MjUsIDB4M2MsIDB4YWEsIDB4OTMsIDB4ZjksIDB4NjcsCisJMHhlZiwgMHg3MSwgMHhkNywgMHhlZCwgMHg2NSwgMHhmOCwgMHg0YiwgMHhhYiwgMHg3YywgMHhmMSwgMHgxMCwgMHhlYSwKKwkweDkzLCAweDIzLCAweDdjLCAweDVlLCAweGExLCAweDlkLCAweGI4LCAweGYxLCAweDMxLCAweDYzLCAweDAzLCAweDNhLAorCTB4NmEsIDB4MjQsIDB4MDcsIDB4M2MsIDB4NmIsIDB4ZjUsIDB4ZjUsIDB4ODgsIDB4MGUsIDB4MTUsIDB4MzYsIDB4ZjIsCisJMHhmYSwgMHg3MywgMHhiNCwgMHhlZiwgMHg5MywgMHg4NiwgMHgwNywgMHhmNSwgMHg4YiwgMHg2NCwgMHhkNiwgMHhhNywKKwkweDhkLCAweGE3LCAweGYxLCAweDc1LCAweDlmLCAweGIzLCAweGY3LCAweDk1LCAweGI1LCAweGFhLCAweDc1LCAweDdkLAorCTB4ZTAsIDB4MGUsIDB4NTcsIDB4ZmQsIDB4ZjgsIDB4MWIsIDB4ZjQsIDB4YTcsIDB4YjYsIDB4NTUsIDB4MzcsIDB4ZGUsCisJMHgyYiwgMHhlOSwgMHhjNCwgMHg0MCwgMHg2NCwgMHhkNSwgMHgzMywgMHgxNiwgMHg2ZSwgMHgxYSwgMHg0NiwgMHg2OCwKKwkweGQ1LCAweDhkLCAweGY2LCAweDJmLCAweGYxLCAweDdkLCAweDkwLCAweDMxLCAweDg4LCAweDZjLCAweDc1LCAweDRhLAorCTB4ZTYsIDB4M2YsIDB4NzEsIDB4ZDIsIDB4MzksIDB4ODgsIDB4M2YsIDB4MmMsIDB4OGMsIDB4ZTAsIDB4YzAsIDB4NDQsCisJMHgxMSwgMHg1YiwgMHhkMywgMHhiNywgMHhmNSwgMHg1NSwgMHhkNywgMHg2NSwgMHg3YiwgMHg2MCwgMHgyMiwgMHhkZSwKKwkweDViLCAweDU1LCAweDk0LCAweDZkLCAweDFmLCAweGZiLCAweDhjLCAweDRhLCAweGU2LCAweGQ4LCAweGZiLCAweGE5LAorCTB4ZDMsIDB4MDEsIDB4NWIsIDB4YTcsIDB4M2QsIDB4MzAsIDB4ZjIsIDB4ZDcsIDB4ZTksIDB4ZjYsIDB4OTMsIDB4YWUsCisJMHgzZiwgMHgyNSwgMHg3YSwgMHg5MywgMHhmZCwgMHhiNiwgMHg4MywgMHhkOCwgMHg0YiwgMHhiYSwgMHhiYiwgMHg2ZiwKKwkweGEwLCAweGRiLCAweDY3LCAweDVjLCAweGE3LCAweGJiLCAweDZiLCAweDIyLCAweDdlLCAweGRhLCAweDU1LCAweGE0LAorCTB4ZmIsIDB4ZWQsIDB4ZTksIDB4MTIsIDB4OGQsIDB4MmMsIDB4YjYsIDB4YWQsIDB4Y2EsIDB4MjIsIDB4YmYsIDB4NmUsCisJMHg5ZiwgMHhiNSwgMHhjZiwgMHhkNiwgMHhjNywgMHg1OSwgMHhmYiwgMHhmYSwgMHhjNiwgMHg3YSwgMHg4OSwgMHgwNywKKwkweGZlLCAweDlhLCAweGQyLCAweGVkLCAweGJkLCAweDdkLCAweDA3LCAweDdiLCAweGRkLCAweDE4LCAweDFmLCAweGRhLAorCTB4OWIsIDB4NWIsIDB4ZGMsIDB4NjksIDB4YzYsIDB4NzYsIDB4ZDgsIDB4YjcsIDB4ZjksIDB4NzMsIDB4MzMsIDB4OGQsCisJMHgwZSwgMHhmNiwgMHg2MSwgMHg5YiwgMHhjYywgMHgyZSwgMHg3ZiwgMHhhNywgMHhlOSwgMHgyMywgMHhlZSwgMHhhYSwKKwkweDU0LCAweDFiLCAweDI3LCAweDY0LCAweGI2LCAweDIxLCAweGIxLCAweDVjLCAweGM0LCAweGMyLCAweDA1LCAweGU5LAorCTB4ZjcsIDB4NzYsIDB4YjIsIDB4NGYsIDB4NTgsIDB4NDYsIDB4ZmIsIDB4ZjYsIDB4ZTIsIDB4NDgsIDB4YTEsIDB4NTcsCisJMHhhNSwgMHhjMywgMHg1YywgMHhjNywgMHg5NCwgMHhiYSwgMHgwMiwgMHhkNiwgMHhiYywgMHg2ZSwgMHg1NCwgMHhkMiwKKwkweDk3LCAweGMyLCAweGE5LCAweDgxLCAweGQ0LCAweGM5LCAweDdhLCAweDBiLCAweGM0LCAweDI4LCAweGJlLCAweDQ1LAorCTB4YTksIDB4NmMsIDB4NmEsIDB4N2IsIDB4YmQsIDB4MWIsIDB4YzcsIDB4NmMsIDB4ZmMsIDB4YTUsIDB4NGQsIDB4ZjEsCisJMHgzMywgMHgyZSwgMHgzMSwgMHg3MywgMHhjNywgMHg4NCwgMHhkNCwgMHgzMSwgMHg0MiwgMHg0OCwgMHg3ZCwgMHgwOCwKKwkweGZmLCAweDkwLCAweDljLCAweDFmLCAweGE4LCAweDQxLCAweGZhLCAweGRlLCAweDFhLCAweDQ4LCAweDVmLCAweDcxLAorCTB4MDQsIDB4M2YsIDB4ZDIsIDB4MjMsIDB4YmUsIDB4NGMsIDB4YzEsIDB4YTMsIDB4YjYsIDB4OTgsIDB4MzMsIDB4ZmUsCisJMHhhZCwgMHg2NiwgMHgxMCwgMHgwMSwgMHhmNiwgMHg2NSwgMHg1ZCwgMHhlZSwgMHgxOCwgMHhmYiwgMHgwYywgMHhkMSwKKwkweDYzLCAweDY3LCAweGViLCAweGIyLCAweDdjLCAweGM2LCAweGRmLCAweDZlLCAweDNhLCAweGI5LCAweGYwLCAweDk2LAorCTB4MjksIDB4OWYsIDB4YmYsIDB4NjMsIDB4MzIsIDB4MTYsIDB4MzksIDB4NjIsIDB4NjMsIDB4YjEsIDB4YWUsIDB4ZDYsCisJMHg1OCwgMHhkZSwgMHhiMiwgMHg1ZSwgMHgzMSwgMHhlNiwgMHhhZiwgMHg5NiwgMHgzYiwgMHgzZCwgMHg0OCwgMHg2YiwKKwkweDIyLCAweGRmLCAweDg0LCAweGJiLCAweDg5LCAweDlmLCAweGRhLCAweDI2LCAweDliLCAweDYwLCAweDRjLCAweDAyLAorCTB4MjcsIDB4OGUsIDB4NDcsIDB4YjAsIDB4NzIsIDB4NDIsIDB4M2IsIDB4M2QsIDB4ZTgsIDB4Y2UsIDB4NjAsIDB4N2MsCisJMHhiNiwgMHgxMywgMHgxMywgMHgwNSwgMHhmZiwgMHg0MiwgMHhkNCwgMHg0NSwgMHg1YywgMHg5ZCwgMHg3NCwgMHhlMSwKKwkweDc2LCAweDYzLCAweGI1LCAweDlhLCAweGI3LCAweDYzLCAweDVhLCAweGUxLCAweDJlLCAweDYzLCAweGJiLCAweGVhLAorCTB4YjUsIDB4MzEsIDB4YzUsIDB4MGMsIDB4YjEsIDB4ODgsIDB4YzIsIDB4NGQsIDB4Y2UsIDB4NWMsIDB4YmUsIDB4MzUsCisJMHg0OSwgMHhjYywgMHg3ZCwgMHhmYiwgMHg4NCwgMHhkNCwgMHg3NywgMHgwYiwgMHhhZiwgMHgyNiwgMHhhOSwgMHg5NywKKwkweDY0LCAweDM2LCAweGUzLCAweDY1LCAweDBmLCAweGI0LCAweDRmLCAweDY5LCAweGRkLCAweDg2LCAweDcyLCAweDMwLAorCTB4ZGUsIDB4YWQsIDB4MzMsIDB4MGUsIDB4MmUsIDB4NWMsIDB4MzYsIDB4ZDMsIDB4ZWMsIDB4OTcsIDB4MWMsIDB4ZDQsCisJMHg2ZSwgMHg2OCwgMHgxMSwgMHg4ZiwgMHgyYiwgMHg4NCwgMHgwMSwgMHg5YiwgMHg0NiwgMHg2ZiwgMHhhYiwgMHgzMSwKKwkweDUzLCAweDg2LCAweGE1LCAweDdhLCAweDBmLCAweDRlLCAweGRiLCAweDMyLCAweGY0LCAweGI3LCAweGFlLCAweDI3LAorCTB4YmUsIDB4N2UsIDB4ZGMsIDB4Y2MsIDB4YjAsIDB4MDcsIDB4OTYsIDB4ZmQsIDB4ZDAsIDB4NTgsIDB4YTIsIDB4YzUsCisJMHhkZCwgMHg0NiwgMHgwYywgMHgxYiwgMHg4YiwgMHgyZSwgMHhhOCwgMHhiNCwgMHhjYSwgMHg3YSwgMHgxYSwgMHhkMywKKwkweDMzLCAweDYwLCAweDQ1LCAweGE5LCAweDcxLCAweGVhLCAweDliLCAweGM4LCAweDE4LCAweDI3LCAweGNlLCAweDZhLAorCTB4M2IsIDB4ZWUsIDB4NWYsIDB4NDgsIDB4YzMsIDB4OTksIDB4ZGYsIDB4NmMsIDB4MzIsIDB4ZmUsIDB4MzcsIDB4MmUsCisJMHg4NSwgMHhiNSwgMHgyMywgMHg2OSwgMHhmMiwgMHhkZCwgMHhjMSwgMHhiYywgMHgzYiwgMHhkZiwgMHhlMywgMHhlMSwKKwkweDdkLCAweDk5LCAweGRiLCAweDc1LCAweGI3LCAweDhlLCAweGU2LCAweDMwLCAweGVmLCAweDRlLCAweDQ5LCAweDVmLAorCTB4ODUsIDB4NjAsIDB4NzcsIDB4MDEsIDB4MzIsIDB4NDMsIDB4NjIsIDB4NmYsIDB4ZjEsIDB4YTksIDB4NTUsIDB4ZGEsCisJMHgzYiwgMHhlYSwgMHg5YSwgMHg3NCwgMHhmNiwgMHhjNSwgMHg3MiwgMHhiMywgMHg5ZSwgMHhlMCwgMHg1NiwgMHhiMywKKwkweDE5LCAweGM3LCAweDBhLCAweDllLCAweDFiLCAweDY4LCAweGM3LCAweDhmLCAweGRjLCAweGUyLCAweDcyLCAweDIxLAorCTB4YmUsIDB4ZWEsIDB4MmUsIDB4NTUsIDB4ZGMsIDB4NWIsIDB4NjIsIDB4OWUsIDB4YzgsIDB4ZDgsIDB4MzUsIDB4YjEsCisJMHg4YywgMHg3MiwgMHg1ZSwgMHgzOCwgMHgyOSwgMHg2YiwgMHg3YywgMHhhYiwgMHg3NSwgMHhmNCwgMHhhNCwgMHhkNCwKKwkweGM4LCAweGVlLCAweGQ2LCAweDg4LCAweGE5LCAweDc1LCAweDRiLCAweDFmLCAweDU4LCAweDRkLCAweDNkLCAweDdkLAorCTB4MzQsIDB4MjYsIDB4MzUsIDB4NzgsIDB4M2YsIDB4NmIsIDB4YjAsIDB4YjYsIDB4ZDAsIDB4YWUsIDB4YTQsIDB4OGUsCisJMHg2OSwgMHgwOSwgMHhiZiwgMHhkYiwgMHg4NSwgMHgyYiwgMHgwZCwgMHg1YSwgMHhlNiwgMHg3OSwgMHg2OCwgMHhiZCwKKwkweGNlLCAweGJjLCAweDcwLCAweDY3LCAweDZiLCAweDYzLCAweDExLCAweDBmLCAweGRmLCAweDNhLCAweGQzLCAweDI3LAorCTB4ZTcsIDB4NDksIDB4NmMsIDB4MWQsIDB4MzcsIDB4ZTUsIDB4MDUsIDB4MWIsIDB4NWIsIDB4ZDYsIDB4NGIsIDB4YzksCisJMHgyZSwgMHhlMiwgMHgwNiwgMHhjMSwgMHhjNiwgMHg3MiwgMHhmZCwgMHg4MSwgMHhkNiwgMHg4NiwgMHgyOSwgMHgxZiwKKwkweDc5LCAweDUzLCAweDc4LCAweDhmLCAweDc1LCAweGU5LCAweDQ4LCAweGExLCAweGM0LCAweGEzLCAweDgzLCAweDliLAorCTB4MzcsIDB4MTMsIDB4MzcsIDB4YmIsIDB4NTMsIDB4NWEsIDB4Y2IsIDB4MDYsIDB4ZTIsIDB4NjYsIDB4OWQsIDB4M2QsCisJMHg4NCwgMHgwNywgMHgzZCwgMHg3OCwgMHhjYywgMHg3NCwgMHhmYSwgMHgwOCwgMHhjMSwgMHhjZSwgMHhkNiwgMHg0OSwKKwkweDJkLCAweDJkLCAweGI4LCAweGY5LCAweGVhLCAweDZhLCAweDYwLCAweDA3LCAweDcxLCAweGYzLCAweDQyLCAweGNlLAorCTB4ODMsIDB4MGMsIDB4NzEsIDB4ZjMsIDB4NDcsIDB4MzksIDB4MWYsIDB4ZWUsIDB4MjAsIDB4NmUsIDB4YmUsIDB4NDIsCisJMHg4YywgMHg3NSwgMHgzZSwgMHhmOSwgMHg0YiwgMHg3YywgMHhiYiwgMHgzOCwgMHgxMywgMHhkYiwgMHg5NSwgMHhmMCwKKwkweGQxLCAweGI3LCAweDA1LCAweDNiLCAweGZmLCAweGE2LCAweDg4LCAweDlkLCAweGZmLCAweGNiLCAweDNmLCAweGMzLAorCTB4Y2UsIDB4NzcsIDB4MTMsIDB4MTMsIDB4NzYsIDB4NGQsIDB4YzgsIDB4ZmUsIDB4ZDEsIDB4YWUsIDB4ZDYsIDB4ZDcsCisJMHg0ZiwgMHhjOSwgMHg5OSwgMHg5NSwgMHg1YiwgMHhmMSwgMHhlZSwgMHhjOSwgMHhlMSwgMHg3ZSwgMHg2MiwgMHg2NSwKKwkweDhjLCAweDI0LCAweDMzLCAweGM4LCAweDRkLCAweDYyLCAweDA5LCAweDcxLCAweGMxLCAweDRiLCAweDZlLCAweGFlLAorCTB4YmIsIDB4MzIsIDB4YTksIDB4MTksIDB4NmYsIDB4YTgsIDB4NzgsIDB4NjcsIDB4MDYsIDB4NzEsIDB4ZjYsIDB4Y2EsCisJMHhkYSwgMHgwMiwgMHg0ZCwgMHg5OCwgMHhmNiwgMHhhNCwgMHg4OCwgMHg4ZCwgMHg1OSwgMHgwMywgMHg5NywgMHgxMiwKKwkweDNiLCAweDU3LCAweGNkLCAweDAxLCAweGI1LCAweDczLCAweDBlLCAweDc2LCAweDk2LCAweDc5LCAweDU4LCAweDU1LAorCTB4MWMsIDB4N2YsIDB4NDYsIDB4ZWMsIDB4Y2MsIDB4ZmUsIDB4OTYsIDB4YTEsIDB4MzYsIDB4ZDcsIDB4YzQsIDB4MTgsCisJMHg1NSwgMHgzOCwgMHgxYywgMHgwZiwgMHhhMCwgMHhlYiwgMHgzOCwgMHg3MSwgMHg4ZiwgMHgzZCwgMHgwZiwgMHhiMywKKwkweDg2LCAweDdlLCAweDZhLCAweDY0LCAweDcwLCAweDc0LCAweGQ2LCAweDk5LCAweDg3LCAweDZkLCAweDIyLCAweDdlLAorCTB4ZjMsIDB4YzQsIDB4YzMsIDB4MjgsIDB4OWYsIDB4ZjMsIDB4ZTAsIDB4MTksIDB4ZTIsIDB4ZTcsIDB4OGQsIDB4YjQsCisJMHhmMywgMHgxOSwgMHhlMiwgMHhlNywgMHhiYiwgMHg2ZiwgMHg5OCwgMHg4OSwgMHg0ZCwgMHhjZCwgMHhlMSwgMHgxNSwKKwkweDYyLCAweGY5LCAweGJhLCAweDVhLCAweGM0LCAweDY1LCAweGRlLCAweDYxLCAweDVkLCAweDU5LCAweDEzLCAweGMwLAorCTB4MzksIDB4MWIsIDB4M2YsIDB4ZmIsIDB4MTcsIDB4YjIsIDB4Y2EsIDB4OTEsIDB4YWQsIDB4OGMsIDB4YjYsIDB4MTAsCisJMHhiYiwgMHhiYSwgMHg2OCwgMHhkNywgMHhiNiwgMHg5MywgMHg1YSwgMHhlNywgMHg4YiwgMHhkNCwgMHg0NSwgMHg2MywKKwkweGZjLCAweGJjLCAweDZkLCAweDhmLCAweGJlLCAweGE0LCAweGNjLCAweDRlLCAweDNhLCAweDViLCAweGU1LCAweDVjLAorCTB4NTUsIDB4MDUsIDB4ZWQsIDB4YmQsIDB4NjUsIDB4MmMsIDB4OTYsIDB4ZmUsIDB4MDAsIDB4NGUsIDB4NGMsIDB4MjYsCisJMHhmMiwgMHg2NSwgMHhjNSwgMHg3YSwgMHgyOCwgMHhmNywgMHhmYSwgMHg3OSwgMHgyZiwgMHg4ZCwgMHhjZSwgMHgzNSwKKwkweDhlLCAweDdmLCAweDI3LCAweGYyLCAweGM3LCAweDg4LCAweDVkLCAweDY1LCAweGNmLCAweDM0LCAweDE0LCAweGRjLAorCTB4NjQsIDB4NzYsIDB4NjIsIDB4ZGMsIDB4OGMsIDB4YTIsIDB4ZmMsIDB4NWMsIDB4NzEsIDB4ZWYsIDB4ZjUsIDB4OWMsCisJMHg5YywgMHhjNSwgMHhkYiwgMHhkOSwgMHgxYSwgMHhmYSwgMHg1ZSwgMHgwOSwgMHgxMywgMHhhNiwgMHg4OSwgMHhlZiwKKwkweGMyLCAweGJlLCAweGRiLCAweDBiLCAweDgyLCAweDE3LCAweGJiLCAweDcxLCAweGQ0LCAweGQ0LCAweDIyLCAweDNmLAorCTB4NjcsIDB4NGMsIDB4ZGMsIDB4MmIsIDB4ZmIsIDB4ZWUsIDB4MzcsIDB4Y2MsIDB4OWUsIDB4MWUsIDB4ZTQsIDB4M2QsCisJMHhmMywgMHg3MywgMHhiMywgMHhhNywgMHhjMSwgMHgwOSwgMHhmYywgMHhjNiwgMHhkZCwgMHg1YywgMHgwZSwgMHhkNywKKwkweDRhLCAweDJmLCAweDMxLCAweGJkLCAweDE2LCAweDE5LCAweGMxLCAweDIzLCAweGM0LCAweDFjLCAweGJmLCAweDU2LAorCTB4MDEsIDB4ZGQsIDB4ZDMsIDB4ZGYsIDB4ZTQsIDB4ZDYsIDB4MjIsIDB4MzMsIDB4MmEsIDB4YzAsIDB4NzcsIDB4NzcsCisJMHgzMiwgMHhiZiwgMHhlZCwgMHhhNCwgMHg2ZiwgMHhjNCwgMHgxNiwgMHgyYSwgMHg5NCwgMHgxYiwgMHg5NywgMHhiZSwKKwkweDZjLCAweGUzLCAweDUxLCAweDdmLCAweDM3LCAweGFmLCAweDhkLCAweDE3LCAweDRhLCAweGI4LCAweGE2LCAweDQ3LAorCTB4NzgsIDB4YzUsIDB4YTYsIDB4ZTMsIDB4NGUsIDB4MGUsIDB4ZDEsIDB4ZjMsIDB4ZmUsIDB4ODUsIDB4NGIsIDB4NzAsCisJMHg2NCwgMHhhYiwgMHhhNCwgMHhhYywgMHhmNywgMHg4ZiwgMHg4NSwgMHhhYywgMHhkZSwgMHhjNSwgMHgxMiwgMHhjMywKKwkweDNhLCAweGI2LCAweDk5LCAweGUyLCAweDVmLCAweDdkLCAweGU0LCAweGIzLCAweDA3LCAweDg3LCAweGNjLCAweGE1LAorCTB4ZWMsIDB4ZGQsIDB4NjQsIDB4MGUsIDB4ZGEsIDB4NDQsIDB4NmMsIDB4ZGQsIDB4Y2QsIDB4MWEsIDB4NmMsIDB4NTksCisJMHg4MywgMHg0NiwgMHhkNiwgMHg2YSwgMHg1YSwgMHhhYiwgMHgxYiwgMHg3OSwgMHgzNSwgMHg1ZiwgMHgxMywgMHgyMSwKKwkweGJlLCAweDU5LCAweGM1LCAweGRhLCAweGRkLCAweDU2LCAweDY4LCAweGMyLCAweDFiLCAweDY3LCAweDc0LCAweGZhLAorCTB4NjYsIDB4M2IsIDB4ZjEsIDB4N2IsIDB4MzcsIDB4ZWUsIDB4YTEsIDB4M2MsIDB4ZGYsIDB4MmUsIDB4N2MsIDB4MDcsCisJMHhlOSwgMHg2ZiwgMHg3OCwgMHg3MCwgMHhlNCwgMHg3OCwgMHgxYSwgMHhlYiwgMHg1NywgMHgwZCwgMHhlMSwgMHhkMiwKKwkweDM3LCAweDdkLCAweGNjLCAweDU1LCAweDAxLCAweDNjLCAweDdlLCAweDVjLCAweGYyLCAweDZiLCAweDA5LCAweDZmLAorCTB4ZGYsIDB4ODgsIDB4NDUsIDB4N2MsIDB4ODgsIDB4ZGEsIDB4MzgsIDB4ZTQsIDB4OGIsIDB4ZWYsIDB4MzksIDB4MTgsCisJMHhjNSwgMHhjZiwgMHhmZSwgMHhiNywgMHhmNCwgMHgzZSwgMHhmMywgMHhkMCwgMHhhYSwgMHg3ZiwgMHg4NiwgMHg2NywKKwkweDg4LCAweDViLCAweDg4LCAweDA1LCAweDJhLCAweDEyLCAweGY2LCAweGI5LCAweGI3LCAweDEyLCAweGRlLCAweGY1LAorCTB4ZDAsIDB4MDcsIDB4MjQsIDB4YTYsIDB4OTcsIDB4MzIsIDB4ZDYsIDB4MmQsIDB4NjIsIDB4ZTcsIDB4ODUsIDB4ZTIsCisJMHg1YywgMHhmMiwgMHhlZCwgMHg5MywgMHhkYSwgMHhjNSwgMHg0MywgMHg4OCwgMHgxMSwgMHg0MywgMHhhMywgMHg0ZiwKKwkweGIwLCAweDliLCAweDliLCAweDc4LCAweGY3LCAweDRhLCAweDNjLCAweDZlLCAweDljLCAweDIzLCAweGRlLCAweDFkLAorCTB4YTYsIDB4YWQsIDB4M2QsIDB4YmEsIDB4ZjgsIDB4NjYsIDB4MDgsIDB4NjUsIDB4NzMsIDB4MTEsIDB4ZmEsIDB4YTQsCisJMHhjYywgMHgyNSwgMHg1ZiwgMHhmMSwgMHgzYiwgMHg3MywgMHg0OSwgMHg5OSwgMHg4NSwgMHhjYiwgMHhiOSwgMHgxMCwKKwkweDc0LCAweDk0LCAweGIxLCAweDc3LCAweDJiLCAweDU3LCAweDU5LCAweGU2LCAweGU0LCAweDI5LCAweGZmLCAweDBlLAorCTB4ZTYsIDB4ZjcsIDB4OGMsIDB4MTksIDB4MGUsIDB4ZWUsIDB4MjgsIDB4ODQsIDB4ZjgsIDB4YTksIDB4MGIsIDB4NjYsCisJMHgwYSwgMHhiZiwgMHhjNywgMHhlNywgMHgyMywgMHhmYywgMHg4ZSwgMHg2MiwgMHgyMiwgMHg1ZiwgMHg1YiwgMHgyMSwKKwkweGNkLCAweGMwLCAweDQ0LCAweGRlLCAweGM5LCAweDc5LCAweGQxLCAweGZjLCAweDVlLCAweGJmLCAweDYwLCAweGNkLAorCTB4YjYsIDB4ZTMsIDB4Y2UsIDB4ZGYsIDB4ZmEsIDB4MGQsIDB4N2YsIDB4N2YsIDB4MWUsIDB4ZjMsIDB4N2IsIDB4YzksCisJMHhmNywgMHg5OSwgMHg5MywgMHgzYSwgMHgzZSwgMHgzYSwgMHg2OSwgMHg2MywgMHhmZSwgMHg3OSwgMHg2MiwgMHhmZSwKKwkweDAxLCAweGFmLCAweDViLCAweGIwLCAweGU2LCAweGFmLCAweGFjLCAweGYzLCAweGYxLCAweDc4LCAweGVmLCAweDM0LAorCTB4ZmQsIDB4YTAsIDB4OGIsIDB4NzQsIDB4NWQsIDB4N2EsIDB4ZDgsIDB4ZTYsIDB4ZDcsIDB4ZTEsIDB4ZDMsIDB4OTksCisJMHhlNSwgMHg1ZSwgMHgzZSwgMHg5OSwgMHhjMCwgMHgzYiwgMHhkNywgMHg2NywgMHhhNywgMHg5ZiwgMHg5NCwgMHhkOSwKKwkweDMzLCAweDYwLCAweDNjLCAweGYyLCAweGVlLCAweDVhLCAweGY4LCAweDVhLCAweGQ4LCAweDZmLCAweDdhLCAweGY5LAorCTB4N2MsIDB4YzQsIDB4N2UsIDB4NWUsIDB4NjYsIDB4YjksIDB4OWYsIDB4N2MsIDB4NTYsIDB4YzIsIDB4ZDMsIDB4MWYsCisJMHg1ZCwgMHg3ZiwgMHhlNywgMHgyMCwgMHgzYiwgMHgzNSwgMHhkZiwgMHg3OSwgMHhjNiwgMHg5NiwgMHhkYiwgMHg3ZSwKKwkweDRlLCAweGU2LCAweGFkLCAweGZlLCAweDA1LCAweGQ4LCAweGYxLCAweGY1LCAweGZiLCAweDk0LCAweDQ5LCAweGVjLAorCTB4N2IsIDB4YzAsIDB4NzIsIDB4ZmMsIDB4MzYsIDB4MWMsIDB4ZGMsIDB4YzYsIDB4NzgsIDB4ZjgsIDB4MmUsIDB4ZWQsCisJMHhiMywgMHhlZCwgMHg1YywgMHg1ZCwgMHhmMCwgMHgyZSwgMHhiMywgMHhkMywgMHg5NiwgMHhmOSwgMHhhZSwgMHg3MywKKwkweDUyLCAweDkzLCAweGU0LCAweGZlLCAweDFmLCAweDU0LCAweDA4LCAweDFlLCAweDdmLCAweDljLCAweDM1LCAweDZiLAorCTB4ZDgsIDB4OTQsIDB4ZDksIDB4M2UsIDB4OTQsIDB4MjcsIDB4NzUsIDB4MDgsIDB4OWIsIDB4YzYsIDB4YTMsIDB4NzgsCisJMHhkYiwgMHhmMCwgMHgxNywgMHhjZiwgMHhiMCwgMHg0OCwgMHg0YywgMHgwZSwgMHgzMCwgMHgyNiwgMHhjMywgMHgxOCwKKwkweDMxLCAweDYzLCAweGQxLCAweGI3LCAweDg5LCAweDRmLCAweGIzLCAweDY0LCAweGY4LCAweGU4LCAweDg0LCAweDFiLAorCTB4NmYsIDB4MTMsIDB4MzMsIDB4NDIsIDB4MzksIDB4NjcsIDB4NDAsIDB4OWQsIDB4NzcsIDB4NGIsIDB4YmYsIDB4NTcsCisJMHgyMiwgMHg1YSwgMHgxMywgMHg2YiwgMHhkOSwgMHg4YiwgMHgzYSwgMHhlNCwgMHg5OCwgMHhmMywgMHhmZCwgMHhmYSwKKwkweDhmLCAweDcxLCAweGVjLCAweDg0LCAweDBiLCAweGY3LCAweGIxLCAweGVmLCAweDRiLCAweGRmLCAweDY5LCAweGYwLAorCTB4ZWYsIDB4YzYsIDB4ZmUsIDB4ZjcsIDB4ZjEsIDB4MGYsIDB4ZDYsIDB4OTQsIDB4OWMsIDB4YjMsIDB4NTIsIDB4NzIsCisJMHg5NiwgMHhlMywgMHgxMywgMHhhYiwgMHg1NiwgMHhkNywgMHhlNywgMHg5ZiwgMHg4NywgMHgzZSwgMHg3OCwgMHgxNSwKKwkweDhkLCAweDAzLCAweDBiLCAweGY4LCAweGMwLCAweDlhLCAweGU3LCAweGJkLCAweGY3LCAweDE4LCAweDNmLCAweDJmLAorCTB4MWEsIDB4YjEsIDB4ODgsIDB4OGIsIDB4YzIsIDB4Y2MsIDB4ODcsIDB4ZGQsIDB4YjgsIDB4ZDcsIDB4OTAsIDB4N2QsCisJMHgyNiwgMHg2ZCwgMHhlMCwgMHg2OSwgMHg2OCwgMHhmZCwgMHgxNywgMHg5NCwgMHg5YywgMHhjZCwgMHhiOSwgMHg2NCwKKwkweDY1LCAweDZiLCAweDY0LCAweDVkLCAweDg1LCAweDk1LCAweGNiLCAweDFiLCAweDNiLCAweGNiLCAweGEwLCAweGI1LAorCTB4NzgsIDB4OTUsIDB4NmUsIDB4YmMsIDB4YWYsIDB4ZmUsIDB4YTcsIDB4MzUsIDB4MWYsIDB4ZmUsIDB4YzQsIDB4N2EsCisJMHg0NywgMHgyZiwgMHhkMSwgMHhkNSwgMHhhMiwgMHgzZSwgMHg3NywgMHg4OSwgMHhiNywgMHgzYSwgMHgxYywgMHgzMywKKwkweDY1LCAweDdmLCAweGVlLCAweGM3LCAweGI4LCAweGVmLCAweDg0LCAweDA3LCAweGVkLCAweGM5LCAweDVmLCAweDVhLAorCTB4ZDksIDB4YjAsIDB4ZDAsIDB4MGMsIDB4NTYsIDB4YTIsIDB4NDIsIDB4ZTgsIDB4M2IsIDB4MzMsIDB4ZWIsIDB4MTcsCisJMHgwYSwgMHg1MCwgMHgxZCwgMHhhNiwgMHhlMCwgMHg2NSwgMHhmMSwgMHhkMywgMHg3MSwgMHg1OCwgMHhhNiwgMHhjYywKKwkweDExLCAweDJkLCAweGRjLCAweDkxLCAweDFjLCAweGMyLCAweDdiLCAweGM5LCAweGY0LCAweDFmLCAweGY4LCAweGEwLAorCTB4NWQsIDB4YmMsIDB4ZWMsIDB4ZDYsIDB4ZTYsIDB4OWIsIDB4ZGMsIDB4NTEsIDB4ZTUsIDB4NmYsIDB4ZDAsIDB4MDcsCisJMHgxYSwgMHhlYywgMHg3YSwgMHg5MywgMHg2NywgMHhlZiwgMHgxNCwgMHg2MCwgMHg2ZSwgMHg5MSwgMHgxZSwgMHg3MywKKwkweDFjLCAweDczLCAweDYzLCAweDU5LCAweDc4LCAweDg4LCAweGVkLCAweDg2LCAweDliLCAweGI1LCAweGNjLCAweDUzLAorCTB4NGEsIDB4OGIsIDB4ZWMsIDB4NTMsIDB4NTEsIDB4NzUsIDB4OGYsIDB4M2UsIDB4ODgsIDB4NjcsIDB4OGMsIDB4NzgsCisJMHhiYSwgMHg0ZCwgMHhkNSwgMHhmOSwgMHgzYSwgMHgwYiwgMHgyNSwgMHhkYSwgMHhlZCwgMHhjNCwgMHgyYSwgMHhkYSwKKwkweGZjLCAweDY1LCAweDc3LCAweDM5LCAweDZhLCAweDU3LCAweGViLCAweDlkLCAweGU1LCAweDZlLCAweDZkLCAweGYwLAorCTB4NmIsIDB4OGMsIDB4YWYsIDB4Y2QsIDB4ODUsIDB4NzksIDB4ZmYsIDB4ZmIsIDB4NzEsIDB4MTcsIDB4NTYsIDB4ZDgsCisJMHhmYiwgMHgwOCwgMHhiOSwgMHhlMiwgMHg4YywgMHg3NCwgMHgxYywgMHg1YiwgMHhjNiwgMHhhYywgMHhmNSwgMHhhZiwKKwkweDI2LCAweGI1LCAweGM4LCAweDUzLCAweDJhLCAweGJiLCAweDIzLCAweDQwLCAweDRjLCAweDczLCAweDNmLCAweGY0LAorCTB4ZTgsIDB4MmMsIDB4ZWIsIDB4NTQsIDB4N2IsIDB4YzEsIDB4ODUsIDB4NWIsIDB4NGUsIDB4MDksIDB4Y2QsIDB4MWMsCisJMHg2OSwgMHgxZSwgMHg0MiwgMHhmOSwgMHgwOSwgMHg2YiwgMHhmZCwgMHgwZSwgMHg0MywgMHgxYiwgMHhiYywgMHhlYywKKwkweGNlLCAweGZlLCAweGQ3LCAweDVhLCAweGVhLCAweGFkLCAweDQzLCAweGM5LCAweDNlLCAweGRhLCAweDEwLCAweDcxLAorCTB4YzUsIDB4OTAsIDB4OWMsIDB4ODcsIDB4NGIsIDB4ZmMsIDB4MzksIDB4MzEsIDB4YzUsIDB4MWYsIDB4ZDMsIDB4NTcsCisJMHhkZCwgMHhhOSwgMHgyMCwgMHhmOSwgMHhkNCwgMHgxMiwgMHhkMywgMHg5MCwgMHhmOSwgMHg3OSwgMHgxNCwgMHg5NywKKwkweDhkLCAweGFjLCAweDdmLCAweDUzLCAweDQzLCAweDgyLCAweGQ4LCAweDJjLCAweGMyLCAweDNhLCAweDE4LCAweGM1LAorCTB4NTEsIDB4NjIsIDB4YmMsIDB4NDMsIDB4NmMsIDB4MDksIDB4ZTcsIDB4NDMsIDB4M2EsIDB4YjEsIDB4NTksIDB4MzcsCisJMHg1YywgMHg2MywgMHgwMSwgMHgzNSwgMHg5MywgMHg4YiwgMHgxOSwgMHhlZCwgMHhmOCwgMHhmNywgMHg5OCwgMHg4ZiwKKwkweDg4LCAweDhiLCAweDFjLCAweDQyLCAweGUwLCAweGM0LCAweGRmLCAweDU5LCAweDU1LCAweGJhLCAweGRlLCAweDMyLAorCTB4YTYsIDB4YjgsIDB4ZWUsIDB4MTMsIDB4MTEsIDB4ZWEsIDB4OTgsIDB4ZWYsIDB4YzksIDB4YjksIDB4MTUsIDB4YjMsCisJMHgwYiwgMHhmNywgMHg4YywgMHg4NSwgMHhmOSwgMHg3ZSwgMHgxNSwgMHg1NiwgMHg5ZSwgMHg4OCwgMHhlMiwgMHg0YSwKKwkweGYyLCAweDY2LCAweGNjLCAweGQ3LCAweDM4LCAweDE4LCAweGM4LCAweGFmLCAweGQzLCAweDhmLCAweGQ4LCAweDY3LAorCTB4NjUsIDB4MGIsIDB4YmEsIDB4YmQsIDB4NzcsIDB4NzQsIDB4YzgsIDB4OTQsIDB4ZmUsIDB4ZGMsIDB4YzMsIDB4YmYsCisJMHgwMywgMHhmYywgMHg4OCwgMHgzZSwgMHhiZiwgMHg1NSwgMHhjNCwgMHgzYSwgMHhmYiwgMHg1YiwgMHhhMywgMHgzMywKKwkweDZmLCAweDU1LCAweGQ4LCAweDdiLCAweDlhLCAweDg4LCAweGYyLCAweGI5LCAweDkwLCAweDNkLCAweDE3LCAweDFjLAorCTB4MjYsIDB4Y2QsIDB4YjMsIDB4ZTMsIDB4ZDIsIDB4YjcsIDB4YjUsIDB4YWQsIDB4ZjMsIDB4MTUsIDB4ZjcsIDB4ZGYsCisJMHhkZiwgMHgzMiwgMHg1YywgMHg1OCwgMHhjZiwgMHhkZSwgMHgzZSwgMHhhMiwgMHg0YiwgMHhiZCwgMHgxYywgMHhkNiwKKwkweDZhLCAweGIxLCAweDBlLCAweGE3LCAweDQzLCAweDZjLCAweGMyLCAweGY1LCAweDdmLCAweDg3LCAweDIzLCAweGExLAorCTB4MDQsIDB4NzMsIDB4YmUsIDB4OGUsIDB4NzcsIDB4NzMsIDB4NWYsIDB4NjYsIDB4YmYsIDB4NTMsIDB4MjcsIDB4NjcsCisJMHg3NywgMHg3MCwgMHhjYiwgMHgwOSwgMHgyZiwgMHhkNywgMHg1YywgMHg0ZiwgMHg1YywgMHhiMywgMHgwOSwgMHgzZiwKKwkweDBiLCAweDM5LCAweGJkLCAweGM2LCAweDYxLCAweDVlLCAweDFmLCAweDlkLCAweDBlLCAweDEwLCAweDhiLCAweGZhLAorCTB4ZjgsIDB4YjksIDB4OTEsIDB4YjcsIDB4MmYsIDB4ZTIsIDB4NDksIDB4NjQsIDB4ZjksIDB4ZDcsIDB4NzgsIDB4ZjIsCisJMHgxMSwgMHgwZiwgMHhlOCwgMHhiOCwgMHg5YSwgMHg3YiwgMHgwOSwgMHg1NywgMHg0OCwgMHgzYiwgMHgzYiwgMHhlZCwKKwkweGQwLCAweDNjLCAweDVlLCAweDEwLCAweGJhLCAweGIyLCAweDVlLCAweDZjLCAweGIwLCAweGQ2LCAweDJkLCAweGY0LAorCTB4MDMsIDB4NzIsIDB4OGUsIDB4ZjcsIDB4ZGYsIDB4YjgsIDB4MDYsIDB4OTEsIDB4ZGQsIDB4MDksIDB4ZjYsIDB4YzcsCisJMHg0NiwgMHgwMywgMHhkYSwgMHg0MywgMHhiNCwgMHg5NywgMHgyOSwgMHg2YiwgMHg2OCwgMHhlYywgMHg0NSwgMHhlNSwKKwkweGRkLCAweDA4LCAweDU2LCAweDhjLCAweDU5LCAweDQzLCAweDkxLCAweDk0LCAweDVjLCAweGI3LCAweGFjLCAweGVhLAorCTB4YjUsIDB4N2EsIDB4ZTQsIDB4MGQsIDB4ZTUsIDB4NjEsIDB4YWQsIDB4ZjMsIDB4NTAsIDB4MDcsIDB4YTMsIDB4MzgsCisJMHg5YiwgMHg2YiwgMHhiYywgMHhmOCwgMHgxZSwgMHhiMSwgMHg1MywgMHg5NCwgMHhiZCwgMHhkZSwgMHgyNSwgMHhmNywKKwkweDI4LCAweDY2LCAweDcyLCAweGZmLCAweGIxLCAweDUyLCAweDY2LCAweDA0LCAweGEzLCAweDg1LCAweDgwLCAweDlhLAorCTB4Y2UsIDB4ZmQsIDB4NDksIDB4YTUsIDB4ZTQsIDB4YTIsIDB4MTEsIDB4ZmEsIDB4NDIsIDB4ZDMsIDB4OTgsIDB4ZjAsCisJMHg2YSwgMHgwZCwgMHg1NSwgMHg5MSwgMHhjZSwgMHg1MSwgMHhkMiwgMHg5OSwgMHg1ZSwgMHhhMywgMHg2NywgMHg0NiwKKwkweDk0LCAweGU4LCAweDJjLCAweDQwLCAweDVjLCAweGY3LCAweGFhLCAweGNjLCAweGNmLCAweGE4LCAweGI3LCAweGE3LAorCTB4ZjksIDB4YmMsIDB4ZTgsIDB4MmQsIDB4OGMsIDB4OWYsIDB4MTUsIDB4ZTksIDB4M2MsIDB4NTYsIDB4YjgsIDB4ODgsCisJMHhlOSwgMHhkYywgMHgyNSwgMHhmYiwgMHhmNywgMHg5MSwgMHg0MiwgMHg4MiwgMHhiNSwgMHhhZiwgMHgwZiwgMHg3OSwKKwkweGU2LCAweDkzLCAweGIxLCAweDVjLCAweDYzLCAweDY2LCAweDhjLCAweDdjLCAweDM4LCAweDY3LCAweGVlLCAweGZhLAorCTB4ZjAsIDB4NjQsIDB4ZjEsIDB4OTksIDB4NjEsIDB4YmUsIDB4M2IsIDB4N2MsIDB4ZWQsIDB4NzcsIDB4ZDEsIDB4OTEsCisJMHhiMywgMHhhZiwgMHhlZiwgMHhlYywgMHgyYiwgMHg5NCwgMHhkMywgMHg3NiwgMHg0ZSwgMHgxZiwgMHg3ZSwgMHhkOCwKKwkweGY0LCAweGNhLCAweDBjLCAweDFjLCAweDJmLCAweDhkLCAweGFmLCAweGM3LCAweDg4LCAweGYxLCAweDk3LCAweGQ4LAorCTB4NDUsIDB4YjksIDB4NDcsIDB4YTksIDB4Y2YsIDB4MTMsIDB4YTYsIDB4YmQsIDB4N2YsIDB4MmYsIDB4ZTcsIDB4YmEsCisJMHg5OCwgMHhhYiwgMHhiYiwgMHg1YSwgMHhjZiwgMHgxMCwgMHg4YiwgMHgxZCwgMHg2MywgMHhjYywgMHhlYywgMHg0OSwKKwkweDM2LCAweDc2LCAweGJmLCAweDRjLCAweGJmLCAweDRiLCAweDdmLCAweDVkLCAweGY2LCAweGM4LCAweDgxLCAweGIxLAorCTB4ODksIDB4NmYsIDB4NjMsIDB4YWEsIDB4YTYsIDB4NzEsIDB4ZTEsIDB4NTksIDB4ZTYsIDB4ODQsIDB4ZDMsIDB4Y2MsCisJMHg1MywgMHgxZSwgMHhlNiwgMHg4NCwgMHhlYSwgMHgwOSwgMHg2MiwgMHg0OCwgMHhlNiwgMHhhOSwgMHg3OSwgMHhlNiwKKwkweDI5LCAweDhmLCAweGRlLCAweDc4LCAweDcxLCAweDA2LCAweGZmLCAweDlkLCAweDdhLCAweDExLCAweGZlLCAweDYyLAorCTB4ODksIDB4MTksIDB4YzgsIDB4YjMsIDB4Y2UsIDB4ZmMsIDB4NTUsIDB4OWYsIDB4ZTksIDB4YzcsIDB4YTUsIDB4OWIsCisJMHg5ZCwgMHgxOSwgMHg5YSwgMHg5YiwgMHgzNSwgMHg3YiwgMHg3NywgMHhhZSwgMHgzMSwgMHgzNCwgMHgyMiwgMHhiNCwKKwkweDdiLCAweGI0LCAweDQ4LCAweDk2LCAweGI2LCAweDNhLCAweDYyLCAweDYzLCAweGVmLCAweDZlLCAweGY2LCAweDBiLAorCTB4NzIsIDB4OGUsIDB4YWIsIDB4MGEsIDB4MWUsIDB4ZmEsIDB4ZmUsIDB4ODgsIDB4MjEsIDB4ZTcsIDB4MWIsIDB4MjIsCisJMHhjMSwgMHhjZCwgMHhiNCwgMHhlMSwgMHg4OCwgMHhkOSwgMHhkOCwgMHgxMiwgMHg1MywgMHgzYiwgMHg3MCwgMHhhOSwKKwkweDk4LCAweDYzLCAweDFkLCAweDJjLCAweGFkLCAweDY1LCAweDhlLCAweGEyLCAweGIxLCAweGZiLCAweDdlLCAweDdjLAorCTB4MDMsIDB4ZTksIDB4OWEsIDB4YzYsIDB4ZGUsIDB4NzEsIDB4YzQsIDB4OGMsIDB4N2IsIDB4MjEsIDB4ZTcsIDB4NDEsCisJMHgxZCwgMHg1YSwgMHhmNSwgMHg3OSwgMHgzNywgMHhmMSwgMHhjOCwgMHgyNywgMHhkNiwgMHg1MiwgMHhmZCwgMHgzMSwKKwkweDhjLCAweDEzLCAweDMzLCAweDM2LCAweGFjLCAweGQyLCAweDJmLCAweDdlLCAweGJmLCAweDc4LCAweGNmLCAweGQ5LAorCTB4MmIsIDB4MTIsIDB4N2YsIDB4ZjEsIDB4NTEsIDB4MDcsIDB4ZTUsIDB4ZjAsIDB4MmMsIDB4YWEsIDB4ZTMsIDB4MWEsCisJMHhkNCwgMHg4NSwgMHg3ZCwgMHg1NiwgMHhmOCwgMHg1NSwgMHgxYywgMHhhMCwgMHhiZiwgMHg4ZCwgMHgxNywgMHgxNCwKKwkweDhjLCAweGZhLCAweDU3LCAweDMxLCAweDIwLCAweGI1LCAweDg5LCAweGVmLCAweGI0LCAweGU1LCAweDAyLCAweGM0LAorCTB4MjksIDB4MTEsIDB4OTQsIDB4ZWIsIDB4YjEsIDB4ZTgsIDB4MzAsIDB4ZTUsIDB4NmIsIDB4NjMsIDB4MmUsIDB4MWYsCisJMHg2NSwgMHgwZSwgMHhjOSwgMHg4NiwgMHgwMiwgMHhmNiwgMHhmOSwgMHhkNSwgMHg3MiwgMHgzZCwgMHg2MiwgMHhmZiwKKwkweGNmLCAweDgxLCAweGY0LCAweDQxLCAweDBkLCAweDUzLCAweGIyLCAweDRmLCAweDdkLCAweDA4LCAweGFmLCAweDhlLAorCTB4Y2YsIDB4ZTMsIDB4NTgsIDB4MzIsIDB4OGQsIDB4YmQsIDB4MzUsIDB4MjEsIDB4OGMsIDB4OTksIDB4OGIsIDB4ZWQsCisJMHhiOSwgMHg4MSwgMHhmNCwgMHg1YiwgMHg1YiwgMHgyNiwgMHgwZSwgMHhkYSwgMHhiMywgMHhjOCwgMHg4ZCwgMHg0OSwKKwkweDU3LCAweGJkLCAweDljLCAweGUzLCAweDk4LCAweDY2LCAweGRmLCAweDM1LCAweDZlLCAweDBjLCAweGUxLCAweDgwLAorCTB4ZjEsIDB4YzcsIDB4MzAsIDB4MTYsIDB4NDksIDB4ZWUsIDB4MWMsIDB4YzEsIDB4ZjksIDB4MjksIDB4YTksIDB4NjEsCisJMHhmZCwgMHhhZCwgMHhjYiwgMHhjNiwgMHg0NCwgMHgzZiwgMHgyZSwgMHg2MiwgMHg1ZSwgMHgxZiwgMHg5YSwgMHg2YywKKwkweDBjLCAweDM3LCAweGQ3LCAweGJhLCAweDdjLCAweGNhLCAweGMxLCAweDcyLCAweDRkLCAweDc5LCAweDM5LCAweDczLAorCTB4NWQsIDB4ODUsIDB4MjAsIDB4ZjUsIDB4NzUsIDB4MjEsIDB4ZTksIDB4NjUsIDB4Y2UsIDB4MTEsIDB4N2QsIDB4Y2EsCisJMHgxOSwgMHgzZiwgMHg0NywgMHhjZSwgMHg0NCwgMHg1ZSwgMHg2MSwgMHhhNCwgMHhmOSwgMHhjNiwgMHhmZCwgMHgxNSwKKwkweGY5LCAweGZmLCAweDgzLCAweDZiLCAweGU3LCAweDBlLCAweDhiLCAweGIzLCAweGYxLCAweDNmLCAweGI3LCAweDJlLAorCTB4ZGQsIDB4MjQsIDB4NzIsIDB4MjcsIDB4MDMsIDB4Y2MsIDB4ZTksIDB4ZDEsIDB4YTksIDB4NmIsIDB4ZmEsIDB4MTUsCisJMHg5ZCwgMHg5ZSwgMHg5MywgMHg5YSwgMHg2MSwgMHhlYiwgMHhkYywgMHg5OSwgMHhiNywgMHg2OSwgMHgwMywgMHhlZiwKKwkweGE4LCAweDQ2LCAweGQ2LCAweDEzLCAweGZhLCAweDU1LCAweDBkLCAweGZkLCAweGFkLCAweDA5LCAweGJkLCAweDRiLAorCTB4NTMsIDB4OWUsIDB4OWUsIDB4YWIsIDB4ZTYsIDB4N2EsIDB4YjQsIDB4YWMsIDB4N2UsIDB4ZDcsIDB4YzIsIDB4Y2QsCisJMHg2ZCwgMHg3MCwgMHhlYiwgMHg3MiwgMHg3ZCwgMHhjYSwgMHg0YSwgMHg4NywgMHhlNCwgMHg3NywgMHgzMywgMHgyMCwKKwkweGI1LCAweGZjLCAweDA1LCAweDczLCAweGRlLCAweDVhLCAweGJlLCAweGQ4LCAweGMxLCAweDg2LCAweDdmLCAweDk3LAorCTB4OTMsIDB4YmQsIDB4YWYsIDB4YWMsIDB4YzUsIDB4NWUsIDB4ZmIsIDB4ZTIsIDB4ZGIsIDB4ZWUsIDB4ODMsIDB4ZjgsCisJMHhkYiwgMHhmYywgMHgyMSwgMHhiYywgMHgzOSwgMHhlZSwgMHgyMSwgMHhjZSwgMHgxNCwgMHg1OSwgMHhkNiwgMHhhMywKKwkweDdhLCAweDc1LCAweDNjLCAweGZkLCAweDJlLCAweGYzLCAweGUyLCAweGM1LCAweGE5LCAweDkyLCAweDVmLCAweGNjLAorCTB4YjUsIDB4YWUsIDB4OTgsIDB4NTIsIDB4YTQsIDB4NTUsIDB4ODUsIDB4MzIsIDB4Y2EsIDB4ZjksIDB4NTMsIDB4YzMsCisJMHg4ZCwgMHg2OCwgMHgxMSwgMHhkYiwgMHhiYSwgMHhjOSwgMHhlNywgMHhlZSwgMHg5YywgMHg4MywgMHg3OSwgMHg2MywKKwkweGY5LCAweGMzLCAweDAxLCAweDY3LCAweGZlLCAweDE1LCAweDYwLCAweDFlLCAweDFkLCAweGM1LCAweDkxLCAweDVjLAorCTB4NjMsIDB4ZTIsIDB4M2QsIDB4MzksIDB4YTcsIDB4YzMsIDB4NWUsIDB4ZWMsIDB4MTIsIDB4NDYsIDB4NzEsIDB4MjIsCisJMHg1NywgMHhjYSwgMHhhMSwgMHgxMSwgMHgzOSwgMHhkZiwgMHg5YSwgMHg4OCwgMHhiYSwgMHg5YywgMHgxYywgMHgxOSwKKwkweDc1LCAweDY5LCAweGQ5LCAweGE4LCAweGViLCAweGU2LCAweDgwLCAweDYwLCAweDgzLCAweGUxLCAweDQyLCAweDJjLAorCTB4NTIsIDB4MGUsIDB4MzcsIDB4ZjYsIDB4MTgsIDB4OGUsIDB4N2YsIDB4ZDQsIDB4Y2YsIDB4NzgsIDB4MTEsIDB4NWQsCisJMHgyNCwgMHg3NSwgMHg1OSwgMHg2YSwgMHhiMiwgMHg4NywgMHgzNSwgMHg3OSwgMHgzMSwgMHhkMiwgMHg4YiwgMHgzZCwKKwkweDc4LCAweDRkLCAweDE3LCAweDdkLCAweGVjLCAweDJmLCAweGU5LCAweGMzLCAweDM4LCAweDg3LCAweGZkLCAweGQ2LAorCTB4N2MsIDB4YjcsIDB4ZjgsIDB4OTIsIDB4MTcsIDB4ODcsIDB4OWEsIDB4YTYsIDB4YWQsIDB4YTksIDB4YjAsIDB4YzgsCisJMHhlZSwgMHhjNiwgMHg2OSwgMHhlNiwgMHg1NywgMHhkYywgMHgxYywgMHg4YiwgMHg5YywgMHg2NiwgMHhjZCwgMHgxZSwKKwkweGQxLCAweDRiLCAweDNlLCAweDdlLCAweDU3LCAweDkxLCAweDRmLCAweDNkLCAweDMzLCAweDhiLCAweDNmLCAweGUxLAorCTB4ZWYsIDB4ZjUsIDB4OTEsIDB4YmQsIDB4Y2EsIDB4NTksIDB4NmYsIDB4ZjksIDB4Y2MsIDB4ZGIsIDB4ODEsIDB4ZDIsCisJMHhlYywgMHg1NCwgMHg5ZSwgMHg4ZCwgMHhlNiwgMHgwOSwgMHgzYSwgMHgyYiwgMHg4NCwgMHg1NiwgMHg4MCwgMHhmZSwKKwkweDU5LCAweDhlLCAweGRlLCAweGIwLCAweDljLCAweGYzLCAweDEwLCAweGJkLCAweGM4LCAweDllLCAweDIyLCAweGE4LAorCTB4MGYsIDB4MGIsIDB4MmYsIDB4NTEsIDB4MWYsIDB4ODcsIDB4YWUsIDB4OWQsIDB4YTksIDB4NzIsIDB4ZjIsIDB4NTcsCisJMHgwNSwgMHhhZiwgMHg2ZiwgMHg0ZSwgMHhiZSwgMHhiOCwgMHhjZSwgMHg4ZiwgMHhkZiwgMHg1OCwgMHg5NywgMHhjMiwKKwkweDExLCAweGU2LCAweDA0LCAweGIxLCAweDY5LCAweGM2LCAweGM2LCAweDkxLCAweDZlLCAweGUyLCAweDkzLCAweGRkLAorCTB4ZjYsIDB4ZjksIDB4MTEsIDB4YzYsIDB4ODEsIDB4NzksIDB4NGQsIDB4OGUsIDB4ZjksIDB4M2UsIDB4ZTIsIDB4ZWMsCisJMHhiOSwgMHg5YywgMHg3ZCwgMHg2NiwgMHhhZiwgMHhmNywgMHgwZCwgMHgxNSwgMHg2MywgMHhhZSwgMHhmOSwgMHgxMiwKKwkweDdhLCAweDZiLCAweDg1LCAweDVlLCAweDI4LCAweGI4LCAweDZkLCAweDMyLCAweDQxLCAweDFkLCAweGQ0LCAweDA5LAorCTB4NWQsIDB4ZWIsIDB4MjksIDB4NzYsIDB4NzMsIDB4ODcsIDB4YzYsIDB4ODQsIDB4M2UsIDB4MzAsIDB4MzIsIDB4MTYsCisJMHhlYiwgMHhmZiwgMHgyOSwgMHhiMCwgMHhhZSwgMHgwYSwgMHhkYSwgMHhlMCwgMHg2YywgMHhmMSwgMHhmZiwgMHgzOCwKKwkweDdlLCAweGExLCAweDg0LCAweDk2LCAweGQwLCAweGYxLCAweGMwLCAweDY0LCAweDhlLCAweDNiLCAweDNlLCAweDU3LAorCTB4NDEsIDB4ZGQsIDB4NjksIDB4ZGQsIDB4M2YsIDB4NTAsIDB4MTUsIDB4NzgsIDB4ZWMsIDB4ODksIDB4MDQsIDB4NzksCisJMHg1ZiwgMHgxNCwgMHhkYywgMHgzYywgMHhlOSwgMHg4MywgMHhmZiwgMHg0YywgMHgxNSwgMHg2YiwgMHhhZSwgMHgwZiwKKwkweDk3LCAweDliLCAweDY5LCAweGQ3LCAweDI3LCAweDRhLCAweGJjLCAweGRiLCAweDdiLCAweGEzLCAweDc4LCAweDc0LAorCTB4MjIsIDB4MGEsIDB4OTMsIDB4M2UsIDB4M2IsIDB4NjcsIDB4Y2EsIDB4M2UsIDB4YjAsIDB4Y2YsIDB4Y2UsIDB4OWYsCisJMHgxNywgMHhkNywgMHhkNCwgMHhkOSwgMHg3YiwgMHg1NCwgMHhjZiwgMHgxNiwgMHhmNCwgMHhjOCwgMHg1OSwgMHg1NSwKKwkweDg1LCAweDBmLCAweDRlLCAweGNjLCAweGRmLCAweDVjLCAweDBlLCAweGViLCAweDg1LCAweGE1LCAweGE5LCAweDc4LAorCTB4NjYsIDB4MTcsIDB4N2QsIDB4N2UsIDB4YzUsIDB4ZjIsIDB4MzAsIDB4N2IsIDB4MTksIDB4ZjYsIDB4OTQsIDB4NmIsCisJMHhhNSwgMHhmZiwgMHgxZCwgMHg2MCwgMHhmZiwgMHg1YiwgMHhkYSwgMHhkMywgMHhkNywgMHhmYiwgMHgxZiwgMHg1MiwKKwkweGQ5LCAweDRkLCAweDQxLCAweDU4LCAweDFmLCAweDk1LCAweGE3LCAweGFjLCAweDhmLCAweGJkLCAweGE5LCAweDM4LAorCTB4ZGYsIDB4OTcsIDB4M2QsIDB4M2QsIDB4Y2IsIDB4N2EsIDB4YWIsIDB4ZDksIDB4YjIsIDB4ZjIsIDB4Y2QsIDB4YjEsCisJMHg0YywgMHhjOCwgMHgxZCwgMHhjMiwgMHg5OSwgMHgwNiwgMHhkOSwgMHgwNywgMHg3NCwgMHhlMSwgMHg4MywgMHhiOCwKKwkweDFlLCAweGQ5LCAweDA1LCAweGQ5LCAweDdiLCAweDY3LCAweDhlLCAweDVmLCAweDJjLCAweGU3LCAweDBlLCAweGViLAorCTB4ODIsIDB4OWQsIDB4ZTYsIDB4MjIsIDB4M2MsIDB4MzMsIDB4YmIsIDB4MTYsIDB4YmQsIDB4NWUsIDB4ZDgsIDB4ZTcsCisJMHg2MiwgMHgyYywgMHgwMywgMHg2ZiwgMHgyYywgMHg4NSwgMHhkNCwgMHhlZCwgMHg3OCwgMHhjYiwgMHg0MywgMHgwOCwKKwkweDYzLCAweGI2LCAweDcwLCAweDA4LCAweDBmLCAweDllLCAweDkwLCAweGZkLCAweGM1LCAweDA3LCAweDVhLCAweDdkLAorCTB4MjcsIDB4YWMsIDB4YmYsIDB4OGIsIDB4YTQsIDB4ZTYsIDB4OTksIDB4MTcsIDB4MmQsIDB4YWIsIDB4NjIsIDB4NmQsCisJMHg2MywgMHg4NCwgMHhlNSwgMHg4OCwgMHgxOCwgMHhhMywgMHg1NywgMHhiMCwgMHg3YiwgMHhmZiwgMHgwNywgMHhhOCwKKwkweGMxLCAweGQ5LCAweGU5LCAweGY0LCAweGNkLCAweGVjLCAweDI1LCAweDNiLCAweDlmLCAweDU0LCAweDIxLCAweDNjLAorCTB4NGYsIDB4MTksIDB4OWYsIDB4MmUsIDB4MDgsIDB4NGUsIDB4NzksIDB4YjAsIDB4NzUsIDB4Y2IsIDB4ODksIDB4MjUsCisJMHg3OCwgMHg2MSwgMHgzNiwgMHg4YywgMHhiMywgMHhhNiwgMHg0ZSwgMHg5YywgMHgwNCwgMHg1NSwgMHg5OSwgMHhiMiwKKwkweGFhLCAweGFiLCAweGM5LCAweDZiLCAweGE1LCAweGRiLCAweDhkLCAweDRkLCAweDQ5LCAweGU5LCAweDBmLCAweGY1LAorCTB4ZmUsIDB4ODAsIDB4YzIsIDB4OTIsIDB4NzIsIDB4ZTgsIDB4MGIsIDB4ZmIsIDB4ODEsIDB4MDEsIDB4M2YsIDB4ZmIsCisJMHhkNSwgMHgyNywgMHg1NSwgMHgzYywgMHhmMywgMHhiZSwgMHgzYiwgMHg4YywgMHhlNywgMHg5OSwgMHg3ZiwgMHg3ZSwKKwkweDUwLCAweDkwLCAweDMzLCAweDUzLCAweGNjLCAweDMxLCAweGQzLCAweDUxLCAweGRhLCAweGNhLCAweDA3LCAweDU3LAorCTB4N2QsIDB4MTUsIDB4MGUsIDB4MzMsIDB4NWUsIDB4NWUsIDB4MzIsIDB4Y2EsIDB4OTgsIDB4YTMsIDB4ZTQsIDB4MGMsCisJMHg5NSwgMHhlNCwgMHhmNywgMHg5ZCwgMHg3MiwgMHg1NiwgMHhjNCwgMHg3YSwgMHg1NiwgMHg3NywgMHhmYSwgMHg3ZCwKKwkweDYzLCAweGU2LCAweGM2LCAweDczLCAweGM4LCAweDIxLCAweGU2LCAweGY1LCAweGM2LCAweGVlLCAweDg4LCAweDdhLAorCTB4YzUsIDB4NGEsIDB4N2YsIDB4NWQsIDB4NTEsIDB4Y2UsIDB4ZGQsIDB4NTUsIDB4YTgsIDB4YjAsIDB4NjUsIDB4YzUsCisJMHhmMCwgMHg0NCwgMHhhOSwgMHhhNiwgMHg1NCwgMHg0YiwgMHgyZiwgMHhkNywgMHg5ZCwgMHgyZCwgMHhmYSwgMHg2MCwKKwkweDI1LCAweDYzLCAweGZkLCAweDI4LCAweDZiLCAweDc0LCAweGY5LCAweDA5LCAweGE5LCAweDI1LCAweGVjLCAweDVmLAorCTB4ZDQsIDB4N2EsIDB4NjIsIDB4NjEsIDB4YzEsIDB4MGQsIDB4M2UsIDB4ZGMsIDB4MWYsIDB4ZDIsIDB4NWEsIDB4ZTQsCisJMHgyYywgMHhmNiwgMHhkMywgMHg4NSwgMHgwZSwgMHg4ZiwgMHg5YywgMHg4OSwgMHg3YSwgMHhhNiwgMHgyMCwgMHhiNSwKKwkweDVjLCAweDcyLCAweDQxLCAweDY5LCAweGJkLCAweDA4LCAweDZhLCAweGM3LCAweGM0LCAweDQ2LCAweGRkLCAweGFkLAorCTB4MWYsIDB4OGQsIDB4MDUsIDB4ZTQsIDB4ZGMsIDB4ZmMsIDB4OTAsIDB4OGIsIDB4YmQsIDB4YjYsIDB4NmYsIDB4Y2MsCisJMHhiMiwgMHhlZSwgMHg2ZSwgMHhkNiwgMHhmYiwgMHhkNywgMHhiYiwgMHg2NSwgMHgzZiwgMHgzOSwgMHhkNiwgMHg3YiwKKwkweDRlLCAweDY5LCAweDJkLCAweDQ3LCAweGQ0LCAweDhkLCAweDc0LCAweDllLCAweGFiLCAweDkyLCAweDE4LCAweGM5LAorCTB4NTIsIDB4Y2UsIDB4NDcsIDB4NmQsIDB4OTksIDB4ZjYsIDB4NTMsIDB4YTYsIDB4ZDIsIDB4OTksIDB4YTEsIDB4MmEsCisJMHg1YywgMHgxZSwgMHg4NywgMHhjZSwgMHhhOCwgMHhjNSwgMHg3OSwgMHg4MywgMHhjOSwgMHgyOSwgMHgxNCwgMHg0ZiwKKwkweGI3LCAweDQzLCAweGZjLCAweDVmLCAweGViLCAweDE1LCAweDBjLCAweDU1LCAweGM5LCAweDljLCAweDNjLCAweDNkLAorCTB4MmUsIDB4MzUsIDB4NDYsIDB4MDksIDB4M2UsIDB4YzksIDB4NTYsIDB4YTcsIDB4MDYsIDB4NzAsIDB4NjUsIDB4MGQsCisJMHhmMCwgMHhjYSwgMHg5OCwgMHhiMywgMHhkZiwgMHg1ZSwgMHgzYywgMHhlMywgMHg2ZCwgMHg5ZiwgMHg2NSwgMHg3OCwKKwkweGM4LCAweDNlLCAweGEzLCAweDIwLCAweGY0LCAweDBmLCAweGUyLCAweDRjLCAweDRlLCAweDMwLCAweGU1LCAweDAwLAorCTB4MzEsIDB4NjUsIDB4NmMsIDB4OTAsIDB4NzgsIDB4YjMsIDB4YTUsIDB4ZTAsIDB4OWMsIDB4YjcsIDB4MzIsIDB4M2UsCisJMHhhMiwgMHhjZiwgMHgzZiwgMHg0OSwgMHhhYywgMHg3YSwgMHgxOCwgMHhjZSwgMHg3ZSwgMHg3YiwgMHg0MywgMHhmMSwKKwkweDBjLCAweDQyLCAweDJjLCAweGRmLCAweGE5LCAweGI2LCAweDE2LCAweGVjLCAweDMzLCAweDVhLCAweDhjLCAweGIxLAorCTB4NzYsIDB4YjUsIDB4NzksIDB4YjYsIDB4NDMsIDB4NmQsIDB4OTksIDB4ZWQsIDB4NTIsIDB4M2IsIDB4MGEsIDB4ZDIsCisJMHhiMywgMHgzZSwgMHhkMCwgMHg3YSwgMHhmZiwgMHg4OSwgMHhlZCwgMHg2YSwgMHhlYiwgMHg3NCwgMHg4ZiwgMHgyMiwKKwkweGE2LCAweDBkLCAweGY5LCAweDUyLCAweDE5LCAweGQ1LCAweDM1LCAweGViLCAweGNjLCAweGNmLCAweDNiLCAweGQ5LAorCTB4NzcsIDB4NmQsIDB4MzUsIDB4NGIsIDB4ZmQsIDB4YmMsIDB4ZmMsIDB4MWYsIDB4NTcsIDB4NTgsIDB4ZmUsIDB4NjcsCisJMHhhMiwgMHg3NywgMHhhMywgMHhiMiwgMHhhYywgMHg1YiwgMHg5MywgMHg3ZiwgMHgyZCwgMHhmNiwgMHhiMCwgMHg5ZSwKKwkweDRlLCAweGIyLCAweDM2LCAweDlhLCAweDU1LCAweGU4LCAweDYzLCAweGRmLCAweDMxLCAweDZjLCAweDJjLCAweDJiLAorCTB4ZWUsIDB4OTcsIDB4ODksIDB4NGMsIDB4NzIsIDB4NGUsIDB4NDIsIDB4ZmMsIDB4MTUsIDB4NTksIDB4ZjYsIDB4MjAsCisJMHhmOCwgMHg3YiwgMHhmMiwgMHhiZiwgMHhiNywgMHgyOCwgMHg1NywgMHg5NywgMHg5YywgMHgyMywgMHhmMCwgMHg1ZSwKKwkweDNmLCAweDQ3LCAweDc2LCAweDZjLCAweGVjLCAweGJhLCAweDVjLCAweDFlLCAweDVlLCAweDFiLCAweDI1LCAweDNlLAorCTB4ZGQsIDB4YWIsIDB4YjQsIDB4YzEsIDB4YTcsIDB4MWMsIDB4YjksIDB4MmUsIDB4NWUsIDB4NjYsIDB4MGMsIDB4MGYsCisJMHhkYiwgMHgzMSwgMHhlYywgMHhjOCwgMHhiNSwgMHhiMiwgMHgyOCwgMHhkNywgMHg4YSwgMHg3YywgMHhhNywgMHg3ZCwKKwkweDNlLCAweDhiLCAweDc0LCAweDVhLCAweGU3LCAweGM2LCAweGU0LCAweDFjLCAweDk5LCAweGNjLCAweDJlLCAweDQ1LAorCTB4MzYsIDB4OTEsIDB4ZTMsIDB4ODQsIDB4NTUsIDB4YTEsIDB4NzcsIDB4YTksIDB4NmQsIDB4ZjYsIDB4YjksIDB4MzIsCisJMHgzOSwgMHhkMywgMHgyNSwgMHhmYiwgMHhmYiwgMHgyNSwgMHhiOSwgMHhhNCwgMHg4ZSwgMHgyZiwgMHgwYSwgMHg3NiwKKwkweDRjLCAweGNhLCAweDM5LCAweDZiLCAweGNiLCAweGZhLCAweDk5LCAweDUxLCAweDExLCAweDE0LCAweDU5LCAweGNlLAorCTB4MWEsIDB4MjIsIDB4OGIsIDB4OWMsIDB4MTcsIDB4MjksIDB4YzksIDB4ZjMsIDB4YjUsIDB4YTIsIDB4M2MsIDB4NjIsCisJMHhhYiwgMHhlYiwgMHg3NiwgMHgyYSwgMHhmZCwgMHhmZiwgMHhkZiwgMHhkYiwgMHgzOSwgMHhlNywgMHgyYywgMHg0OSwKKwkweDQ5LCAweDllLCAweDYwLCAweDRhLCAweGY4LCAweGNmLCAweGI3LCAweDhlLCAweDhlLCAweDBmLCAweGUwLCAweDE1LAorCTB4ZGUsIDB4ZmYsIDB4NjUsIDB4YWUsIDB4MjQsIDB4OTcsIDB4MWIsIDB4MzMsIDB4ZDMsIDB4YTUsIDB4MzMsIDB4NzIsCisJMHg2YywgMHgyOSwgMHhjZCwgMHg5OCwgMHgzMSwgMHg0MiwgMHgzZiwgMHg3MiwgMHhlNCwgMHg5MywgMHgzMywgMHg3MiwKKwkweDhkLCAweGYzLCAweDk3LCAweGVkLCAweGI5LCAweDU3LCAweDNjLCAweGNkLCAweDdlLCAweDE5LCAweDY3LCAweDBiLAorCTB4YmYsIDB4NmQsIDB4YmYsIDB4YTYsIDB4N2MsIDB4MDUsIDB4N2IsIDB4NjQsIDB4YTEsIDB4M2QsIDB4NDcsIDB4ZGEsCisJMHg3MiwgMHg5NiwgMHg0NCwgMHhlMSwgMHhhOSwgMHg2OSwgMHg2MCwgMHhkYSwgMHhlNCwgMHhiMiwgMHhhOSwgMHgyMSwKKwkweDNjLCAweDZlLCAweDU4LCAweGQ2LCAweDkzLCAweGNkLCAweGJhLCAweDljLCAweDAxLCAweGJhLCAweDUwLCAweDZiLAorCTB4Y2YsIDB4ODUsIDB4NjAsIDB4NTQsIDB4ZTksIDB4YjIsIDB4NzcsIDB4MjcsIDB4ZTcsIDB4NDgsIDB4N2EsIDB4YTgsCisJMHgwMywgMHg5MSwgMHg1ZCwgMHg3YywgMHhhMCwgMHg2NCwgMHg3YiwgMHgzOSwgMHhkZiwgMHg5NiwgMHhhNSwgMHg3ZSwKKwkweDQ0LCAweDM3LCAweGE1LCAweDczLCAweDZlLCAweDMyLCAweDczLCAweGI5LCAweDUxLCAweDI3LCAweGI3LCAweGQ5LAorCTB4M2EsIDB4NzksIDB4ZGEsIDB4MTAsIDB4N2YsIDB4NjUsIDB4ZjYsIDB4YTEsIDB4YWYsIDB4Y2UsIDB4MTAsIDB4M2YsCisJMHg4YywgMHgxOCwgMHg1ZSwgMHgxYiwgMHhhYiwgMHgxZCwgMHgyNiwgMHgzZSwgMHgzOSwgMHhjMiwgMHhkOCwgMHg3OSwKKwkweGQ0LCAweGJjLCAweDg4LCAweDhiLCAweGY5LCAweDk3LCAweGYwLCAweGNhLCAweGI1LCAweGZmLCAweDg1LCAweDEzLAorCTB4N2YsIDB4ZjEsIDB4YjUsIDB4NmMsIDB4YjEsIDB4Y2YsIDB4MzIsIDB4ZmQsIDB4NzUsIDB4Y2IsIDB4YjIsIDB4YjgsCisJMHhlNCwgMHhhMSwgMHg5MywgMHg0ZCwgMHg3MiwgMHhiNiwgMHhhOSwgMHgzYywgMHhmNSwgMHhkZSwgMHgzYSwgMHhkOSwKKwkweGRmLCAweDJhLCAweDRiLCAweDBkLCAweDdlLCAweGY1LCAweDgyLCAweDJlLCAweGJhLCAweGY5LCAweDY0LCAweGY1LAorCTB4MTksIDB4NWQsIDB4ZTQsIDB4ZDIsIDB4OGQsIDB4NTEsIDB4ZmIsIDB4N2YsIDB4MzMsIDB4NDMsIDB4NmIsIDB4NzcsCisJMHhlYiwgMHgxMiwgMHgzYiwgMHhlZiwgMHgzNCwgMHhiNywgMHhkOSwgMHgzOSwgMHg2MSwgMHgzMCwgMHg3NSwgMHhhYiwKKwkweGFkLCAweDgzLCAweDgzLCAweGE5LCAweDY1LCAweDhlLCAweDJlLCAweDUyLCAweDA5LCAweGZiLCAweGZiLCAweGUxLAorCTB4OTQsIDB4YTMsIDB4OWIsIDB4NWMsIDB4YWEsIDB4ZGUsIDB4ZmUsIDB4MWUsIDB4NGQsIDB4MzksIDB4NjcsIDB4YTIsCisJMHhiMywgMHgyOSwgMHhkZCwgMHhmZSwgMHgxZSwgMHg0ZiwgMHhjNSwgMHhlYywgMHhlZiwgMHgyMywgMHhhOSwgMHg1YiwKKwkweGFlLCAweGYzLCAweGM1LCAweDlmLCAweGZmLCAweDA3LCAweGQ4LCAweGM0LCAweGQzLCAweGI0LCAweGI0LCAweDNhLAorCTB4MDAsIDB4MDAsIDB4MDAgfTsKIAogc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd0RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKIHN0YXRpYyBjb25zdCB1MzIgYm54Ml9UWFBfYjA2RndSb2RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKIAogc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHhwX2Z3XzA2ID0gewotCS8qIEZpcm13YXJlIHZlcnNpb246IDQuMC41ICovCisJLyogRmlybXdhcmUgdmVyc2lvbjogNC40LjIgKi8KIAkudmVyX21ham9yCQkJPSAweDQsCi0JLnZlcl9taW5vcgkJCT0gMHgwLAotCS52ZXJfZml4CQkJPSAweDUsCisJLnZlcl9taW5vcgkJCT0gMHg0LAorCS52ZXJfZml4CQkJPSAweDIsCiAKIAkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDA5OCwKIAogCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDAwMDAsCi0JLnRleHRfbGVuCQkJPSAweDNhZDgsCisJLnRleHRfbGVuCQkJPSAweDNhYjAsCiAJLnRleHRfaW5kZXgJCQk9IDB4MCwKIAkuZ3pfdGV4dAkJCT0gYm54Ml9UWFBfYjA2RndUZXh0LAogCS5nel90ZXh0X2xlbgkJCT0gc2l6ZW9mKGJueDJfVFhQX2IwNkZ3VGV4dCksCkBAIC00NTgyLDExICs0NTM1LDExIEBACiAJLmRhdGFfaW5kZXgJCQk9IDB4MCwKIAkuZGF0YQkJCQk9IGJueDJfVFhQX2IwNkZ3RGF0YSwKIAotCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDNiMDAsCisJLnNic3NfYWRkcgkJCT0gMHgwODAwM2FlMCwKIAkuc2Jzc19sZW4JCQk9IDB4NjgsCiAJLnNic3NfaW5kZXgJCQk9IDB4MCwKIAotCS5ic3NfYWRkcgkJCT0gMHgwODAwM2I2OCwKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDNiNDgsCiAJLmJzc19sZW4JCQk9IDB4MTRjLAogCS5ic3NfaW5kZXgJCQk9IDB4MCwKIApAQCAtNDYxMSwzICs0NTY0LDQgQEAKIAkuc3BhZF9iYXNlID0gQk5YMl9UWFBfU0NSQVRDSCwKIAkubWlwc192aWV3X2Jhc2UgPSAweDgwMDAwMDAsCiB9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMKaW5kZXggYThlYjNjNC4uZmNlNzQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MnhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYwpAQCAtNTksOCArNTksOCBAQAogI2luY2x1ZGUgImJueDJ4LmgiCiAjaW5jbHVkZSAiYm54MnhfaW5pdC5oIgogCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS40NS4yMSIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSIyMDA4LzA5LzAzIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuNDUuMjIiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiMjAwOC8wOS8wOSIKICNkZWZpbmUgQk5YMlhfQkNfVkVSCQkweDA0MDIwMAogCiAvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcgKi8KQEAgLTY0OSwxNSArNjQ5LDE2IEBACiAJCUJOWDJYX0VSUigiQlVHISBwcm9wZXIgdmFsIG5vdCByZWFkIGZyb20gSUdVIVxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2ludF9kaXNhYmxlX3N5bmMoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyB2b2lkIGJueDJ4X2ludF9kaXNhYmxlX3N5bmMoc3RydWN0IGJueDJ4ICpicCwgaW50IGRpc2FibGVfaHcpCiB7CiAJaW50IG1zaXggPSAoYnAtPmZsYWdzICYgVVNJTkdfTVNJWF9GTEFHKSA/IDEgOiAwOwogCWludCBpOwogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KIAlhdG9taWNfaW5jKCZicC0+aW50cl9zZW0pOwotCS8qIHByZXZlbnQgdGhlIEhXIGZyb20gc2VuZGluZyBpbnRlcnJ1cHRzICovCi0JYm54MnhfaW50X2Rpc2FibGUoYnApOworCWlmIChkaXNhYmxlX2h3KQorCQkvKiBwcmV2ZW50IHRoZSBIVyBmcm9tIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCQlibngyeF9pbnRfZGlzYWJsZShicCk7CiAKIAkvKiBtYWtlIHN1cmUgYWxsIElTUnMgYXJlIGRvbmUgKi8KIAlpZiAobXNpeCkgewpAQCAtNjA4Niw5ICs2MDg3LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X25ldGlmX3N0b3Aoc3RydWN0IGJueDJ4ICpicCkKK3N0YXRpYyB2b2lkIGJueDJ4X25ldGlmX3N0b3Aoc3RydWN0IGJueDJ4ICpicCwgaW50IGRpc2FibGVfaHcpCiB7Ci0JYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCk7CisJYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCwgZGlzYWJsZV9odyk7CiAJaWYgKG5ldGlmX3J1bm5pbmcoYnAtPmRldikpIHsKIAkJYm54MnhfbmFwaV9kaXNhYmxlKGJwKTsKIAkJbmV0aWZfdHhfZGlzYWJsZShicC0+ZGV2KTsKQEAgLTY0NzUsNyArNjQ3Niw3IEBACiAJZm9yX2VhY2hfcXVldWUoYnAsIGkpCiAJCWJueDJ4X2ZyZWVfcnhfc2dlX3JhbmdlKGJwLCBicC0+ZnAgKyBpLCBOVU1fUlhfU0dFKTsKIGxvYWRfaW50X2Rpc2FibGU6Ci0JYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCk7CisJYm54MnhfaW50X2Rpc2FibGVfc3luYyhicCwgMSk7CiAJLyogUmVsZWFzZSBJUlFzICovCiAJYm54MnhfZnJlZV9pcnEoYnApOwogbG9hZF9lcnJvcjoKQEAgLTY2NTAsNyArNjY1MSw3IEBACiAJYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7CiAJYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUoYnApOwogCi0JYm54MnhfbmV0aWZfc3RvcChicCk7CisJYm54MnhfbmV0aWZfc3RvcChicCwgMSk7CiAJaWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQogCQlibngyeF9uYXBpX2Rpc2FibGUoYnApOwogCWRlbF90aW1lcl9zeW5jKCZicC0+dGltZXIpOwpAQCAtODc5MSw3ICs4NzkyLDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCiAJCXJldHVybiBCTlgyWF9MT09QQkFDS19GQUlMRUQ7CiAKLQlibngyeF9uZXRpZl9zdG9wKGJwKTsKKwlibngyeF9uZXRpZl9zdG9wKGJwLCAxKTsKIAogCWlmIChibngyeF9ydW5fbG9vcGJhY2soYnAsIEJOWDJYX01BQ19MT09QQkFDSywgbGlua191cCkpIHsKIAkJRFAoTkVUSUZfTVNHX1BST0JFLCAiTUFDIGxvb3BiYWNrIGZhaWxlZFxuIik7CkBAIC0xMDM0Niw2ICsxMDM0Nyw3NCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBibngyeF9lZWhfbmljX3VubG9hZChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpOworCisJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfRVJST1I7CisKKwlicC0+cnhfbW9kZSA9IEJOWDJYX1JYX01PREVfTk9ORTsKKworCWJueDJ4X25ldGlmX3N0b3AoYnAsIDApOworCisJZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7CisJYnAtPnN0YXRzX3N0YXRlID0gU1RBVFNfU1RBVEVfRElTQUJMRUQ7CisJRFAoQk5YMlhfTVNHX1NUQVRTLCAic3RhdHNfc3RhdGUgLSBESVNBQkxFRFxuIik7CisKKwkvKiBSZWxlYXNlIElSUXMgKi8KKwlibngyeF9mcmVlX2lycShicCk7CisKKwlpZiAoQ0hJUF9JU19FMShicCkpIHsKKwkJc3RydWN0IG1hY19jb25maWd1cmF0aW9uX2NtZCAqY29uZmlnID0KKwkJCQkJCWJueDJ4X3NwKGJwLCBtY2FzdF9jb25maWcpOworCisJCWZvciAoaSA9IDA7IGkgPCBjb25maWctPmhkci5sZW5ndGhfNmI7IGkrKykKKwkJCUNBTV9JTlZBTElEQVRFKGNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldKTsKKwl9CisKKwkvKiBGcmVlIFNLQnMsIFNHRXMsIFRQQSBwb29sIGFuZCBkcml2ZXIgaW50ZXJuYWxzICovCisJYm54MnhfZnJlZV9za2JzKGJwKTsKKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJYm54MnhfZnJlZV9yeF9zZ2VfcmFuZ2UoYnAsIGJwLT5mcCArIGksIE5VTV9SWF9TR0UpOworCWJueDJ4X2ZyZWVfbWVtKGJwKTsKKworCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NFRDsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2VlaF9yZWNvdmVyKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbDsKKworCW11dGV4X2luaXQoJmJwLT5wb3J0LnBoeV9tdXRleCk7CisKKwlicC0+Y29tbW9uLnNobWVtX2Jhc2UgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUik7CisJYnAtPmxpbmtfcGFyYW1zLnNobWVtX2Jhc2UgPSBicC0+Y29tbW9uLnNobWVtX2Jhc2U7CisJQk5YMlhfREVWX0lORk8oInNobWVtIG9mZnNldCBpcyAweCV4XG4iLCBicC0+Y29tbW9uLnNobWVtX2Jhc2UpOworCisJaWYgKCFicC0+Y29tbW9uLnNobWVtX2Jhc2UgfHwKKwkgICAgKGJwLT5jb21tb24uc2htZW1fYmFzZSA8IDB4QTAwMDApIHx8CisJICAgIChicC0+Y29tbW9uLnNobWVtX2Jhc2UgPj0gMHhDMDAwMCkpIHsKKwkJQk5YMlhfREVWX0lORk8oIk1DUCBub3QgYWN0aXZlXG4iKTsKKwkJYnAtPmZsYWdzIHw9IE5PX01DUF9GTEFHOworCQlyZXR1cm47CisJfQorCisJdmFsID0gU0hNRU1fUkQoYnAsIHZhbGlkaXR5X21hcFtCUF9QT1JUKGJwKV0pOworCWlmICgodmFsICYgKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKKwkJIT0gKFNIUl9NRU1fVkFMSURJVFlfREVWX0lORk8gfCBTSFJfTUVNX1ZBTElESVRZX01CKSkKKwkJQk5YMlhfRVJSKCJCQUQgTUNQIHZhbGlkaXR5IHNpZ25hdHVyZVxuIik7CisKKwlpZiAoIUJQX05PTUNQKGJwKSkgeworCQlicC0+Zndfc2VxID0gKFNITUVNX1JEKGJwLCBmdW5jX21iW0JQX0ZVTkMoYnApXS5kcnZfbWJfaGVhZGVyKQorCQkJICAgICAgJiBEUlZfTVNHX1NFUV9OVU1CRVJfTUFTSyk7CisJCUJOWDJYX0RFVl9JTkZPKCJmd19zZXEgMHglMDh4XG4iLCBicC0+Zndfc2VxKTsKKwl9Cit9CisKIC8qKgogICogYm54MnhfaW9fZXJyb3JfZGV0ZWN0ZWQgLSBjYWxsZWQgd2hlbiBQQ0kgZXJyb3IgaXMgZGV0ZWN0ZWQKICAqIEBwZGV2OiBQb2ludGVyIHRvIFBDSSBkZXZpY2UKQEAgLTEwMzY1LDcgKzEwNDM0LDcgQEAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQotCQlibngyeF9uaWNfdW5sb2FkKGJwLCBVTkxPQURfQ0xPU0UpOworCQlibngyeF9lZWhfbmljX3VubG9hZChicCk7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAKQEAgLTEwNDIwLDggKzEwNDg5LDEwIEBACiAKIAlydG5sX2xvY2soKTsKIAorCWJueDJ4X2VlaF9yZWNvdmVyKGJwKTsKKwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCWJueDJ4X25pY19sb2FkKGJwLCBMT0FEX09QRU4pOworCQlibngyeF9uaWNfbG9hZChicCwgTE9BRF9OT1JNQUwpOwogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggYjIxMTQ4Ni4uYWRlNWYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bmV0L2lweC5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlICJib25kaW5nLmgiCiAjaW5jbHVkZSAiYm9uZF9hbGIuaCIKQEAgLTgxLDYgKzgyLDcgQEAKICNkZWZpbmUgUkxCX1BST01JU0NfVElNRU9VVAkxMCpBTEJfVElNRVJfVElDS1NfUEVSX1NFQwogCiBzdGF0aWMgY29uc3QgdTggbWFjX2JjYXN0W0VUSF9BTEVOXSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CitzdGF0aWMgY29uc3QgdTggbWFjX3Y2X2FsbG1jYXN0W0VUSF9BTEVOXSA9IHsweDMzLDB4MzMsMHgwMCwweDAwLDB4MDAsMHgwMX07CiBzdGF0aWMgY29uc3QgaW50IGFsYl9kZWx0YV9pbl90aWNrcyA9IEhaIC8gQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUM7CiAKICNwcmFnbWEgcGFjaygxKQpAQCAtNzEwLDcgKzcxMiw3IEBACiAJc3RydWN0IGFycF9wa3QgKmFycCA9IGFycF9wa3Qoc2tiKTsKIAlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlID0gTlVMTDsKIAotCWlmIChhcnAtPm9wX2NvZGUgPT0gX19jb25zdGFudF9odG9ucyhBUlBPUF9SRVBMWSkpIHsKKwlpZiAoYXJwLT5vcF9jb2RlID09IGh0b25zKEFSUE9QX1JFUExZKSkgewogCQkvKiB0aGUgYXJwIG11c3QgYmUgc2VudCBvbiB0aGUgc2VsZWN0ZWQKIAkJKiByeCBjaGFubmVsCiAJCSovCkBAIC03MTksNyArNzIxLDcgQEAKIAkJCW1lbWNweShhcnAtPm1hY19zcmMsdHhfc2xhdmUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAkJfQogCQlkcHJpbnRrKCJTZXJ2ZXIgc2VudCBBUlAgUmVwbHkgcGFja2V0XG4iKTsKLQl9IGVsc2UgaWYgKGFycC0+b3BfY29kZSA9PSBfX2NvbnN0YW50X2h0b25zKEFSUE9QX1JFUVVFU1QpKSB7CisJfSBlbHNlIGlmIChhcnAtPm9wX2NvZGUgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpIHsKIAkJLyogQ3JlYXRlIGFuIGVudHJ5IGluIHRoZSByeF9oYXNodGJsIGZvciB0aGlzIGNsaWVudCBhcyBhCiAJCSAqIHBsYWNlIGhvbGRlci4KIAkJICogV2hlbiB0aGUgYXJwIHJlcGx5IGlzIHJlY2VpdmVkIHRoZSBlbnRyeSB3aWxsIGJlIHVwZGF0ZWQKQEAgLTEyOTAsNiArMTI5Miw3IEBACiAJdTMyIGhhc2hfaW5kZXggPSAwOwogCWNvbnN0IHU4ICpoYXNoX3N0YXJ0ID0gTlVMTDsKIAlpbnQgcmVzID0gMTsKKwlzdHJ1Y3QgaXB2NmhkciAqaXA2aGRyOwogCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlldGhfZGF0YSA9IGV0aF9oZHIoc2tiKTsKQEAgLTEzMTksMTEgKzEzMjIsMzIgQEAKIAl9CiAJCWJyZWFrOwogCWNhc2UgRVRIX1BfSVBWNjoKKwkJLyogSVB2NiBkb2Vzbid0IHJlYWxseSB1c2UgYnJvYWRjYXN0IG1hYyBhZGRyZXNzLCBidXQgbGVhdmUKKwkJICogdGhhdCBoZXJlIGp1c3QgaW4gY2FzZS4KKwkJICovCiAJCWlmIChtZW1jbXAoZXRoX2RhdGEtPmhfZGVzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikgPT0gMCkgewogCQkJZG9fdHhfYmFsYW5jZSA9IDA7CiAJCQlicmVhazsKIAkJfQogCisJCS8qIElQdjYgdXNlcyBhbGwtbm9kZXMgbXVsdGljYXN0IGFzIGFuIGVxdWl2YWxlbnQgdG8KKwkJICogYnJvYWRjYXN0cyBpbiBJUHY0LgorCQkgKi8KKwkJaWYgKG1lbWNtcChldGhfZGF0YS0+aF9kZXN0LCBtYWNfdjZfYWxsbWNhc3QsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlkb190eF9iYWxhbmNlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQWRkaXRpYW5hbGx5LCBEQUQgcHJvYmVzIHNob3VsZCBub3QgYmUgdHgtYmFsYW5jZWQgYXMgdGhhdAorCQkgKiB3aWxsIGxlYWQgdG8gZmFsc2UgcG9zaXRpdmVzIGZvciBkdXBsaWNhdGUgYWRkcmVzc2VzIGFuZAorCQkgKiBwcmV2ZW50IGFkZHJlc3MgY29uZmlndXJhdGlvbiBmcm9tIHdvcmtpbmcuCisJCSAqLworCQlpcDZoZHIgPSBpcHY2X2hkcihza2IpOworCQlpZiAoaXB2Nl9hZGRyX2FueSgmaXA2aGRyLT5zYWRkcikpIHsKKwkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJYnJlYWs7CisJCX0KKwogCQloYXNoX3N0YXJ0ID0gKGNoYXIgKikmKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJaGFzaF9zaXplID0gc2l6ZW9mKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCBjNzkyMTM4Li44ZTJiZTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTM3MDIsNyArMzcwMiw3IEBACiAJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewogCQlyZXR1cm4gKChudG9obChpcGgtPnNhZGRyIF4gaXBoLT5kYWRkcikgJiAweGZmZmYpIF4KIAkJCShkYXRhLT5oX2Rlc3RbNV0gXiBib25kX2Rldi0+ZGV2X2FkZHJbNV0pKSAlIGNvdW50OwogCX0KQEAgLTM3MjMsOCArMzcyMyw4IEBACiAJX19iZTE2ICpsYXllcjRoZHIgPSAoX19iZTE2ICopKCh1MzIgKilpcGggKyBpcGgtPmlobCk7CiAJaW50IGxheWVyNF94b3IgPSAwOwogCi0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpIHsKLQkJaWYgKCEoaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgJiYKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJaWYgKCEoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpICYmCiAJCSAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7CiAJCQlsYXllcjRfeG9yID0gbnRvaHMoKCpsYXllcjRoZHIgXiAqKGxheWVyNGhkciArIDEpKSk7CkBAIC00NDkzLDYgKzQ0OTMsMTIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBib25kX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBib25kX2V0aHRvb2xfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5nZXRfdWZvCQk9IGV0aHRvb2xfb3BfZ2V0X3VmbywKKwkuZ2V0X2ZsYWdzCQk9IGV0aHRvb2xfb3BfZ2V0X2ZsYWdzLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKaW5kZXggZmI3MzBlYy4uZmZiNjY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKQEAgLTMyLDcgKzMyLDcgQEAKICNpZmRlZiBCT05ESU5HX0RFQlVHCiAjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBcCiAJcHJpbnRrKEtFUk5fREVCVUcgICAgIFwKLQkgICAgICAgRFJWX05BTUUgIjogJXMoKSAlZDogIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzICkKKwkgICAgICAgRFJWX05BTUUgIjogJXMoKSAlZDogIiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXyAsICMjIGFyZ3MgKQogI2Vsc2UKICNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCiAjZW5kaWYgLyogQk9ORElOR19ERUJVRyAqLwpAQCAtMzMzLDUgKzMzMywxMyBAQAogdm9pZCBib25kX3JlZ2lzdGVyX2FycChzdHJ1Y3QgYm9uZGluZyAqKTsKIHZvaWQgYm9uZF91bnJlZ2lzdGVyX2FycChzdHJ1Y3QgYm9uZGluZyAqKTsKIAorLyogZXhwb3J0ZWQgZnJvbSBib25kX21haW4uYyAqLworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYm9uZF9kZXZfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgYm9uZF9wYXJtX3RibCBib25kX2xhY3BfdGJsW107CitleHRlcm4gc3RydWN0IGJvbmRfcGFybV90YmwgYm9uZF9tb2RlX3RibFtdOworZXh0ZXJuIHN0cnVjdCBib25kX3Bhcm1fdGJsIHhtaXRfaGFzaHR5cGVfdGJsW107CitleHRlcm4gc3RydWN0IGJvbmRfcGFybV90YmwgYXJwX3ZhbGlkYXRlX3RibFtdOworZXh0ZXJuIHN0cnVjdCBib25kX3Bhcm1fdGJsIGZhaWxfb3Zlcl9tYWNfdGJsW107CisKICNlbmRpZiAvKiBfTElOVVhfQk9ORElOR19IICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwppbmRleCBmMTkzNmQ1Li44NjkwOWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMKKysrIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCkBAIC03NCw2ICs3NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtOTEsNiArOTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKQEAgLTE5Nyw2ICsxOTksNyBAQAogTU9EVUxFX0FVVEhPUigiQWRyaWFuIFN1biAoYXN1bkBkYXJrc3VucmlzaW5nLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3VuIENhc3NpbmkoKykgZXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfRklSTVdBUkUoInN1bi9jYXNzaW5pLmJpbiIpOwogbW9kdWxlX3BhcmFtKGNhc3NpbmlfZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNhc3NpbmlfZGVidWcsICJDYXNzaW5pIGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKIG1vZHVsZV9wYXJhbShsaW5rX21vZGUsIGludCwgMCk7CkBAIC04MTIsOSArODE1LDQ0IEBACiAJcmV0dXJuIChsaW1pdCA8PSAwKTsKIH0KIAorc3RhdGljIGludCBjYXNfc2F0dXJuX2Zpcm13YXJlX2luaXQoc3RydWN0IGNhcyAqY3ApCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyIGZ3X25hbWVbXSA9ICJzdW4vY2Fzc2luaS5iaW4iOworCWludCBlcnI7CisKKwlpZiAoUEhZX05TX0RQODMwNjUgIT0gY3AtPnBoeV9pZCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgJmNwLT5wZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYXNzaW5pOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCSAgICAgICBmd19uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGZ3LT5zaXplIDwgMikgeworCQlwcmludGsoS0VSTl9FUlIgImNhc3Npbmk6IGJvZ3VzIGxlbmd0aCAlenUgaW4gXCIlc1wiXG4iLAorCQkgICAgICAgZnctPnNpemUsIGZ3X25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJY3AtPmZ3X2xvYWRfYWRkcj0gZnctPmRhdGFbMV0gPDwgOCB8IGZ3LT5kYXRhWzBdOworCWNwLT5md19zaXplID0gZnctPnNpemUgLSAyOworCWNwLT5md19kYXRhID0gdm1hbGxvYyhjcC0+Zndfc2l6ZSk7CisJaWYgKCFjcC0+ZndfZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgImNhc3Npbmk6IFwiJXNcIiBGYWlsZWQgJWRcbiIsIGZ3X25hbWUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoY3AtPmZ3X2RhdGEsICZmdy0+ZGF0YVsyXSwgY3AtPmZ3X3NpemUpOworb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIGNhc19zYXR1cm5fZmlybXdhcmVfbG9hZChzdHJ1Y3QgY2FzICpjcCkKIHsKLQljYXNfc2F0dXJuX3BhdGNoX3QgKnBhdGNoID0gY2FzX3NhdHVybl9wYXRjaDsKKwlpbnQgaTsKIAogCWNhc19waHlfcG93ZXJkb3duKGNwKTsKIApAQCAtODMzLDExICs4NzEsOSBAQAogCiAJLyogZG93bmxvYWQgbmV3IGZpcm13YXJlICovCiAJY2FzX3BoeV93cml0ZShjcCwgRFA4MzA2NV9NSUlfTUVNLCAweDEpOwotCWNhc19waHlfd3JpdGUoY3AsIERQODMwNjVfTUlJX1JFR0UsIHBhdGNoLT5hZGRyKTsKLQl3aGlsZSAocGF0Y2gtPmFkZHIpIHsKLQkJY2FzX3BoeV93cml0ZShjcCwgRFA4MzA2NV9NSUlfUkVHRCwgcGF0Y2gtPnZhbCk7Ci0JCXBhdGNoKys7Ci0JfQorCWNhc19waHlfd3JpdGUoY3AsIERQODMwNjVfTUlJX1JFR0UsIGNwLT5md19sb2FkX2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBjcC0+Zndfc2l6ZTsgaSsrKQorCQljYXNfcGh5X3dyaXRlKGNwLCBEUDgzMDY1X01JSV9SRUdELCBjcC0+ZndfZGF0YVtpXSk7CiAKIAkvKiBlbmFibGUgZmlybXdhcmUgKi8KIAljYXNfcGh5X3dyaXRlKGNwLCBEUDgzMDY1X01JSV9SRUdFLCAweDhmZjgpOwpAQCAtMjE4Miw3ICsyMjE4LDcgQEAKIAkgKiBkbyBhbnkgYWRkaXRpb25hbCBsb2NraW5nIGhlcmUuIHN0aWNrIHRoZSBidWZmZXIKIAkgKiBhdCB0aGUgZW5kLgogCSAqLwotCV9fc2tiX2luc2VydChza2IsIGZsb3ctPnByZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKSBmbG93LCBmbG93KTsKKwlfX3NrYl9xdWV1ZV90YWlsKGZsb3csIHNrYik7CiAJaWYgKHdvcmRzWzBdICYgUlhfQ09NUDFfUkVMRUFTRV9GTE9XKSB7CiAJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShmbG93KSkpIHsKIAkJCWNhc19za2JfcmVsZWFzZShza2IpOwpAQCAtNTEwOCw2ICs1MTQ0LDkgQEAKIAljYXNfcmVzZXQoY3AsIDApOwogCWlmIChjYXNfY2hlY2tfaW52YXJpYW50cyhjcCkpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOworCWlmIChjcC0+Y2FzX2ZsYWdzICYgQ0FTX0ZMQUdfU0FUVVJOKQorCQlpZiAoY2FzX3NhdHVybl9maXJtd2FyZV9pbml0KGNwKSkKKwkJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCiAJY3AtPmluaXRfYmxvY2sgPSAoc3RydWN0IGNhc19pbml0X2Jsb2NrICopCiAJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgY2FzX2luaXRfYmxvY2spLApAQCAtNTIxNyw2ICs1MjU2LDkgQEAKIAljcCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAorCWlmIChjcC0+ZndfZGF0YSkKKwkJdmZyZWUoY3AtPmZ3X2RhdGEpOworCiAJbXV0ZXhfbG9jaygmY3AtPnBtX211dGV4KTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWlmIChjcC0+aHdfcnVubmluZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuaCBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuaAppbmRleCA1NTJhZjg5Li5mZDE3YTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYXNzaW5pLmgKKysrIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5oCkBAIC0yNTE0LDE1MjMgKzI1MTQsNiBAQAogI2RlZmluZSBDQVNfSFBfRklSTVdBUkUgICAgICAgICAgICAgICBjYXNfcHJvZ19udWxsCiAjZW5kaWYKIAotLyogZmlybXdhcmUgcGF0Y2ggZm9yIE5TX0RQODMwNjUgKi8KLXR5cGVkZWYgc3RydWN0IGNhc19zYXR1cm5fcGF0Y2ggewotCXUxNiBhZGRyOwotCXUxNiB2YWw7Ci19IGNhc19zYXR1cm5fcGF0Y2hfdDsKLQotI2lmIDEKLWNhc19zYXR1cm5fcGF0Y2hfdCBjYXNfc2F0dXJuX3BhdGNoW10gPSB7Ci17MHg4MjAwLCAgICAweDAwN2V9LCB7MHg4MjAxLCAgICAweDAwODJ9LCB7MHg4MjAyLCAgICAweDAwMDl9LAotezB4ODIwMywgICAgMHgwMDAwfSwgezB4ODIwNCwgICAgMHgwMDAwfSwgezB4ODIwNSwgICAgMHgwMDAwfSwKLXsweDgyMDYsICAgIDB4MDAwMH0sIHsweDgyMDcsICAgIDB4MDAwMH0sIHsweDgyMDgsICAgIDB4MDAwMH0sCi17MHg4MjA5LCAgICAweDAwOGV9LCB7MHg4MjBhLCAgICAweDAwOGV9LCB7MHg4MjBiLCAgICAweDAwZmZ9LAotezB4ODIwYywgICAgMHgwMGNlfSwgezB4ODIwZCwgICAgMHgwMDgyfSwgezB4ODIwZSwgICAgMHgwMDI1fSwKLXsweDgyMGYsICAgIDB4MDBmZn0sIHsweDgyMTAsICAgIDB4MDAwMX0sIHsweDgyMTEsICAgIDB4MDAwZn0sCi17MHg4MjEyLCAgICAweDAwY2V9LCB7MHg4MjEzLCAgICAweDAwODR9LCB7MHg4MjE0LCAgICAweDAwMjZ9LAotezB4ODIxNSwgICAgMHgwMGZmfSwgezB4ODIxNiwgICAgMHgwMDAxfSwgezB4ODIxNywgICAgMHgwMDExfSwKLXsweDgyMTgsICAgIDB4MDBjZX0sIHsweDgyMTksICAgIDB4MDA4NX0sIHsweDgyMWEsICAgIDB4MDAzZH0sCi17MHg4MjFiLCAgICAweDAwZGZ9LCB7MHg4MjFjLCAgICAweDAwZTV9LCB7MHg4MjFkLCAgICAweDAwODZ9LAotezB4ODIxZSwgICAgMHgwMDM5fSwgezB4ODIxZiwgICAgMHgwMGI3fSwgezB4ODIyMCwgICAgMHgwMDhmfSwKLXsweDgyMjEsICAgIDB4MDBmOH0sIHsweDgyMjIsICAgIDB4MDA3ZX0sIHsweDgyMjMsICAgIDB4MDBjM30sCi17MHg4MjI0LCAgICAweDAwYzJ9LCB7MHg4MjI1LCAgICAweDAwOTZ9LCB7MHg4MjI2LCAgICAweDAwNDd9LAotezB4ODIyNywgICAgMHgwMDg0fSwgezB4ODIyOCwgICAgMHgwMGYzfSwgezB4ODIyOSwgICAgMHgwMDhhfSwKLXsweDgyMmEsICAgIDB4MDAwMH0sIHsweDgyMmIsICAgIDB4MDA5N30sIHsweDgyMmMsICAgIDB4MDA0N30sCi17MHg4MjJkLCAgICAweDAwY2V9LCB7MHg4MjJlLCAgICAweDAwODJ9LCB7MHg4MjJmLCAgICAweDAwMzN9LAotezB4ODIzMCwgICAgMHgwMGZmfSwgezB4ODIzMSwgICAgMHgwMDAxfSwgezB4ODIzMiwgICAgMHgwMDBmfSwKLXsweDgyMzMsICAgIDB4MDA5Nn0sIHsweDgyMzQsICAgIDB4MDA0Nn0sIHsweDgyMzUsICAgIDB4MDA4NH0sCi17MHg4MjM2LCAgICAweDAwMGN9LCB7MHg4MjM3LCAgICAweDAwODF9LCB7MHg4MjM4LCAgICAweDAwMDR9LAotezB4ODIzOSwgICAgMHgwMDI3fSwgezB4ODIzYSwgICAgMHgwMDBifSwgezB4ODIzYiwgICAgMHgwMDk2fSwKLXsweDgyM2MsICAgIDB4MDA0Nn0sIHsweDgyM2QsICAgIDB4MDA4NH0sIHsweDgyM2UsICAgIDB4MDAwY30sCi17MHg4MjNmLCAgICAweDAwODF9LCB7MHg4MjQwLCAgICAweDAwMDh9LCB7MHg4MjQxLCAgICAweDAwMjd9LAotezB4ODI0MiwgICAgMHgwMDU3fSwgezB4ODI0MywgICAgMHgwMDdlfSwgezB4ODI0NCwgICAgMHgwMDg0fSwKLXsweDgyNDUsICAgIDB4MDAyNX0sIHsweDgyNDYsICAgIDB4MDA5Nn0sIHsweDgyNDcsICAgIDB4MDA0N30sCi17MHg4MjQ4LCAgICAweDAwODR9LCB7MHg4MjQ5LCAgICAweDAwZjN9LCB7MHg4MjRhLCAgICAweDAwOGF9LAotezB4ODI0YiwgICAgMHgwMDA0fSwgezB4ODI0YywgICAgMHgwMDk3fSwgezB4ODI0ZCwgICAgMHgwMDQ3fSwKLXsweDgyNGUsICAgIDB4MDBjZX0sIHsweDgyNGYsICAgIDB4MDA4Mn0sIHsweDgyNTAsICAgIDB4MDA1NH0sCi17MHg4MjUxLCAgICAweDAwZmZ9LCB7MHg4MjUyLCAgICAweDAwMDF9LCB7MHg4MjUzLCAgICAweDAwMGZ9LAotezB4ODI1NCwgICAgMHgwMDk2fSwgezB4ODI1NSwgICAgMHgwMDQ2fSwgezB4ODI1NiwgICAgMHgwMDg0fSwKLXsweDgyNTcsICAgIDB4MDAwY30sIHsweDgyNTgsICAgIDB4MDA4MX0sIHsweDgyNTksICAgIDB4MDAwNH0sCi17MHg4MjVhLCAgICAweDAwMjZ9LCB7MHg4MjViLCAgICAweDAwMzh9LCB7MHg4MjVjLCAgICAweDAwYjZ9LAotezB4ODI1ZCwgICAgMHgwMDEyfSwgezB4ODI1ZSwgICAgMHgwMDIwfSwgezB4ODI1ZiwgICAgMHgwMDg0fSwKLXsweDgyNjAsICAgIDB4MDAyMH0sIHsweDgyNjEsICAgIDB4MDAyNn0sIHsweDgyNjIsICAgIDB4MDAwM30sCi17MHg4MjYzLCAgICAweDAwN2V9LCB7MHg4MjY0LCAgICAweDAwODR9LCB7MHg4MjY1LCAgICAweDAwMjV9LAotezB4ODI2NiwgICAgMHgwMDk2fSwgezB4ODI2NywgICAgMHgwMDdifSwgezB4ODI2OCwgICAgMHgwMGQ2fSwKLXsweDgyNjksICAgIDB4MDA3Y30sIHsweDgyNmEsICAgIDB4MDBmZX0sIHsweDgyNmIsICAgIDB4MDA4Zn0sCi17MHg4MjZjLCAgICAweDAwNTZ9LCB7MHg4MjZkLCAgICAweDAwYmR9LCB7MHg4MjZlLCAgICAweDAwZjd9LAotezB4ODI2ZiwgICAgMHgwMGI2fSwgezB4ODI3MCwgICAgMHgwMGZlfSwgezB4ODI3MSwgICAgMHgwMDhmfSwKLXsweDgyNzIsICAgIDB4MDA0ZX0sIHsweDgyNzMsICAgIDB4MDBiZH0sIHsweDgyNzQsICAgIDB4MDBlY30sCi17MHg4Mjc1LCAgICAweDAwOGV9LCB7MHg4Mjc2LCAgICAweDAwYmR9LCB7MHg4Mjc3LCAgICAweDAwZmF9LAotezB4ODI3OCwgICAgMHgwMGY3fSwgezB4ODI3OSwgICAgMHgwMGJkfSwgezB4ODI3YSwgICAgMHgwMGY3fSwKLXsweDgyN2IsICAgIDB4MDAyOH0sIHsweDgyN2MsICAgIDB4MDBjZX0sIHsweDgyN2QsICAgIDB4MDA4Mn0sCi17MHg4MjdlLCAgICAweDAwODJ9LCB7MHg4MjdmLCAgICAweDAwZmZ9LCB7MHg4MjgwLCAgICAweDAwMDF9LAotezB4ODI4MSwgICAgMHgwMDBmfSwgezB4ODI4MiwgICAgMHgwMDk2fSwgezB4ODI4MywgICAgMHgwMDQ2fSwKLXsweDgyODQsICAgIDB4MDA4NH0sIHsweDgyODUsICAgIDB4MDAwY30sIHsweDgyODYsICAgIDB4MDA4MX0sCi17MHg4Mjg3LCAgICAweDAwMDR9LCB7MHg4Mjg4LCAgICAweDAwMjZ9LCB7MHg4Mjg5LCAgICAweDAwMGF9LAotezB4ODI4YSwgICAgMHgwMGI2fSwgezB4ODI4YiwgICAgMHgwMDEyfSwgezB4ODI4YywgICAgMHgwMDIwfSwKLXsweDgyOGQsICAgIDB4MDA4NH0sIHsweDgyOGUsICAgIDB4MDAyMH0sIHsweDgyOGYsICAgIDB4MDAyN30sCi17MHg4MjkwLCAgICAweDAwYjV9LCB7MHg4MjkxLCAgICAweDAwN2V9LCB7MHg4MjkyLCAgICAweDAwODR9LAotezB4ODI5MywgICAgMHgwMDI1fSwgezB4ODI5NCwgICAgMHgwMGJkfSwgezB4ODI5NSwgICAgMHgwMGY3fSwKLXsweDgyOTYsICAgIDB4MDAxZn0sIHsweDgyOTcsICAgIDB4MDA3ZX0sIHsweDgyOTgsICAgIDB4MDA4NH0sCi17MHg4Mjk5LCAgICAweDAwMWZ9LCB7MHg4MjlhLCAgICAweDAwOTZ9LCB7MHg4MjliLCAgICAweDAwNDd9LAotezB4ODI5YywgICAgMHgwMDg0fSwgezB4ODI5ZCwgICAgMHgwMGYzfSwgezB4ODI5ZSwgICAgMHgwMDhhfSwKLXsweDgyOWYsICAgIDB4MDAwOH0sIHsweDgyYTAsICAgIDB4MDA5N30sIHsweDgyYTEsICAgIDB4MDA0N30sCi17MHg4MmEyLCAgICAweDAwZGV9LCB7MHg4MmEzLCAgICAweDAwZTF9LCB7MHg4MmE0LCAgICAweDAwYWR9LAotezB4ODJhNSwgICAgMHgwMDAwfSwgezB4ODJhNiwgICAgMHgwMGNlfSwgezB4ODJhNywgICAgMHgwMDgyfSwKLXsweDgyYTgsICAgIDB4MDBhZn0sIHsweDgyYTksICAgIDB4MDBmZn0sIHsweDgyYWEsICAgIDB4MDAwMX0sCi17MHg4MmFiLCAgICAweDAwMGZ9LCB7MHg4MmFjLCAgICAweDAwN2V9LCB7MHg4MmFkLCAgICAweDAwODR9LAotezB4ODJhZSwgICAgMHgwMDI1fSwgezB4ODJhZiwgICAgMHgwMDk2fSwgezB4ODJiMCwgICAgMHgwMDQxfSwKLXsweDgyYjEsICAgIDB4MDA4NX0sIHsweDgyYjIsICAgIDB4MDAxMH0sIHsweDgyYjMsICAgIDB4MDAyNn0sCi17MHg4MmI0LCAgICAweDAwMDZ9LCB7MHg4MmI1LCAgICAweDAwOTZ9LCB7MHg4MmI2LCAgICAweDAwMjN9LAotezB4ODJiNywgICAgMHgwMDg1fSwgezB4ODJiOCwgICAgMHgwMDQwfSwgezB4ODJiOSwgICAgMHgwMDI3fSwKLXsweDgyYmEsICAgIDB4MDAwNn0sIHsweDgyYmIsICAgIDB4MDBiZH0sIHsweDgyYmMsICAgIDB4MDBlZH0sCi17MHg4MmJkLCAgICAweDAwMDB9LCB7MHg4MmJlLCAgICAweDAwN2V9LCB7MHg4MmJmLCAgICAweDAwODN9LAotezB4ODJjMCwgICAgMHgwMGEyfSwgezB4ODJjMSwgICAgMHgwMGRlfSwgezB4ODJjMiwgICAgMHgwMDQyfSwKLXsweDgyYzMsICAgIDB4MDBiZH0sIHsweDgyYzQsICAgIDB4MDBlYn0sIHsweDgyYzUsICAgIDB4MDA4ZX0sCi17MHg4MmM2LCAgICAweDAwOTZ9LCB7MHg4MmM3LCAgICAweDAwMjR9LCB7MHg4MmM4LCAgICAweDAwODR9LAotezB4ODJjOSwgICAgMHgwMDA4fSwgezB4ODJjYSwgICAgMHgwMDI3fSwgezB4ODJjYiwgICAgMHgwMDAzfSwKLXsweDgyY2MsICAgIDB4MDA3ZX0sIHsweDgyY2QsICAgIDB4MDA4M30sIHsweDgyY2UsICAgIDB4MDBkZn0sCi17MHg4MmNmLCAgICAweDAwOTZ9LCB7MHg4MmQwLCAgICAweDAwN2J9LCB7MHg4MmQxLCAgICAweDAwZDZ9LAotezB4ODJkMiwgICAgMHgwMDdjfSwgezB4ODJkMywgICAgMHgwMGZlfSwgezB4ODJkNCwgICAgMHgwMDhmfSwKLXsweDgyZDUsICAgIDB4MDA1Nn0sIHsweDgyZDYsICAgIDB4MDBiZH0sIHsweDgyZDcsICAgIDB4MDBmN30sCi17MHg4MmQ4LCAgICAweDAwYjZ9LCB7MHg4MmQ5LCAgICAweDAwZmV9LCB7MHg4MmRhLCAgICAweDAwOGZ9LAotezB4ODJkYiwgICAgMHgwMDUwfSwgezB4ODJkYywgICAgMHgwMGJkfSwgezB4ODJkZCwgICAgMHgwMGVjfSwKLXsweDgyZGUsICAgIDB4MDA4ZX0sIHsweDgyZGYsICAgIDB4MDBiZH0sIHsweDgyZTAsICAgIDB4MDBmYX0sCi17MHg4MmUxLCAgICAweDAwZjd9LCB7MHg4MmUyLCAgICAweDAwODZ9LCB7MHg4MmUzLCAgICAweDAwMTF9LAotezB4ODJlNCwgICAgMHgwMGM2fSwgezB4ODJlNSwgICAgMHgwMDQ5fSwgezB4ODJlNiwgICAgMHgwMGJkfSwKLXsweDgyZTcsICAgIDB4MDBlNH0sIHsweDgyZTgsICAgIDB4MDAxMn0sIHsweDgyZTksICAgIDB4MDBjZX0sCi17MHg4MmVhLCAgICAweDAwODJ9LCB7MHg4MmViLCAgICAweDAwZWZ9LCB7MHg4MmVjLCAgICAweDAwZmZ9LAotezB4ODJlZCwgICAgMHgwMDAxfSwgezB4ODJlZSwgICAgMHgwMDBmfSwgezB4ODJlZiwgICAgMHgwMDk2fSwKLXsweDgyZjAsICAgIDB4MDA0Nn0sIHsweDgyZjEsICAgIDB4MDA4NH0sIHsweDgyZjIsICAgIDB4MDAwY30sCi17MHg4MmYzLCAgICAweDAwODF9LCB7MHg4MmY0LCAgICAweDAwMDB9LCB7MHg4MmY1LCAgICAweDAwMjd9LAotezB4ODJmNiwgICAgMHgwMDE3fSwgezB4ODJmNywgICAgMHgwMGM2fSwgezB4ODJmOCwgICAgMHgwMDQ5fSwKLXsweDgyZjksICAgIDB4MDBiZH0sIHsweDgyZmEsICAgIDB4MDBlNH0sIHsweDgyZmIsICAgIDB4MDA5MX0sCi17MHg4MmZjLCAgICAweDAwMjR9LCB7MHg4MmZkLCAgICAweDAwMGR9LCB7MHg4MmZlLCAgICAweDAwYjZ9LAotezB4ODJmZiwgICAgMHgwMDEyfSwgezB4ODMwMCwgICAgMHgwMDIwfSwgezB4ODMwMSwgICAgMHgwMDg1fSwKLXsweDgzMDIsICAgIDB4MDAyMH0sIHsweDgzMDMsICAgIDB4MDAyNn0sIHsweDgzMDQsICAgIDB4MDAwY30sCi17MHg4MzA1LCAgICAweDAwY2V9LCB7MHg4MzA2LCAgICAweDAwODJ9LCB7MHg4MzA3LCAgICAweDAwYzF9LAotezB4ODMwOCwgICAgMHgwMGZmfSwgezB4ODMwOSwgICAgMHgwMDAxfSwgezB4ODMwYSwgICAgMHgwMDBmfSwKLXsweDgzMGIsICAgIDB4MDA3ZX0sIHsweDgzMGMsICAgIDB4MDA4NH0sIHsweDgzMGQsICAgIDB4MDAyNX0sCi17MHg4MzBlLCAgICAweDAwN2V9LCB7MHg4MzBmLCAgICAweDAwODR9LCB7MHg4MzEwLCAgICAweDAwMTZ9LAotezB4ODMxMSwgICAgMHgwMGZlfSwgezB4ODMxMiwgICAgMHgwMDhmfSwgezB4ODMxMywgICAgMHgwMDUyfSwKLXsweDgzMTQsICAgIDB4MDBiZH0sIHsweDgzMTUsICAgIDB4MDBlY30sIHsweDgzMTYsICAgIDB4MDA4ZX0sCi17MHg4MzE3LCAgICAweDAwYmR9LCB7MHg4MzE4LCAgICAweDAwZmF9LCB7MHg4MzE5LCAgICAweDAwZjd9LAotezB4ODMxYSwgICAgMHgwMDg2fSwgezB4ODMxYiwgICAgMHgwMDZhfSwgezB4ODMxYywgICAgMHgwMGM2fSwKLXsweDgzMWQsICAgIDB4MDA0OX0sIHsweDgzMWUsICAgIDB4MDBiZH0sIHsweDgzMWYsICAgIDB4MDBlNH0sCi17MHg4MzIwLCAgICAweDAwMTJ9LCB7MHg4MzIxLCAgICAweDAwY2V9LCB7MHg4MzIyLCAgICAweDAwODN9LAotezB4ODMyMywgICAgMHgwMDI3fSwgezB4ODMyNCwgICAgMHgwMGZmfSwgezB4ODMyNSwgICAgMHgwMDAxfSwKLXsweDgzMjYsICAgIDB4MDAwZn0sIHsweDgzMjcsICAgIDB4MDA5Nn0sIHsweDgzMjgsICAgIDB4MDA0Nn0sCi17MHg4MzI5LCAgICAweDAwODR9LCB7MHg4MzJhLCAgICAweDAwMGN9LCB7MHg4MzJiLCAgICAweDAwODF9LAotezB4ODMyYywgICAgMHgwMDAwfSwgezB4ODMyZCwgICAgMHgwMDI3fSwgezB4ODMyZSwgICAgMHgwMDBhfSwKLXsweDgzMmYsICAgIDB4MDBjNn0sIHsweDgzMzAsICAgIDB4MDA0OX0sIHsweDgzMzEsICAgIDB4MDBiZH0sCi17MHg4MzMyLCAgICAweDAwZTR9LCB7MHg4MzMzLCAgICAweDAwOTF9LCB7MHg4MzM0LCAgICAweDAwMjV9LAotezB4ODMzNSwgICAgMHgwMDA2fSwgezB4ODMzNiwgICAgMHgwMDdlfSwgezB4ODMzNywgICAgMHgwMDg0fSwKLXsweDgzMzgsICAgIDB4MDAyNX0sIHsweDgzMzksICAgIDB4MDA3ZX0sIHsweDgzM2EsICAgIDB4MDA4NH0sCi17MHg4MzNiLCAgICAweDAwMTZ9LCB7MHg4MzNjLCAgICAweDAwYjZ9LCB7MHg4MzNkLCAgICAweDAwMTh9LAotezB4ODMzZSwgICAgMHgwMDcwfSwgezB4ODMzZiwgICAgMHgwMGJifSwgezB4ODM0MCwgICAgMHgwMDE5fSwKLXsweDgzNDEsICAgIDB4MDA3MH0sIHsweDgzNDIsICAgIDB4MDAyYX0sIHsweDgzNDMsICAgIDB4MDAwNH0sCi17MHg4MzQ0LCAgICAweDAwODF9LCB7MHg4MzQ1LCAgICAweDAwYWZ9LCB7MHg4MzQ2LCAgICAweDAwMmV9LAotezB4ODM0NywgICAgMHgwMDE5fSwgezB4ODM0OCwgICAgMHgwMDk2fSwgezB4ODM0OSwgICAgMHgwMDdifSwKLXsweDgzNGEsICAgIDB4MDBmNn0sIHsweDgzNGIsICAgIDB4MDAyMH0sIHsweDgzNGMsICAgIDB4MDAwN30sCi17MHg4MzRkLCAgICAweDAwZmF9LCB7MHg4MzRlLCAgICAweDAwMjB9LCB7MHg4MzRmLCAgICAweDAwMjd9LAotezB4ODM1MCwgICAgMHgwMGM0fSwgezB4ODM1MSwgICAgMHgwMDM4fSwgezB4ODM1MiwgICAgMHgwMDgxfSwKLXsweDgzNTMsICAgIDB4MDAzOH0sIHsweDgzNTQsICAgIDB4MDAyN30sIHsweDgzNTUsICAgIDB4MDAwYn0sCi17MHg4MzU2LCAgICAweDAwZjZ9LCB7MHg4MzU3LCAgICAweDAwMjB9LCB7MHg4MzU4LCAgICAweDAwMDd9LAotezB4ODM1OSwgICAgMHgwMGZhfSwgezB4ODM1YSwgICAgMHgwMDIwfSwgezB4ODM1YiwgICAgMHgwMDI3fSwKLXsweDgzNWMsICAgIDB4MDBjYn0sIHsweDgzNWQsICAgIDB4MDAwOH0sIHsweDgzNWUsICAgIDB4MDA3ZX0sCi17MHg4MzVmLCAgICAweDAwODJ9LCB7MHg4MzYwLCAgICAweDAwZDN9LCB7MHg4MzYxLCAgICAweDAwYmR9LAotezB4ODM2MiwgICAgMHgwMGY3fSwgezB4ODM2MywgICAgMHgwMDY2fSwgezB4ODM2NCwgICAgMHgwMDg2fSwKLXsweDgzNjUsICAgIDB4MDA3NH0sIHsweDgzNjYsICAgIDB4MDBjNn0sIHsweDgzNjcsICAgIDB4MDA0OX0sCi17MHg4MzY4LCAgICAweDAwYmR9LCB7MHg4MzY5LCAgICAweDAwZTR9LCB7MHg4MzZhLCAgICAweDAwMTJ9LAotezB4ODM2YiwgICAgMHgwMGNlfSwgezB4ODM2YywgICAgMHgwMDgzfSwgezB4ODM2ZCwgICAgMHgwMDcxfSwKLXsweDgzNmUsICAgIDB4MDBmZn0sIHsweDgzNmYsICAgIDB4MDAwMX0sIHsweDgzNzAsICAgIDB4MDAwZn0sCi17MHg4MzcxLCAgICAweDAwOTZ9LCB7MHg4MzcyLCAgICAweDAwNDZ9LCB7MHg4MzczLCAgICAweDAwODR9LAotezB4ODM3NCwgICAgMHgwMDBjfSwgezB4ODM3NSwgICAgMHgwMDgxfSwgezB4ODM3NiwgICAgMHgwMDA4fSwKLXsweDgzNzcsICAgIDB4MDAyNn0sIHsweDgzNzgsICAgIDB4MDAwYX0sIHsweDgzNzksICAgIDB4MDBjNn0sCi17MHg4MzdhLCAgICAweDAwNDl9LCB7MHg4MzdiLCAgICAweDAwYmR9LCB7MHg4MzdjLCAgICAweDAwZTR9LAotezB4ODM3ZCwgICAgMHgwMDkxfSwgezB4ODM3ZSwgICAgMHgwMDI1fSwgezB4ODM3ZiwgICAgMHgwMDA2fSwKLXsweDgzODAsICAgIDB4MDA3ZX0sIHsweDgzODEsICAgIDB4MDA4NH0sIHsweDgzODIsICAgIDB4MDAyNX0sCi17MHg4MzgzLCAgICAweDAwN2V9LCB7MHg4Mzg0LCAgICAweDAwODR9LCB7MHg4Mzg1LCAgICAweDAwMTZ9LAotezB4ODM4NiwgICAgMHgwMGJkfSwgezB4ODM4NywgICAgMHgwMGY3fSwgezB4ODM4OCwgICAgMHgwMDNlfSwKLXsweDgzODksICAgIDB4MDAyNn0sIHsweDgzOGEsICAgIDB4MDAwZX0sIHsweDgzOGIsICAgIDB4MDBiZH0sCi17MHg4MzhjLCAgICAweDAwZTV9LCB7MHg4MzhkLCAgICAweDAwMDl9LCB7MHg4MzhlLCAgICAweDAwMjZ9LAotezB4ODM4ZiwgICAgMHgwMDA2fSwgezB4ODM5MCwgICAgMHgwMGNlfSwgezB4ODM5MSwgICAgMHgwMDgyfSwKLXsweDgzOTIsICAgIDB4MDBjMX0sIHsweDgzOTMsICAgIDB4MDBmZn0sIHsweDgzOTQsICAgIDB4MDAwMX0sCi17MHg4Mzk1LCAgICAweDAwMGZ9LCB7MHg4Mzk2LCAgICAweDAwN2V9LCB7MHg4Mzk3LCAgICAweDAwODR9LAotezB4ODM5OCwgICAgMHgwMDI1fSwgezB4ODM5OSwgICAgMHgwMGZlfSwgezB4ODM5YSwgICAgMHgwMDhmfSwKLXsweDgzOWIsICAgIDB4MDA1NH0sIHsweDgzOWMsICAgIDB4MDBiZH0sIHsweDgzOWQsICAgIDB4MDBlY30sCi17MHg4MzllLCAgICAweDAwOGV9LCB7MHg4MzlmLCAgICAweDAwYmR9LCB7MHg4M2EwLCAgICAweDAwZmF9LAotezB4ODNhMSwgICAgMHgwMGY3fSwgezB4ODNhMiwgICAgMHgwMGJkfSwgezB4ODNhMywgICAgMHgwMGY3fSwKLXsweDgzYTQsICAgIDB4MDAzM30sIHsweDgzYTUsICAgIDB4MDA4Nn0sIHsweDgzYTYsICAgIDB4MDAwZn0sCi17MHg4M2E3LCAgICAweDAwYzZ9LCB7MHg4M2E4LCAgICAweDAwNTF9LCB7MHg4M2E5LCAgICAweDAwYmR9LAotezB4ODNhYSwgICAgMHgwMGU0fSwgezB4ODNhYiwgICAgMHgwMDEyfSwgezB4ODNhYywgICAgMHgwMGNlfSwKLXsweDgzYWQsICAgIDB4MDA4M30sIHsweDgzYWUsICAgIDB4MDBiMn0sIHsweDgzYWYsICAgIDB4MDBmZn0sCi17MHg4M2IwLCAgICAweDAwMDF9LCB7MHg4M2IxLCAgICAweDAwMGZ9LCB7MHg4M2IyLCAgICAweDAwOTZ9LAotezB4ODNiMywgICAgMHgwMDQ2fSwgezB4ODNiNCwgICAgMHgwMDg0fSwgezB4ODNiNSwgICAgMHgwMDBjfSwKLXsweDgzYjYsICAgIDB4MDA4MX0sIHsweDgzYjcsICAgIDB4MDAwOH0sIHsweDgzYjgsICAgIDB4MDAyNn0sCi17MHg4M2I5LCAgICAweDAwNWN9LCB7MHg4M2JhLCAgICAweDAwYjZ9LCB7MHg4M2JiLCAgICAweDAwMTJ9LAotezB4ODNiYywgICAgMHgwMDIwfSwgezB4ODNiZCwgICAgMHgwMDg0fSwgezB4ODNiZSwgICAgMHgwMDNmfSwKLXsweDgzYmYsICAgIDB4MDA4MX0sIHsweDgzYzAsICAgIDB4MDAzYX0sIHsweDgzYzEsICAgIDB4MDAyN30sCi17MHg4M2MyLCAgICAweDAwMWN9LCB7MHg4M2MzLCAgICAweDAwOTZ9LCB7MHg4M2M0LCAgICAweDAwMjN9LAotezB4ODNjNSwgICAgMHgwMDg1fSwgezB4ODNjNiwgICAgMHgwMDQwfSwgezB4ODNjNywgICAgMHgwMDI3fSwKLXsweDgzYzgsICAgIDB4MDAwM30sIHsweDgzYzksICAgIDB4MDA3ZX0sIHsweDgzY2EsICAgIDB4MDA4NH0sCi17MHg4M2NiLCAgICAweDAwMjV9LCB7MHg4M2NjLCAgICAweDAwYzZ9LCB7MHg4M2NkLCAgICAweDAwNTF9LAotezB4ODNjZSwgICAgMHgwMGJkfSwgezB4ODNjZiwgICAgMHgwMGU0fSwgezB4ODNkMCwgICAgMHgwMDkxfSwKLXsweDgzZDEsICAgIDB4MDAyNX0sIHsweDgzZDIsICAgIDB4MDAwM30sIHsweDgzZDMsICAgIDB4MDA3ZX0sCi17MHg4M2Q0LCAgICAweDAwODR9LCB7MHg4M2Q1LCAgICAweDAwMjV9LCB7MHg4M2Q2LCAgICAweDAwY2V9LAotezB4ODNkNywgICAgMHgwMDgyfSwgezB4ODNkOCwgICAgMHgwMGMxfSwgezB4ODNkOSwgICAgMHgwMGZmfSwKLXsweDgzZGEsICAgIDB4MDAwMX0sIHsweDgzZGIsICAgIDB4MDAwZn0sIHsweDgzZGMsICAgIDB4MDA3ZX0sCi17MHg4M2RkLCAgICAweDAwODR9LCB7MHg4M2RlLCAgICAweDAwMjV9LCB7MHg4M2RmLCAgICAweDAwYmR9LAotezB4ODNlMCwgICAgMHgwMGY4fSwgezB4ODNlMSwgICAgMHgwMDM3fSwgezB4ODNlMiwgICAgMHgwMDdjfSwKLXsweDgzZTMsICAgIDB4MDAwMH0sIHsweDgzZTQsICAgIDB4MDA3YX0sIHsweDgzZTUsICAgIDB4MDBjZX0sCi17MHg4M2U2LCAgICAweDAwODN9LCB7MHg4M2U3LCAgICAweDAwZWV9LCB7MHg4M2U4LCAgICAweDAwZmZ9LAotezB4ODNlOSwgICAgMHgwMDAxfSwgezB4ODNlYSwgICAgMHgwMDBmfSwgezB4ODNlYiwgICAgMHgwMDdlfSwKLXsweDgzZWMsICAgIDB4MDA4NH0sIHsweDgzZWQsICAgIDB4MDAyNX0sIHsweDgzZWUsICAgIDB4MDA5Nn0sCi17MHg4M2VmLCAgICAweDAwNDZ9LCB7MHg4M2YwLCAgICAweDAwODR9LCB7MHg4M2YxLCAgICAweDAwMGN9LAotezB4ODNmMiwgICAgMHgwMDgxfSwgezB4ODNmMywgICAgMHgwMDA4fSwgezB4ODNmNCwgICAgMHgwMDI2fSwKLXsweDgzZjUsICAgIDB4MDAyMH0sIHsweDgzZjYsICAgIDB4MDA5Nn0sIHsweDgzZjcsICAgIDB4MDAyNH0sCi17MHg4M2Y4LCAgICAweDAwODR9LCB7MHg4M2Y5LCAgICAweDAwMDh9LCB7MHg4M2ZhLCAgICAweDAwMjZ9LAotezB4ODNmYiwgICAgMHgwMDI5fSwgezB4ODNmYywgICAgMHgwMGI2fSwgezB4ODNmZCwgICAgMHgwMDE4fSwKLXsweDgzZmUsICAgIDB4MDA4Mn0sIHsweDgzZmYsICAgIDB4MDBiYn0sIHsweDg0MDAsICAgIDB4MDAxOX0sCi17MHg4NDAxLCAgICAweDAwODJ9LCB7MHg4NDAyLCAgICAweDAwYjF9LCB7MHg4NDAzLCAgICAweDAwMDF9LAotezB4ODQwNCwgICAgMHgwMDNifSwgezB4ODQwNSwgICAgMHgwMDIyfSwgezB4ODQwNiwgICAgMHgwMDA5fSwKLXsweDg0MDcsICAgIDB4MDBiNn0sIHsweDg0MDgsICAgIDB4MDAxMn0sIHsweDg0MDksICAgIDB4MDAyMH0sCi17MHg4NDBhLCAgICAweDAwODR9LCB7MHg4NDBiLCAgICAweDAwMzd9LCB7MHg4NDBjLCAgICAweDAwODF9LAotezB4ODQwZCwgICAgMHgwMDMyfSwgezB4ODQwZSwgICAgMHgwMDI3fSwgezB4ODQwZiwgICAgMHgwMDE1fSwKLXsweDg0MTAsICAgIDB4MDBiZH0sIHsweDg0MTEsICAgIDB4MDBmOH0sIHsweDg0MTIsICAgIDB4MDA0NH0sCi17MHg4NDEzLCAgICAweDAwN2V9LCB7MHg4NDE0LCAgICAweDAwODJ9LCB7MHg4NDE1LCAgICAweDAwYzF9LAotezB4ODQxNiwgICAgMHgwMGJkfSwgezB4ODQxNywgICAgMHgwMGY3fSwgezB4ODQxOCwgICAgMHgwMDFmfSwKLXsweDg0MTksICAgIDB4MDBiZH0sIHsweDg0MWEsICAgIDB4MDBmOH0sIHsweDg0MWIsICAgIDB4MDA0NH0sCi17MHg4NDFjLCAgICAweDAwYmR9LCB7MHg4NDFkLCAgICAweDAwZmN9LCB7MHg4NDFlLCAgICAweDAwMjl9LAotezB4ODQxZiwgICAgMHgwMGNlfSwgezB4ODQyMCwgICAgMHgwMDgyfSwgezB4ODQyMSwgICAgMHgwMDI1fSwKLXsweDg0MjIsICAgIDB4MDBmZn0sIHsweDg0MjMsICAgIDB4MDAwMX0sIHsweDg0MjQsICAgIDB4MDAwZn0sCi17MHg4NDI1LCAgICAweDAwMzl9LCB7MHg4NDI2LCAgICAweDAwOTZ9LCB7MHg4NDI3LCAgICAweDAwNDd9LAotezB4ODQyOCwgICAgMHgwMDg0fSwgezB4ODQyOSwgICAgMHgwMGZjfSwgezB4ODQyYSwgICAgMHgwMDhhfSwKLXsweDg0MmIsICAgIDB4MDAwMH0sIHsweDg0MmMsICAgIDB4MDA5N30sIHsweDg0MmQsICAgIDB4MDA0N30sCi17MHg4NDJlLCAgICAweDAwY2V9LCB7MHg4NDJmLCAgICAweDAwODR9LCB7MHg4NDMwLCAgICAweDAwMzR9LAotezB4ODQzMSwgICAgMHgwMGZmfSwgezB4ODQzMiwgICAgMHgwMDAxfSwgezB4ODQzMywgICAgMHgwMDExfSwKLXsweDg0MzQsICAgIDB4MDA5Nn0sIHsweDg0MzUsICAgIDB4MDA0Nn0sIHsweDg0MzYsICAgIDB4MDA4NH0sCi17MHg4NDM3LCAgICAweDAwMDN9LCB7MHg4NDM4LCAgICAweDAwODF9LCB7MHg4NDM5LCAgICAweDAwMDJ9LAotezB4ODQzYSwgICAgMHgwMDI3fSwgezB4ODQzYiwgICAgMHgwMDAzfSwgezB4ODQzYywgICAgMHgwMDdlfSwKLXsweDg0M2QsICAgIDB4MDA4NX0sIHsweDg0M2UsICAgIDB4MDAxZX0sIHsweDg0M2YsICAgIDB4MDA5Nn0sCi17MHg4NDQwLCAgICAweDAwNDd9LCB7MHg4NDQxLCAgICAweDAwODR9LCB7MHg4NDQyLCAgICAweDAwZmN9LAotezB4ODQ0MywgICAgMHgwMDhhfSwgezB4ODQ0NCwgICAgMHgwMDAyfSwgezB4ODQ0NSwgICAgMHgwMDk3fSwKLXsweDg0NDYsICAgIDB4MDA0N30sIHsweDg0NDcsICAgIDB4MDBkZX0sIHsweDg0NDgsICAgIDB4MDBlMX0sCi17MHg4NDQ5LCAgICAweDAwYWR9LCB7MHg4NDRhLCAgICAweDAwMDB9LCB7MHg4NDRiLCAgICAweDAwODZ9LAotezB4ODQ0YywgICAgMHgwMDAxfSwgezB4ODQ0ZCwgICAgMHgwMGI3fSwgezB4ODQ0ZSwgICAgMHgwMDEyfSwKLXsweDg0NGYsICAgIDB4MDA1MX0sIHsweDg0NTAsICAgIDB4MDBiZH0sIHsweDg0NTEsICAgIDB4MDBmN30sCi17MHg4NDUyLCAgICAweDAwMTR9LCB7MHg4NDUzLCAgICAweDAwYjZ9LCB7MHg4NDU0LCAgICAweDAwMTB9LAotezB4ODQ1NSwgICAgMHgwMDMxfSwgezB4ODQ1NiwgICAgMHgwMDg0fSwgezB4ODQ1NywgICAgMHgwMGZkfSwKLXsweDg0NTgsICAgIDB4MDBiN30sIHsweDg0NTksICAgIDB4MDAxMH0sIHsweDg0NWEsICAgIDB4MDAzMX0sCi17MHg4NDViLCAgICAweDAwYmR9LCB7MHg4NDVjLCAgICAweDAwZjh9LCB7MHg4NDVkLCAgICAweDAwMWV9LAotezB4ODQ1ZSwgICAgMHgwMDk2fSwgezB4ODQ1ZiwgICAgMHgwMDgxfSwgezB4ODQ2MCwgICAgMHgwMGQ2fSwKLXsweDg0NjEsICAgIDB4MDA4Mn0sIHsweDg0NjIsICAgIDB4MDBmZX0sIHsweDg0NjMsICAgIDB4MDA4Zn0sCi17MHg4NDY0LCAgICAweDAwNWF9LCB7MHg4NDY1LCAgICAweDAwYmR9LCB7MHg4NDY2LCAgICAweDAwZjd9LAotezB4ODQ2NywgICAgMHgwMGI2fSwgezB4ODQ2OCwgICAgMHgwMGZlfSwgezB4ODQ2OSwgICAgMHgwMDhmfSwKLXsweDg0NmEsICAgIDB4MDA1Y30sIHsweDg0NmIsICAgIDB4MDBiZH0sIHsweDg0NmMsICAgIDB4MDBlY30sCi17MHg4NDZkLCAgICAweDAwOGV9LCB7MHg4NDZlLCAgICAweDAwYmR9LCB7MHg4NDZmLCAgICAweDAwZmF9LAotezB4ODQ3MCwgICAgMHgwMGY3fSwgezB4ODQ3MSwgICAgMHgwMDg2fSwgezB4ODQ3MiwgICAgMHgwMDA4fSwKLXsweDg0NzMsICAgIDB4MDBkNn0sIHsweDg0NzQsICAgIDB4MDAwMH0sIHsweDg0NzUsICAgIDB4MDBjNX0sCi17MHg4NDc2LCAgICAweDAwMTB9LCB7MHg4NDc3LCAgICAweDAwMjZ9LCB7MHg4NDc4LCAgICAweDAwMDJ9LAotezB4ODQ3OSwgICAgMHgwMDhifSwgezB4ODQ3YSwgICAgMHgwMDIwfSwgezB4ODQ3YiwgICAgMHgwMGM2fSwKLXsweDg0N2MsICAgIDB4MDA1MX0sIHsweDg0N2QsICAgIDB4MDBiZH0sIHsweDg0N2UsICAgIDB4MDBlNH0sCi17MHg4NDdmLCAgICAweDAwMTJ9LCB7MHg4NDgwLCAgICAweDAwY2V9LCB7MHg4NDgxLCAgICAweDAwODR9LAotezB4ODQ4MiwgICAgMHgwMDg2fSwgezB4ODQ4MywgICAgMHgwMGZmfSwgezB4ODQ4NCwgICAgMHgwMDAxfSwKLXsweDg0ODUsICAgIDB4MDAxMX0sIHsweDg0ODYsICAgIDB4MDA5Nn0sIHsweDg0ODcsICAgIDB4MDA0Nn0sCi17MHg4NDg4LCAgICAweDAwODR9LCB7MHg4NDg5LCAgICAweDAwMDN9LCB7MHg4NDhhLCAgICAweDAwODF9LAotezB4ODQ4YiwgICAgMHgwMDAyfSwgezB4ODQ4YywgICAgMHgwMDI3fSwgezB4ODQ4ZCwgICAgMHgwMDAzfSwKLXsweDg0OGUsICAgIDB4MDA3ZX0sIHsweDg0OGYsICAgIDB4MDA4NX0sIHsweDg0OTAsICAgIDB4MDAwZn0sCi17MHg4NDkxLCAgICAweDAwYzZ9LCB7MHg4NDkyLCAgICAweDAwNTF9LCB7MHg4NDkzLCAgICAweDAwYmR9LAotezB4ODQ5NCwgICAgMHgwMGU0fSwgezB4ODQ5NSwgICAgMHgwMDkxfSwgezB4ODQ5NiwgICAgMHgwMDI1fSwKLXsweDg0OTcsICAgIDB4MDAwM30sIHsweDg0OTgsICAgIDB4MDA3ZX0sIHsweDg0OTksICAgIDB4MDA4NX0sCi17MHg4NDlhLCAgICAweDAwMWV9LCB7MHg4NDliLCAgICAweDAwOTZ9LCB7MHg4NDljLCAgICAweDAwNDR9LAotezB4ODQ5ZCwgICAgMHgwMDg1fSwgezB4ODQ5ZSwgICAgMHgwMDEwfSwgezB4ODQ5ZiwgICAgMHgwMDI2fSwKLXsweDg0YTAsICAgIDB4MDAwYX0sIHsweDg0YTEsICAgIDB4MDBiNn0sIHsweDg0YTIsICAgIDB4MDAxMn0sCi17MHg4NGEzLCAgICAweDAwNTB9LCB7MHg4NGE0LCAgICAweDAwYmF9LCB7MHg4NGE1LCAgICAweDAwMDF9LAotezB4ODRhNiwgICAgMHgwMDNjfSwgezB4ODRhNywgICAgMHgwMDg1fSwgezB4ODRhOCwgICAgMHgwMDEwfSwKLXsweDg0YTksICAgIDB4MDAyN30sIHsweDg0YWEsICAgIDB4MDBhOH0sIHsweDg0YWIsICAgIDB4MDBiZH0sCi17MHg4NGFjLCAgICAweDAwZjd9LCB7MHg4NGFkLCAgICAweDAwNjZ9LCB7MHg4NGFlLCAgICAweDAwY2V9LAotezB4ODRhZiwgICAgMHgwMDg0fSwgezB4ODRiMCwgICAgMHgwMGI3fSwgezB4ODRiMSwgICAgMHgwMGZmfSwKLXsweDg0YjIsICAgIDB4MDAwMX0sIHsweDg0YjMsICAgIDB4MDAxMX0sIHsweDg0YjQsICAgIDB4MDA3ZX0sCi17MHg4NGI1LCAgICAweDAwODV9LCB7MHg4NGI2LCAgICAweDAwMWV9LCB7MHg4NGI3LCAgICAweDAwOTZ9LAotezB4ODRiOCwgICAgMHgwMDQ2fSwgezB4ODRiOSwgICAgMHgwMDg0fSwgezB4ODRiYSwgICAgMHgwMDAzfSwKLXsweDg0YmIsICAgIDB4MDA4MX0sIHsweDg0YmMsICAgIDB4MDAwMn0sIHsweDg0YmQsICAgIDB4MDAyNn0sCi17MHg4NGJlLCAgICAweDAwNTB9LCB7MHg4NGJmLCAgICAweDAwYjZ9LCB7MHg4NGMwLCAgICAweDAwMTJ9LAotezB4ODRjMSwgICAgMHgwMDMwfSwgezB4ODRjMiwgICAgMHgwMDg0fSwgezB4ODRjMywgICAgMHgwMDAzfSwKLXsweDg0YzQsICAgIDB4MDA4MX0sIHsweDg0YzUsICAgIDB4MDAwMX0sIHsweDg0YzYsICAgIDB4MDAyN30sCi17MHg4NGM3LCAgICAweDAwMDN9LCB7MHg4NGM4LCAgICAweDAwN2V9LCB7MHg4NGM5LCAgICAweDAwODV9LAotezB4ODRjYSwgICAgMHgwMDFlfSwgezB4ODRjYiwgICAgMHgwMDk2fSwgezB4ODRjYywgICAgMHgwMDQ0fSwKLXsweDg0Y2QsICAgIDB4MDA4NX0sIHsweDg0Y2UsICAgIDB4MDAxMH0sIHsweDg0Y2YsICAgIDB4MDAyNn0sCi17MHg4NGQwLCAgICAweDAwMTN9LCB7MHg4NGQxLCAgICAweDAwYjZ9LCB7MHg4NGQyLCAgICAweDAwMTJ9LAotezB4ODRkMywgICAgMHgwMDUwfSwgezB4ODRkNCwgICAgMHgwMGJhfSwgezB4ODRkNSwgICAgMHgwMDAxfSwKLXsweDg0ZDYsICAgIDB4MDAzY30sIHsweDg0ZDcsICAgIDB4MDA4NX0sIHsweDg0ZDgsICAgIDB4MDAxMH0sCi17MHg4NGQ5LCAgICAweDAwMjZ9LCB7MHg4NGRhLCAgICAweDAwMDl9LCB7MHg4NGRiLCAgICAweDAwY2V9LAotezB4ODRkYywgICAgMHgwMDg0fSwgezB4ODRkZCwgICAgMHgwMDUzfSwgezB4ODRkZSwgICAgMHgwMGZmfSwKLXsweDg0ZGYsICAgIDB4MDAwMX0sIHsweDg0ZTAsICAgIDB4MDAxMX0sIHsweDg0ZTEsICAgIDB4MDA3ZX0sCi17MHg4NGUyLCAgICAweDAwODV9LCB7MHg4NGUzLCAgICAweDAwMWV9LCB7MHg4NGU0LCAgICAweDAwYjZ9LAotezB4ODRlNSwgICAgMHgwMDEwfSwgezB4ODRlNiwgICAgMHgwMDMxfSwgezB4ODRlNywgICAgMHgwMDhhfSwKLXsweDg0ZTgsICAgIDB4MDAwMn0sIHsweDg0ZTksICAgIDB4MDBiN30sIHsweDg0ZWEsICAgIDB4MDAxMH0sCi17MHg4NGViLCAgICAweDAwMzF9LCB7MHg4NGVjLCAgICAweDAwYmR9LCB7MHg4NGVkLCAgICAweDAwODV9LAotezB4ODRlZSwgICAgMHgwMDFmfSwgezB4ODRlZiwgICAgMHgwMGJkfSwgezB4ODRmMCwgICAgMHgwMGY4fSwKLXsweDg0ZjEsICAgIDB4MDAzN30sIHsweDg0ZjIsICAgIDB4MDA3Y30sIHsweDg0ZjMsICAgIDB4MDAwMH0sCi17MHg4NGY0LCAgICAweDAwODB9LCB7MHg4NGY1LCAgICAweDAwY2V9LCB7MHg4NGY2LCAgICAweDAwODR9LAotezB4ODRmNywgICAgMHgwMGZlfSwgezB4ODRmOCwgICAgMHgwMGZmfSwgezB4ODRmOSwgICAgMHgwMDAxfSwKLXsweDg0ZmEsICAgIDB4MDAxMX0sIHsweDg0ZmIsICAgIDB4MDA3ZX0sIHsweDg0ZmMsICAgIDB4MDA4NX0sCi17MHg4NGZkLCAgICAweDAwMWV9LCB7MHg4NGZlLCAgICAweDAwOTZ9LCB7MHg4NGZmLCAgICAweDAwNDZ9LAotezB4ODUwMCwgICAgMHgwMDg0fSwgezB4ODUwMSwgICAgMHgwMDAzfSwgezB4ODUwMiwgICAgMHgwMDgxfSwKLXsweDg1MDMsICAgIDB4MDAwMn0sIHsweDg1MDQsICAgIDB4MDAyNn0sIHsweDg1MDUsICAgIDB4MDAwOX0sCi17MHg4NTA2LCAgICAweDAwYjZ9LCB7MHg4NTA3LCAgICAweDAwMTJ9LCB7MHg4NTA4LCAgICAweDAwMzB9LAotezB4ODUwOSwgICAgMHgwMDg0fSwgezB4ODUwYSwgICAgMHgwMDAzfSwgezB4ODUwYiwgICAgMHgwMDgxfSwKLXsweDg1MGMsICAgIDB4MDAwMX0sIHsweDg1MGQsICAgIDB4MDAyN30sIHsweDg1MGUsICAgIDB4MDAwZn0sCi17MHg4NTBmLCAgICAweDAwYmR9LCB7MHg4NTEwLCAgICAweDAwZjh9LCB7MHg4NTExLCAgICAweDAwNDR9LAotezB4ODUxMiwgICAgMHgwMGJkfSwgezB4ODUxMywgICAgMHgwMGY3fSwgezB4ODUxNCwgICAgMHgwMDBifSwKLXsweDg1MTUsICAgIDB4MDBiZH0sIHsweDg1MTYsICAgIDB4MDBmY30sIHsweDg1MTcsICAgIDB4MDAyOX0sCi17MHg4NTE4LCAgICAweDAwY2V9LCB7MHg4NTE5LCAgICAweDAwODR9LCB7MHg4NTFhLCAgICAweDAwMjZ9LAotezB4ODUxYiwgICAgMHgwMGZmfSwgezB4ODUxYywgICAgMHgwMDAxfSwgezB4ODUxZCwgICAgMHgwMDExfSwKLXsweDg1MWUsICAgIDB4MDAzOX0sIHsweDg1MWYsICAgIDB4MDBkNn0sIHsweDg1MjAsICAgIDB4MDAyMn0sCi17MHg4NTIxLCAgICAweDAwYzR9LCB7MHg4NTIyLCAgICAweDAwMGZ9LCB7MHg4NTIzLCAgICAweDAwYjZ9LAotezB4ODUyNCwgICAgMHgwMDEyfSwgezB4ODUyNSwgICAgMHgwMDMwfSwgezB4ODUyNiwgICAgMHgwMGJhfSwKLXsweDg1MjcsICAgIDB4MDAxMn0sIHsweDg1MjgsICAgIDB4MDAzMn0sIHsweDg1MjksICAgIDB4MDA4NH0sCi17MHg4NTJhLCAgICAweDAwMDR9LCB7MHg4NTJiLCAgICAweDAwMjd9LCB7MHg4NTJjLCAgICAweDAwMGR9LAotezB4ODUyZCwgICAgMHgwMDk2fSwgezB4ODUyZSwgICAgMHgwMDIyfSwgezB4ODUyZiwgICAgMHgwMDg1fSwKLXsweDg1MzAsICAgIDB4MDAwNH0sIHsweDg1MzEsICAgIDB4MDAyN30sIHsweDg1MzIsICAgIDB4MDAwNX0sCi17MHg4NTMzLCAgICAweDAwY2F9LCB7MHg4NTM0LCAgICAweDAwMTB9LCB7MHg4NTM1LCAgICAweDAwN2V9LAotezB4ODUzNiwgICAgMHgwMDg1fSwgezB4ODUzNywgICAgMHgwMDNhfSwgezB4ODUzOCwgICAgMHgwMGNhfSwKLXsweDg1MzksICAgIDB4MDAyMH0sIHsweDg1M2EsICAgIDB4MDBkN30sIHsweDg1M2IsICAgIDB4MDAyMn0sCi17MHg4NTNjLCAgICAweDAwMzl9LCB7MHg4NTNkLCAgICAweDAwODZ9LCB7MHg4NTNlLCAgICAweDAwMDB9LAotezB4ODUzZiwgICAgMHgwMDk3fSwgezB4ODU0MCwgICAgMHgwMDgzfSwgezB4ODU0MSwgICAgMHgwMDE4fSwKLXsweDg1NDIsICAgIDB4MDBjZX0sIHsweDg1NDMsICAgIDB4MDAxY30sIHsweDg1NDQsICAgIDB4MDAwMH0sCi17MHg4NTQ1LCAgICAweDAwYmR9LCB7MHg4NTQ2LCAgICAweDAwZWJ9LCB7MHg4NTQ3LCAgICAweDAwNDZ9LAotezB4ODU0OCwgICAgMHgwMDk2fSwgezB4ODU0OSwgICAgMHgwMDU3fSwgezB4ODU0YSwgICAgMHgwMDg1fSwKLXsweDg1NGIsICAgIDB4MDAwMX0sIHsweDg1NGMsICAgIDB4MDAyN30sIHsweDg1NGQsICAgIDB4MDAwMn0sCi17MHg4NTRlLCAgICAweDAwNGZ9LCB7MHg4NTRmLCAgICAweDAwMzl9LCB7MHg4NTUwLCAgICAweDAwODV9LAotezB4ODU1MSwgICAgMHgwMDAyfSwgezB4ODU1MiwgICAgMHgwMDI3fSwgezB4ODU1MywgICAgMHgwMDAxfSwKLXsweDg1NTQsICAgIDB4MDAzOX0sIHsweDg1NTUsICAgIDB4MDA3Zn0sIHsweDg1NTYsICAgIDB4MDA4Zn0sCi17MHg4NTU3LCAgICAweDAwN2R9LCB7MHg4NTU4LCAgICAweDAwODZ9LCB7MHg4NTU5LCAgICAweDAwMDR9LAotezB4ODU1YSwgICAgMHgwMGI3fSwgezB4ODU1YiwgICAgMHgwMDEyfSwgezB4ODU1YywgICAgMHgwMDA0fSwKLXsweDg1NWQsICAgIDB4MDA4Nn0sIHsweDg1NWUsICAgIDB4MDAwOH0sIHsweDg1NWYsICAgIDB4MDBiN30sCi17MHg4NTYwLCAgICAweDAwMTJ9LCB7MHg4NTYxLCAgICAweDAwMDd9LCB7MHg4NTYyLCAgICAweDAwODZ9LAotezB4ODU2MywgICAgMHgwMDEwfSwgezB4ODU2NCwgICAgMHgwMGI3fSwgezB4ODU2NSwgICAgMHgwMDEyfSwKLXsweDg1NjYsICAgIDB4MDAwY30sIHsweDg1NjcsICAgIDB4MDA4Nn0sIHsweDg1NjgsICAgIDB4MDAwN30sCi17MHg4NTY5LCAgICAweDAwYjd9LCB7MHg4NTZhLCAgICAweDAwMTJ9LCB7MHg4NTZiLCAgICAweDAwMDZ9LAotezB4ODU2YywgICAgMHgwMGI2fSwgezB4ODU2ZCwgICAgMHgwMDhmfSwgezB4ODU2ZSwgICAgMHgwMDdkfSwKLXsweDg1NmYsICAgIDB4MDBiN30sIHsweDg1NzAsICAgIDB4MDAxMn0sIHsweDg1NzEsICAgIDB4MDA3MH0sCi17MHg4NTcyLCAgICAweDAwODZ9LCB7MHg4NTczLCAgICAweDAwMDF9LCB7MHg4NTc0LCAgICAweDAwYmF9LAotezB4ODU3NSwgICAgMHgwMDEyfSwgezB4ODU3NiwgICAgMHgwMDA0fSwgezB4ODU3NywgICAgMHgwMGI3fSwKLXsweDg1NzgsICAgIDB4MDAxMn0sIHsweDg1NzksICAgIDB4MDAwNH0sIHsweDg1N2EsICAgIDB4MDAwMX0sCi17MHg4NTdiLCAgICAweDAwMDF9LCB7MHg4NTdjLCAgICAweDAwMDF9LCB7MHg4NTdkLCAgICAweDAwMDF9LAotezB4ODU3ZSwgICAgMHgwMDAxfSwgezB4ODU3ZiwgICAgMHgwMDAxfSwgezB4ODU4MCwgICAgMHgwMGI2fSwKLXsweDg1ODEsICAgIDB4MDAxMn0sIHsweDg1ODIsICAgIDB4MDAwNH0sIHsweDg1ODMsICAgIDB4MDA4NH0sCi17MHg4NTg0LCAgICAweDAwZmV9LCB7MHg4NTg1LCAgICAweDAwOGF9LCB7MHg4NTg2LCAgICAweDAwMDJ9LAotezB4ODU4NywgICAgMHgwMGI3fSwgezB4ODU4OCwgICAgMHgwMDEyfSwgezB4ODU4OSwgICAgMHgwMDA0fSwKLXsweDg1OGEsICAgIDB4MDAwMX0sIHsweDg1OGIsICAgIDB4MDAwMX0sIHsweDg1OGMsICAgIDB4MDAwMX0sCi17MHg4NThkLCAgICAweDAwMDF9LCB7MHg4NThlLCAgICAweDAwMDF9LCB7MHg4NThmLCAgICAweDAwMDF9LAotezB4ODU5MCwgICAgMHgwMDg2fSwgezB4ODU5MSwgICAgMHgwMGZkfSwgezB4ODU5MiwgICAgMHgwMGI0fSwKLXsweDg1OTMsICAgIDB4MDAxMn0sIHsweDg1OTQsICAgIDB4MDAwNH0sIHsweDg1OTUsICAgIDB4MDBiN30sCi17MHg4NTk2LCAgICAweDAwMTJ9LCB7MHg4NTk3LCAgICAweDAwMDR9LCB7MHg4NTk4LCAgICAweDAwYjZ9LAotezB4ODU5OSwgICAgMHgwMDEyfSwgezB4ODU5YSwgICAgMHgwMDAwfSwgezB4ODU5YiwgICAgMHgwMDg0fSwKLXsweDg1OWMsICAgIDB4MDAwOH0sIHsweDg1OWQsICAgIDB4MDA4MX0sIHsweDg1OWUsICAgIDB4MDAwOH0sCi17MHg4NTlmLCAgICAweDAwMjd9LCB7MHg4NWEwLCAgICAweDAwMTZ9LCB7MHg4NWExLCAgICAweDAwYjZ9LAotezB4ODVhMiwgICAgMHgwMDhmfSwgezB4ODVhMywgICAgMHgwMDdkfSwgezB4ODVhNCwgICAgMHgwMDgxfSwKLXsweDg1YTUsICAgIDB4MDAwY30sIHsweDg1YTYsICAgIDB4MDAyN30sIHsweDg1YTcsICAgIDB4MDAwOH0sCi17MHg4NWE4LCAgICAweDAwOGJ9LCB7MHg4NWE5LCAgICAweDAwMDR9LCB7MHg4NWFhLCAgICAweDAwYjd9LAotezB4ODVhYiwgICAgMHgwMDhmfSwgezB4ODVhYywgICAgMHgwMDdkfSwgezB4ODVhZCwgICAgMHgwMDdlfSwKLXsweDg1YWUsICAgIDB4MDA4NX0sIHsweDg1YWYsICAgIDB4MDA2Y30sIHsweDg1YjAsICAgIDB4MDA4Nn0sCi17MHg4NWIxLCAgICAweDAwMDN9LCB7MHg4NWIyLCAgICAweDAwOTd9LCB7MHg4NWIzLCAgICAweDAwNDB9LAotezB4ODViNCwgICAgMHgwMDdlfSwgezB4ODViNSwgICAgMHgwMDg5fSwgezB4ODViNiwgICAgMHgwMDZlfSwKLXsweDg1YjcsICAgIDB4MDA4Nn0sIHsweDg1YjgsICAgIDB4MDAwN30sIHsweDg1YjksICAgIDB4MDBiN30sCi17MHg4NWJhLCAgICAweDAwMTJ9LCB7MHg4NWJiLCAgICAweDAwMDZ9LCB7MHg4NWJjLCAgICAweDAwNWZ9LAotezB4ODViZCwgICAgMHgwMGY3fSwgezB4ODViZSwgICAgMHgwMDhmfSwgezB4ODViZiwgICAgMHgwMDgyfSwKLXsweDg1YzAsICAgIDB4MDA1Zn0sIHsweDg1YzEsICAgIDB4MDBmN30sIHsweDg1YzIsICAgIDB4MDA4Zn0sCi17MHg4NWMzLCAgICAweDAwN2Z9LCB7MHg4NWM0LCAgICAweDAwZjd9LCB7MHg4NWM1LCAgICAweDAwOGZ9LAotezB4ODVjNiwgICAgMHgwMDcwfSwgezB4ODVjNywgICAgMHgwMGY3fSwgezB4ODVjOCwgICAgMHgwMDhmfSwKLXsweDg1YzksICAgIDB4MDA3MX0sIHsweDg1Y2EsICAgIDB4MDBmN30sIHsweDg1Y2IsICAgIDB4MDA4Zn0sCi17MHg4NWNjLCAgICAweDAwNzJ9LCB7MHg4NWNkLCAgICAweDAwZjd9LCB7MHg4NWNlLCAgICAweDAwOGZ9LAotezB4ODVjZiwgICAgMHgwMDczfSwgezB4ODVkMCwgICAgMHgwMGY3fSwgezB4ODVkMSwgICAgMHgwMDhmfSwKLXsweDg1ZDIsICAgIDB4MDA3NH0sIHsweDg1ZDMsICAgIDB4MDBmN30sIHsweDg1ZDQsICAgIDB4MDA4Zn0sCi17MHg4NWQ1LCAgICAweDAwNzV9LCB7MHg4NWQ2LCAgICAweDAwZjd9LCB7MHg4NWQ3LCAgICAweDAwOGZ9LAotezB4ODVkOCwgICAgMHgwMDc2fSwgezB4ODVkOSwgICAgMHgwMGY3fSwgezB4ODVkYSwgICAgMHgwMDhmfSwKLXsweDg1ZGIsICAgIDB4MDA3N30sIHsweDg1ZGMsICAgIDB4MDBmN30sIHsweDg1ZGQsICAgIDB4MDA4Zn0sCi17MHg4NWRlLCAgICAweDAwNzh9LCB7MHg4NWRmLCAgICAweDAwZjd9LCB7MHg4NWUwLCAgICAweDAwOGZ9LAotezB4ODVlMSwgICAgMHgwMDc5fSwgezB4ODVlMiwgICAgMHgwMGY3fSwgezB4ODVlMywgICAgMHgwMDhmfSwKLXsweDg1ZTQsICAgIDB4MDA3YX0sIHsweDg1ZTUsICAgIDB4MDBmN30sIHsweDg1ZTYsICAgIDB4MDA4Zn0sCi17MHg4NWU3LCAgICAweDAwN2J9LCB7MHg4NWU4LCAgICAweDAwYjZ9LCB7MHg4NWU5LCAgICAweDAwMTJ9LAotezB4ODVlYSwgICAgMHgwMDA0fSwgezB4ODVlYiwgICAgMHgwMDhhfSwgezB4ODVlYywgICAgMHgwMDEwfSwKLXsweDg1ZWQsICAgIDB4MDBiN30sIHsweDg1ZWUsICAgIDB4MDAxMn0sIHsweDg1ZWYsICAgIDB4MDAwNH0sCi17MHg4NWYwLCAgICAweDAwODZ9LCB7MHg4NWYxLCAgICAweDAwZTR9LCB7MHg4NWYyLCAgICAweDAwYjd9LAotezB4ODVmMywgICAgMHgwMDEyfSwgezB4ODVmNCwgICAgMHgwMDcwfSwgezB4ODVmNSwgICAgMHgwMGI3fSwKLXsweDg1ZjYsICAgIDB4MDAxMn0sIHsweDg1ZjcsICAgIDB4MDAwN30sIHsweDg1ZjgsICAgIDB4MDBmN30sCi17MHg4NWY5LCAgICAweDAwMTJ9LCB7MHg4NWZhLCAgICAweDAwMDV9LCB7MHg4NWZiLCAgICAweDAwZjd9LAotezB4ODVmYywgICAgMHgwMDEyfSwgezB4ODVmZCwgICAgMHgwMDA5fSwgezB4ODVmZSwgICAgMHgwMDg2fSwKLXsweDg1ZmYsICAgIDB4MDAwOH0sIHsweDg2MDAsICAgIDB4MDBiYX0sIHsweDg2MDEsICAgIDB4MDAxMn0sCi17MHg4NjAyLCAgICAweDAwMDR9LCB7MHg4NjAzLCAgICAweDAwYjd9LCB7MHg4NjA0LCAgICAweDAwMTJ9LAotezB4ODYwNSwgICAgMHgwMDA0fSwgezB4ODYwNiwgICAgMHgwMDg2fSwgezB4ODYwNywgICAgMHgwMGY3fSwKLXsweDg2MDgsICAgIDB4MDBiNH0sIHsweDg2MDksICAgIDB4MDAxMn0sIHsweDg2MGEsICAgIDB4MDAwNH0sCi17MHg4NjBiLCAgICAweDAwYjd9LCB7MHg4NjBjLCAgICAweDAwMTJ9LCB7MHg4NjBkLCAgICAweDAwMDR9LAotezB4ODYwZSwgICAgMHgwMDAxfSwgezB4ODYwZiwgICAgMHgwMDAxfSwgezB4ODYxMCwgICAgMHgwMDAxfSwKLXsweDg2MTEsICAgIDB4MDAwMX0sIHsweDg2MTIsICAgIDB4MDAwMX0sIHsweDg2MTMsICAgIDB4MDAwMX0sCi17MHg4NjE0LCAgICAweDAwYjZ9LCB7MHg4NjE1LCAgICAweDAwMTJ9LCB7MHg4NjE2LCAgICAweDAwMDh9LAotezB4ODYxNywgICAgMHgwMDI3fSwgezB4ODYxOCwgICAgMHgwMDdmfSwgezB4ODYxOSwgICAgMHgwMDgxfSwKLXsweDg2MWEsICAgIDB4MDA4MH0sIHsweDg2MWIsICAgIDB4MDAyNn0sIHsweDg2MWMsICAgIDB4MDAwYn0sCi17MHg4NjFkLCAgICAweDAwODZ9LCB7MHg4NjFlLCAgICAweDAwMDh9LCB7MHg4NjFmLCAgICAweDAwY2V9LAotezB4ODYyMCwgICAgMHgwMDhmfSwgezB4ODYyMSwgICAgMHgwMDc5fSwgezB4ODYyMiwgICAgMHgwMGJkfSwKLXsweDg2MjMsICAgIDB4MDA4OX0sIHsweDg2MjQsICAgIDB4MDA3Yn0sIHsweDg2MjUsICAgIDB4MDA3ZX0sCi17MHg4NjI2LCAgICAweDAwODZ9LCB7MHg4NjI3LCAgICAweDAwOGV9LCB7MHg4NjI4LCAgICAweDAwODF9LAotezB4ODYyOSwgICAgMHgwMDQwfSwgezB4ODYyYSwgICAgMHgwMDI2fSwgezB4ODYyYiwgICAgMHgwMDBifSwKLXsweDg2MmMsICAgIDB4MDA4Nn0sIHsweDg2MmQsICAgIDB4MDAwNH0sIHsweDg2MmUsICAgIDB4MDBjZX0sCi17MHg4NjJmLCAgICAweDAwOGZ9LCB7MHg4NjMwLCAgICAweDAwNzZ9LCB7MHg4NjMxLCAgICAweDAwYmR9LAotezB4ODYzMiwgICAgMHgwMDg5fSwgezB4ODYzMywgICAgMHgwMDdifSwgezB4ODYzNCwgICAgMHgwMDdlfSwKLXsweDg2MzUsICAgIDB4MDA4Nn0sIHsweDg2MzYsICAgIDB4MDA4ZX0sIHsweDg2MzcsICAgIDB4MDA4MX0sCi17MHg4NjM4LCAgICAweDAwMjB9LCB7MHg4NjM5LCAgICAweDAwMjZ9LCB7MHg4NjNhLCAgICAweDAwMGJ9LAotezB4ODYzYiwgICAgMHgwMDg2fSwgezB4ODYzYywgICAgMHgwMDAyfSwgezB4ODYzZCwgICAgMHgwMGNlfSwKLXsweDg2M2UsICAgIDB4MDA4Zn0sIHsweDg2M2YsICAgIDB4MDA3M30sIHsweDg2NDAsICAgIDB4MDBiZH0sCi17MHg4NjQxLCAgICAweDAwODl9LCB7MHg4NjQyLCAgICAweDAwN2J9LCB7MHg4NjQzLCAgICAweDAwN2V9LAotezB4ODY0NCwgICAgMHgwMDg2fSwgezB4ODY0NSwgICAgMHgwMDhlfSwgezB4ODY0NiwgICAgMHgwMDgxfSwKLXsweDg2NDcsICAgIDB4MDAxMH0sIHsweDg2NDgsICAgIDB4MDAyNn0sIHsweDg2NDksICAgIDB4MDAwYn0sCi17MHg4NjRhLCAgICAweDAwODZ9LCB7MHg4NjRiLCAgICAweDAwMDF9LCB7MHg4NjRjLCAgICAweDAwY2V9LAotezB4ODY0ZCwgICAgMHgwMDhmfSwgezB4ODY0ZSwgICAgMHgwMDcwfSwgezB4ODY0ZiwgICAgMHgwMGJkfSwKLXsweDg2NTAsICAgIDB4MDA4OX0sIHsweDg2NTEsICAgIDB4MDA3Yn0sIHsweDg2NTIsICAgIDB4MDA3ZX0sCi17MHg4NjUzLCAgICAweDAwODZ9LCB7MHg4NjU0LCAgICAweDAwOGV9LCB7MHg4NjU1LCAgICAweDAwODF9LAotezB4ODY1NiwgICAgMHgwMDA4fSwgezB4ODY1NywgICAgMHgwMDI2fSwgezB4ODY1OCwgICAgMHgwMDBifSwKLXsweDg2NTksICAgIDB4MDA4Nn0sIHsweDg2NWEsICAgIDB4MDAwOH0sIHsweDg2NWIsICAgIDB4MDBjZX0sCi17MHg4NjVjLCAgICAweDAwOGZ9LCB7MHg4NjVkLCAgICAweDAwNzl9LCB7MHg4NjVlLCAgICAweDAwYmR9LAotezB4ODY1ZiwgICAgMHgwMDg5fSwgezB4ODY2MCwgICAgMHgwMDdmfSwgezB4ODY2MSwgICAgMHgwMDdlfSwKLXsweDg2NjIsICAgIDB4MDA4Nn0sIHsweDg2NjMsICAgIDB4MDA4ZX0sIHsweDg2NjQsICAgIDB4MDA4MX0sCi17MHg4NjY1LCAgICAweDAwMDR9LCB7MHg4NjY2LCAgICAweDAwMjZ9LCB7MHg4NjY3LCAgICAweDAwMGJ9LAotezB4ODY2OCwgICAgMHgwMDg2fSwgezB4ODY2OSwgICAgMHgwMDA0fSwgezB4ODY2YSwgICAgMHgwMGNlfSwKLXsweDg2NmIsICAgIDB4MDA4Zn0sIHsweDg2NmMsICAgIDB4MDA3Nn0sIHsweDg2NmQsICAgIDB4MDBiZH0sCi17MHg4NjZlLCAgICAweDAwODl9LCB7MHg4NjZmLCAgICAweDAwN2Z9LCB7MHg4NjcwLCAgICAweDAwN2V9LAotezB4ODY3MSwgICAgMHgwMDg2fSwgezB4ODY3MiwgICAgMHgwMDhlfSwgezB4ODY3MywgICAgMHgwMDgxfSwKLXsweDg2NzQsICAgIDB4MDAwMn0sIHsweDg2NzUsICAgIDB4MDAyNn0sIHsweDg2NzYsICAgIDB4MDAwYn0sCi17MHg4Njc3LCAgICAweDAwOGF9LCB7MHg4Njc4LCAgICAweDAwMDJ9LCB7MHg4Njc5LCAgICAweDAwY2V9LAotezB4ODY3YSwgICAgMHgwMDhmfSwgezB4ODY3YiwgICAgMHgwMDczfSwgezB4ODY3YywgICAgMHgwMGJkfSwKLXsweDg2N2QsICAgIDB4MDA4OX0sIHsweDg2N2UsICAgIDB4MDA3Zn0sIHsweDg2N2YsICAgIDB4MDA3ZX0sCi17MHg4NjgwLCAgICAweDAwODZ9LCB7MHg4NjgxLCAgICAweDAwOGV9LCB7MHg4NjgyLCAgICAweDAwODF9LAotezB4ODY4MywgICAgMHgwMDAxfSwgezB4ODY4NCwgICAgMHgwMDI2fSwgezB4ODY4NSwgICAgMHgwMDA4fSwKLXsweDg2ODYsICAgIDB4MDA4Nn0sIHsweDg2ODcsICAgIDB4MDAwMX0sIHsweDg2ODgsICAgIDB4MDBjZX0sCi17MHg4Njg5LCAgICAweDAwOGZ9LCB7MHg4NjhhLCAgICAweDAwNzB9LCB7MHg4NjhiLCAgICAweDAwYmR9LAotezB4ODY4YywgICAgMHgwMDg5fSwgezB4ODY4ZCwgICAgMHgwMDdmfSwgezB4ODY4ZSwgICAgMHgwMGI2fSwKLXsweDg2OGYsICAgIDB4MDA4Zn0sIHsweDg2OTAsICAgIDB4MDA3Zn0sIHsweDg2OTEsICAgIDB4MDA4MX0sCi17MHg4NjkyLCAgICAweDAwMGZ9LCB7MHg4NjkzLCAgICAweDAwMjZ9LCB7MHg4Njk0LCAgICAweDAwMDN9LAotezB4ODY5NSwgICAgMHgwMDdlfSwgezB4ODY5NiwgICAgMHgwMDg3fSwgezB4ODY5NywgICAgMHgwMDQ3fSwKLXsweDg2OTgsICAgIDB4MDBiNn0sIHsweDg2OTksICAgIDB4MDAxMn0sIHsweDg2OWEsICAgIDB4MDAwOX0sCi17MHg4NjliLCAgICAweDAwODR9LCB7MHg4NjljLCAgICAweDAwMDN9LCB7MHg4NjlkLCAgICAweDAwODF9LAotezB4ODY5ZSwgICAgMHgwMDAzfSwgezB4ODY5ZiwgICAgMHgwMDI3fSwgezB4ODZhMCwgICAgMHgwMDA2fSwKLXsweDg2YTEsICAgIDB4MDA3Y30sIHsweDg2YTIsICAgIDB4MDAxMn0sIHsweDg2YTMsICAgIDB4MDAwOX0sCi17MHg4NmE0LCAgICAweDAwN2V9LCB7MHg4NmE1LCAgICAweDAwODV9LCB7MHg4NmE2LCAgICAweDAwZmV9LAotezB4ODZhNywgICAgMHgwMGI2fSwgezB4ODZhOCwgICAgMHgwMDEyfSwgezB4ODZhOSwgICAgMHgwMDA2fSwKLXsweDg2YWEsICAgIDB4MDA4NH0sIHsweDg2YWIsICAgIDB4MDAwN30sIHsweDg2YWMsICAgIDB4MDA4MX0sCi17MHg4NmFkLCAgICAweDAwMDd9LCB7MHg4NmFlLCAgICAweDAwMjd9LCB7MHg4NmFmLCAgICAweDAwMDh9LAotezB4ODZiMCwgICAgMHgwMDhifSwgezB4ODZiMSwgICAgMHgwMDAxfSwgezB4ODZiMiwgICAgMHgwMGI3fSwKLXsweDg2YjMsICAgIDB4MDAxMn0sIHsweDg2YjQsICAgIDB4MDAwNn0sIHsweDg2YjUsICAgIDB4MDA3ZX0sCi17MHg4NmI2LCAgICAweDAwODZ9LCB7MHg4NmI3LCAgICAweDAwZDV9LCB7MHg4NmI4LCAgICAweDAwYjZ9LAotezB4ODZiOSwgICAgMHgwMDhmfSwgezB4ODZiYSwgICAgMHgwMDgyfSwgezB4ODZiYiwgICAgMHgwMDI2fSwKLXsweDg2YmMsICAgIDB4MDAwYX0sIHsweDg2YmQsICAgIDB4MDA3Y30sIHsweDg2YmUsICAgIDB4MDA4Zn0sCi17MHg4NmJmLCAgICAweDAwODJ9LCB7MHg4NmMwLCAgICAweDAwNGZ9LCB7MHg4NmMxLCAgICAweDAwYjd9LAotezB4ODZjMiwgICAgMHgwMDEyfSwgezB4ODZjMywgICAgMHgwMDA2fSwgezB4ODZjNCwgICAgMHgwMDdlfSwKLXsweDg2YzUsICAgIDB4MDA4NX0sIHsweDg2YzYsICAgIDB4MDBjMH0sIHsweDg2YzcsICAgIDB4MDBiNn0sCi17MHg4NmM4LCAgICAweDAwMTJ9LCB7MHg4NmM5LCAgICAweDAwMDZ9LCB7MHg4NmNhLCAgICAweDAwODR9LAotezB4ODZjYiwgICAgMHgwMDNmfSwgezB4ODZjYywgICAgMHgwMDgxfSwgezB4ODZjZCwgICAgMHgwMDNmfSwKLXsweDg2Y2UsICAgIDB4MDAyN30sIHsweDg2Y2YsICAgIDB4MDAxMH0sIHsweDg2ZDAsICAgIDB4MDA4Yn0sCi17MHg4NmQxLCAgICAweDAwMDh9LCB7MHg4NmQyLCAgICAweDAwYjd9LCB7MHg4NmQzLCAgICAweDAwMTJ9LAotezB4ODZkNCwgICAgMHgwMDA2fSwgezB4ODZkNSwgICAgMHgwMGI2fSwgezB4ODZkNiwgICAgMHgwMDEyfSwKLXsweDg2ZDcsICAgIDB4MDAwOX0sIHsweDg2ZDgsICAgIDB4MDA4NH0sIHsweDg2ZDksICAgIDB4MDBmY30sCi17MHg4NmRhLCAgICAweDAwYjd9LCB7MHg4NmRiLCAgICAweDAwMTJ9LCB7MHg4NmRjLCAgICAweDAwMDl9LAotezB4ODZkZCwgICAgMHgwMDdlfSwgezB4ODZkZSwgICAgMHgwMDg1fSwgezB4ODZkZiwgICAgMHgwMGZlfSwKLXsweDg2ZTAsICAgIDB4MDBjZX0sIHsweDg2ZTEsICAgIDB4MDA4Zn0sIHsweDg2ZTIsICAgIDB4MDA3MH0sCi17MHg4NmUzLCAgICAweDAwMTh9LCB7MHg4NmU0LCAgICAweDAwY2V9LCB7MHg4NmU1LCAgICAweDAwOGZ9LAotezB4ODZlNiwgICAgMHgwMDg0fSwgezB4ODZlNywgICAgMHgwMGM2fSwgezB4ODZlOCwgICAgMHgwMDBjfSwKLXsweDg2ZTksICAgIDB4MDBiZH0sIHsweDg2ZWEsICAgIDB4MDA4OX0sIHsweDg2ZWIsICAgIDB4MDA2Zn0sCi17MHg4NmVjLCAgICAweDAwY2V9LCB7MHg4NmVkLCAgICAweDAwOGZ9LCB7MHg4NmVlLCAgICAweDAwODR9LAotezB4ODZlZiwgICAgMHgwMDE4fSwgezB4ODZmMCwgICAgMHgwMGNlfSwgezB4ODZmMSwgICAgMHgwMDhmfSwKLXsweDg2ZjIsICAgIDB4MDA3MH0sIHsweDg2ZjMsICAgIDB4MDBjNn0sIHsweDg2ZjQsICAgIDB4MDAwY30sCi17MHg4NmY1LCAgICAweDAwYmR9LCB7MHg4NmY2LCAgICAweDAwODl9LCB7MHg4NmY3LCAgICAweDAwNmZ9LAotezB4ODZmOCwgICAgMHgwMGQ2fSwgezB4ODZmOSwgICAgMHgwMDgzfSwgezB4ODZmYSwgICAgMHgwMGMxfSwKLXsweDg2ZmIsICAgIDB4MDA0Zn0sIHsweDg2ZmMsICAgIDB4MDAyZH0sIHsweDg2ZmQsICAgIDB4MDAwM30sCi17MHg4NmZlLCAgICAweDAwN2V9LCB7MHg4NmZmLCAgICAweDAwODd9LCB7MHg4NzAwLCAgICAweDAwNDB9LAotezB4ODcwMSwgICAgMHgwMGI2fSwgezB4ODcwMiwgICAgMHgwMDhmfSwgezB4ODcwMywgICAgMHgwMDdmfSwKLXsweDg3MDQsICAgIDB4MDA4MX0sIHsweDg3MDUsICAgIDB4MDAwN30sIHsweDg3MDYsICAgIDB4MDAyN30sCi17MHg4NzA3LCAgICAweDAwMGZ9LCB7MHg4NzA4LCAgICAweDAwODF9LCB7MHg4NzA5LCAgICAweDAwMGJ9LAotezB4ODcwYSwgICAgMHgwMDI3fSwgezB4ODcwYiwgICAgMHgwMDE1fSwgezB4ODcwYywgICAgMHgwMDgxfSwKLXsweDg3MGQsICAgIDB4MDAwZH0sIHsweDg3MGUsICAgIDB4MDAyN30sIHsweDg3MGYsICAgIDB4MDAxYn0sCi17MHg4NzEwLCAgICAweDAwODF9LCB7MHg4NzExLCAgICAweDAwMGV9LCB7MHg4NzEyLCAgICAweDAwMjd9LAotezB4ODcxMywgICAgMHgwMDIxfSwgezB4ODcxNCwgICAgMHgwMDdlfSwgezB4ODcxNSwgICAgMHgwMDg3fSwKLXsweDg3MTYsICAgIDB4MDA0MH0sIHsweDg3MTcsICAgIDB4MDBmN30sIHsweDg3MTgsICAgIDB4MDA4Zn0sCi17MHg4NzE5LCAgICAweDAwN2J9LCB7MHg4NzFhLCAgICAweDAwODZ9LCB7MHg4NzFiLCAgICAweDAwMDJ9LAotezB4ODcxYywgICAgMHgwMGI3fSwgezB4ODcxZCwgICAgMHgwMDhmfSwgezB4ODcxZSwgICAgMHgwMDdhfSwKLXsweDg3MWYsICAgIDB4MDAyMH0sIHsweDg3MjAsICAgIDB4MDAxY30sIHsweDg3MjEsICAgIDB4MDBmN30sCi17MHg4NzIyLCAgICAweDAwOGZ9LCB7MHg4NzIzLCAgICAweDAwNzh9LCB7MHg4NzI0LCAgICAweDAwODZ9LAotezB4ODcyNSwgICAgMHgwMDAyfSwgezB4ODcyNiwgICAgMHgwMGI3fSwgezB4ODcyNywgICAgMHgwMDhmfSwKLXsweDg3MjgsICAgIDB4MDA3N30sIHsweDg3MjksICAgIDB4MDAyMH0sIHsweDg3MmEsICAgIDB4MDAxMn0sCi17MHg4NzJiLCAgICAweDAwZjd9LCB7MHg4NzJjLCAgICAweDAwOGZ9LCB7MHg4NzJkLCAgICAweDAwNzV9LAotezB4ODcyZSwgICAgMHgwMDg2fSwgezB4ODcyZiwgICAgMHgwMDAyfSwgezB4ODczMCwgICAgMHgwMGI3fSwKLXsweDg3MzEsICAgIDB4MDA4Zn0sIHsweDg3MzIsICAgIDB4MDA3NH0sIHsweDg3MzMsICAgIDB4MDAyMH0sCi17MHg4NzM0LCAgICAweDAwMDh9LCB7MHg4NzM1LCAgICAweDAwZjd9LCB7MHg4NzM2LCAgICAweDAwOGZ9LAotezB4ODczNywgICAgMHgwMDcyfSwgezB4ODczOCwgICAgMHgwMDg2fSwgezB4ODczOSwgICAgMHgwMDAyfSwKLXsweDg3M2EsICAgIDB4MDBiN30sIHsweDg3M2IsICAgIDB4MDA4Zn0sIHsweDg3M2MsICAgIDB4MDA3MX0sCi17MHg4NzNkLCAgICAweDAwN2V9LCB7MHg4NzNlLCAgICAweDAwODd9LCB7MHg4NzNmLCAgICAweDAwNDd9LAotezB4ODc0MCwgICAgMHgwMDg2fSwgezB4ODc0MSwgICAgMHgwMDA0fSwgezB4ODc0MiwgICAgMHgwMDk3fSwKLXsweDg3NDMsICAgIDB4MDA0MH0sIHsweDg3NDQsICAgIDB4MDA3ZX0sIHsweDg3NDUsICAgIDB4MDA4OX0sCi17MHg4NzQ2LCAgICAweDAwNmV9LCB7MHg4NzQ3LCAgICAweDAwY2V9LCB7MHg4NzQ4LCAgICAweDAwOGZ9LAotezB4ODc0OSwgICAgMHgwMDcyfSwgezB4ODc0YSwgICAgMHgwMGJkfSwgezB4ODc0YiwgICAgMHgwMDg5fSwKLXsweDg3NGMsICAgIDB4MDBmN30sIHsweDg3NGQsICAgIDB4MDBjZX0sIHsweDg3NGUsICAgIDB4MDA4Zn0sCi17MHg4NzRmLCAgICAweDAwNzV9LCB7MHg4NzUwLCAgICAweDAwYmR9LCB7MHg4NzUxLCAgICAweDAwODl9LAotezB4ODc1MiwgICAgMHgwMGY3fSwgezB4ODc1MywgICAgMHgwMGNlfSwgezB4ODc1NCwgICAgMHgwMDhmfSwKLXsweDg3NTUsICAgIDB4MDA3OH0sIHsweDg3NTYsICAgIDB4MDBiZH0sIHsweDg3NTcsICAgIDB4MDA4OX0sCi17MHg4NzU4LCAgICAweDAwZjd9LCB7MHg4NzU5LCAgICAweDAwY2V9LCB7MHg4NzVhLCAgICAweDAwOGZ9LAotezB4ODc1YiwgICAgMHgwMDdifSwgezB4ODc1YywgICAgMHgwMGJkfSwgezB4ODc1ZCwgICAgMHgwMDg5fSwKLXsweDg3NWUsICAgIDB4MDBmN30sIHsweDg3NWYsICAgIDB4MDA0Zn0sIHsweDg3NjAsICAgIDB4MDBiN30sCi17MHg4NzYxLCAgICAweDAwOGZ9LCB7MHg4NzYyLCAgICAweDAwN2R9LCB7MHg4NzYzLCAgICAweDAwYjd9LAotezB4ODc2NCwgICAgMHgwMDhmfSwgezB4ODc2NSwgICAgMHgwMDgxfSwgezB4ODc2NiwgICAgMHgwMGI2fSwKLXsweDg3NjcsICAgIDB4MDA4Zn0sIHsweDg3NjgsICAgIDB4MDA3Mn0sIHsweDg3NjksICAgIDB4MDAyN30sCi17MHg4NzZhLCAgICAweDAwNDd9LCB7MHg4NzZiLCAgICAweDAwN2N9LCB7MHg4NzZjLCAgICAweDAwOGZ9LAotezB4ODc2ZCwgICAgMHgwMDdkfSwgezB4ODc2ZSwgICAgMHgwMGI2fSwgezB4ODc2ZiwgICAgMHgwMDhmfSwKLXsweDg3NzAsICAgIDB4MDA3NX0sIHsweDg3NzEsICAgIDB4MDAyN30sIHsweDg3NzIsICAgIDB4MDAzZn0sCi17MHg4NzczLCAgICAweDAwN2N9LCB7MHg4Nzc0LCAgICAweDAwOGZ9LCB7MHg4Nzc1LCAgICAweDAwN2R9LAotezB4ODc3NiwgICAgMHgwMGI2fSwgezB4ODc3NywgICAgMHgwMDhmfSwgezB4ODc3OCwgICAgMHgwMDc4fSwKLXsweDg3NzksICAgIDB4MDAyN30sIHsweDg3N2EsICAgIDB4MDAzN30sIHsweDg3N2IsICAgIDB4MDA3Y30sCi17MHg4NzdjLCAgICAweDAwOGZ9LCB7MHg4NzdkLCAgICAweDAwN2R9LCB7MHg4NzdlLCAgICAweDAwYjZ9LAotezB4ODc3ZiwgICAgMHgwMDhmfSwgezB4ODc4MCwgICAgMHgwMDdifSwgezB4ODc4MSwgICAgMHgwMDI3fSwKLXsweDg3ODIsICAgIDB4MDAyZn0sIHsweDg3ODMsICAgIDB4MDA3Zn0sIHsweDg3ODQsICAgIDB4MDA4Zn0sCi17MHg4Nzg1LCAgICAweDAwN2R9LCB7MHg4Nzg2LCAgICAweDAwN2N9LCB7MHg4Nzg3LCAgICAweDAwOGZ9LAotezB4ODc4OCwgICAgMHgwMDgxfSwgezB4ODc4OSwgICAgMHgwMDdhfSwgezB4ODc4YSwgICAgMHgwMDhmfSwKLXsweDg3OGIsICAgIDB4MDA3Mn0sIHsweDg3OGMsICAgIDB4MDAyN30sIHsweDg3OGQsICAgIDB4MDAxYn0sCi17MHg4NzhlLCAgICAweDAwN2N9LCB7MHg4NzhmLCAgICAweDAwOGZ9LCB7MHg4NzkwLCAgICAweDAwN2R9LAotezB4ODc5MSwgICAgMHgwMDdhfSwgezB4ODc5MiwgICAgMHgwMDhmfSwgezB4ODc5MywgICAgMHgwMDc1fSwKLXsweDg3OTQsICAgIDB4MDAyN30sIHsweDg3OTUsICAgIDB4MDAxNn0sIHsweDg3OTYsICAgIDB4MDA3Y30sCi17MHg4Nzk3LCAgICAweDAwOGZ9LCB7MHg4Nzk4LCAgICAweDAwN2R9LCB7MHg4Nzk5LCAgICAweDAwN2F9LAotezB4ODc5YSwgICAgMHgwMDhmfSwgezB4ODc5YiwgICAgMHgwMDc4fSwgezB4ODc5YywgICAgMHgwMDI3fSwKLXsweDg3OWQsICAgIDB4MDAxMX0sIHsweDg3OWUsICAgIDB4MDA3Y30sIHsweDg3OWYsICAgIDB4MDA4Zn0sCi17MHg4N2EwLCAgICAweDAwN2R9LCB7MHg4N2ExLCAgICAweDAwN2F9LCB7MHg4N2EyLCAgICAweDAwOGZ9LAotezB4ODdhMywgICAgMHgwMDdifSwgezB4ODdhNCwgICAgMHgwMDI3fSwgezB4ODdhNSwgICAgMHgwMDBjfSwKLXsweDg3YTYsICAgIDB4MDA3ZX0sIHsweDg3YTcsICAgIDB4MDA4N30sIHsweDg3YTgsICAgIDB4MDA4M30sCi17MHg4N2E5LCAgICAweDAwN2F9LCB7MHg4N2FhLCAgICAweDAwOGZ9LCB7MHg4N2FiLCAgICAweDAwNzV9LAotezB4ODdhYywgICAgMHgwMDdhfSwgezB4ODdhZCwgICAgMHgwMDhmfSwgezB4ODdhZSwgICAgMHgwMDc4fSwKLXsweDg3YWYsICAgIDB4MDA3YX0sIHsweDg3YjAsICAgIDB4MDA4Zn0sIHsweDg3YjEsICAgIDB4MDA3Yn0sCi17MHg4N2IyLCAgICAweDAwY2V9LCB7MHg4N2IzLCAgICAweDAwYzF9LCB7MHg4N2I0LCAgICAweDAwZmN9LAotezB4ODdiNSwgICAgMHgwMGY2fSwgezB4ODdiNiwgICAgMHgwMDhmfSwgezB4ODdiNywgICAgMHgwMDdkfSwKLXsweDg3YjgsICAgIDB4MDAzYX0sIHsweDg3YjksICAgIDB4MDBhNn0sIHsweDg3YmEsICAgIDB4MDAwMH0sCi17MHg4N2JiLCAgICAweDAwYjd9LCB7MHg4N2JjLCAgICAweDAwMTJ9LCB7MHg4N2JkLCAgICAweDAwNzB9LAotezB4ODdiZSwgICAgMHgwMGI2fSwgezB4ODdiZiwgICAgMHgwMDhmfSwgezB4ODdjMCwgICAgMHgwMDcyfSwKLXsweDg3YzEsICAgIDB4MDAyNn0sIHsweDg3YzIsICAgIDB4MDAwM30sIHsweDg3YzMsICAgIDB4MDA3ZX0sCi17MHg4N2M0LCAgICAweDAwODd9LCB7MHg4N2M1LCAgICAweDAwZmF9LCB7MHg4N2M2LCAgICAweDAwYjZ9LAotezB4ODdjNywgICAgMHgwMDhmfSwgezB4ODdjOCwgICAgMHgwMDc1fSwgezB4ODdjOSwgICAgMHgwMDI2fSwKLXsweDg3Y2EsICAgIDB4MDAwYX0sIHsweDg3Y2IsICAgIDB4MDAxOH0sIHsweDg3Y2MsICAgIDB4MDBjZX0sCi17MHg4N2NkLCAgICAweDAwOGZ9LCB7MHg4N2NlLCAgICAweDAwNzN9LCB7MHg4N2NmLCAgICAweDAwYmR9LAotezB4ODdkMCwgICAgMHgwMDg5fSwgezB4ODdkMSwgICAgMHgwMGQ1fSwgezB4ODdkMiwgICAgMHgwMDdlfSwKLXsweDg3ZDMsICAgIDB4MDA4N30sIHsweDg3ZDQsICAgIDB4MDBmYX0sIHsweDg3ZDUsICAgIDB4MDBiNn0sCi17MHg4N2Q2LCAgICAweDAwOGZ9LCB7MHg4N2Q3LCAgICAweDAwNzh9LCB7MHg4N2Q4LCAgICAweDAwMjZ9LAotezB4ODdkOSwgICAgMHgwMDBhfSwgezB4ODdkYSwgICAgMHgwMDE4fSwgezB4ODdkYiwgICAgMHgwMGNlfSwKLXsweDg3ZGMsICAgIDB4MDA4Zn0sIHsweDg3ZGQsICAgIDB4MDA3Nn0sIHsweDg3ZGUsICAgIDB4MDBiZH0sCi17MHg4N2RmLCAgICAweDAwODl9LCB7MHg4N2UwLCAgICAweDAwZDV9LCB7MHg4N2UxLCAgICAweDAwN2V9LAotezB4ODdlMiwgICAgMHgwMDg3fSwgezB4ODdlMywgICAgMHgwMGZhfSwgezB4ODdlNCwgICAgMHgwMGI2fSwKLXsweDg3ZTUsICAgIDB4MDA4Zn0sIHsweDg3ZTYsICAgIDB4MDA3Yn0sIHsweDg3ZTcsICAgIDB4MDAyNn0sCi17MHg4N2U4LCAgICAweDAwMGF9LCB7MHg4N2U5LCAgICAweDAwMTh9LCB7MHg4N2VhLCAgICAweDAwY2V9LAotezB4ODdlYiwgICAgMHgwMDhmfSwgezB4ODdlYywgICAgMHgwMDc5fSwgezB4ODdlZCwgICAgMHgwMGJkfSwKLXsweDg3ZWUsICAgIDB4MDA4OX0sIHsweDg3ZWYsICAgIDB4MDBkNX0sIHsweDg3ZjAsICAgIDB4MDA3ZX0sCi17MHg4N2YxLCAgICAweDAwODd9LCB7MHg4N2YyLCAgICAweDAwZmF9LCB7MHg4N2YzLCAgICAweDAwODZ9LAotezB4ODdmNCwgICAgMHgwMDA1fSwgezB4ODdmNSwgICAgMHgwMDk3fSwgezB4ODdmNiwgICAgMHgwMDQwfSwKLXsweDg3ZjcsICAgIDB4MDA3ZX0sIHsweDg3ZjgsICAgIDB4MDA4OX0sIHsweDg3ZjksICAgIDB4MDAwMH0sCi17MHg4N2ZhLCAgICAweDAwYjZ9LCB7MHg4N2ZiLCAgICAweDAwOGZ9LCB7MHg4N2ZjLCAgICAweDAwNzV9LAotezB4ODdmZCwgICAgMHgwMDgxfSwgezB4ODdmZSwgICAgMHgwMDA3fSwgezB4ODdmZiwgICAgMHgwMDJlfSwKLXsweDg4MDAsICAgIDB4MDBmMn0sIHsweDg4MDEsICAgIDB4MDBmNn0sIHsweDg4MDIsICAgIDB4MDAxMn0sCi17MHg4ODAzLCAgICAweDAwMDZ9LCB7MHg4ODA0LCAgICAweDAwYzR9LCB7MHg4ODA1LCAgICAweDAwZjh9LAotezB4ODgwNiwgICAgMHgwMDFifSwgezB4ODgwNywgICAgMHgwMGI3fSwgezB4ODgwOCwgICAgMHgwMDEyfSwKLXsweDg4MDksICAgIDB4MDAwNn0sIHsweDg4MGEsICAgIDB4MDBiNn0sIHsweDg4MGIsICAgIDB4MDA4Zn0sCi17MHg4ODBjLCAgICAweDAwNzh9LCB7MHg4ODBkLCAgICAweDAwODF9LCB7MHg4ODBlLCAgICAweDAwMDd9LAotezB4ODgwZiwgICAgMHgwMDJlfSwgezB4ODgxMCwgICAgMHgwMGUyfSwgezB4ODgxMSwgICAgMHgwMDQ4fSwKLXsweDg4MTIsICAgIDB4MDA0OH0sIHsweDg4MTMsICAgIDB4MDA0OH0sIHsweDg4MTQsICAgIDB4MDBmNn0sCi17MHg4ODE1LCAgICAweDAwMTJ9LCB7MHg4ODE2LCAgICAweDAwMDZ9LCB7MHg4ODE3LCAgICAweDAwYzR9LAotezB4ODgxOCwgICAgMHgwMGM3fSwgezB4ODgxOSwgICAgMHgwMDFifSwgezB4ODgxYSwgICAgMHgwMGI3fSwKLXsweDg4MWIsICAgIDB4MDAxMn0sIHsweDg4MWMsICAgIDB4MDAwNn0sIHsweDg4MWQsICAgIDB4MDBiNn0sCi17MHg4ODFlLCAgICAweDAwOGZ9LCB7MHg4ODFmLCAgICAweDAwN2J9LCB7MHg4ODIwLCAgICAweDAwODF9LAotezB4ODgyMSwgICAgMHgwMDA3fSwgezB4ODgyMiwgICAgMHgwMDJlfSwgezB4ODgyMywgICAgMHgwMGNmfSwKLXsweDg4MjQsICAgIDB4MDBmNn0sIHsweDg4MjUsICAgIDB4MDAxMn0sIHsweDg4MjYsICAgIDB4MDAwNX0sCi17MHg4ODI3LCAgICAweDAwYzR9LCB7MHg4ODI4LCAgICAweDAwZjh9LCB7MHg4ODI5LCAgICAweDAwMWJ9LAotezB4ODgyYSwgICAgMHgwMGI3fSwgezB4ODgyYiwgICAgMHgwMDEyfSwgezB4ODgyYywgICAgMHgwMDA1fSwKLXsweDg4MmQsICAgIDB4MDA4Nn0sIHsweDg4MmUsICAgIDB4MDAwMH0sIHsweDg4MmYsICAgIDB4MDBmNn0sCi17MHg4ODMwLCAgICAweDAwOGZ9LCB7MHg4ODMxLCAgICAweDAwNzF9LCB7MHg4ODMyLCAgICAweDAwYmR9LAotezB4ODgzMywgICAgMHgwMDg5fSwgezB4ODgzNCwgICAgMHgwMDk0fSwgezB4ODgzNSwgICAgMHgwMDg2fSwKLXsweDg4MzYsICAgIDB4MDAwMX0sIHsweDg4MzcsICAgIDB4MDBmNn0sIHsweDg4MzgsICAgIDB4MDA4Zn0sCi17MHg4ODM5LCAgICAweDAwNzR9LCB7MHg4ODNhLCAgICAweDAwYmR9LCB7MHg4ODNiLCAgICAweDAwODl9LAotezB4ODgzYywgICAgMHgwMDk0fSwgezB4ODgzZCwgICAgMHgwMDg2fSwgezB4ODgzZSwgICAgMHgwMDAyfSwKLXsweDg4M2YsICAgIDB4MDBmNn0sIHsweDg4NDAsICAgIDB4MDA4Zn0sIHsweDg4NDEsICAgIDB4MDA3N30sCi17MHg4ODQyLCAgICAweDAwYmR9LCB7MHg4ODQzLCAgICAweDAwODl9LCB7MHg4ODQ0LCAgICAweDAwOTR9LAotezB4ODg0NSwgICAgMHgwMDg2fSwgezB4ODg0NiwgICAgMHgwMDAzfSwgezB4ODg0NywgICAgMHgwMGY2fSwKLXsweDg4NDgsICAgIDB4MDA4Zn0sIHsweDg4NDksICAgIDB4MDA3YX0sIHsweDg4NGEsICAgIDB4MDBiZH0sCi17MHg4ODRiLCAgICAweDAwODl9LCB7MHg4ODRjLCAgICAweDAwOTR9LCB7MHg4ODRkLCAgICAweDAwY2V9LAotezB4ODg0ZSwgICAgMHgwMDhmfSwgezB4ODg0ZiwgICAgMHgwMDcwfSwgezB4ODg1MCwgICAgMHgwMGE2fSwKLXsweDg4NTEsICAgIDB4MDAwMX0sIHsweDg4NTIsICAgIDB4MDA4MX0sIHsweDg4NTMsICAgIDB4MDAwMX0sCi17MHg4ODU0LCAgICAweDAwMjd9LCB7MHg4ODU1LCAgICAweDAwMDd9LCB7MHg4ODU2LCAgICAweDAwODF9LAotezB4ODg1NywgICAgMHgwMDAzfSwgezB4ODg1OCwgICAgMHgwMDI3fSwgezB4ODg1OSwgICAgMHgwMDAzfSwKLXsweDg4NWEsICAgIDB4MDA3ZX0sIHsweDg4NWIsICAgIDB4MDA4OH0sIHsweDg4NWMsICAgIDB4MDA2Nn0sCi17MHg4ODVkLCAgICAweDAwYTZ9LCB7MHg4ODVlLCAgICAweDAwMDB9LCB7MHg4ODVmLCAgICAweDAwYjh9LAotezB4ODg2MCwgICAgMHgwMDhmfSwgezB4ODg2MSwgICAgMHgwMDgxfSwgezB4ODg2MiwgICAgMHgwMDg0fSwKLXsweDg4NjMsICAgIDB4MDAwMX0sIHsweDg4NjQsICAgIDB4MDAyNn0sIHsweDg4NjUsICAgIDB4MDAwYn0sCi17MHg4ODY2LCAgICAweDAwOGN9LCB7MHg4ODY3LCAgICAweDAwOGZ9LCB7MHg4ODY4LCAgICAweDAwNzl9LAotezB4ODg2OSwgICAgMHgwMDJjfSwgezB4ODg2YSwgICAgMHgwMDBlfSwgezB4ODg2YiwgICAgMHgwMDA4fSwKLXsweDg4NmMsICAgIDB4MDAwOH0sIHsweDg4NmQsICAgIDB4MDAwOH0sIHsweDg4NmUsICAgIDB4MDA3ZX0sCi17MHg4ODZmLCAgICAweDAwODh9LCB7MHg4ODcwLCAgICAweDAwNTB9LCB7MHg4ODcxLCAgICAweDAwYjZ9LAotezB4ODg3MiwgICAgMHgwMDEyfSwgezB4ODg3MywgICAgMHgwMDA0fSwgezB4ODg3NCwgICAgMHgwMDhhfSwKLXsweDg4NzUsICAgIDB4MDA0MH0sIHsweDg4NzYsICAgIDB4MDBiN30sIHsweDg4NzcsICAgIDB4MDAxMn0sCi17MHg4ODc4LCAgICAweDAwMDR9LCB7MHg4ODc5LCAgICAweDAwYjZ9LCB7MHg4ODdhLCAgICAweDAwMTJ9LAotezB4ODg3YiwgICAgMHgwMDA0fSwgezB4ODg3YywgICAgMHgwMDg0fSwgezB4ODg3ZCwgICAgMHgwMGZifSwKLXsweDg4N2UsICAgIDB4MDA4NH0sIHsweDg4N2YsICAgIDB4MDBlZn0sIHsweDg4ODAsICAgIDB4MDBiN30sCi17MHg4ODgxLCAgICAweDAwMTJ9LCB7MHg4ODgyLCAgICAweDAwMDR9LCB7MHg4ODgzLCAgICAweDAwYjZ9LAotezB4ODg4NCwgICAgMHgwMDEyfSwgezB4ODg4NSwgICAgMHgwMDA3fSwgezB4ODg4NiwgICAgMHgwMDM2fSwKLXsweDg4ODcsICAgIDB4MDBiNn0sIHsweDg4ODgsICAgIDB4MDA4Zn0sIHsweDg4ODksICAgIDB4MDA3Y30sCi17MHg4ODhhLCAgICAweDAwNDh9LCB7MHg4ODhiLCAgICAweDAwNDh9LCB7MHg4ODhjLCAgICAweDAwYjd9LAotezB4ODg4ZCwgICAgMHgwMDEyfSwgezB4ODg4ZSwgICAgMHgwMDA3fSwgezB4ODg4ZiwgICAgMHgwMDg2fSwKLXsweDg4OTAsICAgIDB4MDAwMX0sIHsweDg4OTEsICAgIDB4MDBiYX0sIHsweDg4OTIsICAgIDB4MDAxMn0sCi17MHg4ODkzLCAgICAweDAwMDR9LCB7MHg4ODk0LCAgICAweDAwYjd9LCB7MHg4ODk1LCAgICAweDAwMTJ9LAotezB4ODg5NiwgICAgMHgwMDA0fSwgezB4ODg5NywgICAgMHgwMDAxfSwgezB4ODg5OCwgICAgMHgwMDAxfSwKLXsweDg4OTksICAgIDB4MDAwMX0sIHsweDg4OWEsICAgIDB4MDAwMX0sIHsweDg4OWIsICAgIDB4MDAwMX0sCi17MHg4ODljLCAgICAweDAwMDF9LCB7MHg4ODlkLCAgICAweDAwODZ9LCB7MHg4ODllLCAgICAweDAwZmV9LAotezB4ODg5ZiwgICAgMHgwMGI0fSwgezB4ODhhMCwgICAgMHgwMDEyfSwgezB4ODhhMSwgICAgMHgwMDA0fSwKLXsweDg4YTIsICAgIDB4MDBiN30sIHsweDg4YTMsICAgIDB4MDAxMn0sIHsweDg4YTQsICAgIDB4MDAwNH0sCi17MHg4OGE1LCAgICAweDAwODZ9LCB7MHg4OGE2LCAgICAweDAwMDJ9LCB7MHg4OGE3LCAgICAweDAwYmF9LAotezB4ODhhOCwgICAgMHgwMDEyfSwgezB4ODhhOSwgICAgMHgwMDA0fSwgezB4ODhhYSwgICAgMHgwMGI3fSwKLXsweDg4YWIsICAgIDB4MDAxMn0sIHsweDg4YWMsICAgIDB4MDAwNH0sIHsweDg4YWQsICAgIDB4MDA4Nn0sCi17MHg4OGFlLCAgICAweDAwZmR9LCB7MHg4OGFmLCAgICAweDAwYjR9LCB7MHg4OGIwLCAgICAweDAwMTJ9LAotezB4ODhiMSwgICAgMHgwMDA0fSwgezB4ODhiMiwgICAgMHgwMGI3fSwgezB4ODhiMywgICAgMHgwMDEyfSwKLXsweDg4YjQsICAgIDB4MDAwNH0sIHsweDg4YjUsICAgIDB4MDAzMn0sIHsweDg4YjYsICAgIDB4MDBiN30sCi17MHg4OGI3LCAgICAweDAwMTJ9LCB7MHg4OGI4LCAgICAweDAwMDd9LCB7MHg4OGI5LCAgICAweDAwYjZ9LAotezB4ODhiYSwgICAgMHgwMDEyfSwgezB4ODhiYiwgICAgMHgwMDAwfSwgezB4ODhiYywgICAgMHgwMDg0fSwKLXsweDg4YmQsICAgIDB4MDAwOH0sIHsweDg4YmUsICAgIDB4MDA4MX0sIHsweDg4YmYsICAgIDB4MDAwOH0sCi17MHg4OGMwLCAgICAweDAwMjd9LCB7MHg4OGMxLCAgICAweDAwMGZ9LCB7MHg4OGMyLCAgICAweDAwN2N9LAotezB4ODhjMywgICAgMHgwMDgyfSwgezB4ODhjNCwgICAgMHgwMDA4fSwgezB4ODhjNSwgICAgMHgwMDI2fSwKLXsweDg4YzYsICAgIDB4MDAwN30sIHsweDg4YzcsICAgIDB4MDA4Nn0sIHsweDg4YzgsICAgIDB4MDA3Nn0sCi17MHg4OGM5LCAgICAweDAwOTd9LCB7MHg4OGNhLCAgICAweDAwNDB9LCB7MHg4OGNiLCAgICAweDAwN2V9LAotezB4ODhjYywgICAgMHgwMDg5fSwgezB4ODhjZCwgICAgMHgwMDZlfSwgezB4ODhjZSwgICAgMHgwMDdlfSwKLXsweDg4Y2YsICAgIDB4MDA4Nn0sIHsweDg4ZDAsICAgIDB4MDBlY30sIHsweDg4ZDEsICAgIDB4MDBiNn0sCi17MHg4OGQyLCAgICAweDAwOGZ9LCB7MHg4OGQzLCAgICAweDAwN2Z9LCB7MHg4OGQ0LCAgICAweDAwODF9LAotezB4ODhkNSwgICAgMHgwMDBmfSwgezB4ODhkNiwgICAgMHgwMDI3fSwgezB4ODhkNywgICAgMHgwMDNjfSwKLXsweDg4ZDgsICAgIDB4MDBiZH0sIHsweDg4ZDksICAgIDB4MDBlNn0sIHsweDg4ZGEsICAgIDB4MDBjN30sCi17MHg4OGRiLCAgICAweDAwYjd9LCB7MHg4OGRjLCAgICAweDAwMTJ9LCB7MHg4OGRkLCAgICAweDAwMGR9LAotezB4ODhkZSwgICAgMHgwMGJkfSwgezB4ODhkZiwgICAgMHgwMGU2fSwgezB4ODhlMCwgICAgMHgwMGNifSwKLXsweDg4ZTEsICAgIDB4MDBiNn0sIHsweDg4ZTIsICAgIDB4MDAxMn0sIHsweDg4ZTMsICAgIDB4MDAwNH0sCi17MHg4OGU0LCAgICAweDAwOGF9LCB7MHg4OGU1LCAgICAweDAwMjB9LCB7MHg4OGU2LCAgICAweDAwYjd9LAotezB4ODhlNywgICAgMHgwMDEyfSwgezB4ODhlOCwgICAgMHgwMDA0fSwgezB4ODhlOSwgICAgMHgwMGNlfSwKLXsweDg4ZWEsICAgIDB4MDBmZn0sIHsweDg4ZWIsICAgIDB4MDBmZn0sIHsweDg4ZWMsICAgIDB4MDBiNn0sCi17MHg4OGVkLCAgICAweDAwMTJ9LCB7MHg4OGVlLCAgICAweDAwMDB9LCB7MHg4OGVmLCAgICAweDAwODF9LAotezB4ODhmMCwgICAgMHgwMDBjfSwgezB4ODhmMSwgICAgMHgwMDI2fSwgezB4ODhmMiwgICAgMHgwMDA1fSwKLXsweDg4ZjMsICAgIDB4MDAwOX0sIHsweDg4ZjQsICAgIDB4MDAyNn0sIHsweDg4ZjUsICAgIDB4MDBmNn0sCi17MHg4OGY2LCAgICAweDAwMjd9LCB7MHg4OGY3LCAgICAweDAwMWN9LCB7MHg4OGY4LCAgICAweDAwYjZ9LAotezB4ODhmOSwgICAgMHgwMDEyfSwgezB4ODhmYSwgICAgMHgwMDA0fSwgezB4ODhmYiwgICAgMHgwMDg0fSwKLXsweDg4ZmMsICAgIDB4MDBkZn0sIHsweDg4ZmQsICAgIDB4MDBiN30sIHsweDg4ZmUsICAgIDB4MDAxMn0sCi17MHg4OGZmLCAgICAweDAwMDR9LCB7MHg4OTAwLCAgICAweDAwOTZ9LCB7MHg4OTAxLCAgICAweDAwODN9LAotezB4ODkwMiwgICAgMHgwMDgxfSwgezB4ODkwMywgICAgMHgwMDA3fSwgezB4ODkwNCwgICAgMHgwMDJjfSwKLXsweDg5MDUsICAgIDB4MDAwNX0sIHsweDg5MDYsICAgIDB4MDA3Y30sIHsweDg5MDcsICAgIDB4MDAwMH0sCi17MHg4OTA4LCAgICAweDAwODN9LCB7MHg4OTA5LCAgICAweDAwMjB9LCB7MHg4OTBhLCAgICAweDAwMDZ9LAotezB4ODkwYiwgICAgMHgwMDk2fSwgezB4ODkwYywgICAgMHgwMDgzfSwgezB4ODkwZCwgICAgMHgwMDhifSwKLXsweDg5MGUsICAgIDB4MDAwOH0sIHsweDg5MGYsICAgIDB4MDA5N30sIHsweDg5MTAsICAgIDB4MDA4M30sCi17MHg4OTExLCAgICAweDAwN2V9LCB7MHg4OTEyLCAgICAweDAwODV9LCB7MHg4OTEzLCAgICAweDAwNDF9LAotezB4ODkxNCwgICAgMHgwMDdmfSwgezB4ODkxNSwgICAgMHgwMDhmfSwgezB4ODkxNiwgICAgMHgwMDdlfSwKLXsweDg5MTcsICAgIDB4MDA4Nn0sIHsweDg5MTgsICAgIDB4MDA4MH0sIHsweDg5MTksICAgIDB4MDBiN30sCi17MHg4OTFhLCAgICAweDAwMTJ9LCB7MHg4OTFiLCAgICAweDAwMGN9LCB7MHg4OTFjLCAgICAweDAwODZ9LAotezB4ODkxZCwgICAgMHgwMDAxfSwgezB4ODkxZSwgICAgMHgwMGI3fSwgezB4ODkxZiwgICAgMHgwMDhmfSwKLXsweDg5MjAsICAgIDB4MDA3ZH0sIHsweDg5MjEsICAgIDB4MDBiNn0sIHsweDg5MjIsICAgIDB4MDAxMn0sCi17MHg4OTIzLCAgICAweDAwMGN9LCB7MHg4OTI0LCAgICAweDAwODR9LCB7MHg4OTI1LCAgICAweDAwN2Z9LAotezB4ODkyNiwgICAgMHgwMGI3fSwgezB4ODkyNywgICAgMHgwMDEyfSwgezB4ODkyOCwgICAgMHgwMDBjfSwKLXsweDg5MjksICAgIDB4MDA4YX0sIHsweDg5MmEsICAgIDB4MDA4MH0sIHsweDg5MmIsICAgIDB4MDBiN30sCi17MHg4OTJjLCAgICAweDAwMTJ9LCB7MHg4OTJkLCAgICAweDAwMGN9LCB7MHg4OTJlLCAgICAweDAwODZ9LAotezB4ODkyZiwgICAgMHgwMDBhfSwgezB4ODkzMCwgICAgMHgwMGJkfSwgezB4ODkzMSwgICAgMHgwMDhhfSwKLXsweDg5MzIsICAgIDB4MDAwNn0sIHsweDg5MzMsICAgIDB4MDBiNn0sIHsweDg5MzQsICAgIDB4MDAxMn0sCi17MHg4OTM1LCAgICAweDAwMGF9LCB7MHg4OTM2LCAgICAweDAwMmF9LCB7MHg4OTM3LCAgICAweDAwMDl9LAotezB4ODkzOCwgICAgMHgwMGI2fSwgezB4ODkzOSwgICAgMHgwMDEyfSwgezB4ODkzYSwgICAgMHgwMDBjfSwKLXsweDg5M2IsICAgIDB4MDBiYX0sIHsweDg5M2MsICAgIDB4MDA4Zn0sIHsweDg5M2QsICAgIDB4MDA3ZH0sCi17MHg4OTNlLCAgICAweDAwYjd9LCB7MHg4OTNmLCAgICAweDAwMTJ9LCB7MHg4OTQwLCAgICAweDAwMGN9LAotezB4ODk0MSwgICAgMHgwMGI2fSwgezB4ODk0MiwgICAgMHgwMDhmfSwgezB4ODk0MywgICAgMHgwMDdlfSwKLXsweDg5NDQsICAgIDB4MDA4MX0sIHsweDg5NDUsICAgIDB4MDA2MH0sIHsweDg5NDYsICAgIDB4MDAyN30sCi17MHg4OTQ3LCAgICAweDAwMWF9LCB7MHg4OTQ4LCAgICAweDAwOGJ9LCB7MHg4OTQ5LCAgICAweDAwMjB9LAotezB4ODk0YSwgICAgMHgwMGI3fSwgezB4ODk0YiwgICAgMHgwMDhmfSwgezB4ODk0YywgICAgMHgwMDdlfSwKLXsweDg5NGQsICAgIDB4MDBiNn0sIHsweDg5NGUsICAgIDB4MDAxMn0sIHsweDg5NGYsICAgIDB4MDAwY30sCi17MHg4OTUwLCAgICAweDAwODR9LCB7MHg4OTUxLCAgICAweDAwOWZ9LCB7MHg4OTUyLCAgICAweDAwYmF9LAotezB4ODk1MywgICAgMHgwMDhmfSwgezB4ODk1NCwgICAgMHgwMDdlfSwgezB4ODk1NSwgICAgMHgwMGI3fSwKLXsweDg5NTYsICAgIDB4MDAxMn0sIHsweDg5NTcsICAgIDB4MDAwY30sIHsweDg5NTgsICAgIDB4MDBiNn0sCi17MHg4OTU5LCAgICAweDAwOGZ9LCB7MHg4OTVhLCAgICAweDAwN2R9LCB7MHg4OTViLCAgICAweDAwNDh9LAotezB4ODk1YywgICAgMHgwMGI3fSwgezB4ODk1ZCwgICAgMHgwMDhmfSwgezB4ODk1ZSwgICAgMHgwMDdkfSwKLXsweDg5NWYsICAgIDB4MDA3ZX0sIHsweDg5NjAsICAgIDB4MDA4OX0sIHsweDg5NjEsICAgIDB4MDAyMX0sCi17MHg4OTYyLCAgICAweDAwYjZ9LCB7MHg4OTYzLCAgICAweDAwMTJ9LCB7MHg4OTY0LCAgICAweDAwMDR9LAotezB4ODk2NSwgICAgMHgwMDhhfSwgezB4ODk2NiwgICAgMHgwMDIwfSwgezB4ODk2NywgICAgMHgwMGI3fSwKLXsweDg5NjgsICAgIDB4MDAxMn0sIHsweDg5NjksICAgIDB4MDAwNH0sIHsweDg5NmEsICAgIDB4MDBiZH0sCi17MHg4OTZiLCAgICAweDAwOGF9LCB7MHg4OTZjLCAgICAweDAwMGF9LCB7MHg4OTZkLCAgICAweDAwNGZ9LAotezB4ODk2ZSwgICAgMHgwMDM5fSwgezB4ODk2ZiwgICAgMHgwMGE2fSwgezB4ODk3MCwgICAgMHgwMDAwfSwKLXsweDg5NzEsICAgIDB4MDAxOH0sIHsweDg5NzIsICAgIDB4MDBhN30sIHsweDg5NzMsICAgIDB4MDAwMH0sCi17MHg4OTc0LCAgICAweDAwMDh9LCB7MHg4OTc1LCAgICAweDAwMTh9LCB7MHg4OTc2LCAgICAweDAwMDh9LAotezB4ODk3NywgICAgMHgwMDVhfSwgezB4ODk3OCwgICAgMHgwMDI2fSwgezB4ODk3OSwgICAgMHgwMGY1fSwKLXsweDg5N2EsICAgIDB4MDAzOX0sIHsweDg5N2IsICAgIDB4MDAzNn0sIHsweDg5N2MsICAgIDB4MDA2Y30sCi17MHg4OTdkLCAgICAweDAwMDB9LCB7MHg4OTdlLCAgICAweDAwMzJ9LCB7MHg4OTdmLCAgICAweDAwYmF9LAotezB4ODk4MCwgICAgMHgwMDhmfSwgezB4ODk4MSwgICAgMHgwMDdmfSwgezB4ODk4MiwgICAgMHgwMGI3fSwKLXsweDg5ODMsICAgIDB4MDA4Zn0sIHsweDg5ODQsICAgIDB4MDA3Zn0sIHsweDg5ODUsICAgIDB4MDBiNn0sCi17MHg4OTg2LCAgICAweDAwMTJ9LCB7MHg4OTg3LCAgICAweDAwMDl9LCB7MHg4OTg4LCAgICAweDAwODR9LAotezB4ODk4OSwgICAgMHgwMDAzfSwgezB4ODk4YSwgICAgMHgwMGE3fSwgezB4ODk4YiwgICAgMHgwMDAxfSwKLXsweDg5OGMsICAgIDB4MDBiNn0sIHsweDg5OGQsICAgIDB4MDAxMn0sIHsweDg5OGUsICAgIDB4MDAwNn0sCi17MHg4OThmLCAgICAweDAwODR9LCB7MHg4OTkwLCAgICAweDAwM2Z9LCB7MHg4OTkxLCAgICAweDAwYTd9LAotezB4ODk5MiwgICAgMHgwMDAyfSwgezB4ODk5MywgICAgMHgwMDM5fSwgezB4ODk5NCwgICAgMHgwMDM2fSwKLXsweDg5OTUsICAgIDB4MDA4Nn0sIHsweDg5OTYsICAgIDB4MDAwM30sIHsweDg5OTcsICAgIDB4MDBiN30sCi17MHg4OTk4LCAgICAweDAwOGZ9LCB7MHg4OTk5LCAgICAweDAwODB9LCB7MHg4OTlhLCAgICAweDAwMzJ9LAotezB4ODk5YiwgICAgMHgwMGMxfSwgezB4ODk5YywgICAgMHgwMDAwfSwgezB4ODk5ZCwgICAgMHgwMDI2fSwKLXsweDg5OWUsICAgIDB4MDAwNn0sIHsweDg5OWYsICAgIDB4MDBiN30sIHsweDg5YTAsICAgIDB4MDA4Zn0sCi17MHg4OWExLCAgICAweDAwN2N9LCB7MHg4OWEyLCAgICAweDAwN2V9LCB7MHg4OWEzLCAgICAweDAwODl9LAotezB4ODlhNCwgICAgMHgwMGM5fSwgezB4ODlhNSwgICAgMHgwMGMxfSwgezB4ODlhNiwgICAgMHgwMDAxfSwKLXsweDg5YTcsICAgIDB4MDAyN30sIHsweDg5YTgsICAgIDB4MDAxOH0sIHsweDg5YTksICAgIDB4MDBjMX0sCi17MHg4OWFhLCAgICAweDAwMDJ9LCB7MHg4OWFiLCAgICAweDAwMjd9LCB7MHg4OWFjLCAgICAweDAwMGN9LAotezB4ODlhZCwgICAgMHgwMGMxfSwgezB4ODlhZSwgICAgMHgwMDAzfSwgezB4ODlhZiwgICAgMHgwMDI3fSwKLXsweDg5YjAsICAgIDB4MDAwMH0sIHsweDg5YjEsICAgIDB4MDBmNn0sIHsweDg5YjIsICAgIDB4MDA4Zn0sCi17MHg4OWIzLCAgICAweDAwODB9LCB7MHg4OWI0LCAgICAweDAwMDV9LCB7MHg4OWI1LCAgICAweDAwMDV9LAotezB4ODliNiwgICAgMHgwMGY3fSwgezB4ODliNywgICAgMHgwMDhmfSwgezB4ODliOCwgICAgMHgwMDgwfSwKLXsweDg5YjksICAgIDB4MDBmNn0sIHsweDg5YmEsICAgIDB4MDA4Zn0sIHsweDg5YmIsICAgIDB4MDA4MH0sCi17MHg4OWJjLCAgICAweDAwMDV9LCB7MHg4OWJkLCAgICAweDAwMDV9LCB7MHg4OWJlLCAgICAweDAwZjd9LAotezB4ODliZiwgICAgMHgwMDhmfSwgezB4ODljMCwgICAgMHgwMDgwfSwgezB4ODljMSwgICAgMHgwMGY2fSwKLXsweDg5YzIsICAgIDB4MDA4Zn0sIHsweDg5YzMsICAgIDB4MDA4MH0sIHsweDg5YzQsICAgIDB4MDAwNX0sCi17MHg4OWM1LCAgICAweDAwMDV9LCB7MHg4OWM2LCAgICAweDAwZjd9LCB7MHg4OWM3LCAgICAweDAwOGZ9LAotezB4ODljOCwgICAgMHgwMDgwfSwgezB4ODljOSwgICAgMHgwMGY2fSwgezB4ODljYSwgICAgMHgwMDhmfSwKLXsweDg5Y2IsICAgIDB4MDA4MH0sIHsweDg5Y2MsICAgIDB4MDA1M30sIHsweDg5Y2QsICAgIDB4MDBmNH0sCi17MHg4OWNlLCAgICAweDAwMTJ9LCB7MHg4OWNmLCAgICAweDAwMDd9LCB7MHg4OWQwLCAgICAweDAwMWJ9LAotezB4ODlkMSwgICAgMHgwMGI3fSwgezB4ODlkMiwgICAgMHgwMDEyfSwgezB4ODlkMywgICAgMHgwMDA3fSwKLXsweDg5ZDQsICAgIDB4MDAzOX0sIHsweDg5ZDUsICAgIDB4MDBjZX0sIHsweDg5ZDYsICAgIDB4MDA4Zn0sCi17MHg4OWQ3LCAgICAweDAwNzB9LCB7MHg4OWQ4LCAgICAweDAwYTZ9LCB7MHg4OWQ5LCAgICAweDAwMDB9LAotezB4ODlkYSwgICAgMHgwMDE4fSwgezB4ODlkYiwgICAgMHgwMGU2fSwgezB4ODlkYywgICAgMHgwMDAwfSwKLXsweDg5ZGQsICAgIDB4MDAxOH0sIHsweDg5ZGUsICAgIDB4MDBhN30sIHsweDg5ZGYsICAgIDB4MDAwMH0sCi17MHg4OWUwLCAgICAweDAwZTd9LCB7MHg4OWUxLCAgICAweDAwMDB9LCB7MHg4OWUyLCAgICAweDAwYTZ9LAotezB4ODllMywgICAgMHgwMDAxfSwgezB4ODllNCwgICAgMHgwMDE4fSwgezB4ODllNSwgICAgMHgwMGU2fSwKLXsweDg5ZTYsICAgIDB4MDAwMX0sIHsweDg5ZTcsICAgIDB4MDAxOH0sIHsweDg5ZTgsICAgIDB4MDBhN30sCi17MHg4OWU5LCAgICAweDAwMDF9LCB7MHg4OWVhLCAgICAweDAwZTd9LCB7MHg4OWViLCAgICAweDAwMDF9LAotezB4ODllYywgICAgMHgwMGE2fSwgezB4ODllZCwgICAgMHgwMDAyfSwgezB4ODllZSwgICAgMHgwMDE4fSwKLXsweDg5ZWYsICAgIDB4MDBlNn0sIHsweDg5ZjAsICAgIDB4MDAwMn0sIHsweDg5ZjEsICAgIDB4MDAxOH0sCi17MHg4OWYyLCAgICAweDAwYTd9LCB7MHg4OWYzLCAgICAweDAwMDJ9LCB7MHg4OWY0LCAgICAweDAwZTd9LAotezB4ODlmNSwgICAgMHgwMDAyfSwgezB4ODlmNiwgICAgMHgwMDM5fSwgezB4ODlmNywgICAgMHgwMGE2fSwKLXsweDg5ZjgsICAgIDB4MDAwMH0sIHsweDg5ZjksICAgIDB4MDA4NH0sIHsweDg5ZmEsICAgIDB4MDAwN30sCi17MHg4OWZiLCAgICAweDAwZTZ9LCB7MHg4OWZjLCAgICAweDAwMDB9LCB7MHg4OWZkLCAgICAweDAwYzR9LAotezB4ODlmZSwgICAgMHgwMDM4fSwgezB4ODlmZiwgICAgMHgwMDU0fSwgezB4OGEwMCwgICAgMHgwMDU0fSwKLXsweDhhMDEsICAgIDB4MDA1NH0sIHsweDhhMDIsICAgIDB4MDAxYn0sIHsweDhhMDMsICAgIDB4MDBhN30sCi17MHg4YTA0LCAgICAweDAwMDB9LCB7MHg4YTA1LCAgICAweDAwMzl9LCB7MHg4YTA2LCAgICAweDAwNGF9LAotezB4OGEwNywgICAgMHgwMDI2fSwgezB4OGEwOCwgICAgMHgwMGZkfSwgezB4OGEwOSwgICAgMHgwMDM5fSwKLXsweDhhMGEsICAgIDB4MDA5Nn0sIHsweDhhMGIsICAgIDB4MDAyMn0sIHsweDhhMGMsICAgIDB4MDA4NH0sCi17MHg4YTBkLCAgICAweDAwMGZ9LCB7MHg4YTBlLCAgICAweDAwOTd9LCB7MHg4YTBmLCAgICAweDAwMjJ9LAotezB4OGExMCwgICAgMHgwMDg2fSwgezB4OGExMSwgICAgMHgwMDAxfSwgezB4OGExMiwgICAgMHgwMGI3fSwKLXsweDhhMTMsICAgIDB4MDA4Zn0sIHsweDhhMTQsICAgIDB4MDA3MH0sIHsweDhhMTUsICAgIDB4MDBiNn0sCi17MHg4YTE2LCAgICAweDAwMTJ9LCB7MHg4YTE3LCAgICAweDAwMDd9LCB7MHg4YTE4LCAgICAweDAwYjd9LAotezB4OGExOSwgICAgMHgwMDhmfSwgezB4OGExYSwgICAgMHgwMDcxfSwgezB4OGExYiwgICAgMHgwMGY2fSwKLXsweDhhMWMsICAgIDB4MDAxMn0sIHsweDhhMWQsICAgIDB4MDAwY30sIHsweDhhMWUsICAgIDB4MDBjNH0sCi17MHg4YTFmLCAgICAweDAwMGZ9LCB7MHg4YTIwLCAgICAweDAwYzh9LCB7MHg4YTIxLCAgICAweDAwMGZ9LAotezB4OGEyMiwgICAgMHgwMGY3fSwgezB4OGEyMywgICAgMHgwMDhmfSwgezB4OGEyNCwgICAgMHgwMDcyfSwKLXsweDhhMjUsICAgIDB4MDBmNn0sIHsweDhhMjYsICAgIDB4MDA4Zn0sIHsweDhhMjcsICAgIDB4MDA3Mn0sCi17MHg4YTI4LCAgICAweDAwYjZ9LCB7MHg4YTI5LCAgICAweDAwOGZ9LCB7MHg4YTJhLCAgICAweDAwNzF9LAotezB4OGEyYiwgICAgMHgwMDg0fSwgezB4OGEyYywgICAgMHgwMDAzfSwgezB4OGEyZCwgICAgMHgwMDI3fSwKLXsweDhhMmUsICAgIDB4MDAxNH0sIHsweDhhMmYsICAgIDB4MDA4MX0sIHsweDhhMzAsICAgIDB4MDAwMX0sCi17MHg4YTMxLCAgICAweDAwMjd9LCB7MHg4YTMyLCAgICAweDAwMWN9LCB7MHg4YTMzLCAgICAweDAwODF9LAotezB4OGEzNCwgICAgMHgwMDAyfSwgezB4OGEzNSwgICAgMHgwMDI3fSwgezB4OGEzNiwgICAgMHgwMDI0fSwKLXsweDhhMzcsICAgIDB4MDBmNH0sIHsweDhhMzgsICAgIDB4MDA4Zn0sIHsweDhhMzksICAgIDB4MDA3MH0sCi17MHg4YTNhLCAgICAweDAwMjd9LCB7MHg4YTNiLCAgICAweDAwMmF9LCB7MHg4YTNjLCAgICAweDAwOTZ9LAotezB4OGEzZCwgICAgMHgwMDIyfSwgezB4OGEzZSwgICAgMHgwMDhhfSwgezB4OGEzZiwgICAgMHgwMDgwfSwKLXsweDhhNDAsICAgIDB4MDA3ZX0sIHsweDhhNDEsICAgIDB4MDA4YX0sIHsweDhhNDIsICAgIDB4MDA2NH0sCi17MHg4YTQzLCAgICAweDAwZjR9LCB7MHg4YTQ0LCAgICAweDAwOGZ9LCB7MHg4YTQ1LCAgICAweDAwNzB9LAotezB4OGE0NiwgICAgMHgwMDI3fSwgezB4OGE0NywgICAgMHgwMDFlfSwgezB4OGE0OCwgICAgMHgwMDk2fSwKLXsweDhhNDksICAgIDB4MDAyMn0sIHsweDhhNGEsICAgIDB4MDA4YX0sIHsweDhhNGIsICAgIDB4MDAxMH0sCi17MHg4YTRjLCAgICAweDAwN2V9LCB7MHg4YTRkLCAgICAweDAwOGF9LCB7MHg4YTRlLCAgICAweDAwNjR9LAotezB4OGE0ZiwgICAgMHgwMGY0fSwgezB4OGE1MCwgICAgMHgwMDhmfSwgezB4OGE1MSwgICAgMHgwMDcwfSwKLXsweDhhNTIsICAgIDB4MDAyN30sIHsweDhhNTMsICAgIDB4MDAxMn0sIHsweDhhNTQsICAgIDB4MDA5Nn0sCi17MHg4YTU1LCAgICAweDAwMjJ9LCB7MHg4YTU2LCAgICAweDAwOGF9LCB7MHg4YTU3LCAgICAweDAwMjB9LAotezB4OGE1OCwgICAgMHgwMDdlfSwgezB4OGE1OSwgICAgMHgwMDhhfSwgezB4OGE1YSwgICAgMHgwMDY0fSwKLXsweDhhNWIsICAgIDB4MDBmNH0sIHsweDhhNWMsICAgIDB4MDA4Zn0sIHsweDhhNWQsICAgIDB4MDA3MH0sCi17MHg4YTVlLCAgICAweDAwMjd9LCB7MHg4YTVmLCAgICAweDAwMDZ9LCB7MHg4YTYwLCAgICAweDAwOTZ9LAotezB4OGE2MSwgICAgMHgwMDIyfSwgezB4OGE2MiwgICAgMHgwMDhhfSwgezB4OGE2MywgICAgMHgwMDQwfSwKLXsweDhhNjQsICAgIDB4MDA5N30sIHsweDhhNjUsICAgIDB4MDAyMn0sIHsweDhhNjYsICAgIDB4MDA3NH0sCi17MHg4YTY3LCAgICAweDAwOGZ9LCB7MHg4YTY4LCAgICAweDAwNzF9LCB7MHg4YTY5LCAgICAweDAwNzR9LAotezB4OGE2YSwgICAgMHgwMDhmfSwgezB4OGE2YiwgICAgMHgwMDcxfSwgezB4OGE2YywgICAgMHgwMDc4fSwKLXsweDhhNmQsICAgIDB4MDA4Zn0sIHsweDhhNmUsICAgIDB4MDA3MH0sIHsweDhhNmYsICAgIDB4MDBiNn0sCi17MHg4YTcwLCAgICAweDAwOGZ9LCB7MHg4YTcxLCAgICAweDAwNzB9LCB7MHg4YTcyLCAgICAweDAwODV9LAotezB4OGE3MywgICAgMHgwMDEwfSwgezB4OGE3NCwgICAgMHgwMDI3fSwgezB4OGE3NSwgICAgMHgwMGFmfSwKLXsweDhhNzYsICAgIDB4MDBkNn0sIHsweDhhNzcsICAgIDB4MDAyMn0sIHsweDhhNzgsICAgIDB4MDBjNH0sCi17MHg4YTc5LCAgICAweDAwMTB9LCB7MHg4YTdhLCAgICAweDAwNTh9LCB7MHg4YTdiLCAgICAweDAwYjZ9LAotezB4OGE3YywgICAgMHgwMDEyfSwgezB4OGE3ZCwgICAgMHgwMDcwfSwgezB4OGE3ZSwgICAgMHgwMDgxfSwKLXsweDhhN2YsICAgIDB4MDBlNH0sIHsweDhhODAsICAgIDB4MDAyN30sIHsweDhhODEsICAgIDB4MDAzNn0sCi17MHg4YTgyLCAgICAweDAwODF9LCB7MHg4YTgzLCAgICAweDAwZTF9LCB7MHg4YTg0LCAgICAweDAwMjZ9LAotezB4OGE4NSwgICAgMHgwMDBjfSwgezB4OGE4NiwgICAgMHgwMDk2fSwgezB4OGE4NywgICAgMHgwMDIyfSwKLXsweDhhODgsICAgIDB4MDA4NH0sIHsweDhhODksICAgIDB4MDAyMH0sIHsweDhhOGEsICAgIDB4MDA0NH0sCi17MHg4YThiLCAgICAweDAwMWJ9LCB7MHg4YThjLCAgICAweDAwZDZ9LCB7MHg4YThkLCAgICAweDAwMjJ9LAotezB4OGE4ZSwgICAgMHgwMGM0fSwgezB4OGE4ZiwgICAgMHgwMGNmfSwgezB4OGE5MCwgICAgMHgwMDIwfSwKLXsweDhhOTEsICAgIDB4MDAyM30sIHsweDhhOTIsICAgIDB4MDA1OH0sIHsweDhhOTMsICAgIDB4MDA4MX0sCi17MHg4YTk0LCAgICAweDAwYzZ9LCB7MHg4YTk1LCAgICAweDAwMjZ9LCB7MHg4YTk2LCAgICAweDAwMGR9LAotezB4OGE5NywgICAgMHgwMDk2fSwgezB4OGE5OCwgICAgMHgwMDIyfSwgezB4OGE5OSwgICAgMHgwMDg0fSwKLXsweDhhOWEsICAgIDB4MDA0MH0sIHsweDhhOWIsICAgIDB4MDA0NH0sIHsweDhhOWMsICAgIDB4MDA0NH0sCi17MHg4YTlkLCAgICAweDAwMWJ9LCB7MHg4YTllLCAgICAweDAwZDZ9LCB7MHg4YTlmLCAgICAweDAwMjJ9LAotezB4OGFhMCwgICAgMHgwMGM0fSwgezB4OGFhMSwgICAgMHgwMGFmfSwgezB4OGFhMiwgICAgMHgwMDIwfSwKLXsweDhhYTMsICAgIDB4MDAxMX0sIHsweDhhYTQsICAgIDB4MDA1OH0sIHsweDhhYTUsICAgIDB4MDA4MX0sCi17MHg4YWE2LCAgICAweDAwMjd9LCB7MHg4YWE3LCAgICAweDAwMjZ9LCB7MHg4YWE4LCAgICAweDAwMGZ9LAotezB4OGFhOSwgICAgMHgwMDk2fSwgezB4OGFhYSwgICAgMHgwMDIyfSwgezB4OGFhYiwgICAgMHgwMDg0fSwKLXsweDhhYWMsICAgIDB4MDA4MH0sIHsweDhhYWQsICAgIDB4MDA0NH0sIHsweDhhYWUsICAgIDB4MDA0NH0sCi17MHg4YWFmLCAgICAweDAwNDR9LCB7MHg4YWIwLCAgICAweDAwMWJ9LCB7MHg4YWIxLCAgICAweDAwZDZ9LAotezB4OGFiMiwgICAgMHgwMDIyfSwgezB4OGFiMywgICAgMHgwMGM0fSwgezB4OGFiNCwgICAgMHgwMDZmfSwKLXsweDhhYjUsICAgIDB4MDAxYn0sIHsweDhhYjYsICAgIDB4MDA5N30sIHsweDhhYjcsICAgIDB4MDAyMn0sCi17MHg4YWI4LCAgICAweDAwMzl9LCB7MHg4YWI5LCAgICAweDAwMjd9LCB7MHg4YWJhLCAgICAweDAwMGN9LAotezB4OGFiYiwgICAgMHgwMDdjfSwgezB4OGFiYywgICAgMHgwMDgyfSwgezB4OGFiZCwgICAgMHgwMDA2fSwKLXsweDhhYmUsICAgIDB4MDBiZH0sIHsweDhhYmYsICAgIDB4MDBkOX0sIHsweDhhYzAsICAgIDB4MDBlZH0sCi17MHg4YWMxLCAgICAweDAwYjZ9LCB7MHg4YWMyLCAgICAweDAwODJ9LCB7MHg4YWMzLCAgICAweDAwMDd9LAotezB4OGFjNCwgICAgMHgwMDdlfSwgezB4OGFjNSwgICAgMHgwMDhhfSwgezB4OGFjNiwgICAgMHgwMGI5fSwKLXsweDhhYzcsICAgIDB4MDA3Zn0sIHsweDhhYzgsICAgIDB4MDA4Mn0sIHsweDhhYzksICAgIDB4MDAwNn0sCi17MHg4YWNhLCAgICAweDAwMzl9LCB7IDB4MCwgMHgwIH0KLX07Ci0jZWxzZQotY2FzX3NhdHVybl9wYXRjaF90IGNhc19zYXR1cm5fcGF0Y2hbXSA9IHsKLXsweDgyMDAsICAgIDB4MDA3ZX0sIHsweDgyMDEsICAgIDB4MDA4Mn0sIHsweDgyMDIsICAgIDB4MDAwOX0sCi17MHg4MjAzLCAgICAweDAwMDB9LCB7MHg4MjA0LCAgICAweDAwMDB9LCB7MHg4MjA1LCAgICAweDAwMDB9LAotezB4ODIwNiwgICAgMHgwMDAwfSwgezB4ODIwNywgICAgMHgwMDAwfSwgezB4ODIwOCwgICAgMHgwMDAwfSwKLXsweDgyMDksICAgIDB4MDA4ZX0sIHsweDgyMGEsICAgIDB4MDA4ZX0sIHsweDgyMGIsICAgIDB4MDBmZn0sCi17MHg4MjBjLCAgICAweDAwY2V9LCB7MHg4MjBkLCAgICAweDAwODJ9LCB7MHg4MjBlLCAgICAweDAwMjV9LAotezB4ODIwZiwgICAgMHgwMGZmfSwgezB4ODIxMCwgICAgMHgwMDAxfSwgezB4ODIxMSwgICAgMHgwMDBmfSwKLXsweDgyMTIsICAgIDB4MDBjZX0sIHsweDgyMTMsICAgIDB4MDA4NH0sIHsweDgyMTQsICAgIDB4MDAyNn0sCi17MHg4MjE1LCAgICAweDAwZmZ9LCB7MHg4MjE2LCAgICAweDAwMDF9LCB7MHg4MjE3LCAgICAweDAwMTF9LAotezB4ODIxOCwgICAgMHgwMGNlfSwgezB4ODIxOSwgICAgMHgwMDg1fSwgezB4ODIxYSwgICAgMHgwMDNkfSwKLXsweDgyMWIsICAgIDB4MDBkZn0sIHsweDgyMWMsICAgIDB4MDBlNX0sIHsweDgyMWQsICAgIDB4MDA4Nn0sCi17MHg4MjFlLCAgICAweDAwMzl9LCB7MHg4MjFmLCAgICAweDAwYjd9LCB7MHg4MjIwLCAgICAweDAwOGZ9LAotezB4ODIyMSwgICAgMHgwMGY4fSwgezB4ODIyMiwgICAgMHgwMDdlfSwgezB4ODIyMywgICAgMHgwMGMzfSwKLXsweDgyMjQsICAgIDB4MDBjMn0sIHsweDgyMjUsICAgIDB4MDA5Nn0sIHsweDgyMjYsICAgIDB4MDA0N30sCi17MHg4MjI3LCAgICAweDAwODR9LCB7MHg4MjI4LCAgICAweDAwZjN9LCB7MHg4MjI5LCAgICAweDAwOGF9LAotezB4ODIyYSwgICAgMHgwMDAwfSwgezB4ODIyYiwgICAgMHgwMDk3fSwgezB4ODIyYywgICAgMHgwMDQ3fSwKLXsweDgyMmQsICAgIDB4MDBjZX0sIHsweDgyMmUsICAgIDB4MDA4Mn0sIHsweDgyMmYsICAgIDB4MDAzM30sCi17MHg4MjMwLCAgICAweDAwZmZ9LCB7MHg4MjMxLCAgICAweDAwMDF9LCB7MHg4MjMyLCAgICAweDAwMGZ9LAotezB4ODIzMywgICAgMHgwMDk2fSwgezB4ODIzNCwgICAgMHgwMDQ2fSwgezB4ODIzNSwgICAgMHgwMDg0fSwKLXsweDgyMzYsICAgIDB4MDAwY30sIHsweDgyMzcsICAgIDB4MDA4MX0sIHsweDgyMzgsICAgIDB4MDAwNH0sCi17MHg4MjM5LCAgICAweDAwMjd9LCB7MHg4MjNhLCAgICAweDAwMGJ9LCB7MHg4MjNiLCAgICAweDAwOTZ9LAotezB4ODIzYywgICAgMHgwMDQ2fSwgezB4ODIzZCwgICAgMHgwMDg0fSwgezB4ODIzZSwgICAgMHgwMDBjfSwKLXsweDgyM2YsICAgIDB4MDA4MX0sIHsweDgyNDAsICAgIDB4MDAwOH0sIHsweDgyNDEsICAgIDB4MDAyN30sCi17MHg4MjQyLCAgICAweDAwNTd9LCB7MHg4MjQzLCAgICAweDAwN2V9LCB7MHg4MjQ0LCAgICAweDAwODR9LAotezB4ODI0NSwgICAgMHgwMDI1fSwgezB4ODI0NiwgICAgMHgwMDk2fSwgezB4ODI0NywgICAgMHgwMDQ3fSwKLXsweDgyNDgsICAgIDB4MDA4NH0sIHsweDgyNDksICAgIDB4MDBmM30sIHsweDgyNGEsICAgIDB4MDA4YX0sCi17MHg4MjRiLCAgICAweDAwMDR9LCB7MHg4MjRjLCAgICAweDAwOTd9LCB7MHg4MjRkLCAgICAweDAwNDd9LAotezB4ODI0ZSwgICAgMHgwMGNlfSwgezB4ODI0ZiwgICAgMHgwMDgyfSwgezB4ODI1MCwgICAgMHgwMDU0fSwKLXsweDgyNTEsICAgIDB4MDBmZn0sIHsweDgyNTIsICAgIDB4MDAwMX0sIHsweDgyNTMsICAgIDB4MDAwZn0sCi17MHg4MjU0LCAgICAweDAwOTZ9LCB7MHg4MjU1LCAgICAweDAwNDZ9LCB7MHg4MjU2LCAgICAweDAwODR9LAotezB4ODI1NywgICAgMHgwMDBjfSwgezB4ODI1OCwgICAgMHgwMDgxfSwgezB4ODI1OSwgICAgMHgwMDA0fSwKLXsweDgyNWEsICAgIDB4MDAyNn0sIHsweDgyNWIsICAgIDB4MDAzOH0sIHsweDgyNWMsICAgIDB4MDBiNn0sCi17MHg4MjVkLCAgICAweDAwMTJ9LCB7MHg4MjVlLCAgICAweDAwMjB9LCB7MHg4MjVmLCAgICAweDAwODR9LAotezB4ODI2MCwgICAgMHgwMDIwfSwgezB4ODI2MSwgICAgMHgwMDI2fSwgezB4ODI2MiwgICAgMHgwMDAzfSwKLXsweDgyNjMsICAgIDB4MDA3ZX0sIHsweDgyNjQsICAgIDB4MDA4NH0sIHsweDgyNjUsICAgIDB4MDAyNX0sCi17MHg4MjY2LCAgICAweDAwOTZ9LCB7MHg4MjY3LCAgICAweDAwN2J9LCB7MHg4MjY4LCAgICAweDAwZDZ9LAotezB4ODI2OSwgICAgMHgwMDdjfSwgezB4ODI2YSwgICAgMHgwMGZlfSwgezB4ODI2YiwgICAgMHgwMDhmfSwKLXsweDgyNmMsICAgIDB4MDA1Nn0sIHsweDgyNmQsICAgIDB4MDBiZH0sIHsweDgyNmUsICAgIDB4MDBmN30sCi17MHg4MjZmLCAgICAweDAwYjZ9LCB7MHg4MjcwLCAgICAweDAwZmV9LCB7MHg4MjcxLCAgICAweDAwOGZ9LAotezB4ODI3MiwgICAgMHgwMDRlfSwgezB4ODI3MywgICAgMHgwMGJkfSwgezB4ODI3NCwgICAgMHgwMGVjfSwKLXsweDgyNzUsICAgIDB4MDA4ZX0sIHsweDgyNzYsICAgIDB4MDBiZH0sIHsweDgyNzcsICAgIDB4MDBmYX0sCi17MHg4Mjc4LCAgICAweDAwZjd9LCB7MHg4Mjc5LCAgICAweDAwYmR9LCB7MHg4MjdhLCAgICAweDAwZjd9LAotezB4ODI3YiwgICAgMHgwMDI4fSwgezB4ODI3YywgICAgMHgwMGNlfSwgezB4ODI3ZCwgICAgMHgwMDgyfSwKLXsweDgyN2UsICAgIDB4MDA4Mn0sIHsweDgyN2YsICAgIDB4MDBmZn0sIHsweDgyODAsICAgIDB4MDAwMX0sCi17MHg4MjgxLCAgICAweDAwMGZ9LCB7MHg4MjgyLCAgICAweDAwOTZ9LCB7MHg4MjgzLCAgICAweDAwNDZ9LAotezB4ODI4NCwgICAgMHgwMDg0fSwgezB4ODI4NSwgICAgMHgwMDBjfSwgezB4ODI4NiwgICAgMHgwMDgxfSwKLXsweDgyODcsICAgIDB4MDAwNH0sIHsweDgyODgsICAgIDB4MDAyNn0sIHsweDgyODksICAgIDB4MDAwYX0sCi17MHg4MjhhLCAgICAweDAwYjZ9LCB7MHg4MjhiLCAgICAweDAwMTJ9LCB7MHg4MjhjLCAgICAweDAwMjB9LAotezB4ODI4ZCwgICAgMHgwMDg0fSwgezB4ODI4ZSwgICAgMHgwMDIwfSwgezB4ODI4ZiwgICAgMHgwMDI3fSwKLXsweDgyOTAsICAgIDB4MDBiNX0sIHsweDgyOTEsICAgIDB4MDA3ZX0sIHsweDgyOTIsICAgIDB4MDA4NH0sCi17MHg4MjkzLCAgICAweDAwMjV9LCB7MHg4Mjk0LCAgICAweDAwYmR9LCB7MHg4Mjk1LCAgICAweDAwZjd9LAotezB4ODI5NiwgICAgMHgwMDFmfSwgezB4ODI5NywgICAgMHgwMDdlfSwgezB4ODI5OCwgICAgMHgwMDg0fSwKLXsweDgyOTksICAgIDB4MDAxZn0sIHsweDgyOWEsICAgIDB4MDA5Nn0sIHsweDgyOWIsICAgIDB4MDA0N30sCi17MHg4MjljLCAgICAweDAwODR9LCB7MHg4MjlkLCAgICAweDAwZjN9LCB7MHg4MjllLCAgICAweDAwOGF9LAotezB4ODI5ZiwgICAgMHgwMDA4fSwgezB4ODJhMCwgICAgMHgwMDk3fSwgezB4ODJhMSwgICAgMHgwMDQ3fSwKLXsweDgyYTIsICAgIDB4MDBkZX0sIHsweDgyYTMsICAgIDB4MDBlMX0sIHsweDgyYTQsICAgIDB4MDBhZH0sCi17MHg4MmE1LCAgICAweDAwMDB9LCB7MHg4MmE2LCAgICAweDAwY2V9LCB7MHg4MmE3LCAgICAweDAwODJ9LAotezB4ODJhOCwgICAgMHgwMGFmfSwgezB4ODJhOSwgICAgMHgwMGZmfSwgezB4ODJhYSwgICAgMHgwMDAxfSwKLXsweDgyYWIsICAgIDB4MDAwZn0sIHsweDgyYWMsICAgIDB4MDA3ZX0sIHsweDgyYWQsICAgIDB4MDA4NH0sCi17MHg4MmFlLCAgICAweDAwMjV9LCB7MHg4MmFmLCAgICAweDAwOTZ9LCB7MHg4MmIwLCAgICAweDAwNDF9LAotezB4ODJiMSwgICAgMHgwMDg1fSwgezB4ODJiMiwgICAgMHgwMDEwfSwgezB4ODJiMywgICAgMHgwMDI2fSwKLXsweDgyYjQsICAgIDB4MDAwNn0sIHsweDgyYjUsICAgIDB4MDA5Nn0sIHsweDgyYjYsICAgIDB4MDAyM30sCi17MHg4MmI3LCAgICAweDAwODV9LCB7MHg4MmI4LCAgICAweDAwNDB9LCB7MHg4MmI5LCAgICAweDAwMjd9LAotezB4ODJiYSwgICAgMHgwMDA2fSwgezB4ODJiYiwgICAgMHgwMGJkfSwgezB4ODJiYywgICAgMHgwMGVkfSwKLXsweDgyYmQsICAgIDB4MDAwMH0sIHsweDgyYmUsICAgIDB4MDA3ZX0sIHsweDgyYmYsICAgIDB4MDA4M30sCi17MHg4MmMwLCAgICAweDAwYTJ9LCB7MHg4MmMxLCAgICAweDAwZGV9LCB7MHg4MmMyLCAgICAweDAwNDJ9LAotezB4ODJjMywgICAgMHgwMGJkfSwgezB4ODJjNCwgICAgMHgwMGVifSwgezB4ODJjNSwgICAgMHgwMDhlfSwKLXsweDgyYzYsICAgIDB4MDA5Nn0sIHsweDgyYzcsICAgIDB4MDAyNH0sIHsweDgyYzgsICAgIDB4MDA4NH0sCi17MHg4MmM5LCAgICAweDAwMDh9LCB7MHg4MmNhLCAgICAweDAwMjd9LCB7MHg4MmNiLCAgICAweDAwMDN9LAotezB4ODJjYywgICAgMHgwMDdlfSwgezB4ODJjZCwgICAgMHgwMDgzfSwgezB4ODJjZSwgICAgMHgwMGRmfSwKLXsweDgyY2YsICAgIDB4MDA5Nn0sIHsweDgyZDAsICAgIDB4MDA3Yn0sIHsweDgyZDEsICAgIDB4MDBkNn0sCi17MHg4MmQyLCAgICAweDAwN2N9LCB7MHg4MmQzLCAgICAweDAwZmV9LCB7MHg4MmQ0LCAgICAweDAwOGZ9LAotezB4ODJkNSwgICAgMHgwMDU2fSwgezB4ODJkNiwgICAgMHgwMGJkfSwgezB4ODJkNywgICAgMHgwMGY3fSwKLXsweDgyZDgsICAgIDB4MDBiNn0sIHsweDgyZDksICAgIDB4MDBmZX0sIHsweDgyZGEsICAgIDB4MDA4Zn0sCi17MHg4MmRiLCAgICAweDAwNTB9LCB7MHg4MmRjLCAgICAweDAwYmR9LCB7MHg4MmRkLCAgICAweDAwZWN9LAotezB4ODJkZSwgICAgMHgwMDhlfSwgezB4ODJkZiwgICAgMHgwMGJkfSwgezB4ODJlMCwgICAgMHgwMGZhfSwKLXsweDgyZTEsICAgIDB4MDBmN30sIHsweDgyZTIsICAgIDB4MDA4Nn0sIHsweDgyZTMsICAgIDB4MDAxMX0sCi17MHg4MmU0LCAgICAweDAwYzZ9LCB7MHg4MmU1LCAgICAweDAwNDl9LCB7MHg4MmU2LCAgICAweDAwYmR9LAotezB4ODJlNywgICAgMHgwMGU0fSwgezB4ODJlOCwgICAgMHgwMDEyfSwgezB4ODJlOSwgICAgMHgwMGNlfSwKLXsweDgyZWEsICAgIDB4MDA4Mn0sIHsweDgyZWIsICAgIDB4MDBlZn0sIHsweDgyZWMsICAgIDB4MDBmZn0sCi17MHg4MmVkLCAgICAweDAwMDF9LCB7MHg4MmVlLCAgICAweDAwMGZ9LCB7MHg4MmVmLCAgICAweDAwOTZ9LAotezB4ODJmMCwgICAgMHgwMDQ2fSwgezB4ODJmMSwgICAgMHgwMDg0fSwgezB4ODJmMiwgICAgMHgwMDBjfSwKLXsweDgyZjMsICAgIDB4MDA4MX0sIHsweDgyZjQsICAgIDB4MDAwMH0sIHsweDgyZjUsICAgIDB4MDAyN30sCi17MHg4MmY2LCAgICAweDAwMTd9LCB7MHg4MmY3LCAgICAweDAwYzZ9LCB7MHg4MmY4LCAgICAweDAwNDl9LAotezB4ODJmOSwgICAgMHgwMGJkfSwgezB4ODJmYSwgICAgMHgwMGU0fSwgezB4ODJmYiwgICAgMHgwMDkxfSwKLXsweDgyZmMsICAgIDB4MDAyNH0sIHsweDgyZmQsICAgIDB4MDAwZH0sIHsweDgyZmUsICAgIDB4MDBiNn0sCi17MHg4MmZmLCAgICAweDAwMTJ9LCB7MHg4MzAwLCAgICAweDAwMjB9LCB7MHg4MzAxLCAgICAweDAwODV9LAotezB4ODMwMiwgICAgMHgwMDIwfSwgezB4ODMwMywgICAgMHgwMDI2fSwgezB4ODMwNCwgICAgMHgwMDBjfSwKLXsweDgzMDUsICAgIDB4MDBjZX0sIHsweDgzMDYsICAgIDB4MDA4Mn0sIHsweDgzMDcsICAgIDB4MDBjMX0sCi17MHg4MzA4LCAgICAweDAwZmZ9LCB7MHg4MzA5LCAgICAweDAwMDF9LCB7MHg4MzBhLCAgICAweDAwMGZ9LAotezB4ODMwYiwgICAgMHgwMDdlfSwgezB4ODMwYywgICAgMHgwMDg0fSwgezB4ODMwZCwgICAgMHgwMDI1fSwKLXsweDgzMGUsICAgIDB4MDA3ZX0sIHsweDgzMGYsICAgIDB4MDA4NH0sIHsweDgzMTAsICAgIDB4MDAxNn0sCi17MHg4MzExLCAgICAweDAwZmV9LCB7MHg4MzEyLCAgICAweDAwOGZ9LCB7MHg4MzEzLCAgICAweDAwNTJ9LAotezB4ODMxNCwgICAgMHgwMGJkfSwgezB4ODMxNSwgICAgMHgwMGVjfSwgezB4ODMxNiwgICAgMHgwMDhlfSwKLXsweDgzMTcsICAgIDB4MDBiZH0sIHsweDgzMTgsICAgIDB4MDBmYX0sIHsweDgzMTksICAgIDB4MDBmN30sCi17MHg4MzFhLCAgICAweDAwODZ9LCB7MHg4MzFiLCAgICAweDAwNmF9LCB7MHg4MzFjLCAgICAweDAwYzZ9LAotezB4ODMxZCwgICAgMHgwMDQ5fSwgezB4ODMxZSwgICAgMHgwMGJkfSwgezB4ODMxZiwgICAgMHgwMGU0fSwKLXsweDgzMjAsICAgIDB4MDAxMn0sIHsweDgzMjEsICAgIDB4MDBjZX0sIHsweDgzMjIsICAgIDB4MDA4M30sCi17MHg4MzIzLCAgICAweDAwMjd9LCB7MHg4MzI0LCAgICAweDAwZmZ9LCB7MHg4MzI1LCAgICAweDAwMDF9LAotezB4ODMyNiwgICAgMHgwMDBmfSwgezB4ODMyNywgICAgMHgwMDk2fSwgezB4ODMyOCwgICAgMHgwMDQ2fSwKLXsweDgzMjksICAgIDB4MDA4NH0sIHsweDgzMmEsICAgIDB4MDAwY30sIHsweDgzMmIsICAgIDB4MDA4MX0sCi17MHg4MzJjLCAgICAweDAwMDB9LCB7MHg4MzJkLCAgICAweDAwMjd9LCB7MHg4MzJlLCAgICAweDAwMGF9LAotezB4ODMyZiwgICAgMHgwMGM2fSwgezB4ODMzMCwgICAgMHgwMDQ5fSwgezB4ODMzMSwgICAgMHgwMGJkfSwKLXsweDgzMzIsICAgIDB4MDBlNH0sIHsweDgzMzMsICAgIDB4MDA5MX0sIHsweDgzMzQsICAgIDB4MDAyNX0sCi17MHg4MzM1LCAgICAweDAwMDZ9LCB7MHg4MzM2LCAgICAweDAwN2V9LCB7MHg4MzM3LCAgICAweDAwODR9LAotezB4ODMzOCwgICAgMHgwMDI1fSwgezB4ODMzOSwgICAgMHgwMDdlfSwgezB4ODMzYSwgICAgMHgwMDg0fSwKLXsweDgzM2IsICAgIDB4MDAxNn0sIHsweDgzM2MsICAgIDB4MDBiNn0sIHsweDgzM2QsICAgIDB4MDAxOH0sCi17MHg4MzNlLCAgICAweDAwNzB9LCB7MHg4MzNmLCAgICAweDAwYmJ9LCB7MHg4MzQwLCAgICAweDAwMTl9LAotezB4ODM0MSwgICAgMHgwMDcwfSwgezB4ODM0MiwgICAgMHgwMDJhfSwgezB4ODM0MywgICAgMHgwMDA0fSwKLXsweDgzNDQsICAgIDB4MDA4MX0sIHsweDgzNDUsICAgIDB4MDBhZn0sIHsweDgzNDYsICAgIDB4MDAyZX0sCi17MHg4MzQ3LCAgICAweDAwMTl9LCB7MHg4MzQ4LCAgICAweDAwOTZ9LCB7MHg4MzQ5LCAgICAweDAwN2J9LAotezB4ODM0YSwgICAgMHgwMGY2fSwgezB4ODM0YiwgICAgMHgwMDIwfSwgezB4ODM0YywgICAgMHgwMDA3fSwKLXsweDgzNGQsICAgIDB4MDBmYX0sIHsweDgzNGUsICAgIDB4MDAyMH0sIHsweDgzNGYsICAgIDB4MDAyN30sCi17MHg4MzUwLCAgICAweDAwYzR9LCB7MHg4MzUxLCAgICAweDAwMzh9LCB7MHg4MzUyLCAgICAweDAwODF9LAotezB4ODM1MywgICAgMHgwMDM4fSwgezB4ODM1NCwgICAgMHgwMDI3fSwgezB4ODM1NSwgICAgMHgwMDBifSwKLXsweDgzNTYsICAgIDB4MDBmNn0sIHsweDgzNTcsICAgIDB4MDAyMH0sIHsweDgzNTgsICAgIDB4MDAwN30sCi17MHg4MzU5LCAgICAweDAwZmF9LCB7MHg4MzVhLCAgICAweDAwMjB9LCB7MHg4MzViLCAgICAweDAwMjd9LAotezB4ODM1YywgICAgMHgwMGNifSwgezB4ODM1ZCwgICAgMHgwMDA4fSwgezB4ODM1ZSwgICAgMHgwMDdlfSwKLXsweDgzNWYsICAgIDB4MDA4Mn0sIHsweDgzNjAsICAgIDB4MDBkM30sIHsweDgzNjEsICAgIDB4MDBiZH0sCi17MHg4MzYyLCAgICAweDAwZjd9LCB7MHg4MzYzLCAgICAweDAwNjZ9LCB7MHg4MzY0LCAgICAweDAwODZ9LAotezB4ODM2NSwgICAgMHgwMDc0fSwgezB4ODM2NiwgICAgMHgwMGM2fSwgezB4ODM2NywgICAgMHgwMDQ5fSwKLXsweDgzNjgsICAgIDB4MDBiZH0sIHsweDgzNjksICAgIDB4MDBlNH0sIHsweDgzNmEsICAgIDB4MDAxMn0sCi17MHg4MzZiLCAgICAweDAwY2V9LCB7MHg4MzZjLCAgICAweDAwODN9LCB7MHg4MzZkLCAgICAweDAwNzF9LAotezB4ODM2ZSwgICAgMHgwMGZmfSwgezB4ODM2ZiwgICAgMHgwMDAxfSwgezB4ODM3MCwgICAgMHgwMDBmfSwKLXsweDgzNzEsICAgIDB4MDA5Nn0sIHsweDgzNzIsICAgIDB4MDA0Nn0sIHsweDgzNzMsICAgIDB4MDA4NH0sCi17MHg4Mzc0LCAgICAweDAwMGN9LCB7MHg4Mzc1LCAgICAweDAwODF9LCB7MHg4Mzc2LCAgICAweDAwMDh9LAotezB4ODM3NywgICAgMHgwMDI2fSwgezB4ODM3OCwgICAgMHgwMDBhfSwgezB4ODM3OSwgICAgMHgwMGM2fSwKLXsweDgzN2EsICAgIDB4MDA0OX0sIHsweDgzN2IsICAgIDB4MDBiZH0sIHsweDgzN2MsICAgIDB4MDBlNH0sCi17MHg4MzdkLCAgICAweDAwOTF9LCB7MHg4MzdlLCAgICAweDAwMjV9LCB7MHg4MzdmLCAgICAweDAwMDZ9LAotezB4ODM4MCwgICAgMHgwMDdlfSwgezB4ODM4MSwgICAgMHgwMDg0fSwgezB4ODM4MiwgICAgMHgwMDI1fSwKLXsweDgzODMsICAgIDB4MDA3ZX0sIHsweDgzODQsICAgIDB4MDA4NH0sIHsweDgzODUsICAgIDB4MDAxNn0sCi17MHg4Mzg2LCAgICAweDAwYmR9LCB7MHg4Mzg3LCAgICAweDAwZjd9LCB7MHg4Mzg4LCAgICAweDAwM2V9LAotezB4ODM4OSwgICAgMHgwMDI2fSwgezB4ODM4YSwgICAgMHgwMDBlfSwgezB4ODM4YiwgICAgMHgwMGJkfSwKLXsweDgzOGMsICAgIDB4MDBlNX0sIHsweDgzOGQsICAgIDB4MDAwOX0sIHsweDgzOGUsICAgIDB4MDAyNn0sCi17MHg4MzhmLCAgICAweDAwMDZ9LCB7MHg4MzkwLCAgICAweDAwY2V9LCB7MHg4MzkxLCAgICAweDAwODJ9LAotezB4ODM5MiwgICAgMHgwMGMxfSwgezB4ODM5MywgICAgMHgwMGZmfSwgezB4ODM5NCwgICAgMHgwMDAxfSwKLXsweDgzOTUsICAgIDB4MDAwZn0sIHsweDgzOTYsICAgIDB4MDA3ZX0sIHsweDgzOTcsICAgIDB4MDA4NH0sCi17MHg4Mzk4LCAgICAweDAwMjV9LCB7MHg4Mzk5LCAgICAweDAwZmV9LCB7MHg4MzlhLCAgICAweDAwOGZ9LAotezB4ODM5YiwgICAgMHgwMDU0fSwgezB4ODM5YywgICAgMHgwMGJkfSwgezB4ODM5ZCwgICAgMHgwMGVjfSwKLXsweDgzOWUsICAgIDB4MDA4ZX0sIHsweDgzOWYsICAgIDB4MDBiZH0sIHsweDgzYTAsICAgIDB4MDBmYX0sCi17MHg4M2ExLCAgICAweDAwZjd9LCB7MHg4M2EyLCAgICAweDAwYmR9LCB7MHg4M2EzLCAgICAweDAwZjd9LAotezB4ODNhNCwgICAgMHgwMDMzfSwgezB4ODNhNSwgICAgMHgwMDg2fSwgezB4ODNhNiwgICAgMHgwMDBmfSwKLXsweDgzYTcsICAgIDB4MDBjNn0sIHsweDgzYTgsICAgIDB4MDA1MX0sIHsweDgzYTksICAgIDB4MDBiZH0sCi17MHg4M2FhLCAgICAweDAwZTR9LCB7MHg4M2FiLCAgICAweDAwMTJ9LCB7MHg4M2FjLCAgICAweDAwY2V9LAotezB4ODNhZCwgICAgMHgwMDgzfSwgezB4ODNhZSwgICAgMHgwMGIyfSwgezB4ODNhZiwgICAgMHgwMGZmfSwKLXsweDgzYjAsICAgIDB4MDAwMX0sIHsweDgzYjEsICAgIDB4MDAwZn0sIHsweDgzYjIsICAgIDB4MDA5Nn0sCi17MHg4M2IzLCAgICAweDAwNDZ9LCB7MHg4M2I0LCAgICAweDAwODR9LCB7MHg4M2I1LCAgICAweDAwMGN9LAotezB4ODNiNiwgICAgMHgwMDgxfSwgezB4ODNiNywgICAgMHgwMDA4fSwgezB4ODNiOCwgICAgMHgwMDI2fSwKLXsweDgzYjksICAgIDB4MDA1Y30sIHsweDgzYmEsICAgIDB4MDBiNn0sIHsweDgzYmIsICAgIDB4MDAxMn0sCi17MHg4M2JjLCAgICAweDAwMjB9LCB7MHg4M2JkLCAgICAweDAwODR9LCB7MHg4M2JlLCAgICAweDAwM2Z9LAotezB4ODNiZiwgICAgMHgwMDgxfSwgezB4ODNjMCwgICAgMHgwMDNhfSwgezB4ODNjMSwgICAgMHgwMDI3fSwKLXsweDgzYzIsICAgIDB4MDAxY30sIHsweDgzYzMsICAgIDB4MDA5Nn0sIHsweDgzYzQsICAgIDB4MDAyM30sCi17MHg4M2M1LCAgICAweDAwODV9LCB7MHg4M2M2LCAgICAweDAwNDB9LCB7MHg4M2M3LCAgICAweDAwMjd9LAotezB4ODNjOCwgICAgMHgwMDAzfSwgezB4ODNjOSwgICAgMHgwMDdlfSwgezB4ODNjYSwgICAgMHgwMDg0fSwKLXsweDgzY2IsICAgIDB4MDAyNX0sIHsweDgzY2MsICAgIDB4MDBjNn0sIHsweDgzY2QsICAgIDB4MDA1MX0sCi17MHg4M2NlLCAgICAweDAwYmR9LCB7MHg4M2NmLCAgICAweDAwZTR9LCB7MHg4M2QwLCAgICAweDAwOTF9LAotezB4ODNkMSwgICAgMHgwMDI1fSwgezB4ODNkMiwgICAgMHgwMDAzfSwgezB4ODNkMywgICAgMHgwMDdlfSwKLXsweDgzZDQsICAgIDB4MDA4NH0sIHsweDgzZDUsICAgIDB4MDAyNX0sIHsweDgzZDYsICAgIDB4MDBjZX0sCi17MHg4M2Q3LCAgICAweDAwODJ9LCB7MHg4M2Q4LCAgICAweDAwYzF9LCB7MHg4M2Q5LCAgICAweDAwZmZ9LAotezB4ODNkYSwgICAgMHgwMDAxfSwgezB4ODNkYiwgICAgMHgwMDBmfSwgezB4ODNkYywgICAgMHgwMDdlfSwKLXsweDgzZGQsICAgIDB4MDA4NH0sIHsweDgzZGUsICAgIDB4MDAyNX0sIHsweDgzZGYsICAgIDB4MDBiZH0sCi17MHg4M2UwLCAgICAweDAwZjh9LCB7MHg4M2UxLCAgICAweDAwMzd9LCB7MHg4M2UyLCAgICAweDAwN2N9LAotezB4ODNlMywgICAgMHgwMDAwfSwgezB4ODNlNCwgICAgMHgwMDdhfSwgezB4ODNlNSwgICAgMHgwMGNlfSwKLXsweDgzZTYsICAgIDB4MDA4M30sIHsweDgzZTcsICAgIDB4MDBlZX0sIHsweDgzZTgsICAgIDB4MDBmZn0sCi17MHg4M2U5LCAgICAweDAwMDF9LCB7MHg4M2VhLCAgICAweDAwMGZ9LCB7MHg4M2ViLCAgICAweDAwN2V9LAotezB4ODNlYywgICAgMHgwMDg0fSwgezB4ODNlZCwgICAgMHgwMDI1fSwgezB4ODNlZSwgICAgMHgwMDk2fSwKLXsweDgzZWYsICAgIDB4MDA0Nn0sIHsweDgzZjAsICAgIDB4MDA4NH0sIHsweDgzZjEsICAgIDB4MDAwY30sCi17MHg4M2YyLCAgICAweDAwODF9LCB7MHg4M2YzLCAgICAweDAwMDh9LCB7MHg4M2Y0LCAgICAweDAwMjZ9LAotezB4ODNmNSwgICAgMHgwMDIwfSwgezB4ODNmNiwgICAgMHgwMDk2fSwgezB4ODNmNywgICAgMHgwMDI0fSwKLXsweDgzZjgsICAgIDB4MDA4NH0sIHsweDgzZjksICAgIDB4MDAwOH0sIHsweDgzZmEsICAgIDB4MDAyNn0sCi17MHg4M2ZiLCAgICAweDAwMjl9LCB7MHg4M2ZjLCAgICAweDAwYjZ9LCB7MHg4M2ZkLCAgICAweDAwMTh9LAotezB4ODNmZSwgICAgMHgwMDgyfSwgezB4ODNmZiwgICAgMHgwMGJifSwgezB4ODQwMCwgICAgMHgwMDE5fSwKLXsweDg0MDEsICAgIDB4MDA4Mn0sIHsweDg0MDIsICAgIDB4MDBiMX0sIHsweDg0MDMsICAgIDB4MDAwMX0sCi17MHg4NDA0LCAgICAweDAwM2J9LCB7MHg4NDA1LCAgICAweDAwMjJ9LCB7MHg4NDA2LCAgICAweDAwMDl9LAotezB4ODQwNywgICAgMHgwMGI2fSwgezB4ODQwOCwgICAgMHgwMDEyfSwgezB4ODQwOSwgICAgMHgwMDIwfSwKLXsweDg0MGEsICAgIDB4MDA4NH0sIHsweDg0MGIsICAgIDB4MDAzN30sIHsweDg0MGMsICAgIDB4MDA4MX0sCi17MHg4NDBkLCAgICAweDAwMzJ9LCB7MHg4NDBlLCAgICAweDAwMjd9LCB7MHg4NDBmLCAgICAweDAwMTV9LAotezB4ODQxMCwgICAgMHgwMGJkfSwgezB4ODQxMSwgICAgMHgwMGY4fSwgezB4ODQxMiwgICAgMHgwMDQ0fSwKLXsweDg0MTMsICAgIDB4MDA3ZX0sIHsweDg0MTQsICAgIDB4MDA4Mn0sIHsweDg0MTUsICAgIDB4MDBjMX0sCi17MHg4NDE2LCAgICAweDAwYmR9LCB7MHg4NDE3LCAgICAweDAwZjd9LCB7MHg4NDE4LCAgICAweDAwMWZ9LAotezB4ODQxOSwgICAgMHgwMGJkfSwgezB4ODQxYSwgICAgMHgwMGY4fSwgezB4ODQxYiwgICAgMHgwMDQ0fSwKLXsweDg0MWMsICAgIDB4MDBiZH0sIHsweDg0MWQsICAgIDB4MDBmY30sIHsweDg0MWUsICAgIDB4MDAyOX0sCi17MHg4NDFmLCAgICAweDAwY2V9LCB7MHg4NDIwLCAgICAweDAwODJ9LCB7MHg4NDIxLCAgICAweDAwMjV9LAotezB4ODQyMiwgICAgMHgwMGZmfSwgezB4ODQyMywgICAgMHgwMDAxfSwgezB4ODQyNCwgICAgMHgwMDBmfSwKLXsweDg0MjUsICAgIDB4MDAzOX0sIHsweDg0MjYsICAgIDB4MDA5Nn0sIHsweDg0MjcsICAgIDB4MDA0N30sCi17MHg4NDI4LCAgICAweDAwODR9LCB7MHg4NDI5LCAgICAweDAwZmN9LCB7MHg4NDJhLCAgICAweDAwOGF9LAotezB4ODQyYiwgICAgMHgwMDAwfSwgezB4ODQyYywgICAgMHgwMDk3fSwgezB4ODQyZCwgICAgMHgwMDQ3fSwKLXsweDg0MmUsICAgIDB4MDBjZX0sIHsweDg0MmYsICAgIDB4MDA4NH0sIHsweDg0MzAsICAgIDB4MDAzNH0sCi17MHg4NDMxLCAgICAweDAwZmZ9LCB7MHg4NDMyLCAgICAweDAwMDF9LCB7MHg4NDMzLCAgICAweDAwMTF9LAotezB4ODQzNCwgICAgMHgwMDk2fSwgezB4ODQzNSwgICAgMHgwMDQ2fSwgezB4ODQzNiwgICAgMHgwMDg0fSwKLXsweDg0MzcsICAgIDB4MDAwM30sIHsweDg0MzgsICAgIDB4MDA4MX0sIHsweDg0MzksICAgIDB4MDAwMn0sCi17MHg4NDNhLCAgICAweDAwMjd9LCB7MHg4NDNiLCAgICAweDAwMDN9LCB7MHg4NDNjLCAgICAweDAwN2V9LAotezB4ODQzZCwgICAgMHgwMDg1fSwgezB4ODQzZSwgICAgMHgwMDFlfSwgezB4ODQzZiwgICAgMHgwMDk2fSwKLXsweDg0NDAsICAgIDB4MDA0N30sIHsweDg0NDEsICAgIDB4MDA4NH0sIHsweDg0NDIsICAgIDB4MDBmY30sCi17MHg4NDQzLCAgICAweDAwOGF9LCB7MHg4NDQ0LCAgICAweDAwMDJ9LCB7MHg4NDQ1LCAgICAweDAwOTd9LAotezB4ODQ0NiwgICAgMHgwMDQ3fSwgezB4ODQ0NywgICAgMHgwMGRlfSwgezB4ODQ0OCwgICAgMHgwMGUxfSwKLXsweDg0NDksICAgIDB4MDBhZH0sIHsweDg0NGEsICAgIDB4MDAwMH0sIHsweDg0NGIsICAgIDB4MDA4Nn0sCi17MHg4NDRjLCAgICAweDAwMDF9LCB7MHg4NDRkLCAgICAweDAwYjd9LCB7MHg4NDRlLCAgICAweDAwMTJ9LAotezB4ODQ0ZiwgICAgMHgwMDUxfSwgezB4ODQ1MCwgICAgMHgwMGJkfSwgezB4ODQ1MSwgICAgMHgwMGY3fSwKLXsweDg0NTIsICAgIDB4MDAxNH0sIHsweDg0NTMsICAgIDB4MDBiNn0sIHsweDg0NTQsICAgIDB4MDAxMH0sCi17MHg4NDU1LCAgICAweDAwMzF9LCB7MHg4NDU2LCAgICAweDAwODR9LCB7MHg4NDU3LCAgICAweDAwZmR9LAotezB4ODQ1OCwgICAgMHgwMGI3fSwgezB4ODQ1OSwgICAgMHgwMDEwfSwgezB4ODQ1YSwgICAgMHgwMDMxfSwKLXsweDg0NWIsICAgIDB4MDBiZH0sIHsweDg0NWMsICAgIDB4MDBmOH0sIHsweDg0NWQsICAgIDB4MDAxZX0sCi17MHg4NDVlLCAgICAweDAwOTZ9LCB7MHg4NDVmLCAgICAweDAwODF9LCB7MHg4NDYwLCAgICAweDAwZDZ9LAotezB4ODQ2MSwgICAgMHgwMDgyfSwgezB4ODQ2MiwgICAgMHgwMGZlfSwgezB4ODQ2MywgICAgMHgwMDhmfSwKLXsweDg0NjQsICAgIDB4MDA1YX0sIHsweDg0NjUsICAgIDB4MDBiZH0sIHsweDg0NjYsICAgIDB4MDBmN30sCi17MHg4NDY3LCAgICAweDAwYjZ9LCB7MHg4NDY4LCAgICAweDAwZmV9LCB7MHg4NDY5LCAgICAweDAwOGZ9LAotezB4ODQ2YSwgICAgMHgwMDVjfSwgezB4ODQ2YiwgICAgMHgwMGJkfSwgezB4ODQ2YywgICAgMHgwMGVjfSwKLXsweDg0NmQsICAgIDB4MDA4ZX0sIHsweDg0NmUsICAgIDB4MDBiZH0sIHsweDg0NmYsICAgIDB4MDBmYX0sCi17MHg4NDcwLCAgICAweDAwZjd9LCB7MHg4NDcxLCAgICAweDAwODZ9LCB7MHg4NDcyLCAgICAweDAwMDh9LAotezB4ODQ3MywgICAgMHgwMGQ2fSwgezB4ODQ3NCwgICAgMHgwMDAwfSwgezB4ODQ3NSwgICAgMHgwMGM1fSwKLXsweDg0NzYsICAgIDB4MDAxMH0sIHsweDg0NzcsICAgIDB4MDAyNn0sIHsweDg0NzgsICAgIDB4MDAwMn0sCi17MHg4NDc5LCAgICAweDAwOGJ9LCB7MHg4NDdhLCAgICAweDAwMjB9LCB7MHg4NDdiLCAgICAweDAwYzZ9LAotezB4ODQ3YywgICAgMHgwMDUxfSwgezB4ODQ3ZCwgICAgMHgwMGJkfSwgezB4ODQ3ZSwgICAgMHgwMGU0fSwKLXsweDg0N2YsICAgIDB4MDAxMn0sIHsweDg0ODAsICAgIDB4MDBjZX0sIHsweDg0ODEsICAgIDB4MDA4NH0sCi17MHg4NDgyLCAgICAweDAwODZ9LCB7MHg4NDgzLCAgICAweDAwZmZ9LCB7MHg4NDg0LCAgICAweDAwMDF9LAotezB4ODQ4NSwgICAgMHgwMDExfSwgezB4ODQ4NiwgICAgMHgwMDk2fSwgezB4ODQ4NywgICAgMHgwMDQ2fSwKLXsweDg0ODgsICAgIDB4MDA4NH0sIHsweDg0ODksICAgIDB4MDAwM30sIHsweDg0OGEsICAgIDB4MDA4MX0sCi17MHg4NDhiLCAgICAweDAwMDJ9LCB7MHg4NDhjLCAgICAweDAwMjd9LCB7MHg4NDhkLCAgICAweDAwMDN9LAotezB4ODQ4ZSwgICAgMHgwMDdlfSwgezB4ODQ4ZiwgICAgMHgwMDg1fSwgezB4ODQ5MCwgICAgMHgwMDBmfSwKLXsweDg0OTEsICAgIDB4MDBjNn0sIHsweDg0OTIsICAgIDB4MDA1MX0sIHsweDg0OTMsICAgIDB4MDBiZH0sCi17MHg4NDk0LCAgICAweDAwZTR9LCB7MHg4NDk1LCAgICAweDAwOTF9LCB7MHg4NDk2LCAgICAweDAwMjV9LAotezB4ODQ5NywgICAgMHgwMDAzfSwgezB4ODQ5OCwgICAgMHgwMDdlfSwgezB4ODQ5OSwgICAgMHgwMDg1fSwKLXsweDg0OWEsICAgIDB4MDAxZX0sIHsweDg0OWIsICAgIDB4MDA5Nn0sIHsweDg0OWMsICAgIDB4MDA0NH0sCi17MHg4NDlkLCAgICAweDAwODV9LCB7MHg4NDllLCAgICAweDAwMTB9LCB7MHg4NDlmLCAgICAweDAwMjZ9LAotezB4ODRhMCwgICAgMHgwMDBhfSwgezB4ODRhMSwgICAgMHgwMGI2fSwgezB4ODRhMiwgICAgMHgwMDEyfSwKLXsweDg0YTMsICAgIDB4MDA1MH0sIHsweDg0YTQsICAgIDB4MDBiYX0sIHsweDg0YTUsICAgIDB4MDAwMX0sCi17MHg4NGE2LCAgICAweDAwM2N9LCB7MHg4NGE3LCAgICAweDAwODV9LCB7MHg4NGE4LCAgICAweDAwMTB9LAotezB4ODRhOSwgICAgMHgwMDI3fSwgezB4ODRhYSwgICAgMHgwMGE4fSwgezB4ODRhYiwgICAgMHgwMGJkfSwKLXsweDg0YWMsICAgIDB4MDBmN30sIHsweDg0YWQsICAgIDB4MDA2Nn0sIHsweDg0YWUsICAgIDB4MDBjZX0sCi17MHg4NGFmLCAgICAweDAwODR9LCB7MHg4NGIwLCAgICAweDAwYjd9LCB7MHg4NGIxLCAgICAweDAwZmZ9LAotezB4ODRiMiwgICAgMHgwMDAxfSwgezB4ODRiMywgICAgMHgwMDExfSwgezB4ODRiNCwgICAgMHgwMDdlfSwKLXsweDg0YjUsICAgIDB4MDA4NX0sIHsweDg0YjYsICAgIDB4MDAxZX0sIHsweDg0YjcsICAgIDB4MDA5Nn0sCi17MHg4NGI4LCAgICAweDAwNDZ9LCB7MHg4NGI5LCAgICAweDAwODR9LCB7MHg4NGJhLCAgICAweDAwMDN9LAotezB4ODRiYiwgICAgMHgwMDgxfSwgezB4ODRiYywgICAgMHgwMDAyfSwgezB4ODRiZCwgICAgMHgwMDI2fSwKLXsweDg0YmUsICAgIDB4MDA1MH0sIHsweDg0YmYsICAgIDB4MDBiNn0sIHsweDg0YzAsICAgIDB4MDAxMn0sCi17MHg4NGMxLCAgICAweDAwMzB9LCB7MHg4NGMyLCAgICAweDAwODR9LCB7MHg4NGMzLCAgICAweDAwMDN9LAotezB4ODRjNCwgICAgMHgwMDgxfSwgezB4ODRjNSwgICAgMHgwMDAxfSwgezB4ODRjNiwgICAgMHgwMDI3fSwKLXsweDg0YzcsICAgIDB4MDAwM30sIHsweDg0YzgsICAgIDB4MDA3ZX0sIHsweDg0YzksICAgIDB4MDA4NX0sCi17MHg4NGNhLCAgICAweDAwMWV9LCB7MHg4NGNiLCAgICAweDAwOTZ9LCB7MHg4NGNjLCAgICAweDAwNDR9LAotezB4ODRjZCwgICAgMHgwMDg1fSwgezB4ODRjZSwgICAgMHgwMDEwfSwgezB4ODRjZiwgICAgMHgwMDI2fSwKLXsweDg0ZDAsICAgIDB4MDAxM30sIHsweDg0ZDEsICAgIDB4MDBiNn0sIHsweDg0ZDIsICAgIDB4MDAxMn0sCi17MHg4NGQzLCAgICAweDAwNTB9LCB7MHg4NGQ0LCAgICAweDAwYmF9LCB7MHg4NGQ1LCAgICAweDAwMDF9LAotezB4ODRkNiwgICAgMHgwMDNjfSwgezB4ODRkNywgICAgMHgwMDg1fSwgezB4ODRkOCwgICAgMHgwMDEwfSwKLXsweDg0ZDksICAgIDB4MDAyNn0sIHsweDg0ZGEsICAgIDB4MDAwOX0sIHsweDg0ZGIsICAgIDB4MDBjZX0sCi17MHg4NGRjLCAgICAweDAwODR9LCB7MHg4NGRkLCAgICAweDAwNTN9LCB7MHg4NGRlLCAgICAweDAwZmZ9LAotezB4ODRkZiwgICAgMHgwMDAxfSwgezB4ODRlMCwgICAgMHgwMDExfSwgezB4ODRlMSwgICAgMHgwMDdlfSwKLXsweDg0ZTIsICAgIDB4MDA4NX0sIHsweDg0ZTMsICAgIDB4MDAxZX0sIHsweDg0ZTQsICAgIDB4MDBiNn0sCi17MHg4NGU1LCAgICAweDAwMTB9LCB7MHg4NGU2LCAgICAweDAwMzF9LCB7MHg4NGU3LCAgICAweDAwOGF9LAotezB4ODRlOCwgICAgMHgwMDAyfSwgezB4ODRlOSwgICAgMHgwMGI3fSwgezB4ODRlYSwgICAgMHgwMDEwfSwKLXsweDg0ZWIsICAgIDB4MDAzMX0sIHsweDg0ZWMsICAgIDB4MDBiZH0sIHsweDg0ZWQsICAgIDB4MDA4NX0sCi17MHg4NGVlLCAgICAweDAwMWZ9LCB7MHg4NGVmLCAgICAweDAwYmR9LCB7MHg4NGYwLCAgICAweDAwZjh9LAotezB4ODRmMSwgICAgMHgwMDM3fSwgezB4ODRmMiwgICAgMHgwMDdjfSwgezB4ODRmMywgICAgMHgwMDAwfSwKLXsweDg0ZjQsICAgIDB4MDA4MH0sIHsweDg0ZjUsICAgIDB4MDBjZX0sIHsweDg0ZjYsICAgIDB4MDA4NH0sCi17MHg4NGY3LCAgICAweDAwZmV9LCB7MHg4NGY4LCAgICAweDAwZmZ9LCB7MHg4NGY5LCAgICAweDAwMDF9LAotezB4ODRmYSwgICAgMHgwMDExfSwgezB4ODRmYiwgICAgMHgwMDdlfSwgezB4ODRmYywgICAgMHgwMDg1fSwKLXsweDg0ZmQsICAgIDB4MDAxZX0sIHsweDg0ZmUsICAgIDB4MDA5Nn0sIHsweDg0ZmYsICAgIDB4MDA0Nn0sCi17MHg4NTAwLCAgICAweDAwODR9LCB7MHg4NTAxLCAgICAweDAwMDN9LCB7MHg4NTAyLCAgICAweDAwODF9LAotezB4ODUwMywgICAgMHgwMDAyfSwgezB4ODUwNCwgICAgMHgwMDI2fSwgezB4ODUwNSwgICAgMHgwMDA5fSwKLXsweDg1MDYsICAgIDB4MDBiNn0sIHsweDg1MDcsICAgIDB4MDAxMn0sIHsweDg1MDgsICAgIDB4MDAzMH0sCi17MHg4NTA5LCAgICAweDAwODR9LCB7MHg4NTBhLCAgICAweDAwMDN9LCB7MHg4NTBiLCAgICAweDAwODF9LAotezB4ODUwYywgICAgMHgwMDAxfSwgezB4ODUwZCwgICAgMHgwMDI3fSwgezB4ODUwZSwgICAgMHgwMDBmfSwKLXsweDg1MGYsICAgIDB4MDBiZH0sIHsweDg1MTAsICAgIDB4MDBmOH0sIHsweDg1MTEsICAgIDB4MDA0NH0sCi17MHg4NTEyLCAgICAweDAwYmR9LCB7MHg4NTEzLCAgICAweDAwZjd9LCB7MHg4NTE0LCAgICAweDAwMGJ9LAotezB4ODUxNSwgICAgMHgwMGJkfSwgezB4ODUxNiwgICAgMHgwMGZjfSwgezB4ODUxNywgICAgMHgwMDI5fSwKLXsweDg1MTgsICAgIDB4MDBjZX0sIHsweDg1MTksICAgIDB4MDA4NH0sIHsweDg1MWEsICAgIDB4MDAyNn0sCi17MHg4NTFiLCAgICAweDAwZmZ9LCB7MHg4NTFjLCAgICAweDAwMDF9LCB7MHg4NTFkLCAgICAweDAwMTF9LAotezB4ODUxZSwgICAgMHgwMDM5fSwgezB4ODUxZiwgICAgMHgwMGQ2fSwgezB4ODUyMCwgICAgMHgwMDIyfSwKLXsweDg1MjEsICAgIDB4MDBjNH0sIHsweDg1MjIsICAgIDB4MDAwZn0sIHsweDg1MjMsICAgIDB4MDBiNn0sCi17MHg4NTI0LCAgICAweDAwMTJ9LCB7MHg4NTI1LCAgICAweDAwMzB9LCB7MHg4NTI2LCAgICAweDAwYmF9LAotezB4ODUyNywgICAgMHgwMDEyfSwgezB4ODUyOCwgICAgMHgwMDMyfSwgezB4ODUyOSwgICAgMHgwMDg0fSwKLXsweDg1MmEsICAgIDB4MDAwNH0sIHsweDg1MmIsICAgIDB4MDAyN30sIHsweDg1MmMsICAgIDB4MDAwZH0sCi17MHg4NTJkLCAgICAweDAwOTZ9LCB7MHg4NTJlLCAgICAweDAwMjJ9LCB7MHg4NTJmLCAgICAweDAwODV9LAotezB4ODUzMCwgICAgMHgwMDA0fSwgezB4ODUzMSwgICAgMHgwMDI3fSwgezB4ODUzMiwgICAgMHgwMDA1fSwKLXsweDg1MzMsICAgIDB4MDBjYX0sIHsweDg1MzQsICAgIDB4MDAxMH0sIHsweDg1MzUsICAgIDB4MDA3ZX0sCi17MHg4NTM2LCAgICAweDAwODV9LCB7MHg4NTM3LCAgICAweDAwM2F9LCB7MHg4NTM4LCAgICAweDAwY2F9LAotezB4ODUzOSwgICAgMHgwMDIwfSwgezB4ODUzYSwgICAgMHgwMGQ3fSwgezB4ODUzYiwgICAgMHgwMDIyfSwKLXsweDg1M2MsICAgIDB4MDAzOX0sIHsweDg1M2QsICAgIDB4MDA4Nn0sIHsweDg1M2UsICAgIDB4MDAwMH0sCi17MHg4NTNmLCAgICAweDAwOTd9LCB7MHg4NTQwLCAgICAweDAwODN9LCB7MHg4NTQxLCAgICAweDAwMTh9LAotezB4ODU0MiwgICAgMHgwMGNlfSwgezB4ODU0MywgICAgMHgwMDFjfSwgezB4ODU0NCwgICAgMHgwMDAwfSwKLXsweDg1NDUsICAgIDB4MDBiZH0sIHsweDg1NDYsICAgIDB4MDBlYn0sIHsweDg1NDcsICAgIDB4MDA0Nn0sCi17MHg4NTQ4LCAgICAweDAwOTZ9LCB7MHg4NTQ5LCAgICAweDAwNTd9LCB7MHg4NTRhLCAgICAweDAwODV9LAotezB4ODU0YiwgICAgMHgwMDAxfSwgezB4ODU0YywgICAgMHgwMDI3fSwgezB4ODU0ZCwgICAgMHgwMDAyfSwKLXsweDg1NGUsICAgIDB4MDA0Zn0sIHsweDg1NGYsICAgIDB4MDAzOX0sIHsweDg1NTAsICAgIDB4MDA4NX0sCi17MHg4NTUxLCAgICAweDAwMDJ9LCB7MHg4NTUyLCAgICAweDAwMjd9LCB7MHg4NTUzLCAgICAweDAwMDF9LAotezB4ODU1NCwgICAgMHgwMDM5fSwgezB4ODU1NSwgICAgMHgwMDdmfSwgezB4ODU1NiwgICAgMHgwMDhmfSwKLXsweDg1NTcsICAgIDB4MDA3ZH0sIHsweDg1NTgsICAgIDB4MDA4Nn0sIHsweDg1NTksICAgIDB4MDAwNH0sCi17MHg4NTVhLCAgICAweDAwYjd9LCB7MHg4NTViLCAgICAweDAwMTJ9LCB7MHg4NTVjLCAgICAweDAwMDR9LAotezB4ODU1ZCwgICAgMHgwMDg2fSwgezB4ODU1ZSwgICAgMHgwMDA4fSwgezB4ODU1ZiwgICAgMHgwMGI3fSwKLXsweDg1NjAsICAgIDB4MDAxMn0sIHsweDg1NjEsICAgIDB4MDAwN30sIHsweDg1NjIsICAgIDB4MDA4Nn0sCi17MHg4NTYzLCAgICAweDAwMTB9LCB7MHg4NTY0LCAgICAweDAwYjd9LCB7MHg4NTY1LCAgICAweDAwMTJ9LAotezB4ODU2NiwgICAgMHgwMDBjfSwgezB4ODU2NywgICAgMHgwMDg2fSwgezB4ODU2OCwgICAgMHgwMDA3fSwKLXsweDg1NjksICAgIDB4MDBiN30sIHsweDg1NmEsICAgIDB4MDAxMn0sIHsweDg1NmIsICAgIDB4MDAwNn0sCi17MHg4NTZjLCAgICAweDAwYjZ9LCB7MHg4NTZkLCAgICAweDAwOGZ9LCB7MHg4NTZlLCAgICAweDAwN2R9LAotezB4ODU2ZiwgICAgMHgwMGI3fSwgezB4ODU3MCwgICAgMHgwMDEyfSwgezB4ODU3MSwgICAgMHgwMDcwfSwKLXsweDg1NzIsICAgIDB4MDA4Nn0sIHsweDg1NzMsICAgIDB4MDAwMX0sIHsweDg1NzQsICAgIDB4MDBiYX0sCi17MHg4NTc1LCAgICAweDAwMTJ9LCB7MHg4NTc2LCAgICAweDAwMDR9LCB7MHg4NTc3LCAgICAweDAwYjd9LAotezB4ODU3OCwgICAgMHgwMDEyfSwgezB4ODU3OSwgICAgMHgwMDA0fSwgezB4ODU3YSwgICAgMHgwMDAxfSwKLXsweDg1N2IsICAgIDB4MDAwMX0sIHsweDg1N2MsICAgIDB4MDAwMX0sIHsweDg1N2QsICAgIDB4MDAwMX0sCi17MHg4NTdlLCAgICAweDAwMDF9LCB7MHg4NTdmLCAgICAweDAwMDF9LCB7MHg4NTgwLCAgICAweDAwYjZ9LAotezB4ODU4MSwgICAgMHgwMDEyfSwgezB4ODU4MiwgICAgMHgwMDA0fSwgezB4ODU4MywgICAgMHgwMDg0fSwKLXsweDg1ODQsICAgIDB4MDBmZX0sIHsweDg1ODUsICAgIDB4MDA4YX0sIHsweDg1ODYsICAgIDB4MDAwMn0sCi17MHg4NTg3LCAgICAweDAwYjd9LCB7MHg4NTg4LCAgICAweDAwMTJ9LCB7MHg4NTg5LCAgICAweDAwMDR9LAotezB4ODU4YSwgICAgMHgwMDAxfSwgezB4ODU4YiwgICAgMHgwMDAxfSwgezB4ODU4YywgICAgMHgwMDAxfSwKLXsweDg1OGQsICAgIDB4MDAwMX0sIHsweDg1OGUsICAgIDB4MDAwMX0sIHsweDg1OGYsICAgIDB4MDAwMX0sCi17MHg4NTkwLCAgICAweDAwODZ9LCB7MHg4NTkxLCAgICAweDAwZmR9LCB7MHg4NTkyLCAgICAweDAwYjR9LAotezB4ODU5MywgICAgMHgwMDEyfSwgezB4ODU5NCwgICAgMHgwMDA0fSwgezB4ODU5NSwgICAgMHgwMGI3fSwKLXsweDg1OTYsICAgIDB4MDAxMn0sIHsweDg1OTcsICAgIDB4MDAwNH0sIHsweDg1OTgsICAgIDB4MDBiNn0sCi17MHg4NTk5LCAgICAweDAwMTJ9LCB7MHg4NTlhLCAgICAweDAwMDB9LCB7MHg4NTliLCAgICAweDAwODR9LAotezB4ODU5YywgICAgMHgwMDA4fSwgezB4ODU5ZCwgICAgMHgwMDgxfSwgezB4ODU5ZSwgICAgMHgwMDA4fSwKLXsweDg1OWYsICAgIDB4MDAyN30sIHsweDg1YTAsICAgIDB4MDAxNn0sIHsweDg1YTEsICAgIDB4MDBiNn0sCi17MHg4NWEyLCAgICAweDAwOGZ9LCB7MHg4NWEzLCAgICAweDAwN2R9LCB7MHg4NWE0LCAgICAweDAwODF9LAotezB4ODVhNSwgICAgMHgwMDBjfSwgezB4ODVhNiwgICAgMHgwMDI3fSwgezB4ODVhNywgICAgMHgwMDA4fSwKLXsweDg1YTgsICAgIDB4MDA4Yn0sIHsweDg1YTksICAgIDB4MDAwNH0sIHsweDg1YWEsICAgIDB4MDBiN30sCi17MHg4NWFiLCAgICAweDAwOGZ9LCB7MHg4NWFjLCAgICAweDAwN2R9LCB7MHg4NWFkLCAgICAweDAwN2V9LAotezB4ODVhZSwgICAgMHgwMDg1fSwgezB4ODVhZiwgICAgMHgwMDZjfSwgezB4ODViMCwgICAgMHgwMDg2fSwKLXsweDg1YjEsICAgIDB4MDAwM30sIHsweDg1YjIsICAgIDB4MDA5N30sIHsweDg1YjMsICAgIDB4MDA0MH0sCi17MHg4NWI0LCAgICAweDAwN2V9LCB7MHg4NWI1LCAgICAweDAwODl9LCB7MHg4NWI2LCAgICAweDAwNmV9LAotezB4ODViNywgICAgMHgwMDg2fSwgezB4ODViOCwgICAgMHgwMDA3fSwgezB4ODViOSwgICAgMHgwMGI3fSwKLXsweDg1YmEsICAgIDB4MDAxMn0sIHsweDg1YmIsICAgIDB4MDAwNn0sIHsweDg1YmMsICAgIDB4MDA1Zn0sCi17MHg4NWJkLCAgICAweDAwZjd9LCB7MHg4NWJlLCAgICAweDAwOGZ9LCB7MHg4NWJmLCAgICAweDAwODJ9LAotezB4ODVjMCwgICAgMHgwMDVmfSwgezB4ODVjMSwgICAgMHgwMGY3fSwgezB4ODVjMiwgICAgMHgwMDhmfSwKLXsweDg1YzMsICAgIDB4MDA3Zn0sIHsweDg1YzQsICAgIDB4MDBmN30sIHsweDg1YzUsICAgIDB4MDA4Zn0sCi17MHg4NWM2LCAgICAweDAwNzB9LCB7MHg4NWM3LCAgICAweDAwZjd9LCB7MHg4NWM4LCAgICAweDAwOGZ9LAotezB4ODVjOSwgICAgMHgwMDcxfSwgezB4ODVjYSwgICAgMHgwMGY3fSwgezB4ODVjYiwgICAgMHgwMDhmfSwKLXsweDg1Y2MsICAgIDB4MDA3Mn0sIHsweDg1Y2QsICAgIDB4MDBmN30sIHsweDg1Y2UsICAgIDB4MDA4Zn0sCi17MHg4NWNmLCAgICAweDAwNzN9LCB7MHg4NWQwLCAgICAweDAwZjd9LCB7MHg4NWQxLCAgICAweDAwOGZ9LAotezB4ODVkMiwgICAgMHgwMDc0fSwgezB4ODVkMywgICAgMHgwMGY3fSwgezB4ODVkNCwgICAgMHgwMDhmfSwKLXsweDg1ZDUsICAgIDB4MDA3NX0sIHsweDg1ZDYsICAgIDB4MDBmN30sIHsweDg1ZDcsICAgIDB4MDA4Zn0sCi17MHg4NWQ4LCAgICAweDAwNzZ9LCB7MHg4NWQ5LCAgICAweDAwZjd9LCB7MHg4NWRhLCAgICAweDAwOGZ9LAotezB4ODVkYiwgICAgMHgwMDc3fSwgezB4ODVkYywgICAgMHgwMGY3fSwgezB4ODVkZCwgICAgMHgwMDhmfSwKLXsweDg1ZGUsICAgIDB4MDA3OH0sIHsweDg1ZGYsICAgIDB4MDBmN30sIHsweDg1ZTAsICAgIDB4MDA4Zn0sCi17MHg4NWUxLCAgICAweDAwNzl9LCB7MHg4NWUyLCAgICAweDAwZjd9LCB7MHg4NWUzLCAgICAweDAwOGZ9LAotezB4ODVlNCwgICAgMHgwMDdhfSwgezB4ODVlNSwgICAgMHgwMGY3fSwgezB4ODVlNiwgICAgMHgwMDhmfSwKLXsweDg1ZTcsICAgIDB4MDA3Yn0sIHsweDg1ZTgsICAgIDB4MDBiNn0sIHsweDg1ZTksICAgIDB4MDAxMn0sCi17MHg4NWVhLCAgICAweDAwMDR9LCB7MHg4NWViLCAgICAweDAwOGF9LCB7MHg4NWVjLCAgICAweDAwMTB9LAotezB4ODVlZCwgICAgMHgwMGI3fSwgezB4ODVlZSwgICAgMHgwMDEyfSwgezB4ODVlZiwgICAgMHgwMDA0fSwKLXsweDg1ZjAsICAgIDB4MDA4Nn0sIHsweDg1ZjEsICAgIDB4MDBlNH0sIHsweDg1ZjIsICAgIDB4MDBiN30sCi17MHg4NWYzLCAgICAweDAwMTJ9LCB7MHg4NWY0LCAgICAweDAwNzB9LCB7MHg4NWY1LCAgICAweDAwYjd9LAotezB4ODVmNiwgICAgMHgwMDEyfSwgezB4ODVmNywgICAgMHgwMDA3fSwgezB4ODVmOCwgICAgMHgwMGY3fSwKLXsweDg1ZjksICAgIDB4MDAxMn0sIHsweDg1ZmEsICAgIDB4MDAwNX0sIHsweDg1ZmIsICAgIDB4MDBmN30sCi17MHg4NWZjLCAgICAweDAwMTJ9LCB7MHg4NWZkLCAgICAweDAwMDl9LCB7MHg4NWZlLCAgICAweDAwODZ9LAotezB4ODVmZiwgICAgMHgwMDA4fSwgezB4ODYwMCwgICAgMHgwMGJhfSwgezB4ODYwMSwgICAgMHgwMDEyfSwKLXsweDg2MDIsICAgIDB4MDAwNH0sIHsweDg2MDMsICAgIDB4MDBiN30sIHsweDg2MDQsICAgIDB4MDAxMn0sCi17MHg4NjA1LCAgICAweDAwMDR9LCB7MHg4NjA2LCAgICAweDAwODZ9LCB7MHg4NjA3LCAgICAweDAwZjd9LAotezB4ODYwOCwgICAgMHgwMGI0fSwgezB4ODYwOSwgICAgMHgwMDEyfSwgezB4ODYwYSwgICAgMHgwMDA0fSwKLXsweDg2MGIsICAgIDB4MDBiN30sIHsweDg2MGMsICAgIDB4MDAxMn0sIHsweDg2MGQsICAgIDB4MDAwNH0sCi17MHg4NjBlLCAgICAweDAwMDF9LCB7MHg4NjBmLCAgICAweDAwMDF9LCB7MHg4NjEwLCAgICAweDAwMDF9LAotezB4ODYxMSwgICAgMHgwMDAxfSwgezB4ODYxMiwgICAgMHgwMDAxfSwgezB4ODYxMywgICAgMHgwMDAxfSwKLXsweDg2MTQsICAgIDB4MDBiNn0sIHsweDg2MTUsICAgIDB4MDAxMn0sIHsweDg2MTYsICAgIDB4MDAwOH0sCi17MHg4NjE3LCAgICAweDAwMjd9LCB7MHg4NjE4LCAgICAweDAwN2Z9LCB7MHg4NjE5LCAgICAweDAwODF9LAotezB4ODYxYSwgICAgMHgwMDgwfSwgezB4ODYxYiwgICAgMHgwMDI2fSwgezB4ODYxYywgICAgMHgwMDBifSwKLXsweDg2MWQsICAgIDB4MDA4Nn0sIHsweDg2MWUsICAgIDB4MDAwOH0sIHsweDg2MWYsICAgIDB4MDBjZX0sCi17MHg4NjIwLCAgICAweDAwOGZ9LCB7MHg4NjIxLCAgICAweDAwNzl9LCB7MHg4NjIyLCAgICAweDAwYmR9LAotezB4ODYyMywgICAgMHgwMDg5fSwgezB4ODYyNCwgICAgMHgwMDdifSwgezB4ODYyNSwgICAgMHgwMDdlfSwKLXsweDg2MjYsICAgIDB4MDA4Nn0sIHsweDg2MjcsICAgIDB4MDA4ZX0sIHsweDg2MjgsICAgIDB4MDA4MX0sCi17MHg4NjI5LCAgICAweDAwNDB9LCB7MHg4NjJhLCAgICAweDAwMjZ9LCB7MHg4NjJiLCAgICAweDAwMGJ9LAotezB4ODYyYywgICAgMHgwMDg2fSwgezB4ODYyZCwgICAgMHgwMDA0fSwgezB4ODYyZSwgICAgMHgwMGNlfSwKLXsweDg2MmYsICAgIDB4MDA4Zn0sIHsweDg2MzAsICAgIDB4MDA3Nn0sIHsweDg2MzEsICAgIDB4MDBiZH0sCi17MHg4NjMyLCAgICAweDAwODl9LCB7MHg4NjMzLCAgICAweDAwN2J9LCB7MHg4NjM0LCAgICAweDAwN2V9LAotezB4ODYzNSwgICAgMHgwMDg2fSwgezB4ODYzNiwgICAgMHgwMDhlfSwgezB4ODYzNywgICAgMHgwMDgxfSwKLXsweDg2MzgsICAgIDB4MDAyMH0sIHsweDg2MzksICAgIDB4MDAyNn0sIHsweDg2M2EsICAgIDB4MDAwYn0sCi17MHg4NjNiLCAgICAweDAwODZ9LCB7MHg4NjNjLCAgICAweDAwMDJ9LCB7MHg4NjNkLCAgICAweDAwY2V9LAotezB4ODYzZSwgICAgMHgwMDhmfSwgezB4ODYzZiwgICAgMHgwMDczfSwgezB4ODY0MCwgICAgMHgwMGJkfSwKLXsweDg2NDEsICAgIDB4MDA4OX0sIHsweDg2NDIsICAgIDB4MDA3Yn0sIHsweDg2NDMsICAgIDB4MDA3ZX0sCi17MHg4NjQ0LCAgICAweDAwODZ9LCB7MHg4NjQ1LCAgICAweDAwOGV9LCB7MHg4NjQ2LCAgICAweDAwODF9LAotezB4ODY0NywgICAgMHgwMDEwfSwgezB4ODY0OCwgICAgMHgwMDI2fSwgezB4ODY0OSwgICAgMHgwMDBifSwKLXsweDg2NGEsICAgIDB4MDA4Nn0sIHsweDg2NGIsICAgIDB4MDAwMX0sIHsweDg2NGMsICAgIDB4MDBjZX0sCi17MHg4NjRkLCAgICAweDAwOGZ9LCB7MHg4NjRlLCAgICAweDAwNzB9LCB7MHg4NjRmLCAgICAweDAwYmR9LAotezB4ODY1MCwgICAgMHgwMDg5fSwgezB4ODY1MSwgICAgMHgwMDdifSwgezB4ODY1MiwgICAgMHgwMDdlfSwKLXsweDg2NTMsICAgIDB4MDA4Nn0sIHsweDg2NTQsICAgIDB4MDA4ZX0sIHsweDg2NTUsICAgIDB4MDA4MX0sCi17MHg4NjU2LCAgICAweDAwMDh9LCB7MHg4NjU3LCAgICAweDAwMjZ9LCB7MHg4NjU4LCAgICAweDAwMGJ9LAotezB4ODY1OSwgICAgMHgwMDg2fSwgezB4ODY1YSwgICAgMHgwMDA4fSwgezB4ODY1YiwgICAgMHgwMGNlfSwKLXsweDg2NWMsICAgIDB4MDA4Zn0sIHsweDg2NWQsICAgIDB4MDA3OX0sIHsweDg2NWUsICAgIDB4MDBiZH0sCi17MHg4NjVmLCAgICAweDAwODl9LCB7MHg4NjYwLCAgICAweDAwN2Z9LCB7MHg4NjYxLCAgICAweDAwN2V9LAotezB4ODY2MiwgICAgMHgwMDg2fSwgezB4ODY2MywgICAgMHgwMDhlfSwgezB4ODY2NCwgICAgMHgwMDgxfSwKLXsweDg2NjUsICAgIDB4MDAwNH0sIHsweDg2NjYsICAgIDB4MDAyNn0sIHsweDg2NjcsICAgIDB4MDAwYn0sCi17MHg4NjY4LCAgICAweDAwODZ9LCB7MHg4NjY5LCAgICAweDAwMDR9LCB7MHg4NjZhLCAgICAweDAwY2V9LAotezB4ODY2YiwgICAgMHgwMDhmfSwgezB4ODY2YywgICAgMHgwMDc2fSwgezB4ODY2ZCwgICAgMHgwMGJkfSwKLXsweDg2NmUsICAgIDB4MDA4OX0sIHsweDg2NmYsICAgIDB4MDA3Zn0sIHsweDg2NzAsICAgIDB4MDA3ZX0sCi17MHg4NjcxLCAgICAweDAwODZ9LCB7MHg4NjcyLCAgICAweDAwOGV9LCB7MHg4NjczLCAgICAweDAwODF9LAotezB4ODY3NCwgICAgMHgwMDAyfSwgezB4ODY3NSwgICAgMHgwMDI2fSwgezB4ODY3NiwgICAgMHgwMDBifSwKLXsweDg2NzcsICAgIDB4MDA4YX0sIHsweDg2NzgsICAgIDB4MDAwMn0sIHsweDg2NzksICAgIDB4MDBjZX0sCi17MHg4NjdhLCAgICAweDAwOGZ9LCB7MHg4NjdiLCAgICAweDAwNzN9LCB7MHg4NjdjLCAgICAweDAwYmR9LAotezB4ODY3ZCwgICAgMHgwMDg5fSwgezB4ODY3ZSwgICAgMHgwMDdmfSwgezB4ODY3ZiwgICAgMHgwMDdlfSwKLXsweDg2ODAsICAgIDB4MDA4Nn0sIHsweDg2ODEsICAgIDB4MDA4ZX0sIHsweDg2ODIsICAgIDB4MDA4MX0sCi17MHg4NjgzLCAgICAweDAwMDF9LCB7MHg4Njg0LCAgICAweDAwMjZ9LCB7MHg4Njg1LCAgICAweDAwMDh9LAotezB4ODY4NiwgICAgMHgwMDg2fSwgezB4ODY4NywgICAgMHgwMDAxfSwgezB4ODY4OCwgICAgMHgwMGNlfSwKLXsweDg2ODksICAgIDB4MDA4Zn0sIHsweDg2OGEsICAgIDB4MDA3MH0sIHsweDg2OGIsICAgIDB4MDBiZH0sCi17MHg4NjhjLCAgICAweDAwODl9LCB7MHg4NjhkLCAgICAweDAwN2Z9LCB7MHg4NjhlLCAgICAweDAwYjZ9LAotezB4ODY4ZiwgICAgMHgwMDhmfSwgezB4ODY5MCwgICAgMHgwMDdmfSwgezB4ODY5MSwgICAgMHgwMDgxfSwKLXsweDg2OTIsICAgIDB4MDAwZn0sIHsweDg2OTMsICAgIDB4MDAyNn0sIHsweDg2OTQsICAgIDB4MDAwM30sCi17MHg4Njk1LCAgICAweDAwN2V9LCB7MHg4Njk2LCAgICAweDAwODd9LCB7MHg4Njk3LCAgICAweDAwNDd9LAotezB4ODY5OCwgICAgMHgwMGI2fSwgezB4ODY5OSwgICAgMHgwMDEyfSwgezB4ODY5YSwgICAgMHgwMDA5fSwKLXsweDg2OWIsICAgIDB4MDA4NH0sIHsweDg2OWMsICAgIDB4MDAwM30sIHsweDg2OWQsICAgIDB4MDA4MX0sCi17MHg4NjllLCAgICAweDAwMDN9LCB7MHg4NjlmLCAgICAweDAwMjd9LCB7MHg4NmEwLCAgICAweDAwMDZ9LAotezB4ODZhMSwgICAgMHgwMDdjfSwgezB4ODZhMiwgICAgMHgwMDEyfSwgezB4ODZhMywgICAgMHgwMDA5fSwKLXsweDg2YTQsICAgIDB4MDA3ZX0sIHsweDg2YTUsICAgIDB4MDA4NX0sIHsweDg2YTYsICAgIDB4MDBmZX0sCi17MHg4NmE3LCAgICAweDAwYjZ9LCB7MHg4NmE4LCAgICAweDAwMTJ9LCB7MHg4NmE5LCAgICAweDAwMDZ9LAotezB4ODZhYSwgICAgMHgwMDg0fSwgezB4ODZhYiwgICAgMHgwMDA3fSwgezB4ODZhYywgICAgMHgwMDgxfSwKLXsweDg2YWQsICAgIDB4MDAwN30sIHsweDg2YWUsICAgIDB4MDAyN30sIHsweDg2YWYsICAgIDB4MDAwOH0sCi17MHg4NmIwLCAgICAweDAwOGJ9LCB7MHg4NmIxLCAgICAweDAwMDF9LCB7MHg4NmIyLCAgICAweDAwYjd9LAotezB4ODZiMywgICAgMHgwMDEyfSwgezB4ODZiNCwgICAgMHgwMDA2fSwgezB4ODZiNSwgICAgMHgwMDdlfSwKLXsweDg2YjYsICAgIDB4MDA4Nn0sIHsweDg2YjcsICAgIDB4MDBkNX0sIHsweDg2YjgsICAgIDB4MDBiNn0sCi17MHg4NmI5LCAgICAweDAwOGZ9LCB7MHg4NmJhLCAgICAweDAwODJ9LCB7MHg4NmJiLCAgICAweDAwMjZ9LAotezB4ODZiYywgICAgMHgwMDBhfSwgezB4ODZiZCwgICAgMHgwMDdjfSwgezB4ODZiZSwgICAgMHgwMDhmfSwKLXsweDg2YmYsICAgIDB4MDA4Mn0sIHsweDg2YzAsICAgIDB4MDA0Zn0sIHsweDg2YzEsICAgIDB4MDBiN30sCi17MHg4NmMyLCAgICAweDAwMTJ9LCB7MHg4NmMzLCAgICAweDAwMDZ9LCB7MHg4NmM0LCAgICAweDAwN2V9LAotezB4ODZjNSwgICAgMHgwMDg1fSwgezB4ODZjNiwgICAgMHgwMGMwfSwgezB4ODZjNywgICAgMHgwMGI2fSwKLXsweDg2YzgsICAgIDB4MDAxMn0sIHsweDg2YzksICAgIDB4MDAwNn0sIHsweDg2Y2EsICAgIDB4MDA4NH0sCi17MHg4NmNiLCAgICAweDAwM2Z9LCB7MHg4NmNjLCAgICAweDAwODF9LCB7MHg4NmNkLCAgICAweDAwM2Z9LAotezB4ODZjZSwgICAgMHgwMDI3fSwgezB4ODZjZiwgICAgMHgwMDEwfSwgezB4ODZkMCwgICAgMHgwMDhifSwKLXsweDg2ZDEsICAgIDB4MDAwOH0sIHsweDg2ZDIsICAgIDB4MDBiN30sIHsweDg2ZDMsICAgIDB4MDAxMn0sCi17MHg4NmQ0LCAgICAweDAwMDZ9LCB7MHg4NmQ1LCAgICAweDAwYjZ9LCB7MHg4NmQ2LCAgICAweDAwMTJ9LAotezB4ODZkNywgICAgMHgwMDA5fSwgezB4ODZkOCwgICAgMHgwMDg0fSwgezB4ODZkOSwgICAgMHgwMGZjfSwKLXsweDg2ZGEsICAgIDB4MDBiN30sIHsweDg2ZGIsICAgIDB4MDAxMn0sIHsweDg2ZGMsICAgIDB4MDAwOX0sCi17MHg4NmRkLCAgICAweDAwN2V9LCB7MHg4NmRlLCAgICAweDAwODV9LCB7MHg4NmRmLCAgICAweDAwZmV9LAotezB4ODZlMCwgICAgMHgwMGNlfSwgezB4ODZlMSwgICAgMHgwMDhmfSwgezB4ODZlMiwgICAgMHgwMDcwfSwKLXsweDg2ZTMsICAgIDB4MDAxOH0sIHsweDg2ZTQsICAgIDB4MDBjZX0sIHsweDg2ZTUsICAgIDB4MDA4Zn0sCi17MHg4NmU2LCAgICAweDAwODR9LCB7MHg4NmU3LCAgICAweDAwYzZ9LCB7MHg4NmU4LCAgICAweDAwMGN9LAotezB4ODZlOSwgICAgMHgwMGJkfSwgezB4ODZlYSwgICAgMHgwMDg5fSwgezB4ODZlYiwgICAgMHgwMDZmfSwKLXsweDg2ZWMsICAgIDB4MDBjZX0sIHsweDg2ZWQsICAgIDB4MDA4Zn0sIHsweDg2ZWUsICAgIDB4MDA4NH0sCi17MHg4NmVmLCAgICAweDAwMTh9LCB7MHg4NmYwLCAgICAweDAwY2V9LCB7MHg4NmYxLCAgICAweDAwOGZ9LAotezB4ODZmMiwgICAgMHgwMDcwfSwgezB4ODZmMywgICAgMHgwMGM2fSwgezB4ODZmNCwgICAgMHgwMDBjfSwKLXsweDg2ZjUsICAgIDB4MDBiZH0sIHsweDg2ZjYsICAgIDB4MDA4OX0sIHsweDg2ZjcsICAgIDB4MDA2Zn0sCi17MHg4NmY4LCAgICAweDAwZDZ9LCB7MHg4NmY5LCAgICAweDAwODN9LCB7MHg4NmZhLCAgICAweDAwYzF9LAotezB4ODZmYiwgICAgMHgwMDRmfSwgezB4ODZmYywgICAgMHgwMDJkfSwgezB4ODZmZCwgICAgMHgwMDAzfSwKLXsweDg2ZmUsICAgIDB4MDA3ZX0sIHsweDg2ZmYsICAgIDB4MDA4N30sIHsweDg3MDAsICAgIDB4MDA0MH0sCi17MHg4NzAxLCAgICAweDAwYjZ9LCB7MHg4NzAyLCAgICAweDAwOGZ9LCB7MHg4NzAzLCAgICAweDAwN2Z9LAotezB4ODcwNCwgICAgMHgwMDgxfSwgezB4ODcwNSwgICAgMHgwMDA3fSwgezB4ODcwNiwgICAgMHgwMDI3fSwKLXsweDg3MDcsICAgIDB4MDAwZn0sIHsweDg3MDgsICAgIDB4MDA4MX0sIHsweDg3MDksICAgIDB4MDAwYn0sCi17MHg4NzBhLCAgICAweDAwMjd9LCB7MHg4NzBiLCAgICAweDAwMTV9LCB7MHg4NzBjLCAgICAweDAwODF9LAotezB4ODcwZCwgICAgMHgwMDBkfSwgezB4ODcwZSwgICAgMHgwMDI3fSwgezB4ODcwZiwgICAgMHgwMDFifSwKLXsweDg3MTAsICAgIDB4MDA4MX0sIHsweDg3MTEsICAgIDB4MDAwZX0sIHsweDg3MTIsICAgIDB4MDAyN30sCi17MHg4NzEzLCAgICAweDAwMjF9LCB7MHg4NzE0LCAgICAweDAwN2V9LCB7MHg4NzE1LCAgICAweDAwODd9LAotezB4ODcxNiwgICAgMHgwMDQwfSwgezB4ODcxNywgICAgMHgwMGY3fSwgezB4ODcxOCwgICAgMHgwMDhmfSwKLXsweDg3MTksICAgIDB4MDA3Yn0sIHsweDg3MWEsICAgIDB4MDA4Nn0sIHsweDg3MWIsICAgIDB4MDAwMn0sCi17MHg4NzFjLCAgICAweDAwYjd9LCB7MHg4NzFkLCAgICAweDAwOGZ9LCB7MHg4NzFlLCAgICAweDAwN2F9LAotezB4ODcxZiwgICAgMHgwMDIwfSwgezB4ODcyMCwgICAgMHgwMDFjfSwgezB4ODcyMSwgICAgMHgwMGY3fSwKLXsweDg3MjIsICAgIDB4MDA4Zn0sIHsweDg3MjMsICAgIDB4MDA3OH0sIHsweDg3MjQsICAgIDB4MDA4Nn0sCi17MHg4NzI1LCAgICAweDAwMDJ9LCB7MHg4NzI2LCAgICAweDAwYjd9LCB7MHg4NzI3LCAgICAweDAwOGZ9LAotezB4ODcyOCwgICAgMHgwMDc3fSwgezB4ODcyOSwgICAgMHgwMDIwfSwgezB4ODcyYSwgICAgMHgwMDEyfSwKLXsweDg3MmIsICAgIDB4MDBmN30sIHsweDg3MmMsICAgIDB4MDA4Zn0sIHsweDg3MmQsICAgIDB4MDA3NX0sCi17MHg4NzJlLCAgICAweDAwODZ9LCB7MHg4NzJmLCAgICAweDAwMDJ9LCB7MHg4NzMwLCAgICAweDAwYjd9LAotezB4ODczMSwgICAgMHgwMDhmfSwgezB4ODczMiwgICAgMHgwMDc0fSwgezB4ODczMywgICAgMHgwMDIwfSwKLXsweDg3MzQsICAgIDB4MDAwOH0sIHsweDg3MzUsICAgIDB4MDBmN30sIHsweDg3MzYsICAgIDB4MDA4Zn0sCi17MHg4NzM3LCAgICAweDAwNzJ9LCB7MHg4NzM4LCAgICAweDAwODZ9LCB7MHg4NzM5LCAgICAweDAwMDJ9LAotezB4ODczYSwgICAgMHgwMGI3fSwgezB4ODczYiwgICAgMHgwMDhmfSwgezB4ODczYywgICAgMHgwMDcxfSwKLXsweDg3M2QsICAgIDB4MDA3ZX0sIHsweDg3M2UsICAgIDB4MDA4N30sIHsweDg3M2YsICAgIDB4MDA0N30sCi17MHg4NzQwLCAgICAweDAwODZ9LCB7MHg4NzQxLCAgICAweDAwMDR9LCB7MHg4NzQyLCAgICAweDAwOTd9LAotezB4ODc0MywgICAgMHgwMDQwfSwgezB4ODc0NCwgICAgMHgwMDdlfSwgezB4ODc0NSwgICAgMHgwMDg5fSwKLXsweDg3NDYsICAgIDB4MDA2ZX0sIHsweDg3NDcsICAgIDB4MDBjZX0sIHsweDg3NDgsICAgIDB4MDA4Zn0sCi17MHg4NzQ5LCAgICAweDAwNzJ9LCB7MHg4NzRhLCAgICAweDAwYmR9LCB7MHg4NzRiLCAgICAweDAwODl9LAotezB4ODc0YywgICAgMHgwMGY3fSwgezB4ODc0ZCwgICAgMHgwMGNlfSwgezB4ODc0ZSwgICAgMHgwMDhmfSwKLXsweDg3NGYsICAgIDB4MDA3NX0sIHsweDg3NTAsICAgIDB4MDBiZH0sIHsweDg3NTEsICAgIDB4MDA4OX0sCi17MHg4NzUyLCAgICAweDAwZjd9LCB7MHg4NzUzLCAgICAweDAwY2V9LCB7MHg4NzU0LCAgICAweDAwOGZ9LAotezB4ODc1NSwgICAgMHgwMDc4fSwgezB4ODc1NiwgICAgMHgwMGJkfSwgezB4ODc1NywgICAgMHgwMDg5fSwKLXsweDg3NTgsICAgIDB4MDBmN30sIHsweDg3NTksICAgIDB4MDBjZX0sIHsweDg3NWEsICAgIDB4MDA4Zn0sCi17MHg4NzViLCAgICAweDAwN2J9LCB7MHg4NzVjLCAgICAweDAwYmR9LCB7MHg4NzVkLCAgICAweDAwODl9LAotezB4ODc1ZSwgICAgMHgwMGY3fSwgezB4ODc1ZiwgICAgMHgwMDRmfSwgezB4ODc2MCwgICAgMHgwMGI3fSwKLXsweDg3NjEsICAgIDB4MDA4Zn0sIHsweDg3NjIsICAgIDB4MDA3ZH0sIHsweDg3NjMsICAgIDB4MDBiN30sCi17MHg4NzY0LCAgICAweDAwOGZ9LCB7MHg4NzY1LCAgICAweDAwODF9LCB7MHg4NzY2LCAgICAweDAwYjZ9LAotezB4ODc2NywgICAgMHgwMDhmfSwgezB4ODc2OCwgICAgMHgwMDcyfSwgezB4ODc2OSwgICAgMHgwMDI3fSwKLXsweDg3NmEsICAgIDB4MDA0N30sIHsweDg3NmIsICAgIDB4MDA3Y30sIHsweDg3NmMsICAgIDB4MDA4Zn0sCi17MHg4NzZkLCAgICAweDAwN2R9LCB7MHg4NzZlLCAgICAweDAwYjZ9LCB7MHg4NzZmLCAgICAweDAwOGZ9LAotezB4ODc3MCwgICAgMHgwMDc1fSwgezB4ODc3MSwgICAgMHgwMDI3fSwgezB4ODc3MiwgICAgMHgwMDNmfSwKLXsweDg3NzMsICAgIDB4MDA3Y30sIHsweDg3NzQsICAgIDB4MDA4Zn0sIHsweDg3NzUsICAgIDB4MDA3ZH0sCi17MHg4Nzc2LCAgICAweDAwYjZ9LCB7MHg4Nzc3LCAgICAweDAwOGZ9LCB7MHg4Nzc4LCAgICAweDAwNzh9LAotezB4ODc3OSwgICAgMHgwMDI3fSwgezB4ODc3YSwgICAgMHgwMDM3fSwgezB4ODc3YiwgICAgMHgwMDdjfSwKLXsweDg3N2MsICAgIDB4MDA4Zn0sIHsweDg3N2QsICAgIDB4MDA3ZH0sIHsweDg3N2UsICAgIDB4MDBiNn0sCi17MHg4NzdmLCAgICAweDAwOGZ9LCB7MHg4NzgwLCAgICAweDAwN2J9LCB7MHg4NzgxLCAgICAweDAwMjd9LAotezB4ODc4MiwgICAgMHgwMDJmfSwgezB4ODc4MywgICAgMHgwMDdmfSwgezB4ODc4NCwgICAgMHgwMDhmfSwKLXsweDg3ODUsICAgIDB4MDA3ZH0sIHsweDg3ODYsICAgIDB4MDA3Y30sIHsweDg3ODcsICAgIDB4MDA4Zn0sCi17MHg4Nzg4LCAgICAweDAwODF9LCB7MHg4Nzg5LCAgICAweDAwN2F9LCB7MHg4NzhhLCAgICAweDAwOGZ9LAotezB4ODc4YiwgICAgMHgwMDcyfSwgezB4ODc4YywgICAgMHgwMDI3fSwgezB4ODc4ZCwgICAgMHgwMDFifSwKLXsweDg3OGUsICAgIDB4MDA3Y30sIHsweDg3OGYsICAgIDB4MDA4Zn0sIHsweDg3OTAsICAgIDB4MDA3ZH0sCi17MHg4NzkxLCAgICAweDAwN2F9LCB7MHg4NzkyLCAgICAweDAwOGZ9LCB7MHg4NzkzLCAgICAweDAwNzV9LAotezB4ODc5NCwgICAgMHgwMDI3fSwgezB4ODc5NSwgICAgMHgwMDE2fSwgezB4ODc5NiwgICAgMHgwMDdjfSwKLXsweDg3OTcsICAgIDB4MDA4Zn0sIHsweDg3OTgsICAgIDB4MDA3ZH0sIHsweDg3OTksICAgIDB4MDA3YX0sCi17MHg4NzlhLCAgICAweDAwOGZ9LCB7MHg4NzliLCAgICAweDAwNzh9LCB7MHg4NzljLCAgICAweDAwMjd9LAotezB4ODc5ZCwgICAgMHgwMDExfSwgezB4ODc5ZSwgICAgMHgwMDdjfSwgezB4ODc5ZiwgICAgMHgwMDhmfSwKLXsweDg3YTAsICAgIDB4MDA3ZH0sIHsweDg3YTEsICAgIDB4MDA3YX0sIHsweDg3YTIsICAgIDB4MDA4Zn0sCi17MHg4N2EzLCAgICAweDAwN2J9LCB7MHg4N2E0LCAgICAweDAwMjd9LCB7MHg4N2E1LCAgICAweDAwMGN9LAotezB4ODdhNiwgICAgMHgwMDdlfSwgezB4ODdhNywgICAgMHgwMDg3fSwgezB4ODdhOCwgICAgMHgwMDgzfSwKLXsweDg3YTksICAgIDB4MDA3YX0sIHsweDg3YWEsICAgIDB4MDA4Zn0sIHsweDg3YWIsICAgIDB4MDA3NX0sCi17MHg4N2FjLCAgICAweDAwN2F9LCB7MHg4N2FkLCAgICAweDAwOGZ9LCB7MHg4N2FlLCAgICAweDAwNzh9LAotezB4ODdhZiwgICAgMHgwMDdhfSwgezB4ODdiMCwgICAgMHgwMDhmfSwgezB4ODdiMSwgICAgMHgwMDdifSwKLXsweDg3YjIsICAgIDB4MDBjZX0sIHsweDg3YjMsICAgIDB4MDBjMX0sIHsweDg3YjQsICAgIDB4MDBmY30sCi17MHg4N2I1LCAgICAweDAwZjZ9LCB7MHg4N2I2LCAgICAweDAwOGZ9LCB7MHg4N2I3LCAgICAweDAwN2R9LAotezB4ODdiOCwgICAgMHgwMDNhfSwgezB4ODdiOSwgICAgMHgwMGE2fSwgezB4ODdiYSwgICAgMHgwMDAwfSwKLXsweDg3YmIsICAgIDB4MDBiN30sIHsweDg3YmMsICAgIDB4MDAxMn0sIHsweDg3YmQsICAgIDB4MDA3MH0sCi17MHg4N2JlLCAgICAweDAwYjZ9LCB7MHg4N2JmLCAgICAweDAwOGZ9LCB7MHg4N2MwLCAgICAweDAwNzJ9LAotezB4ODdjMSwgICAgMHgwMDI2fSwgezB4ODdjMiwgICAgMHgwMDAzfSwgezB4ODdjMywgICAgMHgwMDdlfSwKLXsweDg3YzQsICAgIDB4MDA4N30sIHsweDg3YzUsICAgIDB4MDBmYX0sIHsweDg3YzYsICAgIDB4MDBiNn0sCi17MHg4N2M3LCAgICAweDAwOGZ9LCB7MHg4N2M4LCAgICAweDAwNzV9LCB7MHg4N2M5LCAgICAweDAwMjZ9LAotezB4ODdjYSwgICAgMHgwMDBhfSwgezB4ODdjYiwgICAgMHgwMDE4fSwgezB4ODdjYywgICAgMHgwMGNlfSwKLXsweDg3Y2QsICAgIDB4MDA4Zn0sIHsweDg3Y2UsICAgIDB4MDA3M30sIHsweDg3Y2YsICAgIDB4MDBiZH0sCi17MHg4N2QwLCAgICAweDAwODl9LCB7MHg4N2QxLCAgICAweDAwZDV9LCB7MHg4N2QyLCAgICAweDAwN2V9LAotezB4ODdkMywgICAgMHgwMDg3fSwgezB4ODdkNCwgICAgMHgwMGZhfSwgezB4ODdkNSwgICAgMHgwMGI2fSwKLXsweDg3ZDYsICAgIDB4MDA4Zn0sIHsweDg3ZDcsICAgIDB4MDA3OH0sIHsweDg3ZDgsICAgIDB4MDAyNn0sCi17MHg4N2Q5LCAgICAweDAwMGF9LCB7MHg4N2RhLCAgICAweDAwMTh9LCB7MHg4N2RiLCAgICAweDAwY2V9LAotezB4ODdkYywgICAgMHgwMDhmfSwgezB4ODdkZCwgICAgMHgwMDc2fSwgezB4ODdkZSwgICAgMHgwMGJkfSwKLXsweDg3ZGYsICAgIDB4MDA4OX0sIHsweDg3ZTAsICAgIDB4MDBkNX0sIHsweDg3ZTEsICAgIDB4MDA3ZX0sCi17MHg4N2UyLCAgICAweDAwODd9LCB7MHg4N2UzLCAgICAweDAwZmF9LCB7MHg4N2U0LCAgICAweDAwYjZ9LAotezB4ODdlNSwgICAgMHgwMDhmfSwgezB4ODdlNiwgICAgMHgwMDdifSwgezB4ODdlNywgICAgMHgwMDI2fSwKLXsweDg3ZTgsICAgIDB4MDAwYX0sIHsweDg3ZTksICAgIDB4MDAxOH0sIHsweDg3ZWEsICAgIDB4MDBjZX0sCi17MHg4N2ViLCAgICAweDAwOGZ9LCB7MHg4N2VjLCAgICAweDAwNzl9LCB7MHg4N2VkLCAgICAweDAwYmR9LAotezB4ODdlZSwgICAgMHgwMDg5fSwgezB4ODdlZiwgICAgMHgwMGQ1fSwgezB4ODdmMCwgICAgMHgwMDdlfSwKLXsweDg3ZjEsICAgIDB4MDA4N30sIHsweDg3ZjIsICAgIDB4MDBmYX0sIHsweDg3ZjMsICAgIDB4MDA4Nn0sCi17MHg4N2Y0LCAgICAweDAwMDV9LCB7MHg4N2Y1LCAgICAweDAwOTd9LCB7MHg4N2Y2LCAgICAweDAwNDB9LAotezB4ODdmNywgICAgMHgwMDdlfSwgezB4ODdmOCwgICAgMHgwMDg5fSwgezB4ODdmOSwgICAgMHgwMDZlfSwKLXsweDg3ZmEsICAgIDB4MDBiNn0sIHsweDg3ZmIsICAgIDB4MDA4Zn0sIHsweDg3ZmMsICAgIDB4MDA3NX0sCi17MHg4N2ZkLCAgICAweDAwODF9LCB7MHg4N2ZlLCAgICAweDAwMDd9LCB7MHg4N2ZmLCAgICAweDAwMmV9LAotezB4ODgwMCwgICAgMHgwMGYyfSwgezB4ODgwMSwgICAgMHgwMGY2fSwgezB4ODgwMiwgICAgMHgwMDEyfSwKLXsweDg4MDMsICAgIDB4MDAwNn0sIHsweDg4MDQsICAgIDB4MDBjNH0sIHsweDg4MDUsICAgIDB4MDBmOH0sCi17MHg4ODA2LCAgICAweDAwMWJ9LCB7MHg4ODA3LCAgICAweDAwYjd9LCB7MHg4ODA4LCAgICAweDAwMTJ9LAotezB4ODgwOSwgICAgMHgwMDA2fSwgezB4ODgwYSwgICAgMHgwMGI2fSwgezB4ODgwYiwgICAgMHgwMDhmfSwKLXsweDg4MGMsICAgIDB4MDA3OH0sIHsweDg4MGQsICAgIDB4MDA4MX0sIHsweDg4MGUsICAgIDB4MDAwN30sCi17MHg4ODBmLCAgICAweDAwMmV9LCB7MHg4ODEwLCAgICAweDAwZTJ9LCB7MHg4ODExLCAgICAweDAwNDh9LAotezB4ODgxMiwgICAgMHgwMDQ4fSwgezB4ODgxMywgICAgMHgwMDQ4fSwgezB4ODgxNCwgICAgMHgwMGY2fSwKLXsweDg4MTUsICAgIDB4MDAxMn0sIHsweDg4MTYsICAgIDB4MDAwNn0sIHsweDg4MTcsICAgIDB4MDBjNH0sCi17MHg4ODE4LCAgICAweDAwYzd9LCB7MHg4ODE5LCAgICAweDAwMWJ9LCB7MHg4ODFhLCAgICAweDAwYjd9LAotezB4ODgxYiwgICAgMHgwMDEyfSwgezB4ODgxYywgICAgMHgwMDA2fSwgezB4ODgxZCwgICAgMHgwMGI2fSwKLXsweDg4MWUsICAgIDB4MDA4Zn0sIHsweDg4MWYsICAgIDB4MDA3Yn0sIHsweDg4MjAsICAgIDB4MDA4MX0sCi17MHg4ODIxLCAgICAweDAwMDd9LCB7MHg4ODIyLCAgICAweDAwMmV9LCB7MHg4ODIzLCAgICAweDAwY2Z9LAotezB4ODgyNCwgICAgMHgwMGY2fSwgezB4ODgyNSwgICAgMHgwMDEyfSwgezB4ODgyNiwgICAgMHgwMDA1fSwKLXsweDg4MjcsICAgIDB4MDBjNH0sIHsweDg4MjgsICAgIDB4MDBmOH0sIHsweDg4MjksICAgIDB4MDAxYn0sCi17MHg4ODJhLCAgICAweDAwYjd9LCB7MHg4ODJiLCAgICAweDAwMTJ9LCB7MHg4ODJjLCAgICAweDAwMDV9LAotezB4ODgyZCwgICAgMHgwMDg2fSwgezB4ODgyZSwgICAgMHgwMDAwfSwgezB4ODgyZiwgICAgMHgwMGY2fSwKLXsweDg4MzAsICAgIDB4MDA4Zn0sIHsweDg4MzEsICAgIDB4MDA3MX0sIHsweDg4MzIsICAgIDB4MDBiZH0sCi17MHg4ODMzLCAgICAweDAwODl9LCB7MHg4ODM0LCAgICAweDAwOTR9LCB7MHg4ODM1LCAgICAweDAwODZ9LAotezB4ODgzNiwgICAgMHgwMDAxfSwgezB4ODgzNywgICAgMHgwMGY2fSwgezB4ODgzOCwgICAgMHgwMDhmfSwKLXsweDg4MzksICAgIDB4MDA3NH0sIHsweDg4M2EsICAgIDB4MDBiZH0sIHsweDg4M2IsICAgIDB4MDA4OX0sCi17MHg4ODNjLCAgICAweDAwOTR9LCB7MHg4ODNkLCAgICAweDAwODZ9LCB7MHg4ODNlLCAgICAweDAwMDJ9LAotezB4ODgzZiwgICAgMHgwMGY2fSwgezB4ODg0MCwgICAgMHgwMDhmfSwgezB4ODg0MSwgICAgMHgwMDc3fSwKLXsweDg4NDIsICAgIDB4MDBiZH0sIHsweDg4NDMsICAgIDB4MDA4OX0sIHsweDg4NDQsICAgIDB4MDA5NH0sCi17MHg4ODQ1LCAgICAweDAwODZ9LCB7MHg4ODQ2LCAgICAweDAwMDN9LCB7MHg4ODQ3LCAgICAweDAwZjZ9LAotezB4ODg0OCwgICAgMHgwMDhmfSwgezB4ODg0OSwgICAgMHgwMDdhfSwgezB4ODg0YSwgICAgMHgwMGJkfSwKLXsweDg4NGIsICAgIDB4MDA4OX0sIHsweDg4NGMsICAgIDB4MDA5NH0sIHsweDg4NGQsICAgIDB4MDBjZX0sCi17MHg4ODRlLCAgICAweDAwOGZ9LCB7MHg4ODRmLCAgICAweDAwNzB9LCB7MHg4ODUwLCAgICAweDAwYTZ9LAotezB4ODg1MSwgICAgMHgwMDAxfSwgezB4ODg1MiwgICAgMHgwMDgxfSwgezB4ODg1MywgICAgMHgwMDAxfSwKLXsweDg4NTQsICAgIDB4MDAyN30sIHsweDg4NTUsICAgIDB4MDAwN30sIHsweDg4NTYsICAgIDB4MDA4MX0sCi17MHg4ODU3LCAgICAweDAwMDN9LCB7MHg4ODU4LCAgICAweDAwMjd9LCB7MHg4ODU5LCAgICAweDAwMDN9LAotezB4ODg1YSwgICAgMHgwMDdlfSwgezB4ODg1YiwgICAgMHgwMDg4fSwgezB4ODg1YywgICAgMHgwMDY2fSwKLXsweDg4NWQsICAgIDB4MDBhNn0sIHsweDg4NWUsICAgIDB4MDAwMH0sIHsweDg4NWYsICAgIDB4MDBiOH0sCi17MHg4ODYwLCAgICAweDAwOGZ9LCB7MHg4ODYxLCAgICAweDAwODF9LCB7MHg4ODYyLCAgICAweDAwODR9LAotezB4ODg2MywgICAgMHgwMDAxfSwgezB4ODg2NCwgICAgMHgwMDI2fSwgezB4ODg2NSwgICAgMHgwMDBifSwKLXsweDg4NjYsICAgIDB4MDA4Y30sIHsweDg4NjcsICAgIDB4MDA4Zn0sIHsweDg4NjgsICAgIDB4MDA3OX0sCi17MHg4ODY5LCAgICAweDAwMmN9LCB7MHg4ODZhLCAgICAweDAwMGV9LCB7MHg4ODZiLCAgICAweDAwMDh9LAotezB4ODg2YywgICAgMHgwMDA4fSwgezB4ODg2ZCwgICAgMHgwMDA4fSwgezB4ODg2ZSwgICAgMHgwMDdlfSwKLXsweDg4NmYsICAgIDB4MDA4OH0sIHsweDg4NzAsICAgIDB4MDA1MH0sIHsweDg4NzEsICAgIDB4MDBiNn0sCi17MHg4ODcyLCAgICAweDAwMTJ9LCB7MHg4ODczLCAgICAweDAwMDR9LCB7MHg4ODc0LCAgICAweDAwOGF9LAotezB4ODg3NSwgICAgMHgwMDQwfSwgezB4ODg3NiwgICAgMHgwMGI3fSwgezB4ODg3NywgICAgMHgwMDEyfSwKLXsweDg4NzgsICAgIDB4MDAwNH0sIHsweDg4NzksICAgIDB4MDBiNn0sIHsweDg4N2EsICAgIDB4MDAxMn0sCi17MHg4ODdiLCAgICAweDAwMDR9LCB7MHg4ODdjLCAgICAweDAwODR9LCB7MHg4ODdkLCAgICAweDAwZmJ9LAotezB4ODg3ZSwgICAgMHgwMDg0fSwgezB4ODg3ZiwgICAgMHgwMGVmfSwgezB4ODg4MCwgICAgMHgwMGI3fSwKLXsweDg4ODEsICAgIDB4MDAxMn0sIHsweDg4ODIsICAgIDB4MDAwNH0sIHsweDg4ODMsICAgIDB4MDBiNn0sCi17MHg4ODg0LCAgICAweDAwMTJ9LCB7MHg4ODg1LCAgICAweDAwMDd9LCB7MHg4ODg2LCAgICAweDAwMzZ9LAotezB4ODg4NywgICAgMHgwMGI2fSwgezB4ODg4OCwgICAgMHgwMDhmfSwgezB4ODg4OSwgICAgMHgwMDdjfSwKLXsweDg4OGEsICAgIDB4MDA0OH0sIHsweDg4OGIsICAgIDB4MDA0OH0sIHsweDg4OGMsICAgIDB4MDBiN30sCi17MHg4ODhkLCAgICAweDAwMTJ9LCB7MHg4ODhlLCAgICAweDAwMDd9LCB7MHg4ODhmLCAgICAweDAwODZ9LAotezB4ODg5MCwgICAgMHgwMDAxfSwgezB4ODg5MSwgICAgMHgwMGJhfSwgezB4ODg5MiwgICAgMHgwMDEyfSwKLXsweDg4OTMsICAgIDB4MDAwNH0sIHsweDg4OTQsICAgIDB4MDBiN30sIHsweDg4OTUsICAgIDB4MDAxMn0sCi17MHg4ODk2LCAgICAweDAwMDR9LCB7MHg4ODk3LCAgICAweDAwMDF9LCB7MHg4ODk4LCAgICAweDAwMDF9LAotezB4ODg5OSwgICAgMHgwMDAxfSwgezB4ODg5YSwgICAgMHgwMDAxfSwgezB4ODg5YiwgICAgMHgwMDAxfSwKLXsweDg4OWMsICAgIDB4MDAwMX0sIHsweDg4OWQsICAgIDB4MDA4Nn0sIHsweDg4OWUsICAgIDB4MDBmZX0sCi17MHg4ODlmLCAgICAweDAwYjR9LCB7MHg4OGEwLCAgICAweDAwMTJ9LCB7MHg4OGExLCAgICAweDAwMDR9LAotezB4ODhhMiwgICAgMHgwMGI3fSwgezB4ODhhMywgICAgMHgwMDEyfSwgezB4ODhhNCwgICAgMHgwMDA0fSwKLXsweDg4YTUsICAgIDB4MDA4Nn0sIHsweDg4YTYsICAgIDB4MDAwMn0sIHsweDg4YTcsICAgIDB4MDBiYX0sCi17MHg4OGE4LCAgICAweDAwMTJ9LCB7MHg4OGE5LCAgICAweDAwMDR9LCB7MHg4OGFhLCAgICAweDAwYjd9LAotezB4ODhhYiwgICAgMHgwMDEyfSwgezB4ODhhYywgICAgMHgwMDA0fSwgezB4ODhhZCwgICAgMHgwMDg2fSwKLXsweDg4YWUsICAgIDB4MDBmZH0sIHsweDg4YWYsICAgIDB4MDBiNH0sIHsweDg4YjAsICAgIDB4MDAxMn0sCi17MHg4OGIxLCAgICAweDAwMDR9LCB7MHg4OGIyLCAgICAweDAwYjd9LCB7MHg4OGIzLCAgICAweDAwMTJ9LAotezB4ODhiNCwgICAgMHgwMDA0fSwgezB4ODhiNSwgICAgMHgwMDMyfSwgezB4ODhiNiwgICAgMHgwMGI3fSwKLXsweDg4YjcsICAgIDB4MDAxMn0sIHsweDg4YjgsICAgIDB4MDAwN30sIHsweDg4YjksICAgIDB4MDBiNn0sCi17MHg4OGJhLCAgICAweDAwMTJ9LCB7MHg4OGJiLCAgICAweDAwMDB9LCB7MHg4OGJjLCAgICAweDAwODR9LAotezB4ODhiZCwgICAgMHgwMDA4fSwgezB4ODhiZSwgICAgMHgwMDgxfSwgezB4ODhiZiwgICAgMHgwMDA4fSwKLXsweDg4YzAsICAgIDB4MDAyN30sIHsweDg4YzEsICAgIDB4MDAwZn0sIHsweDg4YzIsICAgIDB4MDA3Y30sCi17MHg4OGMzLCAgICAweDAwODJ9LCB7MHg4OGM0LCAgICAweDAwMDh9LCB7MHg4OGM1LCAgICAweDAwMjZ9LAotezB4ODhjNiwgICAgMHgwMDA3fSwgezB4ODhjNywgICAgMHgwMDg2fSwgezB4ODhjOCwgICAgMHgwMDc2fSwKLXsweDg4YzksICAgIDB4MDA5N30sIHsweDg4Y2EsICAgIDB4MDA0MH0sIHsweDg4Y2IsICAgIDB4MDA3ZX0sCi17MHg4OGNjLCAgICAweDAwODl9LCB7MHg4OGNkLCAgICAweDAwNmV9LCB7MHg4OGNlLCAgICAweDAwN2V9LAotezB4ODhjZiwgICAgMHgwMDg2fSwgezB4ODhkMCwgICAgMHgwMGVjfSwgezB4ODhkMSwgICAgMHgwMGI2fSwKLXsweDg4ZDIsICAgIDB4MDA4Zn0sIHsweDg4ZDMsICAgIDB4MDA3Zn0sIHsweDg4ZDQsICAgIDB4MDA4MX0sCi17MHg4OGQ1LCAgICAweDAwMGZ9LCB7MHg4OGQ2LCAgICAweDAwMjd9LCB7MHg4OGQ3LCAgICAweDAwM2N9LAotezB4ODhkOCwgICAgMHgwMGJkfSwgezB4ODhkOSwgICAgMHgwMGU2fSwgezB4ODhkYSwgICAgMHgwMGM3fSwKLXsweDg4ZGIsICAgIDB4MDBiN30sIHsweDg4ZGMsICAgIDB4MDAxMn0sIHsweDg4ZGQsICAgIDB4MDAwZH0sCi17MHg4OGRlLCAgICAweDAwYmR9LCB7MHg4OGRmLCAgICAweDAwZTZ9LCB7MHg4OGUwLCAgICAweDAwY2J9LAotezB4ODhlMSwgICAgMHgwMGI2fSwgezB4ODhlMiwgICAgMHgwMDEyfSwgezB4ODhlMywgICAgMHgwMDA0fSwKLXsweDg4ZTQsICAgIDB4MDA4YX0sIHsweDg4ZTUsICAgIDB4MDAyMH0sIHsweDg4ZTYsICAgIDB4MDBiN30sCi17MHg4OGU3LCAgICAweDAwMTJ9LCB7MHg4OGU4LCAgICAweDAwMDR9LCB7MHg4OGU5LCAgICAweDAwY2V9LAotezB4ODhlYSwgICAgMHgwMGZmfSwgezB4ODhlYiwgICAgMHgwMGZmfSwgezB4ODhlYywgICAgMHgwMGI2fSwKLXsweDg4ZWQsICAgIDB4MDAxMn0sIHsweDg4ZWUsICAgIDB4MDAwMH0sIHsweDg4ZWYsICAgIDB4MDA4MX0sCi17MHg4OGYwLCAgICAweDAwMGN9LCB7MHg4OGYxLCAgICAweDAwMjZ9LCB7MHg4OGYyLCAgICAweDAwMDV9LAotezB4ODhmMywgICAgMHgwMDA5fSwgezB4ODhmNCwgICAgMHgwMDI2fSwgezB4ODhmNSwgICAgMHgwMGY2fSwKLXsweDg4ZjYsICAgIDB4MDAyN30sIHsweDg4ZjcsICAgIDB4MDAxY30sIHsweDg4ZjgsICAgIDB4MDBiNn0sCi17MHg4OGY5LCAgICAweDAwMTJ9LCB7MHg4OGZhLCAgICAweDAwMDR9LCB7MHg4OGZiLCAgICAweDAwODR9LAotezB4ODhmYywgICAgMHgwMGRmfSwgezB4ODhmZCwgICAgMHgwMGI3fSwgezB4ODhmZSwgICAgMHgwMDEyfSwKLXsweDg4ZmYsICAgIDB4MDAwNH0sIHsweDg5MDAsICAgIDB4MDA5Nn0sIHsweDg5MDEsICAgIDB4MDA4M30sCi17MHg4OTAyLCAgICAweDAwODF9LCB7MHg4OTAzLCAgICAweDAwMDd9LCB7MHg4OTA0LCAgICAweDAwMmN9LAotezB4ODkwNSwgICAgMHgwMDA1fSwgezB4ODkwNiwgICAgMHgwMDdjfSwgezB4ODkwNywgICAgMHgwMDAwfSwKLXsweDg5MDgsICAgIDB4MDA4M30sIHsweDg5MDksICAgIDB4MDAyMH0sIHsweDg5MGEsICAgIDB4MDAwNn0sCi17MHg4OTBiLCAgICAweDAwOTZ9LCB7MHg4OTBjLCAgICAweDAwODN9LCB7MHg4OTBkLCAgICAweDAwOGJ9LAotezB4ODkwZSwgICAgMHgwMDA4fSwgezB4ODkwZiwgICAgMHgwMDk3fSwgezB4ODkxMCwgICAgMHgwMDgzfSwKLXsweDg5MTEsICAgIDB4MDA3ZX0sIHsweDg5MTIsICAgIDB4MDA4NX0sIHsweDg5MTMsICAgIDB4MDA0MX0sCi17MHg4OTE0LCAgICAweDAwN2Z9LCB7MHg4OTE1LCAgICAweDAwOGZ9LCB7MHg4OTE2LCAgICAweDAwN2V9LAotezB4ODkxNywgICAgMHgwMDg2fSwgezB4ODkxOCwgICAgMHgwMDgwfSwgezB4ODkxOSwgICAgMHgwMGI3fSwKLXsweDg5MWEsICAgIDB4MDAxMn0sIHsweDg5MWIsICAgIDB4MDAwY30sIHsweDg5MWMsICAgIDB4MDA4Nn0sCi17MHg4OTFkLCAgICAweDAwMDF9LCB7MHg4OTFlLCAgICAweDAwYjd9LCB7MHg4OTFmLCAgICAweDAwOGZ9LAotezB4ODkyMCwgICAgMHgwMDdkfSwgezB4ODkyMSwgICAgMHgwMGI2fSwgezB4ODkyMiwgICAgMHgwMDEyfSwKLXsweDg5MjMsICAgIDB4MDAwY30sIHsweDg5MjQsICAgIDB4MDA4NH0sIHsweDg5MjUsICAgIDB4MDA3Zn0sCi17MHg4OTI2LCAgICAweDAwYjd9LCB7MHg4OTI3LCAgICAweDAwMTJ9LCB7MHg4OTI4LCAgICAweDAwMGN9LAotezB4ODkyOSwgICAgMHgwMDhhfSwgezB4ODkyYSwgICAgMHgwMDgwfSwgezB4ODkyYiwgICAgMHgwMGI3fSwKLXsweDg5MmMsICAgIDB4MDAxMn0sIHsweDg5MmQsICAgIDB4MDAwY30sIHsweDg5MmUsICAgIDB4MDA4Nn0sCi17MHg4OTJmLCAgICAweDAwMGF9LCB7MHg4OTMwLCAgICAweDAwYmR9LCB7MHg4OTMxLCAgICAweDAwOGF9LAotezB4ODkzMiwgICAgMHgwMDA2fSwgezB4ODkzMywgICAgMHgwMGI2fSwgezB4ODkzNCwgICAgMHgwMDEyfSwKLXsweDg5MzUsICAgIDB4MDAwYX0sIHsweDg5MzYsICAgIDB4MDAyYX0sIHsweDg5MzcsICAgIDB4MDAwOX0sCi17MHg4OTM4LCAgICAweDAwYjZ9LCB7MHg4OTM5LCAgICAweDAwMTJ9LCB7MHg4OTNhLCAgICAweDAwMGN9LAotezB4ODkzYiwgICAgMHgwMGJhfSwgezB4ODkzYywgICAgMHgwMDhmfSwgezB4ODkzZCwgICAgMHgwMDdkfSwKLXsweDg5M2UsICAgIDB4MDBiN30sIHsweDg5M2YsICAgIDB4MDAxMn0sIHsweDg5NDAsICAgIDB4MDAwY30sCi17MHg4OTQxLCAgICAweDAwYjZ9LCB7MHg4OTQyLCAgICAweDAwOGZ9LCB7MHg4OTQzLCAgICAweDAwN2V9LAotezB4ODk0NCwgICAgMHgwMDgxfSwgezB4ODk0NSwgICAgMHgwMDYwfSwgezB4ODk0NiwgICAgMHgwMDI3fSwKLXsweDg5NDcsICAgIDB4MDAxYX0sIHsweDg5NDgsICAgIDB4MDA4Yn0sIHsweDg5NDksICAgIDB4MDAyMH0sCi17MHg4OTRhLCAgICAweDAwYjd9LCB7MHg4OTRiLCAgICAweDAwOGZ9LCB7MHg4OTRjLCAgICAweDAwN2V9LAotezB4ODk0ZCwgICAgMHgwMGI2fSwgezB4ODk0ZSwgICAgMHgwMDEyfSwgezB4ODk0ZiwgICAgMHgwMDBjfSwKLXsweDg5NTAsICAgIDB4MDA4NH0sIHsweDg5NTEsICAgIDB4MDA5Zn0sIHsweDg5NTIsICAgIDB4MDBiYX0sCi17MHg4OTUzLCAgICAweDAwOGZ9LCB7MHg4OTU0LCAgICAweDAwN2V9LCB7MHg4OTU1LCAgICAweDAwYjd9LAotezB4ODk1NiwgICAgMHgwMDEyfSwgezB4ODk1NywgICAgMHgwMDBjfSwgezB4ODk1OCwgICAgMHgwMGI2fSwKLXsweDg5NTksICAgIDB4MDA4Zn0sIHsweDg5NWEsICAgIDB4MDA3ZH0sIHsweDg5NWIsICAgIDB4MDA0OH0sCi17MHg4OTVjLCAgICAweDAwYjd9LCB7MHg4OTVkLCAgICAweDAwOGZ9LCB7MHg4OTVlLCAgICAweDAwN2R9LAotezB4ODk1ZiwgICAgMHgwMDdlfSwgezB4ODk2MCwgICAgMHgwMDg5fSwgezB4ODk2MSwgICAgMHgwMDIxfSwKLXsweDg5NjIsICAgIDB4MDBiNn0sIHsweDg5NjMsICAgIDB4MDAxMn0sIHsweDg5NjQsICAgIDB4MDAwNH0sCi17MHg4OTY1LCAgICAweDAwOGF9LCB7MHg4OTY2LCAgICAweDAwMjB9LCB7MHg4OTY3LCAgICAweDAwYjd9LAotezB4ODk2OCwgICAgMHgwMDEyfSwgezB4ODk2OSwgICAgMHgwMDA0fSwgezB4ODk2YSwgICAgMHgwMGJkfSwKLXsweDg5NmIsICAgIDB4MDA4YX0sIHsweDg5NmMsICAgIDB4MDAwYX0sIHsweDg5NmQsICAgIDB4MDA0Zn0sCi17MHg4OTZlLCAgICAweDAwMzl9LCB7MHg4OTZmLCAgICAweDAwYTZ9LCB7MHg4OTcwLCAgICAweDAwMDB9LAotezB4ODk3MSwgICAgMHgwMDE4fSwgezB4ODk3MiwgICAgMHgwMGE3fSwgezB4ODk3MywgICAgMHgwMDAwfSwKLXsweDg5NzQsICAgIDB4MDAwOH0sIHsweDg5NzUsICAgIDB4MDAxOH0sIHsweDg5NzYsICAgIDB4MDAwOH0sCi17MHg4OTc3LCAgICAweDAwNWF9LCB7MHg4OTc4LCAgICAweDAwMjZ9LCB7MHg4OTc5LCAgICAweDAwZjV9LAotezB4ODk3YSwgICAgMHgwMDM5fSwgezB4ODk3YiwgICAgMHgwMDM2fSwgezB4ODk3YywgICAgMHgwMDZjfSwKLXsweDg5N2QsICAgIDB4MDAwMH0sIHsweDg5N2UsICAgIDB4MDAzMn0sIHsweDg5N2YsICAgIDB4MDBiYX0sCi17MHg4OTgwLCAgICAweDAwOGZ9LCB7MHg4OTgxLCAgICAweDAwN2Z9LCB7MHg4OTgyLCAgICAweDAwYjd9LAotezB4ODk4MywgICAgMHgwMDhmfSwgezB4ODk4NCwgICAgMHgwMDdmfSwgezB4ODk4NSwgICAgMHgwMGI2fSwKLXsweDg5ODYsICAgIDB4MDAxMn0sIHsweDg5ODcsICAgIDB4MDAwOX0sIHsweDg5ODgsICAgIDB4MDA4NH0sCi17MHg4OTg5LCAgICAweDAwMDN9LCB7MHg4OThhLCAgICAweDAwYTd9LCB7MHg4OThiLCAgICAweDAwMDF9LAotezB4ODk4YywgICAgMHgwMGI2fSwgezB4ODk4ZCwgICAgMHgwMDEyfSwgezB4ODk4ZSwgICAgMHgwMDA2fSwKLXsweDg5OGYsICAgIDB4MDA4NH0sIHsweDg5OTAsICAgIDB4MDAzZn0sIHsweDg5OTEsICAgIDB4MDBhN30sCi17MHg4OTkyLCAgICAweDAwMDJ9LCB7MHg4OTkzLCAgICAweDAwMzl9LCB7MHg4OTk0LCAgICAweDAwMzZ9LAotezB4ODk5NSwgICAgMHgwMDg2fSwgezB4ODk5NiwgICAgMHgwMDAzfSwgezB4ODk5NywgICAgMHgwMGI3fSwKLXsweDg5OTgsICAgIDB4MDA4Zn0sIHsweDg5OTksICAgIDB4MDA4MH0sIHsweDg5OWEsICAgIDB4MDAzMn0sCi17MHg4OTliLCAgICAweDAwYzF9LCB7MHg4OTljLCAgICAweDAwMDB9LCB7MHg4OTlkLCAgICAweDAwMjZ9LAotezB4ODk5ZSwgICAgMHgwMDA2fSwgezB4ODk5ZiwgICAgMHgwMGI3fSwgezB4ODlhMCwgICAgMHgwMDhmfSwKLXsweDg5YTEsICAgIDB4MDA3Y30sIHsweDg5YTIsICAgIDB4MDA3ZX0sIHsweDg5YTMsICAgIDB4MDA4OX0sCi17MHg4OWE0LCAgICAweDAwYzl9LCB7MHg4OWE1LCAgICAweDAwYzF9LCB7MHg4OWE2LCAgICAweDAwMDF9LAotezB4ODlhNywgICAgMHgwMDI3fSwgezB4ODlhOCwgICAgMHgwMDE4fSwgezB4ODlhOSwgICAgMHgwMGMxfSwKLXsweDg5YWEsICAgIDB4MDAwMn0sIHsweDg5YWIsICAgIDB4MDAyN30sIHsweDg5YWMsICAgIDB4MDAwY30sCi17MHg4OWFkLCAgICAweDAwYzF9LCB7MHg4OWFlLCAgICAweDAwMDN9LCB7MHg4OWFmLCAgICAweDAwMjd9LAotezB4ODliMCwgICAgMHgwMDAwfSwgezB4ODliMSwgICAgMHgwMGY2fSwgezB4ODliMiwgICAgMHgwMDhmfSwKLXsweDg5YjMsICAgIDB4MDA4MH0sIHsweDg5YjQsICAgIDB4MDAwNX0sIHsweDg5YjUsICAgIDB4MDAwNX0sCi17MHg4OWI2LCAgICAweDAwZjd9LCB7MHg4OWI3LCAgICAweDAwOGZ9LCB7MHg4OWI4LCAgICAweDAwODB9LAotezB4ODliOSwgICAgMHgwMGY2fSwgezB4ODliYSwgICAgMHgwMDhmfSwgezB4ODliYiwgICAgMHgwMDgwfSwKLXsweDg5YmMsICAgIDB4MDAwNX0sIHsweDg5YmQsICAgIDB4MDAwNX0sIHsweDg5YmUsICAgIDB4MDBmN30sCi17MHg4OWJmLCAgICAweDAwOGZ9LCB7MHg4OWMwLCAgICAweDAwODB9LCB7MHg4OWMxLCAgICAweDAwZjZ9LAotezB4ODljMiwgICAgMHgwMDhmfSwgezB4ODljMywgICAgMHgwMDgwfSwgezB4ODljNCwgICAgMHgwMDA1fSwKLXsweDg5YzUsICAgIDB4MDAwNX0sIHsweDg5YzYsICAgIDB4MDBmN30sIHsweDg5YzcsICAgIDB4MDA4Zn0sCi17MHg4OWM4LCAgICAweDAwODB9LCB7MHg4OWM5LCAgICAweDAwZjZ9LCB7MHg4OWNhLCAgICAweDAwOGZ9LAotezB4ODljYiwgICAgMHgwMDgwfSwgezB4ODljYywgICAgMHgwMDUzfSwgezB4ODljZCwgICAgMHgwMGY0fSwKLXsweDg5Y2UsICAgIDB4MDAxMn0sIHsweDg5Y2YsICAgIDB4MDAwN30sIHsweDg5ZDAsICAgIDB4MDAxYn0sCi17MHg4OWQxLCAgICAweDAwYjd9LCB7MHg4OWQyLCAgICAweDAwMTJ9LCB7MHg4OWQzLCAgICAweDAwMDd9LAotezB4ODlkNCwgICAgMHgwMDM5fSwgezB4ODlkNSwgICAgMHgwMGNlfSwgezB4ODlkNiwgICAgMHgwMDhmfSwKLXsweDg5ZDcsICAgIDB4MDA3MH0sIHsweDg5ZDgsICAgIDB4MDBhNn0sIHsweDg5ZDksICAgIDB4MDAwMH0sCi17MHg4OWRhLCAgICAweDAwMTh9LCB7MHg4OWRiLCAgICAweDAwZTZ9LCB7MHg4OWRjLCAgICAweDAwMDB9LAotezB4ODlkZCwgICAgMHgwMDE4fSwgezB4ODlkZSwgICAgMHgwMGE3fSwgezB4ODlkZiwgICAgMHgwMDAwfSwKLXsweDg5ZTAsICAgIDB4MDBlN30sIHsweDg5ZTEsICAgIDB4MDAwMH0sIHsweDg5ZTIsICAgIDB4MDBhNn0sCi17MHg4OWUzLCAgICAweDAwMDF9LCB7MHg4OWU0LCAgICAweDAwMTh9LCB7MHg4OWU1LCAgICAweDAwZTZ9LAotezB4ODllNiwgICAgMHgwMDAxfSwgezB4ODllNywgICAgMHgwMDE4fSwgezB4ODllOCwgICAgMHgwMGE3fSwKLXsweDg5ZTksICAgIDB4MDAwMX0sIHsweDg5ZWEsICAgIDB4MDBlN30sIHsweDg5ZWIsICAgIDB4MDAwMX0sCi17MHg4OWVjLCAgICAweDAwYTZ9LCB7MHg4OWVkLCAgICAweDAwMDJ9LCB7MHg4OWVlLCAgICAweDAwMTh9LAotezB4ODllZiwgICAgMHgwMGU2fSwgezB4ODlmMCwgICAgMHgwMDAyfSwgezB4ODlmMSwgICAgMHgwMDE4fSwKLXsweDg5ZjIsICAgIDB4MDBhN30sIHsweDg5ZjMsICAgIDB4MDAwMn0sIHsweDg5ZjQsICAgIDB4MDBlN30sCi17MHg4OWY1LCAgICAweDAwMDJ9LCB7MHg4OWY2LCAgICAweDAwMzl9LCB7MHg4OWY3LCAgICAweDAwYTZ9LAotezB4ODlmOCwgICAgMHgwMDAwfSwgezB4ODlmOSwgICAgMHgwMDg0fSwgezB4ODlmYSwgICAgMHgwMDA3fSwKLXsweDg5ZmIsICAgIDB4MDBlNn0sIHsweDg5ZmMsICAgIDB4MDAwMH0sIHsweDg5ZmQsICAgIDB4MDBjNH0sCi17MHg4OWZlLCAgICAweDAwMzh9LCB7MHg4OWZmLCAgICAweDAwNTR9LCB7MHg4YTAwLCAgICAweDAwNTR9LAotezB4OGEwMSwgICAgMHgwMDU0fSwgezB4OGEwMiwgICAgMHgwMDFifSwgezB4OGEwMywgICAgMHgwMGE3fSwKLXsweDhhMDQsICAgIDB4MDAwMH0sIHsweDhhMDUsICAgIDB4MDAzOX0sIHsweDhhMDYsICAgIDB4MDA0YX0sCi17MHg4YTA3LCAgICAweDAwMjZ9LCB7MHg4YTA4LCAgICAweDAwZmR9LCB7MHg4YTA5LCAgICAweDAwMzl9LAotezB4OGEwYSwgICAgMHgwMDk2fSwgezB4OGEwYiwgICAgMHgwMDIyfSwgezB4OGEwYywgICAgMHgwMDg0fSwKLXsweDhhMGQsICAgIDB4MDAwZn0sIHsweDhhMGUsICAgIDB4MDA5N30sIHsweDhhMGYsICAgIDB4MDAyMn0sCi17MHg4YTEwLCAgICAweDAwODZ9LCB7MHg4YTExLCAgICAweDAwMDF9LCB7MHg4YTEyLCAgICAweDAwYjd9LAotezB4OGExMywgICAgMHgwMDhmfSwgezB4OGExNCwgICAgMHgwMDcwfSwgezB4OGExNSwgICAgMHgwMGI2fSwKLXsweDhhMTYsICAgIDB4MDAxMn0sIHsweDhhMTcsICAgIDB4MDAwN30sIHsweDhhMTgsICAgIDB4MDBiN30sCi17MHg4YTE5LCAgICAweDAwOGZ9LCB7MHg4YTFhLCAgICAweDAwNzF9LCB7MHg4YTFiLCAgICAweDAwZjZ9LAotezB4OGExYywgICAgMHgwMDEyfSwgezB4OGExZCwgICAgMHgwMDBjfSwgezB4OGExZSwgICAgMHgwMGM0fSwKLXsweDhhMWYsICAgIDB4MDAwZn0sIHsweDhhMjAsICAgIDB4MDBjOH0sIHsweDhhMjEsICAgIDB4MDAwZn0sCi17MHg4YTIyLCAgICAweDAwZjd9LCB7MHg4YTIzLCAgICAweDAwOGZ9LCB7MHg4YTI0LCAgICAweDAwNzJ9LAotezB4OGEyNSwgICAgMHgwMGY2fSwgezB4OGEyNiwgICAgMHgwMDhmfSwgezB4OGEyNywgICAgMHgwMDcyfSwKLXsweDhhMjgsICAgIDB4MDBiNn0sIHsweDhhMjksICAgIDB4MDA4Zn0sIHsweDhhMmEsICAgIDB4MDA3MX0sCi17MHg4YTJiLCAgICAweDAwODR9LCB7MHg4YTJjLCAgICAweDAwMDN9LCB7MHg4YTJkLCAgICAweDAwMjd9LAotezB4OGEyZSwgICAgMHgwMDE0fSwgezB4OGEyZiwgICAgMHgwMDgxfSwgezB4OGEzMCwgICAgMHgwMDAxfSwKLXsweDhhMzEsICAgIDB4MDAyN30sIHsweDhhMzIsICAgIDB4MDAxY30sIHsweDhhMzMsICAgIDB4MDA4MX0sCi17MHg4YTM0LCAgICAweDAwMDJ9LCB7MHg4YTM1LCAgICAweDAwMjd9LCB7MHg4YTM2LCAgICAweDAwMjR9LAotezB4OGEzNywgICAgMHgwMGY0fSwgezB4OGEzOCwgICAgMHgwMDhmfSwgezB4OGEzOSwgICAgMHgwMDcwfSwKLXsweDhhM2EsICAgIDB4MDAyN30sIHsweDhhM2IsICAgIDB4MDAyYX0sIHsweDhhM2MsICAgIDB4MDA5Nn0sCi17MHg4YTNkLCAgICAweDAwMjJ9LCB7MHg4YTNlLCAgICAweDAwOGF9LCB7MHg4YTNmLCAgICAweDAwODB9LAotezB4OGE0MCwgICAgMHgwMDdlfSwgezB4OGE0MSwgICAgMHgwMDhhfSwgezB4OGE0MiwgICAgMHgwMDY0fSwKLXsweDhhNDMsICAgIDB4MDBmNH0sIHsweDhhNDQsICAgIDB4MDA4Zn0sIHsweDhhNDUsICAgIDB4MDA3MH0sCi17MHg4YTQ2LCAgICAweDAwMjd9LCB7MHg4YTQ3LCAgICAweDAwMWV9LCB7MHg4YTQ4LCAgICAweDAwOTZ9LAotezB4OGE0OSwgICAgMHgwMDIyfSwgezB4OGE0YSwgICAgMHgwMDhhfSwgezB4OGE0YiwgICAgMHgwMDEwfSwKLXsweDhhNGMsICAgIDB4MDA3ZX0sIHsweDhhNGQsICAgIDB4MDA4YX0sIHsweDhhNGUsICAgIDB4MDA2NH0sCi17MHg4YTRmLCAgICAweDAwZjR9LCB7MHg4YTUwLCAgICAweDAwOGZ9LCB7MHg4YTUxLCAgICAweDAwNzB9LAotezB4OGE1MiwgICAgMHgwMDI3fSwgezB4OGE1MywgICAgMHgwMDEyfSwgezB4OGE1NCwgICAgMHgwMDk2fSwKLXsweDhhNTUsICAgIDB4MDAyMn0sIHsweDhhNTYsICAgIDB4MDA4YX0sIHsweDhhNTcsICAgIDB4MDAyMH0sCi17MHg4YTU4LCAgICAweDAwN2V9LCB7MHg4YTU5LCAgICAweDAwOGF9LCB7MHg4YTVhLCAgICAweDAwNjR9LAotezB4OGE1YiwgICAgMHgwMGY0fSwgezB4OGE1YywgICAgMHgwMDhmfSwgezB4OGE1ZCwgICAgMHgwMDcwfSwKLXsweDhhNWUsICAgIDB4MDAyN30sIHsweDhhNWYsICAgIDB4MDAwNn0sIHsweDhhNjAsICAgIDB4MDA5Nn0sCi17MHg4YTYxLCAgICAweDAwMjJ9LCB7MHg4YTYyLCAgICAweDAwOGF9LCB7MHg4YTYzLCAgICAweDAwNDB9LAotezB4OGE2NCwgICAgMHgwMDk3fSwgezB4OGE2NSwgICAgMHgwMDIyfSwgezB4OGE2NiwgICAgMHgwMDc0fSwKLXsweDhhNjcsICAgIDB4MDA4Zn0sIHsweDhhNjgsICAgIDB4MDA3MX0sIHsweDhhNjksICAgIDB4MDA3NH0sCi17MHg4YTZhLCAgICAweDAwOGZ9LCB7MHg4YTZiLCAgICAweDAwNzF9LCB7MHg4YTZjLCAgICAweDAwNzh9LAotezB4OGE2ZCwgICAgMHgwMDhmfSwgezB4OGE2ZSwgICAgMHgwMDcwfSwgezB4OGE2ZiwgICAgMHgwMGI2fSwKLXsweDhhNzAsICAgIDB4MDA4Zn0sIHsweDhhNzEsICAgIDB4MDA3MH0sIHsweDhhNzIsICAgIDB4MDA4NX0sCi17MHg4YTczLCAgICAweDAwMTB9LCB7MHg4YTc0LCAgICAweDAwMjd9LCB7MHg4YTc1LCAgICAweDAwYWZ9LAotezB4OGE3NiwgICAgMHgwMGQ2fSwgezB4OGE3NywgICAgMHgwMDIyfSwgezB4OGE3OCwgICAgMHgwMGM0fSwKLXsweDhhNzksICAgIDB4MDAxMH0sIHsweDhhN2EsICAgIDB4MDA1OH0sIHsweDhhN2IsICAgIDB4MDBiNn0sCi17MHg4YTdjLCAgICAweDAwMTJ9LCB7MHg4YTdkLCAgICAweDAwNzB9LCB7MHg4YTdlLCAgICAweDAwODF9LAotezB4OGE3ZiwgICAgMHgwMGU0fSwgezB4OGE4MCwgICAgMHgwMDI3fSwgezB4OGE4MSwgICAgMHgwMDM2fSwKLXsweDhhODIsICAgIDB4MDA4MX0sIHsweDhhODMsICAgIDB4MDBlMX0sIHsweDhhODQsICAgIDB4MDAyNn0sCi17MHg4YTg1LCAgICAweDAwMGN9LCB7MHg4YTg2LCAgICAweDAwOTZ9LCB7MHg4YTg3LCAgICAweDAwMjJ9LAotezB4OGE4OCwgICAgMHgwMDg0fSwgezB4OGE4OSwgICAgMHgwMDIwfSwgezB4OGE4YSwgICAgMHgwMDQ0fSwKLXsweDhhOGIsICAgIDB4MDAxYn0sIHsweDhhOGMsICAgIDB4MDBkNn0sIHsweDhhOGQsICAgIDB4MDAyMn0sCi17MHg4YThlLCAgICAweDAwYzR9LCB7MHg4YThmLCAgICAweDAwY2Z9LCB7MHg4YTkwLCAgICAweDAwMjB9LAotezB4OGE5MSwgICAgMHgwMDIzfSwgezB4OGE5MiwgICAgMHgwMDU4fSwgezB4OGE5MywgICAgMHgwMDgxfSwKLXsweDhhOTQsICAgIDB4MDBjNn0sIHsweDhhOTUsICAgIDB4MDAyNn0sIHsweDhhOTYsICAgIDB4MDAwZH0sCi17MHg4YTk3LCAgICAweDAwOTZ9LCB7MHg4YTk4LCAgICAweDAwMjJ9LCB7MHg4YTk5LCAgICAweDAwODR9LAotezB4OGE5YSwgICAgMHgwMDQwfSwgezB4OGE5YiwgICAgMHgwMDQ0fSwgezB4OGE5YywgICAgMHgwMDQ0fSwKLXsweDhhOWQsICAgIDB4MDAxYn0sIHsweDhhOWUsICAgIDB4MDBkNn0sIHsweDhhOWYsICAgIDB4MDAyMn0sCi17MHg4YWEwLCAgICAweDAwYzR9LCB7MHg4YWExLCAgICAweDAwYWZ9LCB7MHg4YWEyLCAgICAweDAwMjB9LAotezB4OGFhMywgICAgMHgwMDExfSwgezB4OGFhNCwgICAgMHgwMDU4fSwgezB4OGFhNSwgICAgMHgwMDgxfSwKLXsweDhhYTYsICAgIDB4MDAyN30sIHsweDhhYTcsICAgIDB4MDAyNn0sIHsweDhhYTgsICAgIDB4MDAwZn0sCi17MHg4YWE5LCAgICAweDAwOTZ9LCB7MHg4YWFhLCAgICAweDAwMjJ9LCB7MHg4YWFiLCAgICAweDAwODR9LAotezB4OGFhYywgICAgMHgwMDgwfSwgezB4OGFhZCwgICAgMHgwMDQ0fSwgezB4OGFhZSwgICAgMHgwMDQ0fSwKLXsweDhhYWYsICAgIDB4MDA0NH0sIHsweDhhYjAsICAgIDB4MDAxYn0sIHsweDhhYjEsICAgIDB4MDBkNn0sCi17MHg4YWIyLCAgICAweDAwMjJ9LCB7MHg4YWIzLCAgICAweDAwYzR9LCB7MHg4YWI0LCAgICAweDAwNmZ9LAotezB4OGFiNSwgICAgMHgwMDFifSwgezB4OGFiNiwgICAgMHgwMDk3fSwgezB4OGFiNywgICAgMHgwMDIyfSwKLXsweDhhYjgsICAgIDB4MDAzOX0sIHsweDhhYjksICAgIDB4MDAyN30sIHsweDhhYmEsICAgIDB4MDAwY30sCi17MHg4YWJiLCAgICAweDAwN2N9LCB7MHg4YWJjLCAgICAweDAwODJ9LCB7MHg4YWJkLCAgICAweDAwMDZ9LAotezB4OGFiZSwgICAgMHgwMGJkfSwgezB4OGFiZiwgICAgMHgwMGQ5fSwgezB4OGFjMCwgICAgMHgwMGVkfSwKLXsweDhhYzEsICAgIDB4MDBiNn0sIHsweDhhYzIsICAgIDB4MDA4Mn0sIHsweDhhYzMsICAgIDB4MDAwN30sCi17MHg4YWM0LCAgICAweDAwN2V9LCB7MHg4YWM1LCAgICAweDAwOGF9LCB7MHg4YWM2LCAgICAweDAwYjl9LAotezB4OGFjNywgICAgMHgwMDdmfSwgezB4OGFjOCwgICAgMHgwMDgyfSwgezB4OGFjOSwgICAgMHgwMDA2fSwKLXsweDhhY2EsICAgIDB4MDAzOX0sIHsgMHgwLCAweDAgfQotfTsKLSNlbmRpZgotCi0KIC8qIHBoeSB0eXBlcyAqLwogI2RlZmluZSAgIENBU19QSFlfVU5LTk9XTiAgICAgICAweDAwCiAjZGVmaW5lICAgQ0FTX1BIWV9TRVJERVMgICAgICAgIDB4MDEKQEAgLTQzODksNiArMjg3MiwxMSBAQAogCWRtYV9hZGRyX3QgYmxvY2tfZHZtYSwgdHhfdGlueV9kdm1hW05fVFhfUklOR1NdOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBGaXJtd2FyZSBJbmZvICovCisJdTE2CQkJZndfbG9hZF9hZGRyOworCXUzMgkJCWZ3X3NpemU7CisJdTgJCQkqZndfZGF0YTsKIH07CiAKICNkZWZpbmUgVFhfREVTQ19ORVhUKHIsIHgpICAoKCh4KSArIDEpICYgKFRYX0RFU0NfUklOR05fU0laRShyKSAtIDEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3BtYWMuYyBiL2RyaXZlcnMvbmV0L2NwbWFjLmMKaW5kZXggZWM2YjBhZi4uMDE3YTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3BtYWMuYworKysgYi9kcml2ZXJzL25ldC9jcG1hYy5jCkBAIC0zMDIsMTMgKzMwMiw3IEBACiAKIHN0YXRpYyBpbnQgbWlpX2lycXNbUEhZX01BWF9BRERSXSA9IHsgUEhZX1BPTEwsIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWlpX2J1cyBjcG1hY19taWkgPSB7Ci0JLm5hbWUgPSAiY3BtYWMtbWlpIiwKLQkucmVhZCA9IGNwbWFjX21kaW9fcmVhZCwKLQkud3JpdGUgPSBjcG1hY19tZGlvX3dyaXRlLAotCS5yZXNldCA9IGNwbWFjX21kaW9fcmVzZXQsCi0JLmlycSA9IG1paV9pcnFzLAotfTsKK3N0YXRpYyBzdHJ1Y3QgbWlpX2J1cyAqY3BtYWNfbWlpOwogCiBzdGF0aWMgaW50IGNwbWFjX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKIHsKQEAgLTExMTYsNyArMTExMCw3IEBACiAJZm9yIChwaHlfaWQgPSAwOyBwaHlfaWQgPCBQSFlfTUFYX0FERFI7IHBoeV9pZCsrKSB7CiAJCWlmICghKHBkYXRhLT5waHlfbWFzayAmICgxIDw8IHBoeV9pZCkpKQogCQkJY29udGludWU7Ci0JCWlmICghY3BtYWNfbWlpLnBoeV9tYXBbcGh5X2lkXSkKKwkJaWYgKCFjcG1hY19taWktPnBoeV9tYXBbcGh5X2lkXSkKIAkJCWNvbnRpbnVlOwogCQlicmVhazsKIAl9CkBAIC0xMTY4LDcgKzExNjIsNyBAQAogCXByaXYtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1Z19sZXZlbCwgMHhmZik7CiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHBkYXRhLT5kZXZfYWRkciwgc2l6ZW9mKGRldi0+ZGV2X2FkZHIpKTsKIAotCXByaXYtPnBoeSA9IHBoeV9jb25uZWN0KGRldiwgY3BtYWNfbWlpLnBoeV9tYXBbcGh5X2lkXS0+ZGV2LmJ1c19pZCwKKwlwcml2LT5waHkgPSBwaHlfY29ubmVjdChkZXYsIGNwbWFjX21paS0+cGh5X21hcFtwaHlfaWRdLT5kZXYuYnVzX2lkLAogCQkJCSZjcG1hY19hZGp1c3RfbGluaywgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX01JSSk7CiAJaWYgKElTX0VSUihwcml2LT5waHkpKSB7CiAJCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQpAQCAtMTIxNiwxMSArMTIxMCwyMiBAQAogCXUzMiBtYXNrOwogCWludCBpLCByZXM7CiAKLQljcG1hY19taWkucHJpdiA9IGlvcmVtYXAoQVI3X1JFR1NfTURJTywgMjU2KTsKKwljcG1hY19taWkgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKGNwbWFjX21paSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICghY3BtYWNfbWlpLnByaXYpIHsKKwljcG1hY19taWktPm5hbWUgPSAiY3BtYWMtbWlpIjsKKwljcG1hY19taWktPnJlYWQgPSBjcG1hY19tZGlvX3JlYWQ7CisJY3BtYWNfbWlpLT53cml0ZSA9IGNwbWFjX21kaW9fd3JpdGU7CisJY3BtYWNfbWlpLT5yZXNldCA9IGNwbWFjX21kaW9fcmVzZXQ7CisJY3BtYWNfbWlpLT5pcnEgPSBtaWlfaXJxczsKKworCWNwbWFjX21paS0+cHJpdiA9IGlvcmVtYXAoQVI3X1JFR1NfTURJTywgMjU2KTsKKworCWlmICghY3BtYWNfbWlpLT5wcml2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgaW9yZW1hcCBtZGlvIHJlZ2lzdGVyc1xuIik7Ci0JCXJldHVybiAtRU5YSU87CisJCXJlcyA9IC1FTlhJTzsKKwkJZ290byBmYWlsX2FsbG9jOwogCX0KIAogI3dhcm5pbmcgRklYTUU6IHVuaGFyZGNvZGUgZ3BpbyZyZXNldCBiaXRzCkBAIC0xMjMwLDEwICsxMjM1LDEwIEBACiAJYXI3X2RldmljZV9yZXNldChBUjdfUkVTRVRfQklUX0NQTUFDX0hJKTsKIAlhcjdfZGV2aWNlX3Jlc2V0KEFSN19SRVNFVF9CSVRfRVBIWSk7CiAKLQljcG1hY19taWkucmVzZXQoJmNwbWFjX21paSk7CisJY3BtYWNfbWlpLT5yZXNldChjcG1hY19taWkpOwogCiAJZm9yIChpID0gMDsgaSA8IDMwMDAwMDsgaSsrKQotCQlpZiAoKG1hc2sgPSBjcG1hY19yZWFkKGNwbWFjX21paS5wcml2LCBDUE1BQ19NRElPX0FMSVZFKSkpCisJCWlmICgobWFzayA9IGNwbWFjX3JlYWQoY3BtYWNfbWlpLT5wcml2LCBDUE1BQ19NRElPX0FMSVZFKSkpCiAJCQlicmVhazsKIAkJZWxzZQogCQkJY3B1X3JlbGF4KCk7CkBAIC0xMjQ0LDEwICsxMjQ5LDEwIEBACiAJCW1hc2sgPSAwOwogCX0KIAotCWNwbWFjX21paS5waHlfbWFzayA9IH4obWFzayB8IDB4ODAwMDAwMDApOwotCXNucHJpbnRmKGNwbWFjX21paS5pZCwgTUlJX0JVU19JRF9TSVpFLCAiMCIpOworCWNwbWFjX21paS0+cGh5X21hc2sgPSB+KG1hc2sgfCAweDgwMDAwMDAwKTsKKwlzbnByaW50ZihjcG1hY19taWktPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIwIik7CiAKLQlyZXMgPSBtZGlvYnVzX3JlZ2lzdGVyKCZjcG1hY19taWkpOworCXJlcyA9IG1kaW9idXNfcmVnaXN0ZXIoY3BtYWNfbWlpKTsKIAlpZiAocmVzKQogCQlnb3RvIGZhaWxfbWlpOwogCkBAIC0xMjU4LDEwICsxMjYzLDEzIEBACiAJcmV0dXJuIDA7CiAKIGZhaWxfY3BtYWM6Ci0JbWRpb2J1c191bnJlZ2lzdGVyKCZjcG1hY19taWkpOworCW1kaW9idXNfdW5yZWdpc3RlcihjcG1hY19taWkpOwogCiBmYWlsX21paToKLQlpb3VubWFwKGNwbWFjX21paS5wcml2KTsKKwlpb3VubWFwKGNwbWFjX21paS0+cHJpdik7CisKK2ZhaWxfYWxsb2M6CisJbWRpb2J1c19mcmVlKGNwbWFjX21paSk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTI2OSw4ICsxMjc3LDkgQEAKIHZvaWQgX19kZXZleGl0IGNwbWFjX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3BtYWNfZHJpdmVyKTsKLQltZGlvYnVzX3VucmVnaXN0ZXIoJmNwbWFjX21paSk7Ci0JaW91bm1hcChjcG1hY19taWkucHJpdik7CisJbWRpb2J1c191bnJlZ2lzdGVyKGNwbWFjX21paSk7CisJbWRpb2J1c19mcmVlKGNwbWFjX21paSk7CisJaW91bm1hcChjcG1hY19taWktPnByaXYpOwogfQogCiBtb2R1bGVfaW5pdChjcG1hY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5jIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKaW5kZXggZWE2MTQ0YS4uNzEwNzYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKQEAgLTM2LDggKzM2LDcgQEAKIAogICBBbGFuIENveCAgICAgICAgICA6IFJlbW92ZWQgMS4yIHN1cHBvcnQsIGFkZGVkIDIuMSBleHRyYSBjb3VudGVycy4KIAotICBBbmRyZXcgTW9ydG9uICAgICA6IGFuZHJld21AdW93LmVkdS5hdQotICAgICAgICAgICAgICAgICAgICA6IEtlcm5lbCAyLjMuNDgKKyAgQW5kcmV3IE1vcnRvbiAgICAgOiBLZXJuZWwgMi4zLjQ4CiAgICAgICAgICAgICAgICAgICAgIDogSGFuZGxlIGttYWxsb2MoKSBmYWlsdXJlcwogICAgICAgICAgICAgICAgICAgICA6IE90aGVyIHJlc291cmNlIGFsbG9jYXRpb24gZml4ZXMKICAgICAgICAgICAgICAgICAgICAgOiBBZGQgU01QIGxvY2tzCkBAIC00OSw3ICs0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIDogRml4ZWQgYW4gb3V0LW9mLW1lbSBidWcgaW4gZG1hX3J4KCkKICAgICAgICAgICAgICAgICAgICAgOiBVcGRhdGVkIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9jczg5eDAudHh0CiAKLSAgQW5kcmV3IE1vcnRvbiAgICAgOiBhbmRyZXdtQHVvdy5lZHUuYXUgLyBLZXJuZWwgMi4zLjk5LXByZTEKKyAgQW5kcmV3IE1vcnRvbiAgICAgOiBLZXJuZWwgMi4zLjk5LXByZTEKICAgICAgICAgICAgICAgICAgICAgOiBVc2Ugc2tiX3Jlc2VydmUgdG8gbG9uZ3dvcmQgYWxpZ24gSVAgaGVhZGVyICh0d28gcGxhY2VzKQogICAgICAgICAgICAgICAgICAgICA6IFJlbW92ZSBhIGRlbGF5IGxvb3AgZnJvbSBkbWFfcngoKQogICAgICAgICAgICAgICAgICAgICA6IFJlcGxhY2UgJzEwMCcgd2l0aCBIWgpAQCAtNTcsMTEgKzU2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIDogQWRkZWQgJ2NzODl4MF9kbWE9Ticga2VybmVsIGJvb3Qgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgIDogQ29ycmVjdGx5IGluaXRpYWxpc2UgbHAtPmxvY2sgaW4gbm9uLW1vZHVsZSBjb21waWxlCiAKLSAgQW5kcmV3IE1vcnRvbiAgICAgOiBhbmRyZXdtQHVvdy5lZHUuYXUgLyBLZXJuZWwgMi4zLjk5LXByZTQtMQorICBBbmRyZXcgTW9ydG9uICAgICA6IEtlcm5lbCAyLjMuOTktcHJlNC0xCiAgICAgICAgICAgICAgICAgICAgIDogTU9EX0lOQy9ERUMgcmFjZSBmaXggKHNlZQogICAgICAgICAgICAgICAgICAgICA6IGh0dHA6Ly93d3cudXdzZy5pbmRpYW5hLmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzAwMDMuMy8xNTMyLmh0bWwpCiAKLSAgQW5kcmV3IE1vcnRvbiAgICAgOiBhbmRyZXdtQHVvdy5lZHUuYXUgLyBLZXJuZWwgMi40LjAtdGVzdDctcHJlMgorICBBbmRyZXcgTW9ydG9uICAgICA6IEtlcm5lbCAyLjQuMC10ZXN0Ny1wcmUyCiAgICAgICAgICAgICAgICAgICAgIDogRW5oYW5jZWQgRUVQUk9NIHN1cHBvcnQgdG8gY292ZXIgbW9yZSBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICA6ICAgYWJzdHJhY3RlZCBJUlEgbWFwcGluZyB0byBzdXBwb3J0IENPTkZJR19BUkNIX0NMUFM3NTAwIGFyY2gKICAgICAgICAgICAgICAgICAgICAgOiAgIChKYXNvbiBHdW50aG9ycGUgPGpnZ0B1YWxiZXJ0YS5jYT4pCkBAIC0xNTYsNyArMTU1LDcgQEAKICNpbmNsdWRlICJjczg5eDAuaCIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQotImNzODl4MC5jOiB2Mi40LjMtcHJlMSBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+LCBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+XG4iOworImNzODl4MC5jOiB2Mi40LjMtcHJlMSBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+LCBBbmRyZXcgTW9ydG9uXG4iOwogCiAjZGVmaW5lIERSVl9OQU1FICJjczg5eDAiCiAKQEAgLTE5NCw2ICsxOTMsMTIgQEAKICNkZWZpbmUgQ0lSUlVTX0RFRkFVTFRfSVJRCVZIX0lOVENfSU5UX05VTV9DQVNDQURFRF9JTlRFUlJVUFRfMSAvKiBFdmVudCBpbnB1dHMgYmFuayAxIC0gSUQgMzUvYml0IDMgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9fdXNlZCBfX2luaXRkYXRhID0ge0NJUlJVU19ERUZBVUxUX0JBU0UsIDB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0NJUlJVU19ERUZBVUxUX0lSUSwgMCwgMCwgMH07CisjZWxpZiBkZWZpbmVkKENPTkZJR19NQUNIX01YMzFBRFMpCisjaW5jbHVkZSA8bWFjaC9ib2FyZC1teDMxYWRzLmg+CitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX3VzZWQgX19pbml0ZGF0YSA9IHsKKwlQQkNfQkFTRV9BRERSRVNTICsgUEJDX0NTODkwMEFfSU9CQVNFICsgMHgzMDAsIDAKK307CitzdGF0aWMgdW5zaWduZWQgY3M4OTAwX2lycV9tYXBbXSA9IHtFWFBJT19JTlRfRU5FVF9JTlQsIDAsIDAsIDB9OwogI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9fdXNlZCBfX2luaXRkYXRhID0KICAgIHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDJlMCwgMH07CkBAIC04MDIsNyArODA3LDcgQEAKIAl9IGVsc2UgewogCQlpID0gbHAtPmlzYV9jb25maWcgJiBJTlRfTk9fTUFTSzsKIAkJaWYgKGxwLT5jaGlwX3R5cGUgPT0gQ1M4OTAwKSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTBYKQorI2lmZGVmIENPTkZJR19DUzg5eDBfTk9OSVNBX0lSUQogCQkgICAgICAgIGkgPSBjczg5MDBfaXJxX21hcFswXTsKICNlbHNlCiAJCQkvKiBUcmFuc2xhdGUgdGhlIElSUSB1c2luZyB0aGUgSVJRIG1hcHBpbmcgdGFibGUuICovCkBAIC0xMDI5LDYgKzEwMzQsNyBAQAogCiB2b2lkICBfX2luaXQgcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworI2lmICFkZWZpbmVkKENPTkZJR19NQUNIX01YMzFBRFMpCiAjaWYgIWRlZmluZWQoQ09ORklHX01BQ0hfSVhEUDIzNTEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKQogCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CkBAIC0xMDU3LDYgKzEwNjMsNyBAQAogCXJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCXdoaWxlKCAocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiBJTklUX0RPTkUpID09IDAgJiYgamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPCAyKQogCQk7CisjZW5kaWYgLyogIUNPTkZJR19NQUNIX01YMzFBRFMgKi8KIH0KIAogCkBAIC0xMzA0LDcgKzEzMTEsNyBAQAogCWVsc2UKICNlbmRpZgogCXsKLSNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9JWERQMjM1MSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMFgpCisjaWZuZGVmIENPTkZJR19DUzg5eDBfTk9OSVNBX0lSUQogCQlpZiAoKCgxIDw8IGRldi0+aXJxKSAmIGxwLT5pcnFfbWFwKSA9PSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgaXMgbm90IGluIG91ciBtYXAgb2YgYWxsb3dhYmxlIElSUXMsIHdoaWNoIGlzICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGxwLT5pcnFfbWFwKTsKQEAgLTEzOTcsOSArMTQwNCw3IEBACiByZWxlYXNlX2RtYToKICNpZiBBTExPV19ETUEKIAkJZnJlZV9kbWEoZGV2LT5kbWEpOwotI2VuZGlmCiByZWxlYXNlX2lycToKLSNpZiBBTExPV19ETUEKIAkJcmVsZWFzZV9kbWFfYnVmZihscCk7CiAjZW5kaWYKICAgICAgICAgICAgICAgICB3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKSAmIH4oU0VSSUFMX1RYX09OIHwgU0VSSUFMX1JYX09OKSk7CkBAIC0xODcxLDcgKzE4NzYsNyBAQAogTU9EVUxFX1BBUk1fREVTQyh1c2VfZG1hICwgIihpZ25vcmVkKSIpOwogI2VuZGlmCiAKLU1PRFVMRV9BVVRIT1IoIk1pa2UgQ3J1c2UsIFJ1c3N3bGwgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4sIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pa2UgQ3J1c2UsIFJ1c3N3bGwgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4sIEFuZHJldyBNb3J0b24iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmggYi9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmgKaW5kZXggMjcxMTQwNC4uYmM4ZTI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2FkYXB0ZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTU0LDcgKzU0LDYgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CiAJc3RydWN0IHNnZV9xc2V0ICpxczsKLQljb25zdCBzdHJ1Y3QgcG9ydF90eXBlX2luZm8gKnBvcnRfdHlwZTsKIAl1OCBwb3J0X2lkOwogCXU4IHJ4X2NzdW1fb2ZmbG9hZDsKIAl1OCBucXNldHM7CkBAIC0xMjQsOCArMTIzLDcgQEAKIAlkbWFfYWRkcl90IHBoeXNfYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcmluZyAqLwogCXVuc2lnbmVkIGludCBjbnR4dF9pZDsJLyogU0dFIGNvbnRleHQgaWQgZm9yIHRoZSByZXNwb25zZSBxICovCiAJc3BpbmxvY2tfdCBsb2NrOwkvKiBndWFyZHMgcmVzcG9uc2UgcHJvY2Vzc2luZyAqLwotCXN0cnVjdCBza19idWZmICpyeF9oZWFkOwkvKiBvZmZsb2FkIHBhY2tldCByZWNlaXZlIHF1ZXVlIGhlYWQgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqcnhfdGFpbDsJLyogb2ZmbG9hZCBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSB0YWlsICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9xdWV1ZTsgLyogb2ZmbG9hZCBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSAqLwogCXN0cnVjdCBza19idWZmICpwZ19za2I7IC8qIHVzZWQgdG8gYnVpbGQgZnJhZyBsaXN0IGluIG5hcGkgaGFuZGxlciAqLwogCiAJdW5zaWduZWQgbG9uZyBvZmZsb2FkX3BrdHM7CkBAIC0yNDEsNiArMjM5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY2hlY2tfdGFza19jbnQ7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBhZGFwX2NoZWNrX3Rhc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IGV4dF9pbnRyX2hhbmRsZXJfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmF0YWxfZXJyb3JfaGFuZGxlcl90YXNrOwogCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OwogCkBAIC0yODIsOSArMjgxLDExIEBACiB2b2lkIHQzX29zX2V4dF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCB0M19vc19saW5rX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkLCBpbnQgbGlua19zdGF0dXMsCiAJCQlpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBmYyk7Cit2b2lkIHQzX29zX3BoeW1vZF9jaGFuZ2VkKHN0cnVjdCBhZGFwdGVyICphZGFwLCBpbnQgcG9ydF9pZCk7CiAKIHZvaWQgdDNfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwKTsKIHZvaWQgdDNfc2dlX3N0b3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwordm9pZCB0M19zdG9wX3NnZV90aW1lcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogdm9pZCB0M19mcmVlX3NnZV9yZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogdm9pZCB0M19zZ2VfZXJyX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiBpcnFfaGFuZGxlcl90IHQzX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgaW50IHBvbGxpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvYWVsMTAwMi5jIGIvZHJpdmVycy9uZXQvY3hnYjMvYWVsMTAwMi5jCmluZGV4IGVlMTQwZTYuLjVjM2MwNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2FlbDEwMDIuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9hZWwxMDAyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0zMywxNyArMzMsNTcgQEAKICNpbmNsdWRlICJyZWdzLmgiCiAKIGVudW0geworCVBNRF9SU0QgICAgID0gMTAsICAgLyogUE1BL1BNRCByZWNlaXZlIHNpZ25hbCBkZXRlY3QgcmVnaXN0ZXIgKi8KKwlQQ1NfU1RBVDFfWCA9IDI0LCAgIC8qIDEwR0JBU0UtWCBQQ1Mgc3RhdHVzIDEgcmVnaXN0ZXIgKi8KKwlQQ1NfU1RBVDFfUiA9IDMyLCAgIC8qIDEwR0JBU0UtUiBQQ1Mgc3RhdHVzIDEgcmVnaXN0ZXIgKi8KKwlYU19MTl9TVEFUICA9IDI0ICAgIC8qIFhTIGxhbmUgc3RhdHVzIHJlZ2lzdGVyICovCit9OworCitlbnVtIHsKIAlBRUwxMDBYX1RYX0RJU0FCTEUgPSA5LAogCUFFTDEwMFhfVFhfQ09ORklHMSA9IDB4YzAwMiwKIAlBRUwxMDAyX1BXUl9ET1dOX0hJID0gMHhjMDExLAogCUFFTDEwMDJfUFdSX0RPV05fTE8gPSAweGMwMTIsCiAJQUVMMTAwMl9YRklfRVFMID0gMHhjMDE1LAogCUFFTDEwMDJfTEJfRU4gPSAweGMwMTcsCi0KLQlMQVNJX0NUUkwgPSAweDkwMDIsCi0JTEFTSV9TVEFUID0gMHg5MDA1CisJQUVMX09QVF9TRVRUSU5HUyA9IDB4YzAxNywKKwlBRUxfSTJDX0NUUkwgPSAweGMzMGEsCisJQUVMX0kyQ19EQVRBID0gMHhjMzBiLAorCUFFTF9JMkNfU1RBVCA9IDB4YzMwYywKKwlBRUwyMDA1X0dQSU9fQ1RSTCA9IDB4YzIxNCwKKwlBRUwyMDA1X0dQSU9fU1RBVCA9IDB4YzIxNSwKIH07CiAKK2VudW0geyBlZGNfbm9uZSwgZWRjX3NyLCBlZGNfdHdpbmF4IH07CisKKy8qIFBIWSBtb2R1bGUgSTJDIGRldmljZSBhZGRyZXNzICovCisjZGVmaW5lIE1PRFVMRV9ERVZfQUREUiAweGEwCisKKyNkZWZpbmUgQUVMMjAwNV9NT0RERVRfSVJRIDQKKworc3RydWN0IHJlZ192YWwgeworCXVuc2lnbmVkIHNob3J0IG1tZF9hZGRyOworCXVuc2lnbmVkIHNob3J0IHJlZ19hZGRyOworCXVuc2lnbmVkIHNob3J0IGNsZWFyX2JpdHM7CisJdW5zaWduZWQgc2hvcnQgc2V0X2JpdHM7Cit9OworCitzdGF0aWMgaW50IHNldF9waHlfcmVncyhzdHJ1Y3QgY3BoeSAqcGh5LCBjb25zdCBzdHJ1Y3QgcmVnX3ZhbCAqcnYpCit7CisJaW50IGVycjsKKworCWZvciAoZXJyID0gMDsgcnYtPm1tZF9hZGRyICYmICFlcnI7IHJ2KyspIHsKKwkJaWYgKHJ2LT5jbGVhcl9iaXRzID09IDB4ZmZmZikKKwkJCWVyciA9IG1kaW9fd3JpdGUocGh5LCBydi0+bW1kX2FkZHIsIHJ2LT5yZWdfYWRkciwKKwkJCQkJIHJ2LT5zZXRfYml0cyk7CisJCWVsc2UKKwkJCWVyciA9IHQzX21kaW9fY2hhbmdlX2JpdHMocGh5LCBydi0+bW1kX2FkZHIsCisJCQkJCQkgIHJ2LT5yZWdfYWRkciwgcnYtPmNsZWFyX2JpdHMsCisJCQkJCQkgIHJ2LT5zZXRfYml0cyk7CisJfQorCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIGFlbDEwMHhfdHhvbihzdHJ1Y3QgY3BoeSAqcGh5KQogewogCWludCB0eF9vbl9ncGlvID0gcGh5LT5hZGRyID09IDAgPyBGX0dQSU83X09VVF9WQUwgOiBGX0dQSU8yX09VVF9WQUw7CkBAIC04NCwyMyArMTI0LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWVsMTAweF9nZXRfbGlua19zdGF0dXMoc3RydWN0IGNwaHkgKnBoeSwgaW50ICpsaW5rX29rLAotCQkJCSAgIGludCAqc3BlZWQsIGludCAqZHVwbGV4LCBpbnQgKmZjKQorLyoKKyAqIEdldCBsaW5rIHN0YXR1cyBmb3IgYSAxMEdCQVNFLVIgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGdldF9saW5rX3N0YXR1c19yKHN0cnVjdCBjcGh5ICpwaHksIGludCAqbGlua19vaywgaW50ICpzcGVlZCwKKwkJCSAgICAgaW50ICpkdXBsZXgsIGludCAqZmMpCiB7CiAJaWYgKGxpbmtfb2spIHsKLQkJdW5zaWduZWQgaW50IHN0YXR1czsKLQkJaW50IGVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIE1JSV9CTVNSLCAmc3RhdHVzKTsKKwkJdW5zaWduZWQgaW50IHN0YXQwLCBzdGF0MSwgc3RhdDI7CisJCWludCBlcnIgPSBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBQTURfUlNELCAmc3RhdDApOwogCi0JCS8qCi0JCSAqIEJNU1JfTFNUQVRVUyBpcyBsYXRjaC1sb3csIHNvIGlmIGl0IGlzIDAgd2UgbmVlZCB0byByZWFkIGl0Ci0JCSAqIG9uY2UgbW9yZSB0byBnZXQgdGhlIGN1cnJlbnQgbGluayBzdGF0ZS4KLQkJICovCi0JCWlmICghZXJyICYmICEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkKLQkJCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIE1JSV9CTVNSLAotCQkJCQkmc3RhdHVzKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QQ1MsIFBDU19TVEFUMV9SLCAmc3RhdDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1hHWFMsIFhTX0xOX1NUQVQsICZzdGF0Mik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQkqbGlua19vayA9ICEhKHN0YXR1cyAmIEJNU1JfTFNUQVRVUyk7CisJCSpsaW5rX29rID0gKHN0YXQwICYgc3RhdDEgJiAoc3RhdDIgPj4gMTIpKSAmIDE7CiAJfQogCWlmIChzcGVlZCkKIAkJKnNwZWVkID0gU1BFRURfMTAwMDA7CkBAIC0xMTUsMTUgKzE1NSwxOCBAQAogCS5pbnRyX2Rpc2FibGUgPSBhZWwxMDAyX2ludHJfbm9vcCwKIAkuaW50cl9jbGVhciA9IGFlbDEwMDJfaW50cl9ub29wLAogCS5pbnRyX2hhbmRsZXIgPSBhZWwxMDAyX2ludHJfbm9vcCwKLQkuZ2V0X2xpbmtfc3RhdHVzID0gYWVsMTAweF9nZXRfbGlua19zdGF0dXMsCisJLmdldF9saW5rX3N0YXR1cyA9IGdldF9saW5rX3N0YXR1c19yLAogCS5wb3dlcl9kb3duID0gYWVsMTAwMl9wb3dlcl9kb3duLAogfTsKIAotdm9pZCB0M19hZWwxMDAyX3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK2ludCB0M19hZWwxMDAyX3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQogewotCWNwaHlfaW5pdChwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmYWVsMTAwMl9vcHMsIG1kaW9fb3BzKTsKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJmFlbDEwMDJfb3BzLCBtZGlvX29wcywKKwkJICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0FVSSB8IFNVUFBPUlRFRF9GSUJSRSwKKwkJICAgIjEwR0JBU0UtUiIpOwogCWFlbDEwMHhfdHhvbihwaHkpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFlbDEwMDZfcmVzZXQoc3RydWN0IGNwaHkgKnBoeSwgaW50IHdhaXQpCkBAIC0xMzEsMzMgKzE3NCw2IEBACiAJcmV0dXJuIHQzX3BoeV9yZXNldChwaHksIE1ESU9fREVWX1BNQV9QTUQsIHdhaXQpOwogfQogCi1zdGF0aWMgaW50IGFlbDEwMDZfaW50cl9lbmFibGUoc3RydWN0IGNwaHkgKnBoeSkKLXsKLQlyZXR1cm4gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIExBU0lfQ1RSTCwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWVsMTAwNl9pbnRyX2Rpc2FibGUoc3RydWN0IGNwaHkgKnBoeSkKLXsKLQlyZXR1cm4gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIExBU0lfQ1RSTCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWVsMTAwNl9pbnRyX2NsZWFyKHN0cnVjdCBjcGh5ICpwaHkpCi17Ci0JdTMyIHZhbDsKLQotCXJldHVybiBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBMQVNJX1NUQVQsICZ2YWwpOwotfQotCi1zdGF0aWMgaW50IGFlbDEwMDZfaW50cl9oYW5kbGVyKHN0cnVjdCBjcGh5ICpwaHkpCi17Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQlpbnQgZXJyID0gbWRpb19yZWFkKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTEFTSV9TVEFULCAmc3RhdHVzKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIChzdGF0dXMgJiAxKSA/IGNwaHlfY2F1c2VfbGlua19jaGFuZ2UgOiAwOwotfQotCiBzdGF0aWMgaW50IGFlbDEwMDZfcG93ZXJfZG93bihzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgZW5hYmxlKQogewogCXJldHVybiB0M19tZGlvX2NoYW5nZV9iaXRzKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTUlJX0JNQ1IsCkBAIC0xNjYsMzcgKzE4Miw5NzcgQEAKIAogc3RhdGljIHN0cnVjdCBjcGh5X29wcyBhZWwxMDA2X29wcyA9IHsKIAkucmVzZXQgPSBhZWwxMDA2X3Jlc2V0LAotCS5pbnRyX2VuYWJsZSA9IGFlbDEwMDZfaW50cl9lbmFibGUsCi0JLmludHJfZGlzYWJsZSA9IGFlbDEwMDZfaW50cl9kaXNhYmxlLAotCS5pbnRyX2NsZWFyID0gYWVsMTAwNl9pbnRyX2NsZWFyLAotCS5pbnRyX2hhbmRsZXIgPSBhZWwxMDA2X2ludHJfaGFuZGxlciwKLQkuZ2V0X2xpbmtfc3RhdHVzID0gYWVsMTAweF9nZXRfbGlua19zdGF0dXMsCisJLmludHJfZW5hYmxlID0gdDNfcGh5X2xhc2lfaW50cl9lbmFibGUsCisJLmludHJfZGlzYWJsZSA9IHQzX3BoeV9sYXNpX2ludHJfZGlzYWJsZSwKKwkuaW50cl9jbGVhciA9IHQzX3BoeV9sYXNpX2ludHJfY2xlYXIsCisJLmludHJfaGFuZGxlciA9IHQzX3BoeV9sYXNpX2ludHJfaGFuZGxlciwKKwkuZ2V0X2xpbmtfc3RhdHVzID0gZ2V0X2xpbmtfc3RhdHVzX3IsCiAJLnBvd2VyX2Rvd24gPSBhZWwxMDA2X3Bvd2VyX2Rvd24sCiB9OwogCi12b2lkIHQzX2FlbDEwMDZfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoraW50IHQzX2FlbDEwMDZfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKIHsKLQljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJmFlbDEwMDZfb3BzLCBtZGlvX29wcyk7CisJY3BoeV9pbml0KHBoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZhZWwxMDA2X29wcywgbWRpb19vcHMsCisJCSAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUkgfCBTVVBQT1JURURfRklCUkUsCisJCSAgICIxMEdCQVNFLVNSIik7CiAJYWVsMTAweF90eG9uKHBoeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWVsMjAwNV9zZXR1cF9zcl9lZGMoc3RydWN0IGNwaHkgKnBoeSkKK3sKKwlzdGF0aWMgc3RydWN0IHJlZ192YWwgcmVnc1tdID0geworCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzAwMywgMHhmZmZmLCAweDE4MSB9LAorCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzAxMCwgMHhmZmZmLCAweDQ0OGEgfSwKKwkJeyBNRElPX0RFVl9QTUFfUE1ELCAweGMwNGEsIDB4ZmZmZiwgMHg1MjAwIH0sCisJCXsgMCwgMCwgMCwgMCB9CisJfTsKKwlzdGF0aWMgdTE2IHNyX2VkY1tdID0geworCQkweGNjMDAsIDB4MmZmNCwKKwkJMHhjYzAxLCAweDNjZDQsCisJCTB4Y2MwMiwgMHgyMDE1LAorCQkweGNjMDMsIDB4MzEwNSwKKwkJMHhjYzA0LCAweDY1MjQsCisJCTB4Y2MwNSwgMHgyN2ZmLAorCQkweGNjMDYsIDB4MzAwZiwKKwkJMHhjYzA3LCAweDJjOGIsCisJCTB4Y2MwOCwgMHgzMDBiLAorCQkweGNjMDksIDB4NDAwOSwKKwkJMHhjYzBhLCAweDQwMGUsCisJCTB4Y2MwYiwgMHgyZjcyLAorCQkweGNjMGMsIDB4MzAwMiwKKwkJMHhjYzBkLCAweDEwMDIsCisJCTB4Y2MwZSwgMHgyMTcyLAorCQkweGNjMGYsIDB4MzAxMiwKKwkJMHhjYzEwLCAweDEwMDIsCisJCTB4Y2MxMSwgMHgyNWQyLAorCQkweGNjMTIsIDB4MzAxMiwKKwkJMHhjYzEzLCAweDEwMDIsCisJCTB4Y2MxNCwgMHhkMDFlLAorCQkweGNjMTUsIDB4MjdkMiwKKwkJMHhjYzE2LCAweDMwMTIsCisJCTB4Y2MxNywgMHgxMDAyLAorCQkweGNjMTgsIDB4MjAwNCwKKwkJMHhjYzE5LCAweDNjODQsCisJCTB4Y2MxYSwgMHg2NDM2LAorCQkweGNjMWIsIDB4MjAwNywKKwkJMHhjYzFjLCAweDNmODcsCisJCTB4Y2MxZCwgMHg4Njc2LAorCQkweGNjMWUsIDB4NDBiNywKKwkJMHhjYzFmLCAweGE3NDYsCisJCTB4Y2MyMCwgMHg0MDQ3LAorCQkweGNjMjEsIDB4NTY3MywKKwkJMHhjYzIyLCAweDI5ODIsCisJCTB4Y2MyMywgMHgzMDAyLAorCQkweGNjMjQsIDB4MTNkMiwKKwkJMHhjYzI1LCAweDhiYmQsCisJCTB4Y2MyNiwgMHgyODYyLAorCQkweGNjMjcsIDB4MzAxMiwKKwkJMHhjYzI4LCAweDEwMDIsCisJCTB4Y2MyOSwgMHgyMDkyLAorCQkweGNjMmEsIDB4MzAxMiwKKwkJMHhjYzJiLCAweDEwMDIsCisJCTB4Y2MyYywgMHg1Y2MzLAorCQkweGNjMmQsIDB4MzE0LAorCQkweGNjMmUsIDB4Mjk0MiwKKwkJMHhjYzJmLCAweDMwMDIsCisJCTB4Y2MzMCwgMHgxMDAyLAorCQkweGNjMzEsIDB4ZDAxOSwKKwkJMHhjYzMyLCAweDIwMzIsCisJCTB4Y2MzMywgMHgzMDEyLAorCQkweGNjMzQsIDB4MTAwMiwKKwkJMHhjYzM1LCAweDJhMDQsCisJCTB4Y2MzNiwgMHgzYzc0LAorCQkweGNjMzcsIDB4NjQzNSwKKwkJMHhjYzM4LCAweDJmYTQsCisJCTB4Y2MzOSwgMHgzY2Q0LAorCQkweGNjM2EsIDB4NjYyNCwKKwkJMHhjYzNiLCAweDU1NjMsCisJCTB4Y2MzYywgMHgyZDQyLAorCQkweGNjM2QsIDB4MzAwMiwKKwkJMHhjYzNlLCAweDEzZDIsCisJCTB4Y2MzZiwgMHg0NjRkLAorCQkweGNjNDAsIDB4Mjg2MiwKKwkJMHhjYzQxLCAweDMwMTIsCisJCTB4Y2M0MiwgMHgxMDAyLAorCQkweGNjNDMsIDB4MjAzMiwKKwkJMHhjYzQ0LCAweDMwMTIsCisJCTB4Y2M0NSwgMHgxMDAyLAorCQkweGNjNDYsIDB4MmZiNCwKKwkJMHhjYzQ3LCAweDNjZDQsCisJCTB4Y2M0OCwgMHg2NjI0LAorCQkweGNjNDksIDB4NTU2MywKKwkJMHhjYzRhLCAweDJkNDIsCisJCTB4Y2M0YiwgMHgzMDAyLAorCQkweGNjNGMsIDB4MTNkMiwKKwkJMHhjYzRkLCAweDJlZDIsCisJCTB4Y2M0ZSwgMHgzMDAyLAorCQkweGNjNGYsIDB4MTAwMiwKKwkJMHhjYzUwLCAweDJmZDIsCisJCTB4Y2M1MSwgMHgzMDAyLAorCQkweGNjNTIsIDB4MTAwMiwKKwkJMHhjYzUzLCAweDAwNCwKKwkJMHhjYzU0LCAweDI5NDIsCisJCTB4Y2M1NSwgMHgzMDAyLAorCQkweGNjNTYsIDB4MTAwMiwKKwkJMHhjYzU3LCAweDIwOTIsCisJCTB4Y2M1OCwgMHgzMDEyLAorCQkweGNjNTksIDB4MTAwMiwKKwkJMHhjYzVhLCAweDVjYzMsCisJCTB4Y2M1YiwgMHgzMTcsCisJCTB4Y2M1YywgMHgyZjcyLAorCQkweGNjNWQsIDB4MzAwMiwKKwkJMHhjYzVlLCAweDEwMDIsCisJCTB4Y2M1ZiwgMHgyOTQyLAorCQkweGNjNjAsIDB4MzAwMiwKKwkJMHhjYzYxLCAweDEwMDIsCisJCTB4Y2M2MiwgMHgyMmNkLAorCQkweGNjNjMsIDB4MzAxZCwKKwkJMHhjYzY0LCAweDI4NjIsCisJCTB4Y2M2NSwgMHgzMDEyLAorCQkweGNjNjYsIDB4MTAwMiwKKwkJMHhjYzY3LCAweDJlZDIsCisJCTB4Y2M2OCwgMHgzMDAyLAorCQkweGNjNjksIDB4MTAwMiwKKwkJMHhjYzZhLCAweDJkNzIsCisJCTB4Y2M2YiwgMHgzMDAyLAorCQkweGNjNmMsIDB4MTAwMiwKKwkJMHhjYzZkLCAweDYyOGYsCisJCTB4Y2M2ZSwgMHgyMTEyLAorCQkweGNjNmYsIDB4MzAxMiwKKwkJMHhjYzcwLCAweDEwMDIsCisJCTB4Y2M3MSwgMHg1YWEzLAorCQkweGNjNzIsIDB4MmRjMiwKKwkJMHhjYzczLCAweDMwMDIsCisJCTB4Y2M3NCwgMHgxMzEyLAorCQkweGNjNzUsIDB4NmY3MiwKKwkJMHhjYzc2LCAweDEwMDIsCisJCTB4Y2M3NywgMHgyODA3LAorCQkweGNjNzgsIDB4MzFhNywKKwkJMHhjYzc5LCAweDIwYzQsCisJCTB4Y2M3YSwgMHgzYzI0LAorCQkweGNjN2IsIDB4NjcyNCwKKwkJMHhjYzdjLCAweDEwMDIsCisJCTB4Y2M3ZCwgMHgyODA3LAorCQkweGNjN2UsIDB4MzE4NywKKwkJMHhjYzdmLCAweDIwYzQsCisJCTB4Y2M4MCwgMHgzYzI0LAorCQkweGNjODEsIDB4NjcyNCwKKwkJMHhjYzgyLCAweDEwMDIsCisJCTB4Y2M4MywgMHgyNTE0LAorCQkweGNjODQsIDB4M2M2NCwKKwkJMHhjYzg1LCAweDY0MzYsCisJCTB4Y2M4NiwgMHhkZmY0LAorCQkweGNjODcsIDB4NjQzNiwKKwkJMHhjYzg4LCAweDEwMDIsCisJCTB4Y2M4OSwgMHg0MGE0LAorCQkweGNjOGEsIDB4NjQzYywKKwkJMHhjYzhiLCAweDQwMTYsCisJCTB4Y2M4YywgMHg4YzZjLAorCQkweGNjOGQsIDB4MmIyNCwKKwkJMHhjYzhlLCAweDNjMjQsCisJCTB4Y2M4ZiwgMHg2NDM1LAorCQkweGNjOTAsIDB4MTAwMiwKKwkJMHhjYzkxLCAweDJiMjQsCisJCTB4Y2M5MiwgMHgzYzI0LAorCQkweGNjOTMsIDB4NjQzYSwKKwkJMHhjYzk0LCAweDQwMjUsCisJCTB4Y2M5NSwgMHg4YTVhLAorCQkweGNjOTYsIDB4MTAwMiwKKwkJMHhjYzk3LCAweDI3MzEsCisJCTB4Y2M5OCwgMHgzMDExLAorCQkweGNjOTksIDB4MTAwMSwKKwkJMHhjYzlhLCAweGM3YTAsCisJCTB4Y2M5YiwgMHgxMDAsCisJCTB4Y2M5YywgMHhjNTAyLAorCQkweGNjOWQsIDB4NTNhYywKKwkJMHhjYzllLCAweGM1MDMsCisJCTB4Y2M5ZiwgMHhkNWQ1LAorCQkweGNjYTAsIDB4YzYwMCwKKwkJMHhjY2ExLCAweDJhNmQsCisJCTB4Y2NhMiwgMHhjNjAxLAorCQkweGNjYTMsIDB4MmE0YywKKwkJMHhjY2E0LCAweGM2MDIsCisJCTB4Y2NhNSwgMHgxMTEsCisJCTB4Y2NhNiwgMHhjNjBjLAorCQkweGNjYTcsIDB4NTkwMCwKKwkJMHhjY2E4LCAweGM3MTAsCisJCTB4Y2NhOSwgMHg3MDAsCisJCTB4Y2NhYSwgMHhjNzE4LAorCQkweGNjYWIsIDB4NzAwLAorCQkweGNjYWMsIDB4YzcyMCwKKwkJMHhjY2FkLCAweDQ3MDAsCisJCTB4Y2NhZSwgMHhjODAxLAorCQkweGNjYWYsIDB4N2Y1MCwKKwkJMHhjY2IwLCAweGM4MDIsCisJCTB4Y2NiMSwgMHg3NzYwLAorCQkweGNjYjIsIDB4YzgwMywKKwkJMHhjY2IzLCAweDdmY2UsCisJCTB4Y2NiNCwgMHhjODA0LAorCQkweGNjYjUsIDB4NTcwMCwKKwkJMHhjY2I2LCAweGM4MDUsCisJCTB4Y2NiNywgMHg1ZjExLAorCQkweGNjYjgsIDB4YzgwNiwKKwkJMHhjY2I5LCAweDQ3NTEsCisJCTB4Y2NiYSwgMHhjODA3LAorCQkweGNjYmIsIDB4NTdlMSwKKwkJMHhjY2JjLCAweGM4MDgsCisJCTB4Y2NiZCwgMHgyNzAwLAorCQkweGNjYmUsIDB4YzgwOSwKKwkJMHhjY2JmLCAweDAwMCwKKwkJMHhjY2MwLCAweGM4MjEsCisJCTB4Y2NjMSwgMHgwMDIsCisJCTB4Y2NjMiwgMHhjODIyLAorCQkweGNjYzMsIDB4MDE0LAorCQkweGNjYzQsIDB4YzgzMiwKKwkJMHhjY2M1LCAweDExODYsCisJCTB4Y2NjNiwgMHhjODQ3LAorCQkweGNjYzcsIDB4MWUwMiwKKwkJMHhjY2M4LCAweGMwMTMsCisJCTB4Y2NjOSwgMHhmMzQxLAorCQkweGNjY2EsIDB4YzAxYSwKKwkJMHhjY2NiLCAweDQ0NiwKKwkJMHhjY2NjLCAweGMwMjQsCisJCTB4Y2NjZCwgMHgxMDAwLAorCQkweGNjY2UsIDB4YzAyNSwKKwkJMHhjY2NmLCAweGEwMCwKKwkJMHhjY2QwLCAweGMwMjYsCisJCTB4Y2NkMSwgMHhjMGMsCisJCTB4Y2NkMiwgMHhjMDI3LAorCQkweGNjZDMsIDB4YzBjLAorCQkweGNjZDQsIDB4YzAyOSwKKwkJMHhjY2Q1LCAweDBhMCwKKwkJMHhjY2Q2LCAweGMwMzAsCisJCTB4Y2NkNywgMHhhMDAsCisJCTB4Y2NkOCwgMHhjMDNjLAorCQkweGNjZDksIDB4MDFjLAorCQkweGNjZGEsIDB4YzAwNSwKKwkJMHhjY2RiLCAweDdhMDYsCisJCTB4Y2NkYywgMHgwMDAsCisJCTB4Y2NkZCwgMHgyNzMxLAorCQkweGNjZGUsIDB4MzAxMSwKKwkJMHhjY2RmLCAweDEwMDEsCisJCTB4Y2NlMCwgMHhjNjIwLAorCQkweGNjZTEsIDB4MDAwLAorCQkweGNjZTIsIDB4YzYyMSwKKwkJMHhjY2UzLCAweDAzZiwKKwkJMHhjY2U0LCAweGM2MjIsCisJCTB4Y2NlNSwgMHgwMDAsCisJCTB4Y2NlNiwgMHhjNjIzLAorCQkweGNjZTcsIDB4MDAwLAorCQkweGNjZTgsIDB4YzYyNCwKKwkJMHhjY2U5LCAweDAwMCwKKwkJMHhjY2VhLCAweGM2MjUsCisJCTB4Y2NlYiwgMHgwMDAsCisJCTB4Y2NlYywgMHhjNjI3LAorCQkweGNjZWQsIDB4MDAwLAorCQkweGNjZWUsIDB4YzYyOCwKKwkJMHhjY2VmLCAweDAwMCwKKwkJMHhjY2YwLCAweGM2MmMsCisJCTB4Y2NmMSwgMHgwMDAsCisJCTB4Y2NmMiwgMHgwMDAsCisJCTB4Y2NmMywgMHgyODA2LAorCQkweGNjZjQsIDB4M2NiNiwKKwkJMHhjY2Y1LCAweGMxNjEsCisJCTB4Y2NmNiwgMHg2MTM0LAorCQkweGNjZjcsIDB4NjEzNSwKKwkJMHhjY2Y4LCAweDU0NDMsCisJCTB4Y2NmOSwgMHgzMDMsCisJCTB4Y2NmYSwgMHg2NTI0LAorCQkweGNjZmIsIDB4MDBiLAorCQkweGNjZmMsIDB4MTAwMiwKKwkJMHhjY2ZkLCAweDIxMDQsCisJCTB4Y2NmZSwgMHgzYzI0LAorCQkweGNjZmYsIDB4MjEwNSwKKwkJMHhjZDAwLCAweDM4MDUsCisJCTB4Y2QwMSwgMHg2NTI0LAorCQkweGNkMDIsIDB4ZGZmNCwKKwkJMHhjZDAzLCAweDQwMDUsCisJCTB4Y2QwNCwgMHg2NTI0LAorCQkweGNkMDUsIDB4MTAwMiwKKwkJMHhjZDA2LCAweDVkZDMsCisJCTB4Y2QwNywgMHgzMDYsCisJCTB4Y2QwOCwgMHgyZmY3LAorCQkweGNkMDksIDB4MzhmNywKKwkJMHhjZDBhLCAweDYwYjcsCisJCTB4Y2QwYiwgMHhkZmZkLAorCQkweGNkMGMsIDB4MDBhLAorCQkweGNkMGQsIDB4MTAwMiwKKwkJMHhjZDBlLCAwCisJfTsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gc2V0X3BoeV9yZWdzKHBoeSwgcmVncyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1zbGVlcCg1MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcl9lZGMpICYmICFlcnI7IGkgKz0gMikKKwkJZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIHNyX2VkY1tpXSwKKwkJCQkgc3JfZWRjW2kgKyAxXSk7CisJaWYgKCFlcnIpCisJCXBoeS0+cHJpdiA9IGVkY19zcjsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFlbDIwMDVfc2V0dXBfdHdpbmF4X2VkYyhzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgbW9kdHlwZSkKK3sKKwlzdGF0aWMgc3RydWN0IHJlZ192YWwgcmVnc1tdID0geworCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzA0YSwgMHhmZmZmLCAweDVhMDAgfSwKKwkJeyAwLCAwLCAwLCAwIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgcmVnX3ZhbCBwcmVlbXBoYXNpc1tdID0geworCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzAxNCwgMHhmZmZmLCAweGZlMTYgfSwKKwkJeyBNRElPX0RFVl9QTUFfUE1ELCAweGMwMTUsIDB4ZmZmZiwgMHhhMDAwIH0sCisJCXsgMCwgMCwgMCwgMCB9CisJfTsKKwlzdGF0aWMgdTE2IHR3aW5heF9lZGNbXSA9IHsKKwkJMHhjYzAwLCAweDQwMDksCisJCTB4Y2MwMSwgMHgyN2ZmLAorCQkweGNjMDIsIDB4MzAwZiwKKwkJMHhjYzAzLCAweDQwYWEsCisJCTB4Y2MwNCwgMHg0MDFjLAorCQkweGNjMDUsIDB4NDAxZSwKKwkJMHhjYzA2LCAweDJmZjQsCisJCTB4Y2MwNywgMHgzY2Q0LAorCQkweGNjMDgsIDB4MjAzNSwKKwkJMHhjYzA5LCAweDMxNDUsCisJCTB4Y2MwYSwgMHg2NTI0LAorCQkweGNjMGIsIDB4MjZhMiwKKwkJMHhjYzBjLCAweDMwMTIsCisJCTB4Y2MwZCwgMHgxMDAyLAorCQkweGNjMGUsIDB4MjljMiwKKwkJMHhjYzBmLCAweDMwMDIsCisJCTB4Y2MxMCwgMHgxMDAyLAorCQkweGNjMTEsIDB4MjA3MiwKKwkJMHhjYzEyLCAweDMwMTIsCisJCTB4Y2MxMywgMHgxMDAyLAorCQkweGNjMTQsIDB4MjJjZCwKKwkJMHhjYzE1LCAweDMwMWQsCisJCTB4Y2MxNiwgMHgyZTUyLAorCQkweGNjMTcsIDB4MzAxMiwKKwkJMHhjYzE4LCAweDEwMDIsCisJCTB4Y2MxOSwgMHgyOGUyLAorCQkweGNjMWEsIDB4MzAwMiwKKwkJMHhjYzFiLCAweDEwMDIsCisJCTB4Y2MxYywgMHg2MjhmLAorCQkweGNjMWQsIDB4MmFjMiwKKwkJMHhjYzFlLCAweDMwMTIsCisJCTB4Y2MxZiwgMHgxMDAyLAorCQkweGNjMjAsIDB4NTU1MywKKwkJMHhjYzIxLCAweDJhZTIsCisJCTB4Y2MyMiwgMHgzMDAyLAorCQkweGNjMjMsIDB4MTMwMiwKKwkJMHhjYzI0LCAweDQwMWUsCisJCTB4Y2MyNSwgMHgyYmUyLAorCQkweGNjMjYsIDB4MzAxMiwKKwkJMHhjYzI3LCAweDEwMDIsCisJCTB4Y2MyOCwgMHgyZGEyLAorCQkweGNjMjksIDB4MzAxMiwKKwkJMHhjYzJhLCAweDEwMDIsCisJCTB4Y2MyYiwgMHgyYmEyLAorCQkweGNjMmMsIDB4MzAwMiwKKwkJMHhjYzJkLCAweDEwMDIsCisJCTB4Y2MyZSwgMHg1ZWUzLAorCQkweGNjMmYsIDB4MzA1LAorCQkweGNjMzAsIDB4NDAwZSwKKwkJMHhjYzMxLCAweDJiYzIsCisJCTB4Y2MzMiwgMHgzMDAyLAorCQkweGNjMzMsIDB4MTAwMiwKKwkJMHhjYzM0LCAweDJiODIsCisJCTB4Y2MzNSwgMHgzMDEyLAorCQkweGNjMzYsIDB4MTAwMiwKKwkJMHhjYzM3LCAweDU2NjMsCisJCTB4Y2MzOCwgMHgzMDIsCisJCTB4Y2MzOSwgMHg0MDFlLAorCQkweGNjM2EsIDB4NmY3MiwKKwkJMHhjYzNiLCAweDEwMDIsCisJCTB4Y2MzYywgMHg2MjhmLAorCQkweGNjM2QsIDB4MmJlMiwKKwkJMHhjYzNlLCAweDMwMTIsCisJCTB4Y2MzZiwgMHgxMDAyLAorCQkweGNjNDAsIDB4MjJjZCwKKwkJMHhjYzQxLCAweDMwMWQsCisJCTB4Y2M0MiwgMHgyZTUyLAorCQkweGNjNDMsIDB4MzAxMiwKKwkJMHhjYzQ0LCAweDEwMDIsCisJCTB4Y2M0NSwgMHgyNTIyLAorCQkweGNjNDYsIDB4MzAxMiwKKwkJMHhjYzQ3LCAweDEwMDIsCisJCTB4Y2M0OCwgMHgyZGEyLAorCQkweGNjNDksIDB4MzAxMiwKKwkJMHhjYzRhLCAweDEwMDIsCisJCTB4Y2M0YiwgMHgyY2EyLAorCQkweGNjNGMsIDB4MzAxMiwKKwkJMHhjYzRkLCAweDEwMDIsCisJCTB4Y2M0ZSwgMHgyZmE0LAorCQkweGNjNGYsIDB4M2NkNCwKKwkJMHhjYzUwLCAweDY2MjQsCisJCTB4Y2M1MSwgMHg0MTBiLAorCQkweGNjNTIsIDB4NTZiMywKKwkJMHhjYzUzLCAweDNjNCwKKwkJMHhjYzU0LCAweDJmYjIsCisJCTB4Y2M1NSwgMHgzMDAyLAorCQkweGNjNTYsIDB4MTAwMiwKKwkJMHhjYzU3LCAweDIyMGIsCisJCTB4Y2M1OCwgMHgzMDNiLAorCQkweGNjNTksIDB4NTZiMywKKwkJMHhjYzVhLCAweDNjMywKKwkJMHhjYzViLCAweDg2NmIsCisJCTB4Y2M1YywgMHg0MDBjLAorCQkweGNjNWQsIDB4MjNhMiwKKwkJMHhjYzVlLCAweDMwMTIsCisJCTB4Y2M1ZiwgMHgxMDAyLAorCQkweGNjNjAsIDB4MmRhMiwKKwkJMHhjYzYxLCAweDMwMTIsCisJCTB4Y2M2MiwgMHgxMDAyLAorCQkweGNjNjMsIDB4MmNhMiwKKwkJMHhjYzY0LCAweDMwMTIsCisJCTB4Y2M2NSwgMHgxMDAyLAorCQkweGNjNjYsIDB4MmZiNCwKKwkJMHhjYzY3LCAweDNjZDQsCisJCTB4Y2M2OCwgMHg2NjI0LAorCQkweGNjNjksIDB4NTZiMywKKwkJMHhjYzZhLCAweDNjMywKKwkJMHhjYzZiLCAweDg2NmIsCisJCTB4Y2M2YywgMHg0MDFjLAorCQkweGNjNmQsIDB4MjIwNSwKKwkJMHhjYzZlLCAweDMwMzUsCisJCTB4Y2M2ZiwgMHg1YjUzLAorCQkweGNjNzAsIDB4MmM1MiwKKwkJMHhjYzcxLCAweDMwMDIsCisJCTB4Y2M3MiwgMHgxM2MyLAorCQkweGNjNzMsIDB4NWNjMywKKwkJMHhjYzc0LCAweDMxNywKKwkJMHhjYzc1LCAweDI1MjIsCisJCTB4Y2M3NiwgMHgzMDEyLAorCQkweGNjNzcsIDB4MTAwMiwKKwkJMHhjYzc4LCAweDJkYTIsCisJCTB4Y2M3OSwgMHgzMDEyLAorCQkweGNjN2EsIDB4MTAwMiwKKwkJMHhjYzdiLCAweDJiODIsCisJCTB4Y2M3YywgMHgzMDEyLAorCQkweGNjN2QsIDB4MTAwMiwKKwkJMHhjYzdlLCAweDU2NjMsCisJCTB4Y2M3ZiwgMHgzMDMsCisJCTB4Y2M4MCwgMHg0MDFlLAorCQkweGNjODEsIDB4MDA0LAorCQkweGNjODIsIDB4MmM0MiwKKwkJMHhjYzgzLCAweDMwMTIsCisJCTB4Y2M4NCwgMHgxMDAyLAorCQkweGNjODUsIDB4NmY3MiwKKwkJMHhjYzg2LCAweDEwMDIsCisJCTB4Y2M4NywgMHg2MjhmLAorCQkweGNjODgsIDB4MjMwNCwKKwkJMHhjYzg5LCAweDNjODQsCisJCTB4Y2M4YSwgMHg2NDM2LAorCQkweGNjOGIsIDB4ZGZmNCwKKwkJMHhjYzhjLCAweDY0MzYsCisJCTB4Y2M4ZCwgMHgyZmY1LAorCQkweGNjOGUsIDB4MzAwNSwKKwkJMHhjYzhmLCAweDg2NTYsCisJCTB4Y2M5MCwgMHhkZmJhLAorCQkweGNjOTEsIDB4NTZhMywKKwkJMHhjYzkyLCAweGQwNWEsCisJCTB4Y2M5MywgMHgyMWMyLAorCQkweGNjOTQsIDB4MzAxMiwKKwkJMHhjYzk1LCAweDEzOTIsCisJCTB4Y2M5NiwgMHhkMDVhLAorCQkweGNjOTcsIDB4NTZhMywKKwkJMHhjYzk4LCAweGRmYmEsCisJCTB4Y2M5OSwgMHgzODMsCisJCTB4Y2M5YSwgMHg2ZjcyLAorCQkweGNjOWIsIDB4MTAwMiwKKwkJMHhjYzljLCAweDI4YzUsCisJCTB4Y2M5ZCwgMHgzMDA1LAorCQkweGNjOWUsIDB4NDE3OCwKKwkJMHhjYzlmLCAweDU2NTMsCisJCTB4Y2NhMCwgMHgzODQsCisJCTB4Y2NhMSwgMHgyMmIyLAorCQkweGNjYTIsIDB4MzAxMiwKKwkJMHhjY2EzLCAweDEwMDIsCisJCTB4Y2NhNCwgMHgyYmU1LAorCQkweGNjYTUsIDB4MzAwNSwKKwkJMHhjY2E2LCAweDQxZTgsCisJCTB4Y2NhNywgMHg1NjUzLAorCQkweGNjYTgsIDB4MzgyLAorCQkweGNjYTksIDB4MDAyLAorCQkweGNjYWEsIDB4NDI1OCwKKwkJMHhjY2FiLCAweDI0NzQsCisJCTB4Y2NhYywgMHgzYzg0LAorCQkweGNjYWQsIDB4NjQzNywKKwkJMHhjY2FlLCAweGRmZjQsCisJCTB4Y2NhZiwgMHg2NDM3LAorCQkweGNjYjAsIDB4MmZmNSwKKwkJMHhjY2IxLCAweDNjMDUsCisJCTB4Y2NiMiwgMHg4NzU3LAorCQkweGNjYjMsIDB4Yjg4OCwKKwkJMHhjY2I0LCAweDk3ODcsCisJCTB4Y2NiNSwgMHhkZmY0LAorCQkweGNjYjYsIDB4NjcyNCwKKwkJMHhjY2I3LCAweDg2NmEsCisJCTB4Y2NiOCwgMHg2ZjcyLAorCQkweGNjYjksIDB4MTAwMiwKKwkJMHhjY2JhLCAweDJkMDEsCisJCTB4Y2NiYiwgMHgzMDExLAorCQkweGNjYmMsIDB4MTAwMSwKKwkJMHhjY2JkLCAweGM2MjAsCisJCTB4Y2NiZSwgMHgxNGU1LAorCQkweGNjYmYsIDB4YzYyMSwKKwkJMHhjY2MwLCAweGM1M2QsCisJCTB4Y2NjMSwgMHhjNjIyLAorCQkweGNjYzIsIDB4M2NiZSwKKwkJMHhjY2MzLCAweGM2MjMsCisJCTB4Y2NjNCwgMHg0NDUyLAorCQkweGNjYzUsIDB4YzYyNCwKKwkJMHhjY2M2LCAweGM1YzUsCisJCTB4Y2NjNywgMHhjNjI1LAorCQkweGNjYzgsIDB4ZTAxZSwKKwkJMHhjY2M5LCAweGM2MjcsCisJCTB4Y2NjYSwgMHgwMDAsCisJCTB4Y2NjYiwgMHhjNjI4LAorCQkweGNjY2MsIDB4MDAwLAorCQkweGNjY2QsIDB4YzYyYiwKKwkJMHhjY2NlLCAweDAwMCwKKwkJMHhjY2NmLCAweGM2MmMsCisJCTB4Y2NkMCwgMHgwMDAsCisJCTB4Y2NkMSwgMHgwMDAsCisJCTB4Y2NkMiwgMHgyZDAxLAorCQkweGNjZDMsIDB4MzAxMSwKKwkJMHhjY2Q0LCAweDEwMDEsCisJCTB4Y2NkNSwgMHhjNjIwLAorCQkweGNjZDYsIDB4MDAwLAorCQkweGNjZDcsIDB4YzYyMSwKKwkJMHhjY2Q4LCAweDAwMCwKKwkJMHhjY2Q5LCAweGM2MjIsCisJCTB4Y2NkYSwgMHgwY2UsCisJCTB4Y2NkYiwgMHhjNjIzLAorCQkweGNjZGMsIDB4MDdmLAorCQkweGNjZGQsIDB4YzYyNCwKKwkJMHhjY2RlLCAweDAzMiwKKwkJMHhjY2RmLCAweGM2MjUsCisJCTB4Y2NlMCwgMHgwMDAsCisJCTB4Y2NlMSwgMHhjNjI3LAorCQkweGNjZTIsIDB4MDAwLAorCQkweGNjZTMsIDB4YzYyOCwKKwkJMHhjY2U0LCAweDAwMCwKKwkJMHhjY2U1LCAweGM2MmIsCisJCTB4Y2NlNiwgMHgwMDAsCisJCTB4Y2NlNywgMHhjNjJjLAorCQkweGNjZTgsIDB4MDAwLAorCQkweGNjZTksIDB4MDAwLAorCQkweGNjZWEsIDB4MmQwMSwKKwkJMHhjY2ViLCAweDMwMTEsCisJCTB4Y2NlYywgMHgxMDAxLAorCQkweGNjZWQsIDB4YzUwMiwKKwkJMHhjY2VlLCAweDYwOWYsCisJCTB4Y2NlZiwgMHhjNjAwLAorCQkweGNjZjAsIDB4MmE2ZSwKKwkJMHhjY2YxLCAweGM2MDEsCisJCTB4Y2NmMiwgMHgyYTJjLAorCQkweGNjZjMsIDB4YzYwYywKKwkJMHhjY2Y0LCAweDU0MDAsCisJCTB4Y2NmNSwgMHhjNzEwLAorCQkweGNjZjYsIDB4NzAwLAorCQkweGNjZjcsIDB4YzcxOCwKKwkJMHhjY2Y4LCAweDcwMCwKKwkJMHhjY2Y5LCAweGM3MjAsCisJCTB4Y2NmYSwgMHg0NzAwLAorCQkweGNjZmIsIDB4YzcyOCwKKwkJMHhjY2ZjLCAweDcwMCwKKwkJMHhjY2ZkLCAweGM3MjksCisJCTB4Y2NmZSwgMHgxMjA3LAorCQkweGNjZmYsIDB4YzgwMSwKKwkJMHhjZDAwLCAweDdmNTAsCisJCTB4Y2QwMSwgMHhjODAyLAorCQkweGNkMDIsIDB4Nzc2MCwKKwkJMHhjZDAzLCAweGM4MDMsCisJCTB4Y2QwNCwgMHg3ZmNlLAorCQkweGNkMDUsIDB4YzgwNCwKKwkJMHhjZDA2LCAweDUyMGUsCisJCTB4Y2QwNywgMHhjODA1LAorCQkweGNkMDgsIDB4NWMxMSwKKwkJMHhjZDA5LCAweGM4MDYsCisJCTB4Y2QwYSwgMHgzYzUxLAorCQkweGNkMGIsIDB4YzgwNywKKwkJMHhjZDBjLCAweDQwNjEsCisJCTB4Y2QwZCwgMHhjODA4LAorCQkweGNkMGUsIDB4NDljMSwKKwkJMHhjZDBmLCAweGM4MDksCisJCTB4Y2QxMCwgMHgzODQwLAorCQkweGNkMTEsIDB4YzgwYSwKKwkJMHhjZDEyLCAweDAwMCwKKwkJMHhjZDEzLCAweGM4MjEsCisJCTB4Y2QxNCwgMHgwMDIsCisJCTB4Y2QxNSwgMHhjODIyLAorCQkweGNkMTYsIDB4MDQ2LAorCQkweGNkMTcsIDB4Yzg0NCwKKwkJMHhjZDE4LCAweDE4MmYsCisJCTB4Y2QxOSwgMHhjMDEzLAorCQkweGNkMWEsIDB4ZjM0MSwKKwkJMHhjZDFiLCAweGMwMWEsCisJCTB4Y2QxYywgMHg0NDYsCisJCTB4Y2QxZCwgMHhjMDI0LAorCQkweGNkMWUsIDB4MTAwMCwKKwkJMHhjZDFmLCAweGMwMjUsCisJCTB4Y2QyMCwgMHhhMDAsCisJCTB4Y2QyMSwgMHhjMDI2LAorCQkweGNkMjIsIDB4YzBjLAorCQkweGNkMjMsIDB4YzAyNywKKwkJMHhjZDI0LCAweGMwYywKKwkJMHhjZDI1LCAweGMwMjksCisJCTB4Y2QyNiwgMHgwYTAsCisJCTB4Y2QyNywgMHhjMDMwLAorCQkweGNkMjgsIDB4YTAwLAorCQkweGNkMjksIDB4YzAzYywKKwkJMHhjZDJhLCAweDAxYywKKwkJMHhjZDJiLCAweDAwMCwKKwkJMHhjZDJjLCAweDJiODQsCisJCTB4Y2QyZCwgMHgzYzc0LAorCQkweGNkMmUsIDB4NjQzNSwKKwkJMHhjZDJmLCAweGRmZjQsCisJCTB4Y2QzMCwgMHg2NDM1LAorCQkweGNkMzEsIDB4MjgwNiwKKwkJMHhjZDMyLCAweDMwMDYsCisJCTB4Y2QzMywgMHg4NTY1LAorCQkweGNkMzQsIDB4MmIyNCwKKwkJMHhjZDM1LCAweDNjMjQsCisJCTB4Y2QzNiwgMHg2NDM2LAorCQkweGNkMzcsIDB4MTAwMiwKKwkJMHhjZDM4LCAweDJiMjQsCisJCTB4Y2QzOSwgMHgzYzI0LAorCQkweGNkM2EsIDB4NjQzNiwKKwkJMHhjZDNiLCAweDQwNDUsCisJCTB4Y2QzYywgMHg4NjU2LAorCQkweGNkM2QsIDB4MTAwMiwKKwkJMHhjZDNlLCAweDI4MDcsCisJCTB4Y2QzZiwgMHgzMWE3LAorCQkweGNkNDAsIDB4MjBjNCwKKwkJMHhjZDQxLCAweDNjMjQsCisJCTB4Y2Q0MiwgMHg2NzI0LAorCQkweGNkNDMsIDB4MTAwMiwKKwkJMHhjZDQ0LCAweDI4MDcsCisJCTB4Y2Q0NSwgMHgzMTg3LAorCQkweGNkNDYsIDB4MjBjNCwKKwkJMHhjZDQ3LCAweDNjMjQsCisJCTB4Y2Q0OCwgMHg2NzI0LAorCQkweGNkNDksIDB4MTAwMiwKKwkJMHhjZDRhLCAweDI1MTQsCisJCTB4Y2Q0YiwgMHgzYzY0LAorCQkweGNkNGMsIDB4NjQzNiwKKwkJMHhjZDRkLCAweGRmZjQsCisJCTB4Y2Q0ZSwgMHg2NDM2LAorCQkweGNkNGYsIDB4MTAwMiwKKwkJMHhjZDUwLCAweDI4MDYsCisJCTB4Y2Q1MSwgMHgzY2I2LAorCQkweGNkNTIsIDB4YzE2MSwKKwkJMHhjZDUzLCAweDYxMzQsCisJCTB4Y2Q1NCwgMHg2MTM1LAorCQkweGNkNTUsIDB4NTQ0MywKKwkJMHhjZDU2LCAweDMwMywKKwkJMHhjZDU3LCAweDY1MjQsCisJCTB4Y2Q1OCwgMHgwMGIsCisJCTB4Y2Q1OSwgMHgxMDAyLAorCQkweGNkNWEsIDB4ZDAxOSwKKwkJMHhjZDViLCAweDIxMDQsCisJCTB4Y2Q1YywgMHgzYzI0LAorCQkweGNkNWQsIDB4MjEwNSwKKwkJMHhjZDVlLCAweDM4MDUsCisJCTB4Y2Q1ZiwgMHg2NTI0LAorCQkweGNkNjAsIDB4ZGZmNCwKKwkJMHhjZDYxLCAweDQwMDUsCisJCTB4Y2Q2MiwgMHg2NTI0LAorCQkweGNkNjMsIDB4MmU4ZCwKKwkJMHhjZDY0LCAweDMwM2QsCisJCTB4Y2Q2NSwgMHg1ZGQzLAorCQkweGNkNjYsIDB4MzA2LAorCQkweGNkNjcsIDB4MmZmNywKKwkJMHhjZDY4LCAweDM4ZjcsCisJCTB4Y2Q2OSwgMHg2MGI3LAorCQkweGNkNmEsIDB4ZGZmZCwKKwkJMHhjZDZiLCAweDAwYSwKKwkJMHhjZDZjLCAweDEwMDIsCisJCTB4Y2Q2ZCwgMAorCX07CisJaW50IGksIGVycjsKKworCWVyciA9IHNldF9waHlfcmVncyhwaHksIHJlZ3MpOworCWlmICghZXJyICYmIG1vZHR5cGUgPT0gcGh5X21vZHR5cGVfdHdpbmF4X2xvbmcpCisJCWVyciA9IHNldF9waHlfcmVncyhwaHksIHByZWVtcGhhc2lzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXNsZWVwKDUwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR3aW5heF9lZGMpICYmICFlcnI7IGkgKz0gMikKKwkJZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIHR3aW5heF9lZGNbaV0sCisJCQkJIHR3aW5heF9lZGNbaSArIDFdKTsKKwlpZiAoIWVycikKKwkJcGh5LT5wcml2ID0gZWRjX3R3aW5heDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFlbDIwMDVfaTJjX3JkKHN0cnVjdCBjcGh5ICpwaHksIGludCBkZXZfYWRkciwgaW50IHdvcmRfYWRkcikKK3sKKwlpbnQgaSwgZXJyOworCXVuc2lnbmVkIGludCBzdGF0LCBkYXRhOworCisJZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTF9JMkNfQ1RSTCwKKwkJCSAoZGV2X2FkZHIgPDwgOCkgfCAoMSA8PCA4KSB8IHdvcmRfYWRkcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJbXNsZWVwKDEpOworCQllcnIgPSBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBBRUxfSTJDX1NUQVQsICZzdGF0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmICgoc3RhdCAmIDMpID09IDEpIHsKKwkJCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTF9JMkNfREFUQSwKKwkJCQkJJmRhdGEpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJcmV0dXJuIGRhdGEgPj4gODsKKwkJfQorCX0KKwlDSF9XQVJOKHBoeS0+YWRhcHRlciwgIlBIWSAldSBJMkMgcmVhZCBvZiBhZGRyICV1IHRpbWVkIG91dFxuIiwKKwkJcGh5LT5hZGRyLCB3b3JkX2FkZHIpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGdldF9tb2R1bGVfdHlwZShzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgZGVsYXlfbXMpCit7CisJaW50IHY7CisJdW5zaWduZWQgaW50IHN0YXQ7CisKKwl2ID0gbWRpb19yZWFkKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMjAwNV9HUElPX0NUUkwsICZzdGF0KTsKKwlpZiAodikKKwkJcmV0dXJuIHY7CisKKwlpZiAoc3RhdCAmICgxIDw8IDgpKQkJCS8qIG1vZHVsZSBhYnNlbnQgKi8KKwkJcmV0dXJuIHBoeV9tb2R0eXBlX25vbmU7CisKKwlpZiAoZGVsYXlfbXMpCisJCW1zbGVlcChkZWxheV9tcyk7CisKKwkvKiBzZWUgU0ZGLTg0NzIgZm9yIGJlbG93ICovCisJdiA9IGFlbDIwMDVfaTJjX3JkKHBoeSwgTU9EVUxFX0RFVl9BRERSLCAzKTsKKwlpZiAodiA8IDApCisJCXJldHVybiB2OworCisJaWYgKHYgPT0gMHgxMCkKKwkJcmV0dXJuIHBoeV9tb2R0eXBlX3NyOworCWlmICh2ID09IDB4MjApCisJCXJldHVybiBwaHlfbW9kdHlwZV9scjsKKwlpZiAodiA9PSAweDQwKQorCQlyZXR1cm4gcGh5X21vZHR5cGVfbHJtOworCisJdiA9IGFlbDIwMDVfaTJjX3JkKHBoeSwgTU9EVUxFX0RFVl9BRERSLCA2KTsKKwlpZiAodiA8IDApCisJCXJldHVybiB2OworCWlmICh2ICE9IDQpCisJCWdvdG8gdW5rbm93bjsKKworCXYgPSBhZWwyMDA1X2kyY19yZChwaHksIE1PRFVMRV9ERVZfQUREUiwgMTApOworCWlmICh2IDwgMCkKKwkJcmV0dXJuIHY7CisKKwlpZiAodiAmIDB4ODApIHsKKwkJdiA9IGFlbDIwMDVfaTJjX3JkKHBoeSwgTU9EVUxFX0RFVl9BRERSLCAweDEyKTsKKwkJaWYgKHYgPCAwKQorCQkJcmV0dXJuIHY7CisJCXJldHVybiB2ID4gMTAgPyBwaHlfbW9kdHlwZV90d2luYXhfbG9uZyA6IHBoeV9tb2R0eXBlX3R3aW5heDsKKwl9Cit1bmtub3duOgorCXJldHVybiBwaHlfbW9kdHlwZV91bmtub3duOworfQorCitzdGF0aWMgaW50IGFlbDIwMDVfaW50cl9lbmFibGUoc3RydWN0IGNwaHkgKnBoeSkKK3sKKwlpbnQgZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTDIwMDVfR1BJT19DVFJMLCAweDIwMCk7CisJcmV0dXJuIGVyciA/IGVyciA6IHQzX3BoeV9sYXNpX2ludHJfZW5hYmxlKHBoeSk7Cit9CisKK3N0YXRpYyBpbnQgYWVsMjAwNV9pbnRyX2Rpc2FibGUoc3RydWN0IGNwaHkgKnBoeSkKK3sKKwlpbnQgZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTDIwMDVfR1BJT19DVFJMLCAweDEwMCk7CisJcmV0dXJuIGVyciA/IGVyciA6IHQzX3BoeV9sYXNpX2ludHJfZGlzYWJsZShwaHkpOworfQorCitzdGF0aWMgaW50IGFlbDIwMDVfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqcGh5KQoreworCWludCBlcnIgPSBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMjAwNV9HUElPX0NUUkwsIDB4ZDAwKTsKKwlyZXR1cm4gZXJyID8gZXJyIDogdDNfcGh5X2xhc2lfaW50cl9jbGVhcihwaHkpOworfQorCitzdGF0aWMgaW50IGFlbDIwMDVfcmVzZXQoc3RydWN0IGNwaHkgKnBoeSwgaW50IHdhaXQpCit7CisJc3RhdGljIHN0cnVjdCByZWdfdmFsIHJlZ3MwW10gPSB7CisJCXsgTURJT19ERVZfUE1BX1BNRCwgMHhjMDAxLCAwLCAxIDw8IDUgfSwKKwkJeyBNRElPX0RFVl9QTUFfUE1ELCAweGMwMTcsIDAsIDEgPDwgNSB9LAorCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzAxMywgMHhmZmZmLCAweGYzNDEgfSwKKwkJeyBNRElPX0RFVl9QTUFfUE1ELCAweGMyMTAsIDB4ZmZmZiwgMHg4MDAwIH0sCisJCXsgTURJT19ERVZfUE1BX1BNRCwgMHhjMjEwLCAweGZmZmYsIDB4ODEwMCB9LAorCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4YzIxMCwgMHhmZmZmLCAweDgwMDAgfSwKKwkJeyBNRElPX0RFVl9QTUFfUE1ELCAweGMyMTAsIDB4ZmZmZiwgMCB9LAorCQl7IDAsIDAsIDAsIDAgfQorCX07CisJc3RhdGljIHN0cnVjdCByZWdfdmFsIHJlZ3MxW10gPSB7CisJCXsgTURJT19ERVZfUE1BX1BNRCwgMHhjYTAwLCAweGZmZmYsIDB4MDA4MCB9LAorCQl7IE1ESU9fREVWX1BNQV9QTUQsIDB4Y2ExMiwgMHhmZmZmLCAwIH0sCisJCXsgMCwgMCwgMCwgMCB9CisJfTsKKworCWludCBlcnIsIGxhc2lfY3RybDsKKworCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIExBU0lfQ1RSTCwgJmxhc2lfY3RybCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHQzX3BoeV9yZXNldChwaHksIE1ESU9fREVWX1BNQV9QTUQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltc2xlZXAoMTI1KTsKKwlwaHktPnByaXYgPSBlZGNfbm9uZTsKKwllcnIgPSBzZXRfcGh5X3JlZ3MocGh5LCByZWdzMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1zbGVlcCg1MCk7CisKKwllcnIgPSBnZXRfbW9kdWxlX3R5cGUocGh5LCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwaHktPm1vZHR5cGUgPSBlcnI7CisKKwlpZiAoZXJyID09IHBoeV9tb2R0eXBlX3R3aW5heCB8fCBlcnIgPT0gcGh5X21vZHR5cGVfdHdpbmF4X2xvbmcpCisJCWVyciA9IGFlbDIwMDVfc2V0dXBfdHdpbmF4X2VkYyhwaHksIGVycik7CisJZWxzZQorCQllcnIgPSBhZWwyMDA1X3NldHVwX3NyX2VkYyhwaHkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzZXRfcGh5X3JlZ3MocGh5LCByZWdzMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJlc2V0IHdpcGVzIG91dCBpbnRlcnJ1cHRzLCByZWVuYWJsZSB0aGVtIGlmIHRoZXkgd2VyZSBvbiAqLworCWlmIChsYXNpX2N0cmwgJiAxKQorCQllcnIgPSBhZWwyMDA1X2ludHJfZW5hYmxlKHBoeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZWwyMDA1X2ludHJfaGFuZGxlcihzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXVuc2lnbmVkIGludCBzdGF0OworCWludCByZXQsIGVkY19uZWVkZWQsIGNhdXNlID0gMDsKKworCXJldCA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTDIwMDVfR1BJT19TVEFULCAmc3RhdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdGF0ICYgQUVMMjAwNV9NT0RERVRfSVJRKSB7CisJCXJldCA9IG1kaW9fd3JpdGUocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBBRUwyMDA1X0dQSU9fQ1RSTCwKKwkJCQkgMHhkMDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBtb2R1bGVzIGhhdmUgbWF4IDMwMCBtcyBpbml0IHRpbWUgYWZ0ZXIgaG90IHBsdWcgKi8KKwkJcmV0ID0gZ2V0X21vZHVsZV90eXBlKHBoeSwgMzAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXBoeS0+bW9kdHlwZSA9IHJldDsKKwkJaWYgKHJldCA9PSBwaHlfbW9kdHlwZV9ub25lKQorCQkJZWRjX25lZWRlZCA9IHBoeS0+cHJpdjsgICAgICAgLyogb24gdW5wbHVnIHJldGFpbiBFREMgKi8KKwkJZWxzZSBpZiAocmV0ID09IHBoeV9tb2R0eXBlX3R3aW5heCB8fAorCQkJIHJldCA9PSBwaHlfbW9kdHlwZV90d2luYXhfbG9uZykKKwkJCWVkY19uZWVkZWQgPSBlZGNfdHdpbmF4OworCQllbHNlCisJCQllZGNfbmVlZGVkID0gZWRjX3NyOworCisJCWlmIChlZGNfbmVlZGVkICE9IHBoeS0+cHJpdikgeworCQkJcmV0ID0gYWVsMjAwNV9yZXNldChwaHksIDApOworCQkJcmV0dXJuIHJldCA/IHJldCA6IGNwaHlfY2F1c2VfbW9kdWxlX2NoYW5nZTsKKwkJfQorCQljYXVzZSA9IGNwaHlfY2F1c2VfbW9kdWxlX2NoYW5nZTsKKwl9CisKKwlyZXQgPSB0M19waHlfbGFzaV9pbnRyX2hhbmRsZXIocGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCB8PSBjYXVzZTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY3BoeV9jYXVzZV9saW5rX2NoYW5nZTsKK30KKworc3RhdGljIHN0cnVjdCBjcGh5X29wcyBhZWwyMDA1X29wcyA9IHsKKwkucmVzZXQgICAgICAgICAgID0gYWVsMjAwNV9yZXNldCwKKwkuaW50cl9lbmFibGUgICAgID0gYWVsMjAwNV9pbnRyX2VuYWJsZSwKKwkuaW50cl9kaXNhYmxlICAgID0gYWVsMjAwNV9pbnRyX2Rpc2FibGUsCisJLmludHJfY2xlYXIgICAgICA9IGFlbDIwMDVfaW50cl9jbGVhciwKKwkuaW50cl9oYW5kbGVyICAgID0gYWVsMjAwNV9pbnRyX2hhbmRsZXIsCisJLmdldF9saW5rX3N0YXR1cyA9IGdldF9saW5rX3N0YXR1c19yLAorCS5wb3dlcl9kb3duICAgICAgPSBhZWwxMDAyX3Bvd2VyX2Rvd24sCit9OworCitpbnQgdDNfYWVsMjAwNV9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCWludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJmFlbDIwMDVfb3BzLCBtZGlvX29wcywKKwkJICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0FVSSB8IFNVUFBPUlRFRF9GSUJSRSB8CisJCSAgU1VQUE9SVEVEX0lSUSwgIjEwR0JBU0UtUiIpOworCW1zbGVlcCgxMjUpOworCXJldHVybiB0M19tZGlvX2NoYW5nZV9iaXRzKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMX09QVF9TRVRUSU5HUywgMCwKKwkJCQkgICAxIDw8IDUpOworfQorCisvKgorICogR2V0IGxpbmsgc3RhdHVzIGZvciBhIDEwR0JBU0UtWCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xpbmtfc3RhdHVzX3goc3RydWN0IGNwaHkgKnBoeSwgaW50ICpsaW5rX29rLCBpbnQgKnNwZWVkLAorCQkJICAgICBpbnQgKmR1cGxleCwgaW50ICpmYykKK3sKKwlpZiAobGlua19vaykgeworCQl1bnNpZ25lZCBpbnQgc3RhdDAsIHN0YXQxLCBzdGF0MjsKKwkJaW50IGVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIFBNRF9SU0QsICZzdGF0MCk7CisKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QQ1MsIFBDU19TVEFUMV9YLCAmc3RhdDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1hHWFMsIFhTX0xOX1NUQVQsICZzdGF0Mik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkqbGlua19vayA9IChzdGF0MCAmIChzdGF0MSA+PiAxMikgJiAoc3RhdDIgPj4gMTIpKSAmIDE7CisJfQorCWlmIChzcGVlZCkKKwkJKnNwZWVkID0gU1BFRURfMTAwMDA7CisJaWYgKGR1cGxleCkKKwkJKmR1cGxleCA9IERVUExFWF9GVUxMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGNwaHlfb3BzIHF0MjA0NV9vcHMgPSB7CiAJLnJlc2V0ID0gYWVsMTAwNl9yZXNldCwKLQkuaW50cl9lbmFibGUgPSBhZWwxMDA2X2ludHJfZW5hYmxlLAotCS5pbnRyX2Rpc2FibGUgPSBhZWwxMDA2X2ludHJfZGlzYWJsZSwKLQkuaW50cl9jbGVhciA9IGFlbDEwMDZfaW50cl9jbGVhciwKLQkuaW50cl9oYW5kbGVyID0gYWVsMTAwNl9pbnRyX2hhbmRsZXIsCi0JLmdldF9saW5rX3N0YXR1cyA9IGFlbDEwMHhfZ2V0X2xpbmtfc3RhdHVzLAorCS5pbnRyX2VuYWJsZSA9IHQzX3BoeV9sYXNpX2ludHJfZW5hYmxlLAorCS5pbnRyX2Rpc2FibGUgPSB0M19waHlfbGFzaV9pbnRyX2Rpc2FibGUsCisJLmludHJfY2xlYXIgPSB0M19waHlfbGFzaV9pbnRyX2NsZWFyLAorCS5pbnRyX2hhbmRsZXIgPSB0M19waHlfbGFzaV9pbnRyX2hhbmRsZXIsCisJLmdldF9saW5rX3N0YXR1cyA9IGdldF9saW5rX3N0YXR1c194LAogCS5wb3dlcl9kb3duID0gYWVsMTAwNl9wb3dlcl9kb3duLAogfTsKIAotdm9pZCB0M19xdDIwNDVfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCitpbnQgdDNfcXQyMDQ1X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkgICAgICAgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQogewogCXVuc2lnbmVkIGludCBzdGF0OwogCi0JY3BoeV9pbml0KHBoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZxdDIwNDVfb3BzLCBtZGlvX29wcyk7CisJY3BoeV9pbml0KHBoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZxdDIwNDVfb3BzLCBtZGlvX29wcywKKwkJICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0FVSSB8IFNVUFBPUlRFRF9UUCwKKwkJICAiMTBHQkFTRS1DWDQiKTsKIAogCS8qCiAJICogU29tZSBjYXJkcyB3aGVyZSB0aGUgUEhZIGlzIHN1cHBvc2VkIHRvIGJlIGF0IGFkZHJlc3MgMCBhY3R1YWxseQpAQCAtMjA1LDYgKzExNjEsNyBAQAogCWlmICghcGh5X2FkZHIgJiYgIW1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIE1JSV9CTVNSLCAmc3RhdCkgJiYKIAkgICAgc3RhdCA9PSAweGZmZmYpCiAJCXBoeS0+YWRkciA9IDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgeGF1aV9kaXJlY3RfcmVzZXQoc3RydWN0IGNwaHkgKnBoeSwgaW50IHdhaXQpCkBAIC0yNTAsOCArMTIwNywxMSBAQAogCS5wb3dlcl9kb3duID0geGF1aV9kaXJlY3RfcG93ZXJfZG93biwKIH07CiAKLXZvaWQgdDNfeGF1aV9kaXJlY3RfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK2ludCB0M194YXVpX2RpcmVjdF9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICBpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCiB7Ci0JY3BoeV9pbml0KHBoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZ4YXVpX2RpcmVjdF9vcHMsIG1kaW9fb3BzKTsKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJnhhdWlfZGlyZWN0X29wcywgbWRpb19vcHMsCisJCSAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUkgfCBTVVBQT1JURURfVFAsCisJCSAgIjEwR0JBU0UtQ1g0Iik7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2NvbW1vbi5oCmluZGV4IDllY2Y4YTYuLmUzMTJkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2NvbW1vbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTkzLDIyICsxOTMsMTMgQEAKIHN0cnVjdCBhZGFwdGVyX2luZm8gewogCXVuc2lnbmVkIGNoYXIgbnBvcnRzOwkvKiAjIG9mIHBvcnRzICovCiAJdW5zaWduZWQgY2hhciBwaHlfYmFzZV9hZGRyOwkvKiBNRElPIFBIWSBiYXNlIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBjaGFyIG1kaWVuOwotCXVuc2lnbmVkIGNoYXIgbWRpaW52OwogCXVuc2lnbmVkIGludCBncGlvX291dDsJLyogR1BJTyBvdXRwdXQgc2V0dGluZ3MgKi8KLQl1bnNpZ25lZCBpbnQgZ3Bpb19pbnRyOwkvKiBHUElPIElSUSBlbmFibGUgbWFzayAqLworCXVuc2lnbmVkIGNoYXIgZ3Bpb19pbnRyW01BWF9OUE9SVFNdOyAvKiBHUElPIFBIWSBJUlEgcGlucyAqLwogCXVuc2lnbmVkIGxvbmcgY2FwczsJLyogYWRhcHRlciBjYXBhYmlsaXRpZXMgKi8KIAljb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzOwkvKiBNRElPIG9wZXJhdGlvbnMgKi8KIAljb25zdCBjaGFyICpkZXNjOwkvKiBwcm9kdWN0IGRlc2NyaXB0aW9uICovCiB9OwogCi1zdHJ1Y3QgcG9ydF90eXBlX2luZm8gewotCXZvaWQgKCpwaHlfcHJlcCkoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm9wcyk7Ci0JdW5zaWduZWQgaW50IGNhcHM7Ci0JY29uc3QgY2hhciAqZGVzYzsKLX07Ci0KIHN0cnVjdCBtYzVfc3RhdHMgewogCXVuc2lnbmVkIGxvbmcgcGFyaXR5X2VycjsKIAl1bnNpZ25lZCBsb25nIGFjdGl2ZV9yZ25fZnVsbDsKQEAgLTM1OCw2ICszNDksNyBAQAogCXVuc2lnbmVkIGludCBqdW1ib19zaXplOwkvKiAjIG9mIGVudHJpZXMgaW4ganVtYm8gZnJlZSBsaXN0ICovCiAJdW5zaWduZWQgaW50IHR4cV9zaXplW1NHRV9UWFFfUEVSX1NFVF07CS8qIFR4IHF1ZXVlIHNpemVzICovCiAJdW5zaWduZWQgaW50IGNvbmdfdGhyZXM7CS8qIEZMIGNvbmdlc3Rpb24gdGhyZXNob2xkICovCisJdW5zaWduZWQgaW50IHZlY3RvcjsJCS8qIEludGVycnVwdCAobGluZSBvciB2ZWN0b3IpIG51bWJlciAqLwogfTsKIAogc3RydWN0IHNnZV9wYXJhbXMgewpAQCAtNTI1LDEyICs1MTcsMjUgQEAKIAlNQUNfUlhGSUZPX1NJWkUgPSAzMjc2OAogfTsKIAotLyogSUVFRSA4MDIuM2FlIHNwZWNpZmllZCBNRElPIGRldmljZXMgKi8KKy8qIElFRUUgODAyLjMgc3BlY2lmaWVkIE1ESU8gZGV2aWNlcyAqLwogZW51bSB7CiAJTURJT19ERVZfUE1BX1BNRCA9IDEsCiAJTURJT19ERVZfV0lTID0gMiwKIAlNRElPX0RFVl9QQ1MgPSAzLAotCU1ESU9fREVWX1hHWFMgPSA0CisJTURJT19ERVZfWEdYUyA9IDQsCisJTURJT19ERVZfQU5FRyA9IDcsCisJTURJT19ERVZfVkVORDEgPSAzMCwKKwlNRElPX0RFVl9WRU5EMiA9IDMxCit9OworCisvKiBMQVNJIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KK2VudW0geworCVJYX0FMQVJNX0NUUkwgPSAweDkwMDAsCisJVFhfQUxBUk1fQ1RSTCA9IDB4OTAwMSwKKwlMQVNJX0NUUkwgPSAweDkwMDIsCisJUlhfQUxBUk1fU1RBVCA9IDB4OTAwMywKKwlUWF9BTEFSTV9TVEFUID0gMHg5MDA0LAorCUxBU0lfU1RBVCA9IDB4OTAwNQogfTsKIAogLyogUEhZIGxvb3BiYWNrIGRpcmVjdGlvbiAqLwpAQCAtNTQyLDEyICs1NDcsMjMgQEAKIC8qIFBIWSBpbnRlcnJ1cHQgdHlwZXMgKi8KIGVudW0gewogCWNwaHlfY2F1c2VfbGlua19jaGFuZ2UgPSAxLAotCWNwaHlfY2F1c2VfZmlmb19lcnJvciA9IDIKKwljcGh5X2NhdXNlX2ZpZm9fZXJyb3IgPSAyLAorCWNwaHlfY2F1c2VfbW9kdWxlX2NoYW5nZSA9IDQsCit9OworCisvKiBQSFkgbW9kdWxlIHR5cGVzICovCitlbnVtIHsKKwlwaHlfbW9kdHlwZV9ub25lLAorCXBoeV9tb2R0eXBlX3NyLAorCXBoeV9tb2R0eXBlX2xyLAorCXBoeV9tb2R0eXBlX2xybSwKKwlwaHlfbW9kdHlwZV90d2luYXgsCisJcGh5X21vZHR5cGVfdHdpbmF4X2xvbmcsCisJcGh5X21vZHR5cGVfdW5rbm93bgogfTsKIAogLyogUEhZIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBjcGh5X29wcyB7Ci0Jdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBjcGh5ICpwaHkpOwogCWludCAoKnJlc2V0KShzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgd2FpdCk7CiAKIAlpbnQgKCppbnRyX2VuYWJsZSkoc3RydWN0IGNwaHkgKnBoeSk7CkBAIC01NjgsOCArNTg0LDEyIEBACiAKIC8qIEEgUEhZIGluc3RhbmNlICovCiBzdHJ1Y3QgY3BoeSB7Ci0JaW50IGFkZHI7CQkvKiBQSFkgYWRkcmVzcyAqLworCXU4IGFkZHI7CQkJLyogUEhZIGFkZHJlc3MgKi8KKwl1OCBtb2R0eXBlOwkJCS8qIFBIWSBtb2R1bGUgdHlwZSAqLworCXNob3J0IHByaXY7CQkJLyogc2NyYXRjaCBwYWQgKi8KKwl1bnNpZ25lZCBpbnQgY2FwczsJCS8qIFBIWSBjYXBhYmlsaXRpZXMgKi8KIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsJLyogYXNzb2NpYXRlZCBhZGFwdGVyICovCisJY29uc3QgY2hhciAqZGVzYzsJCS8qIFBIWSBkZXNjcmlwdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgZmlmb19lcnJvcnM7CS8qIEZJRk8gb3Zlci91bmRlci1mbG93cyAqLwogCWNvbnN0IHN0cnVjdCBjcGh5X29wcyAqb3BzOwkvKiBQSFkgb3BlcmF0aW9ucyAqLwogCWludCAoKm1kaW9fcmVhZCkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLApAQCAtNTk0LDEwICs2MTQsMTMgQEAKIC8qIENvbnZlbmllbmNlIGluaXRpYWxpemVyICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY3BoeV9pbml0KHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJICAgICBpbnQgcGh5X2FkZHIsIHN0cnVjdCBjcGh5X29wcyAqcGh5X29wcywKLQkJCSAgICAgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKKwkJCSAgICAgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjYXBzLCBjb25zdCBjaGFyICpkZXNjKQogewotCXBoeS0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJcGh5LT5hZGRyID0gcGh5X2FkZHI7CisJcGh5LT5jYXBzID0gY2FwczsKKwlwaHktPmFkYXB0ZXIgPSBhZGFwdGVyOworCXBoeS0+ZGVzYyA9IGRlc2M7CiAJcGh5LT5vcHMgPSBwaHlfb3BzOwogCWlmIChtZGlvX29wcykgewogCQlwaHktPm1kaW9fcmVhZCA9IG1kaW9fb3BzLT5yZWFkOwpAQCAtNjY4LDcgKzY5MSwxMiBAQAogCQkJdW5zaWduZWQgaW50IHNldCk7CiBpbnQgdDNfcGh5X3Jlc2V0KHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCB3YWl0KTsKIGludCB0M19waHlfYWR2ZXJ0aXNlKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnQpOworaW50IHQzX3BoeV9hZHZlcnRpc2VfZmliZXIoc3RydWN0IGNwaHkgKnBoeSwgdW5zaWduZWQgaW50IGFkdmVydCk7CiBpbnQgdDNfc2V0X3BoeV9zcGVlZF9kdXBsZXgoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KTsKK2ludCB0M19waHlfbGFzaV9pbnRyX2VuYWJsZShzdHJ1Y3QgY3BoeSAqcGh5KTsKK2ludCB0M19waHlfbGFzaV9pbnRyX2Rpc2FibGUoc3RydWN0IGNwaHkgKnBoeSk7CitpbnQgdDNfcGh5X2xhc2lfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqcGh5KTsKK2ludCB0M19waHlfbGFzaV9pbnRyX2hhbmRsZXIoc3RydWN0IGNwaHkgKnBoeSk7CiAKIHZvaWQgdDNfaW50cl9lbmFibGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCB0M19pbnRyX2Rpc2FibGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtNjk4LDYgKzcyNiw3IEBACiBpbnQgdDNfaW5pdF9odyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGZ3X3BhcmFtcyk7CiB2b2lkIG1hY19wcmVwKHN0cnVjdCBjbWFjICptYWMsIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgpOwogdm9pZCBlYXJseV9od19pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICphaSk7CitpbnQgdDNfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgdDNfcHJlcF9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICphaSwKIAkJICAgIGludCByZXNldCk7CiBpbnQgdDNfcmVwbGF5X3ByZXBfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CkBAIC03NzQsMTQgKzgwMywxNiBAQAogaW50IHQzX3NnZV9jcWNudHh0X29wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBvcCwKIAkJICAgICAgdW5zaWduZWQgaW50IGNyZWRpdHMpOwogCi12b2lkIHQzX3ZzYzgyMTFfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKTsKLXZvaWQgdDNfYWVsMTAwMl9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCSBpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOwotdm9pZCB0M19hZWwxMDA2X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7Ci12b2lkIHQzX3F0MjA0NV9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLAotCQkJY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7Ci12b2lkIHQzX3hhdWlfZGlyZWN0X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJICAgICBpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworaW50IHQzX3ZzYzgyMTFfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQlpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworaW50IHQzX2FlbDEwMDJfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQlpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworaW50IHQzX2FlbDEwMDZfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQlpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworaW50IHQzX2FlbDIwMDVfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQlpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworaW50IHQzX3F0MjA0NV9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7CitpbnQgdDNfeGF1aV9kaXJlY3RfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKTsKICNlbmRpZgkJCQkvKiBfX0NIRUxTSU9fQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2N0bF9kZWZzLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19jdGxfZGVmcy5oCmluZGV4IDZhZDkyNDAuLjFkOGQ0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2N0bF9kZWZzLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfY3RsX2RlZnMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2RlZnMuaAppbmRleCA0NWU5MjE2Li40N2U1Mzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19kZWZzLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfZGVmcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfaW9jdGwuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2lvY3RsLmgKaW5kZXggNjgyMDBhMS4uYjE5ZTQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfaW9jdGwuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19pb2N0bC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtOTIsNiArOTIsOCBAQAogCWludDMyX3QgcG9sbGluZzsKIAlpbnQzMl90IGxybzsKIAlpbnQzMl90IGNvbmdfdGhyZXM7CisJaW50MzJfdCAgdmVjdG9yOworCWludDMyX3QgIHFudW07CiB9OwogCiBzdHJ1Y3QgY2hfcGt0c2NoZWRfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCA1NDQ3ZjNlLi4xYWNlNDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMjA4LDYgKzIwOCwzMSBAQAogCX0KIH0KIAorLyoqCisgKgl0M19vc19waHltb2RfY2hhbmdlZCAtIGhhbmRsZSBQSFkgbW9kdWxlIGNoYW5nZXMKKyAqCUBwaHk6IHRoZSBQSFkgcmVwb3J0aW5nIHRoZSBtb2R1bGUgY2hhbmdlCisgKglAbW9kX3R5cGU6IG5ldyBtb2R1bGUgdHlwZQorICoKKyAqCVRoaXMgaXMgdGhlIE9TLWRlcGVuZGVudCBoYW5kbGVyIGZvciBQSFkgbW9kdWxlIGNoYW5nZXMuICBJdCBpcworICoJaW52b2tlZCB3aGVuIGEgUEhZIG1vZHVsZSBpcyByZW1vdmVkIG9yIGluc2VydGVkIGZvciBhbnkgT1Mtc3BlY2lmaWMKKyAqCXByb2Nlc3NpbmcuCisgKi8KK3ZvaWQgdDNfb3NfcGh5bW9kX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBwb3J0X2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICptb2Rfc3RyW10gPSB7CisJCU5VTEwsICJTUiIsICJMUiIsICJMUk0iLCAiVFdJTkFYIiwgIlRXSU5BWCIsICJ1bmtub3duIgorCX07CisKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcC0+cG9ydFtwb3J0X2lkXTsKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocGktPnBoeS5tb2R0eXBlID09IHBoeV9tb2R0eXBlX25vbmUpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQSFkgbW9kdWxlIHVucGx1Z2dlZFxuIiwgZGV2LT5uYW1lKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQSFkgbW9kdWxlIGluc2VydGVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBtb2Rfc3RyW3BpLT5waHkubW9kdHlwZV0pOworfQorCiBzdGF0aWMgdm9pZCBjeGdiX3NldF9yeG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdDNfcnhfbW9kZSBybTsKQEAgLTI3NCwxMCArMjk5LDEwIEBACiAKIAkJZm9yIChpID0gMDsgaSA8IHBpLT5ucXNldHM7IGkrKywgbXNpX2lkeCsrKSB7CiAJCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeF0uZGVzYywgbiwKLQkJCQkgIiVzIChxdWV1ZSAlZCkiLCBkLT5uYW1lLCBpKTsKKwkJCQkgIiVzLSVkIiwgZC0+bmFtZSwgcGktPmZpcnN0X3FzZXQgKyBpKTsKIAkJCWFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4XS5kZXNjW25dID0gMDsKIAkJfQotIAl9CisJfQogfQogCiBzdGF0aWMgaW50IHJlcXVlc3RfbXNpeF9kYXRhX2lycXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCkBAIC0zMDYsNiArMzMxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfaXJxX3Jlc291cmNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCWludCBpLCBuID0gMDsKKworCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2luZm9bMF0udmVjLCBhZGFwdGVyKTsKKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKQorCQkgICAgbiArPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpLT5ucXNldHM7CisKKwkJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfaW5mb1tpICsgMV0udmVjLAorCQkJCSAmYWRhcHRlci0+c2dlLnFzW2ldKTsKKwl9IGVsc2UKKwkJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyKTsKK30KKwogc3RhdGljIGludCBhd2FpdF9tZ210X3JlcGxpZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGxvbmcgaW5pdF9jbnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIG4pCiB7CkBAIC00NzMsMTIgKzUxNCwxNiBAQAogCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CiAKIAkJcGktPnFzID0gJmFkYXAtPnNnZS5xc1twaS0+Zmlyc3RfcXNldF07Ci0JCWZvciAoaiA9IDA7IGogPCBwaS0+bnFzZXRzOyArK2osICsrcXNldF9pZHgpIHsKKwkJZm9yIChqID0gcGktPmZpcnN0X3FzZXQ7IGogPCBwaS0+Zmlyc3RfcXNldCArIHBpLT5ucXNldHM7CisJCSAgICAgKytqLCArK3FzZXRfaWR4KSB7CisJCQlpZiAoIXBpLT5yeF9jc3VtX29mZmxvYWQpCisJCQkJYWRhcC0+cGFyYW1zLnNnZS5xc2V0W3FzZXRfaWR4XS5scm8gPSAwOwogCQkJZXJyID0gdDNfc2dlX2FsbG9jX3FzZXQoYWRhcCwgcXNldF9pZHgsIDEsCiAJCQkJKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgPyBxc2V0X2lkeCArIDEgOgogCQkJCQkJCSAgICAgaXJxX2lkeCwKIAkJCQkmYWRhcC0+cGFyYW1zLnNnZS5xc2V0W3FzZXRfaWR4XSwgbnR4cSwgZGV2KTsKIAkJCWlmIChlcnIpIHsKKwkJCQl0M19zdG9wX3NnZV90aW1lcnMoYWRhcCk7CiAJCQkJdDNfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXApOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CkBAIC03MzksMTEgKzc4NCwxMiBAQAogCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1RQX01UVV9QT1JUX1RBQkxFLCBtdHVzKTsKIH0KIAotc3RhdGljIHZvaWQgc2VuZF9wa3RzY2hlZF9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBzY2hlZCwgaW50IHFpZHgsIGludCBsbywKK3N0YXRpYyBpbnQgc2VuZF9wa3RzY2hlZF9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBzY2hlZCwgaW50IHFpZHgsIGludCBsbywKIAkJCSAgICAgIGludCBoaSwgaW50IHBvcnQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbW5ndF9wa3RzY2hlZF93ciAqcmVxOworCWludCByZXQ7CiAKIAlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9GQUlMKTsKIAlyZXEgPSAoc3RydWN0IG1uZ3RfcGt0c2NoZWRfd3IgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpyZXEpKTsKQEAgLTc1NCwyMCArODAwLDI4IEBACiAJcmVxLT5taW4gPSBsbzsKIAlyZXEtPm1heCA9IGhpOwogCXJlcS0+YmluZGluZyA9IHBvcnQ7Ci0JdDNfbWdtdF90eChhZGFwLCBza2IpOworCXJldCA9IHQzX21nbXRfdHgoYWRhcCwgc2tiKTsKKworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJpbmRfcXNldHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCitzdGF0aWMgaW50IGJpbmRfcXNldHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IGksIGo7CisJaW50IGksIGosIGVyciA9IDA7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXAsIGkpOwogCi0JCWZvciAoaiA9IDA7IGogPCBwaS0+bnFzZXRzOyArK2opCi0JCQlzZW5kX3BrdHNjaGVkX2NtZChhZGFwLCAxLCBwaS0+Zmlyc3RfcXNldCArIGosIC0xLAotCQkJCQkgIC0xLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IHBpLT5ucXNldHM7ICsraikgeworCQkJaW50IHJldCA9IHNlbmRfcGt0c2NoZWRfY21kKGFkYXAsIDEsCisJCQkJCQkgICAgcGktPmZpcnN0X3FzZXQgKyBqLCAtMSwKKwkJCQkJCSAgICAtMSwgaSk7CisJCQlpZiAocmV0KQorCQkJCWVyciA9IHJldDsKKwkJfQogCX0KKworCXJldHVybiBlcnI7CiB9CiAKICNkZWZpbmUgRldfRk5BTUUgInQzZnctJWQuJWQuJWQuYmluIgpAQCAtODkxLDYgKzk0NSwxMyBAQAogCQkJCWdvdG8gb3V0OwogCQl9CiAKKwkJLyoKKwkJICogQ2xlYXIgaW50ZXJydXB0cyBub3cgdG8gY2F0Y2ggZXJyb3JzIGlmIHQzX2luaXRfaHcgZmFpbHMuCisJCSAqIFdlIGNsZWFyIHRoZW0gYWdhaW4gbGF0ZXIgYXMgaW5pdGlhbGl6YXRpb24gbWF5IHRyaWdnZXIKKwkJICogY29uZGl0aW9ucyB0aGF0IGNhbiBpbnRlcnJ1cHQuCisJCSAqLworCQl0M19pbnRyX2NsZWFyKGFkYXApOworCiAJCWVyciA9IHQzX2luaXRfaHcoYWRhcCwgMCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTk0Niw5ICsxMDA3LDE2IEBACiAJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX0lOVF9FTkFCTEUsIDB4N2ZiZmZmZmYpOwogCX0KIAotCWlmICgoYWRhcC0+ZmxhZ3MgJiAoVVNJTkdfTVNJWCB8IFFVRVVFU19CT1VORCkpID09IFVTSU5HX01TSVgpCi0JCWJpbmRfcXNldHMoYWRhcCk7Ci0JYWRhcC0+ZmxhZ3MgfD0gUVVFVUVTX0JPVU5EOworCWlmICghKGFkYXAtPmZsYWdzICYgUVVFVUVTX0JPVU5EKSkgeworCQllcnIgPSBiaW5kX3FzZXRzKGFkYXApOworCQlpZiAoZXJyKSB7CisJCQlDSF9FUlIoYWRhcCwgImZhaWxlZCB0byBiaW5kIHFzZXRzLCBlcnIgJWRcbiIsIGVycik7CisJCQl0M19pbnRyX2Rpc2FibGUoYWRhcCk7CisJCQlmcmVlX2lycV9yZXNvdXJjZXMoYWRhcCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlhZGFwLT5mbGFncyB8PSBRVUVVRVNfQk9VTkQ7CisJfQogCiBvdXQ6CiAJcmV0dXJuIGVycjsKQEAgLTk2NywxOSArMTAzNSw3IEBACiAJdDNfaW50cl9kaXNhYmxlKGFkYXB0ZXIpOwogCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKIAotCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKLQkJaW50IGksIG4gPSAwOwotCi0JCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfaW5mb1swXS52ZWMsIGFkYXB0ZXIpOwotCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCi0JCSAgICBuICs9IGFkYXAycGluZm8oYWRhcHRlciwgaSktPm5xc2V0czsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCQkJZnJlZV9pcnEoYWRhcHRlci0+bXNpeF9pbmZvW2kgKyAxXS52ZWMsCi0JCQkJICZhZGFwdGVyLT5zZ2UucXNbaV0pOwotCX0gZWxzZQotCQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOwotCisJZnJlZV9pcnFfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWZsdXNoX3dvcmtxdWV1ZShjeGdiM193cSk7CS8qIHdhaXQgZm9yIGV4dGVybmFsIElSUSBoYW5kbGVyICovCiAJcXVpZXNjZV9yeChhZGFwdGVyKTsKIH0KQEAgLTExMDAsOSArMTE1Niw5IEBACiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAl0M19tYWNfZGlzYWJsZSgmcGktPm1hYywgTUFDX0RJUkVDVElPTl9UWCB8IE1BQ19ESVJFQ1RJT05fUlgpOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOwkvKiBzeW5jIHdpdGggdXBkYXRlIHRhc2sgKi8KKwlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT53b3JrX2xvY2spOwkvKiBzeW5jIHdpdGggdXBkYXRlIHRhc2sgKi8KIAljbGVhcl9iaXQocGktPnBvcnRfaWQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApOwotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKIAogCWlmICghKGFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmIFBPUlRfTUFTSykpCiAJCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmtxdWV1ZShjeGdiM193cSwKQEAgLTEyODQsOCArMTM0MCw4IEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0b3QgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IHAtPm5xc2V0czsgKytpKQotCQl0b3QgKz0gYWRhcHRlci0+c2dlLnFzW2kgKyBwLT5maXJzdF9xc2V0XS5wb3J0X3N0YXRzW2lkeF07CisJZm9yIChpID0gcC0+Zmlyc3RfcXNldDsgaSA8IHAtPmZpcnN0X3FzZXQgKyBwLT5ucXNldHM7ICsraSkKKwkJdG90ICs9IGFkYXB0ZXItPnNnZS5xc1tpXS5wb3J0X3N0YXRzW2lkeF07CiAJcmV0dXJuIHRvdDsKIH0KIApAQCAtMTQ4NSwxMSArMTU0MSwyMiBAQAogCiBzdGF0aWMgaW50IHNldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKKwlpbnQgY2FwOwogCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBsaW5rX2NvbmZpZyAqbGMgPSAmcC0+bGlua19jb25maWc7CiAKLQlpZiAoIShsYy0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CS8qIGNhbid0IGNoYW5nZSBzcGVlZC9kdXBsZXggKi8KKwlpZiAoIShsYy0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpKSB7CisJCS8qCisJCSAqIFBIWSBvZmZlcnMgYSBzaW5nbGUgc3BlZWQvZHVwbGV4LiAgU2VlIGlmIHRoYXQncyB3aGF0J3MKKwkJICogYmVpbmcgcmVxdWVzdGVkLgorCQkgKi8KKwkJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpIHsKKwkJCWNhcCA9IHNwZWVkX2R1cGxleF90b19jYXBzKGNtZC0+c3BlZWQsIGNtZC0+ZHVwbGV4KTsKKwkJCWlmIChsYy0+c3VwcG9ydGVkICYgY2FwKQorCQkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CiAJCWludCBjYXAgPSBzcGVlZF9kdXBsZXhfdG9fY2FwcyhjbWQtPnNwZWVkLCBjbWQtPmR1cGxleCk7CkBAIC0xNTY4LDggKzE2MzUsMTAgQEAKIAkJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwLT5hZGFwdGVyOwogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSBwLT5maXJzdF9xc2V0OyBpIDwgcC0+Zmlyc3RfcXNldCArIHAtPm5xc2V0czsgaSsrKQorCQlmb3IgKGkgPSBwLT5maXJzdF9xc2V0OyBpIDwgcC0+Zmlyc3RfcXNldCArIHAtPm5xc2V0czsgaSsrKSB7CisJCQlhZGFwLT5wYXJhbXMuc2dlLnFzZXRbaV0ubHJvID0gMDsKIAkJCWFkYXAtPnNnZS5xc1tpXS5scm9fZW5hYmxlZCA9IDA7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzc1LDYgKzE4NDQsOCBAQAogCQlpbnQgaTsKIAkJc3RydWN0IHFzZXRfcGFyYW1zICpxOwogCQlzdHJ1Y3QgY2hfcXNldF9wYXJhbXMgdDsKKwkJaW50IHExID0gcGktPmZpcnN0X3FzZXQ7CisJCWludCBucXNldHMgPSBwaS0+bnFzZXRzOwogCiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CkBAIC0xNzk3LDYgKzE4NjgsMTYgQEAKIAkJCXx8ICFpbl9yYW5nZSh0LnJzcHFfc2l6ZSwgTUlOX1JTUFFfRU5UUklFUywKIAkJCQkJTUFYX1JTUFFfRU5UUklFUykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpICYmIHQubHJvID4gMCkKKwkJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQkJCXBpID0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKTsKKwkJCQlpZiAodC5xc2V0X2lkeCA+PSBwaS0+Zmlyc3RfcXNldCAmJgorCQkJCSAgICB0LnFzZXRfaWR4IDwgcGktPmZpcnN0X3FzZXQgKyBwaS0+bnFzZXRzICYmCisJCQkJICAgICFwaS0+cnhfY3N1bV9vZmZsb2FkKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwogCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpICYmCiAJCQkodC5yc3BxX3NpemUgPj0gMCB8fCB0LmZsX3NpemVbMF0gPj0gMCB8fAogCQkJdC5mbF9zaXplWzFdID49IDAgfHwgdC50eHFfc2l6ZVswXSA+PSAwIHx8CkBAIC0xODA0LDYgKzE4ODUsMjAgQEAKIAkJCXQucG9sbGluZyA+PSAwIHx8IHQuY29uZ190aHJlcyA+PSAwKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKKwkJLyogQWxsb3cgc2V0dGluZyBvZiBhbnkgYXZhaWxhYmxlIHFzZXQgd2hlbiBvZmZsb2FkIGVuYWJsZWQgKi8KKwkJaWYgKHRlc3RfYml0KE9GRkxPQURfREVWTUFQX0JJVCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCkpIHsKKwkJCXExID0gMDsKKwkJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQkJCXBpID0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKTsKKwkJCQlucXNldHMgKz0gcGktPmZpcnN0X3FzZXQgKyBwaS0+bnFzZXRzOworCQkJfQorCQl9CisKKwkJaWYgKHQucXNldF9pZHggPCBxMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAodC5xc2V0X2lkeCA+IHExICsgbnFzZXRzIC0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCiAJCXEgPSAmYWRhcHRlci0+cGFyYW1zLnNnZS5xc2V0W3QucXNldF9pZHhdOwogCiAJCWlmICh0LnJzcHFfc2l6ZSA+PSAwKQpAQCAtMTg1MywxMyArMTk0OCwyNiBAQAogCWNhc2UgQ0hFTFNJT19HRVRfUVNFVF9QQVJBTVM6ewogCQlzdHJ1Y3QgcXNldF9wYXJhbXMgKnE7CiAJCXN0cnVjdCBjaF9xc2V0X3BhcmFtcyB0OworCQlpbnQgcTEgPSBwaS0+Zmlyc3RfcXNldDsKKwkJaW50IG5xc2V0cyA9IHBpLT5ucXNldHM7CisJCWludCBpOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXNlcmFkZHIsIHNpemVvZih0KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHQucXNldF9pZHggPj0gU0dFX1FTRVRTKQorCisJCS8qIERpc3BsYXkgcXNldHMgZm9yIGFsbCBwb3J0cyB3aGVuIG9mZmxvYWQgZW5hYmxlZCAqLworCQlpZiAodGVzdF9iaXQoT0ZGTE9BRF9ERVZNQVBfQklULCAmYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKSkgeworCQkJcTEgPSAwOworCQkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCQkJcGkgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpOworCQkJCW5xc2V0cyA9IHBpLT5maXJzdF9xc2V0ICsgcGktPm5xc2V0czsKKwkJCX0KKwkJfQorCisJCWlmICh0LnFzZXRfaWR4ID49IG5xc2V0cykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXEgPSAmYWRhcHRlci0+cGFyYW1zLnNnZS5xc2V0W3QucXNldF9pZHhdOworCQlxID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFtxMSArIHQucXNldF9pZHhdOwogCQl0LnJzcHFfc2l6ZSA9IHEtPnJzcHFfc2l6ZTsKIAkJdC50eHFfc2l6ZVswXSA9IHEtPnR4cV9zaXplWzBdOwogCQl0LnR4cV9zaXplWzFdID0gcS0+dHhxX3NpemVbMV07CkBAIC0xODcwLDYgKzE5NzgsMTIgQEAKIAkJdC5scm8gPSBxLT5scm87CiAJCXQuaW50cl9sYXQgPSBxLT5jb2FsZXNjZV91c2VjczsKIAkJdC5jb25nX3RocmVzID0gcS0+Y29uZ190aHJlczsKKwkJdC5xbnVtID0gcTE7CisKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCXQudmVjdG9yID0gYWRhcHRlci0+bXNpeF9pbmZvW3ExICsgdC5xc2V0X2lkeCArIDFdLnZlYzsKKwkJZWxzZQorCQkJdC52ZWN0b3IgPSBhZGFwdGVyLT5wZGV2LT5pcnE7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJnQsIHNpemVvZih0KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIxMTcsNyArMjIzMSw3IEBACiAJCQltbWQgPSBkYXRhLT5waHlfaWQgPj4gODsKIAkJCWlmICghbW1kKQogCQkJCW1tZCA9IE1ESU9fREVWX1BDUzsKLQkJCWVsc2UgaWYgKG1tZCA+IE1ESU9fREVWX1hHWFMpCisJCQllbHNlIGlmIChtbWQgPiBNRElPX0RFVl9WRU5EMikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJcmV0ID0KQEAgLTIxNDMsNyArMjI1Nyw3IEBACiAJCQltbWQgPSBkYXRhLT5waHlfaWQgPj4gODsKIAkJCWlmICghbW1kKQogCQkJCW1tZCA9IE1ESU9fREVWX1BDUzsKLQkJCWVsc2UgaWYgKG1tZCA+IE1ESU9fREVWX1hHWFMpCisJCQllbHNlIGlmIChtbWQgPiBNRElPX0RFVl9WRU5EMikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJcmV0ID0KQEAgLTIyMTUsOCArMjMyOSw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcC0+bnFzZXRzOyBpKyspIHsKLQkJc3RydWN0IHNnZV9yc3BxICpxID0gJmFkYXAtPnNnZS5xc1tpICsgcC0+Zmlyc3RfcXNldF0ucnNwcTsKKwlmb3IgKGkgPSBwLT5maXJzdF9xc2V0OyBpIDwgcC0+Zmlyc3RfcXNldCArIHAtPm5xc2V0czsgaSsrKSB7CisJCXN0cnVjdCBzZ2VfcnNwcSAqcSA9ICZhZGFwLT5zZ2UucXNbaV0ucnNwcTsKIAogCQlzcGluX2xvY2tfaXJxKCZxLT5sb2NrKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZxLT5sb2NrKTsKQEAgLTIyOTAsNyArMjQwNCw3IEBACiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wb3J0W2ldOwogCQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQlpZiAoIShwLT5wb3J0X3R5cGUtPmNhcHMgJiBTVVBQT1JURURfSVJRKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCWlmICghKHAtPnBoeS5jYXBzICYgU1VQUE9SVEVEX0lSUSkgJiYgbmV0aWZfcnVubmluZyhkZXYpKQogCQkJdDNfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIGkpOwogCX0KIH0KQEAgLTIzNTUsMTAgKzI0NjksMTAgQEAKIAkJY2hlY2tfdDNiMl9tYWMoYWRhcHRlcik7CiAKIAkvKiBTY2hlZHVsZSB0aGUgbmV4dCBjaGVjayB1cGRhdGUgaWYgYW55IHBvcnQgaXMgYWN0aXZlLiAqLwotCXNwaW5fbG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT53b3JrX2xvY2spOwogCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0spCiAJCXNjaGVkdWxlX2Noa190YXNrKGFkYXB0ZXIpOwotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKIH0KIAogLyoKQEAgLTI0MDMsNiArMjUxNyw5NiBAQAogCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOwogfQogCitzdGF0aWMgaW50IHQzX2FkYXB0ZXJfZXJyb3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCByZXNldCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCS8qIFN0b3AgYWxsIHBvcnRzICovCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5wb3J0W2ldOworCisJCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCQljeGdiX2Nsb3NlKG5ldGRldik7CisJfQorCisJaWYgKGlzX29mZmxvYWQoYWRhcHRlcikgJiYKKwkgICAgdGVzdF9iaXQoT0ZGTE9BRF9ERVZNQVBfQklULCAmYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKSkKKwkJb2ZmbG9hZF9jbG9zZSgmYWRhcHRlci0+dGRldik7CisKKwkvKiBTdG9wIFNHRSB0aW1lcnMgKi8KKwl0M19zdG9wX3NnZV90aW1lcnMoYWRhcHRlcik7CisKKwlhZGFwdGVyLT5mbGFncyAmPSB+RlVMTF9JTklUX0RPTkU7CisKKwlpZiAocmVzZXQpCisJCXJldCA9IHQzX3Jlc2V0X2FkYXB0ZXIoYWRhcHRlcik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYWRhcHRlci0+cGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHQzX3JlZW5hYmxlX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGFkYXB0ZXItPnBkZXYpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgcmUtZW5hYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXBjaV9zZXRfbWFzdGVyKGFkYXB0ZXItPnBkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKGFkYXB0ZXItPnBkZXYpOworCisJLyogRnJlZSBzZ2UgcmVzb3VyY2VzICovCisJdDNfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXB0ZXIpOworCisJaWYgKHQzX3JlcGxheV9wcmVwX2FkYXB0ZXIoYWRhcHRlcikpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB0M19yZXN1bWVfcG9ydHMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwkvKiBSZXN0YXJ0IHRoZSBwb3J0cyAqLworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+cG9ydFtpXTsKKworCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCQlpZiAoY3hnYl9vcGVuKG5ldGRldikpIHsKKwkJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCSJjYW4ndCBicmluZyBkZXZpY2UgYmFjayB1cCIKKwkJCQkJIiBhZnRlciByZXNldFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBwcm9jZXNzZXMgYSBmYXRhbCBlcnJvci4KKyAqIEJyaW5nIHRoZSBwb3J0cyBkb3duLCByZXNldCB0aGUgY2hpcCwgYnJpbmcgdGhlIHBvcnRzIGJhY2sgdXAuCisgKi8KK3N0YXRpYyB2b2lkIGZhdGFsX2Vycm9yX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZGFwdGVyLAorCQkJCQkgICAgICAgZmF0YWxfZXJyb3JfaGFuZGxlcl90YXNrKTsKKwlpbnQgZXJyID0gMDsKKworCXJ0bmxfbG9jaygpOworCWVyciA9IHQzX2FkYXB0ZXJfZXJyb3IoYWRhcHRlciwgMSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHQzX3JlZW5hYmxlX2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKCFlcnIpCisJCXQzX3Jlc3VtZV9wb3J0cyhhZGFwdGVyKTsKKworCUNIX0FMRVJUKGFkYXB0ZXIsICJhZGFwdGVyIHJlc2V0ICVzXG4iLCBlcnIgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwlydG5sX3VubG9jaygpOworfQorCiB2b2lkIHQzX2ZhdGFsX2VycihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1bnNpZ25lZCBpbnQgZndfc3RhdHVzWzRdOwpAQCAtMjQxMyw3ICsyNjE3LDExIEBACiAJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1hHTV9SWF9DVFJMLCAwKTsKIAkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIFhHTV9SRUcoQV9YR01fVFhfQ1RSTCwgMSksIDApOwogCQl0M193cml0ZV9yZWcoYWRhcHRlciwgWEdNX1JFRyhBX1hHTV9SWF9DVFJMLCAxKSwgMCk7CisKKwkJc3Bpbl9sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOwogCQl0M19pbnRyX2Rpc2FibGUoYWRhcHRlcik7CisJCXF1ZXVlX3dvcmsoY3hnYjNfd3EsICZhZGFwdGVyLT5mYXRhbF9lcnJvcl9oYW5kbGVyX3Rhc2spOworCQlzcGluX3VubG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKIAl9CiAJQ0hfQUxFUlQoYWRhcHRlciwgImVuY291bnRlcmVkIGZhdGFsIGVycm9yLCBvcGVyYXRpb24gc3VzcGVuZGVkXG4iKTsKIAlpZiAoIXQzX2NpbV9jdGxfYmxrX3JlYWQoYWRhcHRlciwgMHhhMCwgNCwgZndfc3RhdHVzKSkKQEAgLTI0MzUsMjMgKzI2NDMsOSBAQAogCQkJCQkgICAgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGk7CisJaW50IHJldDsKIAotCS8qIFN0b3AgYWxsIHBvcnRzICovCi0JZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5wb3J0W2ldOwotCi0JCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCQljeGdiX2Nsb3NlKG5ldGRldik7Ci0JfQotCi0JaWYgKGlzX29mZmxvYWQoYWRhcHRlcikgJiYKLQkgICAgdGVzdF9iaXQoT0ZGTE9BRF9ERVZNQVBfQklULCAmYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKSkKLQkJb2ZmbG9hZF9jbG9zZSgmYWRhcHRlci0+dGRldik7Ci0KLQlhZGFwdGVyLT5mbGFncyAmPSB+RlVMTF9JTklUX0RPTkU7Ci0KLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0ID0gdDNfYWRhcHRlcl9lcnJvcihhZGFwdGVyLCAwKTsKIAogCS8qIFJlcXVlc3QgYSBzbG90IHJlc2V0LiAqLwogCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwpAQCAtMjQ2NywyMiArMjY2MSw5IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkNhbm5vdCByZS1lbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldC5cbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJaWYgKCF0M19yZWVuYWJsZV9hZGFwdGVyKGFkYXB0ZXIpKQorCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOwogCi0JLyogRnJlZSBzZ2UgcmVzb3VyY2VzICovCi0JdDNfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXB0ZXIpOwotCi0JaWYgKHQzX3JlcGxheV9wcmVwX2FkYXB0ZXIoYWRhcHRlcikpCi0JCWdvdG8gZXJyOwotCi0JcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKLWVycjoKIAlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIH0KIApAQCAtMjQ5NiwyMiArMjY3Nyw4IEBACiBzdGF0aWMgdm9pZCB0M19pb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGk7CiAKLQkvKiBSZXN0YXJ0IHRoZSBwb3J0cyAqLwotCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+cG9ydFtpXTsKLQotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCQlpZiAoY3hnYl9vcGVuKG5ldGRldikpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSJjYW4ndCBicmluZyBkZXZpY2UgYmFjayB1cCIKLQkJCQkJIiBhZnRlciByZXNldFxuIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7Ci0JCX0KLQl9CisJdDNfcmVzdW1lX3BvcnRzKGFkYXB0ZXIpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyB0M19lcnJfaGFuZGxlciA9IHsKQEAgLTI1MjAsNiArMjY4Nyw0MiBAQAogCS5yZXN1bWUgPSB0M19pb19yZXN1bWUsCiB9OwogCisvKgorICogU2V0IHRoZSBudW1iZXIgb2YgcXNldHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBDUFVzIGFuZCB0aGUgbnVtYmVyIG9mIHBvcnRzLAorICogbm90IHRvIGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBxc2V0cywgYXNzdW1pbmcgdGhlcmUgYXJlIGVub3VnaCBxc2V0cworICogcGVyIHBvcnQgaW4gSFcuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9ucXNldHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJaW50IGksIGogPSAwOworCWludCBudW1fY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCWludCBod3BvcnRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwlpbnQgbnFzZXRzID0gU0dFX1FTRVRTOworCisJaWYgKGFkYXAtPnBhcmFtcy5yZXYgPiAwKSB7CisJCWlmIChod3BvcnRzID09IDIgJiYKKwkJICAgIChod3BvcnRzICogbnFzZXRzID4gU0dFX1FTRVRTIHx8CisJCSAgICAgbnVtX2NwdXMgPj0gbnFzZXRzIC8gaHdwb3J0cykpCisJCQlucXNldHMgLz0gaHdwb3J0czsKKwkJaWYgKG5xc2V0cyA+IG51bV9jcHVzKQorCQkJbnFzZXRzID0gbnVtX2NwdXM7CisJCWlmIChucXNldHMgPCAxIHx8IGh3cG9ydHMgPT0gNCkKKwkJCW5xc2V0cyA9IDE7CisJfSBlbHNlCisJCW5xc2V0cyA9IDE7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBhZGFwMnBpbmZvKGFkYXAsIGkpOworCisJCXBpLT5maXJzdF9xc2V0ID0gajsKKwkJcGktPm5xc2V0cyA9IG5xc2V0czsKKwkJaiA9IHBpLT5maXJzdF9xc2V0ICsgbnFzZXRzOworCisJCWRldl9pbmZvKCZhZGFwLT5wZGV2LT5kZXYsCisJCQkgIlBvcnQgJWQgdXNpbmcgJWQgcXVldWUgc2V0cy5cbiIsIGksIG5xc2V0cyk7CisJfQorfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjeGdiX2VuYWJsZV9tc2l4KHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbU0dFX1FTRVRTICsgMV07CkBAIC0yNTY0LDcgKzI3NjcsNyBAQAogCQlpZiAoIXRlc3RfYml0KGksICZhZGFwLT5yZWdpc3RlcmVkX2RldmljZV9tYXApKQogCQkJY29udGludWU7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyAlc05JQyAocmV2ICVkKSAlcyVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBhaS0+ZGVzYywgcGktPnBvcnRfdHlwZS0+ZGVzYywKKwkJICAgICAgIGRldi0+bmFtZSwgYWktPmRlc2MsIHBpLT5waHkuZGVzYywKIAkJICAgICAgIGlzX29mZmxvYWQoYWRhcCkgPyAiUiIgOiAiIiwgYWRhcC0+cGFyYW1zLnJldiwgYnVmLAogCQkgICAgICAgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgPyAiIE1TSS1YIiA6CiAJCSAgICAgICAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0kpID8gIiBNU0kiIDogIiIpOwpAQCAtMjY2MCw2ICsyODYzLDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5hZGFwdGVyX2xpc3QpOwogCUlOSVRfV09SSygmYWRhcHRlci0+ZXh0X2ludHJfaGFuZGxlcl90YXNrLCBleHRfaW50cl90YXNrKTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPmZhdGFsX2Vycm9yX2hhbmRsZXJfdGFzaywgZmF0YWxfZXJyb3JfdGFzayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmFkYXBfY2hlY2tfdGFzaywgdDNfYWRhcF9jaGVja190YXNrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhaS0+bnBvcnRzOyArK2kpIHsKQEAgLTI2NzcsOSArMjg4MSw2IEBACiAJCXBpID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAkJcGktPmFkYXB0ZXIgPSBhZGFwdGVyOwogCQlwaS0+cnhfY3N1bV9vZmZsb2FkID0gMTsKLQkJcGktPm5xc2V0cyA9IDE7Ci0JCXBpLT5maXJzdF9xc2V0ID0gaTsKLQkJcGktPmFjdGl2aXR5ID0gMDsKIAkJcGktPnBvcnRfaWQgPSBpOwogCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCQluZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKQEAgLTI3NTYsNiArMjk1Nyw4IEBACiAJZWxzZSBpZiAobXNpID4gMCAmJiBwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKQogCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0k7CiAKKwlzZXRfbnFzZXRzKGFkYXB0ZXIpOworCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZhZGFwdGVyLT5wb3J0WzBdLT5kZXYua29iaiwKIAkJCQkgJmN4Z2IzX2F0dHJfZ3JvdXApOwogCkBAIC0yODAxLDYgKzMwMDQsNyBAQAogCQkgICAgaWYgKHRlc3RfYml0KGksICZhZGFwdGVyLT5yZWdpc3RlcmVkX2RldmljZV9tYXApKQogCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXSk7CiAKKwkJdDNfc3RvcF9zZ2VfdGltZXJzKGFkYXB0ZXIpOwogCQl0M19mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcHRlcik7CiAJCWN4Z2JfZGlzYWJsZV9tc2koYWRhcHRlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwppbmRleCBjNWIzZGUxLi4yNjVhYThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTAxOCw3ICsxMDE4LDcgQEAKIAogCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKnJlcSksIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBza2IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgYWxsb2NhdGUgc2tiIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfQ09OVFJPTDsKQEAgLTEwNDksMTQgKzEwNDksMTQgQEAKIAkJcmV0dXJuOwogCWlmICghaXNfb2ZmbG9hZGluZyhuZXdkZXYpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWRpcmVjdCB0byBub24tb2ZmbG9hZCAiCi0JCSAgICAgICAiZGV2aWNlIGlnbm9yZWQuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkgICAgICAgImRldmljZSBpZ25vcmVkLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCXRkZXYgPSBkZXYydDNjZGV2KG9sZGRldik7CiAJQlVHX09OKCF0ZGV2KTsKIAlpZiAodGRldiAhPSBkZXYydDNjZGV2KG5ld2RldikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlZGlyZWN0IHRvIGRpZmZlcmVudCAiCi0JCSAgICAgICAib2ZmbG9hZCBkZXZpY2UgaWdub3JlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCSAgICAgICAib2ZmbG9hZCBkZXZpY2UgaWdub3JlZC5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA2NCw3ICsxMDY0LDcgQEAKIAllID0gdDNfbDJ0X2dldCh0ZGV2LCBuZXctPm5laWdoYm91ciwgbmV3ZGV2KTsKIAlpZiAoIWUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWxsb2NhdGUgbmV3IGwydCBlbnRyeSFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkgICAgICAgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmgKaW5kZXggN2EzNzkxMy4uZDUxNGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2Zpcm13YXJlX2V4cG9ydHMuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2Zpcm13YXJlX2V4cG9ydHMuaAppbmRleCBiNzVkZGQ4Li4wZDliMGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9maXJtd2FyZV9leHBvcnRzLmgKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvZmlybXdhcmVfZXhwb3J0cy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmMgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYwppbmRleCA4MjVlNTEwLi40NDA3YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTg2LDYgKzg2LDcgQEAKIAkJCQkgIHN0cnVjdCBsMnRfZW50cnkgKmUpCiB7CiAJc3RydWN0IGNwbF9sMnRfd3JpdGVfcmVxICpyZXE7CisJc3RydWN0IHNrX2J1ZmYgKnRtcDsKIAogCWlmICghc2tiKSB7CiAJCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKnJlcSksIEdGUF9BVE9NSUMpOwpAQCAtMTAzLDEzICsxMDQsMTEgQEAKIAltZW1jcHkocmVxLT5kc3RfbWFjLCBlLT5kbWFjLCBzaXplb2YocmVxLT5kc3RfbWFjKSk7CiAJc2tiLT5wcmlvcml0eSA9IENQTF9QUklPUklUWV9DT05UUk9MOwogCWN4Z2IzX29mbGRfc2VuZChkZXYsIHNrYik7Ci0Jd2hpbGUgKGUtPmFycHFfaGVhZCkgewotCQlza2IgPSBlLT5hcnBxX2hlYWQ7Ci0JCWUtPmFycHFfaGVhZCA9IHNrYi0+bmV4dDsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKKworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJmUtPmFycHEsIHNrYiwgdG1wKSB7CisJCV9fc2tiX3VubGluayhza2IsICZlLT5hcnBxKTsKIAkJY3hnYjNfb2ZsZF9zZW5kKGRldiwgc2tiKTsKIAl9Ci0JZS0+YXJwcV90YWlsID0gTlVMTDsKIAllLT5zdGF0ZSA9IEwyVF9TVEFURV9WQUxJRDsKIAogCXJldHVybiAwOwpAQCAtMTIxLDEyICsxMjAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJwcV9lbnF1ZXVlKHN0cnVjdCBsMnRfZW50cnkgKmUsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc2tiLT5uZXh0ID0gTlVMTDsKLQlpZiAoZS0+YXJwcV9oZWFkKQotCQllLT5hcnBxX3RhaWwtPm5leHQgPSBza2I7Ci0JZWxzZQotCQllLT5hcnBxX2hlYWQgPSBza2I7Ci0JZS0+YXJwcV90YWlsID0gc2tiOworCV9fc2tiX3F1ZXVlX3RhaWwoJmUtPmFycHEsIHNrYik7CiB9CiAKIGludCB0M19sMnRfc2VuZF9zbG93KHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTE2Nyw3ICsxNjEsNyBAQAogCQkJCWJyZWFrOwogCiAJCQlzcGluX2xvY2tfYmgoJmUtPmxvY2spOwotCQkJaWYgKGUtPmFycHFfaGVhZCkKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZlLT5hcnBxKSkKIAkJCQlzZXR1cF9sMmVfc2VuZF9wZW5kaW5nKGRldiwgc2tiLCBlKTsKIAkJCWVsc2UJLyogd2UgbG9zdCB0aGUgcmFjZSAqLwogCQkJCV9fa2ZyZWVfc2tiKHNrYik7CkBAIC0zNTcsMTQgKzM1MSwxNCBAQAogICogWFhYOiBtYXliZSB3ZSBzaG91bGQgYWJhbmRvbiB0aGUgbGF0dGVyIGJlaGF2aW9yIGFuZCBqdXN0IHJlcXVpcmUgYSBmYWlsdXJlCiAgKiBoYW5kbGVyLgogICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfZmFpbGVkX3Jlc29sdXRpb24oc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqYXJwcSkKK3N0YXRpYyB2b2lkIGhhbmRsZV9mYWlsZWRfcmVzb2x1dGlvbihzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmX2hlYWQgKmFycHEpCiB7Ci0Jd2hpbGUgKGFycHEpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFycHE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKKworCXNrYl9xdWV1ZV93YWxrX3NhZmUoYXJwcSwgc2tiLCB0bXApIHsKIAkJc3RydWN0IGwydF9za2JfY2IgKmNiID0gTDJUX1NLQl9DQihza2IpOwogCi0JCWFycHEgPSBza2ItPm5leHQ7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7CisJCV9fc2tiX3VubGluayhza2IsIGFycHEpOwogCQlpZiAoY2ItPmFycF9mYWlsdXJlX2hhbmRsZXIpCiAJCQljYi0+YXJwX2ZhaWx1cmVfaGFuZGxlcihkZXYsIHNrYik7CiAJCWVsc2UKQEAgLTM3OCw4ICszNzIsOCBAQAogICovCiB2b2lkIHQzX2wydF91cGRhdGUoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGFycHE7CiAJc3RydWN0IGwydF9lbnRyeSAqZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYXJwcSA9IE5VTEw7CiAJc3RydWN0IGwydF9kYXRhICpkID0gTDJEQVRBKGRldik7CiAJdTMyIGFkZHIgPSAqKHUzMiAqKSBuZWlnaC0+cHJpbWFyeV9rZXk7CiAJaW50IGlmaWR4ID0gbmVpZ2gtPmRldi0+aWZpbmRleDsKQEAgLTM5NSw2ICszODksOCBAQAogCXJldHVybjsKIAogZm91bmQ6CisJX19za2JfcXVldWVfaGVhZF9pbml0KCZhcnBxKTsKKwogCXJlYWRfdW5sb2NrKCZkLT5sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJmUtPnJlZmNudCkpIHsKIAkJaWYgKG5laWdoICE9IGUtPm5laWdoKQpAQCAtNDAyLDggKzM5OCw3IEBACiAKIAkJaWYgKGUtPnN0YXRlID09IEwyVF9TVEFURV9SRVNPTFZJTkcpIHsKIAkJCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX0ZBSUxFRCkgewotCQkJCWFycHEgPSBlLT5hcnBxX2hlYWQ7Ci0JCQkJZS0+YXJwcV9oZWFkID0gZS0+YXJwcV90YWlsID0gTlVMTDsKKwkJCQlza2JfcXVldWVfc3BsaWNlX2luaXQoJmUtPmFycHEsICZhcnBxKTsKIAkJCX0gZWxzZSBpZiAobmVpZ2gtPm51ZF9zdGF0ZSAmIChOVURfQ09OTkVDVEVEfE5VRF9TVEFMRSkpCiAJCQkJc2V0dXBfbDJlX3NlbmRfcGVuZGluZyhkZXYsIE5VTEwsIGUpOwogCQl9IGVsc2UgewpAQCAtNDE1LDggKzQxMCw4IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZlLT5sb2NrKTsKIAotCWlmIChhcnBxKQotCQloYW5kbGVfZmFpbGVkX3Jlc29sdXRpb24oZGV2LCBhcnBxKTsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXJwcSkpCisJCWhhbmRsZV9mYWlsZWRfcmVzb2x1dGlvbihkZXYsICZhcnBxKTsKIH0KIAogc3RydWN0IGwydF9kYXRhICp0M19pbml0X2wydCh1bnNpZ25lZCBpbnQgbDJ0X2NhcGFjaXR5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvbDJ0LmggYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuaAppbmRleCBkNzkwMDEzLi5mZDNlYjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9sMnQuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTY0LDggKzY0LDcgQEAKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsJLyogYXNzb2NpYXRlZCBuZWlnaGJvdXIgKi8KIAlzdHJ1Y3QgbDJ0X2VudHJ5ICpmaXJzdDsJLyogc3RhcnQgb2YgaGFzaCBjaGFpbiAqLwogCXN0cnVjdCBsMnRfZW50cnkgKm5leHQ7CS8qIG5leHQgbDJ0X2VudHJ5IG9uIGNoYWluICovCi0Jc3RydWN0IHNrX2J1ZmYgKmFycHFfaGVhZDsJLyogcXVldWUgb2YgcGFja2V0cyBhd2FpdGluZyByZXNvbHV0aW9uICovCi0Jc3RydWN0IHNrX2J1ZmYgKmFycHFfdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGFycHE7CS8qIHF1ZXVlIG9mIHBhY2tldHMgYXdhaXRpbmcgcmVzb2x1dGlvbiAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAlhdG9taWNfdCByZWZjbnQ7CS8qIGVudHJ5IHJlZmVyZW5jZSBjb3VudCAqLwogCXU4IGRtYWNbNl07CQkvKiBuZWlnaGJvdXIncyBNQUMgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvbWM1LmMgYi9kcml2ZXJzL25ldC9jeGdiMy9tYzUuYwppbmRleCA0YzRkNmU4Li4zYjU1MTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9tYzUuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9tYzUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL3JlZ3MuaAppbmRleCA0YmRhMjdjLi5hMDM1ZDVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3JlZ3MuaApAQCAtNTczLDYgKzU3MywxMCBAQAogI2RlZmluZSBWX0dQSU8xMCh4KSAoKHgpIDw8IFNfR1BJTzEwKQogI2RlZmluZSBGX0dQSU8xMCAgICBWX0dQSU8xMCgxVSkKIAorI2RlZmluZSBTX0dQSU85ICAgIDkKKyNkZWZpbmUgVl9HUElPOSh4KSAoKHgpIDw8IFNfR1BJTzkpCisjZGVmaW5lIEZfR1BJTzkgICAgVl9HUElPOSgxVSkKKwogI2RlZmluZSBTX0dQSU83ICAgIDcKICNkZWZpbmUgVl9HUElPNyh4KSAoKHgpIDw8IFNfR1BJTzcpCiAjZGVmaW5lIEZfR1BJTzcgICAgVl9HUElPNygxVSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKaW5kZXggMWIwODYxZC4uYzY0ODBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0zNTEsNyArMzUxLDggQEAKIAkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBwY2lfdW5tYXBfYWRkcihkLCBkbWFfYWRkciksCiAJCQkJIHEtPmJ1Zl9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlpZiAocS0+dXNlX3BhZ2VzKSB7Ci0JCQlwdXRfcGFnZShkLT5wZ19jaHVuay5wYWdlKTsKKwkJCWlmIChkLT5wZ19jaHVuay5wYWdlKQorCQkJCXB1dF9wYWdlKGQtPnBnX2NodW5rLnBhZ2UpOwogCQkJZC0+cGdfY2h1bmsucGFnZSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQlrZnJlZV9za2IoZC0+c2tiKTsKQEAgLTU4Myw3ICs1ODQsNyBAQAogCW1lbXNldChxLT5mbCwgMCwgc2l6ZW9mKHN0cnVjdCBzZ2VfZmwpICogU0dFX1JYUV9QRVJfU0VUKTsKIAltZW1zZXQocS0+dHhxLCAwLCBzaXplb2Yoc3RydWN0IHNnZV90eHEpICogU0dFX1RYUV9QRVJfU0VUKTsKIAlxLT50eHFfc3RvcHBlZCA9IDA7Ci0JbWVtc2V0KCZxLT50eF9yZWNsYWltX3RpbWVyLCAwLCBzaXplb2YocS0+dHhfcmVjbGFpbV90aW1lcikpOworCXEtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24gPSBOVUxMOyAvKiBmb3IgdDNfc3RvcF9zZ2VfdGltZXJzKCkgKi8KIAlrZnJlZShxLT5scm9fZnJhZ190YmwpOwogCXEtPmxyb19uZnJhZ3MgPSBxLT5scm9fZnJhZ19sZW4gPSAwOwogfQpAQCAtNjAzLDkgKzYwNCw2IEBACiAJaW50IGk7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCi0JaWYgKHEtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24pCi0JCWRlbF90aW1lcl9zeW5jKCZxLT50eF9yZWNsYWltX3RpbWVyKTsKLQogCWZvciAoaSA9IDA7IGkgPCBTR0VfUlhRX1BFUl9TRVQ7ICsraSkKIAkJaWYgKHEtPmZsW2ldLmRlc2MpIHsKIAkJCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CkBAIC0xNzA0LDE2ICsxNzAyLDE1IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBvZmZsb2FkX2VucXVldWUoc3RydWN0IHNnZV9yc3BxICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrYi0+bmV4dCA9IHNrYi0+cHJldiA9IE5VTEw7Ci0JaWYgKHEtPnJ4X3RhaWwpCi0JCXEtPnJ4X3RhaWwtPm5leHQgPSBza2I7Ci0JZWxzZSB7CisJaW50IHdhc19lbXB0eSA9IHNrYl9xdWV1ZV9lbXB0eSgmcS0+cnhfcXVldWUpOworCisJX19za2JfcXVldWVfdGFpbCgmcS0+cnhfcXVldWUsIHNrYik7CisKKwlpZiAod2FzX2VtcHR5KSB7CiAJCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSByc3BxX3RvX3FzZXQocSk7CiAKIAkJbmFwaV9zY2hlZHVsZSgmcXMtPm5hcGkpOwotCQlxLT5yeF9oZWFkID0gc2tiOwogCX0KLQlxLT5yeF90YWlsID0gc2tiOwogfQogCiAvKioKQEAgLTE3NTQsMjYgKzE3NTEsMjkgQEAKIAlpbnQgd29ya19kb25lID0gMDsKIAogCXdoaWxlICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKmhlYWQsICp0YWlsLCAqc2tic1tSWF9CVU5ETEVfU0laRV07CisJCXN0cnVjdCBza19idWZmICpza2IsICp0bXAsICpza2JzW1JYX0JVTkRMRV9TSVpFXTsKKwkJc3RydWN0IHNrX2J1ZmZfaGVhZCBxdWV1ZTsKIAkJaW50IG5nYXRoZXJlZDsKIAogCQlzcGluX2xvY2tfaXJxKCZxLT5sb2NrKTsKLQkJaGVhZCA9IHEtPnJ4X2hlYWQ7Ci0JCWlmICghaGVhZCkgeworCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlKTsKKwkJc2tiX3F1ZXVlX3NwbGljZV9pbml0KCZxLT5yeF9xdWV1ZSwgJnF1ZXVlKTsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcXVldWUpKSB7CiAJCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZxLT5sb2NrKTsKIAkJCXJldHVybiB3b3JrX2RvbmU7CiAJCX0KLQotCQl0YWlsID0gcS0+cnhfdGFpbDsKLQkJcS0+cnhfaGVhZCA9IHEtPnJ4X3RhaWwgPSBOVUxMOwogCQlzcGluX3VubG9ja19pcnEoJnEtPmxvY2spOwogCi0JCWZvciAobmdhdGhlcmVkID0gMDsgd29ya19kb25lIDwgYnVkZ2V0ICYmIGhlYWQ7IHdvcmtfZG9uZSsrKSB7Ci0JCQlwcmVmZXRjaChoZWFkLT5kYXRhKTsKLQkJCXNrYnNbbmdhdGhlcmVkXSA9IGhlYWQ7Ci0JCQloZWFkID0gaGVhZC0+bmV4dDsKLQkJCXNrYnNbbmdhdGhlcmVkXS0+bmV4dCA9IE5VTEw7CisJCW5nYXRoZXJlZCA9IDA7CisJCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnF1ZXVlLCBza2IsIHRtcCkgeworCQkJaWYgKHdvcmtfZG9uZSA+PSBidWRnZXQpCisJCQkJYnJlYWs7CisJCQl3b3JrX2RvbmUrKzsKKworCQkJX19za2JfdW5saW5rKHNrYiwgJnF1ZXVlKTsKKwkJCXByZWZldGNoKHNrYi0+ZGF0YSk7CisJCQlza2JzW25nYXRoZXJlZF0gPSBza2I7CiAJCQlpZiAoKytuZ2F0aGVyZWQgPT0gUlhfQlVORExFX1NJWkUpIHsKIAkJCQlxLT5vZmZsb2FkX2J1bmRsZXMrKzsKIAkJCQlhZGFwdGVyLT50ZGV2LnJlY3YoJmFkYXB0ZXItPnRkZXYsIHNrYnMsCkBAIC0xNzgxLDEyICsxNzgxLDEwIEBACiAJCQkJbmdhdGhlcmVkID0gMDsKIAkJCX0KIAkJfQotCQlpZiAoaGVhZCkgewkvKiBzcGxpY2UgcmVtYWluaW5nIHBhY2tldHMgYmFjayBvbnRvIFJ4IHF1ZXVlICovCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZxdWV1ZSkpIHsKKwkJCS8qIHNwbGljZSByZW1haW5pbmcgcGFja2V0cyBiYWNrIG9udG8gUnggcXVldWUgKi8KIAkJCXNwaW5fbG9ja19pcnEoJnEtPmxvY2spOwotCQkJdGFpbC0+bmV4dCA9IHEtPnJ4X2hlYWQ7Ci0JCQlpZiAoIXEtPnJ4X2hlYWQpCi0JCQkJcS0+cnhfdGFpbCA9IHRhaWw7Ci0JCQlxLT5yeF9oZWFkID0gaGVhZDsKKwkJCXNrYl9xdWV1ZV9zcGxpY2UoJnF1ZXVlLCAmcS0+cnhfcXVldWUpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZxLT5sb2NrKTsKIAkJfQogCQlkZWxpdmVyX3BhcnRpYWxfYnVuZGxlKCZhZGFwdGVyLT50ZGV2LCBxLCBza2JzLCBuZ2F0aGVyZWQpOwpAQCAtMTkzNywzOCArMTkzNSw2IEBACiAJCWVoLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSAmJiBpaC0+aWhsID09IChzaXplb2YoKmloKSA+PiAyKTsKIH0KIAotI2RlZmluZSBUQ1BfRkxBR19NQVNLIChUQ1BfRkxBR19DV1IgfCBUQ1BfRkxBR19FQ0UgfCBUQ1BfRkxBR19VUkcgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgVENQX0ZMQUdfQUNLIHwgVENQX0ZMQUdfUFNIIHwgVENQX0ZMQUdfUlNUIHxcCi0JCSAgICAgICAgICAgICAgICAgICAgICAgVENQX0ZMQUdfU1lOIHwgVENQX0ZMQUdfRklOKQotI2RlZmluZSBUU1RBTVBfV09SRCAoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHxcCi0gICAgICAgICAgICAgICAgICAgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKQotCi0vKioKLSAqCWxyb19zZWdtZW50X29rIC0gY2hlY2sgaWYgYSBUQ1Agc2VnbWVudCBpcyBlbGlnaWJsZSBmb3IgTFJPCi0gKglAdGNwaDogdGhlIFRDUCBoZWFkZXIgb2YgdGhlIHBhY2tldAotICoKLSAqCVJldHVybnMgdHJ1ZSBpZiBhIFRDUCBwYWNrZXQgaXMgZWxpZ2libGUgZm9yIExSTy4gIFRoaXMgcmVxdWlyZXMgdGhhdAotICoJdGhlIHBhY2tldCBoYXZlIG9ubHkgdGhlIEFDSyBmbGFnIHNldCBhbmQgbm8gVENQIG9wdGlvbnMgYmVzaWRlcwotICoJdGltZSBzdGFtcHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxyb19zZWdtZW50X29rKGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRjcGgpCi17Ci0JaW50IG9wdGxlbjsKLQotCWlmICh1bmxpa2VseSgodGNwX2ZsYWdfd29yZCh0Y3BoKSAmIFRDUF9GTEFHX01BU0spICE9IFRDUF9GTEFHX0FDSykpCi0JCXJldHVybiAwOwotCi0Jb3B0bGVuID0gKHRjcGgtPmRvZmYgPDwgMikgLSBzaXplb2YoKnRjcGgpOwotCWlmIChvcHRsZW4pIHsKLQkJY29uc3QgdTMyICpvcHQgPSAoY29uc3QgdTMyICopKHRjcGggKyAxKTsKLQotCQlpZiAob3B0bGVuICE9IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgfHwKLQkJICAgICpvcHQgIT0gaHRvbmwoVFNUQU1QX1dPUkQpIHx8ICFvcHRbMl0pCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgdDNfZ2V0X2xyb19oZWFkZXIodm9pZCAqKmVoLCAgdm9pZCAqKmlwaCwgdm9pZCAqKnRjcGgsCiAJCQkgICAgIHU2NCAqaGRyX2ZsYWdzLCB2b2lkICpwcml2KQogewpAQCAtMTk4MSw5ICsxOTQ3LDYgQEAKIAkqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoc3RydWN0IGV0aGhkciAqKSplaCArIDEpOwogCSp0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKHN0cnVjdCBpcGhkciAqKSppcGggKyAxKTsKIAotCSBpZiAoIWxyb19zZWdtZW50X29rKCp0Y3BoKSkKLQkJcmV0dXJuIC0xOwotCiAJKmhkcl9mbGFncyA9IExST19JUFY0IHwgTFJPX1RDUDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NzgsOSArMjg0MSw3IEBACiAJc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyID0gJnEtPmxyb19tZ3I7CiAKIAlpbml0X3FzZXRfY250eHQocSwgaWQpOwotCWluaXRfdGltZXIoJnEtPnR4X3JlY2xhaW1fdGltZXIpOwotCXEtPnR4X3JlY2xhaW1fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXE7Ci0JcS0+dHhfcmVjbGFpbV90aW1lci5mdW5jdGlvbiA9IHNnZV90aW1lcl9jYjsKKwlzZXR1cF90aW1lcigmcS0+dHhfcmVjbGFpbV90aW1lciwgc2dlX3RpbWVyX2NiLCAodW5zaWduZWQgbG9uZylxKTsKIAogCXEtPmZsWzBdLmRlc2MgPSBhbGxvY19yaW5nKGFkYXB0ZXItPnBkZXYsIHAtPmZsX3NpemUsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSwKQEAgLTI5MzQsNiArMjg5NSw3IEBACiAJcS0+cnNwcS5nZW4gPSAxOwogCXEtPnJzcHEuc2l6ZSA9IHAtPnJzcHFfc2l6ZTsKIAlzcGluX2xvY2tfaW5pdCgmcS0+cnNwcS5sb2NrKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZxLT5yc3BxLnJ4X3F1ZXVlKTsKIAogCXEtPnR4cVtUWFFfRVRIXS5zdG9wX3RocmVzID0gbnBvcnRzICoKIAkgICAgZmxpdHNfdG9fZGVzYyhzZ2xfbGVuKE1BWF9TS0JfRlJBR1MgKyAxKSArIDMpOwpAQCAtMzA0Myw2ICszMDA1LDI0IEBACiB9CiAKIC8qKgorICoJdDNfc3RvcF9zZ2VfdGltZXJzIC0gc3RvcCBTR0UgdGltZXIgY2FsbCBiYWNrcworICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKgorICoJU3RvcHMgZWFjaCBTR0UgcXVldWUgc2V0J3MgdGltZXIgY2FsbCBiYWNrCisgKi8KK3ZvaWQgdDNfc3RvcF9zZ2VfdGltZXJzKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNHRV9RU0VUUzsgKytpKSB7CisJCXN0cnVjdCBzZ2VfcXNldCAqcSA9ICZhZGFwLT5zZ2UucXNbaV07CisKKwkJaWYgKHEtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24pCisJCQlkZWxfdGltZXJfc3luYygmcS0+dHhfcmVjbGFpbV90aW1lcik7CisJfQorfQorCisvKioKICAqCXQzX2ZyZWVfc2dlX3Jlc291cmNlcyAtIGZyZWUgU0dFIHJlc291cmNlcwogICoJQGFkYXA6IHRoZSBhZGFwdGVyCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmggYi9kcml2ZXJzL25ldC9jeGdiMy90M19jcGwuaAppbmRleCA5MTc5NzBlLi44NTJjMzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy90M19jcGwuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy90M19jcGwuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMgYi9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jCmluZGV4IDA0YzBlOTAuLjk2OGY2NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTE5NCwyMSArMTk0LDE4IEBACiBzdGF0aWMgdm9pZCBtaTFfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IGFkYXB0ZXJfaW5mbyAqYWkpCiB7CiAJdTMyIGNsa2RpdiA9IGFkYXAtPnBhcmFtcy52cGQuY2NsayAvICgyICogYWRhcC0+cGFyYW1zLnZwZC5tZGMpIC0gMTsKLQl1MzIgdmFsID0gRl9QUkVFTiB8IFZfTURJSU5WKGFpLT5tZGlpbnYpIHwgVl9NRElFTihhaS0+bWRpZW4pIHwKLQkgICAgVl9DTEtESVYoY2xrZGl2KTsKKwl1MzIgdmFsID0gRl9QUkVFTiB8IFZfQ0xLRElWKGNsa2Rpdik7CiAKLQlpZiAoIShhaS0+Y2FwcyAmIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwpKQotCQl2YWwgfD0gVl9TVCgxKTsKIAl0M193cml0ZV9yZWcoYWRhcCwgQV9NSTFfQ0ZHLCB2YWwpOwogfQogCi0jZGVmaW5lIE1ESU9fQVRURU1QVFMgMTAKKyNkZWZpbmUgTURJT19BVFRFTVBUUyAyMAogCiAvKgotICogTUkxIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBmb3IgZGlyZWN0LWFkZHJlc3NlZCBQSFlzLgorICogTUkxIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBmb3IgY2xhdXNlIDIyIFBIWXMuCiAgKi8KLXN0YXRpYyBpbnQgbWkxX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAotCQkgICAgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbHApCitzdGF0aWMgaW50IHQzX21pMV9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJICAgICAgIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50ICp2YWxwKQogewogCWludCByZXQ7CiAJdTMyIGFkZHIgPSBWX1JFR0FERFIocmVnX2FkZHIpIHwgVl9QSFlBRERSKHBoeV9hZGRyKTsKQEAgLTIxNywxNiArMjE0LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWRpb19sb2NrKTsKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIEFfTUkxX0NGRywgVl9TVChNX1NUKSwgVl9TVCgxKSk7CiAJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0FERFIsIGFkZHIpOwogCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9PUCwgVl9NRElfT1AoMikpOwotCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLCBNRElPX0FUVEVNUFRTLCAyMCk7CisJcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsIE1ESU9fQVRURU1QVFMsIDEwKTsKIAlpZiAoIXJldCkKIAkJKnZhbHAgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX01JMV9EQVRBKTsKIAltdXRleF91bmxvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtaTFfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAorc3RhdGljIGludCB0M19taTFfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAogCQkgICAgIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpbnQgcmV0OwpAQCAtMjM2LDM3ICsyMzQsNTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZhZGFwdGVyLT5tZGlvX2xvY2spOworCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgQV9NSTFfQ0ZHLCBWX1NUKE1fU1QpLCBWX1NUKDEpKTsKIAl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfQUREUiwgYWRkcik7CiAJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0RBVEEsIHZhbCk7CiAJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX09QLCBWX01ESV9PUCgxKSk7Ci0JcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsIE1ESU9fQVRURU1QVFMsIDIwKTsKKwlyZXQgPSB0M193YWl0X29wX2RvbmUoYWRhcHRlciwgQV9NSTFfT1AsIEZfQlVTWSwgMCwgTURJT19BVFRFTVBUUywgMTApOwogCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWRpb19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1kaW9fb3BzIG1pMV9tZGlvX29wcyA9IHsKLQltaTFfcmVhZCwKLQltaTFfd3JpdGUKKwl0M19taTFfcmVhZCwKKwl0M19taTFfd3JpdGUKIH07CiAKIC8qCisgKiBQZXJmb3JtcyB0aGUgYWRkcmVzcyBjeWNsZSBmb3IgY2xhdXNlIDQ1IFBIWXMuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBNRElPX0xPQ0sgaGVsZC4KKyAqLworc3RhdGljIGludCBtaTFfd3JfYWRkcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCSAgICAgICBpbnQgcmVnX2FkZHIpCit7CisJdTMyIGFkZHIgPSBWX1JFR0FERFIobW1kX2FkZHIpIHwgVl9QSFlBRERSKHBoeV9hZGRyKTsKKworCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgQV9NSTFfQ0ZHLCBWX1NUKE1fU1QpLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfQUREUiwgYWRkcik7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0RBVEEsIHJlZ19hZGRyKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfT1AsIFZfTURJX09QKDApKTsKKwlyZXR1cm4gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsCisJCQkgICAgICAgTURJT19BVFRFTVBUUywgMTApOworfQorCisvKgogICogTUkxIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBmb3IgaW5kaXJlY3QtYWRkcmVzc2VkIFBIWXMuCiAgKi8KIHN0YXRpYyBpbnQgbWkxX2V4dF9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKIAkJCWludCByZWdfYWRkciwgdW5zaWduZWQgaW50ICp2YWxwKQogewogCWludCByZXQ7Ci0JdTMyIGFkZHIgPSBWX1JFR0FERFIobW1kX2FkZHIpIHwgVl9QSFlBRERSKHBoeV9hZGRyKTsKIAogCW11dGV4X2xvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7Ci0JdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0FERFIsIGFkZHIpOwotCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9EQVRBLCByZWdfYWRkcik7Ci0JdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX09QLCBWX01ESV9PUCgwKSk7Ci0JcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsIE1ESU9fQVRURU1QVFMsIDIwKTsKKwlyZXQgPSBtaTFfd3JfYWRkcihhZGFwdGVyLCBwaHlfYWRkciwgbW1kX2FkZHIsIHJlZ19hZGRyKTsKIAlpZiAoIXJldCkgewogCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfT1AsIFZfTURJX09QKDMpKTsKIAkJcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsCi0JCQkJICAgICAgTURJT19BVFRFTVBUUywgMjApOworCQkJCSAgICAgIE1ESU9fQVRURU1QVFMsIDEwKTsKIAkJaWYgKCFyZXQpCiAJCQkqdmFscCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfTUkxX0RBVEEpOwogCX0KQEAgLTI3OCwxOCArMjkwLDE0IEBACiAJCQkgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCWludCByZXQ7Ci0JdTMyIGFkZHIgPSBWX1JFR0FERFIobW1kX2FkZHIpIHwgVl9QSFlBRERSKHBoeV9hZGRyKTsKIAogCW11dGV4X2xvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7Ci0JdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0FERFIsIGFkZHIpOwotCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9EQVRBLCByZWdfYWRkcik7Ci0JdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX09QLCBWX01ESV9PUCgwKSk7Ci0JcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsIE1ESU9fQVRURU1QVFMsIDIwKTsKKwlyZXQgPSBtaTFfd3JfYWRkcihhZGFwdGVyLCBwaHlfYWRkciwgbW1kX2FkZHIsIHJlZ19hZGRyKTsKIAlpZiAoIXJldCkgewogCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfREFUQSwgdmFsKTsKIAkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX09QLCBWX01ESV9PUCgxKSk7CiAJCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLAotCQkJCSAgICAgIE1ESU9fQVRURU1QVFMsIDIwKTsKKwkJCQkgICAgICBNRElPX0FUVEVNUFRTLCAxMCk7CiAJfQogCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWRpb19sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDAwLDYgKzQwOCwyOSBAQAogfQogCiAvKioKKyAqCXQzX3BoeV9hZHZlcnRpc2VfZmliZXIgLSBzZXQgZmliZXIgUEhZIGFkdmVydGlzZW1lbnQgcmVnaXN0ZXIKKyAqCUBwaHk6IHRoZSBQSFkgdG8gb3BlcmF0ZSBvbgorICoJQGFkdmVydDogYml0bWFwIG9mIGNhcGFiaWxpdGllcyB0aGUgUEhZIHNob3VsZCBhZHZlcnRpc2UKKyAqCisgKglTZXRzIGEgZmliZXIgUEhZJ3MgYWR2ZXJ0aXNlbWVudCByZWdpc3RlciB0byBhZHZlcnRpc2UgdGhlCisgKglyZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzLgorICovCitpbnQgdDNfcGh5X2FkdmVydGlzZV9maWJlcihzdHJ1Y3QgY3BoeSAqcGh5LCB1bnNpZ25lZCBpbnQgYWR2ZXJ0KQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKGFkdmVydCAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwMFhIQUxGOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMDBYRlVMTDsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFRF9QYXVzZSkKKwkJdmFsIHw9IEFEVkVSVElTRV8xMDAwWFBBVVNFOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTTsKKwlyZXR1cm4gbWRpb193cml0ZShwaHksIDAsIE1JSV9BRFZFUlRJU0UsIHZhbCk7Cit9CisKKy8qKgogICoJdDNfc2V0X3BoeV9zcGVlZF9kdXBsZXggLSBmb3JjZSBQSFkgc3BlZWQgYW5kIGR1cGxleAogICoJQHBoeTogdGhlIFBIWSB0byBvcGVyYXRlIG9uCiAgKglAc3BlZWQ6IHJlcXVlc3RlZCBQSFkgc3BlZWQKQEAgLTQzNCwyNyArNDY1LDUyIEBACiAJcmV0dXJuIG1kaW9fd3JpdGUocGh5LCAwLCBNSUlfQk1DUiwgY3RsKTsKIH0KIAoraW50IHQzX3BoeV9sYXNpX2ludHJfZW5hYmxlKHN0cnVjdCBjcGh5ICpwaHkpCit7CisJcmV0dXJuIG1kaW9fd3JpdGUocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBMQVNJX0NUUkwsIDEpOworfQorCitpbnQgdDNfcGh5X2xhc2lfaW50cl9kaXNhYmxlKHN0cnVjdCBjcGh5ICpwaHkpCit7CisJcmV0dXJuIG1kaW9fd3JpdGUocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBMQVNJX0NUUkwsIDApOworfQorCitpbnQgdDNfcGh5X2xhc2lfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXUzMiB2YWw7CisKKwlyZXR1cm4gbWRpb19yZWFkKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTEFTSV9TVEFULCAmdmFsKTsKK30KKworaW50IHQzX3BoeV9sYXNpX2ludHJfaGFuZGxlcihzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIExBU0lfU1RBVCwgJnN0YXR1cyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAoc3RhdHVzICYgMSkgPyAgY3BoeV9jYXVzZV9saW5rX2NoYW5nZSA6IDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvIHQzX2FkYXBfaW5mb1tdID0gewotCXsyLCAwLCAwLCAwLAorCXsyLCAwLAogCSBGX0dQSU8yX09FTiB8IEZfR1BJTzRfT0VOIHwKLQkgRl9HUElPMl9PVVRfVkFMIHwgRl9HUElPNF9PVVRfVkFMLCBGX0dQSU8zIHwgRl9HUElPNSwKLQkgMCwKKwkgRl9HUElPMl9PVVRfVkFMIHwgRl9HUElPNF9PVVRfVkFMLCB7IFNfR1BJTzMsIFNfR1BJTzUgfSwgMCwKIAkgJm1pMV9tZGlvX29wcywgIkNoZWxzaW8gUEU5MDAwIn0sCi0JezIsIDAsIDAsIDAsCisJezIsIDAsCiAJIEZfR1BJTzJfT0VOIHwgRl9HUElPNF9PRU4gfAotCSBGX0dQSU8yX09VVF9WQUwgfCBGX0dQSU80X09VVF9WQUwsIEZfR1BJTzMgfCBGX0dQSU81LAotCSAwLAorCSBGX0dQSU8yX09VVF9WQUwgfCBGX0dQSU80X09VVF9WQUwsIHsgU19HUElPMywgU19HUElPNSB9LCAwLAogCSAmbWkxX21kaW9fb3BzLCAiQ2hlbHNpbyBUMzAyIn0sCi0JezEsIDAsIDAsIDAsCisJezEsIDAsCiAJIEZfR1BJTzFfT0VOIHwgRl9HUElPNl9PRU4gfCBGX0dQSU83X09FTiB8IEZfR1BJTzEwX09FTiB8CiAJIEZfR1BJTzExX09FTiB8IEZfR1BJTzFfT1VUX1ZBTCB8IEZfR1BJTzZfT1VUX1ZBTCB8IEZfR1BJTzEwX09VVF9WQUwsCi0JIDAsIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQVVJLAorCSB7IDAgfSwgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUksCiAJICZtaTFfbWRpb19leHRfb3BzLCAiQ2hlbHNpbyBUMzEwIn0sCi0JezIsIDAsIDAsIDAsCisJezIsIDAsCiAJIEZfR1BJTzFfT0VOIHwgRl9HUElPMl9PRU4gfCBGX0dQSU80X09FTiB8IEZfR1BJTzVfT0VOIHwgRl9HUElPNl9PRU4gfAogCSBGX0dQSU83X09FTiB8IEZfR1BJTzEwX09FTiB8IEZfR1BJTzExX09FTiB8IEZfR1BJTzFfT1VUX1ZBTCB8Ci0JIEZfR1BJTzVfT1VUX1ZBTCB8IEZfR1BJTzZfT1VUX1ZBTCB8IEZfR1BJTzEwX09VVF9WQUwsIDAsCi0JIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQVVJLAorCSBGX0dQSU81X09VVF9WQUwgfCBGX0dQSU82X09VVF9WQUwgfCBGX0dQSU8xMF9PVVRfVkFMLAorCSB7IFNfR1BJTzksIFNfR1BJTzMgfSwgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUksCiAJICZtaTFfbWRpb19leHRfb3BzLCAiQ2hlbHNpbyBUMzIwIn0sCiB9OwogCkBAIC00NjcsMjggKzUyMywyMiBAQAogCXJldHVybiBpZCA8IEFSUkFZX1NJWkUodDNfYWRhcF9pbmZvKSA/ICZ0M19hZGFwX2luZm9baWRdIDogTlVMTDsKIH0KIAotI2RlZmluZSBDQVBTXzFHIChTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBcCi0JCSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9NSUkpCi0jZGVmaW5lIENBUFNfMTBHIChTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0FVSSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3J0X3R5cGVfaW5mbyBwb3J0X3R5cGVzW10gPSB7Ci0Je05VTEx9LAotCXt0M19hZWwxMDAyX3BoeV9wcmVwLCBDQVBTXzEwRyB8IFNVUFBPUlRFRF9GSUJSRSwKLQkgIjEwR0JBU0UtWFIifSwKLQl7dDNfdnNjODIxMV9waHlfcHJlcCwgQ0FQU18xRyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9JUlEsCi0JICIxMC8xMDAvMTAwMEJBU0UtVCJ9LAotCXtOVUxMLCBDQVBTXzFHIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0lSUSwKLQkgIjEwLzEwMC8xMDAwQkFTRS1UIn0sCi0Je3QzX3hhdWlfZGlyZWN0X3BoeV9wcmVwLCBDQVBTXzEwRyB8IFNVUFBPUlRFRF9UUCwgIjEwR0JBU0UtQ1g0In0sCi0Je05VTEwsIENBUFNfMTBHLCAiMTBHQkFTRS1LWDQifSwKLQl7dDNfcXQyMDQ1X3BoeV9wcmVwLCBDQVBTXzEwRyB8IFNVUFBPUlRFRF9UUCwgIjEwR0JBU0UtQ1g0In0sCi0Je3QzX2FlbDEwMDZfcGh5X3ByZXAsIENBUFNfMTBHIHwgU1VQUE9SVEVEX0ZJQlJFLAotCSAiMTBHQkFTRS1TUiJ9LAotCXtOVUxMLCBDQVBTXzEwRyB8IFNVUFBPUlRFRF9UUCwgIjEwR0JBU0UtQ1g0In0sCitzdHJ1Y3QgcG9ydF90eXBlX2luZm8geworCWludCAoKnBoeV9wcmVwKShzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCWludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICpvcHMpOwogfTsKIAotI3VuZGVmIENBUFNfMUcKLSN1bmRlZiBDQVBTXzEwRworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3J0X3R5cGVfaW5mbyBwb3J0X3R5cGVzW10gPSB7CisJeyBOVUxMIH0sCisJeyB0M19hZWwxMDAyX3BoeV9wcmVwIH0sCisJeyB0M192c2M4MjExX3BoeV9wcmVwIH0sCisJeyBOVUxMfSwKKwl7IHQzX3hhdWlfZGlyZWN0X3BoeV9wcmVwIH0sCisJeyB0M19hZWwyMDA1X3BoeV9wcmVwIH0sCisJeyB0M19xdDIwNDVfcGh5X3ByZXAgfSwKKwl7IHQzX2FlbDEwMDZfcGh5X3ByZXAgfSwKKwl7IE5VTEwgfSwKK307CiAKICNkZWZpbmUgVlBEX0VOVFJZKG5hbWUsIGxlbikgXAogCXU4IG5hbWUjI19rd29yZFsyXTsgdTggbmFtZSMjX2xlbjsgdTggbmFtZSMjX2RhdGFbbGVuXQpAQCAtMTEzMiw2ICsxMTgyLDE1IEBACiAKIAlwaHktPm9wcy0+Z2V0X2xpbmtfc3RhdHVzKHBoeSwgJmxpbmtfb2ssICZzcGVlZCwgJmR1cGxleCwgJmZjKTsKIAorCWlmIChsYy0+cmVxdWVzdGVkX2ZjICYgUEFVU0VfQVVUT05FRykKKwkJZmMgJj0gbGMtPnJlcXVlc3RlZF9mYzsKKwllbHNlCisJCWZjID0gbGMtPnJlcXVlc3RlZF9mYyAmIChQQVVTRV9SWCB8IFBBVVNFX1RYKTsKKworCWlmIChsaW5rX29rID09IGxjLT5saW5rX29rICYmIHNwZWVkID09IGxjLT5zcGVlZCAmJgorCSAgICBkdXBsZXggPT0gbGMtPmR1cGxleCAmJiBmYyA9PSBsYy0+ZmMpCisJCXJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyBjaGFuZ2VkICovCisKIAlpZiAobGlua19vayAhPSBsYy0+bGlua19vayAmJiBhZGFwdGVyLT5wYXJhbXMucmV2ID4gMCAmJgogCSAgICB1c2VzX3hhdWkoYWRhcHRlcikpIHsKIAkJaWYgKGxpbmtfb2spCkBAIC0xMTQyLDEwICsxMjAxLDYgQEAKIAlsYy0+bGlua19vayA9IGxpbmtfb2s7CiAJbGMtPnNwZWVkID0gc3BlZWQgPCAwID8gU1BFRURfSU5WQUxJRCA6IHNwZWVkOwogCWxjLT5kdXBsZXggPSBkdXBsZXggPCAwID8gRFVQTEVYX0lOVkFMSUQgOiBkdXBsZXg7Ci0JaWYgKGxjLT5yZXF1ZXN0ZWRfZmMgJiBQQVVTRV9BVVRPTkVHKQotCQlmYyAmPSBsYy0+cmVxdWVzdGVkX2ZjOwotCWVsc2UKLQkJZmMgPSBsYy0+cmVxdWVzdGVkX2ZjICYgKFBBVVNFX1JYIHwgUEFVU0VfVFgpOwogCiAJaWYgKGxpbmtfb2sgJiYgc3BlZWQgPj0gMCAmJiBsYy0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQkvKiBTZXQgTUFDIHNwZWVkLCBkdXBsZXgsIGFuZCBmbG93IGNvbnRyb2wgdG8gbWF0Y2ggUEhZLiAqLwpAQCAtMTE5MSw3ICsxMjQ2LDYgQEAKIAkJCQkJCSAgIGZjKTsKIAkJCS8qIEFsc28gZGlzYWJsZXMgYXV0b25lZyAqLwogCQkJcGh5LT5vcHMtPnNldF9zcGVlZF9kdXBsZXgocGh5LCBsYy0+c3BlZWQsIGxjLT5kdXBsZXgpOwotCQkJcGh5LT5vcHMtPnJlc2V0KHBoeSwgMCk7CiAJCX0gZWxzZQogCQkJcGh5LT5vcHMtPmF1dG9uZWdfZW5hYmxlKHBoeSk7CiAJfSBlbHNlIHsKQEAgLTEyMjEsNyArMTI3NSw3IEBACiAJdW5zaWduZWQgaW50IG1hc2s7CS8qIGJpdHMgdG8gY2hlY2sgaW4gaW50ZXJydXB0IHN0YXR1cyAqLwogCWNvbnN0IGNoYXIgKm1zZzsJLyogbWVzc2FnZSB0byBwcmludCBvciBOVUxMICovCiAJc2hvcnQgc3RhdF9pZHg7CQkvKiBzdGF0IGNvdW50ZXIgdG8gaW5jcmVtZW50IG9yIC0xICovCi0JdW5zaWduZWQgc2hvcnQgZmF0YWw6MTsJLyogd2hldGhlciB0aGUgY29uZGl0aW9uIHJlcG9ydGVkIGlzIGZhdGFsICovCisJdW5zaWduZWQgc2hvcnQgZmF0YWw7CS8qIHdoZXRoZXIgdGhlIGNvbmRpdGlvbiByZXBvcnRlZCBpcyBmYXRhbCAqLwogfTsKIAogLyoqCkBAIC0xNjgyLDI1ICsxNzM2LDIzIEBACiAgKi8KIGludCB0M19waHlfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotCXUzMiBtYXNrLCBncGkgPSBhZGFwdGVyX2luZm8oYWRhcHRlciktPmdwaW9faW50cjsKIAl1MzIgaSwgY2F1c2UgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1QzREJHX0lOVF9DQVVTRSk7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKIAkJc3RydWN0IHBvcnRfaW5mbyAqcCA9IGFkYXAycGluZm8oYWRhcHRlciwgaSk7CiAKLQkJbWFzayA9IGdwaSAtIChncGkgJiAoZ3BpIC0gMSkpOwotCQlncGkgLT0gbWFzazsKLQotCQlpZiAoIShwLT5wb3J0X3R5cGUtPmNhcHMgJiBTVVBQT1JURURfSVJRKSkKKwkJaWYgKCEocC0+cGh5LmNhcHMgJiBTVVBQT1JURURfSVJRKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChjYXVzZSAmIG1hc2spIHsKKwkJaWYgKGNhdXNlICYgKDEgPDwgYWRhcHRlcl9pbmZvKGFkYXB0ZXIpLT5ncGlvX2ludHJbaV0pKSB7CiAJCQlpbnQgcGh5X2NhdXNlID0gcC0+cGh5Lm9wcy0+aW50cl9oYW5kbGVyKCZwLT5waHkpOwogCiAJCQlpZiAocGh5X2NhdXNlICYgY3BoeV9jYXVzZV9saW5rX2NoYW5nZSkKIAkJCQl0M19saW5rX2NoYW5nZWQoYWRhcHRlciwgaSk7CiAJCQlpZiAocGh5X2NhdXNlICYgY3BoeV9jYXVzZV9maWZvX2Vycm9yKQogCQkJCXAtPnBoeS5maWZvX2Vycm9ycysrOworCQkJaWYgKHBoeV9jYXVzZSAmIGNwaHlfY2F1c2VfbW9kdWxlX2NoYW5nZSkKKwkJCQl0M19vc19waHltb2RfY2hhbmdlZChhZGFwdGVyLCBpKTsKIAkJfQogCX0KIApAQCAtMTc2Myw2ICsxODE1LDE3IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY19ncGlvX2ludHIoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJdW5zaWduZWQgaW50IGksIGdwaV9pbnRyID0gMDsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkKKwkJaWYgKChhZGFwMnBpbmZvKGFkYXAsIGkpLT5waHkuY2FwcyAmIFNVUFBPUlRFRF9JUlEpICYmCisJCSAgICBhZGFwdGVyX2luZm8oYWRhcCktPmdwaW9faW50cltpXSkKKwkJCWdwaV9pbnRyIHw9IDEgPDwgYWRhcHRlcl9pbmZvKGFkYXApLT5ncGlvX2ludHJbaV07CisJcmV0dXJuIGdwaV9pbnRyOworfQorCiAvKioKICAqCXQzX2ludHJfZW5hYmxlIC0gZW5hYmxlIGludGVycnVwdHMKICAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciB3aG9zZSBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkCkBAIC0xODA1LDEwICsxODY4LDggQEAKIAkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVUxQVFhfSU5UX0VOQUJMRSwgVUxQVFhfSU5UUl9NQVNLKTsKIAl9CiAKLQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9UM0RCR19HUElPX0FDVF9MT1csCi0JCSAgICAgYWRhcHRlcl9pbmZvKGFkYXB0ZXIpLT5ncGlvX2ludHIpOwotCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1QzREJHX0lOVF9FTkFCTEUsCi0JCSAgICAgYWRhcHRlcl9pbmZvKGFkYXB0ZXIpLT5ncGlvX2ludHIpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1QzREJHX0lOVF9FTkFCTEUsIGNhbGNfZ3Bpb19pbnRyKGFkYXB0ZXIpKTsKKwogCWlmIChpc19wY2llKGFkYXB0ZXIpKQogCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9QQ0lFX0lOVF9FTkFCTEUsIFBDSUVfSU5UUl9NQVNLKTsKIAllbHNlCkBAIC0zMzI5LDYgKzMzOTAsOCBAQAogCWluaXRfaHdfZm9yX2F2YWlsX3BvcnRzKGFkYXB0ZXIsIGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpOwogCXQzX3NnZV9pbml0KGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMuc2dlKTsKIAorCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1QzREJHX0dQSU9fQUNUX0xPVywgY2FsY19ncGlvX2ludHIoYWRhcHRlcikpOworCiAJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfQ0lNX0hPU1RfQUNDX0RBVEEsIHZwZC0+dWNsayB8IGZ3X3BhcmFtcyk7CiAJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfQ0lNX0JPT1RfQ0ZHLAogCQkgICAgIFZfQk9PVEFERFIoRldfRkxBU0hfQk9PVF9BRERSID4+IDIpKTsKQEAgLTM0ODgsNyArMzU1MSw3IEBACiAgKiBPbGRlciBQQ0llIGNhcmRzIGxvc2UgdGhlaXIgY29uZmlnIHNwYWNlIGR1cmluZyByZXNldCwgUENJLVgKICAqIG9uZXMgZG9uJ3QuCiAgKi8KLXN0YXRpYyBpbnQgdDNfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK2ludCB0M19yZXNldF9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWludCBpLCBzYXZlX2FuZF9yZXN0b3JlX3BjaWUgPQogCSAgICBhZGFwdGVyLT5wYXJhbXMucmV2IDwgVDNfUkVWX0IyICYmIGlzX3BjaWUoYWRhcHRlcik7CkBAIC0zNTU2LDcgKzM2MTksNyBAQAogCQkgICAgaW50IHJlc2V0KQogewogCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGksIGogPSAwOworCXVuc2lnbmVkIGludCBpLCBqID0gLTE7CiAKIAlnZXRfcGNpX21vZGUoYWRhcHRlciwgJmFkYXB0ZXItPnBhcmFtcy5wY2kpOwogCkBAIC0zNjIwLDE2ICszNjgzLDE4IEBACiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKIAkJdTggaHdfYWRkcls2XTsKKwkJY29uc3Qgc3RydWN0IHBvcnRfdHlwZV9pbmZvICpwdGk7CiAJCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpOwogCi0JCXdoaWxlICghYWRhcHRlci0+cGFyYW1zLnZwZC5wb3J0X3R5cGVbal0pCi0JCQkrK2o7CisJCXdoaWxlICghYWRhcHRlci0+cGFyYW1zLnZwZC5wb3J0X3R5cGVbKytqXSkKKwkJCTsKIAotCQlwLT5wb3J0X3R5cGUgPSAmcG9ydF90eXBlc1thZGFwdGVyLT5wYXJhbXMudnBkLnBvcnRfdHlwZVtqXV07Ci0JCXAtPnBvcnRfdHlwZS0+cGh5X3ByZXAoJnAtPnBoeSwgYWRhcHRlciwgYWktPnBoeV9iYXNlX2FkZHIgKyBqLAotCQkJCSAgICAgICBhaS0+bWRpb19vcHMpOworCQlwdGkgPSAmcG9ydF90eXBlc1thZGFwdGVyLT5wYXJhbXMudnBkLnBvcnRfdHlwZVtqXV07CisJCXJldCA9IHB0aS0+cGh5X3ByZXAoJnAtPnBoeSwgYWRhcHRlciwgYWktPnBoeV9iYXNlX2FkZHIgKyBqLAorCQkJCSAgICBhaS0+bWRpb19vcHMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJbWFjX3ByZXAoJnAtPm1hYywgYWRhcHRlciwgaik7Ci0JCSsrajsKIAogCQkvKgogCQkgKiBUaGUgVlBEIEVFUFJPTSBzdG9yZXMgdGhlIGJhc2UgRXRoZXJuZXQgYWRkcmVzcyBmb3IgdGhlCkBAIC0zNjQzLDkgKzM3MDgsOSBAQAogCQkgICAgICAgRVRIX0FMRU4pOwogCQltZW1jcHkoYWRhcHRlci0+cG9ydFtpXS0+cGVybV9hZGRyLCBod19hZGRyLAogCQkgICAgICAgRVRIX0FMRU4pOwotCQlpbml0X2xpbmtfY29uZmlnKCZwLT5saW5rX2NvbmZpZywgcC0+cG9ydF90eXBlLT5jYXBzKTsKKwkJaW5pdF9saW5rX2NvbmZpZygmcC0+bGlua19jb25maWcsIHAtPnBoeS5jYXBzKTsKIAkJcC0+cGh5Lm9wcy0+cG93ZXJfZG93bigmcC0+cGh5LCAxKTsKLQkJaWYgKCEocC0+cG9ydF90eXBlLT5jYXBzICYgU1VQUE9SVEVEX0lSUSkpCisJCWlmICghKHAtPnBoeS5jYXBzICYgU1VQUE9SVEVEX0lSUSkpCiAJCQlhZGFwdGVyLT5wYXJhbXMubGlua3BvbGxfcGVyaW9kID0gMTA7CiAJfQogCkBAIC0zNjYxLDcgKzM3MjYsNyBAQAogaW50IHQzX3JlcGxheV9wcmVwX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJY29uc3Qgc3RydWN0IGFkYXB0ZXJfaW5mbyAqYWkgPSBhZGFwdGVyLT5wYXJhbXMuaW5mbzsKLQl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CisJdW5zaWduZWQgaW50IGksIGogPSAtMTsKIAlpbnQgcmV0OwogCiAJZWFybHlfaHdfaW5pdChhZGFwdGVyLCBhaSk7CkBAIC0zNjcwLDE1ICszNzM1LDE3IEBACiAJCXJldHVybiByZXQ7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJY29uc3Qgc3RydWN0IHBvcnRfdHlwZV9pbmZvICpwdGk7CiAJCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpOwotCQl3aGlsZSAoIWFkYXB0ZXItPnBhcmFtcy52cGQucG9ydF90eXBlW2pdKQotCQkJKytqOwogCi0JCXAtPnBvcnRfdHlwZS0+cGh5X3ByZXAoJnAtPnBoeSwgYWRhcHRlciwgYWktPnBoeV9iYXNlX2FkZHIgKyBqLAotCQkJCQlhaS0+bWRpb19vcHMpOworCQl3aGlsZSAoIWFkYXB0ZXItPnBhcmFtcy52cGQucG9ydF90eXBlWysral0pCisJCQk7CiAKKwkJcHRpID0gJnBvcnRfdHlwZXNbYWRhcHRlci0+cGFyYW1zLnZwZC5wb3J0X3R5cGVbal1dOworCQlyZXQgPSBwdGktPnBoeV9wcmVwKCZwLT5waHksIGFkYXB0ZXIsIHAtPnBoeS5hZGRyLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCXAtPnBoeS5vcHMtPnBvd2VyX2Rvd24oJnAtPnBoeSwgMSk7Ci0JCSsrajsKIAl9CiAKIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNjZGV2LmggYi9kcml2ZXJzL25ldC9jeGdiMy90M2NkZXYuaAppbmRleCAwYTIxY2ZiLi5iZTU1ZTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy90M2NkZXYuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy90M2NkZXYuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBDaGVsc2lvIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmgKaW5kZXggMjlkYjcxMS4uYmI4Njk4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3ZlcnNpb24uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgRFJWX0RFU0MgIkNoZWxzaW8gVDMgTmV0d29yayBEcml2ZXIiCiAjZGVmaW5lIERSVl9OQU1FICJjeGdiMyIKIC8qIERyaXZlciB2ZXJzaW9uICovCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjAta28iCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjEuMC1rbyIKIAogLyogRmlybXdhcmUgdmVyc2lvbiAqLwogI2RlZmluZSBGV19WRVJTSU9OX01BSk9SIDcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3ZzYzgyMTEuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3ZzYzgyMTEuYwppbmRleCBlZWU0Mjg1Li4zM2Y5NTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy92c2M4MjExLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdnNjODIxMS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMzMsMjggKzMzLDQwIEBACiAKIC8qIFZTQzgyMTEgUEhZIHNwZWNpZmljIHJlZ2lzdGVycy4gKi8KIGVudW0geworCVZTQzgyMTFfU0lHREVUX0NUUkwgPSAxOSwKKwlWU0M4MjExX0VYVF9DVFJMID0gMjMsCiAJVlNDODIxMV9JTlRSX0VOQUJMRSA9IDI1LAogCVZTQzgyMTFfSU5UUl9TVEFUVVMgPSAyNiwKKwlWU0M4MjExX0xFRF9DVFJMID0gMjcsCiAJVlNDODIxMV9BVVhfQ1RSTF9TVEFUID0gMjgsCisJVlNDODIxMV9FWFRfUEFHRV9BWFMgPSAzMSwKIH07CiAKIGVudW0gewogCVZTQ19JTlRSX1JYX0VSUiA9IDEgPDwgMCwKLQlWU0NfSU5UUl9NU19FUlIgPSAxIDw8IDEsCS8qIG1hc3Rlci9zbGF2ZSByZXNvbHV0aW9uIGVycm9yICovCi0JVlNDX0lOVFJfQ0FCTEUgPSAxIDw8IDIsCS8qIGNhYmxlIGltcGFpcm1lbnQgKi8KLQlWU0NfSU5UUl9GQUxTRV9DQVJSID0gMSA8PCAzLAkvKiBmYWxzZSBjYXJyaWVyICovCi0JVlNDX0lOVFJfTUVESUFfQ0hHID0gMSA8PCA0LAkvKiBBTVMgbWVkaWEgY2hhbmdlICovCi0JVlNDX0lOVFJfUlhfRklGTyA9IDEgPDwgNSwJLyogUnggRklGTyBvdmVyL3VuZGVyZmxvdyAqLwotCVZTQ19JTlRSX1RYX0ZJRk8gPSAxIDw8IDYsCS8qIFR4IEZJRk8gb3Zlci91bmRlcmZsb3cgKi8KLQlWU0NfSU5UUl9ERVNDUkFNQkwgPSAxIDw8IDcsCS8qIGRlc2NyYW1ibGVyIGxvY2stbG9zdCAqLwotCVZTQ19JTlRSX1NZTUJPTF9FUlIgPSAxIDw8IDgsCS8qIHN5bWJvbCBlcnJvciAqLwotCVZTQ19JTlRSX05FR19ET05FID0gMSA8PCAxMCwJLyogYXV0b25lZyBkb25lICovCi0JVlNDX0lOVFJfTkVHX0VSUiA9IDEgPDwgMTEsCS8qIGF1dG9uZWcgZXJyb3IgKi8KLQlWU0NfSU5UUl9MSU5LX0NIRyA9IDEgPDwgMTMsCS8qIGxpbmsgY2hhbmdlICovCi0JVlNDX0lOVFJfRU5BQkxFID0gMSA8PCAxNSwJLyogaW50ZXJydXB0IGVuYWJsZSAqLworCVZTQ19JTlRSX01TX0VSUiA9IDEgPDwgMSwgIC8qIG1hc3Rlci9zbGF2ZSByZXNvbHV0aW9uIGVycm9yICovCisJVlNDX0lOVFJfQ0FCTEUgPSAxIDw8IDIsICAvKiBjYWJsZSBpbXBhaXJtZW50ICovCisJVlNDX0lOVFJfRkFMU0VfQ0FSUiA9IDEgPDwgMywgIC8qIGZhbHNlIGNhcnJpZXIgKi8KKwlWU0NfSU5UUl9NRURJQV9DSEcgPSAxIDw8IDQsICAvKiBBTVMgbWVkaWEgY2hhbmdlICovCisJVlNDX0lOVFJfUlhfRklGTyA9IDEgPDwgNSwgIC8qIFJ4IEZJRk8gb3Zlci91bmRlcmZsb3cgKi8KKwlWU0NfSU5UUl9UWF9GSUZPID0gMSA8PCA2LCAgLyogVHggRklGTyBvdmVyL3VuZGVyZmxvdyAqLworCVZTQ19JTlRSX0RFU0NSQU1CTCA9IDEgPDwgNywgIC8qIGRlc2NyYW1ibGVyIGxvY2stbG9zdCAqLworCVZTQ19JTlRSX1NZTUJPTF9FUlIgPSAxIDw8IDgsICAvKiBzeW1ib2wgZXJyb3IgKi8KKwlWU0NfSU5UUl9ORUdfRE9ORSA9IDEgPDwgMTAsIC8qIGF1dG9uZWcgZG9uZSAqLworCVZTQ19JTlRSX05FR19FUlIgPSAxIDw8IDExLCAvKiBhdXRvbmVnIGVycm9yICovCisJVlNDX0lOVFJfRFBMWF9DSEcgPSAxIDw8IDEyLCAvKiBkdXBsZXggY2hhbmdlICovCisJVlNDX0lOVFJfTElOS19DSEcgPSAxIDw8IDEzLCAvKiBsaW5rIGNoYW5nZSAqLworCVZTQ19JTlRSX1NQRF9DSEcgPSAxIDw8IDE0LCAvKiBzcGVlZCBjaGFuZ2UgKi8KKwlWU0NfSU5UUl9FTkFCTEUgPSAxIDw8IDE1LCAvKiBpbnRlcnJ1cHQgZW5hYmxlICovCit9OworCitlbnVtIHsKKwlWU0NfQ1RSTF9DTEFVU0UzN19WSUVXID0gMSA8PCA0LCAgIC8qIFN3aXRjaCB0byBDbGF1c2UgMzcgdmlldyAqLworCVZTQ19DVFJMX01FRElBX01PREVfSEkgPSAweGYwMDAgICAgLyogSGlnaCBwYXJ0IG9mIG1lZGlhIG1vZGUgc2VsZWN0ICovCiB9OwogCiAjZGVmaW5lIENGR19DSEdfSU5UUl9NQVNLIChWU0NfSU5UUl9MSU5LX0NIRyB8IFZTQ19JTlRSX05FR19FUlIgfCBcCisJCQkgICBWU0NfSU5UUl9EUExYX0NIRyB8IFZTQ19JTlRSX1NQRF9DSEcgfCBcCiAJIAkJICAgVlNDX0lOVFJfTkVHX0RPTkUpCiAjZGVmaW5lIElOVFJfTUFTSyAoQ0ZHX0NIR19JTlRSX01BU0sgfCBWU0NfSU5UUl9UWF9GSUZPIHwgVlNDX0lOVFJfUlhfRklGTyB8IFwKIAkJICAgVlNDX0lOVFJfRU5BQkxFKQpAQCAtMTg0LDYgKzE5NiwxMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2c2M4MjExX2dldF9saW5rX3N0YXR1c19maWJlcihzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50ICpsaW5rX29rLAorCQkJCQkgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJdW5zaWduZWQgaW50IGJtY3IsIHN0YXR1cywgbHBhLCBhZHY7CisJaW50IGVyciwgc3AgPSAtMSwgZHBseCA9IC0xLCBwYXVzZSA9IDA7CisKKwllcnIgPSBtZGlvX3JlYWQoY3BoeSwgMCwgTUlJX0JNQ1IsICZibWNyKTsKKwlpZiAoIWVycikKKwkJZXJyID0gbWRpb19yZWFkKGNwaHksIDAsIE1JSV9CTVNSLCAmc3RhdHVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGxpbmtfb2spIHsKKwkJLyoKKwkJICogQk1TUl9MU1RBVFVTIGlzIGxhdGNoLWxvdywgc28gaWYgaXQgaXMgMCB3ZSBuZWVkIHRvIHJlYWQgaXQKKwkJICogb25jZSBtb3JlIHRvIGdldCB0aGUgY3VycmVudCBsaW5rIHN0YXRlLgorCQkgKi8KKwkJaWYgKCEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkKKwkJCWVyciA9IG1kaW9fcmVhZChjcGh5LCAwLCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkqbGlua19vayA9IChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpICE9IDA7CisJfQorCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgeworCQlkcGx4ID0gKGJtY3IgJiBCTUNSX0ZVTExEUExYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCWlmIChibWNyICYgQk1DUl9TUEVFRDEwMDApCisJCQlzcCA9IFNQRUVEXzEwMDA7CisJCWVsc2UgaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKQorCQkJc3AgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXNwID0gU1BFRURfMTA7CisJfSBlbHNlIGlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgeworCQllcnIgPSBtZGlvX3JlYWQoY3BoeSwgMCwgTUlJX0xQQSwgJmxwYSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gbWRpb19yZWFkKGNwaHksIDAsIE1JSV9BRFZFUlRJU0UsICZhZHYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoYWR2ICYgbHBhICYgQURWRVJUSVNFXzEwMDBYRlVMTCkgeworCQkJZHBseCA9IERVUExFWF9GVUxMOworCQkJc3AgPSBTUEVFRF8xMDAwOworCQl9IGVsc2UgaWYgKGFkdiAmIGxwYSAmIEFEVkVSVElTRV8xMDAwWEhBTEYpIHsKKwkJCWRwbHggPSBEVVBMRVhfSEFMRjsKKwkJCXNwID0gU1BFRURfMTAwMDsKKwkJfQorCisJCWlmIChmYyAmJiBkcGx4ID09IERVUExFWF9GVUxMKSB7CisJCQlpZiAobHBhICYgYWR2ICYgQURWRVJUSVNFXzEwMDBYUEFVU0UpCisJCQkJcGF1c2UgPSBQQVVTRV9SWCB8IFBBVVNFX1RYOworCQkJZWxzZSBpZiAoKGxwYSAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKSAmJgorCQkJCSAoYWR2ICYgbHBhICYgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0pKQorCQkJCXBhdXNlID0gUEFVU0VfVFg7CisJCQllbHNlIGlmICgobHBhICYgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0pICYmCisJCQkJIChhZHYgJiBBRFZFUlRJU0VfMTAwMFhQQVVTRSkpCisJCQkJcGF1c2UgPSBQQVVTRV9SWDsKKwkJfQorCX0KKwlpZiAoc3BlZWQpCisJCSpzcGVlZCA9IHNwOworCWlmIChkdXBsZXgpCisJCSpkdXBsZXggPSBkcGx4OworCWlmIChmYykKKwkJKmZjID0gcGF1c2U7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmFibGUvZGlzYWJsZSBhdXRvIE1ESS9NREktWCBpbiBmb3JjZWQgbGluayBzcGVlZCBtb2RlLgorICovCitzdGF0aWMgaW50IHZzYzgyMTFfc2V0X2F1dG9tZGkoc3RydWN0IGNwaHkgKnBoeSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbWRpb193cml0ZShwaHksIDAsIFZTQzgyMTFfRVhUX1BBR0VfQVhTLCAweDUyYjUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtZGlvX3dyaXRlKHBoeSwgMCwgMTgsIDB4MTIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtZGlvX3dyaXRlKHBoeSwgMCwgMTcsIGVuYWJsZSA/IDB4MjgwMyA6IDB4MzAwMyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG1kaW9fd3JpdGUocGh5LCAwLCAxNiwgMHg4N2ZhKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbWRpb193cml0ZShwaHksIDAsIFZTQzgyMTFfRVhUX1BBR0VfQVhTLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2c2M4MjExX3NldF9zcGVlZF9kdXBsZXgoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCWludCBlcnI7CisKKwllcnIgPSB0M19zZXRfcGh5X3NwZWVkX2R1cGxleChwaHksIHNwZWVkLCBkdXBsZXgpOworCWlmICghZXJyKQorCQllcnIgPSB2c2M4MjExX3NldF9hdXRvbWRpKHBoeSwgMSk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCB2c2M4MjExX3Bvd2VyX2Rvd24oc3RydWN0IGNwaHkgKmNwaHksIGludCBlbmFibGUpCiB7CiAJcmV0dXJuIHQzX21kaW9fY2hhbmdlX2JpdHMoY3BoeSwgMCwgTUlJX0JNQ1IsIEJNQ1JfUERPV04sCkBAIC0yMjEsOCArMzM5LDY2IEBACiAJLnBvd2VyX2Rvd24gPSB2c2M4MjExX3Bvd2VyX2Rvd24sCiB9OwogCi12b2lkIHQzX3ZzYzgyMTFfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQorc3RhdGljIHN0cnVjdCBjcGh5X29wcyB2c2M4MjExX2ZpYmVyX29wcyA9IHsKKwkucmVzZXQgPSB2c2M4MjExX3Jlc2V0LAorCS5pbnRyX2VuYWJsZSA9IHZzYzgyMTFfaW50cl9lbmFibGUsCisJLmludHJfZGlzYWJsZSA9IHZzYzgyMTFfaW50cl9kaXNhYmxlLAorCS5pbnRyX2NsZWFyID0gdnNjODIxMV9pbnRyX2NsZWFyLAorCS5pbnRyX2hhbmRsZXIgPSB2c2M4MjExX2ludHJfaGFuZGxlciwKKwkuYXV0b25lZ19lbmFibGUgPSB2c2M4MjExX2F1dG9uZWdfZW5hYmxlLAorCS5hdXRvbmVnX3Jlc3RhcnQgPSB2c2M4MjExX2F1dG9uZWdfcmVzdGFydCwKKwkuYWR2ZXJ0aXNlID0gdDNfcGh5X2FkdmVydGlzZV9maWJlciwKKwkuc2V0X3NwZWVkX2R1cGxleCA9IHQzX3NldF9waHlfc3BlZWRfZHVwbGV4LAorCS5nZXRfbGlua19zdGF0dXMgPSB2c2M4MjExX2dldF9saW5rX3N0YXR1c19maWJlciwKKwkucG93ZXJfZG93biA9IHZzYzgyMTFfcG93ZXJfZG93biwKK307CisKK2ludCB0M192c2M4MjExX3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQogewotCWNwaHlfaW5pdChwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmdnNjODIxMV9vcHMsIG1kaW9fb3BzKTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCB2YWw7CisKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJnZzYzgyMTFfb3BzLCBtZGlvX29wcywKKwkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX01JSSB8CisJCSAgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0lSUSwgIjEwLzEwMC8xMDAwQkFTRS1UIik7CisJbXNsZWVwKDIwKTsgICAgICAgLyogUEhZIG5lZWRzIH4xMG1zIHRvIHN0YXJ0IHJlc3BvbmRpbmcgdG8gTURJTyAqLworCisJZXJyID0gbWRpb19yZWFkKHBoeSwgMCwgVlNDODIxMV9FWFRfQ1RSTCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAodmFsICYgVlNDX0NUUkxfTUVESUFfTU9ERV9ISSkgeworCQkvKiBjb3BwZXIgaW50ZXJmYWNlLCBqdXN0IG5lZWQgdG8gY29uZmlndXJlIHRoZSBMRURzICovCisJCXJldHVybiBtZGlvX3dyaXRlKHBoeSwgMCwgVlNDODIxMV9MRURfQ1RSTCwgMHgxMDApOworCX0KKworCXBoeS0+Y2FwcyA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJICAgIFNVUFBPUlRFRF9NSUkgfCBTVVBQT1JURURfRklCUkUgfCBTVVBQT1JURURfSVJROworCXBoeS0+ZGVzYyA9ICIxMDAwQkFTRS1YIjsKKwlwaHktPm9wcyA9ICZ2c2M4MjExX2ZpYmVyX29wczsKKworCWVyciA9IG1kaW9fd3JpdGUocGh5LCAwLCBWU0M4MjExX0VYVF9QQUdFX0FYUywgMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG1kaW9fd3JpdGUocGh5LCAwLCBWU0M4MjExX1NJR0RFVF9DVFJMLCAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbWRpb193cml0ZShwaHksIDAsIFZTQzgyMTFfRVhUX1BBR0VfQVhTLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbWRpb193cml0ZShwaHksIDAsIFZTQzgyMTFfRVhUX0NUUkwsCisJCQkgdmFsIHwgVlNDX0NUUkxfQ0xBVVNFMzdfVklFVyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHZzYzgyMTFfcmVzZXQocGh5LCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdWRlbGF5KDUpOyAvKiBkZWxheSBhZnRlciByZXNldCBiZWZvcmUgbmV4dCBTTUkgKi8KKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3hnbWFjLmMgYi9kcml2ZXJzL25ldC9jeGdiMy94Z21hYy5jCmluZGV4IGZmZGMwYTEuLjlkNzc4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3hnbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMveGdtYWMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCA0NTMxMTVhLi4zZDY5ZmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKICNkZWZpbmUgRFBSSU5USyhubGV2ZWwsIGtsZXZlbCwgZm10LCBhcmdzLi4uKSBcCiAJKHZvaWQpKChORVRJRl9NU0dfIyNubGV2ZWwgJiBuaWMtPm1zZ19lbmFibGUpICYmIFwKIAlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIG5pYy0+bmV0ZGV2LT5uYW1lLCBcCi0JCV9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpKQorCQlfX2Z1bmNfXyAsICMjIGFyZ3MpKQogCiAjZGVmaW5lIElOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRShkZXZpY2VfaWQsIGljaCkge1wKIAlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZpY2VfaWQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFwKQEAgLTI3MzgsOSArMjczOCw3IEBACiAJCW5pYy0+ZmxhZ3MgfD0gd29sX21hZ2ljOwogCiAJLyogYWNrIGFueSBwZW5kaW5nIHdha2UgZXZlbnRzLCBkaXNhYmxlIFBNRSAqLwotCWVyciA9IHBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCAwKTsKLQlpZiAoZXJyKQotCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFcnJvciBjbGVhcmluZyB3YWtlIGV2ZW50XG4iKTsKKwlwY2lfcG1lX2FjdGl2ZShwZGV2LCBmYWxzZSk7CiAKIAlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAlpZigoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCAxOWUzMTdlLi42MmY2Mjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTE1NSw4ICsxNTUsNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgRTEwMDBfTU5HX1ZMQU5fTk9ORSAoLTEpCi0vKiBOdW1iZXIgb2YgcGFja2V0IHNwbGl0IGRhdGEgYnVmZmVycyAobm90IGluY2x1ZGluZyB0aGUgaGVhZGVyIGJ1ZmZlcikgKi8KLSNkZWZpbmUgUFNfUEFHRV9CVUZGRVJTIChNQVhfUFNfQlVGRkVSUyAtIDEpCiAKIC8qIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCiAgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIgKi8KQEAgLTE2OCwxNCArMTY2LDYgQEAKIAl1MTYgbmV4dF90b193YXRjaDsKIH07CiAKLXN0cnVjdCBlMTAwMF9wc19wYWdlIHsKLQlzdHJ1Y3QgcGFnZSAqcHNfcGFnZVtQU19QQUdFX0JVRkZFUlNdOwotfTsKLQotc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hIHsKLQl1NjQgcHNfcGFnZV9kbWFbUFNfUEFHRV9CVUZGRVJTXTsKLX07Ci0KIHN0cnVjdCBlMTAwMF90eF9yaW5nIHsKIAkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCiAJdm9pZCAqZGVzYzsKQEAgLTIxMyw5ICsyMDMsNiBAQAogCXVuc2lnbmVkIGludCBuZXh0X3RvX2NsZWFuOwogCS8qIGFycmF5IG9mIGJ1ZmZlciBpbmZvcm1hdGlvbiBzdHJ1Y3RzICovCiAJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87Ci0JLyogYXJyYXlzIG9mIHBhZ2UgaW5mb3JtYXRpb24gZm9yIHBhY2tldCBzcGxpdCAqLwotCXN0cnVjdCBlMTAwMF9wc19wYWdlICpwc19wYWdlOwotCXN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSAqcHNfcGFnZV9kbWE7CiAKIAkvKiBjcHUgZm9yIHJ4IHF1ZXVlICovCiAJaW50IGNwdTsKQEAgLTIyOCw4ICsyMTUsNiBAQAogCSgoKChSKS0+bmV4dF90b19jbGVhbiA+IChSKS0+bmV4dF90b191c2UpCQkJXAogCSAgPyAwIDogKFIpLT5jb3VudCkgKyAoUiktPm5leHRfdG9fY2xlYW4gLSAoUiktPm5leHRfdG9fdXNlIC0gMSkKIAotI2RlZmluZSBFMTAwMF9SWF9ERVNDX1BTKFIsIGkpCQkJCQkJXAotCSgmKCgodW5pb24gZTEwMDBfcnhfZGVzY19wYWNrZXRfc3BsaXQgKikoKFIpLmRlc2MpKVtpXSkpCiAjZGVmaW5lIEUxMDAwX1JYX0RFU0NfRVhUKFIsIGkpCQkJCQkJXAogCSgmKCgodW5pb24gZTEwMDBfcnhfZGVzY19leHRlbmRlZCAqKSgoUikuZGVzYykpW2ldKSkKICNkZWZpbmUgRTEwMDBfR0VUX0RFU0MoUiwgaSwgdHlwZSkJKCYoKChzdHJ1Y3QgdHlwZSAqKSgoUikuZGVzYykpW2ldKSkKQEAgLTMxMSwxMCArMjk2LDggQEAKIAl1MzIgcnhfaW50X2RlbGF5OwogCXUzMiByeF9hYnNfaW50X2RlbGF5OwogCWJvb2wgcnhfY3N1bTsKLQl1bnNpZ25lZCBpbnQgcnhfcHNfcGFnZXM7CiAJdTMyIGdvcmNsOwogCXU2NCBnb3JjbF9vbGQ7Ci0JdTE2IHJ4X3BzX2JzaXplMDsKIAogCS8qIE9TIGRlZmluZWQgc3RydWN0cyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwppbmRleCA5ZDZlZGYzLi5kMDRlZWY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC0xNDQsNiArMTQ0LDggQEAKIHN0YXRpYyB1OCBlMTAwMF9jYWxjdWxhdGVfbW5nX2NoZWNrc3VtKGNoYXIgKmJ1ZmZlciwgdTMyIGxlbmd0aCk7CiBzdGF0aWMgczMyIGUxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMF8xMDAoc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IGR1cGxleCk7CiBzdGF0aWMgczMyIGUxMDAwX2NvbmZpZ3VyZV9rbXJuX2Zvcl8xMDAwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHMzMiBlMTAwMF9kb19yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSk7CitzdGF0aWMgczMyIGUxMDAwX2RvX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSk7CiAKIC8qIElHUCBjYWJsZSBsZW5ndGggdGFibGUgKi8KIHN0YXRpYyBjb25zdApAQCAtMTY4LDYgKzE3MCw4IEBACiAgICAgICA4MywgODksIDk1LCAxMDAsIDEwNSwgMTA5LCAxMTMsIDExNiwgMTE5LCAxMjIsIDEyNCwKICAgICAgIDEwNCwgMTA5LCAxMTQsIDExOCwgMTIxLCAxMjR9OwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGUxMDAwX2VlcHJvbV9sb2NrKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU2V0IHRoZSBwaHkgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KICAqCkBAIC00OTA0LDYgKzQ5MDgsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHMzMiBlMTAwMF9yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSkKIHsKKyAgICBzMzIgcmV0OworICAgIHNwaW5fbG9jaygmZTEwMDBfZWVwcm9tX2xvY2spOworICAgIHJldCA9IGUxMDAwX2RvX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIHdvcmRzLCBkYXRhKTsKKyAgICBzcGluX3VubG9jaygmZTEwMDBfZWVwcm9tX2xvY2spOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzMzIgZTEwMDBfZG9fcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdTE2IG9mZnNldCwgdTE2IHdvcmRzLCB1MTYgKmRhdGEpCit7CiAgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKICAgICB1MzIgaSA9IDA7CiAKQEAgLTUyMzYsNiArNTI0OSwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogczMyIGUxMDAwX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgd29yZHMsIHUxNiAqZGF0YSkKIHsKKyAgICBzMzIgcmV0OworICAgIHNwaW5fbG9jaygmZTEwMDBfZWVwcm9tX2xvY2spOworICAgIHJldCA9IGUxMDAwX2RvX3dyaXRlX2VlcHJvbShodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisgICAgc3Bpbl91bmxvY2soJmUxMDAwX2VlcHJvbV9sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzMzIgZTEwMDBfZG9fd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywgdTE2ICpkYXRhKQorewogICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CiAgICAgczMyIHN0YXR1cyA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCBhZDZkYTdiLi5mYWM4MjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0xMzcsMTUgKzEzNyw5IEBACiBzdGF0aWMgYm9vbCBlMTAwMF9jbGVhbl9yeF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcsCiAJCQkgICAgICAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKTsKLXN0YXRpYyBib29sIGUxMDAwX2NsZWFuX3J4X2lycV9wcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAotCQkJCSAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKTsKIHN0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAogCQkJCSAgIGludCBjbGVhbmVkX2NvdW50KTsKLXN0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnNfcHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAotCQkJCSAgICAgIGludCBjbGVhbmVkX2NvdW50KTsKIHN0YXRpYyBpbnQgZTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwogc3RhdGljIGludCBlMTAwMF9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsCiAJCQkgICBpbnQgY21kKTsKQEAgLTEwNTMsNiArMTA0NywxMSBAQAogCiAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CiAKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworCiAJYWRhcHRlci0+ZW5fbW5nX3B0ID0gZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoaHcpOwogCiAJLyogaW5pdGlhbGl6ZSBlZXByb20gcGFyYW1ldGVycyAqLwpAQCAtMTMzMSw3ICsxMzMwLDYgQEAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmh3LT5wY2lfY21kX3dvcmQpOwogCiAJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFOwotCWFkYXB0ZXItPnJ4X3BzX2JzaXplMCA9IEUxMDAwX1JYQlVGRkVSXzEyODsKIAlody0+bWF4X2ZyYW1lX3NpemUgPSBuZXRkZXYtPm10dSArCiAJCQkgICAgIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKIAlody0+bWluX2ZyYW1lX3NpemUgPSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkU7CkBAIC0xODE1LDI2ICsxODEzLDYgQEAKIAl9CiAJbWVtc2V0KHJ4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKIAotCXJ4ZHItPnBzX3BhZ2UgPSBrY2FsbG9jKHJ4ZHItPmNvdW50LCBzaXplb2Yoc3RydWN0IGUxMDAwX3BzX3BhZ2UpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcnhkci0+cHNfcGFnZSkgewotCQl2ZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJ4ZHItPnBzX3BhZ2VfZG1hID0ga2NhbGxvYyhyeGRyLT5jb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcnhkci0+cHNfcGFnZV9kbWEpIHsKLQkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOwotCQlrZnJlZShyeGRyLT5wc19wYWdlKTsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLAotCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJaWYgKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKIAkJZGVzY19sZW4gPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwogCWVsc2UKQEAgLTE4NTIsOCArMTgzMCw2IEBACiAJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOwogc2V0dXBfcnhfZGVzY19kaWU6CiAJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKLQkJa2ZyZWUocnhkci0+cHNfcGFnZSk7Ci0JCWtmcmVlKHJ4ZHItPnBzX3BhZ2VfZG1hKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xOTMyLDExICsxOTA4LDcgQEAKIHN0YXRpYyB2b2lkIGUxMDAwX3NldHVwX3JjdGwoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgcmN0bCwgcmZjdGw7Ci0JdTMyIHBzcmN0bCA9IDA7Ci0jaWZuZGVmIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVAotCXUzMiBwYWdlcyA9IDA7Ci0jZW5kaWYKKwl1MzIgcmN0bDsKIAogCXJjdGwgPSBlcjMyKFJDVEwpOwogCkBAIC0xOTg4LDU1ICsxOTYwLDYgQEAKIAkJCWJyZWFrOwogCX0KIAotI2lmbmRlZiBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQKLQkvKiA4MjU3MSBhbmQgZ3JlYXRlciBzdXBwb3J0IHBhY2tldC1zcGxpdCB3aGVyZSB0aGUgcHJvdG9jb2wKLQkgKiBoZWFkZXIgaXMgcGxhY2VkIGluIHNrYi0+ZGF0YSBhbmQgdGhlIHBhY2tldCBkYXRhIGlzCi0JICogcGxhY2VkIGluIHBhZ2VzIGhhbmdpbmcgb2ZmIG9mIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MuCi0JICogSW4gdGhlIGNhc2Ugb2YgYSBub24tc3BsaXQsIHNrYi0+ZGF0YSBpcyBsaW5lYXJseSBmaWxsZWQsCi0JICogZm9sbG93ZWQgYnkgdGhlIHBhZ2UgYnVmZmVycy4gIFRoZXJlZm9yZSwgc2tiLT5kYXRhIGlzCi0JICogc2l6ZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCBwcm90b2NvbCBoZWFkZXIuCi0JICovCi0JLyogYWxsb2NhdGlvbnMgdXNpbmcgYWxsb2NfcGFnZSB0YWtlIHRvbyBsb25nIGZvciByZWd1bGFyIE1UVQotCSAqIHNvIG9ubHkgZW5hYmxlIHBhY2tldCBzcGxpdCBmb3IganVtYm8gZnJhbWVzICovCi0JcGFnZXMgPSBQQUdFX1VTRV9DT1VOVChhZGFwdGVyLT5uZXRkZXYtPm10dSk7Ci0JaWYgKChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpICYmIChwYWdlcyA8PSAzKSAmJgotCSAgICBQQUdFX1NJWkUgPD0gMTYzODQgJiYgKHJjdGwgJiBFMTAwMF9SQ1RMX0xQRSkpCi0JCWFkYXB0ZXItPnJ4X3BzX3BhZ2VzID0gcGFnZXM7Ci0JZWxzZQotCQlhZGFwdGVyLT5yeF9wc19wYWdlcyA9IDA7Ci0jZW5kaWYKLQlpZiAoYWRhcHRlci0+cnhfcHNfcGFnZXMpIHsKLQkJLyogQ29uZmlndXJlIGV4dHJhIHBhY2tldC1zcGxpdCByZWdpc3RlcnMgKi8KLQkJcmZjdGwgPSBlcjMyKFJGQ1RMKTsKLQkJcmZjdGwgfD0gRTEwMDBfUkZDVExfRVhURU47Ci0JCS8qIGRpc2FibGUgcGFja2V0IHNwbGl0IHN1cHBvcnQgZm9yIElQdjYgZXh0ZW5zaW9uIGhlYWRlcnMsCi0JCSAqIGJlY2F1c2Ugc29tZSBtYWxmb3JtZWQgSVB2NiBoZWFkZXJzIGNhbiBoYW5nIHRoZSBSWCAqLwotCQlyZmN0bCB8PSAoRTEwMDBfUkZDVExfSVBWNl9FWF9ESVMgfAotCQkgICAgICAgICAgRTEwMDBfUkZDVExfTkVXX0lQVjZfRVhUX0RJUyk7Ci0KLQkJZXczMihSRkNUTCwgcmZjdGwpOwotCi0JCXJjdGwgfD0gRTEwMDBfUkNUTF9EVFlQX1BTOwotCi0JCXBzcmN0bCB8PSBhZGFwdGVyLT5yeF9wc19ic2l6ZTAgPj4KLQkJCUUxMDAwX1BTUkNUTF9CU0laRTBfU0hJRlQ7Ci0KLQkJc3dpdGNoIChhZGFwdGVyLT5yeF9wc19wYWdlcykgewotCQljYXNlIDM6Ci0JCQlwc3JjdGwgfD0gUEFHRV9TSVpFIDw8Ci0JCQkJRTEwMDBfUFNSQ1RMX0JTSVpFM19TSElGVDsKLQkJY2FzZSAyOgotCQkJcHNyY3RsIHw9IFBBR0VfU0laRSA8PAotCQkJCUUxMDAwX1BTUkNUTF9CU0laRTJfU0hJRlQ7Ci0JCWNhc2UgMToKLQkJCXBzcmN0bCB8PSBQQUdFX1NJWkUgPj4KLQkJCQlFMTAwMF9QU1JDVExfQlNJWkUxX1NISUZUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlldzMyKFBTUkNUTCwgcHNyY3RsKTsKLQl9Ci0KIAlldzMyKFJDVEwsIHJjdGwpOwogfQogCkBAIC0yMDUzLDE4ICsxOTc2LDEwIEBACiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgcmRsZW4sIHJjdGwsIHJ4Y3N1bSwgY3RybF9leHQ7CiAKLQlpZiAoYWRhcHRlci0+cnhfcHNfcGFnZXMpIHsKLQkJLyogdGhpcyBpcyBhIDMyIGJ5dGUgZGVzY3JpcHRvciAqLwotCQlyZGxlbiA9IGFkYXB0ZXItPnJ4X3JpbmdbMF0uY291bnQgKgotCQkJc2l6ZW9mKHVuaW9uIGUxMDAwX3J4X2Rlc2NfcGFja2V0X3NwbGl0KTsKLQkJYWRhcHRlci0+Y2xlYW5fcnggPSBlMTAwMF9jbGVhbl9yeF9pcnFfcHM7Ci0JCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZiA9IGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnNfcHM7Ci0JfSBlbHNlIHsKLQkJcmRsZW4gPSBhZGFwdGVyLT5yeF9yaW5nWzBdLmNvdW50ICoKLQkJCXNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7Ci0JCWFkYXB0ZXItPmNsZWFuX3J4ID0gZTEwMDBfY2xlYW5fcnhfaXJxOwotCQlhZGFwdGVyLT5hbGxvY19yeF9idWYgPSBlMTAwMF9hbGxvY19yeF9idWZmZXJzOwotCX0KKwlyZGxlbiA9IGFkYXB0ZXItPnJ4X3JpbmdbMF0uY291bnQgKgorCQlzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOworCWFkYXB0ZXItPmNsZWFuX3J4ID0gZTEwMDBfY2xlYW5fcnhfaXJxOworCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZiA9IGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnM7CiAKIAkvKiBkaXNhYmxlIHJlY2VpdmVzIHdoaWxlIHNldHRpbmcgdXAgdGhlIGRlc2NyaXB0b3JzICovCiAJcmN0bCA9IGVyMzIoUkNUTCk7CkBAIC0yMTA5LDI4ICsyMDI0LDE0IEBACiAJLyogRW5hYmxlIDgyNTQzIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgVENQIGFuZCBVRFAgKi8KIAlpZiAoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CiAJCXJ4Y3N1bSA9IGVyMzIoUlhDU1VNKTsKLQkJaWYgKGFkYXB0ZXItPnJ4X2NzdW0pIHsKKwkJaWYgKGFkYXB0ZXItPnJ4X2NzdW0pCiAJCQlyeGNzdW0gfD0gRTEwMDBfUlhDU1VNX1RVT0ZMOwotCi0JCQkvKiBFbmFibGUgODI1NzEgSVB2NCBwYXlsb2FkIGNoZWNrc3VtIGZvciBVRFAgZnJhZ21lbnRzCi0JCQkgKiBNdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBwYWNrZXQtc3BsaXQuICovCi0JCQlpZiAoKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkgJiYKLQkJCSAgICAoYWRhcHRlci0+cnhfcHNfcGFnZXMpKSB7Ci0JCQkJcnhjc3VtIHw9IEUxMDAwX1JYQ1NVTV9JUFBDU0U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyeGNzdW0gJj0gfkUxMDAwX1JYQ1NVTV9UVU9GTDsKKwkJZWxzZQogCQkJLyogZG9uJ3QgbmVlZCB0byBjbGVhciBJUFBDU0UgYXMgaXQgZGVmYXVsdHMgdG8gMCAqLwotCQl9CisJCQlyeGNzdW0gJj0gfkUxMDAwX1JYQ1NVTV9UVU9GTDsKIAkJZXczMihSWENTVU0sIHJ4Y3N1bSk7CiAJfQogCi0JLyogZW5hYmxlIGVhcmx5IHJlY2VpdmVzIG9uIDgyNTczLCBvbmx5IHRha2VzIGVmZmVjdCBpZiB1c2luZyA+IDIwNDgKLQkgKiBieXRlIHRvdGFsIGZyYW1lIHNpemUuICBmb3IgZXhhbXBsZSBvbmx5IGZvciBqdW1ibyBmcmFtZXMgKi8KLSNkZWZpbmUgRTEwMDBfRVJUXzIwNDggMHgxMDAKLQlpZiAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTczKQotCQlldzMyKEVSVCwgRTEwMDBfRVJUXzIwNDgpOwotCiAJLyogRW5hYmxlIFJlY2VpdmVzICovCiAJZXczMihSQ1RMLCByY3RsKTsKIH0KQEAgLTIyNTYsMTAgKzIxNTcsNiBAQAogCiAJdmZyZWUocnhfcmluZy0+YnVmZmVyX2luZm8pOwogCXJ4X3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKLQlrZnJlZShyeF9yaW5nLT5wc19wYWdlKTsKLQlyeF9yaW5nLT5wc19wYWdlID0gTlVMTDsKLQlrZnJlZShyeF9yaW5nLT5wc19wYWdlX2RtYSk7Ci0JcnhfcmluZy0+cHNfcGFnZV9kbWEgPSBOVUxMOwogCiAJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeF9yaW5nLT5zaXplLCByeF9yaW5nLT5kZXNjLCByeF9yaW5nLT5kbWEpOwogCkBAIC0yMjkyLDExICsyMTg5LDkgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwotCXN0cnVjdCBlMTAwMF9wc19wYWdlICpwc19wYWdlOwotCXN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSAqcHNfcGFnZV9kbWE7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCiAJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKQEAgLTIzMTAsMjUgKzIyMDUsMTAgQEAKIAkJCWRldl9rZnJlZV9za2IoYnVmZmVyX2luZm8tPnNrYik7CiAJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKIAkJfQotCQlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07Ci0JCXBzX3BhZ2VfZG1hID0gJnJ4X3JpbmctPnBzX3BhZ2VfZG1hW2ldOwotCQlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+cnhfcHNfcGFnZXM7IGorKykgewotCQkJaWYgKCFwc19wYWdlLT5wc19wYWdlW2pdKSBicmVhazsKLQkJCXBjaV91bm1hcF9wYWdlKHBkZXYsCi0JCQkJICAgICAgIHBzX3BhZ2VfZG1hLT5wc19wYWdlX2RtYVtqXSwKLQkJCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hW2pdID0gMDsKLQkJCXB1dF9wYWdlKHBzX3BhZ2UtPnBzX3BhZ2Vbal0pOwotCQkJcHNfcGFnZS0+cHNfcGFnZVtqXSA9IE5VTEw7Ci0JCX0KIAl9CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogcnhfcmluZy0+Y291bnQ7CiAJbWVtc2V0KHJ4X3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlKSAqIHJ4X3JpbmctPmNvdW50OwotCW1lbXNldChyeF9yaW5nLT5wc19wYWdlLCAwLCBzaXplKTsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSkgKiByeF9yaW5nLT5jb3VudDsKLQltZW1zZXQocnhfcmluZy0+cHNfcGFnZV9kbWEsIDAsIHNpemUpOwogCiAJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwogCkBAIC0yOTk4LDMyICsyODc4LDQ5IEBACiAJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJdW5zaWduZWQgaW50IGk7CiAJdTggY3NzOworCXUzMiBjbWRfbGVuID0gRTEwMDBfVFhEX0NNRF9ERVhUOwogCi0JaWYgKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkgewotCQljc3MgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQorCQlyZXR1cm4gZmFsc2U7CiAKLQkJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwotCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKLQkJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKCp0eF9yaW5nLCBpKTsKLQotCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2NvbmZpZyA9IDA7Ci0JCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzcyA9IGNzczsKLQkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KLQkJCWNzcyArIHNrYi0+Y3N1bV9vZmZzZXQ7Ci0JCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IDA7Ci0JCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKLQkJY29udGV4dF9kZXNjLT5jbWRfYW5kX2xlbmd0aCA9IGNwdV90b19sZTMyKEUxMDAwX1RYRF9DTURfREVYVCk7Ci0KLQkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwotCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7Ci0KLQkJaWYgKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOwotCQl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7Ci0KLQkJcmV0dXJuIHRydWU7CisJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCWNtZF9sZW4gfD0gRTEwMDBfVFhEX0NNRF9UQ1A7CisJCWJyZWFrOworCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwkJLyogWFhYIG5vdCBoYW5kbGluZyBhbGwgSVBWNiBoZWFkZXJzICovCisJCWlmIChpcHY2X2hkcihza2IpLT5uZXh0aGRyID09IElQUFJPVE9fVENQKQorCQkJY21kX2xlbiB8PSBFMTAwMF9UWERfQ01EX1RDUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHVubGlrZWx5KG5ldF9yYXRlbGltaXQoKSkpCisJCQlEUFJJTlRLKERSViwgV0FSTklORywKKwkJCSAgICAgICAgImNoZWNrc3VtX3BhcnRpYWwgcHJvdG89JXghXG4iLCBza2ItPnByb3RvY29sKTsKKwkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIGZhbHNlOworCWNzcyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKCp0eF9yaW5nLCBpKTsKKworCWNvbnRleHRfZGVzYy0+bG93ZXJfc2V0dXAuaXBfY29uZmlnID0gMDsKKwljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBjc3M7CisJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KKwkJY3NzICsgc2tiLT5jc3VtX29mZnNldDsKKwljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc2UgPSAwOworCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKKwljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoY21kX2xlbik7CisKKwlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOworCisJaWYgKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKKworCXJldHVybiB0cnVlOwogfQogCiAjZGVmaW5lIEUxMDAwX01BWF9UWERfUFdSCTEyCkBAIC00MjM1LDE4MSArNDEzMiw2IEBACiB9CiAKIC8qKgotICogZTEwMDBfY2xlYW5fcnhfaXJxX3BzIC0gU2VuZCByZWNlaXZlZCBkYXRhIHVwIHRoZSBuZXR3b3JrIHN0YWNrOyBwYWNrZXQgc3BsaXQKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoqLwotCi1zdGF0aWMgYm9vbCBlMTAwMF9jbGVhbl9yeF9pcnFfcHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICBzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhfcmluZywKLQkJCQkgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbykKLXsKLQl1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqcnhfZGVzYywgKm5leHRfcnhkOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwotCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvLCAqbmV4dF9idWZmZXI7Ci0Jc3RydWN0IGUxMDAwX3BzX3BhZ2UgKnBzX3BhZ2U7Ci0Jc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hICpwc19wYWdlX2RtYTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCBpLCBqOwotCXUzMiBsZW5ndGgsIHN0YXRlcnI7Ci0JaW50IGNsZWFuZWRfY291bnQgPSAwOwotCWJvb2wgY2xlYW5lZCA9IGZhbHNlOwotCXVuc2lnbmVkIGludCB0b3RhbF9yeF9ieXRlcz0wLCB0b3RhbF9yeF9wYWNrZXRzPTA7Ci0KLQlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKLQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQ19QUygqcnhfcmluZywgaSk7Ci0Jc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IpOwotCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCi0Jd2hpbGUgKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9ERCkgewotCQlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07Ci0JCXBzX3BhZ2VfZG1hID0gJnJ4X3JpbmctPnBzX3BhZ2VfZG1hW2ldOwotCi0JCWlmICh1bmxpa2VseSgqd29ya19kb25lID49IHdvcmtfdG9fZG8pKQotCQkJYnJlYWs7Ci0JCSgqd29ya19kb25lKSsrOwotCi0JCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7Ci0KLQkJLyogaW4gdGhlIHBhY2tldCBzcGxpdCBjYXNlIHRoaXMgaXMgaGVhZGVyIG9ubHkgKi8KLQkJcHJlZmV0Y2goc2tiLT5kYXRhIC0gTkVUX0lQX0FMSUdOKTsKLQotCQlpZiAoKytpID09IHJ4X3JpbmctPmNvdW50KSBpID0gMDsKLQkJbmV4dF9yeGQgPSBFMTAwMF9SWF9ERVNDX1BTKCpyeF9yaW5nLCBpKTsKLQkJcHJlZmV0Y2gobmV4dF9yeGQpOwotCi0JCW5leHRfYnVmZmVyID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCi0JCWNsZWFuZWQgPSB0cnVlOwotCQljbGVhbmVkX2NvdW50Kys7Ci0JCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwKLQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQotCQlpZiAodW5saWtlbHkoIShzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfRU9QKSkpIHsKLQkJCUUxMDAwX0RCRygiJXM6IFBhY2tldCBTcGxpdCBidWZmZXJzIGRpZG4ndCBwaWNrIHVwIgotCQkJCSAgIiB0aGUgZnVsbCBwYWNrZXRcbiIsIG5ldGRldi0+bmFtZSk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJZ290byBuZXh0X2Rlc2M7Ci0JCX0KLQotCQlpZiAodW5saWtlbHkoc3RhdGVyciAmIEUxMDAwX1JYREVYVF9FUlJfRlJBTUVfRVJSX01BU0spKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJZ290byBuZXh0X2Rlc2M7Ci0JCX0KLQotCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUubGVuZ3RoMCk7Ci0KLQkJaWYgKHVubGlrZWx5KCFsZW5ndGgpKSB7Ci0JCQlFMTAwMF9EQkcoIiVzOiBMYXN0IHBhcnQgb2YgdGhlIHBhY2tldCBzcGFubmluZyIKLQkJCQkgICIgbXVsdGlwbGUgZGVzY3JpcHRvcnNcbiIsIG5ldGRldi0+bmFtZSk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJZ290byBuZXh0X2Rlc2M7Ci0JCX0KLQotCQkvKiBHb29kIFJlY2VpdmUgKi8KLQkJc2tiX3B1dChza2IsIGxlbmd0aCk7Ci0KLQkJewotCQkvKiB0aGlzIGxvb2tzIHVnbHksIGJ1dCBpdCBzZWVtcyBjb21waWxlciBpc3N1ZXMgbWFrZSBpdAotCQkgICBtb3JlIGVmZmljaWVudCB0aGFuIHJldXNpbmcgaiAqLwotCQlpbnQgbDEgPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGhbMF0pOwotCi0JCS8qIHBhZ2UgYWxsb2MvcHV0IHRha2VzIHRvbyBsb25nIGFuZCBlZmZlY3RzIHNtYWxsIHBhY2tldAotCQkgKiB0aHJvdWdocHV0LCBzbyB1bnNwbGl0IHNtYWxsIHBhY2tldHMgYW5kIHNhdmUgdGhlIGFsbG9jL3B1dCovCi0JCWlmIChsMSAmJiAobDEgPD0gY29weWJyZWFrKSAmJiAoKGxlbmd0aCArIGwxKSA8PSBhZGFwdGVyLT5yeF9wc19ic2l6ZTApKSB7Ci0JCQl1OCAqdmFkZHI7Ci0JCQkvKiB0aGVyZSBpcyBubyBkb2N1bWVudGF0aW9uIGFib3V0IGhvdyB0byBjYWxsCi0JCQkgKiBrbWFwX2F0b21pYywgc28gd2UgY2FuJ3QgaG9sZCB0aGUgbWFwcGluZwotCQkJICogdmVyeSBsb25nICovCi0JCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGRldiwKLQkJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbMF0sCi0JCQkJUEFHRV9TSVpFLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQl2YWRkciA9IGttYXBfYXRvbWljKHBzX3BhZ2UtPnBzX3BhZ2VbMF0sCi0JCQkgICAgICAgICAgICAgICAgICAgIEtNX1NLQl9EQVRBX1NPRlRJUlEpOwotCQkJbWVtY3B5KHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgdmFkZHIsIGwxKTsKLQkJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOwotCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCi0JCQkJcHNfcGFnZV9kbWEtPnBzX3BhZ2VfZG1hWzBdLAotCQkJCVBBR0VfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCS8qIHJlbW92ZSB0aGUgQ1JDICovCi0JCQlsMSAtPSA0OwotCQkJc2tiX3B1dChza2IsIGwxKTsKLQkJCWdvdG8gY29weWRvbmU7Ci0JCX0gLyogaWYgKi8KLQkJfQotCi0JCWZvciAoaiA9IDA7IGogPCBhZGFwdGVyLT5yeF9wc19wYWdlczsgaisrKSB7Ci0JCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGhbal0pOwotCQkJaWYgKCFsZW5ndGgpCi0JCQkJYnJlYWs7Ci0JCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0sCi0JCQkJCVBBR0VfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCXBzX3BhZ2VfZG1hLT5wc19wYWdlX2RtYVtqXSA9IDA7Ci0JCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBqLCBwc19wYWdlLT5wc19wYWdlW2pdLCAwLAotCQkJICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0JCQlwc19wYWdlLT5wc19wYWdlW2pdID0gTlVMTDsKLQkJCXNrYi0+bGVuICs9IGxlbmd0aDsKLQkJCXNrYi0+ZGF0YV9sZW4gKz0gbGVuZ3RoOwotCQkJc2tiLT50cnVlc2l6ZSArPSBsZW5ndGg7Ci0JCX0KLQotCQkvKiBzdHJpcCB0aGUgZXRoZXJuZXQgY3JjLCBwcm9ibGVtIGlzIHdlJ3JlIHVzaW5nIHBhZ2VzIG5vdyBzbwotCQkgKiB0aGlzIHdob2xlIG9wZXJhdGlvbiBjYW4gZ2V0IGEgbGl0dGxlIGNwdSBpbnRlbnNpdmUgKi8KLQkJcHNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKLQotY29weWRvbmU6Ci0JCXRvdGFsX3J4X2J5dGVzICs9IHNrYi0+bGVuOwotCQl0b3RhbF9yeF9wYWNrZXRzKys7Ci0KLQkJZTEwMDBfcnhfY2hlY2tzdW0oYWRhcHRlciwgc3RhdGVyciwKLQkJCQkgIGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLmxvd2VyLmhpX2R3b3JkLmNzdW1faXAuY3N1bSksIHNrYik7Ci0JCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7Ci0KLQkJaWYgKGxpa2VseShyeF9kZXNjLT53Yi51cHBlci5oZWFkZXJfc3RhdHVzICYKLQkJCSAgIGNwdV90b19sZTE2KEUxMDAwX1JYRFBTX0hEUlNUQVRfSERSU1ApKSkKLQkJCWFkYXB0ZXItPnJ4X2hkcl9zcGxpdCsrOwotCi0JCWlmICh1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAotCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuKSk7Ci0JCX0gZWxzZSB7Ci0JCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCQl9Ci0KLQkJbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQotbmV4dF9kZXNjOgotCQlyeF9kZXNjLT53Yi5taWRkbGUuc3RhdHVzX2Vycm9yICY9IGNwdV90b19sZTMyKH4weEZGKTsKLQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0KLQkJLyogcmV0dXJuIHNvbWUgYnVmZmVycyB0byBoYXJkd2FyZSwgb25lIGF0IGEgdGltZSBpcyB0b28gc2xvdyAqLwotCQlpZiAodW5saWtlbHkoY2xlYW5lZF9jb3VudCA+PSBFMTAwMF9SWF9CVUZGRVJfV1JJVEUpKSB7Ci0JCQlhZGFwdGVyLT5hbGxvY19yeF9idWYoYWRhcHRlciwgcnhfcmluZywgY2xlYW5lZF9jb3VudCk7Ci0JCQljbGVhbmVkX2NvdW50ID0gMDsKLQkJfQotCi0JCS8qIHVzZSBwcmVmZXRjaGVkIHZhbHVlcyAqLwotCQlyeF9kZXNjID0gbmV4dF9yeGQ7Ci0JCWJ1ZmZlcl9pbmZvID0gbmV4dF9idWZmZXI7Ci0KLQkJc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3IpOwotCX0KLQlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKLQotCWNsZWFuZWRfY291bnQgPSBFMTAwMF9ERVNDX1VOVVNFRChyeF9yaW5nKTsKLQlpZiAoY2xlYW5lZF9jb3VudCkKLQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIsIHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOwotCi0JYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOwotCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzICs9IHRvdGFsX3J4X2J5dGVzOwotCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKLQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOwotCXJldHVybiBjbGVhbmVkOwotfQotCi0vKioKICAqIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMgLSBSZXBsYWNlIHVzZWQgcmVjZWl2ZSBidWZmZXJzOyBsZWdhY3kgJiBleHRlbmRlZAogICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KQEAgLTQ1MjEsMTA0ICs0MjQzLDYgQEAKIH0KIAogLyoqCi0gKiBlMTAwMF9hbGxvY19yeF9idWZmZXJzX3BzIC0gUmVwbGFjZSB1c2VkIHJlY2VpdmUgYnVmZmVyczsgcGFja2V0IHNwbGl0Ci0gKiBAYWRhcHRlcjogYWRkcmVzcyBvZiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoqLwotCi1zdGF0aWMgdm9pZCBlMTAwMF9hbGxvY19yeF9idWZmZXJzX3BzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAotCQkJCSAgICAgIGludCBjbGVhbmVkX2NvdW50KQotewotCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdW5pb24gZTEwMDBfcnhfZGVzY19wYWNrZXRfc3BsaXQgKnJ4X2Rlc2M7Ci0Jc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87Ci0Jc3RydWN0IGUxMDAwX3BzX3BhZ2UgKnBzX3BhZ2U7Ci0Jc3RydWN0IGUxMDAwX3BzX3BhZ2VfZG1hICpwc19wYWdlX2RtYTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCBpLCBqOwotCi0JaSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOwotCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCXBzX3BhZ2UgPSAmcnhfcmluZy0+cHNfcGFnZVtpXTsKLQlwc19wYWdlX2RtYSA9ICZyeF9yaW5nLT5wc19wYWdlX2RtYVtpXTsKLQotCXdoaWxlIChjbGVhbmVkX2NvdW50LS0pIHsKLQkJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0NfUFMoKnJ4X3JpbmcsIGkpOwotCi0JCWZvciAoaiA9IDA7IGogPCBQU19QQUdFX0JVRkZFUlM7IGorKykgewotCQkJaWYgKGogPCBhZGFwdGVyLT5yeF9wc19wYWdlcykgewotCQkJCWlmIChsaWtlbHkoIXBzX3BhZ2UtPnBzX3BhZ2Vbal0pKSB7Ci0JCQkJCXBzX3BhZ2UtPnBzX3BhZ2Vbal0gPQotCQkJCQkJYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKLQkJCQkJaWYgKHVubGlrZWx5KCFwc19wYWdlLT5wc19wYWdlW2pdKSkgewotCQkJCQkJYWRhcHRlci0+YWxsb2NfcnhfYnVmZl9mYWlsZWQrKzsKLQkJCQkJCWdvdG8gbm9fYnVmZmVyczsKLQkJCQkJfQotCQkJCQlwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0gPQotCQkJCQkJcGNpX21hcF9wYWdlKHBkZXYsCi0JCQkJCQkJICAgIHBzX3BhZ2UtPnBzX3BhZ2Vbal0sCi0JCQkJCQkJICAgIDAsIFBBR0VfU0laRSwKLQkJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCQl9Ci0JCQkJLyogUmVmcmVzaCB0aGUgZGVzYyBldmVuIGlmIGJ1ZmZlcl9hZGRycyBkaWRuJ3QKLQkJCQkgKiBjaGFuZ2UgYmVjYXVzZSBlYWNoIHdyaXRlLWJhY2sgZXJhc2VzCi0JCQkJICogdGhpcyBpbmZvLgotCQkJCSAqLwotCQkJCXJ4X2Rlc2MtPnJlYWQuYnVmZmVyX2FkZHJbaisxXSA9Ci0JCQkJICAgICBjcHVfdG9fbGU2NChwc19wYWdlX2RtYS0+cHNfcGFnZV9kbWFbal0pOwotCQkJfSBlbHNlCi0JCQkJcnhfZGVzYy0+cmVhZC5idWZmZXJfYWRkcltqKzFdID0gfmNwdV90b19sZTY0KDApOwotCQl9Ci0KLQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuZXRkZXYsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfcHNfYnNpemUwICsgTkVUX0lQX0FMSUdOKTsKLQotCQlpZiAodW5saWtlbHkoIXNrYikpIHsKLQkJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKLQkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKLQkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCi0JCSAqLwotCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7Ci0KLQkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKLQkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X3BzX2JzaXplMDsKLQkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwKLQkJCQkJCSAgYWRhcHRlci0+cnhfcHNfYnNpemUwLAotCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JCXJ4X2Rlc2MtPnJlYWQuYnVmZmVyX2FkZHJbMF0gPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKLQotCQlpZiAodW5saWtlbHkoKytpID09IHJ4X3JpbmctPmNvdW50KSkgaSA9IDA7Ci0JCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwotCQlwc19wYWdlID0gJnJ4X3JpbmctPnBzX3BhZ2VbaV07Ci0JCXBzX3BhZ2VfZG1hID0gJnJ4X3JpbmctPnBzX3BhZ2VfZG1hW2ldOwotCX0KLQotbm9fYnVmZmVyczoKLQlpZiAobGlrZWx5KHJ4X3JpbmctPm5leHRfdG9fdXNlICE9IGkpKSB7Ci0JCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKLQkJaWYgKHVubGlrZWx5KGktLSA9PSAwKSkgaSA9IChyeF9yaW5nLT5jb3VudCAtIDEpOwotCi0JCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93Ci0JCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5Ci0JCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCi0JCSAqIHN1Y2ggYXMgSUEtNjQpLiAqLwotCQl3bWIoKTsKLQkJLyogSGFyZHdhcmUgaW5jcmVtZW50cyBieSAxNiBieXRlcywgYnV0IHBhY2tldCBzcGxpdAotCQkgKiBkZXNjcmlwdG9ycyBhcmUgMzIgYnl0ZXMuLi5zbyB3ZSBpbmNyZW1lbnQgdGFpbAotCQkgKiB0d2ljZSBhcyBtdWNoLgotCQkgKi8KLQkJd3JpdGVsKGk8PDEsIGh3LT5od19hZGRyICsgcnhfcmluZy0+cmR0KTsKLQl9Ci19Ci0KLS8qKgogICogZTEwMDBfc21hcnRzcGVlZCAtIFdvcmthcm91bmQgZm9yIFNtYXJ0U3BlZWQgb24gODI1NDEgYW5kIDgyNTQ3IGNvbnRyb2xsZXJzLgogICogQGFkYXB0ZXI6CiAgKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvODI1NzEuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS84MjU3MS5jCmluZGV4IDQ2MjM1MWMuLmIyYzkxMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS84MjU3MS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS84MjU3MS5jCkBAIC0zOCw2ICszOCw3IEBACiAgKiA4MjU3M1YgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCiAgKiA4MjU3M0UgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIChDb3BwZXIpCiAgKiA4MjU3M0wgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCisgKiA4MjU3NEwgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC01NCw2ICs1NSw4IEBACiAKICNkZWZpbmUgRTEwMDBfR0NSX0wxX0FDVF9XSVRIT1VUX0wwU19SWCAweDA4MDAwMDAwCiAKKyNkZWZpbmUgRTEwMDBfTlZNX0lOSVRfQ1RSTDJfTU5HTSAweDYwMDAgLyogTWFuYWdlYWJpbGl0eSBPcGVyYXRpb24gTW9kZSBtYXNrICovCisKIHN0YXRpYyBzMzIgZTEwMDBfZ2V0X3BoeV9pZF84MjU3MShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfc2V0dXBfY29wcGVyX2xpbmtfODI1NzEoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rXzgyNTcxKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtNjMsNiArNjYsOCBAQAogc3RhdGljIHZvaWQgZTEwMDBfaW5pdGlhbGl6ZV9od19iaXRzXzgyNTcxKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9zZXR1cF9saW5rXzgyNTcxKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHZvaWQgZTEwMDBfY2xlYXJfaHdfY250cnNfODI1NzEoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgYm9vbCBlMTAwMF9jaGVja19tbmdfbW9kZV84MjU3NChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBzMzIgZTEwMDBfbGVkX29uXzgyNTc0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiAvKioKICAqICBlMTAwMF9pbml0X3BoeV9wYXJhbXNfODI1NzEgLSBJbml0IFBIWSBmdW5jIHB0cnMuCkBAIC05Miw2ICs5Nyw5IEBACiAJY2FzZSBlMTAwMF84MjU3MzoKIAkJcGh5LT50eXBlCQkgPSBlMTAwMF9waHlfbTg4OwogCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTc0OgorCQlwaHktPnR5cGUJCSA9IGUxMDAwX3BoeV9ibTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZOwogCQlicmVhazsKQEAgLTExMSw2ICsxMTksMTAgQEAKIAkJaWYgKHBoeS0+aWQgIT0gTTg4RTExMTFfSV9QSFlfSUQpCiAJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzQ6CisJCWlmIChwaHktPmlkICE9IEJNRTEwMDBfRV9QSFlfSURfUjIpCisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRTEwMDBfRVJSX1BIWTsKIAkJYnJlYWs7CkBAIC0xNTAsNiArMTYyLDcgQEAKIAogCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU3MzoKKwljYXNlIGUxMDAwXzgyNTc0OgogCQlpZiAoKChlZWNkID4+IDE1KSAmIDB4MykgPT0gMHgzKSB7CiAJCQludm0tPnR5cGUgPSBlMTAwMF9udm1fZmxhc2hfaHc7CiAJCQludm0tPndvcmRfc2l6ZSA9IDIwNDg7CkBAIC0yNDUsNiArMjU4LDE3IEBACiAJCWJyZWFrOwogCX0KIAorCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CisJY2FzZSBlMTAwMF84MjU3NDoKKwkJZnVuYy0+Y2hlY2tfbW5nX21vZGUgPSBlMTAwMF9jaGVja19tbmdfbW9kZV84MjU3NDsKKwkJZnVuYy0+bGVkX29uID0gZTEwMDBfbGVkX29uXzgyNTc0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmdW5jLT5jaGVja19tbmdfbW9kZSA9IGUxMDAwZV9jaGVja19tbmdfbW9kZV9nZW5lcmljOworCQlmdW5jLT5sZWRfb24gPSBlMTAwMGVfbGVkX29uX2dlbmVyaWM7CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMzAsNiArMzU0LDggQEAKIHN0YXRpYyBzMzIgZTEwMDBfZ2V0X3BoeV9pZF84MjU3MShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5ID0gJmh3LT5waHk7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9pZCA9IDA7CiAKIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgZTEwMDBfODI1NzE6CkBAIC0zNDUsNiArMzcxLDIwIEBACiAJY2FzZSBlMTAwMF84MjU3MzoKIAkJcmV0dXJuIGUxMDAwZV9nZXRfcGh5X2lkKGh3KTsKIAkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU3NDoKKwkJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBQSFlfSUQxLCAmcGh5X2lkKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlwaHktPmlkID0gKHUzMikocGh5X2lkIDw8IDE2KTsKKwkJdWRlbGF5KDIwKTsKKwkJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBQSFlfSUQyLCAmcGh5X2lkKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlwaHktPmlkIHw9ICh1MzIpKHBoeV9pZCk7CisJCXBoeS0+cmV2aXNpb24gPSAodTMyKShwaHlfaWQgJiB+UEhZX1JFVklTSU9OX01BU0spOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAJCWJyZWFrOwpAQCAtNDIxLDcgKzQ2MSw3IEBACiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwogCi0JaWYgKGh3LT5tYWMudHlwZSAhPSBlMTAwMF84MjU3MykKKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwXzgyNTczICYmIGh3LT5tYWMudHlwZSAhPSBlMTAwMF84MjU3NCkKIAkJcmV0X3ZhbCA9IGUxMDAwZV9hY3F1aXJlX252bShodyk7CiAKIAlpZiAocmV0X3ZhbCkKQEAgLTQ2MSw2ICs1MDEsNyBAQAogCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKIAljYXNlIGUxMDAwXzgyNTczOgorCWNhc2UgZTEwMDBfODI1NzQ6CiAJCXJldF92YWwgPSBlMTAwMF93cml0ZV9udm1fZWV3cl84MjU3MShodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CiAJCWJyZWFrOwogCWNhc2UgZTEwMDBfODI1NzE6CkBAIC03MzUsNyArNzc2LDcgQEAKIAkgKiBNdXN0IGFjcXVpcmUgdGhlIE1ESU8gb3duZXJzaGlwIGJlZm9yZSBNQUMgcmVzZXQuCiAJICogT3duZXJzaGlwIGRlZmF1bHRzIHRvIGZpcm13YXJlIGFmdGVyIGEgcmVzZXQuCiAJICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MykgeworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzMgfHwgaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KSB7CiAJCWV4dGNuZl9jdHJsID0gZXIzMihFWFRDTkZfQ1RSTCk7CiAJCWV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX01ESU9fU1dfT1dORVJTSElQOwogCkBAIC03NzYsNyArODE3LDcgQEAKIAkgKiBOZWVkIHRvIHdhaXQgZm9yIFBoeSBjb25maWd1cmF0aW9uIGNvbXBsZXRpb24gYmVmb3JlIGFjY2Vzc2luZwogCSAqIE5WTSBhbmQgUGh5LgogCSAqLwotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzMpCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MyB8fCBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpCiAJCW1zbGVlcCgyNSk7CiAKIAkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgZXZlbnRzLiAqLwpAQCAtODQzLDcgKzg4NCw3IEBACiAJZXczMihUWERDVEwoMCksIHJlZ19kYXRhKTsKIAogCS8qIC4uLmZvciBib3RoIHF1ZXVlcy4gKi8KLQlpZiAobWFjLT50eXBlICE9IGUxMDAwXzgyNTczKSB7CisJaWYgKG1hYy0+dHlwZSAhPSBlMTAwMF84MjU3MyAmJiBtYWMtPnR5cGUgIT0gZTEwMDBfODI1NzQpIHsKIAkJcmVnX2RhdGEgPSBlcjMyKFRYRENUTCgxKSk7CiAJCXJlZ19kYXRhID0gKHJlZ19kYXRhICYgfkUxMDAwX1RYRENUTF9XVEhSRVNIKSB8CiAJCQkgICBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCIHwKQEAgLTkxOCwxOSArOTU5LDI4IEBACiAJfQogCiAJLyogRGV2aWNlIENvbnRyb2wgKi8KLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczKSB7CisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MyB8fCBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpIHsKIAkJcmVnID0gZXIzMihDVFJMKTsKIAkJcmVnICY9IH4oMSA8PCAyOSk7CiAJCWV3MzIoQ1RSTCwgcmVnKTsKIAl9CiAKIAkvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAqLwotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzMpIHsKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczIHx8IGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkgewogCQlyZWcgPSBlcjMyKENUUkxfRVhUKTsKIAkJcmVnICY9IH4oMSA8PCAyMyk7CiAJCXJlZyB8PSAoMSA8PCAyMik7CiAJCWV3MzIoQ1RSTF9FWFQsIHJlZyk7CiAJfQorCisJLyogUENJLUV4IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc0KSB7CisJCXJlZyA9IGVyMzIoR0NSKTsKKwkJcmVnIHw9ICgxIDw8IDIyKTsKKwkJZXczMihHQ1IsIHJlZyk7CisJfQorCisJcmV0dXJuOwogfQogCiAvKioKQEAgLTk0Nyw3ICs5OTcsNyBAQAogCXUzMiB2ZnRhX29mZnNldCA9IDA7CiAJdTMyIHZmdGFfYml0X2luX3JlZyA9IDA7CiAKLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczKSB7CisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MyB8fCBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpIHsKIAkJaWYgKGh3LT5tbmdfY29va2llLnZsYW5faWQgIT0gMCkgewogCQkJLyoKIAkJCSAqIFRoZSBWRlRBIGlzIGEgNDA5NmIgYml0LWZpZWxkLCBlYWNoIGlkZW50aWZ5aW5nCkBAIC05NzYsNiArMTAyNiw0OCBAQAogfQogCiAvKioKKyAqICBlMTAwMF9jaGVja19tbmdfbW9kZV84MjU3NCAtIENoZWNrIG1hbmFnZWFiaWxpdHkgaXMgZW5hYmxlZAorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIFJlYWRzIHRoZSBOVk0gSW5pdGlhbGl6YXRpb24gQ29udHJvbCBXb3JkIDIgYW5kIHJldHVybnMgdHJ1ZQorICogICg+MCkgaWYgYW55IG1hbmFnZWFiaWxpdHkgaXMgZW5hYmxlZCwgZWxzZSBmYWxzZSAoMCkuCisgKiovCitzdGF0aWMgYm9vbCBlMTAwMF9jaGVja19tbmdfbW9kZV84MjU3NChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXUxNiBkYXRhOworCisJZTEwMDBfcmVhZF9udm0oaHcsIE5WTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmRhdGEpOworCXJldHVybiAoZGF0YSAmIEUxMDAwX05WTV9JTklUX0NUUkwyX01OR00pICE9IDA7Cit9CisKKy8qKgorICogIGUxMDAwX2xlZF9vbl84MjU3NCAtIFR1cm4gTEVEIG9uCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqCisgKiAgVHVybiBMRUQgb24uCisgKiovCitzdGF0aWMgczMyIGUxMDAwX2xlZF9vbl84MjU3NChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXUzMiBjdHJsOworCXUzMiBpOworCisJY3RybCA9IGh3LT5tYWMubGVkY3RsX21vZGUyOworCWlmICghKEUxMDAwX1NUQVRVU19MVSAmIGVyMzIoU1RBVFVTKSkpIHsKKwkJLyoKKwkJICogSWYgbm8gbGluaywgdGhlbiB0dXJuIExFRCBvbiBieSBzZXR0aW5nIHRoZSBpbnZlcnQgYml0CisJCSAqIGZvciBlYWNoIExFRCB0aGF0J3MgIm9uIiAoMHgwRSkgaW4gbGVkY3RsX21vZGUyLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWlmICgoKGh3LT5tYWMubGVkY3RsX21vZGUyID4+IChpICogOCkpICYgMHhGRikgPT0KKwkJCSAgICBFMTAwMF9MRURDVExfTU9ERV9MRURfT04pCisJCQkJY3RybCB8PSAoRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCA8PCAoaSAqIDgpKTsKKwl9CisJZXczMihMRURDVEwsIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogIGUxMDAwX3VwZGF0ZV9tY19hZGRyX2xpc3RfODI1NzEgLSBVcGRhdGUgTXVsdGljYXN0IGFkZHJlc3NlcwogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG1jX2FkZHJfbGlzdDogYXJyYXkgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBwcm9ncmFtCkBAIC0xMDE4LDcgKzExMTAsOCBAQAogCSAqIHRoZSBkZWZhdWx0IGZsb3cgY29udHJvbCBzZXR0aW5nLCBzbyB3ZSBleHBsaWNpdGx5CiAJICogc2V0IGl0IHRvIGZ1bGwuCiAJICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MykKKwlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MyB8fCBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpICYmCisJICAgIGh3LT5mYy50eXBlID09IGUxMDAwX2ZjX2RlZmF1bHQpCiAJCWh3LT5mYy50eXBlID0gZTEwMDBfZmNfZnVsbDsKIAogCXJldHVybiBlMTAwMGVfc2V0dXBfbGluayhodyk7CkBAIC0xMDQ1LDYgKzExMzgsNyBAQAogCiAJc3dpdGNoIChody0+cGh5LnR5cGUpIHsKIAljYXNlIGUxMDAwX3BoeV9tODg6CisJY2FzZSBlMTAwMF9waHlfYm06CiAJCXJldF92YWwgPSBlMTAwMGVfY29wcGVyX2xpbmtfc2V0dXBfbTg4KGh3KTsKIAkJYnJlYWs7CiAJY2FzZSBlMTAwMF9waHlfaWdwXzI6CkBAIC0xMTE0LDExICsxMjA4LDEwIEBACiAJCXJldHVybiByZXRfdmFsOwogCX0KIAotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzMgJiYKKwlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3MyB8fCBody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpICYmCiAJICAgICpkYXRhID09IElEX0xFRF9SRVNFUlZFRF9GNzQ2KQogCQkqZGF0YSA9IElEX0xFRF9ERUZBVUxUXzgyNTczOwotCWVsc2UgaWYgKCpkYXRhID09IElEX0xFRF9SRVNFUlZFRF8wMDAwIHx8Ci0JCSAqZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikKKwllbHNlIGlmICgqZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfMDAwMCB8fCAqZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikKIAkJKmRhdGEgPSBJRF9MRURfREVGQVVMVDsKIAogCXJldHVybiAwOwpAQCAtMTI2NSwxMyArMTM1OCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGUxMDAwX21hY19vcGVyYXRpb25zIGU4MjU3MV9tYWNfb3BzID0gewotCS5tbmdfbW9kZV9lbmFiCQk9IEUxMDAwX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZULAorCS8qIC5jaGVja19tbmdfbW9kZTogbWFjIHR5cGUgZGVwZW5kZW50ICovCiAJLyogLmNoZWNrX2Zvcl9saW5rOiBtZWRpYSB0eXBlIGRlcGVuZGVudCAqLwogCS5jbGVhbnVwX2xlZAkJPSBlMTAwMGVfY2xlYW51cF9sZWRfZ2VuZXJpYywKIAkuY2xlYXJfaHdfY250cnMJCT0gZTEwMDBfY2xlYXJfaHdfY250cnNfODI1NzEsCiAJLmdldF9idXNfaW5mbwkJPSBlMTAwMGVfZ2V0X2J1c19pbmZvX3BjaWUsCiAJLyogLmdldF9saW5rX3VwX2luZm86IG1lZGlhIHR5cGUgZGVwZW5kZW50ICovCi0JLmxlZF9vbgkJCT0gZTEwMDBlX2xlZF9vbl9nZW5lcmljLAorCS8qIC5sZWRfb246IG1hYyB0eXBlIGRlcGVuZGVudCAqLwogCS5sZWRfb2ZmCQk9IGUxMDAwZV9sZWRfb2ZmX2dlbmVyaWMsCiAJLnVwZGF0ZV9tY19hZGRyX2xpc3QJPSBlMTAwMF91cGRhdGVfbWNfYWRkcl9saXN0XzgyNTcxLAogCS5yZXNldF9odwkJPSBlMTAwMF9yZXNldF9od184MjU3MSwKQEAgLTEzMTIsNiArMTQwNSwyMiBAQAogCS53cml0ZV9waHlfcmVnCQk9IGUxMDAwZV93cml0ZV9waHlfcmVnX204OCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZTEwMDBfcGh5X29wZXJhdGlvbnMgZTgyX3BoeV9vcHNfYm0gPSB7CisJLmFjcXVpcmVfcGh5CQk9IGUxMDAwX2dldF9od19zZW1hcGhvcmVfODI1NzEsCisJLmNoZWNrX3Jlc2V0X2Jsb2NrCT0gZTEwMDBlX2NoZWNrX3Jlc2V0X2Jsb2NrX2dlbmVyaWMsCisJLmNvbW1pdF9waHkJCT0gZTEwMDBlX3BoeV9zd19yZXNldCwKKwkuZm9yY2Vfc3BlZWRfZHVwbGV4CT0gZTEwMDBlX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXhfbTg4LAorCS5nZXRfY2ZnX2RvbmUJCT0gZTEwMDBlX2dldF9jZmdfZG9uZSwKKwkuZ2V0X2NhYmxlX2xlbmd0aAk9IGUxMDAwZV9nZXRfY2FibGVfbGVuZ3RoX204OCwKKwkuZ2V0X3BoeV9pbmZvCQk9IGUxMDAwZV9nZXRfcGh5X2luZm9fbTg4LAorCS5yZWFkX3BoeV9yZWcJCT0gZTEwMDBlX3JlYWRfcGh5X3JlZ19ibTIsCisJLnJlbGVhc2VfcGh5CQk9IGUxMDAwX3B1dF9od19zZW1hcGhvcmVfODI1NzEsCisJLnJlc2V0X3BoeQkJPSBlMTAwMGVfcGh5X2h3X3Jlc2V0X2dlbmVyaWMsCisJLnNldF9kMF9scGx1X3N0YXRlCT0gZTEwMDBfc2V0X2QwX2xwbHVfc3RhdGVfODI1NzEsCisJLnNldF9kM19scGx1X3N0YXRlCT0gZTEwMDBlX3NldF9kM19scGx1X3N0YXRlLAorCS53cml0ZV9waHlfcmVnCQk9IGUxMDAwZV93cml0ZV9waHlfcmVnX2JtMiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZTEwMDBfbnZtX29wZXJhdGlvbnMgZTgyNTcxX252bV9vcHMgPSB7CiAJLmFjcXVpcmVfbnZtCQk9IGUxMDAwX2FjcXVpcmVfbnZtXzgyNTcxLAogCS5yZWFkX252bQkJPSBlMTAwMGVfcmVhZF9udm1fZWVyZCwKQEAgLTEzNzUsMyArMTQ4NCwyMSBAQAogCS5udm1fb3BzCQk9ICZlODI1NzFfbnZtX29wcywKIH07CiAKK3N0cnVjdCBlMTAwMF9pbmZvIGUxMDAwXzgyNTc0X2luZm8gPSB7CisJLm1hYwkJCT0gZTEwMDBfODI1NzQsCisJLmZsYWdzCQkJPSBGTEFHX0hBU19IV19WTEFOX0ZJTFRFUgorCQkJCSAgfCBGTEFHX0hBU19NU0lYCisJCQkJICB8IEZMQUdfSEFTX0pVTUJPX0ZSQU1FUworCQkJCSAgfCBGTEFHX0hBU19XT0wKKwkJCQkgIHwgRkxBR19BUE1FX0lOX0NUUkwzCisJCQkJICB8IEZMQUdfUlhfQ1NVTV9FTkFCTEVECisJCQkJICB8IEZMQUdfSEFTX1NNQVJUX1BPV0VSX0RPV04KKwkJCQkgIHwgRkxBR19IQVNfQU1UCisJCQkJICB8IEZMQUdfSEFTX0NUUkxFWFRfT05fTE9BRCwKKwkucGJhCQkJPSAyMCwKKwkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c184MjU3MSwKKwkubWFjX29wcwkJPSAmZTgyNTcxX21hY19vcHMsCisJLnBoeV9vcHMJCT0gJmU4Ml9waHlfb3BzX2JtLAorCS5udm1fb3BzCQk9ICZlODI1NzFfbnZtX29wcywKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9kZWZpbmVzLmggYi9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oCmluZGV4IDE0YjBlNmMuLjQ4Zjc5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaApAQCAtNzEsOSArNzEsMTEgQEAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX1BDSUVfU0VSREVTICAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0VJQU1FICAgICAgICAgIDB4MDEwMDAwMDAKICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQgICAgICAgMHgxMDAwMDAwMCAvKiBEcml2ZXIgbG9hZGVkIGJpdCBmb3IgRlcgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfSUFNRSAgICAgICAgICAgMHgwODAwMDAwMCAvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgQXV0by1tYXNrICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lOVF9USU1FUl9DTFIgIDB4MjAwMDAwMDAgLyogQ2xlYXIgSW50ZXJydXB0IHRpbWVycyBhZnRlciBJTVMgY2xlYXIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEJBX0NMUiAgICAgICAgMHg4MDAwMDAwMCAvKiBQQkEgQ2xlYXIgKi8KIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBFMTAwMF9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLwpAQCAtMjk5LDYgKzMwMSw3IEBACiAjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUFBDU0UgICAgMHgwMDAwMTAwMCAgIC8qIElQIHBheWxvYWQgY2hlY2tzdW0gZW5hYmxlICovCiAKIC8qIEhlYWRlciBzcGxpdCByZWNlaXZlICovCisjZGVmaW5lIEUxMDAwX1JGQ1RMX0FDS19ESVMgICAgICAgICAgICAgMHgwMDAwMTAwMAogI2RlZmluZSBFMTAwMF9SRkNUTF9FWFRFTiAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKICNkZWZpbmUgRTEwMDBfUkZDVExfSVBWNl9FWF9ESVMgICAgICAgICAweDAwMDEwMDAwCiAjZGVmaW5lIEUxMDAwX1JGQ1RMX05FV19JUFY2X0VYVF9ESVMgICAgMHgwMDAyMDAwMApAQCAtMzYzLDYgKzM2NiwxMSBAQAogI2RlZmluZSBFMTAwMF9JQ1JfUlhETVQwICAgICAgICAweDAwMDAwMDEwIC8qIFJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKDApICovCiAjZGVmaW5lIEUxMDAwX0lDUl9SWFQwICAgICAgICAgIDB4MDAwMDAwODAgLyogUnggdGltZXIgaW50ciAocmluZyAwKSAqLwogI2RlZmluZSBFMTAwMF9JQ1JfSU5UX0FTU0VSVEVEICAweDgwMDAwMDAwIC8qIElmIHRoaXMgYml0IGFzc2VydGVkLCB0aGUgZHJpdmVyIHNob3VsZCBjbGFpbSB0aGUgaW50ZXJydXB0ICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWFEwICAgICAgICAgIDB4MDAxMDAwMDAgLyogUnggUXVldWUgMCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYUTEgICAgICAgICAgMHgwMDIwMDAwMCAvKiBSeCBRdWV1ZSAxIEludGVycnVwdCAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhRMCAgICAgICAgICAweDAwNDAwMDAwIC8qIFR4IFF1ZXVlIDAgSW50ZXJydXB0ICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWFExICAgICAgICAgIDB4MDA4MDAwMDAgLyogVHggUXVldWUgMSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX09USEVSICAgICAgICAgMHgwMTAwMDAwMCAvKiBPdGhlciBJbnRlcnJ1cHRzICovCiAKIC8qCiAgKiBUaGlzIGRlZmluZXMgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSBJbnRlcnJ1cHQgTWFzawpAQCAtMzg2LDYgKzM5NCwxMSBAQAogI2RlZmluZSBFMTAwMF9JTVNfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUSAgICAgLyogUnggc2VxdWVuY2UgZXJyb3IgKi8KICNkZWZpbmUgRTEwMDBfSU1TX1JYRE1UMCAgICBFMTAwMF9JQ1JfUlhETVQwICAgIC8qIFJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KICNkZWZpbmUgRTEwMDBfSU1TX1JYVDAgICAgICBFMTAwMF9JQ1JfUlhUMCAgICAgIC8qIFJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYUTAgICAgICBFMTAwMF9JQ1JfUlhRMCAgICAgIC8qIFJ4IFF1ZXVlIDAgSW50ZXJydXB0ICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFExICAgICAgRTEwMDBfSUNSX1JYUTEgICAgICAvKiBSeCBRdWV1ZSAxIEludGVycnVwdCAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhRMCAgICAgIEUxMDAwX0lDUl9UWFEwICAgICAgLyogVHggUXVldWUgMCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYUTEgICAgICBFMTAwMF9JQ1JfVFhRMSAgICAgIC8qIFR4IFF1ZXVlIDEgSW50ZXJydXB0ICovCisjZGVmaW5lIEUxMDAwX0lNU19PVEhFUiAgICAgRTEwMDBfSUNSX09USEVSICAgICAvKiBPdGhlciBJbnRlcnJ1cHRzICovCiAKIC8qIEludGVycnVwdCBDYXVzZSBTZXQgKi8KICNkZWZpbmUgRTEwMDBfSUNTX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLwpAQCAtNTA1LDYgKzUxOCw3IEBACiAjZGVmaW5lIE5XQVlfTFBBUl9BU01fRElSICAgICAgICAweDA4MDAgLyogTFAgQXN5bW1ldHJpYyBQYXVzZSBEaXJlY3Rpb24gYml0ICovCiAKIC8qIEF1dG9uZWcgRXhwYW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIE5XQVlfRVJfTFBfTldBWV9DQVBTICAgICAweDAwMDEgLyogTFAgaGFzIEF1dG8gTmVnIENhcGFiaWxpdHkgKi8KIAogLyogMTAwMEJBU0UtVCBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIENSXzEwMDBUX0hEX0NBUFMgICAgICAgICAweDAxMDAgLyogQWR2ZXJ0aXNlIDEwMDBUIEhEIGNhcGFiaWxpdHkgKi8KQEAgLTU0MCw2ICs1NTQsNyBAQAogI2RlZmluZSBFMTAwMF9FRUNEX0RPICAgICAgICAweDAwMDAwMDA4IC8qIE5WTSBEYXRhIE91dCAqLwogI2RlZmluZSBFMTAwMF9FRUNEX1JFUSAgICAgICAweDAwMDAwMDQwIC8qIE5WTSBBY2Nlc3MgUmVxdWVzdCAqLwogI2RlZmluZSBFMTAwMF9FRUNEX0dOVCAgICAgICAweDAwMDAwMDgwIC8qIE5WTSBBY2Nlc3MgR3JhbnQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9QUkVTICAgICAgMHgwMDAwMDEwMCAvKiBOVk0gUHJlc2VudCAqLwogI2RlZmluZSBFMTAwMF9FRUNEX1NJWkUgICAgICAweDAwMDAwMjAwIC8qIE5WTSBTaXplICgwPTY0IHdvcmQgMT0yNTYgd29yZCkgKi8KIC8qIE5WTSBBZGRyZXNzaW5nIGJpdHMgYmFzZWQgb24gdHlwZSAoMC1zbWFsbCwgMS1sYXJnZSkgKi8KICNkZWZpbmUgRTEwMDBfRUVDRF9BRERSX0JJVFMgMHgwMDAwMDQwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaAppbmRleCBhYzRlNTA2Li5jNTVkZTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvZTEwMDAuaApAQCAtNjIsNiArNjIsMTEgQEAKIAllX3ByaW50ayhLRVJOX05PVElDRSwgYWRhcHRlciwgZm9ybWF0LCAjIyBhcmcpCiAKIAorLyogSW50ZXJydXB0IG1vZGVzLCBhcyB1c2VkIGJ5IHRoZSBJbnRNb2RlIHBhcmFtdGVyICovCisjZGVmaW5lIEUxMDAwRV9JTlRfTU9ERV9MRUdBQ1kJCTAKKyNkZWZpbmUgRTEwMDBFX0lOVF9NT0RFX01TSQkJMQorI2RlZmluZSBFMTAwMEVfSU5UX01PREVfTVNJWAkJMgorCiAvKiBUeC9SeCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KICNkZWZpbmUgRTEwMDBfREVGQVVMVF9UWEQJCTI1NgogI2RlZmluZSBFMTAwMF9NQVhfVFhECQkJNDA5NgpAQCAtOTUsOSArMTAwLDExIEBACiAJYm9hcmRfODI1NzEsCiAJYm9hcmRfODI1NzIsCiAJYm9hcmRfODI1NzMsCisJYm9hcmRfODI1NzQsCiAJYm9hcmRfODAwMDNlczJsYW4sCiAJYm9hcmRfaWNoOGxhbiwKIAlib2FyZF9pY2g5bGFuLAorCWJvYXJkX2ljaDEwbGFuLAogfTsKIAogc3RydWN0IGUxMDAwX3F1ZXVlX3N0YXRzIHsKQEAgLTE0Niw2ICsxNTMsMTIgQEAKIAkvKiBhcnJheSBvZiBidWZmZXIgaW5mb3JtYXRpb24gc3RydWN0cyAqLwogCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCisJY2hhciBuYW1lW0lGTkFNU0laICsgNV07CisJdTMyIGltc192YWw7CisJdTMyIGl0cl92YWw7CisJdTE2IGl0cl9yZWdpc3RlcjsKKwlpbnQgc2V0X2l0cjsKKwogCXN0cnVjdCBza19idWZmICpyeF9za2JfdG9wOwogCiAJc3RydWN0IGUxMDAwX3F1ZXVlX3N0YXRzIHN0YXRzOwpAQCAtMjU3LDcgKzI3MCw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7Ci0Jc3BpbmxvY2tfdCBzdGF0c19sb2NrOyAgICAgIC8qIHByZXZlbnQgY29uY3VycmVudCBzdGF0cyB1cGRhdGVzICovCiAKIAkvKiBzdHJ1Y3RzIGRlZmluZWQgaW4gZTEwMDBfaHcuaCAqLwogCXN0cnVjdCBlMTAwMF9odyBodzsKQEAgLTI3NCw2ICsyODYsOSBAQAogCXUzMiB0ZXN0X2ljcjsKIAogCXUzMiBtc2dfZW5hYmxlOworCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CisJaW50IGludF9tb2RlOworCXUzMiBlaWFjX21hc2s7CiAKIAl1MzIgZWVwcm9tX3dvbDsKIAl1MzIgd29sOwpAQCAtMjg0LDYgKzI5OSw4IEBACiAJdW5zaWduZWQgbG9uZyBsZWRfc3RhdHVzOwogCiAJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBkb3duc2hpZnRfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXBkYXRlX3BoeV90YXNrOwogfTsKIAogc3RydWN0IGUxMDAwX2luZm8gewpAQCAtMzA1LDcgKzMyMiw5IEBACiAjZGVmaW5lIEZMQUdfSEFTX0NUUkxFWFRfT05fTE9BRCAgICAgICAgICAoMSA8PCA1KQogI2RlZmluZSBGTEFHX0hBU19TV1NNX09OX0xPQUQgICAgICAgICAgICAgKDEgPDwgNikKICNkZWZpbmUgRkxBR19IQVNfSlVNQk9fRlJBTUVTICAgICAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIEZMQUdfUkVBRF9PTkxZX05WTSAgICAgICAgICAgICAgICAoMSA8PCA4KQogI2RlZmluZSBGTEFHX0lTX0lDSCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyNkZWZpbmUgRkxBR19IQVNfTVNJWCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEwKQogI2RlZmluZSBGTEFHX0hBU19TTUFSVF9QT1dFUl9ET1dOICAgICAgICAgKDEgPDwgMTEpCiAjZGVmaW5lIEZMQUdfSVNfUVVBRF9QT1JUX0EgICAgICAgICAgICAgICAoMSA8PCAxMikKICNkZWZpbmUgRkxBR19JU19RVUFEX1BPUlQgICAgICAgICAgICAgICAgICgxIDw8IDEzKQpAQCAtMzY0LDYgKzM4Myw4IEBACiBleHRlcm4gdm9pZCBlMTAwMGVfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIHZvaWQgZTEwMDBlX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIGUxMDAwZV91cGRhdGVfc3RhdHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBlMTAwMGVfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGNvcHlicmVhazsKIApAQCAtMzcyLDggKzM5MywxMCBAQAogZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwXzgyNTcxX2luZm87CiBleHRlcm4gc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfODI1NzJfaW5mbzsKIGV4dGVybiBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF84MjU3M19pbmZvOworZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwXzgyNTc0X2luZm87CiBleHRlcm4gc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfaWNoOF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwX2ljaDlfaW5mbzsKK2V4dGVybiBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF9pY2gxMF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwX2VzMl9pbmZvOwogCiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX3BiYV9udW0oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpwYmFfbnVtKTsKQEAgLTM4NSw2ICs0MDgsNyBAQAogZXh0ZXJuIGJvb2wgZTEwMDBlX2dldF9sYWFfc3RhdGVfODI1NzEoc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gdm9pZCBlMTAwMGVfc2V0X2xhYV9zdGF0ZV84MjU3MShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sIHN0YXRlKTsKIAorZXh0ZXJuIHZvaWQgZTEwMDBlX3dyaXRlX3Byb3RlY3RfbnZtX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBleHRlcm4gdm9pZCBlMTAwMGVfc2V0X2ttcm5fbG9ja19sb3NzX3dvcmthcm91bmRfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LAogCQkJCQkJIGJvb2wgc3RhdGUpOwogZXh0ZXJuIHZvaWQgZTEwMDBlX2lncDNfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CkBAIC00NDYsMTAgKzQ3MCwxMyBAQAogZXh0ZXJuIHMzMiBlMTAwMGVfZ2V0X3BoeV9pbmZvX204OChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19tODgoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKIGV4dGVybiBzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfbTg4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBlX3BoeV9pbml0X3NjcmlwdF9pZ3AzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIGVudW0gZTEwMDBfcGh5X3R5cGUgZTEwMDBlX2dldF9waHlfdHlwZV9mcm9tX2lkKHUzMiBwaHlfaWQpOwogZXh0ZXJuIHMzMiBlMTAwMGVfZGV0ZXJtaW5lX3BoeV9hZGRyZXNzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogZXh0ZXJuIHMzMiBlMTAwMGVfd3JpdGVfcGh5X3JlZ19ibShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgZGF0YSk7CiBleHRlcm4gczMyIGUxMDAwZV9yZWFkX3BoeV9yZWdfYm0oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBlX3JlYWRfcGh5X3JlZ19ibTIoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2ICpkYXRhKTsKK2V4dGVybiBzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfYm0yKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKTsKIGV4dGVybiB2b2lkIGUxMDAwZV9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4X3NldHVwKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiAqcGh5X2N0cmwpOwogZXh0ZXJuIHMzMiBlMTAwMGVfd3JpdGVfa21ybl9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwgdTE2IGRhdGEpOwogZXh0ZXJuIHMzMiBlMTAwMGVfcmVhZF9rbXJuX3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpOwpAQCAtNTIwLDcgKzU0NywxMiBAQAogCXJldHVybiBody0+cGh5Lm9wcy5nZXRfcGh5X2luZm8oaHcpOwogfQogCi1leHRlcm4gYm9vbCBlMTAwMGVfY2hlY2tfbW5nX21vZGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW5saW5lIHMzMiBlMTAwMGVfY2hlY2tfbW5nX21vZGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlyZXR1cm4gaHctPm1hYy5vcHMuY2hlY2tfbW5nX21vZGUoaHcpOworfQorCitleHRlcm4gYm9vbCBlMTAwMGVfY2hlY2tfbW5nX21vZGVfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBib29sIGUxMDAwZV9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGV4dGVybiBzMzIgZTEwMDBlX21uZ193cml0ZV9kaGNwX2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywgdTggKmJ1ZmZlciwgdTE2IGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYwppbmRleCBkYzU1MmQ3Li5kYTljMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCkBAIC0xMjQ3LDcgKzEyNDcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGUxMDAwX21hY19vcGVyYXRpb25zIGVzMl9tYWNfb3BzID0gewotCS5tbmdfbW9kZV9lbmFiCQk9IEUxMDAwX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZULAorCS5jaGVja19tbmdfbW9kZQkJPSBlMTAwMGVfY2hlY2tfbW5nX21vZGVfZ2VuZXJpYywKIAkvKiBjaGVja19mb3JfbGluayBkZXBlbmRlbnQgb24gbWVkaWEgdHlwZSAqLwogCS5jbGVhbnVwX2xlZAkJPSBlMTAwMGVfY2xlYW51cF9sZWRfZ2VuZXJpYywKIAkuY2xlYXJfaHdfY250cnMJCT0gZTEwMDBfY2xlYXJfaHdfY250cnNfODAwMDNlczJsYW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL2V0aHRvb2wuYwppbmRleCBlMjFjOWUwLi43MGMxMWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMKQEAgLTQzMiw2ICs0MzIsMTAgQEAKIAlyZWdzX2J1ZmZbMTFdID0gZXIzMihUSURWKTsKIAogCXJlZ3NfYnVmZlsxMl0gPSBhZGFwdGVyLT5ody5waHkudHlwZTsgIC8qIFBIWSB0eXBlIChJR1A9MSwgTTg4PTApICovCisKKwkvKiBldGh0b29sIGRvZXNuJ3QgdXNlIGFueXRoaW5nIHBhc3QgdGhpcyBwb2ludCwgc28gYWxsIHRoaXMKKwkgKiBjb2RlIGlzIGxpa2VseSBsZWdhY3kganVuayBmb3IgYXBwcyB0aGF0IG1heSBvciBtYXkgbm90CisJICogZXhpc3QgKi8KIAlpZiAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9tODgpIHsKIAkJZTFlX3JwaHkoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywgJnBoeV9kYXRhKTsKIAkJcmVnc19idWZmWzEzXSA9ICh1MzIpcGh5X2RhdGE7IC8qIGNhYmxlIGxlbmd0aCAqLwpAQCAtNDQ3LDcgKzQ1MSw3IEBACiAJCXJlZ3NfYnVmZlsyMl0gPSBhZGFwdGVyLT5waHlfc3RhdHMucmVjZWl2ZV9lcnJvcnM7CiAJCXJlZ3NfYnVmZlsyM10gPSByZWdzX2J1ZmZbMTNdOyAvKiBtZGl4IG1vZGUgKi8KIAl9Ci0JcmVnc19idWZmWzIxXSA9IGFkYXB0ZXItPnBoeV9zdGF0cy5pZGxlX2Vycm9yczsgIC8qIHBoeSBpZGxlIGVycm9ycyAqLworCXJlZ3NfYnVmZlsyMV0gPSAwOyAvKiB3YXMgaWRsZV9lcnJvcnMgKi8KIAllMWVfcnBoeShodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKIAlyZWdzX2J1ZmZbMjRdID0gKHUzMilwaHlfZGF0YTsgIC8qIHBoeSBsb2NhbCByZWNlaXZlciBzdGF0dXMgKi8KIAlyZWdzX2J1ZmZbMjVdID0gcmVnc19idWZmWzI0XTsgIC8qIHBoeSByZW1vdGUgcmVjZWl2ZXIgc3RhdHVzICovCkBAIC01MjksNiArNTMzLDkgQEAKIAlpZiAoZWVwcm9tLT5tYWdpYyAhPSAoYWRhcHRlci0+cGRldi0+dmVuZG9yIHwgKGFkYXB0ZXItPnBkZXYtPmRldmljZSA8PCAxNikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfUkVBRF9PTkxZX05WTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltYXhfbGVuID0gaHctPm52bS53b3JkX3NpemUgKiAyOwogCiAJZmlyc3Rfd29yZCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDE7CkBAIC01NjgsNiArNTc1LDcgQEAKIAkgKiBhbmQgZmx1c2ggc2hhZG93IFJBTSBmb3IgODI1NzMgY29udHJvbGxlcnMKIAkgKi8KIAlpZiAoKHJldF92YWwgPT0gMCkgJiYgKChmaXJzdF93b3JkIDw9IE5WTV9DSEVDS1NVTV9SRUcpIHx8CisJCQkgICAgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkgfHwKIAkJCSAgICAgICAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTczKSkpCiAJCWUxMDAwZV91cGRhdGVfbnZtX2NoZWNrc3VtKGh3KTsKIApAQCAtNzc5LDggKzc4NywxMCBAQAogCQl0b2dnbGUgPSAweDdGRkZGM0ZGOwogCQlicmVhazsKIAljYXNlIGUxMDAwXzgyNTczOgorCWNhc2UgZTEwMDBfODI1NzQ6CiAJY2FzZSBlMTAwMF9pY2g4bGFuOgogCWNhc2UgZTEwMDBfaWNoOWxhbjoKKwljYXNlIGUxMDAwX2ljaDEwbGFuOgogCQl0b2dnbGUgPSAweDdGRkZGMDMzOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODMzLDcgKzg0Myw5IEBACiAJUkVHX1BBVFRFUk5fVEVTVChFMTAwMF9USURWLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWFjLT5yYXJfZW50cnlfY291bnQ7IGkrKykKIAkJUkVHX1BBVFRFUk5fVEVTVF9BUlJBWShFMTAwMF9SQSwgKChpIDw8IDEpICsgMSksCi0JCQkJICAgICAgIDB4ODAwM0ZGRkYsIDB4RkZGRkZGRkYpOworCQkJCSAgICAgICAoKG1hYy0+dHlwZSA9PSBlMTAwMF9pY2gxMGxhbikgPworCQkJCQkgICAweDgwMDdGRkZGIDogMHg4MDAzRkZGRiksCisJCQkJICAgICAgIDB4RkZGRkZGRkYpOwogCiAJZm9yIChpID0gMDsgaSA8IG1hYy0+bXRhX3JlZ19jb3VudDsgaSsrKQogCQlSRUdfUEFUVEVSTl9URVNUX0FSUkFZKEUxMDAwX01UQSwgaSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CkBAIC04ODQsMTAgKzg5NiwxOCBAQAogCXUzMiBzaGFyZWRfaW50ID0gMTsKIAl1MzIgaXJxID0gYWRhcHRlci0+cGRldi0+aXJxOwogCWludCBpOworCWludCByZXRfdmFsID0gMDsKKwlpbnQgaW50X21vZGUgPSBFMTAwMEVfSU5UX01PREVfTEVHQUNZOwogCiAJKmRhdGEgPSAwOwogCi0JLyogTk9URTogd2UgZG9uJ3QgdGVzdCBNU0kgaW50ZXJydXB0cyBoZXJlLCB5ZXQgKi8KKwkvKiBOT1RFOiB3ZSBkb24ndCB0ZXN0IE1TSS9NU0ktWCBpbnRlcnJ1cHRzIGhlcmUsIHlldCAqLworCWlmIChhZGFwdGVyLT5pbnRfbW9kZSA9PSBFMTAwMEVfSU5UX01PREVfTVNJWCkgeworCQlpbnRfbW9kZSA9IGFkYXB0ZXItPmludF9tb2RlOworCQllMTAwMGVfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CisJCWFkYXB0ZXItPmludF9tb2RlID0gRTEwMDBFX0lOVF9NT0RFX0xFR0FDWTsKKwkJZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKKwl9CiAJLyogSG9vayB1cCB0ZXN0IGludGVycnVwdCBoYW5kbGVyIGp1c3QgZm9yIHRoaXMgdGVzdCAqLwogCWlmICghcmVxdWVzdF9pcnEoaXJxLCAmZTEwMDBfdGVzdF9pbnRyLCBJUlFGX1BST0JFX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLAogCQkJIG5ldGRldikpIHsKQEAgLTg5NSw3ICs5MTUsOCBAQAogCX0gZWxzZSBpZiAocmVxdWVzdF9pcnEoaXJxLCAmZTEwMDBfdGVzdF9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkgewogCQkqZGF0YSA9IDE7Ci0JCXJldHVybiAtMTsKKwkJcmV0X3ZhbCA9IC0xOworCQlnb3RvIG91dDsKIAl9CiAJZV9pbmZvKCJ0ZXN0aW5nICVzIGludGVycnVwdFxuIiwgKHNoYXJlZF9pbnQgPyAic2hhcmVkIiA6ICJ1bnNoYXJlZCIpKTsKIApAQCAtOTA1LDEyICs5MjYsMjMgQEAKIAogCS8qIFRlc3QgZWFjaCBpbnRlcnJ1cHQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRkxBR19JU19JQ0gpICYmIChpID09IDgpKQotCQkJY29udGludWU7Ci0KIAkJLyogSW50ZXJydXB0IHRvIHRlc3QgKi8KIAkJbWFzayA9IDEgPDwgaTsKIAorCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX0lDSCkgeworCQkJc3dpdGNoIChtYXNrKSB7CisJCQljYXNlIEUxMDAwX0lDUl9SWFNFUToKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMHgwMDAwMDEwMDoKKwkJCQlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gZTEwMDBfaWNoOGxhbiB8fAorCQkJCSAgICBhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pY2g5bGFuKQorCQkJCQljb250aW51ZTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwogCQlpZiAoIXNoYXJlZF9pbnQpIHsKIAkJCS8qCiAJCQkgKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgdG8gYmUgcmVwb3J0ZWQgaW4KQEAgLTk3NCw3ICsxMDA2LDE0IEBACiAJLyogVW5ob29rIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlmcmVlX2lycShpcnEsIG5ldGRldik7CiAKLQlyZXR1cm4gKmRhdGE7CitvdXQ6CisJaWYgKGludF9tb2RlID09IEUxMDAwRV9JTlRfTU9ERV9NU0lYKSB7CisJCWUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKKwkJYWRhcHRlci0+aW50X21vZGUgPSBpbnRfbW9kZTsKKwkJZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogc3RhdGljIHZvaWQgZTEwMDBfZnJlZV9kZXNjX3JpbmdzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTc1NSwxMSArMTc5NCwxMyBAQAogc3RhdGljIGludCBlMTAwMF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJaWYgKCFkYXRhKQogCQlkYXRhID0gSU5UX01BWDsKIAotCWlmIChhZGFwdGVyLT5ody5waHkudHlwZSA9PSBlMTAwMF9waHlfaWZlKSB7CisJaWYgKChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5X2lmZSkgfHwKKwkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF84MjU3NCkpIHsKIAkJaWYgKCFhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbikgewogCQkJaW5pdF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIpOwogCQkJYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPQpAQCAtMTc2OSwxNiArMTgxMCwxNiBAQAogCQltb2RfdGltZXIoJmFkYXB0ZXItPmJsaW5rX3RpbWVyLCBqaWZmaWVzKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwogCQlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+YmxpbmtfdGltZXIpOwotCQllMWVfd3BoeSgmYWRhcHRlci0+aHcsCi0JCQkJICAgIElGRV9QSFlfU1BFQ0lBTF9DT05UUk9MX0xFRCwgMCk7CisJCWlmIChody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5X2lmZSkKKwkJCWUxZV93cGh5KGh3LCBJRkVfUEhZX1NQRUNJQUxfQ09OVFJPTF9MRUQsIDApOwogCX0gZWxzZSB7Ci0JCWUxMDAwZV9ibGlua19sZWQoJmFkYXB0ZXItPmh3KTsKKwkJZTEwMDBlX2JsaW5rX2xlZChodyk7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKIAl9CiAKLQlhZGFwdGVyLT5ody5tYWMub3BzLmxlZF9vZmYoJmFkYXB0ZXItPmh3KTsKKwlody0+bWFjLm9wcy5sZWRfb2ZmKGh3KTsKIAljbGVhcl9iaXQoRTEwMDBfTEVEX09OLCAmYWRhcHRlci0+bGVkX3N0YXR1cyk7Ci0JYWRhcHRlci0+aHcubWFjLm9wcy5jbGVhbnVwX2xlZCgmYWRhcHRlci0+aHcpOworCWh3LT5tYWMub3BzLmNsZWFudXBfbGVkKGh3KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAppbmRleCA3NGYyNjNhLi5mNjZlZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaHcuaApAQCAtNjUsNyArNjUsMTEgQEAKIAlFMTAwMF9JQ1MgICAgICA9IDB4MDAwQzgsIC8qIEludGVycnVwdCBDYXVzZSBTZXQgLSBXTyAqLwogCUUxMDAwX0lNUyAgICAgID0gMHgwMDBEMCwgLyogSW50ZXJydXB0IE1hc2sgU2V0IC0gUlcgKi8KIAlFMTAwMF9JTUMgICAgICA9IDB4MDAwRDgsIC8qIEludGVycnVwdCBNYXNrIENsZWFyIC0gV08gKi8KKwlFMTAwMF9FSUFDXzgyNTc0ID0gMHgwMDBEQywgLyogRXh0LiBJbnRlcnJ1cHQgQXV0byBDbGVhciAtIFJXICovCiAJRTEwMDBfSUFNICAgICAgPSAweDAwMEUwLCAvKiBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgQXV0byBNYXNrICovCisJRTEwMDBfSVZBUiAgICAgPSAweDAwMEU0LCAvKiBJbnRlcnJ1cHQgVmVjdG9yIEFsbG9jYXRpb24gLSBSVyAqLworCUUxMDAwX0VJVFJfODI1NzRfQkFTRSA9IDB4MDAwRTgsIC8qIEludGVycnVwdCBUaHJvdHRsaW5nIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRUlUUl84MjU3NChfbikgKEUxMDAwX0VJVFJfODI1NzRfQkFTRSArIChfbiA8PCAyKSkKIAlFMTAwMF9SQ1RMICAgICA9IDB4MDAxMDAsIC8qIFJ4IENvbnRyb2wgLSBSVyAqLwogCUUxMDAwX0ZDVFRWICAgID0gMHgwMDE3MCwgLyogRmxvdyBDb250cm9sIFRyYW5zbWl0IFRpbWVyIFZhbHVlIC0gUlcgKi8KIAlFMTAwMF9UWENXICAgICA9IDB4MDAxNzgsIC8qIFR4IENvbmZpZ3VyYXRpb24gV29yZCAtIFJXICovCkBAIC0zMzIsNiArMzM2LDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTczRQkJCTB4MTA4QgogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzNFX0lBTVQJCTB4MTA4QwogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzNMCQkJMHgxMDlBCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3NEwJCQkweDEwRDMKIAogI2RlZmluZSBFMTAwMF9ERVZfSURfODAwMDNFUzJMQU5fQ09QUEVSX0RQVAkweDEwOTYKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX1NFUkRFU19EUFQJMHgxMDk4CkBAIC0zNDYsNiArMzUxLDcgQEAKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0cJCQkweDEwQzUKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX00JCQkweDEwNEQKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDlfSUdQX0FNVAkJMHgxMEJECisjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g5X0JNCQkJMHgxMEU1CiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g5X0lHUF9NX0FNVAkJMHgxMEY1CiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g5X0lHUF9NCQkJMHgxMEJGCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g5X0lHUF9NX1YJCTB4MTBDQgpAQCAtMzU2LDYgKzM2MiwxMCBAQAogI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIMTBfUl9CTV9MTQkJMHgxMENDCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0gxMF9SX0JNX0xGCQkweDEwQ0QKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDEwX1JfQk1fVgkJMHgxMENFCisjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0gxMF9EX0JNX0xNCQkweDEwREUKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDEwX0RfQk1fTEYJCTB4MTBERgorCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzQgNAogCiAjZGVmaW5lIEUxMDAwX0ZVTkNfMSAxCiAKQEAgLTM2Myw5ICszNzMsMTEgQEAKIAllMTAwMF84MjU3MSwKIAllMTAwMF84MjU3MiwKIAllMTAwMF84MjU3MywKKwllMTAwMF84MjU3NCwKIAllMTAwMF84MDAwM2VzMmxhbiwKIAllMTAwMF9pY2g4bGFuLAogCWUxMDAwX2ljaDlsYW4sCisJZTEwMDBfaWNoMTBsYW4sCiB9OwogCiBlbnVtIGUxMDAwX21lZGlhX3R5cGUgewpAQCAtNjk2LDggKzcwOCw3IEBACiAKIC8qIEZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBzdGF0aWMgZGF0YSBmb3IgdGhlIE1BQy4gKi8KIHN0cnVjdCBlMTAwMF9tYWNfb3BlcmF0aW9ucyB7Ci0JdTMyCQkJbW5nX21vZGVfZW5hYjsKLQorCWJvb2wgKCpjaGVja19tbmdfbW9kZSkoc3RydWN0IGUxMDAwX2h3ICopOwogCXMzMiAgKCpjaGVja19mb3JfbGluaykoc3RydWN0IGUxMDAwX2h3ICopOwogCXMzMiAgKCpjbGVhbnVwX2xlZCkoc3RydWN0IGUxMDAwX2h3ICopOwogCXZvaWQgKCpjbGVhcl9od19jbnRycykoc3RydWN0IGUxMDAwX2h3ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggOWUzODQ1Mi4uNTIzYjk3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCkBAIC00Myw3ICs0Myw5IEBACiAgKiA4MjU2N0xNLTIgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KICAqIDgyNTY3TEYtMiBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgogICogODI1NjdWLTIgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KLSAqIDgyNTYyR1QtMyAxMC8xMDAgTmV0d29yayBDb25uZWN0aW9uCisgKiA4MjU2N0xGLTMgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KKyAqIDgyNTY3TE0tMyBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgorICogODI1NjdMTS00IEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpAQCAtNTgsNiArNjAsNyBAQAogI2RlZmluZSBJQ0hfRkxBU0hfSFNGQ1RMCQkweDAwMDYKICNkZWZpbmUgSUNIX0ZMQVNIX0ZBRERSCQkJMHgwMDA4CiAjZGVmaW5lIElDSF9GTEFTSF9GREFUQTAJCTB4MDAxMAorI2RlZmluZSBJQ0hfRkxBU0hfUFIwCQkJMHgwMDc0CiAKICNkZWZpbmUgSUNIX0ZMQVNIX1JFQURfQ09NTUFORF9USU1FT1VUCTUwMAogI2RlZmluZSBJQ0hfRkxBU0hfV1JJVEVfQ09NTUFORF9USU1FT1VUCTUwMApAQCAtMTUwLDYgKzE1MywxOSBAQAogCXUxNiByZWd2YWw7CiB9OwogCisvKiBJQ0ggRmxhc2ggUHJvdGVjdGVkIFJlZ2lvbiAqLwordW5pb24gaWNoOF9mbGFzaF9wcm90ZWN0ZWRfcmFuZ2UgeworCXN0cnVjdCBpY2g4X3ByIHsKKwkJdTMyIGJhc2U6MTM7ICAgICAvKiAwOjEyIFByb3RlY3RlZCBSYW5nZSBCYXNlICovCisJCXUzMiByZXNlcnZlZDE6MjsgLyogMTM6MTQgUmVzZXJ2ZWQgKi8KKwkJdTMyIHJwZToxOyAgICAgICAvKiAxNSBSZWFkIFByb3RlY3Rpb24gRW5hYmxlICovCisJCXUzMiBsaW1pdDoxMzsgICAgLyogMTY6MjggUHJvdGVjdGVkIFJhbmdlIExpbWl0ICovCisJCXUzMiByZXNlcnZlZDI6MjsgLyogMjk6MzAgUmVzZXJ2ZWQgKi8KKwkJdTMyIHdwZToxOyAgICAgICAvKiAzMSBXcml0ZSBQcm90ZWN0aW9uIEVuYWJsZSAqLworCX0gcmFuZ2U7CisJdTMyIHJlZ3ZhbDsKK307CisKIHN0YXRpYyBzMzIgZTEwMDBfc2V0dXBfbGlua19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHZvaWQgZTEwMDBfY2xlYXJfaHdfY250cnNfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIGUxMDAwX2luaXRpYWxpemVfaHdfYml0c19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMTU3LDEyICsxNzMsMTUgQEAKIHN0YXRpYyBzMzIgZTEwMDBfZXJhc2VfZmxhc2hfYmFua19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBiYW5rKTsKIHN0YXRpYyBzMzIgZTEwMDBfcmV0cnlfd3JpdGVfZmxhc2hfYnl0ZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsCiAJCQkJCQl1MzIgb2Zmc2V0LCB1OCBieXRlKTsKK3N0YXRpYyBzMzIgZTEwMDBfcmVhZF9mbGFzaF9ieXRlX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKKwkJCQkJIHU4ICpkYXRhKTsKIHN0YXRpYyBzMzIgZTEwMDBfcmVhZF9mbGFzaF93b3JkX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKIAkJCQkJIHUxNiAqZGF0YSk7CiBzdGF0aWMgczMyIGUxMDAwX3JlYWRfZmxhc2hfZGF0YV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCiAJCQkJCSB1OCBzaXplLCB1MTYgKmRhdGEpOwogc3RhdGljIHMzMiBlMTAwMF9zZXR1cF9jb3BwZXJfbGlua19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogc3RhdGljIHMzMiBlMTAwMF9rbXJuX2xvY2tfbG9zc193b3JrYXJvdW5kX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgczMyIGUxMDAwX2dldF9jZmdfZG9uZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwogCiBzdGF0aWMgaW5saW5lIHUxNiBfX2VyMTZmbGFzaChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJlZykKIHsKQEAgLTM2Niw2ICszODUsOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgREVGSU5FX01VVEVYKG52bV9tdXRleCk7CitzdGF0aWMgcGlkX3QgbnZtX293bmVyID0gLTE7CisKIC8qKgogICogIGUxMDAwX2FjcXVpcmVfc3dmbGFnX2ljaDhsYW4gLSBBY3F1aXJlIHNvZnR3YXJlIGNvbnRyb2wgZmxhZwogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCkBAIC0zNzksNiArNDAxLDE1IEBACiAJdTMyIGV4dGNuZl9jdHJsOwogCXUzMiB0aW1lb3V0ID0gUEhZX0NGR19USU1FT1VUOwogCisJbWlnaHRfc2xlZXAoKTsKKworCWlmICghbXV0ZXhfdHJ5bG9jaygmbnZtX211dGV4KSkgeworCQlXQVJOKDEsIEtFUk5fRVJSICJlMTAwMGUgbXV0ZXggY29udGVudGlvbi4gT3duZWQgYnkgcGlkICVkXG4iLAorCQkgICAgIG52bV9vd25lcik7CisJCW11dGV4X2xvY2soJm52bV9tdXRleCk7CisJfQorCW52bV9vd25lciA9IGN1cnJlbnQtPnBpZDsKKwogCXdoaWxlICh0aW1lb3V0KSB7CiAJCWV4dGNuZl9jdHJsID0gZXIzMihFWFRDTkZfQ1RSTCk7CiAJCWV4dGNuZl9jdHJsIHw9IEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKQEAgLTM5Myw2ICs0MjQsMTAgQEAKIAogCWlmICghdGltZW91dCkgewogCQlod19kYmcoaHcsICJGVyBvciBIVyBoYXMgbG9ja2VkIHRoZSByZXNvdXJjZSBmb3IgdG9vIGxvbmcuXG4iKTsKKwkJZXh0Y25mX2N0cmwgJj0gfkUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKKwkJZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOworCQludm1fb3duZXIgPSAtMTsKKwkJbXV0ZXhfdW5sb2NrKCZudm1fbXV0ZXgpOwogCQlyZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CiAJfQogCkBAIC00MTQsNiArNDQ5LDI1IEBACiAJZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKIAlleHRjbmZfY3RybCAmPSB+RTEwMDBfRVhUQ05GX0NUUkxfU1dGTEFHOwogCWV3MzIoRVhUQ05GX0NUUkwsIGV4dGNuZl9jdHJsKTsKKworCW52bV9vd25lciA9IC0xOworCW11dGV4X3VubG9jaygmbnZtX211dGV4KTsKK30KKworLyoqCisgKiAgZTEwMDBfY2hlY2tfbW5nX21vZGVfaWNoOGxhbiAtIENoZWNrcyBtYW5hZ2VtZW50IG1vZGUKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICoKKyAqICBUaGlzIGNoZWNrcyBpZiB0aGUgYWRhcHRlciBoYXMgbWFuYWdlYWJpbGl0eSBlbmFibGVkLgorICogIFRoaXMgaXMgYSBmdW5jdGlvbiBwb2ludGVyIGVudHJ5IHBvaW50IG9ubHkgY2FsbGVkIGJ5IHJlYWQvd3JpdGUKKyAqICByb3V0aW5lcyBmb3IgdGhlIFBIWSBhbmQgTlZNIHBhcnRzLgorICoqLworc3RhdGljIGJvb2wgZTEwMDBfY2hlY2tfbW5nX21vZGVfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXUzMiBmd3NtID0gZXIzMihGV1NNKTsKKworCXJldHVybiAoZndzbSAmIEUxMDAwX0ZXU01fTU9ERV9NQVNLKSA9PQorCQkoRTEwMDBfSUNIX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKTsKIH0KIAogLyoqCkBAIC04OTcsNiArOTUxLDU2IEBACiB9CiAKIC8qKgorICogIGUxMDAwX3ZhbGlkX252bV9iYW5rX2RldGVjdF9pY2g4bGFuIC0gZmluZHMgb3V0IHRoZSB2YWxpZCBiYW5rIDAgb3IgMQorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQGJhbms6ICBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIGFjdGl2ZSBiYW5rCisgKgorICogIFJlYWRzIHNpZ25hdHVyZSBieXRlIGZyb20gdGhlIE5WTSB1c2luZyB0aGUgZmxhc2ggYWNjZXNzIHJlZ2lzdGVycy4KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfdmFsaWRfbnZtX2JhbmtfZGV0ZWN0X2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyICpiYW5rKQoreworCXN0cnVjdCBlMTAwMF9udm1faW5mbyAqbnZtID0gJmh3LT5udm07CisJLyogZmxhc2ggYmFuayBzaXplIGlzIGluIHdvcmRzICovCisJdTMyIGJhbmsxX29mZnNldCA9IG52bS0+Zmxhc2hfYmFua19zaXplICogc2l6ZW9mKHUxNik7CisJdTMyIGFjdF9vZmZzZXQgPSBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEICogMiArIDE7CisJdTggYmFua19oaWdoX2J5dGUgPSAwOworCisJaWYgKGh3LT5tYWMudHlwZSAhPSBlMTAwMF9pY2gxMGxhbikgeworCQlpZiAoZXIzMihFRUNEKSAmIEUxMDAwX0VFQ0RfU0VDMVZBTCkKKwkJCSpiYW5rID0gMTsKKwkJZWxzZQorCQkJKmJhbmsgPSAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgc2lnbmF0dXJlIGZvciBiYW5rIDAgaXMgdmFsaWQsCisJCSAqIGlmIG5vdCBjaGVjayBmb3IgYmFuazEKKwkJICovCisJCWUxMDAwX3JlYWRfZmxhc2hfYnl0ZV9pY2g4bGFuKGh3LCBhY3Rfb2Zmc2V0LCAmYmFua19oaWdoX2J5dGUpOworCQlpZiAoKGJhbmtfaGlnaF9ieXRlICYgMHhDMCkgPT0gMHg4MCkgeworCQkJKmJhbmsgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGZpbmQgaWYgc2VnbWVudCAxIGlzIHZhbGlkIGJ5IHZlcmlmeWluZworCQkJICogYml0IDE1OjE0ID0gMTBiIGluIHdvcmQgMHgxMworCQkJICovCisJCQllMTAwMF9yZWFkX2ZsYXNoX2J5dGVfaWNoOGxhbihodywKKwkJCQkJCSAgICAgIGFjdF9vZmZzZXQgKyBiYW5rMV9vZmZzZXQsCisJCQkJCQkgICAgICAmYmFua19oaWdoX2J5dGUpOworCisJCQkvKiBiYW5rMSBoYXMgYSB2YWxpZCBzaWduYXR1cmUgZXF1aXZhbGVudCB0byBTRUMxViAqLworCQkJaWYgKChiYW5rX2hpZ2hfYnl0ZSAmIDB4QzApID09IDB4ODApIHsKKwkJCQkqYmFuayA9IDE7CisJCQl9IGVsc2UgeworCQkJCWh3X2RiZyhodywgIkVSUk9SOiBFRVBST00gbm90IHByZXNlbnRcbiIpOworCQkJCXJldHVybiAtRTEwMDBfRVJSX05WTTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqICBlMTAwMF9yZWFkX252bV9pY2g4bGFuIC0gUmVhZCB3b3JkKHMpIGZyb20gdGhlIE5WTQogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogVGhlIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSB3b3JkKHMpIHRvIHJlYWQuCkBAIC05MTIsNiArMTAxNiw3IEBACiAJc3RydWN0IGUxMDAwX2Rldl9zcGVjX2ljaDhsYW4gKmRldl9zcGVjID0gJmh3LT5kZXZfc3BlYy5pY2g4bGFuOwogCXUzMiBhY3Rfb2Zmc2V0OwogCXMzMiByZXRfdmFsOworCXUzMiBiYW5rID0gMDsKIAl1MTYgaSwgd29yZDsKIAogCWlmICgob2Zmc2V0ID49IG52bS0+d29yZF9zaXplKSB8fCAod29yZHMgPiBudm0tPndvcmRfc2l6ZSAtIG9mZnNldCkgfHwKQEAgLTkyNCwxMCArMTAyOSwxMSBAQAogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCS8qIFN0YXJ0IHdpdGggdGhlIGJhbmsgb2Zmc2V0LCB0aGVuIGFkZCB0aGUgcmVsYXRpdmUgb2Zmc2V0LiAqLwotCWFjdF9vZmZzZXQgPSAoZXIzMihFRUNEKSAmIEUxMDAwX0VFQ0RfU0VDMVZBTCkKLQkJICAgICA/IG52bS0+Zmxhc2hfYmFua19zaXplCi0JCSAgICAgOiAwOworCXJldF92YWwgPSBlMTAwMF92YWxpZF9udm1fYmFua19kZXRlY3RfaWNoOGxhbihodywgJmJhbmspOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCWFjdF9vZmZzZXQgPSAoYmFuaykgPyBudm0tPmZsYXNoX2Jhbmtfc2l6ZSA6IDA7CiAJYWN0X29mZnNldCArPSBvZmZzZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewpAQCAtMTA3NSw2ICsxMTgxLDI5IEBACiB9CiAKIC8qKgorICogIGUxMDAwX3JlYWRfZmxhc2hfYnl0ZV9pY2g4bGFuIC0gUmVhZCBieXRlIGZyb20gZmxhc2gKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBvZmZzZXQ6IFRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgdG8gcmVhZC4KKyAqICBAZGF0YTogUG9pbnRlciB0byBhIGJ5dGUgdG8gc3RvcmUgdGhlIHZhbHVlIHJlYWQuCisgKgorICogIFJlYWRzIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgTlZNIHVzaW5nIHRoZSBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgorICoqLworc3RhdGljIHMzMiBlMTAwMF9yZWFkX2ZsYXNoX2J5dGVfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorCQkJCQkgdTggKmRhdGEpCit7CisJczMyIHJldF92YWw7CisJdTE2IHdvcmQgPSAwOworCisJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZmxhc2hfZGF0YV9pY2g4bGFuKGh3LCBvZmZzZXQsIDEsICZ3b3JkKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwkqZGF0YSA9ICh1OCl3b3JkOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogIGUxMDAwX3JlYWRfZmxhc2hfZGF0YV9pY2g4bGFuIC0gUmVhZCBieXRlIG9yIHdvcmQgZnJvbSBOVk0KICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IFRoZSBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgYnl0ZSBvciB3b3JkIHRvIHJlYWQuCkBAIC0xMjA1LDcgKzEzMzQsNyBAQAogewogCXN0cnVjdCBlMTAwMF9udm1faW5mbyAqbnZtID0gJmh3LT5udm07CiAJc3RydWN0IGUxMDAwX2Rldl9zcGVjX2ljaDhsYW4gKmRldl9zcGVjID0gJmh3LT5kZXZfc3BlYy5pY2g4bGFuOwotCXUzMiBpLCBhY3Rfb2Zmc2V0LCBuZXdfYmFua19vZmZzZXQsIG9sZF9iYW5rX29mZnNldDsKKwl1MzIgaSwgYWN0X29mZnNldCwgbmV3X2Jhbmtfb2Zmc2V0LCBvbGRfYmFua19vZmZzZXQsIGJhbms7CiAJczMyIHJldF92YWw7CiAJdTE2IGRhdGE7CiAKQEAgLTEyMjUsNyArMTM1NCwxMSBAQAogCSAqIHdyaXRlIHRvIGJhbmsgMCBldGMuICBXZSBhbHNvIG5lZWQgdG8gZXJhc2UgdGhlIHNlZ21lbnQgdGhhdAogCSAqIGlzIGdvaW5nIHRvIGJlIHdyaXR0ZW4KIAkgKi8KLQlpZiAoIShlcjMyKEVFQ0QpICYgRTEwMDBfRUVDRF9TRUMxVkFMKSkgeworCXJldF92YWwgPSAgZTEwMDBfdmFsaWRfbnZtX2JhbmtfZGV0ZWN0X2ljaDhsYW4oaHcsICZiYW5rKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlpZiAoYmFuayA9PSAwKSB7CiAJCW5ld19iYW5rX29mZnNldCA9IG52bS0+Zmxhc2hfYmFua19zaXplOwogCQlvbGRfYmFua19vZmZzZXQgPSAwOwogCQllMTAwMF9lcmFzZV9mbGFzaF9iYW5rX2ljaDhsYW4oaHcsIDEpOwpAQCAtMTI4NCw2ICsxNDE3LDcgQEAKIAkgKiBwcm9ncmFtbWluZyBmYWlsZWQuCiAJICovCiAJaWYgKHJldF92YWwpIHsKKwkJLyogUG9zc2libHkgcmVhZC1vbmx5LCBzZWUgZTEwMDBlX3dyaXRlX3Byb3RlY3RfbnZtX2ljaDhsYW4oKSAqLwogCQlod19kYmcoaHcsICJGbGFzaCBjb21taXQgZmFpbGVkLlxuIik7CiAJCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOwogCQlyZXR1cm4gcmV0X3ZhbDsKQEAgLTEzNzQsNiArMTUwOCw0OSBAQAogfQogCiAvKioKKyAqICBlMTAwMGVfd3JpdGVfcHJvdGVjdF9udm1faWNoOGxhbiAtIE1ha2UgdGhlIE5WTSByZWFkLW9ubHkKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICoKKyAqICBUbyBwcmV2ZW50IG1hbGljaW91cyB3cml0ZS9lcmFzZSBvZiB0aGUgTlZNLCBzZXQgaXQgdG8gYmUgcmVhZC1vbmx5CisgKiAgc28gdGhhdCB0aGUgaGFyZHdhcmUgaWdub3JlcyBhbGwgd3JpdGUvZXJhc2UgY3ljbGVzIG9mIHRoZSBOVk0gdmlhCisgKiAgdGhlIGZsYXNoIGNvbnRyb2wgcmVnaXN0ZXJzLiAgVGhlIHNoYWRvdy1yYW0gY29weSBvZiB0aGUgTlZNIHdpbGwKKyAqICBzdGlsbCBiZSB1cGRhdGVkLCBob3dldmVyIGFueSB1cGRhdGVzIHRvIHRoaXMgY29weSB3aWxsIG5vdCBzdGljaworICogIGFjcm9zcyBkcml2ZXIgcmVsb2Fkcy4KKyAqKi8KK3ZvaWQgZTEwMDBlX3dyaXRlX3Byb3RlY3RfbnZtX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwl1bmlvbiBpY2g4X2ZsYXNoX3Byb3RlY3RlZF9yYW5nZSBwcjA7CisJdW5pb24gaWNoOF9od3NfZmxhc2hfc3RhdHVzIGhzZnN0czsKKwl1MzIgZ2ZwcmVnOworCXMzMiByZXRfdmFsOworCisJcmV0X3ZhbCA9IGUxMDAwX2FjcXVpcmVfc3dmbGFnX2ljaDhsYW4oaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm47CisKKwlnZnByZWcgPSBlcjMyZmxhc2goSUNIX0ZMQVNIX0dGUFJFRyk7CisKKwkvKiBXcml0ZS1wcm90ZWN0IEdiRSBTZWN0b3Igb2YgTlZNICovCisJcHIwLnJlZ3ZhbCA9IGVyMzJmbGFzaChJQ0hfRkxBU0hfUFIwKTsKKwlwcjAucmFuZ2UuYmFzZSA9IGdmcHJlZyAmIEZMQVNIX0dGUFJFR19CQVNFX01BU0s7CisJcHIwLnJhbmdlLmxpbWl0ID0gKChnZnByZWcgPj4gMTYpICYgRkxBU0hfR0ZQUkVHX0JBU0VfTUFTSyk7CisJcHIwLnJhbmdlLndwZSA9IHRydWU7CisJZXczMmZsYXNoKElDSF9GTEFTSF9QUjAsIHByMC5yZWd2YWwpOworCisJLyoKKwkgKiBMb2NrIGRvd24gYSBzdWJzZXQgb2YgR2JFIEZsYXNoIENvbnRyb2wgUmVnaXN0ZXJzLCBlLmcuCisJICogUFIwIHRvIHByZXZlbnQgdGhlIHdyaXRlLXByb3RlY3Rpb24gZnJvbSBiZWluZyBsaWZ0ZWQuCisJICogT25jZSBGTE9DS0ROIGlzIHNldCwgdGhlIHJlZ2lzdGVycyBwcm90ZWN0ZWQgYnkgaXQgY2Fubm90CisJICogYmUgd3JpdHRlbiB1bnRpbCBGTE9DS0ROIGlzIGNsZWFyZWQgYnkgYSBoYXJkd2FyZSByZXNldC4KKwkgKi8KKwloc2ZzdHMucmVndmFsID0gZXIxNmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMpOworCWhzZnN0cy5oc2Zfc3RhdHVzLmZsb2NrZG4gPSB0cnVlOworCWV3MzJmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKKworCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOworfQorCisvKioKICAqICBlMTAwMF93cml0ZV9mbGFzaF9kYXRhX2ljaDhsYW4gLSBXcml0ZXMgYnl0ZXMgdG8gdGhlIE5WTQogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogVGhlIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSBieXRlL3dvcmQgdG8gcmVhZC4KQEAgLTE3MjAsNiArMTg5Nyw5IEBACiAJZXczMihDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CiAJbXNsZWVwKDIwKTsKIAorCS8qIHJlbGVhc2UgdGhlIHN3ZmxhZyBiZWNhdXNlIGl0IGlzIG5vdCByZXNldCBieSBoYXJkd2FyZSByZXNldCAqLworCWUxMDAwX3JlbGVhc2Vfc3dmbGFnX2ljaDhsYW4oaHcpOworCiAJcmV0X3ZhbCA9IGUxMDAwZV9nZXRfYXV0b19yZF9kb25lKGh3KTsKIAlpZiAocmV0X3ZhbCkgewogCQkvKgpAQCAtMjE4OSwxMyArMjM2OSwxNCBAQAogICogICdMUExVIEVuYWJsZWQnIGFuZCAnR2lnIERpc2FibGUnIHRvIGZvcmNlIGxpbmsgc3BlZWQgbmVnb3RpYXRpb24KICAqICB0byBhIGxvd2VyIHNwZWVkLgogICoKLSAqICBTaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIElDSDkgZGV2aWNlcy4KKyAqICBTaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIElDSDkgYW5kIElDSDEwIGRldmljZXMuCiAgKiovCiB2b2lkIGUxMDAwZV9kaXNhYmxlX2dpZ193b2xfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXUzMiBwaHlfY3RybDsKIAotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfaWNoOWxhbikgeworCWlmICgoaHctPm1hYy50eXBlID09IGUxMDAwX2ljaDEwbGFuKSB8fAorCSAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX2ljaDlsYW4pKSB7CiAJCXBoeV9jdHJsID0gZXIzMihQSFlfQ1RSTCk7CiAJCXBoeV9jdHJsIHw9IEUxMDAwX1BIWV9DVFJMX0QwQV9MUExVIHwKIAkJICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEU7CkBAIC0yMjUzLDYgKzI0MzQsMzkgQEAKIH0KIAogLyoqCisgKiAgZTEwMDBfZ2V0X2NmZ19kb25lX2ljaDhsYW4gLSBSZWFkIGNvbmZpZyBkb25lIGJpdAorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIFJlYWQgdGhlIG1hbmFnZW1lbnQgY29udHJvbCByZWdpc3RlciBmb3IgdGhlIGNvbmZpZyBkb25lIGJpdCBmb3IKKyAqICBjb21wbGV0aW9uIHN0YXR1cy4gIE5PVEU6IHNpbGljb24gd2hpY2ggaXMgRUVQUk9NLWxlc3Mgd2lsbCBmYWlsIHRyeWluZworICogIHRvIHJlYWQgdGhlIGNvbmZpZyBkb25lIGJpdCwgc28gYW4gZXJyb3IgaXMgKk9OTFkqIGxvZ2dlZCBhbmQgcmV0dXJucworICogIEUxMDAwX1NVQ0NFU1MuICBJZiB3ZSB3ZXJlIHRvIHJldHVybiB3aXRoIGVycm9yLCBFRVBST00tbGVzcyBzaWxpY29uCisgKiAgd291bGQgbm90IGJlIGFibGUgdG8gYmUgcmVzZXQgb3IgY2hhbmdlIGxpbmsuCisgKiovCitzdGF0aWMgczMyIGUxMDAwX2dldF9jZmdfZG9uZV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJdTMyIGJhbmsgPSAwOworCisJZTEwMDBlX2dldF9jZmdfZG9uZShodyk7CisKKwkvKiBJZiBFRVBST00gaXMgbm90IG1hcmtlZCBwcmVzZW50LCBpbml0IHRoZSBJR1AgMyBQSFkgbWFudWFsbHkgKi8KKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwX2ljaDEwbGFuKSB7CisJCWlmICgoKGVyMzIoRUVDRCkgJiBFMTAwMF9FRUNEX1BSRVMpID09IDApICYmCisJCSAgICAoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZ3BfMykpIHsKKwkJCWUxMDAwZV9waHlfaW5pdF9zY3JpcHRfaWdwMyhodyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZTEwMDBfdmFsaWRfbnZtX2JhbmtfZGV0ZWN0X2ljaDhsYW4oaHcsICZiYW5rKSkgeworCQkJLyogTWF5YmUgd2Ugc2hvdWxkIGRvIGEgYmFzaWMgUEhZIGNvbmZpZyAqLworCQkJaHdfZGJnKGh3LCAiRUVQUk9NIG5vdCBwcmVzZW50XG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqICBlMTAwMF9jbGVhcl9od19jbnRyc19pY2g4bGFuIC0gQ2xlYXIgc3RhdGlzdGljYWwgY291bnRlcnMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKQEAgLTIyODIsNyArMjQ5Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZTEwMDBfbWFjX29wZXJhdGlvbnMgaWNoOF9tYWNfb3BzID0gewotCS5tbmdfbW9kZV9lbmFiCQk9IEUxMDAwX0lDSF9NTkdfSUFNVF9NT0RFIDw8IEUxMDAwX0ZXU01fTU9ERV9TSElGVCwKKwkuY2hlY2tfbW5nX21vZGUJCT0gZTEwMDBfY2hlY2tfbW5nX21vZGVfaWNoOGxhbiwKIAkuY2hlY2tfZm9yX2xpbmsJCT0gZTEwMDBlX2NoZWNrX2Zvcl9jb3BwZXJfbGluaywKIAkuY2xlYW51cF9sZWQJCT0gZTEwMDBfY2xlYW51cF9sZWRfaWNoOGxhbiwKIAkuY2xlYXJfaHdfY250cnMJCT0gZTEwMDBfY2xlYXJfaHdfY250cnNfaWNoOGxhbiwKQEAgLTIzMDIsNyArMjUxNiw3IEBACiAJLmNoZWNrX3Jlc2V0X2Jsb2NrCT0gZTEwMDBfY2hlY2tfcmVzZXRfYmxvY2tfaWNoOGxhbiwKIAkuY29tbWl0X3BoeQkJPSBOVUxMLAogCS5mb3JjZV9zcGVlZF9kdXBsZXgJPSBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4X2ljaDhsYW4sCi0JLmdldF9jZmdfZG9uZQkJPSBlMTAwMGVfZ2V0X2NmZ19kb25lLAorCS5nZXRfY2ZnX2RvbmUJCT0gZTEwMDBfZ2V0X2NmZ19kb25lX2ljaDhsYW4sCiAJLmdldF9jYWJsZV9sZW5ndGgJPSBlMTAwMGVfZ2V0X2NhYmxlX2xlbmd0aF9pZ3BfMiwKIAkuZ2V0X3BoeV9pbmZvCQk9IGUxMDAwX2dldF9waHlfaW5mb19pY2g4bGFuLAogCS5yZWFkX3BoeV9yZWcJCT0gZTEwMDBlX3JlYWRfcGh5X3JlZ19pZ3AsCkBAIC0yMzU3LDMgKzI1NzEsMjAgQEAKIAkubnZtX29wcwkJPSAmaWNoOF9udm1fb3BzLAogfTsKIAorc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfaWNoMTBfaW5mbyA9IHsKKwkubWFjCQkJPSBlMTAwMF9pY2gxMGxhbiwKKwkuZmxhZ3MJCQk9IEZMQUdfSEFTX0pVTUJPX0ZSQU1FUworCQkJCSAgfCBGTEFHX0lTX0lDSAorCQkJCSAgfCBGTEFHX0hBU19XT0wKKwkJCQkgIHwgRkxBR19SWF9DU1VNX0VOQUJMRUQKKwkJCQkgIHwgRkxBR19IQVNfQ1RSTEVYVF9PTl9MT0FECisJCQkJICB8IEZMQUdfSEFTX0FNVAorCQkJCSAgfCBGTEFHX0hBU19FUlQKKwkJCQkgIHwgRkxBR19IQVNfRkxBU0gKKwkJCQkgIHwgRkxBR19BUE1FX0lOX1dVQywKKwkucGJhCQkJPSAxMCwKKwkuZ2V0X3ZhcmlhbnRzCQk9IGUxMDAwX2dldF92YXJpYW50c19pY2g4bGFuLAorCS5tYWNfb3BzCQk9ICZpY2g4X21hY19vcHMsCisJLnBoeV9vcHMJCT0gJmljaDhfcGh5X29wcywKKwkubnZtX29wcwkJPSAmaWNoOF9udm1fb3BzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYwppbmRleCBmMWY0ZTlkLi4wODk1NzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvbGliLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2xpYi5jCkBAIC0yMDEyLDYgKzIwMTIsNyBAQAogCX0KIAogCW1zbGVlcCgxMCk7CisJbnZtLT5vcHMucmVsZWFzZV9udm0oaHcpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjIyLDE3ICsyMjIzLDE4IEBACiB9CiAKIC8qKgotICogIGUxMDAwZV9jaGVja19tbmdfbW9kZSAtIGNoZWNrIG1hbmFnZW1lbnQgbW9kZQorICogIGUxMDAwZV9jaGVja19tbmdfbW9kZV9nZW5lcmljIC0gY2hlY2sgbWFuYWdlbWVudCBtb2RlCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqCiAgKiAgUmVhZHMgdGhlIGZpcm13YXJlIHNlbWFwaG9yZSByZWdpc3RlciBhbmQgcmV0dXJucyB0cnVlICg+MCkgaWYKICAqICBtYW5hZ2VhYmlsaXR5IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UgKDApLgogICoqLwotYm9vbCBlMTAwMGVfY2hlY2tfbW5nX21vZGUoc3RydWN0IGUxMDAwX2h3ICpodykKK2Jvb2wgZTEwMDBlX2NoZWNrX21uZ19tb2RlX2dlbmVyaWMoc3RydWN0IGUxMDAwX2h3ICpodykKIHsKIAl1MzIgZndzbSA9IGVyMzIoRldTTSk7CiAKLQlyZXR1cm4gKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPT0gaHctPm1hYy5vcHMubW5nX21vZGVfZW5hYjsKKwlyZXR1cm4gKGZ3c20gJiBFMTAwMF9GV1NNX01PREVfTUFTSykgPT0KKwkJKEUxMDAwX01OR19JQU1UX01PREUgPDwgRTEwMDBfRldTTV9NT0RFX1NISUZUKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggZDI2NjUxMC4uYWJkNDkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAjaW5jbHVkZSAiZTEwMDAuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjMuMy1rMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4zLjMtazYiCiBjaGFyIGUxMDAwZV9kcml2ZXJfbmFtZVtdID0gImUxMDAwZSI7CiBjb25zdCBjaGFyIGUxMDAwZV9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiAKQEAgLTU1LDkgKzU1LDExIEBACiAJW2JvYXJkXzgyNTcxXQkJPSAmZTEwMDBfODI1NzFfaW5mbywKIAlbYm9hcmRfODI1NzJdCQk9ICZlMTAwMF84MjU3Ml9pbmZvLAogCVtib2FyZF84MjU3M10JCT0gJmUxMDAwXzgyNTczX2luZm8sCisJW2JvYXJkXzgyNTc0XQkJPSAmZTEwMDBfODI1NzRfaW5mbywKIAlbYm9hcmRfODAwMDNlczJsYW5dCT0gJmUxMDAwX2VzMl9pbmZvLAogCVtib2FyZF9pY2g4bGFuXQkJPSAmZTEwMDBfaWNoOF9pbmZvLAogCVtib2FyZF9pY2g5bGFuXQkJPSAmZTEwMDBfaWNoOV9pbmZvLAorCVtib2FyZF9pY2gxMGxhbl0JPSAmZTEwMDBfaWNoMTBfaW5mbywKIH07CiAKICNpZmRlZiBERUJVRwpAQCAtMTExNSw2ICsxMTE3LDE0IEBACiAJd3JpdGVsKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyByeF9yaW5nLT50YWlsKTsKIH0KIAorc3RhdGljIHZvaWQgZTEwMDBlX2Rvd25zaGlmdF93b3JrYXJvdW5kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciwgZG93bnNoaWZ0X3Rhc2spOworCisJZTEwMDBlX2dpZ19kb3duc2hpZnRfd29ya2Fyb3VuZF9pY2g4bGFuKCZhZGFwdGVyLT5odyk7Cit9CisKIC8qKgogICogZTEwMDBfaW50cl9tc2kgLSBJbnRlcnJ1cHQgSGFuZGxlcgogICogQGlycTogaW50ZXJydXB0IG51bWJlcgpAQCAtMTEzOSw3ICsxMTQ5LDcgQEAKIAkJICovCiAJCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0xTQ19HSUdfU1BFRURfRFJPUCkgJiYKIAkJICAgICghKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpKQotCQkJZTEwMDBlX2dpZ19kb3duc2hpZnRfd29ya2Fyb3VuZF9pY2g4bGFuKGh3KTsKKwkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPmRvd25zaGlmdF90YXNrKTsKIAogCQkvKgogCQkgKiA4MDAwM0VTMkxBTiB3b3JrYXJvdW5kLS0gRm9yIHBhY2tldCBidWZmZXIgd29yay1hcm91bmQgb24KQEAgLTExNzksOCArMTE4OSw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0KIAl1MzIgcmN0bCwgaWNyID0gZXIzMihJQ1IpOworCiAJaWYgKCFpY3IpCiAJCXJldHVybiBJUlFfTk9ORTsgIC8qIE5vdCBvdXIgaW50ZXJydXB0ICovCiAKQEAgLTEyMDUsNyArMTIxNSw3IEBACiAJCSAqLwogCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRkxBR19MU0NfR0lHX1NQRUVEX0RST1ApICYmCiAJCSAgICAoIShlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFUpKSkKLQkJCWUxMDAwZV9naWdfZG93bnNoaWZ0X3dvcmthcm91bmRfaWNoOGxhbihodyk7CisJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5kb3duc2hpZnRfdGFzayk7CiAKIAkJLyoKIAkJICogODAwMDNFUzJMQU4gd29ya2Fyb3VuZC0tCkBAIC0xMjM2LDYgKzEyNDYsMjYzIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMDBfbXNpeF9vdGhlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBpY3IgPSBlcjMyKElDUik7CisKKwlpZiAoIShpY3IgJiBFMTAwMF9JQ1JfSU5UX0FTU0VSVEVEKSkgeworCQlldzMyKElNUywgRTEwMDBfSU1TX09USEVSKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChpY3IgJiBhZGFwdGVyLT5laWFjX21hc2spCisJCWV3MzIoSUNTLCAoaWNyICYgYWRhcHRlci0+ZWlhY19tYXNrKSk7CisKKwlpZiAoaWNyICYgRTEwMDBfSUNSX09USEVSKSB7CisJCWlmICghKGljciAmIEUxMDAwX0lDUl9MU0MpKQorCQkJZ290byBub19saW5rX2ludGVycnVwdDsKKwkJaHctPm1hYy5nZXRfbGlua19zdGF0dXMgPSAxOworCQkvKiBndWFyZCBhZ2FpbnN0IGludGVycnVwdCB3aGVuIHdlJ3JlIGdvaW5nIGRvd24gKi8KKwkJaWYgKCF0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCisJCQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMSk7CisJfQorCitub19saW5rX2ludGVycnVwdDoKKwlldzMyKElNUywgRTEwMDBfSU1TX0xTQyB8IEUxMDAwX0lNU19PVEhFUik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IGUxMDAwX2ludHJfbXNpeF90eChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBlMTAwMF9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZzsKKworCisJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOworCWFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMgPSAwOworCisJaWYgKCFlMTAwMF9jbGVhbl90eF9pcnEoYWRhcHRlcikpCisJCS8qIFJpbmcgd2FzIG5vdCBjb21wbGV0ZWx5IGNsZWFuZWQsIHNvIGZpcmUgYW5vdGhlciBpbnRlcnJ1cHQgKi8KKwkJZXczMihJQ1MsIHR4X3JpbmctPmltc192YWwpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMDBfaW50cl9tc2l4X3J4KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogV3JpdGUgdGhlIElUUiB2YWx1ZSBjYWxjdWxhdGVkIGF0IHRoZSBlbmQgb2YgdGhlCisJICogcHJldmlvdXMgaW50ZXJydXB0LgorCSAqLworCWlmIChhZGFwdGVyLT5yeF9yaW5nLT5zZXRfaXRyKSB7CisJCXdyaXRlbCgxMDAwMDAwMDAwIC8gKGFkYXB0ZXItPnJ4X3JpbmctPml0cl92YWwgKiAyNTYpLAorCQkgICAgICAgYWRhcHRlci0+aHcuaHdfYWRkciArIGFkYXB0ZXItPnJ4X3JpbmctPml0cl9yZWdpc3Rlcik7CisJCWFkYXB0ZXItPnJ4X3JpbmctPnNldF9pdHIgPSAwOworCX0KKworCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldiwgJmFkYXB0ZXItPm5hcGkpKSB7CisJCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyA9IDA7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2LCAmYWRhcHRlci0+bmFwaSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBlMTAwMF9jb25maWd1cmVfbXNpeCAtIENvbmZpZ3VyZSBNU0ktWCBoYXJkd2FyZQorICoKKyAqIGUxMDAwX2NvbmZpZ3VyZV9tc2l4IHNldHMgdXAgdGhlIGhhcmR3YXJlIHRvIHByb3Blcmx5CisgKiBnZW5lcmF0ZSBNU0ktWCBpbnRlcnJ1cHRzLgorICoqLworc3RhdGljIHZvaWQgZTEwMDBfY29uZmlndXJlX21zaXgoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgZTEwMDBfcmluZyAqcnhfcmluZyA9IGFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGUxMDAwX3JpbmcgKnR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nOworCWludCB2ZWN0b3IgPSAwOworCXUzMiBjdHJsX2V4dCwgaXZhciA9IDA7CisKKwlhZGFwdGVyLT5laWFjX21hc2sgPSAwOworCisJLyogV29ya2Fyb3VuZCBpc3N1ZSB3aXRoIHNwdXJpb3VzIGludGVycnVwdHMgb24gODI1NzQgaW4gTVNJLVggbW9kZSAqLworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpIHsKKwkJdTMyIHJmY3RsID0gZXIzMihSRkNUTCk7CisJCXJmY3RsIHw9IEUxMDAwX1JGQ1RMX0FDS19ESVM7CisJCWV3MzIoUkZDVEwsIHJmY3RsKTsKKwl9CisKKyNkZWZpbmUgRTEwMDBfSVZBUl9JTlRfQUxMT0NfVkFMSUQJMHg4CisJLyogQ29uZmlndXJlIFJ4IHZlY3RvciAqLworCXJ4X3JpbmctPmltc192YWwgPSBFMTAwMF9JTVNfUlhRMDsKKwlhZGFwdGVyLT5laWFjX21hc2sgfD0gcnhfcmluZy0+aW1zX3ZhbDsKKwlpZiAocnhfcmluZy0+aXRyX3ZhbCkKKwkJd3JpdGVsKDEwMDAwMDAwMDAgLyAocnhfcmluZy0+aXRyX3ZhbCAqIDI1NiksCisJCSAgICAgICBody0+aHdfYWRkciArIHJ4X3JpbmctPml0cl9yZWdpc3Rlcik7CisJZWxzZQorCQl3cml0ZWwoMSwgaHctPmh3X2FkZHIgKyByeF9yaW5nLT5pdHJfcmVnaXN0ZXIpOworCWl2YXIgPSBFMTAwMF9JVkFSX0lOVF9BTExPQ19WQUxJRCB8IHZlY3RvcjsKKworCS8qIENvbmZpZ3VyZSBUeCB2ZWN0b3IgKi8KKwl0eF9yaW5nLT5pbXNfdmFsID0gRTEwMDBfSU1TX1RYUTA7CisJdmVjdG9yKys7CisJaWYgKHR4X3JpbmctPml0cl92YWwpCisJCXdyaXRlbCgxMDAwMDAwMDAwIC8gKHR4X3JpbmctPml0cl92YWwgKiAyNTYpLAorCQkgICAgICAgaHctPmh3X2FkZHIgKyB0eF9yaW5nLT5pdHJfcmVnaXN0ZXIpOworCWVsc2UKKwkJd3JpdGVsKDEsIGh3LT5od19hZGRyICsgdHhfcmluZy0+aXRyX3JlZ2lzdGVyKTsKKwlhZGFwdGVyLT5laWFjX21hc2sgfD0gdHhfcmluZy0+aW1zX3ZhbDsKKwlpdmFyIHw9ICgoRTEwMDBfSVZBUl9JTlRfQUxMT0NfVkFMSUQgfCB2ZWN0b3IpIDw8IDgpOworCisJLyogc2V0IHZlY3RvciBmb3IgT3RoZXIgQ2F1c2VzLCBlLmcuIGxpbmsgY2hhbmdlcyAqLworCXZlY3RvcisrOworCWl2YXIgfD0gKChFMTAwMF9JVkFSX0lOVF9BTExPQ19WQUxJRCB8IHZlY3RvcikgPDwgMTYpOworCWlmIChyeF9yaW5nLT5pdHJfdmFsKQorCQl3cml0ZWwoMTAwMDAwMDAwMCAvIChyeF9yaW5nLT5pdHJfdmFsICogMjU2KSwKKwkJICAgICAgIGh3LT5od19hZGRyICsgRTEwMDBfRUlUUl84MjU3NCh2ZWN0b3IpKTsKKwllbHNlCisJCXdyaXRlbCgxLCBody0+aHdfYWRkciArIEUxMDAwX0VJVFJfODI1NzQodmVjdG9yKSk7CisKKwkvKiBDYXVzZSBUeCBpbnRlcnJ1cHRzIG9uIGV2ZXJ5IHdyaXRlIGJhY2sgKi8KKwlpdmFyIHw9ICgxIDw8IDMxKTsKKworCWV3MzIoSVZBUiwgaXZhcik7CisKKwkvKiBlbmFibGUgTVNJLVggUEJBIHN1cHBvcnQgKi8KKwljdHJsX2V4dCA9IGVyMzIoQ1RSTF9FWFQpOworCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1BCQV9DTFI7CisKKwkvKiBBdXRvLU1hc2sgT3RoZXIgaW50ZXJydXB0cyB1cG9uIElDUiByZWFkICovCisjZGVmaW5lIEUxMDAwX0VJQUNfTUFTS184MjU3NCAgIDB4MDFGMDAwMDAKKwlldzMyKElBTSwgfkUxMDAwX0VJQUNfTUFTS184MjU3NCB8IEUxMDAwX0lNU19PVEhFUik7CisJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfRUlBTUU7CisJZXczMihDVFJMX0VYVCwgY3RybF9leHQpOworCWUxZV9mbHVzaCgpOworfQorCit2b2lkIGUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CisJCXBjaV9kaXNhYmxlX21zaXgoYWRhcHRlci0+cGRldik7CisJCWtmcmVlKGFkYXB0ZXItPm1zaXhfZW50cmllcyk7CisJCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IE5VTEw7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfTVNJX0VOQUJMRUQpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCQlhZGFwdGVyLT5mbGFncyAmPSB+RkxBR19NU0lfRU5BQkxFRDsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eSAtIHNldCBNU0kgb3IgTVNJLVggaWYgc3VwcG9ydGVkCisgKgorICogQXR0ZW1wdCB0byBjb25maWd1cmUgaW50ZXJydXB0cyB1c2luZyB0aGUgYmVzdCBhdmFpbGFibGUKKyAqIGNhcGFiaWxpdGllcyBvZiB0aGUgaGFyZHdhcmUgYW5kIGtlcm5lbC4KKyAqKi8KK3ZvaWQgZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgZXJyOworCWludCBudW12ZWNzLCBpOworCisKKwlzd2l0Y2ggKGFkYXB0ZXItPmludF9tb2RlKSB7CisJY2FzZSBFMTAwMEVfSU5UX01PREVfTVNJWDoKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfTVNJWCkgeworCQkJbnVtdmVjcyA9IDM7IC8qIFJ4UTAsIFR4UTAgYW5kIG90aGVyICovCisJCQlhZGFwdGVyLT5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKG51bXZlY3MsCisJCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bXZlY3M7IGkrKykKKwkJCQkJYWRhcHRlci0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCQkJCWVyciA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5wZGV2LAorCQkJCQkJICAgICAgYWRhcHRlci0+bXNpeF9lbnRyaWVzLAorCQkJCQkJICAgICAgbnVtdmVjcyk7CisJCQkJaWYgKGVyciA9PSAwKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBNU0ktWCBmYWlsZWQsIHNvIGZhbGwgdGhyb3VnaCBhbmQgdHJ5IE1TSSAqLworCQkJZV9lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIE1TSS1YIGludGVycnVwdHMuICAiCisJCQkgICAgICAiRmFsbGluZyBiYWNrIHRvIE1TSSBpbnRlcnJ1cHRzLlxuIik7CisJCQllMTAwMGVfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CisJCX0KKwkJYWRhcHRlci0+aW50X21vZGUgPSBFMTAwMEVfSU5UX01PREVfTVNJOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIEUxMDAwRV9JTlRfTU9ERV9NU0k6CisJCWlmICghcGNpX2VuYWJsZV9tc2koYWRhcHRlci0+cGRldikpIHsKKwkJCWFkYXB0ZXItPmZsYWdzIHw9IEZMQUdfTVNJX0VOQUJMRUQ7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5pbnRfbW9kZSA9IEUxMDAwRV9JTlRfTU9ERV9MRUdBQ1k7CisJCQllX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgTVNJIGludGVycnVwdHMuICBGYWxsaW5nICIKKwkJCSAgICAgICJiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHRzLlxuIik7CisJCX0KKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBFMTAwMEVfSU5UX01PREVfTEVHQUNZOgorCQkvKiBEb24ndCBkbyBhbnl0aGluZzsgdGhpcyBpcyB0aGUgc3lzdGVtIGRlZmF1bHQgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIGUxMDAwX3JlcXVlc3RfbXNpeCAtIEluaXRpYWxpemUgTVNJLVggaW50ZXJydXB0cworICoKKyAqIGUxMDAwX3JlcXVlc3RfbXNpeCBhbGxvY2F0ZXMgTVNJLVggdmVjdG9ycyBhbmQgcmVxdWVzdHMgaW50ZXJydXB0cyBmcm9tIHRoZQorICoga2VybmVsLgorICoqLworc3RhdGljIGludCBlMTAwMF9yZXF1ZXN0X21zaXgoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlpbnQgZXJyID0gMCwgdmVjdG9yID0gMDsKKworCWlmIChzdHJsZW4obmV0ZGV2LT5uYW1lKSA8IChJRk5BTVNJWiAtIDUpKQorCQlzcHJpbnRmKGFkYXB0ZXItPnJ4X3JpbmctPm5hbWUsICIlcy1yeDAiLCBuZXRkZXYtPm5hbWUpOworCWVsc2UKKwkJbWVtY3B5KGFkYXB0ZXItPnJ4X3JpbmctPm5hbWUsIG5ldGRldi0+bmFtZSwgSUZOQU1TSVopOworCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKKwkJCSAgJmUxMDAwX2ludHJfbXNpeF9yeCwgMCwgYWRhcHRlci0+cnhfcmluZy0+bmFtZSwKKwkJCSAgbmV0ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlhZGFwdGVyLT5yeF9yaW5nLT5pdHJfcmVnaXN0ZXIgPSBFMTAwMF9FSVRSXzgyNTc0KHZlY3Rvcik7CisJYWRhcHRlci0+cnhfcmluZy0+aXRyX3ZhbCA9IGFkYXB0ZXItPml0cjsKKwl2ZWN0b3IrKzsKKworCWlmIChzdHJsZW4obmV0ZGV2LT5uYW1lKSA8IChJRk5BTVNJWiAtIDUpKQorCQlzcHJpbnRmKGFkYXB0ZXItPnR4X3JpbmctPm5hbWUsICIlcy10eDAiLCBuZXRkZXYtPm5hbWUpOworCWVsc2UKKwkJbWVtY3B5KGFkYXB0ZXItPnR4X3JpbmctPm5hbWUsIG5ldGRldi0+bmFtZSwgSUZOQU1TSVopOworCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKKwkJCSAgJmUxMDAwX2ludHJfbXNpeF90eCwgMCwgYWRhcHRlci0+dHhfcmluZy0+bmFtZSwKKwkJCSAgbmV0ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlhZGFwdGVyLT50eF9yaW5nLT5pdHJfcmVnaXN0ZXIgPSBFMTAwMF9FSVRSXzgyNTc0KHZlY3Rvcik7CisJYWRhcHRlci0+dHhfcmluZy0+aXRyX3ZhbCA9IGFkYXB0ZXItPml0cjsKKwl2ZWN0b3IrKzsKKworCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKKwkJCSAgJmUxMDAwX21zaXhfb3RoZXIsIDAsIG5ldGRldi0+bmFtZSwgbmV0ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWUxMDAwX2NvbmZpZ3VyZV9tc2l4KGFkYXB0ZXIpOworCXJldHVybiAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKIC8qKgogICogZTEwMDBfcmVxdWVzdF9pcnEgLSBpbml0aWFsaXplIGludGVycnVwdHMKICAqCkBAIC0xMjQ1LDI4ICsxNTEyLDMyIEBACiBzdGF0aWMgaW50IGUxMDAwX3JlcXVlc3RfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JaW50IGlycV9mbGFncyA9IElSUUZfU0hBUkVEOwogCWludCBlcnI7CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIEZMQUdfTVNJX1RFU1RfRkFJTEVEKSkgewotCQllcnIgPSBwY2lfZW5hYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKLQkJaWYgKCFlcnIpIHsKLQkJCWFkYXB0ZXItPmZsYWdzIHw9IEZMQUdfTVNJX0VOQUJMRUQ7Ci0JCQlpcnFfZmxhZ3MgPSAwOwotCQl9CisJaWYgKGFkYXB0ZXItPm1zaXhfZW50cmllcykgeworCQllcnIgPSBlMTAwMF9yZXF1ZXN0X21zaXgoYWRhcHRlcik7CisJCWlmICghZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJLyogZmFsbCBiYWNrIHRvIE1TSSAqLworCQllMTAwMGVfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CisJCWFkYXB0ZXItPmludF9tb2RlID0gRTEwMDBFX0lOVF9NT0RFX01TSTsKKwkJZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKKwl9CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19NU0lfRU5BQkxFRCkgeworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZlMTAwMF9pbnRyX21zaSwgMCwKKwkJCQkgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCS8qIGZhbGwgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0ICovCisJCWUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKKwkJYWRhcHRlci0+aW50X21vZGUgPSBFMTAwMEVfSU5UX01PREVfTEVHQUNZOwogCX0KIAotCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwKLQkJCSAgKChhZGFwdGVyLT5mbGFncyAmIEZMQUdfTVNJX0VOQUJMRUQpID8KLQkJCQkmZTEwMDBfaW50cl9tc2kgOiAmZTEwMDBfaW50ciksCi0JCQkgIGlycV9mbGFncywgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOwotCWlmIChlcnIpIHsKLQkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19NU0lfRU5BQkxFRCkgewotCQkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwotCQkJYWRhcHRlci0+ZmxhZ3MgJj0gfkZMQUdfTVNJX0VOQUJMRUQ7Ci0JCX0KKwllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZlMTAwMF9pbnRyLCBJUlFGX1NIQVJFRCwKKwkJCSAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCWlmIChlcnIpCiAJCWVfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0LCBFcnJvcjogJWRcbiIsIGVycik7Ci0JfQogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTEyNzUsMTEgKzE1NDYsMjEgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCi0JZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYpOwotCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfTVNJX0VOQUJMRUQpIHsKLQkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOwotCQlhZGFwdGVyLT5mbGFncyAmPSB+RkxBR19NU0lfRU5BQkxFRDsKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKSB7CisJCWludCB2ZWN0b3IgPSAwOworCisJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwgbmV0ZGV2KTsKKwkJdmVjdG9yKys7CisKKwkJZnJlZV9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLCBuZXRkZXYpOworCQl2ZWN0b3IrKzsKKworCQkvKiBPdGhlciBDYXVzZXMgaW50ZXJydXB0IHZlY3RvciAqLworCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbdmVjdG9yXS52ZWN0b3IsIG5ldGRldik7CisJCXJldHVybjsKIAl9CisKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CiB9CiAKIC8qKgpAQCAtMTI5MCw2ICsxNTcxLDggQEAKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJZXczMihJTUMsIH4wKTsKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKQorCQlldzMyKEVJQUNfODI1NzQsIDApOwogCWUxZV9mbHVzaCgpOwogCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOwogfQpAQCAtMTMwMSw3ICsxNTg0LDEyIEBACiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAotCWV3MzIoSU1TLCBJTVNfRU5BQkxFX01BU0spOworCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpIHsKKwkJZXczMihFSUFDXzgyNTc0LCBhZGFwdGVyLT5laWFjX21hc2sgJiBFMTAwMF9FSUFDX01BU0tfODI1NzQpOworCQlldzMyKElNUywgYWRhcHRlci0+ZWlhY19tYXNrIHwgRTEwMDBfSU1TX09USEVSIHwgRTEwMDBfSU1TX0xTQyk7CisJfSBlbHNlIHsKKwkJZXczMihJTVMsIElNU19FTkFCTEVfTUFTSyk7CisJfQogCWUxZV9mbHVzaCgpOwogfQogCkBAIC0xNTUxLDkgKzE4MzksOCBAQAogICogICAgICB0cmFmZmljIHBhdHRlcm4uICBDb25zdGFudHMgaW4gdGhpcyBmdW5jdGlvbiB3ZXJlIGNvbXB1dGVkCiAgKiAgICAgIGJhc2VkIG9uIHRoZW9yZXRpY2FsIG1heGltdW0gd2lyZSBzcGVlZCBhbmQgdGhyZXNob2xkcyB3ZXJlIHNldCBiYXNlZAogICogICAgICBvbiB0ZXN0aW5nIGRhdGEgYXMgd2VsbCBhcyBhdHRlbXB0aW5nIHRvIG1pbmltaXplIHJlc3BvbnNlIHRpbWUKLSAqICAgICAgd2hpbGUgaW5jcmVhc2luZyBidWxrIHRocm91Z2hwdXQuCi0gKiAgICAgIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjb250cm9sbGVkIGJ5IHRoZSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgbW9kdWxlCi0gKiAgICAgIHBhcmFtZXRlciAoc2VlIGUxMDAwX3BhcmFtLmMpCisgKiAgICAgIHdoaWxlIGluY3JlYXNpbmcgYnVsayB0aHJvdWdocHV0LiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNvbnRyb2xsZWQKKyAqICAgICAgYnkgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSBtb2R1bGUgcGFyYW1ldGVyLgogICoqLwogc3RhdGljIHVuc2lnbmVkIGludCBlMTAwMF91cGRhdGVfaXRyKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgdTE2IGl0cl9zZXR0aW5nLCBpbnQgcGFja2V0cywKQEAgLTE2NjEsMTEgKzE5NDgsMzcgQEAKIAkJCSAgICAgbWluKGFkYXB0ZXItPml0ciArIChuZXdfaXRyID4+IDIpLCBuZXdfaXRyKSA6CiAJCQkgICAgIG5ld19pdHI7CiAJCWFkYXB0ZXItPml0ciA9IG5ld19pdHI7Ci0JCWV3MzIoSVRSLCAxMDAwMDAwMDAwIC8gKG5ld19pdHIgKiAyNTYpKTsKKwkJYWRhcHRlci0+cnhfcmluZy0+aXRyX3ZhbCA9IG5ld19pdHI7CisJCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpCisJCQlhZGFwdGVyLT5yeF9yaW5nLT5zZXRfaXRyID0gMTsKKwkJZWxzZQorCQkJZXczMihJVFIsIDEwMDAwMDAwMDAgLyAobmV3X2l0ciAqIDI1NikpOwogCX0KIH0KIAogLyoqCisgKiBlMTAwMF9hbGxvY19xdWV1ZXMgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCByaW5ncworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGUxMDAwX2FsbG9jX3F1ZXVlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhZGFwdGVyLT50eF9yaW5nID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGUxMDAwX3JpbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcpCisJCWdvdG8gZXJyOworCisJYWRhcHRlci0+cnhfcmluZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlMTAwMF9yaW5nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5yeF9yaW5nKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworZXJyOgorCWVfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZXNcbiIpOworCWtmcmVlKGFkYXB0ZXItPnJ4X3JpbmcpOworCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKICAqIGUxMDAwX2NsZWFuIC0gTkFQSSBSeCBwb2xsaW5nIGNhbGxiYWNrCiAgKiBAbmFwaTogc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBvbGxpbmcgY2FsbGJhY2sKICAqIEBidWRnZXQ6IGFtb3VudCBvZiBwYWNrZXRzIGRyaXZlciBpcyBhbGxvd2VkIHRvIHByb2Nlc3MgdGhpcyBwb2xsCkBAIC0xNjczLDEyICsxOTg2LDE3IEBACiBzdGF0aWMgaW50IGUxMDAwX2NsZWFuKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZTEwMDBfYWRhcHRlciwgbmFwaSk7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG9sbF9kZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJaW50IHR4X2NsZWFuZWQgPSAwLCB3b3JrX2RvbmUgPSAwOwogCiAJLyogTXVzdCBOT1QgdXNlIG5ldGRldl9wcml2IG1hY3JvIGhlcmUuICovCiAJYWRhcHRlciA9IHBvbGxfZGV2LT5wcml2OwogCisJaWYgKGFkYXB0ZXItPm1zaXhfZW50cmllcyAmJgorCSAgICAhKGFkYXB0ZXItPnJ4X3JpbmctPmltc192YWwgJiBhZGFwdGVyLT50eF9yaW5nLT5pbXNfdmFsKSkKKwkJZ290byBjbGVhbl9yeDsKKwogCS8qCiAJICogZTEwMDBfY2xlYW4gaXMgY2FsbGVkIHBlci1jcHUuICBUaGlzIGxvY2sgcHJvdGVjdHMKIAkgKiB0eF9yaW5nIGZyb20gYmVpbmcgY2xlYW5lZCBieSBtdWx0aXBsZSBjcHVzCkBAIC0xNjkwLDYgKzIwMDgsNyBAQAogCQlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfcXVldWVfbG9jayk7CiAJfQogCitjbGVhbl9yeDoKIAlhZGFwdGVyLT5jbGVhbl9yeChhZGFwdGVyLCAmd29ya19kb25lLCBidWRnZXQpOwogCiAJaWYgKHR4X2NsZWFuZWQpCkBAIC0xNzAwLDcgKzIwMTksMTAgQEAKIAkJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMykKIAkJCWUxMDAwX3NldF9pdHIoYWRhcHRlcik7CiAJCW5ldGlmX3J4X2NvbXBsZXRlKHBvbGxfZGV2LCBuYXBpKTsKLQkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwkJaWYgKGFkYXB0ZXItPm1zaXhfZW50cmllcykKKwkJCWV3MzIoSU1TLCBhZGFwdGVyLT5yeF9yaW5nLT5pbXNfdmFsKTsKKwkJZWxzZQorCQkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAl9CiAKIAlyZXR1cm4gd29ya19kb25lOwpAQCAtMjQ5Niw2ICsyODE4LDggQEAKIAljbGVhcl9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+c3RhdGUpOwogCiAJbmFwaV9lbmFibGUoJmFkYXB0ZXItPm5hcGkpOworCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpCisJCWUxMDAwX2NvbmZpZ3VyZV9tc2l4KGFkYXB0ZXIpOwogCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiAKIAkvKiBmaXJlIGEgbGluayBjaGFuZ2UgaW50ZXJydXB0IHRvIHN0YXJ0IHRoZSB3YXRjaGRvZyAqLwpAQCAtMjU3OSwyOSArMjkwMywxOCBAQAogCWFkYXB0ZXItPm1heF9mcmFtZV9zaXplID0gbmV0ZGV2LT5tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOOwogCWFkYXB0ZXItPm1pbl9mcmFtZV9zaXplID0gRVRIX1pMRU4gKyBFVEhfRkNTX0xFTjsKIAotCWFkYXB0ZXItPnR4X3JpbmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZTEwMDBfcmluZyksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlci0+dHhfcmluZykKLQkJZ290byBlcnI7CisJZTEwMDBlX3NldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKIAotCWFkYXB0ZXItPnJ4X3JpbmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZTEwMDBfcmluZyksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlci0+cnhfcmluZykKLQkJZ290byBlcnI7CisJaWYgKGUxMDAwX2FsbG9jX3F1ZXVlcyhhZGFwdGVyKSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfcXVldWVfbG9jayk7CiAKIAkvKiBFeHBsaWNpdGx5IGRpc2FibGUgSVJRIHNpbmNlIHRoZSBOSUMgY2FuIGJlIGluIGFueSBzdGF0ZS4gKi8KIAllMTAwMF9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIAotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKLQogCXNldF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+c3RhdGUpOwogCXJldHVybiAwOwotCi1lcnI6Ci0JZV9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlc1xuIik7Ci0Ja2ZyZWUoYWRhcHRlci0+cnhfcmluZyk7Ci0Ja2ZyZWUoYWRhcHRlci0+dHhfcmluZyk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qKgpAQCAtMjY0Myw2ICsyOTU2LDcgQEAKIAogCS8qIGZyZWUgdGhlIHJlYWwgdmVjdG9yIGFuZCByZXF1ZXN0IGEgdGVzdCBoYW5kbGVyICovCiAJZTEwMDBfZnJlZV9pcnEoYWRhcHRlcik7CisJZTEwMDBlX3Jlc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOwogCiAJLyogQXNzdW1lIHRoYXQgdGhlIHRlc3QgZmFpbHMsIGlmIGl0IHN1Y2NlZWRzIHRoZW4gdGhlIHRlc3QKIAkgKiBNU0kgaXJxIGhhbmRsZXIgd2lsbCB1bnNldCB0aGlzIGZsYWcgKi8KQEAgLTI2NzMsNiArMjk4Nyw3IEBACiAJcm1iKCk7CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX01TSV9URVNUX0ZBSUxFRCkgeworCQlhZGFwdGVyLT5pbnRfbW9kZSA9IEUxMDAwRV9JTlRfTU9ERV9MRUdBQ1k7CiAJCWVyciA9IC1FSU87CiAJCWVfaW5mbygiTVNJIGludGVycnVwdCB0ZXN0IGZhaWxlZCFcbiIpOwogCX0KQEAgLTI2ODYsNyArMzAwMSw3IEBACiAJLyogb2theSBzbyB0aGUgdGVzdCB3b3JrZWQsIHJlc3RvcmUgc2V0dGluZ3MgKi8KIAllX2RiZygiJXM6IE1TSSBpbnRlcnJ1cHQgdGVzdCBzdWNjZWVkZWQhXG4iLCBuZXRkZXYtPm5hbWUpOwogbXNpX3Rlc3RfZmFpbGVkOgotCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHZlY3RvciwgZXZlbiBpZiBpdCBmYWlsZWQgKi8KKwllMTAwMGVfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOwogCWUxMDAwX3JlcXVlc3RfaXJxKGFkYXB0ZXIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNzk2LDcgKzMxMTEsNyBAQAogCSAqIGlnbm9yZSBlMTAwMGUgTVNJIG1lc3NhZ2VzLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIHRlc3Qgb3VyIE1TSQogCSAqIGludGVycnVwdCBub3cKIAkgKi8KLQl7CisJaWYgKGFkYXB0ZXItPmludF9tb2RlICE9IEUxMDAwRV9JTlRfTU9ERV9MRUdBQ1kpIHsKIAkJZXJyID0gZTEwMDBfdGVzdF9tc2koYWRhcHRlcik7CiAJCWlmIChlcnIpIHsKIAkJCWVfZXJyKCJJbnRlcnJ1cHQgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwpAQCAtMjkxMiw2ICszMjI3LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZTEwMDBlX3VwZGF0ZV9waHlfdGFzayAtIHdvcmsgdGhyZWFkIHRvIHVwZGF0ZSBwaHkKKyAqIEB3b3JrOiBwb2ludGVyIHRvIG91ciB3b3JrIHN0cnVjdAorICoKKyAqIHRoaXMgd29ya2VyIHRocmVhZCBleGlzdHMgYmVjYXVzZSB3ZSBtdXN0IGFjcXVpcmUgYQorICogc2VtYXBob3JlIHRvIHJlYWQgdGhlIHBoeSwgd2hpY2ggd2UgY291bGQgbXNsZWVwIHdoaWxlCisgKiB3YWl0aW5nIGZvciBpdCwgYW5kIHdlIGNhbid0IG1zbGVlcCBpbiBhIHRpbWVyLgorICoqLworc3RhdGljIHZvaWQgZTEwMDBlX3VwZGF0ZV9waHlfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJc3RydWN0IGUxMDAwX2FkYXB0ZXIsIHVwZGF0ZV9waHlfdGFzayk7CisJZTEwMDBfZ2V0X3BoeV9pbmZvKCZhZGFwdGVyLT5odyk7Cit9CisKIC8qCiAgKiBOZWVkIHRvIHdhaXQgYSBmZXcgc2Vjb25kcyBhZnRlciBsaW5rIHVwIHRvIGdldCBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGZyb20KICAqIHRoZSBwaHkKQEAgLTI5MTksNyArMzI0OSw3IEBACiBzdGF0aWMgdm9pZCBlMTAwMF91cGRhdGVfcGh5X2luZm8odW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopIGRhdGE7Ci0JZTEwMDBfZ2V0X3BoeV9pbmZvKCZhZGFwdGVyLT5odyk7CisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+dXBkYXRlX3BoeV90YXNrKTsKIH0KIAogLyoqCkBAIC0yOTMwLDEwICszMjYwLDYgQEAKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQl1MTYgcGh5X3RtcDsKLQotI2RlZmluZSBQSFlfSURMRV9FUlJPUl9DT1VOVF9NQVNLIDB4MDBGRgogCiAJLyoKIAkgKiBQcmV2ZW50IHN0YXRzIHVwZGF0ZSB3aGlsZSBhZGFwdGVyIGlzIGJlaW5nIHJlc2V0LCBvciBpZiB0aGUgcGNpCkBAIC0yOTQ0LDE0ICszMjcwLDYgQEAKIAlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShwZGV2KSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGlycV9mbGFncyk7Ci0KLQkvKgotCSAqIHRoZXNlIGNvdW50ZXJzIGFyZSBtb2RpZmllZCBmcm9tIGUxMDAwX2FkanVzdF90Ymlfc3RhdHMsCi0JICogY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBjb250ZXh0LCBzbyB0aGV5IG11c3Qgb25seQotCSAqIGJlIHdyaXR0ZW4gd2hpbGUgaG9sZGluZyBhZGFwdGVyLT5zdGF0c19sb2NrCi0JICovCi0KIAlhZGFwdGVyLT5zdGF0cy5jcmNlcnJzICs9IGVyMzIoQ1JDRVJSUyk7CiAJYWRhcHRlci0+c3RhdHMuZ3ByYyArPSBlcjMyKEdQUkMpOwogCWFkYXB0ZXItPnN0YXRzLmdvcmMgKz0gZXIzMihHT1JDTCk7CkBAIC0yOTg4LDcgKzMzMDYsOCBAQAogCiAJYWRhcHRlci0+c3RhdHMuYWxnbmVycmMgKz0gZXIzMihBTEdORVJSQyk7CiAJYWRhcHRlci0+c3RhdHMucnhlcnJjICs9IGVyMzIoUlhFUlJDKTsKLQlhZGFwdGVyLT5zdGF0cy50bmNycyArPSBlcjMyKFROQ1JTKTsKKwlpZiAoaHctPm1hYy50eXBlICE9IGUxMDAwXzgyNTc0KQorCQlhZGFwdGVyLT5zdGF0cy50bmNycyArPSBlcjMyKFROQ1JTKTsKIAlhZGFwdGVyLT5zdGF0cy5jZXh0ZXJyICs9IGVyMzIoQ0VYVEVSUik7CiAJYWRhcHRlci0+c3RhdHMudHNjdGMgKz0gZXIzMihUU0NUQyk7CiAJYWRhcHRlci0+c3RhdHMudHNjdGZjICs9IGVyMzIoVFNDVEZDKTsKQEAgLTMwMjIsMjEgKzMzNDEsMTAgQEAKIAogCS8qIFR4IERyb3BwZWQgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCBlbHNld2hlcmUgKi8KIAotCS8qIFBoeSBTdGF0cyAqLwotCWlmIChody0+cGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKLQkJaWYgKChhZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMDApICYmCi0JCSAgICghZTFlX3JwaHkoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfdG1wKSkpIHsKLQkJCXBoeV90bXAgJj0gUEhZX0lETEVfRVJST1JfQ09VTlRfTUFTSzsKLQkJCWFkYXB0ZXItPnBoeV9zdGF0cy5pZGxlX2Vycm9ycyArPSBwaHlfdG1wOwotCQl9Ci0JfQotCiAJLyogTWFuYWdlbWVudCBTdGF0cyAqLwogCWFkYXB0ZXItPnN0YXRzLm1ncHRjICs9IGVyMzIoTUdUUFRDKTsKIAlhZGFwdGVyLT5zdGF0cy5tZ3ByYyArPSBlcjMyKE1HVFBSQyk7CiAJYWRhcHRlci0+c3RhdHMubWdwZGMgKz0gZXIzMihNR1RQREMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgaXJxX2ZsYWdzKTsKIH0KIAogLyoqCkBAIC0zMDQ4LDEwICszMzU2LDYgQEAKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBlMTAwMF9waHlfcmVncyAqcGh5ID0gJmFkYXB0ZXItPnBoeV9yZWdzOwogCWludCByZXRfdmFsOwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgaXJxX2ZsYWdzKTsKIAogCWlmICgoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xVKSAmJgogCSAgICAoYWRhcHRlci0+aHcucGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpKSB7CkBAIC0zMDgyLDggKzMzODYsNiBAQAogCQlwaHktPnN0YXQxMDAwID0gMDsKIAkJcGh5LT5lc3RhdHVzID0gKEVTVEFUVVNfMTAwMF9URlVMTCB8IEVTVEFUVVNfMTAwMF9USEFMRik7CiAJfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgaXJxX2ZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZTEwMDBfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQpAQCAtMzIwMSw2ICszNTAzLDI3IEBACiAJCQkJCQkgICAmYWRhcHRlci0+bGlua19kdXBsZXgpOwogCQkJZTEwMDBfcHJpbnRfbGlua19pbmZvKGFkYXB0ZXIpOwogCQkJLyoKKwkJCSAqIE9uIHN1cHBvcnRlZCBQSFlzLCBjaGVjayBmb3IgZHVwbGV4IG1pc21hdGNoIG9ubHkKKwkJCSAqIGlmIGxpbmsgaGFzIGF1dG9uZWdvdGlhdGVkIGF0IDEwLzEwMCBoYWxmCisJCQkgKi8KKwkJCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pZ3BfMyB8fAorCQkJICAgICBody0+cGh5LnR5cGUgPT0gZTEwMDBfcGh5X2JtKSAmJgorCQkJICAgIChody0+bWFjLmF1dG9uZWcgPT0gdHJ1ZSkgJiYKKwkJCSAgICAoYWRhcHRlci0+bGlua19zcGVlZCA9PSBTUEVFRF8xMCB8fAorCQkJICAgICBhZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMCkgJiYKKwkJCSAgICAoYWRhcHRlci0+bGlua19kdXBsZXggPT0gSEFMRl9EVVBMRVgpKSB7CisJCQkJdTE2IGF1dG9uZWdfZXhwOworCisJCQkJZTFlX3JwaHkoaHcsIFBIWV9BVVRPTkVHX0VYUCwgJmF1dG9uZWdfZXhwKTsKKworCQkJCWlmICghKGF1dG9uZWdfZXhwICYgTldBWV9FUl9MUF9OV0FZX0NBUFMpKQorCQkJCQllX2luZm8oIkF1dG9uZWdvdGlhdGVkIGhhbGYgZHVwbGV4IGJ1dCIKKwkJCQkJICAgICAgICIgbGluayBwYXJ0bmVyIGNhbm5vdCBhdXRvbmVnLiAiCisJCQkJCSAgICAgICAiIFRyeSBmb3JjaW5nIGZ1bGwgZHVwbGV4IGlmICIKKwkJCQkJICAgICAgICJsaW5rIGdldHMgbWFueSBjb2xsaXNpb25zLlxuIik7CisJCQl9CisKKwkJCS8qCiAJCQkgKiB0d2VhayB0eF9xdWV1ZV9sZW4gYWNjb3JkaW5nIHRvIHNwZWVkL2R1cGxleAogCQkJICogYW5kIGFkanVzdCB0aGUgdGltZW91dCBmYWN0b3IKIAkJCSAqLwpAQCAtMzMxNSw3ICszNjM4LDEwIEBACiAJfQogCiAJLyogQ2F1c2Ugc29mdHdhcmUgaW50ZXJydXB0IHRvIGVuc3VyZSBSeCByaW5nIGlzIGNsZWFuZWQgKi8KLQlldzMyKElDUywgRTEwMDBfSUNTX1JYRE1UMCk7CisJaWYgKGFkYXB0ZXItPm1zaXhfZW50cmllcykKKwkJZXczMihJQ1MsIGFkYXB0ZXItPnJ4X3JpbmctPmltc192YWwpOworCWVsc2UKKwkJZXczMihJQ1MsIEUxMDAwX0lDU19SWERNVDApOwogCiAJLyogRm9yY2UgZGV0ZWN0aW9uIG9mIGh1bmcgY29udHJvbGxlciBldmVyeSB3YXRjaGRvZyBwZXJpb2QgKi8KIAlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IDE7CkBAIC0zNDIzLDM0ICszNzQ5LDUwIEBACiAJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CiAJdW5zaWduZWQgaW50IGk7CiAJdTggY3NzOworCXUzMiBjbWRfbGVuID0gRTEwMDBfVFhEX0NNRF9ERVhUOwogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJY3NzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJcmV0dXJuIDA7CiAKLQkJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwotCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKLQkJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKCp0eF9yaW5nLCBpKTsKLQotCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2NvbmZpZyA9IDA7Ci0JCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzcyA9IGNzczsKLQkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0KLQkJCQkJY3NzICsgc2tiLT5jc3VtX29mZnNldDsKLQkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NlID0gMDsKLQkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmRhdGEgPSAwOwotCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoRTEwMDBfVFhEX0NNRF9ERVhUKTsKLQotCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoID0gaTsKLQotCQlpKys7Ci0JCWlmIChpID09IHR4X3JpbmctPmNvdW50KQotCQkJaSA9IDA7Ci0JCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKLQotCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJY21kX2xlbiB8PSBFMTAwMF9UWERfQ01EX1RDUDsKKwkJYnJlYWs7CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCQkvKiBYWFggbm90IGhhbmRsaW5nIGFsbCBJUFY2IGhlYWRlcnMgKi8KKwkJaWYgKGlwdjZfaGRyKHNrYiktPm5leHRoZHIgPT0gSVBQUk9UT19UQ1ApCisJCQljbWRfbGVuIHw9IEUxMDAwX1RYRF9DTURfVENQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkKKwkJCWVfd2FybigiY2hlY2tzdW1fcGFydGlhbCBwcm90bz0leCFcbiIsIHNrYi0+cHJvdG9jb2wpOworCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gMDsKKwljc3MgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCisJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOworCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCWNvbnRleHRfZGVzYyA9IEUxMDAwX0NPTlRFWFRfREVTQygqdHhfcmluZywgaSk7CisKKwljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2NvbmZpZyA9IDA7CisJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NzID0gY3NzOworCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9CisJCQkJY3NzICsgc2tiLT5jc3VtX29mZnNldDsKKwljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc2UgPSAwOworCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKKwljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoY21kX2xlbik7CisKKwlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOworCisJaSsrOworCWlmIChpID09IHR4X3JpbmctPmNvdW50KQorCQlpID0gMDsKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CisKKwlyZXR1cm4gMTsKIH0KIAogI2RlZmluZSBFMTAwMF9NQVhfUEVSX1RYRAk4MTkyCkBAIC00MDMyLDYgKzQzNzQsNyBAQAogCQllMTAwMGVfZG93bihhZGFwdGVyKTsKIAkJZTEwMDBfZnJlZV9pcnEoYWRhcHRlcik7CiAJfQorCWUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKIAogCXJldHZhbCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCWlmIChyZXR2YWwpCkBAIC00MTU4LDYgKzQ1MDEsNyBAQAogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKIAorCWUxMDAwZV9zZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewogCQllcnIgPSBlMTAwMF9yZXF1ZXN0X2lycShhZGFwdGVyKTsKIAkJaWYgKGVycikKQEAgLTQzMzUsMTMgKzQ2NzksMTUgQEAKIAlyZXRfdmFsID0gZTEwMDBfcmVhZF9udm0oaHcsIE5WTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmJ1Zik7CiAJaWYgKCEobGUxNl90b19jcHUoYnVmKSAmICgxIDw8IDApKSkgewogCQkvKiBEZWVwIFNtYXJ0IFBvd2VyIERvd24gKERTUEQpICovCi0JCWVfd2FybigiV2FybmluZzogZGV0ZWN0ZWQgRFNQRCBlbmFibGVkIGluIEVFUFJPTVxuIik7CisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgIldhcm5pbmc6IGRldGVjdGVkIERTUEQgZW5hYmxlZCBpbiBFRVBST01cbiIpOwogCX0KIAogCXJldF92YWwgPSBlMTAwMF9yZWFkX252bShodywgTlZNX0lOSVRfM0dJT18zLCAxLCAmYnVmKTsKIAlpZiAobGUxNl90b19jcHUoYnVmKSAmICgzIDw8IDIpKSB7CiAJCS8qIEFTUE0gZW5hYmxlICovCi0JCWVfd2FybigiV2FybmluZzogZGV0ZWN0ZWQgQVNQTSBlbmFibGVkIGluIEVFUFJPTVxuIik7CisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgIldhcm5pbmc6IGRldGVjdGVkIEFTUE0gZW5hYmxlZCBpbiBFRVBST01cbiIpOwogCX0KIH0KIApAQCAtNDQ2Nyw2ICs0ODEzLDggQEAKIAogCWFkYXB0ZXItPmJkX251bWJlciA9IGNhcmRzX2ZvdW5kKys7CiAKKwllMTAwMGVfY2hlY2tfb3B0aW9ucyhhZGFwdGVyKTsKKwogCS8qIHNldHVwIGFkYXB0ZXIgc3RydWN0ICovCiAJZXJyID0gZTEwMDBfc3dfaW5pdChhZGFwdGVyKTsKIAlpZiAoZXJyKQpAQCAtNDQ4Miw2ICs0ODMwLDEwIEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfaHdfaW5pdDsKIAorCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX0lDSCkgJiYKKwkgICAgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19SRUFEX09OTFlfTlZNKSkKKwkJZTEwMDBlX3dyaXRlX3Byb3RlY3RfbnZtX2ljaDhsYW4oJmFkYXB0ZXItPmh3KTsKKwogCWh3LT5tYWMub3BzLmdldF9idXNfaW5mbygmYWRhcHRlci0+aHcpOwogCiAJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSA9IDA7CkBAIC00NTcyLDggKzQ5MjQsOCBAQAogCiAJSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXNldF90YXNrLCBlMTAwMF9yZXNldF90YXNrKTsKIAlJTklUX1dPUksoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2ssIGUxMDAwX3dhdGNoZG9nX3Rhc2spOwotCi0JZTEwMDBlX2NoZWNrX29wdGlvbnMoYWRhcHRlcik7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT5kb3duc2hpZnRfdGFzaywgZTEwMDBlX2Rvd25zaGlmdF93b3JrYXJvdW5kKTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPnVwZGF0ZV9waHlfdGFzaywgZTEwMDBlX3VwZGF0ZV9waHlfdGFzayk7CiAKIAkvKiBJbml0aWFsaXplIGxpbmsgcGFyYW1ldGVycy4gVXNlciBjYW4gY2hhbmdlIHRoZW0gd2l0aCBldGh0b29sICovCiAJYWRhcHRlci0+aHcubWFjLmF1dG9uZWcgPSAxOwpAQCAtNDcwNCw2ICs1MDU2LDcgQEAKIAlpZiAoIWUxMDAwX2NoZWNrX3Jlc2V0X2Jsb2NrKCZhZGFwdGVyLT5odykpCiAJCWUxMDAwX3BoeV9od19yZXNldCgmYWRhcHRlci0+aHcpOwogCisJZTEwMDBlX3Jlc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOwogCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcpOwogCWtmcmVlKGFkYXB0ZXItPnJ4X3JpbmcpOwogCkBAIC00NzQ1LDYgKzUwOTgsOCBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF84MjU3M0VfSUFNVCksIGJvYXJkXzgyNTczIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEXzgyNTczTCksIGJvYXJkXzgyNTczIH0sCiAKKwl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfODI1NzRMKSwgYm9hcmRfODI1NzQgfSwKKwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF84MDAwM0VTMkxBTl9DT1BQRVJfRFBUKSwKIAkgIGJvYXJkXzgwMDAzZXMybGFuIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEXzgwMDAzRVMyTEFOX0NPUFBFUl9TUFQpLApAQCAtNDc2Nyw2ICs1MTIyLDcgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIOV9JRkVfR1QpLCBib2FyZF9pY2g5bGFuIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX0lDSDlfSUdQX0FNVCksIGJvYXJkX2ljaDlsYW4gfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIOV9JR1BfQyksIGJvYXJkX2ljaDlsYW4gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIOV9CTSksIGJvYXJkX2ljaDlsYW4gfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIOV9JR1BfTSksIGJvYXJkX2ljaDlsYW4gfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIOV9JR1BfTV9BTVQpLCBib2FyZF9pY2g5bGFuIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX0lDSDlfSUdQX01fViksIGJvYXJkX2ljaDlsYW4gfSwKQEAgLTQ3NzUsNiArNTEzMSw5IEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX0lDSDEwX1JfQk1fTEYpLCBib2FyZF9pY2g5bGFuIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX0lDSDEwX1JfQk1fViksIGJvYXJkX2ljaDlsYW4gfSwKIAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9JQ0gxMF9EX0JNX0xNKSwgYm9hcmRfaWNoMTBsYW4gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCBFMTAwMF9ERVZfSURfSUNIMTBfRF9CTV9MRiksIGJvYXJkX2ljaDEwbGFuIH0sCisKIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZTEwMDBfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9wYXJhbS5jCmluZGV4IGVkOTEyZTAuLjc3YTNkNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9wYXJhbS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9wYXJhbS5jCkBAIC0xMTQsNiArMTE0LDE1IEBACiAjZGVmaW5lIERFRkFVTFRfSVRSIDMKICNkZWZpbmUgTUFYX0lUUiAxMDAwMDAKICNkZWZpbmUgTUlOX0lUUiAxMDAKKy8qIEludE1vZGUgKEludGVycnVwdCBNb2RlKQorICoKKyAqIFZhbGlkIFJhbmdlOiAwIC0gMgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDIgKE1TSS1YKQorICovCitFMTAwMF9QQVJBTShJbnRNb2RlLCAiSW50ZXJydXB0IE1vZGUiKTsKKyNkZWZpbmUgTUFYX0lOVE1PREUJMgorI2RlZmluZSBNSU5fSU5UTU9ERQkwCiAKIC8qCiAgKiBFbmFibGUgU21hcnQgUG93ZXIgRG93biBvZiB0aGUgUEhZCkBAIC0xMzMsNiArMTQyLDE1IEBACiAgKi8KIEUxMDAwX1BBUkFNKEt1bWVyYW5Mb2NrTG9zcywgIkVuYWJsZSBLdW1lcmFuIGxvY2sgbG9zcyB3b3JrYXJvdW5kIik7CiAKKy8qCisgKiBXcml0ZSBQcm90ZWN0IE5WTQorICoKKyAqIFZhbGlkIFJhbmdlOiAwLCAxCisgKgorICogRGVmYXVsdCBWYWx1ZTogMSAoZW5hYmxlZCkKKyAqLworRTEwMDBfUEFSQU0oV3JpdGVQcm90ZWN0TlZNLCAiV3JpdGUtcHJvdGVjdCBOVk0gW1dBUk5JTkc6IGRpc2FibGluZyB0aGlzIGNhbiBsZWFkIHRvIGNvcnJ1cHRlZCBOVk1dIik7CisKIHN0cnVjdCBlMTAwMF9vcHRpb24gewogCWVudW0geyBlbmFibGVfb3B0aW9uLCByYW5nZV9vcHRpb24sIGxpc3Rfb3B0aW9uIH0gdHlwZTsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMzUyLDYgKzM3MCwyNCBAQAogCQkJYWRhcHRlci0+aXRyID0gMjAwMDA7CiAJCX0KIAl9CisJeyAvKiBJbnRlcnJ1cHQgTW9kZSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiSW50ZXJydXB0IE1vZGUiLAorCQkJLmVyciAgPSAiZGVmYXVsdGluZyB0byAyIChNU0ktWCkiLAorCQkJLmRlZiAgPSBFMTAwMEVfSU5UX01PREVfTVNJWCwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9JTlRNT0RFLAorCQkJCQkgLm1heCA9IE1BWF9JTlRNT0RFIH0gfQorCQl9OworCisJCWlmIChudW1fSW50TW9kZSA+IGJkKSB7CisJCQl1bnNpZ25lZCBpbnQgaW50X21vZGUgPSBJbnRNb2RlW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmaW50X21vZGUsICZvcHQsIGFkYXB0ZXIpOworCQkJYWRhcHRlci0+aW50X21vZGUgPSBpbnRfbW9kZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmludF9tb2RlID0gb3B0LmRlZjsKKwkJfQorCX0KIAl7IC8qIFNtYXJ0IFBvd2VyIERvd24gKi8KIAkJY29uc3Qgc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CiAJCQkudHlwZSA9IGVuYWJsZV9vcHRpb24sCkBAIC0zODgsNCArNDI0LDI1IEBACiAJCQkJCQkJCSAgICAgICBvcHQuZGVmKTsKIAkJfQogCX0KKwl7IC8qIFdyaXRlLXByb3RlY3QgTlZNICovCisJCWNvbnN0IHN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBlbmFibGVfb3B0aW9uLAorCQkJLm5hbWUgPSAiV3JpdGUtcHJvdGVjdCBOVk0iLAorCQkJLmVyciAgPSAiZGVmYXVsdGluZyB0byBFbmFibGVkIiwKKwkJCS5kZWYgID0gT1BUSU9OX0VOQUJMRUQKKwkJfTsKKworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX0lDSCkgeworCQkJaWYgKG51bV9Xcml0ZVByb3RlY3ROVk0gPiBiZCkgeworCQkJCXVuc2lnbmVkIGludCB3cml0ZV9wcm90ZWN0X252bSA9IFdyaXRlUHJvdGVjdE5WTVtiZF07CisJCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZ3cml0ZV9wcm90ZWN0X252bSwgJm9wdCwKKwkJCQkJCSAgICAgIGFkYXB0ZXIpOworCQkJCWlmICh3cml0ZV9wcm90ZWN0X252bSkKKwkJCQkJYWRhcHRlci0+ZmxhZ3MgfD0gRkxBR19SRUFEX09OTFlfTlZNOworCQkJfSBlbHNlIHsKKwkJCQlpZiAob3B0LmRlZikKKwkJCQkJYWRhcHRlci0+ZmxhZ3MgfD0gRkxBR19SRUFEX09OTFlfTlZNOworCQkJfQorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCmluZGV4IGIxMzNkY2YuLjZjZDMzM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKQEAgLTQ3Niw3ICs0NzYsOSBAQAogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCWlmICgocGh5LT50eXBlID09IGUxMDAwX3BoeV9tODgpICYmIChwaHktPnJldmlzaW9uIDwgNCkpIHsKKwlpZiAoKHBoeS0+dHlwZSA9PSBlMTAwMF9waHlfbTg4KSAmJgorCSAgICAocGh5LT5yZXZpc2lvbiA8IEUxMDAwX1JFVklTSU9OXzQpICYmCisJICAgIChwaHktPmlkICE9IEJNRTEwMDBfRV9QSFlfSURfUjIpKSB7CiAJCS8qCiAJCSAqIEZvcmNlIFRYX0NMSyBpbiB0aGUgRXh0ZW5kZWQgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKIAkJICogdG8gMjVNSHogY2xvY2suCkBAIC01MDQsNiArNTA2LDE4IEBACiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKKwlpZiAoKHBoeS0+dHlwZSA9PSBlMTAwMF9waHlfYm0pICYmIChwaHktPmlkID09IEJNRTEwMDBfRV9QSFlfSURfUjIpKSB7CisJCS8qIFNldCBQSFkgcGFnZSAwLCByZWdpc3RlciAyOSB0byAweDAwMDMgKi8KKwkJcmV0X3ZhbCA9IGUxZV93cGh5KGh3LCAyOSwgMHgwMDAzKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQkvKiBTZXQgUEhZIHBhZ2UgMCwgcmVnaXN0ZXIgMzAgdG8gMHgwMDAwICovCisJCXJldF92YWwgPSBlMWVfd3BoeShodywgMzAsIDB4MDAwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCiAJLyogQ29tbWl0IHRoZSBjaGFuZ2VzLiAqLwogCXJldF92YWwgPSBlMTAwMGVfY29tbWl0X3BoeShodyk7CiAJaWYgKHJldF92YWwpCkBAIC0xNzIwLDYgKzE3MzQsOTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiAgZTEwMDBlX3BoeV9pbml0X3NjcmlwdF9pZ3AzIC0gSW5pdHMgdGhlIElHUDMgUEhZCisgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqCisgKiAgSW5pdGlhbGl6ZXMgYSBJbnRlbCBHaWdhYml0IFBIWTMgd2hlbiBhbiBFRVBST00gaXMgbm90IHByZXNlbnQuCisgKiovCitzMzIgZTEwMDBlX3BoeV9pbml0X3NjcmlwdF9pZ3AzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJaHdfZGJnKGh3LCAiUnVubmluZyBJR1AgMyBQSFkgaW5pdCBzY3JpcHRcbiIpOworCisJLyogUEhZIGluaXQgSUdQIDMgKi8KKwkvKiBFbmFibGUgcmlzZS9mYWxsLCAxMC1tb2RlIHdvcmsgaW4gY2xhc3MtQSAqLworCWUxZV93cGh5KGh3LCAweDJGNUIsIDB4OTAxOCk7CisJLyogUmVtb3ZlIGFsbCBjYXBzIGZyb20gUmVwbGljYSBwYXRoIGZpbHRlciAqLworCWUxZV93cGh5KGh3LCAweDJGNTIsIDB4MDAwMCk7CisJLyogQmlhcyB0cmltbWluZyBmb3IgQURDLCBBRkUgYW5kIERyaXZlciAoRGVmYXVsdCkgKi8KKwllMWVfd3BoeShodywgMHgyRkIxLCAweDhCMjQpOworCS8qIEluY3JlYXNlIEh5YnJpZCBwb2x5IGJpYXMgKi8KKwllMWVfd3BoeShodywgMHgyRkIyLCAweEY4RjApOworCS8qIEFkZCA0JSB0byBUeCBhbXBsaXR1ZGUgaW4gR2lnIG1vZGUgKi8KKwllMWVfd3BoeShodywgMHgyMDEwLCAweDEwQjApOworCS8qIERpc2FibGUgdHJpbW1pbmcgKFRUVCkgKi8KKwllMWVfd3BoeShodywgMHgyMDExLCAweDAwMDApOworCS8qIFBvbHkgREMgY29ycmVjdGlvbiB0byA5NC42JSArIDIlIGZvciBhbGwgY2hhbm5lbHMgKi8KKwllMWVfd3BoeShodywgMHgyMERELCAweDI0OUEpOworCS8qIEFCUyBEQyBjb3JyZWN0aW9uIHRvIDk1LjklICovCisJZTFlX3dwaHkoaHcsIDB4MjBERSwgMHgwMEQzKTsKKwkvKiBCRyB0ZW1wIGN1cnZlIHRyaW0gKi8KKwllMWVfd3BoeShodywgMHgyOEI0LCAweDA0Q0UpOworCS8qIEluY3JlYXNpbmcgQURDIE9QQU1QIHN0YWdlIDEgY3VycmVudHMgdG8gbWF4ICovCisJZTFlX3dwaHkoaHcsIDB4MkY3MCwgMHgyOUU0KTsKKwkvKiBGb3JjZSAxMDAwICggcmVxdWlyZWQgZm9yIGVuYWJsaW5nIFBIWSByZWdzIGNvbmZpZ3VyYXRpb24pICovCisJZTFlX3dwaHkoaHcsIDB4MDAwMCwgMHgwMTQwKTsKKwkvKiBTZXQgdXBkX2ZyZXEgdG8gNiAqLworCWUxZV93cGh5KGh3LCAweDFGMzAsIDB4MTYwNik7CisJLyogRGlzYWJsZSBOUERGRSAqLworCWUxZV93cGh5KGh3LCAweDFGMzEsIDB4QjgxNCk7CisJLyogRGlzYWJsZSBhZGFwdGl2ZSBmaXhlZCBGRkUgKERlZmF1bHQpICovCisJZTFlX3dwaHkoaHcsIDB4MUYzNSwgMHgwMDJBKTsKKwkvKiBFbmFibGUgRkZFIGh5c3RlcmVzaXMgKi8KKwllMWVfd3BoeShodywgMHgxRjNFLCAweDAwNjcpOworCS8qIEZpeGVkIEZGRSBmb3Igc2hvcnQgY2FibGUgbGVuZ3RocyAqLworCWUxZV93cGh5KGh3LCAweDFGNTQsIDB4MDA2NSk7CisJLyogRml4ZWQgRkZFIGZvciBtZWRpdW0gY2FibGUgbGVuZ3RocyAqLworCWUxZV93cGh5KGh3LCAweDFGNTUsIDB4MDAyQSk7CisJLyogRml4ZWQgRkZFIGZvciBsb25nIGNhYmxlIGxlbmd0aHMgKi8KKwllMWVfd3BoeShodywgMHgxRjU2LCAweDAwMkEpOworCS8qIEVuYWJsZSBBZGFwdGl2ZSBDbGlwIFRocmVzaG9sZCAqLworCWUxZV93cGh5KGh3LCAweDFGNzIsIDB4M0ZCMCk7CisJLyogQUhUIHJlc2V0IGxpbWl0IHRvIDEgKi8KKwllMWVfd3BoeShodywgMHgxRjc2LCAweEMwRkYpOworCS8qIFNldCBBSFQgbWFzdGVyIGRlbGF5IHRvIDEyNyBtc2VjICovCisJZTFlX3dwaHkoaHcsIDB4MUY3NywgMHgxREVDKTsKKwkvKiBTZXQgc2NhbiBiaXRzIGZvciBBSFQgKi8KKwllMWVfd3BoeShodywgMHgxRjc4LCAweEY5RUYpOworCS8qIFNldCBBSFQgUHJlc2V0IGJpdHMgKi8KKwllMWVfd3BoeShodywgMHgxRjc5LCAweDAyMTApOworCS8qIENoYW5nZSBpbnRlZ19mYWN0b3Igb2YgY2hhbm5lbCBBIHRvIDMgKi8KKwllMWVfd3BoeShodywgMHgxODk1LCAweDAwMDMpOworCS8qIENoYW5nZSBwcm9wX2ZhY3RvciBvZiBjaGFubmVscyBCQ0QgdG8gOCAqLworCWUxZV93cGh5KGh3LCAweDE3OTYsIDB4MDAwOCk7CisJLyogQ2hhbmdlIGNnX2ljb3VudCArIGVuYWJsZSBpbnRlZ2JwIGZvciBjaGFubmVscyBCQ0QgKi8KKwllMWVfd3BoeShodywgMHgxNzk4LCAweEQwMDgpOworCS8qCisJICogQ2hhbmdlIGNnX2ljb3VudCArIGVuYWJsZSBpbnRlZ2JwICsgY2hhbmdlIHByb3BfZmFjdG9yX21hc3RlcgorCSAqIHRvIDggZm9yIGNoYW5uZWwgQQorCSAqLworCWUxZV93cGh5KGh3LCAweDE4OTgsIDB4RDkxOCk7CisJLyogRGlzYWJsZSBBSFQgaW4gU2xhdmUgbW9kZSBvbiBjaGFubmVsIEEgKi8KKwllMWVfd3BoeShodywgMHgxODdBLCAweDA4MDApOworCS8qCisJICogRW5hYmxlIExQTFUgYW5kIGRpc2FibGUgQU4gdG8gMTAwMCBpbiBub24tRDBhIHN0YXRlcywKKwkgKiBFbmFibGUgU1BEK0IyQgorCSAqLworCWUxZV93cGh5KGh3LCAweDAwMTksIDB4MDA4RCk7CisJLyogRW5hYmxlIHJlc3RhcnQgQU4gb24gYW4xMDAwX2RpcyBjaGFuZ2UgKi8KKwllMWVfd3BoeShodywgMHgwMDFCLCAweDIwODApOworCS8qIEVuYWJsZSB3aF9maWZvIHJlYWQgY2xvY2sgaW4gMTAvMTAwIG1vZGVzICovCisJZTFlX3dwaHkoaHcsIDB4MDAxNCwgMHgwMDQ1KTsKKwkvKiBSZXN0YXJ0IEFOLCBTcGVlZCBzZWxlY3Rpb24gaXMgMTAwMCAqLworCWUxZV93cGh5KGh3LCAweDAwMDAsIDB4MTM0MCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyogSW50ZXJuYWwgZnVuY3Rpb24gcG9pbnRlcnMgKi8KIAogLyoqCkBAIC0xOTY5LDYgKzIwNjgsOTkgQEAKIH0KIAogLyoqCisgKiAgZTEwMDBlX3JlYWRfcGh5X3JlZ19ibTIgLSBSZWFkIEJNIFBIWSByZWdpc3RlcgorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IHRvIGJlIHJlYWQKKyAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgcmVhZCBkYXRhCisgKgorICogIEFjcXVpcmVzIHNlbWFwaG9yZSwgaWYgbmVjZXNzYXJ5LCB0aGVuIHJlYWRzIHRoZSBQSFkgcmVnaXN0ZXIgYXQgb2Zmc2V0CisgKiAgYW5kIHN0b3JpbmcgdGhlIHJldHJpZXZlZCBpbmZvcm1hdGlvbiBpbiBkYXRhLiAgUmVsZWFzZSBhbnkgYWNxdWlyZWQKKyAqICBzZW1hcGhvcmVzIGJlZm9yZSBleGl0aW5nLgorICoqLworczMyIGUxMDAwZV9yZWFkX3BoeV9yZWdfYm0yKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiAqZGF0YSkKK3sKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgcGFnZSA9ICh1MTYpKG9mZnNldCA+PiBJR1BfUEFHRV9TSElGVCk7CisKKwkvKiBQYWdlIDgwMCB3b3JrcyBkaWZmZXJlbnRseSB0aGFuIHRoZSByZXN0IHNvIGl0IGhhcyBpdHMgb3duIGZ1bmMgKi8KKwlpZiAocGFnZSA9PSBCTV9XVUNfUEFHRSkgeworCQlyZXRfdmFsID0gZTEwMDBfYWNjZXNzX3BoeV93YWtldXBfcmVnX2JtKGh3LCBvZmZzZXQsIGRhdGEsCisJCQkJCQkJIHRydWUpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZV9waHkoaHcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCWh3LT5waHkuYWRkciA9IDE7CisKKwlpZiAob2Zmc2V0ID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykgeworCisJCS8qIFBhZ2UgaXMgc2hpZnRlZCBsZWZ0LCBQSFkgZXhwZWN0cyAocGFnZSB4IDMyKSAqLworCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywgQk1fUEhZX1BBR0VfU0VMRUNULAorCQkJCQkJICAgIHBhZ2UpOworCisJCWlmIChyZXRfdmFsKSB7CisJCQlody0+cGh5Lm9wcy5yZWxlYXNlX3BoeShodyk7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCX0KKworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCQkJCSAgIGRhdGEpOworCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKioKKyAqICBlMTAwMGVfd3JpdGVfcGh5X3JlZ19ibTIgLSBXcml0ZSBCTSBQSFkgcmVnaXN0ZXIKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byB3cml0ZSB0bworICogIEBkYXRhOiBkYXRhIHRvIHdyaXRlIGF0IHJlZ2lzdGVyIG9mZnNldAorICoKKyAqICBBY3F1aXJlcyBzZW1hcGhvcmUsIGlmIG5lY2Vzc2FyeSwgdGhlbiB3cml0ZXMgdGhlIGRhdGEgdG8gUEhZIHJlZ2lzdGVyCisgKiAgYXQgdGhlIG9mZnNldC4gIFJlbGVhc2UgYW55IGFjcXVpcmVkIHNlbWFwaG9yZXMgYmVmb3JlIGV4aXRpbmcuCisgKiovCitzMzIgZTEwMDBlX3dyaXRlX3BoeV9yZWdfYm0yKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsIHUxNiBkYXRhKQoreworCXMzMiByZXRfdmFsOworCXUxNiBwYWdlID0gKHUxNikob2Zmc2V0ID4+IElHUF9QQUdFX1NISUZUKTsKKworCS8qIFBhZ2UgODAwIHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3Qgc28gaXQgaGFzIGl0cyBvd24gZnVuYyAqLworCWlmIChwYWdlID09IEJNX1dVQ19QQUdFKSB7CisJCXJldF92YWwgPSBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0oaHcsIG9mZnNldCwgJmRhdGEsCisJCQkJCQkJIGZhbHNlKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0X3ZhbCA9IGh3LT5waHkub3BzLmFjcXVpcmVfcGh5KGh3KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlody0+cGh5LmFkZHIgPSAxOworCisJaWYgKG9mZnNldCA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpIHsKKwkJLyogUGFnZSBpcyBzaGlmdGVkIGxlZnQsIFBIWSBleHBlY3RzIChwYWdlIHggMzIpICovCisJCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBCTV9QSFlfUEFHRV9TRUxFQ1QsCisJCQkJCQkgICAgcGFnZSk7CisKKwkJaWYgKHJldF92YWwpIHsKKwkJCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisJfQorCisJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCQkJCSAgICBkYXRhKTsKKworCWh3LT5waHkub3BzLnJlbGVhc2VfcGh5KGh3KTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKioKICAqICBlMTAwMF9hY2Nlc3NfcGh5X3dha2V1cF9yZWdfYm0gLSBSZWFkIEJNIFBIWSB3YWtldXAgcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCB0byBiZSByZWFkIG9yIHdyaXR0ZW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCmluZGV4IDc5NWM1OTQuLmI3NTFjMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtOCw3ICs4LDcgQEAKICAqCiAgKiBNYW55IG1vZGlmaWNhdGlvbnMsIGFuZCBjdXJyZW50bHkgbWFpbnRhaW5lZCwgYnkKICAqICBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Ci0gKiBBZGRlZCB0aGUgQ29tcGFxIExURSAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIEFkZGVkIHRoZSBDb21wYXEgTFRFICBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICogQWRkZWQgTUNBIHN1cHBvcnQgQWRhbSBGcml0emxlcgogICoKICAqIE5vdGUgLSB0aGlzIGRyaXZlciBpcyBleHBlcmltZW50YWwgc3RpbGwgLSBpdCBoYXMgcHJvYmxlbXMgb24gZmFzdGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IGUwMTkyNmIuLjU1MjQyNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC00MCwxMyArNDAsMTMgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUlZfTkFNRQkiZWhlYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDA5MiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIkVIRUFfMDA5MyIKIAogLyogZUhFQSBjYXBhYmlsaXR5IGZsYWdzICovCiAjZGVmaW5lIERMUEFSX1BPUlRfQUREX1JFTSAxCiAjZGVmaW5lIERMUEFSX01FTV9BREQgICAgICAyCiAjZGVmaW5lIERMUEFSX01FTV9SRU0gICAgICA0Ci0jZGVmaW5lIEVIRUFfQ0FQQUJJTElUSUVTICAoRExQQVJfUE9SVF9BRERfUkVNIHwgRExQQVJfTUVNX0FERCkKKyNkZWZpbmUgRUhFQV9DQVBBQklMSVRJRVMgIChETFBBUl9QT1JUX0FERF9SRU0gfCBETFBBUl9NRU1fQUREIHwgRExQQVJfTUVNX1JFTSkKIAogI2RlZmluZSBFSEVBX01TR19ERUZBVUxUIChORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19USU1FUiBcCiAJfCBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCmluZGV4IDE1NmViNjMuLjJhMzNhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJCQkJICAgICAgIGNiX2xvZ2FkZHIsCQkvKiBSNSAqLwogCQkJCSAgICAgICAwLCAwLCAwLCAwLCAwKTsJCS8qIFI2LVIxMCAqLwogI2lmZGVmIERFQlVHCi0JZWhlYV9kbXAoY2JfYWRkciwgc2l6ZW9mKHN0cnVjdCBoY3BfcXVlcnlfZWhlYSksICJoY3BfcXVlcnlfZWhlYSIpOworCWVoZWFfZHVtcChjYl9hZGRyLCBzaXplb2Yoc3RydWN0IGhjcF9xdWVyeV9laGVhKSwgImhjcF9xdWVyeV9laGVhIik7CiAjZW5kaWYKIAlyZXR1cm4gaHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwppbmRleCAxNDBmMDViLi5kYjhhOTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCkBAIC01OTUsNyArNTk1LDggQEAKIAllbmRfc2VjdGlvbiA9IHN0YXJ0X3NlY3Rpb24gKyAoKG5yX3BhZ2VzICogUEFHRV9TSVpFKSAvIEVIRUFfU0VDVFNJWkUpOwogCW1yX2xlbiA9ICoodW5zaWduZWQgbG9uZyAqKWFyZzsKIAotCWVoZWFfYm1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlaGVhX2JtYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVoZWFfYm1hcCkKKwkJZWhlYV9ibWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVoZWFfYm1hcCksIEdGUF9LRVJORUwpOwogCWlmICghZWhlYV9ibWFwKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5jMjhqNjAuYyBiL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMKaW5kZXggYWEwYmY2ZS4uZTFiNDQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5jMjhqNjAuYworKysgYi9kcml2ZXJzL25ldC9lbmMyOGo2MC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAl9CiAJaWYgKHJldCAmJiBuZXRpZl9tc2dfZHJ2KHByaXYpKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGZhaWxlZDogcmV0ID0gJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHJldCk7CisJCQlfX2Z1bmNfXywgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJcmV0ID0gc3BpX3dyaXRlKHByaXYtPnNwaSwgcHJpdi0+c3BpX3RyYW5zZmVyX2J1ZiwgbGVuICsgMSk7CiAJCWlmIChyZXQgJiYgbmV0aWZfbXNnX2Rydihwcml2KSkKIAkJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzKCkgZmFpbGVkOiByZXQgPSAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHJldCk7CisJCQkJX19mdW5jX18sIHJldCk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xNTYsNyArMTU2LDcgQEAKIAlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHByaXYtPnNwaSwgdHhfYnVmLCAxLCByeF9idWYsIHNsZW4pOwogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzKCkgZmFpbGVkOiByZXQgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCV9fZnVuY19fLCByZXQpOwogCWVsc2UKIAkJdmFsID0gcnhfYnVmW3NsZW4gLSAxXTsKIApAQCAtMTc2LDE0ICsxNzYsMTQgQEAKIAlyZXQgPSBzcGlfd3JpdGUocHJpdi0+c3BpLCBwcml2LT5zcGlfdHJhbnNmZXJfYnVmLCAyKTsKIAlpZiAocmV0ICYmIG5ldGlmX21zZ19kcnYocHJpdikpCiAJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzKCkgZmFpbGVkOiByZXQgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCV9fZnVuY19fLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYzI4ajYwX3NvZnRfcmVzZXQoc3RydWN0IGVuYzI4ajYwX25ldCAqcHJpdikKIHsKIAlpZiAobmV0aWZfbXNnX2h3KHByaXYpKQotCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGlfd3JpdGVfb3AocHJpdiwgRU5DMjhKNjBfU09GVF9SRVNFVCwgMCwgRU5DMjhKNjBfU09GVF9SRVNFVCk7CiAJLyogRXJyYXRhIHdvcmthcm91bmQgIzEsIENMS1JEWSBjaGVjayBpcyB1bnJlbGlhYmxlLApAQCAtMzU3LDcgKzM1Nyw3IEBACiAJCXJlZyA9IG5vbG9ja19yZWd3X3JlYWQocHJpdiwgRVJEUFRMKTsKIAkJaWYgKHJlZyAhPSBhZGRyKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlcnJvciB3cml0aW5nIEVSRFBUICIKLQkJCQkiKDB4JTA0eCAtIDB4JTA0eClcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCBhZGRyKTsKKwkJCQkiKDB4JTA0eCAtIDB4JTA0eClcbiIsIF9fZnVuY19fLCByZWcsIGFkZHIpOwogCX0KICNlbmRpZgogCXNwaV9yZWFkX2J1Zihwcml2LCBsZW4sIGRhdGEpOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJCWlmIChyZWcgIT0gVFhTVEFSVF9JTklUKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUKIAkJCQkiOiAlcygpIEVSV1BUOjB4JTA0eCAhPSAweCUwNHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZWcsIFRYU1RBUlRfSU5JVCk7CisJCQkJX19mdW5jX18sIHJlZywgVFhTVEFSVF9JTklUKTsKIAl9CiAjZW5kaWYKIAkvKiBTZXQgdGhlIFRYTkQgcG9pbnRlciB0byBjb3JyZXNwb25kIHRvIHRoZSBwYWNrZXQgc2l6ZSBnaXZlbiAqLwpAQCAtMzkwLDEzICszOTAsMTMgQEAKIAlpZiAobmV0aWZfbXNnX2h3KHByaXYpKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRQogCQkJIjogJXMoKSBhZnRlciBjb250cm9sIGJ5dGUgRVJXUFQ6MHglMDR4XG4iLAotCQkJX19GVU5DVElPTl9fLCBub2xvY2tfcmVnd19yZWFkKHByaXYsIEVXUlBUTCkpOworCQkJX19mdW5jX18sIG5vbG9ja19yZWd3X3JlYWQocHJpdiwgRVdSUFRMKSk7CiAJLyogY29weSB0aGUgcGFja2V0IGludG8gdGhlIHRyYW5zbWl0IGJ1ZmZlciAqLwogCXNwaV93cml0ZV9idWYocHJpdiwgbGVuLCBkYXRhKTsKIAlpZiAobmV0aWZfbXNnX2h3KHByaXYpKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRQogCQkJICI6ICVzKCkgYWZ0ZXIgd3JpdGUgcGFja2V0IEVSV1BUOjB4JTA0eCwgbGVuPSVkXG4iLAotCQkJIF9fRlVOQ1RJT05fXywgbm9sb2NrX3JlZ3dfcmVhZChwcml2LCBFV1JQVEwpLCBsZW4pOworCQkJIF9fZnVuY19fLCBub2xvY2tfcmVnd19yZWFkKHByaXYsIEVXUlBUTCksIGxlbik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKIH0KIApAQCAtNDk1LDcgKzQ5NSw3IEBACiAJCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUKIAkJCQkiOiAlcygpIEhhcmR3YXJlIG11c3QgYmUgZGlzYWJsZWQgdG8gc2V0ICIKLQkJCQkiTWFjIGFkZHJlc3NcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJIk1hYyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FQlVTWTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKQEAgLTU3NSw3ICs1NzUsNyBAQAogCWlmIChzdGFydCA+IDB4MUZGRiB8fCBlbmQgPiAweDFGRkYgfHwgc3RhcnQgPiBlbmQpIHsKIAkJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCiAJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogJXMoJWQsICVkKSBSWEZJRk8gIgotCQkJCSJiYWQgcGFyYW1ldGVycyFcbiIsIF9fRlVOQ1RJT05fXywgc3RhcnQsIGVuZCk7CisJCQkJImJhZCBwYXJhbWV0ZXJzIVxuIiwgX19mdW5jX18sIHN0YXJ0LCBlbmQpOwogCQlyZXR1cm47CiAJfQogCS8qIHNldCByZWNlaXZlIGJ1ZmZlciBzdGFydCArIGVuZCAqLwpAQCAtNTkxLDcgKzU5MSw3IEBACiAJaWYgKHN0YXJ0ID4gMHgxRkZGIHx8IGVuZCA+IDB4MUZGRiB8fCBzdGFydCA+IGVuZCkgewogCQlpZiAobmV0aWZfbXNnX2Rydihwcml2KSkKIAkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlcyglZCwgJWQpIFRYRklGTyAiCi0JCQkJImJhZCBwYXJhbWV0ZXJzIVxuIiwgX19GVU5DVElPTl9fLCBzdGFydCwgZW5kKTsKKwkJCQkiYmFkIHBhcmFtZXRlcnMhXG4iLCBfX2Z1bmNfXywgc3RhcnQsIGVuZCk7CiAJCXJldHVybjsKIAl9CiAJLyogc2V0IHRyYW5zbWl0IGJ1ZmZlciBzdGFydCArIGVuZCAqLwpAQCAtNjMwLDcgKzYzMCw3IEBACiAJdTggcmVnOwogCiAJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCi0JCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzKCkgLSAlc1xuIiwgX19GVU5DVElPTl9fLAorCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIC0gJXNcbiIsIF9fZnVuY19fLAogCQkJcHJpdi0+ZnVsbF9kdXBsZXggPyAiRnVsbER1cGxleCIgOiAiSGFsZkR1cGxleCIpOwogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CkBAIC02NjEsNyArNjYxLDcgQEAKIAlpZiAocmVnID09IDB4MDAgfHwgcmVnID09IDB4ZmYpIHsKIAkJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpCiAJCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIEludmFsaWQgUmV2SWQgJWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCByZWcpOworCQkJCV9fZnVuY19fLCByZWcpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTcyNCw3ICs3MjQsNyBAQAogCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJaWYgKG5ldGlmX21zZ19odyhwcml2KSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlbmFibGluZyBpbnRlcnJ1cHRzLlxuIiwKLQkJCV9fRlVOQ1RJT05fXyk7CisJCQlfX2Z1bmNfXyk7CiAKIAllbmMyOGo2MF9waHlfd3JpdGUocHJpdiwgUEhJRSwgUEhJRV9QR0VJRSB8IFBISUVfUExOS0lFKTsKIApAQCAtODg4LDcgKzg4OCw3IEBACiAJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQogCQkJZGV2X2VycigmbmRldi0+ZGV2LAogCQkJCSIlcygpIEludmFsaWQgcGFja2V0IGFkZHJlc3MhISAweCUwNHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBwcml2LT5uZXh0X3BrX3B0cik7CisJCQkJX19mdW5jX18sIHByaXYtPm5leHRfcGtfcHRyKTsKIAkJLyogcGFja2V0IGFkZHJlc3MgY29ycnVwdGVkOiByZXNldCBSWCBsb2dpYyAqLwogCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKIAkJbm9sb2NrX3JlZ19iZmNscihwcml2LCBFQ09OMSwgRUNPTjFfUlhFTik7CkBAIC05MTcsNyArOTE3LDcgQEAKIAlyeHN0YXQgfD0gcnN2WzRdOwogCiAJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMocHJpdikpCi0JCWVuYzI4ajYwX2R1bXBfcnN2KHByaXYsIF9fRlVOQ1RJT05fXywgbmV4dF9wYWNrZXQsIGxlbiwgcnhzdGF0KTsKKwkJZW5jMjhqNjBfZHVtcF9yc3YocHJpdiwgX19mdW5jX18sIG5leHRfcGFja2V0LCBsZW4sIHJ4c3RhdCk7CiAKIAlpZiAoIVJTVl9HRVRCSVQocnhzdGF0LCBSU1ZfUlhPSykpIHsKIAkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCkBAIC05NDEsNyArOTQxLDcgQEAKIAkJCWVuYzI4ajYwX21lbV9yZWFkKHByaXYsIHByaXYtPm5leHRfcGtfcHRyICsgc2l6ZW9mKHJzdiksCiAJCQkJCWxlbiwgc2tiX3B1dChza2IsIGxlbikpOwogCQkJaWYgKG5ldGlmX21zZ19wa3RkYXRhKHByaXYpKQotCQkJCWR1bXBfcGFja2V0KF9fRlVOQ1RJT05fXywgc2tiLT5sZW4sIHNrYi0+ZGF0YSk7CisJCQkJZHVtcF9wYWNrZXQoX19mdW5jX18sIHNrYi0+bGVuLCBza2ItPmRhdGEpOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CiAJCQkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLwogCQkJbmRldi0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtOTU4LDcgKzk1OCw3IEBACiAJZXJ4cmRwdCA9IGVyeHJkcHRfd29ya2Fyb3VuZChuZXh0X3BhY2tldCwgUlhTVEFSVF9JTklULCBSWEVORF9JTklUKTsKIAlpZiAobmV0aWZfbXNnX2h3KHByaXYpKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIEVSWFJEUFQ6MHglMDR4XG4iLAotCQkJX19GVU5DVElPTl9fLCBlcnhyZHB0KTsKKwkJCV9fZnVuY19fLCBlcnhyZHB0KTsKIAogCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwogCW5vbG9ja19yZWd3X3dyaXRlKHByaXYsIEVSWFJEUFRMLCBlcnhyZHB0KTsKQEAgLTk2OCw3ICs5NjgsNyBAQAogCQlyZWcgPSBub2xvY2tfcmVnd19yZWFkKHByaXYsIEVSWFJEUFRMKTsKIAkJaWYgKHJlZyAhPSBlcnhyZHB0KQogCQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBFUlhSRFBUIHZlcmlmeSAiCi0JCQkJImVycm9yICgweCUwNHggLSAweCUwNHgpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJImVycm9yICgweCUwNHggLSAweCUwNHgpXG4iLCBfX2Z1bmNfXywKIAkJCQlyZWcsIGVyeHJkcHQpOwogCX0KICNlbmRpZgpAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAltdXRleF91bmxvY2soJnByaXYtPmxvY2spOwogCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHByaXYpKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGZyZWVfc3BhY2UgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgZnJlZV9zcGFjZSk7CisJCQlfX2Z1bmNfXywgZnJlZV9zcGFjZSk7CiAJcmV0dXJuIGZyZWVfc3BhY2U7CiB9CiAKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAJcmVnID0gZW5jMjhqNjBfcGh5X3JlYWQocHJpdiwgUEhTVEFUMik7CiAJaWYgKG5ldGlmX21zZ19odyhwcml2KSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBQSFNUQVQxOiAlMDR4LCAiCi0JCQkiUEhTVEFUMjogJTA0eFxuIiwgX19GVU5DVElPTl9fLAorCQkJIlBIU1RBVDI6ICUwNHhcbiIsIF9fZnVuY19fLAogCQkJZW5jMjhqNjBfcGh5X3JlYWQocHJpdiwgUEhTVEFUMSksIHJlZyk7CiAJZHVwbGV4ID0gcmVnICYgUEhTVEFUMl9EUFhTVEFUOwogCkBAIC0xMDk1LDcgKzEwOTUsNyBAQAogCWludCBpbnRmbGFncywgbG9vcDsKIAogCWlmIChuZXRpZl9tc2dfaW50cihwcml2KSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlbnRlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlbnRlclxuIiwgX19mdW5jX18pOwogCS8qIGRpc2FibGUgZnVydGhlciBpbnRlcnJ1cHRzICovCiAJbG9ja2VkX3JlZ19iZmNscihwcml2LCBFSUUsIEVJRV9JTlRJRSk7CiAKQEAgLTExOTgsNyArMTE5OCw3IEBACiAJLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KIAlsb2NrZWRfcmVnX2Jmc2V0KHByaXYsIEVJRSwgRUlFX0lOVElFKTsKIAlpZiAobmV0aWZfbXNnX2ludHIocHJpdikpCi0JCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6ICVzKCkgZXhpdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBleGl0XG4iLCBfX2Z1bmNfXyk7CiB9CiAKIC8qCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCQkJIjogVHggUGFja2V0IExlbjolZFxuIiwgcHJpdi0+dHhfc2tiLT5sZW4pOwogCiAJaWYgKG5ldGlmX21zZ19wa3RkYXRhKHByaXYpKQotCQlkdW1wX3BhY2tldChfX0ZVTkNUSU9OX18sCisJCWR1bXBfcGFja2V0KF9fZnVuY19fLAogCQkJICAgIHByaXYtPnR4X3NrYi0+bGVuLCBwcml2LT50eF9za2ItPmRhdGEpOwogCWVuYzI4ajYwX3BhY2tldF93cml0ZShwcml2LCBwcml2LT50eF9za2ItPmxlbiwgcHJpdi0+dHhfc2tiLT5kYXRhKTsKIApAQCAtMTI1NCw3ICsxMjU0LDcgQEAKIAlzdHJ1Y3QgZW5jMjhqNjBfbmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKHByaXYpKQotCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBJZiBzb21lIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gdHJhbnNtaXQgdGhpcwogCSAqIHBhY2tldCwgeW91IHNob3VsZCByZXR1cm4gJzEnIGZyb20gdGhpcyBmdW5jdGlvbi4KQEAgLTEzMjUsNyArMTMyNSw3IEBACiAJc3RydWN0IGVuYzI4ajYwX25ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAobmV0aWZfbXNnX2Rydihwcml2KSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlbnRlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIjogJXMoKSBlbnRlclxuIiwgX19mdW5jX18pOwogCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CiAJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkgewpAQCAtMTM2Myw3ICsxMzYzLDcgQEAKIAlzdHJ1Y3QgZW5jMjhqNjBfbmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQotCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpIGVudGVyXG4iLCBfX2Z1bmNfXyk7CiAKIAllbmMyOGo2MF9od19kaXNhYmxlKHByaXYpOwogCWVuYzI4ajYwX2xvd3Bvd2VyKHByaXYsIHRydWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2VuaWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxYzNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmotJChDT05GSUdfRU5JQykgOj0gZW5pYy5vCisKK2VuaWMteSA6PSBlbmljX21haW4ubyB2bmljX2NxLm8gdm5pY19pbnRyLm8gdm5pY193cS5vIFwKKwllbmljX3Jlcy5vIHZuaWNfZGV2Lm8gdm5pY19ycS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvY3FfZGVzYy5oIGIvZHJpdmVycy9uZXQvZW5pYy9jcV9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzNmE4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvY3FfZGVzYy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9DUV9ERVNDX0hfCisjZGVmaW5lIF9DUV9ERVNDX0hfCisKKy8qCisgKiBDb21wbGV0aW9uIHF1ZXVlIGRlc2NyaXB0b3IgdHlwZXMKKyAqLworZW51bSBjcV9kZXNjX3R5cGVzIHsKKwlDUV9ERVNDX1RZUEVfV1FfRU5FVCA9IDAsCisJQ1FfREVTQ19UWVBFX0RFU0NfQ09QWSA9IDEsCisJQ1FfREVTQ19UWVBFX1dRX0VYQ0ggPSAyLAorCUNRX0RFU0NfVFlQRV9SUV9FTkVUID0gMywKKwlDUV9ERVNDX1RZUEVfUlFfRkNQID0gNCwKK307CisKKy8qIENvbXBsZXRpb24gcXVldWUgZGVzY3JpcHRvcjogMTZCCisgKgorICogQWxsIGNvbXBsZXRpb24gcXVldWVzIGhhdmUgdGhpcyBiYXNpYyBsYXlvdXQuICBUaGUKKyAqIHR5cGVfc3BlY2ZpYyBhcmVhIGlzIHVuaXF1ZSBmb3IgZWFjaCBjb21wbGV0aW9uCisgKiBxdWV1ZSB0eXBlLgorICovCitzdHJ1Y3QgY3FfZGVzYyB7CisJX19sZTE2IGNvbXBsZXRlZF9pbmRleDsKKwlfX2xlMTYgcV9udW1iZXI7CisJdTggdHlwZV9zcGVjZmljWzExXTsKKwl1OCB0eXBlX2NvbG9yOworfTsKKworI2RlZmluZSBDUV9ERVNDX1RZUEVfQklUUyAgICAgICAgNworI2RlZmluZSBDUV9ERVNDX1RZUEVfTUFTSyAgICAgICAgKCgxIDw8IENRX0RFU0NfVFlQRV9CSVRTKSAtIDEpCisjZGVmaW5lIENRX0RFU0NfQ09MT1JfTUFTSyAgICAgICAxCisjZGVmaW5lIENRX0RFU0NfUV9OVU1fQklUUyAgICAgICAxMAorI2RlZmluZSBDUV9ERVNDX1FfTlVNX01BU0sgICAgICAgKCgxIDw8IENRX0RFU0NfUV9OVU1fQklUUykgLSAxKQorI2RlZmluZSBDUV9ERVNDX0NPTVBfTkRYX0JJVFMgICAgMTIKKyNkZWZpbmUgQ1FfREVTQ19DT01QX05EWF9NQVNLICAgICgoMSA8PCBDUV9ERVNDX0NPTVBfTkRYX0JJVFMpIC0gMSkKKworc3RhdGljIGlubGluZSB2b2lkIGNxX2Rlc2NfZGVjKGNvbnN0IHN0cnVjdCBjcV9kZXNjICpkZXNjX2FyZywKKwl1OCAqdHlwZSwgdTggKmNvbG9yLCB1MTYgKnFfbnVtYmVyLCB1MTYgKmNvbXBsZXRlZF9pbmRleCkKK3sKKwljb25zdCBzdHJ1Y3QgY3FfZGVzYyAqZGVzYyA9IGRlc2NfYXJnOworCWNvbnN0IHU4IHR5cGVfY29sb3IgPSBkZXNjLT50eXBlX2NvbG9yOworCisJKmNvbG9yID0gKHR5cGVfY29sb3IgPj4gQ1FfREVTQ19UWVBFX0JJVFMpICYgQ1FfREVTQ19DT0xPUl9NQVNLOworCisJLyoKKwkgKiBNYWtlIHN1cmUgY29sb3IgYml0IGlzIHJlYWQgZnJvbSBkZXNjICpiZWZvcmUqIG90aGVyIGZpZWxkcworCSAqIGFyZSByZWFkIGZyb20gZGVzYy4gIEhhcmR3YXJlIGd1YXJhbnRlZXMgY29sb3IgYml0IGlzIGxhc3QKKwkgKiBiaXQgKGJ5dGUpIHdyaXR0ZW4uICBBZGRpbmcgdGhlIHJtYigpIHByZXZlbnRzIHRoZSBjb21waWxlcgorCSAqIGFuZC9vciBDUFUgZnJvbSByZW9yZGVyaW5nIHRoZSByZWFkcyB3aGljaCB3b3VsZCBwb3RlbnRpYWxseQorCSAqIHJlc3VsdCBpbiByZWFkaW5nIHN0YWxlIHZhbHVlcy4KKwkgKi8KKworCXJtYigpOworCisJKnR5cGUgPSB0eXBlX2NvbG9yICYgQ1FfREVTQ19UWVBFX01BU0s7CisJKnFfbnVtYmVyID0gbGUxNl90b19jcHUoZGVzYy0+cV9udW1iZXIpICYgQ1FfREVTQ19RX05VTV9NQVNLOworCSpjb21wbGV0ZWRfaW5kZXggPSBsZTE2X3RvX2NwdShkZXNjLT5jb21wbGV0ZWRfaW5kZXgpICYKKwkJQ1FfREVTQ19DT01QX05EWF9NQVNLOworfQorCisjZW5kaWYgLyogX0NRX0RFU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvY3FfZW5ldF9kZXNjLmggYi9kcml2ZXJzL25ldC9lbmljL2NxX2VuZXRfZGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZGNlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL2NxX2VuZXRfZGVzYy5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfQ1FfRU5FVF9ERVNDX0hfCisjZGVmaW5lIF9DUV9FTkVUX0RFU0NfSF8KKworI2luY2x1ZGUgImNxX2Rlc2MuaCIKKworLyogRXRoZXJuZXQgY29tcGxldGlvbiBxdWV1ZSBkZXNjcmlwdG9yOiAxNkIgKi8KK3N0cnVjdCBjcV9lbmV0X3dxX2Rlc2MgeworCV9fbGUxNiBjb21wbGV0ZWRfaW5kZXg7CisJX19sZTE2IHFfbnVtYmVyOworCXU4IHJlc2VydmVkWzExXTsKKwl1OCB0eXBlX2NvbG9yOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNxX2VuZXRfd3FfZGVzY19kZWMoc3RydWN0IGNxX2VuZXRfd3FfZGVzYyAqZGVzYywKKwl1OCAqdHlwZSwgdTggKmNvbG9yLCB1MTYgKnFfbnVtYmVyLCB1MTYgKmNvbXBsZXRlZF9pbmRleCkKK3sKKwljcV9kZXNjX2RlYygoc3RydWN0IGNxX2Rlc2MgKilkZXNjLCB0eXBlLAorCQljb2xvciwgcV9udW1iZXIsIGNvbXBsZXRlZF9pbmRleCk7Cit9CisKKy8qIENvbXBsZXRpb24gcXVldWUgZGVzY3JpcHRvcjogRXRoZXJuZXQgcmVjZWl2ZSBxdWV1ZSwgMTZCICovCitzdHJ1Y3QgY3FfZW5ldF9ycV9kZXNjIHsKKwlfX2xlMTYgY29tcGxldGVkX2luZGV4X2ZsYWdzOworCV9fbGUxNiBxX251bWJlcl9yc3NfdHlwZV9mbGFnczsKKwlfX2xlMzIgcnNzX2hhc2g7CisJX19sZTE2IGJ5dGVzX3dyaXR0ZW5fZmxhZ3M7CisJX19sZTE2IHZsYW47CisJX19sZTE2IGNoZWNrc3VtX2Zjb2U7CisJdTggZmxhZ3M7CisJdTggdHlwZV9jb2xvcjsKK307CisKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0lOR1JFU1NfUE9SVCAgICAgICAgICAoMHgxIDw8IDEyKQorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfRkNPRSAgICAgICAgICAgICAgICAgICgweDEgPDwgMTMpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19FT1AgICAgICAgICAgICAgICAgICAgKDB4MSA8PCAxNCkKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1NPUCAgICAgICAgICAgICAgICAgICAoMHgxIDw8IDE1KQorCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19SU1NfVFlQRV9CSVRTICAgICAgICAgICAgICAgNAorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfUlNTX1RZUEVfTUFTSyBcCisJKCgxIDw8IENRX0VORVRfUlFfREVTQ19SU1NfVFlQRV9CSVRTKSAtIDEpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19SU1NfVFlQRV9OT05FICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfUlNTX1RZUEVfSVB2NCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX1JTU19UWVBFX1RDUF9JUHY0ICAgICAgICAgICAyCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19SU1NfVFlQRV9JUHY2ICAgICAgICAgICAgICAgMworI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfUlNTX1RZUEVfVENQX0lQdjYgICAgICAgICAgIDQKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX1JTU19UWVBFX0lQdjZfRVggICAgICAgICAgICA1CisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19SU1NfVFlQRV9UQ1BfSVB2Nl9FWCAgICAgICAgNgorCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19DU1VNX05PVF9DQUxDICAgICAgICAgKDB4MSA8PCAxNCkKKworI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfQllURVNfV1JJVFRFTl9CSVRTICAgICAgICAgIDE0CisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19CWVRFU19XUklUVEVOX01BU0sgXAorCSgoMSA8PCBDUV9FTkVUX1JRX0RFU0NfQllURVNfV1JJVFRFTl9CSVRTKSAtIDEpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19UUlVOQ0FURUQgICAgICAgICAgICAgKDB4MSA8PCAxNCkKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1ZMQU5fU1RSSVBQRUQgICAgICAgICAoMHgxIDw8IDE1KQorCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX1NPRl9CSVRTICAgICAgICAgICAgICAgNAorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkNPRV9TT0ZfTUFTSyBcCisJKCgxIDw8IENRX0VORVRfUlFfREVTQ19GQ09FX1NPRl9CSVRTKSAtIDEpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX0VPRl9CSVRTICAgICAgICAgICAgICAgOAorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkNPRV9FT0ZfTUFTSyBcCisJKCgxIDw8IENRX0VORVRfUlFfREVTQ19GQ09FX0VPRl9CSVRTKSAtIDEpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX0VPRl9TSElGVCAgICAgICAgICAgICAgOAorCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19UQ1BfVURQX0NTVU1fT0sgICAgICAgKDB4MSA8PCAwKQorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkNPRV9GQ19DUkNfT0sgICAgICAgICAgICAgICgweDEgPDwgMCkKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1VEUCAgICAgICAgICAgICAgICAgICAoMHgxIDw8IDEpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GQ09FX0VOQ19FUlJPUiAgICAgICAgICAgICAgKDB4MSA8PCAxKQorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfVENQICAgICAgICAgICAgICAgICAgICgweDEgPDwgMikKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0lQVjRfQ1NVTV9PSyAgICAgICAgICAoMHgxIDw8IDMpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19JUFY2ICAgICAgICAgICAgICAgICAgKDB4MSA8PCA0KQorI2RlZmluZSBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfSVBWNCAgICAgICAgICAgICAgICAgICgweDEgPDwgNSkKKyNkZWZpbmUgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0lQVjRfRlJBR01FTlQgICAgICAgICAoMHgxIDw8IDYpCisjZGVmaW5lIENRX0VORVRfUlFfREVTQ19GTEFHU19GQ1NfT0sgICAgICAgICAgICAgICAgKDB4MSA8PCA3KQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3FfZW5ldF9ycV9kZXNjX2RlYyhzdHJ1Y3QgY3FfZW5ldF9ycV9kZXNjICpkZXNjLAorCXU4ICp0eXBlLCB1OCAqY29sb3IsIHUxNiAqcV9udW1iZXIsIHUxNiAqY29tcGxldGVkX2luZGV4LAorCXU4ICppbmdyZXNzX3BvcnQsIHU4ICpmY29lLCB1OCAqZW9wLCB1OCAqc29wLCB1OCAqcnNzX3R5cGUsCisJdTggKmNzdW1fbm90X2NhbGMsIHUzMiAqcnNzX2hhc2gsIHUxNiAqYnl0ZXNfd3JpdHRlbiwgdTggKnBhY2tldF9lcnJvciwKKwl1OCAqdmxhbl9zdHJpcHBlZCwgdTE2ICp2bGFuLCB1MTYgKmNoZWNrc3VtLCB1OCAqZmNvZV9zb2YsCisJdTggKmZjb2VfZmNfY3JjX29rLCB1OCAqZmNvZV9lbmNfZXJyb3IsIHU4ICpmY29lX2VvZiwKKwl1OCAqdGNwX3VkcF9jc3VtX29rLCB1OCAqdWRwLCB1OCAqdGNwLCB1OCAqaXB2NF9jc3VtX29rLAorCXU4ICppcHY2LCB1OCAqaXB2NCwgdTggKmlwdjRfZnJhZ21lbnQsIHU4ICpmY3Nfb2spCit7CisJdTE2IGNvbXBsZXRlZF9pbmRleF9mbGFncyA9IGxlMTZfdG9fY3B1KGRlc2MtPmNvbXBsZXRlZF9pbmRleF9mbGFncyk7CisJdTE2IHFfbnVtYmVyX3Jzc190eXBlX2ZsYWdzID0KKwkJbGUxNl90b19jcHUoZGVzYy0+cV9udW1iZXJfcnNzX3R5cGVfZmxhZ3MpOworCXUxNiBieXRlc193cml0dGVuX2ZsYWdzID0gbGUxNl90b19jcHUoZGVzYy0+Ynl0ZXNfd3JpdHRlbl9mbGFncyk7CisKKwljcV9kZXNjX2RlYygoc3RydWN0IGNxX2Rlc2MgKilkZXNjLCB0eXBlLAorCQljb2xvciwgcV9udW1iZXIsIGNvbXBsZXRlZF9pbmRleCk7CisKKwkqaW5ncmVzc19wb3J0ID0gKGNvbXBsZXRlZF9pbmRleF9mbGFncyAmCisJCUNRX0VORVRfUlFfREVTQ19GTEFHU19JTkdSRVNTX1BPUlQpID8gMSA6IDA7CisJKmZjb2UgPSAoY29tcGxldGVkX2luZGV4X2ZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0ZDT0UpID8KKwkJMSA6IDA7CisJKmVvcCA9IChjb21wbGV0ZWRfaW5kZXhfZmxhZ3MgJiBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfRU9QKSA/CisJCTEgOiAwOworCSpzb3AgPSAoY29tcGxldGVkX2luZGV4X2ZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1NPUCkgPworCQkxIDogMDsKKworCSpyc3NfdHlwZSA9ICh1OCkoKHFfbnVtYmVyX3Jzc190eXBlX2ZsYWdzID4+IENRX0RFU0NfUV9OVU1fQklUUykgJgorCQlDUV9FTkVUX1JRX0RFU0NfUlNTX1RZUEVfTUFTSyk7CisJKmNzdW1fbm90X2NhbGMgPSAocV9udW1iZXJfcnNzX3R5cGVfZmxhZ3MgJgorCQlDUV9FTkVUX1JRX0RFU0NfRkxBR1NfQ1NVTV9OT1RfQ0FMQykgPyAxIDogMDsKKworCSpyc3NfaGFzaCA9IGxlMzJfdG9fY3B1KGRlc2MtPnJzc19oYXNoKTsKKworCSpieXRlc193cml0dGVuID0gYnl0ZXNfd3JpdHRlbl9mbGFncyAmCisJCUNRX0VORVRfUlFfREVTQ19CWVRFU19XUklUVEVOX01BU0s7CisJKnBhY2tldF9lcnJvciA9IChieXRlc193cml0dGVuX2ZsYWdzICYKKwkJQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1RSVU5DQVRFRCkgPyAxIDogMDsKKwkqdmxhbl9zdHJpcHBlZCA9IChieXRlc193cml0dGVuX2ZsYWdzICYKKwkJQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1ZMQU5fU1RSSVBQRUQpID8gMSA6IDA7CisKKwkqdmxhbiA9IGxlMTZfdG9fY3B1KGRlc2MtPnZsYW4pOworCisJaWYgKCpmY29lKSB7CisJCSpmY29lX3NvZiA9ICh1OCkobGUxNl90b19jcHUoZGVzYy0+Y2hlY2tzdW1fZmNvZSkgJgorCQkJQ1FfRU5FVF9SUV9ERVNDX0ZDT0VfU09GX01BU0spOworCQkqZmNvZV9mY19jcmNfb2sgPSAoZGVzYy0+ZmxhZ3MgJgorCQkJQ1FfRU5FVF9SUV9ERVNDX0ZDT0VfRkNfQ1JDX09LKSA/IDEgOiAwOworCQkqZmNvZV9lbmNfZXJyb3IgPSAoZGVzYy0+ZmxhZ3MgJgorCQkJQ1FfRU5FVF9SUV9ERVNDX0ZDT0VfRU5DX0VSUk9SKSA/IDEgOiAwOworCQkqZmNvZV9lb2YgPSAodTgpKChkZXNjLT5jaGVja3N1bV9mY29lID4+CisJCQlDUV9FTkVUX1JRX0RFU0NfRkNPRV9FT0ZfU0hJRlQpICYKKwkJCUNRX0VORVRfUlFfREVTQ19GQ09FX0VPRl9NQVNLKTsKKwkJKmNoZWNrc3VtID0gMDsKKwl9IGVsc2UgeworCQkqZmNvZV9zb2YgPSAwOworCQkqZmNvZV9mY19jcmNfb2sgPSAwOworCQkqZmNvZV9lbmNfZXJyb3IgPSAwOworCQkqZmNvZV9lb2YgPSAwOworCQkqY2hlY2tzdW0gPSBsZTE2X3RvX2NwdShkZXNjLT5jaGVja3N1bV9mY29lKTsKKwl9CisKKwkqdGNwX3VkcF9jc3VtX29rID0KKwkJKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1RDUF9VRFBfQ1NVTV9PSykgPyAxIDogMDsKKwkqdWRwID0gKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1VEUCkgPyAxIDogMDsKKwkqdGNwID0gKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX1RDUCkgPyAxIDogMDsKKwkqaXB2NF9jc3VtX29rID0KKwkJKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0lQVjRfQ1NVTV9PSykgPyAxIDogMDsKKwkqaXB2NiA9IChkZXNjLT5mbGFncyAmIENRX0VORVRfUlFfREVTQ19GTEFHU19JUFY2KSA/IDEgOiAwOworCSppcHY0ID0gKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0lQVjQpID8gMSA6IDA7CisJKmlwdjRfZnJhZ21lbnQgPQorCQkoZGVzYy0+ZmxhZ3MgJiBDUV9FTkVUX1JRX0RFU0NfRkxBR1NfSVBWNF9GUkFHTUVOVCkgPyAxIDogMDsKKwkqZmNzX29rID0gKGRlc2MtPmZsYWdzICYgQ1FfRU5FVF9SUV9ERVNDX0ZMQUdTX0ZDU19PSykgPyAxIDogMDsKK30KKworI2VuZGlmIC8qIF9DUV9FTkVUX0RFU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvZW5pYy5oIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2NzdlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pYy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfRU5JQ19IXworI2RlZmluZSBfRU5JQ19IXworCisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKworI2luY2x1ZGUgInZuaWNfZW5ldC5oIgorI2luY2x1ZGUgInZuaWNfZGV2LmgiCisjaW5jbHVkZSAidm5pY193cS5oIgorI2luY2x1ZGUgInZuaWNfcnEuaCIKKyNpbmNsdWRlICJ2bmljX2NxLmgiCisjaW5jbHVkZSAidm5pY19pbnRyLmgiCisjaW5jbHVkZSAidm5pY19zdGF0cy5oIgorI2luY2x1ZGUgInZuaWNfcnNzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJCSJlbmljIgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JCSJDaXNjbyAxMEcgRXRoZXJuZXQgRHJpdmVyIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuMC4xLTE4MTYzLjQ3Mi1rMSIKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJIkNvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYyIKKyNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgorCisjZGVmaW5lIEVOSUNfTFJPX01BWF9ERVNDCTgKKyNkZWZpbmUgRU5JQ19MUk9fTUFYX0FHR1IJNjQKKworZW51bSBlbmljX2NxX2luZGV4IHsKKwlFTklDX0NRX1JRLAorCUVOSUNfQ1FfV1EsCisJRU5JQ19DUV9NQVgsCit9OworCitlbnVtIGVuaWNfaW50eF9pbnRyX2luZGV4IHsKKwlFTklDX0lOVFhfV1FfUlEsCisJRU5JQ19JTlRYX0VSUiwKKwlFTklDX0lOVFhfTk9USUZZLAorCUVOSUNfSU5UWF9NQVgsCit9OworCitlbnVtIGVuaWNfbXNpeF9pbnRyX2luZGV4IHsKKwlFTklDX01TSVhfUlEsCisJRU5JQ19NU0lYX1dRLAorCUVOSUNfTVNJWF9FUlIsCisJRU5JQ19NU0lYX05PVElGWSwKKwlFTklDX01TSVhfTUFYLAorfTsKKworc3RydWN0IGVuaWNfbXNpeF9lbnRyeSB7CisJaW50IHJlcXVlc3RlZDsKKwljaGFyIGRldm5hbWVbSUZOQU1TSVpdOworCWlycXJldHVybl90ICgqaXNyKShpbnQsIHZvaWQgKik7CisJdm9pZCAqZGV2aWQ7Cit9OworCisvKiBQZXItaW5zdGFuY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGVuaWMgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IHZuaWNfZW5ldF9jb25maWcgY29uZmlnOworCXN0cnVjdCB2bmljX2Rldl9iYXIgYmFyMDsKKwlzdHJ1Y3Qgdm5pY19kZXYgKnZkZXY7CisJc3RydWN0IHRpbWVyX2xpc3Qgbm90aWZ5X3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldDsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJ5W0VOSUNfTVNJWF9NQVhdOworCXN0cnVjdCBlbmljX21zaXhfZW50cnkgbXNpeFtFTklDX01TSVhfTUFYXTsKKwl1MzIgbXNnX2VuYWJsZTsKKwlzcGlubG9ja190IGRldmNtZF9sb2NrOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBtY19hZGRyW0VOSUNfTVVMVElDQVNUX1BFUkZFQ1RfRklMVEVSU11bRVRIX0FMRU5dOworCXVuc2lnbmVkIGludCBtY19jb3VudDsKKwlpbnQgY3N1bV9yeF9lbmFibGVkOworCXUzMiBwb3J0X210dTsKKworCS8qIHdvcmsgcXVldWUgY2FjaGUgbGluZSBzZWN0aW9uICovCisJX19fX2NhY2hlbGluZV9hbGlnbmVkIHN0cnVjdCB2bmljX3dxIHdxWzFdOworCXNwaW5sb2NrX3Qgd3FfbG9ja1sxXTsKKwl1bnNpZ25lZCBpbnQgd3FfY291bnQ7CisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsYW5fZ3JvdXA7CisKKwkvKiByZWNlaXZlIHF1ZXVlIGNhY2hlIGxpbmUgc2VjdGlvbiAqLworCV9fX19jYWNoZWxpbmVfYWxpZ25lZCBzdHJ1Y3Qgdm5pY19ycSBycVsxXTsKKwl1bnNpZ25lZCBpbnQgcnFfY291bnQ7CisJaW50ICgqcnFfYWxsb2NfYnVmKShzdHJ1Y3Qgdm5pY19ycSAqcnEpOworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXN0cnVjdCBuZXRfbHJvX21nciBscm9fbWdyOworCXN0cnVjdCBuZXRfbHJvX2Rlc2MgbHJvX2Rlc2NbRU5JQ19MUk9fTUFYX0RFU0NdOworCisJLyogaW50ZXJydXB0IHJlc291cmNlIGNhY2hlIGxpbmUgc2VjdGlvbiAqLworCV9fX19jYWNoZWxpbmVfYWxpZ25lZCBzdHJ1Y3Qgdm5pY19pbnRyIGludHJbRU5JQ19NU0lYX01BWF07CisJdW5zaWduZWQgaW50IGludHJfY291bnQ7CisJdTMyIF9faW9tZW0gKmxlZ2FjeV9wYmE7CQkvKiBtZW1vcnktbWFwcGVkICovCisKKwkvKiBjb21wbGV0aW9uIHF1ZXVlIGNhY2hlIGxpbmUgc2VjdGlvbiAqLworCV9fX19jYWNoZWxpbmVfYWxpZ25lZCBzdHJ1Y3Qgdm5pY19jcSBjcVtFTklDX0NRX01BWF07CisJdW5zaWduZWQgaW50IGNxX2NvdW50OworfTsKKworI2VuZGlmIC8qIF9FTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBlOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYwpAQCAtMCwwICsxLDE5MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgImNxX2VuZXRfZGVzYy5oIgorI2luY2x1ZGUgInZuaWNfZGV2LmgiCisjaW5jbHVkZSAidm5pY19pbnRyLmgiCisjaW5jbHVkZSAidm5pY19zdGF0cy5oIgorI2luY2x1ZGUgImVuaWNfcmVzLmgiCisjaW5jbHVkZSAiZW5pYy5oIgorCisjZGVmaW5lIEVOSUNfTk9USUZZX1RJTUVSX1BFUklPRAkoMiAqIEhaKQorCisvKiBTdXBwb3J0ZWQgZGV2aWNlcyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVuaWNfaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9WREVWSUNFKENJU0NPLCAweDAwNDMpIH0sCisJeyAwLCB9CS8qIGVuZCBvZiB0YWJsZSAqLworfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfQVVUSE9SKCJTY290dCBGZWxkbWFuIDxzY29mZWxkbUBjaXNjby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZW5pY19pZF90YWJsZSk7CisKK3N0cnVjdCBlbmljX3N0YXQgeworCWNoYXIgbmFtZVtFVEhfR1NUUklOR19MRU5dOworCXVuc2lnbmVkIGludCBvZmZzZXQ7Cit9OworCisjZGVmaW5lIEVOSUNfVFhfU1RBVChzdGF0KQlcCisJeyAubmFtZSA9ICNzdGF0LCAub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHZuaWNfdHhfc3RhdHMsIHN0YXQpIC8gOCB9CisjZGVmaW5lIEVOSUNfUlhfU1RBVChzdGF0KQlcCisJeyAubmFtZSA9ICNzdGF0LCAub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHZuaWNfcnhfc3RhdHMsIHN0YXQpIC8gOCB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5pY19zdGF0IGVuaWNfdHhfc3RhdHNbXSA9IHsKKwlFTklDX1RYX1NUQVQodHhfZnJhbWVzX29rKSwKKwlFTklDX1RYX1NUQVQodHhfdW5pY2FzdF9mcmFtZXNfb2spLAorCUVOSUNfVFhfU1RBVCh0eF9tdWx0aWNhc3RfZnJhbWVzX29rKSwKKwlFTklDX1RYX1NUQVQodHhfYnJvYWRjYXN0X2ZyYW1lc19vayksCisJRU5JQ19UWF9TVEFUKHR4X2J5dGVzX29rKSwKKwlFTklDX1RYX1NUQVQodHhfdW5pY2FzdF9ieXRlc19vayksCisJRU5JQ19UWF9TVEFUKHR4X211bHRpY2FzdF9ieXRlc19vayksCisJRU5JQ19UWF9TVEFUKHR4X2Jyb2FkY2FzdF9ieXRlc19vayksCisJRU5JQ19UWF9TVEFUKHR4X2Ryb3BzKSwKKwlFTklDX1RYX1NUQVQodHhfZXJyb3JzKSwKKwlFTklDX1RYX1NUQVQodHhfdHNvKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5pY19zdGF0IGVuaWNfcnhfc3RhdHNbXSA9IHsKKwlFTklDX1JYX1NUQVQocnhfZnJhbWVzX29rKSwKKwlFTklDX1JYX1NUQVQocnhfZnJhbWVzX3RvdGFsKSwKKwlFTklDX1JYX1NUQVQocnhfdW5pY2FzdF9mcmFtZXNfb2spLAorCUVOSUNfUlhfU1RBVChyeF9tdWx0aWNhc3RfZnJhbWVzX29rKSwKKwlFTklDX1JYX1NUQVQocnhfYnJvYWRjYXN0X2ZyYW1lc19vayksCisJRU5JQ19SWF9TVEFUKHJ4X2J5dGVzX29rKSwKKwlFTklDX1JYX1NUQVQocnhfdW5pY2FzdF9ieXRlc19vayksCisJRU5JQ19SWF9TVEFUKHJ4X211bHRpY2FzdF9ieXRlc19vayksCisJRU5JQ19SWF9TVEFUKHJ4X2Jyb2FkY2FzdF9ieXRlc19vayksCisJRU5JQ19SWF9TVEFUKHJ4X2Ryb3ApLAorCUVOSUNfUlhfU1RBVChyeF9ub19idWZzKSwKKwlFTklDX1JYX1NUQVQocnhfZXJyb3JzKSwKKwlFTklDX1JYX1NUQVQocnhfcnNzKSwKKwlFTklDX1JYX1NUQVQocnhfY3JjX2Vycm9ycyksCisJRU5JQ19SWF9TVEFUKHJ4X2ZyYW1lc182NCksCisJRU5JQ19SWF9TVEFUKHJ4X2ZyYW1lc18xMjcpLAorCUVOSUNfUlhfU1RBVChyeF9mcmFtZXNfMjU1KSwKKwlFTklDX1JYX1NUQVQocnhfZnJhbWVzXzUxMSksCisJRU5JQ19SWF9TVEFUKHJ4X2ZyYW1lc18xMDIzKSwKKwlFTklDX1JYX1NUQVQocnhfZnJhbWVzXzE1MTgpLAorCUVOSUNfUlhfU1RBVChyeF9mcmFtZXNfdG9fbWF4KSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5pY19uX3R4X3N0YXRzID0gQVJSQVlfU0laRShlbmljX3R4X3N0YXRzKTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5pY19uX3J4X3N0YXRzID0gQVJSQVlfU0laRShlbmljX3J4X3N0YXRzKTsKKworc3RhdGljIGludCBlbmljX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwllY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9GSUJSRSk7CisJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEX0ZJQlJFKTsKKwllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWVjbWQtPnNwZWVkID0gdm5pY19kZXZfcG9ydF9zcGVlZChlbmljLT52ZGV2KTsKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3BlZWQgPSAtMTsKKwkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJfQorCisJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmljX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKmZ3X2luZm87CisKKwlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwl2bmljX2Rldl9md19pbmZvKGVuaWMtPnZkZXYsICZmd19pbmZvKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGZ3X2luZm8tPmZ3X3ZlcnNpb24sCisJCXNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSk7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZW5pYy0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgdm9pZCBlbmljX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IGVuaWNfbl90eF9zdGF0czsgaSsrKSB7CisJCQltZW1jcHkoZGF0YSwgZW5pY190eF9zdGF0c1tpXS5uYW1lLCBFVEhfR1NUUklOR19MRU4pOworCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGVuaWNfbl9yeF9zdGF0czsgaSsrKSB7CisJCQltZW1jcHkoZGF0YSwgZW5pY19yeF9zdGF0c1tpXS5uYW1lLCBFVEhfR1NUUklOR19MRU4pOworCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGVuaWNfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCit7CisJc3dpdGNoIChzc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBlbmljX25fdHhfc3RhdHMgKyBlbmljX25fcnhfc3RhdHM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHZvaWQgZW5pY19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgdm5pY19zdGF0cyAqdnN0YXRzOworCXVuc2lnbmVkIGludCBpOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisJdm5pY19kZXZfc3RhdHNfZHVtcChlbmljLT52ZGV2LCAmdnN0YXRzKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGVuaWNfbl90eF9zdGF0czsgaSsrKQorCQkqKGRhdGErKykgPSAoKHU2NCAqKSZ2c3RhdHMtPnR4KVtlbmljX3R4X3N0YXRzW2ldLm9mZnNldF07CisJZm9yIChpID0gMDsgaSA8IGVuaWNfbl9yeF9zdGF0czsgaSsrKQorCQkqKGRhdGErKykgPSAoKHU2NCAqKSZ2c3RhdHMtPnJ4KVtlbmljX3J4X3N0YXRzW2ldLm9mZnNldF07Cit9CisKK3N0YXRpYyB1MzIgZW5pY19nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gZW5pYy0+Y3N1bV9yeF9lbmFibGVkOworfQorCitzdGF0aWMgaW50IGVuaWNfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGRhdGEgJiYgIUVOSUNfU0VUVElORyhlbmljLCBSWENTVU0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVuaWMtPmNzdW1fcnhfZW5hYmxlZCA9ICEhZGF0YTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuaWNfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGRhdGEgJiYgIUVOSUNfU0VUVElORyhlbmljLCBUWENTVU0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYXRhKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKKwllbHNlCisJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfQ1NVTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuaWNfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoZGF0YSAmJiAhRU5JQ19TRVRUSU5HKGVuaWMsIFRTTykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGEpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0KKwkJCU5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9UU09fRUNOOworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPQorCQkJfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNiB8IE5FVElGX0ZfVFNPX0VDTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlbmljX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gZW5pYy0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZW5pY19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwllbmljLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZW5pY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZW5pY19nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZW5pY19nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsID0gZW5pY19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IGVuaWNfc2V0X21zZ2xldmVsLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9zdHJpbmdzID0gZW5pY19nZXRfc3RyaW5ncywKKwkuZ2V0X3NzZXRfY291bnQgPSBlbmljX2dldF9zc2V0X2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGVuaWNfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9yeF9jc3VtID0gZW5pY19nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBlbmljX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gZW5pY19zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfdHNvID0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvID0gZW5pY19zZXRfdHNvLAorfTsKKworc3RhdGljIHZvaWQgZW5pY19mcmVlX3dxX2J1ZihzdHJ1Y3Qgdm5pY193cSAqd3EsIHN0cnVjdCB2bmljX3dxX2J1ZiAqYnVmKQoreworCXN0cnVjdCBlbmljICplbmljID0gdm5pY19kZXZfcHJpdih3cS0+dmRldik7CisKKwlpZiAoYnVmLT5zb3ApCisJCXBjaV91bm1hcF9zaW5nbGUoZW5pYy0+cGRldiwgYnVmLT5kbWFfYWRkciwKKwkJCWJ1Zi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwllbHNlCisJCXBjaV91bm1hcF9wYWdlKGVuaWMtPnBkZXYsIGJ1Zi0+ZG1hX2FkZHIsCisJCQlidWYtPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlpZiAoYnVmLT5vc19idWYpCisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zi0+b3NfYnVmKTsKK30KKworc3RhdGljIHZvaWQgZW5pY193cV9mcmVlX2J1ZihzdHJ1Y3Qgdm5pY193cSAqd3EsCisJc3RydWN0IGNxX2Rlc2MgKmNxX2Rlc2MsIHN0cnVjdCB2bmljX3dxX2J1ZiAqYnVmLCB2b2lkICpvcGFxdWUpCit7CisJZW5pY19mcmVlX3dxX2J1Zih3cSwgYnVmKTsKK30KKworc3RhdGljIGludCBlbmljX3dxX3NlcnZpY2Uoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3QgY3FfZGVzYyAqY3FfZGVzYywKKwl1OCB0eXBlLCB1MTYgcV9udW1iZXIsIHUxNiBjb21wbGV0ZWRfaW5kZXgsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYodmRldik7CisKKwlzcGluX2xvY2soJmVuaWMtPndxX2xvY2tbcV9udW1iZXJdKTsKKworCXZuaWNfd3Ffc2VydmljZSgmZW5pYy0+d3FbcV9udW1iZXJdLCBjcV9kZXNjLAorCQljb21wbGV0ZWRfaW5kZXgsIGVuaWNfd3FfZnJlZV9idWYsCisJCW9wYXF1ZSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChlbmljLT5uZXRkZXYpICYmCisJICAgIHZuaWNfd3FfZGVzY19hdmFpbCgmZW5pYy0+d3FbcV9udW1iZXJdKSA+PSBNQVhfU0tCX0ZSQUdTICsgMSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShlbmljLT5uZXRkZXYpOworCisJc3Bpbl91bmxvY2soJmVuaWMtPndxX2xvY2tbcV9udW1iZXJdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmljX2xvZ19xX2Vycm9yKHN0cnVjdCBlbmljICplbmljKQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBlcnJvcl9zdGF0dXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykgeworCQllcnJvcl9zdGF0dXMgPSB2bmljX3dxX2Vycm9yX3N0YXR1cygmZW5pYy0+d3FbaV0pOworCQlpZiAoZXJyb3Jfc3RhdHVzKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFdRWyVkXSBlcnJvcl9zdGF0dXMgJWRcbiIsCisJCQkJZW5pYy0+bmV0ZGV2LT5uYW1lLCBpLCBlcnJvcl9zdGF0dXMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5ycV9jb3VudDsgaSsrKSB7CisJCWVycm9yX3N0YXR1cyA9IHZuaWNfcnFfZXJyb3Jfc3RhdHVzKCZlbmljLT5ycVtpXSk7CisJCWlmIChlcnJvcl9zdGF0dXMpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUlFbJWRdIGVycm9yX3N0YXR1cyAlZFxuIiwKKwkJCQllbmljLT5uZXRkZXYtPm5hbWUsIGksIGVycm9yX3N0YXR1cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmljX2xpbmtfY2hlY2soc3RydWN0IGVuaWMgKmVuaWMpCit7CisJaW50IGxpbmtfc3RhdHVzID0gdm5pY19kZXZfbGlua19zdGF0dXMoZW5pYy0+dmRldik7CisJaW50IGNhcnJpZXJfb2sgPSBuZXRpZl9jYXJyaWVyX29rKGVuaWMtPm5ldGRldik7CisKKwlpZiAobGlua19zdGF0dXMgJiYgIWNhcnJpZXJfb2spIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIFVQXG4iLCBlbmljLT5uZXRkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29uKGVuaWMtPm5ldGRldik7CisJfSBlbHNlIGlmICghbGlua19zdGF0dXMgJiYgY2Fycmllcl9vaykgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IExpbmsgRE9XTlxuIiwgZW5pYy0+bmV0ZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZW5pYy0+bmV0ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuaWNfbXR1X2NoZWNrKHN0cnVjdCBlbmljICplbmljKQoreworCXUzMiBtdHUgPSB2bmljX2Rldl9tdHUoZW5pYy0+dmRldik7CisKKwlpZiAobXR1ICE9IGVuaWMtPnBvcnRfbXR1KSB7CisJCWlmIChtdHUgPCBlbmljLT5uZXRkZXYtPm10dSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkJIiVzOiBpbnRlcmZhY2UgTVRVICglZCkgc2V0IGhpZ2hlciAiCisJCQkJInRoYW4gc3dpdGNoIHBvcnQgTVRVICglZClcbiIsCisJCQkJZW5pYy0+bmV0ZGV2LT5uYW1lLCBlbmljLT5uZXRkZXYtPm10dSwgbXR1KTsKKwkJZW5pYy0+cG9ydF9tdHUgPSBtdHU7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmljX21zZ2x2bF9jaGVjayhzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwl1MzIgbXNnX2VuYWJsZSA9IHZuaWNfZGV2X21zZ19sdmwoZW5pYy0+dmRldik7CisKKwlpZiAobXNnX2VuYWJsZSAhPSBlbmljLT5tc2dfZW5hYmxlKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogbXNnIGx2bCBjaGFuZ2VkIGZyb20gMHgleCB0byAweCV4XG4iLAorCQkJZW5pYy0+bmV0ZGV2LT5uYW1lLCBlbmljLT5tc2dfZW5hYmxlLCBtc2dfZW5hYmxlKTsKKwkJZW5pYy0+bXNnX2VuYWJsZSA9IG1zZ19lbmFibGU7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmljX25vdGlmeV9jaGVjayhzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwllbmljX21zZ2x2bF9jaGVjayhlbmljKTsKKwllbmljX210dV9jaGVjayhlbmljKTsKKwllbmljX2xpbmtfY2hlY2soZW5pYyk7Cit9CisKKyNkZWZpbmUgRU5JQ19URVNUX0lOVFIocGJhLCBpKSAocGJhICYgKDEgPDwgaSkpCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmljX2lzcl9sZWdhY3koaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHBiYTsKKworCXZuaWNfaW50cl9tYXNrKCZlbmljLT5pbnRyW0VOSUNfSU5UWF9XUV9SUV0pOworCisJcGJhID0gdm5pY19pbnRyX2xlZ2FjeV9wYmEoZW5pYy0+bGVnYWN5X3BiYSk7CisJaWYgKCFwYmEpIHsKKwkJdm5pY19pbnRyX3VubWFzaygmZW5pYy0+aW50cltFTklDX0lOVFhfV1FfUlFdKTsKKwkJcmV0dXJuIElSUV9OT05FOwkvKiBub3Qgb3VyIGludGVycnVwdCAqLworCX0KKworCWlmIChFTklDX1RFU1RfSU5UUihwYmEsIEVOSUNfSU5UWF9OT1RJRlkpKQorCQllbmljX25vdGlmeV9jaGVjayhlbmljKTsKKworCWlmIChFTklDX1RFU1RfSU5UUihwYmEsIEVOSUNfSU5UWF9FUlIpKSB7CisJCWVuaWNfbG9nX3FfZXJyb3IoZW5pYyk7CisJCS8qIHNjaGVkdWxlIHJlY292ZXJ5IGZyb20gV1EvUlEgZXJyb3IgKi8KKwkJc2NoZWR1bGVfd29yaygmZW5pYy0+cmVzZXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKEVOSUNfVEVTVF9JTlRSKHBiYSwgRU5JQ19JTlRYX1dRX1JRKSkgeworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChuZXRkZXYsICZlbmljLT5uYXBpKSkKKwkJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2LCAmZW5pYy0+bmFwaSk7CisJfSBlbHNlIHsKKwkJdm5pY19pbnRyX3VubWFzaygmZW5pYy0+aW50cltFTklDX0lOVFhfV1FfUlFdKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmljX2lzcl9tc2koaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IGRhdGE7CisKKwkvKiBXaXRoIE1TSSwgdGhlcmUgaXMgbm8gc2hhcmluZyBvZiBpbnRlcnJ1cHRzLCBzbyB0aGlzIGlzCisJICogb3VyIGludGVycnVwdCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBhY2sgaXQuICBUaGUgZGV2aWNlCisJICogaXMgbm90IHByb3ZpZGluZyBwZXItdmVjdG9yIG1hc2tpbmcsIHNvIHRoZSBPUyB3aWxsIG5vdAorCSAqIHdyaXRlIHRvIFBDSSBjb25maWcgc3BhY2UgdG8gbWFzay91bm1hc2sgdGhlIGludGVycnVwdC4KKwkgKiBXZSdyZSB1c2luZyBtYXNrX29uX2Fzc2VydGlvbiBmb3IgTVNJLCBzbyB0aGUgZGV2aWNlCisJICogYXV0b21hdGljYWxseSBtYXNrcyB0aGUgaW50ZXJydXB0IHdoZW4gdGhlIGludGVycnVwdCBpcworCSAqIGdlbmVyYXRlZC4gIExhdGVyLCB3aGVuIGV4aXRpbmcgcG9sbGluZywgdGhlIGludGVycnVwdAorCSAqIHdpbGwgYmUgdW5tYXNrZWQgKHNlZSBlbmljX3BvbGwpLgorCSAqCisJICogQWxzbywgdGhlIGRldmljZSB1c2VzIHRoZSBzYW1lIFBDSWUgVHJhZmZpYyBDbGFzcyAoVEMpCisJICogZm9yIE1lbW9yeSBXcml0ZSBkYXRhIGFuZCBNU0ksIHNvIHRoZXJlIGFyZSBubyBvcmRlcmluZworCSAqIGlzc3VlczsgdGhlIE1TSSB3aWxsIGFsd2F5cyBhcnJpdmUgYXQgdGhlIFJvb3QgQ29tcGxleAorCSAqIF9hZnRlcl8gY29ycmVzcG9uZGluZyBNZW1vcnkgV3JpdGVzIChpLmUuIGRlc2NyaXB0b3IKKwkgKiB3cml0ZXMpLgorCSAqLworCisJbmV0aWZfcnhfc2NoZWR1bGUoZW5pYy0+bmV0ZGV2LCAmZW5pYy0+bmFwaSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmljX2lzcl9tc2l4X3JxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBkYXRhOworCisJLyogc2NoZWR1bGUgTkFQSSBwb2xsaW5nIGZvciBSUSBjbGVhbnVwICovCisJbmV0aWZfcnhfc2NoZWR1bGUoZW5pYy0+bmV0ZGV2LCAmZW5pYy0+bmFwaSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmljX2lzcl9tc2l4X3dxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBkYXRhOworCXVuc2lnbmVkIGludCB3cV93b3JrX3RvX2RvID0gLTE7IC8qIG5vIGxpbWl0ICovCisJdW5zaWduZWQgaW50IHdxX3dvcmtfZG9uZTsKKworCXdxX3dvcmtfZG9uZSA9IHZuaWNfY3Ffc2VydmljZSgmZW5pYy0+Y3FbRU5JQ19DUV9XUV0sCisJCXdxX3dvcmtfdG9fZG8sIGVuaWNfd3Ffc2VydmljZSwgTlVMTCk7CisKKwl2bmljX2ludHJfcmV0dXJuX2NyZWRpdHMoJmVuaWMtPmludHJbRU5JQ19NU0lYX1dRXSwKKwkJd3Ffd29ya19kb25lLAorCQkxIC8qIHVubWFzayBpbnRyICovLAorCQkxIC8qIHJlc2V0IGludHIgdGltZXIgKi8pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZW5pY19pc3JfbXNpeF9lcnIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IGRhdGE7CisKKwllbmljX2xvZ19xX2Vycm9yKGVuaWMpOworCisJLyogc2NoZWR1bGUgcmVjb3ZlcnkgZnJvbSBXUS9SUSBlcnJvciAqLworCXNjaGVkdWxlX3dvcmsoJmVuaWMtPnJlc2V0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGVuaWNfaXNyX21zaXhfbm90aWZ5KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBkYXRhOworCisJZW5pY19ub3RpZnlfY2hlY2soZW5pYyk7CisJdm5pY19pbnRyX3VubWFzaygmZW5pYy0+aW50cltFTklDX01TSVhfTk9USUZZXSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl9jb250KHN0cnVjdCBlbmljICplbmljLAorCXN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwl1bnNpZ25lZCBpbnQgbGVuX2xlZnQpCit7CisJc2tiX2ZyYWdfdCAqZnJhZzsKKworCS8qIFF1ZXVlIGFkZGl0aW9uYWwgZGF0YSBmcmFnbWVudHMgKi8KKwlmb3IgKGZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzOyBsZW5fbGVmdDsgZnJhZysrKSB7CisJCWxlbl9sZWZ0IC09IGZyYWctPnNpemU7CisJCWVuaWNfcXVldWVfd3FfZGVzY19jb250KHdxLCBza2IsCisJCQlwY2lfbWFwX3BhZ2UoZW5pYy0+cGRldiwgZnJhZy0+cGFnZSwKKwkJCQlmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKSwKKwkJCWZyYWctPnNpemUsCisJCQkobGVuX2xlZnQgPT0gMCkpOwkvKiBFT1A/ICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5pY19xdWV1ZV93cV9za2JfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywKKwlzdHJ1Y3Qgdm5pY193cSAqd3EsIHN0cnVjdCBza19idWZmICpza2IsCisJaW50IHZsYW5fdGFnX2luc2VydCwgdW5zaWduZWQgaW50IHZsYW5fdGFnKQoreworCXVuc2lnbmVkIGludCBoZWFkX2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJdW5zaWduZWQgaW50IGxlbl9sZWZ0ID0gc2tiLT5sZW4gLSBoZWFkX2xlbjsKKwlpbnQgZW9wID0gKGxlbl9sZWZ0ID09IDApOworCisJLyogUXVldWUgdGhlIG1haW4gc2tiIGZyYWdtZW50ICovCisJZW5pY19xdWV1ZV93cV9kZXNjKHdxLCBza2IsCisJCXBjaV9tYXBfc2luZ2xlKGVuaWMtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCWhlYWRfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSwKKwkJaGVhZF9sZW4sCisJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCisJCWVvcCk7CisKKwlpZiAoIWVvcCkKKwkJZW5pY19xdWV1ZV93cV9za2JfY29udChlbmljLCB3cSwgc2tiLCBsZW5fbGVmdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl9jc3VtX2w0KHN0cnVjdCBlbmljICplbmljLAorCXN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcpCit7CisJdW5zaWduZWQgaW50IGhlYWRfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwl1bnNpZ25lZCBpbnQgbGVuX2xlZnQgPSBza2ItPmxlbiAtIGhlYWRfbGVuOworCXVuc2lnbmVkIGludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwl1bnNpZ25lZCBpbnQgY3N1bV9vZmZzZXQgPSBoZHJfbGVuICsgc2tiLT5jc3VtX29mZnNldDsKKwlpbnQgZW9wID0gKGxlbl9sZWZ0ID09IDApOworCisJLyogUXVldWUgdGhlIG1haW4gc2tiIGZyYWdtZW50ICovCisJZW5pY19xdWV1ZV93cV9kZXNjX2NzdW1fbDQod3EsIHNrYiwKKwkJcGNpX21hcF9zaW5nbGUoZW5pYy0+cGRldiwgc2tiLT5kYXRhLAorCQkJaGVhZF9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpLAorCQloZWFkX2xlbiwKKwkJY3N1bV9vZmZzZXQsCisJCWhkcl9sZW4sCisJCXZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCisJCWVvcCk7CisKKwlpZiAoIWVvcCkKKwkJZW5pY19xdWV1ZV93cV9za2JfY29udChlbmljLCB3cSwgc2tiLCBsZW5fbGVmdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX3NrYl90c28oc3RydWN0IGVuaWMgKmVuaWMsCisJc3RydWN0IHZuaWNfd3EgKndxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbXNzLAorCWludCB2bGFuX3RhZ19pbnNlcnQsIHVuc2lnbmVkIGludCB2bGFuX3RhZykKK3sKKwl1bnNpZ25lZCBpbnQgaGVhZF9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCXVuc2lnbmVkIGludCBsZW5fbGVmdCA9IHNrYi0+bGVuIC0gaGVhZF9sZW47CisJdW5zaWduZWQgaW50IGhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOworCWludCBlb3AgPSAobGVuX2xlZnQgPT0gMCk7CisKKwkvKiBQcmVsb2FkIFRDUCBjc3VtIGZpZWxkIHdpdGggSVAgcHNldWRvIGhkciBjYWxjdWxhdGVkCisJICogd2l0aCBJUCBsZW5ndGggc2V0IHRvIHplcm8uICBIVyB3aWxsIGxhdGVyIGFkZCBpbiBsZW5ndGgKKwkgKiB0byBlYWNoIFRDUCBzZWdtZW50IHJlc3VsdGluZyBmcm9tIHRoZSBUU08uCisJICovCisKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCQlpcF9oZHIoc2tiKS0+Y2hlY2sgPSAwOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwKKwkJCWlwX2hkcihza2IpLT5kYWRkciwgMCwgSVBQUk9UT19UQ1AsIDApOworCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpKSB7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCSZpcHY2X2hkcihza2IpLT5kYWRkciwgMCwgSVBQUk9UT19UQ1AsIDApOworCX0KKworCS8qIFF1ZXVlIHRoZSBtYWluIHNrYiBmcmFnbWVudCAqLworCWVuaWNfcXVldWVfd3FfZGVzY190c28od3EsIHNrYiwKKwkJcGNpX21hcF9zaW5nbGUoZW5pYy0+cGRldiwgc2tiLT5kYXRhLAorCQkJaGVhZF9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpLAorCQloZWFkX2xlbiwKKwkJbXNzLCBoZHJfbGVuLAorCQl2bGFuX3RhZ19pbnNlcnQsIHZsYW5fdGFnLAorCQllb3ApOworCisJaWYgKCFlb3ApCisJCWVuaWNfcXVldWVfd3Ffc2tiX2NvbnQoZW5pYywgd3EsIHNrYiwgbGVuX2xlZnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5pY19xdWV1ZV93cV9za2Ioc3RydWN0IGVuaWMgKmVuaWMsCisJc3RydWN0IHZuaWNfd3EgKndxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGludCBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCXVuc2lnbmVkIGludCB2bGFuX3RhZyA9IDA7CisJaW50IHZsYW5fdGFnX2luc2VydCA9IDA7CisKKwlpZiAoZW5pYy0+dmxhbl9ncm91cCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJLyogVkxBTiB0YWcgZnJvbSB0cnVua2luZyBkcml2ZXIgKi8KKwkJdmxhbl90YWdfaW5zZXJ0ID0gMTsKKwkJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl9CisKKwlpZiAobXNzKQorCQllbmljX3F1ZXVlX3dxX3NrYl90c28oZW5pYywgd3EsIHNrYiwgbXNzLAorCQkJdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZyk7CisJZWxzZSBpZgkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJZW5pY19xdWV1ZV93cV9za2JfY3N1bV9sNChlbmljLCB3cSwgc2tiLAorCQkJdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZyk7CisJZWxzZQorCQllbmljX3F1ZXVlX3dxX3NrYl92bGFuKGVuaWMsIHdxLCBza2IsCisJCQl2bGFuX3RhZ19pbnNlcnQsIHZsYW5fdGFnKTsKK30KKworLyogbmV0aWZfdHhfbG9jayBoZWxkLCBwcm9jZXNzIGNvbnRleHQgd2l0aCBCSHMgZGlzYWJsZWQgKi8KK3N0YXRpYyBpbnQgZW5pY19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHZuaWNfd3EgKndxID0gJmVuaWMtPndxWzBdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2tiLT5sZW4gPD0gMCkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJLyogTm9uLVRTTyBzZW5kcyBtdXN0IGZpdCB3aXRoaW4gRU5JQ19OT05fVFNPX01BWF9ERVNDIGRlc2NzLAorCSAqIHdoaWNoIGlzIHZlcnkgbGlrZWx5LiAgSW4gdGhlIG9mZiBjaGFuY2UgaXQncyBnb2luZyB0byB0YWtlCisJICogbW9yZSB0aGFuICogRU5JQ19OT05fVFNPX01BWF9ERVNDLCBsaW5lYXJpemUgdGhlIHNrYi4KKwkgKi8KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID09IDAgJiYKKwkgICAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEgPiBFTklDX05PTl9UU09fTUFYX0RFU0MgJiYKKwkgICAgc2tiX2xpbmVhcml6ZShza2IpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5pYy0+d3FfbG9ja1swXSwgZmxhZ3MpOworCisJaWYgKHZuaWNfd3FfZGVzY19hdmFpbCh3cSkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQgKi8KKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggcmluZyBmdWxsIHdoZW4gIgorCQkJInF1ZXVlIGF3YWtlIVxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5pYy0+d3FfbG9ja1swXSwgZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJZW5pY19xdWV1ZV93cV9za2IoZW5pYywgd3EsIHNrYik7CisKKwlpZiAodm5pY193cV9kZXNjX2F2YWlsKHdxKSA8IE1BWF9TS0JfRlJBR1MgKyAxKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuaWMtPndxX2xvY2tbMF0sIGZsYWdzKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qIGRldl9iYXNlX2xvY2sgcndsb2NrIGhlbGQsIG5vbWluYWxseSBwcm9jZXNzIGNvbnRleHQgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZW5pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9zdGF0cyA9ICZuZXRkZXYtPnN0YXRzOworCXN0cnVjdCB2bmljX3N0YXRzICpzdGF0czsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCXZuaWNfZGV2X3N0YXRzX2R1bXAoZW5pYy0+dmRldiwgJnN0YXRzKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJbmV0X3N0YXRzLT50eF9wYWNrZXRzID0gc3RhdHMtPnR4LnR4X2ZyYW1lc19vazsKKwluZXRfc3RhdHMtPnR4X2J5dGVzID0gc3RhdHMtPnR4LnR4X2J5dGVzX29rOworCW5ldF9zdGF0cy0+dHhfZXJyb3JzID0gc3RhdHMtPnR4LnR4X2Vycm9yczsKKwluZXRfc3RhdHMtPnR4X2Ryb3BwZWQgPSBzdGF0cy0+dHgudHhfZHJvcHM7CisKKwluZXRfc3RhdHMtPnJ4X3BhY2tldHMgPSBzdGF0cy0+cngucnhfZnJhbWVzX29rOworCW5ldF9zdGF0cy0+cnhfYnl0ZXMgPSBzdGF0cy0+cngucnhfYnl0ZXNfb2s7CisJbmV0X3N0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cngucnhfZXJyb3JzOworCW5ldF9zdGF0cy0+bXVsdGljYXN0ID0gc3RhdHMtPnJ4LnJ4X211bHRpY2FzdF9mcmFtZXNfb2s7CisJbmV0X3N0YXRzLT5yeF9jcmNfZXJyb3JzID0gc3RhdHMtPnJ4LnJ4X2NyY19lcnJvcnM7CisJbmV0X3N0YXRzLT5yeF9kcm9wcGVkID0gc3RhdHMtPnJ4LnJ4X25vX2J1ZnM7CisKKwlyZXR1cm4gbmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBlbmljX3Jlc2V0X21jYWRkcnMoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJZW5pYy0+bWNfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGVuaWNfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNoYXIgKmFkZHIpCit7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogbmV0aWZfdHhfbG9jayBoZWxkLCBCSHMgZGlzYWJsZWQgKi8KK3N0YXRpYyB2b2lkIGVuaWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKKwlpbnQgZGlyZWN0ZWQgPSAxOworCWludCBtdWx0aWNhc3QgPSAobmV0ZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpID8gMSA6IDA7CisJaW50IGJyb2FkY2FzdCA9IChuZXRkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgPyAxIDogMDsKKwlpbnQgcHJvbWlzYyA9IChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMSA6IDA7CisJaW50IGFsbG11bHRpID0gKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgIChuZXRkZXYtPm1jX2NvdW50ID4gRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTKTsKKwl1OCBtY19hZGRyW0VOSUNfTVVMVElDQVNUX1BFUkZFQ1RfRklMVEVSU11bRVRIX0FMRU5dOworCXVuc2lnbmVkIGludCBtY19jb3VudCA9IG5ldGRldi0+bWNfY291bnQ7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlpZiAobWNfY291bnQgPiBFTklDX01VTFRJQ0FTVF9QRVJGRUNUX0ZJTFRFUlMpCisJCW1jX2NvdW50ID0gRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTOworCisJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwl2bmljX2Rldl9wYWNrZXRfZmlsdGVyKGVuaWMtPnZkZXYsIGRpcmVjdGVkLAorCQltdWx0aWNhc3QsIGJyb2FkY2FzdCwgcHJvbWlzYywgYWxsbXVsdGkpOworCisJLyogSXMgdGhlcmUgYW4gZWFzaWVyIHdheT8gIFRyeWluZyB0byBtaW5pbWl6ZSB0bworCSAqIGNhbGxzIHRvIGFkZC9kZWwgbXVsdGljYXN0IGFkZHJzLiAgV2Uga2VlcCB0aGUKKwkgKiBhZGRycyBmcm9tIHRoZSBsYXN0IGNhbGwgaW4gZW5pYy0+bWNfYWRkciBhbmQKKwkgKiBsb29rIGZvciBjaGFuZ2VzIHRvIGFkZC9kZWwuCisJICovCisKKwlmb3IgKGkgPSAwOyBsaXN0ICYmIGkgPCBtY19jb3VudDsgaSsrKSB7CisJCW1lbWNweShtY19hZGRyW2ldLCBsaXN0LT5kbWlfYWRkciwgRVRIX0FMRU4pOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+bWNfY291bnQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgbWNfY291bnQ7IGorKykKKwkJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoZW5pYy0+bWNfYWRkcltpXSwKKwkJCQltY19hZGRyW2pdKSA9PSAwKQorCQkJCWJyZWFrOworCQlpZiAoaiA9PSBtY19jb3VudCkKKwkJCWVuaWNfZGVsX211bHRpY2FzdF9hZGRyKGVuaWMsIGVuaWMtPm1jX2FkZHJbaV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBlbmljLT5tY19jb3VudDsgaisrKQorCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihtY19hZGRyW2ldLAorCQkJCWVuaWMtPm1jX2FkZHJbal0pID09IDApCisJCQkJYnJlYWs7CisJCWlmIChqID09IGVuaWMtPm1jX2NvdW50KQorCQkJZW5pY19hZGRfbXVsdGljYXN0X2FkZHIoZW5pYywgbWNfYWRkcltpXSk7CisJfQorCisJLyogU2F2ZSB0aGUgbGlzdCB0byBjb21wYXJlIGFnYWluc3QgbmV4dCB0aW1lCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykKKwkJbWVtY3B5KGVuaWMtPm1jX2FkZHJbaV0sIG1jX2FkZHJbaV0sIEVUSF9BTEVOKTsKKworCWVuaWMtPm1jX2NvdW50ID0gbWNfY291bnQ7CisKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworfQorCisvKiBydG5sIGxvY2sgaXMgaGVsZCAqLworc3RhdGljIHZvaWQgZW5pY192bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsYW5fZ3JvdXApCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWVuaWMtPnZsYW5fZ3JvdXAgPSB2bGFuX2dyb3VwOworfQorCisvKiBydG5sIGxvY2sgaXMgaGVsZCAqLworc3RhdGljIHZvaWQgZW5pY192bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKKwllbmljX2FkZF92bGFuKGVuaWMsIHZpZCk7CisJc3Bpbl91bmxvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKK30KKworLyogcnRubCBsb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGVuaWNfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCWVuaWNfZGVsX3ZsYW4oZW5pYywgdmlkKTsKKwlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworfQorCisvKiBuZXRpZl90eF9sb2NrIGhlbGQsIEJIcyBkaXNhYmxlZCAqLworc3RhdGljIHZvaWQgZW5pY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXNjaGVkdWxlX3dvcmsoJmVuaWMtPnJlc2V0KTsKK30KKworc3RhdGljIHZvaWQgZW5pY19mcmVlX3JxX2J1ZihzdHJ1Y3Qgdm5pY19ycSAqcnEsIHN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmKQoreworCXN0cnVjdCBlbmljICplbmljID0gdm5pY19kZXZfcHJpdihycS0+dmRldik7CisKKwlpZiAoIWJ1Zi0+b3NfYnVmKQorCQlyZXR1cm47CisKKwlwY2lfdW5tYXBfc2luZ2xlKGVuaWMtPnBkZXYsIGJ1Zi0+ZG1hX2FkZHIsCisJCWJ1Zi0+bGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWRldl9rZnJlZV9za2JfYW55KGJ1Zi0+b3NfYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZW5pY19ycV9hbGxvY19za2IodW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSArIE5FVF9JUF9BTElHTik7CisKKwlpZiAoc2tiKQorCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IGVuaWNfcnFfYWxsb2NfYnVmKHN0cnVjdCB2bmljX3JxICpycSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYocnEtPnZkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGxlbiA9IGVuaWMtPm5ldGRldi0+bXR1ICsgRVRIX0hMRU47CisJdW5zaWduZWQgaW50IG9zX2J1Zl9pbmRleCA9IDA7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXNrYiA9IGVuaWNfcnFfYWxsb2Nfc2tiKGxlbik7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShlbmljLT5wZGV2LCBza2ItPmRhdGEsCisJCWxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCWVuaWNfcXVldWVfcnFfZGVzYyhycSwgc2tiLCBvc19idWZfaW5kZXgsCisJCWRtYV9hZGRyLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5pY19nZXRfc2tiX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICoqaXBoZHIsCisJdm9pZCAqKnRjcGgsIHU2NCAqaGRyX2ZsYWdzLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBjcV9lbmV0X3JxX2Rlc2MgKmNxX2Rlc2MgPSBwcml2OworCXVuc2lnbmVkIGludCBpcF9sZW47CisJc3RydWN0IGlwaGRyICppcGg7CisKKwl1OCB0eXBlLCBjb2xvciwgZW9wLCBzb3AsIGluZ3Jlc3NfcG9ydCwgdmxhbl9zdHJpcHBlZDsKKwl1OCBmY29lLCBmY29lX3NvZiwgZmNvZV9mY19jcmNfb2ssIGZjb2VfZW5jX2Vycm9yLCBmY29lX2VvZjsKKwl1OCB0Y3BfdWRwX2NzdW1fb2ssIHVkcCwgdGNwLCBpcHY0X2NzdW1fb2s7CisJdTggaXB2NiwgaXB2NCwgaXB2NF9mcmFnbWVudCwgZmNzX29rLCByc3NfdHlwZSwgY3N1bV9ub3RfY2FsYzsKKwl1OCBwYWNrZXRfZXJyb3I7CisJdTE2IHFfbnVtYmVyLCBjb21wbGV0ZWRfaW5kZXgsIGJ5dGVzX3dyaXR0ZW4sIHZsYW4sIGNoZWNrc3VtOworCXUzMiByc3NfaGFzaDsKKworCWNxX2VuZXRfcnFfZGVzY19kZWMoY3FfZGVzYywKKwkJJnR5cGUsICZjb2xvciwgJnFfbnVtYmVyLCAmY29tcGxldGVkX2luZGV4LAorCQkmaW5ncmVzc19wb3J0LCAmZmNvZSwgJmVvcCwgJnNvcCwgJnJzc190eXBlLAorCQkmY3N1bV9ub3RfY2FsYywgJnJzc19oYXNoLCAmYnl0ZXNfd3JpdHRlbiwKKwkJJnBhY2tldF9lcnJvciwgJnZsYW5fc3RyaXBwZWQsICZ2bGFuLCAmY2hlY2tzdW0sCisJCSZmY29lX3NvZiwgJmZjb2VfZmNfY3JjX29rLCAmZmNvZV9lbmNfZXJyb3IsCisJCSZmY29lX2VvZiwgJnRjcF91ZHBfY3N1bV9vaywgJnVkcCwgJnRjcCwKKwkJJmlwdjRfY3N1bV9vaywgJmlwdjYsICZpcHY0LCAmaXB2NF9mcmFnbWVudCwKKwkJJmZjc19vayk7CisKKwlpZiAoIShpcHY0ICYmIHRjcCAmJiAhaXB2NF9mcmFnbWVudCkpCisJCXJldHVybiAtMTsKKworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOworCisJaXBfbGVuID0gaXBfaGRybGVuKHNrYik7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgaXBfbGVuKTsKKworCS8qIGNoZWNrIGlmIGlwIGhlYWRlciBhbmQgdGNwIGhlYWRlciBhcmUgY29tcGxldGUgKi8KKwlpZiAobnRvaHMoaXBoLT50b3RfbGVuKSA8IGlwX2xlbiArIHRjcF9oZHJsZW4oc2tiKSkKKwkJcmV0dXJuIC0xOworCisJKmhkcl9mbGFncyA9IExST19JUFY0IHwgTFJPX1RDUDsKKwkqdGNwaCA9IHRjcF9oZHIoc2tiKTsKKwkqaXBoZHIgPSBpcGg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5pY19ycV9pbmRpY2F0ZV9idWYoc3RydWN0IHZuaWNfcnEgKnJxLAorCXN0cnVjdCBjcV9kZXNjICpjcV9kZXNjLCBzdHJ1Y3Qgdm5pY19ycV9idWYgKmJ1ZiwKKwlpbnQgc2tpcHBlZCwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBlbmljICplbmljID0gdm5pY19kZXZfcHJpdihycS0+dmRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXU4IHR5cGUsIGNvbG9yLCBlb3AsIHNvcCwgaW5ncmVzc19wb3J0LCB2bGFuX3N0cmlwcGVkOworCXU4IGZjb2UsIGZjb2Vfc29mLCBmY29lX2ZjX2NyY19vaywgZmNvZV9lbmNfZXJyb3IsIGZjb2VfZW9mOworCXU4IHRjcF91ZHBfY3N1bV9vaywgdWRwLCB0Y3AsIGlwdjRfY3N1bV9vazsKKwl1OCBpcHY2LCBpcHY0LCBpcHY0X2ZyYWdtZW50LCBmY3Nfb2ssIHJzc190eXBlLCBjc3VtX25vdF9jYWxjOworCXU4IHBhY2tldF9lcnJvcjsKKwl1MTYgcV9udW1iZXIsIGNvbXBsZXRlZF9pbmRleCwgYnl0ZXNfd3JpdHRlbiwgdmxhbiwgY2hlY2tzdW07CisJdTMyIHJzc19oYXNoOworCisJaWYgKHNraXBwZWQpCisJCXJldHVybjsKKworCXNrYiA9IGJ1Zi0+b3NfYnVmOworCXByZWZldGNoKHNrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTik7CisJcGNpX3VubWFwX3NpbmdsZShlbmljLT5wZGV2LCBidWYtPmRtYV9hZGRyLAorCQlidWYtPmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCWNxX2VuZXRfcnFfZGVzY19kZWMoKHN0cnVjdCBjcV9lbmV0X3JxX2Rlc2MgKiljcV9kZXNjLAorCQkmdHlwZSwgJmNvbG9yLCAmcV9udW1iZXIsICZjb21wbGV0ZWRfaW5kZXgsCisJCSZpbmdyZXNzX3BvcnQsICZmY29lLCAmZW9wLCAmc29wLCAmcnNzX3R5cGUsCisJCSZjc3VtX25vdF9jYWxjLCAmcnNzX2hhc2gsICZieXRlc193cml0dGVuLAorCQkmcGFja2V0X2Vycm9yLCAmdmxhbl9zdHJpcHBlZCwgJnZsYW4sICZjaGVja3N1bSwKKwkJJmZjb2Vfc29mLCAmZmNvZV9mY19jcmNfb2ssICZmY29lX2VuY19lcnJvciwKKwkJJmZjb2VfZW9mLCAmdGNwX3VkcF9jc3VtX29rLCAmdWRwLCAmdGNwLAorCQkmaXB2NF9jc3VtX29rLCAmaXB2NiwgJmlwdjQsICZpcHY0X2ZyYWdtZW50LAorCQkmZmNzX29rKTsKKworCWlmIChwYWNrZXRfZXJyb3IpIHsKKworCQlpZiAoYnl0ZXNfd3JpdHRlbiA+IDAgJiYgIWZjc19vaykgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJCSIlczogcGFja2V0IGVycm9yOiBiYWQgRkNTXG4iLAorCQkJCQllbmljLT5uZXRkZXYtPm5hbWUpOworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKGVvcCAmJiBieXRlc193cml0dGVuID4gMCkgeworCisJCS8qIEdvb2QgcmVjZWl2ZQorCQkgKi8KKworCQlza2JfcHV0KHNrYiwgYnl0ZXNfd3JpdHRlbik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGVuaWMtPm5ldGRldik7CisKKwkJaWYgKGVuaWMtPmNzdW1fcnhfZW5hYmxlZCAmJiAhY3N1bV9ub3RfY2FsYykgeworCQkJc2tiLT5jc3VtID0gaHRvbnMoY2hlY2tzdW0pOworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKKwkJfQorCisJCXNrYi0+ZGV2ID0gZW5pYy0+bmV0ZGV2OworCQllbmljLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJCWlmIChlbmljLT52bGFuX2dyb3VwICYmIHZsYW5fc3RyaXBwZWQpIHsKKworCQkJaWYgKEVOSUNfU0VUVElORyhlbmljLCBMUk8pICYmIGlwdjQpCisJCQkJbHJvX3ZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYigmZW5pYy0+bHJvX21nciwKKwkJCQkJc2tiLCBlbmljLT52bGFuX2dyb3VwLAorCQkJCQl2bGFuLCBjcV9kZXNjKTsKKwkJCWVsc2UKKwkJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLAorCQkJCQllbmljLT52bGFuX2dyb3VwLCB2bGFuKTsKKworCQl9IGVsc2UgeworCisJCQlpZiAoRU5JQ19TRVRUSU5HKGVuaWMsIExSTykgJiYgaXB2NCkKKwkJCQlscm9fcmVjZWl2ZV9za2IoJmVuaWMtPmxyb19tZ3IsIHNrYiwgY3FfZGVzYyk7CisJCQllbHNlCisJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQl9CisKKwl9IGVsc2UgeworCisJCS8qIEJ1ZmZlciBvdmVyZmxvdworCQkgKi8KKworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KK30KKworc3RhdGljIGludCBlbmljX3JxX3NlcnZpY2Uoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3QgY3FfZGVzYyAqY3FfZGVzYywKKwl1OCB0eXBlLCB1MTYgcV9udW1iZXIsIHUxNiBjb21wbGV0ZWRfaW5kZXgsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYodmRldik7CisKKwl2bmljX3JxX3NlcnZpY2UoJmVuaWMtPnJxW3FfbnVtYmVyXSwgY3FfZGVzYywKKwkJY29tcGxldGVkX2luZGV4LCBWTklDX1JRX1JFVFVSTl9ERVNDLAorCQllbmljX3JxX2luZGljYXRlX2J1Ziwgb3BhcXVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmljX3JxX2Ryb3BfYnVmKHN0cnVjdCB2bmljX3JxICpycSwKKwlzdHJ1Y3QgY3FfZGVzYyAqY3FfZGVzYywgc3RydWN0IHZuaWNfcnFfYnVmICpidWYsCisJaW50IHNraXBwZWQsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IHZuaWNfZGV2X3ByaXYocnEtPnZkZXYpOworCXN0cnVjdCBza19idWZmICpza2IgPSBidWYtPm9zX2J1ZjsKKworCWlmIChza2lwcGVkKQorCQlyZXR1cm47CisKKwlwY2lfdW5tYXBfc2luZ2xlKGVuaWMtPnBkZXYsIGJ1Zi0+ZG1hX2FkZHIsCisJCWJ1Zi0+bGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK30KKworc3RhdGljIGludCBlbmljX3JxX3NlcnZpY2VfZHJvcChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCBjcV9kZXNjICpjcV9kZXNjLAorCXU4IHR5cGUsIHUxNiBxX251bWJlciwgdTE2IGNvbXBsZXRlZF9pbmRleCwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBlbmljICplbmljID0gdm5pY19kZXZfcHJpdih2ZGV2KTsKKworCXZuaWNfcnFfc2VydmljZSgmZW5pYy0+cnFbcV9udW1iZXJdLCBjcV9kZXNjLAorCQljb21wbGV0ZWRfaW5kZXgsIFZOSUNfUlFfUkVUVVJOX0RFU0MsCisJCWVuaWNfcnFfZHJvcF9idWYsIG9wYXF1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmljX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBlbmljICplbmljID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBlbmljLCBuYXBpKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZW5pYy0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBycV93b3JrX3RvX2RvID0gYnVkZ2V0OworCXVuc2lnbmVkIGludCB3cV93b3JrX3RvX2RvID0gLTE7IC8qIG5vIGxpbWl0ICovCisJdW5zaWduZWQgaW50ICB3b3JrX2RvbmUsIHJxX3dvcmtfZG9uZSwgd3Ffd29ya19kb25lOworCisJLyogU2VydmljZSBSUSAoZmlyc3QpIGFuZCBXUQorCSAqLworCisJcnFfd29ya19kb25lID0gdm5pY19jcV9zZXJ2aWNlKCZlbmljLT5jcVtFTklDX0NRX1JRXSwKKwkJcnFfd29ya190b19kbywgZW5pY19ycV9zZXJ2aWNlLCBOVUxMKTsKKworCXdxX3dvcmtfZG9uZSA9IHZuaWNfY3Ffc2VydmljZSgmZW5pYy0+Y3FbRU5JQ19DUV9XUV0sCisJCXdxX3dvcmtfdG9fZG8sIGVuaWNfd3Ffc2VydmljZSwgTlVMTCk7CisKKwkvKiBBY2N1bXVsYXRlIGludHIgZXZlbnQgY3JlZGl0cyBmb3IgdGhpcyBwb2xsaW5nCisJICogY3ljbGUuICBBbiBpbnRyIGV2ZW50IGlzIHRoZSBjb21wbGV0aW9uIG9mIGEKKwkgKiBhIFdRIG9yIFJRIHBhY2tldC4KKwkgKi8KKworCXdvcmtfZG9uZSA9IHJxX3dvcmtfZG9uZSArIHdxX3dvcmtfZG9uZTsKKworCWlmICh3b3JrX2RvbmUgPiAwKQorCQl2bmljX2ludHJfcmV0dXJuX2NyZWRpdHMoJmVuaWMtPmludHJbRU5JQ19JTlRYX1dRX1JRXSwKKwkJCXdvcmtfZG9uZSwKKwkJCTAgLyogZG9uJ3QgdW5tYXNrIGludHIgKi8sCisJCQkwIC8qIGRvbid0IHJlc2V0IGludHIgdGltZXIgKi8pOworCisJaWYgKHJxX3dvcmtfZG9uZSA+IDApIHsKKworCQkvKiBSZXBsZW5pc2ggUlEKKwkJICovCisKKwkJdm5pY19ycV9maWxsKCZlbmljLT5ycVswXSwgZW5pY19ycV9hbGxvY19idWYpOworCisJfSBlbHNlIHsKKworCQkvKiBJZiBubyB3b3JrIGRvbmUsIGZsdXNoIGFsbCBMUk9zIGFuZCBleGl0IHBvbGxpbmcKKwkJICovCisKKwkJaWYgKEVOSUNfU0VUVElORyhlbmljLCBMUk8pKQorCQkJbHJvX2ZsdXNoX2FsbCgmZW5pYy0+bHJvX21ncik7CisKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2LCBuYXBpKTsKKwkJdm5pY19pbnRyX3VubWFzaygmZW5pYy0+aW50cltFTklDX01TSVhfUlFdKTsKKwl9CisKKwlyZXR1cm4gcnFfd29ya19kb25lOworfQorCitzdGF0aWMgaW50IGVuaWNfcG9sbF9tc2l4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZW5pYywgbmFwaSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGVuaWMtPm5ldGRldjsKKwl1bnNpZ25lZCBpbnQgd29ya190b19kbyA9IGJ1ZGdldDsKKwl1bnNpZ25lZCBpbnQgd29ya19kb25lOworCisJLyogU2VydmljZSBSUQorCSAqLworCisJd29ya19kb25lID0gdm5pY19jcV9zZXJ2aWNlKCZlbmljLT5jcVtFTklDX0NRX1JRXSwKKwkJd29ya190b19kbywgZW5pY19ycV9zZXJ2aWNlLCBOVUxMKTsKKworCWlmICh3b3JrX2RvbmUgPiAwKSB7CisKKwkJLyogUmVwbGVuaXNoIFJRCisJCSAqLworCisJCXZuaWNfcnFfZmlsbCgmZW5pYy0+cnFbMF0sIGVuaWNfcnFfYWxsb2NfYnVmKTsKKworCQkvKiBBY2N1bXVsYXRlIGludHIgZXZlbnQgY3JlZGl0cyBmb3IgdGhpcyBwb2xsaW5nCisJCSAqIGN5Y2xlLiAgQW4gaW50ciBldmVudCBpcyB0aGUgY29tcGxldGlvbiBvZiBhCisJCSAqIGEgV1Egb3IgUlEgcGFja2V0LgorCQkgKi8KKworCQl2bmljX2ludHJfcmV0dXJuX2NyZWRpdHMoJmVuaWMtPmludHJbRU5JQ19NU0lYX1JRXSwKKwkJCXdvcmtfZG9uZSwKKwkJCTAgLyogZG9uJ3QgdW5tYXNrIGludHIgKi8sCisJCQkwIC8qIGRvbid0IHJlc2V0IGludHIgdGltZXIgKi8pOworCX0gZWxzZSB7CisKKwkJLyogSWYgbm8gd29yayBkb25lLCBmbHVzaCBhbGwgTFJPcyBhbmQgZXhpdCBwb2xsaW5nCisJCSAqLworCisJCWlmIChFTklDX1NFVFRJTkcoZW5pYywgTFJPKSkKKwkJCWxyb19mbHVzaF9hbGwoJmVuaWMtPmxyb19tZ3IpOworCisJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldiwgbmFwaSk7CisJCXZuaWNfaW50cl91bm1hc2soJmVuaWMtPmludHJbRU5JQ19NU0lYX1JRXSk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIHZvaWQgZW5pY19ub3RpZnlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBlbmljICplbmljID0gKHN0cnVjdCBlbmljICopZGF0YTsKKworCWVuaWNfbm90aWZ5X2NoZWNrKGVuaWMpOworCisJbW9kX3RpbWVyKCZlbmljLT5ub3RpZnlfdGltZXIsCisJCXJvdW5kX2ppZmZpZXMoamlmZmllcyArIEVOSUNfTk9USUZZX1RJTUVSX1BFUklPRCkpOworfQorCitzdGF0aWMgdm9pZCBlbmljX2ZyZWVfaW50cihzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZW5pYy0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBpOworCisJc3dpdGNoICh2bmljX2Rldl9nZXRfaW50cl9tb2RlKGVuaWMtPnZkZXYpKSB7CisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfSU5UWDoKKwkJZnJlZV9pcnEoZW5pYy0+cGRldi0+aXJxLCBuZXRkZXYpOworCQlicmVhazsKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0k6CisJCWZyZWVfaXJxKGVuaWMtPnBkZXYtPmlycSwgZW5pYyk7CisJCWJyZWFrOworCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSVg6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVuaWMtPm1zaXgpOyBpKyspCisJCQlpZiAoZW5pYy0+bXNpeFtpXS5yZXF1ZXN0ZWQpCisJCQkJZnJlZV9pcnEoZW5pYy0+bXNpeF9lbnRyeVtpXS52ZWN0b3IsCisJCQkJCWVuaWMtPm1zaXhbaV0uZGV2aWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW5pY19yZXF1ZXN0X2ludHIoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGVuaWMtPm5ldGRldjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAodm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KSkgeworCisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfSU5UWDoKKworCQllcnIgPSByZXF1ZXN0X2lycShlbmljLT5wZGV2LT5pcnEsIGVuaWNfaXNyX2xlZ2FjeSwKKwkJCUlSUUZfU0hBUkVELCBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCWJyZWFrOworCisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfTVNJOgorCisJCWVyciA9IHJlcXVlc3RfaXJxKGVuaWMtPnBkZXYtPmlycSwgZW5pY19pc3JfbXNpLAorCQkJMCwgbmV0ZGV2LT5uYW1lLCBlbmljKTsKKwkJYnJlYWs7CisKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0lYOgorCisJCXNwcmludGYoZW5pYy0+bXNpeFtFTklDX01TSVhfUlFdLmRldm5hbWUsCisJCQkiJS4xMXMtcngtMCIsIG5ldGRldi0+bmFtZSk7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX1JRXS5pc3IgPSBlbmljX2lzcl9tc2l4X3JxOworCQllbmljLT5tc2l4W0VOSUNfTVNJWF9SUV0uZGV2aWQgPSBlbmljOworCisJCXNwcmludGYoZW5pYy0+bXNpeFtFTklDX01TSVhfV1FdLmRldm5hbWUsCisJCQkiJS4xMXMtdHgtMCIsIG5ldGRldi0+bmFtZSk7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX1dRXS5pc3IgPSBlbmljX2lzcl9tc2l4X3dxOworCQllbmljLT5tc2l4W0VOSUNfTVNJWF9XUV0uZGV2aWQgPSBlbmljOworCisJCXNwcmludGYoZW5pYy0+bXNpeFtFTklDX01TSVhfRVJSXS5kZXZuYW1lLAorCQkJIiUuMTFzLWVyciIsIG5ldGRldi0+bmFtZSk7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX0VSUl0uaXNyID0gZW5pY19pc3JfbXNpeF9lcnI7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX0VSUl0uZGV2aWQgPSBlbmljOworCisJCXNwcmludGYoZW5pYy0+bXNpeFtFTklDX01TSVhfTk9USUZZXS5kZXZuYW1lLAorCQkJIiUuMTFzLW5vdGlmeSIsIG5ldGRldi0+bmFtZSk7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX05PVElGWV0uaXNyID0gZW5pY19pc3JfbXNpeF9ub3RpZnk7CisJCWVuaWMtPm1zaXhbRU5JQ19NU0lYX05PVElGWV0uZGV2aWQgPSBlbmljOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVuaWMtPm1zaXgpOyBpKyspIHsKKwkJCWVyciA9IHJlcXVlc3RfaXJxKGVuaWMtPm1zaXhfZW50cnlbaV0udmVjdG9yLAorCQkJCWVuaWMtPm1zaXhbaV0uaXNyLCAwLAorCQkJCWVuaWMtPm1zaXhbaV0uZGV2bmFtZSwKKwkJCQllbmljLT5tc2l4W2ldLmRldmlkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQllbmljX2ZyZWVfaW50cihlbmljKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVuaWMtPm1zaXhbaV0ucmVxdWVzdGVkID0gMTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlbmljX25vdGlmeV9zZXQoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAodm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KSkgeworCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX0lOVFg6CisJCWVyciA9IHZuaWNfZGV2X25vdGlmeV9zZXQoZW5pYy0+dmRldiwgRU5JQ19JTlRYX05PVElGWSk7CisJCWJyZWFrOworCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSVg6CisJCWVyciA9IHZuaWNfZGV2X25vdGlmeV9zZXQoZW5pYy0+dmRldiwgRU5JQ19NU0lYX05PVElGWSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IHZuaWNfZGV2X25vdGlmeV9zZXQoZW5pYy0+dmRldiwgLTEgLyogbm8gaW50ciAqLyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVuaWNfbm90aWZ5X3RpbWVyX3N0YXJ0KHN0cnVjdCBlbmljICplbmljKQoreworCXN3aXRjaCAodm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KSkgeworCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSToKKwkJbW9kX3RpbWVyKCZlbmljLT5ub3RpZnlfdGltZXIsIGppZmZpZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVc2luZyBpbnRyIGZvciBub3RpZmljYXRpb24gZm9yIElOVHgvTVNJLVggKi8KKwkJYnJlYWs7CisJfTsKK30KKworLyogcnRubCBsb2NrIGlzIGhlbGQsIHByb2Nlc3MgY29udGV4dCAqLworc3RhdGljIGludCBlbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5pYyAqZW5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWVyciA9IGVuaWNfcmVxdWVzdF9pbnRyKGVuaWMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFVuYWJsZSB0byByZXF1ZXN0IGlycS5cbiIsCisJCQluZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGVuaWNfbm90aWZ5X3NldChlbmljKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSIlczogRmFpbGVkIHRvIGFsbG9jIG5vdGlmeSBidWZmZXIsIGFib3J0aW5nLlxuIiwKKwkJCW5ldGRldi0+bmFtZSk7CisJCWdvdG8gZXJyX291dF9mcmVlX2ludHI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPnJxX2NvdW50OyBpKyspIHsKKwkJZXJyID0gdm5pY19ycV9maWxsKCZlbmljLT5ycVtpXSwgZW5pY19ycV9hbGxvY19idWYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJIiVzOiBVbmFibGUgdG8gYWxsb2MgcmVjZWl2ZSBidWZmZXJzLlxuIiwKKwkJCQluZXRkZXYtPm5hbWUpOworCQkJZ290byBlcnJfb3V0X25vdGlmeV91bnNldDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT53cV9jb3VudDsgaSsrKQorCQl2bmljX3dxX2VuYWJsZSgmZW5pYy0+d3FbaV0pOworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5ycV9jb3VudDsgaSsrKQorCQl2bmljX3JxX2VuYWJsZSgmZW5pYy0+cnFbaV0pOworCisJZW5pY19hZGRfc3RhdGlvbl9hZGRyKGVuaWMpOworCWVuaWNfc2V0X211bHRpY2FzdF9saXN0KG5ldGRldik7CisKKwluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJbmFwaV9lbmFibGUoJmVuaWMtPm5hcGkpOworCXZuaWNfZGV2X2VuYWJsZShlbmljLT52ZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5pbnRyX2NvdW50OyBpKyspCisJCXZuaWNfaW50cl91bm1hc2soJmVuaWMtPmludHJbaV0pOworCisJZW5pY19ub3RpZnlfdGltZXJfc3RhcnQoZW5pYyk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9ub3RpZnlfdW5zZXQ6CisJdm5pY19kZXZfbm90aWZ5X3Vuc2V0KGVuaWMtPnZkZXYpOworZXJyX291dF9mcmVlX2ludHI6CisJZW5pY19mcmVlX2ludHIoZW5pYyk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBydG5sIGxvY2sgaXMgaGVsZCwgcHJvY2VzcyBjb250ZXh0ICovCitzdGF0aWMgaW50IGVuaWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJZGVsX3RpbWVyX3N5bmMoJmVuaWMtPm5vdGlmeV90aW1lcik7CisKKwl2bmljX2Rldl9kaXNhYmxlKGVuaWMtPnZkZXYpOworCW5hcGlfZGlzYWJsZSgmZW5pYy0+bmFwaSk7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPmludHJfY291bnQ7IGkrKykKKwkJdm5pY19pbnRyX21hc2soJmVuaWMtPmludHJbaV0pOworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPndxX2NvdW50OyBpKyspIHsKKwkJZXJyID0gdm5pY193cV9kaXNhYmxlKCZlbmljLT53cVtpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+cnFfY291bnQ7IGkrKykgeworCQllcnIgPSB2bmljX3JxX2Rpc2FibGUoJmVuaWMtPnJxW2ldKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJdm5pY19kZXZfbm90aWZ5X3Vuc2V0KGVuaWMtPnZkZXYpOworCWVuaWNfZnJlZV9pbnRyKGVuaWMpOworCisJKHZvaWQpdm5pY19jcV9zZXJ2aWNlKCZlbmljLT5jcVtFTklDX0NRX1JRXSwKKwkJLTEsIGVuaWNfcnFfc2VydmljZV9kcm9wLCBOVUxMKTsKKwkodm9pZCl2bmljX2NxX3NlcnZpY2UoJmVuaWMtPmNxW0VOSUNfQ1FfV1FdLAorCQktMSwgZW5pY193cV9zZXJ2aWNlLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT53cV9jb3VudDsgaSsrKQorCQl2bmljX3dxX2NsZWFuKCZlbmljLT53cVtpXSwgZW5pY19mcmVlX3dxX2J1Zik7CisJZm9yIChpID0gMDsgaSA8IGVuaWMtPnJxX2NvdW50OyBpKyspCisJCXZuaWNfcnFfY2xlYW4oJmVuaWMtPnJxW2ldLCBlbmljX2ZyZWVfcnFfYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+Y3FfY291bnQ7IGkrKykKKwkJdm5pY19jcV9jbGVhbigmZW5pYy0+Y3FbaV0pOworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5pbnRyX2NvdW50OyBpKyspCisJCXZuaWNfaW50cl9jbGVhbigmZW5pYy0+aW50cltpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmljX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBydW5uaW5nID0gbmV0aWZfcnVubmluZyhuZXRkZXYpOworCisJaWYgKG5ld19tdHUgPCBFTklDX01JTl9NVFUgfHwgbmV3X210dSA+IEVOSUNfTUFYX01UVSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocnVubmluZykKKwkJZW5pY19zdG9wKG5ldGRldik7CisKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAobmV0ZGV2LT5tdHUgPiBlbmljLT5wb3J0X210dSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSIlczogaW50ZXJmYWNlIE1UVSAoJWQpIHNldCBoaWdoZXIgIgorCQkJInRoYW4gcG9ydCBNVFUgKCVkKVxuIiwKKwkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2LT5tdHUsIGVuaWMtPnBvcnRfbXR1KTsKKworCWlmIChydW5uaW5nKQorCQllbmljX29wZW4obmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGVuaWNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB2bmljX2RldiAqdmRldiA9IGVuaWMtPnZkZXY7CisKKwlzd2l0Y2ggKHZuaWNfZGV2X2dldF9pbnRyX21vZGUodmRldikpIHsKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0lYOgorCQllbmljX2lzcl9tc2l4X3JxKGVuaWMtPnBkZXYtPmlycSwgZW5pYyk7CisJCWVuaWNfaXNyX21zaXhfd3EoZW5pYy0+cGRldi0+aXJxLCBlbmljKTsKKwkJYnJlYWs7CisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfTVNJOgorCQllbmljX2lzcl9tc2koZW5pYy0+cGRldi0+aXJxLCBlbmljKTsKKwkJYnJlYWs7CisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfSU5UWDoKKwkJZW5pY19pc3JfbGVnYWN5KGVuaWMtPnBkZXYtPmlycSwgbmV0ZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZW5pY19kZXZfd2FpdChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsCisJaW50ICgqc3RhcnQpKHN0cnVjdCB2bmljX2RldiAqLCBpbnQpLAorCWludCAoKmZpbmlzaGVkKShzdHJ1Y3Qgdm5pY19kZXYgKiwgaW50ICopLAorCWludCBhcmcpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCBkb25lOworCWludCBlcnI7CisKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOworCisJZXJyID0gc3RhcnQodmRldiwgYXJnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogV2FpdCBmb3IgZnVuYyB0byBjb21wbGV0ZS4uLjIgc2Vjb25kcyBtYXgKKwkgKi8KKworCXRpbWUgPSBqaWZmaWVzICsgKEhaICogMik7CisJZG8geworCisJCWVyciA9IGZpbmlzaGVkKHZkZXYsICZkb25lKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKGRvbmUpCisJCQlyZXR1cm4gMDsKKworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWiAvIDEwKTsKKworCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgZW5pY19kZXZfb3BlbihzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZW5pY19kZXZfd2FpdChlbmljLT52ZGV2LCB2bmljX2Rldl9vcGVuLAorCQl2bmljX2Rldl9vcGVuX2RvbmUsIDApOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJ2TklDIGRldmljZSBvcGVuIGZhaWxlZCwgZXJyICVkLlxuIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZW5pY19kZXZfc29mdF9yZXNldChzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZW5pY19kZXZfd2FpdChlbmljLT52ZGV2LCB2bmljX2Rldl9zb2Z0X3Jlc2V0LAorCQl2bmljX2Rldl9zb2Z0X3Jlc2V0X2RvbmUsIDApOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJ2TklDIHNvZnQgcmVzZXQgZmFpbGVkLCBlcnIgJWQuXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZW5pY19yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVuaWMgKmVuaWMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGVuaWMsIHJlc2V0KTsKKworCWlmICghbmV0aWZfcnVubmluZyhlbmljLT5uZXRkZXYpKQorCQlyZXR1cm47CisKKwlydG5sX2xvY2soKTsKKworCXNwaW5fbG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCXZuaWNfZGV2X2hhbmdfbm90aWZ5KGVuaWMtPnZkZXYpOworCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwllbmljX3N0b3AoZW5pYy0+bmV0ZGV2KTsKKwllbmljX2Rldl9zb2Z0X3Jlc2V0KGVuaWMpOworCWVuaWNfcmVzZXRfbWNhZGRycyhlbmljKTsKKwllbmljX2luaXRfdm5pY19yZXNvdXJjZXMoZW5pYyk7CisJZW5pY19vcGVuKGVuaWMtPm5ldGRldik7CisKKwlydG5sX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IGVuaWNfc2V0X2ludHJfbW9kZShzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IEFSUkFZX1NJWkUoZW5pYy0+cnEpOworCXVuc2lnbmVkIGludCBtID0gQVJSQVlfU0laRShlbmljLT53cSk7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgKElOVHgsIE1TSSwgTVNJLVgpIGRlcGVuZGluZworCSAqIHN5c3RlbSBjYXBhYmlsaXRpZXMuCisJICoKKwkgKiBUcnkgTVNJLVggZmlyc3QKKwkgKgorCSAqIFdlIG5lZWQgbiBSUXMsIG0gV1FzLCBuK20gQ1FzLCBhbmQgbittKzIgSU5UUnMKKwkgKiAodGhlIHNlY29uZCB0byBsYXN0IElOVFIgaXMgdXNlZCBmb3IgV1EvUlEgZXJyb3JzKQorCSAqICh0aGUgbGFzdCBJTlRSIGlzIHVzZWQgZm9yIG5vdGlmaWNhdGlvbnMpCisJICovCisKKwlCVUdfT04oQVJSQVlfU0laRShlbmljLT5tc2l4X2VudHJ5KSA8IG4gKyBtICsgMik7CisJZm9yIChpID0gMDsgaSA8IG4gKyBtICsgMjsgaSsrKQorCQllbmljLT5tc2l4X2VudHJ5W2ldLmVudHJ5ID0gaTsKKworCWlmIChlbmljLT5jb25maWcuaW50cl9tb2RlIDwgMSAmJgorCSAgICBlbmljLT5ycV9jb3VudCA+PSBuICYmCisJICAgIGVuaWMtPndxX2NvdW50ID49IG0gJiYKKwkgICAgZW5pYy0+Y3FfY291bnQgPj0gbiArIG0gJiYKKwkgICAgZW5pYy0+aW50cl9jb3VudCA+PSBuICsgbSArIDIgJiYKKwkgICAgIXBjaV9lbmFibGVfbXNpeChlbmljLT5wZGV2LCBlbmljLT5tc2l4X2VudHJ5LCBuICsgbSArIDIpKSB7CisKKwkJZW5pYy0+cnFfY291bnQgPSBuOworCQllbmljLT53cV9jb3VudCA9IG07CisJCWVuaWMtPmNxX2NvdW50ID0gbiArIG07CisJCWVuaWMtPmludHJfY291bnQgPSBuICsgbSArIDI7CisKKwkJdm5pY19kZXZfc2V0X2ludHJfbW9kZShlbmljLT52ZGV2LCBWTklDX0RFVl9JTlRSX01PREVfTVNJWCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTmV4dCB0cnkgTVNJCisJICoKKwkgKiBXZSBuZWVkIDEgUlEsIDEgV1EsIDIgQ1FzLCBhbmQgMSBJTlRSCisJICovCisKKwlpZiAoZW5pYy0+Y29uZmlnLmludHJfbW9kZSA8IDIgJiYKKwkgICAgZW5pYy0+cnFfY291bnQgPj0gMSAmJgorCSAgICBlbmljLT53cV9jb3VudCA+PSAxICYmCisJICAgIGVuaWMtPmNxX2NvdW50ID49IDIgJiYKKwkgICAgZW5pYy0+aW50cl9jb3VudCA+PSAxICYmCisJICAgICFwY2lfZW5hYmxlX21zaShlbmljLT5wZGV2KSkgeworCisJCWVuaWMtPnJxX2NvdW50ID0gMTsKKwkJZW5pYy0+d3FfY291bnQgPSAxOworCQllbmljLT5jcV9jb3VudCA9IDI7CisJCWVuaWMtPmludHJfY291bnQgPSAxOworCisJCXZuaWNfZGV2X3NldF9pbnRyX21vZGUoZW5pYy0+dmRldiwgVk5JQ19ERVZfSU5UUl9NT0RFX01TSSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTmV4dCB0cnkgSU5UeAorCSAqCisJICogV2UgbmVlZCAxIFJRLCAxIFdRLCAyIENRcywgYW5kIDMgSU5UUnMKKwkgKiAodGhlIGZpcnN0IElOVFIgaXMgdXNlZCBmb3IgV1EvUlEpCisJICogKHRoZSBzZWNvbmQgSU5UUiBpcyB1c2VkIGZvciBXUS9SUSBlcnJvcnMpCisJICogKHRoZSBsYXN0IElOVFIgaXMgdXNlZCBmb3Igbm90aWZpY2F0aW9ucykKKwkgKi8KKworCWlmIChlbmljLT5jb25maWcuaW50cl9tb2RlIDwgMyAmJgorCSAgICBlbmljLT5ycV9jb3VudCA+PSAxICYmCisJICAgIGVuaWMtPndxX2NvdW50ID49IDEgJiYKKwkgICAgZW5pYy0+Y3FfY291bnQgPj0gMiAmJgorCSAgICBlbmljLT5pbnRyX2NvdW50ID49IDMpIHsKKworCQllbmljLT5ycV9jb3VudCA9IDE7CisJCWVuaWMtPndxX2NvdW50ID0gMTsKKwkJZW5pYy0+Y3FfY291bnQgPSAyOworCQllbmljLT5pbnRyX2NvdW50ID0gMzsKKworCQl2bmljX2Rldl9zZXRfaW50cl9tb2RlKGVuaWMtPnZkZXYsIFZOSUNfREVWX0lOVFJfTU9ERV9JTlRYKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwl2bmljX2Rldl9zZXRfaW50cl9tb2RlKGVuaWMtPnZkZXYsIFZOSUNfREVWX0lOVFJfTU9ERV9VTktOT1dOKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBlbmljX2NsZWFyX2ludHJfbW9kZShzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlzd2l0Y2ggKHZuaWNfZGV2X2dldF9pbnRyX21vZGUoZW5pYy0+dmRldikpIHsKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0lYOgorCQlwY2lfZGlzYWJsZV9tc2l4KGVuaWMtPnBkZXYpOworCQlicmVhazsKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0k6CisJCXBjaV9kaXNhYmxlX21zaShlbmljLT5wZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJdm5pY19kZXZfc2V0X2ludHJfbW9kZShlbmljLT52ZGV2LCBWTklDX0RFVl9JTlRSX01PREVfVU5LTk9XTik7Cit9CisKK3N0YXRpYyB2b2lkIGVuaWNfaW91bm1hcChzdHJ1Y3QgZW5pYyAqZW5pYykKK3sKKwlpZiAoZW5pYy0+YmFyMC52YWRkcikKKwkJaW91bm1hcChlbmljLT5iYXIwLnZhZGRyKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZW5pY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVuaWMgKmVuaWM7CisJaW50IHVzaW5nX2RhYyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWNvbnN0IHU4IHJzc19kZWZhdWx0X2NwdSA9IDA7CisJY29uc3QgdTggcnNzX2hhc2hfdHlwZSA9IDA7CisJY29uc3QgdTggcnNzX2hhc2hfYml0cyA9IDA7CisJY29uc3QgdTggcnNzX2Jhc2VfY3B1ID0gMDsKKwljb25zdCB1OCByc3NfZW5hYmxlID0gMDsKKwljb25zdCB1OCB0c29faXBpZF9zcGxpdF9lbiA9IDA7CisJY29uc3QgdTggaWdfdmxhbl9zdHJpcF9lbiA9IDE7CisKKwkvKiBBbGxvY2F0ZSBuZXQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZS4gIFByaXZhdGUKKwkgKiBpbnN0YW5jZSBkYXRhIGlzIGluaXRpYWxpemVkIHRvIHplcm8uCisJICovCisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVuaWMpKTsKKwlpZiAoIW5ldGRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOworCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCWVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWVuaWMtPm5ldGRldiA9IG5ldGRldjsKKwllbmljLT5wZGV2ID0gcGRldjsKKworCS8qIFNldHVwIFBDSSByZXNvdXJjZXMKKwkgKi8KKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJIkNhbm5vdCByZXF1ZXN0IFBDSSByZWdpb25zLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBRdWVyeSBQQ0kgY29udHJvbGxlciBvbiBzeXN0ZW0gZm9yIERNQSBhZGRyZXNzaW5nCisJICogbGltaXRhdGlvbiBmb3IgdGhlIGRldmljZS4gIFRyeSA0MC1iaXQgZmlyc3QsIGFuZAorCSAqIGZhaWwgdG8gMzItYml0LgorCSAqLworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNDBCSVRfTUFTSyk7CisJaWYgKGVycikgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9yZWdpb25zOworCQl9CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkiVW5hYmxlIHRvIG9idGFpbiAzMi1iaXQgRE1BICIKKwkJCQkiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnMsIGFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9yZWdpb25zOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV80MEJJVF9NQVNLKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSJVbmFibGUgdG8gb2J0YWluIDQwLWJpdCBETUEgIgorCQkJCSJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9ucywgYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX291dF9yZWxlYXNlX3JlZ2lvbnM7CisJCX0KKwkJdXNpbmdfZGFjID0gMTsKKwl9CisKKwkvKiBNYXAgdk5JQyByZXNvdXJjZXMgZnJvbSBCQVIwCisJICovCisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJIkJBUjAgbm90IG1lbW9yeS1tYXAnYWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwllbmljLT5iYXIwLnZhZGRyID0gcGNpX2lvbWFwKHBkZXYsIDAsIGVuaWMtPmJhcjAubGVuKTsKKwllbmljLT5iYXIwLmJ1c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWVuaWMtPmJhcjAubGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCWlmICghZW5pYy0+YmFyMC52YWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkiQ2Fubm90IG1lbW9yeS1tYXAgQkFSMCByZXMgaGRyLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCS8qIFJlZ2lzdGVyIHZOSUMgZGV2aWNlCisJICovCisKKwllbmljLT52ZGV2ID0gdm5pY19kZXZfcmVnaXN0ZXIoTlVMTCwgZW5pYywgcGRldiwgJmVuaWMtPmJhcjApOworCWlmICghZW5pYy0+dmRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkidk5JQyByZWdpc3RyYXRpb24gZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiBJc3N1ZSBkZXZpY2Ugb3BlbiB0byBnZXQgZGV2aWNlIGluIGtub3duIHN0YXRlCisJICovCisKKwllcnIgPSBlbmljX2Rldl9vcGVuKGVuaWMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJInZOSUMgZGV2IG9wZW4gZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfdm5pY191bnJlZ2lzdGVyOworCX0KKworCS8qIElzc3VlIGRldmljZSBpbml0IHRvIGluaXRpYWxpemUgdGhlIHZuaWMtdG8tc3dpdGNoIGxpbmsuCisJICogV2UnbGwgc3RhcnQgd2l0aCBjYXJyaWVyIG9mZiBhbmQgd2FpdCBmb3IgbGluayBVUAorCSAqIG5vdGlmaWNhdGlvbiBsYXRlciB0byB0dXJuIG9uIGNhcnJpZXIuICBXZSBkb24ndCBuZWVkCisJICogdG8gd2FpdCBoZXJlIGZvciB0aGUgdm5pYy10by1zd2l0Y2ggbGluayBpbml0aWFsaXphdGlvbgorCSAqIHRvIGNvbXBsZXRlOyBsaW5rIFVQIG5vdGlmaWNhdGlvbiBpcyB0aGUgaW5kaWNhdGlvbiB0aGF0CisJICogdGhlIHByb2Nlc3MgaXMgY29tcGxldGUuCisJICovCisKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCisJZXJyID0gdm5pY19kZXZfaW5pdChlbmljLT52ZGV2LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJ2TklDIGRldiBpbml0IGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKKwl9CisKKwkvKiBHZXQgdk5JQyBjb25maWd1cmF0aW9uCisJICovCisKKwllcnIgPSBlbmljX2dldF92bmljX2NvbmZpZyhlbmljKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJHZXQgdk5JQyBjb25maWd1cmF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKKwl9CisKKwkvKiBHZXQgYXZhaWxhYmxlIHJlc291cmNlIGNvdW50cworCSovCisKKwllbmljX2dldF9yZXNfY291bnRzKGVuaWMpOworCisJLyogU2V0IGludGVycnVwdCBtb2RlIGJhc2VkIG9uIHJlc291cmNlIGNvdW50cyBhbmQgc3lzdGVtCisJICogY2FwYWJpbGl0aWVzCisJKi8KKworCWVyciA9IGVuaWNfc2V0X2ludHJfbW9kZShlbmljKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJGYWlsZWQgdG8gc2V0IGludHIgbW9kZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rldl9jbG9zZTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbmQgY29uZmlndXJlIHZOSUMgcmVzb3VyY2VzCisJICovCisKKwllcnIgPSBlbmljX2FsbG9jX3ZuaWNfcmVzb3VyY2VzKGVuaWMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJIkZhaWxlZCB0byBhbGxvYyB2TklDIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfdm5pY19yZXNvdXJjZXM7CisJfQorCisJZW5pY19pbml0X3ZuaWNfcmVzb3VyY2VzKGVuaWMpOworCisJLyogRW5hYmxlIFZMQU4gdGFnIHN0cmlwcGluZy4gIFJTUyBub3QgZW5hYmxlZCAoeWV0KS4KKwkgKi8KKworCWVyciA9IGVuaWNfc2V0X25pY19jZmcoZW5pYywKKwkJcnNzX2RlZmF1bHRfY3B1LCByc3NfaGFzaF90eXBlLAorCQlyc3NfaGFzaF9iaXRzLCByc3NfYmFzZV9jcHUsCisJCXJzc19lbmFibGUsIHRzb19pcGlkX3NwbGl0X2VuLAorCQlpZ192bGFuX3N0cmlwX2VuKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJGYWlsZWQgdG8gY29uZmlnIG5pYywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfdm5pY19yZXNvdXJjZXM7CisJfQorCisJLyogU2V0dXAgbm90aWZpY2F0aW9uIHRpbWVyLCBIVyByZXNldCB0YXNrLCBhbmQgbG9ja3MKKwkgKi8KKworCWluaXRfdGltZXIoJmVuaWMtPm5vdGlmeV90aW1lcik7CisJZW5pYy0+bm90aWZ5X3RpbWVyLmZ1bmN0aW9uID0gZW5pY19ub3RpZnlfdGltZXI7CisJZW5pYy0+bm90aWZ5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyllbmljOworCisJSU5JVF9XT1JLKCZlbmljLT5yZXNldCwgZW5pY19yZXNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+d3FfY291bnQ7IGkrKykKKwkJc3Bpbl9sb2NrX2luaXQoJmVuaWMtPndxX2xvY2tbaV0pOworCisJc3Bpbl9sb2NrX2luaXQoJmVuaWMtPmRldmNtZF9sb2NrKTsKKworCS8qIFJlZ2lzdGVyIG5ldCBkZXZpY2UKKwkgKi8KKworCWVuaWMtPnBvcnRfbXR1ID0gZW5pYy0+Y29uZmlnLm10dTsKKwkodm9pZCllbmljX2NoYW5nZV9tdHUobmV0ZGV2LCBlbmljLT5wb3J0X210dSk7CisKKwllcnIgPSBlbmljX3NldF9tYWNfYWRkcihuZXRkZXYsIGVuaWMtPm1hY19hZGRyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJJbnZhbGlkIE1BQyBhZGRyZXNzLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV92bmljX3Jlc291cmNlczsKKwl9CisKKwluZXRkZXYtPm9wZW4gPSBlbmljX29wZW47CisJbmV0ZGV2LT5zdG9wID0gZW5pY19zdG9wOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gZW5pY19oYXJkX3N0YXJ0X3htaXQ7CisJbmV0ZGV2LT5nZXRfc3RhdHMgPSBlbmljX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGVuaWNfc2V0X211bHRpY2FzdF9saXN0OworCW5ldGRldi0+Y2hhbmdlX210dSA9IGVuaWNfY2hhbmdlX210dTsKKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBlbmljX3ZsYW5fcnhfcmVnaXN0ZXI7CisJbmV0ZGV2LT52bGFuX3J4X2FkZF92aWQgPSBlbmljX3ZsYW5fcnhfYWRkX3ZpZDsKKwluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBlbmljX3ZsYW5fcnhfa2lsbF92aWQ7CisJbmV0ZGV2LT50eF90aW1lb3V0ID0gZW5pY190eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7CisJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZlbmljX2V0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlbmljX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJc3dpdGNoICh2bmljX2Rldl9nZXRfaW50cl9tb2RlKGVuaWMtPnZkZXYpKSB7CisJZGVmYXVsdDoKKwkJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmZW5pYy0+bmFwaSwgZW5pY19wb2xsLCA2NCk7CisJCWJyZWFrOworCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSVg6CisJCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJmVuaWMtPm5hcGksIGVuaWNfcG9sbF9tc2l4LCA2NCk7CisJCWJyZWFrOworCX0KKworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCWlmIChFTklDX1NFVFRJTkcoZW5pYywgVFhDU1VNKSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCWlmIChFTklDX1NFVFRJTkcoZW5pYywgVFNPKSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8CisJCQlORVRJRl9GX1RTTzYgfCBORVRJRl9GX1RTT19FQ047CisJaWYgKHVzaW5nX2RhYykKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKworCWVuaWMtPmNzdW1fcnhfZW5hYmxlZCA9IEVOSUNfU0VUVElORyhlbmljLCBSWENTVU0pOworCisJaWYgKEVOSUNfU0VUVElORyhlbmljLCBMUk8pKSB7CisJCWVuaWMtPmxyb19tZ3IubWF4X2FnZ3IgPSBFTklDX0xST19NQVhfQUdHUjsKKwkJZW5pYy0+bHJvX21nci5tYXhfZGVzYyA9IEVOSUNfTFJPX01BWF9ERVNDOworCQllbmljLT5scm9fbWdyLmxyb19hcnIgPSBlbmljLT5scm9fZGVzYzsKKwkJZW5pYy0+bHJvX21nci5nZXRfc2tiX2hlYWRlciA9IGVuaWNfZ2V0X3NrYl9oZWFkZXI7CisJCWVuaWMtPmxyb19tZ3IuZmVhdHVyZXMJPSBMUk9fRl9OQVBJIHwgTFJPX0ZfRVhUUkFDVF9WTEFOX0lEOworCQllbmljLT5scm9fbWdyLmRldiA9IG5ldGRldjsKKwkJZW5pYy0+bHJvX21nci5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKKwkJZW5pYy0+bHJvX21nci5pcF9zdW1tZWRfYWdnciA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV92bmljX3Jlc291cmNlczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3ZuaWNfcmVzb3VyY2VzOgorCWVuaWNfZnJlZV92bmljX3Jlc291cmNlcyhlbmljKTsKK2Vycl9vdXRfZGV2X2Nsb3NlOgorCXZuaWNfZGV2X2Nsb3NlKGVuaWMtPnZkZXYpOworZXJyX291dF92bmljX3VucmVnaXN0ZXI6CisJZW5pY19jbGVhcl9pbnRyX21vZGUoZW5pYyk7CisJdm5pY19kZXZfdW5yZWdpc3RlcihlbmljLT52ZGV2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwllbmljX2lvdW5tYXAoZW5pYyk7CitlcnJfb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVuaWNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAobmV0ZGV2KSB7CisJCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCQllbmljX2ZyZWVfdm5pY19yZXNvdXJjZXMoZW5pYyk7CisJCXZuaWNfZGV2X2Nsb3NlKGVuaWMtPnZkZXYpOworCQllbmljX2NsZWFyX2ludHJfbW9kZShlbmljKTsKKwkJdm5pY19kZXZfdW5yZWdpc3RlcihlbmljLT52ZGV2KTsKKwkJZW5pY19pb3VubWFwKGVuaWMpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlbmljX2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGVuaWNfaWRfdGFibGUsCisJLnByb2JlID0gZW5pY19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZW5pY19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW5pY19pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gUEZYICIlcywgdmVyICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlbmljX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbmljX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlbmljX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGVuaWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZW5pY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmMgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxODRiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19yZXMuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJ3cV9lbmV0X2Rlc2MuaCIKKyNpbmNsdWRlICJycV9lbmV0X2Rlc2MuaCIKKyNpbmNsdWRlICJjcV9lbmV0X2Rlc2MuaCIKKyNpbmNsdWRlICJ2bmljX3Jlc291cmNlLmgiCisjaW5jbHVkZSAidm5pY19lbmV0LmgiCisjaW5jbHVkZSAidm5pY19kZXYuaCIKKyNpbmNsdWRlICJ2bmljX3dxLmgiCisjaW5jbHVkZSAidm5pY19ycS5oIgorI2luY2x1ZGUgInZuaWNfY3EuaCIKKyNpbmNsdWRlICJ2bmljX2ludHIuaCIKKyNpbmNsdWRlICJ2bmljX3N0YXRzLmgiCisjaW5jbHVkZSAidm5pY19uaWMuaCIKKyNpbmNsdWRlICJ2bmljX3Jzcy5oIgorI2luY2x1ZGUgImVuaWNfcmVzLmgiCisjaW5jbHVkZSAiZW5pYy5oIgorCitpbnQgZW5pY19nZXRfdm5pY19jb25maWcoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJc3RydWN0IHZuaWNfZW5ldF9jb25maWcgKmMgPSAmZW5pYy0+Y29uZmlnOworCWludCBlcnI7CisKKwllcnIgPSB2bmljX2Rldl9tYWNfYWRkcihlbmljLT52ZGV2LCBlbmljLT5tYWNfYWRkcik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFcnJvciBnZXR0aW5nIE1BQyBhZGRyLCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKyNkZWZpbmUgR0VUX0NPTkZJRyhtKSBcCisJZG8geyBcCisJCWVyciA9IHZuaWNfZGV2X3NwZWMoZW5pYy0+dmRldiwgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IHZuaWNfZW5ldF9jb25maWcsIG0pLCBcCisJCQlzaXplb2YoYy0+bSksICZjLT5tKTsgXAorCQlpZiAoZXJyKSB7IFwKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggXAorCQkJCSJFcnJvciBnZXR0aW5nICVzLCAlZFxuIiwgI20sIGVycik7IFwKKwkJCXJldHVybiBlcnI7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworCUdFVF9DT05GSUcoZmxhZ3MpOworCUdFVF9DT05GSUcod3FfZGVzY19jb3VudCk7CisJR0VUX0NPTkZJRyhycV9kZXNjX2NvdW50KTsKKwlHRVRfQ09ORklHKG10dSk7CisJR0VUX0NPTkZJRyhpbnRyX3RpbWVyKTsKKwlHRVRfQ09ORklHKGludHJfdGltZXJfdHlwZSk7CisJR0VUX0NPTkZJRyhpbnRyX21vZGUpOworCisJYy0+d3FfZGVzY19jb3VudCA9CisJCW1pbl90KHUzMiwgRU5JQ19NQVhfV1FfREVTQ1MsCisJCW1heF90KHUzMiwgRU5JQ19NSU5fV1FfREVTQ1MsCisJCWMtPndxX2Rlc2NfY291bnQpKTsKKwljLT53cV9kZXNjX2NvdW50ICY9IDB4ZmZmZmZmZjA7IC8qIG11c3QgYmUgYWxpZ25lZCB0byBncm91cHMgb2YgMTYgKi8KKworCWMtPnJxX2Rlc2NfY291bnQgPQorCQltaW5fdCh1MzIsIEVOSUNfTUFYX1JRX0RFU0NTLAorCQltYXhfdCh1MzIsIEVOSUNfTUlOX1JRX0RFU0NTLAorCQljLT5ycV9kZXNjX2NvdW50KSk7CisJYy0+cnFfZGVzY19jb3VudCAmPSAweGZmZmZmZmYwOyAvKiBtdXN0IGJlIGFsaWduZWQgdG8gZ3JvdXBzIG9mIDE2ICovCisKKwlpZiAoYy0+bXR1ID09IDApCisJCWMtPm10dSA9IDE1MDA7CisJYy0+bXR1ID0gbWluX3QodTE2LCBFTklDX01BWF9NVFUsCisJCW1heF90KHUxNiwgRU5JQ19NSU5fTVRVLAorCQljLT5tdHUpKTsKKworCWMtPmludHJfdGltZXIgPSBtaW5fdCh1MTYsIFZOSUNfSU5UUl9USU1FUl9NQVgsIGMtPmludHJfdGltZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInZOSUMgTUFDIGFkZHIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggIgorCQkid3EvcnEgJWQvJWRcbiIsCisJCWVuaWMtPm1hY19hZGRyWzBdLCBlbmljLT5tYWNfYWRkclsxXSwgZW5pYy0+bWFjX2FkZHJbMl0sCisJCWVuaWMtPm1hY19hZGRyWzNdLCBlbmljLT5tYWNfYWRkcls0XSwgZW5pYy0+bWFjX2FkZHJbNV0sCisJCWMtPndxX2Rlc2NfY291bnQsIGMtPnJxX2Rlc2NfY291bnQpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJ2TklDIG10dSAlZCBjc3VtIHR4L3J4ICVkLyVkIHRzby9scm8gJWQvJWQgIgorCQkiaW50ciB0aW1lciAlZFxuIiwKKwkJYy0+bXR1LCBFTklDX1NFVFRJTkcoZW5pYywgVFhDU1VNKSwKKwkJRU5JQ19TRVRUSU5HKGVuaWMsIFJYQ1NVTSksIEVOSUNfU0VUVElORyhlbmljLCBUU08pLAorCQlFTklDX1NFVFRJTkcoZW5pYywgTFJPKSwgYy0+aW50cl90aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmljX2FkZF9zdGF0aW9uX2FkZHIoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJdm5pY19kZXZfYWRkX2FkZHIoZW5pYy0+dmRldiwgZW5pYy0+bWFjX2FkZHIpOworfQorCit2b2lkIGVuaWNfYWRkX211bHRpY2FzdF9hZGRyKHN0cnVjdCBlbmljICplbmljLCB1OCAqYWRkcikKK3sKKwl2bmljX2Rldl9hZGRfYWRkcihlbmljLT52ZGV2LCBhZGRyKTsKK30KKwordm9pZCBlbmljX2RlbF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpCit7CisJdm5pY19kZXZfZGVsX2FkZHIoZW5pYy0+dmRldiwgYWRkcik7Cit9CisKK3ZvaWQgZW5pY19hZGRfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCkKK3sKKwl1NjQgYTAgPSB2bGFuaWQsIGExID0gMDsKKwlpbnQgd2FpdCA9IDEwMDA7CisJaW50IGVycjsKKworCWVyciA9IHZuaWNfZGV2X2NtZChlbmljLT52ZGV2LCBDTURfVkxBTl9BREQsICZhMCwgJmExLCB3YWl0KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBhZGQgdmxhbiBpZCwgJWRcbiIsIGVycik7Cit9CisKK3ZvaWQgZW5pY19kZWxfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCkKK3sKKwl1NjQgYTAgPSB2bGFuaWQsIGExID0gMDsKKwlpbnQgd2FpdCA9IDEwMDA7CisJaW50IGVycjsKKworCWVyciA9IHZuaWNfZGV2X2NtZChlbmljLT52ZGV2LCBDTURfVkxBTl9ERUwsICZhMCwgJmExLCB3YWl0KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBkZWxldGUgdmxhbiBpZCwgJWRcbiIsIGVycik7Cit9CisKK2ludCBlbmljX3NldF9uaWNfY2ZnKHN0cnVjdCBlbmljICplbmljLCB1OCByc3NfZGVmYXVsdF9jcHUsIHU4IHJzc19oYXNoX3R5cGUsCisJdTggcnNzX2hhc2hfYml0cywgdTggcnNzX2Jhc2VfY3B1LCB1OCByc3NfZW5hYmxlLCB1OCB0c29faXBpZF9zcGxpdF9lbiwKKwl1OCBpZ192bGFuX3N0cmlwX2VuKQoreworCXU2NCBhMCwgYTE7CisJdTMyIG5pY19jZmc7CisJaW50IHdhaXQgPSAxMDAwOworCisJdm5pY19zZXRfbmljX2NmZygmbmljX2NmZywgcnNzX2RlZmF1bHRfY3B1LAorCQlyc3NfaGFzaF90eXBlLCByc3NfaGFzaF9iaXRzLCByc3NfYmFzZV9jcHUsCisJCXJzc19lbmFibGUsIHRzb19pcGlkX3NwbGl0X2VuLCBpZ192bGFuX3N0cmlwX2VuKTsKKworCWEwID0gbmljX2NmZzsKKwlhMSA9IDA7CisKKwlyZXR1cm4gdm5pY19kZXZfY21kKGVuaWMtPnZkZXYsIENNRF9OSUNfQ0ZHLCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK3ZvaWQgZW5pY19mcmVlX3ZuaWNfcmVzb3VyY2VzKHN0cnVjdCBlbmljICplbmljKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPndxX2NvdW50OyBpKyspCisJCXZuaWNfd3FfZnJlZSgmZW5pYy0+d3FbaV0pOworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5ycV9jb3VudDsgaSsrKQorCQl2bmljX3JxX2ZyZWUoJmVuaWMtPnJxW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+Y3FfY291bnQ7IGkrKykKKwkJdm5pY19jcV9mcmVlKCZlbmljLT5jcVtpXSk7CisJZm9yIChpID0gMDsgaSA8IGVuaWMtPmludHJfY291bnQ7IGkrKykKKwkJdm5pY19pbnRyX2ZyZWUoJmVuaWMtPmludHJbaV0pOworfQorCit2b2lkIGVuaWNfZ2V0X3Jlc19jb3VudHMoc3RydWN0IGVuaWMgKmVuaWMpCit7CisJZW5pYy0+d3FfY291bnQgPSB2bmljX2Rldl9nZXRfcmVzX2NvdW50KGVuaWMtPnZkZXYsIFJFU19UWVBFX1dRKTsKKwllbmljLT5ycV9jb3VudCA9IHZuaWNfZGV2X2dldF9yZXNfY291bnQoZW5pYy0+dmRldiwgUkVTX1RZUEVfUlEpOworCWVuaWMtPmNxX2NvdW50ID0gdm5pY19kZXZfZ2V0X3Jlc19jb3VudChlbmljLT52ZGV2LCBSRVNfVFlQRV9DUSk7CisJZW5pYy0+aW50cl9jb3VudCA9IHZuaWNfZGV2X2dldF9yZXNfY291bnQoZW5pYy0+dmRldiwKKwkJUkVTX1RZUEVfSU5UUl9DVFJMKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJ2TklDIHJlc291cmNlcyBhdmFpbDogIgorCQkid3EgJWQgcnEgJWQgY3EgJWQgaW50ciAlZFxuIiwKKwkJZW5pYy0+d3FfY291bnQsIGVuaWMtPnJxX2NvdW50LAorCQllbmljLT5jcV9jb3VudCwgZW5pYy0+aW50cl9jb3VudCk7Cit9CisKK3ZvaWQgZW5pY19pbml0X3ZuaWNfcmVzb3VyY2VzKHN0cnVjdCBlbmljICplbmljKQoreworCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZTsKKwl1bnNpZ25lZCBpbnQgbWFza19vbl9hc3NlcnRpb247CisJdW5zaWduZWQgaW50IGludGVycnVwdF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9lbmFibGU7CisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGNxX2luZGV4OworCXVuc2lnbmVkIGludCBpOworCisJaW50cl9tb2RlID0gdm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KTsKKworCS8qIEluaXQgUlEvV1EgcmVzb3VyY2VzLgorCSAqCisJICogUlFbMCAtIG4tMV0gcG9pbnQgdG8gQ1FbMCAtIG4tMV0KKwkgKiBXUVswIC0gbS0xXSBwb2ludCB0byBDUVtuIC0gbittLTFdCisJICoKKwkgKiBFcnJvciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgZm9yIE1TSS4KKwkgKi8KKworCXN3aXRjaCAoaW50cl9tb2RlKSB7CisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfSU5UWDoKKwljYXNlIFZOSUNfREVWX0lOVFJfTU9ERV9NU0lYOgorCQllcnJvcl9pbnRlcnJ1cHRfZW5hYmxlID0gMTsKKwkJZXJyb3JfaW50ZXJydXB0X29mZnNldCA9IGVuaWMtPmludHJfY291bnQgLSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcl9pbnRlcnJ1cHRfZW5hYmxlID0gMDsKKwkJZXJyb3JfaW50ZXJydXB0X29mZnNldCA9IDA7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5ycV9jb3VudDsgaSsrKSB7CisJCWNxX2luZGV4ID0gaTsKKwkJdm5pY19ycV9pbml0KCZlbmljLT5ycVtpXSwKKwkJCWNxX2luZGV4LAorCQkJZXJyb3JfaW50ZXJydXB0X2VuYWJsZSwKKwkJCWVycm9yX2ludGVycnVwdF9vZmZzZXQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT53cV9jb3VudDsgaSsrKSB7CisJCWNxX2luZGV4ID0gZW5pYy0+cnFfY291bnQgKyBpOworCQl2bmljX3dxX2luaXQoJmVuaWMtPndxW2ldLAorCQkJY3FfaW5kZXgsCisJCQllcnJvcl9pbnRlcnJ1cHRfZW5hYmxlLAorCQkJZXJyb3JfaW50ZXJydXB0X29mZnNldCk7CisJfQorCisJLyogSW5pdCBDUSByZXNvdXJjZXMKKwkgKgorCSAqIENRWzAgLSBuK20tMV0gcG9pbnQgdG8gSU5UUlswXSBmb3IgSU5UeCwgTVNJCisJICogQ1FbMCAtIG4rbS0xXSBwb2ludCB0byBJTlRSWzAgLSBuK20tMV0gZm9yIE1TSS1YCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+Y3FfY291bnQ7IGkrKykgeworCisJCXN3aXRjaCAoaW50cl9tb2RlKSB7CisJCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSVg6CisJCQlpbnRlcnJ1cHRfb2Zmc2V0ID0gaTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW50ZXJydXB0X29mZnNldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXZuaWNfY3FfaW5pdCgmZW5pYy0+Y3FbaV0sCisJCQkwIC8qIGZsb3dfY29udHJvbF9lbmFibGUgKi8sCisJCQkxIC8qIGNvbG9yX2VuYWJsZSAqLywKKwkJCTAgLyogY3FfaGVhZCAqLywKKwkJCTAgLyogY3FfdGFpbCAqLywKKwkJCTEgLyogY3FfdGFpbF9jb2xvciAqLywKKwkJCTEgLyogaW50ZXJydXB0X2VuYWJsZSAqLywKKwkJCTEgLyogY3FfZW50cnlfZW5hYmxlICovLAorCQkJMCAvKiBjcV9tZXNzYWdlX2VuYWJsZSAqLywKKwkJCWludGVycnVwdF9vZmZzZXQsCisJCQkwIC8qIGNxX21lc3NhZ2VfYWRkciAqLyk7CisJfQorCisJLyogSW5pdCBJTlRSIHJlc291cmNlcworCSAqCisJICogbWFza19vbl9hc3NlcnRpb24gaXMgbm90IHVzZWQgZm9yIElOVHggZHVlIHRvIHRoZSBsZXZlbC0KKwkgKiB0cmlnZ2VyZWQgbmF0dXJlIG9mIElOVHgKKwkgKi8KKworCXN3aXRjaCAoaW50cl9tb2RlKSB7CisJY2FzZSBWTklDX0RFVl9JTlRSX01PREVfTVNJOgorCWNhc2UgVk5JQ19ERVZfSU5UUl9NT0RFX01TSVg6CisJCW1hc2tfb25fYXNzZXJ0aW9uID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWFza19vbl9hc3NlcnRpb24gPSAwOworCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+aW50cl9jb3VudDsgaSsrKSB7CisJCXZuaWNfaW50cl9pbml0KCZlbmljLT5pbnRyW2ldLAorCQkJZW5pYy0+Y29uZmlnLmludHJfdGltZXIsCisJCQllbmljLT5jb25maWcuaW50cl90aW1lcl90eXBlLAorCQkJbWFza19vbl9hc3NlcnRpb24pOworCX0KKworCS8qIENsZWFyIExJRiBzdGF0cworCSAqLworCisJdm5pY19kZXZfc3RhdHNfY2xlYXIoZW5pYy0+dmRldik7Cit9CisKK2ludCBlbmljX2FsbG9jX3ZuaWNfcmVzb3VyY2VzKHN0cnVjdCBlbmljICplbmljKQoreworCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJaW50cl9tb2RlID0gdm5pY19kZXZfZ2V0X2ludHJfbW9kZShlbmljLT52ZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJ2TklDIHJlc291cmNlcyB1c2VkOiAgIgorCQkid3EgJWQgcnEgJWQgY3EgJWQgaW50ciAlZCBpbnRyIG1vZGUgJXNcbiIsCisJCWVuaWMtPndxX2NvdW50LCBlbmljLT5ycV9jb3VudCwKKwkJZW5pYy0+Y3FfY291bnQsIGVuaWMtPmludHJfY291bnQsCisJCWludHJfbW9kZSA9PSBWTklDX0RFVl9JTlRSX01PREVfSU5UWCA/ICJsZWdhY3kgUENJIElOVHgiIDoKKwkJaW50cl9tb2RlID09IFZOSUNfREVWX0lOVFJfTU9ERV9NU0kgPyAiTVNJIiA6CisJCWludHJfbW9kZSA9PSBWTklDX0RFVl9JTlRSX01PREVfTVNJWCA/ICJNU0ktWCIgOgorCQkidW5rbm93biIKKwkJKTsKKworCS8qIEFsbG9jYXRlIHF1ZXVlIHJlc291cmNlcworCSAqLworCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPndxX2NvdW50OyBpKyspIHsKKwkJZXJyID0gdm5pY193cV9hbGxvYyhlbmljLT52ZGV2LCAmZW5pYy0+d3FbaV0sIGksCisJCQllbmljLT5jb25maWcud3FfZGVzY19jb3VudCwKKwkJCXNpemVvZihzdHJ1Y3Qgd3FfZW5ldF9kZXNjKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXRfY2xlYW51cDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5pYy0+cnFfY291bnQ7IGkrKykgeworCQllcnIgPSB2bmljX3JxX2FsbG9jKGVuaWMtPnZkZXYsICZlbmljLT5ycVtpXSwgaSwKKwkJCWVuaWMtPmNvbmZpZy5ycV9kZXNjX2NvdW50LAorCQkJc2l6ZW9mKHN0cnVjdCBycV9lbmV0X2Rlc2MpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dF9jbGVhbnVwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlbmljLT5jcV9jb3VudDsgaSsrKSB7CisJCWlmIChpIDwgZW5pYy0+cnFfY291bnQpCisJCQllcnIgPSB2bmljX2NxX2FsbG9jKGVuaWMtPnZkZXYsICZlbmljLT5jcVtpXSwgaSwKKwkJCQllbmljLT5jb25maWcucnFfZGVzY19jb3VudCwKKwkJCQlzaXplb2Yoc3RydWN0IGNxX2VuZXRfcnFfZGVzYykpOworCQllbHNlCisJCQllcnIgPSB2bmljX2NxX2FsbG9jKGVuaWMtPnZkZXYsICZlbmljLT5jcVtpXSwgaSwKKwkJCQllbmljLT5jb25maWcud3FfZGVzY19jb3VudCwKKwkJCQlzaXplb2Yoc3RydWN0IGNxX2VuZXRfd3FfZGVzYykpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X2NsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGVuaWMtPmludHJfY291bnQ7IGkrKykgeworCQllcnIgPSB2bmljX2ludHJfYWxsb2MoZW5pYy0+dmRldiwgJmVuaWMtPmludHJbaV0sIGkpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X2NsZWFudXA7CisJfQorCisJLyogSG9vayByZW1haW5pbmcgcmVzb3VyY2UKKwkgKi8KKworCWVuaWMtPmxlZ2FjeV9wYmEgPSB2bmljX2Rldl9nZXRfcmVzKGVuaWMtPnZkZXYsCisJCVJFU19UWVBFX0lOVFJfUEJBX0xFR0FDWSwgMCk7CisJaWYgKCFlbmljLT5sZWdhY3lfcGJhICYmIGludHJfbW9kZSA9PSBWTklDX0RFVl9JTlRSX01PREVfSU5UWCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gaG9vayBsZWdhY3kgcGJhIHJlc291cmNlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2NsZWFudXA7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYW51cDoKKwllbmljX2ZyZWVfdm5pY19yZXNvdXJjZXMoZW5pYyk7CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX3Jlcy5oIGIvZHJpdmVycy9uZXQvZW5pYy9lbmljX3Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTM0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfcmVzLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9FTklDX1JFU19IXworI2RlZmluZSBfRU5JQ19SRVNfSF8KKworI2luY2x1ZGUgIndxX2VuZXRfZGVzYy5oIgorI2luY2x1ZGUgInJxX2VuZXRfZGVzYy5oIgorI2luY2x1ZGUgInZuaWNfd3EuaCIKKyNpbmNsdWRlICJ2bmljX3JxLmgiCisKKyNkZWZpbmUgRU5JQ19NSU5fV1FfREVTQ1MJCTY0CisjZGVmaW5lIEVOSUNfTUFYX1dRX0RFU0NTCQk0MDk2CisjZGVmaW5lIEVOSUNfTUlOX1JRX0RFU0NTCQk2NAorI2RlZmluZSBFTklDX01BWF9SUV9ERVNDUwkJNDA5NgorCisjZGVmaW5lIEVOSUNfTUlOX01UVQkJCTU3NiAgLyogbWluaW11bSBmb3IgSVB2NCAqLworI2RlZmluZSBFTklDX01BWF9NVFUJCQk5MDAwCisKKyNkZWZpbmUgRU5JQ19NVUxUSUNBU1RfUEVSRkVDVF9GSUxURVJTCTMyCisKKyNkZWZpbmUgRU5JQ19OT05fVFNPX01BWF9ERVNDCQkxNgorCisjZGVmaW5lIEVOSUNfU0VUVElORyhlbmljLCBmKSAoKGVuaWMtPmNvbmZpZy5mbGFncyAmIFZFTkVURl8jI2YpID8gMSA6IDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX2Rlc2NfZXgoc3RydWN0IHZuaWNfd3EgKndxLAorCXZvaWQgKm9zX2J1ZiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbiwKKwl1bnNpZ25lZCBpbnQgbXNzX29yX2NzdW1fb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKKwlpbnQgdmxhbl90YWdfaW5zZXJ0LCB1bnNpZ25lZCBpbnQgdmxhbl90YWcsCisJaW50IG9mZmxvYWRfbW9kZSwgaW50IGNxX2VudHJ5LCBpbnQgc29wLCBpbnQgZW9wKQoreworCXN0cnVjdCB3cV9lbmV0X2Rlc2MgKmRlc2MgPSB2bmljX3dxX25leHRfZGVzYyh3cSk7CisKKwl3cV9lbmV0X2Rlc2NfZW5jKGRlc2MsCisJCSh1NjQpZG1hX2FkZHIgfCBWTklDX1BBRERSX1RBUkdFVCwKKwkJKHUxNilsZW4sCisJCSh1MTYpbXNzX29yX2NzdW1fb2Zmc2V0LAorCQkodTE2KWhkcl9sZW4sICh1OClvZmZsb2FkX21vZGUsCisJCSh1OCllb3AsICh1OCljcV9lbnRyeSwKKwkJMCwgLyogZmNvZV9lbmNhcCAqLworCQkodTgpdmxhbl90YWdfaW5zZXJ0LAorCQkodTE2KXZsYW5fdGFnLAorCQkwIC8qIGxvb3BiYWNrICovKTsKKworCXdtYigpOworCisJdm5pY193cV9wb3N0KHdxLCBvc19idWYsIGRtYV9hZGRyLCBsZW4sIHNvcCwgZW9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuaWNfcXVldWVfd3FfZGVzY19jb250KHN0cnVjdCB2bmljX3dxICp3cSwKKwl2b2lkICpvc19idWYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCBlb3ApCit7CisJZW5pY19xdWV1ZV93cV9kZXNjX2V4KHdxLCBvc19idWYsIGRtYV9hZGRyLCBsZW4sCisJCTAsIDAsIDAsIDAsIDAsCisJCWVvcCwgMCAvKiAhU09QICovLCBlb3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5pY19xdWV1ZV93cV9kZXNjKHN0cnVjdCB2bmljX3dxICp3cSwgdm9pZCAqb3NfYnVmLAorCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCB2bGFuX3RhZ19pbnNlcnQsCisJdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgZW9wKQoreworCWVuaWNfcXVldWVfd3FfZGVzY19leCh3cSwgb3NfYnVmLCBkbWFfYWRkciwgbGVuLAorCQkwLCAwLCB2bGFuX3RhZ19pbnNlcnQsIHZsYW5fdGFnLAorCQlXUV9FTkVUX09GRkxPQURfTU9ERV9DU1VNLAorCQllb3AsIDEgLyogU09QICovLCBlb3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5pY19xdWV1ZV93cV9kZXNjX2NzdW0oc3RydWN0IHZuaWNfd3EgKndxLAorCXZvaWQgKm9zX2J1ZiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbiwKKwlpbnQgaXBfY3N1bSwgaW50IHRjcHVkcF9jc3VtLCBpbnQgdmxhbl90YWdfaW5zZXJ0LAorCXVuc2lnbmVkIGludCB2bGFuX3RhZywgaW50IGVvcCkKK3sKKwllbmljX3F1ZXVlX3dxX2Rlc2NfZXgod3EsIG9zX2J1ZiwgZG1hX2FkZHIsIGxlbiwKKwkJKGlwX2NzdW0gPyAxIDogMCkgKyAodGNwdWRwX2NzdW0gPyAyIDogMCksCisJCTAsIHZsYW5fdGFnX2luc2VydCwgdmxhbl90YWcsCisJCVdRX0VORVRfT0ZGTE9BRF9NT0RFX0NTVU0sCisJCWVvcCwgMSAvKiBTT1AgKi8sIGVvcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmljX3F1ZXVlX3dxX2Rlc2NfY3N1bV9sNChzdHJ1Y3Qgdm5pY193cSAqd3EsCisJdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAorCXVuc2lnbmVkIGludCBjc3VtX29mZnNldCwgdW5zaWduZWQgaW50IGhkcl9sZW4sCisJaW50IHZsYW5fdGFnX2luc2VydCwgdW5zaWduZWQgaW50IHZsYW5fdGFnLCBpbnQgZW9wKQoreworCWVuaWNfcXVldWVfd3FfZGVzY19leCh3cSwgb3NfYnVmLCBkbWFfYWRkciwgbGVuLAorCQljc3VtX29mZnNldCwgaGRyX2xlbiwgdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywKKwkJV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTV9MNCwKKwkJZW9wLCAxIC8qIFNPUCAqLywgZW9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuaWNfcXVldWVfd3FfZGVzY190c28oc3RydWN0IHZuaWNfd3EgKndxLAorCXZvaWQgKm9zX2J1ZiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbiwKKwl1bnNpZ25lZCBpbnQgbXNzLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwgaW50IHZsYW5fdGFnX2luc2VydCwKKwl1bnNpZ25lZCBpbnQgdmxhbl90YWcsIGludCBlb3ApCit7CisJZW5pY19xdWV1ZV93cV9kZXNjX2V4KHdxLCBvc19idWYsIGRtYV9hZGRyLCBsZW4sCisJCW1zcywgaGRyX2xlbiwgdmxhbl90YWdfaW5zZXJ0LCB2bGFuX3RhZywKKwkJV1FfRU5FVF9PRkZMT0FEX01PREVfVFNPLAorCQllb3AsIDEgLyogU09QICovLCBlb3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5pY19xdWV1ZV9ycV9kZXNjKHN0cnVjdCB2bmljX3JxICpycSwKKwl2b2lkICpvc19idWYsIHVuc2lnbmVkIGludCBvc19idWZfaW5kZXgsCisJZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnFfZW5ldF9kZXNjICpkZXNjID0gdm5pY19ycV9uZXh0X2Rlc2MocnEpOworCXU4IHR5cGUgPSBvc19idWZfaW5kZXggPworCQlSUV9FTkVUX1RZUEVfTk9UX1NPUCA6IFJRX0VORVRfVFlQRV9PTkxZX1NPUDsKKworCXJxX2VuZXRfZGVzY19lbmMoZGVzYywKKwkJKHU2NClkbWFfYWRkciB8IFZOSUNfUEFERFJfVEFSR0VULAorCQl0eXBlLCAodTE2KWxlbik7CisKKwl3bWIoKTsKKworCXZuaWNfcnFfcG9zdChycSwgb3NfYnVmLCBvc19idWZfaW5kZXgsIGRtYV9hZGRyLCBsZW4pOworfQorCitzdHJ1Y3QgZW5pYzsKKworaW50IGVuaWNfZ2V0X3ZuaWNfY29uZmlnKHN0cnVjdCBlbmljICopOwordm9pZCBlbmljX2FkZF9zdGF0aW9uX2FkZHIoc3RydWN0IGVuaWMgKmVuaWMpOwordm9pZCBlbmljX2FkZF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpOwordm9pZCBlbmljX2RlbF9tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpOwordm9pZCBlbmljX2FkZF92bGFuKHN0cnVjdCBlbmljICplbmljLCB1MTYgdmxhbmlkKTsKK3ZvaWQgZW5pY19kZWxfdmxhbihzdHJ1Y3QgZW5pYyAqZW5pYywgdTE2IHZsYW5pZCk7CitpbnQgZW5pY19zZXRfbmljX2NmZyhzdHJ1Y3QgZW5pYyAqZW5pYywgdTggcnNzX2RlZmF1bHRfY3B1LCB1OCByc3NfaGFzaF90eXBlLAorCXU4IHJzc19oYXNoX2JpdHMsIHU4IHJzc19iYXNlX2NwdSwgdTggcnNzX2VuYWJsZSwgdTggdHNvX2lwaWRfc3BsaXRfZW4sCisJdTggaWdfdmxhbl9zdHJpcF9lbik7Cit2b2lkIGVuaWNfZ2V0X3Jlc19jb3VudHMoc3RydWN0IGVuaWMgKmVuaWMpOwordm9pZCBlbmljX2luaXRfdm5pY19yZXNvdXJjZXMoc3RydWN0IGVuaWMgKmVuaWMpOworaW50IGVuaWNfYWxsb2Nfdm5pY19yZXNvdXJjZXMoc3RydWN0IGVuaWMgKik7Cit2b2lkIGVuaWNfZnJlZV92bmljX3Jlc291cmNlcyhzdHJ1Y3QgZW5pYyAqKTsKKworI2VuZGlmIC8qIF9FTklDX1JFU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9ycV9lbmV0X2Rlc2MuaCBiL2RyaXZlcnMvbmV0L2VuaWMvcnFfZW5ldF9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2ZTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvcnFfZW5ldF9kZXNjLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1JRX0VORVRfREVTQ19IXworI2RlZmluZSBfUlFfRU5FVF9ERVNDX0hfCisKKy8qIEV0aGVybmV0IHJlY2VpdmUgcXVldWUgZGVzY3JpcHRvcjogMTZCICovCitzdHJ1Y3QgcnFfZW5ldF9kZXNjIHsKKwlfX2xlNjQgYWRkcmVzczsKKwlfX2xlMTYgbGVuZ3RoX3R5cGU7CisJdTggcmVzZXJ2ZWRbNl07Cit9OworCitlbnVtIHJxX2VuZXRfdHlwZV90eXBlcyB7CisJUlFfRU5FVF9UWVBFX09OTFlfU09QID0gMCwKKwlSUV9FTkVUX1RZUEVfTk9UX1NPUCA9IDEsCisJUlFfRU5FVF9UWVBFX1JFU1YyID0gMiwKKwlSUV9FTkVUX1RZUEVfUkVTVjMgPSAzLAorfTsKKworI2RlZmluZSBSUV9FTkVUX0FERFJfQklUUwkJNjQKKyNkZWZpbmUgUlFfRU5FVF9MRU5fQklUUwkJMTQKKyNkZWZpbmUgUlFfRU5FVF9MRU5fTUFTSwkJKCgxIDw8IFJRX0VORVRfTEVOX0JJVFMpIC0gMSkKKyNkZWZpbmUgUlFfRU5FVF9UWVBFX0JJVFMJCTIKKyNkZWZpbmUgUlFfRU5FVF9UWVBFX01BU0sJCSgoMSA8PCBSUV9FTkVUX1RZUEVfQklUUykgLSAxKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnFfZW5ldF9kZXNjX2VuYyhzdHJ1Y3QgcnFfZW5ldF9kZXNjICpkZXNjLAorCXU2NCBhZGRyZXNzLCB1OCB0eXBlLCB1MTYgbGVuZ3RoKQoreworCWRlc2MtPmFkZHJlc3MgPSBjcHVfdG9fbGU2NChhZGRyZXNzKTsKKwlkZXNjLT5sZW5ndGhfdHlwZSA9IGNwdV90b19sZTE2KChsZW5ndGggJiBSUV9FTkVUX0xFTl9NQVNLKSB8CisJCSgodHlwZSAmIFJRX0VORVRfVFlQRV9NQVNLKSA8PCBSUV9FTkVUX0xFTl9CSVRTKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycV9lbmV0X2Rlc2NfZGVjKHN0cnVjdCBycV9lbmV0X2Rlc2MgKmRlc2MsCisJdTY0ICphZGRyZXNzLCB1OCAqdHlwZSwgdTE2ICpsZW5ndGgpCit7CisJKmFkZHJlc3MgPSBsZTY0X3RvX2NwdShkZXNjLT5hZGRyZXNzKTsKKwkqbGVuZ3RoID0gbGUxNl90b19jcHUoZGVzYy0+bGVuZ3RoX3R5cGUpICYgUlFfRU5FVF9MRU5fTUFTSzsKKwkqdHlwZSA9ICh1OCkoKGxlMTZfdG9fY3B1KGRlc2MtPmxlbmd0aF90eXBlKSA+PiBSUV9FTkVUX0xFTl9CSVRTKSAmCisJCVJRX0VORVRfVFlQRV9NQVNLKTsKK30KKworI2VuZGlmIC8qIF9SUV9FTkVUX0RFU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2NxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwYWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAidm5pY19kZXYuaCIKKyNpbmNsdWRlICJ2bmljX2NxLmgiCisKK3ZvaWQgdm5pY19jcV9mcmVlKHN0cnVjdCB2bmljX2NxICpjcSkKK3sKKwl2bmljX2Rldl9mcmVlX2Rlc2NfcmluZyhjcS0+dmRldiwgJmNxLT5yaW5nKTsKKworCWNxLT5jdHJsID0gTlVMTDsKK30KKworaW50IHZuaWNfY3FfYWxsb2Moc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3Qgdm5pY19jcSAqY3EsIHVuc2lnbmVkIGludCBpbmRleCwKKwl1bnNpZ25lZCBpbnQgZGVzY19jb3VudCwgdW5zaWduZWQgaW50IGRlc2Nfc2l6ZSkKK3sKKwlpbnQgZXJyOworCisJY3EtPmluZGV4ID0gaW5kZXg7CisJY3EtPnZkZXYgPSB2ZGV2OworCisJY3EtPmN0cmwgPSB2bmljX2Rldl9nZXRfcmVzKHZkZXYsIFJFU19UWVBFX0NRLCBpbmRleCk7CisJaWYgKCFjcS0+Y3RybCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBob29rIENRWyVkXSByZXNvdXJjZVxuIiwgaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnIgPSB2bmljX2Rldl9hbGxvY19kZXNjX3JpbmcodmRldiwgJmNxLT5yaW5nLCBkZXNjX2NvdW50LCBkZXNjX3NpemUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2bmljX2NxX2luaXQoc3RydWN0IHZuaWNfY3EgKmNxLCB1bnNpZ25lZCBpbnQgZmxvd19jb250cm9sX2VuYWJsZSwKKwl1bnNpZ25lZCBpbnQgY29sb3JfZW5hYmxlLCB1bnNpZ25lZCBpbnQgY3FfaGVhZCwgdW5zaWduZWQgaW50IGNxX3RhaWwsCisJdW5zaWduZWQgaW50IGNxX3RhaWxfY29sb3IsIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfZW5hYmxlLAorCXVuc2lnbmVkIGludCBjcV9lbnRyeV9lbmFibGUsIHVuc2lnbmVkIGludCBjcV9tZXNzYWdlX2VuYWJsZSwKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X29mZnNldCwgdTY0IGNxX21lc3NhZ2VfYWRkcikKK3sKKwl1NjQgcGFkZHI7CisKKwlwYWRkciA9ICh1NjQpY3EtPnJpbmcuYmFzZV9hZGRyIHwgVk5JQ19QQUREUl9UQVJHRVQ7CisJd3JpdGVxKHBhZGRyLCAmY3EtPmN0cmwtPnJpbmdfYmFzZSk7CisJaW93cml0ZTMyKGNxLT5yaW5nLmRlc2NfY291bnQsICZjcS0+Y3RybC0+cmluZ19zaXplKTsKKwlpb3dyaXRlMzIoZmxvd19jb250cm9sX2VuYWJsZSwgJmNxLT5jdHJsLT5mbG93X2NvbnRyb2xfZW5hYmxlKTsKKwlpb3dyaXRlMzIoY29sb3JfZW5hYmxlLCAmY3EtPmN0cmwtPmNvbG9yX2VuYWJsZSk7CisJaW93cml0ZTMyKGNxX2hlYWQsICZjcS0+Y3RybC0+Y3FfaGVhZCk7CisJaW93cml0ZTMyKGNxX3RhaWwsICZjcS0+Y3RybC0+Y3FfdGFpbCk7CisJaW93cml0ZTMyKGNxX3RhaWxfY29sb3IsICZjcS0+Y3RybC0+Y3FfdGFpbF9jb2xvcik7CisJaW93cml0ZTMyKGludGVycnVwdF9lbmFibGUsICZjcS0+Y3RybC0+aW50ZXJydXB0X2VuYWJsZSk7CisJaW93cml0ZTMyKGNxX2VudHJ5X2VuYWJsZSwgJmNxLT5jdHJsLT5jcV9lbnRyeV9lbmFibGUpOworCWlvd3JpdGUzMihjcV9tZXNzYWdlX2VuYWJsZSwgJmNxLT5jdHJsLT5jcV9tZXNzYWdlX2VuYWJsZSk7CisJaW93cml0ZTMyKGludGVycnVwdF9vZmZzZXQsICZjcS0+Y3RybC0+aW50ZXJydXB0X29mZnNldCk7CisJd3JpdGVxKGNxX21lc3NhZ2VfYWRkciwgJmNxLT5jdHJsLT5jcV9tZXNzYWdlX2FkZHIpOworfQorCit2b2lkIHZuaWNfY3FfY2xlYW4oc3RydWN0IHZuaWNfY3EgKmNxKQoreworCWNxLT50b19jbGVhbiA9IDA7CisJY3EtPmxhc3RfY29sb3IgPSAwOworCisJaW93cml0ZTMyKDAsICZjcS0+Y3RybC0+Y3FfaGVhZCk7CisJaW93cml0ZTMyKDAsICZjcS0+Y3RybC0+Y3FfdGFpbCk7CisJaW93cml0ZTMyKDEsICZjcS0+Y3RybC0+Y3FfdGFpbF9jb2xvcik7CisKKwl2bmljX2Rldl9jbGVhcl9kZXNjX3JpbmcoJmNxLT5yaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2NxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0NzYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19jcS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfVk5JQ19DUV9IXworI2RlZmluZSBfVk5JQ19DUV9IXworCisjaW5jbHVkZSAiY3FfZGVzYy5oIgorI2luY2x1ZGUgInZuaWNfZGV2LmgiCisKKy8qIENvbXBsZXRpb24gcXVldWUgY29udHJvbCAqLworc3RydWN0IHZuaWNfY3FfY3RybCB7CisJdTY0IHJpbmdfYmFzZTsJCQkvKiAweDAwICovCisJdTMyIHJpbmdfc2l6ZTsJCQkvKiAweDA4ICovCisJdTMyIHBhZDA7CisJdTMyIGZsb3dfY29udHJvbF9lbmFibGU7CS8qIDB4MTAgKi8KKwl1MzIgcGFkMTsKKwl1MzIgY29sb3JfZW5hYmxlOwkJLyogMHgxOCAqLworCXUzMiBwYWQyOworCXUzMiBjcV9oZWFkOwkJCS8qIDB4MjAgKi8KKwl1MzIgcGFkMzsKKwl1MzIgY3FfdGFpbDsJCQkvKiAweDI4ICovCisJdTMyIHBhZDQ7CisJdTMyIGNxX3RhaWxfY29sb3I7CQkvKiAweDMwICovCisJdTMyIHBhZDU7CisJdTMyIGludGVycnVwdF9lbmFibGU7CQkvKiAweDM4ICovCisJdTMyIHBhZDY7CisJdTMyIGNxX2VudHJ5X2VuYWJsZTsJCS8qIDB4NDAgKi8KKwl1MzIgcGFkNzsKKwl1MzIgY3FfbWVzc2FnZV9lbmFibGU7CQkvKiAweDQ4ICovCisJdTMyIHBhZDg7CisJdTMyIGludGVycnVwdF9vZmZzZXQ7CQkvKiAweDUwICovCisJdTMyIHBhZDk7CisJdTY0IGNxX21lc3NhZ2VfYWRkcjsJCS8qIDB4NTggKi8KKwl1MzIgcGFkMTA7Cit9OworCitzdHJ1Y3Qgdm5pY19jcSB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXN0cnVjdCB2bmljX2RldiAqdmRldjsKKwlzdHJ1Y3Qgdm5pY19jcV9jdHJsIF9faW9tZW0gKmN0cmw7ICAgICAgICAgICAgICAvKiBtZW1vcnktbWFwcGVkICovCisJc3RydWN0IHZuaWNfZGV2X3JpbmcgcmluZzsKKwl1bnNpZ25lZCBpbnQgdG9fY2xlYW47CisJdW5zaWduZWQgaW50IGxhc3RfY29sb3I7Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmljX2NxX3NlcnZpY2Uoc3RydWN0IHZuaWNfY3EgKmNxLAorCXVuc2lnbmVkIGludCB3b3JrX3RvX2RvLAorCWludCAoKnFfc2VydmljZSkoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3QgY3FfZGVzYyAqY3FfZGVzYywKKwl1OCB0eXBlLCB1MTYgcV9udW1iZXIsIHUxNiBjb21wbGV0ZWRfaW5kZXgsIHZvaWQgKm9wYXF1ZSksCisJdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBjcV9kZXNjICpjcV9kZXNjOworCXVuc2lnbmVkIGludCB3b3JrX2RvbmUgPSAwOworCXUxNiBxX251bWJlciwgY29tcGxldGVkX2luZGV4OworCXU4IHR5cGUsIGNvbG9yOworCisJY3FfZGVzYyA9IChzdHJ1Y3QgY3FfZGVzYyAqKSgodTggKiljcS0+cmluZy5kZXNjcyArCisJCWNxLT5yaW5nLmRlc2Nfc2l6ZSAqIGNxLT50b19jbGVhbik7CisJY3FfZGVzY19kZWMoY3FfZGVzYywgJnR5cGUsICZjb2xvciwKKwkJJnFfbnVtYmVyLCAmY29tcGxldGVkX2luZGV4KTsKKworCXdoaWxlIChjb2xvciAhPSBjcS0+bGFzdF9jb2xvcikgeworCisJCWlmICgoKnFfc2VydmljZSkoY3EtPnZkZXYsIGNxX2Rlc2MsIHR5cGUsCisJCQlxX251bWJlciwgY29tcGxldGVkX2luZGV4LCBvcGFxdWUpKQorCQkJYnJlYWs7CisKKwkJY3EtPnRvX2NsZWFuKys7CisJCWlmIChjcS0+dG9fY2xlYW4gPT0gY3EtPnJpbmcuZGVzY19jb3VudCkgeworCQkJY3EtPnRvX2NsZWFuID0gMDsKKwkJCWNxLT5sYXN0X2NvbG9yID0gY3EtPmxhc3RfY29sb3IgPyAwIDogMTsKKwkJfQorCisJCWNxX2Rlc2MgPSAoc3RydWN0IGNxX2Rlc2MgKikoKHU4ICopY3EtPnJpbmcuZGVzY3MgKworCQkJY3EtPnJpbmcuZGVzY19zaXplICogY3EtPnRvX2NsZWFuKTsKKwkJY3FfZGVzY19kZWMoY3FfZGVzYywgJnR5cGUsICZjb2xvciwKKwkJCSZxX251bWJlciwgJmNvbXBsZXRlZF9pbmRleCk7CisKKwkJd29ya19kb25lKys7CisJCWlmICh3b3JrX2RvbmUgPj0gd29ya190b19kbykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKK3ZvaWQgdm5pY19jcV9mcmVlKHN0cnVjdCB2bmljX2NxICpjcSk7CitpbnQgdm5pY19jcV9hbGxvYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX2NxICpjcSwgdW5zaWduZWQgaW50IGluZGV4LAorCXVuc2lnbmVkIGludCBkZXNjX2NvdW50LCB1bnNpZ25lZCBpbnQgZGVzY19zaXplKTsKK3ZvaWQgdm5pY19jcV9pbml0KHN0cnVjdCB2bmljX2NxICpjcSwgdW5zaWduZWQgaW50IGZsb3dfY29udHJvbF9lbmFibGUsCisJdW5zaWduZWQgaW50IGNvbG9yX2VuYWJsZSwgdW5zaWduZWQgaW50IGNxX2hlYWQsIHVuc2lnbmVkIGludCBjcV90YWlsLAorCXVuc2lnbmVkIGludCBjcV90YWlsX2NvbG9yLCB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2VuYWJsZSwKKwl1bnNpZ25lZCBpbnQgY3FfZW50cnlfZW5hYmxlLCB1bnNpZ25lZCBpbnQgbWVzc2FnZV9lbmFibGUsCisJdW5zaWduZWQgaW50IGludGVycnVwdF9vZmZzZXQsIHU2NCBtZXNzYWdlX2FkZHIpOwordm9pZCB2bmljX2NxX2NsZWFuKHN0cnVjdCB2bmljX2NxICpjcSk7CisKKyNlbmRpZiAvKiBfVk5JQ19DUV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTA0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmMKQEAgLTAsMCArMSw2NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgInZuaWNfcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ2bmljX2RldmNtZC5oIgorI2luY2x1ZGUgInZuaWNfZGV2LmgiCisjaW5jbHVkZSAidm5pY19zdGF0cy5oIgorCitzdHJ1Y3Qgdm5pY19yZXMgeworCXZvaWQgX19pb21lbSAqdmFkZHI7CisJdW5zaWduZWQgaW50IGNvdW50OworfTsKKworc3RydWN0IHZuaWNfZGV2IHsKKwl2b2lkICpwcml2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCB2bmljX3JlcyByZXNbUkVTX1RZUEVfTUFYXTsKKwllbnVtIHZuaWNfZGV2X2ludHJfbW9kZSBpbnRyX21vZGU7CisJc3RydWN0IHZuaWNfZGV2Y21kIF9faW9tZW0gKmRldmNtZDsKKwlzdHJ1Y3Qgdm5pY19kZXZjbWRfbm90aWZ5ICpub3RpZnk7CisJc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSBub3RpZnlfY29weTsKKwlkbWFfYWRkcl90IG5vdGlmeV9wYTsKKwl1MzIgKmxpbmtzdGF0dXM7CisJZG1hX2FkZHJfdCBsaW5rc3RhdHVzX3BhOworCXN0cnVjdCB2bmljX3N0YXRzICpzdGF0czsKKwlkbWFfYWRkcl90IHN0YXRzX3BhOworCXN0cnVjdCB2bmljX2RldmNtZF9md19pbmZvICpmd19pbmZvOworCWRtYV9hZGRyX3QgZndfaW5mb19wYTsKK307CisKKyNkZWZpbmUgVk5JQ19NQVhfUkVTX0hEUl9TSVpFIFwKKwkoc2l6ZW9mKHN0cnVjdCB2bmljX3Jlc291cmNlX2hlYWRlcikgKyBcCisJc2l6ZW9mKHN0cnVjdCB2bmljX3Jlc291cmNlKSAqIFJFU19UWVBFX01BWCkKKyNkZWZpbmUgVk5JQ19SRVNfU1RSSURFCTEyOAorCit2b2lkICp2bmljX2Rldl9wcml2KHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwlyZXR1cm4gdmRldi0+cHJpdjsKK30KKworc3RhdGljIGludCB2bmljX2Rldl9kaXNjb3Zlcl9yZXMoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXN0cnVjdCB2bmljX2Rldl9iYXIgKmJhcikKK3sKKwlzdHJ1Y3Qgdm5pY19yZXNvdXJjZV9oZWFkZXIgX19pb21lbSAqcmg7CisJc3RydWN0IHZuaWNfcmVzb3VyY2UgX19pb21lbSAqcjsKKwl1OCB0eXBlOworCisJaWYgKGJhci0+bGVuIDwgVk5JQ19NQVhfUkVTX0hEUl9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiAidk5JQyBCQVIwIHJlcyBoZHIgbGVuZ3RoIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmggPSBiYXItPnZhZGRyOworCWlmICghcmgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2TklDIEJBUjAgcmVzIGhkciBub3QgbWVtLW1hcHBlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpb3JlYWQzMigmcmgtPm1hZ2ljKSAhPSBWTklDX1JFU19NQUdJQyB8fAorCSAgICBpb3JlYWQzMigmcmgtPnZlcnNpb24pICE9IFZOSUNfUkVTX1ZFUlNJT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2TklDIEJBUjAgcmVzIG1hZ2ljL3ZlcnNpb24gZXJyb3IgIgorCQkJImV4cCAoJWx4LyVseCkgY3VyciAoJXgvJXgpXG4iLAorCQkJVk5JQ19SRVNfTUFHSUMsIFZOSUNfUkVTX1ZFUlNJT04sCisJCQlpb3JlYWQzMigmcmgtPm1hZ2ljKSwgaW9yZWFkMzIoJnJoLT52ZXJzaW9uKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSAoc3RydWN0IHZuaWNfcmVzb3VyY2UgX19pb21lbSAqKShyaCArIDEpOworCisJd2hpbGUgKCh0eXBlID0gaW9yZWFkOCgmci0+dHlwZSkpICE9IFJFU19UWVBFX0VPTCkgeworCisJCXU4IGJhcl9udW0gPSBpb3JlYWQ4KCZyLT5iYXIpOworCQl1MzIgYmFyX29mZnNldCA9IGlvcmVhZDMyKCZyLT5iYXJfb2Zmc2V0KTsKKwkJdTMyIGNvdW50ID0gaW9yZWFkMzIoJnItPmNvdW50KTsKKwkJdTMyIGxlbjsKKworCQlyKys7CisKKwkJaWYgKGJhcl9udW0gIT0gMCkgIC8qIG9ubHkgbWFwcGluZyBpbiBCQVIwIHJlc291cmNlcyAqLworCQkJY29udGludWU7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgUkVTX1RZUEVfV1E6CisJCWNhc2UgUkVTX1RZUEVfUlE6CisJCWNhc2UgUkVTX1RZUEVfQ1E6CisJCWNhc2UgUkVTX1RZUEVfSU5UUl9DVFJMOgorCQkJLyogZWFjaCBjb3VudCBpcyBzdHJpZGUgYnl0ZXMgbG9uZyAqLworCQkJbGVuID0gY291bnQgKiBWTklDX1JFU19TVFJJREU7CisJCQlpZiAobGVuICsgYmFyX29mZnNldCA+IGJhci0+bGVuKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ2TklDIEJBUjAgcmVzb3VyY2UgJWQgIgorCQkJCQkib3V0LW9mLWJvdW5kcywgb2Zmc2V0IDB4JXggKyAiCisJCQkJCSJzaXplIDB4JXggPiBiYXIgbGVuIDB4JWx4XG4iLAorCQkJCQl0eXBlLCBiYXJfb2Zmc2V0LAorCQkJCQlsZW4sCisJCQkJCWJhci0+bGVuKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJFU19UWVBFX0lOVFJfUEJBX0xFR0FDWToKKwkJY2FzZSBSRVNfVFlQRV9ERVZDTUQ6CisJCQlsZW4gPSBjb3VudDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCX0KKworCQl2ZGV2LT5yZXNbdHlwZV0uY291bnQgPSBjb3VudDsKKwkJdmRldi0+cmVzW3R5cGVdLnZhZGRyID0gKGNoYXIgX19pb21lbSAqKWJhci0+dmFkZHIgKyBiYXJfb2Zmc2V0OworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgdm5pY19kZXZfZ2V0X3Jlc19jb3VudChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsCisJZW51bSB2bmljX3Jlc190eXBlIHR5cGUpCit7CisJcmV0dXJuIHZkZXYtPnJlc1t0eXBlXS5jb3VudDsKK30KKwordm9pZCBfX2lvbWVtICp2bmljX2Rldl9nZXRfcmVzKHN0cnVjdCB2bmljX2RldiAqdmRldiwgZW51bSB2bmljX3Jlc190eXBlIHR5cGUsCisJdW5zaWduZWQgaW50IGluZGV4KQoreworCWlmICghdmRldi0+cmVzW3R5cGVdLnZhZGRyKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUkVTX1RZUEVfV1E6CisJY2FzZSBSRVNfVFlQRV9SUToKKwljYXNlIFJFU19UWVBFX0NROgorCWNhc2UgUkVTX1RZUEVfSU5UUl9DVFJMOgorCQlyZXR1cm4gKGNoYXIgX19pb21lbSAqKXZkZXYtPnJlc1t0eXBlXS52YWRkciArCisJCQlpbmRleCAqIFZOSUNfUkVTX1NUUklERTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKGNoYXIgX19pb21lbSAqKXZkZXYtPnJlc1t0eXBlXS52YWRkcjsKKwl9Cit9CisKK3Vuc2lnbmVkIGludCB2bmljX2Rldl9kZXNjX3Jpbmdfc2l6ZShzdHJ1Y3Qgdm5pY19kZXZfcmluZyAqcmluZywKKwl1bnNpZ25lZCBpbnQgZGVzY19jb3VudCwgdW5zaWduZWQgaW50IGRlc2Nfc2l6ZSkKK3sKKwkvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXNjIHJpbmdzIG11c3QgYmUgNTEyIGJ5dGUgYWxpZ25lZC4KKwkgKiBEZXNjcmlwdG9yIGNvdW50IGlzIGFsaWduZWQgdG8gZ3JvdXBzIG9mIDMyIGRlc2NyaXB0b3JzLiAgQQorCSAqIGNvdW50IG9mIDAgbWVhbnMgdGhlIG1heGltdW0gNDA5NiBkZXNjcmlwdG9ycy4gIERlc2NyaXB0b3IKKwkgKiBzaXplIGlzIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisJICovCisKKwl1bnNpZ25lZCBpbnQgY291bnRfYWxpZ24gPSAzMjsKKwl1bnNpZ25lZCBpbnQgZGVzY19hbGlnbiA9IDE2OworCisJcmluZy0+YmFzZV9hbGlnbiA9IDUxMjsKKworCWlmIChkZXNjX2NvdW50ID09IDApCisJCWRlc2NfY291bnQgPSA0MDk2OworCisJcmluZy0+ZGVzY19jb3VudCA9IEFMSUdOKGRlc2NfY291bnQsIGNvdW50X2FsaWduKTsKKworCXJpbmctPmRlc2Nfc2l6ZSA9IEFMSUdOKGRlc2Nfc2l6ZSwgZGVzY19hbGlnbik7CisKKwlyaW5nLT5zaXplID0gcmluZy0+ZGVzY19jb3VudCAqIHJpbmctPmRlc2Nfc2l6ZTsKKwlyaW5nLT5zaXplX3VuYWxpZ25lZCA9IHJpbmctPnNpemUgKyByaW5nLT5iYXNlX2FsaWduOworCisJcmV0dXJuIHJpbmctPnNpemVfdW5hbGlnbmVkOworfQorCit2b2lkIHZuaWNfZGV2X2NsZWFyX2Rlc2NfcmluZyhzdHJ1Y3Qgdm5pY19kZXZfcmluZyAqcmluZykKK3sKKwltZW1zZXQocmluZy0+ZGVzY3MsIDAsIHJpbmctPnNpemUpOworfQorCitpbnQgdm5pY19kZXZfYWxsb2NfZGVzY19yaW5nKHN0cnVjdCB2bmljX2RldiAqdmRldiwgc3RydWN0IHZuaWNfZGV2X3JpbmcgKnJpbmcsCisJdW5zaWduZWQgaW50IGRlc2NfY291bnQsIHVuc2lnbmVkIGludCBkZXNjX3NpemUpCit7CisJdm5pY19kZXZfZGVzY19yaW5nX3NpemUocmluZywgZGVzY19jb3VudCwgZGVzY19zaXplKTsKKworCXJpbmctPmRlc2NzX3VuYWxpZ25lZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHZkZXYtPnBkZXYsCisJCXJpbmctPnNpemVfdW5hbGlnbmVkLAorCQkmcmluZy0+YmFzZV9hZGRyX3VuYWxpZ25lZCk7CisKKwlpZiAoIXJpbmctPmRlc2NzX3VuYWxpZ25lZCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIHJpbmcgKHNpemU9JWQpLCBhYm9ydGluZ1xuIiwKKwkJCShpbnQpcmluZy0+c2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJpbmctPmJhc2VfYWRkciA9IEFMSUdOKHJpbmctPmJhc2VfYWRkcl91bmFsaWduZWQsCisJCXJpbmctPmJhc2VfYWxpZ24pOworCXJpbmctPmRlc2NzID0gKHU4ICopcmluZy0+ZGVzY3NfdW5hbGlnbmVkICsKKwkJKHJpbmctPmJhc2VfYWRkciAtIHJpbmctPmJhc2VfYWRkcl91bmFsaWduZWQpOworCisJdm5pY19kZXZfY2xlYXJfZGVzY19yaW5nKHJpbmcpOworCisJcmluZy0+ZGVzY19hdmFpbCA9IHJpbmctPmRlc2NfY291bnQgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm5pY19kZXZfZnJlZV9kZXNjX3Jpbmcoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3Qgdm5pY19kZXZfcmluZyAqcmluZykKK3sKKwlpZiAocmluZy0+ZGVzY3MpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh2ZGV2LT5wZGV2LAorCQkJcmluZy0+c2l6ZV91bmFsaWduZWQsCisJCQlyaW5nLT5kZXNjc191bmFsaWduZWQsCisJCQlyaW5nLT5iYXNlX2FkZHJfdW5hbGlnbmVkKTsKKwkJcmluZy0+ZGVzY3MgPSBOVUxMOworCX0KK30KKworaW50IHZuaWNfZGV2X2NtZChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGVudW0gdm5pY19kZXZjbWRfY21kIGNtZCwKKwl1NjQgKmEwLCB1NjQgKmExLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgdm5pY19kZXZjbWQgX19pb21lbSAqZGV2Y21kID0gdmRldi0+ZGV2Y21kOworCWludCBkZWxheTsKKwl1MzIgc3RhdHVzOworCWludCBkZXZfY21kX2VycltdID0geworCQkvKiBjb252ZXJ0IGZyb20gZncncyB2ZXJzaW9uIG9mIGVycm9yLmggdG8gaG9zdCdzIHZlcnNpb24gKi8KKwkJMCwJLyogRVJSX1NVQ0NFU1MgKi8KKwkJRUlOVkFMLAkvKiBFUlJfRUlOVkFMICovCisJCUVGQVVMVCwJLyogRVJSX0VGQVVMVCAqLworCQlFUEVSTSwJLyogRVJSX0VQRVJNICovCisJCUVCVVNZLCAgLyogRVJSX0VCVVNZICovCisJfTsKKwlpbnQgZXJyOworCisJc3RhdHVzID0gaW9yZWFkMzIoJmRldmNtZC0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgU1RBVF9CVVNZKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQnVzeSBkZXZjbWQgJWRcbiIsIF9DTURfTihjbWQpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoX0NNRF9ESVIoY21kKSAmIF9DTURfRElSX1dSSVRFKSB7CisJCXdyaXRlcSgqYTAsICZkZXZjbWQtPmFyZ3NbMF0pOworCQl3cml0ZXEoKmExLCAmZGV2Y21kLT5hcmdzWzFdKTsKKwkJd21iKCk7CisJfQorCisJaW93cml0ZTMyKGNtZCwgJmRldmNtZC0+Y21kKTsKKworCWlmICgoX0NNRF9GTEFHUyhjbWQpICYgX0NNRF9GTEFHU19OT1dBSVQpKQorCQkJcmV0dXJuIDA7CisKKwlmb3IgKGRlbGF5ID0gMDsgZGVsYXkgPCB3YWl0OyBkZWxheSsrKSB7CisKKwkJdWRlbGF5KDEwMCk7CisKKwkJc3RhdHVzID0gaW9yZWFkMzIoJmRldmNtZC0+c3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgU1RBVF9CVVNZKSkgeworCisJCQlpZiAoc3RhdHVzICYgU1RBVF9FUlJPUikgeworCQkJCWVyciA9IGRldl9jbWRfZXJyWyhpbnQpcmVhZHEoJmRldmNtZC0+YXJnc1swXSldOworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWQgZGV2Y21kICVkXG4iLAorCQkJCQllcnIsIF9DTURfTihjbWQpKTsKKwkJCQlyZXR1cm4gLWVycjsKKwkJCX0KKworCQkJaWYgKF9DTURfRElSKGNtZCkgJiBfQ01EX0RJUl9SRUFEKSB7CisJCQkJcm1iKCk7CisJCQkJKmEwID0gcmVhZHEoJmRldmNtZC0+YXJnc1swXSk7CisJCQkJKmExID0gcmVhZHEoJmRldmNtZC0+YXJnc1sxXSk7CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJUaW1lZG91dCBkZXZjbWQgJWRcbiIsIF9DTURfTihjbWQpKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworaW50IHZuaWNfZGV2X2Z3X2luZm8oc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXN0cnVjdCB2bmljX2RldmNtZF9md19pbmZvICoqZndfaW5mbykKK3sKKwl1NjQgYTAsIGExID0gMDsKKwlpbnQgd2FpdCA9IDEwMDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIXZkZXYtPmZ3X2luZm8pIHsKKwkJdmRldi0+ZndfaW5mbyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHZkZXYtPnBkZXYsCisJCQlzaXplb2Yoc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8pLAorCQkJJnZkZXYtPmZ3X2luZm9fcGEpOworCQlpZiAoIXZkZXYtPmZ3X2luZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlhMCA9IHZkZXYtPmZ3X2luZm9fcGE7CisKKwkJLyogb25seSBnZXQgZndfaW5mbyBvbmNlIGFuZCBjYWNoZSBpdCAqLworCQllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX01DUFVfRldfSU5GTywgJmEwLCAmYTEsIHdhaXQpOworCX0KKworCSpmd19pbmZvID0gdmRldi0+ZndfaW5mbzsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCB2bmljX2Rldl9zcGVjKHN0cnVjdCB2bmljX2RldiAqdmRldiwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsCisJdm9pZCAqdmFsdWUpCit7CisJdTY0IGEwLCBhMTsKKwlpbnQgd2FpdCA9IDEwMDA7CisJaW50IGVycjsKKworCWEwID0gb2Zmc2V0OworCWExID0gc2l6ZTsKKworCWVyciA9IHZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfREVWX1NQRUMsICZhMCwgJmExLCB3YWl0KTsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMTogKih1OCAqKXZhbHVlID0gKHU4KWEwOyBicmVhazsKKwljYXNlIDI6ICoodTE2ICopdmFsdWUgPSAodTE2KWEwOyBicmVhazsKKwljYXNlIDQ6ICoodTMyICopdmFsdWUgPSAodTMyKWEwOyBicmVhazsKKwljYXNlIDg6ICoodTY0ICopdmFsdWUgPSBhMDsgYnJlYWs7CisJZGVmYXVsdDogQlVHKCk7IGJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK2ludCB2bmljX2Rldl9zdGF0c19jbGVhcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCit7CisJdTY0IGEwID0gMCwgYTEgPSAwOworCWludCB3YWl0ID0gMTAwMDsKKwlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9TVEFUU19DTEVBUiwgJmEwLCAmYTEsIHdhaXQpOworfQorCitpbnQgdm5pY19kZXZfc3RhdHNfZHVtcChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX3N0YXRzICoqc3RhdHMpCit7CisJdTY0IGEwLCBhMTsKKwlpbnQgd2FpdCA9IDEwMDA7CisKKwlpZiAoIXZkZXYtPnN0YXRzKSB7CisJCXZkZXYtPnN0YXRzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodmRldi0+cGRldiwKKwkJCXNpemVvZihzdHJ1Y3Qgdm5pY19zdGF0cyksICZ2ZGV2LT5zdGF0c19wYSk7CisJCWlmICghdmRldi0+c3RhdHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkqc3RhdHMgPSB2ZGV2LT5zdGF0czsKKwlhMCA9IHZkZXYtPnN0YXRzX3BhOworCWExID0gc2l6ZW9mKHN0cnVjdCB2bmljX3N0YXRzKTsKKworCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX1NUQVRTX0RVTVAsICZhMCwgJmExLCB3YWl0KTsKK30KKworaW50IHZuaWNfZGV2X2Nsb3NlKHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX0NMT1NFLCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK2ludCB2bmljX2Rldl9lbmFibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCXU2NCBhMCA9IDAsIGExID0gMDsKKwlpbnQgd2FpdCA9IDEwMDA7CisJcmV0dXJuIHZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfRU5BQkxFLCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK2ludCB2bmljX2Rldl9kaXNhYmxlKHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX0RJU0FCTEUsICZhMCwgJmExLCB3YWl0KTsKK30KKworaW50IHZuaWNfZGV2X29wZW4oc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgYXJnKQoreworCXU2NCBhMCA9ICh1MzIpYXJnLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX09QRU4sICZhMCwgJmExLCB3YWl0KTsKK30KKworaW50IHZuaWNfZGV2X29wZW5fZG9uZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCAqZG9uZSkKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwkqZG9uZSA9IDA7CisKKwllcnIgPSB2bmljX2Rldl9jbWQodmRldiwgQ01EX09QRU5fU1RBVFVTLCAmYTAsICZhMSwgd2FpdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSpkb25lID0gKGEwID09IDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2bmljX2Rldl9zb2Z0X3Jlc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGFyZykKK3sKKwl1NjQgYTAgPSAodTMyKWFyZywgYTEgPSAwOworCWludCB3YWl0ID0gMTAwMDsKKwlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9TT0ZUX1JFU0VULCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK2ludCB2bmljX2Rldl9zb2Z0X3Jlc2V0X2RvbmUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBpbnQgKmRvbmUpCit7CisJdTY0IGEwID0gMCwgYTEgPSAwOworCWludCB3YWl0ID0gMTAwMDsKKwlpbnQgZXJyOworCisJKmRvbmUgPSAwOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9TT0ZUX1JFU0VUX1NUQVRVUywgJmEwLCAmYTEsIHdhaXQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkqZG9uZSA9IChhMCA9PSAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgdm5pY19kZXZfaGFuZ19ub3RpZnkoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCXU2NCBhMCwgYTE7CisJaW50IHdhaXQgPSAxMDAwOworCXJldHVybiB2bmljX2Rldl9jbWQodmRldiwgQ01EX0hBTkdfTk9USUZZLCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK2ludCB2bmljX2Rldl9tYWNfYWRkcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHU4ICptYWNfYWRkcikKK3sKKwl1NjQgYTAsIGExOworCWludCB3YWl0ID0gMTAwMDsKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW1hY19hZGRyW2ldID0gMDsKKworCWVyciA9IHZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfTUFDX0FERFIsICZhMCwgJmExLCB3YWl0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW1hY19hZGRyW2ldID0gKCh1OCAqKSZhMClbaV07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2bmljX2Rldl9wYWNrZXRfZmlsdGVyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGRpcmVjdGVkLCBpbnQgbXVsdGljYXN0LAorCWludCBicm9hZGNhc3QsIGludCBwcm9taXNjLCBpbnQgYWxsbXVsdGkpCit7CisJdTY0IGEwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisKKwlhMCA9IChkaXJlY3RlZCA/IENNRF9QRklMVEVSX0RJUkVDVEVEIDogMCkgfAorCSAgICAgKG11bHRpY2FzdCA/IENNRF9QRklMVEVSX01VTFRJQ0FTVCA6IDApIHwKKwkgICAgIChicm9hZGNhc3QgPyBDTURfUEZJTFRFUl9CUk9BRENBU1QgOiAwKSB8CisJICAgICAocHJvbWlzYyA/IENNRF9QRklMVEVSX1BST01JU0NVT1VTIDogMCkgfAorCSAgICAgKGFsbG11bHRpID8gQ01EX1BGSUxURVJfQUxMX01VTFRJQ0FTVCA6IDApOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9QQUNLRVRfRklMVEVSLCAmYTAsICZhMSwgd2FpdCk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBzZXQgcGFja2V0IGZpbHRlclxuIik7Cit9CisKK3ZvaWQgdm5pY19kZXZfYWRkX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcikKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJKCh1OCAqKSZhMClbaV0gPSBhZGRyW2ldOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9BRERSX0FERCwgJmEwLCAmYTEsIHdhaXQpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUgorCQkJIkNhbid0IGFkZCBhZGRyIFslMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeF0sICVkXG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSwKKwkJCWVycik7Cit9CisKK3ZvaWQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcikKK3sKKwl1NjQgYTAgPSAwLCBhMSA9IDA7CisJaW50IHdhaXQgPSAxMDAwOworCWludCBlcnI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJKCh1OCAqKSZhMClbaV0gPSBhZGRyW2ldOworCisJZXJyID0gdm5pY19kZXZfY21kKHZkZXYsIENNRF9BRERSX0RFTCwgJmEwLCAmYTEsIHdhaXQpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUgorCQkJIkNhbid0IGRlbCBhZGRyIFslMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeF0sICVkXG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSwKKwkJCWVycik7Cit9CisKK2ludCB2bmljX2Rldl9ub3RpZnlfc2V0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgdTE2IGludHIpCit7CisJdTY0IGEwLCBhMTsKKwlpbnQgd2FpdCA9IDEwMDA7CisKKwlpZiAoIXZkZXYtPm5vdGlmeSkgeworCQl2ZGV2LT5ub3RpZnkgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh2ZGV2LT5wZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCB2bmljX2RldmNtZF9ub3RpZnkpLAorCQkJJnZkZXYtPm5vdGlmeV9wYSk7CisJCWlmICghdmRldi0+bm90aWZ5KQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYTAgPSB2ZGV2LT5ub3RpZnlfcGE7CisJYTEgPSAoKHU2NClpbnRyIDw8IDMyKSAmIDB4MDAwMGZmZmYwMDAwMDAwMFVMTDsKKwlhMSArPSBzaXplb2Yoc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSk7CisKKwlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9OT1RJRlksICZhMCwgJmExLCB3YWl0KTsKK30KKwordm9pZCB2bmljX2Rldl9ub3RpZnlfdW5zZXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCXU2NCBhMCwgYTE7CisJaW50IHdhaXQgPSAxMDAwOworCisJYTAgPSAwOyAgLyogcGFkZHIgPSAwIHRvIHVuc2V0IG5vdGlmeSBidWZmZXIgKi8KKwlhMSA9IDB4MDAwMGZmZmYwMDAwMDAwMFVMTDsgLyogaW50ciBudW0gPSAtMSB0byB1bnJlZyBmb3IgaW50ciAqLworCWExICs9IHNpemVvZihzdHJ1Y3Qgdm5pY19kZXZjbWRfbm90aWZ5KTsKKworCXZuaWNfZGV2X2NtZCh2ZGV2LCBDTURfTk9USUZZLCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgdm5pY19kZXZfbm90aWZ5X3JlYWR5KHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwl1MzIgKndvcmRzOworCXVuc2lnbmVkIGludCBud29yZHMgPSBzaXplb2Yoc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSkgLyA0OworCXVuc2lnbmVkIGludCBpOworCXUzMiBjc3VtOworCisJaWYgKCF2ZGV2LT5ub3RpZnkpCisJCXJldHVybiAwOworCisJZG8geworCQljc3VtID0gMDsKKwkJbWVtY3B5KCZ2ZGV2LT5ub3RpZnlfY29weSwgdmRldi0+bm90aWZ5LAorCQkJc2l6ZW9mKHN0cnVjdCB2bmljX2RldmNtZF9ub3RpZnkpKTsKKwkJd29yZHMgPSAodTMyICopJnZkZXYtPm5vdGlmeV9jb3B5OworCQlmb3IgKGkgPSAxOyBpIDwgbndvcmRzOyBpKyspCisJCQljc3VtICs9IHdvcmRzW2ldOworCX0gd2hpbGUgKGNzdW0gIT0gd29yZHNbMF0pOworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2bmljX2Rldl9pbml0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGFyZykKK3sKKwl1NjQgYTAgPSAodTMyKWFyZywgYTEgPSAwOworCWludCB3YWl0ID0gMTAwMDsKKwlyZXR1cm4gdm5pY19kZXZfY21kKHZkZXYsIENNRF9JTklULCAmYTAsICZhMSwgd2FpdCk7Cit9CisKK2ludCB2bmljX2Rldl9saW5rX3N0YXR1cyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCit7CisJaWYgKHZkZXYtPmxpbmtzdGF0dXMpCisJCXJldHVybiAqdmRldi0+bGlua3N0YXR1czsKKworCWlmICghdm5pY19kZXZfbm90aWZ5X3JlYWR5KHZkZXYpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB2ZGV2LT5ub3RpZnlfY29weS5saW5rX3N0YXRlOworfQorCit1MzIgdm5pY19kZXZfcG9ydF9zcGVlZChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCit7CisJaWYgKCF2bmljX2Rldl9ub3RpZnlfcmVhZHkodmRldikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZkZXYtPm5vdGlmeV9jb3B5LnBvcnRfc3BlZWQ7Cit9CisKK3UzMiB2bmljX2Rldl9tc2dfbHZsKHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwlpZiAoIXZuaWNfZGV2X25vdGlmeV9yZWFkeSh2ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdmRldi0+bm90aWZ5X2NvcHkubXNnbHZsOworfQorCit1MzIgdm5pY19kZXZfbXR1KHN0cnVjdCB2bmljX2RldiAqdmRldikKK3sKKwlpZiAoIXZuaWNfZGV2X25vdGlmeV9yZWFkeSh2ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdmRldi0+bm90aWZ5X2NvcHkubXR1OworfQorCit2b2lkIHZuaWNfZGV2X3NldF9pbnRyX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZSkKK3sKKwl2ZGV2LT5pbnRyX21vZGUgPSBpbnRyX21vZGU7Cit9CisKK2VudW0gdm5pY19kZXZfaW50cl9tb2RlIHZuaWNfZGV2X2dldF9pbnRyX21vZGUoCisJc3RydWN0IHZuaWNfZGV2ICp2ZGV2KQoreworCXJldHVybiB2ZGV2LT5pbnRyX21vZGU7Cit9CisKK3ZvaWQgdm5pY19kZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpCit7CisJaWYgKHZkZXYpIHsKKwkJaWYgKHZkZXYtPm5vdGlmeSkKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodmRldi0+cGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSksCisJCQkJdmRldi0+bm90aWZ5LAorCQkJCXZkZXYtPm5vdGlmeV9wYSk7CisJCWlmICh2ZGV2LT5saW5rc3RhdHVzKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudCh2ZGV2LT5wZGV2LAorCQkJCXNpemVvZih1MzIpLAorCQkJCXZkZXYtPmxpbmtzdGF0dXMsCisJCQkJdmRldi0+bGlua3N0YXR1c19wYSk7CisJCWlmICh2ZGV2LT5zdGF0cykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodmRldi0+cGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHZuaWNfZGV2KSwKKwkJCQl2ZGV2LT5zdGF0cywgdmRldi0+c3RhdHNfcGEpOworCQlpZiAodmRldi0+ZndfaW5mbykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodmRldi0+cGRldiwKKwkJCQlzaXplb2Yoc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8pLAorCQkJCXZkZXYtPmZ3X2luZm8sIHZkZXYtPmZ3X2luZm9fcGEpOworCQlrZnJlZSh2ZGV2KTsKKwl9Cit9CisKK3N0cnVjdCB2bmljX2RldiAqdm5pY19kZXZfcmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXZvaWQgKnByaXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm5pY19kZXZfYmFyICpiYXIpCit7CisJaWYgKCF2ZGV2KSB7CisJCXZkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdm5pY19kZXYpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF2ZGV2KQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldi0+cHJpdiA9IHByaXY7CisJdmRldi0+cGRldiA9IHBkZXY7CisKKwlpZiAodm5pY19kZXZfZGlzY292ZXJfcmVzKHZkZXYsIGJhcikpCisJCWdvdG8gZXJyX291dDsKKworCXZkZXYtPmRldmNtZCA9IHZuaWNfZGV2X2dldF9yZXModmRldiwgUkVTX1RZUEVfREVWQ01ELCAwKTsKKwlpZiAoIXZkZXYtPmRldmNtZCkKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuIHZkZXY7CisKK2Vycl9vdXQ6CisJdm5pY19kZXZfdW5yZWdpc3Rlcih2ZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGMxODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9WTklDX0RFVl9IXworI2RlZmluZSBfVk5JQ19ERVZfSF8KKworI2luY2x1ZGUgInZuaWNfcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ2bmljX2RldmNtZC5oIgorCisjaWZuZGVmIFZOSUNfUEFERFJfVEFSR0VUCisjZGVmaW5lIFZOSUNfUEFERFJfVEFSR0VUCTB4MDAwMDAwMDAwMDAwMDAwMFVMTAorI2VuZGlmCisKKyNpZm5kZWYgcmVhZHEKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRxKHZvaWQgX19pb21lbSAqcmVnKQoreworCXJldHVybiAoKCh1NjQpcmVhZGwocmVnICsgMHg0VUwpIDw8IDMyKSB8CisJCSh1NjQpcmVhZGwocmVnKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXEodTY0IHZhbCwgdm9pZCBfX2lvbWVtICpyZWcpCit7CisJd3JpdGVsKHZhbCAmIDB4ZmZmZmZmZmYsIHJlZyk7CisJd3JpdGVsKHZhbCA+PiAzMiwgcmVnICsgMHg0VUwpOworfQorI2VuZGlmCisKK2VudW0gdm5pY19kZXZfaW50cl9tb2RlIHsKKwlWTklDX0RFVl9JTlRSX01PREVfVU5LTk9XTiwKKwlWTklDX0RFVl9JTlRSX01PREVfSU5UWCwKKwlWTklDX0RFVl9JTlRSX01PREVfTVNJLAorCVZOSUNfREVWX0lOVFJfTU9ERV9NU0lYLAorfTsKKworc3RydWN0IHZuaWNfZGV2X2JhciB7CisJdm9pZCBfX2lvbWVtICp2YWRkcjsKKwlkbWFfYWRkcl90IGJ1c19hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworfTsKKworc3RydWN0IHZuaWNfZGV2X3JpbmcgeworCXZvaWQgKmRlc2NzOworCXNpemVfdCBzaXplOworCWRtYV9hZGRyX3QgYmFzZV9hZGRyOworCXNpemVfdCBiYXNlX2FsaWduOworCXZvaWQgKmRlc2NzX3VuYWxpZ25lZDsKKwlzaXplX3Qgc2l6ZV91bmFsaWduZWQ7CisJZG1hX2FkZHJfdCBiYXNlX2FkZHJfdW5hbGlnbmVkOworCXVuc2lnbmVkIGludCBkZXNjX3NpemU7CisJdW5zaWduZWQgaW50IGRlc2NfY291bnQ7CisJdW5zaWduZWQgaW50IGRlc2NfYXZhaWw7Cit9OworCitzdHJ1Y3Qgdm5pY19kZXY7CitzdHJ1Y3Qgdm5pY19zdGF0czsKKwordm9pZCAqdm5pY19kZXZfcHJpdihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwordW5zaWduZWQgaW50IHZuaWNfZGV2X2dldF9yZXNfY291bnQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCWVudW0gdm5pY19yZXNfdHlwZSB0eXBlKTsKK3ZvaWQgX19pb21lbSAqdm5pY19kZXZfZ2V0X3JlcyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGVudW0gdm5pY19yZXNfdHlwZSB0eXBlLAorCXVuc2lnbmVkIGludCBpbmRleCk7Cit1bnNpZ25lZCBpbnQgdm5pY19kZXZfZGVzY19yaW5nX3NpemUoc3RydWN0IHZuaWNfZGV2X3JpbmcgKnJpbmcsCisJdW5zaWduZWQgaW50IGRlc2NfY291bnQsIHVuc2lnbmVkIGludCBkZXNjX3NpemUpOwordm9pZCB2bmljX2Rldl9jbGVhcl9kZXNjX3Jpbmcoc3RydWN0IHZuaWNfZGV2X3JpbmcgKnJpbmcpOworaW50IHZuaWNfZGV2X2FsbG9jX2Rlc2NfcmluZyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX2Rldl9yaW5nICpyaW5nLAorCXVuc2lnbmVkIGludCBkZXNjX2NvdW50LCB1bnNpZ25lZCBpbnQgZGVzY19zaXplKTsKK3ZvaWQgdm5pY19kZXZfZnJlZV9kZXNjX3Jpbmcoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXN0cnVjdCB2bmljX2Rldl9yaW5nICpyaW5nKTsKK2ludCB2bmljX2Rldl9jbWQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBlbnVtIHZuaWNfZGV2Y21kX2NtZCBjbWQsCisJdTY0ICphMCwgdTY0ICphMSwgaW50IHdhaXQpOworaW50IHZuaWNfZGV2X2Z3X2luZm8oc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXN0cnVjdCB2bmljX2RldmNtZF9md19pbmZvICoqZndfaW5mbyk7CitpbnQgdm5pY19kZXZfc3BlYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLAorCXZvaWQgKnZhbHVlKTsKK2ludCB2bmljX2Rldl9zdGF0c19jbGVhcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOworaW50IHZuaWNfZGV2X3N0YXRzX2R1bXAoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCBzdHJ1Y3Qgdm5pY19zdGF0cyAqKnN0YXRzKTsKK2ludCB2bmljX2Rldl9oYW5nX25vdGlmeShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwordm9pZCB2bmljX2Rldl9wYWNrZXRfZmlsdGVyKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGRpcmVjdGVkLCBpbnQgbXVsdGljYXN0LAorCWludCBicm9hZGNhc3QsIGludCBwcm9taXNjLCBpbnQgYWxsbXVsdGkpOwordm9pZCB2bmljX2Rldl9hZGRfYWRkcihzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHU4ICphZGRyKTsKK3ZvaWQgdm5pY19kZXZfZGVsX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqYWRkcik7CitpbnQgdm5pY19kZXZfbWFjX2FkZHIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1OCAqbWFjX2FkZHIpOworaW50IHZuaWNfZGV2X25vdGlmeV9zZXQoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LCB1MTYgaW50cik7Cit2b2lkIHZuaWNfZGV2X25vdGlmeV91bnNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOworaW50IHZuaWNfZGV2X2xpbmtfc3RhdHVzKHN0cnVjdCB2bmljX2RldiAqdmRldik7Cit1MzIgdm5pY19kZXZfcG9ydF9zcGVlZChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOwordTMyIHZuaWNfZGV2X21zZ19sdmwoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK3UzMiB2bmljX2Rldl9tdHUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK2ludCB2bmljX2Rldl9jbG9zZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOworaW50IHZuaWNfZGV2X2VuYWJsZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYpOworaW50IHZuaWNfZGV2X2Rpc2FibGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK2ludCB2bmljX2Rldl9vcGVuKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGFyZyk7CitpbnQgdm5pY19kZXZfb3Blbl9kb25lKHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50ICpkb25lKTsKK2ludCB2bmljX2Rldl9pbml0KHN0cnVjdCB2bmljX2RldiAqdmRldiwgaW50IGFyZyk7CitpbnQgdm5pY19kZXZfc29mdF9yZXNldChzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCBhcmcpOworaW50IHZuaWNfZGV2X3NvZnRfcmVzZXRfZG9uZShzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIGludCAqZG9uZSk7Cit2b2lkIHZuaWNfZGV2X3NldF9pbnRyX21vZGUoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCWVudW0gdm5pY19kZXZfaW50cl9tb2RlIGludHJfbW9kZSk7CitlbnVtIHZuaWNfZGV2X2ludHJfbW9kZSB2bmljX2Rldl9nZXRfaW50cl9tb2RlKHN0cnVjdCB2bmljX2RldiAqdmRldik7Cit2b2lkIHZuaWNfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2KTsKK3N0cnVjdCB2bmljX2RldiAqdm5pY19kZXZfcmVnaXN0ZXIoc3RydWN0IHZuaWNfZGV2ICp2ZGV2LAorCXZvaWQgKnByaXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm5pY19kZXZfYmFyICpiYXIpOworCisjZW5kaWYgLyogX1ZOSUNfREVWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2Y21kLmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfZGV2Y21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MTdhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19kZXZjbWQuaApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1ZOSUNfREVWQ01EX0hfCisjZGVmaW5lIF9WTklDX0RFVkNNRF9IXworCisjZGVmaW5lIF9DTURfTkJJVFMgICAgICAxNAorI2RlZmluZSBfQ01EX1ZUWVBFQklUUwkxMAorI2RlZmluZSBfQ01EX0ZMQUdTQklUUyAgNgorI2RlZmluZSBfQ01EX0RJUkJJVFMJMgorCisjZGVmaW5lIF9DTURfTk1BU0sgICAgICAoKDEgPDwgX0NNRF9OQklUUyktMSkKKyNkZWZpbmUgX0NNRF9WVFlQRU1BU0sgICgoMSA8PCBfQ01EX1ZUWVBFQklUUyktMSkKKyNkZWZpbmUgX0NNRF9GTEFHU01BU0sgICgoMSA8PCBfQ01EX0ZMQUdTQklUUyktMSkKKyNkZWZpbmUgX0NNRF9ESVJNQVNLICAgICgoMSA8PCBfQ01EX0RJUkJJVFMpLTEpCisKKyNkZWZpbmUgX0NNRF9OU0hJRlQgICAgIDAKKyNkZWZpbmUgX0NNRF9WVFlQRVNISUZUIChfQ01EX05TSElGVCtfQ01EX05CSVRTKQorI2RlZmluZSBfQ01EX0ZMQUdTU0hJRlQgKF9DTURfVlRZUEVTSElGVCtfQ01EX1ZUWVBFQklUUykKKyNkZWZpbmUgX0NNRF9ESVJTSElGVCAgIChfQ01EX0ZMQUdTU0hJRlQrX0NNRF9GTEFHU0JJVFMpCisKKy8qCisgKiBEaXJlY3Rpb24gYml0cyAoZnJvbSBob3N0IHBlcnNwZWN0aXZlKS4KKyAqLworI2RlZmluZSBfQ01EX0RJUl9OT05FICAgMFUKKyNkZWZpbmUgX0NNRF9ESVJfV1JJVEUgIDFVCisjZGVmaW5lIF9DTURfRElSX1JFQUQgICAyVQorI2RlZmluZSBfQ01EX0RJUl9SVyAgICAgKF9DTURfRElSX1dSSVRFIHwgX0NNRF9ESVJfUkVBRCkKKworLyoKKyAqIEZsYWcgYml0cy4KKyAqLworI2RlZmluZSBfQ01EX0ZMQUdTX05PTkUgMFUKKyNkZWZpbmUgX0NNRF9GTEFHU19OT1dBSVQgMVUKKworLyoKKyAqIHZOSUMgdHlwZSBiaXRzLgorICovCisjZGVmaW5lIF9DTURfVlRZUEVfTk9ORSAgMFUKKyNkZWZpbmUgX0NNRF9WVFlQRV9FTkVUICAxVQorI2RlZmluZSBfQ01EX1ZUWVBFX0ZDICAgIDJVCisjZGVmaW5lIF9DTURfVlRZUEVfU0NTSSAgNFUKKyNkZWZpbmUgX0NNRF9WVFlQRV9BTEwgICAoX0NNRF9WVFlQRV9FTkVUIHwgX0NNRF9WVFlQRV9GQyB8IF9DTURfVlRZUEVfU0NTSSkKKworLyoKKyAqIFVzZWQgdG8gY3JlYXRlIGNtZHMuLgorKi8KKyNkZWZpbmUgX0NNRENGKGRpciwgZmxhZ3MsIHZ0eXBlLCBucikgIFwKKwkoKChkaXIpICAgPDwgX0NNRF9ESVJTSElGVCkgfCBcCisJKChmbGFncykgPDwgX0NNRF9GTEFHU1NISUZUKSB8IFwKKwkoKHZ0eXBlKSA8PCBfQ01EX1ZUWVBFU0hJRlQpIHwgXAorCSgobnIpICAgIDw8IF9DTURfTlNISUZUKSkKKyNkZWZpbmUgX0NNREMoZGlyLCB2dHlwZSwgbnIpICAgIF9DTURDRihkaXIsIDAsIHZ0eXBlLCBucikKKyNkZWZpbmUgX0NNRENOVyhkaXIsIHZ0eXBlLCBucikgIF9DTURDRihkaXIsIF9DTURfRkxBR1NfTk9XQUlULCB2dHlwZSwgbnIpCisKKy8qCisgKiBVc2VkIHRvIGRlY29kZSBjbWRzLi4KKyovCisjZGVmaW5lIF9DTURfRElSKGNtZCkgICAgICAgICAgICAoKChjbWQpID4+IF9DTURfRElSU0hJRlQpICYgX0NNRF9ESVJNQVNLKQorI2RlZmluZSBfQ01EX0ZMQUdTKGNtZCkgICAgICAgICAgKCgoY21kKSA+PiBfQ01EX0ZMQUdTU0hJRlQpICYgX0NNRF9GTEFHU01BU0spCisjZGVmaW5lIF9DTURfVlRZUEUoY21kKSAgICAgICAgICAoKChjbWQpID4+IF9DTURfVlRZUEVTSElGVCkgJiBfQ01EX1ZUWVBFTUFTSykKKyNkZWZpbmUgX0NNRF9OKGNtZCkgICAgICAgICAgICAgICgoKGNtZCkgPj4gX0NNRF9OU0hJRlQpICYgX0NNRF9OTUFTSykKKworZW51bSB2bmljX2RldmNtZF9jbWQgeworCUNNRF9OT05FICAgICAgICAgICAgICAgID0gX0NNREMoX0NNRF9ESVJfTk9ORSwgX0NNRF9WVFlQRV9OT05FLCAwKSwKKworCS8qIG1jcHUgZncgaW5mbyBpbiBtZW06ICh1NjQpYTA9cGFkZHIgdG8gc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8gKi8KKwlDTURfTUNQVV9GV19JTkZPICAgICAgICA9IF9DTURDKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0FMTCwgMSksCisKKwkvKiBkZXYtc3BlY2lmaWMgYmxvY2sgbWVtYmVyOgorCSAqICAgIGluOiAodTE2KWEwPW9mZnNldCwodTgpYTE9c2l6ZQorCSAqICAgIG91dDogYTA9dmFsdWUgKi8KKwlDTURfREVWX1NQRUMgICAgICAgICAgICA9IF9DTURDKF9DTURfRElSX1JXLCBfQ01EX1ZUWVBFX0FMTCwgMiksCisKKwkvKiBzdGF0cyBjbGVhciAqLworCUNNRF9TVEFUU19DTEVBUiAgICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9OT05FLCBfQ01EX1ZUWVBFX0FMTCwgMyksCisKKwkvKiBzdGF0cyBkdW1wIGluIG1lbTogKHU2NClhMD1wYWRkciB0byBzdGF0cyBhcmVhLAorCSAqICAgICAgICAgICAgICAgICAgICAodTE2KWExPXNpemVvZiBzdGF0cyBhcmVhICovCisJQ01EX1NUQVRTX0RVTVAgICAgICAgICAgPSBfQ01EQyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9BTEwsIDQpLAorCisJLyogc2V0IFJ4IHBhY2tldCBmaWx0ZXI6ICh1MzIpYTA9ZmlsdGVycyAoc2VlIENNRF9QRklMVEVSXyopICovCisJQ01EX1BBQ0tFVF9GSUxURVIJPSBfQ01EQ05XKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDcpLAorCisJLyogaGFuZyBkZXRlY3Rpb24gbm90aWZpY2F0aW9uICovCisJQ01EX0hBTkdfTk9USUZZICAgICAgICAgPSBfQ01EQyhfQ01EX0RJUl9OT05FLCBfQ01EX1ZUWVBFX0FMTCwgOCksCisKKwkvKiBNQUMgYWRkcmVzcyBpbiAodTQ4KWEwICovCisJQ01EX01BQ19BRERSICAgICAgICAgICAgPSBfQ01EQyhfQ01EX0RJUl9SRUFELAorCQkJCQlfQ01EX1ZUWVBFX0VORVQgfCBfQ01EX1ZUWVBFX0ZDLCA5KSwKKworCS8qIGRpc2FibGUvZW5hYmxlIHByb21pc2MgbW9kZTogKHU4KWEwPTAvMSAqLworLyoqKioqIFhYWCBERVBSRUNBVEVEICoqKioqLworCUNNRF9QUk9NSVNDX01PREUgICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9FTkVULCAxMCksCisKKwkvKiBkaXNhYmxlL2VuYWJsZSBhbGwtbXVsdGkgbW9kZTogKHU4KWEwPTAvMSAqLworLyoqKioqIFhYWCBERVBSRUNBVEVEICoqKioqLworCUNNRF9BTExNVUxUSV9NT0RFICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9FTkVULCAxMSksCisKKwkvKiBhZGQgYWRkciBmcm9tICh1NDgpYTAgKi8KKwlDTURfQUREUl9BREQgICAgICAgICAgICA9IF9DTURDTlcoX0NNRF9ESVJfV1JJVEUsCisJCQkJCV9DTURfVlRZUEVfRU5FVCB8IF9DTURfVlRZUEVfRkMsIDEyKSwKKworCS8qIGRlbCBhZGRyIGZyb20gKHU0OClhMCAqLworCUNNRF9BRERSX0RFTCAgICAgICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwKKwkJCQkJX0NNRF9WVFlQRV9FTkVUIHwgX0NNRF9WVFlQRV9GQywgMTMpLAorCisJLyogYWRkIFZMQU4gaWQgaW4gKHUxNilhMCAqLworCUNNRF9WTEFOX0FERCAgICAgICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9FTkVULCAxNCksCisKKwkvKiBkZWwgVkxBTiBpZCBpbiAodTE2KWEwICovCisJQ01EX1ZMQU5fREVMICAgICAgICAgICAgPSBfQ01EQ05XKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDE1KSwKKworCS8qIG5pY19jZmcgaW4gKHUzMilhMCAqLworCUNNRF9OSUNfQ0ZHICAgICAgICAgICAgID0gX0NNRENOVyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9BTEwsIDE2KSwKKworCS8qIHVuaW9uIHZuaWNfcnNzX2tleSBpbiBtZW06ICh1NjQpYTA9cGFkZHIsICh1MTYpYTE9bGVuICovCisJQ01EX1JTU19LRVkgICAgICAgICAgICAgPSBfQ01EQyhfQ01EX0RJUl9XUklURSwgX0NNRF9WVFlQRV9FTkVULCAxNyksCisKKwkvKiB1bmlvbiB2bmljX3Jzc19jcHUgaW4gbWVtOiAodTY0KWEwPXBhZGRyLCAodTE2KWExPWxlbiAqLworCUNNRF9SU1NfQ1BVICAgICAgICAgICAgID0gX0NNREMoX0NNRF9ESVJfV1JJVEUsIF9DTURfVlRZUEVfRU5FVCwgMTgpLAorCisJLyogaW5pdGlhdGUgc29mdHJlc2V0ICovCisJQ01EX1NPRlRfUkVTRVQgICAgICAgICAgPSBfQ01EQ05XKF9DTURfRElSX05PTkUsIF9DTURfVlRZUEVfQUxMLCAxOSksCisKKwkvKiBzb2Z0cmVzZXQgc3RhdHVzOgorCSAqICAgIG91dDogYTA9MCByZXNldCBjb21wbGV0ZSwgYTA9MSByZXNldCBpbiBwcm9ncmVzcyAqLworCUNNRF9TT0ZUX1JFU0VUX1NUQVRVUyAgID0gX0NNREMoX0NNRF9ESVJfUkVBRCwgX0NNRF9WVFlQRV9BTEwsIDIwKSwKKworCS8qIHNldCBzdHJ1Y3Qgdm5pY19kZXZjbWRfbm90aWZ5IGJ1ZmZlciBpbiBtZW06CisJICogaW46CisJICogICAodTY0KWEwPXBhZGRyIHRvIG5vdGlmeSAoc2V0IHBhZGRyPTAgdG8gdW5zZXQpCisJICogICAodTMyKWExICYgMHgwMDAwMDAwMGZmZmZmZmZmPXNpemVvZihzdHJ1Y3Qgdm5pY19kZXZjbWRfbm90aWZ5KQorCSAqICAgKHUxNilhMSAmIDB4MDAwMGZmZmYwMDAwMDAwMD1pbnRyIG51bSAoLTEgZm9yIG5vIGludHIpCisJICogb3V0OgorCSAqICAgKHUzMilhMSA9IGVmZmVjdGl2ZSBzaXplCisJICovCisJQ01EX05PVElGWSAgICAgICAgICAgICAgPSBfQ01EQyhfQ01EX0RJUl9SVywgX0NNRF9WVFlQRV9BTEwsIDIxKSwKKworCS8qIFVOREkgQVBJOiAodTY0KWEwPXBhZGRyIHRvIHNfUFhFTlZfVU5ESV8gc3RydWN0LAorCSAqICAgICAgICAgICAodTgpYTE9UFhFTlZfVU5ESV94eHggKi8KKwlDTURfVU5ESSAgICAgICAgICAgICAgICA9IF9DTURDKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDIyKSwKKworCS8qIGluaXRpYXRlIG9wZW4gc2VxdWVuY2UgKHUzMilhMD1mbGFncyAoc2VlIENNRF9PUEVORl8qKSAqLworCUNNRF9PUEVOCQk9IF9DTURDTlcoX0NNRF9ESVJfV1JJVEUsIF9DTURfVlRZUEVfQUxMLCAyMyksCisKKwkvKiBvcGVuIHN0YXR1czoKKwkgKiAgICBvdXQ6IGEwPTAgb3BlbiBjb21wbGV0ZSwgYTA9MSBvcGVuIGluIHByb2dyZXNzICovCisJQ01EX09QRU5fU1RBVFVTCQk9IF9DTURDKF9DTURfRElSX1JFQUQsIF9DTURfVlRZUEVfQUxMLCAyNCksCisKKwkvKiBjbG9zZSB2bmljICovCisJQ01EX0NMT1NFCQk9IF9DTURDKF9DTURfRElSX05PTkUsIF9DTURfVlRZUEVfQUxMLCAyNSksCisKKwkvKiBpbml0aWFsaXplIHZpcnR1YWwgbGluazogKHUzMilhMD1mbGFncyAoc2VlIENNRF9JTklURl8qKSAqLworCUNNRF9JTklUCQk9IF9DTURDTlcoX0NNRF9ESVJfUkVBRCwgX0NNRF9WVFlQRV9BTEwsIDI2KSwKKworCS8qIHZhcmlhbnQgb2YgQ01EX0lOSVQsIHdpdGggcHJvdmlzaW9uaW5nIGluZm8KKwkgKiAgICAgKHU2NClhMD1wYWRkciBvZiB2bmljX2RldmNtZF9wcm92aW5mbworCSAqICAgICAodTMyKWExPXNpemVvZiBwcm92aXNpb24gaW5mbyAqLworCUNNRF9JTklUX1BST1ZfSU5GTwk9IF9DTURDKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDI3KSwKKworCS8qIGVuYWJsZSB2aXJ0dWFsIGxpbmsgKi8KKwlDTURfRU5BQkxFCQk9IF9DTURDTlcoX0NNRF9ESVJfV1JJVEUsIF9DTURfVlRZUEVfQUxMLCAyOCksCisKKwkvKiBkaXNhYmxlIHZpcnR1YWwgbGluayAqLworCUNNRF9ESVNBQkxFCQk9IF9DTURDKF9DTURfRElSX05PTkUsIF9DTURfVlRZUEVfQUxMLCAyOSksCisKKwkvKiBzdGF0cyBkdW1wIGFsbCB2bmljcyBvbiB1cGxpbmsgaW4gbWVtOiAodTY0KWEwPXBhZGRyICh1MzIpYTE9dWlmICovCisJQ01EX1NUQVRTX0RVTVBfQUxMCT0gX0NNREMoX0NNRF9ESVJfV1JJVEUsIF9DTURfVlRZUEVfQUxMLCAzMCksCisKKwkvKiBpbml0IHN0YXR1czoKKwkgKiAgICBvdXQ6IGEwPTAgaW5pdCBjb21wbGV0ZSwgYTA9MSBpbml0IGluIHByb2dyZXNzCisJICogICAgICAgICBpZiBhMD0wLCBhMT1lcnJubyAqLworCUNNRF9JTklUX1NUQVRVUwkJPSBfQ01EQyhfQ01EX0RJUl9SRUFELCBfQ01EX1ZUWVBFX0FMTCwgMzEpLAorCisJLyogSU5UMTMgQVBJOiAodTY0KWEwPXBhZGRyIHRvIHZuaWNfaW50MTNfcGFyYW1zIHN0cnVjdAorCSAqICAgICAgICAgICAgKHU4KWExPUlOVDEzX0NNRF94eHggKi8KKwlDTURfSU5UMTMgICAgICAgICAgICAgICA9IF9DTURDKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0ZDLCAzMiksCisKKwkvKiBsb2dpY2FsIHVwbGluayBlbmFibGUvZGlzYWJsZTogKHU2NClhMDogMC8xPWRpc2FibGUvZW5hYmxlICovCisJQ01EX0xPR0lDQUxfVVBMSU5LICAgICAgPSBfQ01EQ05XKF9DTURfRElSX1dSSVRFLCBfQ01EX1ZUWVBFX0VORVQsIDMzKSwKKworCS8qIHVuZG8gaW5pdGlhbGl6ZSBvZiB2aXJ0dWFsIGxpbmsgKi8KKwlDTURfREVJTklUCQk9IF9DTURDTlcoX0NNRF9ESVJfTk9ORSwgX0NNRF9WVFlQRV9BTEwsIDM0KSwKK307CisKKy8qIGZsYWdzIGZvciBDTURfT1BFTiAqLworI2RlZmluZSBDTURfT1BFTkZfT1BST00JCTB4MQkvKiBvcGVuIGNvbWluZyBmcm9tIG9wdGlvbiByb20gKi8KKworLyogZmxhZ3MgZm9yIENNRF9JTklUICovCisjZGVmaW5lIENNRF9JTklURl9ERUZBVUxUX01BQwkweDEJLyogaW5pdCB3aXRoIGRlZmF1bHQgbWFjIGFkZHIgKi8KKworLyogZmxhZ3MgZm9yIENNRF9QQUNLRVRfRklMVEVSICovCisjZGVmaW5lIENNRF9QRklMVEVSX0RJUkVDVEVECQkweDAxCisjZGVmaW5lIENNRF9QRklMVEVSX01VTFRJQ0FTVAkJMHgwMgorI2RlZmluZSBDTURfUEZJTFRFUl9CUk9BRENBU1QJCTB4MDQKKyNkZWZpbmUgQ01EX1BGSUxURVJfUFJPTUlTQ1VPVVMJCTB4MDgKKyNkZWZpbmUgQ01EX1BGSUxURVJfQUxMX01VTFRJQ0FTVAkweDEwCisKK2VudW0gdm5pY19kZXZjbWRfc3RhdHVzIHsKKwlTVEFUX05PTkUgPSAwLAorCVNUQVRfQlVTWSA9IDEgPDwgMCwJLyogY21kIGluIHByb2dyZXNzICovCisJU1RBVF9FUlJPUiA9IDEgPDwgMSwJLyogbGFzdCBjbWQgY2F1c2VkIGVycm9yIChjb2RlIGluIGEwKSAqLworfTsKKworZW51bSB2bmljX2RldmNtZF9lcnJvciB7CisJRVJSX1NVQ0NFU1MgPSAwLAorCUVSUl9FSU5WQUwgPSAxLAorCUVSUl9FRkFVTFQgPSAyLAorCUVSUl9FUEVSTSA9IDMsCisJRVJSX0VCVVNZID0gNCwKKwlFUlJfRUNNRFVOS05PV04gPSA1LAorCUVSUl9FQkFEU1RBVEUgPSA2LAorCUVSUl9FTk9NRU0gPSA3LAorCUVSUl9FVElNRURPVVQgPSA4LAorCUVSUl9FTElOS0RPV04gPSA5LAorfTsKKworc3RydWN0IHZuaWNfZGV2Y21kX2Z3X2luZm8geworCWNoYXIgZndfdmVyc2lvblszMl07CisJY2hhciBmd19idWlsZFszMl07CisJY2hhciBod192ZXJzaW9uWzMyXTsKKwljaGFyIGh3X3NlcmlhbF9udW1iZXJbMzJdOworfTsKKworc3RydWN0IHZuaWNfZGV2Y21kX25vdGlmeSB7CisJdTMyIGNzdW07CQkvKiBjaGVja3N1bSBvdmVyIGZvbGxvd2luZyB3b3JkcyAqLworCisJdTMyIGxpbmtfc3RhdGU7CQkvKiBsaW5rIHVwID09IDEgKi8KKwl1MzIgcG9ydF9zcGVlZDsJCS8qIGVmZmVjdGl2ZSBwb3J0IHNwZWVkIChyYXRlIGxpbWl0KSAqLworCXUzMiBtdHU7CQkvKiBNVFUgKi8KKwl1MzIgbXNnbHZsOwkJLyogcmVxdWVzdGVkIGRyaXZlciBtc2cgbHZsICovCisJdTMyIHVpZjsJCS8qIHVwbGluayBpbnRlcmZhY2UgKi8KKwl1MzIgc3RhdHVzOwkJLyogc3RhdHVzIGJpdHMgKHNlZSBWTklDX1NURl8qKSAqLworCXUzMiBlcnJvcjsJCS8qIGVycm9yIGNvZGUgKHNlZSBFUlJfKikgZm9yIGZpcnN0IEVSUiAqLworfTsKKyNkZWZpbmUgVk5JQ19TVEZfRkFUQUxfRVJSCTB4MDAwMQkvKiBmYXRhbCBmdyBlcnJvciAqLworCitzdHJ1Y3Qgdm5pY19kZXZjbWRfcHJvdmluZm8geworCXU4IG91aVszXTsKKwl1OCB0eXBlOworCXU4IGRhdGFbMF07Cit9OworCisvKgorICogV3JpdGluZyBjbWQgcmVnaXN0ZXIgY2F1c2VzIFNUQVRfQlVTWSB0byBnZXQgc2V0IGluIHN0YXR1cyByZWdpc3Rlci4KKyAqIFdoZW4gY21kIGNvbXBsZXRlcywgU1RBVF9CVVNZIHdpbGwgYmUgY2xlYXJlZC4KKyAqCisgKiBJZiBjbWQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBTVEFUX0VSUk9SIHdpbGwgYmUgY2xlYXIKKyAqIGFuZCBhcmdzIHJlZ2lzdGVycyBjb250YWluIGNtZC1zcGVjaWZpYyByZXN1bHRzLgorICoKKyAqIElmIGNtZCBlcnJvciwgU1RBVF9FUlJPUiB3aWxsIGJlIHNldCBhbmQgYXJnc1swXSBjb250YWlucyBlcnJvciBjb2RlLgorICoKKyAqIHN0YXR1cyByZWdpc3RlciBpcyByZWFkLW9ubHkuICBXaGlsZSBTVEFUX0JVU1kgaXMgc2V0LAorICogYWxsIG90aGVyIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZSByZWFkLW9ubHkuCisgKi8KKworLyogTWFrZSBzaXplb2Yodm5pY19kZXZjbWQpIGEgcG93ZXItb2YtMiBmb3IgSS9PIEJBUi4gKi8KKyNkZWZpbmUgVk5JQ19ERVZDTURfTkFSR1MgMTUKK3N0cnVjdCB2bmljX2RldmNtZCB7CisJdTMyIHN0YXR1czsJCQkvKiBSTyAqLworCXUzMiBjbWQ7CQkJLyogUlcgKi8KKwl1NjQgYXJnc1tWTklDX0RFVkNNRF9OQVJHU107CS8qIFJXIGNtZCBhcmdzIChsaXR0bGUtZW5kaWFuKSAqLworfTsKKworI2VuZGlmIC8qIF9WTklDX0RFVkNNRF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX2VuZXQuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19lbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMmFjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19lbmV0LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1ZOSUNfRU5JQ19IXworI2RlZmluZSBfVk5JQ19FTklDX0hfCisKKy8qIERldmljZS1zcGVjaWZpYyByZWdpb246IGVuZXQgY29uZmlndXJhdGlvbiAqLworc3RydWN0IHZuaWNfZW5ldF9jb25maWcgeworCXUzMiBmbGFnczsKKwl1MzIgd3FfZGVzY19jb3VudDsKKwl1MzIgcnFfZGVzY19jb3VudDsKKwl1MTYgbXR1OworCXUxNiBpbnRyX3RpbWVyOworCXU4IGludHJfdGltZXJfdHlwZTsKKwl1OCBpbnRyX21vZGU7CisJY2hhciBkZXZuYW1lWzE2XTsKK307CisKKyNkZWZpbmUgVkVORVRGX1RTTwkJMHgxCS8qIFRTTyBlbmFibGVkICovCisjZGVmaW5lIFZFTkVURl9MUk8JCTB4MgkvKiBMUk8gZW5hYmxlZCAqLworI2RlZmluZSBWRU5FVEZfUlhDU1VNCQkweDQJLyogUlggY3N1bSBlbmFibGVkICovCisjZGVmaW5lIFZFTkVURl9UWENTVU0JCTB4OAkvKiBUWCBjc3VtIGVuYWJsZWQgKi8KKyNkZWZpbmUgVkVORVRGX1JTUwkJMHgxMAkvKiBSU1MgZW5hYmxlZCAqLworI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9JUFY0CTB4MjAJLyogSGFzaCBvbiBJUHY0IGZpZWxkcyAqLworI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9UQ1BJUFY0CTB4NDAJLyogSGFzaCBvbiBUQ1AgKyBJUHY0IGZpZWxkcyAqLworI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9JUFY2CTB4ODAJLyogSGFzaCBvbiBJUHY2IGZpZWxkcyAqLworI2RlZmluZSBWRU5FVEZfUlNTSEFTSF9UQ1BJUFY2CTB4MTAwCS8qIEhhc2ggb24gVENQICsgSVB2NiBmaWVsZHMgKi8KKyNkZWZpbmUgVkVORVRGX1JTU0hBU0hfSVBWNl9FWAkweDIwMAkvKiBIYXNoIG9uIElQdjYgZXh0ZW5kZWQgZmllbGRzICovCisjZGVmaW5lIFZFTkVURl9SU1NIQVNIX1RDUElQVjZfRVggMHg0MDAJLyogSGFzaCBvbiBUQ1AgKyBJUHY2IGV4dC4gZmllbGRzICovCisKKyNlbmRpZiAvKiBfVk5JQ19FTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5jIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMzOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX2ludHIuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAidm5pY19kZXYuaCIKKyNpbmNsdWRlICJ2bmljX2ludHIuaCIKKwordm9pZCB2bmljX2ludHJfZnJlZShzdHJ1Y3Qgdm5pY19pbnRyICppbnRyKQoreworCWludHItPmN0cmwgPSBOVUxMOworfQorCitpbnQgdm5pY19pbnRyX2FsbG9jKHN0cnVjdCB2bmljX2RldiAqdmRldiwgc3RydWN0IHZuaWNfaW50ciAqaW50ciwKKwl1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJaW50ci0+aW5kZXggPSBpbmRleDsKKwlpbnRyLT52ZGV2ID0gdmRldjsKKworCWludHItPmN0cmwgPSB2bmljX2Rldl9nZXRfcmVzKHZkZXYsIFJFU19UWVBFX0lOVFJfQ1RSTCwgaW5kZXgpOworCWlmICghaW50ci0+Y3RybCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBob29rIElOVFJbJWRdLmN0cmwgcmVzb3VyY2VcbiIsCisJCQlpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHZuaWNfaW50cl9pbml0KHN0cnVjdCB2bmljX2ludHIgKmludHIsIHVuc2lnbmVkIGludCBjb2FsZXNjaW5nX3RpbWVyLAorCXVuc2lnbmVkIGludCBjb2FsZXNjaW5nX3R5cGUsIHVuc2lnbmVkIGludCBtYXNrX29uX2Fzc2VydGlvbikKK3sKKwlpb3dyaXRlMzIoY29hbGVzY2luZ190aW1lciwgJmludHItPmN0cmwtPmNvYWxlc2NpbmdfdGltZXIpOworCWlvd3JpdGUzMihjb2FsZXNjaW5nX3R5cGUsICZpbnRyLT5jdHJsLT5jb2FsZXNjaW5nX3R5cGUpOworCWlvd3JpdGUzMihtYXNrX29uX2Fzc2VydGlvbiwgJmludHItPmN0cmwtPm1hc2tfb25fYXNzZXJ0aW9uKTsKKwlpb3dyaXRlMzIoMCwgJmludHItPmN0cmwtPmludF9jcmVkaXRzKTsKK30KKwordm9pZCB2bmljX2ludHJfY2xlYW4oc3RydWN0IHZuaWNfaW50ciAqaW50cikKK3sKKwlpb3dyaXRlMzIoMCwgJmludHItPmN0cmwtPmludF9jcmVkaXRzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19pbnRyLmggYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzQwODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfaW50ci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9WTklDX0lOVFJfSF8KKyNkZWZpbmUgX1ZOSUNfSU5UUl9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJ2bmljX2Rldi5oIgorCisjZGVmaW5lIFZOSUNfSU5UUl9USU1FUl9NQVgJCTB4ZmZmZgorCisjZGVmaW5lIFZOSUNfSU5UUl9USU1FUl9UWVBFX0FCUwkwCisjZGVmaW5lIFZOSUNfSU5UUl9USU1FUl9UWVBFX1FVSUVUCTEKKworLyogSW50ZXJydXB0IGNvbnRyb2wgKi8KK3N0cnVjdCB2bmljX2ludHJfY3RybCB7CisJdTMyIGNvYWxlc2NpbmdfdGltZXI7CQkvKiAweDAwICovCisJdTMyIHBhZDA7CisJdTMyIGNvYWxlc2NpbmdfdmFsdWU7CQkvKiAweDA4ICovCisJdTMyIHBhZDE7CisJdTMyIGNvYWxlc2NpbmdfdHlwZTsJCS8qIDB4MTAgKi8KKwl1MzIgcGFkMjsKKwl1MzIgbWFza19vbl9hc3NlcnRpb247CQkvKiAweDE4ICovCisJdTMyIHBhZDM7CisJdTMyIG1hc2s7CQkJLyogMHgyMCAqLworCXUzMiBwYWQ0OworCXUzMiBpbnRfY3JlZGl0czsJCS8qIDB4MjggKi8KKwl1MzIgcGFkNTsKKwl1MzIgaW50X2NyZWRpdF9yZXR1cm47CQkvKiAweDMwICovCisJdTMyIHBhZDY7Cit9OworCitzdHJ1Y3Qgdm5pY19pbnRyIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJc3RydWN0IHZuaWNfZGV2ICp2ZGV2OworCXN0cnVjdCB2bmljX2ludHJfY3RybCBfX2lvbWVtICpjdHJsOwkJLyogbWVtb3J5LW1hcHBlZCAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZuaWNfaW50cl91bm1hc2soc3RydWN0IHZuaWNfaW50ciAqaW50cikKK3sKKwlpb3dyaXRlMzIoMCwgJmludHItPmN0cmwtPm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5pY19pbnRyX21hc2soc3RydWN0IHZuaWNfaW50ciAqaW50cikKK3sKKwlpb3dyaXRlMzIoMSwgJmludHItPmN0cmwtPm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5pY19pbnRyX3JldHVybl9jcmVkaXRzKHN0cnVjdCB2bmljX2ludHIgKmludHIsCisJdW5zaWduZWQgaW50IGNyZWRpdHMsIGludCB1bm1hc2ssIGludCByZXNldF90aW1lcikKK3sKKyNkZWZpbmUgVk5JQ19JTlRSX1VOTUFTS19TSElGVAkJMTYKKyNkZWZpbmUgVk5JQ19JTlRSX1JFU0VUX1RJTUVSX1NISUZUCTE3CisKKwl1MzIgaW50X2NyZWRpdF9yZXR1cm4gPSAoY3JlZGl0cyAmIDB4ZmZmZikgfAorCQkodW5tYXNrID8gKDEgPDwgVk5JQ19JTlRSX1VOTUFTS19TSElGVCkgOiAwKSB8CisJCShyZXNldF90aW1lciA/ICgxIDw8IFZOSUNfSU5UUl9SRVNFVF9USU1FUl9TSElGVCkgOiAwKTsKKworCWlvd3JpdGUzMihpbnRfY3JlZGl0X3JldHVybiwgJmludHItPmN0cmwtPmludF9jcmVkaXRfcmV0dXJuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdm5pY19pbnRyX2xlZ2FjeV9wYmEodTMyIF9faW9tZW0gKmxlZ2FjeV9wYmEpCit7CisJLyogZ2V0IGFuZCBhY2sgaW50ZXJydXB0IGluIG9uZSByZWFkIChjbGVhci1hbmQtYWNrLW9uLXJlYWQpICovCisJcmV0dXJuIGlvcmVhZDMyKGxlZ2FjeV9wYmEpOworfQorCit2b2lkIHZuaWNfaW50cl9mcmVlKHN0cnVjdCB2bmljX2ludHIgKmludHIpOworaW50IHZuaWNfaW50cl9hbGxvYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX2ludHIgKmludHIsCisJdW5zaWduZWQgaW50IGluZGV4KTsKK3ZvaWQgdm5pY19pbnRyX2luaXQoc3RydWN0IHZuaWNfaW50ciAqaW50ciwgdW5zaWduZWQgaW50IGNvYWxlc2NpbmdfdGltZXIsCisJdW5zaWduZWQgaW50IGNvYWxlc2NpbmdfdHlwZSwgdW5zaWduZWQgaW50IG1hc2tfb25fYXNzZXJ0aW9uKTsKK3ZvaWQgdm5pY19pbnRyX2NsZWFuKHN0cnVjdCB2bmljX2ludHIgKmludHIpOworCisjZW5kaWYgLyogX1ZOSUNfSU5UUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX25pYy5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX25pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGYyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfbmljLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1ZOSUNfTklDX0hfCisjZGVmaW5lIF9WTklDX05JQ19IXworCisjZGVmaW5lIE5JQ19DRkdfUlNTX0RFRkFVTFRfQ1BVX01BU0tfRklFTEQJMHhmZlVMCisjZGVmaW5lIE5JQ19DRkdfUlNTX0RFRkFVTFRfQ1BVX1NISUZUCQkwCisjZGVmaW5lIE5JQ19DRkdfUlNTX0hBU0hfVFlQRQkJCSgweGZmVUwgPDwgOCkKKyNkZWZpbmUgTklDX0NGR19SU1NfSEFTSF9UWVBFX01BU0tfRklFTEQJMHhmZlVMCisjZGVmaW5lIE5JQ19DRkdfUlNTX0hBU0hfVFlQRV9TSElGVAkJOAorI2RlZmluZSBOSUNfQ0ZHX1JTU19IQVNIX0JJVFMJCQkoN1VMIDw8IDE2KQorI2RlZmluZSBOSUNfQ0ZHX1JTU19IQVNIX0JJVFNfTUFTS19GSUVMRAk3VUwKKyNkZWZpbmUgTklDX0NGR19SU1NfSEFTSF9CSVRTX1NISUZUCQkxNgorI2RlZmluZSBOSUNfQ0ZHX1JTU19CQVNFX0NQVQkJCSg3VUwgPDwgMTkpCisjZGVmaW5lIE5JQ19DRkdfUlNTX0JBU0VfQ1BVX01BU0tfRklFTEQJCTdVTAorI2RlZmluZSBOSUNfQ0ZHX1JTU19CQVNFX0NQVV9TSElGVAkJMTkKKyNkZWZpbmUgTklDX0NGR19SU1NfRU5BQkxFCQkJKDFVTCA8PCAyMikKKyNkZWZpbmUgTklDX0NGR19SU1NfRU5BQkxFX01BU0tfRklFTEQJCTFVTAorI2RlZmluZSBOSUNfQ0ZHX1JTU19FTkFCTEVfU0hJRlQJCTIyCisjZGVmaW5lIE5JQ19DRkdfVFNPX0lQSURfU1BMSVRfRU4JCSgxVUwgPDwgMjMpCisjZGVmaW5lIE5JQ19DRkdfVFNPX0lQSURfU1BMSVRfRU5fTUFTS19GSUVMRAkxVUwKKyNkZWZpbmUgTklDX0NGR19UU09fSVBJRF9TUExJVF9FTl9TSElGVAkJMjMKKyNkZWZpbmUgTklDX0NGR19JR19WTEFOX1NUUklQX0VOCQkoMVVMIDw8IDI0KQorI2RlZmluZSBOSUNfQ0ZHX0lHX1ZMQU5fU1RSSVBfRU5fTUFTS19GSUVMRAkxVUwKKyNkZWZpbmUgTklDX0NGR19JR19WTEFOX1NUUklQX0VOX1NISUZUCQkyNAorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5pY19zZXRfbmljX2NmZyh1MzIgKm5pY19jZmcsCisJdTggcnNzX2RlZmF1bHRfY3B1LCB1OCByc3NfaGFzaF90eXBlLAorCXU4IHJzc19oYXNoX2JpdHMsIHU4IHJzc19iYXNlX2NwdSwKKwl1OCByc3NfZW5hYmxlLCB1OCB0c29faXBpZF9zcGxpdF9lbiwKKwl1OCBpZ192bGFuX3N0cmlwX2VuKQoreworCSpuaWNfY2ZnID0gKHJzc19kZWZhdWx0X2NwdSAmIE5JQ19DRkdfUlNTX0RFRkFVTFRfQ1BVX01BU0tfRklFTEQpIHwKKwkJKChyc3NfaGFzaF90eXBlICYgTklDX0NGR19SU1NfSEFTSF9UWVBFX01BU0tfRklFTEQpCisJCQk8PCBOSUNfQ0ZHX1JTU19IQVNIX1RZUEVfU0hJRlQpIHwKKwkJKChyc3NfaGFzaF9iaXRzICYgTklDX0NGR19SU1NfSEFTSF9CSVRTX01BU0tfRklFTEQpCisJCQk8PCBOSUNfQ0ZHX1JTU19IQVNIX0JJVFNfU0hJRlQpIHwKKwkJKChyc3NfYmFzZV9jcHUgJiBOSUNfQ0ZHX1JTU19CQVNFX0NQVV9NQVNLX0ZJRUxEKQorCQkJPDwgTklDX0NGR19SU1NfQkFTRV9DUFVfU0hJRlQpIHwKKwkJKChyc3NfZW5hYmxlICYgTklDX0NGR19SU1NfRU5BQkxFX01BU0tfRklFTEQpCisJCQk8PCBOSUNfQ0ZHX1JTU19FTkFCTEVfU0hJRlQpIHwKKwkJKCh0c29faXBpZF9zcGxpdF9lbiAmIE5JQ19DRkdfVFNPX0lQSURfU1BMSVRfRU5fTUFTS19GSUVMRCkKKwkJCTw8IE5JQ19DRkdfVFNPX0lQSURfU1BMSVRfRU5fU0hJRlQpIHwKKwkJKChpZ192bGFuX3N0cmlwX2VuICYgTklDX0NGR19JR19WTEFOX1NUUklQX0VOX01BU0tfRklFTEQpCisJCQk8PCBOSUNfQ0ZHX0lHX1ZMQU5fU1RSSVBfRU5fU0hJRlQpOworfQorCisjZW5kaWYgLyogX1ZOSUNfTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcmVzb3VyY2UuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGQyODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcmVzb3VyY2UuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfVk5JQ19SRVNPVVJDRV9IXworI2RlZmluZSBfVk5JQ19SRVNPVVJDRV9IXworCisjZGVmaW5lIFZOSUNfUkVTX01BR0lDCQkweDc2NkU2OTYzTAkvKiAndm5pYycgKi8KKyNkZWZpbmUgVk5JQ19SRVNfVkVSU0lPTgkweDAwMDAwMDAwTAorCisvKiB2TklDIHJlc291cmNlIHR5cGVzICovCitlbnVtIHZuaWNfcmVzX3R5cGUgeworCVJFU19UWVBFX0VPTCwJCQkvKiBFbmQtb2YtbGlzdCAqLworCVJFU19UWVBFX1dRLAkJCS8qIFdvcmsgcXVldWVzICovCisJUkVTX1RZUEVfUlEsCQkJLyogUmVjZWl2ZSBxdWV1ZXMgKi8KKwlSRVNfVFlQRV9DUSwJCQkvKiBDb21wbGV0aW9uIHF1ZXVlcyAqLworCVJFU19UWVBFX1JTVkQxLAorCVJFU19UWVBFX05JQ19DRkcsCQkvKiBFbmV0IE5JQyBjb25maWcgcmVnaXN0ZXJzICovCisJUkVTX1RZUEVfUlNWRDIsCisJUkVTX1RZUEVfUlNWRDMsCisJUkVTX1RZUEVfUlNWRDQsCisJUkVTX1RZUEVfUlNWRDUsCisJUkVTX1RZUEVfSU5UUl9DVFJMLAkJLyogSW50ZXJydXB0IGN0cmwgdGFibGUgKi8KKwlSRVNfVFlQRV9JTlRSX1RBQkxFLAkJLyogTVNJL01TSS1YIEludGVycnVwdCB0YWJsZSAqLworCVJFU19UWVBFX0lOVFJfUEJBLAkJLyogTVNJL01TSS1YIFBCQSB0YWJsZSAqLworCVJFU19UWVBFX0lOVFJfUEJBX0xFR0FDWSwJLyogTGVnYWN5IGludHIgc3RhdHVzLCByMmMgKi8KKwlSRVNfVFlQRV9SU1ZENiwKKwlSRVNfVFlQRV9SU1ZENywKKwlSRVNfVFlQRV9ERVZDTUQsCQkvKiBEZXZpY2UgY29tbWFuZCByZWdpb24gKi8KKwlSRVNfVFlQRV9QQVNTX1RIUlVfUEFHRSwJLyogUGFzcy10aHJ1IHBhZ2UgKi8KKworCVJFU19UWVBFX01BWCwJCQkvKiBDb3VudCBvZiByZXNvdXJjZSB0eXBlcyAqLworfTsKKworc3RydWN0IHZuaWNfcmVzb3VyY2VfaGVhZGVyIHsKKwl1MzIgbWFnaWM7CisJdTMyIHZlcnNpb247Cit9OworCitzdHJ1Y3Qgdm5pY19yZXNvdXJjZSB7CisJdTggdHlwZTsKKwl1OCBiYXI7CisJdTggcGFkWzJdOworCXUzMiBiYXJfb2Zmc2V0OworCXUzMiBjb3VudDsKK307CisKKyNlbmRpZiAvKiBfVk5JQ19SRVNPVVJDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3JxLmMgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY1ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3JxLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ2bmljX2Rldi5oIgorI2luY2x1ZGUgInZuaWNfcnEuaCIKKworc3RhdGljIGludCB2bmljX3JxX2FsbG9jX2J1ZnMoc3RydWN0IHZuaWNfcnEgKnJxKQoreworCXN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmOworCXN0cnVjdCB2bmljX2RldiAqdmRldjsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgY291bnQgPSBycS0+cmluZy5kZXNjX2NvdW50OworCXVuc2lnbmVkIGludCBibGtzID0gVk5JQ19SUV9CVUZfQkxLU19ORUVERUQoY291bnQpOworCisJdmRldiA9IHJxLT52ZGV2OworCisJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkrKykgeworCQlycS0+YnVmc1tpXSA9IGt6YWxsb2MoVk5JQ19SUV9CVUZfQkxLX1NaLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFycS0+YnVmc1tpXSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2MgcnFfYnVmc1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpKyspIHsKKwkJYnVmID0gcnEtPmJ1ZnNbaV07CisJCWZvciAoaiA9IDA7IGogPCBWTklDX1JRX0JVRl9CTEtfRU5UUklFUzsgaisrKSB7CisJCQlidWYtPmluZGV4ID0gaSAqIFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTICsgajsKKwkJCWJ1Zi0+ZGVzYyA9ICh1OCAqKXJxLT5yaW5nLmRlc2NzICsKKwkJCQlycS0+cmluZy5kZXNjX3NpemUgKiBidWYtPmluZGV4OworCQkJaWYgKGJ1Zi0+aW5kZXggKyAxID09IGNvdW50KSB7CisJCQkJYnVmLT5uZXh0ID0gcnEtPmJ1ZnNbMF07CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGogKyAxID09IFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTKSB7CisJCQkJYnVmLT5uZXh0ID0gcnEtPmJ1ZnNbaSArIDFdOworCQkJfSBlbHNlIHsKKwkJCQlidWYtPm5leHQgPSBidWYgKyAxOworCQkJCWJ1ZisrOworCQkJfQorCQl9CisJfQorCisJcnEtPnRvX3VzZSA9IHJxLT50b19jbGVhbiA9IHJxLT5idWZzWzBdOworCXJxLT5idWZfaW5kZXggPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm5pY19ycV9mcmVlKHN0cnVjdCB2bmljX3JxICpycSkKK3sKKwlzdHJ1Y3Qgdm5pY19kZXYgKnZkZXY7CisJdW5zaWduZWQgaW50IGk7CisKKwl2ZGV2ID0gcnEtPnZkZXY7CisKKwl2bmljX2Rldl9mcmVlX2Rlc2NfcmluZyh2ZGV2LCAmcnEtPnJpbmcpOworCisJZm9yIChpID0gMDsgaSA8IFZOSUNfUlFfQlVGX0JMS1NfTUFYOyBpKyspIHsKKwkJa2ZyZWUocnEtPmJ1ZnNbaV0pOworCQlycS0+YnVmc1tpXSA9IE5VTEw7CisJfQorCisJcnEtPmN0cmwgPSBOVUxMOworfQorCitpbnQgdm5pY19ycV9hbGxvYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX3JxICpycSwgdW5zaWduZWQgaW50IGluZGV4LAorCXVuc2lnbmVkIGludCBkZXNjX2NvdW50LCB1bnNpZ25lZCBpbnQgZGVzY19zaXplKQoreworCWludCBlcnI7CisKKwlycS0+aW5kZXggPSBpbmRleDsKKwlycS0+dmRldiA9IHZkZXY7CisKKwlycS0+Y3RybCA9IHZuaWNfZGV2X2dldF9yZXModmRldiwgUkVTX1RZUEVfUlEsIGluZGV4KTsKKwlpZiAoIXJxLT5jdHJsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGhvb2sgUlFbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZuaWNfcnFfZGlzYWJsZShycSk7CisKKwllcnIgPSB2bmljX2Rldl9hbGxvY19kZXNjX3JpbmcodmRldiwgJnJxLT5yaW5nLCBkZXNjX2NvdW50LCBkZXNjX3NpemUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB2bmljX3JxX2FsbG9jX2J1ZnMocnEpOworCWlmIChlcnIpIHsKKwkJdm5pY19ycV9mcmVlKHJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2bmljX3JxX2luaXQoc3RydWN0IHZuaWNfcnEgKnJxLCB1bnNpZ25lZCBpbnQgY3FfaW5kZXgsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9lbmFibGUsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9vZmZzZXQpCit7CisJdTY0IHBhZGRyOworCXUzMiBmZXRjaF9pbmRleDsKKworCXBhZGRyID0gKHU2NClycS0+cmluZy5iYXNlX2FkZHIgfCBWTklDX1BBRERSX1RBUkdFVDsKKwl3cml0ZXEocGFkZHIsICZycS0+Y3RybC0+cmluZ19iYXNlKTsKKwlpb3dyaXRlMzIocnEtPnJpbmcuZGVzY19jb3VudCwgJnJxLT5jdHJsLT5yaW5nX3NpemUpOworCWlvd3JpdGUzMihjcV9pbmRleCwgJnJxLT5jdHJsLT5jcV9pbmRleCk7CisJaW93cml0ZTMyKGVycm9yX2ludGVycnVwdF9lbmFibGUsICZycS0+Y3RybC0+ZXJyb3JfaW50ZXJydXB0X2VuYWJsZSk7CisJaW93cml0ZTMyKGVycm9yX2ludGVycnVwdF9vZmZzZXQsICZycS0+Y3RybC0+ZXJyb3JfaW50ZXJydXB0X29mZnNldCk7CisJaW93cml0ZTMyKDAsICZycS0+Y3RybC0+ZHJvcHBlZF9wYWNrZXRfY291bnQpOworCWlvd3JpdGUzMigwLCAmcnEtPmN0cmwtPmVycm9yX3N0YXR1cyk7CisKKwkvKiBVc2UgY3VycmVudCBmZXRjaF9pbmRleCBhcyB0aGUgcmluZyBzdGFydGluZyBwb2ludCAqLworCWZldGNoX2luZGV4ID0gaW9yZWFkMzIoJnJxLT5jdHJsLT5mZXRjaF9pbmRleCk7CisJcnEtPnRvX3VzZSA9IHJxLT50b19jbGVhbiA9CisJCSZycS0+YnVmc1tmZXRjaF9pbmRleCAvIFZOSUNfUlFfQlVGX0JMS19FTlRSSUVTXQorCQkJW2ZldGNoX2luZGV4ICUgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVNdOworCWlvd3JpdGUzMihmZXRjaF9pbmRleCwgJnJxLT5jdHJsLT5wb3N0ZWRfaW5kZXgpOworCisJcnEtPmJ1Zl9pbmRleCA9IDA7Cit9CisKK3Vuc2lnbmVkIGludCB2bmljX3JxX2Vycm9yX3N0YXR1cyhzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJcmV0dXJuIGlvcmVhZDMyKCZycS0+Y3RybC0+ZXJyb3Jfc3RhdHVzKTsKK30KKwordm9pZCB2bmljX3JxX2VuYWJsZShzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJaW93cml0ZTMyKDEsICZycS0+Y3RybC0+ZW5hYmxlKTsKK30KKworaW50IHZuaWNfcnFfZGlzYWJsZShzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJdW5zaWduZWQgaW50IHdhaXQ7CisKKwlpb3dyaXRlMzIoMCwgJnJxLT5jdHJsLT5lbmFibGUpOworCisJLyogV2FpdCBmb3IgSFcgdG8gQUNLIGRpc2FibGUgcmVxdWVzdCAqLworCWZvciAod2FpdCA9IDA7IHdhaXQgPCAxMDA7IHdhaXQrKykgeworCQlpZiAoIShpb3JlYWQzMigmcnEtPmN0cmwtPnJ1bm5pbmcpKSkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoMSk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZGlzYWJsZSBSUVslZF1cbiIsIHJxLT5pbmRleCk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKwordm9pZCB2bmljX3JxX2NsZWFuKHN0cnVjdCB2bmljX3JxICpycSwKKwl2b2lkICgqYnVmX2NsZWFuKShzdHJ1Y3Qgdm5pY19ycSAqcnEsIHN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmKSkKK3sKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKmJ1ZjsKKwl1MzIgZmV0Y2hfaW5kZXg7CisKKwlCVUdfT04oaW9yZWFkMzIoJnJxLT5jdHJsLT5lbmFibGUpKTsKKworCWJ1ZiA9IHJxLT50b19jbGVhbjsKKworCXdoaWxlICh2bmljX3JxX2Rlc2NfdXNlZChycSkgPiAwKSB7CisKKwkJKCpidWZfY2xlYW4pKHJxLCBidWYpOworCisJCWJ1ZiA9IHJxLT50b19jbGVhbiA9IGJ1Zi0+bmV4dDsKKwkJcnEtPnJpbmcuZGVzY19hdmFpbCsrOworCX0KKworCS8qIFVzZSBjdXJyZW50IGZldGNoX2luZGV4IGFzIHRoZSByaW5nIHN0YXJ0aW5nIHBvaW50ICovCisJZmV0Y2hfaW5kZXggPSBpb3JlYWQzMigmcnEtPmN0cmwtPmZldGNoX2luZGV4KTsKKwlycS0+dG9fdXNlID0gcnEtPnRvX2NsZWFuID0KKwkJJnJxLT5idWZzW2ZldGNoX2luZGV4IC8gVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVNdCisJCQlbZmV0Y2hfaW5kZXggJSBWTklDX1JRX0JVRl9CTEtfRU5UUklFU107CisJaW93cml0ZTMyKGZldGNoX2luZGV4LCAmcnEtPmN0cmwtPnBvc3RlZF9pbmRleCk7CisKKwlycS0+YnVmX2luZGV4ID0gMDsKKworCXZuaWNfZGV2X2NsZWFyX2Rlc2NfcmluZygmcnEtPnJpbmcpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnEuaCBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19ycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnEuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX1ZOSUNfUlFfSF8KKyNkZWZpbmUgX1ZOSUNfUlFfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAidm5pY19kZXYuaCIKKyNpbmNsdWRlICJ2bmljX2NxLmgiCisKKy8qIFJlY2VpdmUgcXVldWUgY29udHJvbCAqLworc3RydWN0IHZuaWNfcnFfY3RybCB7CisJdTY0IHJpbmdfYmFzZTsJCQkvKiAweDAwICovCisJdTMyIHJpbmdfc2l6ZTsJCQkvKiAweDA4ICovCisJdTMyIHBhZDA7CisJdTMyIHBvc3RlZF9pbmRleDsJCS8qIDB4MTAgKi8KKwl1MzIgcGFkMTsKKwl1MzIgY3FfaW5kZXg7CQkJLyogMHgxOCAqLworCXUzMiBwYWQyOworCXUzMiBlbmFibGU7CQkJLyogMHgyMCAqLworCXUzMiBwYWQzOworCXUzMiBydW5uaW5nOwkJCS8qIDB4MjggKi8KKwl1MzIgcGFkNDsKKwl1MzIgZmV0Y2hfaW5kZXg7CQkvKiAweDMwICovCisJdTMyIHBhZDU7CisJdTMyIGVycm9yX2ludGVycnVwdF9lbmFibGU7CS8qIDB4MzggKi8KKwl1MzIgcGFkNjsKKwl1MzIgZXJyb3JfaW50ZXJydXB0X29mZnNldDsJLyogMHg0MCAqLworCXUzMiBwYWQ3OworCXUzMiBlcnJvcl9zdGF0dXM7CQkvKiAweDQ4ICovCisJdTMyIHBhZDg7CisJdTMyIGRyb3BwZWRfcGFja2V0X2NvdW50OwkvKiAweDUwICovCisJdTMyIHBhZDk7CisJdTMyIGRyb3BwZWRfcGFja2V0X2NvdW50X3JjOwkvKiAweDU4ICovCisJdTMyIHBhZDEwOworfTsKKworLyogQnJlYWsgdGhlIHZuaWNfcnFfYnVmIGFsbG9jYXRpb25zIGludG8gYmxvY2tzIG9mIDY0IGVudHJpZXMgKi8KKyNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMgNjQKKyNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLX1NaIFwKKwkoVk5JQ19SUV9CVUZfQkxLX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHZuaWNfcnFfYnVmKSkKKyNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLU19ORUVERUQoZW50cmllcykgXAorCURJVl9ST1VORF9VUChlbnRyaWVzLCBWTklDX1JRX0JVRl9CTEtfRU5UUklFUykKKyNkZWZpbmUgVk5JQ19SUV9CVUZfQkxLU19NQVggVk5JQ19SUV9CVUZfQkxLU19ORUVERUQoNDA5NikKKworc3RydWN0IHZuaWNfcnFfYnVmIHsKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKm5leHQ7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl2b2lkICpvc19idWY7CisJdW5zaWduZWQgaW50IG9zX2J1Zl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2b2lkICpkZXNjOworfTsKKworc3RydWN0IHZuaWNfcnEgeworCXVuc2lnbmVkIGludCBpbmRleDsKKwlzdHJ1Y3Qgdm5pY19kZXYgKnZkZXY7CisJc3RydWN0IHZuaWNfcnFfY3RybCBfX2lvbWVtICpjdHJsOyAgICAgICAgICAgICAgLyogbWVtb3J5LW1hcHBlZCAqLworCXN0cnVjdCB2bmljX2Rldl9yaW5nIHJpbmc7CisJc3RydWN0IHZuaWNfcnFfYnVmICpidWZzW1ZOSUNfUlFfQlVGX0JMS1NfTUFYXTsKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKnRvX3VzZTsKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKnRvX2NsZWFuOworCXZvaWQgKm9zX2J1Zl9oZWFkOworCXVuc2lnbmVkIGludCBidWZfaW5kZXg7CisJdW5zaWduZWQgaW50IHBrdHNfb3V0c3RhbmRpbmc7Cit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmljX3JxX2Rlc2NfYXZhaWwoc3RydWN0IHZuaWNfcnEgKnJxKQoreworCS8qIGhvdyBtYW55IGRvZXMgU1cgb3duPyAqLworCXJldHVybiBycS0+cmluZy5kZXNjX2F2YWlsOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmljX3JxX2Rlc2NfdXNlZChzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJLyogaG93IG1hbnkgZG9lcyBIVyBvd24/ICovCisJcmV0dXJuIHJxLT5yaW5nLmRlc2NfY291bnQgLSBycS0+cmluZy5kZXNjX2F2YWlsIC0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp2bmljX3JxX25leHRfZGVzYyhzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJcmV0dXJuIHJxLT50b191c2UtPmRlc2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZuaWNfcnFfbmV4dF9pbmRleChzdHJ1Y3Qgdm5pY19ycSAqcnEpCit7CisJcmV0dXJuIHJxLT50b191c2UtPmluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmljX3JxX25leHRfYnVmX2luZGV4KHN0cnVjdCB2bmljX3JxICpycSkKK3sKKwlyZXR1cm4gcnEtPmJ1Zl9pbmRleCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5pY19ycV9wb3N0KHN0cnVjdCB2bmljX3JxICpycSwKKwl2b2lkICpvc19idWYsIHVuc2lnbmVkIGludCBvc19idWZfaW5kZXgsCisJZG1hX2FkZHJfdCBkbWFfYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKmJ1ZiA9IHJxLT50b191c2U7CisKKwlidWYtPm9zX2J1ZiA9IG9zX2J1ZjsKKwlidWYtPm9zX2J1Zl9pbmRleCA9IG9zX2J1Zl9pbmRleDsKKwlidWYtPmRtYV9hZGRyID0gZG1hX2FkZHI7CisJYnVmLT5sZW4gPSBsZW47CisKKwlidWYgPSBidWYtPm5leHQ7CisJcnEtPnRvX3VzZSA9IGJ1ZjsKKwlycS0+cmluZy5kZXNjX2F2YWlsLS07CisKKwkvKiBNb3ZlIHRoZSBwb3N0ZWRfaW5kZXggZXZlcnkgbnRoIGRlc2NyaXB0b3IKKwkgKi8KKworI2lmbmRlZiBWTklDX1JRX1JFVFVSTl9SQVRFCisjZGVmaW5lIFZOSUNfUlFfUkVUVVJOX1JBVEUJCTB4ZgkvKiBrZWVwIDJebiAtIDEgKi8KKyNlbmRpZgorCisJaWYgKChidWYtPmluZGV4ICYgVk5JQ19SUV9SRVRVUk5fUkFURSkgPT0gMCkKKwkJaW93cml0ZTMyKGJ1Zi0+aW5kZXgsICZycS0+Y3RybC0+cG9zdGVkX2luZGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZuaWNfcnFfcmV0dXJuX2Rlc2NzKHN0cnVjdCB2bmljX3JxICpycSwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXJxLT5yaW5nLmRlc2NfYXZhaWwgKz0gY291bnQ7Cit9CisKK2VudW0gZGVzY19yZXR1cm5fb3B0aW9ucyB7CisJVk5JQ19SUV9SRVRVUk5fREVTQywKKwlWTklDX1JRX0RFRkVSX1JFVFVSTl9ERVNDLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZuaWNfcnFfc2VydmljZShzdHJ1Y3Qgdm5pY19ycSAqcnEsCisJc3RydWN0IGNxX2Rlc2MgKmNxX2Rlc2MsIHUxNiBjb21wbGV0ZWRfaW5kZXgsCisJaW50IGRlc2NfcmV0dXJuLCB2b2lkICgqYnVmX3NlcnZpY2UpKHN0cnVjdCB2bmljX3JxICpycSwKKwlzdHJ1Y3QgY3FfZGVzYyAqY3FfZGVzYywgc3RydWN0IHZuaWNfcnFfYnVmICpidWYsCisJaW50IHNraXBwZWQsIHZvaWQgKm9wYXF1ZSksIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3Qgdm5pY19ycV9idWYgKmJ1ZjsKKwlpbnQgc2tpcHBlZDsKKworCWJ1ZiA9IHJxLT50b19jbGVhbjsKKwl3aGlsZSAoMSkgeworCisJCXNraXBwZWQgPSAoYnVmLT5pbmRleCAhPSBjb21wbGV0ZWRfaW5kZXgpOworCisJCSgqYnVmX3NlcnZpY2UpKHJxLCBjcV9kZXNjLCBidWYsIHNraXBwZWQsIG9wYXF1ZSk7CisKKwkJaWYgKGRlc2NfcmV0dXJuID09IFZOSUNfUlFfUkVUVVJOX0RFU0MpCisJCQlycS0+cmluZy5kZXNjX2F2YWlsKys7CisKKwkJcnEtPnRvX2NsZWFuID0gYnVmLT5uZXh0OworCisJCWlmICghc2tpcHBlZCkKKwkJCWJyZWFrOworCisJCWJ1ZiA9IHJxLT50b19jbGVhbjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZuaWNfcnFfZmlsbChzdHJ1Y3Qgdm5pY19ycSAqcnEsCisJaW50ICgqYnVmX2ZpbGwpKHN0cnVjdCB2bmljX3JxICpycSkpCit7CisJaW50IGVycjsKKworCXdoaWxlICh2bmljX3JxX2Rlc2NfYXZhaWwocnEpID4gMSkgeworCisJCWVyciA9ICgqYnVmX2ZpbGwpKHJxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm5pY19ycV9mcmVlKHN0cnVjdCB2bmljX3JxICpycSk7CitpbnQgdm5pY19ycV9hbGxvYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX3JxICpycSwgdW5zaWduZWQgaW50IGluZGV4LAorCXVuc2lnbmVkIGludCBkZXNjX2NvdW50LCB1bnNpZ25lZCBpbnQgZGVzY19zaXplKTsKK3ZvaWQgdm5pY19ycV9pbml0KHN0cnVjdCB2bmljX3JxICpycSwgdW5zaWduZWQgaW50IGNxX2luZGV4LAorCXVuc2lnbmVkIGludCBlcnJvcl9pbnRlcnJ1cHRfZW5hYmxlLAorCXVuc2lnbmVkIGludCBlcnJvcl9pbnRlcnJ1cHRfb2Zmc2V0KTsKK3Vuc2lnbmVkIGludCB2bmljX3JxX2Vycm9yX3N0YXR1cyhzdHJ1Y3Qgdm5pY19ycSAqcnEpOwordm9pZCB2bmljX3JxX2VuYWJsZShzdHJ1Y3Qgdm5pY19ycSAqcnEpOworaW50IHZuaWNfcnFfZGlzYWJsZShzdHJ1Y3Qgdm5pY19ycSAqcnEpOwordm9pZCB2bmljX3JxX2NsZWFuKHN0cnVjdCB2bmljX3JxICpycSwKKwl2b2lkICgqYnVmX2NsZWFuKShzdHJ1Y3Qgdm5pY19ycSAqcnEsIHN0cnVjdCB2bmljX3JxX2J1ZiAqYnVmKSk7CisKKyNlbmRpZiAvKiBfVk5JQ19SUV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jzcy5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3Jzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjVkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfcnNzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IENpc2NvIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwNyBOdW92YSBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX1ZOSUNfUlNTX0hfCisjZGVmaW5lIF9WTklDX1JTU19IXworCisvKiBSU1Mga2V5IGFycmF5ICovCit1bmlvbiB2bmljX3Jzc19rZXkgeworCXN0cnVjdCB7CisJCXU4IGJbMTBdOworCQl1OCBiX3BhZFs2XTsKKwl9IGtleVs0XTsKKwl1NjQgcmF3WzhdOworfTsKKworLyogUlNTIGNwdSBhcnJheSAqLwordW5pb24gdm5pY19yc3NfY3B1IHsKKwlzdHJ1Y3QgeworCQl1OCBiWzRdIDsKKwkJdTggYl9wYWRbNF07CisJfSBjcHVbMzJdOworCXU2NCByYXdbMzJdOworfTsKKwordm9pZCB2bmljX3NldF9yc3Nfa2V5KHVuaW9uIHZuaWNfcnNzX2tleSAqcnNzX2tleSwgdTggKmtleSk7Cit2b2lkIHZuaWNfc2V0X3Jzc19jcHUodW5pb24gdm5pY19yc3NfY3B1ICpyc3NfY3B1LCB1OCAqY3B1KTsKK3ZvaWQgdm5pY19nZXRfcnNzX2tleSh1bmlvbiB2bmljX3Jzc19rZXkgKnJzc19rZXksIHU4ICprZXkpOwordm9pZCB2bmljX2dldF9yc3NfY3B1KHVuaW9uIHZuaWNfcnNzX2NwdSAqcnNzX2NwdSwgdTggKmNwdSk7CisKKyNlbmRpZiAvKiBfVk5JQ19SU1NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19zdGF0cy5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmOTYxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY19zdGF0cy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9WTklDX1NUQVRTX0hfCisjZGVmaW5lIF9WTklDX1NUQVRTX0hfCisKKy8qIFR4IHN0YXRpc3RpY3MgKi8KK3N0cnVjdCB2bmljX3R4X3N0YXRzIHsKKwl1NjQgdHhfZnJhbWVzX29rOworCXU2NCB0eF91bmljYXN0X2ZyYW1lc19vazsKKwl1NjQgdHhfbXVsdGljYXN0X2ZyYW1lc19vazsKKwl1NjQgdHhfYnJvYWRjYXN0X2ZyYW1lc19vazsKKwl1NjQgdHhfYnl0ZXNfb2s7CisJdTY0IHR4X3VuaWNhc3RfYnl0ZXNfb2s7CisJdTY0IHR4X211bHRpY2FzdF9ieXRlc19vazsKKwl1NjQgdHhfYnJvYWRjYXN0X2J5dGVzX29rOworCXU2NCB0eF9kcm9wczsKKwl1NjQgdHhfZXJyb3JzOworCXU2NCB0eF90c287CisJdTY0IHJzdmRbMTZdOworfTsKKworLyogUnggc3RhdGlzdGljcyAqLworc3RydWN0IHZuaWNfcnhfc3RhdHMgeworCXU2NCByeF9mcmFtZXNfb2s7CisJdTY0IHJ4X2ZyYW1lc190b3RhbDsKKwl1NjQgcnhfdW5pY2FzdF9mcmFtZXNfb2s7CisJdTY0IHJ4X211bHRpY2FzdF9mcmFtZXNfb2s7CisJdTY0IHJ4X2Jyb2FkY2FzdF9mcmFtZXNfb2s7CisJdTY0IHJ4X2J5dGVzX29rOworCXU2NCByeF91bmljYXN0X2J5dGVzX29rOworCXU2NCByeF9tdWx0aWNhc3RfYnl0ZXNfb2s7CisJdTY0IHJ4X2Jyb2FkY2FzdF9ieXRlc19vazsKKwl1NjQgcnhfZHJvcDsKKwl1NjQgcnhfbm9fYnVmczsKKwl1NjQgcnhfZXJyb3JzOworCXU2NCByeF9yc3M7CisJdTY0IHJ4X2NyY19lcnJvcnM7CisJdTY0IHJ4X2ZyYW1lc182NDsKKwl1NjQgcnhfZnJhbWVzXzEyNzsKKwl1NjQgcnhfZnJhbWVzXzI1NTsKKwl1NjQgcnhfZnJhbWVzXzUxMTsKKwl1NjQgcnhfZnJhbWVzXzEwMjM7CisJdTY0IHJ4X2ZyYW1lc18xNTE4OworCXU2NCByeF9mcmFtZXNfdG9fbWF4OworCXU2NCByc3ZkWzE2XTsKK307CisKK3N0cnVjdCB2bmljX3N0YXRzIHsKKwlzdHJ1Y3Qgdm5pY190eF9zdGF0cyB0eDsKKwlzdHJ1Y3Qgdm5pY19yeF9zdGF0cyByeDsKK307CisKKyNlbmRpZiAvKiBfVk5JQ19TVEFUU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmMgYi9kcml2ZXJzL25ldC9lbmljL3ZuaWNfd3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc2ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDcgTnVvdmEgU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ2bmljX2Rldi5oIgorI2luY2x1ZGUgInZuaWNfd3EuaCIKKworc3RhdGljIGludCB2bmljX3dxX2FsbG9jX2J1ZnMoc3RydWN0IHZuaWNfd3EgKndxKQoreworCXN0cnVjdCB2bmljX3dxX2J1ZiAqYnVmOworCXN0cnVjdCB2bmljX2RldiAqdmRldjsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgY291bnQgPSB3cS0+cmluZy5kZXNjX2NvdW50OworCXVuc2lnbmVkIGludCBibGtzID0gVk5JQ19XUV9CVUZfQkxLU19ORUVERUQoY291bnQpOworCisJdmRldiA9IHdxLT52ZGV2OworCisJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkrKykgeworCQl3cS0+YnVmc1tpXSA9IGt6YWxsb2MoVk5JQ19XUV9CVUZfQkxLX1NaLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCF3cS0+YnVmc1tpXSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2Mgd3FfYnVmc1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpKyspIHsKKwkJYnVmID0gd3EtPmJ1ZnNbaV07CisJCWZvciAoaiA9IDA7IGogPCBWTklDX1dRX0JVRl9CTEtfRU5UUklFUzsgaisrKSB7CisJCQlidWYtPmluZGV4ID0gaSAqIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTICsgajsKKwkJCWJ1Zi0+ZGVzYyA9ICh1OCAqKXdxLT5yaW5nLmRlc2NzICsKKwkJCQl3cS0+cmluZy5kZXNjX3NpemUgKiBidWYtPmluZGV4OworCQkJaWYgKGJ1Zi0+aW5kZXggKyAxID09IGNvdW50KSB7CisJCQkJYnVmLT5uZXh0ID0gd3EtPmJ1ZnNbMF07CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGogKyAxID09IFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTKSB7CisJCQkJYnVmLT5uZXh0ID0gd3EtPmJ1ZnNbaSArIDFdOworCQkJfSBlbHNlIHsKKwkJCQlidWYtPm5leHQgPSBidWYgKyAxOworCQkJCWJ1ZisrOworCQkJfQorCQl9CisJfQorCisJd3EtPnRvX3VzZSA9IHdxLT50b19jbGVhbiA9IHdxLT5idWZzWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm5pY193cV9mcmVlKHN0cnVjdCB2bmljX3dxICp3cSkKK3sKKwlzdHJ1Y3Qgdm5pY19kZXYgKnZkZXY7CisJdW5zaWduZWQgaW50IGk7CisKKwl2ZGV2ID0gd3EtPnZkZXY7CisKKwl2bmljX2Rldl9mcmVlX2Rlc2NfcmluZyh2ZGV2LCAmd3EtPnJpbmcpOworCisJZm9yIChpID0gMDsgaSA8IFZOSUNfV1FfQlVGX0JMS1NfTUFYOyBpKyspIHsKKwkJa2ZyZWUod3EtPmJ1ZnNbaV0pOworCQl3cS0+YnVmc1tpXSA9IE5VTEw7CisJfQorCisJd3EtPmN0cmwgPSBOVUxMOworfQorCitpbnQgdm5pY193cV9hbGxvYyhzdHJ1Y3Qgdm5pY19kZXYgKnZkZXYsIHN0cnVjdCB2bmljX3dxICp3cSwgdW5zaWduZWQgaW50IGluZGV4LAorCXVuc2lnbmVkIGludCBkZXNjX2NvdW50LCB1bnNpZ25lZCBpbnQgZGVzY19zaXplKQoreworCWludCBlcnI7CisKKwl3cS0+aW5kZXggPSBpbmRleDsKKwl3cS0+dmRldiA9IHZkZXY7CisKKwl3cS0+Y3RybCA9IHZuaWNfZGV2X2dldF9yZXModmRldiwgUkVTX1RZUEVfV1EsIGluZGV4KTsKKwlpZiAoIXdxLT5jdHJsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGhvb2sgV1FbJWRdIHJlc291cmNlXG4iLCBpbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZuaWNfd3FfZGlzYWJsZSh3cSk7CisKKwllcnIgPSB2bmljX2Rldl9hbGxvY19kZXNjX3JpbmcodmRldiwgJndxLT5yaW5nLCBkZXNjX2NvdW50LCBkZXNjX3NpemUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB2bmljX3dxX2FsbG9jX2J1ZnMod3EpOworCWlmIChlcnIpIHsKKwkJdm5pY193cV9mcmVlKHdxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2bmljX3dxX2luaXQoc3RydWN0IHZuaWNfd3EgKndxLCB1bnNpZ25lZCBpbnQgY3FfaW5kZXgsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9lbmFibGUsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9vZmZzZXQpCit7CisJdTY0IHBhZGRyOworCisJcGFkZHIgPSAodTY0KXdxLT5yaW5nLmJhc2VfYWRkciB8IFZOSUNfUEFERFJfVEFSR0VUOworCXdyaXRlcShwYWRkciwgJndxLT5jdHJsLT5yaW5nX2Jhc2UpOworCWlvd3JpdGUzMih3cS0+cmluZy5kZXNjX2NvdW50LCAmd3EtPmN0cmwtPnJpbmdfc2l6ZSk7CisJaW93cml0ZTMyKDAsICZ3cS0+Y3RybC0+ZmV0Y2hfaW5kZXgpOworCWlvd3JpdGUzMigwLCAmd3EtPmN0cmwtPnBvc3RlZF9pbmRleCk7CisJaW93cml0ZTMyKGNxX2luZGV4LCAmd3EtPmN0cmwtPmNxX2luZGV4KTsKKwlpb3dyaXRlMzIoZXJyb3JfaW50ZXJydXB0X2VuYWJsZSwgJndxLT5jdHJsLT5lcnJvcl9pbnRlcnJ1cHRfZW5hYmxlKTsKKwlpb3dyaXRlMzIoZXJyb3JfaW50ZXJydXB0X29mZnNldCwgJndxLT5jdHJsLT5lcnJvcl9pbnRlcnJ1cHRfb2Zmc2V0KTsKKwlpb3dyaXRlMzIoMCwgJndxLT5jdHJsLT5lcnJvcl9zdGF0dXMpOworfQorCit1bnNpZ25lZCBpbnQgdm5pY193cV9lcnJvcl9zdGF0dXMoc3RydWN0IHZuaWNfd3EgKndxKQoreworCXJldHVybiBpb3JlYWQzMigmd3EtPmN0cmwtPmVycm9yX3N0YXR1cyk7Cit9CisKK3ZvaWQgdm5pY193cV9lbmFibGUoc3RydWN0IHZuaWNfd3EgKndxKQoreworCWlvd3JpdGUzMigxLCAmd3EtPmN0cmwtPmVuYWJsZSk7Cit9CisKK2ludCB2bmljX3dxX2Rpc2FibGUoc3RydWN0IHZuaWNfd3EgKndxKQoreworCXVuc2lnbmVkIGludCB3YWl0OworCisJaW93cml0ZTMyKDAsICZ3cS0+Y3RybC0+ZW5hYmxlKTsKKworCS8qIFdhaXQgZm9yIEhXIHRvIEFDSyBkaXNhYmxlIHJlcXVlc3QgKi8KKwlmb3IgKHdhaXQgPSAwOyB3YWl0IDwgMTAwOyB3YWl0KyspIHsKKwkJaWYgKCEoaW9yZWFkMzIoJndxLT5jdHJsLT5ydW5uaW5nKSkpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGRpc2FibGUgV1FbJWRdXG4iLCB3cS0+aW5kZXgpOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3ZvaWQgdm5pY193cV9jbGVhbihzdHJ1Y3Qgdm5pY193cSAqd3EsCisJdm9pZCAoKmJ1Zl9jbGVhbikoc3RydWN0IHZuaWNfd3EgKndxLCBzdHJ1Y3Qgdm5pY193cV9idWYgKmJ1ZikpCit7CisJc3RydWN0IHZuaWNfd3FfYnVmICpidWY7CisKKwlCVUdfT04oaW9yZWFkMzIoJndxLT5jdHJsLT5lbmFibGUpKTsKKworCWJ1ZiA9IHdxLT50b19jbGVhbjsKKworCXdoaWxlICh2bmljX3dxX2Rlc2NfdXNlZCh3cSkgPiAwKSB7CisKKwkJKCpidWZfY2xlYW4pKHdxLCBidWYpOworCisJCWJ1ZiA9IHdxLT50b19jbGVhbiA9IGJ1Zi0+bmV4dDsKKwkJd3EtPnJpbmcuZGVzY19hdmFpbCsrOworCX0KKworCXdxLT50b191c2UgPSB3cS0+dG9fY2xlYW4gPSB3cS0+YnVmc1swXTsKKworCWlvd3JpdGUzMigwLCAmd3EtPmN0cmwtPmZldGNoX2luZGV4KTsKKwlpb3dyaXRlMzIoMCwgJndxLT5jdHJsLT5wb3N0ZWRfaW5kZXgpOworCWlvd3JpdGUzMigwLCAmd3EtPmN0cmwtPmVycm9yX3N0YXR1cyk7CisKKwl2bmljX2Rldl9jbGVhcl9kZXNjX3JpbmcoJndxLT5yaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5oIGIvZHJpdmVycy9uZXQvZW5pYy92bmljX3dxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4MTgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VuaWMvdm5pY193cS5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfVk5JQ19XUV9IXworI2RlZmluZSBfVk5JQ19XUV9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJ2bmljX2Rldi5oIgorI2luY2x1ZGUgInZuaWNfY3EuaCIKKworLyogV29yayBxdWV1ZSBjb250cm9sICovCitzdHJ1Y3Qgdm5pY193cV9jdHJsIHsKKwl1NjQgcmluZ19iYXNlOwkJCS8qIDB4MDAgKi8KKwl1MzIgcmluZ19zaXplOwkJCS8qIDB4MDggKi8KKwl1MzIgcGFkMDsKKwl1MzIgcG9zdGVkX2luZGV4OwkJLyogMHgxMCAqLworCXUzMiBwYWQxOworCXUzMiBjcV9pbmRleDsJCQkvKiAweDE4ICovCisJdTMyIHBhZDI7CisJdTMyIGVuYWJsZTsJCQkvKiAweDIwICovCisJdTMyIHBhZDM7CisJdTMyIHJ1bm5pbmc7CQkJLyogMHgyOCAqLworCXUzMiBwYWQ0OworCXUzMiBmZXRjaF9pbmRleDsJCS8qIDB4MzAgKi8KKwl1MzIgcGFkNTsKKwl1MzIgZGNhX3ZhbHVlOwkJCS8qIDB4MzggKi8KKwl1MzIgcGFkNjsKKwl1MzIgZXJyb3JfaW50ZXJydXB0X2VuYWJsZTsJLyogMHg0MCAqLworCXUzMiBwYWQ3OworCXUzMiBlcnJvcl9pbnRlcnJ1cHRfb2Zmc2V0OwkvKiAweDQ4ICovCisJdTMyIHBhZDg7CisJdTMyIGVycm9yX3N0YXR1czsJCS8qIDB4NTAgKi8KKwl1MzIgcGFkOTsKK307CisKK3N0cnVjdCB2bmljX3dxX2J1ZiB7CisJc3RydWN0IHZuaWNfd3FfYnVmICpuZXh0OworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdm9pZCAqb3NfYnVmOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IGluZGV4OworCWludCBzb3A7CisJdm9pZCAqZGVzYzsKK307CisKKy8qIEJyZWFrIHRoZSB2bmljX3dxX2J1ZiBhbGxvY2F0aW9ucyBpbnRvIGJsb2NrcyBvZiA2NCBlbnRyaWVzICovCisjZGVmaW5lIFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTIDY0CisjZGVmaW5lIFZOSUNfV1FfQlVGX0JMS19TWiBcCisJKFZOSUNfV1FfQlVGX0JMS19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB2bmljX3dxX2J1ZikpCisjZGVmaW5lIFZOSUNfV1FfQlVGX0JMS1NfTkVFREVEKGVudHJpZXMpIFwKKwlESVZfUk9VTkRfVVAoZW50cmllcywgVk5JQ19XUV9CVUZfQkxLX0VOVFJJRVMpCisjZGVmaW5lIFZOSUNfV1FfQlVGX0JMS1NfTUFYIFZOSUNfV1FfQlVGX0JMS1NfTkVFREVEKDQwOTYpCisKK3N0cnVjdCB2bmljX3dxIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJc3RydWN0IHZuaWNfZGV2ICp2ZGV2OworCXN0cnVjdCB2bmljX3dxX2N0cmwgX19pb21lbSAqY3RybDsgICAgICAgICAgICAgIC8qIG1lbW9yeS1tYXBwZWQgKi8KKwlzdHJ1Y3Qgdm5pY19kZXZfcmluZyByaW5nOworCXN0cnVjdCB2bmljX3dxX2J1ZiAqYnVmc1tWTklDX1dRX0JVRl9CTEtTX01BWF07CisJc3RydWN0IHZuaWNfd3FfYnVmICp0b191c2U7CisJc3RydWN0IHZuaWNfd3FfYnVmICp0b19jbGVhbjsKKwl1bnNpZ25lZCBpbnQgcGt0c19vdXRzdGFuZGluZzsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZuaWNfd3FfZGVzY19hdmFpbChzdHJ1Y3Qgdm5pY193cSAqd3EpCit7CisJLyogaG93IG1hbnkgZG9lcyBTVyBvd24/ICovCisJcmV0dXJuIHdxLT5yaW5nLmRlc2NfYXZhaWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZuaWNfd3FfZGVzY191c2VkKHN0cnVjdCB2bmljX3dxICp3cSkKK3sKKwkvKiBob3cgbWFueSBkb2VzIEhXIG93bj8gKi8KKwlyZXR1cm4gd3EtPnJpbmcuZGVzY19jb3VudCAtIHdxLT5yaW5nLmRlc2NfYXZhaWwgLSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnZuaWNfd3FfbmV4dF9kZXNjKHN0cnVjdCB2bmljX3dxICp3cSkKK3sKKwlyZXR1cm4gd3EtPnRvX3VzZS0+ZGVzYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZuaWNfd3FfcG9zdChzdHJ1Y3Qgdm5pY193cSAqd3EsCisJdm9pZCAqb3NfYnVmLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCXVuc2lnbmVkIGludCBsZW4sIGludCBzb3AsIGludCBlb3ApCit7CisJc3RydWN0IHZuaWNfd3FfYnVmICpidWYgPSB3cS0+dG9fdXNlOworCisJYnVmLT5zb3AgPSBzb3A7CisJYnVmLT5vc19idWYgPSBlb3AgPyBvc19idWYgOiBOVUxMOworCWJ1Zi0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKKwlidWYtPmxlbiA9IGxlbjsKKworCWJ1ZiA9IGJ1Zi0+bmV4dDsKKwlpZiAoZW9wKQorCQlpb3dyaXRlMzIoYnVmLT5pbmRleCwgJndxLT5jdHJsLT5wb3N0ZWRfaW5kZXgpOworCXdxLT50b191c2UgPSBidWY7CisKKwl3cS0+cmluZy5kZXNjX2F2YWlsLS07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bmljX3dxX3NlcnZpY2Uoc3RydWN0IHZuaWNfd3EgKndxLAorCXN0cnVjdCBjcV9kZXNjICpjcV9kZXNjLCB1MTYgY29tcGxldGVkX2luZGV4LAorCXZvaWQgKCpidWZfc2VydmljZSkoc3RydWN0IHZuaWNfd3EgKndxLAorCXN0cnVjdCBjcV9kZXNjICpjcV9kZXNjLCBzdHJ1Y3Qgdm5pY193cV9idWYgKmJ1Ziwgdm9pZCAqb3BhcXVlKSwKKwl2b2lkICpvcGFxdWUpCit7CisJc3RydWN0IHZuaWNfd3FfYnVmICpidWY7CisKKwlidWYgPSB3cS0+dG9fY2xlYW47CisJd2hpbGUgKDEpIHsKKworCQkoKmJ1Zl9zZXJ2aWNlKSh3cSwgY3FfZGVzYywgYnVmLCBvcGFxdWUpOworCisJCXdxLT5yaW5nLmRlc2NfYXZhaWwrKzsKKworCQl3cS0+dG9fY2xlYW4gPSBidWYtPm5leHQ7CisKKwkJaWYgKGJ1Zi0+aW5kZXggPT0gY29tcGxldGVkX2luZGV4KQorCQkJYnJlYWs7CisKKwkJYnVmID0gd3EtPnRvX2NsZWFuOworCX0KK30KKwordm9pZCB2bmljX3dxX2ZyZWUoc3RydWN0IHZuaWNfd3EgKndxKTsKK2ludCB2bmljX3dxX2FsbG9jKHN0cnVjdCB2bmljX2RldiAqdmRldiwgc3RydWN0IHZuaWNfd3EgKndxLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJdW5zaWduZWQgaW50IGRlc2NfY291bnQsIHVuc2lnbmVkIGludCBkZXNjX3NpemUpOwordm9pZCB2bmljX3dxX2luaXQoc3RydWN0IHZuaWNfd3EgKndxLCB1bnNpZ25lZCBpbnQgY3FfaW5kZXgsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9lbmFibGUsCisJdW5zaWduZWQgaW50IGVycm9yX2ludGVycnVwdF9vZmZzZXQpOwordW5zaWduZWQgaW50IHZuaWNfd3FfZXJyb3Jfc3RhdHVzKHN0cnVjdCB2bmljX3dxICp3cSk7Cit2b2lkIHZuaWNfd3FfZW5hYmxlKHN0cnVjdCB2bmljX3dxICp3cSk7CitpbnQgdm5pY193cV9kaXNhYmxlKHN0cnVjdCB2bmljX3dxICp3cSk7Cit2b2lkIHZuaWNfd3FfY2xlYW4oc3RydWN0IHZuaWNfd3EgKndxLAorCXZvaWQgKCpidWZfY2xlYW4pKHN0cnVjdCB2bmljX3dxICp3cSwgc3RydWN0IHZuaWNfd3FfYnVmICpidWYpKTsKKworI2VuZGlmIC8qIF9WTklDX1dRX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lbmljL3dxX2VuZXRfZGVzYy5oIGIvZHJpdmVycy9uZXQvZW5pYy93cV9lbmV0X2Rlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM1OTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZW5pYy93cV9lbmV0X2Rlc2MuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA3IE51b3ZhIFN5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfV1FfRU5FVF9ERVNDX0hfCisjZGVmaW5lIF9XUV9FTkVUX0RFU0NfSF8KKworLyogRXRoZXJuZXQgd29yayBxdWV1ZSBkZXNjcmlwdG9yOiAxNkIgKi8KK3N0cnVjdCB3cV9lbmV0X2Rlc2MgeworCV9fbGU2NCBhZGRyZXNzOworCV9fbGUxNiBsZW5ndGg7CisJX19sZTE2IG1zc19sb29wYmFjazsKKwlfX2xlMTYgaGVhZGVyX2xlbmd0aF9mbGFnczsKKwlfX2xlMTYgdmxhbl90YWc7Cit9OworCisjZGVmaW5lIFdRX0VORVRfQUREUl9CSVRTCQk2NAorI2RlZmluZSBXUV9FTkVUX0xFTl9CSVRTCQkxNAorI2RlZmluZSBXUV9FTkVUX0xFTl9NQVNLCQkoKDEgPDwgV1FfRU5FVF9MRU5fQklUUykgLSAxKQorI2RlZmluZSBXUV9FTkVUX01TU19CSVRTCQkxNAorI2RlZmluZSBXUV9FTkVUX01TU19NQVNLCQkoKDEgPDwgV1FfRU5FVF9NU1NfQklUUykgLSAxKQorI2RlZmluZSBXUV9FTkVUX01TU19TSElGVAkJMgorI2RlZmluZSBXUV9FTkVUX0xPT1BCQUNLX1NISUZUCQkxCisjZGVmaW5lIFdRX0VORVRfSERSTEVOX0JJVFMJCTEwCisjZGVmaW5lIFdRX0VORVRfSERSTEVOX01BU0sJCSgoMSA8PCBXUV9FTkVUX0hEUkxFTl9CSVRTKSAtIDEpCisjZGVmaW5lIFdRX0VORVRfRkxBR1NfT01fQklUUwkJMgorI2RlZmluZSBXUV9FTkVUX0ZMQUdTX09NX01BU0sJCSgoMSA8PCBXUV9FTkVUX0ZMQUdTX09NX0JJVFMpIC0gMSkKKyNkZWZpbmUgV1FfRU5FVF9GTEFHU19FT1BfU0hJRlQJCTEyCisjZGVmaW5lIFdRX0VORVRfRkxBR1NfQ1FfRU5UUllfU0hJRlQJMTMKKyNkZWZpbmUgV1FfRU5FVF9GTEFHU19GQ09FX0VOQ0FQX1NISUZUCTE0CisjZGVmaW5lIFdRX0VORVRfRkxBR1NfVkxBTl9UQUdfSU5TRVJUX1NISUZUCTE1CisKKyNkZWZpbmUgV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTQkwCisjZGVmaW5lIFdRX0VORVRfT0ZGTE9BRF9NT0RFX1JFU0VSVkVECTEKKyNkZWZpbmUgV1FfRU5FVF9PRkZMT0FEX01PREVfQ1NVTV9MNAkyCisjZGVmaW5lIFdRX0VORVRfT0ZGTE9BRF9NT0RFX1RTTwkzCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cV9lbmV0X2Rlc2NfZW5jKHN0cnVjdCB3cV9lbmV0X2Rlc2MgKmRlc2MsCisJdTY0IGFkZHJlc3MsIHUxNiBsZW5ndGgsIHUxNiBtc3MsIHUxNiBoZWFkZXJfbGVuZ3RoLAorCXU4IG9mZmxvYWRfbW9kZSwgdTggZW9wLCB1OCBjcV9lbnRyeSwgdTggZmNvZV9lbmNhcCwKKwl1OCB2bGFuX3RhZ19pbnNlcnQsIHUxNiB2bGFuX3RhZywgdTggbG9vcGJhY2spCit7CisJZGVzYy0+YWRkcmVzcyA9IGNwdV90b19sZTY0KGFkZHJlc3MpOworCWRlc2MtPmxlbmd0aCA9IGNwdV90b19sZTE2KGxlbmd0aCAmIFdRX0VORVRfTEVOX01BU0spOworCWRlc2MtPm1zc19sb29wYmFjayA9IGNwdV90b19sZTE2KChtc3MgJiBXUV9FTkVUX01TU19NQVNLKSA8PAorCQlXUV9FTkVUX01TU19TSElGVCB8IChsb29wYmFjayAmIDEpIDw8IFdRX0VORVRfTE9PUEJBQ0tfU0hJRlQpOworCWRlc2MtPmhlYWRlcl9sZW5ndGhfZmxhZ3MgPSBjcHVfdG9fbGUxNigKKwkJKGhlYWRlcl9sZW5ndGggJiBXUV9FTkVUX0hEUkxFTl9NQVNLKSB8CisJCShvZmZsb2FkX21vZGUgJiBXUV9FTkVUX0ZMQUdTX09NX01BU0spIDw8IFdRX0VORVRfSERSTEVOX0JJVFMgfAorCQkoZW9wICYgMSkgPDwgV1FfRU5FVF9GTEFHU19FT1BfU0hJRlQgfAorCQkoY3FfZW50cnkgJiAxKSA8PCBXUV9FTkVUX0ZMQUdTX0NRX0VOVFJZX1NISUZUIHwKKwkJKGZjb2VfZW5jYXAgJiAxKSA8PCBXUV9FTkVUX0ZMQUdTX0ZDT0VfRU5DQVBfU0hJRlQgfAorCQkodmxhbl90YWdfaW5zZXJ0ICYgMSkgPDwgV1FfRU5FVF9GTEFHU19WTEFOX1RBR19JTlNFUlRfU0hJRlQpOworCWRlc2MtPnZsYW5fdGFnID0gY3B1X3RvX2xlMTYodmxhbl90YWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3FfZW5ldF9kZXNjX2RlYyhzdHJ1Y3Qgd3FfZW5ldF9kZXNjICpkZXNjLAorCXU2NCAqYWRkcmVzcywgdTE2ICpsZW5ndGgsIHUxNiAqbXNzLCB1MTYgKmhlYWRlcl9sZW5ndGgsCisJdTggKm9mZmxvYWRfbW9kZSwgdTggKmVvcCwgdTggKmNxX2VudHJ5LCB1OCAqZmNvZV9lbmNhcCwKKwl1OCAqdmxhbl90YWdfaW5zZXJ0LCB1MTYgKnZsYW5fdGFnLCB1OCAqbG9vcGJhY2spCit7CisJKmFkZHJlc3MgPSBsZTY0X3RvX2NwdShkZXNjLT5hZGRyZXNzKTsKKwkqbGVuZ3RoID0gbGUxNl90b19jcHUoZGVzYy0+bGVuZ3RoKSAmIFdRX0VORVRfTEVOX01BU0s7CisJKm1zcyA9IChsZTE2X3RvX2NwdShkZXNjLT5tc3NfbG9vcGJhY2spID4+IFdRX0VORVRfTVNTX1NISUZUKSAmCisJCVdRX0VORVRfTVNTX01BU0s7CisJKmxvb3BiYWNrID0gKHU4KSgobGUxNl90b19jcHUoZGVzYy0+bXNzX2xvb3BiYWNrKSA+PgorCQlXUV9FTkVUX0xPT1BCQUNLX1NISUZUKSAmIDEpOworCSpoZWFkZXJfbGVuZ3RoID0gbGUxNl90b19jcHUoZGVzYy0+aGVhZGVyX2xlbmd0aF9mbGFncykgJgorCQlXUV9FTkVUX0hEUkxFTl9NQVNLOworCSpvZmZsb2FkX21vZGUgPSAodTgpKChsZTE2X3RvX2NwdShkZXNjLT5oZWFkZXJfbGVuZ3RoX2ZsYWdzKSA+PgorCQlXUV9FTkVUX0hEUkxFTl9CSVRTKSAmIFdRX0VORVRfRkxBR1NfT01fTUFTSyk7CisJKmVvcCA9ICh1OCkoKGxlMTZfdG9fY3B1KGRlc2MtPmhlYWRlcl9sZW5ndGhfZmxhZ3MpID4+CisJCVdRX0VORVRfRkxBR1NfRU9QX1NISUZUKSAmIDEpOworCSpjcV9lbnRyeSA9ICh1OCkoKGxlMTZfdG9fY3B1KGRlc2MtPmhlYWRlcl9sZW5ndGhfZmxhZ3MpID4+CisJCVdRX0VORVRfRkxBR1NfQ1FfRU5UUllfU0hJRlQpICYgMSk7CisJKmZjb2VfZW5jYXAgPSAodTgpKChsZTE2X3RvX2NwdShkZXNjLT5oZWFkZXJfbGVuZ3RoX2ZsYWdzKSA+PgorCQlXUV9FTkVUX0ZMQUdTX0ZDT0VfRU5DQVBfU0hJRlQpICYgMSk7CisJKnZsYW5fdGFnX2luc2VydCA9ICh1OCkoKGxlMTZfdG9fY3B1KGRlc2MtPmhlYWRlcl9sZW5ndGhfZmxhZ3MpID4+CisJCVdRX0VORVRfRkxBR1NfVkxBTl9UQUdfSU5TRVJUX1NISUZUKSAmIDEpOworCSp2bGFuX3RhZyA9IGxlMTZfdG9fY3B1KGRlc2MtPnZsYW5fdGFnKTsKK30KKworI2VuZGlmIC8qIF9XUV9FTkVUX0RFU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggM2MxMzY0ZC4uYjQ1NWFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVhbG54LmMKKysrIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogc3RhdGljIHZvaWQgZ2V0bGlua3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogc3RhdGljIHZvaWQgcmVzZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmZWFsbnhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CkBAIC02NTgsNyArNjU4LDcgQEAKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKIAlkZXYtPmRvX2lvY3RsID0gJm1paV9pb2N0bDsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmZmVhbG54X3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKQEAgLTExOTgsNyArMTE5OCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZmVhbG54X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eF9waHkuYyBiL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4X3BoeS5jCmluZGV4IGY1NjM0NDQuLjA4ZTE4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4X3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4X3BoeS5jCkBAIC04Myw3ICs4Myw3IEBACiAJaW50IGVycjsKIAlpbnQgaTsKIAotCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKCpidXMpLCBHRlBfS0VSTkVMKTsKKwlidXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKGJ1cyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCXNucHJpbnRmKGJ1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwgcmVzLnN0YXJ0KTsKIAlidXMtPnByaXYgPSBwcml2OwogCi0JYnVzLT5kZXYgPSBkZXY7CisJYnVzLT5wYXJlbnQgPSBkZXY7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgYnVzKTsKIAogCS8qIHNldCBNSUkgc3BlZWQgKi8KQEAgLTE1MCw3ICsxNTAsNyBAQAogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhidXMtPmlycVtpXSk7CiAJa2ZyZWUoYnVzLT5pcnEpOwogCWtmcmVlKHByaXYpOwotCWtmcmVlKGJ1cyk7CisJbWRpb2J1c19mcmVlKGJ1cyk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGJ1cy0+aXJxW2ldKTsKIAlrZnJlZShwcml2KTsKIAlrZnJlZShidXMtPmlycSk7Ci0Ja2ZyZWUoYnVzKTsKKwltZGlvYnVzX2ZyZWUoYnVzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCAwYjZlY2VmLi5jYzczMjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJTnZSZWdNU0lYSXJxU3RhdHVzID0gMHgzZjAsCiAKIAlOdlJlZ1Bvd2VyU3RhdGUyID0gMHg2MDAsCi0jZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEUyX1BPV0VSVVBfTUFTSwkJMHgwRjExCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEUyX1BPV0VSVVBfTUFTSwkJMHgwRjE1CiAjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEUyX1BPV0VSVVBfUkVWX0EzCTB4MDAwMQogI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFMl9QSFlfUkVTRVQJCTB4MDAwNAogfTsKQEAgLTU2NDMsNiArNTY0Myw3IEBACiAJCWRldi0+ZGV2X2FkZHJbNF0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICA4KSAmIDB4ZmY7CiAJCWRldi0+ZGV2X2FkZHJbNV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CiAJCXdyaXRlbCh0eHJlZ3xOVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWLCBiYXNlICsgTnZSZWdUcmFuc21pdFBvbGwpOworCQlwcmludGsoS0VSTl9ERUJVRyAibnZfcHJvYmU6IHNldCB3b3JrYXJvdW5kIGJpdCBmb3IgcmV2ZXJzZWQgbWFjIGFkZHJcbiIpOwogCX0KIAltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwogCkBAIC01ODkwLDE0ICs1ODkxLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgbnZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIHZvaWQgbnZfcmVzdG9yZV9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAotCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0KIAkvKiBzcGVjaWFsIG9wOiB3cml0ZSBiYWNrIHRoZSBtaXNvcmRlcmVkIE1BQyBhZGRyZXNzIC0gb3RoZXJ3aXNlCiAJICogdGhlIG5leHQgbnZfcHJvYmUgd291bGQgc2VlIGEgd3JvbmcgYWRkcmVzcy4KIAkgKi8KQEAgLTU5MDUsNiArNTkwNCwxNSBAQAogCXdyaXRlbChucC0+b3JpZ19tYWNbMV0sIGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKIAl3cml0ZWwocmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXRQb2xsKSAmIH5OVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWLAogCSAgICAgICBiYXNlICsgTnZSZWdUcmFuc21pdFBvbGwpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJbnZfcmVzdG9yZV9tYWNfYWRkcihwY2lfZGV2KTsKIAogCS8qIHJlc3RvcmUgYW55IHBoeSByZWxhdGVkIGNoYW5nZXMgKi8KIAludl9yZXN0b3JlX3BoeShkZXYpOwpAQCAtNTk3NSw2ICs1OTgzLDggQEAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQludl9jbG9zZShkZXYpOwogCisJbnZfcmVzdG9yZV9tYWNfYWRkcihwZGV2KTsKKwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9QT1dFUl9PRkYpIHsKIAkJaWYgKHBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCBucC0+d29sZW5hYmxlZCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCA5ZDQ2MTgyLi5jYjUxYzFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC02NjQsMjMgKzY2NCw2IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotc3RhdGljIGludCBmc19yZXF1ZXN0X2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxLCBjb25zdCBjaGFyICpuYW1lLAotCQlpcnFfaGFuZGxlcl90IGlycWYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCSgqZmVwLT5vcHMtPnByZV9yZXF1ZXN0X2lycSkoZGV2LCBpcnEpOwotCXJldHVybiByZXF1ZXN0X2lycShpcnEsIGlycWYsIElSUUZfU0hBUkVELCBuYW1lLCBkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBmc19mcmVlX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxKQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlmcmVlX2lycShpcnEsIGRldik7Ci0JKCpmZXAtPm9wcy0+cG9zdF9mcmVlX2lycSkoZGV2LCBpcnEpOwotfQotCiBzdGF0aWMgdm9pZCBmc190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTgwMCw3ICs3ODMsOCBAQAogCQluYXBpX2VuYWJsZSgmZmVwLT5uYXBpKTsKIAogCS8qIEluc3RhbGwgb3VyIGludGVycnVwdCBoYW5kbGVyLiAqLwotCXIgPSBmc19yZXF1ZXN0X2lycShkZXYsIGZlcC0+aW50ZXJydXB0LCAiZnNfZW5ldC1tYWMiLCBmc19lbmV0X2ludGVycnVwdCk7CisJciA9IHJlcXVlc3RfaXJxKGZlcC0+aW50ZXJydXB0LCBmc19lbmV0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkiZnNfZW5ldC1tYWMiLCBkZXYpOwogCWlmIChyICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9NT0RVTEVfTkFNRQogCQkgICAgICAgIjogJXMgQ291bGQgbm90IGFsbG9jYXRlIEZTX0VORVQgSVJRISIsIGRldi0+bmFtZSk7CkBAIC04NDIsNyArODI2LDcgQEAKIAkvKiByZWxlYXNlIGFueSBpcnFzICovCiAJcGh5X2Rpc2Nvbm5lY3QoZmVwLT5waHlkZXYpOwogCWZlcC0+cGh5ZGV2ID0gTlVMTDsKLQlmc19mcmVlX2lycShkZXYsIGZlcC0+aW50ZXJydXB0KTsKKwlmcmVlX2lycShmZXAtPmludGVycnVwdCwgZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LmggYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQuaAppbmRleCBkYjQ2ZDJlLi44NWE0YmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQuaApAQCAtMzQsOCArMzQsNiBAQAogCXZvaWQgKCphZGp1c3RfbGluaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnJlc3RhcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqcHJlX3JlcXVlc3RfaXJxKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxKTsKLQl2b2lkICgqcG9zdF9mcmVlX2lycSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlycSk7CiAJdm9pZCAoKm5hcGlfY2xlYXJfcnhfZXZlbnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpuYXBpX2VuYWJsZV9yeCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKm5hcGlfZGlzYWJsZV9yeCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mY2MuYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCmluZGV4IDFjN2VmODEuLjIyZTVhODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLWZjYy5jCkBAIC00MjEsMTYgKzQyMSw2IEBACiAJZnNfY2xlYW51cF9iZHMoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgcHJlX3JlcXVlc3RfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpcnEpCi17Ci0JLyogbm90aGluZyAqLwotfQotCi1zdGF0aWMgdm9pZCBwb3N0X2ZyZWVfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpcnEpCi17Ci0JLyogbm90aGluZyAqLwotfQotCiBzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTU0MCw4ICs1MzAsNiBAQAogCS5zZXRfbXVsdGljYXN0X2xpc3QJPSBzZXRfbXVsdGljYXN0X2xpc3QsCiAJLnJlc3RhcnQJCT0gcmVzdGFydCwKIAkuc3RvcAkJCT0gc3RvcCwKLQkucHJlX3JlcXVlc3RfaXJxCT0gcHJlX3JlcXVlc3RfaXJxLAotCS5wb3N0X2ZyZWVfaXJxCQk9IHBvc3RfZnJlZV9pcnEsCiAJLm5hcGlfY2xlYXJfcnhfZXZlbnQJPSBuYXBpX2NsZWFyX3J4X2V2ZW50LAogCS5uYXBpX2VuYWJsZV9yeAkJPSBuYXBpX2VuYWJsZV9yeCwKIAkubmFwaV9kaXNhYmxlX3J4CT0gbmFwaV9kaXNhYmxlX3J4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9tYWMtZmVjLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mZWMuYwppbmRleCAwYTdkMWM1Li4xNGU1NzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mZWMuYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1mZWMuYwpAQCAtMzEzLDExICszMTMsNyBAQAogCSAqIENsZWFyIGFueSBvdXRzdGFuZGluZyBpbnRlcnJ1cHQuCiAJICovCiAJRlcoZmVjcCwgaWV2ZW50LCAweGZmYzApOwotI2lmbmRlZiBDT05GSUdfUFBDX01FUkdFCi0JRlcoZmVjcCwgaXZlYywgKGZlcC0+aW50ZXJydXB0IC8gMikgPDwgMjkpOwotI2Vsc2UKIAlGVyhmZWNwLCBpdmVjLCAodmlycV90b19odyhmZXAtPmludGVycnVwdCkgLyAyKSA8PCAyOSk7Ci0jZW5kaWYKIAogCS8qCiAJICogYWRqdXN0IHRvIHNwZWVkIChvbmx5IGZvciBEVUVUICYgUk1JSSkKQEAgLTQxMywzMCArNDA5LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByZV9yZXF1ZXN0X2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxKQotewotI2lmbmRlZiBDT05GSUdfUFBDX01FUkdFCi0JaW1tYXBfdCAqaW1tYXAgPSBmc19lbmV0X2ltbWFwOwotCXUzMiBzaWVsOwotCi0JLyogU0lVIGludGVycnVwdCAqLwotCWlmIChpcnEgPj0gU0lVX0lSUTAgJiYgaXJxIDwgU0lVX0xFVkVMNykgewotCi0JCXNpZWwgPSBpbl9iZTMyKCZpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2llbCk7Ci0JCWlmICgoaXJxICYgMSkgPT0gMCkKLQkJCXNpZWwgfD0gKDB4ODAwMDAwMDAgPj4gaXJxKTsKLQkJZWxzZQotCQkJc2llbCAmPSB+KDB4ODAwMDAwMDAgPj4gKGlycSAmIH4xKSk7Ci0JCW91dF9iZTMyKCZpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2llbCwgc2llbCk7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHBvc3RfZnJlZV9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlycSkKLXsKLQkvKiBub3RoaW5nICovCi19Ci0KIHN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfcnhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNTI5LDggKzUwMSw2IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5wcmVfcmVxdWVzdF9pcnEJPSBwcmVfcmVxdWVzdF9pcnEsCi0JLnBvc3RfZnJlZV9pcnEJCT0gcG9zdF9mcmVlX2lycSwKIAkubmFwaV9jbGVhcl9yeF9ldmVudAk9IG5hcGlfY2xlYXJfcnhfZXZlbnQsCiAJLm5hcGlfZW5hYmxlX3J4CQk9IG5hcGlfZW5hYmxlX3J4LAogCS5uYXBpX2Rpc2FibGVfcngJPSBuYXBpX2Rpc2FibGVfcngsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L21hYy1zY2MuYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLXNjYy5jCmluZGV4IDIyZjUwZGQuLjAwOGNkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLXNjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWFjLXNjYy5jCkBAIC0zNzcsMzAgKzM3Nyw2IEBACiAJZnNfY2xlYW51cF9iZHMoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgcHJlX3JlcXVlc3RfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpcnEpCi17Ci0jaWZuZGVmIENPTkZJR19QUENfTUVSR0UKLQlpbW1hcF90ICppbW1hcCA9IGZzX2VuZXRfaW1tYXA7Ci0JdTMyIHNpZWw7Ci0KLQkvKiBTSVUgaW50ZXJydXB0ICovCi0JaWYgKGlycSA+PSBTSVVfSVJRMCAmJiBpcnEgPCBTSVVfTEVWRUw3KSB7Ci0KLQkJc2llbCA9IGluX2JlMzIoJmltbWFwLT5pbV9zaXVfY29uZi5zY19zaWVsKTsKLQkJaWYgKChpcnEgJiAxKSA9PSAwKQotCQkJc2llbCB8PSAoMHg4MDAwMDAwMCA+PiBpcnEpOwotCQllbHNlCi0JCQlzaWVsICY9IH4oMHg4MDAwMDAwMCA+PiAoaXJxICYgfjEpKTsKLQkJb3V0X2JlMzIoJmltbWFwLT5pbV9zaXVfY29uZi5zY19zaWVsLCBzaWVsKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgcG9zdF9mcmVlX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxKQotewotCS8qIG5vdGhpbmcgKi8KLX0KLQogc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9yeF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CkBAIC00OTQsOCArNDcwLDYgQEAKIAkuc2V0X211bHRpY2FzdF9saXN0CT0gc2V0X211bHRpY2FzdF9saXN0LAogCS5yZXN0YXJ0CQk9IHJlc3RhcnQsCiAJLnN0b3AJCQk9IHN0b3AsCi0JLnByZV9yZXF1ZXN0X2lycQk9IHByZV9yZXF1ZXN0X2lycSwKLQkucG9zdF9mcmVlX2lycQkJPSBwb3N0X2ZyZWVfaXJxLAogCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKIAkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCiAJLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWJpdGJhbmcuYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWJpdGJhbmcuYwppbmRleCBiZTRiNzJmLi40OWI2NjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L21paS1iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9taWktYml0YmFuZy5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJaWYgKCFzdHJjbXAobnAtPnR5cGUsICJldGhlcm5ldC1waHkiKSkKIAkJCWFkZF9waHkobmV3X2J1cywgbnApOwogCi0JbmV3X2J1cy0+ZGV2ID0gJm9mZGV2LT5kZXY7CisJbmV3X2J1cy0+cGFyZW50ID0gJm9mZGV2LT5kZXY7CiAJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCBuZXdfYnVzKTsKIAogCXJldCA9IG1kaW9idXNfcmVnaXN0ZXIobmV3X2J1cyk7CkBAIC0yMTgsOSArMjE4LDkgQEAKIG91dF91bm1hcF9yZWdzOgogCWlvdW5tYXAoYml0YmFuZy0+ZGlyKTsKIG91dF9mcmVlX2J1czoKLQlrZnJlZShuZXdfYnVzKTsKLW91dF9mcmVlX3ByaXY6CiAJZnJlZV9tZGlvX2JpdGJhbmcobmV3X2J1cyk7CitvdXRfZnJlZV9wcml2OgorCWtmcmVlKGJpdGJhbmcpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0yMzEsMTIgKzIzMSwxMSBAQAogCXN0cnVjdCBiYl9pbmZvICpiaXRiYW5nID0gYnVzLT5wcml2OwogCiAJbWRpb2J1c191bnJlZ2lzdGVyKGJ1cyk7Ci0JZnJlZV9tZGlvX2JpdGJhbmcoYnVzKTsKIAlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIE5VTEwpOwogCWtmcmVlKGJ1cy0+aXJxKTsKKwlmcmVlX21kaW9fYml0YmFuZyhidXMpOwogCWlvdW5tYXAoYml0YmFuZy0+ZGlyKTsKIAlrZnJlZShiaXRiYW5nKTsKLQlrZnJlZShidXMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L21paS1mZWMuYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWZlYy5jCmluZGV4IDY5NWY3NGMuLjI4MDc3Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWZlYy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlzdHJ1Y3QgZmVjX2luZm8gKmZlYzsKIAlpbnQgcmV0ID0gLUVOT01FTSwgaTsKIAotCW5ld19idXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX2J1cyksIEdGUF9LRVJORUwpOworCW5ld19idXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKCFuZXdfYnVzKQogCQlnb3RvIG91dDsKIApAQCAtMTcyLDcgKzE3Miw3IEBACiAJCWlmICghc3RyY21wKG5wLT50eXBlLCAiZXRoZXJuZXQtcGh5IikpCiAJCQlhZGRfcGh5KG5ld19idXMsIG5wKTsKIAotCW5ld19idXMtPmRldiA9ICZvZmRldi0+ZGV2OworCW5ld19idXMtPnBhcmVudCA9ICZvZmRldi0+ZGV2OwogCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgbmV3X2J1cyk7CiAKIAlyZXQgPSBtZGlvYnVzX3JlZ2lzdGVyKG5ld19idXMpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiBvdXRfZmVjOgogCWtmcmVlKGZlYyk7CiBvdXRfbWlpOgotCWtmcmVlKG5ld19idXMpOworCW1kaW9idXNfZnJlZShuZXdfYnVzKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjA1LDcgKzIwNSw3IEBACiAJa2ZyZWUoYnVzLT5pcnEpOwogCWlvdW5tYXAoZmVjLT5mZWNwKTsKIAlrZnJlZShmZWMpOwotCWtmcmVlKGJ1cyk7CisJbWRpb2J1c19mcmVlKGJ1cyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCA0MzIwYTk4Li5iNWJiN2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC0zMzksNiArMzM5LDkgQEAKIAkvKiBFbmFibGUgbW9zdCBtZXNzYWdlcyBieSBkZWZhdWx0ICovCiAJcHJpdi0+bXNnX2VuYWJsZSA9IChORVRJRl9NU0dfSUZVUCA8PCAxICkgLSAxOwogCisJLyogQ2FycmllciBzdGFydHMgZG93biwgcGh5bGliIHdpbGwgYnJpbmcgaXQgdXAgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwppbmRleCBlYmNmYjI3Li5iZjczZWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKQEAgLTEzNiwxMiArMTM2LDEyIEBACiAKIAkvKiBXYWl0IHVudGlsIHRoZSBidXMgaXMgZnJlZSAqLwogCXdoaWxlICgoZ2Zhcl9yZWFkKCZyZWdzLT5taWltaW5kKSAmIE1JSU1JTkRfQlVTWSkgJiYKLQkJCXRpbWVvdXQtLSkKKwkJCS0tdGltZW91dCkKIAkJY3B1X3JlbGF4KCk7CiAKIAltdXRleF91bmxvY2soJmJ1cy0+bWRpb19sb2NrKTsKIAotCWlmKHRpbWVvdXQgPD0gMCkgeworCWlmKHRpbWVvdXQgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayFcbiIsCiAJCQkJYnVzLT5uYW1lKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE2NCw4ICsxNjQsNyBAQAogCWlmIChOVUxMID09IGRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQluZXdfYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1paV9idXMpLCBHRlBfS0VSTkVMKTsKLQorCW5ld19idXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKE5VTEwgPT0gbmV3X2J1cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE5Niw3ICsxOTUsNyBAQAogCiAJbmV3X2J1cy0+aXJxID0gcGRhdGEtPmlycTsKIAotCW5ld19idXMtPmRldiA9IGRldjsKKwluZXdfYnVzLT5wYXJlbnQgPSBkZXY7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgbmV3X2J1cyk7CiAKIAkvKgpAQCAtMjExLDE5ICsyMTAsMjEgQEAKIAlnZmFyX3dyaXRlKCZlbmV0X3JlZ3MtPnRiaXBhLCAwKTsKIAlmb3IgKGkgPSBQSFlfTUFYX0FERFI7IGkgPiAwOyBpLS0pIHsKIAkJdTMyIHBoeV9pZDsKLQkJaW50IHI7CiAKLQkJciA9IGdldF9waHlfaWQobmV3X2J1cywgaSwgJnBoeV9pZCk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7CisJCWVyciA9IGdldF9waHlfaWQobmV3X2J1cywgaSwgJnBoeV9pZCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGJ1c19yZWdpc3Rlcl9mYWlsOwogCiAJCWlmIChwaHlfaWQgPT0gMHhmZmZmZmZmZikKIAkJCWJyZWFrOwogCX0KIAogCS8qIFRoZSBidXMgaXMgZnVsbC4gIFdlIGRvbid0IHN1cHBvcnQgdXNpbmcgMzEgUEhZcywgc29ycnkgKi8KLQlpZiAoaSA9PSAwKQotCQlyZXR1cm4gLUVCVVNZOworCWlmIChpID09IDApIHsKKwkJZXJyID0gLUVCVVNZOworCisJCWdvdG8gYnVzX3JlZ2lzdGVyX2ZhaWw7CisJfQogCiAJZ2Zhcl93cml0ZSgmZW5ldF9yZWdzLT50YmlwYSwgaSk7CiAKQEAgLTI0MCw3ICsyNDEsNyBAQAogYnVzX3JlZ2lzdGVyX2ZhaWw6CiAJaW91bm1hcChyZWdzKTsKIHJlZ19tYXBfZmFpbDoKLQlrZnJlZShuZXdfYnVzKTsKKwltZGlvYnVzX2ZyZWUobmV3X2J1cyk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjU2LDcgKzI1Nyw3IEBACiAKIAlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilidXMtPnByaXYpOwogCWJ1cy0+cHJpdiA9IE5VTEw7Ci0Ja2ZyZWUoYnVzKTsKKwltZGlvYnVzX2ZyZWUoYnVzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCmluZGV4IDgyMzk5MzkuLmZiYmQzZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwLXBsdXMuYworKysgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogI2lmbmRlZiBNT0RVTEUKIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwX3BsdXNfcHJvYmUoaW50IHVuaXQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laXBfbmV0ZGV2KCk7CiAJaW50IGVycjsKIAogCWlmICghZGV2KQpAQCAtMjg0LDcgKzI4NCw3IEBACiAJaW50IG9wdGlvbl9yZWc7CiAJaW50IHJldHZhbDsKIAotCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSkgeworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpcF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpIHsKIAkgICAgcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTMwMiw3ICszMDIsNyBAQAogCS8qIFNlbGVjdCB0aGUgb3BlcmF0aW9uYWwgcGFnZS4gKi8KIAlvdXR3KFBlcmZfUGFnZSwgaW9hZGRyICsgSFBfUEFHSU5HKTsKIAotCWVpX29wZW4oZGV2KTsKKwllaXBfb3BlbihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTMsNyArMzEzLDcgQEAKIAlpbnQgb3B0aW9uX3JlZyA9IGludyhpb2FkZHIgKyBIUFBfT1BUSU9OKTsKIAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWVpX2Nsb3NlKGRldik7CisJZWlwX2Nsb3NlKGRldik7CiAJb3V0dygob3B0aW9uX3JlZyAmIH5FbmFibGVJUlEpIHwgTWVtRGlzYWJsZSB8IE5JQ1Jlc2V0IHwgQ2hpcFJlc2V0LAogCQkgaW9hZGRyICsgSFBQX09QVElPTik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL0tjb25maWcgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9LY29uZmlnCmluZGV4IDcwYTMyNzIuLjc4YTE2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBJQk1fTkVXX0VNQUMKIAl0cmlzdGF0ZSAiSUJNIEVNQUMgRXRoZXJuZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ19EQ1IgJiYgUFBDX01FUkdFCisJZGVwZW5kcyBvbiBQUENfRENSCiAJc2VsZWN0IENSQzMyCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIElCTSBFTUFDIGZhbWlseSBvZiBFdGhlcm5ldCBjb250cm9sbGVycwpAQCAtNjIsMyArNjIsMTUgQEAKIGNvbmZpZyBJQk1fTkVXX0VNQUNfRU1BQzQKIAlib29sCiAJZGVmYXVsdCBuCisKK2NvbmZpZyBJQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSCisJYm9vbAorCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCmluZGV4IGNjZDlkOTAuLmVmY2YyMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9yKQogewogCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDQwR1hfUEhZX0NMS19GSVggfAorCQkJCSAgRU1BQ19GVFJfNDYwRVhfUEhZX0NMS19GSVggfAogCQkJCSAgRU1BQ19GVFJfNDQwRVBfUEhZX0NMS19GSVgpKQogCQlEQkcoZGV2LCAiJXMiIE5MLCBlcnJvcik7CiAJZWxzZSBpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtMjAxLDEzICsyMDIsMTUgQEAKIHsKIAlyZXR1cm4gIHBoeV9tb2RlID09IFBIWV9NT0RFX0dNSUkgfHwKIAkJcGh5X21vZGUgPT0gUEhZX01PREVfUkdNSUkgfHwKKwkJcGh5X21vZGUgPT0gUEhZX01PREVfU0dNSUkgfHwKIAkJcGh5X21vZGUgPT0gUEhZX01PREVfVEJJIHx8CiAJCXBoeV9tb2RlID09IFBIWV9NT0RFX1JUQkk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVtYWNfcGh5X2dwY3MoaW50IHBoeV9tb2RlKQogewotCXJldHVybiAgcGh5X21vZGUgPT0gUEhZX01PREVfVEJJIHx8CisJcmV0dXJuICBwaHlfbW9kZSA9PSBQSFlfTU9ERV9TR01JSSB8fAorCQlwaHlfbW9kZSA9PSBQSFlfTU9ERV9UQkkgfHwKIAkJcGh5X21vZGUgPT0gUEhZX01PREVfUlRCSTsKIH0KIApAQCAtMzUxLDEwICszNTQsMjQgQEAKIAkJZW1hY190eF9kaXNhYmxlKGRldik7CiAJfQogCisjaWZkZWYgQ09ORklHX1BQQ19EQ1JfTkFUSVZFCisJLyogRW5hYmxlIGludGVybmFsIGNsb2NrIHNvdXJjZSAqLworCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDYwRVhfUEhZX0NMS19GSVgpKQorCQlkY3JpX2NscnNldChTRFIwLCBTRFIwX0VUSF9DRkcsCisJCQkgICAgMCwgU0RSMF9FVEhfQ0ZHX0VDUyA8PCBkZXYtPmNlbGxfaW5kZXgpOworI2VuZGlmCisKIAlvdXRfYmUzMigmcC0+bXIwLCBFTUFDX01SMF9TUlNUKTsKIAl3aGlsZSAoKGluX2JlMzIoJnAtPm1yMCkgJiBFTUFDX01SMF9TUlNUKSAmJiBuKQogCQktLW47CiAKKyNpZmRlZiBDT05GSUdfUFBDX0RDUl9OQVRJVkUKKwkgLyogRW5hYmxlIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAqLworCWlmIChlbWFjX2hhc19mZWF0dXJlKGRldiwgRU1BQ19GVFJfNDYwRVhfUEhZX0NMS19GSVgpKQorCQlkY3JpX2NscnNldChTRFIwLCBTRFIwX0VUSF9DRkcsCisJCQkgICAgU0RSMF9FVEhfQ0ZHX0VDUyA8PCBkZXYtPmNlbGxfaW5kZXgsIDApOworI2VuZGlmCisKIAlpZiAobikgewogCQlkZXYtPnJlc2V0X2ZhaWxlZCA9IDA7CiAJCXJldHVybiAwOwpAQCAtNTQ3LDggKzU2NCw5IEBACiAJc3dpdGNoIChkZXYtPnBoeS5zcGVlZCkgewogCWNhc2UgU1BFRURfMTAwMDoKIAkJaWYgKGVtYWNfcGh5X2dwY3MoZGV2LT5waHkubW9kZSkpIHsKLQkJCW1yMSB8PSBFTUFDX01SMV9NRl8xMDAwR1BDUyB8Ci0JCQkJRU1BQ19NUjFfTUZfSVBQQShkZXYtPnBoeS5hZGRyZXNzKTsKKwkJCW1yMSB8PSBFTUFDX01SMV9NRl8xMDAwR1BDUyB8IEVNQUNfTVIxX01GX0lQUEEoCisJCQkJKGRldi0+cGh5LmdwY3NfYWRkcmVzcyAhPSAweGZmZmZmZmZmKSA/CisJCQkJIGRldi0+cGh5LmdwY3NfYWRkcmVzcyA6IGRldi0+cGh5LmFkZHJlc3MpOwogCiAJCQkvKiBQdXQgc29tZSBhcmJpdHJhcnkgT1VJLCBNYW51ZiAmIFJldiBJRHMgc28gd2UgY2FuCiAJCQkgKiBpZGVudGlmeSB0aGlzIEdQQ1MgUEhZIGxhdGVyLgpAQCAtNjYwLDggKzY3OCwxMiBAQAogCW91dF9iZTMyKCZwLT5pc2VyLCAgcik7CiAKIAkvKiBXZSBuZWVkIHRvIHRha2UgR1BDUyBQSFkgb3V0IG9mIGlzb2xhdGUgbW9kZSBhZnRlciBFTUFDIHJlc2V0ICovCi0JaWYgKGVtYWNfcGh5X2dwY3MoZGV2LT5waHkubW9kZSkpCi0JCWVtYWNfbWlpX3Jlc2V0X3BoeSgmZGV2LT5waHkpOworCWlmIChlbWFjX3BoeV9ncGNzKGRldi0+cGh5Lm1vZGUpKSB7CisJCWlmIChkZXYtPnBoeS5ncGNzX2FkZHJlc3MgIT0gMHhmZmZmZmZmZikKKwkJCWVtYWNfbWlpX3Jlc2V0X2dwY3MoJmRldi0+cGh5KTsKKwkJZWxzZQorCQkJZW1hY19taWlfcmVzZXRfcGh5KCZkZXYtPnBoeSk7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04NjYsNyArODg4LDkgQEAKIAlzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50IHJlczsKIAotCXJlcyA9IF9fZW1hY19tZGlvX3JlYWQoZGV2LT5tZGlvX2luc3RhbmNlID8gZGV2LT5tZGlvX2luc3RhbmNlIDogZGV2LAorCXJlcyA9IF9fZW1hY19tZGlvX3JlYWQoKGRldi0+bWRpb19pbnN0YW5jZSAmJgorCQkJCWRldi0+cGh5LmdwY3NfYWRkcmVzcyAhPSBpZCkgPworCQkJCWRldi0+bWRpb19pbnN0YW5jZSA6IGRldiwKIAkJCSAgICAgICAodTgpIGlkLCAodTgpIHJlZyk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTg3NSw3ICs4OTksOSBAQAogewogCXN0cnVjdCBlbWFjX2luc3RhbmNlICpkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAotCV9fZW1hY19tZGlvX3dyaXRlKGRldi0+bWRpb19pbnN0YW5jZSA/IGRldi0+bWRpb19pbnN0YW5jZSA6IGRldiwKKwlfX2VtYWNfbWRpb193cml0ZSgoZGV2LT5tZGlvX2luc3RhbmNlICYmCisJCQkgICBkZXYtPnBoeS5ncGNzX2FkZHJlc3MgIT0gaWQpID8KKwkJCSAgIGRldi0+bWRpb19pbnN0YW5jZSA6IGRldiwKIAkJCSAgKHU4KSBpZCwgKHU4KSByZWcsICh1MTYpIHZhbCk7CiB9CiAKQEAgLTIzNjcsNyArMjM5MywxMSBAQAogCQkgKiBYWFggSSBwcm9iYWJseSBzaG91bGQgbW92ZSB0aGVzZSBzZXR0aW5ncyB0byB0aGUgZGV2IHRyZWUKIAkJICovCiAJCWRldi0+cGh5LmFkZHJlc3MgPSAtMTsKLQkJZGV2LT5waHkuZmVhdHVyZXMgPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9NSUk7CisJCWRldi0+cGh5LmZlYXR1cmVzID0gU1VQUE9SVEVEX01JSTsKKwkJaWYgKGVtYWNfcGh5X3N1cHBvcnRzX2dpZ2UoZGV2LT5waHlfbW9kZSkpCisJCQlkZXYtPnBoeS5mZWF0dXJlcyB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisJCWVsc2UKKwkJCWRldi0+cGh5LmZlYXR1cmVzIHw9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOwogCQlkZXYtPnBoeS5wYXVzZSA9IDE7CiAKIAkJcmV0dXJuIDA7CkBAIC0yNDA2LDcgKzI0MzYsOSBAQAogCQkgKiBOb3RlIHRoYXQgdGhlIGJ1c3lfcGh5X21hcCBpcyBjdXJyZW50bHkgZ2xvYmFsCiAJCSAqIHdoaWxlIGl0IHNob3VsZCBwcm9iYWJseSBiZSBwZXItQVNJQy4uLgogCQkgKi8KLQkJZGV2LT5waHkuYWRkcmVzcyA9IGRldi0+Y2VsbF9pbmRleDsKKwkJZGV2LT5waHkuZ3Bjc19hZGRyZXNzID0gZGV2LT5ncGNzX2FkZHJlc3M7CisJCWlmIChkZXYtPnBoeS5ncGNzX2FkZHJlc3MgPT0gMHhmZmZmZmZmZikKKwkJCWRldi0+cGh5LmFkZHJlc3MgPSBkZXYtPmNlbGxfaW5kZXg7CiAJfQogCiAJZW1hY19jb25maWd1cmUoZGV2KTsKQEAgLTI1MTYsNiArMjU0OCw4IEBACiAJCWRldi0+cGh5X2FkZHJlc3MgPSAweGZmZmZmZmZmOwogCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLCAicGh5LW1hcCIsICZkZXYtPnBoeV9tYXAsIDApKQogCQlkZXYtPnBoeV9tYXAgPSAweGZmZmZmZmZmOworCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLCAiZ3Bjcy1hZGRyZXNzIiwgJmRldi0+Z3Bjc19hZGRyZXNzLCAwKSkKKwkJZGV2LT5ncGNzX2FkZHJlc3MgPSAweGZmZmZmZmZmOwogCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLT5wYXJlbnQsICJjbG9jay1mcmVxdWVuY3kiLCAmZGV2LT5vcGJfYnVzX2ZyZXEsIDEpKQogCQlyZXR1cm4gLUVOWElPOwogCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLCAidGFoLWRldmljZSIsICZkZXYtPnRhaF9waCwgMCkpCkBAIC0yNTU5LDYgKzI1OTMsOSBAQAogCS8qIENoZWNrIEVNQUMgdmVyc2lvbiAqLwogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjNHN5bmMiKSkgewogCQlkZXYtPmZlYXR1cmVzIHw9IChFTUFDX0ZUUl9FTUFDNCB8IEVNQUNfRlRSX0VNQUM0U1lOQyk7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjLTQ2MGV4IikgfHwKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiaWJtLGVtYWMtNDYwZ3QiKSkKKwkJCWRldi0+ZmVhdHVyZXMgfD0gRU1BQ19GVFJfNDYwRVhfUEhZX0NMS19GSVg7CiAJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjNCIpKSB7CiAJCWRldi0+ZmVhdHVyZXMgfD0gRU1BQ19GVFJfRU1BQzQ7CiAJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjLTQ0MGd4IikpCkBAIC0yNTY3LDYgKzI2MDQsOCBAQAogCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYy00NDBlcCIpIHx8CiAJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjLTQ0MGdyIikpCiAJCQlkZXYtPmZlYXR1cmVzIHw9IEVNQUNfRlRSXzQ0MEVQX1BIWV9DTEtfRklYOworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sZW1hYy00MDVleiIpKQorCQkJZGV2LT5mZWF0dXJlcyB8PSBFTUFDX0ZUUl9OT19GTE9XX0NPTlRST0xfNDB4OwogCX0KIAogCS8qIEZpeHVwIHNvbWUgZmVhdHVyZSBiaXRzIGJhc2VkIG9uIHRoZSBkZXZpY2UgdHJlZSAqLwpAQCAtMjgyNCw2ICsyODYzLDkgQEAKIAkgICAgICAgbmRldi0+ZGV2X2FkZHJbMF0sIG5kZXYtPmRldl9hZGRyWzFdLCBuZGV2LT5kZXZfYWRkclsyXSwKIAkgICAgICAgbmRldi0+ZGV2X2FkZHJbM10sIG5kZXYtPmRldl9hZGRyWzRdLCBuZGV2LT5kZXZfYWRkcls1XSk7CiAKKwlpZiAoZGV2LT5waHlfbW9kZSA9PSBQSFlfTU9ERV9TR01JSSkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogaW4gU0dNSUkgbW9kZVxuIiwgbmRldi0+bmFtZSk7CisKIAlpZiAoZGV2LT5waHkuYWRkcmVzcyA+PSAwKQogCQlwcmludGsoIiVzOiBmb3VuZCAlcyBQSFkgKDB4JTAyeClcbiIsIG5kZXYtPm5hbWUsCiAJCSAgICAgICBkZXYtPnBoeS5kZWYtPm5hbWUsIGRldi0+cGh5LmFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5oIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5oCmluZGV4IDY1NDVlNjkuLjE4ZDU2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmgKQEAgLTE5MCw2ICsxOTAsOSBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsJCWxpbmtfd29yazsKIAlpbnQJCQkJbGlua19wb2xsaW5nOwogCisJLyogR1BDUyBQSFkgaW5mb3MgKi8KKwl1MzIJCQkJZ3Bjc19hZGRyZXNzOworCiAJLyogU2hhcmVkIE1ESU8gaWYgYW55ICovCiAJdTMyCQkJCW1kaW9fcGg7CiAJc3RydWN0IG9mX2RldmljZQkJKm1kaW9fZGV2OwpAQCAtMzE3LDYgKzMyMCwxMCBAQAogICogVGhlIDQwNUVYIGFuZCA0NjBFWCBjb250YWluIHRoZSBFTUFDNFNZTkMgY29yZQogICovCiAjZGVmaW5lIEVNQUNfRlRSX0VNQUM0U1lOQwkJMHgwMDAwMDIwMAorLyoKKyAqIFNldCBpZiB3ZSBuZWVkIHBoeSBjbG9jayB3b3JrYXJvdW5kIGZvciA0NjBleCBvciA0NjBndAorICovCisjZGVmaW5lIEVNQUNfRlRSXzQ2MEVYX1BIWV9DTEtfRklYCTB4MDAwMDA0MDAKIAogCiAvKiBSaWdodCBub3csIHdlIGRvbid0IHF1aXRlIGhhbmRsZSB0aGUgYWx3YXlzL3Bvc3NpYmxlIG1hc2tzIG9uIHRoZQpAQCAtMzQxLDYgKzM0OCwxMCBAQAogI2lmZGVmIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkKIAkgICAgRU1BQ19GVFJfSEFTX1JHTUlJCXwKICNlbmRpZgorI2lmZGVmIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMCisJICAgIEVNQUNfRlRSX05PX0ZMT1dfQ09OVFJPTF80MHggfAorI2VuZGlmCisJRU1BQ19GVFJfNDYwRVhfUEhZX0NMS19GSVggfAogCUVNQUNfRlRSXzQ0MEVQX1BIWV9DTEtfRklYLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvbWFsLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwppbmRleCAxMGMyNjdiLi4xODM5ZDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSA8YXNtL2Rjci1yZWdzLmg+CiAKIHN0YXRpYyBpbnQgbWFsX2NvdW50OwogCkBAIC0yNzksNiArMjgwLDEwIEBACiAJbWFsX3NjaGVkdWxlX3BvbGwobWFsKTsKIAlzZXRfbWFsX2Rjcm4obWFsLCBNQUxfVFhFT0JJU1IsIHIpOwogCisJaWYgKG1hbF9oYXNfZmVhdHVyZShtYWwsIE1BTF9GVFJfQ0xFQVJfSUNJTlRTVEFUKSkKKwkJbXRkY3JpKFNEUjAsIERDUk5fU0RSX0lDSU5UU1RBVCwKKwkJCQkobWZkY3JpKFNEUjAsIERDUk5fU0RSX0lDSU5UU1RBVCkgfCBJQ0lOVFNUQVRfSUNUWCkpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0yOTMsNiArMjk4LDEwIEBACiAJbWFsX3NjaGVkdWxlX3BvbGwobWFsKTsKIAlzZXRfbWFsX2Rjcm4obWFsLCBNQUxfUlhFT0JJU1IsIHIpOwogCisJaWYgKG1hbF9oYXNfZmVhdHVyZShtYWwsIE1BTF9GVFJfQ0xFQVJfSUNJTlRTVEFUKSkKKwkJbXRkY3JpKFNEUjAsIERDUk5fU0RSX0lDSU5UU1RBVCwKKwkJCQkobWZkY3JpKFNEUjAsIERDUk5fU0RSX0lDSU5UU1RBVCkgfCBJQ0lOVFNUQVRfSUNSWCkpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0zMzYsNiArMzQ1LDI1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFsX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IG1hbF9pbnN0YW5jZSAqbWFsID0gZGV2X2luc3RhbmNlOworCXUzMiBlc3IgPSBnZXRfbWFsX2Rjcm4obWFsLCBNQUxfRVNSKTsKKworCWlmIChlc3IgJiBNQUxfRVNSX0VWQikgeworCQkvKiBkZXNjcmlwdG9yIGVycm9yICovCisJCWlmIChlc3IgJiBNQUxfRVNSX0RFKSB7CisJCQlpZiAoZXNyICYgTUFMX0VTUl9DSURUKQorCQkJCXJldHVybiBtYWxfcnhkZShpcnEsIGRldl9pbnN0YW5jZSk7CisJCQllbHNlCisJCQkJcmV0dXJuIG1hbF90eGRlKGlycSwgZGV2X2luc3RhbmNlKTsKKwkJfSBlbHNlIHsgLyogU0VSUiAqLworCQkJcmV0dXJuIG1hbF9zZXJyKGlycSwgZGV2X2luc3RhbmNlKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHZvaWQgbWFsX3BvbGxfZGlzYWJsZShzdHJ1Y3QgbWFsX2luc3RhbmNlICptYWwsIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpCiB7CiAJLyogU3BpbmxvY2stdHlwZSBzZW1hbnRpY3M6IG9ubHkgb25lIGNhbGxlciBkaXNhYmxlIHBvbGwgYXQgYSB0aW1lICovCkBAIC00OTMsNiArNTIxLDggQEAKIAl1bnNpZ25lZCBpbnQgZGNyX2Jhc2U7CiAJY29uc3QgdTMyICpwcm9wOwogCXUzMiBjZmc7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlpcnFfaGFuZGxlcl90IGhkbHJfc2VyciwgaGRscl90eGRlLCBoZGxyX3J4ZGU7CiAKIAltYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWFsX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYWwpIHsKQEAgLTU0MiwxMSArNTcyLDIxIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUob2ZkZXYtPm5vZGUsICJpYm0sbWNtYWwtNDA1ZXoiKSkKKwkJbWFsLT5mZWF0dXJlcyB8PSAoTUFMX0ZUUl9DTEVBUl9JQ0lOVFNUQVQgfAorCQkJCU1BTF9GVFJfQ09NTU9OX0VSUl9JTlQpOworCiAJbWFsLT50eGVvYl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+bm9kZSwgMCk7CiAJbWFsLT5yeGVvYl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+bm9kZSwgMSk7CiAJbWFsLT5zZXJyX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9mZGV2LT5ub2RlLCAyKTsKLQltYWwtPnR4ZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPm5vZGUsIDMpOwotCW1hbC0+cnhkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+bm9kZSwgNCk7CisKKwlpZiAobWFsX2hhc19mZWF0dXJlKG1hbCwgTUFMX0ZUUl9DT01NT05fRVJSX0lOVCkpIHsKKwkJbWFsLT50eGRlX2lycSA9IG1hbC0+cnhkZV9pcnEgPSBtYWwtPnNlcnJfaXJxOworCX0gZWxzZSB7CisJCW1hbC0+dHhkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+bm9kZSwgMyk7CisJCW1hbC0+cnhkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+bm9kZSwgNCk7CisJfQorCiAJaWYgKG1hbC0+dHhlb2JfaXJxID09IE5PX0lSUSB8fCBtYWwtPnJ4ZW9iX2lycSA9PSBOT19JUlEgfHwKIAkgICAgbWFsLT5zZXJyX2lycSA9PSBOT19JUlEgfHwgbWFsLT50eGRlX2lycSA9PSBOT19JUlEgfHwKIAkgICAgbWFsLT5yeGRlX2lycSA9PSBOT19JUlEpIHsKQEAgLTYwOCwxNiArNjQ4LDI2IEBACiAJCQkgICAgIHNpemVvZihzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IpICoKIAkJCSAgICAgbWFsX3J4X2JkX29mZnNldChtYWwsIGkpKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKG1hbC0+c2Vycl9pcnEsIG1hbF9zZXJyLCAwLCAiTUFMIFNFUlIiLCBtYWwpOworCWlmIChtYWxfaGFzX2ZlYXR1cmUobWFsLCBNQUxfRlRSX0NPTU1PTl9FUlJfSU5UKSkgeworCQlpcnFmbGFncyA9IElSUUZfU0hBUkVEOworCQloZGxyX3NlcnIgPSBoZGxyX3R4ZGUgPSBoZGxyX3J4ZGUgPSBtYWxfaW50OworCX0gZWxzZSB7CisJCWlycWZsYWdzID0gMDsKKwkJaGRscl9zZXJyID0gbWFsX3NlcnI7CisJCWhkbHJfdHhkZSA9IG1hbF90eGRlOworCQloZGxyX3J4ZGUgPSBtYWxfcnhkZTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShtYWwtPnNlcnJfaXJxLCBoZGxyX3NlcnIsIGlycWZsYWdzLCAiTUFMIFNFUlIiLCBtYWwpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDI7Ci0JZXJyID0gcmVxdWVzdF9pcnEobWFsLT50eGRlX2lycSwgbWFsX3R4ZGUsIDAsICJNQUwgVFggREUiLCBtYWwpOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbC0+dHhkZV9pcnEsIGhkbHJfdHhkZSwgaXJxZmxhZ3MsICJNQUwgVFggREUiLCBtYWwpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDM7CiAJZXJyID0gcmVxdWVzdF9pcnEobWFsLT50eGVvYl9pcnEsIG1hbF90eGVvYiwgMCwgIk1BTCBUWCBFT0IiLCBtYWwpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDQ7Ci0JZXJyID0gcmVxdWVzdF9pcnEobWFsLT5yeGRlX2lycSwgbWFsX3J4ZGUsIDAsICJNQUwgUlggREUiLCBtYWwpOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbC0+cnhkZV9pcnEsIGhkbHJfcnhkZSwgaXJxZmxhZ3MsICJNQUwgUlggREUiLCBtYWwpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDU7CiAJZXJyID0gcmVxdWVzdF9pcnEobWFsLT5yeGVvYl9pcnEsIG1hbF9yeGVvYiwgMCwgIk1BTCBSWCBFT0IiLCBtYWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvbWFsLmggYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaAppbmRleCBlYWE3MjYyLi4yZjBhODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaAorKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaApAQCAtMTAyLDcgKzEwMiw3IEBACiAvKiBNQUwgVjEgSUVSIGJpdHMgKi8KICNkZWZpbmUgICBNQUwxX0lFUl9OV0UJCTB4MDAwMDAwMDgKICNkZWZpbmUgICBNQUwxX0lFUl9TT0NfRVZFTlRTCU1BTDFfSUVSX05XRQotI2RlZmluZSAgIE1BTDFfSUVSX0VWRU5UUwkoTUFMMV9JRVJfU09DX0VWRU5UUyB8IE1BTF9JRVJfT1RFIHwgXAorI2RlZmluZSAgIE1BTDFfSUVSX0VWRU5UUwkoTUFMMV9JRVJfU09DX0VWRU5UUyB8IE1BTF9JRVJfREUgfCBcCiAJCQkJIE1BTF9JRVJfT1RFIHwgTUFMX0lFUl9PRSB8IE1BTF9JRVJfUEUpCiAKIC8qIE1BTCBWMiBJRVIgYml0cyAqLwpAQCAtMTEwLDcgKzExMCw3IEBACiAjZGVmaW5lICAgTUFMMl9JRVJfUFJFCQkweDAwMDAwMDQwCiAjZGVmaW5lICAgTUFMMl9JRVJfUFdFCQkweDAwMDAwMDIwCiAjZGVmaW5lICAgTUFMMl9JRVJfU09DX0VWRU5UUwkoTUFMMl9JRVJfUFQgfCBNQUwyX0lFUl9QUkUgfCBNQUwyX0lFUl9QV0UpCi0jZGVmaW5lICAgTUFMMl9JRVJfRVZFTlRTCShNQUwyX0lFUl9TT0NfRVZFTlRTIHwgTUFMX0lFUl9PVEUgfCBcCisjZGVmaW5lICAgTUFMMl9JRVJfRVZFTlRTCShNQUwyX0lFUl9TT0NfRVZFTlRTIHwgTUFMX0lFUl9ERSB8IFwKIAkJCQkgTUFMX0lFUl9PVEUgfCBNQUxfSUVSX09FIHwgTUFMX0lFUl9QRSkKIAogCkBAIC0yMTMsNiArMjEzLDggQEAKIAlzdHJ1Y3Qgb2ZfZGV2aWNlCSpvZmRldjsKIAlpbnQJCQlpbmRleDsKIAlzcGlubG9ja190CQlsb2NrOworCisJdW5zaWduZWQgaW50IGZlYXR1cmVzOwogfTsKIAogc3RhdGljIGlubGluZSB1MzIgZ2V0X21hbF9kY3JuKHN0cnVjdCBtYWxfaW5zdGFuY2UgKm1hbCwgaW50IHJlZykKQEAgLTIyNSw2ICsyMjcsMzggQEAKIAlkY3Jfd3JpdGUobWFsLT5kY3JfaG9zdCwgcmVnLCB2YWwpOwogfQogCisvKiBGZWF0dXJlcyBvZiB2YXJpb3VzIE1BTCBpbXBsZW1lbnRhdGlvbnMgKi8KKworLyogU2V0IGlmIHlvdSBoYXZlIGludGVycnVwdCBjb2FsZXNjaW5nIGFuZCB5b3UgaGF2ZSB0byBjbGVhciB0aGUgU0RSCisgKiByZWdpc3RlciBmb3IgVFhFT0IgYW5kIFJYRU9CIGludGVycnVwdHMgdG8gd29yaworICovCisjZGVmaW5lIE1BTF9GVFJfQ0xFQVJfSUNJTlRTVEFUCTB4MDAwMDAwMDEKKworLyogU2V0IGlmIHlvdXIgTUFMIGhhcyBTRVJSLCBUWERFLCBhbmQgUlhERSBPUidkIGludG8gYSBzaW5nbGUgVUlDCisgKiBpbnRlcnJ1cHQKKyAqLworI2RlZmluZSBNQUxfRlRSX0NPTU1PTl9FUlJfSU5UCTB4MDAwMDAwMDIKKworZW51bSB7CisJTUFMX0ZUUlNfQUxXQVlTID0gMCwKKworCU1BTF9GVFJTX1BPU1NJQkxFID0KKyNpZmRlZiBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUCisJCU1BTF9GVFJfQ0xFQVJfSUNJTlRTVEFUIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIKKwkJTUFMX0ZUUl9DT01NT05fRVJSX0lOVCB8CisjZW5kaWYKKwkJMCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG1hbF9oYXNfZmVhdHVyZShzdHJ1Y3QgbWFsX2luc3RhbmNlICpkZXYsCisJCXVuc2lnbmVkIGxvbmcgZmVhdHVyZSkKK3sKKwlyZXR1cm4gKE1BTF9GVFJTX0FMV0FZUyAmIGZlYXR1cmUpIHx8CisJCShNQUxfRlRSU19QT1NTSUJMRSAmIGRldi0+ZmVhdHVyZXMgJiBmZWF0dXJlKTsKK30KKwogLyogUmVnaXN0ZXIgTUFMIGRldmljZXMgKi8KIGludCBtYWxfaW5pdCh2b2lkKTsKIHZvaWQgbWFsX2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCmluZGV4IDM3YmZlZWEuLmM0MGNkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCkBAIC0zOCw2ICszOCwxNiBAQAogCXBoeS0+bWRpb193cml0ZShwaHktPmRldiwgcGh5LT5hZGRyZXNzLCByZWcsIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdwY3NfcGh5X3JlYWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZykKK3sKKwlyZXR1cm4gcGh5LT5tZGlvX3JlYWQocGh5LT5kZXYsIHBoeS0+Z3Bjc19hZGRyZXNzLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bjc19waHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+Z3Bjc19hZGRyZXNzLCByZWcsIHZhbCk7Cit9CisKIGludCBlbWFjX21paV9yZXNldF9waHkoc3RydWN0IG1paV9waHkgKnBoeSkKIHsKIAlpbnQgdmFsOwpAQCAtNjIsNiArNzIsMzcgQEAKIAlyZXR1cm4gbGltaXQgPD0gMDsKIH0KIAoraW50IGVtYWNfbWlpX3Jlc2V0X2dwY3Moc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwlpbnQgdmFsOworCWludCBsaW1pdCA9IDEwMDAwOworCisJdmFsID0gZ3Bjc19waHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwl2YWwgJj0gfihCTUNSX0lTT0xBVEUgfCBCTUNSX0FORU5BQkxFKTsKKwl2YWwgfD0gQk1DUl9SRVNFVDsKKwlncGNzX3BoeV93cml0ZShwaHksIE1JSV9CTUNSLCB2YWwpOworCisJdWRlbGF5KDMwMCk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl2YWwgPSBncGNzX3BoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCQlpZiAodmFsID49IDAgJiYgKHZhbCAmIEJNQ1JfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKCh2YWwgJiBCTUNSX0lTT0xBVEUpICYmIGxpbWl0ID4gMCkKKwkJZ3Bjc19waHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgdmFsICYgfkJNQ1JfSVNPTEFURSk7CisKKwlpZiAobGltaXQgPiAwICYmIHBoeS0+bW9kZSA9PSBQSFlfTU9ERV9TR01JSSkgeworCQkvKiBDb25maWd1cmUgR1BDUyBpbnRlcmZhY2UgdG8gcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgU0dNSUkgKi8KKwkJZ3Bjc19waHlfd3JpdGUocGh5LCAweDA0LCAweDgxMjApOyAvKiBBc3ltUGF1c2UsIEZEWCAqLworCQlncGNzX3BoeV93cml0ZShwaHksIDB4MDcsIDB4MjgwMSk7IC8qIG1zZ19wZywgdG9nZ2xlICovCisJCWdwY3NfcGh5X3dyaXRlKHBoeSwgMHgwMCwgMHgwMTQwKTsgLyogMUdicHMsIEZEWCAgICAgKi8KKwl9CisKKwlyZXR1cm4gbGltaXQgPD0gMDsKK30KKwogc3RhdGljIGludCBnZW5taWlfc2V0dXBfYW5lZyhzdHJ1Y3QgbWlpX3BoeSAqcGh5LCB1MzIgYWR2ZXJ0aXNlKQogewogCWludCBjdGwsIGFkdjsKQEAgLTMyMSw3ICszNjIsNyBAQAogCiBzdGF0aWMgaW50IG04OGUxMTExX2luaXQoc3RydWN0IG1paV9waHkgKnBoeSkKIHsKLQlwcl9kZWJ1ZygiJXM6IE1hcnZlbGwgODhFMTExMSBFdGhlcm5ldFxuIiwgX19GVU5DVElPTl9fKTsKKwlwcl9kZWJ1ZygiJXM6IE1hcnZlbGwgODhFMTExMSBFdGhlcm5ldFxuIiwgX19mdW5jX18pOwogCXBoeV93cml0ZShwaHksIDB4MTQsIDB4MGNlMyk7CiAJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHg0MTAxKTsKIAlwaHlfd3JpdGUocGh5LCAweDA5LCAweDBlMDApOwpAQCAtMzMyLDYgKzM3MywzMyBAQAogCXJldHVybiAgMDsKIH0KIAorc3RhdGljIGludCBtODhlMTExMl9pbml0KHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJLyoKKwkgKiBNYXJ2ZWxsIDg4RTExMTIgUEhZIG5lZWRzIHRvIGhhdmUgdGhlIFNHTUlJIE1BQworCSAqIGludGVyYWNlIChwYWdlIDIpIHByb3Blcmx5IGNvbmZpZ3VyZWQgdG8KKwkgKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSA0NjBFWC9HVCBHUENTIGludGVyZmFjZS4KKwkgKi8KKworCXUxNiByZWdfc2hvcnQ7CisKKwlwcl9kZWJ1ZygiJXM6IE1hcnZlbGwgODhFMTExMiBFdGhlcm5ldFxuIiwgX19mdW5jX18pOworCisJLyogU2V0IGFjY2VzcyB0byBQYWdlIDIgKi8KKwlwaHlfd3JpdGUocGh5LCAweDE2LCAweDAwMDIpOworCisJcGh5X3dyaXRlKHBoeSwgMHgwMCwgMHgwMDQwKTsgLyogMUdicHMgKi8KKwlyZWdfc2hvcnQgPSAodTE2KShwaHlfcmVhZChwaHksIDB4MWEpKTsKKwlyZWdfc2hvcnQgfD0gMHg4MDAwOyAvKiBieXBhc3MgQXV0by1OZWdvdGlhdGlvbiAqLworCXBoeV93cml0ZShwaHksIDB4MWEsIHJlZ19zaG9ydCk7CisJZW1hY19taWlfcmVzZXRfcGh5KHBoeSk7IC8qIHJlc2V0IE1BQyBpbnRlcmZhY2UgKi8KKworCS8qIFJlc2V0IGFjY2VzcyB0byBQYWdlIDAgKi8KKwlwaHlfd3JpdGUocGh5LCAweDE2LCAweDAwMDApOworCisJcmV0dXJuICAwOworfQorCiBzdGF0aWMgaW50IGV0MTAxMWNfaW5pdChzdHJ1Y3QgbWlpX3BoeSAqcGh5KQogewogCXUxNiByZWdfc2hvcnQ7CkBAIC0zODQsMTEgKzQ1MiwyNyBAQAogCS5vcHMJCT0gJm04OGUxMTExX3BoeV9vcHMsCiB9OwogCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIG04OGUxMTEyX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gbTg4ZTExMTJfaW5pdCwKKwkuc2V0dXBfYW5lZwk9IGdlbm1paV9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBnZW5taWlfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBnZW5taWlfcmVhZF9saW5rCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIG04OGUxMTEyX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAxNDEwQzkwLAorCS5waHlfaWRfbWFzawk9IDB4MGZmZmZmZjAsCisJLm5hbWUJCT0gIk1hcnZlbGwgODhFMTExMiBFdGhlcm5ldCIsCisJLm9wcwkJPSAmbTg4ZTExMTJfcGh5X29wcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgKm1paV9waHlfdGFibGVbXSA9IHsKIAkmZXQxMDExY19waHlfZGVmLAogCSZjaXM4MjAxX3BoeV9kZWYsCiAJJmJjbTUyNDhfcGh5X2RlZiwKIAkmbTg4ZTExMTFfcGh5X2RlZiwKKwkmbTg4ZTExMTJfcGh5X2RlZiwKIAkmZ2VubWlpX3BoeV9kZWYsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5oIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvcGh5LmgKaW5kZXggMWI2NWM4MS4uNWQyYmY0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvcGh5LmgKQEAgLTU3LDYgKzU3LDcgQEAKIAkJCQkgICBvciBkZXRlcm1pbmVkIGF1dG9tYXRpY2FseSAqLwogCWludCBhZGRyZXNzOwkJLyogUEhZIGFkZHJlc3MgKi8KIAlpbnQgbW9kZTsJCS8qIFBIWSBtb2RlICovCisJaW50IGdwY3NfYWRkcmVzczsJLyogR1BDUyBQSFkgYWRkcmVzcyAqLwogCiAJLyogMTogYXV0b25lZyBlbmFibGVkLCAwOiBkaXNhYmxlZCAqLwogCWludCBhdXRvbmVnOwpAQCAtODEsNSArODIsNiBAQAogICovCiBpbnQgZW1hY19taWlfcGh5X3Byb2JlKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBhZGRyZXNzKTsKIGludCBlbWFjX21paV9yZXNldF9waHkoc3RydWN0IG1paV9waHkgKnBoeSk7CitpbnQgZW1hY19taWlfcmVzZXRfZ3BjcyhzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKIAogI2VuZGlmIC8qIF9fSUJNX05FV0VNQUNfUEhZX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libWxhbmEuYyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwppbmRleCA5NWUzNDY0Li5mMDI3NjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1sYW5hLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCkBAIC03MSw3ICs3MSw3IEBACiAgIEp1bmUgMXN0LCAyMDAwCiAJY29ycmVjdGVkIHZlcnNpb24gY29kZXMsIGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXRlc3QgMi4zIGNoYW5nZXMKICAgT2N0IDI4dGgsIDIwMDIKLSAgCWNsZWFuZWQgdXAgZm9yIHRoZSAyLjUgdHJlZSA8YWxhbkByZWRoYXQuY29tPgorCWNsZWFuZWQgdXAgZm9yIHRoZSAyLjUgdHJlZSA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwppbmRleCA2MzRjNGM5Li45M2QwMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwpAQCAtMzU2MywxMCArMzU2Myw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlpbnQgd29ya19kb25lID0gMDsKIAotCS8qIEtlZXAgbGluayBzdGF0ZSBpbmZvcm1hdGlvbiB3aXRoIG9yaWdpbmFsIG5ldGRldiAqLwotCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKQotCQlnb3RvIHF1aXRfcG9sbGluZzsKLQogI2lmZGVmIENPTkZJR19EQ0EKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJR0JfRkxBR19EQ0FfRU5BQkxFRCkKIAkJaWdiX3VwZGF0ZV9yeF9kY2EocnhfcmluZyk7CkBAIC0zNTc2LDcgKzM1NzIsNiBAQAogCiAJLyogSWYgbm90IGVub3VnaCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwogCWlmICgod29ya19kb25lID09IDApIHx8ICFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLXF1aXRfcG9sbGluZzoKIAkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2LCBuYXBpKTsKIAogCQlpZiAoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSB7CkBAIC0zNjE3LDE2ICszNjEyLDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIGhlYWQsIG9sZGhlYWQ7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQlib29sIGNsZWFuZWQgPSBmYWxzZTsKLQlib29sIHJldHZhbCA9IHRydWU7CiAJdW5zaWduZWQgaW50IHRvdGFsX2J5dGVzID0gMCwgdG90YWxfcGFja2V0cyA9IDA7CisJYm9vbCByZXR2YWwgPSB0cnVlOwogCiAJcm1iKCk7CiAJaGVhZCA9IGdldF9oZWFkKHR4X3JpbmcpOwogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOwogCXdoaWxlICgxKSB7CiAJCXdoaWxlIChpICE9IGhlYWQpIHsKLQkJCWNsZWFuZWQgPSB0cnVlOwogCQkJdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGkpOwogCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOwpAQCAtMzY0Myw3ICszNjM2LDYgQEAKIAkJCX0KIAogCQkJaWdiX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKLQkJCXR4X2Rlc2MtPnVwcGVyLmRhdGEgPSAwOwogCiAJCQlpKys7CiAJCQlpZiAoaSA9PSB0eF9yaW5nLT5jb3VudCkKQEAgLTM2NjUsNyArMzY1Nyw3IEBACiBkb25lX2NsZWFuaW5nOgogCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOwogCi0JaWYgKHVubGlrZWx5KGNsZWFuZWQgJiYKKwlpZiAodW5saWtlbHkoY291bnQgJiYKIAkJICAgICBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKIAkJICAgICBJR0JfREVTQ19VTlVTRUQodHhfcmluZykgPj0gSUdCX1RYX1FVRVVFX1dBS0UpKSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGF0IGFueWJvZHkgc3RvcHBpbmcgdGhlIHF1ZXVlIGFmdGVyIHRoaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKaW5kZXggNGFhNjFhMS4uYzViMDJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKQEAgLTU3Miw4ICs1NzIsOCBAQAogCUlDQ1IyID0gSUNDUjJfVFhQIHwgSUNDUjJfVFJJR18zMjsKIAogCS8qIGNvbmZpZ3VyZSBETUFDICovCi0JRFJDTVIxNyA9IHNpLT5yeGRtYSB8IERSQ01SX01BUFZMRDsKLQlEUkNNUjE4ID0gc2ktPnR4ZG1hIHwgRFJDTVJfTUFQVkxEOworCURSQ01SKDE3KSA9IHNpLT5yeGRtYSB8IERSQ01SX01BUFZMRDsKKwlEUkNNUigxOCkgPSBzaS0+dHhkbWEgfCBEUkNNUl9NQVBWTEQ7CiAKIAkvKiBmb3JjZSBTSVIgcmVpbml0aWFsaXphdGlvbiAqLwogCXNpLT5zcGVlZCA9IDQwMDAwMDA7CkBAIC02MDIsOCArNjAyLDggQEAKIAkvKiBkaXNhYmxlIHRoZSBTVFVBUlQgb3IgRklDUCBjbG9ja3MgKi8KIAlweGFfaXJkYV9kaXNhYmxlX2NsayhzaSk7CiAKLQlEUkNNUjE3ID0gMDsKLQlEUkNNUjE4ID0gMDsKKwlEUkNNUigxNykgPSAwOworCURSQ01SKDE4KSA9IDA7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMKaW5kZXggMzYwMzAyNC4uMmE5OTMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMKQEAgLTY3LDkgKzY3LDcgQEAKIAljb25zdCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2ID0gTlVMTDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotI2lmZGVmIENPTkZJR19LTU9ECiAJcmVxdWVzdF9tb2R1bGUoImlyZGEtZG9uZ2xlLSVkIiwgdHlwZSk7Ci0jZW5kaWYKIAogCWlmIChkZXYtPmRvbmdsZV9kcnYgIT0gTlVMTCkKIAkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKaW5kZXggMThmNGIzYS4uOWM5MjZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCXVuc2lnbmVkIGlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAl1bnNpZ25lZCBpOwogCi0Jc2VxX3ByaW50ZihzZXEsICJcbiVzICh2aWQvZGlkOiAlMDR4LyUwNHgpXG4iLAorCXNlcV9wcmludGYoc2VxLCAiXG4lcyAodmlkL2RpZDogWyUwNHg6JTA0eF0pXG4iLAogCQkgICBwY2lfbmFtZShwZGV2KSwgKGludClwZGV2LT52ZW5kb3IsIChpbnQpcGRldi0+ZGV2aWNlKTsKIAlzZXFfcHJpbnRmKHNlcSwgInBjaS1wb3dlci1zdGF0ZTogJXVcbiIsICh1bnNpZ25lZCkgcGRldi0+Y3VycmVudF9zdGF0ZSk7CiAJc2VxX3ByaW50ZihzZXEsICJyZXNvdXJjZXM6IGlycT0ldSAvIGlvPTB4JTA0eCAvIGRtYV9tYXNrPTB4JTAxNkx4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiLmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAppbmRleCA4MDQ2OThmLi5kODU3MTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtODUsNyArODUsNyBAQAogI2RlZmluZSBEUFJJTlRLKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIAkodm9pZCkoKE5FVElGX01TR18jI25sZXZlbCAmIGFkYXB0ZXItPm1zZ19lbmFibGUpICYmIFwKIAlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgXAotCQlfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKSkKKwkJX19mdW5jX18gLCAjIyBhcmdzKSkKIAogCiAvKiBUWC9SWCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCmluZGV4IGFhNzUzODVjLi5iZTNjN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTk3NywxNSArOTc3LDE3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgewogCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKLQkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQorCQlpZiAoYnVmZmVyX2luZm8tPmRtYSkgewogCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAogCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKIAkJCQkJIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCiAJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CisJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gMDsKKwkJfQogCisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOwotCiAJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZS5oCmluZGV4IDk1NjkxNGEuLjIxOThiNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlLmgKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgMTAgR2lnYWJpdCBQQ0kgRXhwcmVzcyBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA3IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDggSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTIwLDcgKzIwLDYgQEAKICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KIAogICBDb250YWN0IEluZm9ybWF0aW9uOgotICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KICAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CiAgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKIApAQCAtMzcsMTcgKzM2LDE1IEBACiAjaW5jbHVkZSAiaXhnYmVfdHlwZS5oIgogI2luY2x1ZGUgIml4Z2JlX2NvbW1vbi5oIgogCi0jaWZkZWYgQ09ORklHX0RDQQorI2lmIGRlZmluZWQoQ09ORklHX0RDQSkgfHwgZGVmaW5lZChDT05GSUdfRENBX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9kY2EuaD4KICNlbmRpZgogCi0jZGVmaW5lIElYR0JFX0VSUihhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgIml4Z2JlOiAiIGFyZ3MpCi0KICNkZWZpbmUgUEZYICJpeGdiZTogIgogI2RlZmluZSBEUFJJTlRLKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIAkoKHZvaWQpKChORVRJRl9NU0dfIyNubGV2ZWwgJiBhZGFwdGVyLT5tc2dfZW5hYmxlKSAmJiBcCiAJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsIFwKLQkJX19GVU5DVElPTl9fICwgIyMgYXJncykpKQorCQlfX2Z1bmNfXyAsICMjIGFyZ3MpKSkKIAogLyogVFgvUlggZGVzY3JpcHRvciBkZWZpbmVzICovCiAjZGVmaW5lIElYR0JFX0RFRkFVTFRfVFhECQkgICAxMDI0CkBAIC01OCwyMyArNTUsMTQgQEAKICNkZWZpbmUgSVhHQkVfTUFYX1JYRAkJCSAgIDQwOTYKICNkZWZpbmUgSVhHQkVfTUlOX1JYRAkJCSAgICAgNjQKIAotI2RlZmluZSBJWEdCRV9ERUZBVUxUX1JYUQkJCSAgIDEKLSNkZWZpbmUgSVhHQkVfTUFYX1JYUQkJCQkgICAxCi0jZGVmaW5lIElYR0JFX01JTl9SWFEJCQkJICAgMQotCi0jZGVmaW5lIElYR0JFX0RFRkFVTFRfSVRSX1JYX1VTRUNTCSAgICAxMjUgIC8qICAgOGsgaXJxcy9zZWMgKi8KLSNkZWZpbmUgSVhHQkVfREVGQVVMVF9JVFJfVFhfVVNFQ1MJICAgIDI1MCAgLyogICA0ayBpcnFzL3NlYyAqLwotI2RlZmluZSBJWEdCRV9NSU5fSVRSX1VTRUNTCQkgICAgMTAwICAvKiA1MDBrIGlycXMvc2VjICovCi0jZGVmaW5lIElYR0JFX01BWF9JVFJfVVNFQ1MJCSAgMTAwMDAgIC8qIDEwMCAgaXJxcy9zZWMgKi8KLQogLyogZmxvdyBjb250cm9sICovCiAjZGVmaW5lIElYR0JFX0RFRkFVTFRfRkNSVEwJCTB4MTAwMDAKLSNkZWZpbmUgSVhHQkVfTUlOX0ZDUlRMCQkJICAgICAgMAorI2RlZmluZSBJWEdCRV9NSU5fRkNSVEwJCQkgICAweDQwCiAjZGVmaW5lIElYR0JFX01BWF9GQ1JUTAkJCTB4N0ZGODAKICNkZWZpbmUgSVhHQkVfREVGQVVMVF9GQ1JUSAkJMHgyMDAwMAotI2RlZmluZSBJWEdCRV9NSU5fRkNSVEgJCQkgICAgICAwCisjZGVmaW5lIElYR0JFX01JTl9GQ1JUSAkJCSAgMHg2MDAKICNkZWZpbmUgSVhHQkVfTUFYX0ZDUlRICQkJMHg3RkZGMAotI2RlZmluZSBJWEdCRV9ERUZBVUxUX0ZDUEFVU0UJCSAweDY4MDAgIC8qIG1heSBiZSB0b28gbG9uZyAqLworI2RlZmluZSBJWEdCRV9ERUZBVUxUX0ZDUEFVU0UJCSAweEZGRkYKICNkZWZpbmUgSVhHQkVfTUlOX0ZDUEFVU0UJCSAgICAgIDAKICNkZWZpbmUgSVhHQkVfTUFYX0ZDUEFVU0UJCSAweEZGRkYKIApAQCAtODgsOSArNzYsNiBAQAogCiAjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFIChFVEhfRlJBTUVfTEVOICsgRVRIX0ZDU19MRU4gKyBWTEFOX0hMRU4pCiAKLS8qIEhvdyBtYW55IFR4IERlc2NyaXB0b3JzIGRvIHdlIG5lZWQgdG8gY2FsbCBuZXRpZl93YWtlX3F1ZXVlPyAqLwotI2RlZmluZSBJWEdCRV9UWF9RVUVVRV9XQUtFIDE2Ci0KIC8qIEhvdyBtYW55IFJ4IEJ1ZmZlcnMgZG8gd2UgYnVuZGxlIGludG8gb25lIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSA/ICovCiAjZGVmaW5lIElYR0JFX1JYX0JVRkZFUl9XUklURQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KIApAQCAtMTE5LDYgKzEwNCw3IEBACiAJZG1hX2FkZHJfdCBkbWE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJZG1hX2FkZHJfdCBwYWdlX2RtYTsKKwl1bnNpZ25lZCBpbnQgcGFnZV9vZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfcXVldWVfc3RhdHMgewpAQCAtMTUwLDIyICsxMzYsMjAgQEAKIAkJICAgICAgKiBvZmZzZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmluZywgd2hpY2ggaXMgZGlmZmVyZW50CiAJCSAgICAgICogZm9yIERDRSBhbmQgUlNTIG1vZGVzICovCiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgZGVmaW5lZChDT05GSUdfRENBKSB8fCBkZWZpbmVkKENPTkZJR19EQ0FfTU9EVUxFKQogCS8qIGNwdSBmb3IgdHggcXVldWUgKi8KIAlpbnQgY3B1OwogI2VuZGlmCiAJc3RydWN0IG5ldF9scm9fbWdyIGxyb19tZ3I7CiAJYm9vbCBscm9fdXNlZDsKIAlzdHJ1Y3QgaXhnYmVfcXVldWVfc3RhdHMgc3RhdHM7Ci0JdTggdl9pZHg7IC8qIG1hcHMgZGlyZWN0bHkgdG8gdGhlIGluZGV4IGZvciB0aGlzIHJpbmcgaW4gdGhlIGhhcmR3YXJlCi0JCSAgICogdmVjdG9yIGFycmF5LCBjYW4gYWxzbyBiZSB1c2VkIGZvciBmaW5kaW5nIHRoZSBiaXQgaW4gRUlDUgotCQkgICAqIGFuZCBmcmllbmRzIHRoYXQgcmVwcmVzZW50cyB0aGUgdmVjdG9yIGZvciB0aGlzIHJpbmcgKi8KKwl1MTYgdl9pZHg7IC8qIG1hcHMgZGlyZWN0bHkgdG8gdGhlIGluZGV4IGZvciB0aGlzIHJpbmcgaW4gdGhlIGhhcmR3YXJlCisJICAgICAgICAgICAqIHZlY3RvciBhcnJheSwgY2FuIGFsc28gYmUgdXNlZCBmb3IgZmluZGluZyB0aGUgYml0IGluIEVJQ1IKKwkgICAgICAgICAgICogYW5kIGZyaWVuZHMgdGhhdCByZXByZXNlbnRzIHRoZSB2ZWN0b3IgZm9yIHRoaXMgcmluZyAqLwogCi0JdTMyIGVpbXNfdmFsdWU7Ci0JdTE2IGl0cl9yZWdpc3RlcjsKIAotCWNoYXIgbmFtZVtJRk5BTVNJWiArIDVdOwogCXUxNiB3b3JrX2xpbWl0OyAgICAgICAgICAgICAgICAvKiBtYXggd29yayBwZXIgaW50ZXJydXB0ICovCisJdTE2IHJ4X2J1Zl9sZW47CiB9OwogCiAjZGVmaW5lIFJJTkdfRl9WTURRIDEKQEAgLTE5MCw4ICsxNzQsOCBAQAogCURFQ0xBUkVfQklUTUFQKHR4cl9pZHgsIE1BWF9UWF9RVUVVRVMpOyAvKiBUeCByaW5nIGluZGljZXMgKi8KIAl1OCByeHJfY291bnQ7ICAgICAvKiBSeCByaW5nIGNvdW50IGFzc2lnbmVkIHRvIHRoaXMgdmVjdG9yICovCiAJdTggdHhyX2NvdW50OyAgICAgLyogVHggcmluZyBjb3VudCBhc3NpZ25lZCB0byB0aGlzIHZlY3RvciAqLwotCXU4IHR4X2VpdHI7Ci0JdTggcnhfZWl0cjsKKwl1OCB0eF9pdHI7CisJdTggcnhfaXRyOwogCXUzMiBlaXRyOwogfTsKIApAQCAtMjI4LDcgKzIxMiw2IEBACiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CiAJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOwogCXUxNiBiZF9udW1iZXI7Ci0JdTE2IHJ4X2J1Zl9sZW47CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3Rhc2s7CiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yIHFfdmVjdG9yW01BWF9NU0lYX1FfVkVDVE9SU107CiAJY2hhciBuYW1lW01BWF9NU0lYX0NPVU5UXVtJRk5BTVNJWiArIDVdOwpAQCAtMjQwLDcgKzIyMyw5IEBACiAKIAkvKiBUWCAqLwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nOwkvKiBPbmUgcGVyIGFjdGl2ZSBxdWV1ZSAqLworCWludCBudW1fdHhfcXVldWVzOwogCXU2NCByZXN0YXJ0X3F1ZXVlOworCXU2NCBod19jc3VtX3R4X2dvb2Q7CiAJdTY0IGxzY19pbnQ7CiAJdTY0IGh3X3Rzb19jdHh0OwogCXU2NCBod190c282X2N0eHQ7CkBAIC0yNDksMTIgKzIzNCwxMCBAQAogCiAJLyogUlggKi8KIAlzdHJ1Y3QgaXhnYmVfcmluZyAqcnhfcmluZzsJLyogT25lIHBlciBhY3RpdmUgcXVldWUgKi8KLQl1NjQgaHdfY3N1bV90eF9nb29kOworCWludCBudW1fcnhfcXVldWVzOwogCXU2NCBod19jc3VtX3J4X2Vycm9yOwogCXU2NCBod19jc3VtX3J4X2dvb2Q7CiAJdTY0IG5vbl9lb3BfZGVzY3M7Ci0JaW50IG51bV90eF9xdWV1ZXM7Ci0JaW50IG51bV9yeF9xdWV1ZXM7CiAJaW50IG51bV9tc2l4X3ZlY3RvcnM7CiAJc3RydWN0IGl4Z2JlX3JpbmdfZmVhdHVyZSByaW5nX2ZlYXR1cmVbM107CiAJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKQEAgLTI2NywxNSArMjUwLDI4IEBACiAJICogdGh1cyB0aGUgYWRkaXRpb25hbCAqX0NBUEFCTEUgZmxhZ3MuCiAJICovCiAJdTMyIGZsYWdzOwotI2RlZmluZSBJWEdCRV9GTEFHX1JYX0NTVU1fRU5BQkxFRCAgICAgICAgICAgICAgKHUzMikoMSA8PCAwKQotI2RlZmluZSBJWEdCRV9GTEFHX01TSV9FTkFCTEVEICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAxKQotI2RlZmluZSBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAyKQotI2RlZmluZSBJWEdCRV9GTEFHX1JYX1BTX0VOQUJMRUQgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAzKQotI2RlZmluZSBJWEdCRV9GTEFHX0lOX05FVFBPTEwgICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCA0KQotI2RlZmluZSBJWEdCRV9GTEFHX0lNSVJfRU5BQkxFRCAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCA1KQotI2RlZmluZSBJWEdCRV9GTEFHX1JTU19FTkFCTEVEICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCA2KQotI2RlZmluZSBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCA3KQotI2RlZmluZSBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCA4KQorI2RlZmluZSBJWEdCRV9GTEFHX1JYX0NTVU1fRU5BQkxFRCAgICAgICAgICAgICAgKHUzMikoMSkKKyNkZWZpbmUgSVhHQkVfRkxBR19NU0lfQ0FQQUJMRSAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMSkKKyNkZWZpbmUgSVhHQkVfRkxBR19NU0lfRU5BQkxFRCAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMikKKyNkZWZpbmUgSVhHQkVfRkxBR19NU0lYX0NBUEFCTEUgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMykKKyNkZWZpbmUgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgNCkKKyNkZWZpbmUgSVhHQkVfRkxBR19SWF8xQlVGX0NBUEFCTEUgICAgICAgICAgICAgICh1MzIpKDEgPDwgNikKKyNkZWZpbmUgSVhHQkVfRkxBR19SWF9QU19DQVBBQkxFICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgNykKKyNkZWZpbmUgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgOCkKKyNkZWZpbmUgSVhHQkVfRkxBR19JTl9ORVRQT0xMICAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgOSkKKyNkZWZpbmUgSVhHQkVfRkxBR19EQ0FfRU5BQkxFRCAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMTApCisjZGVmaW5lIElYR0JFX0ZMQUdfRENBX0NBUEFCTEUgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDExKQorI2RlZmluZSBJWEdCRV9GTEFHX0lNSVJfRU5BQkxFRCAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAxMikKKyNkZWZpbmUgSVhHQkVfRkxBR19NUV9DQVBBQkxFICAgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMTMpCisjZGVmaW5lIElYR0JFX0ZMQUdfUlNTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDE2KQorI2RlZmluZSBJWEdCRV9GTEFHX1JTU19DQVBBQkxFICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAxNykKKyNkZWZpbmUgSVhHQkVfRkxBR19WTURRX0NBUEFCTEUgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMTgpCisjZGVmaW5lIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDE5KQorI2RlZmluZSBJWEdCRV9GTEFHX05FRURfTElOS19VUERBVEUgICAgICAgICAgICAgKHUzMikoMSA8PCAyMikKKyNkZWZpbmUgSVhHQkVfRkxBR19JTl9XQVRDSERPR19UQVNLICAgICAgICAgICAgICh1MzIpKDEgPDwgMjMpCisKKy8qIGRlZmF1bHQgdG8gdHJ5aW5nIGZvciBmb3VyIHNlY29uZHMgKi8KKyNkZWZpbmUgSVhHQkVfVFJZX0xJTktfVElNRU9VVCAoNCAqIEhaKQogCiAJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTI4OCwxNCArMjg0LDIxIEBACiAJc3RydWN0IGl4Z2JlX2h3X3N0YXRzIHN0YXRzOwogCiAJLyogSW50ZXJydXB0IFRocm90dGxlIFJhdGUgKi8KLQl1MzIgcnhfZWl0cjsKLQl1MzIgdHhfZWl0cjsKKwl1MzIgZWl0cl9wYXJhbTsKIAogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJdTY0IHR4X2J1c3k7CiAJdTY0IGxyb19hZ2dyZWdhdGVkOwogCXU2NCBscm9fZmx1c2hlZDsKIAl1NjQgbHJvX25vX2Rlc2M7CisJdW5zaWduZWQgaW50IHR4X3JpbmdfY291bnQ7CisJdW5zaWduZWQgaW50IHJ4X3JpbmdfY291bnQ7CisKKwl1MzIgbGlua19zcGVlZDsKKwlib29sIGxpbmtfdXA7CisJdW5zaWduZWQgbG9uZyBsaW5rX2NoZWNrX3RpbWVvdXQ7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hkb2dfdGFzazsKIH07CiAKIGVudW0gaXhiZ2Vfc3RhdGVfdCB7CkBAIC0zMTcsMTEgKzMyMCwxMSBAQAogZXh0ZXJuIHZvaWQgaXhnYmVfZG93bihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCBpeGdiZV9yZWluaXRfbG9ja2VkKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIGl4Z2JlX3Jlc2V0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKLWV4dGVybiB2b2lkIGl4Z2JlX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCBpeGdiZV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1leHRlcm4gaW50IGl4Z2JlX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnJ4ZHIpOwotZXh0ZXJuIGludCBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eGRyKTsKK2V4dGVybiBpbnQgaXhnYmVfc2V0dXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICosIHN0cnVjdCBpeGdiZV9yaW5nICopOworZXh0ZXJuIGludCBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKiwgc3RydWN0IGl4Z2JlX3JpbmcgKik7CitleHRlcm4gdm9pZCBpeGdiZV9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqLCBzdHJ1Y3QgaXhnYmVfcmluZyAqKTsKK2V4dGVybiB2b2lkIGl4Z2JlX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICosIHN0cnVjdCBpeGdiZV9yaW5nICopOworZXh0ZXJuIHZvaWQgaXhnYmVfdXBkYXRlX3N0YXRzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIAogI2VuZGlmIC8qIF9JWEdCRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTguYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk4LmMKaW5kZXggZjk2MzU4Yi4uN2NkZGNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTguYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCAxMCBHaWdhYml0IFBDSSBFeHByZXNzIExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjAsNyArMjAsNiBAQAogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogCiAgIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgogICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogCkBAIC0zNiw2NyArMzUsNjIgQEAKICNkZWZpbmUgSVhHQkVfODI1OThfTUFYX1RYX1FVRVVFUyAzMgogI2RlZmluZSBJWEdCRV84MjU5OF9NQVhfUlhfUVVFVUVTIDY0CiAjZGVmaW5lIElYR0JFXzgyNTk4X1JBUl9FTlRSSUVTICAgMTYKKyNkZWZpbmUgSVhHQkVfODI1OThfTUNfVEJMX1NJWkUgIDEyOAorI2RlZmluZSBJWEdCRV84MjU5OF9WRlRfVEJMX1NJWkUgMTI4CiAKLXN0YXRpYyBzMzIgaXhnYmVfZ2V0X2ludmFyaWFudHNfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodyk7Ci1zdGF0aWMgczMyIGl4Z2JlX2dldF9saW5rX3NldHRpbmdzXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqc3BlZWQsCi0JCQkJCSBib29sICphdXRvbmVnKTsKLXN0YXRpYyBzMzIgaXhnYmVfZ2V0X2NvcHBlcl9saW5rX3NldHRpbmdzXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0JCQkJCQl1MzIgKnNwZWVkLCBib29sICphdXRvbmVnKTsKLXN0YXRpYyBlbnVtIGl4Z2JlX21lZGlhX3R5cGUgaXhnYmVfZ2V0X21lZGlhX3R5cGVfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodyk7Ci1zdGF0aWMgczMyIGl4Z2JlX3NldHVwX21hY19saW5rXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcpOwotc3RhdGljIHMzMiBpeGdiZV9jaGVja19tYWNfbGlua184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnNwZWVkLAotCQkJCSAgICAgIGJvb2wgKmxpbmtfdXApOwotc3RhdGljIHMzMiBpeGdiZV9zZXR1cF9tYWNfbGlua19zcGVlZF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgc3BlZWQsCi0JCQkJCSAgICBib29sIGF1dG9uZWcsCi0JCQkJCSAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CitzdGF0aWMgczMyIGl4Z2JlX2dldF9jb3BwZXJfbGlua19jYXBhYmlsaXRpZXNfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqYXV0b25lZyk7CiBzdGF0aWMgczMyIGl4Z2JlX3NldHVwX2NvcHBlcl9saW5rXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcpOwotc3RhdGljIHMzMiBpeGdiZV9zZXR1cF9jb3BwZXJfbGlua19zcGVlZF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgc3BlZWQsCi0JCQkJCSAgICAgICBib29sIGF1dG9uZWcsCi0JCQkJCSAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7Ci1zdGF0aWMgczMyIGl4Z2JlX3Jlc2V0X2h3XzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcpOworc3RhdGljIHMzMiBpeGdiZV9zZXR1cF9jb3BwZXJfbGlua19zcGVlZF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9uZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKIAotCisvKioKKyAqLwogc3RhdGljIHMzMiBpeGdiZV9nZXRfaW52YXJpYW50c184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewotCWh3LT5tYWMubnVtX3J4X3F1ZXVlcyA9IElYR0JFXzgyNTk4X01BWF9SWF9RVUVVRVM7Ci0JaHctPm1hYy5udW1fdHhfcXVldWVzID0gSVhHQkVfODI1OThfTUFYX1RYX1FVRVVFUzsKLQlody0+bWFjLm51bV9yeF9hZGRycyA9IElYR0JFXzgyNTk4X1JBUl9FTlRSSUVTOworCXN0cnVjdCBpeGdiZV9tYWNfaW5mbyAqbWFjID0gJmh3LT5tYWM7CisJc3RydWN0IGl4Z2JlX3BoeV9pbmZvICpwaHkgPSAmaHctPnBoeTsKIAotCS8qIFBIWSBvcHMgYXJlIGZpbGxlZCBpbiBieSBkZWZhdWx0IHByb3Blcmx5IGZvciBGaWJlciBvbmx5ICovCi0JaWYgKGh3LT5tYWMub3BzLmdldF9tZWRpYV90eXBlKGh3KSA9PSBpeGdiZV9tZWRpYV90eXBlX2NvcHBlcikgewotCQlody0+bWFjLm9wcy5zZXR1cF9saW5rID0gJml4Z2JlX3NldHVwX2NvcHBlcl9saW5rXzgyNTk4OwotCQlody0+bWFjLm9wcy5zZXR1cF9saW5rX3NwZWVkID0gJml4Z2JlX3NldHVwX2NvcHBlcl9saW5rX3NwZWVkXzgyNTk4OwotCQlody0+bWFjLm9wcy5nZXRfbGlua19zZXR0aW5ncyA9Ci0JCQkJJml4Z2JlX2dldF9jb3BwZXJfbGlua19zZXR0aW5nc184MjU5ODsKKwkvKiBDYWxsIFBIWSBpZGVudGlmeSByb3V0aW5lIHRvIGdldCB0aGUgcGh5IHR5cGUgKi8KKwlpeGdiZV9pZGVudGlmeV9waHlfZ2VuZXJpYyhodyk7CiAKLQkJLyogQ2FsbCBQSFkgaWRlbnRpZnkgcm91dGluZSB0byBnZXQgdGhlIHBoeSB0eXBlICovCi0JCWl4Z2JlX2lkZW50aWZ5X3BoeShodyk7Ci0KLQkJc3dpdGNoIChody0+cGh5LnR5cGUpIHsKLQkJY2FzZSBpeGdiZV9waHlfdG46Ci0JCQlody0+cGh5Lm9wcy5zZXR1cF9saW5rID0gJml4Z2JlX3NldHVwX3RueF9waHlfbGluazsKLQkJCWh3LT5waHkub3BzLmNoZWNrX2xpbmsgPSAmaXhnYmVfY2hlY2tfdG54X3BoeV9saW5rOwotCQkJaHctPnBoeS5vcHMuc2V0dXBfbGlua19zcGVlZCA9Ci0JCQkJCSZpeGdiZV9zZXR1cF90bnhfcGh5X2xpbmtfc3BlZWQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9CisJLyogUEhZIEluaXQgKi8KKwlzd2l0Y2ggKHBoeS0+dHlwZSkgeworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAorCWlmIChtYWMtPm9wcy5nZXRfbWVkaWFfdHlwZShodykgPT0gaXhnYmVfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJbWFjLT5vcHMuc2V0dXBfbGluayA9ICZpeGdiZV9zZXR1cF9jb3BwZXJfbGlua184MjU5ODsKKwkJbWFjLT5vcHMuc2V0dXBfbGlua19zcGVlZCA9CisJCSAgICAgICAgICAgICAgICAgICAgICZpeGdiZV9zZXR1cF9jb3BwZXJfbGlua19zcGVlZF84MjU5ODsKKwkJbWFjLT5vcHMuZ2V0X2xpbmtfY2FwYWJpbGl0aWVzID0KKwkJICAgICAgICAgICAgICAgICAgICAgJml4Z2JlX2dldF9jb3BwZXJfbGlua19jYXBhYmlsaXRpZXNfODI1OTg7CisJfQorCisJbWFjLT5tY2Z0X3NpemUgPSBJWEdCRV84MjU5OF9NQ19UQkxfU0laRTsKKwltYWMtPnZmdF9zaXplID0gSVhHQkVfODI1OThfVkZUX1RCTF9TSVpFOworCW1hYy0+bnVtX3Jhcl9lbnRyaWVzID0gSVhHQkVfODI1OThfUkFSX0VOVFJJRVM7CisJbWFjLT5tYXhfcnhfcXVldWVzID0gSVhHQkVfODI1OThfTUFYX1JYX1FVRVVFUzsKKwltYWMtPm1heF90eF9xdWV1ZXMgPSBJWEdCRV84MjU5OF9NQVhfVFhfUVVFVUVTOworCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIGl4Z2JlX2dldF9saW5rX3NldHRpbmdzXzgyNTk4IC0gRGV0ZXJtaW5lcyBkZWZhdWx0IGxpbmsgc2V0dGluZ3MKKyAqICBpeGdiZV9nZXRfbGlua19jYXBhYmlsaXRpZXNfODI1OTggLSBEZXRlcm1pbmVzIGxpbmsgY2FwYWJpbGl0aWVzCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogIEBzcGVlZDogcG9pbnRlciB0byBsaW5rIHNwZWVkCiAgKiAgQGF1dG9uZWc6IGJvb2xlYW4gYXV0by1uZWdvdGlhdGlvbiB2YWx1ZQogICoKLSAqICBEZXRlcm1pbmVzIHRoZSBkZWZhdWx0IGxpbmsgc2V0dGluZ3MgYnkgcmVhZGluZyB0aGUgQVVUT0MgcmVnaXN0ZXIuCisgKiAgRGV0ZXJtaW5lcyB0aGUgbGluayBjYXBhYmlsaXRpZXMgYnkgcmVhZGluZyB0aGUgQVVUT0MgcmVnaXN0ZXIuCiAgKiovCi1zdGF0aWMgczMyIGl4Z2JlX2dldF9saW5rX3NldHRpbmdzXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqc3BlZWQsCi0JCQkJCSBib29sICphdXRvbmVnKQorc3RhdGljIHMzMiBpeGdiZV9nZXRfbGlua19jYXBhYmlsaXRpZXNfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgKnNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqYXV0b25lZykKIHsKIAlzMzIgc3RhdHVzID0gMDsKIAlzMzIgYXV0b2NfcmVnOwpAQCAtMTQ1LDE1ICsxMzksMTYgQEAKIH0KIAogLyoqCi0gKiAgaXhnYmVfZ2V0X2NvcHBlcl9saW5rX3NldHRpbmdzXzgyNTk4IC0gRGV0ZXJtaW5lcyBkZWZhdWx0IGxpbmsgc2V0dGluZ3MKKyAqICBpeGdiZV9nZXRfY29wcGVyX2xpbmtfY2FwYWJpbGl0aWVzXzgyNTk4IC0gRGV0ZXJtaW5lcyBsaW5rIGNhcGFiaWxpdGllcwogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAc3BlZWQ6IHBvaW50ZXIgdG8gbGluayBzcGVlZAogICogIEBhdXRvbmVnOiBib29sZWFuIGF1dG8tbmVnb3RpYXRpb24gdmFsdWUKICAqCi0gKiAgRGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCBsaW5rIHNldHRpbmdzIGJ5IHJlYWRpbmcgdGhlIEFVVE9DIHJlZ2lzdGVyLgorICogIERldGVybWluZXMgdGhlIGxpbmsgY2FwYWJpbGl0aWVzIGJ5IHJlYWRpbmcgdGhlIEFVVE9DIHJlZ2lzdGVyLgogICoqLwotc3RhdGljIHMzMiBpeGdiZV9nZXRfY29wcGVyX2xpbmtfc2V0dGluZ3NfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywKLQkJCQkJCXUzMiAqc3BlZWQsIGJvb2wgKmF1dG9uZWcpCitzMzIgaXhnYmVfZ2V0X2NvcHBlcl9saW5rX2NhcGFiaWxpdGllc184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCAqc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICphdXRvbmVnKQogewogCXMzMiBzdGF0dXMgPSBJWEdCRV9FUlJfTElOS19TRVRVUDsKIAl1MTYgc3BlZWRfYWJpbGl0eTsKQEAgLTE2MSw5ICsxNTYsOSBAQAogCSpzcGVlZCA9IDA7CiAJKmF1dG9uZWcgPSB0cnVlOwogCi0Jc3RhdHVzID0gaXhnYmVfcmVhZF9waHlfcmVnKGh3LCBJWEdCRV9NRElPX1BIWV9TUEVFRF9BQklMSVRZLAotCQkJCSAgICBJWEdCRV9NRElPX1BNQV9QTURfREVWX1RZUEUsCi0JCQkJICAgICZzcGVlZF9hYmlsaXR5KTsKKwlzdGF0dXMgPSBody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfTURJT19QSFlfU1BFRURfQUJJTElUWSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9NRElPX1BNQV9QTURfREVWX1RZUEUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwZWVkX2FiaWxpdHkpOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCWlmIChzcGVlZF9hYmlsaXR5ICYgSVhHQkVfTURJT19QSFlfU1BFRURfMTBHKQpAQCAtMTkxLDExICsxODYsOSBAQAogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk4QUZfU0lOR0xFX1BPUlQ6CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OThFQl9DWDQ6CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OThfQ1g0X0RVQUxfUE9SVDoKKwljYXNlIElYR0JFX0RFVl9JRF84MjU5OEVCX1hGX0xSOgogCQltZWRpYV90eXBlID0gaXhnYmVfbWVkaWFfdHlwZV9maWJlcjsKIAkJYnJlYWs7Ci0JY2FzZSBJWEdCRV9ERVZfSURfODI1OThBVF9EVUFMX1BPUlQ6Ci0JCW1lZGlhX3R5cGUgPSBpeGdiZV9tZWRpYV90eXBlX2NvcHBlcjsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbWVkaWFfdHlwZSA9IGl4Z2JlX21lZGlhX3R5cGVfdW5rbm93bjsKIAkJYnJlYWs7CkBAIC0yMDUsNiArMTk4LDEyMiBAQAogfQogCiAvKioKKyAqICBpeGdiZV9zZXR1cF9mY184MjU5OCAtIENvbmZpZ3VyZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQHBhY2tldGJ1Zl9udW06IHBhY2tldCBidWZmZXIgbnVtYmVyICgwLTcpCisgKgorICogIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiYXNlZCBvbiBTVyBjb25maWd1cmF0aW9uLiAgVGhpcworICogIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIDgwMi4zeCBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbiBvbmx5LgorICoqLworczMyIGl4Z2JlX3NldHVwX2ZjXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHMzMiBwYWNrZXRidWZfbnVtKQoreworCXUzMiBmcmN0bF9yZWc7CisJdTMyIHJtY3NfcmVnOworCisJaWYgKHBhY2tldGJ1Zl9udW0gPCAwIHx8IHBhY2tldGJ1Zl9udW0gPiA3KSB7CisJCWh3X2RiZyhodywgIkludmFsaWQgcGFja2V0IGJ1ZmZlciBudW1iZXIgWyVkXSwgZXhwZWN0ZWQgcmFuZ2UgaXMiCisJCSAgICAgICAgICAiIDAtN1xuIiwgcGFja2V0YnVmX251bSk7CisJfQorCisJZnJjdGxfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0ZDVFJMKTsKKwlmcmN0bF9yZWcgJj0gfihJWEdCRV9GQ1RSTF9SRkNFIHwgSVhHQkVfRkNUUkxfUlBGQ0UpOworCisJcm1jc19yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUk1DUyk7CisJcm1jc19yZWcgJj0gfihJWEdCRV9STUNTX1RGQ0VfUFJJT1JJVFkgfCBJWEdCRV9STUNTX1RGQ0VfODAyXzNYKTsKKworCS8qCisJICogMTAgZ2lnIHBhcnRzIGRvIG5vdCBoYXZlIGEgd29yZCBpbiB0aGUgRUVQUk9NIHRvIGRldGVybWluZSB0aGUKKwkgKiBkZWZhdWx0IGZsb3cgY29udHJvbCBzZXR0aW5nLCBzbyB3ZSBleHBsaWNpdGx5IHNldCBpdCB0byBmdWxsLgorCSAqLworCWlmIChody0+ZmMudHlwZSA9PSBpeGdiZV9mY19kZWZhdWx0KQorCQlody0+ZmMudHlwZSA9IGl4Z2JlX2ZjX2Z1bGw7CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gc2F2ZSBvZmYgdGhlIG9yaWdpbmFsIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uIGp1c3QgaW4KKwkgKiBjYXNlIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHRoZW4gcmVjb25uZWN0ZWQgaW50byBhIGRpZmZlcmVudCBodWIKKwkgKiBvciBzd2l0Y2ggd2l0aCBkaWZmZXJlbnQgRmxvdyBDb250cm9sIGNhcGFiaWxpdGllcy4KKwkgKi8KKwlody0+ZmMub3JpZ2luYWxfdHlwZSA9IGh3LT5mYy50eXBlOworCisJLyoKKwkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmxvd19jb250cm9sIiBwYXJhbWV0ZXIgYXJlOgorCSAqIDA6IEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisJICogMTogUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlIGZyYW1lcyBidXQgbm90CisJICogICAgc2VuZCBwYXVzZSBmcmFtZXMpLgorCSAqIDI6IFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMgYnV0IHdlIGRvIG5vdAorCSAqICAgIHN1cHBvcnQgcmVjZWl2aW5nIHBhdXNlIGZyYW1lcykKKwkgKiAzOiBCb3RoIFJ4IGFuZCBUeCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgYXJlIGVuYWJsZWQuCisJICogb3RoZXI6IEludmFsaWQuCisJICovCisJc3dpdGNoIChody0+ZmMudHlwZSkgeworCWNhc2UgaXhnYmVfZmNfbm9uZToKKwkJYnJlYWs7CisJY2FzZSBpeGdiZV9mY19yeF9wYXVzZToKKwkJLyoKKwkJICogUnggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsCisJCSAqIGFuZCBUeCBGbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQuCisJCSAqLworCQlmcmN0bF9yZWcgfD0gSVhHQkVfRkNUUkxfUkZDRTsKKwkJYnJlYWs7CisJY2FzZSBpeGdiZV9mY190eF9wYXVzZToKKwkJLyoKKwkJICogVHggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBSeCBGbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQsCisJCSAqIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorCQkgKi8KKwkJcm1jc19yZWcgfD0gSVhHQkVfUk1DU19URkNFXzgwMl8zWDsKKwkJYnJlYWs7CisJY2FzZSBpeGdiZV9mY19mdWxsOgorCQkvKgorCQkgKiBGbG93IGNvbnRyb2wgKGJvdGggUnggYW5kIFR4KSBpcyBlbmFibGVkIGJ5IGEgc29mdHdhcmUKKwkJICogb3Zlci1yaWRlLgorCQkgKi8KKwkJZnJjdGxfcmVnIHw9IElYR0JFX0ZDVFJMX1JGQ0U7CisJCXJtY3NfcmVnIHw9IElYR0JFX1JNQ1NfVEZDRV84MDJfM1g7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgMC0zLiAqLworCQlod19kYmcoaHcsICJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogRW5hYmxlIDgwMi4zeCBiYXNlZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuICovCisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1RSTCwgZnJjdGxfcmVnKTsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JNQ1MsIHJtY3NfcmVnKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGludmFsaWQgc29mdHdhcmUgY29uZmlndXJhdGlvbiwgemVyb3MgYXJlIGNvbXBsZXRlbHkKKwkgKiBpbnZhbGlkIGZvciBhbGwgcGFyYW1ldGVycyB1c2VkIHBhc3QgdGhpcyBwb2ludCwgYW5kIGlmIHdlIGVuYWJsZQorCSAqIGZsb3cgY29udHJvbCB3aXRoIHplcm8gd2F0ZXIgbWFya3MsIHdlIGJsYXN0IGZsb3cgY29udHJvbCBwYWNrZXRzLgorCSAqLworCWlmICghaHctPmZjLmxvd193YXRlciB8fCAhaHctPmZjLmhpZ2hfd2F0ZXIgfHwgIWh3LT5mYy5wYXVzZV90aW1lKSB7CisJCWh3X2RiZyhodywgIkZsb3cgY29udHJvbCBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgaW5jb3JyZWN0bHlcbiIpOworCQlyZXR1cm4gSVhHQkVfRVJSX0lOVkFMSURfTElOS19TRVRUSU5HUzsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIKKwkgKiBtYXJrcyBhcyB3ZWxsIGFzIChvcHRpb25hbGx5KSBlbmFibGluZyB0aGUgdHJhbnNtaXNzaW9uIG9mCisJICogWE9OIGZyYW1lcy4KKwkgKi8KKwlpZiAoaHctPmZjLnR5cGUgJiBpeGdiZV9mY190eF9wYXVzZSkgeworCQlpZiAoaHctPmZjLnNlbmRfeG9uKSB7CisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDUlRMKHBhY2tldGJ1Zl9udW0pLAorCQkJICAgICAgICAgICAgICAgIChody0+ZmMubG93X3dhdGVyIHwgSVhHQkVfRkNSVExfWE9ORSkpOworCQl9IGVsc2UgeworCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUTChwYWNrZXRidWZfbnVtKSwKKwkJCSAgICAgICAgICAgICAgICBody0+ZmMubG93X3dhdGVyKTsKKwkJfQorCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDUlRIKHBhY2tldGJ1Zl9udW0pLAorCQkgICAgICAgICAgICAgICAgKGh3LT5mYy5oaWdoX3dhdGVyKXxJWEdCRV9GQ1JUSF9GQ0VOKTsKKwl9CisKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDVFRWKDApLCBody0+ZmMucGF1c2VfdGltZSk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUViwgKGh3LT5mYy5wYXVzZV90aW1lID4+IDEpKTsKKworCXJldHVybiAwOworfQorCisvKioKICAqICBpeGdiZV9zZXR1cF9tYWNfbGlua184MjU5OCAtIENvbmZpZ3VyZXMgTUFDIGxpbmsgc2V0dGluZ3MKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKgpAQCAtMjQ4LDggKzM1Nyw3IEBACiAJCQl9CiAJCQlpZiAoIShsaW5rc19yZWcgJiBJWEdCRV9MSU5LU19LWF9BTl9DT01QKSkgewogCQkJCXN0YXR1cyA9IElYR0JFX0VSUl9BVVRPTkVHX05PVF9DT01QTEVURTsKLQkJCQlod19kYmcoaHcsCi0JCQkJICAgICAgICJBdXRvbmVnb3RpYXRpb24gZGlkIG5vdCBjb21wbGV0ZS5cbiIpOworCQkJCWh3X2RiZyhodywgIkF1dG9uZWdvdGlhdGlvbiBkaWQgbm90IGNvbXBsZXRlLlxuIik7CiAJCQl9CiAJCX0KIAl9CkBAIC0yNTksOCArMzY3LDggQEAKIAkgKiBjYXNlIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHRoZW4gcmVjb25uZWN0ZWQgaW50byBhIGRpZmZlcmVudCBodWIKIAkgKiBvciBzd2l0Y2ggd2l0aCBkaWZmZXJlbnQgRmxvdyBDb250cm9sIGNhcGFiaWxpdGllcy4KIAkgKi8KLQlody0+ZmMudHlwZSA9IGh3LT5mYy5vcmlnaW5hbF90eXBlOwotCWl4Z2JlX3NldHVwX2ZjKGh3LCAwKTsKKwlody0+ZmMub3JpZ2luYWxfdHlwZSA9IGh3LT5mYy50eXBlOworCWl4Z2JlX3NldHVwX2ZjXzgyNTk4KGh3LCAwKTsKIAogCS8qIEFkZCBkZWxheSB0byBmaWx0ZXIgb3V0IG5vaXNlcyBkdXJpbmcgaW5pdGlhbCBsaW5rIHNldHVwICovCiAJbXNsZWVwKDUwKTsKQEAgLTI3MywyMCArMzgxLDM1IEBACiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogIEBzcGVlZDogcG9pbnRlciB0byBsaW5rIHNwZWVkCiAgKiAgQGxpbmtfdXA6IHRydWUgaXMgbGluayBpcyB1cCwgZmFsc2Ugb3RoZXJ3aXNlCisgKiAgQGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZTogYm9vbCB1c2VkIHRvIHdhaXQgZm9yIGxpbmsgdXAgb3Igbm90CiAgKgogICogIFJlYWRzIHRoZSBsaW5rcyByZWdpc3RlciB0byBkZXRlcm1pbmUgaWYgbGluayBpcyB1cCBhbmQgdGhlIGN1cnJlbnQgc3BlZWQKICAqKi8KLXN0YXRpYyBzMzIgaXhnYmVfY2hlY2tfbWFjX2xpbmtfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICpzcGVlZCwKLQkJCQkgICAgICBib29sICpsaW5rX3VwKQorc3RhdGljIHMzMiBpeGdiZV9jaGVja19tYWNfbGlua184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9saW5rX3NwZWVkICpzcGVlZCwgYm9vbCAqbGlua191cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5rX3VwX3dhaXRfdG9fY29tcGxldGUpCiB7CiAJdTMyIGxpbmtzX3JlZzsKKwl1MzIgaTsKIAogCWxpbmtzX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9MSU5LUyk7Ci0KLQlpZiAobGlua3NfcmVnICYgSVhHQkVfTElOS1NfVVApCi0JCSpsaW5rX3VwID0gdHJ1ZTsKLQllbHNlCi0JCSpsaW5rX3VwID0gZmFsc2U7CisJaWYgKGxpbmtfdXBfd2FpdF90b19jb21wbGV0ZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfTElOS19VUF9USU1FOyBpKyspIHsKKwkJCWlmIChsaW5rc19yZWcgJiBJWEdCRV9MSU5LU19VUCkgeworCQkJCSpsaW5rX3VwID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJKmxpbmtfdXAgPSBmYWxzZTsKKwkJCX0KKwkJCW1zbGVlcCgxMDApOworCQkJbGlua3NfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0xJTktTKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChsaW5rc19yZWcgJiBJWEdCRV9MSU5LU19VUCkKKwkJCSpsaW5rX3VwID0gdHJ1ZTsKKwkJZWxzZQorCQkJKmxpbmtfdXAgPSBmYWxzZTsKKwl9CiAKIAlpZiAobGlua3NfcmVnICYgSVhHQkVfTElOS1NfU1BFRUQpCiAJCSpzcGVlZCA9IElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMOwpAQCAtMjk2LDYgKzQxOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKwogLyoqCiAgKiAgaXhnYmVfc2V0dXBfbWFjX2xpbmtfc3BlZWRfODI1OTggLSBTZXQgTUFDIGxpbmsgc3BlZWQKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCkBAIC0zMDYsMTggKzQzMCwxOCBAQAogICogIFNldCB0aGUgbGluayBzcGVlZCBpbiB0aGUgQVVUT0MgcmVnaXN0ZXIgYW5kIHJlc3RhcnRzIGxpbmsuCiAgKiovCiBzdGF0aWMgczMyIGl4Z2JlX3NldHVwX21hY19saW5rX3NwZWVkXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsCi0JCQkJCSAgICB1MzIgc3BlZWQsIGJvb2wgYXV0b25lZywKLQkJCQkJICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9saW5rX3NwZWVkIHNwZWVkLCBib29sIGF1dG9uZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKQogewogCXMzMiBzdGF0dXMgPSAwOwogCiAJLyogSWYgc3BlZWQgaXMgMTBHLCB0aGVuIGNoZWNrIGZvciBDWDQgb3IgWEFVSS4gKi8KIAlpZiAoKHNwZWVkID09IElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMKSAmJgotCSAgICAoIShody0+bWFjLmxpbmtfYXR0YWNoX3R5cGUgJiBJWEdCRV9BVVRPQ18xMEdfS1g0KSkpCisJICAgICghKGh3LT5tYWMubGlua19hdHRhY2hfdHlwZSAmIElYR0JFX0FVVE9DXzEwR19LWDQpKSkgewogCQlody0+bWFjLmxpbmtfbW9kZV9zZWxlY3QgPSBJWEdCRV9BVVRPQ19MTVNfMTBHX0xJTktfTk9fQU47Ci0JZWxzZSBpZiAoKHNwZWVkID09IElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwpICYmICghYXV0b25lZykpCisJfSBlbHNlIGlmICgoc3BlZWQgPT0gSVhHQkVfTElOS19TUEVFRF8xR0JfRlVMTCkgJiYgKCFhdXRvbmVnKSkgewogCQlody0+bWFjLmxpbmtfbW9kZV9zZWxlY3QgPSBJWEdCRV9BVVRPQ19MTVNfMUdfTElOS19OT19BTjsKLQllbHNlIGlmIChhdXRvbmVnKSB7CisJfSBlbHNlIGlmIChhdXRvbmVnKSB7CiAJCS8qIEJYIG1vZGUgLSBBdXRvbmVnb3RpYXRlIDFHICovCiAJCWlmICghKGh3LT5tYWMubGlua19hdHRhY2hfdHlwZSAmIElYR0JFX0FVVE9DXzFHX1BNQV9QTUQpKQogCQkJaHctPm1hYy5saW5rX21vZGVfc2VsZWN0ID0gSVhHQkVfQVVUT0NfTE1TXzFHX0FOOwpAQCAtMzM2LDcgKzQ2MCw3IEBACiAJCSAqIGl4Z2JlX2h3IFRoaXMgd2lsbCB3cml0ZSB0aGUgQVVUT0MgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIG5ldwogCQkgKiBzdG9yZWQgdmFsdWVzCiAJCSAqLwotCQlody0+bWFjLm9wcy5zZXR1cF9saW5rKGh3KTsKKwkJaXhnYmVfc2V0dXBfbWFjX2xpbmtfODI1OTgoaHcpOwogCX0KIAogCXJldHVybiBzdGF0dXM7CkBAIC0zNTQsMTggKzQ3OCwxNyBAQAogICoqLwogc3RhdGljIHMzMiBpeGdiZV9zZXR1cF9jb3BwZXJfbGlua184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewotCXMzMiBzdGF0dXMgPSAwOworCXMzMiBzdGF0dXM7CiAKIAkvKiBSZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbiBvbiBQSFkgKi8KLQlpZiAoaHctPnBoeS5vcHMuc2V0dXBfbGluaykKLQkJc3RhdHVzID0gaHctPnBoeS5vcHMuc2V0dXBfbGluayhodyk7CisJc3RhdHVzID0gaHctPnBoeS5vcHMuc2V0dXBfbGluayhodyk7CiAKLQkvKiBTZXQgTUFDIHRvIEtYL0tYNCBhdXRvbmVnLCB3aGljaCBkZWZhdWx0aXMgdG8gUGFyYWxsZWwgZGV0ZWN0aW9uICovCisJLyogU2V0IE1BQyB0byBLWC9LWDQgYXV0b25lZywgd2hpY2ggZGVmYXVsdHMgdG8gUGFyYWxsZWwgZGV0ZWN0aW9uICovCiAJaHctPm1hYy5saW5rX2F0dGFjaF90eXBlID0gKElYR0JFX0FVVE9DXzEwR19LWDQgfCBJWEdCRV9BVVRPQ18xR19LWCk7CiAJaHctPm1hYy5saW5rX21vZGVfc2VsZWN0ID0gSVhHQkVfQVVUT0NfTE1TX0tYNF9BTjsKIAogCS8qIFNldCB1cCBNQUMgKi8KLQlody0+bWFjLm9wcy5zZXR1cF9saW5rKGh3KTsKKwlpeGdiZV9zZXR1cF9tYWNfbGlua184MjU5OChodyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzc5LDIzICs1MDIsMjMgQEAKICAqCiAgKiAgU2V0cyB0aGUgbGluayBzcGVlZCBpbiB0aGUgQVVUT0MgcmVnaXN0ZXIgaW4gdGhlIE1BQyBhbmQgcmVzdGFydHMgbGluay4KICAqKi8KLXN0YXRpYyBzMzIgaXhnYmVfc2V0dXBfY29wcGVyX2xpbmtfc3BlZWRfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHNwZWVkLAotCQkJCQkgICAgICAgYm9vbCBhdXRvbmVnLAotCQkJCQkgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCitzdGF0aWMgczMyIGl4Z2JlX3NldHVwX2NvcHBlcl9saW5rX3NwZWVkXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCiB7Ci0JczMyIHN0YXR1cyA9IDA7CisJczMyIHN0YXR1czsKIAogCS8qIFNldHVwIHRoZSBQSFkgYWNjb3JkaW5nIHRvIGlucHV0IHNwZWVkICovCi0JaWYgKGh3LT5waHkub3BzLnNldHVwX2xpbmtfc3BlZWQpCi0JCXN0YXR1cyA9IGh3LT5waHkub3BzLnNldHVwX2xpbmtfc3BlZWQoaHcsIHNwZWVkLCBhdXRvbmVnLAotCQkJCQkJYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKKwlzdGF0dXMgPSBody0+cGh5Lm9wcy5zZXR1cF9saW5rX3NwZWVkKGh3LCBzcGVlZCwgYXV0b25lZywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiAKIAkvKiBTZXQgTUFDIHRvIEtYL0tYNCBhdXRvbmVnLCB3aGljaCBkZWZhdWx0cyB0byBQYXJhbGxlbCBkZXRlY3Rpb24gKi8KIAlody0+bWFjLmxpbmtfYXR0YWNoX3R5cGUgPSAoSVhHQkVfQVVUT0NfMTBHX0tYNCB8IElYR0JFX0FVVE9DXzFHX0tYKTsKIAlody0+bWFjLmxpbmtfbW9kZV9zZWxlY3QgPSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOOwogCiAJLyogU2V0IHVwIE1BQyAqLwotCWh3LT5tYWMub3BzLnNldHVwX2xpbmsoaHcpOworCWl4Z2JlX3NldHVwX21hY19saW5rXzgyNTk4KGh3KTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00MDQsNyArNTI3LDcgQEAKICAqICBpeGdiZV9yZXNldF9od184MjU5OCAtIFBlcmZvcm1zIGhhcmR3YXJlIHJlc2V0CiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKLSAqICBSZXNldHMgdGhlIGhhcmR3YXJlIGJ5IHJlc2V0aW5nIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cywgbWFza3MgYW5kCisgKiAgUmVzZXRzIHRoZSBoYXJkd2FyZSBieSByZXNldHRpbmcgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHVuaXRzLCBtYXNrcyBhbmQKICAqICBjbGVhcnMgYWxsIGludGVycnVwdHMsIHBlcmZvcm1pbmcgYSBQSFkgcmVzZXQsIGFuZCBwZXJmb3JtaW5nIGEgbGluayAoTUFDKQogICogIHJlc2V0LgogICoqLwpAQCAtNDE4LDM1ICs1NDEsNDQgQEAKIAl1OCAgYW5hbG9nX3ZhbDsKIAogCS8qIENhbGwgYWRhcHRlciBzdG9wIHRvIGRpc2FibGUgdHgvcnggYW5kIGNsZWFyIGludGVycnVwdHMgKi8KLQlpeGdiZV9zdG9wX2FkYXB0ZXIoaHcpOworCWh3LT5tYWMub3BzLnN0b3BfYWRhcHRlcihodyk7CiAKIAkvKgotCSAqIFBvd2VyIHVwIHRoZSBBdGxhcyBUWCBsYW5lcyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcG93ZXJlZCBkb3duLgotCSAqIEF0bGFzIFRYIGxhbmVzIGFyZSBwb3dlcmVkIGRvd24gZm9yIE1BQyBsb29wYmFjayB0ZXN0cywgYnV0CisJICogUG93ZXIgdXAgdGhlIEF0bGFzIFR4IGxhbmVzIGlmIHRoZXkgYXJlIGN1cnJlbnRseSBwb3dlcmVkIGRvd24uCisJICogQXRsYXMgVHggbGFuZXMgYXJlIHBvd2VyZWQgZG93biBmb3IgTUFDIGxvb3BiYWNrIHRlc3RzLCBidXQKIAkgKiB0aGV5IGFyZSBub3QgYXV0b21hdGljYWxseSByZXN0b3JlZCBvbiByZXNldC4KIAkgKi8KLQlpeGdiZV9yZWFkX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fTFBCSywgJmFuYWxvZ192YWwpOworCWh3LT5tYWMub3BzLnJlYWRfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl9MUEJLLCAmYW5hbG9nX3ZhbCk7CiAJaWYgKGFuYWxvZ192YWwgJiBJWEdCRV9BVExBU19QRE5fVFhfUkVHX0VOKSB7Ci0JCS8qIEVuYWJsZSBUWCBBdGxhcyBzbyBwYWNrZXRzIGNhbiBiZSB0cmFuc21pdHRlZCBhZ2FpbiAqLwotCQlpeGdiZV9yZWFkX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fTFBCSywgJmFuYWxvZ192YWwpOworCQkvKiBFbmFibGUgVHggQXRsYXMgc28gcGFja2V0cyBjYW4gYmUgdHJhbnNtaXR0ZWQgYWdhaW4gKi8KKwkJaHctPm1hYy5vcHMucmVhZF9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROX0xQQkssCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWxvZ192YWwpOwogCQlhbmFsb2dfdmFsICY9IH5JWEdCRV9BVExBU19QRE5fVFhfUkVHX0VOOwotCQlpeGdiZV93cml0ZV9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROX0xQQkssIGFuYWxvZ192YWwpOworCQlody0+bWFjLm9wcy53cml0ZV9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROX0xQQkssCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWxvZ192YWwpOwogCi0JCWl4Z2JlX3JlYWRfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl8xMEcsICZhbmFsb2dfdmFsKTsKKwkJaHctPm1hYy5vcHMucmVhZF9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROXzEwRywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5hbG9nX3ZhbCk7CiAJCWFuYWxvZ192YWwgJj0gfklYR0JFX0FUTEFTX1BETl9UWF8xMEdfUUxfQUxMOwotCQlpeGdiZV93cml0ZV9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROXzEwRywgYW5hbG9nX3ZhbCk7CisJCWh3LT5tYWMub3BzLndyaXRlX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fMTBHLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFsb2dfdmFsKTsKIAotCQlpeGdiZV9yZWFkX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fMUcsICZhbmFsb2dfdmFsKTsKKwkJaHctPm1hYy5vcHMucmVhZF9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROXzFHLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmFsb2dfdmFsKTsKIAkJYW5hbG9nX3ZhbCAmPSB+SVhHQkVfQVRMQVNfUEROX1RYXzFHX1FMX0FMTDsKLQkJaXhnYmVfd3JpdGVfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl8xRywgYW5hbG9nX3ZhbCk7CisJCWh3LT5tYWMub3BzLndyaXRlX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fMUcsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWxvZ192YWwpOwogCi0JCWl4Z2JlX3JlYWRfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl9BTiwgJmFuYWxvZ192YWwpOworCQlody0+bWFjLm9wcy5yZWFkX2FuYWxvZ19yZWc4KGh3LCBJWEdCRV9BVExBU19QRE5fQU4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuYWxvZ192YWwpOwogCQlhbmFsb2dfdmFsICY9IH5JWEdCRV9BVExBU19QRE5fVFhfQU5fUUxfQUxMOwotCQlpeGdiZV93cml0ZV9hbmFsb2dfcmVnOChodywgSVhHQkVfQVRMQVNfUEROX0FOLCBhbmFsb2dfdmFsKTsKKwkJaHctPm1hYy5vcHMud3JpdGVfYW5hbG9nX3JlZzgoaHcsIElYR0JFX0FUTEFTX1BETl9BTiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbG9nX3ZhbCk7CiAJfQogCiAJLyogUmVzZXQgUEhZICovCi0JaXhnYmVfcmVzZXRfcGh5KGh3KTsKKwlpZiAoaHctPnBoeS5yZXNldF9kaXNhYmxlID09IGZhbHNlKQorCQlody0+cGh5Lm9wcy5yZXNldChodyk7CiAKIAkvKgogCSAqIFByZXZlbnQgdGhlIFBDSS1FIGJ1cyBmcm9tIGZyb20gaGFuZ2luZyBieSBkaXNhYmxpbmcgUENJLUUgbWFzdGVyCkBAIC00OTksMjkgKzYzMSwzMTEgQEAKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9BVVRPQywgYXV0b2MpOwogCX0gZWxzZSB7CiAJCWh3LT5tYWMubGlua19hdHRhY2hfdHlwZSA9Ci0JCQkJCSAoYXV0b2MgJiBJWEdCRV9BVVRPQ19MTVNfQVRUQUNIX1RZUEUpOworCQkgICAgICAgICAgICAgICAgICAgICAgICAgKGF1dG9jICYgSVhHQkVfQVVUT0NfTE1TX0FUVEFDSF9UWVBFKTsKIAkJaHctPm1hYy5saW5rX21vZGVfc2VsZWN0ID0gKGF1dG9jICYgSVhHQkVfQVVUT0NfTE1TX01BU0spOwogCQlody0+bWFjLmxpbmtfc2V0dGluZ3NfbG9hZGVkID0gdHJ1ZTsKIAl9CiAKIAkvKiBTdG9yZSB0aGUgcGVybWFuZW50IG1hYyBhZGRyZXNzICovCi0JaXhnYmVfZ2V0X21hY19hZGRyKGh3LCBody0+bWFjLnBlcm1fYWRkcik7CisJaHctPm1hYy5vcHMuZ2V0X21hY19hZGRyKGh3LCBody0+bWFjLnBlcm1fYWRkcik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKioKKyAqICBpeGdiZV9zZXRfdm1kcV84MjU5OCAtIEFzc29jaWF0ZSBhIFZNRHEgc2V0IGluZGV4IHdpdGggYSByeCBhZGRyZXNzCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdAorICogIEByYXI6IHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciBpbmRleCB0byBhc3NvY2lhdGUgd2l0aCBhIFZNRHEgaW5kZXgKKyAqICBAdm1kcTogVk1EcSBzZXQgaW5kZXgKKyAqKi8KK3MzMiBpeGdiZV9zZXRfdm1kcV84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmFyLCB1MzIgdm1kcSkKK3sKKwl1MzIgcmFyX2hpZ2g7CisKKwlyYXJfaGlnaCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SQUgocmFyKSk7CisJcmFyX2hpZ2ggJj0gfklYR0JFX1JBSF9WSU5EX01BU0s7CisJcmFyX2hpZ2ggfD0gKCh2bWRxIDw8IElYR0JFX1JBSF9WSU5EX1NISUZUKSAmIElYR0JFX1JBSF9WSU5EX01BU0spOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkFIKHJhciksIHJhcl9oaWdoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfY2xlYXJfdm1kcV84MjU5OCAtIERpc2Fzc29jaWF0ZSBhIFZNRHEgc2V0IGluZGV4IGZyb20gYW4gcnggYWRkcmVzcworICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3QKKyAqICBAcmFyOiByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIgaW5kZXggdG8gYXNzb2NpYXRlIHdpdGggYSBWTURxIGluZGV4CisgKiAgQHZtZHE6IFZNRHEgY2xlYXIgaW5kZXggKG5vdCB1c2VkIGluIDgyNTk4LCBidXQgZWxzZXdoZXJlKQorICoqLworc3RhdGljIHMzMiBpeGdiZV9jbGVhcl92bWRxXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByYXIsIHUzMiB2bWRxKQoreworCXUzMiByYXJfaGlnaDsKKwl1MzIgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllczsKKworCWlmIChyYXIgPCByYXJfZW50cmllcykgeworCQlyYXJfaGlnaCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SQUgocmFyKSk7CisJCWlmIChyYXJfaGlnaCAmIElYR0JFX1JBSF9WSU5EX01BU0spIHsKKwkJCXJhcl9oaWdoICY9IH5JWEdCRV9SQUhfVklORF9NQVNLOworCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUgocmFyKSwgcmFyX2hpZ2gpOworCQl9CisJfSBlbHNlIHsKKwkJaHdfZGJnKGh3LCAiUkFSIGluZGV4ICVkIGlzIG91dCBvZiByYW5nZS5cbiIsIHJhcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIGl4Z2JlX3NldF92ZnRhXzgyNTk4IC0gU2V0IFZMQU4gZmlsdGVyIHRhYmxlCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEB2bGFuOiBWTEFOIGlkIHRvIHdyaXRlIHRvIFZMQU4gZmlsdGVyCisgKiAgQHZpbmQ6IFZNRHEgb3V0cHV0IGluZGV4IHRoYXQgbWFwcyBxdWV1ZSB0byBWTEFOIGlkIGluIFZGVEEKKyAqICBAdmxhbl9vbjogYm9vbGVhbiBmbGFnIHRvIHR1cm4gb24vb2ZmIFZMQU4gaW4gVkZUQQorICoKKyAqICBUdXJuIG9uL29mZiBzcGVjaWZpZWQgVkxBTiBpbiB0aGUgVkxBTiBmaWx0ZXIgdGFibGUuCisgKiovCitzMzIgaXhnYmVfc2V0X3ZmdGFfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHZsYW4sIHUzMiB2aW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmxhbl9vbikKK3sKKwl1MzIgcmVnaW5kZXg7CisJdTMyIGJpdGluZGV4OworCXUzMiBiaXRzOworCXUzMiB2ZnRhYnl0ZTsKKworCWlmICh2bGFuID4gNDA5NSkKKwkJcmV0dXJuIElYR0JFX0VSUl9QQVJBTTsKKworCS8qIERldGVybWluZSAzMi1iaXQgd29yZCBwb3NpdGlvbiBpbiBhcnJheSAqLworCXJlZ2luZGV4ID0gKHZsYW4gPj4gNSkgJiAweDdGOyAgIC8qIHVwcGVyIHNldmVuIGJpdHMgKi8KKworCS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIChWTUQpIHF1ZXVlIGluZGV4ICovCisJdmZ0YWJ5dGUgPSAgKCh2bGFuID4+IDMpICYgMHgwMyk7IC8qIGJpdHMgKDQ6MykgaW5kaWNhdGluZyBieXRlIGFycmF5ICovCisJYml0aW5kZXggPSAodmxhbiAmIDB4NykgPDwgMjsgICAgLyogbG93ZXIgMyBiaXRzIGluZGljYXRlIG5pYmJsZSAqLworCisJLyogU2V0IHRoZSBuaWJibGUgZm9yIFZNRCBxdWV1ZSBpbmRleCAqLworCWJpdHMgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZUQVZJTkQodmZ0YWJ5dGUsIHJlZ2luZGV4KSk7CisJYml0cyAmPSAofigweDBGIDw8IGJpdGluZGV4KSk7CisJYml0cyB8PSAodmluZCA8PCBiaXRpbmRleCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRBVklORCh2ZnRhYnl0ZSwgcmVnaW5kZXgpLCBiaXRzKTsKKworCS8qIERldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGJpdCBmb3IgdGhpcyBWTEFOIGlkICovCisJYml0aW5kZXggPSB2bGFuICYgMHgxRjsgICAvKiBsb3dlciBmaXZlIGJpdHMgKi8KKworCWJpdHMgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZUQShyZWdpbmRleCkpOworCWlmICh2bGFuX29uKQorCQkvKiBUdXJuIG9uIHRoaXMgVkxBTiBpZCAqLworCQliaXRzIHw9ICgxIDw8IGJpdGluZGV4KTsKKwllbHNlCisJCS8qIFR1cm4gb2ZmIHRoaXMgVkxBTiBpZCAqLworCQliaXRzICY9IH4oMSA8PCBiaXRpbmRleCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRBKHJlZ2luZGV4KSwgYml0cyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfY2xlYXJfdmZ0YV84MjU5OCAtIENsZWFyIFZMQU4gZmlsdGVyIHRhYmxlCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICoKKyAqICBDbGVhcnMgdGhlIFZMQU4gZmlsZXIgdGFibGUsIGFuZCB0aGUgVk1EcSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlcgorICoqLworc3RhdGljIHMzMiBpeGdiZV9jbGVhcl92ZnRhXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJdTMyIG9mZnNldDsKKwl1MzIgdmxhbmJ5dGU7CisKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGh3LT5tYWMudmZ0X3NpemU7IG9mZnNldCsrKQorCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZGVEEob2Zmc2V0KSwgMCk7CisKKwlmb3IgKHZsYW5ieXRlID0gMDsgdmxhbmJ5dGUgPCA0OyB2bGFuYnl0ZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGh3LT5tYWMudmZ0X3NpemU7IG9mZnNldCsrKQorCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRBVklORCh2bGFuYnl0ZSwgb2Zmc2V0KSwKKwkJCSAgICAgICAgICAgICAgICAwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBpeGdiZV9ibGlua19sZWRfc3RhcnRfODI1OTggLSBCbGluayBMRUQgYmFzZWQgb24gaW5kZXguCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBpbmRleDogbGVkIG51bWJlciB0byBibGluaworICoqLworc3RhdGljIHMzMiBpeGdiZV9ibGlua19sZWRfc3RhcnRfODI1OTgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQoreworCWl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQgPSAwOworCWJvb2wgbGlua191cCA9IDA7CisJdTMyIGF1dG9jX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9BVVRPQyk7CisJdTMyIGxlZF9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTEVEQ1RMKTsKKworCS8qCisJICogTGluayBtdXN0IGJlIHVwIHRvIGF1dG8tYmxpbmsgdGhlIExFRHMgb24gdGhlIDgyNTk4RUIgTUFDOworCSAqIGZvcmNlIGl0IGlmIGxpbmsgaXMgZG93bi4KKwkgKi8KKwlody0+bWFjLm9wcy5jaGVja19saW5rKGh3LCAmc3BlZWQsICZsaW5rX3VwLCBmYWxzZSk7CisKKwlpZiAoIWxpbmtfdXApIHsKKwkJYXV0b2NfcmVnIHw9IElYR0JFX0FVVE9DX0ZMVTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9BVVRPQywgYXV0b2NfcmVnKTsKKwkJbXNsZWVwKDEwKTsKKwl9CisKKwlsZWRfcmVnICY9IH5JWEdCRV9MRURfTU9ERV9NQVNLKGluZGV4KTsKKwlsZWRfcmVnIHw9IElYR0JFX0xFRF9CTElOSyhpbmRleCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9MRURDVEwsIGxlZF9yZWcpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBpeGdiZV9ibGlua19sZWRfc3RvcF84MjU5OCAtIFN0b3AgYmxpbmtpbmcgTEVEIGJhc2VkIG9uIGluZGV4LgorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqICBAaW5kZXg6IGxlZCBudW1iZXIgdG8gc3RvcCBibGlua2luZworICoqLworc3RhdGljIHMzMiBpeGdiZV9ibGlua19sZWRfc3RvcF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgaW5kZXgpCit7CisJdTMyIGF1dG9jX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9BVVRPQyk7CisJdTMyIGxlZF9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTEVEQ1RMKTsKKworCWF1dG9jX3JlZyAmPSB+SVhHQkVfQVVUT0NfRkxVOworCWF1dG9jX3JlZyB8PSBJWEdCRV9BVVRPQ19BTl9SRVNUQVJUOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfQVVUT0MsIGF1dG9jX3JlZyk7CisKKwlsZWRfcmVnICY9IH5JWEdCRV9MRURfTU9ERV9NQVNLKGluZGV4KTsKKwlsZWRfcmVnICY9IH5JWEdCRV9MRURfQkxJTksoaW5kZXgpOworCWxlZF9yZWcgfD0gSVhHQkVfTEVEX0xJTktfQUNUSVZFIDw8IElYR0JFX0xFRF9NT0RFX1NISUZUKGluZGV4KTsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0xFRENUTCwgbGVkX3JlZyk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIGl4Z2JlX3JlYWRfYW5hbG9nX3JlZzhfODI1OTggLSBSZWFkcyA4IGJpdCBBdGxhcyBhbmFsb2cgcmVnaXN0ZXIKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQHJlZzogYW5hbG9nIHJlZ2lzdGVyIHRvIHJlYWQKKyAqICBAdmFsOiByZWFkIHZhbHVlCisgKgorICogIFBlcmZvcm1zIHJlYWQgb3BlcmF0aW9uIHRvIEF0bGFzIGFuYWxvZyByZWdpc3RlciBzcGVjaWZpZWQuCisgKiovCitzMzIgaXhnYmVfcmVhZF9hbmFsb2dfcmVnOF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnLCB1OCAqdmFsKQoreworCXUzMiAgYXRsYXNfY3RsOworCisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9BVExBU0NUTCwKKwkgICAgICAgICAgICAgICAgSVhHQkVfQVRMQVNDVExfV1JJVEVfQ01EIHwgKHJlZyA8PCA4KSk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheSgxMCk7CisJYXRsYXNfY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0FUTEFTQ1RMKTsKKwkqdmFsID0gKHU4KWF0bGFzX2N0bDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBpeGdiZV93cml0ZV9hbmFsb2dfcmVnOF84MjU5OCAtIFdyaXRlcyA4IGJpdCBBdGxhcyBhbmFsb2cgcmVnaXN0ZXIKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQHJlZzogYXRsYXMgcmVnaXN0ZXIgdG8gd3JpdGUKKyAqICBAdmFsOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqICBQZXJmb3JtcyB3cml0ZSBvcGVyYXRpb24gdG8gQXRsYXMgYW5hbG9nIHJlZ2lzdGVyIHNwZWNpZmllZC4KKyAqKi8KK3MzMiBpeGdiZV93cml0ZV9hbmFsb2dfcmVnOF84MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnLCB1OCB2YWwpCit7CisJdTMyICBhdGxhc19jdGw7CisKKwlhdGxhc19jdGwgPSAocmVnIDw8IDgpIHwgdmFsOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfQVRMQVNDVEwsIGF0bGFzX2N0bCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOworCXVkZWxheSgxMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfZ2V0X3N1cHBvcnRlZF9waHlzaWNhbF9sYXllcl84MjU5OCAtIFJldHVybnMgcGh5c2ljYWwgbGF5ZXIgdHlwZQorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqCisgKiAgRGV0ZXJtaW5lcyBwaHlzaWNhbCBsYXllciBjYXBhYmlsaXRpZXMgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqKi8KK3MzMiBpeGdiZV9nZXRfc3VwcG9ydGVkX3BoeXNpY2FsX2xheWVyXzgyNTk4KHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJczMyIHBoeXNpY2FsX2xheWVyID0gSVhHQkVfUEhZU0lDQUxfTEFZRVJfVU5LTk9XTjsKKworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk4RUJfQ1g0OgorCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk4X0NYNF9EVUFMX1BPUlQ6CisJCXBoeXNpY2FsX2xheWVyID0gSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTBHQkFTRV9DWDQ7CisJCWJyZWFrOworCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk4QUZfRFVBTF9QT1JUOgorCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk4QUZfU0lOR0xFX1BPUlQ6CisJCXBoeXNpY2FsX2xheWVyID0gSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTBHQkFTRV9TUjsKKwkJYnJlYWs7CisJY2FzZSBJWEdCRV9ERVZfSURfODI1OThFQl9YRl9MUjoKKwkJcGh5c2ljYWxfbGF5ZXIgPSBJWEdCRV9QSFlTSUNBTF9MQVlFUl8xMEdCQVNFX0xSOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXBoeXNpY2FsX2xheWVyID0gSVhHQkVfUEhZU0lDQUxfTEFZRVJfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBoeXNpY2FsX2xheWVyOworfQorCiBzdGF0aWMgc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIG1hY19vcHNfODI1OTggPSB7Ci0JLnJlc2V0CQkJPSAmaXhnYmVfcmVzZXRfaHdfODI1OTgsCisJLmluaXRfaHcJCT0gJml4Z2JlX2luaXRfaHdfZ2VuZXJpYywKKwkucmVzZXRfaHcJCT0gJml4Z2JlX3Jlc2V0X2h3XzgyNTk4LAorCS5zdGFydF9odwkJPSAmaXhnYmVfc3RhcnRfaHdfZ2VuZXJpYywKKwkuY2xlYXJfaHdfY250cnMJCT0gJml4Z2JlX2NsZWFyX2h3X2NudHJzX2dlbmVyaWMsCiAJLmdldF9tZWRpYV90eXBlCQk9ICZpeGdiZV9nZXRfbWVkaWFfdHlwZV84MjU5OCwKKwkuZ2V0X3N1cHBvcnRlZF9waHlzaWNhbF9sYXllciA9ICZpeGdiZV9nZXRfc3VwcG9ydGVkX3BoeXNpY2FsX2xheWVyXzgyNTk4LAorCS5nZXRfbWFjX2FkZHIJCT0gJml4Z2JlX2dldF9tYWNfYWRkcl9nZW5lcmljLAorCS5zdG9wX2FkYXB0ZXIJCT0gJml4Z2JlX3N0b3BfYWRhcHRlcl9nZW5lcmljLAorCS5yZWFkX2FuYWxvZ19yZWc4CT0gJml4Z2JlX3JlYWRfYW5hbG9nX3JlZzhfODI1OTgsCisJLndyaXRlX2FuYWxvZ19yZWc4CT0gJml4Z2JlX3dyaXRlX2FuYWxvZ19yZWc4XzgyNTk4LAogCS5zZXR1cF9saW5rCQk9ICZpeGdiZV9zZXR1cF9tYWNfbGlua184MjU5OCwKLQkuY2hlY2tfbGluawkJPSAmaXhnYmVfY2hlY2tfbWFjX2xpbmtfODI1OTgsCiAJLnNldHVwX2xpbmtfc3BlZWQJPSAmaXhnYmVfc2V0dXBfbWFjX2xpbmtfc3BlZWRfODI1OTgsCi0JLmdldF9saW5rX3NldHRpbmdzCT0gJml4Z2JlX2dldF9saW5rX3NldHRpbmdzXzgyNTk4LAorCS5jaGVja19saW5rCQk9ICZpeGdiZV9jaGVja19tYWNfbGlua184MjU5OCwKKwkuZ2V0X2xpbmtfY2FwYWJpbGl0aWVzCT0gJml4Z2JlX2dldF9saW5rX2NhcGFiaWxpdGllc184MjU5OCwKKwkubGVkX29uCQkJPSAmaXhnYmVfbGVkX29uX2dlbmVyaWMsCisJLmxlZF9vZmYJCT0gJml4Z2JlX2xlZF9vZmZfZ2VuZXJpYywKKwkuYmxpbmtfbGVkX3N0YXJ0CT0gJml4Z2JlX2JsaW5rX2xlZF9zdGFydF84MjU5OCwKKwkuYmxpbmtfbGVkX3N0b3AJCT0gJml4Z2JlX2JsaW5rX2xlZF9zdG9wXzgyNTk4LAorCS5zZXRfcmFyCQk9ICZpeGdiZV9zZXRfcmFyX2dlbmVyaWMsCisJLmNsZWFyX3JhcgkJPSAmaXhnYmVfY2xlYXJfcmFyX2dlbmVyaWMsCisJLnNldF92bWRxCQk9ICZpeGdiZV9zZXRfdm1kcV84MjU5OCwKKwkuY2xlYXJfdm1kcQkJPSAmaXhnYmVfY2xlYXJfdm1kcV84MjU5OCwKKwkuaW5pdF9yeF9hZGRycwkJPSAmaXhnYmVfaW5pdF9yeF9hZGRyc19nZW5lcmljLAorCS51cGRhdGVfdWNfYWRkcl9saXN0CT0gJml4Z2JlX3VwZGF0ZV91Y19hZGRyX2xpc3RfZ2VuZXJpYywKKwkudXBkYXRlX21jX2FkZHJfbGlzdAk9ICZpeGdiZV91cGRhdGVfbWNfYWRkcl9saXN0X2dlbmVyaWMsCisJLmVuYWJsZV9tYwkJPSAmaXhnYmVfZW5hYmxlX21jX2dlbmVyaWMsCisJLmRpc2FibGVfbWMJCT0gJml4Z2JlX2Rpc2FibGVfbWNfZ2VuZXJpYywKKwkuY2xlYXJfdmZ0YQkJPSAmaXhnYmVfY2xlYXJfdmZ0YV84MjU5OCwKKwkuc2V0X3ZmdGEJCT0gJml4Z2JlX3NldF92ZnRhXzgyNTk4LAorCS5zZXR1cF9mYwkJPSAmaXhnYmVfc2V0dXBfZmNfODI1OTgsCit9OworCitzdGF0aWMgc3RydWN0IGl4Z2JlX2VlcHJvbV9vcGVyYXRpb25zIGVlcHJvbV9vcHNfODI1OTggPSB7CisJLmluaXRfcGFyYW1zCQk9ICZpeGdiZV9pbml0X2VlcHJvbV9wYXJhbXNfZ2VuZXJpYywKKwkucmVhZAkJCT0gJml4Z2JlX3JlYWRfZWVwcm9tX2dlbmVyaWMsCisJLnZhbGlkYXRlX2NoZWNrc3VtCT0gJml4Z2JlX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljLAorCS51cGRhdGVfY2hlY2tzdW0JPSAmaXhnYmVfdXBkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljLAorfTsKKworc3RhdGljIHN0cnVjdCBpeGdiZV9waHlfb3BlcmF0aW9ucyBwaHlfb3BzXzgyNTk4ID0geworCS5pZGVudGlmeQkJPSAmaXhnYmVfaWRlbnRpZnlfcGh5X2dlbmVyaWMsCisJLyogLmlkZW50aWZ5X3NmcAk9ICZpeGdiZV9pZGVudGlmeV9zZnBfbW9kdWxlX2dlbmVyaWMsICovCisJLnJlc2V0CQkJPSAmaXhnYmVfcmVzZXRfcGh5X2dlbmVyaWMsCisJLnJlYWRfcmVnCQk9ICZpeGdiZV9yZWFkX3BoeV9yZWdfZ2VuZXJpYywKKwkud3JpdGVfcmVnCQk9ICZpeGdiZV93cml0ZV9waHlfcmVnX2dlbmVyaWMsCisJLnNldHVwX2xpbmsJCT0gJml4Z2JlX3NldHVwX3BoeV9saW5rX2dlbmVyaWMsCisJLnNldHVwX2xpbmtfc3BlZWQJPSAmaXhnYmVfc2V0dXBfcGh5X2xpbmtfc3BlZWRfZ2VuZXJpYywKIH07CiAKIHN0cnVjdCBpeGdiZV9pbmZvIGl4Z2JlXzgyNTk4X2luZm8gPSB7CiAJLm1hYwkJCT0gaXhnYmVfbWFjXzgyNTk4RUIsCiAJLmdldF9pbnZhcmlhbnRzCQk9ICZpeGdiZV9nZXRfaW52YXJpYW50c184MjU5OCwKIAkubWFjX29wcwkJPSAmbWFjX29wc184MjU5OCwKKwkuZWVwcm9tX29wcwkJPSAmZWVwcm9tX29wc184MjU5OCwKKwkucGh5X29wcwkJPSAmcGh5X29wc184MjU5OCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggN2ZkNmFlYi4uZjY3YzY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMCw3ICsyMCw2IEBACiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAKICAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CiAgIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgogICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CiAKQEAgLTMzLDIwICszMiwyOCBAQAogI2luY2x1ZGUgIml4Z2JlX2NvbW1vbi5oIgogI2luY2x1ZGUgIml4Z2JlX3BoeS5oIgogCi1zdGF0aWMgczMyIGl4Z2JlX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotCiBzdGF0aWMgczMyIGl4Z2JlX3BvbGxfZWVwcm9tX2VlcmRfZG9uZShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKK3N0YXRpYyBzMzIgaXhnYmVfYWNxdWlyZV9lZXByb20oc3RydWN0IGl4Z2JlX2h3ICpodyk7CiBzdGF0aWMgczMyIGl4Z2JlX2dldF9lZXByb21fc2VtYXBob3JlKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogc3RhdGljIHZvaWQgaXhnYmVfcmVsZWFzZV9lZXByb21fc2VtYXBob3JlKHN0cnVjdCBpeGdiZV9odyAqaHcpOworc3RhdGljIHMzMiBpeGdiZV9yZWFkeV9lZXByb20oc3RydWN0IGl4Z2JlX2h3ICpodyk7CitzdGF0aWMgdm9pZCBpeGdiZV9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGl4Z2JlX3NoaWZ0X291dF9lZXByb21fYml0cyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgY291bnQpOworc3RhdGljIHUxNiBpeGdiZV9zaGlmdF9pbl9lZXByb21fYml0cyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgY291bnQpOworc3RhdGljIHZvaWQgaXhnYmVfcmFpc2VfZWVwcm9tX2NsayhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKmVlYyk7CitzdGF0aWMgdm9pZCBpeGdiZV9sb3dlcl9lZXByb21fY2xrKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqZWVjKTsKK3N0YXRpYyB2b2lkIGl4Z2JlX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogc3RhdGljIHUxNiBpeGdiZV9jYWxjX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIAotc3RhdGljIHMzMiBpeGdiZV9jbGVhcl92ZnRhKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotc3RhdGljIHMzMiBpeGdiZV9pbml0X3J4X2FkZHJzKHN0cnVjdCBpeGdiZV9odyAqaHcpOworc3RhdGljIHZvaWQgaXhnYmVfZW5hYmxlX3JhcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgaW5kZXgpOworc3RhdGljIHZvaWQgaXhnYmVfZGlzYWJsZV9yYXIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KTsKIHN0YXRpYyBzMzIgaXhnYmVfbXRhX3ZlY3RvcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWNfYWRkcik7CiBzdGF0aWMgdm9pZCBpeGdiZV9hZGRfbWNfYWRkcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWNfYWRkcik7CitzdGF0aWMgdm9pZCBpeGdiZV9hZGRfdWNfYWRkcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqYWRkciwgdTMyIHZtZHEpOwogCiAvKioKLSAqICBpeGdiZV9zdGFydF9odyAtIFByZXBhcmUgaGFyZHdhcmUgZm9yIFRYL1JYCisgKiAgaXhnYmVfc3RhcnRfaHdfZ2VuZXJpYyAtIFByZXBhcmUgaGFyZHdhcmUgZm9yIFR4L1J4CiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKICAqICBTdGFydHMgdGhlIGhhcmR3YXJlIGJ5IGZpbGxpbmcgdGhlIGJ1cyBpbmZvIHN0cnVjdHVyZSBhbmQgbWVkaWEgdHlwZSwgY2xlYXJzCkBAIC01NCw3ICs2MSw3IEBACiAgKiAgdGFibGUsIFZMQU4gZmlsdGVyIHRhYmxlLCBjYWxscyByb3V0aW5lIHRvIHNldCB1cCBsaW5rIGFuZCBmbG93IGNvbnRyb2wKICAqICBzZXR0aW5ncywgYW5kIGxlYXZlcyB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZAogICoqLwotczMyIGl4Z2JlX3N0YXJ0X2h3KHN0cnVjdCBpeGdiZV9odyAqaHcpCitzMzIgaXhnYmVfc3RhcnRfaHdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXUzMiBjdHJsX2V4dDsKIApAQCAtNjIsMjIgKzY5LDIyIEBACiAJaHctPnBoeS5tZWRpYV90eXBlID0gaHctPm1hYy5vcHMuZ2V0X21lZGlhX3R5cGUoaHcpOwogCiAJLyogSWRlbnRpZnkgdGhlIFBIWSAqLwotCWl4Z2JlX2lkZW50aWZ5X3BoeShodyk7CisJaHctPnBoeS5vcHMuaWRlbnRpZnkoaHcpOwogCiAJLyoKIAkgKiBTdG9yZSBNQUMgYWRkcmVzcyBmcm9tIFJBUjAsIGNsZWFyIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMsIGFuZAogCSAqIGNsZWFyIHRoZSBtdWx0aWNhc3QgdGFibGUKIAkgKi8KLQlpeGdiZV9pbml0X3J4X2FkZHJzKGh3KTsKKwlody0+bWFjLm9wcy5pbml0X3J4X2FkZHJzKGh3KTsKIAogCS8qIENsZWFyIHRoZSBWTEFOIGZpbHRlciB0YWJsZSAqLwotCWl4Z2JlX2NsZWFyX3ZmdGEoaHcpOworCWh3LT5tYWMub3BzLmNsZWFyX3ZmdGEoaHcpOwogCiAJLyogU2V0IHVwIGxpbmsgKi8KIAlody0+bWFjLm9wcy5zZXR1cF9saW5rKGh3KTsKIAogCS8qIENsZWFyIHN0YXRpc3RpY3MgcmVnaXN0ZXJzICovCi0JaXhnYmVfY2xlYXJfaHdfY250cnMoaHcpOworCWh3LT5tYWMub3BzLmNsZWFyX2h3X2NudHJzKGh3KTsKIAogCS8qIFNldCBObyBTbm9vcCBEaXNhYmxlICovCiAJY3RybF9leHQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfQ1RSTF9FWFQpOwpAQCAtOTIsMzQgKzk5LDM0IEBACiB9CiAKIC8qKgotICogIGl4Z2JlX2luaXRfaHcgLSBHZW5lcmljIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uCisgKiAgaXhnYmVfaW5pdF9od19nZW5lcmljIC0gR2VuZXJpYyBoYXJkd2FyZSBpbml0aWFsaXphdGlvbgogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCi0gKiAgSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgYnkgcmVzZXRpbmcgdGhlIGhhcmR3YXJlLCBmaWxsaW5nIHRoZSBidXMgaW5mbworICogIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlIGJ5IHJlc2V0dGluZyB0aGUgaGFyZHdhcmUsIGZpbGxpbmcgdGhlIGJ1cyBpbmZvCiAgKiAgc3RydWN0dXJlIGFuZCBtZWRpYSB0eXBlLCBjbGVhcnMgYWxsIG9uIGNoaXAgY291bnRlcnMsIGluaXRpYWxpemVzIHJlY2VpdmUKICAqICBhZGRyZXNzIHJlZ2lzdGVycywgbXVsdGljYXN0IHRhYmxlLCBWTEFOIGZpbHRlciB0YWJsZSwgY2FsbHMgcm91dGluZSB0byBzZXQKICAqICB1cCBsaW5rIGFuZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MsIGFuZCBsZWF2ZXMgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMKICAqICBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZAogICoqLwotczMyIGl4Z2JlX2luaXRfaHcoc3RydWN0IGl4Z2JlX2h3ICpodykKK3MzMiBpeGdiZV9pbml0X2h3X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodykKIHsKIAkvKiBSZXNldCB0aGUgaGFyZHdhcmUgKi8KLQlody0+bWFjLm9wcy5yZXNldChodyk7CisJaHctPm1hYy5vcHMucmVzZXRfaHcoaHcpOwogCiAJLyogU3RhcnQgdGhlIEhXICovCi0JaXhnYmVfc3RhcnRfaHcoaHcpOworCWh3LT5tYWMub3BzLnN0YXJ0X2h3KGh3KTsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqICBpeGdiZV9jbGVhcl9od19jbnRycyAtIEdlbmVyaWMgY2xlYXIgaGFyZHdhcmUgY291bnRlcnMKKyAqICBpeGdiZV9jbGVhcl9od19jbnRyc19nZW5lcmljIC0gR2VuZXJpYyBjbGVhciBoYXJkd2FyZSBjb3VudGVycwogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCiAgKiAgQ2xlYXJzIGFsbCBoYXJkd2FyZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGJ5IHJlYWRpbmcgdGhlbSBmcm9tIHRoZSBoYXJkd2FyZQogICogIFN0YXRpc3RpY3MgY291bnRlcnMgYXJlIGNsZWFyIG9uIHJlYWQuCiAgKiovCi1zdGF0aWMgczMyIGl4Z2JlX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBpeGdiZV9odyAqaHcpCitzMzIgaXhnYmVfY2xlYXJfaHdfY250cnNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXUxNiBpID0gMDsKIApAQCAtMTkxLDcgKzE5OCwzNiBAQAogfQogCiAvKioKLSAqICBpeGdiZV9nZXRfbWFjX2FkZHIgLSBHZW5lcmljIGdldCBNQUMgYWRkcmVzcworICogIGl4Z2JlX3JlYWRfcGJhX251bV9nZW5lcmljIC0gUmVhZHMgcGFydCBudW1iZXIgZnJvbSBFRVBST00KKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQHBiYV9udW06IHN0b3JlcyB0aGUgcGFydCBudW1iZXIgZnJvbSB0aGUgRUVQUk9NCisgKgorICogIFJlYWRzIHRoZSBwYXJ0IG51bWJlciBmcm9tIHRoZSBFRVBST00uCisgKiovCitzMzIgaXhnYmVfcmVhZF9wYmFfbnVtX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICpwYmFfbnVtKQoreworCXMzMiByZXRfdmFsOworCXUxNiBkYXRhOworCisJcmV0X3ZhbCA9IGh3LT5lZXByb20ub3BzLnJlYWQoaHcsIElYR0JFX1BCQU5VTTBfUFRSLCAmZGF0YSk7CisJaWYgKHJldF92YWwpIHsKKwkJaHdfZGJnKGh3LCAiTlZNIFJlYWQgRXJyb3JcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJKnBiYV9udW0gPSAodTMyKShkYXRhIDw8IDE2KTsKKworCXJldF92YWwgPSBody0+ZWVwcm9tLm9wcy5yZWFkKGh3LCBJWEdCRV9QQkFOVU0xX1BUUiwgJmRhdGEpOworCWlmIChyZXRfdmFsKSB7CisJCWh3X2RiZyhodywgIk5WTSBSZWFkIEVycm9yXG4iKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCSpwYmFfbnVtIHw9IGRhdGE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfZ2V0X21hY19hZGRyX2dlbmVyaWMgLSBHZW5lcmljIGdldCBNQUMgYWRkcmVzcwogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAbWFjX2FkZHI6IEFkYXB0ZXIgTUFDIGFkZHJlc3MKICAqCkBAIC0xOTksNyArMjM1LDcgQEAKICAqICBBIHJlc2V0IG9mIHRoZSBhZGFwdGVyIG11c3QgYmUgcGVyZm9ybWVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgogICogIGluIG9yZGVyIGZvciB0aGUgTUFDIGFkZHJlc3MgdG8gaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIHRoZSBFRVBST00gaW50byBSQVIwCiAgKiovCi1zMzIgaXhnYmVfZ2V0X21hY19hZGRyKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptYWNfYWRkcikKK3MzMiBpeGdiZV9nZXRfbWFjX2FkZHJfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWFjX2FkZHIpCiB7CiAJdTMyIHJhcl9oaWdoOwogCXUzMiByYXJfbG93OwpAQCAtMjE3LDMwICsyNTMsOCBAQAogCXJldHVybiAwOwogfQogCi1zMzIgaXhnYmVfcmVhZF9wYXJ0X251bShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnBhcnRfbnVtKQotewotCXMzMiByZXRfdmFsOwotCXUxNiBkYXRhOwotCi0JcmV0X3ZhbCA9IGl4Z2JlX3JlYWRfZWVwcm9tKGh3LCBJWEdCRV9QQkFOVU0wX1BUUiwgJmRhdGEpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWh3X2RiZyhodywgIk5WTSBSZWFkIEVycm9yXG4iKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCSpwYXJ0X251bSA9ICh1MzIpKGRhdGEgPDwgMTYpOwotCi0JcmV0X3ZhbCA9IGl4Z2JlX3JlYWRfZWVwcm9tKGh3LCBJWEdCRV9QQkFOVU0xX1BUUiwgJmRhdGEpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWh3X2RiZyhodywgIk5WTSBSZWFkIEVycm9yXG4iKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCSpwYXJ0X251bSB8PSBkYXRhOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qKgotICogIGl4Z2JlX3N0b3BfYWRhcHRlciAtIEdlbmVyaWMgc3RvcCBUWC9SWCB1bml0cworICogIGl4Z2JlX3N0b3BfYWRhcHRlcl9nZW5lcmljIC0gR2VuZXJpYyBzdG9wIFR4L1J4IHVuaXRzCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKICAqICBTZXRzIHRoZSBhZGFwdGVyX3N0b3BwZWQgZmxhZyB3aXRoaW4gaXhnYmVfaHcgc3RydWN0LiBDbGVhcnMgaW50ZXJydXB0cywKQEAgLTI0OCw3ICsyNjIsNyBAQAogICogIHRoZSBzaGFyZWQgY29kZSBhbmQgZHJpdmVycyB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMgaW4gYSBzdG9wcGVkCiAgKiAgc3RhdGUgYW5kIHNob3VsZCBub3QgdG91Y2ggdGhlIGhhcmR3YXJlLgogICoqLwotczMyIGl4Z2JlX3N0b3BfYWRhcHRlcihzdHJ1Y3QgaXhnYmVfaHcgKmh3KQorczMyIGl4Z2JlX3N0b3BfYWRhcHRlcl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7CiAJdTMyIG51bWJlcl9vZl9xdWV1ZXM7CiAJdTMyIHJlZ192YWw7CkBAIC0yNjQsNiArMjc4LDcgQEAKIAlyZWdfdmFsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYQ1RSTCk7CiAJcmVnX3ZhbCAmPSB+KElYR0JFX1JYQ1RSTF9SWEVOKTsKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYQ1RSTCwgcmVnX3ZhbCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCW1zbGVlcCgyKTsKIAogCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgZnJvbSBpbnRlcnJ1cHRzIGJlaW5nIGdlbmVyYXRlZCAqLwpAQCAtMjczLDcgKzI4OCw3IEBACiAJSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VJQ1IpOwogCiAJLyogRGlzYWJsZSB0aGUgdHJhbnNtaXQgdW5pdC4gIEVhY2ggcXVldWUgbXVzdCBiZSBkaXNhYmxlZC4gKi8KLQludW1iZXJfb2ZfcXVldWVzID0gaHctPm1hYy5udW1fdHhfcXVldWVzOworCW51bWJlcl9vZl9xdWV1ZXMgPSBody0+bWFjLm1heF90eF9xdWV1ZXM7CiAJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9xdWV1ZXM7IGkrKykgewogCQlyZWdfdmFsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1RYRENUTChpKSk7CiAJCWlmIChyZWdfdmFsICYgSVhHQkVfVFhEQ1RMX0VOQUJMRSkgewpAQCAtMjgyLDE1ICsyOTcsMjIgQEAKIAkJfQogCX0KIAorCS8qCisJICogUHJldmVudCB0aGUgUENJLUUgYnVzIGZyb20gZnJvbSBoYW5naW5nIGJ5IGRpc2FibGluZyBQQ0ktRSBtYXN0ZXIKKwkgKiBhY2Nlc3MgYW5kIHZlcmlmeSBubyBwZW5kaW5nIHJlcXVlc3RzCisJICovCisJaWYgKGl4Z2JlX2Rpc2FibGVfcGNpZV9tYXN0ZXIoaHcpICE9IDApCisJCWh3X2RiZyhodywgIlBDSS1FIE1hc3RlciBkaXNhYmxlIHBvbGxpbmcgaGFzIGZhaWxlZC5cbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIGl4Z2JlX2xlZF9vbiAtIFR1cm5zIG9uIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVEcy4KKyAqICBpeGdiZV9sZWRfb25fZ2VuZXJpYyAtIFR1cm5zIG9uIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVEcy4KICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQGluZGV4OiBsZWQgbnVtYmVyIHRvIHR1cm4gb24KICAqKi8KLXMzMiBpeGdiZV9sZWRfb24oc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQorczMyIGl4Z2JlX2xlZF9vbl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCkKIHsKIAl1MzIgbGVkX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9MRURDVEwpOwogCkBAIC0zMDQsMTEgKzMyNiwxMSBAQAogfQogCiAvKioKLSAqICBpeGdiZV9sZWRfb2ZmIC0gVHVybnMgb2ZmIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVEcy4KKyAqICBpeGdiZV9sZWRfb2ZmX2dlbmVyaWMgLSBUdXJucyBvZmYgdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRURzLgogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAaW5kZXg6IGxlZCBudW1iZXIgdG8gdHVybiBvZmYKICAqKi8KLXMzMiBpeGdiZV9sZWRfb2ZmKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCkKK3MzMiBpeGdiZV9sZWRfb2ZmX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQogewogCXUzMiBsZWRfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0xFRENUTCk7CiAKQEAgLTMyMSwxNSArMzQzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyoqCi0gKiAgaXhnYmVfaW5pdF9lZXByb20gLSBJbml0aWFsaXplIEVFUFJPTSBwYXJhbXMKKyAqICBpeGdiZV9pbml0X2VlcHJvbV9wYXJhbXNfZ2VuZXJpYyAtIEluaXRpYWxpemUgRUVQUk9NIHBhcmFtcwogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCiAgKiAgSW5pdGlhbGl6ZXMgdGhlIEVFUFJPTSBwYXJhbWV0ZXJzIGl4Z2JlX2VlcHJvbV9pbmZvIHdpdGhpbiB0aGUKICAqICBpeGdiZV9odyBzdHJ1Y3QgaW4gb3JkZXIgdG8gc2V0IHVwIEVFUFJPTSBhY2Nlc3MuCiAgKiovCi1zMzIgaXhnYmVfaW5pdF9lZXByb20oc3RydWN0IGl4Z2JlX2h3ICpodykKK3MzMiBpeGdiZV9pbml0X2VlcHJvbV9wYXJhbXNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXN0cnVjdCBpeGdiZV9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CiAJdTMyIGVlYzsKQEAgLTMzNyw2ICszNTgsOSBAQAogCiAJaWYgKGVlcHJvbS0+dHlwZSA9PSBpeGdiZV9lZXByb21fdW5pbml0aWFsaXplZCkgewogCQllZXByb20tPnR5cGUgPSBpeGdiZV9lZXByb21fbm9uZTsKKwkJLyogU2V0IGRlZmF1bHQgc2VtYXBob3JlIGRlbGF5IHRvIDEwbXMgd2hpY2ggaXMgYSB3ZWxsCisJCSAqIHRlc3RlZCB2YWx1ZSAqLworCQllZXByb20tPnNlbWFwaG9yZV9kZWxheSA9IDEwOwogCiAJCS8qCiAJCSAqIENoZWNrIGZvciBFRVBST00gcHJlc2VudCBmaXJzdC4KQEAgLTM2OSwxOCArMzkzLDg1IEBACiB9CiAKIC8qKgotICogIGl4Z2JlX3JlYWRfZWVwcm9tIC0gUmVhZCBFRVBST00gd29yZCB1c2luZyBFRVJECisgKiAgaXhnYmVfcmVhZF9lZXByb21fYml0X2JhbmdfZ2VuZXJpYyAtIFJlYWQgRUVQUk9NIHdvcmQgdXNpbmcgYml0LWJhbmcKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQG9mZnNldDogb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHJlYWQKKyAqICBAZGF0YTogcmVhZCAxNiBiaXQgdmFsdWUgZnJvbSBFRVBST00KKyAqCisgKiAgUmVhZHMgMTYgYml0IHZhbHVlIGZyb20gRUVQUk9NIHRocm91Z2ggYml0LWJhbmcgbWV0aG9kCisgKiovCitzMzIgaXhnYmVfcmVhZF9lZXByb21fYml0X2JhbmdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpkYXRhKQoreworCXMzMiBzdGF0dXM7CisJdTE2IHdvcmRfaW47CisJdTggcmVhZF9vcGNvZGUgPSBJWEdCRV9FRVBST01fUkVBRF9PUENPREVfU1BJOworCisJaHctPmVlcHJvbS5vcHMuaW5pdF9wYXJhbXMoaHcpOworCisJaWYgKG9mZnNldCA+PSBody0+ZWVwcm9tLndvcmRfc2l6ZSkgeworCQlzdGF0dXMgPSBJWEdCRV9FUlJfRUVQUk9NOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisJc3RhdHVzID0gaXhnYmVfYWNxdWlyZV9lZXByb20oaHcpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmIChpeGdiZV9yZWFkeV9lZXByb20oaHcpICE9IDApIHsKKwkJCWl4Z2JlX3JlbGVhc2VfZWVwcm9tKGh3KTsKKwkJCXN0YXR1cyA9IElYR0JFX0VSUl9FRVBST007CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJaXhnYmVfc3RhbmRieV9lZXByb20oaHcpOworCisJCS8qCisJCSAqIFNvbWUgU1BJIGVlcHJvbXMgdXNlIHRoZSA4dGggYWRkcmVzcyBiaXQgZW1iZWRkZWQgaW4gdGhlCisJCSAqIG9wY29kZQorCQkgKi8KKwkJaWYgKChody0+ZWVwcm9tLmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisJCQlyZWFkX29wY29kZSB8PSBJWEdCRV9FRVBST01fQThfT1BDT0RFX1NQSTsKKworCQkvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICovCisJCWl4Z2JlX3NoaWZ0X291dF9lZXByb21fYml0cyhodywgcmVhZF9vcGNvZGUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9FRVBST01fT1BDT0RFX0JJVFMpOworCQlpeGdiZV9zaGlmdF9vdXRfZWVwcm9tX2JpdHMoaHcsICh1MTYpKG9mZnNldCoyKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5lZXByb20uYWRkcmVzc19iaXRzKTsKKworCQkvKiBSZWFkIHRoZSBkYXRhLiAqLworCQl3b3JkX2luID0gaXhnYmVfc2hpZnRfaW5fZWVwcm9tX2JpdHMoaHcsIDE2KTsKKwkJKmRhdGEgPSAod29yZF9pbiA+PiA4KSB8ICh3b3JkX2luIDw8IDgpOworCisJCS8qIEVuZCB0aGlzIHJlYWQgb3BlcmF0aW9uICovCisJCWl4Z2JlX3JlbGVhc2VfZWVwcm9tKGh3KTsKKwl9CisKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqICBpeGdiZV9yZWFkX2VlcHJvbV9nZW5lcmljIC0gUmVhZCBFRVBST00gd29yZCB1c2luZyBFRVJECiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IG9mZnNldCBvZiAgd29yZCBpbiB0aGUgRUVQUk9NIHRvIHJlYWQKICAqICBAZGF0YTogd29yZCByZWFkIGZyb20gdGhlIEVFUFJPTQogICoKICAqICBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgRUVSRCByZWdpc3Rlci4KICAqKi8KLXMzMiBpeGdiZV9yZWFkX2VlcHJvbShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgKmRhdGEpCitzMzIgaXhnYmVfcmVhZF9lZXByb21fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgb2Zmc2V0LCB1MTYgKmRhdGEpCiB7CiAJdTMyIGVlcmQ7CiAJczMyIHN0YXR1czsKIAorCWh3LT5lZXByb20ub3BzLmluaXRfcGFyYW1zKGh3KTsKKworCWlmIChvZmZzZXQgPj0gaHctPmVlcHJvbS53b3JkX3NpemUpIHsKKwkJc3RhdHVzID0gSVhHQkVfRVJSX0VFUFJPTTsKKwkJZ290byBvdXQ7CisJfQorCiAJZWVyZCA9IChvZmZzZXQgPDwgSVhHQkVfRUVQUk9NX1JFQURfQUREUl9TSElGVCkgKwogCSAgICAgICBJWEdCRV9FRVBST01fUkVBRF9SRUdfU1RBUlQ7CiAKQEAgLTM4OSwxMCArNDgwLDExIEBACiAKIAlpZiAoc3RhdHVzID09IDApCiAJCSpkYXRhID0gKElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRVJEKSA+PgotCQkJSVhHQkVfRUVQUk9NX1JFQURfUkVHX0RBVEEpOworCQkgICAgICAgICBJWEdCRV9FRVBST01fUkVBRF9SRUdfREFUQSk7CiAJZWxzZQogCQlod19kYmcoaHcsICJFZXByb20gcmVhZCB0aW1lZCBvdXRcbiIpOwogCitvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDIwLDYgKzUxMiw1OCBAQAogfQogCiAvKioKKyAqICBpeGdiZV9hY3F1aXJlX2VlcHJvbSAtIEFjcXVpcmUgRUVQUk9NIHVzaW5nIGJpdC1iYW5nCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICoKKyAqICBQcmVwYXJlcyBFRVBST00gZm9yIGFjY2VzcyB1c2luZyBiaXQtYmFuZyBtZXRob2QuIFRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiAgYmUgY2FsbGVkIGJlZm9yZSBpc3N1aW5nIGEgY29tbWFuZCB0byB0aGUgRUVQUk9NLgorICoqLworc3RhdGljIHMzMiBpeGdiZV9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgaXhnYmVfaHcgKmh3KQoreworCXMzMiBzdGF0dXMgPSAwOworCXUzMiBlZWM7CisJdTMyIGk7CisKKwlpZiAoaXhnYmVfYWNxdWlyZV9zd2Z3X3N5bmMoaHcsIElYR0JFX0dTU1JfRUVQX1NNKSAhPSAwKQorCQlzdGF0dXMgPSBJWEdCRV9FUlJfU1dGV19TWU5DOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJCS8qIFJlcXVlc3QgRUVQUk9NIEFjY2VzcyAqLworCQllZWMgfD0gSVhHQkVfRUVDX1JFUTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FRUMsIGVlYyk7CisKKwkJZm9yIChpID0gMDsgaSA8IElYR0JFX0VFUFJPTV9HUkFOVF9BVFRFTVBUUzsgaSsrKSB7CisJCQllZWMgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRUVDKTsKKwkJCWlmIChlZWMgJiBJWEdCRV9FRUNfR05UKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDUpOworCQl9CisKKwkJLyogUmVsZWFzZSBpZiBncmFudCBub3QgYWNxdWlyZWQgKi8KKwkJaWYgKCEoZWVjICYgSVhHQkVfRUVDX0dOVCkpIHsKKwkJCWVlYyAmPSB+SVhHQkVfRUVDX1JFUTsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCQkJaHdfZGJnKGh3LCAiQ291bGQgbm90IGFjcXVpcmUgRUVQUk9NIGdyYW50XG4iKTsKKworCQkJaXhnYmVfcmVsZWFzZV9zd2Z3X3N5bmMoaHcsIElYR0JFX0dTU1JfRUVQX1NNKTsKKwkJCXN0YXR1cyA9IElYR0JFX0VSUl9FRVBST007CisJCX0KKwl9CisKKwkvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogQ2xlYXIgQ1MgYW5kIFNLICovCisJCWVlYyAmPSB+KElYR0JFX0VFQ19DUyB8IElYR0JFX0VFQ19TSyk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCQlJWEdCRV9XUklURV9GTFVTSChodyk7CisJCXVkZWxheSgxKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCiAgKiAgaXhnYmVfZ2V0X2VlcHJvbV9zZW1hcGhvcmUgLSBHZXQgaGFyZHdhcmUgc2VtYXBob3JlCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKQEAgLTQ3NSw3ICs2MTksNyBAQAogCQkgKi8KIAkJaWYgKGkgPj0gdGltZW91dCkgewogCQkJaHdfZGJnKGh3LCAiRHJpdmVyIGNhbid0IGFjY2VzcyB0aGUgRWVwcm9tIC0gU2VtYXBob3JlICIKLQkJCQkgIm5vdCBncmFudGVkLlxuIik7CisJCQkgICAgICAgIm5vdCBncmFudGVkLlxuIik7CiAJCQlpeGdiZV9yZWxlYXNlX2VlcHJvbV9zZW1hcGhvcmUoaHcpOwogCQkJc3RhdHVzID0gSVhHQkVfRVJSX0VFUFJPTTsKIAkJfQpAQCAtNTAzLDYgKzY0NywyMTcgQEAKIH0KIAogLyoqCisgKiAgaXhnYmVfcmVhZHlfZWVwcm9tIC0gUG9sbHMgZm9yIEVFUFJPTSByZWFkeQorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyBzMzIgaXhnYmVfcmVhZHlfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJczMyIHN0YXR1cyA9IDA7CisJdTE2IGk7CisJdTggc3BpX3N0YXRfcmVnOworCisJLyoKKwkgKiBSZWFkICJTdGF0dXMgUmVnaXN0ZXIiIHJlcGVhdGVkbHkgdW50aWwgdGhlIExTQiBpcyBjbGVhcmVkLiAgVGhlCisJICogRUVQUk9NIHdpbGwgc2lnbmFsIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIGJ5IGNsZWFyaW5nCisJICogYml0IDAgb2YgdGhlIGludGVybmFsIHN0YXR1cyByZWdpc3Rlci4gIElmIGl0J3Mgbm90IGNsZWFyZWQgd2l0aGluCisJICogNSBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9FRVBST01fTUFYX1JFVFJZX1NQSTsgaSArPSA1KSB7CisJCWl4Z2JlX3NoaWZ0X291dF9lZXByb21fYml0cyhodywgSVhHQkVfRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0VFUFJPTV9PUENPREVfQklUUyk7CisJCXNwaV9zdGF0X3JlZyA9ICh1OClpeGdiZV9zaGlmdF9pbl9lZXByb21fYml0cyhodywgOCk7CisJCWlmICghKHNwaV9zdGF0X3JlZyAmIElYR0JFX0VFUFJPTV9TVEFUVVNfUkRZX1NQSSkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoNSk7CisJCWl4Z2JlX3N0YW5kYnlfZWVwcm9tKGh3KTsKKwl9OworCisJLyoKKwkgKiBPbiBzb21lIHBhcnRzLCBTUEkgd3JpdGUgdGltZSBjb3VsZCB2YXJ5IGZyb20gMC0yMG1TZWMgb24gMy4zVgorCSAqIGRldmljZXMgKGFuZCBvbmx5IDAtNW1TZWMgb24gNVYgZGV2aWNlcykKKwkgKi8KKwlpZiAoaSA+PSBJWEdCRV9FRVBST01fTUFYX1JFVFJZX1NQSSkgeworCQlod19kYmcoaHcsICJTUEkgRUVQUk9NIFN0YXR1cyBlcnJvclxuIik7CisJCXN0YXR1cyA9IElYR0JFX0VSUl9FRVBST007CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiAgaXhnYmVfc3RhbmRieV9lZXByb20gLSBSZXR1cm5zIEVFUFJPTSB0byBhICJzdGFuZGJ5IiBzdGF0ZQorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX3N0YW5kYnlfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJdTMyIGVlYzsKKworCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJLyogVG9nZ2xlIENTIHRvIGZsdXNoIGNvbW1hbmRzICovCisJZWVjIHw9IElYR0JFX0VFQ19DUzsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VFQywgZWVjKTsKKwlJWEdCRV9XUklURV9GTFVTSChodyk7CisJdWRlbGF5KDEpOworCWVlYyAmPSB+SVhHQkVfRUVDX0NTOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKwl1ZGVsYXkoMSk7Cit9CisKKy8qKgorICogIGl4Z2JlX3NoaWZ0X291dF9lZXByb21fYml0cyAtIFNoaWZ0IGRhdGEgYml0cyBvdXQgdG8gdGhlIEVFUFJPTS4KKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGRhdGE6IGRhdGEgdG8gc2VuZCB0byB0aGUgRUVQUk9NCisgKiAgQGNvdW50OiBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX3NoaWZ0X291dF9lZXByb21fYml0cyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgY291bnQpCit7CisJdTMyIGVlYzsKKwl1MzIgbWFzazsKKwl1MzIgaTsKKworCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJLyoKKwkgKiBNYXNrIGlzIHVzZWQgdG8gc2hpZnQgImNvdW50IiBiaXRzIG9mICJkYXRhIiBvdXQgdG8gdGhlIEVFUFJPTQorCSAqIG9uZSBiaXQgYXQgYSB0aW1lLiAgRGV0ZXJtaW5lIHRoZSBzdGFydGluZyBiaXQgYmFzZWQgb24gY291bnQKKwkgKi8KKwltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qCisJCSAqIEEgIjEiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00gYnkgc2V0dGluZyBiaXQgIkRJIiB0byBhCisJCSAqICIxIiwgYW5kIHRoZW4gcmFpc2luZyBhbmQgdGhlbiBsb3dlcmluZyB0aGUgY2xvY2sgKHRoZSBTSworCQkgKiBiaXQgY29udHJvbHMgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00pLiAgQSAiMCIgaXMKKwkJICogc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTSBieSBzZXR0aW5nICJESSIgdG8gIjAiIGFuZCB0aGVuCisJCSAqIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrLgorCQkgKi8KKwkJaWYgKGRhdGEgJiBtYXNrKQorCQkJZWVjIHw9IElYR0JFX0VFQ19ESTsKKwkJZWxzZQorCQkJZWVjICY9IH5JWEdCRV9FRUNfREk7CisKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FRUMsIGVlYyk7CisJCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKworCQl1ZGVsYXkoMSk7CisKKwkJaXhnYmVfcmFpc2VfZWVwcm9tX2NsayhodywgJmVlYyk7CisJCWl4Z2JlX2xvd2VyX2VlcHJvbV9jbGsoaHcsICZlZWMpOworCisJCS8qCisJCSAqIFNoaWZ0IG1hc2sgdG8gc2lnbmlmeSBuZXh0IGJpdCBvZiBkYXRhIHRvIHNoaWZ0IGluIHRvIHRoZQorCQkgKiBFRVBST00KKwkJICovCisJCW1hc2sgPSBtYXNrID4+IDE7CisJfTsKKworCS8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLworCWVlYyAmPSB+SVhHQkVfRUVDX0RJOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKK30KKworLyoqCisgKiAgaXhnYmVfc2hpZnRfaW5fZWVwcm9tX2JpdHMgLSBTaGlmdCBkYXRhIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICoqLworc3RhdGljIHUxNiBpeGdiZV9zaGlmdF9pbl9lZXByb21fYml0cyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgY291bnQpCit7CisJdTMyIGVlYzsKKwl1MzIgaTsKKwl1MTYgZGF0YSA9IDA7CisKKwkvKgorCSAqIEluIG9yZGVyIHRvIHJlYWQgYSByZWdpc3RlciBmcm9tIHRoZSBFRVBST00sIHdlIG5lZWQgdG8gc2hpZnQKKwkgKiAnY291bnQnIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NLiBCaXRzIGFyZSAic2hpZnRlZCBpbiIgYnkgcmFpc2luZworCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbiByZWFkaW5nCisJICogdGhlIHZhbHVlIG9mIHRoZSAiRE8iIGJpdC4gIER1cmluZyB0aGlzICJzaGlmdGluZyBpbiIgcHJvY2VzcyB0aGUKKwkgKiAiREkiIGJpdCBzaG91bGQgYWx3YXlzIGJlIGNsZWFyLgorCSAqLworCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJZWVjICY9IH4oSVhHQkVfRUVDX0RPIHwgSVhHQkVfRUVDX0RJKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBkYXRhIDw8IDE7CisJCWl4Z2JlX3JhaXNlX2VlcHJvbV9jbGsoaHcsICZlZWMpOworCisJCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJCWVlYyAmPSB+KElYR0JFX0VFQ19ESSk7CisJCWlmIChlZWMgJiBJWEdCRV9FRUNfRE8pCisJCQlkYXRhIHw9IDE7CisKKwkJaXhnYmVfbG93ZXJfZWVwcm9tX2NsayhodywgJmVlYyk7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qKgorICogIGl4Z2JlX3JhaXNlX2VlcHJvbV9jbGsgLSBSYWlzZXMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqICBAZWVjOiBFRUMgcmVnaXN0ZXIncyBjdXJyZW50IHZhbHVlCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV9yYWlzZV9lZXByb21fY2xrKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqZWVjKQoreworCS8qCisJICogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00KKwkgKiAoc2V0dGluZyB0aGUgU0sgYml0KSwgdGhlbiBkZWxheQorCSAqLworCSplZWMgPSAqZWVjIHwgSVhHQkVfRUVDX1NLOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCAqZWVjKTsKKwlJWEdCRV9XUklURV9GTFVTSChodyk7CisJdWRlbGF5KDEpOworfQorCisvKioKKyAqICBpeGdiZV9sb3dlcl9lZXByb21fY2xrIC0gTG93ZXJzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGVlY2Q6IEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV9sb3dlcl9lZXByb21fY2xrKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqZWVjKQoreworCS8qCisJICogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGNsZWFyaW5nIHRoZSBTSyBiaXQpLCB0aGVuCisJICogZGVsYXkKKwkgKi8KKwkqZWVjID0gKmVlYyAmIH5JWEdCRV9FRUNfU0s7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FRUMsICplZWMpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKwl1ZGVsYXkoMSk7Cit9CisKKy8qKgorICogIGl4Z2JlX3JlbGVhc2VfZWVwcm9tIC0gUmVsZWFzZSBFRVBST00sIHJlbGVhc2Ugc2VtYXBob3JlcworICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJdTMyIGVlYzsKKworCWVlYyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FRUMpOworCisJZWVjIHw9IElYR0JFX0VFQ19DUzsgIC8qIFB1bGwgQ1MgaGlnaCAqLworCWVlYyAmPSB+SVhHQkVfRUVDX1NLOyAvKiBMb3dlciBTQ0sgKi8KKworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKKworCXVkZWxheSgxKTsKKworCS8qIFN0b3AgcmVxdWVzdGluZyBFRVBST00gYWNjZXNzICovCisJZWVjICY9IH5JWEdCRV9FRUNfUkVROworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUVDLCBlZWMpOworCisJaXhnYmVfcmVsZWFzZV9zd2Z3X3N5bmMoaHcsIElYR0JFX0dTU1JfRUVQX1NNKTsKK30KKworLyoqCiAgKiAgaXhnYmVfY2FsY19lZXByb21fY2hlY2tzdW0gLSBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBjaGVja3N1bQogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqKi8KQEAgLTUxNyw3ICs4NzIsNyBAQAogCiAJLyogSW5jbHVkZSAweDAtMHgzRiBpbiB0aGUgY2hlY2tzdW0gKi8KIAlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfRUVQUk9NX0NIRUNLU1VNOyBpKyspIHsKLQkJaWYgKGl4Z2JlX3JlYWRfZWVwcm9tKGh3LCBpLCAmd29yZCkgIT0gMCkgeworCQlpZiAoaHctPmVlcHJvbS5vcHMucmVhZChodywgaSwgJndvcmQpICE9IDApIHsKIAkJCWh3X2RiZyhodywgIkVFUFJPTSByZWFkIGZhaWxlZFxuIik7CiAJCQlicmVhazsKIAkJfQpAQCAtNTI2LDE1ICs4ODEsMTUgQEAKIAogCS8qIEluY2x1ZGUgYWxsIGRhdGEgZnJvbSBwb2ludGVycyBleGNlcHQgZm9yIHRoZSBmdyBwb2ludGVyICovCiAJZm9yIChpID0gSVhHQkVfUENJRV9BTkFMT0dfUFRSOyBpIDwgSVhHQkVfRldfUFRSOyBpKyspIHsKLQkJaXhnYmVfcmVhZF9lZXByb20oaHcsIGksICZwb2ludGVyKTsKKwkJaHctPmVlcHJvbS5vcHMucmVhZChodywgaSwgJnBvaW50ZXIpOwogCiAJCS8qIE1ha2Ugc3VyZSB0aGUgcG9pbnRlciBzZWVtcyB2YWxpZCAqLwogCQlpZiAocG9pbnRlciAhPSAweEZGRkYgJiYgcG9pbnRlciAhPSAwKSB7Ci0JCQlpeGdiZV9yZWFkX2VlcHJvbShodywgcG9pbnRlciwgJmxlbmd0aCk7CisJCQlody0+ZWVwcm9tLm9wcy5yZWFkKGh3LCBwb2ludGVyLCAmbGVuZ3RoKTsKIAogCQkJaWYgKGxlbmd0aCAhPSAweEZGRkYgJiYgbGVuZ3RoICE9IDApIHsKIAkJCQlmb3IgKGogPSBwb2ludGVyKzE7IGogPD0gcG9pbnRlcitsZW5ndGg7IGorKykgewotCQkJCQlpeGdiZV9yZWFkX2VlcHJvbShodywgaiwgJndvcmQpOworCQkJCQlody0+ZWVwcm9tLm9wcy5yZWFkKGh3LCBqLCAmd29yZCk7CiAJCQkJCWNoZWNrc3VtICs9IHdvcmQ7CiAJCQkJfQogCQkJfQpAQCAtNTQ3LDE0ICs5MDIsMTUgQEAKIH0KIAogLyoqCi0gKiAgaXhnYmVfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtIC0gVmFsaWRhdGUgRUVQUk9NIGNoZWNrc3VtCisgKiAgaXhnYmVfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtX2dlbmVyaWMgLSBWYWxpZGF0ZSBFRVBST00gY2hlY2tzdW0KICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQGNoZWNrc3VtX3ZhbDogY2FsY3VsYXRlZCBjaGVja3N1bQogICoKICAqICBQZXJmb3JtcyBjaGVja3N1bSBjYWxjdWxhdGlvbiBhbmQgdmFsaWRhdGVzIHRoZSBFRVBST00gY2hlY2tzdW0uICBJZiB0aGUKICAqICBjYWxsZXIgZG9lcyBub3QgbmVlZCBjaGVja3N1bV92YWwsIHRoZSB2YWx1ZSBjYW4gYmUgTlVMTC4KICAqKi8KLXMzMiBpeGdiZV92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGl4Z2JlX2h3ICpodywgdTE2ICpjaGVja3N1bV92YWwpCitzMzIgaXhnYmVfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgKmNoZWNrc3VtX3ZhbCkKIHsKIAlzMzIgc3RhdHVzOwogCXUxNiBjaGVja3N1bTsKQEAgLTU2NSwxMiArOTIxLDEyIEBACiAJICogbm90IGNvbnRpbnVlIG9yIHdlIGNvdWxkIGJlIGluIGZvciBhIHZlcnkgbG9uZyB3YWl0IHdoaWxlIGV2ZXJ5CiAJICogRUVQUk9NIHJlYWQgZmFpbHMKIAkgKi8KLQlzdGF0dXMgPSBpeGdiZV9yZWFkX2VlcHJvbShodywgMCwgJmNoZWNrc3VtKTsKKwlzdGF0dXMgPSBody0+ZWVwcm9tLm9wcy5yZWFkKGh3LCAwLCAmY2hlY2tzdW0pOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7CiAJCWNoZWNrc3VtID0gaXhnYmVfY2FsY19lZXByb21fY2hlY2tzdW0oaHcpOwogCi0JCWl4Z2JlX3JlYWRfZWVwcm9tKGh3LCBJWEdCRV9FRVBST01fQ0hFQ0tTVU0sICZyZWFkX2NoZWNrc3VtKTsKKwkJaHctPmVlcHJvbS5vcHMucmVhZChodywgSVhHQkVfRUVQUk9NX0NIRUNLU1VNLCAmcmVhZF9jaGVja3N1bSk7CiAKIAkJLyoKIAkJICogVmVyaWZ5IHJlYWQgY2hlY2tzdW0gZnJvbSBFRVBST00gaXMgdGhlIHNhbWUgYXMKQEAgLTU5MCw2ICs5NDYsMzMgQEAKIH0KIAogLyoqCisgKiAgaXhnYmVfdXBkYXRlX2VlcHJvbV9jaGVja3N1bV9nZW5lcmljIC0gVXBkYXRlcyB0aGUgRUVQUk9NIGNoZWNrc3VtCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICoqLworczMyIGl4Z2JlX3VwZGF0ZV9lZXByb21fY2hlY2tzdW1fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQoreworCXMzMiBzdGF0dXM7CisJdTE2IGNoZWNrc3VtOworCisJLyoKKwkgKiBSZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4gSWYgdGhpcyB0aW1lcyBvdXQgb3IgZmFpbHMsIGRvCisJICogbm90IGNvbnRpbnVlIG9yIHdlIGNvdWxkIGJlIGluIGZvciBhIHZlcnkgbG9uZyB3YWl0IHdoaWxlIGV2ZXJ5CisJICogRUVQUk9NIHJlYWQgZmFpbHMKKwkgKi8KKwlzdGF0dXMgPSBody0+ZWVwcm9tLm9wcy5yZWFkKGh3LCAwLCAmY2hlY2tzdW0pOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWNoZWNrc3VtID0gaXhnYmVfY2FsY19lZXByb21fY2hlY2tzdW0oaHcpOworCQlzdGF0dXMgPSBody0+ZWVwcm9tLm9wcy53cml0ZShodywgSVhHQkVfRUVQUk9NX0NIRUNLU1VNLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0pOworCX0gZWxzZSB7CisJCWh3X2RiZyhodywgIkVFUFJPTSByZWFkIGZhaWxlZFxuIik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCiAgKiAgaXhnYmVfdmFsaWRhdGVfbWFjX2FkZHIgLSBWYWxpZGF0ZSBNQUMgYWRkcmVzcwogICogIEBtYWNfYWRkcjogcG9pbnRlciB0byBNQUMgYWRkcmVzcy4KICAqCkBAIC02MDcsNjEgKzk5MCwxNDAgQEAKIAkJc3RhdHVzID0gSVhHQkVfRVJSX0lOVkFMSURfTUFDX0FERFI7CiAJLyogUmVqZWN0IHRoZSB6ZXJvIGFkZHJlc3MgKi8KIAllbHNlIGlmIChtYWNfYWRkclswXSA9PSAwICYmIG1hY19hZGRyWzFdID09IDAgJiYgbWFjX2FkZHJbMl0gPT0gMCAmJgotCQkgbWFjX2FkZHJbM10gPT0gMCAmJiBtYWNfYWRkcls0XSA9PSAwICYmIG1hY19hZGRyWzVdID09IDApCisJICAgICAgICAgbWFjX2FkZHJbM10gPT0gMCAmJiBtYWNfYWRkcls0XSA9PSAwICYmIG1hY19hZGRyWzVdID09IDApCiAJCXN0YXR1cyA9IElYR0JFX0VSUl9JTlZBTElEX01BQ19BRERSOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCi0gKiAgaXhnYmVfc2V0X3JhciAtIFNldCBSWCBhZGRyZXNzIHJlZ2lzdGVyCisgKiAgaXhnYmVfc2V0X3Jhcl9nZW5lcmljIC0gU2V0IFJ4IGFkZHJlc3MgcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCi0gKiAgQGFkZHI6IEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCiAgKiAgQGluZGV4OiBSZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIgdG8gd3JpdGUKLSAqICBAdmluZDogVmluZCB0byBzZXQgUkFSIHRvCisgKiAgQGFkZHI6IEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCisgKiAgQHZtZHE6IFZNRHEgInNldCIgb3IgInBvb2wiIGluZGV4CiAgKiAgQGVuYWJsZV9hZGRyOiBzZXQgZmxhZyB0aGF0IGFkZHJlc3MgaXMgYWN0aXZlCiAgKgogICogIFB1dHMgYW4gZXRoZXJuZXQgYWRkcmVzcyBpbnRvIGEgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyLgogICoqLwotczMyIGl4Z2JlX3NldF9yYXIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4LCB1OCAqYWRkciwgdTMyIHZpbmQsCi0JCSAgdTMyIGVuYWJsZV9hZGRyKQorczMyIGl4Z2JlX3NldF9yYXJfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgaW5kZXgsIHU4ICphZGRyLCB1MzIgdm1kcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGVuYWJsZV9hZGRyKQogewogCXUzMiByYXJfbG93LCByYXJfaGlnaDsKKwl1MzIgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllczsKIAotCS8qCi0JICogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIgZnJvbQotCSAqIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIHRvIGxpdHRsZSBlbmRpYW4KLQkgKi8KLQlyYXJfbG93ID0gKCh1MzIpYWRkclswXSB8Ci0JCSAgICgodTMyKWFkZHJbMV0gPDwgOCkgfAotCQkgICAoKHUzMilhZGRyWzJdIDw8IDE2KSB8Ci0JCSAgICgodTMyKWFkZHJbM10gPDwgMjQpKTsKKwkvKiBzZXR1cCBWTURxIHBvb2wgc2VsZWN0aW9uIGJlZm9yZSB0aGlzIFJBUiBnZXRzIGVuYWJsZWQgKi8KKwlody0+bWFjLm9wcy5zZXRfdm1kcShodywgaW5kZXgsIHZtZHEpOwogCi0JcmFyX2hpZ2ggPSAoKHUzMilhZGRyWzRdIHwKLQkJICAgICgodTMyKWFkZHJbNV0gPDwgOCkgfAotCQkgICAgKCh2aW5kIDw8IElYR0JFX1JBSF9WSU5EX1NISUZUKSAmIElYR0JFX1JBSF9WSU5EX01BU0spKTsKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHVzaW5nIGEgdmFsaWQgcmFyIGluZGV4IHJhbmdlICovCisJaWYgKGluZGV4IDwgcmFyX2VudHJpZXMpIHsKKwkJLyoKKwkJICogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUKKwkJICogb3JkZXIgZnJvbSBuZXR3b3JrIG9yZGVyIChiaWcgZW5kaWFuKSB0byBsaXR0bGUgZW5kaWFuCisJCSAqLworCQlyYXJfbG93ID0gKCh1MzIpYWRkclswXSB8CisJCSAgICAgICAgICAgKCh1MzIpYWRkclsxXSA8PCA4KSB8CisJCSAgICAgICAgICAgKCh1MzIpYWRkclsyXSA8PCAxNikgfAorCQkgICAgICAgICAgICgodTMyKWFkZHJbM10gPDwgMjQpKTsKKwkJLyoKKwkJICogU29tZSBwYXJ0cyBwdXQgdGhlIFZNRHEgc2V0dGluZyBpbiB0aGUgZXh0cmEgUkFIIGJpdHMsCisJCSAqIHNvIHNhdmUgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxvd2VyIDE2IGJpdHMgdGhhdCBob2xkIHBhcnQKKwkJICogb2YgdGhlIGFkZHJlc3MgYW5kIHRoZSBhZGRyZXNzIHZhbGlkIGJpdC4KKwkJICovCisJCXJhcl9oaWdoID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JBSChpbmRleCkpOworCQlyYXJfaGlnaCAmPSB+KDB4MDAwMEZGRkYgfCBJWEdCRV9SQUhfQVYpOworCQlyYXJfaGlnaCB8PSAoKHUzMilhZGRyWzRdIHwgKCh1MzIpYWRkcls1XSA8PCA4KSk7CiAKLQlpZiAoZW5hYmxlX2FkZHIgIT0gMCkKLQkJcmFyX2hpZ2ggfD0gSVhHQkVfUkFIX0FWOworCQlpZiAoZW5hYmxlX2FkZHIgIT0gMCkKKwkJCXJhcl9oaWdoIHw9IElYR0JFX1JBSF9BVjsKIAotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkFMKGluZGV4KSwgcmFyX2xvdyk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUgoaW5kZXgpLCByYXJfaGlnaCk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkFMKGluZGV4KSwgcmFyX2xvdyk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkFIKGluZGV4KSwgcmFyX2hpZ2gpOworCX0gZWxzZSB7CisJCWh3X2RiZyhodywgIlJBUiBpbmRleCAlZCBpcyBvdXQgb2YgcmFuZ2UuXG4iLCBpbmRleCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIGl4Z2JlX2luaXRfcnhfYWRkcnMgLSBJbml0aWFsaXplcyByZWNlaXZlIGFkZHJlc3MgZmlsdGVycy4KKyAqICBpeGdiZV9jbGVhcl9yYXJfZ2VuZXJpYyAtIFJlbW92ZSBSeCBhZGRyZXNzIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBpbmRleDogUmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIHRvIHdyaXRlCisgKgorICogIENsZWFycyBhbiBldGhlcm5ldCBhZGRyZXNzIGZyb20gYSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIuCisgKiovCitzMzIgaXhnYmVfY2xlYXJfcmFyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQoreworCXUzMiByYXJfaGlnaDsKKwl1MzIgcmFyX2VudHJpZXMgPSBody0+bWFjLm51bV9yYXJfZW50cmllczsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgYSB2YWxpZCByYXIgaW5kZXggcmFuZ2UgKi8KKwlpZiAoaW5kZXggPCByYXJfZW50cmllcykgeworCQkvKgorCQkgKiBTb21lIHBhcnRzIHB1dCB0aGUgVk1EcSBzZXR0aW5nIGluIHRoZSBleHRyYSBSQUggYml0cywKKwkJICogc28gc2F2ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbG93ZXIgMTYgYml0cyB0aGF0IGhvbGQgcGFydAorCQkgKiBvZiB0aGUgYWRkcmVzcyBhbmQgdGhlIGFkZHJlc3MgdmFsaWQgYml0LgorCQkgKi8KKwkJcmFyX2hpZ2ggPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUkFIKGluZGV4KSk7CisJCXJhcl9oaWdoICY9IH4oMHgwMDAwRkZGRiB8IElYR0JFX1JBSF9BVik7CisKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUwoaW5kZXgpLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUgoaW5kZXgpLCByYXJfaGlnaCk7CisJfSBlbHNlIHsKKwkJaHdfZGJnKGh3LCAiUkFSIGluZGV4ICVkIGlzIG91dCBvZiByYW5nZS5cbiIsIGluZGV4KTsKKwl9CisKKwkvKiBjbGVhciBWTURxIHBvb2wvcXVldWUgc2VsZWN0aW9uIGZvciB0aGlzIFJBUiAqLworCWh3LT5tYWMub3BzLmNsZWFyX3ZtZHEoaHcsIGluZGV4LCBJWEdCRV9DTEVBUl9WTURRX0FMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfZW5hYmxlX3JhciAtIEVuYWJsZSBSeCBhZGRyZXNzIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBpbmRleDogaW5kZXggaW50byB0aGUgUkFSIHRhYmxlCisgKgorICogIEVuYWJsZXMgdGhlIHNlbGVjdCByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIuCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV9lbmFibGVfcmFyKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCkKK3sKKwl1MzIgcmFyX2hpZ2g7CisKKwlyYXJfaGlnaCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SQUgoaW5kZXgpKTsKKwlyYXJfaGlnaCB8PSBJWEdCRV9SQUhfQVY7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUgoaW5kZXgpLCByYXJfaGlnaCk7Cit9CisKKy8qKgorICogIGl4Z2JlX2Rpc2FibGVfcmFyIC0gRGlzYWJsZSBSeCBhZGRyZXNzIHJlZ2lzdGVyCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBpbmRleDogaW5kZXggaW50byB0aGUgUkFSIHRhYmxlCisgKgorICogIERpc2FibGVzIHRoZSBzZWxlY3QgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyLgorICoqLworc3RhdGljIHZvaWQgaXhnYmVfZGlzYWJsZV9yYXIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQoreworCXUzMiByYXJfaGlnaDsKKworCXJhcl9oaWdoID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JBSChpbmRleCkpOworCXJhcl9oaWdoICY9ICh+SVhHQkVfUkFIX0FWKTsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JBSChpbmRleCksIHJhcl9oaWdoKTsKK30KKworLyoqCisgKiAgaXhnYmVfaW5pdF9yeF9hZGRyc19nZW5lcmljIC0gSW5pdGlhbGl6ZXMgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcnMuCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKICAqICBQbGFjZXMgdGhlIE1BQyBhZGRyZXNzIGluIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciAwIGFuZCBjbGVhcnMgdGhlIHJlc3QKLSAqICBvZiB0aGUgcmVjZWl2ZSBhZGRyZXNzcyByZWdpc3RlcnMuIENsZWFycyB0aGUgbXVsdGljYXN0IHRhYmxlLiBBc3N1bWVzCisgKiAgb2YgdGhlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMuIENsZWFycyB0aGUgbXVsdGljYXN0IHRhYmxlLiBBc3N1bWVzCiAgKiAgdGhlIHJlY2VpdmVyIGlzIGluIHJlc2V0IHdoZW4gdGhlIHJvdXRpbmUgaXMgY2FsbGVkLgogICoqLwotc3RhdGljIHMzMiBpeGdiZV9pbml0X3J4X2FkZHJzKHN0cnVjdCBpeGdiZV9odyAqaHcpCitzMzIgaXhnYmVfaW5pdF9yeF9hZGRyc19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7CiAJdTMyIGk7Ci0JdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcnhfYWRkcnM7CisJdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXM7CiAKIAkvKgogCSAqIElmIHRoZSBjdXJyZW50IG1hYyBhZGRyZXNzIGlzIHZhbGlkLCBhc3N1bWUgaXQgaXMgYSBzb2Z0d2FyZSBvdmVycmlkZQpAQCAtNjcxLDI5ICsxMTMzLDMwIEBACiAJaWYgKGl4Z2JlX3ZhbGlkYXRlX21hY19hZGRyKGh3LT5tYWMuYWRkcikgPT0KIAkgICAgSVhHQkVfRVJSX0lOVkFMSURfTUFDX0FERFIpIHsKIAkJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBSQVIwIGZvciBsYXRlciByZWZlcmVuY2UgKi8KLQkJaXhnYmVfZ2V0X21hY19hZGRyKGh3LCBody0+bWFjLmFkZHIpOworCQlody0+bWFjLm9wcy5nZXRfbWFjX2FkZHIoaHcsIGh3LT5tYWMuYWRkcik7CiAKIAkJaHdfZGJnKGh3LCAiIEtlZXBpbmcgQ3VycmVudCBSQVIwIEFkZHIgPSUuMlggJS4yWCAlLjJYICIsCi0JCQkgIGh3LT5tYWMuYWRkclswXSwgaHctPm1hYy5hZGRyWzFdLAotCQkJICBody0+bWFjLmFkZHJbMl0pOworCQkgICAgICAgaHctPm1hYy5hZGRyWzBdLCBody0+bWFjLmFkZHJbMV0sCisJCSAgICAgICBody0+bWFjLmFkZHJbMl0pOwogCQlod19kYmcoaHcsICIlLjJYICUuMlggJS4yWFxuIiwgaHctPm1hYy5hZGRyWzNdLAotCQkJICBody0+bWFjLmFkZHJbNF0sIGh3LT5tYWMuYWRkcls1XSk7CisJCSAgICAgICBody0+bWFjLmFkZHJbNF0sIGh3LT5tYWMuYWRkcls1XSk7CiAJfSBlbHNlIHsKIAkJLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gKi8KIAkJaHdfZGJnKGh3LCAiT3ZlcnJpZGluZyBNQUMgQWRkcmVzcyBpbiBSQVJbMF1cbiIpOwogCQlod19kYmcoaHcsICIgTmV3IE1BQyBBZGRyID0lLjJYICUuMlggJS4yWCAiLAotCQkJICBody0+bWFjLmFkZHJbMF0sIGh3LT5tYWMuYWRkclsxXSwKLQkJCSAgaHctPm1hYy5hZGRyWzJdKTsKKwkJICAgICAgIGh3LT5tYWMuYWRkclswXSwgaHctPm1hYy5hZGRyWzFdLAorCQkgICAgICAgaHctPm1hYy5hZGRyWzJdKTsKIAkJaHdfZGJnKGh3LCAiJS4yWCAlLjJYICUuMlhcbiIsIGh3LT5tYWMuYWRkclszXSwKLQkJCSAgaHctPm1hYy5hZGRyWzRdLCBody0+bWFjLmFkZHJbNV0pOworCQkgICAgICAgaHctPm1hYy5hZGRyWzRdLCBody0+bWFjLmFkZHJbNV0pOwogCi0JCWl4Z2JlX3NldF9yYXIoaHcsIDAsIGh3LT5tYWMuYWRkciwgMCwgSVhHQkVfUkFIX0FWKTsKKwkJaHctPm1hYy5vcHMuc2V0X3JhcihodywgMCwgaHctPm1hYy5hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOwogCX0KKwlody0+YWRkcl9jdHJsLm92ZXJmbG93X3Byb21pc2MgPSAwOwogCiAJaHctPmFkZHJfY3RybC5yYXJfdXNlZF9jb3VudCA9IDE7CiAKIAkvKiBaZXJvIG91dCB0aGUgb3RoZXIgcmVjZWl2ZSBhZGRyZXNzZXMuICovCi0JaHdfZGJnKGh3LCAiQ2xlYXJpbmcgUkFSWzEtMTVdXG4iKTsKKwlod19kYmcoaHcsICJDbGVhcmluZyBSQVJbMS0lZF1cbiIsIHJhcl9lbnRyaWVzIC0gMSk7CiAJZm9yIChpID0gMTsgaSA8IHJhcl9lbnRyaWVzOyBpKyspIHsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUwoaSksIDApOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JBSChpKSwgMCk7CkBAIC03MDUsOSArMTE2OCwxMTMgQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01DU1RDVFJMLCBody0+bWFjLm1jX2ZpbHRlcl90eXBlKTsKIAogCWh3X2RiZyhodywgIiBDbGVhcmluZyBNVEFcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9NQ19UQkxfU0laRTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm1jZnRfc2l6ZTsgaSsrKQogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UQShpKSwgMCk7CiAKKwlpZiAoaHctPm1hYy5vcHMuaW5pdF91dGFfdGFibGVzKQorCQlody0+bWFjLm9wcy5pbml0X3V0YV90YWJsZXMoaHcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIGl4Z2JlX2FkZF91Y19hZGRyIC0gQWRkcyBhIHNlY29uZGFyeSB1bmljYXN0IGFkZHJlc3MuCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBhZGRyOiBuZXcgYWRkcmVzcworICoKKyAqICBBZGRzIGl0IHRvIHVudXNlZCByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIgb3IgZ29lcyBpbnRvIHByb21pc2N1b3VzIG1vZGUuCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV9hZGRfdWNfYWRkcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqYWRkciwgdTMyIHZtZHEpCit7CisJdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXM7CisJdTMyIHJhcjsKKworCWh3X2RiZyhodywgIiBVQyBBZGRyID0gJS4yWCAlLjJYICUuMlggJS4yWCAlLjJYICUuMlhcbiIsCisJICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisJLyoKKwkgKiBQbGFjZSB0aGlzIGFkZHJlc3MgaW4gdGhlIFJBUiBpZiB0aGVyZSBpcyByb29tLAorCSAqIGVsc2UgcHV0IHRoZSBjb250cm9sbGVyIGludG8gcHJvbWlzY3VvdXMgbW9kZQorCSAqLworCWlmIChody0+YWRkcl9jdHJsLnJhcl91c2VkX2NvdW50IDwgcmFyX2VudHJpZXMpIHsKKwkJcmFyID0gaHctPmFkZHJfY3RybC5yYXJfdXNlZF9jb3VudCAtCisJCSAgICAgIGh3LT5hZGRyX2N0cmwubWNfYWRkcl9pbl9yYXJfY291bnQ7CisJCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIHJhciwgYWRkciwgdm1kcSwgSVhHQkVfUkFIX0FWKTsKKwkJaHdfZGJnKGh3LCAiQWRkZWQgYSBzZWNvbmRhcnkgYWRkcmVzcyB0byBSQVJbJWRdXG4iLCByYXIpOworCQlody0+YWRkcl9jdHJsLnJhcl91c2VkX2NvdW50Kys7CisJfSBlbHNlIHsKKwkJaHctPmFkZHJfY3RybC5vdmVyZmxvd19wcm9taXNjKys7CisJfQorCisJaHdfZGJnKGh3LCAiaXhnYmVfYWRkX3VjX2FkZHIgQ29tcGxldGVcbiIpOworfQorCisvKioKKyAqICBpeGdiZV91cGRhdGVfdWNfYWRkcl9saXN0X2dlbmVyaWMgLSBVcGRhdGVzIE1BQyBsaXN0IG9mIHNlY29uZGFyeSBhZGRyZXNzZXMKKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGFkZHJfbGlzdDogdGhlIGxpc3Qgb2YgbmV3IGFkZHJlc3NlcworICogIEBhZGRyX2NvdW50OiBudW1iZXIgb2YgYWRkcmVzc2VzCisgKiAgQG5leHQ6IGl0ZXJhdG9yIGZ1bmN0aW9uIHRvIHdhbGsgdGhlIGFkZHJlc3MgbGlzdAorICoKKyAqICBUaGUgZ2l2ZW4gbGlzdCByZXBsYWNlcyBhbnkgZXhpc3RpbmcgbGlzdC4gIENsZWFycyB0aGUgc2Vjb25kYXJ5IGFkZHJzIGZyb20KKyAqICByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzLiAgVXNlcyB1bnVzZWQgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycyBmb3IgdGhlCisgKiAgZmlyc3Qgc2Vjb25kYXJ5IGFkZHJlc3NlcywgYW5kIGZhbGxzIGJhY2sgdG8gcHJvbWlzY3VvdXMgbW9kZSBhcyBuZWVkZWQuCisgKgorICogIERyaXZlcnMgdXNpbmcgc2Vjb25kYXJ5IHVuaWNhc3QgYWRkcmVzc2VzIG11c3Qgc2V0IHVzZXJfc2V0X3Byb21pc2Mgd2hlbgorICogIG1hbnVhbGx5IHB1dHRpbmcgdGhlIGRldmljZSBpbnRvIHByb21pc2N1b3VzIG1vZGUuCisgKiovCitzMzIgaXhnYmVfdXBkYXRlX3VjX2FkZHJfbGlzdF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICphZGRyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgYWRkcl9jb3VudCwgaXhnYmVfbWNfYWRkcl9pdHIgbmV4dCkKK3sKKwl1OCAqYWRkcjsKKwl1MzIgaTsKKwl1MzIgb2xkX3Byb21pc2Nfc2V0dGluZyA9IGh3LT5hZGRyX2N0cmwub3ZlcmZsb3dfcHJvbWlzYzsKKwl1MzIgdWNfYWRkcl9pbl91c2U7CisJdTMyIGZjdHJsOworCXUzMiB2bWRxOworCisJLyoKKwkgKiBDbGVhciBhY2NvdW50aW5nIG9mIG9sZCBzZWNvbmRhcnkgYWRkcmVzcyBsaXN0LAorCSAqIGRvbid0IGNvdW50IFJBUlswXQorCSAqLworCXVjX2FkZHJfaW5fdXNlID0gaHctPmFkZHJfY3RybC5yYXJfdXNlZF9jb3VudCAtCisJICAgICAgICAgICAgICAgICBody0+YWRkcl9jdHJsLm1jX2FkZHJfaW5fcmFyX2NvdW50IC0gMTsKKwlody0+YWRkcl9jdHJsLnJhcl91c2VkX2NvdW50IC09IHVjX2FkZHJfaW5fdXNlOworCWh3LT5hZGRyX2N0cmwub3ZlcmZsb3dfcHJvbWlzYyA9IDA7CisKKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgcmVjZWl2ZSBhZGRyZXNzZXMgKi8KKwlod19kYmcoaHcsICJDbGVhcmluZyBSQVJbMS0lZF1cbiIsIHVjX2FkZHJfaW5fdXNlKTsKKwlmb3IgKGkgPSAxOyBpIDw9IHVjX2FkZHJfaW5fdXNlOyBpKyspIHsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUwoaSksIDApOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JBSChpKSwgMCk7CisJfQorCisJLyogQWRkIHRoZSBuZXcgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGFkZHJfY291bnQ7IGkrKykgeworCQlod19kYmcoaHcsICIgQWRkaW5nIHRoZSBzZWNvbmRhcnkgYWRkcmVzc2VzOlxuIik7CisJCWFkZHIgPSBuZXh0KGh3LCAmYWRkcl9saXN0LCAmdm1kcSk7CisJCWl4Z2JlX2FkZF91Y19hZGRyKGh3LCBhZGRyLCB2bWRxKTsKKwl9CisKKwlpZiAoaHctPmFkZHJfY3RybC5vdmVyZmxvd19wcm9taXNjKSB7CisJCS8qIGVuYWJsZSBwcm9taXNjIGlmIG5vdCBhbHJlYWR5IGluIG92ZXJmbG93IG9yIHNldCBieSB1c2VyICovCisJCWlmICghb2xkX3Byb21pc2Nfc2V0dGluZyAmJiAhaHctPmFkZHJfY3RybC51c2VyX3NldF9wcm9taXNjKSB7CisJCQlod19kYmcoaHcsICIgRW50ZXJpbmcgYWRkcmVzcyBvdmVyZmxvdyBwcm9taXNjIG1vZGVcbiIpOworCQkJZmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNUUkwpOworCQkJZmN0cmwgfD0gSVhHQkVfRkNUUkxfVVBFOworCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1RSTCwgZmN0cmwpOworCQl9CisJfSBlbHNlIHsKKwkJLyogb25seSBkaXNhYmxlIGlmIHNldCBieSBvdmVyZmxvdywgbm90IGJ5IHVzZXIgKi8KKwkJaWYgKG9sZF9wcm9taXNjX3NldHRpbmcgJiYgIWh3LT5hZGRyX2N0cmwudXNlcl9zZXRfcHJvbWlzYykgeworCQkJaHdfZGJnKGh3LCAiIExlYXZpbmcgYWRkcmVzcyBvdmVyZmxvdyBwcm9taXNjIG1vZGVcbiIpOworCQkJZmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNUUkwpOworCQkJZmN0cmwgJj0gfklYR0JFX0ZDVFJMX1VQRTsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNUUkwsIGZjdHJsKTsKKwkJfQorCX0KKworCWh3X2RiZyhodywgIml4Z2JlX3VwZGF0ZV91Y19hZGRyX2xpc3RfZ2VuZXJpYyBDb21wbGV0ZVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcyMCw3ICsxMjg3LDcgQEAKICAqICBiaXQtdmVjdG9yIHRvIHNldCBpbiB0aGUgbXVsdGljYXN0IHRhYmxlLiBUaGUgaGFyZHdhcmUgdXNlcyAxMiBiaXRzLCBmcm9tCiAgKiAgaW5jb21pbmcgcnggbXVsdGljYXN0IGFkZHJlc3NlcywgdG8gZGV0ZXJtaW5lIHRoZSBiaXQtdmVjdG9yIHRvIGNoZWNrIGluCiAgKiAgdGhlIE1UQS4gV2hpY2ggb2YgdGhlIDQgY29tYmluYXRpb24sIG9mIDEyLWJpdHMsIHRoZSBoYXJkd2FyZSB1c2VzIGlzIHNldAotICogIGJ5IHRoZSBNTyBmaWVsZCBvZiB0aGUgTUNTVENUUkwuIFRoZSBNTyBmaWVsZCBpcyBzZXQgZHVyaW5nIGluaXRhbGl6YXRpb24KKyAqICBieSB0aGUgTU8gZmllbGQgb2YgdGhlIE1DU1RDVFJMLiBUaGUgTU8gZmllbGQgaXMgc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbgogICogIHRvIG1jX2ZpbHRlcl90eXBlLgogICoqLwogc3RhdGljIHMzMiBpeGdiZV9tdGFfdmVjdG9yKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptY19hZGRyKQpAQCAtNzI4LDE5ICsxMjk1LDE5IEBACiAJdTMyIHZlY3RvciA9IDA7CiAKIAlzd2l0Y2ggKGh3LT5tYWMubWNfZmlsdGVyX3R5cGUpIHsKLQljYXNlIDA6CSAgLyogdXNlIGJpdHMgWzQ3OjM2XSBvZiB0aGUgYWRkcmVzcyAqLworCWNhc2UgMDogICAvKiB1c2UgYml0cyBbNDc6MzZdIG9mIHRoZSBhZGRyZXNzICovCiAJCXZlY3RvciA9ICgobWNfYWRkcls0XSA+PiA0KSB8ICgoKHUxNiltY19hZGRyWzVdKSA8PCA0KSk7CiAJCWJyZWFrOwotCWNhc2UgMToJICAvKiB1c2UgYml0cyBbNDY6MzVdIG9mIHRoZSBhZGRyZXNzICovCisJY2FzZSAxOiAgIC8qIHVzZSBiaXRzIFs0NjozNV0gb2YgdGhlIGFkZHJlc3MgKi8KIAkJdmVjdG9yID0gKChtY19hZGRyWzRdID4+IDMpIHwgKCgodTE2KW1jX2FkZHJbNV0pIDw8IDUpKTsKIAkJYnJlYWs7Ci0JY2FzZSAyOgkgIC8qIHVzZSBiaXRzIFs0NTozNF0gb2YgdGhlIGFkZHJlc3MgKi8KKwljYXNlIDI6ICAgLyogdXNlIGJpdHMgWzQ1OjM0XSBvZiB0aGUgYWRkcmVzcyAqLwogCQl2ZWN0b3IgPSAoKG1jX2FkZHJbNF0gPj4gMikgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgNikpOwogCQlicmVhazsKLQljYXNlIDM6CSAgLyogdXNlIGJpdHMgWzQzOjMyXSBvZiB0aGUgYWRkcmVzcyAqLworCWNhc2UgMzogICAvKiB1c2UgYml0cyBbNDM6MzJdIG9mIHRoZSBhZGRyZXNzICovCiAJCXZlY3RvciA9ICgobWNfYWRkcls0XSkgfCAoKCh1MTYpbWNfYWRkcls1XSkgPDwgOCkpOwogCQlicmVhazsKLQlkZWZhdWx0OgkgLyogSW52YWxpZCBtY19maWx0ZXJfdHlwZSAqLworCWRlZmF1bHQ6ICAvKiBJbnZhbGlkIG1jX2ZpbHRlcl90eXBlICovCiAJCWh3X2RiZyhodywgIk1DIGZpbHRlciB0eXBlIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CiAJCWJyZWFrOwogCX0KQEAgLTc5NCwyMSArMTM2MSwyMiBAQAogICoqLwogc3RhdGljIHZvaWQgaXhnYmVfYWRkX21jX2FkZHIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKm1jX2FkZHIpCiB7Ci0JdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcnhfYWRkcnM7CisJdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXM7CisJdTMyIHJhcjsKIAogCWh3X2RiZyhodywgIiBNQyBBZGRyID0lLjJYICUuMlggJS4yWCAlLjJYICUuMlggJS4yWFxuIiwKLQkJICBtY19hZGRyWzBdLCBtY19hZGRyWzFdLCBtY19hZGRyWzJdLAotCQkgIG1jX2FkZHJbM10sIG1jX2FkZHJbNF0sIG1jX2FkZHJbNV0pOworCSAgICAgICBtY19hZGRyWzBdLCBtY19hZGRyWzFdLCBtY19hZGRyWzJdLAorCSAgICAgICBtY19hZGRyWzNdLCBtY19hZGRyWzRdLCBtY19hZGRyWzVdKTsKIAogCS8qCiAJICogUGxhY2UgdGhpcyBtdWx0aWNhc3QgYWRkcmVzcyBpbiB0aGUgUkFSIGlmIHRoZXJlIGlzIHJvb20sCiAJICogZWxzZSBwdXQgaXQgaW4gdGhlIE1UQQogCSAqLwogCWlmIChody0+YWRkcl9jdHJsLnJhcl91c2VkX2NvdW50IDwgcmFyX2VudHJpZXMpIHsKLQkJaXhnYmVfc2V0X3JhcihodywgaHctPmFkZHJfY3RybC5yYXJfdXNlZF9jb3VudCwKLQkJCSAgICAgIG1jX2FkZHIsIDAsIElYR0JFX1JBSF9BVik7Ci0JCWh3X2RiZyhodywgIkFkZGVkIGEgbXVsdGljYXN0IGFkZHJlc3MgdG8gUkFSWyVkXVxuIiwKLQkJCSAgaHctPmFkZHJfY3RybC5yYXJfdXNlZF9jb3VudCk7CisJCS8qIHVzZSBSQVIgZnJvbSB0aGUgZW5kIHVwIGZvciBtdWx0aWNhc3QgKi8KKwkJcmFyID0gcmFyX2VudHJpZXMgLSBody0+YWRkcl9jdHJsLm1jX2FkZHJfaW5fcmFyX2NvdW50IC0gMTsKKwkJaHctPm1hYy5vcHMuc2V0X3JhcihodywgcmFyLCBtY19hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOworCQlod19kYmcoaHcsICJBZGRlZCBhIG11bHRpY2FzdCBhZGRyZXNzIHRvIFJBUlslZF1cbiIsIHJhcik7CiAJCWh3LT5hZGRyX2N0cmwucmFyX3VzZWRfY291bnQrKzsKIAkJaHctPmFkZHJfY3RybC5tY19hZGRyX2luX3Jhcl9jb3VudCsrOwogCX0gZWxzZSB7CkBAIC04MTksMjIgKzEzODcsMjMgQEAKIH0KIAogLyoqCi0gKiAgaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdCAtIFVwZGF0ZXMgTUFDIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3NlcworICogIGl4Z2JlX3VwZGF0ZV9tY19hZGRyX2xpc3RfZ2VuZXJpYyAtIFVwZGF0ZXMgTUFDIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3NlcwogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAbWNfYWRkcl9saXN0OiB0aGUgbGlzdCBvZiBuZXcgbXVsdGljYXN0IGFkZHJlc3NlcwogICogIEBtY19hZGRyX2NvdW50OiBudW1iZXIgb2YgYWRkcmVzc2VzCi0gKiAgQHBhZDogbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gYWRkcmVzc2VzIGluIHRoZSBsaXN0CisgKiAgQG5leHQ6IGl0ZXJhdG9yIGZ1bmN0aW9uIHRvIHdhbGsgdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QKICAqCiAgKiAgVGhlIGdpdmVuIGxpc3QgcmVwbGFjZXMgYW55IGV4aXN0aW5nIGxpc3QuIENsZWFycyB0aGUgTUMgYWRkcnMgZnJvbSByZWNlaXZlCi0gKiAgYWRkcmVzcyByZWdpc3RlcnMgYW5kIHRoZSBtdWx0aWNhc3QgdGFibGUuIFVzZXMgdW5zZWQgcmVjZWl2ZSBhZGRyZXNzCisgKiAgYWRkcmVzcyByZWdpc3RlcnMgYW5kIHRoZSBtdWx0aWNhc3QgdGFibGUuIFVzZXMgdW51c2VkIHJlY2VpdmUgYWRkcmVzcwogICogIHJlZ2lzdGVycyBmb3IgdGhlIGZpcnN0IG11bHRpY2FzdCBhZGRyZXNzZXMsIGFuZCBoYXNoZXMgdGhlIHJlc3QgaW50byB0aGUKICAqICBtdWx0aWNhc3QgdGFibGUuCiAgKiovCi1zMzIgaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWNfYWRkcl9saXN0LAotCQkJICAgICAgdTMyIG1jX2FkZHJfY291bnQsIHUzMiBwYWQpCitzMzIgaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptY19hZGRyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBtY19hZGRyX2NvdW50LCBpeGdiZV9tY19hZGRyX2l0ciBuZXh0KQogewogCXUzMiBpOwotCXUzMiByYXJfZW50cmllcyA9IGh3LT5tYWMubnVtX3J4X2FkZHJzOworCXUzMiByYXJfZW50cmllcyA9IGh3LT5tYWMubnVtX3Jhcl9lbnRyaWVzOworCXUzMiB2bWRxOwogCiAJLyoKIAkgKiBTZXQgdGhlIG5ldyBudW1iZXIgb2YgTUMgYWRkcmVzc2VzIHRoYXQgd2UgYXJlIGJlaW5nIHJlcXVlc3RlZCB0bwpAQCAtODQ2LDcgKzE0MTUsOCBAQAogCWh3LT5hZGRyX2N0cmwubXRhX2luX3VzZSA9IDA7CiAKIAkvKiBaZXJvIG91dCB0aGUgb3RoZXIgcmVjZWl2ZSBhZGRyZXNzZXMuICovCi0JaHdfZGJnKGh3LCAiQ2xlYXJpbmcgUkFSWzEtMTVdXG4iKTsKKwlod19kYmcoaHcsICJDbGVhcmluZyBSQVJbJWQtJWRdXG4iLCBody0+YWRkcl9jdHJsLnJhcl91c2VkX2NvdW50LAorCSAgICAgICAgICByYXJfZW50cmllcyAtIDEpOwogCWZvciAoaSA9IGh3LT5hZGRyX2N0cmwucmFyX3VzZWRfY291bnQ7IGkgPCByYXJfZW50cmllczsgaSsrKSB7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkFMKGkpLCAwKTsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SQUgoaSksIDApOwpAQCAtODU0LDE4NiArMTQyNCw2NyBAQAogCiAJLyogQ2xlYXIgdGhlIE1UQSAqLwogCWh3X2RiZyhodywgIiBDbGVhcmluZyBNVEFcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9NQ19UQkxfU0laRTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm1jZnRfc2l6ZTsgaSsrKQogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01UQShpKSwgMCk7CiAKIAkvKiBBZGQgdGhlIG5ldyBhZGRyZXNzZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbWNfYWRkcl9jb3VudDsgaSsrKSB7CiAJCWh3X2RiZyhodywgIiBBZGRpbmcgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iKTsKLQkJaXhnYmVfYWRkX21jX2FkZHIoaHcsIG1jX2FkZHJfbGlzdCArCi0JCQkJICAoaSAqIChJWEdCRV9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpKSk7CisJCWl4Z2JlX2FkZF9tY19hZGRyKGh3LCBuZXh0KGh3LCAmbWNfYWRkcl9saXN0LCAmdm1kcSkpOwogCX0KIAogCS8qIEVuYWJsZSBtdGEgKi8KIAlpZiAoaHctPmFkZHJfY3RybC5tdGFfaW5fdXNlID4gMCkKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NQ1NUQ1RSTCwKLQkJCQlJWEdCRV9NQ1NUQ1RSTF9NRkUgfCBody0+bWFjLm1jX2ZpbHRlcl90eXBlKTsKKwkJICAgICAgICAgICAgICAgIElYR0JFX01DU1RDVFJMX01GRSB8IGh3LT5tYWMubWNfZmlsdGVyX3R5cGUpOwogCi0JaHdfZGJnKGh3LCAiaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdCBDb21wbGV0ZVxuIik7CisJaHdfZGJnKGh3LCAiaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdF9nZW5lcmljIENvbXBsZXRlXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiAgaXhnYmVfY2xlYXJfdmZ0YSAtIENsZWFyIFZMQU4gZmlsdGVyIHRhYmxlCisgKiAgaXhnYmVfZW5hYmxlX21jX2dlbmVyaWMgLSBFbmFibGUgbXVsdGljYXN0IGFkZHJlc3MgaW4gUkFSCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKLSAqICBDbGVhcnMgdGhlIFZMQU4gZmlsZXIgdGFibGUsIGFuZCB0aGUgVk1EcSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlcgorICogIEVuYWJsZXMgbXVsdGljYXN0IGFkZHJlc3MgaW4gUkFSIGFuZCB0aGUgdXNlIG9mIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZS4KICAqKi8KLXN0YXRpYyBzMzIgaXhnYmVfY2xlYXJfdmZ0YShzdHJ1Y3QgaXhnYmVfaHcgKmh3KQorczMyIGl4Z2JlX2VuYWJsZV9tY19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7Ci0JdTMyIG9mZnNldDsKLQl1MzIgdmxhbmJ5dGU7CisJdTMyIGk7CisJdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXM7CisJc3RydWN0IGl4Z2JlX2FkZHJfZmlsdGVyX2luZm8gKmEgPSAmaHctPmFkZHJfY3RybDsKIAotCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgSVhHQkVfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZGVEEob2Zmc2V0KSwgMCk7CisJaWYgKGEtPm1jX2FkZHJfaW5fcmFyX2NvdW50ID4gMCkKKwkJZm9yIChpID0gKHJhcl9lbnRyaWVzIC0gYS0+bWNfYWRkcl9pbl9yYXJfY291bnQpOworCQkgICAgIGkgPCByYXJfZW50cmllczsgaSsrKQorCQkJaXhnYmVfZW5hYmxlX3JhcihodywgaSk7CiAKLQlmb3IgKHZsYW5ieXRlID0gMDsgdmxhbmJ5dGUgPCA0OyB2bGFuYnl0ZSsrKQotCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IElYR0JFX1ZMQU5fRklMVEVSX1RCTF9TSVpFOyBvZmZzZXQrKykKLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkZUQVZJTkQodmxhbmJ5dGUsIG9mZnNldCksCi0JCQkJCTApOworCWlmIChhLT5tdGFfaW5fdXNlID4gMCkKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NQ1NUQ1RSTCwgSVhHQkVfTUNTVENUUkxfTUZFIHwKKwkJICAgICAgICAgICAgICAgIGh3LT5tYWMubWNfZmlsdGVyX3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIGl4Z2JlX3NldF92ZnRhIC0gU2V0IFZMQU4gZmlsdGVyIHRhYmxlCisgKiAgaXhnYmVfZGlzYWJsZV9tY19nZW5lcmljIC0gRGlzYWJsZSBtdWx0aWNhc3QgYWRkcmVzcyBpbiBSQVIKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCi0gKiAgQHZsYW46IFZMQU4gaWQgdG8gd3JpdGUgdG8gVkxBTiBmaWx0ZXIKLSAqICBAdmluZDogVk1EcSBvdXRwdXQgaW5kZXggdGhhdCBtYXBzIHF1ZXVlIHRvIFZMQU4gaWQgaW4gVkZUQQotICogIEB2bGFuX29uOiBib29sZWFuIGZsYWcgdG8gdHVybiBvbi9vZmYgVkxBTiBpbiBWRlRBCiAgKgotICogIFR1cm4gb24vb2ZmIHNwZWNpZmllZCBWTEFOIGluIHRoZSBWTEFOIGZpbHRlciB0YWJsZS4KKyAqICBEaXNhYmxlcyBtdWx0aWNhc3QgYWRkcmVzcyBpbiBSQVIgYW5kIHRoZSB1c2Ugb2YgdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlLgogICoqLwotczMyIGl4Z2JlX3NldF92ZnRhKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiB2bGFuLCB1MzIgdmluZCwKLQkJICAgYm9vbCB2bGFuX29uKQorczMyIGl4Z2JlX2Rpc2FibGVfbWNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewotCXUzMiBWZnRhSW5kZXg7Ci0JdTMyIEJpdE9mZnNldDsKLQl1MzIgVmZ0YVJlZzsKLQl1MzIgVmZ0YUJ5dGU7CisJdTMyIGk7CisJdTMyIHJhcl9lbnRyaWVzID0gaHctPm1hYy5udW1fcmFyX2VudHJpZXM7CisJc3RydWN0IGl4Z2JlX2FkZHJfZmlsdGVyX2luZm8gKmEgPSAmaHctPmFkZHJfY3RybDsKIAotCS8qIERldGVybWluZSAzMi1iaXQgd29yZCBwb3NpdGlvbiBpbiBhcnJheSAqLwotCVZmdGFJbmRleCA9ICh2bGFuID4+IDUpICYgMHg3RjsgICAvKiB1cHBlciBzZXZlbiBiaXRzICovCisJaWYgKGEtPm1jX2FkZHJfaW5fcmFyX2NvdW50ID4gMCkKKwkJZm9yIChpID0gKHJhcl9lbnRyaWVzIC0gYS0+bWNfYWRkcl9pbl9yYXJfY291bnQpOworCQkgICAgIGkgPCByYXJfZW50cmllczsgaSsrKQorCQkJaXhnYmVfZGlzYWJsZV9yYXIoaHcsIGkpOwogCi0JLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgKFZNRCkgcXVldWUgaW5kZXggKi8KLQlWZnRhQnl0ZSA9ICAoKHZsYW4gPj4gMykgJiAweDAzKTsgLyogYml0cyAoNDozKSBpbmRpY2F0aW5nIGJ5dGUgYXJyYXkgKi8KLQlCaXRPZmZzZXQgPSAodmxhbiAmIDB4NykgPDwgMjsgICAgLyogbG93ZXIgMyBiaXRzIGluZGljYXRlIG5pYmJsZSAqLwotCi0JLyogU2V0IHRoZSBuaWJibGUgZm9yIFZNRCBxdWV1ZSBpbmRleCAqLwotCVZmdGFSZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZUQVZJTkQoVmZ0YUJ5dGUsIFZmdGFJbmRleCkpOwotCVZmdGFSZWcgJj0gKH4oMHgwRiA8PCBCaXRPZmZzZXQpKTsKLQlWZnRhUmVnIHw9ICh2aW5kIDw8IEJpdE9mZnNldCk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRBVklORChWZnRhQnl0ZSwgVmZ0YUluZGV4KSwgVmZ0YVJlZyk7Ci0KLQkvKiBEZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaXQgZm9yIHRoaXMgVkxBTiBpZCAqLwotCUJpdE9mZnNldCA9IHZsYW4gJiAweDFGOwkgICAvKiBsb3dlciBmaXZlIGJpdHMgKi8KLQotCVZmdGFSZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZUQShWZnRhSW5kZXgpKTsKLQlpZiAodmxhbl9vbikKLQkJLyogVHVybiBvbiB0aGlzIFZMQU4gaWQgKi8KLQkJVmZ0YVJlZyB8PSAoMSA8PCBCaXRPZmZzZXQpOwotCWVsc2UKLQkJLyogVHVybiBvZmYgdGhpcyBWTEFOIGlkICovCi0JCVZmdGFSZWcgJj0gfigxIDw8IEJpdE9mZnNldCk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRBKFZmdGFJbmRleCksIFZmdGFSZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIGl4Z2JlX3NldHVwX2ZjIC0gQ29uZmlndXJlIGZsb3cgY29udHJvbCBzZXR0aW5ncwotICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqICBAcGFja2V0YnVmX251bTogcGFja2V0IGJ1ZmZlciBudW1iZXIgKDAtNykKLSAqCi0gKiAgQ29uZmlndXJlcyB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzIGJhc2VkIG9uIFNXIGNvbmZpZ3VyYXRpb24uCi0gKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciA4MDIuM3ggZmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24gb25seS4KLSAqKi8KLXMzMiBpeGdiZV9zZXR1cF9mYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCBzMzIgcGFja2V0YnVmX251bSkKLXsKLQl1MzIgZnJjdGxfcmVnOwotCXUzMiBybWNzX3JlZzsKLQotCWlmIChwYWNrZXRidWZfbnVtIDwgMCB8fCBwYWNrZXRidWZfbnVtID4gNykKLQkJaHdfZGJnKGh3LCAiSW52YWxpZCBwYWNrZXQgYnVmZmVyIG51bWJlciBbJWRdLCBleHBlY3RlZCByYW5nZSAiCi0JCSAgICAgICAiaXMgMC03XG4iLCBwYWNrZXRidWZfbnVtKTsKLQotCWZyY3RsX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9GQ1RSTCk7Ci0JZnJjdGxfcmVnICY9IH4oSVhHQkVfRkNUUkxfUkZDRSB8IElYR0JFX0ZDVFJMX1JQRkNFKTsKLQotCXJtY3NfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JNQ1MpOwotCXJtY3NfcmVnICY9IH4oSVhHQkVfUk1DU19URkNFX1BSSU9SSVRZIHwgSVhHQkVfUk1DU19URkNFXzgwMl8zWCk7Ci0KLQkvKgotCSAqIFdlIHdhbnQgdG8gc2F2ZSBvZmYgdGhlIG9yaWdpbmFsIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uIGp1c3QgaW4KLQkgKiBjYXNlIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHRoZW4gcmVjb25uZWN0ZWQgaW50byBhIGRpZmZlcmVudCBodWIKLQkgKiBvciBzd2l0Y2ggd2l0aCBkaWZmZXJlbnQgRmxvdyBDb250cm9sIGNhcGFiaWxpdGllcy4KLQkgKi8KLQlody0+ZmMudHlwZSA9IGh3LT5mYy5vcmlnaW5hbF90eXBlOwotCi0JLyoKLQkgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmxvd19jb250cm9sIiBwYXJhbWV0ZXIgYXJlOgotCSAqIDA6IEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCi0JICogMTogUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlIGZyYW1lcyBidXQgbm90Ci0JICogICAgc2VuZCBwYXVzZSBmcmFtZXMpLgotCSAqIDI6IFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMgYnV0IHdlIGRvIG5vdAotCSAqICAgIHN1cHBvcnQgcmVjZWl2aW5nIHBhdXNlIGZyYW1lcykKLQkgKiAzOiBCb3RoIFJ4IGFuZCBUWCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgYXJlIGVuYWJsZWQuCi0JICogb3RoZXI6IEludmFsaWQuCi0JICovCi0Jc3dpdGNoIChody0+ZmMudHlwZSkgewotCWNhc2UgaXhnYmVfZmNfbm9uZToKLQkJYnJlYWs7Ci0JY2FzZSBpeGdiZV9mY19yeF9wYXVzZToKLQkJLyoKLQkJICogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsCi0JCSAqIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQuCi0JCSAqLwotCQlmcmN0bF9yZWcgfD0gSVhHQkVfRkNUUkxfUkZDRTsKLQkJYnJlYWs7Ci0JY2FzZSBpeGdiZV9mY190eF9wYXVzZToKLQkJLyoKLQkJICogVFggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBSWCBGbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQsCi0JCSAqIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgotCQkgKi8KLQkJcm1jc19yZWcgfD0gSVhHQkVfUk1DU19URkNFXzgwMl8zWDsKLQkJYnJlYWs7Ci0JY2FzZSBpeGdiZV9mY19mdWxsOgotCQkvKgotCQkgKiBGbG93IGNvbnRyb2wgKGJvdGggUlggYW5kIFRYKSBpcyBlbmFibGVkIGJ5IGEgc29mdHdhcmUKLQkJICogb3Zlci1yaWRlLgotCQkgKi8KLQkJZnJjdGxfcmVnIHw9IElYR0JFX0ZDVFJMX1JGQ0U7Ci0JCXJtY3NfcmVnIHw9IElYR0JFX1JNQ1NfVEZDRV84MDJfM1g7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgMC0zLiAqLwotCQlod19kYmcoaHcsICJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogRW5hYmxlIDgwMi4zeCBiYXNlZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuICovCi0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1RSTCwgZnJjdGxfcmVnKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JNQ1MsIHJtY3NfcmVnKTsKLQotCS8qCi0JICogV2UgbmVlZCB0byBzZXQgdXAgdGhlIFJlY2VpdmUgVGhyZXNob2xkIGhpZ2ggYW5kIGxvdyB3YXRlcgotCSAqIG1hcmtzIGFzIHdlbGwgYXMgKG9wdGlvbmFsbHkpIGVuYWJsaW5nIHRoZSB0cmFuc21pc3Npb24gb2YKLQkgKiBYT04gZnJhbWVzLgotCSAqLwotCWlmIChody0+ZmMudHlwZSAmIGl4Z2JlX2ZjX3R4X3BhdXNlKSB7Ci0JCWlmIChody0+ZmMuc2VuZF94b24pIHsKLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNSVEwocGFja2V0YnVmX251bSksCi0JCQkJCShody0+ZmMubG93X3dhdGVyIHwgSVhHQkVfRkNSVExfWE9ORSkpOwotCQl9IGVsc2UgewotCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUTChwYWNrZXRidWZfbnVtKSwKLQkJCQkJaHctPmZjLmxvd193YXRlcik7Ci0JCX0KLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JUSChwYWNrZXRidWZfbnVtKSwKLQkJCQkoaHctPmZjLmhpZ2hfd2F0ZXIpfElYR0JFX0ZDUlRIX0ZDRU4pOwotCX0KLQotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNUVFYoMCksIGh3LT5mYy5wYXVzZV90aW1lKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDUlRWLCAoaHctPmZjLnBhdXNlX3RpbWUgPj4gMSkpOworCWlmIChhLT5tdGFfaW5fdXNlID4gMCkKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NQ1NUQ1RSTCwgaHctPm1hYy5tY19maWx0ZXJfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNDksMTMgKzE1MDAsMjQgQEAKICAqKi8KIHMzMiBpeGdiZV9kaXNhYmxlX3BjaWVfbWFzdGVyKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7Ci0JdTMyIGN0cmw7Ci0JczMyIGk7CisJdTMyIGk7CisJdTMyIHJlZ192YWw7CisJdTMyIG51bWJlcl9vZl9xdWV1ZXM7CiAJczMyIHN0YXR1cyA9IElYR0JFX0VSUl9NQVNURVJfUkVRVUVTVFNfUEVORElORzsKIAotCWN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfQ1RSTCk7Ci0JY3RybCB8PSBJWEdCRV9DVFJMX0dJT19ESVM7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9DVFJMLCBjdHJsKTsKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlIHVuaXQgYnkgc3RvcHBpbmcgZWFjaCBxdWV1ZSAqLworCW51bWJlcl9vZl9xdWV1ZXMgPSBody0+bWFjLm1heF9yeF9xdWV1ZXM7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9xdWV1ZXM7IGkrKykgeworCQlyZWdfdmFsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYRENUTChpKSk7CisJCWlmIChyZWdfdmFsICYgSVhHQkVfUlhEQ1RMX0VOQUJMRSkgeworCQkJcmVnX3ZhbCAmPSB+SVhHQkVfUlhEQ1RMX0VOQUJMRTsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhEQ1RMKGkpLCByZWdfdmFsKTsKKwkJfQorCX0KKworCXJlZ192YWwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfQ1RSTCk7CisJcmVnX3ZhbCB8PSBJWEdCRV9DVFJMX0dJT19ESVM7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9DVFJMLCByZWdfdmFsKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9QQ0lfTUFTVEVSX0RJU0FCTEVfVElNRU9VVDsgaSsrKSB7CiAJCWlmICghKElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9TVEFUVVMpICYgSVhHQkVfU1RBVFVTX0dJTykpIHsKQEAgLTEwNzAsMTEgKzE1MzIsMTEgQEAKIAogCiAvKioKLSAqICBpeGdiZV9hY3F1aXJlX3N3Zndfc3luYyAtIEFxdWlyZSBTV0ZXIHNlbWFwaG9yZQorICogIGl4Z2JlX2FjcXVpcmVfc3dmd19zeW5jIC0gQWNxdWlyZSBTV0ZXIHNlbWFwaG9yZQogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqICBAbWFzazogTWFzayB0byBzcGVjaWZ5IHdpY2ggc2VtYXBob3JlIHRvIGFjcXVpcmUKKyAqICBAbWFzazogTWFzayB0byBzcGVjaWZ5IHdoaWNoIHNlbWFwaG9yZSB0byBhY3F1aXJlCiAgKgotICogIEFxdWlyZXMgdGhlIFNXRlcgc2VtYXBob3JlIHRocm91Z2h0IHRoZSBHU1NSIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkCisgKiAgQWNxdWlyZXMgdGhlIFNXRlcgc2VtYXBob3JlIHRob3VnaHQgdGhlIEdTU1IgcmVnaXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQKICAqICBmdW5jdGlvbiAoQ1NSLCBQSFkwLCBQSFkxLCBFRVBST00sIEZsYXNoKQogICoqLwogczMyIGl4Z2JlX2FjcXVpcmVfc3dmd19zeW5jKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBtYXNrKQpAQCAtMTExNiw5ICsxNTc4LDkgQEAKIC8qKgogICogIGl4Z2JlX3JlbGVhc2Vfc3dmd19zeW5jIC0gUmVsZWFzZSBTV0ZXIHNlbWFwaG9yZQogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqICBAbWFzazogTWFzayB0byBzcGVjaWZ5IHdpY2ggc2VtYXBob3JlIHRvIHJlbGVhc2UKKyAqICBAbWFzazogTWFzayB0byBzcGVjaWZ5IHdoaWNoIHNlbWFwaG9yZSB0byByZWxlYXNlCiAgKgotICogIFJlbGVhc2VzIHRoZSBTV0ZXIHNlbWFwaG9yZSB0aHJvdWdodCB0aGUgR1NTUiByZWdpc3RlciBmb3IgdGhlIHNwZWNpZmllZAorICogIFJlbGVhc2VzIHRoZSBTV0ZXIHNlbWFwaG9yZSB0aG91Z2h0IHRoZSBHU1NSIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkCiAgKiAgZnVuY3Rpb24gKENTUiwgUEhZMCwgUEhZMSwgRUVQUk9NLCBGbGFzaCkKICAqKi8KIHZvaWQgaXhnYmVfcmVsZWFzZV9zd2Z3X3N5bmMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTE2IG1hc2spCkBAIC0xMTM1LDQ1ICsxNTk3LDMgQEAKIAlpeGdiZV9yZWxlYXNlX2VlcHJvbV9zZW1hcGhvcmUoaHcpOwogfQogCi0vKioKLSAqICBpeGdiZV9yZWFkX2FuYWxvZ19yZWc4IC0gUmVhZHMgOCBiaXQgQXRsYXMgYW5hbG9nIHJlZ2lzdGVyCi0gKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQotICogIEByZWc6IGFuYWxvZyByZWdpc3RlciB0byByZWFkCi0gKiAgQHZhbDogcmVhZCB2YWx1ZQotICoKLSAqICBQZXJmb3JtcyB3cml0ZSBvcGVyYXRpb24gdG8gYW5hbG9nIHJlZ2lzdGVyIHNwZWNpZmllZC4KLSAqKi8KLXMzMiBpeGdiZV9yZWFkX2FuYWxvZ19yZWc4KHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWcsIHU4ICp2YWwpCi17Ci0JdTMyICBhdGxhc19jdGw7Ci0KLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0FUTEFTQ1RMLAotCQkJSVhHQkVfQVRMQVNDVExfV1JJVEVfQ01EIHwgKHJlZyA8PCA4KSk7Ci0JSVhHQkVfV1JJVEVfRkxVU0goaHcpOwotCXVkZWxheSgxMCk7Ci0JYXRsYXNfY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0FUTEFTQ1RMKTsKLQkqdmFsID0gKHU4KWF0bGFzX2N0bDsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqICBpeGdiZV93cml0ZV9hbmFsb2dfcmVnOCAtIFdyaXRlcyA4IGJpdCBBdGxhcyBhbmFsb2cgcmVnaXN0ZXIKLSAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCi0gKiAgQHJlZzogYXRsYXMgcmVnaXN0ZXIgdG8gd3JpdGUKLSAqICBAdmFsOiB2YWx1ZSB0byB3cml0ZQotICoKLSAqICBQZXJmb3JtcyB3cml0ZSBvcGVyYXRpb24gdG8gQXRsYXMgYW5hbG9nIHJlZ2lzdGVyIHNwZWNpZmllZC4KLSAqKi8KLXMzMiBpeGdiZV93cml0ZV9hbmFsb2dfcmVnOChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnLCB1OCB2YWwpCi17Ci0JdTMyICBhdGxhc19jdGw7Ci0KLQlhdGxhc19jdGwgPSAocmVnIDw8IDgpIHwgdmFsOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfQVRMQVNDVEwsIGF0bGFzX2N0bCk7Ci0JSVhHQkVfV1JJVEVfRkxVU0goaHcpOwotCXVkZWxheSgxMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAppbmRleCBkZTZkZGQ1Li4xOTJmOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9jb21tb24uaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgMTAgR2lnYWJpdCBQQ0kgRXhwcmVzcyBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA3IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDggSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTIwLDcgKzIwLDYgQEAKICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KIAogICBDb250YWN0IEluZm9ybWF0aW9uOgotICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KICAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CiAgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKIApAQCAtMzEsMzQgKzMwLDQ1IEBACiAKICNpbmNsdWRlICJpeGdiZV90eXBlLmgiCiAKLXMzMiBpeGdiZV9pbml0X2h3KHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX3N0YXJ0X2h3KHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX2dldF9tYWNfYWRkcihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWFjX2FkZHIpOwotczMyIGl4Z2JlX3N0b3BfYWRhcHRlcihzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKLXMzMiBpeGdiZV9yZWFkX3BhcnRfbnVtKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqcGFydF9udW0pOworczMyIGl4Z2JlX2luaXRfb3BzX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CitzMzIgaXhnYmVfaW5pdF9od19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX3N0YXJ0X2h3X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CitzMzIgaXhnYmVfY2xlYXJfaHdfY250cnNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKK3MzMiBpeGdiZV9yZWFkX3BiYV9udW1fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnBiYV9udW0pOworczMyIGl4Z2JlX2dldF9tYWNfYWRkcl9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptYWNfYWRkcik7CitzMzIgaXhnYmVfZ2V0X2J1c19pbmZvX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CitzMzIgaXhnYmVfc3RvcF9hZGFwdGVyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CiAKLXMzMiBpeGdiZV9sZWRfb24oc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KTsKLXMzMiBpeGdiZV9sZWRfb2ZmKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCk7CitzMzIgaXhnYmVfbGVkX29uX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KTsKK3MzMiBpeGdiZV9sZWRfb2ZmX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KTsKIAotczMyIGl4Z2JlX2luaXRfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX3JlYWRfZWVwcm9tKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiAqZGF0YSk7Ci1zMzIgaXhnYmVfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiAqY2hlY2tzdW1fdmFsKTsKK3MzMiBpeGdiZV9pbml0X2VlcHJvbV9wYXJhbXNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKK3MzMiBpeGdiZV9yZWFkX2VlcHJvbV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiAqZGF0YSk7CitzMzIgaXhnYmVfcmVhZF9lZXByb21fYml0X2JhbmdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICpkYXRhKTsKK3MzMiBpeGdiZV92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW1fZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqY2hlY2tzdW1fdmFsKTsKK3MzMiBpeGdiZV91cGRhdGVfZWVwcm9tX2NoZWNrc3VtX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CiAKLXMzMiBpeGdiZV9zZXRfcmFyKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBpbmRleCwgdTggKmFkZHIsIHUzMiB2aW5kLAotCQkgIHUzMiBlbmFibGVfYWRkcik7Ci1zMzIgaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWNfYWRkcl9saXN0LAotCQkJICAgICAgdTMyIG1jX2FkZHJfY291bnQsIHUzMiBwYWQpOwotczMyIGl4Z2JlX3NldF92ZnRhKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiB2bGFuLCB1MzIgdmluZCwgYm9vbCB2bGFuX29uKTsKK3MzMiBpeGdiZV9zZXRfcmFyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4LCB1OCAqYWRkciwgdTMyIHZtZHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBlbmFibGVfYWRkcik7CitzMzIgaXhnYmVfY2xlYXJfcmFyX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KTsKK3MzMiBpeGdiZV9pbml0X3J4X2FkZHJzX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7CitzMzIgaXhnYmVfdXBkYXRlX21jX2FkZHJfbGlzdF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptY19hZGRyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBtY19hZGRyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9tY19hZGRyX2l0ciBmdW5jKTsKK3MzMiBpeGdiZV91cGRhdGVfdWNfYWRkcl9saXN0X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKmFkZHJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGFkZHJfY291bnQsIGl4Z2JlX21jX2FkZHJfaXRyIGZ1bmMpOworczMyIGl4Z2JlX2VuYWJsZV9tY19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX2Rpc2FibGVfbWNfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKKwogczMyIGl4Z2JlX3ZhbGlkYXRlX21hY19hZGRyKHU4ICptYWNfYWRkcik7Ci0KLXMzMiBpeGdiZV9zZXR1cF9mYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCBzMzIgcGFja3RldGJ1Zl9udW0pOwotCiBzMzIgaXhnYmVfYWNxdWlyZV9zd2Z3X3N5bmMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTE2IG1hc2spOwogdm9pZCBpeGdiZV9yZWxlYXNlX3N3Zndfc3luYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MTYgbWFzayk7CiBzMzIgaXhnYmVfZGlzYWJsZV9wY2llX21hc3RlcihzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIAotczMyIGl4Z2JlX3JlYWRfYW5hbG9nX3JlZzgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZywgdTggKnZhbCk7Ci1zMzIgaXhnYmVfd3JpdGVfYW5hbG9nX3JlZzgoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZywgdTggdmFsKTsKK3MzMiBpeGdiZV9yZWFkX2FuYWxvZ19yZWc4X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZywgdTggKnZhbCk7CitzMzIgaXhnYmVfd3JpdGVfYW5hbG9nX3JlZzhfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnLCB1OCB2YWwpOwogCiAjZGVmaW5lIElYR0JFX1dSSVRFX1JFRyhhLCByZWcsIHZhbHVlKSB3cml0ZWwoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIChyZWcpKSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCmluZGV4IDNlZmU1ZGQuLjgxYTljNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgTGludXggZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMCw3ICsyMCw2IEBACiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCiAKICAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CiAgIGUxMDAwLWRldmVsIE1haWxpbmcgTGlzdCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PgogICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CiAKQEAgLTQ4LDcgKzQ3LDcgQEAKIH07CiAKICNkZWZpbmUgSVhHQkVfU1RBVChtKSBzaXplb2YoKChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqKTApLT5tKSwgXAotCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaXhnYmVfYWRhcHRlciwgbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGl4Z2JlX2FkYXB0ZXIsIG0pCiBzdGF0aWMgc3RydWN0IGl4Z2JlX3N0YXRzIGl4Z2JlX2dzdHJpbmdzX3N0YXRzW10gPSB7CiAJeyJyeF9wYWNrZXRzIiwgSVhHQkVfU1RBVChuZXRfc3RhdHMucnhfcGFja2V0cyl9LAogCXsidHhfcGFja2V0cyIsIElYR0JFX1NUQVQobmV0X3N0YXRzLnR4X3BhY2tldHMpfSwKQEAgLTk1LDE0ICs5NCwxNSBAQAogfTsKIAogI2RlZmluZSBJWEdCRV9RVUVVRV9TVEFUU19MRU4gXAotCQkoKCgoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKiluZXRkZXYtPnByaXYpLT5udW1fdHhfcXVldWVzICsgXAotCQkgKChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqKW5ldGRldi0+cHJpdiktPm51bV9yeF9xdWV1ZXMpICogXAotCQkgKHNpemVvZihzdHJ1Y3QgaXhnYmVfcXVldWVfc3RhdHMpIC8gc2l6ZW9mKHU2NCkpKQotI2RlZmluZSBJWEdCRV9HTE9CQUxfU1RBVFNfTEVOCUFSUkFZX1NJWkUoaXhnYmVfZ3N0cmluZ3Nfc3RhdHMpCisgICAgICAgICAgICAgICAgKCgoKHN0cnVjdCBpeGdiZV9hZGFwdGVyICopbmV0ZGV2LT5wcml2KS0+bnVtX3R4X3F1ZXVlcyArIFwKKyAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqKW5ldGRldi0+cHJpdiktPm51bV9yeF9xdWV1ZXMpICogXAorICAgICAgICAgICAgICAgICAoc2l6ZW9mKHN0cnVjdCBpeGdiZV9xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KSkpCisjZGVmaW5lIElYR0JFX1NUQVRTX0xFTiAoSVhHQkVfR0xPQkFMX1NUQVRTX0xFTiArIElYR0JFX1FVRVVFX1NUQVRTX0xFTikKKyNkZWZpbmUgSVhHQkVfR0xPQkFMX1NUQVRTX0xFTiBBUlJBWV9TSVpFKGl4Z2JlX2dzdHJpbmdzX3N0YXRzKQogI2RlZmluZSBJWEdCRV9TVEFUU19MRU4gKElYR0JFX0dMT0JBTF9TVEFUU19MRU4gKyBJWEdCRV9RVUVVRV9TVEFUU19MRU4pCiAKIHN0YXRpYyBpbnQgaXhnYmVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CiAJaWYgKGh3LT5waHkubWVkaWFfdHlwZSA9PSBpeGdiZV9tZWRpYV90eXBlX2NvcHBlcikgewogCQllY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJICAgIFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQXV0b25lZyk7CiAKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF9UUCB8IEFEVkVSVElTRURfQXV0b25lZyk7CiAJCWlmIChody0+cGh5LmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMKQpAQCAtMTI2LDE0ICsxMjYsMTUgQEAKIAl9IGVsc2UgewogCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOwogCQllY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJICAgICBBRFZFUlRJU0VEX0ZJQlJFKTsKKwkJICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF9GSUJSRSk7CiAJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwogCX0KIAotCWFkYXB0ZXItPmh3Lm1hYy5vcHMuY2hlY2tfbGluayhodywgJihsaW5rX3NwZWVkKSwgJmxpbmtfdXApOworCWh3LT5tYWMub3BzLmNoZWNrX2xpbmsoaHcsICZsaW5rX3NwZWVkLCAmbGlua191cCwgZmFsc2UpOwogCWlmIChsaW5rX3VwKSB7CiAJCWVjbWQtPnNwZWVkID0gKGxpbmtfc3BlZWQgPT0gSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwpID8KLQkJCQlTUEVFRF8xMDAwMCA6IFNQRUVEXzEwMDA7CisJCSAgICAgICAgICAgICAgIFNQRUVEXzEwMDAwIDogU1BFRURfMTAwMDsKIAkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJfSBlbHNlIHsKIAkJZWNtZC0+c3BlZWQgPSAtMTsKQEAgLTE0NCw3ICsxNDUsNyBAQAogfQogCiBzdGF0aWMgaW50IGl4Z2JlX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMTY0LDcgKzE2NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC0xODIsNyArMTgzLDcgQEAKIH0KIAogc3RhdGljIGludCBpeGdiZV9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTIzMywxNSArMjM0LDE1IEBACiAKIHN0YXRpYyB1MzIgaXhnYmVfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlyZXR1cm4gKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX0NTVU0pICE9IDA7CisJcmV0dXJuIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAhPSAwOwogfQogCiBzdGF0aWMgaW50IGl4Z2JlX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQogewogCWlmIChkYXRhKQotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0pOwogCWVsc2UKLQkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19DU1VNOworCQluZXRkZXYtPmZlYXR1cmVzICY9IH4oTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODEsNyArMjgyLDcgQEAKICNkZWZpbmUgSVhHQkVfR0VUX1NUQVQoX0FfLCBfUl8pIF9BXy0+c3RhdHMuX1JfCiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTMxNSw3ICszMTYsOSBAQAogCXJlZ3NfYnVmZlsxN10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfR1JDKTsKIAogCS8qIEludGVycnVwdCAqLwotCXJlZ3NfYnVmZlsxOF0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRUlDUik7CisJLyogZG9uJ3QgcmVhZCBFSUNSIGJlY2F1c2UgaXQgY2FuIGNsZWFyIGludGVycnVwdCBjYXVzZXMsIGluc3RlYWQKKwkgKiByZWFkIEVJQ1Mgd2hpY2ggaXMgYSBzaGFkb3cgYnV0IGRvZXNuJ3QgY2xlYXIgRUlDUiAqLworCXJlZ3NfYnVmZlsxOF0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRUlDUyk7CiAJcmVnc19idWZmWzE5XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FSUNTKTsKIAlyZWdzX2J1ZmZbMjBdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VJTVMpOwogCXJlZ3NfYnVmZlsyMV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRUlNQyk7CkBAIC0zMjUsNyArMzI4LDcgQEAKIAlyZWdzX2J1ZmZbMjVdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0lWQVIoMCkpOwogCXJlZ3NfYnVmZlsyNl0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTVNJWFQpOwogCXJlZ3NfYnVmZlsyN10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTVNJWFBCQSk7Ci0JcmVnc19idWZmWzI4XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QQkFDTCk7CisJcmVnc19idWZmWzI4XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QQkFDTCgwKSk7CiAJcmVnc19idWZmWzI5XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9HUElFKTsKIAogCS8qIEZsb3cgQ29udHJvbCAqLwpAQCAtMzcxLDcgKzM3NCw3IEBACiAJCXJlZ3NfYnVmZls0ODIgKyBpXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SQUwoaSkpOwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlyZWdzX2J1ZmZbNDk4ICsgaV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUkFIKGkpKTsKLQlyZWdzX2J1ZmZbNTE0XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QU1JUWVBFKTsKKwlyZWdzX2J1ZmZbNTE0XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QU1JUWVBFKDApKTsKIAlyZWdzX2J1ZmZbNTE1XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9GQ1RSTCk7CiAJcmVnc19idWZmWzUxNl0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7CiAJcmVnc19idWZmWzUxN10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTUNTVENUUkwpOwpAQCAtNDE5LDcgKzQyMiw2IEBACiAJcmVnc19idWZmWzgyN10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfV1VQTSk7CiAJcmVnc19idWZmWzgyOF0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkhGVCk7CiAKLQkvKiBEQ0UgKi8KIAlyZWdzX2J1ZmZbODI5XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9STUNTKTsKIAlyZWdzX2J1ZmZbODMwXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9EUE1DUyk7CiAJcmVnc19idWZmWzgzMV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUERQTUNTKTsKQEAgLTUzOSwyMSArNTQxLDE3IEBACiAJLyogRGlhZ25vc3RpYyAqLwogCXJlZ3NfYnVmZlsxMDcxXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SRFNUQVRDVEwpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXJlZ3NfYnVmZlsxMDcyXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SRFNUQVQoaSkpOworCQlyZWdzX2J1ZmZbMTA3MiArIGldID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JEU1RBVChpKSk7CiAJcmVnc19idWZmWzEwODBdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JESE1QTik7Ci0JcmVnc19idWZmWzEwODFdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JJQ19EVzApOwotCXJlZ3NfYnVmZlsxMDgyXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SSUNfRFcxKTsKLQlyZWdzX2J1ZmZbMTA4M10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUklDX0RXMik7Ci0JcmVnc19idWZmWzEwODRdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JJQ19EVzMpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXJlZ3NfYnVmZlsxMDgxICsgaV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUklDX0RXKGkpKTsKIAlyZWdzX2J1ZmZbMTA4NV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUkRQUk9CRSk7CiAJcmVnc19idWZmWzEwODZdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1REU1RBVENUTCk7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJcmVnc19idWZmWzEwODddID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1REU1RBVChpKSk7CisJCXJlZ3NfYnVmZlsxMDg3ICsgaV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVERTVEFUKGkpKTsKIAlyZWdzX2J1ZmZbMTA5NV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVERITVBOKTsKLQlyZWdzX2J1ZmZbMTA5Nl0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVElDX0RXMCk7Ci0JcmVnc19idWZmWzEwOTddID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1RJQ19EVzEpOwotCXJlZ3NfYnVmZlsxMDk4XSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9USUNfRFcyKTsKLQlyZWdzX2J1ZmZbMTA5OV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVElDX0RXMyk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJcmVnc19idWZmWzEwOTYgKyBpXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9USUNfRFcoaSkpOwogCXJlZ3NfYnVmZlsxMTAwXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9URFBST0JFKTsKIAlyZWdzX2J1ZmZbMTEwMV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVFhCVUZDVFJMKTsKIAlyZWdzX2J1ZmZbMTEwMl0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVFhCVUZEQVRBMCk7CkBAIC01NjYsNyArNTY0LDcgQEAKIAlyZWdzX2J1ZmZbMTEwOV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhCVUZEQVRBMik7CiAJcmVnc19idWZmWzExMTBdID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYQlVGREFUQTMpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXJlZ3NfYnVmZlsxMTExXSA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QQ0lFX0RJQUcoaSkpOworCQlyZWdzX2J1ZmZbMTExMSArIGldID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BDSUVfRElBRyhpKSk7CiAJcmVnc19idWZmWzExMTldID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JGVkFMKTsKIAlyZWdzX2J1ZmZbMTEyMF0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTURGVEMxKTsKIAlyZWdzX2J1ZmZbMTEyMV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTURGVEMyKTsKQEAgLTU4NSw3ICs1ODMsNyBAQAogfQogCiBzdGF0aWMgaW50IGl4Z2JlX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC02MDgsOCArNjA2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgZWVwcm9tX2xlbjsgaSsrKSB7Ci0JCWlmICgocmV0X3ZhbCA9IGl4Z2JlX3JlYWRfZWVwcm9tKGh3LCBmaXJzdF93b3JkICsgaSwKLQkJCQkJCSAmZWVwcm9tX2J1ZmZbaV0pKSkKKwkJaWYgKChyZXRfdmFsID0gaHctPmVlcHJvbS5vcHMucmVhZChodywgZmlyc3Rfd29yZCArIGksCisJCSAgICAmZWVwcm9tX2J1ZmZbaV0pKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtNjI0LDcgKzYyMiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTYzNyw3ICs2MzUsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZzsKQEAgLTY1NCwxNSArNjUyLDEyIEBACiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBpeGdiZV90eF9idWZmZXIgKm9sZF9idWY7Ci0Jc3RydWN0IGl4Z2JlX3J4X2J1ZmZlciAqb2xkX3J4X2J1ZjsKLQl2b2lkICpvbGRfZGVzYzsKKwlzdHJ1Y3QgaXhnYmVfcmluZyAqdGVtcF9yaW5nOwogCWludCBpLCBlcnI7Ci0JdTMyIG5ld19yeF9jb3VudCwgbmV3X3R4X2NvdW50LCBvbGRfc2l6ZTsKLQlkbWFfYWRkcl90IG9sZF9kbWE7CisJdTMyIG5ld19yeF9jb3VudCwgbmV3X3R4X2NvdW50OwogCiAJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02ODEsNiArNjc2LDE1IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChhZGFwdGVyLT5udW1fdHhfcXVldWVzID4gYWRhcHRlci0+bnVtX3J4X3F1ZXVlcykKKwkJdGVtcF9yaW5nID0gdm1hbGxvYyhhZGFwdGVyLT5udW1fdHhfcXVldWVzICoKKwkJICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGl4Z2JlX3JpbmcpKTsKKwllbHNlCisJCXRlbXBfcmluZyA9IHZtYWxsb2MoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyAqCisJCSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpeGdiZV9yaW5nKSk7CisJaWYgKCF0ZW1wX3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCiAJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JWEdCRV9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCW1zbGVlcCgxKTsKIApAQCAtNjkzLDY2ICs2OTcsNjEgQEAKIAkgKiB0byB0aGUgdHggYW5kIHJ4IHJpbmcgc3RydWN0cy4KIAkgKi8KIAlpZiAobmV3X3R4X2NvdW50ICE9IGFkYXB0ZXItPnR4X3JpbmctPmNvdW50KSB7CisJCW1lbWNweSh0ZW1wX3JpbmcsIGFkYXB0ZXItPnR4X3JpbmcsCisJCSAgICAgICBhZGFwdGVyLT5udW1fdHhfcXVldWVzICogc2l6ZW9mKHN0cnVjdCBpeGdiZV9yaW5nKSk7CisKIAkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgewotCQkJLyogU2F2ZSBleGlzdGluZyBkZXNjcmlwdG9yIHJpbmcgKi8KLQkJCW9sZF9idWYgPSBhZGFwdGVyLT50eF9yaW5nW2ldLnR4X2J1ZmZlcl9pbmZvOwotCQkJb2xkX2Rlc2MgPSBhZGFwdGVyLT50eF9yaW5nW2ldLmRlc2M7Ci0JCQlvbGRfc2l6ZSA9IGFkYXB0ZXItPnR4X3JpbmdbaV0uc2l6ZTsKLQkJCW9sZF9kbWEgPSBhZGFwdGVyLT50eF9yaW5nW2ldLmRtYTsKLQkJCS8qIFRyeSB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KLQkJCWFkYXB0ZXItPnR4X3JpbmdbaV0udHhfYnVmZmVyX2luZm8gPSBOVUxMOwotCQkJYWRhcHRlci0+dHhfcmluZ1tpXS5kZXNjID0gTlVMTDsKLQkJCWFkYXB0ZXItPnR4X3JpbmdbaV0uY291bnQgPSBuZXdfdHhfY291bnQ7Ci0JCQllcnIgPSBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwKLQkJCQkJCSAgICAgICAmYWRhcHRlci0+dHhfcmluZ1tpXSk7CisJCQl0ZW1wX3JpbmdbaV0uY291bnQgPSBuZXdfdHhfY291bnQ7CisJCQllcnIgPSBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwgJnRlbXBfcmluZ1tpXSk7CiAJCQlpZiAoZXJyKSB7Ci0JCQkJLyogUmVzdG9yZSB0aGUgb2xkIG9uZSBzbyBhdCBsZWFzdAotCQkJCSAgIHRoZSBhZGFwdGVyIHN0aWxsIHdvcmtzLCBldmVuIGlmCi0JCQkJICAgd2UgZmFpbGVkIHRoZSByZXF1ZXN0ICovCi0JCQkJYWRhcHRlci0+dHhfcmluZ1tpXS50eF9idWZmZXJfaW5mbyA9IG9sZF9idWY7Ci0JCQkJYWRhcHRlci0+dHhfcmluZ1tpXS5kZXNjID0gb2xkX2Rlc2M7Ci0JCQkJYWRhcHRlci0+dHhfcmluZ1tpXS5zaXplID0gb2xkX3NpemU7Ci0JCQkJYWRhcHRlci0+dHhfcmluZ1tpXS5kbWEgPSBvbGRfZG1hOworCQkJCXdoaWxlIChpKSB7CisJCQkJCWktLTsKKwkJCQkJaXhnYmVfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBfcmluZ1tpXSk7CisJCQkJfQogCQkJCWdvdG8gZXJyX3NldHVwOwogCQkJfQotCQkJLyogRnJlZSB0aGUgb2xkIGJ1ZmZlciBtYW51YWxseSAqLwotCQkJdmZyZWUob2xkX2J1Zik7Ci0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIG9sZF9zaXplLAotCQkJCQkgICAgb2xkX2Rlc2MsIG9sZF9kbWEpOwogCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKKwkJCWl4Z2JlX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsICZhZGFwdGVyLT50eF9yaW5nW2ldKTsKKworCQltZW1jcHkoYWRhcHRlci0+dHhfcmluZywgdGVtcF9yaW5nLAorCQkgICAgICAgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyAqIHNpemVvZihzdHJ1Y3QgaXhnYmVfcmluZykpOworCisJCWFkYXB0ZXItPnR4X3JpbmdfY291bnQgPSBuZXdfdHhfY291bnQ7CiAJfQogCiAJaWYgKG5ld19yeF9jb3VudCAhPSBhZGFwdGVyLT5yeF9yaW5nLT5jb3VudCkgeworCQltZW1jcHkodGVtcF9yaW5nLCBhZGFwdGVyLT5yeF9yaW5nLAorCQkgICAgICAgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyAqIHNpemVvZihzdHJ1Y3QgaXhnYmVfcmluZykpOworCiAJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspIHsKLQotCQkJb2xkX3J4X2J1ZiA9IGFkYXB0ZXItPnJ4X3JpbmdbaV0ucnhfYnVmZmVyX2luZm87Ci0JCQlvbGRfZGVzYyA9IGFkYXB0ZXItPnJ4X3JpbmdbaV0uZGVzYzsKLQkJCW9sZF9zaXplID0gYWRhcHRlci0+cnhfcmluZ1tpXS5zaXplOwotCQkJb2xkX2RtYSA9IGFkYXB0ZXItPnJ4X3JpbmdbaV0uZG1hOwotCi0JCQlhZGFwdGVyLT5yeF9yaW5nW2ldLnJ4X2J1ZmZlcl9pbmZvID0gTlVMTDsKLQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0uZGVzYyA9IE5VTEw7Ci0JCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmRtYSA9IDA7Ci0JCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50ID0gbmV3X3J4X2NvdW50OwotCQkJZXJyID0gaXhnYmVfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsCi0JCQkJCQkgICAgICAgJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOworCQkJdGVtcF9yaW5nW2ldLmNvdW50ID0gbmV3X3J4X2NvdW50OworCQkJZXJyID0gaXhnYmVfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsICZ0ZW1wX3JpbmdbaV0pOwogCQkJaWYgKGVycikgewotCQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0ucnhfYnVmZmVyX2luZm8gPSBvbGRfcnhfYnVmOwotCQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0uZGVzYyA9IG9sZF9kZXNjOwotCQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0uc2l6ZSA9IG9sZF9zaXplOwotCQkJCWFkYXB0ZXItPnJ4X3JpbmdbaV0uZG1hID0gb2xkX2RtYTsKKwkJCQl3aGlsZSAoaSkgeworCQkJCQlpLS07CisJCQkJCWl4Z2JlX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wX3JpbmdbaV0pOworCQkJCX0KIAkJCQlnb3RvIGVycl9zZXR1cDsKIAkJCX0KLQotCQkJdmZyZWUob2xkX3J4X2J1Zik7Ci0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIG9sZF9zaXplLCBvbGRfZGVzYywKLQkJCQkJICAgIG9sZF9kbWEpOwogCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKKwkJCWl4Z2JlX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9yaW5nW2ldKTsKKworCQltZW1jcHkoYWRhcHRlci0+cnhfcmluZywgdGVtcF9yaW5nLAorCQkgICAgICAgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyAqIHNpemVvZihzdHJ1Y3QgaXhnYmVfcmluZykpOworCisJCWFkYXB0ZXItPnJ4X3JpbmdfY291bnQgPSBuZXdfcnhfY291bnQ7CiAJfQogCisJLyogc3VjY2VzcyEgKi8KIAllcnIgPSAwOwogZXJyX3NldHVwOgotCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJaXhnYmVfdXAoYWRhcHRlcik7CiAKIAljbGVhcl9iaXQoX19JWEdCRV9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CkBAIC03NzAsNyArNzY5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTY0ICpxdWV1ZV9zdGF0OwpAQCAtNzc4LDEyICs3NzcsMjAgQEAKIAlpbnQgaiwgazsKIAlpbnQgaTsKIAl1NjQgYWdncmVnYXRlZCA9IDAsIGZsdXNoZWQgPSAwLCBub19kZXNjID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7CisJCWFnZ3JlZ2F0ZWQgKz0gYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLnN0YXRzLmFnZ3JlZ2F0ZWQ7CisJCWZsdXNoZWQgKz0gYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLnN0YXRzLmZsdXNoZWQ7CisJCW5vX2Rlc2MgKz0gYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLnN0YXRzLm5vX2Rlc2M7CisJfQorCWFkYXB0ZXItPmxyb19hZ2dyZWdhdGVkID0gYWdncmVnYXRlZDsKKwlhZGFwdGVyLT5scm9fZmx1c2hlZCA9IGZsdXNoZWQ7CisJYWRhcHRlci0+bHJvX25vX2Rlc2MgPSBub19kZXNjOwogCiAJaXhnYmVfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKIAkJY2hhciAqcCA9IChjaGFyICopYWRhcHRlciArIGl4Z2JlX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OwogCQlkYXRhW2ldID0gKGl4Z2JlX2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09Ci0JCQkgICBzaXplb2YodTY0KSkgPyAqKHU2NCAqKXAgOiAqKHUzMiAqKXA7CisJCSAgICAgICAgICAgc2l6ZW9mKHU2NCkpID8gKih1NjQgKilwIDogKih1MzIgKilwOwogCX0KIAlmb3IgKGogPSAwOyBqIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaisrKSB7CiAJCXF1ZXVlX3N0YXQgPSAodTY0ICopJmFkYXB0ZXItPnR4X3Jpbmdbal0uc3RhdHM7CkBAIC03OTIsMjQgKzc5OSwxOCBAQAogCQlpICs9IGs7CiAJfQogCWZvciAoaiA9IDA7IGogPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBqKyspIHsKLQkJYWdncmVnYXRlZCArPSBhZGFwdGVyLT5yeF9yaW5nW2pdLmxyb19tZ3Iuc3RhdHMuYWdncmVnYXRlZDsKLQkJZmx1c2hlZCArPSBhZGFwdGVyLT5yeF9yaW5nW2pdLmxyb19tZ3Iuc3RhdHMuZmx1c2hlZDsKLQkJbm9fZGVzYyArPSBhZGFwdGVyLT5yeF9yaW5nW2pdLmxyb19tZ3Iuc3RhdHMubm9fZGVzYzsKIAkJcXVldWVfc3RhdCA9ICh1NjQgKikmYWRhcHRlci0+cnhfcmluZ1tqXS5zdGF0czsKIAkJZm9yIChrID0gMDsgayA8IHN0YXRfY291bnQ7IGsrKykKIAkJCWRhdGFbaSArIGtdID0gcXVldWVfc3RhdFtrXTsKIAkJaSArPSBrOwogCX0KLQlhZGFwdGVyLT5scm9fYWdncmVnYXRlZCA9IGFnZ3JlZ2F0ZWQ7Ci0JYWRhcHRlci0+bHJvX2ZsdXNoZWQgPSBmbHVzaGVkOwotCWFkYXB0ZXItPmxyb19ub19kZXNjID0gbm9fZGVzYzsKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwKLQkJCSAgICAgIHU4ICpkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXU4ICpwID0gZGF0YTsKKwljaGFyICpwID0gKGNoYXIgKilkYXRhOwogCWludCBpOwogCiAJc3dpdGNoIChzdHJpbmdzZXQpIHsKQEAgLTgzMSwxNCArODMyLDE0IEBACiAJCQlzcHJpbnRmKHAsICJyeF9xdWV1ZV8ldV9ieXRlcyIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KLS8qCQlCVUdfT04ocCAtIGRhdGEgIT0gSVhHQkVfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsgKi8KKwkJLyogQlVHX09OKHAgLSBkYXRhICE9IElYR0JFX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7ICovCiAJCWJyZWFrOwogCX0KIH0KIAogCiBzdGF0aWMgdm9pZCBpeGdiZV9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXdvbC0+c3VwcG9ydGVkID0gMDsKIAl3b2wtPndvbG9wdHMgPSAwOwpAQCAtODU5LDE2ICs4NjAsMTcgQEAKIHN0YXRpYyBpbnQgaXhnYmVfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTMyIGxlZF9yZWcgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0xFRENUTCk7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgbGVkX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9MRURDVEwpOwogCXUzMiBpOwogCiAJaWYgKCFkYXRhIHx8IGRhdGEgPiAzMDApCiAJCWRhdGEgPSAzMDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKGRhdGEgKiAxMDAwKTsgaSArPSA0MDApIHsKLQkJaXhnYmVfbGVkX29uKCZhZGFwdGVyLT5odywgSVhHQkVfTEVEX09OKTsKKwkJaHctPm1hYy5vcHMubGVkX29uKGh3LCBJWEdCRV9MRURfT04pOwogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDApOwotCQlpeGdiZV9sZWRfb2ZmKCZhZGFwdGVyLT5odywgSVhHQkVfTEVEX09OKTsKKwkJaHctPm1hYy5vcHMubGVkX29mZihodywgSVhHQkVfTEVEX09OKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjAwKTsKIAl9CiAKQEAgLTg3OSw2NyArODgxLDc1IEBACiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JaWYgKGFkYXB0ZXItPnJ4X2VpdHIgPCBJWEdCRV9NSU5fSVRSX1VTRUNTKQotCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSBhZGFwdGVyLT5yeF9laXRyOwotCWVsc2UKLQkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTAwMDAwMCAvIGFkYXB0ZXItPnJ4X2VpdHI7Ci0KLQlpZiAoYWRhcHRlci0+dHhfZWl0ciA8IElYR0JFX01JTl9JVFJfVVNFQ1MpCi0JCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPnR4X2VpdHI7Ci0JZWxzZQotCQllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSAxMDAwMDAwIC8gYWRhcHRlci0+dHhfZWl0cjsKLQogCWVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSBhZGFwdGVyLT50eF9yaW5nWzBdLndvcmtfbGltaXQ7CisKKwkvKiBvbmx5IHZhbGlkIGlmIGluIGNvbnN0YW50IElUUiBtb2RlICovCisJc3dpdGNoIChhZGFwdGVyLT5pdHJfc2V0dGluZykgeworCWNhc2UgMDoKKwkJLyogdGhyb3R0bGluZyBkaXNhYmxlZCAqLworCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIGR5bmFtaWMgSVRSIG1vZGUgKi8KKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZml4ZWQgaW50ZXJydXB0IHJhdGUgbW9kZSAqLworCQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSAxMDAwMDAwL2FkYXB0ZXItPmVpdHJfcGFyYW07CisJCWJyZWFrOworCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpeGdiZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IElYR0JFX01BWF9JVFJfVVNFQ1MpIHx8Ci0JICAgICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzICE9IDApICYmCi0JICAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzICE9IDEpICYmCi0JICAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzICE9IDMpICYmCi0JICAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDwgSVhHQkVfTUlOX0lUUl9VU0VDUykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IElYR0JFX01BWF9JVFJfVVNFQ1MpIHx8Ci0JICAgICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzICE9IDApICYmCi0JICAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzICE9IDEpICYmCi0JICAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzICE9IDMpICYmCi0JICAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzIDwgSVhHQkVfTUlOX0lUUl9VU0VDUykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGNvbnZlcnQgdG8gcmF0ZSBvZiBpcnEncyBwZXIgc2Vjb25kICovCi0JaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA8IElYR0JFX01JTl9JVFJfVVNFQ1MpCi0JCWFkYXB0ZXItPnJ4X2VpdHIgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0JZWxzZQotCQlhZGFwdGVyLT5yeF9laXRyID0gKDEwMDAwMDAgLyBlYy0+cnhfY29hbGVzY2VfdXNlY3MpOwotCi0JaWYgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA8IElYR0JFX01JTl9JVFJfVVNFQ1MpCi0JCWFkYXB0ZXItPnR4X2VpdHIgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0JZWxzZQotCQlhZGFwdGVyLT50eF9laXRyID0gKDEwMDAwMDAgLyBlYy0+dHhfY29hbGVzY2VfdXNlY3MpOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJaW50IGk7CiAKIAlpZiAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKLQkJYWRhcHRlci0+dHhfcmluZ1swXS53b3JrX2xpbWl0ID0KLQkJCQkJZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKKwkJYWRhcHRlci0+dHhfcmluZ1swXS53b3JrX2xpbWl0ID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKIAotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJaXhnYmVfZG93bihhZGFwdGVyKTsKLQkJaXhnYmVfdXAoYWRhcHRlcik7CisJaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IDEpIHsKKwkJLyogc3RvcmUgdGhlIHZhbHVlIGluIGludHMvc2Vjb25kICovCisJCWFkYXB0ZXItPmVpdHJfcGFyYW0gPSAxMDAwMDAwL2VjLT5yeF9jb2FsZXNjZV91c2VjczsKKworCQkvKiBzdGF0aWMgdmFsdWUgb2YgaW50ZXJydXB0IHJhdGUgKi8KKwkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5laXRyX3BhcmFtOworCQkvKiBjbGVhciB0aGUgbG93ZXIgYml0ICovCisJCWFkYXB0ZXItPml0cl9zZXR0aW5nICY9IH4xOworCX0gZWxzZSBpZiAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDEpIHsKKwkJLyogMSBtZWFucyBkeW5hbWljIG1vZGUgKi8KKwkJYWRhcHRlci0+ZWl0cl9wYXJhbSA9IDIwMDAwOworCQlhZGFwdGVyLT5pdHJfc2V0dGluZyA9IDE7CisJfSBlbHNlIHsKKwkJLyogYW55IG90aGVyIHZhbHVlIG1lYW5zIGRpc2FibGUgZWl0ciwgd2hpY2ggaXMgYmVzdAorCQkgKiBzZXJ2ZWQgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IHJhdGUgdmVyeSBoaWdoICovCisJCWFkYXB0ZXItPmVpdHJfcGFyYW0gPSAzMDAwMDAwOworCQlhZGFwdGVyLT5pdHJfc2V0dGluZyA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05fUV9WRUNUT1JTOyBpKyspIHsKKwkJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcltpXTsKKwkJaWYgKHFfdmVjdG9yLT50eHJfY291bnQgJiYgIXFfdmVjdG9yLT5yeHJfY291bnQpCisJCQlxX3ZlY3Rvci0+ZWl0ciA9IChhZGFwdGVyLT5laXRyX3BhcmFtID4+IDEpOworCQllbHNlCisJCQkvKiByeCBvbmx5IG9yIG1peGVkICovCisJCQlxX3ZlY3Rvci0+ZWl0ciA9IGFkYXB0ZXItPmVpdHJfcGFyYW07CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlUUihpKSwKKwkJICAgICAgICAgICAgICAgIEVJVFJfSU5UU19QRVJfU0VDX1RPX1JFRyhxX3ZlY3Rvci0+ZWl0cikpOwogCX0KIAogCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaXhnYmVfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGl4Z2JlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgICAgICAgICAgID0gaXhnYmVfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MgICAgICAgICAgID0gaXhnYmVfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyAgICAgICAgICAgID0gaXhnYmVfZ2V0X2RydmluZm8sCkBAIC05NjYsNyArOTc2LDcgQEAKIAkuc2V0X3RzbyAgICAgICAgICAgICAgICA9IGl4Z2JlX3NldF90c28sCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBpeGdiZV9nZXRfc3RyaW5ncywKIAkucGh5c19pZCAgICAgICAgICAgICAgICA9IGl4Z2JlX3BoeXNfaWQsCi0JLmdldF9zc2V0X2NvdW50CQk9IGl4Z2JlX2dldF9zc2V0X2NvdW50LAorCS5nZXRfc3NldF9jb3VudCAgICAgICAgID0gaXhnYmVfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBpeGdiZV9nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X2NvYWxlc2NlICAgICAgICAgICA9IGl4Z2JlX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlICAgICAgICAgICA9IGl4Z2JlX3NldF9jb2FsZXNjZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCBhNDE3YmU3Li5jYTE3YWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCAxMCBHaWdhYml0IFBDSSBFeHByZXNzIExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjAsNyArMjAsNiBAQAogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogCiAgIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgogICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogCkBAIC00NiwxNSArNDUsMTQgQEAKIAogY2hhciBpeGdiZV9kcml2ZXJfbmFtZVtdID0gIml4Z2JlIjsKIHN0YXRpYyBjb25zdCBjaGFyIGl4Z2JlX2RyaXZlcl9zdHJpbmdbXSA9Ci0JIkludGVsKFIpIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgTmV0d29yayBEcml2ZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVsKFIpIDEwIEdpZ2FiaXQgUENJIEV4cHJlc3MgTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjMuMTgtazQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjMuMzAtazIiCiBjb25zdCBjaGFyIGl4Z2JlX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKLXN0YXRpYyBjb25zdCBjaGFyIGl4Z2JlX2NvcHlyaWdodFtdID0KLQkgIkNvcHlyaWdodCAoYykgMTk5OS0yMDA3IEludGVsIENvcnBvcmF0aW9uLiI7CitzdGF0aWMgY2hhciBpeGdiZV9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl4Z2JlX2luZm8gKml4Z2JlX2luZm9fdGJsW10gPSB7Ci0JW2JvYXJkXzgyNTk4XQkJCT0gJml4Z2JlXzgyNTk4X2luZm8sCisJW2JvYXJkXzgyNTk4XSA9ICZpeGdiZV84MjU5OF9pbmZvLAogfTsKIAogLyogaXhnYmVfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUKQEAgLTc0LDE1ICs3MiwxNyBAQAogCSBib2FyZF84MjU5OCB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEXzgyNTk4X0NYNF9EVUFMX1BPUlQpLAogCSBib2FyZF84MjU5OCB9LAorCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEXzgyNTk4RUJfWEZfTFIpLAorCSBib2FyZF84MjU5OCB9LAogCiAJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLwogCXswLCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl4Z2JlX3BjaV90YmwpOwogCi0jaWZkZWYgQ09ORklHX0RDQQorI2lmIGRlZmluZWQoQ09ORklHX0RDQSkgfHwgZGVmaW5lZChDT05GSUdfRENBX01PRFVMRSkKIHN0YXRpYyBpbnQgaXhnYmVfbm90aWZ5X2RjYShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBldmVudCwKLQkJCSAgICB2b2lkICpwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwKTsKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGNhX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gaXhnYmVfbm90aWZ5X2RjYSwKIAkubmV4dCAgICAgICAgICA9IE5VTEwsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkvKiBMZXQgZmlybXdhcmUgdGFrZSBvdmVyIGNvbnRyb2wgb2YgaC93ICovCiAJY3RybF9leHQgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0NUUkxfRVhUKTsKIAlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9DVFJMX0VYVCwKLQkJCWN0cmxfZXh0ICYgfklYR0JFX0NUUkxfRVhUX0RSVl9MT0FEKTsKKwkgICAgICAgICAgICAgICAgY3RybF9leHQgJiB+SVhHQkVfQ1RSTF9FWFRfRFJWX0xPQUQpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9nZXRfaHdfY29udHJvbChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTExNCwyNCArMTE0LDExIEBACiAJLyogTGV0IGZpcm13YXJlIGtub3cgdGhlIGRyaXZlciBoYXMgdGFrZW4gb3ZlciAqLwogCWN0cmxfZXh0ID0gSVhHQkVfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9DVFJMX0VYVCk7CiAJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfQ1RSTF9FWFQsCi0JCQljdHJsX2V4dCB8IElYR0JFX0NUUkxfRVhUX0RSVl9MT0FEKTsKKwkgICAgICAgICAgICAgICAgY3RybF9leHQgfCBJWEdCRV9DVFJMX0VYVF9EUlZfTE9BRCk7CiB9CiAKLSNpZmRlZiBERUJVRwotLyoqCi0gKiBpeGdiZV9nZXRfaHdfZGV2X25hbWUgLSByZXR1cm4gZGV2aWNlIG5hbWUgc3RyaW5nCi0gKiB1c2VkIGJ5IGhhcmR3YXJlIGxheWVyIHRvIHByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICoqLwotY2hhciAqaXhnYmVfZ2V0X2h3X2Rldl9uYW1lKHN0cnVjdCBpeGdiZV9odyAqaHcpCi17Ci0Jc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXJldHVybiBuZXRkZXYtPm5hbWU7Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgaXhnYmVfc2V0X2l2YXIoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBpbnRfYWxsb2NfZW50cnksCi0JCQkgICB1OCBtc2l4X3ZlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IG1zaXhfdmVjdG9yKQogewogCXUzMiBpdmFyLCBpbmRleDsKIApAQCAtMTQ0LDEzICsxMzEsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2Uoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgICAgc3RydWN0IGl4Z2JlX3R4X2J1ZmZlcgotCQkJCQkgICAgICp0eF9idWZmZXJfaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV90eF9idWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0eF9idWZmZXJfaW5mbykKIHsKIAlpZiAodHhfYnVmZmVyX2luZm8tPmRtYSkgewotCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAotCQkJICAgICAgIHR4X2J1ZmZlcl9pbmZvLT5kbWEsCi0JCQkgICAgICAgdHhfYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHR4X2J1ZmZlcl9pbmZvLT5kbWEsCisJCSAgICAgICAgICAgICAgIHR4X2J1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl0eF9idWZmZXJfaW5mby0+ZG1hID0gMDsKIAl9CiAJaWYgKHR4X2J1ZmZlcl9pbmZvLT5za2IpIHsKQEAgLTE2MSwxMDcgKzE0NywxMjAgQEAKIH0KIAogc3RhdGljIGlubGluZSBib29sIGl4Z2JlX2NoZWNrX3R4X2hhbmcoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZW9wLAotCQkJCSAgICAgICB1bmlvbiBpeGdiZV9hZHZfdHhfZGVzYyAqZW9wX2Rlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlb3ApCiB7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgaGVhZCwgdGFpbDsKKwogCS8qIERldGVjdCBhIHRyYW5zbWl0IGhhbmcgaW4gaGFyZHdhcmUsIHRoaXMgc2VyaWFsaXplcyB0aGUKLQkgKiBjaGVjayB3aXRoIHRoZSBjbGVhcmluZyBvZiB0aW1lX3N0YW1wIGFuZCBtb3ZlbWVudCBvZiBpICovCisJICogY2hlY2sgd2l0aCB0aGUgY2xlYXJpbmcgb2YgdGltZV9zdGFtcCBhbmQgbW92ZW1lbnQgb2YgZW9wICovCisJaGVhZCA9IElYR0JFX1JFQURfUkVHKGh3LCB0eF9yaW5nLT5oZWFkKTsKKwl0YWlsID0gSVhHQkVfUkVBRF9SRUcoaHcsIHR4X3JpbmctPnRhaWwpOwogCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gZmFsc2U7Ci0JaWYgKHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2VvcF0uZG1hICYmCisJaWYgKChoZWFkICE9IHRhaWwpICYmCisJICAgIHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2VvcF0udGltZV9zdGFtcCAmJgogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2VvcF0udGltZV9zdGFtcCArIEhaKSAmJgogCSAgICAhKElYR0JFX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfVEZDUykgJiBJWEdCRV9URkNTX1RYT0ZGKSkgewogCQkvKiBkZXRlY3RlZCBUeCB1bml0IGhhbmcgKi8KKwkJdW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MgKnR4X2Rlc2M7CisJCXR4X2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgZW9wKTsKIAkJRFBSSU5USyhEUlYsIEVSUiwgIkRldGVjdGVkIFR4IFVuaXQgSGFuZ1xuIgotCQkJIiAgVERIICAgICAgICAgICAgICAgICAgPCV4PlxuIgotCQkJIiAgVERUICAgICAgICAgICAgICAgICAgPCV4PlxuIgorCQkJIiAgVHggUXVldWUgICAgICAgICAgICAgPCVkPlxuIgorCQkJIiAgVERILCBURFQgICAgICAgICAgICAgPCV4PiwgPCV4PlxuIgogCQkJIiAgbmV4dF90b191c2UgICAgICAgICAgPCV4PlxuIgogCQkJIiAgbmV4dF90b19jbGVhbiAgICAgICAgPCV4PlxuIgogCQkJInR4X2J1ZmZlcl9pbmZvW25leHRfdG9fY2xlYW5dXG4iCiAJCQkiICB0aW1lX3N0YW1wICAgICAgICAgICA8JWx4PlxuIgotCQkJIiAgbmV4dF90b193YXRjaCAgICAgICAgPCV4PlxuIgotCQkJIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIKLQkJCSIgIG5leHRfdG9fd2F0Y2guc3RhdHVzIDwleD5cbiIsCi0JCQlyZWFkbChhZGFwdGVyLT5ody5od19hZGRyICsgdHhfcmluZy0+aGVhZCksCi0JCQlyZWFkbChhZGFwdGVyLT5ody5od19hZGRyICsgdHhfcmluZy0+dGFpbCksCi0JCQl0eF9yaW5nLT5uZXh0X3RvX3VzZSwKLQkJCXR4X3JpbmctPm5leHRfdG9fY2xlYW4sCi0JCQl0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tlb3BdLnRpbWVfc3RhbXAsCi0JCQllb3AsIGppZmZpZXMsIGVvcF9kZXNjLT53Yi5zdGF0dXMpOworCQkJIiAgamlmZmllcyAgICAgICAgICAgICAgPCVseD5cbiIsCisJCQl0eF9yaW5nLT5xdWV1ZV9pbmRleCwKKwkJCWhlYWQsIHRhaWwsCisJCQl0eF9yaW5nLT5uZXh0X3RvX3VzZSwgZW9wLAorCQkJdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bZW9wXS50aW1lX3N0YW1wLCBqaWZmaWVzKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCiAJcmV0dXJuIGZhbHNlOwogfQogCi0jZGVmaW5lIElYR0JFX01BWF9UWERfUFdSCTE0Ci0jZGVmaW5lIElYR0JFX01BWF9EQVRBX1BFUl9UWEQJKDEgPDwgSVhHQkVfTUFYX1RYRF9QV1IpCisjZGVmaW5lIElYR0JFX01BWF9UWERfUFdSICAgICAgIDE0CisjZGVmaW5lIElYR0JFX01BWF9EQVRBX1BFUl9UWEQgICgxIDw8IElYR0JFX01BWF9UWERfUFdSKQogCiAvKiBUeCBEZXNjcmlwdG9ycyBuZWVkZWQsIHdvcnN0IGNhc2UgKi8KICNkZWZpbmUgVFhEX1VTRV9DT1VOVChTKSAoKChTKSA+PiBJWEdCRV9NQVhfVFhEX1BXUikgKyBcCiAJCQkgKCgoUykgJiAoSVhHQkVfTUFYX0RBVEFfUEVSX1RYRCAtIDEpKSA/IDEgOiAwKSkKICNkZWZpbmUgREVTQ19ORUVERUQgKFRYRF9VU0VfQ09VTlQoSVhHQkVfTUFYX0RBVEFfUEVSX1RYRCkgLyogc2tiLT5kYXRhICovICsgXAotCU1BWF9TS0JfRlJBR1MgKiBUWERfVVNFX0NPVU5UKFBBR0VfU0laRSkgKyAxKQkvKiBmb3IgY29udGV4dCAqLworCU1BWF9TS0JfRlJBR1MgKiBUWERfVVNFX0NPVU5UKFBBR0VfU0laRSkgKyAxKSAvKiBmb3IgY29udGV4dCAqLworCisjZGVmaW5lIEdFVF9UWF9IRUFEX0ZST01fUklORyhyaW5nKSAoXAorCSoodm9sYXRpbGUgdTMyICopIFwKKwkoKHVuaW9uIGl4Z2JlX2Fkdl90eF9kZXNjICopKHJpbmcpLT5kZXNjICsgKHJpbmcpLT5jb3VudCkpCitzdGF0aWMgdm9pZCBpeGdiZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogCiAvKioKICAqIGl4Z2JlX2NsZWFuX3R4X2lycSAtIFJlY2xhaW0gcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWl0IGNvbXBsZXRlcwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAdHhfcmluZzogdHggcmluZyB0byBjbGVhbgogICoqLwogc3RhdGljIGJvb2wgaXhnYmVfY2xlYW5fdHhfaXJxKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXVuaW9uIGl4Z2JlX2Fkdl90eF9kZXNjICp0eF9kZXNjLCAqZW9wX2Rlc2M7CisJdW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MgKnR4X2Rlc2M7CiAJc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87Ci0JdW5zaWduZWQgaW50IGksIGVvcDsKLQlib29sIGNsZWFuZWQgPSBmYWxzZTsKLQl1bnNpZ25lZCBpbnQgdG90YWxfdHhfYnl0ZXMgPSAwLCB0b3RhbF90eF9wYWNrZXRzID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIGhlYWQsIG9sZGhlYWQ7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfYnl0ZXMgPSAwLCB0b3RhbF9wYWNrZXRzID0gMDsKIAorCXJtYigpOworCWhlYWQgPSBHRVRfVFhfSEVBRF9GUk9NX1JJTkcodHhfcmluZyk7CisJaGVhZCA9IGxlMzJfdG9fY3B1KGhlYWQpOwogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOwotCWVvcCA9IHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7Ci0JZW9wX2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgZW9wKTsKLQl3aGlsZSAoZW9wX2Rlc2MtPndiLnN0YXR1cyAmIGNwdV90b19sZTMyKElYR0JFX1RYRF9TVEFUX0REKSkgewotCQljbGVhbmVkID0gZmFsc2U7Ci0JCXdoaWxlICghY2xlYW5lZCkgeworCXdoaWxlICgxKSB7CisJCXdoaWxlIChpICE9IGhlYWQpIHsKIAkJCXR4X2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgaSk7CiAJCQl0eF9idWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tpXTsKLQkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOworCQkJc2tiID0gdHhfYnVmZmVyX2luZm8tPnNrYjsKIAotCQkJdHhfcmluZy0+c3RhdHMuYnl0ZXMgKz0gdHhfYnVmZmVyX2luZm8tPmxlbmd0aDsKLQkJCWlmIChjbGVhbmVkKSB7Ci0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4X2J1ZmZlcl9pbmZvLT5za2I7CisJCQlpZiAoc2tiKSB7CiAJCQkJdW5zaWduZWQgaW50IHNlZ3MsIGJ5dGVjb3VudDsKKworCQkJCS8qIGdzb19zZWdzIGlzIGN1cnJlbnRseSBvbmx5IHZhbGlkIGZvciB0Y3AgKi8KIAkJCQlzZWdzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA/OiAxOwogCQkJCS8qIG11bHRpcGx5IGRhdGEgY2h1bmtzIGJ5IHNpemUgb2YgaGVhZGVycyAqLwogCQkJCWJ5dGVjb3VudCA9ICgoc2VncyAtIDEpICogc2tiX2hlYWRsZW4oc2tiKSkgKwotCQkJCQkgICAgc2tiLT5sZW47Ci0JCQkJdG90YWxfdHhfcGFja2V0cyArPSBzZWdzOwotCQkJCXRvdGFsX3R4X2J5dGVzICs9IGJ5dGVjb3VudDsKKwkJCQkgICAgICAgICAgICBza2ItPmxlbjsKKwkJCQl0b3RhbF9wYWNrZXRzICs9IHNlZ3M7CisJCQkJdG90YWxfYnl0ZXMgKz0gYnl0ZWNvdW50OwogCQkJfQorCiAJCQlpeGdiZV91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLAotCQkJCQkJCSB0eF9idWZmZXJfaW5mbyk7Ci0JCQl0eF9kZXNjLT53Yi5zdGF0dXMgPSAwOworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfYnVmZmVyX2luZm8pOwogCiAJCQlpKys7CiAJCQlpZiAoaSA9PSB0eF9yaW5nLT5jb3VudCkKIAkJCQlpID0gMDsKKworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA9PSB0eF9yaW5nLT5jb3VudCkKKwkJCQlnb3RvIGRvbmVfY2xlYW5pbmc7CiAJCX0KKwkJb2xkaGVhZCA9IGhlYWQ7CisJCXJtYigpOworCQloZWFkID0gR0VUX1RYX0hFQURfRlJPTV9SSU5HKHR4X3JpbmcpOworCQloZWFkID0gbGUzMl90b19jcHUoaGVhZCk7CisJCWlmIChoZWFkID09IG9sZGhlYWQpCisJCQlnb3RvIGRvbmVfY2xlYW5pbmc7CisJfSAvKiB3aGlsZSAoMSkgKi8KIAotCQl0eF9yaW5nLT5zdGF0cy5wYWNrZXRzKys7Ci0KLQkJZW9wID0gdHhfcmluZy0+dHhfYnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKLQkJZW9wX2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgZW9wKTsKLQotCQkvKiB3ZWlnaHQgb2YgYSBzb3J0IGZvciB0eCwgYXZvaWQgZW5kbGVzcyB0cmFuc21pdCBjbGVhbnVwICovCi0JCWlmICh0b3RhbF90eF9wYWNrZXRzID49IHR4X3JpbmctPndvcmtfbGltaXQpCi0JCQlicmVhazsKLQl9Ci0KK2RvbmVfY2xlYW5pbmc6CiAJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7CiAKICNkZWZpbmUgVFhfV0FLRV9USFJFU0hPTEQgKERFU0NfTkVFREVEICogMikKLQlpZiAodG90YWxfdHhfcGFja2V0cyAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKLQkgICAgKElYR0JFX0RFU0NfVU5VU0VEKHR4X3JpbmcpID49IFRYX1dBS0VfVEhSRVNIT0xEKSkgeworCWlmICh1bmxpa2VseShjb3VudCAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkgICAgICAgICAgICAgKElYR0JFX0RFU0NfVU5VU0VEKHR4X3JpbmcpID49IFRYX1dBS0VfVEhSRVNIT0xEKSkpIHsKIAkJLyogTWFrZSBzdXJlIHRoYXQgYW55Ym9keSBzdG9wcGluZyB0aGUgcXVldWUgYWZ0ZXIgdGhpcwogCQkgKiBzZWVzIHRoZSBuZXcgbmV4dF90b19jbGVhbi4KIAkJICovCkBAIC0yNjksNTkgKzI2OCw2OCBAQAogCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKG5ldGRldiwgdHhfcmluZy0+cXVldWVfaW5kZXgpICYmCiAJCSAgICAhdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKSB7CiAJCQluZXRpZl93YWtlX3N1YnF1ZXVlKG5ldGRldiwgdHhfcmluZy0+cXVldWVfaW5kZXgpOwotCQkJYWRhcHRlci0+cmVzdGFydF9xdWV1ZSsrOworCQkJKythZGFwdGVyLT5yZXN0YXJ0X3F1ZXVlOwogCQl9CiAJfQogCi0JaWYgKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKQotCQlpZiAoaXhnYmVfY2hlY2tfdHhfaGFuZyhhZGFwdGVyLCB0eF9yaW5nLCBlb3AsIGVvcF9kZXNjKSkKLQkJCW5ldGlmX3N0b3Bfc3VicXVldWUobmV0ZGV2LCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7CisJaWYgKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKSB7CisJCWlmIChpeGdiZV9jaGVja190eF9oYW5nKGFkYXB0ZXIsIHR4X3JpbmcsIGkpKSB7CisJCQkvKiBzY2hlZHVsZSBpbW1lZGlhdGUgcmVzZXQgaWYgd2UgYmVsaWV2ZSB3ZSBodW5nICovCisJCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJICAgICAgICAidHggaGFuZyAlZCBkZXRlY3RlZCwgcmVzZXR0aW5nIGFkYXB0ZXJcbiIsCisJCQkgICAgICAgIGFkYXB0ZXItPnR4X3RpbWVvdXRfY291bnQgKyAxKTsKKwkJCWl4Z2JlX3R4X3RpbWVvdXQoYWRhcHRlci0+bmV0ZGV2KTsKKwkJfQorCX0KIAotCWlmICh0b3RhbF90eF9wYWNrZXRzID49IHR4X3JpbmctPndvcmtfbGltaXQpCi0JCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsIHR4X3JpbmctPmVpbXNfdmFsdWUpOworCS8qIHJlLWFybSB0aGUgaW50ZXJydXB0ICovCisJaWYgKCh0b3RhbF9wYWNrZXRzID49IHR4X3JpbmctPndvcmtfbGltaXQpIHx8CisJICAgIChjb3VudCA9PSB0eF9yaW5nLT5jb3VudCkpCisJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsIHR4X3JpbmctPnZfaWR4KTsKIAotCXR4X3JpbmctPnRvdGFsX2J5dGVzICs9IHRvdGFsX3R4X2J5dGVzOwotCXR4X3JpbmctPnRvdGFsX3BhY2tldHMgKz0gdG90YWxfdHhfcGFja2V0czsKLQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gdG90YWxfdHhfYnl0ZXM7Ci0JYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMgKz0gdG90YWxfdHhfcGFja2V0czsKLQljbGVhbmVkID0gdG90YWxfdHhfcGFja2V0cyA/IHRydWUgOiBmYWxzZTsKLQlyZXR1cm4gY2xlYW5lZDsKKwl0eF9yaW5nLT50b3RhbF9ieXRlcyArPSB0b3RhbF9ieXRlczsKKwl0eF9yaW5nLT50b3RhbF9wYWNrZXRzICs9IHRvdGFsX3BhY2tldHM7CisJdHhfcmluZy0+c3RhdHMuYnl0ZXMgKz0gdG90YWxfYnl0ZXM7CisJdHhfcmluZy0+c3RhdHMucGFja2V0cyArPSB0b3RhbF9wYWNrZXRzOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyArPSB0b3RhbF9ieXRlczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyArPSB0b3RhbF9wYWNrZXRzOworCXJldHVybiAodG90YWxfcGFja2V0cyA/IHRydWUgOiBmYWxzZSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgZGVmaW5lZChDT05GSUdfRENBKSB8fCBkZWZpbmVkKENPTkZJR19EQ0FfTU9EVUxFKQogc3RhdGljIHZvaWQgaXhnYmVfdXBkYXRlX3J4X2RjYShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQlzdHJ1Y3QgaXhnYmVfcmluZyAqcnhyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcnhfcmluZykKIHsKIAl1MzIgcnhjdHJsOwogCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IHEgPSByeHIgLSBhZGFwdGVyLT5yeF9yaW5nOworCWludCBxID0gcnhfcmluZyAtIGFkYXB0ZXItPnJ4X3Jpbmc7CiAKLQlpZiAocnhyLT5jcHUgIT0gY3B1KSB7CisJaWYgKHJ4X3JpbmctPmNwdSAhPSBjcHUpIHsKIAkJcnhjdHJsID0gSVhHQkVfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9EQ0FfUlhDVFJMKHEpKTsKIAkJcnhjdHJsICY9IH5JWEdCRV9EQ0FfUlhDVFJMX0NQVUlEX01BU0s7Ci0JCXJ4Y3RybCB8PSBkY2FfZ2V0X3RhZyhjcHUpOworCQlyeGN0cmwgfD0gZGNhM19nZXRfdGFnKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNwdSk7CiAJCXJ4Y3RybCB8PSBJWEdCRV9EQ0FfUlhDVFJMX0RFU0NfRENBX0VOOwogCQlyeGN0cmwgfD0gSVhHQkVfRENBX1JYQ1RSTF9IRUFEX0RDQV9FTjsKIAkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRENBX1JYQ1RSTChxKSwgcnhjdHJsKTsKLQkJcnhyLT5jcHUgPSBjcHU7CisJCXJ4X3JpbmctPmNwdSA9IGNwdTsKIAl9CiAJcHV0X2NwdSgpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV91cGRhdGVfdHhfZGNhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBpeGdiZV9yaW5nICp0eHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nKQogewogCXUzMiB0eGN0cmw7CiAJaW50IGNwdSA9IGdldF9jcHUoKTsKLQlpbnQgcSA9IHR4ciAtIGFkYXB0ZXItPnR4X3Jpbmc7CisJaW50IHEgPSB0eF9yaW5nIC0gYWRhcHRlci0+dHhfcmluZzsKIAotCWlmICh0eHItPmNwdSAhPSBjcHUpIHsKKwlpZiAodHhfcmluZy0+Y3B1ICE9IGNwdSkgewogCQl0eGN0cmwgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0RDQV9UWENUUkwocSkpOwogCQl0eGN0cmwgJj0gfklYR0JFX0RDQV9UWENUUkxfQ1BVSURfTUFTSzsKLQkJdHhjdHJsIHw9IGRjYV9nZXRfdGFnKGNwdSk7CisJCXR4Y3RybCB8PSBkY2EzX2dldF90YWcoJmFkYXB0ZXItPnBkZXYtPmRldiwgY3B1KTsKIAkJdHhjdHJsIHw9IElYR0JFX0RDQV9UWENUUkxfREVTQ19EQ0FfRU47CiAJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0RDQV9UWENUUkwocSksIHR4Y3RybCk7Ci0JCXR4ci0+Y3B1ID0gY3B1OworCQl0eF9yaW5nLT5jcHUgPSBjcHU7CiAJfQogCXB1dF9jcHUoKTsKIH0KQEAgLTM1MSwxMSArMzU5LDE0IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBEQ0FfUFJPVklERVJfQUREOgotCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEOworCQkvKiBpZiB3ZSdyZSBhbHJlYWR5IGVuYWJsZWQsIGRvbid0IGRvIGl0IGFnYWluICovCisJCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENBX0VOQUJMRUQpCisJCQlicmVhazsKIAkJLyogQWx3YXlzIHVzZSBDQjIgbW9kZSwgZGlmZmVyZW5jZSBpcyBtYXNrZWQKIAkJICogaW4gdGhlIENCIGRyaXZlci4gKi8KIAkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRENBX0NUUkwsIDIpOwogCQlpZiAoZGNhX2FkZF9yZXF1ZXN0ZXIoZGV2KSA9PSAwKSB7CisJCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEOwogCQkJaXhnYmVfc2V0dXBfZGNhKGFkYXB0ZXIpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM3Miw3ICszODMsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0RDQSAqLworI2VuZGlmIC8qIENPTkZJR19EQ0Egb3IgQ09ORklHX0RDQV9NT0RVTEUgKi8KIC8qKgogICogaXhnYmVfcmVjZWl2ZV9za2IgLSBTZW5kIGEgY29tcGxldGVkIHBhY2tldCB1cCB0aGUgc3RhY2sKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQpAQCAtMzgyLDggKzM5Myw4IEBACiAgKiBAcnhfZGVzYzogcnggZGVzY3JpcHRvcgogICoqLwogc3RhdGljIHZvaWQgaXhnYmVfcmVjZWl2ZV9za2Ioc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBzdGF0dXMsCi0JCQkgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHU4IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICpyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXhnYmVfYWR2X3J4X2Rlc2MgKnJ4X2Rlc2MpCiB7CiAJYm9vbCBpc192bGFuID0gKHN0YXR1cyAmIElYR0JFX1JYRF9TVEFUX1ZQKTsKQEAgLTQyMCwxNCArNDMxLDEyIEBACiAgKiBAc2tiOiBza2IgY3VycmVudGx5IGJlaW5nIHJlY2VpdmVkIGFuZCBtb2RpZmllZAogICoqLwogc3RhdGljIGlubGluZSB2b2lkIGl4Z2JlX3J4X2NoZWNrc3VtKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCQkgdTMyIHN0YXR1c19lcnIsCi0JCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBzdGF0dXNfZXJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAotCS8qIElnbm9yZSBDaGVja3N1bSBiaXQgaXMgc2V0LCBvciByeCBjc3VtIGRpc2FibGVkICovCi0JaWYgKChzdGF0dXNfZXJyICYgSVhHQkVfUlhEX1NUQVRfSVhTTSkgfHwKLQkgICAgIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlhfQ1NVTV9FTkFCTEVEKSkKKwkvKiBSeCBjc3VtIGRpc2FibGVkICovCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JYX0NTVU1fRU5BQkxFRCkpCiAJCXJldHVybjsKIAogCS8qIGlmIElQIGFuZCBlcnJvciAqLwpAQCAtNDU1LDM3ICs0NjQsNDQgQEAKICAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCiBzdGF0aWMgdm9pZCBpeGdiZV9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcnhfcmluZywKLQkJCQkgICAgICAgaW50IGNsZWFuZWRfY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xlYW5lZF9jb3VudCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAl1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYzsKLQlzdHJ1Y3QgaXhnYmVfcnhfYnVmZmVyICpyeF9idWZmZXJfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpeGdiZV9yeF9idWZmZXIgKmJpOwogCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCBidWZzeiA9IGFkYXB0ZXItPnJ4X2J1Zl9sZW4gKyBORVRfSVBfQUxJR047CisJdW5zaWduZWQgaW50IGJ1ZnN6ID0gcnhfcmluZy0+cnhfYnVmX2xlbiArIE5FVF9JUF9BTElHTjsKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKLQlyeF9idWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1tpXTsKKwliaSA9ICZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1tpXTsKIAogCXdoaWxlIChjbGVhbmVkX2NvdW50LS0pIHsKIAkJcnhfZGVzYyA9IElYR0JFX1JYX0RFU0NfQURWKCpyeF9yaW5nLCBpKTsKIAotCQlpZiAoIXJ4X2J1ZmZlcl9pbmZvLT5wYWdlICYmCi0JCQkJKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEKSkgewotCQkJcnhfYnVmZmVyX2luZm8tPnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOwotCQkJaWYgKCFyeF9idWZmZXJfaW5mby0+cGFnZSkgewotCQkJCWFkYXB0ZXItPmFsbG9jX3J4X3BhZ2VfZmFpbGVkKys7Ci0JCQkJZ290byBub19idWZmZXJzOworCQlpZiAoIWJpLT5wYWdlX2RtYSAmJgorCQkgICAgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEKSkgeworCQkJaWYgKCFiaS0+cGFnZSkgeworCQkJCWJpLT5wYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIWJpLT5wYWdlKSB7CisJCQkJCWFkYXB0ZXItPmFsbG9jX3J4X3BhZ2VfZmFpbGVkKys7CisJCQkJCWdvdG8gbm9fYnVmZmVyczsKKwkJCQl9CisJCQkJYmktPnBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogdXNlIGEgaGFsZiBwYWdlIGlmIHdlJ3JlIHJlLXVzaW5nICovCisJCQkJYmktPnBhZ2Vfb2Zmc2V0IF49IChQQUdFX1NJWkUgLyAyKTsKIAkJCX0KLQkJCXJ4X2J1ZmZlcl9pbmZvLT5wYWdlX2RtYSA9Ci0JCQkgICAgcGNpX21hcF9wYWdlKHBkZXYsIHJ4X2J1ZmZlcl9pbmZvLT5wYWdlLAotCQkJCQkgMCwgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQliaS0+cGFnZV9kbWEgPSBwY2lfbWFwX3BhZ2UocGRldiwgYmktPnBhZ2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmktPnBhZ2Vfb2Zmc2V0LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQQUdFX1NJWkUgLyAyKSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl9CiAKLQkJaWYgKCFyeF9idWZmZXJfaW5mby0+c2tiKSB7Ci0JCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgYnVmc3opOworCQlpZiAoIWJpLT5za2IpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnN6KTsKIAogCQkJaWYgKCFza2IpIHsKIAkJCQlhZGFwdGVyLT5hbGxvY19yeF9idWZmX2ZhaWxlZCsrOwpAQCAtNDk5LDI4ICs1MTUsMjUgQEAKIAkJCSAqLwogCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwogCi0JCQlyeF9idWZmZXJfaW5mby0+c2tiID0gc2tiOwotCQkJcnhfYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwKLQkJCQkJCQkgIGJ1ZnN6LAotCQkJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJpLT5za2IgPSBza2I7CisJCQliaS0+ZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLCBidWZzeiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl9CiAJCS8qIFJlZnJlc2ggdGhlIGRlc2MgZXZlbiBpZiBidWZmZXJfYWRkcnMgZGlkbid0IGNoYW5nZSBiZWNhdXNlCiAJCSAqIGVhY2ggd3JpdGUtYmFjayBlcmFzZXMgdGhpcyBpbmZvLiAqLwogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JYX1BTX0VOQUJMRUQpIHsKLQkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPQotCQkJICAgIGNwdV90b19sZTY0KHJ4X2J1ZmZlcl9pbmZvLT5wYWdlX2RtYSk7Ci0JCQlyeF9kZXNjLT5yZWFkLmhkcl9hZGRyID0KLQkJCQkJY3B1X3RvX2xlNjQocnhfYnVmZmVyX2luZm8tPmRtYSk7CisJCQlyeF9kZXNjLT5yZWFkLnBrdF9hZGRyID0gY3B1X3RvX2xlNjQoYmktPnBhZ2VfZG1hKTsKKwkJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSBjcHVfdG9fbGU2NChiaS0+ZG1hKTsKIAkJfSBlbHNlIHsKLQkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPQotCQkJCQljcHVfdG9fbGU2NChyeF9idWZmZXJfaW5mby0+ZG1hKTsKKwkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPSBjcHVfdG9fbGU2NChiaS0+ZG1hKTsKIAkJfQogCiAJCWkrKzsKIAkJaWYgKGkgPT0gcnhfcmluZy0+Y291bnQpCiAJCQlpID0gMDsKLQkJcnhfYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9baV07CisJCWJpID0gJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvW2ldOwogCX0KKwogbm9fYnVmZmVyczoKIAlpZiAocnhfcmluZy0+bmV4dF90b191c2UgIT0gaSkgewogCQlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CkBAIC01MzgsNDYgKzU1MSw1NCBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgaXhnYmVfY2xlYW5fcnhfaXJxKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nLAotCQkJICAgICAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbykKK3N0YXRpYyBpbmxpbmUgdTE2IGl4Z2JlX2dldF9oZHJfaW5mbyh1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXJldHVybiByeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MuaGRyX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGl4Z2JlX2dldF9wa3RfaW5mbyh1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYykKK3sKKwlyZXR1cm4gcnhfZGVzYy0+d2IubG93ZXIubG9fZHdvcmQuaHNfcnNzLnBrdF9pbmZvOworfQorCitzdGF0aWMgYm9vbCBpeGdiZV9jbGVhbl9yeF9pcnEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKQorewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAl1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywgKm5leHRfcnhkOwogCXN0cnVjdCBpeGdiZV9yeF9idWZmZXIgKnJ4X2J1ZmZlcl9pbmZvLCAqbmV4dF9idWZmZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgdXBwZXJfbGVuLCBsZW4sIHN0YXRlcnI7CisJdTMyIGxlbiwgc3RhdGVycjsKIAl1MTYgaGRyX2luZm87CiAJYm9vbCBjbGVhbmVkID0gZmFsc2U7CiAJaW50IGNsZWFuZWRfY291bnQgPSAwOwogCXVuc2lnbmVkIGludCB0b3RhbF9yeF9ieXRlcyA9IDAsIHRvdGFsX3J4X3BhY2tldHMgPSAwOwogCiAJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47Ci0JdXBwZXJfbGVuID0gMDsKIAlyeF9kZXNjID0gSVhHQkVfUlhfREVTQ19BRFYoKnJ4X3JpbmcsIGkpOwogCXN0YXRlcnIgPSBsZTMyX3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5zdGF0dXNfZXJyb3IpOwogCXJ4X2J1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvW2ldOwogCiAJd2hpbGUgKHN0YXRlcnIgJiBJWEdCRV9SWERfU1RBVF9ERCkgeworCQl1MzIgdXBwZXJfbGVuID0gMDsKIAkJaWYgKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKIAogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1JYX1BTX0VOQUJMRUQpIHsKLQkJCWhkcl9pbmZvID0KLQkJCSAgICBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oZHJfaW5mbyk7Ci0JCQlsZW4gPQotCQkJICAgICgoaGRyX2luZm8gJiBJWEdCRV9SWERBRFZfSERSQlVGTEVOX01BU0spID4+Ci0JCQkgICAgIElYR0JFX1JYREFEVl9IRFJCVUZMRU5fU0hJRlQpOworCQkJaGRyX2luZm8gPSBsZTE2X3RvX2NwdShpeGdiZV9nZXRfaGRyX2luZm8ocnhfZGVzYykpOworCQkJbGVuID0gKGhkcl9pbmZvICYgSVhHQkVfUlhEQURWX0hEUkJVRkxFTl9NQVNLKSA+PgorCQkJICAgICAgIElYR0JFX1JYREFEVl9IRFJCVUZMRU5fU0hJRlQ7CiAJCQlpZiAoaGRyX2luZm8gJiBJWEdCRV9SWERBRFZfU1BIKQogCQkJCWFkYXB0ZXItPnJ4X2hkcl9zcGxpdCsrOwogCQkJaWYgKGxlbiA+IElYR0JFX1JYX0hEUl9TSVpFKQogCQkJCWxlbiA9IElYR0JFX1JYX0hEUl9TSVpFOwogCQkJdXBwZXJfbGVuID0gbGUxNl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIubGVuZ3RoKTsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CiAJCQlsZW4gPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5sZW5ndGgpOworCQl9CiAKIAkJY2xlYW5lZCA9IHRydWU7CiAJCXNrYiA9IHJ4X2J1ZmZlcl9pbmZvLT5za2I7CkBAIC01ODYsMTggKzYwNywyNSBAQAogCiAJCWlmIChsZW4gJiYgIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcnhfYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkJIGFkYXB0ZXItPnJ4X2J1Zl9sZW4gKyBORVRfSVBfQUxJR04sCi0JCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJICAgICAgICAgICAgICAgICByeF9yaW5nLT5yeF9idWZfbGVuICsgTkVUX0lQX0FMSUdOLAorCQkJICAgICAgICAgICAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJc2tiX3B1dChza2IsIGxlbik7CiAJCX0KIAogCQlpZiAodXBwZXJfbGVuKSB7CiAJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCByeF9idWZmZXJfaW5mby0+cGFnZV9kbWEsCi0JCQkJICAgICAgIFBBR0VfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSAgICAgICAgICAgICAgIFBBR0VfU0laRSAvIDIsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlyeF9idWZmZXJfaW5mby0+cGFnZV9kbWEgPSAwOwogCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKLQkJCQkJICAgcnhfYnVmZmVyX2luZm8tPnBhZ2UsIDAsIHVwcGVyX2xlbik7Ci0JCQlyeF9idWZmZXJfaW5mby0+cGFnZSA9IE5VTEw7CisJCQkgICAgICAgICAgICAgICAgICAgcnhfYnVmZmVyX2luZm8tPnBhZ2UsCisJCQkgICAgICAgICAgICAgICAgICAgcnhfYnVmZmVyX2luZm8tPnBhZ2Vfb2Zmc2V0LAorCQkJICAgICAgICAgICAgICAgICAgIHVwcGVyX2xlbik7CisKKwkJCWlmICgocnhfcmluZy0+cnhfYnVmX2xlbiA+IChQQUdFX1NJWkUgLyAyKSkgfHwKKwkJCSAgICAocGFnZV9jb3VudChyeF9idWZmZXJfaW5mby0+cGFnZSkgIT0gMSkpCisJCQkJcnhfYnVmZmVyX2luZm8tPnBhZ2UgPSBOVUxMOworCQkJZWxzZQorCQkJCWdldF9wYWdlKHJ4X2J1ZmZlcl9pbmZvLT5wYWdlKTsKIAogCQkJc2tiLT5sZW4gKz0gdXBwZXJfbGVuOwogCQkJc2tiLT5kYXRhX2xlbiArPSB1cHBlcl9sZW47CkBAIC02MjAsNiArNjQ4LDcgQEAKIAkJCXJ4X2J1ZmZlcl9pbmZvLT5za2IgPSBuZXh0X2J1ZmZlci0+c2tiOwogCQkJcnhfYnVmZmVyX2luZm8tPmRtYSA9IG5leHRfYnVmZmVyLT5kbWE7CiAJCQluZXh0X2J1ZmZlci0+c2tiID0gc2tiOworCQkJbmV4dF9idWZmZXItPmRtYSA9IDA7CiAJCQlhZGFwdGVyLT5ub25fZW9wX2Rlc2NzKys7CiAJCQlnb3RvIG5leHRfZGVzYzsKIAkJfQpAQCAtNjM1LDkgKzY2NCw5IEBACiAJCXRvdGFsX3J4X2J5dGVzICs9IHNrYi0+bGVuOwogCQl0b3RhbF9yeF9wYWNrZXRzKys7CiAKLQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+bmV0ZGV2KTsKIAkJaXhnYmVfcmVjZWl2ZV9za2IoYWRhcHRlciwgc2tiLCBzdGF0ZXJyLCByeF9yaW5nLCByeF9kZXNjKTsKLQkJbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJYWRhcHRlci0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAogbmV4dF9kZXNjOgogCQlyeF9kZXNjLT53Yi51cHBlci5zdGF0dXNfZXJyb3IgPSAwOwpAQCAtNjY2LDkgKzY5NSw2IEBACiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWl4Z2JlX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlciwgcnhfcmluZywgY2xlYW5lZF9jb3VudCk7CiAKLQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7Ci0JYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKLQogCXJ4X3JpbmctPnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlyeF9yaW5nLT50b3RhbF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CkBAIC03MDAsNDMgKzcyNiw0MyBAQAogCQlxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3Rvclt2X2lkeF07CiAJCS8qIFhYWCBmb3JfZWFjaF9iaXQoLi4uKSAqLwogCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeHJfaWR4LAotCQkJCSAgICAgIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOworCQkgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKIAkJCWogPSBhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XS5yZWdfaWR4OwogCQkJaXhnYmVfc2V0X2l2YXIoYWRhcHRlciwgSVhHQkVfSVZBUl9SWF9RVUVVRShqKSwgdl9pZHgpOwogCQkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT5yeHJfaWR4LAotCQkJCQkgICAgICBhZGFwdGVyLT5udW1fcnhfcXVldWVzLAotCQkJCQkgICAgICByX2lkeCArIDEpOworCQkJICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgcl9pZHggKyAxKTsKIAkJfQogCQlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT50eHJfaWR4LAotCQkJCSAgICAgICBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKKwkJICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3ItPnR4cl9jb3VudDsgaSsrKSB7CiAJCQlqID0gYWRhcHRlci0+dHhfcmluZ1tyX2lkeF0ucmVnX2lkeDsKIAkJCWl4Z2JlX3NldF9pdmFyKGFkYXB0ZXIsIElYR0JFX0lWQVJfVFhfUVVFVUUoaiksIHZfaWR4KTsKIAkJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwKLQkJCQkJICAgICAgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKLQkJCQkJICAgICAgcl9pZHggKyAxKTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5udW1fdHhfcXVldWVzLAorCQkJICAgICAgICAgICAgICAgICAgICAgIHJfaWR4ICsgMSk7CiAJCX0KIAotCQkvKiBpZiB0aGlzIGlzIGEgdHggb25seSB2ZWN0b3IgdXNlIGhhbGYgdGhlIGlycSAodHgpIHJhdGUgKi8KKwkJLyogaWYgdGhpcyBpcyBhIHR4IG9ubHkgdmVjdG9yIGhhbHZlIHRoZSBpbnRlcnJ1cHQgcmF0ZSAqLwogCQlpZiAocV92ZWN0b3ItPnR4cl9jb3VudCAmJiAhcV92ZWN0b3ItPnJ4cl9jb3VudCkKLQkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+dHhfZWl0cjsKKwkJCXFfdmVjdG9yLT5laXRyID0gKGFkYXB0ZXItPmVpdHJfcGFyYW0gPj4gMSk7CiAJCWVsc2UKLQkJCS8qIHJ4IG9ubHkgb3IgbWl4ZWQgKi8KLQkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+cnhfZWl0cjsKKwkJCS8qIHJ4IG9ubHkgKi8KKwkJCXFfdmVjdG9yLT5laXRyID0gYWRhcHRlci0+ZWl0cl9wYXJhbTsKIAogCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSVRSKHZfaWR4KSwKLQkJCQlFSVRSX0lOVFNfUEVSX1NFQ19UT19SRUcocV92ZWN0b3ItPmVpdHIpKTsKKwkJICAgICAgICAgICAgICAgIEVJVFJfSU5UU19QRVJfU0VDX1RPX1JFRyhxX3ZlY3Rvci0+ZWl0cikpOwogCX0KIAogCWl4Z2JlX3NldF9pdmFyKGFkYXB0ZXIsIElYR0JFX0lWQVJfT1RIRVJfQ0FVU0VTX0lOREVYLCB2X2lkeCk7CiAJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlUUih2X2lkeCksIDE5NTApOwogCi0JLyogc2V0IHVwIHRvIGF1dG9jbGVhciB0aW1lciwgbHNjLCBhbmQgdGhlIHZlY3RvcnMgKi8KKwkvKiBzZXQgdXAgdG8gYXV0b2NsZWFyIHRpbWVyLCBhbmQgdGhlIHZlY3RvcnMgKi8KIAltYXNrID0gSVhHQkVfRUlNU19FTkFCTEVfTUFTSzsKLQltYXNrICY9IH5JWEdCRV9FSU1TX09USEVSOworCW1hc2sgJj0gfihJWEdCRV9FSU1TX09USEVSIHwgSVhHQkVfRUlNU19MU0MpOwogCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQUMsIG1hc2spOwogfQogCkBAIC03NjYsOCArNzkyLDggQEAKICAqICAgICAgcGFyYW1ldGVyIChzZWUgaXhnYmVfcGFyYW0uYykKICAqKi8KIHN0YXRpYyB1OCBpeGdiZV91cGRhdGVfaXRyKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgdTMyIGVpdHIsIHU4IGl0cl9zZXR0aW5nLAotCQkJICAgaW50IHBhY2tldHMsIGludCBieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBlaXRyLCB1OCBpdHJfc2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWNrZXRzLCBpbnQgYnl0ZXMpCiB7CiAJdW5zaWduZWQgaW50IHJldHZhbCA9IGl0cl9zZXR0aW5nOwogCXUzMiB0aW1lcGFzc2VkX3VzOwpAQCAtODE0LDQwICs4NDAsNDAgQEAKIAl1MzIgbmV3X2l0cjsKIAl1OCBjdXJyZW50X2l0ciwgcmV0X2l0cjsKIAlpbnQgaSwgcl9pZHgsIHZfaWR4ID0gKCh2b2lkICopcV92ZWN0b3IgLSAodm9pZCAqKShhZGFwdGVyLT5xX3ZlY3RvcikpIC8KLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IpOworCSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpeGdiZV9xX3ZlY3Rvcik7CiAJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcsICp0eF9yaW5nOwogCiAJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CiAJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT50eHJfY291bnQ7IGkrKykgewogCQl0eF9yaW5nID0gJihhZGFwdGVyLT50eF9yaW5nW3JfaWR4XSk7CiAJCXJldF9pdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIHFfdmVjdG9yLT5laXRyLAotCQkJCQkgICBxX3ZlY3Rvci0+dHhfZWl0ciwKLQkJCQkJICAgdHhfcmluZy0+dG90YWxfcGFja2V0cywKLQkJCQkJICAgdHhfcmluZy0+dG90YWxfYnl0ZXMpOworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBxX3ZlY3Rvci0+dHhfaXRyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nLT50b3RhbF9wYWNrZXRzLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nLT50b3RhbF9ieXRlcyk7CiAJCS8qIGlmIHRoZSByZXN1bHQgZm9yIHRoaXMgcXVldWUgd291bGQgZGVjcmVhc2UgaW50ZXJydXB0CiAJCSAqIHJhdGUgZm9yIHRoaXMgdmVjdG9yIHRoZW4gdXNlIHRoYXQgcmVzdWx0ICovCi0JCXFfdmVjdG9yLT50eF9laXRyID0gKChxX3ZlY3Rvci0+dHhfZWl0ciA+IHJldF9pdHIpID8KLQkJCQkgICAgcV92ZWN0b3ItPnR4X2VpdHIgLSAxIDogcmV0X2l0cik7CisJCXFfdmVjdG9yLT50eF9pdHIgPSAoKHFfdmVjdG9yLT50eF9pdHIgPiByZXRfaXRyKSA/CisJCSAgICAgICAgICAgICAgICAgICAgcV92ZWN0b3ItPnR4X2l0ciAtIDEgOiByZXRfaXRyKTsKIAkJcl9pZHggPSBmaW5kX25leHRfYml0KHFfdmVjdG9yLT50eHJfaWR4LCBhZGFwdGVyLT5udW1fdHhfcXVldWVzLAotCQkJCSAgICAgIHJfaWR4ICsgMSk7CisJCSAgICAgICAgICAgICAgICAgICAgICByX2lkeCArIDEpOwogCX0KIAogCXJfaWR4ID0gZmluZF9maXJzdF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMpOwogCWZvciAoaSA9IDA7IGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKIAkJcnhfcmluZyA9ICYoYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0pOwogCQlyZXRfaXRyID0gaXhnYmVfdXBkYXRlX2l0cihhZGFwdGVyLCBxX3ZlY3Rvci0+ZWl0ciwKLQkJCQkJICAgcV92ZWN0b3ItPnJ4X2VpdHIsCi0JCQkJCSAgIHJ4X3JpbmctPnRvdGFsX3BhY2tldHMsCi0JCQkJCSAgIHJ4X3JpbmctPnRvdGFsX2J5dGVzKTsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgcV92ZWN0b3ItPnJ4X2l0ciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfcmluZy0+dG90YWxfcGFja2V0cywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfcmluZy0+dG90YWxfYnl0ZXMpOwogCQkvKiBpZiB0aGUgcmVzdWx0IGZvciB0aGlzIHF1ZXVlIHdvdWxkIGRlY3JlYXNlIGludGVycnVwdAogCQkgKiByYXRlIGZvciB0aGlzIHZlY3RvciB0aGVuIHVzZSB0aGF0IHJlc3VsdCAqLwotCQlxX3ZlY3Rvci0+cnhfZWl0ciA9ICgocV92ZWN0b3ItPnJ4X2VpdHIgPiByZXRfaXRyKSA/Ci0JCQkJICAgIHFfdmVjdG9yLT5yeF9laXRyIC0gMSA6IHJldF9pdHIpOworCQlxX3ZlY3Rvci0+cnhfaXRyID0gKChxX3ZlY3Rvci0+cnhfaXRyID4gcmV0X2l0cikgPworCQkgICAgICAgICAgICAgICAgICAgIHFfdmVjdG9yLT5yeF9pdHIgLSAxIDogcmV0X2l0cik7CiAJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKLQkJCQkgICAgICByX2lkeCArIDEpOworCQkgICAgICAgICAgICAgICAgICAgICAgcl9pZHggKyAxKTsKIAl9CiAKLQljdXJyZW50X2l0ciA9IG1heChxX3ZlY3Rvci0+cnhfZWl0ciwgcV92ZWN0b3ItPnR4X2VpdHIpOworCWN1cnJlbnRfaXRyID0gbWF4KHFfdmVjdG9yLT5yeF9pdHIsIHFfdmVjdG9yLT50eF9pdHIpOwogCiAJc3dpdGNoIChjdXJyZW50X2l0cikgewogCS8qIGNvdW50cyBhbmQgcGFja2V0cyBpbiB1cGRhdGVfaXRyIGFyZSBkZXBlbmRlbnQgb24gdGhlc2UgbnVtYmVycyAqLwpAQCAtODcxLDEzICs4OTcsMjcgQEAKIAkJaXRyX3JlZyA9IEVJVFJfSU5UU19QRVJfU0VDX1RPX1JFRyhuZXdfaXRyKTsKIAkJLyogbXVzdCB3cml0ZSBoaWdoIGFuZCBsb3cgMTYgYml0cyB0byByZXNldCBjb3VudGVyICovCiAJCURQUklOVEsoVFhfRVJSLCBERUJVRywgIndyaXRpbmcgZWl0ciglZCk6ICUwOFhcbiIsIHZfaWR4LAotCQkJaXRyX3JlZyk7CisJCSAgICAgICAgaXRyX3JlZyk7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlUUih2X2lkeCksIGl0cl9yZWcgfCAoaXRyX3JlZyk8PDE2KTsKIAl9CiAKIAlyZXR1cm47CiB9CiAKKworc3RhdGljIHZvaWQgaXhnYmVfY2hlY2tfbHNjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlhZGFwdGVyLT5sc2NfaW50Kys7CisJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19ORUVEX0xJTktfVVBEQVRFOworCWFkYXB0ZXItPmxpbmtfY2hlY2tfdGltZW91dCA9IGppZmZpZXM7CisJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpIHsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSU1DLCBJWEdCRV9FSU1DX0xTQyk7CisJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2spOworCX0KK30KKwogc3RhdGljIGlycXJldHVybl90IGl4Z2JlX21zaXhfbHNjKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7CkBAIC04ODUsMTEgKzkyNSw4IEBACiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgZWljciA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9FSUNSKTsKIAotCWlmIChlaWNyICYgSVhHQkVfRUlDUl9MU0MpIHsKLQkJYWRhcHRlci0+bHNjX2ludCsrOwotCQlpZiAoIXRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKLQkJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOwotCX0KKwlpZiAoZWljciAmIElYR0JFX0VJQ1JfTFNDKQorCQlpeGdiZV9jaGVja19sc2MoYWRhcHRlcik7CiAKIAlpZiAoIXRlc3RfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSU1TLCBJWEdCRV9FSU1TX09USEVSKTsKQEAgLTkwMSw3ICs5MzgsNyBAQAogewogCXN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcV92ZWN0b3IgPSBkYXRhOwogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOwotCXN0cnVjdCBpeGdiZV9yaW5nICAgICAqdHhyOworCXN0cnVjdCBpeGdiZV9yaW5nICAgICAqdHhfcmluZzsKIAlpbnQgaSwgcl9pZHg7CiAKIAlpZiAoIXFfdmVjdG9yLT50eHJfY291bnQpCkBAIC05MDksMTYgKzk0NiwxNiBAQAogCiAJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+dHhyX2lkeCwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CiAJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT50eHJfY291bnQ7IGkrKykgewotCQl0eHIgPSAmKGFkYXB0ZXItPnR4X3Jpbmdbcl9pZHhdKTsKLSNpZmRlZiBDT05GSUdfRENBCisJCXR4X3JpbmcgPSAmKGFkYXB0ZXItPnR4X3Jpbmdbcl9pZHhdKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EQ0EpIHx8IGRlZmluZWQoQ09ORklHX0RDQV9NT0RVTEUpCiAJCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfRENBX0VOQUJMRUQpCi0JCQlpeGdiZV91cGRhdGVfdHhfZGNhKGFkYXB0ZXIsIHR4cik7CisJCQlpeGdiZV91cGRhdGVfdHhfZGNhKGFkYXB0ZXIsIHR4X3JpbmcpOwogI2VuZGlmCi0JCXR4ci0+dG90YWxfYnl0ZXMgPSAwOwotCQl0eHItPnRvdGFsX3BhY2tldHMgPSAwOwotCQlpeGdiZV9jbGVhbl90eF9pcnEoYWRhcHRlciwgdHhyKTsKKwkJdHhfcmluZy0+dG90YWxfYnl0ZXMgPSAwOworCQl0eF9yaW5nLT50b3RhbF9wYWNrZXRzID0gMDsKKwkJaXhnYmVfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsIHR4X3JpbmcpOwogCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnR4cl9pZHgsIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsCi0JCQkJICAgICAgcl9pZHggKyAxKTsKKwkJICAgICAgICAgICAgICAgICAgICAgIHJfaWR4ICsgMSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTMzLDE4ICs5NzAsMjYgQEAKIHsKIAlzdHJ1Y3QgaXhnYmVfcV92ZWN0b3IgKnFfdmVjdG9yID0gZGF0YTsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAgKmFkYXB0ZXIgPSBxX3ZlY3Rvci0+YWRhcHRlcjsKLQlzdHJ1Y3QgaXhnYmVfcmluZyAgKnJ4cjsKKwlzdHJ1Y3QgaXhnYmVfcmluZyAgKnJ4X3Jpbmc7CiAJaW50IHJfaWR4OworCWludCBpOwogCiAJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJZm9yIChpID0gMDsgIGkgPCBxX3ZlY3Rvci0+cnhyX2NvdW50OyBpKyspIHsKKwkJcnhfcmluZyA9ICYoYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0pOworCQlyeF9yaW5nLT50b3RhbF9ieXRlcyA9IDA7CisJCXJ4X3JpbmctPnRvdGFsX3BhY2tldHMgPSAwOworCQlyX2lkeCA9IGZpbmRfbmV4dF9iaXQocV92ZWN0b3ItPnJ4cl9pZHgsIGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCisJCSAgICAgICAgICAgICAgICAgICAgICByX2lkeCArIDEpOworCX0KKwogCWlmICghcV92ZWN0b3ItPnJ4cl9jb3VudCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0JcnhyID0gJihhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XSk7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJcnhfcmluZyA9ICYoYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0pOwogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGlzIHZlY3RvciBvbmx5ICovCi0JSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNQywgcnhyLT52X2lkeCk7Ci0JcnhyLT50b3RhbF9ieXRlcyA9IDA7Ci0JcnhyLT50b3RhbF9wYWNrZXRzID0gMDsKKwlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSU1DLCByeF9yaW5nLT52X2lkeCk7CiAJbmV0aWZfcnhfc2NoZWR1bGUoYWRhcHRlci0+bmV0ZGV2LCAmcV92ZWN0b3ItPm5hcGkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTYzLDM5ICsxMDA4LDkwIEBACiAgKiBAbmFwaTogbmFwaSBzdHJ1Y3Qgd2l0aCBvdXIgZGV2aWNlcyBpbmZvIGluIGl0CiAgKiBAYnVkZ2V0OiBhbW91bnQgb2Ygd29yayBkcml2ZXIgaXMgYWxsb3dlZCB0byBkbyB0aGlzIHBhc3MsIGluIHBhY2tldHMKICAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBmb3IgY2xlYW5pbmcgb25lIHF1ZXVlIG9ubHkgb24gYSBzaW5nbGUKKyAqIHFfdmVjdG9yISEhCiAgKiovCiBzdGF0aWMgaW50IGl4Z2JlX2NsZWFuX3J4b25seShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9Ci0JCQkgICAgICAgY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBpeGdiZV9xX3ZlY3RvciwgbmFwaSk7CisJICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGl4Z2JlX3FfdmVjdG9yLCBuYXBpKTsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOwotCXN0cnVjdCBpeGdiZV9yaW5nICpyeHI7CisJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcgPSBOVUxMOwogCWludCB3b3JrX2RvbmUgPSAwOwogCWxvbmcgcl9pZHg7CiAKIAlyX2lkeCA9IGZpbmRfZmlyc3RfYml0KHFfdmVjdG9yLT5yeHJfaWR4LCBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKLQlyeHIgPSAmKGFkYXB0ZXItPnJ4X3Jpbmdbcl9pZHhdKTsKLSNpZmRlZiBDT05GSUdfRENBCisJcnhfcmluZyA9ICYoYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0pOworI2lmIGRlZmluZWQoQ09ORklHX0RDQSkgfHwgZGVmaW5lZChDT05GSUdfRENBX01PRFVMRSkKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEKQotCQlpeGdiZV91cGRhdGVfcnhfZGNhKGFkYXB0ZXIsIHJ4cik7CisJCWl4Z2JlX3VwZGF0ZV9yeF9kY2EoYWRhcHRlciwgcnhfcmluZyk7CiAjZW5kaWYKIAotCWl4Z2JlX2NsZWFuX3J4X2lycShhZGFwdGVyLCByeHIsICZ3b3JrX2RvbmUsIGJ1ZGdldCk7CisJaXhnYmVfY2xlYW5fcnhfaXJxKGFkYXB0ZXIsIHJ4X3JpbmcsICZ3b3JrX2RvbmUsIGJ1ZGdldCk7CiAKIAkvKiBJZiBhbGwgUnggd29yayBkb25lLCBleGl0IHRoZSBwb2xsaW5nIG1vZGUgKi8KIAlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CiAJCW5ldGlmX3J4X2NvbXBsZXRlKGFkYXB0ZXItPm5ldGRldiwgbmFwaSk7Ci0JCWlmIChhZGFwdGVyLT5yeF9laXRyIDwgSVhHQkVfTUlOX0lUUl9VU0VDUykKKwkJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMykKIAkJCWl4Z2JlX3NldF9pdHJfbXNpeChxX3ZlY3Rvcik7CiAJCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQotCQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNUywgcnhyLT52X2lkeCk7CisJCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSU1TLCByeF9yaW5nLT52X2lkeCk7CiAJfQogCiAJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIAorLyoqCisgKiBpeGdiZV9jbGVhbl9yeG9ubHlfbWFueSAtIG1zaXggKGFrYSBvbmUgc2hvdCkgcnggY2xlYW4gcm91dGluZQorICogQG5hcGk6IG5hcGkgc3RydWN0IHdpdGggb3VyIGRldmljZXMgaW5mbyBpbiBpdAorICogQGJ1ZGdldDogYW1vdW50IG9mIHdvcmsgZHJpdmVyIGlzIGFsbG93ZWQgdG8gZG8gdGhpcyBwYXNzLCBpbiBwYWNrZXRzCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFuIG1vcmUgdGhhbiBvbmUgcnggcXVldWUgYXNzb2NpYXRlZCB3aXRoIGEKKyAqIHFfdmVjdG9yLgorICoqLworc3RhdGljIGludCBpeGdiZV9jbGVhbl9yeG9ubHlfbWFueShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9CisJICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGl4Z2JlX3FfdmVjdG9yLCBuYXBpKTsKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOworCXN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nID0gTlVMTDsKKwlpbnQgd29ya19kb25lID0gMCwgaTsKKwlsb25nIHJfaWR4OworCXUxNiBlbmFibGVfbWFzayA9IDA7CisKKwkvKiBhdHRlbXB0IHRvIGRpc3RyaWJ1dGUgYnVkZ2V0IHRvIGVhY2ggcXVldWUgZmFpcmx5LCBidXQgZG9uJ3QgYWxsb3cKKwkgKiB0aGUgYnVkZ2V0IHRvIGdvIGJlbG93IDEgYmVjYXVzZSB3ZSdsbCBleGl0IHBvbGxpbmcgKi8KKwlidWRnZXQgLz0gKHFfdmVjdG9yLT5yeHJfY291bnQgPzogMSk7CisJYnVkZ2V0ID0gbWF4KGJ1ZGdldCwgMSk7CisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yLT5yeHJfY291bnQ7IGkrKykgeworCQlyeF9yaW5nID0gJihhZGFwdGVyLT5yeF9yaW5nW3JfaWR4XSk7CisjaWYgZGVmaW5lZChDT05GSUdfRENBKSB8fCBkZWZpbmVkKENPTkZJR19EQ0FfTU9EVUxFKQorCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEKQorCQkJaXhnYmVfdXBkYXRlX3J4X2RjYShhZGFwdGVyLCByeF9yaW5nKTsKKyNlbmRpZgorCQlpeGdiZV9jbGVhbl9yeF9pcnEoYWRhcHRlciwgcnhfcmluZywgJndvcmtfZG9uZSwgYnVkZ2V0KTsKKwkJZW5hYmxlX21hc2sgfD0gcnhfcmluZy0+dl9pZHg7CisJCXJfaWR4ID0gZmluZF9uZXh0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKKwkJICAgICAgICAgICAgICAgICAgICAgIHJfaWR4ICsgMSk7CisJfQorCisJcl9pZHggPSBmaW5kX2ZpcnN0X2JpdChxX3ZlY3Rvci0+cnhyX2lkeCwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CisJcnhfcmluZyA9ICYoYWRhcHRlci0+cnhfcmluZ1tyX2lkeF0pOworCS8qIElmIGFsbCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUoYWRhcHRlci0+bmV0ZGV2LCBuYXBpKTsKKwkJaWYgKGFkYXB0ZXItPml0cl9zZXR0aW5nICYgMykKKwkJCWl4Z2JlX3NldF9pdHJfbXNpeChxX3ZlY3Rvcik7CisJCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKQorCQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNUywgZW5hYmxlX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gd29ya19kb25lOworfQogc3RhdGljIGlubGluZSB2b2lkIG1hcF92ZWN0b3JfdG9fcnhxKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphLCBpbnQgdl9pZHgsCi0JCQkJICAgICBpbnQgcl9pZHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJfaWR4KQogewogCWEtPnFfdmVjdG9yW3ZfaWR4XS5hZGFwdGVyID0gYTsKIAlzZXRfYml0KHJfaWR4LCBhLT5xX3ZlY3Rvclt2X2lkeF0ucnhyX2lkeCk7CkBAIC0xMDA0LDcgKzExMDAsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFwX3ZlY3Rvcl90b190eHEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmEsIGludCB2X2lkeCwKLQkJCQkgICAgIGludCByX2lkeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcl9pZHgpCiB7CiAJYS0+cV92ZWN0b3Jbdl9pZHhdLmFkYXB0ZXIgPSBhOwogCXNldF9iaXQocl9pZHgsIGEtPnFfdmVjdG9yW3ZfaWR4XS50eHJfaWR4KTsKQEAgLTEwMjQsNyArMTEyMCw3IEBACiAgKiBtYXBwaW5nIGNvbmZpZ3VyYXRpb25zIGluIGhlcmUuCiAgKiovCiBzdGF0aWMgaW50IGl4Z2JlX21hcF9yaW5nc190b192ZWN0b3JzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgIGludCB2ZWN0b3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVjdG9ycykKIHsKIAlpbnQgdl9zdGFydCA9IDA7CiAJaW50IHJ4cl9pZHggPSAwLCB0eHJfaWR4ID0gMDsKQEAgLTExMDEsMjggKzExOTcsMjggQEAKIAkJZ290byBvdXQ7CiAKICNkZWZpbmUgU0VUX0hBTkRMRVIoX3YpICgoIShfdiktPnJ4cl9jb3VudCkgPyAmaXhnYmVfbXNpeF9jbGVhbl90eCA6IFwKLQkJCSAoIShfdiktPnR4cl9jb3VudCkgPyAmaXhnYmVfbXNpeF9jbGVhbl9yeCA6IFwKLQkJCSAmaXhnYmVfbXNpeF9jbGVhbl9tYW55KQorICAgICAgICAgICAgICAgICAgICAgICAgICghKF92KS0+dHhyX2NvdW50KSA/ICZpeGdiZV9tc2l4X2NsZWFuX3J4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICZpeGdiZV9tc2l4X2NsZWFuX21hbnkpCiAJZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBxX3ZlY3RvcnM7IHZlY3RvcisrKSB7CiAJCWhhbmRsZXIgPSBTRVRfSEFORExFUigmYWRhcHRlci0+cV92ZWN0b3JbdmVjdG9yXSk7CiAJCXNwcmludGYoYWRhcHRlci0+bmFtZVt2ZWN0b3JdLCAiJXM6diVkLSVzIiwKLQkJCW5ldGRldi0+bmFtZSwgdmVjdG9yLAotCQkJKGhhbmRsZXIgPT0gJml4Z2JlX21zaXhfY2xlYW5fcngpID8gIlJ4IiA6Ci0JCQkgKChoYW5kbGVyID09ICZpeGdiZV9tc2l4X2NsZWFuX3R4KSA/ICJUeCIgOiAiVHhSeCIpKTsKKwkJICAgICAgICBuZXRkZXYtPm5hbWUsIHZlY3RvciwKKwkJICAgICAgICAoaGFuZGxlciA9PSAmaXhnYmVfbXNpeF9jbGVhbl9yeCkgPyAiUngiIDoKKwkJICAgICAgICAgKChoYW5kbGVyID09ICZpeGdiZV9tc2l4X2NsZWFuX3R4KSA/ICJUeCIgOiAiVHhSeCIpKTsKIAkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAotCQkJCSAgaGFuZGxlciwgMCwgYWRhcHRlci0+bmFtZVt2ZWN0b3JdLAotCQkJCSAgJihhZGFwdGVyLT5xX3ZlY3Rvclt2ZWN0b3JdKSk7CisJCSAgICAgICAgICAgICAgICAgIGhhbmRsZXIsIDAsIGFkYXB0ZXItPm5hbWVbdmVjdG9yXSwKKwkJICAgICAgICAgICAgICAgICAgJihhZGFwdGVyLT5xX3ZlY3Rvclt2ZWN0b3JdKSk7CiAJCWlmIChlcnIpIHsKIAkJCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJCQkicmVxdWVzdF9pcnEgZmFpbGVkIGZvciBNU0lYIGludGVycnVwdCAiCi0JCQkJIkVycm9yOiAlZFxuIiwgZXJyKTsKKwkJCSAgICAgICAgInJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgTVNJWCBpbnRlcnJ1cHQgIgorCQkJICAgICAgICAiRXJyb3I6ICVkXG4iLCBlcnIpOwogCQkJZ290byBmcmVlX3F1ZXVlX2lycXM7CiAJCX0KIAl9CiAKIAlzcHJpbnRmKGFkYXB0ZXItPm5hbWVbdmVjdG9yXSwgIiVzOmxzYyIsIG5ldGRldi0+bmFtZSk7CiAJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAotCQkJICAmaXhnYmVfbXNpeF9sc2MsIDAsIGFkYXB0ZXItPm5hbWVbdmVjdG9yXSwgbmV0ZGV2KTsKKwkgICAgICAgICAgICAgICAgICAmaXhnYmVfbXNpeF9sc2MsIDAsIGFkYXB0ZXItPm5hbWVbdmVjdG9yXSwgbmV0ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwKIAkJCSJyZXF1ZXN0X2lycSBmb3IgbXNpeF9sc2MgZmFpbGVkOiAlZFxuIiwgZXJyKTsKQEAgLTExMzQsNyArMTIzMCw3IEBACiBmcmVlX3F1ZXVlX2lycXM6CiAJZm9yIChpID0gdmVjdG9yIC0gMTsgaSA+PSAwOyBpLS0pCiAJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1stLXZlY3Rvcl0udmVjdG9yLAotCQkJICYoYWRhcHRlci0+cV92ZWN0b3JbaV0pKTsKKwkJICAgICAgICAgJihhZGFwdGVyLT5xX3ZlY3RvcltpXSkpOwogCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX01TSVhfRU5BQkxFRDsKIAlwY2lfZGlzYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYpOwogCWtmcmVlKGFkYXB0ZXItPm1zaXhfZW50cmllcyk7CkBAIC0xMTUyLDE2ICsxMjQ4LDE2IEBACiAJc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1swXTsKIAlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nWzBdOwogCi0JcV92ZWN0b3ItPnR4X2VpdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIG5ld19pdHIsCi0JCQkJCSAgICAgcV92ZWN0b3ItPnR4X2VpdHIsCi0JCQkJCSAgICAgdHhfcmluZy0+dG90YWxfcGFja2V0cywKLQkJCQkJICAgICB0eF9yaW5nLT50b3RhbF9ieXRlcyk7Ci0JcV92ZWN0b3ItPnJ4X2VpdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIG5ld19pdHIsCi0JCQkJCSAgICAgcV92ZWN0b3ItPnJ4X2VpdHIsCi0JCQkJCSAgICAgcnhfcmluZy0+dG90YWxfcGFja2V0cywKLQkJCQkJICAgICByeF9yaW5nLT50b3RhbF9ieXRlcyk7CisJcV92ZWN0b3ItPnR4X2l0ciA9IGl4Z2JlX3VwZGF0ZV9pdHIoYWRhcHRlciwgbmV3X2l0ciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX3ZlY3Rvci0+dHhfaXRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3JpbmctPnRvdGFsX3BhY2tldHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfcmluZy0+dG90YWxfYnl0ZXMpOworCXFfdmVjdG9yLT5yeF9pdHIgPSBpeGdiZV91cGRhdGVfaXRyKGFkYXB0ZXIsIG5ld19pdHIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV92ZWN0b3ItPnJ4X2l0ciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeF9yaW5nLT50b3RhbF9wYWNrZXRzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X3JpbmctPnRvdGFsX2J5dGVzKTsKIAotCWN1cnJlbnRfaXRyID0gbWF4KHFfdmVjdG9yLT5yeF9laXRyLCBxX3ZlY3Rvci0+dHhfZWl0cik7CisJY3VycmVudF9pdHIgPSBtYXgocV92ZWN0b3ItPnJ4X2l0ciwgcV92ZWN0b3ItPnR4X2l0cik7CiAKIAlzd2l0Y2ggKGN1cnJlbnRfaXRyKSB7CiAJLyogY291bnRzIGFuZCBwYWNrZXRzIGluIHVwZGF0ZV9pdHIgYXJlIGRlcGVuZGVudCBvbiB0aGVzZSBudW1iZXJzICovCkBAIC0xMjA2LDE5ICsxMzAyLDE5IEBACiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgZWljcjsKIAotCiAJLyogZm9yIE5BUEksIHVzaW5nIEVJQU0gdG8gYXV0by1tYXNrIHR4L3J4IGludGVycnVwdCBiaXRzIG9uIHJlYWQKIAkgKiB0aGVyZWZvcmUgbm8gZXhwbGljdCBpbnRlcnJ1cHQgZGlzYWJsZSBpcyBuZWNlc3NhcnkgKi8KIAllaWNyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VJQ1IpOwotCWlmICghZWljcikKKwlpZiAoIWVpY3IpIHsKKwkJLyogc2hhcmVkIGludGVycnVwdCBhbGVydCEKKwkJICogbWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgYmVjYXVzZSB0aGUgcmVhZCB3aWxsCisJCSAqIGhhdmUgZGlzYWJsZWQgaW50ZXJydXB0cyBkdWUgdG8gRUlBTSAqLworCQlpeGdiZV9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCQlyZXR1cm4gSVJRX05PTkU7CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCi0KLQlpZiAoZWljciAmIElYR0JFX0VJQ1JfTFNDKSB7Ci0JCWFkYXB0ZXItPmxzY19pbnQrKzsKLQkJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCi0JCQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKIAl9CiAKKwlpZiAoZWljciAmIElYR0JFX0VJQ1JfTFNDKQorCQlpeGdiZV9jaGVja19sc2MoYWRhcHRlcik7CiAKIAlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChuZXRkZXYsICZhZGFwdGVyLT5xX3ZlY3RvclswXS5uYXBpKSkgewogCQlhZGFwdGVyLT50eF9yaW5nWzBdLnRvdGFsX3BhY2tldHMgPSAwOwpAQCAtMTI2MSwxMCArMTM1NywxMCBAQAogCQllcnIgPSBpeGdiZV9yZXF1ZXN0X21zaXhfaXJxcyhhZGFwdGVyKTsKIAl9IGVsc2UgaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lfRU5BQkxFRCkgewogCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZpeGdiZV9pbnRyLCAwLAotCQkJCSAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQkgICAgICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldik7CiAJfSBlbHNlIHsKIAkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCAmaXhnYmVfaW50ciwgSVJRRl9TSEFSRUQsCi0JCQkJICBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCSAgICAgICAgICAgICAgICAgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMTI4OCw3ICsxMzg0LDcgQEAKIAkJaS0tOwogCQlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKIAkJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJICYoYWRhcHRlci0+cV92ZWN0b3JbaV0pKTsKKwkJCSAgICAgICAgICYoYWRhcHRlci0+cV92ZWN0b3JbaV0pKTsKIAkJfQogCiAJCWl4Z2JlX3Jlc2V0X3FfdmVjdG9ycyhhZGFwdGVyKTsKQEAgLTEzMzUsNyArMTQzMSw3IEBACiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlUUigwKSwKLQkJCUVJVFJfSU5UU19QRVJfU0VDX1RPX1JFRyhhZGFwdGVyLT5yeF9laXRyKSk7CisJICAgICAgICAgICAgICAgIEVJVFJfSU5UU19QRVJfU0VDX1RPX1JFRyhhZGFwdGVyLT5laXRyX3BhcmFtKSk7CiAKIAlpeGdiZV9zZXRfaXZhcihhZGFwdGVyLCBJWEdCRV9JVkFSX1JYX1FVRVVFKDApLCAwKTsKIAlpeGdiZV9zZXRfaXZhcihhZGFwdGVyLCBJWEdCRV9JVkFSX1RYX1FVRVVFKDApLCAwKTsKQEAgLTEzNDcsMjYgKzE0NDMsMzEgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9jb25maWd1cmVfdHggLSBDb25maWd1cmUgODI1NHggVHJhbnNtaXQgVW5pdCBhZnRlciBSZXNldAorICogaXhnYmVfY29uZmlndXJlX3R4IC0gQ29uZmlndXJlIDgyNTl4IFRyYW5zbWl0IFVuaXQgYWZ0ZXIgUmVzZXQKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoKICAqIENvbmZpZ3VyZSB0aGUgVHggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCiAgKiovCiBzdGF0aWMgdm9pZCBpeGdiZV9jb25maWd1cmVfdHgoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdTY0IHRkYmE7CisJdTY0IHRkYmEsIHRkd2JhOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIGksIGosIHRkbGVuLCB0eGN0cmw7CiAKIAkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgewotCQlqID0gYWRhcHRlci0+dHhfcmluZ1tpXS5yZWdfaWR4OwotCQl0ZGJhID0gYWRhcHRlci0+dHhfcmluZ1tpXS5kbWE7Ci0JCXRkbGVuID0gYWRhcHRlci0+dHhfcmluZ1tpXS5jb3VudCAqCi0JCQlzaXplb2YodW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MpOworCQlzdHJ1Y3QgaXhnYmVfcmluZyAqcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCQlqID0gcmluZy0+cmVnX2lkeDsKKwkJdGRiYSA9IHJpbmctPmRtYTsKKwkJdGRsZW4gPSByaW5nLT5jb3VudCAqIHNpemVvZih1bmlvbiBpeGdiZV9hZHZfdHhfZGVzYyk7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVERCQUwoaiksCi0JCQkJKHRkYmEgJiBETUFfMzJCSVRfTUFTSykpOworCQkgICAgICAgICAgICAgICAgKHRkYmEgJiBETUFfMzJCSVRfTUFTSykpOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1REQkFIKGopLCAodGRiYSA+PiAzMikpOworCQl0ZHdiYSA9IHJpbmctPmRtYSArCisJCSAgICAgICAgKHJpbmctPmNvdW50ICogc2l6ZW9mKHVuaW9uIGl4Z2JlX2Fkdl90eF9kZXNjKSk7CisJCXRkd2JhIHw9IElYR0JFX1REV0JBTF9IRUFEX1dCX0VOQUJMRTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9URFdCQUwoaiksIHRkd2JhICYgRE1BXzMyQklUX01BU0spOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1REV0JBSChqKSwgKHRkd2JhID4+IDMyKSk7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVERMRU4oaiksIHRkbGVuKTsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9UREgoaiksIDApOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1REVChqKSwgMCk7CkBAIC0xMzc1LDIwICsxNDc2LDY2IEBACiAJCS8qIERpc2FibGUgVHggSGVhZCBXcml0ZWJhY2sgUk8gYml0LCBzaW5jZSB0aGlzIGhvc2VzCiAJCSAqIGJvb2trZWVwaW5nIGlmIHRoaW5ncyBhcmVuJ3QgZGVsaXZlcmVkIGluIG9yZGVyLgogCQkgKi8KLQkJdHhjdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkwoaSkpOworCQl0eGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRENBX1RYQ1RSTChqKSk7CiAJCXR4Y3RybCAmPSB+SVhHQkVfRENBX1RYQ1RSTF9UWF9XQl9ST19FTjsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9EQ0FfVFhDVFJMKGkpLCB0eGN0cmwpOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkwoaiksIHR4Y3RybCk7CiAJfQogfQogCi0jZGVmaW5lIFBBR0VfVVNFX0NPVU5UKFMpICgoKFMpID4+IFBBR0VfU0hJRlQpICsgXAotCQkJKCgoUykgJiAoUEFHRV9TSVpFIC0gMSkpID8gMSA6IDApKQorI2RlZmluZSBJWEdCRV9TUlJDVExfQlNJWkVIRFJTSVpFX1NISUZUCTIKIAotI2RlZmluZSBJWEdCRV9TUlJDVExfQlNJWkVIRFJTSVpFX1NISUZUCQkJMgorc3RhdGljIHZvaWQgaXhnYmVfY29uZmlndXJlX3NycmN0bChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IGluZGV4KQoreworCXN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nOworCXUzMiBzcnJjdGw7CisJaW50IHF1ZXVlMDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwkvKiBwcm9ncmFtIG9uZSBzcnJjdGwgcmVnaXN0ZXIgcGVyIFZNRHEgaW5kZXggKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkgeworCQlsb25nIHNoaWZ0LCBsZW47CisJCW1hc2sgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLm1hc2s7CisJCWxlbiA9IHNpemVvZihhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1ZNRFFdLm1hc2spICogODsKKwkJc2hpZnQgPSBmaW5kX2ZpcnN0X2JpdCgmbWFzaywgbGVuKTsKKwkJcXVldWUwID0gaW5kZXggJiBtYXNrOworCQlpbmRleCA9IChpbmRleCAmIG1hc2spID4+IHNoaWZ0OworCS8qIHByb2dyYW0gb25lIHNycmN0bCBwZXIgUlNTIHF1ZXVlIHNpbmNlIFJEUlhDVEwuTVZNRU4gaXMgZW5hYmxlZCAqLworCX0gZWxzZSB7CisJCW1hc2sgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLm1hc2s7CisJCXF1ZXVlMCA9IGluZGV4ICYgbWFzazsKKwkJaW5kZXggPSBpbmRleCAmIG1hc2s7CisJfQorCisJcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW3F1ZXVlMF07CisKKwlzcnJjdGwgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1NSUkNUTChpbmRleCkpOworCisJc3JyY3RsICY9IH5JWEdCRV9TUlJDVExfQlNJWkVIRFJfTUFTSzsKKwlzcnJjdGwgJj0gfklYR0JFX1NSUkNUTF9CU0laRVBLVF9NQVNLOworCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEKSB7CisJCXNycmN0bCB8PSBJWEdCRV9SWEJVRkZFUl8yMDQ4ID4+IElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVDsKKwkJc3JyY3RsIHw9IElYR0JFX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVRfQUxXQVlTOworCQlzcnJjdGwgfD0gKChJWEdCRV9SWF9IRFJfU0laRSA8PAorCQkgICAgICAgICAgICBJWEdCRV9TUlJDVExfQlNJWkVIRFJTSVpFX1NISUZUKSAmCisJCSAgICAgICAgICAgSVhHQkVfU1JSQ1RMX0JTSVpFSERSX01BU0spOworCX0gZWxzZSB7CisJCXNycmN0bCB8PSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfQURWX09ORUJVRjsKKworCQlpZiAocnhfcmluZy0+cnhfYnVmX2xlbiA9PSBNQVhJTVVNX0VUSEVSTkVUX1ZMQU5fU0laRSkKKwkJCXNycmN0bCB8PSBJWEdCRV9SWEJVRkZFUl8yMDQ4ID4+CisJCQkgICAgICAgICAgSVhHQkVfU1JSQ1RMX0JTSVpFUEtUX1NISUZUOworCQllbHNlCisJCQlzcnJjdGwgfD0gcnhfcmluZy0+cnhfYnVmX2xlbiA+PgorCQkJICAgICAgICAgIElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVDsKKwl9CisJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfU1JSQ1RMKGluZGV4KSwgc3JyY3RsKTsKK30KKwogLyoqCiAgKiBpeGdiZV9nZXRfc2tiX2hkciAtIGhlbHBlciBmdW5jdGlvbiBmb3IgTFJPIGhlYWRlciBwcm9jZXNzaW5nCiAgKiBAc2tiOiBwb2ludGVyIHRvIHNrX2J1ZmYgdG8gYmUgYWRkZWQgdG8gTFJPIHBhY2tldAotICogQGlwaGRyOiBwb2ludGVyIHRvIHRjcCBoZWFkZXIgc3RydWN0dXJlCisgKiBAaXBoZHI6IHBvaW50ZXIgdG8gaXAgaGVhZGVyIHN0cnVjdHVyZQogICogQHRjcGg6IHBvaW50ZXIgdG8gdGNwIGhlYWRlciBzdHJ1Y3R1cmUKICAqIEBoZHJfZmxhZ3M6IHBvaW50ZXIgdG8gaGVhZGVyIGZsYWdzCiAgKiBAcHJpdjogcHJpdmF0ZSBkYXRhCkBAIC0xMzk5LDggKzE1NDYsOCBAQAogCXVuaW9uIGl4Z2JlX2Fkdl9yeF9kZXNjICpyeF9kZXNjID0gcHJpdjsKIAogCS8qIFZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2YWxpZCBJUHY0IFRDUCBwYWNrZXQgKi8KLQlpZiAoIShyeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5wa3RfaW5mbyAmCi0JICAgIChJWEdCRV9SWERBRFZfUEtUVFlQRV9JUFY0IHwgSVhHQkVfUlhEQURWX1BLVFRZUEVfVENQKSkpCisJaWYgKCEoKGl4Z2JlX2dldF9wa3RfaW5mbyhyeF9kZXNjKSAmIElYR0JFX1JYREFEVl9QS1RUWVBFX0lQVjQpICYmCisJICAgICAoaXhnYmVfZ2V0X3BrdF9pbmZvKHJ4X2Rlc2MpICYgSVhHQkVfUlhEQURWX1BLVFRZUEVfVENQKSkpCiAJCXJldHVybiAtMTsKIAogCS8qIFNldCBuZXR3b3JrIGhlYWRlcnMgKi8KQEAgLTE0MTIsOCArMTU1OSwxMSBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIFBBR0VfVVNFX0NPVU5UKFMpICgoKFMpID4+IFBBR0VfU0hJRlQpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUykgJiAoUEFHRV9TSVpFIC0gMSkpID8gMSA6IDApKQorCiAvKioKLSAqIGl4Z2JlX2NvbmZpZ3VyZV9yeCAtIENvbmZpZ3VyZSA4MjU0eCBSZWNlaXZlIFVuaXQgYWZ0ZXIgUmVzZXQKKyAqIGl4Z2JlX2NvbmZpZ3VyZV9yeCAtIENvbmZpZ3VyZSA4MjU5eCBSZWNlaXZlIFVuaXQgYWZ0ZXIgUmVzZXQKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoKICAqIENvbmZpZ3VyZSB0aGUgUnggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCkBAIC0xNDI2LDI1ICsxNTc2LDI2IEBACiAJaW50IG1heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRVRIX0hMRU4gKyBFVEhfRkNTX0xFTjsKIAlpbnQgaSwgajsKIAl1MzIgcmRsZW4sIHJ4Y3RybCwgcnhjc3VtOwotCXUzMiByYW5kb21bMTBdOworCXN0YXRpYyBjb25zdCB1MzIgc2VlZFsxMF0gPSB7IDB4RTI5MUQ3M0QsIDB4MTgwNUVDNkMsIDB4MkE5NEIzMEQsCisJICAgICAgICAgICAgICAgICAgMHhBNTRGMkJFQywgMHhFQTQ5QUY3QywgMHhFMjE0QUQzRCwgMHhCODU1QUFCRSwKKwkgICAgICAgICAgICAgICAgICAweDZBM0U2N0VBLCAweDE0MzY0RDE3LCAweDNCRUQyMDBEfTsKIAl1MzIgZmN0cmwsIGhscmVnMDsKIAl1MzIgcGFnZXM7Ci0JdTMyIHJldGEgPSAwLCBtcnFjLCBzcnJjdGw7CisJdTMyIHJldGEgPSAwLCBtcnFjOworCXUzMiByZHJ4Y3RsOworCWludCByeF9idWZfbGVuOwogCiAJLyogRGVjaWRlIHdoZXRoZXIgdG8gdXNlIHBhY2tldCBzcGxpdCBtb2RlIG9yIG5vdCAqLwotCWlmIChuZXRkZXYtPm10dSA+IEVUSF9EQVRBX0xFTikKLQkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEOwotCWVsc2UKLQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfUlhfUFNfRU5BQkxFRDsKKwlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX1JYX1BTX0VOQUJMRUQ7CiAKIAkvKiBTZXQgdGhlIFJYIGJ1ZmZlciBsZW5ndGggYWNjb3JkaW5nIHRvIHRoZSBtb2RlICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEKSB7Ci0JCWFkYXB0ZXItPnJ4X2J1Zl9sZW4gPSBJWEdCRV9SWF9IRFJfU0laRTsKKwkJcnhfYnVmX2xlbiA9IElYR0JFX1JYX0hEUl9TSVpFOwogCX0gZWxzZSB7CiAJCWlmIChuZXRkZXYtPm10dSA8PSBFVEhfREFUQV9MRU4pCi0JCQlhZGFwdGVyLT5yeF9idWZfbGVuID0gTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkU7CisJCQlyeF9idWZfbGVuID0gTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkU7CiAJCWVsc2UKLQkJCWFkYXB0ZXItPnJ4X2J1Zl9sZW4gPSBBTElHTihtYXhfZnJhbWUsIDEwMjQpOworCQkJcnhfYnVmX2xlbiA9IEFMSUdOKG1heF9mcmFtZSwgMTAyNCk7CiAJfQogCiAJZmN0cmwgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0ZDVFJMKTsKQEAgLTE0NjEsMjggKzE2MTIsNiBAQAogCiAJcGFnZXMgPSBQQUdFX1VTRV9DT1VOVChhZGFwdGVyLT5uZXRkZXYtPm10dSk7CiAKLQlzcnJjdGwgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1NSUkNUTCgwKSk7Ci0Jc3JyY3RsICY9IH5JWEdCRV9TUlJDVExfQlNJWkVIRFJfTUFTSzsKLQlzcnJjdGwgJj0gfklYR0JFX1NSUkNUTF9CU0laRVBLVF9NQVNLOwotCi0JaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SWF9QU19FTkFCTEVEKSB7Ci0JCXNycmN0bCB8PSBQQUdFX1NJWkUgPj4gSVhHQkVfU1JSQ1RMX0JTSVpFUEtUX1NISUZUOwotCQlzcnJjdGwgfD0gSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0hEUl9TUExJVF9BTFdBWVM7Ci0JCXNycmN0bCB8PSAoKElYR0JFX1JYX0hEUl9TSVpFIDw8Ci0JCQkgICAgSVhHQkVfU1JSQ1RMX0JTSVpFSERSU0laRV9TSElGVCkgJgotCQkJICAgSVhHQkVfU1JSQ1RMX0JTSVpFSERSX01BU0spOwotCX0gZWxzZSB7Ci0JCXNycmN0bCB8PSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfQURWX09ORUJVRjsKLQotCQlpZiAoYWRhcHRlci0+cnhfYnVmX2xlbiA9PSBNQVhJTVVNX0VUSEVSTkVUX1ZMQU5fU0laRSkKLQkJCXNycmN0bCB8PQotCQkJICAgICBJWEdCRV9SWEJVRkZFUl8yMDQ4ID4+IElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVDsKLQkJZWxzZQotCQkJc3JyY3RsIHw9Ci0JCQkgICAgIGFkYXB0ZXItPnJ4X2J1Zl9sZW4gPj4gSVhHQkVfU1JSQ1RMX0JTSVpFUEtUX1NISUZUOwotCX0KLQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9TUlJDVEwoMCksIHNycmN0bCk7Ci0KIAlyZGxlbiA9IGFkYXB0ZXItPnJ4X3JpbmdbMF0uY291bnQgKiBzaXplb2YodW5pb24gaXhnYmVfYWR2X3J4X2Rlc2MpOwogCS8qIGRpc2FibGUgcmVjZWl2ZXMgd2hpbGUgc2V0dGluZyB1cCB0aGUgZGVzY3JpcHRvcnMgKi8KIAlyeGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhDVFJMKTsKQEAgLTE0OTIsMjUgKzE2MjEsNDMgQEAKIAkgKiB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKSB7CiAJCXJkYmEgPSBhZGFwdGVyLT5yeF9yaW5nW2ldLmRtYTsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SREJBTChpKSwgKHJkYmEgJiBETUFfMzJCSVRfTUFTSykpOwotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JEQkFIKGkpLCAocmRiYSA+PiAzMikpOwotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JETEVOKGkpLCByZGxlbik7Ci0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkRIKGkpLCAwKTsKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SRFQoaSksIDApOwotCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmhlYWQgPSBJWEdCRV9SREgoaSk7Ci0JCWFkYXB0ZXItPnJ4X3JpbmdbaV0udGFpbCA9IElYR0JFX1JEVChpKTsKKwkJaiA9IGFkYXB0ZXItPnJ4X3JpbmdbaV0ucmVnX2lkeDsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SREJBTChqKSwgKHJkYmEgJiBETUFfMzJCSVRfTUFTSykpOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JEQkFIKGopLCAocmRiYSA+PiAzMikpOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JETEVOKGopLCByZGxlbik7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkRIKGopLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SRFQoaiksIDApOworCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmhlYWQgPSBJWEdCRV9SREgoaik7CisJCWFkYXB0ZXItPnJ4X3JpbmdbaV0udGFpbCA9IElYR0JFX1JEVChqKTsKKwkJYWRhcHRlci0+cnhfcmluZ1tpXS5yeF9idWZfbGVuID0gcnhfYnVmX2xlbjsKKwkJLyogSW50aXRpYWwgTFJPIFNldHRpbmdzICovCisJCWFkYXB0ZXItPnJ4X3JpbmdbaV0ubHJvX21nci5tYXhfYWdnciA9IElYR0JFX01BWF9MUk9fQUdHUkVHQVRFOworCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmxyb19tZ3IubWF4X2Rlc2MgPSBJWEdCRV9NQVhfTFJPX0RFU0NSSVBUT1JTOworCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmxyb19tZ3IuZ2V0X3NrYl9oZWFkZXIgPSBpeGdiZV9nZXRfc2tiX2hkcjsKKwkJYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmZlYXR1cmVzID0gTFJPX0ZfRVhUUkFDVF9WTEFOX0lEOworCQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfSU5fTkVUUE9MTCkpCisJCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmxyb19tZ3IuZmVhdHVyZXMgfD0gTFJPX0ZfTkFQSTsKKwkJYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwkJYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmxyb19tZ3IuaXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCQlpeGdiZV9jb25maWd1cmVfc3JyY3RsKGFkYXB0ZXIsIGopOwogCX0KIAotCS8qIEludGl0aWFsIExSTyBTZXR0aW5ncyAqLwotCWFkYXB0ZXItPnJ4X3JpbmdbaV0ubHJvX21nci5tYXhfYWdnciA9IElYR0JFX01BWF9MUk9fQUdHUkVHQVRFOwotCWFkYXB0ZXItPnJ4X3JpbmdbaV0ubHJvX21nci5tYXhfZGVzYyA9IElYR0JFX01BWF9MUk9fREVTQ1JJUFRPUlM7Ci0JYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmdldF9za2JfaGVhZGVyID0gaXhnYmVfZ2V0X3NrYl9oZHI7Ci0JYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmZlYXR1cmVzID0gTFJPX0ZfRVhUUkFDVF9WTEFOX0lEOwotCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19JTl9ORVRQT0xMKSkKLQkJYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmZlYXR1cmVzIHw9IExST19GX05BUEk7Ci0JYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQlhZGFwdGVyLT5yeF9yaW5nW2ldLmxyb19tZ3IuaXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JYWRhcHRlci0+cnhfcmluZ1tpXS5scm9fbWdyLmlwX3N1bW1lZF9hZ2dyID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJLyoKKwkgKiBGb3IgVk1EcSBzdXBwb3J0IG9mIGRpZmZlcmVudCBkZXNjcmlwdG9yIHR5cGVzIG9yCisJICogYnVmZmVyIHNpemVzIHRocm91Z2ggdGhlIHVzZSBvZiBtdWx0aXBsZSBTUlJDVEwKKwkgKiByZWdpc3RlcnMsIFJEUlhDVEwuTVZNRU4gbXVzdCBiZSBzZXQgdG8gMQorCSAqCisJICogYWxzbywgdGhlIG1hbnVhbCBkb2Vzbid0IG1lbnRpb24gaXQgY2xlYXJseSBidXQgRENBIGhpbnRzCisJICogd2lsbCBvbmx5IHVzZSBxdWV1ZSAwJ3MgdGFncyB1bmxlc3MgdGhpcyBiaXQgaXMgc2V0LiAgU2lkZQorCSAqIGVmZmVjdHMgb2Ygc2V0dGluZyB0aGlzIGJpdCBhcmUgb25seSB0aGF0IFNSUkNUTCBtdXN0IGJlCisJICogZnVsbHkgcHJvZ3JhbW1lZCBbMC4uMTVdCisJICovCisJcmRyeGN0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SRFJYQ1RMKTsKKwlyZHJ4Y3RsIHw9IElYR0JFX1JEUlhDVExfTVZNRU47CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SRFJYQ1RMLCByZHJ4Y3RsKTsKKwogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19SU1NfRU5BQkxFRCkgewogCQkvKiBGaWxsIG91dCByZWRpcmVjdGlvbiB0YWJsZSAqLwpAQCAtMTUyNSwyMiArMTY3MiwyMCBAQAogCQl9CiAKIAkJLyogRmlsbCBvdXQgaGFzaCBmdW5jdGlvbiBzZWVkcyAqLwotCQkvKiBYWFggdXNlIGEgcmFuZG9tIGNvbnN0YW50IGhlcmUgdG8gZ2x1ZSBjZXJ0YWluIGZsb3dzICovCi0JCWdldF9yYW5kb21fYnl0ZXMoJnJhbmRvbVswXSwgNDApOwogCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlNTUksoaSksIHJhbmRvbVtpXSk7CisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JTU1JLKGkpLCBzZWVkW2ldKTsKIAogCQltcnFjID0gSVhHQkVfTVJRQ19SU1NFTgogCQkgICAgLyogUGVyZm9ybSBoYXNoIG9uIHRoZXNlIHBhY2tldCB0eXBlcyAqLwotCQkgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY0Ci0JCSAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjRfVENQCi0JCSAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjRfVURQCi0JCSAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjZfRVhfVENQCi0JCSAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjZfRVgKLQkJICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNgotCQkgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY2X1RDUAotCQkgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY2X1VEUAotCQkgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY2X0VYX1VEUDsKKwkJICAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNAorCQkgICAgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY0X1RDUAorCQkgICAgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY0X1VEUAorCQkgICAgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY2X0VYX1RDUAorCQkgICAgICAgfCBJWEdCRV9NUlFDX1JTU19GSUVMRF9JUFY2X0VYCisJCSAgICAgICB8IElYR0JFX01SUUNfUlNTX0ZJRUxEX0lQVjYKKwkJICAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9UQ1AKKwkJICAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9VRFAKKwkJICAgICAgIHwgSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9FWF9VRFA7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVJRQywgbXJxYyk7CiAJfQogCkBAIC0xNTYyLDcgKzE3MDcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTMyIGN0cmw7CkBAIC0xNTg2LDE0ICsxNzMxLDE2IEBACiBzdGF0aWMgdm9pZCBpeGdiZV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCi0JaXhnYmVfc2V0X3ZmdGEoJmFkYXB0ZXItPmh3LCB2aWQsIDAsIHRydWUpOworCWh3LT5tYWMub3BzLnNldF92ZnRhKCZhZGFwdGVyLT5odywgdmlkLCAwLCB0cnVlKTsKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCWl4Z2JlX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwpAQCAtMTYwNCw3ICsxNzUxLDcgQEAKIAkJaXhnYmVfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAogCS8qIHJlbW92ZSBWSUQgZnJvbSBmaWx0ZXIgdGFibGUgKi8KLQlpeGdiZV9zZXRfdmZ0YSgmYWRhcHRlci0+aHcsIHZpZCwgMCwgZmFsc2UpOworCWh3LT5tYWMub3BzLnNldF92ZnRhKCZhZGFwdGVyLT5odywgdmlkLCAwLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTE2MjEsMjMgKzE3NjgsMzcgQEAKIAl9CiB9CiAKK3N0YXRpYyB1OCAqaXhnYmVfYWRkcl9saXN0X2l0cihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqKm1jX2FkZHJfcHRyLCB1MzIgKnZtZHEpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJdTggKmFkZHIgPSAqbWNfYWRkcl9wdHI7CisJKnZtZHEgPSAwOworCisJbWNfcHRyID0gY29udGFpbmVyX29mKGFkZHIsIHN0cnVjdCBkZXZfbWNfbGlzdCwgZG1pX2FkZHJbMF0pOworCWlmIChtY19wdHItPm5leHQpCisJCSptY19hZGRyX3B0ciA9IG1jX3B0ci0+bmV4dC0+ZG1pX2FkZHI7CisJZWxzZQorCQkqbWNfYWRkcl9wdHIgPSBOVUxMOworCisJcmV0dXJuIGFkZHI7Cit9CisKIC8qKgotICogaXhnYmVfc2V0X211bHRpIC0gTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlIHNldAorICogaXhnYmVfc2V0X3J4X21vZGUgLSBVbmljYXN0LCBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGUgc2V0CiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogVGhlIHNldF9tdWx0aSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG11bHRpY2FzdCBhZGRyZXNzCi0gKiBsaXN0IG9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmbGFncyBhcmUgdXBkYXRlZC4gIFRoaXMgcm91dGluZSBpcwotICogcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZSBmb3IgcHJvcGVyIG11bHRpY2FzdCwKLSAqIHByb21pc2N1b3VzIG1vZGUsIGFuZCBhbGwtbXVsdGkgYmVoYXZpb3IuCisgKiBUaGUgc2V0X3J4X21ldGhvZCBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVuaWNhc3QvbXVsdGljYXN0CisgKiBhZGRyZXNzIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgdW5pY2FzdCwgbXVsdGljYXN0IGFuZAorICogcHJvbWlzY3VvdXMgbW9kZS4KICAqKi8KLXN0YXRpYyB2b2lkIGl4Z2JlX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIHZvaWQgaXhnYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKLQl1OCAqbXRhX2xpc3Q7CiAJdTMyIGZjdHJsLCB2bG5jdHJsOwotCWludCBpOworCXU4ICphZGRyX2xpc3QgPSBOVUxMOworCWludCBhZGRyX2NvdW50ID0gMDsKIAogCS8qIENoZWNrIGZvciBQcm9taXNjdW91cyBhbmQgQWxsIE11bHRpY2FzdCBtb2RlcyAqLwogCkBAIC0xNjQ1LDYgKzE4MDYsNyBAQAogCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7CiAKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWh3LT5hZGRyX2N0cmwudXNlcl9zZXRfcHJvbWlzYyA9IDE7CiAJCWZjdHJsIHw9IChJWEdCRV9GQ1RSTF9VUEUgfCBJWEdCRV9GQ1RSTF9NUEUpOwogCQl2bG5jdHJsICY9IH5JWEdCRV9WTE5DVFJMX1ZGRTsKIAl9IGVsc2UgewpAQCAtMTY1NSwzMyArMTgxNywyNSBAQAogCQkJZmN0cmwgJj0gfihJWEdCRV9GQ1RSTF9VUEUgfCBJWEdCRV9GQ1RSTF9NUEUpOwogCQl9CiAJCXZsbmN0cmwgfD0gSVhHQkVfVkxOQ1RSTF9WRkU7CisJCWh3LT5hZGRyX2N0cmwudXNlcl9zZXRfcHJvbWlzYyA9IDA7CiAJfQogCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1RSTCwgZmN0cmwpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7CiAKLQlpZiAobmV0ZGV2LT5tY19jb3VudCkgewotCQltdGFfbGlzdCA9IGtjYWxsb2MobmV0ZGV2LT5tY19jb3VudCwgRVRIX0FMRU4sIEdGUF9BVE9NSUMpOwotCQlpZiAoIW10YV9saXN0KQotCQkJcmV0dXJuOworCS8qIHJlcHJvZ3JhbSBzZWNvbmRhcnkgdW5pY2FzdCBsaXN0ICovCisJYWRkcl9jb3VudCA9IG5ldGRldi0+dWNfY291bnQ7CisJaWYgKGFkZHJfY291bnQpCisJCWFkZHJfbGlzdCA9IG5ldGRldi0+dWNfbGlzdC0+ZG1pX2FkZHI7CisJaHctPm1hYy5vcHMudXBkYXRlX3VjX2FkZHJfbGlzdChodywgYWRkcl9saXN0LCBhZGRyX2NvdW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeGdiZV9hZGRyX2xpc3RfaXRyKTsKIAotCQkvKiBTaGFyZWQgZnVuY3Rpb24gZXhwZWN0cyBwYWNrZWQgYXJyYXkgb2Ygb25seSBhZGRyZXNzZXMuICovCi0JCW1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbmV0ZGV2LT5tY19jb3VudDsgaSsrKSB7Ci0JCQlpZiAoIW1jX3B0cikKLQkJCQlicmVhazsKLQkJCW1lbWNweShtdGFfbGlzdCArIChpICogRVRIX0FMRU4pLCBtY19wdHItPmRtaV9hZGRyLAotCQkJICAgICAgIEVUSF9BTEVOKTsKLQkJCW1jX3B0ciA9IG1jX3B0ci0+bmV4dDsKLQkJfQotCi0JCWl4Z2JlX3VwZGF0ZV9tY19hZGRyX2xpc3QoaHcsIG10YV9saXN0LCBpLCAwKTsKLQkJa2ZyZWUobXRhX2xpc3QpOwotCX0gZWxzZSB7Ci0JCWl4Z2JlX3VwZGF0ZV9tY19hZGRyX2xpc3QoaHcsIE5VTEwsIDAsIDApOwotCX0KLQorCS8qIHJlcHJvZ3JhbSBtdWx0aWNhc3QgbGlzdCAqLworCWFkZHJfY291bnQgPSBuZXRkZXYtPm1jX2NvdW50OworCWlmIChhZGRyX2NvdW50KQorCQlhZGRyX2xpc3QgPSBuZXRkZXYtPm1jX2xpc3QtPmRtaV9hZGRyOworCWh3LT5tYWMub3BzLnVwZGF0ZV9tY19hZGRyX2xpc3QoaHcsIGFkZHJfbGlzdCwgYWRkcl9jb3VudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2FkZHJfbGlzdF9pdHIpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9uYXBpX2VuYWJsZV9hbGwoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xNjk1LDEwICsxODQ5LDE2IEBACiAJCXFfdmVjdG9ycyA9IDE7CiAKIAlmb3IgKHFfaWR4ID0gMDsgcV9pZHggPCBxX3ZlY3RvcnM7IHFfaWR4KyspIHsKKwkJc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOwogCQlxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcltxX2lkeF07CiAJCWlmICghcV92ZWN0b3ItPnJ4cl9jb3VudCkKIAkJCWNvbnRpbnVlOwotCQluYXBpX2VuYWJsZSgmcV92ZWN0b3ItPm5hcGkpOworCQluYXBpID0gJnFfdmVjdG9yLT5uYXBpOworCQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQpICYmCisJCSAgICAocV92ZWN0b3ItPnJ4cl9jb3VudCA+IDEpKQorCQkJbmFwaS0+cG9sbCA9ICZpeGdiZV9jbGVhbl9yeG9ubHlfbWFueTsKKworCQluYXBpX2VuYWJsZShuYXBpKTsKIAl9CiB9CiAKQEAgLTE3MjUsNyArMTg4NSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlpbnQgaTsKIAotCWl4Z2JlX3NldF9tdWx0aShuZXRkZXYpOworCWl4Z2JlX3NldF9yeF9tb2RlKG5ldGRldik7CiAKIAlpeGdiZV9yZXN0b3JlX3ZsYW4oYWRhcHRlcik7CiAKQEAgLTE3MzMsNyArMTg5Myw3IEBACiAJaXhnYmVfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCWl4Z2JlX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0sCi0JCQkJCSAgIChhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50IC0gMSkpOworCQkgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50IC0gMSkpOwogfQogCiBzdGF0aWMgaW50IGl4Z2JlX3VwX2NvbXBsZXRlKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTc1MSw3ICsxOTExLDcgQEAKIAkgICAgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lfRU5BQkxFRCkpIHsKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19NU0lYX0VOQUJMRUQpIHsKIAkJCWdwaWUgPSAoSVhHQkVfR1BJRV9NU0lYX01PREUgfCBJWEdCRV9HUElFX0VJQU1FIHwKLQkJCQlJWEdCRV9HUElFX1BCQV9TVVBQT1JUIHwgSVhHQkVfR1BJRV9PQ0QpOworCQkJICAgICAgICBJWEdCRV9HUElFX1BCQV9TVVBQT1JUIHwgSVhHQkVfR1BJRV9PQ0QpOwogCQl9IGVsc2UgewogCQkJLyogTVNJIG9ubHkgKi8KIAkJCWdwaWUgPSAwOwpAQCAtMTc3OCw2ICsxOTM4LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaSsrKSB7CiAJCWogPSBhZGFwdGVyLT50eF9yaW5nW2ldLnJlZ19pZHg7CiAJCXR4ZGN0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9UWERDVEwoaikpOworCQkvKiBlbmFibGUgV1RIUkVTSD04IGRlc2NyaXB0b3JzLCB0byBlbmNvdXJhZ2UgYnVyc3Qgd3JpdGViYWNrICovCisJCXR4ZGN0bCB8PSAoOCA8PCAxNik7CiAJCXR4ZGN0bCB8PSBJWEdCRV9UWERDVExfRU5BQkxFOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1RYRENUTChqKSwgdHhkY3RsKTsKIAl9CkBAIC0xODEyLDYgKzE5NzQsOCBAQAogCiAJLyogYnJpbmcgdGhlIGxpbmsgdXAgaW4gdGhlIHdhdGNoZG9nLCB0aGlzIGNvdWxkIHJhY2Ugd2l0aCBvdXIgZmlyc3QKIAkgKiBsaW5rIHVwIGludGVycnVwdCBidXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLworCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfTkVFRF9MSU5LX1VQREFURTsKKwlhZGFwdGVyLT5saW5rX2NoZWNrX3RpbWVvdXQgPSBqaWZmaWVzOwogCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOwogCXJldHVybiAwOwogfQpAQCAtMTgzNiw1OCArMjAwMCwyMiBAQAogCiB2b2lkIGl4Z2JlX3Jlc2V0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChpeGdiZV9pbml0X2h3KCZhZGFwdGVyLT5odykpCi0JCURQUklOVEsoUFJPQkUsIEVSUiwgIkhhcmR3YXJlIEVycm9yXG4iKTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCWlmIChody0+bWFjLm9wcy5pbml0X2h3KGh3KSkKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiSGFyZHdhcmUgRXJyb3JcbiIpOwogCiAJLyogcmVwcm9ncmFtIHRoZSBSQVJbMF0gaW4gY2FzZSB1c2VyIGNoYW5nZWQgaXQuICovCi0JaXhnYmVfc2V0X3JhcigmYWRhcHRlci0+aHcsIDAsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOworCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIDAsIGh3LT5tYWMuYWRkciwgMCwgSVhHQkVfUkFIX0FWKTsKIAogfQogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGl4Z2JlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgZXJyOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpeGdiZTogQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGZyb20gIiBcCi0JCQkJInN1c3BlbmRcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwotCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJZXJyID0gaXhnYmVfcmVxdWVzdF9pcnEoYWRhcHRlcik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJaXhnYmVfdXAoYWRhcHRlcik7Ci0KLQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiAvKioKICAqIGl4Z2JlX2NsZWFuX3J4X3JpbmcgLSBGcmVlIFJ4IEJ1ZmZlcnMgcGVyIFF1ZXVlCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEByeF9yaW5nOiByaW5nIHRvIGZyZWUgYnVmZmVycyBmcm9tCiAgKiovCiBzdGF0aWMgdm9pZCBpeGdiZV9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCXN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcnhfcmluZykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJdW5zaWduZWQgbG9uZyBzaXplOwpAQCAtMTkwMSw4ICsyMDI5LDggQEAKIAkJcnhfYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9baV07CiAJCWlmIChyeF9idWZmZXJfaW5mby0+ZG1hKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHJ4X2J1ZmZlcl9pbmZvLT5kbWEsCi0JCQkJCSBhZGFwdGVyLT5yeF9idWZfbGVuLAotCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSAgICAgICAgICAgICAgICAgcnhfcmluZy0+cnhfYnVmX2xlbiwKKwkJCSAgICAgICAgICAgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXJ4X2J1ZmZlcl9pbmZvLT5kbWEgPSAwOwogCQl9CiAJCWlmIChyeF9idWZmZXJfaW5mby0+c2tiKSB7CkBAIC0xOTExLDEyICsyMDM5LDEyIEBACiAJCX0KIAkJaWYgKCFyeF9idWZmZXJfaW5mby0+cGFnZSkKIAkJCWNvbnRpbnVlOwotCQlwY2lfdW5tYXBfcGFnZShwZGV2LCByeF9idWZmZXJfaW5mby0+cGFnZV9kbWEsIFBBR0VfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwY2lfdW5tYXBfcGFnZShwZGV2LCByeF9idWZmZXJfaW5mby0+cGFnZV9kbWEsIFBBR0VfU0laRSAvIDIsCisJCSAgICAgICAgICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXJ4X2J1ZmZlcl9pbmZvLT5wYWdlX2RtYSA9IDA7Ci0KIAkJcHV0X3BhZ2UocnhfYnVmZmVyX2luZm8tPnBhZ2UpOwogCQlyeF9idWZmZXJfaW5mby0+cGFnZSA9IE5VTEw7CisJCXJ4X2J1ZmZlcl9pbmZvLT5wYWdlX29mZnNldCA9IDA7CiAJfQogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXhnYmVfcnhfYnVmZmVyKSAqIHJ4X3JpbmctPmNvdW50OwpAQCAtMTkzOCw3ICsyMDY2LDcgQEAKICAqIEB0eF9yaW5nOiByaW5nIHRvIGJlIGNsZWFuZWQKICAqKi8KIHN0YXRpYyB2b2lkIGl4Z2JlX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nKQogewogCXN0cnVjdCBpeGdiZV90eF9idWZmZXIgKnR4X2J1ZmZlcl9pbmZvOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKQEAgLTE5OTEsNzUgKzIxMTksNjQgQEAKIHZvaWQgaXhnYmVfZG93bihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHJ4Y3RybDsKKwl1MzIgdHhkY3RsOworCWludCBpLCBqOwogCiAJLyogc2lnbmFsIHRoYXQgd2UgYXJlIGRvd24gdG8gdGhlIGludGVycnVwdCBoYW5kbGVyICovCiAJc2V0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CiAKIAkvKiBkaXNhYmxlIHJlY2VpdmVzICovCi0JcnhjdHJsID0gSVhHQkVfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9SWENUUkwpOwotCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1JYQ1RSTCwKLQkJCXJ4Y3RybCAmIH5JWEdCRV9SWENUUkxfUlhFTik7CisJcnhjdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYQ1RSTCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWENUUkwsIHJ4Y3RybCAmIH5JWEdCRV9SWENUUkxfUlhFTik7CiAKIAluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CiAKLQkvKiBkaXNhYmxlIHRyYW5zbWl0cyBpbiB0aGUgaGFyZHdhcmUgKi8KLQotCS8qIGZsdXNoIGJvdGggZGlzYWJsZXMgKi8KLQlJWEdCRV9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAltc2xlZXAoMTApOwogCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisKIAlpeGdiZV9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIAogCWl4Z2JlX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CisKIAlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2spOworCisJLyogZGlzYWJsZSB0cmFuc21pdHMgaW4gdGhlIGhhcmR3YXJlIG5vdyB0aGF0IGludGVycnVwdHMgYXJlIG9mZiAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdHhfcXVldWVzOyBpKyspIHsKKwkJaiA9IGFkYXB0ZXItPnR4X3JpbmdbaV0ucmVnX2lkeDsKKwkJdHhkY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1RYRENUTChqKSk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVFhEQ1RMKGopLAorCQkgICAgICAgICAgICAgICAgKHR4ZGN0bCAmIH5JWEdCRV9UWERDVExfRU5BQkxFKSk7CisJfQogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0RDQSkgfHwgZGVmaW5lZChDT05GSUdfRENBX01PRFVMRSkKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEKSB7CisJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0RDQV9FTkFCTEVEOworCQlkY2FfcmVtb3ZlX3JlcXVlc3RlcigmYWRhcHRlci0+cGRldi0+ZGV2KTsKKwl9CisKKyNlbmRpZgogCWlmICghcGNpX2NoYW5uZWxfb2ZmbGluZShhZGFwdGVyLT5wZGV2KSkKIAkJaXhnYmVfcmVzZXQoYWRhcHRlcik7CiAJaXhnYmVfY2xlYW5fYWxsX3R4X3JpbmdzKGFkYXB0ZXIpOwogCWl4Z2JlX2NsZWFuX2FsbF9yeF9yaW5ncyhhZGFwdGVyKTsKIAotfQotCi1zdGF0aWMgaW50IGl4Z2JlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLSNpZmRlZiBDT05GSUdfUE0KLQlpbnQgcmV0dmFsID0gMDsKLSNlbmRpZgotCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewotCQlpeGdiZV9kb3duKGFkYXB0ZXIpOwotCQlpeGdiZV9mcmVlX2lycShhZGFwdGVyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EQ0EpIHx8IGRlZmluZWQoQ09ORklHX0RDQV9NT0RVTEUpCisJLyogc2luY2Ugd2UgcmVzZXQgdGhlIGhhcmR3YXJlIERDQSBzZXR0aW5ncyB3ZXJlIGNsZWFyZWQgKi8KKwlpZiAoZGNhX2FkZF9yZXF1ZXN0ZXIoJmFkYXB0ZXItPnBkZXYtPmRldikgPT0gMCkgeworCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX0RDQV9FTkFCTEVEOworCQkvKiBhbHdheXMgdXNlIENCMiBtb2RlLCBkaWZmZXJlbmNlIGlzIG1hc2tlZAorCQkgKiBpbiB0aGUgQ0IgZHJpdmVyICovCisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRENBX0NUUkwsIDIpOworCQlpeGdiZV9zZXR1cF9kY2EoYWRhcHRlcik7CiAJfQotCi0jaWZkZWYgQ09ORklHX1BNCi0JcmV0dmFsID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKICNlbmRpZgotCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwotCi0JaXhnYmVfcmVsZWFzZV9od19jb250cm9sKGFkYXB0ZXIpOwotCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXhnYmVfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaXhnYmVfc3VzcGVuZChwZGV2LCBQTVNHX1NVU1BFTkQpOwogfQogCiAvKioKQEAgLTIwNzIsMTEgKzIxODksMTEgQEAKIHN0YXRpYyBpbnQgaXhnYmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9IGNvbnRhaW5lcl9vZihuYXBpLAotCQkJCQkgIHN0cnVjdCBpeGdiZV9xX3ZlY3RvciwgbmFwaSk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3FfdmVjdG9yLCBuYXBpKTsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOwotCWludCB0eF9jbGVhbmVkID0gMCwgd29ya19kb25lID0gMDsKKwlpbnQgdHhfY2xlYW5lZCwgd29ya19kb25lID0gMDsKIAotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiBkZWZpbmVkKENPTkZJR19EQ0EpIHx8IGRlZmluZWQoQ09ORklHX0RDQV9NT0RVTEUpCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0FfRU5BQkxFRCkgewogCQlpeGdiZV91cGRhdGVfdHhfZGNhKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X3JpbmcpOwogCQlpeGdiZV91cGRhdGVfcnhfZGNhKGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmcpOwpAQCAtMjA5MiwxMiArMjIwOSwxMSBAQAogCS8qIElmIGJ1ZGdldCBub3QgZnVsbHkgY29uc3VtZWQsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmV0aWZfcnhfY29tcGxldGUoYWRhcHRlci0+bmV0ZGV2LCBuYXBpKTsKLQkJaWYgKGFkYXB0ZXItPnJ4X2VpdHIgPCBJWEdCRV9NSU5fSVRSX1VTRUNTKQorCQlpZiAoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKQogCQkJaXhnYmVfc2V0X2l0cihhZGFwdGVyKTsKIAkJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCQlpeGdiZV9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCX0KLQogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKQEAgLTIxMjMsNTYgKzIyMzksOSBAQAogCWl4Z2JlX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX2FjcXVpcmVfbXNpeF92ZWN0b3JzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgICBpbnQgdmVjdG9ycykKK3N0YXRpYyB2b2lkIGl4Z2JlX3NldF9udW1fcXVldWVzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWludCBlcnIsIHZlY3Rvcl90aHJlc2hvbGQ7Ci0KLQkvKiBXZSdsbCB3YW50IGF0IGxlYXN0IDMgKHZlY3Rvcl90aHJlc2hvbGQpOgotCSAqIDEpIFR4UVswXSBDbGVhbnVwCi0JICogMikgUnhRWzBdIENsZWFudXAKLQkgKiAzKSBPdGhlciAoTGluayBTdGF0dXMgQ2hhbmdlLCBldGMuKQotCSAqIDQpIFRDUCBUaW1lciAob3B0aW9uYWwpCi0JICovCi0JdmVjdG9yX3RocmVzaG9sZCA9IE1JTl9NU0lYX0NPVU5UOwotCi0JLyogVGhlIG1vcmUgd2UgZ2V0LCB0aGUgbW9yZSB3ZSB3aWxsIGFzc2lnbiB0byBUeC9SeCBDbGVhbnVwCi0JICogZm9yIHRoZSBzZXBhcmF0ZSBxdWV1ZXMuLi53aGVyZSBSeCBDbGVhbnVwID49IFR4IENsZWFudXAuCi0JICogUmlnaHQgbm93LCB3ZSBzaW1wbHkgY2FyZSBhYm91dCBob3cgbWFueSB3ZSdsbCBnZXQ7IHdlJ2xsCi0JICogc2V0IHRoZW0gdXAgbGF0ZXIgd2hpbGUgcmVxdWVzdGluZyBpcnEncy4KLQkgKi8KLQl3aGlsZSAodmVjdG9ycyA+PSB2ZWN0b3JfdGhyZXNob2xkKSB7Ci0JCWVyciA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5tc2l4X2VudHJpZXMsCi0JCQkJICAgICAgdmVjdG9ycyk7Ci0JCWlmICghZXJyKSAvKiBTdWNjZXNzIGluIGFjcXVpcmluZyBhbGwgcmVxdWVzdGVkIHZlY3RvcnMuICovCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoZXJyIDwgMCkKLQkJCXZlY3RvcnMgPSAwOyAvKiBOYXN0eSBmYWlsdXJlLCBxdWl0IG5vdyAqLwotCQllbHNlIC8qIGVyciA9PSBudW1iZXIgb2YgdmVjdG9ycyB3ZSBzaG91bGQgdHJ5IGFnYWluIHdpdGggKi8KLQkJCXZlY3RvcnMgPSBlcnI7Ci0JfQotCi0JaWYgKHZlY3RvcnMgPCB2ZWN0b3JfdGhyZXNob2xkKSB7Ci0JCS8qIENhbid0IGFsbG9jYXRlIGVub3VnaCBNU0ktWCBpbnRlcnJ1cHRzPyAgT2ggd2VsbC4KLQkJICogVGhpcyBqdXN0IG1lYW5zIHdlJ2xsIGdvIHdpdGggZWl0aGVyIGEgc2luZ2xlIE1TSQotCQkgKiB2ZWN0b3Igb3IgZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHRzLgotCQkgKi8KLQkJRFBSSU5USyhIVywgREVCVUcsICJVbmFibGUgdG8gYWxsb2NhdGUgTVNJLVggaW50ZXJydXB0c1xuIik7Ci0JCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX01TSVhfRU5BQkxFRDsKLQkJa2ZyZWUoYWRhcHRlci0+bXNpeF9lbnRyaWVzKTsKLQkJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0gTlVMTDsKLQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfUlNTX0VOQUJMRUQ7Ci0JCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSAxOwotCQlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gMTsKLQl9IGVsc2UgewotCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRDsgLyogV29vdCEgKi8KLQkJYWRhcHRlci0+bnVtX21zaXhfdmVjdG9ycyA9IHZlY3RvcnM7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgaXhnYmVfc2V0X251bV9xdWV1ZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IG5ycSwgbnRxOworCWludCBucnEgPSAxLCBudHEgPSAxOwogCWludCBmZWF0dXJlX21hc2sgPSAwLCByc3NfaSwgcnNzX207CiAKIAkvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHF1ZXVlcyAqLwpAQCAtMjIxMCw2ICsyMjc5LDUyIEBACiAJYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyA9IG50cTsKIH0KIAorc3RhdGljIHZvaWQgaXhnYmVfYWNxdWlyZV9tc2l4X3ZlY3RvcnMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVjdG9ycykKK3sKKwlpbnQgZXJyLCB2ZWN0b3JfdGhyZXNob2xkOworCisJLyogV2UnbGwgd2FudCBhdCBsZWFzdCAzICh2ZWN0b3JfdGhyZXNob2xkKToKKwkgKiAxKSBUeFFbMF0gQ2xlYW51cAorCSAqIDIpIFJ4UVswXSBDbGVhbnVwCisJICogMykgT3RoZXIgKExpbmsgU3RhdHVzIENoYW5nZSwgZXRjLikKKwkgKiA0KSBUQ1AgVGltZXIgKG9wdGlvbmFsKQorCSAqLworCXZlY3Rvcl90aHJlc2hvbGQgPSBNSU5fTVNJWF9DT1VOVDsKKworCS8qIFRoZSBtb3JlIHdlIGdldCwgdGhlIG1vcmUgd2Ugd2lsbCBhc3NpZ24gdG8gVHgvUnggQ2xlYW51cAorCSAqIGZvciB0aGUgc2VwYXJhdGUgcXVldWVzLi4ud2hlcmUgUnggQ2xlYW51cCA+PSBUeCBDbGVhbnVwLgorCSAqIFJpZ2h0IG5vdywgd2Ugc2ltcGx5IGNhcmUgYWJvdXQgaG93IG1hbnkgd2UnbGwgZ2V0OyB3ZSdsbAorCSAqIHNldCB0aGVtIHVwIGxhdGVyIHdoaWxlIHJlcXVlc3RpbmcgaXJxJ3MuCisJICovCisJd2hpbGUgKHZlY3RvcnMgPj0gdmVjdG9yX3RocmVzaG9sZCkgeworCQllcnIgPSBwY2lfZW5hYmxlX21zaXgoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+bXNpeF9lbnRyaWVzLAorCQkgICAgICAgICAgICAgICAgICAgICAgdmVjdG9ycyk7CisJCWlmICghZXJyKSAvKiBTdWNjZXNzIGluIGFjcXVpcmluZyBhbGwgcmVxdWVzdGVkIHZlY3RvcnMuICovCisJCQlicmVhazsKKwkJZWxzZSBpZiAoZXJyIDwgMCkKKwkJCXZlY3RvcnMgPSAwOyAvKiBOYXN0eSBmYWlsdXJlLCBxdWl0IG5vdyAqLworCQllbHNlIC8qIGVyciA9PSBudW1iZXIgb2YgdmVjdG9ycyB3ZSBzaG91bGQgdHJ5IGFnYWluIHdpdGggKi8KKwkJCXZlY3RvcnMgPSBlcnI7CisJfQorCisJaWYgKHZlY3RvcnMgPCB2ZWN0b3JfdGhyZXNob2xkKSB7CisJCS8qIENhbid0IGFsbG9jYXRlIGVub3VnaCBNU0ktWCBpbnRlcnJ1cHRzPyAgT2ggd2VsbC4KKwkJICogVGhpcyBqdXN0IG1lYW5zIHdlJ2xsIGdvIHdpdGggZWl0aGVyIGEgc2luZ2xlIE1TSQorCQkgKiB2ZWN0b3Igb3IgZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJRFBSSU5USyhIVywgREVCVUcsICJVbmFibGUgdG8gYWxsb2NhdGUgTVNJLVggaW50ZXJydXB0c1xuIik7CisJCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX01TSVhfRU5BQkxFRDsKKwkJa2ZyZWUoYWRhcHRlci0+bXNpeF9lbnRyaWVzKTsKKwkJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfUlNTX0VOQUJMRUQ7CisJCWl4Z2JlX3NldF9udW1fcXVldWVzKGFkYXB0ZXIpOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfTVNJWF9FTkFCTEVEOyAvKiBXb290ISAqLworCQlhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzID0gdmVjdG9yczsKKwl9Cit9CisKIC8qKgogICogaXhnYmVfY2FjaGVfcmluZ19yZWdpc3RlciAtIERlc2NyaXB0b3IgcmluZyB0byByZWdpc3RlciBtYXBwaW5nCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQpAQCAtMjIxOSw5ICsyMzM0LDYgQEAKICAqKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpeGdiZV9jYWNoZV9yaW5nX3JlZ2lzdGVyKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCS8qIFRPRE86IFJlbW92ZSBhbGwgdXNlcyBvZiB0aGUgaW5kaWNlcyBpbiB0aGUgY2FzZXMgd2hlcmUgbXVsdGlwbGUKLQkgKiAgICAgICBmZWF0dXJlcyBhcmUgT1InZCB0b2dldGhlciwgaWYgdGhlIGZlYXR1cmUgc2V0IG1ha2VzIHNlbnNlLgotCSAqLwogCWludCBmZWF0dXJlX21hc2sgPSAwLCByc3NfaTsKIAlpbnQgaSwgdHhyX2lkeCwgcnhyX2lkeDsKIApAQCAtMjI2MiwyMSArMjM3NCwyMiBAQAogCWludCBpOwogCiAJYWRhcHRlci0+dHhfcmluZyA9IGtjYWxsb2MoYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKLQkJCQkgICBzaXplb2Yoc3RydWN0IGl4Z2JlX3JpbmcpLCBHRlBfS0VSTkVMKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGl4Z2JlX3JpbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPnR4X3JpbmcpCiAJCWdvdG8gZXJyX3R4X3JpbmdfYWxsb2NhdGlvbjsKIAogCWFkYXB0ZXItPnJ4X3JpbmcgPSBrY2FsbG9jKGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpeGdiZV9yaW5nKSwgR0ZQX0tFUk5FTCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpeGdiZV9yaW5nKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGFwdGVyLT5yeF9yaW5nKQogCQlnb3RvIGVycl9yeF9yaW5nX2FsbG9jYXRpb247CiAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgaSsrKSB7Ci0JCWFkYXB0ZXItPnR4X3JpbmdbaV0uY291bnQgPSBJWEdCRV9ERUZBVUxUX1RYRDsKKwkJYWRhcHRlci0+dHhfcmluZ1tpXS5jb3VudCA9IGFkYXB0ZXItPnR4X3JpbmdfY291bnQ7CiAJCWFkYXB0ZXItPnR4X3JpbmdbaV0ucXVldWVfaW5kZXggPSBpOwogCX0KKwogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspIHsKLQkJYWRhcHRlci0+cnhfcmluZ1tpXS5jb3VudCA9IElYR0JFX0RFRkFVTFRfUlhEOworCQlhZGFwdGVyLT5yeF9yaW5nW2ldLmNvdW50ID0gYWRhcHRlci0+cnhfcmluZ19jb3VudDsKIAkJYWRhcHRlci0+cnhfcmluZ1tpXS5xdWV1ZV9pbmRleCA9IGk7CiAJfQogCkBAIC0yMjk4LDI1ICsyNDExLDE5IEBACiAgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlIGFuZCB0aGUga2VybmVsLgogICoqLwogc3RhdGljIGludCBfX2RldmluaXQgaXhnYmVfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KHN0cnVjdCBpeGdiZV9hZGFwdGVyCi0JCQkJCQkgICAgKmFkYXB0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFkYXB0ZXIpCiB7CiAJaW50IGVyciA9IDA7CiAJaW50IHZlY3Rvciwgdl9idWRnZXQ7CiAKIAkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgdGhyb3R0bGUgcmF0ZS4KLQkgKi8KLQlhZGFwdGVyLT5yeF9laXRyID0gKDEwMDAwMDAgLyBJWEdCRV9ERUZBVUxUX0lUUl9SWF9VU0VDUyk7Ci0JYWRhcHRlci0+dHhfZWl0ciA9ICgxMDAwMDAwIC8gSVhHQkVfREVGQVVMVF9JVFJfVFhfVVNFQ1MpOwotCi0JLyoKIAkgKiBJdCdzIGVhc3kgdG8gYmUgZ3JlZWR5IGZvciBNU0ktWCB2ZWN0b3JzLCBidXQgaXQgcmVhbGx5CiAJICogZG9lc24ndCBkbyB1cyBtdWNoIGdvb2QgaWYgd2UgaGF2ZSBhIGxvdCBtb3JlIHZlY3RvcnMKIAkgKiB0aGFuIENQVSdzLiAgU28gbGV0J3MgYmUgY29uc2VydmF0aXZlIGFuZCBvbmx5IGFzayBmb3IKIAkgKiAocm91Z2hseSkgdHdpY2UgdGhlIG51bWJlciBvZiB2ZWN0b3JzIGFzIHRoZXJlIGFyZSBDUFUncy4KIAkgKi8KIAl2X2J1ZGdldCA9IG1pbihhZGFwdGVyLT5udW1fcnhfcXVldWVzICsgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKLQkJICAgICAgIChpbnQpKG51bV9vbmxpbmVfY3B1cygpICogMikpICsgTk9OX1FfVkVDVE9SUzsKKwkgICAgICAgICAgICAgICAoaW50KShudW1fb25saW5lX2NwdXMoKSAqIDIpKSArIE5PTl9RX1ZFQ1RPUlM7CiAKIAkvKgogCSAqIEF0IHRoZSBzYW1lIHRpbWUsIGhhcmR3YXJlIGNhbiBvbmx5IHN1cHBvcnQgYSBtYXhpbXVtIG9mCkBAIC0yMzMwLDcgKzI0MzcsNyBAQAogCS8qIEEgZmFpbHVyZSBpbiBNU0ktWCBlbnRyeSBhbGxvY2F0aW9uIGlzbid0IGZhdGFsLCBidXQgaXQgZG9lcwogCSAqIG1lYW4gd2UgZGlzYWJsZSBNU0ktWCBjYXBhYmlsaXRpZXMgb2YgdGhlIGFkYXB0ZXIuICovCiAJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYyh2X2J1ZGdldCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPm1zaXhfZW50cmllcykgewogCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19SU1NfRU5BQkxFRDsKIAkJaXhnYmVfc2V0X251bV9xdWV1ZXMoYWRhcHRlcik7CkBAIC0yMzM5LDcgKzI0NDYsNyBAQAogCQllcnIgPSBpeGdiZV9hbGxvY19xdWV1ZXMoYWRhcHRlcik7CiAJCWlmIChlcnIpIHsKIAkJCURQUklOVEsoUFJPQkUsIEVSUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgotCQkJCQkgICAgImZvciBxdWV1ZXNcbiIpOworCQkJICAgICAgICAiZm9yIHF1ZXVlc1xuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0yMzYwLDcgKzI0NjcsNyBAQAogCQlhZGFwdGVyLT5mbGFncyB8PSBJWEdCRV9GTEFHX01TSV9FTkFCTEVEOwogCX0gZWxzZSB7CiAJCURQUklOVEsoSFcsIERFQlVHLCAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQsICIKLQkJCQkgICAiZmFsbGluZyBiYWNrIHRvIGxlZ2FjeS4gIEVycm9yOiAlZFxuIiwgZXJyKTsKKwkJICAgICAgICAiZmFsbGluZyBiYWNrIHRvIGxlZ2FjeS4gIEVycm9yOiAlZFxuIiwgZXJyKTsKIAkJLyogcmVzZXQgZXJyICovCiAJCWVyciA9IDA7CiAJfQpAQCAtMjQxNiw5ICsyNTIzLDkgQEAKIAl9CiAKIAlEUFJJTlRLKERSViwgSU5GTywgIk11bHRpcXVldWUgJXM6IFJ4IFF1ZXVlIGNvdW50ID0gJXUsICIKLQkJCSAgICJUeCBRdWV1ZSBjb3VudCA9ICV1XG4iLAotCQkoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA+IDEpID8gIkVuYWJsZWQiIDoKLQkJIkRpc2FibGVkIiwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CisJICAgICAgICAiVHggUXVldWUgY291bnQgPSAldVxuIiwKKwkgICAgICAgIChhZGFwdGVyLT5udW1fcnhfcXVldWVzID4gMSkgPyAiRW5hYmxlZCIgOgorCSAgICAgICAgIkRpc2FibGVkIiwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywgYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyk7CiAKIAlzZXRfYml0KF9fSVhHQkVfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKTsKIApAQCAtMjQ0NSwzMyArMjU1Miw0NCBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAl1bnNpZ25lZCBpbnQgcnNzOwogCisJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCisKKwlody0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWh3LT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CisJaHctPnJldmlzaW9uX2lkID0gcGRldi0+cmV2aXNpb247CisJaHctPnN1YnN5c3RlbV92ZW5kb3JfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWh3LT5zdWJzeXN0ZW1fZGV2aWNlX2lkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwogCS8qIFNldCBjYXBhYmlsaXR5IGZsYWdzICovCiAJcnNzID0gbWluKElYR0JFX01BWF9SU1NfSU5ESUNFUywgKGludCludW1fb25saW5lX2NwdXMoKSk7CiAJYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXMgPSByc3M7CiAJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19SU1NfRU5BQkxFRDsKIAotCS8qIEVuYWJsZSBEeW5hbWljIGludGVycnVwdCB0aHJvdHRsaW5nIGJ5IGRlZmF1bHQgKi8KLQlhZGFwdGVyLT5yeF9laXRyID0gMTsKLQlhZGFwdGVyLT50eF9laXRyID0gMTsKLQogCS8qIGRlZmF1bHQgZmxvdyBjb250cm9sIHNldHRpbmdzICovCi0JaHctPmZjLm9yaWdpbmFsX3R5cGUgPSBpeGdiZV9mY19mdWxsOwotCWh3LT5mYy50eXBlID0gaXhnYmVfZmNfZnVsbDsKKwlody0+ZmMub3JpZ2luYWxfdHlwZSA9IGl4Z2JlX2ZjX25vbmU7CisJaHctPmZjLnR5cGUgPSBpeGdiZV9mY19ub25lOworCWh3LT5mYy5oaWdoX3dhdGVyID0gSVhHQkVfREVGQVVMVF9GQ1JUSDsKKwlody0+ZmMubG93X3dhdGVyID0gSVhHQkVfREVGQVVMVF9GQ1JUTDsKKwlody0+ZmMucGF1c2VfdGltZSA9IElYR0JFX0RFRkFVTFRfRkNQQVVTRTsKKwlody0+ZmMuc2VuZF94b24gPSB0cnVlOwogCiAJLyogc2VsZWN0IDEwRyBsaW5rIGJ5IGRlZmF1bHQgKi8KIAlody0+bWFjLmxpbmtfbW9kZV9zZWxlY3QgPSBJWEdCRV9BVVRPQ19MTVNfMTBHX0xJTktfTk9fQU47Ci0JaWYgKGh3LT5tYWMub3BzLnJlc2V0KGh3KSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJIVyBJbml0IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAoaHctPm1hYy5vcHMuc2V0dXBfbGlua19zcGVlZChodywgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwsIHRydWUsCi0JCQkJCSBmYWxzZSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTGluayBTcGVlZCBzZXR1cCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisKKwkvKiBlbmFibGUgaXRyIGJ5IGRlZmF1bHQgaW4gZHluYW1pYyBtb2RlICovCisJYWRhcHRlci0+aXRyX3NldHRpbmcgPSAxOworCWFkYXB0ZXItPmVpdHJfcGFyYW0gPSAyMDAwMDsKKworCS8qIHNldCBkZWZhdWx0cyBmb3IgZWl0ciBpbiBNZWdhQnl0ZXMgKi8KKwlhZGFwdGVyLT5laXRyX2xvdyA9IDEwOworCWFkYXB0ZXItPmVpdHJfaGlnaCA9IDIwOworCisJLyogc2V0IGRlZmF1bHQgcmluZyBzaXplcyAqLworCWFkYXB0ZXItPnR4X3JpbmdfY291bnQgPSBJWEdCRV9ERUZBVUxUX1RYRDsKKwlhZGFwdGVyLT5yeF9yaW5nX2NvdW50ID0gSVhHQkVfREVGQVVMVF9SWEQ7CiAKIAkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCi0JaWYgKGl4Z2JlX2luaXRfZWVwcm9tKGh3KSkgeworCWlmIChpeGdiZV9pbml0X2VlcHJvbV9wYXJhbXNfZ2VuZXJpYyhodykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRUVQUk9NIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI0ODcsMTA1ICsyNjA1LDE1NyBAQAogLyoqCiAgKiBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCi0gKiBAdHhkcjogICAgdHggZGVzY3JpcHRvciByaW5nIChmb3IgYSBzcGVjaWZpYyBxdWV1ZSkgdG8gc2V0dXAKKyAqIEB0eF9yaW5nOiAgICB0eCBkZXNjcmlwdG9yIHJpbmcgKGZvciBhIHNwZWNpZmljIHF1ZXVlKSB0byBzZXR1cAogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKICAqKi8KIGludCBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eGRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJaW50IHNpemU7CiAKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBpeGdiZV90eF9idWZmZXIpICogdHhkci0+Y291bnQ7Ci0JdHhkci0+dHhfYnVmZmVyX2luZm8gPSB2bWFsbG9jKHNpemUpOwotCWlmICghdHhkci0+dHhfYnVmZmVyX2luZm8pIHsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLAotCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltZW1zZXQodHhkci0+dHhfYnVmZmVyX2luZm8sIDAsIHNpemUpOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JlX3R4X2J1ZmZlcikgKiB0eF9yaW5nLT5jb3VudDsKKwl0eF9yaW5nLT50eF9idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CisJaWYgKCF0eF9yaW5nLT50eF9idWZmZXJfaW5mbykKKwkJZ290byBlcnI7CisJbWVtc2V0KHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvLCAwLCBzaXplKTsKIAogCS8qIHJvdW5kIHVwIHRvIG5lYXJlc3QgNEsgKi8KLQl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2YodW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MpOwotCXR4ZHItPnNpemUgPSBBTElHTih0eGRyLT5zaXplLCA0MDk2KTsKKwl0eF9yaW5nLT5zaXplID0gdHhfcmluZy0+Y291bnQgKiBzaXplb2YodW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MpICsKKwkgICAgICAgICAgICAgICAgc2l6ZW9mKHUzMik7CisJdHhfcmluZy0+c2l6ZSA9IEFMSUdOKHR4X3JpbmctPnNpemUsIDQwOTYpOwogCi0JdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOwotCWlmICghdHhkci0+ZGVzYykgewotCQl2ZnJlZSh0eGRyLT50eF9idWZmZXJfaW5mbyk7Ci0JCURQUklOVEsoUFJPQkUsIEVSUiwKLQkJCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSB0eCBkZXNjIHJpbmdcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwl0eF9yaW5nLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgdHhfcmluZy0+c2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4X3JpbmctPmRtYSk7CisJaWYgKCF0eF9yaW5nLT5kZXNjKQorCQlnb3RvIGVycjsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gMDsKKwl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwl0eF9yaW5nLT53b3JrX2xpbWl0ID0gdHhfcmluZy0+Y291bnQ7CisJcmV0dXJuIDA7CisKK2VycjoKKwl2ZnJlZSh0eF9yaW5nLT50eF9idWZmZXJfaW5mbyk7CisJdHhfcmluZy0+dHhfYnVmZmVyX2luZm8gPSBOVUxMOworCURQUklOVEsoUFJPQkUsIEVSUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21pdCAiCisJICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciByaW5nXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBpeGdiZV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgYWxsIHF1ZXVlcyBUeCByZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGFuIGVycm9yLCB0aGVuIGl0J3MgcG9zc2libGUgb25lIG9yCisgKiBtb3JlIG9mIHRoZSByaW5ncyBpcyBwb3B1bGF0ZWQgKHdoaWxlIHRoZSByZXN0IGFyZSBub3QpLiAgSXQgaXMgdGhlCisgKiBjYWxsZXJzIGR1dHkgdG8gY2xlYW4gdGhvc2Ugb3JwaGFuZWQgcmluZ3MuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworc3RhdGljIGludCBpeGdiZV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgeworCQllcnIgPSBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbaV0pOworCQlpZiAoIWVycikKKwkJCWNvbnRpbnVlOworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJBbGxvY2F0aW9uIGZvciBUeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOworCQlicmVhazsKIAl9CiAKLQl0eGRyLT5uZXh0X3RvX3VzZSA9IDA7Ci0JdHhkci0+bmV4dF90b19jbGVhbiA9IDA7Ci0JdHhkci0+d29ya19saW1pdCA9IHR4ZHItPmNvdW50OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCiAgKiBpeGdiZV9zZXR1cF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBSeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCi0gKiBAcnhkcjogICAgcnggZGVzY3JpcHRvciByaW5nIChmb3IgYSBzcGVjaWZpYyBxdWV1ZSkgdG8gc2V0dXAKKyAqIEByeF9yaW5nOiAgICByeCBkZXNjcmlwdG9yIHJpbmcgKGZvciBhIHNwZWNpZmljIHF1ZXVlKSB0byBzZXR1cAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCiAgKiovCiBpbnQgaXhnYmVfc2V0dXBfcnhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqcnhkcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCWludCBzaXplOwogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmV0X2xyb19kZXNjKSAqIElYR0JFX01BWF9MUk9fREVTQ1JJUFRPUlM7Ci0Jcnhkci0+bHJvX21nci5scm9fYXJyID0gdm1hbGxvYyhzaXplKTsKLQlpZiAoIXJ4ZHItPmxyb19tZ3IubHJvX2FycikKKwlyeF9yaW5nLT5scm9fbWdyLmxyb19hcnIgPSB2bWFsbG9jKHNpemUpOworCWlmICghcnhfcmluZy0+bHJvX21nci5scm9fYXJyKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQocnhkci0+bHJvX21nci5scm9fYXJyLCAwLCBzaXplKTsKKwltZW1zZXQocnhfcmluZy0+bHJvX21nci5scm9fYXJyLCAwLCBzaXplKTsKIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JlX3J4X2J1ZmZlcikgKiByeGRyLT5jb3VudDsKLQlyeGRyLT5yeF9idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7Ci0JaWYgKCFyeGRyLT5yeF9idWZmZXJfaW5mbykgeworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JlX3J4X2J1ZmZlcikgKiByeF9yaW5nLT5jb3VudDsKKwlyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CisJaWYgKCFyeF9yaW5nLT5yeF9idWZmZXJfaW5mbykgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkidm1hbGxvYyBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgdGhlIHJ4IGRlc2MgcmluZ1xuIik7CisJCSAgICAgICAgInZtYWxsb2MgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSByeCBkZXNjIHJpbmdcbiIpOwogCQlnb3RvIGFsbG9jX2ZhaWxlZDsKIAl9Ci0JbWVtc2V0KHJ4ZHItPnJ4X2J1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKwltZW1zZXQocnhfcmluZy0+cnhfYnVmZmVyX2luZm8sIDAsIHNpemUpOwogCiAJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLwotCXJ4ZHItPnNpemUgPSByeGRyLT5jb3VudCAqIHNpemVvZih1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyk7Ci0Jcnhkci0+c2l6ZSA9IEFMSUdOKHJ4ZHItPnNpemUsIDQwOTYpOworCXJ4X3JpbmctPnNpemUgPSByeF9yaW5nLT5jb3VudCAqIHNpemVvZih1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyk7CisJcnhfcmluZy0+c2l6ZSA9IEFMSUdOKHJ4X3JpbmctPnNpemUsIDQwOTYpOwogCi0Jcnhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsICZyeGRyLT5kbWEpOworCXJ4X3JpbmctPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeF9yaW5nLT5zaXplLCAmcnhfcmluZy0+ZG1hKTsKIAotCWlmICghcnhkci0+ZGVzYykgeworCWlmICghcnhfcmluZy0+ZGVzYykgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciB0aGUgcnggZGVzYyByaW5nXG4iKTsKLQkJdmZyZWUocnhkci0+cnhfYnVmZmVyX2luZm8pOworCQkgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHRoZSByeCBkZXNjIHJpbmdcbiIpOworCQl2ZnJlZShyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyk7CiAJCWdvdG8gYWxsb2NfZmFpbGVkOwogCX0KIAotCXJ4ZHItPm5leHRfdG9fY2xlYW4gPSAwOwotCXJ4ZHItPm5leHRfdG9fdXNlID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CiAKIAlyZXR1cm4gMDsKIAogYWxsb2NfZmFpbGVkOgotCXZmcmVlKHJ4ZHItPmxyb19tZ3IubHJvX2Fycik7Ci0Jcnhkci0+bHJvX21nci5scm9fYXJyID0gTlVMTDsKKwl2ZnJlZShyeF9yaW5nLT5scm9fbWdyLmxyb19hcnIpOworCXJ4X3JpbmctPmxyb19tZ3IubHJvX2FyciA9IE5VTEw7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qKgorICogaXhnYmVfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIGFsbCBxdWV1ZXMgUnggcmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBhbiBlcnJvciwgdGhlbiBpdCdzIHBvc3NpYmxlIG9uZSBvcgorICogbW9yZSBvZiB0aGUgcmluZ3MgaXMgcG9wdWxhdGVkICh3aGlsZSB0aGUgcmVzdCBhcmUgbm90KS4gIEl0IGlzIHRoZQorICogY2FsbGVycyBkdXR5IHRvIGNsZWFuIHRob3NlIG9ycGhhbmVkIHJpbmdzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworc3RhdGljIGludCBpeGdiZV9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgeworCQllcnIgPSBpeGdiZV9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOworCQlpZiAoIWVycikKKwkJCWNvbnRpbnVlOworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJBbGxvY2F0aW9uIGZvciBSeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKICAqIGl4Z2JlX2ZyZWVfdHhfcmVzb3VyY2VzIC0gRnJlZSBUeCBSZXNvdXJjZXMgcGVyIFF1ZXVlCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqIEB0eF9yaW5nOiBUeCBkZXNjcmlwdG9yIHJpbmcgZm9yIGEgc3BlY2lmaWMgcXVldWUKICAqCiAgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKICAqKi8KLXN0YXRpYyB2b2lkIGl4Z2JlX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZykKK3ZvaWQgaXhnYmVfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIApAQCAtMjYyMCw4ICsyNzkwLDggQEAKICAqCiAgKiBGcmVlIGFsbCByZWNlaXZlIHNvZnR3YXJlIHJlc291cmNlcwogICoqLwotc3RhdGljIHZvaWQgaXhnYmVfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCBpeGdiZV9yaW5nICpyeF9yaW5nKQordm9pZCBpeGdiZV9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnJ4X3JpbmcpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCkBAIC0yNjUzLDU5ICsyODIzLDYgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgYWxsIHF1ZXVlcyBUeCByZXNvdXJjZXMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoKLSAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aXRoIGFuIGVycm9yLCB0aGVuIGl0J3MgcG9zc2libGUgb25lIG9yCi0gKiBtb3JlIG9mIHRoZSByaW5ncyBpcyBwb3B1bGF0ZWQgKHdoaWxlIHRoZSByZXN0IGFyZSBub3QpLiAgSXQgaXMgdGhlCi0gKiBjYWxsZXJzIGR1dHkgdG8gY2xlYW4gdGhvc2Ugb3JwaGFuZWQgcmluZ3MuCi0gKgotICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQotICoqLwotc3RhdGljIGludCBpeGdiZV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQotewotCWludCBpLCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykgewotCQllcnIgPSBpeGdiZV9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnR4X3JpbmdbaV0pOwotCQlpZiAoZXJyKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkJIkFsbG9jYXRpb24gZm9yIFR4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogaXhnYmVfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIGFsbCBxdWV1ZXMgUnggcmVzb3VyY2VzCi0gKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgd2l0aCBhbiBlcnJvciwgdGhlbiBpdCdzIHBvc3NpYmxlIG9uZSBvcgotICogbW9yZSBvZiB0aGUgcmluZ3MgaXMgcG9wdWxhdGVkICh3aGlsZSB0aGUgcmVzdCBhcmUgbm90KS4gIEl0IGlzIHRoZQotICogY2FsbGVycyBkdXR5IHRvIGNsZWFuIHRob3NlIG9ycGhhbmVkIHJpbmdzLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKLSAqKi8KLQotc3RhdGljIGludCBpeGdiZV9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQotewotCWludCBpLCBlcnIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykgewotCQllcnIgPSBpeGdiZV9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlciwgJmFkYXB0ZXItPnJ4X3JpbmdbaV0pOwotCQlpZiAoZXJyKSB7Ci0JCQlEUFJJTlRLKFBST0JFLCBFUlIsCi0JCQkJIkFsbG9jYXRpb24gZm9yIFJ4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgogICogaXhnYmVfY2hhbmdlX210dSAtIENoYW5nZSB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0CiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAbmV3X210dTogbmV3IHZhbHVlIGZvciBtYXhpbXVtIGZyYW1lIHNpemUKQEAgLTI3MTcsMTIgKzI4MzQsMTIgQEAKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOOwogCi0JaWYgKChtYXhfZnJhbWUgPCAoRVRIX1pMRU4gKyBFVEhfRkNTX0xFTikpIHx8Ci0JICAgIChtYXhfZnJhbWUgPiBJWEdCRV9NQVhfSlVNQk9fRlJBTUVfU0laRSkpCisJLyogTVRVIDwgNjggaXMgYW4gZXJyb3IgYW5kIGNhdXNlcyBwcm9ibGVtcyBvbiBzb21lIGtlcm5lbHMgKi8KKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG1heF9mcmFtZSA+IElYR0JFX01BWF9KVU1CT19GUkFNRV9TSVpFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlEUFJJTlRLKFBST0JFLCBJTkZPLCAiY2hhbmdpbmcgTVRVIGZyb20gJWQgdG8gJWRcbiIsCi0JCW5ldGRldi0+bXR1LCBuZXdfbXR1KTsKKwkgICAgICAgIG5ldGRldi0+bXR1LCBuZXdfbXR1KTsKIAkvKiBtdXN0IHNldCBuZXcgTVRVIGJlZm9yZSBjYWxsaW5nIGRvd24gb3IgdXAgKi8KIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAKQEAgLTI4MTcsNiArMjkzNCwxMzUgQEAKIH0KIAogLyoqCisgKiBpeGdiZV9uYXBpX2FkZF9hbGwgLSBwcmVwIG5hcGkgc3RydWN0cyBmb3IgdXNlCisgKiBAYWRhcHRlcjogcHJpdmF0ZSBzdHJ1Y3QKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBuYXBpX2FkZCBlYWNoIHBvc3NpYmxlIHFfdmVjdG9yLT5uYXBpCisgKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX25hcGlfYWRkX2FsbChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcV9pZHgsIHFfdmVjdG9yczsKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfTVNJWF9FTkFCTEVEKSB7CisJCXBvbGwgPSAmaXhnYmVfY2xlYW5fcnhvbmx5OworCQkvKiBPbmx5IGVuYWJsZSBhcyBtYW55IHZlY3RvcnMgYXMgd2UgaGF2ZSByeCBxdWV1ZXMuICovCisJCXFfdmVjdG9ycyA9IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7CisJfSBlbHNlIHsKKwkJcG9sbCA9ICZpeGdiZV9wb2xsOworCQkvKiBvbmx5IG9uZSBxX3ZlY3RvciBmb3IgbGVnYWN5IG1vZGVzICovCisJCXFfdmVjdG9ycyA9IDE7CisJfQorCisJZm9yIChxX2lkeCA9IDA7IHFfaWR4IDwgcV92ZWN0b3JzOyBxX2lkeCsrKSB7CisJCXN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcV92ZWN0b3IgPSAmYWRhcHRlci0+cV92ZWN0b3JbcV9pZHhdOworCQluZXRpZl9uYXBpX2FkZChhZGFwdGVyLT5uZXRkZXYsICZxX3ZlY3Rvci0+bmFwaSwgKCpwb2xsKSwgNjQpOworCX0KK30KKworc3RhdGljIHZvaWQgaXhnYmVfbmFwaV9kZWxfYWxsKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBxX2lkeDsKKwlpbnQgcV92ZWN0b3JzID0gYWRhcHRlci0+bnVtX21zaXhfdmVjdG9ycyAtIE5PTl9RX1ZFQ1RPUlM7CisKKwkvKiBsZWdhY3kgYW5kIE1TSSBvbmx5IHVzZSBvbmUgdmVjdG9yICovCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkpCisJCXFfdmVjdG9ycyA9IDE7CisKKwlmb3IgKHFfaWR4ID0gMDsgcV9pZHggPCBxX3ZlY3RvcnM7IHFfaWR4KyspIHsKKwkJc3RydWN0IGl4Z2JlX3FfdmVjdG9yICpxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcltxX2lkeF07CisJCWlmICghcV92ZWN0b3ItPnJ4cl9jb3VudCkKKwkJCWNvbnRpbnVlOworCQluZXRpZl9uYXBpX2RlbCgmcV92ZWN0b3ItPm5hcGkpOworCX0KK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBpeGdiZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIGVycjsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXhnYmU6IENhbm5vdCBlbmFibGUgUENJIGRldmljZSBmcm9tICIKKwkJCQkic3VzcGVuZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCisJZXJyID0gaXhnYmVfaW5pdF9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpeGdiZTogQ2Fubm90IGluaXRpYWxpemUgaW50ZXJydXB0cyBmb3IgIgorCQkgICAgICAgICAgICAgICAgImRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaXhnYmVfbmFwaV9hZGRfYWxsKGFkYXB0ZXIpOworCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQllcnIgPSBpeGdiZV9vcGVuKGFkYXB0ZXItPm5ldGRldik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCitzdGF0aWMgaW50IGl4Z2JlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKyNpZmRlZiBDT05GSUdfUE0KKwlpbnQgcmV0dmFsID0gMDsKKyNlbmRpZgorCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlpeGdiZV9kb3duKGFkYXB0ZXIpOworCQlpeGdiZV9mcmVlX2lycShhZGFwdGVyKTsKKwkJaXhnYmVfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlpeGdiZV9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CisJfQorCWl4Z2JlX3Jlc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOworCWl4Z2JlX25hcGlfZGVsX2FsbChhZGFwdGVyKTsKKwlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKKwlrZnJlZShhZGFwdGVyLT5yeF9yaW5nKTsKKworI2lmZGVmIENPTkZJR19QTQorCXJldHZhbCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisjZW5kaWYKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKworCWl4Z2JlX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl4Z2JlX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWl4Z2JlX3N1c3BlbmQocGRldiwgUE1TR19TVVNQRU5EKTsKK30KKworLyoqCiAgKiBpeGdiZV91cGRhdGVfc3RhdHMgLSBVcGRhdGUgdGhlIGJvYXJkIHN0YXRpc3RpY3MgY291bnRlcnMuCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KQEAgLTI4ODksNyArMzEzNSw3IEBACiAKIAkvKiBSeCBFcnJvcnMgKi8KIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuY3JjZXJycyArCi0JCQkJCQlhZGFwdGVyLT5zdGF0cy5ybGVjOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5zdGF0cy5ybGVjOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9kcm9wcGVkID0gMDsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLnJsZWM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5jcmNlcnJzOwpAQCAtMjkwMywyNyArMzE0OSw3NCBAQAogc3RhdGljIHZvaWQgaXhnYmVfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBpeGdiZV9hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCWJvb2wgbGlua191cDsKLQl1MzIgbGlua19zcGVlZCA9IDA7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAotCWFkYXB0ZXItPmh3Lm1hYy5vcHMuY2hlY2tfbGluaygmYWRhcHRlci0+aHcsICYobGlua19zcGVlZCksICZsaW5rX3VwKTsKKwkvKiBEbyB0aGUgd2F0Y2hkb2cgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCBkdWUgdG8gdGhlIGxvdmVseQorCSAqIGRlbGF5cyB0aGF0IHNvbWUgb2YgdGhlIG5ld2VyIGhhcmR3YXJlIHJlcXVpcmVzICovCisJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpIHsKKwkJLyogQ2F1c2Ugc29mdHdhcmUgaW50ZXJydXB0IHRvIGVuc3VyZSByeCByaW5ncyBhcmUgY2xlYW5lZCAqLworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkgeworCQkJdTMyIGVpY3MgPQorCQkJICgxIDw8IChhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzIC0gTk9OX1FfVkVDVE9SUykpIC0gMTsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlDUywgZWljcyk7CisJCX0gZWxzZSB7CisJCQkvKiBGb3IgbGVnYWN5IGFuZCBNU0kgaW50ZXJydXB0cyBkb24ndCBzZXQgYW55IGJpdHMgdGhhdAorCQkJICogYXJlIGVuYWJsZWQgZm9yIEVJQU0sIGJlY2F1c2UgdGhpcyBvcGVyYXRpb24gd291bGQKKwkJCSAqIHNldCAqYm90aCogRUlNUyBhbmQgRUlDUyBmb3IgYW55IGJpdCBpbiBFSUFNICovCisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVhHQkVfRUlDU19UQ1BfVElNRVIgfCBJWEdCRV9FSUNTX09USEVSKSk7CisJCX0KKwkJLyogUmVzZXQgdGhlIHRpbWVyICovCisJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsCisJCSAgICAgICAgICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAyICogSFopKTsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrKTsKK30KKworLyoqCisgKiBpeGdiZV93YXRjaGRvZ190YXNrIC0gd29ya2VyIHRocmVhZCB0byBicmluZyBsaW5rIHVwCisgKiBAd29yazogcG9pbnRlciB0byB3b3JrX3N0cnVjdCBjb250YWluaW5nIG91ciBkYXRhCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV93YXRjaGRvZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9hZGFwdGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgbGlua19zcGVlZCA9IGFkYXB0ZXItPmxpbmtfc3BlZWQ7CisJYm9vbCBsaW5rX3VwID0gYWRhcHRlci0+bGlua191cDsKKworCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfSU5fV0FUQ0hET0dfVEFTSzsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfTkVFRF9MSU5LX1VQREFURSkgeworCQlody0+bWFjLm9wcy5jaGVja19saW5rKGh3LCAmbGlua19zcGVlZCwgJmxpbmtfdXAsIGZhbHNlKTsKKwkJaWYgKGxpbmtfdXAgfHwKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgKGFkYXB0ZXItPmxpbmtfY2hlY2tfdGltZW91dCArCisJCSAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9UUllfTElOS19USU1FT1VUKSkpIHsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlNUywgSVhHQkVfRUlNQ19MU0MpOworCQkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfTkVFRF9MSU5LX1VQREFURTsKKwkJfQorCQlhZGFwdGVyLT5saW5rX3VwID0gbGlua191cDsKKwkJYWRhcHRlci0+bGlua19zcGVlZCA9IGxpbmtfc3BlZWQ7CisJfQogCiAJaWYgKGxpbmtfdXApIHsKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCXUzMiBmcmN0bCA9IElYR0JFX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRkNUUkwpOwotCQkJdTMyIHJtY3MgPSBJWEdCRV9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1JNQ1MpOworCQkJdTMyIGZyY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0ZDVFJMKTsKKwkJCXUzMiBybWNzID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JNQ1MpOwogI2RlZmluZSBGTE9XX1JYIChmcmN0bCAmIElYR0JFX0ZDVFJMX1JGQ0UpCiAjZGVmaW5lIEZMT1dfVFggKHJtY3MgJiBJWEdCRV9STUNTX1RGQ0VfODAyXzNYKQogCQkJRFBSSU5USyhMSU5LLCBJTkZPLCAiTklDIExpbmsgaXMgVXAgJXMsICIKLQkJCQkiRmxvdyBDb250cm9sOiAlc1xuIiwKLQkJCQkobGlua19zcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCA/Ci0JCQkJICIxMCBHYnBzIiA6Ci0JCQkJIChsaW5rX3NwZWVkID09IElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwgPwotCQkJCSAgIjEgR2JwcyIgOiAidW5rbm93biBzcGVlZCIpKSwKLQkJCQkoKEZMT1dfUlggJiYgRkxPV19UWCkgPyAiUlgvVFgiIDoKLQkJCQkgKEZMT1dfUlggPyAiUlgiIDoKLQkJCQkgKEZMT1dfVFggPyAiVFgiIDogIk5vbmUiKSkpKTsKKwkJCSAgICAgICAgIkZsb3cgQ29udHJvbDogJXNcbiIsCisJCQkgICAgICAgIChsaW5rX3NwZWVkID09IElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMID8KKwkJCSAgICAgICAgICIxMCBHYnBzIiA6CisJCQkgICAgICAgICAobGlua19zcGVlZCA9PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMID8KKwkJCSAgICAgICAgICAiMSBHYnBzIiA6ICJ1bmtub3duIHNwZWVkIikpLAorCQkJICAgICAgICAoKEZMT1dfUlggJiYgRkxPV19UWCkgPyAiUlgvVFgiIDoKKwkJCSAgICAgICAgIChGTE9XX1JYID8gIlJYIiA6CisJCQkgICAgICAgICAoRkxPV19UWCA/ICJUWCIgOiAiTm9uZSIpKSkpOwogCiAJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CiAJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMobmV0ZGV2KTsKQEAgLTI5MzIsNiArMzIyNSw4IEBACiAJCQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IHRydWU7CiAJCX0KIAl9IGVsc2UgeworCQlhZGFwdGVyLT5saW5rX3VwID0gZmFsc2U7CisJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOwogCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CiAJCQlEUFJJTlRLKExJTkssIElORk8sICJOSUMgTGluayBpcyBEb3duXG4iKTsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CkBAIC0yOTQwLDM2ICszMjM1LDE5IEBACiAJfQogCiAJaXhnYmVfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwotCi0JaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpIHsKLQkJLyogQ2F1c2Ugc29mdHdhcmUgaW50ZXJydXB0IHRvIGVuc3VyZSByeCByaW5ncyBhcmUgY2xlYW5lZCAqLwotCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkgewotCQkJdTMyIGVpY3MgPQotCQkJICgxIDw8IChhZGFwdGVyLT5udW1fbXNpeF92ZWN0b3JzIC0gTk9OX1FfVkVDVE9SUykpIC0gMTsKLQkJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsIGVpY3MpOwotCQl9IGVsc2UgewotCQkJLyogZm9yIGxlZ2FjeSBhbmQgTVNJIGludGVycnVwdHMgZG9uJ3Qgc2V0IGFueSBiaXRzIHRoYXQKLQkJCSAqIGFyZSBlbmFibGVkIGZvciBFSUFNLCBiZWNhdXNlIHRoaXMgb3BlcmF0aW9uIHdvdWxkCi0JCQkgKiBzZXQgKmJvdGgqIEVJTVMgYW5kIEVJQ1MgZm9yIGFueSBiaXQgaW4gRUlBTSAqLwotCQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlDUywKLQkJCQkgICAgIChJWEdCRV9FSUNTX1RDUF9USU1FUiB8IElYR0JFX0VJQ1NfT1RIRVIpKTsKLQkJfQotCQkvKiBSZXNldCB0aGUgdGltZXIgKi8KLQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwKLQkJCSAgcm91bmRfamlmZmllcyhqaWZmaWVzICsgMiAqIEhaKSk7Ci0JfQorCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0lOX1dBVENIRE9HX1RBU0s7CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfdHNvKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIHUzMiB0eF9mbGFncywgdTggKmhkcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgIHUzMiB0eF9mbGFncywgdTggKmhkcl9sZW4pCiB7CiAJc3RydWN0IGl4Z2JlX2Fkdl90eF9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgZXJyOwogCXN0cnVjdCBpeGdiZV90eF9idWZmZXIgKnR4X2J1ZmZlcl9pbmZvOwotCXUzMiB2bGFuX21hY2lwX2xlbnMgPSAwLCB0eXBlX3R1Y21kX21saGwgPSAwOwotCXUzMiBtc3NfbDRsZW5faWR4ID0gMCwgbDRsZW47CisJdTMyIHZsYW5fbWFjaXBfbGVucyA9IDAsIHR5cGVfdHVjbWRfbWxobDsKKwl1MzIgbXNzX2w0bGVuX2lkeCwgbDRsZW47CiAKIAlpZiAoc2tiX2lzX2dzbyhza2IpKSB7CiAJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpKSB7CkBAIC0yOTg1LDE2ICszMjYzLDE2IEBACiAJCQlpcGgtPnRvdF9sZW4gPSAwOwogCQkJaXBoLT5jaGVjayA9IDA7CiAJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCi0JCQkJCQkJCSBpcGgtPmRhZGRyLCAwLAotCQkJCQkJCQkgSVBQUk9UT19UQ1AsCi0JCQkJCQkJCSAwKTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBoLT5kYWRkciwgMCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19UQ1AsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogCQkJYWRhcHRlci0+aHdfdHNvX2N0eHQrKzsKIAkJfSBlbHNlIGlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID09IFNLQl9HU09fVENQVjYpIHsKIAkJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKIAkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQogCQkJICAgIH5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkJCQkgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKLQkJCQkJICAgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkgICAgICAgICAgICAgICAgICAgICAwLCBJUFBST1RPX1RDUCwgMCk7CiAJCQlhZGFwdGVyLT5od190c282X2N0eHQrKzsKIAkJfQogCkBAIC0zMDA4LDcgKzMyODYsNyBAQAogCQkJdmxhbl9tYWNpcF9sZW5zIHw9CiAJCQkgICAgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfVkxBTl9NQVNLKTsKIAkJdmxhbl9tYWNpcF9sZW5zIHw9ICgoc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpIDw8Ci0JCQkJICAgIElYR0JFX0FEVlRYRF9NQUNMRU5fU0hJRlQpOworCQkgICAgICAgICAgICAgICAgICAgIElYR0JFX0FEVlRYRF9NQUNMRU5fU0hJRlQpOwogCQkqaGRyX2xlbiArPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAkJdmxhbl9tYWNpcF9sZW5zIHw9CiAJCSAgICAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKQEAgLTMwMTgsOCArMzI5Niw4IEBACiAJCWNvbnRleHRfZGVzYy0+c2VxbnVtX3NlZWQgPSAwOwogCiAJCS8qIEFEViBEVFlQIFRVQ01EIE1LUkxPQy9JU0NTSUhFRExFTiAqLwotCQl0eXBlX3R1Y21kX21saGwgfD0gKElYR0JFX1RYRF9DTURfREVYVCB8Ci0JCQkJICAgIElYR0JFX0FEVlRYRF9EVFlQX0NUWFQpOworCQl0eXBlX3R1Y21kX21saGwgPSAoSVhHQkVfVFhEX0NNRF9ERVhUIHwKKwkJICAgICAgICAgICAgICAgICAgIElYR0JFX0FEVlRYRF9EVFlQX0NUWFQpOwogCiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJCXR5cGVfdHVjbWRfbWxobCB8PSBJWEdCRV9BRFZUWERfVFVDTURfSVBWNDsKQEAgLTMwMjcsOSArMzMwNSwxMSBAQAogCQljb250ZXh0X2Rlc2MtPnR5cGVfdHVjbWRfbWxobCA9IGNwdV90b19sZTMyKHR5cGVfdHVjbWRfbWxobCk7CiAKIAkJLyogTVNTIEw0TEVOIElEWCAqLwotCQltc3NfbDRsZW5faWR4IHw9CisJCW1zc19sNGxlbl9pZHggPQogCQkgICAgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPDwgSVhHQkVfQURWVFhEX01TU19TSElGVCk7CiAJCW1zc19sNGxlbl9pZHggfD0gKGw0bGVuIDw8IElYR0JFX0FEVlRYRF9MNExFTl9TSElGVCk7CisJCS8qIHVzZSBpbmRleCAxIGZvciBUU08gKi8KKwkJbXNzX2w0bGVuX2lkeCB8PSAoMSA8PCBJWEdCRV9BRFZUWERfSURYX1NISUZUKTsKIAkJY29udGV4dF9kZXNjLT5tc3NfbDRsZW5faWR4ID0gY3B1X3RvX2xlMzIobXNzX2w0bGVuX2lkeCk7CiAKIAkJdHhfYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwpAQCAtMzA0Niw4ICszMzI2LDggQEAKIH0KIAogc3RhdGljIGJvb2wgaXhnYmVfdHhfY3N1bShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgdHhfZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgdHhfZmxhZ3MpCiB7CiAJc3RydWN0IGl4Z2JlX2Fkdl90eF9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTMwNjQsMTYgKzMzNDQsMTYgQEAKIAkJCXZsYW5fbWFjaXBfbGVucyB8PQogCQkJICAgICh0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX1ZMQU5fTUFTSyk7CiAJCXZsYW5fbWFjaXBfbGVucyB8PSAoc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgPDwKLQkJCQkgICAgSVhHQkVfQURWVFhEX01BQ0xFTl9TSElGVCk7CisJCSAgICAgICAgICAgICAgICAgICAgSVhHQkVfQURWVFhEX01BQ0xFTl9TSElGVCk7CiAJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQogCQkJdmxhbl9tYWNpcF9sZW5zIHw9IChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0KLQkJCQkJICAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKKwkJCSAgICAgICAgICAgICAgICAgICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJCWNvbnRleHRfZGVzYy0+dmxhbl9tYWNpcF9sZW5zID0gY3B1X3RvX2xlMzIodmxhbl9tYWNpcF9sZW5zKTsKIAkJY29udGV4dF9kZXNjLT5zZXFudW1fc2VlZCA9IDA7CiAKIAkJdHlwZV90dWNtZF9tbGhsIHw9IChJWEdCRV9UWERfQ01EX0RFWFQgfAotCQkJCSAgICBJWEdCRV9BRFZUWERfRFRZUF9DVFhUKTsKKwkJICAgICAgICAgICAgICAgICAgICBJWEdCRV9BRFZUWERfRFRZUF9DVFhUKTsKIAogCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQkJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CkBAIC0zMDgxLDE2ICszMzYxLDE0IEBACiAJCQkJdHlwZV90dWNtZF9tbGhsIHw9IElYR0JFX0FEVlRYRF9UVUNNRF9JUFY0OwogCQkJCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCiAJCQkJCXR5cGVfdHVjbWRfbWxobCB8PQotCQkJCQkJSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9UQ1A7CisJCQkJCSAgICAgICAgSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9UQ1A7CiAJCQkJYnJlYWs7Ci0KIAkJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKIAkJCQkvKiBYWFggd2hhdCBhYm91dCBvdGhlciBWNiBoZWFkZXJzPz8gKi8KIAkJCQlpZiAoaXB2Nl9oZHIoc2tiKS0+bmV4dGhkciA9PSBJUFBST1RPX1RDUCkKIAkJCQkJdHlwZV90dWNtZF9tbGhsIHw9Ci0JCQkJCQlJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUDsKKwkJCQkJICAgICAgICBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUDsKIAkJCQlicmVhazsKLQogCQkJZGVmYXVsdDoKIAkJCQlpZiAodW5saWtlbHkobmV0X3JhdGVsaW1pdCgpKSkgewogCQkJCQlEUFJJTlRLKFBST0JFLCBXQVJOSU5HLApAQCAtMzEwMiwxMCArMzM4MCwxMiBAQAogCQl9CiAKIAkJY29udGV4dF9kZXNjLT50eXBlX3R1Y21kX21saGwgPSBjcHVfdG9fbGUzMih0eXBlX3R1Y21kX21saGwpOworCQkvKiB1c2UgaW5kZXggemVybyBmb3IgdHggY2hlY2tzdW0gb2ZmbG9hZCAqLwogCQljb250ZXh0X2Rlc2MtPm1zc19sNGxlbl9pZHggPSAwOwogCiAJCXR4X2J1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKIAkJdHhfYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOworCiAJCWFkYXB0ZXItPmh3X2NzdW1fdHhfZ29vZCsrOwogCQlpKys7CiAJCWlmIChpID09IHR4X3JpbmctPmNvdW50KQpAQCAtMzExNCwxMiArMzM5NCwxMyBAQAogCiAJCXJldHVybiB0cnVlOwogCX0KKwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCBpeGdiZV90eF9tYXAoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZywKLQkJCXN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZpcnN0KQogewogCXN0cnVjdCBpeGdiZV90eF9idWZmZXIgKnR4X2J1ZmZlcl9pbmZvOwogCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKQEAgLTMxMzcsOCArMzQxOCw4IEBACiAKIAkJdHhfYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CiAJCXR4X2J1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LAotCQkJCQkJICBza2ItPmRhdGEgKyBvZmZzZXQsCi0JCQkJCQkgIHNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhICsgb2Zmc2V0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CiAJCXR4X2J1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKIAkJdHhfYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOwogCkBAIC0zMTYzLDkgKzM0NDQsMTAgQEAKIAogCQkJdHhfYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CiAJCQl0eF9idWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkJZnJhZy0+cGFnZSwKLQkJCQkJCQlvZmZzZXQsCi0JCQkJCQkJc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWctPnBhZ2UsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CiAJCQl0eF9idWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CiAJCQl0eF9idWZmZXJfaW5mby0+bmV4dF90b193YXRjaCA9IGk7CiAKQEAgLTMxODgsOCArMzQ3MCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX3R4X3F1ZXVlKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLAotCQkJICAgICAgIGludCB0eF9mbGFncywgaW50IGNvdW50LCB1MzIgcGF5bGVuLCB1OCBoZHJfbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl4Z2JlX3JpbmcgKnR4X3JpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHhfZmxhZ3MsIGludCBjb3VudCwgdTMyIHBheWxlbiwgdTggaGRyX2xlbikKIHsKIAl1bmlvbiBpeGdiZV9hZHZfdHhfZGVzYyAqdHhfZGVzYyA9IE5VTEw7CiAJc3RydWN0IGl4Z2JlX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87CkBAIC0zMjA4LDE1ICszNDkwLDE3IEBACiAJCWNtZF90eXBlX2xlbiB8PSBJWEdCRV9BRFZUWERfRENNRF9UU0U7CiAKIAkJb2xpbmZvX3N0YXR1cyB8PSBJWEdCRV9UWERfUE9QVFNfVFhTTSA8PAotCQkJCQkJSVhHQkVfQURWVFhEX1BPUFRTX1NISUZUOworCQkgICAgICAgICAgICAgICAgIElYR0JFX0FEVlRYRF9QT1BUU19TSElGVDsKIAorCQkvKiB1c2UgaW5kZXggMSBjb250ZXh0IGZvciB0c28gKi8KKwkJb2xpbmZvX3N0YXR1cyB8PSAoMSA8PCBJWEdCRV9BRFZUWERfSURYX1NISUZUKTsKIAkJaWYgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfSVBWNCkKIAkJCW9saW5mb19zdGF0dXMgfD0gSVhHQkVfVFhEX1BPUFRTX0lYU00gPDwKLQkJCQkJCUlYR0JFX0FEVlRYRF9QT1BUU19TSElGVDsKKwkJCSAgICAgICAgICAgICAgICAgSVhHQkVfQURWVFhEX1BPUFRTX1NISUZUOwogCiAJfSBlbHNlIGlmICh0eF9mbGFncyAmIElYR0JFX1RYX0ZMQUdTX0NTVU0pCiAJCW9saW5mb19zdGF0dXMgfD0gSVhHQkVfVFhEX1BPUFRTX1RYU00gPDwKLQkJCQkJCUlYR0JFX0FEVlRYRF9QT1BUU19TSElGVDsKKwkJICAgICAgICAgICAgICAgICBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQ7CiAKIAlvbGluZm9fc3RhdHVzIHw9ICgocGF5bGVuIC0gaGRyX2xlbikgPDwgSVhHQkVfQURWVFhEX1BBWUxFTl9TSElGVCk7CiAKQEAgLTMyMjYsOSArMzUxMCw4IEBACiAJCXR4X2Rlc2MgPSBJWEdCRV9UWF9ERVNDX0FEVigqdHhfcmluZywgaSk7CiAJCXR4X2Rlc2MtPnJlYWQuYnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NCh0eF9idWZmZXJfaW5mby0+ZG1hKTsKIAkJdHhfZGVzYy0+cmVhZC5jbWRfdHlwZV9sZW4gPQotCQkJY3B1X3RvX2xlMzIoY21kX3R5cGVfbGVuIHwgdHhfYnVmZmVyX2luZm8tPmxlbmd0aCk7CisJCSAgICAgICAgY3B1X3RvX2xlMzIoY21kX3R5cGVfbGVuIHwgdHhfYnVmZmVyX2luZm8tPmxlbmd0aCk7CiAJCXR4X2Rlc2MtPnJlYWQub2xpbmZvX3N0YXR1cyA9IGNwdV90b19sZTMyKG9saW5mb19zdGF0dXMpOwotCiAJCWkrKzsKIAkJaWYgKGkgPT0gdHhfcmluZy0+Y291bnQpCiAJCQlpID0gMDsKQEAgLTMyNDksNyArMzUzMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19peGdiZV9tYXliZV9zdG9wX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTMyNjUsNjEgKzM1NDgsNTIgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIEEgcmVwcmlldmUhIC0gdXNlIHN0YXJ0X3F1ZXVlIGJlY2F1c2UgaXQgZG9lc24ndCBjYWxsIHNjaGVkdWxlICovCi0JbmV0aWZfd2FrZV9zdWJxdWV1ZShuZXRkZXYsIHR4X3JpbmctPnF1ZXVlX2luZGV4KTsKKwluZXRpZl9zdGFydF9zdWJxdWV1ZShuZXRkZXYsIHR4X3JpbmctPnF1ZXVlX2luZGV4KTsKIAkrK2FkYXB0ZXItPnJlc3RhcnRfcXVldWU7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfbWF5YmVfc3RvcF90eChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nLCBpbnQgc2l6ZSkKIHsKIAlpZiAobGlrZWx5KElYR0JFX0RFU0NfVU5VU0VEKHR4X3JpbmcpID49IHNpemUpKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gX19peGdiZV9tYXliZV9zdG9wX3R4KG5ldGRldiwgdHhfcmluZywgc2l6ZSk7CiB9CiAKLQogc3RhdGljIGludCBpeGdiZV94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nOwotCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKIAl1bnNpZ25lZCBpbnQgZmlyc3Q7CiAJdW5zaWduZWQgaW50IHR4X2ZsYWdzID0gMDsKIAl1OCBoZHJfbGVuID0gMDsKIAlpbnQgcl9pZHggPSAwLCB0c287Ci0JdW5zaWduZWQgaW50IG1zcyA9IDA7CiAJaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgZjsKLQl1bnNpZ25lZCBpbnQgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOwotCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCiAJcl9pZHggPSAoYWRhcHRlci0+bnVtX3R4X3F1ZXVlcyAtIDEpICYgc2tiLT5xdWV1ZV9tYXBwaW5nOwogCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1tyX2lkeF07CiAKLQotCWlmIChza2ItPmxlbiA8PSAwKSB7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwlpZiAoYWRhcHRlci0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCXR4X2ZsYWdzIHw9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl0eF9mbGFncyA8PD0gSVhHQkVfVFhfRkxBR1NfVkxBTl9TSElGVDsKKwkJdHhfZmxhZ3MgfD0gSVhHQkVfVFhfRkxBR1NfVkxBTjsKIAl9Ci0JbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQotCWlmIChtc3MpCi0JCWNvdW50Kys7Ci0JZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkvKiB0aHJlZSB0aGluZ3MgY2FuIGNhdXNlIHVzIHRvIG5lZWQgYSBjb250ZXh0IGRlc2NyaXB0b3IgKi8KKwlpZiAoc2tiX2lzX2dzbyhza2IpIHx8CisJICAgIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB8fAorCSAgICAodHhfZmxhZ3MgJiBJWEdCRV9UWF9GTEFHU19WTEFOKSkKIAkJY291bnQrKzsKIAotCWNvdW50ICs9IFRYRF9VU0VfQ09VTlQobGVuKTsKLQlmb3IgKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykKKwljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9oZWFkbGVuKHNrYikpOworCWZvciAoZiA9IDA7IGYgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmKyspCiAJCWNvdW50ICs9IFRYRF9VU0VfQ09VTlQoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXS5zaXplKTsKIAogCWlmIChpeGdiZV9tYXliZV9zdG9wX3R4KG5ldGRldiwgdHhfcmluZywgY291bnQpKSB7CiAJCWFkYXB0ZXItPnR4X2J1c3krKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KLQlpZiAoYWRhcHRlci0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7Ci0JCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX1ZMQU47Ci0JCXR4X2ZsYWdzIHw9ICh2bGFuX3R4X3RhZ19nZXQoc2tiKSA8PCBJWEdCRV9UWF9GTEFHU19WTEFOX1NISUZUKTsKLQl9CiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX0lQVjQ7CkBAIC0zMzMzLDEyICszNjA3LDEyIEBACiAJaWYgKHRzbykKIAkJdHhfZmxhZ3MgfD0gSVhHQkVfVFhfRkxBR1NfVFNPOwogCWVsc2UgaWYgKGl4Z2JlX3R4X2NzdW0oYWRhcHRlciwgdHhfcmluZywgc2tiLCB0eF9mbGFncykgJiYKLQkJIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkKKwkgICAgICAgICAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpCiAJCXR4X2ZsYWdzIHw9IElYR0JFX1RYX0ZMQUdTX0NTVU07CiAKIAlpeGdiZV90eF9xdWV1ZShhZGFwdGVyLCB0eF9yaW5nLCB0eF9mbGFncywKLQkJCSAgIGl4Z2JlX3R4X21hcChhZGFwdGVyLCB0eF9yaW5nLCBza2IsIGZpcnN0KSwKLQkJCSAgIHNrYi0+bGVuLCBoZHJfbGVuKTsKKwkgICAgICAgICAgICAgICBpeGdiZV90eF9tYXAoYWRhcHRlciwgdHhfcmluZywgc2tiLCBmaXJzdCksCisJICAgICAgICAgICAgICAgc2tiLT5sZW4sIGhkcl9sZW4pOwogCiAJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAKQEAgLTMzNzIsMTUgKzM2NDYsMTYgQEAKIHN0YXRpYyBpbnQgaXhnYmVfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKLQltZW1jcHkoYWRhcHRlci0+aHcubWFjLmFkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCW1lbWNweShody0+bWFjLmFkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOwogCi0JaXhnYmVfc2V0X3JhcigmYWRhcHRlci0+aHcsIDAsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCAwLCBJWEdCRV9SQUhfQVYpOworCWh3LT5tYWMub3BzLnNldF9yYXIoaHcsIDAsIGh3LT5tYWMuYWRkciwgMCwgSVhHQkVfUkFIX0FWKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzQwNCwyOCArMzY3OSwxOSBAQAogI2VuZGlmCiAKIC8qKgotICogaXhnYmVfbmFwaV9hZGRfYWxsIC0gcHJlcCBuYXBpIHN0cnVjdHMgZm9yIHVzZQotICogQGFkYXB0ZXI6IHByaXZhdGUgc3RydWN0Ci0gKiBoZWxwZXIgZnVuY3Rpb24gdG8gbmFwaV9hZGQgZWFjaCBwb3NzaWJsZSBxX3ZlY3Rvci0+bmFwaQotICovCi1zdGF0aWMgdm9pZCBpeGdiZV9uYXBpX2FkZF9hbGwoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCisgKiBpeGdiZV9saW5rX2NvbmZpZyAtIHNldCB1cCBpbml0aWFsIGxpbmsgd2l0aCBkZWZhdWx0IHNwZWVkIGFuZCBkdXBsZXgKKyAqIEBodzogcG9pbnRlciB0byBwcml2YXRlIGhhcmR3YXJlIHN0cnVjdAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCitzdGF0aWMgaW50IGl4Z2JlX2xpbmtfY29uZmlnKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7Ci0JaW50IGksIHFfdmVjdG9ycyA9IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05fUV9WRUNUT1JTOwotCWludCAoKnBvbGwpKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpOworCXUzMiBhdXRvbmVnID0gSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEw7CiAKLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkgewotCQlwb2xsID0gJml4Z2JlX2NsZWFuX3J4b25seTsKLQl9IGVsc2UgewotCQlwb2xsID0gJml4Z2JlX3BvbGw7Ci0JCS8qIG9ubHkgb25lIHFfdmVjdG9yIGZvciBsZWdhY3kgbW9kZXMgKi8KLQkJcV92ZWN0b3JzID0gMTsKLQl9CisJLyogbXVzdCBhbHdheXMgYXV0b25lZyBmb3IgYm90aCAxRyBhbmQgMTBHIGxpbmsgKi8KKwlody0+bWFjLmF1dG9uZWcgPSB0cnVlOwogCi0JZm9yIChpID0gMDsgaSA8IHFfdmVjdG9yczsgaSsrKSB7Ci0JCXN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcV92ZWN0b3IgPSAmYWRhcHRlci0+cV92ZWN0b3JbaV07Ci0JCW5ldGlmX25hcGlfYWRkKGFkYXB0ZXItPm5ldGRldiwgJnFfdmVjdG9yLT5uYXBpLAotCQkJICAgICAgICgqcG9sbCksIDY0KTsKLQl9CisJcmV0dXJuIGh3LT5tYWMub3BzLnNldHVwX2xpbmtfc3BlZWQoaHcsIGF1dG9uZWcsIHRydWUsIHRydWUpOwogfQogCiAvKioKQEAgLTM0NDAsMTcgKzM3MDYsMTYgQEAKICAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgogICoqLwogc3RhdGljIGludCBfX2RldmluaXQgaXhnYmVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOwogCXN0cnVjdCBpeGdiZV9odyAqaHc7CiAJY29uc3Qgc3RydWN0IGl4Z2JlX2luZm8gKmlpID0gaXhnYmVfaW5mb190YmxbZW50LT5kcml2ZXJfZGF0YV07Ci0JdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2xlbjsKIAlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOwogCWludCBpLCBlcnIsIHBjaV91c2luZ19kYWM7CiAJdTE2IGxpbmtfc3RhdHVzLCBsaW5rX3NwZWVkLCBsaW5rX3dpZHRoOwotCXUzMiBwYXJ0X251bTsKKwl1MzIgcGFydF9udW0sIGVlYzsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpCkBAIC0zNDY1LDcgKzM3MzAsNyBAQAogCQkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJCWlmIChlcnIpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1c2FibGUgRE1BICIKLQkJCQkJImNvbmZpZ3VyYXRpb24sIGFib3J0aW5nXG4iKTsKKwkJCQkgICAgICAgICJjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CiAJCQkJZ290byBlcnJfZG1hOwogCQkJfQogCQl9CkBAIC0zNDk4LDEwICszNzYzLDggQEAKIAlody0+YmFjayA9IGFkYXB0ZXI7CiAJYWRhcHRlci0+bXNnX2VuYWJsZSA9ICgxIDw8IERFRkFVTFRfREVCVUdfTEVWRUxfU0hJRlQpIC0gMTsKIAotCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCi0JaHctPmh3X2FkZHIgPSBpb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlody0+aHdfYWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCSAgICAgICAgICAgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKIAlpZiAoIWh3LT5od19hZGRyKSB7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX2lvcmVtYXA7CkBAIC0zNTE2LDcgKzM3NzksOCBAQAogCW5ldGRldi0+c3RvcCA9ICZpeGdiZV9jbG9zZTsKIAluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZpeGdiZV94bWl0X2ZyYW1lOwogCW5ldGRldi0+Z2V0X3N0YXRzID0gJml4Z2JlX2dldF9zdGF0czsKLQluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpeGdiZV9zZXRfbXVsdGk7CisJbmV0ZGV2LT5zZXRfcnhfbW9kZSA9ICZpeGdiZV9zZXRfcnhfbW9kZTsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpeGdiZV9zZXRfcnhfbW9kZTsKIAluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZpeGdiZV9zZXRfbWFjOwogCW5ldGRldi0+Y2hhbmdlX210dSA9ICZpeGdiZV9jaGFuZ2VfbXR1OwogCWl4Z2JlX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOwpAQCAtMzUzMCwyMiArMzc5NCwyMyBAQAogI2VuZGlmCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgcGNpX25hbWUocGRldikpOwogCi0JbmV0ZGV2LT5tZW1fc3RhcnQgPSBtbWlvX3N0YXJ0OwotCW5ldGRldi0+bWVtX2VuZCA9IG1taW9fc3RhcnQgKyBtbWlvX2xlbjsKLQogCWFkYXB0ZXItPmJkX251bWJlciA9IGNhcmRzX2ZvdW5kOwogCi0JLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCi0JaHctPnZlbmRvcl9pZCA9IHBkZXYtPnZlbmRvcjsKLQlody0+ZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOwotCWh3LT5yZXZpc2lvbl9pZCA9IHBkZXYtPnJldmlzaW9uOwotCWh3LT5zdWJzeXN0ZW1fdmVuZG9yX2lkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKLQlody0+c3Vic3lzdGVtX2RldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7Ci0KIAkvKiBTZXR1cCBodyBhcGkgKi8KIAltZW1jcHkoJmh3LT5tYWMub3BzLCBpaS0+bWFjX29wcywgc2l6ZW9mKGh3LT5tYWMub3BzKSk7CiAJaHctPm1hYy50eXBlICA9IGlpLT5tYWM7CiAKKwkvKiBFRVBST00gKi8KKwltZW1jcHkoJmh3LT5lZXByb20ub3BzLCBpaS0+ZWVwcm9tX29wcywgc2l6ZW9mKGh3LT5lZXByb20ub3BzKSk7CisJZWVjID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VFQyk7CisJLyogSWYgRUVQUk9NIGlzIHZhbGlkIChiaXQgOCA9IDEpLCB1c2UgZGVmYXVsdCBvdGhlcndpc2UgdXNlIGJpdCBiYW5nICovCisJaWYgKCEoZWVjICYgKDEgPDwgOCkpKQorCQlody0+ZWVwcm9tLm9wcy5yZWFkID0gJml4Z2JlX3JlYWRfZWVwcm9tX2JpdF9iYW5nX2dlbmVyaWM7CisKKwkvKiBQSFkgKi8KKwltZW1jcHkoJmh3LT5waHkub3BzLCBpaS0+cGh5X29wcywgc2l6ZW9mKGh3LT5waHkub3BzKSk7CisJLyogcGh5LT5zZnBfdHlwZSA9IGl4Z2JlX3NmcF90eXBlX3Vua25vd247ICovCisKIAllcnIgPSBpaS0+Z2V0X2ludmFyaWFudHMoaHcpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2h3X2luaXQ7CkBAIC0zNTU1LDI2ICszODIwLDM0IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc3dfaW5pdDsKIAotCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKLQkJCSAgIE5FVElGX0ZfSFdfQ1NVTSB8Ci0JCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAotCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKLQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisJLyogcmVzZXRfaHcgZmlsbHMgaW4gdGhlIHBlcm1fYWRkciBhcyB3ZWxsICovCisJZXJyID0gaHctPm1hYy5vcHMucmVzZXRfaHcoaHcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiSFcgSW5pdCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9zd19pbml0OworCX0KIAotCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CisJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAorCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0lQX0NTVU0gfAorCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0hXX1ZMQU5fVFggfAorCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0hXX1ZMQU5fUlggfAorCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOworCisJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CiAKIAluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CiAJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CiAKIAlpZiAocGNpX3VzaW5nX2RhYykKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIEVFUFJPTSBpcyBnb29kICovCi0JaWYgKGl4Z2JlX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bShodywgTlVMTCkgPCAwKSB7CisJaWYgKGh3LT5lZXByb20ub3BzLnZhbGlkYXRlX2NoZWNrc3VtKGh3LCBOVUxMKSA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9lZXByb207CkBAIC0zNTgzLDcgKzM4NTYsOCBAQAogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBody0+bWFjLnBlcm1fYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CiAJbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBody0+bWFjLnBlcm1fYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CiAKLQlpZiAoaXhnYmVfdmFsaWRhdGVfbWFjX2FkZHIobmV0ZGV2LT5kZXZfYWRkcikpIHsKKwlpZiAoaXhnYmVfdmFsaWRhdGVfbWFjX2FkZHIobmV0ZGV2LT5wZXJtX2FkZHIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgTUFDIGFkZHJlc3NcbiIpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9lZXByb207CiAJfQpAQCAtMzU5MywxMyArMzg2Nyw3IEBACiAJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CiAKIAlJTklUX1dPUksoJmFkYXB0ZXItPnJlc2V0X3Rhc2ssIGl4Z2JlX3Jlc2V0X3Rhc2spOwotCi0JLyogaW5pdGlhbGl6ZSBkZWZhdWx0IGZsb3cgY29udHJvbCBzZXR0aW5ncyAqLwotCWh3LT5mYy5vcmlnaW5hbF90eXBlID0gaXhnYmVfZmNfZnVsbDsKLQlody0+ZmMudHlwZSA9IGl4Z2JlX2ZjX2Z1bGw7Ci0JaHctPmZjLmhpZ2hfd2F0ZXIgPSBJWEdCRV9ERUZBVUxUX0ZDUlRIOwotCWh3LT5mYy5sb3dfd2F0ZXIgPSBJWEdCRV9ERUZBVUxUX0ZDUlRMOwotCWh3LT5mYy5wYXVzZV90aW1lID0gSVhHQkVfREVGQVVMVF9GQ1BBVVNFOworCUlOSVRfV09SSygmYWRhcHRlci0+d2F0Y2hkb2dfdGFzaywgaXhnYmVfd2F0Y2hkb2dfdGFzayk7CiAKIAllcnIgPSBpeGdiZV9pbml0X2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CiAJaWYgKGVycikKQEAgLTM2MTAsMzIgKzM4NzgsMzkgQEAKIAlsaW5rX3NwZWVkID0gbGlua19zdGF0dXMgJiBJWEdCRV9QQ0lfTElOS19TUEVFRDsKIAlsaW5rX3dpZHRoID0gbGlua19zdGF0dXMgJiBJWEdCRV9QQ0lfTElOS19XSURUSDsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiKFBDSSBFeHByZXNzOiVzOiVzKSAiCi0JCSAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSgobGlua19zcGVlZCA9PSBJWEdCRV9QQ0lfTElOS19TUEVFRF81MDAwKSA/ICI1LjBHYi9zIiA6Ci0JCSAobGlua19zcGVlZCA9PSBJWEdCRV9QQ0lfTElOS19TUEVFRF8yNTAwKSA/ICIyLjVHYi9zIiA6Ci0JCSAiVW5rbm93biIpLAotCQkoKGxpbmtfd2lkdGggPT0gSVhHQkVfUENJX0xJTktfV0lEVEhfOCkgPyAiV2lkdGggeDgiIDoKLQkJIChsaW5rX3dpZHRoID09IElYR0JFX1BDSV9MSU5LX1dJRFRIXzQpID8gIldpZHRoIHg0IiA6Ci0JCSAobGlua193aWR0aCA9PSBJWEdCRV9QQ0lfTElOS19XSURUSF8yKSA/ICJXaWR0aCB4MiIgOgotCQkgKGxpbmtfd2lkdGggPT0gSVhHQkVfUENJX0xJTktfV0lEVEhfMSkgPyAiV2lkdGggeDEiIDoKLQkJICJVbmtub3duIiksCi0JCW5ldGRldi0+ZGV2X2FkZHJbMF0sIG5ldGRldi0+ZGV2X2FkZHJbMV0sIG5ldGRldi0+ZGV2X2FkZHJbMl0sCi0JCW5ldGRldi0+ZGV2X2FkZHJbM10sIG5ldGRldi0+ZGV2X2FkZHJbNF0sIG5ldGRldi0+ZGV2X2FkZHJbNV0pOwotCWl4Z2JlX3JlYWRfcGFydF9udW0oaHcsICZwYXJ0X251bSk7CisJICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICAgKChsaW5rX3NwZWVkID09IElYR0JFX1BDSV9MSU5LX1NQRUVEXzUwMDApID8gIjUuMEdiL3MiIDoKKwkgICAgICAgICAobGlua19zcGVlZCA9PSBJWEdCRV9QQ0lfTElOS19TUEVFRF8yNTAwKSA/ICIyLjVHYi9zIiA6CisJICAgICAgICAgIlVua25vd24iKSwKKwkgICAgICAgICgobGlua193aWR0aCA9PSBJWEdCRV9QQ0lfTElOS19XSURUSF84KSA/ICJXaWR0aCB4OCIgOgorCSAgICAgICAgIChsaW5rX3dpZHRoID09IElYR0JFX1BDSV9MSU5LX1dJRFRIXzQpID8gIldpZHRoIHg0IiA6CisJICAgICAgICAgKGxpbmtfd2lkdGggPT0gSVhHQkVfUENJX0xJTktfV0lEVEhfMikgPyAiV2lkdGggeDIiIDoKKwkgICAgICAgICAobGlua193aWR0aCA9PSBJWEdCRV9QQ0lfTElOS19XSURUSF8xKSA/ICJXaWR0aCB4MSIgOgorCSAgICAgICAgICJVbmtub3duIiksCisJICAgICAgICBuZXRkZXYtPmRldl9hZGRyWzBdLCBuZXRkZXYtPmRldl9hZGRyWzFdLCBuZXRkZXYtPmRldl9hZGRyWzJdLAorCSAgICAgICAgbmV0ZGV2LT5kZXZfYWRkclszXSwgbmV0ZGV2LT5kZXZfYWRkcls0XSwgbmV0ZGV2LT5kZXZfYWRkcls1XSk7CisJaXhnYmVfcmVhZF9wYmFfbnVtX2dlbmVyaWMoaHcsICZwYXJ0X251bSk7CiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1BQzogJWQsIFBIWTogJWQsIFBCQSBObzogJTA2eC0lMDN4XG4iLAotCQkgaHctPm1hYy50eXBlLCBody0+cGh5LnR5cGUsCi0JCSAocGFydF9udW0gPj4gOCksIChwYXJ0X251bSAmIDB4ZmYpKTsKKwkgICAgICAgICBody0+bWFjLnR5cGUsIGh3LT5waHkudHlwZSwKKwkgICAgICAgICAocGFydF9udW0gPj4gOCksIChwYXJ0X251bSAmIDB4ZmYpKTsKIAogCWlmIChsaW5rX3dpZHRoIDw9IElYR0JFX1BDSV9MSU5LX1dJRFRIXzQpIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlBDSS1FeHByZXNzIGJhbmR3aWR0aCBhdmFpbGFibGUgZm9yICIKLQkJCSAidGhpcyBjYXJkIGlzIG5vdCBzdWZmaWNpZW50IGZvciBvcHRpbWFsICIKLQkJCSAicGVyZm9ybWFuY2UuXG4iKTsKKwkJICAgICAgICAgInRoaXMgY2FyZCBpcyBub3Qgc3VmZmljaWVudCBmb3Igb3B0aW1hbCAiCisJCSAgICAgICAgICJwZXJmb3JtYW5jZS5cbiIpOwogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgYSB4OCAiCi0JCQkgIlBDSS1FeHByZXNzIHNsb3QgaXMgcmVxdWlyZWQuXG4iKTsKKwkJICAgICAgICAgIlBDSS1FeHByZXNzIHNsb3QgaXMgcmVxdWlyZWQuXG4iKTsKIAl9CiAKIAkvKiByZXNldCB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCi0JaXhnYmVfc3RhcnRfaHcoaHcpOworCWh3LT5tYWMub3BzLnN0YXJ0X2h3KGh3KTsKKworCS8qIGxpbmtfY29uZmlnIGRlcGVuZHMgb24gc3RhcnRfaHcgYmVpbmcgY2FsbGVkIGF0IGxlYXN0IG9uY2UgKi8KKwllcnIgPSBpeGdiZV9saW5rX2NvbmZpZyhodyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzZXR1cF9saW5rX3NwZWVkIEZBSUxFRCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisJfQogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKQEAgLTM2NDcsNyArMzkyMiw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcmVnaXN0ZXI7CiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgZGVmaW5lZChDT05GSUdfRENBKSB8fCBkZWZpbmVkKENPTkZJR19EQ0FfTU9EVUxFKQogCWlmIChkY2FfYWRkX3JlcXVlc3RlcigmcGRldi0+ZGV2KSA9PSAwKSB7CiAJCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfRENBX0VOQUJMRUQ7CiAJCS8qIGFsd2F5cyB1c2UgQ0IyIG1vZGUsIGRpZmZlcmVuY2UgaXMgbWFza2VkCkBAIC0zNjk3LDcgKzM5NzIsNyBAQAogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiBkZWZpbmVkKENPTkZJR19EQ0EpIHx8IGRlZmluZWQoQ09ORklHX0RDQV9NT0RVTEUpCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0FfRU5BQkxFRCkgewogCQlhZGFwdGVyLT5mbGFncyAmPSB+SVhHQkVfRkxBR19EQ0FfRU5BQkxFRDsKIAkJZGNhX3JlbW92ZV9yZXF1ZXN0ZXIoJnBkZXYtPmRldik7CkBAIC0zNzE1LDYgKzM5OTAsNyBAQAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAKIAlEUFJJTlRLKFBST0JFLCBJTkZPLCAiY29tcGxldGVcbiIpOworCWl4Z2JlX25hcGlfZGVsX2FsbChhZGFwdGVyKTsKIAlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKIAlrZnJlZShhZGFwdGVyLT5yeF9yaW5nKTsKIApAQCAtMzczMiw3ICs0MDA4LDcgQEAKICAqIHRoaXMgZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkLgogICovCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpeGdiZV9pb19lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJCXBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CkBAIC0zNzQzLDcgKzQwMTksNyBAQAogCQlpeGdiZV9kb3duKGFkYXB0ZXIpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAotCS8qIFJlcXVlc3QgYSBzbG90IHNsb3QgcmVzZXQuICovCisJLyogUmVxdWVzdCBhIHNsb3QgcmVzZXQuICovCiAJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CiB9CiAKQEAgLTM3NjAsNyArNDAzNiw3IEBACiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLAotCQkJIkNhbm5vdCByZS1lbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldC5cbiIpOworCQkgICAgICAgICJDYW5ub3QgcmUtZW5hYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgcmVzZXQuXG4iKTsKIAkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CiAJfQogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwpAQCAtMzc5NCw3ICs0MDcwLDYgQEAKIAl9CiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7Ci0KIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgaXhnYmVfZXJyX2hhbmRsZXIgPSB7CkBAIC0zODMwLDEzICs0MTA1LDE0IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsIGl4Z2JlX2RyaXZlcl9uYW1lLCBpeGdiZV9jb3B5cmlnaHQpOwogCi0jaWZkZWYgQ09ORklHX0RDQQorI2lmIGRlZmluZWQoQ09ORklHX0RDQSkgfHwgZGVmaW5lZChDT05GSUdfRENBX01PRFVMRSkKIAlkY2FfcmVnaXN0ZXJfbm90aWZ5KCZkY2Ffbm90aWZpZXIpOwogCiAjZW5kaWYKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpeGdiZV9kcml2ZXIpOwogCXJldHVybiByZXQ7CiB9CisKIG1vZHVsZV9pbml0KGl4Z2JlX2luaXRfbW9kdWxlKTsKIAogLyoqCkBAIC0zODQ3LDI0ICs0MTIzLDI0IEBACiAgKiovCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXhnYmVfZXhpdF9tb2R1bGUodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgZGVmaW5lZChDT05GSUdfRENBKSB8fCBkZWZpbmVkKENPTkZJR19EQ0FfTU9EVUxFKQogCWRjYV91bnJlZ2lzdGVyX25vdGlmeSgmZGNhX25vdGlmaWVyKTsKICNlbmRpZgogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXhnYmVfZHJpdmVyKTsKIH0KIAotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiBkZWZpbmVkKENPTkZJR19EQ0EpIHx8IGRlZmluZWQoQ09ORklHX0RDQV9NT0RVTEUpCiBzdGF0aWMgaW50IGl4Z2JlX25vdGlmeV9kY2Eoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwKLQkJCSAgICB2b2lkICpwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnApCiB7CiAJaW50IHJldF92YWw7CiAKIAlyZXRfdmFsID0gZHJpdmVyX2Zvcl9lYWNoX2RldmljZSgmaXhnYmVfZHJpdmVyLmRyaXZlciwgTlVMTCwgJmV2ZW50LAotCQkJCQkgX19peGdiZV9ub3RpZnlfZGNhKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l4Z2JlX25vdGlmeV9kY2EpOwogCiAJcmV0dXJuIHJldF92YWwgPyBOT1RJRllfQkFEIDogTk9USUZZX0RPTkU7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0RDQSAqLworI2VuZGlmIC8qIENPTkZJR19EQ0Egb3IgQ09ORklHX0RDQV9NT0RVTEUgKi8KIAogbW9kdWxlX2V4aXQoaXhnYmVfZXhpdF9tb2R1bGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9waHkuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCmluZGV4IDgwMDI5MzEuLjc2NDAzNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCAxMCBHaWdhYml0IFBDSSBFeHByZXNzIExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjAsNyArMjAsNiBAQAogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogCiAgIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgogICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogCkBAIC0zMywzMiArMzIsMzYgQEAKICNpbmNsdWRlICJpeGdiZV9jb21tb24uaCIKICNpbmNsdWRlICJpeGdiZV9waHkuaCIKIAorc3RhdGljIGJvb2wgaXhnYmVfdmFsaWRhdGVfcGh5X2FkZHIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHBoeV9hZGRyKTsKIHN0YXRpYyBlbnVtIGl4Z2JlX3BoeV90eXBlIGl4Z2JlX2dldF9waHlfdHlwZV9mcm9tX2lkKHUzMiBwaHlfaWQpOwogc3RhdGljIHMzMiBpeGdiZV9nZXRfcGh5X2lkKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotc3RhdGljIGJvb2wgaXhnYmVfdmFsaWRhdGVfcGh5X2FkZHIoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHBoeV9hZGRyKTsKLXN0YXRpYyBzMzIgaXhnYmVfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCi0JCQkgICAgICAgdTMyIGRldmljZV90eXBlLCB1MTYgcGh5X2RhdGEpOwogCiAvKioKLSAqICBpeGdiZV9pZGVudGlmeV9waHkgLSBHZXQgcGh5c2ljYWwgbGF5ZXIgbW9kdWxlCisgKiAgaXhnYmVfaWRlbnRpZnlfcGh5X2dlbmVyaWMgLSBHZXQgcGh5c2ljYWwgbGF5ZXIgbW9kdWxlCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKICAqICBEZXRlcm1pbmVzIHRoZSBwaHlzaWNhbCBsYXllciBtb2R1bGUgZm91bmQgb24gdGhlIGN1cnJlbnQgYWRhcHRlci4KICAqKi8KLXMzMiBpeGdiZV9pZGVudGlmeV9waHkoc3RydWN0IGl4Z2JlX2h3ICpodykKK3MzMiBpeGdiZV9pZGVudGlmeV9waHlfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXMzMiBzdGF0dXMgPSBJWEdCRV9FUlJfUEhZX0FERFJfSU5WQUxJRDsKIAl1MzIgcGh5X2FkZHI7CiAKLQlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBJWEdCRV9NQVhfUEhZX0FERFI7IHBoeV9hZGRyKyspIHsKLQkJaWYgKGl4Z2JlX3ZhbGlkYXRlX3BoeV9hZGRyKGh3LCBwaHlfYWRkcikpIHsKLQkJCWh3LT5waHkuYWRkciA9IHBoeV9hZGRyOwotCQkJaXhnYmVfZ2V0X3BoeV9pZChodyk7Ci0JCQlody0+cGh5LnR5cGUgPSBpeGdiZV9nZXRfcGh5X3R5cGVfZnJvbV9pZChody0+cGh5LmlkKTsKLQkJCXN0YXR1cyA9IDA7Ci0JCQlicmVhazsKKwlpZiAoaHctPnBoeS50eXBlID09IGl4Z2JlX3BoeV91bmtub3duKSB7CisJCWZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IElYR0JFX01BWF9QSFlfQUREUjsgcGh5X2FkZHIrKykgeworCQkJaWYgKGl4Z2JlX3ZhbGlkYXRlX3BoeV9hZGRyKGh3LCBwaHlfYWRkcikpIHsKKwkJCQlody0+cGh5LmFkZHIgPSBwaHlfYWRkcjsKKwkJCQlpeGdiZV9nZXRfcGh5X2lkKGh3KTsKKwkJCQlody0+cGh5LnR5cGUgPQorCQkJCSAgICAgICAgaXhnYmVfZ2V0X3BoeV90eXBlX2Zyb21faWQoaHctPnBoeS5pZCk7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQorCX0gZWxzZSB7CisJCXN0YXR1cyA9IDA7CiAJfQorCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNzMsMTAgKzc2LDggQEAKIAlib29sIHZhbGlkID0gZmFsc2U7CiAKIAlody0+cGh5LmFkZHIgPSBwaHlfYWRkcjsKLQlpeGdiZV9yZWFkX3BoeV9yZWcoaHcsCi0JCQkgICBJWEdCRV9NRElPX1BIWV9JRF9ISUdILAotCQkJICAgSVhHQkVfTURJT19QTUFfUE1EX0RFVl9UWVBFLAotCQkJICAgJnBoeV9pZCk7CisJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIElYR0JFX01ESU9fUEhZX0lEX0hJR0gsCisJICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTURJT19QTUFfUE1EX0RFVl9UWVBFLCAmcGh5X2lkKTsKIAogCWlmIChwaHlfaWQgIT0gMHhGRkZGICYmIHBoeV9pZCAhPSAweDApCiAJCXZhbGlkID0gdHJ1ZTsKQEAgLTk1LDIxICs5NiwxOCBAQAogCXUxNiBwaHlfaWRfaGlnaCA9IDA7CiAJdTE2IHBoeV9pZF9sb3cgPSAwOwogCi0Jc3RhdHVzID0gaXhnYmVfcmVhZF9waHlfcmVnKGh3LAotCQkJCSAgIElYR0JFX01ESU9fUEhZX0lEX0hJR0gsCi0JCQkJICAgSVhHQkVfTURJT19QTUFfUE1EX0RFVl9UWVBFLAotCQkJCSAgICZwaHlfaWRfaGlnaCk7CisJc3RhdHVzID0gaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIElYR0JFX01ESU9fUEhZX0lEX0hJR0gsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTURJT19QTUFfUE1EX0RFVl9UWVBFLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfaWRfaGlnaCk7CiAKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJaHctPnBoeS5pZCA9ICh1MzIpKHBoeV9pZF9oaWdoIDw8IDE2KTsKLQkJc3RhdHVzID0gaXhnYmVfcmVhZF9waHlfcmVnKGh3LAotCQkJCQkgICBJWEdCRV9NRElPX1BIWV9JRF9MT1csCi0JCQkJCSAgIElYR0JFX01ESU9fUE1BX1BNRF9ERVZfVFlQRSwKLQkJCQkJICAgJnBoeV9pZF9sb3cpOworCQlzdGF0dXMgPSBody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfTURJT19QSFlfSURfTE9XLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9NRElPX1BNQV9QTURfREVWX1RZUEUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfaWRfbG93KTsKIAkJaHctPnBoeS5pZCB8PSAodTMyKShwaHlfaWRfbG93ICYgSVhHQkVfUEhZX1JFVklTSU9OX01BU0spOwogCQlody0+cGh5LnJldmlzaW9uID0gKHUzMikocGh5X2lkX2xvdyAmIH5JWEdCRV9QSFlfUkVWSVNJT05fTUFTSyk7CiAJfQotCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTIzLDkgKzEyMSw2IEBACiAJZW51bSBpeGdiZV9waHlfdHlwZSBwaHlfdHlwZTsKIAogCXN3aXRjaCAocGh5X2lkKSB7Ci0JY2FzZSBUTjEwMTBfUEhZX0lEOgotCQlwaHlfdHlwZSA9IGl4Z2JlX3BoeV90bjsKLQkJYnJlYWs7CiAJY2FzZSBRVDIwMjJfUEhZX0lEOgogCQlwaHlfdHlwZSA9IGl4Z2JlX3BoeV9xdDsKIAkJYnJlYWs7CkBAIC0xMzgsMzIgKzEzMywzMSBAQAogfQogCiAvKioKLSAqICBpeGdiZV9yZXNldF9waHkgLSBQZXJmb3JtcyBhIFBIWSByZXNldAorICogIGl4Z2JlX3Jlc2V0X3BoeV9nZW5lcmljIC0gUGVyZm9ybXMgYSBQSFkgcmVzZXQKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiovCi1zMzIgaXhnYmVfcmVzZXRfcGh5KHN0cnVjdCBpeGdiZV9odyAqaHcpCitzMzIgaXhnYmVfcmVzZXRfcGh5X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodykKIHsKIAkvKgogCSAqIFBlcmZvcm0gc29mdCBQSFkgcmVzZXQgdG8gdGhlIFBIWV9YUy4KIAkgKiBUaGlzIHdpbGwgY2F1c2UgYSBzb2Z0IHJlc2V0IHRvIHRoZSBQSFkKIAkgKi8KLQlyZXR1cm4gaXhnYmVfd3JpdGVfcGh5X3JlZyhodywgSVhHQkVfTURJT19QSFlfWFNfQ09OVFJPTCwKLQkJCQkgICBJWEdCRV9NRElPX1BIWV9YU19ERVZfVFlQRSwKLQkJCQkgICBJWEdCRV9NRElPX1BIWV9YU19SRVNFVCk7CisJcmV0dXJuIGh3LT5waHkub3BzLndyaXRlX3JlZyhodywgSVhHQkVfTURJT19QSFlfWFNfQ09OVFJPTCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX01ESU9fUEhZX1hTX0RFVl9UWVBFLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTURJT19QSFlfWFNfUkVTRVQpOwogfQogCiAvKioKLSAqICBpeGdiZV9yZWFkX3BoeV9yZWcgLSBSZWFkcyBhIHZhbHVlIGZyb20gYSBzcGVjaWZpZWQgUEhZIHJlZ2lzdGVyCisgKiAgaXhnYmVfcmVhZF9waHlfcmVnX2dlbmVyaWMgLSBSZWFkcyBhIHZhbHVlIGZyb20gYSBzcGVjaWZpZWQgUEhZIHJlZ2lzdGVyCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogIEByZWdfYWRkcjogMzIgYml0IGFkZHJlc3Mgb2YgUEhZIHJlZ2lzdGVyIHRvIHJlYWQKICAqICBAcGh5X2RhdGE6IFBvaW50ZXIgdG8gcmVhZCBkYXRhIGZyb20gUEhZIHJlZ2lzdGVyCiAgKiovCi1zMzIgaXhnYmVfcmVhZF9waHlfcmVnKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKLQkJICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2ICpwaHlfZGF0YSkKK3MzMiBpeGdiZV9yZWFkX3BoeV9yZWdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGRldmljZV90eXBlLCB1MTYgKnBoeV9kYXRhKQogewogCXUzMiBjb21tYW5kOwogCXUzMiBpOwotCXUzMiB0aW1lb3V0ID0gMTA7CiAJdTMyIGRhdGE7CiAJczMyIHN0YXR1cyA9IDA7CiAJdTE2IGdzc3I7CkBAIC0xNzksOSArMTczLDkgQEAKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJLyogU2V0dXAgYW5kIHdyaXRlIHRoZSBhZGRyZXNzIGN5Y2xlIGNvbW1hbmQgKi8KIAkJY29tbWFuZCA9ICgocmVnX2FkZHIgPDwgSVhHQkVfTVNDQV9OUF9BRERSX1NISUZUKSAgfAotCQkJICAgKGRldmljZV90eXBlIDw8IElYR0JFX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKLQkJCSAgIChody0+cGh5LmFkZHIgPDwgSVhHQkVfTVNDQV9QSFlfQUREUl9TSElGVCkgfAotCQkJICAgKElYR0JFX01TQ0FfQUREUl9DWUNMRSB8IElYR0JFX01TQ0FfTURJX0NPTU1BTkQpKTsKKwkJICAgICAgICAgICAoZGV2aWNlX3R5cGUgPDwgSVhHQkVfTVNDQV9ERVZfVFlQRV9TSElGVCkgfAorCQkgICAgICAgICAgIChody0+cGh5LmFkZHIgPDwgSVhHQkVfTVNDQV9QSFlfQUREUl9TSElGVCkgfAorCQkgICAgICAgICAgIChJWEdCRV9NU0NBX0FERFJfQ1lDTEUgfCBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSk7CiAKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NU0NBLCBjb21tYW5kKTsKIApAQCAtMTkwLDcgKzE4NCw3IEBACiAJCSAqIFRoZSBNREkgQ29tbWFuZCBiaXQgd2lsbCBjbGVhciB3aGVuIHRoZSBvcGVyYXRpb24gaXMKIAkJICogY29tcGxldGUKIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IElYR0JFX01ESU9fQ09NTUFORF9USU1FT1VUOyBpKyspIHsKIAkJCXVkZWxheSgxMCk7CiAKIAkJCWNvbW1hbmQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTVNDQSk7CkBAIC0yMTAsOSArMjA0LDkgQEAKIAkJCSAqIGNvbW1hbmQKIAkJCSAqLwogCQkJY29tbWFuZCA9ICgocmVnX2FkZHIgPDwgSVhHQkVfTVNDQV9OUF9BRERSX1NISUZUKSAgfAotCQkJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCRV9NU0NBX0RFVl9UWVBFX1NISUZUKSB8Ci0JCQkJICAgKGh3LT5waHkuYWRkciA8PCBJWEdCRV9NU0NBX1BIWV9BRERSX1NISUZUKSB8Ci0JCQkJICAgKElYR0JFX01TQ0FfUkVBRCB8IElYR0JFX01TQ0FfTURJX0NPTU1BTkQpKTsKKwkJCSAgICAgICAgICAgKGRldmljZV90eXBlIDw8IElYR0JFX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJCSAgICAgICAgICAgKGh3LT5waHkuYWRkciA8PCBJWEdCRV9NU0NBX1BIWV9BRERSX1NISUZUKSB8CisJCQkgICAgICAgICAgIChJWEdCRV9NU0NBX1JFQUQgfCBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSk7CiAKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVNDQSwgY29tbWFuZCk7CiAKQEAgLTIyMSw3ICsyMTUsNyBAQAogCQkJICogY29tcGxldGVkLiBUaGUgTURJIENvbW1hbmQgYml0IHdpbGwgY2xlYXIgd2hlbiB0aGUKIAkJCSAqIG9wZXJhdGlvbiBpcyBjb21wbGV0ZQogCQkJICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfTURJT19DT01NQU5EX1RJTUVPVVQ7IGkrKykgewogCQkJCXVkZWxheSgxMCk7CiAKIAkJCQljb21tYW5kID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX01TQ0EpOwpAQCAtMjMxLDggKzIyNSw3IEBACiAJCQl9CiAKIAkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpICE9IDApIHsKLQkJCQlod19kYmcoaHcsCi0JCQkJICAgICAgICJQSFkgcmVhZCBjb21tYW5kIGRpZG4ndCBjb21wbGV0ZVxuIik7CisJCQkJaHdfZGJnKGh3LCAiUEhZIHJlYWQgY29tbWFuZCBkaWRuJ3QgY29tcGxldGVcbiIpOwogCQkJCXN0YXR1cyA9IElYR0JFX0VSUl9QSFk7CiAJCQl9IGVsc2UgewogCQkJCS8qCkBAIC0yNDcsMjIgKzI0MCwyMiBAQAogCiAJCWl4Z2JlX3JlbGVhc2Vfc3dmd19zeW5jKGh3LCBnc3NyKTsKIAl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKLSAqICBpeGdiZV93cml0ZV9waHlfcmVnIC0gV3JpdGVzIGEgdmFsdWUgdG8gc3BlY2lmaWVkIFBIWSByZWdpc3RlcgorICogIGl4Z2JlX3dyaXRlX3BoeV9yZWdfZ2VuZXJpYyAtIFdyaXRlcyBhIHZhbHVlIHRvIHNwZWNpZmllZCBQSFkgcmVnaXN0ZXIKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQHJlZ19hZGRyOiAzMiBiaXQgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCiAgKiAgQGRldmljZV90eXBlOiA1IGJpdCBkZXZpY2UgdHlwZQogICogIEBwaHlfZGF0YTogRGF0YSB0byB3cml0ZSB0byB0aGUgUEhZIHJlZ2lzdGVyCiAgKiovCi1zdGF0aWMgczMyIGl4Z2JlX3dyaXRlX3BoeV9yZWcoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZ19hZGRyLAotCQkJICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKQorczMyIGl4Z2JlX3dyaXRlX3BoeV9yZWdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKQogewogCXUzMiBjb21tYW5kOwogCXUzMiBpOwotCXUzMiB0aW1lb3V0ID0gMTA7CiAJczMyIHN0YXR1cyA9IDA7CiAJdTE2IGdzc3I7CiAKQEAgLTI4MCw5ICsyNzMsOSBAQAogCiAJCS8qIFNldHVwIGFuZCB3cml0ZSB0aGUgYWRkcmVzcyBjeWNsZSBjb21tYW5kICovCiAJCWNvbW1hbmQgPSAoKHJlZ19hZGRyIDw8IElYR0JFX01TQ0FfTlBfQUREUl9TSElGVCkgIHwKLQkJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCRV9NU0NBX0RFVl9UWVBFX1NISUZUKSB8Ci0JCQkgICAoaHctPnBoeS5hZGRyIDw8IElYR0JFX01TQ0FfUEhZX0FERFJfU0hJRlQpIHwKLQkJCSAgIChJWEdCRV9NU0NBX0FERFJfQ1lDTEUgfCBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSk7CisJCSAgICAgICAgICAgKGRldmljZV90eXBlIDw8IElYR0JFX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJICAgICAgICAgICAoaHctPnBoeS5hZGRyIDw8IElYR0JFX01TQ0FfUEhZX0FERFJfU0hJRlQpIHwKKwkJICAgICAgICAgICAoSVhHQkVfTVNDQV9BRERSX0NZQ0xFIHwgSVhHQkVfTVNDQV9NRElfQ09NTUFORCkpOwogCiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfTVNDQSwgY29tbWFuZCk7CiAKQEAgLTI5MSwxOSArMjg0LDE5IEBACiAJCSAqIFRoZSBNREkgQ29tbWFuZCBiaXQgd2lsbCBjbGVhciB3aGVuIHRoZSBvcGVyYXRpb24gaXMKIAkJICogY29tcGxldGUKIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IElYR0JFX01ESU9fQ09NTUFORF9USU1FT1VUOyBpKyspIHsKIAkJCXVkZWxheSgxMCk7CiAKIAkJCWNvbW1hbmQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTVNDQSk7CiAKLQkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpID09IDApIHsKLQkJCQlod19kYmcoaHcsICJQSFkgYWRkcmVzcyBjbWQgZGlkbid0IGNvbXBsZXRlXG4iKTsKKwkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpID09IDApCiAJCQkJYnJlYWs7Ci0JCQl9CiAJCX0KIAotCQlpZiAoKGNvbW1hbmQgJiBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSAhPSAwKQorCQlpZiAoKGNvbW1hbmQgJiBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSAhPSAwKSB7CisJCQlod19kYmcoaHcsICJQSFkgYWRkcmVzcyBjbWQgZGlkbid0IGNvbXBsZXRlXG4iKTsKIAkJCXN0YXR1cyA9IElYR0JFX0VSUl9QSFk7CisJCX0KIAogCQlpZiAoc3RhdHVzID09IDApIHsKIAkJCS8qCkBAIC0zMTEsOSArMzA0LDkgQEAKIAkJCSAqIGNvbW1hbmQKIAkJCSAqLwogCQkJY29tbWFuZCA9ICgocmVnX2FkZHIgPDwgSVhHQkVfTVNDQV9OUF9BRERSX1NISUZUKSAgfAotCQkJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCRV9NU0NBX0RFVl9UWVBFX1NISUZUKSB8Ci0JCQkJICAgKGh3LT5waHkuYWRkciA8PCBJWEdCRV9NU0NBX1BIWV9BRERSX1NISUZUKSB8Ci0JCQkJICAgKElYR0JFX01TQ0FfV1JJVEUgfCBJWEdCRV9NU0NBX01ESV9DT01NQU5EKSk7CisJCQkgICAgICAgICAgIChkZXZpY2VfdHlwZSA8PCBJWEdCRV9NU0NBX0RFVl9UWVBFX1NISUZUKSB8CisJCQkgICAgICAgICAgIChody0+cGh5LmFkZHIgPDwgSVhHQkVfTVNDQV9QSFlfQUREUl9TSElGVCkgfAorCQkJICAgICAgICAgICAoSVhHQkVfTVNDQV9XUklURSB8IElYR0JFX01TQ0FfTURJX0NPTU1BTkQpKTsKIAogCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NU0NBLCBjb21tYW5kKTsKIApAQCAtMzIyLDIwICszMTUsMTkgQEAKIAkJCSAqIGNvbXBsZXRlZC4gVGhlIE1ESSBDb21tYW5kIGJpdCB3aWxsIGNsZWFyIHdoZW4gdGhlCiAJCQkgKiBvcGVyYXRpb24gaXMgY29tcGxldGUKIAkJCSAqLwotCQkJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IElYR0JFX01ESU9fQ09NTUFORF9USU1FT1VUOyBpKyspIHsKIAkJCQl1ZGVsYXkoMTApOwogCiAJCQkJY29tbWFuZCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9NU0NBKTsKIAotCQkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpID09IDApIHsKLQkJCQkJaHdfZGJnKGh3LCAiUEhZIHdyaXRlIGNvbW1hbmQgZGlkIG5vdCAiCi0JCQkJCQkgICJjb21wbGV0ZS5cbiIpOworCQkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpID09IDApCiAJCQkJCWJyZWFrOwotCQkJCX0KIAkJCX0KIAotCQkJaWYgKChjb21tYW5kICYgSVhHQkVfTVNDQV9NRElfQ09NTUFORCkgIT0gMCkKKwkJCWlmICgoY29tbWFuZCAmIElYR0JFX01TQ0FfTURJX0NPTU1BTkQpICE9IDApIHsKKwkJCQlod19kYmcoaHcsICJQSFkgYWRkcmVzcyBjbWQgZGlkbid0IGNvbXBsZXRlXG4iKTsKIAkJCQlzdGF0dXMgPSBJWEdCRV9FUlJfUEhZOworCQkJfQogCQl9CiAKIAkJaXhnYmVfcmVsZWFzZV9zd2Z3X3N5bmMoaHcsIGdzc3IpOwpAQCAtMzQ1LDY3ICszMzcsNTQgQEAKIH0KIAogLyoqCi0gKiAgaXhnYmVfc2V0dXBfdG54X3BoeV9saW5rIC0gU2V0IGFuZCByZXN0YXJ0IGF1dG9uZWcKKyAqICBpeGdiZV9zZXR1cF9waHlfbGlua19nZW5lcmljIC0gU2V0IGFuZCByZXN0YXJ0IGF1dG9uZWcKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKgogICogIFJlc3RhcnQgYXV0b25lZ290aWF0aW9uIGFuZCBQSFkgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uLgogICoqLwotczMyIGl4Z2JlX3NldHVwX3RueF9waHlfbGluayhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQorczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodykKIHsKIAlzMzIgc3RhdHVzID0gSVhHQkVfTk9UX0lNUExFTUVOVEVEOwogCXUzMiB0aW1lX291dDsKIAl1MzIgbWF4X3RpbWVfb3V0ID0gMTA7Ci0JdTE2IGF1dG9uZWdfc3BlZWRfc2VsZWN0aW9uX3JlZ2lzdGVyID0gMHgxMDsKLQl1MTYgYXV0b25lZ19yZXN0YXJ0X21hc2sgPSAweDAyMDA7Ci0JdTE2IGF1dG9uZWdfY29tcGxldGVfbWFzayA9IDB4MDAyMDsKLQl1MTYgYXV0b25lZ19yZWcgPSAwOworCXUxNiBhdXRvbmVnX3JlZyA9IElYR0JFX01JSV9BVVRPTkVHX1JFRzsKIAogCS8qCiAJICogU2V0IGFkdmVydGlzZW1lbnQgc2V0dGluZ3MgaW4gUEhZIGJhc2VkIG9uIGF1dG9uZWdfYWR2ZXJ0aXNlZAogCSAqIHNldHRpbmdzLiBJZiBhdXRvbmVnX2FkdmVydGlzZWQgPSAwLCB0aGVuIGFkdmVydGlzZSBkZWZhdWx0IHZhbHVlcwotCSAqIHR4biBkZXZpY2VzIGNhbm5vdCBiZSAiZm9yY2VkIiB0byBhIGF1dG9uZWcgMTBHIGFuZCBmYWlsLiAgQnV0IGNhbgorCSAqIHRueCBkZXZpY2VzIGNhbm5vdCBiZSAiZm9yY2VkIiB0byBhIGF1dG9uZWcgMTBHIGFuZCBmYWlsLiAgQnV0IGNhbgogCSAqIGZvciBhIDFHLgogCSAqLwotCWl4Z2JlX3JlYWRfcGh5X3JlZyhodywKLQkJICBhdXRvbmVnX3NwZWVkX3NlbGVjdGlvbl9yZWdpc3RlciwKLQkJICBJWEdCRV9NRElPX0FVVE9fTkVHX0RFVl9UWVBFLAotCQkgICZhdXRvbmVnX3JlZyk7CisJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIElYR0JFX01JSV9TUEVFRF9TRUxFQ1RJT05fUkVHLAorCSAgICAgICAgICAgICAgICAgICAgIElYR0JFX01ESU9fQVVUT19ORUdfREVWX1RZUEUsICZhdXRvbmVnX3JlZyk7CiAKIAlpZiAoaHctPnBoeS5hdXRvbmVnX2FkdmVydGlzZWQgPT0gSVhHQkVfTElOS19TUEVFRF8xR0JfRlVMTCkKIAkJYXV0b25lZ19yZWcgJj0gMHhFRkZGOyAvKiAwIGluIGJpdCAxMiBpcyAxRyBvcGVyYXRpb24gKi8KIAllbHNlCiAJCWF1dG9uZWdfcmVnIHw9IDB4MTAwMDsgLyogMSBpbiBiaXQgMTIgaXMgMTBHLzFHIG9wZXJhdGlvbiAqLwogCi0JaXhnYmVfd3JpdGVfcGh5X3JlZyhodywKLQkJICBhdXRvbmVnX3NwZWVkX3NlbGVjdGlvbl9yZWdpc3RlciwKLQkJICBJWEdCRV9NRElPX0FVVE9fTkVHX0RFVl9UWVBFLAotCQkgIGF1dG9uZWdfcmVnKTsKLQorCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgSVhHQkVfTUlJX1NQRUVEX1NFTEVDVElPTl9SRUcsCisJICAgICAgICAgICAgICAgICAgICAgIElYR0JFX01ESU9fQVVUT19ORUdfREVWX1RZUEUsIGF1dG9uZWdfcmVnKTsKIAogCS8qIFJlc3RhcnQgUEhZIGF1dG9uZWdvdGlhdGlvbiBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCWl4Z2JlX3JlYWRfcGh5X3JlZyhodywKLQkJICBJWEdCRV9NRElPX0FVVE9fTkVHX0NPTlRST0wsCi0JCSAgSVhHQkVfTURJT19BVVRPX05FR19ERVZfVFlQRSwKLQkJICAmYXV0b25lZ19yZWcpOworCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBJWEdCRV9NRElPX0FVVE9fTkVHX0NPTlRST0wsCisJICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTURJT19BVVRPX05FR19ERVZfVFlQRSwgJmF1dG9uZWdfcmVnKTsKIAotCWF1dG9uZWdfcmVnIHw9IGF1dG9uZWdfcmVzdGFydF9tYXNrOworCWF1dG9uZWdfcmVnIHw9IElYR0JFX01JSV9SRVNUQVJUOwogCi0JaXhnYmVfd3JpdGVfcGh5X3JlZyhodywKLQkJICBJWEdCRV9NRElPX0FVVE9fTkVHX0NPTlRST0wsCi0JCSAgSVhHQkVfTURJT19BVVRPX05FR19ERVZfVFlQRSwKLQkJICBhdXRvbmVnX3JlZyk7CisJaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBJWEdCRV9NRElPX0FVVE9fTkVHX0NPTlRST0wsCisJICAgICAgICAgICAgICAgICAgICAgIElYR0JFX01ESU9fQVVUT19ORUdfREVWX1RZUEUsIGF1dG9uZWdfcmVnKTsKIAogCS8qIFdhaXQgZm9yIGF1dG9uZWdvdGlhdGlvbiB0byBmaW5pc2ggKi8KIAlmb3IgKHRpbWVfb3V0ID0gMDsgdGltZV9vdXQgPCBtYXhfdGltZV9vdXQ7IHRpbWVfb3V0KyspIHsKIAkJdWRlbGF5KDEwKTsKIAkJLyogUmVzdGFydCBQSFkgYXV0b25lZ290aWF0aW9uIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCXN0YXR1cyA9IGl4Z2JlX3JlYWRfcGh5X3JlZyhodywKLQkJCQkJICAgIElYR0JFX01ESU9fQVVUT19ORUdfU1RBVFVTLAotCQkJCQkgICAgSVhHQkVfTURJT19BVVRPX05FR19ERVZfVFlQRSwKLQkJCQkJICAgICZhdXRvbmVnX3JlZyk7CisJCXN0YXR1cyA9IGh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBJWEdCRV9NRElPX0FVVE9fTkVHX1NUQVRVUywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfTURJT19BVVRPX05FR19ERVZfVFlQRSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9uZWdfcmVnKTsKIAotCQlhdXRvbmVnX3JlZyAmPSBhdXRvbmVnX2NvbXBsZXRlX21hc2s7Ci0JCWlmIChhdXRvbmVnX3JlZyA9PSBhdXRvbmVnX2NvbXBsZXRlX21hc2spIHsKKwkJYXV0b25lZ19yZWcgJj0gSVhHQkVfTUlJX0FVVE9ORUdfQ09NUExFVEU7CisJCWlmIChhdXRvbmVnX3JlZyA9PSBJWEdCRV9NSUlfQVVUT05FR19DT01QTEVURSkgewogCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC00MTgsNjQgKzM5NywxNyBAQAogfQogCiAvKioKLSAqICBpeGdiZV9jaGVja190bnhfcGh5X2xpbmsgLSBEZXRlcm1pbmUgbGluayBhbmQgc3BlZWQgc3RhdHVzCi0gKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQotICoKLSAqICBSZWFkcyB0aGUgVlMxIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpZiBsaW5rIGlzIHVwIGFuZCB0aGUgY3VycmVudCBzcGVlZCBmb3IKLSAqICB0aGUgUEhZLgotICoqLwotczMyIGl4Z2JlX2NoZWNrX3RueF9waHlfbGluayhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnNwZWVkLAotCQkJICAgICBib29sICpsaW5rX3VwKQotewotCXMzMiBzdGF0dXMgPSAwOwotCXUzMiB0aW1lX291dDsKLQl1MzIgbWF4X3RpbWVfb3V0ID0gMTA7Ci0JdTE2IHBoeV9saW5rID0gMDsKLQl1MTYgcGh5X3NwZWVkID0gMDsKLQl1MTYgcGh5X2RhdGEgPSAwOwotCi0JLyogSW5pdGlhbGl6ZSBzcGVlZCBhbmQgbGluayB0byBkZWZhdWx0IGNhc2UgKi8KLQkqbGlua191cCA9IGZhbHNlOwotCSpzcGVlZCA9IElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMOwotCi0JLyoKLQkgKiBDaGVjayBjdXJyZW50IHNwZWVkIGFuZCBsaW5rIHN0YXR1cyBvZiB0aGUgUEhZIHJlZ2lzdGVyLgotCSAqIFRoaXMgaXMgYSB2ZW5kb3Igc3BlY2lmaWMgcmVnaXN0ZXIgYW5kIG1heSBoYXZlIHRvCi0JICogYmUgY2hhbmdlZCBmb3Igb3RoZXIgY29wcGVyIFBIWXMuCi0JICovCi0JZm9yICh0aW1lX291dCA9IDA7IHRpbWVfb3V0IDwgbWF4X3RpbWVfb3V0OyB0aW1lX291dCsrKSB7Ci0JCXVkZWxheSgxMCk7Ci0JCWlmIChwaHlfbGluayA9PSBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0xJTktfU1RBVFVTKSB7Ci0JCQkqbGlua191cCA9IHRydWU7Ci0JCQlpZiAocGh5X3NwZWVkID09Ci0JCQkgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9TUEVFRF9TVEFUVVMpCi0JCQkJKnNwZWVkID0gSVhHQkVfTElOS19TUEVFRF8xR0JfRlVMTDsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gaXhnYmVfcmVhZF9waHlfcmVnKGh3LAotCQkJCSAgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9TVEFUVVMsCi0JCQkJICAgICBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFLAotCQkJCSAgICAgJnBoeV9kYXRhKTsKLQkJCXBoeV9saW5rID0gcGh5X2RhdGEgJgotCQkJCUlYR0JFX01ESU9fVkVORE9SX1NQRUNJRklDXzFfTElOS19TVEFUVVM7Ci0JCQlwaHlfc3BlZWQgPSBwaHlfZGF0YSAmCi0JCQkJSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9TUEVFRF9TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqICBpeGdiZV9zZXR1cF90bnhfcGh5X2xpbmtfc3BlZWQgLSBTZXRzIHRoZSBhdXRvIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzCisgKiAgaXhnYmVfc2V0dXBfcGh5X2xpbmtfc3BlZWRfZ2VuZXJpYyAtIFNldHMgdGhlIGF1dG8gYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQHNwZWVkOiBuZXcgbGluayBzcGVlZAogICogIEBhdXRvbmVnOiB0cnVlIGlmIGF1dG9uZWdvdGlhdGlvbiBlbmFibGVkCiAgKiovCi1zMzIgaXhnYmVfc2V0dXBfdG54X3BoeV9saW5rX3NwZWVkKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBzcGVlZCwKLQkJCQkgICBib29sIGF1dG9uZWcsCi0JCQkJICAgYm9vbCBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGUpCitzMzIgaXhnYmVfc2V0dXBfcGh5X2xpbmtfc3BlZWRfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXhnYmVfbGlua19zcGVlZCBzcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKQogeworCiAJLyoKIAkgKiBDbGVhciBhdXRvbmVnX2FkdmVydGlzZWQgYW5kIHNldCBuZXcgdmFsdWVzIGJhc2VkIG9uIGlucHV0IGxpbmsKIAkgKiBzcGVlZC4KQEAgLTQ4NCwxMSArNDE2LDEzIEBACiAKIAlpZiAoc3BlZWQgJiBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCkKIAkJaHctPnBoeS5hdXRvbmVnX2FkdmVydGlzZWQgfD0gSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEw7CisKIAlpZiAoc3BlZWQgJiBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKQogCQlody0+cGh5LmF1dG9uZWdfYWR2ZXJ0aXNlZCB8PSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMOwogCiAJLyogU2V0dXAgbGluayBiYXNlZCBvbiB0aGUgbmV3IHNwZWVkIHNldHRpbmdzICovCi0JaXhnYmVfc2V0dXBfdG54X3BoeV9saW5rKGh3KTsKKwlody0+cGh5Lm9wcy5zZXR1cF9saW5rKGh3KTsKIAogCXJldHVybiAwOwogfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9waHkuaCBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5oCmluZGV4IGFhM2VhNzIuLjliZmUzZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCAxMCBHaWdhYml0IFBDSSBFeHByZXNzIExpbnV4IGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjAsNyArMjAsNiBAQAogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgogCiAgIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgogICBlMTAwMC1kZXZlbCBNYWlsaW5nIExpc3QgPGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KICAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwogCkBAIC0zMCwyMCArMjksNTIgQEAKICNkZWZpbmUgX0lYR0JFX1BIWV9IXwogCiAjaW5jbHVkZSAiaXhnYmVfdHlwZS5oIgorI2RlZmluZSBJWEdCRV9JMkNfRUVQUk9NX0RFVl9BRERSICAgIDB4QTAKIAotczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX2NoZWNrX3BoeV9saW5rKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqc3BlZWQsIGJvb2wgKmxpbmtfdXApOwotczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rX3NwZWVkKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBzcGVlZCwgYm9vbCBhdXRvbmVnLAotCQkJICAgICAgIGJvb2wgYXV0b25lZ193YWl0X3RvX2NvbXBsZXRlKTsKLXMzMiBpeGdiZV9pZGVudGlmeV9waHkoc3RydWN0IGl4Z2JlX2h3ICpodyk7Ci1zMzIgaXhnYmVfcmVzZXRfcGh5KHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCi0JCQkgICAgICAgdTMyIGRldmljZV90eXBlLCB1MTYgKnBoeV9kYXRhKTsKKy8qIEVFUFJPTSBieXRlIG9mZnNldHMgKi8KKyNkZWZpbmUgSVhHQkVfU0ZGX0lERU5USUZJRVIgICAgICAgICAweDAKKyNkZWZpbmUgSVhHQkVfU0ZGX0lERU5USUZJRVJfU0ZQICAgICAweDMKKyNkZWZpbmUgSVhHQkVfU0ZGX1ZFTkRPUl9PVUlfQllURTAgICAweDI1CisjZGVmaW5lIElYR0JFX1NGRl9WRU5ET1JfT1VJX0JZVEUxICAgMHgyNgorI2RlZmluZSBJWEdCRV9TRkZfVkVORE9SX09VSV9CWVRFMiAgIDB4MjcKKyNkZWZpbmUgSVhHQkVfU0ZGXzFHQkVfQ09NUF9DT0RFUyAgICAweDYKKyNkZWZpbmUgSVhHQkVfU0ZGXzEwR0JFX0NPTVBfQ09ERVMgICAweDMKKyNkZWZpbmUgSVhHQkVfU0ZGX1RSQU5TTUlTU0lPTl9NRURJQSAweDkKIAotLyogUEhZIHNwZWNpZmljICovCi1zMzIgaXhnYmVfc2V0dXBfdG54X3BoeV9saW5rKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotczMyIGl4Z2JlX2NoZWNrX3RueF9waHlfbGluayhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnNwZWVkLCBib29sICpsaW5rX3VwKTsKLXMzMiBpeGdiZV9zZXR1cF90bnhfcGh5X2xpbmtfc3BlZWQoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHNwZWVkLCBib29sIGF1dG9uZWcsCi0JCQkJICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CisvKiBCaXRtYXNrcyAqLworI2RlZmluZSBJWEdCRV9TRkZfVFdJTl9BWF9DQVBBQkxFICAgICAgICAgICAgMHg4MAorI2RlZmluZSBJWEdCRV9TRkZfMUdCQVNFU1hfQ0FQQUJMRSAgICAgICAgICAgMHgxCisjZGVmaW5lIElYR0JFX1NGRl8xMEdCQVNFU1JfQ0FQQUJMRSAgICAgICAgICAweDEwCisjZGVmaW5lIElYR0JFX1NGRl8xMEdCQVNFTFJfQ0FQQUJMRSAgICAgICAgICAweDIwCisjZGVmaW5lIElYR0JFX0kyQ19FRVBST01fUkVBRF9NQVNLICAgICAgICAgICAweDEwMAorI2RlZmluZSBJWEdCRV9JMkNfRUVQUk9NX1NUQVRVU19NQVNLICAgICAgICAgMHgzCisjZGVmaW5lIElYR0JFX0kyQ19FRVBST01fU1RBVFVTX05PX09QRVJBVElPTiAweDAKKyNkZWZpbmUgSVhHQkVfSTJDX0VFUFJPTV9TVEFUVVNfUEFTUyAgICAgICAgIDB4MQorI2RlZmluZSBJWEdCRV9JMkNfRUVQUk9NX1NUQVRVU19GQUlMICAgICAgICAgMHgyCisjZGVmaW5lIElYR0JFX0kyQ19FRVBST01fU1RBVFVTX0lOX1BST0dSRVNTICAweDMKKworLyogQml0LXNoaWZ0IG1hY3JvcyAqLworI2RlZmluZSBJWEdCRV9TRkZfVkVORE9SX09VSV9CWVRFMF9TSElGVCAgICAxMgorI2RlZmluZSBJWEdCRV9TRkZfVkVORE9SX09VSV9CWVRFMV9TSElGVCAgICA4CisjZGVmaW5lIElYR0JFX1NGRl9WRU5ET1JfT1VJX0JZVEUyX1NISUZUICAgIDQKKworLyogVmVuZG9yIE9VSXM6IGZvcm1hdCBvZiBPVUkgaXMgMHhbYnl0ZTBdW2J5dGUxXVtieXRlMl1bMDBdICovCisjZGVmaW5lIElYR0JFX1NGRl9WRU5ET1JfT1VJX1RZQ08gICAgIDB4MDA0MDc2MDAKKyNkZWZpbmUgSVhHQkVfU0ZGX1ZFTkRPUl9PVUlfRlRMICAgICAgMHgwMDkwNjUwMAorI2RlZmluZSBJWEdCRV9TRkZfVkVORE9SX09VSV9BVkFHTyAgICAweDAwMTc2QTAwCisKKworczMyIGl4Z2JlX2luaXRfcGh5X29wc19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX2lkZW50aWZ5X3BoeV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX3Jlc2V0X3BoeV9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX3JlYWRfcGh5X3JlZ19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGV2aWNlX3R5cGUsIHUxNiAqcGh5X2RhdGEpOworczMyIGl4Z2JlX3dyaXRlX3BoeV9yZWdfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkZXZpY2VfdHlwZSwgdTE2IHBoeV9kYXRhKTsKK3MzMiBpeGdiZV9zZXR1cF9waHlfbGlua19nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOworczMyIGl4Z2JlX3NldHVwX3BoeV9saW5rX3NwZWVkX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9uZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1dG9uZWdfd2FpdF90b19jb21wbGV0ZSk7CiAKICNlbmRpZiAvKiBfSVhHQkVfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV90eXBlLmggYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV90eXBlLmgKaW5kZXggYzAyODJhMi4uYzZmOGZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3R5cGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgMTAgR2lnYWJpdCBQQ0kgRXhwcmVzcyBMaW51eCBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA3IEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDggSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTIwLDcgKzIwLDYgQEAKICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KIAogICBDb250YWN0IEluZm9ybWF0aW9uOgotICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KICAgZTEwMDAtZGV2ZWwgTWFpbGluZyBMaXN0IDxlMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CiAgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKIApAQCAtMzcsOSArMzYsOSBAQAogLyogRGV2aWNlIElEcyAqLwogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OThBRl9EVUFMX1BPUlQgICAweDEwQzYKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk4QUZfU0lOR0xFX1BPUlQgMHgxMEM3Ci0jZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OEFUX0RVQUxfUE9SVCAgIDB4MTBDOAogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OThFQl9DWDQgICAgICAgICAweDEwREQKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk4X0NYNF9EVUFMX1BPUlQgMHgxMEVDCisjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OEVCX1hGX0xSICAgICAgIDB4MTBGNAogCiAvKiBHZW5lcmFsIFJlZ2lzdGVycyAqLwogI2RlZmluZSBJWEdCRV9DVFJMICAgICAgMHgwMDAwMApAQCAtNzAsMTEgKzY5LDExIEBACiAjZGVmaW5lIElYR0JFX0VJTUMgICAgICAweDAwODg4CiAjZGVmaW5lIElYR0JFX0VJQUMgICAgICAweDAwODEwCiAjZGVmaW5lIElYR0JFX0VJQU0gICAgICAweDAwODkwCi0jZGVmaW5lIElYR0JFX0VJVFIoX2kpICgweDAwODIwICsgKChfaSkgKiA0KSkgLyogMHg4MjAtMHg4NmMgKi8KLSNkZWZpbmUgSVhHQkVfSVZBUihfaSkgKDB4MDA5MDAgKyAoKF9pKSAqIDQpKSAvKiAyNCBhdCAweDkwMC0weDk2MCAqLworI2RlZmluZSBJWEdCRV9FSVRSKF9pKSAgKCgoX2kpIDw9IDIzKSA/ICgweDAwODIwICsgKChfaSkgKiA0KSkgOiAoMHgwMTIzMDAgKyAoKF9pKSAqIDQpKSkKKyNkZWZpbmUgSVhHQkVfSVZBUihfaSkgICgweDAwOTAwICsgKChfaSkgKiA0KSkgLyogMjQgYXQgMHg5MDAtMHg5NjAgKi8KICNkZWZpbmUgSVhHQkVfTVNJWFQgICAgIDB4MDAwMDAgLyogTVNJLVggVGFibGUuIDB4MDAwMCAtIDB4MDFDICovCiAjZGVmaW5lIElYR0JFX01TSVhQQkEgICAweDAyMDAwIC8qIE1TSS1YIFBlbmRpbmcgYml0IGFycmF5ICovCi0jZGVmaW5lIElYR0JFX1BCQUNMICAgICAweDExMDY4CisjZGVmaW5lIElYR0JFX1BCQUNMKF9pKSAoKChfaSkgPT0gMCkgPyAoMHgxMTA2OCkgOiAoMHgxMTBDMCArICgoX2kpICogNCkpKQogI2RlZmluZSBJWEdCRV9HUElFICAgICAgMHgwMDg5OAogCiAvKiBGbG93IENvbnRyb2wgUmVnaXN0ZXJzICovCkBAIC04NiwyMCArODUsMzMgQEAKICNkZWZpbmUgSVhHQkVfVEZDUyAgICAgIDB4MENFMDAKIAogLyogUmVjZWl2ZSBETUEgUmVnaXN0ZXJzICovCi0jZGVmaW5lIElYR0JFX1JEQkFMKF9pKSAoMHgwMTAwMCArICgoX2kpICogMHg0MCkpIC8qIDY0IG9mIGVhY2ggKDAtNjMpKi8KLSNkZWZpbmUgSVhHQkVfUkRCQUgoX2kpICgweDAxMDA0ICsgKChfaSkgKiAweDQwKSkKLSNkZWZpbmUgSVhHQkVfUkRMRU4oX2kpICgweDAxMDA4ICsgKChfaSkgKiAweDQwKSkKLSNkZWZpbmUgSVhHQkVfUkRIKF9pKSAgICgweDAxMDEwICsgKChfaSkgKiAweDQwKSkKLSNkZWZpbmUgSVhHQkVfUkRUKF9pKSAgICgweDAxMDE4ICsgKChfaSkgKiAweDQwKSkKLSNkZWZpbmUgSVhHQkVfUlhEQ1RMKF9pKSAoMHgwMTAyOCArICgoX2kpICogMHg0MCkpCi0jZGVmaW5lIElYR0JFX1JTQ0NUTChfaSkgKDB4MDEwMkMgKyAoKF9pKSAqIDB4NDApKQotI2RlZmluZSBJWEdCRV9TUlJDVEwoX2kpICgweDAyMTAwICsgKChfaSkgKiA0KSkKLQkJCQkJICAgICAvKiBhcnJheSBvZiAxNiAoMHgwMjEwMC0weDAyMTNDKSAqLwotI2RlZmluZSBJWEdCRV9EQ0FfUlhDVFJMKF9pKSAgICAoMHgwMjIwMCArICgoX2kpICogNCkpCi0JCQkJCSAgICAgLyogYXJyYXkgb2YgMTYgKDB4MDIyMDAtMHgwMjIzQykgKi8KLSNkZWZpbmUgSVhHQkVfUkRSWENUTCAgICAweDAyRjAwCisjZGVmaW5lIElYR0JFX1JEQkFMKF9pKSAoKChfaSkgPCA2NCkgPyAoMHgwMTAwMCArICgoX2kpICogMHg0MCkpIDogKDB4MEQwMDAgKyAoKF9pIC0gNjQpICogMHg0MCkpKQorI2RlZmluZSBJWEdCRV9SREJBSChfaSkgKCgoX2kpIDwgNjQpID8gKDB4MDEwMDQgKyAoKF9pKSAqIDB4NDApKSA6ICgweDBEMDA0ICsgKChfaSAtIDY0KSAqIDB4NDApKSkKKyNkZWZpbmUgSVhHQkVfUkRMRU4oX2kpICgoKF9pKSA8IDY0KSA/ICgweDAxMDA4ICsgKChfaSkgKiAweDQwKSkgOiAoMHgwRDAwOCArICgoX2kgLSA2NCkgKiAweDQwKSkpCisjZGVmaW5lIElYR0JFX1JESChfaSkgICAoKChfaSkgPCA2NCkgPyAoMHgwMTAxMCArICgoX2kpICogMHg0MCkpIDogKDB4MEQwMTAgKyAoKF9pIC0gNjQpICogMHg0MCkpKQorI2RlZmluZSBJWEdCRV9SRFQoX2kpICAgKCgoX2kpIDwgNjQpID8gKDB4MDEwMTggKyAoKF9pKSAqIDB4NDApKSA6ICgweDBEMDE4ICsgKChfaSAtIDY0KSAqIDB4NDApKSkKKyNkZWZpbmUgSVhHQkVfUlhEQ1RMKF9pKSAoKChfaSkgPCA2NCkgPyAoMHgwMTAyOCArICgoX2kpICogMHg0MCkpIDogKDB4MEQwMjggKyAoKF9pIC0gNjQpICogMHg0MCkpKQorLyoKKyAqIFNwbGl0IGFuZCBSZXBsaWNhdGlvbiBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXJzCisgKiAwMC0xNSA6IDB4MDIxMDAgKyBuKjQKKyAqIDE2LTY0IDogMHgwMTAxNCArIG4qMHg0MAorICogNjQtMTI3OiAweDBEMDE0ICsgKG4tNjQpKjB4NDAKKyAqLworI2RlZmluZSBJWEdCRV9TUlJDVEwoX2kpICgoKF9pKSA8PSAxNSkgPyAoMHgwMjEwMCArICgoX2kpICogNCkpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfaSkgPCA2NCkgPyAoMHgwMTAxNCArICgoX2kpICogMHg0MCkpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRDAxNCArICgoX2kgLSA2NCkgKiAweDQwKSkpKQorLyoKKyAqIFJ4IERDQSBDb250cm9sIFJlZ2lzdGVyOgorICogMDAtMTUgOiAweDAyMjAwICsgbio0CisgKiAxNi02NCA6IDB4MDEwMEMgKyBuKjB4NDAKKyAqIDY0LTEyNzogMHgwRDAwQyArIChuLTY0KSoweDQwCisgKi8KKyNkZWZpbmUgSVhHQkVfRENBX1JYQ1RSTChfaSkgICAgKCgoX2kpIDw9IDE1KSA/ICgweDAyMjAwICsgKChfaSkgKiA0KSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfaSkgPCA2NCkgPyAoMHgwMTAwQyArICgoX2kpICogMHg0MCkpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEQwMEMgKyAoKF9pIC0gNjQpICogMHg0MCkpKSkKKyNkZWZpbmUgSVhHQkVfUkRSWENUTCAgICAgICAgICAgMHgwMkYwMAogI2RlZmluZSBJWEdCRV9SWFBCU0laRShfaSkgICAgICAoMHgwM0MwMCArICgoX2kpICogNCkpCi0JCQkJCSAgICAgLyogOCBvZiB0aGVzZSAweDAzQzAwIC0gMHgwM0MxQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCBvZiB0aGVzZSAweDAzQzAwIC0gMHgwM0MxQyAqLwogI2RlZmluZSBJWEdCRV9SWENUUkwgICAgMHgwMzAwMAogI2RlZmluZSBJWEdCRV9EUk9QRU4gICAgMHgwM0QwNAogI2RlZmluZSBJWEdCRV9SWFBCU0laRV9TSElGVCAxMApAQCAtMTA3LDI5ICsxMTksMzIgQEAKIC8qIFJlY2VpdmUgUmVnaXN0ZXJzICovCiAjZGVmaW5lIElYR0JFX1JYQ1NVTSAgICAweDA1MDAwCiAjZGVmaW5lIElYR0JFX1JGQ1RMICAgICAweDA1MDA4CisjZGVmaW5lIElYR0JFX0RSRUNDQ1RMICAweDAyRjA4CisjZGVmaW5lIElYR0JFX0RSRUNDQ1RMX0RJU0FCTEUgMAorLyogTXVsdGljYXN0IFRhYmxlIEFycmF5IC0gMTI4IGVudHJpZXMgKi8KICNkZWZpbmUgSVhHQkVfTVRBKF9pKSAgICgweDA1MjAwICsgKChfaSkgKiA0KSkKLQkJCQkgICAvKiBNdWx0aWNhc3QgVGFibGUgQXJyYXkgLSAxMjggZW50cmllcyAqLwotI2RlZmluZSBJWEdCRV9SQUwoX2kpICAgKDB4MDU0MDAgKyAoKF9pKSAqIDgpKSAvKiAxNiBvZiB0aGVzZSAoMC0xNSkgKi8KLSNkZWZpbmUgSVhHQkVfUkFIKF9pKSAgICgweDA1NDA0ICsgKChfaSkgKiA4KSkgLyogMTYgb2YgdGhlc2UgKDAtMTUpICovCi0jZGVmaW5lIElYR0JFX1BTUlRZUEUgICAweDA1NDgwCi0JCQkJICAgLyogMHg1NDgwLTB4NTRCQyBQYWNrZXQgc3BsaXQgcmVjZWl2ZSB0eXBlICovCisjZGVmaW5lIElYR0JFX1JBTChfaSkgICAoKChfaSkgPD0gMTUpID8gKDB4MDU0MDAgKyAoKF9pKSAqIDgpKSA6ICgweDBBMjAwICsgKChfaSkgKiA4KSkpCisjZGVmaW5lIElYR0JFX1JBSChfaSkgICAoKChfaSkgPD0gMTUpID8gKDB4MDU0MDQgKyAoKF9pKSAqIDgpKSA6ICgweDBBMjA0ICsgKChfaSkgKiA4KSkpCisvKiBQYWNrZXQgc3BsaXQgcmVjZWl2ZSB0eXBlICovCisjZGVmaW5lIElYR0JFX1BTUlRZUEUoX2kpICAgICgoKF9pKSA8PSAxNSkgPyAoMHgwNTQ4MCArICgoX2kpICogNCkpIDogKDB4MEVBMDAgKyAoKF9pKSAqIDQpKSkKKy8qIGFycmF5IG9mIDQwOTYgMS1iaXQgdmxhbiBmaWx0ZXJzICovCiAjZGVmaW5lIElYR0JFX1ZGVEEoX2kpICAoMHgwQTAwMCArICgoX2kpICogNCkpCi0JCQkJCSAvKiBhcnJheSBvZiA0MDk2IDEtYml0IHZsYW4gZmlsdGVycyAqLworLyphcnJheSBvZiA0MDk2IDQtYml0IHZsYW4gdm1kcSBpbmRpY2VzICovCiAjZGVmaW5lIElYR0JFX1ZGVEFWSU5EKF9qLCBfaSkgICgweDBBMjAwICsgKChfaikgKiAweDIwMCkgKyAoKF9pKSAqIDQpKQotCQkJCSAgICAgLyphcnJheSBvZiA0MDk2IDQtYml0IHZsYW4gdm1kcSBpbmRpY2llcyAqLwogI2RlZmluZSBJWEdCRV9GQ1RSTCAgICAgMHgwNTA4MAogI2RlZmluZSBJWEdCRV9WTE5DVFJMICAgMHgwNTA4OAogI2RlZmluZSBJWEdCRV9NQ1NUQ1RSTCAgMHgwNTA5MAogI2RlZmluZSBJWEdCRV9NUlFDICAgICAgMHgwNTgxOAotI2RlZmluZSBJWEdCRV9WTURfQ1RMICAgMHgwNTgxQwogI2RlZmluZSBJWEdCRV9JTUlSKF9pKSAgKDB4MDVBODAgKyAoKF9pKSAqIDQpKSAgLyogOCBvZiB0aGVzZSAoMC03KSAqLwogI2RlZmluZSBJWEdCRV9JTUlSRVhUKF9pKSAgICAgICAoMHgwNUFBMCArICgoX2kpICogNCkpICAvKiA4IG9mIHRoZXNlICgwLTcpICovCiAjZGVmaW5lIElYR0JFX0lNSVJWUCAgICAweDA1QUMwCisjZGVmaW5lIElYR0JFX1ZNRF9DVEwgICAweDA1ODFDCiAjZGVmaW5lIElYR0JFX1JFVEEoX2kpICAoMHgwNUMwMCArICgoX2kpICogNCkpICAvKiAzMiBvZiB0aGVzZSAoMC0zMSkgKi8KICNkZWZpbmUgSVhHQkVfUlNTUksoX2kpICgweDA1QzgwICsgKChfaSkgKiA0KSkgIC8qIDEwIG9mIHRoZXNlICgwLTkpICovCiAKKwogLyogVHJhbnNtaXQgRE1BIHJlZ2lzdGVycyAqLwotI2RlZmluZSBJWEdCRV9UREJBTChfaSkgKDB4MDYwMDAgKyAoKF9pKSAqIDB4NDApKS8qIDMyIG9mIHRoZXNlICgwLTMxKSovCisjZGVmaW5lIElYR0JFX1REQkFMKF9pKSAoMHgwNjAwMCArICgoX2kpICogMHg0MCkpIC8qIDMyIG9mIHRoZXNlICgwLTMxKSovCiAjZGVmaW5lIElYR0JFX1REQkFIKF9pKSAoMHgwNjAwNCArICgoX2kpICogMHg0MCkpCiAjZGVmaW5lIElYR0JFX1RETEVOKF9pKSAoMHgwNjAwOCArICgoX2kpICogMHg0MCkpCiAjZGVmaW5lIElYR0JFX1RESChfaSkgICAoMHgwNjAxMCArICgoX2kpICogMHg0MCkpCkBAIC0xMzgsMTEgKzE1MywxMCBAQAogI2RlZmluZSBJWEdCRV9URFdCQUwoX2kpICgweDA2MDM4ICsgKChfaSkgKiAweDQwKSkKICNkZWZpbmUgSVhHQkVfVERXQkFIKF9pKSAoMHgwNjAzQyArICgoX2kpICogMHg0MCkpCiAjZGVmaW5lIElYR0JFX0RUWENUTCAgICAweDA3RTAwCi0jZGVmaW5lIElYR0JFX0RDQV9UWENUUkwoX2kpICAgICgweDA3MjAwICsgKChfaSkgKiA0KSkKLQkJCQkJICAgICAgLyogdGhlcmUgYXJlIDE2IG9mIHRoZXNlICgwLTE1KSAqLworCisjZGVmaW5lIElYR0JFX0RDQV9UWENUUkwoX2kpICAgICgweDA3MjAwICsgKChfaSkgKiA0KSkgLyogMTYgb2YgdGhlc2UgKDAtMTUpICovCiAjZGVmaW5lIElYR0JFX1RJUEcgICAgICAweDBDQjAwCi0jZGVmaW5lIElYR0JFX1RYUEJTSVpFKF9pKSAgICAgICgweDBDQzAwICsgKChfaSkgKjB4MDQpKQotCQkJCQkJICAgICAgLyogdGhlcmUgYXJlIDggb2YgdGhlc2UgKi8KKyNkZWZpbmUgSVhHQkVfVFhQQlNJWkUoX2kpICAgICAgKDB4MENDMDAgKyAoKF9pKSAqIDQpKSAvKiA4IG9mIHRoZXNlICovCiAjZGVmaW5lIElYR0JFX01OR1RYTUFQICAweDBDRDEwCiAjZGVmaW5lIElYR0JFX1RJUEdfRklCRVJfREVGQVVMVCAzCiAjZGVmaW5lIElYR0JFX1RYUEJTSVpFX1NISUZUICAgIDEwCkBAIC0xNTQsNiArMTY4LDcgQEAKICNkZWZpbmUgSVhHQkVfSVBBViAgICAgIDB4MDU4MzgKICNkZWZpbmUgSVhHQkVfSVA0QVQgICAgIDB4MDU4NDAgLyogSVB2NCB0YWJsZSAweDU4NDAtMHg1ODU4ICovCiAjZGVmaW5lIElYR0JFX0lQNkFUICAgICAweDA1ODgwIC8qIElQdjYgdGFibGUgMHg1ODgwLTB4NTg4RiAqLworCiAjZGVmaW5lIElYR0JFX1dVUEwgICAgICAweDA1OTAwCiAjZGVmaW5lIElYR0JFX1dVUE0gICAgICAweDA1QTAwIC8qIHdha2UgdXAgcGt0IG1lbW9yeSAweDVBMDAtMHg1QTdDICovCiAjZGVmaW5lIElYR0JFX0ZIRlQgICAgICAweDA5MDAwIC8qIEZsZXggaG9zdCBmaWx0ZXIgdGFibGUgOTAwMC05M0ZDICovCkBAIC0xNzAsNiArMTg1LDggQEAKICNkZWZpbmUgSVhHQkVfVERQVDJUQ0NSKF9pKSAgICAgKDB4MENEMjAgKyAoKF9pKSAqIDQpKSAvKiA4IG9mIHRoZXNlICgwLTcpICovCiAjZGVmaW5lIElYR0JFX1REUFQyVENTUihfaSkgICAgICgweDBDRDQwICsgKChfaSkgKiA0KSkgLyogOCBvZiB0aGVzZSAoMC03KSAqLwogCisKKwogLyogU3RhdHMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIElYR0JFX0NSQ0VSUlMgICAweDA0MDAwCiAjZGVmaW5lIElYR0JFX0lMTEVSUkMgICAweDA0MDA0CkBAIC0yMjQsNyArMjQxLDcgQEAKICNkZWZpbmUgSVhHQkVfWEVDICAgICAgIDB4MDQxMjAKIAogI2RlZmluZSBJWEdCRV9SUVNNUihfaSkgKDB4MDIzMDAgKyAoKF9pKSAqIDQpKSAvKiAxNiBvZiB0aGVzZSAqLwotI2RlZmluZSBJWEdCRV9UUVNNUihfaSkgKDB4MDczMDAgKyAoKF9pKSAqIDQpKSAvKiA4IG9mIHRoZXNlICovCisjZGVmaW5lIElYR0JFX1RRU01SKF9pKSAoKChfaSkgPD0gNykgPyAoMHgwNzMwMCArICgoX2kpICogNCkpIDogKDB4MDg2MDAgKyAoKF9pKSAqIDQpKSkKIAogI2RlZmluZSBJWEdCRV9RUFJDKF9pKSAoMHgwMTAzMCArICgoX2kpICogMHg0MCkpIC8qIDE2IG9mIHRoZXNlICovCiAjZGVmaW5lIElYR0JFX1FQVEMoX2kpICgweDA2MDMwICsgKChfaSkgKiAweDQwKSkgLyogMTYgb2YgdGhlc2UgKi8KQEAgLTI3NSwyMyArMjkyLDE3IEBACiAjZGVmaW5lIElYR0JFX0RDQV9DVFJMICAweDExMDc0CiAKIC8qIERpYWdub3N0aWMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIElYR0JFX1JEU1RBVENUTCAweDAyQzIwCi0jZGVmaW5lIElYR0JFX1JEU1RBVChfaSkgKDB4MDJDMDAgKyAoKF9pKSAqIDQpKSAvKiAweDAyQzAwLTB4MDJDMUMgKi8KLSNkZWZpbmUgSVhHQkVfUkRITVBOICAgIDB4MDJGMDgKLSNkZWZpbmUgSVhHQkVfUklDX0RXMCAgIDB4MDJGMTAKLSNkZWZpbmUgSVhHQkVfUklDX0RXMSAgIDB4MDJGMTQKLSNkZWZpbmUgSVhHQkVfUklDX0RXMiAgIDB4MDJGMTgKLSNkZWZpbmUgSVhHQkVfUklDX0RXMyAgIDB4MDJGMUMKLSNkZWZpbmUgSVhHQkVfUkRQUk9CRSAgIDB4MDJGMjAKLSNkZWZpbmUgSVhHQkVfVERTVEFUQ1RMIDB4MDdDMjAKLSNkZWZpbmUgSVhHQkVfVERTVEFUKF9pKSAoMHgwN0MwMCArICgoX2kpICogNCkpIC8qIDB4MDdDMDAgLSAweDA3QzFDICovCi0jZGVmaW5lIElYR0JFX1RESE1QTiAgICAweDA3RjA4Ci0jZGVmaW5lIElYR0JFX1RJQ19EVzAgICAweDA3RjEwCi0jZGVmaW5lIElYR0JFX1RJQ19EVzEgICAweDA3RjE0Ci0jZGVmaW5lIElYR0JFX1RJQ19EVzIgICAweDA3RjE4Ci0jZGVmaW5lIElYR0JFX1RJQ19EVzMgICAweDA3RjFDCi0jZGVmaW5lIElYR0JFX1REUFJPQkUgICAweDA3RjIwCi0jZGVmaW5lIElYR0JFX1RYQlVGQ1RSTCAweDBDNjAwCisjZGVmaW5lIElYR0JFX1JEU1RBVENUTCAgIDB4MDJDMjAKKyNkZWZpbmUgSVhHQkVfUkRTVEFUKF9pKSAgKDB4MDJDMDAgKyAoKF9pKSAqIDQpKSAvKiAweDAyQzAwLTB4MDJDMUMgKi8KKyNkZWZpbmUgSVhHQkVfUkRITVBOICAgICAgMHgwMkYwOAorI2RlZmluZSBJWEdCRV9SSUNfRFcoX2kpICAoMHgwMkYxMCArICgoX2kpICogNCkpCisjZGVmaW5lIElYR0JFX1JEUFJPQkUgICAgIDB4MDJGMjAKKyNkZWZpbmUgSVhHQkVfVERTVEFUQ1RMICAgMHgwN0MyMAorI2RlZmluZSBJWEdCRV9URFNUQVQoX2kpICAoMHgwN0MwMCArICgoX2kpICogNCkpIC8qIDB4MDdDMDAgLSAweDA3QzFDICovCisjZGVmaW5lIElYR0JFX1RESE1QTiAgICAgIDB4MDdGMDgKKyNkZWZpbmUgSVhHQkVfVElDX0RXKF9pKSAgKDB4MDdGMTAgKyAoKF9pKSAqIDQpKQorI2RlZmluZSBJWEdCRV9URFBST0JFICAgICAweDA3RjIwCisjZGVmaW5lIElYR0JFX1RYQlVGQ1RSTCAgIDB4MEM2MDAKICNkZWZpbmUgSVhHQkVfVFhCVUZEQVRBMCAgMHgwQzYxMAogI2RlZmluZSBJWEdCRV9UWEJVRkRBVEExICAweDBDNjE0CiAjZGVmaW5lIElYR0JFX1RYQlVGREFUQTIgIDB4MEM2MTgKQEAgLTM1NiwxMiArMzY3LDEwIEBACiAjZGVmaW5lIElYR0JFX0FOTFAyICAgICAweDA0MkI0CiAjZGVmaW5lIElYR0JFX0FUTEFTQ1RMICAweDA0ODAwCiAKLS8qIFJTQ0NUTCBCaXQgTWFza3MgKi8KLSNkZWZpbmUgSVhHQkVfUlNDQ1RMX1JTQ0VOICAgICAgICAgIDB4MDEKLSNkZWZpbmUgSVhHQkVfUlNDQ1RMX01BWERFU0NfMSAgICAgIDB4MDAKLSNkZWZpbmUgSVhHQkVfUlNDQ1RMX01BWERFU0NfNCAgICAgIDB4MDQKLSNkZWZpbmUgSVhHQkVfUlNDQ1RMX01BWERFU0NfOCAgICAgIDB4MDgKLSNkZWZpbmUgSVhHQkVfUlNDQ1RMX01BWERFU0NfMTYgICAgIDB4MEMKKy8qIFJEUlhDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JFX1JEUlhDVExfUkRNVFNfMV8yICAgICAweDAwMDAwMDAwIC8qIFJ4IERlc2MgTWluIFRocmVzaG9sZCBTaXplICovCisjZGVmaW5lIElYR0JFX1JEUlhDVExfTVZNRU4gICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElYR0JFX1JEUlhDVExfRE1BSURPTkUgICAgICAweDAwMDAwMDA4IC8qIERNQSBpbml0IGN5Y2xlIGRvbmUgKi8KIAogLyogQ1RSTCBCaXQgTWFza3MgKi8KICNkZWZpbmUgSVhHQkVfQ1RSTF9HSU9fRElTICAgICAgMHgwMDAwMDAwNCAvKiBHbG9iYWwgSU8gTWFzdGVyIERpc2FibGUgYml0ICovCkBAIC0zOTQsNyArNDAzLDcgQEAKIAogI2RlZmluZSBJWEdCRV9EQ0FfVFhDVFJMX0NQVUlEX01BU0sgMHgwMDAwMDAxRiAvKiBUeCBDUFVJRCBNYXNrICovCiAjZGVmaW5lIElYR0JFX0RDQV9UWENUUkxfREVTQ19EQ0FfRU4gKDEgPDwgNSkgLyogRENBIFR4IERlc2MgZW5hYmxlICovCi0jZGVmaW5lIElYR0JFX0RDQV9UWENUUkxfVFhfV0JfUk9fRU4gKDEgPDwgMTEpIC8qIFRYIERlc2Mgd3JpdGViYWNrIFJPIGJpdCAqLworI2RlZmluZSBJWEdCRV9EQ0FfVFhDVFJMX1RYX1dCX1JPX0VOICgxIDw8IDExKSAvKiBUeCBEZXNjIHdyaXRlYmFjayBSTyBiaXQgKi8KICNkZWZpbmUgSVhHQkVfRENBX01BWF9RVUVVRVNfODI1OTggICAxNiAvKiBEQ0EgcmVncyBvbmx5IG9uIDE2IHF1ZXVlcyAqLwogCiAvKiBNU0NBIEJpdCBNYXNrcyAqLwpAQCAtNDE4LDEwICs0MjcsMTAgQEAKICNkZWZpbmUgSVhHQkVfTVNDQV9NRElfSU5fUFJPR19FTiAgICAweDgwMDAwMDAwIC8qIE1ESSBpbiBwcm9ncmVzcyBlbmFibGUgKi8KIAogLyogTVNSV0QgYml0IG1hc2tzICovCi0jZGVmaW5lIElYR0JFX01TUldEX1dSSVRFX0RBVEFfTUFTSyAgMHgwMDAwRkZGRgotI2RlZmluZSBJWEdCRV9NU1JXRF9XUklURV9EQVRBX1NISUZUIDAKLSNkZWZpbmUgSVhHQkVfTVNSV0RfUkVBRF9EQVRBX01BU0sgICAweEZGRkYwMDAwCi0jZGVmaW5lIElYR0JFX01TUldEX1JFQURfREFUQV9TSElGVCAgMTYKKyNkZWZpbmUgSVhHQkVfTVNSV0RfV1JJVEVfREFUQV9NQVNLICAgICAweDAwMDBGRkZGCisjZGVmaW5lIElYR0JFX01TUldEX1dSSVRFX0RBVEFfU0hJRlQgICAgMAorI2RlZmluZSBJWEdCRV9NU1JXRF9SRUFEX0RBVEFfTUFTSyAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSVhHQkVfTVNSV0RfUkVBRF9EQVRBX1NISUZUICAgICAxNgogCiAvKiBBdGxhcyByZWdpc3RlcnMgKi8KICNkZWZpbmUgSVhHQkVfQVRMQVNfUEROX0xQQksgICAgMHgyNApAQCAtNDM2LDYgKzQ0NSw3IEBACiAjZGVmaW5lIElYR0JFX0FUTEFTX1BETl9UWF8xR19RTF9BTEwgICAgMHhGMAogI2RlZmluZSBJWEdCRV9BVExBU19QRE5fVFhfQU5fUUxfQUxMICAgIDB4RjAKIAorCiAvKiBEZXZpY2UgVHlwZSBkZWZpbml0aW9ucyBmb3IgbmV3IHByb3RvY29sIE1ESU8gY29tbWFuZHMgKi8KICNkZWZpbmUgSVhHQkVfTURJT19QTUFfUE1EX0RFVl9UWVBFICAgICAgICAgICAgICAgMHgxCiAjZGVmaW5lIElYR0JFX01ESU9fUENTX0RFVl9UWVBFICAgICAgICAgICAgICAgICAgIDB4MwpAQCAtNDQzLDYgKzQ1Myw4IEBACiAjZGVmaW5lIElYR0JFX01ESU9fQVVUT19ORUdfREVWX1RZUEUgICAgICAgICAgICAgIDB4NwogI2RlZmluZSBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFICAgICAweDFFICAgLyogRGV2aWNlIDMwICovCiAKKyNkZWZpbmUgSVhHQkVfTURJT19DT01NQU5EX1RJTUVPVVQgICAgIDEwMCAvKiBQSFkgVGltZW91dCBmb3IgMSBHQiBtb2RlICovCisKICNkZWZpbmUgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9DT05UUk9MICAgICAgMHgwICAgIC8qIFZTMSBDb250cm9sIFJlZyAqLwogI2RlZmluZSBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX1NUQVRVUyAgICAgICAweDEgICAgLyogVlMxIFN0YXR1cyBSZWcgKi8KICNkZWZpbmUgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9MSU5LX1NUQVRVUyAgMHgwMDA4IC8qIDEgPSBMaW5rIFVwICovCkBAIC00NTYsMjMgKzQ2OCwzOSBAQAogI2RlZmluZSBJWEdCRV9NRElPX1BIWV9YU19SRVNFVCAgICAgICAgMHg4MDAwIC8qIFBIWV9YUyBSZXNldCAqLwogI2RlZmluZSBJWEdCRV9NRElPX1BIWV9JRF9ISUdIICAgICAgICAgMHgyIC8qIFBIWSBJRCBIaWdoIFJlZyovCiAjZGVmaW5lIElYR0JFX01ESU9fUEhZX0lEX0xPVyAgICAgICAgICAweDMgLyogUEhZIElEIExvdyBSZWcqLwotI2RlZmluZSBJWEdCRV9NRElPX1BIWV9TUEVFRF9BQklMSVRZICAgMHg0IC8qIFNwZWVkIEFiaWx0eSBSZWcgKi8KKyNkZWZpbmUgSVhHQkVfTURJT19QSFlfU1BFRURfQUJJTElUWSAgIDB4NCAvKiBTcGVlZCBBYmlsaXR5IFJlZyAqLwogI2RlZmluZSBJWEdCRV9NRElPX1BIWV9TUEVFRF8xMEcgICAgICAgMHgwMDAxIC8qIDEwRyBjYXBhYmxlICovCiAjZGVmaW5lIElYR0JFX01ESU9fUEhZX1NQRUVEXzFHICAgICAgICAweDAwMTAgLyogMUcgY2FwYWJsZSAqLwogCisjZGVmaW5lIElYR0JFX01ESU9fUE1BX1BNRF9TREFfU0NMX0FERFIgICAgIDB4QzMwQSAvKiBQSFlfWFMgU0RBL1NDTCBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBJWEdCRV9NRElPX1BNQV9QTURfU0RBX1NDTF9EQVRBICAgICAweEMzMEIgLyogUEhZX1hTIFNEQS9TQ0wgRGF0YSBSZWcgKi8KKyNkZWZpbmUgSVhHQkVfTURJT19QTUFfUE1EX1NEQV9TQ0xfU1RBVCAgICAgMHhDMzBDIC8qIFBIWV9YUyBTREEvU0NMIFN0YXR1cyBSZWcgKi8KKworLyogTUlJIGNsYXVzZSAyMi8yOCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJWEdCRV9NRElPX1BIWV9MT1dfUE9XRVJfTU9ERSAgMHgwODAwCisKKyNkZWZpbmUgSVhHQkVfTUlJX1NQRUVEX1NFTEVDVElPTl9SRUcgIDB4MTAKKyNkZWZpbmUgSVhHQkVfTUlJX1JFU1RBUlQgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIElYR0JFX01JSV9BVVRPTkVHX0NPTVBMRVRFICAgICAweDIwCisjZGVmaW5lIElYR0JFX01JSV9BVVRPTkVHX1JFRyAgICAgICAgICAweDAKKwogI2RlZmluZSBJWEdCRV9QSFlfUkVWSVNJT05fTUFTSyAgICAgICAgMHhGRkZGRkZGMAogI2RlZmluZSBJWEdCRV9NQVhfUEhZX0FERFIgICAgICAgICAgICAgMzIKIAogLyogUEhZIElEcyovCi0jZGVmaW5lIFROMTAxMF9QSFlfSUQgICAgMHgwMEExOTQxMAogI2RlZmluZSBRVDIwMjJfUEhZX0lEICAgIDB4MDA0M0E0MDAKIAorLyogUEhZIFR5cGVzICovCisjZGVmaW5lIElYR0JFX004OEUxMTQ1X0VfUEhZX0lEICAweDAxNDEwQ0QwCisKIC8qIEdlbmVyYWwgcHVycG9zZSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIElYR0JFX0dQSUVfTVNJWF9NT0RFICAgICAgMHgwMDAwMDAxMCAvKiBNU0ktWCBtb2RlICovCi0jZGVmaW5lIElYR0JFX0dQSUVfT0NEICAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBPdGhlciBDbGVhciBEaXNhYmxlICovCi0jZGVmaW5lIElYR0JFX0dQSUVfRUlNRU4gICAgICAgICAgMHgwMDAwMDA0MCAvKiBJbW1lZGlhdGUgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBJWEdCRV9HUElFX0VJQU1FICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSVhHQkVfR1BJRV9QQkFfU1VQUE9SVCAgICAweDgwMDAwMDAwCisjZGVmaW5lIElYR0JFX1NEUDBfR1BJRU4gICAgICAgICAweDAwMDAwMDAxIC8qIFNEUDAgKi8KKyNkZWZpbmUgSVhHQkVfU0RQMV9HUElFTiAgICAgICAgIDB4MDAwMDAwMDIgLyogU0RQMSAqLworI2RlZmluZSBJWEdCRV9HUElFX01TSVhfTU9ERSAgICAgMHgwMDAwMDAxMCAvKiBNU0ktWCBtb2RlICovCisjZGVmaW5lIElYR0JFX0dQSUVfT0NEICAgICAgICAgICAweDAwMDAwMDIwIC8qIE90aGVyIENsZWFyIERpc2FibGUgKi8KKyNkZWZpbmUgSVhHQkVfR1BJRV9FSU1FTiAgICAgICAgIDB4MDAwMDAwNDAgLyogSW1tZWRpYXRlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSVhHQkVfR1BJRV9FSUFNRSAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSVhHQkVfR1BJRV9QQkFfU1VQUE9SVCAgIDB4ODAwMDAwMDAKIAogLyogVHJhbnNtaXQgRmxvdyBDb250cm9sIHN0YXR1cyAqLwogI2RlZmluZSBJWEdCRV9URkNTX1RYT0ZGICAgICAgICAgMHgwMDAwMDAwMQpAQCAtNTMzLDcgKzU2MSw3IEBACiAjZGVmaW5lIElYR0JFX1BBUF9UWFBBVVNFQ05UX01BU0sgICAweDAwMDBGRkZGIC8qIFBhdXNlIGNvdW50ZXIgbWFzayAqLwogCiAvKiBSTUNTIEJpdCBNYXNrcyAqLwotI2RlZmluZSBJWEdCRV9STUNTX1JSTSAgICAgICAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgUmVjeWxjZSBNb2RlIGVuYWJsZSAqLworI2RlZmluZSBJWEdCRV9STUNTX1JSTSAgICAgICAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgUmVjeWNsZSBNb2RlIGVuYWJsZSAqLwogLyogUmVjZWl2ZSBBcmJpdHJhdGlvbiBDb250cm9sOiAwIFJvdW5kIFJvYmluLCAxIERGUCAqLwogI2RlZmluZSBJWEdCRV9STUNTX1JBQyAgICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lIElYR0JFX1JNQ1NfREZQICAgICAgICAgIElYR0JFX1JNQ1NfUkFDIC8qIERlZmljaXQgRml4ZWQgUHJpb3JpdHkgZW5hICovCkBAIC01NDEsMTIgKzU2OSwxNSBAQAogI2RlZmluZSBJWEdCRV9STUNTX1RGQ0VfUFJJT1JJVFkgMHgwMDAwMDAxMCAvKiBUeCBQcmlvcml0eSBmbG93IGNvbnRyb2wgZW5hICovCiAjZGVmaW5lIElYR0JFX1JNQ1NfQVJCRElTICAgICAgIDB4MDAwMDAwNDAgLyogQXJiaXRyYXRpb24gZGlzYWJsZSBiaXQgKi8KIAorCiAvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0bWFza3MgKi8KIAogLyogRXh0ZW5kZWQgSW50ZXJydXB0IENhdXNlIFJlYWQgKi8KICNkZWZpbmUgSVhHQkVfRUlDUl9SVFhfUVVFVUUgICAgMHgwMDAwRkZGRiAvKiBSVHggUXVldWUgSW50ZXJydXB0ICovCiAjZGVmaW5lIElYR0JFX0VJQ1JfTFNDICAgICAgICAgIDB4MDAxMDAwMDAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCi0jZGVmaW5lIElYR0JFX0VJQ1JfTU5HICAgICAgICAgIDB4MDA0MDAwMDAgLyogTWFuYWdhYmlsaXR5IEV2ZW50IEludGVycnVwdCAqLworI2RlZmluZSBJWEdCRV9FSUNSX01ORyAgICAgICAgICAweDAwNDAwMDAwIC8qIE1hbmFnZWFiaWxpdHkgRXZlbnQgSW50ZXJydXB0ICovCisjZGVmaW5lIElYR0JFX0VJQ1JfR1BJX1NEUDAgICAgIDB4MDEwMDAwMDAgLyogR2VuIFB1cnBvc2UgSW50ZXJydXB0IG9uIFNEUDAgKi8KKyNkZWZpbmUgSVhHQkVfRUlDUl9HUElfU0RQMSAgICAgMHgwMjAwMDAwMCAvKiBHZW4gUHVycG9zZSBJbnRlcnJ1cHQgb24gU0RQMSAqLwogI2RlZmluZSBJWEdCRV9FSUNSX1BCVVIgICAgICAgICAweDEwMDAwMDAwIC8qIFBhY2tldCBCdWZmZXIgSGFuZGxlciBFcnJvciAqLwogI2RlZmluZSBJWEdCRV9FSUNSX0RIRVIgICAgICAgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgSGFuZGxlciBFcnJvciAqLwogI2RlZmluZSBJWEdCRV9FSUNSX1RDUF9USU1FUiAgICAweDQwMDAwMDAwIC8qIFRDUCBUaW1lciAqLwpAQCAtNTU0LDExICs1ODUsMTIgQEAKIAogLyogRXh0ZW5kZWQgSW50ZXJydXB0IENhdXNlIFNldCAqLwogI2RlZmluZSBJWEdCRV9FSUNTX1JUWF9RVUVVRSAgICBJWEdCRV9FSUNSX1JUWF9RVUVVRSAvKiBSVHggUXVldWUgSW50ZXJydXB0ICovCi0jZGVmaW5lIElYR0JFX0VJQ1NfTFNDICAgICAgICAgIElYR0JFX0VJQ1JfTFNDIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLwotI2RlZmluZSBJWEdCRV9FSUNSX0dQSV9TRFAwICAgICAweDAxMDAwMDAwIC8qIEdlbiBQdXJwb3NlIEludGVycnVwdCBvbiBTRFAwICovCi0jZGVmaW5lIElYR0JFX0VJQ1NfTU5HICAgICAgICAgIElYR0JFX0VJQ1JfTU5HIC8qIE1ORyBFdmVudCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVhHQkVfRUlDU19QQlVSICAgICAgICAgSVhHQkVfRUlDUl9QQlVSIC8qIFBrdCBCdWYgSGFuZGxlciBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9FSUNTX0RIRVIgICAgICAgICBJWEdCRV9FSUNSX0RIRVIgLyogRGVzYyBIYW5kbGVyIEVycm9yICovCisjZGVmaW5lIElYR0JFX0VJQ1NfTFNDICAgICAgICAgIElYR0JFX0VJQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBJWEdCRV9FSUNTX01ORyAgICAgICAgICBJWEdCRV9FSUNSX01ORyAgICAgICAvKiBNTkcgRXZlbnQgSW50ZXJydXB0ICovCisjZGVmaW5lIElYR0JFX0VJQ1NfR1BJX1NEUDAgICAgIElYR0JFX0VJQ1JfR1BJX1NEUDAgIC8qIFNEUDAgR2VuIFB1cnBvc2UgSW50ICovCisjZGVmaW5lIElYR0JFX0VJQ1NfR1BJX1NEUDEgICAgIElYR0JFX0VJQ1JfR1BJX1NEUDEgIC8qIFNEUDEgR2VuIFB1cnBvc2UgSW50ICovCisjZGVmaW5lIElYR0JFX0VJQ1NfUEJVUiAgICAgICAgIElYR0JFX0VJQ1JfUEJVUiAgICAgIC8qIFBrdCBCdWYgSGFuZGxlciBFcnIgKi8KKyNkZWZpbmUgSVhHQkVfRUlDU19ESEVSICAgICAgICAgSVhHQkVfRUlDUl9ESEVSICAgICAgLyogRGVzYyBIYW5kbGVyIEVycm9yICovCiAjZGVmaW5lIElYR0JFX0VJQ1NfVENQX1RJTUVSICAgIElYR0JFX0VJQ1JfVENQX1RJTUVSIC8qIFRDUCBUaW1lciAqLwogI2RlZmluZSBJWEdCRV9FSUNTX09USEVSICAgICAgICBJWEdCRV9FSUNSX09USEVSICAgICAvKiBJTlQgQ2F1c2UgQWN0aXZlICovCiAKQEAgLTU2Niw3ICs1OTgsOSBAQAogI2RlZmluZSBJWEdCRV9FSU1TX1JUWF9RVUVVRSAgICBJWEdCRV9FSUNSX1JUWF9RVUVVRSAvKiBSVHggUXVldWUgSW50ZXJydXB0ICovCiAjZGVmaW5lIElYR0JFX0VJTVNfTFNDICAgICAgICAgIElYR0JFX0VJQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLwogI2RlZmluZSBJWEdCRV9FSU1TX01ORyAgICAgICAgICBJWEdCRV9FSUNSX01ORyAgICAgICAvKiBNTkcgRXZlbnQgSW50ZXJydXB0ICovCi0jZGVmaW5lIElYR0JFX0VJTVNfUEJVUiAgICAgICAgIElYR0JFX0VJQ1JfUEJVUiAgICAgIC8qIFBrdCBCdWYgSGFuZGxlciBFcnJvciAqLworI2RlZmluZSBJWEdCRV9FSU1TX0dQSV9TRFAwICAgICBJWEdCRV9FSUNSX0dQSV9TRFAwICAvKiBTRFAwIEdlbiBQdXJwb3NlIEludCAqLworI2RlZmluZSBJWEdCRV9FSU1TX0dQSV9TRFAxICAgICBJWEdCRV9FSUNSX0dQSV9TRFAxICAvKiBTRFAxIEdlbiBQdXJwb3NlIEludCAqLworI2RlZmluZSBJWEdCRV9FSU1TX1BCVVIgICAgICAgICBJWEdCRV9FSUNSX1BCVVIgICAgICAvKiBQa3QgQnVmIEhhbmRsZXIgRXJyICovCiAjZGVmaW5lIElYR0JFX0VJTVNfREhFUiAgICAgICAgIElYR0JFX0VJQ1JfREhFUiAgICAgIC8qIERlc2NyIEhhbmRsZXIgRXJyb3IgKi8KICNkZWZpbmUgSVhHQkVfRUlNU19UQ1BfVElNRVIgICAgSVhHQkVfRUlDUl9UQ1BfVElNRVIgLyogVENQIFRpbWVyICovCiAjZGVmaW5lIElYR0JFX0VJTVNfT1RIRVIgICAgICAgIElYR0JFX0VJQ1JfT1RIRVIgICAgIC8qIElOVCBDYXVzZSBBY3RpdmUgKi8KQEAgLTU3NSwxOCArNjA5LDIwIEBACiAjZGVmaW5lIElYR0JFX0VJTUNfUlRYX1FVRVVFICAgIElYR0JFX0VJQ1JfUlRYX1FVRVVFIC8qIFJUeCBRdWV1ZSBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVhHQkVfRUlNQ19MU0MgICAgICAgICAgSVhHQkVfRUlDUl9MU0MgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCiAjZGVmaW5lIElYR0JFX0VJTUNfTU5HICAgICAgICAgIElYR0JFX0VJQ1JfTU5HICAgICAgIC8qIE1ORyBFdmVudCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVhHQkVfRUlNQ19QQlVSICAgICAgICAgSVhHQkVfRUlDUl9QQlVSICAgICAgLyogUGt0IEJ1ZiBIYW5kbGVyIEVycm9yICovCi0jZGVmaW5lIElYR0JFX0VJTUNfREhFUiAgICAgICAgIElYR0JFX0VJQ1JfREhFUiAgICAgIC8qIERlc2MgSGFuZGxlciBFcnJvciAqLworI2RlZmluZSBJWEdCRV9FSU1DX0dQSV9TRFAwICAgICBJWEdCRV9FSUNSX0dQSV9TRFAwICAvKiBTRFAwIEdlbiBQdXJwb3NlIEludCAqLworI2RlZmluZSBJWEdCRV9FSU1DX0dQSV9TRFAxICAgICBJWEdCRV9FSUNSX0dQSV9TRFAxICAvKiBTRFAxIEdlbiBQdXJwb3NlIEludCAqLworI2RlZmluZSBJWEdCRV9FSU1DX1BCVVIgICAgICAgICBJWEdCRV9FSUNSX1BCVVIgICAgICAvKiBQa3QgQnVmIEhhbmRsZXIgRXJyICovCisjZGVmaW5lIElYR0JFX0VJTUNfREhFUiAgICAgICAgIElYR0JFX0VJQ1JfREhFUiAgICAgIC8qIERlc2MgSGFuZGxlciBFcnIgKi8KICNkZWZpbmUgSVhHQkVfRUlNQ19UQ1BfVElNRVIgICAgSVhHQkVfRUlDUl9UQ1BfVElNRVIgLyogVENQIFRpbWVyICovCiAjZGVmaW5lIElYR0JFX0VJTUNfT1RIRVIgICAgICAgIElYR0JFX0VJQ1JfT1RIRVIgICAgIC8qIElOVCBDYXVzZSBBY3RpdmUgKi8KIAotI2RlZmluZSBJWEdCRV9FSU1TX0VOQUJMRV9NQVNLIChcCi0JCQkJSVhHQkVfRUlNU19SVFhfUVVFVUUgICAgICAgfCBcCi0JCQkJSVhHQkVfRUlNU19MU0MgICAgICAgICAgICAgfCBcCi0JCQkJSVhHQkVfRUlNU19UQ1BfVElNRVIgICAgICAgfCBcCi0JCQkJSVhHQkVfRUlNU19PVEhFUikKKyNkZWZpbmUgSVhHQkVfRUlNU19FTkFCTEVfTUFTSyAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfRUlNU19SVFhfUVVFVUUgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX0VJTVNfTFNDICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9FSU1TX1RDUF9USU1FUiAgICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfRUlNU19PVEhFUikKIAotLyogSW1tZWRpYXRlIEludGVycnVwdCBSWCAoQS5LLkEuIExvdyBMYXRlbmN5IEludGVycnVwdCkgKi8KKy8qIEltbWVkaWF0ZSBJbnRlcnJ1cHQgUnggKEEuSy5BLiBMb3cgTGF0ZW5jeSBJbnRlcnJ1cHQpICovCiAjZGVmaW5lIElYR0JFX0lNSVJfUE9SVF9JTV9FTiAgICAgMHgwMDAxMDAwMCAgLyogVENQIHBvcnQgZW5hYmxlICovCiAjZGVmaW5lIElYR0JFX0lNSVJfUE9SVF9CUCAgICAgICAgMHgwMDAyMDAwMCAgLyogVENQIHBvcnQgY2hlY2sgYnlwYXNzICovCiAjZGVmaW5lIElYR0JFX0lNSVJFWFRfU0laRV9CUCAgICAgMHgwMDAwMTAwMCAgLyogUGFja2V0IHNpemUgYnlwYXNzICovCkBAIC02MjMsNiArNjU5LDcgQEAKICNkZWZpbmUgSVhHQkVfVkxOQ1RSTF9WRkUgICAgICAgMHg0MDAwMDAwMCAgLyogYml0IDMwICovCiAjZGVmaW5lIElYR0JFX1ZMTkNUUkxfVk1FICAgICAgIDB4ODAwMDAwMDAgIC8qIGJpdCAzMSAqLwogCisKICNkZWZpbmUgSVhHQkVfRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwICAvKiA4MDIuMXEgcHJvdG9jb2wgKi8KIAogLyogU1RBVFVTIEJpdCBNYXNrcyAqLwpAQCAtNjcwLDE2ICs3MDcsMTYgQEAKICNkZWZpbmUgSVhHQkVfQVVUT0NfQU5fUkVTVEFSVCAgMHgwMDAwMTAwMAogI2RlZmluZSBJWEdCRV9BVVRPQ19GTFUgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIElYR0JFX0FVVE9DX0xNU19TSElGVCAgIDEzCi0jZGVmaW5lIElYR0JFX0FVVE9DX0xNU19NQVNLICAgKDB4NyA8PCBJWEdCRV9BVVRPQ19MTVNfU0hJRlQpCi0jZGVmaW5lIElYR0JFX0FVVE9DX0xNU18xR19MSU5LX05PX0FOICAoMHgwIDw8IElYR0JFX0FVVE9DX0xNU19TSElGVCkKLSNkZWZpbmUgSVhHQkVfQVVUT0NfTE1TXzEwR19MSU5LX05PX0FOICgweDEgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQotI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfMUdfQU4gICgweDIgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQotI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOICgweDQgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQotI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOXzFHX0FOICAgKDB4NiA8PCBJWEdCRV9BVVRPQ19MTVNfU0hJRlQpCi0jZGVmaW5lIElYR0JFX0FVVE9DX0xNU19BVFRBQ0hfVFlQRSAgICAoMHg3IDw8IElYR0JFX0FVVE9DXzEwR19QTUFfUE1EX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfTUFTSyAgICAgICAgICAgICgweDcgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfMUdfTElOS19OT19BTiAgICgweDAgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfMTBHX0xJTktfTk9fQU4gICgweDEgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfMUdfQU4gICAgICAgICAgICgweDIgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOICAgICAgICAgICgweDQgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfS1g0X0FOXzFHX0FOICAgICgweDYgPDwgSVhHQkVfQVVUT0NfTE1TX1NISUZUKQorI2RlZmluZSBJWEdCRV9BVVRPQ19MTVNfQVRUQUNIX1RZUEUgICAgICgweDcgPDwgSVhHQkVfQVVUT0NfMTBHX1BNQV9QTURfU0hJRlQpCiAKLSNkZWZpbmUgSVhHQkVfQVVUT0NfMUdfUE1BX1BNRCAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSVhHQkVfQVVUT0NfMTBHX1BNQV9QTUQgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSVhHQkVfQVVUT0NfMUdfUE1BX1BNRCAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQkVfQVVUT0NfMTBHX1BNQV9QTUQgICAgICAgIDB4MDAwMDAxODAKICNkZWZpbmUgSVhHQkVfQVVUT0NfMTBHX1BNQV9QTURfU0hJRlQgNwogI2RlZmluZSBJWEdCRV9BVVRPQ18xR19QTUFfUE1EX1NISUZUIDkKICNkZWZpbmUgSVhHQkVfQVVUT0NfMTBHX1hBVUkgICAoMHgwIDw8IElYR0JFX0FVVE9DXzEwR19QTUFfUE1EX1NISUZUKQpAQCAtNzA1LDYgKzc0Miw3IEBACiAjZGVmaW5lIElYR0JFX0xJTktTX1RMX0ZBVUxUICAgIDB4MDAwMDEwMDAKICNkZWZpbmUgSVhHQkVfTElOS1NfU0lHTkFMICAgICAgMHgwMDAwMEYwMAogCisjZGVmaW5lIElYR0JFX0xJTktfVVBfVElNRSAgICAgIDkwIC8qIDkuMCBTZWNvbmRzICovCiAjZGVmaW5lIElYR0JFX0FVVE9fTkVHX1RJTUUgICAgIDQ1IC8qIDQuNSBTZWNvbmRzICovCiAKIC8qIFNXIFNlbWFwaG9yZSBSZWdpc3RlciBiaXRtYXNrcyAqLwpAQCAtNzU5LDYgKzc5NywxMSBAQAogI2RlZmluZSBJWEdCRV9QQkFOVU0wX1BUUiAgICAgICAweDE1CiAjZGVmaW5lIElYR0JFX1BCQU5VTTFfUFRSICAgICAgIDB4MTYKIAorLyogTGVnYWN5IEVFUFJPTSB3b3JkIG9mZnNldHMgKi8KKyNkZWZpbmUgSVhHQkVfSVNDU0lfQk9PVF9DQVBTICAgICAgICAgICAweDAwMzMKKyNkZWZpbmUgSVhHQkVfSVNDU0lfU0VUVVBfUE9SVF8wICAgICAgICAweDAwMzAKKyNkZWZpbmUgSVhHQkVfSVNDU0lfU0VUVVBfUE9SVF8xICAgICAgICAweDAwMzQKKwogLyogRUVQUk9NIENvbW1hbmRzIC0gU1BJICovCiAjZGVmaW5lIElYR0JFX0VFUFJPTV9NQVhfUkVUUllfU1BJICAgICAgNTAwMCAvKiBNYXggd2FpdCA1bXMgZm9yIFJEWSBzaWduYWwgKi8KICNkZWZpbmUgSVhHQkVfRUVQUk9NX1NUQVRVU19SRFlfU1BJICAgICAweDAxCkBAIC03NjYsNyArODA5LDcgQEAKICNkZWZpbmUgSVhHQkVfRUVQUk9NX1dSSVRFX09QQ09ERV9TUEkgICAweDAyICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCiAjZGVmaW5lIElYR0JFX0VFUFJPTV9BOF9PUENPREVfU1BJICAgICAgMHgwOCAgLyogb3Bjb2RlIGJpdC0zID0gYWRkciBiaXQtOCAqLwogI2RlZmluZSBJWEdCRV9FRVBST01fV1JFTl9PUENPREVfU1BJICAgIDB4MDYgIC8qIEVFUFJPTSBzZXQgV3JpdGUgRW5hIGxhdGNoICovCi0vKiBFRVBST00gcmVzZXQgV3JpdGUgRW5iYWxlIGxhdGNoICovCisvKiBFRVBST00gcmVzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCiAjZGVmaW5lIElYR0JFX0VFUFJPTV9XUkRJX09QQ09ERV9TUEkgICAgMHgwNAogI2RlZmluZSBJWEdCRV9FRVBST01fUkRTUl9PUENPREVfU1BJICAgIDB4MDUgIC8qIEVFUFJPTSByZWFkIFN0YXR1cyByZWcgKi8KICNkZWZpbmUgSVhHQkVfRUVQUk9NX1dSU1JfT1BDT0RFX1NQSSAgICAweDAxICAvKiBFRVBST00gd3JpdGUgU3RhdHVzIHJlZyAqLwpAQCAtODA1LDI2ICs4NDgsMjAgQEAKIC8qIE51bWJlciBvZiAxMDAgbWljcm9zZWNvbmRzIHdlIHdhaXQgZm9yIFBDSSBFeHByZXNzIG1hc3RlciBkaXNhYmxlICovCiAjZGVmaW5lIElYR0JFX1BDSV9NQVNURVJfRElTQUJMRV9USU1FT1VUIDgwMAogCi0vKiBQSFkgVHlwZXMgKi8KLSNkZWZpbmUgSVhHQkVfTTg4RTExNDVfRV9QSFlfSUQgIDB4MDE0MTBDRDAKLQogLyogQ2hlY2sgd2hldGhlciBhZGRyZXNzIGlzIG11bHRpY2FzdC4gIFRoaXMgaXMgbGl0dGxlLWVuZGlhbiBzcGVjaWZpYyBjaGVjay4qLwogI2RlZmluZSBJWEdCRV9JU19NVUxUSUNBU1QoQWRkcmVzcykgXAotCQkoYm9vbCkoKCh1OCAqKShBZGRyZXNzKSlbMF0gJiAoKHU4KTB4MDEpKQorICAgICAgICAgICAgICAgIChib29sKSgoKHU4ICopKEFkZHJlc3MpKVswXSAmICgodTgpMHgwMSkpCiAKIC8qIENoZWNrIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBicm9hZGNhc3QuICovCiAjZGVmaW5lIElYR0JFX0lTX0JST0FEQ0FTVChBZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgoKCh1OCAqKShBZGRyZXNzKSlbMF0gPT0gKCh1OCkweGZmKSkgJiYgXAotCQkoKCh1OCAqKShBZGRyZXNzKSlbMV0gPT0gKCh1OCkweGZmKSkpCisgICAgICAgICAgICAgICAgKCgoKHU4ICopKEFkZHJlc3MpKVswXSA9PSAoKHU4KTB4ZmYpKSAmJiBcCisgICAgICAgICAgICAgICAgKCgodTggKikoQWRkcmVzcykpWzFdID09ICgodTgpMHhmZikpKQogCiAvKiBSQUggKi8KICNkZWZpbmUgSVhHQkVfUkFIX1ZJTkRfTUFTSyAgICAgMHgwMDNDMDAwMAogI2RlZmluZSBJWEdCRV9SQUhfVklORF9TSElGVCAgICAxOAogI2RlZmluZSBJWEdCRV9SQUhfQVYgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qIEZpbHRlcnMgKi8KLSNkZWZpbmUgSVhHQkVfTUNfVEJMX1NJWkUgICAgICAgMTI4ICAvKiBNdWx0aWNhc3QgRmlsdGVyIFRhYmxlICg0MDk2IGJpdHMpICovCi0jZGVmaW5lIElYR0JFX1ZMQU5fRklMVEVSX1RCTF9TSVpFIDEyOCAgLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgSVhHQkVfQ0xFQVJfVk1EUV9BTEwgICAgMHhGRkZGRkZGRgogCiAvKiBIZWFkZXIgc3BsaXQgcmVjZWl2ZSAqLwogI2RlZmluZSBJWEdCRV9SRkNUTF9JU0NTSV9ESVMgICAgICAgMHgwMDAwMDAwMQpAQCAtODUzLDcgKzg5MCw3IEBACiAjZGVmaW5lIElYR0JFX01BWF9GUkFNRV9TWiAgICAgIDB4NDAwNDAwMDAKIAogI2RlZmluZSBJWEdCRV9URFdCQUxfSEVBRF9XQl9FTkFCTEUgICAweDEgICAgICAvKiBUeCBoZWFkIHdyaXRlLWJhY2sgZW5hYmxlICovCi0jZGVmaW5lIElYR0JFX1REV0JBTF9TRVFOVU1fV0JfRU5BQkxFIDB4MiAgICAgIC8qIFR4IHNlcS4gIyB3cml0ZS1iYWNrIGVuYWJsZSAqLworI2RlZmluZSBJWEdCRV9URFdCQUxfU0VRTlVNX1dCX0VOQUJMRSAweDIgICAgICAvKiBUeCBzZXEjIHdyaXRlLWJhY2sgZW5hYmxlICovCiAKIC8qIFJlY2VpdmUgQ29uZmlnIG1hc2tzICovCiAjZGVmaW5lIElYR0JFX1JYQ1RSTF9SWEVOICAgICAgIDB4MDAwMDAwMDEgIC8qIEVuYWJsZSBSZWNlaXZlciAqLwpAQCAtODY2LDcgKzkwMyw3IEBACiAjZGVmaW5lIElYR0JFX0ZDVFJMX0JBTSAweDAwMDAwNDAwIC8qIEJyb2FkY2FzdCBBY2NlcHQgTW9kZSAqLwogI2RlZmluZSBJWEdCRV9GQ1RSTF9QTUNGIDB4MDAwMDEwMDAgLyogUGFzcyBNQUMgQ29udHJvbCBGcmFtZXMgKi8KICNkZWZpbmUgSVhHQkVfRkNUUkxfRFBGIDB4MDAwMDIwMDAgLyogRGlzY2FyZCBQYXVzZSBGcmFtZSAqLwotLyogUmVjZWl2ZSBQcmlvcml0eSBGbG93IENvbnRyb2wgRW5iYWxlICovCisvKiBSZWNlaXZlIFByaW9yaXR5IEZsb3cgQ29udHJvbCBFbmFibGUgKi8KICNkZWZpbmUgSVhHQkVfRkNUUkxfUlBGQ0UgMHgwMDAwNDAwMAogI2RlZmluZSBJWEdCRV9GQ1RSTF9SRkNFIDB4MDAwMDgwMDAgLyogUmVjZWl2ZSBGbG93IENvbnRyb2wgRW5hICovCiAKQEAgLTg5Niw5ICs5MzMsOCBAQAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9FT1AgICAgICAweDAyICAgIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfSVhTTSAgICAgMHgwNCAgICAvKiBJZ25vcmUgY2hlY2tzdW0gKi8KICNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfVlAgICAgICAgMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1VEUENTICAgIDB4MTAgICAgLyogVURQIHhzdW0gY2FjdWxhdGVkICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX1VEUENTICAgIDB4MTAgICAgLyogVURQIHhzdW0gY2FsY3VsYXRlZCAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9MNENTICAgICAweDIwICAgIC8qIEw0IHhzdW0gY2FsY3VsYXRlZCAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9JUENTICAgICAweDQwICAgIC8qIElQIHhzdW0gY2FsY3VsYXRlZCAqLwogI2RlZmluZSBJWEdCRV9SWERfU1RBVF9QSUYgICAgICAweDgwICAgIC8qIHBhc3NlZCBpbi1leGFjdCBmaWx0ZXIgKi8KQEAgLTkxNCw3ICs5NTAsNyBAQAogI2RlZmluZSBJWEdCRV9SWERfRVJSX1VTRSAgICAgICAweDIwICAgIC8qIFVuZGVyc2l6ZSBFcnJvciAqLwogI2RlZmluZSBJWEdCRV9SWERfRVJSX1RDUEUgICAgICAweDQwICAgIC8qIFRDUC9VRFAgQ2hlY2tzdW0gRXJyb3IgKi8KICNkZWZpbmUgSVhHQkVfUlhEX0VSUl9JUEUgICAgICAgMHg4MCAgICAvKiBJUCBDaGVja3N1bSBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfSEJPICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfSEJPICAgIDB4MDA4MDAwMDAgLypIZWFkZXIgQnVmZmVyIE92ZXJmbG93ICovCiAjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfQ0UgICAgIDB4MDEwMDAwMDAgLyogQ1JDIEVycm9yICovCiAjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfTEUgICAgIDB4MDIwMDAwMDAgLyogTGVuZ3RoIEVycm9yICovCiAjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfUEUgICAgIDB4MDgwMDAwMDAgLyogUGFja2V0IEVycm9yICovCkBAIC05MjgsMTUgKzk2NCwxNyBAQAogI2RlZmluZSBJWEdCRV9SWERfQ0ZJX01BU0sgICAgICAweDEwMDAgIC8qIENGSSBpcyBiaXQgMTIgKi8KICNkZWZpbmUgSVhHQkVfUlhEX0NGSV9TSElGVCAgICAgMTIKIAorCiAvKiBTUlJDVEwgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVCAxMCAgICAgLyogc28gbWFueSBLQnMgKi8KLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0JTSVpFUEtUX01BU0sgIDB4MDAwMDAwN0YKLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0JTSVpFSERSX01BU0sgIDB4MDAwMDNGMDAKLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0xFR0FDWSAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVCAgICAgMTAgICAgIC8qIHNvIG1hbnkgS0JzICovCisjZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9NQVNLICAgICAgMHgwMDAwMDA3RgorI2RlZmluZSBJWEdCRV9TUlJDVExfQlNJWkVIRFJfTUFTSyAgICAgIDB4MDAwMDNGMDAKKyNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0xFR0FDWSAgICAweDAwMDAwMDAwCiAjZGVmaW5lIElYR0JFX1NSUkNUTF9ERVNDVFlQRV9BRFZfT05FQlVGIDB4MDIwMDAwMDAKICNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0hEUl9TUExJVCAgMHgwNDAwMDAwMAogI2RlZmluZSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfSERSX1JFUExJQ0FUSU9OX0xBUkdFX1BLVCAweDA4MDAwMDAwCiAjZGVmaW5lIElYR0JFX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVRfQUxXQVlTIDB4MEEwMDAwMDAKKyNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX01BU0sgICAgICAweDBFMDAwMDAwCiAKICNkZWZpbmUgSVhHQkVfUlhEUFNfSERSU1RBVF9IRFJTUCAgICAgICAweDAwMDA4MDAwCiAjZGVmaW5lIElYR0JFX1JYRFBTX0hEUlNUQVRfSERSTEVOX01BU0sgMHgwMDAwMDNGRgpAQCAtOTcwLDIxICsxMDA4LDIwIEBACiAjZGVmaW5lIElYR0JFX1JYREFEVl9QS1RUWVBFX1VEUCAgICAgICAgMHgwMDAwMDIwMCAvKiBVRFAgaGRyIHByZXNlbnQgKi8KICNkZWZpbmUgSVhHQkVfUlhEQURWX1BLVFRZUEVfU0NUUCAgICAgICAweDAwMDAwNDAwIC8qIFNDVFAgaGRyIHByZXNlbnQgKi8KICNkZWZpbmUgSVhHQkVfUlhEQURWX1BLVFRZUEVfTkZTICAgICAgICAweDAwMDAwODAwIC8qIE5GUyBoZHIgcHJlc2VudCAqLwotCiAvKiBNYXNrcyB0byBkZXRlcm1pbmUgaWYgcGFja2V0cyBzaG91bGQgYmUgZHJvcHBlZCBkdWUgdG8gZnJhbWUgZXJyb3JzICovCi0jZGVmaW5lIElYR0JFX1JYRF9FUlJfRlJBTUVfRVJSX01BU0sgKFwKLQkJCQkgICAgICBJWEdCRV9SWERfRVJSX0NFIHwgXAotCQkJCSAgICAgIElYR0JFX1JYRF9FUlJfTEUgfCBcCi0JCQkJICAgICAgSVhHQkVfUlhEX0VSUl9QRSB8IFwKLQkJCQkgICAgICBJWEdCRV9SWERfRVJSX09TRSB8IFwKLQkJCQkgICAgICBJWEdCRV9SWERfRVJSX1VTRSkKKyNkZWZpbmUgSVhHQkVfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEX0VSUl9DRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEX0VSUl9MRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEX0VSUl9QRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEX0VSUl9PU0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYRF9FUlJfVVNFKQogCi0jZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfRlJBTUVfRVJSX01BU0sgKFwKLQkJCQkgICAgICBJWEdCRV9SWERBRFZfRVJSX0NFIHwgXAotCQkJCSAgICAgIElYR0JFX1JYREFEVl9FUlJfTEUgfCBcCi0JCQkJICAgICAgSVhHQkVfUlhEQURWX0VSUl9QRSB8IFwKLQkJCQkgICAgICBJWEdCRV9SWERBRFZfRVJSX09TRSB8IFwKLQkJCQkgICAgICBJWEdCRV9SWERBRFZfRVJSX1VTRSkKKyNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEQURWX0VSUl9DRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEQURWX0VSUl9MRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEQURWX0VSUl9QRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhHQkVfUlhEQURWX0VSUl9PU0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYR0JFX1JYREFEVl9FUlJfVVNFKQogCiAvKiBNdWx0aWNhc3QgYml0IG1hc2sgKi8KICNkZWZpbmUgSVhHQkVfTUNTVENUUkxfTUZFICAgICAgMHg0CkBAIC0xMDAwLDYgKzEwMzcsNyBAQAogI2RlZmluZSBJWEdCRV9SWF9ERVNDX1NQRUNJQUxfUFJJX1NISUZUICAweDAwMEQgLyogUHJpb3JpdHkgaW4gdXBwZXIgMyBvZiAxNiAqLwogI2RlZmluZSBJWEdCRV9UWF9ERVNDX1NQRUNJQUxfUFJJX1NISUZUICBJWEdCRV9SWF9ERVNDX1NQRUNJQUxfUFJJX1NISUZUCiAKKwogLyogVHJhbnNtaXQgRGVzY3JpcHRvciAtIExlZ2FjeSAqLwogc3RydWN0IGl4Z2JlX2xlZ2FjeV90eF9kZXNjIHsKIAl1NjQgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLwpAQCAtMTAwNywxNSArMTA0NSwxNSBAQAogCQlfX2xlMzIgZGF0YTsKIAkJc3RydWN0IHsKIAkJCV9fbGUxNiBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLwotCQkJdTggY3NvOyAvKiBDaGVja3N1bSBvZmZzZXQgKi8KLQkJCXU4IGNtZDsgLyogRGVzY3JpcHRvciBjb250cm9sICovCisJCQl1OCBjc287ICAgICAgICAgICAvKiBDaGVja3N1bSBvZmZzZXQgKi8KKwkJCXU4IGNtZDsgICAgICAgICAgIC8qIERlc2NyaXB0b3IgY29udHJvbCAqLwogCQl9IGZsYWdzOwogCX0gbG93ZXI7CiAJdW5pb24gewogCQlfX2xlMzIgZGF0YTsKIAkJc3RydWN0IHsKLQkJCXU4IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCi0JCQl1OCBjc3M7IC8qIENoZWNrc3VtIHN0YXJ0ICovCisJCQl1OCBzdGF0dXM7ICAgICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworCQkJdTggY3NzOyAgICAgICAgICAgLyogQ2hlY2tzdW0gc3RhcnQgKi8KIAkJCV9fbGUxNiB2bGFuOwogCQl9IGZpZWxkczsKIAl9IHVwcGVyOwpAQCAtMTAyNCw3ICsxMDYyLDcgQEAKIC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgLSBBZHZhbmNlZCAqLwogdW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MgewogCXN0cnVjdCB7Ci0JCV9fbGU2NCBidWZmZXJfYWRkcjsgICAgICAgLyogQWRkcmVzcyBvZiBkZXNjcmlwdG9yJ3MgZGF0YSBidWYgKi8KKwkJX19sZTY0IGJ1ZmZlcl9hZGRyOyAgICAgIC8qIEFkZHJlc3Mgb2YgZGVzY3JpcHRvcidzIGRhdGEgYnVmICovCiAJCV9fbGUzMiBjbWRfdHlwZV9sZW47CiAJCV9fbGUzMiBvbGluZm9fc3RhdHVzOwogCX0gcmVhZDsKQEAgLTEwMzksOSArMTA3Nyw5IEBACiBzdHJ1Y3QgaXhnYmVfbGVnYWN5X3J4X2Rlc2MgewogCV9fbGU2NCBidWZmZXJfYWRkcjsgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCiAJX19sZTE2IGxlbmd0aDsgICAgICAvKiBMZW5ndGggb2YgZGF0YSBETUFlZCBpbnRvIGRhdGEgYnVmZmVyICovCi0JdTE2IGNzdW07ICAgICAgICAvKiBQYWNrZXQgY2hlY2tzdW0gKi8KLQl1OCBzdGF0dXM7ICAgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCi0JdTggZXJyb3JzOyAgICAgICAvKiBEZXNjcmlwdG9yIEVycm9ycyAqLworCV9fbGUxNiBjc3VtOyAgICAgICAgLyogUGFja2V0IGNoZWNrc3VtICovCisJdTggc3RhdHVzOyAgICAgICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworCXU4IGVycm9yczsgICAgICAgICAgLyogRGVzY3JpcHRvciBFcnJvcnMgKi8KIAlfX2xlMTYgdmxhbjsKIH07CiAKQEAgLTEwNTMsMTUgKzEwOTEsMTggQEAKIAl9IHJlYWQ7CiAJc3RydWN0IHsKIAkJc3RydWN0IHsKLQkJCXN0cnVjdCB7Ci0JCQkJX19sZTE2IHBrdF9pbmZvOyAvKiBSU1MgdHlwZSwgUGFja2V0IHR5cGUgKi8KLQkJCQlfX2xlMTYgaGRyX2luZm87IC8qIFNwbGl0IEhlYWRlciwgaGVhZGVyIGxlbiAqLworCQkJdW5pb24geworCQkJCV9fbGUzMiBkYXRhOworCQkJCXN0cnVjdCB7CisJCQkJCV9fbGUxNiBwa3RfaW5mbzsgLyogUlNTLCBQa3QgdHlwZSAqLworCQkJCQlfX2xlMTYgaGRyX2luZm87IC8qIFNwbGl0aGRyLCBoZHJsZW4gKi8KKwkJCQl9IGhzX3JzczsKIAkJCX0gbG9fZHdvcmQ7CiAJCQl1bmlvbiB7CiAJCQkJX19sZTMyIHJzczsgLyogUlNTIEhhc2ggKi8KIAkJCQlzdHJ1Y3QgewogCQkJCQlfX2xlMTYgaXBfaWQ7IC8qIElQIGlkICovCi0JCQkJCXUxNiBjc3VtOyAvKiBQYWNrZXQgQ2hlY2tzdW0gKi8KKwkJCQkJX19sZTE2IGNzdW07IC8qIFBhY2tldCBDaGVja3N1bSAqLwogCQkJCX0gY3N1bV9pcDsKIAkJCX0gaGlfZHdvcmQ7CiAJCX0gbG93ZXI7CkBAIC0xMDgyLDQ5ICsxMTIzLDY5IEBACiB9OwogCiAvKiBBZHYgVHJhbnNtaXQgRGVzY3JpcHRvciBDb25maWcgTWFza3MgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RUQUxFTl9NQVNLICAgICAgMHgwMDAwRkZGRiAvKiBEYXRhIGJ1ZmZlciBsZW5ndGgoYnl0ZXMpICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9EVEFMRU5fTUFTSyAgICAgIDB4MDAwMEZGRkYgLyogRGF0YSBidWYgbGVuZ3RoKGJ5dGVzKSAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfRFRZUF9NQVNLICAweDAwRjAwMDAwIC8qIERUWVAgbWFzayAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfRFRZUF9DVFhUICAweDAwMjAwMDAwIC8qIEFkdmFuY2VkIENvbnRleHQgRGVzYyAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfRFRZUF9EQVRBICAweDAwMzAwMDAwIC8qIEFkdmFuY2VkIERhdGEgRGVzY3JpcHRvciAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9FT1AgICBJWEdCRV9UWERfQ01EX0VPUCAgLyogRW5kIG9mIFBhY2tldCAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9JRkNTICBJWEdCRV9UWERfQ01EX0lGQ1MgLyogSW5zZXJ0IEZDUyAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9SRE1BICAweDA0MDAwMDAwIC8qIFJETUEgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfUlMgICAgSVhHQkVfVFhEX0NNRF9SUyAgIC8qIFJlcG9ydCBTdGF0dXMgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfRERUWVBfSVNDU0kgMHgxMDAwMDAwMCAgICAgLyogRERQIGhkciB0eXBlIG9yIGlTQ1NJICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9EQ01EX0REVFlQX0lTQ1NJIDB4MTAwMDAwMDAgICAgLyogRERQIGhkciB0eXBlIG9yIGlTQ1NJICovCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9EQ01EX0RFWFQgIElYR0JFX1RYRF9DTURfREVYVCAvKiBEZXNjIGV4dCAoMT1BZHYpICovCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9EQ01EX1ZMRSAgIElYR0JFX1RYRF9DTURfVkxFICAvKiBWTEFOIHBrdCBlbmFibGUgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfVFNFICAgMHg4MDAwMDAwMCAvKiBUQ1AgU2VnIGVuYWJsZSAqLwogI2RlZmluZSBJWEdCRV9BRFZUWERfU1RBVF9ERCAgICBJWEdCRV9UWERfU1RBVF9ERCAgLyogRGVzY3JpcHRvciBEb25lICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9TVEFUX1NOX0NSQyAgICAgIDB4MDAwMDAwMDIgLyogTlhUU0VRL1NFRUQgcHJlc2VudCBpbiBXQiAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfU1RBVF9TTl9DUkMgICAgICAweDAwMDAwMDAyIC8qIE5YVFNFUS9TRUVEIHByZXMgaW4gV0IgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX1NUQVRfUlNWICAgMHgwMDAwMDAwQyAvKiBTVEEgUmVzZXJ2ZWQgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX0lEWF9TSElGVCAgNCAvKiBBZHYgZGVzYyBJbmRleCBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfQ0MgICAgICAgICAweDAwMDAwMDgwIC8qIENoZWNrIENvbnRleHQgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX1BPUFRTX1NISUZUICAgICAgOCAgLyogQWR2IGRlc2MgUE9QVFMgc2hpZnQgKi8KICNkZWZpbmUgSVhHQkVfQURWVFhEX1BPUFRTX0lYU00gKElYR0JFX1RYRF9QT1BUU19JWFNNIDw8IFwKLQkJCQlJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19UWFNNIChJWEdCRV9UWERfUE9QVFNfVFhTTSA8PCBcCi0JCQkJSVhHQkVfQURWVFhEX1BPUFRTX1NISUZUKQotI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfRU9NICAweDAwMDAwNDAwIC8qIEVuYWJsZSBMIGJpdC1SRE1BIEREUCBoZHIgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1BPUFRTX0lTQ09fMVNUICAgMHgwMDAwMDAwMCAvKiAxc3QgVFNPIG9mIGlTQ1NJIFBEVSAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVNDT19NREwgICAweDAwMDAwODAwIC8qIE1pZGRsZSBUU08gb2YgaVNDU0kgUERVICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19JU0NPX0xBU1QgIDB4MDAwMDEwMDAgLyogTGFzdCBUU08gb2YgaVNDU0kgUERVICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19JU0NPX0ZVTEwgMHgwMDAwMTgwMCAvKiAxc3QmTGFzdCBUU08tZnVsbCBpU0NTSSBQRFUqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfUlNWICAweDAwMDAyMDAwIC8qIFBPUFRTIFJlc2VydmVkICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QQVlMRU5fU0hJRlQgIDE0IC8qIEFkdiBkZXNjIFBBWUxFTiBzaGlmdCAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfTUFDTEVOX1NISUZUICA5ICAvKiBBZHYgY3R4dCBkZXNjIG1hYyBsZW4gc2hpZnQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1ZMQU5fU0hJRlQgICAgMTYgIC8qIEFkdiBjdHh0IHZsYW4gdGFnIHNoaWZ0ICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9JUFY0ICAgIDB4MDAwMDA0MDAgIC8qIElQIFBhY2tldCBUeXBlOiAxPUlQdjQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0lQVjYgICAgMHgwMDAwMDAwMCAgLyogSVAgUGFja2V0IFR5cGU6IDA9SVB2NiAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1VEUCAweDAwMDAwMDAwICAvKiBMNCBQYWNrZXQgVFlQRSBvZiBVRFAgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9UQ1AgMHgwMDAwMDgwMCAgLyogTDQgUGFja2V0IFRZUEUgb2YgVENQICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9NS1JSRVEgIDB4MDAwMDIwMDAgLyogUmVxIHJlcXVpcmVzIE1hcmtlcnMgYW5kIENSQyAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfTDRMRU5fU0hJRlQgICA4ICAvKiBBZHYgY3R4dCBMNExFTiBzaGlmdCAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfTVNTX1NISUZUICAgICAxNiAgLyogQWR2IGN0eHQgTVNTIHNoaWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCisjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19JU0NPXzFTVCAgMHgwMDAwMDAwMCAvKiAxc3QgVFNPIG9mIGlTQ1NJIFBEVSAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVNDT19NREwgIDB4MDAwMDA4MDAgLyogTWlkZGxlIFRTTyBvZiBpU0NTSSBQRFUgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1BPUFRTX0lTQ09fTEFTVCAweDAwMDAxMDAwIC8qIExhc3QgVFNPIG9mIGlTQ1NJIFBEVSAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVNDT19GVUxMIDB4MDAwMDE4MDAgLyogMXN0Jkxhc3QgVFNPLWZ1bGwgaVNDU0kgUERVICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19SU1YgICAgICAgMHgwMDAwMjAwMCAvKiBQT1BUUyBSZXNlcnZlZCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfUEFZTEVOX1NISUZUICAgIDE0IC8qIEFkdiBkZXNjIFBBWUxFTiBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfTUFDTEVOX1NISUZUICAgIDkgIC8qIEFkdiBjdHh0IGRlc2MgbWFjIGxlbiBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfVkxBTl9TSElGVCAgICAgIDE2ICAvKiBBZHYgY3R4dCB2bGFuIHRhZyBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfSVBWNCAgICAgIDB4MDAwMDA0MDAgIC8qIElQIFBhY2tldCBUeXBlOiAxPUlQdjQgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0lQVjYgICAgICAweDAwMDAwMDAwICAvKiBJUCBQYWNrZXQgVHlwZTogMD1JUHY2ICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9MNFRfVURQICAgMHgwMDAwMDAwMCAgLyogTDQgUGFja2V0IFRZUEUgb2YgVURQICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9MNFRfVENQICAgMHgwMDAwMDgwMCAgLyogTDQgUGFja2V0IFRZUEUgb2YgVENQICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9MNFRfU0NUUCAgMHgwMDAwMTAwMCAgLyogTDQgUGFja2V0IFRZUEUgb2YgU0NUUCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTUtSUkVRICAgIDB4MDAwMDIwMDAgLypSZXEgcmVxdWlyZXMgTWFya2VycyBhbmQgQ1JDKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX0w0TEVOX1NISUZUICAgICA4ICAvKiBBZHYgY3R4dCBMNExFTiBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfTVNTX1NISUZUICAgICAgIDE2ICAvKiBBZHYgY3R4dCBNU1Mgc2hpZnQgKi8KIAorLyogQXV0b25lZ290aWF0aW9uIGFkdmVydGlzZWQgc3BlZWRzICovCit0eXBlZGVmIHUzMiBpeGdiZV9hdXRvbmVnX2FkdmVydGlzZWQ7CiAvKiBMaW5rIHNwZWVkICovCit0eXBlZGVmIHUzMiBpeGdiZV9saW5rX3NwZWVkOwogI2RlZmluZSBJWEdCRV9MSU5LX1NQRUVEX1VOS05PV04gICAwCiAjZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMTAwX0ZVTEwgIDB4MDAwOAogI2RlZmluZSBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMICAweDAwMjAKICNkZWZpbmUgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwgMHgwMDgwCisjZGVmaW5lIElYR0JFX0xJTktfU1BFRURfODI1OThfQVVUT05FRyAoSVhHQkVfTElOS19TUEVFRF8xR0JfRlVMTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEdCRV9MSU5LX1NQRUVEXzEwR0JfRlVMTCkKKworLyogUGh5c2ljYWwgbGF5ZXIgdHlwZSAqLwordHlwZWRlZiB1MzIgaXhnYmVfcGh5c2ljYWxfbGF5ZXI7CisjZGVmaW5lIElYR0JFX1BIWVNJQ0FMX0xBWUVSX1VOS05PV04gICAgICAwCisjZGVmaW5lIElYR0JFX1BIWVNJQ0FMX0xBWUVSXzEwR0JBU0VfVCAgICAweDAwMDEKKyNkZWZpbmUgSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTAwMEJBU0VfVCAgIDB4MDAwMgorI2RlZmluZSBJWEdCRV9QSFlTSUNBTF9MQVlFUl8xMDBCQVNFX1QgICAgMHgwMDA0CisjZGVmaW5lIElYR0JFX1BIWVNJQ0FMX0xBWUVSX1NGUF9QTFVTX0NVICAweDAwMDgKKyNkZWZpbmUgSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTBHQkFTRV9MUiAgIDB4MDAxMAorI2RlZmluZSBJWEdCRV9QSFlTSUNBTF9MQVlFUl8xMEdCQVNFX0xSTSAgMHgwMDIwCisjZGVmaW5lIElYR0JFX1BIWVNJQ0FMX0xBWUVSXzEwR0JBU0VfU1IgICAweDAwNDAKKyNkZWZpbmUgSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTBHQkFTRV9LWDQgIDB4MDA4MAorI2RlZmluZSBJWEdCRV9QSFlTSUNBTF9MQVlFUl8xMEdCQVNFX0NYNCAgMHgwMTAwCisjZGVmaW5lIElYR0JFX1BIWVNJQ0FMX0xBWUVSXzEwMDBCQVNFX0tYICAweDAyMDAKKyNkZWZpbmUgSVhHQkVfUEhZU0lDQUxfTEFZRVJfMTAwMEJBU0VfQlggIDB4MDQwMAogCiAKIGVudW0gaXhnYmVfZWVwcm9tX3R5cGUgewpAQCAtMTE0MSwxNiArMTIwMiwzOCBAQAogCiBlbnVtIGl4Z2JlX3BoeV90eXBlIHsKIAlpeGdiZV9waHlfdW5rbm93biA9IDAsCi0JaXhnYmVfcGh5X3RuLAogCWl4Z2JlX3BoeV9xdCwKLQlpeGdiZV9waHlfeGF1aQorCWl4Z2JlX3BoeV94YXVpLAorCWl4Z2JlX3BoeV90d190eWNvLAorCWl4Z2JlX3BoeV90d191bmtub3duLAorCWl4Z2JlX3BoeV9zZnBfYXZhZ28sCisJaXhnYmVfcGh5X3NmcF9mdGwsCisJaXhnYmVfcGh5X3NmcF91bmtub3duLAorCWl4Z2JlX3BoeV9nZW5lcmljCit9OworCisvKgorICogU0ZQKyBtb2R1bGUgdHlwZSBJRHM6CisgKgorICogSUQJTW9kdWxlIFR5cGUKKyAqID09PT09PT09PT09PT0KKyAqIDAJU0ZQX0RBX0NVCisgKiAxCVNGUF9TUgorICogMglTRlBfTFIKKyAqLworZW51bSBpeGdiZV9zZnBfdHlwZSB7CisJaXhnYmVfc2ZwX3R5cGVfZGFfY3UgPSAwLAorCWl4Z2JlX3NmcF90eXBlX3NyID0gMSwKKwlpeGdiZV9zZnBfdHlwZV9sciA9IDIsCisJaXhnYmVfc2ZwX3R5cGVfdW5rbm93biA9IDB4RkZGRgogfTsKIAogZW51bSBpeGdiZV9tZWRpYV90eXBlIHsKIAlpeGdiZV9tZWRpYV90eXBlX3Vua25vd24gPSAwLAogCWl4Z2JlX21lZGlhX3R5cGVfZmliZXIsCiAJaXhnYmVfbWVkaWFfdHlwZV9jb3BwZXIsCi0JaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmUKKwlpeGdiZV9tZWRpYV90eXBlX2JhY2twbGFuZSwKKwlpeGdiZV9tZWRpYV90eXBlX3ZpcnR1YWwKIH07CiAKIC8qIEZsb3cgQ29udHJvbCBTZXR0aW5ncyAqLwpAQCAtMTE2Nyw2ICsxMjUwLDggQEAKIAl1MzIgcmFyX3VzZWRfY291bnQ7CiAJdTMyIG1jX2FkZHJfaW5fcmFyX2NvdW50OwogCXUzMiBtdGFfaW5fdXNlOworCXUzMiBvdmVyZmxvd19wcm9taXNjOworCWJvb2wgdXNlcl9zZXRfcHJvbWlzYzsKIH07CiAKIC8qIEZsb3cgY29udHJvbCBwYXJhbWV0ZXJzICovCkBAIC0xMjQyLDU3ICsxMzI3LDExOCBAQAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IGl4Z2JlX2h3OwogCisvKiBpdGVyYXRvciB0eXBlIGZvciB3YWxraW5nIG11bHRpY2FzdCBhZGRyZXNzIGxpc3RzICovCit0eXBlZGVmIHU4KiAoKml4Z2JlX21jX2FkZHJfaXRyKSAoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKiptY19hZGRyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgKnZtZHEpOworCisvKiBGdW5jdGlvbiBwb2ludGVyIHRhYmxlICovCitzdHJ1Y3QgaXhnYmVfZWVwcm9tX29wZXJhdGlvbnMgeworCXMzMiAoKmluaXRfcGFyYW1zKShzdHJ1Y3QgaXhnYmVfaHcgKik7CisJczMyICgqcmVhZCkoc3RydWN0IGl4Z2JlX2h3ICosIHUxNiwgdTE2ICopOworCXMzMiAoKndyaXRlKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTE2LCB1MTYpOworCXMzMiAoKnZhbGlkYXRlX2NoZWNrc3VtKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTE2ICopOworCXMzMiAoKnVwZGF0ZV9jaGVja3N1bSkoc3RydWN0IGl4Z2JlX2h3ICopOworfTsKKwogc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIHsKLQlzMzIgKCpyZXNldCkoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKmluaXRfaHcpKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCpyZXNldF9odykoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKnN0YXJ0X2h3KShzdHJ1Y3QgaXhnYmVfaHcgKik7CisJczMyICgqY2xlYXJfaHdfY250cnMpKHN0cnVjdCBpeGdiZV9odyAqKTsKIAllbnVtIGl4Z2JlX21lZGlhX3R5cGUgKCpnZXRfbWVkaWFfdHlwZSkoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKmdldF9zdXBwb3J0ZWRfcGh5c2ljYWxfbGF5ZXIpKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCpnZXRfbWFjX2FkZHIpKHN0cnVjdCBpeGdiZV9odyAqLCB1OCAqKTsKKwlzMzIgKCpzdG9wX2FkYXB0ZXIpKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCpnZXRfYnVzX2luZm8pKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCpyZWFkX2FuYWxvZ19yZWc4KShzdHJ1Y3QgaXhnYmVfaHcqLCB1MzIsIHU4Kik7CisJczMyICgqd3JpdGVfYW5hbG9nX3JlZzgpKHN0cnVjdCBpeGdiZV9odyosIHUzMiwgdTgpOworCisJLyogTGluayAqLwogCXMzMiAoKnNldHVwX2xpbmspKHN0cnVjdCBpeGdiZV9odyAqKTsKLQlzMzIgKCpjaGVja19saW5rKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyICosIGJvb2wgKik7Ci0JczMyICgqc2V0dXBfbGlua19zcGVlZCkoc3RydWN0IGl4Z2JlX2h3ICosIHUzMiwgYm9vbCwgYm9vbCk7Ci0JczMyICgqZ2V0X2xpbmtfc2V0dGluZ3MpKHN0cnVjdCBpeGdiZV9odyAqLCB1MzIgKiwgYm9vbCAqKTsKKwlzMzIgKCpzZXR1cF9saW5rX3NwZWVkKShzdHJ1Y3QgaXhnYmVfaHcgKiwgaXhnYmVfbGlua19zcGVlZCwgYm9vbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICBib29sKTsKKwlzMzIgKCpjaGVja19saW5rKShzdHJ1Y3QgaXhnYmVfaHcgKiwgaXhnYmVfbGlua19zcGVlZCAqLCBib29sICosIGJvb2wpOworCXMzMiAoKmdldF9saW5rX2NhcGFiaWxpdGllcykoc3RydWN0IGl4Z2JlX2h3ICosIGl4Z2JlX2xpbmtfc3BlZWQgKiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKik7CisKKwkvKiBMRUQgKi8KKwlzMzIgKCpsZWRfb24pKHN0cnVjdCBpeGdiZV9odyAqLCB1MzIpOworCXMzMiAoKmxlZF9vZmYpKHN0cnVjdCBpeGdiZV9odyAqLCB1MzIpOworCXMzMiAoKmJsaW5rX2xlZF9zdGFydCkoc3RydWN0IGl4Z2JlX2h3ICosIHUzMik7CisJczMyICgqYmxpbmtfbGVkX3N0b3ApKHN0cnVjdCBpeGdiZV9odyAqLCB1MzIpOworCisJLyogUkFSLCBNdWx0aWNhc3QsIFZMQU4gKi8KKwlzMzIgKCpzZXRfcmFyKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyLCB1OCAqLCB1MzIsIHUzMik7CisJczMyICgqY2xlYXJfcmFyKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyKTsKKwlzMzIgKCpzZXRfdm1kcSkoc3RydWN0IGl4Z2JlX2h3ICosIHUzMiwgdTMyKTsKKwlzMzIgKCpjbGVhcl92bWRxKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyLCB1MzIpOworCXMzMiAoKmluaXRfcnhfYWRkcnMpKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCp1cGRhdGVfdWNfYWRkcl9saXN0KShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTggKiwgdTMyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX21jX2FkZHJfaXRyKTsKKwlzMzIgKCp1cGRhdGVfbWNfYWRkcl9saXN0KShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTggKiwgdTMyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4Z2JlX21jX2FkZHJfaXRyKTsKKwlzMzIgKCplbmFibGVfbWMpKHN0cnVjdCBpeGdiZV9odyAqKTsKKwlzMzIgKCpkaXNhYmxlX21jKShzdHJ1Y3QgaXhnYmVfaHcgKik7CisJczMyICgqY2xlYXJfdmZ0YSkoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKnNldF92ZnRhKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyLCB1MzIsIGJvb2wpOworCXMzMiAoKmluaXRfdXRhX3RhYmxlcykoc3RydWN0IGl4Z2JlX2h3ICopOworCisJLyogRmxvdyBDb250cm9sICovCisJczMyICgqc2V0dXBfZmMpKHN0cnVjdCBpeGdiZV9odyAqLCBzMzIpOwogfTsKIAogc3RydWN0IGl4Z2JlX3BoeV9vcGVyYXRpb25zIHsKKwlzMzIgKCppZGVudGlmeSkoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKmlkZW50aWZ5X3NmcCkoc3RydWN0IGl4Z2JlX2h3ICopOworCXMzMiAoKnJlc2V0KShzdHJ1Y3QgaXhnYmVfaHcgKik7CisJczMyICgqcmVhZF9yZWcpKHN0cnVjdCBpeGdiZV9odyAqLCB1MzIsIHUzMiwgdTE2ICopOworCXMzMiAoKndyaXRlX3JlZykoc3RydWN0IGl4Z2JlX2h3ICosIHUzMiwgdTMyLCB1MTYpOwogCXMzMiAoKnNldHVwX2xpbmspKHN0cnVjdCBpeGdiZV9odyAqKTsKLQlzMzIgKCpjaGVja19saW5rKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTMyICosIGJvb2wgKik7Ci0JczMyICgqc2V0dXBfbGlua19zcGVlZCkoc3RydWN0IGl4Z2JlX2h3ICosIHUzMiwgYm9vbCwgYm9vbCk7Ci19OwotCi1zdHJ1Y3QgaXhnYmVfbWFjX2luZm8gewotCXN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucwlvcHM7Ci0JZW51bSBpeGdiZV9tYWNfdHlwZQkJdHlwZTsKLQl1OAkJCQlhZGRyW0lYR0JFX0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JdTgJCQkJcGVybV9hZGRyW0lYR0JFX0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JczMyCQkJCW1jX2ZpbHRlcl90eXBlOwotCXUzMgkJCQludW1fcnhfcXVldWVzOwotCXUzMgkJCQludW1fdHhfcXVldWVzOwotCXUzMgkJCQludW1fcnhfYWRkcnM7Ci0JdTMyCQkJCWxpbmtfYXR0YWNoX3R5cGU7Ci0JdTMyCQkJCWxpbmtfbW9kZV9zZWxlY3Q7Ci0JYm9vbAkJCQlsaW5rX3NldHRpbmdzX2xvYWRlZDsKKwlzMzIgKCpzZXR1cF9saW5rX3NwZWVkKShzdHJ1Y3QgaXhnYmVfaHcgKiwgaXhnYmVfbGlua19zcGVlZCwgYm9vbCwKKwkgICAgICAgICAgICAgICAgICAgICAgICBib29sKTsKKwlzMzIgKCpyZWFkX2kyY19ieXRlKShzdHJ1Y3QgaXhnYmVfaHcgKiwgdTgsIHU4LCB1OCAqKTsKKwlzMzIgKCp3cml0ZV9pMmNfYnl0ZSkoc3RydWN0IGl4Z2JlX2h3ICosIHU4LCB1OCwgdTgpOworCXMzMiAoKnJlYWRfaTJjX2VlcHJvbSkoc3RydWN0IGl4Z2JlX2h3ICosIHU4ICwgdTggKik7CisJczMyICgqd3JpdGVfaTJjX2VlcHJvbSkoc3RydWN0IGl4Z2JlX2h3ICosIHU4LCB1OCk7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfZWVwcm9tX2luZm8gewotCWVudW0gaXhnYmVfZWVwcm9tX3R5cGUJCXR5cGU7Ci0JdTE2CQkJCXdvcmRfc2l6ZTsKLQl1MTYJCQkJYWRkcmVzc19iaXRzOworCXN0cnVjdCBpeGdiZV9lZXByb21fb3BlcmF0aW9ucyAgb3BzOworCWVudW0gaXhnYmVfZWVwcm9tX3R5cGUgICAgICAgICAgdHlwZTsKKwl1MzIJCQkJc2VtYXBob3JlX2RlbGF5OworCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9zaXplOworCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19iaXRzOworfTsKKworc3RydWN0IGl4Z2JlX21hY19pbmZvIHsKKwlzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgICAgIG9wczsKKwllbnVtIGl4Z2JlX21hY190eXBlICAgICAgICAgICAgIHR5cGU7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyW0lYR0JFX0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtX2FkZHJbSVhHQkVfRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlzMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jX2ZpbHRlcl90eXBlOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNmdF9zaXplOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZ0X3NpemU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcmFyX2VudHJpZXM7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdHhfcXVldWVzOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3J4X3F1ZXVlczsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfYXR0YWNoX3R5cGU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX21vZGVfc2VsZWN0OworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zZXR0aW5nc19sb2FkZWQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbmVnOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b25lZ19mYWlsZWQ7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfcGh5X2luZm8gewotCXN0cnVjdCBpeGdiZV9waHlfb3BlcmF0aW9ucwlvcHM7Ci0KLQllbnVtIGl4Z2JlX3BoeV90eXBlCQl0eXBlOwotCXUzMgkJCQlhZGRyOwotCXUzMgkJCQlpZDsKLQl1MzIJCQkJcmV2aXNpb247Ci0JZW51bSBpeGdiZV9tZWRpYV90eXBlCQltZWRpYV90eXBlOwotCXUzMgkJCQlhdXRvbmVnX2FkdmVydGlzZWQ7Ci0JYm9vbAkJCQlhdXRvbmVnX3dhaXRfdG9fY29tcGxldGU7Ci19OwotCi1zdHJ1Y3QgaXhnYmVfaW5mbyB7Ci0JZW51bSBpeGdiZV9tYWNfdHlwZQkJbWFjOwotCXMzMiAJCQkJKCpnZXRfaW52YXJpYW50cykoc3RydWN0IGl4Z2JlX2h3ICopOwotCXN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucwkqbWFjX29wczsKKwlzdHJ1Y3QgaXhnYmVfcGh5X29wZXJhdGlvbnMgICAgIG9wczsKKwllbnVtIGl4Z2JlX3BoeV90eXBlICAgICAgICAgICAgIHR5cGU7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ7CisJZW51bSBpeGdiZV9zZnBfdHlwZSAgICAgICAgICAgICBzZnBfdHlwZTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOworCWVudW0gaXhnYmVfbWVkaWFfdHlwZSAgICAgICAgICAgbWVkaWFfdHlwZTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X2Rpc2FibGU7CisJaXhnYmVfYXV0b25lZ19hZHZlcnRpc2VkICAgICAgICBhdXRvbmVnX2FkdmVydGlzZWQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbmVnX3dhaXRfdG9fY29tcGxldGU7CiB9OwogCiBzdHJ1Y3QgaXhnYmVfaHcgewpAQCAtMTMxMSw2ICsxNDU3LDE1IEBACiAJYm9vbAkJCQlhZGFwdGVyX3N0b3BwZWQ7CiB9OwogCitzdHJ1Y3QgaXhnYmVfaW5mbyB7CisJZW51bSBpeGdiZV9tYWNfdHlwZQkJbWFjOworCXMzMiAJCQkJKCpnZXRfaW52YXJpYW50cykoc3RydWN0IGl4Z2JlX2h3ICopOworCXN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucwkqbWFjX29wczsKKwlzdHJ1Y3QgaXhnYmVfZWVwcm9tX29wZXJhdGlvbnMJKmVlcHJvbV9vcHM7CisJc3RydWN0IGl4Z2JlX3BoeV9vcGVyYXRpb25zCSpwaHlfb3BzOworfTsKKworCiAvKiBFcnJvciBDb2RlcyAqLwogI2RlZmluZSBJWEdCRV9FUlJfRUVQUk9NICAgICAgICAgICAgICAgICAgICAgICAgLTEKICNkZWZpbmUgSVhHQkVfRVJSX0VFUFJPTV9DSEVDS1NVTSAgICAgICAgICAgICAgIC0yCkBAIC0xMzI5LDYgKzE0ODQsOCBAQAogI2RlZmluZSBJWEdCRV9FUlJfUkVTRVRfRkFJTEVEICAgICAgICAgICAgICAgICAgLTE1CiAjZGVmaW5lIElYR0JFX0VSUl9TV0ZXX1NZTkMgICAgICAgICAgICAgICAgICAgICAtMTYKICNkZWZpbmUgSVhHQkVfRVJSX1BIWV9BRERSX0lOVkFMSUQgICAgICAgICAgICAgIC0xNworI2RlZmluZSBJWEdCRV9FUlJfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE4CisjZGVmaW5lIElYR0JFX0VSUl9TRlBfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAtMTkKICNkZWZpbmUgSVhHQkVfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgICAgICAgIDB4N0ZGRkZGRkYKIAogI2VuZGlmIC8qIF9JWEdCRV9UWVBFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9qbWUuYyBiL2RyaXZlcnMvbmV0L2ptZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzZjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9qbWUuYwpAQCAtMCwwICsxLDMwMzggQEAKKy8qCisgKiBKTWljcm9uIEpNQzJ4MCBzZXJpZXMgUENJZSBFdGhlcm5ldCBMaW51eCBEZXZpY2UgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDggSk1pY3JvbiBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBodHRwOi8vd3d3LmptaWNyb24uY29tLworICoKKyAqIEF1dGhvcjogR3VvLUZ1IFRzZW5nIDxjb29sZGF2aWRAY29vbGRhdmlkLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgImptZS5oIgorCitzdGF0aWMgaW50IGZvcmNlX3BzZXVkb2hwID0gLTE7CitzdGF0aWMgaW50IG5vX3BzZXVkb2hwID0gLTE7CitzdGF0aWMgaW50IG5vX2V4dHBsdWcgPSAtMTsKK21vZHVsZV9wYXJhbShmb3JjZV9wc2V1ZG9ocCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfcHNldWRvaHAsCisJIkVuYWJsZSBwc2V1ZG8gaG90LXBsdWcgZmVhdHVyZSBtYW51YWxseSBieSBkcml2ZXIgaW5zdGVhZCBvZiBCSU9TLiIpOworbW9kdWxlX3BhcmFtKG5vX3BzZXVkb2hwLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub19wc2V1ZG9ocCwgIkRpc2FibGUgcHNldWRvIGhvdC1wbHVnIGZlYXR1cmUuIik7Cittb2R1bGVfcGFyYW0obm9fZXh0cGx1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9fZXh0cGx1ZywKKwkiRG8gbm90IHVzZSBleHRlcm5hbCBwbHVnIHNpZ25hbCBmb3IgcHNldWRvIGhvdC1wbHVnLiIpOworCitzdGF0aWMgaW50CitqbWVfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHksIGludCByZWcpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpLCB2YWwsIGFnYWluID0gKHJlZyA9PSBNSUlfQk1TUikgPyAxIDogMDsKKworcmVhZF9hZ2FpbjoKKwlqd3JpdGUzMihqbWUsIEpNRV9TTUksIFNNSV9PUF9SRVEgfAorCQkJCXNtaV9waHlfYWRkcihwaHkpIHwKKwkJCQlzbWlfcmVnX2FkZHIocmVnKSk7CisKKwl3bWIoKTsKKwlmb3IgKGkgPSBKTUVfUEhZX1RJTUVPVVQgKiA1MCA7IGkgPiAwIDsgLS1pKSB7CisJCXVkZWxheSgyMCk7CisJCXZhbCA9IGpyZWFkMzIoam1lLCBKTUVfU01JKTsKKwkJaWYgKCh2YWwgJiBTTUlfT1BfUkVRKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMCkgeworCQlqZXByaW50ayhqbWUtPnBkZXYsICJwaHkoJWQpIHJlYWQgdGltZW91dCA6ICVkXG4iLCBwaHksIHJlZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhZ2Fpbi0tKQorCQlnb3RvIHJlYWRfYWdhaW47CisKKwlyZXR1cm4gKHZhbCAmIFNNSV9EQVRBX01BU0spID4+IFNNSV9EQVRBX1NISUZUOworfQorCitzdGF0aWMgdm9pZAoram1lX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlpbnQgcGh5LCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaTsKKworCWp3cml0ZTMyKGptZSwgSk1FX1NNSSwgU01JX09QX1dSSVRFIHwgU01JX09QX1JFUSB8CisJCSgodmFsIDw8IFNNSV9EQVRBX1NISUZUKSAmIFNNSV9EQVRBX01BU0spIHwKKwkJc21pX3BoeV9hZGRyKHBoeSkgfCBzbWlfcmVnX2FkZHIocmVnKSk7CisKKwl3bWIoKTsKKwlmb3IgKGkgPSBKTUVfUEhZX1RJTUVPVVQgKiA1MCA7IGkgPiAwIDsgLS1pKSB7CisJCXVkZWxheSgyMCk7CisJCWlmICgoanJlYWQzMihqbWUsIEpNRV9TTUkpICYgU01JX09QX1JFUSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDApCisJCWplcHJpbnRrKGptZS0+cGRldiwgInBoeSglZCkgd3JpdGUgdGltZW91dCA6ICVkXG4iLCBwaHksIHJlZyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3Jlc2V0X3BoeV9wcm9jZXNzb3Ioc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJdTMyIHZhbDsKKworCWptZV9tZGlvX3dyaXRlKGptZS0+ZGV2LAorCQkJam1lLT5taWlfaWYucGh5X2lkLAorCQkJTUlJX0FEVkVSVElTRSwgQURWRVJUSVNFX0FMTCB8CisJCQlBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU0pOworCisJaWYgKGptZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUMyNTApCisJCWptZV9tZGlvX3dyaXRlKGptZS0+ZGV2LAorCQkJCWptZS0+bWlpX2lmLnBoeV9pZCwKKwkJCQlNSUlfQ1RSTDEwMDAsCisJCQkJQURWRVJUSVNFXzEwMDBGVUxMIHwgQURWRVJUSVNFXzEwMDBIQUxGKTsKKworCXZhbCA9IGptZV9tZGlvX3JlYWQoam1lLT5kZXYsCisJCQkJam1lLT5taWlfaWYucGh5X2lkLAorCQkJCU1JSV9CTUNSKTsKKworCWptZV9tZGlvX3dyaXRlKGptZS0+ZGV2LAorCQkJam1lLT5taWlfaWYucGh5X2lkLAorCQkJTUlJX0JNQ1IsIHZhbCB8IEJNQ1JfUkVTRVQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoram1lX3NldHVwX3dha2V1cF9mcmFtZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwKKwkJdTMyICptYXNrLCB1MzIgY3JjLCBpbnQgZm5yKQoreworCWludCBpOworCisJLyoKKwkgKiBTZXR1cCBDUkMgcGF0dGVybgorCSAqLworCWp3cml0ZTMyKGptZSwgSk1FX1dGT0ksIFdGT0lfQ1JDX1NFTCB8IChmbnIgJiBXRk9JX0ZSQU1FX1NFTCkpOworCXdtYigpOworCWp3cml0ZTMyKGptZSwgSk1FX1dGT0RQLCBjcmMpOworCXdtYigpOworCisJLyoKKwkgKiBTZXR1cCBNYXNrCisJICovCisJZm9yIChpID0gMCA7IGkgPCBXQUtFVVBfRlJBTUVfTUFTS19EV05SIDsgKytpKSB7CisJCWp3cml0ZTMyKGptZSwgSk1FX1dGT0ksCisJCQkJKChpIDw8IFdGT0lfTUFTS19TSElGVCkgJiBXRk9JX01BU0tfU0VMKSB8CisJCQkJKGZuciAmIFdGT0lfRlJBTUVfU0VMKSk7CisJCXdtYigpOworCQlqd3JpdGUzMihqbWUsIEpNRV9XRk9EUCwgbWFza1tpXSk7CisJCXdtYigpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitqbWVfcmVzZXRfbWFjX3Byb2Nlc3NvcihzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwl1MzIgbWFza1tXQUtFVVBfRlJBTUVfTUFTS19EV05SXSA9IHswLCAwLCAwLCAwfTsKKwl1MzIgY3JjID0gMHhDRENEQ0RDRDsKKwl1MzIgZ3ByZWcwOworCWludCBpOworCisJandyaXRlMzIoam1lLCBKTUVfR0hDLCBqbWUtPnJlZ19naGMgfCBHSENfU1dSU1QpOworCXVkZWxheSgyKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9HSEMsIGptZS0+cmVnX2doYyk7CisKKwlqd3JpdGUzMihqbWUsIEpNRV9SWERCQV9MTywgMHgwMDAwMDAwMCk7CisJandyaXRlMzIoam1lLCBKTUVfUlhEQkFfSEksIDB4MDAwMDAwMDApOworCWp3cml0ZTMyKGptZSwgSk1FX1JYUURDLCAweDAwMDAwMDAwKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9SWE5EQSwgMHgwMDAwMDAwMCk7CisJandyaXRlMzIoam1lLCBKTUVfVFhEQkFfTE8sIDB4MDAwMDAwMDApOworCWp3cml0ZTMyKGptZSwgSk1FX1RYREJBX0hJLCAweDAwMDAwMDAwKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9UWFFEQywgMHgwMDAwMDAwMCk7CisJandyaXRlMzIoam1lLCBKTUVfVFhOREEsIDB4MDAwMDAwMDApOworCisJandyaXRlMzIoam1lLCBKTUVfUlhNQ0hUX0xPLCAweDAwMDAwMDAwKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9SWE1DSFRfSEksIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDAgOyBpIDwgV0FLRVVQX0ZSQU1FX05SIDsgKytpKQorCQlqbWVfc2V0dXBfd2FrZXVwX2ZyYW1lKGptZSwgbWFzaywgY3JjLCBpKTsKKwlpZiAoam1lLT5mcGdhdmVyKQorCQlncHJlZzAgPSBHUFJFRzBfREVGQVVMVCB8IEdQUkVHMF9MTktJTlRQT0xMOworCWVsc2UKKwkJZ3ByZWcwID0gR1BSRUcwX0RFRkFVTFQ7CisJandyaXRlMzIoam1lLCBKTUVfR1BSRUcwLCBncHJlZzApOworCWp3cml0ZTMyKGptZSwgSk1FX0dQUkVHMSwgR1BSRUcxX0RFRkFVTFQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9yZXNldF9naGNfc3BlZWQoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJam1lLT5yZWdfZ2hjICY9IH4oR0hDX1NQRUVEXzEwMDBNIHwgR0hDX0RQWCk7CisJandyaXRlMzIoam1lLCBKTUVfR0hDLCBqbWUtPnJlZ19naGMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9jbGVhcl9wbShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqd3JpdGUzMihqbWUsIEpNRV9QTUNTLCAweEZGRkYwMDAwIHwgam1lLT5yZWdfcG1jcyk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShqbWUtPnBkZXYsIFBDSV9EMCk7CisJcGNpX2VuYWJsZV93YWtlKGptZS0+cGRldiwgUENJX0QwLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9yZWxvYWRfZWVwcm9tKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiB2YWw7CisJaW50IGk7CisKKwl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1NNQkNTUik7CisKKwlpZiAodmFsICYgU01CQ1NSX0VFUFJPTUQpIHsKKwkJdmFsIHw9IFNNQkNTUl9DTkFDSzsKKwkJandyaXRlMzIoam1lLCBKTUVfU01CQ1NSLCB2YWwpOworCQl2YWwgfD0gU01CQ1NSX1JFTE9BRDsKKwkJandyaXRlMzIoam1lLCBKTUVfU01CQ1NSLCB2YWwpOworCQltZGVsYXkoMTIpOworCisJCWZvciAoaSA9IEpNRV9FRVBST01fUkVMT0FEX1RJTUVPVVQ7IGkgPiAwOyAtLWkpIHsKKwkJCW1kZWxheSgxKTsKKwkJCWlmICgoanJlYWQzMihqbWUsIEpNRV9TTUJDU1IpICYgU01CQ1NSX1JFTE9BRCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IDApIHsKKwkJCWplcHJpbnRrKGptZS0+cGRldiwgImVlcHJvbSByZWxvYWQgdGltZW91dFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX2xvYWRfbWFjYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBjaGFyIG1hY2FkZHJbNl07CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19iaCgmam1lLT5tYWNhZGRyX2xvY2spOworCXZhbCA9IGpyZWFkMzIoam1lLCBKTUVfUlhVTUFfTE8pOworCW1hY2FkZHJbMF0gPSAodmFsID4+ICAwKSAmIDB4RkY7CisJbWFjYWRkclsxXSA9ICh2YWwgPj4gIDgpICYgMHhGRjsKKwltYWNhZGRyWzJdID0gKHZhbCA+PiAxNikgJiAweEZGOworCW1hY2FkZHJbM10gPSAodmFsID4+IDI0KSAmIDB4RkY7CisJdmFsID0ganJlYWQzMihqbWUsIEpNRV9SWFVNQV9ISSk7CisJbWFjYWRkcls0XSA9ICh2YWwgPj4gIDApICYgMHhGRjsKKwltYWNhZGRyWzVdID0gKHZhbCA+PiAgOCkgJiAweEZGOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBtYWNhZGRyLCA2KTsKKwlzcGluX3VubG9ja19iaCgmam1lLT5tYWNhZGRyX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9zZXRfcnhfcGNjKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCBpbnQgcCkKK3sKKwlzd2l0Y2ggKHApIHsKKwljYXNlIFBDQ19PRkY6CisJCWp3cml0ZTMyKGptZSwgSk1FX1BDQ1JYMCwKKwkJCSgoUENDX09GRl9UTyA8PCBQQ0NSWFRPX1NISUZUKSAmIFBDQ1JYVE9fTUFTSykgfAorCQkJKChQQ0NfT0ZGX0NOVCA8PCBQQ0NSWF9TSElGVCkgJiBQQ0NSWF9NQVNLKSk7CisJCWJyZWFrOworCWNhc2UgUENDX1AxOgorCQlqd3JpdGUzMihqbWUsIEpNRV9QQ0NSWDAsCisJCQkoKFBDQ19QMV9UTyA8PCBQQ0NSWFRPX1NISUZUKSAmIFBDQ1JYVE9fTUFTSykgfAorCQkJKChQQ0NfUDFfQ05UIDw8IFBDQ1JYX1NISUZUKSAmIFBDQ1JYX01BU0spKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0NfUDI6CisJCWp3cml0ZTMyKGptZSwgSk1FX1BDQ1JYMCwKKwkJCSgoUENDX1AyX1RPIDw8IFBDQ1JYVE9fU0hJRlQpICYgUENDUlhUT19NQVNLKSB8CisJCQkoKFBDQ19QMl9DTlQgPDwgUENDUlhfU0hJRlQpICYgUENDUlhfTUFTSykpOworCQlicmVhazsKKwljYXNlIFBDQ19QMzoKKwkJandyaXRlMzIoam1lLCBKTUVfUENDUlgwLAorCQkJKChQQ0NfUDNfVE8gPDwgUENDUlhUT19TSElGVCkgJiBQQ0NSWFRPX01BU0spIHwKKwkJCSgoUENDX1AzX0NOVCA8PCBQQ0NSWF9TSElGVCkgJiBQQ0NSWF9NQVNLKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwl3bWIoKTsKKworCWlmICghKHRlc3RfYml0KEpNRV9GTEFHX1BPTEwsICZqbWUtPmZsYWdzKSkpCisJCW1zZ19yeF9zdGF0dXMoam1lLCAiU3dpdGNoZWQgdG8gUENDX1AlZFxuIiwgcCk7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfc3RhcnRfaXJxKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXJlZ2lzdGVyIHN0cnVjdCBkeW5wY2NfaW5mbyAqZHBpID0gJihqbWUtPmRwaSk7CisKKwlqbWVfc2V0X3J4X3BjYyhqbWUsIFBDQ19QMSk7CisJZHBpLT5jdXIJCT0gUENDX1AxOworCWRwaS0+YXR0ZW1wdAkJPSBQQ0NfUDE7CisJZHBpLT5jbnQJCT0gMDsKKworCWp3cml0ZTMyKGptZSwgSk1FX1BDQ1RYLAorCQkJKChQQ0NfVFhfVE8gPDwgUENDVFhUT19TSElGVCkgJiBQQ0NUWFRPX01BU0spIHwKKwkJCSgoUENDX1RYX0NOVCA8PCBQQ0NUWF9TSElGVCkgJiBQQ0NUWF9NQVNLKSB8CisJCQlQQ0NUWFEwX0VOCisJCSk7CisKKwkvKgorCSAqIEVuYWJsZSBJbnRlcnJ1cHRzCisJICovCisJandyaXRlMzIoam1lLCBKTUVfSUVOUywgSU5UUl9FTkFCTEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9zdG9wX2lycShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwkvKgorCSAqIERpc2FibGUgSW50ZXJydXB0cworCSAqLworCWp3cml0ZTMyZihqbWUsIEpNRV9JRU5DLCBJTlRSX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX2VuYWJsZV9zaGFkb3coc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJandyaXRlMzIoam1lLAorCQkgSk1FX1NIQkFfTE8sCisJCSAoKHUzMilqbWUtPnNoYWRvd19kbWEgJiB+KCh1MzIpMHgxRikpIHwgU0hCQV9QT1NURU4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9kaXNhYmxlX3NoYWRvdyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqd3JpdGUzMihqbWUsIEpNRV9TSEJBX0xPLCAweDApOworfQorCitzdGF0aWMgdTMyCitqbWVfbGlua3N0YXRfZnJvbV9waHkoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJdTMyIHBoeWxpbmssIGJtc3I7CisKKwlwaHlsaW5rID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCAxNyk7CisJYm1zciA9IGptZV9tZGlvX3JlYWQoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNU1IpOworCWlmIChibXNyICYgQk1TUl9BTkNPTVApCisJCXBoeWxpbmsgfD0gUEhZX0xJTktfQVVUT05FR19DT01QTEVURTsKKworCXJldHVybiBwaHlsaW5rOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9zZXRfcGh5Zmlmb2Eoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgMjcsIDB4MDAwNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3NldF9waHlmaWZvYihzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqbWVfbWRpb193cml0ZShqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCAyNywgMHgwMDAwKTsKK30KKworc3RhdGljIGludAoram1lX2NoZWNrX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHRlc3Rvbmx5KQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgcGh5bGluaywgZ2hjLCBjbnQgPSBKTUVfU1BEUlNWX1RJTUVPVVQsIGJtY3IsIGdwcmVnMTsKKwljaGFyIGxpbmttc2dbNjRdOworCWludCByYyA9IDA7CisKKwlsaW5rbXNnWzBdID0gJ1wwJzsKKworCWlmIChqbWUtPmZwZ2F2ZXIpCisJCXBoeWxpbmsgPSBqbWVfbGlua3N0YXRfZnJvbV9waHkoam1lKTsKKwllbHNlCisJCXBoeWxpbmsgPSBqcmVhZDMyKGptZSwgSk1FX1BIWV9MSU5LKTsKKworCWlmIChwaHlsaW5rICYgUEhZX0xJTktfVVApIHsKKwkJaWYgKCEocGh5bGluayAmIFBIWV9MSU5LX0FVVE9ORUdfQ09NUExFVEUpKSB7CisJCQkvKgorCQkJICogSWYgd2UgZGlkIG5vdCBlbmFibGUgQU4KKwkJCSAqIFNwZWVkL0R1cGxleCBJbmZvIHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIFNNSQorCQkJICovCisJCQlwaHlsaW5rID0gUEhZX0xJTktfVVA7CisKKwkJCWJtY3IgPSBqbWVfbWRpb19yZWFkKGptZS0+ZGV2LAorCQkJCQkJam1lLT5taWlfaWYucGh5X2lkLAorCQkJCQkJTUlJX0JNQ1IpOworCisJCQlwaHlsaW5rIHw9ICgoYm1jciAmIEJNQ1JfU1BFRUQxMDAwKSAmJgorCQkJCQkoYm1jciAmIEJNQ1JfU1BFRUQxMDApID09IDApID8KKwkJCQkJUEhZX0xJTktfU1BFRURfMTAwME0gOgorCQkJCQkoYm1jciAmIEJNQ1JfU1BFRUQxMDApID8KKwkJCQkJUEhZX0xJTktfU1BFRURfMTAwTSA6CisJCQkJCVBIWV9MSU5LX1NQRUVEXzEwTTsKKworCQkJcGh5bGluayB8PSAoYm1jciAmIEJNQ1JfRlVMTERQTFgpID8KKwkJCQkJIFBIWV9MSU5LX0RVUExFWCA6IDA7CisKKwkJCXN0cmNhdChsaW5rbXNnLCAiRm9yY2VkOiAiKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBLZWVwIHBvbGxpbmcgZm9yIHNwZWVkL2R1cGxleCByZXNvbHZlIGNvbXBsZXRlCisJCQkgKi8KKwkJCXdoaWxlICghKHBoeWxpbmsgJiBQSFlfTElOS19TUEVFRERQVV9SRVNPTFZFRCkgJiYKKwkJCQktLWNudCkgeworCisJCQkJdWRlbGF5KDEpOworCisJCQkJaWYgKGptZS0+ZnBnYXZlcikKKwkJCQkJcGh5bGluayA9IGptZV9saW5rc3RhdF9mcm9tX3BoeShqbWUpOworCQkJCWVsc2UKKwkJCQkJcGh5bGluayA9IGpyZWFkMzIoam1lLCBKTUVfUEhZX0xJTkspOworCQkJfQorCQkJaWYgKCFjbnQpCisJCQkJamVwcmludGsoam1lLT5wZGV2LAorCQkJCQkiV2FpdGluZyBzcGVlZCByZXNvbHZlIHRpbWVvdXQuXG4iKTsKKworCQkJc3RyY2F0KGxpbmttc2csICJBTmVkOiAiKTsKKwkJfQorCisJCWlmIChqbWUtPnBoeWxpbmsgPT0gcGh5bGluaykgeworCQkJcmMgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHRlc3Rvbmx5KQorCQkJZ290byBvdXQ7CisKKwkJam1lLT5waHlsaW5rID0gcGh5bGluazsKKworCQlnaGMgPSBqbWUtPnJlZ19naGMgJiB+KEdIQ19TUEVFRF8xME0gfAorCQkJCQlHSENfU1BFRURfMTAwTSB8CisJCQkJCUdIQ19TUEVFRF8xMDAwTSB8CisJCQkJCUdIQ19EUFgpOworCQlzd2l0Y2ggKHBoeWxpbmsgJiBQSFlfTElOS19TUEVFRF9NQVNLKSB7CisJCWNhc2UgUEhZX0xJTktfU1BFRURfMTBNOgorCQkJZ2hjIHw9IEdIQ19TUEVFRF8xME07CisJCQlzdHJjYXQobGlua21zZywgIjEwIE1icHMsICIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0xJTktfU1BFRURfMTAwTToKKwkJCWdoYyB8PSBHSENfU1BFRURfMTAwTTsKKwkJCXN0cmNhdChsaW5rbXNnLCAiMTAwIE1icHMsICIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0xJTktfU1BFRURfMTAwME06CisJCQlnaGMgfD0gR0hDX1NQRUVEXzEwMDBNOworCQkJc3RyY2F0KGxpbmttc2csICIxMDAwIE1icHMsICIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwaHlsaW5rICYgUEhZX0xJTktfRFVQTEVYKSB7CisJCQlqd3JpdGUzMihqbWUsIEpNRV9UWE1DUywgVFhNQ1NfREVGQVVMVCk7CisJCQlnaGMgfD0gR0hDX0RQWDsKKwkJfSBlbHNlIHsKKwkJCWp3cml0ZTMyKGptZSwgSk1FX1RYTUNTLCBUWE1DU19ERUZBVUxUIHwKKwkJCQkJCVRYTUNTX0JBQ0tPRkYgfAorCQkJCQkJVFhNQ1NfQ0FSUklFUlNFTlNFIHwKKwkJCQkJCVRYTUNTX0NPTExJU0lPTik7CisJCQlqd3JpdGUzMihqbWUsIEpNRV9UWFRSSEQsIFRYVFJIRF9UWFBFTiB8CisJCQkJKCgweDIwMDAgPDwgVFhUUkhEX1RYUF9TSElGVCkgJiBUWFRSSERfVFhQKSB8CisJCQkJVFhUUkhEX1RYUkVOIHwKKwkJCQkoKDggPDwgVFhUUkhEX1RYUkxfU0hJRlQpICYgVFhUUkhEX1RYUkwpKTsKKwkJfQorCQlzdHJjYXQobGlua21zZywgKHBoeWxpbmsgJiBQSFlfTElOS19EVVBMRVgpID8KKwkJCQkJIkZ1bGwtRHVwbGV4LCAiIDoKKwkJCQkJIkhhbGYtRHVwbGV4LCAiKTsKKworCQlpZiAocGh5bGluayAmIFBIWV9MSU5LX01ESV9TVEFUKQorCQkJc3RyY2F0KGxpbmttc2csICJNREktWCIpOworCQllbHNlCisJCQlzdHJjYXQobGlua21zZywgIk1ESSIpOworCisJCWdwcmVnMSA9IEdQUkVHMV9ERUZBVUxUOworCQlpZiAoaXNfYnVnZ3kyNTAoam1lLT5wZGV2LT5kZXZpY2UsIGptZS0+Y2hpcHJldikpIHsKKwkJCWlmICghKHBoeWxpbmsgJiBQSFlfTElOS19EVVBMRVgpKQorCQkJCWdwcmVnMSB8PSBHUFJFRzFfSEFMRk1PREVQQVRDSDsKKwkJCXN3aXRjaCAocGh5bGluayAmIFBIWV9MSU5LX1NQRUVEX01BU0spIHsKKwkJCWNhc2UgUEhZX0xJTktfU1BFRURfMTBNOgorCQkJCWptZV9zZXRfcGh5Zmlmb2Eoam1lKTsKKwkJCQlncHJlZzEgfD0gR1BSRUcxX1JTU1BBVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfTElOS19TUEVFRF8xMDBNOgorCQkJCWptZV9zZXRfcGh5Zmlmb2Ioam1lKTsKKwkJCQlncHJlZzEgfD0gR1BSRUcxX1JTU1BBVENIOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfTElOS19TUEVFRF8xMDAwTToKKwkJCQlqbWVfc2V0X3BoeWZpZm9hKGptZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWp3cml0ZTMyKGptZSwgSk1FX0dQUkVHMSwgZ3ByZWcxKTsKKworCQlqbWUtPnJlZ19naGMgPSBnaGM7CisJCWp3cml0ZTMyKGptZSwgSk1FX0dIQywgZ2hjKTsKKworCQltc2dfbGluayhqbWUsICJMaW5rIGlzIHVwIGF0ICVzLlxuIiwgbGlua21zZyk7CisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwl9IGVsc2UgeworCQlpZiAodGVzdG9ubHkpCisJCQlnb3RvIG91dDsKKworCQltc2dfbGluayhqbWUsICJMaW5rIGlzIGRvd24uXG4iKTsKKwkJam1lLT5waHlsaW5rID0gMDsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJc3RydWN0IGptZV9yaW5nICp0eHJpbmcgPSAmKGptZS0+dHhyaW5nWzBdKTsKKworCXR4cmluZy0+YWxsb2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoJihqbWUtPnBkZXYtPmRldiksCisJCQkJICAgVFhfUklOR19BTExPQ19TSVpFKGptZS0+dHhfcmluZ19zaXplKSwKKwkJCQkgICAmKHR4cmluZy0+ZG1hYWxsb2MpLAorCQkJCSAgIEdGUF9BVE9NSUMpOworCisJaWYgKCF0eHJpbmctPmFsbG9jKSB7CisJCXR4cmluZy0+ZGVzYyA9IE5VTEw7CisJCXR4cmluZy0+ZG1hYWxsb2MgPSAwOworCQl0eHJpbmctPmRtYSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogMTYgQnl0ZXMgYWxpZ24KKwkgKi8KKwl0eHJpbmctPmRlc2MJCT0gKHZvaWQgKilBTElHTigodW5zaWduZWQgbG9uZykodHhyaW5nLT5hbGxvYyksCisJCQkJCQlSSU5HX0RFU0NfQUxJR04pOworCXR4cmluZy0+ZG1hCQk9IEFMSUdOKHR4cmluZy0+ZG1hYWxsb2MsIFJJTkdfREVTQ19BTElHTik7CisJdHhyaW5nLT5uZXh0X3RvX3VzZQk9IDA7CisJYXRvbWljX3NldCgmdHhyaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKwlhdG9taWNfc2V0KCZ0eHJpbmctPm5yX2ZyZWUsIGptZS0+dHhfcmluZ19zaXplKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBUcmFuc21pdCBEZXNjcmlwdG9ycworCSAqLworCW1lbXNldCh0eHJpbmctPmFsbG9jLCAwLCBUWF9SSU5HX0FMTE9DX1NJWkUoam1lLT50eF9yaW5nX3NpemUpKTsKKwltZW1zZXQodHhyaW5nLT5idWZpbmYsIDAsCisJCXNpemVvZihzdHJ1Y3Qgam1lX2J1ZmZlcl9pbmZvKSAqIGptZS0+dHhfcmluZ19zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCWludCBpOworCXN0cnVjdCBqbWVfcmluZyAqdHhyaW5nID0gJihqbWUtPnR4cmluZ1swXSk7CisJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqdHhiaSA9IHR4cmluZy0+YnVmaW5mOworCisJaWYgKHR4cmluZy0+YWxsb2MpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBqbWUtPnR4X3Jpbmdfc2l6ZSA7ICsraSkgeworCQkJdHhiaSA9IHR4cmluZy0+YnVmaW5mICsgaTsKKwkJCWlmICh0eGJpLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHR4YmktPnNrYik7CisJCQkJdHhiaS0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCXR4YmktPm1hcHBpbmcJCT0gMDsKKwkJCXR4YmktPmxlbgkJPSAwOworCQkJdHhiaS0+bnJfZGVzYwkJPSAwOworCQkJdHhiaS0+c3RhcnRfeG1pdAk9IDA7CisJCX0KKworCQlkbWFfZnJlZV9jb2hlcmVudCgmKGptZS0+cGRldi0+ZGV2KSwKKwkJCQkgIFRYX1JJTkdfQUxMT0NfU0laRShqbWUtPnR4X3Jpbmdfc2l6ZSksCisJCQkJICB0eHJpbmctPmFsbG9jLAorCQkJCSAgdHhyaW5nLT5kbWFhbGxvYyk7CisKKwkJdHhyaW5nLT5hbGxvYwkJPSBOVUxMOworCQl0eHJpbmctPmRlc2MJCT0gTlVMTDsKKwkJdHhyaW5nLT5kbWFhbGxvYwk9IDA7CisJCXR4cmluZy0+ZG1hCQk9IDA7CisJfQorCXR4cmluZy0+bmV4dF90b191c2UJPSAwOworCWF0b21pY19zZXQoJnR4cmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisJYXRvbWljX3NldCgmdHhyaW5nLT5ucl9mcmVlLCAwKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9lbmFibGVfdHhfZW5naW5lKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCS8qCisJICogU2VsZWN0IFF1ZXVlIDAKKwkgKi8KKwlqd3JpdGUzMihqbWUsIEpNRV9UWENTLCBUWENTX0RFRkFVTFQgfCBUWENTX1NFTEVDVF9RVUVVRTApOworCXdtYigpOworCisJLyoKKwkgKiBTZXR1cCBUWCBRdWV1ZSAwIERNQSBCYXNzIEFkZHJlc3MKKwkgKi8KKwlqd3JpdGUzMihqbWUsIEpNRV9UWERCQV9MTywgKF9fdTY0KWptZS0+dHhyaW5nWzBdLmRtYSAmIDB4RkZGRkZGRkZVTCk7CisJandyaXRlMzIoam1lLCBKTUVfVFhEQkFfSEksIChfX3U2NCkoam1lLT50eHJpbmdbMF0uZG1hKSA+PiAzMik7CisJandyaXRlMzIoam1lLCBKTUVfVFhOREEsIChfX3U2NClqbWUtPnR4cmluZ1swXS5kbWEgJiAweEZGRkZGRkZGVUwpOworCisJLyoKKwkgKiBTZXR1cCBUWCBEZXNjcHRvciBDb3VudAorCSAqLworCWp3cml0ZTMyKGptZSwgSk1FX1RYUURDLCBqbWUtPnR4X3Jpbmdfc2l6ZSk7CisKKwkvKgorCSAqIEVuYWJsZSBUWCBFbmdpbmUKKwkgKi8KKwl3bWIoKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9UWENTLCBqbWUtPnJlZ190eGNzIHwKKwkJCQlUWENTX1NFTEVDVF9RVUVVRTAgfAorCQkJCVRYQ1NfRU5BQkxFKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9yZXN0YXJ0X3R4X2VuZ2luZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwkvKgorCSAqIFJlc3RhcnQgVFggRW5naW5lCisJICovCisJandyaXRlMzIoam1lLCBKTUVfVFhDUywgam1lLT5yZWdfdHhjcyB8CisJCQkJVFhDU19TRUxFQ1RfUVVFVUUwIHwKKwkJCQlUWENTX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX2Rpc2FibGVfdHhfZW5naW5lKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCWludCBpOworCXUzMiB2YWw7CisKKwkvKgorCSAqIERpc2FibGUgVFggRW5naW5lCisJICovCisJandyaXRlMzIoam1lLCBKTUVfVFhDUywgam1lLT5yZWdfdHhjcyB8IFRYQ1NfU0VMRUNUX1FVRVVFMCk7CisJd21iKCk7CisKKwl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1RYQ1MpOworCWZvciAoaSA9IEpNRV9UWF9ESVNBQkxFX1RJTUVPVVQgOyAodmFsICYgVFhDU19FTkFCTEUpICYmIGkgPiAwIDsgLS1pKSB7CisJCW1kZWxheSgxKTsKKwkJdmFsID0ganJlYWQzMihqbWUsIEpNRV9UWENTKTsKKwkJcm1iKCk7CisJfQorCisJaWYgKCFpKQorCQlqZXByaW50ayhqbWUtPnBkZXYsICJEaXNhYmxlIFRYIGVuZ2luZSB0aW1lb3V0LlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfc2V0X2NsZWFuX3J4ZGVzYyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgaW50IGkpCit7CisJc3RydWN0IGptZV9yaW5nICpyeHJpbmcgPSBqbWUtPnJ4cmluZzsKKwlyZWdpc3RlciBzdHJ1Y3QgcnhkZXNjICpyeGRlc2MgPSByeHJpbmctPmRlc2M7CisJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqcnhiaSA9IHJ4cmluZy0+YnVmaW5mOworCXJ4ZGVzYyArPSBpOworCXJ4YmkgKz0gaTsKKworCXJ4ZGVzYy0+ZHdbMF0gPSAwOworCXJ4ZGVzYy0+ZHdbMV0gPSAwOworCXJ4ZGVzYy0+ZGVzYzEuYnVmYWRkcmgJPSBjcHVfdG9fbGUzMigoX191NjQpcnhiaS0+bWFwcGluZyA+PiAzMik7CisJcnhkZXNjLT5kZXNjMS5idWZhZGRybAk9IGNwdV90b19sZTMyKAorCQkJCQkoX191NjQpcnhiaS0+bWFwcGluZyAmIDB4RkZGRkZGRkZVTCk7CisJcnhkZXNjLT5kZXNjMS5kYXRhbGVuCT0gY3B1X3RvX2xlMTYocnhiaS0+bGVuKTsKKwlpZiAoam1lLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9ISUdIRE1BKQorCQlyeGRlc2MtPmRlc2MxLmZsYWdzID0gUlhGTEFHXzY0QklUOworCXdtYigpOworCXJ4ZGVzYy0+ZGVzYzEuZmxhZ3MJfD0gUlhGTEFHX09XTiB8IFJYRkxBR19JTlQ7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9tYWtlX25ld19yeF9idWYoc3RydWN0IGptZV9hZGFwdGVyICpqbWUsIGludCBpKQoreworCXN0cnVjdCBqbWVfcmluZyAqcnhyaW5nID0gJihqbWUtPnJ4cmluZ1swXSk7CisJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqcnhiaSA9IHJ4cmluZy0+YnVmaW5mICsgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihqbWUtPmRldiwKKwkJam1lLT5kZXYtPm10dSArIFJYX0VYVFJBX0xFTik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ4YmktPnNrYiA9IHNrYjsKKwlyeGJpLT5sZW4gPSBza2JfdGFpbHJvb20oc2tiKTsKKwlyeGJpLT5tYXBwaW5nID0gcGNpX21hcF9wYWdlKGptZS0+cGRldiwKKwkJCQkJdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkJCW9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksCisJCQkJCXJ4YmktPmxlbiwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX2ZyZWVfcnhfYnVmKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCBpbnQgaSkKK3sKKwlzdHJ1Y3Qgam1lX3JpbmcgKnJ4cmluZyA9ICYoam1lLT5yeHJpbmdbMF0pOworCXN0cnVjdCBqbWVfYnVmZmVyX2luZm8gKnJ4YmkgPSByeHJpbmctPmJ1ZmluZjsKKwlyeGJpICs9IGk7CisKKwlpZiAocnhiaS0+c2tiKSB7CisJCXBjaV91bm1hcF9wYWdlKGptZS0+cGRldiwKKwkJCQkgcnhiaS0+bWFwcGluZywKKwkJCQkgcnhiaS0+bGVuLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiKHJ4YmktPnNrYik7CisJCXJ4YmktPnNrYiA9IE5VTEw7CisJCXJ4YmktPm1hcHBpbmcgPSAwOworCQlyeGJpLT5sZW4gPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK2ptZV9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgam1lX3JpbmcgKnJ4cmluZyA9ICYoam1lLT5yeHJpbmdbMF0pOworCisJaWYgKHJ4cmluZy0+YWxsb2MpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBqbWUtPnJ4X3Jpbmdfc2l6ZSA7ICsraSkKKwkJCWptZV9mcmVlX3J4X2J1ZihqbWUsIGkpOworCisJCWRtYV9mcmVlX2NvaGVyZW50KCYoam1lLT5wZGV2LT5kZXYpLAorCQkJCSAgUlhfUklOR19BTExPQ19TSVpFKGptZS0+cnhfcmluZ19zaXplKSwKKwkJCQkgIHJ4cmluZy0+YWxsb2MsCisJCQkJICByeHJpbmctPmRtYWFsbG9jKTsKKwkJcnhyaW5nLT5hbGxvYyAgICA9IE5VTEw7CisJCXJ4cmluZy0+ZGVzYyAgICAgPSBOVUxMOworCQlyeHJpbmctPmRtYWFsbG9jID0gMDsKKwkJcnhyaW5nLT5kbWEgICAgICA9IDA7CisJfQorCXJ4cmluZy0+bmV4dF90b191c2UgICA9IDA7CisJYXRvbWljX3NldCgmcnhyaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworc3RhdGljIGludAoram1lX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgam1lX3JpbmcgKnJ4cmluZyA9ICYoam1lLT5yeHJpbmdbMF0pOworCisJcnhyaW5nLT5hbGxvYyA9IGRtYV9hbGxvY19jb2hlcmVudCgmKGptZS0+cGRldi0+ZGV2KSwKKwkJCQkgICBSWF9SSU5HX0FMTE9DX1NJWkUoam1lLT5yeF9yaW5nX3NpemUpLAorCQkJCSAgICYocnhyaW5nLT5kbWFhbGxvYyksCisJCQkJICAgR0ZQX0FUT01JQyk7CisJaWYgKCFyeHJpbmctPmFsbG9jKSB7CisJCXJ4cmluZy0+ZGVzYyA9IE5VTEw7CisJCXJ4cmluZy0+ZG1hYWxsb2MgPSAwOworCQlyeHJpbmctPmRtYSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogMTYgQnl0ZXMgYWxpZ24KKwkgKi8KKwlyeHJpbmctPmRlc2MJCT0gKHZvaWQgKilBTElHTigodW5zaWduZWQgbG9uZykocnhyaW5nLT5hbGxvYyksCisJCQkJCQlSSU5HX0RFU0NfQUxJR04pOworCXJ4cmluZy0+ZG1hCQk9IEFMSUdOKHJ4cmluZy0+ZG1hYWxsb2MsIFJJTkdfREVTQ19BTElHTik7CisJcnhyaW5nLT5uZXh0X3RvX3VzZQk9IDA7CisJYXRvbWljX3NldCgmcnhyaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKworCS8qCisJICogSW5pdGlhbGxpemUgUmVjZWl2ZSBEZXNjcmlwdG9ycworCSAqLworCWZvciAoaSA9IDAgOyBpIDwgam1lLT5yeF9yaW5nX3NpemUgOyArK2kpIHsKKwkJaWYgKHVubGlrZWx5KGptZV9tYWtlX25ld19yeF9idWYoam1lLCBpKSkpIHsKKwkJCWptZV9mcmVlX3J4X3Jlc291cmNlcyhqbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlqbWVfc2V0X2NsZWFuX3J4ZGVzYyhqbWUsIGkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9lbmFibGVfcnhfZW5naW5lKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCS8qCisJICogU2VsZWN0IFF1ZXVlIDAKKwkgKi8KKwlqd3JpdGUzMihqbWUsIEpNRV9SWENTLCBqbWUtPnJlZ19yeGNzIHwKKwkJCQlSWENTX1FVRVVFU0VMX1EwKTsKKwl3bWIoKTsKKworCS8qCisJICogU2V0dXAgUlggRE1BIEJhc3MgQWRkcmVzcworCSAqLworCWp3cml0ZTMyKGptZSwgSk1FX1JYREJBX0xPLCAoX191NjQpam1lLT5yeHJpbmdbMF0uZG1hICYgMHhGRkZGRkZGRlVMKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9SWERCQV9ISSwgKF9fdTY0KShqbWUtPnJ4cmluZ1swXS5kbWEpID4+IDMyKTsKKwlqd3JpdGUzMihqbWUsIEpNRV9SWE5EQSwgKF9fdTY0KWptZS0+cnhyaW5nWzBdLmRtYSAmIDB4RkZGRkZGRkZVTCk7CisKKwkvKgorCSAqIFNldHVwIFJYIERlc2NyaXB0b3IgQ291bnQKKwkgKi8KKwlqd3JpdGUzMihqbWUsIEpNRV9SWFFEQywgam1lLT5yeF9yaW5nX3NpemUpOworCisJLyoKKwkgKiBTZXR1cCBVbmljYXN0IEZpbHRlcgorCSAqLworCWptZV9zZXRfbXVsdGkoam1lLT5kZXYpOworCisJLyoKKwkgKiBFbmFibGUgUlggRW5naW5lCisJICovCisJd21iKCk7CisJandyaXRlMzIoam1lLCBKTUVfUlhDUywgam1lLT5yZWdfcnhjcyB8CisJCQkJUlhDU19RVUVVRVNFTF9RMCB8CisJCQkJUlhDU19FTkFCTEUgfAorCQkJCVJYQ1NfUVNUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitqbWVfcmVzdGFydF9yeF9lbmdpbmUoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJLyoKKwkgKiBTdGFydCBSWCBFbmdpbmUKKwkgKi8KKwlqd3JpdGUzMihqbWUsIEpNRV9SWENTLCBqbWUtPnJlZ19yeGNzIHwKKwkJCQlSWENTX1FVRVVFU0VMX1EwIHwKKwkJCQlSWENTX0VOQUJMRSB8CisJCQkJUlhDU19RU1QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9kaXNhYmxlX3J4X2VuZ2luZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlpbnQgaTsKKwl1MzIgdmFsOworCisJLyoKKwkgKiBEaXNhYmxlIFJYIEVuZ2luZQorCSAqLworCWp3cml0ZTMyKGptZSwgSk1FX1JYQ1MsIGptZS0+cmVnX3J4Y3MpOworCXdtYigpOworCisJdmFsID0ganJlYWQzMihqbWUsIEpNRV9SWENTKTsKKwlmb3IgKGkgPSBKTUVfUlhfRElTQUJMRV9USU1FT1VUIDsgKHZhbCAmIFJYQ1NfRU5BQkxFKSAmJiBpID4gMCA7IC0taSkgeworCQltZGVsYXkoMSk7CisJCXZhbCA9IGpyZWFkMzIoam1lLCBKTUVfUlhDUyk7CisJCXJtYigpOworCX0KKworCWlmICghaSkKKwkJamVwcmludGsoam1lLT5wZGV2LCAiRGlzYWJsZSBSWCBlbmdpbmUgdGltZW91dC5cbiIpOworCit9CisKK3N0YXRpYyBpbnQKK2ptZV9yeHN1bV9vayhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTE2IGZsYWdzKQoreworCWlmICghKGZsYWdzICYgKFJYV0JGTEFHX1RDUE9OIHwgUlhXQkZMQUdfVURQT04gfCBSWFdCRkxBR19JUFY0KSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh1bmxpa2VseSghKGZsYWdzICYgUlhXQkZMQUdfTUYpICYmCisJKGZsYWdzICYgUlhXQkZMQUdfVENQT04pICYmICEoZmxhZ3MgJiBSWFdCRkxBR19UQ1BDUykpKSB7CisJCW1zZ19yeF9lcnIoam1lLCAiVENQIENoZWNrc3VtIGVycm9yLlxuIik7CisJCWdvdG8gb3V0X3N1bWVycjsKKwl9CisKKwlpZiAodW5saWtlbHkoIShmbGFncyAmIFJYV0JGTEFHX01GKSAmJgorCShmbGFncyAmIFJYV0JGTEFHX1VEUE9OKSAmJiAhKGZsYWdzICYgUlhXQkZMQUdfVURQQ1MpKSkgeworCQltc2dfcnhfZXJyKGptZSwgIlVEUCBDaGVja3N1bSBlcnJvci5cbiIpOworCQlnb3RvIG91dF9zdW1lcnI7CisJfQorCisJaWYgKHVubGlrZWx5KChmbGFncyAmIFJYV0JGTEFHX0lQVjQpICYmICEoZmxhZ3MgJiBSWFdCRkxBR19JUENTKSkpIHsKKwkJbXNnX3J4X2VycihqbWUsICJJUHY0IENoZWNrc3VtIGVycm9yLlxuIik7CisJCWdvdG8gb3V0X3N1bWVycjsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKKworb3V0X3N1bWVycjoKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfYWxsb2NfYW5kX2ZlZWRfc2tiKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCBpbnQgaWR4KQoreworCXN0cnVjdCBqbWVfcmluZyAqcnhyaW5nID0gJihqbWUtPnJ4cmluZ1swXSk7CisJc3RydWN0IHJ4ZGVzYyAqcnhkZXNjID0gcnhyaW5nLT5kZXNjOworCXN0cnVjdCBqbWVfYnVmZmVyX2luZm8gKnJ4YmkgPSByeHJpbmctPmJ1ZmluZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBmcmFtZXNpemU7CisKKwlyeGRlc2MgKz0gaWR4OworCXJ4YmkgKz0gaWR4OworCisJc2tiID0gcnhiaS0+c2tiOworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShqbWUtPnBkZXYsCisJCQkJCXJ4YmktPm1hcHBpbmcsCisJCQkJCXJ4YmktPmxlbiwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCWlmICh1bmxpa2VseShqbWVfbWFrZV9uZXdfcnhfYnVmKGptZSwgaWR4KSkpIHsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGptZS0+cGRldiwKKwkJCQkJCXJ4YmktPm1hcHBpbmcsCisJCQkJCQlyeGJpLT5sZW4sCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCSsrKE5FVF9TVEFUKGptZSkucnhfZHJvcHBlZCk7CisJfSBlbHNlIHsKKwkJZnJhbWVzaXplID0gbGUxNl90b19jcHUocnhkZXNjLT5kZXNjd2IuZnJhbWVzaXplKQorCQkJCS0gUlhfUFJFUEFEX1NJWkU7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBSWF9QUkVQQURfU0laRSk7CisJCXNrYl9wdXQoc2tiLCBmcmFtZXNpemUpOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBqbWUtPmRldik7CisKKwkJaWYgKGptZV9yeHN1bV9vayhqbWUsIHJ4ZGVzYy0+ZGVzY3diLmZsYWdzKSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQlpZiAocnhkZXNjLT5kZXNjd2IuZmxhZ3MgJiBSWFdCRkxBR19UQUdPTikgeworCQkJaWYgKGptZS0+dmxncnApIHsKKwkJCQlqbWUtPmptZV92bGFuX3J4KHNrYiwgam1lLT52bGdycCwKKwkJCQkJbGUzMl90b19jcHUocnhkZXNjLT5kZXNjd2IudmxhbikpOworCQkJCU5FVF9TVEFUKGptZSkucnhfYnl0ZXMgKz0gNDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWptZS0+am1lX3J4KHNrYik7CisJCX0KKworCQlpZiAoKGxlMTZfdG9fY3B1KHJ4ZGVzYy0+ZGVzY3diLmZsYWdzKSAmIFJYV0JGTEFHX0RFU1QpID09CisJCQkJUlhXQkZMQUdfREVTVF9NVUwpCisJCQkrKyhORVRfU1RBVChqbWUpLm11bHRpY2FzdCk7CisKKwkJam1lLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlORVRfU1RBVChqbWUpLnJ4X2J5dGVzICs9IGZyYW1lc2l6ZTsKKwkJKysoTkVUX1NUQVQoam1lKS5yeF9wYWNrZXRzKTsKKwl9CisKKwlqbWVfc2V0X2NsZWFuX3J4ZGVzYyhqbWUsIGlkeCk7CisKK30KKworc3RhdGljIGludAoram1lX3Byb2Nlc3NfcmVjZWl2ZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgaW50IGxpbWl0KQoreworCXN0cnVjdCBqbWVfcmluZyAqcnhyaW5nID0gJihqbWUtPnJ4cmluZ1swXSk7CisJc3RydWN0IHJ4ZGVzYyAqcnhkZXNjID0gcnhyaW5nLT5kZXNjOworCWludCBpLCBqLCBjY250LCBkZXNjY250LCBtYXNrID0gam1lLT5yeF9yaW5nX21hc2s7CisKKwlpZiAodW5saWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmptZS0+cnhfY2xlYW5pbmcpKSkKKwkJZ290byBvdXRfaW5jOworCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZqbWUtPmxpbmtfY2hhbmdpbmcpICE9IDEpKQorCQlnb3RvIG91dF9pbmM7CisKKwlpZiAodW5saWtlbHkoIW5ldGlmX2NhcnJpZXJfb2soam1lLT5kZXYpKSkKKwkJZ290byBvdXRfaW5jOworCisJaSA9IGF0b21pY19yZWFkKCZyeHJpbmctPm5leHRfdG9fY2xlYW4pOworCXdoaWxlIChsaW1pdC0tID4gMCkgeworCQlyeGRlc2MgPSByeHJpbmctPmRlc2M7CisJCXJ4ZGVzYyArPSBpOworCisJCWlmICgocnhkZXNjLT5kZXNjd2IuZmxhZ3MgJiBSWFdCRkxBR19PV04pIHx8CisJCSEocnhkZXNjLT5kZXNjd2IuZGVzY2NudCAmIFJYV0JEQ05UX1dCQ1BMKSkKKwkJCWdvdG8gb3V0OworCisJCWRlc2NjbnQgPSByeGRlc2MtPmRlc2N3Yi5kZXNjY250ICYgUlhXQkRDTlRfRENOVDsKKworCQlpZiAodW5saWtlbHkoZGVzY2NudCA+IDEgfHwKKwkJcnhkZXNjLT5kZXNjd2IuZXJyc3RhdCAmIFJYV0JFUlJfQUxMRVJSKSkgeworCisJCQlpZiAocnhkZXNjLT5kZXNjd2IuZXJyc3RhdCAmIFJYV0JFUlJfQ1JDRVJSKQorCQkJCSsrKE5FVF9TVEFUKGptZSkucnhfY3JjX2Vycm9ycyk7CisJCQllbHNlIGlmIChyeGRlc2MtPmRlc2N3Yi5lcnJzdGF0ICYgUlhXQkVSUl9PVkVSVU4pCisJCQkJKysoTkVUX1NUQVQoam1lKS5yeF9maWZvX2Vycm9ycyk7CisJCQllbHNlCisJCQkJKysoTkVUX1NUQVQoam1lKS5yeF9lcnJvcnMpOworCisJCQlpZiAoZGVzY2NudCA+IDEpCisJCQkJbGltaXQgLT0gZGVzY2NudCAtIDE7CisKKwkJCWZvciAoaiA9IGksIGNjbnQgPSBkZXNjY250IDsgY2NudC0tIDsgKSB7CisJCQkJam1lX3NldF9jbGVhbl9yeGRlc2Moam1lLCBqKTsKKwkJCQlqID0gKGogKyAxKSAmIChtYXNrKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJam1lX2FsbG9jX2FuZF9mZWVkX3NrYihqbWUsIGkpOworCQl9CisKKwkJaSA9IChpICsgZGVzY2NudCkgJiAobWFzayk7CisJfQorCitvdXQ6CisJYXRvbWljX3NldCgmcnhyaW5nLT5uZXh0X3RvX2NsZWFuLCBpKTsKKworb3V0X2luYzoKKwlhdG9taWNfaW5jKCZqbWUtPnJ4X2NsZWFuaW5nKTsKKworCXJldHVybiBsaW1pdCA+IDAgPyBsaW1pdCA6IDA7CisKK30KKworc3RhdGljIHZvaWQKK2ptZV9hdHRlbXB0X3BjYyhzdHJ1Y3QgZHlucGNjX2luZm8gKmRwaSwgaW50IGF0bXApCit7CisJaWYgKGxpa2VseShhdG1wID09IGRwaS0+Y3VyKSkgeworCQlkcGktPmNudCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZHBpLT5hdHRlbXB0ID09IGF0bXApIHsKKwkJKysoZHBpLT5jbnQpOworCX0gZWxzZSB7CisJCWRwaS0+YXR0ZW1wdCA9IGF0bXA7CisJCWRwaS0+Y250ID0gMDsKKwl9CisKK30KKworc3RhdGljIHZvaWQKK2ptZV9keW5hbWljX3BjYyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgZHlucGNjX2luZm8gKmRwaSA9ICYoam1lLT5kcGkpOworCisJaWYgKChORVRfU1RBVChqbWUpLnJ4X2J5dGVzIC0gZHBpLT5sYXN0X2J5dGVzKSA+IFBDQ19QM19USFJFU0hPTEQpCisJCWptZV9hdHRlbXB0X3BjYyhkcGksIFBDQ19QMyk7CisJZWxzZSBpZiAoKE5FVF9TVEFUKGptZSkucnhfcGFja2V0cyAtIGRwaS0+bGFzdF9wa3RzKSA+IFBDQ19QMl9USFJFU0hPTEQKKwl8fCBkcGktPmludHJfY250ID4gUENDX0lOVFJfVEhSRVNIT0xEKQorCQlqbWVfYXR0ZW1wdF9wY2MoZHBpLCBQQ0NfUDIpOworCWVsc2UKKwkJam1lX2F0dGVtcHRfcGNjKGRwaSwgUENDX1AxKTsKKworCWlmICh1bmxpa2VseShkcGktPmF0dGVtcHQgIT0gZHBpLT5jdXIgJiYgZHBpLT5jbnQgPiA1KSkgeworCQlpZiAoZHBpLT5hdHRlbXB0IDwgZHBpLT5jdXIpCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZqbWUtPnJ4Y2xlYW5fdGFzayk7CisJCWptZV9zZXRfcnhfcGNjKGptZSwgZHBpLT5hdHRlbXB0KTsKKwkJZHBpLT5jdXIgPSBkcGktPmF0dGVtcHQ7CisJCWRwaS0+Y250ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfc3RhcnRfcGNjX3RpbWVyKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXN0cnVjdCBkeW5wY2NfaW5mbyAqZHBpID0gJihqbWUtPmRwaSk7CisJZHBpLT5sYXN0X2J5dGVzCQk9IE5FVF9TVEFUKGptZSkucnhfYnl0ZXM7CisJZHBpLT5sYXN0X3BrdHMJCT0gTkVUX1NUQVQoam1lKS5yeF9wYWNrZXRzOworCWRwaS0+aW50cl9jbnQJCT0gMDsKKwlqd3JpdGUzMihqbWUsIEpNRV9UTUNTUiwKKwkJVE1DU1JfRU4gfCAoKDB4RkZGRkZGIC0gUENDX0lOVEVSVkFMX1VTKSAmIFRNQ1NSX0NOVCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9zdG9wX3BjY190aW1lcihzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqd3JpdGUzMihqbWUsIEpNRV9UTUNTUiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfc2h1dGRvd25fbmljKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBwaHlsaW5rOworCisJcGh5bGluayA9IGptZV9saW5rc3RhdF9mcm9tX3BoeShqbWUpOworCisJaWYgKCEocGh5bGluayAmIFBIWV9MSU5LX1VQKSkgeworCQkvKgorCQkgKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgYmVmb3JlIGlzc3VlIHRpbWVyCisJCSAqLworCQlqbWVfc3RvcF9pcnEoam1lKTsKKwkJandyaXRlMzIoam1lLCBKTUVfVElNRVIyLCBUTUNTUl9FTiB8IDB4RkZGRkZFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfcGNjX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSAoc3RydWN0IGptZV9hZGFwdGVyICopYXJnOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBqbWUtPmRldjsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChKTUVfRkxBR19TSFVURE9XTiwgJmptZS0+ZmxhZ3MpKSkgeworCQlqbWVfc2h1dGRvd25fbmljKGptZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSB8fAorCQkoYXRvbWljX3JlYWQoJmptZS0+bGlua19jaGFuZ2luZykgIT0gMSkKKwkpKSB7CisJCWptZV9zdG9wX3BjY190aW1lcihqbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEodGVzdF9iaXQoSk1FX0ZMQUdfUE9MTCwgJmptZS0+ZmxhZ3MpKSkKKwkJam1lX2R5bmFtaWNfcGNjKGptZSk7CisKKwlqbWVfc3RhcnRfcGNjX3RpbWVyKGptZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3BvbGxpbmdfbW9kZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqbWVfc2V0X3J4X3BjYyhqbWUsIFBDQ19PRkYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ptZV9pbnRlcnJ1cHRfbW9kZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlqbWVfc2V0X3J4X3BjYyhqbWUsIFBDQ19QMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitqbWVfcHNldWRvX2hvdHBsdWdfZW5hYmxlZChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwl1MzIgYXBtYzsKKwlhcG1jID0ganJlYWQzMihqbWUsIEpNRV9BUE1DKTsKKwlyZXR1cm4gYXBtYyAmIEpNRV9BUE1DX1BTRVVET19IUF9FTjsKK30KKworc3RhdGljIHZvaWQKK2ptZV9zdGFydF9zaHV0ZG93bl90aW1lcihzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwl1MzIgYXBtYzsKKworCWFwbWMgPSBqcmVhZDMyKGptZSwgSk1FX0FQTUMpIHwgSk1FX0FQTUNfUENJRV9TRF9FTjsKKwlhcG1jICY9IH5KTUVfQVBNQ19FUElFTl9DVFJMOworCWlmICghbm9fZXh0cGx1ZykgeworCQlqd3JpdGUzMmYoam1lLCBKTUVfQVBNQywgYXBtYyB8IEpNRV9BUE1DX0VQSUVOX0NUUkxfRU4pOworCQl3bWIoKTsKKwl9CisJandyaXRlMzJmKGptZSwgSk1FX0FQTUMsIGFwbWMpOworCisJandyaXRlMzJmKGptZSwgSk1FX1RJTUVSMiwgMCk7CisJc2V0X2JpdChKTUVfRkxBR19TSFVURE9XTiwgJmptZS0+ZmxhZ3MpOworCWp3cml0ZTMyKGptZSwgSk1FX1RNQ1NSLAorCQlUTUNTUl9FTiB8ICgoMHhGRkZGRkYgLSBBUE1DX1BIUF9TSFVURE9XTl9ERUxBWSkgJiBUTUNTUl9DTlQpKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV9zdG9wX3NodXRkb3duX3RpbWVyKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBhcG1jOworCisJandyaXRlMzJmKGptZSwgSk1FX1RNQ1NSLCAwKTsKKwlqd3JpdGUzMmYoam1lLCBKTUVfVElNRVIyLCAwKTsKKwljbGVhcl9iaXQoSk1FX0ZMQUdfU0hVVERPV04sICZqbWUtPmZsYWdzKTsKKworCWFwbWMgPSBqcmVhZDMyKGptZSwgSk1FX0FQTUMpOworCWFwbWMgJj0gfihKTUVfQVBNQ19QQ0lFX1NEX0VOIHwgSk1FX0FQTUNfRVBJRU5fQ1RSTCk7CisJandyaXRlMzJmKGptZSwgSk1FX0FQTUMsIGFwbWMgfCBKTUVfQVBNQ19FUElFTl9DVFJMX0RJUyk7CisJd21iKCk7CisJandyaXRlMzJmKGptZSwgSk1FX0FQTUMsIGFwbWMpOworfQorCitzdGF0aWMgdm9pZAoram1lX2xpbmtfY2hhbmdlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSAoc3RydWN0IGptZV9hZGFwdGVyICopYXJnOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBqbWUtPmRldjsKKwlpbnQgcmM7CisKKwl3aGlsZSAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmptZS0+bGlua19jaGFuZ2luZykpIHsKKwkJYXRvbWljX2luYygmam1lLT5saW5rX2NoYW5naW5nKTsKKwkJbXNnX2ludHIoam1lLCAiR2V0IGxpbmsgY2hhbmdlIGxvY2sgZmFpbGVkLlxuIik7CisJCXdoaWxlIChhdG9taWNfcmVhZCgmam1lLT5saW5rX2NoYW5naW5nKSAhPSAxKQorCQkJbXNnX2ludHIoam1lLCAiV2FpdGluZyBsaW5rIGNoYW5nZSBsb2NrLlxuIik7CisJfQorCisJaWYgKGptZV9jaGVja19saW5rKG5ldGRldiwgMSkgJiYgam1lLT5vbGRfbXR1ID09IG5ldGRldi0+bXR1KQorCQlnb3RvIG91dDsKKworCWptZS0+b2xkX210dSA9IG5ldGRldi0+bXR1OworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwlpZiAoam1lX3BzZXVkb19ob3RwbHVnX2VuYWJsZWQoam1lKSkKKwkJam1lX3N0b3Bfc2h1dGRvd25fdGltZXIoam1lKTsKKworCWptZV9zdG9wX3BjY190aW1lcihqbWUpOworCXRhc2tsZXRfZGlzYWJsZSgmam1lLT50eGNsZWFuX3Rhc2spOworCXRhc2tsZXRfZGlzYWJsZSgmam1lLT5yeGNsZWFuX3Rhc2spOworCXRhc2tsZXRfZGlzYWJsZSgmam1lLT5yeGVtcHR5X3Rhc2spOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlqbWVfcmVzZXRfZ2hjX3NwZWVkKGptZSk7CisJCWptZV9kaXNhYmxlX3J4X2VuZ2luZShqbWUpOworCQlqbWVfZGlzYWJsZV90eF9lbmdpbmUoam1lKTsKKwkJam1lX3Jlc2V0X21hY19wcm9jZXNzb3Ioam1lKTsKKwkJam1lX2ZyZWVfcnhfcmVzb3VyY2VzKGptZSk7CisJCWptZV9mcmVlX3R4X3Jlc291cmNlcyhqbWUpOworCisJCWlmICh0ZXN0X2JpdChKTUVfRkxBR19QT0xMLCAmam1lLT5mbGFncykpCisJCQlqbWVfcG9sbGluZ19tb2RlKGptZSk7CisKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwl9CisKKwlqbWVfY2hlY2tfbGluayhuZXRkZXYsIDApOworCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJcmMgPSBqbWVfc2V0dXBfcnhfcmVzb3VyY2VzKGptZSk7CisJCWlmIChyYykgeworCQkJamVwcmludGsoam1lLT5wZGV2LCAiQWxsb2NhdGluZyByZXNvdXJjZXMgZm9yIFJYIGVycm9yIgorCQkJCSIsIERldmljZSBTVE9QUEVEIVxuIik7CisJCQlnb3RvIG91dF9lbmFibGVfdGFza2xldDsKKwkJfQorCisJCXJjID0gam1lX3NldHVwX3R4X3Jlc291cmNlcyhqbWUpOworCQlpZiAocmMpIHsKKwkJCWplcHJpbnRrKGptZS0+cGRldiwgIkFsbG9jYXRpbmcgcmVzb3VyY2VzIGZvciBUWCBlcnJvciIKKwkJCQkiLCBEZXZpY2UgU1RPUFBFRCFcbiIpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfcnhfcmVzb3VyY2VzOworCQl9CisKKwkJam1lX2VuYWJsZV9yeF9lbmdpbmUoam1lKTsKKwkJam1lX2VuYWJsZV90eF9lbmdpbmUoam1lKTsKKworCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJCWlmICh0ZXN0X2JpdChKTUVfRkxBR19QT0xMLCAmam1lLT5mbGFncykpCisJCQlqbWVfaW50ZXJydXB0X21vZGUoam1lKTsKKworCQlqbWVfc3RhcnRfcGNjX3RpbWVyKGptZSk7CisJfSBlbHNlIGlmIChqbWVfcHNldWRvX2hvdHBsdWdfZW5hYmxlZChqbWUpKSB7CisJCWptZV9zdGFydF9zaHV0ZG93bl90aW1lcihqbWUpOworCX0KKworCWdvdG8gb3V0X2VuYWJsZV90YXNrbGV0OworCitlcnJfb3V0X2ZyZWVfcnhfcmVzb3VyY2VzOgorCWptZV9mcmVlX3J4X3Jlc291cmNlcyhqbWUpOworb3V0X2VuYWJsZV90YXNrbGV0OgorCXRhc2tsZXRfZW5hYmxlKCZqbWUtPnR4Y2xlYW5fdGFzayk7CisJdGFza2xldF9oaV9lbmFibGUoJmptZS0+cnhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2hpX2VuYWJsZSgmam1lLT5yeGVtcHR5X3Rhc2spOworb3V0OgorCWF0b21pY19pbmMoJmptZS0+bGlua19jaGFuZ2luZyk7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfcnhfY2xlYW5fdGFza2xldCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKilhcmc7CisJc3RydWN0IGR5bnBjY19pbmZvICpkcGkgPSAmKGptZS0+ZHBpKTsKKworCWptZV9wcm9jZXNzX3JlY2VpdmUoam1lLCBqbWUtPnJ4X3Jpbmdfc2l6ZSk7CisJKysoZHBpLT5pbnRyX2NudCk7CisKK30KKworc3RhdGljIGludAoram1lX3BvbGwoSk1FX05BUElfSE9MREVSKGhvbGRlciksIEpNRV9OQVBJX1dFSUdIVChidWRnZXQpKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gam1lX25hcGlfcHJpdihob2xkZXIpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBqbWUtPmRldjsKKwlpbnQgcmVzdDsKKworCXJlc3QgPSBqbWVfcHJvY2Vzc19yZWNlaXZlKGptZSwgSk1FX05BUElfV0VJR0hUX1ZBTChidWRnZXQpKTsKKworCXdoaWxlIChhdG9taWNfcmVhZCgmam1lLT5yeF9lbXB0eSkgPiAwKSB7CisJCWF0b21pY19kZWMoJmptZS0+cnhfZW1wdHkpOworCQkrKyhORVRfU1RBVChqbWUpLnJ4X2Ryb3BwZWQpOworCQlqbWVfcmVzdGFydF9yeF9lbmdpbmUoam1lKTsKKwl9CisJYXRvbWljX2luYygmam1lLT5yeF9lbXB0eSk7CisKKwlpZiAocmVzdCkgeworCQlKTUVfUlhfQ09NUExFVEUobmV0ZGV2LCBob2xkZXIpOworCQlqbWVfaW50ZXJydXB0X21vZGUoam1lKTsKKwl9CisKKwlKTUVfTkFQSV9XRUlHSFRfU0VUKGJ1ZGdldCwgcmVzdCk7CisJcmV0dXJuIEpNRV9OQVBJX1dFSUdIVF9WQUwoYnVkZ2V0KSAtIHJlc3Q7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfcnhfZW1wdHlfdGFza2xldCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKilhcmc7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmptZS0+bGlua19jaGFuZ2luZykgIT0gMSkpCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseSghbmV0aWZfY2Fycmllcl9vayhqbWUtPmRldikpKQorCQlyZXR1cm47CisKKwltc2dfcnhfc3RhdHVzKGptZSwgIlJYIFF1ZXVlIEZ1bGwhXG4iKTsKKworCWptZV9yeF9jbGVhbl90YXNrbGV0KGFyZyk7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmptZS0+cnhfZW1wdHkpID4gMCkgeworCQlhdG9taWNfZGVjKCZqbWUtPnJ4X2VtcHR5KTsKKwkJKysoTkVUX1NUQVQoam1lKS5yeF9kcm9wcGVkKTsKKwkJam1lX3Jlc3RhcnRfcnhfZW5naW5lKGptZSk7CisJfQorCWF0b21pY19pbmMoJmptZS0+cnhfZW1wdHkpOworfQorCitzdGF0aWMgdm9pZAoram1lX3dha2VfcXVldWVfaWZfc3RvcHBlZChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlzdHJ1Y3Qgam1lX3JpbmcgKnR4cmluZyA9IGptZS0+dHhyaW5nOworCisJc21wX3dtYigpOworCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKGptZS0+ZGV2KSAmJgorCWF0b21pY19yZWFkKCZ0eHJpbmctPm5yX2ZyZWUpID49IChqbWUtPnR4X3dha2VfdGhyZXNob2xkKSkpIHsKKwkJbXNnX3R4X2RvbmUoam1lLCAiVFggUXVldWUgV2FrZWQuXG4iKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShqbWUtPmRldik7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitqbWVfdHhfY2xlYW5fdGFza2xldCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKilhcmc7CisJc3RydWN0IGptZV9yaW5nICp0eHJpbmcgPSAmKGptZS0+dHhyaW5nWzBdKTsKKwlzdHJ1Y3QgdHhkZXNjICp0eGRlc2MgPSB0eHJpbmctPmRlc2M7CisJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqdHhiaSA9IHR4cmluZy0+YnVmaW5mLCAqY3R4YmksICp0dHhiaTsKKwlpbnQgaSwgaiwgY250ID0gMCwgbWF4LCBlcnIsIG1hc2s7CisKKwl0eF9kYmcoam1lLCAiSW50byB0eGNsZWFuLlxuIik7CisKKwlpZiAodW5saWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmptZS0+dHhfY2xlYW5pbmcpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmptZS0+bGlua19jaGFuZ2luZykgIT0gMSkpCisJCWdvdG8gb3V0OworCisJaWYgKHVubGlrZWx5KCFuZXRpZl9jYXJyaWVyX29rKGptZS0+ZGV2KSkpCisJCWdvdG8gb3V0OworCisJbWF4ID0gam1lLT50eF9yaW5nX3NpemUgLSBhdG9taWNfcmVhZCgmdHhyaW5nLT5ucl9mcmVlKTsKKwltYXNrID0gam1lLT50eF9yaW5nX21hc2s7CisKKwlmb3IgKGkgPSBhdG9taWNfcmVhZCgmdHhyaW5nLT5uZXh0X3RvX2NsZWFuKSA7IGNudCA8IG1heCA7ICkgeworCisJCWN0eGJpID0gdHhiaSArIGk7CisKKwkJaWYgKGxpa2VseShjdHhiaS0+c2tiICYmCisJCSEodHhkZXNjW2ldLmRlc2N3Yi5mbGFncyAmIFRYV0JGTEFHX09XTikpKSB7CisKKwkJCXR4X2RiZyhqbWUsICJ0eGNsZWFuOiAlZCslZEAlbHVcbiIsCisJCQkJCWksIGN0eGJpLT5ucl9kZXNjLCBqaWZmaWVzKTsKKworCQkJZXJyID0gdHhkZXNjW2ldLmRlc2N3Yi5mbGFncyAmIFRYV0JGTEFHX0FMTEVSUjsKKworCQkJZm9yIChqID0gMSA7IGogPCBjdHhiaS0+bnJfZGVzYyA7ICsraikgeworCQkJCXR0eGJpID0gdHhiaSArICgoaSArIGopICYgKG1hc2spKTsKKwkJCQl0eGRlc2NbKGkgKyBqKSAmIChtYXNrKV0uZHdbMF0gPSAwOworCisJCQkJcGNpX3VubWFwX3BhZ2Uoam1lLT5wZGV2LAorCQkJCQkJIHR0eGJpLT5tYXBwaW5nLAorCQkJCQkJIHR0eGJpLT5sZW4sCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCQl0dHhiaS0+bWFwcGluZyA9IDA7CisJCQkJdHR4YmktPmxlbiA9IDA7CisJCQl9CisKKwkJCWRldl9rZnJlZV9za2IoY3R4YmktPnNrYik7CisKKwkJCWNudCArPSBjdHhiaS0+bnJfZGVzYzsKKworCQkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQkrKyhORVRfU1RBVChqbWUpLnR4X2NhcnJpZXJfZXJyb3JzKTsKKwkJCX0gZWxzZSB7CisJCQkJKysoTkVUX1NUQVQoam1lKS50eF9wYWNrZXRzKTsKKwkJCQlORVRfU1RBVChqbWUpLnR4X2J5dGVzICs9IGN0eGJpLT5sZW47CisJCQl9CisKKwkJCWN0eGJpLT5za2IgPSBOVUxMOworCQkJY3R4YmktPmxlbiA9IDA7CisJCQljdHhiaS0+c3RhcnRfeG1pdCA9IDA7CisKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaSA9IChpICsgY3R4YmktPm5yX2Rlc2MpICYgbWFzazsKKworCQljdHhiaS0+bnJfZGVzYyA9IDA7CisJfQorCisJdHhfZGJnKGptZSwgInR4Y2xlYW46IGRvbmUgJWRAJWx1LlxuIiwgaSwgamlmZmllcyk7CisJYXRvbWljX3NldCgmdHhyaW5nLT5uZXh0X3RvX2NsZWFuLCBpKTsKKwlhdG9taWNfYWRkKGNudCwgJnR4cmluZy0+bnJfZnJlZSk7CisKKwlqbWVfd2FrZV9xdWV1ZV9pZl9zdG9wcGVkKGptZSk7CisKK291dDoKKwlhdG9taWNfaW5jKCZqbWUtPnR4X2NsZWFuaW5nKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV9pbnRyX21zaShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTMyIGludHJzdGF0KQoreworCS8qCisJICogRGlzYWJsZSBpbnRlcnJ1cHQKKwkgKi8KKwlqd3JpdGUzMmYoam1lLCBKTUVfSUVOQywgSU5UUl9FTkFCTEUpOworCisJaWYgKGludHJzdGF0ICYgKElOVFJfTElOS0NIIHwgSU5UUl9TV0lOVFIpKSB7CisJCS8qCisJCSAqIExpbmsgY2hhbmdlIGV2ZW50IGlzIGNyaXRpY2FsCisJCSAqIGFsbCBvdGhlciBldmVudHMgYXJlIGlnbm9yZWQKKwkJICovCisJCWp3cml0ZTMyKGptZSwgSk1FX0lFVkUsIGludHJzdGF0KTsKKwkJdGFza2xldF9zY2hlZHVsZSgmam1lLT5saW5rY2hfdGFzayk7CisJCWdvdG8gb3V0X3JlZW5hYmxlOworCX0KKworCWlmIChpbnRyc3RhdCAmIElOVFJfVE1JTlRSKSB7CisJCWp3cml0ZTMyKGptZSwgSk1FX0lFVkUsIElOVFJfVE1JTlRSKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmam1lLT5wY2NfdGFzayk7CisJfQorCisJaWYgKGludHJzdGF0ICYgKElOVFJfUENDVFhUTyB8IElOVFJfUENDVFgpKSB7CisJCWp3cml0ZTMyKGptZSwgSk1FX0lFVkUsIElOVFJfUENDVFhUTyB8IElOVFJfUENDVFggfCBJTlRSX1RYMCk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmptZS0+dHhjbGVhbl90YXNrKTsKKwl9CisKKwlpZiAoKGludHJzdGF0ICYgKElOVFJfUENDUlgwVE8gfCBJTlRSX1BDQ1JYMCB8IElOVFJfUlgwRU1QKSkpIHsKKwkJandyaXRlMzIoam1lLCBKTUVfSUVWRSwgKGludHJzdGF0ICYgKElOVFJfUENDUlgwVE8gfAorCQkJCQkJICAgICBJTlRSX1BDQ1JYMCB8CisJCQkJCQkgICAgIElOVFJfUlgwRU1QKSkgfAorCQkJCQlJTlRSX1JYMCk7CisJfQorCisJaWYgKHRlc3RfYml0KEpNRV9GTEFHX1BPTEwsICZqbWUtPmZsYWdzKSkgeworCQlpZiAoaW50cnN0YXQgJiBJTlRSX1JYMEVNUCkKKwkJCWF0b21pY19pbmMoJmptZS0+cnhfZW1wdHkpOworCisJCWlmICgoaW50cnN0YXQgJiAoSU5UUl9QQ0NSWDBUTyB8IElOVFJfUENDUlgwIHwgSU5UUl9SWDBFTVApKSkgeworCQkJaWYgKGxpa2VseShKTUVfUlhfU0NIRURVTEVfUFJFUChqbWUpKSkgeworCQkJCWptZV9wb2xsaW5nX21vZGUoam1lKTsKKwkJCQlKTUVfUlhfU0NIRURVTEUoam1lKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbnRyc3RhdCAmIElOVFJfUlgwRU1QKSB7CisJCQlhdG9taWNfaW5jKCZqbWUtPnJ4X2VtcHR5KTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmptZS0+cnhlbXB0eV90YXNrKTsKKwkJfSBlbHNlIGlmIChpbnRyc3RhdCAmIChJTlRSX1BDQ1JYMFRPIHwgSU5UUl9QQ0NSWDApKSB7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZqbWUtPnJ4Y2xlYW5fdGFzayk7CisJCX0KKwl9CisKK291dF9yZWVuYWJsZToKKwkvKgorCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHQKKwkgKi8KKwlqd3JpdGUzMmYoam1lLCBKTUVfSUVOUywgSU5UUl9FTkFCTEUpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2ptZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2lkOworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgaW50cnN0YXQ7CisKKwlpbnRyc3RhdCA9IGpyZWFkMzIoam1lLCBKTUVfSUVWRSk7CisKKwkvKgorCSAqIENoZWNrIGlmIGl0J3MgcmVhbGx5IGFuIGludGVycnVwdCBmb3IgdXMKKwkgKi8KKwlpZiAodW5saWtlbHkoKGludHJzdGF0ICYgSU5UUl9FTkFCTEUpID09IDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBkZXZpY2Ugc3RpbGwgZXhpc3QKKwkgKi8KKwlpZiAodW5saWtlbHkoaW50cnN0YXQgPT0gfigodHlwZW9mKGludHJzdGF0KSkwKSkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWptZV9pbnRyX21zaShqbWUsIGludHJzdGF0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90CitqbWVfbXNpKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2lkOworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgaW50cnN0YXQ7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoam1lLT5wZGV2LAorCQkJCSAgICBqbWUtPnNoYWRvd19kbWEsCisJCQkJICAgIHNpemVvZih1MzIpICogU0hBRE9XX1JFR19OUiwKKwkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpbnRyc3RhdCA9IGptZS0+c2hhZG93X3JlZ3NbU0hBRE9XX0lFVkVdOworCWptZS0+c2hhZG93X3JlZ3NbU0hBRE9XX0lFVkVdID0gMDsKKworCWptZV9pbnRyX21zaShqbWUsIGludHJzdGF0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK2ptZV9yZXNldF9saW5rKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCWp3cml0ZTMyKGptZSwgSk1FX1RNQ1NSLCBUTUNTUl9TV0lUKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV9yZXN0YXJ0X2FuKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBibWNyOworCisJc3Bpbl9sb2NrX2JoKCZqbWUtPnBoeV9sb2NrKTsKKwlibWNyID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCBNSUlfQk1DUik7CisJYm1jciB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlqbWVfbWRpb193cml0ZShqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCBNSUlfQk1DUiwgYm1jcik7CisJc3Bpbl91bmxvY2tfYmgoJmptZS0+cGh5X2xvY2spOworfQorCitzdGF0aWMgaW50CitqbWVfcmVxdWVzdF9pcnEoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBqbWUtPmRldjsKKwlpcnFfaGFuZGxlcl90IGhhbmRsZXIgPSBqbWVfaW50cjsKKwlpbnQgaXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7CisKKwlpZiAoIXBjaV9lbmFibGVfbXNpKGptZS0+cGRldikpIHsKKwkJc2V0X2JpdChKTUVfRkxBR19NU0ksICZqbWUtPmZsYWdzKTsKKwkJaGFuZGxlciA9IGptZV9tc2k7CisJCWlycV9mbGFncyA9IDA7CisJfQorCisJcmMgPSByZXF1ZXN0X2lycShqbWUtPnBkZXYtPmlycSwgaGFuZGxlciwgaXJxX2ZsYWdzLCBuZXRkZXYtPm5hbWUsCisJCQkgIG5ldGRldik7CisJaWYgKHJjKSB7CisJCWplcHJpbnRrKGptZS0+cGRldiwKKwkJCSJVbmFibGUgdG8gcmVxdWVzdCAlcyBpbnRlcnJ1cHQgKHJldHVybjogJWQpXG4iLAorCQkJdGVzdF9iaXQoSk1FX0ZMQUdfTVNJLCAmam1lLT5mbGFncykgPyAiTVNJIiA6ICJJTlR4IiwKKwkJCXJjKTsKKworCQlpZiAodGVzdF9iaXQoSk1FX0ZMQUdfTVNJLCAmam1lLT5mbGFncykpIHsKKwkJCXBjaV9kaXNhYmxlX21zaShqbWUtPnBkZXYpOworCQkJY2xlYXJfYml0KEpNRV9GTEFHX01TSSwgJmptZS0+ZmxhZ3MpOworCQl9CisJfSBlbHNlIHsKKwkJbmV0ZGV2LT5pcnEgPSBqbWUtPnBkZXYtPmlycTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfZnJlZV9pcnEoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJZnJlZV9pcnEoam1lLT5wZGV2LT5pcnEsIGptZS0+ZGV2KTsKKwlpZiAodGVzdF9iaXQoSk1FX0ZMQUdfTVNJLCAmam1lLT5mbGFncykpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGptZS0+cGRldik7CisJCWNsZWFyX2JpdChKTUVfRkxBR19NU0ksICZqbWUtPmZsYWdzKTsKKwkJam1lLT5kZXYtPmlycSA9IGptZS0+cGRldi0+aXJxOworCX0KK30KKworc3RhdGljIGludAoram1lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJjOworCisJam1lX2NsZWFyX3BtKGptZSk7CisJSk1FX05BUElfRU5BQkxFKGptZSk7CisKKwl0YXNrbGV0X2VuYWJsZSgmam1lLT50eGNsZWFuX3Rhc2spOworCXRhc2tsZXRfaGlfZW5hYmxlKCZqbWUtPnJ4Y2xlYW5fdGFzayk7CisJdGFza2xldF9oaV9lbmFibGUoJmptZS0+cnhlbXB0eV90YXNrKTsKKworCXJjID0gam1lX3JlcXVlc3RfaXJxKGptZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwlqbWVfZW5hYmxlX3NoYWRvdyhqbWUpOworCWptZV9zdGFydF9pcnEoam1lKTsKKworCWlmICh0ZXN0X2JpdChKTUVfRkxBR19TU0VULCAmam1lLT5mbGFncykpCisJCWptZV9zZXRfc2V0dGluZ3MobmV0ZGV2LCAmam1lLT5vbGRfZWNtZCk7CisJZWxzZQorCQlqbWVfcmVzZXRfcGh5X3Byb2Nlc3NvcihqbWUpOworCisJam1lX3Jlc2V0X2xpbmsoam1lKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQKK2ptZV9zZXRfMTAwbV9oYWxmKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBibWNyLCB0bXA7CisKKwlibWNyID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCBNSUlfQk1DUik7CisJdG1wID0gYm1jciAmIH4oQk1DUl9BTkVOQUJMRSB8IEJNQ1JfU1BFRUQxMDAgfAorCQkgICAgICAgQk1DUl9TUEVFRDEwMDAgfCBCTUNSX0ZVTExEUExYKTsKKwl0bXAgfD0gQk1DUl9TUEVFRDEwMDsKKworCWlmIChibWNyICE9IHRtcCkKKwkJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNQ1IsIHRtcCk7CisKKwlpZiAoam1lLT5mcGdhdmVyKQorCQlqd3JpdGUzMihqbWUsIEpNRV9HSEMsIEdIQ19TUEVFRF8xMDBNIHwgR0hDX0xJTktfUE9MTCk7CisJZWxzZQorCQlqd3JpdGUzMihqbWUsIEpNRV9HSEMsIEdIQ19TUEVFRF8xMDBNKTsKK30KKworI2RlZmluZSBKTUVfV0FJVF9MSU5LX1RJTUUgMjAwMCAvKiAyMDAwbXMgKi8KK3N0YXRpYyB2b2lkCitqbWVfd2FpdF9saW5rKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBwaHlsaW5rLCB0byA9IEpNRV9XQUlUX0xJTktfVElNRTsKKworCW1kZWxheSgxMDAwKTsKKwlwaHlsaW5rID0gam1lX2xpbmtzdGF0X2Zyb21fcGh5KGptZSk7CisJd2hpbGUgKCEocGh5bGluayAmIFBIWV9MSU5LX1VQKSAmJiAodG8gLT0gMTApID4gMCkgeworCQltZGVsYXkoMTApOworCQlwaHlsaW5rID0gam1lX2xpbmtzdGF0X2Zyb21fcGh5KGptZSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3BoeV9vZmYoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUERPV04pOworfQorCitzdGF0aWMgaW50CitqbWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKworCWptZV9zdG9wX2lycShqbWUpOworCWptZV9kaXNhYmxlX3NoYWRvdyhqbWUpOworCWptZV9mcmVlX2lycShqbWUpOworCisJSk1FX05BUElfRElTQUJMRShqbWUpOworCisJdGFza2xldF9raWxsKCZqbWUtPmxpbmtjaF90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmptZS0+dHhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmptZS0+cnhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmptZS0+cnhlbXB0eV90YXNrKTsKKworCWptZV9yZXNldF9naGNfc3BlZWQoam1lKTsKKwlqbWVfZGlzYWJsZV9yeF9lbmdpbmUoam1lKTsKKwlqbWVfZGlzYWJsZV90eF9lbmdpbmUoam1lKTsKKwlqbWVfcmVzZXRfbWFjX3Byb2Nlc3NvcihqbWUpOworCWptZV9mcmVlX3J4X3Jlc291cmNlcyhqbWUpOworCWptZV9mcmVlX3R4X3Jlc291cmNlcyhqbWUpOworCWptZS0+cGh5bGluayA9IDA7CisJam1lX3BoeV9vZmYoam1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitqbWVfYWxsb2NfdHhkZXNjKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgam1lX3JpbmcgKnR4cmluZyA9IGptZS0+dHhyaW5nOworCWludCBpZHgsIG5yX2FsbG9jLCBtYXNrID0gam1lLT50eF9yaW5nX21hc2s7CisKKwlpZHggPSB0eHJpbmctPm5leHRfdG9fdXNlOworCW5yX2FsbG9jID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDI7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnR4cmluZy0+bnJfZnJlZSkgPCBucl9hbGxvYykpCisJCXJldHVybiAtMTsKKworCWF0b21pY19zdWIobnJfYWxsb2MsICZ0eHJpbmctPm5yX2ZyZWUpOworCisJdHhyaW5nLT5uZXh0X3RvX3VzZSA9ICh0eHJpbmctPm5leHRfdG9fdXNlICsgbnJfYWxsb2MpICYgbWFzazsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfZmlsbF90eF9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCXN0cnVjdCB0eGRlc2MgKnR4ZGVzYywKKwkJc3RydWN0IGptZV9idWZmZXJfaW5mbyAqdHhiaSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXUzMiBwYWdlX29mZnNldCwKKwkJdTMyIGxlbiwKKwkJdTggaGlkbWEpCit7CisJZG1hX2FkZHJfdCBkbWFhZGRyOworCisJZG1hYWRkciA9IHBjaV9tYXBfcGFnZShwZGV2LAorCQkJCXBhZ2UsCisJCQkJcGFnZV9vZmZzZXQsCisJCQkJbGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCisJCQkJICAgICAgIGRtYWFkZHIsCisJCQkJICAgICAgIGxlbiwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisKKwl0eGRlc2MtPmR3WzBdID0gMDsKKwl0eGRlc2MtPmR3WzFdID0gMDsKKwl0eGRlc2MtPmRlc2MyLmZsYWdzCT0gVFhGTEFHX09XTjsKKwl0eGRlc2MtPmRlc2MyLmZsYWdzCXw9IChoaWRtYSkgPyBUWEZMQUdfNjRCSVQgOiAwOworCXR4ZGVzYy0+ZGVzYzIuZGF0YWxlbgk9IGNwdV90b19sZTE2KGxlbik7CisJdHhkZXNjLT5kZXNjMi5idWZhZGRyaAk9IGNwdV90b19sZTMyKChfX3U2NClkbWFhZGRyID4+IDMyKTsKKwl0eGRlc2MtPmRlc2MyLmJ1ZmFkZHJsCT0gY3B1X3RvX2xlMzIoCisJCQkJCShfX3U2NClkbWFhZGRyICYgMHhGRkZGRkZGRlVMKTsKKworCXR4YmktPm1hcHBpbmcgPSBkbWFhZGRyOworCXR4YmktPmxlbiA9IGxlbjsKK30KKworc3RhdGljIHZvaWQKK2ptZV9tYXBfdHhfc2tiKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaWR4KQoreworCXN0cnVjdCBqbWVfcmluZyAqdHhyaW5nID0gam1lLT50eHJpbmc7CisJc3RydWN0IHR4ZGVzYyAqdHhkZXNjID0gdHhyaW5nLT5kZXNjLCAqY3R4ZGVzYzsKKwlzdHJ1Y3Qgam1lX2J1ZmZlcl9pbmZvICp0eGJpID0gdHhyaW5nLT5idWZpbmYsICpjdHhiaTsKKwl1OCBoaWRtYSA9IGptZS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSElHSERNQTsKKwlpbnQgaSwgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWludCBtYXNrID0gam1lLT50eF9yaW5nX21hc2s7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwl1MzIgbGVuOworCisJZm9yIChpID0gMCA7IGkgPCBucl9mcmFncyA7ICsraSkgeworCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCWN0eGRlc2MgPSB0eGRlc2MgKyAoKGlkeCArIGkgKyAyKSAmIChtYXNrKSk7CisJCWN0eGJpID0gdHhiaSArICgoaWR4ICsgaSArIDIpICYgKG1hc2spKTsKKworCQlqbWVfZmlsbF90eF9tYXAoam1lLT5wZGV2LCBjdHhkZXNjLCBjdHhiaSwgZnJhZy0+cGFnZSwKKwkJCQkgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsIGhpZG1hKTsKKwl9CisKKwlsZW4gPSBza2JfaXNfbm9ubGluZWFyKHNrYikgPyBza2JfaGVhZGxlbihza2IpIDogc2tiLT5sZW47CisJY3R4ZGVzYyA9IHR4ZGVzYyArICgoaWR4ICsgMSkgJiAobWFzaykpOworCWN0eGJpID0gdHhiaSArICgoaWR4ICsgMSkgJiAobWFzaykpOworCWptZV9maWxsX3R4X21hcChqbWUtPnBkZXYsIGN0eGRlc2MsIGN0eGJpLCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCW9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksIGxlbiwgaGlkbWEpOworCit9CisKK3N0YXRpYyBpbnQKK2ptZV9leHBhbmRfaGVhZGVyKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh1bmxpa2VseShza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICYmCisJCQlza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCisJCQlwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitqbWVfdHhfdHNvKHN0cnVjdCBza19idWZmICpza2IsCisJCXUxNiAqbXNzLCB1OCAqZmxhZ3MpCit7CisJKm1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPDwgVFhERVNDX01TU19TSElGVDsKKwlpZiAoKm1zcykgeworCQkqZmxhZ3MgfD0gVFhGTEFHX0xTRU47CisKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCisJCQlpcGgtPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJaXBoLT5kYWRkciwgMCwKKwkJCQkJCQkJSVBQUk9UT19UQ1AsCisJCQkJCQkJCTApOworCQl9IGVsc2UgeworCQkJc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmaXA2aC0+c2FkZHIsCisJCQkJCQkJCSZpcDZoLT5kYWRkciwgMCwKKwkJCQkJCQkJSVBQUk9UT19UQ1AsCisJCQkJCQkJCTApOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitqbWVfdHhfY3N1bShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmZsYWdzKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXU4IGlwX3Byb3RvOworCisJCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgeworCQljYXNlIGh0b25zKEVUSF9QX0lQKToKKwkJCWlwX3Byb3RvID0gaXBfaGRyKHNrYiktPnByb3RvY29sOworCQkJYnJlYWs7CisJCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CisJCQlpcF9wcm90byA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlwX3Byb3RvID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChpcF9wcm90bykgeworCQljYXNlIElQUFJPVE9fVENQOgorCQkJKmZsYWdzIHw9IFRYRkxBR19UQ1BDUzsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fVURQOgorCQkJKmZsYWdzIHw9IFRYRkxBR19VRFBDUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXNnX3R4X2VycihqbWUsICJFcnJvciB1cHBlciBsYXllciBwcm90b2NvbC5cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3R4X3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuLCB1OCAqZmxhZ3MpCit7CisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQkqZmxhZ3MgfD0gVFhGTEFHX1RBR09OOworCQkqdmxhbiA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCX0KK30KKworc3RhdGljIGludAoram1lX2ZpbGxfZmlyc3RfdHhfZGVzYyhzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgam1lX3JpbmcgKnR4cmluZyA9IGptZS0+dHhyaW5nOworCXN0cnVjdCB0eGRlc2MgKnR4ZGVzYzsKKwlzdHJ1Y3Qgam1lX2J1ZmZlcl9pbmZvICp0eGJpOworCXU4IGZsYWdzOworCisJdHhkZXNjID0gKHN0cnVjdCB0eGRlc2MgKil0eHJpbmctPmRlc2MgKyBpZHg7CisJdHhiaSA9IHR4cmluZy0+YnVmaW5mICsgaWR4OworCisJdHhkZXNjLT5kd1swXSA9IDA7CisJdHhkZXNjLT5kd1sxXSA9IDA7CisJdHhkZXNjLT5kd1syXSA9IDA7CisJdHhkZXNjLT5kd1szXSA9IDA7CisJdHhkZXNjLT5kZXNjMS5wa3RzaXplID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOworCS8qCisJICogU2V0IE9XTiBiaXQgYXQgZmluYWwuCisJICogV2hlbiBrZXJuZWwgdHJhbnNtaXQgZmFzdGVyIHRoYW4gTklDLgorCSAqIEFuZCBOSUMgdHJ5aW5nIHRvIHNlbmQgdGhpcyBkZXNjcmlwdG9yIGJlZm9yZSB3ZSB0ZWxsCisJICogaXQgdG8gc3RhcnQgc2VuZGluZyB0aGlzIFRYIHF1ZXVlLgorCSAqIE90aGVyIGZpZWxkcyBhcmUgYWxyZWFkeSBmaWxsZWQgY29ycmVjdGx5LgorCSAqLworCXdtYigpOworCWZsYWdzID0gVFhGTEFHX09XTiB8IFRYRkxBR19JTlQ7CisJLyoKKwkgKiBTZXQgY2hlY2tzdW0gZmxhZ3Mgd2hpbGUgbm90IHRzbworCSAqLworCWlmIChqbWVfdHhfdHNvKHNrYiwgJnR4ZGVzYy0+ZGVzYzEubXNzLCAmZmxhZ3MpKQorCQlqbWVfdHhfY3N1bShqbWUsIHNrYiwgJmZsYWdzKTsKKwlqbWVfdHhfdmxhbihza2IsICZ0eGRlc2MtPmRlc2MxLnZsYW4sICZmbGFncyk7CisJdHhkZXNjLT5kZXNjMS5mbGFncyA9IGZsYWdzOworCS8qCisJICogU2V0IHR4IGJ1ZmZlciBpbmZvIGFmdGVyIHRlbGxpbmcgTklDIHRvIHNlbmQKKwkgKiBGb3IgYmV0dGVyIHR4X2NsZWFuIHRpbWluZworCSAqLworCXdtYigpOworCXR4YmktPm5yX2Rlc2MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMjsKKwl0eGJpLT5za2IgPSBza2I7CisJdHhiaS0+bGVuID0gc2tiLT5sZW47CisJdHhiaS0+c3RhcnRfeG1pdCA9IGppZmZpZXM7CisJaWYgKCF0eGJpLT5zdGFydF94bWl0KQorCQl0eGJpLT5zdGFydF94bWl0ID0gKDBVTC0xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX3N0b3BfcXVldWVfaWZfZnVsbChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSkKK3sKKwlzdHJ1Y3Qgam1lX3JpbmcgKnR4cmluZyA9IGptZS0+dHhyaW5nOworCXN0cnVjdCBqbWVfYnVmZmVyX2luZm8gKnR4YmkgPSB0eHJpbmctPmJ1ZmluZjsKKwlpbnQgaWR4ID0gYXRvbWljX3JlYWQoJnR4cmluZy0+bmV4dF90b19jbGVhbik7CisKKwl0eGJpICs9IGlkeDsKKworCXNtcF93bWIoKTsKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnR4cmluZy0+bnJfZnJlZSkgPCAoTUFYX1NLQl9GUkFHUysyKSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShqbWUtPmRldik7CisJCW1zZ190eF9xdWV1ZWQoam1lLCAiVFggUXVldWUgUGF1c2VkLlxuIik7CisJCXNtcF93bWIoKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ0eHJpbmctPm5yX2ZyZWUpCisJCQk+PSAoam1lLT50eF93YWtlX3RocmVzaG9sZCkpIHsKKwkJCW5ldGlmX3dha2VfcXVldWUoam1lLT5kZXYpOworCQkJbXNnX3R4X3F1ZXVlZChqbWUsICJUWCBRdWV1ZSBGYXN0IFdha2VkLlxuIik7CisJCX0KKwl9CisKKwlpZiAodW5saWtlbHkodHhiaS0+c3RhcnRfeG1pdCAmJgorCQkJKGppZmZpZXMgLSB0eGJpLT5zdGFydF94bWl0KSA+PSBUWF9USU1FT1VUICYmCisJCQl0eGJpLT5za2IpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoam1lLT5kZXYpOworCQltc2dfdHhfcXVldWVkKGptZSwgIlRYIFF1ZXVlIFN0b3BwZWQgJWRAJWx1LlxuIiwgaWR4LCBqaWZmaWVzKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJvdGVjdGVkIGJ5IG5ldGlmX3R4X2xvY2soKQorICovCisKK3N0YXRpYyBpbnQKK2ptZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpZHg7CisKKwlpZiAodW5saWtlbHkoam1lX2V4cGFuZF9oZWFkZXIoam1lLCBza2IpKSkgeworCQkrKyhORVRfU1RBVChqbWUpLnR4X2Ryb3BwZWQpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlkeCA9IGptZV9hbGxvY190eGRlc2Moam1lLCBza2IpOworCisJaWYgKHVubGlrZWx5KGlkeCA8IDApKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJbXNnX3R4X2VycihqbWUsICJCVUchIFR4IHJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7CisKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWptZV9tYXBfdHhfc2tiKGptZSwgc2tiLCBpZHgpOworCWptZV9maWxsX2ZpcnN0X3R4X2Rlc2Moam1lLCBza2IsIGlkeCk7CisKKwlqd3JpdGUzMihqbWUsIEpNRV9UWENTLCBqbWUtPnJlZ190eGNzIHwKKwkJCQlUWENTX1NFTEVDVF9RVUVVRTAgfAorCQkJCVRYQ1NfUVVFVUUwUyB8CisJCQkJVFhDU19FTkFCTEUpOworCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJdHhfZGJnKGptZSwgInhtaXQ6ICVkKyVkQCVsdVxuIiwgaWR4LAorCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDIsCisJCQlqaWZmaWVzKTsKKwlqbWVfc3RvcF9xdWV1ZV9pZl9mdWxsKGptZSk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgaW50CitqbWVfc2V0X21hY2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKwl1MzIgdmFsOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9ja19iaCgmam1lLT5tYWNhZGRyX2xvY2spOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCXZhbCA9IChhZGRyLT5zYV9kYXRhWzNdICYgMHhmZikgPDwgMjQgfAorCSAgICAgIChhZGRyLT5zYV9kYXRhWzJdICYgMHhmZikgPDwgMTYgfAorCSAgICAgIChhZGRyLT5zYV9kYXRhWzFdICYgMHhmZikgPDwgIDggfAorCSAgICAgIChhZGRyLT5zYV9kYXRhWzBdICYgMHhmZik7CisJandyaXRlMzIoam1lLCBKTUVfUlhVTUFfTE8sIHZhbCk7CisJdmFsID0gKGFkZHItPnNhX2RhdGFbNV0gJiAweGZmKSA8PCA4IHwKKwkgICAgICAoYWRkci0+c2FfZGF0YVs0XSAmIDB4ZmYpOworCWp3cml0ZTMyKGptZSwgSk1FX1JYVU1BX0hJLCB2YWwpOworCXNwaW5fdW5sb2NrX2JoKCZqbWUtPm1hY2FkZHJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ptZV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIG1jX2hhc2hbMl0gPSB7fTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19iaCgmam1lLT5yeG1jc19sb2NrKTsKKworCWptZS0+cmVnX3J4bWNzIHw9IFJYTUNTX0JSREZSQU1FIHwgUlhNQ1NfVU5JRlJBTUU7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWptZS0+cmVnX3J4bWNzIHw9IFJYTUNTX0FMTEZSQU1FOworCX0gZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlqbWUtPnJlZ19yeG1jcyB8PSBSWE1DU19BTExNVUxGUkFNRTsKKwl9IGVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlpbnQgYml0X25yOworCisJCWptZS0+cmVnX3J4bWNzIHw9IFJYTUNTX01VTEZSQU1FIHwgUlhNQ1NfTVVMRklMVEVSRUQ7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKKwkJCW1jbGlzdCAmJiBpIDwgbmV0ZGV2LT5tY19jb3VudDsKKwkJCSsraSwgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisKKwkJCWJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgJiAweDNGOworCQkJbWNfaGFzaFtiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMHgxRik7CisJCX0KKworCQlqd3JpdGUzMihqbWUsIEpNRV9SWE1DSFRfTE8sIG1jX2hhc2hbMF0pOworCQlqd3JpdGUzMihqbWUsIEpNRV9SWE1DSFRfSEksIG1jX2hhc2hbMV0pOworCX0KKworCXdtYigpOworCWp3cml0ZTMyKGptZSwgSk1FX1JYTUNTLCBqbWUtPnJlZ19yeG1jcyk7CisKKwlzcGluX3VubG9ja19iaCgmam1lLT5yeG1jc19sb2NrKTsKK30KKworc3RhdGljIGludAoram1lX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG5ld19tdHUgPT0gam1lLT5vbGRfbXR1KQorCQlyZXR1cm4gMDsKKworCWlmICgoKG5ld19tdHUgKyBFVEhfSExFTikgPiBNQVhfRVRIRVJORVRfSlVNQk9fUEFDS0VUX1NJWkUpIHx8CisJCSgobmV3X210dSkgPCBJUFY2X01JTl9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXdfbXR1ID4gNDAwMCkgeworCQlqbWUtPnJlZ19yeGNzICY9IH5SWENTX0ZJRk9USE5QOworCQlqbWUtPnJlZ19yeGNzIHw9IFJYQ1NfRklGT1RITlBfNjRRVzsKKwkJam1lX3Jlc3RhcnRfcnhfZW5naW5lKGptZSk7CisJfSBlbHNlIHsKKwkJam1lLT5yZWdfcnhjcyAmPSB+UlhDU19GSUZPVEhOUDsKKwkJam1lLT5yZWdfcnhjcyB8PSBSWENTX0ZJRk9USE5QXzEyOFFXOworCQlqbWVfcmVzdGFydF9yeF9lbmdpbmUoam1lKTsKKwl9CisKKwlpZiAobmV3X210dSA+IDE5MDApIHsKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+KE5FVElGX0ZfSFdfQ1NVTSB8CisJCQkJTkVUSUZfRl9UU08gfAorCQkJCU5FVElGX0ZfVFNPNik7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KEpNRV9GTEFHX1RYQ1NVTSwgJmptZS0+ZmxhZ3MpKQorCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJCWlmICh0ZXN0X2JpdChKTUVfRkxBR19UU08sICZqbWUtPmZsYWdzKSkKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzY7CisJfQorCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCWptZV9yZXNldF9saW5rKGptZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ptZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJam1lLT5waHlsaW5rID0gMDsKKwlqbWVfcmVzZXRfcGh5X3Byb2Nlc3NvcihqbWUpOworCWlmICh0ZXN0X2JpdChKTUVfRkxBR19TU0VULCAmam1lLT5mbGFncykpCisJCWptZV9zZXRfc2V0dGluZ3MobmV0ZGV2LCAmam1lLT5vbGRfZWNtZCk7CisKKwkvKgorCSAqIEZvcmNlIHRvIFJlc2V0IHRoZSBsaW5rIGFnYWluCisJICovCisJam1lX3Jlc2V0X2xpbmsoam1lKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJam1lLT52bGdycCA9IGdycDsKK30KKworc3RhdGljIHZvaWQKK2ptZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShqbWUtPnBkZXYpKTsKK30KKworc3RhdGljIGludAoram1lX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBKTUVfUkVHX0xFTjsKK30KKworc3RhdGljIHZvaWQKK21tYXBpb19tZW1jcHkoc3RydWN0IGptZV9hZGFwdGVyICpqbWUsIHUzMiAqcCwgdTMyIHJlZywgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSArPSA0KQorCQlwW2kgPj4gMl0gPSBqcmVhZDMyKGptZSwgcmVnICsgaSk7Cit9CisKK3N0YXRpYyB2b2lkCittZGlvX21lbWNweShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTMyICpwLCBpbnQgcmVnX25yKQoreworCWludCBpOworCXUxNiAqcDE2ID0gKHUxNiAqKXA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IHJlZ19uciA7ICsraSkKKwkJcDE2W2ldID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCBpKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgKnAzMiA9ICh1MzIgKilwOworCisJbWVtc2V0KHAsIDB4RkYsIEpNRV9SRUdfTEVOKTsKKworCXJlZ3MtPnZlcnNpb24gPSAxOworCW1tYXBpb19tZW1jcHkoam1lLCBwMzIsIEpNRV9NQUMsIEpNRV9NQUNfTEVOKTsKKworCXAzMiArPSAweDEwMCA+PiAyOworCW1tYXBpb19tZW1jcHkoam1lLCBwMzIsIEpNRV9QSFksIEpNRV9QSFlfTEVOKTsKKworCXAzMiArPSAweDEwMCA+PiAyOworCW1tYXBpb19tZW1jcHkoam1lLCBwMzIsIEpNRV9NSVNDLCBKTUVfTUlTQ19MRU4pOworCisJcDMyICs9IDB4MTAwID4+IDI7CisJbW1hcGlvX21lbWNweShqbWUsIHAzMiwgSk1FX1JTUywgSk1FX1JTU19MRU4pOworCisJcDMyICs9IDB4MTAwID4+IDI7CisJbWRpb19tZW1jcHkoam1lLCBwMzIsIEpNRV9QSFlfUkVHX05SKTsKK30KKworc3RhdGljIGludAoram1lX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWNtZCkKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwllY21kLT50eF9jb2FsZXNjZV91c2VjcyA9IFBDQ19UWF9UTzsKKwllY21kLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IFBDQ19UWF9DTlQ7CisKKwlpZiAodGVzdF9iaXQoSk1FX0ZMQUdfUE9MTCwgJmptZS0+ZmxhZ3MpKSB7CisJCWVjbWQtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IGZhbHNlOworCQllY21kLT5yeF9jb2FsZXNjZV91c2VjcyA9IDA7CisJCWVjbWQtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJZWNtZC0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gdHJ1ZTsKKworCXN3aXRjaCAoam1lLT5kcGkuY3VyKSB7CisJY2FzZSBQQ0NfUDE6CisJCWVjbWQtPnJ4X2NvYWxlc2NlX3VzZWNzID0gUENDX1AxX1RPOworCQllY21kLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IFBDQ19QMV9DTlQ7CisJCWJyZWFrOworCWNhc2UgUENDX1AyOgorCQllY21kLT5yeF9jb2FsZXNjZV91c2VjcyA9IFBDQ19QMl9UTzsKKwkJZWNtZC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBQQ0NfUDJfQ05UOworCQlicmVhazsKKwljYXNlIFBDQ19QMzoKKwkJZWNtZC0+cnhfY29hbGVzY2VfdXNlY3MgPSBQQ0NfUDNfVE87CisJCWVjbWQtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gUENDX1AzX0NOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjbWQpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBkeW5wY2NfaW5mbyAqZHBpID0gJihqbWUtPmRwaSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGVjbWQtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZQorCSYmIHRlc3RfYml0KEpNRV9GTEFHX1BPTEwsICZqbWUtPmZsYWdzKSkgeworCQljbGVhcl9iaXQoSk1FX0ZMQUdfUE9MTCwgJmptZS0+ZmxhZ3MpOworCQlqbWUtPmptZV9yeCA9IG5ldGlmX3J4OworCQlqbWUtPmptZV92bGFuX3J4ID0gdmxhbl9od2FjY2VsX3J4OworCQlkcGktPmN1cgkJPSBQQ0NfUDE7CisJCWRwaS0+YXR0ZW1wdAkJPSBQQ0NfUDE7CisJCWRwaS0+Y250CQk9IDA7CisJCWptZV9zZXRfcnhfcGNjKGptZSwgUENDX1AxKTsKKwkJam1lX2ludGVycnVwdF9tb2RlKGptZSk7CisJfSBlbHNlIGlmICghKGVjbWQtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKKwkmJiAhKHRlc3RfYml0KEpNRV9GTEFHX1BPTEwsICZqbWUtPmZsYWdzKSkpIHsKKwkJc2V0X2JpdChKTUVfRkxBR19QT0xMLCAmam1lLT5mbGFncyk7CisJCWptZS0+am1lX3J4ID0gbmV0aWZfcmVjZWl2ZV9za2I7CisJCWptZS0+am1lX3ZsYW5fcnggPSB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2I7CisJCWptZV9pbnRlcnJ1cHRfbW9kZShqbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplY21kKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgdmFsOworCisJZWNtZC0+dHhfcGF1c2UgPSAoam1lLT5yZWdfdHhwZmMgJiBUWFBGQ19QRl9FTikgIT0gMDsKKwllY21kLT5yeF9wYXVzZSA9IChqbWUtPnJlZ19yeG1jcyAmIFJYTUNTX0ZMT1dDVFJMKSAhPSAwOworCisJc3Bpbl9sb2NrX2JoKCZqbWUtPnBoeV9sb2NrKTsKKwl2YWwgPSBqbWVfbWRpb19yZWFkKGptZS0+ZGV2LCBqbWUtPm1paV9pZi5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCXNwaW5fdW5sb2NrX2JoKCZqbWUtPnBoeV9sb2NrKTsKKworCWVjbWQtPmF1dG9uZWcgPQorCQkodmFsICYgKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSkpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHZhbDsKKworCWlmICgoKGptZS0+cmVnX3R4cGZjICYgVFhQRkNfUEZfRU4pICE9IDApIF4KKwkJKGVjbWQtPnR4X3BhdXNlICE9IDApKSB7CisKKwkJaWYgKGVjbWQtPnR4X3BhdXNlKQorCQkJam1lLT5yZWdfdHhwZmMgfD0gVFhQRkNfUEZfRU47CisJCWVsc2UKKwkJCWptZS0+cmVnX3R4cGZjICY9IH5UWFBGQ19QRl9FTjsKKworCQlqd3JpdGUzMihqbWUsIEpNRV9UWFBGQywgam1lLT5yZWdfdHhwZmMpOworCX0KKworCXNwaW5fbG9ja19iaCgmam1lLT5yeG1jc19sb2NrKTsKKwlpZiAoKChqbWUtPnJlZ19yeG1jcyAmIFJYTUNTX0ZMT1dDVFJMKSAhPSAwKSBeCisJCShlY21kLT5yeF9wYXVzZSAhPSAwKSkgeworCisJCWlmIChlY21kLT5yeF9wYXVzZSkKKwkJCWptZS0+cmVnX3J4bWNzIHw9IFJYTUNTX0ZMT1dDVFJMOworCQllbHNlCisJCQlqbWUtPnJlZ19yeG1jcyAmPSB+UlhNQ1NfRkxPV0NUUkw7CisKKwkJandyaXRlMzIoam1lLCBKTUVfUlhNQ1MsIGptZS0+cmVnX3J4bWNzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmptZS0+cnhtY3NfbG9jayk7CisKKwlzcGluX2xvY2tfYmgoJmptZS0+cGh5X2xvY2spOworCXZhbCA9IGptZV9tZGlvX3JlYWQoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJaWYgKCgodmFsICYgKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSkpICE9IDApIF4KKwkJKGVjbWQtPmF1dG9uZWcgIT0gMCkpIHsKKworCQlpZiAoZWNtZC0+YXV0b25lZykKKwkJCXZhbCB8PSAoQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNKTsKKwkJZWxzZQorCQkJdmFsICY9IH4oQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNKTsKKworCQlqbWVfbWRpb193cml0ZShqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLAorCQkJCU1JSV9BRFZFUlRJU0UsIHZhbCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZqbWUtPnBoeV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoram1lX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9NQUdJQyB8IFdBS0VfUEhZOworCisJd29sLT53b2xvcHRzID0gMDsKKworCWlmIChqbWUtPnJlZ19wbWNzICYgKFBNQ1NfTEZFTiB8IFBNQ1NfTFJFTikpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKworCWlmIChqbWUtPnJlZ19wbWNzICYgUE1DU19NRkVOKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKworfQorCitzdGF0aWMgaW50CitqbWVfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHdvbC0+d29sb3B0cyAmIChXQUtFX01BR0lDU0VDVVJFIHwKKwkJCQlXQUtFX1VDQVNUIHwKKwkJCQlXQUtFX01DQVNUIHwKKwkJCQlXQUtFX0JDQVNUIHwKKwkJCQlXQUtFX0FSUCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWptZS0+cmVnX3BtY3MgPSAwOworCisJaWYgKHdvbC0+d29sb3B0cyAmIFdBS0VfUEhZKQorCQlqbWUtPnJlZ19wbWNzIHw9IFBNQ1NfTEZFTiB8IFBNQ1NfTFJFTjsKKworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlqbWUtPnJlZ19wbWNzIHw9IFBNQ1NfTUZFTjsKKworCWp3cml0ZTMyKGptZSwgSk1FX1BNQ1MsIGptZS0+cmVnX3BtY3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19iaCgmam1lLT5waHlfbG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCYoam1lLT5taWlfaWYpLCBlY21kKTsKKwlzcGluX3VubG9ja19iaCgmam1lLT5waHlfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitqbWVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmMsIGZkYyA9IDA7CisKKwlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCAmJiBlY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChqbWUtPm1paV9pZi5mb3JjZV9tZWRpYSAmJgorCWVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYKKwkoam1lLT5taWlfaWYuZnVsbF9kdXBsZXggIT0gZWNtZC0+ZHVwbGV4KSkKKwkJZmRjID0gMTsKKworCXNwaW5fbG9ja19iaCgmam1lLT5waHlfbG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCYoam1lLT5taWlfaWYpLCBlY21kKTsKKwlzcGluX3VubG9ja19iaCgmam1lLT5waHlfbG9jayk7CisKKwlpZiAoIXJjICYmIGZkYykKKwkJam1lX3Jlc2V0X2xpbmsoam1lKTsKKworCWlmICghcmMpIHsKKwkJc2V0X2JpdChKTUVfRkxBR19TU0VULCAmam1lLT5mbGFncyk7CisJCWptZS0+b2xkX2VjbWQgPSAqZWNtZDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1MzIKK2ptZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4ganJlYWQzMihqbWUsIEpNRV9QSFlfTElOSykgJiBQSFlfTElOS19VUDsKK30KKworc3RhdGljIHUzMgoram1lX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gam1lLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZAoram1lX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWptZS0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgdTMyCitqbWVfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIGptZS0+cmVnX3J4bWNzICYgUlhNQ1NfQ0hFQ0tTVU07Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgb24pCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc3Bpbl9sb2NrX2JoKCZqbWUtPnJ4bWNzX2xvY2spOworCWlmIChvbikKKwkJam1lLT5yZWdfcnhtY3MgfD0gUlhNQ1NfQ0hFQ0tTVU07CisJZWxzZQorCQlqbWUtPnJlZ19yeG1jcyAmPSB+UlhNQ1NfQ0hFQ0tTVU07CisJandyaXRlMzIoam1lLCBKTUVfUlhNQ1MsIGptZS0+cmVnX3J4bWNzKTsKKwlzcGluX3VubG9ja19iaCgmam1lLT5yeG1jc19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitqbWVfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIG9uKQoreworCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmIChvbikgeworCQlzZXRfYml0KEpNRV9GTEFHX1RYQ1NVTSwgJmptZS0+ZmxhZ3MpOworCQlpZiAobmV0ZGV2LT5tdHUgPD0gMTkwMCkKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCX0gZWxzZSB7CisJCWNsZWFyX2JpdChKTUVfRkxBR19UWENTVU0sICZqbWUtPmZsYWdzKTsKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19DU1VNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitqbWVfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgb24pCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG9uKSB7CisJCXNldF9iaXQoSk1FX0ZMQUdfVFNPLCAmam1lLT5mbGFncyk7CisJCWlmIChuZXRkZXYtPm10dSA8PSAxOTAwKQorCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNjsKKwl9IGVsc2UgeworCQljbGVhcl9iaXQoSk1FX0ZMQUdfVFNPLCAmam1lLT5mbGFncyk7CisJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWptZV9yZXN0YXJ0X2FuKGptZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OAoram1lX3NtYl9yZWFkKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwl1MzIgdmFsOworCWludCB0bzsKKworCXZhbCA9IGpyZWFkMzIoam1lLCBKTUVfU01CQ1NSKTsKKwl0byA9IEpNRV9TTUJfQlVTWV9USU1FT1VUOworCXdoaWxlICgodmFsICYgU01CQ1NSX0JVU1kpICYmIC0tdG8pIHsKKwkJbXNsZWVwKDEpOworCQl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1NNQkNTUik7CisJfQorCWlmICghdG8pIHsKKwkJbXNnX2h3KGptZSwgIlNNQiBCdXMgQnVzeS5cbiIpOworCQlyZXR1cm4gMHhGRjsKKwl9CisKKwlqd3JpdGUzMihqbWUsIEpNRV9TTUJJTlRGLAorCQkoKGFkZHIgPDwgU01CSU5URl9IV0FERFJfU0hJRlQpICYgU01CSU5URl9IV0FERFIpIHwKKwkJU01CSU5URl9IV1JXTl9SRUFEIHwKKwkJU01CSU5URl9IV0NNRCk7CisKKwl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1NNQklOVEYpOworCXRvID0gSk1FX1NNQl9CVVNZX1RJTUVPVVQ7CisJd2hpbGUgKCh2YWwgJiBTTUJJTlRGX0hXQ01EKSAmJiAtLXRvKSB7CisJCW1zbGVlcCgxKTsKKwkJdmFsID0ganJlYWQzMihqbWUsIEpNRV9TTUJJTlRGKTsKKwl9CisJaWYgKCF0bykgeworCQltc2dfaHcoam1lLCAiU01CIEJ1cyBCdXN5LlxuIik7CisJCXJldHVybiAweEZGOworCX0KKworCXJldHVybiAodmFsICYgU01CSU5URl9IV0RBVFIpID4+IFNNQklOVEZfSFdEQVRSX1NISUZUOworfQorCitzdGF0aWMgdm9pZAoram1lX3NtYl93cml0ZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdW5zaWduZWQgaW50IGFkZHIsIHU4IGRhdGEpCit7CisJdTMyIHZhbDsKKwlpbnQgdG87CisKKwl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1NNQkNTUik7CisJdG8gPSBKTUVfU01CX0JVU1lfVElNRU9VVDsKKwl3aGlsZSAoKHZhbCAmIFNNQkNTUl9CVVNZKSAmJiAtLXRvKSB7CisJCW1zbGVlcCgxKTsKKwkJdmFsID0ganJlYWQzMihqbWUsIEpNRV9TTUJDU1IpOworCX0KKwlpZiAoIXRvKSB7CisJCW1zZ19odyhqbWUsICJTTUIgQnVzIEJ1c3kuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWp3cml0ZTMyKGptZSwgSk1FX1NNQklOVEYsCisJCSgoZGF0YSA8PCBTTUJJTlRGX0hXREFUV19TSElGVCkgJiBTTUJJTlRGX0hXREFUVykgfAorCQkoKGFkZHIgPDwgU01CSU5URl9IV0FERFJfU0hJRlQpICYgU01CSU5URl9IV0FERFIpIHwKKwkJU01CSU5URl9IV1JXTl9XUklURSB8CisJCVNNQklOVEZfSFdDTUQpOworCisJdmFsID0ganJlYWQzMihqbWUsIEpNRV9TTUJJTlRGKTsKKwl0byA9IEpNRV9TTUJfQlVTWV9USU1FT1VUOworCXdoaWxlICgodmFsICYgU01CSU5URl9IV0NNRCkgJiYgLS10bykgeworCQltc2xlZXAoMSk7CisJCXZhbCA9IGpyZWFkMzIoam1lLCBKTUVfU01CSU5URik7CisJfQorCWlmICghdG8pIHsKKwkJbXNnX2h3KGptZSwgIlNNQiBCdXMgQnVzeS5cbiIpOworCQlyZXR1cm47CisJfQorCisJbWRlbGF5KDIpOworfQorCitzdGF0aWMgaW50CitqbWVfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHZhbDsKKwl2YWwgPSBqcmVhZDMyKGptZSwgSk1FX1NNQkNTUik7CisJcmV0dXJuICh2YWwgJiBTTUJDU1JfRUVQUk9NRCkgPyBKTUVfU01CX0xFTiA6IDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGksIG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0LCBsZW4gPSBlZXByb20tPmxlbjsKKworCS8qCisJICogZXRodG9vbCB3aWxsIGNoZWNrIHRoZSBib3VuZGFyeSBmb3IgdXMKKwkgKi8KKwllZXByb20tPm1hZ2ljID0gSk1FX0VFUFJPTV9NQUdJQzsKKwlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7ICsraSkKKwkJZGF0YVtpXSA9IGptZV9zbWJfcmVhZChqbWUsIGkgKyBvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGksIG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0LCBsZW4gPSBlZXByb20tPmxlbjsKKworCWlmIChlZXByb20tPm1hZ2ljICE9IEpNRV9FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBldGh0b29sIHdpbGwgY2hlY2sgdGhlIGJvdW5kYXJ5IGZvciB1cworCSAqLworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgKytpKQorCQlqbWVfc21iX3dyaXRlKGptZSwgaSArIG9mZnNldCwgZGF0YVtpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBqbWVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvICAgICAgICAgICAgPSBqbWVfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSBqbWVfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncwkJPSBqbWVfZ2V0X3JlZ3MsCisJLmdldF9jb2FsZXNjZQkJPSBqbWVfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gam1lX3NldF9jb2FsZXNjZSwKKwkuZ2V0X3BhdXNlcGFyYW0JCT0gam1lX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBqbWVfc2V0X3BhdXNlcGFyYW0sCisJLmdldF93b2wJCT0gam1lX2dldF93b2wsCisJLnNldF93b2wJCT0gam1lX3NldF93b2wsCisJLmdldF9zZXR0aW5ncwkJPSBqbWVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gam1lX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsJCT0gam1lX2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwgICAgICAgICAgID0gam1lX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsICAgICAgICAgICA9IGptZV9zZXRfbXNnbGV2ZWwsCisJLmdldF9yeF9jc3VtCQk9IGptZV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JCT0gam1lX3NldF9yeF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBqbWVfc2V0X3R4X2NzdW0sCisJLnNldF90c28JCT0gam1lX3NldF90c28sCisJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCisJLm53YXlfcmVzZXQgICAgICAgICAgICAgPSBqbWVfbndheV9yZXNldCwKKwkuZ2V0X2VlcHJvbV9sZW4JCT0gam1lX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGptZV9nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IGptZV9zZXRfZWVwcm9tLAorfTsKKworc3RhdGljIGludAoram1lX3BjaV9kbWE2NChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKQorCQlpZiAoIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpCisJCQlyZXR1cm4gMTsKKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNDBCSVRfTUFTSykpCisJCWlmICghcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV80MEJJVF9NQVNLKSkKKwkJCXJldHVybiAxOworCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkKKwkJaWYgKCFwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoram1lX3BoeV9pbml0KHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUxNiByZWcyNjsKKworCXJlZzI2ID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCAyNik7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgMjYsIHJlZzI2IHwgMHgxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitqbWVfY2hlY2tfaHdfdmVyKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lKQoreworCXUzMiBjaGlwbW9kZTsKKworCWNoaXBtb2RlID0ganJlYWQzMihqbWUsIEpNRV9DSElQTU9ERSk7CisKKwlqbWUtPmZwZ2F2ZXIgPSAoY2hpcG1vZGUgJiBDTV9GUEdBVkVSX01BU0spID4+IENNX0ZQR0FWRVJfU0hJRlQ7CisJam1lLT5jaGlwcmV2ID0gKGNoaXBtb2RlICYgQ01fQ0hJUFJFVl9NQVNLKSA+PiBDTV9DSElQUkVWX1NISUZUOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAoram1lX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmMgPSAwLCB1c2luZ19kYWMsIGk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZTsKKwl1MTYgYm1jciwgYm1zcjsKKwl1MzIgYXBtYzsKKworCS8qCisJICogc2V0IHVwIFBDSSBkZXZpY2UgYmFzaWNzCisJICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpIHsKKwkJamVwcmludGsocGRldiwgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJdXNpbmdfZGFjID0gam1lX3BjaV9kbWE2NChwZGV2KTsKKwlpZiAodXNpbmdfZGFjIDwgMCkgeworCQlqZXByaW50ayhwZGV2LCAiQ2Fubm90IHNldCBQQ0kgRE1BIE1hc2suXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCX0KKworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlqZXByaW50ayhwZGV2LCAiTm8gUENJIHJlc291cmNlIHJlZ2lvbiBmb3VuZC5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJamVwcmludGsocGRldiwgIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlIHJlZ2lvbi5cbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyoKKwkgKiBhbGxvYyBhbmQgaW5pdCBuZXQgZGV2aWNlCisJICovCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpqbWUpKTsKKwlpZiAoIW5ldGRldikgeworCQlqZXByaW50ayhwZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG5ldGRldiBzdHJ1Y3R1cmUuXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKwluZXRkZXYtPm9wZW4JCQk9IGptZV9vcGVuOworCW5ldGRldi0+c3RvcAkJCT0gam1lX2Nsb3NlOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0CQk9IGptZV9zdGFydF94bWl0OworCW5ldGRldi0+c2V0X21hY19hZGRyZXNzCQk9IGptZV9zZXRfbWFjYWRkcjsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IGptZV9zZXRfbXVsdGk7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1CQk9IGptZV9jaGFuZ2VfbXR1OworCW5ldGRldi0+ZXRodG9vbF9vcHMJCT0gJmptZV9ldGh0b29sX29wczsKKwluZXRkZXYtPnR4X3RpbWVvdXQJCT0gam1lX3R4X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbwkJPSBUWF9USU1FT1VUOworCW5ldGRldi0+dmxhbl9yeF9yZWdpc3Rlcgk9IGptZV92bGFuX3J4X3JlZ2lzdGVyOworCU5FVERFVl9HRVRfU1RBVFMobmV0ZGV2LCAmam1lX2dldF9zdGF0cyk7CisJbmV0ZGV2LT5mZWF0dXJlcwkJPQlORVRJRl9GX0hXX0NTVU0gfAorCQkJCQkJTkVUSUZfRl9TRyB8CisJCQkJCQlORVRJRl9GX1RTTyB8CisJCQkJCQlORVRJRl9GX1RTTzYgfAorCQkJCQkJTkVUSUZfRl9IV19WTEFOX1RYIHwKKwkJCQkJCU5FVElGX0ZfSFdfVkxBTl9SWDsKKwlpZiAodXNpbmdfZGFjKQorCQluZXRkZXYtPmZlYXR1cmVzCXw9CU5FVElGX0ZfSElHSERNQTsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisKKwkvKgorCSAqIGluaXQgYWRhcHRlciBpbmZvCisJICovCisJam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlqbWUtPnBkZXYgPSBwZGV2OworCWptZS0+ZGV2ID0gbmV0ZGV2OworCWptZS0+am1lX3J4ID0gbmV0aWZfcng7CisJam1lLT5qbWVfdmxhbl9yeCA9IHZsYW5faHdhY2NlbF9yeDsKKwlqbWUtPm9sZF9tdHUgPSBuZXRkZXYtPm10dSA9IDE1MDA7CisJam1lLT5waHlsaW5rID0gMDsKKwlqbWUtPnR4X3Jpbmdfc2l6ZSA9IDEgPDwgMTA7CisJam1lLT50eF9yaW5nX21hc2sgPSBqbWUtPnR4X3Jpbmdfc2l6ZSAtIDE7CisJam1lLT50eF93YWtlX3RocmVzaG9sZCA9IDEgPDwgOTsKKwlqbWUtPnJ4X3Jpbmdfc2l6ZSA9IDEgPDwgOTsKKwlqbWUtPnJ4X3JpbmdfbWFzayA9IGptZS0+cnhfcmluZ19zaXplIC0gMTsKKwlqbWUtPm1zZ19lbmFibGUgPSBKTUVfREVGX01TR19FTkFCTEU7CisJam1lLT5yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmICghKGptZS0+cmVncykpIHsKKwkJamVwcmludGsocGRldiwgIk1hcHBpbmcgUENJIHJlc291cmNlIHJlZ2lvbiBlcnJvci5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisJam1lLT5zaGFkb3dfcmVncyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCQlzaXplb2YodTMyKSAqIFNIQURPV19SRUdfTlIsCisJCQkJCQkmKGptZS0+c2hhZG93X2RtYSkpOworCWlmICghKGptZS0+c2hhZG93X3JlZ3MpKSB7CisJCWplcHJpbnRrKHBkZXYsICJBbGxvY2F0aW5nIHNoYWRvdyByZWdpc3RlciBtYXBwaW5nIGVycm9yLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KKworCWlmIChub19wc2V1ZG9ocCkgeworCQlhcG1jID0ganJlYWQzMihqbWUsIEpNRV9BUE1DKSAmIH5KTUVfQVBNQ19QU0VVRE9fSFBfRU47CisJCWp3cml0ZTMyKGptZSwgSk1FX0FQTUMsIGFwbWMpOworCX0gZWxzZSBpZiAoZm9yY2VfcHNldWRvaHApIHsKKwkJYXBtYyA9IGpyZWFkMzIoam1lLCBKTUVfQVBNQykgfCBKTUVfQVBNQ19QU0VVRE9fSFBfRU47CisJCWp3cml0ZTMyKGptZSwgSk1FX0FQTUMsIGFwbWMpOworCX0KKworCU5FVElGX05BUElfU0VUKG5ldGRldiwgJmptZS0+bmFwaSwgam1lX3BvbGwsIGptZS0+cnhfcmluZ19zaXplID4+IDIpCisKKwlzcGluX2xvY2tfaW5pdCgmam1lLT5waHlfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmptZS0+bWFjYWRkcl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmam1lLT5yeG1jc19sb2NrKTsKKworCWF0b21pY19zZXQoJmptZS0+bGlua19jaGFuZ2luZywgMSk7CisJYXRvbWljX3NldCgmam1lLT5yeF9jbGVhbmluZywgMSk7CisJYXRvbWljX3NldCgmam1lLT50eF9jbGVhbmluZywgMSk7CisJYXRvbWljX3NldCgmam1lLT5yeF9lbXB0eSwgMSk7CisKKwl0YXNrbGV0X2luaXQoJmptZS0+cGNjX3Rhc2ssCisJCSAgICAgJmptZV9wY2NfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgam1lKTsKKwl0YXNrbGV0X2luaXQoJmptZS0+bGlua2NoX3Rhc2ssCisJCSAgICAgJmptZV9saW5rX2NoYW5nZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBqbWUpOworCXRhc2tsZXRfaW5pdCgmam1lLT50eGNsZWFuX3Rhc2ssCisJCSAgICAgJmptZV90eF9jbGVhbl90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBqbWUpOworCXRhc2tsZXRfaW5pdCgmam1lLT5yeGNsZWFuX3Rhc2ssCisJCSAgICAgJmptZV9yeF9jbGVhbl90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBqbWUpOworCXRhc2tsZXRfaW5pdCgmam1lLT5yeGVtcHR5X3Rhc2ssCisJCSAgICAgJmptZV9yeF9lbXB0eV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBqbWUpOworCXRhc2tsZXRfZGlzYWJsZV9ub3N5bmMoJmptZS0+dHhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2Rpc2FibGVfbm9zeW5jKCZqbWUtPnJ4Y2xlYW5fdGFzayk7CisJdGFza2xldF9kaXNhYmxlX25vc3luYygmam1lLT5yeGVtcHR5X3Rhc2spOworCWptZS0+ZHBpLmN1ciA9IFBDQ19QMTsKKworCWptZS0+cmVnX2doYyA9IDA7CisJam1lLT5yZWdfcnhjcyA9IFJYQ1NfREVGQVVMVDsKKwlqbWUtPnJlZ19yeG1jcyA9IFJYTUNTX0RFRkFVTFQ7CisJam1lLT5yZWdfdHhwZmMgPSAwOworCWptZS0+cmVnX3BtY3MgPSBQTUNTX01GRU47CisJc2V0X2JpdChKTUVfRkxBR19UWENTVU0sICZqbWUtPmZsYWdzKTsKKwlzZXRfYml0KEpNRV9GTEFHX1RTTywgJmptZS0+ZmxhZ3MpOworCisJLyoKKwkgKiBHZXQgTWF4IFJlYWQgUmVxIFNpemUgZnJvbSBQQ0kgQ29uZmlnIFNwYWNlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0RDU1JfTVJSUywgJmptZS0+bXJycyk7CisJam1lLT5tcnJzICY9IFBDSV9EQ1NSX01SUlNfTUFTSzsKKwlzd2l0Y2ggKGptZS0+bXJycykgeworCWNhc2UgTVJSU18xMjhCOgorCQlqbWUtPnJlZ190eGNzID0gVFhDU19ERUZBVUxUIHwgVFhDU19ETUFTSVpFXzEyOEI7CisJCWJyZWFrOworCWNhc2UgTVJSU18yNTZCOgorCQlqbWUtPnJlZ190eGNzID0gVFhDU19ERUZBVUxUIHwgVFhDU19ETUFTSVpFXzI1NkI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWptZS0+cmVnX3R4Y3MgPSBUWENTX0RFRkFVTFQgfCBUWENTX0RNQVNJWkVfNTEyQjsKKwkJYnJlYWs7CisJfTsKKworCS8qCisJICogTXVzdCBjaGVjayBiZWZvcmUgcmVzZXRfbWFjX3Byb2Nlc3NvcgorCSAqLworCWptZV9jaGVja19od192ZXIoam1lKTsKKwlqbWUtPm1paV9pZi5kZXYgPSBuZXRkZXY7CisJaWYgKGptZS0+ZnBnYXZlcikgeworCQlqbWUtPm1paV9pZi5waHlfaWQgPSAwOworCQlmb3IgKGkgPSAxIDsgaSA8IDMyIDsgKytpKSB7CisJCQlibWNyID0gam1lX21kaW9fcmVhZChuZXRkZXYsIGksIE1JSV9CTUNSKTsKKwkJCWJtc3IgPSBqbWVfbWRpb19yZWFkKG5ldGRldiwgaSwgTUlJX0JNU1IpOworCQkJaWYgKGJtY3IgIT0gMHhGRkZGVSAmJiAoYm1jciAhPSAwIHx8IGJtc3IgIT0gMCkpIHsKKwkJCQlqbWUtPm1paV9pZi5waHlfaWQgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFqbWUtPm1paV9pZi5waHlfaWQpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWplcHJpbnRrKHBkZXYsICJDYW4gbm90IGZpbmQgcGh5X2lkLlxuIik7CisJCQkgZ290byBlcnJfb3V0X2ZyZWVfc2hhZG93OworCQl9CisKKwkJam1lLT5yZWdfZ2hjIHw9IEdIQ19MSU5LX1BPTEw7CisJfSBlbHNlIHsKKwkJam1lLT5taWlfaWYucGh5X2lkID0gMTsKKwl9CisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1DMjUwKQorCQlqbWUtPm1paV9pZi5zdXBwb3J0c19nbWlpID0gdHJ1ZTsKKwllbHNlCisJCWptZS0+bWlpX2lmLnN1cHBvcnRzX2dtaWkgPSBmYWxzZTsKKwlqbWUtPm1paV9pZi5tZGlvX3JlYWQgPSBqbWVfbWRpb19yZWFkOworCWptZS0+bWlpX2lmLm1kaW9fd3JpdGUgPSBqbWVfbWRpb193cml0ZTsKKworCWptZV9jbGVhcl9wbShqbWUpOworCWptZV9zZXRfcGh5Zmlmb2Eoam1lKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZqbWUtPnJldik7CisJaWYgKCFqbWUtPmZwZ2F2ZXIpCisJCWptZV9waHlfaW5pdChqbWUpOworCWptZV9waHlfb2ZmKGptZSk7CisKKwkvKgorCSAqIFJlc2V0IE1BQyBwcm9jZXNzb3IgYW5kIHJlbG9hZCBFRVBST00gZm9yIE1BQyBBZGRyZXNzCisJICovCisJam1lX3Jlc2V0X21hY19wcm9jZXNzb3Ioam1lKTsKKwlyYyA9IGptZV9yZWxvYWRfZWVwcm9tKGptZSk7CisJaWYgKHJjKSB7CisJCWplcHJpbnRrKHBkZXYsCisJCQkiUmVsb2FkIGVlcHJvbSBmb3IgcmVhZGluZyBNQUMgQWRkcmVzcyBlcnJvci5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9zaGFkb3c7CisJfQorCWptZV9sb2FkX21hY2FkZHIobmV0ZGV2KTsKKworCS8qCisJICogVGVsbCBzdGFjayB0aGF0IHdlIGFyZSBub3QgcmVhZHkgdG8gd29yayB1bnRpbCBvcGVuKCkKKwkgKi8KKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qCisJICogUmVnaXN0ZXIgbmV0ZGV2CisJICovCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmMpIHsKKwkJamVwcmludGsocGRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3NoYWRvdzsKKwl9CisKKwltc2dfcHJvYmUoam1lLAorCQkiSk1DMjUwIGdpZ2FiaXQlcyB2ZXI6JXggcmV2OiV4ICIKKwkJIm1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCShqbWUtPmZwZ2F2ZXIgIT0gMCkgPyAiIChGUEdBKSIgOiAiIiwKKwkJKGptZS0+ZnBnYXZlciAhPSAwKSA/IGptZS0+ZnBnYXZlciA6IGptZS0+Y2hpcHJldiwKKwkJam1lLT5yZXYsCisJCW5ldGRldi0+ZGV2X2FkZHJbMF0sCisJCW5ldGRldi0+ZGV2X2FkZHJbMV0sCisJCW5ldGRldi0+ZGV2X2FkZHJbMl0sCisJCW5ldGRldi0+ZGV2X2FkZHJbM10sCisJCW5ldGRldi0+ZGV2X2FkZHJbNF0sCisJCW5ldGRldi0+ZGV2X2FkZHJbNV0pOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9zaGFkb3c6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJICAgIHNpemVvZih1MzIpICogU0hBRE9XX1JFR19OUiwKKwkJCSAgICBqbWUtPnNoYWRvd19yZWdzLAorCQkJICAgIGptZS0+c2hhZG93X2RtYSk7CitlcnJfb3V0X3VubWFwOgorCWlvdW5tYXAoam1lLT5yZWdzKTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlX3BkZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAoram1lX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCSAgICBzaXplb2YodTMyKSAqIFNIQURPV19SRUdfTlIsCisJCQkgICAgam1lLT5zaGFkb3dfcmVncywKKwkJCSAgICBqbWUtPnNoYWRvd19kbWEpOworCWlvdW5tYXAoam1lLT5yZWdzKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50CitqbWVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWUgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYXRvbWljX2RlYygmam1lLT5saW5rX2NoYW5naW5nKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJam1lX3N0b3BfaXJxKGptZSk7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmptZS0+dHhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2Rpc2FibGUoJmptZS0+cnhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2Rpc2FibGUoJmptZS0+cnhlbXB0eV90YXNrKTsKKworCWptZV9kaXNhYmxlX3NoYWRvdyhqbWUpOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlpZiAodGVzdF9iaXQoSk1FX0ZMQUdfUE9MTCwgJmptZS0+ZmxhZ3MpKQorCQkJam1lX3BvbGxpbmdfbW9kZShqbWUpOworCisJCWptZV9zdG9wX3BjY190aW1lcihqbWUpOworCQlqbWVfcmVzZXRfZ2hjX3NwZWVkKGptZSk7CisJCWptZV9kaXNhYmxlX3J4X2VuZ2luZShqbWUpOworCQlqbWVfZGlzYWJsZV90eF9lbmdpbmUoam1lKTsKKwkJam1lX3Jlc2V0X21hY19wcm9jZXNzb3Ioam1lKTsKKwkJam1lX2ZyZWVfcnhfcmVzb3VyY2VzKGptZSk7CisJCWptZV9mcmVlX3R4X3Jlc291cmNlcyhqbWUpOworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQlqbWUtPnBoeWxpbmsgPSAwOworCX0KKworCXRhc2tsZXRfZW5hYmxlKCZqbWUtPnR4Y2xlYW5fdGFzayk7CisJdGFza2xldF9oaV9lbmFibGUoJmptZS0+cnhjbGVhbl90YXNrKTsKKwl0YXNrbGV0X2hpX2VuYWJsZSgmam1lLT5yeGVtcHR5X3Rhc2spOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKGptZS0+cmVnX3BtY3MpIHsKKwkJam1lX3NldF8xMDBtX2hhbGYoam1lKTsKKworCQlpZiAoam1lLT5yZWdfcG1jcyAmIChQTUNTX0xGRU4gfCBQTUNTX0xSRU4pKQorCQkJam1lX3dhaXRfbGluayhqbWUpOworCisJCWp3cml0ZTMyKGptZSwgSk1FX1BNQ1MsIGptZS0+cmVnX3BtY3MpOworCisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCB0cnVlKTsKKwl9IGVsc2UgeworCQlqbWVfcGh5X29mZihqbWUpOworCX0KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2NvbGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlqbWVfY2xlYXJfcG0oam1lKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlmICh0ZXN0X2JpdChKTUVfRkxBR19TU0VULCAmam1lLT5mbGFncykpCisJCWptZV9zZXRfc2V0dGluZ3MobmV0ZGV2LCAmam1lLT5vbGRfZWNtZCk7CisJZWxzZQorCQlqbWVfcmVzZXRfcGh5X3Byb2Nlc3NvcihqbWUpOworCisJam1lX2VuYWJsZV9zaGFkb3coam1lKTsKKwlqbWVfc3RhcnRfaXJxKGptZSk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCisJYXRvbWljX2luYygmam1lLT5saW5rX2NoYW5naW5nKTsKKworCWptZV9yZXNldF9saW5rKGptZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgam1lX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUMyNTApIH0sCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1DMjYwKSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGptZV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICAgID0gRFJWX05BTUUsCisJLmlkX3RhYmxlICAgICAgID0gam1lX3BjaV90YmwsCisJLnByb2JlICAgICAgICAgID0gam1lX2luaXRfb25lLAorCS5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhpdF9wKGptZV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCAgICAgICAgPSBqbWVfc3VzcGVuZCwKKwkucmVzdW1lICAgICAgICAgPSBqbWVfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworc3RhdGljIGludCBfX2luaXQKK2ptZV9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gUEZYICJKTWljcm9uIEpNQzI1MCBnaWdhYml0IGV0aGVybmV0ICIKKwkgICAgICAgImRyaXZlciB2ZXJzaW9uICVzXG4iLCBEUlZfVkVSU0lPTik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmptZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2ptZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmam1lX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGptZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChqbWVfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJHdW8tRnUgVHNlbmcgPGNvb2xkYXZpZEBjb29sZGF2aWQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJKTWljcm9uIEpNQzJ4MCBQQ0kgRXhwcmVzcyBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBqbWVfcGNpX3RibCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ptZS5oIGIvZHJpdmVycy9uZXQvam1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2M2FlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ptZS5oCkBAIC0wLDAgKzEsMTIyOSBAQAorLyoKKyAqIEpNaWNyb24gSk1DMngwIHNlcmllcyBQQ0llIEV0aGVybmV0IExpbnV4IERldmljZSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBKTWljcm9uIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIGh0dHA6Ly93d3cuam1pY3Jvbi5jb20vCisgKgorICogQXV0aG9yOiBHdW8tRnUgVHNlbmcgPGNvb2xkYXZpZEBjb29sZGF2aWQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19KTUVfSF9JTkNMVURFRF9fCisjZGVmaW5lIF9fSk1FX0hfSU5DTFVERUVfXworCisjZGVmaW5lIERSVl9OQU1FCSJqbWUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAuMyIKKyNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQzI1MAkweDAyNTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQzI2MAkweDAyNjAKKworLyoKKyAqIE1lc3NhZ2UgcmVsYXRlZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEpNRV9ERUZfTVNHX0VOQUJMRSBcCisJKE5FVElGX01TR19QUk9CRSB8IFwKKwlORVRJRl9NU0dfTElOSyB8IFwKKwlORVRJRl9NU0dfUlhfRVJSIHwgXAorCU5FVElGX01TR19UWF9FUlIgfCBcCisJTkVUSUZfTVNHX0hXKQorCisjZGVmaW5lIGplcHJpbnRrKHBkZXYsIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0VSUiBQRlggZm10LCAjIyBhcmdzKQorCisjaWZkZWYgVFhfREVCVUcKKyNkZWZpbmUgdHhfZGJnKHByaXYsIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIChwcml2KS0+ZGV2LT5uYW1lLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgdHhfZGJnKHByaXYsIGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIGptZV9tc2cobXNnbHZsLCB0eXBlLCBwcml2LCBmbXQsIGFyZ3MuLi4pIFwKKwlpZiAobmV0aWZfbXNnXyMjdHlwZShwcml2KSkgXAorCQlwcmludGsobXNnbHZsICIlczogIiBmbXQsIChwcml2KS0+ZGV2LT5uYW1lLCAjIyBhcmdzKQorCisjZGVmaW5lIG1zZ19wcm9iZShwcml2LCBmbXQsIGFyZ3MuLi4pIFwKKwlqbWVfbXNnKEtFUk5fSU5GTywgcHJvYmUsIHByaXYsIGZtdCwgIyMgYXJncykKKworI2RlZmluZSBtc2dfbGluayhwcml2LCBmbXQsIGFyZ3MuLi4pIFwKKwlqbWVfbXNnKEtFUk5fSU5GTywgbGluaywgcHJpdiwgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIG1zZ19pbnRyKHByaXYsIGZtdCwgYXJncy4uLikgXAorCWptZV9tc2coS0VSTl9JTkZPLCBpbnRyLCBwcml2LCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgbXNnX3J4X2Vycihwcml2LCBmbXQsIGFyZ3MuLi4pIFwKKwlqbWVfbXNnKEtFUk5fRVJSLCByeF9lcnIsIHByaXYsIGZtdCwgIyMgYXJncykKKworI2RlZmluZSBtc2dfcnhfc3RhdHVzKHByaXYsIGZtdCwgYXJncy4uLikgXAorCWptZV9tc2coS0VSTl9JTkZPLCByeF9zdGF0dXMsIHByaXYsIGZtdCwgIyMgYXJncykKKworI2RlZmluZSBtc2dfdHhfZXJyKHByaXYsIGZtdCwgYXJncy4uLikgXAorCWptZV9tc2coS0VSTl9FUlIsIHR4X2VyciwgcHJpdiwgZm10LCAjIyBhcmdzKQorCisjZGVmaW5lIG1zZ190eF9kb25lKHByaXYsIGZtdCwgYXJncy4uLikgXAorCWptZV9tc2coS0VSTl9JTkZPLCB0eF9kb25lLCBwcml2LCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgbXNnX3R4X3F1ZXVlZChwcml2LCBmbXQsIGFyZ3MuLi4pIFwKKwlqbWVfbXNnKEtFUk5fSU5GTywgdHhfcXVldWVkLCBwcml2LCBmbXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgbXNnX2h3KHByaXYsIGZtdCwgYXJncy4uLikgXAorCWptZV9tc2coS0VSTl9FUlIsIGh3LCBwcml2LCBmbXQsICMjIGFyZ3MpCisKKy8qCisgKiBFeHRyYSBQQ0kgQ29uZmlndXJhdGlvbiBzcGFjZSBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBQQ0lfRENTUl9NUlJTCQkweDU5CisjZGVmaW5lIFBDSV9EQ1NSX01SUlNfTUFTSwkweDcwCisKK2VudW0gcGNpX2Rjc3JfbXJyc192YWxzIHsKKwlNUlJTXzEyOEIJPSAweDAwLAorCU1SUlNfMjU2Qgk9IDB4MTAsCisJTVJSU181MTJCCT0gMHgyMCwKKwlNUlJTXzEwMjRCCT0gMHgzMCwKKwlNUlJTXzIwNDhCCT0gMHg0MCwKKwlNUlJTXzQwOTZCCT0gMHg1MCwKK307CisKKyNkZWZpbmUgUENJX1NQSQkJCTB4QjAKKworZW51bSBwY2lfc3BpX2JpdHMgeworCVNQSV9FTgkJPSAweDEwLAorCVNQSV9NSVNPCT0gMHgwOCwKKwlTUElfTU9TSQk9IDB4MDQsCisJU1BJX1NDTEsJPSAweDAyLAorCVNQSV9DUwkJPSAweDAxLAorfTsKKworc3RydWN0IGptZV9zcGlfb3AgeworCXZvaWQgX191c2VyICp1d2J1ZjsKKwl2b2lkIF9fdXNlciAqdXJidWY7CisJX191OAl3bjsJLyogTnVtYmVyIG9mIHdyaXRlIGFjdGlvbnMgKi8KKwlfX3U4CXJuOwkvKiBOdW1iZXIgb2YgcmVhZCBhY3Rpb25zICovCisJX191OAliaXRuOwkvKiBOdW1iZXIgb2YgYml0cyBwZXIgYWN0aW9uICovCisJX191OAlzcGQ7CS8qIFRoZSBtYXhpbSBhY2NlcHRhYmxlIHNwZWVkIG9mIGNvbnRyb2xsZXIsIGluIE1Iei4qLworCV9fdTgJbW9kZTsJLyogQ1BPTCwgQ1BIQSwgYW5kIER1cGxleCBtb2RlIG9mIFNQSSAqLworCisJLyogSW50ZXJuYWwgdXNlIG9ubHkgKi8KKwl1OAkqa3didWY7CisJdTgJKmtyYnVmOworCXU4CXNyOworCXUxNgloYWxmY2xrOyAvKiBIYWxmIG9mIGNsb2NrIGN5Y2xlIGNhbGN1bGF0ZWQgZnJvbSBzcGQsIGluIG5zICovCit9OworCitlbnVtIGptZV9zcGlfb3BfYml0cyB7CisJU1BJX01PREVfQ1BIQQk9IDB4MDEsCisJU1BJX01PREVfQ1BPTAk9IDB4MDIsCisJU1BJX01PREVfRFVQCT0gMHg4MCwKK307CisKKyNkZWZpbmUgSEFMRl9VUyA1MDAJLyogNTAwIG5zICovCisjZGVmaW5lIEpNRVNQSUlPQ1RMCVNJT0NERVZQUklWQVRFCisKKy8qCisgKiBEeW5hbWljKGFkYXB0aXZlKS9TdGF0aWMgUENDIHZhbHVlcworICovCitlbnVtIGR5bmFtaWNfcGNjX3ZhbHVlcyB7CisJUENDX09GRgkJPSAwLAorCVBDQ19QMQkJPSAxLAorCVBDQ19QMgkJPSAyLAorCVBDQ19QMwkJPSAzLAorCisJUENDX09GRl9UTwk9IDAsCisJUENDX1AxX1RPCT0gMSwKKwlQQ0NfUDJfVE8JPSA2NCwKKwlQQ0NfUDNfVE8JPSAxMjgsCisKKwlQQ0NfT0ZGX0NOVAk9IDAsCisJUENDX1AxX0NOVAk9IDEsCisJUENDX1AyX0NOVAk9IDE2LAorCVBDQ19QM19DTlQJPSAzMiwKK307CitzdHJ1Y3QgZHlucGNjX2luZm8geworCXVuc2lnbmVkIGxvbmcJbGFzdF9ieXRlczsKKwl1bnNpZ25lZCBsb25nCWxhc3RfcGt0czsKKwl1bnNpZ25lZCBsb25nCWludHJfY250OworCXVuc2lnbmVkIGNoYXIJY3VyOworCXVuc2lnbmVkIGNoYXIJYXR0ZW1wdDsKKwl1bnNpZ25lZCBjaGFyCWNudDsKK307CisjZGVmaW5lIFBDQ19JTlRFUlZBTF9VUwkxMDAwMDAKKyNkZWZpbmUgUENDX0lOVEVSVkFMIChIWiAvICgxMDAwMDAwIC8gUENDX0lOVEVSVkFMX1VTKSkKKyNkZWZpbmUgUENDX1AzX1RIUkVTSE9MRCAoMiAqIDEwMjQgKiAxMDI0KQorI2RlZmluZSBQQ0NfUDJfVEhSRVNIT0xEIDgwMAorI2RlZmluZSBQQ0NfSU5UUl9USFJFU0hPTEQgODAwCisjZGVmaW5lIFBDQ19UWF9UTyAxMDAwCisjZGVmaW5lIFBDQ19UWF9DTlQgOAorCisvKgorICogVFgvUlggRGVzY3JpcHRvcnMKKyAqCisgKiBUWC9SWCBSaW5nIERFU0MgQ291bnQgTXVzdCBiZSBtdWx0aXBsZSBvZiAxNiBhbmQgPD0gMTAyNAorICovCisjZGVmaW5lIFJJTkdfREVTQ19BTElHTgkJMTYJLyogRGVzY3JpcHRvciBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgVFhfREVTQ19TSVpFCQkxNgorI2RlZmluZSBUWF9SSU5HX05SCQk4CisjZGVmaW5lIFRYX1JJTkdfQUxMT0NfU0laRShzKQkoKHMgKiBUWF9ERVNDX1NJWkUpICsgUklOR19ERVNDX0FMSUdOKQorCitzdHJ1Y3QgdHhkZXNjIHsKKwl1bmlvbiB7CisJCV9fdTgJYWxsWzE2XTsKKwkJX19sZTMyCWR3WzRdOworCQlzdHJ1Y3QgeworCQkJLyogRFcwICovCisJCQlfX2xlMTYJdmxhbjsKKwkJCV9fdTgJcnN2MTsKKwkJCV9fdTgJZmxhZ3M7CisKKwkJCS8qIERXMSAqLworCQkJX19sZTE2CWRhdGFsZW47CisJCQlfX2xlMTYJbXNzOworCisJCQkvKiBEVzIgKi8KKwkJCV9fbGUxNglwa3RzaXplOworCQkJX19sZTE2CXJzdjI7CisKKwkJCS8qIERXMyAqLworCQkJX19sZTMyCWJ1ZmFkZHI7CisJCX0gZGVzYzE7CisJCXN0cnVjdCB7CisJCQkvKiBEVzAgKi8KKwkJCV9fbGUxNglyc3YxOworCQkJX191OAlyc3YyOworCQkJX191OAlmbGFnczsKKworCQkJLyogRFcxICovCisJCQlfX2xlMTYJZGF0YWxlbjsKKwkJCV9fbGUxNglyc3YzOworCisJCQkvKiBEVzIgKi8KKwkJCV9fbGUzMglidWZhZGRyaDsKKworCQkJLyogRFczICovCisJCQlfX2xlMzIJYnVmYWRkcmw7CisJCX0gZGVzYzI7CisJCXN0cnVjdCB7CisJCQkvKiBEVzAgKi8KKwkJCV9fdTgJZWhkcnN6OworCQkJX191OAlyc3YxOworCQkJX191OAlyc3YyOworCQkJX191OAlmbGFnczsKKworCQkJLyogRFcxICovCisJCQlfX2xlMTYJdHJ5Y250OworCQkJX19sZTE2CXNlZ2NudDsKKworCQkJLyogRFcyICovCisJCQlfX2xlMTYJcGt0c3o7CisJCQlfX2xlMTYJcnN2MzsKKworCQkJLyogRFczICovCisJCQlfX2xlMzIJYnVmYWRkcmw7CisJCX0gZGVzY3diOworCX07Cit9OworCitlbnVtIGptZV90eGRlc2NfZmxhZ3NfYml0cyB7CisJVFhGTEFHX09XTgk9IDB4ODAsCisJVFhGTEFHX0lOVAk9IDB4NDAsCisJVFhGTEFHXzY0QklUCT0gMHgyMCwKKwlUWEZMQUdfVENQQ1MJPSAweDEwLAorCVRYRkxBR19VRFBDUwk9IDB4MDgsCisJVFhGTEFHX0lQQ1MJPSAweDA0LAorCVRYRkxBR19MU0VOCT0gMHgwMiwKKwlUWEZMQUdfVEFHT04JPSAweDAxLAorfTsKKworI2RlZmluZSBUWERFU0NfTVNTX1NISUZUCTIKK2VudW0gam1lX3J4ZGVzY3diX2ZsYWdzX2JpdHMgeworCVRYV0JGTEFHX09XTgk9IDB4ODAsCisJVFhXQkZMQUdfSU5UCT0gMHg0MCwKKwlUWFdCRkxBR19UTU9VVAk9IDB4MjAsCisJVFhXQkZMQUdfVFJZT1VUCT0gMHgxMCwKKwlUWFdCRkxBR19DT0wJPSAweDA4LAorCisJVFhXQkZMQUdfQUxMRVJSCT0gVFhXQkZMQUdfVE1PVVQgfAorCQkJICBUWFdCRkxBR19UUllPVVQgfAorCQkJICBUWFdCRkxBR19DT0wsCit9OworCisjZGVmaW5lIFJYX0RFU0NfU0laRQkJMTYKKyNkZWZpbmUgUlhfUklOR19OUgkJNAorI2RlZmluZSBSWF9SSU5HX0FMTE9DX1NJWkUocykJKChzICogUlhfREVTQ19TSVpFKSArIFJJTkdfREVTQ19BTElHTikKKyNkZWZpbmUgUlhfQlVGX0RNQV9BTElHTgk4CisjZGVmaW5lIFJYX1BSRVBBRF9TSVpFCQkxMAorI2RlZmluZSBFVEhfQ1JDX0xFTgkJMgorI2RlZmluZSBSWF9WTEFOSERSX0xFTgkJMgorI2RlZmluZSBSWF9FWFRSQV9MRU4JCShSWF9QUkVQQURfU0laRSArIFwKKwkJCQlFVEhfSExFTiArIFwKKwkJCQlFVEhfQ1JDX0xFTiArIFwKKwkJCQlSWF9WTEFOSERSX0xFTiArIFwKKwkJCQlSWF9CVUZfRE1BX0FMSUdOKQorCitzdHJ1Y3QgcnhkZXNjIHsKKwl1bmlvbiB7CisJCV9fdTgJYWxsWzE2XTsKKwkJX19sZTMyCWR3WzRdOworCQlzdHJ1Y3QgeworCQkJLyogRFcwICovCisJCQlfX2xlMTYJcnN2MjsKKwkJCV9fdTgJcnN2MTsKKwkJCV9fdTgJZmxhZ3M7CisKKwkJCS8qIERXMSAqLworCQkJX19sZTE2CWRhdGFsZW47CisJCQlfX2xlMTYJd2JjcGw7CisKKwkJCS8qIERXMiAqLworCQkJX19sZTMyCWJ1ZmFkZHJoOworCisJCQkvKiBEVzMgKi8KKwkJCV9fbGUzMglidWZhZGRybDsKKwkJfSBkZXNjMTsKKwkJc3RydWN0IHsKKwkJCS8qIERXMCAqLworCQkJX19sZTE2CXZsYW47CisJCQlfX2xlMTYJZmxhZ3M7CisKKwkJCS8qIERXMSAqLworCQkJX19sZTE2CWZyYW1lc2l6ZTsKKwkJCV9fdTgJZXJyc3RhdDsKKwkJCV9fdTgJZGVzY2NudDsKKworCQkJLyogRFcyICovCisJCQlfX2xlMzIJcnNzaGFzaDsKKworCQkJLyogRFczICovCisJCQlfX3U4CWhhc2hmdW47CisJCQlfX3U4CWhhc2h0eXBlOworCQkJX19sZTE2CXJlc3J2OworCQl9IGRlc2N3YjsKKwl9OworfTsKKworZW51bSBqbWVfcnhkZXNjX2ZsYWdzX2JpdHMgeworCVJYRkxBR19PV04JPSAweDgwLAorCVJYRkxBR19JTlQJPSAweDQwLAorCVJYRkxBR182NEJJVAk9IDB4MjAsCit9OworCitlbnVtIGptZV9yeHdiZGVzY19mbGFnc19iaXRzIHsKKwlSWFdCRkxBR19PV04JCT0gMHg4MDAwLAorCVJYV0JGTEFHX0lOVAkJPSAweDQwMDAsCisJUlhXQkZMQUdfTUYJCT0gMHgyMDAwLAorCVJYV0JGTEFHXzY0QklUCQk9IDB4MjAwMCwKKwlSWFdCRkxBR19UQ1BPTgkJPSAweDEwMDAsCisJUlhXQkZMQUdfVURQT04JCT0gMHgwODAwLAorCVJYV0JGTEFHX0lQQ1MJCT0gMHgwNDAwLAorCVJYV0JGTEFHX1RDUENTCQk9IDB4MDIwMCwKKwlSWFdCRkxBR19VRFBDUwkJPSAweDAxMDAsCisJUlhXQkZMQUdfVEFHT04JCT0gMHgwMDgwLAorCVJYV0JGTEFHX0lQVjQJCT0gMHgwMDQwLAorCVJYV0JGTEFHX0lQVjYJCT0gMHgwMDIwLAorCVJYV0JGTEFHX1BBVVNFCQk9IDB4MDAxMCwKKwlSWFdCRkxBR19NQUdJQwkJPSAweDAwMDgsCisJUlhXQkZMQUdfV0FLRVVQCQk9IDB4MDAwNCwKKwlSWFdCRkxBR19ERVNUCQk9IDB4MDAwMywKKwlSWFdCRkxBR19ERVNUX1VOSQk9IDB4MDAwMSwKKwlSWFdCRkxBR19ERVNUX01VTAk9IDB4MDAwMiwKKwlSWFdCRkxBR19ERVNUX0JSTwk9IDB4MDAwMywKK307CisKK2VudW0gam1lX3J4d2JkZXNjX2Rlc2NjbnRfbWFzayB7CisJUlhXQkRDTlRfV0JDUEwJPSAweDgwLAorCVJYV0JEQ05UX0RDTlQJPSAweDdGLAorfTsKKworZW51bSBqbWVfcnh3YmRlc2NfZXJyc3RhdF9iaXRzIHsKKwlSWFdCRVJSX0xJTUlUCT0gMHg4MCwKKwlSWFdCRVJSX01JSUVSCT0gMHg0MCwKKwlSWFdCRVJSX05JQk9OCT0gMHgyMCwKKwlSWFdCRVJSX0NPTE9OCT0gMHgxMCwKKwlSWFdCRVJSX0FCT1JUCT0gMHgwOCwKKwlSWFdCRVJSX1NIT1JUCT0gMHgwNCwKKwlSWFdCRVJSX09WRVJVTgk9IDB4MDIsCisJUlhXQkVSUl9DUkNFUlIJPSAweDAxLAorCVJYV0JFUlJfQUxMRVJSCT0gMHhGRiwKK307CisKKy8qCisgKiBCdWZmZXIgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byByaW5nIGRlc2NyaXB0b3JzLgorICovCitzdHJ1Y3Qgam1lX2J1ZmZlcl9pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlpbnQgbGVuOworCWludCBucl9kZXNjOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfeG1pdDsKK307CisKKy8qCisgKiBUaGUgc3RydWN0dXJlIGhvbGRpbmcgYnVmZmVyIGluZm9ybWF0aW9uIGFuZCByaW5nIGRlc2NyaXB0b3JzIGFsbCB0b2dldGhlci4KKyAqLworI2RlZmluZSBNQVhfUklOR19ERVNDX05SCTEwMjQKK3N0cnVjdCBqbWVfcmluZyB7CisJdm9pZCAqYWxsb2M7CQkvKiBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwl2b2lkICpkZXNjOwkJLyogcG9pbnRlciB0byByaW5nIG1lbW9yeSAgKi8KKwlkbWFfYWRkcl90IGRtYWFsbG9jOwkvKiBwaHlzIGFkZHJlc3Mgb2YgcmluZyBhbGxvYyAqLworCWRtYV9hZGRyX3QgZG1hOwkJLyogcGh5cyBhZGRyZXNzIGZvciByaW5nIGRtYSAqLworCisJLyogQnVmZmVyIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yICovCisJc3RydWN0IGptZV9idWZmZXJfaW5mbyBidWZpbmZbTUFYX1JJTkdfREVTQ19OUl07CisKKwlpbnQgbmV4dF90b191c2U7CisJYXRvbWljX3QgbmV4dF90b19jbGVhbjsKKwlhdG9taWNfdCBucl9mcmVlOworfTsKKworI2RlZmluZSBORVRfU1RBVChwcml2KSAocHJpdi0+ZGV2LT5zdGF0cykKKyNkZWZpbmUgTkVUREVWX0dFVF9TVEFUUyhuZXRkZXYsIGZ1bl9wdHIpCisjZGVmaW5lIERFQ0xBUkVfTkVUX0RFVklDRV9TVEFUUworCisjZGVmaW5lIERFQ0xBUkVfTkFQSV9TVFJVQ1Qgc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisjZGVmaW5lIE5FVElGX05BUElfU0VUKGRldiwgbmFwaXMsIHBvbGxmbiwgcSkgXAorCW5ldGlmX25hcGlfYWRkKGRldiwgbmFwaXMsIHBvbGxmbiwgcSk7CisjZGVmaW5lIEpNRV9OQVBJX0hPTERFUihob2xkZXIpIHN0cnVjdCBuYXBpX3N0cnVjdCAqaG9sZGVyCisjZGVmaW5lIEpNRV9OQVBJX1dFSUdIVCh3KSBpbnQgdworI2RlZmluZSBKTUVfTkFQSV9XRUlHSFRfVkFMKHcpIHcKKyNkZWZpbmUgSk1FX05BUElfV0VJR0hUX1NFVCh3LCByKQorI2RlZmluZSBKTUVfUlhfQ09NUExFVEUoZGV2LCBuYXBpcykgbmV0aWZfcnhfY29tcGxldGUoZGV2LCBuYXBpcykKKyNkZWZpbmUgSk1FX05BUElfRU5BQkxFKHByaXYpIG5hcGlfZW5hYmxlKCZwcml2LT5uYXBpKTsKKyNkZWZpbmUgSk1FX05BUElfRElTQUJMRShwcml2KSBcCisJaWYgKCFuYXBpX2Rpc2FibGVfcGVuZGluZygmcHJpdi0+bmFwaSkpIFwKKwkJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKyNkZWZpbmUgSk1FX1JYX1NDSEVEVUxFX1BSRVAocHJpdikgXAorCW5ldGlmX3J4X3NjaGVkdWxlX3ByZXAocHJpdi0+ZGV2LCAmcHJpdi0+bmFwaSkKKyNkZWZpbmUgSk1FX1JYX1NDSEVEVUxFKHByaXYpIFwKKwlfX25ldGlmX3J4X3NjaGVkdWxlKHByaXYtPmRldiwgJnByaXYtPm5hcGkpOworCisvKgorICogSm1hYyBBZGFwdGVyIFByaXZhdGUgZGF0YQorICovCisjZGVmaW5lIFNIQURPV19SRUdfTlIgOAorc3RydWN0IGptZV9hZGFwdGVyIHsKKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OworCXZvaWQgX19pb21lbSAgICAgICAgICAgICpyZWdzOworCWRtYV9hZGRyX3QJCXNoYWRvd19kbWE7CisJdTMyCQkJKnNoYWRvd19yZWdzOworCXN0cnVjdCBtaWlfaWZfaW5mbwltaWlfaWY7CisJc3RydWN0IGptZV9yaW5nCQlyeHJpbmdbUlhfUklOR19OUl07CisJc3RydWN0IGptZV9yaW5nCQl0eHJpbmdbVFhfUklOR19OUl07CisJc3BpbmxvY2tfdAkJcGh5X2xvY2s7CisJc3BpbmxvY2tfdAkJbWFjYWRkcl9sb2NrOworCXNwaW5sb2NrX3QJCXJ4bWNzX2xvY2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXJ4ZW1wdHlfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnhjbGVhbl90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0eGNsZWFuX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWxpbmtjaF90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlwY2NfdGFzazsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1MzIJCQlyZWdfdHhjczsKKwl1MzIJCQlyZWdfdHhwZmM7CisJdTMyCQkJcmVnX3J4Y3M7CisJdTMyCQkJcmVnX3J4bWNzOworCXUzMgkJCXJlZ19naGM7CisJdTMyCQkJcmVnX3BtY3M7CisJdTMyCQkJcGh5bGluazsKKwl1MzIJCQl0eF9yaW5nX3NpemU7CisJdTMyCQkJdHhfcmluZ19tYXNrOworCXUzMgkJCXR4X3dha2VfdGhyZXNob2xkOworCXUzMgkJCXJ4X3Jpbmdfc2l6ZTsKKwl1MzIJCQlyeF9yaW5nX21hc2s7CisJdTgJCQltcnJzOworCXVuc2lnbmVkIGludAkJZnBnYXZlcjsKKwl1bnNpZ25lZCBpbnQJCWNoaXByZXY7CisJdTgJCQlyZXY7CisJdTMyCQkJbXNnX2VuYWJsZTsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQJb2xkX2VjbWQ7CisJdW5zaWduZWQgaW50CQlvbGRfbXR1OworCXN0cnVjdCB2bGFuX2dyb3VwCSp2bGdycDsKKwlzdHJ1Y3QgZHlucGNjX2luZm8JZHBpOworCWF0b21pY190CQlpbnRyX3NlbTsKKwlhdG9taWNfdAkJbGlua19jaGFuZ2luZzsKKwlhdG9taWNfdAkJdHhfY2xlYW5pbmc7CisJYXRvbWljX3QJCXJ4X2NsZWFuaW5nOworCWF0b21pY190CQlyeF9lbXB0eTsKKwlpbnQJCQkoKmptZV9yeCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJaW50CQkJKCpqbWVfdmxhbl9yeCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IHZsYW5fdGFnKTsKKwlERUNMQVJFX05BUElfU1RSVUNUCisJREVDTEFSRV9ORVRfREVWSUNFX1NUQVRTCit9OworCitlbnVtIHNoYWRvd19yZWdfdmFsIHsKKwlTSEFET1dfSUVWRSA9IDAsCit9OworCitlbnVtIGptZV9mbGFnc19iaXRzIHsKKwlKTUVfRkxBR19NU0kJCT0gMSwKKwlKTUVfRkxBR19TU0VUCQk9IDIsCisJSk1FX0ZMQUdfVFhDU1VNCQk9IDMsCisJSk1FX0ZMQUdfVFNPCQk9IDQsCisJSk1FX0ZMQUdfUE9MTAkJPSA1LAorCUpNRV9GTEFHX1NIVVRET1dOCT0gNiwKK307CisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKDUgKiBIWikKKyNkZWZpbmUgSk1FX1JFR19MRU4JCTB4NTAwCisjZGVmaW5lIE1BWF9FVEhFUk5FVF9KVU1CT19QQUNLRVRfU0laRSA5MjE2CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGptZV9hZGFwdGVyKgoram1lX25hcGlfcHJpdihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkpCit7CisJc3RydWN0IGptZV9hZGFwdGVyICpqbWU7CisJam1lID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBqbWVfYWRhcHRlciwgbmFwaSk7CisJcmV0dXJuIGptZTsKK30KKworLyoKKyAqIE1NYXBlZCBJL08gUmVzdGVycworICovCitlbnVtIGptZV9pb21hcF9vZmZzZXRzIHsKKwlKTUVfTUFDCQk9IDB4MDAwMCwKKwlKTUVfUEhZCQk9IDB4MDQwMCwKKwlKTUVfTUlTQwk9IDB4MDgwMCwKKwlKTUVfUlNTCQk9IDB4MEMwMCwKK307CisKK2VudW0gam1lX2lvbWFwX2xlbnMgeworCUpNRV9NQUNfTEVOCT0gMHg4MCwKKwlKTUVfUEhZX0xFTgk9IDB4NTgsCisJSk1FX01JU0NfTEVOCT0gMHg5OCwKKwlKTUVfUlNTX0xFTgk9IDB4RkYsCit9OworCitlbnVtIGptZV9pb21hcF9yZWdzIHsKKwlKTUVfVFhDUwk9IEpNRV9NQUMgfCAweDAwLCAvKiBUcmFuc21pdCBDb250cm9sIGFuZCBTdGF0dXMgKi8KKwlKTUVfVFhEQkFfTE8JPSBKTUVfTUFDIHwgMHgwNCwgLyogVHJhbnNtaXQgUXVldWUgRGVzYyBCYXNlIEFkZHIgKi8KKwlKTUVfVFhEQkFfSEkJPSBKTUVfTUFDIHwgMHgwOCwgLyogVHJhbnNtaXQgUXVldWUgRGVzYyBCYXNlIEFkZHIgKi8KKwlKTUVfVFhRREMJPSBKTUVfTUFDIHwgMHgwQywgLyogVHJhbnNtaXQgUXVldWUgRGVzYyBDb3VudCAqLworCUpNRV9UWE5EQQk9IEpNRV9NQUMgfCAweDEwLCAvKiBUcmFuc21pdCBRdWV1ZSBOZXh0IERlc2MgQWRkciAqLworCUpNRV9UWE1DUwk9IEpNRV9NQUMgfCAweDE0LCAvKiBUcmFuc21pdCBNQUMgQ29udHJvbCBTdGF0dXMgKi8KKwlKTUVfVFhQRkMJPSBKTUVfTUFDIHwgMHgxOCwgLyogVHJhbnNtaXQgUGF1c2UgRnJhbWUgQ29udHJvbCAqLworCUpNRV9UWFRSSEQJPSBKTUVfTUFDIHwgMHgxQywgLyogVHJhbnNtaXQgVGltZXIvUmV0cnlASGFsZi1EdXAgKi8KKworCUpNRV9SWENTCT0gSk1FX01BQyB8IDB4MjAsIC8qIFJlY2VpdmUgQ29udHJvbCBhbmQgU3RhdHVzICovCisJSk1FX1JYREJBX0xPCT0gSk1FX01BQyB8IDB4MjQsIC8qIFJlY2VpdmUgUXVldWUgRGVzYyBCYXNlIEFkZHIgKi8KKwlKTUVfUlhEQkFfSEkJPSBKTUVfTUFDIHwgMHgyOCwgLyogUmVjZWl2ZSBRdWV1ZSBEZXNjIEJhc2UgQWRkciAqLworCUpNRV9SWFFEQwk9IEpNRV9NQUMgfCAweDJDLCAvKiBSZWNlaXZlIFF1ZXVlIERlc2MgQ291bnQgKi8KKwlKTUVfUlhOREEJPSBKTUVfTUFDIHwgMHgzMCwgLyogUmVjZWl2ZSBRdWV1ZSBOZXh0IERlc2MgQWRkciAqLworCUpNRV9SWE1DUwk9IEpNRV9NQUMgfCAweDM0LCAvKiBSZWNlaXZlIE1BQyBDb250cm9sIFN0YXR1cyAqLworCUpNRV9SWFVNQV9MTwk9IEpNRV9NQUMgfCAweDM4LCAvKiBSZWNlaXZlIFVuaWNhc3QgTUFDIEFkZHJlc3MgKi8KKwlKTUVfUlhVTUFfSEkJPSBKTUVfTUFDIHwgMHgzQywgLyogUmVjZWl2ZSBVbmljYXN0IE1BQyBBZGRyZXNzICovCisJSk1FX1JYTUNIVF9MTwk9IEpNRV9NQUMgfCAweDQwLCAvKiBSZWN2IE11bHRpY2FzdCBBZGRyIEhhc2hUYWJsZSAqLworCUpNRV9SWE1DSFRfSEkJPSBKTUVfTUFDIHwgMHg0NCwgLyogUmVjdiBNdWx0aWNhc3QgQWRkciBIYXNoVGFibGUgKi8KKwlKTUVfV0ZPRFAJPSBKTUVfTUFDIHwgMHg0OCwgLyogV2FrZXVwIEZyYW1lIE91dHB1dCBEYXRhIFBvcnQgKi8KKwlKTUVfV0ZPSQk9IEpNRV9NQUMgfCAweDRDLCAvKiBXYWtldXAgRnJhbWUgT3V0cHV0IEludGVyZmFjZSAqLworCisJSk1FX1NNSQkJPSBKTUVfTUFDIHwgMHg1MCwgLyogU3RhdGlvbiBNYW5hZ2VtZW50IEludGVyZmFjZSAqLworCUpNRV9HSEMJCT0gSk1FX01BQyB8IDB4NTQsIC8qIEdsb2JhbCBIb3N0IENvbnRyb2wgKi8KKwlKTUVfUE1DUwk9IEpNRV9NQUMgfCAweDYwLCAvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wvU3RhdCAqLworCisKKwlKTUVfUEhZX0NTCT0gSk1FX1BIWSB8IDB4MjgsIC8qIFBIWSBDdHJsIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlKTUVfUEhZX0xJTksJPSBKTUVfUEhZIHwgMHgzMCwgLyogUEhZIExpbmsgU3RhdHVzIFJlZ2lzdGVyICovCisJSk1FX1NNQkNTUgk9IEpNRV9QSFkgfCAweDQwLCAvKiBTTUIgQ29udHJvbCBhbmQgU3RhdHVzICovCisJSk1FX1NNQklOVEYJPSBKTUVfUEhZIHwgMHg0NCwgLyogU01CIEludGVyZmFjZSAqLworCisKKwlKTUVfVE1DU1IJPSBKTUVfTUlTQyB8IDB4MDAsIC8qIFRpbWVyIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisJSk1FX0dQUkVHMAk9IEpNRV9NSVNDIHwgMHgwOCwgLyogR2VuZXJhbCBwdXJwb3NlIFJFRy0wICovCisJSk1FX0dQUkVHMQk9IEpNRV9NSVNDIHwgMHgwQywgLyogR2VuZXJhbCBwdXJwb3NlIFJFRy0xICovCisJSk1FX0lFVkUJPSBKTUVfTUlTQyB8IDB4MjAsIC8qIEludGVycnVwdCBFdmVudCBTdGF0dXMgKi8KKwlKTUVfSVJFUQk9IEpNRV9NSVNDIHwgMHgyNCwgLyogSW50ciBSZXEgU3RhdHVzKEZvciBEZWJ1ZykgKi8KKwlKTUVfSUVOUwk9IEpNRV9NSVNDIHwgMHgyOCwgLyogSW50ciBFbmFibGUgLSBTZXR0aW5nIFBvcnQgKi8KKwlKTUVfSUVOQwk9IEpNRV9NSVNDIHwgMHgyQywgLyogSW50ZXJydXB0IEVuYWJsZSAtIENsZWFyIFBvcnQgKi8KKwlKTUVfUENDUlgwCT0gSk1FX01JU0MgfCAweDMwLCAvKiBQQ0MgQ29udHJvbCBmb3IgUlggUXVldWUgMCAqLworCUpNRV9QQ0NUWAk9IEpNRV9NSVNDIHwgMHg0MCwgLyogUENDIENvbnRyb2wgZm9yIFRYIFF1ZXVlcyAqLworCUpNRV9DSElQTU9ERQk9IEpNRV9NSVNDIHwgMHg0NCwgLyogSWRlbnRpZnkgRlBHQSBWZXJzaW9uICovCisJSk1FX1NIQkFfSEkJPSBKTUVfTUlTQyB8IDB4NDgsIC8qIFNoYWRvdyBSZWdpc3RlciBCYXNlIEhJICovCisJSk1FX1NIQkFfTE8JPSBKTUVfTUlTQyB8IDB4NEMsIC8qIFNoYWRvdyBSZWdpc3RlciBCYXNlIExPICovCisJSk1FX1RJTUVSMQk9IEpNRV9NSVNDIHwgMHg3MCwgLyogVGltZXIxICovCisJSk1FX1RJTUVSMgk9IEpNRV9NSVNDIHwgMHg3NCwgLyogVGltZXIyICovCisJSk1FX0FQTUMJPSBKTUVfTUlTQyB8IDB4N0MsIC8qIEFnZ3Jlc3NpdmUgUG93ZXIgTW9kZSBDb250cm9sICovCisJSk1FX1BDQ1NSWDAJPSBKTUVfTUlTQyB8IDB4ODAsIC8qIFBDQyBTdGF0dXMgb2YgUlgwICovCit9OworCisvKgorICogVFggQ29udHJvbC9TdGF0dXMgQml0cworICovCitlbnVtIGptZV90eGNzX2JpdHMgeworCVRYQ1NfUVVFVUU3Uwk9IDB4MDAwMDgwMDAsCisJVFhDU19RVUVVRTZTCT0gMHgwMDAwNDAwMCwKKwlUWENTX1FVRVVFNVMJPSAweDAwMDAyMDAwLAorCVRYQ1NfUVVFVUU0Uwk9IDB4MDAwMDEwMDAsCisJVFhDU19RVUVVRTNTCT0gMHgwMDAwMDgwMCwKKwlUWENTX1FVRVVFMlMJPSAweDAwMDAwNDAwLAorCVRYQ1NfUVVFVUUxUwk9IDB4MDAwMDAyMDAsCisJVFhDU19RVUVVRTBTCT0gMHgwMDAwMDEwMCwKKwlUWENTX0ZJRk9USAk9IDB4MDAwMDAwQzAsCisJVFhDU19ETUFTSVpFCT0gMHgwMDAwMDAzMCwKKwlUWENTX0JVUlNUCT0gMHgwMDAwMDAwNCwKKwlUWENTX0VOQUJMRQk9IDB4MDAwMDAwMDEsCit9OworCitlbnVtIGptZV90eGNzX3ZhbHVlIHsKKwlUWENTX0ZJRk9USF8xNlFXCT0gMHgwMDAwMDBDMCwKKwlUWENTX0ZJRk9USF8xMlFXCT0gMHgwMDAwMDA4MCwKKwlUWENTX0ZJRk9USF84UVcJCT0gMHgwMDAwMDA0MCwKKwlUWENTX0ZJRk9USF80UVcJCT0gMHgwMDAwMDAwMCwKKworCVRYQ1NfRE1BU0laRV82NEIJPSAweDAwMDAwMDAwLAorCVRYQ1NfRE1BU0laRV8xMjhCCT0gMHgwMDAwMDAxMCwKKwlUWENTX0RNQVNJWkVfMjU2Qgk9IDB4MDAwMDAwMjAsCisJVFhDU19ETUFTSVpFXzUxMkIJPSAweDAwMDAwMDMwLAorCisJVFhDU19TRUxFQ1RfUVVFVUUwCT0gMHgwMDAwMDAwMCwKKwlUWENTX1NFTEVDVF9RVUVVRTEJPSAweDAwMDEwMDAwLAorCVRYQ1NfU0VMRUNUX1FVRVVFMgk9IDB4MDAwMjAwMDAsCisJVFhDU19TRUxFQ1RfUVVFVUUzCT0gMHgwMDAzMDAwMCwKKwlUWENTX1NFTEVDVF9RVUVVRTQJPSAweDAwMDQwMDAwLAorCVRYQ1NfU0VMRUNUX1FVRVVFNQk9IDB4MDAwNTAwMDAsCisJVFhDU19TRUxFQ1RfUVVFVUU2CT0gMHgwMDA2MDAwMCwKKwlUWENTX1NFTEVDVF9RVUVVRTcJPSAweDAwMDcwMDAwLAorCisJVFhDU19ERUZBVUxUCQk9IFRYQ1NfRklGT1RIXzRRVyB8CisJCQkJICBUWENTX0JVUlNULAorfTsKKworI2RlZmluZSBKTUVfVFhfRElTQUJMRV9USU1FT1VUIDEwIC8qIDEwIG1zZWMgKi8KKworLyoKKyAqIFRYIE1BQyBDb250cm9sL1N0YXR1cyBCaXRzCisgKi8KK2VudW0gam1lX3R4bWNzX2JpdF9tYXNrcyB7CisJVFhNQ1NfSUZHMgkJPSAweEMwMDAwMDAwLAorCVRYTUNTX0lGRzEJCT0gMHgzMDAwMDAwMCwKKwlUWE1DU19UVEhPTEQJCT0gMHgwMDAwMDMwMCwKKwlUWE1DU19GQlVSU1QJCT0gMHgwMDAwMDA4MCwKKwlUWE1DU19DQVJSSUVSRVhUCT0gMHgwMDAwMDA0MCwKKwlUWE1DU19ERUZFUgkJPSAweDAwMDAwMDIwLAorCVRYTUNTX0JBQ0tPRkYJCT0gMHgwMDAwMDAxMCwKKwlUWE1DU19DQVJSSUVSU0VOU0UJPSAweDAwMDAwMDA4LAorCVRYTUNTX0NPTExJU0lPTgkJPSAweDAwMDAwMDA0LAorCVRYTUNTX0NSQwkJPSAweDAwMDAwMDAyLAorCVRYTUNTX1BBRERJTkcJCT0gMHgwMDAwMDAwMSwKK307CisKK2VudW0gam1lX3R4bWNzX3ZhbHVlcyB7CisJVFhNQ1NfSUZHMl82XzQJCT0gMHgwMDAwMDAwMCwKKwlUWE1DU19JRkcyXzhfNQkJPSAweDQwMDAwMDAwLAorCVRYTUNTX0lGRzJfMTBfNgkJPSAweDgwMDAwMDAwLAorCVRYTUNTX0lGRzJfMTJfNwkJPSAweEMwMDAwMDAwLAorCisJVFhNQ1NfSUZHMV84XzQJCT0gMHgwMDAwMDAwMCwKKwlUWE1DU19JRkcxXzEyXzYJCT0gMHgxMDAwMDAwMCwKKwlUWE1DU19JRkcxXzE2XzgJCT0gMHgyMDAwMDAwMCwKKwlUWE1DU19JRkcxXzIwXzEwCT0gMHgzMDAwMDAwMCwKKworCVRYTUNTX1RUSE9MRF8xXzgJPSAweDAwMDAwMDAwLAorCVRYTUNTX1RUSE9MRF8xXzQJPSAweDAwMDAwMTAwLAorCVRYTUNTX1RUSE9MRF8xXzIJPSAweDAwMDAwMjAwLAorCVRYTUNTX1RUSE9MRF9GVUxMCT0gMHgwMDAwMDMwMCwKKworCVRYTUNTX0RFRkFVTFQJCT0gVFhNQ1NfSUZHMl84XzUgfAorCQkJCSAgVFhNQ1NfSUZHMV8xNl84IHwKKwkJCQkgIFRYTUNTX1RUSE9MRF9GVUxMIHwKKwkJCQkgIFRYTUNTX0RFRkVSIHwKKwkJCQkgIFRYTUNTX0NSQyB8CisJCQkJICBUWE1DU19QQURESU5HLAorfTsKKworZW51bSBqbWVfdHhwZmNfYml0c19tYXNrcyB7CisJVFhQRkNfVkxBTl9UQUcJCT0gMHhGRkZGMDAwMCwKKwlUWFBGQ19WTEFOX0VOCQk9IDB4MDAwMDgwMDAsCisJVFhQRkNfUEZfRU4JCT0gMHgwMDAwMDAwMSwKK307CisKK2VudW0gam1lX3R4dHJoZF9iaXRzX21hc2tzIHsKKwlUWFRSSERfVFhQRU4JCT0gMHg4MDAwMDAwMCwKKwlUWFRSSERfVFhQCQk9IDB4N0ZGRkZGMDAsCisJVFhUUkhEX1RYUkVOCQk9IDB4MDAwMDAwODAsCisJVFhUUkhEX1RYUkwJCT0gMHgwMDAwMDA3RiwKK307CisKK2VudW0gam1lX3R4dHJoZF9zaGlmdHMgeworCVRYVFJIRF9UWFBfU0hJRlQJPSA4LAorCVRYVFJIRF9UWFJMX1NISUZUCT0gMCwKK307CisKKy8qCisgKiBSWCBDb250cm9sL1N0YXR1cyBCaXRzCisgKi8KK2VudW0gam1lX3J4Y3NfYml0X21hc2tzIHsKKwkvKiBGSUZPIGZ1bGwgdGhyZXNob2xkIGZvciB0cmFuc21pdHRpbmcgVHggUGF1c2UgUGFja2V0ICovCisJUlhDU19GSUZPVEhUUAk9IDB4MzAwMDAwMDAsCisJLyogRklGTyB0aHJlc2hvbGQgZm9yIHByb2Nlc3NpbmcgbmV4dCBwYWNrZXQgKi8KKwlSWENTX0ZJRk9USE5QCT0gMHgwQzAwMDAwMCwKKwlSWENTX0RNQVJFUVNaCT0gMHgwMzAwMDAwMCwgLyogRE1BIFJlcXVlc3QgU2l6ZSAqLworCVJYQ1NfUVVFVUVTRUwJPSAweDAwMDMwMDAwLCAvKiBRdWV1ZSBzZWxlY3Rpb24gKi8KKwlSWENTX1JFVFJZR0FQCT0gMHgwMDAwRjAwMCwgLyogUlggRGVzYyBmdWxsIHJldHJ5IGdhcCAqLworCVJYQ1NfUkVUUllDTlQJPSAweDAwMDAwRjAwLCAvKiBSWCBEZXNjIGZ1bGwgcmV0cnkgY291bnRlciAqLworCVJYQ1NfV0FLRVVQCT0gMHgwMDAwMDA0MCwgLyogRW5hYmxlIHJlY2VpdmUgd2FrZXVwIHBhY2tldCAqLworCVJYQ1NfTUFHSUMJPSAweDAwMDAwMDIwLCAvKiBFbmFibGUgcmVjZWl2ZSBtYWdpYyBwYWNrZXQgKi8KKwlSWENTX1NIT1JUCT0gMHgwMDAwMDAxMCwgLyogRW5hYmxlIHJlY2VpdmUgc2hvcnQgcGFja2V0ICovCisJUlhDU19BQk9SVAk9IDB4MDAwMDAwMDgsIC8qIEVuYWJsZSByZWNlaXZlIGVycm9yciBwYWNrZXQgKi8KKwlSWENTX1FTVAk9IDB4MDAwMDAwMDQsIC8qIFJlY2VpdmUgcXVldWUgc3RhcnQgKi8KKwlSWENTX1NVU1BFTkQJPSAweDAwMDAwMDAyLAorCVJYQ1NfRU5BQkxFCT0gMHgwMDAwMDAwMSwKK307CisKK2VudW0gam1lX3J4Y3NfdmFsdWVzIHsKKwlSWENTX0ZJRk9USFRQXzE2VAk9IDB4MDAwMDAwMDAsCisJUlhDU19GSUZPVEhUUF8zMlQJPSAweDEwMDAwMDAwLAorCVJYQ1NfRklGT1RIVFBfNjRUCT0gMHgyMDAwMDAwMCwKKwlSWENTX0ZJRk9USFRQXzEyOFQJPSAweDMwMDAwMDAwLAorCisJUlhDU19GSUZPVEhOUF8xNlFXCT0gMHgwMDAwMDAwMCwKKwlSWENTX0ZJRk9USE5QXzMyUVcJPSAweDA0MDAwMDAwLAorCVJYQ1NfRklGT1RITlBfNjRRVwk9IDB4MDgwMDAwMDAsCisJUlhDU19GSUZPVEhOUF8xMjhRVwk9IDB4MEMwMDAwMDAsCisKKwlSWENTX0RNQVJFUVNaXzE2Qgk9IDB4MDAwMDAwMDAsCisJUlhDU19ETUFSRVFTWl8zMkIJPSAweDAxMDAwMDAwLAorCVJYQ1NfRE1BUkVRU1pfNjRCCT0gMHgwMjAwMDAwMCwKKwlSWENTX0RNQVJFUVNaXzEyOEIJPSAweDAzMDAwMDAwLAorCisJUlhDU19RVUVVRVNFTF9RMAk9IDB4MDAwMDAwMDAsCisJUlhDU19RVUVVRVNFTF9RMQk9IDB4MDAwMTAwMDAsCisJUlhDU19RVUVVRVNFTF9RMgk9IDB4MDAwMjAwMDAsCisJUlhDU19RVUVVRVNFTF9RMwk9IDB4MDAwMzAwMDAsCisKKwlSWENTX1JFVFJZR0FQXzI1Nm5zCT0gMHgwMDAwMDAwMCwKKwlSWENTX1JFVFJZR0FQXzUxMm5zCT0gMHgwMDAwMTAwMCwKKwlSWENTX1JFVFJZR0FQXzEwMjRucwk9IDB4MDAwMDIwMDAsCisJUlhDU19SRVRSWUdBUF8yMDQ4bnMJPSAweDAwMDAzMDAwLAorCVJYQ1NfUkVUUllHQVBfNDA5Nm5zCT0gMHgwMDAwNDAwMCwKKwlSWENTX1JFVFJZR0FQXzgxOTJucwk9IDB4MDAwMDUwMDAsCisJUlhDU19SRVRSWUdBUF8xNjM4NG5zCT0gMHgwMDAwNjAwMCwKKwlSWENTX1JFVFJZR0FQXzMyNzY4bnMJPSAweDAwMDA3MDAwLAorCisJUlhDU19SRVRSWUNOVF8wCQk9IDB4MDAwMDAwMDAsCisJUlhDU19SRVRSWUNOVF80CQk9IDB4MDAwMDAxMDAsCisJUlhDU19SRVRSWUNOVF84CQk9IDB4MDAwMDAyMDAsCisJUlhDU19SRVRSWUNOVF8xMgk9IDB4MDAwMDAzMDAsCisJUlhDU19SRVRSWUNOVF8xNgk9IDB4MDAwMDA0MDAsCisJUlhDU19SRVRSWUNOVF8yMAk9IDB4MDAwMDA1MDAsCisJUlhDU19SRVRSWUNOVF8yNAk9IDB4MDAwMDA2MDAsCisJUlhDU19SRVRSWUNOVF8yOAk9IDB4MDAwMDA3MDAsCisJUlhDU19SRVRSWUNOVF8zMgk9IDB4MDAwMDA4MDAsCisJUlhDU19SRVRSWUNOVF8zNgk9IDB4MDAwMDA5MDAsCisJUlhDU19SRVRSWUNOVF80MAk9IDB4MDAwMDBBMDAsCisJUlhDU19SRVRSWUNOVF80NAk9IDB4MDAwMDBCMDAsCisJUlhDU19SRVRSWUNOVF80OAk9IDB4MDAwMDBDMDAsCisJUlhDU19SRVRSWUNOVF81Mgk9IDB4MDAwMDBEMDAsCisJUlhDU19SRVRSWUNOVF81Ngk9IDB4MDAwMDBFMDAsCisJUlhDU19SRVRSWUNOVF82MAk9IDB4MDAwMDBGMDAsCisKKwlSWENTX0RFRkFVTFQJCT0gUlhDU19GSUZPVEhUUF8xMjhUIHwKKwkJCQkgIFJYQ1NfRklGT1RITlBfMTI4UVcgfAorCQkJCSAgUlhDU19ETUFSRVFTWl8xMjhCIHwKKwkJCQkgIFJYQ1NfUkVUUllHQVBfMjU2bnMgfAorCQkJCSAgUlhDU19SRVRSWUNOVF8zMiwKK307CisKKyNkZWZpbmUgSk1FX1JYX0RJU0FCTEVfVElNRU9VVCAxMCAvKiAxMCBtc2VjICovCisKKy8qCisgKiBSWCBNQUMgQ29udHJvbC9TdGF0dXMgQml0cworICovCitlbnVtIGptZV9yeG1jc19iaXRzIHsKKwlSWE1DU19BTExGUkFNRQkJPSAweDAwMDAwODAwLAorCVJYTUNTX0JSREZSQU1FCQk9IDB4MDAwMDA0MDAsCisJUlhNQ1NfTVVMRlJBTUUJCT0gMHgwMDAwMDIwMCwKKwlSWE1DU19VTklGUkFNRQkJPSAweDAwMDAwMTAwLAorCVJYTUNTX0FMTE1VTEZSQU1FCT0gMHgwMDAwMDA4MCwKKwlSWE1DU19NVUxGSUxURVJFRAk9IDB4MDAwMDAwNDAsCisJUlhNQ1NfUlhDT0xMREVDCQk9IDB4MDAwMDAwMjAsCisJUlhNQ1NfRkxPV0NUUkwJCT0gMHgwMDAwMDAwOCwKKwlSWE1DU19WVEFHUk0JCT0gMHgwMDAwMDAwNCwKKwlSWE1DU19QUkVQQUQJCT0gMHgwMDAwMDAwMiwKKwlSWE1DU19DSEVDS1NVTQkJPSAweDAwMDAwMDAxLAorCisJUlhNQ1NfREVGQVVMVAkJPSBSWE1DU19WVEFHUk0gfAorCQkJCSAgUlhNQ1NfUFJFUEFEIHwKKwkJCQkgIFJYTUNTX0ZMT1dDVFJMIHwKKwkJCQkgIFJYTUNTX0NIRUNLU1VNLAorfTsKKworLyoKKyAqIFdha2V1cCBGcmFtZSBzZXR1cCBpbnRlcmZhY2UgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgV0FLRVVQX0ZSQU1FX05SCTgKKyNkZWZpbmUgV0FLRVVQX0ZSQU1FX01BU0tfRFdOUgk0CisKK2VudW0gam1lX3dmb2lfYml0X21hc2tzIHsKKwlXRk9JX01BU0tfU0VMCQk9IDB4MDAwMDAwNzAsCisJV0ZPSV9DUkNfU0VMCQk9IDB4MDAwMDAwMDgsCisJV0ZPSV9GUkFNRV9TRUwJCT0gMHgwMDAwMDAwNywKK307CisKK2VudW0gam1lX3dmb2lfc2hpZnRzIHsKKwlXRk9JX01BU0tfU0hJRlQJCT0gNCwKK307CisKKy8qCisgKiBTTUkgUmVsYXRlZCBkZWZpbml0aW9ucworICovCitlbnVtIGptZV9zbWlfYml0X21hc2sgeworCVNNSV9EQVRBX01BU0sJCT0gMHhGRkZGMDAwMCwKKwlTTUlfUkVHX0FERFJfTUFTSwk9IDB4MDAwMEY4MDAsCisJU01JX1BIWV9BRERSX01BU0sJPSAweDAwMDAwN0MwLAorCVNNSV9PUF9XUklURQkJPSAweDAwMDAwMDIwLAorCS8qIFNldCB0byAxLCBhZnRlciByZXEgZG9uZSBpdCdsbCBiZSBjbGVhcmVkIHRvIDAgKi8KKwlTTUlfT1BfUkVRCQk9IDB4MDAwMDAwMTAsCisJU01JX09QX01ESU8JCT0gMHgwMDAwMDAwOCwgLyogU29mdHdhcmUgYXNzZXNzIEluL091dCAqLworCVNNSV9PUF9NRE9FCQk9IDB4MDAwMDAwMDQsIC8qIFNvZnR3YXJlIE91dHB1dCBFbmFibGUgKi8KKwlTTUlfT1BfTURDCQk9IDB4MDAwMDAwMDIsIC8qIFNvZnR3YXJlIENMSyBDb250cm9sICovCisJU01JX09QX01ERU4JCT0gMHgwMDAwMDAwMSwgLyogU29mdHdhcmUgYWNjZXNzIEVuYWJsZSAqLworfTsKKworZW51bSBqbWVfc21pX2JpdF9zaGlmdCB7CisJU01JX0RBVEFfU0hJRlQJCT0gMTYsCisJU01JX1JFR19BRERSX1NISUZUCT0gMTEsCisJU01JX1BIWV9BRERSX1NISUZUCT0gNiwKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNtaV9yZWdfYWRkcihpbnQgeCkKK3sKKwlyZXR1cm4gKHggPDwgU01JX1JFR19BRERSX1NISUZUKSAmIFNNSV9SRUdfQUREUl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzbWlfcGh5X2FkZHIoaW50IHgpCit7CisJcmV0dXJuICh4IDw8IFNNSV9QSFlfQUREUl9TSElGVCkgJiBTTUlfUEhZX0FERFJfTUFTSzsKK30KKworI2RlZmluZSBKTUVfUEhZX1RJTUVPVVQgMTAwIC8qIDEwMCBtc2VjICovCisjZGVmaW5lIEpNRV9QSFlfUkVHX05SIDMyCisKKy8qCisgKiBHbG9iYWwgSG9zdCBDb250cm9sCisgKi8KK2VudW0gam1lX2doY19iaXRfbWFzayB7CisJR0hDX1NXUlNUCT0gMHg0MDAwMDAwMCwKKwlHSENfRFBYCQk9IDB4MDAwMDAwNDAsCisJR0hDX1NQRUVECT0gMHgwMDAwMDAzMCwKKwlHSENfTElOS19QT0xMCT0gMHgwMDAwMDAwMSwKK307CisKK2VudW0gam1lX2doY19zcGVlZF92YWwgeworCUdIQ19TUEVFRF8xME0JPSAweDAwMDAwMDEwLAorCUdIQ19TUEVFRF8xMDBNCT0gMHgwMDAwMDAyMCwKKwlHSENfU1BFRURfMTAwME0JPSAweDAwMDAwMDMwLAorfTsKKworLyoKKyAqIFBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyCisgKi8KK2VudW0gam1lX3BtY3NfYml0X21hc2tzIHsKKwlQTUNTX1dGN0RFVAk9IDB4ODAwMDAwMDAsCisJUE1DU19XRjZERVQJPSAweDQwMDAwMDAwLAorCVBNQ1NfV0Y1REVUCT0gMHgyMDAwMDAwMCwKKwlQTUNTX1dGNERFVAk9IDB4MTAwMDAwMDAsCisJUE1DU19XRjNERVQJPSAweDA4MDAwMDAwLAorCVBNQ1NfV0YyREVUCT0gMHgwNDAwMDAwMCwKKwlQTUNTX1dGMURFVAk9IDB4MDIwMDAwMDAsCisJUE1DU19XRjBERVQJPSAweDAxMDAwMDAwLAorCVBNQ1NfTEZERVQJPSAweDAwMDQwMDAwLAorCVBNQ1NfTFJERVQJPSAweDAwMDIwMDAwLAorCVBNQ1NfTUZERVQJPSAweDAwMDEwMDAwLAorCVBNQ1NfV0Y3RU4JPSAweDAwMDA4MDAwLAorCVBNQ1NfV0Y2RU4JPSAweDAwMDA0MDAwLAorCVBNQ1NfV0Y1RU4JPSAweDAwMDAyMDAwLAorCVBNQ1NfV0Y0RU4JPSAweDAwMDAxMDAwLAorCVBNQ1NfV0YzRU4JPSAweDAwMDAwODAwLAorCVBNQ1NfV0YyRU4JPSAweDAwMDAwNDAwLAorCVBNQ1NfV0YxRU4JPSAweDAwMDAwMjAwLAorCVBNQ1NfV0YwRU4JPSAweDAwMDAwMTAwLAorCVBNQ1NfTEZFTgk9IDB4MDAwMDAwMDQsCisJUE1DU19MUkVOCT0gMHgwMDAwMDAwMiwKKwlQTUNTX01GRU4JPSAweDAwMDAwMDAxLAorfTsKKworLyoKKyAqIEdpZ2EgUEhZIFN0YXR1cyBSZWdpc3RlcnMKKyAqLworZW51bSBqbWVfcGh5X2xpbmtfYml0X21hc2sgeworCVBIWV9MSU5LX1NQRUVEX01BU0sJCT0gMHgwMDAwQzAwMCwKKwlQSFlfTElOS19EVVBMRVgJCQk9IDB4MDAwMDIwMDAsCisJUEhZX0xJTktfU1BFRUREUFVfUkVTT0xWRUQJPSAweDAwMDAwODAwLAorCVBIWV9MSU5LX1VQCQkJPSAweDAwMDAwNDAwLAorCVBIWV9MSU5LX0FVVE9ORUdfQ09NUExFVEUJPSAweDAwMDAwMjAwLAorCVBIWV9MSU5LX01ESV9TVEFUCQk9IDB4MDAwMDAwNDAsCit9OworCitlbnVtIGptZV9waHlfbGlua19zcGVlZF92YWwgeworCVBIWV9MSU5LX1NQRUVEXzEwTQkJPSAweDAwMDAwMDAwLAorCVBIWV9MSU5LX1NQRUVEXzEwME0JCT0gMHgwMDAwNDAwMCwKKwlQSFlfTElOS19TUEVFRF8xMDAwTQkJPSAweDAwMDA4MDAwLAorfTsKKworI2RlZmluZSBKTUVfU1BEUlNWX1RJTUVPVVQJNTAwCS8qIDUwMCB1cyAqLworCisvKgorICogU01CIENvbnRyb2wgYW5kIFN0YXR1cworICovCitlbnVtIGptZV9zbWJjc3JfYml0X21hc2sgeworCVNNQkNTUl9DTkFDSwk9IDB4MDAwMjAwMDAsCisJU01CQ1NSX1JFTE9BRAk9IDB4MDAwMTAwMDAsCisJU01CQ1NSX0VFUFJPTUQJPSAweDAwMDAwMDIwLAorCVNNQkNTUl9JTklURE9ORQk9IDB4MDAwMDAwMTAsCisJU01CQ1NSX0JVU1kJPSAweDAwMDAwMDBGLAorfTsKKworZW51bSBqbWVfc21iaW50Zl9iaXRfbWFzayB7CisJU01CSU5URl9IV0RBVFIJPSAweEZGMDAwMDAwLAorCVNNQklOVEZfSFdEQVRXCT0gMHgwMEZGMDAwMCwKKwlTTUJJTlRGX0hXQUREUgk9IDB4MDAwMEZGMDAsCisJU01CSU5URl9IV1JXTgk9IDB4MDAwMDAwMjAsCisJU01CSU5URl9IV0NNRAk9IDB4MDAwMDAwMTAsCisJU01CSU5URl9GQVNUTQk9IDB4MDAwMDAwMDgsCisJU01CSU5URl9HUElPU0NMCT0gMHgwMDAwMDAwNCwKKwlTTUJJTlRGX0dQSU9TREEJPSAweDAwMDAwMDAyLAorCVNNQklOVEZfR1BJT0VOCT0gMHgwMDAwMDAwMSwKK307CisKK2VudW0gam1lX3NtYmludGZfdmFscyB7CisJU01CSU5URl9IV1JXTl9SRUFECT0gMHgwMDAwMDAyMCwKKwlTTUJJTlRGX0hXUldOX1dSSVRFCT0gMHgwMDAwMDAwMCwKK307CisKK2VudW0gam1lX3NtYmludGZfc2hpZnRzIHsKKwlTTUJJTlRGX0hXREFUUl9TSElGVAk9IDI0LAorCVNNQklOVEZfSFdEQVRXX1NISUZUCT0gMTYsCisJU01CSU5URl9IV0FERFJfU0hJRlQJPSA4LAorfTsKKworI2RlZmluZSBKTUVfRUVQUk9NX1JFTE9BRF9USU1FT1VUIDIwMDAgLyogMjAwMCBtc2VjICovCisjZGVmaW5lIEpNRV9TTUJfQlVTWV9USU1FT1VUIDIwIC8qIDIwIG1zZWMgKi8KKyNkZWZpbmUgSk1FX1NNQl9MRU4gMjU2CisjZGVmaW5lIEpNRV9FRVBST01fTUFHSUMgMHgyNTAKKworLyoKKyAqIFRpbWVyIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisgKi8KK2VudW0gam1lX3RtY3NyX2JpdF9tYXNrcyB7CisJVE1DU1JfU1dJVAk9IDB4ODAwMDAwMDAsCisJVE1DU1JfRU4JPSAweDAxMDAwMDAwLAorCVRNQ1NSX0NOVAk9IDB4MDBGRkZGRkYsCit9OworCisvKgorICogR2VuZXJhbCBQdXJwb3NlIFJFRy0wCisgKi8KK2VudW0gam1lX2dwcmVnMF9tYXNrcyB7CisJR1BSRUcwX0RJU1NICQk9IDB4RkYwMDAwMDAsCisJR1BSRUcwX1BDSVJMTVQJCT0gMHgwMDMwMDAwMCwKKwlHUFJFRzBfUENDTk9NVVRDTFIJPSAweDAwMDQwMDAwLAorCUdQUkVHMF9MTktJTlRQT0xMCT0gMHgwMDAwMTAwMCwKKwlHUFJFRzBfUENDVE1SCQk9IDB4MDAwMDAzMDAsCisJR1BSRUcwX1BIWUFERFIJCT0gMHgwMDAwMDAxRiwKK307CisKK2VudW0gam1lX2dwcmVnMF92YWxzIHsKKwlHUFJFRzBfRElTU0hfRFc3CT0gMHg4MDAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFc2CT0gMHg0MDAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFc1CT0gMHgyMDAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFc0CT0gMHgxMDAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFczCT0gMHgwODAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFcyCT0gMHgwNDAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFcxCT0gMHgwMjAwMDAwMCwKKwlHUFJFRzBfRElTU0hfRFcwCT0gMHgwMTAwMDAwMCwKKwlHUFJFRzBfRElTU0hfQUxMCT0gMHhGRjAwMDAwMCwKKworCUdQUkVHMF9QQ0lSTE1UXzgJPSAweDAwMDAwMDAwLAorCUdQUkVHMF9QQ0lSTE1UXzYJPSAweDAwMTAwMDAwLAorCUdQUkVHMF9QQ0lSTE1UXzUJPSAweDAwMjAwMDAwLAorCUdQUkVHMF9QQ0lSTE1UXzQJPSAweDAwMzAwMDAwLAorCisJR1BSRUcwX1BDQ1RNUl8xNm5zCT0gMHgwMDAwMDAwMCwKKwlHUFJFRzBfUENDVE1SXzI1Nm5zCT0gMHgwMDAwMDEwMCwKKwlHUFJFRzBfUENDVE1SXzF1cwk9IDB4MDAwMDAyMDAsCisJR1BSRUcwX1BDQ1RNUl8xbXMJPSAweDAwMDAwMzAwLAorCisJR1BSRUcwX1BIWUFERFJfMQk9IDB4MDAwMDAwMDEsCisKKwlHUFJFRzBfREVGQVVMVAkJPSBHUFJFRzBfUENJUkxNVF80IHwKKwkJCQkgIEdQUkVHMF9QQ0NUTVJfMXVzIHwKKwkJCQkgIEdQUkVHMF9QSFlBRERSXzEsCit9OworCisvKgorICogR2VuZXJhbCBQdXJwb3NlIFJFRy0xCisgKiBOb3RlOiBBbGwgdGhlc2VzIGJpdHMgZGVmaW5lZCBoZXJlIGFyZSBmb3IKKyAqICAgICAgIENoaXAgbW9kZSByZXZpc2lvbiAweDExIG9ubHkKKyAqLworZW51bSBqbWVfZ3ByZWcxX21hc2tzIHsKKwlHUFJFRzFfSU5UUkRFTEFZVU5JVAk9IDB4MDAwMDAwMTgsCisJR1BSRUcxX0lOVFJERUxBWUVOQUJMRQk9IDB4MDAwMDAwMDcsCit9OworCitlbnVtIGptZV9ncHJlZzFfdmFscyB7CisJR1BSRUcxX1JTU1BBVENICQk9IDB4MDAwMDAwNDAsCisJR1BSRUcxX0hBTEZNT0RFUEFUQ0gJPSAweDAwMDAwMDIwLAorCisJR1BSRUcxX0lOVERMWVVOSVRfMTZOUwk9IDB4MDAwMDAwMDAsCisJR1BSRUcxX0lOVERMWVVOSVRfMjU2TlMJPSAweDAwMDAwMDA4LAorCUdQUkVHMV9JTlRETFlVTklUXzFVUwk9IDB4MDAwMDAwMTAsCisJR1BSRUcxX0lOVERMWVVOSVRfMTZVUwk9IDB4MDAwMDAwMTgsCisKKwlHUFJFRzFfSU5URExZRU5fMVUJPSAweDAwMDAwMDAxLAorCUdQUkVHMV9JTlRETFlFTl8yVQk9IDB4MDAwMDAwMDIsCisJR1BSRUcxX0lOVERMWUVOXzNVCT0gMHgwMDAwMDAwMywKKwlHUFJFRzFfSU5URExZRU5fNFUJPSAweDAwMDAwMDA0LAorCUdQUkVHMV9JTlRETFlFTl81VQk9IDB4MDAwMDAwMDUsCisJR1BSRUcxX0lOVERMWUVOXzZVCT0gMHgwMDAwMDAwNiwKKwlHUFJFRzFfSU5URExZRU5fN1UJPSAweDAwMDAwMDA3LAorCisJR1BSRUcxX0RFRkFVTFQJCT0gMHgwMDAwMDAwMCwKK307CisKKy8qCisgKiBJbnRlcnJ1cHQgU3RhdHVzIEJpdHMKKyAqLworZW51bSBqbWVfaW50ZXJydXB0X2JpdHMgeworCUlOVFJfU1dJTlRSCT0gMHg4MDAwMDAwMCwKKwlJTlRSX1RNSU5UUgk9IDB4NDAwMDAwMDAsCisJSU5UUl9MSU5LQ0gJPSAweDIwMDAwMDAwLAorCUlOVFJfUEFVU0VSQ1YJPSAweDEwMDAwMDAwLAorCUlOVFJfTUFHSUNSQ1YJPSAweDA4MDAwMDAwLAorCUlOVFJfV0FLRVJDVgk9IDB4MDQwMDAwMDAsCisJSU5UUl9QQ0NSWDBUTwk9IDB4MDIwMDAwMDAsCisJSU5UUl9QQ0NSWDFUTwk9IDB4MDEwMDAwMDAsCisJSU5UUl9QQ0NSWDJUTwk9IDB4MDA4MDAwMDAsCisJSU5UUl9QQ0NSWDNUTwk9IDB4MDA0MDAwMDAsCisJSU5UUl9QQ0NUWFRPCT0gMHgwMDIwMDAwMCwKKwlJTlRSX1BDQ1JYMAk9IDB4MDAxMDAwMDAsCisJSU5UUl9QQ0NSWDEJPSAweDAwMDgwMDAwLAorCUlOVFJfUENDUlgyCT0gMHgwMDA0MDAwMCwKKwlJTlRSX1BDQ1JYMwk9IDB4MDAwMjAwMDAsCisJSU5UUl9QQ0NUWAk9IDB4MDAwMTAwMDAsCisJSU5UUl9SWDNFTVAJPSAweDAwMDA4MDAwLAorCUlOVFJfUlgyRU1QCT0gMHgwMDAwNDAwMCwKKwlJTlRSX1JYMUVNUAk9IDB4MDAwMDIwMDAsCisJSU5UUl9SWDBFTVAJPSAweDAwMDAxMDAwLAorCUlOVFJfUlgzCT0gMHgwMDAwMDgwMCwKKwlJTlRSX1JYMgk9IDB4MDAwMDA0MDAsCisJSU5UUl9SWDEJPSAweDAwMDAwMjAwLAorCUlOVFJfUlgwCT0gMHgwMDAwMDEwMCwKKwlJTlRSX1RYNwk9IDB4MDAwMDAwODAsCisJSU5UUl9UWDYJPSAweDAwMDAwMDQwLAorCUlOVFJfVFg1CT0gMHgwMDAwMDAyMCwKKwlJTlRSX1RYNAk9IDB4MDAwMDAwMTAsCisJSU5UUl9UWDMJPSAweDAwMDAwMDA4LAorCUlOVFJfVFgyCT0gMHgwMDAwMDAwNCwKKwlJTlRSX1RYMQk9IDB4MDAwMDAwMDIsCisJSU5UUl9UWDAJPSAweDAwMDAwMDAxLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBJTlRSX0VOQUJMRSA9IElOVFJfU1dJTlRSIHwKKwkJCQkgSU5UUl9UTUlOVFIgfAorCQkJCSBJTlRSX0xJTktDSCB8CisJCQkJIElOVFJfUENDUlgwVE8gfAorCQkJCSBJTlRSX1BDQ1JYMCB8CisJCQkJIElOVFJfUENDVFhUTyB8CisJCQkJIElOVFJfUENDVFggfAorCQkJCSBJTlRSX1JYMEVNUDsKKworLyoKKyAqIFBDQyBDb250cm9sIFJlZ2lzdGVycworICovCitlbnVtIGptZV9wY2NyeF9tYXNrcyB7CisJUENDUlhUT19NQVNLCT0gMHhGRkZGMDAwMCwKKwlQQ0NSWF9NQVNLCT0gMHgwMDAwRkYwMCwKK307CisKK2VudW0gam1lX3BjY3R4X21hc2tzIHsKKwlQQ0NUWFRPX01BU0sJPSAweEZGRkYwMDAwLAorCVBDQ1RYX01BU0sJPSAweDAwMDBGRjAwLAorCVBDQ1RYX1FTX01BU0sJPSAweDAwMDAwMEZGLAorfTsKKworZW51bSBqbWVfcGNjcnhfc2hpZnRzIHsKKwlQQ0NSWFRPX1NISUZUCT0gMTYsCisJUENDUlhfU0hJRlQJPSA4LAorfTsKKworZW51bSBqbWVfcGNjdHhfc2hpZnRzIHsKKwlQQ0NUWFRPX1NISUZUCT0gMTYsCisJUENDVFhfU0hJRlQJPSA4LAorfTsKKworZW51bSBqbWVfcGNjdHhfYml0cyB7CisJUENDVFhRMF9FTgk9IDB4MDAwMDAwMDEsCisJUENDVFhRMV9FTgk9IDB4MDAwMDAwMDIsCisJUENDVFhRMl9FTgk9IDB4MDAwMDAwMDQsCisJUENDVFhRM19FTgk9IDB4MDAwMDAwMDgsCisJUENDVFhRNF9FTgk9IDB4MDAwMDAwMTAsCisJUENDVFhRNV9FTgk9IDB4MDAwMDAwMjAsCisJUENDVFhRNl9FTgk9IDB4MDAwMDAwNDAsCisJUENDVFhRN19FTgk9IDB4MDAwMDAwODAsCit9OworCisvKgorICogQ2hpcCBNb2RlIFJlZ2lzdGVyCisgKi8KK2VudW0gam1lX2NoaXBtb2RlX2JpdF9tYXNrcyB7CisJQ01fRlBHQVZFUl9NQVNLCQk9IDB4RkZGRjAwMDAsCisJQ01fQ0hJUFJFVl9NQVNLCQk9IDB4MDAwMEZGMDAsCisJQ01fQ0hJUE1PREVfTUFTSwk9IDB4MDAwMDAwMEYsCit9OworCitlbnVtIGptZV9jaGlwbW9kZV9zaGlmdHMgeworCUNNX0ZQR0FWRVJfU0hJRlQJPSAxNiwKKwlDTV9DSElQUkVWX1NISUZUCT0gOCwKK307CisKKy8qCisgKiBTaGFkb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGJpdHMKKyAqLworZW51bSBqbWVfc2hhZG93X2Jhc2VfYWRkcmVzc19iaXRzIHsKKwlTSEJBX1BPU1RFTgk9IDB4MSwKK307CisKKy8qCisgKiBBZ2dyZXNzaXZlIFBvd2VyIE1vZGUgQ29udHJvbAorICovCitlbnVtIGptZV9hcG1jX2JpdHMgeworCUpNRV9BUE1DX1BDSUVfU0RfRU4JPSAweDQwMDAwMDAwLAorCUpNRV9BUE1DX1BTRVVET19IUF9FTgk9IDB4MjAwMDAwMDAsCisJSk1FX0FQTUNfRVBJRU4JCT0gMHgwNDAwMDAwMCwKKwlKTUVfQVBNQ19FUElFTl9DVFJMCT0gMHgwMzAwMDAwMCwKK307CisKK2VudW0gam1lX2FwbWNfdmFsdWVzIHsKKwlKTUVfQVBNQ19FUElFTl9DVFJMX0VOCT0gMHgwMjAwMDAwMCwKKwlKTUVfQVBNQ19FUElFTl9DVFJMX0RJUwk9IDB4MDEwMDAwMDAsCit9OworCisjZGVmaW5lIEFQTUNfUEhQX1NIVVRET1dOX0RFTEFZCSgxMCAqIDEwMDAgKiAxMDAwKQorCisjaWZkZWYgUkVHX0RFQlVHCitzdGF0aWMgY2hhciAqTUFDX1JFR19OQU1FW10gPSB7CisJIkpNRV9UWENTIiwgICAgICAiSk1FX1RYREJBX0xPIiwgICJKTUVfVFhEQkFfSEkiLCAiSk1FX1RYUURDIiwKKwkiSk1FX1RYTkRBIiwgICAgICJKTUVfVFhNQ1MiLCAgICAgIkpNRV9UWFBGQyIsICAgICJKTUVfVFhUUkhEIiwKKwkiSk1FX1JYQ1MiLCAgICAgICJKTUVfUlhEQkFfTE8iLCAgIkpNRV9SWERCQV9ISSIsICJKTUVfUlhRREMiLAorCSJKTUVfUlhOREEiLCAgICAgIkpNRV9SWE1DUyIsICAgICAiSk1FX1JYVU1BX0xPIiwgIkpNRV9SWFVNQV9ISSIsCisJIkpNRV9SWE1DSFRfTE8iLCAiSk1FX1JYTUNIVF9ISSIsICJKTUVfV0ZPRFAiLCAgICAiSk1FX1dGT0kiLAorCSJKTUVfU01JIiwgICAgICAgIkpNRV9HSEMiLCAgICAgICAiVU5LTk9XTiIsICAgICAgIlVOS05PV04iLAorCSJKTUVfUE1DUyJ9OworCitzdGF0aWMgY2hhciAqUEVfUkVHX05BTUVbXSA9IHsKKwkiVU5LTk9XTiIsICAgICAgIlVOS05PV04iLCAgICAgIlVOS05PV04iLCAgICAiVU5LTk9XTiIsCisJIlVOS05PV04iLCAgICAgICJVTktOT1dOIiwgICAgICJVTktOT1dOIiwgICAgIlVOS05PV04iLAorCSJVTktOT1dOIiwgICAgICAiVU5LTk9XTiIsICAgICAiSk1FX1BIWV9DUyIsICJVTktOT1dOIiwKKwkiSk1FX1BIWV9MSU5LIiwgIlVOS05PV04iLCAgICAgIlVOS05PV04iLCAgICAiVU5LTk9XTiIsCisJIkpNRV9TTUJDU1IiLCAgICJKTUVfU01CSU5URiJ9OworCitzdGF0aWMgY2hhciAqTUlTQ19SRUdfTkFNRVtdID0geworCSJKTUVfVE1DU1IiLCAgIkpNRV9HUElPIiwgICAgICJKTUVfR1BSRUcwIiwgICJKTUVfR1BSRUcxIiwKKwkiSk1FX0lFVkUiLCAgICJKTUVfSVJFUSIsICAgICAiSk1FX0lFTlMiLCAgICAiSk1FX0lFTkMiLAorCSJKTUVfUENDUlgwIiwgIkpNRV9QQ0NSWDEiLCAgICJKTUVfUENDUlgyIiwgICJKTUVfUENDUlgzIiwKKwkiSk1FX1BDQ1RYMCIsICJKTUVfQ0hJUE1PREUiLCAiSk1FX1NIQkFfSEkiLCAiSk1FX1NIQkFfTE8iLAorCSJVTktOT1dOIiwgICAgIlVOS05PV04iLCAgICAgICJVTktOT1dOIiwgICAgICJVTktOT1dOIiwKKwkiVU5LTk9XTiIsICAgICJVTktOT1dOIiwgICAgICAiVU5LTk9XTiIsICAgICAiVU5LTk9XTiIsCisJIlVOS05PV04iLCAgICAiVU5LTk9XTiIsICAgICAgIlVOS05PV04iLCAgICAgIlVOS05PV04iLAorCSJKTUVfVElNRVIxIiwgIkpNRV9USU1FUjIiLCAgICJVTktOT1dOIiwgICAgICJKTUVfQVBNQyIsCisJIkpNRV9QQ0NTUlgwIn07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdfZGJnKGNvbnN0IHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLAorCQljb25zdCBjaGFyICptc2csIHUzMiB2YWwsIHUzMiByZWcpCit7CisJY29uc3QgY2hhciAqcmVnbmFtZTsKKwlzd2l0Y2ggKHJlZyAmIDB4RjAwKSB7CisJY2FzZSAweDAwMDoKKwkJcmVnbmFtZSA9IE1BQ19SRUdfTkFNRVsocmVnICYgMHhGRikgPj4gMl07CisJCWJyZWFrOworCWNhc2UgMHg0MDA6CisJCXJlZ25hbWUgPSBQRV9SRUdfTkFNRVsocmVnICYgMHhGRikgPj4gMl07CisJCWJyZWFrOworCWNhc2UgMHg4MDA6CisJCXJlZ25hbWUgPSBNSVNDX1JFR19OQU1FWyhyZWcgJiAweEZGKSA+PiAyXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVnbmFtZSA9IFBFX1JFR19OQU1FWzBdOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICUtMjBzICUwOHhAJXNcbiIsIGptZS0+ZGV2LT5uYW1lLAorCQkJbXNnLCB2YWwsIHJlZ25hbWUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdfZGJnKGNvbnN0IHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLAorCQljb25zdCBjaGFyICptc2csIHUzMiB2YWwsIHUzMiByZWcpIHt9CisjZW5kaWYKKworLyoKKyAqIFJlYWQvV3JpdGUgTU1hcGVkIEkvTyBSZWdpc3RlcnMKKyAqLworc3RhdGljIGlubGluZSB1MzIganJlYWQzMihzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoam1lLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGp3cml0ZTMyKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXJlZ19kYmcoam1lLCAiUkVHIFdSSVRFIiwgdmFsLCByZWcpOworCXdyaXRlbCh2YWwsIGptZS0+cmVncyArIHJlZyk7CisJcmVnX2RiZyhqbWUsICJWQUwgQUZURVIgV1JJVEUiLCByZWFkbChqbWUtPnJlZ3MgKyByZWcpLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgandyaXRlMzJmKHN0cnVjdCBqbWVfYWRhcHRlciAqam1lLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCS8qCisJICogUmVhZCBhZnRlciB3cml0ZSBzaG91bGQgY2F1c2UgZmx1c2gKKwkgKi8KKwlyZWdfZGJnKGptZSwgIlJFRyBXUklURSBGTFVTSCIsIHZhbCwgcmVnKTsKKwl3cml0ZWwodmFsLCBqbWUtPnJlZ3MgKyByZWcpOworCXJlYWRsKGptZS0+cmVncyArIHJlZyk7CisJcmVnX2RiZyhqbWUsICJWQUwgQUZURVIgV1JJVEUiLCByZWFkbChqbWUtPnJlZ3MgKyByZWcpLCByZWcpOworfQorCisvKgorICogUEhZIFJlZ3MKKyAqLworZW51bSBqbWVfcGh5X3JlZzE3X2JpdF9tYXNrcyB7CisJUFJFRzE3X1NQRUVECQk9IDB4QzAwMCwKKwlQUkVHMTdfRFVQTEVYCQk9IDB4MjAwMCwKKwlQUkVHMTdfU1BEUlNWCQk9IDB4MDgwMCwKKwlQUkVHMTdfTE5LVVAJCT0gMHgwNDAwLAorCVBSRUcxN19NREkJCT0gMHgwMDQwLAorfTsKKworZW51bSBqbWVfcGh5X3JlZzE3X3ZhbHMgeworCVBSRUcxN19TUEVFRF8xME0JPSAweDAwMDAsCisJUFJFRzE3X1NQRUVEXzEwME0JPSAweDQwMDAsCisJUFJFRzE3X1NQRUVEXzEwMDBNCT0gMHg4MDAwLAorfTsKKworI2RlZmluZSBCTVNSX0FOQ09NUCAgICAgICAgICAgICAgIDB4MDAyMAorCisvKgorICogV29ya2Fyb3VuZAorICovCitzdGF0aWMgaW5saW5lIGludCBpc19idWdneTI1MCh1bnNpZ25lZCBzaG9ydCBkZXZpY2UsIHVuc2lnbmVkIGludCBjaGlwcmV2KQoreworCXJldHVybiBkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQzI1MCAmJiBjaGlwcmV2ID09IDB4MTE7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgam1lX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCk7CitzdGF0aWMgdm9pZCBqbWVfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwppbmRleCAwMGQ1OWFiLi5mODBkY2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9saWI4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC01MzAsOSArNTMwLDkgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgX19laV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGlzYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOwogCV9fZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOwotCWVuYWJsZV9pcnFfbG9ja2RlcChkZXYtPmlycSk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDg0Yzc3ZjEuLjAxZjdhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTE5NSw4ICsxOTUsOCBAQAogCiAJLyogZmluZCB0aGUgZmlyc3QgcGh5ICovCiAJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7Ci0JCWlmIChicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXSkgewotCQkJcGh5ZGV2ID0gYnAtPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07CisJCWlmIChicC0+bWlpX2J1cy0+cGh5X21hcFtwaHlfYWRkcl0pIHsKKwkJCXBoeWRldiA9IGJwLT5taWlfYnVzLT5waHlfbWFwW3BoeV9hZGRyXTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjQ0LDMwICsyNDQsMzYgQEAKIAkvKiBFbmFibGUgbWFuYWdtZW50IHBvcnQgKi8KIAltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChNUEUpKTsKIAotCWJwLT5taWlfYnVzLm5hbWUgPSAiTUFDQl9taWlfYnVzIjsKLQlicC0+bWlpX2J1cy5yZWFkID0gJm1hY2JfbWRpb19yZWFkOwotCWJwLT5taWlfYnVzLndyaXRlID0gJm1hY2JfbWRpb193cml0ZTsKLQlicC0+bWlpX2J1cy5yZXNldCA9ICZtYWNiX21kaW9fcmVzZXQ7Ci0Jc25wcmludGYoYnAtPm1paV9idXMuaWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwgYnAtPnBkZXYtPmlkKTsKLQlicC0+bWlpX2J1cy5wcml2ID0gYnA7Ci0JYnAtPm1paV9idXMuZGV2ID0gJmJwLT5kZXYtPmRldjsKLQlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWlmIChwZGF0YSkKLQkJYnAtPm1paV9idXMucGh5X21hc2sgPSBwZGF0YS0+cGh5X21hc2s7Ci0KLQlicC0+bWlpX2J1cy5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFicC0+bWlpX2J1cy5pcnEpIHsKKwlicC0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwlpZiAoYnAtPm1paV9idXMgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJYnAtPm1paV9idXMtPm5hbWUgPSAiTUFDQl9taWlfYnVzIjsKKwlicC0+bWlpX2J1cy0+cmVhZCA9ICZtYWNiX21kaW9fcmVhZDsKKwlicC0+bWlpX2J1cy0+d3JpdGUgPSAmbWFjYl9tZGlvX3dyaXRlOworCWJwLT5taWlfYnVzLT5yZXNldCA9ICZtYWNiX21kaW9fcmVzZXQ7CisJc25wcmludGYoYnAtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIGJwLT5wZGV2LT5pZCk7CisJYnAtPm1paV9idXMtPnByaXYgPSBicDsKKwlicC0+bWlpX2J1cy0+cGFyZW50ID0gJmJwLT5kZXYtPmRldjsKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSkKKwkJYnAtPm1paV9idXMtPnBoeV9tYXNrID0gcGRhdGEtPnBoeV9tYXNrOworCisJYnAtPm1paV9idXMtPmlycSA9IGttYWxsb2Moc2l6ZW9mKGludCkqUEhZX01BWF9BRERSLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwLT5taWlfYnVzLT5pcnEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb2J1czsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCi0JCWJwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCQlicC0+bWlpX2J1cy0+aXJxW2ldID0gUEhZX1BPTEw7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShicC0+ZGV2LCAmYnAtPm1paV9idXMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGJwLT5kZXYsIGJwLT5taWlfYnVzKTsKIAotCWlmIChtZGlvYnVzX3JlZ2lzdGVyKCZicC0+bWlpX2J1cykpCisJaWYgKG1kaW9idXNfcmVnaXN0ZXIoYnAtPm1paV9idXMpKQogCQlnb3RvIGVycl9vdXRfZnJlZV9tZGlvX2lycTsKIAogCWlmIChtYWNiX21paV9wcm9iZShicC0+ZGV2KSAhPSAwKSB7CkBAIC0yNzcsOSArMjgzLDExIEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfdW5yZWdpc3Rlcl9idXM6Ci0JbWRpb2J1c191bnJlZ2lzdGVyKCZicC0+bWlpX2J1cyk7CisJbWRpb2J1c191bnJlZ2lzdGVyKGJwLT5taWlfYnVzKTsKIGVycl9vdXRfZnJlZV9tZGlvX2lycToKLQlrZnJlZShicC0+bWlpX2J1cy5pcnEpOworCWtmcmVlKGJwLT5taWlfYnVzLT5pcnEpOworZXJyX291dF9mcmVlX21kaW9idXM6CisJbWRpb2J1c19mcmVlKGJwLT5taWlfYnVzKTsKIGVycl9vdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEyNjEsOCArMTI2OSw5IEBACiAJCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJaWYgKGJwLT5waHlfZGV2KQogCQkJcGh5X2Rpc2Nvbm5lY3QoYnAtPnBoeV9kZXYpOwotCQltZGlvYnVzX3VucmVnaXN0ZXIoJmJwLT5taWlfYnVzKTsKLQkJa2ZyZWUoYnAtPm1paV9idXMuaXJxKTsKKwkJbWRpb2J1c191bnJlZ2lzdGVyKGJwLT5taWlfYnVzKTsKKwkJa2ZyZWUoYnAtPm1paV9idXMtPmlycSk7CisJCW1kaW9idXNfZnJlZShicC0+bWlpX2J1cyk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlpb3VubWFwKGJwLT5yZWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuaCBiL2RyaXZlcnMvbmV0L21hY2IuaAppbmRleCA1N2I4NWFjLi5kMzIxMmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmgKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5oCkBAIC0zODQsNyArMzg0LDcgQEAKIAogCXVuc2lnbmVkIGludAkJcnhfcGVuZGluZywgdHhfcGVuZGluZzsKIAotCXN0cnVjdCBtaWlfYnVzCQltaWlfYnVzOworCXN0cnVjdCBtaWlfYnVzCQkqbWlpX2J1czsKIAlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5X2RldjsKIAl1bnNpZ25lZCBpbnQgCQlsaW5rOwogCXVuc2lnbmVkIGludCAJCXNwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCmluZGV4IDUxYWQzNzYuLjg1NTg3YTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNtYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCkBAIC05LDcgKzksNyBAQAogICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKglDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCi0gKglDb3B5cmlnaHQgKEMpIDE5OTggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCUNvcHlyaWdodCAoQykgMTk5OCBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqCU1vZGlmaWVkIGhlYXZpbHkgYnkgSm9zaHVhIE0uIFRob21wc29uIGJhc2VkIG9uIERhdmUgSHVhbmcncyBOZXRCU0QgZHJpdmVyCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWV0aC5jIGIvZHJpdmVycy9uZXQvbWV0aC5jCmluZGV4IDBhOTdjMjYuLmExZTIyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21ldGguYworKysgYi9kcml2ZXJzL25ldC9tZXRoLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNlbmRpZgogCiAjaWYgTUZFX0RFQlVHPj0xCi0jZGVmaW5lIERQUklOVEsoc3RyLGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICJtZXRoOiAlczogIiBzdHIsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZGVmaW5lIERQUklOVEsoc3RyLGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICJtZXRoOiAlczogIiBzdHIsIF9fZnVuY19fICwgIyMgYXJncykKICNkZWZpbmUgTUZFX1JYX0RFQlVHIDIKICNlbHNlCiAjZGVmaW5lIERQUklOVEsoc3RyLGFyZ3MuLi4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9taXBzbmV0LmMgYi9kcml2ZXJzL25ldC9taXBzbmV0LmMKaW5kZXggNmQzNDNlZi4uNGU3YTVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWlwc25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L21pcHNuZXQuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAKIG91dF9iYWRpcnE6CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzKCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2VcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgX19GVU5DVElPTl9fLCBpcnEpOworCSAgICAgICBkZXYtPm5hbWUsIF9fZnVuY19fLCBpcnEpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvYWxsb2MuYyBiL2RyaXZlcnMvbmV0L21seDQvYWxsb2MuYwppbmRleCAwOTZiY2E1Li5iNDExYjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2FsbG9jLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tci5jIGIvZHJpdmVycy9uZXQvbWx4NC9tci5jCmluZGV4IDYyMDcxZDkuLmQxZGQ1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvbXIuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L21yLmMKQEAgLTY3LDExICs2NywxMCBAQAogI2RlZmluZSBNTFg0X01QVF9GTEFHX1BIWVNJQ0FMCSAgICAoMSA8PCAgOSkKICNkZWZpbmUgTUxYNF9NUFRfRkxBR19SRUdJT04JICAgICgxIDw8ICA4KQogCi0jZGVmaW5lIE1MWDRfTVBUX1BEX0ZMQUdfRkFTVF9SRUcgICAoMSA8PCAyNikKKyNkZWZpbmUgTUxYNF9NUFRfUERfRkxBR19GQVNUX1JFRyAgICgxIDw8IDI3KQorI2RlZmluZSBNTFg0X01QVF9QRF9GTEFHX1JBRQkgICAgKDEgPDwgMjgpCiAjZGVmaW5lIE1MWDRfTVBUX1BEX0ZMQUdfRU5fSU5WCSAgICAoMyA8PCAyNCkKIAotI2RlZmluZSBNTFg0X01UVF9GTEFHX1BSRVNFTlQJCTEKLQogI2RlZmluZSBNTFg0X01QVF9TVEFUVVNfU1cJCTB4RjAKICNkZWZpbmUgTUxYNF9NUFRfU1RBVFVTX0hXCQkweDAwCiAKQEAgLTM0OCw3ICszNDcsMTAgQEAKIAlpZiAobXItPm10dC5vcmRlciA+PSAwICYmIG1yLT5tdHQucGFnZV9zaGlmdCA9PSAwKSB7CiAJCS8qIGZhc3QgcmVnaXN0ZXIgTVIgaW4gZnJlZSBzdGF0ZSAqLwogCQltcHRfZW50cnktPmZsYWdzICAgIHw9IGNwdV90b19iZTMyKE1MWDRfTVBUX0ZMQUdfRlJFRSk7Ci0JCW1wdF9lbnRyeS0+cGRfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTUxYNF9NUFRfUERfRkxBR19GQVNUX1JFRyk7CisJCW1wdF9lbnRyeS0+cGRfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTUxYNF9NUFRfUERfRkxBR19GQVNUX1JFRyB8CisJCQkJCQkgICBNTFg0X01QVF9QRF9GTEFHX1JBRSk7CisJCW1wdF9lbnRyeS0+bXR0X3N6ICAgID0gY3B1X3RvX2JlMzIoKDEgPDwgbXItPm10dC5vcmRlcikgKgorCQkJCQkJICAgTUxYNF9NVFRfRU5UUllfUEVSX1NFRyk7CiAJfSBlbHNlIHsKIAkJbXB0X2VudHJ5LT5mbGFncyAgICB8PSBjcHVfdG9fYmUzMihNTFg0X01QVF9GTEFHX1NXX09XTlMpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDBhMThiOWUuLmE5YzhjMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNDgsMzAgKzQ5LDI4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4X2V0aC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogc3RhdGljIGNoYXIgbXY2NDN4eF9ldGhfZHJpdmVyX25hbWVbXSA9ICJtdjY0M3h4X2V0aCI7Ci1zdGF0aWMgY2hhciBtdjY0M3h4X2V0aF9kcml2ZXJfdmVyc2lvbltdID0gIjEuMyI7CitzdGF0aWMgY2hhciBtdjY0M3h4X2V0aF9kcml2ZXJfdmVyc2lvbltdID0gIjEuNCI7CiAKLSNkZWZpbmUgTVY2NDNYWF9FVEhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAotI2RlZmluZSBNVjY0M1hYX0VUSF9OQVBJCi0jZGVmaW5lIE1WNjQzWFhfRVRIX1RYX0ZBU1RfUkVGSUxMCi0KLSNpZmRlZiBNVjY0M1hYX0VUSF9DSEVDS1NVTV9PRkZMT0FEX1RYCi0jZGVmaW5lIE1BWF9ERVNDU19QRVJfU0tCCShNQVhfU0tCX0ZSQUdTICsgMSkKLSNlbHNlCi0jZGVmaW5lIE1BWF9ERVNDU19QRVJfU0tCCTEKLSNlbmRpZgogCiAvKgogICogUmVnaXN0ZXJzIHNoYXJlZCBiZXR3ZWVuIGFsbCBwb3J0cy4KICAqLwogI2RlZmluZSBQSFlfQUREUgkJCTB4MDAwMAogI2RlZmluZSBTTUlfUkVHCQkJCTB4MDAwNAorI2RlZmluZSAgU01JX0JVU1kJCQkweDEwMDAwMDAwCisjZGVmaW5lICBTTUlfUkVBRF9WQUxJRAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgIFNNSV9PUENPREVfUkVBRAkJMHgwNDAwMDAwMAorI2RlZmluZSAgU01JX09QQ09ERV9XUklURQkJMHgwMDAwMDAwMAorI2RlZmluZSBFUlJfSU5UX0NBVVNFCQkJMHgwMDgwCisjZGVmaW5lICBFUlJfSU5UX1NNSV9ET05FCQkweDAwMDAwMDEwCisjZGVmaW5lIEVSUl9JTlRfTUFTSwkJCTB4MDA4NAogI2RlZmluZSBXSU5ET1dfQkFTRSh3KQkJCSgweDAyMDAgKyAoKHcpIDw8IDMpKQogI2RlZmluZSBXSU5ET1dfU0laRSh3KQkJCSgweDAyMDQgKyAoKHcpIDw8IDMpKQogI2RlZmluZSBXSU5ET1dfUkVNQVBfSElHSCh3KQkJKDB4MDI4MCArICgodykgPDwgMikpCkBAIC0xMDQsMTYgKzEwMywxMiBAQAogI2RlZmluZSBUWF9CV19NVFUocCkJCQkoMHgwNDU4ICsgKChwKSA8PCAxMCkpCiAjZGVmaW5lIFRYX0JXX0JVUlNUKHApCQkJKDB4MDQ1YyArICgocCkgPDwgMTApKQogI2RlZmluZSBJTlRfQ0FVU0UocCkJCQkoMHgwNDYwICsgKChwKSA8PCAxMCkpCi0jZGVmaW5lICBJTlRfVFhfRU5EXzAJCQkweDAwMDgwMDAwCiAjZGVmaW5lICBJTlRfVFhfRU5ECQkJMHgwN2Y4MDAwMAotI2RlZmluZSAgSU5UX1JYCQkJCTB4MDAwN2ZiZmMKKyNkZWZpbmUgIElOVF9SWAkJCQkweDAwMDAwM2ZjCiAjZGVmaW5lICBJTlRfRVhUCQkJMHgwMDAwMDAwMgogI2RlZmluZSBJTlRfQ0FVU0VfRVhUKHApCQkoMHgwNDY0ICsgKChwKSA8PCAxMCkpCi0jZGVmaW5lICBJTlRfRVhUX0xJTksJCQkweDAwMTAwMDAwCi0jZGVmaW5lICBJTlRfRVhUX1BIWQkJCTB4MDAwMTAwMDAKLSNkZWZpbmUgIElOVF9FWFRfVFhfRVJST1JfMAkJMHgwMDAwMDEwMAotI2RlZmluZSAgSU5UX0VYVF9UWF8wCQkJMHgwMDAwMDAwMQotI2RlZmluZSAgSU5UX0VYVF9UWAkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgIElOVF9FWFRfTElOS19QSFkJCTB4MDAxMTAwMDAKKyNkZWZpbmUgIElOVF9FWFRfVFgJCQkweDAwMDAwMGZmCiAjZGVmaW5lIElOVF9NQVNLKHApCQkJKDB4MDQ2OCArICgocCkgPDwgMTApKQogI2RlZmluZSBJTlRfTUFTS19FWFQocCkJCQkoMHgwNDZjICsgKChwKSA8PCAxMCkpCiAjZGVmaW5lIFRYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRChwKQkoMHgwNDc0ICsgKChwKSA8PCAxMCkpCkBAIC0xNzEsOCArMTY2LDggQEAKICNkZWZpbmUgRk9SQ0VfTElOS19QQVNTCQkJCSgxIDw8IDEpCiAjZGVmaW5lIFNFUklBTF9QT1JUX0VOQUJMRQkJCSgxIDw8IDApCiAKLSNkZWZpbmUgREVGQVVMVF9SWF9RVUVVRV9TSVpFCQk0MDAKLSNkZWZpbmUgREVGQVVMVF9UWF9RVUVVRV9TSVpFCQk4MDAKKyNkZWZpbmUgREVGQVVMVF9SWF9RVUVVRV9TSVpFCQkxMjgKKyNkZWZpbmUgREVGQVVMVF9UWF9RVUVVRV9TSVpFCQkyNTYKIAogCiAvKgpAQCAtMjQ5LDkgKzI0NCwyMyBAQAogCXZvaWQgX19pb21lbSAqYmFzZTsKIAogCS8qCi0JICogUHJvdGVjdHMgYWNjZXNzIHRvIFNNSV9SRUcsIHdoaWNoIGlzIHNoYXJlZCBiZXR3ZWVuIHBvcnRzLgorCSAqIFBvaW50cyBhdCB0aGUgcmlnaHQgU01JIGluc3RhbmNlIHRvIHVzZS4KIAkgKi8KLQlzcGlubG9ja190IHBoeV9sb2NrOworCXN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcHJpdmF0ZSAqc21pOworCisJLyoKKwkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gbG9jYWwgU01JIGludGVyZmFjZS4KKwkgKi8KKwlzdHJ1Y3QgbWlpX2J1cyAqc21pX2J1czsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVycm9yIGludGVycnVwdCBwaW4gKHdoaWNoIGlzCisJICogc29tZXdoYXQgbWlzbmFtZWQgYXMgaXQgbm90IG9ubHkgcmVmbGVjdHMgaW50ZXJuYWwgZXJyb3JzCisJICogYnV0IGFsc28gcmVmbGVjdHMgU01JIGNvbXBsZXRpb24pLCB1c2UgdGhhdCB0byB3YWl0IGZvcgorCSAqIFNNSSBhY2Nlc3MgY29tcGxldGlvbiBpbnN0ZWFkIG9mIHBvbGxpbmcgdGhlIFNNSSBidXN5IGJpdC4KKwkgKi8KKwlpbnQgZXJyX2ludGVycnVwdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzbWlfYnVzeV93YWl0OwogCiAJLyoKIAkgKiBQZXItcG9ydCBNQlVTIHdpbmRvdyBhY2Nlc3MgcmVnaXN0ZXIgdmFsdWUuCkBAIC0yNjMsOSArMjcyLDEzIEBACiAJICovCiAJdW5zaWduZWQgaW50IHRfY2xrOwogCWludCBleHRlbmRlZF9yeF9jb2FsX2xpbWl0OwotCWludCB0eF9id19jb250cm9sX21vdmVkOworCWludCB0eF9id19jb250cm9sOwogfTsKIAorI2RlZmluZSBUWF9CV19DT05UUk9MX0FCU0VOVAkJMAorI2RlZmluZSBUWF9CV19DT05UUk9MX09MRF9MQVlPVVQJMQorI2RlZmluZSBUWF9CV19DT05UUk9MX05FV19MQVlPVVQJMgorCiAKIC8qIHBlci1wb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IG1pYl9jb3VudGVycyB7CkBAIC0zMTQsOCArMzI3LDYgQEAKIAlkbWFfYWRkcl90IHJ4X2Rlc2NfZG1hOwogCWludCByeF9kZXNjX2FyZWFfc2l6ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYjsKLQotCXN0cnVjdCB0aW1lcl9saXN0IHJ4X29vbTsKIH07CiAKIHN0cnVjdCB0eF9xdWV1ZSB7CkBAIC0zMzAsNyArMzQxLDEyIEBACiAJc3RydWN0IHR4X2Rlc2MgKnR4X2Rlc2NfYXJlYTsKIAlkbWFfYWRkcl90IHR4X2Rlc2NfZG1hOwogCWludCB0eF9kZXNjX2FyZWFfc2l6ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqKnR4X3NrYjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgdHhfc2tiOworCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwogfTsKIAogc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgewpAQCAtMzM5LDE0ICszNTUsMjQgQEAKIAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQlzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3ByaXZhdGUgKnNoYXJlZF9zbWk7Ci0JaW50IHBoeV9hZGRyOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHk7CiAKLQlzcGlubG9ja190IGxvY2s7Ci0KKwlzdHJ1Y3QgdGltZXJfbGlzdCBtaWJfY291bnRlcnNfdGltZXI7CisJc3BpbmxvY2tfdCBtaWJfY291bnRlcnNfbG9jazsKIAlzdHJ1Y3QgbWliX2NvdW50ZXJzIG1pYl9jb3VudGVyczsKKwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7Ci0Jc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXU4IHdvcmtfbGluazsKKwl1OCB3b3JrX3R4OworCXU4IHdvcmtfdHhfZW5kOworCXU4IHdvcmtfcng7CisJdTggd29ya19yeF9yZWZpbGw7CisJdTggd29ya19yeF9vb207CisKKwlpbnQgc2tiX3NpemU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9yZWN5Y2xlOwogCiAJLyoKIAkgKiBSWCBzdGF0ZS4KQEAgLTM1NCw5ICszODAsOCBAQAogCWludCBkZWZhdWx0X3J4X3Jpbmdfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHJ4X2Rlc2Nfc3JhbV9hZGRyOwogCWludCByeF9kZXNjX3NyYW1fc2l6ZTsKLQl1OCByeHFfbWFzazsKLQlpbnQgcnhxX3ByaW1hcnk7Ci0Jc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisJaW50IHJ4cV9jb3VudDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9vb207CiAJc3RydWN0IHJ4X3F1ZXVlIHJ4cVs4XTsKIAogCS8qCkBAIC0zNjUsMTIgKzM5MCw4IEBACiAJaW50IGRlZmF1bHRfdHhfcmluZ19zaXplOwogCXVuc2lnbmVkIGxvbmcgdHhfZGVzY19zcmFtX2FkZHI7CiAJaW50IHR4X2Rlc2Nfc3JhbV9zaXplOwotCXU4IHR4cV9tYXNrOwotCWludCB0eHFfcHJpbWFyeTsKKwlpbnQgdHhxX2NvdW50OwogCXN0cnVjdCB0eF9xdWV1ZSB0eHFbOF07Ci0jaWZkZWYgTVY2NDNYWF9FVEhfVFhfRkFTVF9SRUZJTEwKLQlpbnQgdHhfY2xlYW5fdGhyZXNob2xkOwotI2VuZGlmCiB9OwogCiAKQEAgLTQ0MCw5NCArNDYxLDIxIEBACiAJCXVkZWxheSgxMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fdHhxX21heWJlX3dha2Uoc3RydWN0IHR4X3F1ZXVlICp0eHEpCitzdGF0aWMgdm9pZCB0eHFfbWF5YmVfd2FrZShzdHJ1Y3QgdHhfcXVldWUgKnR4cSkKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSB0eHFfdG9fbXAodHhxKTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpucSA9IG5ldGRldl9nZXRfdHhfcXVldWUobXAtPmRldiwgdHhxLT5pbmRleCk7CiAKLQkvKgotCSAqIG5ldGlmX3tzdG9wLHdha2V9X3F1ZXVlKCkgZmxvdyBjb250cm9sIG9ubHkgYXBwbGllcyB0bwotCSAqIHRoZSBwcmltYXJ5IHF1ZXVlLgotCSAqLwotCUJVR19PTih0eHEtPmluZGV4ICE9IG1wLT50eHFfcHJpbWFyeSk7Ci0KLQlpZiAodHhxLT50eF9yaW5nX3NpemUgLSB0eHEtPnR4X2Rlc2NfY291bnQgPj0gTUFYX0RFU0NTX1BFUl9TS0IpCi0JCW5ldGlmX3dha2VfcXVldWUobXAtPmRldik7Ci19Ci0KLQotLyogcnggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0eHFfcmVjbGFpbShzdHJ1Y3QgdHhfcXVldWUgKnR4cSwgaW50IGZvcmNlKTsKLQotc3RhdGljIHZvaWQgcnhxX3JlZmlsbChzdHJ1Y3QgcnhfcXVldWUgKnJ4cSkKLXsKLQlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSByeHFfdG9fbXAocnhxKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAocnhxLT5yeF9kZXNjX2NvdW50IDwgcnhxLT5yeF9yaW5nX3NpemUpIHsKLQkJaW50IHNrYl9zaXplOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCQlpbnQgdW5hbGlnbmVkOwotCQlpbnQgcng7Ci0KLQkJLyoKLQkJICogUmVzZXJ2ZSAyKzE0IGJ5dGVzIGZvciBhbiBldGhlcm5ldCBoZWFkZXIgKHRoZQotCQkgKiBoYXJkd2FyZSBhdXRvbWF0aWNhbGx5IHByZXBlbmRzIDIgYnl0ZXMgb2YgZHVtbXkKLQkJICogZGF0YSB0byBlYWNoIHJlY2VpdmVkIHBhY2tldCksIDE2IGJ5dGVzIGZvciB1cCB0bwotCQkgKiBmb3VyIFZMQU4gdGFncywgYW5kIDQgYnl0ZXMgZm9yIHRoZSB0cmFpbGluZyBGQ1MKLQkJICogLS0gMzYgYnl0ZXMgdG90YWwuCi0JCSAqLwotCQlza2Jfc2l6ZSA9IG1wLT5kZXYtPm10dSArIDM2OwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBza2Igc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDgKLQkJICogYnl0ZXMsIGFzIHRoZSBsb3dlciB0aHJlZSBiaXRzIG9mIHRoZSByZWNlaXZlCi0JCSAqIGRlc2NyaXB0b3IncyBidWZmZXIgc2l6ZSBmaWVsZCBhcmUgaWdub3JlZCBieQotCQkgKiB0aGUgaGFyZHdhcmUuCi0JCSAqLwotCQlza2Jfc2l6ZSA9IChza2Jfc2l6ZSArIDcpICYgfjc7Ci0KLQkJc2tiID0gZGV2X2FsbG9jX3NrYihza2Jfc2l6ZSArIGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCkgLSAxKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJdW5hbGlnbmVkID0gKHUzMilza2ItPmRhdGEgJiAoZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKSAtIDEpOwotCQlpZiAodW5hbGlnbmVkKQotCQkJc2tiX3Jlc2VydmUoc2tiLCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpIC0gdW5hbGlnbmVkKTsKLQotCQlyeHEtPnJ4X2Rlc2NfY291bnQrKzsKLQkJcnggPSByeHEtPnJ4X3VzZWRfZGVzYzsKLQkJcnhxLT5yeF91c2VkX2Rlc2MgPSAocnggKyAxKSAlIHJ4cS0+cnhfcmluZ19zaXplOwotCi0JCXJ4cS0+cnhfZGVzY19hcmVhW3J4XS5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAotCQkJCQkJc2tiX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0JCXJ4cS0+cnhfZGVzY19hcmVhW3J4XS5idWZfc2l6ZSA9IHNrYl9zaXplOwotCQlyeHEtPnJ4X3NrYltyeF0gPSBza2I7Ci0JCXdtYigpOwotCQlyeHEtPnJ4X2Rlc2NfYXJlYVtyeF0uY21kX3N0cyA9IEJVRkZFUl9PV05FRF9CWV9ETUEgfAotCQkJCQkJUlhfRU5BQkxFX0lOVEVSUlVQVDsKLQkJd21iKCk7Ci0KLQkJLyoKLQkJICogVGhlIGhhcmR3YXJlIGF1dG9tYXRpY2FsbHkgcHJlcGVuZHMgMiBieXRlcyBvZgotCQkgKiBkdW1teSBkYXRhIHRvIGVhY2ggcmVjZWl2ZWQgcGFja2V0LCBzbyB0aGF0IHRoZQotCQkgKiBJUCBoZWFkZXIgZW5kcyB1cCAxNi1ieXRlIGFsaWduZWQuCi0JCSAqLwotCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5xKSkgeworCQlfX25ldGlmX3R4X2xvY2sobnEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWlmICh0eHEtPnR4X3Jpbmdfc2l6ZSAtIHR4cS0+dHhfZGVzY19jb3VudCA+PSBNQVhfU0tCX0ZSQUdTICsgMSkKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUobnEpOworCQlfX25ldGlmX3R4X3VubG9jayhucSk7CiAJfQotCi0JaWYgKHJ4cS0+cnhfZGVzY19jb3VudCAhPSByeHEtPnJ4X3Jpbmdfc2l6ZSkKLQkJbW9kX3RpbWVyKCZyeHEtPnJ4X29vbSwgamlmZmllcyArIChIWiAvIDEwKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhxX3JlZmlsbF90aW1lcl93cmFwcGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlyeHFfcmVmaWxsKChzdHJ1Y3QgcnhfcXVldWUgKilkYXRhKTsKLX0KIAorLyogcnggbmFwaSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IHJ4cV9wcm9jZXNzKHN0cnVjdCByeF9xdWV1ZSAqcnhxLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IHJ4cV90b19tcChyeHEpOwpAQCAtNTM5LDMxICs0ODcsMzEgQEAKIAkJc3RydWN0IHJ4X2Rlc2MgKnJ4X2Rlc2M7CiAJCXVuc2lnbmVkIGludCBjbWRfc3RzOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCQl1MTYgYnl0ZV9jbnQ7CiAKIAkJcnhfZGVzYyA9ICZyeHEtPnJ4X2Rlc2NfYXJlYVtyeHEtPnJ4X2N1cnJfZGVzY107CiAKIAkJY21kX3N0cyA9IHJ4X2Rlc2MtPmNtZF9zdHM7Ci0JCWlmIChjbWRfc3RzICYgQlVGRkVSX09XTkVEX0JZX0RNQSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNtZF9zdHMgJiBCVUZGRVJfT1dORURfQllfRE1BKQogCQkJYnJlYWs7Ci0JCX0KIAkJcm1iKCk7CiAKIAkJc2tiID0gcnhxLT5yeF9za2JbcnhxLT5yeF9jdXJyX2Rlc2NdOwogCQlyeHEtPnJ4X3NrYltyeHEtPnJ4X2N1cnJfZGVzY10gPSBOVUxMOwogCi0JCXJ4cS0+cnhfY3Vycl9kZXNjID0gKHJ4cS0+cnhfY3Vycl9kZXNjICsgMSkgJSByeHEtPnJ4X3Jpbmdfc2l6ZTsKKwkJcnhxLT5yeF9jdXJyX2Rlc2MrKzsKKwkJaWYgKHJ4cS0+cnhfY3Vycl9kZXNjID09IHJ4cS0+cnhfcmluZ19zaXplKQorCQkJcnhxLT5yeF9jdXJyX2Rlc2MgPSAwOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7Ci0KLQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCByeF9kZXNjLT5idWZfcHRyICsgMiwKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCByeF9kZXNjLT5idWZfcHRyLAogCQkJCSByeF9kZXNjLT5idWZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAkJcnhxLT5yeF9kZXNjX2NvdW50LS07CiAJCXJ4Kys7CiAKKwkJbXAtPndvcmtfcnhfcmVmaWxsIHw9IDEgPDwgcnhxLT5pbmRleDsKKworCQlieXRlX2NudCA9IHJ4X2Rlc2MtPmJ5dGVfY250OworCiAJCS8qCiAJCSAqIFVwZGF0ZSBzdGF0aXN0aWNzLgogCQkgKgpAQCAtNTczLDcgKzUyMSw3IEBACiAJCSAqIGJ5dGUgQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCAod2hpY2ggd2UgZG8gY291bnQpLgogCQkgKi8KIAkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKLQkJc3RhdHMtPnJ4X2J5dGVzICs9IHJ4X2Rlc2MtPmJ5dGVfY250IC0gMjsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IGJ5dGVfY250IC0gMjsKIAogCQkvKgogCQkgKiBJbiBjYXNlIHdlIHJlY2VpdmVkIGEgcGFja2V0IHdpdGhvdXQgZmlyc3QgLyBsYXN0IGJpdHMKQEAgLTU5Niw3MiArNTQ0LDg0IEBACiAJCQlpZiAoY21kX3N0cyAmIEVSUk9SX1NVTU1BUlkpCiAJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOwogCi0JCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIFRoZSAtNCBpcyBmb3IgdGhlIENSQyBpbiB0aGUgdHJhaWxlciBvZiB0aGUKIAkJCSAqIHJlY2VpdmVkIHBhY2tldAogCQkJICovCi0JCQlza2JfcHV0KHNrYiwgcnhfZGVzYy0+Ynl0ZV9jbnQgLSAyIC0gNCk7CisJCQlza2JfcHV0KHNrYiwgYnl0ZV9jbnQgLSAyIC0gNCk7CiAKLQkJCWlmIChjbWRfc3RzICYgTEFZRVJfNF9DSEVDS1NVTV9PSykgeworCQkJaWYgKGNtZF9zdHMgJiBMQVlFUl80X0NIRUNLU1VNX09LKQogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCQkJc2tiLT5jc3VtID0gaHRvbnMoCi0JCQkJCShjbWRfc3RzICYgMHgwMDA3ZmZmOCkgPj4gMyk7Ci0JCQl9CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBtcC0+ZGV2KTsKLSNpZmRlZiBNVjY0M1hYX0VUSF9OQVBJCiAJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotI2Vsc2UKLQkJCW5ldGlmX3J4KHNrYik7Ci0jZW5kaWYKIAkJfQogCiAJCW1wLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCX0KIAotCXJ4cV9yZWZpbGwocnhxKTsKKwlpZiAocnggPCBidWRnZXQpCisJCW1wLT53b3JrX3J4ICY9IH4oMSA8PCByeHEtPmluZGV4KTsKIAogCXJldHVybiByeDsKIH0KIAotI2lmZGVmIE1WNjQzWFhfRVRIX05BUEkKLXN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCitzdGF0aWMgaW50IHJ4cV9yZWZpbGwoc3RydWN0IHJ4X3F1ZXVlICpyeHEsIGludCBidWRnZXQpCiB7Ci0Jc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wOwotCWludCByeDsKLQlpbnQgaTsKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSByeHFfdG9fbXAocnhxKTsKKwlpbnQgcmVmaWxsZWQ7CiAKLQltcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSwgbmFwaSk7CisJcmVmaWxsZWQgPSAwOworCXdoaWxlIChyZWZpbGxlZCA8IGJ1ZGdldCAmJiByeHEtPnJ4X2Rlc2NfY291bnQgPCByeHEtPnJ4X3Jpbmdfc2l6ZSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgdW5hbGlnbmVkOworCQlpbnQgcng7CiAKLSNpZmRlZiBNVjY0M1hYX0VUSF9UWF9GQVNUX1JFRklMTAotCWlmICgrK21wLT50eF9jbGVhbl90aHJlc2hvbGQgPiA1KSB7Ci0JCW1wLT50eF9jbGVhbl90aHJlc2hvbGQgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJaWYgKG1wLT50eHFfbWFzayAmICgxIDw8IGkpKQotCQkJCXR4cV9yZWNsYWltKG1wLT50eHEgKyBpLCAwKTsKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmbXAtPnJ4X3JlY3ljbGUpOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG1wLT5za2Jfc2l6ZSArCisJCQkJCSAgICBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpIC0gMSk7CiAKLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobXAtPmRldikpIHsKLQkJCXNwaW5fbG9ja19pcnEoJm1wLT5sb2NrKTsKLQkJCV9fdHhxX21heWJlX3dha2UobXAtPnR4cSArIG1wLT50eHFfcHJpbWFyeSk7Ci0JCQlzcGluX3VubG9ja19pcnEoJm1wLT5sb2NrKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQltcC0+d29ya19yeF9vb20gfD0gMSA8PCByeHEtPmluZGV4OworCQkJZ290byBvb207CiAJCX0KLQl9Ci0jZW5kaWYKIAotCXJ4ID0gMDsKLQlmb3IgKGkgPSA3OyByeCA8IGJ1ZGdldCAmJiBpID49IDA7IGktLSkKLQkJaWYgKG1wLT5yeHFfbWFzayAmICgxIDw8IGkpKQotCQkJcnggKz0gcnhxX3Byb2Nlc3MobXAtPnJ4cSArIGksIGJ1ZGdldCAtIHJ4KTsKKwkJdW5hbGlnbmVkID0gKHUzMilza2ItPmRhdGEgJiAoZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKSAtIDEpOworCQlpZiAodW5hbGlnbmVkKQorCQkJc2tiX3Jlc2VydmUoc2tiLCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpIC0gdW5hbGlnbmVkKTsKIAotCWlmIChyeCA8IGJ1ZGdldCkgewotCQluZXRpZl9yeF9jb21wbGV0ZShtcC0+ZGV2LCBuYXBpKTsKLQkJd3JsKG1wLCBJTlRfTUFTSyhtcC0+cG9ydF9udW0pLCBJTlRfVFhfRU5EIHwgSU5UX1JYIHwgSU5UX0VYVCk7CisJCXJlZmlsbGVkKys7CisJCXJ4cS0+cnhfZGVzY19jb3VudCsrOworCisJCXJ4ID0gcnhxLT5yeF91c2VkX2Rlc2MrKzsKKwkJaWYgKHJ4cS0+cnhfdXNlZF9kZXNjID09IHJ4cS0+cnhfcmluZ19zaXplKQorCQkJcnhxLT5yeF91c2VkX2Rlc2MgPSAwOworCisJCXJ4cS0+cnhfZGVzY19hcmVhW3J4XS5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAorCQkJCQkJbXAtPnNrYl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQlyeHEtPnJ4X2Rlc2NfYXJlYVtyeF0uYnVmX3NpemUgPSBtcC0+c2tiX3NpemU7CisJCXJ4cS0+cnhfc2tiW3J4XSA9IHNrYjsKKwkJd21iKCk7CisJCXJ4cS0+cnhfZGVzY19hcmVhW3J4XS5jbWRfc3RzID0gQlVGRkVSX09XTkVEX0JZX0RNQSB8CisJCQkJCQlSWF9FTkFCTEVfSU5URVJSVVBUOworCQl3bWIoKTsKKworCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgYXV0b21hdGljYWxseSBwcmVwZW5kcyAyIGJ5dGVzIG9mCisJCSAqIGR1bW15IGRhdGEgdG8gZWFjaCByZWNlaXZlZCBwYWNrZXQsIHNvIHRoYXQgdGhlCisJCSAqIElQIGhlYWRlciBlbmRzIHVwIDE2LWJ5dGUgYWxpZ25lZC4KKwkJICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJfQogCi0JcmV0dXJuIHJ4OworCWlmIChyZWZpbGxlZCA8IGJ1ZGdldCkKKwkJbXAtPndvcmtfcnhfcmVmaWxsICY9IH4oMSA8PCByeHEtPmluZGV4KTsKKworb29tOgorCXJldHVybiByZWZpbGxlZDsKIH0KLSNlbmRpZgogCiAKIC8qIHR4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjg0LDggKzY0NCw5IEBACiAKIAlCVUdfT04odHhxLT50eF9kZXNjX2NvdW50ID49IHR4cS0+dHhfcmluZ19zaXplKTsKIAotCXR4X2Rlc2NfY3VyciA9IHR4cS0+dHhfY3Vycl9kZXNjOwotCXR4cS0+dHhfY3Vycl9kZXNjID0gKHR4X2Rlc2NfY3VyciArIDEpICUgdHhxLT50eF9yaW5nX3NpemU7CisJdHhfZGVzY19jdXJyID0gdHhxLT50eF9jdXJyX2Rlc2MrKzsKKwlpZiAodHhxLT50eF9jdXJyX2Rlc2MgPT0gdHhxLT50eF9yaW5nX3NpemUpCisJCXR4cS0+dHhfY3Vycl9kZXNjID0gMDsKIAogCUJVR19PTih0eHEtPnR4X2N1cnJfZGVzYyA9PSB0eHEtPnR4X3VzZWRfZGVzYyk7CiAKQEAgLTcxNCwxMCArNjc1LDggQEAKIAkJCWRlc2MtPmNtZF9zdHMgPSBCVUZGRVJfT1dORURfQllfRE1BIHwKIAkJCQkJWkVST19QQURESU5HIHwgVFhfTEFTVF9ERVNDIHwKIAkJCQkJVFhfRU5BQkxFX0lOVEVSUlVQVDsKLQkJCXR4cS0+dHhfc2tiW3R4X2luZGV4XSA9IHNrYjsKIAkJfSBlbHNlIHsKIAkJCWRlc2MtPmNtZF9zdHMgPSBCVUZGRVJfT1dORURfQllfRE1BOwotCQkJdHhxLT50eF9za2JbdHhfaW5kZXhdID0gTlVMTDsKIAkJfQogCiAJCWRlc2MtPmw0aV9jaGsgPSAwOwpAQCAtNzM0LDE0NCArNjkzLDIyOCBAQAogCXJldHVybiAoX19mb3JjZSBfX2JlMTYpc3VtOwogfQogCi1zdGF0aWMgdm9pZCB0eHFfc3VibWl0X3NrYihzdHJ1Y3QgdHhfcXVldWUgKnR4cSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgdHhxX3N1Ym1pdF9za2Ioc3RydWN0IHR4X3F1ZXVlICp0eHEsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gdHhxX3RvX21wKHR4cSk7CiAJaW50IG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAlpbnQgdHhfaW5kZXg7CiAJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CiAJdTMyIGNtZF9zdHM7CisJdTE2IGw0aV9jaGs7CiAJaW50IGxlbmd0aDsKIAogCWNtZF9zdHMgPSBUWF9GSVJTVF9ERVNDIHwgR0VOX0NSQyB8IEJVRkZFUl9PV05FRF9CWV9ETUE7CisJbDRpX2NoayA9IDA7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQlpbnQgdGFnX2J5dGVzOworCisJCUJVR19PTihza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSAmJgorCQkgICAgICAgc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkpOworCisJCXRhZ19ieXRlcyA9ICh2b2lkICopaXBfaGRyKHNrYikgLSAodm9pZCAqKXNrYi0+ZGF0YSAtIEVUSF9ITEVOOworCQlpZiAodW5saWtlbHkodGFnX2J5dGVzICYgfjEyKSkgeworCQkJaWYgKHNrYl9jaGVja3N1bV9oZWxwKHNrYikgPT0gMCkKKwkJCQlnb3RvIG5vX2NzdW07CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKHRhZ19ieXRlcyAmIDQpCisJCQljbWRfc3RzIHw9IE1BQ19IRFJfRVhUUkFfNF9CWVRFUzsKKwkJaWYgKHRhZ19ieXRlcyAmIDgpCisJCQljbWRfc3RzIHw9IE1BQ19IRFJfRVhUUkFfOF9CWVRFUzsKKworCQljbWRfc3RzIHw9IEdFTl9UQ1BfVURQX0NIRUNLU1VNIHwKKwkJCSAgIEdFTl9JUF9WNF9DSEVDS1NVTSAgIHwKKwkJCSAgIGlwX2hkcihza2IpLT5paGwgPDwgVFhfSUhMX1NISUZUOworCisJCXN3aXRjaCAoaXBfaGRyKHNrYiktPnByb3RvY29sKSB7CisJCWNhc2UgSVBQUk9UT19VRFA6CisJCQljbWRfc3RzIHw9IFVEUF9GUkFNRTsKKwkJCWw0aV9jaGsgPSBudG9ocyhzdW0xNl9hc19iZSh1ZHBfaGRyKHNrYiktPmNoZWNrKSk7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCWw0aV9jaGsgPSBudG9ocyhzdW0xNl9hc19iZSh0Y3BfaGRyKHNrYiktPmNoZWNrKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfSBlbHNlIHsKK25vX2NzdW06CisJCS8qIEVycmF0YSBCVFMgIzUwLCBJSEwgbXVzdCBiZSA1IGlmIG5vIEhXIGNoZWNrc3VtICovCisJCWNtZF9zdHMgfD0gNSA8PCBUWF9JSExfU0hJRlQ7CisJfQogCiAJdHhfaW5kZXggPSB0eHFfYWxsb2NfZGVzY19pbmRleCh0eHEpOwogCWRlc2MgPSAmdHhxLT50eF9kZXNjX2FyZWFbdHhfaW5kZXhdOwogCiAJaWYgKG5yX2ZyYWdzKSB7CiAJCXR4cV9zdWJtaXRfZnJhZ19za2IodHhxLCBza2IpOwotCiAJCWxlbmd0aCA9IHNrYl9oZWFkbGVuKHNrYik7Ci0JCXR4cS0+dHhfc2tiW3R4X2luZGV4XSA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJY21kX3N0cyB8PSBaRVJPX1BBRERJTkcgfCBUWF9MQVNUX0RFU0MgfCBUWF9FTkFCTEVfSU5URVJSVVBUOwogCQlsZW5ndGggPSBza2ItPmxlbjsKLQkJdHhxLT50eF9za2JbdHhfaW5kZXhdID0gc2tiOwogCX0KIAorCWRlc2MtPmw0aV9jaGsgPSBsNGlfY2hrOwogCWRlc2MtPmJ5dGVfY250ID0gbGVuZ3RoOwogCWRlc2MtPmJ1Zl9wdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIGxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CiAKLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQlpbnQgbWFjX2hkcl9sZW47Ci0KLQkJQlVHX09OKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApICYmCi0JCSAgICAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSk7Ci0KLQkJY21kX3N0cyB8PSBHRU5fVENQX1VEUF9DSEVDS1NVTSB8Ci0JCQkgICBHRU5fSVBfVjRfQ0hFQ0tTVU0gICB8Ci0JCQkgICBpcF9oZHIoc2tiKS0+aWhsIDw8IFRYX0lITF9TSElGVDsKLQotCQltYWNfaGRyX2xlbiA9ICh2b2lkICopaXBfaGRyKHNrYikgLSAodm9pZCAqKXNrYi0+ZGF0YTsKLQkJc3dpdGNoIChtYWNfaGRyX2xlbiAtIEVUSF9ITEVOKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQljbWRfc3RzIHw9IE1BQ19IRFJfRVhUUkFfNF9CWVRFUzsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQljbWRfc3RzIHw9IE1BQ19IRFJfRVhUUkFfOF9CWVRFUzsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJY21kX3N0cyB8PSBNQUNfSERSX0VYVFJBXzRfQllURVM7Ci0JCQljbWRfc3RzIHw9IE1BQ19IRFJfRVhUUkFfOF9CWVRFUzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmdHhxX3RvX21wKHR4cSktPmRldi0+ZGV2LAotCQkJCSAgICJtYWMgaGVhZGVyIGxlbmd0aCBpcyAlZD8hXG4iLCBtYWNfaGRyX2xlbik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN3aXRjaCAoaXBfaGRyKHNrYiktPnByb3RvY29sKSB7Ci0JCWNhc2UgSVBQUk9UT19VRFA6Ci0JCQljbWRfc3RzIHw9IFVEUF9GUkFNRTsKLQkJCWRlc2MtPmw0aV9jaGsgPSBudG9ocyhzdW0xNl9hc19iZSh1ZHBfaGRyKHNrYiktPmNoZWNrKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFBST1RPX1RDUDoKLQkJCWRlc2MtPmw0aV9jaGsgPSBudG9ocyhzdW0xNl9hc19iZSh0Y3BfaGRyKHNrYiktPmNoZWNrKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUJVRygpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogRXJyYXRhIEJUUyAjNTAsIElITCBtdXN0IGJlIDUgaWYgbm8gSFcgY2hlY2tzdW0gKi8KLQkJY21kX3N0cyB8PSA1IDw8IFRYX0lITF9TSElGVDsKLQkJZGVzYy0+bDRpX2NoayA9IDA7Ci0JfQorCV9fc2tiX3F1ZXVlX3RhaWwoJnR4cS0+dHhfc2tiLCBza2IpOwogCiAJLyogZW5zdXJlIGFsbCBvdGhlciBkZXNjcmlwdG9ycyBhcmUgd3JpdHRlbiBiZWZvcmUgZmlyc3QgY21kX3N0cyAqLwogCXdtYigpOwogCWRlc2MtPmNtZF9zdHMgPSBjbWRfc3RzOwogCi0JLyogY2xlYXIgVFhfRU5EIGludGVycnVwdCBzdGF0dXMgKi8KLQl3cmwobXAsIElOVF9DQVVTRShtcC0+cG9ydF9udW0pLCB+KElOVF9UWF9FTkRfMCA8PCB0eHEtPmluZGV4KSk7Ci0JcmRsKG1wLCBJTlRfQ0FVU0UobXAtPnBvcnRfbnVtKSk7CisJLyogY2xlYXIgVFhfRU5EIHN0YXR1cyAqLworCW1wLT53b3JrX3R4X2VuZCAmPSB+KDEgPDwgdHhxLT5pbmRleCk7CiAKIAkvKiBlbnN1cmUgYWxsIGRlc2NyaXB0b3JzIGFyZSB3cml0dGVuIGJlZm9yZSBwb2tpbmcgaGFyZHdhcmUgKi8KIAl3bWIoKTsKIAl0eHFfZW5hYmxlKHR4cSk7CiAKIAl0eHEtPnR4X2Rlc2NfY291bnQgKz0gbnJfZnJhZ3MgKyAxOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CisJaW50IHF1ZXVlOwogCXN0cnVjdCB0eF9xdWV1ZSAqdHhxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqbnE7CisKKwlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXR4cSA9IG1wLT50eHEgKyBxdWV1ZTsKKwlucSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxdWV1ZSk7CiAKIAlpZiAoaGFzX3RpbnlfdW5hbGlnbmVkX2ZyYWdzKHNrYikgJiYgX19za2JfbGluZWFyaXplKHNrYikpIHsKLQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJdHhxLT50eF9kcm9wcGVkKys7CiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LAogCQkJICAgImZhaWxlZCB0byBsaW5lYXJpemUgc2tiIHdpdGggdGlueSAiCiAJCQkgICAidW5hbGlnbmVkIGZyYWdtZW50XG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOwotCi0JdHhxID0gbXAtPnR4cSArIG1wLT50eHFfcHJpbWFyeTsKLQotCWlmICh0eHEtPnR4X3Jpbmdfc2l6ZSAtIHR4cS0+dHhfZGVzY19jb3VudCA8IE1BWF9ERVNDU19QRVJfU0tCKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7Ci0JCWlmICh0eHEtPmluZGV4ID09IG1wLT50eHFfcHJpbWFyeSAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0JCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5kZXYsCi0JCQkJICAgInByaW1hcnkgdHggcXVldWUgZnVsbD8hXG4iKTsKKwlpZiAodHhxLT50eF9yaW5nX3NpemUgLSB0eHEtPnR4X2Rlc2NfY291bnQgPCBNQVhfU0tCX0ZSQUdTICsgMSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+ZGV2LCAidHggcXVldWUgZnVsbD8hXG4iKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCi0JdHhxX3N1Ym1pdF9za2IodHhxLCBza2IpOwotCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKLQlzdGF0cy0+dHhfcGFja2V0cysrOwotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCi0JaWYgKHR4cS0+aW5kZXggPT0gbXAtPnR4cV9wcmltYXJ5KSB7CisJaWYgKCF0eHFfc3VibWl0X3NrYih0eHEsIHNrYikpIHsKIAkJaW50IGVudHJpZXNfbGVmdDsKIAorCQl0eHEtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl0eHEtPnR4X3BhY2tldHMrKzsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKIAkJZW50cmllc19sZWZ0ID0gdHhxLT50eF9yaW5nX3NpemUgLSB0eHEtPnR4X2Rlc2NfY291bnQ7Ci0JCWlmIChlbnRyaWVzX2xlZnQgPCBNQVhfREVTQ1NfUEVSX1NLQikKLQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaWYgKGVudHJpZXNfbGVmdCA8IE1BWF9TS0JfRlJBR1MgKyAxKQorCQkJbmV0aWZfdHhfc3RvcF9xdWV1ZShucSk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKLQogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKIAorLyogdHggbmFwaSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0eHFfa2ljayhzdHJ1Y3QgdHhfcXVldWUgKnR4cSkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSB0eHFfdG9fbXAodHhxKTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpucSA9IG5ldGRldl9nZXRfdHhfcXVldWUobXAtPmRldiwgdHhxLT5pbmRleCk7CisJdTMyIGh3X2Rlc2NfcHRyOworCXUzMiBleHBlY3RlZF9wdHI7CisKKwlfX25ldGlmX3R4X2xvY2sobnEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlpZiAocmRsKG1wLCBUWFFfQ09NTUFORChtcC0+cG9ydF9udW0pKSAmICgxIDw8IHR4cS0+aW5kZXgpKQorCQlnb3RvIG91dDsKKworCWh3X2Rlc2NfcHRyID0gcmRsKG1wLCBUWFFfQ1VSUkVOVF9ERVNDX1BUUihtcC0+cG9ydF9udW0sIHR4cS0+aW5kZXgpKTsKKwlleHBlY3RlZF9wdHIgPSAodTMyKXR4cS0+dHhfZGVzY19kbWEgKworCQkJCXR4cS0+dHhfY3Vycl9kZXNjICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKworCWlmIChod19kZXNjX3B0ciAhPSBleHBlY3RlZF9wdHIpCisJCXR4cV9lbmFibGUodHhxKTsKKworb3V0OgorCV9fbmV0aWZfdHhfdW5sb2NrKG5xKTsKKworCW1wLT53b3JrX3R4X2VuZCAmPSB+KDEgPDwgdHhxLT5pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgdHhxX3JlY2xhaW0oc3RydWN0IHR4X3F1ZXVlICp0eHEsIGludCBidWRnZXQsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSB0eHFfdG9fbXAodHhxKTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpucSA9IG5ldGRldl9nZXRfdHhfcXVldWUobXAtPmRldiwgdHhxLT5pbmRleCk7CisJaW50IHJlY2xhaW1lZDsKKworCV9fbmV0aWZfdHhfbG9jayhucSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCXJlY2xhaW1lZCA9IDA7CisJd2hpbGUgKHJlY2xhaW1lZCA8IGJ1ZGdldCAmJiB0eHEtPnR4X2Rlc2NfY291bnQgPiAwKSB7CisJCWludCB0eF9pbmRleDsKKwkJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJCXUzMiBjbWRfc3RzOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXR4X2luZGV4ID0gdHhxLT50eF91c2VkX2Rlc2M7CisJCWRlc2MgPSAmdHhxLT50eF9kZXNjX2FyZWFbdHhfaW5kZXhdOworCQljbWRfc3RzID0gZGVzYy0+Y21kX3N0czsKKworCQlpZiAoY21kX3N0cyAmIEJVRkZFUl9PV05FRF9CWV9ETUEpIHsKKwkJCWlmICghZm9yY2UpCisJCQkJYnJlYWs7CisJCQlkZXNjLT5jbWRfc3RzID0gY21kX3N0cyAmIH5CVUZGRVJfT1dORURfQllfRE1BOworCQl9CisKKwkJdHhxLT50eF91c2VkX2Rlc2MgPSB0eF9pbmRleCArIDE7CisJCWlmICh0eHEtPnR4X3VzZWRfZGVzYyA9PSB0eHEtPnR4X3Jpbmdfc2l6ZSkKKwkJCXR4cS0+dHhfdXNlZF9kZXNjID0gMDsKKworCQlyZWNsYWltZWQrKzsKKwkJdHhxLT50eF9kZXNjX2NvdW50LS07CisKKwkJc2tiID0gTlVMTDsKKwkJaWYgKGNtZF9zdHMgJiBUWF9MQVNUX0RFU0MpCisJCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0eHEtPnR4X3NrYik7CisKKwkJaWYgKGNtZF9zdHMgJiBFUlJPUl9TVU1NQVJZKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJm1wLT5kZXYtPmRldiwgInR4IGVycm9yXG4iKTsKKwkJCW1wLT5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQl9CisKKwkJaWYgKGNtZF9zdHMgJiBUWF9GSVJTVF9ERVNDKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGRlc2MtPmJ1Zl9wdHIsCisJCQkJCSBkZXNjLT5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CisJCX0gZWxzZSB7CisJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBkZXNjLT5idWZfcHRyLAorCQkJCSAgICAgICBkZXNjLT5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCWlmIChza2JfcXVldWVfbGVuKCZtcC0+cnhfcmVjeWNsZSkgPAorCQkJCQltcC0+ZGVmYXVsdF9yeF9yaW5nX3NpemUgJiYKKwkJCSAgICBza2JfcmVjeWNsZV9jaGVjayhza2IsIG1wLT5za2Jfc2l6ZSkpCisJCQkJX19za2JfcXVldWVfaGVhZCgmbXAtPnJ4X3JlY3ljbGUsIHNrYik7CisJCQllbHNlCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJX19uZXRpZl90eF91bmxvY2sobnEpOworCisJaWYgKHJlY2xhaW1lZCA8IGJ1ZGdldCkKKwkJbXAtPndvcmtfdHggJj0gfigxIDw8IHR4cS0+aW5kZXgpOworCisJcmV0dXJuIHJlY2xhaW1lZDsKK30KKworCiAvKiB0eCByYXRlIGNvbnRyb2wgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBTZXQgdG90YWwgbWF4aW11bSBUWCByYXRlIChzaGFyZWQgYnkgYWxsIFRYIHF1ZXVlcyBmb3IgdGhpcyBwb3J0KQpAQCAtODk1LDE0ICs5MzgsMTcgQEAKIAlpZiAoYnVja2V0X3NpemUgPiA2NTUzNSkKIAkJYnVja2V0X3NpemUgPSA2NTUzNTsKIAotCWlmIChtcC0+c2hhcmVkLT50eF9id19jb250cm9sX21vdmVkKSB7Ci0JCXdybChtcCwgVFhfQldfUkFURV9NT1ZFRChtcC0+cG9ydF9udW0pLCB0b2tlbl9yYXRlKTsKLQkJd3JsKG1wLCBUWF9CV19NVFVfTU9WRUQobXAtPnBvcnRfbnVtKSwgbXR1KTsKLQkJd3JsKG1wLCBUWF9CV19CVVJTVF9NT1ZFRChtcC0+cG9ydF9udW0pLCBidWNrZXRfc2l6ZSk7Ci0JfSBlbHNlIHsKKwlzd2l0Y2ggKG1wLT5zaGFyZWQtPnR4X2J3X2NvbnRyb2wpIHsKKwljYXNlIFRYX0JXX0NPTlRST0xfT0xEX0xBWU9VVDoKIAkJd3JsKG1wLCBUWF9CV19SQVRFKG1wLT5wb3J0X251bSksIHRva2VuX3JhdGUpOwogCQl3cmwobXAsIFRYX0JXX01UVShtcC0+cG9ydF9udW0pLCBtdHUpOwogCQl3cmwobXAsIFRYX0JXX0JVUlNUKG1wLT5wb3J0X251bSksIGJ1Y2tldF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9CV19DT05UUk9MX05FV19MQVlPVVQ6CisJCXdybChtcCwgVFhfQldfUkFURV9NT1ZFRChtcC0+cG9ydF9udW0pLCB0b2tlbl9yYXRlKTsKKwkJd3JsKG1wLCBUWF9CV19NVFVfTU9WRUQobXAtPnBvcnRfbnVtKSwgbXR1KTsKKwkJd3JsKG1wLCBUWF9CV19CVVJTVF9NT1ZFRChtcC0+cG9ydF9udW0pLCBidWNrZXRfc2l6ZSk7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtOTM0LDE0ICs5ODAsMjEgQEAKIAkvKgogCSAqIFR1cm4gb24gZml4ZWQgcHJpb3JpdHkgbW9kZS4KIAkgKi8KLQlpZiAobXAtPnNoYXJlZC0+dHhfYndfY29udHJvbF9tb3ZlZCkKLQkJb2ZmID0gVFhRX0ZJWF9QUklPX0NPTkZfTU9WRUQobXAtPnBvcnRfbnVtKTsKLQllbHNlCisJb2ZmID0gMDsKKwlzd2l0Y2ggKG1wLT5zaGFyZWQtPnR4X2J3X2NvbnRyb2wpIHsKKwljYXNlIFRYX0JXX0NPTlRST0xfT0xEX0xBWU9VVDoKIAkJb2ZmID0gVFhRX0ZJWF9QUklPX0NPTkYobXAtPnBvcnRfbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9CV19DT05UUk9MX05FV19MQVlPVVQ6CisJCW9mZiA9IFRYUV9GSVhfUFJJT19DT05GX01PVkVEKG1wLT5wb3J0X251bSk7CisJCWJyZWFrOworCX0KIAotCXZhbCA9IHJkbChtcCwgb2ZmKTsKLQl2YWwgfD0gMSA8PCB0eHEtPmluZGV4OwotCXdybChtcCwgb2ZmLCB2YWwpOworCWlmIChvZmYpIHsKKwkJdmFsID0gcmRsKG1wLCBvZmYpOworCQl2YWwgfD0gMSA8PCB0eHEtPmluZGV4OworCQl3cmwobXAsIG9mZiwgdmFsKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHR4cV9zZXRfd3JyKHN0cnVjdCB0eF9xdWV1ZSAqdHhxLCBpbnQgd2VpZ2h0KQpAQCAtOTUzLDk1ICsxMDA2LDE0NyBAQAogCS8qCiAJICogVHVybiBvZmYgZml4ZWQgcHJpb3JpdHkgbW9kZS4KIAkgKi8KLQlpZiAobXAtPnNoYXJlZC0+dHhfYndfY29udHJvbF9tb3ZlZCkKLQkJb2ZmID0gVFhRX0ZJWF9QUklPX0NPTkZfTU9WRUQobXAtPnBvcnRfbnVtKTsKLQllbHNlCisJb2ZmID0gMDsKKwlzd2l0Y2ggKG1wLT5zaGFyZWQtPnR4X2J3X2NvbnRyb2wpIHsKKwljYXNlIFRYX0JXX0NPTlRST0xfT0xEX0xBWU9VVDoKIAkJb2ZmID0gVFhRX0ZJWF9QUklPX0NPTkYobXAtPnBvcnRfbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9CV19DT05UUk9MX05FV19MQVlPVVQ6CisJCW9mZiA9IFRYUV9GSVhfUFJJT19DT05GX01PVkVEKG1wLT5wb3J0X251bSk7CisJCWJyZWFrOworCX0KIAotCXZhbCA9IHJkbChtcCwgb2ZmKTsKLQl2YWwgJj0gfigxIDw8IHR4cS0+aW5kZXgpOwotCXdybChtcCwgb2ZmLCB2YWwpOworCWlmIChvZmYpIHsKKwkJdmFsID0gcmRsKG1wLCBvZmYpOworCQl2YWwgJj0gfigxIDw8IHR4cS0+aW5kZXgpOworCQl3cmwobXAsIG9mZiwgdmFsKTsKIAotCS8qCi0JICogQ29uZmlndXJlIFdSUiB3ZWlnaHQgZm9yIHRoaXMgcXVldWUuCi0JICovCi0Jb2ZmID0gVFhRX0JXX1dSUl9DT05GKG1wLT5wb3J0X251bSwgdHhxLT5pbmRleCk7CisJCS8qCisJCSAqIENvbmZpZ3VyZSBXUlIgd2VpZ2h0IGZvciB0aGlzIHF1ZXVlLgorCQkgKi8KKwkJb2ZmID0gVFhRX0JXX1dSUl9DT05GKG1wLT5wb3J0X251bSwgdHhxLT5pbmRleCk7CiAKLQl2YWwgPSByZGwobXAsIG9mZik7Ci0JdmFsID0gKHZhbCAmIH4weGZmKSB8ICh3ZWlnaHQgJiAweGZmKTsKLQl3cmwobXAsIG9mZiwgdmFsKTsKKwkJdmFsID0gcmRsKG1wLCBvZmYpOworCQl2YWwgPSAodmFsICYgfjB4ZmYpIHwgKHdlaWdodCAmIDB4ZmYpOworCQl3cmwobXAsIG9mZiwgdmFsKTsKKwl9CiB9CiAKIAogLyogbWlpIG1hbmFnZW1lbnQgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNNSV9CVVNZCQkweDEwMDAwMDAwCi0jZGVmaW5lIFNNSV9SRUFEX1ZBTElECQkweDA4MDAwMDAwCi0jZGVmaW5lIFNNSV9PUENPREVfUkVBRAkJMHgwNDAwMDAwMAotI2RlZmluZSBTTUlfT1BDT0RFX1dSSVRFCTB4MDAwMDAwMDAKLQotc3RhdGljIHZvaWQgc21pX3JlZ19yZWFkKHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCwgdW5zaWduZWQgaW50IGFkZHIsCi0JCQkgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdjY0M3h4X2V0aF9lcnJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl2b2lkIF9faW9tZW0gKnNtaV9yZWcgPSBtcC0+c2hhcmVkX3NtaS0+YmFzZSArIFNNSV9SRUc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3ByaXZhdGUgKm1zcCA9IGRldl9pZDsKIAotCS8qIHRoZSBTTUkgcmVnaXN0ZXIgaXMgYSBzaGFyZWQgcmVzb3VyY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPnNoYXJlZF9zbWktPnBoeV9sb2NrLCBmbGFncyk7CisJaWYgKHJlYWRsKG1zcC0+YmFzZSArIEVSUl9JTlRfQ0FVU0UpICYgRVJSX0lOVF9TTUlfRE9ORSkgeworCQl3cml0ZWwofkVSUl9JTlRfU01JX0RPTkUsIG1zcC0+YmFzZSArIEVSUl9JTlRfQ0FVU0UpOworCQl3YWtlX3VwKCZtc3AtPnNtaV9idXN5X3dhaXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0JLyogd2FpdCBmb3IgdGhlIFNNSSByZWdpc3RlciB0byBiZWNvbWUgYXZhaWxhYmxlICovCi0JZm9yIChpID0gMDsgcmVhZGwoc21pX3JlZykgJiBTTUlfQlVTWTsgaSsrKSB7Ci0JCWlmIChpID09IDEwMDApIHsKLQkJCXByaW50aygiJXM6IFBIWSBidXN5IHRpbWVvdXRcbiIsIG1wLT5kZXYtPm5hbWUpOwotCQkJZ290byBvdXQ7CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW50IHNtaV9pc19kb25lKHN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcHJpdmF0ZSAqbXNwKQoreworCXJldHVybiAhKHJlYWRsKG1zcC0+YmFzZSArIFNNSV9SRUcpICYgU01JX0JVU1kpOworfQorCitzdGF0aWMgaW50IHNtaV93YWl0X3JlYWR5KHN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcHJpdmF0ZSAqbXNwKQoreworCWlmIChtc3AtPmVycl9pbnRlcnJ1cHQgPT0gTk9fSVJRKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7ICFzbWlfaXNfZG9uZShtc3ApOyBpKyspIHsKKwkJCWlmIChpID09IDEwKQorCQkJCXJldHVybiAtRVRJTUVET1VUOworCQkJbXNsZWVwKDEwKTsKIAkJfQotCQl1ZGVsYXkoMTApOworCisJCXJldHVybiAwOworCX0KKworCWlmICghd2FpdF9ldmVudF90aW1lb3V0KG1zcC0+c21pX2J1c3lfd2FpdCwgc21pX2lzX2RvbmUobXNwKSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDEwMCkpKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtaV9idXNfcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3ByaXZhdGUgKm1zcCA9IGJ1cy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKnNtaV9yZWcgPSBtc3AtPmJhc2UgKyBTTUlfUkVHOworCWludCByZXQ7CisKKwlpZiAoc21pX3dhaXRfcmVhZHkobXNwKSkgeworCQlwcmludGsoIm12NjQzeHhfZXRoOiBTTUkgYnVzIGJ1c3kgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAogCXdyaXRlbChTTUlfT1BDT0RFX1JFQUQgfCAocmVnIDw8IDIxKSB8IChhZGRyIDw8IDE2KSwgc21pX3JlZyk7CiAKLQkvKiBub3cgd2FpdCBmb3IgdGhlIGRhdGEgdG8gYmUgdmFsaWQgKi8KLQlmb3IgKGkgPSAwOyAhKHJlYWRsKHNtaV9yZWcpICYgU01JX1JFQURfVkFMSUQpOyBpKyspIHsKLQkJaWYgKGkgPT0gMTAwMCkgewotCQkJcHJpbnRrKCIlczogUEhZIHJlYWQgdGltZW91dFxuIiwgbXAtPmRldi0+bmFtZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQl1ZGVsYXkoMTApOworCWlmIChzbWlfd2FpdF9yZWFkeShtc3ApKSB7CisJCXByaW50aygibXY2NDN4eF9ldGg6IFNNSSBidXMgYnVzeSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCi0JKnZhbHVlID0gcmVhZGwoc21pX3JlZykgJiAweGZmZmY7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPnNoYXJlZF9zbWktPnBoeV9sb2NrLCBmbGFncyk7CisJcmV0ID0gcmVhZGwoc21pX3JlZyk7CisJaWYgKCEocmV0ICYgU01JX1JFQURfVkFMSUQpKSB7CisJCXByaW50aygibXY2NDN4eF9ldGg6IFNNSSBidXMgcmVhZCBub3QgdmFsaWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcmV0ICYgMHhmZmZmOwogfQogCi1zdGF0aWMgdm9pZCBzbWlfcmVnX3dyaXRlKHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCwKLQkJCSAgdW5zaWduZWQgaW50IGFkZHIsCi0JCQkgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgc21pX2J1c193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKIHsKLQl2b2lkIF9faW9tZW0gKnNtaV9yZWcgPSBtcC0+c2hhcmVkX3NtaS0+YmFzZSArIFNNSV9SRUc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3ByaXZhdGUgKm1zcCA9IGJ1cy0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKnNtaV9yZWcgPSBtc3AtPmJhc2UgKyBTTUlfUkVHOwogCi0JLyogdGhlIFNNSSByZWdpc3RlciBpcyBhIHNoYXJlZCByZXNvdXJjZSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+c2hhcmVkX3NtaS0+cGh5X2xvY2ssIGZsYWdzKTsKLQotCS8qIHdhaXQgZm9yIHRoZSBTTUkgcmVnaXN0ZXIgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwotCWZvciAoaSA9IDA7IHJlYWRsKHNtaV9yZWcpICYgU01JX0JVU1k7IGkrKykgewotCQlpZiAoaSA9PSAxMDAwKSB7Ci0JCQlwcmludGsoIiVzOiBQSFkgYnVzeSB0aW1lb3V0XG4iLCBtcC0+ZGV2LT5uYW1lKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXVkZWxheSgxMCk7CisJaWYgKHNtaV93YWl0X3JlYWR5KG1zcCkpIHsKKwkJcHJpbnRrKCJtdjY0M3h4X2V0aDogU01JIGJ1cyBidXN5IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAl3cml0ZWwoU01JX09QQ09ERV9XUklURSB8IChyZWcgPDwgMjEpIHwKLQkJKGFkZHIgPDwgMTYpIHwgKHZhbHVlICYgMHhmZmZmKSwgc21pX3JlZyk7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPnNoYXJlZF9zbWktPnBoeV9sb2NrLCBmbGFncyk7CisJCShhZGRyIDw8IDE2KSB8ICh2YWwgJiAweGZmZmYpLCBzbWlfcmVnKTsKKworCWlmIChzbWlfd2FpdF9yZWFkeShtc3ApKSB7CisJCXByaW50aygibXY2NDN4eF9ldGg6IFNNSSBidXMgYnVzeSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIAotLyogbWliIGNvdW50ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdGF0aXN0aWNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbXY2NDN4eF9ldGhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHMgPSAwOworCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPnR4cV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCB0eF9xdWV1ZSAqdHhxID0gbXAtPnR4cSArIGk7CisKKwkJdHhfcGFja2V0cyArPSB0eHEtPnR4X3BhY2tldHM7CisJCXR4X2J5dGVzICs9IHR4cS0+dHhfYnl0ZXM7CisJCXR4X2Ryb3BwZWQgKz0gdHhxLT50eF9kcm9wcGVkOworCX0KKworCXN0YXRzLT50eF9wYWNrZXRzID0gdHhfcGFja2V0czsKKwlzdGF0cy0+dHhfYnl0ZXMgPSB0eF9ieXRlczsKKwlzdGF0cy0+dHhfZHJvcHBlZCA9IHR4X2Ryb3BwZWQ7CisKKwlyZXR1cm4gc3RhdHM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIG1pYl9yZWFkKHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCwgaW50IG9mZnNldCkKIHsKIAlyZXR1cm4gcmRsKG1wLCBNSUJfQ09VTlRFUlMobXAtPnBvcnRfbnVtKSArIG9mZnNldCk7CkBAIC0xMDU5LDYgKzExNjQsNyBAQAogewogCXN0cnVjdCBtaWJfY291bnRlcnMgKnAgPSAmbXAtPm1pYl9jb3VudGVyczsKIAorCXNwaW5fbG9jaygmbXAtPm1pYl9jb3VudGVyc19sb2NrKTsKIAlwLT5nb29kX29jdGV0c19yZWNlaXZlZCArPSBtaWJfcmVhZChtcCwgMHgwMCk7CiAJcC0+Z29vZF9vY3RldHNfcmVjZWl2ZWQgKz0gKHU2NCltaWJfcmVhZChtcCwgMHgwNCkgPDwgMzI7CiAJcC0+YmFkX29jdGV0c19yZWNlaXZlZCArPSBtaWJfcmVhZChtcCwgMHgwOCk7CkBAIC0xMDkxLDYgKzExOTcsMTYgQEAKIAlwLT5iYWRfY3JjX2V2ZW50ICs9IG1pYl9yZWFkKG1wLCAweDc0KTsKIAlwLT5jb2xsaXNpb24gKz0gbWliX3JlYWQobXAsIDB4NzgpOwogCXAtPmxhdGVfY29sbGlzaW9uICs9IG1pYl9yZWFkKG1wLCAweDdjKTsKKwlzcGluX3VubG9jaygmbXAtPm1pYl9jb3VudGVyc19sb2NrKTsKKworCW1vZF90aW1lcigmbXAtPm1pYl9jb3VudGVyc190aW1lciwgamlmZmllcyArIDMwICogSFopOworfQorCitzdGF0aWMgdm9pZCBtaWJfY291bnRlcnNfdGltZXJfd3JhcHBlcih1bnNpZ25lZCBsb25nIF9tcCkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSAodm9pZCAqKV9tcDsKKworCW1pYl9jb3VudGVyc191cGRhdGUobXApOwogfQogCiAKQEAgLTExNTYsOSArMTI3Miw5IEBACiAJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZXJyOwogCi0Jc3Bpbl9sb2NrX2lycSgmbXAtPmxvY2spOwotCWVyciA9IG1paV9ldGh0b29sX2dzZXQoJm1wLT5taWksIGNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtcC0+bG9jayk7CisJZXJyID0gcGh5X3JlYWRfc3RhdHVzKG1wLT5waHkpOworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gcGh5X2V0aHRvb2xfZ3NldChtcC0+cGh5LCBjbWQpOwogCiAJLyoKIAkgKiBUaGUgTUFDIGRvZXMgbm90IHN1cHBvcnQgMTAwMGJhc2VUX0hhbGYuCkBAIC0xMjA2LDE4ICsxMzIyLDEzIEBACiBzdGF0aWMgaW50IG12NjQzeHhfZXRoX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBlcnI7CiAKIAkvKgogCSAqIFRoZSBNQUMgZG9lcyBub3Qgc3VwcG9ydCAxMDAwYmFzZVRfSGFsZi4KIAkgKi8KIAljbWQtPmFkdmVydGlzaW5nICY9IH5BRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmOwogCi0Jc3Bpbl9sb2NrX2lycSgmbXAtPmxvY2spOwotCWVyciA9IG1paV9ldGh0b29sX3NzZXQoJm1wLT5taWksIGNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtcC0+bG9jayk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KG1wLT5waHksIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc2V0X3NldHRpbmdzX3BoeWxlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCkBAIC0xMjM5LDcgKzEzNTAsNyBAQAogewogCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbXAtPm1paSk7CisJcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcobXAtPnBoeSk7CiB9CiAKIHN0YXRpYyBpbnQgbXY2NDN4eF9ldGhfbndheV9yZXNldF9waHlsZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMjQ5LDE0ICsxMzYwLDcgQEAKIAogc3RhdGljIHUzMiBtdjY0M3h4X2V0aF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gbWlpX2xpbmtfb2soJm1wLT5taWkpOwotfQotCi1zdGF0aWMgdTMyIG12NjQzeHhfZXRoX2dldF9saW5rX3BoeWxlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gISFuZXRpZl9jYXJyaWVyX29rKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIG12NjQzeHhfZXRoX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMjc3LDkgKzEzODEsMTAgQEAKIAkJCQkJICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsCiAJCQkJCSAgdWludDY0X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gZGV2LT5wcml2OworCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7CiAKKwltdjY0M3h4X2V0aF9nZXRfc3RhdHMoZGV2KTsKIAltaWJfY291bnRlcnNfdXBkYXRlKG1wKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3N0YXRzKTsgaSsrKSB7CkBAIC0xMzIzLDcgKzE0MjgsNyBAQAogCS5zZXRfc2V0dGluZ3MJCT0gbXY2NDN4eF9ldGhfc2V0X3NldHRpbmdzX3BoeWxlc3MsCiAJLmdldF9kcnZpbmZvCQk9IG12NjQzeHhfZXRoX2dldF9kcnZpbmZvLAogCS5ud2F5X3Jlc2V0CQk9IG12NjQzeHhfZXRoX253YXlfcmVzZXRfcGh5bGVzcywKLQkuZ2V0X2xpbmsJCT0gbXY2NDN4eF9ldGhfZ2V0X2xpbmtfcGh5bGVzcywKKwkuZ2V0X2xpbmsJCT0gbXY2NDN4eF9ldGhfZ2V0X2xpbmssCiAJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCiAJLmdldF9zdHJpbmdzCQk9IG12NjQzeHhfZXRoX2dldF9zdHJpbmdzLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IG12NjQzeHhfZXRoX2dldF9ldGh0b29sX3N0YXRzLApAQCAtMTQ4Nyw3ICsxNTkyLDcgQEAKIAogCXNpemUgPSByeHEtPnJ4X3Jpbmdfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CiAKLQlpZiAoaW5kZXggPT0gbXAtPnJ4cV9wcmltYXJ5ICYmIHNpemUgPD0gbXAtPnJ4X2Rlc2Nfc3JhbV9zaXplKSB7CisJaWYgKGluZGV4ID09IDAgJiYgc2l6ZSA8PSBtcC0+cnhfZGVzY19zcmFtX3NpemUpIHsKIAkJcnhxLT5yeF9kZXNjX2FyZWEgPSBpb3JlbWFwKG1wLT5yeF9kZXNjX3NyYW1fYWRkciwKIAkJCQkJCW1wLT5yeF9kZXNjX3NyYW1fc2l6ZSk7CiAJCXJ4cS0+cnhfZGVzY19kbWEgPSBtcC0+cnhfZGVzY19zcmFtX2FkZHI7CkBAIC0xNTE1LDIwICsxNjIwLDIxIEBACiAKIAlyeF9kZXNjID0gKHN0cnVjdCByeF9kZXNjICopcnhxLT5yeF9kZXNjX2FyZWE7CiAJZm9yIChpID0gMDsgaSA8IHJ4cS0+cnhfcmluZ19zaXplOyBpKyspIHsKLQkJaW50IG5leHRpID0gKGkgKyAxKSAlIHJ4cS0+cnhfcmluZ19zaXplOworCQlpbnQgbmV4dGk7CisKKwkJbmV4dGkgPSBpICsgMTsKKwkJaWYgKG5leHRpID09IHJ4cS0+cnhfcmluZ19zaXplKQorCQkJbmV4dGkgPSAwOworCiAJCXJ4X2Rlc2NbaV0ubmV4dF9kZXNjX3B0ciA9IHJ4cS0+cnhfZGVzY19kbWEgKwogCQkJCQluZXh0aSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CiAJfQogCi0JaW5pdF90aW1lcigmcnhxLT5yeF9vb20pOwotCXJ4cS0+cnhfb29tLmRhdGEgPSAodW5zaWduZWQgbG9uZylyeHE7Ci0JcnhxLT5yeF9vb20uZnVuY3Rpb24gPSByeHFfcmVmaWxsX3RpbWVyX3dyYXBwZXI7Ci0KIAlyZXR1cm4gMDsKIAogCiBvdXRfZnJlZToKLQlpZiAoaW5kZXggPT0gbXAtPnJ4cV9wcmltYXJ5ICYmIHNpemUgPD0gbXAtPnJ4X2Rlc2Nfc3JhbV9zaXplKQorCWlmIChpbmRleCA9PSAwICYmIHNpemUgPD0gbXAtPnJ4X2Rlc2Nfc3JhbV9zaXplKQogCQlpb3VubWFwKHJ4cS0+cnhfZGVzY19hcmVhKTsKIAllbHNlCiAJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemUsCkBAIC0xNTQ2LDggKzE2NTIsNiBAQAogCiAJcnhxX2Rpc2FibGUocnhxKTsKIAotCWRlbF90aW1lcl9zeW5jKCZyeHEtPnJ4X29vbSk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgcnhxLT5yeF9yaW5nX3NpemU7IGkrKykgewogCQlpZiAocnhxLT5yeF9za2JbaV0pIHsKIAkJCWRldl9rZnJlZV9za2IocnhxLT5yeF9za2JbaV0pOwpAQCAtMTU2MSw3ICsxNjY1LDcgQEAKIAkJCSAgIHJ4cS0+cnhfZGVzY19jb3VudCk7CiAJfQogCi0JaWYgKHJ4cS0+aW5kZXggPT0gbXAtPnJ4cV9wcmltYXJ5ICYmCisJaWYgKHJ4cS0+aW5kZXggPT0gMCAmJgogCSAgICByeHEtPnJ4X2Rlc2NfYXJlYV9zaXplIDw9IG1wLT5yeF9kZXNjX3NyYW1fc2l6ZSkKIAkJaW91bm1hcChyeHEtPnJ4X2Rlc2NfYXJlYSk7CiAJZWxzZQpAQCAtMTU4OCw3ICsxNjkyLDcgQEAKIAogCXNpemUgPSB0eHEtPnR4X3Jpbmdfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CiAKLQlpZiAoaW5kZXggPT0gbXAtPnR4cV9wcmltYXJ5ICYmIHNpemUgPD0gbXAtPnR4X2Rlc2Nfc3JhbV9zaXplKSB7CisJaWYgKGluZGV4ID09IDAgJiYgc2l6ZSA8PSBtcC0+dHhfZGVzY19zcmFtX3NpemUpIHsKIAkJdHhxLT50eF9kZXNjX2FyZWEgPSBpb3JlbWFwKG1wLT50eF9kZXNjX3NyYW1fYWRkciwKIAkJCQkJCW1wLT50eF9kZXNjX3NyYW1fc2l6ZSk7CiAJCXR4cS0+dHhfZGVzY19kbWEgPSBtcC0+dHhfZGVzY19zcmFtX2FkZHI7CkBAIC0xNjAxLDk3ICsxNzA1LDI5IEBACiAJaWYgKHR4cS0+dHhfZGVzY19hcmVhID09IE5VTEwpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJm1wLT5kZXYtPmRldiwKIAkJCSAgICJjYW4ndCBhbGxvY2F0ZSB0eCByaW5nICglZCBieXRlcylcbiIsIHNpemUpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1lbXNldCh0eHEtPnR4X2Rlc2NfYXJlYSwgMCwgc2l6ZSk7CiAKIAl0eHEtPnR4X2Rlc2NfYXJlYV9zaXplID0gc2l6ZTsKLQl0eHEtPnR4X3NrYiA9IGttYWxsb2ModHhxLT50eF9yaW5nX3NpemUgKiBzaXplb2YoKnR4cS0+dHhfc2tiKSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKHR4cS0+dHhfc2tiID09IE5VTEwpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJm1wLT5kZXYtPmRldiwKLQkJCSAgICJjYW4ndCBhbGxvY2F0ZSB0eCBza2IgcmluZ1xuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQogCiAJdHhfZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXR4cS0+dHhfZGVzY19hcmVhOwogCWZvciAoaSA9IDA7IGkgPCB0eHEtPnR4X3Jpbmdfc2l6ZTsgaSsrKSB7CiAJCXN0cnVjdCB0eF9kZXNjICp0eGQgPSB0eF9kZXNjICsgaTsKLQkJaW50IG5leHRpID0gKGkgKyAxKSAlIHR4cS0+dHhfcmluZ19zaXplOworCQlpbnQgbmV4dGk7CisKKwkJbmV4dGkgPSBpICsgMTsKKwkJaWYgKG5leHRpID09IHR4cS0+dHhfcmluZ19zaXplKQorCQkJbmV4dGkgPSAwOwogCiAJCXR4ZC0+Y21kX3N0cyA9IDA7CiAJCXR4ZC0+bmV4dF9kZXNjX3B0ciA9IHR4cS0+dHhfZGVzY19kbWEgKwogCQkJCQluZXh0aSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CiAJfQogCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhxLT50eF9za2IpOworCiAJcmV0dXJuIDA7Ci0KLQotb3V0X2ZyZWU6Ci0JaWYgKGluZGV4ID09IG1wLT50eHFfcHJpbWFyeSAmJiBzaXplIDw9IG1wLT50eF9kZXNjX3NyYW1fc2l6ZSkKLQkJaW91bm1hcCh0eHEtPnR4X2Rlc2NfYXJlYSk7Ci0JZWxzZQotCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzaXplLAotCQkJCSAgdHhxLT50eF9kZXNjX2FyZWEsCi0JCQkJICB0eHEtPnR4X2Rlc2NfZG1hKTsKLQotb3V0OgotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCB0eHFfcmVjbGFpbShzdHJ1Y3QgdHhfcXVldWUgKnR4cSwgaW50IGZvcmNlKQotewotCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCA9IHR4cV90b19tcCh0eHEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAodHhxLT50eF9kZXNjX2NvdW50ID4gMCkgewotCQlpbnQgdHhfaW5kZXg7Ci0JCXN0cnVjdCB0eF9kZXNjICpkZXNjOwotCQl1MzIgY21kX3N0czsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJZG1hX2FkZHJfdCBhZGRyOwotCQlpbnQgY291bnQ7Ci0KLQkJdHhfaW5kZXggPSB0eHEtPnR4X3VzZWRfZGVzYzsKLQkJZGVzYyA9ICZ0eHEtPnR4X2Rlc2NfYXJlYVt0eF9pbmRleF07Ci0JCWNtZF9zdHMgPSBkZXNjLT5jbWRfc3RzOwotCi0JCWlmIChjbWRfc3RzICYgQlVGRkVSX09XTkVEX0JZX0RNQSkgewotCQkJaWYgKCFmb3JjZSkKLQkJCQlicmVhazsKLQkJCWRlc2MtPmNtZF9zdHMgPSBjbWRfc3RzICYgfkJVRkZFUl9PV05FRF9CWV9ETUE7Ci0JCX0KLQotCQl0eHEtPnR4X3VzZWRfZGVzYyA9ICh0eF9pbmRleCArIDEpICUgdHhxLT50eF9yaW5nX3NpemU7Ci0JCXR4cS0+dHhfZGVzY19jb3VudC0tOwotCi0JCWFkZHIgPSBkZXNjLT5idWZfcHRyOwotCQljb3VudCA9IGRlc2MtPmJ5dGVfY250OwotCQlza2IgPSB0eHEtPnR4X3NrYlt0eF9pbmRleF07Ci0JCXR4cS0+dHhfc2tiW3R4X2luZGV4XSA9IE5VTEw7Ci0KLQkJaWYgKGNtZF9zdHMgJiBFUlJPUl9TVU1NQVJZKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJm1wLT5kZXYtPmRldiwgInR4IGVycm9yXG4iKTsKLQkJCW1wLT5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQl9Ci0KLQkJLyoKLQkJICogRHJvcCBtcC0+bG9jayB3aGlsZSB3ZSBmcmVlIHRoZSBza2IuCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChjbWRfc3RzICYgVFhfRklSU1RfREVTQykKLQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgYWRkciwgY291bnQsIERNQV9UT19ERVZJQ0UpOwotCQllbHNlCi0JCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBhZGRyLCBjb3VudCwgRE1BX1RPX0RFVklDRSk7Ci0KLQkJaWYgKHNrYikKLQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHR4cV9kZWluaXQoc3RydWN0IHR4X3F1ZXVlICp0eHEpCkBAIC0xNjk5LDIyICsxNzM1LDY3IEBACiAJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gdHhxX3RvX21wKHR4cSk7CiAKIAl0eHFfZGlzYWJsZSh0eHEpOwotCXR4cV9yZWNsYWltKHR4cSwgMSk7CisJdHhxX3JlY2xhaW0odHhxLCB0eHEtPnR4X3Jpbmdfc2l6ZSwgMSk7CiAKIAlCVUdfT04odHhxLT50eF91c2VkX2Rlc2MgIT0gdHhxLT50eF9jdXJyX2Rlc2MpOwogCi0JaWYgKHR4cS0+aW5kZXggPT0gbXAtPnR4cV9wcmltYXJ5ICYmCisJaWYgKHR4cS0+aW5kZXggPT0gMCAmJgogCSAgICB0eHEtPnR4X2Rlc2NfYXJlYV9zaXplIDw9IG1wLT50eF9kZXNjX3NyYW1fc2l6ZSkKIAkJaW91bm1hcCh0eHEtPnR4X2Rlc2NfYXJlYSk7CiAJZWxzZQogCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCB0eHEtPnR4X2Rlc2NfYXJlYV9zaXplLAogCQkJCSAgdHhxLT50eF9kZXNjX2FyZWEsIHR4cS0+dHhfZGVzY19kbWEpOwotCi0Ja2ZyZWUodHhxLT50eF9za2IpOwogfQogCiAKIC8qIG5ldGRldiBvcHMgYW5kIHJlbGF0ZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdjY0M3h4X2V0aF9jb2xsZWN0X2V2ZW50cyhzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXApCit7CisJdTMyIGludF9jYXVzZTsKKwl1MzIgaW50X2NhdXNlX2V4dDsKKworCWludF9jYXVzZSA9IHJkbChtcCwgSU5UX0NBVVNFKG1wLT5wb3J0X251bSkpICYKKwkJCShJTlRfVFhfRU5EIHwgSU5UX1JYIHwgSU5UX0VYVCk7CisJaWYgKGludF9jYXVzZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWludF9jYXVzZV9leHQgPSAwOworCWlmIChpbnRfY2F1c2UgJiBJTlRfRVhUKQorCQlpbnRfY2F1c2VfZXh0ID0gcmRsKG1wLCBJTlRfQ0FVU0VfRVhUKG1wLT5wb3J0X251bSkpOworCisJaW50X2NhdXNlICY9IElOVF9UWF9FTkQgfCBJTlRfUlg7CisJaWYgKGludF9jYXVzZSkgeworCQl3cmwobXAsIElOVF9DQVVTRShtcC0+cG9ydF9udW0pLCB+aW50X2NhdXNlKTsKKwkJbXAtPndvcmtfdHhfZW5kIHw9ICgoaW50X2NhdXNlICYgSU5UX1RYX0VORCkgPj4gMTkpICYKKwkJCQl+KHJkbChtcCwgVFhRX0NPTU1BTkQobXAtPnBvcnRfbnVtKSkgJiAweGZmKTsKKwkJbXAtPndvcmtfcnggfD0gKGludF9jYXVzZSAmIElOVF9SWCkgPj4gMjsKKwl9CisKKwlpbnRfY2F1c2VfZXh0ICY9IElOVF9FWFRfTElOS19QSFkgfCBJTlRfRVhUX1RYOworCWlmIChpbnRfY2F1c2VfZXh0KSB7CisJCXdybChtcCwgSU5UX0NBVVNFX0VYVChtcC0+cG9ydF9udW0pLCB+aW50X2NhdXNlX2V4dCk7CisJCWlmIChpbnRfY2F1c2VfZXh0ICYgSU5UX0VYVF9MSU5LX1BIWSkKKwkJCW1wLT53b3JrX2xpbmsgPSAxOworCQltcC0+d29ya190eCB8PSBpbnRfY2F1c2VfZXh0ICYgSU5UX0VYVF9UWDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12NjQzeHhfZXRoX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHVubGlrZWx5KCFtdjY0M3h4X2V0aF9jb2xsZWN0X2V2ZW50cyhtcCkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwl3cmwobXAsIElOVF9NQVNLKG1wLT5wb3J0X251bSksIDApOworCW5hcGlfc2NoZWR1bGUoJm1wLT5uYXBpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIHZvaWQgaGFuZGxlX2xpbmtfZXZlbnQoc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtcC0+ZGV2OwpAQCAtMTczMSwxNSArMTgxMiwxMiBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKIAogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IG1wLT50eHFfY291bnQ7IGkrKykgewogCQkJCXN0cnVjdCB0eF9xdWV1ZSAqdHhxID0gbXAtPnR4cSArIGk7CiAKLQkJCQlpZiAobXAtPnR4cV9tYXNrICYgKDEgPDwgaSkpIHsKLQkJCQkJdHhxX3JlY2xhaW0odHhxLCAxKTsKLQkJCQkJdHhxX3Jlc2V0X2h3X3B0cih0eHEpOwotCQkJCX0KKwkJCQl0eHFfcmVjbGFpbSh0eHEsIHR4cS0+dHhfcmluZ19zaXplLCAxKTsKKwkJCQl0eHFfcmVzZXRfaHdfcHRyKHR4cSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuOwpAQCAtMTc2NywxMTkgKzE4NDUsOTMgQEAKIAkJCSBzcGVlZCwgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAogCQkJIGZjID8gImVuIiA6ICJkaXMiKTsKIAotCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKLQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCX0KIH0KIAotc3RhdGljIGlycXJldHVybl90IG12NjQzeHhfZXRoX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7Ci0Jc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgaW50X2NhdXNlOwotCXUzMiBpbnRfY2F1c2VfZXh0OworCXN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcDsKKwlpbnQgd29ya19kb25lOwogCi0JaW50X2NhdXNlID0gcmRsKG1wLCBJTlRfQ0FVU0UobXAtPnBvcnRfbnVtKSkgJgotCQkJKElOVF9UWF9FTkQgfCBJTlRfUlggfCBJTlRfRVhUKTsKLQlpZiAoaW50X2NhdXNlID09IDApCi0JCXJldHVybiBJUlFfTk9ORTsKKwltcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSwgbmFwaSk7CiAKLQlpbnRfY2F1c2VfZXh0ID0gMDsKLQlpZiAoaW50X2NhdXNlICYgSU5UX0VYVCkgewotCQlpbnRfY2F1c2VfZXh0ID0gcmRsKG1wLCBJTlRfQ0FVU0VfRVhUKG1wLT5wb3J0X251bSkpCi0JCQkJJiAoSU5UX0VYVF9MSU5LIHwgSU5UX0VYVF9QSFkgfCBJTlRfRVhUX1RYKTsKLQkJd3JsKG1wLCBJTlRfQ0FVU0VfRVhUKG1wLT5wb3J0X251bSksIH5pbnRfY2F1c2VfZXh0KTsKLQl9CisJbXAtPndvcmtfcnhfcmVmaWxsIHw9IG1wLT53b3JrX3J4X29vbTsKKwltcC0+d29ya19yeF9vb20gPSAwOwogCi0JaWYgKGludF9jYXVzZV9leHQgJiAoSU5UX0VYVF9QSFkgfCBJTlRfRVhUX0xJTkspKQotCQloYW5kbGVfbGlua19ldmVudChtcCk7CisJd29ya19kb25lID0gMDsKKwl3aGlsZSAod29ya19kb25lIDwgYnVkZ2V0KSB7CisJCXU4IHF1ZXVlX21hc2s7CisJCWludCBxdWV1ZTsKKwkJaW50IHdvcmtfdGJkOwogCi0JLyoKLQkgKiBSeEJ1ZmZlciBvciBSeEVycm9yIHNldCBmb3IgYW55IG9mIHRoZSA4IHF1ZXVlcz8KLQkgKi8KLSNpZmRlZiBNVjY0M1hYX0VUSF9OQVBJCi0JaWYgKGludF9jYXVzZSAmIElOVF9SWCkgewotCQl3cmwobXAsIElOVF9DQVVTRShtcC0+cG9ydF9udW0pLCB+KGludF9jYXVzZSAmIElOVF9SWCkpOwotCQl3cmwobXAsIElOVF9NQVNLKG1wLT5wb3J0X251bSksIDB4MDAwMDAwMDApOwotCQlyZGwobXAsIElOVF9NQVNLKG1wLT5wb3J0X251bSkpOwotCi0JCW5ldGlmX3J4X3NjaGVkdWxlKGRldiwgJm1wLT5uYXBpKTsKLQl9Ci0jZWxzZQotCWlmIChpbnRfY2F1c2UgJiBJTlRfUlgpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCi0JCQlpZiAobXAtPnJ4cV9tYXNrICYgKDEgPDwgaSkpCi0JCQkJcnhxX3Byb2Nlc3MobXAtPnJ4cSArIGksIElOVF9NQVgpOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBUeEJ1ZmZlciBvciBUeEVycm9yIHNldCBmb3IgYW55IG9mIHRoZSA4IHF1ZXVlcz8KLQkgKi8KLQlpZiAoaW50X2NhdXNlX2V4dCAmIElOVF9FWFRfVFgpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWlmIChtcC0+dHhxX21hc2sgJiAoMSA8PCBpKSkKLQkJCQl0eHFfcmVjbGFpbShtcC0+dHhxICsgaSwgMCk7Ci0KLQkJLyoKLQkJICogRW5vdWdoIHNwYWNlIGFnYWluIGluIHRoZSBwcmltYXJ5IFRYIHF1ZXVlIGZvciBhCi0JCSAqIGZ1bGwgcGFja2V0PwotCQkgKi8KLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgewotCQkJc3Bpbl9sb2NrKCZtcC0+bG9jayk7Ci0JCQlfX3R4cV9tYXliZV93YWtlKG1wLT50eHEgKyBtcC0+dHhxX3ByaW1hcnkpOwotCQkJc3Bpbl91bmxvY2soJm1wLT5sb2NrKTsKKwkJaWYgKG1wLT53b3JrX2xpbmspIHsKKwkJCW1wLT53b3JrX2xpbmsgPSAwOworCQkJaGFuZGxlX2xpbmtfZXZlbnQobXApOworCQkJY29udGludWU7CiAJCX0KLQl9CiAKLQkvKgotCSAqIEFueSBUeEVuZCBpbnRlcnJ1cHRzPwotCSAqLwotCWlmIChpbnRfY2F1c2UgJiBJTlRfVFhfRU5EKSB7Ci0JCWludCBpOwotCi0JCXdybChtcCwgSU5UX0NBVVNFKG1wLT5wb3J0X251bSksIH4oaW50X2NhdXNlICYgSU5UX1RYX0VORCkpOwotCi0JCXNwaW5fbG9jaygmbXAtPmxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlzdHJ1Y3QgdHhfcXVldWUgKnR4cSA9IG1wLT50eHEgKyBpOwotCQkJdTMyIGh3X2Rlc2NfcHRyOwotCQkJdTMyIGV4cGVjdGVkX3B0cjsKLQotCQkJaWYgKChpbnRfY2F1c2UgJiAoSU5UX1RYX0VORF8wIDw8IGkpKSA9PSAwKQorCQlxdWV1ZV9tYXNrID0gbXAtPndvcmtfdHggfCBtcC0+d29ya190eF9lbmQgfAorCQkJCW1wLT53b3JrX3J4IHwgbXAtPndvcmtfcnhfcmVmaWxsOworCQlpZiAoIXF1ZXVlX21hc2spIHsKKwkJCWlmIChtdjY0M3h4X2V0aF9jb2xsZWN0X2V2ZW50cyhtcCkpCiAJCQkJY29udGludWU7Ci0KLQkJCWh3X2Rlc2NfcHRyID0KLQkJCQlyZGwobXAsIFRYUV9DVVJSRU5UX0RFU0NfUFRSKG1wLT5wb3J0X251bSwgaSkpOwotCQkJZXhwZWN0ZWRfcHRyID0gKHUzMil0eHEtPnR4X2Rlc2NfZG1hICsKLQkJCQl0eHEtPnR4X2N1cnJfZGVzYyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7Ci0KLQkJCWlmIChod19kZXNjX3B0ciAhPSBleHBlY3RlZF9wdHIpCi0JCQkJdHhxX2VuYWJsZSh0eHEpOworCQkJYnJlYWs7CiAJCX0KLQkJc3Bpbl91bmxvY2soJm1wLT5sb2NrKTsKKworCQlxdWV1ZSA9IGZscyhxdWV1ZV9tYXNrKSAtIDE7CisJCXF1ZXVlX21hc2sgPSAxIDw8IHF1ZXVlOworCisJCXdvcmtfdGJkID0gYnVkZ2V0IC0gd29ya19kb25lOworCQlpZiAod29ya190YmQgPiAxNikKKwkJCXdvcmtfdGJkID0gMTY7CisKKwkJaWYgKG1wLT53b3JrX3R4X2VuZCAmIHF1ZXVlX21hc2spIHsKKwkJCXR4cV9raWNrKG1wLT50eHEgKyBxdWV1ZSk7CisJCX0gZWxzZSBpZiAobXAtPndvcmtfdHggJiBxdWV1ZV9tYXNrKSB7CisJCQl3b3JrX2RvbmUgKz0gdHhxX3JlY2xhaW0obXAtPnR4cSArIHF1ZXVlLCB3b3JrX3RiZCwgMCk7CisJCQl0eHFfbWF5YmVfd2FrZShtcC0+dHhxICsgcXVldWUpOworCQl9IGVsc2UgaWYgKG1wLT53b3JrX3J4ICYgcXVldWVfbWFzaykgeworCQkJd29ya19kb25lICs9IHJ4cV9wcm9jZXNzKG1wLT5yeHEgKyBxdWV1ZSwgd29ya190YmQpOworCQl9IGVsc2UgaWYgKG1wLT53b3JrX3J4X3JlZmlsbCAmIHF1ZXVlX21hc2spIHsKKwkJCXdvcmtfZG9uZSArPSByeHFfcmVmaWxsKG1wLT5yeHEgKyBxdWV1ZSwgd29ya190YmQpOworCQl9IGVsc2UgeworCQkJQlVHKCk7CisJCX0KIAl9CiAKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgeworCQlpZiAobXAtPndvcmtfcnhfb29tKQorCQkJbW9kX3RpbWVyKCZtcC0+cnhfb29tLCBqaWZmaWVzICsgKEhaIC8gMTApKTsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJd3JsKG1wLCBJTlRfTUFTSyhtcC0+cG9ydF9udW0pLCBJTlRfVFhfRU5EIHwgSU5UX1JYIHwgSU5UX0VYVCk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9vbV90aW1lcl93cmFwcGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSAodm9pZCAqKWRhdGE7CisKKwluYXBpX3NjaGVkdWxlKCZtcC0+bmFwaSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBoeV9yZXNldChzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXApCiB7Ci0JdW5zaWduZWQgaW50IGRhdGE7CisJaW50IGRhdGE7CiAKLQlzbWlfcmVnX3JlYWQobXAsIG1wLT5waHlfYWRkciwgTUlJX0JNQ1IsICZkYXRhKTsKKwlkYXRhID0gcGh5X3JlYWQobXAtPnBoeSwgTUlJX0JNQ1IpOworCWlmIChkYXRhIDwgMCkKKwkJcmV0dXJuOworCiAJZGF0YSB8PSBCTUNSX1JFU0VUOwotCXNtaV9yZWdfd3JpdGUobXAsIG1wLT5waHlfYWRkciwgTUlJX0JNQ1IsIGRhdGEpOworCWlmIChwaHlfd3JpdGUobXAtPnBoeSwgTUlJX0JNQ1IsIGRhdGEpIDwgMCkKKwkJcmV0dXJuOwogCiAJZG8gewotCQl1ZGVsYXkoMSk7Ci0JCXNtaV9yZWdfcmVhZChtcCwgbXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgJmRhdGEpOwotCX0gd2hpbGUgKGRhdGEgJiBCTUNSX1JFU0VUKTsKKwkJZGF0YSA9IHBoeV9yZWFkKG1wLT5waHksIE1JSV9CTUNSKTsKKwl9IHdoaWxlIChkYXRhID49IDAgJiYgZGF0YSAmIEJNQ1JfUkVTRVQpOwogfQogCiBzdGF0aWMgdm9pZCBwb3J0X3N0YXJ0KHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCkKQEAgLTE4OTAsNyArMTk0Miw3IEBACiAJLyoKIAkgKiBQZXJmb3JtIFBIWSByZXNldCwgaWYgdGhlcmUgaXMgYSBQSFkuCiAJICovCi0JaWYgKG1wLT5waHlfYWRkciAhPSAtMSkgeworCWlmIChtcC0+cGh5ICE9IE5VTEwpIHsKIAkJc3RydWN0IGV0aHRvb2xfY21kIGNtZDsKIAogCQltdjY0M3h4X2V0aF9nZXRfc2V0dGluZ3MobXAtPmRldiwgJmNtZCk7CkBAIC0xOTA3LDcgKzE5NTksNyBAQAogCXdybChtcCwgUE9SVF9TRVJJQUxfQ09OVFJPTChtcC0+cG9ydF9udW0pLCBwc2NyKTsKIAogCXBzY3IgfD0gRE9fTk9UX0ZPUkNFX0xJTktfRkFJTDsKLQlpZiAobXAtPnBoeV9hZGRyID09IC0xKQorCWlmIChtcC0+cGh5ID09IE5VTEwpCiAJCXBzY3IgfD0gRk9SQ0VfTElOS19QQVNTOwogCXdybChtcCwgUE9SVF9TRVJJQUxfQ09OVFJPTChtcC0+cG9ydF9udW0pLCBwc2NyKTsKIApAQCAtMTkxNywxMiArMTk2OSw5IEBACiAJICogQ29uZmlndXJlIFRYIHBhdGggYW5kIHF1ZXVlcy4KIAkgKi8KIAl0eF9zZXRfcmF0ZShtcCwgMTAwMDAwMDAwMCwgMTY3NzcyMTYpOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPnR4cV9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCB0eF9xdWV1ZSAqdHhxID0gbXAtPnR4cSArIGk7CiAKLQkJaWYgKChtcC0+dHhxX21hc2sgJiAoMSA8PCBpKSkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCiAJCXR4cV9yZXNldF9od19wdHIodHhxKTsKIAkJdHhxX3NldF9yYXRlKHR4cSwgMTAwMDAwMDAwMCwgMTY3NzcyMTYpOwogCQl0eHFfc2V0X2ZpeGVkX3ByaW9fbW9kZSh0eHEpOwpAQCAtMTkzNSw5ICsxOTg0LDEwIEBACiAKIAkvKgogCSAqIFJlY2VpdmUgYWxsIHVubWF0Y2hlZCB1bmljYXN0LCBUQ1AsIFVEUCwgQlBEVSBhbmQgYnJvYWRjYXN0Ci0JICogZnJhbWVzIHRvIFJYIHF1ZXVlICMwLgorCSAqIGZyYW1lcyB0byBSWCBxdWV1ZSAjMCwgYW5kIGluY2x1ZGUgdGhlIHBzZXVkby1oZWFkZXIgd2hlbgorCSAqIGNhbGN1bGF0aW5nIHJlY2VpdmUgY2hlY2tzdW1zLgogCSAqLwotCXdybChtcCwgUE9SVF9DT05GSUcobXAtPnBvcnRfbnVtKSwgMHgwMDAwMDAwMCk7CisJd3JsKG1wLCBQT1JUX0NPTkZJRyhtcC0+cG9ydF9udW0pLCAweDAyMDAwMDAwKTsKIAogCS8qCiAJICogVHJlYXQgQlBEVXMgYXMgbm9ybWFsIG11bHRpY2FzdHMsIGFuZCBkaXNhYmxlIHBhcnRpdGlvbiBtb2RlLgpAQCAtMTk0NywxNCArMTk5NywxMSBAQAogCS8qCiAJICogRW5hYmxlIHRoZSByZWNlaXZlIHF1ZXVlcy4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1wLT5yeHFfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcnhfcXVldWUgKnJ4cSA9IG1wLT5yeHEgKyBpOwogCQlpbnQgb2ZmID0gUlhRX0NVUlJFTlRfREVTQ19QVFIobXAtPnBvcnRfbnVtLCBpKTsKIAkJdTMyIGFkZHI7CiAKLQkJaWYgKChtcC0+cnhxX21hc2sgJiAoMSA8PCBpKSkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCiAJCWFkZHIgPSAodTMyKXJ4cS0+cnhfZGVzY19kbWE7CiAJCWFkZHIgKz0gcnhxLT5yeF9jdXJyX2Rlc2MgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOwogCQl3cmwobXAsIG9mZiwgYWRkcik7CkBAIC0xOTkzLDYgKzIwNDAsMjYgQEAKIAl3cmwobXAsIFRYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRChtcC0+cG9ydF9udW0pLCAoY29hbCAmIDB4M2ZmZikgPDwgNCk7CiB9CiAKK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3JlY2FsY19za2Jfc2l6ZShzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXApCit7CisJaW50IHNrYl9zaXplOworCisJLyoKKwkgKiBSZXNlcnZlIDIrMTQgYnl0ZXMgZm9yIGFuIGV0aGVybmV0IGhlYWRlciAodGhlIGhhcmR3YXJlCisJICogYXV0b21hdGljYWxseSBwcmVwZW5kcyAyIGJ5dGVzIG9mIGR1bW15IGRhdGEgdG8gZWFjaAorCSAqIHJlY2VpdmVkIHBhY2tldCksIDE2IGJ5dGVzIGZvciB1cCB0byBmb3VyIFZMQU4gdGFncywgYW5kCisJICogNCBieXRlcyBmb3IgdGhlIHRyYWlsaW5nIEZDUyAtLSAzNiBieXRlcyB0b3RhbC4KKwkgKi8KKwlza2Jfc2l6ZSA9IG1wLT5kZXYtPm10dSArIDM2OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2tiIHNpemUgaXMgYSBtdWx0aXBsZSBvZiA4IGJ5dGVzLCBhcworCSAqIHRoZSBsb3dlciB0aHJlZSBiaXRzIG9mIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IncyBidWZmZXIKKwkgKiBzaXplIGZpZWxkIGFyZSBpZ25vcmVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwltcC0+c2tiX3NpemUgPSAoc2tiX3NpemUgKyA3KSAmIH43OworfQorCiBzdGF0aWMgaW50IG12NjQzeHhfZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjAwNCw4ICsyMDcxLDcgQEAKIAlyZGwobXAsIElOVF9DQVVTRV9FWFQobXAtPnBvcnRfbnVtKSk7CiAKIAllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbXY2NDN4eF9ldGhfaXJxLAotCQkJICBJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKLQkJCSAgZGV2LT5uYW1lLCBkZXYpOworCQkJICBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+ZGV2LCAiY2FuJ3QgYXNzaWduIGlycVxuIik7CiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMjAxMyw1OCArMjA3OSw1MyBAQAogCiAJaW5pdF9tYWNfdGFibGVzKG1wKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKChtcC0+cnhxX21hc2sgJiAoMSA8PCBpKSkgPT0gMCkKLQkJCWNvbnRpbnVlOworCW12NjQzeHhfZXRoX3JlY2FsY19za2Jfc2l6ZShtcCk7CiAKKwluYXBpX2VuYWJsZSgmbXAtPm5hcGkpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbXAtPnJ4X3JlY3ljbGUpOworCisJZm9yIChpID0gMDsgaSA8IG1wLT5yeHFfY291bnQ7IGkrKykgewogCQllcnIgPSByeHFfaW5pdChtcCwgaSk7CiAJCWlmIChlcnIpIHsKIAkJCXdoaWxlICgtLWkgPj0gMCkKLQkJCQlpZiAobXAtPnJ4cV9tYXNrICYgKDEgPDwgaSkpCi0JCQkJCXJ4cV9kZWluaXQobXAtPnJ4cSArIGkpOworCQkJCXJ4cV9kZWluaXQobXAtPnJ4cSArIGkpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlyeHFfcmVmaWxsKG1wLT5yeHEgKyBpKTsKKwkJcnhxX3JlZmlsbChtcC0+cnhxICsgaSwgSU5UX01BWCk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoKG1wLT50eHFfbWFzayAmICgxIDw8IGkpKSA9PSAwKQotCQkJY29udGludWU7CisJaWYgKG1wLT53b3JrX3J4X29vbSkgeworCQltcC0+cnhfb29tLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMTApOworCQlhZGRfdGltZXIoJm1wLT5yeF9vb20pOworCX0KIAorCWZvciAoaSA9IDA7IGkgPCBtcC0+dHhxX2NvdW50OyBpKyspIHsKIAkJZXJyID0gdHhxX2luaXQobXAsIGkpOwogCQlpZiAoZXJyKSB7CiAJCQl3aGlsZSAoLS1pID49IDApCi0JCQkJaWYgKG1wLT50eHFfbWFzayAmICgxIDw8IGkpKQotCQkJCQl0eHFfZGVpbml0KG1wLT50eHEgKyBpKTsKKwkJCQl0eHFfZGVpbml0KG1wLT50eHEgKyBpKTsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAl9CiAKLSNpZmRlZiBNVjY0M1hYX0VUSF9OQVBJCi0JbmFwaV9lbmFibGUoJm1wLT5uYXBpKTsKLSNlbmRpZgotCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlwb3J0X3N0YXJ0KG1wKTsKIAogCXNldF9yeF9jb2FsKG1wLCAwKTsKIAlzZXRfdHhfY29hbChtcCwgMCk7CiAKLQl3cmwobXAsIElOVF9NQVNLX0VYVChtcC0+cG9ydF9udW0pLAotCSAgICBJTlRfRVhUX0xJTksgfCBJTlRfRVhUX1BIWSB8IElOVF9FWFRfVFgpOwotCisJd3JsKG1wLCBJTlRfTUFTS19FWFQobXAtPnBvcnRfbnVtKSwgSU5UX0VYVF9MSU5LX1BIWSB8IElOVF9FWFRfVFgpOwogCXdybChtcCwgSU5UX01BU0sobXAtPnBvcnRfbnVtKSwgSU5UX1RYX0VORCB8IElOVF9SWCB8IElOVF9FWFQpOwogCiAJcmV0dXJuIDA7CiAKIAogb3V0X2ZyZWU6Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJaWYgKG1wLT5yeHFfbWFzayAmICgxIDw8IGkpKQotCQkJcnhxX2RlaW5pdChtcC0+cnhxICsgaSk7CisJZm9yIChpID0gMDsgaSA8IG1wLT5yeHFfY291bnQ7IGkrKykKKwkJcnhxX2RlaW5pdChtcC0+cnhxICsgaSk7CiBvdXQ6CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAKQEAgLTIwNzYsMTIgKzIxMzcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKG1wLT5yeHFfbWFzayAmICgxIDw8IGkpKQotCQkJcnhxX2Rpc2FibGUobXAtPnJ4cSArIGkpOwotCQlpZiAobXAtPnR4cV9tYXNrICYgKDEgPDwgaSkpCi0JCQl0eHFfZGlzYWJsZShtcC0+dHhxICsgaSk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBtcC0+cnhxX2NvdW50OyBpKyspCisJCXJ4cV9kaXNhYmxlKG1wLT5yeHEgKyBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPnR4cV9jb3VudDsgaSsrKQorCQl0eHFfZGlzYWJsZShtcC0+dHhxICsgaSk7CiAKIAl3aGlsZSAoMSkgewogCQl1MzIgcHMgPSByZGwobXAsIFBPUlRfU1RBVFVTKG1wLT5wb3J0X251bSkpOwpAQCAtMjEwNywyMyArMjE2NiwyNiBAQAogCXdybChtcCwgSU5UX01BU0sobXAtPnBvcnRfbnVtKSwgMHgwMDAwMDAwMCk7CiAJcmRsKG1wLCBJTlRfTUFTSyhtcC0+cG9ydF9udW0pKTsKIAotI2lmZGVmIE1WNjQzWFhfRVRIX05BUEkKKwlkZWxfdGltZXJfc3luYygmbXAtPm1pYl9jb3VudGVyc190aW1lcik7CisKIAluYXBpX2Rpc2FibGUoJm1wLT5uYXBpKTsKLSNlbmRpZgorCisJZGVsX3RpbWVyX3N5bmMoJm1wLT5yeF9vb20pOworCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAogCXBvcnRfcmVzZXQobXApOworCW12NjQzeHhfZXRoX2dldF9zdGF0cyhkZXYpOwogCW1pYl9jb3VudGVyc191cGRhdGUobXApOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAobXAtPnJ4cV9tYXNrICYgKDEgPDwgaSkpCi0JCQlyeHFfZGVpbml0KG1wLT5yeHEgKyBpKTsKLQkJaWYgKG1wLT50eHFfbWFzayAmICgxIDw8IGkpKQotCQkJdHhxX2RlaW5pdChtcC0+dHhxICsgaSk7Ci0JfQorCXNrYl9xdWV1ZV9wdXJnZSgmbXAtPnJ4X3JlY3ljbGUpOworCisJZm9yIChpID0gMDsgaSA8IG1wLT5yeHFfY291bnQ7IGkrKykKKwkJcnhxX2RlaW5pdChtcC0+cnhxICsgaSk7CisJZm9yIChpID0gMDsgaSA8IG1wLT50eHFfY291bnQ7IGkrKykKKwkJdHhxX2RlaW5pdChtcC0+dHhxICsgaSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMzIsOCArMjE5NCw4IEBACiB7CiAJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChtcC0+cGh5X2FkZHIgIT0gLTEpCi0JCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmbXAtPm1paSwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7CisJaWYgKG1wLT5waHkgIT0gTlVMTCkKKwkJcmV0dXJuIHBoeV9taWlfaW9jdGwobXAtPnBoeSwgaWZfbWlpKGlmciksIGNtZCk7CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0yMTQ2LDYgKzIyMDgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRldi0+bXR1ID0gbmV3X210dTsKKwltdjY0M3h4X2V0aF9yZWNhbGNfc2tiX3NpemUobXApOwogCXR4X3NldF9yYXRlKG1wLCAxMDAwMDAwMDAwLCAxNjc3NzIxNik7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKQEAgLTIxNzMsMTIgKzIyMzYsMTAgQEAKIAogCW1wID0gY29udGFpbmVyX29mKHVnbHksIHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlLCB0eF90aW1lb3V0X3Rhc2spOwogCWlmIChuZXRpZl9ydW5uaW5nKG1wLT5kZXYpKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUobXAtPmRldik7Ci0KKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG1wLT5kZXYpOwogCQlwb3J0X3Jlc2V0KG1wKTsKIAkJcG9ydF9zdGFydChtcCk7Ci0KLQkJX190eHFfbWF5YmVfd2FrZShtcC0+dHhxICsgbXAtPnR4cV9wcmltYXJ5KTsKKwkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG1wLT5kZXYpOwogCX0KIH0KIApAQCAtMjIwNSwyMiArMjI2Niw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBtdjY0M3h4X2V0aF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIGludCByZWcpCi17Ci0Jc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdmFsOwotCi0Jc21pX3JlZ19yZWFkKG1wLCBhZGRyLCByZWcsICZ2YWwpOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkciwgaW50IHJlZywgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNtaV9yZWdfd3JpdGUobXAsIGFkZHIsIHJlZywgdmFsKTsKLX0KLQogCiAvKiBwbGF0Zm9ybSBnbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkCkBAIC0yMjcyLDE0ICsyMzE3LDIwIEBACiAJCW1zcC0+ZXh0ZW5kZWRfcnhfY29hbF9saW1pdCA9IDA7CiAKIAkvKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIFRYIHJhdGUgY29udHJvbCByZWdpc3RlcnMgYXJlIGluIHRoZQotCSAqIG9sZCBvciB0aGUgbmV3IHBsYWNlLgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIE1BQyBzdXBwb3J0cyBUWCByYXRlIGNvbnRyb2wsIGFuZCBpZgorCSAqIHllcywgd2hldGhlciBpdHMgYXNzb2NpYXRlZCByZWdpc3RlcnMgYXJlIGluIHRoZSBvbGQgb3IKKwkgKiB0aGUgbmV3IHBsYWNlLgogCSAqLwogCXdyaXRlbCgxLCBtc3AtPmJhc2UgKyBUWF9CV19NVFVfTU9WRUQoMCkpOwotCWlmIChyZWFkbChtc3AtPmJhc2UgKyBUWF9CV19NVFVfTU9WRUQoMCkpICYgMSkKLQkJbXNwLT50eF9id19jb250cm9sX21vdmVkID0gMTsKLQllbHNlCi0JCW1zcC0+dHhfYndfY29udHJvbF9tb3ZlZCA9IDA7CisJaWYgKHJlYWRsKG1zcC0+YmFzZSArIFRYX0JXX01UVV9NT1ZFRCgwKSkgJiAxKSB7CisJCW1zcC0+dHhfYndfY29udHJvbCA9IFRYX0JXX0NPTlRST0xfTkVXX0xBWU9VVDsKKwl9IGVsc2UgeworCQl3cml0ZWwoNywgbXNwLT5iYXNlICsgVFhfQldfUkFURSgwKSk7CisJCWlmIChyZWFkbChtc3AtPmJhc2UgKyBUWF9CV19SQVRFKDApKSAmIDcpCisJCQltc3AtPnR4X2J3X2NvbnRyb2wgPSBUWF9CV19DT05UUk9MX09MRF9MQVlPVVQ7CisJCWVsc2UKKwkJCW1zcC0+dHhfYndfY29udHJvbCA9IFRYX0JXX0NPTlRST0xfQUJTRU5UOworCX0KIH0KIAogc3RhdGljIGludCBtdjY0M3h4X2V0aF9zaGFyZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTIzMDksNyArMjM2MCw0NSBAQAogCWlmIChtc3AtPmJhc2UgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNwaW5fbG9ja19pbml0KCZtc3AtPnBoeV9sb2NrKTsKKwkvKgorCSAqIFNldCB1cCBhbmQgcmVnaXN0ZXIgU01JIGJ1cy4KKwkgKi8KKwlpZiAocGQgPT0gTlVMTCB8fCBwZC0+c2hhcmVkX3NtaSA9PSBOVUxMKSB7CisJCW1zcC0+c21pX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKKwkJaWYgKG1zcC0+c21pX2J1cyA9PSBOVUxMKQorCQkJZ290byBvdXRfdW5tYXA7CisKKwkJbXNwLT5zbWlfYnVzLT5wcml2ID0gbXNwOworCQltc3AtPnNtaV9idXMtPm5hbWUgPSAibXY2NDN4eF9ldGggc21pIjsKKwkJbXNwLT5zbWlfYnVzLT5yZWFkID0gc21pX2J1c19yZWFkOworCQltc3AtPnNtaV9idXMtPndyaXRlID0gc21pX2J1c193cml0ZSwKKwkJc25wcmludGYobXNwLT5zbWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJWQiLCBwZGV2LT5pZCk7CisJCW1zcC0+c21pX2J1cy0+cGFyZW50ID0gJnBkZXYtPmRldjsKKwkJbXNwLT5zbWlfYnVzLT5waHlfbWFzayA9IDB4ZmZmZmZmZmY7CisJCWlmIChtZGlvYnVzX3JlZ2lzdGVyKG1zcC0+c21pX2J1cykgPCAwKQorCQkJZ290byBvdXRfZnJlZV9taWlfYnVzOworCQltc3AtPnNtaSA9IG1zcDsKKwl9IGVsc2UgeworCQltc3AtPnNtaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkLT5zaGFyZWRfc21pKTsKKwl9CisKKwltc3AtPmVycl9pbnRlcnJ1cHQgPSBOT19JUlE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbXNwLT5zbWlfYnVzeV93YWl0KTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZXJyb3IgaW50ZXJydXB0IGlzIGhvb2tlZCB1cC4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgIT0gTlVMTCkgeworCQlpbnQgZXJyOworCisJCWVyciA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIG12NjQzeHhfZXRoX2Vycl9pcnEsCisJCQkJICBJUlFGX1NIQVJFRCwgIm12NjQzeHhfZXRoIiwgbXNwKTsKKwkJaWYgKCFlcnIpIHsKKwkJCXdyaXRlbChFUlJfSU5UX1NNSV9ET05FLCBtc3AtPmJhc2UgKyBFUlJfSU5UX01BU0spOworCQkJbXNwLT5lcnJfaW50ZXJydXB0ID0gcmVzLT5zdGFydDsKKwkJfQorCX0KIAogCS8qCiAJICogKFJlLSlwcm9ncmFtIE1CVVMgcmVtYXBwaW5nIHdpbmRvd3MgaWYgd2UgYXJlIGFza2VkIHRvLgpAQCAtMjMyNyw2ICsyNDE2LDEwIEBACiAKIAlyZXR1cm4gMDsKIAorb3V0X2ZyZWVfbWlpX2J1czoKKwltZGlvYnVzX2ZyZWUobXNwLT5zbWlfYnVzKTsKK291dF91bm1hcDoKKwlpb3VubWFwKG1zcC0+YmFzZSk7CiBvdXRfZnJlZToKIAlrZnJlZShtc3ApOwogb3V0OgpAQCAtMjMzNiw3ICsyNDI5LDE0IEBACiBzdGF0aWMgaW50IG12NjQzeHhfZXRoX3NoYXJlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfc2hhcmVkX3ByaXZhdGUgKm1zcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcGxhdGZvcm1fZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAorCWlmIChwZCA9PSBOVUxMIHx8IHBkLT5zaGFyZWRfc21pID09IE5VTEwpIHsKKwkJbWRpb2J1c19mcmVlKG1zcC0+c21pX2J1cyk7CisJCW1kaW9idXNfdW5yZWdpc3Rlcihtc3AtPnNtaV9idXMpOworCX0KKwlpZiAobXNwLT5lcnJfaW50ZXJydXB0ICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobXNwLT5lcnJfaW50ZXJydXB0LCBtc3ApOwogCWlvdW5tYXAobXNwLT5iYXNlKTsKIAlrZnJlZShtc3ApOwogCkBAIC0yMzgyLDMzICsyNDgyLDEzIEBACiAJZWxzZQogCQl1Y19hZGRyX2dldChtcCwgZGV2LT5kZXZfYWRkcik7CiAKLQlpZiAocGQtPnBoeV9hZGRyID09IC0xKSB7Ci0JCW1wLT5zaGFyZWRfc21pID0gTlVMTDsKLQkJbXAtPnBoeV9hZGRyID0gLTE7Ci0JfSBlbHNlIHsKLQkJbXAtPnNoYXJlZF9zbWkgPSBtcC0+c2hhcmVkOwotCQlpZiAocGQtPnNoYXJlZF9zbWkgIT0gTlVMTCkKLQkJCW1wLT5zaGFyZWRfc21pID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGQtPnNoYXJlZF9zbWkpOwotCi0JCWlmIChwZC0+Zm9yY2VfcGh5X2FkZHIgfHwgcGQtPnBoeV9hZGRyKSB7Ci0JCQltcC0+cGh5X2FkZHIgPSBwZC0+cGh5X2FkZHIgJiAweDNmOwotCQkJcGh5X2FkZHJfc2V0KG1wLCBtcC0+cGh5X2FkZHIpOwotCQl9IGVsc2UgewotCQkJbXAtPnBoeV9hZGRyID0gcGh5X2FkZHJfZ2V0KG1wKTsKLQkJfQotCX0KLQogCW1wLT5kZWZhdWx0X3J4X3Jpbmdfc2l6ZSA9IERFRkFVTFRfUlhfUVVFVUVfU0laRTsKIAlpZiAocGQtPnJ4X3F1ZXVlX3NpemUpCiAJCW1wLT5kZWZhdWx0X3J4X3Jpbmdfc2l6ZSA9IHBkLT5yeF9xdWV1ZV9zaXplOwogCW1wLT5yeF9kZXNjX3NyYW1fYWRkciA9IHBkLT5yeF9zcmFtX2FkZHI7CiAJbXAtPnJ4X2Rlc2Nfc3JhbV9zaXplID0gcGQtPnJ4X3NyYW1fc2l6ZTsKIAotCWlmIChwZC0+cnhfcXVldWVfbWFzaykKLQkJbXAtPnJ4cV9tYXNrID0gcGQtPnJ4X3F1ZXVlX21hc2s7Ci0JZWxzZQotCQltcC0+cnhxX21hc2sgPSAweDAxOwotCW1wLT5yeHFfcHJpbWFyeSA9IGZscyhtcC0+cnhxX21hc2spIC0gMTsKKwltcC0+cnhxX2NvdW50ID0gcGQtPnJ4X3F1ZXVlX2NvdW50ID8gOiAxOwogCiAJbXAtPmRlZmF1bHRfdHhfcmluZ19zaXplID0gREVGQVVMVF9UWF9RVUVVRV9TSVpFOwogCWlmIChwZC0+dHhfcXVldWVfc2l6ZSkKQEAgLTI0MTYsNzYgKzI0OTYsNjMgQEAKIAltcC0+dHhfZGVzY19zcmFtX2FkZHIgPSBwZC0+dHhfc3JhbV9hZGRyOwogCW1wLT50eF9kZXNjX3NyYW1fc2l6ZSA9IHBkLT50eF9zcmFtX3NpemU7CiAKLQlpZiAocGQtPnR4X3F1ZXVlX21hc2spCi0JCW1wLT50eHFfbWFzayA9IHBkLT50eF9xdWV1ZV9tYXNrOwotCWVsc2UKLQkJbXAtPnR4cV9tYXNrID0gMHgwMTsKLQltcC0+dHhxX3ByaW1hcnkgPSBmbHMobXAtPnR4cV9tYXNrKSAtIDE7CisJbXAtPnR4cV9jb3VudCA9IHBkLT50eF9xdWV1ZV9jb3VudCA/IDogMTsKIH0KIAotc3RhdGljIGludCBwaHlfZGV0ZWN0KHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCkKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X3NjYW4oc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wLAorCQkJCSAgIGludCBwaHlfYWRkcikKIHsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQl1bnNpZ25lZCBpbnQgZGF0YTI7CisJc3RydWN0IG1paV9idXMgKmJ1cyA9IG1wLT5zaGFyZWQtPnNtaS0+c21pX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OworCWludCBzdGFydDsKKwlpbnQgbnVtOworCWludCBpOwogCi0Jc21pX3JlZ19yZWFkKG1wLCBtcC0+cGh5X2FkZHIsIE1JSV9CTUNSLCAmZGF0YSk7Ci0Jc21pX3JlZ193cml0ZShtcCwgbXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgZGF0YSBeIEJNQ1JfQU5FTkFCTEUpOwotCi0Jc21pX3JlZ19yZWFkKG1wLCBtcC0+cGh5X2FkZHIsIE1JSV9CTUNSLCAmZGF0YTIpOwotCWlmICgoKGRhdGEgXiBkYXRhMikgJiBCTUNSX0FORU5BQkxFKSA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXNtaV9yZWdfd3JpdGUobXAsIG1wLT5waHlfYWRkciwgTUlJX0JNQ1IsIGRhdGEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGh5X2luaXQoc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wLAotCQkgICAgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKnBkKQotewotCXN0cnVjdCBldGh0b29sX2NtZCBjbWQ7Ci0JaW50IGVycjsKLQotCWVyciA9IHBoeV9kZXRlY3QobXApOwotCWlmIChlcnIpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZtcC0+ZGV2LT5kZXYsCi0JCQkgICAibm8gUEhZIGRldGVjdGVkIGF0IGFkZHIgJWRcbiIsIG1wLT5waHlfYWRkcik7Ci0JCXJldHVybiBlcnI7CisJaWYgKHBoeV9hZGRyID09IE1WNjQzWFhfRVRIX1BIWV9BRERSX0RFRkFVTFQpIHsKKwkJc3RhcnQgPSBwaHlfYWRkcl9nZXQobXApICYgMHgxZjsKKwkJbnVtID0gMzI7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBwaHlfYWRkciAmIDB4MWY7CisJCW51bSA9IDE7CiAJfQorCisJcGh5ZGV2ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaW50IGFkZHIgPSAoc3RhcnQgKyBpKSAmIDB4MWY7CisKKwkJaWYgKGJ1cy0+cGh5X21hcFthZGRyXSA9PSBOVUxMKQorCQkJbWRpb2J1c19zY2FuKGJ1cywgYWRkcik7CisKKwkJaWYgKHBoeWRldiA9PSBOVUxMKSB7CisJCQlwaHlkZXYgPSBidXMtPnBoeV9tYXBbYWRkcl07CisJCQlpZiAocGh5ZGV2ICE9IE5VTEwpCisJCQkJcGh5X2FkZHJfc2V0KG1wLCBhZGRyKTsKKwkJfQorCX0KKworCXJldHVybiBwaHlkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHBoeV9pbml0KHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2YXRlICptcCwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHkgPSBtcC0+cGh5OworCiAJcGh5X3Jlc2V0KG1wKTsKIAotCW1wLT5taWkucGh5X2lkID0gbXAtPnBoeV9hZGRyOwotCW1wLT5taWkucGh5X2lkX21hc2sgPSAweDNmOwotCW1wLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKLQltcC0+bWlpLmRldiA9IG1wLT5kZXY7Ci0JbXAtPm1paS5tZGlvX3JlYWQgPSBtdjY0M3h4X2V0aF9tZGlvX3JlYWQ7Ci0JbXAtPm1paS5tZGlvX3dyaXRlID0gbXY2NDN4eF9ldGhfbWRpb193cml0ZTsKKwlwaHlfYXR0YWNoKG1wLT5kZXYsIHBoeS0+ZGV2LmJ1c19pZCwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOwogCi0JbXAtPm1paS5zdXBwb3J0c19nbWlpID0gbWlpX2NoZWNrX2dtaWlfc3VwcG9ydCgmbXAtPm1paSk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLnBvcnQgPSBQT1JUX01JSTsKLQljbWQudHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCWNtZC5waHlfYWRkcmVzcyA9IG1wLT5waHlfYWRkcjsKLQlpZiAocGQtPnNwZWVkID09IDApIHsKLQkJY21kLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKLQkJY21kLnNwZWVkID0gU1BFRURfMTAwOwotCQljbWQuYWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiAgfAotCQkJCSAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgIHwKLQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8Ci0JCQkJICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7Ci0JCWlmIChtcC0+bWlpLnN1cHBvcnRzX2dtaWkpCi0JCQljbWQuYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwlpZiAoc3BlZWQgPT0gMCkgeworCQlwaHktPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJcGh5LT5zcGVlZCA9IDA7CisJCXBoeS0+ZHVwbGV4ID0gMDsKKwkJcGh5LT5hZHZlcnRpc2luZyA9IHBoeS0+c3VwcG9ydGVkIHwgQURWRVJUSVNFRF9BdXRvbmVnOwogCX0gZWxzZSB7Ci0JCWNtZC5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwotCQljbWQuc3BlZWQgPSBwZC0+c3BlZWQ7Ci0JCWNtZC5kdXBsZXggPSBwZC0+ZHVwbGV4OworCQlwaHktPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCXBoeS0+YWR2ZXJ0aXNpbmcgPSAwOworCQlwaHktPnNwZWVkID0gc3BlZWQ7CisJCXBoeS0+ZHVwbGV4ID0gZHVwbGV4OwogCX0KLQotCW12NjQzeHhfZXRoX3NldF9zZXR0aW5ncyhtcC0+ZGV2LCAmY21kKTsKLQotCXJldHVybiAwOworCXBoeV9zdGFydF9hbmVnKHBoeSk7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfcHNjcihzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAsIGludCBzcGVlZCwgaW50IGR1cGxleCkKQEAgLTI0OTksNyArMjU2Niw3IEBACiAJfQogCiAJcHNjciA9IE1BWF9SWF9QQUNLRVRfOTcwMEJZVEUgfCBTRVJJQUxfUE9SVF9DT05UUk9MX1JFU0VSVkVEOwotCWlmIChtcC0+cGh5X2FkZHIgPT0gLTEpIHsKKwlpZiAobXAtPnBoeSA9PSBOVUxMKSB7CiAJCXBzY3IgfD0gRElTQUJMRV9BVVRPX05FR19TUEVFRF9HTUlJOwogCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKIAkJCXBzY3IgfD0gU0VUX0dNSUlfU1BFRURfVE9fMTAwMDsKQEAgLTI1MzgsNyArMjYwNSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSkpOworCWRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSksIDgpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjU0OSwzMyArMjYxNiw0NyBAQAogCW1wLT5wb3J0X251bSA9IHBkLT5wb3J0X251bWJlcjsKIAogCW1wLT5kZXYgPSBkZXY7Ci0jaWZkZWYgTVY2NDNYWF9FVEhfTkFQSQotCW5ldGlmX25hcGlfYWRkKGRldiwgJm1wLT5uYXBpLCBtdjY0M3h4X2V0aF9wb2xsLCA2NCk7Ci0jZW5kaWYKIAogCXNldF9wYXJhbXMobXAsIHBkKTsKKwlkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA9IG1wLT50eHFfY291bnQ7CiAKLQlzcGluX2xvY2tfaW5pdCgmbXAtPmxvY2spOworCWlmIChwZC0+cGh5X2FkZHIgIT0gTVY2NDNYWF9FVEhfUEhZX05PTkUpCisJCW1wLT5waHkgPSBwaHlfc2NhbihtcCwgcGQtPnBoeV9hZGRyKTsKIAotCW1pYl9jb3VudGVyc19jbGVhcihtcCk7Ci0JSU5JVF9XT1JLKCZtcC0+dHhfdGltZW91dF90YXNrLCB0eF90aW1lb3V0X3Rhc2spOwotCi0JaWYgKG1wLT5waHlfYWRkciAhPSAtMSkgewotCQllcnIgPSBwaHlfaW5pdChtcCwgcGQpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0KKwlpZiAobXAtPnBoeSAhPSBOVUxMKSB7CisJCXBoeV9pbml0KG1wLCBwZC0+c3BlZWQsIHBkLT5kdXBsZXgpOwogCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbXY2NDN4eF9ldGhfZXRodG9vbF9vcHMpOwogCX0gZWxzZSB7CiAJCVNFVF9FVEhUT09MX09QUyhkZXYsICZtdjY0M3h4X2V0aF9ldGh0b29sX29wc19waHlsZXNzKTsKIAl9CisKIAlpbml0X3BzY3IobXAsIHBkLT5zcGVlZCwgcGQtPmR1cGxleCk7CiAKIAorCW1pYl9jb3VudGVyc19jbGVhcihtcCk7CisKKwlpbml0X3RpbWVyKCZtcC0+bWliX2NvdW50ZXJzX3RpbWVyKTsKKwltcC0+bWliX2NvdW50ZXJzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyltcDsKKwltcC0+bWliX2NvdW50ZXJzX3RpbWVyLmZ1bmN0aW9uID0gbWliX2NvdW50ZXJzX3RpbWVyX3dyYXBwZXI7CisJbXAtPm1pYl9jb3VudGVyc190aW1lci5leHBpcmVzID0gamlmZmllcyArIDMwICogSFo7CisJYWRkX3RpbWVyKCZtcC0+bWliX2NvdW50ZXJzX3RpbWVyKTsKKworCXNwaW5fbG9ja19pbml0KCZtcC0+bWliX2NvdW50ZXJzX2xvY2spOworCisJSU5JVF9XT1JLKCZtcC0+dHhfdGltZW91dF90YXNrLCB0eF90aW1lb3V0X3Rhc2spOworCisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmbXAtPm5hcGksIG12NjQzeHhfZXRoX3BvbGwsIDEyOCk7CisKKwlpbml0X3RpbWVyKCZtcC0+cnhfb29tKTsKKwltcC0+cnhfb29tLmRhdGEgPSAodW5zaWduZWQgbG9uZyltcDsKKwltcC0+cnhfb29tLmZ1bmN0aW9uID0gb29tX3RpbWVyX3dyYXBwZXI7CisKKwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CiAJQlVHX09OKCFyZXMpOwogCWRldi0+aXJxID0gcmVzLT5zdGFydDsKIAorCWRldi0+Z2V0X3N0YXRzID0gbXY2NDN4eF9ldGhfZ2V0X3N0YXRzOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbXY2NDN4eF9ldGhfeG1pdDsKIAlkZXYtPm9wZW4gPSBtdjY0M3h4X2V0aF9vcGVuOwogCWRldi0+c3RvcCA9IG12NjQzeHhfZXRoX3N0b3A7CkBAIC0yNTkwLDE0ICsyNjcxLDggQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gMiAqIEhaOwogCWRldi0+YmFzZV9hZGRyID0gMDsKIAotI2lmZGVmIE1WNjQzWFhfRVRIX0NIRUNLU1VNX09GRkxPQURfVFgKLQkvKgotCSAqIFplcm8gY29weSBjYW4gb25seSB3b3JrIGlmIHdlIHVzZSBEaXNjb3ZlcnkgSUkgbWVtb3J5LiBFbHNlLCB3ZSB3aWxsCi0JICogaGF2ZSB0byBtYXAgdGhlIGJ1ZmZlcnMgdG8gSVNBIG1lbW9yeSB3aGljaCBpcyBvbmx5IDE2IE1CCi0JICovCiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CiAJZGV2LT52bGFuX2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKLSNlbmRpZgogCiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIApAQCAtMjYxMSwxNiArMjY4Niw2IEBACiAJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJmRldi0+ZGV2LCAicG9ydCAlZCB3aXRoIE1BQyBhZGRyZXNzICVzXG4iLAogCQkgICBtcC0+cG9ydF9udW0sIHByaW50X21hYyhtYWMsIGRldi0+ZGV2X2FkZHIpKTsKIAotCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TRykKLQkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJmRldi0+ZGV2LCAic2NhdHRlci9nYXRoZXIgZW5hYmxlZFxuIik7Ci0KLQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkKLQkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJmRldi0+ZGV2LCAidHggY2hlY2tzdW0gb2ZmbG9hZFxuIik7Ci0KLSNpZmRlZiBNVjY0M1hYX0VUSF9OQVBJCi0JZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJmRldi0+ZGV2LCAibmFwaSBlbmFibGVkXG4iKTsKLSNlbmRpZgotCiAJaWYgKG1wLT50eF9kZXNjX3NyYW1fc2l6ZSA+IDApCiAJCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZkZXYtPmRldiwgImNvbmZpZ3VyZWQgd2l0aCBzcmFtXG4iKTsKIApAQCAtMjYzNyw2ICsyNzAyLDggQEAKIAlzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdmF0ZSAqbXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG1wLT5kZXYpOworCWlmIChtcC0+cGh5ICE9IE5VTEwpCisJCXBoeV9kZXRhY2gobXAtPnBoeSk7CiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlmcmVlX25ldGRldihtcC0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggZDY1MjRkYi4uNmRjZTkwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC03NSw3ICs3NSw3IEBACiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwLmgiCiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaCIKIAotI2RlZmluZSBNWVJJMTBHRV9WRVJTSU9OX1NUUiAiMS40LjMtMS4zNTgiCisjZGVmaW5lIE1ZUkkxMEdFX1ZFUlNJT05fU1RSICIxLjQuMy0xLjM2OSIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNeXJpY29tIDEwRyBkcml2ZXIgKDEwR2JFKSIpOwogTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogaGVscEBteXJpLmNvbSIpOwpAQCAtMTAyLDYgKzEwMiw4IEBACiAjZGVmaW5lIE1ZUkkxMEdFX0FMTE9DX1NJWkUgKCgxIDw8IE1ZUkkxMEdFX0FMTE9DX09SREVSKSAqIFBBR0VfU0laRSkKICNkZWZpbmUgTVlSSTEwR0VfTUFYX0ZSQUdTX1BFUl9GUkFNRSAoTVlSSTEwR0VfTUFYX0VUSEVSX01UVS9NWVJJMTBHRV9BTExPQ19TSVpFICsgMSkKIAorI2RlZmluZSBNWVJJMTBHRV9NQVhfU0xJQ0VTIDMyCisKIHN0cnVjdCBteXJpMTBnZV9yeF9idWZmZXJfc3RhdGUgewogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBwYWdlX29mZnNldDsKQEAgLTEzOCw2ICsxNDAsOCBAQAogCiBzdHJ1Y3QgbXlyaTEwZ2VfdHhfYnVmIHsKIAlzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfc2VuZCBfX2lvbWVtICpsYW5haTsJLyogbGFuYWkgcHRyIGZvciBzZW5kcSAqLworCV9fYmUzMiBfX2lvbWVtICpzZW5kX2dvOwkvKiAiZ28iIGRvb3JiZWxsIHB0ciAqLworCV9fYmUzMiBfX2lvbWVtICpzZW5kX3N0b3A7CS8qICJzdG9wIiBkb29yYmVsbCBwdHIgKi8KIAlzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfc2VuZCAqcmVxX2xpc3Q7CS8qIGhvc3Qgc2hhZG93IG9mIHNlbmRxICovCiAJY2hhciAqcmVxX2J5dGVzOwogCXN0cnVjdCBteXJpMTBnZV90eF9idWZmZXJfc3RhdGUgKmluZm87CkBAIC0xNDksNiArMTUzLDcgQEAKIAlpbnQgZG9uZSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CS8qIHRyYW5zbWl0IHNsb3RzIGNvbXBsZXRlZCAgICAgKi8KIAlpbnQgcGt0X2RvbmU7CQkvKiBwYWNrZXRzIGNvbXBsZXRlZCAqLwogCWludCB3YWtlX3F1ZXVlOworCWludCBxdWV1ZV9hY3RpdmU7CiB9OwogCiBzdHJ1Y3QgbXlyaTEwZ2VfcnhfZG9uZSB7CkBAIC0xODMsNyArMTg4LDcgQEAKIAlkbWFfYWRkcl90IGZ3X3N0YXRzX2J1czsKIAlpbnQgd2F0Y2hkb2dfdHhfZG9uZTsKIAlpbnQgd2F0Y2hkb2dfdHhfcmVxOwotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiAoZGVmaW5lZCBDT05GSUdfRENBKSB8fCAoZGVmaW5lZCBDT05GSUdfRENBX01PRFVMRSkKIAlpbnQgY2FjaGVkX2RjYV90YWc7CiAJaW50IGNwdTsKIAlfX2JlMzIgX19pb21lbSAqZGNhX3RhZzsKQEAgLTIxNSw3ICsyMjAsNyBAQAogCWludCBtc2lfZW5hYmxlZDsKIAlpbnQgbXNpeF9lbmFibGVkOwogCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X3ZlY3RvcnM7Ci0jaWZkZWYgQ09ORklHX0RDQQorI2lmIChkZWZpbmVkIENPTkZJR19EQ0EpIHx8IChkZWZpbmVkIENPTkZJR19EQ0FfTU9EVUxFKQogCWludCBkY2FfZW5hYmxlZDsKICNlbmRpZgogCXUzMiBsaW5rX3N0YXRlOwpAQCAtNDE4LDYgKzQyMywxMiBAQAogCQkJcmV0dXJuIC1FTk9TWVM7CiAJCX0gZWxzZSBpZiAocmVzdWx0ID09IE1YR0VGV19DTURfRVJST1JfVU5BTElHTkVEKSB7CiAJCQlyZXR1cm4gLUUyQklHOworCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSBNWEdFRldfQ01EX0VSUk9SX1JBTkdFICYmCisJCQkgICBjbWQgPT0gTVhHRUZXX0NNRF9FTkFCTEVfUlNTX1FVRVVFUyAmJgorCQkJICAgKGRhdGEtPgorCQkJICAgIGRhdGExICYgTVhHRUZXX1NMSUNFX0VOQUJMRV9NVUxUSVBMRV9UWF9RVUVVRVMpICE9CisJCQkgICAwKSB7CisJCQlyZXR1cm4gLUVSQU5HRTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoJm1ncC0+cGRldi0+ZGV2LAogCQkJCSJjb21tYW5kICVkIGZhaWxlZCwgcmVzdWx0ID0gJWRcbiIsCkBAIC04OTEsNyArOTAyLDcgQEAKIAlzdHJ1Y3QgbXlyaTEwZ2Vfc2xpY2Vfc3RhdGUgKnNzOwogCWludCBpLCBzdGF0dXM7CiAJc2l6ZV90IGJ5dGVzOwotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiAoZGVmaW5lZCBDT05GSUdfRENBKSB8fCAoZGVmaW5lZCBDT05GSUdfRENBX01PRFVMRSkKIAl1bnNpZ25lZCBsb25nIGRjYV90YWdfb2ZmOwogI2VuZGlmCiAKQEAgLTk0Nyw5ICs5NTgsMjQgQEAKIAkJICovCiAKIAkJY21kLmRhdGEwID0gbWdwLT5udW1fc2xpY2VzOwotCQljbWQuZGF0YTEgPSAxOwkvKiB1c2UgTVNJLVggKi8KKwkJY21kLmRhdGExID0gTVhHRUZXX1NMSUNFX0lOVFJfTU9ERV9PTkVfUEVSX1NMSUNFOworCQlpZiAobWdwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA+IDEpCisJCQljbWQuZGF0YTEgfD0gTVhHRUZXX1NMSUNFX0VOQUJMRV9NVUxUSVBMRV9UWF9RVUVVRVM7CiAJCXN0YXR1cyA9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9FTkFCTEVfUlNTX1FVRVVFUywKIAkJCQkJICAgJmNtZCwgMCk7CisKKwkJLyogRmlybXdhcmUgb2xkZXIgdGhhbiAxLjQuMzIgb25seSBzdXBwb3J0cyBtdWx0aXBsZQorCQkgKiBSWCBxdWV1ZXMsIHNvIGlmIHdlIGdldCBhbiBlcnJvciwgZmlyc3QgcmV0cnkgdXNpbmcgYQorCQkgKiBzaW5nbGUgVFggcXVldWUgYmVmb3JlIGdpdmluZyB1cCAqLworCQlpZiAoc3RhdHVzICE9IDAgJiYgbWdwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA+IDEpIHsKKwkJCW1ncC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSAxOworCQkJY21kLmRhdGEwID0gbWdwLT5udW1fc2xpY2VzOworCQkJY21kLmRhdGExID0gTVhHRUZXX1NMSUNFX0lOVFJfTU9ERV9PTkVfUEVSX1NMSUNFOworCQkJc3RhdHVzID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLAorCQkJCQkJICAgTVhHRUZXX0NNRF9FTkFCTEVfUlNTX1FVRVVFUywKKwkJCQkJCSAgICZjbWQsIDApOworCQl9CisKIAkJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCQlkZXZfZXJyKCZtZ3AtPnBkZXYtPmRldiwKIAkJCQkiZmFpbGVkIHRvIHNldCBudW1iZXIgb2Ygc2xpY2VzXG4iKTsKQEAgLTk4Niw3ICsxMDEyLDcgQEAKIAl9CiAJcHV0X2JlMzIoaHRvbmwobWdwLT5pbnRyX2NvYWxfZGVsYXkpLCBtZ3AtPmludHJfY29hbF9kZWxheV9wdHIpOwogCi0jaWZkZWYgQ09ORklHX0RDQQorI2lmIChkZWZpbmVkIENPTkZJR19EQ0EpIHx8IChkZWZpbmVkIENPTkZJR19EQ0FfTU9EVUxFKQogCXN0YXR1cyA9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9HRVRfRENBX09GRlNFVCwgJmNtZCwgMCk7CiAJZGNhX3RhZ19vZmYgPSBjbWQuZGF0YTA7CiAJZm9yIChpID0gMDsgaSA8IG1ncC0+bnVtX3NsaWNlczsgaSsrKSB7CkBAIC0xMDI1LDcgKzEwNTEsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgKGRlZmluZWQgQ09ORklHX0RDQSkgfHwgKGRlZmluZWQgQ09ORklHX0RDQV9NT0RVTEUpCiBzdGF0aWMgdm9pZAogbXlyaTEwZ2Vfd3JpdGVfZGNhKHN0cnVjdCBteXJpMTBnZV9zbGljZV9zdGF0ZSAqc3MsIGludCBjcHUsIGludCB0YWcpCiB7CkBAIC0xMDYwLDggKzEwODYsOSBAQAogCX0KIAllcnIgPSBkY2FfYWRkX3JlcXVlc3RlcigmcGRldi0+ZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJkY2FfYWRkX3JlcXVlc3RlcigpIGZhaWxlZCwgZXJyPSVkXG4iLCBlcnIpOworCQlpZiAoZXJyICE9IC1FTk9ERVYpCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImRjYV9hZGRfcmVxdWVzdGVyKCkgZmFpbGVkLCBlcnI9JWRcbiIsIGVycik7CiAJCXJldHVybjsKIAl9CiAJbWdwLT5kY2FfZW5hYmxlZCA9IDE7CkBAIC0xMzE2LDYgKzEzNDMsNyBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc3MtPm1ncC0+cGRldjsKIAlzdHJ1Y3QgbXlyaTEwZ2VfdHhfYnVmICp0eCA9ICZzcy0+dHg7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X3F1ZXVlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGlkeCwgbGVuOwogCkBAIC0xMzQ5LDExICsxMzc3LDMxIEBACiAJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQogCX0KKworCWRldl9xdWV1ZSA9IG5ldGRldl9nZXRfdHhfcXVldWUoc3MtPmRldiwgc3MgLSBzcy0+bWdwLT5zcyk7CisJLyoKKwkgKiBNYWtlIGEgbWluaW1hbCBlZmZvcnQgdG8gcHJldmVudCB0aGUgTklDIGZyb20gcG9sbGluZyBhbgorCSAqIGlkbGUgdHggcXVldWUuICBJZiB3ZSBjYW4ndCBnZXQgdGhlIGxvY2sgd2UgbGVhdmUgdGhlIHF1ZXVlCisJICogYWN0aXZlLiBJbiB0aGlzIGNhc2UsIGVpdGhlciBhIHRocmVhZCB3YXMgYWJvdXQgdG8gc3RhcnQKKwkgKiB1c2luZyB0aGUgcXVldWUgYW55d2F5LCBvciB3ZSBsb3N0IGEgcmFjZSBhbmQgdGhlIE5JQyB3aWxsCisJICogd2FzdGUgc29tZSBvZiBpdHMgcmVzb3VyY2VzIHBvbGxpbmcgYW4gaW5hY3RpdmUgcXVldWUgZm9yIGEKKwkgKiB3aGlsZS4KKwkgKi8KKworCWlmICgoc3MtPm1ncC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPiAxKSAmJgorCSAgICBfX25ldGlmX3R4X3RyeWxvY2soZGV2X3F1ZXVlKSkgeworCQlpZiAodHgtPnJlcSA9PSB0eC0+ZG9uZSkgeworCQkJdHgtPnF1ZXVlX2FjdGl2ZSA9IDA7CisJCQlwdXRfYmUzMihodG9ubCgxKSwgdHgtPnNlbmRfc3RvcCk7CisJCX0KKwkJX19uZXRpZl90eF91bmxvY2soZGV2X3F1ZXVlKTsKKwl9CisKIAkvKiBzdGFydCB0aGUgcXVldWUgaWYgd2UndmUgc3RvcHBlZCBpdCAqLwotCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHNzLT5kZXYpCisJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoZGV2X3F1ZXVlKQogCSAgICAmJiB0eC0+cmVxIC0gdHgtPmRvbmUgPCAodHgtPm1hc2sgPj4gMSkpIHsKIAkJdHgtPndha2VfcXVldWUrKzsKLQkJbmV0aWZfd2FrZV9xdWV1ZShzcy0+ZGV2KTsKKwkJbmV0aWZfdHhfd2FrZV9xdWV1ZShkZXZfcXVldWUpOwogCX0KIH0KIApAQCAtMTQ1Nyw3ICsxNTA1LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gc3MtPm1ncC0+ZGV2OwogCWludCB3b3JrX2RvbmU7CiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgKGRlZmluZWQgQ09ORklHX0RDQSkgfHwgKGRlZmluZWQgQ09ORklHX0RDQV9NT0RVTEUpCiAJaWYgKHNzLT5tZ3AtPmRjYV9lbmFibGVkKQogCQlteXJpMTBnZV91cGRhdGVfZGNhKHNzKTsKICNlbmRpZgpAQCAtMTQ4MSw5ICsxNTI5LDkgQEAKIAl1MzIgc2VuZF9kb25lX2NvdW50OwogCWludCBpOwogCi0JLyogYW4gaW50ZXJydXB0IG9uIGEgbm9uLXplcm8gc2xpY2UgaXMgaW1wbGljaXRseSB2YWxpZAotCSAqIHNpbmNlIE1TSS1YIGlycXMgYXJlIG5vdCBzaGFyZWQgKi8KLQlpZiAoc3MgIT0gbWdwLT5zcykgeworCS8qIGFuIGludGVycnVwdCBvbiBhIG5vbi16ZXJvIHJlY2VpdmUtb25seSBzbGljZSBpcyBpbXBsaWNpdGx5CisJICogdmFsaWQgIHNpbmNlIE1TSS1YIGlycXMgYXJlIG5vdCBzaGFyZWQgKi8KKwlpZiAoKG1ncC0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPT0gMSkgJiYgKHNzICE9IG1ncC0+c3MpKSB7CiAJCW5ldGlmX3J4X3NjaGVkdWxlKHNzLT5kZXYsICZzcy0+bmFwaSk7CiAJCXJldHVybiAoSVJRX0hBTkRMRUQpOwogCX0KQEAgLTE1MjUsNyArMTU3Myw5IEBACiAJCWJhcnJpZXIoKTsKIAl9CiAKLQlteXJpMTBnZV9jaGVja19zdGF0YmxvY2sobWdwKTsKKwkvKiBPbmx5IHNsaWNlIDAgdXBkYXRlcyBzdGF0cyAqLworCWlmIChzcyA9PSBtZ3AtPnNzKQorCQlteXJpMTBnZV9jaGVja19zdGF0YmxvY2sobWdwKTsKIAogCXB1dF9iZTMyKGh0b25sKDMpLCBzcy0+aXJxX2NsYWltICsgMSk7CiAJcmV0dXJuIChJUlFfSEFORExFRCk7CkBAIC0xNjg2LDggKzE3MzYsOCBAQAogCSJ0eF9ib3VuZGFyeSIsICJXQyIsICJpcnEiLCAiTVNJIiwgIk1TSVgiLAogCSJyZWFkX2RtYV9id19NQnMiLCAid3JpdGVfZG1hX2J3X01CcyIsICJyZWFkX3dyaXRlX2RtYV9id19NQnMiLAogCSJzZXJpYWxfbnVtYmVyIiwgIndhdGNoZG9nX3Jlc2V0cyIsCi0jaWZkZWYgQ09ORklHX0RDQQotCSJkY2FfY2FwYWJsZSIsICJkY2FfZW5hYmxlZCIsCisjaWYgKGRlZmluZWQgQ09ORklHX0RDQSkgfHwgKGRlZmluZWQgQ09ORklHX0RDQV9NT0RVTEUpCisJImRjYV9jYXBhYmxlX2Zpcm13YXJlIiwgImRjYV9kZXZpY2VfcHJlc2VudCIsCiAjZW5kaWYKIAkibGlua19jaGFuZ2VzIiwgImxpbmtfdXAiLCAiZHJvcHBlZF9saW5rX292ZXJmbG93IiwKIAkiZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkIiwKQEAgLTE3NjUsNyArMTgxNSw3IEBACiAJZGF0YVtpKytdID0gKHVuc2lnbmVkIGludCltZ3AtPnJlYWRfd3JpdGVfZG1hOwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbWdwLT5zZXJpYWxfbnVtYmVyOwogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpbWdwLT53YXRjaGRvZ19yZXNldHM7Ci0jaWZkZWYgQ09ORklHX0RDQQorI2lmIChkZWZpbmVkIENPTkZJR19EQ0EpIHx8IChkZWZpbmVkIENPTkZJR19EQ0FfTU9EVUxFKQogCWRhdGFbaSsrXSA9ICh1bnNpZ25lZCBpbnQpKG1ncC0+c3NbMF0uZGNhX3RhZyAhPSBOVUxMKTsKIAlkYXRhW2krK10gPSAodW5zaWduZWQgaW50KShtZ3AtPmRjYV9lbmFibGVkKTsKICNlbmRpZgpAQCAtMTg4Myw2ICsxOTMzLDcgQEAKIAkvKiBlbnN1cmUgcmVxX2xpc3QgZW50cmllcyBhcmUgYWxpZ25lZCB0byA4IGJ5dGVzICovCiAJc3MtPnR4LnJlcV9saXN0ID0gKHN0cnVjdCBtY3Bfa3JlcV9ldGhlcl9zZW5kICopCiAJICAgIEFMSUdOKCh1bnNpZ25lZCBsb25nKXNzLT50eC5yZXFfYnl0ZXMsIDgpOworCXNzLT50eC5xdWV1ZV9hY3RpdmUgPSAwOwogCiAJYnl0ZXMgPSByeF9yaW5nX2VudHJpZXMgKiBzaXplb2YoKnNzLT5yeF9zbWFsbC5zaGFkb3cpOwogCXNzLT5yeF9zbWFsbC5zaGFkb3cgPSBremFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKQEAgLTIyMDAsMTEgKzIyNTEsMTQgQEAKIAlpbnQgc3RhdHVzOwogCiAJc3MgPSAmbWdwLT5zc1tzbGljZV07Ci0JY21kLmRhdGEwID0gMDsJCS8qIHNpbmdsZSBzbGljZSBmb3Igbm93ICovCi0Jc3RhdHVzID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLCBNWEdFRldfQ01EX0dFVF9TRU5EX09GRlNFVCwgJmNtZCwgMCk7Ci0Jc3MtPnR4LmxhbmFpID0gKHN0cnVjdCBtY3Bfa3JlcV9ldGhlcl9zZW5kIF9faW9tZW0gKikKLQkgICAgKG1ncC0+c3JhbSArIGNtZC5kYXRhMCk7Ci0KKwlzdGF0dXMgPSAwOworCWlmIChzbGljZSA9PSAwIHx8IChtZ3AtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzID4gMSkpIHsKKwkJY21kLmRhdGEwID0gc2xpY2U7CisJCXN0YXR1cyA9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9HRVRfU0VORF9PRkZTRVQsCisJCQkJCSAgICZjbWQsIDApOworCQlzcy0+dHgubGFuYWkgPSAoc3RydWN0IG1jcF9rcmVxX2V0aGVyX3NlbmQgX19pb21lbSAqKQorCQkgICAgKG1ncC0+c3JhbSArIGNtZC5kYXRhMCk7CisJfQogCWNtZC5kYXRhMCA9IHNsaWNlOwogCXN0YXR1cyB8PSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19DTURfR0VUX1NNQUxMX1JYX09GRlNFVCwKIAkJCQkgICAgJmNtZCwgMCk7CkBAIC0yMjE2LDYgKzIyNzAsMTAgQEAKIAlzcy0+cnhfYmlnLmxhbmFpID0gKHN0cnVjdCBtY3Bfa3JlcV9ldGhlcl9yZWN2IF9faW9tZW0gKikKIAkgICAgKG1ncC0+c3JhbSArIGNtZC5kYXRhMCk7CiAKKwlzcy0+dHguc2VuZF9nbyA9IChfX2lvbWVtIF9fYmUzMiAqKQorCSAgICAobWdwLT5zcmFtICsgTVhHRUZXX0VUSF9TRU5EX0dPICsgNjQgKiBzbGljZSk7CisJc3MtPnR4LnNlbmRfc3RvcCA9IChfX2lvbWVtIF9fYmUzMiAqKQorCSAgICAobWdwLT5zcmFtICsgTVhHRUZXX0VUSF9TRU5EX1NUT1AgKyA2NCAqIHNsaWNlKTsKIAlyZXR1cm4gc3RhdHVzOwogCiB9CkBAIC0yMjI5LDcgKzIyODcsNyBAQAogCXNzID0gJm1ncC0+c3Nbc2xpY2VdOwogCWNtZC5kYXRhMCA9IE1ZUkkxMEdFX0xPV1BBUlRfVE9fVTMyKHNzLT5md19zdGF0c19idXMpOwogCWNtZC5kYXRhMSA9IE1ZUkkxMEdFX0hJR0hQQVJUX1RPX1UzMihzcy0+Zndfc3RhdHNfYnVzKTsKLQljbWQuZGF0YTIgPSBzaXplb2Yoc3RydWN0IG1jcF9pcnFfZGF0YSk7CisJY21kLmRhdGEyID0gc2l6ZW9mKHN0cnVjdCBtY3BfaXJxX2RhdGEpIHwgKHNsaWNlIDw8IDE2KTsKIAlzdGF0dXMgPSBteXJpMTBnZV9zZW5kX2NtZChtZ3AsIE1YR0VGV19DTURfU0VUX1NUQVRTX0RNQV9WMiwgJmNtZCwgMCk7CiAJaWYgKHN0YXR1cyA9PSAtRU5PU1lTKSB7CiAJCWRtYV9hZGRyX3QgYnVzID0gc3MtPmZ3X3N0YXRzX2J1czsKQEAgLTIyNzAsNyArMjMyOCw5IEBACiAKIAlpZiAobWdwLT5udW1fc2xpY2VzID4gMSkgewogCQljbWQuZGF0YTAgPSBtZ3AtPm51bV9zbGljZXM7Ci0JCWNtZC5kYXRhMSA9IDE7CS8qIHVzZSBNU0ktWCAqLworCQljbWQuZGF0YTEgPSBNWEdFRldfU0xJQ0VfSU5UUl9NT0RFX09ORV9QRVJfU0xJQ0U7CisJCWlmIChtZ3AtPmRldi0+cmVhbF9udW1fdHhfcXVldWVzID4gMSkKKwkJCWNtZC5kYXRhMSB8PSBNWEdFRldfU0xJQ0VfRU5BQkxFX01VTFRJUExFX1RYX1FVRVVFUzsKIAkJc3RhdHVzID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLCBNWEdFRldfQ01EX0VOQUJMRV9SU1NfUVVFVUVTLAogCQkJCQkgICAmY21kLCAwKTsKIAkJaWYgKHN0YXR1cyAhPSAwKSB7CkBAIC0yMjkxLDYgKzIzNTEsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIm15cmkxMGdlOiAlczogZmFpbGVkIHRvIHNldHVwIHJzcyB0YWJsZXNcbiIsCiAJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gYWJvcnRfd2l0aF9ub3RoaW5nOwogCQl9CiAKIAkJLyoganVzdCBlbmFibGUgYW4gaWRlbnRpdHkgbWFwcGluZyAqLwpAQCAtMjM2MSw3ICsyNDIyLDExIEBACiAJCXN0YXR1cyA9IG15cmkxMGdlX2FsbG9jYXRlX3JpbmdzKHNzKTsKIAkJaWYgKHN0YXR1cyAhPSAwKQogCQkJZ290byBhYm9ydF93aXRoX3JpbmdzOwotCQlpZiAoc2xpY2UgPT0gMCkKKworCQkvKiBvbmx5IGZpcm13YXJlIHdoaWNoIHN1cHBvcnRzIG11bHRpcGxlIFRYIHF1ZXVlcworCQkgKiBzdXBwb3J0cyBzZXR0aW5nIHVwIHRoZSB0eCBzdGF0cyBvbiBub24temVybworCQkgKiBzbGljZXMgKi8KKwkJaWYgKHNsaWNlID09IDAgfHwgbWdwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA+IDEpCiAJCQlzdGF0dXMgPSBteXJpMTBnZV9zZXRfc3RhdHMobWdwLCBzbGljZSk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMjQyNyw3ICsyNDkyLDggQEAKIAltZ3AtPnJ1bm5pbmcgPSBNWVJJMTBHRV9FVEhfUlVOTklORzsKIAltZ3AtPndhdGNoZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXlyaTEwZ2Vfd2F0Y2hkb2dfdGltZW91dCAqIEhaOwogCWFkZF90aW1lcigmbWdwLT53YXRjaGRvZ190aW1lcik7Ci0JbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhkZXYpOworCiAJcmV0dXJuIDA7CiAKIGFib3J0X3dpdGhfcmluZ3M6CkBAIC0yNDYwLDcgKzI1MjYsOCBAQAogCQluYXBpX2Rpc2FibGUoJm1ncC0+c3NbaV0ubmFwaSk7CiAJfQogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGRldik7CiAJb2xkX2Rvd25fY250ID0gbWdwLT5kb3duX2NudDsKIAltYigpOwogCXN0YXR1cyA9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9FVEhFUk5FVF9ET1dOLCAmY21kLCAwKTsKQEAgLTI1NjUsMTggKzI2MzIsMjEgQEAKIAlzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfc2VuZCAqcmVxOwogCXN0cnVjdCBteXJpMTBnZV90eF9idWYgKnR4OwogCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqbmV0ZGV2X3F1ZXVlOwogCWRtYV9hZGRyX3QgYnVzOwogCXUzMiBsb3c7CiAJX19iZTMyIGhpZ2hfc3dhcHBlZDsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCWludCBpZHgsIGxhc3RfaWR4LCBhdmFpbCwgZnJhZ19jbnQsIGZyYWdfaWR4LCBjb3VudCwgbXNzLCBtYXhfc2VnbWVudHM7Ci0JdTE2IHBzZXVkb19oZHJfb2Zmc2V0LCBja3N1bV9vZmZzZXQ7CisJdTE2IHBzZXVkb19oZHJfb2Zmc2V0LCBja3N1bV9vZmZzZXQsIHF1ZXVlOwogCWludCBjdW1fbGVuLCBzZWdsZW4sIGJvdW5kYXJ5LCByZG1hX2NvdW50OwogCXU4IGZsYWdzLCBvZGRfZmxhZzsKIAotCS8qIGFsd2F5cyB0cmFuc21pdCB0aHJvdWdoIHNsb3QgMCAqLwotCXNzID0gbWdwLT5zczsKKwlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXNzID0gJm1ncC0+c3NbcXVldWVdOworCW5ldGRldl9xdWV1ZSA9IG5ldGRldl9nZXRfdHhfcXVldWUobWdwLT5kZXYsIHF1ZXVlKTsKIAl0eCA9ICZzcy0+dHg7CisKIGFnYWluOgogCXJlcSA9IHR4LT5yZXFfbGlzdDsKIAlhdmFpbCA9IHR4LT5tYXNrIC0gMSAtICh0eC0+cmVxIC0gdHgtPmRvbmUpOwpAQCAtMjU5Miw3ICsyNjYyLDcgQEAKIAlpZiAoKHVubGlrZWx5KGF2YWlsIDwgbWF4X3NlZ21lbnRzKSkpIHsKIAkJLyogd2UgYXJlIG91dCBvZiB0cmFuc21pdCByZXNvdXJjZXMgKi8KIAkJdHgtPnN0b3BfcXVldWUrKzsKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl9xdWV1ZSk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMjc4NSwxMCArMjg1NSwxNiBAQAogCWlkeCA9ICgoY291bnQgLSAxKSArIHR4LT5yZXEpICYgdHgtPm1hc2s7CiAJdHgtPmluZm9baWR4XS5sYXN0ID0gMTsKIAlteXJpMTBnZV9zdWJtaXRfcmVxKHR4LCB0eC0+cmVxX2xpc3QsIGNvdW50KTsKKwkvKiBpZiB1c2luZyBtdWx0aXBsZSB0eCBxdWV1ZXMsIG1ha2Ugc3VyZSBOSUMgcG9sbHMgdGhlCisJICogY3VycmVudCBzbGljZSAqLworCWlmICgobWdwLT5kZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcyA+IDEpICYmIHR4LT5xdWV1ZV9hY3RpdmUgPT0gMCkgeworCQl0eC0+cXVldWVfYWN0aXZlID0gMTsKKwkJcHV0X2JlMzIoaHRvbmwoMSksIHR4LT5zZW5kX2dvKTsKKwl9CiAJdHgtPnBrdF9zdGFydCsrOwogCWlmICgoYXZhaWwgLSBjb3VudCkgPCBNWEdFRldfTUFYX1NFTkRfREVTQykgewogCQl0eC0+c3RvcF9xdWV1ZSsrOwotCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCW5ldGlmX3R4X3N0b3BfcXVldWUobmV0ZGV2X3F1ZXVlKTsKIAl9CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJcmV0dXJuIDA7CkBAIC0zMzY2LDIwICszNDQyLDIxIEBACiAJCWZvciAoaSA9IDA7IGkgPCBtZ3AtPm51bV9zbGljZXM7IGkrKykgewogCQkJdHggPSAmbWdwLT5zc1tpXS50eDsKIAkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAibXlyaTEwZ2U6ICVzOiAoJWQpOiAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJCSAgICAgICBtZ3AtPmRldi0+bmFtZSwgaSwgdHgtPnJlcSwgdHgtPmRvbmUsCi0JCQkgICAgICAgdHgtPnBrdF9zdGFydCwgdHgtPnBrdF9kb25lLAorCQkJICAgICAgICJteXJpMTBnZTogJXM6ICglZCk6ICVkICVkICVkICVkICVkICVkXG4iLAorCQkJICAgICAgIG1ncC0+ZGV2LT5uYW1lLCBpLCB0eC0+cXVldWVfYWN0aXZlLCB0eC0+cmVxLAorCQkJICAgICAgIHR4LT5kb25lLCB0eC0+cGt0X3N0YXJ0LCB0eC0+cGt0X2RvbmUsCiAJCQkgICAgICAgKGludCludG9obChtZ3AtPnNzW2ldLmZ3X3N0YXRzLT4KIAkJCQkJICBzZW5kX2RvbmVfY291bnQpKTsKIAkJCW1zbGVlcCgyMDAwKTsKIAkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAibXlyaTEwZ2U6ICVzOiAoJWQpOiAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJCSAgICAgICBtZ3AtPmRldi0+bmFtZSwgaSwgdHgtPnJlcSwgdHgtPmRvbmUsCi0JCQkgICAgICAgdHgtPnBrdF9zdGFydCwgdHgtPnBrdF9kb25lLAorCQkJICAgICAgICJteXJpMTBnZTogJXM6ICglZCk6ICVkICVkICVkICVkICVkICVkXG4iLAorCQkJICAgICAgIG1ncC0+ZGV2LT5uYW1lLCBpLCB0eC0+cXVldWVfYWN0aXZlLCB0eC0+cmVxLAorCQkJICAgICAgIHR4LT5kb25lLCB0eC0+cGt0X3N0YXJ0LCB0eC0+cGt0X2RvbmUsCiAJCQkgICAgICAgKGludCludG9obChtZ3AtPnNzW2ldLmZ3X3N0YXRzLT4KIAkJCQkJICBzZW5kX2RvbmVfY291bnQpKTsKIAkJfQogCX0KKwogCXJ0bmxfbG9jaygpOwogCW15cmkxMGdlX2Nsb3NlKG1ncC0+ZGV2KTsKIAlzdGF0dXMgPSBteXJpMTBnZV9sb2FkX2Zpcm13YXJlKG1ncCwgMSk7CkBAIC0zNDM0LDEwICszNTExLDE0IEBACiAJCQkvKiBuaWMgc2VlbXMgbGlrZSBpdCBtaWdodCBiZSBzdHVjay4uICovCiAJCQlpZiAocnhfcGF1c2VfY250ICE9IG1ncC0+d2F0Y2hkb2dfcGF1c2UpIHsKIAkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJteXJpMTBnZSAlczoiCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICJteXJpMTBnZSAlcyBzbGljZSAlZDoiCiAJCQkJCSAgICAgICAiVFggcGF1c2VkLCBjaGVjayBsaW5rIHBhcnRuZXJcbiIsCi0JCQkJCSAgICAgICBtZ3AtPmRldi0+bmFtZSk7CisJCQkJCSAgICAgICBtZ3AtPmRldi0+bmFtZSwgaSk7CiAJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIm15cmkxMGdlICVzIHNsaWNlICVkIHN0dWNrOiIsCisJCQkJICAgICAgIG1ncC0+ZGV2LT5uYW1lLCBpKTsKIAkJCQlyZXNldF9uZWVkZWQgPSAxOwogCQkJfQogCQl9CkBAIC0zNjUyLDcgKzM3MzMsNyBAQAogCWludCBzdGF0dXMgPSAtRU5YSU87CiAJaW50IGRhY19lbmFibGVkOwogCi0JbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCptZ3ApKTsKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoKm1ncCksIE1ZUkkxMEdFX01BWF9TTElDRVMpOwogCWlmIChuZXRkZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTM3NTcsMTMgKzM4MzgsMTMgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIHNsaWNlIHN0YXRlXG4iKTsKIAkJZ290byBhYm9ydF93aXRoX2Zpcm13YXJlOwogCX0KLQorCW5ldGRldi0+cmVhbF9udW1fdHhfcXVldWVzID0gbWdwLT5udW1fc2xpY2VzOwogCXN0YXR1cyA9IG15cmkxMGdlX3Jlc2V0KG1ncCk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCByZXNldFxuIik7CiAJCWdvdG8gYWJvcnRfd2l0aF9zbGljZXM7CiAJfQotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiAoZGVmaW5lZCBDT05GSUdfRENBKSB8fCAoZGVmaW5lZCBDT05GSUdfRENBX01PRFVMRSkKIAlteXJpMTBnZV9zZXR1cF9kY2EobWdwKTsKICNlbmRpZgogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBtZ3ApOwpAQCAtMzc4MSw2ICszODYyLDcgQEAKIAluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG15cmkxMGdlX3NldF9tdWx0aWNhc3RfbGlzdDsKIAluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9IG15cmkxMGdlX3NldF9tYWNfYWRkcmVzczsKIAluZXRkZXYtPmZlYXR1cmVzID0gbWdwLT5mZWF0dXJlczsKKwogCWlmIChkYWNfZW5hYmxlZCkKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKQEAgLTM4NjYsNyArMzk0OCw3IEBACiAJbmV0ZGV2ID0gbWdwLT5kZXY7CiAJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiAoZGVmaW5lZCBDT05GSUdfRENBKSB8fCAoZGVmaW5lZCBDT05GSUdfRENBX01PRFVMRSkKIAlteXJpMTBnZV90ZWFyZG93bl9kY2EobWdwKTsKICNlbmRpZgogCW15cmkxMGdlX2R1bW15X3JkbWEobWdwLCAwKTsKQEAgLTM5MTEsNyArMzk5Myw3IEBACiAjZW5kaWYKIH07CiAKLSNpZmRlZiBDT05GSUdfRENBCisjaWYgKGRlZmluZWQgQ09ORklHX0RDQSkgfHwgKGRlZmluZWQgQ09ORklHX0RDQV9NT0RVTEUpCiBzdGF0aWMgaW50CiBteXJpMTBnZV9ub3RpZnlfZGNhKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnApCiB7CkBAIC0zOTM2LDE2ICs0MDE4LDE3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFZlcnNpb24gJXNcbiIsIG15cmkxMGdlX2RyaXZlci5uYW1lLAogCSAgICAgICBNWVJJMTBHRV9WRVJTSU9OX1NUUik7CiAKLQlpZiAobXlyaTEwZ2VfcnNzX2hhc2ggPiBNWEdFRldfUlNTX0hBU0hfVFlQRV9TUkNfUE9SVCB8fAotCSAgICBteXJpMTBnZV9yc3NfaGFzaCA8IE1YR0VGV19SU1NfSEFTSF9UWVBFX0lQVjQpIHsKKwlpZiAobXlyaTEwZ2VfcnNzX2hhc2ggPiBNWEdFRldfUlNTX0hBU0hfVFlQRV9NQVgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiJXM6IElsbGVnYWwgcnNzaCBoYXNoIHR5cGUgJWQsIGRlZmF1bHRpbmcgdG8gc291cmNlIHBvcnRcbiIsCiAJCSAgICAgICBteXJpMTBnZV9kcml2ZXIubmFtZSwgbXlyaTEwZ2VfcnNzX2hhc2gpOwogCQlteXJpMTBnZV9yc3NfaGFzaCA9IE1YR0VGV19SU1NfSEFTSF9UWVBFX1NSQ19QT1JUOwogCX0KLSNpZmRlZiBDT05GSUdfRENBCisjaWYgKGRlZmluZWQgQ09ORklHX0RDQSkgfHwgKGRlZmluZWQgQ09ORklHX0RDQV9NT0RVTEUpCiAJZGNhX3JlZ2lzdGVyX25vdGlmeSgmbXlyaTEwZ2VfZGNhX25vdGlmaWVyKTsKICNlbmRpZgorCWlmIChteXJpMTBnZV9tYXhfc2xpY2VzID4gTVlSSTEwR0VfTUFYX1NMSUNFUykKKwkJbXlyaTEwZ2VfbWF4X3NsaWNlcyA9IE1ZUkkxMEdFX01BWF9TTElDRVM7CiAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXlyaTEwZ2VfZHJpdmVyKTsKIH0KQEAgLTM5NTQsNyArNDAzNyw3IEBACiAKIHN0YXRpYyBfX2V4aXQgdm9pZCBteXJpMTBnZV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotI2lmZGVmIENPTkZJR19EQ0EKKyNpZiAoZGVmaW5lZCBDT05GSUdfRENBKSB8fCAoZGVmaW5lZCBDT05GSUdfRENBX01PRFVMRSkKIAlkY2FfdW5yZWdpc3Rlcl9ub3RpZnkoJm15cmkxMGdlX2RjYV9ub3RpZmllcik7CiAjZW5kaWYKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm15cmkxMGdlX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCmluZGV4IDY1NmEyNjAuLjNhZDc1ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCkBAIC0xLDYgKzEsNiBAQAogLyogbXlyaV9zYnVzLmM6IE15cmlDT00gTXlyaU5FVCBTQlVTIGNhcmQgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDYsIDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CkBAIC0yMiw2ICsyMiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgpAQCAtMzMsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CkBAIC0yNDMsNyArMjQ1LDggQEAKIAkJCXUzMiBkbWFfYWRkcjsKIAogCQkJZG1hX2FkZHIgPSBzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkcik7Ci0JCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZtcC0+bXlyaV9vcC0+ZGV2LCBkbWFfYWRkciwKKwkJCQkJIFJYX0FMTE9DX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKG1wLT5yeF9za2JzW2ldKTsKIAkJCW1wLT5yeF9za2JzW2ldID0gTlVMTDsKIAkJfQpAQCAtMjU5LDcgKzI2Miw5IEBACiAJCQl1MzIgZG1hX2FkZHI7CiAKIAkJCWRtYV9hZGRyID0gc2J1c19yZWFkbCgmdHhkLT5teXJpX2dhdGhlcnNbMF0uYWRkcik7Ci0JCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgKHNrYi0+bGVuICsgMykgJiB+MywgU0JVU19ETUFfVE9ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwgZG1hX2FkZHIsCisJCQkJCSAoc2tiLT5sZW4gKyAzKSAmIH4zLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKG1wLT50eF9za2JzW2ldKTsKIAkJCW1wLT50eF9za2JzW2ldID0gTlVMTDsKIAkJfQpAQCAtMjg4LDcgKzI5Myw5IEBACiAJCXNrYi0+ZGV2ID0gZGV2OwogCQlza2JfcHV0KHNrYiwgUlhfQUxMT0NfU0laRSk7CiAKLQkJZG1hX2FkZHIgPSBzYnVzX21hcF9zaW5nbGUobXAtPm15cmlfc2Rldiwgc2tiLT5kYXRhLCBSWF9BTExPQ19TSVpFLCBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwKKwkJCQkJICBza2ItPmRhdGEsIFJYX0FMTE9DX1NJWkUsCisJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKIAkJc2J1c193cml0ZWwoZG1hX2FkZHIsICZyeGRbaV0ubXlyaV9zY2F0dGVyc1swXS5hZGRyKTsKIAkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZFtpXS5teXJpX3NjYXR0ZXJzWzBdLmxlbik7CiAJCXNidXNfd3JpdGVsKGksICZyeGRbaV0uY3R4KTsKQEAgLTM0NCw3ICszNTEsOCBAQAogCiAJCURUWCgoIlNLQlslZF0gIiwgZW50cnkpKTsKIAkJZG1hX2FkZHIgPSBzYnVzX3JlYWRsKCZzcS0+bXlyaV90eGRbZW50cnldLm15cmlfZ2F0aGVyc1swXS5hZGRyKTsKLQkJc2J1c191bm1hcF9zaW5nbGUobXAtPm15cmlfc2RldiwgZG1hX2FkZHIsIHNrYi0+bGVuLCBTQlVTX0RNQV9UT0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoJm1wLT5teXJpX29wLT5kZXYsIGRtYV9hZGRyLAorCQkJCSBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJbXAtPnR4X3NrYnNbZW50cnldID0gTlVMTDsKIAkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CkBAIC00MjMsOSArNDMxLDkgQEAKIAogCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLwogCQlEUlgoKCJyeGRbJWRdOiAlcCBsZW5bJWRdIGNzdW1bJTA4eF0gIiwgZW50cnksIHJ4ZCwgbGVuLCBjc3VtKSk7Ci0JCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobXAtPm15cmlfc2RldiwKLQkJCQkJICAgICBzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCi0JCQkJCSAgICAgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZtcC0+bXlyaV9vcC0+ZGV2LAorCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCisJCQkJCVJYX0FMTE9DX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJCWlmIChsZW4gPCAoRVRIX0hMRU4gKyBNWVJJX1BBRF9MRU4pIHx8IChza2ItPmRhdGFbMF0gIT0gTVlSSV9QQURfTEVOKSkgewogCQkJRFJYKCgiRVJST1JbIikpOwogCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTQ0MiwxMCArNDUwLDEwIEBACiAJCQlkcm9wcysrOwogCQkJRFJYKCgiRFJPUCAiKSk7CiAJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXAtPm15cmlfc2RldiwKLQkJCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCi0JCQkJCQkJUlhfQUxMT0NfU0laRSwKLQkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZtcC0+bXlyaV9vcC0+ZGV2LAorCQkJCQkJICAgc2J1c19yZWFkbCgmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpLAorCQkJCQkJICAgUlhfQUxMT0NfU0laRSwKKwkJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlzYnVzX3dyaXRlbChSWF9BTExPQ19TSVpFLCAmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmxlbik7CiAJCQlzYnVzX3dyaXRlbChpbmRleCwgJnJ4ZC0+Y3R4KTsKIAkJCXNidXNfd3JpdGVsKDEsICZyeGQtPm51bV9zZyk7CkBAIC00NjQsMTcgKzQ3MiwxNyBAQAogCQkJCURSWCgoInNrYl9hbGxvYyhGQUlMRUQpICIpKTsKIAkJCQlnb3RvIGRyb3BfaXQ7CiAJCQl9Ci0JCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAotCQkJCQkgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKLQkJCQkJICBSWF9BTExPQ19TSVpFLAotCQkJCQkgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwKKwkJCQkJIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKKwkJCQkJIFJYX0FMTE9DX1NJWkUsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCQkJbXAtPnJ4X3NrYnNbaW5kZXhdID0gbmV3X3NrYjsKIAkJCW5ld19za2ItPmRldiA9IGRldjsKIAkJCXNrYl9wdXQobmV3X3NrYiwgUlhfQUxMT0NfU0laRSk7Ci0JCQlkbWFfYWRkciA9IHNidXNfbWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAotCQkJCQkJICAgbmV3X3NrYi0+ZGF0YSwKLQkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCi0JCQkJCQkgICBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJm1wLT5teXJpX29wLT5kZXYsCisJCQkJCQkgIG5ld19za2ItPmRhdGEsCisJCQkJCQkgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlzYnVzX3dyaXRlbChkbWFfYWRkciwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKTsKIAkJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGQtPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKIAkJCXNidXNfd3JpdGVsKGluZGV4LCAmcnhkLT5jdHgpOwpAQCAtNTAwLDEwICs1MDgsMTAgQEAKIAogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCiAJCQlEUlgoKCJyZXVzZSAiKSk7Ci0JCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG1wLT5teXJpX3NkZXYsCi0JCQkJCQkJc2J1c19yZWFkbCgmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpLAotCQkJCQkJCVJYX0FMTE9DX1NJWkUsCi0JCQkJCQkJU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmbXAtPm15cmlfb3AtPmRldiwKKwkJCQkJCSAgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKKwkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOwogCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7CiAJCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOwpAQCAtNjUyLDcgKzY2MCw4IEBACiAJCXNidXNfd3JpdGV3KChza2ItPmRhdGFbNF0gPDwgOCkgfCBza2ItPmRhdGFbNV0sICZ0eGQtPmFkZHJbM10pOwogCX0KIAotCWRtYV9hZGRyID0gc2J1c19tYXBfc2luZ2xlKG1wLT5teXJpX3NkZXYsIHNrYi0+ZGF0YSwgbGVuLCBTQlVTX0RNQV9UT0RFVklDRSk7CisJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmbXAtPm15cmlfb3AtPmRldiwgc2tiLT5kYXRhLAorCQkJCSAgbGVuLCBETUFfVE9fREVWSUNFKTsKIAlzYnVzX3dyaXRlbChkbWFfYWRkciwgJnR4ZC0+bXlyaV9nYXRoZXJzWzBdLmFkZHIpOwogCXNidXNfd3JpdGVsKGxlbiwgJnR4ZC0+bXlyaV9nYXRoZXJzWzBdLmxlbik7CiAJc2J1c193cml0ZWwoMSwgJnR4ZC0+bnVtX3NnKTsKQEAgLTg5MSwzMCArOTAwLDMwIEBACiAJLmNhY2hlX3VwZGF0ZQk9IG15cmlfaGVhZGVyX2NhY2hlX3VwZGF0ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG15cmlfZXRoZXJfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteXJpX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0YXRpYyBpbnQgbnVtOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG15cmlfZXRoICptcDsKLQl1bnNpZ25lZCBjaGFyIHByb3BfYnVmWzMyXTsKLQlpbnQgaTsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wOworCWNvbnN0IHZvaWQgKnByb3A7CisJc3RhdGljIGludCBudW07CisJaW50IGksIGxlbjsKIAotCURFVCgoIm15cmlfZXRoZXJfaW5pdCglcCwlZCk6XG4iLCBzZGV2LCBudW0pKTsKKwlERVQoKCJteXJpX2V0aGVyX2luaXQoJXAsJWQpOlxuIiwgb3AsIG51bSkpOwogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbXlyaV9ldGgpKTsKLQogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQogCQlwcmludGsodmVyc2lvbik7CiAKLQlTRVRfTkVUREVWX0RFVihkZXYsICZzZGV2LT5vZmRldi5kZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJm9wLT5kZXYpOwogCi0JbXAgPSAoc3RydWN0IG15cmlfZXRoICopIGRldi0+cHJpdjsKKwltcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3Bpbl9sb2NrX2luaXQoJm1wLT5pcnFfbG9jayk7Ci0JbXAtPm15cmlfc2RldiA9IHNkZXY7CisJbXAtPm15cmlfb3AgPSBvcDsKIAogCS8qIENsZWFuIG91dCBza2IgYXJyYXlzLiAqLwogCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFICsgMSk7IGkrKykKQEAgLTkyNCw1NSArOTMzLDQ0IEBACiAJCW1wLT50eF9za2JzW2ldID0gTlVMTDsKIAogCS8qIEZpcnN0IGNoZWNrIGZvciBFRVBST00gaW5mb3JtYXRpb24uICovCi0JaSA9IHByb21fZ2V0cHJvcGVydHkoc2Rldi0+cHJvbV9ub2RlLCAibXlyaW5ldC1lZXByb20taW5mbyIsCi0JCQkgICAgIChjaGFyICopJm1wLT5lZXByb20sIHNpemVvZihzdHJ1Y3QgbXlyaV9lZXByb20pKTsKLQlERVQoKCJwcm9tX2dldHByb3AobXlyaW5ldC1lZXByb20taW5mbykgcmV0dXJucyAlZFxuIiwgaSkpOwotCWlmIChpID09IDAgfHwgaSA9PSAtMSkgeworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJteXJpbmV0LWVlcHJvbS1pbmZvIiwgJmxlbik7CisKKwlpZiAocHJvcCkKKwkJbWVtY3B5KCZtcC0+ZWVwcm9tLCBwcm9wLCBzaXplb2Yoc3RydWN0IG15cmlfZWVwcm9tKSk7CisJaWYgKCFwcm9wKSB7CiAJCS8qIE5vIGVlcHJvbSBwcm9wZXJ0eSwgbXVzdCBjb29rIHVwIHRoZSB2YWx1ZXMgb3Vyc2VsdmVzLiAqLwogCQlERVQoKCJObyBFRVBST006ICIpKTsKIAkJbXAtPmVlcHJvbS5idXNfdHlwZSA9IEJVU19UWVBFX1NCVVM7Ci0JCW1wLT5lZXByb20uY3B1dmVycyA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5wcm9tX25vZGUsImNwdV92ZXJzaW9uIiwwKTsKLQkJbXAtPmVlcHJvbS5jdmFsID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwiY2xvY2tfdmFsdWUiLDApOwotCQltcC0+ZWVwcm9tLnJhbXN6ID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwic3JhbV9zaXplIiwwKTsKLQkJREVUKCgiY3B1dmVyc1slZF0gY3ZhbFslZF0gcmFtc3pbJWRdXG4iLCBtcC0+ZWVwcm9tLmNwdXZlcnMsCi0JCSAgICAgbXAtPmVlcHJvbS5jdmFsLCBtcC0+ZWVwcm9tLnJhbXN6KSk7Ci0JCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPT0gMCkgewotCQkJREVUKCgiRUVQUk9NOiBjcHV2ZXJzIHdhcyB6ZXJvLCBzZXR0aW5nIHRvICUwNHhcbiIsQ1BVVkVSU18yXzMpKTsKKwkJbXAtPmVlcHJvbS5jcHV2ZXJzID0KKwkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImNwdV92ZXJzaW9uIiwgMCk7CisJCW1wLT5lZXByb20uY3ZhbCA9CisJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9ja192YWx1ZSIsIDApOworCQltcC0+ZWVwcm9tLnJhbXN6ID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic3JhbV9zaXplIiwgMCk7CisJCWlmICghbXAtPmVlcHJvbS5jcHV2ZXJzKQogCQkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gQ1BVVkVSU18yXzM7Ci0JCX0KLQkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA8IENQVVZFUlNfM18wKSB7Ci0JCQlERVQoKCJFRVBST006IGNwdXZlcnMgPCBDUFVWRVJTXzNfMCwgY2xvY2t2YWwgc2V0IHRvIHplcm8uXG4iKSk7CisJCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPCBDUFVWRVJTXzNfMCkKIAkJCW1wLT5lZXByb20uY3ZhbCA9IDA7Ci0JCX0KLQkJaWYgKG1wLT5lZXByb20ucmFtc3ogPT0gMCkgewotCQkJREVUKCgiRUVQUk9NOiByYW1zeiA9PSAwLCBzZXR0aW5nIHRvIDEyOGtcbiIpKTsKKwkJaWYgKCFtcC0+ZWVwcm9tLnJhbXN6KQogCQkJbXAtPmVlcHJvbS5yYW1zeiA9ICgxMjggKiAxMDI0KTsKLQkJfQotCQlpID0gcHJvbV9nZXRwcm9wZXJ0eShzZGV2LT5wcm9tX25vZGUsICJteXJpbmV0LWJvYXJkLWlkIiwKLQkJCQkgICAgICZwcm9wX2J1ZlswXSwgMTApOwotCQlERVQoKCJFRVBST006IHByb21fZ2V0cHJvcChteXJpbmV0LWJvYXJkLWlkKSByZXR1cm5zICVkXG4iLCBpKSk7Ci0JCWlmICgoaSAhPSAwKSAmJiAoaSAhPSAtMSkpCi0JCQltZW1jcHkoJm1wLT5lZXByb20uaWRbMF0sICZwcm9wX2J1ZlswXSwgNik7CisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm15cmluZXQtYm9hcmQtaWQiLCAmbGVuKTsKKwkJaWYgKHByb3ApCisJCQltZW1jcHkoJm1wLT5lZXByb20uaWRbMF0sIHByb3AsIDYpOwogCQllbHNlCiAJCQlzZXRfYm9hcmRpZF9mcm9tX2lkcHJvbShtcCwgbnVtKTsKLQkJaSA9IHByb21fZ2V0cHJvcGVydHkoc2Rldi0+cHJvbV9ub2RlLCAiZnBnYV92ZXJzaW9uIiwKLQkJCQkgICAgICZtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCAzMik7Ci0JCURFVCgoIkVFUFJPTTogcHJvbV9nZXRwcm9wKGZwZ2FfdmVyc2lvbikgcmV0dXJucyAlZFxuIiwgaSkpOwotCQlpZiAoaSA9PSAwIHx8IGkgPT0gLTEpCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImZwZ2FfdmVyc2lvbiIsICZsZW4pOworCQlpZiAocHJvcCkKKwkJCW1lbWNweSgmbXAtPmVlcHJvbS5mdmVyc1swXSwgcHJvcCwgMzIpOworCQllbHNlCiAJCQltZW1zZXQoJm1wLT5lZXByb20uZnZlcnNbMF0sIDAsIDMyKTsKIAogCQlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzID09IENQVVZFUlNfNF8xKSB7Ci0JCQlERVQoKCJFRVBST006IGNwdXZlcnMgQ1BVVkVSU180XzEsICIpKTsKLQkJCWlmIChtcC0+ZWVwcm9tLnJhbXN6ID09ICgxMjggKiAxMDI0KSkgewotCQkJCURFVCgoInJhbXNpemUgMTI4aywgc2V0dGluZyB0byAyNTZrLCAiKSk7CisJCQlpZiAobXAtPmVlcHJvbS5yYW1zeiA9PSAoMTI4ICogMTAyNCkpCiAJCQkJbXAtPmVlcHJvbS5yYW1zeiA9ICgyNTYgKiAxMDI0KTsKLQkJCX0KLQkJCWlmICgobXAtPmVlcHJvbS5jdmFsPT0weDQwNDE0MDQxKXx8KG1wLT5lZXByb20uY3ZhbD09MHg5MDQ0OTA0NCkpewotCQkJCURFVCgoImNoYW5naW5nIGN2YWwgZnJvbSAlMDh4IHRvICUwOHggIiwKLQkJCQkgICAgIG1wLT5lZXByb20uY3ZhbCwgMHg1MGU0NTBlNCkpOworCQkJaWYgKChtcC0+ZWVwcm9tLmN2YWwgPT0gMHg0MDQxNDA0MSkgfHwKKwkJCSAgICAobXAtPmVlcHJvbS5jdmFsID09IDB4OTA0NDkwNDQpKQogCQkJCW1wLT5lZXByb20uY3ZhbCA9IDB4NTBlNDUwZTQ7Ci0JCQl9Ci0JCQlERVQoKCJcbiIpKTsKIAkJfQogCX0KICNpZmRlZiBERUJVR19ERVRFQ1QKQEAgLTk5MSw4ICs5ODksOCBAQAogCQkgKiBYWFggb25seSBhIHZhbGlkIHZlcnNpb24gZm9yIFBDSSBjYXJkcz8gIEFzayBmZWxkeS4uLgogCQkgKi8KIAkJREVUKCgiTWFwcGluZyByZWdzIGZvciBjcHV2ZXJzIDwgQ1BVVkVSU180XzBcbiIpKTsKLQkJbXAtPnJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJCQltcC0+cmVnX3NpemUsICJNeXJpQ09NIFJlZ3MiKTsKKwkJbXAtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgICAgbXAtPnJlZ19zaXplLCAiTXlyaUNPTSBSZWdzIik7CiAJCWlmICghbXAtPnJlZ3MpIHsKIAkJCXByaW50aygiTXlyaUNPTTogQ2Fubm90IG1hcCBNeXJpQ09NIHJlZ2lzdGVycy5cbiIpOwogCQkJZ290byBlcnI7CkBAIC0xMDAxLDEzICs5OTksMTIgQEAKIAkJbXAtPmxyZWdzID0gbXAtPmxhbmFpICsgKDB4MTAwMDAgKiAyKTsKIAl9IGVsc2UgewogCQlERVQoKCJNYXBwaW5nIHJlZ3MgZm9yIGNwdXZlcnMgPj0gQ1BVVkVSU180XzBcbiIpKTsKLQkJbXAtPmNyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJIFBBR0VfU0laRSwgIk15cmlDT00gQ29udHJvbCBSZWdzIik7Ci0JCW1wLT5scmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sICgyNTYgKiAxMDI0KSwKKwkJbXAtPmNyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJCSAgICAgICBQQUdFX1NJWkUsICJNeXJpQ09NIENvbnRyb2wgUmVncyIpOworCQltcC0+bHJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sICgyNTYgKiAxMDI0KSwKIAkJCQkJIFBBR0VfU0laRSwgIk15cmlDT00gTEFOQUkgUmVncyIpOwotCQltcC0+bGFuYWkgPQotCQkJc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgKDUxMiAqIDEwMjQpLAotCQkJCSAgICAgbXAtPmVlcHJvbS5yYW1zeiwgIk15cmlDT00gU1JBTSIpOworCQltcC0+bGFuYWkgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sICg1MTIgKiAxMDI0KSwKKwkJCQkgICAgICAgbXAtPmVlcHJvbS5yYW1zeiwgIk15cmlDT00gU1JBTSIpOwogCX0KIAlERVQoKCJSZWdpc3RlcnMgbWFwcGVkOiBjcmVnc1slcF0gbHJlZ3NbJXBdIGxhbmFpWyVwXVxuIiwKIAkgICAgIG1wLT5jcmVncywgbXAtPmxyZWdzLCBtcC0+bGFuYWkpKTsKQEAgLTEwMzksMTYgKzEwMzYsMTUgQEAKIAlteXJpX3Jlc2V0X29uKG1wLT5jcmVncyk7CiAKIAkvKiBHZXQgdGhlIHN1cHBvcnRlZCBEVk1BIGJ1cnN0IHNpemVzIGZyb20gb3VyIFNCVVMuICovCi0JbXAtPm15cmlfYnVyc3RzID0gcHJvbV9nZXRpbnRkZWZhdWx0KG1wLT5teXJpX3NkZXYtPmJ1cy0+cHJvbV9ub2RlLAotCQkJCQkgICAgICJidXJzdC1zaXplcyIsIDB4MDApOwotCi0JaWYgKCFzYnVzX2Nhbl9idXJzdDY0KHNkZXYpKQorCW1wLT5teXJpX2J1cnN0cyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcC0+cGFyZW50LAorCQkJCQkJImJ1cnN0LXNpemVzIiwgMHgwMCk7CisJaWYgKCFzYnVzX2Nhbl9idXJzdDY0KCkpCiAJCW1wLT5teXJpX2J1cnN0cyAmPSB+KERNQV9CVVJTVDY0KTsKIAogCURFVCgoIk1ZUkkgYnVyc3RzICUwMnhcbiIsIG1wLT5teXJpX2J1cnN0cykpOwogCiAJLyogRW5jb2RlIFNCVVMgaW50ZXJydXB0IGxldmVsIGluIHNlY29uZCBjb250cm9sIHJlZ2lzdGVyLiAqLwotCWkgPSBwcm9tX2dldGludChzZGV2LT5wcm9tX25vZGUsICJpbnRlcnJ1cHRzIik7CisJaSA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImludGVycnVwdHMiLCAwKTsKIAlpZiAoaSA9PSAwKQogCQlpID0gNDsKIAlERVQoKCJwcm9tX2dldGludChpbnRlcnJ1cHRzKT09JWQsIGlycWx2bCBzZXQgdG8gJTA0eFxuIiwKQEAgLTEwNjMsNyArMTA1OSw3IEBACiAJZGV2LT50eF90aW1lb3V0ID0gJm15cmlfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZteXJpX3NldF9tdWx0aWNhc3Q7Ci0JZGV2LT5pcnEgPSBzZGV2LT5pcnFzWzBdOworCWRldi0+aXJxID0gb3AtPmlycXNbMF07CiAKIAkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlciBub3cuICovCiAJREVUKCgiUmVxdWVzdGluZyBNWVJJY29tIElSUSBsaW5lLlxuIikpOwpAQCAtMTA4OCw3ICsxMDg0LDcgQEAKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5vZmRldi5kZXYsIG1wKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIG1wKTsKIAogCW51bSsrOwogCkBAIC0xMTA1LDM5ICsxMTAxLDMxIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLQotc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBteXJpX3NidXNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7Ci0KLQlyZXR1cm4gbXlyaV9ldGhlcl9pbml0KHNkZXYpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBteXJpX3NidXNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IG15cmlfZXRoICptcCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBtcC0+ZGV2OwogCi0JdW5yZWdpc3Rlcl9uZXRkZXZpY2UobmV0X2Rldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CiAKIAlmcmVlX2lycShuZXRfZGV2LT5pcnEsIG5ldF9kZXYpOwogCiAJaWYgKG1wLT5lZXByb20uY3B1dmVycyA8IENQVVZFUlNfNF8wKSB7Ci0JCXNidXNfaW91bm1hcChtcC0+cmVncywgbXAtPnJlZ19zaXplKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBtcC0+cmVncywgbXAtPnJlZ19zaXplKTsKIAl9IGVsc2UgewotCQlzYnVzX2lvdW5tYXAobXAtPmNyZWdzLCBQQUdFX1NJWkUpOwotCQlzYnVzX2lvdW5tYXAobXAtPmxyZWdzLCAoMjU2ICogMTAyNCkpOwotCQlzYnVzX2lvdW5tYXAobXAtPmxhbmFpLCAoNTEyICogMTAyNCkpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIG1wLT5jcmVncywgUEFHRV9TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBtcC0+bHJlZ3MsICgyNTYgKiAxMDI0KSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgbXAtPmxhbmFpLCAoNTEyICogMTAyNCkpOwogCX0KIAogCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwogCi0JZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBteXJpX3NidXNfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG15cmlfc2J1c19tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiTVlSSUNPTSxtbGFuYWkiLAogCX0sCkBAIC0xMTU4LDcgKzExNDYsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBteXJpX3NidXNfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJm15cmlfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZteXJpX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXlyaV9zYnVzX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKaW5kZXggNWQ5M2ZjYy4uZmYzNjNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKQEAgLTI4OCw3ICsyODgsNyBAQAogCXN0cnVjdCBteXJpX2VlcHJvbQkJZWVwcm9tOwkJLyogTG9jYWwgY29weSBvZiBFRVBST00uICAgICAgKi8KIAl1bnNpZ25lZCBpbnQJCQlyZWdfc2l6ZTsJLyogU2l6ZSBvZiByZWdpc3RlciBzcGFjZS4gICAgKi8KIAl1bnNpZ25lZCBpbnQJCQlzaG1lbV9iYXNlOwkvKiBPZmZzZXQgdG8gc2hhcmVkIHJhbS4gICAgICAqLwotCXN0cnVjdCBzYnVzX2RldgkJCSpteXJpX3NkZXY7CS8qIE91ciBTQlVTIGRldmljZSBzdHJ1Y3QuICAgICovCisJc3RydWN0IG9mX2RldmljZQkJKm15cmlfb3A7CS8qIE91ciBPRiBkZXZpY2Ugc3RydWN0LiAgICAqLwogfTsKIAogLyogV2UgdXNlIHRoaXMgdG8gYWNxdWlyZSByZWNlaXZlIHNrYidzIHRoYXQgd2UgY2FuIERNQSBkaXJlY3RseSBpbnRvLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCmluZGV4IGIyMzhlZDAuLmY3ZmEzOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYworKysgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogc3RhdGljIHZvaWQgY2hlY2tfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogc3RhdGljIHZvaWQgZHVtcF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5zX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGFsbG9jX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCByZWZpbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC05MjAsNyArOTIwLDcgQEAKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKIAlkZXYtPmNoYW5nZV9tdHUgPSAmbmF0c2VtaV9jaGFuZ2VfbXR1OwogCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOwotCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OworCWRldi0+dHhfdGltZW91dCA9ICZuc190eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTE4NzUsNyArMTg3NSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuc190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CkBAIC0zMjMyLDcgKzMyMzIsNyBAQAogICogc3VzcGVuZC9yZXN1bWUgc3luY2hyb25pemF0aW9uOgogICogZW50cnkgcG9pbnRzOgogICogICBuZXRkZXZfb3BlbiwgbmV0ZGV2X2Nsb3NlLCBuZXRkZXZfaW9jdGwsIHNldF9yeF9tb2RlLCBpbnRyX2hhbmRsZXIsCi0gKiAgIHN0YXJ0X3R4LCB0eF90aW1lb3V0CisgKiAgIHN0YXJ0X3R4LCBuc190eF90aW1lb3V0CiAgKgogICogTm8gZnVuY3Rpb24gYWNjZXNzZXMgdGhlIGhhcmR3YXJlIHdpdGhvdXQgY2hlY2tpbmcgbnAtPmhhbmRzX29mZi4KICAqCXRoZSBjaGVjayBvY2N1cnMgdW5kZXIgc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUuYyBiL2RyaXZlcnMvbmV0L25lLmMKaW5kZXggZmEzY2VjYS4uZWI2ODFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUuYworKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC02NCw2ICs2NCwyNSBAQAogCiAvKiBEbyB3ZSBzdXBwb3J0IGNsb25lcyB0aGF0IGRvbid0IGFkaGVyZSB0byAxNCwxNSBvZiB0aGUgU0Fwcm9tID8gKi8KICNkZWZpbmUgU1VQUE9SVF9ORV9CQURfQ0xPTkVTCisvKiAweGJhZCA9IGJhZCBzaWcgb3Igbm8gcmVzZXQgYWNrICovCisjZGVmaW5lIEJBRCAweGJhZAorCisjZGVmaW5lIE1BWF9ORV9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgTkUgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfbmVbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9ORV9DQVJEU107CitzdGF0aWMgaW50IGJhZFtNQVhfTkVfQ0FSRFNdOworCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGJhZCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSxyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGJhZCwgIkFjY2VwdCBjYXJkKHMpIHdpdGggYmFkIHNpZ25hdHVyZXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkUxMDAwL05FMjAwMCBJU0EvUG5QIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2VuZGlmIC8qIE1PRFVMRSAqLwogCiAvKiBEbyB3ZSBwZXJmb3JtIGV4dHJhIHNhbml0eSBjaGVja3Mgb24gc3R1ZmYgPyAqLwogLyogI2RlZmluZSBORV9TQU5JVFlfQ0hFQ0sgKi8KQEAgLTc0LDYgKzkzLDEwIEBACiAvKiBEbyB3ZSBoYXZlIGEgbm9uIHN0ZC4gYW1vdW50IG9mIG1lbW9yeT8gKGluIHVuaXRzIG9mIDI1NiBieXRlIHBhZ2VzKSAqLwogLyogI2RlZmluZSBQQUNLRVRCVUZfTUVNU0laRQkweDQwICovCiAKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgbm8gSVNBIGF1dG9wcm9iZSB0YWtlcyBwbGFjZS4gV2UgY2FuJ3QgZ3VhcmFudGVlCit0aGF0IHRoZSBuZTJrIHByb2JlIGlzIHRoZSBsYXN0IDgzOTAgYmFzZWQgcHJvYmUgdG8gdGFrZSBwbGFjZSAoYXMgaXQKK2lzIGF0IGJvb3QpIGFuZCBzbyB0aGUgcHJvYmUgd2lsbCBnZXQgY29uZnVzZWQgYnkgYW55IG90aGVyIDgzOTAgY2FyZHMuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZCBhbnl3YXkuICovCiAjaWYgIWRlZmluZWQoTU9EVUxFKSAmJiAoZGVmaW5lZChDT05GSUdfSVNBKSB8fCBkZWZpbmVkKENPTkZJR19NMzJSKSkKIC8qIERvIHdlIG5lZWQgYSBwb3J0bGlzdCBmb3IgdGhlIElTQSBhdXRvLXByb2JlID8gKi8KICNkZWZpbmUgTkVFRFNfUE9SVExJU1QKQEAgLTE5Miw4ICsyMTUsMTMgQEAKICNlbmRpZgogCiAJLyogRmlyc3QgY2hlY2sgYW55IHN1cHBsaWVkIGkvbyBsb2NhdGlvbnMuIFVzZXIga25vd3MgYmVzdC4gPGNvdWdoPiAqLwotCWlmIChiYXNlX2FkZHIgPiAweDFmZikJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLwotCQlyZXR1cm4gbmVfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpIHsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlpbnQgcmV0ID0gbmVfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5lLmM6IE5vIE5FKjAwMCBjYXJkIGZvdW5kIGF0ICIKKwkJCQkiaS9vID0gJSNseFxuIiwgYmFzZV9hZGRyKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtMjE0LDI4ICsyNDIsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi0jaWZuZGVmIE1PRFVMRQotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbmVfcHJvYmUoaW50IHVuaXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpcF9uZXRkZXYoKTsKLQlpbnQgZXJyOwotCi0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0Jc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOwotCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7Ci0KLQllcnIgPSBkb19uZV9wcm9iZShkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCXJldHVybiBkZXY7Ci1vdXQ6Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgX19pbml0IG5lX3Byb2JlX2lzYXBucChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBpOwpAQCAtMzI5LDcgKzMzNSw3IEBACiAJICAgd2l0aCBhbiBvdGhlcndpc2UgdW51c2VkIGRldi0+bWVtX2VuZCB2YWx1ZSBvZiAiMHhCQUQiIHdpbGwKIAkgICBjYXVzZSB0aGUgZHJpdmVyIHRvIHNraXAgdGhlc2UgcGFydHMgb2YgdGhlIHByb2JlLiAqLwogCi0JYmFkX2NhcmQgPSAoKGRldi0+YmFzZV9hZGRyICE9IDApICYmIChkZXYtPm1lbV9lbmQgPT0gMHhiYWQpKTsKKwliYWRfY2FyZCA9ICgoZGV2LT5iYXNlX2FkZHIgIT0gMCkgJiYgKGRldi0+bWVtX2VuZCA9PSBCQUQpKTsKIAogCS8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCiAKQEAgLTgwNiw0NiArODEyLDk1IEBACiBzdGF0aWMgaW50IF9faW5pdCBuZV9kcnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIsIHRoaXNfZGV2ID0gcGRldi0+aWQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGVyciwgaXJxOwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKCFyZXMgfHwgaXJxIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7CiAKIAlkZXYgPSBhbGxvY19laXBfbmV0ZGV2KCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PTUVNOwotCWRldi0+aXJxID0gaXJxOwotCWRldi0+YmFzZV9hZGRyID0gcmVzLT5zdGFydDsKKworCS8qIG5lLmMgZG9lc24ndCBwb3B1bGF0ZSByZXNvdXJjZXMgaW4gcGxhdGZvcm1fZGV2aWNlLCBidXQKKwkgKiByYnR4NDkyN19uZV9pbml0IGFuZCByYnR4NDkzOF9uZV9pbml0IGRvIHJlZ2lzdGVyIGRldmljZXMKKwkgKiB3aXRoIHJlc291cmNlcy4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJaWYgKHJlcykgeworCQlkZXYtPmJhc2VfYWRkciA9IHJlcy0+c3RhcnQ7CisJCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwl9IGVsc2UgeworCQlpZiAodGhpc19kZXYgPCAwIHx8IHRoaXNfZGV2ID49IE1BWF9ORV9DQVJEUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPm1lbV9lbmQgPSBiYWRbdGhpc19kZXZdOworCX0KIAllcnIgPSBkb19uZV9wcm9iZShkZXYpOwogCWlmIChlcnIpIHsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8qIFVwZGF0ZSB3aXRoIGFueSB2YWx1ZXMgZm91bmQgYnkgcHJvYmluZywgZG9uJ3QgdXBkYXRlIGlmCisJICogcmVzb3VyY2VzIHdlcmUgc3BlY2lmaWVkLgorCSAqLworCWlmICghcmVzKSB7CisJCWlvW3RoaXNfZGV2XSA9IGRldi0+YmFzZV9hZGRyOworCQlpcnFbdGhpc19kZXZdID0gZGV2LT5pcnE7CisJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBuZV9kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IG5lX2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOwotCWZyZWVfbmV0ZGV2KGRldik7CisJaWYgKGRldikgeworCQlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWlmIChpZGV2KQorCQkJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisJCS8qIENhcmVmdWwgbmVfZHJ2X3JlbW92ZSBjYW4gYmUgY2FsbGVkIHR3aWNlLCBvbmNlIGZyb20KKwkJICogdGhlIHBsYXRmb3JtX2RyaXZlci5yZW1vdmUgYW5kIGFnYWluIHdoZW4gdGhlCisJCSAqIHBsYXRmb3JtX2RldmljZSBpcyBiZWluZyByZW1vdmVkLgorCQkgKi8KKwkJZWlfc3RhdHVzLnByaXYgPSAwOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FX0lPX0VYVEVOVCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KIAlyZXR1cm4gMDsKIH0KIAorLyogUmVtb3ZlIHVudXNlZCBkZXZpY2VzIG9yIGFsbCBpZiB0cnVlLiAqLworc3RhdGljIHZvaWQgbmVfbG9vcF9ybV91bnJlZyhpbnQgYWxsKQoreworCWludCB0aGlzX2RldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlwZGV2ID0gcGRldl9uZVt0aGlzX2Rldl07CisJCS8qIE5vIG5ldHdvcmsgZGV2aWNlID09IHVudXNlZCAqLworCQlpZiAocGRldiAmJiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpIHx8IGFsbCkpIHsKKwkJCW5lX2Rydl9yZW1vdmUocGRldik7CisJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJCXBkZXZfbmVbdGhpc19kZXZdID0gTlVMTDsKKwkJfQorCX0KK30KKwogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBuZV9kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gKHN0cnVjdCBwbnBfZGV2ICopZWlfc3RhdHVzLnByaXY7CiAJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJaWYgKGlkZXYpCisJCQlwbnBfc3RvcF9kZXYoaWRldik7CisJfQogCXJldHVybiAwOwogfQogCkBAIC04NTQsNiArOTA5LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gKHN0cnVjdCBwbnBfZGV2ICopZWlfc3RhdHVzLnByaXY7CisJCWlmIChpZGV2KQorCQkJcG5wX3N0YXJ0X2RldihpZGV2KTsKIAkJbmVfcmVzZXRfODM5MChkZXYpOwogCQlOUzgzOTBwX2luaXQoZGV2LCAxKTsKIAkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwpAQCAtODY2LDcgKzkyNCw3IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbmVfZHJpdmVyID0gewotCS5yZW1vdmUJCT0gX19leGl0X3AobmVfZHJ2X3JlbW92ZSksCisJLnJlbW92ZQkJPSBuZV9kcnZfcmVtb3ZlLAogCS5zdXNwZW5kCT0gbmVfZHJ2X3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBuZV9kcnZfcmVzdW1lLAogCS5kcml2ZXIJCT0gewpAQCAtODc1LDkxICs5MzMsOTYgQEAKIAl9LAogfTsKIAorc3RhdGljIHZvaWQgX19pbml0IG5lX2FkZF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKHBkZXZfbmVbdGhpc19kZXZdKQorCQkJY29udGludWU7CisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKAorCQkJRFJWX05BTUUsIHRoaXNfZGV2LCBOVUxMLCAwKTsKKwkJaWYgKElTX0VSUihwZGV2KSkKKwkJCWNvbnRpbnVlOworCQlwZGV2X25lW3RoaXNfZGV2XSA9IHBkZXY7CisJfQorfQorCisjaWZkZWYgTU9EVUxFCitpbnQgX19pbml0IGluaXRfbW9kdWxlKCkKK3sKKwlpbnQgcmV0dmFsOworCW5lX2FkZF9kZXZpY2VzKCk7CisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZuZV9kcml2ZXIsIG5lX2Rydl9wcm9iZSk7CisJaWYgKHJldHZhbCkgeworCQlpZiAoaW9bMF0gPT0gMCkKKwkJCXByaW50ayhLRVJOX05PVElDRSAibmUuYzogWW91IG11c3Qgc3VwcGx5IFwiaW89MHhOTk5cIiIKKwkJCQkiIHZhbHVlKHMpIGZvciBJU0EgY2FyZHMuXG4iKTsKKwkJbmVfbG9vcF9ybV91bnJlZygxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBVbnJlZ2lzdGVyIHVudXNlZCBwbGF0Zm9ybV9kZXZpY2VzLiAqLworCW5lX2xvb3Bfcm1fdW5yZWcoMCk7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbHNlIC8qIE1PRFVMRSAqLwogc3RhdGljIGludCBfX2luaXQgbmVfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm5lX2RyaXZlciwgbmVfZHJ2X3Byb2JlKTsKKwlpbnQgcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZuZV9kcml2ZXIsIG5lX2Rydl9wcm9iZSk7CisKKwkvKiBVbnJlZ2lzdGVyIHVudXNlZCBwbGF0Zm9ybV9kZXZpY2VzLiAqLworCW5lX2xvb3Bfcm1fdW5yZWcoMCk7CisJcmV0dXJuIHJldHZhbDsKIH0KK21vZHVsZV9pbml0KG5lX2luaXQpOworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuZV9wcm9iZShpbnQgdW5pdCkKK3sKKwlpbnQgdGhpc19kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIEZpbmQgYW4gZW1wdHkgc2xvdCwgdGhhdCBpcyBubyBuZXRfZGV2aWNlIGFuZCB6ZXJvIGlvIHBvcnQuICovCisJdGhpc19kZXYgPSAwOworCXdoaWxlICgocGRldl9uZVt0aGlzX2Rldl0gJiYgcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldl9uZVt0aGlzX2Rldl0pKSB8fAorCQlpb1t0aGlzX2Rldl0pIHsKKwkJaWYgKCsrdGhpc19kZXYgPT0gTUFYX05FX0NBUkRTKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJLyogR2V0IGlycSwgaW8gZnJvbSBrZXJuZWwgY29tbWFuZCBsaW5lICovCisJZGV2ID0gYWxsb2NfZWlwX25ldGRldigpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJaW9bdGhpc19kZXZdID0gZGV2LT5iYXNlX2FkZHI7CisJaXJxW3RoaXNfZGV2XSA9IGRldi0+aXJxOworCWJhZFt0aGlzX2Rldl0gPSBkZXYtPm1lbV9lbmQ7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJbmVfYWRkX2RldmljZXMoKTsKKworCS8qIHJldHVybiB0aGUgZmlyc3QgZGV2aWNlIGZvdW5kICovCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChwZGV2X25lW3RoaXNfZGV2XSkgeworCQkJZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldl9uZVt0aGlzX2Rldl0pOworCQkJaWYgKGRldikKKwkJCQlyZXR1cm4gZGV2OworCQl9CisJfQorCisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZV9leGl0KHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm5lX2RyaXZlcik7CisJbmVfbG9vcF9ybV91bnJlZygxKTsKIH0KLQotI2lmZGVmIE1PRFVMRQotI2RlZmluZSBNQVhfTkVfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIE5FIGNhcmRzIHBlciBtb2R1bGUgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X25lW01BWF9ORV9DQVJEU107Ci1zdGF0aWMgaW50IGlvW01BWF9ORV9DQVJEU107Ci1zdGF0aWMgaW50IGlycVtNQVhfTkVfQ0FSRFNdOwotc3RhdGljIGludCBiYWRbTUFYX05FX0NBUkRTXTsJLyogMHhiYWQgPSBiYWQgc2lnIG9yIG5vIHJlc2V0IGFjayAqLwotCi1tb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOwotbW9kdWxlX3BhcmFtX2FycmF5KGJhZCwgaW50LCBOVUxMLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSxyZXF1aXJlZCIpOwotTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGJhZCwgIkFjY2VwdCBjYXJkKHMpIHdpdGggYmFkIHNpZ25hdHVyZXMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTkUxMDAwL05FMjAwMCBJU0EvUG5QIEV0aGVybmV0IGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKiBUaGlzIGlzIHNldCB1cCBzbyB0aGF0IG5vIElTQSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UuIFdlIGNhbid0IGd1YXJhbnRlZQotdGhhdCB0aGUgbmUyayBwcm9iZSBpcyB0aGUgbGFzdCA4MzkwIGJhc2VkIHByb2JlIHRvIHRha2UgcGxhY2UgKGFzIGl0Ci1pcyBhdCBib290KSBhbmQgc28gdGhlIHByb2JlIHdpbGwgZ2V0IGNvbmZ1c2VkIGJ5IGFueSBvdGhlciA4MzkwIGNhcmRzLgotSVNBIGRldmljZSBhdXRvcHJvYmVzIG9uIGEgcnVubmluZyBtYWNoaW5lIGFyZSBub3QgcmVjb21tZW5kZWQgYW55d2F5LiAqLwotCi1pbnQgX19pbml0IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7Ci0JaW50IHBsYXRfZm91bmQgPSAhbmVfaW5pdCgpOwotCi0JZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laXBfbmV0ZGV2KCk7Ci0JCWlmICghZGV2KQotCQkJYnJlYWs7Ci0JCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKLQkJZGV2LT5tZW1fZW5kID0gYmFkW3RoaXNfZGV2XTsKLQkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07Ci0JCWlmIChkb19uZV9wcm9iZShkZXYpID09IDApIHsKLQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZyZWVfbmV0ZGV2KGRldik7Ci0JCWlmIChmb3VuZCB8fCBwbGF0X2ZvdW5kKQotCQkJYnJlYWs7Ci0JCWlmIChpb1t0aGlzX2Rldl0gIT0gMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5lLmM6IE5vIE5FKjAwMCBjYXJkIGZvdW5kIGF0IGkvbyA9ICUjeFxuIiwgaW9bdGhpc19kZXZdKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJuZS5jOiBZb3UgbXVzdCBzdXBwbHkgXCJpbz0weE5OTlwiIHZhbHVlKHMpIGZvciBJU0EgY2FyZHMuXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JaWYgKGZvdW5kIHx8IHBsYXRfZm91bmQpCi0JCXJldHVybiAwOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OwotCWlmIChpZGV2KQotCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKLX0KLQotdm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgdGhpc19kZXY7Ci0KLQluZV9leGl0KCk7Ci0JZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfbmVbdGhpc19kZXZdOwotCQlpZiAoZGV2KSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQkJY2xlYW51cF9jYXJkKGRldik7Ci0JCQlmcmVlX25ldGRldihkZXYpOwotCQl9Ci0JfQotfQotI2Vsc2UgLyogTU9EVUxFICovCi1tb2R1bGVfaW5pdChuZV9pbml0KTsKIG1vZHVsZV9leGl0KG5lX2V4aXQpOwotI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYyBiL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKaW5kZXggM2Y5YWY3NS4uYjliZWQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eC1ldGguYworKysgYi9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogCQlpZiAoKHN0YXR1cyAmIElTUl9DT05fSEkpIHx8IChzdGF0dXMgJiBJU1JfSU5EX0hJKSkKIAkJCXByaW50aygiJXM6IHVuZXhwZWN0ZWQgc3RhdHVzOiAweCUwOHhcbiIsCi0JCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCiAJCWZpbGxfbGV2ZWwgPQogCQkgICAgcmVhZGwoTkVUWF9QRklGT19GSUxMX0xFVkVMKElORF9GSUZPX1BPUlRfTE8ocHJpdi0+aWQpKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaAppbmRleCAyNDRhYjQ5Li5mOGU2MDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKQEAgLTc0Miw3ICs3NDIsNyBAQAogCX0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBEUFJJTlRLKGtsZXZlbCwgZm10LCBhcmdzLi4uKQlkbyB7IFwKLQlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIF9fRlVOQ1RJT05fXyxcCisJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBfX2Z1bmNfXyxcCiAJCShhZGFwdGVyICE9IE5VTEwgJiYgYWRhcHRlci0+bmV0ZGV2ICE9IE5VTEwpID8gXAogCQlhZGFwdGVyLT5uZXRkZXYtPm5hbWUgOiBOVUxMLCBcCiAJCSMjIGFyZ3MpOyB9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggMDA4ZmQ2Ni4uNmVmM2YwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpAQCAtNzcsMTggKzc3LDE4IEBACiAKIC8qICBQQ0kgRGV2aWNlIElEIFRhYmxlICAqLwogI2RlZmluZSBFTlRSWShkZXZpY2UpIFwKLQl7UENJX0RFVklDRSgweDQwNDAsIChkZXZpY2UpKSwgXAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTkVUWEVOLCAoZGV2aWNlKSksIFwKIAkuY2xhc3MgPSBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAuY2xhc3NfbWFzayA9IH4wfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbmV0eGVuX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0gewotCUVOVFJZKDB4MDAwMSksCi0JRU5UUlkoMHgwMDAyKSwKLQlFTlRSWSgweDAwMDMpLAotCUVOVFJZKDB4MDAwNCksCi0JRU5UUlkoMHgwMDA1KSwKLQlFTlRSWSgweDAwMjQpLAotCUVOVFJZKDB4MDAyNSksCi0JRU5UUlkoMHgwMTAwKSwKKwlFTlRSWShQQ0lfREVWSUNFX0lEX05YMjAzMV8xMEdYU1IpLAorCUVOVFJZKFBDSV9ERVZJQ0VfSURfTlgyMDMxXzEwR0NYNCksCisJRU5UUlkoUENJX0RFVklDRV9JRF9OWDIwMzFfNEdDVSksCisJRU5UUlkoUENJX0RFVklDRV9JRF9OWDIwMzFfSU1FWiksCisJRU5UUlkoUENJX0RFVklDRV9JRF9OWDIwMzFfSE1FWiksCisJRU5UUlkoUENJX0RFVklDRV9JRF9OWDIwMzFfWEdfTUdNVCksCisJRU5UUlkoUENJX0RFVklDRV9JRF9OWDIwMzFfWEdfTUdNVDIpLAorCUVOVFJZKFBDSV9ERVZJQ0VfSURfTlgzMDMxKSwKIAl7MCx9CiB9OwogCkBAIC0yNDEsNyArMjQxLDcgQEAKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzX1JFRl9RRzoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzRfR0I6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM180X0dCX01NOgotCQlhZGFwdGVyLT5tc2l4X3N1cHBvcnRlZCA9IDA7CisJCWFkYXB0ZXItPm1zaXhfc3VwcG9ydGVkID0gISF1c2VfbXNpX3g7CiAJCWFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50ID0gTUFYX1JDVl9ERVNDUklQVE9SU18xMEc7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaXUuYyBiL2RyaXZlcnMvbmV0L25pdS5jCmluZGV4IGU0NzY1YjcuLmViYzgxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25pdS5jCisrKyBiL2RyaXZlcnMvbmV0L25pdS5jCkBAIC01OTg0LDYgKzU5ODQsNTYgQEAKIAluaXVfZW5hYmxlX2ludGVycnVwdHMobnAsIDEpOwogfQogCitzdGF0aWMgdm9pZCBuaXVfcmVzZXRfYnVmZmVycyhzdHJ1Y3Qgbml1ICpucCkKK3sKKwlpbnQgaSwgaiwgaywgZXJyOworCisJaWYgKG5wLT5yeF9yaW5ncykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnAtPm51bV9yeF9yaW5nczsgaSsrKSB7CisJCQlzdHJ1Y3QgcnhfcmluZ19pbmZvICpycCA9ICZucC0+cnhfcmluZ3NbaV07CisKKwkJCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgTUFYX1JCUl9SSU5HX1NJWkU7IGorKykgeworCQkJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCQkJcGFnZSA9IHJwLT5yeGhhc2hbal07CisJCQkJd2hpbGUgKHBhZ2UpIHsKKwkJCQkJc3RydWN0IHBhZ2UgKm5leHQgPQorCQkJCQkJKHN0cnVjdCBwYWdlICopIHBhZ2UtPm1hcHBpbmc7CisJCQkJCXU2NCBiYXNlID0gcGFnZS0+aW5kZXg7CisJCQkJCWJhc2UgPSBiYXNlID4+IFJCUl9ERVNDUl9BRERSX1NISUZUOworCQkJCQlycC0+cmJyW2srK10gPSBjcHVfdG9fbGUzMihiYXNlKTsKKwkJCQkJcGFnZSA9IG5leHQ7CisJCQkJfQorCQkJfQorCQkJZm9yICg7IGsgPCBNQVhfUkJSX1JJTkdfU0laRTsgaysrKSB7CisJCQkJZXJyID0gbml1X3Jicl9hZGRfcGFnZShucCwgcnAsIEdGUF9BVE9NSUMsIGspOworCQkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcnAtPnJicl9pbmRleCA9IHJwLT5yYnJfdGFibGVfc2l6ZSAtIDE7CisJCQlycC0+cmNyX2luZGV4ID0gMDsKKwkJCXJwLT5yYnJfcGVuZGluZyA9IDA7CisJCQlycC0+cmJyX3JlZmlsbF9wZW5kaW5nID0gMDsKKwkJfQorCX0KKwlpZiAobnAtPnR4X3JpbmdzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBucC0+bnVtX3R4X3JpbmdzOyBpKyspIHsKKwkJCXN0cnVjdCB0eF9yaW5nX2luZm8gKnJwID0gJm5wLT50eF9yaW5nc1tpXTsKKworCQkJZm9yIChqID0gMDsgaiA8IE1BWF9UWF9SSU5HX1NJWkU7IGorKykgeworCQkJCWlmIChycC0+dHhfYnVmZnNbal0uc2tiKQorCQkJCQkodm9pZCkgcmVsZWFzZV90eF9wYWNrZXQobnAsIHJwLCBqKTsKKwkJCX0KKworCQkJcnAtPnBlbmRpbmcgPSBNQVhfVFhfUklOR19TSVpFOworCQkJcnAtPnByb2QgPSAwOworCQkJcnAtPmNvbnMgPSAwOworCQkJcnAtPndyYXBfYml0ID0gMDsKKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgbml1X3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBuaXUgKm5wID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuaXUsIHJlc2V0X3Rhc2spOwpAQCAtNjAwNiw2ICs2MDU2LDEyIEBACiAKIAluaXVfc3RvcF9odyhucCk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCisJbml1X3Jlc2V0X2J1ZmZlcnMobnApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisKIAllcnIgPSBuaXVfaW5pdF9odyhucCk7CiAJaWYgKCFlcnIpIHsKIAkJbnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CkBAIC05MDc0LDcgKzkxMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBuaXVfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG5pdV9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAibmV0d29yayIsCiAJCS5jb21wYXRpYmxlID0gIlNVTlcsbml1c2wiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwppbmRleCA1MzQ1MWMzLi4wYTU3NWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYworKysgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwpAQCAtMTE5LDcgKzExOSw3IEBACiAKICNpZmRlZiBORVREUlZfREVCVUcKIC8qIG5vdGU6IHByaW50cyBmdW5jdGlvbiBuYW1lIGZvciB5b3UgKi8KLSMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgX19mdW5jX18gLCAjIyBhcmdzKQogI2Vsc2UKICMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKICNlbmRpZgpAQCAtMTMwLDcgKzEzMCw3IEBACiAjICBkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKICAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAogICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLAlcCi0gICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CQlcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fZnVuY19fLF9fTElORV9fKTsJCVwKICAgICAgICAgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKaW5kZXggNzExMmZkNS4uMDhjNGRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTM1NSw5ICszNTUsMTAgQEAKIAlmb3IgKGkgPSBqID0gMDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKIAkJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOwogCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJCWlmIChpID09IDApCisJCQlicmVhazsKIAl9Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChpICE9IDApIHsKIAkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMzc3LDcgKzM3OCw3IEBACiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODg7Ci0JaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSB7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSAwKSB7CiAJCXBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQkJcGh5c19hZGRyW2ldID0gaHRvbnMobGUxNl90b19jcHUoYnVmW2ldKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCmluZGV4IDU0OWE2NDUuLmMyMzVjZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCkBAIC0xNSw3ICsxNSw3IEBACiAgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCiAgICAgRG9uYWxkIEJlY2tlciBtYXkgYmUgcmVhY2hlZCBhdCBiZWNrZXJAc2N5bGQuY29tCiAgICAgCi0gICAgVXBkYXRlZCBmb3IgMi41LnggYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAgICBVcGRhdGVkIGZvciAyLjUueCBieSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIApAQCAtMjc4LDkgKzI3OCwxMCBAQAogCWlmIChtdWx0aSAmJiAoaiAmIDB4ODApKSBjb250aW51ZTsKIAlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJaWYgKGkgPT0gMCkKKwkJYnJlYWs7CiAgICAgfQotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKIAlnb3RvIGZhaWxlZDsKICAgICB9CkBAIC0yOTUsNyArMjk2LDcgQEAKICAgICAvKiBUaGUgM2M1ODkgaGFzIGFuIGV4dHJhIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbiBpbmZvLCBpbmNsdWRpbmcKICAgICAgICB0aGUgaGFyZHdhcmUgYWRkcmVzcy4gIFRoZSAzYzU2MiBwdXRzIHRoZSBhZGRyZXNzIGluIHRoZSBDSVMuICovCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4ODsKLSAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IDApIHsKIAlwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCSAgICBwaHlzX2FkZHJbaV0gPSBodG9ucyhsZTE2X3RvX2NwdShidWZbaV0pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggNTJiZjExYi4uYjM3YTQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCWlmIChsaW5rLT5pby5OdW1Qb3J0czIgPiAwKSB7CiAJICAgIC8qIGZvciBtYXN0ZXIvc2xhdmUgbXVsdGlmdW5jdGlvbiBjYXJkcyAqLwogCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IAorCSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9CiAJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOwogCX0KICAgICB9IGVsc2UgewpAQCAtMjc2LDcgKzI3Niw4IEBACiAJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKIAkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gKGogXiAweDMwMCkgKyAweDEwOwogCSAgICByZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCSAgICBpZiAocmV0ID09IENTX1NVQ0NFU1MpIHJldHVybiByZXQ7CisJICAgIGlmIChyZXQgPT0gMCkKKwkJICAgIHJldHVybiByZXQ7CiAJfQogCXJldHVybiByZXQ7CiAgICAgfSBlbHNlIHsKQEAgLTI4NCw1OSArMjg1LDUwIEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGF4bmV0X2NvbmZpZ2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJaW50IGk7CisJY2lzdHBsX2lvX3QgKmlvID0gJmNmZy0+aW87CisKKwlpZiAoY2ZnLT5pbmRleCA9PSAwIHx8IGNmZy0+aW8ubndpbiA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBfZGV2LT5jb25mLkNvbmZpZ0luZGV4ID0gMHgwNTsKKwkvKiBGb3IgbXVsdGlmdW5jdGlvbiBjYXJkcywgYnkgY29udmVudGlvbiwgd2UgY29uZmlndXJlIHRoZQorCSAgIG5ldHdvcmsgZnVuY3Rpb24gd2l0aCB3aW5kb3cgMCwgYW5kIHNlcmlhbCB3aXRoIHdpbmRvdyAxICovCisJaWYgKGlvLT5ud2luID4gMSkgeworCQlpID0gKGlvLT53aW5bMV0ubGVuID4gaW8tPndpblswXS5sZW4pOworCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxLWldLmJhc2U7CisJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzEtaV0ubGVuOworCX0gZWxzZSB7CisJCWkgPSBwX2Rldi0+aW8uTnVtUG9ydHMyID0gMDsKKwl9CisJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5baV0uYmFzZTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpbltpXS5sZW47CisJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJaWYgKHBfZGV2LT5pby5OdW1Qb3J0czEgKyBwX2Rldi0+aW8uTnVtUG9ydHMyID49IDMyKQorCQlyZXR1cm4gdHJ5X2lvX3BvcnQocF9kZXYpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIHN0YXRpYyBpbnQgYXhuZXRfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICBpbnQgaSwgaiwgbGFzdF9yZXQsIGxhc3RfZm47Ci0gICAgdV9zaG9ydCBidWZbNjRdOwogICAgIERFQ0xBUkVfTUFDX0JVRihtYWMpOwogCiAgICAgREVCVUcoMCwgImF4bmV0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQogICAgIC8qIGRvbid0IHRydXN0IHRoZSBDSVMgb24gdGhpczsgTGlua3N5cyBnb3QgaXQgd3JvbmcgKi8KICAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAweDYzOwotCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICB3aGlsZSAobGFzdF9yZXQgPT0gQ1NfU1VDQ0VTUykgewotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7Ci0JY2lzdHBsX2lvX3QgKmlvID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5LmlvKTsKLQkKLQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDAgfHwKLQkJY2ZnLT5pbmRleCA9PSAwIHx8IGNmZy0+aW8ubndpbiA9PSAwKQotCSAgICBnb3RvIG5leHRfZW50cnk7Ci0JCi0JbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4MDU7Ci0JLyogRm9yIG11bHRpZnVuY3Rpb24gY2FyZHMsIGJ5IGNvbnZlbnRpb24sIHdlIGNvbmZpZ3VyZSB0aGUKLQkgICBuZXR3b3JrIGZ1bmN0aW9uIHdpdGggd2luZG93IDAsIGFuZCBzZXJpYWwgd2l0aCB3aW5kb3cgMSAqLwotCWlmIChpby0+bndpbiA+IDEpIHsKLQkgICAgaSA9IChpby0+d2luWzFdLmxlbiA+IGlvLT53aW5bMF0ubGVuKTsKLQkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxLWldLmJhc2U7Ci0JICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMS1pXS5sZW47Ci0JfSBlbHNlIHsKLQkgICAgaSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JfQotCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5baV0uYmFzZTsKLQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luW2ldLmxlbjsKLQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCWlmIChsaW5rLT5pby5OdW1Qb3J0czEgKyBsaW5rLT5pby5OdW1Qb3J0czIgPj0gMzIpIHsKLQkgICAgbGFzdF9yZXQgPSB0cnlfaW9fcG9ydChsaW5rKTsKLQkgICAgaWYgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIGJyZWFrOwotCX0KLSAgICBuZXh0X2VudHJ5OgotCWxhc3RfcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSk7Ci0gICAgfQotICAgIGlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7CisgICAgbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgYXhuZXRfY29uZmlnY2hlY2ssIE5VTEwpOworICAgIGlmIChsYXN0X3JldCAhPSAwKSB7CiAJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBsYXN0X3JldCk7CiAJZ290byBmYWlsZWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwppbmRleCBlYTk0MTRjNC4uODMxMDkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKQEAgLTI2MCwyMSArMjYwLDIxIEBACiAgICAgREVCVUcoMCwgImNvbTIwMDIwX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKICAgICBERUJVRygxLCJhcmNuZXQ6IGJhc2Vwb3J0MSBpcyAlWGhcbiIsIGxpbmstPmlvLkJhc2VQb3J0MSk7Ci0gICAgaSA9ICFDU19TVUNDRVNTOworICAgIGkgPSAtRU5PREVWOwogICAgIGlmICghbGluay0+aW8uQmFzZVBvcnQxKQogICAgIHsKIAlmb3IgKGlvYWRkciA9IDB4MTAwOyBpb2FkZHIgPCAweDQwMDsgaW9hZGRyICs9IDB4MTApCiAJewogCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CiAJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKQorCSAgICBpZiAoaSA9PSAwKQogCQlicmVhazsKIAl9CiAgICAgfQogICAgIGVsc2UKIAlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKICAgICAKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQorICAgIGlmIChpICE9IDApCiAgICAgewogCURFQlVHKDEsImFyY25ldDogcmVxdWVzdElPIGZhaWxlZCB0b3RhbGx5IVxuIik7CiAJZ290byBmYWlsZWQ7CkBAIC0yODcsNyArMjg3LDcgQEAKIAkgICBsaW5rLT5pcnEuQXNzaWduZWRJUlEsCiAJICAgbGluay0+aXJxLklSUUluZm8xLCBsaW5rLT5pcnEuSVJRSW5mbzIpOwogICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICBpZiAoaSAhPSAwKQogICAgIHsKIAlERUJVRygxLCJhcmNuZXQ6IHJlcXVlc3RJUlEgZmFpbGVkIHRvdGFsbHkhXG4iKTsKIAlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCmluZGV4IGE1NTBjOWIuLjY5ZDkxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwpAQCAtMzA5LDcgKzMwOSw4IEBACiAJICAgIHByaW50ayhLRVJOX05PVElDRSAiZm12ajE4eF9jczogb3V0IG9mIHJlc291cmNlIGZvciBzZXJpYWxcbiIpOwogCX0KIAlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCWlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9CkBAIC0zMjUsNyArMzI2LDcgQEAKICAgICBmb3IgKGlvYWRkciA9IDB4MzAwOyBpb2FkZHIgPCAweDNlMDsgaW9hZGRyICs9IDB4MjApIHsKIAlsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CiAJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQlpZiAocmV0ID09IENTX1NVQ0NFU1MpIHsKKwlpZiAocmV0ID09IDApIHsKIAkgICAgLyogY2FsY3VsYXRlIENvbmZpZ0luZGV4IHZhbHVlICovCiAJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAKIAkJKChsaW5rLT5pby5CYXNlUG9ydDEgJiAweDBmMCkgPj4gMykgfCAweDIyOwpAQCAtMzU2LDEyICszNTcsMTIgQEAKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IDApIHsKIAkvKiBZZXMsIEkgaGF2ZSBDSVNUUExfRlVOQ0UuIExldCdzIGNoZWNrIENJU1RQTF9NQU5GSUQgKi8KIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKIAlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwogCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZSgmdHVwbGUsICZwYXJzZSkpOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OwogCXN3aXRjaCAobGluay0+bWFuZl9pZCkgewogCWNhc2UgTUFORklEX1RESzoKQEAgLTQzMCwxMCArNDMxLDEwIEBACiAgICAgCWxpbmstPmlycS5BdHRyaWJ1dGVzID0KIAkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUR8SVJRX0hBTkRMRV9QUkVTRU5UOwogCXJldCA9IG1mY190cnlfaW9fcG9ydChsaW5rKTsKLQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIGdvdG8gY3NfZmFpbGVkOworCWlmIChyZXQgIT0gMCkgZ290byBjc19mYWlsZWQ7CiAgICAgfSBlbHNlIGlmIChjYXJkdHlwZSA9PSBVTkdFUk1BTk4pIHsKIAlyZXQgPSB1bmdlcm1hbm5fdHJ5X2lvX3BvcnQobGluayk7Ci0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSBnb3RvIGNzX2ZhaWxlZDsKKwlpZiAocmV0ICE9IDApIGdvdG8gY3NfZmFpbGVkOwogICAgIH0gZWxzZSB7IAogCUNTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSk7CiAgICAgfQpAQCAtNTY1LDcgKzU2Niw3IEBACiAgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDA7CiAgICAgcmVxLkFjY2Vzc1NwZWVkID0gMDsKICAgICBpID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLCAmcmVxLCAmbGluay0+d2luKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisgICAgaWYgKGkgIT0gMCkgewogCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RXaW5kb3csIGkpOwogCXJldHVybiAtMTsKICAgICB9CkBAIC01OTksNyArNjAwLDcgQEAKIAogICAgIGlvdW5tYXAoYmFzZSk7CiAgICAgaiA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOwotICAgIGlmIChqICE9IENTX1NVQ0NFU1MpCisgICAgaWYgKGogIT0gMCkKIAljc19lcnJvcihsaW5rLCBSZWxlYXNlV2luZG93LCBqKTsKICAgICByZXR1cm4gKGkgIT0gMHgyMDApID8gMCA6IC0xOwogCkBAIC02MjAsNyArNjIxLDcgQEAKICAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gMDsKICAgICByZXEuQWNjZXNzU3BlZWQgPSAwOwogICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmssICZyZXEsICZsaW5rLT53aW4pOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAJY3NfZXJyb3IobGluaywgUmVxdWVzdFdpbmRvdywgaSk7CiAJcmV0dXJuIC0xOwogICAgIH0KQEAgLTY0Miw3ICs2NDMsNyBAQAogCiAgICAgaW91bm1hcChiYXNlKTsKICAgICBqID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7Ci0gICAgaWYgKGogIT0gQ1NfU1VDQ0VTUykKKyAgICBpZiAoaiAhPSAwKQogCWNzX2Vycm9yKGxpbmssIFJlbGVhc2VXaW5kb3csIGopOwogICAgIHJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCmluZGV4IDRlYWZhNGYuLmNmM2NjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICAvKiBUcnkgUFJJTUFSWSBjYXJkIGF0IDB4QTIwLTB4QTIzICovCiAgICAgbGluay0+aW8uQmFzZVBvcnQxID0gMHhBMjA7CiAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworICAgIGlmIChpICE9IDApIHsKIAkvKiBDb3VsZG4ndCBnZXQgMHhBMjAtMHhBMjMuICBUcnkgQUxURVJOQVRFIGF0IDB4QTI0LTB4QTI3LiAqLwogCWxpbmstPmlvLkJhc2VQb3J0MSA9IDB4QTI0OwogCUNTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKaW5kZXggY2ZjYmVhOS4uNDQ4Y2Q0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtNjksNyArNjksNyBAQAogSGlzdG9yeQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTG9nOiBubWNsYW5fY3MuYyx2Ci0gKiAyLjUuNzUtYWMxIDIwMDMvMDcvMTEgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIDIuNS43NS1hYzEgMjAwMy8wNy8xMSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICogRml4ZWQgaGFuZyBvbiBjYXJkIGVqZWN0IGFzIHdlIHByb2JlIGl0CiAgKiBDbGVhbmVkIHVwIHRvIHVzZSBuZXcgc3R5bGUgbG9ja2luZy4KICAqCkBAIC05MjUsNyArOTI1LDcgQEAKICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0IC0tICIsIGRldi0+bmFtZSk7CiAjaWYgUkVTRVRfT05fVElNRU9VVAogICBwcmludGsoInJlc2V0dGluZyBjYXJkXG4iKTsKLSAgcGNtY2lhX3Jlc2V0X2NhcmQobGluaywgTlVMTCk7CisgIHBjbWNpYV9yZXNldF9jYXJkKGxpbmstPnNvY2tldCk7CiAjZWxzZSAvKiAjaWYgUkVTRVRfT05fVElNRU9VVCAqLwogICBwcmludGsoIk5PVCByZXNldHRpbmcgY2FyZFxuIik7CiAjZW5kaWYgLyogI2lmIFJFU0VUX09OX1RJTUVPVVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKaW5kZXggZWJjMWFlNi4uZTQwZDYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAwOwogICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CiAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbik7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworICAgIGlmIChpICE9IDApIHsKIAljc19lcnJvcihsaW5rLCBSZXF1ZXN0V2luZG93LCBpKTsKIAlyZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMzMsNyArMzMzLDcgQEAKIAogICAgIGlvdW5tYXAodmlydCk7CiAgICAgaiA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOwotICAgIGlmIChqICE9IENTX1NVQ0NFU1MpCisgICAgaWYgKGogIT0gMCkKIAljc19lcnJvcihsaW5rLCBSZWxlYXNlV2luZG93LCBqKTsKICAgICByZXR1cm4gKGkgPCBOUl9JTkZPKSA/IGh3X2luZm8raSA6IE5VTEw7CiB9IC8qIGdldF9od2luZm8gKi8KQEAgLTUwNCw3ICs1MDQsOCBAQAogCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CiAJICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IChqIF4gMHgzMDApICsgMHgxMDsKIAkgICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkgICAgaWYgKHJldCA9PSBDU19TVUNDRVNTKSByZXR1cm4gcmV0OworCSAgICBpZiAocmV0ID09IDApCisJCSAgICByZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7CkBAIC01MTIsNTggKzUxMyw1MyBAQAogICAgIH0KIH0KIAorc3RhdGljIGludCBwY25ldF9jb25mY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICB2b2lkICpwcml2X2RhdGEpCit7CisJaW50ICpoYXNfc2htZW0gPSBwcml2X2RhdGE7CisJaW50IGk7CisJY2lzdHBsX2lvX3QgKmlvID0gJmNmZy0+aW87CisKKwlpZiAoY2ZnLT5pbmRleCA9PSAwIHx8IGNmZy0+aW8ubndpbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBieSBjb252ZW50aW9uLCB3ZSBjb25maWd1cmUgdGhlCisJICAgbmV0d29yayBmdW5jdGlvbiB3aXRoIHdpbmRvdyAwLCBhbmQgc2VyaWFsIHdpdGggd2luZG93IDEgKi8KKwlpZiAoaW8tPm53aW4gPiAxKSB7CisJCWkgPSAoaW8tPndpblsxXS5sZW4gPiBpby0+d2luWzBdLmxlbik7CisJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzEtaV0uYmFzZTsKKwkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMS1pXS5sZW47CisJfSBlbHNlIHsKKwkJaSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCX0KKworCSpoYXNfc2htZW0gPSAoKGNmZy0+bWVtLm53aW4gPT0gMSkgJiYKKwkJICAgICAgKGNmZy0+bWVtLndpblswXS5sZW4gPj0gMHg0MDAwKSk7CisJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5baV0uYmFzZTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpbltpXS5sZW47CisJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJaWYgKHBfZGV2LT5pby5OdW1Qb3J0czEgKyBwX2Rldi0+aW8uTnVtUG9ydHMyID49IDMyKQorCQlyZXR1cm4gdHJ5X2lvX3BvcnQocF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcGNuZXRfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm4sIHN0YXJ0X3BnLCBzdG9wX3BnLCBjbV9vZmZzZXQ7CisgICAgaW50IGxhc3RfcmV0LCBsYXN0X2ZuLCBzdGFydF9wZywgc3RvcF9wZywgY21fb2Zmc2V0OwogICAgIGludCBoYXNfc2htZW0gPSAwOwotICAgIHVfc2hvcnQgYnVmWzY0XTsKICAgICBod19pbmZvX3QgKmxvY2FsX2h3X2luZm87CiAgICAgREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKICAgICBERUJVRygwLCAicGNuZXRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgd2hpbGUgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIHsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOwotCWNpc3RwbF9pb190ICppbyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeS5pbyk7Ci0KLQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQkJcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSAhPSAwIHx8Ci0JCQljZmctPmluZGV4ID09IDAgfHwgY2ZnLT5pby5ud2luID09IDApCi0JCWdvdG8gbmV4dF9lbnRyeTsKLQotCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCS8qIEZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBieSBjb252ZW50aW9uLCB3ZSBjb25maWd1cmUgdGhlCi0JICAgbmV0d29yayBmdW5jdGlvbiB3aXRoIHdpbmRvdyAwLCBhbmQgc2VyaWFsIHdpdGggd2luZG93IDEgKi8KLQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JICAgIGkgPSAoaW8tPndpblsxXS5sZW4gPiBpby0+d2luWzBdLmxlbik7Ci0JICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMS1pXS5iYXNlOwotCSAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzEtaV0ubGVuOwotCX0gZWxzZSB7Ci0JICAgIGkgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCX0KLQloYXNfc2htZW0gPSAoKGNmZy0+bWVtLm53aW4gPT0gMSkgJiYKLQkJICAgICAoY2ZnLT5tZW0ud2luWzBdLmxlbiA+PSAweDQwMDApKTsKLQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luW2ldLmJhc2U7Ci0JbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpbltpXS5sZW47Ci0JbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMxICsgbGluay0+aW8uTnVtUG9ydHMyID49IDMyKSB7Ci0JICAgIGxhc3RfcmV0ID0gdHJ5X2lvX3BvcnQobGluayk7Ci0JICAgIGlmIChsYXN0X3JldCA9PSBDU19TVUNDRVNTKSBicmVhazsKLQl9Ci0gICAgbmV4dF9lbnRyeToKLQlsYXN0X3JldCA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpOwotICAgIH0KLSAgICBpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgeworICAgIGxhc3RfcmV0ID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHBjbmV0X2NvbmZjaGVjaywgJmhhc19zaG1lbSk7CisgICAgaWYgKGxhc3RfcmV0KSB7CiAJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBsYXN0X3JldCk7CiAJZ290byBmYWlsZWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwppbmRleCAyNTBlYjE5Li5jNzRkNjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpAQCAtNDA5LDEwICs0MDksMTMgQEAKIHsKIAlpbnQgaTsKIAotCWlmICgoaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MgfHwKLQkJCShpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTKQorCWkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpOworCWlmIChpICE9IDApCiAJCXJldHVybiBpOwotCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworCWkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSk7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIGk7CisJcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZSh0dXBsZSwgcGFyc2UpOwogfQogCiBzdGF0aWMgaW50IG5leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsCkBAIC00MjAsMTAgKzQyMywxMCBAQAogewogCWludCBpOwogCi0JaWYgKChpID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTIHx8Ci0JCQkoaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSkgIT0gQ1NfU1VDQ0VTUykKKwlpZiAoKGkgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkpICE9IDAgfHwKKwkJCShpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSAhPSAwKQogCQlyZXR1cm4gaTsKLQlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKKwlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlLCBwYXJzZSk7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDU5LDI3ICs0NjIsMzYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtaHpfbWZjX2NvbmZpZ19jaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YsCisJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQl1bnNpZ25lZCBpbnQgdmNjLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlpbnQgazsKKwlwX2Rldi0+aW8uQmFzZVBvcnQyID0gY2YtPmlvLndpblswXS5iYXNlOworCWZvciAoayA9IDA7IGsgPCAweDQwMDsgayArPSAweDEwKSB7CisJCWlmIChrICYgMHg4MCkKKwkJCWNvbnRpbnVlOworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gayBeIDB4MzAwOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKwogc3RhdGljIGludCBtaHpfbWZjX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CiAgICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOwotICAgIHR1cGxlX3QgKnR1cGxlOwotICAgIGNpc3BhcnNlX3QgKnBhcnNlOwotICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmOwotICAgIHVfY2hhciAqYnVmOwogICAgIHdpbl9yZXFfdCByZXE7CiAgICAgbWVtcmVxX3QgbWVtOwotICAgIGludCBpLCBrOworICAgIGludCBpOwogCiAgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOwogICAgIGlmICghY2ZnX21lbSkKLSAgICAgICAgcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKLQotICAgIHR1cGxlID0gJmNmZ19tZW0tPnR1cGxlOwotICAgIHBhcnNlID0gJmNmZ19tZW0tPnBhcnNlOwotICAgIGNmID0gJnBhcnNlLT5jZnRhYmxlX2VudHJ5OwotICAgIGJ1ZiA9IGNmZ19tZW0tPmJ1ZjsKKwkgICAgcmV0dXJuIC1FTk9NRU07CiAKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwpAQCAtNDg5LDI3ICs1MDEsOSBAQAogICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CiAgICAgbGluay0+aW8uTnVtUG9ydHMyID0gODsKIAotICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLSAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OwotICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQotICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwogICAgIC8qIFRoZSBNZWdhaGVydHogY29tYm8gY2FyZHMgaGF2ZSBtb2RlbS1saWtlIENJUyBlbnRyaWVzLCBzbwogICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0cnkgYSBidW5jaCBvZiBwb3J0IGNvbWJpbmF0aW9ucy4gKi8KLSAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0JbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQlsaW5rLT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JZm9yIChrID0gMDsgayA8IDB4NDAwOyBrICs9IDB4MTApIHsKLQkgICAgaWYgKGsgJiAweDgwKSBjb250aW51ZTsKLQkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gayBeIDB4MzAwOwotCSAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JfQotCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOwotCWkgPSBuZXh0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0gICAgfQotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpCisgICAgaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBtaHpfbWZjX2NvbmZpZ19jaGVjaywgTlVMTCkpCiAJZ290byBmcmVlX2NmZ19tZW07CiAgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CiAKQEAgLTUxOCw3ICs1MTIsNyBAQAogICAgIHJlcS5CYXNlID0gcmVxLlNpemUgPSAwOwogICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CiAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbik7Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICBpZiAoaSAhPSAwKQogCWdvdG8gZnJlZV9jZmdfbWVtOwogICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKICAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKQEAgLTUyNiwxNCArNTIwLDE0IEBACiAJbWVtLkNhcmRPZmZzZXQgPSBsaW5rLT5jb25mLkNvbmZpZ0Jhc2U7CiAgICAgaSA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKTsKIAotICAgIGlmICgoaSA9PSBDU19TVUNDRVNTKQorICAgIGlmICgoaSA9PSAwKQogCSYmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTUVHQUhFUlRaKQogCSYmIChzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX0VNMzI4OCkpCiAJbWh6XzMyODhfcG93ZXIobGluayk7CiAKIGZyZWVfY2ZnX21lbToKICAgICBrZnJlZShjZmdfbWVtKTsKLSAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIGludCBtaHpfc2V0dXAoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC01NjAsMTIgKzU1NCwxMiBAQAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBDSVMuICBJdCBpcyBzdG9yZWQgYXMgdGhlIGxhc3QKICAgICAgICAoZm91cnRoKSBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLwogICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotICAgIGlmIChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSAhPSAwKSB7CiAJcmMgPSAtMTsKIAlnb3RvIGZyZWVfY2ZnX21lbTsKICAgICB9CiAgICAgLyogVWdoIC0tIHRoZSBFTTExNDQgY2FyZCBoYXMgdHdvIFZFUlNfMSB0dXBsZXMhPyEgKi8KLSAgICBpZiAobmV4dF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpCisgICAgaWYgKG5leHRfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSAhPSAwKQogCWZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7CiAgICAgaWYgKHBhcnNlLT52ZXJzaW9uXzEubnMgPiAzKSB7CiAJc3RhdGlvbl9hZGRyID0gcGFyc2UtPnZlcnNpb25fMS5zdHIgKyBwYXJzZS0+dmVyc2lvbl8xLm9mc1szXTsKQEAgLTU3NywxMSArNTcxLDExIEBACiAKICAgICAvKiBBbm90aGVyIHBvc3NpYmlsaXR5OiBmb3IgdGhlIEVNMzI4OCwgaW4gYSBzcGVjaWFsIHR1cGxlICovCiAgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IDB4ODE7Ci0gICAgaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgdHVwbGUpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCB0dXBsZSkgIT0gMCkgewogCXJjID0gLTE7CiAJZ290byBmcmVlX2NmZ19tZW07CiAgICAgfQotICAgIGlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgdHVwbGUpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssIHR1cGxlKSAhPSAwKSB7CiAJcmMgPSAtMTsKIAlnb3RvIGZyZWVfY2ZnX21lbTsKICAgICB9CkBAIC02NjAsNDYgKzY1NCwyNyBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAorc3RhdGljIGludCBzbWNfY29uZmlnY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YsCisJCQkgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgdW5zaWduZWQgaW50IHZjYywKKwkJCSAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7Cit9CisKIHN0YXRpYyBpbnQgc21jX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKLSAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07Ci0gICAgdHVwbGVfdCAqdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCAqcGFyc2U7Ci0gICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2Y7Ci0gICAgdV9jaGFyICpidWY7CiAgICAgaW50IGk7CiAKLSAgICBjZmdfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtY19jZmdfbWVtKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFjZmdfbWVtKQotCXJldHVybiBDU19PVVRfT0ZfUkVTT1VSQ0U7Ci0KLSAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKLSAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKLSAgICBjZiA9ICZwYXJzZS0+Y2Z0YWJsZV9lbnRyeTsKLSAgICBidWYgPSBjZmdfbWVtLT5idWY7Ci0KLSAgICB0dXBsZS0+QXR0cmlidXRlcyA9IHR1cGxlLT5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUtPlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUtPlR1cGxlRGF0YU1heCA9IDI1NTsKLSAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0KICAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKLSAgICBpID0gZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLSAgICB3aGlsZSAoaSAhPSBDU19OT19NT1JFX0lURU1TKSB7Ci0JaWYgKGkgPT0gQ1NfU1VDQ0VTUykgewotCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OwotCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7Ci0JICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKLQl9Ci0JaSA9IG5leHRfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLSAgICB9Ci0gICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykKLQlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHNtY19jb25maWdjaGVjaywgTlVMTCk7CisgICAgaWYgKCFpKQorCSAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKIAotICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybiBpOwogfQogCkBAIC03MTUsNyArNjkwLDcgQEAKIAogICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKICAgICBpZiAoIWNmZ19tZW0pCi0JcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKwkgICAgcmV0dXJuIC1FTk9NRU07CiAKICAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKICAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKQEAgLTcyOCwxMiArNzAzLDEyIEBACiAgICAgLyogQ2hlY2sgZm9yIGEgTEFOIGZ1bmN0aW9uIGV4dGVuc2lvbiB0dXBsZSAqLwogICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CiAgICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0gICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworICAgIHdoaWxlIChpID09IDApIHsKIAlpZiAocGFyc2UtPmZ1bmNlLnR5cGUgPT0gQ0lTVFBMX0ZVTkNFX0xBTl9OT0RFX0lEKQogCSAgICBicmVhazsKIAlpID0gbmV4dF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwogICAgIH0KLSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSB7CisgICAgaWYgKGkgPT0gMCkgewogCW5vZGVfaWQgPSAoY2lzdHBsX2xhbl9ub2RlX2lkX3QgKilwYXJzZS0+ZnVuY2UuZGF0YTsKIAlpZiAobm9kZV9pZC0+bmIgPT0gNikgewogCSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQpAQCAtNzgwLDkgKzc1NSwxMCBAQAogICAgIGZvciAoaSA9IGogPSAwOyBqIDwgNDsgaisrKSB7CiAJbGluay0+aW8uQmFzZVBvcnQyID0gY29tW2pdOwogCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworCWlmIChpID09IDApCisJCWJyZWFrOwogICAgIH0KLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisgICAgaWYgKGkgIT0gMCkgewogCS8qIEZhbGxiYWNrOiB0dXJuIG9mZiBoYXJkIGRlY29kZSAqLwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDAzOwogCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7CkBAIC04MTUsMTMgKzc5MSwxMyBAQAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHR1cGxlIDB4OTAsIHN1YnR1cGxlIDB4MDQgKi8KICAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gMHg5MDsKICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCB0dXBsZSk7Ci0gICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworICAgIHdoaWxlIChpID09IDApIHsKIAlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssIHR1cGxlKTsKLQlpZiAoKGkgIT0gQ1NfU1VDQ0VTUykgfHwgKGJ1ZlswXSA9PSAweDA0KSkKKwlpZiAoKGkgIT0gMCkgfHwgKGJ1ZlswXSA9PSAweDA0KSkKIAkgICAgYnJlYWs7CiAJaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCB0dXBsZSk7CiAgICAgfQotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAJcmMgPSAtMTsKIAlnb3RvIGZyZWVfY2ZnX21lbTsKICAgICB9CkBAIC05NTksOCArOTM1LDExIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0jZGVmaW5lIENTX0VYSVRfVEVTVChyZXQsIHN2YywgbGFiZWwpIFwKLWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeyBjc19lcnJvcihsaW5rLCBzdmMsIHJldCk7IGdvdG8gbGFiZWw7IH0KKyNkZWZpbmUgQ1NfRVhJVF9URVNUKHJldCwgc3ZjLCBsYWJlbCkJXAoraWYgKHJldCAhPSAwKSB7CQkJCVwKKwljc19lcnJvcihsaW5rLCBzdmMsIHJldCk7CVwKKwlnb3RvIGxhYmVsOyAJCQlcCit9CiAKIHN0YXRpYyBpbnQgc21jOTFjOTJfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKaW5kZXggZjZjNDY5OC4uZTFmZDU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC0zNTMsNyArMzUzLDcgQEAKICAqIFNvbWUgbW9yZSBwcm90b3R5cGVzCiAgKi8KIHN0YXRpYyBpbnQgZG9fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGRvX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB4aXJjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCB4aXJjMnBzX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBzZXRfYWRkcmVzc2VzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAKIAlpZiAoKGVyciA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkpID09IDAgJiYKIAkJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpID09IDApCi0JCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZSh0dXBsZSwgcGFyc2UpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM4OCw3ICszODgsNyBAQAogCiAJaWYgKChlcnIgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkpID09IDAgJiYKIAkJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpID09IDApCi0JCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZSh0dXBsZSwgcGFyc2UpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU5MCw3ICs1OTAsNyBAQAogICAgIGRldi0+b3BlbiA9ICZkb19vcGVuOwogICAgIGRldi0+c3RvcCA9ICZkb19zdG9wOwogI2lmZGVmIEhBVkVfVFhfVElNRU9VVAotICAgIGRldi0+dHhfdGltZW91dCA9IGRvX3R4X3RpbWVvdXQ7CisgICAgZGV2LT50eF90aW1lb3V0ID0geGlyY190eF90aW1lb3V0OwogICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogICAgIElOSVRfV09SSygmbG9jYWwtPnR4X3RpbWVvdXRfdGFzaywgeGlyYzJwc190eF90aW1lb3V0X3Rhc2spOwogI2VuZGlmCkBAIC03MTUsNiArNzE1LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK3hpcmMycHNfY29uZmlnX21vZGVtKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCSAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXVuc2lnbmVkIGludCBpb2FkZHI7CisKKwlpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgeworCQlmb3IgKGlvYWRkciA9IDB4MzAwOyBpb2FkZHIgPCAweDQwMDsgaW9hZGRyICs9IDB4MTApIHsKKwkJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW9hZGRyOworCQkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQKK3hpcmMycHNfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCSAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCWludCAqcGFzcyA9IHByaXZfZGF0YTsKKworCWlmIChjZi0+aW8ubndpbiA+IDAgJiYgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgeworCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gY2YtPmlvLndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gcF9kZXYtPmlvLkJhc2VQb3J0MgorCQkJKyAoKnBhc3MgPyAoY2YtPmluZGV4ICYgMHgyMCA/IC0yNDo4KQorCQkJICAgOiAoY2YtPmluZGV4ICYgMHgyMCA/ICAgODotMjQpKTsKKwkJaWYgKCFwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKwogLyoqKioqKioqKioqKioqKioKICAqIHhpcmMycHNfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CiAgKiBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKQEAgLTcyNSwxMyArNzY2LDEyIEBACiB7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdW5zaWduZWQgaW50IGlvYWRkcjsKICAgICB0dXBsZV90IHR1cGxlOwogICAgIGNpc3BhcnNlX3QgcGFyc2U7Ci0gICAgdW5zaWduZWQgaW50IGlvYWRkcjsKICAgICBpbnQgZXJyLCBpOwogICAgIHVfY2hhciBidWZbNjRdOwogICAgIGNpc3RwbF9sYW5fbm9kZV9pZF90ICpub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90KilwYXJzZS5mdW5jZS5kYXRhOwotICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CiAgICAgREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKICAgICBsb2NhbC0+ZGluZ29fY2NyID0gTlVMTDsKQEAgLTg0NiwxOSArODg2LDggQEAKIAkgICAgLyogVGFrZSB0aGUgTW9kZW0gSU8gcG9ydCBmcm9tIHRoZSBDSVMgYW5kIHNjYW4gZm9yIGEgZnJlZQogCSAgICAgKiBFdGhlcm5ldCBwb3J0ICovCiAJICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OyAvKiBubyBNYWtvIHN0dWZmIGFueW1vcmUgKi8KLQkgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JICAgIGZvciAoZXJyID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOwotCQkJCSBlcnIgPSBuZXh0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSkgewotCQlpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgewotCQkgICAgZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7Ci0JCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4IDsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKLQkJCWlmICghKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pKSkKLQkJCSAgICBnb3RvIHBvcnRfZm91bmQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQorCSAgICBpZiAoIXBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCB4aXJjMnBzX2NvbmZpZ19tb2RlbSwgTlVMTCkpCisJCSAgICBnb3RvIHBvcnRfZm91bmQ7CiAJfSBlbHNlIHsKIAkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTg7CiAJICAgIC8qIFdlIGRvIDIgcGFzc2VzIGhlcmU6IFRoZSBmaXJzdCBvbmUgdXNlcyB0aGUgcmVndWxhciBtYXBwaW5nIGFuZApAQCAtODY2LDIxICs4OTUsOSBAQAogCSAgICAgKiBtaXJyb3JlZCBldmVyeSAzMiBieXRlcy4gQWN0dWFsbHkgd2UgdXNlIGEgbWlycm9yZWQgcG9ydCBmb3IKIAkgICAgICogdGhlIE1ha28gaWYgKG9uIHRoZSBmaXJzdCBwYXNzKSB0aGUgQ09SIGJpdCA1IGlzIHNldC4KIAkgICAgICovCi0JICAgIGZvciAocGFzcz0wOyBwYXNzIDwgMjsgcGFzcysrKSB7Ci0JCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCQlmb3IgKGVyciA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKLQkJCQkgICAgIGVyciA9IG5leHRfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKXsKLQkJICAgIGlmIChjZi0+aW8ubndpbiA+IDAgICYmICAoY2YtPmlvLndpblswXS5iYXNlICYgMHhmKSA9PSA4KXsKLQkJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXggOwotCQkJbGluay0+aW8uQmFzZVBvcnQyID0gY2YtPmlvLndpblswXS5iYXNlOwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gbGluay0+aW8uQmFzZVBvcnQyCi0JCQkJICAgICsgKHBhc3MgPyAoY2YtPmluZGV4ICYgMHgyMCA/IC0yNDo4KQotCQkJCQkgICAgOiAoY2YtPmluZGV4ICYgMHgyMCA/ICAgODotMjQpKTsKLQkJCWlmICghKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pKSkKKwkgICAgZm9yIChwYXNzPTA7IHBhc3MgPCAyOyBwYXNzKyspCisJCSAgICBpZiAoIXBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCB4aXJjMnBzX2NvbmZpZ19jaGVjaywgJnBhc3MpKQogCQkJICAgIGdvdG8gcG9ydF9mb3VuZDsKLQkJICAgIH0KLQkJfQotCSAgICB9CiAJICAgIC8qIGlmIHNwZWNpYWwgb3B0aW9uOgogCSAgICAgKiB0cnkgdG8gY29uZmlndXJlIGFzIEV0aGVybmV0IG9ubHkuCiAJICAgICAqIC4uLi4gKi8KQEAgLTEzMzUsNyArMTM1Miw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1kb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit4aXJjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvZml4ZWQuYyBiL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCmluZGV4IDRlMDc5NTYuLmNmMjRjYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBmaXhlZF9tZGlvX2J1cyB7CiAJaW50IGlycXNbUEhZX01BWF9BRERSXTsKLQlzdHJ1Y3QgbWlpX2J1cyBtaWlfYnVzOworCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwogCXN0cnVjdCBsaXN0X2hlYWQgcGh5czsKIH07CiAKQEAgLTExNSw4ICsxMTUsNyBAQAogCiBzdGF0aWMgaW50IGZpeGVkX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSkKIHsKLQlzdHJ1Y3QgZml4ZWRfbWRpb19idXMgKmZtYiA9IGNvbnRhaW5lcl9vZihidXMsIHN0cnVjdCBmaXhlZF9tZGlvX2J1cywKLQkJCQkJCSAgbWlpX2J1cyk7CisJc3RydWN0IGZpeGVkX21kaW9fYnVzICpmbWIgPSBidXMtPnByaXY7CiAJc3RydWN0IGZpeGVkX3BoeSAqZnA7CiAKIAlpZiAocmVnX251bSA+PSBNSUlfUkVHU19OVU0pCkBAIC0yMTMsMTkgKzIxMiwyOCBAQAogCQlnb3RvIGVycl9wZGV2OwogCX0KIAotCXNucHJpbnRmKGZtYi0+bWlpX2J1cy5pZCwgTUlJX0JVU19JRF9TSVpFLCAiMCIpOwotCWZtYi0+bWlpX2J1cy5uYW1lID0gIkZpeGVkIE1ESU8gQnVzIjsKLQlmbWItPm1paV9idXMuZGV2ID0gJnBkZXYtPmRldjsKLQlmbWItPm1paV9idXMucmVhZCA9ICZmaXhlZF9tZGlvX3JlYWQ7Ci0JZm1iLT5taWlfYnVzLndyaXRlID0gJmZpeGVkX21kaW9fd3JpdGU7Ci0JZm1iLT5taWlfYnVzLmlycSA9IGZtYi0+aXJxczsKLQotCXJldCA9IG1kaW9idXNfcmVnaXN0ZXIoJmZtYi0+bWlpX2J1cyk7Ci0JaWYgKHJldCkKKwlmbWItPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKGZtYi0+bWlpX2J1cyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX21kaW9idXNfcmVnOworCX0KKworCXNucHJpbnRmKGZtYi0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIjAiKTsKKwlmbWItPm1paV9idXMtPm5hbWUgPSAiRml4ZWQgTURJTyBCdXMiOworCWZtYi0+bWlpX2J1cy0+cHJpdiA9IGZtYjsKKwlmbWItPm1paV9idXMtPnBhcmVudCA9ICZwZGV2LT5kZXY7CisJZm1iLT5taWlfYnVzLT5yZWFkID0gJmZpeGVkX21kaW9fcmVhZDsKKwlmbWItPm1paV9idXMtPndyaXRlID0gJmZpeGVkX21kaW9fd3JpdGU7CisJZm1iLT5taWlfYnVzLT5pcnEgPSBmbWItPmlycXM7CisKKwlyZXQgPSBtZGlvYnVzX3JlZ2lzdGVyKGZtYi0+bWlpX2J1cyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWRpb2J1c19hbGxvYzsKIAogCXJldHVybiAwOwogCitlcnJfbWRpb2J1c19hbGxvYzoKKwltZGlvYnVzX2ZyZWUoZm1iLT5taWlfYnVzKTsKIGVycl9tZGlvYnVzX3JlZzoKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKIGVycl9wZGV2OgpAQCAtMjM4LDcgKzI0Niw4IEBACiAJc3RydWN0IGZpeGVkX21kaW9fYnVzICpmbWIgPSAmcGxhdGZvcm1fZm1iOwogCXN0cnVjdCBmaXhlZF9waHkgKmZwLCAqdG1wOwogCi0JbWRpb2J1c191bnJlZ2lzdGVyKCZmbWItPm1paV9idXMpOworCW1kaW9idXNfdW5yZWdpc3RlcihmbWItPm1paV9idXMpOworCW1kaW9idXNfZnJlZShmbWItPm1paV9idXMpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZwLCB0bXAsICZmbWItPnBoeXMsIG5vZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWJpdGJhbmcuYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWJpdGJhbmcuYwppbmRleCBjMDFiNzgwLi4yNTc2MDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21kaW8tYml0YmFuZy5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIHsKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzOwogCi0JYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1paV9idXMpLCBHRlBfS0VSTkVMKTsKKwlidXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKCFidXMpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xODQsNyArMTg0LDcgQEAKIAlzdHJ1Y3QgbWRpb2JiX2N0cmwgKmN0cmwgPSBidXMtPnByaXY7CiAKIAltb2R1bGVfcHV0KGN0cmwtPm9wcy0+b3duZXIpOwotCWtmcmVlKGJ1cyk7CisJbWRpb2J1c19mcmVlKGJ1cyk7CiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfbWRpb19iaXRiYW5nKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW8tb2ZncGlvLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby1vZmdwaW8uYwppbmRleCA3ZWRmYzBjLi4yZmY5Nzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1vZmdwaW8uYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpby1vZmdwaW8uYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAluZXdfYnVzID0gYWxsb2NfbWRpb19iaXRiYW5nKCZiaXRiYW5nLT5jdHJsKTsKIAlpZiAoIW5ld19idXMpCi0JCWdvdG8gb3V0X2ZyZWVfcHJpdjsKKwkJZ290byBvdXRfZnJlZV9iaXRiYW5nOwogCiAJbmV3X2J1cy0+bmFtZSA9ICJHUElPIEJpdGJhbmdlZCBNSUkiLAogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJaWYgKCFzdHJjbXAobnAtPnR5cGUsICJldGhlcm5ldC1waHkiKSkKIAkJCWFkZF9waHkobmV3X2J1cywgbnApOwogCi0JbmV3X2J1cy0+ZGV2ID0gJm9mZGV2LT5kZXY7CisJbmV3X2J1cy0+cGFyZW50ID0gJm9mZGV2LT5kZXY7CiAJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCBuZXdfYnVzKTsKIAogCXJldCA9IG1kaW9idXNfcmVnaXN0ZXIobmV3X2J1cyk7CkBAIC0xNTUsOSArMTU1LDkgQEAKIAlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIE5VTEwpOwogCWtmcmVlKG5ld19idXMtPmlycSk7CiBvdXRfZnJlZV9idXM6Ci0Ja2ZyZWUobmV3X2J1cyk7Ci1vdXRfZnJlZV9wcml2OgogCWZyZWVfbWRpb19iaXRiYW5nKG5ld19idXMpOworb3V0X2ZyZWVfYml0YmFuZzoKKwlrZnJlZShiaXRiYW5nKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTY4LDExICsxNjgsMTAgQEAKIAlzdHJ1Y3QgbWRpb19ncGlvX2luZm8gKmJpdGJhbmcgPSBidXMtPnByaXY7CiAKIAltZGlvYnVzX3VucmVnaXN0ZXIoYnVzKTsKKwlrZnJlZShidXMtPmlycSk7CiAJZnJlZV9tZGlvX2JpdGJhbmcoYnVzKTsKIAlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIE5VTEwpOwotCWtmcmVlKGJ1cy0+aXJxKTsKIAlrZnJlZShiaXRiYW5nKTsKLQlrZnJlZShidXMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpb19idXMuYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCmluZGV4IDk0ZTBiN2UuLmQwZWQxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jCkBAIC0zNiw2ICszNiw0MyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIC8qKgorICogbWRpb2J1c19hbGxvYyAtIGFsbG9jYXRlIGEgbWlpX2J1cyBzdHJ1Y3R1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IGEgYnVzIGRyaXZlciB0byBhbGxvY2F0ZSBhbiBtaWlfYnVzCisgKiBzdHJ1Y3R1cmUgdG8gZmlsbCBpbi4KKyAqLworc3RydWN0IG1paV9idXMgKm1kaW9idXNfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbWlpX2J1cyAqYnVzOworCisJYnVzID0ga3phbGxvYyhzaXplb2YoKmJ1cyksIEdGUF9LRVJORUwpOworCWlmIChidXMgIT0gTlVMTCkKKwkJYnVzLT5zdGF0ZSA9IE1ESU9CVVNfQUxMT0NBVEVEOworCisJcmV0dXJuIGJ1czsKK30KK0VYUE9SVF9TWU1CT0wobWRpb2J1c19hbGxvYyk7CisKKy8qKgorICogbWRpb2J1c19yZWxlYXNlIC0gbWlpX2J1cyBkZXZpY2UgcmVsZWFzZSBjYWxsYmFjaworICogQGQ6IHRoZSB0YXJnZXQgc3RydWN0IGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBtaWlfYnVzCisgKgorICogRGVzY3JpcHRpb246IGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBtaWlfYnVzIGlzCisgKiBkcm9wcGVkLCB0byBmcmVlIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgbWRpb2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmQpCit7CisJc3RydWN0IG1paV9idXMgKmJ1cyA9IHRvX21paV9idXMoZCk7CisJQlVHX09OKGJ1cy0+c3RhdGUgIT0gTURJT0JVU19SRUxFQVNFRCk7CisJa2ZyZWUoYnVzKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzcyBtZGlvX2J1c19jbGFzcyA9IHsKKwkubmFtZQkJPSAibWRpb19idXMiLAorCS5kZXZfcmVsZWFzZQk9IG1kaW9idXNfcmVsZWFzZSwKK307CisKKy8qKgogICogbWRpb2J1c19yZWdpc3RlciAtIGJyaW5nIHVwIGFsbCB0aGUgUEhZcyBvbiBhIGdpdmVuIGJ1cyBhbmQgYXR0YWNoIHRoZW0gdG8gYnVzCiAgKiBAYnVzOiB0YXJnZXQgbWlpX2J1cwogICoKQEAgLTU0LDU1ICs5MSwzNiBAQAogCQkJTlVMTCA9PSBidXMtPndyaXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCUJVR19PTihidXMtPnN0YXRlICE9IE1ESU9CVVNfQUxMT0NBVEVEICYmCisJICAgICAgIGJ1cy0+c3RhdGUgIT0gTURJT0JVU19VTlJFR0lTVEVSRUQpOworCisJYnVzLT5kZXYucGFyZW50ID0gYnVzLT5wYXJlbnQ7CisJYnVzLT5kZXYuY2xhc3MgPSAmbWRpb19idXNfY2xhc3M7CisJYnVzLT5kZXYuZ3JvdXBzID0gTlVMTDsKKwltZW1jcHkoYnVzLT5kZXYuYnVzX2lkLCBidXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUpOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZidXMtPmRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIm1paV9idXMgJXMgZmFpbGVkIHRvIHJlZ2lzdGVyXG4iLCBidXMtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnVzLT5zdGF0ZSA9IE1ESU9CVVNfUkVHSVNURVJFRDsKKwogCW11dGV4X2luaXQoJmJ1cy0+bWRpb19sb2NrKTsKIAogCWlmIChidXMtPnJlc2V0KQogCQlidXMtPnJlc2V0KGJ1cyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspIHsKLQkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwkJYnVzLT5waHlfbWFwW2ldID0gTlVMTDsKKwkJaWYgKChidXMtPnBoeV9tYXNrICYgKDEgPDwgaSkpID09IDApIHsKKwkJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQkJaWYgKGJ1cy0+cGh5X21hc2sgJiAoMSA8PCBpKSkgewotCQkJYnVzLT5waHlfbWFwW2ldID0gTlVMTDsKLQkJCWNvbnRpbnVlOworCQkJcGh5ZGV2ID0gbWRpb2J1c19zY2FuKGJ1cywgaSk7CisJCQlpZiAoSVNfRVJSKHBoeWRldikpCisJCQkJZXJyID0gUFRSX0VSUihwaHlkZXYpOwogCQl9Ci0KLQkJcGh5ZGV2ID0gZ2V0X3BoeV9kZXZpY2UoYnVzLCBpKTsKLQotCQlpZiAoSVNfRVJSKHBoeWRldikpCi0JCQlyZXR1cm4gUFRSX0VSUihwaHlkZXYpOwotCi0JCS8qIFRoZXJlJ3MgYSBQSFkgYXQgdGhpcyBhZGRyZXNzCi0JCSAqIFdlIG5lZWQgdG8gc2V0OgotCQkgKiAxKSBJUlEKLQkJICogMikgYnVzX2lkCi0JCSAqIDMpIHBhcmVudAotCQkgKiA0KSBidXMKLQkJICogNSkgbWlpX2J1cwotCQkgKiBBbmQsIHdlIG5lZWQgdG8gcmVnaXN0ZXIgaXQgKi8KLQkJaWYgKHBoeWRldikgewotCQkJcGh5ZGV2LT5pcnEgPSBidXMtPmlycVtpXTsKLQotCQkJcGh5ZGV2LT5kZXYucGFyZW50ID0gYnVzLT5kZXY7Ci0JCQlwaHlkZXYtPmRldi5idXMgPSAmbWRpb19idXNfdHlwZTsKLQkJCXNucHJpbnRmKHBoeWRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIGJ1cy0+aWQsIGkpOwotCi0JCQlwaHlkZXYtPmJ1cyA9IGJ1czsKLQotCQkJLyogUnVuIGFsbCBvZiB0aGUgZml4dXBzIGZvciB0aGlzIFBIWSAqLwotCQkJcGh5X3NjYW5fZml4dXBzKHBoeWRldik7Ci0KLQkJCWVyciA9IGRldmljZV9yZWdpc3RlcigmcGh5ZGV2LT5kZXYpOwotCi0JCQlpZiAoZXJyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJwaHkgJWQgZmFpbGVkIHRvIHJlZ2lzdGVyXG4iLAotCQkJCQkJaSk7Ci0JCQkJcGh5X2RldmljZV9mcmVlKHBoeWRldik7Ci0JCQkJcGh5ZGV2ID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCWJ1cy0+cGh5X21hcFtpXSA9IHBoeWRldjsKIAl9CiAKIAlwcl9pbmZvKCIlczogcHJvYmVkXG4iLCBidXMtPm5hbWUpOwpAQCAtMTE1LDYgKzEzMywxMCBAQAogewogCWludCBpOwogCisJQlVHX09OKGJ1cy0+c3RhdGUgIT0gTURJT0JVU19SRUdJU1RFUkVEKTsKKwlidXMtPnN0YXRlID0gTURJT0JVU19VTlJFR0lTVEVSRUQ7CisKKwlkZXZpY2VfdW5yZWdpc3RlcigmYnVzLT5kZXYpOwogCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykgewogCQlpZiAoYnVzLT5waHlfbWFwW2ldKQogCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmJ1cy0+cGh5X21hcFtpXS0+ZGV2KTsKQEAgLTEyMyw2ICsxNDUsMTIyIEBACiBFWFBPUlRfU1lNQk9MKG1kaW9idXNfdW5yZWdpc3Rlcik7CiAKIC8qKgorICogbWRpb2J1c19mcmVlIC0gZnJlZSBhIHN0cnVjdCBtaWlfYnVzCisgKiBAYnVzOiBtaWlfYnVzIHRvIGZyZWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgZGV2aWNlCisgKiBvYmplY3QgaW4gdGhlIG1paV9idXMuICBJZiB0aGlzIGlzIHRoZSBsYXN0IHJlZmVyZW5jZSwgdGhlIG1paV9idXMKKyAqIHdpbGwgYmUgZnJlZWQuCisgKi8KK3ZvaWQgbWRpb2J1c19mcmVlKHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJLyoKKwkgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVycm9yIGhhbmRsaW5nIGluIGRyaXZlcnMuCisJICovCisJaWYgKGJ1cy0+c3RhdGUgPT0gTURJT0JVU19BTExPQ0FURUQpIHsKKwkJa2ZyZWUoYnVzKTsKKwkJcmV0dXJuOworCX0KKworCUJVR19PTihidXMtPnN0YXRlICE9IE1ESU9CVVNfVU5SRUdJU1RFUkVEKTsKKwlidXMtPnN0YXRlID0gTURJT0JVU19SRUxFQVNFRDsKKworCXB1dF9kZXZpY2UoJmJ1cy0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wobWRpb2J1c19mcmVlKTsKKworc3RydWN0IHBoeV9kZXZpY2UgKm1kaW9idXNfc2NhbihzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OworCWludCBlcnI7CisKKwlwaHlkZXYgPSBnZXRfcGh5X2RldmljZShidXMsIGFkZHIpOworCWlmIChJU19FUlIocGh5ZGV2KSB8fCBwaHlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIHBoeWRldjsKKworCS8qIFRoZXJlJ3MgYSBQSFkgYXQgdGhpcyBhZGRyZXNzCisJICogV2UgbmVlZCB0byBzZXQ6CisJICogMSkgSVJRCisJICogMikgYnVzX2lkCisJICogMykgcGFyZW50CisJICogNCkgYnVzCisJICogNSkgbWlpX2J1cworCSAqIEFuZCwgd2UgbmVlZCB0byByZWdpc3RlciBpdCAqLworCisJcGh5ZGV2LT5pcnEgPSBidXMtPmlycSAhPSBOVUxMID8gYnVzLT5pcnFbYWRkcl0gOiBQSFlfUE9MTDsKKworCXBoeWRldi0+ZGV2LnBhcmVudCA9IGJ1cy0+cGFyZW50OworCXBoeWRldi0+ZGV2LmJ1cyA9ICZtZGlvX2J1c190eXBlOworCXNucHJpbnRmKHBoeWRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIGJ1cy0+aWQsIGFkZHIpOworCisJcGh5ZGV2LT5idXMgPSBidXM7CisKKwkvKiBSdW4gYWxsIG9mIHRoZSBmaXh1cHMgZm9yIHRoaXMgUEhZICovCisJcGh5X3NjYW5fZml4dXBzKHBoeWRldik7CisKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnBoeWRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGh5ICVkIGZhaWxlZCB0byByZWdpc3RlclxuIiwgYWRkcik7CisJCXBoeV9kZXZpY2VfZnJlZShwaHlkZXYpOworCQlwaHlkZXYgPSBOVUxMOworCX0KKworCWJ1cy0+cGh5X21hcFthZGRyXSA9IHBoeWRldjsKKworCXJldHVybiBwaHlkZXY7Cit9CitFWFBPUlRfU1lNQk9MKG1kaW9idXNfc2Nhbik7CisKKy8qKgorICogbWRpb2J1c19yZWFkIC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYSBnaXZlbiBNSUkgbWdtdCByZWdpc3RlcgorICogQGJ1czogdGhlIG1paV9idXMgc3RydWN0CisgKiBAYWRkcjogdGhlIHBoeSBhZGRyZXNzCisgKiBAcmVnbnVtOiByZWdpc3RlciBudW1iZXIgdG8gcmVhZAorICoKKyAqIE5PVEU6IE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LAorICogYmVjYXVzZSB0aGUgYnVzIHJlYWQvd3JpdGUgZnVuY3Rpb25zIG1heSB3YWl0IGZvciBhbiBpbnRlcnJ1cHQKKyAqIHRvIGNvbmNsdWRlIHRoZSBvcGVyYXRpb24uCisgKi8KK2ludCBtZGlvYnVzX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsIHUxNiByZWdudW0pCit7CisJaW50IHJldHZhbDsKKworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisKKwltdXRleF9sb2NrKCZidXMtPm1kaW9fbG9jayk7CisJcmV0dmFsID0gYnVzLT5yZWFkKGJ1cywgYWRkciwgcmVnbnVtKTsKKwltdXRleF91bmxvY2soJmJ1cy0+bWRpb19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKG1kaW9idXNfcmVhZCk7CisKKy8qKgorICogbWRpb2J1c193cml0ZSAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB3cml0aW5nIGEgZ2l2ZW4gTUlJIG1nbXQgcmVnaXN0ZXIKKyAqIEBidXM6IHRoZSBtaWlfYnVzIHN0cnVjdAorICogQGFkZHI6IHRoZSBwaHkgYWRkcmVzcworICogQHJlZ251bTogcmVnaXN0ZXIgbnVtYmVyIHRvIHdyaXRlCisgKiBAdmFsOiB2YWx1ZSB0byB3cml0ZSB0byBAcmVnbnVtCisgKgorICogTk9URTogTVVTVCBOT1QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQsCisgKiBiZWNhdXNlIHRoZSBidXMgcmVhZC93cml0ZSBmdW5jdGlvbnMgbWF5IHdhaXQgZm9yIGFuIGludGVycnVwdAorICogdG8gY29uY2x1ZGUgdGhlIG9wZXJhdGlvbi4KKyAqLworaW50IG1kaW9idXNfd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsIHUxNiByZWdudW0sIHUxNiB2YWwpCit7CisJaW50IGVycjsKKworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisKKwltdXRleF9sb2NrKCZidXMtPm1kaW9fbG9jayk7CisJZXJyID0gYnVzLT53cml0ZShidXMsIGFkZHIsIHJlZ251bSwgdmFsKTsKKwltdXRleF91bmxvY2soJmJ1cy0+bWRpb19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1kaW9idXNfd3JpdGUpOworCisvKioKICAqIG1kaW9fYnVzX21hdGNoIC0gZGV0ZXJtaW5lIGlmIGdpdmVuIFBIWSBkcml2ZXIgc3VwcG9ydHMgdGhlIGdpdmVuIFBIWSBkZXZpY2UKICAqIEBkZXY6IHRhcmdldCBQSFkgZGV2aWNlCiAgKiBAZHJ2OiBnaXZlbiBQSFkgZHJpdmVyCkBAIC0xNzQsMTAgKzMxMiwyMCBAQAogCiBpbnQgX19pbml0IG1kaW9fYnVzX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZtZGlvX2J1c190eXBlKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xhc3NfcmVnaXN0ZXIoJm1kaW9fYnVzX2NsYXNzKTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBidXNfcmVnaXN0ZXIoJm1kaW9fYnVzX3R5cGUpOworCQlpZiAocmV0KQorCQkJY2xhc3NfdW5yZWdpc3RlcigmbWRpb19idXNfY2xhc3MpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgbWRpb19idXNfZXhpdCh2b2lkKQogeworCWNsYXNzX3VucmVnaXN0ZXIoJm1kaW9fYnVzX2NsYXNzKTsKIAlidXNfdW5yZWdpc3RlcigmbWRpb19idXNfdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5LmMgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKaW5kZXggNDVjYzI5MS4uZGY0ZTYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwpAQCAtNTgsNTUgKzU4LDYgQEAKIAogCiAvKioKLSAqIHBoeV9yZWFkIC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYSBnaXZlbiBQSFkgcmVnaXN0ZXIKLSAqIEBwaHlkZXY6IHRoZSBwaHlfZGV2aWNlIHN0cnVjdAotICogQHJlZ251bTogcmVnaXN0ZXIgbnVtYmVyIHRvIHJlYWQKLSAqCi0gKiBOT1RFOiBNVVNUIE5PVCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwKLSAqIGJlY2F1c2UgdGhlIGJ1cyByZWFkL3dyaXRlIGZ1bmN0aW9ucyBtYXkgd2FpdCBmb3IgYW4gaW50ZXJydXB0Ci0gKiB0byBjb25jbHVkZSB0aGUgb3BlcmF0aW9uLgotICovCi1pbnQgcGh5X3JlYWQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTE2IHJlZ251bSkKLXsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBtaWlfYnVzICpidXMgPSBwaHlkZXYtPmJ1czsKLQotCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7Ci0KLQltdXRleF9sb2NrKCZidXMtPm1kaW9fbG9jayk7Ci0JcmV0dmFsID0gYnVzLT5yZWFkKGJ1cywgcGh5ZGV2LT5hZGRyLCByZWdudW0pOwotCW11dGV4X3VubG9jaygmYnVzLT5tZGlvX2xvY2spOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLUVYUE9SVF9TWU1CT0wocGh5X3JlYWQpOwotCi0vKioKLSAqIHBoeV93cml0ZSAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB3cml0aW5nIGEgZ2l2ZW4gUEhZIHJlZ2lzdGVyCi0gKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKLSAqIEByZWdudW06IHJlZ2lzdGVyIG51bWJlciB0byB3cml0ZQotICogQHZhbDogdmFsdWUgdG8gd3JpdGUgdG8gQHJlZ251bQotICoKLSAqIE5PVEU6IE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LAotICogYmVjYXVzZSB0aGUgYnVzIHJlYWQvd3JpdGUgZnVuY3Rpb25zIG1heSB3YWl0IGZvciBhbiBpbnRlcnJ1cHQKLSAqIHRvIGNvbmNsdWRlIHRoZSBvcGVyYXRpb24uCi0gKi8KLWludCBwaHlfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTE2IHJlZ251bSwgdTE2IHZhbCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBtaWlfYnVzICpidXMgPSBwaHlkZXYtPmJ1czsKLQotCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7Ci0KLQltdXRleF9sb2NrKCZidXMtPm1kaW9fbG9jayk7Ci0JZXJyID0gYnVzLT53cml0ZShidXMsIHBoeWRldi0+YWRkciwgcmVnbnVtLCB2YWwpOwotCW11dGV4X3VubG9jaygmYnVzLT5tZGlvX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0wocGh5X3dyaXRlKTsKLQotLyoqCiAgKiBwaHlfY2xlYXJfaW50ZXJydXB0IC0gQWNrIHRoZSBwaHkgZGV2aWNlJ3MgaW50ZXJydXB0CiAgKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKICAqCkBAIC0zNjYsNyArMzE3LDggQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dNSUlQSFk6CiAJCW1paV9kYXRhLT5waHlfaWQgPSBwaHlkZXYtPmFkZHI7Ci0JCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJCW1paV9kYXRhLT52YWxfb3V0ID0gcGh5X3JlYWQocGh5ZGV2LCBtaWlfZGF0YS0+cmVnX251bSk7CiAJCWJyZWFrOwpAQCAtNDEzLDcgKzM2NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTcyOCw2ICs2ODAsMTIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGlycV9lbmFibGVfZXJyOwogCisJLyogU3RvcCB0aW1lciBhbmQgcnVuIHRoZSBzdGF0ZSBxdWV1ZSBub3cuICBUaGUgd29yayBmdW5jdGlvbiBmb3IKKwkgKiBzdGF0ZV9xdWV1ZSB3aWxsIHN0YXJ0IHRoZSB0aW1lciB1cCBhZ2Fpbi4KKwkgKi8KKwlkZWxfdGltZXIoJnBoeWRldi0+cGh5X3RpbWVyKTsKKwlzY2hlZHVsZV93b3JrKCZwaHlkZXYtPnN0YXRlX3F1ZXVlKTsKKwogCXJldHVybjsKIAogaXJxX2VuYWJsZV9lcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwppbmRleCAxNmEwZTdkLi5lMTFiMDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKQEAgLTMwOSwxMSArMzA5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGh5X2Rpc2Nvbm5lY3QpOwogCi1zdGF0aWMgaW50IHBoeV9jb21wYXJlX2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gc3RyY21wKChjaGFyICopZGF0YSwgZGV2LT5idXNfaWQpID8gMCA6IDE7Ci19Ci0KIC8qKgogICogcGh5X2F0dGFjaCAtIGF0dGFjaCBhIG5ldHdvcmsgZGV2aWNlIHRvIGEgcGFydGljdWxhciBQSFkgZGV2aWNlCiAgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKQEAgLTMzNyw4ICszMzIsNyBAQAogCiAJLyogU2VhcmNoIHRoZSBsaXN0IG9mIFBIWSBkZXZpY2VzIG9uIHRoZSBtZGlvIGJ1cyBmb3IgdGhlCiAJICogUEhZIHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lICovCi0JZCA9IGJ1c19maW5kX2RldmljZShidXMsIE5VTEwsICh2b2lkICopYnVzX2lkLCBwaHlfY29tcGFyZV9pZCk7Ci0KKwlkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoYnVzLCBOVUxMLCBidXNfaWQpOwogCWlmIChkKSB7CiAJCXBoeWRldiA9IHRvX3BoeV9kZXZpY2UoZCk7CiAJfSBlbHNlIHsKQEAgLTQxOSwxMyArNDEzLDE0IEBACiAgKgogICogRGVzY3JpcHRpb246IFdyaXRlcyBNSUlfQURWRVJUSVNFIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcywKICAqICAgYWZ0ZXIgc2FuaXRpemluZyB0aGUgdmFsdWVzIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IGFkdmVydGlzZQotICogICB3aGF0IGlzIHN1cHBvcnRlZC4KKyAqICAgd2hhdCBpcyBzdXBwb3J0ZWQuICBSZXR1cm5zIDwgMCBvbiBlcnJvciwgMCBpZiB0aGUgUEhZJ3MgYWR2ZXJ0aXNlbWVudAorICogICBoYXNuJ3QgY2hhbmdlZCwgYW5kID4gMCBpZiBpdCBoYXMgY2hhbmdlZC4KICAqLwogaW50IGdlbnBoeV9jb25maWdfYWR2ZXJ0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJdTMyIGFkdmVydGlzZTsKLQlpbnQgYWR2OwotCWludCBlcnI7CisJaW50IG9sZGFkdiwgYWR2OworCWludCBlcnIsIGNoYW5nZWQgPSAwOwogCiAJLyogT25seSBhbGxvdyBhZHZlcnRpc2luZyB3aGF0CiAJICogdGhpcyBQSFkgc3VwcG9ydHMgKi8KQEAgLTQzMyw3ICs0MjgsNyBAQAogCWFkdmVydGlzZSA9IHBoeWRldi0+YWR2ZXJ0aXNpbmc7CiAKIAkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2VtZW50ICovCi0JYWR2ID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQURWRVJUSVNFKTsKKwlvbGRhZHYgPSBhZHYgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9BRFZFUlRJU0UpOwogCiAJaWYgKGFkdiA8IDApCiAJCXJldHVybiBhZHY7CkBAIC00NTMsMTUgKzQ0OCwxOCBAQAogCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCiAJCWFkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKIAotCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9BRFZFUlRJU0UsIGFkdik7CisJaWYgKGFkdiAhPSBvbGRhZHYpIHsKKwkJZXJyID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJX0FEVkVSVElTRSwgYWR2KTsKIAotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWNoYW5nZWQgPSAxOworCX0KIAogCS8qIENvbmZpZ3VyZSBnaWdhYml0IGlmIGl0J3Mgc3VwcG9ydGVkICovCiAJaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CiAJCQkJU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKSkgewotCQlhZHYgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9DVFJMMTAwMCk7CisJCW9sZGFkdiA9IGFkdiA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0NUUkwxMDAwKTsKIAogCQlpZiAoYWR2IDwgMCkKIAkJCXJldHVybiBhZHY7CkBAIC00NzEsMTMgKzQ2OSwxNyBAQAogCQkJYWR2IHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKIAkJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKIAkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7Ci0JCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9DVFJMMTAwMCwgYWR2KTsKIAotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJCWlmIChhZHYgIT0gb2xkYWR2KSB7CisJCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQ1RSTDEwMDAsIGFkdik7CisKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQljaGFuZ2VkID0gMTsKKwkJfQogCX0KIAotCXJldHVybiBhZHY7CisJcmV0dXJuIGNoYW5nZWQ7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbnBoeV9jb25maWdfYWR2ZXJ0KTsKIApAQCAtNTQ5LDYgKzU1MSw3IEBACiAKIAlyZXR1cm4gY3RsOwogfQorRVhQT1JUX1NZTUJPTChnZW5waHlfcmVzdGFydF9hbmVnKTsKIAogCiAvKioKQEAgLTU2MSwxOSArNTY0LDIyIEBACiAgKi8KIGludCBnZW5waHlfY29uZmlnX2FuZWcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlpbnQgZXJyID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCWlmIChBVVRPTkVHX0VOQUJMRSA9PSBwaHlkZXYtPmF1dG9uZWcpIHsKLQkJZXJyID0gZ2VucGh5X2NvbmZpZ19hZHZlcnQocGh5ZGV2KTsKKwkJaW50IHJlc3VsdCA9IGdlbnBoeV9jb25maWdfYWR2ZXJ0KHBoeWRldik7CiAKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOworCQlpZiAocmVzdWx0IDwgMCkgLyogZXJyb3IgKi8KKwkJCXJldHVybiByZXN1bHQ7CiAKLQkJZXJyID0gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwaHlkZXYpOworCQkvKiBPbmx5IHJlc3RhcnQgYW5lZyBpZiB3ZSBhcmUgYWR2ZXJ0aXNpbmcgc29tZXRoaW5nIGRpZmZlcmVudAorCQkgKiB0aGFuIHdlIHdlcmUgYmVmb3JlLgkgKi8KKwkJaWYgKHJlc3VsdCA+IDApCisJCQlyZXN1bHQgPSBnZW5waHlfcmVzdGFydF9hbmVnKHBoeWRldik7CiAJfSBlbHNlCi0JCWVyciA9IGdlbnBoeV9zZXR1cF9mb3JjZWQocGh5ZGV2KTsKKwkJcmVzdWx0ID0gZ2VucGh5X3NldHVwX2ZvcmNlZChwaHlkZXYpOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcmVzdWx0OwogfQogRVhQT1JUX1NZTUJPTChnZW5waHlfY29uZmlnX2FuZWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwppbmRleCBkZGNjYzA3Li43ZTg1N2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKQEAgLTg2Niw4ICs4NjYsOCBAQAogCQkJZXJyID0gUFRSX0VSUihwcHBfY2xhc3MpOwogCQkJZ290byBvdXRfY2hyZGV2OwogCQl9Ci0JCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShwcHBfY2xhc3MsIE5VTEwsIE1LREVWKFBQUF9NQUpPUiwgMCksCi0JCQkJICAgICAgTlVMTCwgInBwcCIpOworCQlkZXZpY2VfY3JlYXRlKHBwcF9jbGFzcywgTlVMTCwgTUtERVYoUFBQX01BSk9SLCAwKSwgTlVMTCwKKwkJCSAgICAgICJwcHAiKTsKIAl9CiAKIG91dDoKQEAgLTE4MzMsOSArMTgzMywxMSBAQAogCiAJLyogSWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgbG9uZywgZG9uJ3Qgd2FpdCBhbnkgbG9uZ2VyIGZvciBwYWNrZXRzCiAJICAgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgcXVldWUuICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnBwcC0+bXJxKSA+PSBQUFBfTVBfTUFYX1FMRU4KLQkgICAgJiYgc2VxX2JlZm9yZShwcHAtPm1pbnNlcSwgcHBwLT5tcnEubmV4dC0+c2VxdWVuY2UpKQotCQlwcHAtPm1pbnNlcSA9IHBwcC0+bXJxLm5leHQtPnNlcXVlbmNlOworCWlmIChza2JfcXVldWVfbGVuKCZwcHAtPm1ycSkgPj0gUFBQX01QX01BWF9RTEVOKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmcHBwLT5tcnEpOworCQlpZiAoc2VxX2JlZm9yZShwcHAtPm1pbnNlcSwgc2tiLT5zZXF1ZW5jZSkpCisJCQlwcHAtPm1pbnNlcSA9IHNrYi0+c2VxdWVuY2U7CisJfQogCiAJLyogUHVsbCBjb21wbGV0ZWQgcGFja2V0cyBvZmYgdGhlIHF1ZXVlIGFuZCByZWNlaXZlIHRoZW0uICovCiAJd2hpbGUgKChza2IgPSBwcHBfbXBfcmVjb25zdHJ1Y3QocHBwKSkpCkBAIC0xODYxLDEwICsxODYzLDExIEBACiAKIAkvKiBOLkIuIHdlIGRvbid0IG5lZWQgdG8gbG9jayB0aGUgbGlzdCBsb2NrIGJlY2F1c2Ugd2UgaGF2ZSB0aGUKIAkgICBwcHAgdW5pdCByZWNlaXZlLXNpZGUgbG9jay4gKi8KLQlmb3IgKHAgPSBsaXN0LT5uZXh0OyBwICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKWxpc3Q7IHAgPSBwLT5uZXh0KQorCXNrYl9xdWV1ZV93YWxrKGxpc3QsIHApIHsKIAkJaWYgKHNlcV9iZWZvcmUoc2VxLCBwLT5zZXF1ZW5jZSkpCiAJCQlicmVhazsKLQlfX3NrYl9pbnNlcnQoc2tiLCBwLT5wcmV2LCBwLCBsaXN0KTsKKwl9CisJX19za2JfcXVldWVfYmVmb3JlKGxpc3QsIHAsIHNrYik7CiB9CiAKIC8qCkBAIC0yMTI0LDEzICsyMTI3LDkgQEAKIAkgICAgfHwgY2NwX29wdGlvblsxXSA8IDIgfHwgY2NwX29wdGlvblsxXSA+IGRhdGEubGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWNwID0gZmluZF9jb21wcmVzc29yKGNjcF9vcHRpb25bMF0pOwotI2lmZGVmIENPTkZJR19LTU9ECi0JaWYgKCFjcCkgewotCQlyZXF1ZXN0X21vZHVsZSgicHBwLWNvbXByZXNzLSVkIiwgY2NwX29wdGlvblswXSk7Ci0JCWNwID0gZmluZF9jb21wcmVzc29yKGNjcF9vcHRpb25bMF0pOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfS01PRCAqLworCWNwID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoCisJCWZpbmRfY29tcHJlc3NvcihjY3Bfb3B0aW9uWzBdKSwKKwkJInBwcC1jb21wcmVzcy0lZCIsIGNjcF9vcHRpb25bMF0pOwogCWlmICghY3ApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jIGIvZHJpdmVycy9uZXQvcHBwb2wydHAuYwppbmRleCBmZjE3NWU4Li4xODViMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9sMnRwLmMKQEAgLTM1Myw3ICszNTMsNyBAQAogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+cmVvcmRlcl9xLmxvY2spOwogCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnNlc3Npb24tPnJlb3JkZXJfcSwgc2ticCwgdG1wKSB7CiAJCWlmIChQUFBPTDJUUF9TS0JfQ0Ioc2ticCktPm5zID4gbnMpIHsKLQkJCV9fc2tiX2luc2VydChza2IsIHNrYnAtPnByZXYsIHNrYnAsICZzZXNzaW9uLT5yZW9yZGVyX3EpOworCQkJX19za2JfcXVldWVfYmVmb3JlKCZzZXNzaW9uLT5yZW9yZGVyX3EsIHNrYnAsIHNrYik7CiAJCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9MMlRQX01TR19TRVEsIEtFUk5fREVCVUcsCiAJCQkgICAgICAgIiVzOiBwa3QgJWh1LCBpbnNlcnRlZCBiZWZvcmUgJWh1LCByZW9yZGVyX3EgbGVuPSVkXG4iLAogCQkJICAgICAgIHNlc3Npb24tPm5hbWUsIG5zLCBQUFBPTDJUUF9TS0JfQ0Ioc2ticCktPm5zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb3guYyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKaW5kZXggYzY4OThjMS4uMDNhZWNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwb3guYworKysgYi9kcml2ZXJzL25ldC9wcHBveC5jCkBAIC0xMTUsMTMgKzExNSw4IEBACiAJCWdvdG8gb3V0OwogCiAJcmMgPSAtRVBST1RPTk9TVVBQT1JUOwotI2lmZGVmIENPTkZJR19LTU9ECi0JaWYgKCFwcHBveF9wcm90b3NbcHJvdG9jb2xdKSB7Ci0JCWNoYXIgYnVmZmVyWzMyXTsKLQkJc3ByaW50ZihidWZmZXIsICJwcHBveC1wcm90by0lZCIsIHByb3RvY29sKTsKLQkJcmVxdWVzdF9tb2R1bGUoYnVmZmVyKTsKLQl9Ci0jZW5kaWYKKwlpZiAoIXBwcG94X3Byb3Rvc1twcm90b2NvbF0pCisJCXJlcXVlc3RfbW9kdWxlKCJwcHBveC1wcm90by0lZCIsIHByb3RvY29sKTsKIAlpZiAoIXBwcG94X3Byb3Rvc1twcm90b2NvbF0gfHwKIAkgICAgIXRyeV9tb2R1bGVfZ2V0KHBwcG94X3Byb3Rvc1twcm90b2NvbF0tPm93bmVyKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcWxnZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE5NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBRbG9naWMgMTBHYkUgUENJIEV4cHJlc3MgZXRoZXJuZXQgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19RTEdFKSArPSBxbGdlLm8KKworcWxnZS1vYmpzIDo9IHFsZ2VfbWFpbi5vIHFsZ2VfZGJnLm8gcWxnZV9tcGkubyBxbGdlX2V0aHRvb2wubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmggYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODExNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlLmgKQEAgLTAsMCArMSwxNTkzIEBACisvKgorICogUUxvZ2ljIFFMQTQxeHggTklDIEhCQSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgIDIwMDMtMjAwNiBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBTZWUgTElDRU5TRS5xbGdlIGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgorICovCisjaWZuZGVmIF9RTEdFX0hfCisjZGVmaW5lIF9RTEdFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworLyoKKyAqIEdlbmVyYWwgZGVmaW5pdGlvbnMuLi4KKyAqLworI2RlZmluZSBEUlZfTkFNRSAgCSJxbGdlIgorI2RlZmluZSBEUlZfU1RSSU5HIAkiUUxvZ2ljIDEwIEdpZ2FiaXQgUENJLUUgRXRoZXJuZXQgRHJpdmVyICIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JInYxLjAwLjAwLWIzIgorCisjZGVmaW5lIFBGWCAicWxnZTogIgorI2RlZmluZSBRUFJJTlRLKHFkZXYsIG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pICAgICBcCisgICAgICAgZG8geyAgICAgICBcCisJaWYgKCEoKHFkZXYpLT5tc2dfZW5hYmxlICYgTkVUSUZfTVNHXyMjbmxldmVsKSkJCVwKKwkJOwkJCQkJCVwKKwllbHNlCQkJCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOXyMja2xldmVsLCAmKChxZGV2KS0+cGRldi0+ZGV2KSwJXAorCQkJICAgIiVzOiAiIGZtdCwgX19mdW5jX18sICMjYXJncyk7ICBcCisgICAgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBRTEdFX1ZFTkRPUl9JRCAgICAweDEwNzcKKyNkZWZpbmUgUUxHRV9ERVZJQ0VfSUQxICAgIDB4ODAxMgorI2RlZmluZSBRTEdFX0RFVklDRV9JRCAgIDB4ODAwMAorCisjZGVmaW5lIE1BWF9SWF9SSU5HUyAxMjgKKyNkZWZpbmUgTUFYX1RYX1JJTkdTIDEyOAorCisjZGVmaW5lIE5VTV9UWF9SSU5HX0VOVFJJRVMJMjU2CisjZGVmaW5lIE5VTV9SWF9SSU5HX0VOVFJJRVMJMjU2CisKKyNkZWZpbmUgTlVNX1NNQUxMX0JVRkZFUlMgICA1MTIKKyNkZWZpbmUgTlVNX0xBUkdFX0JVRkZFUlMgICA1MTIKKworI2RlZmluZSBTTUFMTF9CVUZGRVJfU0laRSAyNTYKKyNkZWZpbmUgTEFSR0VfQlVGRkVSX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lIE1BWF9TUExJVF9TSVpFIDEwMjMKKyNkZWZpbmUgUUxHRV9TQl9QQUQgMzIKKworI2RlZmluZSBERkxUX0NPQUxFU0NFX1dBSVQgMTAwCS8qIDEwMCB1c2VjIHdhaXQgZm9yIGNvYWxlc2NpbmcgKi8KKyNkZWZpbmUgTUFYX0lOVEVSX0ZSQU1FX1dBSVQgMTAJLyogMTAgdXNlYyBtYXggaW50ZXJmcmFtZS13YWl0IGZvciBjb2FsZXNjaW5nICovCisjZGVmaW5lIERGTFRfSU5URVJfRlJBTUVfV0FJVCAoTUFYX0lOVEVSX0ZSQU1FX1dBSVQvMikKKyNkZWZpbmUgVURFTEFZX0NPVU5UIDMKKyNkZWZpbmUgVURFTEFZX0RFTEFZIDEwCisKKworI2RlZmluZSBUWF9ERVNDX1BFUl9JT0NCIDgKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFncyB3ZSBoYW5kbGUgaXMgYmFzZWQKKyAqIG9uIFBBR0VfU0laRS4uLgorICovCisjaWYgKFBBR0VfU0hJRlQgPT0gMTIpIHx8IChQQUdFX1NISUZUID09IDEzKQkvKiA0ayAmIDhrIHBhZ2VzICovCisjZGVmaW5lIFRYX0RFU0NfUEVSX09BTCAoKE1BWF9TS0JfRlJBR1MgLSBUWF9ERVNDX1BFUl9JT0NCKSArIDIpCisjZWxzZSAvKiBhbGwgb3RoZXIgcGFnZSBzaXplcyAqLworI2RlZmluZSBUWF9ERVNDX1BFUl9PQUwgMAorI2VuZGlmCisKKyNkZWZpbmUgREJfUEFHRV9TSVpFIDQwOTYKKworLyoKKyAqIFByb2Nlc3NvciBBZGRyZXNzIFJlZ2lzdGVyIChQUk9DX0FERFIpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisKKwkvKiBNaXNjLiBzdHVmZiAqLworCU1BSUxCT1hfQ09VTlQgPSAxNiwKKworCVBST0NfQUREUl9SRFkgPSAoMSA8PCAzMSksCisJUFJPQ19BRERSX1IgPSAoMSA8PCAzMCksCisJUFJPQ19BRERSX0VSUiA9ICgxIDw8IDI5KSwKKwlQUk9DX0FERFJfREEgPSAoMSA8PCAyOCksCisJUFJPQ19BRERSX0ZVTkMwX01CSSA9IDB4MDAwMDExODAsCisJUFJPQ19BRERSX0ZVTkMwX01CTyA9IChQUk9DX0FERFJfRlVOQzBfTUJJICsgTUFJTEJPWF9DT1VOVCksCisJUFJPQ19BRERSX0ZVTkMwX0NUTCA9IDB4MDAwMDExYTEsCisJUFJPQ19BRERSX0ZVTkMyX01CSSA9IDB4MDAwMDEyODAsCisJUFJPQ19BRERSX0ZVTkMyX01CTyA9IChQUk9DX0FERFJfRlVOQzJfTUJJICsgTUFJTEJPWF9DT1VOVCksCisJUFJPQ19BRERSX0ZVTkMyX0NUTCA9IDB4MDAwMDEyYTEsCisJUFJPQ19BRERSX01QSV9SSVNDID0gMHgwMDAwMDAwMCwKKwlQUk9DX0FERFJfTURFID0gMHgwMDAxMDAwMCwKKwlQUk9DX0FERFJfUkVHQkxPQ0sgPSAweDAwMDIwMDAwLAorCVBST0NfQUREUl9SSVNDX1JFRyA9IDB4MDAwMzAwMDAsCit9OworCisvKgorICogU3lzdGVtIFJlZ2lzdGVyIChTWVMpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJU1lTX0VGRSA9ICgxIDw8IDApLAorCVNZU19GQUUgPSAoMSA8PCAxKSwKKwlTWVNfTURDID0gKDEgPDwgMiksCisJU1lTX0RTVCA9ICgxIDw8IDMpLAorCVNZU19EV0MgPSAoMSA8PCA0KSwKKwlTWVNfRVZXID0gKDEgPDwgNSksCisJU1lTX09NUF9ETFlfTUFTSyA9IDB4M2YwMDAwMDAsCisJLyoKKwkgKiBUaGVyZSBhcmUgbm8gdmFsdWVzIGRlZmluZWQgYXMgb2YgZWRpdCAjMTUuCisJICovCisJU1lTX09ESSA9ICgxIDw8IDE0KSwKK307CisKKy8qCisgKiAgUmVzZXQvRmFpbG92ZXIgUmVnaXN0ZXIgKFJTVF9GTykgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlSU1RfRk9fVEZPID0gKDEgPDwgMCksCisJUlNUX0ZPX1JSX01BU0sgPSAweDAwMDYwMDAwLAorCVJTVF9GT19SUl9DUV9DQU0gPSAweDAwMDAwMDAwLAorCVJTVF9GT19SUl9EUk9QID0gMHgwMDAwMDAwMSwKKwlSU1RfRk9fUlJfRFEgPSAweDAwMDAwMDAyLAorCVJTVF9GT19SUl9SQ1ZfRlVOQ19DUSA9IDB4MDAwMDAwMDMsCisJUlNUX0ZPX0ZSQiA9ICgxIDw8IDEyKSwKKwlSU1RfRk9fTU9QID0gKDEgPDwgMTMpLAorCVJTVF9GT19SRUcgPSAoMSA8PCAxNCksCisJUlNUX0ZPX0ZSID0gKDEgPDwgMTUpLAorfTsKKworLyoKKyAqIEZ1bmN0aW9uIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKEZTQykgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlGU0NfREJSU1RfTUFTSyA9IDB4MDAwNzAwMDAsCisJRlNDX0RCUlNUXzI1NiA9IDB4MDAwMDAwMDAsCisJRlNDX0RCUlNUXzUxMiA9IDB4MDAwMDAwMDEsCisJRlNDX0RCUlNUXzc2OCA9IDB4MDAwMDAwMDIsCisJRlNDX0RCUlNUXzEwMjQgPSAweDAwMDAwMDAzLAorCUZTQ19EQkxfTUFTSyA9IDB4MDAxODAwMDAsCisJRlNDX0RCTF9EQlJTVCA9IDB4MDAwMDAwMDAsCisJRlNDX0RCTF9NQVhfUExEID0gMHgwMDAwMDAwOCwKKwlGU0NfREJMX01BWF9CUlNUID0gMHgwMDAwMDAxMCwKKwlGU0NfREJMXzEyOF9CWVRFUyA9IDB4MDAwMDAwMTgsCisJRlNDX0VDID0gKDEgPDwgNSksCisJRlNDX0VQQ19NQVNLID0gMHgwMGMwMDAwMCwKKwlGU0NfRVBDX0lOQk9VTkQgPSAoMSA8PCA2KSwKKwlGU0NfRVBDX09VVEJPVU5EID0gKDEgPDwgNyksCisJRlNDX1ZNX1BBR0VTSVpFX01BU0sgPSAweDA3MDAwMDAwLAorCUZTQ19WTV9QQUdFXzJLID0gMHgwMDAwMDEwMCwKKwlGU0NfVk1fUEFHRV80SyA9IDB4MDAwMDAyMDAsCisJRlNDX1ZNX1BBR0VfOEsgPSAweDAwMDAwMzAwLAorCUZTQ19WTV9QQUdFXzY0SyA9IDB4MDAwMDA2MDAsCisJRlNDX1NIID0gKDEgPDwgMTEpLAorCUZTQ19EU0IgPSAoMSA8PCAxMiksCisJRlNDX1NURSA9ICgxIDw8IDEzKSwKKwlGU0NfRkUgPSAoMSA8PCAxNSksCit9OworCisvKgorICogIEhvc3QgQ29tbWFuZCBTdGF0dXMgUmVnaXN0ZXIgKENTUikgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlDU1JfRVJSX1NUU19NQVNLID0gMHgwMDAwMDAzZiwKKwkvKgorCSAqIFRoZXJlIGFyZSBubyB2YWx1ZWQgZGVmaW5lZCBhcyBvZiBlZGl0ICMxNS4KKwkgKi8KKwlDU1JfUlIgPSAoMSA8PCA4KSwKKwlDU1JfSFJJID0gKDEgPDwgOSksCisJQ1NSX1JQID0gKDEgPDwgMTApLAorCUNTUl9DTURfUEFSTV9TSElGVCA9IDIyLAorCUNTUl9DTURfTk9QID0gMHgwMDAwMDAwMCwKKwlDU1JfQ01EX1NFVF9SU1QgPSAweDEwMDAwMDAsCisJQ1NSX0NNRF9DTFJfUlNUID0gMHgyMDAwMDAwMCwKKwlDU1JfQ01EX1NFVF9QQVVTRSA9IDB4MzAwMDAwMDAsCisJQ1NSX0NNRF9DTFJfUEFVU0UgPSAweDQwMDAwMDAwLAorCUNTUl9DTURfU0VUX0gyUl9JTlQgPSAweDUwMDAwMDAwLAorCUNTUl9DTURfQ0xSX0gyUl9JTlQgPSAweDYwMDAwMDAwLAorCUNTUl9DTURfUEFSX0VOID0gMHg3MDAwMDAwMCwKKwlDU1JfQ01EX1NFVF9CQURfUEFSID0gMHg4MDAwMDAwMCwKKwlDU1JfQ01EX0NMUl9CQURfUEFSID0gMHg5MDAwMDAwMCwKKwlDU1JfQ01EX0NMUl9SMlBDSV9JTlQgPSAweGEwMDAwMDAwLAorfTsKKworLyoKKyAqICBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChDRkcpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJQ0ZHX0xSUSA9ICgxIDw8IDApLAorCUNGR19EUlEgPSAoMSA8PCAxKSwKKwlDRkdfTFIgPSAoMSA8PCAyKSwKKwlDRkdfRFIgPSAoMSA8PCAzKSwKKwlDRkdfTEUgPSAoMSA8PCA1KSwKKwlDRkdfTENRID0gKDEgPDwgNiksCisJQ0ZHX0RDUSA9ICgxIDw8IDcpLAorCUNGR19RX1NISUZUID0gOCwKKwlDRkdfUV9NQVNLID0gMHg3ZjAwMDAwMCwKK307CisKKy8qCisgKiAgU3RhdHVzIFJlZ2lzdGVyIChTVFMpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJU1RTX0ZFID0gKDEgPDwgMCksCisJU1RTX1BJID0gKDEgPDwgMSksCisJU1RTX1BMMCA9ICgxIDw8IDIpLAorCVNUU19QTDEgPSAoMSA8PCAzKSwKKwlTVFNfUEkwID0gKDEgPDwgNCksCisJU1RTX1BJMSA9ICgxIDw8IDUpLAorCVNUU19GVU5DX0lEX01BU0sgPSAweDAwMDAwMGMwLAorCVNUU19GVU5DX0lEX1NISUZUID0gNiwKKwlTVFNfRjBFID0gKDEgPDwgOCksCisJU1RTX0YxRSA9ICgxIDw8IDkpLAorCVNUU19GMkUgPSAoMSA8PCAxMCksCisJU1RTX0YzRSA9ICgxIDw8IDExKSwKKwlTVFNfTkZFID0gKDEgPDwgMTIpLAorfTsKKworLyoKKyAqIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKElOVFJfRU4pIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJSU5UUl9FTl9JTlRSX01BU0sgPSAweDAwN2YwMDAwLAorCUlOVFJfRU5fVFlQRV9NQVNLID0gMHgwMzAwMDAwMCwKKwlJTlRSX0VOX1RZUEVfRU5BQkxFID0gMHgwMDAwMDEwMCwKKwlJTlRSX0VOX1RZUEVfRElTQUJMRSA9IDB4MDAwMDAyMDAsCisJSU5UUl9FTl9UWVBFX1JFQUQgPSAweDAwMDAwMzAwLAorCUlOVFJfRU5fSUhEID0gKDEgPDwgMTMpLAorCUlOVFJfRU5fSUhEX01BU0sgPSAoSU5UUl9FTl9JSEQgPDwgMTYpLAorCUlOVFJfRU5fRUkgPSAoMSA8PCAxNCksCisJSU5UUl9FTl9FTiA9ICgxIDw8IDE1KSwKK307CisKKy8qCisgKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAoSU5UUl9NQVNLKSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KK2VudW0geworCUlOVFJfTUFTS19QSSA9ICgxIDw8IDApLAorCUlOVFJfTUFTS19ITDAgPSAoMSA8PCAxKSwKKwlJTlRSX01BU0tfTEgwID0gKDEgPDwgMiksCisJSU5UUl9NQVNLX0hMMSA9ICgxIDw8IDMpLAorCUlOVFJfTUFTS19MSDEgPSAoMSA8PCA0KSwKKwlJTlRSX01BU0tfU0UgPSAoMSA8PCA1KSwKKwlJTlRSX01BU0tfTFNDID0gKDEgPDwgNiksCisJSU5UUl9NQVNLX01DID0gKDEgPDwgNyksCisJSU5UUl9NQVNLX0xJTktfSVJRUyA9IElOVFJfTUFTS19MU0MgfCBJTlRSX01BU0tfU0UgfCBJTlRSX01BU0tfTUMsCit9OworCisvKgorICogIFJlZ2lzdGVyIChSRVZfSUQpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJUkVWX0lEX01BU0sgPSAweDAwMDAwMDBmLAorCVJFVl9JRF9OSUNST0xMX1NISUZUID0gMCwKKwlSRVZfSURfTklDUkVWX1NISUZUID0gNCwKKwlSRVZfSURfWEdST0xMX1NISUZUID0gOCwKKwlSRVZfSURfWEdSRVZfU0hJRlQgPSAxMiwKKwlSRVZfSURfQ0hJUFJFVl9TSElGVCA9IDI4LAorfTsKKworLyoKKyAqICBGb3JjZSBFQ0MgRXJyb3IgUmVnaXN0ZXIgKEZSQ19FQ0NfRVJSKSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KK2VudW0geworCUZSQ19FQ0NfRVJSX1ZXID0gKDEgPDwgMTIpLAorCUZSQ19FQ0NfRVJSX1ZCID0gKDEgPDwgMTMpLAorCUZSQ19FQ0NfRVJSX05JID0gKDEgPDwgMTQpLAorCUZSQ19FQ0NfRVJSX05PID0gKDEgPDwgMTUpLAorCUZSQ19FQ0NfUEZFX1NISUZUID0gMTYsCisJRlJDX0VDQ19FUlJfRE8gPSAoMSA8PCAxOCksCisJRlJDX0VDQ19QMTQgPSAoMSA8PCAxOSksCit9OworCisvKgorICogIEVycm9yIFN0YXR1cyBSZWdpc3RlciAoRVJSX1NUUykgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlFUlJfU1RTX05PRiA9ICgxIDw8IDApLAorCUVSUl9TVFNfTklGID0gKDEgPDwgMSksCisJRVJSX1NUU19EUlAgPSAoMSA8PCAyKSwKKwlFUlJfU1RTX1hHUCA9ICgxIDw8IDMpLAorCUVSUl9TVFNfRk9VID0gKDEgPDwgNCksCisJRVJSX1NUU19GT0MgPSAoMSA8PCA1KSwKKwlFUlJfU1RTX0ZPRiA9ICgxIDw8IDYpLAorCUVSUl9TVFNfRklVID0gKDEgPDwgNyksCisJRVJSX1NUU19GSUMgPSAoMSA8PCA4KSwKKwlFUlJfU1RTX0ZJRiA9ICgxIDw8IDkpLAorCUVSUl9TVFNfTU9GID0gKDEgPDwgMTApLAorCUVSUl9TVFNfVEEgPSAoMSA8PCAxMSksCisJRVJSX1NUU19NQSA9ICgxIDw8IDEyKSwKKwlFUlJfU1RTX01QRSA9ICgxIDw8IDEzKSwKKwlFUlJfU1RTX1NDRSA9ICgxIDw8IDE0KSwKKwlFUlJfU1RTX1NURSA9ICgxIDw8IDE1KSwKKwlFUlJfU1RTX0ZPVyA9ICgxIDw8IDE2KSwKKwlFUlJfU1RTX1VFID0gKDEgPDwgMTcpLAorCUVSUl9TVFNfTUNIID0gKDEgPDwgMjYpLAorCUVSUl9TVFNfTE9DX1NISUZUID0gMjcsCit9OworCisvKgorICogIFJBTSBEZWJ1ZyBBZGRyZXNzIFJlZ2lzdGVyIChSQU1fREJHX0FERFIpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJUkFNX0RCR19BRERSX0ZXID0gKDEgPDwgMzApLAorCVJBTV9EQkdfQUREUl9GUiA9ICgxIDw8IDMxKSwKK307CisKKy8qCisgKiBTZW1hcGhvcmUgUmVnaXN0ZXIgKFNFTSkgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwkvKgorCSAqIEV4YW1wbGU6CisJICogcmVnID0gU0VNX1hHTUFDMF9NQVNLIHwgKFNFTV9TRVQgPDwgU0VNX1hHTUFDMF9TSElGVCkKKwkgKi8KKwlTRU1fQ0xFQVIgPSAwLAorCVNFTV9TRVQgPSAxLAorCVNFTV9GT1JDRSA9IDMsCisJU0VNX1hHTUFDMF9TSElGVCA9IDAsCisJU0VNX1hHTUFDMV9TSElGVCA9IDIsCisJU0VNX0lDQl9TSElGVCA9IDQsCisJU0VNX01BQ19BRERSX1NISUZUID0gNiwKKwlTRU1fRkxBU0hfU0hJRlQgPSA4LAorCVNFTV9QUk9CRV9TSElGVCA9IDEwLAorCVNFTV9SVF9JRFhfU0hJRlQgPSAxMiwKKwlTRU1fUFJPQ19SRUdfU0hJRlQgPSAxNCwKKwlTRU1fWEdNQUMwX01BU0sgPSAweDAwMDMwMDAwLAorCVNFTV9YR01BQzFfTUFTSyA9IDB4MDAwYzAwMDAsCisJU0VNX0lDQl9NQVNLID0gMHgwMDMwMDAwMCwKKwlTRU1fTUFDX0FERFJfTUFTSyA9IDB4MDBjMDAwMDAsCisJU0VNX0ZMQVNIX01BU0sgPSAweDAzMDAwMDAwLAorCVNFTV9QUk9CRV9NQVNLID0gMHgwYzAwMDAwMCwKKwlTRU1fUlRfSURYX01BU0sgPSAweDMwMDAwMDAwLAorCVNFTV9QUk9DX1JFR19NQVNLID0gMHhjMDAwMDAwMCwKK307CisKKy8qCisgKiAgMTBHIE1BQyBBZGRyZXNzICBSZWdpc3RlciAoWEdNQUNfQUREUikgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlYR01BQ19BRERSX1JEWSA9ICgxIDw8IDMxKSwKKwlYR01BQ19BRERSX1IgPSAoMSA8PCAzMCksCisJWEdNQUNfQUREUl9YTUUgPSAoMSA8PCAyOSksCisKKwkvKiBYR01BQyBjb250cm9sIHJlZ2lzdGVycyAqLworCVBBVVNFX1NSQ19MTyA9IDB4MDAwMDAxMDAsCisJUEFVU0VfU1JDX0hJID0gMHgwMDAwMDEwNCwKKwlHTE9CQUxfQ0ZHID0gMHgwMDAwMDEwOCwKKwlHTE9CQUxfQ0ZHX1JFU0VUID0gKDEgPDwgMCksCisJR0xPQkFMX0NGR19KVU1CTyA9ICgxIDw8IDYpLAorCUdMT0JBTF9DRkdfVFhfU1RBVF9FTiA9ICgxIDw8IDEwKSwKKwlHTE9CQUxfQ0ZHX1JYX1NUQVRfRU4gPSAoMSA8PCAxMSksCisJVFhfQ0ZHID0gMHgwMDAwMDEwYywKKwlUWF9DRkdfUkVTRVQgPSAoMSA8PCAwKSwKKwlUWF9DRkdfRU4gPSAoMSA8PCAxKSwKKwlUWF9DRkdfUFJFQU0gPSAoMSA8PCAyKSwKKwlSWF9DRkcgPSAweDAwMDAwMTEwLAorCVJYX0NGR19SRVNFVCA9ICgxIDw8IDApLAorCVJYX0NGR19FTiA9ICgxIDw8IDEpLAorCVJYX0NGR19QUkVBTSA9ICgxIDw8IDIpLAorCUZMT1dfQ1RMID0gMHgwMDAwMDExYywKKwlQQVVTRV9PUENPREUgPSAweDAwMDAwMTIwLAorCVBBVVNFX1RJTUVSID0gMHgwMDAwMDEyNCwKKwlQQVVTRV9GUk1fREVTVF9MTyA9IDB4MDAwMDAxMjgsCisJUEFVU0VfRlJNX0RFU1RfSEkgPSAweDAwMDAwMTJjLAorCU1BQ19UWF9QQVJBTVMgPSAweDAwMDAwMTM0LAorCU1BQ19UWF9QQVJBTVNfSlVNQk8gPSAoMSA8PCAzMSksCisJTUFDX1RYX1BBUkFNU19TSVpFX1NISUZUID0gMTYsCisJTUFDX1JYX1BBUkFNUyA9IDB4MDAwMDAxMzgsCisJTUFDX1NZU19JTlQgPSAweDAwMDAwMTQ0LAorCU1BQ19TWVNfSU5UX01BU0sgPSAweDAwMDAwMTQ4LAorCU1BQ19NR01UX0lOVCA9IDB4MDAwMDAxNGMsCisJTUFDX01HTVRfSU5fTUFTSyA9IDB4MDAwMDAxNTAsCisJRVhUX0FSQl9NT0RFID0gMHgwMDAwMDFmYywKKworCS8qIFhHTUFDIFRYIHN0YXRpc3RpY3MgIHJlZ2lzdGVycyAqLworCVRYX1BLVFMgPSAweDAwMDAwMjAwLAorCVRYX0JZVEVTID0gMHgwMDAwMDIwOCwKKwlUWF9NQ0FTVF9QS1RTID0gMHgwMDAwMDIxMCwKKwlUWF9CQ0FTVF9QS1RTID0gMHgwMDAwMDIxOCwKKwlUWF9VQ0FTVF9QS1RTID0gMHgwMDAwMDIyMCwKKwlUWF9DVExfUEtUUyA9IDB4MDAwMDAyMjgsCisJVFhfUEFVU0VfUEtUUyA9IDB4MDAwMDAyMzAsCisJVFhfNjRfUEtUID0gMHgwMDAwMDIzOCwKKwlUWF82NV9UT18xMjdfUEtUID0gMHgwMDAwMDI0MCwKKwlUWF8xMjhfVE9fMjU1X1BLVCA9IDB4MDAwMDAyNDgsCisJVFhfMjU2XzUxMV9QS1QgPSAweDAwMDAwMjUwLAorCVRYXzUxMl9UT18xMDIzX1BLVCA9IDB4MDAwMDAyNTgsCisJVFhfMTAyNF9UT18xNTE4X1BLVCA9IDB4MDAwMDAyNjAsCisJVFhfMTUxOV9UT19NQVhfUEtUID0gMHgwMDAwMDI2OCwKKwlUWF9VTkRFUlNJWkVfUEtUID0gMHgwMDAwMDI3MCwKKwlUWF9PVkVSU0laRV9QS1QgPSAweDAwMDAwMjc4LAorCisJLyogWEdNQUMgc3RhdGlzdGljcyBjb250cm9sIHJlZ2lzdGVycyAqLworCVJYX0hBTEZfRlVMTF9ERVQgPSAweDAwMDAwMmEwLAorCVRYX0hBTEZfRlVMTF9ERVQgPSAweDAwMDAwMmE0LAorCVJYX09WRVJGTE9XX0RFVCA9IDB4MDAwMDAyYTgsCisJVFhfT1ZFUkZMT1dfREVUID0gMHgwMDAwMDJhYywKKwlSWF9IQUxGX0ZVTExfTUFTSyA9IDB4MDAwMDAyYjAsCisJVFhfSEFMRl9GVUxMX01BU0sgPSAweDAwMDAwMmI0LAorCVJYX09WRVJGTE9XX01BU0sgPSAweDAwMDAwMmI4LAorCVRYX09WRVJGTE9XX01BU0sgPSAweDAwMDAwMmJjLAorCVNUQVRfQ05UX0NUTCA9IDB4MDAwMDAyYzAsCisJU1RBVF9DTlRfQ1RMX0NMRUFSX1RYID0gKDEgPDwgMCksCisJU1RBVF9DTlRfQ1RMX0NMRUFSX1JYID0gKDEgPDwgMSksCisJQVVYX1JYX0hBTEZfRlVMTF9ERVQgPSAweDAwMDAwMmQwLAorCUFVWF9UWF9IQUxGX0ZVTExfREVUID0gMHgwMDAwMDJkNCwKKwlBVVhfUlhfT1ZFUkZMT1dfREVUID0gMHgwMDAwMDJkOCwKKwlBVVhfVFhfT1ZFUkZMT1dfREVUID0gMHgwMDAwMDJkYywKKwlBVVhfUlhfSEFMRl9GVUxMX01BU0sgPSAweDAwMDAwMmYwLAorCUFVWF9UWF9IQUxGX0ZVTExfTUFTSyA9IDB4MDAwMDAyZjQsCisJQVVYX1JYX09WRVJGTE9XX01BU0sgPSAweDAwMDAwMmY4LAorCUFVWF9UWF9PVkVSRkxPV19NQVNLID0gMHgwMDAwMDJmYywKKworCS8qIFhHTUFDIFJYIHN0YXRpc3RpY3MgIHJlZ2lzdGVycyAqLworCVJYX0JZVEVTID0gMHgwMDAwMDMwMCwKKwlSWF9CWVRFU19PSyA9IDB4MDAwMDAzMDgsCisJUlhfUEtUUyA9IDB4MDAwMDAzMTAsCisJUlhfUEtUU19PSyA9IDB4MDAwMDAzMTgsCisJUlhfQkNBU1RfUEtUUyA9IDB4MDAwMDAzMjAsCisJUlhfTUNBU1RfUEtUUyA9IDB4MDAwMDAzMjgsCisJUlhfVUNBU1RfUEtUUyA9IDB4MDAwMDAzMzAsCisJUlhfVU5ERVJTSVpFX1BLVFMgPSAweDAwMDAwMzM4LAorCVJYX09WRVJTSVpFX1BLVFMgPSAweDAwMDAwMzQwLAorCVJYX0pBQkJFUl9QS1RTID0gMHgwMDAwMDM0OCwKKwlSWF9VTkRFUlNJWkVfRkNFUlJfUEtUUyA9IDB4MDAwMDAzNTAsCisJUlhfRFJPUF9FVkVOVFMgPSAweDAwMDAwMzU4LAorCVJYX0ZDRVJSX1BLVFMgPSAweDAwMDAwMzYwLAorCVJYX0FMSUdOX0VSUiA9IDB4MDAwMDAzNjgsCisJUlhfU1lNQk9MX0VSUiA9IDB4MDAwMDAzNzAsCisJUlhfTUFDX0VSUiA9IDB4MDAwMDAzNzgsCisJUlhfQ1RMX1BLVFMgPSAweDAwMDAwMzgwLAorCVJYX1BBVVNFX1BLVFMgPSAweDAwMDAwMzg0LAorCVJYXzY0X1BLVFMgPSAweDAwMDAwMzkwLAorCVJYXzY1X1RPXzEyN19QS1RTID0gMHgwMDAwMDM5OCwKKwlSWF8xMjhfMjU1X1BLVFMgPSAweDAwMDAwM2EwLAorCVJYXzI1Nl81MTFfUEtUUyA9IDB4MDAwMDAzYTgsCisJUlhfNTEyX1RPXzEwMjNfUEtUUyA9IDB4MDAwMDAzYjAsCisJUlhfMTAyNF9UT18xNTE4X1BLVFMgPSAweDAwMDAwM2I4LAorCVJYXzE1MTlfVE9fTUFYX1BLVFMgPSAweDAwMDAwM2MwLAorCVJYX0xFTl9FUlJfUEtUUyA9IDB4MDAwMDAzYzgsCisKKwkvKiBYR01BQyBNRElPIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJTURJT19UWF9EQVRBID0gMHgwMDAwMDQwMCwKKwlNRElPX1JYX0RBVEEgPSAweDAwMDAwNDEwLAorCU1ESU9fQ01EID0gMHgwMDAwMDQyMCwKKwlNRElPX1BIWV9BRERSID0gMHgwMDAwMDQzMCwKKwlNRElPX1BPUlQgPSAweDAwMDAwNDQwLAorCU1ESU9fU1RBVFVTID0gMHgwMDAwMDQ1MCwKKworCS8qIFhHTUFDIEFVWCBzdGF0aXN0aWNzICByZWdpc3RlcnMgKi8KK307CisKKy8qCisgKiAgRW5oYW5jZWQgVHJhbnNtaXNzaW9uIFNjaGVkdWxlIFJlZ2lzdGVycyAoTklDX0VUUyxDTkFfRVRTKSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KK2VudW0geworCUVUU19RVUVVRV9TSElGVCA9IDI5LAorCUVUU19SRUYgPSAoMSA8PCAyNiksCisJRVRTX1JTID0gKDEgPDwgMjcpLAorCUVUU19QID0gKDEgPDwgMjgpLAorCUVUU19GQ19DT1NfU0hJRlQgPSAyMywKK307CisKKy8qCisgKiAgRmxhc2ggQWRkcmVzcyBSZWdpc3RlciAoRkxBU0hfQUREUikgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlGTEFTSF9BRERSX1JEWSA9ICgxIDw8IDMxKSwKKwlGTEFTSF9BRERSX1IgPSAoMSA8PCAzMCksCisJRkxBU0hfQUREUl9FUlIgPSAoMSA8PCAyOSksCit9OworCisvKgorICogIFN0b3AgQ1EgUHJvY2Vzc2luZyBSZWdpc3RlciAoQ1FfU1RPUCkgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlDUV9TVE9QX1FVRVVFX01BU0sgPSAoMHgwMDdmMDAwMCksCisJQ1FfU1RPUF9UWVBFX01BU0sgPSAoMHgwMzAwMDAwMCksCisJQ1FfU1RPUF9UWVBFX1NUQVJUID0gMHgwMDAwMDEwMCwKKwlDUV9TVE9QX1RZUEVfU1RPUCA9IDB4MDAwMDAyMDAsCisJQ1FfU1RPUF9UWVBFX1JFQUQgPSAweDAwMDAwMzAwLAorCUNRX1NUT1BfRU4gPSAoMSA8PCAxNSksCit9OworCisvKgorICogIE1BQyBQcm90b2NvbCBBZGRyZXNzIEluZGV4IFJlZ2lzdGVyIChNQUNfQUREUl9JRFgpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJTUFDX0FERFJfSURYX1NISUZUID0gNCwKKwlNQUNfQUREUl9UWVBFX1NISUZUID0gMTYsCisJTUFDX0FERFJfVFlQRV9NQVNLID0gMHgwMDBmMDAwMCwKKwlNQUNfQUREUl9UWVBFX0NBTV9NQUMgPSAweDAwMDAwMDAwLAorCU1BQ19BRERSX1RZUEVfTVVMVElfTUFDID0gMHgwMDAxMDAwMCwKKwlNQUNfQUREUl9UWVBFX1ZMQU4gPSAweDAwMDIwMDAwLAorCU1BQ19BRERSX1RZUEVfTVVMVElfRkxUUiA9IDB4MDAwMzAwMDAsCisJTUFDX0FERFJfVFlQRV9GQ19NQUMgPSAweDAwMDQwMDAwLAorCU1BQ19BRERSX1RZUEVfTUdNVF9NQUMgPSAweDAwMDUwMDAwLAorCU1BQ19BRERSX1RZUEVfTUdNVF9WTEFOID0gMHgwMDA2MDAwMCwKKwlNQUNfQUREUl9UWVBFX01HTVRfVjQgPSAweDAwMDcwMDAwLAorCU1BQ19BRERSX1RZUEVfTUdNVF9WNiA9IDB4MDAwODAwMDAsCisJTUFDX0FERFJfVFlQRV9NR01UX1RVX0RQID0gMHgwMDA5MDAwMCwKKwlNQUNfQUREUl9BRFIgPSAoMSA8PCAyNSksCisJTUFDX0FERFJfUlMgPSAoMSA8PCAyNiksCisJTUFDX0FERFJfRSA9ICgxIDw8IDI3KSwKKwlNQUNfQUREUl9NUiA9ICgxIDw8IDMwKSwKKwlNQUNfQUREUl9NVyA9ICgxIDw8IDMxKSwKKwlNQVhfTVVMVElDQVNUX0VOVFJJRVMgPSAzMiwKK307CisKKy8qCisgKiAgTUFDIFByb3RvY29sIEFkZHJlc3MgSW5kZXggUmVnaXN0ZXIgKFNQTFRfSERSKSBiaXQgZGVmaW5pdGlvbnMuCisgKi8KK2VudW0geworCVNQTFRfSERSX0VQID0gKDEgPDwgMzEpLAorfTsKKworLyoKKyAqICBGQ29FIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoRkNfUkNWX0NGRykgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlGQ19SQ1ZfQ0ZHX0VDVCA9ICgxIDw8IDE1KSwKKwlGQ19SQ1ZfQ0ZHX0RGSCA9ICgxIDw8IDIwKSwKKwlGQ19SQ1ZfQ0ZHX0RWRiA9ICgxIDw8IDIxKSwKKwlGQ19SQ1ZfQ0ZHX1JDRSA9ICgxIDw8IDI3KSwKKwlGQ19SQ1ZfQ0ZHX1JGRSA9ICgxIDw8IDI4KSwKKwlGQ19SQ1ZfQ0ZHX1RFRSA9ICgxIDw8IDI5KSwKKwlGQ19SQ1ZfQ0ZHX1RDRSA9ICgxIDw8IDMwKSwKKwlGQ19SQ1ZfQ0ZHX1RGRSA9ICgxIDw8IDMxKSwKK307CisKKy8qCisgKiAgTklDIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoTklDX1JDVl9DRkcpIGJpdCBkZWZpbml0aW9ucy4KKyAqLworZW51bSB7CisJTklDX1JDVl9DRkdfUFBFID0gKDEgPDwgMCksCisJTklDX1JDVl9DRkdfVkxBTl9NQVNLID0gMHgwMDA2MDAwMCwKKwlOSUNfUkNWX0NGR19WTEFOX0FMTCA9IDB4MDAwMDAwMDAsCisJTklDX1JDVl9DRkdfVkxBTl9NQVRDSF9PTkxZID0gMHgwMDAwMDAwMiwKKwlOSUNfUkNWX0NGR19WTEFOX01BVENIX0FORF9OT04gPSAweDAwMDAwMDA0LAorCU5JQ19SQ1ZfQ0ZHX1ZMQU5fTk9ORV9BTkRfTk9OID0gMHgwMDAwMDAwNiwKKwlOSUNfUkNWX0NGR19SViA9ICgxIDw8IDMpLAorCU5JQ19SQ1ZfQ0ZHX0RGUV9NQVNLID0gKDB4N2YwMDAwMDApLAorCU5JQ19SQ1ZfQ0ZHX0RGUV9TSElGVCA9IDgsCisJTklDX1JDVl9DRkdfREZRID0gMCwJLyogSEFSRENPREUgZGVmYXVsdCBxdWV1ZSB0byAwLiAqLworfTsKKworLyoKKyAqICAgTWdtdCBSZWNlaXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKE1HTVRfUkNWX0NGRykgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlNR01UX1JDVl9DRkdfQVJQID0gKDEgPDwgMCksCisJTUdNVF9SQ1ZfQ0ZHX0RIQyA9ICgxIDw8IDEpLAorCU1HTVRfUkNWX0NGR19ESFMgPSAoMSA8PCAyKSwKKwlNR01UX1JDVl9DRkdfTlAgPSAoMSA8PCAzKSwKKwlNR01UX1JDVl9DRkdfSTZOID0gKDEgPDwgNCksCisJTUdNVF9SQ1ZfQ0ZHX0k2UiA9ICgxIDw8IDUpLAorCU1HTVRfUkNWX0NGR19ESDYgPSAoMSA8PCA2KSwKKwlNR01UX1JDVl9DRkdfVUQxID0gKDEgPDwgNyksCisJTUdNVF9SQ1ZfQ0ZHX1VEMCA9ICgxIDw8IDgpLAorCU1HTVRfUkNWX0NGR19CQ1QgPSAoMSA8PCA5KSwKKwlNR01UX1JDVl9DRkdfTUNUID0gKDEgPDwgMTApLAorCU1HTVRfUkNWX0NGR19ETSA9ICgxIDw8IDExKSwKKwlNR01UX1JDVl9DRkdfUk0gPSAoMSA8PCAxMiksCisJTUdNVF9SQ1ZfQ0ZHX1NUTCA9ICgxIDw8IDEzKSwKKwlNR01UX1JDVl9DRkdfVkxBTl9NQVNLID0gMHhjMDAwMDAwMCwKKwlNR01UX1JDVl9DRkdfVkxBTl9BTEwgPSAweDAwMDAwMDAwLAorCU1HTVRfUkNWX0NGR19WTEFOX01BVENIX09OTFkgPSAweDAwMDA0MDAwLAorCU1HTVRfUkNWX0NGR19WTEFOX01BVENIX0FORF9OT04gPSAweDAwMDA4MDAwLAorCU1HTVRfUkNWX0NGR19WTEFOX05PTkVfQU5EX05PTiA9IDB4MDAwMGMwMDAsCit9OworCisvKgorICogIFJvdXRpbmcgSW5kZXggUmVnaXN0ZXIgKFJUX0lEWCkgYml0IGRlZmluaXRpb25zLgorICovCitlbnVtIHsKKwlSVF9JRFhfSURYX1NISUZUID0gOCwKKwlSVF9JRFhfVFlQRV9NQVNLID0gMHgwMDBmMDAwMCwKKwlSVF9JRFhfVFlQRV9SVCA9IDB4MDAwMDAwMDAsCisJUlRfSURYX1RZUEVfUlRfSU5WID0gMHgwMDAxMDAwMCwKKwlSVF9JRFhfVFlQRV9OSUNRID0gMHgwMDAyMDAwMCwKKwlSVF9JRFhfVFlQRV9OSUNRX0lOViA9IDB4MDAwMzAwMDAsCisJUlRfSURYX0RTVF9NQVNLID0gMHgwMDcwMDAwMCwKKwlSVF9JRFhfRFNUX1JTUyA9IDB4MDAwMDAwMDAsCisJUlRfSURYX0RTVF9DQU1fUSA9IDB4MDAxMDAwMDAsCisJUlRfSURYX0RTVF9DT1NfUSA9IDB4MDAyMDAwMDAsCisJUlRfSURYX0RTVF9ERkxUX1EgPSAweDAwMzAwMDAwLAorCVJUX0lEWF9EU1RfREVTVF9RID0gMHgwMDQwMDAwMCwKKwlSVF9JRFhfUlMgPSAoMSA8PCAyNiksCisJUlRfSURYX0UgPSAoMSA8PCAyNyksCisJUlRfSURYX01SID0gKDEgPDwgMzApLAorCVJUX0lEWF9NVyA9ICgxIDw8IDMxKSwKKworCS8qIE5pYyBRdWV1ZSBmb3JtYXQgLSB0eXBlIDIgYml0cyAqLworCVJUX0lEWF9CQ0FTVCA9ICgxIDw8IDApLAorCVJUX0lEWF9NQ0FTVCA9ICgxIDw8IDEpLAorCVJUX0lEWF9NQ0FTVF9NQVRDSCA9ICgxIDw8IDIpLAorCVJUX0lEWF9NQ0FTVF9SRUdfTUFUQ0ggPSAoMSA8PCAzKSwKKwlSVF9JRFhfTUNBU1RfSEFTSF9NQVRDSCA9ICgxIDw8IDQpLAorCVJUX0lEWF9GQ19NQUNIID0gKDEgPDwgNSksCisJUlRfSURYX0VUSF9GQ09FID0gKDEgPDwgNiksCisJUlRfSURYX0NBTV9ISVQgPSAoMSA8PCA3KSwKKwlSVF9JRFhfQ0FNX0JJVDAgPSAoMSA8PCA4KSwKKwlSVF9JRFhfQ0FNX0JJVDEgPSAoMSA8PCA5KSwKKwlSVF9JRFhfVkxBTl9UQUcgPSAoMSA8PCAxMCksCisJUlRfSURYX1ZMQU5fTUFUQ0ggPSAoMSA8PCAxMSksCisJUlRfSURYX1ZMQU5fRklMVEVSID0gKDEgPDwgMTIpLAorCVJUX0lEWF9FVEhfU0tJUDEgPSAoMSA8PCAxMyksCisJUlRfSURYX0VUSF9TS0lQMiA9ICgxIDw8IDE0KSwKKwlSVF9JRFhfQkNBU1RfTUNBU1RfTUFUQ0ggPSAoMSA8PCAxNSksCisJUlRfSURYXzgwMl8zID0gKDEgPDwgMTYpLAorCVJUX0lEWF9MTERQID0gKDEgPDwgMTcpLAorCVJUX0lEWF9VTlVTRUQwMTggPSAoMSA8PCAxOCksCisJUlRfSURYX1VOVVNFRDAxOSA9ICgxIDw8IDE5KSwKKwlSVF9JRFhfVU5VU0VEMjAgPSAoMSA8PCAyMCksCisJUlRfSURYX1VOVVNFRDIxID0gKDEgPDwgMjEpLAorCVJUX0lEWF9FUlIgPSAoMSA8PCAyMiksCisJUlRfSURYX1ZBTElEID0gKDEgPDwgMjMpLAorCVJUX0lEWF9UVV9DU1VNX0VSUiA9ICgxIDw8IDI0KSwKKwlSVF9JRFhfSVBfQ1NVTV9FUlIgPSAoMSA8PCAyNSksCisJUlRfSURYX01BQ19FUlIgPSAoMSA8PCAyNiksCisJUlRfSURYX1JTU19UQ1A2ID0gKDEgPDwgMjcpLAorCVJUX0lEWF9SU1NfVENQNCA9ICgxIDw8IDI4KSwKKwlSVF9JRFhfUlNTX0lQVjYgPSAoMSA8PCAyOSksCisJUlRfSURYX1JTU19JUFY0ID0gKDEgPDwgMzApLAorCVJUX0lEWF9SU1NfTUFUQ0ggPSAoMSA8PCAzMSksCisKKwkvKiBIaWVyYXJjaHkgZm9yIHRoZSBOSUMgUXVldWUgTWFzayAqLworCVJUX0lEWF9BTExfRVJSX1NMT1QgPSAwLAorCVJUX0lEWF9NQUNfRVJSX1NMT1QgPSAwLAorCVJUX0lEWF9JUF9DU1VNX0VSUl9TTE9UID0gMSwKKwlSVF9JRFhfVENQX1VEUF9DU1VNX0VSUl9TTE9UID0gMiwKKwlSVF9JRFhfQkNBU1RfU0xPVCA9IDMsCisJUlRfSURYX01DQVNUX01BVENIX1NMT1QgPSA0LAorCVJUX0lEWF9BTExNVUxUSV9TTE9UID0gNSwKKwlSVF9JRFhfVU5VU0VENl9TTE9UID0gNiwKKwlSVF9JRFhfVU5VU0VEN19TTE9UID0gNywKKwlSVF9JRFhfUlNTX01BVENIX1NMT1QgPSA4LAorCVJUX0lEWF9SU1NfSVBWNF9TTE9UID0gOCwKKwlSVF9JRFhfUlNTX0lQVjZfU0xPVCA9IDksCisJUlRfSURYX1JTU19UQ1A0X1NMT1QgPSAxMCwKKwlSVF9JRFhfUlNTX1RDUDZfU0xPVCA9IDExLAorCVJUX0lEWF9DQU1fSElUX1NMT1QgPSAxMiwKKwlSVF9JRFhfVU5VU0VEMDEzID0gMTMsCisJUlRfSURYX1VOVVNFRDAxNCA9IDE0LAorCVJUX0lEWF9QUk9NSVNDVU9VU19TTE9UID0gMTUsCisJUlRfSURYX01BWF9TTE9UUyA9IDE2LAorfTsKKworLyoKKyAqIENvbnRyb2wgUmVnaXN0ZXIgU2V0IE1hcAorICovCitlbnVtIHsKKwlQUk9DX0FERFIgPSAwLAkJLyogVXNlIHNlbWFwaG9yZSAqLworCVBST0NfREFUQSA9IDB4MDQsCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlTWVMgPSAweDA4LAorCVJTVF9GTyA9IDB4MGMsCisJRlNDID0gMHgxMCwKKwlDU1IgPSAweDE0LAorCUxFRCA9IDB4MTgsCisJSUNCX1JJRCA9IDB4MWMsCQkvKiBVc2Ugc2VtYXBob3JlICovCisJSUNCX0wgPSAweDIwLAkJLyogVXNlIHNlbWFwaG9yZSAqLworCUlDQl9IID0gMHgyNCwJCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlDRkcgPSAweDI4LAorCUJJT1NfQUREUiA9IDB4MmMsCisJU1RTID0gMHgzMCwKKwlJTlRSX0VOID0gMHgzNCwKKwlJTlRSX01BU0sgPSAweDM4LAorCUlTUjEgPSAweDNjLAorCUlTUjIgPSAweDQwLAorCUlTUjMgPSAweDQ0LAorCUlTUjQgPSAweDQ4LAorCVJFVl9JRCA9IDB4NGMsCisJRlJDX0VDQ19FUlIgPSAweDUwLAorCUVSUl9TVFMgPSAweDU0LAorCVJBTV9EQkdfQUREUiA9IDB4NTgsCisJUkFNX0RCR19EQVRBID0gMHg1YywKKwlFQ0NfRVJSX0NOVCA9IDB4NjAsCisJU0VNID0gMHg2NCwKKwlHUElPXzEgPSAweDY4LAkJLyogVXNlIHNlbWFwaG9yZSAqLworCUdQSU9fMiA9IDB4NmMsCQkvKiBVc2Ugc2VtYXBob3JlICovCisJR1BJT18zID0gMHg3MCwJCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlSU1ZEMiA9IDB4NzQsCisJWEdNQUNfQUREUiA9IDB4NzgsCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlYR01BQ19EQVRBID0gMHg3YywJLyogVXNlIHNlbWFwaG9yZSAqLworCU5JQ19FVFMgPSAweDgwLAorCUNOQV9FVFMgPSAweDg0LAorCUZMQVNIX0FERFIgPSAweDg4LAkvKiBVc2Ugc2VtYXBob3JlICovCisJRkxBU0hfREFUQSA9IDB4OGMsCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlDUV9TVE9QID0gMHg5MCwKKwlQQUdFX1RCTF9SSUQgPSAweDk0LAorCVdRX1BBR0VfVEJMX0xPID0gMHg5OCwKKwlXUV9QQUdFX1RCTF9ISSA9IDB4OWMsCisJQ1FfUEFHRV9UQkxfTE8gPSAweGEwLAorCUNRX1BBR0VfVEJMX0hJID0gMHhhNCwKKwlNQUNfQUREUl9JRFggPSAweGE4LAkvKiBVc2Ugc2VtYXBob3JlICovCisJTUFDX0FERFJfREFUQSA9IDB4YWMsCS8qIFVzZSBzZW1hcGhvcmUgKi8KKwlDT1NfREZMVF9DUTEgPSAweGIwLAorCUNPU19ERkxUX0NRMiA9IDB4YjQsCisJRVRZUEVfU0tJUDEgPSAweGI4LAorCUVUWVBFX1NLSVAyID0gMHhiYywKKwlTUExUX0hEUiA9IDB4YzAsCisJRkNfUEFVU0VfVEhSRVMgPSAweGM0LAorCU5JQ19QQVVTRV9USFJFUyA9IDB4YzgsCisJRkNfRVRIRVJUWVBFID0gMHhjYywKKwlGQ19SQ1ZfQ0ZHID0gMHhkMCwKKwlOSUNfUkNWX0NGRyA9IDB4ZDQsCisJRkNfQ09TX1RBR1MgPSAweGQ4LAorCU5JQ19DT1NfVEFHUyA9IDB4ZGMsCisJTUdNVF9SQ1ZfQ0ZHID0gMHhlMCwKKwlSVF9JRFggPSAweGU0LAorCVJUX0RBVEEgPSAweGU4LAorCVJTVkQ3ID0gMHhlYywKKwlYR19TRVJERVNfQUREUiA9IDB4ZjAsCisJWEdfU0VSREVTX0RBVEEgPSAweGY0LAorCVBSQl9NWF9BRERSID0gMHhmOCwJLyogVXNlIHNlbWFwaG9yZSAqLworCVBSQl9NWF9EQVRBID0gMHhmYywJLyogVXNlIHNlbWFwaG9yZSAqLworfTsKKworLyoKKyAqIENBTSBvdXRwdXQgZm9ybWF0LgorICovCitlbnVtIHsKKwlDQU1fT1VUX1JPVVRFX0ZDID0gMCwKKwlDQU1fT1VUX1JPVVRFX05JQyA9IDEsCisJQ0FNX09VVF9GVU5DX1NISUZUID0gMiwKKwlDQU1fT1VUX1JWID0gKDEgPDwgNCksCisJQ0FNX09VVF9TSCA9ICgxIDw8IDE1KSwKKwlDQU1fT1VUX0NRX0lEX1NISUZUID0gNSwKK307CisKKy8qCisgKiBNYWlsYm94ICBkZWZpbml0aW9ucworICovCitlbnVtIHsKKwkvKiBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9ucyAqLworCUFFTl9TWVNfRVJSID0gMHgwMDAwODAwMiwKKwlBRU5fTElOS19VUCA9IDB4MDAwMDgwMTEsCisJQUVOX0xJTktfRE9XTiA9IDB4MDAwMDgwMTIsCisJQUVOX0lEQ19DTVBMVCA9IDB4MDAwMDgxMDAsCisJQUVOX0lEQ19SRVEgPSAweDAwMDA4MTAxLAorCUFFTl9GV19JTklUX0RPTkUgPSAweDAwMDA4NDAwLAorCUFFTl9GV19JTklUX0ZBSUwgPSAweDAwMDA4NDAxLAorCisJLyogTWFpbGJveCBDb21tYW5kIE9wY29kZXMuICovCisJTUJfQ01EX05PUCA9IDB4MDAwMDAwMDAsCisJTUJfQ01EX0VYX0ZXID0gMHgwMDAwMDAwMiwKKwlNQl9DTURfTUJfVEVTVCA9IDB4MDAwMDAwMDYsCisJTUJfQ01EX0NTVU1fVEVTVCA9IDB4MDAwMDAwMDcsCS8qIFZlcmlmeSBDaGVja3N1bSAqLworCU1CX0NNRF9BQk9VVF9GVyA9IDB4MDAwMDAwMDgsCisJTUJfQ01EX0xPQURfUklTQ19SQU0gPSAweDAwMDAwMDBiLAorCU1CX0NNRF9EVU1QX1JJU0NfUkFNID0gMHgwMDAwMDAwYywKKwlNQl9DTURfV1JJVEVfUkFNID0gMHgwMDAwMDAwZCwKKwlNQl9DTURfUkVBRF9SQU0gPSAweDAwMDAwMDBmLAorCU1CX0NNRF9TVE9QX0ZXID0gMHgwMDAwMDAxNCwKKwlNQl9DTURfTUFLRV9TWVNfRVJSID0gMHgwMDAwMDAyYSwKKwlNQl9DTURfSU5JVF9GVyA9IDB4MDAwMDAwNjAsCisJTUJfQ01EX0dFVF9JTklUX0NCID0gMHgwMDAwMDA2MSwKKwlNQl9DTURfR0VUX0ZXX1NUQVRFID0gMHgwMDAwMDA2OSwKKwlNQl9DTURfSURDX1JFUSA9IDB4MDAwMDAxMDAsCS8qIEludGVyLURyaXZlciBDb21tdW5pY2F0aW9uICovCisJTUJfQ01EX0lEQ19BQ0sgPSAweDAwMDAwMTAxLAkvKiBJbnRlci1Ecml2ZXIgQ29tbXVuaWNhdGlvbiAqLworCU1CX0NNRF9TRVRfV09MX01PREUgPSAweDAwMDAwMTEwLAkvKiBXYWtlIE9uIExhbiAqLworCU1CX1dPTF9ESVNBQkxFID0gMHgwMDAwMDAwMCwKKwlNQl9XT0xfTUFHSUNfUEtUID0gMHgwMDAwMDAwMSwKKwlNQl9XT0xfRkxUUiA9IDB4MDAwMDAwMDIsCisJTUJfV09MX1VDQVNUID0gMHgwMDAwMDAwNCwKKwlNQl9XT0xfTUNBU1QgPSAweDAwMDAwMDA4LAorCU1CX1dPTF9CQ0FTVCA9IDB4MDAwMDAwMTAsCisJTUJfV09MX0xJTktfVVAgPSAweDAwMDAwMDIwLAorCU1CX1dPTF9MSU5LX0RPV04gPSAweDAwMDAwMDQwLAorCU1CX0NNRF9TRVRfV09MX0ZMVFIgPSAweDAwMDAwMTExLAkvKiBXYWtlIE9uIExhbiBGaWx0ZXIgKi8KKwlNQl9DTURfQ0xFQVJfV09MX0ZMVFIgPSAweDAwMDAwMTEyLAkvKiBXYWtlIE9uIExhbiBGaWx0ZXIgKi8KKwlNQl9DTURfU0VUX1dPTF9NQUdJQyA9IDB4MDAwMDAxMTMsCS8qIFdha2UgT24gTGFuIE1hZ2ljIFBhY2tldCAqLworCU1CX0NNRF9DTEVBUl9XT0xfTUFHSUMgPSAweDAwMDAwMTE0LAkvKiBXYWtlIE9uIExhbiBNYWdpYyBQYWNrZXQgKi8KKwlNQl9DTURfUE9SVF9SRVNFVCA9IDB4MDAwMDAxMjAsCisJTUJfQ01EX1NFVF9QT1JUX0NGRyA9IDB4MDAwMDAxMjIsCisJTUJfQ01EX0dFVF9QT1JUX0NGRyA9IDB4MDAwMDAxMjMsCisJTUJfQ01EX1NFVF9BU0lDX1ZPTFRTID0gMHgwMDAwMDEzMCwKKwlNQl9DTURfR0VUX1NOU19EQVRBID0gMHgwMDAwMDEzMSwJLyogVGVtcCBhbmQgVm9sdCBTZW5zZSBkYXRhLiAqLworCisJLyogTWFpbGJveCBDb21tYW5kIFN0YXR1cy4gKi8KKwlNQl9DTURfU1RTX0dPT0QgPSAweDAwMDA0MDAwLAkvKiBTdWNjZXNzLiAqLworCU1CX0NNRF9TVFNfSU5UUk1EVCA9IDB4MDAwMDEwMDAsCS8qIEludGVybWVkaWF0ZSBDb21wbGV0ZS4gKi8KKwlNQl9DTURfU1RTX0VSUiA9IDB4MDAwMDQwMDUsCS8qIEVycm9yLiAqLworfTsKKworc3RydWN0IG1ib3hfcGFyYW1zIHsKKwl1MzIgbWJveF9pbltNQUlMQk9YX0NPVU5UXTsKKwl1MzIgbWJveF9vdXRbTUFJTEJPWF9DT1VOVF07CisJaW50IGluX2NvdW50OworCWludCBvdXRfY291bnQ7Cit9OworCitzdHJ1Y3QgZmxhc2hfcGFyYW1zIHsKKwl1OCBkZXZfaWRfc3RyWzRdOworCXUxNiBzaXplOworCXUxNiBjc3VtOworCXUxNiB2ZXI7CisJdTE2IHN1Yl9kZXZfaWQ7CisJdTggbWFjX2FkZHJbNl07CisJdTE2IHJlczsKK307CisKKworLyoKKyAqIGRvb3JiZWxsIHNwYWNlIGZvciB0aGUgcnggcmluZyBjb250ZXh0CisgKi8KK3N0cnVjdCByeF9kb29yYmVsbF9jb250ZXh0IHsKKwl1MzIgY25zbXJfaWR4OwkJLyogMHgwMCAqLworCXUzMiB2YWxpZDsJCS8qIDB4MDQgKi8KKwl1MzIgcmVzZXJ2ZWRbNF07CS8qIDB4MDgtMHgxNCAqLworCXUzMiBsYnFfcHJvZF9pZHg7CS8qIDB4MTggKi8KKwl1MzIgc2JxX3Byb2RfaWR4OwkvKiAweDFjICovCit9OworCisvKgorICogZG9vcmJlbGwgc3BhY2UgZm9yIHRoZSB0eCByaW5nIGNvbnRleHQKKyAqLworc3RydWN0IHR4X2Rvb3JiZWxsX2NvbnRleHQgeworCXUzMiBwcm9kX2lkeDsJCS8qIDB4MDAgKi8KKwl1MzIgdmFsaWQ7CQkvKiAweDA0ICovCisJdTMyIHJlc2VydmVkWzRdOwkvKiAweDA4LTB4MTQgKi8KKwl1MzIgbGJxX3Byb2RfaWR4OwkvKiAweDE4ICovCisJdTMyIHNicV9wcm9kX2lkeDsJLyogMHgxYyAqLworfTsKKworLyogREFUQSBTVFJVQ1RVUkVTIFNIQVJFRCBXSVRIIEhBUkRXQVJFLiAqLworCitzdHJ1Y3QgYnFfZWxlbWVudCB7CisJdTMyIGFkZHJfbG87CisjZGVmaW5lIEJRX0VORAkweDAwMDAwMDAxCisjZGVmaW5lIEJRX0NPTlQJMHgwMDAwMDAwMgorI2RlZmluZSBCUV9NQVNLCTB4MDAwMDAwMDMKKwl1MzIgYWRkcl9oaTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3QgdHhfYnVmX2Rlc2MgeworCV9fbGU2NCBhZGRyOworCV9fbGUzMiBsZW47CisjZGVmaW5lIFRYX0RFU0NfTEVOX01BU0sJMHgwMDBmZmZmZgorI2RlZmluZSBUWF9ERVNDX0MJMHg0MDAwMDAwMAorI2RlZmluZSBUWF9ERVNDX0UJMHg4MDAwMDAwMAorfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKKy8qCisgKiBJT0NCIERlZmluaXRpb25zLi4uCisgKi8KKworI2RlZmluZSBPUENPREVfT0JfTUFDX0lPQ0IgCQkJMHgwMQorI2RlZmluZSBPUENPREVfT0JfTUFDX1RTT19JT0NCCQkweDAyCisjZGVmaW5lIE9QQ09ERV9JQl9NQUNfSU9DQgkJCTB4MjAKKyNkZWZpbmUgT1BDT0RFX0lCX01QSV9JT0NCCQkJMHgyMQorI2RlZmluZSBPUENPREVfSUJfQUVfSU9DQgkJCTB4M2YKKworc3RydWN0IG9iX21hY19pb2NiX3JlcSB7CisJdTggb3Bjb2RlOworCXU4IGZsYWdzMTsKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX09JCTB4MDEKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0kJMHgwMgorI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfRAkweDA4CisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9GCTB4MTAKKwl1OCBmbGFnczI7CisJdTggZmxhZ3MzOworI2RlZmluZSBPQl9NQUNfSU9DQl9ERlAJMHgwMgorI2RlZmluZSBPQl9NQUNfSU9DQl9WCTB4MDQKKwlfX2xlMzIgcmVzZXJ2ZWQxWzJdOworCV9fbGUxNiBmcmFtZV9sZW47CisjZGVmaW5lIE9CX01BQ19JT0NCX0xFTl9NQVNLIDB4M2ZmZmYKKwlfX2xlMTYgcmVzZXJ2ZWQyOworCV9fbGUzMiB0aWQ7CisJX19sZTMyIHR4cV9pZHg7CisJX19sZTMyIHJlc2VydmVkMzsKKwlfX2xlMTYgdmxhbl90Y2k7CisJX19sZTE2IHJlc2VydmVkNDsKKwlzdHJ1Y3QgdHhfYnVmX2Rlc2MgdGJkW1RYX0RFU0NfUEVSX0lPQ0JdOworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKK3N0cnVjdCBvYl9tYWNfaW9jYl9yc3AgeworCXU4IG9wY29kZTsJCS8qICovCisJdTggZmxhZ3MxOwkJLyogKi8KKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX09JCTB4MDEJLyogKi8KKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX0kJMHgwMgkvKiAqLworI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfRQkweDA4CS8qICovCisjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9TCTB4MTAJLyogdG9vIFNob3J0ICovCisjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9MCTB4MjAJLyogdG9vIExhcmdlICovCisjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9QCTB4NDAJLyogUGFkZGVkICovCisJdTggZmxhZ3MyOwkJLyogKi8KKwl1OCBmbGFnczM7CQkvKiAqLworI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfQgkweDgwCS8qICovCisJX19sZTMyIHRpZDsKKwlfX2xlMzIgdHhxX2lkeDsKKwlfX2xlMzIgcmVzZXJ2ZWRbMTNdOworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKK3N0cnVjdCBvYl9tYWNfdHNvX2lvY2JfcmVxIHsKKwl1OCBvcGNvZGU7CisJdTggZmxhZ3MxOworI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfT0kJMHgwMQorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfSQkweDAyCisjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9ECTB4MDgKKyNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX0lQNAkweDQwCisjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9JUDYJMHg4MAorCXU4IGZsYWdzMjsKKyNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX0xTTwkweDIwCisjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9VQwkweDQwCisjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9UQwkweDgwCisJdTggZmxhZ3MzOworI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfSUMJMHgwMQorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfREZQCTB4MDIKKyNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX1YJMHgwNAorCV9fbGUzMiByZXNlcnZlZDFbMl07CisJX19sZTMyIGZyYW1lX2xlbjsKKwlfX2xlMzIgdGlkOworCV9fbGUzMiB0eHFfaWR4OworCV9fbGUxNiB0b3RhbF9oZHJzX2xlbjsKKwlfX2xlMTYgbmV0X3RyYW5zX29mZnNldDsKKyNkZWZpbmUgT0JfTUFDX1RSQU5TUE9SVF9IRFJfU0hJRlQgNgorCV9fbGUxNiB2bGFuX3RjaTsKKwlfX2xlMTYgbXNzOworCXN0cnVjdCB0eF9idWZfZGVzYyB0YmRbVFhfREVTQ19QRVJfSU9DQl07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IG9iX21hY190c29faW9jYl9yc3AgeworCXU4IG9wY29kZTsKKwl1OCBmbGFnczE7CisjZGVmaW5lIE9CX01BQ19UU09fSU9DQl9SU1BfT0kJMHgwMQorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfUlNQX0kJMHgwMgorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfUlNQX0UJMHgwOAorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfUlNQX1MJMHgxMAorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfUlNQX0wJMHgyMAorI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfUlNQX1AJMHg0MAorCXU4IGZsYWdzMjsJCS8qICovCisJdTggZmxhZ3MzOwkJLyogKi8KKyNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX1JTUF9CCTB4ODAwMAorCV9fbGUzMiB0aWQ7CisJX19sZTMyIHR4cV9pZHg7CisJX19sZTMyIHJlc2VydmVkMlsxM107Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGliX21hY19pb2NiX3JzcCB7CisJdTggb3Bjb2RlOwkJLyogMHgyMCAqLworCXU4IGZsYWdzMTsKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX09JCTB4MDEJLyogT3ZlcmlkZSBpbnRyIGRlbGF5ICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9JCTB4MDIJLyogRGlzYmxlIEludHIgR2VuZXJhdGlvbiAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfVEUJMHgwNAkvKiBDaGVja3N1bSBlcnJvciAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfTlUJMHgwOAkvKiBObyBjaGVja3N1bSByY3ZkICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9JRQkweDEwCS8qIElQdjQgY2hlY2tzdW0gZXJyb3IgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSwkweDYwCS8qIE11bHRpY2FzdCBpbmZvICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9NX05PTkUJMHgwMAkvKiBOb3QgbWNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01fSEFTSAkweDIwCS8qIEhBU0ggbWNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01fUkVHIAkweDQwCS8qIFJlZ2lzdGVyZWQgbWNhc3QgZnJhbWUgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01fUFJPTSAJMHg2MAkvKiBQcm9taXNjdW91cyBtY2FzdCBmcmFtZSAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfQgkweDgwCS8qIEJyb2FkY2FzdCBmcmFtZSAqLworCXU4IGZsYWdzMjsKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX1AJMHgwMQkvKiBQcm9taXNjdW91cyBmcmFtZSAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfVgkweDAyCS8qIFZsYW4gdGFnIHByZXNlbnQgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0VSUl9NQVNLCTB4MWMJLyogICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9FUlJfQ09ERV9FUlIJMHgwNAorI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfRVJSX09WRVJTSVpFCTB4MDgKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0VSUl9VTkRFUlNJWkUJMHgxMAorI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfRVJSX1BSRUFNQkxFCTB4MTQKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0VSUl9GUkFNRV9MRU4JMHgxOAorI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfRVJSX0NSQwkJMHgxYworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfVQkweDIwCS8qIFVEUCBwYWNrZXQgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX1QJMHg0MAkvKiBUQ1AgcGFja2V0ICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9GTwkweDgwCS8qIEZhaWxvdmVyIHBvcnQgKi8KKwl1OCBmbGFnczM7CisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9SU1NfTUFTSwkweDA3CS8qIFJTUyBtYXNrICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9NX05PTkUJMHgwMAkvKiBObyBSU1MgbWF0Y2ggKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX01fSVBWNAkweDA0CS8qIElQdjQgUlNTIG1hdGNoICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9NX0lQVjYJMHgwMgkvKiBJUHY2IFJTUyBtYXRjaCAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfTV9UQ1BfVjQgCTB4MDUJLyogVENQIHdpdGggSVB2NCAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfTV9UQ1BfVjYgCTB4MDMJLyogVENQIHdpdGggSVB2NiAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfVjQJMHgwOAkvKiBJUFY0ICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9WNgkweDEwCS8qIElQVjYgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0lICTB4MjAJLyogU3BsaXQgYWZ0ZXIgSVAgaGVhZGVyICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9EUwkweDQwCS8qIGRhdGEgaXMgaW4gc21hbGwgYnVmZmVyICovCisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9ETAkweDgwCS8qIGRhdGEgaXMgaW4gbGFyZ2UgYnVmZmVyICovCisJX19sZTMyIGRhdGFfbGVuOwkvKiAqLworCV9fbGUzMiBkYXRhX2FkZHJfbG87CS8qICovCisJX19sZTMyIGRhdGFfYWRkcl9oaTsJLyogKi8KKwlfX2xlMzIgcnNzOwkJLyogKi8KKwlfX2xlMTYgdmxhbl9pZDsJCS8qIDEyIGJpdHMgKi8KKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0MJMHgxMDAwCS8qIFZMQU4gQ0ZJIGJpdCAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfQ09TX1NISUZUCTEyCS8qIGNsYXNzIG9mIHNlcnZpY2UgdmFsdWUgKi8KKworCV9fbGUxNiByZXNlcnZlZDE7CisJX19sZTMyIHJlc2VydmVkMls2XTsKKwlfX2xlMzIgZmxhZ3M0OworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSFYJMHgyMDAwMDAwMAkvKiAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSFMJMHg0MDAwMDAwMAkvKiAqLworI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfSEwJMHg4MDAwMDAwMAkvKiAqLworCV9fbGUzMiBoZHJfbGVuOwkJLyogKi8KKwlfX2xlMzIgaGRyX2FkZHJfbG87CS8qICovCisJX19sZTMyIGhkcl9hZGRyX2hpOwkvKiAqLworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKK3N0cnVjdCBpYl9hZV9pb2NiX3JzcCB7CisJdTggb3Bjb2RlOworCXU4IGZsYWdzMTsKKyNkZWZpbmUgSUJfQUVfSU9DQl9SU1BfT0kJCTB4MDEKKyNkZWZpbmUgSUJfQUVfSU9DQl9SU1BfSQkJMHgwMgorCXU4IGV2ZW50OworI2RlZmluZSBMSU5LX1VQX0VWRU5UICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIExJTktfRE9XTl9FVkVOVCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0FNX0xPT0tVUF9FUlJfRVZFTlQgICAgICAgMHgwNgorI2RlZmluZSBTT0ZUX0VDQ19FUlJPUl9FVkVOVCAgICAgICAweDA3CisjZGVmaW5lIE1HTVRfRVJSX0VWRU5UICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgVEVOX0dJR19NQUNfRVZFTlQgICAgICAgICAgMHgwOQorI2RlZmluZSBHUEkwX0gyTF9FVkVOVCAgICAgICAJMHgxMAorI2RlZmluZSBHUEkwX0wySF9FVkVOVCAgICAgICAJMHgyMAorI2RlZmluZSBHUEkxX0gyTF9FVkVOVCAgICAgICAJMHgxMQorI2RlZmluZSBHUEkxX0wySF9FVkVOVCAgICAgICAJMHgyMQorI2RlZmluZSBQQ0lfRVJSX0FOT05fQlVGX1JEICAgICAgICAweDQwCisJdTggcV9pZDsKKwlfX2xlMzIgcmVzZXJ2ZWRbMTVdOworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSB0aHJlZSBzdHJ1Y3R1cmVzIGFyZSBmb3IgZ2VuZXJpYworICogaGFuZGxpbmcgb2YgaWIgYW5kIG9iIGlvY2JzLgorICovCitzdHJ1Y3QgcWxfbmV0X3JzcF9pb2NiIHsKKwl1OCBvcGNvZGU7CisJdTggZmxhZ3MwOworCV9fbGUxNiBsZW5ndGg7CisJX19sZTMyIHRpZDsKKwlfX2xlMzIgcmVzZXJ2ZWRbMTRdOworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKK3N0cnVjdCBuZXRfcmVxX2lvY2IgeworCXU4IG9wY29kZTsKKwl1OCBmbGFnczA7CisJX19sZTE2IGZsYWdzMTsKKwlfX2xlMzIgdGlkOworCV9fbGUzMiByZXNlcnZlZDFbMzBdOworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKKy8qCisgKiB0eCByaW5nIGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgZm9yIGNoaXAuCisgKiBJdCBpcyBkZWZpbmVkIGFzOgorICogIldvcmsgUXVldWUgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBCbG9jayIKKyAqLworc3RydWN0IHdxaWNiIHsKKwlfX2xlMTYgbGVuOworI2RlZmluZSBRX0xFTl9WCQkoMSA8PCA0KQorI2RlZmluZSBRX0xFTl9DUFBfQ09OVAkweDAwMDAKKyNkZWZpbmUgUV9MRU5fQ1BQXzE2CTB4MDAwMQorI2RlZmluZSBRX0xFTl9DUFBfMzIJMHgwMDAyCisjZGVmaW5lIFFfTEVOX0NQUF82NAkweDAwMDMKKwlfX2xlMTYgZmxhZ3M7CisjZGVmaW5lIFFfUFJJX1NISUZUCTEKKyNkZWZpbmUgUV9GTEFHU19MQwkweDEwMDAKKyNkZWZpbmUgUV9GTEFHU19MQgkweDIwMDAKKyNkZWZpbmUgUV9GTEFHU19MSQkweDQwMDAKKyNkZWZpbmUgUV9GTEFHU19MTwkweDgwMDAKKwlfX2xlMTYgY3FfaWRfcnNzOworI2RlZmluZSBRX0NRX0lEX1JTU19SViAweDgwMDAKKwlfX2xlMTYgcmlkOworCV9fbGUzMiBhZGRyX2xvOworCV9fbGUzMiBhZGRyX2hpOworCV9fbGUzMiBjbnNtcl9pZHhfYWRkcl9sbzsKKwlfX2xlMzIgY25zbXJfaWR4X2FkZHJfaGk7Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworLyoKKyAqIHJ4IHJpbmcgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jayBmb3IgY2hpcC4KKyAqIEl0IGlzIGRlZmluZWQgYXM6CisgKiAiQ29tcGxldGlvbiBRdWV1ZSBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrIgorICovCitzdHJ1Y3QgY3FpY2IgeworCXU4IG1zaXhfdmVjdDsKKwl1OCByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQyOworCXU4IGZsYWdzOworI2RlZmluZSBGTEFHU19MVgkweDA4CisjZGVmaW5lIEZMQUdTX0xTCTB4MTAKKyNkZWZpbmUgRkxBR1NfTEwJMHgyMAorI2RlZmluZSBGTEFHU19MSQkweDQwCisjZGVmaW5lIEZMQUdTX0xDCTB4ODAKKwlfX2xlMTYgbGVuOworI2RlZmluZSBMRU5fVgkJKDEgPDwgNCkKKyNkZWZpbmUgTEVOX0NQUF9DT05UCTB4MDAwMAorI2RlZmluZSBMRU5fQ1BQXzMyCTB4MDAwMQorI2RlZmluZSBMRU5fQ1BQXzY0CTB4MDAwMgorI2RlZmluZSBMRU5fQ1BQXzEyOAkweDAwMDMKKwlfX2xlMTYgcmlkOworCV9fbGUzMiBhZGRyX2xvOworCV9fbGUzMiBhZGRyX2hpOworCV9fbGUzMiBwcm9kX2lkeF9hZGRyX2xvOworCV9fbGUzMiBwcm9kX2lkeF9hZGRyX2hpOworCV9fbGUxNiBwa3RfZGVsYXk7CisJX19sZTE2IGlycV9kZWxheTsKKwlfX2xlMzIgbGJxX2FkZHJfbG87CisJX19sZTMyIGxicV9hZGRyX2hpOworCV9fbGUxNiBsYnFfYnVmX3NpemU7CisJX19sZTE2IGxicV9sZW47CQkvKiBlbnRyeSBjb3VudCAqLworCV9fbGUzMiBzYnFfYWRkcl9sbzsKKwlfX2xlMzIgc2JxX2FkZHJfaGk7CisJX19sZTE2IHNicV9idWZfc2l6ZTsKKwlfX2xlMTYgc2JxX2xlbjsJCS8qIGVudHJ5IGNvdW50ICovCit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IHJpY2IgeworCXU4IGJhc2VfY3E7CisjZGVmaW5lIFJTU19MNEsgMHg4MAorCXU4IGZsYWdzOworI2RlZmluZSBSU1NfTDZLIDB4MDEKKyNkZWZpbmUgUlNTX0xJICAweDAyCisjZGVmaW5lIFJTU19MQiAgMHgwNAorI2RlZmluZSBSU1NfTE0gIDB4MDgKKyNkZWZpbmUgUlNTX1JJNCAweDEwCisjZGVmaW5lIFJTU19SVDQgMHgyMAorI2RlZmluZSBSU1NfUkk2IDB4NDAKKyNkZWZpbmUgUlNTX1JUNiAweDgwCisJX19sZTE2IG1hc2s7CisJX19sZTMyIGhhc2hfY3FfaWRbMjU2XTsKKwlfX2xlMzIgaXB2Nl9oYXNoX2tleVsxMF07CisJX19sZTMyIGlwdjRfaGFzaF9rZXlbNF07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworLyogU09GVFdBUkUvRFJJVkVSIERBVEEgU1RSVUNUVVJFUy4gKi8KKworc3RydWN0IG9hbCB7CisJc3RydWN0IHR4X2J1Zl9kZXNjIG9hbFtUWF9ERVNDX1BFUl9PQUxdOworfTsKKworc3RydWN0IG1hcF9saXN0IHsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcGFkZHIpOworCURFQ0xBUkVfUENJX1VOTUFQX0xFTihtYXBsZW4pOworfTsKKworc3RydWN0IHR4X3JpbmdfZGVzYyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpxdWV1ZV9lbnRyeTsKKwlpbnQgaW5kZXg7CisJc3RydWN0IG9hbCBvYWw7CisJc3RydWN0IG1hcF9saXN0IG1hcFtNQVhfU0tCX0ZSQUdTICsgMV07CisJaW50IG1hcF9jbnQ7CisJc3RydWN0IHR4X3JpbmdfZGVzYyAqbmV4dDsKK307CisKK3N0cnVjdCBicV9kZXNjIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBwYWdlICpsYnFfcGFnZTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl9IHA7CisJc3RydWN0IGJxX2VsZW1lbnQgKmJxOworCWludCBpbmRleDsKKwkgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBhZGRyKTsKKwkgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKG1hcGxlbik7Cit9OworCisjZGVmaW5lIFFMX1RYUV9JRFgocWRldiwgc2tiKSAoc21wX3Byb2Nlc3Nvcl9pZCgpJShxZGV2LT50eF9yaW5nX2NvdW50KSkKKworc3RydWN0IHR4X3JpbmcgeworCS8qCisJICogcXVldWUgaW5mby4KKwkgKi8KKwlzdHJ1Y3Qgd3FpY2Igd3FpY2I7CS8qIHN0cnVjdHVyZSB1c2VkIHRvIGluZm9ybSBjaGlwIG9mIG5ldyBxdWV1ZSAqLworCXZvaWQgKndxX2Jhc2U7CQkvKiBwY2lfYWxsb2M6dmlydHVhbCBhZGRyIGZvciB0eCAqLworCWRtYV9hZGRyX3Qgd3FfYmFzZV9kbWE7CS8qIHBjaV9hbGxvYzpkbWEgYWRkciBmb3IgdHggKi8KKwl1MzIgKmNuc21yX2lkeF9zaF9yZWc7CS8qIHNoYWRvdyBjb3B5IG9mIGNvbnN1bWVyIGlkeCAqLworCWRtYV9hZGRyX3QgY25zbXJfaWR4X3NoX3JlZ19kbWE7CS8qIGRtYS1zaGFkb3cgY29weSBvZiBjb25zdW1lciAqLworCXUzMiB3cV9zaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBxdWV1ZSBhcmVhICovCisJdTMyIHdxX2xlbjsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlICovCisJdm9pZCBfX2lvbWVtICpwcm9kX2lkeF9kYl9yZWc7CS8qIGRvb3JiZWxsIGFyZWEgaW5kZXggcmVnIGF0IG9mZnNldCAweDAwICovCisJdm9pZCBfX2lvbWVtICp2YWxpZF9kYl9yZWc7CS8qIGRvb3JiZWxsIGFyZWEgdmFsaWQgcmVnIGF0IG9mZnNldCAweDA0ICovCisJdTE2IHByb2RfaWR4OwkJLyogY3VycmVudCB2YWx1ZSBmb3IgcHJvZCBpZHggKi8KKwl1MTYgY3FfaWQ7CQkvKiBjb21wbGV0aW9uIChyeCkgcXVldWUgZm9yIHR4IGNvbXBsZXRpb25zICovCisJdTggd3FfaWQ7CQkvKiBxdWV1ZSBpZCBmb3IgdGhpcyBlbnRyeSAqLworCXU4IHJlc2VydmVkMVszXTsKKwlzdHJ1Y3QgdHhfcmluZ19kZXNjICpxOwkvKiBkZXNjcmlwdG9yIGxpc3QgZm9yIHRoZSBxdWV1ZSAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlhdG9taWNfdCB0eF9jb3VudDsJLyogY291bnRzIGRvd24gZm9yIGV2ZXJ5IG91dHN0YW5kaW5nIElPICovCisJYXRvbWljX3QgcXVldWVfc3RvcHBlZDsJLyogVHVybnMgcXVldWUgb2ZmIHdoZW4gZnVsbC4gKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4X3dvcms7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXY7Cit9OworCisvKgorICogVHlwZSBvZiBpbmJvdW5kIHF1ZXVlLgorICovCitlbnVtIHsKKwlERUZBVUxUX1EgPSAyLAkJLyogSGFuZGxlcyBzbG93IHF1ZXVlIGFuZCBjaGlwL01QSSBldmVudHMuICovCisJVFhfUSA9IDMsCQkvKiBIYW5kbGVzIG91dGJvdW5kIGNvbXBsZXRpb25zLiAqLworCVJYX1EgPSA0LAkJLyogSGFuZGxlcyBpbmJvdW5kIGNvbXBsZXRpb25zLiAqLworfTsKKworc3RydWN0IHJ4X3JpbmcgeworCXN0cnVjdCBjcWljYiBjcWljYjsJLyogVGhlIGNoaXAncyBjb21wbGV0aW9uIHF1ZXVlIGluaXQgY29udHJvbCBibG9jay4gKi8KKworCS8qIENvbXBsZXRpb24gcXVldWUgZWxlbWVudHMuICovCisJdm9pZCAqY3FfYmFzZTsKKwlkbWFfYWRkcl90IGNxX2Jhc2VfZG1hOworCXUzMiBjcV9zaXplOworCXUzMiBjcV9sZW47CisJdTE2IGNxX2lkOworCXUzMiAqcHJvZF9pZHhfc2hfcmVnOwkvKiBTaGFkb3dlZCBwcm9kdWNlciByZWdpc3Rlci4gKi8KKwlkbWFfYWRkcl90IHByb2RfaWR4X3NoX3JlZ19kbWE7CisJdm9pZCBfX2lvbWVtICpjbnNtcl9pZHhfZGJfcmVnOwkvKiBQQ0kgZG9vcmJlbGwgbWVtIGFyZWEgKyAwICovCisJdTMyIGNuc21yX2lkeDsJCS8qIGN1cnJlbnQgc3cgaWR4ICovCisJc3RydWN0IHFsX25ldF9yc3BfaW9jYiAqY3Vycl9lbnRyeTsJLyogbmV4dCBlbnRyeSBvbiBxdWV1ZSAqLworCXZvaWQgX19pb21lbSAqdmFsaWRfZGJfcmVnOwkvKiBQQ0kgZG9vcmJlbGwgbWVtIGFyZWEgKyAweDA0ICovCisKKwkvKiBMYXJnZSBidWZmZXIgcXVldWUgZWxlbWVudHMuICovCisJdTMyIGxicV9sZW47CQkvKiBlbnRyeSBjb3VudCAqLworCXUzMiBsYnFfc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgcXVldWUgKi8KKwl1MzIgbGJxX2J1Zl9zaXplOworCXZvaWQgKmxicV9iYXNlOworCWRtYV9hZGRyX3QgbGJxX2Jhc2VfZG1hOworCXZvaWQgKmxicV9iYXNlX2luZGlyZWN0OworCWRtYV9hZGRyX3QgbGJxX2Jhc2VfaW5kaXJlY3RfZG1hOworCXN0cnVjdCBicV9kZXNjICpsYnE7CS8qIGFycmF5IG9mIGNvbnRyb2wgYmxvY2tzICovCisJdm9pZCBfX2lvbWVtICpsYnFfcHJvZF9pZHhfZGJfcmVnOwkvKiBQQ0kgZG9vcmJlbGwgbWVtIGFyZWEgKyAweDE4ICovCisJdTMyIGxicV9wcm9kX2lkeDsJLyogY3VycmVudCBzdyBwcm9kIGlkeCAqLworCXUzMiBsYnFfY3Vycl9pZHg7CS8qIG5leHQgZW50cnkgd2UgZXhwZWN0ICovCisJdTMyIGxicV9jbGVhbl9pZHg7CS8qIGJlZ2lubmluZyBvZiBuZXcgZGVzY3MgKi8KKwl1MzIgbGJxX2ZyZWVfY250OwkvKiBmcmVlIGJ1ZmZlciBkZXNjIGNudCAqLworCisJLyogU21hbGwgYnVmZmVyIHF1ZXVlIGVsZW1lbnRzLiAqLworCXUzMiBzYnFfbGVuOwkJLyogZW50cnkgY291bnQgKi8KKwl1MzIgc2JxX3NpemU7CQkvKiBzaXplIGluIGJ5dGVzIG9mIHF1ZXVlICovCisJdTMyIHNicV9idWZfc2l6ZTsKKwl2b2lkICpzYnFfYmFzZTsKKwlkbWFfYWRkcl90IHNicV9iYXNlX2RtYTsKKwl2b2lkICpzYnFfYmFzZV9pbmRpcmVjdDsKKwlkbWFfYWRkcl90IHNicV9iYXNlX2luZGlyZWN0X2RtYTsKKwlzdHJ1Y3QgYnFfZGVzYyAqc2JxOwkvKiBhcnJheSBvZiBjb250cm9sIGJsb2NrcyAqLworCXZvaWQgX19pb21lbSAqc2JxX3Byb2RfaWR4X2RiX3JlZzsgLyogUENJIGRvb3JiZWxsIG1lbSBhcmVhICsgMHgxYyAqLworCXUzMiBzYnFfcHJvZF9pZHg7CS8qIGN1cnJlbnQgc3cgcHJvZCBpZHggKi8KKwl1MzIgc2JxX2N1cnJfaWR4OwkvKiBuZXh0IGVudHJ5IHdlIGV4cGVjdCAqLworCXUzMiBzYnFfY2xlYW5faWR4OwkvKiBiZWdpbm5pbmcgb2YgbmV3IGRlc2NzICovCisJdTMyIHNicV9mcmVlX2NudDsJLyogZnJlZSBidWZmZXIgZGVzYyBjbnQgKi8KKworCS8qIE1pc2MuIGhhbmRsZXIgZWxlbWVudHMuICovCisJdTMyIHR5cGU7CQkvKiBUeXBlIG9mIHF1ZXVlLCB0eCwgcngsIG9yIGRlZmF1bHQuICovCisJdTMyIGlycTsJCS8qIFdoaWNoIHZlY3RvciB0aGlzIHJpbmcgaXMgYXNzaWduZWQuICovCisJdTMyIGNwdTsJCS8qIFdoaWNoIENQVSB0aGlzIHNob3VsZCBydW4gb24uICovCisJY2hhciBuYW1lW0lGTkFNU0laICsgNV07CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisJc3RydWN0IGRlbGF5ZWRfd29yayByeF93b3JrOworCXU4IHJlc2VydmVkOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2OworfTsKKworLyoKKyAqIFJTUyBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrCisgKi8KK3N0cnVjdCBoYXNoX2lkIHsKKwl1OCB2YWx1ZVs0XTsKK307CisKK3N0cnVjdCBuaWNfc3RhdHMgeworCS8qCisJICogVGhlc2Ugc3RhdHMgY29tZSBmcm9tIG9mZnNldCAyMDBoIHRvIDI3OGgKKwkgKiBpbiB0aGUgWEdNQUMgcmVnaXN0ZXIuCisJICovCisJdTY0IHR4X3BrdHM7CisJdTY0IHR4X2J5dGVzOworCXU2NCB0eF9tY2FzdF9wa3RzOworCXU2NCB0eF9iY2FzdF9wa3RzOworCXU2NCB0eF91Y2FzdF9wa3RzOworCXU2NCB0eF9jdGxfcGt0czsKKwl1NjQgdHhfcGF1c2VfcGt0czsKKwl1NjQgdHhfNjRfcGt0OworCXU2NCB0eF82NV90b18xMjdfcGt0OworCXU2NCB0eF8xMjhfdG9fMjU1X3BrdDsKKwl1NjQgdHhfMjU2XzUxMV9wa3Q7CisJdTY0IHR4XzUxMl90b18xMDIzX3BrdDsKKwl1NjQgdHhfMTAyNF90b18xNTE4X3BrdDsKKwl1NjQgdHhfMTUxOV90b19tYXhfcGt0OworCXU2NCB0eF91bmRlcnNpemVfcGt0OworCXU2NCB0eF9vdmVyc2l6ZV9wa3Q7CisKKwkvKgorCSAqIFRoZXNlIHN0YXRzIGNvbWUgZnJvbSBvZmZzZXQgMzAwaCB0byAzQzhoCisJICogaW4gdGhlIFhHTUFDIHJlZ2lzdGVyLgorCSAqLworCXU2NCByeF9ieXRlczsKKwl1NjQgcnhfYnl0ZXNfb2s7CisJdTY0IHJ4X3BrdHM7CisJdTY0IHJ4X3BrdHNfb2s7CisJdTY0IHJ4X2JjYXN0X3BrdHM7CisJdTY0IHJ4X21jYXN0X3BrdHM7CisJdTY0IHJ4X3VjYXN0X3BrdHM7CisJdTY0IHJ4X3VuZGVyc2l6ZV9wa3RzOworCXU2NCByeF9vdmVyc2l6ZV9wa3RzOworCXU2NCByeF9qYWJiZXJfcGt0czsKKwl1NjQgcnhfdW5kZXJzaXplX2ZjZXJyX3BrdHM7CisJdTY0IHJ4X2Ryb3BfZXZlbnRzOworCXU2NCByeF9mY2Vycl9wa3RzOworCXU2NCByeF9hbGlnbl9lcnI7CisJdTY0IHJ4X3N5bWJvbF9lcnI7CisJdTY0IHJ4X21hY19lcnI7CisJdTY0IHJ4X2N0bF9wa3RzOworCXU2NCByeF9wYXVzZV9wa3RzOworCXU2NCByeF82NF9wa3RzOworCXU2NCByeF82NV90b18xMjdfcGt0czsKKwl1NjQgcnhfMTI4XzI1NV9wa3RzOworCXU2NCByeF8yNTZfNTExX3BrdHM7CisJdTY0IHJ4XzUxMl90b18xMDIzX3BrdHM7CisJdTY0IHJ4XzEwMjRfdG9fMTUxOF9wa3RzOworCXU2NCByeF8xNTE5X3RvX21heF9wa3RzOworCXU2NCByeF9sZW5fZXJyX3BrdHM7Cit9OworCisvKgorICogaW50cl9jb250ZXh0IHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbgorICogdG8gaG9vayB0aGUgaW50ZXJydXB0cy4gIEl0IGlzIGFsc28gdXNlZCBpbiBhIHNpbmdsZQorICogaXJxIGVudmlyb25tZW50IGFzIGEgY29udGV4dCB0byB0aGUgSVNSLgorICovCitzdHJ1Y3QgaW50cl9jb250ZXh0IHsKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldjsKKwl1MzIgaW50cjsKKwl1MzIgaG9va2VkOworCXUzMiBpbnRyX2VuX21hc2s7CS8qIHZhbHVlL21hc2sgdXNlZCB0byBlbmFibGUgdGhpcyBpbnRyICovCisJdTMyIGludHJfZGlzX21hc2s7CS8qIHZhbHVlL21hc2sgdXNlZCB0byBkaXNhYmxlIHRoaXMgaW50ciAqLworCXUzMiBpbnRyX3JlYWRfbWFzazsJLyogdmFsdWUvbWFzayB1c2VkIHRvIHJlYWQgdGhpcyBpbnRyICovCisJY2hhciBuYW1lW0lGTkFNU0laICogMl07CisJYXRvbWljX3QgaXJxX2NudDsJLyogaXJxX2NudCBpcyB1c2VkIGluIHNpbmdsZSB2ZWN0b3IKKwkJCQkgKiBlbnZpcm9ubWVudC4gIEl0J3MgaW5jcmVtZW50ZWQgZm9yIGVhY2gKKwkJCQkgKiBpcnEgaGFuZGxlciB0aGF0IGlzIHNjaGVkdWxlZC4gIFdoZW4gZWFjaAorCQkJCSAqIGhhbmRsZXIgZmluaXNoZXMgaXQgZGVjcmVtZW50cyBpcnFfY250IGFuZAorCQkJCSAqIGVuYWJsZXMgaW50ZXJydXB0cyBpZiBpdCdzIHplcm8uICovCisJaXJxX2hhbmRsZXJfdCBoYW5kbGVyOworfTsKKworLyogYWRhcHRlciBmbGFncyBkZWZpbml0aW9ucy4gKi8KK2VudW0geworCVFMX0FEQVBURVJfVVAgPSAoMSA8PCAwKSwJLyogQWRhcHRlciBoYXMgYmVlbiBicm91Z2h0IHVwLiAqLworCVFMX0xFR0FDWV9FTkFCTEVEID0gKDEgPDwgMyksCisJUUxfTVNJX0VOQUJMRUQgPSAoMSA8PCAzKSwKKwlRTF9NU0lYX0VOQUJMRUQgPSAoMSA8PCA0KSwKKwlRTF9ETUE2NCA9ICgxIDw8IDUpLAorCVFMX1BST01JU0NVT1VTID0gKDEgPDwgNiksCisJUUxfQUxMTVVMVEkgPSAoMSA8PCA3KSwKK307CisKKy8qIGxpbmtfc3RhdHVzIGJpdCBkZWZpbml0aW9ucyAqLworZW51bSB7CisJTE9PUEJBQ0tfTUFTSyA9IDB4MDAwMDA3MDAsCisJTE9PUEJBQ0tfUENTID0gMHgwMDAwMDEwMCwKKwlMT09QQkFDS19IU1MgPSAweDAwMDAwMjAwLAorCUxPT1BCQUNLX0VYVCA9IDB4MDAwMDAzMDAsCisJUEFVU0VfTUFTSyA9IDB4MDAwMDAwYzAsCisJUEFVU0VfU1REID0gMHgwMDAwMDA0MCwKKwlQQVVTRV9QUkkgPSAweDAwMDAwMDgwLAorCVNQRUVEX01BU0sgPSAweDAwMDAwMDM4LAorCVNQRUVEXzEwME1iID0gMHgwMDAwMDAwMCwKKwlTUEVFRF8xR2IgPSAweDAwMDAwMDA4LAorCVNQRUVEXzEwR2IgPSAweDAwMDAwMDEwLAorCUxJTktfVFlQRV9NQVNLID0gMHgwMDAwMDAwNywKKwlMSU5LX1RZUEVfWEZJID0gMHgwMDAwMDAwMSwKKwlMSU5LX1RZUEVfWEFVSSA9IDB4MDAwMDAwMDIsCisJTElOS19UWVBFX1hGSV9CUCA9IDB4MDAwMDAwMDMsCisJTElOS19UWVBFX1hBVUlfQlAgPSAweDAwMDAwMDA0LAorCUxJTktfVFlQRV8xMEdCQVNFVCA9IDB4MDAwMDAwMDUsCit9OworCisvKgorICogVGhlIG1haW4gQWRhcHRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqIFRoaXMgc3RydWN0dXJlIGhhcyBhbGwgZmllbGRzIHJlbGV2YW50IHRvIHRoZSBoYXJkd2FyZS4KKyAqLworc3RydWN0IHFsX2FkYXB0ZXIgeworCXN0cnVjdCByaWNiIHJpY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgd29sOworCisJc3RydWN0IG5pY19zdGF0cyBuaWNfc3RhdHM7CisKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisKKwkvKiBQQ0kgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsJLyogUGFyZW50IE5FVCBkZXZpY2UgKi8KKworCS8qIEhhcmR3YXJlIGluZm9ybWF0aW9uICovCisJdTMyIGNoaXBfcmV2X2lkOworCXUzMiBmdW5jOwkJLyogUENJIGZ1bmN0aW9uIGZvciB0aGlzIGFkYXB0ZXIgKi8KKworCXNwaW5sb2NrX3QgYWRhcHRlcl9sb2NrOworCXNwaW5sb2NrX3QgaHdfbG9jazsKKwlzcGlubG9ja190IHN0YXRzX2xvY2s7CisJc3BpbmxvY2tfdCBsZWdhY3lfbG9jazsJLyogdXNlZCBmb3IgbWFpbnRhaW5pbmcgbGVnYWN5IGludHIgc3luYyAqLworCisJLyogUENJIEJ1cyBSZWxhdGl2ZSBSZWdpc3RlciBBZGRyZXNzZXMgKi8KKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCXZvaWQgX19pb21lbSAqZG9vcmJlbGxfYXJlYTsKKwl1MzIgZG9vcmJlbGxfYXJlYV9zaXplOworCisJdTMyIG1zZ19lbmFibGU7CisKKwkvKiBQYWdlIGZvciBTaGFkb3cgUmVnaXN0ZXJzICovCisJdm9pZCAqcnhfcmluZ19zaGFkb3dfcmVnX2FyZWE7CisJZG1hX2FkZHJfdCByeF9yaW5nX3NoYWRvd19yZWdfZG1hOworCXZvaWQgKnR4X3Jpbmdfc2hhZG93X3JlZ19hcmVhOworCWRtYV9hZGRyX3QgdHhfcmluZ19zaGFkb3dfcmVnX2RtYTsKKworCXUzMiBtYWlsYm94X2luOworCXUzMiBtYWlsYm94X291dDsKKworCWludCB0eF9yaW5nX3NpemU7CisJaW50IHJ4X3Jpbmdfc2l6ZTsKKwl1MzIgaW50cl9jb3VudDsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpX3hfZW50cnk7CisJc3RydWN0IGludHJfY29udGV4dCBpbnRyX2NvbnRleHRbTUFYX1JYX1JJTkdTXTsKKworCWludCAoKmxlZ2FjeV9jaGVjaykgKHN0cnVjdCBxbF9hZGFwdGVyICopOworCisJaW50IHR4X3JpbmdfY291bnQ7CS8qIE9uZSBwZXIgb25saW5lIENQVS4gKi8KKwl1MzIgcnNzX3JpbmdfZmlyc3RfY3FfaWQ7LyogaW5kZXggb2YgZmlyc3QgaW5ib3VuZCAocnNzKSByeF9yaW5nICovCisJdTMyIHJzc19yaW5nX2NvdW50OwkvKiBPbmUgcGVyIG9ubGluZSBDUFUuICAqLworCS8qCisJICogcnhfcmluZ19jb3VudCA9CisJICogIG9uZSBkZWZhdWx0IHF1ZXVlICsKKwkgKiAgKENQVSBjb3VudCAqIG91dGJvdW5kIGNvbXBsZXRpb24gcnhfcmluZykgKworCSAqICAoQ1BVIGNvdW50ICogaW5ib3VuZCAoUlNTKSBjb21wbGV0aW9uIHJ4X3JpbmcpCisJICovCisJaW50IHJ4X3JpbmdfY291bnQ7CisJaW50IHJpbmdfbWVtX3NpemU7CisJdm9pZCAqcmluZ19tZW07CisJc3RydWN0IHJ4X3JpbmcgKnJ4X3Jpbmc7CisJaW50IHJ4X2NzdW07CisJc3RydWN0IHR4X3JpbmcgKnR4X3Jpbmc7CisJdTMyIGRlZmF1bHRfcnhfcXVldWU7CisKKwl1MTYgcnhfY29hbGVzY2VfdXNlY3M7CS8qIGNxaWNiLT5pbnRfZGVsYXkgKi8KKwl1MTYgcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CS8qIGNxaWNiLT5wa3RfaW50X2RlbGF5ICovCisJdTE2IHR4X2NvYWxlc2NlX3VzZWNzOwkvKiBjcWljYi0+aW50X2RlbGF5ICovCisJdTE2IHR4X21heF9jb2FsZXNjZWRfZnJhbWVzOwkvKiBjcWljYi0+cGt0X2ludF9kZWxheSAqLworCisJdTMyIHhnX3NlbV9tYXNrOworCXUzMiBwb3J0X2xpbmtfdXA7CisJdTMyIHBvcnRfaW5pdDsKKwl1MzIgbGlua19zdGF0dXM7CisKKwlzdHJ1Y3QgZmxhc2hfcGFyYW1zIGZsYXNoOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnFfd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhc2ljX3Jlc2V0X3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayBtcGlfcmVzZXRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG1waV93b3JrOworfTsKKworLyoKKyAqIFR5cGljYWwgUmVnaXN0ZXIgYWNjZXNzb3IgZm9yIG1lbW9yeSBtYXBwZWQgZGV2aWNlLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBxbF9yZWFkMzIoY29uc3Qgc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIGludCByZWcpCit7CisJcmV0dXJuIHJlYWRsKHFkZXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworLyoKKyAqIFR5cGljYWwgUmVnaXN0ZXIgYWNjZXNzb3IgZm9yIG1lbW9yeSBtYXBwZWQgZGV2aWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcWxfd3JpdGUzMihjb25zdCBzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgaW50IHJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBxZGV2LT5yZWdfYmFzZSArIHJlZyk7Cit9CisKKy8qCisgKiBEb29yYmVsbCBSZWdpc3RlcnM6CisgKiBEb29yYmVsbCByZWdpc3RlcnMgYXJlIHZpcnR1YWwgcmVnaXN0ZXJzIGluIHRoZSBQQ0kgbWVtb3J5IHNwYWNlLgorICogVGhlIHNwYWNlIGlzIGFsbG9jYXRlZCBieSB0aGUgY2hpcCBkdXJpbmcgUENJIGluaXRpYWxpemF0aW9uLiAgVGhlCisgKiBkZXZpY2UgZHJpdmVyIGZpbmRzIHRoZSBkb29yYmVsbCBhZGRyZXNzIGluIEJBUiAzIGluIFBDSSBjb25maWcgc3BhY2UuCisgKiBUaGUgcmVnaXN0ZXJzIGFyZSB1c2VkIHRvIGNvbnRyb2wgb3V0Ym91bmQgYW5kIGluYm91bmQgcXVldWVzLiBGb3IKKyAqIGV4YW1wbGUsIHRoZSBwcm9kdWNlciBpbmRleCBmb3IgYW4gb3V0Ym91bmQgcXVldWUuICBFYWNoIHF1ZXVlIHVzZXMKKyAqIDEgNGsgY2h1bmsgb2YgbWVtb3J5LiAgVGhlIGxvd2VyIGhhbGYgb2YgdGhlIHNwYWNlIGlzIGZvciBvdXRib3VuZAorICogcXVldWVzLiBUaGUgdXBwZXIgaGFsZiBpcyBmb3IgaW5ib3VuZCBxdWV1ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxbF93cml0ZV9kYl9yZWcodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXdyaXRlbCh2YWwsIGFkZHIpOworCW1taW93YigpOworfQorCisvKgorICogU2hhZG93IFJlZ2lzdGVyczoKKyAqIE91dGJvdW5kIHF1ZXVlcyBoYXZlIGEgY29uc3VtZXIgaW5kZXggdGhhdCBpcyBtYWludGFpbmVkIGJ5IHRoZSBjaGlwLgorICogSW5ib3VuZCBxdWV1ZXMgaGF2ZSBhIHByb2R1Y2VyIGluZGV4IHRoYXQgaXMgbWFpbnRhaW5lZCBieSB0aGUgY2hpcC4KKyAqIEZvciBsb3dlciBvdmVyaGVhZCwgdGhlc2UgcmVnaXN0ZXJzIGFyZSAic2hhZG93ZWQiIHRvIGhvc3QgbWVtb3J5CisgKiB3aGljaCBhbGxvd3MgdGhlIGRldmljZSBkcml2ZXIgdG8gdHJhY2sgdGhlIHF1ZXVlIHByb2dyZXNzIHdpdGhvdXQKKyAqIFBDSSByZWFkcy4gV2hlbiBhbiBlbnRyeSBpcyBwbGFjZWQgb24gYW4gaW5ib3VuZCBxdWV1ZSwgdGhlIGNoaXAgd2lsbAorICogdXBkYXRlIHRoZSByZWxldmFudCBpbmRleCByZWdpc3RlciBhbmQgdGhlbiBjb3B5IHRoZSB2YWx1ZSB0byB0aGUKKyAqIHNoYWRvdyByZWdpc3RlciBpbiBob3N0IG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcWxfcmVhZF9zaF9yZWcoY29uc3Qgdm9sYXRpbGUgdm9pZCAgKmFkZHIpCit7CisJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilhZGRyOworfQorCitleHRlcm4gY2hhciBxbGdlX2RyaXZlcl9uYW1lW107CitleHRlcm4gY29uc3QgY2hhciBxbGdlX2RyaXZlcl92ZXJzaW9uW107CitleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFsZ2VfZXRodG9vbF9vcHM7CisKK2V4dGVybiBpbnQgcWxfc2VtX3NwaW5sb2NrKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgc2VtX21hc2spOworZXh0ZXJuIHZvaWQgcWxfc2VtX3VubG9jayhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIHNlbV9tYXNrKTsKK2V4dGVybiBpbnQgcWxfcmVhZF94Z21hY19yZWcoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiByZWcsIHUzMiAqZGF0YSk7CitleHRlcm4gaW50IHFsX2dldF9tYWNfYWRkcl9yZWcoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiB0eXBlLCB1MTYgaW5kZXgsCisJCQkgICAgICAgdTMyICp2YWx1ZSk7CitleHRlcm4gaW50IHFsX2dldF9yb3V0aW5nX3JlZyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIGluZGV4LCB1MzIgKnZhbHVlKTsKK2V4dGVybiBpbnQgcWxfd3JpdGVfY2ZnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB2b2lkICpwdHIsIGludCBzaXplLCB1MzIgYml0LAorCQkJdTE2IHFfaWQpOwordm9pZCBxbF9xdWV1ZV9md19lcnJvcihzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldik7Cit2b2lkIHFsX21waV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHFsX21waV9yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitpbnQgcWxfd2FpdF9yZWdfcmR5KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgcmVnLCB1MzIgYml0LCB1MzIgZWJpdCk7Cit2b2lkIHFsX3F1ZXVlX2FzaWNfZXJyb3Ioc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOwordm9pZCBxbF9lbmFibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBpbnRyKTsKK3ZvaWQgcWxfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKK2ludCBxbF9yZWFkX3hnbWFjX3JlZzY0KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgcmVnLCB1NjQgKmRhdGEpOworCisjaWYgMQorI2RlZmluZSBRTF9BTExfRFVNUAorI2RlZmluZSBRTF9SRUdfRFVNUAorI2RlZmluZSBRTF9ERVZfRFVNUAorI2RlZmluZSBRTF9DQl9EVU1QCisvKiAjZGVmaW5lIFFMX0lCX0RVTVAgKi8KKy8qICNkZWZpbmUgUUxfT0JfRFVNUCAqLworI2VuZGlmCisKKyNpZmRlZiBRTF9SRUdfRFVNUAorZXh0ZXJuIHZvaWQgcWxfZHVtcF94Z21hY19jb250cm9sX3JlZ3Moc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9yb3V0aW5nX2VudHJpZXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9yZWdzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KTsKKyNkZWZpbmUgUUxfRFVNUF9SRUdTKHFkZXYpIHFsX2R1bXBfcmVncyhxZGV2KQorI2RlZmluZSBRTF9EVU1QX1JPVVRFKHFkZXYpIHFsX2R1bXBfcm91dGluZ19lbnRyaWVzKHFkZXYpCisjZGVmaW5lIFFMX0RVTVBfWEdNQUNfQ09OVFJPTF9SRUdTKHFkZXYpIHFsX2R1bXBfeGdtYWNfY29udHJvbF9yZWdzKHFkZXYpCisjZWxzZQorI2RlZmluZSBRTF9EVU1QX1JFR1MocWRldikKKyNkZWZpbmUgUUxfRFVNUF9ST1VURShxZGV2KQorI2RlZmluZSBRTF9EVU1QX1hHTUFDX0NPTlRST0xfUkVHUyhxZGV2KQorI2VuZGlmCisKKyNpZmRlZiBRTF9TVEFUX0RVTVAKK2V4dGVybiB2b2lkIHFsX2R1bXBfc3RhdChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldik7CisjZGVmaW5lIFFMX0RVTVBfU1RBVChxZGV2KSBxbF9kdW1wX3N0YXQocWRldikKKyNlbHNlCisjZGVmaW5lIFFMX0RVTVBfU1RBVChxZGV2KQorI2VuZGlmCisKKyNpZmRlZiBRTF9ERVZfRFVNUAorZXh0ZXJuIHZvaWQgcWxfZHVtcF9xZGV2KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KTsKKyNkZWZpbmUgUUxfRFVNUF9RREVWKHFkZXYpIHFsX2R1bXBfcWRldihxZGV2KQorI2Vsc2UKKyNkZWZpbmUgUUxfRFVNUF9RREVWKHFkZXYpCisjZW5kaWYKKworI2lmZGVmIFFMX0NCX0RVTVAKK2V4dGVybiB2b2lkIHFsX2R1bXBfd3FpY2Ioc3RydWN0IHdxaWNiICp3cWljYik7CitleHRlcm4gdm9pZCBxbF9kdW1wX3R4X3Jpbmcoc3RydWN0IHR4X3JpbmcgKnR4X3JpbmcpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9yaWNiKHN0cnVjdCByaWNiICpyaWNiKTsKK2V4dGVybiB2b2lkIHFsX2R1bXBfY3FpY2Ioc3RydWN0IGNxaWNiICpjcWljYik7CitleHRlcm4gdm9pZCBxbF9kdW1wX3J4X3Jpbmcoc3RydWN0IHJ4X3JpbmcgKnJ4X3JpbmcpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9od19jYihzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgaW50IHNpemUsIHUzMiBiaXQsIHUxNiBxX2lkKTsKKyNkZWZpbmUgUUxfRFVNUF9SSUNCKHJpY2IpIHFsX2R1bXBfcmljYihyaWNiKQorI2RlZmluZSBRTF9EVU1QX1dRSUNCKHdxaWNiKSBxbF9kdW1wX3dxaWNiKHdxaWNiKQorI2RlZmluZSBRTF9EVU1QX1RYX1JJTkcodHhfcmluZykgcWxfZHVtcF90eF9yaW5nKHR4X3JpbmcpCisjZGVmaW5lIFFMX0RVTVBfQ1FJQ0IoY3FpY2IpIHFsX2R1bXBfY3FpY2IoY3FpY2IpCisjZGVmaW5lIFFMX0RVTVBfUlhfUklORyhyeF9yaW5nKSBxbF9kdW1wX3J4X3JpbmcocnhfcmluZykKKyNkZWZpbmUgUUxfRFVNUF9IV19DQihxZGV2LCBzaXplLCBiaXQsIHFfaWQpIFwKKwkJcWxfZHVtcF9od19jYihxZGV2LCBzaXplLCBiaXQsIHFfaWQpCisjZWxzZQorI2RlZmluZSBRTF9EVU1QX1JJQ0IocmljYikKKyNkZWZpbmUgUUxfRFVNUF9XUUlDQih3cWljYikKKyNkZWZpbmUgUUxfRFVNUF9UWF9SSU5HKHR4X3JpbmcpCisjZGVmaW5lIFFMX0RVTVBfQ1FJQ0IoY3FpY2IpCisjZGVmaW5lIFFMX0RVTVBfUlhfUklORyhyeF9yaW5nKQorI2RlZmluZSBRTF9EVU1QX0hXX0NCKHFkZXYsIHNpemUsIGJpdCwgcV9pZCkKKyNlbmRpZgorCisjaWZkZWYgUUxfT0JfRFVNUAorZXh0ZXJuIHZvaWQgcWxfZHVtcF90eF9kZXNjKHN0cnVjdCB0eF9idWZfZGVzYyAqdGJkKTsKK2V4dGVybiB2b2lkIHFsX2R1bXBfb2JfbWFjX2lvY2Ioc3RydWN0IG9iX21hY19pb2NiX3JlcSAqb2JfbWFjX2lvY2IpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9vYl9tYWNfcnNwKHN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgKm9iX21hY19yc3ApOworI2RlZmluZSBRTF9EVU1QX09CX01BQ19JT0NCKG9iX21hY19pb2NiKSBxbF9kdW1wX29iX21hY19pb2NiKG9iX21hY19pb2NiKQorI2RlZmluZSBRTF9EVU1QX09CX01BQ19SU1Aob2JfbWFjX3JzcCkgcWxfZHVtcF9vYl9tYWNfcnNwKG9iX21hY19yc3ApCisjZWxzZQorI2RlZmluZSBRTF9EVU1QX09CX01BQ19JT0NCKG9iX21hY19pb2NiKQorI2RlZmluZSBRTF9EVU1QX09CX01BQ19SU1Aob2JfbWFjX3JzcCkKKyNlbmRpZgorCisjaWZkZWYgUUxfSUJfRFVNUAorZXh0ZXJuIHZvaWQgcWxfZHVtcF9pYl9tYWNfcnNwKHN0cnVjdCBpYl9tYWNfaW9jYl9yc3AgKmliX21hY19yc3ApOworI2RlZmluZSBRTF9EVU1QX0lCX01BQ19SU1AoaWJfbWFjX3JzcCkgcWxfZHVtcF9pYl9tYWNfcnNwKGliX21hY19yc3ApCisjZWxzZQorI2RlZmluZSBRTF9EVU1QX0lCX01BQ19SU1AoaWJfbWFjX3JzcCkKKyNlbmRpZgorCisjaWZkZWYJUUxfQUxMX0RVTVAKK2V4dGVybiB2b2lkIHFsX2R1bXBfYWxsKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KTsKKyNkZWZpbmUgUUxfRFVNUF9BTEwocWRldikgcWxfZHVtcF9hbGwocWRldikKKyNlbHNlCisjZGVmaW5lIFFMX0RVTVBfQUxMKHFkZXYpCisjZW5kaWYKKworI2VuZGlmIC8qIF9RTEdFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkZjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYwpAQCAtMCwwICsxLDg1OCBAQAorI2luY2x1ZGUgInFsZ2UuaCIKKworI2lmZGVmIFFMX1JFR19EVU1QCitzdGF0aWMgdm9pZCBxbF9kdW1wX2ludHJfc3RhdGVzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCXUzMiB2YWx1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgcWRldi0+aW50cl9jb3VudDsgaSsrKSB7CisJCXFsX3dyaXRlMzIocWRldiwgSU5UUl9FTiwgcWRldi0+aW50cl9jb250ZXh0W2ldLmludHJfcmVhZF9tYXNrKTsKKwkJdmFsdWUgPSBxbF9yZWFkMzIocWRldiwgSU5UUl9FTik7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICIlczogSW50ZXJydXB0ICVkIGlzICVzLlxuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUsIGksCisJCSAgICAgICAodmFsdWUgJiBJTlRSX0VOX0VOID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworCX0KK30KKwordm9pZCBxbF9kdW1wX3hnbWFjX2NvbnRyb2xfcmVncyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwl1MzIgZGF0YTsKKwlpZiAocWxfc2VtX3NwaW5sb2NrKHFkZXYsIHFkZXYtPnhnX3NlbV9tYXNrKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBnZXQgeGdtYWMgc2VtLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIFBBVVNFX1NSQ19MTywgJmRhdGEpOworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQVVTRV9TUkNfTE8gPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKKwkgICAgICAgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfU1JDX0hJLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFBBVVNFX1NSQ19ISSA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAorCSAgICAgICBkYXRhKTsKKwlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBHTE9CQUxfQ0ZHLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEdMT0JBTF9DRkcgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKKwkgICAgICAgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgVFhfQ0ZHLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFRYX0NGRyA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLCBkYXRhKTsKKwlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBSWF9DRkcsICZkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUlhfQ0ZHID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsIGRhdGEpOworCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIEZMT1dfQ1RMLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEZMT1dfQ1RMID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsCisJICAgICAgIGRhdGEpOworCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIFBBVVNFX09QQ09ERSwgJmRhdGEpOworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQVVTRV9PUENPREUgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKKwkgICAgICAgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfVElNRVIsICZkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfVElNRVIgPSAweCUuMDh4LlxuIiwgcWRldi0+bmRldi0+bmFtZSwKKwkgICAgICAgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfRlJNX0RFU1RfTE8sICZkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfRlJNX0RFU1RfTE8gPSAweCUuMDh4LlxuIiwKKwkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgUEFVU0VfRlJNX0RFU1RfSEksICZkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUEFVU0VfRlJNX0RFU1RfSEkgPSAweCUuMDh4LlxuIiwKKwkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgTUFDX1RYX1BBUkFNUywgJmRhdGEpOworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBNQUNfVFhfUEFSQU1TID0gMHglLjA4eC5cbiIsIHFkZXYtPm5kZXYtPm5hbWUsCisJICAgICAgIGRhdGEpOworCXFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIE1BQ19SWF9QQVJBTVMsICZkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogTUFDX1JYX1BBUkFNUyA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAorCSAgICAgICBkYXRhKTsKKwlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfU1lTX0lOVCwgJmRhdGEpOworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBNQUNfU1lTX0lOVCA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAorCSAgICAgICBkYXRhKTsKKwlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfU1lTX0lOVF9NQVNLLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19TWVNfSU5UX01BU0sgPSAweCUuMDh4LlxuIiwKKwkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgTUFDX01HTVRfSU5ULCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19NR01UX0lOVCA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAorCSAgICAgICBkYXRhKTsKKwlxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCBNQUNfTUdNVF9JTl9NQVNLLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IE1BQ19NR01UX0lOX01BU0sgPSAweCUuMDh4LlxuIiwKKwkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgZGF0YSk7CisJcWxfcmVhZF94Z21hY19yZWcocWRldiwgRVhUX0FSQl9NT0RFLCAmZGF0YSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEVYVF9BUkJfTU9ERSA9IDB4JS4wOHguXG4iLCBxZGV2LT5uZGV2LT5uYW1lLAorCSAgICAgICBkYXRhKTsKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIHFkZXYtPnhnX3NlbV9tYXNrKTsKKworfQorCitzdGF0aWMgdm9pZCBxbF9kdW1wX2V0c19yZWdzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworfQorCitzdGF0aWMgdm9pZCBxbF9kdW1wX2NhbV9lbnRyaWVzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCXUzMiB2YWx1ZVszXTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChxbF9nZXRfbWFjX2FkZHJfcmVnKHFkZXYsIE1BQ19BRERSX1RZUEVfQ0FNX01BQywgaSwgdmFsdWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBGYWlsZWQgcmVhZCBvZiBtYWMgaW5kZXggcmVnaXN0ZXIuXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWx1ZVswXSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICIlczogQ0FNIGluZGV4ICVkIENBTSBMb29rdXAgTG93ZXIgPSAweCUuMDh4OiUuMDh4LCBPdXRwdXQgPSAweCUuMDh4LlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgaSwgdmFsdWVbMV0sIHZhbHVlWzBdLAorCQkJCSAgICAgICB2YWx1ZVsyXSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKHFsX2dldF9tYWNfYWRkcl9yZWcKKwkJICAgIChxZGV2LCBNQUNfQUREUl9UWVBFX01VTFRJX01BQywgaSwgdmFsdWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIiVzOiBGYWlsZWQgcmVhZCBvZiBtYWMgaW5kZXggcmVnaXN0ZXIuXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWx1ZVswXSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICIlczogTUNBU1QgaW5kZXggJWQgQ0FNIExvb2t1cCBMb3dlciA9IDB4JS4wOHg6JS4wOHguXG4iLAorCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lLCBpLCB2YWx1ZVsxXSwgdmFsdWVbMF0pOworCQl9CisJfQorfQorCit2b2lkIHFsX2R1bXBfcm91dGluZ19lbnRyaWVzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCXUzMiB2YWx1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl2YWx1ZSA9IDA7CisJCWlmIChxbF9nZXRfcm91dGluZ19yZWcocWRldiwgaSwgJnZhbHVlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJICAgICAgICIlczogRmFpbGVkIHJlYWQgb2Ygcm91dGluZyBpbmRleCByZWdpc3Rlci5cbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKHZhbHVlKQorCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgICAgIiVzOiBSb3V0aW5nIE1hc2sgJWQgPSAweCUuMDh4LlxuIiwKKwkJCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSwgaSwgdmFsdWUpOworCQl9CisJfQorfQorCit2b2lkIHFsX2R1bXBfcmVncyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyZWcgZHVtcCBmb3IgZnVuY3Rpb24gIyVkLlxuIiwgcWRldi0+ZnVuYyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU1lTCSAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgU1lTKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlNUX0ZPIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBSU1RfRk8pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJGU0MgCQkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBGU0MpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJDU1IgCQkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBDU1IpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJJQ0JfUklEIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBJQ0JfUklEKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSUNCX0wgCQkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBJQ0JfTCkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIklDQl9IIAkJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgSUNCX0gpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJDRkcgCQkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBDRkcpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJCSU9TX0FERFIgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEJJT1NfQUREUikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlNUUyAJCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFNUUykpOworCXByaW50ayhLRVJOX0VSUiBQRlggIklOVFJfRU4JCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgSU5UUl9FTikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIklOVFJfTUFTSyAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgSU5UUl9NQVNLKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSVNSMSAJCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIElTUjEpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJJU1IyIAkJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgSVNSMikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIklTUjMgCQkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBJU1IzKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSVNSNCAJCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIElTUjQpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSRVZfSUQgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFJFVl9JRCkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkZSQ19FQ0NfRVJSIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBGUkNfRUNDX0VSUikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUl9TVFMgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEVSUl9TVFMpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSQU1fREJHX0FERFIgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFJBTV9EQkdfQUREUikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlJBTV9EQkdfREFUQSAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgUkFNX0RCR19EQVRBKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRUNDX0VSUl9DTlQgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEVDQ19FUlJfQ05UKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU0VNIAkJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgU0VNKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiR1BJT18xIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBHUElPXzEpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJHUElPXzIgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEdQSU9fMikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkdQSU9fMyAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgR1BJT18zKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiWEdNQUNfQUREUiAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgWEdNQUNfQUREUikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlhHTUFDX0RBVEEgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFhHTUFDX0RBVEEpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJOSUNfRVRTIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBOSUNfRVRTKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ05BX0VUUyAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ05BX0VUUykpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkZMQVNIX0FERFIgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEZMQVNIX0FERFIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJGTEFTSF9EQVRBIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBGTEFTSF9EQVRBKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ1FfU1RPUCAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ1FfU1RPUCkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlBBR0VfVEJMX1JJRCAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgUEFHRV9UQkxfUklEKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiV1FfUEFHRV9UQkxfTE8gCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgV1FfUEFHRV9UQkxfTE8pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJXUV9QQUdFX1RCTF9ISSAJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBXUV9QQUdFX1RCTF9ISSkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkNRX1BBR0VfVEJMX0xPIAkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIENRX1BBR0VfVEJMX0xPKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ1FfUEFHRV9UQkxfSEkgCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ1FfUEFHRV9UQkxfSEkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJDT1NfREZMVF9DUTEgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIENPU19ERkxUX0NRMSkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkNPU19ERkxUX0NRMiAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgQ09TX0RGTFRfQ1EyKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU1BMVF9IRFIgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFNQTFRfSERSKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfUEFVU0VfVEhSRVMgCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgRkNfUEFVU0VfVEhSRVMpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJOSUNfUEFVU0VfVEhSRVMgCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgTklDX1BBVVNFX1RIUkVTKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfRVRIRVJUWVBFIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBGQ19FVEhFUlRZUEUpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJGQ19SQ1ZfQ0ZHIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBGQ19SQ1ZfQ0ZHKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTklDX1JDVl9DRkcgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIE5JQ19SQ1ZfQ0ZHKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkNfQ09TX1RBR1MgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIEZDX0NPU19UQUdTKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTklDX0NPU19UQUdTIAkJCT0gMHgleC5cbiIsCisJICAgICAgIHFsX3JlYWQzMihxZGV2LCBOSUNfQ09TX1RBR1MpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJNR01UX1JDVl9DRkcgCQkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIE1HTVRfUkNWX0NGRykpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlhHX1NFUkRFU19BRERSIAkJPSAweCV4LlxuIiwKKwkgICAgICAgcWxfcmVhZDMyKHFkZXYsIFhHX1NFUkRFU19BRERSKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiWEdfU0VSREVTX0RBVEEgCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgWEdfU0VSREVTX0RBVEEpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJQUkJfTVhfQUREUiAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgUFJCX01YX0FERFIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJQUkJfTVhfREFUQSAJCQk9IDB4JXguXG4iLAorCSAgICAgICBxbF9yZWFkMzIocWRldiwgUFJCX01YX0RBVEEpKTsKKwlxbF9kdW1wX2ludHJfc3RhdGVzKHFkZXYpOworCXFsX2R1bXBfeGdtYWNfY29udHJvbF9yZWdzKHFkZXYpOworCXFsX2R1bXBfZXRzX3JlZ3MocWRldik7CisJcWxfZHVtcF9jYW1fZW50cmllcyhxZGV2KTsKKwlxbF9kdW1wX3JvdXRpbmdfZW50cmllcyhxZGV2KTsKK30KKyNlbmRpZgorCisjaWZkZWYgUUxfU1RBVF9EVU1QCit2b2lkIHFsX2R1bXBfc3RhdChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBFbnRlci5cbiIsIF9fZnVuY19fKTsKKwlwcmludGsoS0VSTl9FUlIgInR4X3BrdHMgPSAlbGRcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInR4X2J5dGVzID0gJWxkXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfYnl0ZXMpOworCXByaW50ayhLRVJOX0VSUiAidHhfbWNhc3RfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF9tY2FzdF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInR4X2JjYXN0X3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfYmNhc3RfcGt0cyk7CisJcHJpbnRrKEtFUk5fRVJSICJ0eF91Y2FzdF9wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4X3VjYXN0X3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAidHhfY3RsX3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMudHhfY3RsX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAidHhfcGF1c2VfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF9wYXVzZV9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInR4XzY0X3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF82NF9wa3QpOworCXByaW50ayhLRVJOX0VSUiAidHhfNjVfdG9fMTI3X3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF82NV90b18xMjdfcGt0KTsKKwlwcmludGsoS0VSTl9FUlIgInR4XzEyOF90b18yNTVfcGt0ID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4XzEyOF90b18yNTVfcGt0KTsKKwlwcmludGsoS0VSTl9FUlIgInR4XzI1Nl81MTFfcGt0ID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnR4XzI1Nl81MTFfcGt0KTsKKwlwcmludGsoS0VSTl9FUlIgInR4XzUxMl90b18xMDIzX3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF81MTJfdG9fMTAyM19wa3QpOworCXByaW50ayhLRVJOX0VSUiAidHhfMTAyNF90b18xNTE4X3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF8xMDI0X3RvXzE1MThfcGt0KTsKKwlwcmludGsoS0VSTl9FUlIgInR4XzE1MTlfdG9fbWF4X3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF8xNTE5X3RvX21heF9wa3QpOworCXByaW50ayhLRVJOX0VSUiAidHhfdW5kZXJzaXplX3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF91bmRlcnNpemVfcGt0KTsKKwlwcmludGsoS0VSTl9FUlIgInR4X292ZXJzaXplX3BrdCA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy50eF9vdmVyc2l6ZV9wa3QpOworCXByaW50ayhLRVJOX0VSUiAicnhfYnl0ZXMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfYnl0ZXMpOworCXByaW50ayhLRVJOX0VSUiAicnhfYnl0ZXNfb2sgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfYnl0ZXNfb2spOworCXByaW50ayhLRVJOX0VSUiAicnhfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4X3BrdHNfb2sgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfcGt0c19vayk7CisJcHJpbnRrKEtFUk5fRVJSICJyeF9iY2FzdF9wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X2JjYXN0X3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfbWNhc3RfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9tY2FzdF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4X3VjYXN0X3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfdWNhc3RfcGt0cyk7CisJcHJpbnRrKEtFUk5fRVJSICJyeF91bmRlcnNpemVfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF91bmRlcnNpemVfcGt0cyk7CisJcHJpbnRrKEtFUk5fRVJSICJyeF9vdmVyc2l6ZV9wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X292ZXJzaXplX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfamFiYmVyX3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfamFiYmVyX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfdW5kZXJzaXplX2ZjZXJyX3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfdW5kZXJzaXplX2ZjZXJyX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfZHJvcF9ldmVudHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfZHJvcF9ldmVudHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfZmNlcnJfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9mY2Vycl9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4X2FsaWduX2VyciA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9hbGlnbl9lcnIpOworCXByaW50ayhLRVJOX0VSUiAicnhfc3ltYm9sX2VyciA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9zeW1ib2xfZXJyKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4X21hY19lcnIgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfbWFjX2Vycik7CisJcHJpbnRrKEtFUk5fRVJSICJyeF9jdGxfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9jdGxfcGt0cyk7CisJcHJpbnRrKEtFUk5fRVJSICJyeF9wYXVzZV9wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4X3BhdXNlX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfNjRfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF82NF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4XzY1X3RvXzEyN19wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4XzY1X3RvXzEyN19wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4XzEyOF8yNTVfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF8xMjhfMjU1X3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfMjU2XzUxMV9wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4XzI1Nl81MTFfcGt0cyk7CisJcHJpbnRrKEtFUk5fRVJSICJyeF81MTJfdG9fMTAyM19wa3RzID0gJWxkLlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcWRldi0+bmljX3N0YXRzLnJ4XzUxMl90b18xMDIzX3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfMTAyNF90b18xNTE4X3BrdHMgPSAlbGQuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylxZGV2LT5uaWNfc3RhdHMucnhfMTAyNF90b18xNTE4X3BrdHMpOworCXByaW50ayhLRVJOX0VSUiAicnhfMTUxOV90b19tYXhfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF8xNTE5X3RvX21heF9wa3RzKTsKKwlwcmludGsoS0VSTl9FUlIgInJ4X2xlbl9lcnJfcGt0cyA9ICVsZC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXFkZXYtPm5pY19zdGF0cy5yeF9sZW5fZXJyX3BrdHMpOworfTsKKyNlbmRpZgorCisjaWZkZWYgUUxfREVWX0RVTVAKK3ZvaWQgcWxfZHVtcF9xZGV2KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPmZsYWdzIAkJCT0gJWx4LlxuIiwKKwkgICAgICAgcWRldi0+ZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnZsZ3JwIAkJCT0gJXAuXG4iLAorCSAgICAgICBxZGV2LT52bGdycCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cGRldiAJCQk9ICVwLlxuIiwKKwkgICAgICAgcWRldi0+cGRldik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+bmRldiAJCQk9ICVwLlxuIiwKKwkgICAgICAgcWRldi0+bmRldik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+Y2hpcF9yZXZfaWQgCQk9ICVkLlxuIiwKKwkgICAgICAgcWRldi0+Y2hpcF9yZXZfaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJlZ19iYXNlIAkJPSAlcC5cbiIsCisJICAgICAgIHFkZXYtPnJlZ19iYXNlKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT5kb29yYmVsbF9hcmVhIAk9ICVwLlxuIiwKKwkgICAgICAgcWRldi0+ZG9vcmJlbGxfYXJlYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+ZG9vcmJlbGxfYXJlYV9zaXplIAk9ICVkLlxuIiwKKwkgICAgICAgcWRldi0+ZG9vcmJlbGxfYXJlYV9zaXplKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJtc2dfZW5hYmxlIAkJPSAleC5cbiIsCisJICAgICAgIHFkZXYtPm1zZ19lbmFibGUpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJ4X3Jpbmdfc2hhZG93X3JlZ19hcmVhCT0gJXAuXG4iLAorCSAgICAgICBxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cnhfcmluZ19zaGFkb3dfcmVnX2RtYSAJPSAlbGx4LlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcWRldi0+cnhfcmluZ19zaGFkb3dfcmVnX2RtYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2FyZWEJPSAlcC5cbiIsCisJICAgICAgIHFkZXYtPnR4X3Jpbmdfc2hhZG93X3JlZ19hcmVhKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfZG1hCT0gJWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHFkZXYtPnR4X3Jpbmdfc2hhZG93X3JlZ19kbWEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPmludHJfY291bnQgCQk9ICVkLlxuIiwKKwkgICAgICAgcWRldi0+aW50cl9jb3VudCk7CisJaWYgKHFkZXYtPm1zaV94X2VudHJ5KQorCQlmb3IgKGkgPSAwOyBpIDwgcWRldi0+aW50cl9jb3VudDsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgIm1zaV94X2VudHJ5LlslZF12ZWN0b3IJPSAlZC5cbiIsIGksCisJCQkgICAgICAgcWRldi0+bXNpX3hfZW50cnlbaV0udmVjdG9yKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSAgICAgICAibXNpX3hfZW50cnkuWyVkXWVudHJ5CT0gJWQuXG4iLCBpLAorCQkJICAgICAgIHFkZXYtPm1zaV94X2VudHJ5W2ldLmVudHJ5KTsKKwkJfQorCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5pbnRyX2NvdW50OyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgImludHJfY29udGV4dFslZF0ucWRldgkJPSAlcC5cbiIsIGksCisJCSAgICAgICBxZGV2LT5pbnRyX2NvbnRleHRbaV0ucWRldik7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJpbnRyX2NvbnRleHRbJWRdLmludHIJCT0gJWQuXG4iLCBpLAorCQkgICAgICAgcWRldi0+aW50cl9jb250ZXh0W2ldLmludHIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiaW50cl9jb250ZXh0WyVkXS5ob29rZWQJCT0gJWQuXG4iLCBpLAorCQkgICAgICAgcWRldi0+aW50cl9jb250ZXh0W2ldLmhvb2tlZCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJpbnRyX2NvbnRleHRbJWRdLmludHJfZW5fbWFzawk9IDB4JTA4eC5cbiIsIGksCisJCSAgICAgICBxZGV2LT5pbnRyX2NvbnRleHRbaV0uaW50cl9lbl9tYXNrKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgImludHJfY29udGV4dFslZF0uaW50cl9kaXNfbWFzawk9IDB4JTA4eC5cbiIsIGksCisJCSAgICAgICBxZGV2LT5pbnRyX2NvbnRleHRbaV0uaW50cl9kaXNfbWFzayk7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJpbnRyX2NvbnRleHRbJWRdLmludHJfcmVhZF9tYXNrCT0gMHglMDh4LlxuIiwgaSwKKwkJICAgICAgIHFkZXYtPmludHJfY29udGV4dFtpXS5pbnRyX3JlYWRfbWFzayk7CisJfQorCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnR4X3JpbmdfY291bnQgPSAlZC5cbiIsIHFkZXYtPnR4X3JpbmdfY291bnQpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJ4X3JpbmdfY291bnQgPSAlZC5cbiIsIHFkZXYtPnJ4X3JpbmdfY291bnQpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJpbmdfbWVtX3NpemUgPSAlZC5cbiIsIHFkZXYtPnJpbmdfbWVtX3NpemUpOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnJpbmdfbWVtIAk9ICVwLlxuIiwgcWRldi0+cmluZ19tZW0pOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPmludHJfY291bnQgCT0gJWQuXG4iLCBxZGV2LT5pbnRyX2NvdW50KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJxZGV2LT50eF9yaW5nCQk9ICVwLlxuIiwKKwkgICAgICAgcWRldi0+dHhfcmluZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cnNzX3JpbmdfZmlyc3RfY3FfaWQgCT0gJWQuXG4iLAorCSAgICAgICBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cnNzX3JpbmdfY291bnQgCT0gJWQuXG4iLAorCSAgICAgICBxZGV2LT5yc3NfcmluZ19jb3VudCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+cnhfcmluZwk9ICVwLlxuIiwgcWRldi0+cnhfcmluZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+ZGVmYXVsdF9yeF9xdWV1ZQk9ICVkLlxuIiwKKwkgICAgICAgcWRldi0+ZGVmYXVsdF9yeF9xdWV1ZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicWRldi0+eGdfc2VtX21hc2sJCT0gMHglMDh4LlxuIiwKKwkgICAgICAgcWRldi0+eGdfc2VtX21hc2spOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnBvcnRfbGlua191cAkJPSAweCUwOHguXG4iLAorCSAgICAgICBxZGV2LT5wb3J0X2xpbmtfdXApOworCXByaW50ayhLRVJOX0VSUiBQRlggInFkZXYtPnBvcnRfaW5pdAkJPSAweCUwOHguXG4iLAorCSAgICAgICBxZGV2LT5wb3J0X2luaXQpOworCit9CisjZW5kaWYKKworI2lmZGVmIFFMX0NCX0RVTVAKK3ZvaWQgcWxfZHVtcF93cWljYihzdHJ1Y3Qgd3FpY2IgKndxaWNiKQoreworCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgd3FpY2Igc3R1ZmYuLi5cbiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT5sZW4gPSAweCV4LlxuIiwgbGUxNl90b19jcHUod3FpY2ItPmxlbikpOworCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT5mbGFncyA9ICV4LlxuIiwgbGUxNl90b19jcHUod3FpY2ItPmZsYWdzKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPmNxX2lkX3JzcyA9ICVkLlxuIiwKKwkgICAgICAgbGUxNl90b19jcHUod3FpY2ItPmNxX2lkX3JzcykpOworCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT5yaWQgPSAweCV4LlxuIiwgbGUxNl90b19jcHUod3FpY2ItPnJpZCkpOworCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT53cV9hZGRyX2xvID0gMHglLjA4eC5cbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHdxaWNiLT5hZGRyX2xvKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPndxX2FkZHJfaGkgPSAweCUuMDh4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUod3FpY2ItPmFkZHJfaGkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ3cWljYi0+d3FfY25zbXJfaWR4X2FkZHJfbG8gPSAweCUuMDh4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUod3FpY2ItPmNuc21yX2lkeF9hZGRyX2xvKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPndxX2Nuc21yX2lkeF9hZGRyX2hpID0gMHglLjA4eC5cbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHdxaWNiLT5jbnNtcl9pZHhfYWRkcl9oaSkpOworfQorCit2b2lkIHFsX2R1bXBfdHhfcmluZyhzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZykKK3sKKwlpZiAodHhfcmluZyA9PSBOVUxMKQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fRVJSIFBGWAorCSAgICAgICAiPT09PT09PT09PT09PT09PT09PT09IER1bXBpbmcgdHhfcmluZyAlZCA9PT09PT09PT09PT09PT0uXG4iLAorCSAgICAgICB0eF9yaW5nLT53cV9pZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+YmFzZSA9ICVwLlxuIiwgdHhfcmluZy0+d3FfYmFzZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+YmFzZV9kbWEgPSAweCVsbHguXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eF9yaW5nLT53cV9iYXNlX2RtYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZyA9ICVwLlxuIiwKKwkgICAgICAgdHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZ19kbWEgPSAweCVsbHguXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnX2RtYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+c2l6ZSA9ICVkLlxuIiwgdHhfcmluZy0+d3Ffc2l6ZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+bGVuID0gJWQuXG4iLCB0eF9yaW5nLT53cV9sZW4pOworCXByaW50ayhLRVJOX0VSUiBQRlggInR4X3JpbmctPnByb2RfaWR4X2RiX3JlZyA9ICVwLlxuIiwKKwkgICAgICAgdHhfcmluZy0+cHJvZF9pZHhfZGJfcmVnKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT52YWxpZF9kYl9yZWcgPSAlcC5cbiIsCisJICAgICAgIHR4X3JpbmctPnZhbGlkX2RiX3JlZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+cHJvZF9pZHggPSAlZC5cbiIsIHR4X3JpbmctPnByb2RfaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5jcV9pZCA9ICVkLlxuIiwgdHhfcmluZy0+Y3FfaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggInR4X3JpbmctPndxX2lkID0gJWQuXG4iLCB0eF9yaW5nLT53cV9pZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+cSA9ICVwLlxuIiwgdHhfcmluZy0+cSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+dHhfY291bnQgPSAlZC5cbiIsCisJICAgICAgIGF0b21pY19yZWFkKCZ0eF9yaW5nLT50eF9jb3VudCkpOworfQorCit2b2lkIHFsX2R1bXBfcmljYihzdHJ1Y3QgcmljYiAqcmljYikKK3sKKwlpbnQgaTsKKwlwcmludGsoS0VSTl9FUlIgUEZYCisJICAgICAgICI9PT09PT09PT09PT09PT09PT09PT0gRHVtcGluZyByaWNiID09PT09PT09PT09PT09PS5cbiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgcmljYiBzdHVmZi4uLlxuIik7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyaWNiLT5iYXNlX2NxID0gJWQuXG4iLCByaWNiLT5iYXNlX2NxICYgMHgxZik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmljYi0+ZmxhZ3MgPSAlcyVzJXMlcyVzJXMlcyVzJXMuXG4iLAorCSAgICAgICByaWNiLT5iYXNlX2NxICYgUlNTX0w0SyA/ICJSU1NfTDRLICIgOiAiIiwKKwkgICAgICAgcmljYi0+ZmxhZ3MgJiBSU1NfTDZLID8gIlJTU19MNksgIiA6ICIiLAorCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19MSSA/ICJSU1NfTEkgIiA6ICIiLAorCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19MQiA/ICJSU1NfTEIgIiA6ICIiLAorCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19MTSA/ICJSU1NfTE0gIiA6ICIiLAorCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19SSTQgPyAiUlNTX1JJNCAiIDogIiIsCisJICAgICAgIHJpY2ItPmZsYWdzICYgUlNTX1JUNCA/ICJSU1NfUlQ0ICIgOiAiIiwKKwkgICAgICAgcmljYi0+ZmxhZ3MgJiBSU1NfUkk2ID8gIlJTU19SSTYgIiA6ICIiLAorCSAgICAgICByaWNiLT5mbGFncyAmIFJTU19SVDYgPyAiUlNTX1JUNiAiIDogIiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPm1hc2sgPSAweCUuMDR4LlxuIiwgbGUxNl90b19jcHUocmljYi0+bWFzaykpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJyaWNiLT5oYXNoX2NxX2lkWyVkXSA9IDB4JS4wOHguXG4iLCBpLAorCQkgICAgICAgbGUzMl90b19jcHUocmljYi0+aGFzaF9jcV9pZFtpXSkpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJyaWNiLT5pcHY2X2hhc2hfa2V5WyVkXSA9IDB4JS4wOHguXG4iLCBpLAorCQkgICAgICAgbGUzMl90b19jcHUocmljYi0+aXB2Nl9oYXNoX2tleVtpXSkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXByaW50ayhLRVJOX0VSUiBQRlggInJpY2ItPmlwdjRfaGFzaF9rZXlbJWRdID0gMHglLjA4eC5cbiIsIGksCisJCSAgICAgICBsZTMyX3RvX2NwdShyaWNiLT5pcHY0X2hhc2hfa2V5W2ldKSk7Cit9CisKK3ZvaWQgcWxfZHVtcF9jcWljYihzdHJ1Y3QgY3FpY2IgKmNxaWNiKQoreworCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgY3FpY2Igc3R1ZmYuLi5cbiIpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPm1zaXhfdmVjdCA9ICVkLlxuIiwgY3FpY2ItPm1zaXhfdmVjdCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmZsYWdzID0gJXguXG4iLCBjcWljYi0+ZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sZW4gPSAlZC5cbiIsIGxlMTZfdG9fY3B1KGNxaWNiLT5sZW4pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+YWRkcl9sbyA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPmFkZHJfbG8pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+YWRkcl9oaSA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPmFkZHJfaGkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+cHJvZF9pZHhfYWRkcl9sbyA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPnByb2RfaWR4X2FkZHJfbG8pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+cHJvZF9pZHhfYWRkcl9oaSA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPnByb2RfaWR4X2FkZHJfaGkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+cGt0X2RlbGF5ID0gMHglLjA0eC5cbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5wa3RfZGVsYXkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+aXJxX2RlbGF5ID0gMHglLjA0eC5cbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5pcnFfZGVsYXkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+bGJxX2FkZHJfbG8gPSAleC5cbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGNxaWNiLT5sYnFfYWRkcl9sbykpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sYnFfYWRkcl9oaSA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPmxicV9hZGRyX2hpKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmxicV9idWZfc2l6ZSA9IDB4JS4wNHguXG4iLAorCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+bGJxX2J1Zl9zaXplKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmxicV9sZW4gPSAweCUuMDR4LlxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoY3FpY2ItPmxicV9sZW4pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+c2JxX2FkZHJfbG8gPSAleC5cbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGNxaWNiLT5zYnFfYWRkcl9sbykpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5zYnFfYWRkcl9oaSA9ICV4LlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoY3FpY2ItPnNicV9hZGRyX2hpKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnNicV9idWZfc2l6ZSA9IDB4JS4wNHguXG4iLAorCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+c2JxX2J1Zl9zaXplKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnNicV9sZW4gPSAweCUuMDR4LlxuIiwKKwkgICAgICAgbGUxNl90b19jcHUoY3FpY2ItPnNicV9sZW4pKTsKK30KKwordm9pZCBxbF9kdW1wX3J4X3Jpbmcoc3RydWN0IHJ4X3JpbmcgKnJ4X3JpbmcpCit7CisJaWYgKHJ4X3JpbmcgPT0gTlVMTCkKKwkJcmV0dXJuOworCXByaW50ayhLRVJOX0VSUiBQRlgKKwkgICAgICAgIj09PT09PT09PT09PT09PT09PT09PSBEdW1waW5nIHJ4X3JpbmcgJWQgPT09PT09PT09PT09PT09LlxuIiwKKwkgICAgICAgcnhfcmluZy0+Y3FfaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggIkR1bXBpbmcgcnhfcmluZyAlZCwgdHlwZSA9ICVzJXMlcy5cbiIsCisJICAgICAgIHJ4X3JpbmctPmNxX2lkLCByeF9yaW5nLT50eXBlID09IERFRkFVTFRfUSA/ICJERUZBVUxUIiA6ICIiLAorCSAgICAgICByeF9yaW5nLT50eXBlID09IFRYX1EgPyAiT1VUQk9VTkQgQ09NUExFVElPTlMiIDogIiIsCisJICAgICAgIHJ4X3JpbmctPnR5cGUgPT0gUlhfUSA/ICJJTkJPVU5EX0NPTVBMRVRJT05TIiA6ICIiKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcWljYiA9ICVwLlxuIiwgJnJ4X3JpbmctPmNxaWNiKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9iYXNlID0gJXAuXG4iLCByeF9yaW5nLT5jcV9iYXNlKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jcV9iYXNlX2RtYSA9ICVsbHguXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSByeF9yaW5nLT5jcV9iYXNlX2RtYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+Y3Ffc2l6ZSA9ICVkLlxuIiwgcnhfcmluZy0+Y3Ffc2l6ZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+Y3FfbGVuID0gJWQuXG4iLCByeF9yaW5nLT5jcV9sZW4pOworCXByaW50ayhLRVJOX0VSUiBQRlgKKwkgICAgICAgInJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZywgYWRkciA9ICVwLCB2YWx1ZSA9ICVkLlxuIiwKKwkgICAgICAgcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnLAorCSAgICAgICByeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcgPyAqKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZykgOiAwKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWdfZG1hID0gJWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZ19kbWEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNuc21yX2lkeF9kYl9yZWcgPSAlcC5cbiIsCisJICAgICAgIHJ4X3JpbmctPmNuc21yX2lkeF9kYl9yZWcpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNuc21yX2lkeCA9ICVkLlxuIiwgcnhfcmluZy0+Y25zbXJfaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5jdXJyX2VudHJ5ID0gJXAuXG4iLCByeF9yaW5nLT5jdXJyX2VudHJ5KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT52YWxpZF9kYl9yZWcgPSAlcC5cbiIsCisJICAgICAgIHJ4X3JpbmctPnZhbGlkX2RiX3JlZyk7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfYmFzZSA9ICVwLlxuIiwgcnhfcmluZy0+bGJxX2Jhc2UpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9iYXNlX2RtYSA9ICVsbHguXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSByeF9yaW5nLT5sYnFfYmFzZV9kbWEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0ID0gJXAuXG4iLAorCSAgICAgICByeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hID0gJWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0X2RtYSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxID0gJXAuXG4iLCByeF9yaW5nLT5sYnEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9sZW4gPSAlZC5cbiIsIHJ4X3JpbmctPmxicV9sZW4pOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9zaXplID0gJWQuXG4iLCByeF9yaW5nLT5sYnFfc2l6ZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX3Byb2RfaWR4X2RiX3JlZyA9ICVwLlxuIiwKKwkgICAgICAgcnhfcmluZy0+bGJxX3Byb2RfaWR4X2RiX3JlZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX3Byb2RfaWR4ID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5sYnFfcHJvZF9pZHgpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmxicV9jdXJyX2lkeCA9ICVkLlxuIiwKKwkgICAgICAgcnhfcmluZy0+bGJxX2N1cnJfaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfY2xlYW5faWR4ID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5sYnFfY2xlYW5faWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5sYnFfZnJlZV9jbnQgPSAlZC5cbiIsCisJICAgICAgIHJ4X3JpbmctPmxicV9mcmVlX2NudCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+bGJxX2J1Zl9zaXplID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5sYnFfYnVmX3NpemUpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX2Jhc2UgPSAlcC5cbiIsIHJ4X3JpbmctPnNicV9iYXNlKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfYmFzZV9kbWEgPSAlbGx4LlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnhfcmluZy0+c2JxX2Jhc2VfZG1hKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdCA9ICVwLlxuIiwKKwkgICAgICAgcnhfcmluZy0+c2JxX2Jhc2VfaW5kaXJlY3QpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSA9ICVsbHguXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicSA9ICVwLlxuIiwgcnhfcmluZy0+c2JxKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfbGVuID0gJWQuXG4iLCByeF9yaW5nLT5zYnFfbGVuKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfc2l6ZSA9ICVkLlxuIiwgcnhfcmluZy0+c2JxX3NpemUpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9wcm9kX2lkeF9kYl9yZWcgYWRkciA9ICVwLlxuIiwKKwkgICAgICAgcnhfcmluZy0+c2JxX3Byb2RfaWR4X2RiX3JlZyk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX3Byb2RfaWR4ID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5zYnFfcHJvZF9pZHgpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnNicV9jdXJyX2lkeCA9ICVkLlxuIiwKKwkgICAgICAgcnhfcmluZy0+c2JxX2N1cnJfaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfY2xlYW5faWR4ID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5zYnFfY2xlYW5faWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5zYnFfZnJlZV9jbnQgPSAlZC5cbiIsCisJICAgICAgIHJ4X3JpbmctPnNicV9mcmVlX2NudCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+c2JxX2J1Zl9zaXplID0gJWQuXG4iLAorCSAgICAgICByeF9yaW5nLT5zYnFfYnVmX3NpemUpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNxX2lkID0gJWQuXG4iLCByeF9yaW5nLT5jcV9pZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+aXJxID0gJWQuXG4iLCByeF9yaW5nLT5pcnEpOworCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPmNwdSA9ICVkLlxuIiwgcnhfcmluZy0+Y3B1KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJyeF9yaW5nLT5xZGV2ID0gJXAuXG4iLCByeF9yaW5nLT5xZGV2KTsKK30KKwordm9pZCBxbF9kdW1wX2h3X2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBpbnQgc2l6ZSwgdTMyIGJpdCwgdTE2IHFfaWQpCit7CisJdm9pZCAqcHRyOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEVudGVyLlxuIiwgX19mdW5jX18pOworCisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAocHRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgYnVmZmVyLlxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChxbF93cml0ZV9jZmcocWRldiwgcHRyLCBzaXplLCBiaXQsIHFfaWQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byB1cGxvYWQgY29udHJvbCBibG9jayFcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbF9pdDsKKwl9CisJc3dpdGNoIChiaXQpIHsKKwljYXNlIENGR19EUlE6CisJCXFsX2R1bXBfd3FpY2IoKHN0cnVjdCB3cWljYiAqKXB0cik7CisJCWJyZWFrOworCWNhc2UgQ0ZHX0RDUToKKwkJcWxfZHVtcF9jcWljYigoc3RydWN0IGNxaWNiICopcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBDRkdfRFI6CisJCXFsX2R1bXBfcmljYigoc3RydWN0IHJpY2IgKilwdHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogSW52YWxpZCBiaXQgdmFsdWUgPSAleC5cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgYml0KTsKKwkJYnJlYWs7CisJfQorZmFpbF9pdDoKKwlrZnJlZShwdHIpOworfQorI2VuZGlmCisKKyNpZmRlZiBRTF9PQl9EVU1QCit2b2lkIHFsX2R1bXBfdHhfZGVzYyhzdHJ1Y3QgdHhfYnVmX2Rlc2MgKnRiZCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmFkZHIgID0gMHglbGx4XG4iLAorCSAgICAgICBsZTY0X3RvX2NwdSgodTY0KSB0YmQtPmFkZHIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmxlbiAgID0gJWRcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHRiZC0+bGVuICYgVFhfREVTQ19MRU5fTUFTSykpOworCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+ZmxhZ3MgPSAlcyAlc1xuIiwKKwkgICAgICAgdGJkLT5sZW4gJiBUWF9ERVNDX0MgPyAiQyIgOiAiLiIsCisJICAgICAgIHRiZC0+bGVuICYgVFhfREVTQ19FID8gIkUiIDogIi4iKTsKKwl0YmQrKzsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmFkZHIgID0gMHglbGx4XG4iLAorCSAgICAgICBsZTY0X3RvX2NwdSgodTY0KSB0YmQtPmFkZHIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmxlbiAgID0gJWRcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHRiZC0+bGVuICYgVFhfREVTQ19MRU5fTUFTSykpOworCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+ZmxhZ3MgPSAlcyAlc1xuIiwKKwkgICAgICAgdGJkLT5sZW4gJiBUWF9ERVNDX0MgPyAiQyIgOiAiLiIsCisJICAgICAgIHRiZC0+bGVuICYgVFhfREVTQ19FID8gIkUiIDogIi4iKTsKKwl0YmQrKzsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmFkZHIgID0gMHglbGx4XG4iLAorCSAgICAgICBsZTY0X3RvX2NwdSgodTY0KSB0YmQtPmFkZHIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0YmQtPmxlbiAgID0gJWRcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHRiZC0+bGVuICYgVFhfREVTQ19MRU5fTUFTSykpOworCXByaW50ayhLRVJOX0VSUiBQRlggInRiZC0+ZmxhZ3MgPSAlcyAlc1xuIiwKKwkgICAgICAgdGJkLT5sZW4gJiBUWF9ERVNDX0MgPyAiQyIgOiAiLiIsCisJICAgICAgIHRiZC0+bGVuICYgVFhfREVTQ19FID8gIkUiIDogIi4iKTsKKworfQorCit2b2lkIHFsX2R1bXBfb2JfbWFjX2lvY2Ioc3RydWN0IG9iX21hY19pb2NiX3JlcSAqb2JfbWFjX2lvY2IpCit7CisJc3RydWN0IG9iX21hY190c29faW9jYl9yZXEgKm9iX21hY190c29faW9jYiA9CisJICAgIChzdHJ1Y3Qgb2JfbWFjX3Rzb19pb2NiX3JlcSAqKW9iX21hY19pb2NiOworCXN0cnVjdCB0eF9idWZfZGVzYyAqdGJkOworCXUxNiBmcmFtZV9sZW47CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlc1xuIiwgX19mdW5jX18pOworCXByaW50ayhLRVJOX0VSUiBQRlggIm9wY29kZSAgICAgICAgID0gJXNcbiIsCisJICAgICAgIChvYl9tYWNfaW9jYi0+b3Bjb2RlID09IE9QQ09ERV9PQl9NQUNfSU9DQikgPyAiTUFDIiA6ICJUU08iKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczEgICAgICAgICAgPSAlcyAlcyAlcyAlcyAlc1xuIiwKKwkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczEgJiBPQl9NQUNfVFNPX0lPQ0JfT0kgPyAiT0kiIDogIiIsCisJICAgICAgIG9iX21hY190c29faW9jYi0+ZmxhZ3MxICYgT0JfTUFDX1RTT19JT0NCX0kgPyAiSSIgOiAiIiwKKwkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczEgJiBPQl9NQUNfVFNPX0lPQ0JfRCA/ICJEIiA6ICIiLAorCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMSAmIE9CX01BQ19UU09fSU9DQl9JUDQgPyAiSVA0IiA6ICIiLAorCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMSAmIE9CX01BQ19UU09fSU9DQl9JUDYgPyAiSVA2IiA6ICIiKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczIgICAgICAgICAgPSAlcyAlcyAlc1xuIiwKKwkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczIgJiBPQl9NQUNfVFNPX0lPQ0JfTFNPID8gIkxTTyIgOiAiIiwKKwkgICAgICAgb2JfbWFjX3Rzb19pb2NiLT5mbGFnczIgJiBPQl9NQUNfVFNPX0lPQ0JfVUMgPyAiVUMiIDogIiIsCisJICAgICAgIG9iX21hY190c29faW9jYi0+ZmxhZ3MyICYgT0JfTUFDX1RTT19JT0NCX1RDID8gIlRDIiA6ICIiKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJmbGFnczMgICAgICAgICAgPSAlcyAlcyAlcyBcbiIsCisJICAgICAgIG9iX21hY190c29faW9jYi0+ZmxhZ3MzICYgT0JfTUFDX1RTT19JT0NCX0lDID8gIklDIiA6ICIiLAorCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMyAmIE9CX01BQ19UU09fSU9DQl9ERlAgPyAiREZQIiA6ICIiLAorCSAgICAgICBvYl9tYWNfdHNvX2lvY2ItPmZsYWdzMyAmIE9CX01BQ19UU09fSU9DQl9WID8gIlYiIDogIiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggInRpZCA9ICV4XG4iLCBvYl9tYWNfaW9jYi0+dGlkKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ0eHFfaWR4ID0gJWRcbiIsIG9iX21hY19pb2NiLT50eHFfaWR4KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ2bGFuX3RjaSAgICAgID0gJXhcbiIsIG9iX21hY190c29faW9jYi0+dmxhbl90Y2kpOworCWlmIChvYl9tYWNfaW9jYi0+b3Bjb2RlID09IE9QQ09ERV9PQl9NQUNfVFNPX0lPQ0IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZnJhbWVfbGVuICAgICAgPSAlZFxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KG9iX21hY190c29faW9jYi0+ZnJhbWVfbGVuKSk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm1zcyAgICAgID0gJWRcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShvYl9tYWNfdHNvX2lvY2ItPm1zcykpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwcm90X2hkcl9sZW4gICA9ICVkXG4iLAorCQkgICAgICAgbGUxNl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT50b3RhbF9oZHJzX2xlbikpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHJfb2Zmc2V0ICAgICA9IDB4JS4wNHhcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShvYl9tYWNfdHNvX2lvY2ItPm5ldF90cmFuc19vZmZzZXQpKTsKKwkJZnJhbWVfbGVuID0gbGUzMl90b19jcHUob2JfbWFjX3Rzb19pb2NiLT5mcmFtZV9sZW4pOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZyYW1lX2xlbiAgICAgID0gJWRcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShvYl9tYWNfaW9jYi0+ZnJhbWVfbGVuKSk7CisJCWZyYW1lX2xlbiA9IGxlMTZfdG9fY3B1KG9iX21hY19pb2NiLT5mcmFtZV9sZW4pOworCX0KKwl0YmQgPSAmb2JfbWFjX2lvY2ItPnRiZFswXTsKKwlxbF9kdW1wX3R4X2Rlc2ModGJkKTsKK30KKwordm9pZCBxbF9kdW1wX29iX21hY19yc3Aoc3RydWN0IG9iX21hY19pb2NiX3JzcCAqb2JfbWFjX3JzcCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlc1xuIiwgX19mdW5jX18pOworCXByaW50ayhLRVJOX0VSUiBQRlggIm9wY29kZSAgICAgICAgID0gJWRcbiIsIG9iX21hY19yc3AtPm9wY29kZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MgICAgICAgICAgPSAlcyAlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkgICAgICAgb2JfbWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX09JID8gIk9JIiA6ICIuIiwKKwkgICAgICAgb2JfbWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX0kgPyAiSSIgOiAiLiIsCisJICAgICAgIG9iX21hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9FID8gIkUiIDogIi4iLAorCSAgICAgICBvYl9tYWNfcnNwLT5mbGFnczEgJiBPQl9NQUNfSU9DQl9SU1BfUyA/ICJTIiA6ICIuIiwKKwkgICAgICAgb2JfbWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX0wgPyAiTCIgOiAiLiIsCisJICAgICAgIG9iX21hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9QID8gIlAiIDogIi4iLAorCSAgICAgICBvYl9tYWNfcnNwLT5mbGFnczIgJiBPQl9NQUNfSU9DQl9SU1BfQiA/ICJCIiA6ICIuIik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGlkID0gJXhcbiIsIG9iX21hY19yc3AtPnRpZCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFFMX0lCX0RVTVAKK3ZvaWQgcWxfZHVtcF9pYl9tYWNfcnNwKHN0cnVjdCBpYl9tYWNfaW9jYl9yc3AgKmliX21hY19yc3ApCit7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIF9fZnVuY19fKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJvcGNvZGUgICAgICAgICA9IDB4JXhcbiIsIGliX21hY19yc3AtPm9wY29kZSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MxID0gJXMlcyVzJXMlcyVzXG4iLAorCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfT0kgPyAiT0kgIiA6ICIiLAorCSAgICAgICBpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfSSA/ICJJICIgOiAiIiwKKwkgICAgICAgaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX1RFID8gIlRFICIgOiAiIiwKKwkgICAgICAgaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX05VID8gIk5VICIgOiAiIiwKKwkgICAgICAgaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX0lFID8gIklFICIgOiAiIiwKKwkgICAgICAgaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX0IgPyAiQiAiIDogIiIpOworCisJaWYgKGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9NX01BU0spCisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzJXMlcyBNdWx0aWNhc3QuXG4iLAorCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9NX01BU0spID09CisJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfTV9IQVNIID8gIkhhc2giIDogIiIsCisJCSAgICAgICAoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSykgPT0KKwkJICAgICAgIElCX01BQ19JT0NCX1JTUF9NX1JFRyA/ICJSZWdpc3RlcmVkIiA6ICIiLAorCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9NX01BU0spID09CisJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfTV9QUk9NID8gIlByb21pc2N1b3VzIiA6ICIiKTsKKworCXByaW50ayhLRVJOX0VSUiBQRlggImZsYWdzMiA9ICVzJXMlcyVzJXNcbiIsCisJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfUCkgPyAiUCAiIDogIiIsCisJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikgPyAiViAiIDogIiIsCisJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVSkgPyAiVSAiIDogIiIsCisJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVCkgPyAiVCAiIDogIiIsCisJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRk8pID8gIkZPICIgOiAiIik7CisKKwlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX0VSUl9NQVNLKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyVzJXMlcyVzIGVycm9yLlxuIiwKKwkJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spID09CisJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfRVJSX09WRVJTSVpFID8gIm92ZXJzaXplIiA6ICIiLAorCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9FUlJfTUFTSykgPT0KKwkJICAgICAgIElCX01BQ19JT0NCX1JTUF9FUlJfVU5ERVJTSVpFID8gInVuZGVyc2l6ZSIgOiAiIiwKKwkJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spID09CisJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfRVJSX1BSRUFNQkxFID8gInByZWFtYmxlIiA6ICIiLAorCQkgICAgICAgKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9FUlJfTUFTSykgPT0KKwkJICAgICAgIElCX01BQ19JT0NCX1JTUF9FUlJfRlJBTUVfTEVOID8gImZyYW1lIGxlbmd0aCIgOiAiIiwKKwkJICAgICAgIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfRVJSX01BU0spID09CisJCSAgICAgICBJQl9NQUNfSU9DQl9SU1BfRVJSX0NSQyA/ICJDUkMiIDogIiIpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3MzID0gJXMlcy5cbiIsCisJICAgICAgIGliX21hY19yc3AtPmZsYWdzMyAmIElCX01BQ19JT0NCX1JTUF9EUyA/ICJEUyAiIDogIiIsCisJICAgICAgIGliX21hY19yc3AtPmZsYWdzMyAmIElCX01BQ19JT0NCX1JTUF9ETCA/ICJETCAiIDogIiIpOworCisJaWYgKGliX21hY19yc3AtPmZsYWdzMyAmIElCX01BQ19JT0NCX1JTUF9SU1NfTUFTSykKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlNTIGZsYWdzID0gJXMlcyVzJXMuXG4iLAorCQkgICAgICAgKChpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfUlNTX01BU0spID09CisJCQlJQl9NQUNfSU9DQl9SU1BfTV9JUFY0KSA/ICJJUHY0IFJTUyIgOiAiIiwKKwkJICAgICAgICgoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKSA9PQorCQkJSUJfTUFDX0lPQ0JfUlNQX01fSVBWNikgPyAiSVB2NiBSU1MgIiA6ICIiLAorCQkgICAgICAgKChpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfUlNTX01BU0spID09CisJCQlJQl9NQUNfSU9DQl9SU1BfTV9UQ1BfVjQpID8gIlRDUC9JUHY0IFJTUyIgOiAiIiwKKwkJICAgICAgICgoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKSA9PQorCQkJSUJfTUFDX0lPQ0JfUlNQX01fVENQX1Y2KSA/ICJUQ1AvSVB2NiBSU1MiIDogIiIpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9sZW4JPSAlZFxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+ZGF0YV9sZW4pKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkYXRhX2FkZHJfaGkgICAgPSAweCV4XG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT5kYXRhX2FkZHJfaGkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkYXRhX2FkZHJfbG8gICAgPSAweCV4XG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT5kYXRhX2FkZHJfbG8pKTsKKwlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJyc3MgICAgPSAleFxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPnJzcykpOworCWlmIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmxhbl9pZCAgICA9ICV4XG4iLAorCQkgICAgICAgbGUxNl90b19jcHUoaWJfbWFjX3JzcC0+dmxhbl9pZCkpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmxhZ3M0ID0gJXMlcyVzLlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+CisJCQkgICBmbGFnczQpICYgSUJfTUFDX0lPQ0JfUlNQX0hWID8gIkhWICIgOiAiIiwKKwkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+CisJCQkgICBmbGFnczQpICYgSUJfTUFDX0lPQ0JfUlNQX0hTID8gIkhTICIgOiAiIiwKKwkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+CisJCQkgICBmbGFnczQpICYgSUJfTUFDX0lPQ0JfUlNQX0hMID8gIkhMICIgOiAiIik7CisKKwlpZiAobGUzMl90b19jcHUoaWJfbWFjX3JzcC0+ZmxhZ3M0KSAmIElCX01BQ19JT0NCX1JTUF9IVikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgbGVuZ3RoCT0gJWQuXG4iLAorCQkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+aGRyX2xlbikpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgYWRkcl9oaSAgICA9IDB4JXguXG4iLAorCQkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+aGRyX2FkZHJfaGkpKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGFkZHJfbG8gICAgPSAweCV4LlxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9hZGRyX2xvKSk7CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBRTF9BTExfRFVNUAordm9pZCBxbF9kdW1wX2FsbChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaTsKKworCVFMX0RVTVBfUkVHUyhxZGV2KTsKKwlRTF9EVU1QX1FERVYocWRldik7CisJZm9yIChpID0gMDsgaSA8IHFkZXYtPnR4X3JpbmdfY291bnQ7IGkrKykgeworCQlRTF9EVU1QX1RYX1JJTkcoJnFkZXYtPnR4X3JpbmdbaV0pOworCQlRTF9EVU1QX1dRSUNCKChzdHJ1Y3Qgd3FpY2IgKikmcWRldi0+dHhfcmluZ1tpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKKwkJUUxfRFVNUF9SWF9SSU5HKCZxZGV2LT5yeF9yaW5nW2ldKTsKKwkJUUxfRFVNUF9DUUlDQigoc3RydWN0IGNxaWNiICopJnFkZXYtPnJ4X3JpbmdbaV0pOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyZmJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKQEAgLTAsMCArMSw0MTQgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAicWxnZS5oIgorCitzdGF0aWMgaW50IHFsX3VwZGF0ZV9yaW5nX2NvYWxlc2Npbmcoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGksIHN0YXR1cyA9IDA7CisJc3RydWN0IHJ4X3JpbmcgKnJ4X3Jpbmc7CisJc3RydWN0IGNxaWNiICpjcWljYjsKKworCWlmICghbmV0aWZfcnVubmluZyhxZGV2LT5uZGV2KSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXNwaW5fbG9jaygmcWRldi0+aHdfbG9jayk7CisJLyogU2tpcCB0aGUgZGVmYXVsdCBxdWV1ZSwgYW5kIHVwZGF0ZSB0aGUgb3V0Ym91bmQgaGFuZGxlcgorCSAqIHF1ZXVlcyBpZiB0aGV5IGNoYW5nZWQuCisJICovCisJY3FpY2IgPSAoc3RydWN0IGNxaWNiICopJnFkZXYtPnJ4X3JpbmdbMV07CisJaWYgKGxlMTZfdG9fY3B1KGNxaWNiLT5pcnFfZGVsYXkpICE9IHFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzIHx8CisJICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5wa3RfZGVsYXkpICE9IHFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzKSB7CisJCWZvciAoaSA9IDE7IGkgPCBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZDsgaSsrLCByeF9yaW5nKyspIHsKKwkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKKwkJCWNxaWNiID0gKHN0cnVjdCBjcWljYiAqKXJ4X3Jpbmc7CisJCQljcWljYi0+aXJxX2RlbGF5ID0gbGUxNl90b19jcHUocWRldi0+dHhfY29hbGVzY2VfdXNlY3MpOworCQkJY3FpY2ItPnBrdF9kZWxheSA9CisJCQkgICAgbGUxNl90b19jcHUocWRldi0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOworCQkJY3FpY2ItPmZsYWdzID0gRkxBR1NfTEk7CisJCQlzdGF0dXMgPSBxbF93cml0ZV9jZmcocWRldiwgY3FpY2IsIHNpemVvZihjcWljYiksCisJCQkJCQlDRkdfTENRLCByeF9yaW5nLT5jcV9pZCk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJCSJGYWlsZWQgdG8gbG9hZCBDUUlDQi5cbiIpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFVwZGF0ZSB0aGUgaW5ib3VuZCAoUlNTKSBoYW5kbGVyIHF1ZXVlcyBpZiB0aGV5IGNoYW5nZWQuICovCisJY3FpY2IgPSAoc3RydWN0IGNxaWNiICopJnFkZXYtPnJ4X3JpbmdbcWRldi0+cnNzX3JpbmdfZmlyc3RfY3FfaWRdOworCWlmIChsZTE2X3RvX2NwdShjcWljYi0+aXJxX2RlbGF5KSAhPSBxZGV2LT5yeF9jb2FsZXNjZV91c2VjcyB8fAorCSAgICBsZTE2X3RvX2NwdShjcWljYi0+cGt0X2RlbGF5KSAhPSBxZGV2LT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcykgeworCQlmb3IgKGkgPSBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZDsKKwkJICAgICBpIDw9IHFkZXYtPnJzc19yaW5nX2ZpcnN0X2NxX2lkICsgcWRldi0+cnNzX3JpbmdfY291bnQ7CisJCSAgICAgaSsrKSB7CisJCQlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbaV07CisJCQljcWljYiA9IChzdHJ1Y3QgY3FpY2IgKilyeF9yaW5nOworCQkJY3FpY2ItPmlycV9kZWxheSA9IGxlMTZfdG9fY3B1KHFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCWNxaWNiLT5wa3RfZGVsYXkgPQorCQkJICAgIGxlMTZfdG9fY3B1KHFkZXYtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwkJCWNxaWNiLT5mbGFncyA9IEZMQUdTX0xJOworCQkJc3RhdHVzID0gcWxfd3JpdGVfY2ZnKHFkZXYsIGNxaWNiLCBzaXplb2YoY3FpY2IpLAorCQkJCQkJQ0ZHX0xDUSwgcnhfcmluZy0+Y3FfaWQpOworCQkJaWYgKHN0YXR1cykgeworCQkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCQkiRmFpbGVkIHRvIGxvYWQgQ1FJQ0IuXG4iKTsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCX0KKwl9CitleGl0OgorCXNwaW5fdW5sb2NrKCZxZGV2LT5od19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHFsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwl1MzIgaTsKKwl1NjQgZGF0YTsKKwl1NjQgKml0ZXIgPSAmcWRldi0+bmljX3N0YXRzLnR4X3BrdHM7CisKKwlzcGluX2xvY2soJnFkZXYtPnN0YXRzX2xvY2spOworCWlmIChxbF9zZW1fc3BpbmxvY2socWRldiwgcWRldi0+eGdfc2VtX21hc2spKSB7CisJCQlRUFJJTlRLKHFkZXYsIERSViwgRVJSLAorCQkJCSJDb3VsZG4ndCBnZXQgeGdtYWMgc2VtLlxuIik7CisJCWdvdG8gcXVpdDsKKwl9CisJLyoKKwkgKiBHZXQgVFggc3RhdGlzdGljcy4KKwkgKi8KKwlmb3IgKGkgPSAweDIwMDsgaSA8IDB4MjgwOyBpICs9IDgpIHsKKwkJaWYgKHFsX3JlYWRfeGdtYWNfcmVnNjQocWRldiwgaSwgJmRhdGEpKSB7CisJCQlRUFJJTlRLKHFkZXYsIERSViwgRVJSLAorCQkJCSJFcnJvciByZWFkaW5nIHN0YXR1cyByZWdpc3RlciAweCUuMDR4LlxuIiwgaSk7CisJCQlnb3RvIGVuZDsKKwkJfSBlbHNlCisJCQkqaXRlciA9IGRhdGE7CisJCWl0ZXIrKzsKKwl9CisKKwkvKgorCSAqIEdldCBSWCBzdGF0aXN0aWNzLgorCSAqLworCWZvciAoaSA9IDB4MzAwOyBpIDwgMHgzZDA7IGkgKz0gOCkgeworCQlpZiAocWxfcmVhZF94Z21hY19yZWc2NChxZGV2LCBpLCAmZGF0YSkpIHsKKwkJCVFQUklOVEsocWRldiwgRFJWLCBFUlIsCisJCQkJIkVycm9yIHJlYWRpbmcgc3RhdHVzIHJlZ2lzdGVyIDB4JS4wNHguXG4iLCBpKTsKKwkJCWdvdG8gZW5kOworCQl9IGVsc2UKKwkJCSppdGVyID0gZGF0YTsKKwkJaXRlcisrOworCX0KKworZW5kOgorCXFsX3NlbV91bmxvY2socWRldiwgcWRldi0+eGdfc2VtX21hc2spOworcXVpdDoKKwlzcGluX3VubG9jaygmcWRldi0+c3RhdHNfbG9jayk7CisKKwlRTF9EVU1QX1NUQVQocWRldik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBjaGFyIHFsX3N0YXRzX3N0cl9hcnJbXVtFVEhfR1NUUklOR19MRU5dID0geworCXsidHhfcGt0cyJ9LAorCXsidHhfYnl0ZXMifSwKKwl7InR4X21jYXN0X3BrdHMifSwKKwl7InR4X2JjYXN0X3BrdHMifSwKKwl7InR4X3VjYXN0X3BrdHMifSwKKwl7InR4X2N0bF9wa3RzIn0sCisJeyJ0eF9wYXVzZV9wa3RzIn0sCisJeyJ0eF82NF9wa3RzIn0sCisJeyJ0eF82NV90b18xMjdfcGt0cyJ9LAorCXsidHhfMTI4X3RvXzI1NV9wa3RzIn0sCisJeyJ0eF8yNTZfNTExX3BrdHMifSwKKwl7InR4XzUxMl90b18xMDIzX3BrdHMifSwKKwl7InR4XzEwMjRfdG9fMTUxOF9wa3RzIn0sCisJeyJ0eF8xNTE5X3RvX21heF9wa3RzIn0sCisJeyJ0eF91bmRlcnNpemVfcGt0cyJ9LAorCXsidHhfb3ZlcnNpemVfcGt0cyJ9LAorCXsicnhfYnl0ZXMifSwKKwl7InJ4X2J5dGVzX29rIn0sCisJeyJyeF9wa3RzIn0sCisJeyJyeF9wa3RzX29rIn0sCisJeyJyeF9iY2FzdF9wa3RzIn0sCisJeyJyeF9tY2FzdF9wa3RzIn0sCisJeyJyeF91Y2FzdF9wa3RzIn0sCisJeyJyeF91bmRlcnNpemVfcGt0cyJ9LAorCXsicnhfb3ZlcnNpemVfcGt0cyJ9LAorCXsicnhfamFiYmVyX3BrdHMifSwKKwl7InJ4X3VuZGVyc2l6ZV9mY2Vycl9wa3RzIn0sCisJeyJyeF9kcm9wX2V2ZW50cyJ9LAorCXsicnhfZmNlcnJfcGt0cyJ9LAorCXsicnhfYWxpZ25fZXJyIn0sCisJeyJyeF9zeW1ib2xfZXJyIn0sCisJeyJyeF9tYWNfZXJyIn0sCisJeyJyeF9jdGxfcGt0cyJ9LAorCXsicnhfcGF1c2VfcGt0cyJ9LAorCXsicnhfNjRfcGt0cyJ9LAorCXsicnhfNjVfdG9fMTI3X3BrdHMifSwKKwl7InJ4XzEyOF8yNTVfcGt0cyJ9LAorCXsicnhfMjU2XzUxMV9wa3RzIn0sCisJeyJyeF81MTJfdG9fMTAyM19wa3RzIn0sCisJeyJyeF8xMDI0X3RvXzE1MThfcGt0cyJ9LAorCXsicnhfMTUxOV90b19tYXhfcGt0cyJ9LAorCXsicnhfbGVuX2Vycl9wa3RzIn0sCit9OworCitzdGF0aWMgdm9pZCBxbF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShidWYsIHFsX3N0YXRzX3N0cl9hcnIsIHNpemVvZihxbF9zdGF0c19zdHJfYXJyKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBxbF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKK3sKKwlzd2l0Y2ggKHNzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJcmV0dXJuIEFSUkFZX1NJWkUocWxfc3RhdHNfc3RyX2Fycik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHZvaWQKK3FsX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG5pY19zdGF0cyAqcyA9ICZxZGV2LT5uaWNfc3RhdHM7CisKKwlxbF91cGRhdGVfc3RhdHMocWRldik7CisKKwkqZGF0YSsrID0gcy0+dHhfcGt0czsKKwkqZGF0YSsrID0gcy0+dHhfYnl0ZXM7CisJKmRhdGErKyA9IHMtPnR4X21jYXN0X3BrdHM7CisJKmRhdGErKyA9IHMtPnR4X2JjYXN0X3BrdHM7CisJKmRhdGErKyA9IHMtPnR4X3VjYXN0X3BrdHM7CisJKmRhdGErKyA9IHMtPnR4X2N0bF9wa3RzOworCSpkYXRhKysgPSBzLT50eF9wYXVzZV9wa3RzOworCSpkYXRhKysgPSBzLT50eF82NF9wa3Q7CisJKmRhdGErKyA9IHMtPnR4XzY1X3RvXzEyN19wa3Q7CisJKmRhdGErKyA9IHMtPnR4XzEyOF90b18yNTVfcGt0OworCSpkYXRhKysgPSBzLT50eF8yNTZfNTExX3BrdDsKKwkqZGF0YSsrID0gcy0+dHhfNTEyX3RvXzEwMjNfcGt0OworCSpkYXRhKysgPSBzLT50eF8xMDI0X3RvXzE1MThfcGt0OworCSpkYXRhKysgPSBzLT50eF8xNTE5X3RvX21heF9wa3Q7CisJKmRhdGErKyA9IHMtPnR4X3VuZGVyc2l6ZV9wa3Q7CisJKmRhdGErKyA9IHMtPnR4X292ZXJzaXplX3BrdDsKKwkqZGF0YSsrID0gcy0+cnhfYnl0ZXM7CisJKmRhdGErKyA9IHMtPnJ4X2J5dGVzX29rOworCSpkYXRhKysgPSBzLT5yeF9wa3RzOworCSpkYXRhKysgPSBzLT5yeF9wa3RzX29rOworCSpkYXRhKysgPSBzLT5yeF9iY2FzdF9wa3RzOworCSpkYXRhKysgPSBzLT5yeF9tY2FzdF9wa3RzOworCSpkYXRhKysgPSBzLT5yeF91Y2FzdF9wa3RzOworCSpkYXRhKysgPSBzLT5yeF91bmRlcnNpemVfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfb3ZlcnNpemVfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfamFiYmVyX3BrdHM7CisJKmRhdGErKyA9IHMtPnJ4X3VuZGVyc2l6ZV9mY2Vycl9wa3RzOworCSpkYXRhKysgPSBzLT5yeF9kcm9wX2V2ZW50czsKKwkqZGF0YSsrID0gcy0+cnhfZmNlcnJfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfYWxpZ25fZXJyOworCSpkYXRhKysgPSBzLT5yeF9zeW1ib2xfZXJyOworCSpkYXRhKysgPSBzLT5yeF9tYWNfZXJyOworCSpkYXRhKysgPSBzLT5yeF9jdGxfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfcGF1c2VfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfNjRfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfNjVfdG9fMTI3X3BrdHM7CisJKmRhdGErKyA9IHMtPnJ4XzEyOF8yNTVfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfMjU2XzUxMV9wa3RzOworCSpkYXRhKysgPSBzLT5yeF81MTJfdG9fMTAyM19wa3RzOworCSpkYXRhKysgPSBzLT5yeF8xMDI0X3RvXzE1MThfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfMTUxOV90b19tYXhfcGt0czsKKwkqZGF0YSsrID0gcy0+cnhfbGVuX2Vycl9wa3RzOworfQorCitzdGF0aWMgaW50IHFsX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsOworCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJaWYgKChxZGV2LT5saW5rX3N0YXR1cyAmIExJTktfVFlQRV9NQVNLKSA9PSBMSU5LX1RZUEVfMTBHQkFTRVQpIHsKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQXV0b25lZyk7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IChBRFZFUlRJU0VEX1RQIHwgQURWRVJUSVNFRF9BdXRvbmVnKTsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9GSUJSRTsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJfQorCisJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwMDsKKwllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCSAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgcWxnZV9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgcWxnZV9kcml2ZXJfdmVyc2lvbiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShxZGV2LT5wZGV2KSwgMzIpOworCWRydmluZm8tPm5fc3RhdHMgPSAwOworCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSAwOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOworfQorCitzdGF0aWMgaW50IHFsX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqYykKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KGRldik7CisKKwljLT5yeF9jb2FsZXNjZV91c2VjcyA9IHFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzOworCWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gcWRldi0+dHhfY29hbGVzY2VfdXNlY3M7CisKKwkvKiBUaGlzIGNoaXAgY29hbGVzY2VzIGFzIGZvbGxvd3M6CisJICogSWYgYSBwYWNrZXQgYXJyaXZlcywgaG9sZCBvZmYgaW50ZXJydXB0cyB1bnRpbAorCSAqIGNxaWNiLT5pbnRfZGVsYXkgZXhwaXJlcywgYnV0IGlmIG5vIG90aGVyIHBhY2tldHMgYXJyaXZlIGRvbid0CisJICogd2FpdCBsb25nZXIgdGhhbiBjcWljYi0+cGt0X2ludF9kZWxheS4gQnV0IGV0aHRvb2wgZG9lc24ndCB1c2UgYQorCSAqIHRpbWVyIHRvIGNvYWxlc2NlIG9uIGEgZnJhbWUgYmFzaXMuICBTbywgd2UgaGF2ZSB0byB0YWtlIGV0aHRvb2wncworCSAqIG1heF9jb2FsZXNjZWRfZnJhbWVzIHZhbHVlIGFuZCBjb252ZXJ0IGl0IHRvIGEgZGVsYXkgaW4gbWljcm9zZWNvbmRzLgorCSAqIFdlIGRvIHRoaXMgYnkgdXNpbmcgYSBiYXNpYyB0aG91Z2hwdXQgb2YgMSwwMDAsMDAwIGZyYW1lcyBwZXIKKwkgKiBzZWNvbmQgQCAoMTAyNCBieXRlcykuICBUaGlzIG1lYW5zIG9uZSBmcmFtZSBwZXIgdXNlYy4gU28gaXQncyBhCisJICogc2ltcGxlIG9uZSB0byBvbmUgcmF0aW8uCisJICovCisJYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBxZGV2LT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKwljLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWxfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqYykKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyogVmFsaWRhdGUgdXNlciBwYXJhbWV0ZXJzLiAqLworCWlmIChjLT5yeF9jb2FsZXNjZV91c2VjcyA+IHFkZXYtPnJ4X3Jpbmdfc2l6ZSAvIDIpCisJCXJldHVybiAtRUlOVkFMOworICAgICAgIC8qIERvbid0IHdhaXQgbW9yZSB0aGFuIDEwIHVzZWMuICovCisJaWYgKGMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX0lOVEVSX0ZSQU1FX1dBSVQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjLT50eF9jb2FsZXNjZV91c2VjcyA+IHFkZXYtPnR4X3Jpbmdfc2l6ZSAvIDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9JTlRFUl9GUkFNRV9XQUlUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFZlcmlmeSBhIGNoYW5nZSB0b29rIHBsYWNlIGJlZm9yZSB1cGRhdGluZyB0aGUgaGFyZHdhcmUuICovCisJaWYgKHFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzID09IGMtPnJ4X2NvYWxlc2NlX3VzZWNzICYmCisJICAgIHFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzID09IGMtPnR4X2NvYWxlc2NlX3VzZWNzICYmCisJICAgIHFkZXYtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IGMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzICYmCisJICAgIHFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IGMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzKQorCQlyZXR1cm4gMDsKKworCXFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzID0gYy0+cnhfY29hbGVzY2VfdXNlY3M7CisJcWRldi0+dHhfY29hbGVzY2VfdXNlY3MgPSBjLT50eF9jb2FsZXNjZV91c2VjczsKKwlxZGV2LT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IGMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisKKwlyZXR1cm4gcWxfdXBkYXRlX3JpbmdfY29hbGVzY2luZyhxZGV2KTsKK30KKworc3RhdGljIHUzMiBxbF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gcWRldi0+cnhfY3N1bTsKK30KKworc3RhdGljIGludCBxbF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlxZGV2LT5yeF9jc3VtID0gZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbF9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1aW50MzJfdCBkYXRhKQoreworCisJaWYgKGRhdGEpIHsKKwkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKKwl9IGVsc2UgeworCQluZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJCW5kZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHFsX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXJldHVybiBxZGV2LT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBxbF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXFkZXYtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFsZ2VfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IHFsX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBxbF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsID0gcWxfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBxbF9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3J4X2NzdW0gPSBxbF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBxbF9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5nZXRfc2cgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnID0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gPSBxbF9zZXRfdHNvLAorCS5nZXRfY29hbGVzY2UgPSBxbF9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZSA9IHFsX3NldF9jb2FsZXNjZSwKKwkuZ2V0X3NzZXRfY291bnQgPSBxbF9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MgPSBxbF9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBxbF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmNhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCkBAIC0wLDAgKzEsMzk1NiBAQAorLyoKKyAqIFFMb2dpYyBxbGdlIE5JQyBIQkEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpICAyMDAzLTIwMDggUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBTZWUgTElDRU5TRS5xbGdlIGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgorICogQXV0aG9yOiAgICAgTGludXggcWxnZSBuZXR3b3JrIGRldmljZSBkcml2ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIFJvbiBNZXJjZXIgPHJvbi5tZXJjZXJAcWxvZ2ljLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorCisjaW5jbHVkZSAicWxnZS5oIgorCitjaGFyIHFsZ2VfZHJpdmVyX25hbWVbXSA9IERSVl9OQU1FOworY29uc3QgY2hhciBxbGdlX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKKworTU9EVUxFX0FVVEhPUigiUm9uIE1lcmNlciA8cm9uLm1lcmNlckBxbG9naWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9TVFJJTkcgIiAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X21zZyA9CisgICAgTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LIHwKKy8qIE5FVElGX01TR19USU1FUiB8CSovCisgICAgTkVUSUZfTVNHX0lGRE9XTiB8CisgICAgTkVUSUZfTVNHX0lGVVAgfAorICAgIE5FVElGX01TR19SWF9FUlIgfAorICAgIE5FVElGX01TR19UWF9FUlIgfAorICAgIE5FVElGX01TR19UWF9RVUVVRUQgfAorICAgIE5FVElGX01TR19JTlRSIHwgTkVUSUZfTVNHX1RYX0RPTkUgfCBORVRJRl9NU0dfUlhfU1RBVFVTIHwKKy8qIE5FVElGX01TR19QS1REQVRBIHwgKi8KKyAgICBORVRJRl9NU0dfSFcgfCBORVRJRl9NU0dfV09MIHwgMDsKKworc3RhdGljIGludCBkZWJ1ZyA9IDB4MDAwMDdmZmY7CS8qIGRlZmF1bHRzIGFib3ZlICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworCisjZGVmaW5lIE1TSVhfSVJRIDAKKyNkZWZpbmUgTVNJX0lSUSAxCisjZGVmaW5lIExFR19JUlEgMgorc3RhdGljIGludCBpcnFfdHlwZSA9IE1TSVhfSVJROworbW9kdWxlX3BhcmFtKGlycV90eXBlLCBpbnQsIE1TSVhfSVJRKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxX3R5cGUsICIwID0gTVNJLVgsIDEgPSBNU0ksIDIgPSBMZWdhY3kuIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGdlX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBRTEdFX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBRTEdFX0RFVklDRV9JRDEpfSwKKwkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsZ2VfcGNpX3RibCk7CisKKy8qIFRoaXMgaGFyZHdhcmUgc2VtYXBob3JlIGNhdXNlcyBleGNsdXNpdmUgYWNjZXNzIHRvCisgKiByZXNvdXJjZXMgc2hhcmVkIGJldHdlZW4gdGhlIE5JQyBkcml2ZXIsIE1QSSBmaXJtd2FyZSwKKyAqIEZDT0UgZmlybXdhcmUgYW5kIHRoZSBGQyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgcWxfc2VtX3RyeWxvY2soc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBzZW1fbWFzaykKK3sKKwl1MzIgc2VtX2JpdHMgPSAwOworCisJc3dpdGNoIChzZW1fbWFzaykgeworCWNhc2UgU0VNX1hHTUFDMF9NQVNLOgorCQlzZW1fYml0cyA9IFNFTV9TRVQgPDwgU0VNX1hHTUFDMF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBTRU1fWEdNQUMxX01BU0s6CisJCXNlbV9iaXRzID0gU0VNX1NFVCA8PCBTRU1fWEdNQUMxX1NISUZUOworCQlicmVhazsKKwljYXNlIFNFTV9JQ0JfTUFTSzoKKwkJc2VtX2JpdHMgPSBTRU1fU0VUIDw8IFNFTV9JQ0JfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgU0VNX01BQ19BRERSX01BU0s6CisJCXNlbV9iaXRzID0gU0VNX1NFVCA8PCBTRU1fTUFDX0FERFJfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgU0VNX0ZMQVNIX01BU0s6CisJCXNlbV9iaXRzID0gU0VNX1NFVCA8PCBTRU1fRkxBU0hfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgU0VNX1BST0JFX01BU0s6CisJCXNlbV9iaXRzID0gU0VNX1NFVCA8PCBTRU1fUFJPQkVfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgU0VNX1JUX0lEWF9NQVNLOgorCQlzZW1fYml0cyA9IFNFTV9TRVQgPDwgU0VNX1JUX0lEWF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBTRU1fUFJPQ19SRUdfTUFTSzoKKwkJc2VtX2JpdHMgPSBTRU1fU0VUIDw8IFNFTV9QUk9DX1JFR19TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUVBSSU5USyhxZGV2LCBQUk9CRSwgQUxFUlQsICJCYWQgU2VtYXBob3JlIG1hc2shLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXFsX3dyaXRlMzIocWRldiwgU0VNLCBzZW1fYml0cyB8IHNlbV9tYXNrKTsKKwlyZXR1cm4gIShxbF9yZWFkMzIocWRldiwgU0VNKSAmIHNlbV9iaXRzKTsKK30KKworaW50IHFsX3NlbV9zcGlubG9jayhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIHNlbV9tYXNrKQoreworCXVuc2lnbmVkIGludCBzZWNvbmRzID0gMzsKKwlkbyB7CisJCWlmICghcWxfc2VtX3RyeWxvY2socWRldiwgc2VtX21hc2spKQorCQkJcmV0dXJuIDA7CisJCXNzbGVlcCgxKTsKKwl9IHdoaWxlICgtLXNlY29uZHMpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCit2b2lkIHFsX3NlbV91bmxvY2soc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBzZW1fbWFzaykKK3sKKwlxbF93cml0ZTMyKHFkZXYsIFNFTSwgc2VtX21hc2spOworCXFsX3JlYWQzMihxZGV2LCBTRU0pOwkvKiBmbHVzaCAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhIHNwZWNpZmljIGJpdCB0byBjb21lIHJlYWR5CisgKiBpbiBhIGdpdmVuIHJlZ2lzdGVyLiAgSXQgaXMgdXNlZCBtb3N0bHkgYnkgdGhlIGluaXRpYWxpemUKKyAqIHByb2Nlc3MsIGJ1dCBpcyBhbHNvIHVzZWQgaW4ga2VybmVsIHRocmVhZCBBUEkgc3VjaCBhcworICogbmV0ZGV2LT5zZXRfbXVsdGksIG5ldGRldi0+c2V0X21hY19hZGRyZXNzLCBuZXRkZXYtPnZsYW5fcnhfYWRkX3ZpZC4KKyAqLworaW50IHFsX3dhaXRfcmVnX3JkeShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIHJlZywgdTMyIGJpdCwgdTMyIGVycl9iaXQpCit7CisJdTMyIHRlbXA7CisJaW50IGNvdW50ID0gVURFTEFZX0NPVU5UOworCisJd2hpbGUgKGNvdW50KSB7CisJCXRlbXAgPSBxbF9yZWFkMzIocWRldiwgcmVnKTsKKworCQkvKiBjaGVjayBmb3IgZXJyb3JzICovCisJCWlmICh0ZW1wICYgZXJyX2JpdCkgeworCQkJUVBSSU5USyhxZGV2LCBQUk9CRSwgQUxFUlQsCisJCQkJInJlZ2lzdGVyIDB4JS4wOHggYWNjZXNzIGVycm9yLCB2YWx1ZSA9IDB4JS4wOHghLlxuIiwKKwkJCQlyZWcsIHRlbXApOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAodGVtcCAmIGJpdCkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoVURFTEFZX0RFTEFZKTsKKwkJY291bnQtLTsKKwl9CisJUVBSSU5USyhxZGV2LCBQUk9CRSwgQUxFUlQsCisJCSJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcmVnICV4IHRvIGNvbWUgcmVhZHkuXG4iLCByZWcpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKiBUaGUgQ0ZHIHJlZ2lzdGVyIGlzIHVzZWQgdG8gZG93bmxvYWQgVFggYW5kIFJYIGNvbnRyb2wgYmxvY2tzCisgKiB0byB0aGUgY2hpcC4gVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgYW4gb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgorICovCitzdGF0aWMgaW50IHFsX3dhaXRfY2ZnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgYml0KQoreworCWludCBjb3VudCA9IFVERUxBWV9DT1VOVDsKKwl1MzIgdGVtcDsKKworCXdoaWxlIChjb3VudCkgeworCQl0ZW1wID0gcWxfcmVhZDMyKHFkZXYsIENGRyk7CisJCWlmICh0ZW1wICYgQ0ZHX0xFKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghKHRlbXAgJiBiaXQpKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheShVREVMQVlfREVMQVkpOworCQljb3VudC0tOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworCisvKiBVc2VkIHRvIGlzc3VlIGluaXQgY29udHJvbCBibG9ja3MgdG8gaHcuIE1hcHMgY29udHJvbCBibG9jaywKKyAqIHNldHMgYWRkcmVzcywgdHJpZ2dlcnMgZG93bmxvYWQsIHdhaXRzIGZvciBjb21wbGV0aW9uLgorICovCitpbnQgcWxfd3JpdGVfY2ZnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB2b2lkICpwdHIsIGludCBzaXplLCB1MzIgYml0LAorCQkgdTE2IHFfaWQpCit7CisJdTY0IG1hcDsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgZGlyZWN0aW9uOworCXUzMiBtYXNrOworCXUzMiB2YWx1ZTsKKworCWRpcmVjdGlvbiA9CisJICAgIChiaXQgJiAoQ0ZHX0xSUSB8IENGR19MUiB8IENGR19MQ1EpKSA/IFBDSV9ETUFfVE9ERVZJQ0UgOgorCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0U7CisKKwltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiQ291bGRuJ3QgbWFwIERNQSBhcmVhLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXN0YXR1cyA9IHFsX3dhaXRfY2ZnKHFkZXYsIGJpdCk7CisJaWYgKHN0YXR1cykgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCSJUaW1lZCBvdXQgd2FpdGluZyBmb3IgQ0ZHIHRvIGNvbWUgcmVhZHkuXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXN0YXR1cyA9IHFsX3NlbV9zcGlubG9jayhxZGV2LCBTRU1fSUNCX01BU0spOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXhpdDsKKwlxbF93cml0ZTMyKHFkZXYsIElDQl9MLCAodTMyKSBtYXApOworCXFsX3dyaXRlMzIocWRldiwgSUNCX0gsICh1MzIpIChtYXAgPj4gMzIpKTsKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9JQ0JfTUFTSyk7CS8qIGRvZXMgZmx1c2ggdG9vICovCisKKwltYXNrID0gQ0ZHX1FfTUFTSyB8IChiaXQgPDwgMTYpOworCXZhbHVlID0gYml0IHwgKHFfaWQgPDwgQ0ZHX1FfU0hJRlQpOworCXFsX3dyaXRlMzIocWRldiwgQ0ZHLCAobWFzayB8IHZhbHVlKSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBiaXQgdG8gY2xlYXIgYWZ0ZXIgc2lnbmFsaW5nIGh3LgorCSAqLworCXN0YXR1cyA9IHFsX3dhaXRfY2ZnKHFkZXYsIGJpdCk7CitleGl0OgorCXBjaV91bm1hcF9zaW5nbGUocWRldi0+cGRldiwgbWFwLCBzaXplLCBkaXJlY3Rpb24pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEdldCBhIHNwZWNpZmljIE1BQyBhZGRyZXNzIGZyb20gdGhlIENBTS4gIFVzZWQgZm9yIGRlYnVnIGFuZCByZWcgZHVtcC4gKi8KK2ludCBxbF9nZXRfbWFjX2FkZHJfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgdHlwZSwgdTE2IGluZGV4LAorCQkJdTMyICp2YWx1ZSkKK3sKKwl1MzIgb2Zmc2V0ID0gMDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcWxfc2VtX3NwaW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTUFDX0FERFJfVFlQRV9NVUxUSV9NQUM6CisJY2FzZSBNQUNfQUREUl9UWVBFX0NBTV9NQUM6CisJCXsKKwkJCXN0YXR1cyA9CisJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZXhpdDsKKwkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCisJCQkJICAgKGluZGV4IDw8IE1BQ19BRERSX0lEWF9TSElGVCkgfCAvKiBpbmRleCAqLworCQkJCSAgIE1BQ19BRERSX0FEUiB8IE1BQ19BRERSX1JTIHwgdHlwZSk7IC8qIHR5cGUgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NUiwgTUFDX0FERFJfRSk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZXhpdDsKKwkJCSp2YWx1ZSsrID0gcWxfcmVhZDMyKHFkZXYsIE1BQ19BRERSX0RBVEEpOworCQkJc3RhdHVzID0KKwkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBleGl0OworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQrKykgfCAvKiBvZmZzZXQgKi8KKwkJCQkgICAoaW5kZXggPDwgTUFDX0FERFJfSURYX1NISUZUKSB8IC8qIGluZGV4ICovCisJCQkJICAgTUFDX0FERFJfQURSIHwgTUFDX0FERFJfUlMgfCB0eXBlKTsgLyogdHlwZSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01SLCBNQUNfQUREUl9FKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBleGl0OworCQkJKnZhbHVlKysgPSBxbF9yZWFkMzIocWRldiwgTUFDX0FERFJfREFUQSk7CisJCQlpZiAodHlwZSA9PSBNQUNfQUREUl9UWVBFX0NBTV9NQUMpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJaWYgKHN0YXR1cykKKwkJCQkJZ290byBleGl0OworCQkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCisJCQkJCSAgIChpbmRleCA8PCBNQUNfQUREUl9JRFhfU0hJRlQpIHwgLyogaW5kZXggKi8KKwkJCQkJICAgTUFDX0FERFJfQURSIHwgTUFDX0FERFJfUlMgfCB0eXBlKTsgLyogdHlwZSAqLworCQkJCXN0YXR1cyA9CisJCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LCBNQUNfQUREUl9JRFgsCisJCQkJCQkgICAgTUFDX0FERFJfTVIsIE1BQ19BRERSX0UpOworCQkJCWlmIChzdGF0dXMpCisJCQkJCWdvdG8gZXhpdDsKKwkJCQkqdmFsdWUrKyA9IHFsX3JlYWQzMihxZGV2LCBNQUNfQUREUl9EQVRBKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBNQUNfQUREUl9UWVBFX1ZMQU46CisJY2FzZSBNQUNfQUREUl9UWVBFX01VTFRJX0ZMVFI6CisJZGVmYXVsdDoKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBDUklULAorCQkJIkFkZHJlc3MgdHlwZSAlZCBub3QgeWV0IHN1cHBvcnRlZC5cbiIsIHR5cGUpOworCQlzdGF0dXMgPSAtRVBFUk07CisJfQorZXhpdDoKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBTZXQgdXAgYSBNQUMsIG11bHRpY2FzdCBvciBWTEFOIGFkZHJlc3MgZm9yIHRoZQorICogaW5ib3VuZCBmcmFtZSBtYXRjaGluZy4KKyAqLworc3RhdGljIGludCBxbF9zZXRfbWFjX2FkZHJfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1OCAqYWRkciwgdTMyIHR5cGUsCisJCQkgICAgICAgdTE2IGluZGV4KQoreworCXUzMiBvZmZzZXQgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gcWxfc2VtX3NwaW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTUFDX0FERFJfVFlQRV9NVUxUSV9NQUM6CisJY2FzZSBNQUNfQUREUl9UWVBFX0NBTV9NQUM6CisJCXsKKwkJCXUzMiBjYW1fb3V0cHV0OworCQkJdTMyIHVwcGVyID0gKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdOworCQkJdTMyIGxvd2VyID0KKwkJCSAgICAoYWRkclsyXSA8PCAyNCkgfCAoYWRkclszXSA8PCAxNikgfCAoYWRkcls0XSA8PCA4KSB8CisJCQkgICAgKGFkZHJbNV0pOworCisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIElORk8sCisJCQkJIkFkZGluZyAlcyBhZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCQkJCSIgYXQgaW5kZXggJWQgaW4gdGhlIENBTS5cbiIsCisJCQkJKCh0eXBlID09CisJCQkJICBNQUNfQUREUl9UWVBFX01VTFRJX01BQykgPyAiTVVMVElDQVNUIiA6CisJCQkJICJVTklDQVNUIiksIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sCisJCQkJYWRkcls0XSwgYWRkcls1XSwgaW5kZXgpOworCisJCQlzdGF0dXMgPQorCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAorCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIGV4aXQ7CisJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8IC8qIG9mZnNldCAqLworCQkJCSAgIChpbmRleCA8PCBNQUNfQUREUl9JRFhfU0hJRlQpIHwgLyogaW5kZXggKi8KKwkJCQkgICB0eXBlKTsJLyogdHlwZSAqLworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9EQVRBLCBsb3dlcik7CisJCQlzdGF0dXMgPQorCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAorCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIGV4aXQ7CisJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8IC8qIG9mZnNldCAqLworCQkJCSAgIChpbmRleCA8PCBNQUNfQUREUl9JRFhfU0hJRlQpIHwgLyogaW5kZXggKi8KKwkJCQkgICB0eXBlKTsJLyogdHlwZSAqLworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9EQVRBLCB1cHBlcik7CisJCQlzdGF0dXMgPQorCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAorCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIGV4aXQ7CisJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCkgfAkvKiBvZmZzZXQgKi8KKwkJCQkgICAoaW5kZXggPDwgTUFDX0FERFJfSURYX1NISUZUKSB8CS8qIGluZGV4ICovCisJCQkJICAgdHlwZSk7CS8qIHR5cGUgKi8KKwkJCS8qIFRoaXMgZmllbGQgc2hvdWxkIGFsc28gaW5jbHVkZSB0aGUgcXVldWUgaWQKKwkJCSAgIGFuZCBwb3NzaWJseSB0aGUgZnVuY3Rpb24gaWQuICBSaWdodCBub3cgd2UgaGFyZGNvZGUKKwkJCSAgIHRoZSByb3V0ZSBmaWVsZCB0byBOSUMgY29yZS4KKwkJCSAqLworCQkJaWYgKHR5cGUgPT0gTUFDX0FERFJfVFlQRV9DQU1fTUFDKSB7CisJCQkJY2FtX291dHB1dCA9IChDQU1fT1VUX1JPVVRFX05JQyB8CisJCQkJCSAgICAgIChxZGV2LT4KKwkJCQkJICAgICAgIGZ1bmMgPDwgQ0FNX09VVF9GVU5DX1NISUZUKSB8CisJCQkJCSAgICAgIChxZGV2LT4KKwkJCQkJICAgICAgIHJzc19yaW5nX2ZpcnN0X2NxX2lkIDw8CisJCQkJCSAgICAgICBDQU1fT1VUX0NRX0lEX1NISUZUKSk7CisJCQkJaWYgKHFkZXYtPnZsZ3JwKQorCQkJCQljYW1fb3V0cHV0IHw9IENBTV9PVVRfUlY7CisJCQkJLyogcm91dGUgdG8gTklDIGNvcmUgKi8KKwkJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0RBVEEsIGNhbV9vdXRwdXQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIE1BQ19BRERSX1RZUEVfVkxBTjoKKwkJeworCQkJdTMyIGVuYWJsZV9iaXQgPSAqKCh1MzIgKikgJmFkZHJbMF0pOworCQkJLyogRm9yIFZMQU4sIHRoZSBhZGRyIGFjdHVhbGx5IGhvbGRzIGEgYml0IHRoYXQKKwkJCSAqIGVpdGhlciBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSB2bGFuIGlkIHdlIGFyZQorCQkJICogYWRkcmVzc2luZy4gSXQncyBlaXRoZXIgTUFDX0FERFJfRSBvbiBvciBvZmYuCisJCQkgKiBUaGF0J3MgYml0LTI3IHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisJCQkgKi8KKwkJCVFQUklOVEsocWRldiwgSUZVUCwgSU5GTywgIiVzIFZMQU4gSUQgJWQgJXMgdGhlIENBTS5cbiIsCisJCQkJKGVuYWJsZV9iaXQgPyAiQWRkaW5nIiA6ICJSZW1vdmluZyIpLAorCQkJCWluZGV4LCAoZW5hYmxlX2JpdCA/ICJ0byIgOiAiZnJvbSIpKTsKKworCQkJc3RhdHVzID0KKwkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBleGl0OworCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIG9mZnNldCB8CS8qIG9mZnNldCAqLworCQkJCSAgIChpbmRleCA8PCBNQUNfQUREUl9JRFhfU0hJRlQpIHwJLyogaW5kZXggKi8KKwkJCQkgICB0eXBlIHwJLyogdHlwZSAqLworCQkJCSAgIGVuYWJsZV9iaXQpOwkvKiBlbmFibGUvZGlzYWJsZSAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIE1BQ19BRERSX1RZUEVfTVVMVElfRkxUUjoKKwlkZWZhdWx0OgorCQlRUFJJTlRLKHFkZXYsIElGVVAsIENSSVQsCisJCQkiQWRkcmVzcyB0eXBlICVkIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIiwgdHlwZSk7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwl9CitleGl0OgorCXFsX3NlbV91bmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEdldCBhIHNwZWNpZmljIGZyYW1lIHJvdXRpbmcgdmFsdWUgZnJvbSB0aGUgQ0FNLgorICogVXNlZCBmb3IgZGVidWcgYW5kIHJlZyBkdW1wLgorICovCitpbnQgcWxfZ2V0X3JvdXRpbmdfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgaW5kZXgsIHUzMiAqdmFsdWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGV4aXQ7CisKKwlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVcsIFJUX0lEWF9FKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGV4aXQ7CisKKwlxbF93cml0ZTMyKHFkZXYsIFJUX0lEWCwKKwkJICAgUlRfSURYX1RZUEVfTklDUSB8IFJUX0lEWF9SUyB8IChpbmRleCA8PCBSVF9JRFhfSURYX1NISUZUKSk7CisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsIFJUX0lEWCwgUlRfSURYX01SLCBSVF9JRFhfRSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBleGl0OworCSp2YWx1ZSA9IHFsX3JlYWQzMihxZGV2LCBSVF9EQVRBKTsKK2V4aXQ6CisJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fUlRfSURYX01BU0spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFRoZSBOSUMgZnVuY3Rpb24gZm9yIHRoaXMgY2hpcCBoYXMgMTYgcm91dGluZyBpbmRleGVzLiAgRWFjaCBvbmUgY2FuIGJlIHVzZWQKKyAqIHRvIHJvdXRlIGRpZmZlcmVudCBmcmFtZSB0eXBlcyB0byB2YXJpb3VzIGluYm91bmQgcXVldWVzLiAgV2Ugc2VuZCBicm9hZGNhc3QvCisgKiBtdWx0aWNhc3QvZXJyb3IgZnJhbWVzIHRvIHRoZSBkZWZhdWx0IHF1ZXVlIGZvciBzbG93IGhhbmRsaW5nLAorICogYW5kIENBTSBoaXQvUlNTIGZyYW1lcyB0byB0aGUgZmFzdCBoYW5kbGluZyBxdWV1ZXMuCisgKi8KK3N0YXRpYyBpbnQgcWxfc2V0X3JvdXRpbmdfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgaW5kZXgsIHUzMiBtYXNrLAorCQkJICAgICAgaW50IGVuYWJsZSkKK3sKKwlpbnQgc3RhdHVzOworCXUzMiB2YWx1ZSA9IDA7CisKKwlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX1JUX0lEWF9NQVNLKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJUVBSSU5USyhxZGV2LCBJRlVQLCBERUJVRywKKwkJIiVzICVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIG1hc2sgJXMgdGhlIHJvdXRpbmcgcmVnLlxuIiwKKwkJKGVuYWJsZSA/ICJBZGRpbmciIDogIlJlbW92aW5nIiksCisJCSgoaW5kZXggPT0gUlRfSURYX0FMTF9FUlJfU0xPVCkgPyAiTUFDIEVSUk9SL0FMTCBFUlJPUiIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX0lQX0NTVU1fRVJSX1NMT1QpID8gIklQIENTVU0gRVJST1IiIDogIiIpLAorCQkoKGluZGV4ID09CisJCSAgUlRfSURYX1RDUF9VRFBfQ1NVTV9FUlJfU0xPVCkgPyAiVENQL1VEUCBDU1VNIEVSUk9SIiA6ICIiKSwKKwkJKChpbmRleCA9PSBSVF9JRFhfQkNBU1RfU0xPVCkgPyAiQlJPQURDQVNUIiA6ICIiKSwKKwkJKChpbmRleCA9PSBSVF9JRFhfTUNBU1RfTUFUQ0hfU0xPVCkgPyAiTVVMVElDQVNUIE1BVENIIiA6ICIiKSwKKwkJKChpbmRleCA9PSBSVF9JRFhfQUxMTVVMVElfU0xPVCkgPyAiQUxMIE1VTFRJQ0FTVCBNQVRDSCIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX1VOVVNFRDZfU0xPVCkgPyAiVU5VU0VENiIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX1VOVVNFRDdfU0xPVCkgPyAiVU5VU0VENyIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX1JTU19NQVRDSF9TTE9UKSA/ICJSU1MgQUxML0lQVjQgTUFUQ0giIDogIiIpLAorCQkoKGluZGV4ID09IFJUX0lEWF9SU1NfSVBWNl9TTE9UKSA/ICJSU1MgSVBWNiIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX1JTU19UQ1A0X1NMT1QpID8gIlJTUyBUQ1A0IiA6ICIiKSwKKwkJKChpbmRleCA9PSBSVF9JRFhfUlNTX1RDUDZfU0xPVCkgPyAiUlNTIFRDUDYiIDogIiIpLAorCQkoKGluZGV4ID09IFJUX0lEWF9DQU1fSElUX1NMT1QpID8gIkNBTSBISVQiIDogIiIpLAorCQkoKGluZGV4ID09IFJUX0lEWF9VTlVTRUQwMTMpID8gIlVOVVNFRDEzIiA6ICIiKSwKKwkJKChpbmRleCA9PSBSVF9JRFhfVU5VU0VEMDE0KSA/ICJVTlVTRUQxNCIgOiAiIiksCisJCSgoaW5kZXggPT0gUlRfSURYX1BST01JU0NVT1VTX1NMT1QpID8gIlBST01JU0NVT1VTIiA6ICIiKSwKKwkJKGVuYWJsZSA/ICJ0byIgOiAiZnJvbSIpKTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgUlRfSURYX0NBTV9ISVQ6CisJCXsKKwkJCXZhbHVlID0gUlRfSURYX0RTVF9DQU1fUSB8CS8qIGRlc3QgKi8KKwkJCSAgICBSVF9JRFhfVFlQRV9OSUNRIHwJLyogdHlwZSAqLworCQkJICAgIChSVF9JRFhfQ0FNX0hJVF9TTE9UIDw8IFJUX0lEWF9JRFhfU0hJRlQpOy8qIGluZGV4ICovCisJCQlicmVhazsKKwkJfQorCWNhc2UgUlRfSURYX1ZBTElEOgkvKiBQcm9taXNjdW91cyBNb2RlIGZyYW1lcy4gKi8KKwkJeworCQkJdmFsdWUgPSBSVF9JRFhfRFNUX0RGTFRfUSB8CS8qIGRlc3QgKi8KKwkJCSAgICBSVF9JRFhfVFlQRV9OSUNRIHwJLyogdHlwZSAqLworCQkJICAgIChSVF9JRFhfUFJPTUlTQ1VPVVNfU0xPVCA8PCBSVF9JRFhfSURYX1NISUZUKTsvKiBpbmRleCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIFJUX0lEWF9FUlI6CS8qIFBhc3MgdXAgTUFDLElQLFRDUC9VRFAgZXJyb3IgZnJhbWVzLiAqLworCQl7CisJCQl2YWx1ZSA9IFJUX0lEWF9EU1RfREZMVF9RIHwJLyogZGVzdCAqLworCQkJICAgIFJUX0lEWF9UWVBFX05JQ1EgfAkvKiB0eXBlICovCisJCQkgICAgKFJUX0lEWF9BTExfRVJSX1NMT1QgPDwgUlRfSURYX0lEWF9TSElGVCk7LyogaW5kZXggKi8KKwkJCWJyZWFrOworCQl9CisJY2FzZSBSVF9JRFhfQkNBU1Q6CS8qIFBhc3MgdXAgQnJvYWRjYXN0IGZyYW1lcyB0byBkZWZhdWx0IFEuICovCisJCXsKKwkJCXZhbHVlID0gUlRfSURYX0RTVF9ERkxUX1EgfAkvKiBkZXN0ICovCisJCQkgICAgUlRfSURYX1RZUEVfTklDUSB8CS8qIHR5cGUgKi8KKwkJCSAgICAoUlRfSURYX0JDQVNUX1NMT1QgPDwgUlRfSURYX0lEWF9TSElGVCk7LyogaW5kZXggKi8KKwkJCWJyZWFrOworCQl9CisJY2FzZSBSVF9JRFhfTUNBU1Q6CS8qIFBhc3MgdXAgQWxsIE11bHRpY2FzdCBmcmFtZXMuICovCisJCXsKKwkJCXZhbHVlID0gUlRfSURYX0RTVF9DQU1fUSB8CS8qIGRlc3QgKi8KKwkJCSAgICBSVF9JRFhfVFlQRV9OSUNRIHwJLyogdHlwZSAqLworCQkJICAgIChSVF9JRFhfQUxMTVVMVElfU0xPVCA8PCBSVF9JRFhfSURYX1NISUZUKTsvKiBpbmRleCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIFJUX0lEWF9NQ0FTVF9NQVRDSDoJLyogUGFzcyB1cCBtYXRjaGVkIE11bHRpY2FzdCBmcmFtZXMuICovCisJCXsKKwkJCXZhbHVlID0gUlRfSURYX0RTVF9DQU1fUSB8CS8qIGRlc3QgKi8KKwkJCSAgICBSVF9JRFhfVFlQRV9OSUNRIHwJLyogdHlwZSAqLworCQkJICAgIChSVF9JRFhfTUNBU1RfTUFUQ0hfU0xPVCA8PCBSVF9JRFhfSURYX1NISUZUKTsvKiBpbmRleCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIFJUX0lEWF9SU1NfTUFUQ0g6CS8qIFBhc3MgdXAgbWF0Y2hlZCBSU1MgZnJhbWVzLiAqLworCQl7CisJCQl2YWx1ZSA9IFJUX0lEWF9EU1RfUlNTIHwJLyogZGVzdCAqLworCQkJICAgIFJUX0lEWF9UWVBFX05JQ1EgfAkvKiB0eXBlICovCisJCQkgICAgKFJUX0lEWF9SU1NfTUFUQ0hfU0xPVCA8PCBSVF9JRFhfSURYX1NISUZUKTsvKiBpbmRleCAqLworCQkJYnJlYWs7CisJCX0KKwljYXNlIDA6CQkvKiBDbGVhciB0aGUgRS1iaXQgb24gYW4gZW50cnkuICovCisJCXsKKwkJCXZhbHVlID0gUlRfSURYX0RTVF9ERkxUX1EgfAkvKiBkZXN0ICovCisJCQkgICAgUlRfSURYX1RZUEVfTklDUSB8CS8qIHR5cGUgKi8KKwkJCSAgICAoaW5kZXggPDwgUlRfSURYX0lEWF9TSElGVCk7LyogaW5kZXggKi8KKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJNYXNrIHR5cGUgJWQgbm90IHlldCBzdXBwb3J0ZWQuXG4iLAorCQkJbWFzayk7CisJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZ290byBleGl0OworCX0KKworCWlmICh2YWx1ZSkgeworCQlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgUlRfSURYLCBSVF9JRFhfTVcsIDApOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBleGl0OworCQl2YWx1ZSB8PSAoZW5hYmxlID8gUlRfSURYX0UgOiAwKTsKKwkJcWxfd3JpdGUzMihxZGV2LCBSVF9JRFgsIHZhbHVlKTsKKwkJcWxfd3JpdGUzMihxZGV2LCBSVF9EQVRBLCBlbmFibGUgPyBtYXNrIDogMCk7CisJfQorZXhpdDoKKwlxbF9zZW1fdW5sb2NrKHFkZXYsIFNFTV9SVF9JRFhfTUFTSyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgcWxfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJcWxfd3JpdGUzMihxZGV2LCBJTlRSX0VOLCAoSU5UUl9FTl9FSSA8PCAxNikgfCBJTlRSX0VOX0VJKTsKK30KKworc3RhdGljIHZvaWQgcWxfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCXFsX3dyaXRlMzIocWRldiwgSU5UUl9FTiwgKElOVFJfRU5fRUkgPDwgMTYpKTsKK30KKworLyogSWYgd2UncmUgcnVubmluZyB3aXRoIG11bHRpcGxlIE1TSS1YIHZlY3RvcnMgdGhlbiB3ZSBlbmFibGUgb24gdGhlIGZseS4KKyAqIE90aGVyd2lzZSwgd2UgbWF5IGhhdmUgbXVsdGlwbGUgb3V0c3RhbmRpbmcgd29ya2VycyBhbmQgZG9uJ3Qgd2FudCB0bworICogZW5hYmxlIHVudGlsIHRoZSBsYXN0IG9uZSBmaW5pc2hlcy4gSW4gdGhpcyBjYXNlLCB0aGUgaXJxX2NudCBnZXRzCisgKiBpbmNyZW1lbnRlZCBldmVyeXRpbWUgd2UgcXVldWUgYSB3b3JrZXIgYW5kIGRlY3JlbWVudGVkIGV2ZXJ5dGltZQorICogYSB3b3JrZXIgZmluaXNoZXMuICBPbmNlIGl0IGhpdHMgemVybyB3ZSBlbmFibGUgdGhlIGludGVycnVwdC4KKyAqLwordm9pZCBxbF9lbmFibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBpbnRyKQoreworCWlmIChsaWtlbHkodGVzdF9iaXQoUUxfTVNJWF9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpKSkKKwkJcWxfd3JpdGUzMihxZGV2LCBJTlRSX0VOLAorCQkJICAgcWRldi0+aW50cl9jb250ZXh0W2ludHJdLmludHJfZW5fbWFzayk7CisJZWxzZSB7CisJCWlmIChxZGV2LT5sZWdhY3lfY2hlY2spCisJCQlzcGluX2xvY2soJnFkZXYtPmxlZ2FjeV9sb2NrKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFkZXYtPmludHJfY29udGV4dFtpbnRyXS5pcnFfY250KSkgeworCQkJUVBSSU5USyhxZGV2LCBJTlRSLCBFUlIsICJFbmFibGluZyBpbnRlcnJ1cHQgJWQuXG4iLAorCQkJCWludHIpOworCQkJcWxfd3JpdGUzMihxZGV2LCBJTlRSX0VOLAorCQkJCSAgIHFkZXYtPmludHJfY29udGV4dFtpbnRyXS5pbnRyX2VuX21hc2spOworCQl9IGVsc2UgeworCQkJUVBSSU5USyhxZGV2LCBJTlRSLCBFUlIsCisJCQkJIlNraXAgZW5hYmxlLCBvdGhlciBxdWV1ZShzKSBhcmUgYWN0aXZlLlxuIik7CisJCX0KKwkJaWYgKHFkZXYtPmxlZ2FjeV9jaGVjaykKKwkJCXNwaW5fdW5sb2NrKCZxZGV2LT5sZWdhY3lfbG9jayk7CisJfQorfQorCitzdGF0aWMgdTMyIHFsX2Rpc2FibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBpbnRyKQoreworCXUzMiB2YXIgPSAwOworCisJaWYgKGxpa2VseSh0ZXN0X2JpdChRTF9NU0lYX0VOQUJMRUQsICZxZGV2LT5mbGFncykpKQorCQlnb3RvIGV4aXQ7CisJZWxzZSBpZiAoIWF0b21pY19yZWFkKCZxZGV2LT5pbnRyX2NvbnRleHRbaW50cl0uaXJxX2NudCkpIHsKKwkJcWxfd3JpdGUzMihxZGV2LCBJTlRSX0VOLAorCQkJICAgcWRldi0+aW50cl9jb250ZXh0W2ludHJdLmludHJfZGlzX21hc2spOworCQl2YXIgPSBxbF9yZWFkMzIocWRldiwgU1RTKTsKKwl9CisJYXRvbWljX2luYygmcWRldi0+aW50cl9jb250ZXh0W2ludHJdLmlycV9jbnQpOworZXhpdDoKKwlyZXR1cm4gdmFyOworfQorCitzdGF0aWMgdm9pZCBxbF9lbmFibGVfYWxsX2NvbXBsZXRpb25faW50ZXJydXB0cyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcWRldi0+aW50cl9jb3VudDsgaSsrKSB7CisJCS8qIFRoZSBlbmFibGUgY2FsbCBkb2VzIGEgYXRvbWljX2RlY19hbmRfdGVzdAorCQkgKiBhbmQgZW5hYmxlcyBvbmx5IGlmIHRoZSByZXN1bHQgaXMgemVyby4KKwkJICogU28gd2UgcHJlY2hhcmdlIGl0IGhlcmUuCisJCSAqLworCQlhdG9taWNfc2V0KCZxZGV2LT5pbnRyX2NvbnRleHRbaV0uaXJxX2NudCwgMSk7CisJCXFsX2VuYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChxZGV2LCBpKTsKKwl9CisKK30KKworaW50IHFsX3JlYWRfZmxhc2hfd29yZChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgaW50IG9mZnNldCwgdTMyICpkYXRhKQoreworCWludCBzdGF0dXMgPSAwOworCS8qIHdhaXQgZm9yIHJlZyB0byBjb21lIHJlYWR5ICovCisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsCisJCQlGTEFTSF9BRERSLCBGTEFTSF9BRERSX1JEWSwgRkxBU0hfQUREUl9FUlIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXhpdDsKKwkvKiBzZXQgdXAgZm9yIHJlZyByZWFkICovCisJcWxfd3JpdGUzMihxZGV2LCBGTEFTSF9BRERSLCBGTEFTSF9BRERSX1IgfCBvZmZzZXQpOworCS8qIHdhaXQgZm9yIHJlZyB0byBjb21lIHJlYWR5ICovCisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsCisJCQlGTEFTSF9BRERSLCBGTEFTSF9BRERSX1JEWSwgRkxBU0hfQUREUl9FUlIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXhpdDsKKwkvKiBnZXQgdGhlIGRhdGEgKi8KKwkqZGF0YSA9IHFsX3JlYWQzMihxZGV2LCBGTEFTSF9EQVRBKTsKK2V4aXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBxbF9nZXRfZmxhc2hfcGFyYW1zKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCWludCBzdGF0dXM7CisJdTMyICpwID0gKHUzMiAqKSZxZGV2LT5mbGFzaDsKKworCWlmIChxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX0ZMQVNIX01BU0spKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocWRldi0+Zmxhc2gpIC8gc2l6ZW9mKHUzMik7IGkrKywgcCsrKSB7CisJCXN0YXR1cyA9IHFsX3JlYWRfZmxhc2hfd29yZChxZGV2LCBpLCBwKTsKKwkJaWYgKHN0YXR1cykgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJFcnJvciByZWFkaW5nIGZsYXNoLlxuIik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCX0KK2V4aXQ6CisJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fRkxBU0hfTUFTSyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogeGdtYWMgcmVnaXN0ZXIgYXJlIGxvY2F0ZWQgYmVoaW5kIHRoZSB4Z21hY19hZGRyIGFuZCB4Z21hY19kYXRhCisgKiByZWdpc3RlciBwYWlyLiAgRWFjaCByZWFkL3dyaXRlIHJlcXVpcmVzIHVzIHRvIHdhaXQgZm9yIHRoZSByZWFkeQorICogYml0IGJlZm9yZSByZWFkaW5nL3dyaXRpbmcgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgcWxfd3JpdGVfeGdtYWNfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCS8qIHdhaXQgZm9yIHJlZyB0byBjb21lIHJlYWR5ICovCisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsCisJCQlYR01BQ19BRERSLCBYR01BQ19BRERSX1JEWSwgWEdNQUNfQUREUl9YTUUpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJLyogd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcmVnICovCisJcWxfd3JpdGUzMihxZGV2LCBYR01BQ19EQVRBLCBkYXRhKTsKKwkvKiB0cmlnZ2VyIHRoZSB3cml0ZSAqLworCXFsX3dyaXRlMzIocWRldiwgWEdNQUNfQUREUiwgcmVnKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiB4Z21hYyByZWdpc3RlciBhcmUgbG9jYXRlZCBiZWhpbmQgdGhlIHhnbWFjX2FkZHIgYW5kIHhnbWFjX2RhdGEKKyAqIHJlZ2lzdGVyIHBhaXIuICBFYWNoIHJlYWQvd3JpdGUgcmVxdWlyZXMgdXMgdG8gd2FpdCBmb3IgdGhlIHJlYWR5CisgKiBiaXQgYmVmb3JlIHJlYWRpbmcvd3JpdGluZyB0aGUgZGF0YS4KKyAqLworaW50IHFsX3JlYWRfeGdtYWNfcmVnKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MzIgcmVnLCB1MzIgKmRhdGEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJLyogd2FpdCBmb3IgcmVnIHRvIGNvbWUgcmVhZHkgKi8KKwlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCVhHTUFDX0FERFIsIFhHTUFDX0FERFJfUkRZLCBYR01BQ19BRERSX1hNRSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBleGl0OworCS8qIHNldCB1cCBmb3IgcmVnIHJlYWQgKi8KKwlxbF93cml0ZTMyKHFkZXYsIFhHTUFDX0FERFIsIHJlZyB8IFhHTUFDX0FERFJfUik7CisJLyogd2FpdCBmb3IgcmVnIHRvIGNvbWUgcmVhZHkgKi8KKwlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwKKwkJCVhHTUFDX0FERFIsIFhHTUFDX0FERFJfUkRZLCBYR01BQ19BRERSX1hNRSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBleGl0OworCS8qIGdldCB0aGUgZGF0YSAqLworCSpkYXRhID0gcWxfcmVhZDMyKHFkZXYsIFhHTUFDX0RBVEEpOworZXhpdDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIGlzIHVzZWQgZm9yIHJlYWRpbmcgdGhlIDY0LWJpdCBzdGF0aXN0aWNzIHJlZ3MuICovCitpbnQgcWxfcmVhZF94Z21hY19yZWc2NChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTMyIHJlZywgdTY0ICpkYXRhKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBoaSA9IDA7CisJdTMyIGxvID0gMDsKKworCXN0YXR1cyA9IHFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIHJlZywgJmxvKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGV4aXQ7CisKKwlzdGF0dXMgPSBxbF9yZWFkX3hnbWFjX3JlZyhxZGV2LCByZWcgKyA0LCAmaGkpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXhpdDsKKworCSpkYXRhID0gKHU2NCkgbG8gfCAoKHU2NCkgaGkgPDwgMzIpOworCitleGl0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFRha2UgdGhlIE1BQyBDb3JlIG91dCBvZiByZXNldC4KKyAqIEVuYWJsZSBzdGF0aXN0aWNzIGNvdW50aW5nLgorICogVGFrZSB0aGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIgb3V0IG9mIHJlc2V0LgorICogVGhpcyBmdW5jdGlvbmFsaXR5IG1heSBiZSBkb25lIGluIHRoZSBNUEkgZmlybXdhcmUgYXQgYQorICogbGF0ZXIgZGF0ZS4KKyAqLworc3RhdGljIGludCBxbF9wb3J0X2luaXRpYWxpemUoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGRhdGE7CisKKwlpZiAocWxfc2VtX3RyeWxvY2socWRldiwgcWRldi0+eGdfc2VtX21hc2spKSB7CisJCS8qIEFub3RoZXIgZnVuY3Rpb24gaGFzIHRoZSBzZW1hcGhvcmUsIHNvCisJCSAqIHdhaXQgZm9yIHRoZSBwb3J0IGluaXQgYml0IHRvIGNvbWUgcmVhZHkuCisJCSAqLworCQlRUFJJTlRLKHFkZXYsIExJTkssIElORk8sCisJCQkiQW5vdGhlciBmdW5jdGlvbiBoYXMgdGhlIHNlbWFwaG9yZSwgc28gd2FpdCBmb3IgdGhlIHBvcnQgaW5pdCBiaXQgdG8gY29tZSByZWFkeS5cbiIpOworCQlzdGF0dXMgPSBxbF93YWl0X3JlZ19yZHkocWRldiwgU1RTLCBxZGV2LT5wb3J0X2luaXQsIDApOworCQlpZiAoc3RhdHVzKSB7CisJCQlRUFJJTlRLKHFkZXYsIExJTkssIENSSVQsCisJCQkJIlBvcnQgaW5pdGlhbGl6ZSB0aW1lZCBvdXQuXG4iKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCVFQUklOVEsocWRldiwgTElOSywgSU5GTywgIkdvdCB4Z21hYyBzZW1hcGhvcmUhLlxuIik7CisJLyogU2V0IHRoZSBjb3JlIHJlc2V0LiAqLworCXN0YXR1cyA9IHFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIEdMT0JBTF9DRkcsICZkYXRhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVuZDsKKwlkYXRhIHw9IEdMT0JBTF9DRkdfUkVTRVQ7CisJc3RhdHVzID0gcWxfd3JpdGVfeGdtYWNfcmVnKHFkZXYsIEdMT0JBTF9DRkcsIGRhdGEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZW5kOworCisJLyogQ2xlYXIgdGhlIGNvcmUgcmVzZXQgYW5kIHR1cm4gb24ganVtYm8gZm9yIHJlY2VpdmVyLiAqLworCWRhdGEgJj0gfkdMT0JBTF9DRkdfUkVTRVQ7CS8qIENsZWFyIGNvcmUgcmVzZXQuICovCisJZGF0YSB8PSBHTE9CQUxfQ0ZHX0pVTUJPOwkvKiBUdXJuIG9uIGp1bWJvLiAqLworCWRhdGEgfD0gR0xPQkFMX0NGR19UWF9TVEFUX0VOOworCWRhdGEgfD0gR0xPQkFMX0NGR19SWF9TVEFUX0VOOworCXN0YXR1cyA9IHFsX3dyaXRlX3hnbWFjX3JlZyhxZGV2LCBHTE9CQUxfQ0ZHLCBkYXRhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVuZDsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlciwgYW5kIGNsZWFyIGl0J3MgcmVzZXQuICovCisJc3RhdHVzID0gcWxfcmVhZF94Z21hY19yZWcocWRldiwgVFhfQ0ZHLCAmZGF0YSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlbmQ7CisJZGF0YSAmPSB+VFhfQ0ZHX1JFU0VUOwkvKiBDbGVhciB0aGUgVFggTUFDIHJlc2V0LiAqLworCWRhdGEgfD0gVFhfQ0ZHX0VOOwkvKiBFbmFibGUgdGhlIHRyYW5zbWl0dGVyLiAqLworCXN0YXR1cyA9IHFsX3dyaXRlX3hnbWFjX3JlZyhxZGV2LCBUWF9DRkcsIGRhdGEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZW5kOworCisJLyogRW5hYmxlIHJlY2VpdmVyIGFuZCBjbGVhciBpdCdzIHJlc2V0LiAqLworCXN0YXR1cyA9IHFsX3JlYWRfeGdtYWNfcmVnKHFkZXYsIFJYX0NGRywgJmRhdGEpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZW5kOworCWRhdGEgJj0gflJYX0NGR19SRVNFVDsJLyogQ2xlYXIgdGhlIFJYIE1BQyByZXNldC4gKi8KKwlkYXRhIHw9IFJYX0NGR19FTjsJLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwlzdGF0dXMgPSBxbF93cml0ZV94Z21hY19yZWcocWRldiwgUlhfQ0ZHLCBkYXRhKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVuZDsKKworCS8qIFR1cm4gb24ganVtYm8uICovCisJc3RhdHVzID0KKwkgICAgcWxfd3JpdGVfeGdtYWNfcmVnKHFkZXYsIE1BQ19UWF9QQVJBTVMsIE1BQ19UWF9QQVJBTVNfSlVNQk8gfCAoMHgyNTgwIDw8IDE2KSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlbmQ7CisJc3RhdHVzID0KKwkgICAgcWxfd3JpdGVfeGdtYWNfcmVnKHFkZXYsIE1BQ19SWF9QQVJBTVMsIDB4MjU4MCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlbmQ7CisKKwkvKiBTaWduYWwgdG8gdGhlIHdvcmxkIHRoYXQgdGhlIHBvcnQgaXMgZW5hYmxlZC4gICAgICAgICovCisJcWxfd3JpdGUzMihxZGV2LCBTVFMsICgocWRldi0+cG9ydF9pbml0IDw8IDE2KSB8IHFkZXYtPnBvcnRfaW5pdCkpOworZW5kOgorCXFsX3NlbV91bmxvY2socWRldiwgcWRldi0+eGdfc2VtX21hc2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEdldCB0aGUgbmV4dCBsYXJnZSBidWZmZXIuICovCitzdHJ1Y3QgYnFfZGVzYyAqcWxfZ2V0X2N1cnJfbGJ1ZihzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlzdHJ1Y3QgYnFfZGVzYyAqbGJxX2Rlc2MgPSAmcnhfcmluZy0+bGJxW3J4X3JpbmctPmxicV9jdXJyX2lkeF07CisJcnhfcmluZy0+bGJxX2N1cnJfaWR4Kys7CisJaWYgKHJ4X3JpbmctPmxicV9jdXJyX2lkeCA9PSByeF9yaW5nLT5sYnFfbGVuKQorCQlyeF9yaW5nLT5sYnFfY3Vycl9pZHggPSAwOworCXJ4X3JpbmctPmxicV9mcmVlX2NudCsrOworCXJldHVybiBsYnFfZGVzYzsKK30KKworLyogR2V0IHRoZSBuZXh0IHNtYWxsIGJ1ZmZlci4gKi8KK3N0cnVjdCBicV9kZXNjICpxbF9nZXRfY3Vycl9zYnVmKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCXN0cnVjdCBicV9kZXNjICpzYnFfZGVzYyA9ICZyeF9yaW5nLT5zYnFbcnhfcmluZy0+c2JxX2N1cnJfaWR4XTsKKwlyeF9yaW5nLT5zYnFfY3Vycl9pZHgrKzsKKwlpZiAocnhfcmluZy0+c2JxX2N1cnJfaWR4ID09IHJ4X3JpbmctPnNicV9sZW4pCisJCXJ4X3JpbmctPnNicV9jdXJyX2lkeCA9IDA7CisJcnhfcmluZy0+c2JxX2ZyZWVfY250Kys7CisJcmV0dXJuIHNicV9kZXNjOworfQorCisvKiBVcGRhdGUgYW4gcnggcmluZyBpbmRleC4gKi8KK3N0YXRpYyB2b2lkIHFsX3VwZGF0ZV9jcShzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlyeF9yaW5nLT5jbnNtcl9pZHgrKzsKKwlyeF9yaW5nLT5jdXJyX2VudHJ5Kys7CisJaWYgKHVubGlrZWx5KHJ4X3JpbmctPmNuc21yX2lkeCA9PSByeF9yaW5nLT5jcV9sZW4pKSB7CisJCXJ4X3JpbmctPmNuc21yX2lkeCA9IDA7CisJCXJ4X3JpbmctPmN1cnJfZW50cnkgPSByeF9yaW5nLT5jcV9iYXNlOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfd3JpdGVfY3FfaWR4KHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCXFsX3dyaXRlX2RiX3JlZyhyeF9yaW5nLT5jbnNtcl9pZHgsIHJ4X3JpbmctPmNuc21yX2lkeF9kYl9yZWcpOworfQorCisvKiBQcm9jZXNzIChyZWZpbGwpIGEgbGFyZ2UgYnVmZmVyIHF1ZXVlLiAqLworc3RhdGljIHZvaWQgcWxfdXBkYXRlX2xicShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgc3RydWN0IHJ4X3JpbmcgKnJ4X3JpbmcpCit7CisJaW50IGNsZWFuX2lkeCA9IHJ4X3JpbmctPmxicV9jbGVhbl9pZHg7CisJc3RydWN0IGJxX2Rlc2MgKmxicV9kZXNjOworCXN0cnVjdCBicV9lbGVtZW50ICpicTsKKwl1NjQgbWFwOworCWludCBpOworCisJd2hpbGUgKHJ4X3JpbmctPmxicV9mcmVlX2NudCA+IDE2KSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkJImxicTogdHJ5IGNsZWFuaW5nIGNsZWFuX2lkeCA9ICVkLlxuIiwKKwkJCQljbGVhbl9pZHgpOworCQkJbGJxX2Rlc2MgPSAmcnhfcmluZy0+bGJxW2NsZWFuX2lkeF07CisJCQlicSA9IGxicV9kZXNjLT5icTsKKwkJCWlmIChsYnFfZGVzYy0+cC5sYnFfcGFnZSA9PSBOVUxMKSB7CisJCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJCQkibGJxOiBnZXR0aW5nIG5ldyBwYWdlIGZvciBpbmRleCAlZC5cbiIsCisJCQkJCWxicV9kZXNjLT5pbmRleCk7CisJCQkJbGJxX2Rlc2MtPnAubGJxX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQkJCWlmIChsYnFfZGVzYy0+cC5sYnFfcGFnZSA9PSBOVUxMKSB7CisJCQkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBFUlIsCisJCQkJCQkiQ291bGRuJ3QgZ2V0IGEgcGFnZS5cbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCW1hcCA9IHBjaV9tYXBfcGFnZShxZGV2LT5wZGV2LAorCQkJCQkJICAgbGJxX2Rlc2MtPnAubGJxX3BhZ2UsCisJCQkJCQkgICAwLCBQQUdFX1NJWkUsCisJCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocWRldi0+cGRldiwgbWFwKSkgeworCQkJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgRVJSLAorCQkJCQkJIlBDSSBtYXBwaW5nIGZhaWxlZC5cbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXBjaV91bm1hcF9hZGRyX3NldChsYnFfZGVzYywgbWFwYWRkciwgbWFwKTsKKwkJCQlwY2lfdW5tYXBfbGVuX3NldChsYnFfZGVzYywgbWFwbGVuLCBQQUdFX1NJWkUpOworCQkJCWJxLT5hZGRyX2xvID0JLypsYnFfZGVzYy0+YWRkcl9sbyA9ICovCisJCQkJICAgIGNwdV90b19sZTMyKG1hcCk7CisJCQkJYnEtPmFkZHJfaGkgPQkvKmxicV9kZXNjLT5hZGRyX2hpID0gKi8KKwkJCQkgICAgY3B1X3RvX2xlMzIobWFwID4+IDMyKTsKKwkJCX0KKwkJCWNsZWFuX2lkeCsrOworCQkJaWYgKGNsZWFuX2lkeCA9PSByeF9yaW5nLT5sYnFfbGVuKQorCQkJCWNsZWFuX2lkeCA9IDA7CisJCX0KKworCQlyeF9yaW5nLT5sYnFfY2xlYW5faWR4ID0gY2xlYW5faWR4OworCQlyeF9yaW5nLT5sYnFfcHJvZF9pZHggKz0gMTY7CisJCWlmIChyeF9yaW5nLT5sYnFfcHJvZF9pZHggPT0gcnhfcmluZy0+bGJxX2xlbikKKwkJCXJ4X3JpbmctPmxicV9wcm9kX2lkeCA9IDA7CisJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCSJsYnE6IHVwZGF0aW5nIHByb2QgaWR4ID0gJWQuXG4iLAorCQkJcnhfcmluZy0+bGJxX3Byb2RfaWR4KTsKKwkJcWxfd3JpdGVfZGJfcmVnKHJ4X3JpbmctPmxicV9wcm9kX2lkeCwKKwkJCQlyeF9yaW5nLT5sYnFfcHJvZF9pZHhfZGJfcmVnKTsKKwkJcnhfcmluZy0+bGJxX2ZyZWVfY250IC09IDE2OworCX0KK30KKworLyogUHJvY2VzcyAocmVmaWxsKSBhIHNtYWxsIGJ1ZmZlciBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIHFsX3VwZGF0ZV9zYnEoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCWludCBjbGVhbl9pZHggPSByeF9yaW5nLT5zYnFfY2xlYW5faWR4OworCXN0cnVjdCBicV9kZXNjICpzYnFfZGVzYzsKKwlzdHJ1Y3QgYnFfZWxlbWVudCAqYnE7CisJdTY0IG1hcDsKKwlpbnQgaTsKKworCXdoaWxlIChyeF9yaW5nLT5zYnFfZnJlZV9jbnQgPiAxNikgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJc2JxX2Rlc2MgPSAmcnhfcmluZy0+c2JxW2NsZWFuX2lkeF07CisJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkJInNicTogdHJ5IGNsZWFuaW5nIGNsZWFuX2lkeCA9ICVkLlxuIiwKKwkJCQljbGVhbl9pZHgpOworCQkJYnEgPSBzYnFfZGVzYy0+YnE7CisJCQlpZiAoc2JxX2Rlc2MtPnAuc2tiID09IE5VTEwpIHsKKwkJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkJCSJzYnE6IGdldHRpbmcgbmV3IHNrYiBmb3IgaW5kZXggJWQuXG4iLAorCQkJCQlzYnFfZGVzYy0+aW5kZXgpOworCQkJCXNicV9kZXNjLT5wLnNrYiA9CisJCQkJICAgIG5ldGRldl9hbGxvY19za2IocWRldi0+bmRldiwKKwkJCQkJCSAgICAgcnhfcmluZy0+c2JxX2J1Zl9zaXplKTsKKwkJCQlpZiAoc2JxX2Rlc2MtPnAuc2tiID09IE5VTEwpIHsKKwkJCQkJUVBSSU5USyhxZGV2LCBQUk9CRSwgRVJSLAorCQkJCQkJIkNvdWxkbid0IGdldCBhbiBza2IuXG4iKTsKKwkJCQkJcnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9IGNsZWFuX2lkeDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlza2JfcmVzZXJ2ZShzYnFfZGVzYy0+cC5za2IsIFFMR0VfU0JfUEFEKTsKKwkJCQltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJCQkJICAgICBzYnFfZGVzYy0+cC5za2ItPmRhdGEsCisJCQkJCQkgICAgIHJ4X3JpbmctPnNicV9idWZfc2l6ZSAvCisJCQkJCQkgICAgIDIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcGNpX3VubWFwX2FkZHJfc2V0KHNicV9kZXNjLCBtYXBhZGRyLCBtYXApOworCQkJCXBjaV91bm1hcF9sZW5fc2V0KHNicV9kZXNjLCBtYXBsZW4sCisJCQkJCQkgIHJ4X3JpbmctPnNicV9idWZfc2l6ZSAvIDIpOworCQkJCWJxLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIobWFwKTsKKwkJCQlicS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKG1hcCA+PiAzMik7CisJCQl9CisKKwkJCWNsZWFuX2lkeCsrOworCQkJaWYgKGNsZWFuX2lkeCA9PSByeF9yaW5nLT5zYnFfbGVuKQorCQkJCWNsZWFuX2lkeCA9IDA7CisJCX0KKwkJcnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9IGNsZWFuX2lkeDsKKwkJcnhfcmluZy0+c2JxX3Byb2RfaWR4ICs9IDE2OworCQlpZiAocnhfcmluZy0+c2JxX3Byb2RfaWR4ID09IHJ4X3JpbmctPnNicV9sZW4pCisJCQlyeF9yaW5nLT5zYnFfcHJvZF9pZHggPSAwOworCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkic2JxOiB1cGRhdGluZyBwcm9kIGlkeCA9ICVkLlxuIiwKKwkJCXJ4X3JpbmctPnNicV9wcm9kX2lkeCk7CisJCXFsX3dyaXRlX2RiX3JlZyhyeF9yaW5nLT5zYnFfcHJvZF9pZHgsCisJCQkJcnhfcmluZy0+c2JxX3Byb2RfaWR4X2RiX3JlZyk7CisKKwkJcnhfcmluZy0+c2JxX2ZyZWVfY250IC09IDE2OworCX0KK30KKworc3RhdGljIHZvaWQgcWxfdXBkYXRlX2J1ZmZlcl9xdWV1ZXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgIHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCXFsX3VwZGF0ZV9zYnEocWRldiwgcnhfcmluZyk7CisJcWxfdXBkYXRlX2xicShxZGV2LCByeF9yaW5nKTsKK30KKworLyogVW5tYXBzIHR4IGJ1ZmZlcnMuICBDYW4gYmUgY2FsbGVkIGZyb20gc2VuZCgpIGlmIGEgcGNpIG1hcHBpbmcKKyAqIGZhaWxzIGF0IHNvbWUgc3RhZ2UsIG9yIGZyb20gdGhlIGludGVycnVwdCB3aGVuIGEgdHggY29tcGxldGVzLgorICovCitzdGF0aWMgdm9pZCBxbF91bm1hcF9zZW5kKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LAorCQkJICBzdHJ1Y3QgdHhfcmluZ19kZXNjICp0eF9yaW5nX2Rlc2MsIGludCBtYXBwZWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG1hcHBlZDsgaSsrKSB7CisJCWlmIChpID09IDAgfHwgKGkgPT0gNyAmJiBtYXBwZWQgPiA3KSkgeworCQkJLyoKKwkJCSAqIFVubWFwIHRoZSBza2ItPmRhdGEgYXJlYSwgb3IgdGhlCisJCQkgKiBleHRlcm5hbCBzZ2xpc3QgKEFLQSB0aGUgT3V0Ym91bmQKKwkJCSAqIEFkZHJlc3MgTGlzdCAoT0FMKSkuCisJCQkgKiBJZiBpdHMgdGhlIHplcm9ldGggZWxlbWVudCwgdGhlbiBpdCdzCisJCQkgKiB0aGUgc2tiLT5kYXRhIGFyZWEuICBJZiBpdCdzIHRoZSA3dGgKKwkJCSAqIGVsZW1lbnQgYW5kIHRoZXJlIGlzIG1vcmUgdGhhbiA2IGZyYWdzLAorCQkJICogdGhlbiBpdHMgYW4gT0FMLgorCQkJICovCisJCQlpZiAoaSA9PSA3KSB7CisJCQkJUVBSSU5USyhxZGV2LCBUWF9ET05FLCBERUJVRywKKwkJCQkJInVubWFwcGluZyBPQUwgYXJlYS5cbiIpOworCQkJfQorCQkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJCQkgcGNpX3VubWFwX2FkZHIoJnR4X3JpbmdfZGVzYy0+bWFwW2ldLAorCQkJCQkJCW1hcGFkZHIpLAorCQkJCQkgcGNpX3VubWFwX2xlbigmdHhfcmluZ19kZXNjLT5tYXBbaV0sCisJCQkJCQkgICAgICAgbWFwbGVuKSwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJUVBSSU5USyhxZGV2LCBUWF9ET05FLCBERUJVRywgInVubWFwcGluZyBmcmFnICVkLlxuIiwKKwkJCQlpKTsKKwkJCXBjaV91bm1hcF9wYWdlKHFkZXYtPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKCZ0eF9yaW5nX2Rlc2MtPm1hcFtpXSwKKwkJCQkJCSAgICAgIG1hcGFkZHIpLAorCQkJCSAgICAgICBwY2lfdW5tYXBfbGVuKCZ0eF9yaW5nX2Rlc2MtPm1hcFtpXSwKKwkJCQkJCSAgICAgbWFwbGVuKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwl9CisKK30KKworLyogTWFwIHRoZSBidWZmZXJzIGZvciB0aGlzIHRyYW5zbWl0LiAgVGhpcyB3aWxsIHJldHVybgorICogTkVUREVWX1RYX0JVU1kgb3IgTkVUREVWX1RYX09LIGJhc2VkIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgcWxfbWFwX3NlbmQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCSAgICAgICBzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICptYWNfaW9jYl9wdHIsCisJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdHhfcmluZ19kZXNjICp0eF9yaW5nX2Rlc2MpCit7CisJaW50IGxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJZG1hX2FkZHJfdCBtYXA7CisJaW50IGZyYWdfaWR4LCBlcnIsIG1hcF9pZHggPSAwOworCXN0cnVjdCB0eF9idWZfZGVzYyAqdGJkID0gbWFjX2lvY2JfcHRyLT50YmQ7CisJaW50IGZyYWdfY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCWlmIChmcmFnX2NudCkgeworCQlRUFJJTlRLKHFkZXYsIFRYX1FVRVVFRCwgREVCVUcsICJmcmFnX2NudCA9ICVkLlxuIiwgZnJhZ19jbnQpOworCX0KKwkvKgorCSAqIE1hcCB0aGUgc2tiIGJ1ZmZlciBmaXJzdC4KKwkgKi8KKwltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwllcnIgPSBwY2lfZG1hX21hcHBpbmdfZXJyb3IocWRldi0+cGRldiwgbWFwKTsKKwlpZiAoZXJyKSB7CisJCVFQUklOVEsocWRldiwgVFhfUVVFVUVELCBFUlIsCisJCQkiUENJIG1hcHBpbmcgZmFpbGVkIHdpdGggZXJyb3I6ICVkXG4iLCBlcnIpOworCisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwl0YmQtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJdGJkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwKTsKKwlwY2lfdW5tYXBfYWRkcl9zZXQoJnR4X3JpbmdfZGVzYy0+bWFwW21hcF9pZHhdLCBtYXBhZGRyLCBtYXApOworCXBjaV91bm1hcF9sZW5fc2V0KCZ0eF9yaW5nX2Rlc2MtPm1hcFttYXBfaWR4XSwgbWFwbGVuLCBsZW4pOworCW1hcF9pZHgrKzsKKworCS8qCisJICogVGhpcyBsb29wIGZpbGxzIHRoZSByZW1haW5kZXIgb2YgdGhlIDggYWRkcmVzcyBkZXNjcmlwdG9ycworCSAqIGluIHRoZSBJT0NCLiAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiA3IGZyYWdtZW50cywgdGhlbiB0aGUKKwkgKiBlaWdodGggYWRkcmVzcyBkZXNjIHdpbGwgcG9pbnQgdG8gYW4gZXh0ZXJuYWwgbGlzdCAoT0FMKS4KKwkgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnJhZ3Mgd2lsbCBiZSBzdG9yZWQKKwkgKiBpbiB0aGlzIGxpc3QuCisJICovCisJZm9yIChmcmFnX2lkeCA9IDA7IGZyYWdfaWR4IDwgZnJhZ19jbnQ7IGZyYWdfaWR4KyssIG1hcF9pZHgrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ19pZHhdOworCQl0YmQrKzsKKwkJaWYgKGZyYWdfaWR4ID09IDYgJiYgZnJhZ19jbnQgPiA3KSB7CisJCQkvKiBMZXQncyB0YWNrIG9uIGFuIHNnbGlzdC4KKwkJCSAqIE91ciBjb250cm9sIGJsb2NrIHdpbGwgbm93CisJCQkgKiBsb29rIGxpa2UgdGhpczoKKwkJCSAqIGlvY2ItPnNlZ1swXSA9IHNrYi0+ZGF0YQorCQkJICogaW9jYi0+c2VnWzFdID0gZnJhZ1swXQorCQkJICogaW9jYi0+c2VnWzJdID0gZnJhZ1sxXQorCQkJICogaW9jYi0+c2VnWzNdID0gZnJhZ1syXQorCQkJICogaW9jYi0+c2VnWzRdID0gZnJhZ1szXQorCQkJICogaW9jYi0+c2VnWzVdID0gZnJhZ1s0XQorCQkJICogaW9jYi0+c2VnWzZdID0gZnJhZ1s1XQorCQkJICogaW9jYi0+c2VnWzddID0gcHRyIHRvIE9BTCAoZXh0ZXJuYWwgc2dsaXN0KQorCQkJICogb2FsLT5zZWdbMF0gPSBmcmFnWzZdCisJCQkgKiBvYWwtPnNlZ1sxXSA9IGZyYWdbN10KKwkJCSAqIG9hbC0+c2VnWzJdID0gZnJhZ1s4XQorCQkJICogb2FsLT5zZWdbM10gPSBmcmFnWzldCisJCQkgKiBvYWwtPnNlZ1s0XSA9IGZyYWdbMTBdCisJCQkgKiAgICAgIGV0Yy4uLgorCQkJICovCisJCQkvKiBUYWNrIG9uIHRoZSBPQUwgaW4gdGhlIGVpZ2h0aCBzZWdtZW50IG9mIElPQ0IuICovCisJCQltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCAmdHhfcmluZ19kZXNjLT5vYWwsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBvYWwpLAorCQkJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZXJyID0gcGNpX2RtYV9tYXBwaW5nX2Vycm9yKHFkZXYtPnBkZXYsIG1hcCk7CisJCQlpZiAoZXJyKSB7CisJCQkJUVBSSU5USyhxZGV2LCBUWF9RVUVVRUQsIEVSUiwKKwkJCQkJIlBDSSBtYXBwaW5nIG91dGJvdW5kIGFkZHJlc3MgbGlzdCB3aXRoIGVycm9yOiAlZFxuIiwKKwkJCQkJZXJyKTsKKwkJCQlnb3RvIG1hcF9lcnJvcjsKKwkJCX0KKworCQkJdGJkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwKTsKKwkJCS8qCisJCQkgKiBUaGUgbGVuZ3RoIGlzIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzCisJCQkgKiB0aGF0IHJlbWFpbiB0byBiZSBtYXBwZWQgdGltZXMgdGhlIGxlbmd0aAorCQkJICogb2Ygb3VyIHNnbGlzdCAoT0FMKS4KKwkJCSAqLworCQkJdGJkLT5sZW4gPQorCQkJICAgIGNwdV90b19sZTMyKChzaXplb2Yoc3RydWN0IHR4X2J1Zl9kZXNjKSAqCisJCQkJCSAoZnJhZ19jbnQgLSBmcmFnX2lkeCkpIHwgVFhfREVTQ19DKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHhfcmluZ19kZXNjLT5tYXBbbWFwX2lkeF0sIG1hcGFkZHIsCisJCQkJCSAgIG1hcCk7CisJCQlwY2lfdW5tYXBfbGVuX3NldCgmdHhfcmluZ19kZXNjLT5tYXBbbWFwX2lkeF0sIG1hcGxlbiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IG9hbCkpOworCQkJdGJkID0gKHN0cnVjdCB0eF9idWZfZGVzYyAqKSZ0eF9yaW5nX2Rlc2MtPm9hbDsKKwkJCW1hcF9pZHgrKzsKKwkJfQorCisJCW1hcCA9CisJCSAgICBwY2lfbWFwX3BhZ2UocWRldi0+cGRldiwgZnJhZy0+cGFnZSwKKwkJCQkgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWVyciA9IHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApOworCQlpZiAoZXJyKSB7CisJCQlRUFJJTlRLKHFkZXYsIFRYX1FVRVVFRCwgRVJSLAorCQkJCSJQQ0kgbWFwcGluZyBmcmFncyBmYWlsZWQgd2l0aCBlcnJvcjogJWQuXG4iLAorCQkJCWVycik7CisJCQlnb3RvIG1hcF9lcnJvcjsKKwkJfQorCisJCXRiZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcCk7CisJCXRiZC0+bGVuID0gY3B1X3RvX2xlMzIoZnJhZy0+c2l6ZSk7CisJCXBjaV91bm1hcF9hZGRyX3NldCgmdHhfcmluZ19kZXNjLT5tYXBbbWFwX2lkeF0sIG1hcGFkZHIsIG1hcCk7CisJCXBjaV91bm1hcF9sZW5fc2V0KCZ0eF9yaW5nX2Rlc2MtPm1hcFttYXBfaWR4XSwgbWFwbGVuLAorCQkJCSAgZnJhZy0+c2l6ZSk7CisKKwl9CisJLyogU2F2ZSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHdlJ3ZlIG1hcHBlZC4gKi8KKwl0eF9yaW5nX2Rlc2MtPm1hcF9jbnQgPSBtYXBfaWR4OworCS8qIFRlcm1pbmF0ZSB0aGUgbGFzdCBzZWdtZW50LiAqLworCXRiZC0+bGVuID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUodGJkLT5sZW4pIHwgVFhfREVTQ19FKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCittYXBfZXJyb3I6CisJLyoKKwkgKiBJZiB0aGUgZmlyc3QgZnJhZyBtYXBwaW5nIGZhaWxlZCwgdGhlbiBpIHdpbGwgYmUgemVyby4KKwkgKiBUaGlzIGNhdXNlcyB0aGUgdW5tYXAgb2YgdGhlIHNrYi0+ZGF0YSBhcmVhLiAgT3RoZXJ3aXNlCisJICogd2UgcGFzcyBpbiB0aGUgbnVtYmVyIG9mIGZyYWdzIHRoYXQgbWFwcGVkIHN1Y2Nlc3NmdWxseQorCSAqIHNvIHRoZXkgY2FuIGJlIHVtYXBwZWQuCisJICovCisJcWxfdW5tYXBfc2VuZChxZGV2LCB0eF9yaW5nX2Rlc2MsIG1hcF9pZHgpOworCXJldHVybiBORVRERVZfVFhfQlVTWTsKK30KKwordm9pZCBxbF9yZWFsaWduX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworCXZvaWQgKnRlbXBfYWRkciA9IHNrYi0+ZGF0YTsKKworCS8qIFVuZG8gdGhlIHNrYl9yZXNlcnZlKHNrYiwzMikgd2UgZGlkIGJlZm9yZQorCSAqIGdpdmluZyB0byBoYXJkd2FyZSwgYW5kIHJlYWxpZ24gZGF0YSBvbgorCSAqIGEgMi1ieXRlIGJvdW5kYXJ5LgorCSAqLworCXNrYi0+ZGF0YSAtPSBRTEdFX1NCX1BBRCAtIE5FVF9JUF9BTElHTjsKKwlza2ItPnRhaWwgLT0gUUxHRV9TQl9QQUQgLSBORVRfSVBfQUxJR047CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCB0ZW1wX2FkZHIsCisJCSh1bnNpZ25lZCBpbnQpbGVuKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGFuIHNrYiBmb3IgdGhlIGdpdmVuIGluYm91bmQKKyAqIGNvbXBsZXRpb24uICBJdCB3aWxsIGJlIHJld3JpdHRlbiBmb3IgcmVhZGFiaWxpdHkgaW4gdGhlIG5lYXIKKyAqIGZ1dHVyZSwgYnV0IGZvciBub3QgaXQgd29ya3Mgd2VsbC4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpxbF9idWlsZF9yeF9za2Ioc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgICAgIHN0cnVjdCByeF9yaW5nICpyeF9yaW5nLAorCQkJCSAgICAgICBzdHJ1Y3QgaWJfbWFjX2lvY2JfcnNwICppYl9tYWNfcnNwKQoreworCXN0cnVjdCBicV9kZXNjICpsYnFfZGVzYzsKKwlzdHJ1Y3QgYnFfZGVzYyAqc2JxX2Rlc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTMyIGxlbmd0aCA9IGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmRhdGFfbGVuKTsKKyAgICAgICB1MzIgaGRyX2xlbiA9IGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9sZW4pOworCisJLyoKKwkgKiBIYW5kbGUgdGhlIGhlYWRlciBidWZmZXIgaWYgcHJlc2VudC4KKwkgKi8KKwlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3M0ICYgSUJfTUFDX0lPQ0JfUlNQX0hWICYmCisJICAgIGliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IUykgeworCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsICJIZWFkZXIgb2YgJWQgYnl0ZXMgaW4gc21hbGwgYnVmZmVyLlxuIiwgaGRyX2xlbik7CisJCS8qCisJCSAqIEhlYWRlcnMgZml0IG5pY2VseSBpbnRvIGEgc21hbGwgYnVmZmVyLgorCQkgKi8KKwkJc2JxX2Rlc2MgPSBxbF9nZXRfY3Vycl9zYnVmKHJ4X3JpbmcpOworCQlwY2lfdW5tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCisJCQkJcGNpX3VubWFwX2FkZHIoc2JxX2Rlc2MsIG1hcGFkZHIpLAorCQkJCXBjaV91bm1hcF9sZW4oc2JxX2Rlc2MsIG1hcGxlbiksCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiID0gc2JxX2Rlc2MtPnAuc2tiOworCQlxbF9yZWFsaWduX3NrYihza2IsIGhkcl9sZW4pOworCQlza2JfcHV0KHNrYiwgaGRyX2xlbik7CisJCXNicV9kZXNjLT5wLnNrYiA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBIYW5kbGUgdGhlIGRhdGEgYnVmZmVyKHMpLgorCSAqLworCWlmICh1bmxpa2VseSghbGVuZ3RoKSkgewkvKiBJcyB0aGVyZSBkYXRhIHRvbz8gKi8KKwkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJIk5vIERhdGEgYnVmZmVyIGluIHRoaXMgcGFja2V0LlxuIik7CisJCXJldHVybiBza2I7CisJfQorCisJaWYgKGliX21hY19yc3AtPmZsYWdzMyAmIElCX01BQ19JT0NCX1JTUF9EUykgeworCQlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3M0ICYgSUJfTUFDX0lPQ0JfUlNQX0hTKSB7CisJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkJIkhlYWRlcnMgaW4gc21hbGwsIGRhdGEgb2YgJWQgYnl0ZXMgaW4gc21hbGwsIGNvbWJpbmUgdGhlbS5cbiIsIGxlbmd0aCk7CisJCQkvKgorCQkJICogRGF0YSBpcyBsZXNzIHRoYW4gc21hbGwgYnVmZmVyIHNpemUgc28gaXQncworCQkJICogc3R1ZmZlZCBpbiBhIHNtYWxsIGJ1ZmZlci4KKwkJCSAqIEZvciB0aGlzIGNhc2Ugd2UgYXBwZW5kIHRoZSBkYXRhCisJCQkgKiBmcm9tIHRoZSAiZGF0YSIgc21hbGwgYnVmZmVyIHRvIHRoZSAiaGVhZGVyIiBzbWFsbAorCQkJICogYnVmZmVyLgorCQkJICovCisJCQlzYnFfZGVzYyA9IHFsX2dldF9jdXJyX3NidWYocnhfcmluZyk7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocWRldi0+cGRldiwKKwkJCQkJCSAgICBwY2lfdW5tYXBfYWRkcgorCQkJCQkJICAgIChzYnFfZGVzYywgbWFwYWRkciksCisJCQkJCQkgICAgcGNpX3VubWFwX2xlbgorCQkJCQkJICAgIChzYnFfZGVzYywgbWFwbGVuKSwKKwkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW5ndGgpLAorCQkJICAgICAgIHNicV9kZXNjLT5wLnNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShxZGV2LT5wZGV2LAorCQkJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyCisJCQkJCQkgICAgICAgKHNicV9kZXNjLAorCQkJCQkJCW1hcGFkZHIpLAorCQkJCQkJICAgICAgIHBjaV91bm1hcF9sZW4KKwkJCQkJCSAgICAgICAoc2JxX2Rlc2MsCisJCQkJCQkJbWFwbGVuKSwKKwkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9IGVsc2UgeworCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJCSIlZCBieXRlcyBpbiBhIHNpbmdsZSBzbWFsbCBidWZmZXIuXG4iLCBsZW5ndGgpOworCQkJc2JxX2Rlc2MgPSBxbF9nZXRfY3Vycl9zYnVmKHJ4X3JpbmcpOworCQkJc2tiID0gc2JxX2Rlc2MtPnAuc2tiOworCQkJcWxfcmVhbGlnbl9za2Ioc2tiLCBsZW5ndGgpOworCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCisJCQkJCSBwY2lfdW5tYXBfYWRkcihzYnFfZGVzYywKKwkJCQkJCQltYXBhZGRyKSwKKwkJCQkJIHBjaV91bm1hcF9sZW4oc2JxX2Rlc2MsCisJCQkJCQkgICAgICAgbWFwbGVuKSwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlzYnFfZGVzYy0+cC5za2IgPSBOVUxMOworCQl9CisJfSBlbHNlIGlmIChpYl9tYWNfcnNwLT5mbGFnczMgJiBJQl9NQUNfSU9DQl9SU1BfREwpIHsKKwkJaWYgKGliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IUykgeworCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJCSJIZWFkZXIgaW4gc21hbGwsICVkIGJ5dGVzIGluIGxhcmdlLiBDaGFpbiBsYXJnZSB0byBzbWFsbCFcbiIsIGxlbmd0aCk7CisJCQkvKgorCQkJICogVGhlIGRhdGEgaXMgaW4gYSBzaW5nbGUgbGFyZ2UgYnVmZmVyLiAgV2UKKwkJCSAqIGNoYWluIGl0IHRvIHRoZSBoZWFkZXIgYnVmZmVyJ3Mgc2tiIGFuZCBsZXQKKwkJCSAqIGl0IHJpcC4KKwkJCSAqLworCQkJbGJxX2Rlc2MgPSBxbF9nZXRfY3Vycl9sYnVmKHJ4X3JpbmcpOworCQkJcGNpX3VubWFwX3BhZ2UocWRldi0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIobGJxX2Rlc2MsCisJCQkJCQkgICAgICBtYXBhZGRyKSwKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihsYnFfZGVzYywgbWFwbGVuKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCQkiQ2hhaW5pbmcgcGFnZSB0byBza2IuXG4iKTsKKwkJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIDAsIGxicV9kZXNjLT5wLmxicV9wYWdlLAorCQkJCQkgICAwLCBsZW5ndGgpOworCQkJc2tiLT5sZW4gKz0gbGVuZ3RoOworCQkJc2tiLT5kYXRhX2xlbiArPSBsZW5ndGg7CisJCQlza2ItPnRydWVzaXplICs9IGxlbmd0aDsKKwkJCWxicV9kZXNjLT5wLmxicV9wYWdlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgaGVhZGVycyBhbmQgZGF0YSBhcmUgaW4gYSBzaW5nbGUgbGFyZ2UgYnVmZmVyLiBXZQorCQkJICogY29weSBpdCB0byBhIG5ldyBza2IgYW5kIGxldCBpdCBnby4gVGhpcyBjYW4gaGFwcGVuIHdpdGgKKwkJCSAqIGp1bWJvIG10dSBvbiBhIG5vbi1UQ1AvVURQIGZyYW1lLgorCQkJICovCisJCQlsYnFfZGVzYyA9IHFsX2dldF9jdXJyX2xidWYocnhfcmluZyk7CisJCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHFkZXYtPm5kZXYsIGxlbmd0aCk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlRUFJJTlRLKHFkZXYsIFBST0JFLCBERUJVRywKKwkJCQkJIk5vIHNrYiBhdmFpbGFibGUsIGRyb3AgdGhlIHBhY2tldC5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJCSIlZCBieXRlcyBvZiBoZWFkZXJzIGFuZCBkYXRhIGluIGxhcmdlLiBDaGFpbiBwYWdlIHRvIG5ldyBza2IgYW5kIHB1bGwgdGFpbC5cbiIsIGxlbmd0aCk7CisJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAwLCBsYnFfZGVzYy0+cC5sYnFfcGFnZSwKKwkJCQkJICAgMCwgbGVuZ3RoKTsKKwkJCXNrYi0+bGVuICs9IGxlbmd0aDsKKwkJCXNrYi0+ZGF0YV9sZW4gKz0gbGVuZ3RoOworCQkJc2tiLT50cnVlc2l6ZSArPSBsZW5ndGg7CisJCQlsZW5ndGggLT0gbGVuZ3RoOworCQkJbGJxX2Rlc2MtPnAubGJxX3BhZ2UgPSBOVUxMOworCQkJX19wc2tiX3B1bGxfdGFpbChza2IsCisJCQkJKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9WKSA/CisJCQkJVkxBTl9FVEhfSExFTiA6IEVUSF9ITEVOKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBkYXRhIGlzIGluIGEgY2hhaW4gb2YgbGFyZ2UgYnVmZmVycworCQkgKiBwb2ludGVkIHRvIGJ5IGEgc21hbGwgYnVmZmVyLiAgV2UgbG9vcAorCQkgKiB0aHJ1IGFuZCBjaGFpbiB0aGVtIHRvIHRoZSBvdXIgc21hbGwgaGVhZGVyCisJCSAqIGJ1ZmZlcidzIHNrYi4KKwkJICogZnJhZ3M6ICBUaGVyZSBhcmUgMTggbWF4IGZyYWdzIGFuZCBvdXIgc21hbGwKKwkJICogICAgICAgICBidWZmZXIgd2lsbCBob2xkIDMyIG9mIHRoZW0uIFRoZSB0aGluZyBpcywKKwkJICogICAgICAgICB3ZSdsbCB1c2UgMyBtYXggZm9yIG91ciA5MDAwIGJ5dGUganVtYm8KKwkJICogICAgICAgICBmcmFtZXMuICBJZiB0aGUgTVRVIGdvZXMgdXAgd2UgY291bGQKKwkJICogICAgICAgICAgZXZlbnR1YWxseSBiZSBpbiB0cm91YmxlLgorCQkgKi8KKwkJaW50IHNpemUsIG9mZnNldCwgaSA9IDA7CisJCXN0cnVjdCBicV9lbGVtZW50ICpicSwgYnFfYXJyYXlbOF07CisJCXNicV9kZXNjID0gcWxfZ2V0X2N1cnJfc2J1ZihyeF9yaW5nKTsKKwkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihzYnFfZGVzYywgbWFwYWRkciksCisJCQkJIHBjaV91bm1hcF9sZW4oc2JxX2Rlc2MsIG1hcGxlbiksCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmICghKGliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IUykpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIG5vbiBUQ1AvVURQIElQIGZyYW1lLCBzbworCQkJICogdGhlIGhlYWRlcnMgYXJlbid0IHNwbGl0IGludG8gYSBzbWFsbAorCQkJICogYnVmZmVyLiAgV2UgaGF2ZSB0byB1c2UgdGhlIHNtYWxsIGJ1ZmZlcgorCQkJICogdGhhdCBjb250YWlucyBvdXIgc2cgbGlzdCBhcyBvdXIgc2tiIHRvCisJCQkgKiBzZW5kIHVwc3RhaXJzLiBDb3B5IHRoZSBzZyBsaXN0IGhlcmUgdG8KKwkJCSAqIGEgbG9jYWwgYnVmZmVyIGFuZCB1c2UgaXQgdG8gZmluZCB0aGUKKwkJCSAqIHBhZ2VzIHRvIGNoYWluLgorCQkJICovCisJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkJIiVkIGJ5dGVzIG9mIGhlYWRlcnMgJiBkYXRhIGluIGNoYWluIG9mIGxhcmdlLlxuIiwgbGVuZ3RoKTsKKwkJCXNrYiA9IHNicV9kZXNjLT5wLnNrYjsKKwkJCWJxID0gJmJxX2FycmF5WzBdOworCQkJbWVtY3B5KGJxLCBza2ItPmRhdGEsIHNpemVvZihicV9hcnJheSkpOworCQkJc2JxX2Rlc2MtPnAuc2tiID0gTlVMTDsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKwkJfSBlbHNlIHsKKwkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCQkiSGVhZGVycyBpbiBzbWFsbCwgJWQgYnl0ZXMgb2YgZGF0YSBpbiBjaGFpbiBvZiBsYXJnZS5cbiIsIGxlbmd0aCk7CisJCQlicSA9IChzdHJ1Y3QgYnFfZWxlbWVudCAqKXNicV9kZXNjLT5wLnNrYi0+ZGF0YTsKKwkJfQorCQl3aGlsZSAobGVuZ3RoID4gMCkgeworCQkJbGJxX2Rlc2MgPSBxbF9nZXRfY3Vycl9sYnVmKHJ4X3JpbmcpOworCQkJaWYgKChicS0+YWRkcl9sbyAmIH5CUV9NQVNLKSAhPSBsYnFfZGVzYy0+YnEtPmFkZHJfbG8pIHsKKwkJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgRVJSLAorCQkJCQkiUGFuaWMhISEgYmFkIGxhcmdlIGJ1ZmZlciBhZGRyZXNzLCBleHBlY3RlZCAweCUuMDh4LCBnb3QgMHglLjA4eC5cbiIsCisJCQkJCWxicV9kZXNjLT5icS0+YWRkcl9sbywgYnEtPmFkZHJfbG8pOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJcGNpX3VubWFwX3BhZ2UocWRldi0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIobGJxX2Rlc2MsCisJCQkJCQkgICAgICBtYXBhZGRyKSwKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihsYnFfZGVzYywKKwkJCQkJCSAgICAgbWFwbGVuKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNpemUgPSAobGVuZ3RoIDwgUEFHRV9TSVpFKSA/IGxlbmd0aCA6IFBBR0VfU0laRTsKKwkJCW9mZnNldCA9IDA7CisKKwkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCQkiQWRkaW5nIHBhZ2UgJWQgdG8gc2tiIGZvciAlZCBieXRlcy5cbiIsCisJCQkJaSwgc2l6ZSk7CisJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBpLCBsYnFfZGVzYy0+cC5sYnFfcGFnZSwKKwkJCQkJICAgb2Zmc2V0LCBzaXplKTsKKwkJCXNrYi0+bGVuICs9IHNpemU7CisJCQlza2ItPmRhdGFfbGVuICs9IHNpemU7CisJCQlza2ItPnRydWVzaXplICs9IHNpemU7CisJCQlsZW5ndGggLT0gc2l6ZTsKKwkJCWxicV9kZXNjLT5wLmxicV9wYWdlID0gTlVMTDsKKwkJCWJxKys7CisJCQlpKys7CisJCX0KKwkJX19wc2tiX3B1bGxfdGFpbChza2IsIChpYl9tYWNfcnNwLT5mbGFnczIgJiBJQl9NQUNfSU9DQl9SU1BfVikgPworCQkJCVZMQU5fRVRIX0hMRU4gOiBFVEhfSExFTik7CisJfQorCXJldHVybiBza2I7Cit9CisKKy8qIFByb2Nlc3MgYW4gaW5ib3VuZCBjb21wbGV0aW9uIGZyb20gYW4gcnggcmluZy4gKi8KK3N0YXRpYyB2b2lkIHFsX3Byb2Nlc3NfbWFjX3J4X2ludHIoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgc3RydWN0IHJ4X3JpbmcgKnJ4X3JpbmcsCisJCQkJICAgc3RydWN0IGliX21hY19pb2NiX3JzcCAqaWJfbWFjX3JzcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHFkZXYtPm5kZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwlRTF9EVU1QX0lCX01BQ19SU1AoaWJfbWFjX3JzcCk7CisKKwlza2IgPSBxbF9idWlsZF9yeF9za2IocWRldiwgcnhfcmluZywgaWJfbWFjX3JzcCk7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCSJObyBza2IgYXZhaWxhYmxlLCBkcm9wIHBhY2tldC5cbiIpOworCQlyZXR1cm47CisJfQorCisJcHJlZmV0Y2goc2tiLT5kYXRhKTsKKwlza2ItPmRldiA9IG5kZXY7CisJaWYgKGliX21hY19yc3AtPmZsYWdzMSAmIElCX01BQ19JT0NCX1JTUF9NX01BU0spIHsKKwkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLCAiJXMlcyVzIE11bHRpY2FzdC5cbiIsCisJCQkoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSykgPT0KKwkJCUlCX01BQ19JT0NCX1JTUF9NX0hBU0ggPyAiSGFzaCIgOiAiIiwKKwkJCShpYl9tYWNfcnNwLT5mbGFnczEgJiBJQl9NQUNfSU9DQl9SU1BfTV9NQVNLKSA9PQorCQkJSUJfTUFDX0lPQ0JfUlNQX01fUkVHID8gIlJlZ2lzdGVyZWQiIDogIiIsCisJCQkoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX01fTUFTSykgPT0KKwkJCUlCX01BQ19JT0NCX1JTUF9NX1BST00gPyAiUHJvbWlzY3VvdXMiIDogIiIpOworCX0KKwlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1ApIHsKKwkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLCAiUHJvbWlzY3VvdXMgUGFja2V0LlxuIik7CisJfQorCWlmIChpYl9tYWNfcnNwLT5mbGFnczEgJiAoSUJfTUFDX0lPQ0JfUlNQX0lFIHwgSUJfTUFDX0lPQ0JfUlNQX1RFKSkgeworCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgRVJSLAorCQkJIkJhZCBjaGVja3N1bSBmb3IgdGhpcyAlcyBwYWNrZXQuXG4iLAorCQkJKChpYl9tYWNfcnNwLT4KKwkJCSAgZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1QpID8gIlRDUCIgOiAiVURQIikpOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfSBlbHNlIGlmIChxZGV2LT5yeF9jc3VtICYmCisJCSAgICgoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1QpIHx8CisJCSAgICAoKGliX21hY19yc3AtPmZsYWdzMiAmIElCX01BQ19JT0NCX1JTUF9VKSAmJgorCQkgICAgICEoaWJfbWFjX3JzcC0+ZmxhZ3MxICYgSUJfTUFDX0lPQ0JfUlNQX05VKSkpKSB7CisJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywgIlJYIGNoZWNrc3VtIGRvbmUhXG4iKTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9CisJcWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXFkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCWlmIChxZGV2LT52bGdycCAmJiAoaWJfbWFjX3JzcC0+ZmxhZ3MyICYgSUJfTUFDX0lPQ0JfUlNQX1YpKSB7CisJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCSJQYXNzaW5nIGEgVkxBTiBwYWNrZXQgdXBzdHJlYW0uXG4iKTsKKwkJdmxhbl9od2FjY2VsX3J4KHNrYiwgcWRldi0+dmxncnAsCisJCQkJbGUxNl90b19jcHUoaWJfbWFjX3JzcC0+dmxhbl9pZCkpOworCX0gZWxzZSB7CisJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCSJQYXNzaW5nIGEgbm9ybWFsIHBhY2tldCB1cHN0cmVhbS5cbiIpOworCQluZXRpZl9yeChza2IpOworCX0KKwluZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyogUHJvY2VzcyBhbiBvdXRib3VuZCBjb21wbGV0aW9uIGZyb20gYW4gcnggcmluZy4gKi8KK3N0YXRpYyB2b2lkIHFsX3Byb2Nlc3NfbWFjX3R4X2ludHIoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJICAgc3RydWN0IG9iX21hY19pb2NiX3JzcCAqbWFjX3JzcCkKK3sKKwlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZzsKKwlzdHJ1Y3QgdHhfcmluZ19kZXNjICp0eF9yaW5nX2Rlc2M7CisKKwlRTF9EVU1QX09CX01BQ19SU1AobWFjX3JzcCk7CisJdHhfcmluZyA9ICZxZGV2LT50eF9yaW5nW21hY19yc3AtPnR4cV9pZHhdOworCXR4X3JpbmdfZGVzYyA9ICZ0eF9yaW5nLT5xW21hY19yc3AtPnRpZF07CisJcWxfdW5tYXBfc2VuZChxZGV2LCB0eF9yaW5nX2Rlc2MsIHR4X3JpbmdfZGVzYy0+bWFwX2NudCk7CisJcWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhfcmluZ19kZXNjLT5tYXBfY250OworCXFkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXZfa2ZyZWVfc2tiKHR4X3JpbmdfZGVzYy0+c2tiKTsKKwl0eF9yaW5nX2Rlc2MtPnNrYiA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkobWFjX3JzcC0+ZmxhZ3MxICYgKE9CX01BQ19JT0NCX1JTUF9FIHwKKwkJCQkJT0JfTUFDX0lPQ0JfUlNQX1MgfAorCQkJCQlPQl9NQUNfSU9DQl9SU1BfTCB8CisJCQkJCU9CX01BQ19JT0NCX1JTUF9QIHwgT0JfTUFDX0lPQ0JfUlNQX0IpKSkgeworCQlpZiAobWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX0UpIHsKKwkJCVFQUklOVEsocWRldiwgVFhfRE9ORSwgV0FSTklORywKKwkJCQkiVG90YWwgZGVzY3JpcHRvciBsZW5ndGggZGlkIG5vdCBtYXRjaCB0cmFuc2ZlciBsZW5ndGguXG4iKTsKKwkJfQorCQlpZiAobWFjX3JzcC0+ZmxhZ3MxICYgT0JfTUFDX0lPQ0JfUlNQX1MpIHsKKwkJCVFQUklOVEsocWRldiwgVFhfRE9ORSwgV0FSTklORywKKwkJCQkiRnJhbWUgdG9vIHNob3J0IHRvIGJlIGxlZ2FsLCBub3Qgc2VudC5cbiIpOworCQl9CisJCWlmIChtYWNfcnNwLT5mbGFnczEgJiBPQl9NQUNfSU9DQl9SU1BfTCkgeworCQkJUVBSSU5USyhxZGV2LCBUWF9ET05FLCBXQVJOSU5HLAorCQkJCSJGcmFtZSB0b28gbG9uZywgYnV0IHNlbnQgYW55d2F5LlxuIik7CisJCX0KKwkJaWYgKG1hY19yc3AtPmZsYWdzMSAmIE9CX01BQ19JT0NCX1JTUF9CKSB7CisJCQlRUFJJTlRLKHFkZXYsIFRYX0RPTkUsIFdBUk5JTkcsCisJCQkJIlBDSSBiYWNrcGxhbmUgZXJyb3IuIEZyYW1lIG5vdCBzZW50LlxuIik7CisJCX0KKwl9CisJYXRvbWljX2luYygmdHhfcmluZy0+dHhfY291bnQpOworfQorCisvKiBGaXJlIHVwIGEgaGFuZGxlciB0byByZXNldCB0aGUgTVBJIHByb2Nlc3Nvci4gKi8KK3ZvaWQgcWxfcXVldWVfZndfZXJyb3Ioc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShxZGV2LT5uZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihxZGV2LT5uZGV2KTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocWRldi0+d29ya3F1ZXVlLCAmcWRldi0+bXBpX3Jlc2V0X3dvcmssIDApOworfQorCit2b2lkIHFsX3F1ZXVlX2FzaWNfZXJyb3Ioc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShxZGV2LT5uZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihxZGV2LT5uZGV2KTsKKwlxbF9kaXNhYmxlX2ludGVycnVwdHMocWRldik7CisJcXVldWVfZGVsYXllZF93b3JrKHFkZXYtPndvcmtxdWV1ZSwgJnFkZXYtPmFzaWNfcmVzZXRfd29yaywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3Byb2Nlc3NfY2hpcF9hZV9pbnRyKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LAorCQkJCSAgICBzdHJ1Y3QgaWJfYWVfaW9jYl9yc3AgKmliX2FlX3JzcCkKK3sKKwlzd2l0Y2ggKGliX2FlX3JzcC0+ZXZlbnQpIHsKKwljYXNlIE1HTVRfRVJSX0VWRU5UOgorCQlRUFJJTlRLKHFkZXYsIFJYX0VSUiwgRVJSLAorCQkJIk1hbmFnZW1lbnQgUHJvY2Vzc29yIEZhdGFsIEVycm9yLlxuIik7CisJCXFsX3F1ZXVlX2Z3X2Vycm9yKHFkZXYpOworCQlyZXR1cm47CisKKwljYXNlIENBTV9MT09LVVBfRVJSX0VWRU5UOgorCQlRUFJJTlRLKHFkZXYsIExJTkssIEVSUiwKKwkJCSJNdWx0aXBsZSBDQU0gaGl0cyBsb29rdXAgb2NjdXJyZWQuXG4iKTsKKwkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwgIlRoaXMgZXZlbnQgc2hvdWxkbid0IG9jY3VyLlxuIik7CisJCXFsX3F1ZXVlX2FzaWNfZXJyb3IocWRldik7CisJCXJldHVybjsKKworCWNhc2UgU09GVF9FQ0NfRVJST1JfRVZFTlQ6CisJCVFQUklOVEsocWRldiwgUlhfRVJSLCBFUlIsICJTb2Z0IEVDQyBlcnJvciBkZXRlY3RlZC5cbiIpOworCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOworCQlicmVhazsKKworCWNhc2UgUENJX0VSUl9BTk9OX0JVRl9SRDoKKwkJUVBSSU5USyhxZGV2LCBSWF9FUlIsIEVSUiwKKwkJCSJQQ0kgZXJyb3Igb2NjdXJyZWQgd2hlbiByZWFkaW5nIGFub255bW91cyBidWZmZXJzIGZyb20gcnhfcmluZyAlZC5cbiIsCisJCQlpYl9hZV9yc3AtPnFfaWQpOworCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVFQUklOVEsocWRldiwgRFJWLCBFUlIsICJVbmV4cGVjdGVkIGV2ZW50ICVkLlxuIiwKKwkJCWliX2FlX3JzcC0+ZXZlbnQpOworCQlxbF9xdWV1ZV9hc2ljX2Vycm9yKHFkZXYpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWxfY2xlYW5fb3V0Ym91bmRfcnhfcmluZyhzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IHJ4X3JpbmctPnFkZXY7CisJdTMyIHByb2QgPSBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCXN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgKm5ldF9yc3AgPSBOVUxMOworCWludCBjb3VudCA9IDA7CisKKwkvKiBXaGlsZSB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUgY29tcGxldGlvbiBxdWV1ZS4gKi8KKwl3aGlsZSAocHJvZCAhPSByeF9yaW5nLT5jbnNtcl9pZHgpIHsKKworCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCisJCQkiY3FfaWQgPSAlZCwgcHJvZCA9ICVkLCBjbnNtciA9ICVkLlxuLiIsIHJ4X3JpbmctPmNxX2lkLAorCQkJcHJvZCwgcnhfcmluZy0+Y25zbXJfaWR4KTsKKworCQluZXRfcnNwID0gKHN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgKilyeF9yaW5nLT5jdXJyX2VudHJ5OworCQlybWIoKTsKKwkJc3dpdGNoIChuZXRfcnNwLT5vcGNvZGUpIHsKKworCQljYXNlIE9QQ09ERV9PQl9NQUNfVFNPX0lPQ0I6CisJCWNhc2UgT1BDT0RFX09CX01BQ19JT0NCOgorCQkJcWxfcHJvY2Vzc19tYWNfdHhfaW50cihxZGV2LCBuZXRfcnNwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJCSJIaXQgZGVmYXVsdCBjYXNlLCBub3QgaGFuZGxlZCEgZHJvcHBpbmcgdGhlIHBhY2tldCwgb3Bjb2RlID0gJXguXG4iLAorCQkJCW5ldF9yc3AtPm9wY29kZSk7CisJCX0KKwkJY291bnQrKzsKKwkJcWxfdXBkYXRlX2NxKHJ4X3JpbmcpOworCQlwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKKwl9CisJcWxfd3JpdGVfY3FfaWR4KHJ4X3JpbmcpOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHFkZXYtPm5kZXYpICYmIG5ldF9yc3AgIT0gTlVMTCkgeworCQlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZyA9ICZxZGV2LT50eF9yaW5nW25ldF9yc3AtPnR4cV9pZHhdOworCQlpZiAoYXRvbWljX3JlYWQoJnR4X3JpbmctPnF1ZXVlX3N0b3BwZWQpICYmCisJCSAgICAoYXRvbWljX3JlYWQoJnR4X3JpbmctPnR4X2NvdW50KSA+ICh0eF9yaW5nLT53cV9sZW4gLyA0KSkpCisJCQkvKgorCQkJICogVGhlIHF1ZXVlIGdvdCBzdG9wcGVkIGJlY2F1c2UgdGhlIHR4X3Jpbmcgd2FzIGZ1bGwuCisJCQkgKiBXYWtlIGl0IHVwLCBiZWNhdXNlIGl0J3Mgbm93IGF0IGxlYXN0IDI1JSBlbXB0eS4KKwkJCSAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShxZGV2LT5uZGV2KTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcWxfY2xlYW5faW5ib3VuZF9yeF9yaW5nKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKKwl1MzIgcHJvZCA9IHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJc3RydWN0IHFsX25ldF9yc3BfaW9jYiAqbmV0X3JzcDsKKwlpbnQgY291bnQgPSAwOworCisJLyogV2hpbGUgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhlIGNvbXBsZXRpb24gcXVldWUuICovCisJd2hpbGUgKHByb2QgIT0gcnhfcmluZy0+Y25zbXJfaWR4KSB7CisKKwkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAorCQkJImNxX2lkID0gJWQsIHByb2QgPSAlZCwgY25zbXIgPSAlZC5cbi4iLCByeF9yaW5nLT5jcV9pZCwKKwkJCXByb2QsIHJ4X3JpbmctPmNuc21yX2lkeCk7CisKKwkJbmV0X3JzcCA9IHJ4X3JpbmctPmN1cnJfZW50cnk7CisJCXJtYigpOworCQlzd2l0Y2ggKG5ldF9yc3AtPm9wY29kZSkgeworCQljYXNlIE9QQ09ERV9JQl9NQUNfSU9DQjoKKwkJCXFsX3Byb2Nlc3NfbWFjX3J4X2ludHIocWRldiwgcnhfcmluZywKKwkJCQkJICAgICAgIChzdHJ1Y3QgaWJfbWFjX2lvY2JfcnNwICopCisJCQkJCSAgICAgICBuZXRfcnNwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1BDT0RFX0lCX0FFX0lPQ0I6CisJCQlxbF9wcm9jZXNzX2NoaXBfYWVfaW50cihxZGV2LCAoc3RydWN0IGliX2FlX2lvY2JfcnNwICopCisJCQkJCQluZXRfcnNwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywKKwkJCQkJIkhpdCBkZWZhdWx0IGNhc2UsIG5vdCBoYW5kbGVkISBkcm9wcGluZyB0aGUgcGFja2V0LCBvcGNvZGUgPSAleC5cbiIsCisJCQkJCW5ldF9yc3AtPm9wY29kZSk7CisJCQl9CisJCX0KKwkJY291bnQrKzsKKwkJcWxfdXBkYXRlX2NxKHJ4X3JpbmcpOworCQlwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKKwkJaWYgKGNvdW50ID09IGJ1ZGdldCkKKwkJCWJyZWFrOworCX0KKwlxbF91cGRhdGVfYnVmZmVyX3F1ZXVlcyhxZGV2LCByeF9yaW5nKTsKKwlxbF93cml0ZV9jcV9pZHgocnhfcmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHFsX25hcGlfcG9sbF9tc2l4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZyA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgcnhfcmluZywgbmFwaSk7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSByeF9yaW5nLT5xZGV2OworCWludCB3b3JrX2RvbmUgPSBxbF9jbGVhbl9pbmJvdW5kX3J4X3JpbmcocnhfcmluZywgYnVkZ2V0KTsKKworCVFQUklOVEsocWRldiwgUlhfU1RBVFVTLCBERUJVRywgIkVudGVyLCBOQVBJIFBPTEwgY3FfaWQgPSAlZC5cbiIsCisJCXJ4X3JpbmctPmNxX2lkKTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJX19uZXRpZl9yeF9jb21wbGV0ZShxZGV2LT5uZGV2LCBuYXBpKTsKKwkJcWxfZW5hYmxlX2NvbXBsZXRpb25faW50ZXJydXB0KHFkZXYsIHJ4X3JpbmctPmlycSk7CisJfQorCXJldHVybiB3b3JrX2RvbmU7Cit9CisKK3N0YXRpYyB2b2lkIHFsX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXFkZXYtPnZsZ3JwID0gZ3JwOworCWlmIChncnApIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBERUJVRywgIlR1cm5pbmcgb24gVkxBTiBpbiBOSUNfUkNWX0NGRy5cbiIpOworCQlxbF93cml0ZTMyKHFkZXYsIE5JQ19SQ1ZfQ0ZHLCBOSUNfUkNWX0NGR19WTEFOX01BU0sgfAorCQkJICAgTklDX1JDVl9DRkdfVkxBTl9NQVRDSF9BTkRfTk9OKTsKKwl9IGVsc2UgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIERFQlVHLAorCQkJIlR1cm5pbmcgb2ZmIFZMQU4gaW4gTklDX1JDVl9DRkcuXG4iKTsKKwkJcWxfd3JpdGUzMihxZGV2LCBOSUNfUkNWX0NGRywgTklDX1JDVl9DRkdfVkxBTl9NQVNLKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHFsX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBlbmFibGVfYml0ID0gTUFDX0FERFJfRTsKKworCXNwaW5fbG9jaygmcWRldi0+aHdfbG9jayk7CisJaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcKKwkgICAgKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwgTUFDX0FERFJfVFlQRV9WTEFOLCB2aWQpKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIGluaXQgdmxhbiBhZGRyZXNzLlxuIik7CisJfQorCXNwaW5fdW5sb2NrKCZxZGV2LT5od19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcWxfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBlbmFibGVfYml0ID0gMDsKKworCXNwaW5fbG9jaygmcWRldi0+aHdfbG9jayk7CisJaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcKKwkgICAgKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwgTUFDX0FERFJfVFlQRV9WTEFOLCB2aWQpKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIGNsZWFyIHZsYW4gYWRkcmVzcy5cbiIpOworCX0KKwlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CisKK30KKworLyogV29ya2VyIHRocmVhZCB0byBwcm9jZXNzIGEgZ2l2ZW4gcnhfcmluZyB0aGF0IGlzIGRlZGljYXRlZAorICogdG8gb3V0Ym91bmQgY29tcGxldGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIHFsX3R4X2NsZWFuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZyA9CisJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhfcmluZywgcnhfd29yay53b3JrKTsKKwlxbF9jbGVhbl9vdXRib3VuZF9yeF9yaW5nKHJ4X3JpbmcpOworCXFsX2VuYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChyeF9yaW5nLT5xZGV2LCByeF9yaW5nLT5pcnEpOworCit9CisKKy8qIFdvcmtlciB0aHJlYWQgdG8gcHJvY2VzcyBhIGdpdmVuIHJ4X3JpbmcgdGhhdCBpcyBkZWRpY2F0ZWQKKyAqIHRvIGluYm91bmQgY29tcGxldGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIHFsX3J4X2NsZWFuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZyA9CisJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhfcmluZywgcnhfd29yay53b3JrKTsKKwlxbF9jbGVhbl9pbmJvdW5kX3J4X3JpbmcocnhfcmluZywgNjQpOworCXFsX2VuYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChyeF9yaW5nLT5xZGV2LCByeF9yaW5nLT5pcnEpOworfQorCisvKiBNU0ktWCBNdWx0aXBsZSBWZWN0b3IgSW50ZXJydXB0IEhhbmRsZXIgZm9yIG91dGJvdW5kIGNvbXBsZXRpb25zLiAqLworc3RhdGljIGlycXJldHVybl90IHFsZ2VfbXNpeF90eF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nID0gZGV2X2lkOworCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihyeF9yaW5nLT5jcHUsIHJ4X3JpbmctPnFkZXYtPnFfd29ya3F1ZXVlLAorCQkJICAgICAgJnJ4X3JpbmctPnJ4X3dvcmssIDApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogTVNJLVggTXVsdGlwbGUgVmVjdG9yIEludGVycnVwdCBIYW5kbGVyIGZvciBpbmJvdW5kIGNvbXBsZXRpb25zLiAqLworc3RhdGljIGlycXJldHVybl90IHFsZ2VfbXNpeF9yeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nID0gZGV2X2lkOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKKwluZXRpZl9yeF9zY2hlZHVsZShxZGV2LT5uZGV2LCAmcnhfcmluZy0+bmFwaSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBXZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB3ZSdyZSBhbHJlYWR5IGhhbmRsaW5nIGEgbGVnYWN5CisgKiBpbnRlcnJ1cHQuICBJZiB3ZSBhcmUsIHRoZW4gaXQgbXVzdCBiZWxvbmcgdG8gYW5vdGhlcgorICogY2hpcCB3aXRoIHdoaWNoIHdlJ3JlIHNoYXJpbmcgdGhlIGludGVycnVwdCBsaW5lLgorICovCitpbnQgcWxfbGVnYWN5X2NoZWNrKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBlcnI7CisJc3Bpbl9sb2NrKCZxZGV2LT5sZWdhY3lfbG9jayk7CisJZXJyID0gYXRvbWljX3JlYWQoJnFkZXYtPmludHJfY29udGV4dFswXS5pcnFfY250KTsKKwlzcGluX3VubG9jaygmcWRldi0+bGVnYWN5X2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgaGFuZGxlcyBhIGZhdGFsIGVycm9yLCBNUEkgYWN0aXZpdHksIGFuZCB0aGUgZGVmYXVsdAorICogcnhfcmluZyBpbiBhbiBNU0ktWCBtdWx0aXBsZSB2ZWN0b3IgZW52aXJvbm1lbnQuCisgKiBJbiBNU0kvTGVnYWN5IGVudmlyb25tZW50IGl0IGFsc28gcHJvY2VzcyB0aGUgcmVzdCBvZgorICogdGhlIHJ4X3JpbmdzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcWxnZV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nID0gZGV2X2lkOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKKwlzdHJ1Y3QgaW50cl9jb250ZXh0ICppbnRyX2NvbnRleHQgPSAmcWRldi0+aW50cl9jb250ZXh0WzBdOworCXUzMiB2YXI7CisJaW50IGk7CisJaW50IHdvcmtfZG9uZSA9IDA7CisKKwlpZiAocWRldi0+bGVnYWN5X2NoZWNrICYmIHFkZXYtPmxlZ2FjeV9jaGVjayhxZGV2KSkgeworCQlRUFJJTlRLKHFkZXYsIElOVFIsIElORk8sICJBbHJlYWR5IGJ1c3ksIG5vdCBvdXIgaW50ZXJydXB0LlxuIik7CisJCXJldHVybiBJUlFfTk9ORTsJLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KKwl9CisKKwl2YXIgPSBxbF9yZWFkMzIocWRldiwgU1RTKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGZhdGFsIGVycm9yLgorCSAqLworCWlmICh2YXIgJiBTVFNfRkUpIHsKKwkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKKwkJUVBSSU5USyhxZGV2LCBJTlRSLCBFUlIsICJHb3QgZmF0YWwgZXJyb3IsIFNUUyA9ICV4LlxuIiwgdmFyKTsKKwkJdmFyID0gcWxfcmVhZDMyKHFkZXYsIEVSUl9TVFMpOworCQlRUFJJTlRLKHFkZXYsIElOVFIsIEVSUiwKKwkJCSJSZXNldHRpbmcgY2hpcC4gRXJyb3IgU3RhdHVzIFJlZ2lzdGVyID0gMHgleFxuIiwgdmFyKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qCisJICogQ2hlY2sgTVBJIHByb2Nlc3NvciBhY3Rpdml0eS4KKwkgKi8KKwlpZiAodmFyICYgU1RTX1BJKSB7CisJCS8qCisJCSAqIFdlJ3ZlIGdvdCBhbiBhc3luYyBldmVudCBvciBtYWlsYm94IGNvbXBsZXRpb24uCisJCSAqIEhhbmRsZSBpdCBhbmQgY2xlYXIgdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0LgorCQkgKi8KKwkJUVBSSU5USyhxZGV2LCBJTlRSLCBFUlIsICJHb3QgTVBJIHByb2Nlc3NvciBpbnRlcnJ1cHQuXG4iKTsKKwkJcWxfZGlzYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChxZGV2LCBpbnRyX2NvbnRleHQtPmludHIpOworCQlxdWV1ZV9kZWxheWVkX3dvcmtfb24oc21wX3Byb2Nlc3Nvcl9pZCgpLCBxZGV2LT53b3JrcXVldWUsCisJCQkJICAgICAgJnFkZXYtPm1waV93b3JrLCAwKTsKKwkJd29ya19kb25lKys7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgZGVmYXVsdCBxdWV1ZSBhbmQgd2FrZSBoYW5kbGVyIGlmIGFjdGl2ZS4KKwkgKi8KKwlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbMF07CisJaWYgKHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZykgIT0gcnhfcmluZy0+Y25zbXJfaWR4KSB7CisJCVFQUklOVEsocWRldiwgSU5UUiwgSU5GTywgIldha2luZyBoYW5kbGVyIGZvciByeF9yaW5nWzBdLlxuIik7CisJCXFsX2Rpc2FibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQocWRldiwgaW50cl9jb250ZXh0LT5pbnRyKTsKKwkJcXVldWVfZGVsYXllZF93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgcWRldi0+cV93b3JrcXVldWUsCisJCQkJICAgICAgJnJ4X3JpbmctPnJ4X3dvcmssIDApOworCQl3b3JrX2RvbmUrKzsKKwl9CisKKwlpZiAoIXRlc3RfYml0KFFMX01TSVhfRU5BQkxFRCwgJnFkZXYtPmZsYWdzKSkgeworCQkvKgorCQkgKiBTdGFydCB0aGUgRFBDIGZvciBlYWNoIGFjdGl2ZSBxdWV1ZS4KKwkJICovCisJCWZvciAoaSA9IDE7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKKwkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKKwkJCWlmIChxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9CisJCQkgICAgcnhfcmluZy0+Y25zbXJfaWR4KSB7CisJCQkJUVBSSU5USyhxZGV2LCBJTlRSLCBJTkZPLAorCQkJCQkiV2FraW5nIGhhbmRsZXIgZm9yIHJ4X3JpbmdbJWRdLlxuIiwgaSk7CisJCQkJcWxfZGlzYWJsZV9jb21wbGV0aW9uX2ludGVycnVwdChxZGV2LAorCQkJCQkJCQlpbnRyX2NvbnRleHQtPgorCQkJCQkJCQlpbnRyKTsKKwkJCQlpZiAoaSA8IHFkZXYtPnJzc19yaW5nX2ZpcnN0X2NxX2lkKQorCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmtfb24ocnhfcmluZy0+Y3B1LAorCQkJCQkJCSAgICAgIHFkZXYtPnFfd29ya3F1ZXVlLAorCQkJCQkJCSAgICAgICZyeF9yaW5nLT5yeF93b3JrLAorCQkJCQkJCSAgICAgIDApOworCQkJCWVsc2UKKwkJCQkJbmV0aWZfcnhfc2NoZWR1bGUocWRldi0+bmRldiwKKwkJCQkJCQkgICZyeF9yaW5nLT5uYXBpKTsKKwkJCQl3b3JrX2RvbmUrKzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gd29ya19kb25lID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCBxbF90c28oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG9iX21hY190c29faW9jYl9yZXEgKm1hY19pb2NiX3B0cikKK3sKKworCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJaW50IGVycjsKKwkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKKwkJCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCW1hY19pb2NiX3B0ci0+b3Bjb2RlID0gT1BDT0RFX09CX01BQ19UU09fSU9DQjsKKwkJbWFjX2lvY2JfcHRyLT5mbGFnczMgfD0gT0JfTUFDX1RTT19JT0NCX0lDOworCQltYWNfaW9jYl9wdHItPmZyYW1lX2xlbiA9IGNwdV90b19sZTMyKCh1MzIpIHNrYi0+bGVuKTsKKwkJbWFjX2lvY2JfcHRyLT50b3RhbF9oZHJzX2xlbiA9CisJCSAgICBjcHVfdG9fbGUxNihza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpKTsKKwkJbWFjX2lvY2JfcHRyLT5uZXRfdHJhbnNfb2Zmc2V0ID0KKwkJICAgIGNwdV90b19sZTE2KHNrYl9uZXR3b3JrX29mZnNldChza2IpIHwKKwkJCQlza2JfdHJhbnNwb3J0X29mZnNldChza2IpCisJCQkJPDwgT0JfTUFDX1RSQU5TUE9SVF9IRFJfU0hJRlQpOworCQltYWNfaW9jYl9wdHItPm1zcyA9IGNwdV90b19sZTE2KHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCQltYWNfaW9jYl9wdHItPmZsYWdzMiB8PSBPQl9NQUNfVFNPX0lPQ0JfTFNPOworCQlpZiAobGlrZWx5KHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSkgeworCQkJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwkJCWlwaC0+Y2hlY2sgPSAwOworCQkJbWFjX2lvY2JfcHRyLT5mbGFnczEgfD0gT0JfTUFDX1RTT19JT0NCX0lQNDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkJCQkJIDApOworCQl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJCW1hY19pb2NiX3B0ci0+ZmxhZ3MxIHw9IE9CX01BQ19UU09fSU9DQl9JUDY7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCSAgICB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSAgICAgMCwgSVBQUk9UT19UQ1AsIDApOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWxfaHdfY3N1bV9zZXR1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3Qgb2JfbWFjX3Rzb19pb2NiX3JlcSAqbWFjX2lvY2JfcHRyKQoreworCWludCBsZW47CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwl1MTYgKmNoZWNrOworCW1hY19pb2NiX3B0ci0+b3Bjb2RlID0gT1BDT0RFX09CX01BQ19UU09fSU9DQjsKKwltYWNfaW9jYl9wdHItPmZyYW1lX2xlbiA9IGNwdV90b19sZTMyKCh1MzIpIHNrYi0+bGVuKTsKKwltYWNfaW9jYl9wdHItPm5ldF90cmFuc19vZmZzZXQgPQorCQljcHVfdG9fbGUxNihza2JfbmV0d29ya19vZmZzZXQoc2tiKSB8CisJCXNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgPDwgT0JfTUFDX1RSQU5TUE9SVF9IRFJfU0hJRlQpOworCisJbWFjX2lvY2JfcHRyLT5mbGFnczEgfD0gT0JfTUFDX1RTT19JT0NCX0lQNDsKKwlsZW4gPSAobnRvaHMoaXBoLT50b3RfbGVuKSAtIChpcGgtPmlobCA8PCAyKSk7CisJaWYgKGxpa2VseShpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSkgeworCQljaGVjayA9ICYodGNwX2hkcihza2IpLT5jaGVjayk7CisJCW1hY19pb2NiX3B0ci0+ZmxhZ3MyIHw9IE9CX01BQ19UU09fSU9DQl9UQzsKKwkJbWFjX2lvY2JfcHRyLT50b3RhbF9oZHJzX2xlbiA9CisJCSAgICBjcHVfdG9fbGUxNihza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQkodGNwX2hkcihza2IpLT5kb2ZmIDw8IDIpKTsKKwl9IGVsc2UgeworCQljaGVjayA9ICYodWRwX2hkcihza2IpLT5jaGVjayk7CisJCW1hY19pb2NiX3B0ci0+ZmxhZ3MyIHw9IE9CX01BQ19UU09fSU9DQl9VQzsKKwkJbWFjX2lvY2JfcHRyLT50b3RhbF9oZHJzX2xlbiA9CisJCSAgICBjcHVfdG9fbGUxNihza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQlzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCX0KKwkqY2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkgICAgaXBoLT5kYWRkciwgbGVuLCBpcGgtPnByb3RvY29sLCAwKTsKK30KKworc3RhdGljIGludCBxbGdlX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHR4X3JpbmdfZGVzYyAqdHhfcmluZ19kZXNjOworCXN0cnVjdCBvYl9tYWNfaW9jYl9yZXEgKm1hY19pb2NiX3B0cjsKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCB0c287CisJc3RydWN0IHR4X3JpbmcgKnR4X3Jpbmc7CisJdTMyIHR4X3JpbmdfaWR4ID0gKHUzMikgUUxfVFhRX0lEWChxZGV2LCBza2IpOworCisJdHhfcmluZyA9ICZxZGV2LT50eF9yaW5nW3R4X3JpbmdfaWR4XTsKKworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmdHhfcmluZy0+dHhfY291bnQpIDwgMikpIHsKKwkJUVBSSU5USyhxZGV2LCBUWF9RVUVVRUQsIElORk8sCisJCQkiJXM6IHNodXR0aW5nIGRvd24gdHggcXVldWUgJWQgZHUgdG8gbGFjayBvZiByZXNvdXJjZXMuXG4iLAorCQkJX19mdW5jX18sIHR4X3JpbmdfaWR4KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJYXRvbWljX2luYygmdHhfcmluZy0+cXVldWVfc3RvcHBlZCk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisJdHhfcmluZ19kZXNjID0gJnR4X3JpbmctPnFbdHhfcmluZy0+cHJvZF9pZHhdOworCW1hY19pb2NiX3B0ciA9IHR4X3JpbmdfZGVzYy0+cXVldWVfZW50cnk7CisJbWVtc2V0KCh2b2lkICopbWFjX2lvY2JfcHRyLCAwLCBzaXplb2YobWFjX2lvY2JfcHRyKSk7CisJaWYgKHFsX21hcF9zZW5kKHFkZXYsIG1hY19pb2NiX3B0ciwgc2tiLCB0eF9yaW5nX2Rlc2MpICE9IE5FVERFVl9UWF9PSykgeworCQlRUFJJTlRLKHFkZXYsIFRYX1FVRVVFRCwgRVJSLCAiQ291bGQgbm90IG1hcCB0aGUgc2VnbWVudHMuXG4iKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCW1hY19pb2NiX3B0ci0+b3Bjb2RlID0gT1BDT0RFX09CX01BQ19JT0NCOworCW1hY19pb2NiX3B0ci0+dGlkID0gdHhfcmluZ19kZXNjLT5pbmRleDsKKwkvKiBXZSB1c2UgdGhlIHVwcGVyIDMyLWJpdHMgdG8gc3RvcmUgdGhlIHR4IHF1ZXVlIGZvciB0aGlzIElPLgorCSAqIFdoZW4gd2UgZ2V0IHRoZSBjb21wbGV0aW9uIHdlIGNhbiB1c2UgaXQgdG8gZXN0YWJsaXNoIHRoZSBjb250ZXh0LgorCSAqLworCW1hY19pb2NiX3B0ci0+dHhxX2lkeCA9IHR4X3JpbmdfaWR4OworCXR4X3JpbmdfZGVzYy0+c2tiID0gc2tiOworCisJbWFjX2lvY2JfcHRyLT5mcmFtZV9sZW4gPSBjcHVfdG9fbGUxNigodTE2KSBza2ItPmxlbik7CisKKwlpZiAocWRldi0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCVFQUklOVEsocWRldiwgVFhfUVVFVUVELCBERUJVRywgIkFkZGluZyBhIHZsYW4gdGFnICVkLlxuIiwKKwkJCXZsYW5fdHhfdGFnX2dldChza2IpKTsKKwkJbWFjX2lvY2JfcHRyLT5mbGFnczMgfD0gT0JfTUFDX0lPQ0JfVjsKKwkJbWFjX2lvY2JfcHRyLT52bGFuX3RjaSA9IGNwdV90b19sZTE2KHZsYW5fdHhfdGFnX2dldChza2IpKTsKKwl9CisJdHNvID0gcWxfdHNvKHNrYiwgKHN0cnVjdCBvYl9tYWNfdHNvX2lvY2JfcmVxICopbWFjX2lvY2JfcHRyKTsKKwlpZiAodHNvIDwgMCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0gZWxzZSBpZiAodW5saWtlbHkoIXRzbykgJiYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7CisJCXFsX2h3X2NzdW1fc2V0dXAoc2tiLAorCQkJCSAoc3RydWN0IG9iX21hY190c29faW9jYl9yZXEgKiltYWNfaW9jYl9wdHIpOworCX0KKwlRTF9EVU1QX09CX01BQ19JT0NCKG1hY19pb2NiX3B0cik7CisJdHhfcmluZy0+cHJvZF9pZHgrKzsKKwlpZiAodHhfcmluZy0+cHJvZF9pZHggPT0gdHhfcmluZy0+d3FfbGVuKQorCQl0eF9yaW5nLT5wcm9kX2lkeCA9IDA7CisJd21iKCk7CisKKwlxbF93cml0ZV9kYl9yZWcodHhfcmluZy0+cHJvZF9pZHgsIHR4X3JpbmctPnByb2RfaWR4X2RiX3JlZyk7CisJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCVFQUklOVEsocWRldiwgVFhfUVVFVUVELCBERUJVRywgInR4IHF1ZXVlZCwgc2xvdCAlZCwgbGVuICVkXG4iLAorCQl0eF9yaW5nLT5wcm9kX2lkeCwgc2tiLT5sZW4pOworCisJYXRvbWljX2RlYygmdHhfcmluZy0+dHhfY291bnQpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2ZyZWVfc2hhZG93X3NwYWNlKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWlmIChxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgIFBBR0VfU0laRSwKKwkJCQkgICAgcWRldi0+cnhfcmluZ19zaGFkb3dfcmVnX2FyZWEsCisJCQkJICAgIHFkZXYtPnJ4X3Jpbmdfc2hhZG93X3JlZ19kbWEpOworCQlxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSA9IE5VTEw7CisJfQorCWlmIChxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfYXJlYSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgIFBBR0VfU0laRSwKKwkJCQkgICAgcWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2FyZWEsCisJCQkJICAgIHFkZXYtPnR4X3Jpbmdfc2hhZG93X3JlZ19kbWEpOworCQlxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfYXJlYSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHFsX2FsbG9jX3NoYWRvd19zcGFjZShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSA9CisJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJIFBBR0VfU0laRSwgJnFkZXYtPnJ4X3Jpbmdfc2hhZG93X3JlZ19kbWEpOworCWlmIChxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSA9PSBOVUxMKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJIkFsbG9jYXRpb24gb2YgUlggc2hhZG93IHNwYWNlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2FyZWEgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LCBQQUdFX1NJWkUsCisJCQkJICZxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfZG1hKTsKKwlpZiAocWRldi0+dHhfcmluZ19zaGFkb3dfcmVnX2FyZWEgPT0gTlVMTCkgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCSJBbGxvY2F0aW9uIG9mIFRYIHNoYWRvdyBzcGFjZSBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfd3FwX3NoX2FyZWE7CisJfQorCXJldHVybiAwOworCitlcnJfd3FwX3NoX2FyZWE6CisJcGNpX2ZyZWVfY29uc2lzdGVudChxZGV2LT5wZGV2LAorCQkJICAgIFBBR0VfU0laRSwKKwkJCSAgICBxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfYXJlYSwKKwkJCSAgICBxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfZG1hKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcWxfaW5pdF90eF9yaW5nKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZykKK3sKKwlzdHJ1Y3QgdHhfcmluZ19kZXNjICp0eF9yaW5nX2Rlc2M7CisJaW50IGk7CisJc3RydWN0IG9iX21hY19pb2NiX3JlcSAqbWFjX2lvY2JfcHRyOworCisJbWFjX2lvY2JfcHRyID0gdHhfcmluZy0+d3FfYmFzZTsKKwl0eF9yaW5nX2Rlc2MgPSB0eF9yaW5nLT5xOworCWZvciAoaSA9IDA7IGkgPCB0eF9yaW5nLT53cV9sZW47IGkrKykgeworCQl0eF9yaW5nX2Rlc2MtPmluZGV4ID0gaTsKKwkJdHhfcmluZ19kZXNjLT5za2IgPSBOVUxMOworCQl0eF9yaW5nX2Rlc2MtPnF1ZXVlX2VudHJ5ID0gbWFjX2lvY2JfcHRyOworCQltYWNfaW9jYl9wdHIrKzsKKwkJdHhfcmluZ19kZXNjKys7CisJfQorCWF0b21pY19zZXQoJnR4X3JpbmctPnR4X2NvdW50LCB0eF9yaW5nLT53cV9sZW4pOworCWF0b21pY19zZXQoJnR4X3JpbmctPnF1ZXVlX3N0b3BwZWQsIDApOworfQorCitzdGF0aWMgdm9pZCBxbF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwKKwkJCQkgc3RydWN0IHR4X3JpbmcgKnR4X3JpbmcpCit7CisJaWYgKHR4X3JpbmctPndxX2Jhc2UpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChxZGV2LT5wZGV2LCB0eF9yaW5nLT53cV9zaXplLAorCQkJCSAgICB0eF9yaW5nLT53cV9iYXNlLCB0eF9yaW5nLT53cV9iYXNlX2RtYSk7CisJCXR4X3JpbmctPndxX2Jhc2UgPSBOVUxMOworCX0KKwlrZnJlZSh0eF9yaW5nLT5xKTsKKwl0eF9yaW5nLT5xID0gTlVMTDsKK30KKworc3RhdGljIGludCBxbF9hbGxvY190eF9yZXNvdXJjZXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJIHN0cnVjdCB0eF9yaW5nICp0eF9yaW5nKQoreworCXR4X3JpbmctPndxX2Jhc2UgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LCB0eF9yaW5nLT53cV9zaXplLAorCQkJCSAmdHhfcmluZy0+d3FfYmFzZV9kbWEpOworCisJaWYgKCh0eF9yaW5nLT53cV9iYXNlID09IE5VTEwpCisJICAgIHx8IHR4X3JpbmctPndxX2Jhc2VfZG1hICYgKHR4X3JpbmctPndxX3NpemUgLSAxKSkgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgInR4X3JpbmcgYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0eF9yaW5nLT5xID0KKwkgICAga21hbGxvYyh0eF9yaW5nLT53cV9sZW4gKiBzaXplb2Yoc3RydWN0IHR4X3JpbmdfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICh0eF9yaW5nLT5xID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CitlcnI6CisJcGNpX2ZyZWVfY29uc2lzdGVudChxZGV2LT5wZGV2LCB0eF9yaW5nLT53cV9zaXplLAorCQkJICAgIHR4X3JpbmctPndxX2Jhc2UsIHR4X3JpbmctPndxX2Jhc2VfZG1hKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBxbF9mcmVlX2xicV9idWZmZXJzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnFfZGVzYyAqbGJxX2Rlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+bGJxX2xlbjsgaSsrKSB7CisJCWxicV9kZXNjID0gJnJ4X3JpbmctPmxicVtpXTsKKwkJaWYgKGxicV9kZXNjLT5wLmxicV9wYWdlKSB7CisJCQlwY2lfdW5tYXBfcGFnZShxZGV2LT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihsYnFfZGVzYywgbWFwYWRkciksCisJCQkJICAgICAgIHBjaV91bm1hcF9sZW4obGJxX2Rlc2MsIG1hcGxlbiksCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXB1dF9wYWdlKGxicV9kZXNjLT5wLmxicV9wYWdlKTsKKwkJCWxicV9kZXNjLT5wLmxicV9wYWdlID0gTlVMTDsKKwkJfQorCQlsYnFfZGVzYy0+YnEtPmFkZHJfbG8gPSAwOworCQlsYnFfZGVzYy0+YnEtPmFkZHJfaGkgPSAwOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBtYXAgYSBwYWdlIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIGxicS4KKyAqLworc3RhdGljIGludCBxbF9hbGxvY19sYnFfYnVmZmVycyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwKKwkJCQlzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnFfZGVzYyAqbGJxX2Rlc2M7CisJdTY0IG1hcDsKKwlzdHJ1Y3QgYnFfZWxlbWVudCAqYnEgPSByeF9yaW5nLT5sYnFfYmFzZTsKKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5sYnFfbGVuOyBpKyspIHsKKwkJbGJxX2Rlc2MgPSAmcnhfcmluZy0+bGJxW2ldOworCQltZW1zZXQobGJxX2Rlc2MsIDAsIHNpemVvZihsYnFfZGVzYykpOworCQlsYnFfZGVzYy0+YnEgPSBicTsKKwkJbGJxX2Rlc2MtPmluZGV4ID0gaTsKKwkJbGJxX2Rlc2MtPnAubGJxX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIWxicV9kZXNjLT5wLmxicV9wYWdlKSkgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJmYWlsZWQgYWxsb2NfcGFnZSgpLlxuIik7CisJCQlnb3RvIG1lbV9lcnJvcjsKKwkJfSBlbHNlIHsKKwkJCW1hcCA9IHBjaV9tYXBfcGFnZShxZGV2LT5wZGV2LAorCQkJCQkgICBsYnFfZGVzYy0+cC5sYnFfcGFnZSwKKwkJCQkJICAgMCwgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihxZGV2LT5wZGV2LCBtYXApKSB7CisJCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJCSJQQ0kgbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJCQlnb3RvIG1lbV9lcnJvcjsKKwkJCX0KKwkJCXBjaV91bm1hcF9hZGRyX3NldChsYnFfZGVzYywgbWFwYWRkciwgbWFwKTsKKwkJCXBjaV91bm1hcF9sZW5fc2V0KGxicV9kZXNjLCBtYXBsZW4sIFBBR0VfU0laRSk7CisJCQlicS0+YWRkcl9sbyA9IGNwdV90b19sZTMyKG1hcCk7CisJCQlicS0+YWRkcl9oaSA9IGNwdV90b19sZTMyKG1hcCA+PiAzMik7CisJCX0KKwkJYnErKzsKKwl9CisJcmV0dXJuIDA7CittZW1fZXJyb3I6CisJcWxfZnJlZV9sYnFfYnVmZmVycyhxZGV2LCByeF9yaW5nKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBxbF9mcmVlX3NicV9idWZmZXJzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnFfZGVzYyAqc2JxX2Rlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+c2JxX2xlbjsgaSsrKSB7CisJCXNicV9kZXNjID0gJnJ4X3JpbmctPnNicVtpXTsKKwkJaWYgKHNicV9kZXNjID09IE5VTEwpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAic2JxX2Rlc2MgJWQgaXMgTlVMTC5cbiIsIGkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzYnFfZGVzYy0+cC5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocWRldi0+cGRldiwKKwkJCQkJIHBjaV91bm1hcF9hZGRyKHNicV9kZXNjLCBtYXBhZGRyKSwKKwkJCQkJIHBjaV91bm1hcF9sZW4oc2JxX2Rlc2MsIG1hcGxlbiksCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihzYnFfZGVzYy0+cC5za2IpOworCQkJc2JxX2Rlc2MtPnAuc2tiID0gTlVMTDsKKwkJfQorCQlpZiAoc2JxX2Rlc2MtPmJxID09IE5VTEwpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAic2JxX2Rlc2MtPmJxICVkIGlzIE5VTEwuXG4iLAorCQkJCWkpOworCQkJcmV0dXJuOworCQl9CisJCXNicV9kZXNjLT5icS0+YWRkcl9sbyA9IDA7CisJCXNicV9kZXNjLT5icS0+YWRkcl9oaSA9IDA7CisJfQorfQorCisvKiBBbGxvY2F0ZSBhbmQgbWFwIGFuIHNrYiBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBzYnEuICovCitzdGF0aWMgaW50IHFsX2FsbG9jX3NicV9idWZmZXJzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LAorCQkJCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCWludCBpOworCXN0cnVjdCBicV9kZXNjICpzYnFfZGVzYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU2NCBtYXA7CisJc3RydWN0IGJxX2VsZW1lbnQgKmJxID0gcnhfcmluZy0+c2JxX2Jhc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+c2JxX2xlbjsgaSsrKSB7CisJCXNicV9kZXNjID0gJnJ4X3JpbmctPnNicVtpXTsKKwkJbWVtc2V0KHNicV9kZXNjLCAwLCBzaXplb2Yoc2JxX2Rlc2MpKTsKKwkJc2JxX2Rlc2MtPmluZGV4ID0gaTsKKwkJc2JxX2Rlc2MtPmJxID0gYnE7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IocWRldi0+bmRldiwgcnhfcmluZy0+c2JxX2J1Zl9zaXplKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkic21hbGwgYnVmZiBhbGxvYyBmYWlsZWQgZm9yICVkIGJ5dGVzIGF0IGluZGV4ICVkLlxuIiwKKwkJCQlyeF9yaW5nLT5zYnFfYnVmX3NpemUsIGkpOworCQkJZ290byBtZW1fZXJyOworCQl9CisJCXNrYl9yZXNlcnZlKHNrYiwgUUxHRV9TQl9QQUQpOworCQlzYnFfZGVzYy0+cC5za2IgPSBza2I7CisJCS8qCisJCSAqIE1hcCBvbmx5IGhhbGYgdGhlIGJ1ZmZlci4gQmVjYXVzZSB0aGUKKwkJICogb3RoZXIgaGFsZiBtYXkgZ2V0IHNvbWUgZGF0YSBjb3BpZWQgdG8gaXQKKwkJICogd2hlbiB0aGUgY29tcGxldGlvbiBhcnJpdmVzLgorCQkgKi8KKwkJbWFwID0gcGNpX21hcF9zaW5nbGUocWRldi0+cGRldiwKKwkJCQkgICAgIHNrYi0+ZGF0YSwKKwkJCQkgICAgIHJ4X3JpbmctPnNicV9idWZfc2l6ZSAvIDIsCisJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHFkZXYtPnBkZXYsIG1hcCkpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiUENJIG1hcHBpbmcgZmFpbGVkLlxuIik7CisJCQlnb3RvIG1lbV9lcnI7CisJCX0KKwkJcGNpX3VubWFwX2FkZHJfc2V0KHNicV9kZXNjLCBtYXBhZGRyLCBtYXApOworCQlwY2lfdW5tYXBfbGVuX3NldChzYnFfZGVzYywgbWFwbGVuLCByeF9yaW5nLT5zYnFfYnVmX3NpemUgLyAyKTsKKwkJYnEtPmFkZHJfbG8gPQkvKnNicV9kZXNjLT5hZGRyX2xvID0gKi8KKwkJICAgIGNwdV90b19sZTMyKG1hcCk7CisJCWJxLT5hZGRyX2hpID0JLypzYnFfZGVzYy0+YWRkcl9oaSA9ICovCisJCSAgICBjcHVfdG9fbGUzMihtYXAgPj4gMzIpOworCQlicSsrOworCX0KKwlyZXR1cm4gMDsKK21lbV9lcnI6CisJcWxfZnJlZV9zYnFfYnVmZmVycyhxZGV2LCByeF9yaW5nKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsCisJCQkJIHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCWlmIChyeF9yaW5nLT5zYnFfbGVuKQorCQlxbF9mcmVlX3NicV9idWZmZXJzKHFkZXYsIHJ4X3JpbmcpOworCWlmIChyeF9yaW5nLT5sYnFfbGVuKQorCQlxbF9mcmVlX2xicV9idWZmZXJzKHFkZXYsIHJ4X3JpbmcpOworCisJLyogRnJlZSB0aGUgc21hbGwgYnVmZmVyIHF1ZXVlLiAqLworCWlmIChyeF9yaW5nLT5zYnFfYmFzZSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHFkZXYtPnBkZXYsCisJCQkJICAgIHJ4X3JpbmctPnNicV9zaXplLAorCQkJCSAgICByeF9yaW5nLT5zYnFfYmFzZSwgcnhfcmluZy0+c2JxX2Jhc2VfZG1hKTsKKwkJcnhfcmluZy0+c2JxX2Jhc2UgPSBOVUxMOworCX0KKworCS8qIEZyZWUgdGhlIHNtYWxsIGJ1ZmZlciBxdWV1ZSBjb250cm9sIGJsb2Nrcy4gKi8KKwlrZnJlZShyeF9yaW5nLT5zYnEpOworCXJ4X3JpbmctPnNicSA9IE5VTEw7CisKKwkvKiBGcmVlIHRoZSBsYXJnZSBidWZmZXIgcXVldWUuICovCisJaWYgKHJ4X3JpbmctPmxicV9iYXNlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgICAgcnhfcmluZy0+bGJxX3NpemUsCisJCQkJICAgIHJ4X3JpbmctPmxicV9iYXNlLCByeF9yaW5nLT5sYnFfYmFzZV9kbWEpOworCQlyeF9yaW5nLT5sYnFfYmFzZSA9IE5VTEw7CisJfQorCisJLyogRnJlZSB0aGUgbGFyZ2UgYnVmZmVyIHF1ZXVlIGNvbnRyb2wgYmxvY2tzLiAqLworCWtmcmVlKHJ4X3JpbmctPmxicSk7CisJcnhfcmluZy0+bGJxID0gTlVMTDsKKworCS8qIEZyZWUgdGhlIHJ4IHF1ZXVlLiAqLworCWlmIChyeF9yaW5nLT5jcV9iYXNlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocWRldi0+cGRldiwKKwkJCQkgICAgcnhfcmluZy0+Y3Ffc2l6ZSwKKwkJCQkgICAgcnhfcmluZy0+Y3FfYmFzZSwgcnhfcmluZy0+Y3FfYmFzZV9kbWEpOworCQlyeF9yaW5nLT5jcV9iYXNlID0gTlVMTDsKKwl9Cit9CisKKy8qIEFsbG9jYXRlIHF1ZXVlcyBhbmQgYnVmZmVycyBmb3IgdGhpcyBjb21wbGV0aW9ucyBxdWV1ZSBiYXNlZAorICogb24gdGhlIHZhbHVlcyBpbiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQgcWxfYWxsb2NfcnhfcmVzb3VyY2VzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LAorCQkJCSBzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZykKK3sKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGNvbXBsZXRpb24gcXVldWUgZm9yIHRoaXMgcnhfcmluZy4KKwkgKi8KKwlyeF9yaW5nLT5jcV9iYXNlID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwgcnhfcmluZy0+Y3Ffc2l6ZSwKKwkJCQkgJnJ4X3JpbmctPmNxX2Jhc2VfZG1hKTsKKworCWlmIChyeF9yaW5nLT5jcV9iYXNlID09IE5VTEwpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJyeF9yaW5nIGFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocnhfcmluZy0+c2JxX2xlbikgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBzbWFsbCBidWZmZXIgcXVldWUuCisJCSAqLworCQlyeF9yaW5nLT5zYnFfYmFzZSA9CisJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChxZGV2LT5wZGV2LCByeF9yaW5nLT5zYnFfc2l6ZSwKKwkJCQkJICZyeF9yaW5nLT5zYnFfYmFzZV9kbWEpOworCisJCWlmIChyeF9yaW5nLT5zYnFfYmFzZSA9PSBOVUxMKSB7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiU21hbGwgYnVmZmVyIHF1ZXVlIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJCQlnb3RvIGVycl9tZW07CisJCX0KKworCQkvKgorCQkgKiBBbGxvY2F0ZSBzbWFsbCBidWZmZXIgcXVldWUgY29udHJvbCBibG9ja3MuCisJCSAqLworCQlyeF9yaW5nLT5zYnEgPQorCQkgICAga21hbGxvYyhyeF9yaW5nLT5zYnFfbGVuICogc2l6ZW9mKHN0cnVjdCBicV9kZXNjKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKHJ4X3JpbmctPnNicSA9PSBOVUxMKSB7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiU21hbGwgYnVmZmVyIHF1ZXVlIGNvbnRyb2wgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gZXJyX21lbTsKKwkJfQorCisJCWlmIChxbF9hbGxvY19zYnFfYnVmZmVycyhxZGV2LCByeF9yaW5nKSkgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJIlNtYWxsIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQkJZ290byBlcnJfbWVtOworCQl9CisJfQorCisJaWYgKHJ4X3JpbmctPmxicV9sZW4pIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgbGFyZ2UgYnVmZmVyIHF1ZXVlLgorCQkgKi8KKwkJcnhfcmluZy0+bGJxX2Jhc2UgPQorCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocWRldi0+cGRldiwgcnhfcmluZy0+bGJxX3NpemUsCisJCQkJCSAmcnhfcmluZy0+bGJxX2Jhc2VfZG1hKTsKKworCQlpZiAocnhfcmluZy0+bGJxX2Jhc2UgPT0gTlVMTCkgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJIkxhcmdlIGJ1ZmZlciBxdWV1ZSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQkJZ290byBlcnJfbWVtOworCQl9CisJCS8qCisJCSAqIEFsbG9jYXRlIGxhcmdlIGJ1ZmZlciBxdWV1ZSBjb250cm9sIGJsb2Nrcy4KKwkJICovCisJCXJ4X3JpbmctPmxicSA9CisJCSAgICBrbWFsbG9jKHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2Rlc2MpLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAocnhfcmluZy0+bGJxID09IE5VTEwpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCSJMYXJnZSBidWZmZXIgcXVldWUgY29udHJvbCBibG9jayBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCQkJZ290byBlcnJfbWVtOworCQl9CisKKwkJLyoKKwkJICogQWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCisJCSAqLworCQlpZiAocWxfYWxsb2NfbGJxX2J1ZmZlcnMocWRldiwgcnhfcmluZykpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCSJMYXJnZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gZXJyX21lbTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJfbWVtOgorCXFsX2ZyZWVfcnhfcmVzb3VyY2VzKHFkZXYsIHJ4X3JpbmcpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBxbF90eF9yaW5nX2NsZWFuKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCXN0cnVjdCB0eF9yaW5nICp0eF9yaW5nOworCXN0cnVjdCB0eF9yaW5nX2Rlc2MgKnR4X3JpbmdfZGVzYzsKKwlpbnQgaSwgajsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIGFsbCBxdWV1ZXMgYW5kIGZyZWUKKwkgKiBhbnkgcmVzb3VyY2VzLgorCSAqLworCWZvciAoaiA9IDA7IGogPCBxZGV2LT50eF9yaW5nX2NvdW50OyBqKyspIHsKKwkJdHhfcmluZyA9ICZxZGV2LT50eF9yaW5nW2pdOworCQlmb3IgKGkgPSAwOyBpIDwgdHhfcmluZy0+d3FfbGVuOyBpKyspIHsKKwkJCXR4X3JpbmdfZGVzYyA9ICZ0eF9yaW5nLT5xW2ldOworCQkJaWYgKHR4X3JpbmdfZGVzYyAmJiB0eF9yaW5nX2Rlc2MtPnNrYikgeworCQkJCVFQUklOVEsocWRldiwgSUZET1dOLCBFUlIsCisJCQkJIkZyZWVpbmcgbG9zdCBTS0IgJXAsIGZyb20gcXVldWUgJWQsIGluZGV4ICVkLlxuIiwKKwkJCQkJdHhfcmluZ19kZXNjLT5za2IsIGosCisJCQkJCXR4X3JpbmdfZGVzYy0+aW5kZXgpOworCQkJCXFsX3VubWFwX3NlbmQocWRldiwgdHhfcmluZ19kZXNjLAorCQkJCQkgICAgICB0eF9yaW5nX2Rlc2MtPm1hcF9jbnQpOworCQkJCWRldl9rZnJlZV9za2IodHhfcmluZ19kZXNjLT5za2IpOworCQkJCXR4X3JpbmdfZGVzYy0+c2tiID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9yaW5nX2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWtmcmVlKHFkZXYtPnJpbmdfbWVtKTsKK30KKworc3RhdGljIGludCBxbF9hbGxvY19yaW5nX2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0eC9yeCByaW5nIGNvbnRyb2wgYmxvY2tzLiAqLworCXFkZXYtPnJpbmdfbWVtX3NpemUgPQorCSAgICAocWRldi0+dHhfcmluZ19jb3VudCAqIHNpemVvZihzdHJ1Y3QgdHhfcmluZykpICsKKwkgICAgKHFkZXYtPnJ4X3JpbmdfY291bnQgKiBzaXplb2Yoc3RydWN0IHJ4X3JpbmcpKTsKKwlxZGV2LT5yaW5nX21lbSA9IGttYWxsb2MocWRldi0+cmluZ19tZW1fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFkZXYtPnJpbmdfbWVtID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIHsKKwkJcWRldi0+cnhfcmluZyA9IHFkZXYtPnJpbmdfbWVtOworCQlxZGV2LT50eF9yaW5nID0gcWRldi0+cmluZ19tZW0gKworCQkgICAgKHFkZXYtPnJ4X3JpbmdfY291bnQgKiBzaXplb2Yoc3RydWN0IHJ4X3JpbmcpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2ZyZWVfbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT50eF9yaW5nX2NvdW50OyBpKyspCisJCXFsX2ZyZWVfdHhfcmVzb3VyY2VzKHFkZXYsICZxZGV2LT50eF9yaW5nW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgcWRldi0+cnhfcmluZ19jb3VudDsgaSsrKQorCQlxbF9mcmVlX3J4X3Jlc291cmNlcyhxZGV2LCAmcWRldi0+cnhfcmluZ1tpXSk7CisJcWxfZnJlZV9zaGFkb3dfc3BhY2UocWRldik7Cit9CisKK3N0YXRpYyBpbnQgcWxfYWxsb2NfbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgaTsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBvdXIgc2hhZG93IHJlZ2lzdGVycyBhbmQgc3VjaC4gKi8KKwlpZiAocWxfYWxsb2Nfc2hhZG93X3NwYWNlKHFkZXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKKwkJaWYgKHFsX2FsbG9jX3J4X3Jlc291cmNlcyhxZGV2LCAmcWRldi0+cnhfcmluZ1tpXSkgIT0gMCkgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJIlJYIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJCQlnb3RvIGVycl9tZW07CisJCX0KKwl9CisJLyogQWxsb2NhdGUgdHggcXVldWUgcmVzb3VyY2VzICovCisJZm9yIChpID0gMDsgaSA8IHFkZXYtPnR4X3JpbmdfY291bnQ7IGkrKykgeworCQlpZiAocWxfYWxsb2NfdHhfcmVzb3VyY2VzKHFkZXYsICZxZGV2LT50eF9yaW5nW2ldKSAhPSAwKSB7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiVFggcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gZXJyX21lbTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworZXJyX21lbToKKwlxbF9mcmVlX21lbV9yZXNvdXJjZXMocWRldik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIFNldCB1cCB0aGUgcnggcmluZyBjb250cm9sIGJsb2NrIGFuZCBwYXNzIGl0IHRvIHRoZSBjaGlwLgorICogVGhlIGNvbnRyb2wgYmxvY2sgaXMgZGVmaW5lZCBhcworICogIkNvbXBsZXRpb24gUXVldWUgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBCbG9jayIsIG9yIGNxaWNiLgorICovCitzdGF0aWMgaW50IHFsX3N0YXJ0X3J4X3Jpbmcoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQoreworCXN0cnVjdCBjcWljYiAqY3FpY2IgPSAmcnhfcmluZy0+Y3FpY2I7CisJdm9pZCAqc2hhZG93X3JlZyA9IHFkZXYtPnJ4X3Jpbmdfc2hhZG93X3JlZ19hcmVhICsKKwkgICAgKHJ4X3JpbmctPmNxX2lkICogc2l6ZW9mKHU2NCkgKiA0KTsKKwl1NjQgc2hhZG93X3JlZ19kbWEgPSBxZGV2LT5yeF9yaW5nX3NoYWRvd19yZWdfZG1hICsKKwkgICAgKHJ4X3JpbmctPmNxX2lkICogc2l6ZW9mKHU2NCkgKiA0KTsKKwl2b2lkIF9faW9tZW0gKmRvb3JiZWxsX2FyZWEgPQorCSAgICBxZGV2LT5kb29yYmVsbF9hcmVhICsgKERCX1BBR0VfU0laRSAqICgxMjggKyByeF9yaW5nLT5jcV9pZCkpOworCWludCBlcnIgPSAwOworCXUxNiBicV9sZW47CisKKwkvKiBTZXQgdXAgdGhlIHNoYWRvdyByZWdpc3RlcnMgZm9yIHRoaXMgcmluZy4gKi8KKwlyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcgPSBzaGFkb3dfcmVnOworCXJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZ19kbWEgPSBzaGFkb3dfcmVnX2RtYTsKKwlzaGFkb3dfcmVnICs9IHNpemVvZih1NjQpOworCXNoYWRvd19yZWdfZG1hICs9IHNpemVvZih1NjQpOworCXJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0ID0gc2hhZG93X3JlZzsKKwlyeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdF9kbWEgPSBzaGFkb3dfcmVnX2RtYTsKKwlzaGFkb3dfcmVnICs9IHNpemVvZih1NjQpOworCXNoYWRvd19yZWdfZG1hICs9IHNpemVvZih1NjQpOworCXJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0ID0gc2hhZG93X3JlZzsKKwlyeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEgPSBzaGFkb3dfcmVnX2RtYTsKKworCS8qIFBDSSBkb29yYmVsbCBtZW0gYXJlYSArIDB4MDAgZm9yIGNvbnN1bWVyIGluZGV4IHJlZ2lzdGVyICovCisJcnhfcmluZy0+Y25zbXJfaWR4X2RiX3JlZyA9ICh1MzIgKikgZG9vcmJlbGxfYXJlYTsKKwlyeF9yaW5nLT5jbnNtcl9pZHggPSAwOworCXJ4X3JpbmctPmN1cnJfZW50cnkgPSByeF9yaW5nLT5jcV9iYXNlOworCisJLyogUENJIGRvb3JiZWxsIG1lbSBhcmVhICsgMHgwNCBmb3IgdmFsaWQgcmVnaXN0ZXIgKi8KKwlyeF9yaW5nLT52YWxpZF9kYl9yZWcgPSBkb29yYmVsbF9hcmVhICsgMHgwNDsKKworCS8qIFBDSSBkb29yYmVsbCBtZW0gYXJlYSArIDB4MTggZm9yIGxhcmdlIGJ1ZmZlciBjb25zdW1lciAqLworCXJ4X3JpbmctPmxicV9wcm9kX2lkeF9kYl9yZWcgPSAodTMyICopIChkb29yYmVsbF9hcmVhICsgMHgxOCk7CisKKwkvKiBQQ0kgZG9vcmJlbGwgbWVtIGFyZWEgKyAweDFjICovCisJcnhfcmluZy0+c2JxX3Byb2RfaWR4X2RiX3JlZyA9ICh1MzIgKikgKGRvb3JiZWxsX2FyZWEgKyAweDFjKTsKKworCW1lbXNldCgodm9pZCAqKWNxaWNiLCAwLCBzaXplb2Yoc3RydWN0IGNxaWNiKSk7CisJY3FpY2ItPm1zaXhfdmVjdCA9IHJ4X3JpbmctPmlycTsKKworCWNxaWNiLT5sZW4gPSBjcHVfdG9fbGUxNihyeF9yaW5nLT5jcV9sZW4gfCBMRU5fViB8IExFTl9DUFBfQ09OVCk7CisKKwljcWljYi0+YWRkcl9sbyA9IGNwdV90b19sZTMyKHJ4X3JpbmctPmNxX2Jhc2VfZG1hKTsKKwljcWljYi0+YWRkcl9oaSA9IGNwdV90b19sZTMyKCh1NjQpIHJ4X3JpbmctPmNxX2Jhc2VfZG1hID4+IDMyKTsKKworCWNxaWNiLT5wcm9kX2lkeF9hZGRyX2xvID0gY3B1X3RvX2xlMzIocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnX2RtYSk7CisJY3FpY2ItPnByb2RfaWR4X2FkZHJfaGkgPQorCSAgICBjcHVfdG9fbGUzMigodTY0KSByeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWdfZG1hID4+IDMyKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBjb250cm9sIGJsb2NrIGxvYWQgZmxhZ3MuCisJICovCisJY3FpY2ItPmZsYWdzID0gRkxBR1NfTEMgfAkvKiBMb2FkIHF1ZXVlIGJhc2UgYWRkcmVzcyAqLworCSAgICBGTEFHU19MViB8CQkvKiBMb2FkIE1TSS1YIHZlY3RvciAqLworCSAgICBGTEFHU19MSTsJCS8qIExvYWQgaXJxIGRlbGF5IHZhbHVlcyAqLworCWlmIChyeF9yaW5nLT5sYnFfbGVuKSB7CisJCWNxaWNiLT5mbGFncyB8PSBGTEFHU19MTDsJLyogTG9hZCBsYnEgdmFsdWVzICovCisJCSooKHU2NCAqKSByeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdCkgPSByeF9yaW5nLT5sYnFfYmFzZV9kbWE7CisJCWNxaWNiLT5sYnFfYWRkcl9sbyA9CisJCSAgICBjcHVfdG9fbGUzMihyeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdF9kbWEpOworCQljcWljYi0+bGJxX2FkZHJfaGkgPQorCQkgICAgY3B1X3RvX2xlMzIoKHU2NCkgcnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hID4+IDMyKTsKKwkJY3FpY2ItPmxicV9idWZfc2l6ZSA9IGNwdV90b19sZTMyKHJ4X3JpbmctPmxicV9idWZfc2l6ZSk7CisJCWJxX2xlbiA9ICh1MTYpIHJ4X3JpbmctPmxicV9sZW47CisJCWNxaWNiLT5sYnFfbGVuID0gY3B1X3RvX2xlMTYoYnFfbGVuKTsKKwkJcnhfcmluZy0+bGJxX3Byb2RfaWR4ID0gcnhfcmluZy0+bGJxX2xlbiAtIDE2OworCQlyeF9yaW5nLT5sYnFfY3Vycl9pZHggPSAwOworCQlyeF9yaW5nLT5sYnFfY2xlYW5faWR4ID0gcnhfcmluZy0+bGJxX3Byb2RfaWR4OworCQlyeF9yaW5nLT5sYnFfZnJlZV9jbnQgPSAxNjsKKwl9CisJaWYgKHJ4X3JpbmctPnNicV9sZW4pIHsKKwkJY3FpY2ItPmZsYWdzIHw9IEZMQUdTX0xTOwkvKiBMb2FkIHNicSB2YWx1ZXMgKi8KKwkJKigodTY0ICopIHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0KSA9IHJ4X3JpbmctPnNicV9iYXNlX2RtYTsKKwkJY3FpY2ItPnNicV9hZGRyX2xvID0KKwkJICAgIGNwdV90b19sZTMyKHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSk7CisJCWNxaWNiLT5zYnFfYWRkcl9oaSA9CisJCSAgICBjcHVfdG9fbGUzMigodTY0KSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEgPj4gMzIpOworCQljcWljYi0+c2JxX2J1Zl9zaXplID0KKwkJICAgIGNwdV90b19sZTE2KCgocnhfcmluZy0+c2JxX2J1Zl9zaXplIC8gMikgKyA4KSAmIDB4ZmZmZmZmZjgpOworCQlicV9sZW4gPSAodTE2KSByeF9yaW5nLT5zYnFfbGVuOworCQljcWljYi0+c2JxX2xlbiA9IGNwdV90b19sZTE2KGJxX2xlbik7CisJCXJ4X3JpbmctPnNicV9wcm9kX2lkeCA9IHJ4X3JpbmctPnNicV9sZW4gLSAxNjsKKwkJcnhfcmluZy0+c2JxX2N1cnJfaWR4ID0gMDsKKwkJcnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9IHJ4X3JpbmctPnNicV9wcm9kX2lkeDsKKwkJcnhfcmluZy0+c2JxX2ZyZWVfY250ID0gMTY7CisJfQorCXN3aXRjaCAocnhfcmluZy0+dHlwZSkgeworCWNhc2UgVFhfUToKKwkJLyogSWYgdGhlcmUncyBvbmx5IG9uZSBpbnRlcnJ1cHQsIHRoZW4gd2UgdXNlCisJCSAqIHdvcmtlciB0aHJlYWRzIHRvIHByb2Nlc3MgdGhlIG91dGJvdW5kCisJCSAqIGNvbXBsZXRpb24gaGFuZGxpbmcgcnhfcmluZ3MuIFdlIGRvIHRoaXMgc28KKwkJICogdGhleSBjYW4gYmUgcnVuIG9uIG11bHRpcGxlIENQVXMuIFRoZXJlIGlzCisJCSAqIHJvb20gdG8gcGxheSB3aXRoIHRoaXMgbW9yZSB3aGVyZSB3ZSB3b3VsZCBvbmx5CisJCSAqIHJ1biBpbiBhIHdvcmtlciBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHggbnVtYmVyCisJCSAqIG9mIG91dGJvdW5kIGNvbXBsZXRpb25zIG9uIHRoZSBxdWV1ZSBhbmQgbW9yZQorCQkgKiB0aGFuIG9uZSBxdWV1ZSBhY3RpdmUuICBTb21lIHRocmVzaG9sZCB0aGF0CisJCSAqIHdvdWxkIGluZGljYXRlIGEgYmVuZWZpdCBpbiBzcGl0ZSBvZiB0aGUgY29zdAorCQkgKiBvZiBhIGNvbnRleHQgc3dpdGNoLgorCQkgKiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0LCB0aGVuIHRoZQorCQkgKiBvdXRib3VuZCBjb21wbGV0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBJU1IuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KFFMX01TSVhfRU5BQkxFRCwgJnFkZXYtPmZsYWdzKSkKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZyeF9yaW5nLT5yeF93b3JrLCBxbF90eF9jbGVhbik7CisJCWVsc2UgeworCQkJLyogV2l0aCBhbGwgZGVidWcgd2FybmluZ3Mgb24gd2Ugc2VlIGEgV0FSTl9PTiBtZXNzYWdlCisJCQkgKiB3aGVuIHdlIGZyZWUgdGhlIHNrYiBpbiB0aGUgaW50ZXJydXB0IGNvbnRleHQuCisJCQkgKi8KKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZyeF9yaW5nLT5yeF93b3JrLCBxbF90eF9jbGVhbik7CisJCX0KKwkJY3FpY2ItPmlycV9kZWxheSA9IGNwdV90b19sZTE2KHFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzKTsKKwkJY3FpY2ItPnBrdF9kZWxheSA9IGNwdV90b19sZTE2KHFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwkJYnJlYWs7CisJY2FzZSBERUZBVUxUX1E6CisJCUlOSVRfREVMQVlFRF9XT1JLKCZyeF9yaW5nLT5yeF93b3JrLCBxbF9yeF9jbGVhbik7CisJCWNxaWNiLT5pcnFfZGVsYXkgPSAwOworCQljcWljYi0+cGt0X2RlbGF5ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSWF9ROgorCQkvKiBJbmJvdW5kIGNvbXBsZXRpb24gaGFuZGxpbmcgcnhfcmluZ3MgcnVuIGluCisJCSAqIHNlcGFyYXRlIE5BUEkgY29udGV4dHMuCisJCSAqLworCQluZXRpZl9uYXBpX2FkZChxZGV2LT5uZGV2LCAmcnhfcmluZy0+bmFwaSwgcWxfbmFwaV9wb2xsX21zaXgsCisJCQkgICAgICAgNjQpOworCQljcWljYi0+aXJxX2RlbGF5ID0gY3B1X3RvX2xlMTYocWRldi0+cnhfY29hbGVzY2VfdXNlY3MpOworCQljcWljYi0+cGt0X2RlbGF5ID0gY3B1X3RvX2xlMTYocWRldi0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlRUFJJTlRLKHFkZXYsIElGVVAsIERFQlVHLCAiSW52YWxpZCByeF9yaW5nLT50eXBlID0gJWQuXG4iLAorCQkJcnhfcmluZy0+dHlwZSk7CisJfQorCVFQUklOVEsocWRldiwgSUZVUCwgSU5GTywgIkluaXRpYWxpemluZyByeCB3b3JrIHF1ZXVlLlxuIik7CisJZXJyID0gcWxfd3JpdGVfY2ZnKHFkZXYsIGNxaWNiLCBzaXplb2Yoc3RydWN0IGNxaWNiKSwKKwkJCSAgIENGR19MQ1EsIHJ4X3JpbmctPmNxX2lkKTsKKwlpZiAoZXJyKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIGxvYWQgQ1FJQ0IuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJUVBSSU5USyhxZGV2LCBJRlVQLCBJTkZPLCAiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBDUUlDQi5cbiIpOworCS8qCisJICogQWR2YW5jZSB0aGUgcHJvZHVjZXIgaW5kZXggZm9yIHRoZSBidWZmZXIgcXVldWVzLgorCSAqLworCXdtYigpOworCWlmIChyeF9yaW5nLT5sYnFfbGVuKQorCQlxbF93cml0ZV9kYl9yZWcocnhfcmluZy0+bGJxX3Byb2RfaWR4LAorCQkJCXJ4X3JpbmctPmxicV9wcm9kX2lkeF9kYl9yZWcpOworCWlmIChyeF9yaW5nLT5zYnFfbGVuKQorCQlxbF93cml0ZV9kYl9yZWcocnhfcmluZy0+c2JxX3Byb2RfaWR4LAorCQkJCXJ4X3JpbmctPnNicV9wcm9kX2lkeF9kYl9yZWcpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcWxfc3RhcnRfdHhfcmluZyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgc3RydWN0IHR4X3JpbmcgKnR4X3JpbmcpCit7CisJc3RydWN0IHdxaWNiICp3cWljYiA9IChzdHJ1Y3Qgd3FpY2IgKil0eF9yaW5nOworCXZvaWQgX19pb21lbSAqZG9vcmJlbGxfYXJlYSA9CisJICAgIHFkZXYtPmRvb3JiZWxsX2FyZWEgKyAoREJfUEFHRV9TSVpFICogdHhfcmluZy0+d3FfaWQpOworCXZvaWQgKnNoYWRvd19yZWcgPSBxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfYXJlYSArCisJICAgICh0eF9yaW5nLT53cV9pZCAqIHNpemVvZih1NjQpKTsKKwl1NjQgc2hhZG93X3JlZ19kbWEgPSBxZGV2LT50eF9yaW5nX3NoYWRvd19yZWdfZG1hICsKKwkgICAgKHR4X3JpbmctPndxX2lkICogc2l6ZW9mKHU2NCkpOworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBBc3NpZ24gZG9vcmJlbGwgcmVnaXN0ZXJzIGZvciB0aGlzIHR4X3JpbmcuCisJICovCisJLyogVFggUENJIGRvb3JiZWxsIG1lbSBhcmVhIGZvciB0eCBwcm9kdWNlciBpbmRleCAqLworCXR4X3JpbmctPnByb2RfaWR4X2RiX3JlZyA9ICh1MzIgKikgZG9vcmJlbGxfYXJlYTsKKwl0eF9yaW5nLT5wcm9kX2lkeCA9IDA7CisJLyogVFggUENJIGRvb3JiZWxsIG1lbSBhcmVhICsgMHgwNCAqLworCXR4X3JpbmctPnZhbGlkX2RiX3JlZyA9IGRvb3JiZWxsX2FyZWEgKyAweDA0OworCisJLyoKKwkgKiBBc3NpZ24gc2hhZG93IHJlZ2lzdGVycyBmb3IgdGhpcyB0eF9yaW5nLgorCSAqLworCXR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWcgPSBzaGFkb3dfcmVnOworCXR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWdfZG1hID0gc2hhZG93X3JlZ19kbWE7CisKKwl3cWljYi0+bGVuID0gY3B1X3RvX2xlMTYodHhfcmluZy0+d3FfbGVuIHwgUV9MRU5fViB8IFFfTEVOX0NQUF9DT05UKTsKKwl3cWljYi0+ZmxhZ3MgPSBjcHVfdG9fbGUxNihRX0ZMQUdTX0xDIHwKKwkJCQkgICBRX0ZMQUdTX0xCIHwgUV9GTEFHU19MSSB8IFFfRkxBR1NfTE8pOworCXdxaWNiLT5jcV9pZF9yc3MgPSBjcHVfdG9fbGUxNih0eF9yaW5nLT5jcV9pZCk7CisJd3FpY2ItPnJpZCA9IDA7CisJd3FpY2ItPmFkZHJfbG8gPSBjcHVfdG9fbGUzMih0eF9yaW5nLT53cV9iYXNlX2RtYSk7CisJd3FpY2ItPmFkZHJfaGkgPSBjcHVfdG9fbGUzMigodTY0KSB0eF9yaW5nLT53cV9iYXNlX2RtYSA+PiAzMik7CisKKwl3cWljYi0+Y25zbXJfaWR4X2FkZHJfbG8gPSBjcHVfdG9fbGUzMih0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnX2RtYSk7CisJd3FpY2ItPmNuc21yX2lkeF9hZGRyX2hpID0KKwkgICAgY3B1X3RvX2xlMzIoKHU2NCkgdHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZ19kbWEgPj4gMzIpOworCisJcWxfaW5pdF90eF9yaW5nKHFkZXYsIHR4X3JpbmcpOworCisJZXJyID0gcWxfd3JpdGVfY2ZnKHFkZXYsIHdxaWNiLCBzaXplb2Yod3FpY2IpLCBDRkdfTFJRLAorCQkJICAgKHUxNikgdHhfcmluZy0+d3FfaWQpOworCWlmIChlcnIpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJGYWlsZWQgdG8gbG9hZCB0eF9yaW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCVFQUklOVEsocWRldiwgSUZVUCwgSU5GTywgIlN1Y2Nlc3NmdWxseSBsb2FkZWQgV1FJQ0IuXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBxbF9kaXNhYmxlX21zaXgoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaWYgKHRlc3RfYml0KFFMX01TSVhfRU5BQkxFRCwgJnFkZXYtPmZsYWdzKSkgeworCQlwY2lfZGlzYWJsZV9tc2l4KHFkZXYtPnBkZXYpOworCQljbGVhcl9iaXQoUUxfTVNJWF9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpOworCQlrZnJlZShxZGV2LT5tc2lfeF9lbnRyeSk7CisJCXFkZXYtPm1zaV94X2VudHJ5ID0gTlVMTDsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpKSB7CisJCXBjaV9kaXNhYmxlX21zaShxZGV2LT5wZGV2KTsKKwkJY2xlYXJfYml0KFFMX01TSV9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfZW5hYmxlX21zaXgoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGk7CisKKwlxZGV2LT5pbnRyX2NvdW50ID0gMTsKKwkvKiBHZXQgdGhlIE1TSVggdmVjdG9ycy4gKi8KKwlpZiAoaXJxX3R5cGUgPT0gTVNJWF9JUlEpIHsKKwkJLyogVHJ5IHRvIGFsbG9jIHNwYWNlIGZvciB0aGUgbXNpeCBzdHJ1Y3QsCisJCSAqIGlmIGl0IGZhaWxzIHRoZW4gZ28gdG8gTVNJL2xlZ2FjeS4KKwkJICovCisJCXFkZXYtPm1zaV94X2VudHJ5ID0ga2NhbGxvYyhxZGV2LT5yeF9yaW5nX2NvdW50LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXFkZXYtPm1zaV94X2VudHJ5KSB7CisJCQlpcnFfdHlwZSA9IE1TSV9JUlE7CisJCQlnb3RvIG1zaTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspCisJCQlxZGV2LT5tc2lfeF9lbnRyeVtpXS5lbnRyeSA9IGk7CisKKwkJaWYgKCFwY2lfZW5hYmxlX21zaXgKKwkJICAgIChxZGV2LT5wZGV2LCBxZGV2LT5tc2lfeF9lbnRyeSwgcWRldi0+cnhfcmluZ19jb3VudCkpIHsKKwkJCXNldF9iaXQoUUxfTVNJWF9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpOworCQkJcWRldi0+aW50cl9jb3VudCA9IHFkZXYtPnJ4X3JpbmdfY291bnQ7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIElORk8sCisJCQkJIk1TSS1YIEVuYWJsZWQsIGdvdCAlZCB2ZWN0b3JzLlxuIiwKKwkJCQlxZGV2LT5pbnRyX2NvdW50KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKHFkZXYtPm1zaV94X2VudHJ5KTsKKwkJCXFkZXYtPm1zaV94X2VudHJ5ID0gTlVMTDsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgV0FSTklORywKKwkJCQkiTVNJLVggRW5hYmxlIGZhaWxlZCwgdHJ5aW5nIE1TSS5cbiIpOworCQkJaXJxX3R5cGUgPSBNU0lfSVJROworCQl9CisJfQorbXNpOgorCWlmIChpcnFfdHlwZSA9PSBNU0lfSVJRKSB7CisJCWlmICghcGNpX2VuYWJsZV9tc2kocWRldi0+cGRldikpIHsKKwkJCXNldF9iaXQoUUxfTVNJX0VOQUJMRUQsICZxZGV2LT5mbGFncyk7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIElORk8sCisJCQkJIlJ1bm5pbmcgd2l0aCBNU0kgaW50ZXJydXB0cy5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlycV90eXBlID0gTEVHX0lSUTsKKwlzcGluX2xvY2tfaW5pdCgmcWRldi0+bGVnYWN5X2xvY2spOworCXFkZXYtPmxlZ2FjeV9jaGVjayA9IHFsX2xlZ2FjeV9jaGVjazsKKwlRUFJJTlRLKHFkZXYsIElGVVAsIERFQlVHLCAiUnVubmluZyB3aXRoIGxlZ2FjeSBpbnRlcnJ1cHRzLlxuIik7Cit9CisKKy8qCisgKiBIZXJlIHdlIGJ1aWxkIHRoZSBpbnRyX2NvbnRleHQgc3RydWN0dXJlcyBiYXNlZCBvbgorICogb3VyIHJ4X3JpbmcgY291bnQgYW5kIGludHIgdmVjdG9yIGNvdW50LgorICogVGhlIGludHJfY29udGV4dCBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob29rIGVhY2ggdmVjdG9yCisgKiB0byBwb3NzaWJseSBkaWZmZXJlbnQgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHFsX3Jlc29sdmVfcXVldWVzX3RvX2lycXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBpbnRyX2NvbnRleHQgKmludHJfY29udGV4dCA9ICZxZGV2LT5pbnRyX2NvbnRleHRbMF07CisKKwlxbF9lbmFibGVfbXNpeChxZGV2KTsKKworCWlmIChsaWtlbHkodGVzdF9iaXQoUUxfTVNJWF9FTkFCTEVELCAmcWRldi0+ZmxhZ3MpKSkgeworCQkvKiBFYWNoIHJ4X3JpbmcgaGFzIGl0J3MKKwkJICogb3duIGludHJfY29udGV4dCBzaW5jZSB3ZSBoYXZlIHNlcGFyYXRlCisJCSAqIHZlY3RvcnMgZm9yIGVhY2ggcXVldWUuCisJCSAqIFRoaXMgb25seSB0cnVlIHdoZW4gTVNJLVggaXMgZW5hYmxlZC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5pbnRyX2NvdW50OyBpKyssIGludHJfY29udGV4dCsrKSB7CisJCQlxZGV2LT5yeF9yaW5nW2ldLmlycSA9IGk7CisJCQlpbnRyX2NvbnRleHQtPmludHIgPSBpOworCQkJaW50cl9jb250ZXh0LT5xZGV2ID0gcWRldjsKKwkJCS8qCisJCQkgKiBXZSBzZXQgdXAgZWFjaCB2ZWN0b3JzIGVuYWJsZS9kaXNhYmxlL3JlYWQgYml0cyBzbworCQkJICogdGhlcmUncyBubyBiaXQvbWFzayBjYWxjdWxhdGlvbnMgaW4gdGhlIGNyaXRpY2FsIHBhdGguCisJCQkgKi8KKwkJCWludHJfY29udGV4dC0+aW50cl9lbl9tYXNrID0KKwkJCSAgICBJTlRSX0VOX1RZUEVfTUFTSyB8IElOVFJfRU5fSU5UUl9NQVNLIHwKKwkJCSAgICBJTlRSX0VOX1RZUEVfRU5BQkxFIHwgSU5UUl9FTl9JSERfTUFTSyB8IElOVFJfRU5fSUhECisJCQkgICAgfCBpOworCQkJaW50cl9jb250ZXh0LT5pbnRyX2Rpc19tYXNrID0KKwkJCSAgICBJTlRSX0VOX1RZUEVfTUFTSyB8IElOVFJfRU5fSU5UUl9NQVNLIHwKKwkJCSAgICBJTlRSX0VOX1RZUEVfRElTQUJMRSB8IElOVFJfRU5fSUhEX01BU0sgfAorCQkJICAgIElOVFJfRU5fSUhEIHwgaTsKKwkJCWludHJfY29udGV4dC0+aW50cl9yZWFkX21hc2sgPQorCQkJICAgIElOVFJfRU5fVFlQRV9NQVNLIHwgSU5UUl9FTl9JTlRSX01BU0sgfAorCQkJICAgIElOVFJfRU5fVFlQRV9SRUFEIHwgSU5UUl9FTl9JSERfTUFTSyB8IElOVFJfRU5fSUhEIHwKKwkJCSAgICBpOworCisJCQlpZiAoaSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBEZWZhdWx0IHF1ZXVlIGhhbmRsZXMgYmNhc3QvbWNhc3QgcGx1cworCQkJCSAqIGFzeW5jIGV2ZW50cy4gIE5lZWRzIGJ1ZmZlcnMuCisJCQkJICovCisJCQkJaW50cl9jb250ZXh0LT5oYW5kbGVyID0gcWxnZV9pc3I7CisJCQkJc3ByaW50ZihpbnRyX2NvbnRleHQtPm5hbWUsICIlcy1kZWZhdWx0LXF1ZXVlIiwKKwkJCQkJcWRldi0+bmRldi0+bmFtZSk7CisJCQl9IGVsc2UgaWYgKGkgPCBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZCkgeworCQkJCS8qCisJCQkJICogT3V0Ym91bmQgcXVldWUgaXMgZm9yIG91dGJvdW5kIGNvbXBsZXRpb25zIG9ubHkuCisJCQkJICovCisJCQkJaW50cl9jb250ZXh0LT5oYW5kbGVyID0gcWxnZV9tc2l4X3R4X2lzcjsKKwkJCQlzcHJpbnRmKGludHJfY29udGV4dC0+bmFtZSwgIiVzLXR4cS0lZCIsCisJCQkJCXFkZXYtPm5kZXYtPm5hbWUsIGkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIEluYm91bmQgcXVldWVzIGhhbmRsZSB1bmljYXN0IGZyYW1lcyBvbmx5LgorCQkJCSAqLworCQkJCWludHJfY29udGV4dC0+aGFuZGxlciA9IHFsZ2VfbXNpeF9yeF9pc3I7CisJCQkJc3ByaW50ZihpbnRyX2NvbnRleHQtPm5hbWUsICIlcy1yeHEtJWQiLAorCQkJCQlxZGV2LT5uZGV2LT5uYW1lLCBpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbCByeF9yaW5ncyB1c2UgdGhlIHNhbWUgaW50cl9jb250ZXh0IHNpbmNlCisJCSAqIHRoZXJlIGlzIG9ubHkgb25lIHZlY3Rvci4KKwkJICovCisJCWludHJfY29udGV4dC0+aW50ciA9IDA7CisJCWludHJfY29udGV4dC0+cWRldiA9IHFkZXY7CisJCS8qCisJCSAqIFdlIHNldCB1cCBlYWNoIHZlY3RvcnMgZW5hYmxlL2Rpc2FibGUvcmVhZCBiaXRzIHNvCisJCSAqIHRoZXJlJ3Mgbm8gYml0L21hc2sgY2FsY3VsYXRpb25zIGluIHRoZSBjcml0aWNhbCBwYXRoLgorCQkgKi8KKwkJaW50cl9jb250ZXh0LT5pbnRyX2VuX21hc2sgPQorCQkgICAgSU5UUl9FTl9UWVBFX01BU0sgfCBJTlRSX0VOX0lOVFJfTUFTSyB8IElOVFJfRU5fVFlQRV9FTkFCTEU7CisJCWludHJfY29udGV4dC0+aW50cl9kaXNfbWFzayA9CisJCSAgICBJTlRSX0VOX1RZUEVfTUFTSyB8IElOVFJfRU5fSU5UUl9NQVNLIHwKKwkJICAgIElOVFJfRU5fVFlQRV9ESVNBQkxFOworCQlpbnRyX2NvbnRleHQtPmludHJfcmVhZF9tYXNrID0KKwkJICAgIElOVFJfRU5fVFlQRV9NQVNLIHwgSU5UUl9FTl9JTlRSX01BU0sgfCBJTlRSX0VOX1RZUEVfUkVBRDsKKwkJLyoKKwkJICogU2luZ2xlIGludGVycnVwdCBtZWFucyBvbmUgaGFuZGxlciBmb3IgYWxsIHJpbmdzLgorCQkgKi8KKwkJaW50cl9jb250ZXh0LT5oYW5kbGVyID0gcWxnZV9pc3I7CisJCXNwcmludGYoaW50cl9jb250ZXh0LT5uYW1lLCAiJXMtc2luZ2xlX2lycSIsIHFkZXYtPm5kZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgcWRldi0+cnhfcmluZ19jb3VudDsgaSsrKQorCQkJcWRldi0+cnhfcmluZ1tpXS5pcnEgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcWxfZnJlZV9pcnEoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGludHJfY29udGV4dCAqaW50cl9jb250ZXh0ID0gJnFkZXYtPmludHJfY29udGV4dFswXTsKKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5pbnRyX2NvdW50OyBpKyssIGludHJfY29udGV4dCsrKSB7CisJCWlmIChpbnRyX2NvbnRleHQtPmhvb2tlZCkgeworCQkJaWYgKHRlc3RfYml0KFFMX01TSVhfRU5BQkxFRCwgJnFkZXYtPmZsYWdzKSkgeworCQkJCWZyZWVfaXJxKHFkZXYtPm1zaV94X2VudHJ5W2ldLnZlY3RvciwKKwkJCQkJICZxZGV2LT5yeF9yaW5nW2ldKTsKKwkJCQlRUFJJTlRLKHFkZXYsIElGRE9XTiwgRVJSLAorCQkJCQkiZnJlZWluZyBtc2l4IGludGVycnVwdCAlZC5cbiIsIGkpOworCQkJfSBlbHNlIHsKKwkJCQlmcmVlX2lycShxZGV2LT5wZGV2LT5pcnEsICZxZGV2LT5yeF9yaW5nWzBdKTsKKwkJCQlRUFJJTlRLKHFkZXYsIElGRE9XTiwgRVJSLAorCQkJCQkiZnJlZWluZyBtc2kgaW50ZXJydXB0ICVkLlxuIiwgaSk7CisJCQl9CisJCX0KKwl9CisJcWxfZGlzYWJsZV9tc2l4KHFkZXYpOworfQorCitzdGF0aWMgaW50IHFsX3JlcXVlc3RfaXJxKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCWludCBpOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcWRldi0+cGRldjsKKwlzdHJ1Y3QgaW50cl9jb250ZXh0ICppbnRyX2NvbnRleHQgPSAmcWRldi0+aW50cl9jb250ZXh0WzBdOworCisJcWxfcmVzb2x2ZV9xdWV1ZXNfdG9faXJxcyhxZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5pbnRyX2NvdW50OyBpKyssIGludHJfY29udGV4dCsrKSB7CisJCWF0b21pY19zZXQoJmludHJfY29udGV4dC0+aXJxX2NudCwgMCk7CisJCWlmICh0ZXN0X2JpdChRTF9NU0lYX0VOQUJMRUQsICZxZGV2LT5mbGFncykpIHsKKwkJCXN0YXR1cyA9IHJlcXVlc3RfaXJxKHFkZXYtPm1zaV94X2VudHJ5W2ldLnZlY3RvciwKKwkJCQkJICAgICBpbnRyX2NvbnRleHQtPmhhbmRsZXIsCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBpbnRyX2NvbnRleHQtPm5hbWUsCisJCQkJCSAgICAgJnFkZXYtPnJ4X3JpbmdbaV0pOworCQkJaWYgKHN0YXR1cykgeworCQkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCQkiRmFpbGVkIHJlcXVlc3QgZm9yIE1TSVggaW50ZXJydXB0ICVkLlxuIiwKKwkJCQkJaSk7CisJCQkJZ290byBlcnJfaXJxOworCQkJfSBlbHNlIHsKKwkJCQlRUFJJTlRLKHFkZXYsIElGVVAsIElORk8sCisJCQkJCSJIb29rZWQgaW50ciAlZCwgcXVldWUgdHlwZSAlcyVzJXMsIHdpdGggbmFtZSAlcy5cbiIsCisJCQkJCWksCisJCQkJCXFkZXYtPnJ4X3JpbmdbaV0udHlwZSA9PQorCQkJCQlERUZBVUxUX1EgPyAiREVGQVVMVF9RIiA6ICIiLAorCQkJCQlxZGV2LT5yeF9yaW5nW2ldLnR5cGUgPT0KKwkJCQkJVFhfUSA/ICJUWF9RIiA6ICIiLAorCQkJCQlxZGV2LT5yeF9yaW5nW2ldLnR5cGUgPT0KKwkJCQkJUlhfUSA/ICJSWF9RIiA6ICIiLCBpbnRyX2NvbnRleHQtPm5hbWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBERUJVRywKKwkJCQkidHJ5aW5nIG1zaSBvciBsZWdhY3kgaW50ZXJydXB0cy5cbiIpOworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBERUJVRywKKwkJCQkiJXM6IGlycSA9ICVkLlxuIiwgX19mdW5jX18sIHBkZXYtPmlycSk7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIERFQlVHLAorCQkJCSIlczogY29udGV4dC0+bmFtZSA9ICVzLlxuIiwgX19mdW5jX18sCisJCQkgICAgICAgaW50cl9jb250ZXh0LT5uYW1lKTsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgREVCVUcsCisJCQkJIiVzOiBkZXZfaWQgPSAweCVwLlxuIiwgX19mdW5jX18sCisJCQkgICAgICAgJnFkZXYtPnJ4X3JpbmdbMF0pOworCQkJc3RhdHVzID0KKwkJCSAgICByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHFsZ2VfaXNyLAorCQkJCQl0ZXN0X2JpdChRTF9NU0lfRU5BQkxFRCwKKwkJCQkJCSAmcWRldi0+CisJCQkJCQkgZmxhZ3MpID8gMCA6IElSUUZfU0hBUkVELAorCQkJCQlpbnRyX2NvbnRleHQtPm5hbWUsICZxZGV2LT5yeF9yaW5nWzBdKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBlcnJfaXJxOworCisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiSG9va2VkIGludHIgJWQsIHF1ZXVlIHR5cGUgJXMlcyVzLCB3aXRoIG5hbWUgJXMuXG4iLAorCQkJCWksCisJCQkJcWRldi0+cnhfcmluZ1swXS50eXBlID09CisJCQkJREVGQVVMVF9RID8gIkRFRkFVTFRfUSIgOiAiIiwKKwkJCQlxZGV2LT5yeF9yaW5nWzBdLnR5cGUgPT0gVFhfUSA/ICJUWF9RIiA6ICIiLAorCQkJCXFkZXYtPnJ4X3JpbmdbMF0udHlwZSA9PSBSWF9RID8gIlJYX1EiIDogIiIsCisJCQkJaW50cl9jb250ZXh0LT5uYW1lKTsKKwkJfQorCQlpbnRyX2NvbnRleHQtPmhvb2tlZCA9IDE7CisJfQorCXJldHVybiBzdGF0dXM7CitlcnJfaXJxOgorCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIGdldCB0aGUgaW50ZXJydXB0cyEhIS9uIik7CisJcWxfZnJlZV9pcnEocWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBxbF9zdGFydF9yc3Moc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHJpY2IgKnJpY2IgPSAmcWRldi0+cmljYjsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgaTsKKwl1OCAqaGFzaF9pZCA9ICh1OCAqKSByaWNiLT5oYXNoX2NxX2lkOworCisJbWVtc2V0KCh2b2lkICopcmljYiwgMCwgc2l6ZW9mKHJpY2IpKTsKKworCXJpY2ItPmJhc2VfY3EgPSBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZCB8IFJTU19MNEs7CisJcmljYi0+ZmxhZ3MgPQorCSAgICAoUlNTX0w2SyB8IFJTU19MSSB8IFJTU19MQiB8IFJTU19MTSB8IFJTU19SSTQgfCBSU1NfUkk2IHwgUlNTX1JUNCB8CisJICAgICBSU1NfUlQ2KTsKKwlyaWNiLT5tYXNrID0gY3B1X3RvX2xlMTYocWRldi0+cnNzX3JpbmdfY291bnQgLSAxKTsKKworCS8qCisJICogRmlsbCBvdXQgdGhlIEluZGlyZWN0aW9uIFRhYmxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQloYXNoX2lkW2ldID0gaSAmIDE7CisKKwkvKgorCSAqIFJhbmRvbSB2YWx1ZXMgZm9yIHRoZSBJUHY2IGFuZCBJUHY0IEhhc2ggS2V5cy4KKwkgKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCh2b2lkICopJnJpY2ItPmlwdjZfaGFzaF9rZXlbMF0sIDQwKTsKKwlnZXRfcmFuZG9tX2J5dGVzKCh2b2lkICopJnJpY2ItPmlwdjRfaGFzaF9rZXlbMF0sIDE2KTsKKworCVFQUklOVEsocWRldiwgSUZVUCwgSU5GTywgIkluaXRpYWxpemluZyBSU1MuXG4iKTsKKworCXN0YXR1cyA9IHFsX3dyaXRlX2NmZyhxZGV2LCByaWNiLCBzaXplb2YocmljYiksIENGR19MUiwgMCk7CisJaWYgKHN0YXR1cykgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkZhaWxlZCB0byBsb2FkIFJJQ0IuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJUVBSSU5USyhxZGV2LCBJRlVQLCBJTkZPLCAiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBSSUNCLlxuIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgZnJhbWUtdG8tcXVldWUgcm91dGluZy4gKi8KK3N0YXRpYyBpbnQgcWxfcm91dGVfaW5pdGlhbGl6ZShzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgaTsKKworCS8qIENsZWFyIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgcm91dGluZyB0YWJsZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlzdGF0dXMgPSBxbF9zZXRfcm91dGluZ19yZWcocWRldiwgaSwgMCwgMCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCSJGYWlsZWQgdG8gaW5pdCByb3V0aW5nIHJlZ2lzdGVyIGZvciBDQU0gcGFja2V0cy5cbiIpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXN0YXR1cyA9IHFsX3NldF9yb3V0aW5nX3JlZyhxZGV2LCBSVF9JRFhfQUxMX0VSUl9TTE9ULCBSVF9JRFhfRVJSLCAxKTsKKwlpZiAoc3RhdHVzKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJIkZhaWxlZCB0byBpbml0IHJvdXRpbmcgcmVnaXN0ZXIgZm9yIGVycm9yIHBhY2tldHMuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gcWxfc2V0X3JvdXRpbmdfcmVnKHFkZXYsIFJUX0lEWF9CQ0FTVF9TTE9ULCBSVF9JRFhfQkNBU1QsIDEpOworCWlmIChzdGF0dXMpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkiRmFpbGVkIHRvIGluaXQgcm91dGluZyByZWdpc3RlciBmb3IgYnJvYWRjYXN0IHBhY2tldHMuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogSWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIGluYm91bmQgcXVldWUsIHRoZW4gdHVybiBvbiBSU1MgaW4gdGhlCisJICogcm91dGluZyBibG9jay4KKwkgKi8KKwlpZiAocWRldi0+cnNzX3JpbmdfY291bnQgPiAxKSB7CisJCXN0YXR1cyA9IHFsX3NldF9yb3V0aW5nX3JlZyhxZGV2LCBSVF9JRFhfUlNTX01BVENIX1NMT1QsCisJCQkJCVJUX0lEWF9SU1NfTUFUQ0gsIDEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiRmFpbGVkIHRvIGluaXQgcm91dGluZyByZWdpc3RlciBmb3IgTUFUQ0ggUlNTIHBhY2tldHMuXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBxbF9zZXRfcm91dGluZ19yZWcocWRldiwgUlRfSURYX0NBTV9ISVRfU0xPVCwKKwkJCQkgICAgUlRfSURYX0NBTV9ISVQsIDEpOworCWlmIChzdGF0dXMpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkiRmFpbGVkIHRvIGluaXQgcm91dGluZyByZWdpc3RlciBmb3IgQ0FNIHBhY2tldHMuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBxbF9hZGFwdGVyX2luaXRpYWxpemUoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJdTMyIHZhbHVlLCBtYXNrOworCWludCBpOworCWludCBzdGF0dXMgPSAwOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFN5c3RlbSByZWdpc3RlciB0byBoYWx0IG9uIGVycm9ycy4KKwkgKi8KKwl2YWx1ZSA9IFNZU19FRkUgfCBTWVNfRkFFOworCW1hc2sgPSB2YWx1ZSA8PCAxNjsKKwlxbF93cml0ZTMyKHFkZXYsIFNZUywgbWFzayB8IHZhbHVlKTsKKworCS8qIFNldCB0aGUgZGVmYXVsdCBxdWV1ZS4gKi8KKwl2YWx1ZSA9IE5JQ19SQ1ZfQ0ZHX0RGUTsKKwltYXNrID0gTklDX1JDVl9DRkdfREZRX01BU0s7CisJcWxfd3JpdGUzMihxZGV2LCBOSUNfUkNWX0NGRywgKG1hc2sgfCB2YWx1ZSkpOworCisJLyogU2V0IHRoZSBNUEkgaW50ZXJydXB0IHRvIGVuYWJsZWQuICovCisJcWxfd3JpdGUzMihxZGV2LCBJTlRSX01BU0ssIChJTlRSX01BU0tfUEkgPDwgMTYpIHwgSU5UUl9NQVNLX1BJKTsKKworCS8qIEVuYWJsZSB0aGUgZnVuY3Rpb24sIHNldCBwYWdlc2l6ZSwgZW5hYmxlIGVycm9yIGNoZWNraW5nLiAqLworCXZhbHVlID0gRlNDX0ZFIHwgRlNDX0VQQ19JTkJPVU5EIHwgRlNDX0VQQ19PVVRCT1VORCB8CisJICAgIEZTQ19FQyB8IEZTQ19WTV9QQUdFXzRLIHwgRlNDX1NIOworCisJLyogU2V0L2NsZWFyIGhlYWRlciBzcGxpdHRpbmcuICovCisJbWFzayA9IEZTQ19WTV9QQUdFU0laRV9NQVNLIHwKKwkgICAgRlNDX0RCTF9NQVNLIHwgRlNDX0RCUlNUX01BU0sgfCAodmFsdWUgPDwgMTYpOworCXFsX3dyaXRlMzIocWRldiwgRlNDLCBtYXNrIHwgdmFsdWUpOworCisJcWxfd3JpdGUzMihxZGV2LCBTUExUX0hEUiwgU1BMVF9IRFJfRVAgfAorCQltaW4oU01BTExfQlVGRkVSX1NJWkUsIE1BWF9TUExJVF9TSVpFKSk7CisKKwkvKiBTdGFydCB1cCB0aGUgcnggcXVldWVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKKwkJc3RhdHVzID0gcWxfc3RhcnRfcnhfcmluZyhxZGV2LCAmcWRldi0+cnhfcmluZ1tpXSk7CisJCWlmIChzdGF0dXMpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLAorCQkJCSJGYWlsZWQgdG8gc3RhcnQgcnggcmluZ1slZF0uXG4iLCBpKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGluYm91bmQgY29tcGxldGlvbiBxdWV1ZQorCSAqIHRoZW4gZG93bmxvYWQgYSBSSUNCIHRvIGNvbmZpZ3VyZSBSU1MuCisJICovCisJaWYgKHFkZXYtPnJzc19yaW5nX2NvdW50ID4gMSkgeworCQlzdGF0dXMgPSBxbF9zdGFydF9yc3MocWRldik7CisJCWlmIChzdGF0dXMpIHsKKwkJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIHN0YXJ0IFJTUy5cbiIpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCS8qIFN0YXJ0IHVwIHRoZSB0eCBxdWV1ZXMuICovCisJZm9yIChpID0gMDsgaSA8IHFkZXYtPnR4X3JpbmdfY291bnQ7IGkrKykgeworCQlzdGF0dXMgPSBxbF9zdGFydF90eF9yaW5nKHFkZXYsICZxZGV2LT50eF9yaW5nW2ldKTsKKwkJaWYgKHN0YXR1cykgeworCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkJIkZhaWxlZCB0byBzdGFydCB0eCByaW5nWyVkXS5cbiIsIGkpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0KKworCXN0YXR1cyA9IHFsX3BvcnRfaW5pdGlhbGl6ZShxZGV2KTsKKwlpZiAoc3RhdHVzKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiRmFpbGVkIHRvIHN0YXJ0IHBvcnQuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBxbF9zZXRfbWFjX2FkZHJfcmVnKHFkZXYsICh1OCAqKSBxZGV2LT5uZGV2LT5wZXJtX2FkZHIsCisJCQkJICAgICBNQUNfQUREUl9UWVBFX0NBTV9NQUMsIHFkZXYtPmZ1bmMpOworCWlmIChzdGF0dXMpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJGYWlsZWQgdG8gaW5pdCBtYWMgYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IHFsX3JvdXRlX2luaXRpYWxpemUocWRldik7CisJaWYgKHN0YXR1cykgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkZhaWxlZCB0byBpbml0IHJvdXRpbmcgdGFibGUuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBTdGFydCBOQVBJIGZvciB0aGUgUlNTIHF1ZXVlcy4gKi8KKwlmb3IgKGkgPSBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZDsgaSA8IHFkZXYtPnJ4X3JpbmdfY291bnQ7IGkrKykgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIElORk8sICJFbmFibGluZyBOQVBJIGZvciByeF9yaW5nWyVkXS5cbiIsCisJCQlpKTsKKwkJbmFwaV9lbmFibGUoJnFkZXYtPnJ4X3JpbmdbaV0ubmFwaSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogSXNzdWUgc29mdCByZXNldCB0byBjaGlwLiAqLworc3RhdGljIGludCBxbF9hZGFwdGVyX3Jlc2V0KHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCXUzMiB2YWx1ZTsKKwlpbnQgbWF4X3dhaXRfdGltZTsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgcmVzZXRDbnQgPSAwOworCisjZGVmaW5lIE1BWF9SRVNFVF9DTlQgICAxCitpc3N1ZVJlc2V0OgorCXJlc2V0Q250Kys7CisJUVBSSU5USyhxZGV2LCBJRkRPV04sIERFQlVHLCAiSXNzdWUgc29mdCByZXNldCB0byBjaGlwLlxuIik7CisJcWxfd3JpdGUzMihxZGV2LCBSU1RfRk8sIChSU1RfRk9fRlIgPDwgMTYpIHwgUlNUX0ZPX0ZSKTsKKwkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwltYXhfd2FpdF90aW1lID0gMzsKKwlRUFJJTlRLKHFkZXYsIElGRE9XTiwgREVCVUcsICJXYWl0ICVkIHNlY29uZHMgZm9yIHJlc2V0IHRvIGNvbXBsZXRlLlxuIiwKKwkJbWF4X3dhaXRfdGltZSk7CisJZG8geworCQl2YWx1ZSA9IHFsX3JlYWQzMihxZGV2LCBSU1RfRk8pOworCQlpZiAoKHZhbHVlICYgUlNUX0ZPX0ZSKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3NsZWVwKDEpOworCX0gd2hpbGUgKCgtLW1heF93YWl0X3RpbWUpKTsKKwlpZiAodmFsdWUgJiBSU1RfRk9fRlIpIHsKKwkJUVBSSU5USyhxZGV2LCBJRkRPV04sIEVSUiwKKwkJCSJTdHVjayBpbiBTb2Z0UmVzZXQ6ICBGU0NfU1I6MHglMDh4XG4iLCB2YWx1ZSk7CisJCWlmIChyZXNldENudCA8IE1BWF9SRVNFVF9DTlQpCisJCQlnb3RvIGlzc3VlUmVzZXQ7CisJfQorCWlmIChtYXhfd2FpdF90aW1lID09IDApIHsKKwkJc3RhdHVzID0gLUVUSU1FRE9VVDsKKwkJUVBSSU5USyhxZGV2LCBJRkRPV04sIEVSUiwKKwkJCSJFVElNRU9VVCEhISBlcnJvcmVkIG91dCBvZiByZXNldHRpbmcgdGhlIGNoaXAhXG4iKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBxbF9kaXNwbGF5X2Rldl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbF9hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisKKwlRUFJJTlRLKHFkZXYsIFBST0JFLCBJTkZPLAorCQkiRnVuY3Rpb24gIyVkLCBOSUMgUm9sbCAlZCwgTklDIFJldiA9ICVkLCAiCisJCSJYRyBSb2xsID0gJWQsIFhHIFJldiA9ICVkLlxuIiwKKwkJcWRldi0+ZnVuYywKKwkJcWRldi0+Y2hpcF9yZXZfaWQgJiAweDAwMDAwMDBmLAorCQlxZGV2LT5jaGlwX3Jldl9pZCA+PiA0ICYgMHgwMDAwMDAwZiwKKwkJcWRldi0+Y2hpcF9yZXZfaWQgPj4gOCAmIDB4MDAwMDAwMGYsCisJCXFkZXYtPmNoaXBfcmV2X2lkID4+IDEyICYgMHgwMDAwMDAwZik7CisJUVBSSU5USyhxZGV2LCBQUk9CRSwgSU5GTywKKwkJIk1BQyBhZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQluZGV2LT5kZXZfYWRkclswXSwgbmRldi0+ZGV2X2FkZHJbMV0sCisJCW5kZXYtPmRldl9hZGRyWzJdLCBuZGV2LT5kZXZfYWRkclszXSwgbmRldi0+ZGV2X2FkZHJbNF0sCisJCW5kZXYtPmRldl9hZGRyWzVdKTsKK30KKworc3RhdGljIGludCBxbF9hZGFwdGVyX2Rvd24oc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBxZGV2LT5uZGV2OworCWludCBpLCBzdGF0dXMgPSAwOworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcWRldi0+YXNpY19yZXNldF93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnFkZXYtPm1waV9yZXNldF93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnFkZXYtPm1waV93b3JrKTsKKworCS8qIFRoZSBkZWZhdWx0IHF1ZXVlIGF0IGluZGV4IDAgaXMgYWx3YXlzIHByb2Nlc3NlZCBpbgorCSAqIGEgd29ya3F1ZXVlLgorCSAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcWRldi0+cnhfcmluZ1swXS5yeF93b3JrKTsKKworCS8qIFRoZSByZXN0IG9mIHRoZSByeF9yaW5ncyBhcmUgcHJvY2Vzc2VkIGluCisJICogYSB3b3JrcXVldWUgb25seSBpZiBpdCdzIGEgc2luZ2xlIGludGVycnVwdAorCSAqIGVudmlyb25tZW50IChNU0kvTGVnYWN5KS4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpID4gcWRldi0+cnhfcmluZ19jb3VudDsgaSsrKSB7CisJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKKwkJLyogT25seSB0aGUgUlNTIHJpbmdzIHVzZSBOQVBJIG9uIG11bHRpIGlycQorCQkgKiBlbnZpcm9ubWVudC4gIE91dGJvdW5kIGNvbXBsZXRpb24gcHJvY2Vzc2luZworCQkgKiBpcyBkb25lIGluIGludGVycnVwdCBjb250ZXh0LgorCQkgKi8KKwkJaWYgKGkgPj0gcWRldi0+cnNzX3JpbmdfZmlyc3RfY3FfaWQpIHsKKwkJCW5hcGlfZGlzYWJsZSgmcnhfcmluZy0+bmFwaSk7CisJCX0gZWxzZSB7CisJCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJ4X3JpbmctPnJ4X3dvcmspOworCQl9CisJfQorCisJY2xlYXJfYml0KFFMX0FEQVBURVJfVVAsICZxZGV2LT5mbGFncyk7CisKKwlxbF9kaXNhYmxlX2ludGVycnVwdHMocWRldik7CisKKwlxbF90eF9yaW5nX2NsZWFuKHFkZXYpOworCisJc3Bpbl9sb2NrKCZxZGV2LT5od19sb2NrKTsKKwlzdGF0dXMgPSBxbF9hZGFwdGVyX3Jlc2V0KHFkZXYpOworCWlmIChzdGF0dXMpCisJCVFQUklOVEsocWRldiwgSUZET1dOLCBFUlIsICJyZXNldChmdW5jICMlZCkgRkFJTEVEIVxuIiwKKwkJCXFkZXYtPmZ1bmMpOworCXNwaW5fdW5sb2NrKCZxZGV2LT5od19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHFsX2FkYXB0ZXJfdXAoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOworCWVyciA9IHFsX2FkYXB0ZXJfaW5pdGlhbGl6ZShxZGV2KTsKKwlpZiAoZXJyKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgSU5GTywgIlVuYWJsZSB0byBpbml0aWFsaXplIGFkYXB0ZXIuXG4iKTsKKwkJc3Bpbl91bmxvY2soJnFkZXYtPmh3X2xvY2spOworCQlnb3RvIGVycl9pbml0OworCX0KKwlzcGluX3VubG9jaygmcWRldi0+aHdfbG9jayk7CisJc2V0X2JpdChRTF9BREFQVEVSX1VQLCAmcWRldi0+ZmxhZ3MpOworCXFsX2VuYWJsZV9pbnRlcnJ1cHRzKHFkZXYpOworCXFsX2VuYWJsZV9hbGxfY29tcGxldGlvbl9pbnRlcnJ1cHRzKHFkZXYpOworCWlmICgocWxfcmVhZDMyKHFkZXYsIFNUUykgJiBxZGV2LT5wb3J0X2luaXQpKSB7CisJCW5ldGlmX2NhcnJpZXJfb24ocWRldi0+bmRldik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHFkZXYtPm5kZXYpOworCX0KKworCXJldHVybiAwOworZXJyX2luaXQ6CisJcWxfYWRhcHRlcl9yZXNldChxZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHFsX2N5Y2xlX2FkYXB0ZXIoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHFsX2FkYXB0ZXJfZG93bihxZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gcWxfYWRhcHRlcl91cChxZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIHN0YXR1czsKK2Vycm9yOgorCVFQUklOVEsocWRldiwgSUZVUCwgQUxFUlQsCisJCSJEcml2ZXIgdXAvZG93biBjeWNsZSBmYWlsZWQsIGNsb3NpbmcgZGV2aWNlXG4iKTsKKwlydG5sX2xvY2soKTsKKwlkZXZfY2xvc2UocWRldi0+bmRldik7CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBxbF9yZWxlYXNlX2FkYXB0ZXJfcmVzb3VyY2VzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQoreworCXFsX2ZyZWVfbWVtX3Jlc291cmNlcyhxZGV2KTsKKwlxbF9mcmVlX2lycShxZGV2KTsKK30KKworc3RhdGljIGludCBxbF9nZXRfYWRhcHRlcl9yZXNvdXJjZXMoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAocWxfYWxsb2NfbWVtX3Jlc291cmNlcyhxZGV2KSkgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIlVuYWJsZSB0byAgYWxsb2NhdGUgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdGF0dXMgPSBxbF9yZXF1ZXN0X2lycShxZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycl9pcnE7CisJcmV0dXJuIHN0YXR1czsKK2Vycl9pcnE6CisJcWxfZnJlZV9tZW1fcmVzb3VyY2VzKHFkZXYpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcWxnZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyoKKwkgKiBXYWl0IGZvciBkZXZpY2UgdG8gcmVjb3ZlciBmcm9tIGEgcmVzZXQuCisJICogKFJhcmVseSBoYXBwZW5zLCBidXQgcG9zc2libGUuKQorCSAqLworCXdoaWxlICghdGVzdF9iaXQoUUxfQURBUFRFUl9VUCwgJnFkZXYtPmZsYWdzKSkKKwkJbXNsZWVwKDEpOworCXFsX2FkYXB0ZXJfZG93bihxZGV2KTsKKwlxbF9yZWxlYXNlX2FkYXB0ZXJfcmVzb3VyY2VzKHFkZXYpOworCXFsX2ZyZWVfcmluZ19jYihxZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbF9jb25maWd1cmVfcmluZ3Moc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHJ4X3JpbmcgKnJ4X3Jpbmc7CisJc3RydWN0IHR4X3JpbmcgKnR4X3Jpbmc7CisJaW50IGNwdV9jbnQgPSBudW1fb25saW5lX2NwdXMoKTsKKworCS8qCisJICogRm9yIGVhY2ggcHJvY2Vzc29yIHByZXNlbnQgd2UgYWxsb2NhdGUgb25lCisJICogcnhfcmluZyBmb3Igb3V0Ym91bmQgY29tcGxldGlvbnMsIGFuZCBvbmUKKwkgKiByeF9yaW5nIGZvciBpbmJvdW5kIGNvbXBsZXRpb25zLiAgUGx1cyB0aGVyZSBpcworCSAqIGFsd2F5cyB0aGUgb25lIGRlZmF1bHQgcXVldWUuICBGb3IgdGhlIENQVQorCSAqIGNvdW50cyB3ZSBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nIHJ4X3JpbmdzOgorCSAqIHJ4X3JpbmcgY291bnQgPQorCSAqICBvbmUgZGVmYXVsdCBxdWV1ZSArCisJICogIChDUFUgY291bnQgKiBvdXRib3VuZCBjb21wbGV0aW9uIHJ4X3JpbmcpICsKKwkgKiAgKENQVSBjb3VudCAqIGluYm91bmQgKFJTUykgY29tcGxldGlvbiByeF9yaW5nKQorCSAqIFRvIGtlZXAgaXQgc2ltcGxlIHdlIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YKKwkgKiBxdWV1ZXMgdG8gPCAzMiwgc28gd2UgdHJ1bmNhdGUgQ1BVIHRvIDguCisJICogVGhpcyBsaW1pdGF0aW9uIGNhbiBiZSByZW1vdmVkIHdoZW4gcmVxdWVzdGVkLgorCSAqLworCisJaWYgKGNwdV9jbnQgPiA4KQorCQljcHVfY250ID0gODsKKworCS8qCisJICogcnhfcmluZ1swXSBpcyBhbHdheXMgdGhlIGRlZmF1bHQgcXVldWUuCisJICovCisJLyogQWxsb2NhdGUgb3V0Ym91bmQgY29tcGxldGlvbiByaW5nIGZvciBlYWNoIENQVS4gKi8KKwlxZGV2LT50eF9yaW5nX2NvdW50ID0gY3B1X2NudDsKKwkvKiBBbGxvY2F0ZSBpbmJvdW5kIGNvbXBsZXRpb24gKFJTUykgcmluZyBmb3IgZWFjaCBDUFUuICovCisJcWRldi0+cnNzX3JpbmdfY291bnQgPSBjcHVfY250OworCS8qIGNxX2lkIGZvciB0aGUgZmlyc3QgaW5ib3VuZCByaW5nIGhhbmRsZXIuICovCisJcWRldi0+cnNzX3JpbmdfZmlyc3RfY3FfaWQgPSBjcHVfY250ICsgMTsKKwkvKgorCSAqIHFkZXYtPnJ4X3JpbmdfY291bnQ6CisJICogVG90YWwgbnVtYmVyIG9mIHJ4X3JpbmdzLiAgVGhpcyBpbmNsdWRlcyB0aGUgb25lCisJICogZGVmYXVsdCBxdWV1ZSwgYSBudW1iZXIgb2Ygb3V0Ym91bmQgY29tcGxldGlvbgorCSAqIGhhbmRsZXIgcnhfcmluZ3MsIGFuZCB0aGUgbnVtYmVyIG9mIGluYm91bmQKKwkgKiBjb21wbGV0aW9uIGhhbmRsZXIgcnhfcmluZ3MuCisJICovCisJcWRldi0+cnhfcmluZ19jb3VudCA9IHFkZXYtPnR4X3JpbmdfY291bnQgKyBxZGV2LT5yc3NfcmluZ19jb3VudCArIDE7CisKKwlpZiAocWxfYWxsb2NfcmluZ19jYihxZGV2KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcWRldi0+dHhfcmluZ19jb3VudDsgaSsrKSB7CisJCXR4X3JpbmcgPSAmcWRldi0+dHhfcmluZ1tpXTsKKwkJbWVtc2V0KCh2b2lkICopdHhfcmluZywgMCwgc2l6ZW9mKHR4X3JpbmcpKTsKKwkJdHhfcmluZy0+cWRldiA9IHFkZXY7CisJCXR4X3JpbmctPndxX2lkID0gaTsKKwkJdHhfcmluZy0+d3FfbGVuID0gcWRldi0+dHhfcmluZ19zaXplOworCQl0eF9yaW5nLT53cV9zaXplID0KKwkJICAgIHR4X3JpbmctPndxX2xlbiAqIHNpemVvZihzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxKTsKKworCQkvKgorCQkgKiBUaGUgY29tcGxldGlvbiBxdWV1ZSBJRCBmb3IgdGhlIHR4IHJpbmdzIHN0YXJ0CisJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkZWZhdWx0IFEgSUQsIHdoaWNoIGlzIHplcm8uCisJCSAqLworCQl0eF9yaW5nLT5jcV9pZCA9IGkgKyAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKKwkJcnhfcmluZyA9ICZxZGV2LT5yeF9yaW5nW2ldOworCQltZW1zZXQoKHZvaWQgKilyeF9yaW5nLCAwLCBzaXplb2YocnhfcmluZykpOworCQlyeF9yaW5nLT5xZGV2ID0gcWRldjsKKwkJcnhfcmluZy0+Y3FfaWQgPSBpOworCQlyeF9yaW5nLT5jcHUgPSBpICUgY3B1X2NudDsJLyogQ1BVIHRvIHJ1biBoYW5kbGVyIG9uLiAqLworCQlpZiAoaSA9PSAwKSB7CS8qIERlZmF1bHQgcXVldWUgYXQgaW5kZXggMC4gKi8KKwkJCS8qCisJCQkgKiBEZWZhdWx0IHF1ZXVlIGhhbmRsZXMgYmNhc3QvbWNhc3QgcGx1cworCQkJICogYXN5bmMgZXZlbnRzLiAgTmVlZHMgYnVmZmVycy4KKwkJCSAqLworCQkJcnhfcmluZy0+Y3FfbGVuID0gcWRldi0+cnhfcmluZ19zaXplOworCQkJcnhfcmluZy0+Y3Ffc2l6ZSA9CisJCQkgICAgcnhfcmluZy0+Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBxbF9uZXRfcnNwX2lvY2IpOworCQkJcnhfcmluZy0+bGJxX2xlbiA9IE5VTV9MQVJHRV9CVUZGRVJTOworCQkJcnhfcmluZy0+bGJxX3NpemUgPQorCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJcnhfcmluZy0+bGJxX2J1Zl9zaXplID0gTEFSR0VfQlVGRkVSX1NJWkU7CisJCQlyeF9yaW5nLT5zYnFfbGVuID0gTlVNX1NNQUxMX0JVRkZFUlM7CisJCQlyeF9yaW5nLT5zYnFfc2l6ZSA9CisJCQkgICAgcnhfcmluZy0+c2JxX2xlbiAqIHNpemVvZihzdHJ1Y3QgYnFfZWxlbWVudCk7CisJCQlyeF9yaW5nLT5zYnFfYnVmX3NpemUgPSBTTUFMTF9CVUZGRVJfU0laRSAqIDI7CisJCQlyeF9yaW5nLT50eXBlID0gREVGQVVMVF9ROworCQl9IGVsc2UgaWYgKGkgPCBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZCkgeworCQkJLyoKKwkJCSAqIE91dGJvdW5kIHF1ZXVlIGhhbmRsZXMgb3V0Ym91bmQgY29tcGxldGlvbnMgb25seS4KKwkJCSAqLworCQkJLyogb3V0Ym91bmQgY3EgaXMgc2FtZSBzaXplIGFzIHR4X3JpbmcgaXQgc2VydmljZXMuICovCisJCQlyeF9yaW5nLT5jcV9sZW4gPSBxZGV2LT50eF9yaW5nX3NpemU7CisJCQlyeF9yaW5nLT5jcV9zaXplID0KKwkJCSAgICByeF9yaW5nLT5jcV9sZW4gKiBzaXplb2Yoc3RydWN0IHFsX25ldF9yc3BfaW9jYik7CisJCQlyeF9yaW5nLT5sYnFfbGVuID0gMDsKKwkJCXJ4X3JpbmctPmxicV9zaXplID0gMDsKKwkJCXJ4X3JpbmctPmxicV9idWZfc2l6ZSA9IDA7CisJCQlyeF9yaW5nLT5zYnFfbGVuID0gMDsKKwkJCXJ4X3JpbmctPnNicV9zaXplID0gMDsKKwkJCXJ4X3JpbmctPnNicV9idWZfc2l6ZSA9IDA7CisJCQlyeF9yaW5nLT50eXBlID0gVFhfUTsKKwkJfSBlbHNlIHsJLyogSW5ib3VuZCBjb21wbGV0aW9ucyAoUlNTKSBxdWV1ZXMgKi8KKwkJCS8qCisJCQkgKiBJbmJvdW5kIHF1ZXVlcyBoYW5kbGUgdW5pY2FzdCBmcmFtZXMgb25seS4KKwkJCSAqLworCQkJcnhfcmluZy0+Y3FfbGVuID0gcWRldi0+cnhfcmluZ19zaXplOworCQkJcnhfcmluZy0+Y3Ffc2l6ZSA9CisJCQkgICAgcnhfcmluZy0+Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBxbF9uZXRfcnNwX2lvY2IpOworCQkJcnhfcmluZy0+bGJxX2xlbiA9IE5VTV9MQVJHRV9CVUZGRVJTOworCQkJcnhfcmluZy0+bGJxX3NpemUgPQorCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJcnhfcmluZy0+bGJxX2J1Zl9zaXplID0gTEFSR0VfQlVGRkVSX1NJWkU7CisJCQlyeF9yaW5nLT5zYnFfbGVuID0gTlVNX1NNQUxMX0JVRkZFUlM7CisJCQlyeF9yaW5nLT5zYnFfc2l6ZSA9CisJCQkgICAgcnhfcmluZy0+c2JxX2xlbiAqIHNpemVvZihzdHJ1Y3QgYnFfZWxlbWVudCk7CisJCQlyeF9yaW5nLT5zYnFfYnVmX3NpemUgPSBTTUFMTF9CVUZGRVJfU0laRSAqIDI7CisJCQlyeF9yaW5nLT50eXBlID0gUlhfUTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbGdlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWVyciA9IHFsX2NvbmZpZ3VyZV9yaW5ncyhxZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcWxfZ2V0X2FkYXB0ZXJfcmVzb3VyY2VzKHFkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfdXA7CisKKwllcnIgPSBxbF9hZGFwdGVyX3VwKHFkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfdXA7CisKKwlyZXR1cm4gZXJyOworCitlcnJvcl91cDoKKwlxbF9yZWxlYXNlX2FkYXB0ZXJfcmVzb3VyY2VzKHFkZXYpOworCXFsX2ZyZWVfcmluZ19jYihxZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHFsZ2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmIChuZGV2LT5tdHUgPT0gMTUwMCAmJiBuZXdfbXR1ID09IDkwMDApIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJDaGFuZ2luZyB0byBqdW1ibyBNVFUuXG4iKTsKKwl9IGVsc2UgaWYgKG5kZXYtPm10dSA9PSA5MDAwICYmIG5ld19tdHUgPT0gMTUwMCkgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkNoYW5naW5nIHRvIG5vcm1hbCBNVFUuXG4iKTsKKwl9IGVsc2UgaWYgKChuZGV2LT5tdHUgPT0gMTUwMCAmJiBuZXdfbXR1ID09IDE1MDApIHx8CisJCSAgIChuZGV2LT5tdHUgPT0gOTAwMCAmJiBuZXdfbXR1ID09IDkwMDApKSB7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnFsZ2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCSAgICAgICAqbmRldikKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXJldHVybiAmcWRldi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHFsZ2Vfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbF9hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJaW50IGk7CisKKwlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOworCS8qCisJICogU2V0IG9yIGNsZWFyIHByb21pc2N1b3VzIG1vZGUgaWYgYQorCSAqIHRyYW5zaXRpb24gaXMgdGFraW5nIHBsYWNlLgorCSAqLworCWlmIChuZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWlmICghdGVzdF9iaXQoUUxfUFJPTUlTQ1VPVVMsICZxZGV2LT5mbGFncykpIHsKKwkJCWlmIChxbF9zZXRfcm91dGluZ19yZWcKKwkJCSAgICAocWRldiwgUlRfSURYX1BST01JU0NVT1VTX1NMT1QsIFJUX0lEWF9WQUxJRCwgMSkpIHsKKwkJCQlRUFJJTlRLKHFkZXYsIEhXLCBFUlIsCisJCQkJCSJGYWlsZWQgdG8gc2V0IHByb21pc2NvdXMgbW9kZS5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfYml0KFFMX1BST01JU0NVT1VTLCAmcWRldi0+ZmxhZ3MpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KFFMX1BST01JU0NVT1VTLCAmcWRldi0+ZmxhZ3MpKSB7CisJCQlpZiAocWxfc2V0X3JvdXRpbmdfcmVnCisJCQkgICAgKHFkZXYsIFJUX0lEWF9QUk9NSVNDVU9VU19TTE9ULCBSVF9JRFhfVkFMSUQsIDApKSB7CisJCQkJUVBSSU5USyhxZGV2LCBIVywgRVJSLAorCQkJCQkiRmFpbGVkIHRvIGNsZWFyIHByb21pc2NvdXMgbW9kZS5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9iaXQoUUxfUFJPTUlTQ1VPVVMsICZxZGV2LT5mbGFncyk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCBvciBjbGVhciBhbGwgbXVsdGljYXN0IG1vZGUgaWYgYQorCSAqIHRyYW5zaXRpb24gaXMgdGFraW5nIHBsYWNlLgorCSAqLworCWlmICgobmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgIChuZGV2LT5tY19jb3VudCA+IE1BWF9NVUxUSUNBU1RfRU5UUklFUykpIHsKKwkJaWYgKCF0ZXN0X2JpdChRTF9BTExNVUxUSSwgJnFkZXYtPmZsYWdzKSkgeworCQkJaWYgKHFsX3NldF9yb3V0aW5nX3JlZworCQkJICAgIChxZGV2LCBSVF9JRFhfQUxMTVVMVElfU0xPVCwgUlRfSURYX01DQVNULCAxKSkgeworCQkJCVFQUklOVEsocWRldiwgSFcsIEVSUiwKKwkJCQkJIkZhaWxlZCB0byBzZXQgYWxsLW11bHRpIG1vZGUuXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2JpdChRTF9BTExNVUxUSSwgJnFkZXYtPmZsYWdzKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmICh0ZXN0X2JpdChRTF9BTExNVUxUSSwgJnFkZXYtPmZsYWdzKSkgeworCQkJaWYgKHFsX3NldF9yb3V0aW5nX3JlZworCQkJICAgIChxZGV2LCBSVF9JRFhfQUxMTVVMVElfU0xPVCwgUlRfSURYX01DQVNULCAwKSkgeworCQkJCVFQUklOVEsocWRldiwgSFcsIEVSUiwKKwkJCQkJIkZhaWxlZCB0byBjbGVhciBhbGwtbXVsdGkgbW9kZS5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9iaXQoUUxfQUxMTVVMVEksICZxZGV2LT5mbGFncyk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobmRldi0+bWNfY291bnQpIHsKKwkJZm9yIChpID0gMCwgbWNfcHRyID0gbmRldi0+bWNfbGlzdDsgbWNfcHRyOworCQkgICAgIGkrKywgbWNfcHRyID0gbWNfcHRyLT5uZXh0KQorCQkJaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcocWRldiwgKHU4ICopIG1jX3B0ci0+ZG1pX2FkZHIsCisJCQkJCQlNQUNfQUREUl9UWVBFX01VTFRJX01BQywgaSkpIHsKKwkJCQlRUFJJTlRLKHFkZXYsIEhXLCBFUlIsCisJCQkJCSJGYWlsZWQgdG8gbG9hZG11bHRpY2FzdCBhZGRyZXNzLlxuIik7CisJCQkJZ290byBleGl0OworCQkJfQorCQlpZiAocWxfc2V0X3JvdXRpbmdfcmVnCisJCSAgICAocWRldiwgUlRfSURYX01DQVNUX01BVENIX1NMT1QsIFJUX0lEWF9NQ0FTVF9NQVRDSCwgMSkpIHsKKwkJCVFQUklOVEsocWRldiwgSFcsIEVSUiwKKwkJCQkiRmFpbGVkIHRvIHNldCBtdWx0aWNhc3QgbWF0Y2ggbW9kZS5cbiIpOworCQl9IGVsc2UgeworCQkJc2V0X2JpdChRTF9BTExNVUxUSSwgJnFkZXYtPmZsYWdzKTsKKwkJfQorCX0KK2V4aXQ6CisJc3Bpbl91bmxvY2soJnFkZXYtPmh3X2xvY2spOworfQorCitzdGF0aWMgaW50IHFsZ2Vfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gKHN0cnVjdCBxbF9hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2soJnFkZXYtPmh3X2xvY2spOworCWlmIChxbF9zZXRfbWFjX2FkZHJfcmVnKHFkZXYsICh1OCAqKSBuZGV2LT5kZXZfYWRkciwKKwkJCU1BQ19BRERSX1RZUEVfQ0FNX01BQywgcWRldi0+ZnVuYykpIHsvKiBVbmljYXN0ICovCisJCVFQUklOVEsocWRldiwgSFcsIEVSUiwgIkZhaWxlZCB0byBsb2FkIE1BQyBhZGRyZXNzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3Bpbl91bmxvY2soJnFkZXYtPmh3X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFsZ2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IChzdHJ1Y3QgcWxfYWRhcHRlciAqKW5ldGRldl9wcml2KG5kZXYpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhxZGV2LT53b3JrcXVldWUsICZxZGV2LT5hc2ljX3Jlc2V0X3dvcmssIDApOworfQorCitzdGF0aWMgdm9pZCBxbF9hc2ljX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbF9hZGFwdGVyLCBhc2ljX3Jlc2V0X3dvcmsud29yayk7CisJcWxfY3ljbGVfYWRhcHRlcihxZGV2KTsKK30KKworc3RhdGljIHZvaWQgcWxfZ2V0X2JvYXJkX2luZm8oc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYpCit7CisJcWRldi0+ZnVuYyA9CisJICAgIChxbF9yZWFkMzIocWRldiwgU1RTKSAmIFNUU19GVU5DX0lEX01BU0spID4+IFNUU19GVU5DX0lEX1NISUZUOworCWlmIChxZGV2LT5mdW5jKSB7CisJCXFkZXYtPnhnX3NlbV9tYXNrID0gU0VNX1hHTUFDMV9NQVNLOworCQlxZGV2LT5wb3J0X2xpbmtfdXAgPSBTVFNfUEwxOworCQlxZGV2LT5wb3J0X2luaXQgPSBTVFNfUEkxOworCQlxZGV2LT5tYWlsYm94X2luID0gUFJPQ19BRERSX01QSV9SSVNDIHwgUFJPQ19BRERSX0ZVTkMyX01CSTsKKwkJcWRldi0+bWFpbGJveF9vdXQgPSBQUk9DX0FERFJfTVBJX1JJU0MgfCBQUk9DX0FERFJfRlVOQzJfTUJPOworCX0gZWxzZSB7CisJCXFkZXYtPnhnX3NlbV9tYXNrID0gU0VNX1hHTUFDMF9NQVNLOworCQlxZGV2LT5wb3J0X2xpbmtfdXAgPSBTVFNfUEwwOworCQlxZGV2LT5wb3J0X2luaXQgPSBTVFNfUEkwOworCQlxZGV2LT5tYWlsYm94X2luID0gUFJPQ19BRERSX01QSV9SSVNDIHwgUFJPQ19BRERSX0ZVTkMwX01CSTsKKwkJcWRldi0+bWFpbGJveF9vdXQgPSBQUk9DX0FERFJfTVBJX1JJU0MgfCBQUk9DX0FERFJfRlVOQzBfTUJPOworCX0KKwlxZGV2LT5jaGlwX3Jldl9pZCA9IHFsX3JlYWQzMihxZGV2LCBSRVZfSUQpOworfQorCitzdGF0aWMgdm9pZCBxbF9yZWxlYXNlX2FsbChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKHFkZXYtPndvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShxZGV2LT53b3JrcXVldWUpOworCQlxZGV2LT53b3JrcXVldWUgPSBOVUxMOworCX0KKwlpZiAocWRldi0+cV93b3JrcXVldWUpIHsKKwkJZGVzdHJveV93b3JrcXVldWUocWRldi0+cV93b3JrcXVldWUpOworCQlxZGV2LT5xX3dvcmtxdWV1ZSA9IE5VTEw7CisJfQorCWlmIChxZGV2LT5yZWdfYmFzZSkKKwkJaW91bm1hcCgodm9pZCAqKXFkZXYtPnJlZ19iYXNlKTsKKwlpZiAocWRldi0+ZG9vcmJlbGxfYXJlYSkKKwkJaW91bm1hcChxZGV2LT5kb29yYmVsbF9hcmVhKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcWxfaW5pdF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgY2FyZHNfZm91bmQpCit7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcG9zLCBlcnIgPSAwOworCXUxNiB2YWwxNjsKKworCW1lbXNldCgodm9pZCAqKXFkZXYsIDAsIHNpemVvZihxZGV2KSk7CisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQQ0kgZGV2aWNlIGVuYWJsZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpZiAocG9zIDw9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCBQRlggIkNhbm5vdCBmaW5kIFBDSSBFeHByZXNzIGNhcGFiaWxpdHksICIKKwkJCSJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9ERVZDVEwsICZ2YWwxNik7CisJCXZhbDE2ICY9IH5QQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOOworCQl2YWwxNiB8PSAoUENJX0VYUF9ERVZDVExfQ0VSRSB8CisJCQkgIFBDSV9FWFBfREVWQ1RMX05GRVJFIHwKKwkJCSAgUENJX0VYUF9ERVZDVExfRkVSRSB8IFBDSV9FWFBfREVWQ1RMX1VSUkUpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9ERVZDVEwsIHZhbDE2KTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBDSSByZWdpb24gcmVxdWVzdCBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJc2V0X2JpdChRTF9ETUE2NCwgJnFkZXYtPmZsYWdzKTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKCFlcnIpCisJCSAgICAgICBlcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLlxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmRldik7CisJcWRldi0+cmVnX2Jhc2UgPQorCSAgICBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCWlmICghcWRldi0+cmVnX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVnaXN0ZXIgbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXFkZXYtPmRvb3JiZWxsX2FyZWFfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyk7CisJcWRldi0+ZG9vcmJlbGxfYXJlYSA9CisJICAgIGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksCisJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7CisJaWYgKCFxZGV2LT5kb29yYmVsbF9hcmVhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkRvb3JiZWxsIHJlZ2lzdGVyIG1hcHBpbmcgZmFpbGVkLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlxbF9nZXRfYm9hcmRfaW5mbyhxZGV2KTsKKwlxZGV2LT5uZGV2ID0gbmRldjsKKwlxZGV2LT5wZGV2ID0gcGRldjsKKwlxZGV2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIGRlZmF1bHRfbXNnKTsKKwlzcGluX2xvY2tfaW5pdCgmcWRldi0+aHdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnFkZXYtPnN0YXRzX2xvY2spOworCisJLyogbWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLworCWVyciA9IHFsX2dldF9mbGFzaF9wYXJhbXMocWRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIEZMQVNILlxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocWRldi0+Zmxhc2gubWFjX2FkZHIpKQorCQlnb3RvIGVycl9vdXQ7CisKKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIHFkZXYtPmZsYXNoLm1hY19hZGRyLCBuZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KG5kZXYtPnBlcm1fYWRkciwgbmRldi0+ZGV2X2FkZHIsIG5kZXYtPmFkZHJfbGVuKTsKKworCS8qIFNldCB1cCB0aGUgZGVmYXVsdCByaW5nIHNpemVzLiAqLworCXFkZXYtPnR4X3Jpbmdfc2l6ZSA9IE5VTV9UWF9SSU5HX0VOVFJJRVM7CisJcWRldi0+cnhfcmluZ19zaXplID0gTlVNX1JYX1JJTkdfRU5UUklFUzsKKworCS8qIFNldCB1cCB0aGUgY29hbGVzY2luZyBwYXJhbWV0ZXJzLiAqLworCXFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzID0gREZMVF9DT0FMRVNDRV9XQUlUOworCXFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzID0gREZMVF9DT0FMRVNDRV9XQUlUOworCXFkZXYtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gREZMVF9JTlRFUl9GUkFNRV9XQUlUOworCXFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gREZMVF9JTlRFUl9GUkFNRV9XQUlUOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIG9wZXJhdGluZyBwYXJhbWV0ZXJzLgorCSAqLworCXFkZXYtPnJ4X2NzdW0gPSAxOworCisJcWRldi0+cV93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKG5kZXYtPm5hbWUpOworCXFkZXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG5kZXYtPm5hbWUpOworCUlOSVRfREVMQVlFRF9XT1JLKCZxZGV2LT5hc2ljX3Jlc2V0X3dvcmssIHFsX2FzaWNfcmVzZXRfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPm1waV9yZXNldF93b3JrLCBxbF9tcGlfcmVzZXRfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPm1waV93b3JrLCBxbF9tcGlfd29yayk7CisKKwlpZiAoIWNhcmRzX2ZvdW5kKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlc1xuIiwgRFJWX1NUUklORyk7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEcml2ZXIgbmFtZTogJXMsIFZlcnNpb246ICVzLlxuIiwKKwkJCSBEUlZfTkFNRSwgRFJWX1ZFUlNJT04pOworCX0KKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJcWxfcmVsZWFzZV9hbGwocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHFsZ2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9lbnRyeSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBOVUxMOworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCWludCBlcnIgPSAwOworCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcWxfYWRhcHRlcikpOworCWlmICghbmRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBxbF9pbml0X2RldmljZShwZGV2LCBuZGV2LCBjYXJkc19mb3VuZCk7CisJaWYgKGVyciA8IDApIHsKKwkJZnJlZV9uZXRkZXYobmRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCW5kZXYtPmZlYXR1cmVzID0gKDAKKwkJCSAgfCBORVRJRl9GX0lQX0NTVU0KKwkJCSAgfCBORVRJRl9GX1NHCisJCQkgIHwgTkVUSUZfRl9UU08KKwkJCSAgfCBORVRJRl9GX1RTTzYKKwkJCSAgfCBORVRJRl9GX1RTT19FQ04KKwkJCSAgfCBORVRJRl9GX0hXX1ZMQU5fVFgKKwkJCSAgfCBORVRJRl9GX0hXX1ZMQU5fUlggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKTsKKworCWlmICh0ZXN0X2JpdChRTF9ETUE2NCwgJnFkZXYtPmZsYWdzKSkKKwkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJLyoKKwkgKiBTZXQgdXAgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisJICovCisJbmRldi0+dHhfcXVldWVfbGVuID0gcWRldi0+dHhfcmluZ19zaXplOworCW5kZXYtPmlycSA9IHBkZXYtPmlycTsKKwluZGV2LT5vcGVuID0gcWxnZV9vcGVuOworCW5kZXYtPnN0b3AgPSBxbGdlX2Nsb3NlOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHFsZ2Vfc2VuZDsKKwlTRVRfRVRIVE9PTF9PUFMobmRldiwgJnFsZ2VfZXRodG9vbF9vcHMpOworCW5kZXYtPmNoYW5nZV9tdHUgPSBxbGdlX2NoYW5nZV9tdHU7CisJbmRldi0+Z2V0X3N0YXRzID0gcWxnZV9nZXRfc3RhdHM7CisJbmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWxnZV9zZXRfbXVsdGljYXN0X2xpc3Q7CisJbmRldi0+c2V0X21hY19hZGRyZXNzID0gcWxnZV9zZXRfbWFjX2FkZHJlc3M7CisJbmRldi0+dHhfdGltZW91dCA9IHFsZ2VfdHhfdGltZW91dDsKKwluZGV2LT53YXRjaGRvZ190aW1lbyA9IDEwICogSFo7CisJbmRldi0+dmxhbl9yeF9yZWdpc3RlciA9IHFsX3ZsYW5fcnhfcmVnaXN0ZXI7CisJbmRldi0+dmxhbl9yeF9hZGRfdmlkID0gcWxfdmxhbl9yeF9hZGRfdmlkOworCW5kZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBxbF92bGFuX3J4X2tpbGxfdmlkOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5ldCBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOworCQlxbF9yZWxlYXNlX2FsbChwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCXFsX2Rpc3BsYXlfZGV2X2luZm8obmRldik7CisJY2FyZHNfZm91bmQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHFsZ2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCXFsX3JlbGVhc2VfYWxsKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihuZGV2KTsKK30KKworLyoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHdoZW5ldmVyCisgKiBhIFBDSSBidXMgZXJyb3IgaXMgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IHFsZ2VfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgICAgICBlbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkKKwkJcWxfYWRhcHRlcl9kb3duKHFkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJLyogUmVxdWVzdCBhIHNsb3QgcmVzZXQuICovCisJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7Cit9CisKKy8qCisgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciB0aGUgUENJIGJ1c3MgaGFzIGJlZW4gcmVzZXQuCisgKiBCYXNpY2FsbHksIHRoaXMgdHJpZXMgdG8gcmVzdGFydCB0aGUgY2FyZCBmcm9tIHNjcmF0Y2guCisgKiBUaGlzIGlzIGEgc2hvcnRlbmVkIHZlcnNpb24gb2YgdGhlIGRldmljZSBwcm9iZS9kaXNjb3ZlcnkgY29kZSwKKyAqIGl0IHJlc2VtYmxlcyB0aGUgZmlyc3QtaGFsZiBvZiB0aGUgKCkgcm91dGluZS4KKyAqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcWxnZV9pb19zbG90X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsCisJCQkiQ2Fubm90IHJlLWVuYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHJlc2V0LlxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwlxbF9hZGFwdGVyX3Jlc2V0KHFkZXYpOworCisJLyogTWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLworCW1lbWNweShuZGV2LT5wZXJtX2FkZHIsIG5kZXYtPmRldl9hZGRyLCBuZGV2LT5hZGRyX2xlbik7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmRldi0+cGVybV9hZGRyKSkgeworCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgIkFmdGVyIHJlc2V0LCBpbnZhbGlkIE1BQyBhZGRyZXNzLlxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHFsZ2VfaW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCWlmIChxbF9hZGFwdGVyX3VwKHFkZXYpKSB7CisJCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwKKwkJCQkiRGV2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCBhZnRlciByZXNldC5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgcWxnZV9lcnJfaGFuZGxlciA9IHsKKwkuZXJyb3JfZGV0ZWN0ZWQgPSBxbGdlX2lvX2Vycm9yX2RldGVjdGVkLAorCS5zbG90X3Jlc2V0ID0gcWxnZV9pb19zbG90X3Jlc2V0LAorCS5yZXN1bWUgPSBxbGdlX2lvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgcWxnZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgZXJyOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCWVyciA9IHFsX2FkYXB0ZXJfZG93bihxZGV2KTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHFsZ2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IGVycjsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCVFQUklOVEsocWRldiwgSUZVUCwgRVJSLCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGZyb20gc3VzcGVuZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJZXJyID0gcWxfYWRhcHRlcl91cChxZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgdm9pZCBxbGdlX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXFsZ2Vfc3VzcGVuZChwZGV2LCBQTVNHX1NVU1BFTkQpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcWxnZV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBxbGdlX3BjaV90YmwsCisJLnByb2JlID0gcWxnZV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocWxnZV9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gcWxnZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBxbGdlX3Jlc3VtZSwKKyNlbmRpZgorCS5zaHV0ZG93biA9IHFsZ2Vfc2h1dGRvd24sCisJLmVycl9oYW5kbGVyID0gJnFsZ2VfZXJyX2hhbmRsZXIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHFsZ2VfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcWxnZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcWxnZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxbGdlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHFsZ2VfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocWxnZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tcGkuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGZlMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21waS5jCkBAIC0wLDAgKzEsMTUwIEBACisjaW5jbHVkZSAicWxnZS5oIgorCitzdGF0aWMgaW50IHFsX3JlYWRfbWJveF9yZWcoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiByZWcsIHUzMiAqZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCS8qIHdhaXQgZm9yIHJlZyB0byBjb21lIHJlYWR5ICovCisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsIFBST0NfQUREUiwgUFJPQ19BRERSX1JEWSwgUFJPQ19BRERSX0VSUik7CisJaWYgKHN0YXR1cykKKwkJZ290byBleGl0OworCS8qIHNldCB1cCBmb3IgcmVnIHJlYWQgKi8KKwlxbF93cml0ZTMyKHFkZXYsIFBST0NfQUREUiwgcmVnIHwgUFJPQ19BRERSX1IpOworCS8qIHdhaXQgZm9yIHJlZyB0byBjb21lIHJlYWR5ICovCisJc3RhdHVzID0gcWxfd2FpdF9yZWdfcmR5KHFkZXYsIFBST0NfQUREUiwgUFJPQ19BRERSX1JEWSwgUFJPQ19BRERSX0VSUik7CisJaWYgKHN0YXR1cykKKwkJZ290byBleGl0OworCS8qIGdldCB0aGUgZGF0YSAqLworCSpkYXRhID0gcWxfcmVhZDMyKHFkZXYsIFBST0NfREFUQSk7CitleGl0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbF9nZXRfbWJfc3RzKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBzdHJ1Y3QgbWJveF9wYXJhbXMgKm1iY3ApCit7CisJaW50IGksIHN0YXR1czsKKworCXN0YXR1cyA9IHFsX3NlbV9zcGlubG9jayhxZGV2LCBTRU1fUFJPQ19SRUdfTUFTSyk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIC1FQlVTWTsKKwlmb3IgKGkgPSAwOyBpIDwgbWJjcC0+b3V0X2NvdW50OyBpKyspIHsKKwkJc3RhdHVzID0KKwkJICAgIHFsX3JlYWRfbWJveF9yZWcocWRldiwgcWRldi0+bWFpbGJveF9vdXQgKyBpLAorCQkJCSAgICAgJm1iY3AtPm1ib3hfb3V0W2ldKTsKKwkJaWYgKHN0YXR1cykgeworCQkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwgIkZhaWxlZCBtYWlsYm94IHJlYWQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXFsX3NlbV91bmxvY2socWRldiwgU0VNX1BST0NfUkVHX01BU0spOwkvKiBkb2VzIGZsdXNoIHRvbyAqLworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2xpbmtfdXAoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHN0cnVjdCBtYm94X3BhcmFtcyAqbWJjcCkKK3sKKwltYmNwLT5vdXRfY291bnQgPSAyOworCisJaWYgKHFsX2dldF9tYl9zdHMocWRldiwgbWJjcCkpCisJCWdvdG8gZXhpdDsKKworCXFkZXYtPmxpbmtfc3RhdHVzID0gbWJjcC0+bWJveF9vdXRbMV07CisJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwgIkxpbmsgVXAuXG4iKTsKKwlRUFJJTlRLKHFkZXYsIERSViwgSU5GTywgIkxpbmsgU3RhdHVzID0gMHglLjA4eC5cbiIsIG1iY3AtPm1ib3hfb3V0WzFdKTsKKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2socWRldi0+bmRldikpIHsKKwkJUVBSSU5USyhxZGV2LCBMSU5LLCBJTkZPLCAiTGluayBpcyBVcC5cbiIpOworCQluZXRpZl9jYXJyaWVyX29uKHFkZXYtPm5kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKHFkZXYtPm5kZXYpOworCX0KK2V4aXQ6CisJLyogQ2xlYXIgdGhlIE1QSSBmaXJtd2FyZSBzdGF0dXMuICovCisJcWxfd3JpdGUzMihxZGV2LCBDU1IsIENTUl9DTURfQ0xSX1IyUENJX0lOVCk7Cit9CisKK3N0YXRpYyB2b2lkIHFsX2xpbmtfZG93bihzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgc3RydWN0IG1ib3hfcGFyYW1zICptYmNwKQoreworCW1iY3AtPm91dF9jb3VudCA9IDM7CisKKwlpZiAocWxfZ2V0X21iX3N0cyhxZGV2LCBtYmNwKSkgeworCQlRUFJJTlRLKHFkZXYsIERSViwgRVJSLCAiRmlybXdhcmUgZGlkIG5vdCBpbml0aWFsaXplIVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhxZGV2LT5uZGV2KSkgeworCQlRUFJJTlRLKHFkZXYsIExJTkssIElORk8sICJMaW5rIGlzIERvd24uXG4iKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYocWRldi0+bmRldik7CisJCW5ldGlmX3N0b3BfcXVldWUocWRldi0+bmRldik7CisJfQorCVFQUklOVEsocWRldiwgRFJWLCBFUlIsICJMaW5rIERvd24uXG4iKTsKKwlRUFJJTlRLKHFkZXYsIERSViwgRVJSLCAiTGluayBTdGF0dXMgPSAweCUuMDh4LlxuIiwgbWJjcC0+bWJveF9vdXRbMV0pOworZXhpdDoKKwkvKiBDbGVhciB0aGUgTVBJIGZpcm13YXJlIHN0YXR1cy4gKi8KKwlxbF93cml0ZTMyKHFkZXYsIENTUiwgQ1NSX0NNRF9DTFJfUjJQQ0lfSU5UKTsKK30KKworc3RhdGljIHZvaWQgcWxfaW5pdF9md19kb25lKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCBzdHJ1Y3QgbWJveF9wYXJhbXMgKm1iY3ApCit7CisJbWJjcC0+b3V0X2NvdW50ID0gMjsKKworCWlmIChxbF9nZXRfbWJfc3RzKHFkZXYsIG1iY3ApKSB7CisJCVFQUklOVEsocWRldiwgRFJWLCBFUlIsICJGaXJtd2FyZSBkaWQgbm90IGluaXRpYWxpemUhXG4iKTsKKwkJZ290byBleGl0OworCX0KKwlRUFJJTlRLKHFkZXYsIERSViwgRVJSLCAiRmlybXdhcmUgaW5pdGlhbGl6ZWQhXG4iKTsKKwlRUFJJTlRLKHFkZXYsIERSViwgRVJSLCAiRmlybXdhcmUgc3RhdHVzID0gMHglLjA4eC5cbiIsCisJCW1iY3AtPm1ib3hfb3V0WzBdKTsKKwlRUFJJTlRLKHFkZXYsIERSViwgRVJSLCAiRmlybXdhcmUgUmV2aXNpb24gID0gMHglLjA4eC5cbiIsCisJCW1iY3AtPm1ib3hfb3V0WzFdKTsKK2V4aXQ6CisJLyogQ2xlYXIgdGhlIE1QSSBmaXJtd2FyZSBzdGF0dXMuICovCisJcWxfd3JpdGUzMihxZGV2LCBDU1IsIENTUl9DTURfQ0xSX1IyUENJX0lOVCk7Cit9CisKK3ZvaWQgcWxfbXBpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbF9hZGFwdGVyLCBtcGlfd29yay53b3JrKTsKKwlzdHJ1Y3QgbWJveF9wYXJhbXMgbWJjOworCXN0cnVjdCBtYm94X3BhcmFtcyAqbWJjcCA9ICZtYmM7CisJbWJjcC0+b3V0X2NvdW50ID0gMTsKKworCXdoaWxlIChxbF9yZWFkMzIocWRldiwgU1RTKSAmIFNUU19QSSkgeworCQlpZiAocWxfZ2V0X21iX3N0cyhxZGV2LCBtYmNwKSkgeworCQkJUVBSSU5USyhxZGV2LCBEUlYsIEVSUiwKKwkJCQkiQ291bGQgbm90IHJlYWQgTVBJLCByZXNldHRpbmcgQVNJQyFcbiIpOworCQkJcWxfcXVldWVfYXNpY19lcnJvcihxZGV2KTsKKwkJfQorCisJCXN3aXRjaCAobWJjcC0+bWJveF9vdXRbMF0pIHsKKwkJY2FzZSBBRU5fTElOS19VUDoKKwkJCXFsX2xpbmtfdXAocWRldiwgbWJjcCk7CisJCQlicmVhazsKKwkJY2FzZSBBRU5fTElOS19ET1dOOgorCQkJcWxfbGlua19kb3duKHFkZXYsIG1iY3ApOworCQkJYnJlYWs7CisJCWNhc2UgQUVOX0ZXX0lOSVRfRE9ORToKKwkJCXFsX2luaXRfZndfZG9uZShxZGV2LCBtYmNwKTsKKwkJCWJyZWFrOworCQljYXNlIE1CX0NNRF9TVFNfR09PRDoKKwkJCWJyZWFrOworCQljYXNlIEFFTl9GV19JTklUX0ZBSUw6CisJCWNhc2UgQUVOX1NZU19FUlI6CisJCWNhc2UgTUJfQ01EX1NUU19FUlI6CisJCQlxbF9xdWV1ZV9md19lcnJvcihxZGV2KTsKKwkJZGVmYXVsdDoKKwkJCS8qIENsZWFyIHRoZSBNUEkgZmlybXdhcmUgc3RhdHVzLiAqLworCQkJcWxfd3JpdGUzMihxZGV2LCBDU1IsIENTUl9DTURfQ0xSX1IyUENJX0lOVCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlxbF9lbmFibGVfY29tcGxldGlvbl9pbnRlcnJ1cHQocWRldiwgMCk7Cit9CisKK3ZvaWQgcWxfbXBpX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbF9hZGFwdGVyLCBtcGlfcmVzZXRfd29yay53b3JrKTsKKwlRUFJJTlRLKHFkZXYsIERSViwgRVJSLAorCQkiRW50ZXIsIHFkZXYgPSAlcC4uXG4iLCBxZGV2KTsKKwlxbF93cml0ZTMyKHFkZXYsIENTUiwgQ1NSX0NNRF9TRVRfUlNUKTsKKwltc2xlZXAoNTApOworCXFsX3dyaXRlMzIocWRldiwgQ1NSLCBDU1JfQ01EX0NMUl9SU1QpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjYwNDAuYyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKaW5kZXggNWQ4NjI4MS4uMzRmZTdlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjYwNDAuYworKysgYi9kcml2ZXJzL25ldC9yNjA0MC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJCQlsZTMyX3RvX2NwdShscC0+dHhfaW5zZXJ0X3B0ci0+YnVmKSwKIAkJCQlNQVhfQlVGX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYihscC0+dHhfaW5zZXJ0X3B0ci0+c2tiX3B0cik7Ci0JCQlscC0+cnhfaW5zZXJ0X3B0ci0+c2tiX3B0ciA9IE5VTEw7CisJCQlscC0+dHhfaW5zZXJ0X3B0ci0+c2tiX3B0ciA9IE5VTEw7CiAJCX0KIAkJbHAtPnR4X2luc2VydF9wdHIgPSBscC0+dHhfaW5zZXJ0X3B0ci0+dm5kZXNjcDsKIAl9CkBAIC0zNzAsNyArMzcwLDcgQEAKIAkvKiBSZXNldCBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lICovCiAJaW93cml0ZTE2KDIsIGlvYWRkciArIE1BQ19TTSk7CiAJaW93cml0ZTE2KDAsIGlvYWRkciArIE1BQ19TTSk7Ci0JdWRlbGF5KDUwMDApOworCW1kZWxheSg1KTsKIAogCS8qIE1BQyBCdXMgQ29udHJvbCBSZWdpc3RlciAqLwogCWlvd3JpdGUxNihNQkNSX0RFRkFVTFQsIGlvYWRkciArIE1CQ1IpOwpAQCAtODA2LDcgKzgwNiw3IEBACiAJaW93cml0ZTE2KDB4MDEsIGlvYWRkciArIE1DUjEpOyAvKiBSZXNldCBNQUMgKi8KIAlpb3dyaXRlMTYoMiwgaW9hZGRyICsgTUFDX1NNKTsgLyogUmVzZXQgaW50ZXJuYWwgc3RhdGUgbWFjaGluZSAqLwogCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBNQUNfU00pOwotCXVkZWxheSg1MDAwKTsKKwltZGVsYXkoNSk7CiAKIAkvKiBSZXN0b3JlIE1BQyBBZGRyZXNzICovCiAJYWRycCA9ICh1MTYgKikgZGV2LT5kZXZfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IDBmNmY5NzQuLmM4MjFkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtMzYsNyArMzYsNyBAQAogI2RlZmluZSBhc3NlcnQoZXhwcikgXAogCWlmICghKGV4cHIpKSB7CQkJCQlcCiAJCXByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsCVwKLQkJI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCVwKKwkJI2V4cHIsX19GSUxFX18sX19mdW5jX18sX19MSU5FX18pOwkJXAogCX0KICNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIFwKIAlkbyB7IHByaW50ayhLRVJOX0RFQlVHIFBGWCBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQpAQCAtNjEsNiArNjEsNyBAQAogLyogTUFDIGFkZHJlc3MgbGVuZ3RoICovCiAjZGVmaW5lIE1BQ19BRERSX0xFTgk2CiAKKyNkZWZpbmUgTUFYX1JFQURfUkVRVUVTVF9TSElGVAkxMgogI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk3CS8qIDcgbWVhbnMgTk8gdGhyZXNob2xkLCBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAqLwogI2RlZmluZSBSWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KICNkZWZpbmUgVFhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCkBAIC05NSw2ICs5NiwxMCBAQAogCVJUTF9HSUdBX01BQ19WRVJfMDQgPSAweDA0LCAvLyA4MTY5U0IKIAlSVExfR0lHQV9NQUNfVkVSXzA1ID0gMHgwNSwgLy8gODExMFNDZAogCVJUTF9HSUdBX01BQ19WRVJfMDYgPSAweDA2LCAvLyA4MTEwU0NlCisJUlRMX0dJR0FfTUFDX1ZFUl8wNyA9IDB4MDcsIC8vIDgxMDJlCisJUlRMX0dJR0FfTUFDX1ZFUl8wOCA9IDB4MDgsIC8vIDgxMDJlCisJUlRMX0dJR0FfTUFDX1ZFUl8wOSA9IDB4MDksIC8vIDgxMDJlCisJUlRMX0dJR0FfTUFDX1ZFUl8xMCA9IDB4MGEsIC8vIDgxMDFlCiAJUlRMX0dJR0FfTUFDX1ZFUl8xMSA9IDB4MGIsIC8vIDgxNjhCYgogCVJUTF9HSUdBX01BQ19WRVJfMTIgPSAweDBjLCAvLyA4MTY4QmUKIAlSVExfR0lHQV9NQUNfVkVSXzEzID0gMHgwZCwgLy8gODEwMUViCkBAIC0xMDQsNyArMTA5LDEyIEBACiAJUlRMX0dJR0FfTUFDX1ZFUl8xNyA9IDB4MTAsIC8vIDgxNjhCZgogCVJUTF9HSUdBX01BQ19WRVJfMTggPSAweDEyLCAvLyA4MTY4Q1AKIAlSVExfR0lHQV9NQUNfVkVSXzE5ID0gMHgxMywgLy8gODE2OEMKLQlSVExfR0lHQV9NQUNfVkVSXzIwID0gMHgxNCAgLy8gODE2OEMKKwlSVExfR0lHQV9NQUNfVkVSXzIwID0gMHgxNCwgLy8gODE2OEMKKwlSVExfR0lHQV9NQUNfVkVSXzIxID0gMHgxNSwgLy8gODE2OEMKKwlSVExfR0lHQV9NQUNfVkVSXzIyID0gMHgxNiwgLy8gODE2OEMKKwlSVExfR0lHQV9NQUNfVkVSXzIzID0gMHgxNywgLy8gODE2OENQCisJUlRMX0dJR0FfTUFDX1ZFUl8yNCA9IDB4MTgsIC8vIDgxNjhDUAorCVJUTF9HSUdBX01BQ19WRVJfMjUgPSAweDE5ICAvLyA4MTY4RAogfTsKIAogI2RlZmluZSBfUihOQU1FLE1BQyxNQVNLKSBcCkBAIC0xMjEsNiArMTMxLDEwIEBACiAJX1IoIlJUTDgxNjlzYi84MTEwc2IiLAlSVExfR0lHQV9NQUNfVkVSXzA0LCAweGZmN2UxODgwKSwgLy8gODE2OVNCCiAJX1IoIlJUTDgxNjlzYy84MTEwc2MiLAlSVExfR0lHQV9NQUNfVkVSXzA1LCAweGZmN2UxODgwKSwgLy8gODExMFNDZAogCV9SKCJSVEw4MTY5c2MvODExMHNjIiwJUlRMX0dJR0FfTUFDX1ZFUl8wNiwgMHhmZjdlMTg4MCksIC8vIDgxMTBTQ2UKKwlfUigiUlRMODEwMmUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8wNywgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxMDJlIiwJCVJUTF9HSUdBX01BQ19WRVJfMDgsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTAyZSIsCQlSVExfR0lHQV9NQUNfVkVSXzA5LCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODEwMWUiLAkJUlRMX0dJR0FfTUFDX1ZFUl8xMCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCiAJX1IoIlJUTDgxNjhiLzgxMTFiIiwJUlRMX0dJR0FfTUFDX1ZFUl8xMSwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCiAJX1IoIlJUTDgxNjhiLzgxMTFiIiwJUlRMX0dJR0FfTUFDX1ZFUl8xMiwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCiAJX1IoIlJUTDgxMDFlIiwJCVJUTF9HSUdBX01BQ19WRVJfMTMsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRSA4MTM5CkBAIC0xMzAsNyArMTQ0LDEyIEBACiAJX1IoIlJUTDgxMDFlIiwJCVJUTF9HSUdBX01BQ19WRVJfMTYsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQogCV9SKCJSVEw4MTY4Y3AvODExMWNwIiwJUlRMX0dJR0FfTUFDX1ZFUl8xOCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCiAJX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8xOSwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCi0JX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8yMCwgMHhmZjdlMTg4MCkgIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8yMCwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8yMSwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhjLzgxMTFjIiwJUlRMX0dJR0FfTUFDX1ZFUl8yMiwgMHhmZjdlMTg4MCksIC8vIFBDSS1FCisJX1IoIlJUTDgxNjhjcC84MTExY3AiLAlSVExfR0lHQV9NQUNfVkVSXzIzLCAweGZmN2UxODgwKSwgLy8gUENJLUUKKwlfUigiUlRMODE2OGNwLzgxMTFjcCIsCVJUTF9HSUdBX01BQ19WRVJfMjQsIDB4ZmY3ZTE4ODApLCAvLyBQQ0ktRQorCV9SKCJSVEw4MTY4ZC84MTExZCIsCVJUTF9HSUdBX01BQ19WRVJfMjUsIDB4ZmY3ZTE4ODApICAvLyBQQ0ktRQogfTsKICN1bmRlZiBfUgogCkBAIC0xOTYsOSArMjE1LDYgQEAKIAlDb25maWc1CQk9IDB4NTYsCiAJTXVsdGlJbnRyCT0gMHg1YywKIAlQSFlBUgkJPSAweDYwLAotCVRCSUNTUgkJPSAweDY0LAotCVRCSV9BTkFSCT0gMHg2OCwKLQlUQklfTFBBUgk9IDB4NmEsCiAJUEhZc3RhdHVzCT0gMHg2YywKIAlSeE1heFNpemUJPSAweGRhLAogCUNQbHVzQ21kCT0gMHhlMCwKQEAgLTIxMiw2ICsyMjgsMzIgQEAKIAlGdW5jRm9yY2VFdmVudAk9IDB4ZmMsCiB9OwogCitlbnVtIHJ0bDgxMTBfcmVnaXN0ZXJzIHsKKwlUQklDU1IJCQk9IDB4NjQsCisJVEJJX0FOQVIJCT0gMHg2OCwKKwlUQklfTFBBUgkJPSAweDZhLAorfTsKKworZW51bSBydGw4MTY4XzgxMDFfcmVnaXN0ZXJzIHsKKwlDU0lEUgkJCT0gMHg2NCwKKwlDU0lBUgkJCT0gMHg2OCwKKyNkZWZpbmUJQ1NJQVJfRkxBRwkJCTB4ODAwMDAwMDAKKyNkZWZpbmUJQ1NJQVJfV1JJVEVfQ01ECQkJMHg4MDAwMDAwMAorI2RlZmluZQlDU0lBUl9CWVRFX0VOQUJMRQkJMHgwZgorI2RlZmluZQlDU0lBUl9CWVRFX0VOQUJMRV9TSElGVAkJMTIKKyNkZWZpbmUJQ1NJQVJfQUREUl9NQVNLCQkJMHgwZmZmCisKKwlFUEhZQVIJCQk9IDB4ODAsCisjZGVmaW5lCUVQSFlBUl9GTEFHCQkJMHg4MDAwMDAwMAorI2RlZmluZQlFUEhZQVJfV1JJVEVfQ01ECQkweDgwMDAwMDAwCisjZGVmaW5lCUVQSFlBUl9SRUdfTUFTSwkJCTB4MWYKKyNkZWZpbmUJRVBIWUFSX1JFR19TSElGVAkJMTYKKyNkZWZpbmUJRVBIWUFSX0RBVEFfTUFTSwkJMHhmZmZmCisJREJHX1JFRwkJCT0gMHhkMSwKKyNkZWZpbmUJRklYX05BS18xCQkJKDEgPDwgNCkKKyNkZWZpbmUJRklYX05BS18yCQkJKDEgPDwgMykKK307CisKIGVudW0gcnRsX3JlZ2lzdGVyX2NvbnRlbnQgewogCS8qIEludGVycnVwdFN0YXR1c0JpdHMgKi8KIAlTWVNFcnIJCT0gMHg4MDAwLApAQCAtMjY1LDcgKzMwNywxMyBAQAogCVR4RE1BU2hpZnQgPSA4LAkvKiBETUEgYnVyc3QgdmFsdWUgKDAtNykgaXMgc2hpZnQgdGhpcyBtYW55IGJpdHMgKi8KIAogCS8qIENvbmZpZzEgcmVnaXN0ZXIgcC4yNCAqLworCUxFRFMxCQk9ICgxIDw8IDcpLAorCUxFRFMwCQk9ICgxIDw8IDYpLAogCU1TSUVuYWJsZQk9ICgxIDw8IDUpLAkvKiBFbmFibGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKi8KKwlTcGVlZF9kb3duCT0gKDEgPDwgNCksCisJTUVNTUFQCQk9ICgxIDw8IDMpLAorCUlPTUFQCQk9ICgxIDw8IDIpLAorCVZQRAkJPSAoMSA8PCAxKSwKIAlQTUVuYWJsZQk9ICgxIDw8IDApLAkvKiBQb3dlciBNYW5hZ2VtZW50IEVuYWJsZSAqLwogCiAJLyogQ29uZmlnMiByZWdpc3RlciBwLiAyNSAqLwpAQCAtMjc1LDYgKzMyMyw3IEBACiAJLyogQ29uZmlnMyByZWdpc3RlciBwLjI1ICovCiAJTWFnaWNQYWNrZXQJPSAoMSA8PCA1KSwJLyogV2FrZSB1cCB3aGVuIHJlY2VpdmVzIGEgTWFnaWMgUGFja2V0ICovCiAJTGlua1VwCQk9ICgxIDw8IDQpLAkvKiBXYWtlIHVwIHdoZW4gdGhlIGNhYmxlIGNvbm5lY3Rpb24gaXMgcmUtZXN0YWJsaXNoZWQgKi8KKwlCZWFjb25fZW4JPSAoMSA8PCAwKSwJLyogODE2OCBvbmx5LiBSZXNlcnZlZCBpbiB0aGUgODE2OGIgKi8KIAogCS8qIENvbmZpZzUgcmVnaXN0ZXIgcC4yNyAqLwogCUJXRgkJPSAoMSA8PCA2KSwJLyogQWNjZXB0IEJyb2FkY2FzdCB3YWtldXAgZnJhbWUgKi8KQEAgLTI5Miw3ICszNDEsMTYgQEAKIAlUQklOd0NvbXBsZXRlCT0gMHgwMTAwMDAwMCwKIAogCS8qIENQbHVzQ21kIHAuMzEgKi8KLQlQa3RDbnRyRGlzYWJsZQk9ICgxIDw8IDcpLAkvLyA4MTY4CisJRW5hYmxlQmlzdAk9ICgxIDw8IDE1KSwJLy8gODE2OCA4MTAxCisJTWFjX2RiZ29fb2UJPSAoMSA8PCAxNCksCS8vIDgxNjggODEwMQorCU5vcm1hbF9tb2RlCT0gKDEgPDwgMTMpLAkvLyB1bnVzZWQKKwlGb3JjZV9oYWxmX2R1cAk9ICgxIDw8IDEyKSwJLy8gODE2OCA4MTAxCisJRm9yY2VfcnhmbG93X2VuCT0gKDEgPDwgMTEpLAkvLyA4MTY4IDgxMDEKKwlGb3JjZV90eGZsb3dfZW4JPSAoMSA8PCAxMCksCS8vIDgxNjggODEwMQorCUN4cGxfZGJnX3NlbAk9ICgxIDw8IDkpLAkvLyA4MTY4IDgxMDEKKwlBU0YJCT0gKDEgPDwgOCksCS8vIDgxNjggODEwMQorCVBrdENudHJEaXNhYmxlCT0gKDEgPDwgNyksCS8vIDgxNjggODEwMQorCU1hY19kYmdvX3NlbAk9IDB4MDAxYywJLy8gODE2OAogCVJ4VmxhbgkJPSAoMSA8PCA2KSwKIAlSeENoa1N1bQk9ICgxIDw8IDUpLAogCVBDSURBQwkJPSAoMSA8PCA0KSwKQEAgLTM3MCw4ICs0MjgsOSBAQAogfTsKIAogZW51bSBmZWF0dXJlcyB7Ci0JUlRMX0ZFQVRVUkVfV09MCT0gKDEgPDwgMCksCi0JUlRMX0ZFQVRVUkVfTVNJCT0gKDEgPDwgMSksCisJUlRMX0ZFQVRVUkVfV09MCQk9ICgxIDw8IDApLAorCVJUTF9GRUFUVVJFX01TSQkJPSAoMSA8PCAxKSwKKwlSVExfRkVBVFVSRV9HTUlJCT0gKDEgPDwgMiksCiB9OwogCiBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlIHsKQEAgLTQwNiwxMyArNDY1LDE2IEBACiAJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOwogI2VuZGlmCiAJaW50ICgqc2V0X3NwZWVkKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1OCBhdXRvbmVnLCB1MTYgc3BlZWQsIHU4IGR1cGxleCk7Ci0Jdm9pZCAoKmdldF9zZXR0aW5ncykoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfY21kICopOworCWludCAoKmdldF9zZXR0aW5ncykoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfY21kICopOwogCXZvaWQgKCpwaHlfcmVzZXRfZW5hYmxlKSh2b2lkIF9faW9tZW0gKik7CiAJdm9pZCAoKmh3X3N0YXJ0KShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAl1bnNpZ25lZCBpbnQgKCpwaHlfcmVzZXRfcGVuZGluZykodm9pZCBfX2lvbWVtICopOwogCXVuc2lnbmVkIGludCAoKmxpbmtfb2spKHZvaWQgX19pb21lbSAqKTsKKwlpbnQgcGNpZV9jYXA7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB0YXNrOwogCXVuc2lnbmVkIGZlYXR1cmVzOworCisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKIH07CiAKIE1PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgYW5kIHRoZSBMaW51eCByODE2OSBjcmV3IDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPiIpOwpAQCAtNDgyLDYgKzU0NCw5NCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIHZvaWQgbWRpb19wYXRjaCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHJlZ19hZGRyLCBpbnQgdmFsdWUpCit7CisJbWRpb193cml0ZShpb2FkZHIsIHJlZ19hZGRyLCBtZGlvX3JlYWQoaW9hZGRyLCByZWdfYWRkcikgfCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJCSAgIGludCB2YWwpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCBsb2NhdGlvbiwgdmFsKTsKK30KKworc3RhdGljIGludCBydGxfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJcmV0dXJuIG1kaW9fcmVhZChpb2FkZHIsIGxvY2F0aW9uKTsKK30KKworc3RhdGljIHZvaWQgcnRsX2VwaHlfd3JpdGUodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWdfYWRkciwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpOworCisJUlRMX1czMihFUEhZQVIsIEVQSFlBUl9XUklURV9DTUQgfCAodmFsdWUgJiBFUEhZQVJfREFUQV9NQVNLKSB8CisJCShyZWdfYWRkciAmIEVQSFlBUl9SRUdfTUFTSykgPDwgRVBIWUFSX1JFR19TSElGVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKCEoUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0ZMQUcpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdTE2IHJ0bF9lcGh5X3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWdfYWRkcikKK3sKKwl1MTYgdmFsdWUgPSAweGZmZmY7CisJdW5zaWduZWQgaW50IGk7CisKKwlSVExfVzMyKEVQSFlBUiwgKHJlZ19hZGRyICYgRVBIWUFSX1JFR19NQVNLKSA8PCBFUEhZQVJfUkVHX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0ZMQUcpIHsKKwkJCXZhbHVlID0gUlRMX1IzMihFUEhZQVIpICYgRVBIWUFSX0RBVEFfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBydGxfY3NpX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgYWRkciwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpOworCisJUlRMX1czMihDU0lEUiwgdmFsdWUpOworCVJUTF9XMzIoQ1NJQVIsIENTSUFSX1dSSVRFX0NNRCB8IChhZGRyICYgQ1NJQVJfQUREUl9NQVNLKSB8CisJCUNTSUFSX0JZVEVfRU5BQkxFIDw8IENTSUFSX0JZVEVfRU5BQkxFX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShSVExfUjMyKENTSUFSKSAmIENTSUFSX0ZMQUcpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdTMyIHJ0bF9jc2lfcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGFkZHIpCit7CisJdTMyIHZhbHVlID0gfjB4MDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlSVExfVzMyKENTSUFSLCAoYWRkciAmIENTSUFSX0FERFJfTUFTSykgfAorCQlDU0lBUl9CWVRFX0VOQUJMRSA8PCBDU0lBUl9CWVRFX0VOQUJMRV9TSElGVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKFJUTF9SMzIoQ1NJQVIpICYgQ1NJQVJfRkxBRykgeworCQkJdmFsdWUgPSBSVExfUjMyKENTSURSKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTY5X2lycV9tYXNrX2FuZF9hY2sodm9pZCBfX2lvbWVtICppb2FkZHIpCiB7CiAJUlRMX1cxNihJbnRyTWFzaywgMHgwMDAwKTsKQEAgLTYxOSw2ICs3NjksNyBAQAogCQl0cC0+ZmVhdHVyZXMgfD0gUlRMX0ZFQVRVUkVfV09MOwogCWVsc2UKIAkJdHAtPmZlYXR1cmVzICY9IH5SVExfRkVBVFVSRV9XT0w7CisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZ0cC0+cGNpX2Rldi0+ZGV2LCB3b2wtPndvbG9wdHMpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CiAKQEAgLTcwNSw4ICs4NTYsMTIgQEAKIAkJfQogCX0KIAotCS8qIFRoZSA4MTAwZS84MTAxZSBkbyBGYXN0IEV0aGVybmV0IG9ubHkuICovCi0JaWYgKCh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgfHwKKwkvKiBUaGUgODEwMGUvODEwMWUvODEwMmUgZG8gRmFzdCBFdGhlcm5ldCBvbmx5LiAqLworCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDcpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wOCkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzA5KSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTApIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgfHwKIAkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE0KSB8fAogCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTUpIHx8CiAJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xNikpIHsKQEAgLTcyMCw5ICs4NzUsMTMgQEAKIAogCWF1dG9fbmVnbyB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07CiAKLQlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzEyKSB8fAotCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTcpKSB7Ci0JCS8qIFZlbmRvciBzcGVjaWZpYyAoMHgxZikgYW5kIHJlc2VydmVkICgweDBlKSBNSUkgcmVnaXN0ZXJzLiAqLworCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMTEpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMikgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA+PSBSVExfR0lHQV9NQUNfVkVSXzE3KSkgeworCQkvKgorCQkgKiBXYWtlIHVwIHRoZSBQSFkuCisJCSAqIFZlbmRvciBzcGVjaWZpYyAoMHgxZikgYW5kIHJlc2VydmVkICgweDBlKSBNSUkgcmVnaXN0ZXJzLgorCQkgKi8KIAkJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7CiAJCW1kaW9fd3JpdGUoaW9hZGRyLCAweDBlLCAweDAwMDApOwogCX0KQEAgLTg1MCw3ICsxMDA5LDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjlfZ3NldF90Ymkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IHJ0bDgxNjlfZ3NldF90Ymkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKQEAgLTg2Nyw2NSArMTAyNiwyOSBAQAogCiAJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CiAJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsgLyogQWx3YXlzIHNldCAqLworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjlfZ3NldF94bWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBydGw4MTY5X2dzZXRfeG1paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7Ci0Jdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwotCXU4IHN0YXR1czsKIAotCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8Ci0JCQkgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8Ci0JCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAotCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJIFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCSBTVVBQT1JURURfVFA7Ci0KLQljbWQtPmF1dG9uZWcgPSAxOwotCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQIHwgQURWRVJUSVNFRF9BdXRvbmVnOwotCi0JaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIEFEVkVSVElTRV8xMEhBTEYpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7Ci0JaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIEFEVkVSVElTRV8xMEZVTEwpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7Ci0JaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIEFEVkVSVElTRV8xMDBIQUxGKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKLQlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgQURWRVJUSVNFXzEwMEZVTEwpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOwotCWlmICh0cC0+cGh5XzEwMDBfY3RybF9yZWcgJiBBRFZFUlRJU0VfMTAwMEZVTEwpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKLQotCXN0YXR1cyA9IFJUTF9SOChQSFlzdGF0dXMpOwotCi0JaWYgKHN0YXR1cyAmIF8xMDAwYnBzRikKLQkJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7Ci0JZWxzZSBpZiAoc3RhdHVzICYgXzEwMGJwcykKLQkJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDsKLQllbHNlIGlmIChzdGF0dXMgJiBfMTBicHMpCi0JCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKLQotCWlmIChzdGF0dXMgJiBUeEZsb3dDdHJsKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKLQlpZiAoc3RhdHVzICYgUnhGbG93Q3RybCkKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOwotCi0JY21kLT5kdXBsZXggPSAoKHN0YXR1cyAmIF8xMDAwYnBzRikgfHwgKHN0YXR1cyAmIEZ1bGxEdXApKSA/Ci0JCSAgICAgIERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJnRwLT5taWksIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgcnRsODE2OV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CiAKLQl0cC0+Z2V0X3NldHRpbmdzKGRldiwgY21kKTsKKwlyYyA9IHRwLT5nZXRfc2V0dGluZ3MoZGV2LCBjbWQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxNjlfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKQEAgLTExMDMsMTEgKzEyMjYsMTkgQEAKIAkJdTMyIHZhbDsKIAkJaW50IG1hY192ZXJzaW9uOwogCX0gbWFjX2luZm9bXSA9IHsKLQkJLyogODE2OEIgZmFtaWx5LiAqLwotCQl7IDB4N2M4MDAwMDAsIDB4M2M4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTggfSwKKwkJLyogODE2OEQgZmFtaWx5LiAqLworCQl7IDB4N2M4MDAwMDAsIDB4MjgwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjUgfSwKKworCQkvKiA4MTY4QyBmYW1pbHkuICovCisJCXsgMHg3Y2YwMDAwMCwgMHgzY2EwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yNCB9LAorCQl7IDB4N2NmMDAwMDAsIDB4M2M5MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjMgfSwKKwkJeyAweDdjZjAwMDAwLCAweDNjODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE4IH0sCisJCXsgMHg3YzgwMDAwMCwgMHgzYzgwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yNCB9LAogCQl7IDB4N2NmMDAwMDAsIDB4M2MwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTkgfSwKIAkJeyAweDdjZjAwMDAwLCAweDNjMjAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzIwIH0sCi0JCXsgMHg3YzgwMDAwMCwgMHgzYzAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yMCB9LAorCQl7IDB4N2NmMDAwMDAsIDB4M2MzMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMjEgfSwKKwkJeyAweDdjZjAwMDAwLCAweDNjNDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzIyIH0sCisJCXsgMHg3YzgwMDAwMCwgMHgzYzAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8yMiB9LAogCiAJCS8qIDgxNjhCIGZhbWlseS4gKi8KIAkJeyAweDdjZjAwMDAwLCAweDM4MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzEyIH0sCkBAIC0xMTE2LDggKzEyNDcsMTcgQEAKIAkJeyAweDdjODAwMDAwLCAweDMwMDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzExIH0sCiAKIAkJLyogODEwMSBmYW1pbHkuICovCisJCXsgMHg3Y2YwMDAwMCwgMHgzNGEwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOSB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MjRhMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDkgfSwKKwkJeyAweDdjZjAwMDAwLCAweDM0OTAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzA4IH0sCisJCXsgMHg3Y2YwMDAwMCwgMHgyNDkwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOCB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MzQ4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDcgfSwKKwkJeyAweDdjZjAwMDAwLCAweDI0ODAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzA3IH0sCiAJCXsgMHg3Y2YwMDAwMCwgMHgzNDAwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8xMyB9LAorCQl7IDB4N2NmMDAwMDAsIDB4MzQzMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTAgfSwKIAkJeyAweDdjZjAwMDAwLCAweDM0MjAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE2IH0sCisJCXsgMHg3YzgwMDAwMCwgMHgzNDgwMDAwMCwJUlRMX0dJR0FfTUFDX1ZFUl8wOSB9LAorCQl7IDB4N2M4MDAwMDAsIDB4MjQ4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMDkgfSwKIAkJeyAweDdjODAwMDAwLCAweDM0MDAwMDAwLAlSVExfR0lHQV9NQUNfVkVSXzE2IH0sCiAJCS8qIEZJWE1FOiB3aGVyZSBkaWQgdGhlc2UgZW50cmllcyBjb21lIGZyb20gPyAtLSBGUiAqLwogCQl7IDB4ZmM4MDAwMDAsIDB4Mzg4MDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfMTUgfSwKQEAgLTEyMjgsNyArMTM2OCwzMSBAQAogCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjhjcF9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQorc3RhdGljIHZvaWQgcnRsODE2OGJiX2h3X3BoeV9jb25maWcodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CisJCXsgMHgxMCwgMHhmNDFiIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTYsIDEgPDwgMCk7CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4YmVmX2h3X3BoeV9jb25maWcodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CisJCXsgMHgxZiwgMHgwMDAxIH0sCisJCXsgMHgxMCwgMHhmNDFiIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXQpKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OGNwXzFfaHdfcGh5X2NvbmZpZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKIHsKIAlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKIAkJeyAweDFmLCAweDAwMDAgfSwKQEAgLTEyNDEsNyArMTQwNSwyMiBAQAogCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjhjX2h3X3BoeV9jb25maWcodm9pZCBfX2lvbWVtICppb2FkZHIpCitzdGF0aWMgdm9pZCBydGw4MTY4Y3BfMl9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0geworCQl7IDB4MWYsIDB4MDAwMSB9LAorCQl7IDB4MWQsIDB4M2Q5OCB9LAorCQl7IDB4MWYsIDB4MDAwMCB9CisJfTsKKworCW1kaW9fd3JpdGUoaW9hZGRyLCAweDFmLCAweDAwMDApOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDE0LCAxIDw8IDUpOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDBkLCAxIDw8IDUpOworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdCwgQVJSQVlfU0laRShwaHlfcmVnX2luaXQpKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OGNfMV9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQogewogCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0gewogCQl7IDB4MWYsIDB4MDAwMSB9LApAQCAtMTI1NywyNiArMTQzNiwxNTggQEAKIAkJeyAweDFmLCAweDAwMDMgfSwKIAkJeyAweDEyLCAweGMwOTYgfSwKIAkJeyAweDE2LCAweDAwMGEgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDFmLCAweDAwMDAgfSwKKwkJeyAweDA5LCAweDIwMDAgfSwKKwkJeyAweDA5LCAweDAwMDAgfQorCX07CisKKwlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTQsIDEgPDwgNSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGQsIDEgPDwgNSk7CisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjhjXzJfaHdfcGh5X2NvbmZpZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlzdHJ1Y3QgcGh5X3JlZyBwaHlfcmVnX2luaXRbXSA9IHsKKwkJeyAweDFmLCAweDAwMDEgfSwKKwkJeyAweDEyLCAweDIzMDAgfSwKKwkJeyAweDAzLCAweDgwMmYgfSwKKwkJeyAweDAyLCAweDRmMDIgfSwKKwkJeyAweDAxLCAweDA0MDkgfSwKKwkJeyAweDAwLCAweGYwOTkgfSwKKwkJeyAweDA0LCAweDk4MDAgfSwKKwkJeyAweDA0LCAweDkwMDAgfSwKKwkJeyAweDFkLCAweDNkOTggfSwKKwkJeyAweDFmLCAweDAwMDIgfSwKKwkJeyAweDBjLCAweDdlYjggfSwKKwkJeyAweDA2LCAweDA3NjEgfSwKKwkJeyAweDFmLCAweDAwMDMgfSwKKwkJeyAweDE2LCAweDBmMGEgfSwKIAkJeyAweDFmLCAweDAwMDAgfQogCX07CiAKIAlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0LCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdCkpOworCisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTYsIDEgPDwgMCk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTQsIDEgPDwgNSk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MGQsIDEgPDwgNSk7CisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjhjeF9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQorc3RhdGljIHZvaWQgcnRsODE2OGNfM19od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQogewogCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdFtdID0gewotCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MWYsIDB4MDAwMSB9LAogCQl7IDB4MTIsIDB4MjMwMCB9LAotCQl7IDB4MWYsIDB4MDAwMyB9LAotCQl7IDB4MTYsIDB4MGYwYSB9LAotCQl7IDB4MWYsIDB4MDAwMCB9LAorCQl7IDB4MWQsIDB4M2Q5OCB9LAogCQl7IDB4MWYsIDB4MDAwMiB9LAogCQl7IDB4MGMsIDB4N2ViOCB9LAorCQl7IDB4MDYsIDB4NTQ2MSB9LAorCQl7IDB4MWYsIDB4MDAwMyB9LAorCQl7IDB4MTYsIDB4MGYwYSB9LAogCQl7IDB4MWYsIDB4MDAwMCB9CiAJfTsKIAogCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CisKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgxNiwgMSA8PCAwKTsKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgxNCwgMSA8PCA1KTsKKwltZGlvX3BhdGNoKGlvYWRkciwgMHgwZCwgMSA8PCA1KTsKKwltZGlvX3dyaXRlKGlvYWRkciwgMHgxZiwgMHgwMDAwKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OGNfNF9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXJ0bDgxNjhjXzNfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY4ZF9od19waHlfY29uZmlnKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdF8wW10gPSB7CisJCXsgMHgxZiwgMHgwMDAxIH0sCisJCXsgMHgwOSwgMHgyNzcwIH0sCisJCXsgMHgwOCwgMHgwNGQwIH0sCisJCXsgMHgwYiwgMHhhZDE1IH0sCisJCXsgMHgwYywgMHg1YmYwIH0sCisJCXsgMHgxYywgMHhmMTAxIH0sCisJCXsgMHgxZiwgMHgwMDAzIH0sCisJCXsgMHgxNCwgMHg5NGQ3IH0sCisJCXsgMHgxMiwgMHhmNGQ2IH0sCisJCXsgMHgwOSwgMHhjYTBmIH0sCisJCXsgMHgxZiwgMHgwMDAyIH0sCisJCXsgMHgwYiwgMHgwYjEwIH0sCisJCXsgMHgwYywgMHhkMWY3IH0sCisJCXsgMHgxZiwgMHgwMDAyIH0sCisJCXsgMHgwNiwgMHg1NDYxIH0sCisJCXsgMHgxZiwgMHgwMDAyIH0sCisJCXsgMHgwNSwgMHg2NjYyIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0sCisJCXsgMHgxNCwgMHgwMDYwIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0sCisJCXsgMHgwZCwgMHhmOGEwIH0sCisJCXsgMHgxZiwgMHgwMDA1IH0sCisJCXsgMHgwNSwgMHhmZmMyIH0KKwl9OworCisJcnRsX3BoeV93cml0ZShpb2FkZHIsIHBoeV9yZWdfaW5pdF8wLCBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8wKSk7CisKKwlpZiAobWRpb19yZWFkKGlvYWRkciwgMHgwNikgPT0gMHhjNDAwKSB7CisJCXN0cnVjdCBwaHlfcmVnIHBoeV9yZWdfaW5pdF8xW10gPSB7CisJCQl7IDB4MWYsIDB4MDAwNSB9LAorCQkJeyAweDAxLCAweDAzMDAgfSwKKwkJCXsgMHgxZiwgMHgwMDAwIH0sCisJCQl7IDB4MTEsIDB4NDAxYyB9LAorCQkJeyAweDE2LCAweDQxMDAgfSwKKwkJCXsgMHgxZiwgMHgwMDA1IH0sCisJCQl7IDB4MDcsIDB4MDAxMCB9LAorCQkJeyAweDA1LCAweDgzZGMgfSwKKwkJCXsgMHgwNiwgMHgwODdkIH0sCisJCQl7IDB4MDUsIDB4ODMwMCB9LAorCQkJeyAweDA2LCAweDAxMDEgfSwKKwkJCXsgMHgwNiwgMHgwNWY4IH0sCisJCQl7IDB4MDYsIDB4ZjlmYSB9LAorCQkJeyAweDA2LCAweGZiZWYgfSwKKwkJCXsgMHgwNiwgMHg3OWUyIH0sCisJCQl7IDB4MDYsIDB4ODM1ZiB9LAorCQkJeyAweDA2LCAweGUwZjggfSwKKwkJCXsgMHgwNiwgMHg5YWUxIH0sCisJCQl7IDB4MDYsIDB4Zjg5YiB9LAorCQkJeyAweDA2LCAweGVmMzEgfSwKKwkJCXsgMHgwNiwgMHgzYjY1IH0sCisJCQl7IDB4MDYsIDB4YWEwNyB9LAorCQkJeyAweDA2LCAweDgxZTQgfSwKKwkJCXsgMHgwNiwgMHhmODlhIH0sCisJCQl7IDB4MDYsIDB4ZTVmOCB9LAorCQkJeyAweDA2LCAweDliYWYgfSwKKwkJCXsgMHgwNiwgMHgwNmFlIH0sCisJCQl7IDB4MDUsIDB4ODNkYyB9LAorCQkJeyAweDA2LCAweDgzMDAgfSwKKwkJfTsKKworCQlydGxfcGh5X3dyaXRlKGlvYWRkciwgcGh5X3JlZ19pbml0XzEsCisJCQkgICAgICBBUlJBWV9TSVpFKHBoeV9yZWdfaW5pdF8xKSk7CisJfQorCisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMDJlX2h3X3BoeV9jb25maWcodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJc3RydWN0IHBoeV9yZWcgcGh5X3JlZ19pbml0W10gPSB7CisJCXsgMHgxZiwgMHgwMDAzIH0sCisJCXsgMHgwOCwgMHg0NDFkIH0sCisJCXsgMHgwMSwgMHg5MTAwIH0sCisJCXsgMHgxZiwgMHgwMDAwIH0KKwl9OworCisJbWRpb193cml0ZShpb2FkZHIsIDB4MWYsIDB4MDAwMCk7CisJbWRpb19wYXRjaChpb2FkZHIsIDB4MTEsIDEgPDwgMTIpOworCW1kaW9fcGF0Y2goaW9hZGRyLCAweDE5LCAxIDw8IDEzKTsKKworCXJ0bF9waHlfd3JpdGUoaW9hZGRyLCBwaHlfcmVnX2luaXQsIEFSUkFZX1NJWkUocGh5X3JlZ19pbml0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bF9od19waHlfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMjk2LDE1ICsxNjA3LDQzIEBACiAJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA0OgogCQlydGw4MTY5c2JfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOwogCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDc6CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA4OgorCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wOToKKwkJcnRsODEwMmVfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOworCQlicmVhazsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTE6CisJCXJ0bDgxNjhiYl9od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMjoKKwkJcnRsODE2OGJlZl9od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xNzoKKwkJcnRsODE2OGJlZl9od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOwogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xODoKLQkJcnRsODE2OGNwX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJcnRsODE2OGNwXzFfaHdfcGh5X2NvbmZpZyhpb2FkZHIpOwogCQlicmVhazsKIAljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTk6Ci0JCXJ0bDgxNjhjX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJcnRsODE2OGNfMV9od19waHlfY29uZmlnKGlvYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yMDoKLQkJcnRsODE2OGN4X2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJcnRsODE2OGNfMl9od19waHlfY29uZmlnKGlvYWRkcik7CiAJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yMToKKwkJcnRsODE2OGNfM19od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yMjoKKwkJcnRsODE2OGNfNF9od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yMzoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjQ6CisJCXJ0bDgxNjhjcF8yX2h3X3BoeV9jb25maWcoaW9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI1OgorCQlydGw4MTY4ZF9od19waHlfY29uZmlnKGlvYWRkcik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMTUxMyw3ICsxODUyLDcgQEAKIAl1bnNpZ25lZCBpbnQgYWxpZ247CiAJdTE2IGludHJfZXZlbnQ7CiAJdTE2IG5hcGlfZXZlbnQ7Ci0JdW5zaWduZWQgbXNpOworCXVuc2lnbmVkIGZlYXR1cmVzOwogfSBydGxfY2ZnX2luZm9zIFtdID0gewogCVtSVExfQ0ZHXzBdID0gewogCQkuaHdfc3RhcnQJPSBydGxfaHdfc3RhcnRfODE2OSwKQEAgLTE1MjIsNyArMTg2MSw3IEBACiAJCS5pbnRyX2V2ZW50CT0gU1lTRXJyIHwgTGlua0NoZyB8IFJ4T3ZlcmZsb3cgfAogCQkJCSAgUnhGSUZPT3ZlciB8IFR4RXJyIHwgVHhPSyB8IFJ4T0sgfCBSeEVyciwKIAkJLm5hcGlfZXZlbnQJPSBSeEZJRk9PdmVyIHwgVHhFcnIgfCBUeE9LIHwgUnhPSyB8IFJ4T3ZlcmZsb3csCi0JCS5tc2kJCT0gMAorCQkuZmVhdHVyZXMJPSBSVExfRkVBVFVSRV9HTUlJCiAJfSwKIAlbUlRMX0NGR18xXSA9IHsKIAkJLmh3X3N0YXJ0CT0gcnRsX2h3X3N0YXJ0XzgxNjgsCkBAIC0xNTMxLDcgKzE4NzAsNyBAQAogCQkuaW50cl9ldmVudAk9IFNZU0VyciB8IExpbmtDaGcgfCBSeE92ZXJmbG93IHwKIAkJCQkgIFR4RXJyIHwgVHhPSyB8IFJ4T0sgfCBSeEVyciwKIAkJLm5hcGlfZXZlbnQJPSBUeEVyciB8IFR4T0sgfCBSeE9LIHwgUnhPdmVyZmxvdywKLQkJLm1zaQkJPSBSVExfRkVBVFVSRV9NU0kKKwkJLmZlYXR1cmVzCT0gUlRMX0ZFQVRVUkVfR01JSSB8IFJUTF9GRUFUVVJFX01TSQogCX0sCiAJW1JUTF9DRkdfMl0gPSB7CiAJCS5od19zdGFydAk9IHJ0bF9od19zdGFydF84MTAxLApAQCAtMTU0MCw3ICsxODc5LDcgQEAKIAkJLmludHJfZXZlbnQJPSBTWVNFcnIgfCBMaW5rQ2hnIHwgUnhPdmVyZmxvdyB8IFBDU1RpbWVvdXQgfAogCQkJCSAgUnhGSUZPT3ZlciB8IFR4RXJyIHwgVHhPSyB8IFJ4T0sgfCBSeEVyciwKIAkJLm5hcGlfZXZlbnQJPSBSeEZJRk9PdmVyIHwgVHhFcnIgfCBUeE9LIHwgUnhPSyB8IFJ4T3ZlcmZsb3csCi0JCS5tc2kJCT0gUlRMX0ZFQVRVUkVfTVNJCisJCS5mZWF0dXJlcwk9IFJUTF9GRUFUVVJFX01TSQogCX0KIH07CiAKQEAgLTE1NTIsNyArMTg5MSw3IEBACiAJdTggY2ZnMjsKIAogCWNmZzIgPSBSVExfUjgoQ29uZmlnMikgJiB+TVNJRW5hYmxlOwotCWlmIChjZmctPm1zaSkgeworCWlmIChjZmctPmZlYXR1cmVzICYgUlRMX0ZFQVRVUkVfTVNJKSB7CiAJCWlmIChwY2lfZW5hYmxlX21zaShwZGV2KSkgewogCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vIE1TSS4gQmFjayB0byBJTlR4LlxuIik7CiAJCX0gZWxzZSB7CkBAIC0xNTcyLDEyICsxOTExLDgxIEBACiAJfQogfQogCitzdGF0aWMgaW50IHJ0bF9lZXByb21fcmVhZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGNhcCwgaW50IGFkZHIsIF9fbGUzMiAqdmFsKQoreworCWludCByZXQsIGNvdW50ID0gMTAwOworCXUxNiBzdGF0dXMgPSAwOworCXUzMiB2YWx1ZTsKKworCXJldCA9IHBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfVlBEX0FERFIsIGFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZG8geworCQl1ZGVsYXkoMTApOworCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfVlBEX0FERFIsICZzdGF0dXMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfSB3aGlsZSAoIShzdGF0dXMgJiBQQ0lfVlBEX0FERFJfRikgJiYgLS1jb3VudCk7CisKKwlpZiAoIShzdGF0dXMgJiBQQ0lfVlBEX0FERFJfRikpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGNhcCArIFBDSV9WUERfREFUQSwgJnZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsX2luaXRfbWFjX2FkZHJlc3Moc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisJdTggY2ZnMTsKKwlpbnQgdnBkX2NhcDsKKwl1OCBtYWNbOF07CisJREVDTEFSRV9NQUNfQlVGKGJ1Zik7CisKKwljZmcxID0gUlRMX1I4KENvbmZpZzEpOworCWlmICghKGNmZzEgICYgVlBEKSkgeworCQlkcHJpbnRrKCJWUEQgYWNjZXNzIG5vdCBlbmFibGVkLCBlbmFibGluZ1xuIik7CisJCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCVJUTF9XOChDb25maWcxLCBjZmcxIHwgVlBEKTsKKwkJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisJfQorCisJdnBkX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9WUEQpOworCWlmICghdnBkX2NhcCkKKwkJcmV0dXJuOworCisJLyogTUFDIGFkZHJlc3MgaXMgc3RvcmVkIGluIEVFUFJPTSBhdCBvZmZzZXQgMHgwZQorCSAqIFJlYWx0ZWsgc2F5czogIlRoZSBWUEQgYWRkcmVzcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgRFdPUkQtYWxpZ25lZAorCSAqIGFkZHJlc3MgYXMgZGVmaW5lZCBpbiB0aGUgUENJIDIuMiBTcGVjaWZpY2F0aW9ucywgYnV0IHRoZSBWUEQgZGF0YQorCSAqIGlzIGFsd2F5cyBjb25zZWN1dGl2ZSA0LWJ5dGUgZGF0YSBzdGFydGluZyBmcm9tIHRoZSBWUEQgYWRkcmVzcworCSAqIHNwZWNpZmllZC4iCisJICovCisJaWYgKHJ0bF9lZXByb21fcmVhZChwZGV2LCB2cGRfY2FwLCAweDAwMGUsIChfX2xlMzIqKSZtYWNbMF0pIDwgMCB8fAorCSAgICBydGxfZWVwcm9tX3JlYWQocGRldiwgdnBkX2NhcCwgMHgwMDEyLCAoX19sZTMyKikmbWFjWzRdKSA8IDApIHsKKwkJZHByaW50aygiUmVhZGluZyBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHByaW50aygiTUFDIGFkZHJlc3MgZm91bmQgaW4gRUVQUk9NOiAlc1xuIiwgcHJpbnRfbWFjKGJ1ZiwgbWFjKSk7CisKKwkvKiBXcml0ZSBNQUMgYWRkcmVzcyAqLworCXJ0bF9yYXJfc2V0KHRwLCBtYWMpOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogcnRsODE2OV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAljb25zdCBzdHJ1Y3QgcnRsX2NmZ19pbmZvICpjZmcgPSBydGxfY2ZnX2luZm9zICsgZW50LT5kcml2ZXJfZGF0YTsKIAljb25zdCB1bnNpZ25lZCBpbnQgcmVnaW9uID0gY2ZnLT5yZWdpb247CiAJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHA7CisJc3RydWN0IG1paV9pZl9pbmZvICptaWk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl2b2lkIF9faW9tZW0gKmlvYWRkcjsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTE2MDIsNiArMjAxMCwxNCBAQAogCXRwLT5wY2lfZGV2ID0gcGRldjsKIAl0cC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLm1zZ19lbmFibGUsIFI4MTY5X01TR19ERUZBVUxUKTsKIAorCW1paSA9ICZ0cC0+bWlpOworCW1paS0+ZGV2ID0gZGV2OworCW1paS0+bWRpb19yZWFkID0gcnRsX21kaW9fcmVhZDsKKwltaWktPm1kaW9fd3JpdGUgPSBydGxfbWRpb193cml0ZTsKKwltaWktPnBoeV9pZF9tYXNrID0gMHgxZjsKKwltaWktPnJlZ19udW1fbWFzayA9IDB4MWY7CisJbWlpLT5zdXBwb3J0c19nbWlpID0gISEoY2ZnLT5mZWF0dXJlcyAmIFJUTF9GRUFUVVJFX0dNSUkpOworCiAJLyogZW5hYmxlIGRldmljZSAoaW5jbC4gUENJIFBNIHdha2V1cCBhbmQgaG90cGx1ZyBzZXR1cCkgKi8KIAlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYyA8IDApIHsKQEAgLTE2NzAsNiArMjA4NiwxMCBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9yZXNfNDsKIAl9CiAKKwl0cC0+cGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpZiAoIXRwLT5wY2llX2NhcCAmJiBuZXRpZl9tc2dfcHJvYmUodHApKQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAibm8gUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIik7CisKIAkvKiBVbm5lZWRlZCA/IERvbid0IG1lc3Mgd2l0aCBNcnMuIE11cnBoeS4gKi8KIAlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKIApAQCAtMTcwNiw2ICsyMTI2LDEwIEBACiAJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKIAlSVExfVzgoQ29uZmlnMSwgUlRMX1I4KENvbmZpZzEpIHwgUE1FbmFibGUpOwogCVJUTF9XOChDb25maWc1LCBSVExfUjgoQ29uZmlnNSkgJiBQTUVTdGF0dXMpOworCWlmICgoUlRMX1I4KENvbmZpZzMpICYgKExpbmtVcCB8IE1hZ2ljUGFja2V0KSkgIT0gMCkKKwkJdHAtPmZlYXR1cmVzIHw9IFJUTF9GRUFUVVJFX1dPTDsKKwlpZiAoKFJUTF9SOChDb25maWc1KSAmIChVV0YgfCBCV0YgfCBNV0YpKSAhPSAwKQorCQl0cC0+ZmVhdHVyZXMgfD0gUlRMX0ZFQVRVUkVfV09MOwogCXRwLT5mZWF0dXJlcyB8PSBydGxfdHJ5X21zaShwZGV2LCBpb2FkZHIsIGNmZyk7CiAJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfTG9jayk7CiAKQEAgLTE3MjgsNyArMjE1MiwxMyBAQAogCQlkZXYtPmRvX2lvY3RsID0gcnRsODE2OV9pb2N0bDsKIAl9CiAKLQkvKiBHZXQgTUFDIGFkZHJlc3MuICBGSVhNRTogcmVhZCBFRVBST00gKi8KKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCisJdHAtPm1taW9fYWRkciA9IGlvYWRkcjsKKworCXJ0bF9pbml0X21hY19hZGRyZXNzKHRwLCBpb2FkZHIpOworCisJLyogR2V0IE1BQyBhZGRyZXNzICovCiAJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQogCQlkZXYtPmRldl9hZGRyW2ldID0gUlRMX1I4KE1BQzAgKyBpKTsKIAltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwpAQCAtMTc1OCw3ICsyMTg4LDYgQEAKICNlbmRpZgogCiAJdHAtPmludHJfbWFzayA9IDB4ZmZmZjsKLQl0cC0+bW1pb19hZGRyID0gaW9hZGRyOwogCXRwLT5hbGlnbiA9IGNmZy0+YWxpZ247CiAJdHAtPmh3X3N0YXJ0ID0gY2ZnLT5od19zdGFydDsKIAl0cC0+aW50cl9ldmVudCA9IGNmZy0+aW50cl9ldmVudDsKQEAgLTE3NjgsOCArMjE5Nyw2IEBACiAJdHAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwogCXRwLT50aW1lci5mdW5jdGlvbiA9IHJ0bDgxNjlfcGh5X3RpbWVyOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKLQogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnJfb3V0X21zaV81OwpAQCAtMTc5MSw2ICsyMjE4LDcgQEAKIAl9CiAKIAlydGw4MTY5X2luaXRfcGh5KGRldiwgdHApOworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmcGRldi0+ZGV2LCB0cC0+ZmVhdHVyZXMgJiBSVExfRkVBVFVSRV9XT0wpOwogCiBvdXQ6CiAJcmV0dXJuIHJjOwpAQCAtMjA2MSwxMiArMjQ4OSwyMDkgQEAKIAlSVExfVzE2KEludHJNYXNrLCB0cC0+aW50cl9ldmVudCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IGZvcmNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjYXAgPSB0cC0+cGNpZV9jYXA7CisKKwlpZiAoY2FwKSB7CisJCXUxNiBjdGw7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsICZjdGwpOworCQljdGwgPSAoY3RsICYgflBDSV9FWFBfREVWQ1RMX1JFQURSUSkgfCBmb3JjZTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIGNhcCArIFBDSV9FWFBfREVWQ1RMLCBjdGwpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXUzMiBjc2k7CisKKwljc2kgPSBydGxfY3NpX3JlYWQoaW9hZGRyLCAweDA3MGMpICYgMHgwMGZmZmZmZjsKKwlydGxfY3NpX3dyaXRlKGlvYWRkciwgMHgwNzBjLCBjc2kgfCAweDI3MDAwMDAwKTsKK30KKworc3RydWN0IGVwaHlfaW5mbyB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1MTYgbWFzazsKKwl1MTYgYml0czsKK307CisKK3N0YXRpYyB2b2lkIHJ0bF9lcGh5X2luaXQodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBlcGh5X2luZm8gKmUsIGludCBsZW4pCit7CisJdTE2IHc7CisKKwl3aGlsZSAobGVuLS0gPiAwKSB7CisJCXcgPSAocnRsX2VwaHlfcmVhZChpb2FkZHIsIGUtPm9mZnNldCkgJiB+ZS0+bWFzaykgfCBlLT5iaXRzOworCQlydGxfZXBoeV93cml0ZShpb2FkZHIsIGUtPm9mZnNldCwgdyk7CisJCWUrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlX2Nsb2NrX3JlcXVlc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNhcCA9IHRwLT5wY2llX2NhcDsKKworCWlmIChjYXApIHsKKwkJdTE2IGN0bDsKKworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBjYXAgKyBQQ0lfRVhQX0xOS0NUTCwgJmN0bCk7CisJCWN0bCAmPSB+UENJX0VYUF9MTktDVExfQ0xLUkVRX0VOOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX0VYUF9MTktDVEwsIGN0bCk7CisJfQorfQorCisjZGVmaW5lIFI4MTY4X0NQQ01EX1FVSVJLX01BU0sgKFwKKwlFbmFibGVCaXN0IHwgXAorCU1hY19kYmdvX29lIHwgXAorCUZvcmNlX2hhbGZfZHVwIHwgXAorCUZvcmNlX3J4Zmxvd19lbiB8IFwKKwlGb3JjZV90eGZsb3dfZW4gfCBcCisJQ3hwbF9kYmdfc2VsIHwgXAorCUFTRiB8IFwKKwlQa3RDbnRyRGlzYWJsZSB8IFwKKwlNYWNfZGJnb19zZWwpCisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4YmIodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCVJUTF9XOChDb25maWczLCBSVExfUjgoQ29uZmlnMykgJiB+QmVhY29uX2VuKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTY4X0NQQ01EX1FVSVJLX01BU0spOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsCisJCSgweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCkgfCBQQ0lfRVhQX0RFVkNUTF9OT1NOT09QX0VOKTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhiZWYodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bF9od19zdGFydF84MTY4YmIoaW9hZGRyLCBwZGV2KTsKKworCVJUTF9XOChFYXJseVR4VGhyZXMsIEVhcmx5VHhUaGxkKTsKKworCVJUTF9XOChDb25maWc0LCBSVExfUjgoQ29uZmlnNCkgJiB+KDEgPDwgMCkpOworfQorCitzdGF0aWMgdm9pZCBfX3J0bF9od19zdGFydF84MTY4Y3Aodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCVJUTF9XOChDb25maWcxLCBSVExfUjgoQ29uZmlnMSkgfCBTcGVlZF9kb3duKTsKKworCVJUTF9XOChDb25maWczLCBSVExfUjgoQ29uZmlnMykgJiB+QmVhY29uX2VuKTsKKworCXJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhwZGV2LCAweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCk7CisKKwlydGxfZGlzYWJsZV9jbG9ja19yZXF1ZXN0KHBkZXYpOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxNjhfQ1BDTURfUVVJUktfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4Y3BfMSh2b2lkIF9faW9tZW0gKmlvYWRkciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxNjhjcFtdID0geworCQl7IDB4MDEsIDAsCTB4MDAwMSB9LAorCQl7IDB4MDIsIDB4MDgwMCwJMHgxMDAwIH0sCisJCXsgMHgwMywgMCwJMHgwMDQyIH0sCisJCXsgMHgwNiwgMHgwMDgwLAkweDAwMDAgfSwKKwkJeyAweDA3LCAwLAkweDIwMDAgfQorCX07CisKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCXJ0bF9lcGh5X2luaXQoaW9hZGRyLCBlX2luZm9fODE2OGNwLCBBUlJBWV9TSVpFKGVfaW5mb184MTY4Y3ApKTsKKworCV9fcnRsX2h3X3N0YXJ0XzgxNjhjcChpb2FkZHIsIHBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNwXzIodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsIDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTY4X0NQQ01EX1FVSVJLX01BU0spOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNwXzModm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJLyogTWFnaWMuICovCisJUlRMX1c4KERCR19SRUcsIDB4MjApOworCisJUlRMX1c4KEVhcmx5VHhUaHJlcywgRWFybHlUeFRobGQpOworCisJcnRsX3R4X3BlcmZvcm1hbmNlX3R3ZWFrKHBkZXYsIDB4NSA8PCBNQVhfUkVBRF9SRVFVRVNUX1NISUZUKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTY4X0NQQ01EX1FVSVJLX01BU0spOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNfMSh2b2lkIF9faW9tZW0gKmlvYWRkciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxNjhjXzFbXSA9IHsKKwkJeyAweDAyLCAweDA4MDAsCTB4MTAwMCB9LAorCQl7IDB4MDMsIDAsCTB4MDAwMiB9LAorCQl7IDB4MDYsIDB4MDA4MCwJMHgwMDAwIH0KKwl9OworCisJcnRsX2NzaV9hY2Nlc3NfZW5hYmxlKGlvYWRkcik7CisKKwlSVExfVzgoREJHX1JFRywgMHgwNiB8IEZJWF9OQUtfMSB8IEZJWF9OQUtfMik7CisKKwlydGxfZXBoeV9pbml0KGlvYWRkciwgZV9pbmZvXzgxNjhjXzEsIEFSUkFZX1NJWkUoZV9pbmZvXzgxNjhjXzEpKTsKKworCV9fcnRsX2h3X3N0YXJ0XzgxNjhjcChpb2FkZHIsIHBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGNfMih2b2lkIF9faW9tZW0gKmlvYWRkciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxNjhjXzJbXSA9IHsKKwkJeyAweDAxLCAwLAkweDAwMDEgfSwKKwkJeyAweDAzLCAweDA0MDAsCTB4MDIyMCB9CisJfTsKKworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJcnRsX2VwaHlfaW5pdChpb2FkZHIsIGVfaW5mb184MTY4Y18yLCBBUlJBWV9TSVpFKGVfaW5mb184MTY4Y18yKSk7CisKKwlfX3J0bF9od19zdGFydF84MTY4Y3AoaW9hZGRyLCBwZGV2KTsKK30KKworc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjhjXzModm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bF9od19zdGFydF84MTY4Y18yKGlvYWRkciwgcGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTY4Y180KHZvaWQgX19pb21lbSAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCV9fcnRsX2h3X3N0YXJ0XzgxNjhjcChpb2FkZHIsIHBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODE2OGQodm9pZCBfX2lvbWVtICppb2FkZHIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJcnRsX2Rpc2FibGVfY2xvY2tfcmVxdWVzdChwZGV2KTsKKworCVJUTF9XOChFYXJseVR4VGhyZXMsIEVhcmx5VHhUaGxkKTsKKworCXJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhwZGV2LCAweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCk7CisKKwlSVExfVzE2KENQbHVzQ21kLCBSVExfUjE2KENQbHVzQ21kKSAmIH5SODE2OF9DUENNRF9RVUlSS19NQVNLKTsKK30KKwogc3RhdGljIHZvaWQgcnRsX2h3X3N0YXJ0XzgxNjgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7Ci0JdTggY3RsOwogCiAJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKIApAQCAtMjA3NCwxNyArMjY5OSwxMCBAQAogCiAJcnRsX3NldF9yeF9tYXhfc2l6ZShpb2FkZHIpOwogCi0JcnRsX3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHRwKTsKLQogCXRwLT5jcF9jbWQgfD0gUlRMX1IxNihDUGx1c0NtZCkgfCBQa3RDbnRyRGlzYWJsZSB8IElOVFRfMTsKIAogCVJUTF9XMTYoQ1BsdXNDbWQsIHRwLT5jcF9jbWQpOwogCi0JLyogVHggcGVyZm9ybWFuY2UgdHdlYWsuICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2OSwgJmN0bCk7Ci0JY3RsID0gKGN0bCAmIH4weDcwKSB8IDB4NTA7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjksIGN0bCk7Ci0KIAlSVExfVzE2KEludHJNaXRpZ2F0ZSwgMHg1MTUxKTsKIAogCS8qIFdvcmsgYXJvdW5kIGZvciBSeEZJRk8gb3ZlcmZsb3cuICovCkBAIC0yMDk1LDIxICsyNzEzLDEzNCBAQAogCiAJcnRsX3NldF9yeF90eF9kZXNjX3JlZ2lzdGVycyh0cCwgaW9hZGRyKTsKIAotCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCXJ0bF9zZXRfcnhfbW9kZShkZXYpOworCisJUlRMX1czMihUeENvbmZpZywgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSB8CisJCShJbnRlckZyYW1lR2FwIDw8IFR4SW50ZXJGcmFtZUdhcFNoaWZ0KSk7CiAKIAlSVExfUjgoSW50ck1hc2spOwogCi0JUlRMX1czMihSeE1pc3NlZCwgMCk7CisJc3dpdGNoICh0cC0+bWFjX3ZlcnNpb24pIHsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTE6CisJCXJ0bF9od19zdGFydF84MTY4YmIoaW9hZGRyLCBwZGV2KTsKKwlicmVhazsKIAotCXJ0bF9zZXRfcnhfbW9kZShkZXYpOworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMjoKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTc6CisJCXJ0bF9od19zdGFydF84MTY4YmVmKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTg6CisJCXJ0bF9od19zdGFydF84MTY4Y3BfMShpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE5OgorCQlydGxfaHdfc3RhcnRfODE2OGNfMShpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIwOgorCQlydGxfaHdfc3RhcnRfODE2OGNfMihpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIxOgorCQlydGxfaHdfc3RhcnRfODE2OGNfMyhpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIyOgorCQlydGxfaHdfc3RhcnRfODE2OGNfNChpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIzOgorCQlydGxfaHdfc3RhcnRfODE2OGNwXzIoaW9hZGRyLCBwZGV2KTsKKwlicmVhazsKKworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNDoKKwkJcnRsX2h3X3N0YXJ0XzgxNjhjcF8zKGlvYWRkciwgcGRldik7CisJYnJlYWs7CisKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjU6CisJCXJ0bF9od19zdGFydF84MTY4ZChpb2FkZHIsIHBkZXYpOworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHVua25vd24gY2hpcHNldCAobWFjX3ZlcnNpb24gPSAlZCkuXG4iLAorCQkJZGV2LT5uYW1lLCB0cC0+bWFjX3ZlcnNpb24pOworCWJyZWFrOworCX0KIAogCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKIAorCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCiAJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4RjAwMCk7CiAKIAlSVExfVzE2KEludHJNYXNrLCB0cC0+aW50cl9ldmVudCk7CiB9CiAKKyNkZWZpbmUgUjgxMFhfQ1BDTURfUVVJUktfTUFTSyAoXAorCUVuYWJsZUJpc3QgfCBcCisJTWFjX2RiZ29fb2UgfCBcCisJRm9yY2VfaGFsZl9kdXAgfCBcCisJRm9yY2VfaGFsZl9kdXAgfCBcCisJRm9yY2VfdHhmbG93X2VuIHwgXAorCUN4cGxfZGJnX3NlbCB8IFwKKwlBU0YgfCBcCisJUGt0Q250ckRpc2FibGUgfCBcCisJUENJREFDIHwgXAorCVBDSU11bFJXKQorCitzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODEwMmVfMSh2b2lkIF9faW9tZW0gKmlvYWRkciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBlcGh5X2luZm8gZV9pbmZvXzgxMDJlXzFbXSA9IHsKKwkJeyAweDAxLAkwLCAweDZlNjUgfSwKKwkJeyAweDAyLAkwLCAweDA5MWYgfSwKKwkJeyAweDAzLAkwLCAweGMyZjkgfSwKKwkJeyAweDA2LAkwLCAweGFmYjUgfSwKKwkJeyAweDA3LAkwLCAweDBlMDAgfSwKKwkJeyAweDE5LAkwLCAweGVjODAgfSwKKwkJeyAweDAxLAkwLCAweDJlNjUgfSwKKwkJeyAweDAxLAkwLCAweDZlNjUgfQorCX07CisJdTggY2ZnMTsKKworCXJ0bF9jc2lfYWNjZXNzX2VuYWJsZShpb2FkZHIpOworCisJUlRMX1c4KERCR19SRUcsIEZJWF9OQUtfMSk7CisKKwlydGxfdHhfcGVyZm9ybWFuY2VfdHdlYWsocGRldiwgMHg1IDw8IE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQpOworCisJUlRMX1c4KENvbmZpZzEsCisJICAgICAgIExFRFMxIHwgTEVEUzAgfCBTcGVlZF9kb3duIHwgTUVNTUFQIHwgSU9NQVAgfCBWUEQgfCBQTUVuYWJsZSk7CisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJY2ZnMSA9IFJUTF9SOChDb25maWcxKTsKKwlpZiAoKGNmZzEgJiBMRURTMCkgJiYgKGNmZzEgJiBMRURTMSkpCisJCVJUTF9XOChDb25maWcxLCBjZmcxICYgfkxFRFMwKTsKKworCVJUTF9XMTYoQ1BsdXNDbWQsIFJUTF9SMTYoQ1BsdXNDbWQpICYgflI4MTBYX0NQQ01EX1FVSVJLX01BU0spOworCisJcnRsX2VwaHlfaW5pdChpb2FkZHIsIGVfaW5mb184MTAyZV8xLCBBUlJBWV9TSVpFKGVfaW5mb184MTAyZV8xKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTAyZV8yKHZvaWQgX19pb21lbSAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlydGxfY3NpX2FjY2Vzc19lbmFibGUoaW9hZGRyKTsKKworCXJ0bF90eF9wZXJmb3JtYW5jZV90d2VhayhwZGV2LCAweDUgPDwgTUFYX1JFQURfUkVRVUVTVF9TSElGVCk7CisKKwlSVExfVzgoQ29uZmlnMSwgTUVNTUFQIHwgSU9NQVAgfCBWUEQgfCBQTUVuYWJsZSk7CisJUlRMX1c4KENvbmZpZzMsIFJUTF9SOChDb25maWczKSAmIH5CZWFjb25fZW4pOworCisJUlRMX1cxNihDUGx1c0NtZCwgUlRMX1IxNihDUGx1c0NtZCkgJiB+UjgxMFhfQ1BDTURfUVVJUktfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9od19zdGFydF84MTAyZV8zKHZvaWQgX19pb21lbSAqaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlydGxfaHdfc3RhcnRfODEwMmVfMihpb2FkZHIsIHBkZXYpOworCisJcnRsX2VwaHlfd3JpdGUoaW9hZGRyLCAweDAzLCAweGMyZjkpOworfQorCiBzdGF0aWMgdm9pZCBydGxfaHdfc3RhcnRfODEwMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTIxMTgsOCArMjg0OSwyNiBAQAogCiAJaWYgKCh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgfHwKIAkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE2KSkgewotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgMHg2OCwgMHgwMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAweDY5LCAweDA4KTsKKwkJaW50IGNhcCA9IHRwLT5wY2llX2NhcDsKKworCQlpZiAoY2FwKSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsCisJCQkJCSAgICAgIFBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU4pOworCQl9CisJfQorCisJc3dpdGNoICh0cC0+bWFjX3ZlcnNpb24pIHsKKwljYXNlIFJUTF9HSUdBX01BQ19WRVJfMDc6CisJCXJ0bF9od19zdGFydF84MTAyZV8xKGlvYWRkciwgcGRldik7CisJCWJyZWFrOworCisJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzA4OgorCQlydGxfaHdfc3RhcnRfODEwMmVfMyhpb2FkZHIsIHBkZXYpOworCQlicmVhazsKKworCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8wOToKKwkJcnRsX2h3X3N0YXJ0XzgxMDJlXzIoaW9hZGRyLCBwZGV2KTsKKwkJYnJlYWs7CiAJfQogCiAJUlRMX1c4KENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKQEAgLTIxNDMsOCArMjg5Miw2IEBACiAKIAlSVExfUjgoSW50ck1hc2spOwogCi0JUlRMX1czMihSeE1pc3NlZCwgMCk7Ci0KIAlydGxfc2V0X3J4X21vZGUoZGV2KTsKIAogCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKQEAgLTI5MjIsNiArMzY2OSwxNyBAQAogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcnhfbWlzc2VkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPiBSVExfR0lHQV9NQUNfVkVSXzA2KQorCQlyZXR1cm47CisKKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKFJUTF9SMzIoUnhNaXNzZWQpICYgMHhmZmZmZmYpOworCVJUTF9XMzIoUnhNaXNzZWQsIDApOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTY5X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yOTM5LDkgKzM2OTcsNyBAQAogCiAJcnRsODE2OV9hc2ljX2Rvd24oaW9hZGRyKTsKIAotCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLwotCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKLQlSVExfVzMyKFJ4TWlzc2VkLCAwKTsKKwlydGw4MTY5X3J4X21pc3NlZChkZXYsIGlvYWRkcik7CiAKIAlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKIApAQCAtMzA2Myw4ICszODE5LDcgQEAKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0JCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKLQkJUlRMX1czMihSeE1pc3NlZCwgMCk7CisJCXJ0bDgxNjlfcnhfbWlzc2VkKGRldiwgaW9hZGRyKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTMwODksOCArMzg0NCw3IEBACiAKIAlydGw4MTY5X2FzaWNfZG93bihpb2FkZHIpOwogCi0JZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IFJUTF9SMzIoUnhNaXNzZWQpOwotCVJUTF9XMzIoUnhNaXNzZWQsIDApOworCXJ0bDgxNjlfcnhfbWlzc2VkKGRldiwgaW9hZGRyKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOwogCkBAIC0zMTIxLDYgKzM4NzUsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcnRsX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJ0bDgxNjlfc3VzcGVuZChwZGV2LCBQTVNHX1NVU1BFTkQpOworfQorCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydGw4MTY5X3BjaV9kcml2ZXIgPSB7CkBAIC0zMTMxLDYgKzM4OTAsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gcnRsODE2OV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcnRsODE2OV9yZXN1bWUsCisJLnNodXRkb3duCT0gcnRsX3NodXRkb3duLAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggYTJiMDczMC4uNmExMzc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtMzcxLDkgKzM3MSw2IEBACiAJCQkJZmxhZ3NbaV0pOwogfQogCi0vKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyICdSWF9QQV9DRkdfU1RSSVBfVkxBTl9UQUcnIGJpdCBpcyBzZXQgb3Igbm90ICovCi1zdGF0aWMgaW50IHZsYW5fc3RyaXBfZmxhZzsKLQogLyogVW5yZWdpc3RlciB0aGUgdmxhbiAqLwogc3RhdGljIHZvaWQgczJpb192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdmlkKQogewpAQCAtMjMwMyw3ICsyMzAwLDcgQEAKIAkJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfcGFfY2ZnKTsKIAkJdmFsNjQgJj0gflJYX1BBX0NGR19TVFJJUF9WTEFOX1RBRzsKIAkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfcGFfY2ZnKTsKLQkJdmxhbl9zdHJpcF9mbGFnID0gMDsKKwkJbmljLT52bGFuX3N0cmlwX2ZsYWcgPSAwOwogCX0KIAogCS8qCkBAIC0zMTM2LDcgKzMxMzMsNyBAQAogCQlpZiAoc2tiID09IE5VTEwpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpZm9fZGF0YS0+dHhfbG9jaywgZmxhZ3MpOwogCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTnVsbCBza2IgIiwKLQkJCV9fRlVOQ1RJT05fXyk7CisJCQlfX2Z1bmNfXyk7CiAJCQlEQkdfUFJJTlQoRVJSX0RCRywgImluIFR4IEZyZWUgSW50clxuIik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTM0OTYsNyArMzQ5Myw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9hbGxvY19jbnQsIG1lbV9mcmVlX2NudCwgd2F0Y2hkb2dfY250OwogCiAJREJHX1BSSU5UKElOSVRfREJHLCIlcyAtIFJlc2V0dGluZyBYRnJhbWUgY2FyZCAlc1xuIiwKLQkJCV9fRlVOQ1RJT05fXywgc3AtPmRldi0+bmFtZSk7CisJCQlfX2Z1bmNfXywgc3AtPmRldi0+bmFtZSk7CiAKIAkvKiBCYWNrIHVwICB0aGUgUENJLVggQ01EIHJlZywgZG9udCB3YW50IHRvIGxvc2UgTU1SQkMsIE9TVCBzZXR0aW5ncyAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsICYocGNpX2NtZCkpOwpAQCAtMzUxOCw3ICszNTE1LDcgQEAKIAl9CiAKIAlpZiAoY2hlY2tfcGNpX2RldmljZV9pZCh2YWwxNikgPT0gKHUxNilQQ0lfQU5ZX0lEKSB7Ci0JCURCR19QUklOVChFUlJfREJHLCIlcyBTV19SZXNldCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkdfUFJJTlQoRVJSX0RCRywiJXMgU1dfUmVzZXQgZmFpbGVkIVxuIiwgX19mdW5jX18pOwogCX0KIAogCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCBwY2lfY21kKTsKQEAgLTM3NjgsNyArMzc2NSw3IEBACiAJCXZhbDY0ID0gKHMyQklUKDcpIHwgczJCSVQoMTUpIHwgdkJJVChtc2l4X2luZGV4LCAyNiwgNikpOwogCQl3cml0ZXEodmFsNjQsICZiYXIwLT54bXNpX2FjY2Vzcyk7CiAJCWlmICh3YWl0X2Zvcl9tc2l4X3RyYW5zKG5pYywgbXNpeF9pbmRleCkpIHsKLQkJCURCR19QUklOVChFUlJfREJHLCAiZmFpbGVkIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgaW4gJXNcbiIsIF9fZnVuY19fKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQpAQCAtMzc4OSw3ICszNzg2LDcgQEAKIAkJdmFsNjQgPSAoczJCSVQoMTUpIHwgdkJJVChtc2l4X2luZGV4LCAyNiwgNikpOwogCQl3cml0ZXEodmFsNjQsICZiYXIwLT54bXNpX2FjY2Vzcyk7CiAJCWlmICh3YWl0X2Zvcl9tc2l4X3RyYW5zKG5pYywgbXNpeF9pbmRleCkpIHsKLQkJCURCR19QUklOVChFUlJfREJHLCAiZmFpbGVkIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgaW4gJXNcbiIsIF9fZnVuY19fKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWFkZHIgPSByZWFkcSgmYmFyMC0+eG1zaV9hZGRyZXNzKTsKQEAgLTM4MTIsNyArMzgwOSw3IEBACiAJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuaWMtPmVudHJpZXMpIHsKIAkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgXAotCQkJX19GVU5DVElPTl9fKTsKKwkJCV9fZnVuY19fKTsKIAkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY19mYWlsX2NudCsrOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zODI2LDcgKzM4MjMsNyBAQAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghbmljLT5zMmlvX2VudHJpZXMpIHsKIAkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXyk7CisJCQlfX2Z1bmNfXyk7CiAJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJa2ZyZWUobmljLT5lbnRyaWVzKTsKIAkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZApAQCAtNTAxMCw3ICs1MDA3LDcgQEAKIAkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJ4X3BhX2NmZyk7CiAJCQl2YWw2NCAmPSB+UlhfUEFfQ0ZHX1NUUklQX1ZMQU5fVEFHOwogCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfcGFfY2ZnKTsKLQkJCXZsYW5fc3RyaXBfZmxhZyA9IDA7CisJCQlzcC0+dmxhbl9zdHJpcF9mbGFnID0gMDsKIAkJfQogCiAJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOwpAQCAtNTAzMiw3ICs1MDI5LDcgQEAKIAkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJ4X3BhX2NmZyk7CiAJCQl2YWw2NCB8PSBSWF9QQV9DRkdfU1RSSVBfVkxBTl9UQUc7CiAJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9wYV9jZmcpOwotCQkJdmxhbl9zdHJpcF9mbGFnID0gMTsKKwkJCXNwLT52bGFuX3N0cmlwX2ZsYWcgPSAxOwogCQl9CiAKIAkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CkBAIC02NzQ2LDcgKzY3NDMsNyBAQAogCQlyZXQgPSBzMmlvX2NhcmRfdXAoc3ApOwogCQlpZiAocmV0KSB7CiAJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBEZXZpY2UgYnJpbmcgdXAgZmFpbGVkXG4iLAotCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCQkgIF9fZnVuY19fKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJczJpb193YWtlX2FsbF90eF9xdWV1ZShzcCk7CkBAIC03NTMwLDcgKzc1MjcsNyBAQAogCQkJCQlkZWZhdWx0OgogCQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsCiAJCQkJCQkJIiVzOiBTYW1hZGhhbmEhIVxuIiwKLQkJCQkJCQkgX19GVU5DVElPTl9fKTsKKwkJCQkJCQkgX19mdW5jX18pOwogCQkJCQkJQlVHKCk7CiAJCQkJfQogCQkJfQpAQCAtNzc4MSw3ICs3Nzc4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlmICgocmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBzMmlvX2RyaXZlcl9uYW1lKSkpIHsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUmVxdWVzdCBSZWdpb25zIGZhaWxlZCAtICV4IFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBSZXF1ZXN0IFJlZ2lvbnMgZmFpbGVkIC0gJXggXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC03OTk4LDcgKzc5OTUsNyBAQAogCWlmIChzcC0+ZGV2aWNlX3R5cGUgJiBYRlJBTUVfSUlfREVWSUNFKSB7CiAJCW1vZGUgPSBzMmlvX3ZlcmlmeV9wY2lfbW9kZShzcCk7CiAJCWlmIChtb2RlIDwgMCkgewotCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogIiwgX19GVU5DVElPTl9fKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6ICIsIF9fZnVuY19fKTsKIAkJCURCR19QUklOVChFUlJfREJHLCAiIFVuc3VwcG9ydGVkIFBDSSBidXMgbW9kZVxuIik7CiAJCQlyZXQgPSAtRUJBRFNMVDsKIAkJCWdvdG8gc2V0X3N3YXBfZmFpbGVkOwpAQCAtODE3NSw4ICs4MTcyLDggQEAKIAkJICAgIGJyZWFrOwogCX0KIAlpZiAoc3AtPmNvbmZpZy5tdWx0aXEpIHsKLQlmb3IgKGkgPSAwOyBpIDwgc3AtPmNvbmZpZy50eF9maWZvX251bTsgaSsrKQotCQltYWNfY29udHJvbC0+Zmlmb3NbaV0ubXVsdGlxID0gY29uZmlnLT5tdWx0aXE7CisJCWZvciAoaSA9IDA7IGkgPCBzcC0+Y29uZmlnLnR4X2ZpZm9fbnVtOyBpKyspCisJCQltYWNfY29udHJvbC0+Zmlmb3NbaV0ubXVsdGlxID0gY29uZmlnLT5tdWx0aXE7CiAJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE11bHRpcXVldWUgc3VwcG9ydCBlbmFibGVkXG4iLAogCQkJZGV2LT5uYW1lKTsKIAl9IGVsc2UKQEAgLTgyMDYsNiArODIwMywxMSBAQAogCS8qIEluaXRpYWxpemUgZGV2aWNlIG5hbWUgKi8KIAlzcHJpbnRmKHNwLT5uYW1lLCAiJXMgTmV0ZXJpb24gJXMiLCBkZXYtPm5hbWUsIHNwLT5wcm9kdWN0X25hbWUpOwogCisJaWYgKHZsYW5fdGFnX3N0cmlwKQorCQlzcC0+dmxhbl9zdHJpcF9mbGFnID0gMTsKKwllbHNlCisJCXNwLT52bGFuX3N0cmlwX2ZsYWcgPSAwOworCiAJLyoKIAkgKiBNYWtlIExpbmsgc3RhdGUgYXMgb2ZmIGF0IHRoaXMgcG9pbnQsIHdoZW4gdGhlIExpbmsgY2hhbmdlCiAJICogaW50ZXJydXB0IGNvbWVzIHRoZSBzdGF0ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2hhbmdlZCB0bwpAQCAtODI5OSw3ICs4MzAxLDcgQEAKIAogCWlmICghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9GUkFNRV9QUk9UT19UQ1ApKSB7CiAJCURCR19QUklOVChJTklUX0RCRywiJXM6IE5vbi1UQ1AgZnJhbWVzIG5vdCBzdXBwb3J0ZWQgZm9yIExST1xuIiwKLQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCSAgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC04MzExLDcgKzgzMTMsNyBAQAogCQkgKiBJZiB2bGFuIHN0cmlwcGluZyBpcyBkaXNhYmxlZCBhbmQgdGhlIGZyYW1lIGlzIFZMQU4gdGFnZ2VkLAogCQkgKiBzaGlmdCB0aGUgb2Zmc2V0IGJ5IHRoZSBWTEFOIGhlYWRlciBzaXplIGJ5dGVzLgogCQkgKi8KLQkJaWYgKCghdmxhbl9zdHJpcF9mbGFnKSAmJgorCQlpZiAoKCFzcC0+dmxhbl9zdHJpcF9mbGFnKSAmJgogCQkJKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9GUkFNRV9WTEFOX1RBRykpCiAJCQlpcF9vZmYgKz0gSEVBREVSX1ZMQU5fU0laRTsKIAl9IGVsc2UgewpAQCAtODMzMCw3ICs4MzMyLDcgQEAKIHN0YXRpYyBpbnQgY2hlY2tfZm9yX3NvY2tldF9tYXRjaChzdHJ1Y3QgbHJvICpscm8sIHN0cnVjdCBpcGhkciAqaXAsCiAJCQkJICBzdHJ1Y3QgdGNwaGRyICp0Y3ApCiB7Ci0JREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCURCR19QUklOVChJTkZPX0RCRywiJXM6IEJlZW4gaGVyZS4uLlxuIiwgX19mdW5jX18pOwogCWlmICgobHJvLT5pcGgtPnNhZGRyICE9IGlwLT5zYWRkcikgfHwgKGxyby0+aXBoLT5kYWRkciAhPSBpcC0+ZGFkZHIpIHx8CiAJICAgKGxyby0+dGNwaC0+c291cmNlICE9IHRjcC0+c291cmNlKSB8fCAobHJvLT50Y3BoLT5kZXN0ICE9IHRjcC0+ZGVzdCkpCiAJCXJldHVybiAtMTsKQEAgLTgzNDUsNyArODM0Nyw3IEBACiBzdGF0aWMgdm9pZCBpbml0aWF0ZV9uZXdfc2Vzc2lvbihzdHJ1Y3QgbHJvICpscm8sIHU4ICpsMmgsCiAJc3RydWN0IGlwaGRyICppcCwgc3RydWN0IHRjcGhkciAqdGNwLCB1MzIgdGNwX3B5bGRfbGVuLCB1MTYgdmxhbl90YWcpCiB7Ci0JREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCURCR19QUklOVChJTkZPX0RCRywiJXM6IEJlZW4gaGVyZS4uLlxuIiwgX19mdW5jX18pOwogCWxyby0+bDJoID0gbDJoOwogCWxyby0+aXBoID0gaXA7CiAJbHJvLT50Y3BoID0gdGNwOwpAQCAtODM3NSw3ICs4Mzc3LDcgQEAKIAlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBscm8tPnRjcGg7CiAJX19zdW0xNiBuY2hrOwogCXN0cnVjdCBzdGF0X2Jsb2NrICpzdGF0aW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOwotCURCR19QUklOVChJTkZPX0RCRywiJXM6IEJlZW4gaGVyZS4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwlEQkdfUFJJTlQoSU5GT19EQkcsIiVzOiBCZWVuIGhlcmUuLi5cbiIsIF9fZnVuY19fKTsKIAogCS8qIFVwZGF0ZSBMMyBoZWFkZXIgKi8KIAlpcC0+dG90X2xlbiA9IGh0b25zKGxyby0+dG90YWxfbGVuKTsKQEAgLTg0MDMsNyArODQwNSw3IEBACiBzdGF0aWMgdm9pZCBhZ2dyZWdhdGVfbmV3X3J4KHN0cnVjdCBscm8gKmxybywgc3RydWN0IGlwaGRyICppcCwKIAkJc3RydWN0IHRjcGhkciAqdGNwLCB1MzIgbDRfcHlsZCkKIHsKLQlEQkdfUFJJTlQoSU5GT19EQkcsIiVzOiBCZWVuIGhlcmUuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX2Z1bmNfXyk7CiAJbHJvLT50b3RhbF9sZW4gKz0gbDRfcHlsZDsKIAlscm8tPmZyYWdzX2xlbiArPSBsNF9weWxkOwogCWxyby0+dGNwX25leHRfc2VxICs9IGw0X3B5bGQ7CkBAIC04NDI3LDcgKzg0MjksNyBAQAogewogCXU4ICpwdHI7CiAKLQlEQkdfUFJJTlQoSU5GT19EQkcsIiVzOiBCZWVuIGhlcmUuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIXRjcF9weWxkX2xlbikgewogCQkvKiBSdW50IGZyYW1lIG9yIGEgcHVyZSBhY2sgKi8KQEAgLTg1MDksNyArODUxMSw3IEBACiAKIAkJCWlmICgoKmxybyktPnRjcF9uZXh0X3NlcSAhPSBudG9obCh0Y3BoLT5zZXEpKSB7CiAJCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6T3V0IG9mIG9yZGVyLiBleHBlY3RlZCAiCi0JCQkJCSAgIjB4JXgsIGFjdHVhbCAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgIjB4JXgsIGFjdHVhbCAweCV4XG4iLCBfX2Z1bmNfXywKIAkJCQkJICAoKmxybyktPnRjcF9uZXh0X3NlcSwKIAkJCQkJICBudG9obCh0Y3BoLT5zZXEpKTsKIApAQCAtODU0OSw3ICs4NTUxLDcgQEAKIAogCWlmIChyZXQgPT0gMCkgeyAvKiBzZXNzaW9ucyBleGNlZWRlZCAqLwogCQlEQkdfUFJJTlQoSU5GT19EQkcsIiVzOkFsbCBMUk8gc2Vzc2lvbnMgYWxyZWFkeSBpbiB1c2VcbiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCQkgIF9fZnVuY19fKTsKIAkJKmxybyA9IE5VTEw7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtODU3MSw3ICs4NTczLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJREJHX1BSSU5UKEVSUl9EQkcsIiVzOkRvbnQga25vdywgY2FuJ3Qgc2F5ISFcbiIsCi0JCQkJX19GVU5DVElPTl9fKTsKKwkJCQlfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTg1OTIsNyArODU5NCw3IEBACiAKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCWlmIChzcC0+dmxncnAgJiYgdmxhbl90YWcKLQkJJiYgKHZsYW5fc3RyaXBfZmxhZykpIHsKKwkJJiYgKHNwLT52bGFuX3N0cmlwX2ZsYWcpKSB7CiAJCS8qIFF1ZXVlaW5nIHRoZSB2bGFuIGZyYW1lIHRvIHRoZSB1cHBlciBsYXllciAqLwogCQlpZiAoc3AtPmNvbmZpZy5uYXBpKQogCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgc3AtPnZsZ3JwLCB2bGFuX3RhZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKaW5kZXggNjcyMmEyZi4uNTVjYjk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5oCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtOTYyLDYgKzk2Miw3IEBACiAJaW50IHRhc2tfZmxhZzsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfdGltZTsKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisJaW50IHZsYW5fc3RyaXBfZmxhZzsKICNkZWZpbmUgTVNJWF9GTEcgICAgICAgICAgICAgICAgMHhBNQogCWludCBudW1fZW50cmllczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwppbmRleCBmZTQxZTRlLi4yNjE1ZDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqc2JtX2RldjsJLyogcG9pbnRlciB0byBsaW51eCBkZXZpY2UgKi8KIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKIAlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5X2RldjsJLyogdGhlIGFzc29jaWF0ZWQgUEhZIGRldmljZSAqLwotCXN0cnVjdCBtaWlfYnVzCQltaWlfYnVzOwkvKiB0aGUgTUlJIGJ1cyAqLworCXN0cnVjdCBtaWlfYnVzCQkqbWlpX2J1czsJLyogdGhlIE1JSSBidXMgKi8KIAlpbnQJCQlwaHlfaXJxW1BIWV9NQVhfQUREUl07CiAJc3BpbmxvY2tfdAkJc2JtX2xvY2s7CS8qIHNwaW4gbG9jayAqLwogCWludAkJCXNibV9kZXZmbGFnczsJLyogY3VycmVudCBkZXZpY2UgZmxhZ3MgKi8KQEAgLTIwNjksOSArMjA2OSwxMCBAQAogc3RhdGljIGludCBzYm1hY19zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBsb2NrIGV0aCBpcnEgKi8KLQlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnNibV9sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIFB1dCB0aGUgYnVmZmVyIG9uIHRoZSB0cmFuc21pdCByaW5nLiAgSWYgd2UKQEAgLTIwODEsMTQgKzIwODIsMTQgQEAKIAlpZiAoc2JkbWFfYWRkX3R4YnVmZmVyKCYoc2MtPnNibV90eGRtYSksc2tiKSkgewogCQkvKiBYWFggc2F2ZSBza2IgdGhhdCB3ZSBjb3VsZCBub3Qgc2VuZCAqLwogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCXNwaW5fdW5sb2NrX2lycSgmc2MtPnNibV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnNibV9sb2NrLCBmbGFncyk7CiAKIAkJcmV0dXJuIDE7CiAJfQogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAKLQlzcGluX3VubG9ja19pcnEgKCZzYy0+c2JtX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzQ3LDEwICsyMzQ4LDE3IEBACiAJLyogVGhpcyBpcyBuZWVkZWQgZm9yIFBBU1MyIGZvciBSeCBIL1cgY2hlY2tzdW0gZmVhdHVyZSAqLwogCXNibWFjX3NldF9pcGhkcl9vZmZzZXQoc2MpOwogCisJc2MtPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKHNjLT5taWlfYnVzID09IE5VTEwpIHsKKwkJc2JtYWNfdW5pbml0Y3R4KHNjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzLiVkOiB1bmFibGUgdG8gcmVnaXN0ZXIgbmV0ZGV2XG4iLAogCQkgICAgICAgc2JtYWNfc3RyaW5nLCBpZHgpOworCQltZGlvYnVzX2ZyZWUoc2MtPm1paV9idXMpOwogCQlzYm1hY191bmluaXRjdHgoc2MpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIzNjgsMTcgKzIzNzYsMTcgQEAKIAlwcl9pbmZvKCIlczogU2lCeXRlIEV0aGVybmV0IGF0IDB4JTA4THgsIGFkZHJlc3M6ICVzXG4iLAogCSAgICAgICBkZXYtPm5hbWUsIGJhc2UsIHByaW50X21hYyhtYWMsIGVhZGRyKSk7CiAKLQlzYy0+bWlpX2J1cy5uYW1lID0gc2JtYWNfbWRpb19zdHJpbmc7Ci0Jc25wcmludGYoc2MtPm1paV9idXMuaWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwgaWR4KTsKLQlzYy0+bWlpX2J1cy5wcml2ID0gc2M7Ci0Jc2MtPm1paV9idXMucmVhZCA9IHNibWFjX21paV9yZWFkOwotCXNjLT5taWlfYnVzLndyaXRlID0gc2JtYWNfbWlpX3dyaXRlOwotCXNjLT5taWlfYnVzLmlycSA9IHNjLT5waHlfaXJxOworCXNjLT5taWlfYnVzLT5uYW1lID0gc2JtYWNfbWRpb19zdHJpbmc7CisJc25wcmludGYoc2MtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIGlkeCk7CisJc2MtPm1paV9idXMtPnByaXYgPSBzYzsKKwlzYy0+bWlpX2J1cy0+cmVhZCA9IHNibWFjX21paV9yZWFkOworCXNjLT5taWlfYnVzLT53cml0ZSA9IHNibWFjX21paV93cml0ZTsKKwlzYy0+bWlpX2J1cy0+aXJxID0gc2MtPnBoeV9pcnE7CiAJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgKytpKQotCQlzYy0+bWlpX2J1cy5pcnFbaV0gPSBTQk1BQ19QSFlfSU5UOworCQlzYy0+bWlpX2J1cy0+aXJxW2ldID0gU0JNQUNfUEhZX0lOVDsKIAotCXNjLT5taWlfYnVzLmRldiA9ICZwbGRldi0+ZGV2OwotCWRldl9zZXRfZHJ2ZGF0YSgmcGxkZXYtPmRldiwgJnNjLT5taWlfYnVzKTsKKwlzYy0+bWlpX2J1cy0+cGFyZW50ID0gJnBsZGV2LT5kZXY7CisJZGV2X3NldF9kcnZkYXRhKCZwbGRldi0+ZGV2LCBzYy0+bWlpX2J1cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0MDksNyArMjQxNyw3IEBACiAJLyoKIAkgKiBQcm9iZSBQSFkgYWRkcmVzcwogCSAqLwotCWVyciA9IG1kaW9idXNfcmVnaXN0ZXIoJnNjLT5taWlfYnVzKTsKKwllcnIgPSBtZGlvYnVzX3JlZ2lzdGVyKHNjLT5taWlfYnVzKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZWdpc3RlciBNRElPIGJ1c1xuIiwKIAkJICAgICAgIGRldi0+bmFtZSk7CkBAIC0yNDQ2LDcgKzI0NTQsNyBAQAogCXJldHVybiAwOwogCiBvdXRfdW5yZWdpc3RlcjoKLQltZGlvYnVzX3VucmVnaXN0ZXIoJnNjLT5taWlfYnVzKTsKKwltZGlvYnVzX3VucmVnaXN0ZXIoc2MtPm1paV9idXMpOwogCiBvdXRfdW5pcnE6CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CkBAIC0yNDYyLDcgKzI0NzAsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgaSsrKSB7Ci0JCXBoeV9kZXYgPSBzYy0+bWlpX2J1cy5waHlfbWFwW2ldOworCQlwaHlfZGV2ID0gc2MtPm1paV9idXMtPnBoeV9tYXBbaV07CiAJCWlmIChwaHlfZGV2KQogCQkJYnJlYWs7CiAJfQpAQCAtMjU2OCwxNCArMjU3NiwxNSBAQAogc3RhdGljIHZvaWQgc2JtYWNfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOwogCiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCi0Jc3Bpbl91bmxvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKIAogCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0XG4iLGRldi0+bmFtZSk7CiB9CkBAIC0yNjM5LDcgKzI2NDgsNyBAQAogCXBoeV9kaXNjb25uZWN0KHNjLT5waHlfZGV2KTsKIAlzYy0+cGh5X2RldiA9IE5VTEw7CiAKLQltZGlvYnVzX3VucmVnaXN0ZXIoJnNjLT5taWlfYnVzKTsKKwltZGlvYnVzX3VucmVnaXN0ZXIoc2MtPm1paV9idXMpOwogCiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAKQEAgLTI3NDgsNiArMjc1Nyw3IEBACiAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCXNibWFjX3VuaW5pdGN0eChzYyk7CisJbWRpb2J1c19mcmVlKHNjLT5taWlfYnVzKTsKIAlpb3VubWFwKHNjLT5zYm1fYmFzZSk7CiAJZnJlZV9uZXRkZXYoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2JpdGZpZWxkLmggYi9kcml2ZXJzL25ldC9zZmMvYml0ZmllbGQuaAppbmRleCAyYzc5ZDI3Li5kOTVjMjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvYml0ZmllbGQuaAorKysgYi9kcml2ZXJzL25ldC9zZmMvYml0ZmllbGQuaApAQCAtNTIsOSArNTIsOSBAQAogICoKICAqIFRoZSBtYXhpbXVtIHdpZHRoIG1hc2sgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGlzIDY0IGJpdHMuCiAgKi8KLSNkZWZpbmUgRUZYX01BU0s2NChmaWVsZCkJCQkJCVwKLQkoRUZYX1dJRFRIKGZpZWxkKSA9PSA2NCA/IH4oKHU2NCkgMCkgOgkJXAotCSAoKCgoKHU2NCkgMSkgPDwgRUZYX1dJRFRIKGZpZWxkKSkpIC0gMSkpCisjZGVmaW5lIEVGWF9NQVNLNjQod2lkdGgpCQkJXAorCSgod2lkdGgpID09IDY0ID8gfigodTY0KSAwKSA6CQlcCisJICgoKCgodTY0KSAxKSA8PCAod2lkdGgpKSkgLSAxKSkKIAogLyogTWFzayBlcXVhbCBpbiB3aWR0aCB0byB0aGUgc3BlY2lmaWVkIGZpZWxkLgogICoKQEAgLTYzLDkgKzYzLDkgQEAKICAqIFRoZSBtYXhpbXVtIHdpZHRoIG1hc2sgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGlzIDMyIGJpdHMuICBVc2UKICAqIEVGWF9NQVNLNjQgZm9yIGhpZ2hlciB3aWR0aCBmaWVsZHMuCiAgKi8KLSNkZWZpbmUgRUZYX01BU0szMihmaWVsZCkJCQkJCVwKLQkoRUZYX1dJRFRIKGZpZWxkKSA9PSAzMiA/IH4oKHUzMikgMCkgOgkJXAotCSAoKCgoKHUzMikgMSkgPDwgRUZYX1dJRFRIKGZpZWxkKSkpIC0gMSkpCisjZGVmaW5lIEVGWF9NQVNLMzIod2lkdGgpCQkJXAorCSgod2lkdGgpID09IDMyID8gfigodTMyKSAwKSA6CQlcCisJICgoKCgodTMyKSAxKSA8PCAod2lkdGgpKSkgLSAxKSkKIAogLyogQSBkb3VibGV3b3JkIChpLmUuIDQgYnl0ZSkgZGF0YXR5cGUgLSBsaXR0bGUtZW5kaWFuIGluIEhXICovCiB0eXBlZGVmIHVuaW9uIGVmeF9kd29yZCB7CkBAIC0xMzgsNDQgKzEzOCw0OSBAQAogCUVGWF9FWFRSQUNUX05BVElWRShsZTMyX3RvX2NwdShlbGVtZW50KSwgbWluLCBtYXgsIGxvdywgaGlnaCkKIAogI2RlZmluZSBFRlhfRVhUUkFDVF9PV09SRDY0KG93b3JkLCBsb3csIGhpZ2gpCQkJCVwKLQkoRUZYX0VYVFJBQ1Q2NCgob3dvcmQpLnU2NFswXSwgMCwgNjMsIGxvdywgaGlnaCkgfAkJXAotCSBFRlhfRVhUUkFDVDY0KChvd29yZCkudTY0WzFdLCA2NCwgMTI3LCBsb3csIGhpZ2gpKQorCSgoRUZYX0VYVFJBQ1Q2NCgob3dvcmQpLnU2NFswXSwgMCwgNjMsIGxvdywgaGlnaCkgfAkJXAorCSAgRUZYX0VYVFJBQ1Q2NCgob3dvcmQpLnU2NFsxXSwgNjQsIDEyNywgbG93LCBoaWdoKSkgJgkJXAorCSBFRlhfTUFTSzY0KGhpZ2ggKyAxIC0gbG93KSkKIAogI2RlZmluZSBFRlhfRVhUUkFDVF9RV09SRDY0KHF3b3JkLCBsb3csIGhpZ2gpCQkJCVwKLQlFRlhfRVhUUkFDVDY0KChxd29yZCkudTY0WzBdLCAwLCA2MywgbG93LCBoaWdoKQorCShFRlhfRVhUUkFDVDY0KChxd29yZCkudTY0WzBdLCAwLCA2MywgbG93LCBoaWdoKSAmCQlcCisJIEVGWF9NQVNLNjQoaGlnaCArIDEgLSBsb3cpKQogCiAjZGVmaW5lIEVGWF9FWFRSQUNUX09XT1JEMzIob3dvcmQsIGxvdywgaGlnaCkJCQkJXAotCShFRlhfRVhUUkFDVDMyKChvd29yZCkudTMyWzBdLCAwLCAzMSwgbG93LCBoaWdoKSB8CQlcCi0JIEVGWF9FWFRSQUNUMzIoKG93b3JkKS51MzJbMV0sIDMyLCA2MywgbG93LCBoaWdoKSB8CQlcCi0JIEVGWF9FWFRSQUNUMzIoKG93b3JkKS51MzJbMl0sIDY0LCA5NSwgbG93LCBoaWdoKSB8CQlcCi0JIEVGWF9FWFRSQUNUMzIoKG93b3JkKS51MzJbM10sIDk2LCAxMjcsIGxvdywgaGlnaCkpCisJKChFRlhfRVhUUkFDVDMyKChvd29yZCkudTMyWzBdLCAwLCAzMSwgbG93LCBoaWdoKSB8CQlcCisJICBFRlhfRVhUUkFDVDMyKChvd29yZCkudTMyWzFdLCAzMiwgNjMsIGxvdywgaGlnaCkgfAkJXAorCSAgRUZYX0VYVFJBQ1QzMigob3dvcmQpLnUzMlsyXSwgNjQsIDk1LCBsb3csIGhpZ2gpIHwJCVwKKwkgIEVGWF9FWFRSQUNUMzIoKG93b3JkKS51MzJbM10sIDk2LCAxMjcsIGxvdywgaGlnaCkpICYJCVwKKwkgRUZYX01BU0szMihoaWdoICsgMSAtIGxvdykpCiAKICNkZWZpbmUgRUZYX0VYVFJBQ1RfUVdPUkQzMihxd29yZCwgbG93LCBoaWdoKQkJCQlcCi0JKEVGWF9FWFRSQUNUMzIoKHF3b3JkKS51MzJbMF0sIDAsIDMxLCBsb3csIGhpZ2gpIHwJCVwKLQkgRUZYX0VYVFJBQ1QzMigocXdvcmQpLnUzMlsxXSwgMzIsIDYzLCBsb3csIGhpZ2gpKQorCSgoRUZYX0VYVFJBQ1QzMigocXdvcmQpLnUzMlswXSwgMCwgMzEsIGxvdywgaGlnaCkgfAkJXAorCSAgRUZYX0VYVFJBQ1QzMigocXdvcmQpLnUzMlsxXSwgMzIsIDYzLCBsb3csIGhpZ2gpKSAmCQlcCisJIEVGWF9NQVNLMzIoaGlnaCArIDEgLSBsb3cpKQogCi0jZGVmaW5lIEVGWF9FWFRSQUNUX0RXT1JEKGR3b3JkLCBsb3csIGhpZ2gpCQkJCVwKLQlFRlhfRVhUUkFDVDMyKChkd29yZCkudTMyWzBdLCAwLCAzMSwgbG93LCBoaWdoKQorI2RlZmluZSBFRlhfRVhUUkFDVF9EV09SRChkd29yZCwgbG93LCBoaWdoKQkJCVwKKwkoRUZYX0VYVFJBQ1QzMigoZHdvcmQpLnUzMlswXSwgMCwgMzEsIGxvdywgaGlnaCkgJglcCisJIEVGWF9NQVNLMzIoaGlnaCArIDEgLSBsb3cpKQogCi0jZGVmaW5lIEVGWF9PV09SRF9GSUVMRDY0KG93b3JkLCBmaWVsZCkJCQkJCVwKLQkoRUZYX0VYVFJBQ1RfT1dPUkQ2NChvd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLCBFRlhfSElHSF9CSVQoZmllbGQpKSBcCi0JICYgRUZYX01BU0s2NChmaWVsZCkpCisjZGVmaW5lIEVGWF9PV09SRF9GSUVMRDY0KG93b3JkLCBmaWVsZCkJCQkJXAorCUVGWF9FWFRSQUNUX09XT1JENjQob3dvcmQsIEVGWF9MT1dfQklUKGZpZWxkKSwJCVwKKwkJCSAgICBFRlhfSElHSF9CSVQoZmllbGQpKQogCi0jZGVmaW5lIEVGWF9RV09SRF9GSUVMRDY0KHF3b3JkLCBmaWVsZCkJCQkJCVwKLQkoRUZYX0VYVFJBQ1RfUVdPUkQ2NChxd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLCBFRlhfSElHSF9CSVQoZmllbGQpKSBcCi0JICYgRUZYX01BU0s2NChmaWVsZCkpCisjZGVmaW5lIEVGWF9RV09SRF9GSUVMRDY0KHF3b3JkLCBmaWVsZCkJCQkJXAorCUVGWF9FWFRSQUNUX1FXT1JENjQocXdvcmQsIEVGWF9MT1dfQklUKGZpZWxkKSwJCVwKKwkJCSAgICBFRlhfSElHSF9CSVQoZmllbGQpKQogCi0jZGVmaW5lIEVGWF9PV09SRF9GSUVMRDMyKG93b3JkLCBmaWVsZCkJCQkJCVwKLQkoRUZYX0VYVFJBQ1RfT1dPUkQzMihvd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLCBFRlhfSElHSF9CSVQoZmllbGQpKSBcCi0JICYgRUZYX01BU0szMihmaWVsZCkpCisjZGVmaW5lIEVGWF9PV09SRF9GSUVMRDMyKG93b3JkLCBmaWVsZCkJCQkJXAorCUVGWF9FWFRSQUNUX09XT1JEMzIob3dvcmQsIEVGWF9MT1dfQklUKGZpZWxkKSwJCVwKKwkJCSAgICBFRlhfSElHSF9CSVQoZmllbGQpKQogCi0jZGVmaW5lIEVGWF9RV09SRF9GSUVMRDMyKHF3b3JkLCBmaWVsZCkJCQkJCVwKLQkoRUZYX0VYVFJBQ1RfUVdPUkQzMihxd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLCBFRlhfSElHSF9CSVQoZmllbGQpKSBcCi0JICYgRUZYX01BU0szMihmaWVsZCkpCisjZGVmaW5lIEVGWF9RV09SRF9GSUVMRDMyKHF3b3JkLCBmaWVsZCkJCQkJXAorCUVGWF9FWFRSQUNUX1FXT1JEMzIocXdvcmQsIEVGWF9MT1dfQklUKGZpZWxkKSwJCVwKKwkJCSAgICBFRlhfSElHSF9CSVQoZmllbGQpKQogCi0jZGVmaW5lIEVGWF9EV09SRF9GSUVMRChkd29yZCwgZmllbGQpCQkJCQkgICBcCi0JKEVGWF9FWFRSQUNUX0RXT1JEKGR3b3JkLCBFRlhfTE9XX0JJVChmaWVsZCksIEVGWF9ISUdIX0JJVChmaWVsZCkpIFwKLQkgJiBFRlhfTUFTSzMyKGZpZWxkKSkKKyNkZWZpbmUgRUZYX0RXT1JEX0ZJRUxEKGR3b3JkLCBmaWVsZCkJCQkJXAorCUVGWF9FWFRSQUNUX0RXT1JEKGR3b3JkLCBFRlhfTE9XX0JJVChmaWVsZCksCQlcCisJCQkgIEVGWF9ISUdIX0JJVChmaWVsZCkpCiAKICNkZWZpbmUgRUZYX09XT1JEX0lTX1pFUk82NChvd29yZCkJCQkJCVwKIAkoKChvd29yZCkudTY0WzBdIHwgKG93b3JkKS51NjRbMV0pID09IChfX2ZvcmNlIF9fbGU2NCkgMCkKQEAgLTQxMSw2OSArNDE2LDEwMiBAQAogICogZm9yIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbnMuCiAgKgogICovCi0KICNkZWZpbmUgRUZYX0lOVkVSVF9PV09SRChvd29yZCkgZG8gewkJXAogCShvd29yZCkudTY0WzBdID0gfigob3dvcmQpLnU2NFswXSk7CVwKIAkob3dvcmQpLnU2NFsxXSA9IH4oKG93b3JkKS51NjRbMV0pOwlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBFRlhfSU5TRVJUX0ZJRUxENjQoLi4uKQkJCQkJXAotCWNwdV90b19sZTY0KEVGWF9JTlNFUlRfRklFTERfTkFUSVZFKF9fVkFfQVJHU19fKSkKKyNkZWZpbmUgRUZYX0FORF9PV09SRChvd29yZCwgZnJvbSwgbWFzaykJCQlcCisJZG8gewkJCQkJCQlcCisJCShvd29yZCkudTY0WzBdID0gKGZyb20pLnU2NFswXSAmIChtYXNrKS51NjRbMF07CVwKKwkJKG93b3JkKS51NjRbMV0gPSAoZnJvbSkudTY0WzFdICYgKG1hc2spLnU2NFsxXTsJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgRUZYX0lOU0VSVF9GSUVMRDMyKC4uLikJCQkJCVwKLQljcHVfdG9fbGUzMihFRlhfSU5TRVJUX0ZJRUxEX05BVElWRShfX1ZBX0FSR1NfXykpCisjZGVmaW5lIEVGWF9PUl9PV09SRChvd29yZCwgZnJvbSwgbWFzaykJCQkJXAorCWRvIHsJCQkJCQkJXAorCQkob3dvcmQpLnU2NFswXSA9IChmcm9tKS51NjRbMF0gfCAobWFzaykudTY0WzBdOwlcCisJCShvd29yZCkudTY0WzFdID0gKGZyb20pLnU2NFsxXSB8IChtYXNrKS51NjRbMV07CVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVGWF9JTlBMQUNFX01BU0s2NChtaW4sIG1heCwgZmllbGQpCQkJXAotCUVGWF9JTlNFUlRfRklFTEQ2NChtaW4sIG1heCwgZmllbGQsIEVGWF9NQVNLNjQoZmllbGQpKQorI2RlZmluZSBFRlhfSU5TRVJUNjQobWluLCBtYXgsIGxvdywgaGlnaCwgdmFsdWUpCQkJXAorCWNwdV90b19sZTY0KEVGWF9JTlNFUlRfTkFUSVZFKG1pbiwgbWF4LCBsb3csIGhpZ2gsIHZhbHVlKSkKIAotI2RlZmluZSBFRlhfSU5QTEFDRV9NQVNLMzIobWluLCBtYXgsIGZpZWxkKQkJCVwKLQlFRlhfSU5TRVJUX0ZJRUxEMzIobWluLCBtYXgsIGZpZWxkLCBFRlhfTUFTSzMyKGZpZWxkKSkKKyNkZWZpbmUgRUZYX0lOU0VSVDMyKG1pbiwgbWF4LCBsb3csIGhpZ2gsIHZhbHVlKQkJCVwKKwljcHVfdG9fbGUzMihFRlhfSU5TRVJUX05BVElWRShtaW4sIG1heCwgbG93LCBoaWdoLCB2YWx1ZSkpCiAKLSNkZWZpbmUgRUZYX1NFVF9PV09SRF9GSUVMRDY0KG93b3JkLCBmaWVsZCwgdmFsdWUpIGRvIHsJCQlcCisjZGVmaW5lIEVGWF9JTlBMQUNFX01BU0s2NChtaW4sIG1heCwgbG93LCBoaWdoKQkJCQlcCisJRUZYX0lOU0VSVDY0KG1pbiwgbWF4LCBsb3csIGhpZ2gsIEVGWF9NQVNLNjQoaGlnaCArIDEgLSBsb3cpKQorCisjZGVmaW5lIEVGWF9JTlBMQUNFX01BU0szMihtaW4sIG1heCwgbG93LCBoaWdoKQkJCQlcCisJRUZYX0lOU0VSVDMyKG1pbiwgbWF4LCBsb3csIGhpZ2gsIEVGWF9NQVNLMzIoaGlnaCArIDEgLSBsb3cpKQorCisjZGVmaW5lIEVGWF9TRVRfT1dPUkQ2NChvd29yZCwgbG93LCBoaWdoLCB2YWx1ZSkgZG8gewkJCVwKIAkob3dvcmQpLnU2NFswXSA9ICgoKG93b3JkKS51NjRbMF0gCQkJCVwKLQkJCSAgICYgfkVGWF9JTlBMQUNFX01BU0s2NCgwLCAgNjMsIGZpZWxkKSkJXAotCQkJICB8IEVGWF9JTlNFUlRfRklFTEQ2NCgwLCAgNjMsIGZpZWxkLCB2YWx1ZSkpOyAgXAorCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzY0KDAsICA2MywgbG93LCBoaWdoKSkJXAorCQkJICB8IEVGWF9JTlNFUlQ2NCgwLCAgNjMsIGxvdywgaGlnaCwgdmFsdWUpKTsJXAogCShvd29yZCkudTY0WzFdID0gKCgob3dvcmQpLnU2NFsxXSAJCQkJXAotCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzY0KDY0LCAxMjcsIGZpZWxkKSkJXAotCQkJICB8IEVGWF9JTlNFUlRfRklFTEQ2NCg2NCwgMTI3LCBmaWVsZCwgdmFsdWUpKTsgXAorCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzY0KDY0LCAxMjcsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUNjQoNjQsIDEyNywgbG93LCBoaWdoLCB2YWx1ZSkpOwlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBFRlhfU0VUX1FXT1JEX0ZJRUxENjQocXdvcmQsIGZpZWxkLCB2YWx1ZSkgZG8gewkJCVwKKyNkZWZpbmUgRUZYX1NFVF9RV09SRDY0KHF3b3JkLCBsb3csIGhpZ2gsIHZhbHVlKSBkbyB7CQkJXAogCShxd29yZCkudTY0WzBdID0gKCgocXdvcmQpLnU2NFswXSAJCQkJXAotCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzY0KDAsIDYzLCBmaWVsZCkpCQlcCi0JCQkgIHwgRUZYX0lOU0VSVF9GSUVMRDY0KDAsIDYzLCBmaWVsZCwgdmFsdWUpKTsJXAorCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzY0KDAsIDYzLCBsb3csIGhpZ2gpKQlcCisJCQkgIHwgRUZYX0lOU0VSVDY0KDAsIDYzLCBsb3csIGhpZ2gsIHZhbHVlKSk7CVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVGWF9TRVRfT1dPUkRfRklFTEQzMihvd29yZCwgZmllbGQsIHZhbHVlKSBkbyB7CQkJXAorI2RlZmluZSBFRlhfU0VUX09XT1JEMzIob3dvcmQsIGxvdywgaGlnaCwgdmFsdWUpIGRvIHsJCQlcCiAJKG93b3JkKS51MzJbMF0gPSAoKChvd29yZCkudTMyWzBdIAkJCQlcCi0JCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoMCwgMzEsIGZpZWxkKSkJCVwKLQkJCSAgfCBFRlhfSU5TRVJUX0ZJRUxEMzIoMCwgMzEsIGZpZWxkLCB2YWx1ZSkpOwlcCisJCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoMCwgMzEsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUMzIoMCwgMzEsIGxvdywgaGlnaCwgdmFsdWUpKTsJXAogCShvd29yZCkudTMyWzFdID0gKCgob3dvcmQpLnUzMlsxXSAJCQkJXAotCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzMyKDMyLCA2MywgZmllbGQpKQlcCi0JCQkgIHwgRUZYX0lOU0VSVF9GSUVMRDMyKDMyLCA2MywgZmllbGQsIHZhbHVlKSk7CVwKKwkJCSAgICYgfkVGWF9JTlBMQUNFX01BU0szMigzMiwgNjMsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUMzIoMzIsIDYzLCBsb3csIGhpZ2gsIHZhbHVlKSk7CVwKIAkob3dvcmQpLnUzMlsyXSA9ICgoKG93b3JkKS51MzJbMl0gCQkJCVwKLQkJCSAgICYgfkVGWF9JTlBMQUNFX01BU0szMig2NCwgOTUsIGZpZWxkKSkJXAotCQkJICB8IEVGWF9JTlNFUlRfRklFTEQzMig2NCwgOTUsIGZpZWxkLCB2YWx1ZSkpOwlcCisJCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoNjQsIDk1LCBsb3csIGhpZ2gpKQlcCisJCQkgIHwgRUZYX0lOU0VSVDMyKDY0LCA5NSwgbG93LCBoaWdoLCB2YWx1ZSkpOwlcCiAJKG93b3JkKS51MzJbM10gPSAoKChvd29yZCkudTMyWzNdIAkJCQlcCi0JCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoOTYsIDEyNywgZmllbGQpKQlcCi0JCQkgIHwgRUZYX0lOU0VSVF9GSUVMRDMyKDk2LCAxMjcsIGZpZWxkLCB2YWx1ZSkpOwlcCisJCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoOTYsIDEyNywgbG93LCBoaWdoKSkJXAorCQkJICB8IEVGWF9JTlNFUlQzMig5NiwgMTI3LCBsb3csIGhpZ2gsIHZhbHVlKSk7CVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVGWF9TRVRfUVdPUkRfRklFTEQzMihxd29yZCwgZmllbGQsIHZhbHVlKSBkbyB7CQkJXAorI2RlZmluZSBFRlhfU0VUX1FXT1JEMzIocXdvcmQsIGxvdywgaGlnaCwgdmFsdWUpIGRvIHsJCQlcCiAJKHF3b3JkKS51MzJbMF0gPSAoKChxd29yZCkudTMyWzBdIAkJCQlcCi0JCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoMCwgMzEsIGZpZWxkKSkJCVwKLQkJCSAgfCBFRlhfSU5TRVJUX0ZJRUxEMzIoMCwgMzEsIGZpZWxkLCB2YWx1ZSkpOwlcCisJCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoMCwgMzEsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUMzIoMCwgMzEsIGxvdywgaGlnaCwgdmFsdWUpKTsJXAogCShxd29yZCkudTMyWzFdID0gKCgocXdvcmQpLnUzMlsxXSAJCQkJXAotCQkJICAgJiB+RUZYX0lOUExBQ0VfTUFTSzMyKDMyLCA2MywgZmllbGQpKQlcCi0JCQkgIHwgRUZYX0lOU0VSVF9GSUVMRDMyKDMyLCA2MywgZmllbGQsIHZhbHVlKSk7CVwKKwkJCSAgICYgfkVGWF9JTlBMQUNFX01BU0szMigzMiwgNjMsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUMzIoMzIsIDYzLCBsb3csIGhpZ2gsIHZhbHVlKSk7CVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVGWF9TRVRfRFdPUkRfRklFTEQoZHdvcmQsIGZpZWxkLCB2YWx1ZSkgZG8gewkJCVwKLQkoZHdvcmQpLnUzMlswXSA9ICgoKGR3b3JkKS51MzJbMF0gCQkJCVwKLQkJCSAgICYgfkVGWF9JTlBMQUNFX01BU0szMigwLCAzMSwgZmllbGQpKQkJXAotCQkJICB8IEVGWF9JTlNFUlRfRklFTEQzMigwLCAzMSwgZmllbGQsIHZhbHVlKSk7CVwKKyNkZWZpbmUgRUZYX1NFVF9EV09SRDMyKGR3b3JkLCBsb3csIGhpZ2gsIHZhbHVlKSBkbyB7CQkJXAorCShkd29yZCkudTMyWzBdID0gKCgoZHdvcmQpLnUzMlswXQkJCQlcCisJCQkgICAmIH5FRlhfSU5QTEFDRV9NQVNLMzIoMCwgMzEsIGxvdywgaGlnaCkpCVwKKwkJCSAgfCBFRlhfSU5TRVJUMzIoMCwgMzEsIGxvdywgaGlnaCwgdmFsdWUpKTsJXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgRUZYX1NFVF9PV09SRF9GSUVMRDY0KG93b3JkLCBmaWVsZCwgdmFsdWUpCQkJXAorCUVGWF9TRVRfT1dPUkQ2NChvd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLAkJCVwKKwkJCSBFRlhfSElHSF9CSVQoZmllbGQpLCB2YWx1ZSkKKworI2RlZmluZSBFRlhfU0VUX1FXT1JEX0ZJRUxENjQocXdvcmQsIGZpZWxkLCB2YWx1ZSkJCQlcCisJRUZYX1NFVF9RV09SRDY0KHF3b3JkLCBFRlhfTE9XX0JJVChmaWVsZCksCQkJXAorCQkJIEVGWF9ISUdIX0JJVChmaWVsZCksIHZhbHVlKQorCisjZGVmaW5lIEVGWF9TRVRfT1dPUkRfRklFTEQzMihvd29yZCwgZmllbGQsIHZhbHVlKQkJCVwKKwlFRlhfU0VUX09XT1JEMzIob3dvcmQsIEVGWF9MT1dfQklUKGZpZWxkKSwJCQlcCisJCQkgRUZYX0hJR0hfQklUKGZpZWxkKSwgdmFsdWUpCisKKyNkZWZpbmUgRUZYX1NFVF9RV09SRF9GSUVMRDMyKHF3b3JkLCBmaWVsZCwgdmFsdWUpCQkJXAorCUVGWF9TRVRfUVdPUkQzMihxd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLAkJCVwKKwkJCSBFRlhfSElHSF9CSVQoZmllbGQpLCB2YWx1ZSkKKworI2RlZmluZSBFRlhfU0VUX0RXT1JEX0ZJRUxEKGR3b3JkLCBmaWVsZCwgdmFsdWUpCQkJXAorCUVGWF9TRVRfRFdPUkQzMihkd29yZCwgRUZYX0xPV19CSVQoZmllbGQpLAkJCVwKKwkJCSBFRlhfSElHSF9CSVQoZmllbGQpLCB2YWx1ZSkKKworCisKICNpZiBCSVRTX1BFUl9MT05HID09IDY0CiAjZGVmaW5lIEVGWF9TRVRfT1dPUkRfRklFTEQgRUZYX1NFVF9PV09SRF9GSUVMRDY0CiAjZGVmaW5lIEVGWF9TRVRfUVdPUkRfRklFTEQgRUZYX1NFVF9RV09SRF9GSUVMRDY0CkBAIC01MDIsNCArNTQwLDEwIEBACiAjZGVmaW5lIEVGWF9ETUFfVFlQRV9XSURUSCh3aWR0aCkgXAogCSgoKHdpZHRoKSA8IERNQV9BRERSX1RfV0lEVEgpID8gKHdpZHRoKSA6IERNQV9BRERSX1RfV0lEVEgpCiAKKworLyogU3RhdGljIGluaXRpYWxpc2VyICovCisjZGVmaW5lIEVGWF9PV09SRDMyKGEsIGIsIGMsIGQpCQkJCQkJXAorCXsgLnUzMiA9IHsgX19jb25zdGFudF9jcHVfdG9fbGUzMihhKSwgX19jb25zdGFudF9jcHVfdG9fbGUzMihiKSwgXAorCQkgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKGMpLCBfX2NvbnN0YW50X2NwdV90b19sZTMyKGQpIH0gfQorCiAjZW5kaWYgLyogRUZYX0JJVEZJRUxEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9ib2FyZHMuYyBiL2RyaXZlcnMvbmV0L3NmYy9ib2FyZHMuYwppbmRleCBkM2QzZGQwLi45OWU2MDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvYm9hcmRzLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2JvYXJkcy5jCkBAIC0zMSwyMyArMzEsMjMgQEAKIAkJbW9kX3RpbWVyKCZibC0+dGltZXIsIGppZmZpZXMgKyBCTElOS19JTlRFUlZBTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJvYXJkX2JsaW5rKHN0cnVjdCBlZnhfbmljICplZngsIGludCBibGluaykKK3N0YXRpYyB2b2lkIGJvYXJkX2JsaW5rKHN0cnVjdCBlZnhfbmljICplZngsIGJvb2wgYmxpbmspCiB7CiAJc3RydWN0IGVmeF9ibGlua2VyICpibGlua2VyID0gJmVmeC0+Ym9hcmRfaW5mby5ibGlua2VyOwogCiAJLyogVGhlIHJ0bmwgbXV0ZXggc2VyaWFsaXNlcyBhbGwgZXRodG9vbCBpb2N0bHMsIHNvCiAJICogbm90aGluZyBzcGVjaWFsIG5lZWRzIGRvaW5nIGhlcmUuICovCiAJaWYgKGJsaW5rKSB7Ci0JCWJsaW5rZXItPnJlc3VibWl0ID0gMTsKLQkJYmxpbmtlci0+c3RhdGUgPSAwOworCQlibGlua2VyLT5yZXN1Ym1pdCA9IHRydWU7CisJCWJsaW5rZXItPnN0YXRlID0gZmFsc2U7CiAJCXNldHVwX3RpbWVyKCZibGlua2VyLT50aW1lciwgYmxpbmtfbGVkX3RpbWVyLAogCQkJICAgICh1bnNpZ25lZCBsb25nKWVmeCk7CiAJCW1vZF90aW1lcigmYmxpbmtlci0+dGltZXIsIGppZmZpZXMgKyBCTElOS19JTlRFUlZBTCk7CiAJfSBlbHNlIHsKLQkJYmxpbmtlci0+cmVzdWJtaXQgPSAwOworCQlibGlua2VyLT5yZXN1Ym1pdCA9IGZhbHNlOwogCQlpZiAoYmxpbmtlci0+dGltZXIuZnVuY3Rpb24pCiAJCQlkZWxfdGltZXJfc3luYygmYmxpbmtlci0+dGltZXIpOwotCQllZngtPmJvYXJkX2luZm8uc2V0X2ZhdWx0X2xlZChlZngsIDApOworCQllZngtPmJvYXJkX2luZm8uc2V0X2ZhdWx0X2xlZChlZngsIGZhbHNlKTsKIAl9CiB9CiAKQEAgLTc4LDcgKzc4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2ZlNDAwMl9mYXVsdF9sZWQoc3RydWN0IGVmeF9uaWMgKmVmeCwgaW50IHN0YXRlKQorc3RhdGljIHZvaWQgc2ZlNDAwMl9mYXVsdF9sZWQoc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBzdGF0ZSkKIHsKIAl4ZnBfc2V0X2xlZChlZngsIFNGRTQwMDJfRkFVTFRfTEVELCBzdGF0ZSA/IFFVQUtFX0xFRF9PTiA6CiAJCQlRVUFLRV9MRURfT0ZGKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9ib2FyZHMuaCBiL2RyaXZlcnMvbmV0L3NmYy9ib2FyZHMuaAppbmRleCBlNWU4NDQzLi5jNmUwMWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvYm9hcmRzLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2JvYXJkcy5oCkBAIC0yMSw3ICsyMSw1IEBACiAKIGV4dGVybiBpbnQgZWZ4X3NldF9ib2FyZF9pbmZvKHN0cnVjdCBlZnhfbmljICplZngsIHUxNiByZXZpc2lvbl9pbmZvKTsKIGV4dGVybiBpbnQgc2ZlNDAwMV9pbml0KHN0cnVjdCBlZnhfbmljICplZngpOwotLyogQXJlIHdlIHB1dHRpbmcgdGhlIFBIWSBpbnRvIGZsYXNoIGNvbmZpZyBtb2RlICovCi1leHRlcm4gdW5zaWduZWQgaW50IHNmZTQwMDFfcGh5X2ZsYXNoX2NmZzsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZWZ4LmMgYi9kcml2ZXJzL25ldC9zZmMvZWZ4LmMKaW5kZXggNDVjNzJlZS4uMDZlYTcxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2VmeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9lZnguYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgImVmeC5oIgogI2luY2x1ZGUgIm1kaW9fMTBnLmgiCiAjaW5jbHVkZSAiZmFsY29uLmgiCi0jaW5jbHVkZSAid29ya2Fyb3VuZHMuaCIKICNpbmNsdWRlICJtYWMuaCIKIAogI2RlZmluZSBFRlhfTUFYX01UVSAoOSAqIDEwMjQpCkBAIC01Miw3ICs1MSw3IEBACiAgKiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgZm9yIG5ldyBkZXZpY2VzLiAgSXQgY2FuIGJlIGNvbnRyb2xsZWQgbGF0ZXIKICAqIHVzaW5nIGV0aHRvb2wuCiAgKi8KLXN0YXRpYyBpbnQgbHJvID0gMTsKK3N0YXRpYyBpbnQgbHJvID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShscm8sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxybywgIkxhcmdlIHJlY2VpdmUgb2ZmbG9hZCBhY2NlbGVyYXRpb24iKTsKIApAQCAtNjUsNyArNjQsNyBAQAogICogVGhpcyBpcyBmb3JjZWQgdG8gMCBmb3IgTVNJIGludGVycnVwdCBtb2RlIGFzIHRoZSBpbnRlcnJ1cHQgdmVjdG9yCiAgKiBpcyBub3Qgd3JpdHRlbgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNlcGFyYXRlX3R4X2FuZF9yeF9jaGFubmVscyA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IHNlcGFyYXRlX3R4X2FuZF9yeF9jaGFubmVscyA9IHRydWU7CiAKIC8qIFRoaXMgaXMgdGhlIHdlaWdodCBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZSAocGVyLWNoYW5uZWwpIHZpcnR1YWwKICAqIE5BUEkgZGV2aWNlcy4KQEAgLTgxLDcgKzgwLDcgQEAKIC8qIFRoaXMgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGhhcmR3YXJlIG1vbml0b3Igd2lsbCB0cmlnZ2VyIGEKICAqIHJlc2V0IHdoZW4gaXQgZGV0ZWN0cyBhbiBlcnJvciBjb25kaXRpb24uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbW9uaXRvcl9yZXNldCA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IG1vbml0b3JfcmVzZXQgPSB0cnVlOwogCiAvKiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBkcml2ZXIgd2lsbCBpbml0aWFsaXNlIGRldmljZXMKICAqIHdpdGggaW52YWxpZCBNQUMgYWRkcmVzc2VzIHN0b3JlZCBpbiB0aGUgRUVQUk9NIG9yIGZsYXNoLiAgSWYgdHJ1ZSwKQEAgLTE0MSw4ICsxNDAsNyBAQAogCiAjZGVmaW5lIEVGWF9BU1NFUlRfUkVTRVRfU0VSSUFMSVNFRChlZngpCQlcCiAJZG8gewkJCQkJCVwKLQkJaWYgKChlZngtPnN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHx8CVwKLQkJICAgIChlZngtPnN0YXRlID09IFNUQVRFX1JFU0VUVElORykpCVwKKwkJaWYgKGVmeC0+c3RhdGUgPT0gU1RBVEVfUlVOTklORykJXAogCQkJQVNTRVJUX1JUTkwoKTsJCQlcCiAJfSB3aGlsZSAoMCkKIApAQCAtMTU5LDE2ICsxNTcsMTggQEAKICAqIG5ldmVyIGJlIGNvbmN1cnJlbnRseSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgY2hhbm5lbCwKICAqIHRob3VnaCBkaWZmZXJlbnQgY2hhbm5lbHMgbWF5IGJlIGJlaW5nIHByb2Nlc3NlZCBjb25jdXJyZW50bHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGVmeF9wcm9jZXNzX2NoYW5uZWwoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLCBpbnQgcnhfcXVvdGEpCitzdGF0aWMgaW50IGVmeF9wcm9jZXNzX2NoYW5uZWwoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLCBpbnQgcnhfcXVvdGEpCiB7Ci0JaW50IHJ4ZG1hcXM7Ci0Jc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKKwlpbnQgcnhfcGFja2V0czsKIAotCWlmICh1bmxpa2VseShjaGFubmVsLT5lZngtPnJlc2V0X3BlbmRpbmcgIT0gUkVTRVRfVFlQRV9OT05FIHx8CisJaWYgKHVubGlrZWx5KGVmeC0+cmVzZXRfcGVuZGluZyAhPSBSRVNFVF9UWVBFX05PTkUgfHwKIAkJICAgICAhY2hhbm5lbC0+ZW5hYmxlZCkpCi0JCXJldHVybiByeF9xdW90YTsKKwkJcmV0dXJuIDA7CiAKLQlyeGRtYXFzID0gZmFsY29uX3Byb2Nlc3NfZXZlbnRxKGNoYW5uZWwsICZyeF9xdW90YSk7CisJcnhfcGFja2V0cyA9IGZhbGNvbl9wcm9jZXNzX2V2ZW50cShjaGFubmVsLCByeF9xdW90YSk7CisJaWYgKHJ4X3BhY2tldHMgPT0gMCkKKwkJcmV0dXJuIDA7CiAKIAkvKiBEZWxpdmVyIGxhc3QgUlggcGFja2V0LiAqLwogCWlmIChjaGFubmVsLT5yeF9wa3QpIHsKQEAgLTE4MCwxNiArMTgwLDkgQEAKIAllZnhfZmx1c2hfbHJvKGNoYW5uZWwpOwogCWVmeF9yeF9zdHJhdGVneShjaGFubmVsKTsKIAotCS8qIFJlZmlsbCBkZXNjcmlwdG9yIHJpbmdzIGFzIG5lY2Vzc2FyeSAqLwotCXJ4X3F1ZXVlID0gJmNoYW5uZWwtPmVmeC0+cnhfcXVldWVbMF07Ci0Jd2hpbGUgKHJ4ZG1hcXMpIHsKLQkJaWYgKHJ4ZG1hcXMgJiAweDAxKQotCQkJZWZ4X2Zhc3RfcHVzaF9yeF9kZXNjcmlwdG9ycyhyeF9xdWV1ZSk7Ci0JCXJ4X3F1ZXVlKys7Ci0JCXJ4ZG1hcXMgPj49IDE7Ci0JfQorCWVmeF9mYXN0X3B1c2hfcnhfZGVzY3JpcHRvcnMoJmVmeC0+cnhfcXVldWVbY2hhbm5lbC0+Y2hhbm5lbF0pOwogCi0JcmV0dXJuIHJ4X3F1b3RhOworCXJldHVybiByeF9wYWNrZXRzOwogfQogCiAvKiBNYXJrIGNoYW5uZWwgYXMgZmluaXNoZWQgcHJvY2Vzc2luZwpAQCAtMjAzLDcgKzE5Niw3IEBACiAJLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGlzIGNoYW5uZWwgbWF5IHNldCB3b3JrX3BlbmRpbmcKIAkgKiBhcyBzb29uIGFzIHdlIGFja25vd2xlZGdlIHRoZSBldmVudHMgd2UndmUgc2Vlbi4gIE1ha2Ugc3VyZQogCSAqIGl0J3MgY2xlYXJlZCBiZWZvcmUgdGhlbi4gKi8KLQljaGFubmVsLT53b3JrX3BlbmRpbmcgPSAwOworCWNoYW5uZWwtPndvcmtfcGVuZGluZyA9IGZhbHNlOwogCXNtcF93bWIoKTsKIAogCWZhbGNvbl9ldmVudHFfcmVhZF9hY2soY2hhbm5lbCk7CkBAIC0yMTksMTQgKzIxMiwxMiBAQAogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCA9CiAJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZWZ4X2NoYW5uZWwsIG5hcGlfc3RyKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmFwaV9kZXYgPSBjaGFubmVsLT5uYXBpX2RldjsKLQlpbnQgdW51c2VkOwogCWludCByeF9wYWNrZXRzOwogCiAJRUZYX1RSQUNFKGNoYW5uZWwtPmVmeCwgImNoYW5uZWwgJWQgTkFQSSBwb2xsIGV4ZWN1dGluZyBvbiBDUFUgJWRcbiIsCiAJCSAgY2hhbm5lbC0+Y2hhbm5lbCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAKLQl1bnVzZWQgPSBlZnhfcHJvY2Vzc19jaGFubmVsKGNoYW5uZWwsIGJ1ZGdldCk7Ci0JcnhfcGFja2V0cyA9IChidWRnZXQgLSB1bnVzZWQpOworCXJ4X3BhY2tldHMgPSBlZnhfcHJvY2Vzc19jaGFubmVsKGNoYW5uZWwsIGJ1ZGdldCk7CiAKIAlpZiAocnhfcGFja2V0cyA8IGJ1ZGdldCkgewogCQkvKiBUaGVyZSBpcyBubyByYWNlIGhlcmU7IGFsdGhvdWdoIG5hcGlfZGlzYWJsZSgpIHdpbGwKQEAgLTI2MCw3ICsyNTEsNyBAQAogCWZhbGNvbl9kaXNhYmxlX2ludGVycnVwdHMoZWZ4KTsKIAlpZiAoZWZ4LT5sZWdhY3lfaXJxKQogCQlzeW5jaHJvbml6ZV9pcnEoZWZ4LT5sZWdhY3lfaXJxKTsKLQlpZiAoY2hhbm5lbC0+aGFzX2ludGVycnVwdCAmJiBjaGFubmVsLT5pcnEpCisJaWYgKGNoYW5uZWwtPmlycSkKIAkJc3luY2hyb25pemVfaXJxKGNoYW5uZWwtPmlycSk7CiAKIAkvKiBXYWl0IGZvciBhbnkgTkFQSSBwcm9jZXNzaW5nIHRvIGNvbXBsZXRlICovCkBAIC0yOTAsMTMgKzI4MSwxMyBAQAogfQogCiAvKiBQcmVwYXJlIGNoYW5uZWwncyBldmVudCBxdWV1ZSAqLwotc3RhdGljIGludCBlZnhfaW5pdF9ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQorc3RhdGljIHZvaWQgZWZ4X2luaXRfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImNoYW4gJWQgaW5pdCBldmVudCBxdWV1ZVxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CiAKIAljaGFubmVsLT5ldmVudHFfcmVhZF9wdHIgPSAwOwogCi0JcmV0dXJuIGZhbGNvbl9pbml0X2V2ZW50cShjaGFubmVsKTsKKwlmYWxjb25faW5pdF9ldmVudHEoY2hhbm5lbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVmeF9maW5pX2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCkBAIC0zNjIsMTIgKzM1MywxMSBAQAogICogdG8gcHJvcGFnYXRlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAobXR1LCBjaGVja3N1bSBvZmZsb2FkKSwgb3IKICAqIHRvIGNsZWFyIGhhcmR3YXJlIGVycm9yIGNvbmRpdGlvbnMKICAqLwotc3RhdGljIGludCBlZnhfaW5pdF9jaGFubmVscyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQorc3RhdGljIHZvaWQgZWZ4X2luaXRfY2hhbm5lbHMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAlzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZTsKIAlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZTsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7Ci0JaW50IHJjID0gMDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgcnggYnVmZmVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyByZXF1aXJlZCB0bwogCSAqIHN1cHBvcnQgdGhlIGN1cnJlbnQgTVRVLCBpbmNsdWRpbmcgcGFkZGluZyBmb3IgaGVhZGVyCkBAIC0zODIsMzYgKzM3MiwyMCBAQAogCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgewogCQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgImluaXQgY2hhbiAlZFxuIiwgY2hhbm5lbC0+Y2hhbm5lbCk7CiAKLQkJcmMgPSBlZnhfaW5pdF9ldmVudHEoY2hhbm5lbCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyOworCQllZnhfaW5pdF9ldmVudHEoY2hhbm5lbCk7CiAKLQkJZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfdHhfcXVldWUodHhfcXVldWUsIGNoYW5uZWwpIHsKLQkJCXJjID0gZWZ4X2luaXRfdHhfcXVldWUodHhfcXVldWUpOwotCQkJaWYgKHJjKQotCQkJCWdvdG8gZXJyOwotCQl9CisJCWVmeF9mb3JfZWFjaF9jaGFubmVsX3R4X3F1ZXVlKHR4X3F1ZXVlLCBjaGFubmVsKQorCQkJZWZ4X2luaXRfdHhfcXVldWUodHhfcXVldWUpOwogCiAJCS8qIFRoZSByeCBidWZmZXIgYWxsb2NhdGlvbiBzdHJhdGVneSBpcyBNVFUgZGVwZW5kZW50ICovCiAJCWVmeF9yeF9zdHJhdGVneShjaGFubmVsKTsKIAotCQllZnhfZm9yX2VhY2hfY2hhbm5lbF9yeF9xdWV1ZShyeF9xdWV1ZSwgY2hhbm5lbCkgewotCQkJcmMgPSBlZnhfaW5pdF9yeF9xdWV1ZShyeF9xdWV1ZSk7Ci0JCQlpZiAocmMpCi0JCQkJZ290byBlcnI7Ci0JCX0KKwkJZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfcnhfcXVldWUocnhfcXVldWUsIGNoYW5uZWwpCisJCQllZnhfaW5pdF9yeF9xdWV1ZShyeF9xdWV1ZSk7CiAKIAkJV0FSTl9PTihjaGFubmVsLT5yeF9wa3QgIT0gTlVMTCk7CiAJCWVmeF9yeF9zdHJhdGVneShjaGFubmVsKTsKIAl9Ci0KLQlyZXR1cm4gMDsKLQotIGVycjoKLQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBpbml0aWFsaXNlIGNoYW5uZWwgJWRcbiIsCi0JCWNoYW5uZWwgPyBjaGFubmVsLT5jaGFubmVsIDogLTEpOwotCWVmeF9maW5pX2NoYW5uZWxzKGVmeCk7Ci0JcmV0dXJuIHJjOwogfQogCiAvKiBUaGlzIGVuYWJsZXMgZXZlbnQgcXVldWUgcHJvY2Vzc2luZyBhbmQgcGFja2V0IHRyYW5zbWlzc2lvbi4KQEAgLTQzMiw4ICs0MDYsOCBAQAogCS8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhpcyBjaGFubmVsIG1heSBzZXQgd29ya19wZW5kaW5nCiAJICogYXMgc29vbiBhcyB3ZSBlbmFibGUgaXQuICBNYWtlIHN1cmUgaXQncyBjbGVhcmVkIGJlZm9yZQogCSAqIHRoZW4uICBTaW1pbGFybHksIG1ha2Ugc3VyZSBpdCBzZWVzIHRoZSBlbmFibGVkIGZsYWcgc2V0LiAqLwotCWNoYW5uZWwtPndvcmtfcGVuZGluZyA9IDA7Ci0JY2hhbm5lbC0+ZW5hYmxlZCA9IDE7CisJY2hhbm5lbC0+d29ya19wZW5kaW5nID0gZmFsc2U7CisJY2hhbm5lbC0+ZW5hYmxlZCA9IHRydWU7CiAJc21wX3dtYigpOwogCiAJbmFwaV9lbmFibGUoJmNoYW5uZWwtPm5hcGlfc3RyKTsKQEAgLTQ1Niw3ICs0MzAsNyBAQAogCiAJRUZYX0xPRyhjaGFubmVsLT5lZngsICJzdG9wIGNoYW4gJWRcbiIsIGNoYW5uZWwtPmNoYW5uZWwpOwogCi0JY2hhbm5lbC0+ZW5hYmxlZCA9IDA7CisJY2hhbm5lbC0+ZW5hYmxlZCA9IGZhbHNlOwogCW5hcGlfZGlzYWJsZSgmY2hhbm5lbC0+bmFwaV9zdHIpOwogCiAJLyogRW5zdXJlIHRoYXQgYW55IHdvcmtlciB0aHJlYWRzIGhhdmUgZXhpdGVkIG9yIHdpbGwgYmUgbm8tb3BzICovCkBAIC00NzEsMTAgKzQ0NSwxNyBAQAogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKIAlzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZTsKIAlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZTsKKwlpbnQgcmM7CiAKIAlFRlhfQVNTRVJUX1JFU0VUX1NFUklBTElTRUQoZWZ4KTsKIAlCVUdfT04oZWZ4LT5wb3J0X2VuYWJsZWQpOwogCisJcmMgPSBmYWxjb25fZmx1c2hfcXVldWVzKGVmeCk7CisJaWYgKHJjKQorCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBmbHVzaCBxdWV1ZXNcbiIpOworCWVsc2UKKwkJRUZYX0xPRyhlZngsICJzdWNjZXNzZnVsbHkgZmx1c2hlZCBhbGwgcXVldWVzXG4iKTsKKwogCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgewogCQlFRlhfTE9HKGNoYW5uZWwtPmVmeCwgInNodXQgZG93biBjaGFuICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKIApAQCAtNDgyLDEzICs0NjMsNiBAQAogCQkJZWZ4X2ZpbmlfcnhfcXVldWUocnhfcXVldWUpOwogCQllZnhfZm9yX2VhY2hfY2hhbm5lbF90eF9xdWV1ZSh0eF9xdWV1ZSwgY2hhbm5lbCkKIAkJCWVmeF9maW5pX3R4X3F1ZXVlKHR4X3F1ZXVlKTsKLQl9Ci0KLQkvKiBEbyB0aGUgZXZlbnQgcXVldWVzIGxhc3Qgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGZsdXNoIGV2ZW50cwotCSAqIGZvciBhbGwgRE1BIHF1ZXVlcy4gKi8KLQllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKLQkJRUZYX0xPRyhjaGFubmVsLT5lZngsICJzaHV0IGRvd24gZXZxICVkXG4iLCBjaGFubmVsLT5jaGFubmVsKTsKLQogCQllZnhfZmluaV9ldmVudHEoY2hhbm5lbCk7CiAJfQogfQpAQCAtNTI2LDggKzUwMCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVmeF9saW5rX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0JaW50IGNhcnJpZXJfb2s7Ci0KIAkvKiBTRkMgQnVnIDUzNTY6IEEgbmV0X2RldiBub3RpZmllciBpcyByZWdpc3RlcmVkLCBzbyB3ZSBtdXN0IGVuc3VyZQogCSAqIHRoYXQgbm8gZXZlbnRzIGFyZSB0cmlnZ2VyZWQgYmV0d2VlbiB1bnJlZ2lzdGVyX25ldGRldigpIGFuZCB0aGUKIAkgKiBkcml2ZXIgdW5sb2FkaW5nLiBBIG1vcmUgZ2VuZXJhbCBjb25kaXRpb24gaXMgdGhhdCBORVRERVZfQ0hBTkdFCkBAIC01MzUsOCArNTA3LDEyIEBACiAJaWYgKCFuZXRpZl9ydW5uaW5nKGVmeC0+bmV0X2RldikpCiAJCXJldHVybjsKIAotCWNhcnJpZXJfb2sgPSBuZXRpZl9jYXJyaWVyX29rKGVmeC0+bmV0X2RldikgPyAxIDogMDsKLQlpZiAoZWZ4LT5saW5rX3VwICE9IGNhcnJpZXJfb2spIHsKKwlpZiAoZWZ4LT5wb3J0X2luaGliaXRlZCkgeworCQluZXRpZl9jYXJyaWVyX29mZihlZngtPm5ldF9kZXYpOworCQlyZXR1cm47CisJfQorCisJaWYgKGVmeC0+bGlua191cCAhPSBuZXRpZl9jYXJyaWVyX29rKGVmeC0+bmV0X2RldikpIHsKIAkJZWZ4LT5uX2xpbmtfc3RhdGVfY2hhbmdlcysrOwogCiAJCWlmIChlZngtPmxpbmtfdXApCkBAIC01NzcsMTMgKzU1MywxOSBAQAogCiAvKiBUaGlzIGNhbGwgcmVpbml0aWFsaXNlcyB0aGUgTUFDIHRvIHBpY2sgdXAgbmV3IFBIWSBzZXR0aW5ncy4gVGhlCiAgKiBjYWxsZXIgbXVzdCBob2xkIHRoZSBtYWNfbG9jayAqLwotc3RhdGljIHZvaWQgX19lZnhfcmVjb25maWd1cmVfcG9ydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQordm9pZCBfX2VmeF9yZWNvbmZpZ3VyZV9wb3J0KHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZlZngtPm1hY19sb2NrKSk7CiAKIAlFRlhfTE9HKGVmeCwgInJlY29uZmlndXJpbmcgTUFDIGZyb20gUEhZIHNldHRpbmdzIG9uIENQVSAlZFxuIiwKIAkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAKKwkvKiBTZXJpYWxpc2UgdGhlIHByb21pc2N1b3VzIGZsYWcgd2l0aCBlZnhfc2V0X211bHRpY2FzdF9saXN0LiAqLworCWlmIChlZnhfZGV2X3JlZ2lzdGVyZWQoZWZ4KSkgeworCQluZXRpZl9hZGRyX2xvY2tfYmgoZWZ4LT5uZXRfZGV2KTsKKwkJbmV0aWZfYWRkcl91bmxvY2tfYmgoZWZ4LT5uZXRfZGV2KTsKKwl9CisKIAlmYWxjb25fcmVjb25maWd1cmVfeG1hYyhlZngpOwogCiAJLyogSW5mb3JtIGtlcm5lbCBvZiBsb3NzL2dhaW4gb2YgY2FycmllciAqLwpAQCAtNjYxLDcgKzY0Myw4IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQllZngtPnBvcnRfaW5pdGlhbGl6ZWQgPSAxOworCWVmeC0+cG9ydF9pbml0aWFsaXplZCA9IHRydWU7CisJZWZ4LT5zdGF0c19lbmFibGVkID0gdHJ1ZTsKIAogCS8qIFJlY29uZmlndXJlIHBvcnQgdG8gcHJvZ3JhbSBNQUMgcmVnaXN0ZXJzICovCiAJZmFsY29uX3JlY29uZmlndXJlX3htYWMoZWZ4KTsKQEAgLTY3OCw3ICs2NjEsNyBAQAogCUJVR19PTihlZngtPnBvcnRfZW5hYmxlZCk7CiAKIAltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKLQllZngtPnBvcnRfZW5hYmxlZCA9IDE7CisJZWZ4LT5wb3J0X2VuYWJsZWQgPSB0cnVlOwogCV9fZWZ4X3JlY29uZmlndXJlX3BvcnQoZWZ4KTsKIAltdXRleF91bmxvY2soJmVmeC0+bWFjX2xvY2spOwogfQpAQCAtNjkyLDcgKzY3NSw3IEBACiAJRUZYX0xPRyhlZngsICJzdG9wIHBvcnRcbiIpOwogCiAJbXV0ZXhfbG9jaygmZWZ4LT5tYWNfbG9jayk7Ci0JZWZ4LT5wb3J0X2VuYWJsZWQgPSAwOworCWVmeC0+cG9ydF9lbmFibGVkID0gZmFsc2U7CiAJbXV0ZXhfdW5sb2NrKCZlZngtPm1hY19sb2NrKTsKIAogCS8qIFNlcmlhbGlzZSBhZ2FpbnN0IGVmeF9zZXRfbXVsdGljYXN0X2xpc3QoKSAqLwpAQCAtNzEwLDkgKzY5Myw5IEBACiAJCXJldHVybjsKIAogCWZhbGNvbl9maW5pX3htYWMoZWZ4KTsKLQllZngtPnBvcnRfaW5pdGlhbGl6ZWQgPSAwOworCWVmeC0+cG9ydF9pbml0aWFsaXplZCA9IGZhbHNlOwogCi0JZWZ4LT5saW5rX3VwID0gMDsKKwllZngtPmxpbmtfdXAgPSBmYWxzZTsKIAllZnhfbGlua19zdGF0dXNfY2hhbmdlZChlZngpOwogfQogCkBAIC03OTcsNyArNzgwLDcgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWw0OgotCXJlbGVhc2VfbWVtX3JlZ2lvbihlZngtPm1lbWJhc2VfcGh5cywgZWZ4LT50eXBlLT5tZW1fbWFwX3NpemUpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihlZngtPnBjaV9kZXYsIGVmeC0+dHlwZS0+bWVtX2Jhcik7CiAgZmFpbDM6CiAJZWZ4LT5tZW1iYXNlX3BoeXMgPSAwOwogIGZhaWwyOgpAQCAtODIzLDUzICs4MDYsNjEgQEAKIAlwY2lfZGlzYWJsZV9kZXZpY2UoZWZ4LT5wY2lfZGV2KTsKIH0KIAotLyogUHJvYmUgdGhlIG51bWJlciBhbmQgdHlwZSBvZiBpbnRlcnJ1cHRzIHdlIGFyZSBhYmxlIHRvIG9idGFpbi4gKi8KKy8qIEdldCBudW1iZXIgb2YgUlggcXVldWVzIHdhbnRlZC4gIFJldHVybiBudW1iZXIgb2Ygb25saW5lIENQVQorICogcGFja2FnZXMgaW4gdGhlIGV4cGVjdGF0aW9uIHRoYXQgYW4gSVJRIGJhbGFuY2VyIHdpbGwgc3ByZWFkCisgKiBpbnRlcnJ1cHRzIGFjcm9zcyB0aGVtLiAqLworc3RhdGljIGludCBlZnhfd2FudGVkX3J4X3F1ZXVlcyh2b2lkKQoreworCWNwdW1hc2tfdCBjb3JlX21hc2s7CisJaW50IGNvdW50OworCWludCBjcHU7CisKKwljcHVzX2NsZWFyKGNvcmVfbWFzayk7CisJY291bnQgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgY29yZV9tYXNrKSkgeworCQkJKytjb3VudDsKKwkJCWNwdXNfb3IoY29yZV9tYXNrLCBjb3JlX21hc2ssCisJCQkJdG9wb2xvZ3lfY29yZV9zaWJsaW5ncyhjcHUpKTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyogUHJvYmUgdGhlIG51bWJlciBhbmQgdHlwZSBvZiBpbnRlcnJ1cHRzIHdlIGFyZSBhYmxlIHRvIG9idGFpbiwgYW5kCisgKiB0aGUgcmVzdWx0aW5nIG51bWJlcnMgb2YgY2hhbm5lbHMgYW5kIFJYIHF1ZXVlcy4KKyAqLwogc3RhdGljIHZvaWQgZWZ4X3Byb2JlX2ludGVycnVwdHMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlpbnQgbWF4X2NoYW5uZWwgPSBlZngtPnR5cGUtPnBoeXNfYWRkcl9jaGFubmVscyAtIDE7Ci0Jc3RydWN0IG1zaXhfZW50cnkgeGVudHJpZXNbRUZYX01BWF9DSEFOTkVMU107CisJaW50IG1heF9jaGFubmVscyA9CisJCW1pbl90KGludCwgZWZ4LT50eXBlLT5waHlzX2FkZHJfY2hhbm5lbHMsIEVGWF9NQVhfQ0hBTk5FTFMpOwogCWludCByYywgaTsKIAogCWlmIChlZngtPmludGVycnVwdF9tb2RlID09IEVGWF9JTlRfTU9ERV9NU0lYKSB7Ci0JCUJVR19PTighcGNpX2ZpbmRfY2FwYWJpbGl0eShlZngtPnBjaV9kZXYsIFBDSV9DQVBfSURfTVNJWCkpOworCQlzdHJ1Y3QgbXNpeF9lbnRyeSB4ZW50cmllc1tFRlhfTUFYX0NIQU5ORUxTXTsKKwkJaW50IHdhbnRlZF9pbnRzOwogCi0JCWlmIChyc3NfY3B1cyA9PSAwKSB7Ci0JCQljcHVtYXNrX3QgY29yZV9tYXNrOwotCQkJaW50IGNwdTsKKwkJLyogV2Ugd2FudCBvbmUgUlggcXVldWUgYW5kIGludGVycnVwdCBwZXIgQ1BVIHBhY2thZ2UKKwkJICogKG9yIGFzIHNwZWNpZmllZCBieSB0aGUgcnNzX2NwdXMgbW9kdWxlIHBhcmFtZXRlcikuCisJCSAqIFdlIHdpbGwgbmVlZCBvbmUgY2hhbm5lbCBwZXIgaW50ZXJydXB0LgorCQkgKi8KKwkJd2FudGVkX2ludHMgPSByc3NfY3B1cyA/IHJzc19jcHVzIDogZWZ4X3dhbnRlZF9yeF9xdWV1ZXMoKTsKKwkJZWZ4LT5uX3J4X3F1ZXVlcyA9IG1pbih3YW50ZWRfaW50cywgbWF4X2NoYW5uZWxzKTsKIAotCQkJY3B1c19jbGVhcihjb3JlX21hc2spOwotCQkJZWZ4LT5yc3NfcXVldWVzID0gMDsKLQkJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCQkJaWYgKCFjcHVfaXNzZXQoY3B1LCBjb3JlX21hc2spKSB7Ci0JCQkJCSsrZWZ4LT5yc3NfcXVldWVzOwotCQkJCQljcHVzX29yKGNvcmVfbWFzaywgY29yZV9tYXNrLAotCQkJCQkJdG9wb2xvZ3lfY29yZV9zaWJsaW5ncyhjcHUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQllZngtPnJzc19xdWV1ZXMgPSByc3NfY3B1czsKLQkJfQotCi0JCWVmeC0+cnNzX3F1ZXVlcyA9IG1pbihlZngtPnJzc19xdWV1ZXMsIG1heF9jaGFubmVsICsgMSk7Ci0JCWVmeC0+cnNzX3F1ZXVlcyA9IG1pbihlZngtPnJzc19xdWV1ZXMsIEVGWF9NQVhfQ0hBTk5FTFMpOwotCi0JCS8qIFJlcXVlc3QgbWF4aW11bSBudW1iZXIgb2YgTVNJIGludGVycnVwdHMsIGFuZCBmaWxsIG91dAotCQkgKiB0aGUgY2hhbm5lbCBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gdGhlIGFsbG93ZWQgYWxsb2NhdGlvbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgZWZ4LT5yc3NfcXVldWVzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBlZngtPm5fcnhfcXVldWVzOyBpKyspCiAJCQl4ZW50cmllc1tpXS5lbnRyeSA9IGk7Ci0JCXJjID0gcGNpX2VuYWJsZV9tc2l4KGVmeC0+cGNpX2RldiwgeGVudHJpZXMsIGVmeC0+cnNzX3F1ZXVlcyk7CisJCXJjID0gcGNpX2VuYWJsZV9tc2l4KGVmeC0+cGNpX2RldiwgeGVudHJpZXMsIGVmeC0+bl9yeF9xdWV1ZXMpOwogCQlpZiAocmMgPiAwKSB7Ci0JCQlFRlhfQlVHX09OX1BBUkFOT0lEKHJjID49IGVmeC0+cnNzX3F1ZXVlcyk7Ci0JCQllZngtPnJzc19xdWV1ZXMgPSByYzsKKwkJCUVGWF9CVUdfT05fUEFSQU5PSUQocmMgPj0gZWZ4LT5uX3J4X3F1ZXVlcyk7CisJCQllZngtPm5fcnhfcXVldWVzID0gcmM7CiAJCQlyYyA9IHBjaV9lbmFibGVfbXNpeChlZngtPnBjaV9kZXYsIHhlbnRyaWVzLAotCQkJCQkgICAgIGVmeC0+cnNzX3F1ZXVlcyk7CisJCQkJCSAgICAgZWZ4LT5uX3J4X3F1ZXVlcyk7CiAJCX0KIAogCQlpZiAocmMgPT0gMCkgewotCQkJZm9yIChpID0gMDsgaSA8IGVmeC0+cnNzX3F1ZXVlczsgaSsrKSB7Ci0JCQkJZWZ4LT5jaGFubmVsW2ldLmhhc19pbnRlcnJ1cHQgPSAxOworCQkJZm9yIChpID0gMDsgaSA8IGVmeC0+bl9yeF9xdWV1ZXM7IGkrKykKIAkJCQllZngtPmNoYW5uZWxbaV0uaXJxID0geGVudHJpZXNbaV0udmVjdG9yOwotCQkJfQogCQl9IGVsc2UgewogCQkJLyogRmFsbCBiYWNrIHRvIHNpbmdsZSBjaGFubmVsIE1TSSAqLwogCQkJZWZ4LT5pbnRlcnJ1cHRfbW9kZSA9IEVGWF9JTlRfTU9ERV9NU0k7CkBAIC04NzksMTEgKzg3MCwxMCBAQAogCiAJLyogVHJ5IHNpbmdsZSBpbnRlcnJ1cHQgTVNJICovCiAJaWYgKGVmeC0+aW50ZXJydXB0X21vZGUgPT0gRUZYX0lOVF9NT0RFX01TSSkgewotCQllZngtPnJzc19xdWV1ZXMgPSAxOworCQllZngtPm5fcnhfcXVldWVzID0gMTsKIAkJcmMgPSBwY2lfZW5hYmxlX21zaShlZngtPnBjaV9kZXYpOwogCQlpZiAocmMgPT0gMCkgewogCQkJZWZ4LT5jaGFubmVsWzBdLmlycSA9IGVmeC0+cGNpX2Rldi0+aXJxOwotCQkJZWZ4LT5jaGFubmVsWzBdLmhhc19pbnRlcnJ1cHQgPSAxOwogCQl9IGVsc2UgewogCQkJRUZYX0VSUihlZngsICJjb3VsZCBub3QgZW5hYmxlIE1TSVxuIik7CiAJCQllZngtPmludGVycnVwdF9tb2RlID0gRUZYX0lOVF9NT0RFX0xFR0FDWTsKQEAgLTg5MiwxMCArODgyLDcgQEAKIAogCS8qIEFzc3VtZSBsZWdhY3kgaW50ZXJydXB0cyAqLwogCWlmIChlZngtPmludGVycnVwdF9tb2RlID09IEVGWF9JTlRfTU9ERV9MRUdBQ1kpIHsKLQkJZWZ4LT5yc3NfcXVldWVzID0gMTsKLQkJLyogRXZlcnkgY2hhbm5lbCBpcyBpbnRlcnJ1cHRpYmxlICovCi0JCWZvciAoaSA9IDA7IGkgPCBFRlhfTUFYX0NIQU5ORUxTOyBpKyspCi0JCQllZngtPmNoYW5uZWxbaV0uaGFzX2ludGVycnVwdCA9IDE7CisJCWVmeC0+bl9yeF9xdWV1ZXMgPSAxOwogCQllZngtPmxlZ2FjeV9pcnEgPSBlZngtPnBjaV9kZXYtPmlycTsKIAl9CiB9CkBAIC05MDUsNyArODkyLDcgQEAKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7CiAKIAkvKiBSZW1vdmUgTVNJL01TSS1YIGludGVycnVwdHMgKi8KLQllZnhfZm9yX2VhY2hfY2hhbm5lbF93aXRoX2ludGVycnVwdChjaGFubmVsLCBlZngpCisJZWZ4X2Zvcl9lYWNoX2NoYW5uZWwoY2hhbm5lbCwgZWZ4KQogCQljaGFubmVsLT5pcnEgPSAwOwogCXBjaV9kaXNhYmxlX21zaShlZngtPnBjaV9kZXYpOwogCXBjaV9kaXNhYmxlX21zaXgoZWZ4LT5wY2lfZGV2KTsKQEAgLTkxNCw0NSArOTAxLDIyIEBACiAJZWZ4LT5sZWdhY3lfaXJxID0gMDsKIH0KIAotLyogU2VsZWN0IG51bWJlciBvZiB1c2VkIHJlc291cmNlcwotICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBwcm9iZV9pbnRlcnJ1cHRzKCkKLSAqLwotc3RhdGljIHZvaWQgZWZ4X3NlbGVjdF91c2VkKHN0cnVjdCBlZnhfbmljICplZngpCitzdGF0aWMgdm9pZCBlZnhfc2V0X2NoYW5uZWxzKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWU7CiAJc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7Ci0JaW50IGk7CiAKLQkvKiBUWCBxdWV1ZXMuICBPbmUgcGVyIHBvcnQgcGVyIGNoYW5uZWwgd2l0aCBUWCBjYXBhYmlsaXR5Ci0JICogKG1vcmUgdGhhbiBvbmUgcGVyIHBvcnQgd29uJ3Qgd29yayBvbiBMaW51eCwgZHVlIHRvIG91dAotCSAqICBvZiBvcmRlciBpc3N1ZXMuLi4gYnV0IHdpbGwgYmUgZmluZSBvbiBTb2xhcmlzKQotCSAqLwotCXR4X3F1ZXVlID0gJmVmeC0+dHhfcXVldWVbMF07CisJZWZ4X2Zvcl9lYWNoX3R4X3F1ZXVlKHR4X3F1ZXVlLCBlZngpIHsKKwkJaWYgKCFFRlhfSU5UX01PREVfVVNFX01TSShlZngpICYmIHNlcGFyYXRlX3R4X2FuZF9yeF9jaGFubmVscykKKwkJCXR4X3F1ZXVlLT5jaGFubmVsID0gJmVmeC0+Y2hhbm5lbFsxXTsKKwkJZWxzZQorCQkJdHhfcXVldWUtPmNoYW5uZWwgPSAmZWZ4LT5jaGFubmVsWzBdOworCQl0eF9xdWV1ZS0+Y2hhbm5lbC0+dXNlZF9mbGFncyB8PSBFRlhfVVNFRF9CWV9UWDsKKwl9CiAKLQkvKiBQZXJmb3JtIHRoaXMgZm9yIGVhY2ggY2hhbm5lbCB3aXRoIFRYIGNhcGFiaWxpdGllcy4KLQkgKiBBdCB0aGUgbW9tZW50LCB3ZSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgVFggcXVldWUKLQkgKi8KLQl0eF9xdWV1ZS0+dXNlZCA9IDE7Ci0JaWYgKCghRUZYX0lOVF9NT0RFX1VTRV9NU0koZWZ4KSkgJiYgc2VwYXJhdGVfdHhfYW5kX3J4X2NoYW5uZWxzKQotCQl0eF9xdWV1ZS0+Y2hhbm5lbCA9ICZlZngtPmNoYW5uZWxbMV07Ci0JZWxzZQotCQl0eF9xdWV1ZS0+Y2hhbm5lbCA9ICZlZngtPmNoYW5uZWxbMF07Ci0JdHhfcXVldWUtPmNoYW5uZWwtPnVzZWRfZmxhZ3MgfD0gRUZYX1VTRURfQllfVFg7Ci0JdHhfcXVldWUrKzsKLQotCS8qIFJYIHF1ZXVlcy4gIEVhY2ggaGFzIGEgZGVkaWNhdGVkIGNoYW5uZWwuICovCi0JZm9yIChpID0gMDsgaSA8IEVGWF9NQVhfUlhfUVVFVUVTOyBpKyspIHsKLQkJcnhfcXVldWUgPSAmZWZ4LT5yeF9xdWV1ZVtpXTsKLQotCQlpZiAoaSA8IGVmeC0+cnNzX3F1ZXVlcykgewotCQkJcnhfcXVldWUtPnVzZWQgPSAxOwotCQkJLyogSWYgd2UgYWxsb3cgbXVsdGlwbGUgUlggcXVldWVzIHBlciBjaGFubmVsCi0JCQkgKiB3ZSBuZWVkIHRvIGRlY2lkZSB0aGF0IGhlcmUKLQkJCSAqLwotCQkJcnhfcXVldWUtPmNoYW5uZWwgPSAmZWZ4LT5jaGFubmVsW3J4X3F1ZXVlLT5xdWV1ZV07Ci0JCQlyeF9xdWV1ZS0+Y2hhbm5lbC0+dXNlZF9mbGFncyB8PSBFRlhfVVNFRF9CWV9SWDsKLQkJCXJ4X3F1ZXVlKys7Ci0JCX0KKwllZnhfZm9yX2VhY2hfcnhfcXVldWUocnhfcXVldWUsIGVmeCkgeworCQlyeF9xdWV1ZS0+Y2hhbm5lbCA9ICZlZngtPmNoYW5uZWxbcnhfcXVldWUtPnF1ZXVlXTsKKwkJcnhfcXVldWUtPmNoYW5uZWwtPnVzZWRfZmxhZ3MgfD0gRUZYX1VTRURfQllfUlg7CiAJfQogfQogCkBAIC05NzEsOCArOTM1LDcgQEAKIAkgKiBpbiBNU0ktWCBpbnRlcnJ1cHRzLiAqLwogCWVmeF9wcm9iZV9pbnRlcnJ1cHRzKGVmeCk7CiAKLQkvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIFJYIHF1ZXVlcyBhbmQgVFggcXVldWVzICovCi0JZWZ4X3NlbGVjdF91c2VkKGVmeCk7CisJZWZ4X3NldF9jaGFubmVscyhlZngpOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gc2V0dGluZ3MgKi8KIAllZnhfaW5pdF9pcnFfbW9kZXJhdGlvbihlZngsIHR4X2lycV9tb2RfdXNlYywgcnhfaXJxX21vZF91c2VjKTsKQEAgLTEwNTgsNyArMTAyMSw4IEBACiAJLyogTWFyayB0aGUgcG9ydCBhcyBlbmFibGVkIHNvIHBvcnQgcmVjb25maWd1cmF0aW9ucyBjYW4gc3RhcnQsIHRoZW4KIAkgKiByZXN0YXJ0IHRoZSB0cmFuc21pdCBpbnRlcmZhY2UgZWFybHkgc28gdGhlIHdhdGNoZG9nIHRpbWVyIHN0b3BzICovCiAJZWZ4X3N0YXJ0X3BvcnQoZWZ4KTsKLQllZnhfd2FrZV9xdWV1ZShlZngpOworCWlmIChlZnhfZGV2X3JlZ2lzdGVyZWQoZWZ4KSkKKwkJZWZ4X3dha2VfcXVldWUoZWZ4KTsKIAogCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkKIAkJZWZ4X3N0YXJ0X2NoYW5uZWwoY2hhbm5lbCk7CkBAIC0xMTA5LDcgKzEwNzMsNyBAQAogCWZhbGNvbl9kaXNhYmxlX2ludGVycnVwdHMoZWZ4KTsKIAlpZiAoZWZ4LT5sZWdhY3lfaXJxKQogCQlzeW5jaHJvbml6ZV9pcnEoZWZ4LT5sZWdhY3lfaXJxKTsKLQllZnhfZm9yX2VhY2hfY2hhbm5lbF93aXRoX2ludGVycnVwdChjaGFubmVsLCBlZngpIHsKKwllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKIAkJaWYgKGNoYW5uZWwtPmlycSkKIAkJCXN5bmNocm9uaXplX2lycShjaGFubmVsLT5pcnEpOwogCX0KQEAgLTExMjgsMTMgKzEwOTIsMTIgQEAKIAogCS8qIElzb2xhdGUgdGhlIE1BQyBmcm9tIHRoZSBUWCBhbmQgUlggZW5naW5lcywgc28gdGhhdCBxdWV1ZQogCSAqIGZsdXNoZXMgd2lsbCBjb21wbGV0ZSBpbiBhIHRpbWVseSBmYXNoaW9uLiAqLwotCWZhbGNvbl9kZWNvbmZpZ3VyZV9tYWNfd3JhcHBlcihlZngpOwogCWZhbGNvbl9kcmFpbl90eF9maWZvKGVmeCk7CiAKIAkvKiBTdG9wIHRoZSBrZXJuZWwgdHJhbnNtaXQgaW50ZXJmYWNlIGxhdGUsIHNvIHRoZSB3YXRjaGRvZwogCSAqIHRpbWVyIGlzbid0IHRpY2tpbmcgb3ZlciB0aGUgZmx1c2ggKi8KLQllZnhfc3RvcF9xdWV1ZShlZngpOwogCWlmIChlZnhfZGV2X3JlZ2lzdGVyZWQoZWZ4KSkgeworCQllZnhfc3RvcF9xdWV1ZShlZngpOwogCQluZXRpZl90eF9sb2NrX2JoKGVmeC0+bmV0X2Rldik7CiAJCW5ldGlmX3R4X3VubG9ja19iaChlZngtPm5ldF9kZXYpOwogCX0KQEAgLTExNTEsMjQgKzExMTQsMTYgQEAKIH0KIAogLyogQSBjb252aW5pZW5jZSBmdW5jdGlvbiB0byBzYWZlbHkgZmx1c2ggYWxsIHRoZSBxdWV1ZXMgKi8KLWludCBlZnhfZmx1c2hfcXVldWVzKHN0cnVjdCBlZnhfbmljICplZngpCit2b2lkIGVmeF9mbHVzaF9xdWV1ZXMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlpbnQgcmM7Ci0KIAlFRlhfQVNTRVJUX1JFU0VUX1NFUklBTElTRUQoZWZ4KTsKIAogCWVmeF9zdG9wX2FsbChlZngpOwogCiAJZWZ4X2ZpbmlfY2hhbm5lbHMoZWZ4KTsKLQlyYyA9IGVmeF9pbml0X2NoYW5uZWxzKGVmeCk7Ci0JaWYgKHJjKSB7Ci0JCWVmeF9zY2hlZHVsZV9yZXNldChlZngsIFJFU0VUX1RZUEVfRElTQUJMRSk7Ci0JCXJldHVybiByYzsKLQl9CisJZWZ4X2luaXRfY2hhbm5lbHMoZWZ4KTsKIAogCWVmeF9zdGFydF9hbGwoZWZ4KTsKLQotCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyNDksNyArMTIwNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZWZ4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKIAlFRlhfQVNTRVJUX1JFU0VUX1NFUklBTElTRUQoZWZ4KTsKIApAQCAtMTMwMywxMCArMTI1OCwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBlZnhfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsOwogCi0JZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfd2l0aF9pbnRlcnJ1cHQoY2hhbm5lbCwgZWZ4KQorCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkKIAkJZWZ4X3NjaGVkdWxlX2NoYW5uZWwoY2hhbm5lbCk7CiB9CiAKQEAgLTEzMjEsMTIgKzEyNzYsMTUgQEAKIC8qIENvbnRleHQ6IHByb2Nlc3MsIHJ0bmxfbG9jaygpIGhlbGQuICovCiBzdGF0aWMgaW50IGVmeF9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJRUZYX0FTU0VSVF9SRVNFVF9TRVJJQUxJU0VEKGVmeCk7CiAKIAlFRlhfTE9HKGVmeCwgIm9wZW5pbmcgZGV2aWNlICVzIG9uIENQVSAlZFxuIiwgbmV0X2Rldi0+bmFtZSwKIAkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAKKwlpZiAoZWZ4LT5waHlfbW9kZSAmIFBIWV9NT0RFX1NQRUNJQUwpCisJCXJldHVybiAtRUJVU1k7CisKIAllZnhfc3RhcnRfYWxsKGVmeCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzM3LDggKzEyOTUsNyBAQAogICovCiBzdGF0aWMgaW50IGVmeF9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKLQlpbnQgcmM7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJRUZYX0xPRyhlZngsICJjbG9zaW5nICVzIG9uIENQVSAlZFxuIiwgbmV0X2Rldi0+bmFtZSwKIAkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CkBAIC0xMzQ2LDkgKzEzMDMsNyBAQAogCS8qIFN0b3AgdGhlIGRldmljZSBhbmQgZmx1c2ggYWxsIHRoZSBjaGFubmVscyAqLwogCWVmeF9zdG9wX2FsbChlZngpOwogCWVmeF9maW5pX2NoYW5uZWxzKGVmeCk7Ci0JcmMgPSBlZnhfaW5pdF9jaGFubmVscyhlZngpOwotCWlmIChyYykKLQkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9ESVNBQkxFKTsKKwllZnhfaW5pdF9jaGFubmVscyhlZngpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzU2LDcgKzEzMTEsNyBAQAogLyogQ29udGV4dDogcHJvY2VzcywgZGV2X2Jhc2VfbG9jayBvciBSVE5MIGhlbGQsIG5vbi1ibG9ja2luZy4gKi8KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWZ4X25ldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGVmeF9tYWNfc3RhdHMgKm1hY19zdGF0cyA9ICZlZngtPm1hY19zdGF0czsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbmV0X2Rldi0+c3RhdHM7CiAKQEAgLTEzNjYsNyArMTMyMSw3IEBACiAJICovCiAJaWYgKCFzcGluX3RyeWxvY2soJmVmeC0+c3RhdHNfbG9jaykpCiAJCXJldHVybiBzdGF0czsKLQlpZiAoZWZ4LT5zdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7CisJaWYgKGVmeC0+c3RhdHNfZW5hYmxlZCkgewogCQlmYWxjb25fdXBkYXRlX3N0YXRzX3htYWMoZWZ4KTsKIAkJZmFsY29uX3VwZGF0ZV9uaWNfc3RhdHMoZWZ4KTsKIAl9CkBAIC0xNDAzLDcgKzEzNTgsNyBAQAogLyogQ29udGV4dDogbmV0aWZfdHhfbG9jayBoZWxkLCBCSHMgZGlzYWJsZWQuICovCiBzdGF0aWMgdm9pZCBlZnhfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJRUZYX0VSUihlZngsICJUWCBzdHVjayB3aXRoIHN0b3BfY291bnQ9JWQgcG9ydF9lbmFibGVkPSVkOiAlc1xuIiwKIAkJYXRvbWljX3JlYWQoJmVmeC0+bmV0aWZfc3RvcF9jb3VudCksIGVmeC0+cG9ydF9lbmFibGVkLApAQCAtMTQxNyw3ICsxMzcyLDcgQEAKIC8qIENvbnRleHQ6IHByb2Nlc3MsIHJ0bmxfbG9jaygpIGhlbGQuICovCiBzdGF0aWMgaW50IGVmeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgbmV3X210dSkKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJaW50IHJjID0gMDsKIAogCUVGWF9BU1NFUlRfUkVTRVRfU0VSSUFMSVNFRChlZngpOwpAQCAtMTQzMSwyMSArMTM4NiwxNSBAQAogCiAJZWZ4X2ZpbmlfY2hhbm5lbHMoZWZ4KTsKIAluZXRfZGV2LT5tdHUgPSBuZXdfbXR1OwotCXJjID0gZWZ4X2luaXRfY2hhbm5lbHMoZWZ4KTsKLQlpZiAocmMpCi0JCWdvdG8gZmFpbDsKKwllZnhfaW5pdF9jaGFubmVscyhlZngpOwogCiAJZWZ4X3N0YXJ0X2FsbChlZngpOwogCXJldHVybiByYzsKLQotIGZhaWw6Ci0JZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9ESVNBQkxFKTsKLQlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgZWZ4X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gZGF0YTsKIAljaGFyICpuZXdfYWRkciA9IGFkZHItPnNhX2RhdGE7CiAKQEAgLTE0NjYsMjYgKzE0MTUsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogQ29udGV4dDogbmV0aWZfdHhfbG9jayBoZWxkLCBCSHMgZGlzYWJsZWQuICovCisvKiBDb250ZXh0OiBuZXRpZl9hZGRyX2xvY2sgaGVsZCwgQkhzIGRpc2FibGVkLiAqLwogc3RhdGljIHZvaWQgZWZ4X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGRldl9tY19saXN0ICptY19saXN0ID0gbmV0X2Rldi0+bWNfbGlzdDsKIAl1bmlvbiBlZnhfbXVsdGljYXN0X2hhc2ggKm1jX2hhc2ggPSAmZWZ4LT5tdWx0aWNhc3RfaGFzaDsKLQlpbnQgcHJvbWlzY3VvdXM7CisJYm9vbCBwcm9taXNjdW91cyA9ICEhKG5ldF9kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpOworCWJvb2wgY2hhbmdlZCA9IChlZngtPnByb21pc2N1b3VzICE9IHByb21pc2N1b3VzKTsKIAl1MzIgY3JjOwogCWludCBiaXQ7CiAJaW50IGk7CiAKLQkvKiBTZXQgcGVyLU1BQyBwcm9taXNjdWl0eSBmbGFnIGFuZCByZWNvbmZpZ3VyZSBNQUMgaWYgbmVjZXNzYXJ5ICovCi0JcHJvbWlzY3VvdXMgPSAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxIDogMDsKLQlpZiAoZWZ4LT5wcm9taXNjdW91cyAhPSBwcm9taXNjdW91cykgewotCQllZngtPnByb21pc2N1b3VzID0gcHJvbWlzY3VvdXM7Ci0JCS8qIENsb3NlIHRoZSB3aW5kb3cgYmV0d2VlbiBlZnhfc3RvcF9wb3J0KCkgYW5kIGVmeF9mbHVzaF9hbGwoKQotCQkgKiBieSBvbmx5IHF1ZXVpbmcgd29yayB3aGVuIHRoZSBwb3J0IGlzIGVuYWJsZWQuICovCi0JCWlmIChlZngtPnBvcnRfZW5hYmxlZCkKLQkJCXF1ZXVlX3dvcmsoZWZ4LT53b3JrcXVldWUsICZlZngtPnJlY29uZmlndXJlX3dvcmspOwotCX0KKwllZngtPnByb21pc2N1b3VzID0gcHJvbWlzY3VvdXM7CiAKIAkvKiBCdWlsZCBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLwogCWlmIChwcm9taXNjdW91cyB8fCAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CkBAIC0xNTAwLDYgKzE0NDIsMTMgQEAKIAkJfQogCX0KIAorCWlmICghZWZ4LT5wb3J0X2VuYWJsZWQpCisJCS8qIERlbGF5IHB1c2hpbmcgc2V0dGluZ3MgdW50aWwgZWZ4X3N0YXJ0X3BvcnQoKSAqLworCQlyZXR1cm47CisKKwlpZiAoY2hhbmdlZCkKKwkJcXVldWVfd29yayhlZngtPndvcmtxdWV1ZSwgJmVmeC0+cmVjb25maWd1cmVfd29yayk7CisKIAkvKiBDcmVhdGUgYW5kIGFjdGl2YXRlIG5ldyBnbG9iYWwgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KIAlmYWxjb25fc2V0X211bHRpY2FzdF9oYXNoKGVmeCk7CiB9CkBAIC0xNTEwLDcgKzE0NTksNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcHRyOwogCiAJaWYgKG5ldF9kZXYtPm9wZW4gPT0gZWZ4X25ldF9vcGVuICYmIGV2ZW50ID09IE5FVERFVl9DSEFOR0VOQU1FKSB7Ci0JCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKIAkJc3RyY3B5KGVmeC0+bmFtZSwgbmV0X2Rldi0+bmFtZSk7CiAJfQpAQCAtMTU2OCw3ICsxNTE3LDcgQEAKIAlpZiAoIWVmeC0+bmV0X2RldikKIAkJcmV0dXJuOwogCi0JQlVHX09OKGVmeC0+bmV0X2Rldi0+cHJpdiAhPSBlZngpOworCUJVR19PTihuZXRkZXZfcHJpdihlZngtPm5ldF9kZXYpICE9IGVmeCk7CiAKIAkvKiBGcmVlIHVwIGFueSBza2JzIHN0aWxsIHJlbWFpbmluZy4gVGhpcyBoYXMgdG8gaGFwcGVuIGJlZm9yZQogCSAqIHdlIHRyeSB0byB1bnJlZ2lzdGVyIHRoZSBuZXRkZXYgYXMgcnVubmluZyB0aGVpciBkZXN0cnVjdG9ycwpAQCAtMTU4OCw0OSArMTUzNyw2MCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogVGhlIGZpbmFsIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBmaW5hbGlzYXRpb24gYmVmb3JlIHJlc2V0LiAqLwotc3RhdGljIGludCBlZnhfcmVzZXRfZG93bihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCisvKiBUZWFycyBkb3duIHRoZSBlbnRpcmUgc29mdHdhcmUgc3RhdGUgYW5kIG1vc3Qgb2YgdGhlIGhhcmR3YXJlIHN0YXRlCisgKiBiZWZvcmUgcmVzZXQuICAqLwordm9pZCBlZnhfcmVzZXRfZG93bihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJaW50IHJjOwogCiAJRUZYX0FTU0VSVF9SRVNFVF9TRVJJQUxJU0VEKGVmeCk7CiAKKwkvKiBUaGUgbmV0X2Rldi0+Z2V0X3N0YXRzIGhhbmRsZXIgaXMgcXVpdGUgc2xvdywgYW5kIHdpbGwgZmFpbAorCSAqIGlmIGEgZmV0Y2ggaXMgcGVuZGluZyBvdmVyIHJlc2V0LiBTZXJpYWxpc2UgYWdhaW5zdCBpdC4gKi8KKwlzcGluX2xvY2soJmVmeC0+c3RhdHNfbG9jayk7CisJZWZ4LT5zdGF0c19lbmFibGVkID0gZmFsc2U7CisJc3Bpbl91bmxvY2soJmVmeC0+c3RhdHNfbG9jayk7CisKKwllZnhfc3RvcF9hbGwoZWZ4KTsKKwltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKKwogCXJjID0gZmFsY29uX3htYWNfZ2V0X3NldHRpbmdzKGVmeCwgZWNtZCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQlFRlhfRVJSKGVmeCwgImNvdWxkIG5vdCBiYWNrIHVwIFBIWSBzZXR0aW5nc1xuIik7Ci0JCWdvdG8gZmFpbDsKLQl9CiAKIAllZnhfZmluaV9jaGFubmVscyhlZngpOwotCXJldHVybiAwOwotCi0gZmFpbDoKLQlyZXR1cm4gcmM7CiB9CiAKLS8qIFRoZSBmaXJzdCBwYXJ0IG9mIHNvZnR3YXJlIGluaXRpYWxpc2F0aW9uIGFmdGVyIGEgaGFyZHdhcmUgcmVzZXQKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHNlcmlhbGlzYXRpb24gd2l0aCB0aGUga2VybmVsLCBpdAotICogYXNzdW1lcyB0aGUgY2FsbGVyIGhhcyBkb25lIHRoaXMgKi8KLXN0YXRpYyBpbnQgZWZ4X3Jlc2V0X3VwKHN0cnVjdCBlZnhfbmljICplZngsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgZW5zdXJlIHRoYXQgdGhlIGxvY2tzIGFjcXVpcmVkIGluCisgKiBlZnhfcmVzZXRfZG93bigpIGFyZSByZWxlYXNlZC4gQSBmYWlsdXJlIHJldHVybiBjb2RlIGluZGljYXRlcworICogdGhhdCB3ZSB3ZXJlIHVuYWJsZSB0byByZWluaXRpYWxpc2UgdGhlIGhhcmR3YXJlLCBhbmQgdGhlCisgKiBkcml2ZXIgc2hvdWxkIGJlIGRpc2FibGVkLiBJZiBvayBpcyBmYWxzZSwgdGhlbiB0aGUgcnggYW5kIHR4CisgKiBlbmdpbmVzIGFyZSBub3QgcmVzdGFydGVkLCBwZW5kaW5nIGEgUkVTRVRfRElTQUJMRS4gKi8KK2ludCBlZnhfcmVzZXRfdXAoc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGV0aHRvb2xfY21kICplY21kLCBib29sIG9rKQogewogCWludCByYzsKIAotCXJjID0gZWZ4X2luaXRfY2hhbm5lbHMoZWZ4KTsKLQlpZiAocmMpCi0JCWdvdG8gZmFpbDE7CisJRUZYX0FTU0VSVF9SRVNFVF9TRVJJQUxJU0VEKGVmeCk7CiAKLQkvKiBSZXN0b3JlIE1BQyBhbmQgUEhZIHNldHRpbmdzLiAqLwotCXJjID0gZmFsY29uX3htYWNfc2V0X3NldHRpbmdzKGVmeCwgZWNtZCk7CisJcmMgPSBmYWxjb25faW5pdF9uaWMoZWZ4KTsKIAlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJjb3VsZCBub3QgcmVzdG9yZSBQSFkgc2V0dGluZ3NcbiIpOwotCQlnb3RvIGZhaWwyOworCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBpbml0aWFsaXNlIE5JQ1xuIik7CisJCW9rID0gZmFsc2U7CiAJfQogCi0JcmV0dXJuIDA7CisJaWYgKG9rKSB7CisJCWVmeF9pbml0X2NoYW5uZWxzKGVmeCk7CiAKLSBmYWlsMjoKLQllZnhfZmluaV9jaGFubmVscyhlZngpOwotIGZhaWwxOgorCQlpZiAoZmFsY29uX3htYWNfc2V0X3NldHRpbmdzKGVmeCwgZWNtZCkpCisJCQlFRlhfRVJSKGVmeCwgImNvdWxkIG5vdCByZXN0b3JlIFBIWSBzZXR0aW5nc1xuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZlZngtPm1hY19sb2NrKTsKKworCWlmIChvaykgeworCQllZnhfc3RhcnRfYWxsKGVmeCk7CisJCWVmeC0+c3RhdHNfZW5hYmxlZCA9IHRydWU7CisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMTY1OSwyNSArMTYxOSwxNCBAQAogCQlnb3RvIHVubG9ja19ydG5sOwogCX0KIAotCWVmeC0+c3RhdGUgPSBTVEFURV9SRVNFVFRJTkc7CiAJRUZYX0lORk8oZWZ4LCAicmVzZXR0aW5nICglZClcbiIsIG1ldGhvZCk7CiAKLQkvKiBUaGUgbmV0X2Rldi0+Z2V0X3N0YXRzIGhhbmRsZXIgaXMgcXVpdGUgc2xvdywgYW5kIHdpbGwgZmFpbAotCSAqIGlmIGEgZmV0Y2ggaXMgcGVuZGluZyBvdmVyIHJlc2V0LiBTZXJpYWxpc2UgYWdhaW5zdCBpdC4gKi8KLQlzcGluX2xvY2soJmVmeC0+c3RhdHNfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmVmeC0+c3RhdHNfbG9jayk7Ci0KLQllZnhfc3RvcF9hbGwoZWZ4KTsKLQltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKLQotCXJjID0gZWZ4X3Jlc2V0X2Rvd24oZWZ4LCAmZWNtZCk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWwxOworCWVmeF9yZXNldF9kb3duKGVmeCwgJmVjbWQpOwogCiAJcmMgPSBmYWxjb25fcmVzZXRfaHcoZWZ4LCBtZXRob2QpOwogCWlmIChyYykgewogCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byByZXNldCBoYXJkd2FyZVxuIik7Ci0JCWdvdG8gZmFpbDI7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBBbGxvdyByZXNldHMgdG8gYmUgcmVzY2hlZHVsZWQuICovCkBAIC0xNjg5LDQ2ICsxNjM4LDI3IEBACiAJICogY2FuIHJlc3BvbmQgdG8gcmVxdWVzdHMuICovCiAJcGNpX3NldF9tYXN0ZXIoZWZ4LT5wY2lfZGV2KTsKIAotCS8qIFJlaW5pdGlhbGlzZSBkZXZpY2UuIFRoaXMgaXMgYXBwcm9wcmlhdGUgaW4gdGhlIFJFU0VUX1RZUEVfRElTQUJMRQotCSAqIGNhc2Ugc28gdGhlIGRyaXZlciBjYW4gdGFsayB0byBleHRlcm5hbCBTUkFNICovCi0JcmMgPSBmYWxjb25faW5pdF9uaWMoZWZ4KTsKLQlpZiAocmMpIHsKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBOSUNcbiIpOwotCQlnb3RvIGZhaWwzOwotCX0KLQogCS8qIExlYXZlIGRldmljZSBzdG9wcGVkIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChtZXRob2QgPT0gUkVTRVRfVFlQRV9ESVNBQkxFKSB7Ci0JCS8qIFJlaW5pdGlhbGlzZSB0aGUgZGV2aWNlIGFueXdheSBzbyB0aGUgZHJpdmVyIHVubG9hZCBzZXF1ZW5jZQotCQkgKiBjYW4gdGFsayB0byB0aGUgZXh0ZXJuYWwgU1JBTSAqLwotCQlmYWxjb25faW5pdF9uaWMoZWZ4KTsKIAkJcmMgPSAtRUlPOwotCQlnb3RvIGZhaWw0OworCQlnb3RvIGZhaWw7CiAJfQogCi0JcmMgPSBlZnhfcmVzZXRfdXAoZWZ4LCAmZWNtZCk7CisJcmMgPSBlZnhfcmVzZXRfdXAoZWZ4LCAmZWNtZCwgdHJ1ZSk7CiAJaWYgKHJjKQotCQlnb3RvIGZhaWw1OworCQlnb3RvIGRpc2FibGU7CiAKLQltdXRleF91bmxvY2soJmVmeC0+bWFjX2xvY2spOwogCUVGWF9MT0coZWZ4LCAicmVzZXQgY29tcGxldGVcbiIpOwotCi0JZWZ4LT5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7Ci0JZWZ4X3N0YXJ0X2FsbChlZngpOwotCiAgdW5sb2NrX3J0bmw6CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIAotIGZhaWw1OgotIGZhaWw0OgotIGZhaWwzOgotIGZhaWwyOgotIGZhaWwxOgorIGZhaWw6CisJZWZ4X3Jlc2V0X3VwKGVmeCwgJmVjbWQsIGZhbHNlKTsKKyBkaXNhYmxlOgogCUVGWF9FUlIoZWZ4LCAiaGFzIGJlZW4gZGlzYWJsZWRcbiIpOwogCWVmeC0+c3RhdGUgPSBTVEFURV9ESVNBQkxFRDsKIAotCW11dGV4X3VubG9jaygmZWZ4LT5tYWNfbG9jayk7CiAJcnRubF91bmxvY2soKTsKIAllZnhfdW5yZWdpc3Rlcl9uZXRkZXYoZWZ4KTsKIAllZnhfZmluaV9wb3J0KGVmeCk7CkBAIC0xODAxLDcgKzE3MzEsNyBAQAogICoKICAqIER1bW15IFBIWS9NQUMvQm9hcmQgb3BlcmF0aW9ucwogICoKLSAqIENhbiBiZSB1c2VkIHdoZXJlIHRoZSBNQUMgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgb3BlcmF0aW9uCisgKiBDYW4gYmUgdXNlZCBmb3Igc29tZSB1bmltcGxlbWVudGVkIG9wZXJhdGlvbnMKICAqIE5lZWRlZCBzbyBhbGwgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIHZhbGlkIGFuZCBkbyBub3QgaGF2ZSB0byBiZSB0ZXN0ZWQKICAqIGJlZm9yZSB1c2UKICAqCkBAIC0xODExLDcgKzE3NDEsNyBAQAogCXJldHVybiAwOwogfQogdm9pZCBlZnhfcG9ydF9kdW1teV9vcF92b2lkKHN0cnVjdCBlZnhfbmljICplZngpIHt9Ci12b2lkIGVmeF9wb3J0X2R1bW15X29wX2JsaW5rKHN0cnVjdCBlZnhfbmljICplZngsIGludCBibGluaykge30KK3ZvaWQgZWZ4X3BvcnRfZHVtbXlfb3BfYmxpbmsoc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBibGluaykge30KIAogc3RhdGljIHN0cnVjdCBlZnhfcGh5X29wZXJhdGlvbnMgZWZ4X2R1bW15X3BoeV9vcGVyYXRpb25zID0gewogCS5pbml0CQkgPSBlZnhfcG9ydF9kdW1teV9vcF9pbnQsCkBAIC0xODE5LDIwICsxNzQ5LDE0IEBACiAJLmNoZWNrX2h3ICAgICAgICA9IGVmeF9wb3J0X2R1bW15X29wX2ludCwKIAkuZmluaQkJID0gZWZ4X3BvcnRfZHVtbXlfb3Bfdm9pZCwKIAkuY2xlYXJfaW50ZXJydXB0ID0gZWZ4X3BvcnRfZHVtbXlfb3Bfdm9pZCwKLQkucmVzZXRfeGF1aSAgICAgID0gZWZ4X3BvcnRfZHVtbXlfb3Bfdm9pZCwKIH07CiAKLS8qIER1bW15IGJvYXJkIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgZWZ4X25pY19kdW1teV9vcF9pbnQoc3RydWN0IGVmeF9uaWMgKm5pYykKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBlZnhfYm9hcmQgZWZ4X2R1bW15X2JvYXJkX2luZm8gPSB7Ci0JLmluaXQgICAgPSBlZnhfbmljX2R1bW15X29wX2ludCwKLQkuaW5pdF9sZWRzID0gZWZ4X3BvcnRfZHVtbXlfb3BfaW50LAotCS5zZXRfZmF1bHRfbGVkID0gZWZ4X3BvcnRfZHVtbXlfb3BfYmxpbmssCi0JLmZpbmkJPSBlZnhfcG9ydF9kdW1teV9vcF92b2lkLAorCS5pbml0CQk9IGVmeF9wb3J0X2R1bW15X29wX2ludCwKKwkuaW5pdF9sZWRzCT0gZWZ4X3BvcnRfZHVtbXlfb3BfaW50LAorCS5zZXRfZmF1bHRfbGVkCT0gZWZ4X3BvcnRfZHVtbXlfb3BfYmxpbmssCisJLmJsaW5rCQk9IGVmeF9wb3J0X2R1bW15X29wX2JsaW5rLAorCS5maW5pCQk9IGVmeF9wb3J0X2R1bW15X29wX3ZvaWQsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NjUsNyArMTc4OSw3IEBACiAJZWZ4LT5ib2FyZF9pbmZvID0gZWZ4X2R1bW15X2JvYXJkX2luZm87CiAKIAllZngtPm5ldF9kZXYgPSBuZXRfZGV2OwotCWVmeC0+cnhfY2hlY2tzdW1fZW5hYmxlZCA9IDE7CisJZWZ4LT5yeF9jaGVja3N1bV9lbmFibGVkID0gdHJ1ZTsKIAlzcGluX2xvY2tfaW5pdCgmZWZ4LT5uZXRpZl9zdG9wX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZlZngtPnN0YXRzX2xvY2spOwogCW11dGV4X2luaXQoJmVmeC0+bWFjX2xvY2spOwpAQCAtMTg3OCwxMCArMTgwMiw5IEBACiAJCWNoYW5uZWwgPSAmZWZ4LT5jaGFubmVsW2ldOwogCQljaGFubmVsLT5lZnggPSBlZng7CiAJCWNoYW5uZWwtPmNoYW5uZWwgPSBpOwotCQljaGFubmVsLT5ldnFudW0gPSBpOwotCQljaGFubmVsLT53b3JrX3BlbmRpbmcgPSAwOworCQljaGFubmVsLT53b3JrX3BlbmRpbmcgPSBmYWxzZTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IEVGWF9NQVhfVFhfUVVFVUVTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgRUZYX1RYX1FVRVVFX0NPVU5UOyBpKyspIHsKIAkJdHhfcXVldWUgPSAmZWZ4LT50eF9xdWV1ZVtpXTsKIAkJdHhfcXVldWUtPmVmeCA9IGVmeDsKIAkJdHhfcXVldWUtPnF1ZXVlID0gaTsKQEAgLTIwNTYsMTkgKzE5NzksMTYgQEAKIAkJZ290byBmYWlsNTsKIAl9CiAKLQlyYyA9IGVmeF9pbml0X2NoYW5uZWxzKGVmeCk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWw2OworCWVmeF9pbml0X2NoYW5uZWxzKGVmeCk7CiAKIAlyYyA9IGZhbGNvbl9pbml0X2ludGVycnVwdChlZngpOwogCWlmIChyYykKLQkJZ290byBmYWlsNzsKKwkJZ290byBmYWlsNjsKIAogCXJldHVybiAwOwogCi0gZmFpbDc6Ci0JZWZ4X2ZpbmlfY2hhbm5lbHMoZWZ4KTsKICBmYWlsNjoKKwllZnhfZmluaV9jaGFubmVscyhlZngpOwogCWVmeF9maW5pX3BvcnQoZWZ4KTsKICBmYWlsNToKICBmYWlsNDoKQEAgLTIxMDUsNyArMjAyNSwxMCBAQAogCQkJICAgICAgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9UU08pOwogCWlmIChscm8pCiAJCW5ldF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOwotCWVmeCA9IG5ldF9kZXYtPnByaXY7CisJLyogTWFzayBmb3IgZmVhdHVyZXMgdGhhdCBhbHNvIGFwcGx5IHRvIFZMQU4gZGV2aWNlcyAqLworCW5ldF9kZXYtPnZsYW5fZmVhdHVyZXMgfD0gKE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX1NHIHwKKwkJCQkgICBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX1RTTyk7CisJZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGVmeCk7CiAJcmMgPSBlZnhfaW5pdF9zdHJ1Y3QoZWZ4LCB0eXBlLCBwY2lfZGV2LCBuZXRfZGV2KTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZWZ4LmggYi9kcml2ZXJzL25ldC9zZmMvZWZ4LmgKaW5kZXggM2IyZjY5Zi4uZDAyOTM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2VmeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9lZnguaApAQCAtMjgsMTUgKzI4LDIxIEBACiAvKiBSWCAqLwogZXh0ZXJuIHZvaWQgZWZ4X3htaXRfZG9uZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwgdW5zaWduZWQgaW50IGluZGV4KTsKIGV4dGVybiB2b2lkIGVmeF9yeF9wYWNrZXQoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsIHVuc2lnbmVkIGludCBpbmRleCwKLQkJCSAgdW5zaWduZWQgaW50IGxlbiwgaW50IGNoZWNrc3VtbWVkLCBpbnQgZGlzY2FyZCk7CisJCQkgIHVuc2lnbmVkIGludCBsZW4sIGJvb2wgY2hlY2tzdW1tZWQsIGJvb2wgZGlzY2FyZCk7CiBleHRlcm4gdm9pZCBlZnhfc2NoZWR1bGVfc2xvd19maWxsKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLCBpbnQgZGVsYXkpOwogCiAvKiBDaGFubmVscyAqLwogZXh0ZXJuIHZvaWQgZWZ4X3Byb2Nlc3NfY2hhbm5lbF9ub3coc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKTsKLWV4dGVybiBpbnQgZWZ4X2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKK2V4dGVybiB2b2lkIGVmeF9mbHVzaF9xdWV1ZXMoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAKIC8qIFBvcnRzICovCiBleHRlcm4gdm9pZCBlZnhfcmVjb25maWd1cmVfcG9ydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKK2V4dGVybiB2b2lkIF9fZWZ4X3JlY29uZmlndXJlX3BvcnQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CisKKy8qIFJlc2V0IGhhbmRsaW5nICovCitleHRlcm4gdm9pZCBlZnhfcmVzZXRfZG93bihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpOworZXh0ZXJuIGludCBlZnhfcmVzZXRfdXAoc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGV0aHRvb2xfY21kICplY21kLAorCQkJYm9vbCBvayk7CiAKIC8qIEdsb2JhbCAqLwogZXh0ZXJuIHZvaWQgZWZ4X3NjaGVkdWxlX3Jlc2V0KHN0cnVjdCBlZnhfbmljICplZngsIGVudW0gcmVzZXRfdHlwZSB0eXBlKTsKQEAgLTUwLDcgKzU2LDcgQEAKIC8qIER1bW15IFBIWSBvcHMgZm9yIFBIWSBkcml2ZXJzICovCiBleHRlcm4gaW50IGVmeF9wb3J0X2R1bW15X29wX2ludChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiB2b2lkIGVmeF9wb3J0X2R1bW15X29wX3ZvaWQoc3RydWN0IGVmeF9uaWMgKmVmeCk7Ci1leHRlcm4gdm9pZCBlZnhfcG9ydF9kdW1teV9vcF9ibGluayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBpbnQgYmxpbmspOworZXh0ZXJuIHZvaWQgZWZ4X3BvcnRfZHVtbXlfb3BfYmxpbmsoc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBibGluayk7CiAKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBlZnhfbW9uaXRvcl9pbnRlcnZhbDsKQEAgLTU5LDcgKzY1LDcgQEAKIHsKIAlFRlhfVFJBQ0UoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCBzY2hlZHVsaW5nIE5BUEkgcG9sbCBvbiBDUFUlZFxuIiwKIAkJICBjaGFubmVsLT5jaGFubmVsLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQljaGFubmVsLT53b3JrX3BlbmRpbmcgPSAxOworCWNoYW5uZWwtPndvcmtfcGVuZGluZyA9IHRydWU7CiAKIAluZXRpZl9yeF9zY2hlZHVsZShjaGFubmVsLT5uYXBpX2RldiwgJmNoYW5uZWwtPm5hcGlfc3RyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9lbnVtLmggYi9kcml2ZXJzL25ldC9zZmMvZW51bS5oCmluZGV4IGM1MzI5MGQuLmNlYzE1ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9lbnVtLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2VudW0uaApAQCAtNTIsMTIgKzUyLDExIEBACiAjZGVmaW5lIExPT1BCQUNLX01BU0soX2VmeCkJCQlcCiAJKDEgPDwgKF9lZngpLT5sb29wYmFja19tb2RlKQogCi0jZGVmaW5lIExPT1BCQUNLX0lOVEVSTkFMKF9lZngpCQkJCQkJXAotCSgoTE9PUEJBQ0tTXzEwR19JTlRFUk5BTCAmIExPT1BCQUNLX01BU0soX2VmeCkpID8gMSA6IDApCisjZGVmaW5lIExPT1BCQUNLX0lOVEVSTkFMKF9lZngpCQkJCVwKKwkoISEoTE9PUEJBQ0tTXzEwR19JTlRFUk5BTCAmIExPT1BCQUNLX01BU0soX2VmeCkpKQogCi0jZGVmaW5lIExPT1BCQUNLX09VVF9PRihfZnJvbSwgX3RvLCBfbWFzaykJCVwKLQkoKChMT09QQkFDS19NQVNLKF9mcm9tKSAmIChfbWFzaykpICYmCQlcCi0JICAoKExPT1BCQUNLX01BU0soX3RvKSAmIChfbWFzaykpID09IDApKSA/IDEgOiAwKQorI2RlZmluZSBMT09QQkFDS19PVVRfT0YoX2Zyb20sIF90bywgX21hc2spCQkJCVwKKwkoKExPT1BCQUNLX01BU0soX2Zyb20pICYgKF9tYXNrKSkgJiYgIShMT09QQkFDS19NQVNLKF90bykgJiAoX21hc2spKSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc2ZjL2V0aHRvb2wuYwppbmRleCBlMmM3NWQxLi5mYTk4YWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9ldGh0b29sLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJldGh0b29sLmgiCiAjaW5jbHVkZSAiZmFsY29uLmgiCiAjaW5jbHVkZSAiZ21paS5oIgorI2luY2x1ZGUgInNwaS5oIgogI2luY2x1ZGUgIm1hYy5oIgogCiBjb25zdCBjaGFyICplZnhfbG9vcGJhY2tfbW9kZV9uYW1lc1tdID0gewpAQCAtMzIsOCArMzMsNiBAQAogCVtMT09QQkFDS19ORVRXT1JLXQk9ICJORVRXT1JLIiwKIH07CiAKLXN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiBlbmFibGUpOwotCiBzdHJ1Y3QgZXRodG9vbF9zdHJpbmcgewogCWNoYXIgbmFtZVtFVEhfR1NUUklOR19MRU5dOwogfTsKQEAgLTE3Myw2ICsxNzIsMTEgQEAKIC8qIE51bWJlciBvZiBldGh0b29sIHN0YXRpc3RpY3MgKi8KICNkZWZpbmUgRUZYX0VUSFRPT0xfTlVNX1NUQVRTIEFSUkFZX1NJWkUoZWZ4X2V0aHRvb2xfc3RhdHMpCiAKKy8qIEVFUFJPTSByYW5nZSB3aXRoIGdQWEUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBFRlhfRVRIVE9PTF9FRVBST01fTUFHSUMgMHhFRkFCCisjZGVmaW5lIEVGWF9FVEhUT09MX0VFUFJPTV9NSU4gMHgxMDBVCisjZGVmaW5lIEVGWF9FVEhUT09MX0VFUFJPTV9NQVggMHg0MDBVCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEV0aHRvb2wgb3BlcmF0aW9ucwpAQCAtMTgzLDcgKzE4Nyw3IEBACiAvKiBJZGVudGlmeSBkZXZpY2UgYnkgZmxhc2hpbmcgTEVEcyAqLwogc3RhdGljIGludCBlZnhfZXRodG9vbF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1MzIgc2Vjb25kcykKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKIAllZngtPmJvYXJkX2luZm8uYmxpbmsoZWZ4LCAxKTsKIAlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2Vjb25kcyAqIEhaKTsKQEAgLTE5NSw3ICsxOTksNyBAQAogaW50IGVmeF9ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlpbnQgcmM7CiAKIAltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKQEAgLTIwOSw3ICsyMTMsNyBAQAogaW50IGVmeF9ldGh0b29sX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlpbnQgcmM7CiAKIAltdXRleF9sb2NrKCZlZngtPm1hY19sb2NrKTsKQEAgLTIyNCw3ICsyMjgsNyBAQAogc3RhdGljIHZvaWQgZWZ4X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCiAJCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJc3RybGNweShpbmZvLT5kcml2ZXIsIEVGWF9EUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRUZYX0RSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwpAQCAtMzI5LDcgKzMzMywxMCBAQAogCXVuc2lnbmVkIGludCBuID0gMDsKIAllbnVtIGVmeF9sb29wYmFja19tb2RlIG1vZGU7CiAKLQkvKiBJbnRlcnJ1cHQgKi8KKwllZnhfZmlsbF90ZXN0KG4rKywgc3RyaW5ncywgZGF0YSwgJnRlc3RzLT5taWksCisJCSAgICAgICJjb3JlIiwgMCwgIm1paSIsIE5VTEwpOworCWVmeF9maWxsX3Rlc3QobisrLCBzdHJpbmdzLCBkYXRhLCAmdGVzdHMtPm52cmFtLAorCQkgICAgICAiY29yZSIsIDAsICJudnJhbSIsIE5VTEwpOwogCWVmeF9maWxsX3Rlc3QobisrLCBzdHJpbmdzLCBkYXRhLCAmdGVzdHMtPmludGVycnVwdCwKIAkJICAgICAgImNvcmUiLCAwLCAiaW50ZXJydXB0IiwgTlVMTCk7CiAKQEAgLTM0OSwxNiArMzU2LDE3IEBACiAJCQkgICAgICAiZXZlbnRxLnBvbGwiLCBOVUxMKTsKIAl9CiAKLQkvKiBQSFkgcHJlc2VuY2UgKi8KLQllZnhfZmlsbF90ZXN0KG4rKywgc3RyaW5ncywgZGF0YSwgJnRlc3RzLT5waHlfb2ssCi0JCSAgICAgIEVGWF9QT1JUX05BTUUsICJwaHlfb2siLCBOVUxMKTsKKwllZnhfZmlsbF90ZXN0KG4rKywgc3RyaW5ncywgZGF0YSwgJnRlc3RzLT5yZWdpc3RlcnMsCisJCSAgICAgICJjb3JlIiwgMCwgInJlZ2lzdGVycyIsIE5VTEwpOworCWVmeF9maWxsX3Rlc3QobisrLCBzdHJpbmdzLCBkYXRhLCAmdGVzdHMtPnBoeSwKKwkJICAgICAgRUZYX1BPUlRfTkFNRSwgInBoeSIsIE5VTEwpOwogCiAJLyogTG9vcGJhY2sgdGVzdHMgKi8KIAllZnhfZmlsbF90ZXN0KG4rKywgc3RyaW5ncywgZGF0YSwgJnRlc3RzLT5sb29wYmFja19zcGVlZCwKIAkJICAgICAgRUZYX1BPUlRfTkFNRSwgImxvb3BiYWNrLnNwZWVkIiwgTlVMTCk7CiAJZWZ4X2ZpbGxfdGVzdChuKyssIHN0cmluZ3MsIGRhdGEsICZ0ZXN0cy0+bG9vcGJhY2tfZnVsbF9kdXBsZXgsCiAJCSAgICAgIEVGWF9QT1JUX05BTUUsICJsb29wYmFjay5mdWxsX2R1cGxleCIsIE5VTEwpOwotCWZvciAobW9kZSA9IExPT1BCQUNLX05PTkU7IG1vZGUgPCBMT09QQkFDS19URVNUX01BWDsgbW9kZSsrKSB7CisJZm9yIChtb2RlID0gTE9PUEJBQ0tfTk9ORTsgbW9kZSA8PSBMT09QQkFDS19URVNUX01BWDsgbW9kZSsrKSB7CiAJCWlmICghKGVmeC0+bG9vcGJhY2tfbW9kZXMgJiAoMSA8PCBtb2RlKSkpCiAJCQljb250aW51ZTsKIAkJbiA9IGVmeF9maWxsX2xvb3BiYWNrX3Rlc3QoZWZ4LApAQCAtMzY5LDIyICszNzcsMjQgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGludCBlZnhfZXRodG9vbF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgICAgIGludCBzdHJpbmdfc2V0KQogewotCXJldHVybiBFRlhfRVRIVE9PTF9OVU1fU1RBVFM7Ci19Ci0KLXN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfc2VsZl90ZXN0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OwotCi0JcmV0dXJuIGVmeF9ldGh0b29sX2ZpbGxfc2VsZl90ZXN0cyhlZngsIE5VTEwsIE5VTEwsIE5VTEwpOworCXN3aXRjaCAoc3RyaW5nX3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gRUZYX0VUSFRPT0xfTlVNX1NUQVRTOworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCXJldHVybiBlZnhfZXRodG9vbF9maWxsX3NlbGZfdGVzdHMobmV0ZGV2X3ByaXYobmV0X2RldiksCisJCQkJCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGVmeF9ldGh0b29sX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAogCQkJCSAgICB1MzIgc3RyaW5nX3NldCwgdTggKnN0cmluZ3MpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBldGh0b29sX3N0cmluZyAqZXRodG9vbF9zdHJpbmdzID0KIAkJKHN0cnVjdCBldGh0b29sX3N0cmluZyAqKXN0cmluZ3M7CiAJaW50IGk7CkBAIC00MTAsNyArNDIwLDcgQEAKIAkJCQkgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywKIAkJCQkgIHU2NCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGVmeF9tYWNfc3RhdHMgKm1hY19zdGF0cyA9ICZlZngtPm1hY19zdGF0czsKIAlzdHJ1Y3QgZWZ4X2V0aHRvb2xfc3RhdCAqc3RhdDsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7CkBAIC00NDIsNjAgKzQ1MiwyMSBAQAogCX0KIH0KIAotc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCB1MzIgZW5hYmxlKQotewotCWludCByYzsKLQotCS8qIE91ciBUU08gcmVxdWlyZXMgVFggY2hlY2tzdW1taW5nLCBzbyBmb3JjZSBUWCBjaGVja3N1bW1pbmcKLQkgKiBvbiB3aGVuIFRTTyBpcyBlbmFibGVkLgotCSAqLwotCWlmIChlbmFibGUpIHsKLQkJcmMgPSBlZnhfZXRodG9vbF9zZXRfdHhfY3N1bShuZXRfZGV2LCAxKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiBldGh0b29sX29wX3NldF90c28obmV0X2RldiwgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgdTMyIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKLQlpbnQgcmM7Ci0KLQlyYyA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0obmV0X2RldiwgZW5hYmxlKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWVmeF9mbHVzaF9xdWV1ZXMoZWZ4KTsKLQotCS8qIE91ciBUU08gcmVxdWlyZXMgVFggY2hlY2tzdW1taW5nLCBzbyBkaXNhYmxlIFRTTyB3aGVuCi0JICogY2hlY2tzdW1taW5nIGlzIGRpc2FibGVkCi0JICovCi0JaWYgKCFlbmFibGUpIHsKLQkJcmMgPSBlZnhfZXRodG9vbF9zZXRfdHNvKG5ldF9kZXYsIDApOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiBlbmFibGUpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJLyogTm8gd2F5IHRvIHN0b3AgdGhlIGhhcmR3YXJlIGRvaW5nIHRoZSBjaGVja3M7IHdlIGp1c3QKIAkgKiBpZ25vcmUgdGhlIHJlc3VsdC4KIAkgKi8KLQllZngtPnJ4X2NoZWNrc3VtX2VuYWJsZWQgPSAoZW5hYmxlID8gMSA6IDApOworCWVmeC0+cnhfY2hlY2tzdW1fZW5hYmxlZCA9ICEhZW5hYmxlOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1MzIgZWZ4X2V0aHRvb2xfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJcmV0dXJuIGVmeC0+cnhfY2hlY2tzdW1fZW5hYmxlZDsKIH0KQEAgLTUwMyw3ICs0NzQsNyBAQAogc3RhdGljIHZvaWQgZWZ4X2V0aHRvb2xfc2VsZl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAogCQkJCSAgc3RydWN0IGV0aHRvb2xfdGVzdCAqdGVzdCwgdTY0ICpkYXRhKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgZWZ4X3Rlc3RzOwogCWludCBvZmZsaW5lLCBhbHJlYWR5X3VwOwogCWludCByYzsKQEAgLTUzMywxNSArNTA0LDkgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBQZXJmb3JtIG9mZmxpbmUgdGVzdHMgb25seSBpZiBvbmxpbmUgdGVzdHMgcGFzc2VkICovCi0JaWYgKG9mZmxpbmUpIHsKLQkJLyogU3RvcCB0aGUga2VybmVsIGZyb20gc2VuZGluZyBwYWNrZXRzIGR1cmluZyB0aGUgdGVzdC4gKi8KLQkJZWZ4X3N0b3BfcXVldWUoZWZ4KTsKLQkJcmMgPSBlZnhfZmx1c2hfcXVldWVzKGVmeCk7Ci0JCWlmICghcmMpCi0JCQlyYyA9IGVmeF9vZmZsaW5lX3Rlc3QoZWZ4LCAmZWZ4X3Rlc3RzLAotCQkJCQkgICAgICBlZngtPmxvb3BiYWNrX21vZGVzKTsKLQkJZWZ4X3dha2VfcXVldWUoZWZ4KTsKLQl9CisJaWYgKG9mZmxpbmUpCisJCXJjID0gZWZ4X29mZmxpbmVfdGVzdChlZngsICZlZnhfdGVzdHMsCisJCQkJICAgICAgZWZ4LT5sb29wYmFja19tb2Rlcyk7CiAKICBvdXQ6CiAJaWYgKCFhbHJlYWR5X3VwKQpAQCAtNTYxLDIyICs1MjYsNjUgQEAKIC8qIFJlc3RhcnQgYXV0b25lZ290aWF0aW9uICovCiBzdGF0aWMgaW50IGVmeF9ldGh0b29sX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCiAJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmVmeC0+bWlpKTsKIH0KIAogc3RhdGljIHUzMiBlZnhfZXRodG9vbF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKIAlyZXR1cm4gZWZ4LT5saW5rX3VwOwogfQogCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwlzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSA9IGVmeC0+c3BpX2VlcHJvbTsKKworCWlmICghc3BpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbWluKHNwaS0+c2l6ZSwgRUZYX0VUSFRPT0xfRUVQUk9NX01BWCkgLQorCQltaW4oc3BpLT5zaXplLCBFRlhfRVRIVE9PTF9FRVBST01fTUlOKTsKK30KKworc3RhdGljIGludCBlZnhfZXRodG9vbF9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpidWYpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpID0gZWZ4LT5zcGlfZWVwcm9tOworCXNpemVfdCBsZW47CisJaW50IHJjOworCisJcmMgPSBmYWxjb25fc3BpX3JlYWQoc3BpLCBlZXByb20tPm9mZnNldCArIEVGWF9FVEhUT09MX0VFUFJPTV9NSU4sCisJCQkgICAgIGVlcHJvbS0+bGVuLCAmbGVuLCBidWYpOworCWVlcHJvbS0+bWFnaWMgPSBFRlhfRVRIVE9PTF9FRVBST01fTUFHSUM7CisJZWVwcm9tLT5sZW4gPSBsZW47CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisJc3RydWN0IGVmeF9zcGlfZGV2aWNlICpzcGkgPSBlZngtPnNwaV9lZXByb207CisJc2l6ZV90IGxlbjsKKwlpbnQgcmM7CisKKwlpZiAoZWVwcm9tLT5tYWdpYyAhPSBFRlhfRVRIVE9PTF9FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBmYWxjb25fc3BpX3dyaXRlKHNwaSwgZWVwcm9tLT5vZmZzZXQgKyBFRlhfRVRIVE9PTF9FRVBST01fTUlOLAorCQkJICAgICAgZWVwcm9tLT5sZW4sICZsZW4sIGJ1Zik7CisJZWVwcm9tLT5sZW4gPSBsZW47CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKIAkJCQkgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZTsKIAlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZTsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7CkBAIC02MTQsNyArNjIyLDcgQEAKIHN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAogCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVzY2UpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKIAlzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZTsKIAl1bnNpZ25lZCB0eF91c2VjcywgcnhfdXNlY3M7CkBAIC02NTcsNyArNjY1LDcgQEAKIHN0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCiAJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCWVudW0gZWZ4X2ZjX3R5cGUgZmxvd19jb250cm9sID0gZWZ4LT5mbG93X2NvbnRyb2w7CiAJaW50IHJjOwogCkBAIC02ODAsMTEgKzY4OCwxMSBAQAogc3RhdGljIHZvaWQgZWZ4X2V0aHRvb2xfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCiAJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAotCXBhdXNlLT5yeF9wYXVzZSA9IChlZngtPmZsb3dfY29udHJvbCAmIEVGWF9GQ19SWCkgPyAxIDogMDsKLQlwYXVzZS0+dHhfcGF1c2UgPSAoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfVFgpID8gMSA6IDA7Ci0JcGF1c2UtPmF1dG9uZWcgPSAoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfQVVUTykgPyAxIDogMDsKKwlwYXVzZS0+cnhfcGF1c2UgPSAhIShlZngtPmZsb3dfY29udHJvbCAmIEVGWF9GQ19SWCk7CisJcGF1c2UtPnR4X3BhdXNlID0gISEoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfVFgpOworCXBhdXNlLT5hdXRvbmVnID0gISEoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfQVVUTyk7CiB9CiAKIApAQCAtNjk0LDYgKzcwMiw5IEBACiAJLmdldF9kcnZpbmZvCQk9IGVmeF9ldGh0b29sX2dldF9kcnZpbmZvLAogCS5ud2F5X3Jlc2V0CQk9IGVmeF9ldGh0b29sX253YXlfcmVzZXQsCiAJLmdldF9saW5rCQk9IGVmeF9ldGh0b29sX2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBlZnhfZXRodG9vbF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQkJPSBlZnhfZXRodG9vbF9nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IGVmeF9ldGh0b29sX3NldF9lZXByb20sCiAJLmdldF9jb2FsZXNjZQkJPSBlZnhfZXRodG9vbF9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQkJPSBlZnhfZXRodG9vbF9zZXRfY29hbGVzY2UsCiAJLmdldF9wYXVzZXBhcmFtICAgICAgICAgPSBlZnhfZXRodG9vbF9nZXRfcGF1c2VwYXJhbSwKQEAgLTcwMSwxNyArNzEyLDE2IEBACiAJLmdldF9yeF9jc3VtCQk9IGVmeF9ldGh0b29sX2dldF9yeF9jc3VtLAogCS5zZXRfcnhfY3N1bQkJPSBlZnhfZXRodG9vbF9zZXRfcnhfY3N1bSwKIAkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKLQkuc2V0X3R4X2NzdW0JCT0gZWZ4X2V0aHRvb2xfc2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtCQk9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCiAJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCiAJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCiAJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAotCS5zZXRfdHNvCQk9IGVmeF9ldGh0b29sX3NldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAogCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCiAJLnNldF9mbGFncwkJPSBldGh0b29sX29wX3NldF9mbGFncywKLQkuc2VsZl90ZXN0X2NvdW50CT0gZWZ4X2V0aHRvb2xfc2VsZl90ZXN0X2NvdW50LAorCS5nZXRfc3NldF9jb3VudAkJPSBlZnhfZXRodG9vbF9nZXRfc3NldF9jb3VudCwKIAkuc2VsZl90ZXN0CQk9IGVmeF9ldGh0b29sX3NlbGZfdGVzdCwKIAkuZ2V0X3N0cmluZ3MJCT0gZWZ4X2V0aHRvb2xfZ2V0X3N0cmluZ3MsCiAJLnBoeXNfaWQJCT0gZWZ4X2V0aHRvb2xfcGh5c19pZCwKLQkuZ2V0X3N0YXRzX2NvdW50CT0gZWZ4X2V0aHRvb2xfZ2V0X3N0YXRzX2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGVmeF9ldGh0b29sX2dldF9zdGF0cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKaW5kZXggOTEzOGVlNS4uMzFlZDFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYwpAQCAtMTA4LDEwICsxMDgsMTAgQEAKIC8qIE1heCBudW1iZXIgb2YgaW50ZXJuYWwgZXJyb3JzLiBBZnRlciB0aGlzIHJlc2V0cyB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgKi8KICNkZWZpbmUgRkFMQ09OX01BWF9JTlRfRVJST1JTIDQKIAotLyogTWF4aW11bSBwZXJpb2QgdGhhdCB3ZSB3YWl0IGZvciBmbHVzaCBldmVudHMuIElmIHRoZSBmbHVzaCBldmVudAotICogZG9lc24ndCBhcnJpdmUgaW4gdGhpcyBwZXJpb2Qgb2YgdGltZSB0aGVuIHdlIGNoZWNrIGlmIHRoZSBxdWV1ZQotICogd2FzIGRpc2FibGVkIGFueXdheS4gKi8KLSNkZWZpbmUgRkFMQ09OX0ZMVVNIX1RJTUVPVVQgMTAgLyogMTBtcyAqLworLyogV2UgcG9sbCBmb3IgZXZlbnRzIGV2ZXJ5IEZMVVNIX0lOVEVSVkFMIG1zLCBhbmQgY2hlY2sgRkxVU0hfUE9MTF9DT1VOVCB0aW1lcworICovCisjZGVmaW5lIEZBTENPTl9GTFVTSF9JTlRFUlZBTCAxMAorI2RlZmluZSBGQUxDT05fRkxVU0hfUE9MTF9DT1VOVCAxMDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjQyLDcgKzI0Miw3IEBACiAgKiBmYWxjb25fYWxsb2Nfc3BlY2lhbF9idWZmZXIoKSkgaW4gRmFsY29uJ3MgYnVmZmVyIHRhYmxlLCBhbGxvd2luZwogICogaXQgdG8gYmUgdXNlZCBmb3IgZXZlbnQgcXVldWVzLCBkZXNjcmlwdG9yIHJpbmdzIGV0Yy4KICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGZhbGNvbl9pbml0X3NwZWNpYWxfYnVmZmVyKHN0cnVjdCBlZnhfbmljICplZngsCiAJCQkgICBzdHJ1Y3QgZWZ4X3NwZWNpYWxfYnVmZmVyICpidWZmZXIpCiB7CkBAIC0yNjYsOCArMjY2LDYgQEAKIAkJCQkgICAgIEJVRl9PV05FUl9JRF9GQlVGLCAwKTsKIAkJZmFsY29uX3dyaXRlX3NyYW0oZWZ4LCAmYnVmX2Rlc2MsIGluZGV4KTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyogVW5tYXBzIGEgYnVmZmVyIGZyb20gRmFsY29uIGFuZCBjbGVhcnMgdGhlIGJ1ZmZlciB0YWJsZSBlbnRyaWVzICovCkBAIC00NDksMTYgKzQ0NywxNSBAQAogCQkJCQkgICBzaXplb2YoZWZ4X3F3b3JkX3QpKTsKIH0KIAotaW50IGZhbGNvbl9pbml0X3R4KHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKQordm9pZCBmYWxjb25faW5pdF90eChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSkKIHsKIAllZnhfb3dvcmRfdCB0eF9kZXNjX3B0cjsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gdHhfcXVldWUtPmVmeDsKLQlpbnQgcmM7CisKKwl0eF9xdWV1ZS0+Zmx1c2hlZCA9IGZhbHNlOwogCiAJLyogUGluIFRYIGRlc2NyaXB0b3IgcmluZyAqLwotCXJjID0gZmFsY29uX2luaXRfc3BlY2lhbF9idWZmZXIoZWZ4LCAmdHhfcXVldWUtPnR4ZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJZmFsY29uX2luaXRfc3BlY2lhbF9idWZmZXIoZWZ4LCAmdHhfcXVldWUtPnR4ZCk7CiAKIAkvKiBQdXNoIFRYIGRlc2NyaXB0b3IgcmluZyB0byBjYXJkICovCiAJRUZYX1BPUFVMQVRFX09XT1JEXzEwKHR4X2Rlc2NfcHRyLApAQCAtNDY2LDcgKzQ2Myw3IEBACiAJCQkgICAgICBUWF9JU0NTSV9ERElHX0VOLCAwLAogCQkJICAgICAgVFhfSVNDU0lfSERJR19FTiwgMCwKIAkJCSAgICAgIFRYX0RFU0NRX0JVRl9CQVNFX0lELCB0eF9xdWV1ZS0+dHhkLmluZGV4LAotCQkJICAgICAgVFhfREVTQ1FfRVZRX0lELCB0eF9xdWV1ZS0+Y2hhbm5lbC0+ZXZxbnVtLAorCQkJICAgICAgVFhfREVTQ1FfRVZRX0lELCB0eF9xdWV1ZS0+Y2hhbm5lbC0+Y2hhbm5lbCwKIAkJCSAgICAgIFRYX0RFU0NRX09XTkVSX0lELCAwLAogCQkJICAgICAgVFhfREVTQ1FfTEFCRUwsIHR4X3F1ZXVlLT5xdWV1ZSwKIAkJCSAgICAgIFRYX0RFU0NRX1NJWkUsIEZBTENPTl9UWERfUklOR19PUkRFUiwKQEAgLTQ3NCw5ICs0NzEsOSBAQAogCQkJICAgICAgVFhfTk9OX0lQX0RST1BfRElTX0IwLCAxKTsKIAogCWlmIChmYWxjb25fcmV2KGVmeCkgPj0gRkFMQ09OX1JFVl9CMCkgewotCQlpbnQgY3N1bSA9ICEoZWZ4LT5uZXRfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSk7Ci0JCUVGWF9TRVRfT1dPUkRfRklFTEQodHhfZGVzY19wdHIsIFRYX0lQX0NIS1NNX0RJU19CMCwgY3N1bSk7Ci0JCUVGWF9TRVRfT1dPUkRfRklFTEQodHhfZGVzY19wdHIsIFRYX1RDUF9DSEtTTV9ESVNfQjAsIGNzdW0pOworCQlpbnQgY3N1bSA9IHR4X3F1ZXVlLT5xdWV1ZSA9PSBFRlhfVFhfUVVFVUVfT0ZGTE9BRF9DU1VNOworCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHR4X2Rlc2NfcHRyLCBUWF9JUF9DSEtTTV9ESVNfQjAsICFjc3VtKTsKKwkJRUZYX1NFVF9PV09SRF9GSUVMRCh0eF9kZXNjX3B0ciwgVFhfVENQX0NIS1NNX0RJU19CMCwgIWNzdW0pOwogCX0KIAogCWZhbGNvbl93cml0ZV90YWJsZShlZngsICZ0eF9kZXNjX3B0ciwgZWZ4LT50eXBlLT50eGRfcHRyX3RibF9iYXNlLApAQCAtNDg1LDczICs0ODIsMjggQEAKIAlpZiAoZmFsY29uX3JldihlZngpIDwgRkFMQ09OX1JFVl9CMCkgewogCQllZnhfb3dvcmRfdCByZWc7CiAKLQkJQlVHX09OKHR4X3F1ZXVlLT5xdWV1ZSA+PSAxMjgpOyAvKiBIVyBsaW1pdCAqLworCQkvKiBPbmx5IDEyOCBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgKi8KKwkJQlVJTERfQlVHX09OKEVGWF9UWF9RVUVVRV9DT1VOVCA+PSAxMjgpOwogCiAJCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgVFhfQ0hLU01fQ0ZHX1JFR19LRVJfQTEpOwotCQlpZiAoZWZ4LT5uZXRfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkKKwkJaWYgKHR4X3F1ZXVlLT5xdWV1ZSA9PSBFRlhfVFhfUVVFVUVfT0ZGTE9BRF9DU1VNKQogCQkJY2xlYXJfYml0X2xlKHR4X3F1ZXVlLT5xdWV1ZSwgKHZvaWQgKikmcmVnKTsKIAkJZWxzZQogCQkJc2V0X2JpdF9sZSh0eF9xdWV1ZS0+cXVldWUsICh2b2lkICopJnJlZyk7CiAJCWZhbGNvbl93cml0ZShlZngsICZyZWcsIFRYX0NIS1NNX0NGR19SRUdfS0VSX0ExKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmYWxjb25fZmx1c2hfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCitzdGF0aWMgdm9pZCBmYWxjb25fZmx1c2hfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHR4X3F1ZXVlLT5lZng7Ci0Jc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsID0gJmVmeC0+Y2hhbm5lbFswXTsKIAllZnhfb3dvcmRfdCB0eF9mbHVzaF9kZXNjcTsKLQl1bnNpZ25lZCBpbnQgcmVhZF9wdHIsIGk7CiAKIAkvKiBQb3N0IGEgZmx1c2ggY29tbWFuZCAqLwogCUVGWF9QT1BVTEFURV9PV09SRF8yKHR4X2ZsdXNoX2Rlc2NxLAogCQkJICAgICBUWF9GTFVTSF9ERVNDUV9DTUQsIDEsCiAJCQkgICAgIFRYX0ZMVVNIX0RFU0NRLCB0eF9xdWV1ZS0+cXVldWUpOwogCWZhbGNvbl93cml0ZShlZngsICZ0eF9mbHVzaF9kZXNjcSwgVFhfRkxVU0hfREVTQ1FfUkVHX0tFUik7Ci0JbXNsZWVwKEZBTENPTl9GTFVTSF9USU1FT1VUKTsKLQotCWlmIChFRlhfV09SS0FST1VORF83ODAzKGVmeCkpCi0JCXJldHVybiAwOwotCi0JLyogTG9vayBmb3IgYSBmbHVzaCBjb21wbGV0ZWQgZXZlbnQgKi8KLQlyZWFkX3B0ciA9IGNoYW5uZWwtPmV2ZW50cV9yZWFkX3B0cjsKLQlmb3IgKGkgPSAwOyBpIDwgRkFMQ09OX0VWUV9TSVpFOyArK2kpIHsKLQkJZWZ4X3F3b3JkX3QgKmV2ZW50ID0gZmFsY29uX2V2ZW50KGNoYW5uZWwsIHJlYWRfcHRyKTsKLQkJaW50IGV2X2NvZGUsIGV2X3N1Yl9jb2RlLCBldl9xdWV1ZTsKLQkJaWYgKCFmYWxjb25fZXZlbnRfcHJlc2VudChldmVudCkpCi0JCQlicmVhazsKLQotCQlldl9jb2RlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgRVZfQ09ERSk7Ci0JCWV2X3N1Yl9jb2RlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgRFJJVkVSX0VWX1NVQl9DT0RFKTsKLQkJZXZfcXVldWUgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBEUklWRVJfRVZfVFhfREVTQ1FfSUQpOwotCQlpZiAoKGV2X3N1Yl9jb2RlID09IFRYX0RFU0NRX0ZMU19ET05FX0VWX0RFQ09ERSkgJiYKLQkJICAgIChldl9xdWV1ZSA9PSB0eF9xdWV1ZS0+cXVldWUpKSB7Ci0JCQlFRlhfTE9HKGVmeCwgInR4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgc3VjY2VzZnVsXG4iLAotCQkJCXR4X3F1ZXVlLT5xdWV1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXJlYWRfcHRyID0gKHJlYWRfcHRyICsgMSkgJiBGQUxDT05fRVZRX01BU0s7Ci0JfQotCi0JaWYgKEVGWF9XT1JLQVJPVU5EXzExNTU3KGVmeCkpIHsKLQkJZWZ4X293b3JkX3QgcmVnOwotCQlpbnQgZW5hYmxlZDsKLQotCQlmYWxjb25fcmVhZF90YWJsZShlZngsICZyZWcsIGVmeC0+dHlwZS0+dHhkX3B0cl90YmxfYmFzZSwKLQkJCQkgIHR4X3F1ZXVlLT5xdWV1ZSk7Ci0JCWVuYWJsZWQgPSBFRlhfT1dPUkRfRklFTEQocmVnLCBUWF9ERVNDUV9FTik7Ci0JCWlmICghZW5hYmxlZCkgewotCQkJRUZYX0xPRyhlZngsICJ0eCBxdWV1ZSAlZCBkaXNhYmxlZCB3aXRob3V0IGEgIgotCQkJCSJmbHVzaCBldmVudCBzZWVuXG4iLCB0eF9xdWV1ZS0+cXVldWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlFRlhfRVJSKGVmeCwgInR4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgdGltZWQgb3V0XG4iLCB0eF9xdWV1ZS0+cXVldWUpOwotCXJldHVybiAtRVRJTUVET1VUOwogfQogCiB2b2lkIGZhbGNvbl9maW5pX3R4KHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKQpAQCAtNTU5LDkgKzUxMSw4IEBACiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHR4X3F1ZXVlLT5lZng7CiAJZWZ4X293b3JkX3QgdHhfZGVzY19wdHI7CiAKLQkvKiBTdG9wIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgcXVldWUgKi8KLQlpZiAoZmFsY29uX2ZsdXNoX3R4X3F1ZXVlKHR4X3F1ZXVlKSkKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgdG8gZmx1c2ggdHggcXVldWUgJWRcbiIsIHR4X3F1ZXVlLT5xdWV1ZSk7CisJLyogVGhlIHF1ZXVlIHNob3VsZCBoYXZlIGJlZW4gZmx1c2hlZCAqLworCVdBUk5fT04oIXR4X3F1ZXVlLT5mbHVzaGVkKTsKIAogCS8qIFJlbW92ZSBUWCBkZXNjcmlwdG9yIHJpbmcgZnJvbSBjYXJkICovCiAJRUZYX1pFUk9fT1dPUkQodHhfZGVzY19wdHIpOwpAQCAtNjM4LDI5ICs1ODksMjggQEAKIAkJCQkJICAgc2l6ZW9mKGVmeF9xd29yZF90KSk7CiB9CiAKLWludCBmYWxjb25faW5pdF9yeChzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKK3ZvaWQgZmFsY29uX2luaXRfcngoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCiB7CiAJZWZ4X293b3JkX3QgcnhfZGVzY19wdHI7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7Ci0JaW50IHJjOwotCWludCBpc19iMCA9IGZhbGNvbl9yZXYoZWZ4KSA+PSBGQUxDT05fUkVWX0IwOwotCWludCBpc2NzaV9kaWdlc3RfZW4gPSBpc19iMDsKKwlib29sIGlzX2IwID0gZmFsY29uX3JldihlZngpID49IEZBTENPTl9SRVZfQjA7CisJYm9vbCBpc2NzaV9kaWdlc3RfZW4gPSBpc19iMDsKIAogCUVGWF9MT0coZWZ4LCAiUlggcXVldWUgJWQgcmluZyBpbiBzcGVjaWFsIGJ1ZmZlcnMgJWQtJWRcbiIsCiAJCXJ4X3F1ZXVlLT5xdWV1ZSwgcnhfcXVldWUtPnJ4ZC5pbmRleCwKIAkJcnhfcXVldWUtPnJ4ZC5pbmRleCArIHJ4X3F1ZXVlLT5yeGQuZW50cmllcyAtIDEpOwogCisJcnhfcXVldWUtPmZsdXNoZWQgPSBmYWxzZTsKKwogCS8qIFBpbiBSWCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlyYyA9IGZhbGNvbl9pbml0X3NwZWNpYWxfYnVmZmVyKGVmeCwgJnJ4X3F1ZXVlLT5yeGQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOworCWZhbGNvbl9pbml0X3NwZWNpYWxfYnVmZmVyKGVmeCwgJnJ4X3F1ZXVlLT5yeGQpOwogCiAJLyogUHVzaCBSWCBkZXNjcmlwdG9yIHJpbmcgdG8gY2FyZCAqLwogCUVGWF9QT1BVTEFURV9PV09SRF8xMChyeF9kZXNjX3B0ciwKIAkJCSAgICAgIFJYX0lTQ1NJX0RESUdfRU4sIGlzY3NpX2RpZ2VzdF9lbiwKIAkJCSAgICAgIFJYX0lTQ1NJX0hESUdfRU4sIGlzY3NpX2RpZ2VzdF9lbiwKIAkJCSAgICAgIFJYX0RFU0NRX0JVRl9CQVNFX0lELCByeF9xdWV1ZS0+cnhkLmluZGV4LAotCQkJICAgICAgUlhfREVTQ1FfRVZRX0lELCByeF9xdWV1ZS0+Y2hhbm5lbC0+ZXZxbnVtLAorCQkJICAgICAgUlhfREVTQ1FfRVZRX0lELCByeF9xdWV1ZS0+Y2hhbm5lbC0+Y2hhbm5lbCwKIAkJCSAgICAgIFJYX0RFU0NRX09XTkVSX0lELCAwLAogCQkJICAgICAgUlhfREVTQ1FfTEFCRUwsIHJ4X3F1ZXVlLT5xdWV1ZSwKIAkJCSAgICAgIFJYX0RFU0NRX1NJWkUsIEZBTENPTl9SWERfUklOR19PUkRFUiwKQEAgLTY3MCwxNCArNjIwLDExIEBACiAJCQkgICAgICBSWF9ERVNDUV9FTiwgMSk7CiAJZmFsY29uX3dyaXRlX3RhYmxlKGVmeCwgJnJ4X2Rlc2NfcHRyLCBlZngtPnR5cGUtPnJ4ZF9wdHJfdGJsX2Jhc2UsCiAJCQkgICByeF9xdWV1ZS0+cXVldWUpOwotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZhbGNvbl9mbHVzaF9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKK3N0YXRpYyB2b2lkIGZhbGNvbl9mbHVzaF9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gcnhfcXVldWUtPmVmeDsKLQlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwgPSAmZWZ4LT5jaGFubmVsWzBdOwotCXVuc2lnbmVkIGludCByZWFkX3B0ciwgaTsKIAllZnhfb3dvcmRfdCByeF9mbHVzaF9kZXNjcTsKIAogCS8qIFBvc3QgYSBmbHVzaCBjb21tYW5kICovCkBAIC02ODUsNzUgKzYzMiwxNSBAQAogCQkJICAgICBSWF9GTFVTSF9ERVNDUV9DTUQsIDEsCiAJCQkgICAgIFJYX0ZMVVNIX0RFU0NRLCByeF9xdWV1ZS0+cXVldWUpOwogCWZhbGNvbl93cml0ZShlZngsICZyeF9mbHVzaF9kZXNjcSwgUlhfRkxVU0hfREVTQ1FfUkVHX0tFUik7Ci0JbXNsZWVwKEZBTENPTl9GTFVTSF9USU1FT1VUKTsKLQotCWlmIChFRlhfV09SS0FST1VORF83ODAzKGVmeCkpCi0JCXJldHVybiAwOwotCi0JLyogTG9vayBmb3IgYSBmbHVzaCBjb21wbGV0ZWQgZXZlbnQgKi8KLQlyZWFkX3B0ciA9IGNoYW5uZWwtPmV2ZW50cV9yZWFkX3B0cjsKLQlmb3IgKGkgPSAwOyBpIDwgRkFMQ09OX0VWUV9TSVpFOyArK2kpIHsKLQkJZWZ4X3F3b3JkX3QgKmV2ZW50ID0gZmFsY29uX2V2ZW50KGNoYW5uZWwsIHJlYWRfcHRyKTsKLQkJaW50IGV2X2NvZGUsIGV2X3N1Yl9jb2RlLCBldl9xdWV1ZSwgZXZfZmFpbGVkOwotCQlpZiAoIWZhbGNvbl9ldmVudF9wcmVzZW50KGV2ZW50KSkKLQkJCWJyZWFrOwotCi0JCWV2X2NvZGUgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBFVl9DT0RFKTsKLQkJZXZfc3ViX2NvZGUgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBEUklWRVJfRVZfU1VCX0NPREUpOwotCQlldl9xdWV1ZSA9IEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIERSSVZFUl9FVl9SWF9ERVNDUV9JRCk7Ci0JCWV2X2ZhaWxlZCA9IEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIERSSVZFUl9FVl9SWF9GTFVTSF9GQUlMKTsKLQotCQlpZiAoKGV2X3N1Yl9jb2RlID09IFJYX0RFU0NRX0ZMU19ET05FX0VWX0RFQ09ERSkgJiYKLQkJICAgIChldl9xdWV1ZSA9PSByeF9xdWV1ZS0+cXVldWUpKSB7Ci0JCQlpZiAoZXZfZmFpbGVkKSB7Ci0JCQkJRUZYX0lORk8oZWZ4LCAicnggcXVldWUgJWQgZmx1c2ggY29tbWFuZCAiCi0JCQkJCSAiZmFpbGVkXG4iLCByeF9xdWV1ZS0+cXVldWUpOwotCQkJCXJldHVybiAtRUFHQUlOOwotCQkJfSBlbHNlIHsKLQkJCQlFRlhfTE9HKGVmeCwgInJ4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgIgotCQkJCQkic3VjY2VzZnVsXG4iLCByeF9xdWV1ZS0+cXVldWUpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0KLQkJcmVhZF9wdHIgPSAocmVhZF9wdHIgKyAxKSAmIEZBTENPTl9FVlFfTUFTSzsKLQl9Ci0KLQlpZiAoRUZYX1dPUktBUk9VTkRfMTE1NTcoZWZ4KSkgewotCQllZnhfb3dvcmRfdCByZWc7Ci0JCWludCBlbmFibGVkOwotCi0JCWZhbGNvbl9yZWFkX3RhYmxlKGVmeCwgJnJlZywgZWZ4LT50eXBlLT5yeGRfcHRyX3RibF9iYXNlLAotCQkJCSAgcnhfcXVldWUtPnF1ZXVlKTsKLQkJZW5hYmxlZCA9IEVGWF9PV09SRF9GSUVMRChyZWcsIFJYX0RFU0NRX0VOKTsKLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQlFRlhfTE9HKGVmeCwgInJ4IHF1ZXVlICVkIGRpc2FibGVkIHdpdGhvdXQgYSAiCi0JCQkJImZsdXNoIGV2ZW50IHNlZW5cbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCUVGWF9FUlIoZWZ4LCAicnggcXVldWUgJWQgZmx1c2ggY29tbWFuZCB0aW1lZCBvdXRcbiIsIHJ4X3F1ZXVlLT5xdWV1ZSk7Ci0JcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKIHZvaWQgZmFsY29uX2Zpbmlfcngoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCiB7CiAJZWZ4X293b3JkX3QgcnhfZGVzY19wdHI7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7Ci0JaW50IGksIHJjOwogCi0JLyogVHJ5IGFuZCBmbHVzaCB0aGUgcnggcXVldWUuIFRoaXMgbWF5IG5lZWQgdG8gYmUgcmVwZWF0ZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCXJjID0gZmFsY29uX2ZsdXNoX3J4X3F1ZXVlKHJ4X3F1ZXVlKTsKLQkJaWYgKHJjID09IC1FQUdBSU4pCi0JCQljb250aW51ZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCB0byBmbHVzaCByeCBxdWV1ZSAlZFxuIiwgcnhfcXVldWUtPnF1ZXVlKTsKLQkJZWZ4X3NjaGVkdWxlX3Jlc2V0KGVmeCwgUkVTRVRfVFlQRV9JTlZJU0lCTEUpOwotCX0KKwkvKiBUaGUgcXVldWUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGZsdXNoZWQgKi8KKwlXQVJOX09OKCFyeF9xdWV1ZS0+Zmx1c2hlZCk7CiAKIAkvKiBSZW1vdmUgUlggZGVzY3JpcHRvciByaW5nIGZyb20gY2FyZCAqLwogCUVGWF9aRVJPX09XT1JEKHJ4X2Rlc2NfcHRyKTsKQEAgLTc5Myw3ICs2ODAsNyBAQAogCiAJRUZYX1BPUFVMQVRFX0RXT1JEXzEocmVnLCBFVlFfUlBUUl9EV09SRCwgY2hhbm5lbC0+ZXZlbnRxX3JlYWRfcHRyKTsKIAlmYWxjb25fd3JpdGVsX3RhYmxlKGVmeCwgJnJlZywgZWZ4LT50eXBlLT5ldnFfcnB0cl90YmxfYmFzZSwKLQkJCSAgICBjaGFubmVsLT5ldnFudW0pOworCQkJICAgIGNoYW5uZWwtPmNoYW5uZWwpOwogfQogCiAvKiBVc2UgSFcgdG8gaW5zZXJ0IGEgU1cgZGVmaW5lZCBldmVudCAqLwpAQCAtODAyLDcgKzY4OSw3IEBACiAJZWZ4X293b3JkX3QgZHJ2X2V2X3JlZzsKIAogCUVGWF9QT1BVTEFURV9PV09SRF8yKGRydl9ldl9yZWcsCi0JCQkgICAgIERSVl9FVl9RSUQsIGNoYW5uZWwtPmV2cW51bSwKKwkJCSAgICAgRFJWX0VWX1FJRCwgY2hhbm5lbC0+Y2hhbm5lbCwKIAkJCSAgICAgRFJWX0VWX0RBVEEsCiAJCQkgICAgIEVGWF9RV09SRF9GSUVMRDY0KCpldmVudCwgV0hPTEVfRVZFTlQpKTsKIAlmYWxjb25fd3JpdGUoY2hhbm5lbC0+ZWZ4LCAmZHJ2X2V2X3JlZywgRFJWX0VWX1JFR19LRVIpOwpAQCAtODEzLDggKzcwMCw4IEBACiAgKiBGYWxjb24gYmF0Y2hlcyBUWCBjb21wbGV0aW9uIGV2ZW50czsgdGhlIG1lc3NhZ2Ugd2UgcmVjZWl2ZSBpcyBvZgogICogdGhlIGZvcm0gImNvbXBsZXRlIGFsbCBUWCBldmVudHMgdXAgdG8gdGhpcyBpbmRleCIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmYWxjb25faGFuZGxlX3R4X2V2ZW50KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkJICBlZnhfcXdvcmRfdCAqZXZlbnQpCitzdGF0aWMgdm9pZCBmYWxjb25faGFuZGxlX3R4X2V2ZW50KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgICBlZnhfcXdvcmRfdCAqZXZlbnQpCiB7CiAJdW5zaWduZWQgaW50IHR4X2V2X2Rlc2NfcHRyOwogCXVuc2lnbmVkIGludCB0eF9ldl9xX2xhYmVsOwpAQCAtODQ3LDM5ICs3MzQsMTkgQEAKIAl9CiB9CiAKLS8qIENoZWNrIHJlY2VpdmVkIHBhY2tldCdzIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzLiAqLwotc3RhdGljIGludCBjaGVja19kZXN0X21hYyhzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSwKLQkJCSAgY29uc3QgZWZ4X3F3b3JkX3QgKmV2ZW50KQotewotCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWY7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7Ci0JaW50IHJ4X2V2X2Rlc2NfcHRyOwotCXN0cnVjdCBldGhoZHIgKmVoOwotCi0JaWYgKGVmeC0+cHJvbWlzY3VvdXMpCi0JCXJldHVybiAxOwotCi0JcnhfZXZfZGVzY19wdHIgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBSWF9FVl9ERVNDX1BUUik7Ci0JcnhfYnVmID0gZWZ4X3J4X2J1ZmZlcihyeF9xdWV1ZSwgcnhfZXZfZGVzY19wdHIpOwotCWVoID0gKHN0cnVjdCBldGhoZHIgKilyeF9idWYtPmRhdGE7Ci0JaWYgKG1lbWNtcChlaC0+aF9kZXN0LCBlZngtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCiAvKiBEZXRlY3QgZXJyb3JzIGluY2x1ZGVkIGluIHRoZSByeF9ldnRfcGt0X29rIGJpdC4gKi8KIHN0YXRpYyB2b2lkIGZhbGNvbl9oYW5kbGVfcnhfbm90X29rKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAogCQkJCSAgICBjb25zdCBlZnhfcXdvcmRfdCAqZXZlbnQsCi0JCQkJICAgIHVuc2lnbmVkICpyeF9ldl9wa3Rfb2ssCi0JCQkJICAgIGludCAqZGlzY2FyZCwgaW50IGJ5dGVfY291bnQpCisJCQkJICAgIGJvb2wgKnJ4X2V2X3BrdF9vaywKKwkJCQkgICAgYm9vbCAqZGlzY2FyZCkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gcnhfcXVldWUtPmVmeDsKLQl1bnNpZ25lZCByeF9ldl9idWZfb3duZXJfaWRfZXJyLCByeF9ldl9pcF9oZHJfY2hrc3VtX2VycjsKLQl1bnNpZ25lZCByeF9ldl90Y3BfdWRwX2Noa3N1bV9lcnIsIHJ4X2V2X2V0aF9jcmNfZXJyOwotCXVuc2lnbmVkIHJ4X2V2X2ZybV90cnVuYywgcnhfZXZfZHJpYl9uaWIsIHJ4X2V2X3RvYmVfZGlzYzsKLQl1bnNpZ25lZCByeF9ldl9wa3RfdHlwZSwgcnhfZXZfb3RoZXJfZXJyLCByeF9ldl9wYXVzZV9mcm07Ci0JdW5zaWduZWQgcnhfZXZfaXBfZnJhZ19lcnIsIHJ4X2V2X2hkcl90eXBlLCByeF9ldl9tY2FzdF9wa3Q7Ci0JaW50IHNuYXAsIG5vbl9pcDsKKwlib29sIHJ4X2V2X2J1Zl9vd25lcl9pZF9lcnIsIHJ4X2V2X2lwX2hkcl9jaGtzdW1fZXJyOworCWJvb2wgcnhfZXZfdGNwX3VkcF9jaGtzdW1fZXJyLCByeF9ldl9ldGhfY3JjX2VycjsKKwlib29sIHJ4X2V2X2ZybV90cnVuYywgcnhfZXZfZHJpYl9uaWIsIHJ4X2V2X3RvYmVfZGlzYzsKKwlib29sIHJ4X2V2X290aGVyX2VyciwgcnhfZXZfcGF1c2VfZnJtOworCWJvb2wgcnhfZXZfaXBfZnJhZ19lcnIsIHJ4X2V2X2hkcl90eXBlLCByeF9ldl9tY2FzdF9wa3Q7CisJdW5zaWduZWQgcnhfZXZfcGt0X3R5cGU7CiAKIAlyeF9ldl9oZHJfdHlwZSA9IEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIFJYX0VWX0hEUl9UWVBFKTsKIAlyeF9ldl9tY2FzdF9wa3QgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBSWF9FVl9NQ0FTVF9QS1QpOwpAQCAtOTAzLDQxICs3NzAsNiBAQAogCQkJICAgcnhfZXZfYnVmX293bmVyX2lkX2VyciB8IHJ4X2V2X2V0aF9jcmNfZXJyIHwKIAkJCSAgIHJ4X2V2X2ZybV90cnVuYyB8IHJ4X2V2X2lwX2hkcl9jaGtzdW1fZXJyKTsKIAotCXNuYXAgPSAocnhfZXZfcGt0X3R5cGUgPT0gUlhfRVZfUEtUX1RZUEVfTExDX0RFQ09ERSkgfHwKLQkJKHJ4X2V2X3BrdF90eXBlID09IFJYX0VWX1BLVF9UWVBFX1ZMQU5fTExDX0RFQ09ERSk7Ci0Jbm9uX2lwID0gKHJ4X2V2X2hkcl90eXBlID09IFJYX0VWX0hEUl9UWVBFX05PTl9JUF9ERUNPREUpOwotCi0JLyogU0ZDIGJ1ZyA1NDc1Lzg5NzA6IFRoZSBGYWxjb24gWE1BQyBpbmNvcnJlY3RseSBjYWxjdWxhdGVzIHRoZQotCSAqIGxlbmd0aCBmaWVsZCBvZiBhbiBMTEMgZnJhbWUsIHdoaWNoIHNldHMgVE9CRV9ESVNDLiBXZSBjb3VsZCBzZXQKLQkgKiBQQVNTX0xFTl9FUlIsIGJ1dCB3ZSB3YW50IHRoZSBNQUMgdG8gZmlsdGVyIG91dCBzaG9ydCBmcmFtZXMgKHRvCi0JICogcHJvdGVjdCB0aGUgUlggYmxvY2spLgotCSAqCi0JICogYnVnNTQ3NSAtIExMQy9TTkFQOiBGYWxjb24gaWRlbnRpZmllcyBTTkFQIHBhY2tldHMuCi0JICogYnVnODk3MCAtIExMQy9ub1NOQVA6IEZhbGNvbiBkb2VzIG5vdCBwcm92aWRlIGFuIExMQyBmbGFnLgotCSAqICAgICAgICAgICAgICAgICAgICAgICBMTEMgY2FuJ3QgZW5jYXBzdWxhdGUgSVAsIHNvIGJ5IGRlZmluaXRpb24KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlc2UgcGFja2V0cyBhcmUgTk9OX0lQLgotCSAqCi0JICogVW5pY2FzdCBtaXNtYXRjaCB3aWxsIGFsc28gY2F1c2UgVE9CRV9ESVNDLCBzbyB0aGUgZHJpdmVyIG5lZWRzCi0JICogdG8gY2hlY2sgdGhpcy4KLQkgKi8KLQlpZiAoRUZYX1dPUktBUk9VTkRfNTQ3NShlZngpICYmIHJ4X2V2X3RvYmVfZGlzYyAmJiAoc25hcCB8fCBub25faXApKSB7Ci0JCS8qIElmIGFsbCB0aGUgb3RoZXIgZmxhZ3MgYXJlIHplcm8gdGhlbiB3ZSBjYW4gc3RhdGUgdGhlCi0JCSAqIGVudGlyZSBwYWNrZXQgaXMgb2ssIHdoaWNoIHdpbGwgZmxhZyB0byB0aGUga2VybmVsIG5vdAotCQkgKiB0byByZWNhbGN1bGF0ZSBjaGVja3N1bXMuCi0JCSAqLwotCQlpZiAoIShub25faXAgfCByeF9ldl9vdGhlcl9lcnIgfCByeF9ldl9wYXVzZV9mcm0pKQotCQkJKnJ4X2V2X3BrdF9vayA9IDE7Ci0KLQkJcnhfZXZfdG9iZV9kaXNjID0gMDsKLQotCQkvKiBUT0JFX0RJU0MgaXMgc2V0IGZvciB1bmljYXN0IG1pc21hdGNoLiAgQnV0IGdpdmVuIHRoYXQKLQkJICogd2UgY2FuJ3QgdHJ1c3QgVE9CRV9ESVNDIGhlcmUsIHdlIG11c3QgdmFsaWRhdGUgdGhlIGRlc3QKLQkJICogTUFDIGFkZHJlc3Mgb3Vyc2VsdmVzLgotCQkgKi8KLQkJaWYgKCFyeF9ldl9tY2FzdF9wa3QgJiYgIWNoZWNrX2Rlc3RfbWFjKHJ4X3F1ZXVlLCBldmVudCkpCi0JCQlyeF9ldl90b2JlX2Rpc2MgPSAxOwotCX0KLQogCS8qIENvdW50IGVycm9ycyB0aGF0IGFyZSBub3QgaW4gTUFDIHN0YXRzLiAqLwogCWlmIChyeF9ldl9mcm1fdHJ1bmMpCiAJCSsrcnhfcXVldWUtPmNoYW5uZWwtPm5fcnhfZnJtX3RydW5jOwpAQCAtOTYxLDcgKzc5Myw3IEBACiAjaWZkZWYgRUZYX0VOQUJMRV9ERUJVRwogCWlmIChyeF9ldl9vdGhlcl9lcnIpIHsKIAkJRUZYX0lORk9fUkwoZWZ4LCAiIFJYIHF1ZXVlICVkIHVuZXhwZWN0ZWQgUlggZXZlbnQgIgotCQkJICAgIEVGWF9RV09SRF9GTVQgIiVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJCSAgICBFRlhfUVdPUkRfRk1UICIlcyVzJXMlcyVzJXMlcyVzXG4iLAogCQkJICAgIHJ4X3F1ZXVlLT5xdWV1ZSwgRUZYX1FXT1JEX1ZBTCgqZXZlbnQpLAogCQkJICAgIHJ4X2V2X2J1Zl9vd25lcl9pZF9lcnIgPyAiIFtPV05FUl9JRF9FUlJdIiA6ICIiLAogCQkJICAgIHJ4X2V2X2lwX2hkcl9jaGtzdW1fZXJyID8KQEAgLTk3Miw4ICs4MDQsNyBAQAogCQkJICAgIHJ4X2V2X2ZybV90cnVuYyA/ICIgW0ZSTV9UUlVOQ10iIDogIiIsCiAJCQkgICAgcnhfZXZfZHJpYl9uaWIgPyAiIFtEUklCX05JQl0iIDogIiIsCiAJCQkgICAgcnhfZXZfdG9iZV9kaXNjID8gIiBbVE9CRV9ESVNDXSIgOiAiIiwKLQkJCSAgICByeF9ldl9wYXVzZV9mcm0gPyAiIFtQQVVTRV0iIDogIiIsCi0JCQkgICAgc25hcCA/ICIgW1NOQVAvTExDXSIgOiAiIik7CisJCQkgICAgcnhfZXZfcGF1c2VfZnJtID8gIiBbUEFVU0VdIiA6ICIiKTsKIAl9CiAjZW5kaWYKIApAQCAtMTAwNiwxMyArODM3LDEzIEBACiAgKiBBbHNvICJpcyBtdWx0aWNhc3QiIGFuZCAibWF0Y2hlcyBtdWx0aWNhc3QgZmlsdGVyIiBmbGFncyBjYW4gYmUgdXNlZCB0bwogICogZGlzY2FyZCBub24tbWF0Y2hpbmcgbXVsdGljYXN0IHBhY2tldHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZhbGNvbl9oYW5kbGVfcnhfZXZlbnQoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLAotCQkJCQkgY29uc3QgZWZ4X3F3b3JkX3QgKmV2ZW50KQorc3RhdGljIHZvaWQgZmFsY29uX2hhbmRsZV9yeF9ldmVudChzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgY29uc3QgZWZ4X3F3b3JkX3QgKmV2ZW50KQogewotCXVuc2lnbmVkIGludCByeF9ldl9xX2xhYmVsLCByeF9ldl9kZXNjX3B0ciwgcnhfZXZfYnl0ZV9jbnQ7Ci0JdW5zaWduZWQgaW50IHJ4X2V2X3BrdF9vaywgcnhfZXZfaGRyX3R5cGUsIHJ4X2V2X21jYXN0X3BrdDsKKwl1bnNpZ25lZCBpbnQgcnhfZXZfZGVzY19wdHIsIHJ4X2V2X2J5dGVfY250OworCXVuc2lnbmVkIGludCByeF9ldl9oZHJfdHlwZSwgcnhfZXZfbWNhc3RfcGt0OwogCXVuc2lnbmVkIGV4cGVjdGVkX3B0cjsKLQlpbnQgZGlzY2FyZCA9IDAsIGNoZWNrc3VtbWVkOworCWJvb2wgcnhfZXZfcGt0X29rLCBkaXNjYXJkID0gZmFsc2UsIGNoZWNrc3VtbWVkOwogCXN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlOwogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAKQEAgLTEwMjIsMTYgKzg1MywxNCBAQAogCXJ4X2V2X2hkcl90eXBlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgUlhfRVZfSERSX1RZUEUpOwogCVdBUk5fT04oRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgUlhfRVZfSlVNQk9fQ09OVCkpOwogCVdBUk5fT04oRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgUlhfRVZfU09QKSAhPSAxKTsKKwlXQVJOX09OKEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIFJYX0VWX1FfTEFCRUwpICE9IGNoYW5uZWwtPmNoYW5uZWwpOwogCi0JcnhfZXZfcV9sYWJlbCA9IEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIFJYX0VWX1FfTEFCRUwpOwotCXJ4X3F1ZXVlID0gJmVmeC0+cnhfcXVldWVbcnhfZXZfcV9sYWJlbF07CisJcnhfcXVldWUgPSAmZWZ4LT5yeF9xdWV1ZVtjaGFubmVsLT5jaGFubmVsXTsKIAogCXJ4X2V2X2Rlc2NfcHRyID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgUlhfRVZfREVTQ19QVFIpOwogCWV4cGVjdGVkX3B0ciA9IHJ4X3F1ZXVlLT5yZW1vdmVkX2NvdW50ICYgRkFMQ09OX1JYRF9SSU5HX01BU0s7Ci0JaWYgKHVubGlrZWx5KHJ4X2V2X2Rlc2NfcHRyICE9IGV4cGVjdGVkX3B0cikpIHsKKwlpZiAodW5saWtlbHkocnhfZXZfZGVzY19wdHIgIT0gZXhwZWN0ZWRfcHRyKSkKIAkJZmFsY29uX2hhbmRsZV9yeF9iYWRfaW5kZXgocnhfcXVldWUsIHJ4X2V2X2Rlc2NfcHRyKTsKLQkJcmV0dXJuIHJ4X2V2X3FfbGFiZWw7Ci0JfQogCiAJaWYgKGxpa2VseShyeF9ldl9wa3Rfb2spKSB7CiAJCS8qIElmIHBhY2tldCBpcyBtYXJrZWQgYXMgT0sgYW5kIHBhY2tldCB0eXBlIGlzIFRDUC9JUHY0IG9yCkBAIC0xMDQwLDggKzg2OSw4IEBACiAJCWNoZWNrc3VtbWVkID0gUlhfRVZfSERSX1RZUEVfSEFTX0NIRUNLU1VNUyhyeF9ldl9oZHJfdHlwZSk7CiAJfSBlbHNlIHsKIAkJZmFsY29uX2hhbmRsZV9yeF9ub3Rfb2socnhfcXVldWUsIGV2ZW50LCAmcnhfZXZfcGt0X29rLAotCQkJCQkmZGlzY2FyZCwgcnhfZXZfYnl0ZV9jbnQpOwotCQljaGVja3N1bW1lZCA9IDA7CisJCQkJCSZkaXNjYXJkKTsKKwkJY2hlY2tzdW1tZWQgPSBmYWxzZTsKIAl9CiAKIAkvKiBEZXRlY3QgbXVsdGljYXN0IHBhY2tldHMgdGhhdCBkaWRuJ3QgbWF0Y2ggdGhlIGZpbHRlciAqLwpAQCAtMTA1MSwxNCArODgwLDEyIEBACiAJCQlFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBSWF9FVl9NQ0FTVF9IQVNIX01BVENIKTsKIAogCQlpZiAodW5saWtlbHkoIXJ4X2V2X21jYXN0X2hhc2hfbWF0Y2gpKQotCQkJZGlzY2FyZCA9IDE7CisJCQlkaXNjYXJkID0gdHJ1ZTsKIAl9CiAKIAkvKiBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0ICovCiAJZWZ4X3J4X3BhY2tldChyeF9xdWV1ZSwgcnhfZXZfZGVzY19wdHIsIHJ4X2V2X2J5dGVfY250LAogCQkgICAgICBjaGVja3N1bW1lZCwgZGlzY2FyZCk7Ci0KLQlyZXR1cm4gcnhfZXZfcV9sYWJlbDsKIH0KIAogLyogR2xvYmFsIGV2ZW50cyBhcmUgYmFzaWNhbGx5IFBIWSBldmVudHMgKi8KQEAgLTEwNjYsMjMgKzg5MywyMyBAQAogCQkJCSAgICAgICBlZnhfcXdvcmRfdCAqZXZlbnQpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKLQlpbnQgaXNfcGh5X2V2ZW50ID0gMCwgaGFuZGxlZCA9IDA7CisJYm9vbCBpc19waHlfZXZlbnQgPSBmYWxzZSwgaGFuZGxlZCA9IGZhbHNlOwogCiAJLyogQ2hlY2sgZm9yIGludGVycnVwdCBvbiBlaXRoZXIgcG9ydC4gIFNvbWUgYm9hcmRzIGhhdmUgYQogCSAqIHNpbmdsZSBQSFkgd2lyZWQgdG8gdGhlIGludGVycnVwdCBsaW5lIGZvciBwb3J0IDEuICovCiAJaWYgKEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsIEdfUEhZMF9JTlRSKSB8fAogCSAgICBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBHX1BIWTFfSU5UUikgfHwKIAkgICAgRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgWEdfUEhZX0lOVFIpKQotCQlpc19waHlfZXZlbnQgPSAxOworCQlpc19waHlfZXZlbnQgPSB0cnVlOwogCiAJaWYgKChmYWxjb25fcmV2KGVmeCkgPj0gRkFMQ09OX1JFVl9CMCkgJiYKLQkgICAgRUZYX09XT1JEX0ZJRUxEKCpldmVudCwgWEdfTU5UX0lOVFJfQjApKQotCQlpc19waHlfZXZlbnQgPSAxOworCSAgICBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBYR19NTlRfSU5UUl9CMCkpCisJCWlzX3BoeV9ldmVudCA9IHRydWU7CiAKIAlpZiAoaXNfcGh5X2V2ZW50KSB7CiAJCWVmeC0+cGh5X29wLT5jbGVhcl9pbnRlcnJ1cHQoZWZ4KTsKIAkJcXVldWVfd29yayhlZngtPndvcmtxdWV1ZSwgJmVmeC0+cmVjb25maWd1cmVfd29yayk7Ci0JCWhhbmRsZWQgPSAxOworCQloYW5kbGVkID0gdHJ1ZTsKIAl9CiAKIAlpZiAoRUZYX1FXT1JEX0ZJRUxEX1ZFUihlZngsICpldmVudCwgUlhfUkVDT1ZFUlkpKSB7CkBAIC0xMDkyLDcgKzkxOSw3IEBACiAJCWF0b21pY19pbmMoJmVmeC0+cnhfcmVzZXQpOwogCQllZnhfc2NoZWR1bGVfcmVzZXQoZWZ4LCBFRlhfV09SS0FST1VORF82NTU1KGVmeCkgPwogCQkJCSAgIFJFU0VUX1RZUEVfUlhfUkVDT1ZFUlkgOiBSRVNFVF9UWVBFX0RJU0FCTEUpOwotCQloYW5kbGVkID0gMTsKKwkJaGFuZGxlZCA9IHRydWU7CiAJfQogCiAJaWYgKCFoYW5kbGVkKQpAQCAtMTE2MywxMyArOTkwLDEyIEBACiAJfQogfQogCi1pbnQgZmFsY29uX3Byb2Nlc3NfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwgaW50ICpyeF9xdW90YSkKK2ludCBmYWxjb25fcHJvY2Vzc19ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLCBpbnQgcnhfcXVvdGEpCiB7CiAJdW5zaWduZWQgaW50IHJlYWRfcHRyOwogCWVmeF9xd29yZF90IGV2ZW50LCAqcF9ldmVudDsKIAlpbnQgZXZfY29kZTsKLQlpbnQgcnhxOwotCWludCByeGRtYXFzID0gMDsKKwlpbnQgcnhfcGFja2V0cyA9IDA7CiAKIAlyZWFkX3B0ciA9IGNoYW5uZWwtPmV2ZW50cV9yZWFkX3B0cjsKIApAQCAtMTE5MSw5ICsxMDE3LDggQEAKIAogCQlzd2l0Y2ggKGV2X2NvZGUpIHsKIAkJY2FzZSBSWF9JUF9FVl9ERUNPREU6Ci0JCQlyeHEgPSBmYWxjb25faGFuZGxlX3J4X2V2ZW50KGNoYW5uZWwsICZldmVudCk7Ci0JCQlyeGRtYXFzIHw9ICgxIDw8IHJ4cSk7Ci0JCQkoKnJ4X3F1b3RhKS0tOworCQkJZmFsY29uX2hhbmRsZV9yeF9ldmVudChjaGFubmVsLCAmZXZlbnQpOworCQkJKytyeF9wYWNrZXRzOwogCQkJYnJlYWs7CiAJCWNhc2UgVFhfSVBfRVZfREVDT0RFOgogCQkJZmFsY29uX2hhbmRsZV90eF9ldmVudChjaGFubmVsLCAmZXZlbnQpOwpAQCAtMTIyMCwxMCArMTA0NSwxMCBAQAogCQkvKiBJbmNyZW1lbnQgcmVhZCBwb2ludGVyICovCiAJCXJlYWRfcHRyID0gKHJlYWRfcHRyICsgMSkgJiBGQUxDT05fRVZRX01BU0s7CiAKLQl9IHdoaWxlICgqcnhfcXVvdGEpOworCX0gd2hpbGUgKHJ4X3BhY2tldHMgPCByeF9xdW90YSk7CiAKIAljaGFubmVsLT5ldmVudHFfcmVhZF9wdHIgPSByZWFkX3B0cjsKLQlyZXR1cm4gcnhkbWFxczsKKwlyZXR1cm4gcnhfcGFja2V0czsKIH0KIAogdm9pZCBmYWxjb25fc2V0X2ludF9tb2RlcmF0aW9uKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKQEAgLTEyNTEsNyArMTA3Niw3IEBACiAJCQkJICAgICBUSU1FUl9WQUwsIDApOwogCX0KIAlmYWxjb25fd3JpdGVsX3BhZ2VfbG9ja2VkKGVmeCwgJnRpbWVyX2NtZCwgVElNRVJfQ01EX1JFR19LRVIsCi0JCQkJICBjaGFubmVsLT5ldnFudW0pOworCQkJCSAgY2hhbm5lbC0+Y2hhbm5lbCk7CiAKIH0KIApAQCAtMTI2NSwyMCArMTA5MCwxNyBAQAogCXJldHVybiBmYWxjb25fYWxsb2Nfc3BlY2lhbF9idWZmZXIoZWZ4LCAmY2hhbm5lbC0+ZXZlbnRxLCBldnFfc2l6ZSk7CiB9CiAKLWludCBmYWxjb25faW5pdF9ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQordm9pZCBmYWxjb25faW5pdF9ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQogewogCWVmeF9vd29yZF90IGV2cV9wdHI7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKLQlpbnQgcmM7CiAKIAlFRlhfTE9HKGVmeCwgImNoYW5uZWwgJWQgZXZlbnQgcXVldWUgaW4gc3BlY2lhbCBidWZmZXJzICVkLSVkXG4iLAogCQljaGFubmVsLT5jaGFubmVsLCBjaGFubmVsLT5ldmVudHEuaW5kZXgsCiAJCWNoYW5uZWwtPmV2ZW50cS5pbmRleCArIGNoYW5uZWwtPmV2ZW50cS5lbnRyaWVzIC0gMSk7CiAKIAkvKiBQaW4gZXZlbnQgcXVldWUgYnVmZmVyICovCi0JcmMgPSBmYWxjb25faW5pdF9zcGVjaWFsX2J1ZmZlcihlZngsICZjaGFubmVsLT5ldmVudHEpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOworCWZhbGNvbl9pbml0X3NwZWNpYWxfYnVmZmVyKGVmeCwgJmNoYW5uZWwtPmV2ZW50cSk7CiAKIAkvKiBGaWxsIGV2ZW50IHF1ZXVlIHdpdGggYWxsIG9uZXMgKGkuZS4gZW1wdHkgZXZlbnRzKSAqLwogCW1lbXNldChjaGFubmVsLT5ldmVudHEuYWRkciwgMHhmZiwgY2hhbm5lbC0+ZXZlbnRxLmxlbik7CkBAIC0xMjg5LDExICsxMTExLDkgQEAKIAkJCSAgICAgRVZRX1NJWkUsIEZBTENPTl9FVlFfT1JERVIsCiAJCQkgICAgIEVWUV9CVUZfQkFTRV9JRCwgY2hhbm5lbC0+ZXZlbnRxLmluZGV4KTsKIAlmYWxjb25fd3JpdGVfdGFibGUoZWZ4LCAmZXZxX3B0ciwgZWZ4LT50eXBlLT5ldnFfcHRyX3RibF9iYXNlLAotCQkJICAgY2hhbm5lbC0+ZXZxbnVtKTsKKwkJCSAgIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJZmFsY29uX3NldF9pbnRfbW9kZXJhdGlvbihjaGFubmVsKTsKLQotCXJldHVybiAwOwogfQogCiB2b2lkIGZhbGNvbl9maW5pX2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCkBAIC0xMzA0LDcgKzExMjQsNyBAQAogCS8qIFJlbW92ZSBldmVudCBxdWV1ZSBmcm9tIGNhcmQgKi8KIAlFRlhfWkVST19PV09SRChldmVudHFfcHRyKTsKIAlmYWxjb25fd3JpdGVfdGFibGUoZWZ4LCAmZXZlbnRxX3B0ciwgZWZ4LT50eXBlLT5ldnFfcHRyX3RibF9iYXNlLAotCQkJICAgY2hhbm5lbC0+ZXZxbnVtKTsKKwkJCSAgIGNoYW5uZWwtPmNoYW5uZWwpOwogCiAJLyogVW5waW4gZXZlbnQgcXVldWUgKi8KIAlmYWxjb25fZmluaV9zcGVjaWFsX2J1ZmZlcihlZngsICZjaGFubmVsLT5ldmVudHEpOwpAQCAtMTMzMSw2ICsxMTUxLDEyMSBAQAogCWZhbGNvbl9nZW5lcmF0ZV9ldmVudChjaGFubmVsLCAmdGVzdF9ldmVudCk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZsdXNoIGhhbmRsaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkIGZhbGNvbl9wb2xsX2ZsdXNoX2V2ZW50cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoreworCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCA9ICZlZngtPmNoYW5uZWxbMF07CisJc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWU7CisJc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7CisJdW5zaWduZWQgaW50IHJlYWRfcHRyLCBpOworCisJcmVhZF9wdHIgPSBjaGFubmVsLT5ldmVudHFfcmVhZF9wdHI7CisJZm9yIChpID0gMDsgaSA8IEZBTENPTl9FVlFfU0laRTsgKytpKSB7CisJCWVmeF9xd29yZF90ICpldmVudCA9IGZhbGNvbl9ldmVudChjaGFubmVsLCByZWFkX3B0cik7CisJCWludCBldl9jb2RlLCBldl9zdWJfY29kZSwgZXZfcXVldWU7CisJCWJvb2wgZXZfZmFpbGVkOworCQlpZiAoIWZhbGNvbl9ldmVudF9wcmVzZW50KGV2ZW50KSkKKwkJCWJyZWFrOworCisJCWV2X2NvZGUgPSBFRlhfUVdPUkRfRklFTEQoKmV2ZW50LCBFVl9DT0RFKTsKKwkJaWYgKGV2X2NvZGUgIT0gRFJJVkVSX0VWX0RFQ09ERSkKKwkJCWNvbnRpbnVlOworCisJCWV2X3N1Yl9jb2RlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwgRFJJVkVSX0VWX1NVQl9DT0RFKTsKKwkJc3dpdGNoIChldl9zdWJfY29kZSkgeworCQljYXNlIFRYX0RFU0NRX0ZMU19ET05FX0VWX0RFQ09ERToKKwkJCWV2X3F1ZXVlID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwKKwkJCQkJCSAgIERSSVZFUl9FVl9UWF9ERVNDUV9JRCk7CisJCQlpZiAoZXZfcXVldWUgPCBFRlhfVFhfUVVFVUVfQ09VTlQpIHsKKwkJCQl0eF9xdWV1ZSA9IGVmeC0+dHhfcXVldWUgKyBldl9xdWV1ZTsKKwkJCQl0eF9xdWV1ZS0+Zmx1c2hlZCA9IHRydWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSWF9ERVNDUV9GTFNfRE9ORV9FVl9ERUNPREU6CisJCQlldl9xdWV1ZSA9IEVGWF9RV09SRF9GSUVMRCgqZXZlbnQsCisJCQkJCQkgICBEUklWRVJfRVZfUlhfREVTQ1FfSUQpOworCQkJZXZfZmFpbGVkID0gRUZYX1FXT1JEX0ZJRUxEKCpldmVudCwKKwkJCQkJCSAgICBEUklWRVJfRVZfUlhfRkxVU0hfRkFJTCk7CisJCQlpZiAoZXZfcXVldWUgPCBlZngtPm5fcnhfcXVldWVzKSB7CisJCQkJcnhfcXVldWUgPSBlZngtPnJ4X3F1ZXVlICsgZXZfcXVldWU7CisKKwkJCQkvKiByZXRyeSB0aGUgcnggZmx1c2ggKi8KKwkJCQlpZiAoZXZfZmFpbGVkKQorCQkJCQlmYWxjb25fZmx1c2hfcnhfcXVldWUocnhfcXVldWUpOworCQkJCWVsc2UKKwkJCQkJcnhfcXVldWUtPmZsdXNoZWQgPSB0cnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlyZWFkX3B0ciA9IChyZWFkX3B0ciArIDEpICYgRkFMQ09OX0VWUV9NQVNLOworCX0KK30KKworLyogSGFuZGxlIHR4IGFuZCByeCBmbHVzaGVzIGF0IHRoZSBzYW1lIHRpbWUsIHNpbmNlIHRoZXkgcnVuIGluCisgKiBwYXJhbGxlbCBpbiB0aGUgaGFyZHdhcmUgYW5kIHRoZXJlJ3Mgbm8gcmVhc29uIGZvciB1cyB0bworICogc2VyaWFsaXNlIHRoZW0gKi8KK2ludCBmYWxjb25fZmx1c2hfcXVldWVzKHN0cnVjdCBlZnhfbmljICplZngpCit7CisJc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWU7CisJc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWU7CisJaW50IGk7CisJYm9vbCBvdXRzdGFuZGluZzsKKworCS8qIElzc3VlIGZsdXNoIHJlcXVlc3RzICovCisJZWZ4X2Zvcl9lYWNoX3R4X3F1ZXVlKHR4X3F1ZXVlLCBlZngpIHsKKwkJdHhfcXVldWUtPmZsdXNoZWQgPSBmYWxzZTsKKwkJZmFsY29uX2ZsdXNoX3R4X3F1ZXVlKHR4X3F1ZXVlKTsKKwl9CisJZWZ4X2Zvcl9lYWNoX3J4X3F1ZXVlKHJ4X3F1ZXVlLCBlZngpIHsKKwkJcnhfcXVldWUtPmZsdXNoZWQgPSBmYWxzZTsKKwkJZmFsY29uX2ZsdXNoX3J4X3F1ZXVlKHJ4X3F1ZXVlKTsKKwl9CisKKwkvKiBQb2xsIHRoZSBldnEgbG9va2luZyBmb3IgZmx1c2ggY29tcGxldGlvbnMuIFNpbmNlIHdlJ3JlIG5vdCBwdXNoaW5nCisJICogYW55IG1vcmUgcnggb3IgdHggZGVzY3JpcHRvcnMgYXQgdGhpcyBwb2ludCwgd2UncmUgaW4gbm8gZGFuZ2VyIG9mCisJICogb3ZlcmZsb3dpbmcgdGhlIGV2cSB3aGlsc3Qgd2Ugd2FpdCAqLworCWZvciAoaSA9IDA7IGkgPCBGQUxDT05fRkxVU0hfUE9MTF9DT1VOVDsgKytpKSB7CisJCW1zbGVlcChGQUxDT05fRkxVU0hfSU5URVJWQUwpOworCQlmYWxjb25fcG9sbF9mbHVzaF9ldmVudHMoZWZ4KTsKKworCQkvKiBDaGVjayBpZiBldmVyeSBxdWV1ZSBoYXMgYmVlbiBzdWNjZXNmdWxseSBmbHVzaGVkICovCisJCW91dHN0YW5kaW5nID0gZmFsc2U7CisJCWVmeF9mb3JfZWFjaF90eF9xdWV1ZSh0eF9xdWV1ZSwgZWZ4KQorCQkJb3V0c3RhbmRpbmcgfD0gIXR4X3F1ZXVlLT5mbHVzaGVkOworCQllZnhfZm9yX2VhY2hfcnhfcXVldWUocnhfcXVldWUsIGVmeCkKKwkJCW91dHN0YW5kaW5nIHw9ICFyeF9xdWV1ZS0+Zmx1c2hlZDsKKwkJaWYgKCFvdXRzdGFuZGluZykKKwkJCXJldHVybiAwOworCX0KKworCS8qIE1hcmsgdGhlIHF1ZXVlcyBhcyBhbGwgZmx1c2hlZC4gV2UncmUgZ29pbmcgdG8gcmV0dXJuIGZhaWx1cmUKKwkgKiBsZWFkaW5nIHRvIGEgcmVzZXQsIG9yIGZha2UgdXAgc3VjY2VzcyBhbnl3YXkuICJmbHVzaGVkIiBub3cKKwkgKiBpbmRpY2F0ZXMgdGhhdCB3ZSB0cmllZCB0byBmbHVzaC4gKi8KKwllZnhfZm9yX2VhY2hfdHhfcXVldWUodHhfcXVldWUsIGVmeCkgeworCQlpZiAoIXR4X3F1ZXVlLT5mbHVzaGVkKQorCQkJRUZYX0VSUihlZngsICJ0eCBxdWV1ZSAlZCBmbHVzaCBjb21tYW5kIHRpbWVkIG91dFxuIiwKKwkJCQl0eF9xdWV1ZS0+cXVldWUpOworCQl0eF9xdWV1ZS0+Zmx1c2hlZCA9IHRydWU7CisJfQorCWVmeF9mb3JfZWFjaF9yeF9xdWV1ZShyeF9xdWV1ZSwgZWZ4KSB7CisJCWlmICghcnhfcXVldWUtPmZsdXNoZWQpCisJCQlFRlhfRVJSKGVmeCwgInJ4IHF1ZXVlICVkIGZsdXNoIGNvbW1hbmQgdGltZWQgb3V0XG4iLAorCQkJCXJ4X3F1ZXVlLT5xdWV1ZSk7CisJCXJ4X3F1ZXVlLT5mbHVzaGVkID0gdHJ1ZTsKKwl9CisKKwlpZiAoRUZYX1dPUktBUk9VTkRfNzgwMyhlZngpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRVRJTUVET1VUOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMzcxLDcgKzEzMDYsNyBAQAogCiAJLyogRm9yY2UgcHJvY2Vzc2luZyBvZiBhbGwgdGhlIGNoYW5uZWxzIHRvIGdldCB0aGUgRVZRIFJQVFJzIHVwIHRvCiAJICAgZGF0ZSAqLwotCWVmeF9mb3JfZWFjaF9jaGFubmVsX3dpdGhfaW50ZXJydXB0KGNoYW5uZWwsIGVmeCkKKwllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpCiAJCWVmeF9zY2hlZHVsZV9jaGFubmVsKGNoYW5uZWwpOwogfQogCkBAIC0xNDM5LDEwICsxMzc0LDExIEBACiAJCQlFRlhfT1dPUkRfRk1UICJcbiIsIEVGWF9PV09SRF9WQUwocmVnKSk7CiAJfQogCi0JLyogRGlzYWJsZSBETUEgYnVzIG1hc3RlcmluZyBvbiBib3RoIGRldmljZXMgKi8KKwkvKiBEaXNhYmxlIGJvdGggZGV2aWNlcyAqLwogCXBjaV9kaXNhYmxlX2RldmljZShlZngtPnBjaV9kZXYpOwogCWlmIChGQUxDT05fSVNfRFVBTF9GVU5DKGVmeCkpCiAJCXBjaV9kaXNhYmxlX2RldmljZShuaWNfZGF0YS0+cGNpX2RldjIpOworCWZhbGNvbl9kaXNhYmxlX2ludGVycnVwdHMoZWZ4KTsKIAogCWlmICgrK25faW50X2Vycm9ycyA8IEZBTENPTl9NQVhfSU5UX0VSUk9SUykgewogCQlFRlhfRVJSKGVmeCwgIlNZU1RFTSBFUlJPUiAtIHJlc2V0IHNjaGVkdWxlZFxuIik7CkBAIC0xNTg5LDcgKzE1MjUsNyBAQAogCSAgICAgb2Zmc2V0IDwgUlhfUlNTX0lORElSX1RCTF9CMCArIDB4ODAwOwogCSAgICAgb2Zmc2V0ICs9IDB4MTApIHsKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzEoZHdvcmQsIFJYX1JTU19JTkRJUl9FTlRfQjAsCi0JCQkJICAgICBpICUgZWZ4LT5yc3NfcXVldWVzKTsKKwkJCQkgICAgIGkgJSBlZngtPm5fcnhfcXVldWVzKTsKIAkJZmFsY29uX3dyaXRlbChlZngsICZkd29yZCwgb2Zmc2V0KTsKIAkJaSsrOwogCX0KQEAgLTE2MjEsNyArMTU1Nyw3IEBACiAJfQogCiAJLyogSG9vayBNU0kgb3IgTVNJLVggaW50ZXJydXB0ICovCi0JZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfd2l0aF9pbnRlcnJ1cHQoY2hhbm5lbCwgZWZ4KSB7CisJZWZ4X2Zvcl9lYWNoX2NoYW5uZWwoY2hhbm5lbCwgZWZ4KSB7CiAJCXJjID0gcmVxdWVzdF9pcnEoY2hhbm5lbC0+aXJxLCBmYWxjb25fbXNpX2ludGVycnVwdCwKIAkJCQkgSVJRRl9QUk9CRV9TSEFSRUQsIC8qIE5vdCBzaGFyZWQgKi8KIAkJCQkgZWZ4LT5uYW1lLCBjaGFubmVsKTsKQEAgLTE2MzQsNyArMTU3MCw3IEBACiAJcmV0dXJuIDA7CiAKICBmYWlsMjoKLQllZnhfZm9yX2VhY2hfY2hhbm5lbF93aXRoX2ludGVycnVwdChjaGFubmVsLCBlZngpCisJZWZ4X2Zvcl9lYWNoX2NoYW5uZWwoY2hhbm5lbCwgZWZ4KQogCQlmcmVlX2lycShjaGFubmVsLT5pcnEsIGNoYW5uZWwpOwogIGZhaWwxOgogCXJldHVybiByYzsKQEAgLTE2NDYsNyArMTU4Miw3IEBACiAJZWZ4X293b3JkX3QgcmVnOwogCiAJLyogRGlzYWJsZSBNU0kvTVNJLVggaW50ZXJydXB0cyAqLwotCWVmeF9mb3JfZWFjaF9jaGFubmVsX3dpdGhfaW50ZXJydXB0KGNoYW5uZWwsIGVmeCkgeworCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgewogCQlpZiAoY2hhbm5lbC0+aXJxKQogCQkJZnJlZV9pcnEoY2hhbm5lbC0+aXJxLCBjaGFubmVsKTsKIAl9CkBAIC0xNjY5LDY5ICsxNjA1LDIwMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIAotI2RlZmluZSBGQUxDT05fU1BJX01BWF9MRU4gc2l6ZW9mKGVmeF9vd29yZF90KQorI2RlZmluZSBGQUxDT05fU1BJX01BWF9MRU4gKCh1bnNpZ25lZCkgc2l6ZW9mKGVmeF9vd29yZF90KSkKIAogLyogV2FpdCBmb3IgU1BJIGNvbW1hbmQgY29tcGxldGlvbiAqLwogc3RhdGljIGludCBmYWxjb25fc3BpX3dhaXQoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgRElWX1JPVU5EX1VQKEhaLCAxMCk7CiAJZWZ4X293b3JkX3QgcmVnOwotCWludCBjbWRfZW4sIHRpbWVyX2FjdGl2ZTsKLQlpbnQgY291bnQ7CisJYm9vbCBjbWRfZW4sIHRpbWVyX2FjdGl2ZTsKIAotCWNvdW50ID0gMDsKLQlkbyB7CisJZm9yICg7OykgewogCQlmYWxjb25fcmVhZChlZngsICZyZWcsIEVFX1NQSV9IQ01EX1JFR19LRVIpOwogCQljbWRfZW4gPSBFRlhfT1dPUkRfRklFTEQocmVnLCBFRV9TUElfSENNRF9DTURfRU4pOwogCQl0aW1lcl9hY3RpdmUgPSBFRlhfT1dPUkRfRklFTEQocmVnLCBFRV9XUl9USU1FUl9BQ1RJVkUpOwogCQlpZiAoIWNtZF9lbiAmJiAhdGltZXJfYWN0aXZlKQogCQkJcmV0dXJuIDA7Ci0JCXVkZWxheSgxMCk7Ci0JfSB3aGlsZSAoKytjb3VudCA8IDEwMDAwKTsgLyogd2FpdCB1cHRvIDEwMG1zZWMgKi8KLQlFRlhfRVJSKGVmeCwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBTUElcbiIpOwotCXJldHVybiAtRVRJTUVET1VUOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJRUZYX0VSUihlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgU1BJXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCWNwdV9yZWxheCgpOworCX0KIH0KIAotc3RhdGljIGludAotZmFsY29uX3NwaV9yZWFkKHN0cnVjdCBlZnhfbmljICplZngsIGludCBkZXZpY2VfaWQsIHVuc2lnbmVkIGludCBjb21tYW5kLAotCQl1bnNpZ25lZCBpbnQgYWRkcmVzcywgdW5zaWduZWQgaW50IGFkZHJfbGVuLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIGludCBmYWxjb25fc3BpX2NtZChjb25zdCBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSwKKwkJCSAgdW5zaWduZWQgaW50IGNvbW1hbmQsIGludCBhZGRyZXNzLAorCQkJICBjb25zdCB2b2lkICppbiwgdm9pZCAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuKQogeworCXN0cnVjdCBlZnhfbmljICplZnggPSBzcGktPmVmeDsKKwlib29sIGFkZHJlc3NlZCA9IChhZGRyZXNzID49IDApOworCWJvb2wgcmVhZGluZyA9IChvdXQgIT0gTlVMTCk7CiAJZWZ4X293b3JkX3QgcmVnOwogCWludCByYzsKIAotCUJVR19PTihsZW4gPiBGQUxDT05fU1BJX01BWF9MRU4pOworCS8qIElucHV0IHZhbGlkYXRpb24gKi8KKwlpZiAobGVuID4gRkFMQ09OX1NQSV9NQVhfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIENoZWNrIFNQSSBub3QgY3VycmVudGx5IGJlaW5nIGFjY2Vzc2VkICovCiAJcmMgPSBmYWxjb25fc3BpX3dhaXQoZWZ4KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCS8qIFByb2dyYW0gYWRkcmVzcyByZWdpc3RlciAqLwotCUVGWF9QT1BVTEFURV9PV09SRF8xKHJlZywgRUVfU1BJX0hBRFJfQURSLCBhZGRyZXNzKTsKLQlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBFRV9TUElfSEFEUl9SRUdfS0VSKTsKKwkvKiBQcm9ncmFtIGFkZHJlc3MgcmVnaXN0ZXIsIGlmIHdlIGhhdmUgYW4gYWRkcmVzcyAqLworCWlmIChhZGRyZXNzZWQpIHsKKwkJRUZYX1BPUFVMQVRFX09XT1JEXzEocmVnLCBFRV9TUElfSEFEUl9BRFIsIGFkZHJlc3MpOworCQlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBFRV9TUElfSEFEUl9SRUdfS0VSKTsKKwl9CiAKLQkvKiBJc3N1ZSByZWFkIGNvbW1hbmQgKi8KKwkvKiBQcm9ncmFtIGRhdGEgcmVnaXN0ZXIsIGlmIHdlIGhhdmUgZGF0YSAqLworCWlmIChpbiAhPSBOVUxMKSB7CisJCW1lbWNweSgmcmVnLCBpbiwgbGVuKTsKKwkJZmFsY29uX3dyaXRlKGVmeCwgJnJlZywgRUVfU1BJX0hEQVRBX1JFR19LRVIpOworCX0KKworCS8qIElzc3VlIHJlYWQvd3JpdGUgY29tbWFuZCAqLwogCUVGWF9QT1BVTEFURV9PV09SRF83KHJlZywKIAkJCSAgICAgRUVfU1BJX0hDTURfQ01EX0VOLCAxLAotCQkJICAgICBFRV9TUElfSENNRF9TRl9TRUwsIGRldmljZV9pZCwKKwkJCSAgICAgRUVfU1BJX0hDTURfU0ZfU0VMLCBzcGktPmRldmljZV9pZCwKIAkJCSAgICAgRUVfU1BJX0hDTURfREFCQ05ULCBsZW4sCi0JCQkgICAgIEVFX1NQSV9IQ01EX1JFQUQsIEVFX1NQSV9SRUFELAorCQkJICAgICBFRV9TUElfSENNRF9SRUFELCByZWFkaW5nLAogCQkJICAgICBFRV9TUElfSENNRF9EVUJDTlQsIDAsCi0JCQkgICAgIEVFX1NQSV9IQ01EX0FEQkNOVCwgYWRkcl9sZW4sCisJCQkgICAgIEVFX1NQSV9IQ01EX0FEQkNOVCwKKwkJCSAgICAgKGFkZHJlc3NlZCA/IHNwaS0+YWRkcl9sZW4gOiAwKSwKIAkJCSAgICAgRUVfU1BJX0hDTURfRU5DLCBjb21tYW5kKTsKIAlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBFRV9TUElfSENNRF9SRUdfS0VSKTsKIAotCS8qIFdhaXQgZm9yIHJlYWQgdG8gY29tcGxldGUgKi8KKwkvKiBXYWl0IGZvciByZWFkL3dyaXRlIHRvIGNvbXBsZXRlICovCiAJcmMgPSBmYWxjb25fc3BpX3dhaXQoZWZ4KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCS8qIFJlYWQgZGF0YSAqLwotCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgRUVfU1BJX0hEQVRBX1JFR19LRVIpOwotCW1lbWNweShkYXRhLCAmcmVnLCBsZW4pOworCWlmIChvdXQgIT0gTlVMTCkgeworCQlmYWxjb25fcmVhZChlZngsICZyZWcsIEVFX1NQSV9IREFUQV9SRUdfS0VSKTsKKwkJbWVtY3B5KG91dCwgJnJlZywgbGVuKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludAorZmFsY29uX3NwaV93cml0ZV9saW1pdChjb25zdCBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgaW50IHN0YXJ0KQoreworCXJldHVybiBtaW4oRkFMQ09OX1NQSV9NQVhfTEVOLAorCQkgICAoc3BpLT5ibG9ja19zaXplIC0gKHN0YXJ0ICYgKHNwaS0+YmxvY2tfc2l6ZSAtIDEpKSkpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitlZnhfc3BpX211bmdlX2NvbW1hbmQoY29uc3Qgc3RydWN0IGVmeF9zcGlfZGV2aWNlICpzcGksCisJCSAgICAgIGNvbnN0IHU4IGNvbW1hbmQsIGNvbnN0IHVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXJldHVybiBjb21tYW5kIHwgKCgoYWRkcmVzcyA+PiA4KSAmIHNwaS0+bXVuZ2VfYWRkcmVzcykgPDwgMyk7Cit9CisKKworc3RhdGljIGludCBmYWxjb25fc3BpX2Zhc3Rfd2FpdChjb25zdCBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSkKK3sKKwl1OCBzdGF0dXM7CisJaW50IGksIHJjOworCisJLyogV2FpdCB1cCB0byAxMDAwdXMgZm9yIGZsYXNoL0VFUFJPTSB0byBmaW5pc2ggYSBmYXN0IG9wZXJhdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQl1ZGVsYXkoMjApOworCisJCXJjID0gZmFsY29uX3NwaV9jbWQoc3BpLCBTUElfUkRTUiwgLTEsIE5VTEwsCisJCQkJICAgICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlpZiAoIShzdGF0dXMgJiBTUElfU1RBVFVTX05SRFkpKQorCQkJcmV0dXJuIDA7CisJfQorCUVGWF9FUlIoc3BpLT5lZngsCisJCSJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGV2aWNlICVkIGxhc3Qgc3RhdHVzPTB4JTAyeFxuIiwKKwkJc3BpLT5kZXZpY2VfaWQsIHN0YXR1cyk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK2ludCBmYWxjb25fc3BpX3JlYWQoY29uc3Qgc3RydWN0IGVmeF9zcGlfZGV2aWNlICpzcGksIGxvZmZfdCBzdGFydCwKKwkJICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1OCAqYnVmZmVyKQoreworCXVuc2lnbmVkIGludCBjb21tYW5kLCBibG9ja19sZW4sIHBvcyA9IDA7CisJaW50IHJjID0gMDsKKworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJYmxvY2tfbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpbGVuIC0gcG9zLAorCQkJCUZBTENPTl9TUElfTUFYX0xFTik7CisKKwkJY29tbWFuZCA9IGVmeF9zcGlfbXVuZ2VfY29tbWFuZChzcGksIFNQSV9SRUFELCBzdGFydCArIHBvcyk7CisJCXJjID0gZmFsY29uX3NwaV9jbWQoc3BpLCBjb21tYW5kLCBzdGFydCArIHBvcywgTlVMTCwKKwkJCQkgICAgYnVmZmVyICsgcG9zLCBibG9ja19sZW4pOworCQlpZiAocmMpCisJCQlicmVhazsKKwkJcG9zICs9IGJsb2NrX2xlbjsKKworCQkvKiBBdm9pZCBsb2NraW5nIHVwIHRoZSBzeXN0ZW0gKi8KKwkJY29uZF9yZXNjaGVkKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSBwb3M7CisJcmV0dXJuIHJjOworfQorCitpbnQgZmFsY29uX3NwaV93cml0ZShjb25zdCBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSwgbG9mZl90IHN0YXJ0LAorCQkgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1OCAqYnVmZmVyKQoreworCXU4IHZlcmlmeV9idWZmZXJbRkFMQ09OX1NQSV9NQVhfTEVOXTsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZCwgYmxvY2tfbGVuLCBwb3MgPSAwOworCWludCByYyA9IDA7CisKKwl3aGlsZSAocG9zIDwgbGVuKSB7CisJCXJjID0gZmFsY29uX3NwaV9jbWQoc3BpLCBTUElfV1JFTiwgLTEsIE5VTEwsIE5VTEwsIDApOworCQlpZiAocmMpCisJCQlicmVhazsKKworCQlibG9ja19sZW4gPSBtaW4oKHVuc2lnbmVkIGludClsZW4gLSBwb3MsCisJCQkJZmFsY29uX3NwaV93cml0ZV9saW1pdChzcGksIHN0YXJ0ICsgcG9zKSk7CisJCWNvbW1hbmQgPSBlZnhfc3BpX211bmdlX2NvbW1hbmQoc3BpLCBTUElfV1JJVEUsIHN0YXJ0ICsgcG9zKTsKKwkJcmMgPSBmYWxjb25fc3BpX2NtZChzcGksIGNvbW1hbmQsIHN0YXJ0ICsgcG9zLAorCQkJCSAgICBidWZmZXIgKyBwb3MsIE5VTEwsIGJsb2NrX2xlbik7CisJCWlmIChyYykKKwkJCWJyZWFrOworCisJCXJjID0gZmFsY29uX3NwaV9mYXN0X3dhaXQoc3BpKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisKKwkJY29tbWFuZCA9IGVmeF9zcGlfbXVuZ2VfY29tbWFuZChzcGksIFNQSV9SRUFELCBzdGFydCArIHBvcyk7CisJCXJjID0gZmFsY29uX3NwaV9jbWQoc3BpLCBjb21tYW5kLCBzdGFydCArIHBvcywKKwkJCQkgICAgTlVMTCwgdmVyaWZ5X2J1ZmZlciwgYmxvY2tfbGVuKTsKKwkJaWYgKG1lbWNtcCh2ZXJpZnlfYnVmZmVyLCBidWZmZXIgKyBwb3MsIGJsb2NrX2xlbikpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJcG9zICs9IGJsb2NrX2xlbjsKKworCQkvKiBBdm9pZCBsb2NraW5nIHVwIHRoZSBzeXN0ZW0gKi8KKwkJY29uZF9yZXNjaGVkKCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmMgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXRsZW4pCisJCSpyZXRsZW4gPSBwb3M7CisJcmV0dXJuIHJjOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBNQUMgd3JhcHBlcgpAQCAtMTgxMiw3ICsxODc5LDcgQEAKIHsKIAllZnhfb3dvcmRfdCByZWc7CiAJaW50IGxpbmtfc3BlZWQ7Ci0JdW5zaWduZWQgaW50IHR4X2ZjOworCWJvb2wgdHhfZmM7CiAKIAlpZiAoZWZ4LT5saW5rX29wdGlvbnMgJiBHTV9MUEFfMTAwMDApCiAJCWxpbmtfc3BlZWQgPSAweDM7CkBAIC0xODQ3LDcgKzE5MTQsNyBAQAogCS8qIFRyYW5zbWlzc2lvbiBvZiBwYXVzZSBmcmFtZXMgd2hlbiBSWCBjcm9zc2VzIHRoZSB0aHJlc2hvbGQgaXMKIAkgKiBjb3ZlcmVkIGJ5IFJYX1hPRkZfTUFDX0VOIGFuZCBYTV9UWF9DRkdfUkVHOlhNX0ZDTlRMLgogCSAqIEFjdGlvbiBvbiByZWNlaXB0IG9mIHBhdXNlIGZyYW1lcyBpcyBjb250cm9sbGVyIGJ5IFhNX0RJU19GQ05UTCAqLwotCXR4X2ZjID0gKGVmeC0+Zmxvd19jb250cm9sICYgRUZYX0ZDX1RYKSA/IDEgOiAwOworCXR4X2ZjID0gISEoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfVFgpOwogCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgUlhfQ0ZHX1JFR19LRVIpOwogCUVGWF9TRVRfT1dPUkRfRklFTERfVkVSKGVmeCwgcmVnLCBSWF9YT0ZGX01BQ19FTiwgdHhfZmMpOwogCkBAIC0xODg3LDggKzE5NTQsMTAgQEAKIAogCS8qIFdhaXQgZm9yIHRyYW5zZmVyIHRvIGNvbXBsZXRlICovCiAJZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7Ci0JCWlmICgqKHZvbGF0aWxlIHUzMiAqKWRtYV9kb25lID09IEZBTENPTl9TVEFUU19ET05FKQorCQlpZiAoKih2b2xhdGlsZSB1MzIgKilkbWFfZG9uZSA9PSBGQUxDT05fU1RBVFNfRE9ORSkgeworCQkJcm1iKCk7IC8qIEVuc3VyZSB0aGUgc3RhdHMgYXJlIHZhbGlkLiAqLwogCQkJcmV0dXJuIDA7CisJCX0KIAkJdWRlbGF5KDEwKTsKIAl9CiAKQEAgLTE5NTEsNyArMjAyMCw3IEBACiBzdGF0aWMgdm9pZCBmYWxjb25fbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9pZCwKIAkJCSAgICAgIGludCBhZGRyLCBpbnQgdmFsdWUpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXVuc2lnbmVkIGludCBwaHlfaWQyID0gcGh5X2lkICYgRkFMQ09OX1BIWV9JRF9JRF9NQVNLOwogCWVmeF9vd29yZF90IHJlZzsKIApAQCAtMjAxOSw3ICsyMDg4LDcgQEAKICAqIGNvdWxkIGJlIHJlYWQsIC0xIHdpbGwgYmUgcmV0dXJuZWQuICovCiBzdGF0aWMgaW50IGZhbGNvbl9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBhZGRyKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAl1bnNpZ25lZCBpbnQgcGh5X2FkZHIgPSBwaHlfaWQgJiBGQUxDT05fUEhZX0lEX0lEX01BU0s7CiAJZWZ4X293b3JkX3QgcmVnOwogCWludCB2YWx1ZSA9IC0xOwpAQCAtMjEyMCw3ICsyMTg5LDcgQEAKIAkJcmV0dXJuIHJjOwogCiAJLyogU2V0IHVwIEdNSUkgc3RydWN0dXJlIGZvciBQSFkgKi8KLQllZngtPm1paS5zdXBwb3J0c19nbWlpID0gMTsKKwllZngtPm1paS5zdXBwb3J0c19nbWlpID0gdHJ1ZTsKIAlmYWxjb25faW5pdF9tZGlvKCZlZngtPm1paSk7CiAKIAkvKiBIYXJkd2FyZSBmbG93IGN0cmwuIEZhbGNvbkEgUlggRklGTyB0b28gc21hbGwgZm9yIHBhdXNlIGdlbmVyYXRpb24gKi8KQEAgLTIxNjgsNiArMjIzNywxNzAgQEAKIAlmYWxjb25fd3JpdGUoZWZ4LCAmbWNfaGFzaC0+b3dvcmRbMV0sIE1BQ19NQ0FTVF9IQVNIX1JFRzFfS0VSKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGYWxjb24gdGVzdCBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmFsY29uX3JlYWRfbnZyYW0oc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGZhbGNvbl9udmNvbmZpZyAqbnZjb25maWdfb3V0KQoreworCXN0cnVjdCBmYWxjb25fbnZjb25maWcgKm52Y29uZmlnOworCXN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpOworCXZvaWQgKnJlZ2lvbjsKKwlpbnQgcmMsIG1hZ2ljX251bSwgc3RydWN0X3ZlcjsKKwlfX2xlMTYgKndvcmQsICpsaW1pdDsKKwl1MzIgY3N1bTsKKworCXJlZ2lvbiA9IGttYWxsb2MoTlZDT05GSUdfRU5ELCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ2lvbikKKwkJcmV0dXJuIC1FTk9NRU07CisJbnZjb25maWcgPSByZWdpb24gKyBOVkNPTkZJR19PRkZTRVQ7CisKKwlzcGkgPSBlZngtPnNwaV9mbGFzaCA/IGVmeC0+c3BpX2ZsYXNoIDogZWZ4LT5zcGlfZWVwcm9tOworCXJjID0gZmFsY29uX3NwaV9yZWFkKHNwaSwgMCwgTlZDT05GSUdfRU5ELCBOVUxMLCByZWdpb24pOworCWlmIChyYykgeworCQlFRlhfRVJSKGVmeCwgIkZhaWxlZCB0byByZWFkICVzXG4iLAorCQkJZWZ4LT5zcGlfZmxhc2ggPyAiZmxhc2giIDogIkVFUFJPTSIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCW1hZ2ljX251bSA9IGxlMTZfdG9fY3B1KG52Y29uZmlnLT5ib2FyZF9tYWdpY19udW0pOworCXN0cnVjdF92ZXIgPSBsZTE2X3RvX2NwdShudmNvbmZpZy0+Ym9hcmRfc3RydWN0X3Zlcik7CisKKwlyYyA9IC1FSU5WQUw7CisJaWYgKG1hZ2ljX251bSAhPSBOVkNPTkZJR19CT0FSRF9NQUdJQ19OVU0pIHsKKwkJRUZYX0VSUihlZngsICJOVlJBTSBiYWQgbWFnaWMgMHgleFxuIiwgbWFnaWNfbnVtKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzdHJ1Y3RfdmVyIDwgMikgeworCQlFRlhfRVJSKGVmeCwgIk5WUkFNIGhhcyBhbmNpZW50IHZlcnNpb24gMHgleFxuIiwgc3RydWN0X3Zlcik7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoc3RydWN0X3ZlciA8IDQpIHsKKwkJd29yZCA9ICZudmNvbmZpZy0+Ym9hcmRfbWFnaWNfbnVtOworCQlsaW1pdCA9IChfX2xlMTYgKikgKG52Y29uZmlnICsgMSk7CisJfSBlbHNlIHsKKwkJd29yZCA9IHJlZ2lvbjsKKwkJbGltaXQgPSByZWdpb24gKyBOVkNPTkZJR19FTkQ7CisJfQorCWZvciAoY3N1bSA9IDA7IHdvcmQgPCBsaW1pdDsgKyt3b3JkKQorCQljc3VtICs9IGxlMTZfdG9fY3B1KCp3b3JkKTsKKworCWlmICh+Y3N1bSAmIDB4ZmZmZikgeworCQlFRlhfRVJSKGVmeCwgIk5WUkFNIGhhcyBpbmNvcnJlY3QgY2hlY2tzdW1cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IDA7CisJaWYgKG52Y29uZmlnX291dCkKKwkJbWVtY3B5KG52Y29uZmlnX291dCwgbnZjb25maWcsIHNpemVvZigqbnZjb25maWcpKTsKKworIG91dDoKKwlrZnJlZShyZWdpb24pOworCXJldHVybiByYzsKK30KKworLyogUmVnaXN0ZXJzIHRlc3RlZCBpbiB0aGUgZmFsY29uIHJlZ2lzdGVyIHRlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGFkZHJlc3M7CisJZWZ4X293b3JkX3QgbWFzazsKK30gZWZ4X3Rlc3RfcmVnaXN0ZXJzW10gPSB7CisJeyBBRFJfUkVHSU9OX1JFR19LRVIsCisJICBFRlhfT1dPUkQzMigweDAwMDFGRkZGLCAweDAwMDFGRkZGLCAweDAwMDFGRkZGLCAweDAwMDFGRkZGKSB9LAorCXsgUlhfQ0ZHX1JFR19LRVIsCisJICBFRlhfT1dPUkQzMigweEZGRkZGRkZFLCAweDAwMDE3RkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSB9LAorCXsgVFhfQ0ZHX1JFR19LRVIsCisJICBFRlhfT1dPUkQzMigweDdGRkYwMDM3LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSB9LAorCXsgVFhfQ0ZHMl9SRUdfS0VSLAorCSAgRUZYX09XT1JEMzIoMHhGRkZFRkU4MCwgMHgxRkZGRkZGRiwgMHgwMjAwMDBGRSwgMHgwMDdGRkZGRikgfSwKKwl7IE1BQzBfQ1RSTF9SRUdfS0VSLAorCSAgRUZYX09XT1JEMzIoMHhGRkZGMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCkgfSwKKwl7IFNSTV9UWF9EQ19DRkdfUkVHX0tFUiwKKwkgIEVGWF9PV09SRDMyKDB4MDAxRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApIH0sCisJeyBSWF9EQ19DRkdfUkVHX0tFUiwKKwkgIEVGWF9PV09SRDMyKDB4MDAwMDAwMEYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApIH0sCisJeyBSWF9EQ19QRl9XTV9SRUdfS0VSLAorCSAgRUZYX09XT1JEMzIoMHgwMDAwMDNGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCkgfSwKKwl7IERQX0NUUkxfUkVHLAorCSAgRUZYX09XT1JEMzIoMHgwMDAwMEZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCkgfSwKKwl7IFhNX0dMQl9DRkdfUkVHLAorCSAgRUZYX09XT1JEMzIoMHgwMDAwMEM2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCkgfSwKKwl7IFhNX1RYX0NGR19SRUcsCisJICBFRlhfT1dPUkQzMigweDAwMDgwMTY0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSB9LAorCXsgWE1fUlhfQ0ZHX1JFRywKKwkgIEVGWF9PV09SRDMyKDB4MDcxMDBBMEMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApIH0sCisJeyBYTV9SWF9QQVJBTV9SRUcsCisJICBFRlhfT1dPUkQzMigweDAwMDAxRkY4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSB9LAorCXsgWE1fRkNfUkVHLAorCSAgRUZYX09XT1JEMzIoMHhGRkZGMDAwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCkgfSwKKwl7IFhNX0FEUl9MT19SRUcsCisJICBFRlhfT1dPUkQzMigweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKSB9LAorCXsgWFhfU0RfQ1RMX1JFRywKKwkgIEVGWF9PV09SRDMyKDB4MDAwM0ZGMEYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApIH0sCit9OworCitzdGF0aWMgYm9vbCBlZnhfbWFza2VkX2NvbXBhcmVfb3dvcmQoY29uc3QgZWZ4X293b3JkX3QgKmEsIGNvbnN0IGVmeF9vd29yZF90ICpiLAorCQkJCSAgICAgY29uc3QgZWZ4X293b3JkX3QgKm1hc2spCit7CisJcmV0dXJuICgoYS0+dTY0WzBdIF4gYi0+dTY0WzBdKSAmIG1hc2stPnU2NFswXSkgfHwKKwkJKChhLT51NjRbMV0gXiBiLT51NjRbMV0pICYgbWFzay0+dTY0WzFdKTsKK30KKworaW50IGZhbGNvbl90ZXN0X3JlZ2lzdGVycyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoreworCXVuc2lnbmVkIGFkZHJlc3MgPSAwLCBpLCBqOworCWVmeF9vd29yZF90IG1hc2ssIGltYXNrLCBvcmlnaW5hbCwgcmVnLCBidWY7CisKKwkvKiBGYWxjb24gc2hvdWxkIGJlIGluIGxvb3BiYWNrIHRvIGlzb2xhdGUgdGhlIFhNQUMgZnJvbSB0aGUgUEhZICovCisJV0FSTl9PTighTE9PUEJBQ0tfSU5URVJOQUwoZWZ4KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlZnhfdGVzdF9yZWdpc3RlcnMpOyArK2kpIHsKKwkJYWRkcmVzcyA9IGVmeF90ZXN0X3JlZ2lzdGVyc1tpXS5hZGRyZXNzOworCQltYXNrID0gaW1hc2sgPSBlZnhfdGVzdF9yZWdpc3RlcnNbaV0ubWFzazsKKwkJRUZYX0lOVkVSVF9PV09SRChpbWFzayk7CisKKwkJZmFsY29uX3JlYWQoZWZ4LCAmb3JpZ2luYWwsIGFkZHJlc3MpOworCisJCS8qIGJpdCBzd2VlcCBvbiBhbmQgb2ZmICovCisJCWZvciAoaiA9IDA7IGogPCAxMjg7IGorKykgeworCQkJaWYgKCFFRlhfRVhUUkFDVF9PV09SRDMyKG1hc2ssIGosIGopKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUZXN0IHRoaXMgdGVzdGFibGUgYml0IGNhbiBiZSBzZXQgaW4gaXNvbGF0aW9uICovCisJCQlFRlhfQU5EX09XT1JEKHJlZywgb3JpZ2luYWwsIG1hc2spOworCQkJRUZYX1NFVF9PV09SRDMyKHJlZywgaiwgaiwgMSk7CisKKwkJCWZhbGNvbl93cml0ZShlZngsICZyZWcsIGFkZHJlc3MpOworCQkJZmFsY29uX3JlYWQoZWZ4LCAmYnVmLCBhZGRyZXNzKTsKKworCQkJaWYgKGVmeF9tYXNrZWRfY29tcGFyZV9vd29yZCgmcmVnLCAmYnVmLCAmbWFzaykpCisJCQkJZ290byBmYWlsOworCisJCQkvKiBUZXN0IHRoaXMgdGVzdGFibGUgYml0IGNhbiBiZSBjbGVhcmVkIGluIGlzb2xhdGlvbiAqLworCQkJRUZYX09SX09XT1JEKHJlZywgb3JpZ2luYWwsIG1hc2spOworCQkJRUZYX1NFVF9PV09SRDMyKHJlZywgaiwgaiwgMCk7CisKKwkJCWZhbGNvbl93cml0ZShlZngsICZyZWcsIGFkZHJlc3MpOworCQkJZmFsY29uX3JlYWQoZWZ4LCAmYnVmLCBhZGRyZXNzKTsKKworCQkJaWYgKGVmeF9tYXNrZWRfY29tcGFyZV9vd29yZCgmcmVnLCAmYnVmLCAmbWFzaykpCisJCQkJZ290byBmYWlsOworCQl9CisKKwkJZmFsY29uX3dyaXRlKGVmeCwgJm9yaWdpbmFsLCBhZGRyZXNzKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlFRlhfRVJSKGVmeCwgIndyb3RlICJFRlhfT1dPUkRfRk1UIiByZWFkICJFRlhfT1dPUkRfRk1UCisJCSIgYXQgYWRkcmVzcyAweCV4IG1hc2sgIkVGWF9PV09SRF9GTVQiXG4iLCBFRlhfT1dPUkRfVkFMKHJlZyksCisJCUVGWF9PV09SRF9WQUwoYnVmKSwgYWRkcmVzcywgRUZYX09XT1JEX1ZBTChtYXNrKSk7CisJcmV0dXJuIC1FSU87Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIERldmljZSByZXNldApAQCAtMjMwNSw2OCArMjUzOCwxMDMgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorc3RhdGljIGludCBmYWxjb25fc3BpX2RldmljZV9pbml0KHN0cnVjdCBlZnhfbmljICplZngsCisJCQkJICBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKipzcGlfZGV2aWNlX3JldCwKKwkJCQkgIHVuc2lnbmVkIGludCBkZXZpY2VfaWQsIHUzMiBkZXZpY2VfdHlwZSkKK3sKKwlzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaV9kZXZpY2U7CisKKwlpZiAoZGV2aWNlX3R5cGUgIT0gMCkgeworCQlzcGlfZGV2aWNlID0ga21hbGxvYyhzaXplb2YoKnNwaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzcGlfZGV2aWNlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwaV9kZXZpY2UtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKwkJc3BpX2RldmljZS0+c2l6ZSA9CisJCQkxIDw8IFNQSV9ERVZfVFlQRV9GSUVMRChkZXZpY2VfdHlwZSwgU1BJX0RFVl9UWVBFX1NJWkUpOworCQlzcGlfZGV2aWNlLT5hZGRyX2xlbiA9CisJCQlTUElfREVWX1RZUEVfRklFTEQoZGV2aWNlX3R5cGUsIFNQSV9ERVZfVFlQRV9BRERSX0xFTik7CisJCXNwaV9kZXZpY2UtPm11bmdlX2FkZHJlc3MgPSAoc3BpX2RldmljZS0+c2l6ZSA9PSAxIDw8IDkgJiYKKwkJCQkJICAgICBzcGlfZGV2aWNlLT5hZGRyX2xlbiA9PSAxKTsKKwkJc3BpX2RldmljZS0+YmxvY2tfc2l6ZSA9CisJCQkxIDw8IFNQSV9ERVZfVFlQRV9GSUVMRChkZXZpY2VfdHlwZSwKKwkJCQkJCVNQSV9ERVZfVFlQRV9CTE9DS19TSVpFKTsKKworCQlzcGlfZGV2aWNlLT5lZnggPSBlZng7CisJfSBlbHNlIHsKKwkJc3BpX2RldmljZSA9IE5VTEw7CisJfQorCisJa2ZyZWUoKnNwaV9kZXZpY2VfcmV0KTsKKwkqc3BpX2RldmljZV9yZXQgPSBzcGlfZGV2aWNlOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGZhbGNvbl9yZW1vdmVfc3BpX2RldmljZXMoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlrZnJlZShlZngtPnNwaV9lZXByb20pOworCWVmeC0+c3BpX2VlcHJvbSA9IE5VTEw7CisJa2ZyZWUoZWZ4LT5zcGlfZmxhc2gpOworCWVmeC0+c3BpX2ZsYXNoID0gTlVMTDsKK30KKwogLyogRXh0cmFjdCBub24tdm9sYXRpbGUgY29uZmlndXJhdGlvbiAqLwogc3RhdGljIGludCBmYWxjb25fcHJvYmVfbnZjb25maWcoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAlzdHJ1Y3QgZmFsY29uX252Y29uZmlnICpudmNvbmZpZzsKLQllZnhfb3dvcmRfdCBuaWNfc3RhdDsKLQlpbnQgZGV2aWNlX2lkOwotCXVuc2lnbmVkIGFkZHJfbGVuOwotCXNpemVfdCBvZmZzZXQsIGxlbjsKLQlpbnQgbWFnaWNfbnVtLCBzdHJ1Y3RfdmVyLCBib2FyZF9yZXY7CisJaW50IGJvYXJkX3JldjsKIAlpbnQgcmM7CiAKLQkvKiBGaW5kIHRoZSBib290IGRldmljZS4gKi8KLQlmYWxjb25fcmVhZChlZngsICZuaWNfc3RhdCwgTklDX1NUQVRfUkVHKTsKLQlpZiAoRUZYX09XT1JEX0ZJRUxEKG5pY19zdGF0LCBTRl9QUlNUKSkgewotCQlkZXZpY2VfaWQgPSBFRV9TUElfRkxBU0g7Ci0JCWFkZHJfbGVuID0gMzsKLQl9IGVsc2UgaWYgKEVGWF9PV09SRF9GSUVMRChuaWNfc3RhdCwgRUVfUFJTVCkpIHsKLQkJZGV2aWNlX2lkID0gRUVfU1BJX0VFUFJPTTsKLQkJYWRkcl9sZW4gPSAyOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCW52Y29uZmlnID0ga21hbGxvYyhzaXplb2YoKm52Y29uZmlnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudmNvbmZpZykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBSZWFkIHRoZSB3aG9sZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpbnRvIG1lbW9yeS4gKi8KLQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHNpemVvZigqbnZjb25maWcpOyBvZmZzZXQgKz0gbGVuKSB7Ci0JCWxlbiA9IG1pbihzaXplb2YoKm52Y29uZmlnKSAtIG9mZnNldCwKLQkJCSAgKHNpemVfdCkgRkFMQ09OX1NQSV9NQVhfTEVOKTsKLQkJcmMgPSBmYWxjb25fc3BpX3JlYWQoZWZ4LCBkZXZpY2VfaWQsIFNQSV9SRUFELAotCQkJCSAgICAgTlZDT05GSUdfQkFTRSArIG9mZnNldCwgYWRkcl9sZW4sCi0JCQkJICAgICAoY2hhciAqKW52Y29uZmlnICsgb2Zmc2V0LCBsZW4pOwotCQlpZiAocmMpCi0JCQlnb3RvIG91dDsKKwlyYyA9IGZhbGNvbl9yZWFkX252cmFtKGVmeCwgbnZjb25maWcpOworCWlmIChyYyA9PSAtRUlOVkFMKSB7CisJCUVGWF9FUlIoZWZ4LCAiTlZSQU0gaXMgaW52YWxpZCB0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIpOworCQllZngtPnBoeV90eXBlID0gUEhZX1RZUEVfTk9ORTsKKwkJZWZ4LT5taWkucGh5X2lkID0gUEhZX0FERFJfSU5WQUxJRDsKKwkJYm9hcmRfcmV2ID0gMDsKKwkJcmMgPSAwOworCX0gZWxzZSBpZiAocmMpIHsKKwkJZ290byBmYWlsMTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZmFsY29uX252Y29uZmlnX2JvYXJkX3YyICp2MiA9ICZudmNvbmZpZy0+Ym9hcmRfdjI7CisJCXN0cnVjdCBmYWxjb25fbnZjb25maWdfYm9hcmRfdjMgKnYzID0gJm52Y29uZmlnLT5ib2FyZF92MzsKKworCQllZngtPnBoeV90eXBlID0gdjItPnBvcnQwX3BoeV90eXBlOworCQllZngtPm1paS5waHlfaWQgPSB2Mi0+cG9ydDBfcGh5X2FkZHI7CisJCWJvYXJkX3JldiA9IGxlMTZfdG9fY3B1KHYyLT5ib2FyZF9yZXZpc2lvbik7CisKKwkJaWYgKGxlMTZfdG9fY3B1KG52Y29uZmlnLT5ib2FyZF9zdHJ1Y3RfdmVyKSA+PSAzKSB7CisJCQlfX2xlMzIgZmwgPSB2My0+c3BpX2RldmljZV90eXBlW0VFX1NQSV9GTEFTSF07CisJCQlfX2xlMzIgZWUgPSB2My0+c3BpX2RldmljZV90eXBlW0VFX1NQSV9FRVBST01dOworCQkJcmMgPSBmYWxjb25fc3BpX2RldmljZV9pbml0KGVmeCwgJmVmeC0+c3BpX2ZsYXNoLAorCQkJCQkJICAgIEVFX1NQSV9GTEFTSCwKKwkJCQkJCSAgICBsZTMyX3RvX2NwdShmbCkpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZmFpbDI7CisJCQlyYyA9IGZhbGNvbl9zcGlfZGV2aWNlX2luaXQoZWZ4LCAmZWZ4LT5zcGlfZWVwcm9tLAorCQkJCQkJICAgIEVFX1NQSV9FRVBST00sCisJCQkJCQkgICAgbGUzMl90b19jcHUoZWUpKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGZhaWwyOworCQl9CiAJfQogCiAJLyogUmVhZCB0aGUgTUFDIGFkZHJlc3NlcyAqLwogCW1lbWNweShlZngtPm1hY19hZGRyZXNzLCBudmNvbmZpZy0+bWFjX2FkZHJlc3NbMF0sIEVUSF9BTEVOKTsKIAotCS8qIFJlYWQgdGhlIGJvYXJkIGNvbmZpZ3VyYXRpb24uICovCi0JbWFnaWNfbnVtID0gbGUxNl90b19jcHUobnZjb25maWctPmJvYXJkX21hZ2ljX251bSk7Ci0Jc3RydWN0X3ZlciA9IGxlMTZfdG9fY3B1KG52Y29uZmlnLT5ib2FyZF9zdHJ1Y3RfdmVyKTsKLQotCWlmIChtYWdpY19udW0gIT0gTlZDT05GSUdfQk9BUkRfTUFHSUNfTlVNIHx8IHN0cnVjdF92ZXIgPCAyKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiTm9uIHZvbGF0aWxlIG1lbW9yeSBiYWQgbWFnaWM9JXggdmVyPSV4ICIKLQkJCSJ0aGVyZWZvcmUgdXNpbmcgZGVmYXVsdHNcbiIsIG1hZ2ljX251bSwgc3RydWN0X3Zlcik7Ci0JCWVmeC0+cGh5X3R5cGUgPSBQSFlfVFlQRV9OT05FOwotCQllZngtPm1paS5waHlfaWQgPSBQSFlfQUREUl9JTlZBTElEOwotCQlib2FyZF9yZXYgPSAwOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBmYWxjb25fbnZjb25maWdfYm9hcmRfdjIgKnYyID0gJm52Y29uZmlnLT5ib2FyZF92MjsKLQotCQllZngtPnBoeV90eXBlID0gdjItPnBvcnQwX3BoeV90eXBlOwotCQllZngtPm1paS5waHlfaWQgPSB2Mi0+cG9ydDBfcGh5X2FkZHI7Ci0JCWJvYXJkX3JldiA9IGxlMTZfdG9fY3B1KHYyLT5ib2FyZF9yZXZpc2lvbik7Ci0JfQotCiAJRUZYX0xPRyhlZngsICJQSFkgaXMgJWQgcGh5X2lkICVkXG4iLCBlZngtPnBoeV90eXBlLCBlZngtPm1paS5waHlfaWQpOwogCiAJZWZ4X3NldF9ib2FyZF9pbmZvKGVmeCwgYm9hcmRfcmV2KTsKIAotIG91dDoKKwlrZnJlZShudmNvbmZpZyk7CisJcmV0dXJuIDA7CisKKyBmYWlsMjoKKwlmYWxjb25fcmVtb3ZlX3NwaV9kZXZpY2VzKGVmeCk7CisgZmFpbDE6CiAJa2ZyZWUobnZjb25maWcpOwogCXJldHVybiByYzsKIH0KQEAgLTI0MTcsNiArMjY4NSw4NiBAQAogCXJldHVybiAwOwogfQogCisvKiBQcm9iZSBhbGwgU1BJIGRldmljZXMgb24gdGhlIE5JQyAqLworc3RhdGljIHZvaWQgZmFsY29uX3Byb2JlX3NwaV9kZXZpY2VzKHN0cnVjdCBlZnhfbmljICplZngpCit7CisJZWZ4X293b3JkX3QgbmljX3N0YXQsIGdwaW9fY3RsLCBlZV92cGRfY2ZnOworCWJvb2wgaGFzX2ZsYXNoLCBoYXNfZWVwcm9tLCBib290X2lzX2V4dGVybmFsOworCisJZmFsY29uX3JlYWQoZWZ4LCAmZ3Bpb19jdGwsIEdQSU9fQ1RMX1JFR19LRVIpOworCWZhbGNvbl9yZWFkKGVmeCwgJm5pY19zdGF0LCBOSUNfU1RBVF9SRUcpOworCWZhbGNvbl9yZWFkKGVmeCwgJmVlX3ZwZF9jZmcsIEVFX1ZQRF9DRkdfUkVHX0tFUik7CisKKwloYXNfZmxhc2ggPSBFRlhfT1dPUkRfRklFTEQobmljX3N0YXQsIFNGX1BSU1QpOworCWhhc19lZXByb20gPSBFRlhfT1dPUkRfRklFTEQobmljX3N0YXQsIEVFX1BSU1QpOworCWJvb3RfaXNfZXh0ZXJuYWwgPSBFRlhfT1dPUkRfRklFTEQoZ3Bpb19jdGwsIEJPT1RFRF9VU0lOR19OVkRFVklDRSk7CisKKwlpZiAoaGFzX2ZsYXNoKSB7CisJCS8qIERlZmF1bHQgZmxhc2ggU1BJIGRldmljZTogQXRtZWwgQVQyNUYxMDI0CisJCSAqIDEyOCBLQiwgMjQtYml0IGFkZHJlc3MsIDMyIEtCIGVyYXNlIGJsb2NrLAorCQkgKiAyNTYgQiB3cml0ZSBibG9jaworCQkgKi8KKwkJdTMyIGZsYXNoX2RldmljZV90eXBlID0KKwkJCSgxNyA8PCBTUElfREVWX1RZUEVfU0laRV9MQk4pCisJCQl8ICgzIDw8IFNQSV9ERVZfVFlQRV9BRERSX0xFTl9MQk4pCisJCQl8ICgweDUyIDw8IFNQSV9ERVZfVFlQRV9FUkFTRV9DTURfTEJOKQorCQkJfCAoMTUgPDwgU1BJX0RFVl9UWVBFX0VSQVNFX1NJWkVfTEJOKQorCQkJfCAoOCA8PCBTUElfREVWX1RZUEVfQkxPQ0tfU0laRV9MQk4pOworCisJCWZhbGNvbl9zcGlfZGV2aWNlX2luaXQoZWZ4LCAmZWZ4LT5zcGlfZmxhc2gsCisJCQkJICAgICAgIEVFX1NQSV9GTEFTSCwgZmxhc2hfZGV2aWNlX3R5cGUpOworCisJCWlmICghYm9vdF9pc19leHRlcm5hbCkgeworCQkJLyogRGlzYWJsZSBWUEQgYW5kIHNldCBjbG9jayBkaXZpZGVycyB0byBzYWZlCisJCQkgKiB2YWx1ZXMgZm9yIGluaXRpYWwgcHJvZ3JhbW1pbmcuCisJCQkgKi8KKwkJCUVGWF9MT0coZWZ4LCAiQm9vdGVkIGZyb20gaW50ZXJuYWwgQVNJQyBzZXR0aW5nczsiCisJCQkJIiBzZXR0aW5nIFNQSSBjb25maWdcbiIpOworCQkJRUZYX1BPUFVMQVRFX09XT1JEXzMoZWVfdnBkX2NmZywgRUVfVlBEX0VOLCAwLAorCQkJCQkgICAgIC8qIDEyNSBNSHogLyA3IH49IDIwIE1IeiAqLworCQkJCQkgICAgIEVFX1NGX0NMT0NLX0RJViwgNywKKwkJCQkJICAgICAvKiAxMjUgTUh6IC8gNjMgfj0gMiBNSHogKi8KKwkJCQkJICAgICBFRV9FRV9DTE9DS19ESVYsIDYzKTsKKwkJCWZhbGNvbl93cml0ZShlZngsICZlZV92cGRfY2ZnLCBFRV9WUERfQ0ZHX1JFR19LRVIpOworCQl9CisJfQorCisJaWYgKGhhc19lZXByb20pIHsKKwkJdTMyIGVlcHJvbV9kZXZpY2VfdHlwZTsKKworCQkvKiBJZiBpdCBoYXMgbm8gZmxhc2gsIGl0IG11c3QgaGF2ZSBhIGxhcmdlIEVFUFJPTQorCQkgKiBmb3IgY2hpcCBjb25maWc7IG90aGVyd2lzZSBjaGVjayB3aGV0aGVyIDktYml0CisJCSAqIGFkZHJlc3NpbmcgaXMgdXNlZCBmb3IgVlBEIGNvbmZpZ3VyYXRpb24KKwkJICovCisJCWlmIChoYXNfZmxhc2ggJiYKKwkJICAgICghYm9vdF9pc19leHRlcm5hbCB8fAorCQkgICAgIEVGWF9PV09SRF9GSUVMRChlZV92cGRfY2ZnLCBFRV9WUERfRU5fQUQ5X01PREUpKSkgeworCQkJLyogRGVmYXVsdCBTUEkgZGV2aWNlOiBBdG1lbCBBVDI1MDQwIG9yIHNpbWlsYXIKKwkJCSAqIDUxMiBCLCA5LWJpdCBhZGRyZXNzLCA4IEIgd3JpdGUgYmxvY2sKKwkJCSAqLworCQkJZWVwcm9tX2RldmljZV90eXBlID0KKwkJCQkoOSA8PCBTUElfREVWX1RZUEVfU0laRV9MQk4pCisJCQkJfCAoMSA8PCBTUElfREVWX1RZUEVfQUREUl9MRU5fTEJOKQorCQkJCXwgKDMgPDwgU1BJX0RFVl9UWVBFX0JMT0NLX1NJWkVfTEJOKTsKKwkJfSBlbHNlIHsKKwkJCS8qICJMYXJnZSIgU1BJIGRldmljZTogQXRtZWwgQVQyNTY0MCBvciBzaW1pbGFyCisJCQkgKiA4IEtCLCAxNi1iaXQgYWRkcmVzcywgMzIgQiB3cml0ZSBibG9jaworCQkJICovCisJCQllZXByb21fZGV2aWNlX3R5cGUgPQorCQkJCSgxMyA8PCBTUElfREVWX1RZUEVfU0laRV9MQk4pCisJCQkJfCAoMiA8PCBTUElfREVWX1RZUEVfQUREUl9MRU5fTEJOKQorCQkJCXwgKDUgPDwgU1BJX0RFVl9UWVBFX0JMT0NLX1NJWkVfTEJOKTsKKwkJfQorCisJCWZhbGNvbl9zcGlfZGV2aWNlX2luaXQoZWZ4LCAmZWZ4LT5zcGlfZWVwcm9tLAorCQkJCSAgICAgICBFRV9TUElfRUVQUk9NLCBlZXByb21fZGV2aWNlX3R5cGUpOworCX0KKworCUVGWF9MT0coZWZ4LCAiZmxhc2ggaXMgJXMsIEVFUFJPTSBpcyAlc1xuIiwKKwkJKGhhc19mbGFzaCA/ICJwcmVzZW50IiA6ICJhYnNlbnQiKSwKKwkJKGhhc19lZXByb20gPyAicHJlc2VudCIgOiAiYWJzZW50IikpOworfQorCiBpbnQgZmFsY29uX3Byb2JlX25pYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCXN0cnVjdCBmYWxjb25fbmljX2RhdGEgKm5pY19kYXRhOwpAQCAtMjQyNCw2ICsyNzcyLDggQEAKIAogCS8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGhhcmR3YXJlIHNwZWNpZmljIGRhdGEgKi8KIAluaWNfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpuaWNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghbmljX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOwogCWVmeC0+bmljX2RhdGEgPSBuaWNfZGF0YTsKIAogCS8qIERldGVybWluZSBudW1iZXIgb2YgcG9ydHMgZXRjLiAqLwpAQCAtMjQ2Nyw2ICsyODE3LDggQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyllZngtPmlycV9zdGF0dXMuZG1hX2FkZHIsCiAJCWVmeC0+aXJxX3N0YXR1cy5hZGRyLCB2aXJ0X3RvX3BoeXMoZWZ4LT5pcnFfc3RhdHVzLmFkZHIpKTsKIAorCWZhbGNvbl9wcm9iZV9zcGlfZGV2aWNlcyhlZngpOworCiAJLyogUmVhZCBpbiB0aGUgbm9uLXZvbGF0aWxlIGNvbmZpZ3VyYXRpb24gKi8KIAlyYyA9IGZhbGNvbl9wcm9iZV9udmNvbmZpZyhlZngpOwogCWlmIChyYykKQEAgLTI0ODYsNiArMjgzOCw3IEBACiAJcmV0dXJuIDA7CiAKICBmYWlsNToKKwlmYWxjb25fcmVtb3ZlX3NwaV9kZXZpY2VzKGVmeCk7CiAJZmFsY29uX2ZyZWVfYnVmZmVyKGVmeCwgJmVmeC0+aXJxX3N0YXR1cyk7CiAgZmFpbDQ6CiAgZmFpbDM6CkBAIC0yNTczLDE5ICsyOTI2LDE0IEBACiAJRUZYX0lOVkVSVF9PV09SRCh0ZW1wKTsKIAlmYWxjb25fd3JpdGUoZWZ4LCAmdGVtcCwgRkFUQUxfSU5UUl9SRUdfS0VSKTsKIAotCS8qIFNldCBudW1iZXIgb2YgUlNTIHF1ZXVlcyBmb3IgcmVjZWl2ZSBwYXRoLiAqLwotCWZhbGNvbl9yZWFkKGVmeCwgJnRlbXAsIFJYX0ZJTFRFUl9DVExfUkVHKTsKLQlpZiAoZmFsY29uX3JldihlZngpID49IEZBTENPTl9SRVZfQjApCi0JCUVGWF9TRVRfT1dPUkRfRklFTEQodGVtcCwgTlVNX0tFUiwgMCk7Ci0JZWxzZQotCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIE5VTV9LRVIsIGVmeC0+cnNzX3F1ZXVlcyAtIDEpOwogCWlmIChFRlhfV09SS0FST1VORF83MjQ0KGVmeCkpIHsKKwkJZmFsY29uX3JlYWQoZWZ4LCAmdGVtcCwgUlhfRklMVEVSX0NUTF9SRUcpOwogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIFVEUF9GVUxMX1NSQ0hfTElNSVQsIDgpOwogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIFVEUF9XSUxEX1NSQ0hfTElNSVQsIDgpOwogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIFRDUF9GVUxMX1NSQ0hfTElNSVQsIDgpOwogCQlFRlhfU0VUX09XT1JEX0ZJRUxEKHRlbXAsIFRDUF9XSUxEX1NSQ0hfTElNSVQsIDgpOworCQlmYWxjb25fd3JpdGUoZWZ4LCAmdGVtcCwgUlhfRklMVEVSX0NUTF9SRUcpOwogCX0KLQlmYWxjb25fd3JpdGUoZWZ4LCAmdGVtcCwgUlhfRklMVEVSX0NUTF9SRUcpOwogCiAJZmFsY29uX3NldHVwX3Jzc19pbmRpcl90YWJsZShlZngpOwogCkBAIC0yNjQxLDggKzI5ODksOCBAQAogCQkgIHJ4X3hvZmZfdGhyZXNoX2J5dGVzIDogZWZ4LT50eXBlLT5yeF94b2ZmX3RocmVzaCk7CiAJRUZYX1NFVF9PV09SRF9GSUVMRF9WRVIoZWZ4LCB0ZW1wLCBSWF9YT0ZGX01BQ19USCwgdGhyZXNoIC8gMjU2KTsKIAkvKiBSWCBjb250cm9sIEZJRk8gdGhyZXNob2xkcyBbMzIgZW50cmllc10gKi8KLQlFRlhfU0VUX09XT1JEX0ZJRUxEX1ZFUihlZngsIHRlbXAsIFJYX1hPTl9UWF9USCwgMjUpOwotCUVGWF9TRVRfT1dPUkRfRklFTERfVkVSKGVmeCwgdGVtcCwgUlhfWE9GRl9UWF9USCwgMjApOworCUVGWF9TRVRfT1dPUkRfRklFTERfVkVSKGVmeCwgdGVtcCwgUlhfWE9OX1RYX1RILCAyMCk7CisJRUZYX1NFVF9PV09SRF9GSUVMRF9WRVIoZWZ4LCB0ZW1wLCBSWF9YT0ZGX1RYX1RILCAyNSk7CiAJZmFsY29uX3dyaXRlKGVmeCwgJnRlbXAsIFJYX0NGR19SRUdfS0VSKTsKIAogCS8qIFNldCBkZXN0aW5hdGlvbiBvZiBib3RoIFRYIGFuZCBSWCBGbHVzaCBldmVudHMgKi8KQEAgLTI2NjIsNiArMzAxMCw3IEBACiAJcmMgPSBpMmNfZGVsX2FkYXB0ZXIoJmVmeC0+aTJjX2FkYXApOwogCUJVR19PTihyYyk7CiAKKwlmYWxjb25fcmVtb3ZlX3NwaV9kZXZpY2VzKGVmeCk7CiAJZmFsY29uX2ZyZWVfYnVmZmVyKGVmeCwgJmVmeC0+aXJxX3N0YXR1cyk7CiAKIAlmYWxjb25fcmVzZXRfaHcoZWZ4LCBSRVNFVF9UWVBFX0FMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmggYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmgKaW5kZXggNDkyZjliYy4uYmUwMjViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uaApAQCAtNDAsMjQgKzQwLDI0IEBACiAKIC8qIFRYIGRhdGEgcGF0aCAqLwogZXh0ZXJuIGludCBmYWxjb25fcHJvYmVfdHgoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpOwotZXh0ZXJuIGludCBmYWxjb25faW5pdF90eChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSk7CitleHRlcm4gdm9pZCBmYWxjb25faW5pdF90eChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSk7CiBleHRlcm4gdm9pZCBmYWxjb25fZmluaV90eChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSk7CiBleHRlcm4gdm9pZCBmYWxjb25fcmVtb3ZlX3R4KHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKTsKIGV4dGVybiB2b2lkIGZhbGNvbl9wdXNoX2J1ZmZlcnMoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpOwogCiAvKiBSWCBkYXRhIHBhdGggKi8KIGV4dGVybiBpbnQgZmFsY29uX3Byb2JlX3J4KHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKLWV4dGVybiBpbnQgZmFsY29uX2luaXRfcngoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpOworZXh0ZXJuIHZvaWQgZmFsY29uX2luaXRfcngoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpOwogZXh0ZXJuIHZvaWQgZmFsY29uX2Zpbmlfcngoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpOwogZXh0ZXJuIHZvaWQgZmFsY29uX3JlbW92ZV9yeChzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSk7CiBleHRlcm4gdm9pZCBmYWxjb25fbm90aWZ5X3J4X2Rlc2Moc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpOwogCiAvKiBFdmVudCBkYXRhIHBhdGggKi8KIGV4dGVybiBpbnQgZmFsY29uX3Byb2JlX2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpOwotZXh0ZXJuIGludCBmYWxjb25faW5pdF9ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKTsKK2V4dGVybiB2b2lkIGZhbGNvbl9pbml0X2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpOwogZXh0ZXJuIHZvaWQgZmFsY29uX2ZpbmlfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCk7CiBleHRlcm4gdm9pZCBmYWxjb25fcmVtb3ZlX2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpOwotZXh0ZXJuIGludCBmYWxjb25fcHJvY2Vzc19ldmVudHEoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLCBpbnQgKnJ4X3F1b3RhKTsKK2V4dGVybiBpbnQgZmFsY29uX3Byb2Nlc3NfZXZlbnRxKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwgaW50IHJ4X3F1b3RhKTsKIGV4dGVybiB2b2lkIGZhbGNvbl9ldmVudHFfcmVhZF9hY2soc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKTsKIAogLyogUG9ydHMgKi8KQEAgLTY1LDcgKzY1LDcgQEAKIGV4dGVybiB2b2lkIGZhbGNvbl9yZW1vdmVfcG9ydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAogLyogTUFDL1BIWSAqLwotZXh0ZXJuIGludCBmYWxjb25feGF1aV9saW5rX29rKHN0cnVjdCBlZnhfbmljICplZngpOworZXh0ZXJuIGJvb2wgZmFsY29uX3hhdWlfbGlua19vayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiBpbnQgZmFsY29uX2RtYV9zdGF0cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAogCQkJICAgIHVuc2lnbmVkIGludCBkb25lX29mZnNldCk7CiBleHRlcm4gdm9pZCBmYWxjb25fZHJhaW5fdHhfZmlmbyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKQEAgLTg2LDYgKzg2LDcgQEAKIGV4dGVybiBpbnQgZmFsY29uX3Byb2JlX25pYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiBpbnQgZmFsY29uX3Byb2JlX3Jlc291cmNlcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiBpbnQgZmFsY29uX2luaXRfbmljKHN0cnVjdCBlZnhfbmljICplZngpOworZXh0ZXJuIGludCBmYWxjb25fZmx1c2hfcXVldWVzKHN0cnVjdCBlZnhfbmljICplZngpOwogZXh0ZXJuIGludCBmYWxjb25fcmVzZXRfaHcoc3RydWN0IGVmeF9uaWMgKmVmeCwgZW51bSByZXNldF90eXBlIG1ldGhvZCk7CiBleHRlcm4gdm9pZCBmYWxjb25fcmVtb3ZlX3Jlc291cmNlcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIGV4dGVybiB2b2lkIGZhbGNvbl9yZW1vdmVfbmljKHN0cnVjdCBlZnhfbmljICplZngpOwpAQCAtOTMsNiArOTQsMTIgQEAKIGV4dGVybiB2b2lkIGZhbGNvbl9zZXRfbXVsdGljYXN0X2hhc2goc3RydWN0IGVmeF9uaWMgKmVmeCk7CiBleHRlcm4gaW50IGZhbGNvbl9yZXNldF94YXVpKHN0cnVjdCBlZnhfbmljICplZngpOwogCisvKiBUZXN0cyAqLworc3RydWN0IGZhbGNvbl9udmNvbmZpZzsKK2V4dGVybiBpbnQgZmFsY29uX3JlYWRfbnZyYW0oc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCSAgICAgc3RydWN0IGZhbGNvbl9udmNvbmZpZyAqbnZjb25maWcpOworZXh0ZXJuIGludCBmYWxjb25fdGVzdF9yZWdpc3RlcnMoc3RydWN0IGVmeF9uaWMgKmVmeCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZhbGNvbiBNQUMgc3RhdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25faHdkZWZzLmggYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uX2h3ZGVmcy5oCmluZGV4IDZkMDAzMTEuLjVkNTg0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25faHdkZWZzLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbl9od2RlZnMuaApAQCAtOTIsNiArOTIsMTcgQEAKIC8qIFNQSSBob3N0IGRhdGEgcmVnaXN0ZXIgKi8KICNkZWZpbmUgRUVfU1BJX0hEQVRBX1JFR19LRVIgMHgwMTIwCiAKKy8qIFNQSS9WUEQgY29uZmlnIHJlZ2lzdGVyICovCisjZGVmaW5lIEVFX1ZQRF9DRkdfUkVHX0tFUiAweDAxNDAKKyNkZWZpbmUgRUVfVlBEX0VOX0xCTiAwCisjZGVmaW5lIEVFX1ZQRF9FTl9XSURUSCAxCisjZGVmaW5lIEVFX1ZQRF9FTl9BRDlfTU9ERV9MQk4gMQorI2RlZmluZSBFRV9WUERfRU5fQUQ5X01PREVfV0lEVEggMQorI2RlZmluZSBFRV9FRV9DTE9DS19ESVZfTEJOIDExMgorI2RlZmluZSBFRV9FRV9DTE9DS19ESVZfV0lEVEggNworI2RlZmluZSBFRV9TRl9DTE9DS19ESVZfTEJOIDEyMAorI2RlZmluZSBFRV9TRl9DTE9DS19ESVZfV0lEVEggNworCiAvKiBQQ0lFIENPUkUgQUNDRVNTIFJFRyAqLwogI2RlZmluZSBQQ0lFX0NPUkVfQUREUl9QQ0lFX0RFVklDRV9DVFJMX1NUQVQgMHg2OAogI2RlZmluZSBQQ0lFX0NPUkVfQUREUl9QQ0lFX0xJTktfQ1RSTF9TVEFUIDB4NzAKQEAgLTEwNiw3ICsxMTcsNiBAQAogI2RlZmluZSBTRl9QUlNUX1dJRFRIIDEKICNkZWZpbmUgRUVfUFJTVF9MQk4gOAogI2RlZmluZSBFRV9QUlNUX1dJRFRIIDEKLS8qIFNlZSBwaWNfbW9kZV90IGZvciBkZWNvZGluZyBvZiB0aGlzIGZpZWxkICovCiAvKiBUaGVzZSBiaXQgZGVmaW5pdGlvbnMgYXJlIGV4dHJhcG9sYXRlZCBmcm9tIHRoZSBsaXN0IG9mIG51bWVyaWNhbAogICogdmFsdWVzIGZvciBTVFJBUF9QSU5TLgogICovCkBAIC0xMTUsNiArMTI1LDkgQEAKICNkZWZpbmUgU1RSQVBfUENJRV9MQk4gMAogI2RlZmluZSBTVFJBUF9QQ0lFX1dJRFRIIDEKIAorI2RlZmluZSBCT09URURfVVNJTkdfTlZERVZJQ0VfTEJOIDMKKyNkZWZpbmUgQk9PVEVEX1VTSU5HX05WREVWSUNFX1dJRFRIIDEKKwogLyogR1BJTyBjb250cm9sIHJlZ2lzdGVyICovCiAjZGVmaW5lIEdQSU9fQ1RMX1JFR19LRVIgMHgwMjEwCiAjZGVmaW5lIEdQSU9fT1VUUFVUU19MQk4gICAoMTYpCkBAIC00NzksMTggKzQ5Miw4IEBACiAjZGVmaW5lIE1BQ19NQ0FTVF9IQVNIX1JFRzBfS0VSIDB4Y2EwCiAjZGVmaW5lIE1BQ19NQ0FTVF9IQVNIX1JFRzFfS0VSIDB4Y2IwCiAKLS8qIEdNQUMgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEZBTENPTl9HTUFDX1JFR0JBTksgMHhlMDAKLSNkZWZpbmUgRkFMQ09OX0dNQUNfUkVHQkFOS19TSVpFIDB4MjAwCi0jZGVmaW5lIEZBTENPTl9HTUFDX1JFR19TSVpFIDB4MTAKLQotLyogWE1BQyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRkFMQ09OX1hNQUNfUkVHQkFOSyAweDEyMDAKLSNkZWZpbmUgRkFMQ09OX1hNQUNfUkVHQkFOS19TSVpFIDB4MjAwCi0jZGVmaW5lIEZBTENPTl9YTUFDX1JFR19TSVpFIDB4MTAKLQogLyogWEdNQUMgYWRkcmVzcyByZWdpc3RlciBsb3cgKi8KLSNkZWZpbmUgWE1fQURSX0xPX1JFR19NQUMgMHgwMAorI2RlZmluZSBYTV9BRFJfTE9fUkVHIDB4MTIwMAogI2RlZmluZSBYTV9BRFJfM19MQk4gMjQKICNkZWZpbmUgWE1fQURSXzNfV0lEVEggOAogI2RlZmluZSBYTV9BRFJfMl9MQk4gMTYKQEAgLTUwMSwxNCArNTA0LDE0IEBACiAjZGVmaW5lIFhNX0FEUl8wX1dJRFRIIDgKIAogLyogWEdNQUMgYWRkcmVzcyByZWdpc3RlciBoaWdoICovCi0jZGVmaW5lIFhNX0FEUl9ISV9SRUdfTUFDIDB4MDEKKyNkZWZpbmUgWE1fQURSX0hJX1JFRyAweDEyMTAKICNkZWZpbmUgWE1fQURSXzVfTEJOIDgKICNkZWZpbmUgWE1fQURSXzVfV0lEVEggOAogI2RlZmluZSBYTV9BRFJfNF9MQk4gMAogI2RlZmluZSBYTV9BRFJfNF9XSURUSCA4CiAKIC8qIFhHTUFDIGdsb2JhbCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFhNX0dMQl9DRkdfUkVHX01BQyAweDAyCisjZGVmaW5lIFhNX0dMQl9DRkdfUkVHIDB4MTIyMAogI2RlZmluZSBYTV9SWF9TVEFUX0VOX0xCTiAxMQogI2RlZmluZSBYTV9SWF9TVEFUX0VOX1dJRFRIIDEKICNkZWZpbmUgWE1fVFhfU1RBVF9FTl9MQk4gMTAKQEAgLTUyMSw3ICs1MjQsNyBAQAogI2RlZmluZSBYTV9DT1JFX1JTVF9XSURUSCAxCiAKIC8qIFhHTUFDIHRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWE1fVFhfQ0ZHX1JFR19NQUMgMHgwMworI2RlZmluZSBYTV9UWF9DRkdfUkVHIDB4MTIzMAogI2RlZmluZSBYTV9JUEdfTEJOIDE2CiAjZGVmaW5lIFhNX0lQR19XSURUSCA0CiAjZGVmaW5lIFhNX0ZDTlRMX0xCTiAxMApAQCAtNTM2LDcgKzUzOSw3IEBACiAjZGVmaW5lIFhNX1RYRU5fV0lEVEggMQogCiAvKiBYR01BQyByZWNlaXZlIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWE1fUlhfQ0ZHX1JFR19NQUMgMHgwNAorI2RlZmluZSBYTV9SWF9DRkdfUkVHIDB4MTI0MAogI2RlZmluZSBYTV9QQVNTX0NSQ19FUlJfTEJOIDI1CiAjZGVmaW5lIFhNX1BBU1NfQ1JDX0VSUl9XSURUSCAxCiAjZGVmaW5lIFhNX0FDUFRfQUxMX01DQVNUX0xCTiAxMQpAQCAtNTQ5LDcgKzU1Miw3IEBACiAjZGVmaW5lIFhNX1JYRU5fV0lEVEggMQogCiAvKiBYR01BQyBtYW5hZ2VtZW50IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCi0jZGVmaW5lIFhNX01HVF9JTlRfTVNLX1JFR19NQUNfQjAgMHg1CisjZGVmaW5lIFhNX01HVF9JTlRfTVNLX1JFR19CMCAweDEyNTAKICNkZWZpbmUgWE1fTVNLX1BSTUJMRV9FUlJfTEJOIDIKICNkZWZpbmUgWE1fTVNLX1BSTUJMRV9FUlJfV0lEVEggMQogI2RlZmluZSBYTV9NU0tfUk1URkxUX0xCTiAxCkBAIC01NTgsMjkgKzU2MSwyOSBAQAogI2RlZmluZSBYTV9NU0tfTENMRkxUX1dJRFRIIDEKIAogLyogWEdNQUMgZmxvdyBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFhNX0ZDX1JFR19NQUMgMHg3CisjZGVmaW5lIFhNX0ZDX1JFRyAweDEyNzAKICNkZWZpbmUgWE1fUEFVU0VfVElNRV9MQk4gMTYKICNkZWZpbmUgWE1fUEFVU0VfVElNRV9XSURUSCAxNgogI2RlZmluZSBYTV9ESVNfRkNOVExfTEJOIDAKICNkZWZpbmUgWE1fRElTX0ZDTlRMX1dJRFRIIDEKIAogLyogWEdNQUMgcGF1c2UgdGltZSBjb3VudCByZWdpc3RlciAqLwotI2RlZmluZSBYTV9QQVVTRV9USU1FX1JFR19NQUMgMHg5CisjZGVmaW5lIFhNX1BBVVNFX1RJTUVfUkVHIDB4MTI5MAogCiAvKiBYR01BQyB0cmFuc21pdCBwYXJhbWV0ZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgWE1fVFhfUEFSQU1fUkVHX01BQyAweDBkCisjZGVmaW5lIFhNX1RYX1BBUkFNX1JFRyAweDAxMmQwCiAjZGVmaW5lIFhNX1RYX0pVTUJPX01PREVfTEJOIDMxCiAjZGVmaW5lIFhNX1RYX0pVTUJPX01PREVfV0lEVEggMQogI2RlZmluZSBYTV9NQVhfVFhfRlJNX1NJWkVfTEJOIDE2CiAjZGVmaW5lIFhNX01BWF9UWF9GUk1fU0laRV9XSURUSCAxNAogCiAvKiBYR01BQyByZWNlaXZlIHBhcmFtZXRlciByZWdpc3RlciAqLwotI2RlZmluZSBYTV9SWF9QQVJBTV9SRUdfTUFDIDB4MGUKKyNkZWZpbmUgWE1fUlhfUEFSQU1fUkVHIDB4MTJlMAogI2RlZmluZSBYTV9NQVhfUlhfRlJNX1NJWkVfTEJOIDAKICNkZWZpbmUgWE1fTUFYX1JYX0ZSTV9TSVpFX1dJRFRIIDE0CiAKIC8qIFhHTUFDIG1hbmFnZW1lbnQgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBYTV9NR1RfSU5UX1JFR19NQUNfQjAgMHgwZgorI2RlZmluZSBYTV9NR1RfSU5UX1JFR19CMCAweDEyZjAKICNkZWZpbmUgWE1fUFJNQkxFX0VSUiAyCiAjZGVmaW5lIFhNX1BSTUJMRV9XSURUSCAxCiAjZGVmaW5lIFhNX1JNVEZMVF9MQk4gMQpAQCAtNTg5LDcgKzU5Miw3IEBACiAjZGVmaW5lIFhNX0xDTEZMVF9XSURUSCAxCiAKIC8qIFhHWFMvWEFVSSBwb3dlcmRvd24vcmVzZXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgWFhfUFdSX1JTVF9SRUdfTUFDIDB4MTAKKyNkZWZpbmUgWFhfUFdSX1JTVF9SRUcgMHgxMzAwCiAKICNkZWZpbmUgWFhfUFdSRE5EX0VOX0xCTiAxNQogI2RlZmluZSBYWF9QV1JETkRfRU5fV0lEVEggMQpAQCAtNjE5LDcgKzYyMiw3IEBACiAjZGVmaW5lIFhYX1JTVF9YWF9FTl9XSURUSCAxCiAKIC8qIFhHWFMvWEFVSSBwb3dlcmRvd24vcmVzZXQgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBYWF9TRF9DVExfUkVHX01BQyAweDExCisjZGVmaW5lIFhYX1NEX0NUTF9SRUcgMHgxMzEwCiAjZGVmaW5lIFhYX0hJRFJWRF9MQk4gMTUKICNkZWZpbmUgWFhfSElEUlZEX1dJRFRIIDEKICNkZWZpbmUgWFhfTE9EUlZEX0xCTiAxNApAQCAtNjQ1LDcgKzY0OCw3IEBACiAjZGVmaW5lIFhYX0xQQktBX0xCTiAwCiAjZGVmaW5lIFhYX0xQQktBX1dJRFRIIDEKIAotI2RlZmluZSBYWF9UWERSVl9DVExfUkVHX01BQyAweDEyCisjZGVmaW5lIFhYX1RYRFJWX0NUTF9SRUcgMHgxMzIwCiAjZGVmaW5lIFhYX0RFUURfTEJOIDI4CiAjZGVmaW5lIFhYX0RFUURfV0lEVEggNAogI2RlZmluZSBYWF9ERVFDX0xCTiAyNApAQCAtNjY0LDcgKzY2Nyw3IEBACiAjZGVmaW5lIFhYX0RUWEFfV0lEVEggNAogCiAvKiBYQVVJIFhHWFMgY29yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgWFhfQ09SRV9TVEFUX1JFR19NQUMgMHgxNgorI2RlZmluZSBYWF9DT1JFX1NUQVRfUkVHIDB4MTM2MAogI2RlZmluZSBYWF9GT1JDRV9TSUdfTEJOIDI0CiAjZGVmaW5lIFhYX0ZPUkNFX1NJR19XSURUSCA4CiAjZGVmaW5lIFhYX0ZPUkNFX1NJR19ERUNPREVfRk9SQ0VEIDB4ZmYKQEAgLTExMjcsNyArMTEzMCwyOCBAQAogCV9fbGUxNiBib2FyZF9yZXZpc2lvbjsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTlZDT05GSUdfQkFTRSAweDMwMAorLyogQm9hcmQgY29uZmlndXJhdGlvbiB2MyBleHRyYSBpbmZvcm1hdGlvbiAqLworc3RydWN0IGZhbGNvbl9udmNvbmZpZ19ib2FyZF92MyB7CisJX19sZTMyIHNwaV9kZXZpY2VfdHlwZVsyXTsKK30gX19wYWNrZWQ7CisKKy8qIEJpdCBudW1iZXJzIGZvciBzcGlfZGV2aWNlX3R5cGUgKi8KKyNkZWZpbmUgU1BJX0RFVl9UWVBFX1NJWkVfTEJOIDAKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX1NJWkVfV0lEVEggNQorI2RlZmluZSBTUElfREVWX1RZUEVfQUREUl9MRU5fTEJOIDYKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX0FERFJfTEVOX1dJRFRIIDIKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX0VSQVNFX0NNRF9MQk4gOAorI2RlZmluZSBTUElfREVWX1RZUEVfRVJBU0VfQ01EX1dJRFRIIDgKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX0VSQVNFX1NJWkVfTEJOIDE2CisjZGVmaW5lIFNQSV9ERVZfVFlQRV9FUkFTRV9TSVpFX1dJRFRIIDUKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX0JMT0NLX1NJWkVfTEJOIDI0CisjZGVmaW5lIFNQSV9ERVZfVFlQRV9CTE9DS19TSVpFX1dJRFRIIDUKKyNkZWZpbmUgU1BJX0RFVl9UWVBFX0ZJRUxEKHR5cGUsIGZpZWxkKQkJCQkJXAorCSgoKHR5cGUpID4+IEVGWF9MT1dfQklUKGZpZWxkKSkgJiBFRlhfTUFTSzMyKEVGWF9XSURUSChmaWVsZCkpKQorCisjZGVmaW5lIE5WQ09ORklHX09GRlNFVCAweDMwMAorI2RlZmluZSBOVkNPTkZJR19FTkQgMHg0MDAKKwogI2RlZmluZSBOVkNPTkZJR19CT0FSRF9NQUdJQ19OVU0gMHhGQTFDCiBzdHJ1Y3QgZmFsY29uX252Y29uZmlnIHsKIAllZnhfb3dvcmRfdCBlZV92cGRfY2ZnX3JlZzsJCQkvKiAweDMwMCAqLwpAQCAtMTE0NCw2ICsxMTY4LDggQEAKIAlfX2xlMTYgYm9hcmRfc3RydWN0X3ZlcjsKIAlfX2xlMTYgYm9hcmRfY2hlY2tzdW07CiAJc3RydWN0IGZhbGNvbl9udmNvbmZpZ19ib2FyZF92MiBib2FyZF92MjsKKwllZnhfb3dvcmRfdCBlZV9iYXNlX3BhZ2VfcmVnOwkJCS8qIDB4M0IwICovCisJc3RydWN0IGZhbGNvbl9udmNvbmZpZ19ib2FyZF92MyBib2FyZF92MzsKIH0gX19wYWNrZWQ7CiAKICNlbmRpZiAvKiBFRlhfRkFMQ09OX0hXREVGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uX2lvLmggYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uX2lvLmgKaW5kZXggNjY3MGNkZi4uYzE2ZGEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbl9pby5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb25faW8uaApAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgIm5ldF9kcml2ZXIuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbl94bWFjLmMgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uX3htYWMuYwppbmRleCA1NWMwZDk3Li5kNDAxMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uX3htYWMuYworKysgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uX3htYWMuYwpAQCAtMjMsNTYgKzIzLDI0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIE1BQyByZWdpc3RlciBhY2Nlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE9mZnNldCBvZiBhbiBYTUFDIHJlZ2lzdGVyIHdpdGhpbiBGYWxjb24gKi8KLSNkZWZpbmUgRkFMQ09OX1hNQUNfUkVHKG1hY19yZWcpCQkJCQlcCi0JKEZBTENPTl9YTUFDX1JFR0JBTksgKyAoKG1hY19yZWcpICogRkFMQ09OX1hNQUNfUkVHX1NJWkUpKQotCi12b2lkIGZhbGNvbl94bWFjX3dyaXRlbChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJIGVmeF9kd29yZF90ICp2YWx1ZSwgdW5zaWduZWQgaW50IG1hY19yZWcpCi17Ci0JZWZ4X293b3JkX3QgdGVtcDsKLQotCUVGWF9QT1BVTEFURV9PV09SRF8xKHRlbXAsIE1BQ19EQVRBLCBFRlhfRFdPUkRfRklFTEQoKnZhbHVlLCBNQUNfREFUQSkpOwotCWZhbGNvbl93cml0ZShlZngsICZ0ZW1wLCBGQUxDT05fWE1BQ19SRUcobWFjX3JlZykpOwotfQotCi12b2lkIGZhbGNvbl94bWFjX3JlYWRsKHN0cnVjdCBlZnhfbmljICplZngsCi0JCSAgICAgICBlZnhfZHdvcmRfdCAqdmFsdWUsIHVuc2lnbmVkIGludCBtYWNfcmVnKQotewotCWVmeF9vd29yZF90IHRlbXA7Ci0KLQlmYWxjb25fcmVhZChlZngsICZ0ZW1wLCBGQUxDT05fWE1BQ19SRUcobWFjX3JlZykpOwotCUVGWF9QT1BVTEFURV9EV09SRF8xKCp2YWx1ZSwgTUFDX0RBVEEsIEVGWF9PV09SRF9GSUVMRCh0ZW1wLCBNQUNfREFUQSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBNQUMgb3BlcmF0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBmYWxjb25fcmVzZXRfeG1hYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCWVmeF9kd29yZF90IHJlZzsKKwllZnhfb3dvcmRfdCByZWc7CiAJaW50IGNvdW50OwogCi0JRUZYX1BPUFVMQVRFX0RXT1JEXzEocmVnLCBYTV9DT1JFX1JTVCwgMSk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWE1fR0xCX0NGR19SRUdfTUFDKTsKKwlFRlhfUE9QVUxBVEVfT1dPUkRfMShyZWcsIFhNX0NPUkVfUlNULCAxKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9HTEJfQ0ZHX1JFRyk7CiAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwMDsgY291bnQrKykgewkvKiB3YWl0IHVwdG8gMTAwbXMgKi8KLQkJZmFsY29uX3htYWNfcmVhZGwoZWZ4LCAmcmVnLCBYTV9HTEJfQ0ZHX1JFR19NQUMpOwotCQlpZiAoRUZYX0RXT1JEX0ZJRUxEKHJlZywgWE1fQ09SRV9SU1QpID09IDApCisJCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgWE1fR0xCX0NGR19SRUcpOworCQlpZiAoRUZYX09XT1JEX0ZJRUxEKHJlZywgWE1fQ09SRV9SU1QpID09IDApCiAJCQlyZXR1cm4gMDsKIAkJdWRlbGF5KDEwKTsKIAl9CiAKLQkvKiBUaGlzIG9mdGVuIGZhaWxzIHdoZW4gRFNQIGlzIGRpc2FibGVkLCBpZ25vcmUgaXQgKi8KLQlpZiAoc2ZlNDAwMV9waHlfZmxhc2hfY2ZnICE9IDApCi0JCXJldHVybiAwOwotCiAJRUZYX0VSUihlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgWE1BQyBjb3JlIHJlc2V0XG4iKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KQEAgLTgwLDI1ICs0OCwyNSBAQAogLyogQ29uZmlndXJlIHRoZSBYQVVJIGRyaXZlciB0aGF0IGlzIGFuIG91dHB1dCBmcm9tIEZhbGNvbiAqLwogc3RhdGljIHZvaWQgZmFsY29uX3NldHVwX3hhdWkoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQllZnhfZHdvcmRfdCBzZGN0bCwgdHhkcnY7CisJZWZ4X293b3JkX3Qgc2RjdGwsIHR4ZHJ2OwogCiAJLyogTW92ZSB0aGUgWEFVSSBpbnRvIGxvdyBwb3dlciwgdW5sZXNzIHRoZXJlIGlzIG5vIFBIWSwgaW4KIAkgKiB3aGljaCBjYXNlIHRoZSBYQVVJIHdpbGwgaGF2ZSB0byBkcml2ZSBhIGNhYmxlLiAqLwogCWlmIChlZngtPnBoeV90eXBlID09IFBIWV9UWVBFX05PTkUpCiAJCXJldHVybjsKIAotCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnNkY3RsLCBYWF9TRF9DVExfUkVHX01BQyk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChzZGN0bCwgWFhfSElEUlZELCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQoc2RjdGwsIFhYX0xPRFJWRCwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHNkY3RsLCBYWF9ISURSVkMsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChzZGN0bCwgWFhfTE9EUlZDLCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQoc2RjdGwsIFhYX0hJRFJWQiwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHNkY3RsLCBYWF9MT0RSVkIsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChzZGN0bCwgWFhfSElEUlZBLCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQoc2RjdGwsIFhYX0xPRFJWQSwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmc2RjdGwsIFhYX1NEX0NUTF9SRUdfTUFDKTsKKwlmYWxjb25fcmVhZChlZngsICZzZGN0bCwgWFhfU0RfQ1RMX1JFRyk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChzZGN0bCwgWFhfSElEUlZELCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOworCUVGWF9TRVRfT1dPUkRfRklFTEQoc2RjdGwsIFhYX0xPRFJWRCwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHNkY3RsLCBYWF9ISURSVkMsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChzZGN0bCwgWFhfTE9EUlZDLCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOworCUVGWF9TRVRfT1dPUkRfRklFTEQoc2RjdGwsIFhYX0hJRFJWQiwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHNkY3RsLCBYWF9MT0RSVkIsIFhYX1NEX0NUTF9EUlZfREVGQVVMVCk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChzZGN0bCwgWFhfSElEUlZBLCBYWF9TRF9DVExfRFJWX0RFRkFVTFQpOworCUVGWF9TRVRfT1dPUkRfRklFTEQoc2RjdGwsIFhYX0xPRFJWQSwgWFhfU0RfQ1RMX0RSVl9ERUZBVUxUKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmc2RjdGwsIFhYX1NEX0NUTF9SRUcpOwogCi0JRUZYX1BPUFVMQVRFX0RXT1JEXzgodHhkcnYsCisJRUZYX1BPUFVMQVRFX09XT1JEXzgodHhkcnYsCiAJCQkgICAgIFhYX0RFUUQsIFhYX1RYRFJWX0RFUV9ERUZBVUxULAogCQkJICAgICBYWF9ERVFDLCBYWF9UWERSVl9ERVFfREVGQVVMVCwKIAkJCSAgICAgWFhfREVRQiwgWFhfVFhEUlZfREVRX0RFRkFVTFQsCkBAIC0xMDcsOTMgKzc1LDIxIEBACiAJCQkgICAgIFhYX0RUWEMsIFhYX1RYRFJWX0RUWF9ERUZBVUxULAogCQkJICAgICBYWF9EVFhCLCBYWF9UWERSVl9EVFhfREVGQVVMVCwKIAkJCSAgICAgWFhfRFRYQSwgWFhfVFhEUlZfRFRYX0RFRkFVTFQpOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZ0eGRydiwgWFhfVFhEUlZfQ1RMX1JFR19NQUMpOworCWZhbGNvbl93cml0ZShlZngsICZ0eGRydiwgWFhfVFhEUlZfQ1RMX1JFRyk7CiB9CiAKLXN0YXRpYyB2b2lkIGZhbGNvbl9ob2xkX3hhdWlfaW5fcnN0KHN0cnVjdCBlZnhfbmljICplZngpCitpbnQgZmFsY29uX3Jlc2V0X3hhdWkoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQllZnhfZHdvcmRfdCByZWc7Ci0KLQlFRlhfWkVST19EV09SRChyZWcpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9QV1JETkFfRU4sIDEpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9QV1JETkJfRU4sIDEpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9QV1JETkNfRU4sIDEpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9QV1JETkRfRU4sIDEpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9SU1RQTExBQl9FTiwgMSk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1JTVFBMTENEX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVRBX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVRCX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVRDX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVREX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUlNUWEdYU1JYX0VOLCAxKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUlNUWEdYU1RYX0VOLCAxKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCXVkZWxheSgxMCk7Ci19Ci0KLXN0YXRpYyBpbnQgX2ZhbGNvbl9yZXNldF94YXVpX2Eoc3RydWN0IGVmeF9uaWMgKmVmeCkKLXsKLQllZnhfZHdvcmRfdCByZWc7Ci0KLQlmYWxjb25faG9sZF94YXVpX2luX3JzdChlZngpOwotCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWFhfUFdSX1JTVF9SRUdfTUFDKTsKLQotCS8qIEZvbGxvdyB0aGUgUkFNQlVTIFhBVUkgZGF0YSByZXNldCBzZXF1ZW5jaW5nCi0JICogQ2hhbm5lbHMgQSBhbmQgQiBmaXJzdDogcG93ZXIgZG93biwgcmVzZXQgUExMLCByZXNldCwgY2xlYXIKLQkgKi8KLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUFdSRE5BX0VOLCAwKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUFdSRE5CX0VOLCAwKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCXVkZWxheSgxMCk7Ci0KLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUlNUUExMQUJfRU4sIDApOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhYX1BXUl9SU1RfUkVHX01BQyk7Ci0JdWRlbGF5KDEwKTsKLQotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9SRVNFVEFfRU4sIDApOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9SRVNFVEJfRU4sIDApOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhYX1BXUl9SU1RfUkVHX01BQyk7Ci0JdWRlbGF5KDEwKTsKLQotCS8qIENoYW5uZWxzIEMgYW5kIEQ6IHBvd2VyIGRvd24sIHJlc2V0IFBMTCwgcmVzZXQsIGNsZWFyICovCi0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1BXUkROQ19FTiwgMCk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1BXUkRORF9FTiwgMCk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWFhfUFdSX1JTVF9SRUdfTUFDKTsKLQl1ZGVsYXkoMTApOwotCi0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1JTVFBMTENEX0VOLCAwKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCXVkZWxheSgxMCk7Ci0KLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVRDX0VOLCAwKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUkVTRVREX0VOLCAwKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCXVkZWxheSgxMCk7Ci0KLQkvKiBTZXR1cCBYQVVJICovCi0JZmFsY29uX3NldHVwX3hhdWkoZWZ4KTsKLQl1ZGVsYXkoMTApOwotCi0JLyogVGFrZSBYR1hTIG91dCBvZiByZXNldCAqLwotCUVGWF9aRVJPX0RXT1JEKHJlZyk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWFhfUFdSX1JTVF9SRUdfTUFDKTsKLQl1ZGVsYXkoMTApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX2ZhbGNvbl9yZXNldF94YXVpX2Ioc3RydWN0IGVmeF9uaWMgKmVmeCkKLXsKLQllZnhfZHdvcmRfdCByZWc7CisJZWZ4X293b3JkX3QgcmVnOwogCWludCBjb3VudDsKIAogCUVGWF9QT1BVTEFURV9EV09SRF8xKHJlZywgWFhfUlNUX1hYX0VOLCAxKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOworCWZhbGNvbl93cml0ZShlZngsICZyZWcsIFhYX1BXUl9SU1RfUkVHKTsKIAogCS8qIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgbGluayB0byBlc3RhYmxpc2ggKi8KIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwOyBjb3VudCsrKSB7IC8qIHdhaXQgdXB0byAxMG1zICovCi0JCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWFhfUFdSX1JTVF9SRUdfTUFDKTsKLQkJaWYgKEVGWF9EV09SRF9GSUVMRChyZWcsIFhYX1JTVF9YWF9FTikgPT0gMCkgeworCQlmYWxjb25fcmVhZChlZngsICZyZWcsIFhYX1BXUl9SU1RfUkVHKTsKKwkJaWYgKEVGWF9PV09SRF9GSUVMRChyZWcsIFhYX1JTVF9YWF9FTikgPT0gMCkgewogCQkJZmFsY29uX3NldHVwX3hhdWkoZWZ4KTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMDMsNTUgKzk5LDQxIEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLWludCBmYWxjb25fcmVzZXRfeGF1aShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQorc3RhdGljIGJvb2wgZmFsY29uX3hnbWlpX3N0YXR1cyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCWludCByYzsKLQotCWlmIChFRlhfV09SS0FST1VORF85Mzg4KGVmeCkpIHsKLQkJZmFsY29uX2hvbGRfeGF1aV9pbl9yc3QoZWZ4KTsKLQkJZWZ4LT5waHlfb3AtPnJlc2V0X3hhdWkoZWZ4KTsKLQkJcmMgPSBfZmFsY29uX3Jlc2V0X3hhdWlfYShlZngpOwotCX0gZWxzZSB7Ci0JCXJjID0gX2ZhbGNvbl9yZXNldF94YXVpX2IoZWZ4KTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbGNvbl94Z21paV9zdGF0dXMoc3RydWN0IGVmeF9uaWMgKmVmeCkKLXsKLQllZnhfZHdvcmRfdCByZWc7CisJZWZ4X293b3JkX3QgcmVnOwogCiAJaWYgKGZhbGNvbl9yZXYoZWZ4KSA8IEZBTENPTl9SRVZfQjApCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAogCS8qIFRoZSBJU1IgbGF0Y2hlcywgc28gY2xlYXIgaXQgYW5kIHJlLXJlYWQgKi8KLQlmYWxjb25feG1hY19yZWFkbChlZngsICZyZWcsIFhNX01HVF9JTlRfUkVHX01BQ19CMCk7Ci0JZmFsY29uX3htYWNfcmVhZGwoZWZ4LCAmcmVnLCBYTV9NR1RfSU5UX1JFR19NQUNfQjApOworCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgWE1fTUdUX0lOVF9SRUdfQjApOworCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgWE1fTUdUX0lOVF9SRUdfQjApOwogCi0JaWYgKEVGWF9EV09SRF9GSUVMRChyZWcsIFhNX0xDTEZMVCkgfHwKLQkgICAgRUZYX0RXT1JEX0ZJRUxEKHJlZywgWE1fUk1URkxUKSkgeworCWlmIChFRlhfT1dPUkRfRklFTEQocmVnLCBYTV9MQ0xGTFQpIHx8CisJICAgIEVGWF9PV09SRF9GSUVMRChyZWcsIFhNX1JNVEZMVCkpIHsKIAkJRUZYX0lORk8oZWZ4LCAiTUdUX0lOVDogIkVGWF9EV09SRF9GTVQiXG4iLCBFRlhfRFdPUkRfVkFMKHJlZykpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBmYWxjb25fbWFza19zdGF0dXNfaW50cihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBpbnQgZW5hYmxlKQorc3RhdGljIHZvaWQgZmFsY29uX21hc2tfc3RhdHVzX2ludHIoc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBlbmFibGUpCiB7Ci0JZWZ4X2R3b3JkX3QgcmVnOworCWVmeF9vd29yZF90IHJlZzsKIAogCWlmICgoZmFsY29uX3JldihlZngpIDwgRkFMQ09OX1JFVl9CMCkgfHwgTE9PUEJBQ0tfSU5URVJOQUwoZWZ4KSkKIAkJcmV0dXJuOwogCiAJLyogRmx1c2ggdGhlIElTUiAqLwogCWlmIChlbmFibGUpCi0JCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWE1fTUdUX0lOVF9SRUdfTUFDX0IwKTsKKwkJZmFsY29uX3JlYWQoZWZ4LCAmcmVnLCBYTV9NR1RfSU5UX1JFR19CMCk7CiAKLQlFRlhfUE9QVUxBVEVfRFdPUkRfMihyZWcsCisJRUZYX1BPUFVMQVRFX09XT1JEXzIocmVnLAogCQkJICAgICBYTV9NU0tfUk1URkxULCAhZW5hYmxlLAogCQkJICAgICBYTV9NU0tfTENMRkxULCAhZW5hYmxlKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYTV9NR1RfSU5UX01TS19SRUdfTUFDX0IwKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9NR1RfSU5UX01TS19SRUdfQjApOwogfQogCiBpbnQgZmFsY29uX2luaXRfeG1hYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQpAQCAtMjc0LDcgKzE1Niw3IEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWwyOwogCi0JZmFsY29uX21hc2tfc3RhdHVzX2ludHIoZWZ4LCAxKTsKKwlmYWxjb25fbWFza19zdGF0dXNfaW50cihlZngsIHRydWUpOwogCXJldHVybiAwOwogCiAgZmFpbDI6CkBAIC0yODMsMzQgKzE2NSwzNCBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGZhbGNvbl94YXVpX2xpbmtfb2soc3RydWN0IGVmeF9uaWMgKmVmeCkKK2Jvb2wgZmFsY29uX3hhdWlfbGlua19vayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCWVmeF9kd29yZF90IHJlZzsKLQlpbnQgYWxpZ25fZG9uZSwgc3luY19zdGF0dXMsIGxpbmtfb2sgPSAwOworCWVmeF9vd29yZF90IHJlZzsKKwlib29sIGFsaWduX2RvbmUsIGxpbmtfb2sgPSBmYWxzZTsKKwlpbnQgc3luY19zdGF0dXM7CiAKIAlpZiAoTE9PUEJBQ0tfSU5URVJOQUwoZWZ4KSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCiAJLyogUmVhZCBsaW5rIHN0YXR1cyAqLwotCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWFhfQ09SRV9TVEFUX1JFR19NQUMpOworCWZhbGNvbl9yZWFkKGVmeCwgJnJlZywgWFhfQ09SRV9TVEFUX1JFRyk7CiAKLQlhbGlnbl9kb25lID0gRUZYX0RXT1JEX0ZJRUxEKHJlZywgWFhfQUxJR05fRE9ORSk7Ci0Jc3luY19zdGF0dXMgPSBFRlhfRFdPUkRfRklFTEQocmVnLCBYWF9TWU5DX1NUQVQpOworCWFsaWduX2RvbmUgPSBFRlhfT1dPUkRfRklFTEQocmVnLCBYWF9BTElHTl9ET05FKTsKKwlzeW5jX3N0YXR1cyA9IEVGWF9PV09SRF9GSUVMRChyZWcsIFhYX1NZTkNfU1RBVCk7CiAJaWYgKGFsaWduX2RvbmUgJiYgKHN5bmNfc3RhdHVzID09IFhYX1NZTkNfU1RBVF9ERUNPREVfU1lOQ0VEKSkKLQkJbGlua19vayA9IDE7CisJCWxpbmtfb2sgPSB0cnVlOwogCiAJLyogQ2xlYXIgbGluayBzdGF0dXMgcmVhZHkgZm9yIG5leHQgcmVhZCAqLwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9DT01NQV9ERVQsIFhYX0NPTU1BX0RFVF9SRVNFVCk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX0NIQVJFUlIsIFhYX0NIQVJFUlJfUkVTRVQpOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9ESVNQRVJSLCBYWF9ESVNQRVJSX1JFU0VUKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9DT1JFX1NUQVRfUkVHX01BQyk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIFhYX0NPTU1BX0RFVCwgWFhfQ09NTUFfREVUX1JFU0VUKTsKKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHJlZywgWFhfQ0hBUkVSUiwgWFhfQ0hBUkVSUl9SRVNFVCk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIFhYX0RJU1BFUlIsIFhYX0RJU1BFUlJfUkVTRVQpOworCWZhbGNvbl93cml0ZShlZngsICZyZWcsIFhYX0NPUkVfU1RBVF9SRUcpOwogCiAJLyogSWYgdGhlIGxpbmsgaXMgdXAsIHRoZW4gY2hlY2sgdGhlIHBoeSBzaWRlIG9mIHRoZSB4YXVpIGxpbmsKIAkgKiAoZXJyb3IgY29uZGl0aW9ucyBmcm9tIHRoZSB3aXJlIHNpZGUgcHJvcG9hZ2F0ZSBiYWNrIHRocm91Z2gKIAkgKiB0aGUgcGh5IHRvIHRoZSB4YXVpIHNpZGUpLiAqLwogCWlmIChlZngtPmxpbmtfdXAgJiYgbGlua19vaykgewotCQlpbnQgaGFzX3BoeXhzID0gZWZ4LT5waHlfb3AtPm1tZHMgJiAoMSA8PCBNRElPX01NRF9QSFlYUyk7Ci0JCWlmIChoYXNfcGh5eHMpCisJCWlmIChlZngtPnBoeV9vcC0+bW1kcyAmICgxIDw8IE1ESU9fTU1EX1BIWVhTKSkKIAkJCWxpbmtfb2sgPSBtZGlvX2NsYXVzZTQ1X3BoeXhneHNfbGFuZV9zeW5jKGVmeCk7CiAJfQogCkBAIC0zMjUsMTUgKzIwNywxNSBAQAogc3RhdGljIHZvaWQgZmFsY29uX3JlY29uZmlndXJlX3htYWNfY29yZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCXVuc2lnbmVkIGludCBtYXhfZnJhbWVfbGVuOwotCWVmeF9kd29yZF90IHJlZzsKLQlpbnQgcnhfZmMgPSAoZWZ4LT5mbG93X2NvbnRyb2wgJiBFRlhfRkNfUlgpID8gMSA6IDA7CisJZWZ4X293b3JkX3QgcmVnOworCWJvb2wgcnhfZmMgPSAhIShlZngtPmZsb3dfY29udHJvbCAmIEVGWF9GQ19SWCk7CiAKIAkvKiBDb25maWd1cmUgTUFDICAtIGN1dC10aHJ1IG1vZGUgaXMgaGFyZCB3aXJlZCBvbiAqLwogCUVGWF9QT1BVTEFURV9EV09SRF8zKHJlZywKIAkJCSAgICAgWE1fUlhfSlVNQk9fTU9ERSwgMSwKIAkJCSAgICAgWE1fVFhfU1RBVF9FTiwgMSwKIAkJCSAgICAgWE1fUlhfU1RBVF9FTiwgMSk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWE1fR0xCX0NGR19SRUdfTUFDKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9HTEJfQ0ZHX1JFRyk7CiAKIAkvKiBDb25maWd1cmUgVFggKi8KIAlFRlhfUE9QVUxBVEVfRFdPUkRfNihyZWcsCkBAIC0zNDMsNyArMjI1LDcgQEAKIAkJCSAgICAgWE1fVFhDUkMsIDEsCiAJCQkgICAgIFhNX0ZDTlRMLCAxLAogCQkJICAgICBYTV9JUEcsIDB4Myk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWE1fVFhfQ0ZHX1JFR19NQUMpOworCWZhbGNvbl93cml0ZShlZngsICZyZWcsIFhNX1RYX0NGR19SRUcpOwogCiAJLyogQ29uZmlndXJlIFJYICovCiAJRUZYX1BPUFVMQVRFX0RXT1JEXzUocmVnLApAQCAtMzUyLDIxICsyMzQsMjEgQEAKIAkJCSAgICAgWE1fQUNQVF9BTExfTUNBU1QsIDEsCiAJCQkgICAgIFhNX0FDUFRfQUxMX1VDQVNULCBlZngtPnByb21pc2N1b3VzLAogCQkJICAgICBYTV9QQVNTX0NSQ19FUlIsIDEpOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhNX1JYX0NGR19SRUdfTUFDKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9SWF9DRkdfUkVHKTsKIAogCS8qIFNldCBmcmFtZSBsZW5ndGggKi8KIAltYXhfZnJhbWVfbGVuID0gRUZYX01BWF9GUkFNRV9MRU4oZWZ4LT5uZXRfZGV2LT5tdHUpOwogCUVGWF9QT1BVTEFURV9EV09SRF8xKHJlZywgWE1fTUFYX1JYX0ZSTV9TSVpFLCBtYXhfZnJhbWVfbGVuKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYTV9SWF9QQVJBTV9SRUdfTUFDKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9SWF9QQVJBTV9SRUcpOwogCUVGWF9QT1BVTEFURV9EV09SRF8yKHJlZywKIAkJCSAgICAgWE1fTUFYX1RYX0ZSTV9TSVpFLCBtYXhfZnJhbWVfbGVuLAogCQkJICAgICBYTV9UWF9KVU1CT19NT0RFLCAxKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYTV9UWF9QQVJBTV9SRUdfTUFDKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9UWF9QQVJBTV9SRUcpOwogCiAJRUZYX1BPUFVMQVRFX0RXT1JEXzIocmVnLAogCQkJICAgICBYTV9QQVVTRV9USU1FLCAweGZmZmUsIC8qIE1BWCBQQVVTRSBUSU1FICovCi0JCQkgICAgIFhNX0RJU19GQ05UTCwgcnhfZmMgPyAwIDogMSk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWE1fRkNfUkVHX01BQyk7CisJCQkgICAgIFhNX0RJU19GQ05UTCwgIXJ4X2ZjKTsKKwlmYWxjb25fd3JpdGUoZWZ4LCAmcmVnLCBYTV9GQ19SRUcpOwogCiAJLyogU2V0IE1BQyBhZGRyZXNzICovCiAJRUZYX1BPUFVMQVRFX0RXT1JEXzQocmVnLApAQCAtMzc0LDgzICsyNTYsNzUgQEAKIAkJCSAgICAgWE1fQURSXzEsIGVmeC0+bmV0X2Rldi0+ZGV2X2FkZHJbMV0sCiAJCQkgICAgIFhNX0FEUl8yLCBlZngtPm5ldF9kZXYtPmRldl9hZGRyWzJdLAogCQkJICAgICBYTV9BRFJfMywgZWZ4LT5uZXRfZGV2LT5kZXZfYWRkclszXSk7Ci0JZmFsY29uX3htYWNfd3JpdGVsKGVmeCwgJnJlZywgWE1fQURSX0xPX1JFR19NQUMpOworCWZhbGNvbl93cml0ZShlZngsICZyZWcsIFhNX0FEUl9MT19SRUcpOwogCUVGWF9QT1BVTEFURV9EV09SRF8yKHJlZywKIAkJCSAgICAgWE1fQURSXzQsIGVmeC0+bmV0X2Rldi0+ZGV2X2FkZHJbNF0sCiAJCQkgICAgIFhNX0FEUl81LCBlZngtPm5ldF9kZXYtPmRldl9hZGRyWzVdKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYTV9BRFJfSElfUkVHX01BQyk7CisJZmFsY29uX3dyaXRlKGVmeCwgJnJlZywgWE1fQURSX0hJX1JFRyk7CiB9CiAKIHN0YXRpYyB2b2lkIGZhbGNvbl9yZWNvbmZpZ3VyZV94Z3hzX2NvcmUoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQllZnhfZHdvcmRfdCByZWc7Ci0JaW50IHhneHNfbG9vcGJhY2sgPSAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX1hHWFMpID8gMSA6IDA7Ci0JaW50IHhhdWlfbG9vcGJhY2sgPSAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX1hBVUkpID8gMSA6IDA7Ci0JaW50IHhnbWlpX2xvb3BiYWNrID0KLQkJKGVmeC0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR01JSSkgPyAxIDogMDsKKwllZnhfb3dvcmRfdCByZWc7CisJYm9vbCB4Z3hzX2xvb3BiYWNrID0gKGVmeC0+bG9vcGJhY2tfbW9kZSA9PSBMT09QQkFDS19YR1hTKTsKKwlib29sIHhhdWlfbG9vcGJhY2sgPSAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX1hBVUkpOworCWJvb2wgeGdtaWlfbG9vcGJhY2sgPSAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX1hHTUlJKTsKIAogCS8qIFhHWFMgYmxvY2sgaXMgZmxha3kgYW5kIHdpbGwgbmVlZCB0byBiZSByZXNldCBpZiBtb3ZpbmcKIAkgKiBpbnRvIG91ciBvdXQgb2YgWEdNSUksIFhHWFMgb3IgWEFVSSBsb29wYmFja3MuICovCiAJaWYgKEVGWF9XT1JLQVJPVU5EXzUxNDcoZWZ4KSkgewotCQlpbnQgb2xkX3hnbWlpX2xvb3BiYWNrLCBvbGRfeGd4c19sb29wYmFjaywgb2xkX3hhdWlfbG9vcGJhY2s7Ci0JCWludCByZXNldF94Z3hzOworCQlib29sIG9sZF94Z21paV9sb29wYmFjaywgb2xkX3hneHNfbG9vcGJhY2ssIG9sZF94YXVpX2xvb3BiYWNrOworCQlib29sIHJlc2V0X3hneHM7CiAKLQkJZmFsY29uX3htYWNfcmVhZGwoZWZ4LCAmcmVnLCBYWF9DT1JFX1NUQVRfUkVHX01BQyk7Ci0JCW9sZF94Z3hzX2xvb3BiYWNrID0gRUZYX0RXT1JEX0ZJRUxEKHJlZywgWFhfWEdYU19MQl9FTik7Ci0JCW9sZF94Z21paV9sb29wYmFjayA9IEVGWF9EV09SRF9GSUVMRChyZWcsIFhYX1hHTUlJX0xCX0VOKTsKKwkJZmFsY29uX3JlYWQoZWZ4LCAmcmVnLCBYWF9DT1JFX1NUQVRfUkVHKTsKKwkJb2xkX3hneHNfbG9vcGJhY2sgPSBFRlhfT1dPUkRfRklFTEQocmVnLCBYWF9YR1hTX0xCX0VOKTsKKwkJb2xkX3hnbWlpX2xvb3BiYWNrID0gRUZYX09XT1JEX0ZJRUxEKHJlZywgWFhfWEdNSUlfTEJfRU4pOwogCi0JCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWFhfU0RfQ1RMX1JFR19NQUMpOwotCQlvbGRfeGF1aV9sb29wYmFjayA9IEVGWF9EV09SRF9GSUVMRChyZWcsIFhYX0xQQktBKTsKKwkJZmFsY29uX3JlYWQoZWZ4LCAmcmVnLCBYWF9TRF9DVExfUkVHKTsKKwkJb2xkX3hhdWlfbG9vcGJhY2sgPSBFRlhfT1dPUkRfRklFTEQocmVnLCBYWF9MUEJLQSk7CiAKIAkJLyogVGhlIFBIWSBkcml2ZXIgbWF5IGhhdmUgdHVybmVkIFhBVUkgb2ZmICovCiAJCXJlc2V0X3hneHMgPSAoKHhneHNfbG9vcGJhY2sgIT0gb2xkX3hneHNfbG9vcGJhY2spIHx8CiAJCQkgICAgICAoeGF1aV9sb29wYmFjayAhPSBvbGRfeGF1aV9sb29wYmFjaykgfHwKIAkJCSAgICAgICh4Z21paV9sb29wYmFjayAhPSBvbGRfeGdtaWlfbG9vcGJhY2spKTsKLQkJaWYgKHJlc2V0X3hneHMpIHsKLQkJCWZhbGNvbl94bWFjX3JlYWRsKGVmeCwgJnJlZywgWFhfUFdSX1JTVF9SRUdfTUFDKTsKLQkJCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9SU1RYR1hTVFhfRU4sIDEpOwotCQkJRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1JTVFhHWFNSWF9FTiwgMSk7Ci0JCQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCQkJdWRlbGF5KDEpOwotCQkJRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1JTVFhHWFNUWF9FTiwgMCk7Ci0JCQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfUlNUWEdYU1JYX0VOLCAwKTsKLQkJCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhYX1BXUl9SU1RfUkVHX01BQyk7Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KKworCQlpZiAocmVzZXRfeGd4cykKKwkJCWZhbGNvbl9yZXNldF94YXVpKGVmeCk7CiAJfQogCi0JZmFsY29uX3htYWNfcmVhZGwoZWZ4LCAmcmVnLCBYWF9DT1JFX1NUQVRfUkVHX01BQyk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX0ZPUkNFX1NJRywKKwlmYWxjb25fcmVhZChlZngsICZyZWcsIFhYX0NPUkVfU1RBVF9SRUcpOworCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBYWF9GT1JDRV9TSUcsCiAJCQkgICAgKHhneHNfbG9vcGJhY2sgfHwgeGF1aV9sb29wYmFjaykgPwogCQkJICAgIFhYX0ZPUkNFX1NJR19ERUNPREVfRk9SQ0VEIDogMCk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX1hHWFNfTEJfRU4sIHhneHNfbG9vcGJhY2spOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9YR01JSV9MQl9FTiwgeGdtaWlfbG9vcGJhY2spOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhYX0NPUkVfU1RBVF9SRUdfTUFDKTsKKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHJlZywgWFhfWEdYU19MQl9FTiwgeGd4c19sb29wYmFjayk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIFhYX1hHTUlJX0xCX0VOLCB4Z21paV9sb29wYmFjayk7CisJZmFsY29uX3dyaXRlKGVmeCwgJnJlZywgWFhfQ09SRV9TVEFUX1JFRyk7CiAKLQlmYWxjb25feG1hY19yZWFkbChlZngsICZyZWcsIFhYX1NEX0NUTF9SRUdfTUFDKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfTFBCS0QsIHhhdWlfbG9vcGJhY2spOwotCUVGWF9TRVRfRFdPUkRfRklFTEQocmVnLCBYWF9MUEJLQywgeGF1aV9sb29wYmFjayk7Ci0JRUZYX1NFVF9EV09SRF9GSUVMRChyZWcsIFhYX0xQQktCLCB4YXVpX2xvb3BiYWNrKTsKLQlFRlhfU0VUX0RXT1JEX0ZJRUxEKHJlZywgWFhfTFBCS0EsIHhhdWlfbG9vcGJhY2spOwotCWZhbGNvbl94bWFjX3dyaXRlbChlZngsICZyZWcsIFhYX1NEX0NUTF9SRUdfTUFDKTsKKwlmYWxjb25fcmVhZChlZngsICZyZWcsIFhYX1NEX0NUTF9SRUcpOworCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBYWF9MUEJLRCwgeGF1aV9sb29wYmFjayk7CisJRUZYX1NFVF9PV09SRF9GSUVMRChyZWcsIFhYX0xQQktDLCB4YXVpX2xvb3BiYWNrKTsKKwlFRlhfU0VUX09XT1JEX0ZJRUxEKHJlZywgWFhfTFBCS0IsIHhhdWlfbG9vcGJhY2spOworCUVGWF9TRVRfT1dPUkRfRklFTEQocmVnLCBYWF9MUEJLQSwgeGF1aV9sb29wYmFjayk7CisJZmFsY29uX3dyaXRlKGVmeCwgJnJlZywgWFhfU0RfQ1RMX1JFRyk7CiB9CiAKIAogLyogVHJ5IGFuZCBicmluZyB0aGUgRmFsY29uIHNpZGUgb2YgdGhlIEZhbGNvbi1QaHkgWEFVSSBsaW5rIGZhaWxzCiAgKiB0byBjb21lIGJhY2sgdXAuIEJhc2ggaXQgdW50aWwgaXQgY29tZXMgYmFjayB1cCAqLwotc3RhdGljIGludCBmYWxjb25fY2hlY2tfeGF1aV9saW5rX3VwKHN0cnVjdCBlZnhfbmljICplZngpCitzdGF0aWMgYm9vbCBmYWxjb25fY2hlY2tfeGF1aV9saW5rX3VwKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJaW50IG1heF90cmllcywgdHJpZXM7CiAJdHJpZXMgPSBFRlhfV09SS0FST1VORF81MTQ3KGVmeCkgPyA1IDogMTsKIAltYXhfdHJpZXMgPSB0cmllczsKIAogCWlmICgoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX05FVFdPUkspIHx8Ci0JICAgIChlZngtPnBoeV90eXBlID09IFBIWV9UWVBFX05PTkUpKQotCQlyZXR1cm4gMDsKKwkgICAgKGVmeC0+cGh5X3R5cGUgPT0gUEhZX1RZUEVfTk9ORSkgfHwKKwkgICAgZWZ4X3BoeV9tb2RlX2Rpc2FibGVkKGVmeC0+cGh5X21vZGUpKQorCQlyZXR1cm4gZmFsc2U7CiAKIAl3aGlsZSAodHJpZXMpIHsKIAkJaWYgKGZhbGNvbl94YXVpX2xpbmtfb2soZWZ4KSkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAKIAkJRUZYX0xPRyhlZngsICIlcyBDbG9iYmVyaW5nIFhBVUkgKCVkIHRyaWVzIGxlZnQpLlxuIiwKIAkJCV9fZnVuY19fLCB0cmllcyk7CkBAIC00NjEsMTggKzMzNSwyMiBAQAogCiAJRUZYX0xPRyhlZngsICJGYWlsZWQgdG8gYnJpbmcgWEFVSSBsaW5rIGJhY2sgdXAgaW4gJWQgdHJpZXMhXG4iLAogCQltYXhfdHJpZXMpOwotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBmYWxjb25fcmVjb25maWd1cmVfeG1hYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCWludCB4YXVpX2xpbmtfb2s7CisJYm9vbCB4YXVpX2xpbmtfb2s7CiAKLQlmYWxjb25fbWFza19zdGF0dXNfaW50cihlZngsIDApOworCWZhbGNvbl9tYXNrX3N0YXR1c19pbnRyKGVmeCwgZmFsc2UpOwogCiAJZmFsY29uX2RlY29uZmlndXJlX21hY193cmFwcGVyKGVmeCk7CiAKLQllZngtPnR4X2Rpc2FibGVkID0gTE9PUEJBQ0tfSU5URVJOQUwoZWZ4KTsKKwkvKiBSZWNvbmZpZ3VyZSB0aGUgUEhZLCBkaXNhYmxpbmcgdHJhbnNtaXQgaW4gbWFjIGxldmVsIGxvb3BiYWNrLiAqLworCWlmIChMT09QQkFDS19JTlRFUk5BTChlZngpKQorCQllZngtPnBoeV9tb2RlIHw9IFBIWV9NT0RFX1RYX0RJU0FCTEVEOworCWVsc2UKKwkJZWZ4LT5waHlfbW9kZSAmPSB+UEhZX01PREVfVFhfRElTQUJMRUQ7CiAJZWZ4LT5waHlfb3AtPnJlY29uZmlndXJlKGVmeCk7CiAKIAlmYWxjb25fcmVjb25maWd1cmVfeGd4c19jb3JlKGVmeCk7CkBAIC00ODQsNyArMzYyLDcgQEAKIAl4YXVpX2xpbmtfb2sgPSBmYWxjb25fY2hlY2tfeGF1aV9saW5rX3VwKGVmeCk7CiAKIAlpZiAoeGF1aV9saW5rX29rICYmIGVmeC0+bGlua191cCkKLQkJZmFsY29uX21hc2tfc3RhdHVzX2ludHIoZWZ4LCAxKTsKKwkJZmFsY29uX21hc2tfc3RhdHVzX2ludHIoZWZ4LCB0cnVlKTsKIH0KIAogdm9pZCBmYWxjb25fZmluaV94bWFjKHN0cnVjdCBlZnhfbmljICplZngpCkBAIC01NTQsMjEgKzQzMiwyMyBAQAogCiAJLyogVXBkYXRlIGRlcml2ZWQgc3RhdGlzdGljcyAqLwogCW1hY19zdGF0cy0+dHhfZ29vZF9ieXRlcyA9Ci0JCShtYWNfc3RhdHMtPnR4X2J5dGVzIC0gbWFjX3N0YXRzLT50eF9iYWRfYnl0ZXMpOworCQkobWFjX3N0YXRzLT50eF9ieXRlcyAtIG1hY19zdGF0cy0+dHhfYmFkX2J5dGVzIC0KKwkJIG1hY19zdGF0cy0+dHhfY29udHJvbCAqIDY0KTsKIAltYWNfc3RhdHMtPnJ4X2JhZF9ieXRlcyA9Ci0JCShtYWNfc3RhdHMtPnJ4X2J5dGVzIC0gbWFjX3N0YXRzLT5yeF9nb29kX2J5dGVzKTsKKwkJKG1hY19zdGF0cy0+cnhfYnl0ZXMgLSBtYWNfc3RhdHMtPnJ4X2dvb2RfYnl0ZXMgLQorCQkgbWFjX3N0YXRzLT5yeF9jb250cm9sICogNjQpOwogfQogCiBpbnQgZmFsY29uX2NoZWNrX3htYWMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQl1bnNpZ25lZCB4YXVpX2xpbmtfb2s7CisJYm9vbCB4YXVpX2xpbmtfb2s7CiAJaW50IHJjOwogCiAJaWYgKChlZngtPmxvb3BiYWNrX21vZGUgPT0gTE9PUEJBQ0tfTkVUV09SSykgfHwKLQkgICAgKGVmeC0+cGh5X3R5cGUgPT0gUEhZX1RZUEVfTk9ORSkpCisJICAgIGVmeF9waHlfbW9kZV9kaXNhYmxlZChlZngtPnBoeV9tb2RlKSkKIAkJcmV0dXJuIDA7CiAKLQlmYWxjb25fbWFza19zdGF0dXNfaW50cihlZngsIDApOworCWZhbGNvbl9tYXNrX3N0YXR1c19pbnRyKGVmeCwgZmFsc2UpOwogCXhhdWlfbGlua19vayA9IGZhbGNvbl94YXVpX2xpbmtfb2soZWZ4KTsKIAogCWlmIChFRlhfV09SS0FST1VORF81MTQ3KGVmeCkgJiYgIXhhdWlfbGlua19vaykKQEAgLTU3OSw3ICs0NTksNyBAQAogCiAJLyogVW5tYXNrIGludGVycnVwdCBpZiBldmVyeXRoaW5nIHdhcyAoYW5kIHN0aWxsIGlzKSBvayAqLwogCWlmICh4YXVpX2xpbmtfb2sgJiYgZWZ4LT5saW5rX3VwKQotCQlmYWxjb25fbWFza19zdGF0dXNfaW50cihlZngsIDEpOworCQlmYWxjb25fbWFza19zdGF0dXNfaW50cihlZngsIHRydWUpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNjIwLDcgKzUwMCw3IEBACiAKIGludCBmYWxjb25feG1hY19zZXRfcGF1c2Uoc3RydWN0IGVmeF9uaWMgKmVmeCwgZW51bSBlZnhfZmNfdHlwZSBmbG93X2NvbnRyb2wpCiB7Ci0JaW50IHJlc2V0OworCWJvb2wgcmVzZXQ7CiAKIAlpZiAoZmxvd19jb250cm9sICYgRUZYX0ZDX0FVVE8pIHsKIAkJRUZYX0xPRyhlZngsICIxMEcgZG9lcyBub3Qgc3VwcG9ydCBmbG93IGNvbnRyb2wgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL21hYy5oIGIvZHJpdmVycy9uZXQvc2ZjL21hYy5oCmluZGV4IGVkZDA3ZDQuLmEzMTU3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9tYWMuaAorKysgYi9kcml2ZXJzL25ldC9zZmMvbWFjLmgKQEAgLTEzLDEwICsxMyw2IEBACiAKICNpbmNsdWRlICJuZXRfZHJpdmVyLmgiCiAKLWV4dGVybiB2b2lkIGZhbGNvbl94bWFjX3dyaXRlbChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJICAgICAgIGVmeF9kd29yZF90ICp2YWx1ZSwgdW5zaWduZWQgaW50IG1hY19yZWcpOwotZXh0ZXJuIHZvaWQgZmFsY29uX3htYWNfcmVhZGwoc3RydWN0IGVmeF9uaWMgKmVmeCwKLQkJCSAgICAgIGVmeF9kd29yZF90ICp2YWx1ZSwgdW5zaWduZWQgaW50IG1hY19yZWcpOwogZXh0ZXJuIGludCBmYWxjb25faW5pdF94bWFjKHN0cnVjdCBlZnhfbmljICplZngpOwogZXh0ZXJuIHZvaWQgZmFsY29uX3JlY29uZmlndXJlX3htYWMoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiBleHRlcm4gdm9pZCBmYWxjb25fdXBkYXRlX3N0YXRzX3htYWMoc3RydWN0IGVmeF9uaWMgKmVmeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbWRpb18xMGcuYyBiL2RyaXZlcnMvbmV0L3NmYy9tZGlvXzEwZy5jCmluZGV4IGM0ZjU0MGUuLjAwM2U0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9tZGlvXzEwZy5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9tZGlvXzEwZy5jCkBAIC0xNTksMjAgKzE1OSwyMSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbWRpb19jbGF1c2U0NV9saW5rc19vayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgbW1kX21hc2spCitib29sIG1kaW9fY2xhdXNlNDVfbGlua3Nfb2soc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IG1tZF9tYXNrKQogewogCWludCBwaHlfaWQgPSBlZngtPm1paS5waHlfaWQ7CiAJaW50IHN0YXR1czsKLQlpbnQgb2sgPSAxOworCWJvb2wgb2sgPSB0cnVlOwogCWludCBtbWQgPSAwOwotCWludCBnb29kOwogCiAJLyogSWYgdGhlIHBvcnQgaXMgaW4gbG9vcGJhY2ssIHRoZW4gd2Ugc2hvdWxkIG9ubHkgY29uc2lkZXIgYSBzdWJzZXQKIAkgKiBvZiBtbWQncyAqLwogCWlmIChMT09QQkFDS19JTlRFUk5BTChlZngpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJZWxzZSBpZiAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX05FVFdPUkspCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CisJZWxzZSBpZiAoZWZ4X3BoeV9tb2RlX2Rpc2FibGVkKGVmeC0+cGh5X21vZGUpKQorCQlyZXR1cm4gZmFsc2U7CiAJZWxzZSBpZiAoZWZ4LT5sb29wYmFja19tb2RlID09IExPT1BCQUNLX1BIWVhTKQogCQltbWRfbWFzayAmPSB+KE1ESU9fTU1EUkVHX0RFVlMwX1BIWVhTIHwKIAkJCSAgICAgIE1ESU9fTU1EUkVHX0RFVlMwX1BDUyB8CkBAIC0xOTIsOCArMTkzLDcgQEAKIAkJCXN0YXR1cyA9IG1kaW9fY2xhdXNlNDVfcmVhZChlZngsIHBoeV9pZCwKIAkJCQkJCSAgICBtbWQsIE1ESU9fTU1EUkVHX1NUQVQxKTsKIAotCQkJZ29vZCA9IHN0YXR1cyAmICgxIDw8IE1ESU9fTU1EUkVHX1NUQVQxX0xJTktfTEJOKTsKLQkJCW9rID0gb2sgJiYgZ29vZDsKKwkJCW9rID0gb2sgJiYgKHN0YXR1cyAmICgxIDw8IE1ESU9fTU1EUkVHX1NUQVQxX0xJTktfTEJOKSk7CiAJCX0KIAkJbW1kX21hc2sgPSAobW1kX21hc2sgPj4gMSk7CiAJCW1tZCsrOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAKIAljdHJsMSA9IGN0cmwyID0gbWRpb19jbGF1c2U0NV9yZWFkKGVmeCwgcGh5X2lkLCBNRElPX01NRF9QTUFQTUQsCiAJCQkJCSAgIE1ESU9fTU1EUkVHX1RYRElTKTsKLQlpZiAoZWZ4LT50eF9kaXNhYmxlZCkKKwlpZiAoZWZ4LT5waHlfbW9kZSAmIFBIWV9NT0RFX1RYX0RJU0FCTEVEKQogCQljdHJsMiB8PSAoMSA8PCBNRElPX01NRFJFR19UWERJU19HTE9CQUxfTEJOKTsKIAllbHNlCiAJCWN0cmwxICY9IH4oMSA8PCBNRElPX01NRFJFR19UWERJU19HTE9CQUxfTEJOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9tZGlvXzEwZy5oIGIvZHJpdmVycy9uZXQvc2ZjL21kaW9fMTBnLmgKaW5kZXggY2I5OWYzZi4uMTljNDJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL21kaW9fMTBnLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL21kaW9fMTBnLmgKQEAgLTE5OSwxOCArMTk5LDE5IEBACiAJcmV0dXJuIChpZF9oaSA8PCAxNikgfCAoaWRfbG93KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWRpb19jbGF1c2U0NV9waHl4Z3hzX2xhbmVfc3luYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQorc3RhdGljIGlubGluZSBib29sIG1kaW9fY2xhdXNlNDVfcGh5eGd4c19sYW5lX3N5bmMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKLQlpbnQgaSwgc3luYywgbGFuZV9zdGF0dXM7CisJaW50IGksIGxhbmVfc3RhdHVzOworCWJvb2wgc3luYzsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpCiAJCWxhbmVfc3RhdHVzID0gbWRpb19jbGF1c2U0NV9yZWFkKGVmeCwgZWZ4LT5taWkucGh5X2lkLAogCQkJCQkJIE1ESU9fTU1EX1BIWVhTLAogCQkJCQkJIE1ESU9fUEhZWFNfTEFORV9TVEFURSk7CiAKLQlzeW5jID0gKGxhbmVfc3RhdHVzICYgKDEgPDwgTURJT19QSFlYU19MQU5FX0FMSUdORURfTEJOKSkgIT0gMDsKKwlzeW5jID0gISEobGFuZV9zdGF0dXMgJiAoMSA8PCBNRElPX1BIWVhTX0xBTkVfQUxJR05FRF9MQk4pKTsKIAlpZiAoIXN5bmMpCi0JCUVGWF9JTkZPKGVmeCwgIlhHWFMgbGFuZSBzdGF0dXM6ICV4XG4iLCBsYW5lX3N0YXR1cyk7CisJCUVGWF9MT0coZWZ4LCAiWEdYUyBsYW5lIHN0YXR1czogJXhcbiIsIGxhbmVfc3RhdHVzKTsKIAlyZXR1cm4gc3luYzsKIH0KIApAQCAtMjMwLDggKzIzMSw4IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBtbWRfbWFzaywgdW5zaWduZWQgaW50IGZhdGFsX21hc2spOwogCiAvKiBDaGVjayB0aGUgbGluayBzdGF0dXMgb2Ygc3BlY2lmaWVkIG1tZHMgaW4gYml0IG1hc2sgKi8KLWV4dGVybiBpbnQgbWRpb19jbGF1c2U0NV9saW5rc19vayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJCSAgdW5zaWduZWQgaW50IG1tZF9tYXNrKTsKK2V4dGVybiBib29sIG1kaW9fY2xhdXNlNDVfbGlua3Nfb2soc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbW1kX21hc2spOwogCiAvKiBHZW5lcmljIHRyYW5zbWl0IGRpc2FibGUgc3VwcG9ydCB0aG91Z2ggUE1BUE1EICovCiBleHRlcm4gdm9pZCBtZGlvX2NsYXVzZTQ1X3RyYW5zbWl0X2Rpc2FibGUoc3RydWN0IGVmeF9uaWMgKmVmeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvbmV0X2RyaXZlci5oIGIvZHJpdmVycy9uZXQvc2ZjL25ldF9kcml2ZXIuaAppbmRleCAyMTljNzRhLi5jZGIxMWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvbmV0X2RyaXZlci5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9uZXRfZHJpdmVyLmgKQEAgLTg4LDkgKzg4LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgRUZYX01BWF9DSEFOTkVMUyAzMgotI2RlZmluZSBFRlhfTUFYX1RYX1FVRVVFUyAxCiAjZGVmaW5lIEVGWF9NQVhfUlhfUVVFVUVTIEVGWF9NQVhfQ0hBTk5FTFMKIAorI2RlZmluZSBFRlhfVFhfUVVFVUVfT0ZGTE9BRF9DU1VNCTAKKyNkZWZpbmUgRUZYX1RYX1FVRVVFX05PX0NTVU0JCTEKKyNkZWZpbmUgRUZYX1RYX1FVRVVFX0NPVU5UCQkyCisKIC8qKgogICogc3RydWN0IGVmeF9zcGVjaWFsX2J1ZmZlciAtIEFuIEVmeCBzcGVjaWFsIGJ1ZmZlcgogICogQGFkZHI6IENQVSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgpAQCAtMTI3LDcgKzEzMCw2IEBACiAgKglUaGlzIGZpZWxkIGlzIHplcm8gd2hlbiB0aGUgcXVldWUgc2xvdCBpcyBlbXB0eS4KICAqIEBjb250aW51YXRpb246IFRydWUgaWYgdGhpcyBmcmFnbWVudCBpcyBub3QgdGhlIGVuZCBvZiBhIHBhY2tldC4KICAqIEB1bm1hcF9zaW5nbGU6IFRydWUgaWYgcGNpX3VubWFwX3NpbmdsZSBzaG91bGQgYmUgdXNlZC4KLSAqIEB1bm1hcF9hZGRyOiBETUEgYWRkcmVzcyB0byB1bm1hcAogICogQHVubWFwX2xlbjogTGVuZ3RoIG9mIHRoaXMgZnJhZ21lbnQgdG8gdW5tYXAKICAqLwogc3RydWN0IGVmeF90eF9idWZmZXIgewpAQCAtMTM1LDkgKzEzNyw4IEBACiAJc3RydWN0IGVmeF90c29faGVhZGVyICp0c29oOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJdW5zaWduZWQgc2hvcnQgbGVuOwotCXVuc2lnbmVkIGNoYXIgY29udGludWF0aW9uOwotCXVuc2lnbmVkIGNoYXIgdW5tYXBfc2luZ2xlOwotCWRtYV9hZGRyX3QgdW5tYXBfYWRkcjsKKwlib29sIGNvbnRpbnVhdGlvbjsKKwlib29sIHVubWFwX3NpbmdsZTsKIAl1bnNpZ25lZCBzaG9ydCB1bm1hcF9sZW47CiB9OwogCkBAIC0xNTYsMTMgKzE1NywxMyBAQAogICoKICAqIEBlZng6IFRoZSBhc3NvY2lhdGVkIEVmeCBOSUMKICAqIEBxdWV1ZTogRE1BIHF1ZXVlIG51bWJlcgotICogQHVzZWQ6IFF1ZXVlIGlzIHVzZWQgYnkgbmV0IGRyaXZlcgogICogQGNoYW5uZWw6IFRoZSBhc3NvY2lhdGVkIGNoYW5uZWwKICAqIEBidWZmZXI6IFRoZSBzb2Z0d2FyZSBidWZmZXIgcmluZwogICogQHR4ZDogVGhlIGhhcmR3YXJlIGRlc2NyaXB0b3IgcmluZworICogQGZsdXNoZWQ6IFVzZWQgd2hlbiBoYW5kbGluZyBxdWV1ZSBmbHVzaGluZwogICogQHJlYWRfY291bnQ6IEN1cnJlbnQgcmVhZCBwb2ludGVyLgogICoJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIGJvdGggcmluZ3MuCi0gKiBAc3RvcHBlZDogU3RvcHBlZCBmbGFnLgorICogQHN0b3BwZWQ6IFN0b3BwZWQgY291bnQuCiAgKglTZXQgaWYgdGhpcyBUWCBxdWV1ZSBpcyBjdXJyZW50bHkgc3RvcHBpbmcgaXRzIHBvcnQuCiAgKiBAaW5zZXJ0X2NvdW50OiBDdXJyZW50IGluc2VydCBwb2ludGVyCiAgKglUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUKQEAgLTE4OCwxMSArMTg5LDExIEBACiAJLyogTWVtYmVycyB3aGljaCBkb24ndCBjaGFuZ2Ugb24gdGhlIGZhc3QgcGF0aCAqLwogCXN0cnVjdCBlZnhfbmljICplZnggX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlpbnQgcXVldWU7Ci0JaW50IHVzZWQ7CiAJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsOwogCXN0cnVjdCBlZnhfbmljICpuaWM7CiAJc3RydWN0IGVmeF90eF9idWZmZXIgKmJ1ZmZlcjsKIAlzdHJ1Y3QgZWZ4X3NwZWNpYWxfYnVmZmVyIHR4ZDsKKwlib29sIGZsdXNoZWQ7CiAKIAkvKiBNZW1iZXJzIHVzZWQgbWFpbmx5IG9uIHRoZSBjb21wbGV0aW9uIHBhdGggKi8KIAl1bnNpZ25lZCBpbnQgcmVhZF9jb3VudCBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwpAQCAtMjMyLDcgKzIzMyw2IEBACiAgKiBzdHJ1Y3QgZWZ4X3J4X3F1ZXVlIC0gQW4gRWZ4IFJYIHF1ZXVlCiAgKiBAZWZ4OiBUaGUgYXNzb2NpYXRlZCBFZnggTklDCiAgKiBAcXVldWU6IERNQSBxdWV1ZSBudW1iZXIKLSAqIEB1c2VkOiBRdWV1ZSBpcyB1c2VkIGJ5IG5ldCBkcml2ZXIKICAqIEBjaGFubmVsOiBUaGUgYXNzb2NpYXRlZCBjaGFubmVsCiAgKiBAYnVmZmVyOiBUaGUgc29mdHdhcmUgYnVmZmVyIHJpbmcKICAqIEByeGQ6IFRoZSBoYXJkd2FyZSBkZXNjcmlwdG9yIHJpbmcKQEAgLTI2MiwxMSArMjYyLDExIEBACiAgKgl0aGUgcmVtYWluaW5nIHNwYWNlIGluIHRoZSBhbGxvY2F0aW9uLgogICogQGJ1Zl9kbWFfYWRkcjogUGFnZSdzIERNQSBhZGRyZXNzLgogICogQGJ1Zl9kYXRhOiBQYWdlJ3MgaG9zdCBhZGRyZXNzLgorICogQGZsdXNoZWQ6IFVzZSB3aGVuIGhhbmRsaW5nIHF1ZXVlIGZsdXNoaW5nCiAgKi8KIHN0cnVjdCBlZnhfcnhfcXVldWUgewogCXN0cnVjdCBlZnhfbmljICplZng7CiAJaW50IHF1ZXVlOwotCWludCB1c2VkOwogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKIAlzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqYnVmZmVyOwogCXN0cnVjdCBlZnhfc3BlY2lhbF9idWZmZXIgcnhkOwpAQCAtMjg4LDYgKzI4OCw3IEBACiAJc3RydWN0IHBhZ2UgKmJ1Zl9wYWdlOwogCWRtYV9hZGRyX3QgYnVmX2RtYV9hZGRyOwogCWNoYXIgKmJ1Zl9kYXRhOworCWJvb2wgZmx1c2hlZDsKIH07CiAKIC8qKgpAQCAtMzI1LDEyICszMjYsMTAgQEAKICAqIHF1ZXVlLgogICoKICAqIEBlZng6IEFzc29jaWF0ZWQgRWZ4IE5JQwotICogQGV2cW51bTogRXZlbnQgcXVldWUgbnVtYmVyCiAgKiBAY2hhbm5lbDogQ2hhbm5lbCBpbnN0YW5jZSBudW1iZXIKICAqIEB1c2VkX2ZsYWdzOiBDaGFubmVsIGlzIHVzZWQgYnkgbmV0IGRyaXZlcgogICogQGVuYWJsZWQ6IENoYW5uZWwgZW5hYmxlZCBpbmRpY2F0b3IKICAqIEBpcnE6IElSUSBudW1iZXIgKE1TSSBhbmQgTVNJLVggb25seSkKLSAqIEBoYXNfaW50ZXJydXB0OiBDaGFubmVsIGhhcyBhbiBpbnRlcnJ1cHQKICAqIEBpcnFfbW9kZXJhdGlvbjogSVJRIG1vZGVyYXRpb24gdmFsdWUgKGluIHVzKQogICogQG5hcGlfZGV2OiBOZXQgZGV2aWNlIHVzZWQgd2l0aCBOQVBJCiAgKiBAbmFwaV9zdHI6IE5BUEkgY29udHJvbCBzdHJ1Y3R1cmUKQEAgLTM1NywxNyArMzU2LDE0IEBACiAgKi8KIHN0cnVjdCBlZnhfY2hhbm5lbCB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeDsKLQlpbnQgZXZxbnVtOwogCWludCBjaGFubmVsOwogCWludCB1c2VkX2ZsYWdzOwotCWludCBlbmFibGVkOworCWJvb2wgZW5hYmxlZDsKIAlpbnQgaXJxOwotCXVuc2lnbmVkIGludCBoYXNfaW50ZXJydXB0OwogCXVuc2lnbmVkIGludCBpcnFfbW9kZXJhdGlvbjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmFwaV9kZXY7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGlfc3RyOwotCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOwotCWludCB3b3JrX3BlbmRpbmc7CisJYm9vbCB3b3JrX3BlbmRpbmc7CiAJc3RydWN0IGVmeF9zcGVjaWFsX2J1ZmZlciBldmVudHE7CiAJdW5zaWduZWQgaW50IGV2ZW50cV9yZWFkX3B0cjsKIAl1bnNpZ25lZCBpbnQgbGFzdF9ldmVudHFfcmVhZF9wdHI7CkBAIC0zOTAsNyArMzg2LDcgQEAKIAkgKiBhY2Nlc3Mgd2l0aCBwcmVmZXRjaGVzLgogCSAqLwogCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9wa3Q7Ci0JaW50IHJ4X3BrdF9jc3VtbWVkOworCWJvb2wgcnhfcGt0X2NzdW1tZWQ7CiAKIH07CiAKQEAgLTQwMyw4ICszOTksOCBAQAogICovCiBzdHJ1Y3QgZWZ4X2JsaW5rZXIgewogCWludCBsZWRfbnVtOwotCWludCBzdGF0ZTsKLQlpbnQgcmVzdWJtaXQ7CisJYm9vbCBzdGF0ZTsKKwlib29sIHJlc3VibWl0OwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogfTsKIApAQCAtNDMyLDggKzQyOCw4IEBACiAJICogaGF2ZSBhIHNlcGFyYXRlIGluaXQgY2FsbGJhY2sgdGhhdCBoYXBwZW5zIGxhdGVyIHRoYW4KIAkgKiBib2FyZCBpbml0LiAqLwogCWludCAoKmluaXRfbGVkcykoc3RydWN0IGVmeF9uaWMgKmVmeCk7Ci0Jdm9pZCAoKnNldF9mYXVsdF9sZWQpIChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBpbnQgc3RhdGUpOwotCXZvaWQgKCpibGluaykgKHN0cnVjdCBlZnhfbmljICplZngsIGludCBzdGFydCk7CisJdm9pZCAoKnNldF9mYXVsdF9sZWQpIChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBib29sIHN0YXRlKTsKKwl2b2lkICgqYmxpbmspIChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBib29sIHN0YXJ0KTsKIAl2b2lkICgqZmluaSkgKHN0cnVjdCBlZnhfbmljICpuaWMpOwogCXN0cnVjdCBlZnhfYmxpbmtlciBibGlua2VyOwogCXN0cnVjdCBpMmNfY2xpZW50ICpod21vbl9jbGllbnQsICppb2V4cF9jbGllbnQ7CkBAIC00NjcsOCArNDYzLDcgQEAKIAlTVEFURV9JTklUID0gMCwKIAlTVEFURV9SVU5OSU5HID0gMSwKIAlTVEFURV9GSU5JID0gMiwKLQlTVEFURV9SRVNFVFRJTkcgPSAzLCAvKiBydG5sX2xvY2sgYWx3YXlzIGhlbGQgKi8KLQlTVEFURV9ESVNBQkxFRCA9IDQsCisJU1RBVEVfRElTQUJMRUQgPSAzLAogCVNUQVRFX01BWCwKIH07CiAKQEAgLTQ3OSw3ICs0NzQsNyBAQAogICogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBORVRfSVBfQUxJR04gW3doaWNoIGNvbnRyb2xzIHRoZSBhbGlnbm1lbnQKICAqIG9mIHRoZSBza2ItPmhlYWQgZm9yIGhhcmR3YXJlIERNQV0uCiAgKi8KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjaWZkZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKICNkZWZpbmUgRUZYX1BBR0VfSVBfQUxJR04gMAogI2Vsc2UKICNkZWZpbmUgRUZYX1BBR0VfSVBfQUxJR04gTkVUX0lQX0FMSUdOCkBAIC01MTIsNyArNTA3LDYgQEAKICAqIEBjbGVhcl9pbnRlcnJ1cHQ6IENsZWFyIGRvd24gaW50ZXJydXB0CiAgKiBAYmxpbms6IEJsaW5rIExFRHMKICAqIEBjaGVja19odzogQ2hlY2sgaGFyZHdhcmUKLSAqIEByZXNldF94YXVpOiBSZXNldCBYQVVJIHNpZGUgb2YgUEhZIGZvciAoc29mdHdhcmUgc2VxdWVuY2VkIHJlc2V0KQogICogQG1tZHM6IE1NRCBwcmVzZW5jZSBtYXNrCiAgKiBAbG9vcGJhY2tzOiBTdXBwb3J0ZWQgbG9vcGJhY2sgbW9kZXMgbWFzawogICovCkBAIC01MjIsMTEgKzUxNiwyOCBAQAogCXZvaWQgKCpyZWNvbmZpZ3VyZSkgKHN0cnVjdCBlZnhfbmljICplZngpOwogCXZvaWQgKCpjbGVhcl9pbnRlcnJ1cHQpIChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAlpbnQgKCpjaGVja19odykgKHN0cnVjdCBlZnhfbmljICplZngpOwotCXZvaWQgKCpyZXNldF94YXVpKSAoc3RydWN0IGVmeF9uaWMgKmVmeCk7CisJaW50ICgqdGVzdCkgKHN0cnVjdCBlZnhfbmljICplZngpOwogCWludCBtbWRzOwogCXVuc2lnbmVkIGxvb3BiYWNrczsKIH07CiAKKy8qKgorICogQGVudW0gZWZ4X3BoeV9tb2RlIC0gUEhZIG9wZXJhdGluZyBtb2RlIGZsYWdzCisgKiBAUEhZX01PREVfTk9STUFMOiBvbiBhbmQgc2hvdWxkIHBhc3MgdHJhZmZpYworICogQFBIWV9NT0RFX1RYX0RJU0FCTEVEOiBvbiB3aXRoIFRYIGRpc2FibGVkCisgKiBAUEhZX01PREVfU1BFQ0lBTDogb24gYnV0IHdpbGwgbm90IHBhc3MgdHJhZmZpYworICovCitlbnVtIGVmeF9waHlfbW9kZSB7CisJUEhZX01PREVfTk9STUFMCQk9IDAsCisJUEhZX01PREVfVFhfRElTQUJMRUQJPSAxLAorCVBIWV9NT0RFX1NQRUNJQUwJPSA4LAorfTsKKworc3RhdGljIGlubGluZSBib29sIGVmeF9waHlfbW9kZV9kaXNhYmxlZChlbnVtIGVmeF9waHlfbW9kZSBtb2RlKQoreworCXJldHVybiAhIShtb2RlICYgflBIWV9NT0RFX1RYX0RJU0FCTEVEKTsKK30KKwogLyoKICAqIEVmeCBleHRlbmRlZCBzdGF0aXN0aWNzCiAgKgpAQCAtNjMyLDcgKzY0Myw3IEBACiAgKiBAdHhfcXVldWU6IFRYIERNQSBxdWV1ZXMKICAqIEByeF9xdWV1ZTogUlggRE1BIHF1ZXVlcwogICogQGNoYW5uZWw6IENoYW5uZWxzCi0gKiBAcnNzX3F1ZXVlczogTnVtYmVyIG9mIFJTUyBxdWV1ZXMKKyAqIEBuX3J4X3F1ZXVlczogTnVtYmVyIG9mIFJYIHF1ZXVlcwogICogQHJ4X2J1ZmZlcl9sZW46IFJYIGJ1ZmZlciBsZW5ndGgKICAqIEByeF9idWZmZXJfb3JkZXI6IE9yZGVyIChsb2cyKSBvZiBudW1iZXIgb2YgcGFnZXMgZm9yIGVhY2ggUlggYnVmZmVyCiAgKiBAaXJxX3N0YXR1czogSW50ZXJydXB0IHN0YXR1cyBidWZmZXIKQEAgLTY0MCwxNSArNjUxLDIwIEBACiAgKglUaGlzIHJlZ2lzdGVyIGlzIHdyaXR0ZW4gd2l0aCB0aGUgU01QIHByb2Nlc3NvciBJRCB3aGVuZXZlciBhbgogICoJaW50ZXJydXB0IGlzIGhhbmRsZWQuICBJdCBpcyB1c2VkIGJ5IGZhbGNvbl90ZXN0X2ludGVycnVwdCgpCiAgKgl0byB2ZXJpZnkgdGhhdCBhbiBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkLgorICogQHNwaV9mbGFzaDogU1BJIGZsYXNoIGRldmljZQorICoJVGhpcyBmaWVsZCB3aWxsIGJlICVOVUxMIGlmIG5vIGZsYXNoIGRldmljZSBpcyBwcmVzZW50LgorICogQHNwaV9lZXByb206IFNQSSBFRVBST00gZGV2aWNlCisgKglUaGlzIGZpZWxkIHdpbGwgYmUgJU5VTEwgaWYgbm8gRUVQUk9NIGRldmljZSBpcyBwcmVzZW50LgogICogQG5fcnhfbm9kZXNjX2Ryb3BfY250OiBSWCBubyBkZXNjcmlwdG9yIGRyb3AgY291bnQKICAqIEBuaWNfZGF0YTogSGFyZHdhcmUgZGVwZW5kYW50IHN0YXRlCi0gKiBAbWFjX2xvY2s6IE1BQyBhY2Nlc3MgbG9jay4gUHJvdGVjdHMgQHBvcnRfZW5hYmxlZCwgZWZ4X21vbml0b3IoKSBhbmQKLSAqCWVmeF9yZWNvbmZpZ3VyZV9wb3J0KCkKKyAqIEBtYWNfbG9jazogTUFDIGFjY2VzcyBsb2NrLiBQcm90ZWN0cyBAcG9ydF9lbmFibGVkLCBAcGh5X21vZGUsCisgKglAcG9ydF9pbmhpYml0ZWQsIGVmeF9tb25pdG9yKCkgYW5kIGVmeF9yZWNvbmZpZ3VyZV9wb3J0KCkKICAqIEBwb3J0X2VuYWJsZWQ6IFBvcnQgZW5hYmxlZCBpbmRpY2F0b3IuCiAgKglTZXJpYWxpc2VzIGVmeF9zdG9wX2FsbCgpLCBlZnhfc3RhcnRfYWxsKCkgYW5kIGVmeF9tb25pdG9yKCkgYW5kCiAgKgllZnhfcmVjb25maWd1cmVfd29yayB3aXRoIGtlcm5lbCBpbnRlcmZhY2VzLiBTYWZlIHRvIHJlYWQgdW5kZXIgYW55CiAgKglvbmUgb2YgdGhlIHJ0bmxfbG9jaywgbWFjX2xvY2ssIG9yIG5ldGlmX3R4X2xvY2ssIGJ1dCBhbGwgdGhyZWUgbXVzdAogICoJYmUgaGVsZCB0byBtb2RpZnkgaXQuCisgKiBAcG9ydF9pbmhpYml0ZWQ6IElmIHNldCwgdGhlIG5ldGlmX2NhcnJpZXIgaXMgYWx3YXlzIG9mZi4gSG9sZCB0aGUgbWFjX2xvY2sKICAqIEBwb3J0X2luaXRpYWxpemVkOiBQb3J0IGluaXRpYWxpemVkPwogICogQG5ldF9kZXY6IE9wZXJhdGluZyBzeXN0ZW0gbmV0d29yayBkZXZpY2UuIENvbnNpZGVyIGhvbGRpbmcgdGhlIHJ0bmwgbG9jawogICogQHJ4X2NoZWNrc3VtX2VuYWJsZWQ6IFJYIGNoZWNrc3VtbWluZyBlbmFibGVkCkBAIC02NTgsMTQgKzY3NCwxNiBAQAogICoJY2FuIHByb3ZpZGUuICBHZW5lcmljIGNvZGUgY29udmVydHMgdGhlc2UgaW50byBhIHN0YW5kYXJkCiAgKgkmc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMuCiAgKiBAc3RhdHNfYnVmZmVyOiBETUEgYnVmZmVyIGZvciBzdGF0aXN0aWNzCi0gKiBAc3RhdHNfbG9jazogU3RhdGlzdGljcyB1cGRhdGUgbG9jaworICogQHN0YXRzX2xvY2s6IFN0YXRpc3RpY3MgdXBkYXRlIGxvY2suIFNlcmlhbGlzZXMgc3RhdGlzdGljcyBmZXRjaGVzCisgKiBAc3RhdHNfZW5hYmxlZDogVGVtcG9yYXJpbHkgZGlzYWJsZSBzdGF0aXN0aWNzIGZldGNoZXMuCisgKglTZXJpYWxpc2VkIGJ5IEBzdGF0c19sb2NrCiAgKiBAbWFjX2FkZHJlc3M6IFBlcm1hbmVudCBNQUMgYWRkcmVzcwogICogQHBoeV90eXBlOiBQSFkgdHlwZQogICogQHBoeV9sb2NrOiBQSFkgYWNjZXNzIGxvY2sKICAqIEBwaHlfb3A6IFBIWSBpbnRlcmZhY2UKICAqIEBwaHlfZGF0YTogUEhZIHByaXZhdGUgZGF0YSAoaW5jbHVkaW5nIFBIWS1zcGVjaWZpYyBzdGF0cykKICAqIEBtaWk6IFBIWSBpbnRlcmZhY2UKLSAqIEB0eF9kaXNhYmxlZDogUEhZIHRyYW5zbWl0dGVyIHR1cm5lZCBvZmYKKyAqIEBwaHlfbW9kZTogUEhZIG9wZXJhdGluZyBtb2RlLiBTZXJpYWxpc2VkIGJ5IEBtYWNfbG9jay4KICAqIEBsaW5rX3VwOiBMaW5rIHN0YXR1cwogICogQGxpbmtfb3B0aW9uczogTGluayBvcHRpb25zIChNSUkvR01JSSBmb3JtYXQpCiAgKiBAbl9saW5rX3N0YXRlX2NoYW5nZXM6IE51bWJlciBvZiB0aW1lcyB0aGUgbGluayBoYXMgY2hhbmdlZCBzdGF0ZQpAQCAtNzAwLDI3ICs3MTgsMzEgQEAKIAllbnVtIG5pY19zdGF0ZSBzdGF0ZTsKIAllbnVtIHJlc2V0X3R5cGUgcmVzZXRfcGVuZGluZzsKIAotCXN0cnVjdCBlZnhfdHhfcXVldWUgdHhfcXVldWVbRUZYX01BWF9UWF9RVUVVRVNdOworCXN0cnVjdCBlZnhfdHhfcXVldWUgdHhfcXVldWVbRUZYX1RYX1FVRVVFX0NPVU5UXTsKIAlzdHJ1Y3QgZWZ4X3J4X3F1ZXVlIHJ4X3F1ZXVlW0VGWF9NQVhfUlhfUVVFVUVTXTsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgY2hhbm5lbFtFRlhfTUFYX0NIQU5ORUxTXTsKIAotCWludCByc3NfcXVldWVzOworCWludCBuX3J4X3F1ZXVlczsKIAl1bnNpZ25lZCBpbnQgcnhfYnVmZmVyX2xlbjsKIAl1bnNpZ25lZCBpbnQgcnhfYnVmZmVyX29yZGVyOwogCiAJc3RydWN0IGVmeF9idWZmZXIgaXJxX3N0YXR1czsKIAl2b2xhdGlsZSBzaWduZWQgaW50IGxhc3RfaXJxX2NwdTsKIAorCXN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpX2ZsYXNoOworCXN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpX2VlcHJvbTsKKwogCXVuc2lnbmVkIG5fcnhfbm9kZXNjX2Ryb3BfY250OwogCiAJc3RydWN0IGZhbGNvbl9uaWNfZGF0YSAqbmljX2RhdGE7CiAKIAlzdHJ1Y3QgbXV0ZXggbWFjX2xvY2s7Ci0JaW50IHBvcnRfZW5hYmxlZDsKKwlib29sIHBvcnRfZW5hYmxlZDsKKwlib29sIHBvcnRfaW5oaWJpdGVkOwogCi0JaW50IHBvcnRfaW5pdGlhbGl6ZWQ7CisJYm9vbCBwb3J0X2luaXRpYWxpemVkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwotCWludCByeF9jaGVja3N1bV9lbmFibGVkOworCWJvb2wgcnhfY2hlY2tzdW1fZW5hYmxlZDsKIAogCWF0b21pY190IG5ldGlmX3N0b3BfY291bnQ7CiAJc3BpbmxvY2tfdCBuZXRpZl9zdG9wX2xvY2s7CkBAIC03MjgsNiArNzUwLDcgQEAKIAlzdHJ1Y3QgZWZ4X21hY19zdGF0cyBtYWNfc3RhdHM7CiAJc3RydWN0IGVmeF9idWZmZXIgc3RhdHNfYnVmZmVyOwogCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKKwlib29sIHN0YXRzX2VuYWJsZWQ7CiAKIAl1bnNpZ25lZCBjaGFyIG1hY19hZGRyZXNzW0VUSF9BTEVOXTsKIApAQCAtNzM2LDEzICs3NTksMTMgQEAKIAlzdHJ1Y3QgZWZ4X3BoeV9vcGVyYXRpb25zICpwaHlfb3A7CiAJdm9pZCAqcGh5X2RhdGE7CiAJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKLQl1bnNpZ25lZCB0eF9kaXNhYmxlZDsKKwllbnVtIGVmeF9waHlfbW9kZSBwaHlfbW9kZTsKIAotCWludCBsaW5rX3VwOworCWJvb2wgbGlua191cDsKIAl1bnNpZ25lZCBpbnQgbGlua19vcHRpb25zOwogCXVuc2lnbmVkIGludCBuX2xpbmtfc3RhdGVfY2hhbmdlczsKIAotCWludCBwcm9taXNjdW91czsKKwlib29sIHByb21pc2N1b3VzOwogCXVuaW9uIGVmeF9tdWx0aWNhc3RfaGFzaCBtdWx0aWNhc3RfaGFzaDsKIAllbnVtIGVmeF9mY190eXBlIGZsb3dfY29udHJvbDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVjb25maWd1cmVfd29yazsKQEAgLTgyOSw1MCArODUyLDMzIEBACiAJCQljb250aW51ZTsJCQkJCVwKIAkJZWxzZQogCi0vKiBJdGVyYXRlIG92ZXIgYWxsIHVzZWQgY2hhbm5lbHMgd2l0aCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIGVmeF9mb3JfZWFjaF9jaGFubmVsX3dpdGhfaW50ZXJydXB0KF9jaGFubmVsLCBfZWZ4KQkJXAotCWZvciAoX2NoYW5uZWwgPSAmX2VmeC0+Y2hhbm5lbFswXTsJCQkJXAotCSAgICAgX2NoYW5uZWwgPCAmX2VmeC0+Y2hhbm5lbFtFRlhfTUFYX0NIQU5ORUxTXTsJCVwKLQkgICAgIF9jaGFubmVsKyspCQkJCQkJXAotCQlpZiAoIShfY2hhbm5lbC0+dXNlZF9mbGFncyAmJiBfY2hhbm5lbC0+aGFzX2ludGVycnVwdCkpCVwKLQkJCWNvbnRpbnVlOwkJCQkJXAotCQllbHNlCi0KIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdXNlZCBUWCBxdWV1ZXMgKi8KICNkZWZpbmUgZWZ4X2Zvcl9lYWNoX3R4X3F1ZXVlKF90eF9xdWV1ZSwgX2VmeCkJCQkJXAogCWZvciAoX3R4X3F1ZXVlID0gJl9lZngtPnR4X3F1ZXVlWzBdOwkJCQlcCi0JICAgICBfdHhfcXVldWUgPCAmX2VmeC0+dHhfcXVldWVbRUZYX01BWF9UWF9RVUVVRVNdOwkJXAotCSAgICAgX3R4X3F1ZXVlKyspCQkJCQkJXAotCQlpZiAoIV90eF9xdWV1ZS0+dXNlZCkJCQkJCVwKLQkJCWNvbnRpbnVlOwkJCQkJXAotCQllbHNlCisJICAgICBfdHhfcXVldWUgPCAmX2VmeC0+dHhfcXVldWVbRUZYX1RYX1FVRVVFX0NPVU5UXTsJCVwKKwkgICAgIF90eF9xdWV1ZSsrKQogCiAvKiBJdGVyYXRlIG92ZXIgYWxsIFRYIHF1ZXVlcyBiZWxvbmdpbmcgdG8gYSBjaGFubmVsICovCiAjZGVmaW5lIGVmeF9mb3JfZWFjaF9jaGFubmVsX3R4X3F1ZXVlKF90eF9xdWV1ZSwgX2NoYW5uZWwpCQlcCiAJZm9yIChfdHhfcXVldWUgPSAmX2NoYW5uZWwtPmVmeC0+dHhfcXVldWVbMF07CQkJXAotCSAgICAgX3R4X3F1ZXVlIDwgJl9jaGFubmVsLT5lZngtPnR4X3F1ZXVlW0VGWF9NQVhfVFhfUVVFVUVTXTsJXAorCSAgICAgX3R4X3F1ZXVlIDwgJl9jaGFubmVsLT5lZngtPnR4X3F1ZXVlW0VGWF9UWF9RVUVVRV9DT1VOVF07CVwKIAkgICAgIF90eF9xdWV1ZSsrKQkJCQkJCVwKLQkJaWYgKCghX3R4X3F1ZXVlLT51c2VkKSB8fAkJCQlcCi0JCSAgICAoX3R4X3F1ZXVlLT5jaGFubmVsICE9IF9jaGFubmVsKSkJCQlcCisJCWlmIChfdHhfcXVldWUtPmNoYW5uZWwgIT0gX2NoYW5uZWwpCQkJXAogCQkJY29udGludWU7CQkJCQlcCiAJCWVsc2UKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCB1c2VkIFJYIHF1ZXVlcyAqLwogI2RlZmluZSBlZnhfZm9yX2VhY2hfcnhfcXVldWUoX3J4X3F1ZXVlLCBfZWZ4KQkJCQlcCiAJZm9yIChfcnhfcXVldWUgPSAmX2VmeC0+cnhfcXVldWVbMF07CQkJCVwKLQkgICAgIF9yeF9xdWV1ZSA8ICZfZWZ4LT5yeF9xdWV1ZVtFRlhfTUFYX1JYX1FVRVVFU107CQlcCi0JICAgICBfcnhfcXVldWUrKykJCQkJCQlcCi0JCWlmICghX3J4X3F1ZXVlLT51c2VkKQkJCQkJXAotCQkJY29udGludWU7CQkJCQlcCi0JCWVsc2UKKwkgICAgIF9yeF9xdWV1ZSA8ICZfZWZ4LT5yeF9xdWV1ZVtfZWZ4LT5uX3J4X3F1ZXVlc107CQlcCisJICAgICBfcnhfcXVldWUrKykKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCBSWCBxdWV1ZXMgYmVsb25naW5nIHRvIGEgY2hhbm5lbCAqLwogI2RlZmluZSBlZnhfZm9yX2VhY2hfY2hhbm5lbF9yeF9xdWV1ZShfcnhfcXVldWUsIF9jaGFubmVsKQkJXAotCWZvciAoX3J4X3F1ZXVlID0gJl9jaGFubmVsLT5lZngtPnJ4X3F1ZXVlWzBdOwkJCVwKLQkgICAgIF9yeF9xdWV1ZSA8ICZfY2hhbm5lbC0+ZWZ4LT5yeF9xdWV1ZVtFRlhfTUFYX1JYX1FVRVVFU107CVwKLQkgICAgIF9yeF9xdWV1ZSsrKQkJCQkJCVwKLQkJaWYgKCghX3J4X3F1ZXVlLT51c2VkKSB8fAkJCQlcCi0JCSAgICAoX3J4X3F1ZXVlLT5jaGFubmVsICE9IF9jaGFubmVsKSkJCQlcCisJZm9yIChfcnhfcXVldWUgPSAmX2NoYW5uZWwtPmVmeC0+cnhfcXVldWVbX2NoYW5uZWwtPmNoYW5uZWxdOwlcCisJICAgICBfcnhfcXVldWU7CQkJCQkJCVwKKwkgICAgIF9yeF9xdWV1ZSA9IE5VTEwpCQkJCQkJXAorCQlpZiAoX3J4X3F1ZXVlLT5jaGFubmVsICE9IF9jaGFubmVsKQkJCVwKIAkJCWNvbnRpbnVlOwkJCQkJXAogCQllbHNlCiAKQEAgLTg4NiwxMyArODkyLDEzIEBACiB9CiAKIC8qIFNldCBiaXQgaW4gYSBsaXR0bGUtZW5kaWFuIGJpdGZpZWxkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdF9sZShpbnQgbnIsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdF9sZSh1bnNpZ25lZCBuciwgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKIAlhZGRyW25yIC8gOF0gfD0gKDEgPDwgKG5yICUgOCkpOwogfQogCiAvKiBDbGVhciBiaXQgaW4gYSBsaXR0bGUtZW5kaWFuIGJpdGZpZWxkICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0X2xlKGludCBuciwgdW5zaWduZWQgY2hhciAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXRfbGUodW5zaWduZWQgbnIsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCiB7CiAJYWRkcltuciAvIDhdICY9IH4oMSA8PCAobnIgJSA4KSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvcGh5LmggYi9kcml2ZXJzL25ldC9zZmMvcGh5LmgKaW5kZXggOWQwMmM4NC4uZjc0NjUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9waHkuaApAQCAtMTUsMTUgKzE1LDcgQEAKICAqLwogZXh0ZXJuIHN0cnVjdCBlZnhfcGh5X29wZXJhdGlvbnMgZmFsY29uX3RlbnhwcmVzc19waHlfb3BzOwogCi1lbnVtIHRlbnhwcmVzc19zdGF0ZSB7Ci0JVEVOWFBSRVNTX1NUQVRVU19PRkYgPSAwLAotCVRFTlhQUkVTU19TVEFUVVNfT1RFTVAgPSAxLAotCVRFTlhQUkVTU19TVEFUVVNfTk9STUFMID0gMiwKLX07Ci0KLWV4dGVybiB2b2lkIHRlbnhwcmVzc19zZXRfc3RhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCwKLQkJCQllbnVtIHRlbnhwcmVzc19zdGF0ZSBzdGF0ZSk7Ci1leHRlcm4gdm9pZCB0ZW54cHJlc3NfcGh5X2JsaW5rKHN0cnVjdCBlZnhfbmljICplZngsIGludCBibGluayk7CitleHRlcm4gdm9pZCB0ZW54cHJlc3NfcGh5X2JsaW5rKHN0cnVjdCBlZnhfbmljICplZngsIGJvb2wgYmxpbmspOwogZXh0ZXJuIHZvaWQgdGVueHByZXNzX2NyY19lcnIoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvcnguYyBiL2RyaXZlcnMvbmV0L3NmYy9yeC5jCmluZGV4IDBkMjdkZDMuLjBmODA1ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9yeC5jCkBAIC0yMTIsOCArMjEyLDggQEAKICAqIGFuZCBwb3B1bGF0ZXMgYSBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciB3aXRoIHRoZSByZWxldmFudAogICogaW5mb3JtYXRpb24uICBSZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZWZ4X2luaXRfcnhfYnVmZmVyX3NrYihzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSwKLQkJCQkJIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCitzdGF0aWMgaW50IGVmeF9pbml0X3J4X2J1ZmZlcl9za2Ioc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsCisJCQkJICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSByeF9xdWV1ZS0+ZWZ4OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gZWZ4LT5uZXRfZGV2OwpAQCAtMjUyLDggKzI1Miw4IEBACiAgKiBhbmQgcG9wdWxhdGVzIGEgc3RydWN0IGVmeF9yeF9idWZmZXIgd2l0aCB0aGUgcmVsZXZhbnQKICAqIGluZm9ybWF0aW9uLiAgUmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciAwIG9uIHN1Y2Nlc3MuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGVmeF9pbml0X3J4X2J1ZmZlcl9wYWdlKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAotCQkJCQkgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCitzdGF0aWMgaW50IGVmeF9pbml0X3J4X2J1ZmZlcl9wYWdlKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAorCQkJCSAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7CiAJaW50IGJ5dGVzLCBzcGFjZSwgb2Zmc2V0OwpAQCAtMzE5LDggKzMxOSw4IEBACiAgKiBhbmQgcG9wdWxhdGVzIGEgc3RydWN0IGVmeF9yeF9idWZmZXIgd2l0aCB0aGUgcmVsZXZhbnQKICAqIGluZm9ybWF0aW9uLgogICovCi1zdGF0aWMgaW5saW5lIGludCBlZnhfaW5pdF9yeF9idWZmZXIoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsCi0JCQkJICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqbmV3X3J4X2J1ZikKK3N0YXRpYyBpbnQgZWZ4X2luaXRfcnhfYnVmZmVyKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAorCQkJICAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKm5ld19yeF9idWYpCiB7CiAJaW50IHJjID0gMDsKIApAQCAtMzQwLDggKzM0MCw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZWZ4X3VubWFwX3J4X2J1ZmZlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJCSAgICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQorc3RhdGljIHZvaWQgZWZ4X3VubWFwX3J4X2J1ZmZlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJCXN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCiB7CiAJaWYgKHJ4X2J1Zi0+cGFnZSkgewogCQlFRlhfQlVHX09OX1BBUkFOT0lEKHJ4X2J1Zi0+c2tiKTsKQEAgLTM1Nyw4ICszNTcsOCBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVmeF9mcmVlX3J4X2J1ZmZlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJCSAgICAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCitzdGF0aWMgdm9pZCBlZnhfZnJlZV9yeF9idWZmZXIoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCSAgICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQogewogCWlmIChyeF9idWYtPnBhZ2UpIHsKIAkJX19mcmVlX3BhZ2VzKHJ4X2J1Zi0+cGFnZSwgZWZ4LT5yeF9idWZmZXJfb3JkZXIpOwpAQCAtMzY5LDggKzM2OSw4IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZWZ4X2ZpbmlfcnhfYnVmZmVyKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAotCQkJCSAgICAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYpCitzdGF0aWMgdm9pZCBlZnhfZmluaV9yeF9idWZmZXIoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUsCisJCQkgICAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKnJ4X2J1ZikKIHsKIAllZnhfdW5tYXBfcnhfYnVmZmVyKHJ4X3F1ZXVlLT5lZngsIHJ4X2J1Zik7CiAJZWZ4X2ZyZWVfcnhfYnVmZmVyKHJ4X3F1ZXVlLT5lZngsIHJ4X2J1Zik7CkBAIC01MDYsMTAgKzUwNiwxMCBAQAogCQllZnhfc2NoZWR1bGVfc2xvd19maWxsKHJ4X3F1ZXVlLCAxKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVmeF9yeF9wYWNrZXRfX2NoZWNrX2xlbihzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSwKLQkJCQkJICAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYsCi0JCQkJCSAgICBpbnQgbGVuLCBpbnQgKmRpc2NhcmQsCi0JCQkJCSAgICBpbnQgKmxlYWtfcGFja2V0KQorc3RhdGljIHZvaWQgZWZ4X3J4X3BhY2tldF9fY2hlY2tfbGVuKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLAorCQkJCSAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKnJ4X2J1ZiwKKwkJCQkgICAgIGludCBsZW4sIGJvb2wgKmRpc2NhcmQsCisJCQkJICAgICBib29sICpsZWFrX3BhY2tldCkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gcnhfcXVldWUtPmVmeDsKIAl1bnNpZ25lZCBtYXhfbGVuID0gcnhfYnVmLT5sZW4gLSBlZngtPnR5cGUtPnJ4X2J1ZmZlcl9wYWRkaW5nOwpAQCAtNTIwLDcgKzUyMCw3IEBACiAJLyogVGhlIHBhY2tldCBtdXN0IGJlIGRpc2NhcmRlZCwgYnV0IHRoaXMgaXMgb25seSBhIGZhdGFsIGVycm9yCiAJICogaWYgdGhlIGNhbGxlciBpbmRpY2F0ZWQgaXQgd2FzCiAJICovCi0JKmRpc2NhcmQgPSAxOworCSpkaXNjYXJkID0gdHJ1ZTsKIAogCWlmICgobGVuID4gcnhfYnVmLT5sZW4pICYmIEVGWF9XT1JLQVJPVU5EXzgwNzEoZWZ4KSkgewogCQlFRlhfRVJSX1JMKGVmeCwgIiBSWCBxdWV1ZSAlZCBzZXJpb3VzbHkgb3Zlcmxlbmd0aCAiCkBAIC01NDYsOCArNTQ2LDggQEAKICAqIEhhbmRsZXMgZHJpdmVybGluayB2ZXRvLCBhbmQgcGFzc2VzIHRoZSBmcmFnbWVudCB1cCB2aWEKICAqIHRoZSBhcHByb3ByaWF0ZSBMUk8gbWV0aG9kCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZnhfcnhfcGFja2V0X2xybyhzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmKQorc3RhdGljIHZvaWQgZWZ4X3J4X3BhY2tldF9scm8oc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsLAorCQkJICAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKnJ4X2J1ZikKIHsKIAlzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3IgPSAmY2hhbm5lbC0+bHJvX21ncjsKIAl2b2lkICpwcml2ID0gY2hhbm5lbDsKQEAgLTU3NCw5ICs1NzQsOSBAQAogfQogCiAvKiBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIFNLQiBhcm91bmQgYSBzdHJ1Y3QgcGFnZS4qLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZWZ4X3J4X21rX3NrYihzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmLAotCQkJCQkgICAgc3RydWN0IGVmeF9uaWMgKmVmeCwKLQkJCQkJICAgIGludCBoZHJfbGVuKQorc3RhdGljIHN0cnVjdCBza19idWZmICplZnhfcnhfbWtfc2tiKHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYsCisJCQkJICAgICBzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJCSAgICAgaW50IGhkcl9sZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNjIxLDExICs2MjEsMTEgQEAKIH0KIAogdm9pZCBlZnhfcnhfcGFja2V0KHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlLCB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCSAgIHVuc2lnbmVkIGludCBsZW4sIGludCBjaGVja3N1bW1lZCwgaW50IGRpc2NhcmQpCisJCSAgIHVuc2lnbmVkIGludCBsZW4sIGJvb2wgY2hlY2tzdW1tZWQsIGJvb2wgZGlzY2FyZCkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gcnhfcXVldWUtPmVmeDsKIAlzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmOwotCWludCBsZWFrX3BhY2tldCA9IDA7CisJYm9vbCBsZWFrX3BhY2tldCA9IGZhbHNlOwogCiAJcnhfYnVmID0gZWZ4X3J4X2J1ZmZlcihyeF9xdWV1ZSwgaW5kZXgpOwogCUVGWF9CVUdfT05fUEFSQU5PSUQoIXJ4X2J1Zi0+ZGF0YSk7CkBAIC02ODMsMTEgKzY4MywxMSBAQAogCiAvKiBIYW5kbGUgYSByZWNlaXZlZCBwYWNrZXQuICBTZWNvbmQgaGFsZjogVG91Y2hlcyBwYWNrZXQgcGF5bG9hZC4gKi8KIHZvaWQgX19lZnhfcnhfcGFja2V0KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKLQkJICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmLCBpbnQgY2hlY2tzdW1tZWQpCisJCSAgICAgc3RydWN0IGVmeF9yeF9idWZmZXIgKnJ4X2J1ZiwgYm9vbCBjaGVja3N1bW1lZCkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGxybyA9IGVmeC0+bmV0X2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTzsKKwlib29sIGxybyA9ICEhKGVmeC0+bmV0X2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTyk7CiAKIAkvKiBJZiB3ZSdyZSBpbiBsb29wYmFjayB0ZXN0LCB0aGVuIHBhc3MgdGhlIHBhY2tldCBkaXJlY3RseSB0byB0aGUKIAkgKiBsb29wYmFjayBsYXllciwgYW5kIGZyZWUgdGhlIHJ4X2J1ZiBoZXJlCkBAIC03ODksMjcgKzc4OSwxOCBAQAogCS8qIEFsbG9jYXRlIFJYIGJ1ZmZlcnMgKi8KIAlyeHFfc2l6ZSA9IChlZngtPnR5cGUtPnJ4ZF9yaW5nX21hc2sgKyAxKSAqIHNpemVvZigqcnhfcXVldWUtPmJ1ZmZlcik7CiAJcnhfcXVldWUtPmJ1ZmZlciA9IGt6YWxsb2MocnhxX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghcnhfcXVldWUtPmJ1ZmZlcikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDE7Ci0JfQorCWlmICghcnhfcXVldWUtPmJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyYyA9IGZhbGNvbl9wcm9iZV9yeChyeF9xdWV1ZSk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWwyOwotCi0JcmV0dXJuIDA7Ci0KLSBmYWlsMjoKLQlrZnJlZShyeF9xdWV1ZS0+YnVmZmVyKTsKLQlyeF9xdWV1ZS0+YnVmZmVyID0gTlVMTDsKLSBmYWlsMToKLQlyeF9xdWV1ZS0+dXNlZCA9IDA7Ci0KKwlpZiAocmMpIHsKKwkJa2ZyZWUocnhfcXVldWUtPmJ1ZmZlcik7CisJCXJ4X3F1ZXVlLT5idWZmZXIgPSBOVUxMOworCX0KIAlyZXR1cm4gcmM7CiB9CiAKLWludCBlZnhfaW5pdF9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKK3ZvaWQgZWZ4X2luaXRfcnhfcXVldWUoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHJ4X3F1ZXVlLT5lZng7CiAJdW5zaWduZWQgaW50IG1heF9maWxsLCB0cmlnZ2VyLCBsaW1pdDsKQEAgLTgzMyw3ICs4MjQsNyBAQAogCXJ4X3F1ZXVlLT5mYXN0X2ZpbGxfbGltaXQgPSBsaW1pdDsKIAogCS8qIFNldCB1cCBSWCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlyZXR1cm4gZmFsY29uX2luaXRfcngocnhfcXVldWUpOworCWZhbGNvbl9pbml0X3J4KHJ4X3F1ZXVlKTsKIH0KIAogdm9pZCBlZnhfZmluaV9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSkKQEAgLTg3Miw3ICs4NjMsNiBAQAogCiAJa2ZyZWUocnhfcXVldWUtPmJ1ZmZlcik7CiAJcnhfcXVldWUtPmJ1ZmZlciA9IE5VTEw7Ci0JcnhfcXVldWUtPnVzZWQgPSAwOwogfQogCiB2b2lkIGVmeF9mbHVzaF9scm8oc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL3J4LmggYi9kcml2ZXJzL25ldC9zZmMvcnguaAppbmRleCBmMzVlMzc3Li4wZTg4YTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvcnguaAorKysgYi9kcml2ZXJzL25ldC9zZmMvcnguaApAQCAtMTQsNyArMTQsNyBAQAogCiBpbnQgZWZ4X3Byb2JlX3J4X3F1ZXVlKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKIHZvaWQgZWZ4X3JlbW92ZV9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSk7Ci1pbnQgZWZ4X2luaXRfcnhfcXVldWUoc3RydWN0IGVmeF9yeF9xdWV1ZSAqcnhfcXVldWUpOwordm9pZCBlZnhfaW5pdF9yeF9xdWV1ZShzdHJ1Y3QgZWZ4X3J4X3F1ZXVlICpyeF9xdWV1ZSk7CiB2b2lkIGVmeF9maW5pX3J4X3F1ZXVlKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKIAogaW50IGVmeF9scm9faW5pdChzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3IsIHN0cnVjdCBlZnhfbmljICplZngpOwpAQCAtMjQsNiArMjQsNiBAQAogdm9pZCBlZnhfZmFzdF9wdXNoX3J4X2Rlc2NyaXB0b3JzKHN0cnVjdCBlZnhfcnhfcXVldWUgKnJ4X3F1ZXVlKTsKIHZvaWQgZWZ4X3J4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKIHZvaWQgX19lZnhfcnhfcGFja2V0KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCwKLQkJICAgICBzdHJ1Y3QgZWZ4X3J4X2J1ZmZlciAqcnhfYnVmLCBpbnQgY2hlY2tzdW1tZWQpOworCQkgICAgIHN0cnVjdCBlZnhfcnhfYnVmZmVyICpyeF9idWYsIGJvb2wgY2hlY2tzdW1tZWQpOwogCiAjZW5kaWYgLyogRUZYX1JYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9zZWxmdGVzdC5jIGIvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKaW5kZXggM2IyZGU5Zi4uMzYyOTU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3NlbGZ0ZXN0LmMKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlICJib2FyZHMuaCIKICNpbmNsdWRlICJ3b3JrYXJvdW5kcy5oIgogI2luY2x1ZGUgIm1hYy5oIgorI2luY2x1ZGUgInNwaS5oIgorI2luY2x1ZGUgImZhbGNvbl9pby5oIgorI2luY2x1ZGUgIm1kaW9fMTBnLmgiCiAKIC8qCiAgKiBMb29wYmFjayB0ZXN0IHBhY2tldCBzdHJ1Y3R1cmUKQEAgLTUxLDcgKzU0LDcgQEAKIAkiSGVsbG8gd29ybGQhIFRoaXMgaXMgYW4gRWZ4IGxvb3BiYWNrIHRlc3QgaW4gcHJvZ3Jlc3MhIjsKIAogLyoqCi0gKiBlZnhfc2VsZnRlc3Rfc3RhdGUgLSBwZXJzaXN0ZW50IHN0YXRlIGR1cmluZyBhIHNlbGZ0ZXN0CisgKiBlZnhfbG9vcGJhY2tfc3RhdGUgLSBwZXJzaXN0ZW50IHN0YXRlIGR1cmluZyBhIGxvb3BiYWNrIHNlbGZ0ZXN0CiAgKiBAZmx1c2g6CQlEcm9wIGFsbCBwYWNrZXRzIGluIGVmeF9sb29wYmFja19yeF9wYWNrZXQKICAqIEBwYWNrZXRfY291bnQ6CU51bWJlciBvZiBwYWNrZXRzIGJlaW5nIHVzZWQgaW4gdGhpcyB0ZXN0CiAgKiBAc2ticzoJCUFuIGFycmF5IG9mIHNrYnMgdHJhbnNtaXR0ZWQKQEAgLTU5LDEwICs2MiwxNCBAQAogICogQHJ4X2JhZDoJCVJYIGJhZCBwYWNrZXQgY291bnQKICAqIEBwYXlsb2FkOgkJUGF5bG9hZCB1c2VkIGluIHRlc3RzCiAgKi8KLXN0cnVjdCBlZnhfc2VsZnRlc3Rfc3RhdGUgewotCWludCBmbHVzaDsKK3N0cnVjdCBlZnhfbG9vcGJhY2tfc3RhdGUgeworCWJvb2wgZmx1c2g7CiAJaW50IHBhY2tldF9jb3VudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnM7CisKKwkvKiBDaGVja3N1bXMgYXJlIGJlaW5nIG9mZmxvYWRlZCAqLworCWJvb2wgb2ZmbG9hZF9jc3VtOworCiAJYXRvbWljX3QgcnhfZ29vZDsKIAlhdG9taWNfdCByeF9iYWQ7CiAJc3RydWN0IGVmeF9sb29wYmFja19wYXlsb2FkIHBheWxvYWQ7CkBAIC03MCwyMSArNzcsNjUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogQ29uZmlndXJhYmxlIHZhbHVlcworICogTUlJLCBOVlJBTSBhbmQgcmVnaXN0ZXIgdGVzdHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIExldmVsIG9mIGxvb3BiYWNrIHRlc3RpbmcKLSAqCi0gKiBUaGUgbWF4aW11bSBwYWNrZXQgYnVyc3QgbGVuZ3RoIGlzIDE2Kioobi0xKSwgaS5lLgotICoKLSAqIC0gTGV2ZWwgMCA6IG5vIHBhY2tldHMKLSAqIC0gTGV2ZWwgMSA6IDEgcGFja2V0Ci0gKiAtIExldmVsIDIgOiAxNyBwYWNrZXRzICgxICogMSBwYWNrZXQsIDEgKiAxNiBwYWNrZXRzKQotICogLSBMZXZlbCAzIDogMjczIHBhY2tldHMgKDEgKiAxIHBhY2tldCwgMSAqIDE2IHBhY2tldCwgMSAqIDI1NiBwYWNrZXRzKQotICoKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBsb29wYmFja190ZXN0X2xldmVsID0gMzsKK3N0YXRpYyBpbnQgZWZ4X3Rlc3RfbWlpKHN0cnVjdCBlZnhfbmljICplZngsIHN0cnVjdCBlZnhfc2VsZl90ZXN0cyAqdGVzdHMpCit7CisJaW50IHJjID0gMDsKKwl1MTYgcGh5c2lkMSwgcGh5c2lkMjsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSA9ICZlZngtPm1paTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGVmeC0+bmV0X2RldjsKKworCWlmIChlZngtPnBoeV90eXBlID09IFBIWV9UWVBFX05PTkUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZWZ4LT5tYWNfbG9jayk7CisJdGVzdHMtPm1paSA9IC0xOworCisJcGh5c2lkMSA9IG1paS0+bWRpb19yZWFkKG5ldF9kZXYsIG1paS0+cGh5X2lkLCBNSUlfUEhZU0lEMSk7CisJcGh5c2lkMiA9IG1paS0+bWRpb19yZWFkKG5ldF9kZXYsIG1paS0+cGh5X2lkLCBNSUlfUEhZU0lEMik7CisKKwlpZiAoKHBoeXNpZDEgPT0gMHgwMDAwKSB8fCAocGh5c2lkMSA9PSAweGZmZmYpIHx8CisJICAgIChwaHlzaWQyID09IDB4MDAwMCkgfHwgKHBoeXNpZDIgPT0gMHhmZmZmKSkgeworCQlFRlhfRVJSKGVmeCwgIm5vIE1JSSBQSFkgcHJlc2VudCB3aXRoIElEICVkXG4iLAorCQkJbWlpLT5waHlfaWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gbWRpb19jbGF1c2U0NV9jaGVja19tbWRzKGVmeCwgZWZ4LT5waHlfb3AtPm1tZHMsIDApOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKK291dDoKKwltdXRleF91bmxvY2soJmVmeC0+bWFjX2xvY2spOworCXRlc3RzLT5taWkgPSByYyA/IC0xIDogMTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZWZ4X3Rlc3RfbnZyYW0oc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGVmeF9zZWxmX3Rlc3RzICp0ZXN0cykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGZhbGNvbl9yZWFkX252cmFtKGVmeCwgTlVMTCk7CisJdGVzdHMtPm52cmFtID0gcmMgPyAtMSA6IDE7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVmeF90ZXN0X2NoaXAoc3RydWN0IGVmeF9uaWMgKmVmeCwgc3RydWN0IGVmeF9zZWxmX3Rlc3RzICp0ZXN0cykKK3sKKwlpbnQgcmM7CisKKwkvKiBOb3Qgc3VwcG9ydGVkIG9uIEEtc2VyaWVzIHNpbGljb24gKi8KKwlpZiAoZmFsY29uX3JldihlZngpIDwgRkFMQ09OX1JFVl9CMCkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IGZhbGNvbl90ZXN0X3JlZ2lzdGVycyhlZngpOworCXRlc3RzLT5yZWdpc3RlcnMgPSByYyA/IC0xIDogMTsKKwlyZXR1cm4gcmM7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEwNyw3ICsxNTgsNyBAQAogCiAJLyogQUNLIGVhY2ggaW50ZXJydXB0aW5nIGV2ZW50IHF1ZXVlLiBSZWNlaXZpbmcgYW4gaW50ZXJydXB0IGR1ZSB0bwogCSAqIHRyYWZmaWMgYmVmb3JlIGEgdGVzdCBldmVudCBpcyByYWlzZWQgaXMgY29uc2lkZXJlZCBhIHBhc3MgKi8KLQllZnhfZm9yX2VhY2hfY2hhbm5lbF93aXRoX2ludGVycnVwdChjaGFubmVsLCBlZngpIHsKKwllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKIAkJaWYgKGNoYW5uZWwtPndvcmtfcGVuZGluZykKIAkJCWVmeF9wcm9jZXNzX2NoYW5uZWxfbm93KGNoYW5uZWwpOwogCQlpZiAoZWZ4LT5sYXN0X2lycV9jcHUgPj0gMCkKQEAgLTEzMiw0MSArMTgzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogVGVzdCBnZW5lcmF0aW9uIGFuZCByZWNlaXB0IG9mIG5vbi1pbnRlcnJ1cHRpbmcgZXZlbnRzICovCi1zdGF0aWMgaW50IGVmeF90ZXN0X2V2ZW50cShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkgICBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgKnRlc3RzKQotewotCXVuc2lnbmVkIGludCBtYWdpYzsKLQotCS8qIENoYW5uZWwgc3BlY2lmaWMgY29kZSwgbGltaXRlZCB0byAyMCBiaXRzICovCi0JbWFnaWMgPSAoMHgwMDAxMDE1MCArIGNoYW5uZWwtPmNoYW5uZWwpOwotCUVGWF9MT0coY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCB0ZXN0aW5nIGV2ZW50IHF1ZXVlIHdpdGggY29kZSAleFxuIiwKLQkJY2hhbm5lbC0+Y2hhbm5lbCwgbWFnaWMpOwotCi0JdGVzdHMtPmV2ZW50cV9kbWFbY2hhbm5lbC0+Y2hhbm5lbF0gPSAtMTsKLQl0ZXN0cy0+ZXZlbnRxX2ludFtjaGFubmVsLT5jaGFubmVsXSA9IDE7CS8qIGZha2UgcGFzcyAqLwotCXRlc3RzLT5ldmVudHFfcG9sbFtjaGFubmVsLT5jaGFubmVsXSA9IDE7CS8qIGZha2UgcGFzcyAqLwotCi0JLyogUmVzZXQgZmxhZyBhbmQgemVybyBtYWdpYyB3b3JkICovCi0JY2hhbm5lbC0+ZWZ4LT5sYXN0X2lycV9jcHUgPSAtMTsKLQljaGFubmVsLT5ldmVudHFfbWFnaWMgPSAwOwotCXNtcF93bWIoKTsKLQotCWZhbGNvbl9nZW5lcmF0ZV90ZXN0X2V2ZW50KGNoYW5uZWwsIG1hZ2ljKTsKLQl1ZGVsYXkoMSk7Ci0KLQllZnhfcHJvY2Vzc19jaGFubmVsX25vdyhjaGFubmVsKTsKLQlpZiAoY2hhbm5lbC0+ZXZlbnRxX21hZ2ljICE9IG1hZ2ljKSB7Ci0JCUVGWF9FUlIoY2hhbm5lbC0+ZWZ4LCAiY2hhbm5lbCAlZCAgZmFpbGVkIHRvIHNlZSB0ZXN0IGV2ZW50XG4iLAotCQkJY2hhbm5lbC0+Y2hhbm5lbCk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXRlc3RzLT5ldmVudHFfZG1hW2NoYW5uZWwtPmNoYW5uZWxdID0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogVGVzdCBnZW5lcmF0aW9uIGFuZCByZWNlaXB0IG9mIGludGVycnVwdGluZyBldmVudHMgKi8KIHN0YXRpYyBpbnQgZWZ4X3Rlc3RfZXZlbnRxX2lycShzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwsCiAJCQkgICAgICAgc3RydWN0IGVmeF9zZWxmX3Rlc3RzICp0ZXN0cykKQEAgLTIzMCwzOSArMjQ2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFBIWSB0ZXN0aW5nCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDaGVjayBQSFkgcHJlc2VuY2UgYnkgcmVhZGluZyB0aGUgUEhZIElEIHJlZ2lzdGVycyAqLwotc3RhdGljIGludCBlZnhfdGVzdF9waHkoc3RydWN0IGVmeF9uaWMgKmVmeCwKLQkJCXN0cnVjdCBlZnhfc2VsZl90ZXN0cyAqdGVzdHMpCitzdGF0aWMgaW50IGVmeF90ZXN0X3BoeShzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgKnRlc3RzKQogewotCXUxNiBwaHlzaWQxLCBwaHlzaWQyOwotCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpID0gJmVmeC0+bWlpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gZWZ4LT5uZXRfZGV2OworCWludCByYzsKIAotCWlmIChlZngtPnBoeV90eXBlID09IFBIWV9UWVBFX05PTkUpCisJaWYgKCFlZngtPnBoeV9vcC0+dGVzdCkKIAkJcmV0dXJuIDA7CiAKLQlFRlhfTE9HKGVmeCwgInRlc3RpbmcgUEhZIHByZXNlbmNlXG4iKTsKLQl0ZXN0cy0+cGh5X29rID0gLTE7Ci0KLQlwaHlzaWQxID0gbWlpLT5tZGlvX3JlYWQobmV0X2RldiwgbWlpLT5waHlfaWQsIE1JSV9QSFlTSUQxKTsKLQlwaHlzaWQyID0gbWlpLT5tZGlvX3JlYWQobmV0X2RldiwgbWlpLT5waHlfaWQsIE1JSV9QSFlTSUQyKTsKLQotCWlmICgocGh5c2lkMSAhPSAweDAwMDApICYmIChwaHlzaWQxICE9IDB4ZmZmZikgJiYKLQkgICAgKHBoeXNpZDIgIT0gMHgwMDAwKSAmJiAocGh5c2lkMiAhPSAweGZmZmYpKSB7Ci0JCUVGWF9MT0coZWZ4LCAiZm91bmQgTUlJIFBIWSAlZCBJRCAweCV4OiV4XG4iLAotCQkJbWlpLT5waHlfaWQsIHBoeXNpZDEsIHBoeXNpZDIpOwotCQl0ZXN0cy0+cGh5X29rID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JRUZYX0VSUihlZngsICJubyBNSUkgUEhZIHByZXNlbnQgd2l0aCBJRCAlZFxuIiwgbWlpLT5waHlfaWQpOwotCXJldHVybiAtRU5PREVWOworCW11dGV4X2xvY2soJmVmeC0+bWFjX2xvY2spOworCXJjID0gZWZ4LT5waHlfb3AtPnRlc3QoZWZ4KTsKKwltdXRleF91bmxvY2soJmVmeC0+bWFjX2xvY2spOworCXRlc3RzLT5waHkgPSByYyA/IC0xIDogMTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc4LDcgKzI3Myw3IEBACiB2b2lkIGVmeF9sb29wYmFja19yeF9wYWNrZXQoc3RydWN0IGVmeF9uaWMgKmVmeCwKIAkJCSAgICBjb25zdCBjaGFyICpidWZfcHRyLCBpbnQgcGt0X2xlbikKIHsKLQlzdHJ1Y3QgZWZ4X3NlbGZ0ZXN0X3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CisJc3RydWN0IGVmeF9sb29wYmFja19zdGF0ZSAqc3RhdGUgPSBlZngtPmxvb3BiYWNrX3NlbGZ0ZXN0OwogCXN0cnVjdCBlZnhfbG9vcGJhY2tfcGF5bG9hZCAqcmVjZWl2ZWQ7CiAJc3RydWN0IGVmeF9sb29wYmFja19wYXlsb2FkICpwYXlsb2FkOwogCkBAIC0yODksMTEgKzI4NCwxMiBAQAogCQlyZXR1cm47CiAKIAlwYXlsb2FkID0gJnN0YXRlLT5wYXlsb2FkOwotCQorCiAJcmVjZWl2ZWQgPSAoc3RydWN0IGVmeF9sb29wYmFja19wYXlsb2FkICopIGJ1Zl9wdHI7CiAJcmVjZWl2ZWQtPmlwLnNhZGRyID0gcGF5bG9hZC0+aXAuc2FkZHI7Ci0JcmVjZWl2ZWQtPmlwLmNoZWNrID0gcGF5bG9hZC0+aXAuY2hlY2s7Ci0JCisJaWYgKHN0YXRlLT5vZmZsb2FkX2NzdW0pCisJCXJlY2VpdmVkLT5pcC5jaGVjayA9IHBheWxvYWQtPmlwLmNoZWNrOworCiAJLyogQ2hlY2sgdGhhdCBoZWFkZXIgZXhpc3RzICovCiAJaWYgKHBrdF9sZW4gPCBzaXplb2YocmVjZWl2ZWQtPmhlYWRlcikpIHsKIAkJRUZYX0VSUihlZngsICJzYXcgcnVudCBSWCBwYWNrZXQgKGxlbmd0aCAlZCkgaW4gJXMgbG9vcGJhY2sgIgpAQCAtMzYyLDcgKzM1OCw3IEBACiAvKiBJbml0aWFsaXNlIGFuIGVmeF9zZWxmdGVzdF9zdGF0ZSBmb3IgYSBuZXcgaXRlcmF0aW9uICovCiBzdGF0aWMgdm9pZCBlZnhfaXRlcmF0ZV9zdGF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCXN0cnVjdCBlZnhfc2VsZnRlc3Rfc3RhdGUgKnN0YXRlID0gZWZ4LT5sb29wYmFja19zZWxmdGVzdDsKKwlzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBlZngtPm5ldF9kZXY7CiAJc3RydWN0IGVmeF9sb29wYmFja19wYXlsb2FkICpwYXlsb2FkID0gJnN0YXRlLT5wYXlsb2FkOwogCkBAIC0zOTUsMTcgKzM5MSwxNyBAQAogCXNtcF93bWIoKTsKIH0KIAotc3RhdGljIGludCBlZnhfdHhfbG9vcGJhY2soc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCitzdGF0aWMgaW50IGVmeF9iZWdpbl9sb29wYmFjayhzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSkKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gdHhfcXVldWUtPmVmeDsKLQlzdHJ1Y3QgZWZ4X3NlbGZ0ZXN0X3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CisJc3RydWN0IGVmeF9sb29wYmFja19zdGF0ZSAqc3RhdGUgPSBlZngtPmxvb3BiYWNrX3NlbGZ0ZXN0OwogCXN0cnVjdCBlZnhfbG9vcGJhY2tfcGF5bG9hZCAqcGF5bG9hZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpLCByYzsKIAogCS8qIFRyYW5zbWl0IE4gY29waWVzIG9mIGJ1ZmZlciAqLwogCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGFja2V0X2NvdW50OyBpKyspIHsKLQkJLyogQWxsb2NhdGUgYW4gc2tiLCBob2xkaW5nIGFuIGV4dHJhIHJlZmVyZW5jZSBmb3IgCisJCS8qIEFsbG9jYXRlIGFuIHNrYiwgaG9sZGluZyBhbiBleHRyYSByZWZlcmVuY2UgZm9yCiAJCSAqIHRyYW5zbWl0IGNvbXBsZXRpb24gY291bnRpbmcgKi8KIAkJc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdGF0ZS0+cGF5bG9hZCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXNrYikKQEAgLTQ0NCwxMSArNDQwLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZWZ4X3J4X2xvb3BiYWNrKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAotCQkJICAgc3RydWN0IGVmeF9sb29wYmFja19zZWxmX3Rlc3RzICpsYl90ZXN0cykKK3N0YXRpYyBpbnQgZWZ4X3BvbGxfbG9vcGJhY2soc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CisJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsOworCisJLyogTkFQSSBwb2xsaW5nIGlzIG5vdCBlbmFibGVkLCBzbyBwcm9jZXNzIGNoYW5uZWxzCisJICogc3luY2hyb25vdXNseSAqLworCWVmeF9mb3JfZWFjaF9jaGFubmVsKGNoYW5uZWwsIGVmeCkgeworCQlpZiAoY2hhbm5lbC0+d29ya19wZW5kaW5nKQorCQkJZWZ4X3Byb2Nlc3NfY2hhbm5lbF9ub3coY2hhbm5lbCk7CisJfQorCXJldHVybiBhdG9taWNfcmVhZCgmc3RhdGUtPnJ4X2dvb2QpID09IHN0YXRlLT5wYWNrZXRfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZWZ4X2VuZF9sb29wYmFjayhzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKKwkJCSAgICBzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3NlbGZfdGVzdHMgKmxiX3Rlc3RzKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OwotCXN0cnVjdCBlZnhfc2VsZnRlc3Rfc3RhdGUgKnN0YXRlID0gZWZ4LT5sb29wYmFja19zZWxmdGVzdDsKKwlzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgdHhfZG9uZSA9IDAsIHJ4X2dvb2QsIHJ4X2JhZDsKIAlpbnQgaSwgcmMgPSAwOwpAQCAtNTA3LDExICs1MTcsMTAgQEAKIAkJICBzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3NlbGZfdGVzdHMgKmxiX3Rlc3RzKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OwotCXN0cnVjdCBlZnhfc2VsZnRlc3Rfc3RhdGUgKnN0YXRlID0gZWZ4LT5sb29wYmFja19zZWxmdGVzdDsKLQlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7Ci0JaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7CisJaW50IGksIGJlZ2luX3JjLCBlbmRfcmM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbG9vcGJhY2tfdGVzdF9sZXZlbDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQkvKiBEZXRlcm1pbmUgaG93IG1hbnkgcGFja2V0cyB0byBzZW5kICovCiAJCXN0YXRlLT5wYWNrZXRfY291bnQgPSAoZWZ4LT50eXBlLT50eGRfcmluZ19tYXNrICsgMSkgLyAzOwogCQlzdGF0ZS0+cGFja2V0X2NvdW50ID0gbWluKDEgPDwgKGkgPDwgMiksIHN0YXRlLT5wYWNrZXRfY291bnQpOwpAQCAtNTE5LDMwICs1MjgsMzEgQEAKIAkJCQkgICAgICBzdGF0ZS0+cGFja2V0X2NvdW50LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzdGF0ZS0+c2ticykKIAkJCXJldHVybiAtRU5PTUVNOwotCQlzdGF0ZS0+Zmx1c2ggPSAwOworCQlzdGF0ZS0+Zmx1c2ggPSBmYWxzZTsKIAogCQlFRlhfTE9HKGVmeCwgIlRYIHF1ZXVlICVkIHRlc3RpbmcgJXMgbG9vcGJhY2sgd2l0aCAlZCAiCiAJCQkicGFja2V0c1xuIiwgdHhfcXVldWUtPnF1ZXVlLCBMT09QQkFDS19NT0RFKGVmeCksCiAJCQlzdGF0ZS0+cGFja2V0X2NvdW50KTsKIAogCQllZnhfaXRlcmF0ZV9zdGF0ZShlZngpOwotCQlyYyA9IGVmeF90eF9sb29wYmFjayh0eF9xdWV1ZSk7Ci0JCQotCQkvKiBOQVBJIHBvbGxpbmcgaXMgbm90IGVuYWJsZWQsIHNvIHByb2Nlc3MgY2hhbm5lbHMgc3luY2hyb25vdXNseSAqLwotCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWiAvIDUwKTsKLQkJZWZ4X2Zvcl9lYWNoX2NoYW5uZWxfd2l0aF9pbnRlcnJ1cHQoY2hhbm5lbCwgZWZ4KSB7Ci0JCQlpZiAoY2hhbm5lbC0+d29ya19wZW5kaW5nKQotCQkJCWVmeF9wcm9jZXNzX2NoYW5uZWxfbm93KGNoYW5uZWwpOworCQliZWdpbl9yYyA9IGVmeF9iZWdpbl9sb29wYmFjayh0eF9xdWV1ZSk7CisKKwkJLyogVGhpcyB3aWxsIG5vcm1hbGx5IGNvbXBsZXRlIHZlcnkgcXVpY2tseSwgYnV0IGJlCisJCSAqIHByZXBhcmVkIHRvIHdhaXQgdXAgdG8gMTAwIG1zLiAqLworCQltc2xlZXAoMSk7CisJCWlmICghZWZ4X3BvbGxfbG9vcGJhY2soZWZ4KSkgeworCQkJbXNsZWVwKDEwMCk7CisJCQllZnhfcG9sbF9sb29wYmFjayhlZngpOwogCQl9CiAKLQkJcmMgfD0gZWZ4X3J4X2xvb3BiYWNrKHR4X3F1ZXVlLCBsYl90ZXN0cyk7CisJCWVuZF9yYyA9IGVmeF9lbmRfbG9vcGJhY2sodHhfcXVldWUsIGxiX3Rlc3RzKTsKIAkJa2ZyZWUoc3RhdGUtPnNrYnMpOwogCi0JCWlmIChyYykgeworCQlpZiAoYmVnaW5fcmMgfHwgZW5kX3JjKSB7CiAJCQkvKiBXYWl0IGEgd2hpbGUgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBwYWNrZXRzCiAJCQkgKiBmbG9hdGluZyBhcm91bmQgYWZ0ZXIgYSBmYWlsdXJlLiAqLwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogLyAxMCk7Ci0JCQlyZXR1cm4gcmM7CisJCQlyZXR1cm4gYmVnaW5fcmMgPyBiZWdpbl9yYyA6IGVuZF9yYzsKIAkJfQogCX0KIApAQCAtNTUwLDQ5ICs1NjAsMzYgQEAKIAkJIm9mICVkIHBhY2tldHNcbiIsIHR4X3F1ZXVlLT5xdWV1ZSwgTE9PUEJBQ0tfTU9ERShlZngpLAogCQlzdGF0ZS0+cGFja2V0X2NvdW50KTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlZnhfdGVzdF9sb29wYmFja3Moc3RydWN0IGVmeF9uaWMgKmVmeCwKK3N0YXRpYyBpbnQgZWZ4X3Rlc3RfbG9vcGJhY2tzKHN0cnVjdCBlZnhfbmljICplZngsIHN0cnVjdCBldGh0b29sX2NtZCBlY21kLAogCQkJICAgICAgc3RydWN0IGVmeF9zZWxmX3Rlc3RzICp0ZXN0cywKIAkJCSAgICAgIHVuc2lnbmVkIGludCBsb29wYmFja19tb2RlcykKIHsKLQlzdHJ1Y3QgZWZ4X3NlbGZ0ZXN0X3N0YXRlICpzdGF0ZSA9IGVmeC0+bG9vcGJhY2tfc2VsZnRlc3Q7Ci0Jc3RydWN0IGV0aHRvb2xfY21kIGVjbWQsIGVjbWRfbG9vcGJhY2s7CisJZW51bSBlZnhfbG9vcGJhY2tfbW9kZSBtb2RlOworCXN0cnVjdCBlZnhfbG9vcGJhY2tfc3RhdGUgKnN0YXRlOwogCXN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlOwotCWVudW0gZWZ4X2xvb3BiYWNrX21vZGUgb2xkX21vZGUsIG1vZGU7Ci0JaW50IGNvdW50LCByYyA9IDAsIGxpbmtfdXA7Ci0JCi0JcmMgPSBlZnhfZXRodG9vbF9nZXRfc2V0dGluZ3MoZWZ4LT5uZXRfZGV2LCAmZWNtZCk7Ci0JaWYgKHJjKSB7Ci0JCUVGWF9FUlIoZWZ4LCAiY291bGQgbm90IGdldCBHTUlJIHNldHRpbmdzXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlvbGRfbW9kZSA9IGVmeC0+bG9vcGJhY2tfbW9kZTsKKwlib29sIGxpbmtfdXA7CisJaW50IGNvdW50LCByYyA9IDA7CiAKLQkvKiBEaXNhYmxlIGF1dG9uZWdvdGlhdGlvbiBmb3IgdGhlIHB1cnBvc2VzIG9mIGxvb3BiYWNrICovCi0JbWVtY3B5KCZlY21kX2xvb3BiYWNrLCAmZWNtZCwgc2l6ZW9mKGVjbWRfbG9vcGJhY2spKTsKLQlpZiAoZWNtZF9sb29wYmFjay5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCWVjbWRfbG9vcGJhY2suYXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKLQkJZWNtZF9sb29wYmFjay5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJZWNtZF9sb29wYmFjay5zcGVlZCA9IFNQRUVEXzEwMDAwOwotCX0KLQotCXJjID0gZWZ4X2V0aHRvb2xfc2V0X3NldHRpbmdzKGVmeC0+bmV0X2RldiwgJmVjbWRfbG9vcGJhY2spOwotCWlmIChyYykgewotCQlFRlhfRVJSKGVmeCwgImNvdWxkIG5vdCBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvblxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQl0ZXN0cy0+bG9vcGJhY2tfc3BlZWQgPSBlY21kX2xvb3BiYWNrLnNwZWVkOwotCXRlc3RzLT5sb29wYmFja19mdWxsX2R1cGxleCA9IGVjbWRfbG9vcGJhY2suZHVwbGV4OworCS8qIFNldCB0aGUgcG9ydCBsb29wYmFja19zZWxmdGVzdCBtZW1iZXIuIEZyb20gdGhpcyBwb2ludCBvbgorCSAqIGFsbCByZWNlaXZlZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZC4gTWFyayB0aGUgc3RhdGUgYXMKKwkgKiAiZmx1c2hpbmciIHNvIGFsbCBpbmZsaWdodCBwYWNrZXRzIGFyZSBkcm9wcGVkICovCisJc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJQlVHX09OKGVmeC0+bG9vcGJhY2tfc2VsZnRlc3QpOworCXN0YXRlLT5mbHVzaCA9IHRydWU7CisJZWZ4LT5sb29wYmFja19zZWxmdGVzdCA9IHN0YXRlOwogCiAJLyogVGVzdCBhbGwgc3VwcG9ydGVkIGxvb3BiYWNrIG1vZGVzICovCi0JZm9yIChtb2RlID0gTE9PUEJBQ0tfTk9ORTsgbW9kZSA8IExPT1BCQUNLX1RFU1RfTUFYOyBtb2RlKyspIHsKKwlmb3IgKG1vZGUgPSBMT09QQkFDS19OT05FOyBtb2RlIDw9IExPT1BCQUNLX1RFU1RfTUFYOyBtb2RlKyspIHsKIAkJaWYgKCEobG9vcGJhY2tfbW9kZXMgJiAoMSA8PCBtb2RlKSkpCiAJCQljb250aW51ZTsKIAogCQkvKiBNb3ZlIHRoZSBwb3J0IGludG8gdGhlIHNwZWNpZmllZCBsb29wYmFjayBtb2RlLiAqLwotCQlzdGF0ZS0+Zmx1c2ggPSAxOworCQlzdGF0ZS0+Zmx1c2ggPSB0cnVlOwogCQllZngtPmxvb3BiYWNrX21vZGUgPSBtb2RlOwogCQllZnhfcmVjb25maWd1cmVfcG9ydChlZngpOwogCkBAIC02MTYsNyArNjEzLDcgQEAKIAkJCSAqLwogCQkJbGlua191cCA9IGVmeC0+bGlua191cDsKIAkJCWlmICghZmFsY29uX3hhdWlfbGlua19vayhlZngpKQotCQkJCWxpbmtfdXAgPSAwOworCQkJCWxpbmtfdXAgPSBmYWxzZTsKIAogCQl9IHdoaWxlICgoKytjb3VudCA8IDIwKSAmJiAhbGlua191cCk7CiAKQEAgLTYzNCwxOCArNjMxLDIxIEBACiAKIAkJLyogVGVzdCBldmVyeSBUWCBxdWV1ZSAqLwogCQllZnhfZm9yX2VhY2hfdHhfcXVldWUodHhfcXVldWUsIGVmeCkgewotCQkJcmMgfD0gZWZ4X3Rlc3RfbG9vcGJhY2sodHhfcXVldWUsCi0JCQkJCQkmdGVzdHMtPmxvb3BiYWNrW21vZGVdKTsKKwkJCXN0YXRlLT5vZmZsb2FkX2NzdW0gPSAodHhfcXVldWUtPnF1ZXVlID09CisJCQkJCSAgICAgICBFRlhfVFhfUVVFVUVfT0ZGTE9BRF9DU1VNKTsKKwkJCXJjID0gZWZ4X3Rlc3RfbG9vcGJhY2sodHhfcXVldWUsCisJCQkJCSAgICAgICAmdGVzdHMtPmxvb3BiYWNrW21vZGVdKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG91dDsKIAkJfQogCX0KIAogIG91dDoKLQkvKiBUYWtlIG91dCBvZiBsb29wYmFjayBhbmQgcmVzdG9yZSBQSFkgc2V0dGluZ3MgKi8KLQlzdGF0ZS0+Zmx1c2ggPSAxOwotCWVmeC0+bG9vcGJhY2tfbW9kZSA9IG9sZF9tb2RlOwotCWVmeF9ldGh0b29sX3NldF9zZXR0aW5ncyhlZngtPm5ldF9kZXYsICZlY21kKTsKKwkvKiBSZW1vdmUgdGhlIGZsdXNoLiBUaGUgY2FsbGVyIHdpbGwgcmVtb3ZlIHRoZSBsb29wYmFjayBzZXR0aW5nICovCisJc3RhdGUtPmZsdXNoID0gdHJ1ZTsKKwllZngtPmxvb3BiYWNrX3NlbGZ0ZXN0ID0gTlVMTDsKKwl3bWIoKTsKKwlrZnJlZShzdGF0ZSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC02NjEsMjMgKzY2MSwyNyBAQAogaW50IGVmeF9vbmxpbmVfdGVzdChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgKnRlc3RzKQogewogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbDsKLQlpbnQgcmMgPSAwOworCWludCByYywgcmMyID0gMDsKIAotCUVGWF9MT0coZWZ4LCAicGVyZm9ybWluZyBvbmxpbmUgc2VsZi10ZXN0c1xuIik7CisJcmMgPSBlZnhfdGVzdF9taWkoZWZ4LCB0ZXN0cyk7CisJaWYgKHJjICYmICFyYzIpCisJCXJjMiA9IHJjOwogCi0JcmMgfD0gZWZ4X3Rlc3RfaW50ZXJydXB0cyhlZngsIHRlc3RzKTsKKwlyYyA9IGVmeF90ZXN0X252cmFtKGVmeCwgdGVzdHMpOworCWlmIChyYyAmJiAhcmMyKQorCQlyYzIgPSByYzsKKworCXJjID0gZWZ4X3Rlc3RfaW50ZXJydXB0cyhlZngsIHRlc3RzKTsKKwlpZiAocmMgJiYgIXJjMikKKwkJcmMyID0gcmM7CisKIAllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKLQkJaWYgKGNoYW5uZWwtPmhhc19pbnRlcnJ1cHQpCi0JCQlyYyB8PSBlZnhfdGVzdF9ldmVudHFfaXJxKGNoYW5uZWwsIHRlc3RzKTsKLQkJZWxzZQotCQkJcmMgfD0gZWZ4X3Rlc3RfZXZlbnRxKGNoYW5uZWwsIHRlc3RzKTsKKwkJcmMgPSBlZnhfdGVzdF9ldmVudHFfaXJxKGNoYW5uZWwsIHRlc3RzKTsKKwkJaWYgKHJjICYmICFyYzIpCisJCQlyYzIgPSByYzsKIAl9Ci0JcmMgfD0gZWZ4X3Rlc3RfcGh5KGVmeCwgdGVzdHMpOwogCi0JaWYgKHJjKQotCQlFRlhfRVJSKGVmeCwgImZhaWxlZCBvbmxpbmUgc2VsZi10ZXN0c1xuIik7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIHJjMjsKIH0KIAogLyogT2ZmbGluZSAoaS5lLiBkaXNydXB0aXZlKSB0ZXN0aW5nCkBAIC02ODUsMzUgKzY4OSw2NiBAQAogaW50IGVmeF9vZmZsaW5lX3Rlc3Qoc3RydWN0IGVmeF9uaWMgKmVmeCwKIAkJICAgICBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgKnRlc3RzLCB1bnNpZ25lZCBpbnQgbG9vcGJhY2tfbW9kZXMpCiB7Ci0Jc3RydWN0IGVmeF9zZWxmdGVzdF9zdGF0ZSAqc3RhdGU7Ci0JaW50IHJjID0gMDsKKwllbnVtIGVmeF9sb29wYmFja19tb2RlIGxvb3BiYWNrX21vZGUgPSBlZngtPmxvb3BiYWNrX21vZGU7CisJaW50IHBoeV9tb2RlID0gZWZ4LT5waHlfbW9kZTsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZCwgZWNtZF90ZXN0OworCWludCByYywgcmMyID0gMDsKIAotCUVGWF9MT0coZWZ4LCAicGVyZm9ybWluZyBvZmZsaW5lIHNlbGYtdGVzdHNcbiIpOworCS8qIGZvcmNlIHRoZSBjYXJyaWVyIHN0YXRlIG9mZiBzbyB0aGUga2VybmVsIGRvZXNuJ3QgdHJhbnNtaXQgZHVyaW5nCisJICogdGhlIGxvb3BiYWNrIHRlc3QsIGFuZCB0aGUgd2F0Y2hkb2cgdGltZW91dCBkb2Vzbid0IGZpcmUuIEFsc28gcHV0CisJICogZmFsY29uIGludG8gbG9vcGJhY2sgZm9yIHRoZSByZWdpc3RlciB0ZXN0LgorCSAqLworCW11dGV4X2xvY2soJmVmeC0+bWFjX2xvY2spOworCWVmeC0+cG9ydF9pbmhpYml0ZWQgPSB0cnVlOworCWlmIChlZngtPmxvb3BiYWNrX21vZGVzKQorCQllZngtPmxvb3BiYWNrX21vZGUgPSBfX2ZmcyhlZngtPmxvb3BiYWNrX21vZGVzKTsKKwlfX2VmeF9yZWNvbmZpZ3VyZV9wb3J0KGVmeCk7CisJbXV0ZXhfdW5sb2NrKCZlZngtPm1hY19sb2NrKTsKIAotCS8qIENyZWF0ZSBhIHNlbGZ0ZXN0X3N0YXRlIHN0cnVjdHVyZSB0byBob2xkIHN0YXRlIGZvciB0aGUgdGVzdCAqLwotCXN0YXRlID0ga3phbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkvKiBmcmVlIHVwIGFsbCBjb25zdW1lcnMgb2YgU1JBTSAoaW5jbHVkaW5nIGFsbCB0aGUgcXVldWVzKSAqLworCWVmeF9yZXNldF9kb3duKGVmeCwgJmVjbWQpOworCisJcmMgPSBlZnhfdGVzdF9jaGlwKGVmeCwgdGVzdHMpOworCWlmIChyYyAmJiAhcmMyKQorCQlyYzIgPSByYzsKKworCS8qIHJlc2V0IHRoZSBjaGlwIHRvIHJlY292ZXIgZnJvbSB0aGUgcmVnaXN0ZXIgdGVzdCAqLworCXJjID0gZmFsY29uX3Jlc2V0X2h3KGVmeCwgUkVTRVRfVFlQRV9BTEwpOworCisJLyogTW9kaWZ5IHRoZSBzYXZlZCBlY21kIHNvIHRoYXQgd2hlbiBlZnhfcmVzZXRfdXAoKSByZXN0b3JlcyB0aGUgcGh5CisJICogc3RhdGUsIEFOIGlzIGRpc2FibGVkLCBhbmQgdGhlIHBoeSBpcyBwb3dlcmVkLCBhbmQgb3V0IG9mIGxvb3BiYWNrICovCisJbWVtY3B5KCZlY21kX3Rlc3QsICZlY21kLCBzaXplb2YoZWNtZF90ZXN0KSk7CisJaWYgKGVjbWRfdGVzdC5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWVjbWRfdGVzdC5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQllY21kX3Rlc3QuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVjbWRfdGVzdC5zcGVlZCA9IFNQRUVEXzEwMDAwOworCX0KKwllZngtPmxvb3BiYWNrX21vZGUgPSBMT09QQkFDS19OT05FOworCisJcmMgPSBlZnhfcmVzZXRfdXAoZWZ4LCAmZWNtZF90ZXN0LCByYyA9PSAwKTsKKwlpZiAocmMpIHsKKwkJRUZYX0VSUihlZngsICJVbmFibGUgdG8gcmVjb3ZlciBmcm9tIGNoaXAgdGVzdFxuIik7CisJCWVmeF9zY2hlZHVsZV9yZXNldChlZngsIFJFU0VUX1RZUEVfRElTQUJMRSk7CisJCXJldHVybiByYzsKIAl9CiAKLQkvKiBTZXQgdGhlIHBvcnQgbG9vcGJhY2tfc2VsZnRlc3QgbWVtYmVyLiBGcm9tIHRoaXMgcG9pbnQgb24KLQkgKiBhbGwgcmVjZWl2ZWQgcGFja2V0cyB3aWxsIGJlIGRyb3BwZWQuIE1hcmsgdGhlIHN0YXRlIGFzCi0JICogImZsdXNoaW5nIiBzbyBhbGwgaW5mbGlnaHQgcGFja2V0cyBhcmUgZHJvcHBlZCAqLwotCUJVR19PTihlZngtPmxvb3BiYWNrX3NlbGZ0ZXN0KTsKLQlzdGF0ZS0+Zmx1c2ggPSAxOwotCWVmeC0+bG9vcGJhY2tfc2VsZnRlc3QgPSBzdGF0ZTsKKwl0ZXN0cy0+bG9vcGJhY2tfc3BlZWQgPSBlY21kX3Rlc3Quc3BlZWQ7CisJdGVzdHMtPmxvb3BiYWNrX2Z1bGxfZHVwbGV4ID0gZWNtZF90ZXN0LmR1cGxleDsKIAotCXJjID0gZWZ4X3Rlc3RfbG9vcGJhY2tzKGVmeCwgdGVzdHMsIGxvb3BiYWNrX21vZGVzKTsKKwlyYyA9IGVmeF90ZXN0X3BoeShlZngsIHRlc3RzKTsKKwlpZiAocmMgJiYgIXJjMikKKwkJcmMyID0gcmM7CiAKLQllZngtPmxvb3BiYWNrX3NlbGZ0ZXN0ID0gTlVMTDsKLQl3bWIoKTsKLQlrZnJlZShzdGF0ZSk7CisJcmMgPSBlZnhfdGVzdF9sb29wYmFja3MoZWZ4LCBlY21kX3Rlc3QsIHRlc3RzLCBsb29wYmFja19tb2Rlcyk7CisJaWYgKHJjICYmICFyYzIpCisJCXJjMiA9IHJjOwogCi0gb3V0OgotCWlmIChyYykKLQkJRUZYX0VSUihlZngsICJmYWlsZWQgb2ZmbGluZSBzZWxmLXRlc3RzXG4iKTsKKwkvKiByZXN0b3JlIHRoZSBQSFkgdG8gdGhlIHByZXZpb3VzIHN0YXRlICovCisJZWZ4LT5sb29wYmFja19tb2RlID0gbG9vcGJhY2tfbW9kZTsKKwllZngtPnBoeV9tb2RlID0gcGh5X21vZGU7CisJZWZ4LT5wb3J0X2luaGliaXRlZCA9IGZhbHNlOworCWVmeF9ldGh0b29sX3NldF9zZXR0aW5ncyhlZngtPm5ldF9kZXYsICZlY21kKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gcmMyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvc2VsZnRlc3QuaCBiL2RyaXZlcnMvbmV0L3NmYy9zZWxmdGVzdC5oCmluZGV4IGY2OTk5YzIuLmZjMTVkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9zZWxmdGVzdC5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9zZWxmdGVzdC5oCkBAIC0xOCw4ICsxOCw4IEBACiAgKi8KIAogc3RydWN0IGVmeF9sb29wYmFja19zZWxmX3Rlc3RzIHsKLQlpbnQgdHhfc2VudFtFRlhfTUFYX1RYX1FVRVVFU107Ci0JaW50IHR4X2RvbmVbRUZYX01BWF9UWF9RVUVVRVNdOworCWludCB0eF9zZW50W0VGWF9UWF9RVUVVRV9DT1VOVF07CisJaW50IHR4X2RvbmVbRUZYX1RYX1FVRVVFX0NPVU5UXTsKIAlpbnQgcnhfZ29vZDsKIAlpbnQgcnhfYmFkOwogfTsKQEAgLTI5LDE0ICsyOSwxOSBAQAogICogaW5kaWNhdGVzIGZhaWx1cmUuCiAgKi8KIHN0cnVjdCBlZnhfc2VsZl90ZXN0cyB7CisJLyogb25saW5lIHRlc3RzICovCisJaW50IG1paTsKKwlpbnQgbnZyYW07CiAJaW50IGludGVycnVwdDsKIAlpbnQgZXZlbnRxX2RtYVtFRlhfTUFYX0NIQU5ORUxTXTsKIAlpbnQgZXZlbnRxX2ludFtFRlhfTUFYX0NIQU5ORUxTXTsKIAlpbnQgZXZlbnRxX3BvbGxbRUZYX01BWF9DSEFOTkVMU107Ci0JaW50IHBoeV9vazsKKwkvKiBvZmZsaW5lIHRlc3RzICovCisJaW50IHJlZ2lzdGVyczsKKwlpbnQgcGh5OwogCWludCBsb29wYmFja19zcGVlZDsKIAlpbnQgbG9vcGJhY2tfZnVsbF9kdXBsZXg7Ci0Jc3RydWN0IGVmeF9sb29wYmFja19zZWxmX3Rlc3RzIGxvb3BiYWNrW0xPT1BCQUNLX1RFU1RfTUFYXTsKKwlzdHJ1Y3QgZWZ4X2xvb3BiYWNrX3NlbGZfdGVzdHMgbG9vcGJhY2tbTE9PUEJBQ0tfVEVTVF9NQVggKyAxXTsKIH07CiAKIGV4dGVybiB2b2lkIGVmeF9sb29wYmFja19yeF9wYWNrZXQoc3RydWN0IGVmeF9uaWMgKmVmeCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9zZmU0MDAxLmMgYi9kcml2ZXJzL25ldC9zZmMvc2ZlNDAwMS5jCmluZGV4IGIyNzg0OTUuLmZlNGUzZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9zZmU0MDAxLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3NmZTQwMDEuYwpAQCAtMTMsMTEgKzEzLDEzIEBACiAgKiB0aGUgUEhZCiAgKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgIm5ldF9kcml2ZXIuaCIKICNpbmNsdWRlICJlZnguaCIKICNpbmNsdWRlICJwaHkuaCIKICNpbmNsdWRlICJib2FyZHMuaCIKICNpbmNsdWRlICJmYWxjb24uaCIKICNpbmNsdWRlICJmYWxjb25faHdkZWZzLmgiCisjaW5jbHVkZSAiZmFsY29uX2lvLmgiCiAjaW5jbHVkZSAibWFjLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIwLDY1ICsxMjIsMTU5IEBACiAJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGh3bW9uX2NsaWVudCwgUlNMKTsKIH0KIAorc3RhdGljIGludCBzZmU0MDAxX3Bvd2Vyb24oc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaHdtb25fY2xpZW50ID0gZWZ4LT5ib2FyZF9pbmZvLmh3bW9uX2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaW9leHBfY2xpZW50ID0gZWZ4LT5ib2FyZF9pbmZvLmlvZXhwX2NsaWVudDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlpbnQgcmM7CisJdTggb3V0OworCisJLyogQ2xlYXIgYW55IHByZXZpb3VzIG92ZXItdGVtcGVyYXR1cmUgYWxlcnQgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShod21vbl9jbGllbnQsIFJTTCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogRW5hYmxlIHBvcnQgMCBhbmQgcG9ydCAxIG91dHB1dHMgb24gSU8gZXhwYW5kZXIgKi8KKwlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMF9DT05GSUcsIDB4MDApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAxX0NPTkZJRywKKwkJCQkgICAgICAgMHhmZiAmIH4oMSA8PCBQMV9TUEFSRV9MQk4pKTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbF9vbjsKKworCS8qIElmIFBIWSBwb3dlciBpcyBvbiwgdHVybiBpdCBhbGwgb2ZmIGFuZCB3YWl0IDEgc2Vjb25kIHRvCisJICogZW5zdXJlIGEgZnVsbCByZXNldC4KKwkgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAwX09VVCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsX29uOworCW91dCA9IDB4ZmYgJiB+KCgwIDw8IFAwX0VOXzFWMl9MQk4pIHwgKDAgPDwgUDBfRU5fMlY1X0xCTikgfAorCQkgICAgICAgKDAgPDwgUDBfRU5fM1YzWF9MQk4pIHwgKDAgPDwgUDBfRU5fNVZfTEJOKSB8CisJCSAgICAgICAoMCA8PCBQMF9FTl8xVjBYX0xCTikpOworCWlmIChyYyAhPSBvdXQpIHsKKwkJRUZYX0lORk8oZWZ4LCAicG93ZXItY3ljbGluZyBQSFlcbiIpOworCQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMF9PVVQsIG91dCk7CisJCWlmIChyYykKKwkJCWdvdG8gZmFpbF9vbjsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyMDsgKytpKSB7CisJCS8qIFR1cm4gb24gMS4yViwgMi41ViwgMy4zViBhbmQgNVYgcG93ZXIgcmFpbHMgKi8KKwkJb3V0ID0gMHhmZiAmIH4oKDEgPDwgUDBfRU5fMVYyX0xCTikgfCAoMSA8PCBQMF9FTl8yVjVfTEJOKSB8CisJCQkgICAgICAgKDEgPDwgUDBfRU5fM1YzWF9MQk4pIHwgKDEgPDwgUDBfRU5fNVZfTEJOKSB8CisJCQkgICAgICAgKDEgPDwgUDBfWF9UUlNUX0xCTikpOworCQlpZiAoZWZ4LT5waHlfbW9kZSAmIFBIWV9NT0RFX1NQRUNJQUwpCisJCQlvdXQgfD0gMSA8PCBQMF9FTl8zVjNYX0xCTjsKKworCQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMF9PVVQsIG91dCk7CisJCWlmIChyYykKKwkJCWdvdG8gZmFpbF9vbjsKKwkJbXNsZWVwKDEwKTsKKworCQkvKiBUdXJuIG9uIDFWIHBvd2VyIHJhaWwgKi8KKwkJb3V0ICY9IH4oMSA8PCBQMF9FTl8xVjBYX0xCTik7CisJCXJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAwX09VVCwgb3V0KTsKKwkJaWYgKHJjKQorCQkJZ290byBmYWlsX29uOworCisJCUVGWF9JTkZPKGVmeCwgIndhaXRpbmcgZm9yIERTUCBib290IChhdHRlbXB0ICVkKS4uLlxuIiwgaSk7CisKKwkJLyogSW4gZmxhc2ggY29uZmlnIG1vZGUsIERTUCBkb2VzIG5vdCB0dXJuIG9uIEFGRSwgc28KKwkJICoganVzdCB3YWl0IDEgc2Vjb25kLgorCQkgKi8KKwkJaWYgKGVmeC0+cGh5X21vZGUgJiBQSFlfTU9ERV9TUEVDSUFMKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCAxMDsgKytqKSB7CisJCQltc2xlZXAoMTAwKTsKKworCQkJLyogQ2hlY2sgRFNQIGhhcyBhc3NlcnRlZCBBRkUgcG93ZXIgbGluZSAqLworCQkJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMV9JTik7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZmFpbF9vbjsKKwkJCWlmIChyYyAmICgxIDw8IFAxX0FGRV9QV0RfTEJOKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCUVGWF9JTkZPKGVmeCwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBEU1AgYm9vdFxuIik7CisJcmMgPSAtRVRJTUVET1VUOworZmFpbF9vbjoKKwlzZmU0MDAxX3Bvd2Vyb2ZmKGVmeCk7CisJcmV0dXJuIHJjOworfQorCisvKiBPbiBTRkU0MDAxIHJldiBBMiBhbmQgbGF0ZXIsIHdlIGNhbiBjb250cm9sIHRoZSBGTEFTSF9DRkdfMSBwaW4KKyAqIHVzaW5nIHRoZSAzVjNYIG91dHB1dCBvZiB0aGUgSU8tZXhwYW5kZXIuICBBbGxvdyB0aGUgdXNlciB0byBzZXQKKyAqIHRoaXMgd2hlbiB0aGUgZGV2aWNlIGlzIHN0b3BwZWQsIGFuZCBrZWVwIGl0IHN0b3BwZWQgdGhlbi4KKyAqLworCitzdGF0aWMgc3NpemVfdCBzaG93X3BoeV9mbGFzaF9jZmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGVmeC0+cGh5X21vZGUgJiBQSFlfTU9ERV9TUEVDSUFMKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9waHlfZmxhc2hfY2ZnKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlZnhfbmljICplZnggPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwllbnVtIGVmeF9waHlfbW9kZSBvbGRfbW9kZSwgbmV3X21vZGU7CisJaW50IGVycjsKKworCXJ0bmxfbG9jaygpOworCW9sZF9tb2RlID0gZWZ4LT5waHlfbW9kZTsKKwlpZiAoY291bnQgPT0gMCB8fCAqYnVmID09ICcwJykKKwkJbmV3X21vZGUgPSBvbGRfbW9kZSAmIH5QSFlfTU9ERV9TUEVDSUFMOworCWVsc2UKKwkJbmV3X21vZGUgPSBQSFlfTU9ERV9TUEVDSUFMOworCWlmIChvbGRfbW9kZSA9PSBuZXdfbW9kZSkgeworCQllcnIgPSAwOworCX0gZWxzZSBpZiAoZWZ4LT5zdGF0ZSAhPSBTVEFURV9SVU5OSU5HIHx8IG5ldGlmX3J1bm5pbmcoZWZ4LT5uZXRfZGV2KSkgeworCQllcnIgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJZWZ4LT5waHlfbW9kZSA9IG5ld19tb2RlOworCQllcnIgPSBzZmU0MDAxX3Bvd2Vyb24oZWZ4KTsKKwkJZWZ4X3JlY29uZmlndXJlX3BvcnQoZWZ4KTsKKwl9CisJcnRubF91bmxvY2soKTsKKworCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHBoeV9mbGFzaF9jZmcsIDA2NDQsIHNob3dfcGh5X2ZsYXNoX2NmZywgc2V0X3BoeV9mbGFzaF9jZmcpOworCiBzdGF0aWMgdm9pZCBzZmU0MDAxX2Zpbmkoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAlFRlhfSU5GTyhlZngsICIlc1xuIiwgX19mdW5jX18pOwogCisJZGV2aWNlX3JlbW92ZV9maWxlKCZlZngtPnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX3BoeV9mbGFzaF9jZmcpOwogCXNmZTQwMDFfcG93ZXJvZmYoZWZ4KTsKLSAJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGVmeC0+Ym9hcmRfaW5mby5pb2V4cF9jbGllbnQpOwotIAlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoZWZ4LT5ib2FyZF9pbmZvLmh3bW9uX2NsaWVudCk7CisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGVmeC0+Ym9hcmRfaW5mby5pb2V4cF9jbGllbnQpOworCWkyY191bnJlZ2lzdGVyX2RldmljZShlZngtPmJvYXJkX2luZm8uaHdtb25fY2xpZW50KTsKIH0KIAotLyogVGhlIFAwX0VOXzNWM1ggbGluZSBvbiBTRkU0MDAxIGJvYXJkcyAoZnJvbSBBMiBvbndhcmQpIGlzIGNvbm5lY3RlZAotICogdG8gdGhlIEZMQVNIX0NGR18xIGlucHV0IG9uIHRoZSBEU1AuICBXZSBtdXN0IGtlZXAgaXQgaGlnaCBhdCBwb3dlci0KLSAqIHVwIHRvIGFsbG93IHdyaXRpbmcgdGhlIGZsYXNoIChkb25lIHRocm91Z2ggTURJTyBmcm9tIHVzZXJsYW5kKS4KLSAqLwotdW5zaWduZWQgaW50IHNmZTQwMDFfcGh5X2ZsYXNoX2NmZzsKLW1vZHVsZV9wYXJhbV9uYW1lZChwaHlfZmxhc2hfY2ZnLCBzZmU0MDAxX3BoeV9mbGFzaF9jZmcsIHVpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwaHlfZmxhc2hfY2ZnLAotCQkgIkZvcmNlIFBIWSB0byBlbnRlciBmbGFzaCBjb25maWd1cmF0aW9uIG1vZGUiKTsKLQogLyogVGhpcyBib2FyZCB1c2VzIGFuIEkyQyBleHBhbmRlciB0byBwcm92aWRlciBwb3dlciB0byB0aGUgUEhZLCB3aGljaCBuZWVkcyB0bwogICogYmUgdHVybmVkIG9uIGJlZm9yZSB0aGUgUEhZIGNhbiBiZSB1c2VkLgogICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0LCBydG5sIGxvY2sgaGVsZAogICovCiBpbnQgc2ZlNDAwMV9pbml0KHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmh3bW9uX2NsaWVudCwgKmlvZXhwX2NsaWVudDsKLQl1bnNpZ25lZCBpbnQgY291bnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmh3bW9uX2NsaWVudDsKIAlpbnQgcmM7Ci0JdTggb3V0OwotCWVmeF9kd29yZF90IHJlZzsKIAogCWh3bW9uX2NsaWVudCA9IGkyY19uZXdfZHVtbXkoJmVmeC0+aTJjX2FkYXAsIE1BWDY2NDcpOwogCWlmICghaHdtb25fY2xpZW50KQogCQlyZXR1cm4gLUVJTzsKIAllZngtPmJvYXJkX2luZm8uaHdtb25fY2xpZW50ID0gaHdtb25fY2xpZW50OwogCi0JaW9leHBfY2xpZW50ID0gaTJjX25ld19kdW1teSgmZWZ4LT5pMmNfYWRhcCwgUENBOTUzOSk7Ci0JaWYgKCFpb2V4cF9jbGllbnQpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIGZhaWxfaHdtb247Ci0JfQotCWVmeC0+Ym9hcmRfaW5mby5pb2V4cF9jbGllbnQgPSBpb2V4cF9jbGllbnQ7Ci0KLQkvKiAxMFhwcmVzcyBoYXMgZml4ZWQtZnVuY3Rpb24gTEVEIHBpbnMsIHNvIHRoZXJlIGlzIG5vIGJvYXJkLXNwZWNpZmljCi0JICogYmxpbmsgY29kZS4gKi8KLQllZngtPmJvYXJkX2luZm8uYmxpbmsgPSB0ZW54cHJlc3NfcGh5X2JsaW5rOwotCi0JLyogRW5zdXJlIHRoYXQgWEdYUyBhbmQgWEFVSSBTZXJEZXMgYXJlIGhlbGQgaW4gcmVzZXQgKi8KLQlFRlhfUE9QVUxBVEVfRFdPUkRfNyhyZWcsIFhYX1BXUkROQV9FTiwgMSwKLQkJCSAgICAgWFhfUFdSRE5CX0VOLCAxLAotCQkJICAgICBYWF9SU1RQTExBQl9FTiwgMSwKLQkJCSAgICAgWFhfUkVTRVRBX0VOLCAxLAotCQkJICAgICBYWF9SRVNFVEJfRU4sIDEsCi0JCQkgICAgIFhYX1JTVFhHWFNSWF9FTiwgMSwKLQkJCSAgICAgWFhfUlNUWEdYU1RYX0VOLCAxKTsKLQlmYWxjb25feG1hY193cml0ZWwoZWZ4LCAmcmVnLCBYWF9QV1JfUlNUX1JFR19NQUMpOwotCXVkZWxheSgxMCk7Ci0KLQllZngtPmJvYXJkX2luZm8uZmluaSA9IHNmZTQwMDFfZmluaTsKLQogCS8qIFNldCBEU1Agb3Zlci10ZW1wZXJhdHVyZSBhbGVydCB0aHJlc2hvbGQgKi8KIAlFRlhfSU5GTyhlZngsICJEU1AgY3V0LW91dCBhdCAlZENcbiIsIHhncGh5X21heF90ZW1wZXJhdHVyZSk7CiAJcmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGh3bW9uX2NsaWVudCwgV0xITywKQEAgLTE5NSw3OCArMjkxLDM0IEBACiAJCWdvdG8gZmFpbF9pb2V4cDsKIAl9CiAKLQkvKiBDbGVhciBhbnkgcHJldmlvdXMgb3Zlci10ZW1wZXJhdHVyZSBhbGVydCAqLwotCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGh3bW9uX2NsaWVudCwgUlNMKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWxfaW9leHA7CisJZWZ4LT5ib2FyZF9pbmZvLmlvZXhwX2NsaWVudCA9IGkyY19uZXdfZHVtbXkoJmVmeC0+aTJjX2FkYXAsIFBDQTk1MzkpOworCWlmICghZWZ4LT5ib2FyZF9pbmZvLmlvZXhwX2NsaWVudCkgeworCQlyYyA9IC1FSU87CisJCWdvdG8gZmFpbF9od21vbjsKKwl9CiAKLQkvKiBFbmFibGUgcG9ydCAwIGFuZCBwb3J0IDEgb3V0cHV0cyBvbiBJTyBleHBhbmRlciAqLwotCXJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAwX0NPTkZJRywgMHgwMCk7CisJLyogMTBYcHJlc3MgaGFzIGZpeGVkLWZ1bmN0aW9uIExFRCBwaW5zLCBzbyB0aGVyZSBpcyBubyBib2FyZC1zcGVjaWZpYworCSAqIGJsaW5rIGNvZGUuICovCisJZWZ4LT5ib2FyZF9pbmZvLmJsaW5rID0gdGVueHByZXNzX3BoeV9ibGluazsKKworCWVmeC0+Ym9hcmRfaW5mby5maW5pID0gc2ZlNDAwMV9maW5pOworCisJcmMgPSBzZmU0MDAxX3Bvd2Vyb24oZWZ4KTsKIAlpZiAocmMpCiAJCWdvdG8gZmFpbF9pb2V4cDsKLQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMV9DT05GSUcsCi0JCQkJICAgICAgIDB4ZmYgJiB+KDEgPDwgUDFfU1BBUkVfTEJOKSk7CisKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZWZ4LT5wY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9waHlfZmxhc2hfY2ZnKTsKIAlpZiAocmMpCiAJCWdvdG8gZmFpbF9vbjsKIAotCS8qIFR1cm4gYWxsIHBvd2VyIG9mZiB0aGVuIHdhaXQgMSBzZWMuIFRoaXMgZW5zdXJlcyBQSFkgaXMgcmVzZXQgKi8KLQlvdXQgPSAweGZmICYgfigoMCA8PCBQMF9FTl8xVjJfTEJOKSB8ICgwIDw8IFAwX0VOXzJWNV9MQk4pIHwKLQkJICAgICAgICgwIDw8IFAwX0VOXzNWM1hfTEJOKSB8ICgwIDw8IFAwX0VOXzVWX0xCTikgfAotCQkgICAgICAgKDAgPDwgUDBfRU5fMVYwWF9MQk4pKTsKLQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMF9PVVQsIG91dCk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWxfb247Ci0KLQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7Ci0JY291bnQgPSAwOwotCWRvIHsKLQkJLyogVHVybiBvbiAxLjJWLCAyLjVWLCAzLjNWIGFuZCA1ViBwb3dlciByYWlscyAqLwotCQlvdXQgPSAweGZmICYgfigoMSA8PCBQMF9FTl8xVjJfTEJOKSB8ICgxIDw8IFAwX0VOXzJWNV9MQk4pIHwKLQkJCSAgICAgICAoMSA8PCBQMF9FTl8zVjNYX0xCTikgfCAoMSA8PCBQMF9FTl81Vl9MQk4pIHwKLQkJCSAgICAgICAoMSA8PCBQMF9YX1RSU1RfTEJOKSk7Ci0JCWlmIChzZmU0MDAxX3BoeV9mbGFzaF9jZmcpCi0JCQlvdXQgfD0gMSA8PCBQMF9FTl8zVjNYX0xCTjsKLQotCQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoaW9leHBfY2xpZW50LCBQMF9PVVQsIG91dCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZmFpbF9vbjsKLQkJbXNsZWVwKDEwKTsKLQotCQkvKiBUdXJuIG9uIDFWIHBvd2VyIHJhaWwgKi8KLQkJb3V0ICY9IH4oMSA8PCBQMF9FTl8xVjBYX0xCTik7Ci0JCXJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAwX09VVCwgb3V0KTsKLQkJaWYgKHJjKQotCQkJZ290byBmYWlsX29uOwotCi0JCUVGWF9JTkZPKGVmeCwgIndhaXRpbmcgZm9yIHBvd2VyIChhdHRlbXB0ICVkKS4uLlxuIiwgY291bnQpOwotCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaKTsKLQotCQkvKiBDaGVjayBEU1AgaXMgcG93ZXJlZCAqLwotCQlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShpb2V4cF9jbGllbnQsIFAxX0lOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZmFpbF9vbjsKLQkJaWYgKHJjICYgKDEgPDwgUDFfQUZFX1BXRF9MQk4pKQotCQkJZ290byBkb25lOwotCi0JCS8qIERTUCBkb2Vzbid0IGxvb2sgcG93ZXJlZCBpbiBmbGFzaCBjb25maWcgbW9kZSAqLwotCQlpZiAoc2ZlNDAwMV9waHlfZmxhc2hfY2ZnKQotCQkJZ290byBkb25lOwotCX0gd2hpbGUgKCsrY291bnQgPCAyMCk7Ci0KLQlFRlhfSU5GTyhlZngsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgcG93ZXJcbiIpOwotCXJjID0gLUVUSU1FRE9VVDsKLQlnb3RvIGZhaWxfb247Ci0KLWRvbmU6CiAJRUZYX0lORk8oZWZ4LCAiUEhZIGlzIHBvd2VyZWQgb25cbiIpOwogCXJldHVybiAwOwogCiBmYWlsX29uOgogCXNmZTQwMDFfcG93ZXJvZmYoZWZ4KTsKIGZhaWxfaW9leHA6Ci0gCWkyY191bnJlZ2lzdGVyX2RldmljZShpb2V4cF9jbGllbnQpOworCWkyY191bnJlZ2lzdGVyX2RldmljZShlZngtPmJvYXJkX2luZm8uaW9leHBfY2xpZW50KTsKIGZhaWxfaHdtb246Ci0gCWkyY191bnJlZ2lzdGVyX2RldmljZShod21vbl9jbGllbnQpOworCWkyY191bnJlZ2lzdGVyX2RldmljZShod21vbl9jbGllbnQpOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9zcGkuaCBiL2RyaXZlcnMvbmV0L3NmYy9zcGkuaAppbmRleCAzNDQxMmYzLi5mZWVmNjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvc3BpLmgKKysrIGIvZHJpdmVycy9uZXQvc2ZjL3NwaS5oCkBAIC0xOSw1MyArMTksNDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIENvbW1hbmRzIGNvbW1vbiB0byBhbGwga25vd24gZGV2aWNlcy4KLSAqCisjZGVmaW5lIFNQSV9XUlNSIDB4MDEJCS8qIFdyaXRlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTUElfV1JJVEUgMHgwMgkJLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgYXJyYXkgKi8KKyNkZWZpbmUgU1BJX1JFQUQgMHgwMwkJLyogUmVhZCBkYXRhIGZyb20gbWVtb3J5IGFycmF5ICovCisjZGVmaW5lIFNQSV9XUkRJIDB4MDQJCS8qIFJlc2V0IHdyaXRlIGVuYWJsZSBsYXRjaCAqLworI2RlZmluZSBTUElfUkRTUiAweDA1CQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTUElfV1JFTiAweDA2CQkvKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoICovCisKKyNkZWZpbmUgU1BJX1NUQVRVU19XUEVOIDB4ODAJLyogV3JpdGUtcHJvdGVjdCBwaW4gZW5hYmxlZCAqLworI2RlZmluZSBTUElfU1RBVFVTX0JQMiAweDEwCS8qIEJsb2NrIHByb3RlY3Rpb24gYml0IDIgKi8KKyNkZWZpbmUgU1BJX1NUQVRVU19CUDEgMHgwOAkvKiBCbG9jayBwcm90ZWN0aW9uIGJpdCAxICovCisjZGVmaW5lIFNQSV9TVEFUVVNfQlAwIDB4MDQJLyogQmxvY2sgcHJvdGVjdGlvbiBiaXQgMCAqLworI2RlZmluZSBTUElfU1RBVFVTX1dFTiAweDAyCS8qIFN0YXRlIG9mIHRoZSB3cml0ZSBlbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgU1BJX1NUQVRVU19OUkRZIDB4MDEJLyogRGV2aWNlIGJ1c3kgZmxhZyAqLworCisvKioKKyAqIHN0cnVjdCBlZnhfc3BpX2RldmljZSAtIGFuIEVmeCBTUEkgKFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSkgZGV2aWNlCisgKiBAZWZ4OgkJVGhlIEVmeCBjb250cm9sbGVyIHRoYXQgb3ducyB0aGlzIGRldmljZQorICogQGRldmljZV9pZDoJCUNvbnRyb2xsZXIncyBpZCBmb3IgdGhlIGRldmljZQorICogQHNpemU6CQlTaXplIChpbiBieXRlcykKKyAqIEBhZGRyX2xlbjoJCU51bWJlciBvZiBhZGRyZXNzIGJ5dGVzIGluIHJlYWQvd3JpdGUgY29tbWFuZHMKKyAqIEBtdW5nZV9hZGRyZXNzOglGbGFnIHdoZXRoZXIgYWRkcmVzc2VzIHNob3VsZCBiZSBtdW5nZWQuCisgKglTb21lIGRldmljZXMgd2l0aCA5LWJpdCBhZGRyZXNzZXMgKGUuZy4gQVQyNTA0MEEgRUVQUk9NKQorICoJdXNlIGJpdCAzIG9mIHRoZSBjb21tYW5kIGJ5dGUgYXMgYWRkcmVzcyBiaXQgQTgsIHJhdGhlcgorICoJdGhhbiBoYXZpbmcgYSB0d28tYnl0ZSBhZGRyZXNzLiAgSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlbgorICoJY29tbWFuZHMgc2hvdWxkIGJlIG11bmdlZCBpbiB0aGlzIHdheS4KKyAqIEBibG9ja19zaXplOgkJV3JpdGUgYmxvY2sgc2l6ZSAoaW4gYnl0ZXMpLgorICoJV3JpdGUgY29tbWFuZHMgYXJlIGxpbWl0ZWQgdG8gYmxvY2tzIHdpdGggdGhpcyBzaXplIGFuZCBhbGlnbm1lbnQuCisgKiBAcmVhZDoJCVJlYWQgZnVuY3Rpb24gZm9yIHRoZSBkZXZpY2UKKyAqIEB3cml0ZToJCVdyaXRlIGZ1bmN0aW9uIGZvciB0aGUgZGV2aWNlCiAgKi8KK3N0cnVjdCBlZnhfc3BpX2RldmljZSB7CisJc3RydWN0IGVmeF9uaWMgKmVmeDsKKwlpbnQgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBhZGRyX2xlbjsKKwl1bnNpZ25lZCBpbnQgbXVuZ2VfYWRkcmVzczoxOworCXVuc2lnbmVkIGludCBibG9ja19zaXplOworfTsKIAotLyogV3JpdGUgc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNQSV9XUlNSIDB4MDEKLQotLyogV3JpdGUgZGF0YSB0byBtZW1vcnkgYXJyYXkgKi8KLSNkZWZpbmUgU1BJX1dSSVRFIDB4MDIKLQotLyogUmVhZCBkYXRhIGZyb20gbWVtb3J5IGFycmF5ICovCi0jZGVmaW5lIFNQSV9SRUFEIDB4MDMKLQotLyogUmVzZXQgd3JpdGUgZW5hYmxlIGxhdGNoICovCi0jZGVmaW5lIFNQSV9XUkRJIDB4MDQKLQotLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1BJX1JEU1IgMHgwNQotCi0vKiBTZXQgd3JpdGUgZW5hYmxlIGxhdGNoICovCi0jZGVmaW5lIFNQSV9XUkVOIDB4MDYKLQotLyogU1NUOiBFbmFibGUgd3JpdGUgdG8gc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNQSV9TU1RfRVdTUiAweDUwCi0KLS8qCi0gKiBTdGF0dXMgcmVnaXN0ZXIgYml0cy4gIE5vdCBhbGwgYml0cyBhcmUgc3VwcG9ydGVkIG9uIGFsbCBkZXZpY2VzLgotICoKLSAqLwotCi0vKiBXcml0ZS1wcm90ZWN0IHBpbiBlbmFibGVkICovCi0jZGVmaW5lIFNQSV9TVEFUVVNfV1BFTiAweDgwCi0KLS8qIEJsb2NrIHByb3RlY3Rpb24gYml0IDIgKi8KLSNkZWZpbmUgU1BJX1NUQVRVU19CUDIgMHgxMAotCi0vKiBCbG9jayBwcm90ZWN0aW9uIGJpdCAxICovCi0jZGVmaW5lIFNQSV9TVEFUVVNfQlAxIDB4MDgKLQotLyogQmxvY2sgcHJvdGVjdGlvbiBiaXQgMCAqLwotI2RlZmluZSBTUElfU1RBVFVTX0JQMCAweDA0Ci0KLS8qIFN0YXRlIG9mIHRoZSB3cml0ZSBlbmFibGUgbGF0Y2ggKi8KLSNkZWZpbmUgU1BJX1NUQVRVU19XRU4gMHgwMgotCi0vKiBEZXZpY2UgYnVzeSBmbGFnICovCi0jZGVmaW5lIFNQSV9TVEFUVVNfTlJEWSAweDAxCitpbnQgZmFsY29uX3NwaV9yZWFkKGNvbnN0IHN0cnVjdCBlZnhfc3BpX2RldmljZSAqc3BpLCBsb2ZmX3Qgc3RhcnQsCisJCSAgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdTggKmJ1ZmZlcik7CitpbnQgZmFsY29uX3NwaV93cml0ZShjb25zdCBzdHJ1Y3QgZWZ4X3NwaV9kZXZpY2UgKnNwaSwgbG9mZl90IHN0YXJ0LAorCQkgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1OCAqYnVmZmVyKTsKIAogI2VuZGlmIC8qIEVGWF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL3RlbnhwcmVzcy5jIGIvZHJpdmVycy9uZXQvc2ZjL3RlbnhwcmVzcy5jCmluZGV4IGMwMTQ2MDYuLmQ1MDdjOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy90ZW54cHJlc3MuYworKysgYi9kcml2ZXJzL25ldC9zZmMvdGVueHByZXNzLmMKQEAgLTY1LDI1ICs2NSwxMCBAQAogI2RlZmluZSBQTUFfUE1EX0xFRF9ERUZBVUxUCShQTUFfUE1EX0xFRF9PRkYgPDwgUE1BX1BNRF9MRURfUlhfTEJOKQogCiAKLS8qIFNlbGYgdGVzdCAoQklTVCkgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBQTUFfUE1EX0JJU1RfQ1RSTF9SRUcJKDB4YzAxNCkKLSNkZWZpbmUgUE1BX1BNRF9CSVNUX0JFUl9MQk4JKDIpCS8qIFJ1biBCRVIgdGVzdCAqLwotI2RlZmluZSBQTUFfUE1EX0JJU1RfQ09OVF9MQk4JKDEpCS8qIFJ1biBjb250aW51b3VzIEJJU1QgdW50aWwgY2xlYXJlZCAqLwotI2RlZmluZSBQTUFfUE1EX0JJU1RfU0lOR0xFX0xCTgkoMCkJLyogUnVuIDEgQklTVCBpdGVyYXRpb24gKHNlbGYgY2xlYXJzKSAqLwotLyogU2VsZiB0ZXN0IHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBQTUFfUE1EX0JJU1RfU1RBVF9SRUcJKDB4YzAxNSkKLSNkZWZpbmUgUE1BX1BNRF9CSVNUX0VOWF9MQk4JKDMpCi0jZGVmaW5lIFBNQV9QTURfQklTVF9QTUFfTEJOCSgyKQotI2RlZmluZSBQTUFfUE1EX0JJU1RfUlhEX0xCTgkoMSkKLSNkZWZpbmUgUE1BX1BNRF9CSVNUX0FGRV9MQk4JKDApCi0KIC8qIFNwZWNpYWwgU29mdHdhcmUgcmVzZXQgcmVnaXN0ZXIgKi8KICNkZWZpbmUgUE1BX1BNRF9FWFRfQ1RSTF9SRUcgNDkxNTIKICNkZWZpbmUgUE1BX1BNRF9FWFRfU1NSX0xCTiAxNQogCi0jZGVmaW5lIEJJU1RfTUFYX0RFTEFZCSgxMDAwKQotI2RlZmluZSBCSVNUX1BPTExfREVMQVkJKDEwKQotCiAvKiBNaXNjIHJlZ2lzdGVyIGRlZmluZXMgKi8KICNkZWZpbmUgUENTX0NMT0NLX0NUUkxfUkVHIDB4ZDgwMQogI2RlZmluZSBQTEwzMTJfUlNUX05fTEJOIDIKQEAgLTExOSwyNyArMTA0LDEyIEBACiAJCSAiTWF4IG51bWJlciBvZiBDUkMgZXJyb3JzIGJlZm9yZSBYQVVJIHJlc2V0Iik7CiAKIHN0cnVjdCB0ZW54cHJlc3NfcGh5X2RhdGEgewotCWVudW0gdGVueHByZXNzX3N0YXRlIHN0YXRlOwogCWVudW0gZWZ4X2xvb3BiYWNrX21vZGUgbG9vcGJhY2tfbW9kZTsKIAlhdG9taWNfdCBiYWRfY3JjX2NvdW50OwotCWludCB0eF9kaXNhYmxlZDsKKwllbnVtIGVmeF9waHlfbW9kZSBwaHlfbW9kZTsKIAlpbnQgYmFkX2xwX3RyaWVzOwogfTsKIAotc3RhdGljIGludCB0ZW54cHJlc3Nfc3RhdGVfaXMoc3RydWN0IGVmeF9uaWMgKmVmeCwgaW50IHN0YXRlKQotewotCXN0cnVjdCB0ZW54cHJlc3NfcGh5X2RhdGEgKnBoeV9kYXRhID0gZWZ4LT5waHlfZGF0YTsKLQlyZXR1cm4gKHBoeV9kYXRhICE9IE5VTEwpICYmIChzdGF0ZSA9PSBwaHlfZGF0YS0+c3RhdGUpOwotfQotCi12b2lkIHRlbnhwcmVzc19zZXRfc3RhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCwKLQkJCQllbnVtIHRlbnhwcmVzc19zdGF0ZSBzdGF0ZSkKLXsKLQlzdHJ1Y3QgdGVueHByZXNzX3BoeV9kYXRhICpwaHlfZGF0YSA9IGVmeC0+cGh5X2RhdGE7Ci0JaWYgKHBoeV9kYXRhICE9IE5VTEwpCi0JCXBoeV9kYXRhLT5zdGF0ZSA9IHN0YXRlOwotfQotCiB2b2lkIHRlbnhwcmVzc19jcmNfZXJyKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJc3RydWN0IHRlbnhwcmVzc19waHlfZGF0YSAqcGh5X2RhdGEgPSBlZngtPnBoeV9kYXRhOwpAQCAtMTc2LDggKzE0Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRlbnhwcmVzc19yZXNldF94YXVpKHN0cnVjdCBlZnhfbmljICplZngpOwotCiBzdGF0aWMgaW50IHRlbnhwcmVzc19pbml0KHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJaW50IHJjLCByZWc7CkBAIC0yMTQsMTUgKzE4MiwxMiBAQAogCWlmICghcGh5X2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCWVmeC0+cGh5X2RhdGEgPSBwaHlfZGF0YTsKKwlwaHlfZGF0YS0+cGh5X21vZGUgPSBlZngtPnBoeV9tb2RlOwogCi0JdGVueHByZXNzX3NldF9zdGF0ZShlZngsIFRFTlhQUkVTU19TVEFUVVNfTk9STUFMKTsKLQotCWlmICghc2ZlNDAwMV9waHlfZmxhc2hfY2ZnKSB7Ci0JCXJjID0gbWRpb19jbGF1c2U0NV93YWl0X3Jlc2V0X21tZHMoZWZ4LAotCQkJCQkJICAgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCX0KKwlyYyA9IG1kaW9fY2xhdXNlNDVfd2FpdF9yZXNldF9tbWRzKGVmeCwKKwkJCQkJICAgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMpOworCWlmIChyYyA8IDApCisJCWdvdG8gZmFpbDsKIAogCXJjID0gbWRpb19jbGF1c2U0NV9jaGVja19tbWRzKGVmeCwgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMsIDApOwogCWlmIChyYyA8IDApCkBAIC0yNDksNyArMjE0LDEwIEBACiB7CiAJaW50IHJjLCByZWc7CiAKLQlFRlhfVFJBQ0UoZWZ4LCAiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBUaGUgWEdNQUMgY2xvY2sgaXMgZHJpdmVuIGZyb20gdGhlIFNGQzcxMDEvU0ZUOTAwMSAzMTJNSHogY2xvY2ssIHNvCisJICogYSBzcGVjaWFsIHNvZnR3YXJlIHJlc2V0IGNhbiBnbGl0Y2ggdGhlIFhHTUFDIHN1ZmZpY2llbnRseSBmb3Igc3RhdHMKKwkgKiByZXF1ZXN0cyB0byBmYWlsLiBTaW5jZSB3ZSBkb24ndCBvZmVuIHNwZWNpYWxfcmVzZXQsIGp1c3QgbG9jay4gKi8KKwlzcGluX2xvY2soJmVmeC0+c3RhdHNfbG9jayk7CiAKIAkvKiBJbml0aWF0ZSByZXNldCAqLwogCXJlZyA9IG1kaW9fY2xhdXNlNDVfcmVhZChlZngsIGVmeC0+bWlpLnBoeV9pZCwKQEAgLTI1OCwyMyArMjI2LDI1IEBACiAJbWRpb19jbGF1c2U0NV93cml0ZShlZngsIGVmeC0+bWlpLnBoeV9pZCwgTURJT19NTURfUE1BUE1ELAogCQkJICAgIFBNQV9QTURfRVhUX0NUUkxfUkVHLCByZWcpOwogCi0JbXNsZWVwKDIwMCk7CisJbWRlbGF5KDIwMCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgYmxvY2tzIHRvIGNvbWUgb3V0IG9mIHJlc2V0ICovCiAJcmMgPSBtZGlvX2NsYXVzZTQ1X3dhaXRfcmVzZXRfbW1kcyhlZngsCiAJCQkJCSAgIFRFTlhQUkVTU19SRVFVSVJFRF9ERVZTKTsKIAlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gdW5sb2NrOwogCiAJLyogVHJ5IGFuZCByZWNvbmZpZ3VyZSB0aGUgZGV2aWNlICovCiAJcmMgPSB0ZW54cHJlc3NfaW5pdChlZngpOwogCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKKwkJZ290byB1bmxvY2s7CiAKLQlyZXR1cm4gMDsKK3VubG9jazoKKwlzcGluX3VubG9jaygmZWZ4LT5zdGF0c19sb2NrKTsKKwlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHRlbnhwcmVzc19zZXRfYmFkX2xwKHN0cnVjdCBlZnhfbmljICplZngsIGludCBiYWRfbHApCitzdGF0aWMgdm9pZCB0ZW54cHJlc3Nfc2V0X2JhZF9scChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBib29sIGJhZF9scCkKIHsKIAlzdHJ1Y3QgdGVueHByZXNzX3BoeV9kYXRhICpwZCA9IGVmeC0+cGh5X2RhdGE7CiAJaW50IHJlZzsKQEAgLTMxMSwxNSArMjgxLDE1IEBACiAgKiBpbnRvIGEgbm9uLTEwR0JUIHBvcnQgYW5kIGlmIHNvIHdhcm4gdGhlIHVzZXIgdGhhdCB0aGV5IHdvbid0IGdldAogICogbGluayBhbnkgdGltZSBzb29uIGFzIHdlIGFyZSAxMEdCVCBvbmx5LCB1bmxlc3MgY2FsbGVyIHNwZWNpZmllZAogICogbm90IHRvIGRvIHRoaXMgY2hlY2sgKGl0IGlzbid0IHVzZWZ1bCBpbiBsb29wYmFjaykgKi8KLXN0YXRpYyBpbnQgdGVueHByZXNzX2xpbmtfb2soc3RydWN0IGVmeF9uaWMgKmVmeCwgaW50IGNoZWNrX2xwKQorc3RhdGljIGJvb2wgdGVueHByZXNzX2xpbmtfb2soc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBjaGVja19scCkKIHsKLQlpbnQgb2sgPSBtZGlvX2NsYXVzZTQ1X2xpbmtzX29rKGVmeCwgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMpOworCWJvb2wgb2sgPSBtZGlvX2NsYXVzZTQ1X2xpbmtzX29rKGVmeCwgVEVOWFBSRVNTX1JFUVVJUkVEX0RFVlMpOwogCiAJaWYgKG9rKSB7Ci0JCXRlbnhwcmVzc19zZXRfYmFkX2xwKGVmeCwgMCk7CisJCXRlbnhwcmVzc19zZXRfYmFkX2xwKGVmeCwgZmFsc2UpOwogCX0gZWxzZSBpZiAoY2hlY2tfbHApIHsKIAkJLyogQXJlIHdlIHBsdWdnZWQgaW50byB0aGUgd3Jvbmcgc29ydCBvZiBsaW5rPyAqLwotCQlpbnQgYmFkX2xwID0gMDsKKwkJYm9vbCBiYWRfbHAgPSBmYWxzZTsKIAkJaW50IHBoeV9pZCA9IGVmeC0+bWlpLnBoeV9pZDsKIAkJaW50IGFuX3N0YXQgPSBtZGlvX2NsYXVzZTQ1X3JlYWQoZWZ4LCBwaHlfaWQsIE1ESU9fTU1EX0FOLAogCQkJCQkJIE1ESU9fQU5fU1RBVFVTKTsKQEAgLTMzMiw3ICszMDIsNyBAQAogCQkgKiBiaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygbm90IGNsZWFyaW5nIHdoZW4gYXV0b25lZwogCQkgKiByZXN0YXJ0cy4gKi8KIAkJaWYgKCEoeHBoeV9zdGF0ICYgKDEgPDwgUE1BX1BNRF9YU1RBVF9GTFBfTEJOKSkpIHsKLQkJCXRlbnhwcmVzc19zZXRfYmFkX2xwKGVmeCwgMCk7CisJCQl0ZW54cHJlc3Nfc2V0X2JhZF9scChlZngsIGZhbHNlKTsKIAkJCXJldHVybiBvazsKIAkJfQogCkBAIC0zNjcsMTYgKzMzNywxOSBAQAogc3RhdGljIHZvaWQgdGVueHByZXNzX3BoeV9yZWNvbmZpZ3VyZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCXN0cnVjdCB0ZW54cHJlc3NfcGh5X2RhdGEgKnBoeV9kYXRhID0gZWZ4LT5waHlfZGF0YTsKLQlpbnQgbG9vcF9jaGFuZ2UgPSBMT09QQkFDS19PVVRfT0YocGh5X2RhdGEsIGVmeCwKLQkJCQkJICBURU5YUFJFU1NfTE9PUEJBQ0tTKTsKKwlib29sIGxvb3BfY2hhbmdlID0gTE9PUEJBQ0tfT1VUX09GKHBoeV9kYXRhLCBlZngsCisJCQkJCSAgIFRFTlhQUkVTU19MT09QQkFDS1MpOwogCi0JaWYgKCF0ZW54cHJlc3Nfc3RhdGVfaXMoZWZ4LCBURU5YUFJFU1NfU1RBVFVTX05PUk1BTCkpCisJaWYgKGVmeC0+cGh5X21vZGUgJiBQSFlfTU9ERV9TUEVDSUFMKSB7CisJCXBoeV9kYXRhLT5waHlfbW9kZSA9IGVmeC0+cGh5X21vZGU7CiAJCXJldHVybjsKKwl9CiAKIAkvKiBXaGVuIGNvbWluZyBvdXQgb2YgdHJhbnNtaXQgZGlzYWJsZSwgY29taW5nIG91dCBvZiBsb3cgcG93ZXIKIAkgKiBtb2RlLCBvciBtb3Zpbmcgb3V0IG9mIGFueSBQSFkgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZSwKIAkgKiBwZXJmb3JtIGEgc3BlY2lhbCBzb2Z0d2FyZSByZXNldCAqLwotCWlmICgocGh5X2RhdGEtPnR4X2Rpc2FibGVkICYmICFlZngtPnR4X2Rpc2FibGVkKSB8fAorCWlmICgoZWZ4LT5waHlfbW9kZSA9PSBQSFlfTU9ERV9OT1JNQUwgJiYKKwkgICAgIHBoeV9kYXRhLT5waHlfbW9kZSAhPSBQSFlfTU9ERV9OT1JNQUwpIHx8CiAJICAgIGxvb3BfY2hhbmdlKSB7CiAJCXRlbnhwcmVzc19zcGVjaWFsX3Jlc2V0KGVmeCk7CiAJCWZhbGNvbl9yZXNldF94YXVpKGVmeCk7CkBAIC0zODYsOSArMzU5LDkgQEAKIAltZGlvX2NsYXVzZTQ1X3BoeV9yZWNvbmZpZ3VyZShlZngpOwogCXRlbnhwcmVzc19waHl4c19sb29wYmFjayhlZngpOwogCi0JcGh5X2RhdGEtPnR4X2Rpc2FibGVkID0gZWZ4LT50eF9kaXNhYmxlZDsKIAlwaHlfZGF0YS0+bG9vcGJhY2tfbW9kZSA9IGVmeC0+bG9vcGJhY2tfbW9kZTsKLQllZngtPmxpbmtfdXAgPSB0ZW54cHJlc3NfbGlua19vayhlZngsIDApOworCXBoeV9kYXRhLT5waHlfbW9kZSA9IGVmeC0+cGh5X21vZGU7CisJZWZ4LT5saW5rX3VwID0gdGVueHByZXNzX2xpbmtfb2soZWZ4LCBmYWxzZSk7CiAJZWZ4LT5saW5rX29wdGlvbnMgPSBHTV9MUEFfMTAwMDBGVUxMOwogfQogCkBAIC00MDIsMTYgKzM3NSwxNCBAQAogc3RhdGljIGludCB0ZW54cHJlc3NfcGh5X2NoZWNrX2h3KHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJc3RydWN0IHRlbnhwcmVzc19waHlfZGF0YSAqcGh5X2RhdGEgPSBlZngtPnBoeV9kYXRhOwotCWludCBwaHlfdXAgPSB0ZW54cHJlc3Nfc3RhdGVfaXMoZWZ4LCBURU5YUFJFU1NfU1RBVFVTX05PUk1BTCk7Ci0JaW50IGxpbmtfb2s7CisJYm9vbCBsaW5rX29rOwogCi0JbGlua19vayA9IHBoeV91cCAmJiB0ZW54cHJlc3NfbGlua19vayhlZngsIDEpOworCWxpbmtfb2sgPSB0ZW54cHJlc3NfbGlua19vayhlZngsIHRydWUpOwogCiAJaWYgKGxpbmtfb2sgIT0gZWZ4LT5saW5rX3VwKQogCQlmYWxjb25feG1hY19zaW1fcGh5X2V2ZW50KGVmeCk7CiAKLQkvKiBOb3RoaW5nIHRvIGNoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgc2h1dCBkb3duIHRoZSBQSFkgKi8KLQlpZiAoIXBoeV91cCkKKwlpZiAocGh5X2RhdGEtPnBoeV9tb2RlICE9IFBIWV9NT0RFX05PUk1BTCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnBoeV9kYXRhLT5iYWRfY3JjX2NvdW50KSA+IGNyY19lcnJvcl9yZXNldF90aHJlc2hvbGQpIHsKQEAgLTQ0NCw3ICs0MTUsNyBAQAogCiAvKiBTZXQgdGhlIFJYIGFuZCBUWCBMRURzIGFuZCBMaW5rIExFRCBmbGFzaGluZy4gVGhlIG90aGVyIExFRHMKICAqICh3aGljaCBwcm9iYWJseSBhcmVuJ3Qgd2lyZWQgYW55d2F5KSBhcmUgbGVmdCBpbiBBVVRPIG1vZGUgKi8KLXZvaWQgdGVueHByZXNzX3BoeV9ibGluayhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBpbnQgYmxpbmspCit2b2lkIHRlbnhwcmVzc19waHlfYmxpbmsoc3RydWN0IGVmeF9uaWMgKmVmeCwgYm9vbCBibGluaykKIHsKIAlpbnQgcmVnOwogCkBAIC00NTksNTIgKzQzMCwxMCBAQAogCQkJICAgIFBNQV9QTURfTEVEX09WRVJSX1JFRywgcmVnKTsKIH0KIAotc3RhdGljIHZvaWQgdGVueHByZXNzX3Jlc2V0X3hhdWkoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3N0YXRpYyBpbnQgdGVueHByZXNzX3BoeV90ZXN0KHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0JaW50IHBoeSA9IGVmeC0+bWlpLnBoeV9pZDsKLQlpbnQgY2xrX2N0cmwsIHRlc3Rfc2VsZWN0LCBzb2Z0X3JzdDI7Ci0KLQkvKiBSZWFsIHdvcmsgaXMgZG9uZSBvbiBjbG9ja19jdHJsIG90aGVyIHJlc2V0cyBhcmUgdGhvdWdodCB0byBiZQotCSAqIG9wdGlvbmFsIGJ1dCBtYWtlIHRoZSByZXNldCBtb3JlIHJlbGlhYmxlCi0JICovCi0KLQkvKiBSZWFkICovCi0JY2xrX2N0cmwgPSBtZGlvX2NsYXVzZTQ1X3JlYWQoZWZ4LCBwaHksIE1ESU9fTU1EX1BDUywKLQkJCQkgICAgICBQQ1NfQ0xPQ0tfQ1RSTF9SRUcpOwotCXRlc3Rfc2VsZWN0ID0gbWRpb19jbGF1c2U0NV9yZWFkKGVmeCwgcGh5LCBNRElPX01NRF9QQ1MsCi0JCQkJCSBQQ1NfVEVTVF9TRUxFQ1RfUkVHKTsKLQlzb2Z0X3JzdDIgPSBtZGlvX2NsYXVzZTQ1X3JlYWQoZWZ4LCBwaHksIE1ESU9fTU1EX1BDUywKLQkJCQkgICAgICAgUENTX1NPRlRfUlNUMl9SRUcpOwotCi0JLyogUHV0IGluIHJlc2V0ICovCi0JdGVzdF9zZWxlY3QgJj0gfigxIDw8IENMSzMxMl9FTl9MQk4pOwotCW1kaW9fY2xhdXNlNDVfd3JpdGUoZWZ4LCBwaHksIE1ESU9fTU1EX1BDUywKLQkJCSAgICBQQ1NfVEVTVF9TRUxFQ1RfUkVHLCB0ZXN0X3NlbGVjdCk7Ci0KLQlzb2Z0X3JzdDIgJj0gfigoMSA8PCBYR1hTX1JTVF9OX0xCTikgfCAoMSA8PCBTRVJERVNfUlNUX05fTEJOKSk7Ci0JbWRpb19jbGF1c2U0NV93cml0ZShlZngsIHBoeSwgTURJT19NTURfUENTLAotCQkJICAgIFBDU19TT0ZUX1JTVDJfUkVHLCBzb2Z0X3JzdDIpOwotCi0JY2xrX2N0cmwgJj0gfigxIDw8IFBMTDMxMl9SU1RfTl9MQk4pOwotCW1kaW9fY2xhdXNlNDVfd3JpdGUoZWZ4LCBwaHksIE1ESU9fTU1EX1BDUywKLQkJCSAgICBQQ1NfQ0xPQ0tfQ1RSTF9SRUcsIGNsa19jdHJsKTsKLQl1ZGVsYXkoMTApOwotCi0JLyogUmVtb3ZlIHJlc2V0ICovCi0JY2xrX2N0cmwgfD0gKDEgPDwgUExMMzEyX1JTVF9OX0xCTik7Ci0JbWRpb19jbGF1c2U0NV93cml0ZShlZngsIHBoeSwgTURJT19NTURfUENTLAotCQkJICAgIFBDU19DTE9DS19DVFJMX1JFRywgY2xrX2N0cmwpOwotCXVkZWxheSgxMCk7Ci0KLQlzb2Z0X3JzdDIgfD0gKCgxIDw8IFhHWFNfUlNUX05fTEJOKSB8ICgxIDw8IFNFUkRFU19SU1RfTl9MQk4pKTsKLQltZGlvX2NsYXVzZTQ1X3dyaXRlKGVmeCwgcGh5LCBNRElPX01NRF9QQ1MsCi0JCQkgICAgUENTX1NPRlRfUlNUMl9SRUcsIHNvZnRfcnN0Mik7Ci0JdWRlbGF5KDEwKTsKLQotCXRlc3Rfc2VsZWN0IHw9ICgxIDw8IENMSzMxMl9FTl9MQk4pOwotCW1kaW9fY2xhdXNlNDVfd3JpdGUoZWZ4LCBwaHksIE1ESU9fTU1EX1BDUywKLQkJCSAgICBQQ1NfVEVTVF9TRUxFQ1RfUkVHLCB0ZXN0X3NlbGVjdCk7Ci0JdWRlbGF5KDEwKTsKKwkvKiBCSVNUIGlzIGF1dG9tYXRpY2FsbHkgcnVuIGFmdGVyIGEgc3BlY2lhbCBzb2Z0d2FyZSByZXNldCAqLworCXJldHVybiB0ZW54cHJlc3Nfc3BlY2lhbF9yZXNldChlZngpOwogfQogCiBzdHJ1Y3QgZWZ4X3BoeV9vcGVyYXRpb25zIGZhbGNvbl90ZW54cHJlc3NfcGh5X29wcyA9IHsKQEAgLTUxMyw3ICs0NDIsNyBAQAogCS5jaGVja19odyAgICAgICAgID0gdGVueHByZXNzX3BoeV9jaGVja19odywKIAkuZmluaSAgICAgICAgICAgICA9IHRlbnhwcmVzc19waHlfZmluaSwKIAkuY2xlYXJfaW50ZXJydXB0ICA9IHRlbnhwcmVzc19waHlfY2xlYXJfaW50ZXJydXB0LAotCS5yZXNldF94YXVpICAgICAgID0gdGVueHByZXNzX3Jlc2V0X3hhdWksCisJLnRlc3QgICAgICAgICAgICAgPSB0ZW54cHJlc3NfcGh5X3Rlc3QsCiAJLm1tZHMgICAgICAgICAgICAgPSBURU5YUFJFU1NfUkVRVUlSRURfREVWUywKIAkubG9vcGJhY2tzICAgICAgICA9IFRFTlhQUkVTU19MT09QQkFDS1MsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL3R4LmMgYi9kcml2ZXJzL25ldC9zZmMvdHguYwppbmRleCA1ZTgzNzRhLi5kYTNlOWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvdHguYworKysgYi9kcml2ZXJzL25ldC9zZmMvdHguYwpAQCAtNDcsNyArNDcsNyBAQAogICogV2Ugd2FudCB0byBiZSBhYmxlIHRvIG5lc3QgY2FsbHMgdG8gbmV0aWZfc3RvcF9xdWV1ZSgpLCBzaW5jZSBlYWNoCiAgKiBjaGFubmVsIGNhbiBoYXZlIGFuIGluZGl2aWR1YWwgc3RvcCBvbiB0aGUgcXVldWUuCiAgKi8KLWlubGluZSB2b2lkIGVmeF93YWtlX3F1ZXVlKHN0cnVjdCBlZnhfbmljICplZngpCit2b2lkIGVmeF93YWtlX3F1ZXVlKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZlZngtPm5ldGlmX3N0b3BfY291bnQsCkBAIC01OSwxOSArNTksMjEgQEAKIAlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVmeF9kZXF1ZXVlX2J1ZmZlcihzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQkgICAgICBzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyKQorc3RhdGljIHZvaWQgZWZ4X2RlcXVldWVfYnVmZmVyKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAorCQkJICAgICAgIHN0cnVjdCBlZnhfdHhfYnVmZmVyICpidWZmZXIpCiB7CiAJaWYgKGJ1ZmZlci0+dW5tYXBfbGVuKSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdHhfcXVldWUtPmVmeC0+cGNpX2RldjsKKwkJZG1hX2FkZHJfdCB1bm1hcF9hZGRyID0gKGJ1ZmZlci0+ZG1hX2FkZHIgKyBidWZmZXItPmxlbiAtCisJCQkJCSBidWZmZXItPnVubWFwX2xlbik7CiAJCWlmIChidWZmZXItPnVubWFwX3NpbmdsZSkKLQkJCXBjaV91bm1hcF9zaW5nbGUocGNpX2RldiwgYnVmZmVyLT51bm1hcF9hZGRyLAotCQkJCQkgYnVmZmVyLT51bm1hcF9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShwY2lfZGV2LCB1bm1hcF9hZGRyLCBidWZmZXItPnVubWFwX2xlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQllbHNlCi0JCQlwY2lfdW5tYXBfcGFnZShwY2lfZGV2LCBidWZmZXItPnVubWFwX2FkZHIsCi0JCQkJICAgICAgIGJ1ZmZlci0+dW5tYXBfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXBjaV91bm1hcF9wYWdlKHBjaV9kZXYsIHVubWFwX2FkZHIsIGJ1ZmZlci0+dW5tYXBfbGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJYnVmZmVyLT51bm1hcF9sZW4gPSAwOwotCQlidWZmZXItPnVubWFwX3NpbmdsZSA9IDA7CisJCWJ1ZmZlci0+dW5tYXBfc2luZ2xlID0gZmFsc2U7CiAJfQogCiAJaWYgKGJ1ZmZlci0+c2tiKSB7CkBAIC0xMDMsMTMgKzEwNSwxMyBAQAogfTsKIAogc3RhdGljIGludCBlZnhfZW5xdWV1ZV9za2JfdHNvKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOworCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgZWZ4X2ZpbmlfdHNvKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKTsKIHN0YXRpYyB2b2lkIGVmeF90c29oX2hlYXBfZnJlZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKIAkJCSAgICAgICBzdHJ1Y3QgZWZ4X3Rzb19oZWFkZXIgKnRzb2gpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZWZ4X3Rzb2hfZnJlZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQkgc3RydWN0IGVmeF90eF9idWZmZXIgKmJ1ZmZlcikKK3N0YXRpYyB2b2lkIGVmeF90c29oX2ZyZWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUsCisJCQkgIHN0cnVjdCBlZnhfdHhfYnVmZmVyICpidWZmZXIpCiB7CiAJaWYgKGJ1ZmZlci0+dHNvaCkgewogCQlpZiAobGlrZWx5KCFidWZmZXItPnRzb2gtPnVubWFwX2xlbikpIHsKQEAgLTEzNiw4ICsxMzgsOCBAQAogICogUmV0dXJucyBORVRERVZfVFhfT0sgb3IgTkVUREVWX1RYX0JVU1kKICAqIFlvdSBtdXN0IGhvbGQgbmV0aWZfdHhfbG9jaygpIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZWZ4X2VucXVldWVfc2tiKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAotCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgZWZ4X2VucXVldWVfc2tiKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gdHhfcXVldWUtPmVmeDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGVmeC0+cGNpX2RldjsKQEAgLTE0OCw3ICsxNTAsNyBAQAogCXVuc2lnbmVkIGludCBsZW4sIHVubWFwX2xlbiA9IDAsIGZpbGxfbGV2ZWwsIGluc2VydF9wdHIsIG1pc2FsaWduOwogCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHVubWFwX2FkZHIgPSAwOwogCXVuc2lnbmVkIGludCBkbWFfbGVuOwotCXVuc2lnbmVkIHVubWFwX3NpbmdsZTsKKwlib29sIHVubWFwX3NpbmdsZTsKIAlpbnQgcV9zcGFjZSwgaSA9IDA7CiAJaW50IHJjID0gTkVUREVWX1RYX09LOwogCkBAIC0xNjcsNyArMTY5LDcgQEAKIAkgKiBzaW5jZSB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IG9uIG1hY2hpbmVzIHdpdGggc3BhcnNlCiAJICogbWVtb3J5LgogCSAqLwotCXVubWFwX3NpbmdsZSA9IDE7CisJdW5tYXBfc2luZ2xlID0gdHJ1ZTsKIAlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBjaV9kZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCS8qIFByb2Nlc3MgYWxsIGZyYWdtZW50cyAqLwpAQCAtMjEzLDcgKzIxNSw3IEBACiAJCQlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+dHNvaCk7CiAJCQlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+c2tiKTsKIAkJCUVGWF9CVUdfT05fUEFSQU5PSUQoYnVmZmVyLT5sZW4pOwotCQkJRUZYX0JVR19PTl9QQVJBTk9JRChidWZmZXItPmNvbnRpbnVhdGlvbiAhPSAxKTsKKwkJCUVGWF9CVUdfT05fUEFSQU5PSUQoIWJ1ZmZlci0+Y29udGludWF0aW9uKTsKIAkJCUVGWF9CVUdfT05fUEFSQU5PSUQoYnVmZmVyLT51bm1hcF9sZW4pOwogCiAJCQlkbWFfbGVuID0gKCgofmRtYV9hZGRyKSAmIGVmeC0+dHlwZS0+dHhfZG1hX21hc2spICsgMSk7CkBAIC0yMzMsNyArMjM1LDYgQEAKIAkJfSB3aGlsZSAobGVuKTsKIAogCQkvKiBUcmFuc2ZlciBvd25lcnNoaXAgb2YgdGhlIHVubWFwcGluZyB0byB0aGUgZmluYWwgYnVmZmVyICovCi0JCWJ1ZmZlci0+dW5tYXBfYWRkciA9IHVubWFwX2FkZHI7CiAJCWJ1ZmZlci0+dW5tYXBfc2luZ2xlID0gdW5tYXBfc2luZ2xlOwogCQlidWZmZXItPnVubWFwX2xlbiA9IHVubWFwX2xlbjsKIAkJdW5tYXBfbGVuID0gMDsKQEAgLTI0NywxNCArMjQ4LDE0IEBACiAJCXBhZ2Vfb2Zmc2V0ID0gZnJhZ21lbnQtPnBhZ2Vfb2Zmc2V0OwogCQlpKys7CiAJCS8qIE1hcCBmb3IgRE1BICovCi0JCXVubWFwX3NpbmdsZSA9IDA7CisJCXVubWFwX3NpbmdsZSA9IGZhbHNlOwogCQlkbWFfYWRkciA9IHBjaV9tYXBfcGFnZShwY2lfZGV2LCBwYWdlLCBwYWdlX29mZnNldCwgbGVuLAogCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAl9CiAKIAkvKiBUcmFuc2ZlciBvd25lcnNoaXAgb2YgdGhlIHNrYiB0byB0aGUgZmluYWwgYnVmZmVyICovCiAJYnVmZmVyLT5za2IgPSBza2I7Ci0JYnVmZmVyLT5jb250aW51YXRpb24gPSAwOworCWJ1ZmZlci0+Y29udGludWF0aW9uID0gZmFsc2U7CiAKIAkvKiBQYXNzIG9mZiB0byBoYXJkd2FyZSAqLwogCWZhbGNvbl9wdXNoX2J1ZmZlcnModHhfcXVldWUpOwpAQCAtMjg3LDkgKzI4OCwxNCBAQAogCX0KIAogCS8qIEZyZWUgdGhlIGZyYWdtZW50IHdlIHdlcmUgbWlkLXdheSB0aHJvdWdoIHB1c2hpbmcgKi8KLQlpZiAodW5tYXBfbGVuKQotCQlwY2lfdW5tYXBfcGFnZShwY2lfZGV2LCB1bm1hcF9hZGRyLCB1bm1hcF9sZW4sCi0JCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHVubWFwX2xlbikgeworCQlpZiAodW5tYXBfc2luZ2xlKQorCQkJcGNpX3VubWFwX3NpbmdsZShwY2lfZGV2LCB1bm1hcF9hZGRyLCB1bm1hcF9sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZWxzZQorCQkJcGNpX3VubWFwX3BhZ2UocGNpX2RldiwgdW5tYXBfYWRkciwgdW5tYXBfbGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0yOTksOCArMzA1LDggQEAKICAqIFRoaXMgcmVtb3ZlcyBwYWNrZXRzIGZyb20gdGhlIFRYIHF1ZXVlLCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZQogICogc3BlY2lmaWVkIGluZGV4LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZWZ4X2RlcXVldWVfYnVmZmVycyhzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGluZGV4KQorc3RhdGljIHZvaWQgZWZ4X2RlcXVldWVfYnVmZmVycyhzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKKwkJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IHR4X3F1ZXVlLT5lZng7CiAJdW5zaWduZWQgaW50IHN0b3BfaW5kZXgsIHJlYWRfcHRyOwpAQCAtMzIwLDcgKzMyNiw3IEBACiAJCX0KIAogCQllZnhfZGVxdWV1ZV9idWZmZXIodHhfcXVldWUsIGJ1ZmZlcik7Ci0JCWJ1ZmZlci0+Y29udGludWF0aW9uID0gMTsKKwkJYnVmZmVyLT5jb250aW51YXRpb24gPSB0cnVlOwogCQlidWZmZXItPmxlbiA9IDA7CiAKIAkJKyt0eF9xdWV1ZS0+cmVhZF9jb3VudDsKQEAgLTM2Nyw4ICszNzMsMTUgQEAKICAqLwogaW50IGVmeF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0Jc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldF9kZXYtPnByaXY7Ci0JcmV0dXJuIGVmeF94bWl0KGVmeCwgJmVmeC0+dHhfcXVldWVbMF0sIHNrYik7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlOworCisJaWYgKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkKKwkJdHhfcXVldWUgPSAmZWZ4LT50eF9xdWV1ZVtFRlhfVFhfUVVFVUVfT0ZGTE9BRF9DU1VNXTsKKwllbHNlCisJCXR4X3F1ZXVlID0gJmVmeC0+dHhfcXVldWVbRUZYX1RYX1FVRVVFX05PX0NTVU1dOworCisJcmV0dXJuIGVmeF94bWl0KGVmeCwgdHhfcXVldWUsIHNrYik7CiB9CiAKIHZvaWQgZWZ4X3htaXRfZG9uZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwgdW5zaWduZWQgaW50IGluZGV4KQpAQCAtNDEyLDMwICs0MjUsMjUgQEAKIAkvKiBBbGxvY2F0ZSBzb2Z0d2FyZSByaW5nICovCiAJdHhxX3NpemUgPSAoZWZ4LT50eXBlLT50eGRfcmluZ19tYXNrICsgMSkgKiBzaXplb2YoKnR4X3F1ZXVlLT5idWZmZXIpOwogCXR4X3F1ZXVlLT5idWZmZXIgPSBremFsbG9jKHR4cV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4X3F1ZXVlLT5idWZmZXIpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWwxOwotCX0KKwlpZiAoIXR4X3F1ZXVlLT5idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOwogCWZvciAoaSA9IDA7IGkgPD0gZWZ4LT50eXBlLT50eGRfcmluZ19tYXNrOyArK2kpCi0JCXR4X3F1ZXVlLT5idWZmZXJbaV0uY29udGludWF0aW9uID0gMTsKKwkJdHhfcXVldWUtPmJ1ZmZlcltpXS5jb250aW51YXRpb24gPSB0cnVlOwogCiAJLyogQWxsb2NhdGUgaGFyZHdhcmUgcmluZyAqLwogCXJjID0gZmFsY29uX3Byb2JlX3R4KHR4X3F1ZXVlKTsKIAlpZiAocmMpCi0JCWdvdG8gZmFpbDI7CisJCWdvdG8gZmFpbDsKIAogCXJldHVybiAwOwogCi0gZmFpbDI6CisgZmFpbDoKIAlrZnJlZSh0eF9xdWV1ZS0+YnVmZmVyKTsKIAl0eF9xdWV1ZS0+YnVmZmVyID0gTlVMTDsKLSBmYWlsMToKLQl0eF9xdWV1ZS0+dXNlZCA9IDA7Ci0KIAlyZXR1cm4gcmM7CiB9CiAKLWludCBlZnhfaW5pdF90eF9xdWV1ZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSkKK3ZvaWQgZWZ4X2luaXRfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCiB7CiAJRUZYX0xPRyh0eF9xdWV1ZS0+ZWZ4LCAiaW5pdGlhbGlzaW5nIFRYIHF1ZXVlICVkXG4iLCB0eF9xdWV1ZS0+cXVldWUpOwogCkBAIC00NDYsNyArNDU0LDcgQEAKIAlCVUdfT04odHhfcXVldWUtPnN0b3BwZWQpOwogCiAJLyogU2V0IHVwIFRYIGRlc2NyaXB0b3IgcmluZyAqLwotCXJldHVybiBmYWxjb25faW5pdF90eCh0eF9xdWV1ZSk7CisJZmFsY29uX2luaXRfdHgodHhfcXVldWUpOwogfQogCiB2b2lkIGVmeF9yZWxlYXNlX3R4X2J1ZmZlcnMoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCkBAIC00NjEsNyArNDY5LDcgQEAKIAkJYnVmZmVyID0gJnR4X3F1ZXVlLT5idWZmZXJbdHhfcXVldWUtPnJlYWRfY291bnQgJgogCQkJCQkgICB0eF9xdWV1ZS0+ZWZ4LT50eXBlLT50eGRfcmluZ19tYXNrXTsKIAkJZWZ4X2RlcXVldWVfYnVmZmVyKHR4X3F1ZXVlLCBidWZmZXIpOwotCQlidWZmZXItPmNvbnRpbnVhdGlvbiA9IDE7CisJCWJ1ZmZlci0+Y29udGludWF0aW9uID0gdHJ1ZTsKIAkJYnVmZmVyLT5sZW4gPSAwOwogCiAJCSsrdHhfcXVldWUtPnJlYWRfY291bnQ7CkBAIC00OTQsNyArNTAyLDYgQEAKIAogCWtmcmVlKHR4X3F1ZXVlLT5idWZmZXIpOwogCXR4X3F1ZXVlLT5idWZmZXIgPSBOVUxMOwotCXR4X3F1ZXVlLT51c2VkID0gMDsKIH0KIAogCkBAIC01MDksNyArNTE2LDcgQEAKIC8qIE51bWJlciBvZiBieXRlcyBpbnNlcnRlZCBhdCB0aGUgc3RhcnQgb2YgYSBUU08gaGVhZGVyIGJ1ZmZlciwKICAqIHNpbWlsYXIgdG8gTkVUX0lQX0FMSUdOLgogICovCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCiAjZGVmaW5lIFRTT0hfT0ZGU0VUCTAKICNlbHNlCiAjZGVmaW5lIFRTT0hfT0ZGU0VUCU5FVF9JUF9BTElHTgpAQCAtNTMzLDQ3ICs1NDAsMzcgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdHNvX3N0YXRlIC0gVFNPIHN0YXRlIGZvciBhbiBTS0IKLSAqIEByZW1haW5pbmdfbGVuOiBCeXRlcyBvZiBkYXRhIHdlJ3ZlIHlldCB0byBzZWdtZW50CisgKiBAb3V0X2xlbjogUmVtYWluaW5nIGxlbmd0aCBpbiBjdXJyZW50IHNlZ21lbnQKICAqIEBzZXFudW06IEN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyCisgKiBAaXB2NF9pZDogQ3VycmVudCBJUHY0IElELCBob3N0IGVuZGlhbgogICogQHBhY2tldF9zcGFjZTogUmVtYWluaW5nIHNwYWNlIGluIGN1cnJlbnQgcGFja2V0Ci0gKiBAaWZjOiBJbnB1dCBmcmFnbWVudCBjdXJzb3IuCi0gKglXaGVyZSB3ZSBhcmUgaW4gdGhlIGN1cnJlbnQgZnJhZ21lbnQgb2YgdGhlIGluY29taW5nIFNLQi4gIFRoZXNlCi0gKgl2YWx1ZXMgZ2V0IHVwZGF0ZWQgaW4gcGxhY2Ugd2hlbiB3ZSBzcGxpdCBhIGZyYWdtZW50IG92ZXIKLSAqCW11bHRpcGxlIHBhY2tldHMuCi0gKiBAcDogUGFyYW1ldGVycy4KLSAqCVRoZXNlIHZhbHVlcyBhcmUgc2V0IG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBUU08gc2VuZCBhbmQgZG8KLSAqCW5vdCBnZXQgY2hhbmdlZCBhcyB0aGUgcm91dGluZSBwcm9ncmVzc2VzLgorICogQGRtYV9hZGRyOiBETUEgYWRkcmVzcyBvZiBjdXJyZW50IHBvc2l0aW9uCisgKiBAaW5fbGVuOiBSZW1haW5pbmcgbGVuZ3RoIGluIGN1cnJlbnQgU0tCIGZyYWdtZW50CisgKiBAdW5tYXBfbGVuOiBMZW5ndGggb2YgU0tCIGZyYWdtZW50CisgKiBAdW5tYXBfYWRkcjogRE1BIGFkZHJlc3Mgb2YgU0tCIGZyYWdtZW50CisgKiBAdW5tYXBfc2luZ2xlOiBETUEgc2luZ2xlIHZzIHBhZ2UgbWFwcGluZyBmbGFnCisgKiBAaGVhZGVyX2xlbjogTnVtYmVyIG9mIGJ5dGVzIG9mIGhlYWRlcgorICogQGZ1bGxfcGFja2V0X3NpemU6IE51bWJlciBvZiBieXRlcyB0byBwdXQgaW4gZWFjaCBvdXRnb2luZyBzZWdtZW50CiAgKgogICogVGhlIHN0YXRlIHVzZWQgZHVyaW5nIHNlZ21lbnRhdGlvbi4gIEl0IGlzIHB1dCBpbnRvIHRoaXMgZGF0YSBzdHJ1Y3R1cmUKICAqIGp1c3QgdG8gbWFrZSBpdCBlYXN5IHRvIHBhc3MgaW50byBpbmxpbmUgZnVuY3Rpb25zLgogICovCiBzdHJ1Y3QgdHNvX3N0YXRlIHsKLQl1bnNpZ25lZCByZW1haW5pbmdfbGVuOworCS8qIE91dHB1dCBwb3NpdGlvbiAqLworCXVuc2lnbmVkIG91dF9sZW47CiAJdW5zaWduZWQgc2VxbnVtOworCXVuc2lnbmVkIGlwdjRfaWQ7CiAJdW5zaWduZWQgcGFja2V0X3NwYWNlOwogCi0Jc3RydWN0IHsKLQkJLyogRE1BIGFkZHJlc3Mgb2YgY3VycmVudCBwb3NpdGlvbiAqLwotCQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCQkvKiBSZW1haW5pbmcgbGVuZ3RoICovCi0JCXVuc2lnbmVkIGludCBsZW47Ci0JCS8qIERNQSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHdob2xlIGZyYWdtZW50ICovCi0JCXVuc2lnbmVkIGludCB1bm1hcF9sZW47Ci0JCWRtYV9hZGRyX3QgdW5tYXBfYWRkcjsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIHBhZ2Vfb2ZmOwotCX0gaWZjOworCS8qIElucHV0IHBvc2l0aW9uICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1bnNpZ25lZCBpbl9sZW47CisJdW5zaWduZWQgdW5tYXBfbGVuOworCWRtYV9hZGRyX3QgdW5tYXBfYWRkcjsKKwlib29sIHVubWFwX3NpbmdsZTsKIAotCXN0cnVjdCB7Ci0JCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgaGVhZGVyICovCi0JCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOwotCi0JCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGluIGVhY2ggb3V0Z29pbmcgc2VnbWVudC4gKi8KLQkJaW50IGZ1bGxfcGFja2V0X3NpemU7Ci0KLQkJLyogQ3VycmVudCBJUHY0IElELCBob3N0IGVuZGlhbi4gKi8KLQkJdW5zaWduZWQgaXB2NF9pZDsKLQl9IHA7CisJdW5zaWduZWQgaGVhZGVyX2xlbjsKKwlpbnQgZnVsbF9wYWNrZXRfc2l6ZTsKIH07CiAKIApAQCAtNTgxLDExICs1NzgsMjQgQEAKICAqIFZlcmlmeSB0aGF0IG91ciB2YXJpb3VzIGFzc3VtcHRpb25zIGFib3V0IHNrX2J1ZmZzIGFuZCB0aGUgY29uZGl0aW9ucwogICogdW5kZXIgd2hpY2ggVFNPIHdpbGwgYmUgYXR0ZW1wdGVkIGhvbGQgdHJ1ZS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGVmeF90c29fY2hlY2tfc2FmZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgZWZ4X3Rzb19jaGVja19zYWZlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JRUZYX0JVR19PTl9QQVJBTk9JRChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSk7CisJX19iZTE2IHByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKKwogCUVGWF9CVUdfT05fUEFSQU5PSUQoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byAhPQotCQkJICAgIHNrYi0+cHJvdG9jb2wpOworCQkJICAgIHByb3RvY29sKTsKKwlpZiAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCS8qIEZpbmQgdGhlIGVuY2Fwc3VsYXRlZCBwcm90b2NvbDsgcmVzZXQgbmV0d29yayBoZWFkZXIKKwkJICogYW5kIHRyYW5zcG9ydCBoZWFkZXIgYmFzZWQgb24gdGhhdC4gKi8KKwkJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOworCQlwcm90b2NvbCA9IHZlaC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKKwkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHNpemVvZigqdmVoKSk7CisJCWlmIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBzaXplb2YoKnZlaCkgKworCQkJCQkJIDQgKiBpcF9oZHIoc2tiKS0+aWhsKTsKKwl9CisKKwlFRlhfQlVHX09OX1BBUkFOT0lEKHByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSk7CiAJRUZYX0JVR19PTl9QQVJBTk9JRChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApOwogCUVGWF9CVUdfT05fUEFSQU5PSUQoKFBUUl9ESUZGKHRjcF9oZHIoc2tiKSwgc2tiLT5kYXRhKQogCQkJICAgICArICh0Y3BfaGRyKHNrYiktPmRvZmYgPDwgMnUpKSA+CkBAIC02ODUsMTggKzY5NSwxNCBAQAogICogQHR4X3F1ZXVlOgkJRWZ4IFRYIHF1ZXVlCiAgKiBAZG1hX2FkZHI6CQlETUEgYWRkcmVzcyBvZiBmcmFnbWVudAogICogQGxlbjoJCUxlbmd0aCBvZiBmcmFnbWVudAotICogQHNrYjoJCU9ubHkgbm9uLW51bGwgZm9yIGVuZCBvZiBsYXN0IHNlZ21lbnQKLSAqIEBlbmRfb2ZfcGFja2V0OglUcnVlIGlmIGxhc3QgZnJhZ21lbnQgaW4gYSBwYWNrZXQKLSAqIEB1bm1hcF9hZGRyOgkJRE1BIGFkZHJlc3Mgb2YgZnJhZ21lbnQgZm9yIHVubWFwcGluZwotICogQHVubWFwX2xlbjoJCU9ubHkgc2V0IHRoaXMgaW4gbGFzdCBzZWdtZW50IG9mIGEgZnJhZ21lbnQKKyAqIEBmaW5hbF9idWZmZXI6CVRoZSBmaW5hbCBidWZmZXIgaW5zZXJ0ZWQgaW50byB0aGUgcXVldWUKICAqCiAgKiBQdXNoIGRlc2NyaXB0b3JzIG9udG8gdGhlIFRYIHF1ZXVlLiAgUmV0dXJuIDAgb24gc3VjY2VzcyBvciAxIGlmCiAgKiBAdHhfcXVldWUgZnVsbC4KICAqLwogc3RhdGljIGludCBlZnhfdHhfcXVldWVfaW5zZXJ0KHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlLAogCQkJICAgICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHVuc2lnbmVkIGxlbiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZW5kX29mX3BhY2tldCwKLQkJCSAgICAgICBkbWFfYWRkcl90IHVubWFwX2FkZHIsIHVuc2lnbmVkIHVubWFwX2xlbikKKwkJCSAgICAgICBzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqKmZpbmFsX2J1ZmZlcikKIHsKIAlzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyOwogCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OwpAQCAtNzI0LDggKzczMCwxMCBAQAogCQkJZmlsbF9sZXZlbCA9ICh0eF9xdWV1ZS0+aW5zZXJ0X2NvdW50CiAJCQkJICAgICAgLSB0eF9xdWV1ZS0+b2xkX3JlYWRfY291bnQpOwogCQkJcV9zcGFjZSA9IGVmeC0+dHlwZS0+dHhkX3JpbmdfbWFzayAtIDEgLSBmaWxsX2xldmVsOwotCQkJaWYgKHVubGlrZWx5KHFfc3BhY2UtLSA8PSAwKSkKKwkJCWlmICh1bmxpa2VseShxX3NwYWNlLS0gPD0gMCkpIHsKKwkJCQkqZmluYWxfYnVmZmVyID0gTlVMTDsKIAkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJCXNtcF9tYigpOwogCQkJLS10eF9xdWV1ZS0+c3RvcHBlZDsKIAkJfQpAQCAtNzQyLDcgKzc1MCw3IEBACiAJCUVGWF9CVUdfT05fUEFSQU5PSUQoYnVmZmVyLT5sZW4pOwogCQlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+dW5tYXBfbGVuKTsKIAkJRUZYX0JVR19PTl9QQVJBTk9JRChidWZmZXItPnNrYik7Ci0JCUVGWF9CVUdfT05fUEFSQU5PSUQoYnVmZmVyLT5jb250aW51YXRpb24gIT0gMSk7CisJCUVGWF9CVUdfT05fUEFSQU5PSUQoIWJ1ZmZlci0+Y29udGludWF0aW9uKTsKIAkJRUZYX0JVR19PTl9QQVJBTk9JRChidWZmZXItPnRzb2gpOwogCiAJCWJ1ZmZlci0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKQEAgLTc2NSwxMCArNzczLDcgQEAKIAogCUVGWF9CVUdfT05fUEFSQU5PSUQoIWxlbik7CiAJYnVmZmVyLT5sZW4gPSBsZW47Ci0JYnVmZmVyLT5za2IgPSBza2I7Ci0JYnVmZmVyLT5jb250aW51YXRpb24gPSAhZW5kX29mX3BhY2tldDsKLQlidWZmZXItPnVubWFwX2FkZHIgPSB1bm1hcF9hZGRyOwotCWJ1ZmZlci0+dW5tYXBfbGVuID0gdW5tYXBfbGVuOworCSpmaW5hbF9idWZmZXIgPSBidWZmZXI7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4MCw4ICs3ODUsOCBAQAogICogYSBzaW5nbGUgZnJhZ21lbnQsIGFuZCB3ZSBrbm93IGl0IGRvZXNuJ3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAgSXQKICAqIGFsc28gYWxsb3dzIHVzIHRvIG5vdCB3b3JyeSBhYm91dCBlbmQtb2YtcGFja2V0IGV0Yy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGVmeF90c29fcHV0X2hlYWRlcihzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQkgICAgICBzdHJ1Y3QgZWZ4X3Rzb19oZWFkZXIgKnRzb2gsIHVuc2lnbmVkIGxlbikKK3N0YXRpYyB2b2lkIGVmeF90c29fcHV0X2hlYWRlcihzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKKwkJCSAgICAgICBzdHJ1Y3QgZWZ4X3Rzb19oZWFkZXIgKnRzb2gsIHVuc2lnbmVkIGxlbikKIHsKIAlzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyOwogCkBAIC03OTEsNyArNzk2LDcgQEAKIAlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+bGVuKTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+dW5tYXBfbGVuKTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+c2tiKTsKLQlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+Y29udGludWF0aW9uICE9IDEpOworCUVGWF9CVUdfT05fUEFSQU5PSUQoIWJ1ZmZlci0+Y29udGludWF0aW9uKTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+dHNvaCk7CiAJYnVmZmVyLT5sZW4gPSBsZW47CiAJYnVmZmVyLT5kbWFfYWRkciA9IHRzb2gtPmRtYV9hZGRyOwpAQCAtODA1LDYgKzgxMCw3IEBACiBzdGF0aWMgdm9pZCBlZnhfZW5xdWV1ZV91bndpbmQoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCiB7CiAJc3RydWN0IGVmeF90eF9idWZmZXIgKmJ1ZmZlcjsKKwlkbWFfYWRkcl90IHVubWFwX2FkZHI7CiAKIAkvKiBXb3JrIGJhY2t3YXJkcyB1bnRpbCB3ZSBoaXQgdGhlIG9yaWdpbmFsIGluc2VydCBwb2ludGVyIHZhbHVlICovCiAJd2hpbGUgKHR4X3F1ZXVlLT5pbnNlcnRfY291bnQgIT0gdHhfcXVldWUtPndyaXRlX2NvdW50KSB7CkBAIC04MTQsMTEgKzgyMCwxOCBAQAogCQllZnhfdHNvaF9mcmVlKHR4X3F1ZXVlLCBidWZmZXIpOwogCQlFRlhfQlVHX09OX1BBUkFOT0lEKGJ1ZmZlci0+c2tiKTsKIAkJYnVmZmVyLT5sZW4gPSAwOwotCQlidWZmZXItPmNvbnRpbnVhdGlvbiA9IDE7CisJCWJ1ZmZlci0+Y29udGludWF0aW9uID0gdHJ1ZTsKIAkJaWYgKGJ1ZmZlci0+dW5tYXBfbGVuKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZSh0eF9xdWV1ZS0+ZWZ4LT5wY2lfZGV2LAotCQkJCSAgICAgICBidWZmZXItPnVubWFwX2FkZHIsCi0JCQkJICAgICAgIGJ1ZmZlci0+dW5tYXBfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXVubWFwX2FkZHIgPSAoYnVmZmVyLT5kbWFfYWRkciArIGJ1ZmZlci0+bGVuIC0KKwkJCQkgICAgICBidWZmZXItPnVubWFwX2xlbik7CisJCQlpZiAoYnVmZmVyLT51bm1hcF9zaW5nbGUpCisJCQkJcGNpX3VubWFwX3NpbmdsZSh0eF9xdWV1ZS0+ZWZ4LT5wY2lfZGV2LAorCQkJCQkJIHVubWFwX2FkZHIsIGJ1ZmZlci0+dW5tYXBfbGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZWxzZQorCQkJCXBjaV91bm1hcF9wYWdlKHR4X3F1ZXVlLT5lZngtPnBjaV9kZXYsCisJCQkJCSAgICAgICB1bm1hcF9hZGRyLCBidWZmZXItPnVubWFwX2xlbiwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJYnVmZmVyLT51bm1hcF9sZW4gPSAwOwogCQl9CiAJfQpAQCAtODI2LDUwICs4MzksNTcgQEAKIAogCiAvKiBQYXJzZSB0aGUgU0tCIGhlYWRlciBhbmQgaW5pdGlhbGlzZSBzdGF0ZS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0c29fc3RhcnQoc3RydWN0IHRzb19zdGF0ZSAqc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB0c29fc3RhcnQoc3RydWN0IHRzb19zdGF0ZSAqc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJLyogQWxsIGV0aGVybmV0L0lQL1RDUCBoZWFkZXJzIGNvbWJpbmVkIHNpemUgaXMgVENQIGhlYWRlciBzaXplCiAJICogcGx1cyBvZmZzZXQgb2YgVENQIGhlYWRlciByZWxhdGl2ZSB0byBzdGFydCBvZiBwYWNrZXQuCiAJICovCi0Jc3QtPnAuaGVhZGVyX2xlbmd0aCA9ICgodGNwX2hkcihza2IpLT5kb2ZmIDw8IDJ1KQotCQkJICAgICAgICsgUFRSX0RJRkYodGNwX2hkcihza2IpLCBza2ItPmRhdGEpKTsKLQlzdC0+cC5mdWxsX3BhY2tldF9zaXplID0gKHN0LT5wLmhlYWRlcl9sZW5ndGgKLQkJCQkgICsgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJc3QtPmhlYWRlcl9sZW4gPSAoKHRjcF9oZHIoc2tiKS0+ZG9mZiA8PCAydSkKKwkJCSAgKyBQVFJfRElGRih0Y3BfaGRyKHNrYiksIHNrYi0+ZGF0YSkpOworCXN0LT5mdWxsX3BhY2tldF9zaXplID0gc3QtPmhlYWRlcl9sZW4gKyBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCi0Jc3QtPnAuaXB2NF9pZCA9IG50b2hzKGlwX2hkcihza2IpLT5pZCk7CisJc3QtPmlwdjRfaWQgPSBudG9ocyhpcF9oZHIoc2tiKS0+aWQpOwogCXN0LT5zZXFudW0gPSBudG9obCh0Y3BfaGRyKHNrYiktPnNlcSk7CiAKIAlFRlhfQlVHX09OX1BBUkFOT0lEKHRjcF9oZHIoc2tiKS0+dXJnKTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKHRjcF9oZHIoc2tiKS0+c3luKTsKIAlFRlhfQlVHX09OX1BBUkFOT0lEKHRjcF9oZHIoc2tiKS0+cnN0KTsKIAotCXN0LT5wYWNrZXRfc3BhY2UgPSBzdC0+cC5mdWxsX3BhY2tldF9zaXplOwotCXN0LT5yZW1haW5pbmdfbGVuID0gc2tiLT5sZW4gLSBzdC0+cC5oZWFkZXJfbGVuZ3RoOworCXN0LT5wYWNrZXRfc3BhY2UgPSBzdC0+ZnVsbF9wYWNrZXRfc2l6ZTsKKwlzdC0+b3V0X2xlbiA9IHNrYi0+bGVuIC0gc3QtPmhlYWRlcl9sZW47CisJc3QtPnVubWFwX2xlbiA9IDA7CisJc3QtPnVubWFwX3NpbmdsZSA9IGZhbHNlOwogfQogCi0KLS8qKgotICogdHNvX2dldF9mcmFnbWVudCAtIHJlY29yZCBmcmFnbWVudCBkZXRhaWxzIGFuZCBtYXAgZm9yIERNQQotICogQHN0OgkJCVRTTyBzdGF0ZQotICogQGVmeDoJCUVmeCBOSUMKLSAqIEBkYXRhOgkJUG9pbnRlciB0byBmcmFnbWVudCBkYXRhCi0gKiBAbGVuOgkJTGVuZ3RoIG9mIGZyYWdtZW50Ci0gKgotICogUmVjb3JkIGZyYWdtZW50IGRldGFpbHMgYW5kIG1hcCBmb3IgRE1BLiAgUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IKLSAqIC0lRU5PTUVNIGlmIERNQSBtYXBwaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW5saW5lIGludCB0c29fZ2V0X2ZyYWdtZW50KHN0cnVjdCB0c29fc3RhdGUgKnN0LCBzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJCSAgIGludCBsZW4sIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcGFnZV9vZmYpCitzdGF0aWMgaW50IHRzb19nZXRfZnJhZ21lbnQoc3RydWN0IHRzb19zdGF0ZSAqc3QsIHN0cnVjdCBlZnhfbmljICplZngsCisJCQkgICAgc2tiX2ZyYWdfdCAqZnJhZykKIHsKKwlzdC0+dW5tYXBfYWRkciA9IHBjaV9tYXBfcGFnZShlZngtPnBjaV9kZXYsIGZyYWctPnBhZ2UsCisJCQkJICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGxpa2VseSghcGNpX2RtYV9tYXBwaW5nX2Vycm9yKGVmeC0+cGNpX2Rldiwgc3QtPnVubWFwX2FkZHIpKSkgeworCQlzdC0+dW5tYXBfc2luZ2xlID0gZmFsc2U7CisJCXN0LT51bm1hcF9sZW4gPSBmcmFnLT5zaXplOworCQlzdC0+aW5fbGVuID0gZnJhZy0+c2l6ZTsKKwkJc3QtPmRtYV9hZGRyID0gc3QtPnVubWFwX2FkZHI7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KIAotCXN0LT5pZmMudW5tYXBfYWRkciA9IHBjaV9tYXBfcGFnZShlZngtPnBjaV9kZXYsIHBhZ2UsIHBhZ2Vfb2ZmLAotCQkJCQkgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKGxpa2VseSghcGNpX2RtYV9tYXBwaW5nX2Vycm9yKGVmeC0+cGNpX2Rldiwgc3QtPmlmYy51bm1hcF9hZGRyKSkpIHsKLQkJc3QtPmlmYy51bm1hcF9sZW4gPSBsZW47Ci0JCXN0LT5pZmMubGVuID0gbGVuOwotCQlzdC0+aWZjLmRtYV9hZGRyID0gc3QtPmlmYy51bm1hcF9hZGRyOwotCQlzdC0+aWZjLnBhZ2UgPSBwYWdlOwotCQlzdC0+aWZjLnBhZ2Vfb2ZmID0gcGFnZV9vZmY7CitzdGF0aWMgaW50IHRzb19nZXRfaGVhZF9mcmFnbWVudChzdHJ1Y3QgdHNvX3N0YXRlICpzdCwgc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaGwgPSBzdC0+aGVhZGVyX2xlbjsKKwlpbnQgbGVuID0gc2tiX2hlYWRsZW4oc2tiKSAtIGhsOworCisJc3QtPnVubWFwX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShlZngtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhsLAorCQkJCQlsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChsaWtlbHkoIXBjaV9kbWFfbWFwcGluZ19lcnJvcihlZngtPnBjaV9kZXYsIHN0LT51bm1hcF9hZGRyKSkpIHsKKwkJc3QtPnVubWFwX3NpbmdsZSA9IHRydWU7CisJCXN0LT51bm1hcF9sZW4gPSBsZW47CisJCXN0LT5pbl9sZW4gPSBsZW47CisJCXN0LT5kbWFfYWRkciA9IHN0LT51bm1hcF9hZGRyOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FTk9NRU07CkBAIC04ODYsMzYgKzkwNiw0NSBAQAogICogb2YgZnJhZ21lbnQgb3IgZW5kLW9mLXBhY2tldC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgaWYgbm90IGVub3VnaAogICogc3BhY2UgaW4gQHR4X3F1ZXVlLgogICovCi1zdGF0aWMgaW5saW5lIGludCB0c29fZmlsbF9wYWNrZXRfd2l0aF9mcmFnbWVudChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQkJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQlzdHJ1Y3QgdHNvX3N0YXRlICpzdCkKK3N0YXRpYyBpbnQgdHNvX2ZpbGxfcGFja2V0X3dpdGhfZnJhZ21lbnQoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUsCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IHRzb19zdGF0ZSAqc3QpCiB7Ci0KKwlzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyOwogCWludCBuLCBlbmRfb2ZfcGFja2V0LCByYzsKIAotCWlmIChzdC0+aWZjLmxlbiA9PSAwKQorCWlmIChzdC0+aW5fbGVuID09IDApCiAJCXJldHVybiAwOwogCWlmIChzdC0+cGFja2V0X3NwYWNlID09IDApCiAJCXJldHVybiAwOwogCi0JRUZYX0JVR19PTl9QQVJBTk9JRChzdC0+aWZjLmxlbiA8PSAwKTsKKwlFRlhfQlVHX09OX1BBUkFOT0lEKHN0LT5pbl9sZW4gPD0gMCk7CiAJRUZYX0JVR19PTl9QQVJBTk9JRChzdC0+cGFja2V0X3NwYWNlIDw9IDApOwogCi0JbiA9IG1pbihzdC0+aWZjLmxlbiwgc3QtPnBhY2tldF9zcGFjZSk7CisJbiA9IG1pbihzdC0+aW5fbGVuLCBzdC0+cGFja2V0X3NwYWNlKTsKIAogCXN0LT5wYWNrZXRfc3BhY2UgLT0gbjsKLQlzdC0+cmVtYWluaW5nX2xlbiAtPSBuOwotCXN0LT5pZmMubGVuIC09IG47Ci0Jc3QtPmlmYy5wYWdlX29mZiArPSBuOwotCWVuZF9vZl9wYWNrZXQgPSBzdC0+cmVtYWluaW5nX2xlbiA9PSAwIHx8IHN0LT5wYWNrZXRfc3BhY2UgPT0gMDsKKwlzdC0+b3V0X2xlbiAtPSBuOworCXN0LT5pbl9sZW4gLT0gbjsKIAotCXJjID0gZWZ4X3R4X3F1ZXVlX2luc2VydCh0eF9xdWV1ZSwgc3QtPmlmYy5kbWFfYWRkciwgbiwKLQkJCQkgc3QtPnJlbWFpbmluZ19sZW4gPyBOVUxMIDogc2tiLAotCQkJCSBlbmRfb2ZfcGFja2V0LCBzdC0+aWZjLnVubWFwX2FkZHIsCi0JCQkJIHN0LT5pZmMubGVuID8gMCA6IHN0LT5pZmMudW5tYXBfbGVuKTsKKwlyYyA9IGVmeF90eF9xdWV1ZV9pbnNlcnQodHhfcXVldWUsIHN0LT5kbWFfYWRkciwgbiwgJmJ1ZmZlcik7CisJaWYgKGxpa2VseShyYyA9PSAwKSkgeworCQlpZiAoc3QtPm91dF9sZW4gPT0gMCkKKwkJCS8qIFRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgc2tiICovCisJCQlidWZmZXItPnNrYiA9IHNrYjsKIAotCXN0LT5pZmMuZG1hX2FkZHIgKz0gbjsKKwkJZW5kX29mX3BhY2tldCA9IHN0LT5vdXRfbGVuID09IDAgfHwgc3QtPnBhY2tldF9zcGFjZSA9PSAwOworCQlidWZmZXItPmNvbnRpbnVhdGlvbiA9ICFlbmRfb2ZfcGFja2V0OwogCisJCWlmIChzdC0+aW5fbGVuID09IDApIHsKKwkJCS8qIFRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgcGNpIG1hcHBpbmcgKi8KKwkJCWJ1ZmZlci0+dW5tYXBfbGVuID0gc3QtPnVubWFwX2xlbjsKKwkJCWJ1ZmZlci0+dW5tYXBfc2luZ2xlID0gc3QtPnVubWFwX3NpbmdsZTsKKwkJCXN0LT51bm1hcF9sZW4gPSAwOworCQl9CisJfQorCisJc3QtPmRtYV9hZGRyICs9IG47CiAJcmV0dXJuIHJjOwogfQogCkBAIC05MjksOSArOTU4LDkgQEAKICAqIEdlbmVyYXRlIGEgbmV3IGhlYWRlciBhbmQgcHJlcGFyZSBmb3IgdGhlIG5ldyBwYWNrZXQuICBSZXR1cm4gMCBvbgogICogc3VjY2Vzcywgb3IgLTEgaWYgZmFpbGVkIHRvIGFsbG9jIGhlYWRlci4KICAqLwotc3RhdGljIGlubGluZSBpbnQgdHNvX3N0YXJ0X25ld19wYWNrZXQoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIHN0cnVjdCB0c29fc3RhdGUgKnN0KQorc3RhdGljIGludCB0c29fc3RhcnRfbmV3X3BhY2tldChzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKKwkJCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCB0c29fc3RhdGUgKnN0KQogewogCXN0cnVjdCBlZnhfdHNvX2hlYWRlciAqdHNvaDsKIAlzdHJ1Y3QgaXBoZHIgKnRzb2hfaXBoOwpAQCAtOTQwLDcgKzk2OSw3IEBACiAJdTggKmhlYWRlcjsKIAogCS8qIEFsbG9jYXRlIGEgRE1BLW1hcHBlZCBoZWFkZXIgYnVmZmVyLiAqLwotCWlmIChsaWtlbHkoVFNPSF9TSVpFKHN0LT5wLmhlYWRlcl9sZW5ndGgpIDw9IFRTT0hfU1REX1NJWkUpKSB7CisJaWYgKGxpa2VseShUU09IX1NJWkUoc3QtPmhlYWRlcl9sZW4pIDw9IFRTT0hfU1REX1NJWkUpKSB7CiAJCWlmICh0eF9xdWV1ZS0+dHNvX2hlYWRlcnNfZnJlZSA9PSBOVUxMKSB7CiAJCQlpZiAoZWZ4X3Rzb2hfYmxvY2tfYWxsb2ModHhfcXVldWUpKQogCQkJCXJldHVybiAtMTsKQEAgLTk1MSw3ICs5ODAsNyBAQAogCQl0c29oLT51bm1hcF9sZW4gPSAwOwogCX0gZWxzZSB7CiAJCXR4X3F1ZXVlLT50c29fbG9uZ19oZWFkZXJzKys7Ci0JCXRzb2ggPSBlZnhfdHNvaF9oZWFwX2FsbG9jKHR4X3F1ZXVlLCBzdC0+cC5oZWFkZXJfbGVuZ3RoKTsKKwkJdHNvaCA9IGVmeF90c29oX2hlYXBfYWxsb2ModHhfcXVldWUsIHN0LT5oZWFkZXJfbGVuKTsKIAkJaWYgKHVubGlrZWx5KCF0c29oKSkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC05NjEsMzMgKzk5MCwzMiBAQAogCXRzb2hfaXBoID0gKHN0cnVjdCBpcGhkciAqKShoZWFkZXIgKyBTS0JfSVBWNF9PRkYoc2tiKSk7CiAKIAkvKiBDb3B5IGFuZCB1cGRhdGUgdGhlIGhlYWRlcnMuICovCi0JbWVtY3B5KGhlYWRlciwgc2tiLT5kYXRhLCBzdC0+cC5oZWFkZXJfbGVuZ3RoKTsKKwltZW1jcHkoaGVhZGVyLCBza2ItPmRhdGEsIHN0LT5oZWFkZXJfbGVuKTsKIAogCXRzb2hfdGgtPnNlcSA9IGh0b25sKHN0LT5zZXFudW0pOwogCXN0LT5zZXFudW0gKz0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQlpZiAoc3QtPnJlbWFpbmluZ19sZW4gPiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJaWYgKHN0LT5vdXRfbGVuID4gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQkvKiBUaGlzIHBhY2tldCB3aWxsIG5vdCBmaW5pc2ggdGhlIFRTTyBidXJzdC4gKi8KLQkJaXBfbGVuZ3RoID0gc3QtPnAuZnVsbF9wYWNrZXRfc2l6ZSAtIEVUSF9IRFJfTEVOKHNrYik7CisJCWlwX2xlbmd0aCA9IHN0LT5mdWxsX3BhY2tldF9zaXplIC0gRVRIX0hEUl9MRU4oc2tiKTsKIAkJdHNvaF90aC0+ZmluID0gMDsKIAkJdHNvaF90aC0+cHNoID0gMDsKIAl9IGVsc2UgewogCQkvKiBUaGlzIHBhY2tldCB3aWxsIGJlIHRoZSBsYXN0IGluIHRoZSBUU08gYnVyc3QuICovCi0JCWlwX2xlbmd0aCA9IChzdC0+cC5oZWFkZXJfbGVuZ3RoIC0gRVRIX0hEUl9MRU4oc2tiKQotCQkJICAgICArIHN0LT5yZW1haW5pbmdfbGVuKTsKKwkJaXBfbGVuZ3RoID0gc3QtPmhlYWRlcl9sZW4gLSBFVEhfSERSX0xFTihza2IpICsgc3QtPm91dF9sZW47CiAJCXRzb2hfdGgtPmZpbiA9IHRjcF9oZHIoc2tiKS0+ZmluOwogCQl0c29oX3RoLT5wc2ggPSB0Y3BfaGRyKHNrYiktPnBzaDsKIAl9CiAJdHNvaF9pcGgtPnRvdF9sZW4gPSBodG9ucyhpcF9sZW5ndGgpOwogCiAJLyogTGludXggbGVhdmVzIHN1aXRhYmxlIGdhcHMgaW4gdGhlIElQIElEIHNwYWNlIGZvciB1cyB0byBmaWxsLiAqLwotCXRzb2hfaXBoLT5pZCA9IGh0b25zKHN0LT5wLmlwdjRfaWQpOwotCXN0LT5wLmlwdjRfaWQrKzsKKwl0c29oX2lwaC0+aWQgPSBodG9ucyhzdC0+aXB2NF9pZCk7CisJc3QtPmlwdjRfaWQrKzsKIAogCXN0LT5wYWNrZXRfc3BhY2UgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCSsrdHhfcXVldWUtPnRzb19wYWNrZXRzOwogCiAJLyogRm9ybSBhIGRlc2NyaXB0b3IgZm9yIHRoaXMgaGVhZGVyLiAqLwotCWVmeF90c29fcHV0X2hlYWRlcih0eF9xdWV1ZSwgdHNvaCwgc3QtPnAuaGVhZGVyX2xlbmd0aCk7CisJZWZ4X3Rzb19wdXRfaGVhZGVyKHR4X3F1ZXVlLCB0c29oLCBzdC0+aGVhZGVyX2xlbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDUsMTEgKzEwMzMsMTEgQEAKICAqICVORVRERVZfVFhfT0sgb3IgJU5FVERFVl9UWF9CVVNZLgogICovCiBzdGF0aWMgaW50IGVmeF9lbnF1ZXVlX3NrYl90c28oc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OwogCWludCBmcmFnX2ksIHJjLCByYzIgPSBORVRERVZfVFhfT0s7CiAJc3RydWN0IHRzb19zdGF0ZSBzdGF0ZTsKLQlza2JfZnJhZ190ICpmOwogCiAJLyogVmVyaWZ5IFRTTyBpcyBzYWZlIC0gdGhlc2UgY2hlY2tzIHNob3VsZCBuZXZlciBmYWlsLiAqLwogCWVmeF90c29fY2hlY2tfc2FmZShza2IpOwpAQCAtMTAyMSwyOSArMTA0OSwxNiBAQAogCS8qIEFzc3VtZSB0aGF0IHNrYiBoZWFkZXIgYXJlYSBjb250YWlucyBleGFjdGx5IHRoZSBoZWFkZXJzLCBhbmQKIAkgKiBhbGwgcGF5bG9hZCBpcyBpbiB0aGUgZnJhZyBsaXN0LgogCSAqLwotCWlmIChza2JfaGVhZGxlbihza2IpID09IHN0YXRlLnAuaGVhZGVyX2xlbmd0aCkgeworCWlmIChza2JfaGVhZGxlbihza2IpID09IHN0YXRlLmhlYWRlcl9sZW4pIHsKIAkJLyogR3JhYiB0aGUgZmlyc3QgcGF5bG9hZCBmcmFnbWVudC4gKi8KIAkJRUZYX0JVR19PTl9QQVJBTk9JRChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIDwgMSk7CiAJCWZyYWdfaSA9IDA7Ci0JCWYgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnX2ldOwotCQlyYyA9IHRzb19nZXRfZnJhZ21lbnQoJnN0YXRlLCB0eF9xdWV1ZS0+ZWZ4LAotCQkJCSAgICAgIGYtPnNpemUsIGYtPnBhZ2UsIGYtPnBhZ2Vfb2Zmc2V0KTsKKwkJcmMgPSB0c29fZ2V0X2ZyYWdtZW50KCZzdGF0ZSwgZWZ4LAorCQkJCSAgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3MgKyBmcmFnX2kpOwogCQlpZiAocmMpCiAJCQlnb3RvIG1lbV9lcnI7CiAJfSBlbHNlIHsKLQkJLyogSXQgbWF5IGxvb2sgbGlrZSB0aGlzIGNvZGUgZnJhZ21lbnQgYXNzdW1lcyB0aGF0IHRoZQotCQkgKiBza2ItPmRhdGEgcG9ydGlvbiBkb2VzIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnksIGJ1dAotCQkgKiB0aGF0IGlzIG5vdCB0aGUgY2FzZS4gIEl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZGlyZWN0Ci0JCSAqIG1hcHBlZCBtZW1vcnksIGFuZCB0aGVyZWZvcmUgaXMgcGh5c2ljYWxseSBjb250aWd1b3VzLAotCQkgKiBhbmQgc28gRE1BIHdpbGwgd29yayBmaW5lLiAga21hcF9hdG9taWMoKSBvbiB0aGlzIHJlZ2lvbgotCQkgKiB3aWxsIGp1c3QgcmV0dXJuIHRoZSBkaXJlY3QgbWFwcGluZywgc28gdGhhdCB3aWxsIHdvcmsKLQkJICogdG9vLgotCQkgKi8KLQkJaW50IHBhZ2Vfb2ZmID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgKFBBR0VfU0laRSAtIDEpOwotCQlpbnQgaGwgPSBzdGF0ZS5wLmhlYWRlcl9sZW5ndGg7Ci0JCXJjID0gdHNvX2dldF9mcmFnbWVudCgmc3RhdGUsIHR4X3F1ZXVlLT5lZngsCi0JCQkJICAgICAgc2tiX2hlYWRsZW4oc2tiKSAtIGhsLAotCQkJCSAgICAgIHZpcnRfdG9fcGFnZShza2ItPmRhdGEpLCBwYWdlX29mZiArIGhsKTsKKwkJcmMgPSB0c29fZ2V0X2hlYWRfZnJhZ21lbnQoJnN0YXRlLCBlZngsIHNrYik7CiAJCWlmIChyYykKIAkJCWdvdG8gbWVtX2VycjsKIAkJZnJhZ19pID0gLTE7CkBAIC0xMDU4LDEzICsxMDczLDEyIEBACiAJCQlnb3RvIHN0b3A7CiAKIAkJLyogTW92ZSBvbnRvIHRoZSBuZXh0IGZyYWdtZW50PyAqLwotCQlpZiAoc3RhdGUuaWZjLmxlbiA9PSAwKSB7CisJCWlmIChzdGF0ZS5pbl9sZW4gPT0gMCkgewogCQkJaWYgKCsrZnJhZ19pID49IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCiAJCQkJLyogRW5kIG9mIHBheWxvYWQgcmVhY2hlZC4gKi8KIAkJCQlicmVhazsKLQkJCWYgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnX2ldOwotCQkJcmMgPSB0c29fZ2V0X2ZyYWdtZW50KCZzdGF0ZSwgdHhfcXVldWUtPmVmeCwKLQkJCQkJICAgICAgZi0+c2l6ZSwgZi0+cGFnZSwgZi0+cGFnZV9vZmZzZXQpOworCQkJcmMgPSB0c29fZ2V0X2ZyYWdtZW50KCZzdGF0ZSwgZWZ4LAorCQkJCQkgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzICsgZnJhZ19pKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG1lbV9lcnI7CiAJCX0KQEAgLTEwODIsOCArMTA5Niw3IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogIG1lbV9lcnI6Ci0JRUZYX0VSUih0eF9xdWV1ZS0+ZWZ4LCAiT3V0IG9mIG1lbW9yeSBmb3IgVFNPIGhlYWRlcnMsIG9yIFBDSSBtYXBwaW5nIgotCQkiIGVycm9yXG4iKTsKKwlFRlhfRVJSKGVmeCwgIk91dCBvZiBtZW1vcnkgZm9yIFRTTyBoZWFkZXJzLCBvciBQQ0kgbWFwcGluZyBlcnJvclxuIik7CiAJZGV2X2tmcmVlX3NrYl9hbnkoKHN0cnVjdCBza19idWZmICopc2tiKTsKIAlnb3RvIHVud2luZDsKIApAQCAtMTA5Miw5ICsxMTA1LDE5IEBACiAKIAkvKiBTdG9wIHRoZSBxdWV1ZSBpZiBpdCB3YXNuJ3Qgc3RvcHBlZCBiZWZvcmUuICovCiAJaWYgKHR4X3F1ZXVlLT5zdG9wcGVkID09IDEpCi0JCWVmeF9zdG9wX3F1ZXVlKHR4X3F1ZXVlLT5lZngpOworCQllZnhfc3RvcF9xdWV1ZShlZngpOwogCiAgdW53aW5kOgorCS8qIEZyZWUgdGhlIERNQSBtYXBwaW5nIHdlIHdlcmUgaW4gdGhlIHByb2Nlc3Mgb2Ygd3JpdGluZyBvdXQgKi8KKwlpZiAoc3RhdGUudW5tYXBfbGVuKSB7CisJCWlmIChzdGF0ZS51bm1hcF9zaW5nbGUpCisJCQlwY2lfdW5tYXBfc2luZ2xlKGVmeC0+cGNpX2Rldiwgc3RhdGUudW5tYXBfYWRkciwKKwkJCQkJIHN0YXRlLnVubWFwX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWVsc2UKKwkJCXBjaV91bm1hcF9wYWdlKGVmeC0+cGNpX2Rldiwgc3RhdGUudW5tYXBfYWRkciwKKwkJCQkgICAgICAgc3RhdGUudW5tYXBfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisKIAllZnhfZW5xdWV1ZV91bndpbmQodHhfcXVldWUpOwogCXJldHVybiByYzI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvdHguaCBiL2RyaXZlcnMvbmV0L3NmYy90eC5oCmluZGV4IDE1MjZhNzMuLjVlMWNjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy90eC5oCisrKyBiL2RyaXZlcnMvbmV0L3NmYy90eC5oCkBAIC0xNSw3ICsxNSw3IEBACiAKIGludCBlZnhfcHJvYmVfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpOwogdm9pZCBlZnhfcmVtb3ZlX3R4X3F1ZXVlKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKTsKLWludCBlZnhfaW5pdF90eF9xdWV1ZShzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSk7Cit2b2lkIGVmeF9pbml0X3R4X3F1ZXVlKHN0cnVjdCBlZnhfdHhfcXVldWUgKnR4X3F1ZXVlKTsKIHZvaWQgZWZ4X2ZpbmlfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpOwogCiBpbnQgZWZ4X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvd29ya2Fyb3VuZHMuaCBiL2RyaXZlcnMvbmV0L3NmYy93b3JrYXJvdW5kcy5oCmluZGV4IDM1YWIxOWMyLi5mYTdiNDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvd29ya2Fyb3VuZHMuaAorKysgYi9kcml2ZXJzL25ldC9zZmMvd29ya2Fyb3VuZHMuaApAQCAtMjAsMTQgKzIwLDEwIEBACiAKIC8qIFhBVUkgcmVzZXRzIGlmIGxpbmsgbm90IGRldGVjdGVkICovCiAjZGVmaW5lIEVGWF9XT1JLQVJPVU5EXzUxNDcgRUZYX1dPUktBUk9VTkRfQUxXQVlTCi0vKiBTTkFQIGZyYW1lcyBoYXZlIFRPQkVfRElTQyBzZXQgKi8KLSNkZWZpbmUgRUZYX1dPUktBUk9VTkRfNTQ3NSBFRlhfV09SS0FST1VORF9BTFdBWVMKIC8qIFJYIFBDSWUgZG91YmxlIHNwbGl0IHBlcmZvcm1hbmNlIGlzc3VlICovCiAjZGVmaW5lIEVGWF9XT1JLQVJPVU5EXzc1NzUgRUZYX1dPUktBUk9VTkRfQUxXQVlTCiAvKiBUWCBwa3QgcGFyc2VyIHByb2JsZW0gd2l0aCA8PSAxNiBieXRlIFRYZXMgKi8KICNkZWZpbmUgRUZYX1dPUktBUk9VTkRfOTE0MSBFRlhfV09SS0FST1VORF9BTFdBWVMKLS8qIFhHWFMgYW5kIFhBVUkgcmVzZXQgc2VxdWVuY2luZyBpbiBTVyAqLwotI2RlZmluZSBFRlhfV09SS0FST1VORF85Mzg4IEVGWF9XT1JLQVJPVU5EX0FMV0FZUwogLyogTG93IHJhdGUgQ1JDIGVycm9ycyByZXF1aXJlIFhBVUkgcmVzZXQgKi8KICNkZWZpbmUgRUZYX1dPUktBUk9VTkRfMTA3NTAgRUZYX1dPUktBUk9VTkRfQUxXQVlTCiAvKiBUWF9FVl9QS1RfRVJSIGNhbiBiZSBjYXVzZWQgYnkgYSBkYW5nbGluZyBUWCBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMveGZwX3BoeS5jIGIvZHJpdmVycy9uZXQvc2ZjL3hmcF9waHkuYwppbmRleCBmMzY4NGFkLi4yNzYxNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMveGZwX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy94ZnBfcGh5LmMKQEAgLTQwLDcgKzQwLDcgQEAKIH0KIAogc3RydWN0IHhmcF9waHlfZGF0YSB7Ci0JaW50IHR4X2Rpc2FibGVkOworCWVudW0gZWZ4X3BoeV9tb2RlIHBoeV9tb2RlOwogfTsKIAogI2RlZmluZSBYRlBfTUFYX1JFU0VUX1RJTUUgNTAwCkBAIC05Myw3ICs5Myw3IEBACiAJCSAiICV4KVxuIiwgZGV2aWQsIE1ESU9fSURfT1VJKGRldmlkKSwgTURJT19JRF9NT0RFTChkZXZpZCksCiAJCSBNRElPX0lEX1JFVihkZXZpZCkpOwogCi0JcGh5X2RhdGEtPnR4X2Rpc2FibGVkID0gZWZ4LT50eF9kaXNhYmxlZDsKKwlwaHlfZGF0YS0+cGh5X21vZGUgPSBlZngtPnBoeV9tb2RlOwogCiAJcmMgPSB4ZnBfcmVzZXRfcGh5KGVmeCk7CiAKQEAgLTEzNiwxMyArMTM2LDE0IEBACiAJc3RydWN0IHhmcF9waHlfZGF0YSAqcGh5X2RhdGEgPSBlZngtPnBoeV9kYXRhOwogCiAJLyogUmVzZXQgdGhlIFBIWSB3aGVuIG1vdmluZyBmcm9tIHR4IG9mZiB0byB0eCBvbiAqLwotCWlmIChwaHlfZGF0YS0+dHhfZGlzYWJsZWQgJiYgIWVmeC0+dHhfZGlzYWJsZWQpCisJaWYgKCEoZWZ4LT5waHlfbW9kZSAmIFBIWV9NT0RFX1RYX0RJU0FCTEVEKSAmJgorCSAgICAocGh5X2RhdGEtPnBoeV9tb2RlICYgUEhZX01PREVfVFhfRElTQUJMRUQpKQogCQl4ZnBfcmVzZXRfcGh5KGVmeCk7CiAKIAltZGlvX2NsYXVzZTQ1X3RyYW5zbWl0X2Rpc2FibGUoZWZ4KTsKIAltZGlvX2NsYXVzZTQ1X3BoeV9yZWNvbmZpZ3VyZShlZngpOwogCi0JcGh5X2RhdGEtPnR4X2Rpc2FibGVkID0gZWZ4LT50eF9kaXNhYmxlZDsKKwlwaHlfZGF0YS0+cGh5X21vZGUgPSBlZngtPnBoeV9tb2RlOwogCWVmeC0+bGlua191cCA9IHhmcF9saW5rX29rKGVmeCk7CiAJZWZ4LT5saW5rX29wdGlvbnMgPSBHTV9MUEFfMTAwMDBGVUxMOwogfQpAQCAtMTUxLDcgKzE1Miw3IEBACiBzdGF0aWMgdm9pZCB4ZnBfcGh5X2Zpbmkoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAkvKiBDbG9iYmVyIHRoZSBMRUQgaWYgaXQgd2FzIGJsaW5raW5nICovCi0JZWZ4LT5ib2FyZF9pbmZvLmJsaW5rKGVmeCwgMCk7CisJZWZ4LT5ib2FyZF9pbmZvLmJsaW5rKGVmeCwgZmFsc2UpOwogCiAJLyogRnJlZSB0aGUgY29udGV4dCBibG9jayAqLwogCWtmcmVlKGVmeC0+cGh5X2RhdGEpOwpAQCAtMTY0LDcgKzE2NSw2IEBACiAJLmNoZWNrX2h3ICAgICAgICA9IHhmcF9waHlfY2hlY2tfaHcsCiAJLmZpbmkgICAgICAgICAgICA9IHhmcF9waHlfZmluaSwKIAkuY2xlYXJfaW50ZXJydXB0ID0geGZwX3BoeV9jbGVhcl9pbnRlcnJ1cHQsCi0JLnJlc2V0X3hhdWkgICAgICA9IGVmeF9wb3J0X2R1bW15X29wX3ZvaWQsCiAJLm1tZHMgICAgICAgICAgICA9IFhGUF9SRVFVSVJFRF9ERVZTLAogCS5sb29wYmFja3MgICAgICAgPSBYRlBfTE9PUEJBQ0tTLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoX2V0aC5jIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKaW5kZXggMWMzNzBlNi4uYjM5ZDFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvc2hfZXRoLmMKQEAgLTExNDAsNyArMTE0MCw3IEBACiAKIAkvKiBIb29rIHVwIE1JSSBzdXBwb3J0IGZvciBldGh0b29sICovCiAJbWRwLT5taWlfYnVzLT5uYW1lID0gInNoX21paSI7Ci0JbWRwLT5taWlfYnVzLT5kZXYgPSAmbmRldi0+ZGV2OworCW1kcC0+bWlpX2J1cy0+cGFyZW50ID0gJm5kZXYtPmRldjsKIAltZHAtPm1paV9idXMtPmlkWzBdID0gaWQ7CiAKIAkvKiBQSFkgSVJRICovCkBAIC0xMTY2LDcgKzExNjYsNyBAQAogCWtmcmVlKG1kcC0+bWlpX2J1cy0+aXJxKTsKIAogb3V0X2ZyZWVfYnVzOgotCWtmcmVlKG1kcC0+bWlpX2J1cyk7CisJZnJlZV9tZGlvX2JpdGJhbmcobWRwLT5taWlfYnVzKTsKIAogb3V0X2ZyZWVfYml0YmFuZzoKIAlrZnJlZShiaXRiYW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvcG1mLmMgYi9kcml2ZXJzL25ldC9za2ZwL3BtZi5jCmluZGV4IGVhODVkZTkuLjc5ZTY2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvcG1mLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwpAQCAtNDQsMTcgKzQ0LDEwIEBACiAJCQkJICAgICBpbnQgc2V0LCBpbnQgbG9jYWwpOwogc3RhdGljIGludCBwb3J0X3RvX21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOwogCi0jZGVmaW5lIE1PRkZTUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliICopMCktPmUpKQotI2RlZmluZSBNT0ZGU0EoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYiAqKTApLT5lKSkKLQotI2RlZmluZSBNT0ZGTVMoZSkJKChpbnQpJigoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQotI2RlZmluZSBNT0ZGTUEoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQotCi0jZGVmaW5lIE1PRkZBUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCi0jZGVmaW5lIE1PRkZBQShlKQkoKGludCkgKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCi0KLSNkZWZpbmUgTU9GRlBTKGUpCSgoaW50KSYoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKLSNkZWZpbmUgTU9GRlBBKGUpCSgoaW50KSAoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKKyNkZWZpbmUgTU9GRlNTKGUpCW9mZnNldG9mKHN0cnVjdCBmZGRpX21pYiwgZSkKKyNkZWZpbmUgTU9GRk1TKGUpCW9mZnNldG9mKHN0cnVjdCBmZGRpX21pYl9tLCBlKQorI2RlZmluZSBNT0ZGQVMoZSkJb2Zmc2V0b2Yoc3RydWN0IGZkZGlfbWliX2EsIGUpCisjZGVmaW5lIE1PRkZQUyhlKQlvZmZzZXRvZihzdHJ1Y3QgZmRkaV9taWJfcCwgZSkKIAogCiAjZGVmaW5lIEFDX0cJMHgwMQkJLyogR2V0ICovCkBAIC04Nyw4ICs4MCw4IEBACiAJeyBTTVRfUDEwMEQsQUNfRywJTU9GRlNTKGZkZGlTTVRPcFZlcnNpb25JZCksCSJTIgl9ICwKIAl7IFNNVF9QMTAwRSxBQ19HLAlNT0ZGU1MoZmRkaVNNVEhpVmVyc2lvbklkKSwJIlMiCX0gLAogCXsgU01UX1AxMDBGLEFDX0csCU1PRkZTUyhmZGRpU01UTG9WZXJzaW9uSWQpLAkiUyIJfSAsCi0JeyBTTVRfUDEwMTAsQUNfRywJTU9GRlNBKGZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhKSwgIkQiIH0gLAotCXsgU01UX1AxMDExLEFDX0dSLAlNT0ZGU0EoZmRkaVNNVFVzZXJEYXRhKSwJIkQiCX0gLAorCXsgU01UX1AxMDEwLEFDX0csCU1PRkZTUyhmZGRpU01UTWFudWZhY3R1cmVyRGF0YSksICJEIiB9ICwKKwl7IFNNVF9QMTAxMSxBQ19HUiwJTU9GRlNTKGZkZGlTTVRVc2VyRGF0YSksCSJEIgl9ICwKIAl7IFNNVF9QMTAxMixBQ19HLAlNT0ZGU1MoZmRkaVNNVE1JQlZlcnNpb25JZCksCSJTIgl9ICwKIAogCS8qIFN0YXRpb25Db25maWdHcnAgKi8KQEAgLTEwMyw3ICs5Niw3IEBACiAJeyBTTVRfUDEwMUQsQUNfR1IsCU1PRkZTUyhmZGRpU01UVFRfTm90aWZ5KSwJIndTIgl9ICwKIAl7IFNNVF9QMTAxRSxBQ19HUiwJTU9GRlNTKGZkZGlTTVRTdGF0UnB0UG9saWN5KSwJImJCIgl9ICwKIAl7IFNNVF9QMTAxRixBQ19HUiwJTU9GRlNTKGZkZGlTTVRUcmFjZV9NYXhFeHBpcmF0aW9uKSwibEwiCX0gLAotCXsgU01UX1AxMDIwLEFDX0csCU1PRkZTQShmZGRpU01UUE9SVEluZGV4ZXMpLAkiSUkiCX0gLAorCXsgU01UX1AxMDIwLEFDX0csCU1PRkZTUyhmZGRpU01UUE9SVEluZGV4ZXMpLAkiSUkiCX0gLAogCXsgU01UX1AxMDIxLEFDX0csCU1PRkZTUyhmZGRpU01UTUFDSW5kZXhlcyksCSJJIgl9ICwKIAl7IFNNVF9QMTAyMixBQ19HLAlNT0ZGU1MoZmRkaVNNVEJ5cGFzc1ByZXNlbnQpLAkiRiIJfSAsCiAKQEAgLTExNyw4ICsxMTAsOCBAQAogCiAJLyogTUlCT3BlcmF0aW9uR3JwICovCiAJeyBTTVRfUDEwMzIsQUNfR1JPVVAJfSAsCi0JeyBTTVRfUDEwMzMsQUNfRywJTU9GRlNBKGZkZGlTTVRUaW1lU3RhbXApLCJQIgkJfSAsCi0JeyBTTVRfUDEwMzQsQUNfRywJTU9GRlNBKGZkZGlTTVRUcmFuc2l0aW9uVGltZVN0YW1wKSwiUCIJfSAsCisJeyBTTVRfUDEwMzMsQUNfRywJTU9GRlNTKGZkZGlTTVRUaW1lU3RhbXApLCJQIgkJfSAsCisJeyBTTVRfUDEwMzQsQUNfRywJTU9GRlNTKGZkZGlTTVRUcmFuc2l0aW9uVGltZVN0YW1wKSwiUCIJfSAsCiAJLyogTk9URSA6IFNNVF9QMTAzNSBpcyBhbHJlYWR5IHN3YXBwZWQgISBTTVRfUF9TRVRDT1VOVCAqLwogCXsgU01UX1AxMDM1LEFDX0csCU1PRkZTUyhmZGRpU01UU2V0Q291bnQpLCI0UCIJCX0gLAogCXsgU01UX1AxMDM2LEFDX0csCU1PRkZTUyhmZGRpU01UTGFzdFNldFN0YXRpb25JZCksIjgiCX0gLApAQCAtMTI5LDcgKzEyMiw3IEBACiAJICogUFJJVkFURSBFWFRFTlNJT05TCiAJICogb25seSBhY2Nlc3NpYmxlIGxvY2FsbHkgdG8gZ2V0L3NldCBwYXNzd2QKIAkgKi8KLQl7IFNNVF9QMTBGMCxBQ19HUiwJTU9GRlNBKGZkZGlQUlBNRlBhc3N3ZCksCSI4Igl9ICwKKwl7IFNNVF9QMTBGMCxBQ19HUiwJTU9GRlNTKGZkZGlQUlBNRlBhc3N3ZCksCSI4Igl9ICwKIAl7IFNNVF9QMTBGMSxBQ19HUiwJTU9GRlNTKGZkZGlQUlBNRlN0YXRpb24pLAkiOCIJfSAsCiAjaWZkZWYJRVNTCiAJeyBTTVRfUDEwRjIsQUNfR1IsCU1PRkZTUyhmZGRpRVNTUGF5bG9hZCksCQkibEwiCX0gLApAQCAtMjQ1LDcgKzIzOCw3IEBACiAJeyBTTVRfUDQwMEUsQUNfR1IsCU1PRkZQUyhmZGRpUE9SVENvbm5lY3Rpb25Qb2xpY2llcyksImJCIgl9ICwKIAl7IFNNVF9QNDAwRixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRNYWNJbmRpY2F0ZWQpLAkiMiIJfSAsCiAJeyBTTVRfUDQwMTAsQUNfRywJTU9GRlBTKGZkZGlQT1JUQ3VycmVudFBhdGgpLAkiRSIJfSAsCi0JeyBTTVRfUDQwMTEsQUNfR1IsCU1PRkZQQShmZGRpUE9SVFJlcXVlc3RlZFBhdGhzKSwJImw0Igl9ICwKKwl7IFNNVF9QNDAxMSxBQ19HUiwJTU9GRlBTKGZkZGlQT1JUUmVxdWVzdGVkUGF0aHMpLAkibDQiCX0gLAogCXsgU01UX1A0MDEyLEFDX0csCU1PRkZQUyhmZGRpUE9SVE1BQ1BsYWNlbWVudCksCSJTIgl9ICwKIAl7IFNNVF9QNDAxMyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRBdmFpbGFibGVQYXRocyksCSJCIgl9ICwKIAl7IFNNVF9QNDAxNixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRQTURDbGFzcyksCSJFIgl9ICwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCAyZTI2ZGNlLi40M2Y0YzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC0zMTksNiArMzE5LDcgQEAKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAljb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKIAl1MzIgc3VwcG9ydGVkID0gc2tnZV9zdXBwb3J0ZWRfbW9kZXMoaHcpOworCWludCBlcnIgPSAwOwogCiAJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBzdXBwb3J0ZWQ7CkBAIC0zNjcsOCArMzY4LDE0IEBACiAJc2tnZS0+YXV0b25lZyA9IGVjbWQtPmF1dG9uZWc7CiAJc2tnZS0+YWR2ZXJ0aXNpbmcgPSBlY21kLT5hZHZlcnRpc2luZzsKIAotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCXNrZ2VfcGh5X3Jlc2V0KHNrZ2UpOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJc2tnZV9kb3duKGRldik7CisJCWVyciA9IHNrZ2VfdXAoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2Nsb3NlKGRldik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQogCiAJcmV0dXJuICgwKTsKIH0KQEAgLTQ5NCw3ICs1MDEsNyBAQAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcCkKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJaWYgKHAtPnJ4X3BlbmRpbmcgPT0gMCB8fCBwLT5yeF9wZW5kaW5nID4gTUFYX1JYX1JJTkdfU0laRSB8fAogCSAgICBwLT50eF9wZW5kaW5nIDwgVFhfTE9XX1dBVEVSIHx8IHAtPnR4X3BlbmRpbmcgPiBNQVhfVFhfUklOR19TSVpFKQpAQCAtNTEwLDcgKzUxNyw3IEBACiAJCQlkZXZfY2xvc2UoZGV2KTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdTMyIHNrZ2VfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC01OTMsNiArNjAwLDcgQEAKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtIG9sZDsKKwlpbnQgZXJyID0gMDsKIAogCXNrZ2VfZ2V0X3BhdXNlcGFyYW0oZGV2LCAmb2xkKTsKIApAQCAtNjA5LDggKzYxNywxNCBAQAogCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX05PTkU7CiAJfQogCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJc2tnZV9waHlfcmVzZXQoc2tnZSk7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlza2dlX2Rvd24oZGV2KTsKKwkJZXJyID0gc2tnZV91cChkZXYpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfY2xvc2UoZGV2KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCBlMjRiMjVjLi4zODEzZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0zMDM0LDcgKzMwMzQsOCBAQAogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OwogCi0JaWYgKHdvbC0+d29sb3B0cyAmIH5za3kyX3dvbF9zdXBwb3J0ZWQoc2t5Mi0+aHcpKQorCWlmICgod29sLT53b2xvcHRzICYgfnNreTJfd29sX3N1cHBvcnRlZChza3kyLT5odykpCisJICAgIHx8ICFkZXZpY2VfY2FuX3dha2V1cCgmaHctPnBkZXYtPmRldikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCXNreTItPndvbCA9IHdvbC0+d29sb3B0czsKQEAgLTMwNDUsNiArMzA0Niw4IEBACiAJCXNreTJfd3JpdGUzMihodywgQjBfQ1RTVCwgc2t5Mi0+d29sCiAJCQkgICAgID8gWTJfSFdfV09MX09OIDogWTJfSFdfV09MX09GRik7CiAKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmh3LT5wZGV2LT5kZXYsIHNreTItPndvbCk7CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJc2t5Ml93b2xfaW5pdChza3kyKTsKIAlyZXR1cm4gMDsKQEAgLTM3MzIsMjcgKzM3MzUsNjMgQEAKIAlyZXR1cm4gMSA8PCAoICgocmVnMiAmIFBDSV9WUERfUk9NX1NaKSA+PiAxNCkgKyA4KTsKIH0KIAotc3RhdGljIHUzMiBza3kyX3ZwZF9yZWFkKHN0cnVjdCBza3kyX2h3ICpodywgaW50IGNhcCwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbnQgc2t5Ml92cGRfd2FpdChjb25zdCBzdHJ1Y3Qgc2t5Ml9odyAqaHcsIGludCBjYXAsIHUxNiBidXN5KQogewotCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CiAKLQlza3kyX3BjaV93cml0ZTE2KGh3LCBjYXAgKyBQQ0lfVlBEX0FERFIsIG9mZnNldCk7CisJd2hpbGUgKCAoc2t5Ml9wY2lfcmVhZDE2KGh3LCBjYXAgKyBQQ0lfVlBEX0FERFIpICYgUENJX1ZQRF9BRERSX0YpID09IGJ1c3kpIHsKKwkJLyogQ2FuIHRha2UgdXAgdG8gMTAuNiBtcyBmb3Igd3JpdGUgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi80KSkgeworCQkJZGV2X2VycigmaHctPnBkZXYtPmRldiwgUEZYICJWUEQgY3ljbGUgdGltZWQgb3V0Iik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltZGVsYXkoMSk7CisJfQogCi0JZG8gewotCQlvZmZzZXQgPSBza3kyX3BjaV9yZWFkMTYoaHcsIGNhcCArIFBDSV9WUERfQUREUik7Ci0JfSB3aGlsZSAoIShvZmZzZXQgJiBQQ0lfVlBEX0FERFJfRikpOwotCi0JdmFsID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBjYXAgKyBQQ0lfVlBEX0RBVEEpOwotCXJldHVybiB2YWw7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNreTJfdnBkX3dyaXRlKHN0cnVjdCBza3kyX2h3ICpodywgaW50IGNhcCwgdTE2IG9mZnNldCwgdTMyIHZhbCkKK3N0YXRpYyBpbnQgc2t5Ml92cGRfcmVhZChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIGludCBjYXAsIHZvaWQgKmRhdGEsCisJCQkgdTE2IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkKIHsKLQlza3kyX3BjaV93cml0ZTE2KGh3LCBjYXAgKyBQQ0lfVlBEX0RBVEEsIHZhbCk7Ci0Jc2t5Ml9wY2lfd3JpdGUzMihodywgY2FwICsgUENJX1ZQRF9BRERSLCBvZmZzZXQgfCBQQ0lfVlBEX0FERFJfRik7Ci0JZG8gewotCQlvZmZzZXQgPSBza3kyX3BjaV9yZWFkMTYoaHcsIGNhcCArIFBDSV9WUERfQUREUik7Ci0JfSB3aGlsZSAob2Zmc2V0ICYgUENJX1ZQRF9BRERSX0YpOworCWludCByYyA9IDA7CisKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQl1MzIgdmFsOworCisJCXNreTJfcGNpX3dyaXRlMTYoaHcsIGNhcCArIFBDSV9WUERfQUREUiwgb2Zmc2V0KTsKKwkJcmMgPSBza3kyX3ZwZF93YWl0KGh3LCBjYXAsIDApOworCQlpZiAocmMpCisJCQlicmVhazsKKworCQl2YWwgPSBza3kyX3BjaV9yZWFkMzIoaHcsIGNhcCArIFBDSV9WUERfREFUQSk7CisKKwkJbWVtY3B5KGRhdGEsICZ2YWwsIG1pbihzaXplb2YodmFsKSwgbGVuZ3RoKSk7CisJCW9mZnNldCArPSBzaXplb2YodTMyKTsKKwkJZGF0YSArPSBzaXplb2YodTMyKTsKKwkJbGVuZ3RoIC09IHNpemVvZih1MzIpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBza3kyX3ZwZF93cml0ZShzdHJ1Y3Qgc2t5Ml9odyAqaHcsIGludCBjYXAsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgIHUxNiBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gc2l6ZW9mKHUzMikpIHsKKwkJdTMyIHZhbCA9ICoodTMyICopKGRhdGEgKyBpKTsKKworCQlza3kyX3BjaV93cml0ZTMyKGh3LCBjYXAgKyBQQ0lfVlBEX0RBVEEsIHZhbCk7CisJCXNreTJfcGNpX3dyaXRlMzIoaHcsIGNhcCArIFBDSV9WUERfQUREUiwgb2Zmc2V0IHwgUENJX1ZQRF9BRERSX0YpOworCisJCXJjID0gc2t5Ml92cGRfd2FpdChodywgY2FwLCBQQ0lfVlBEX0FERFJfRik7CisJCWlmIChyYykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgc2t5Ml9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLApAQCAtMzc2MCwyNCArMzc5OSwxMyBAQAogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBjYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHNreTItPmh3LT5wZGV2LCBQQ0lfQ0FQX0lEX1ZQRCk7Ci0JaW50IGxlbmd0aCA9IGVlcHJvbS0+bGVuOwotCXUxNiBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKIAogCWlmICghY2FwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVlcHJvbS0+bWFnaWMgPSBTS1kyX0VFUFJPTV9NQUdJQzsKIAotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXUzMiB2YWwgPSBza3kyX3ZwZF9yZWFkKHNreTItPmh3LCBjYXAsIG9mZnNldCk7Ci0JCWludCBuID0gbWluX3QoaW50LCBsZW5ndGgsIHNpemVvZih2YWwpKTsKLQotCQltZW1jcHkoZGF0YSwgJnZhbCwgbik7Ci0JCWxlbmd0aCAtPSBuOwotCQlkYXRhICs9IG47Ci0JCW9mZnNldCArPSBuOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2t5Ml92cGRfcmVhZChza3kyLT5odywgY2FwLCBkYXRhLCBlZXByb20tPm9mZnNldCwgZWVwcm9tLT5sZW4pOwogfQogCiBzdGF0aWMgaW50IHNreTJfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKQEAgLTM3ODUsOCArMzgxMyw2IEBACiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGNhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoc2t5Mi0+aHctPnBkZXYsIFBDSV9DQVBfSURfVlBEKTsKLQlpbnQgbGVuZ3RoID0gZWVwcm9tLT5sZW47Ci0JdTE2IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OwogCiAJaWYgKCFjYXApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzc5NCwyMSArMzgyMCwxMSBAQAogCWlmIChlZXByb20tPm1hZ2ljICE9IFNLWTJfRUVQUk9NX01BR0lDKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXUzMiB2YWw7Ci0JCWludCBuID0gbWluX3QoaW50LCBsZW5ndGgsIHNpemVvZih2YWwpKTsKKwkvKiBQYXJ0aWFsIHdyaXRlcyBub3Qgc3VwcG9ydGVkICovCisJaWYgKChlZXByb20tPm9mZnNldCAmIDMpIHx8IChlZXByb20tPmxlbiAmIDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAobiA8IHNpemVvZih2YWwpKQotCQkJdmFsID0gc2t5Ml92cGRfcmVhZChza3kyLT5odywgY2FwLCBvZmZzZXQpOwotCQltZW1jcHkoJnZhbCwgZGF0YSwgbik7Ci0KLQkJc2t5Ml92cGRfd3JpdGUoc2t5Mi0+aHcsIGNhcCwgb2Zmc2V0LCB2YWwpOwotCi0JCWxlbmd0aCAtPSBuOwotCQlkYXRhICs9IG47Ci0JCW9mZnNldCArPSBuOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2t5Ml92cGRfd3JpdGUoc2t5Mi0+aHcsIGNhcCwgZGF0YSwgZWVwcm9tLT5vZmZzZXQsIGVlcHJvbS0+bGVuKTsKIH0KIAogCkBAIC00MTY2LDE2ICs0MTgyLDY3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcGNpX3dha2VfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBwbSAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSk7Ci0JdTE2IHZhbHVlOworLyoKKyAqIFJlYWQgYW5kIHBhcnNlIHRoZSBmaXJzdCBwYXJ0IG9mIFZpdGFsIFByb2R1Y3QgRGF0YQorICovCisjZGVmaW5lIFZQRF9TSVpFCTEyOAorI2RlZmluZSBWUERfTUFHSUMJMHg4MgogCi0JaWYgKCFwbSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgJnZhbHVlKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZhbHVlICYgUENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBza3kyX3ZwZF9pbmZvKHN0cnVjdCBza3kyX2h3ICpodykKK3sKKwlpbnQgY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShody0+cGRldiwgUENJX0NBUF9JRF9WUEQpOworCWNvbnN0IHU4ICpwOworCXU4ICp2cGRfYnVmID0gTlVMTDsKKwl1MTYgbGVuOworCXN0YXRpYyBzdHJ1Y3QgdnBkX3RhZyB7CisJCWNoYXIgdGFnWzJdOworCQljaGFyICpsYWJlbDsKKwl9IHZwZF90YWdzW10gPSB7CisJCXsgIlBOIiwJIlBhcnQgTnVtYmVyIiB9LAorCQl7ICJFQyIsICJFbmdpbmVlcmluZyBMZXZlbCIgfSwKKwkJeyAiTU4iLCAiTWFudWZhY3R1cmVyIiB9LAorCX07CisKKwlpZiAoIWNhcCkKKwkJZ290byBvdXQ7CisKKwl2cGRfYnVmID0ga21hbGxvYyhWUERfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cGRfYnVmKQorCQlnb3RvIG91dDsKKworCWlmIChza3kyX3ZwZF9yZWFkKGh3LCBjYXAsIHZwZF9idWYsIDAsIFZQRF9TSVpFKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodnBkX2J1ZlswXSAhPSBWUERfTUFHSUMpCisJCWdvdG8gb3V0OworCWxlbiA9IHZwZF9idWZbMV07CisJaWYgKGxlbiA9PSAwIHx8IGxlbiA+IFZQRF9TSVpFIC0gNCkKKwkJZ290byBvdXQ7CisJcCA9IHZwZF9idWYgKyAzOworCWRldl9pbmZvKCZody0+cGRldi0+ZGV2LCAiJS4qc1xuIiwgbGVuLCBwKTsKKwlwICs9IGxlbjsKKworCXdoaWxlIChwIDwgdnBkX2J1ZiArIFZQRF9TSVpFIC0gNCkgeworCQlpbnQgaTsKKworCQlpZiAoIW1lbWNtcCgiUlciLCBwLCAyKSkJLyogZW5kIG1hcmtlciAqLworCQkJYnJlYWs7CisKKwkJbGVuID0gcFsyXTsKKwkJaWYgKGxlbiA+IChwIC0gdnBkX2J1ZikgLSA0KQorCQkJYnJlYWs7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodnBkX3RhZ3MpOyBpKyspIHsKKwkJCWlmICghbWVtY21wKHZwZF90YWdzW2ldLnRhZywgcCwgMikpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICVzOiAlLipzXG4iLAorCQkJCSAgICAgICB2cGRfdGFnc1tpXS5sYWJlbCwgbGVuLCBwICsgMyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcCArPSBsZW4gKyAzOworCX0KK291dDoKKwlrZnJlZSh2cGRfYnVmKTsKIH0KIAogLyogVGhpcyBkcml2ZXIgc3VwcG9ydHMgeXVrb24yIGNoaXBzZXQgb25seSAqLwpAQCAtNDIzOCw3ICs0MzA1LDcgQEAKIAkJfQogCX0KIAotCXdvbF9kZWZhdWx0ID0gcGNpX3dha2VfZW5hYmxlZChwZGV2KSA/IFdBS0VfTUFHSUMgOiAwOworCXdvbF9kZWZhdWx0ID0gZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikgPyBXQUtFX01BR0lDIDogMDsKIAogCWVyciA9IC1FTk9NRU07CiAJaHcgPSBremFsbG9jKHNpemVvZigqaHcpLCBHRlBfS0VSTkVMKTsKQEAgLTQyNzYsMTMgKzQzNDMsMTMgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ2JXMgYWRkciAweCVsbHggaXJxICVkIFl1a29uLTIgJXMgcmV2ICVkXG4iLAotCQkgRFJWX1ZFUlNJT04sICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAotCQkgcGRldi0+aXJxLCBza3kyX25hbWUoaHctPmNoaXBfaWQsIGJ1ZjEsIHNpemVvZihidWYxKSksCi0JCSBody0+Y2hpcF9yZXYpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJZdWtvbi0yICVzIGNoaXAgcmV2aXNpb24gJWRcbiIsCisJCSBza3kyX25hbWUoaHctPmNoaXBfaWQsIGJ1ZjEsIHNpemVvZihidWYxKSksIGh3LT5jaGlwX3Jldik7CiAKIAlza3kyX3Jlc2V0KGh3KTsKIAorCXNreTJfdnBkX2luZm8oaHcpOworCiAJZGV2ID0gc2t5Ml9pbml0X25ldGRldihodywgMCwgdXNpbmdfZGFjLCB3b2xfZGVmYXVsdCk7CiAJaWYgKCFkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTQ1MzMsNiArNDYwMCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNreTJfaW5pdF9tb2R1bGUodm9pZCkKIHsKKwlwcl9pbmZvKFBGWCAiZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwogCXNreTJfZGVidWdfaW5pdCgpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza3kyX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTF4LmMgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKaW5kZXggYzU4NzE2Mi4uOGFhNzQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxMXguYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJdW5zaWduZWQgaW50IHJlZywgdGltZW91dD0wLCByZXNldHM9MTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJLyoJIFRha2Ugb3V0IG9mIFBNIHNldHRpbmcgZmlyc3QgKi8KIAlpZiAoKFNNQ19HRVRfUE1UX0NUUkwobHApICYgUE1UX0NUUkxfUkVBRFlfKSA9PSAwKSB7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAl1bnNpZ25lZCBtYXNrLCBjZmcsIGNyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlTTUNfU0VUX01BQ19BRERSKGxwLCBkZXYtPmRldl9hZGRyKTsKIApAQCAtMzI5LDcgKzMyOSw3IEBACiAJdW5zaWduZWQgY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIENBUkROQU1FLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIENBUkROQU1FLCBfX2Z1bmNfXyk7CiAKIAkvKiBEaXNhYmxlIElSUSdzICovCiAJU01DX1NFVF9JTlRfRU4obHAsIDApOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJc3RydWN0IHNtYzkxMXhfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgZmlmb19jb3VudCwgdGltZW91dCwgcmVnOwogCi0JREJHKFNNQ19ERUJVR19GVU5DIHwgU01DX0RFQlVHX1JYLCAiJXM6IC0tPiAlc1xuIiwgQ0FSRE5BTUUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DIHwgU01DX0RFQlVHX1JYLCAiJXM6IC0tPiAlc1xuIiwgQ0FSRE5BTUUsIF9fZnVuY19fKTsKIAlmaWZvX2NvdW50ID0gU01DX0dFVF9SWF9GSUZPX0lORihscCkgJiAweEZGRkY7CiAJaWYgKGZpZm9fY291bnQgPD0gNCkgewogCQkvKiBNYW51YWxseSBkdW1wIHRoZSBwYWNrZXQgZGF0YSAqLwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAogCURCRyhTTUNfREVCVUdfRlVOQyB8IFNNQ19ERUJVR19SWCwgIiVzOiAtLT4gJXNcbiIsCi0JCWRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gU01DX0dFVF9SWF9TVFNfRklGTyhscCk7CiAJREJHKFNNQ19ERUJVR19SWCwgIiVzOiBSeCBwa3QgbGVuICVkIHN0YXR1cyAweCUwOHggXG4iLAogCQlkZXYtPm5hbWUsIChzdGF0dXMgJiAweDNmZmYwMDAwKSA+PiAxNiwgc3RhdHVzICYgMHhjMDAwZmZmZik7CkBAIC00NjAsNyArNDYwLDcgQEAKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURCRyhTTUNfREVCVUdfRlVOQyB8IFNNQ19ERUJVR19UWCwgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoU01DX0RFQlVHX0ZVTkMgfCBTTUNfREVCVUdfVFgsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAlCVUdfT04obHAtPnBlbmRpbmdfdHhfc2tiID09IE5VTEwpOwogCiAJc2tiID0gbHAtPnBlbmRpbmdfdHhfc2tiOwpAQCAtNTI0LDcgKzUyNCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCURCRyhTTUNfREVCVUdfRlVOQyB8IFNNQ19ERUJVR19UWCwgIiVzOiAtLT4gJXNcbiIsCi0JCWRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlCVUdfT04obHAtPnBlbmRpbmdfdHhfc2tiICE9IE5VTEwpOwogCkBAIC01OTYsNyArNTk2LDcgQEAKIAl1bnNpZ25lZCBpbnQgdHhfc3RhdHVzOwogCiAJREJHKFNNQ19ERUJVR19GVU5DIHwgU01DX0RFQlVHX1RYLCAiJXM6IC0tPiAlc1xuIiwKLQkJZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCS8qIENvbGxlY3QgdGhlIFRYIHN0YXR1cyAqLwogCXdoaWxlICgoKFNNQ19HRVRfVFhfRklGT19JTkYobHApICYgVFhfRklGT19JTkZfVFNVU0VEXykgPj4gMTYpICE9IDApIHsKQEAgLTY0Nyw3ICs2NDcsNyBAQAogCVNNQ19HRVRfTUlJKGxwLCBwaHlyZWcsIHBoeWFkZHIsIHBoeWRhdGEpOwogCiAJREJHKFNNQ19ERUJVR19NSVNDLCAiJXM6IHBoeWFkZHI9MHgleCwgcGh5cmVnPTB4JTAyeCwgcGh5ZGF0YT0weCUwNHhcbiIsCi0JCV9fRlVOQ1RJT05fXywgcGh5YWRkciwgcGh5cmVnLCBwaHlkYXRhKTsKKwkJX19mdW5jX18sIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CiAJcmV0dXJuIHBoeWRhdGE7CiB9CiAKQEAgLTY2MSw3ICs2NjEsNyBAQAogCXN0cnVjdCBzbWM5MTF4X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlEQkcoU01DX0RFQlVHX01JU0MsICIlczogcGh5YWRkcj0weCV4LCBwaHlyZWc9MHgleCwgcGh5ZGF0YT0weCV4XG4iLAotCQlfX0ZVTkNUSU9OX18sIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CisJCV9fZnVuY19fLCBwaHlhZGRyLCBwaHlyZWcsIHBoeWRhdGEpOwogCiAJU01DX1NFVF9NSUkobHAsIHBoeXJlZywgcGh5YWRkciwgcGh5ZGF0YSk7CiB9CkBAIC02NzYsNyArNjc2LDcgQEAKIAlpbnQgcGh5YWRkcjsKIAl1bnNpZ25lZCBpbnQgY2ZnLCBpZDEsIGlkMjsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCWxwLT5waHlfdHlwZSA9IDA7CiAKQEAgLTY4NSw4ICs2ODUsMTAgQEAKIAkgKiBQSFkjMSB0byBQSFkjMzEsIGFuZCB0aGVuIFBIWSMwIGxhc3QuCiAJICovCiAJc3dpdGNoKGxwLT52ZXJzaW9uKSB7Ci0JCWNhc2UgMHgxMTU6Ci0JCWNhc2UgMHgxMTc6CisJCWNhc2UgQ0hJUF85MTE1OgorCQljYXNlIENISVBfOTExNzoKKwkJY2FzZSBDSElQXzkyMTU6CisJCWNhc2UgQ0hJUF85MjE3OgogCQkJY2ZnID0gU01DX0dFVF9IV19DRkcobHApOwogCQkJaWYgKGNmZyAmIEhXX0NGR19FWFRfUEhZX0RFVF8pIHsKIAkJCQljZmcgJj0gfkhXX0NGR19QSFlfQ0xLX1NFTF87CkBAIC03MjIsNiArNzI0LDkgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQorCQkJCWlmIChwaHlhZGRyIDwgMzIpCisJCQkJCS8qIEZvdW5kIGFuIGV4dGVybmFsIFBIWSAqLworCQkJCQlicmVhazsKIAkJCX0KIAkJZGVmYXVsdDoKIAkJCS8qIEludGVybmFsIG1lZGlhIG9ubHkgKi8KQEAgLTc0Niw3ICs3NTEsNyBAQAogCWludCBwaHlhZGRyID0gbHAtPm1paS5waHlfaWQ7CiAJaW50IGJtY3I7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAkvKiBFbnRlciBMaW5rIERpc2FibGUgc3RhdGUgKi8KIAlTTUNfR0VUX1BIWV9CTUNSKGxwLCBwaHlhZGRyLCBibWNyKTsKQEAgLTc5Myw3ICs3OTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHJlZzsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXMoKVxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXMoKVxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAlyZWcgPSBTTUNfR0VUX1BNVF9DVFJMKGxwKTsKQEAgLTg1Miw3ICs4NTcsNyBAQAogCWludCBwaHlhZGRyID0gbHAtPm1paS5waHlfaWQ7CiAJdW5zaWduZWQgaW50IGJtY3IsIGNyOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJaWYgKG1paV9jaGVja19tZWRpYSgmbHAtPm1paSwgbmV0aWZfbXNnX2xpbmsobHApLCBpbml0KSkgewogCQkvKiBkdXBsZXggc3RhdGUgaGFzIGNoYW5nZWQgKi8KQEAgLTg5Miw3ICs4OTcsNyBAQAogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXMoKVxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXMoKVxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAkvKgogCSAqIFdlIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIHBoeV90eXBlIGlzIHplcm8uCkBAIC05ODUsNyArOTkwLDcgQEAKIAlpbnQgcGh5YWRkciA9IGxwLT5taWkucGh5X2lkOwogCWludCBzdGF0dXM7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlpZiAobHAtPnBoeV90eXBlID09IDApCiAJCXJldHVybjsKQEAgLTEwMTMsNyArMTAxOCw3IEBACiAJdW5zaWduZWQgaW50IHJ4X292ZXJydW49MCwgY3IsIHBrdHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMTc0LDggKzExNzksNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAotCURCRygzLCAiJXM6IEludGVycnVwdCBkb25lICglZCBsb29wcylcbiIsIGRldi0+bmFtZSwgOC10aW1lb3V0KTsKLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTE4OCw3ICsxMTkxLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbHAtPmN1cnJlbnRfdHhfc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlEQkcoU01DX0RFQlVHX1RYIHwgU01DX0RFQlVHX0RNQSwgIiVzOiBUWCBETUEgaXJxIGhhbmRsZXJcbiIsIGRldi0+bmFtZSk7CiAJLyogQ2xlYXIgdGhlIERNQSBpbnRlcnJ1cHQgc291cmNlcyAqLwpAQCAtMTIyNCw3ICsxMjI3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBwa3RzOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCURCRyhTTUNfREVCVUdfUlggfCBTTUNfREVCVUdfRE1BLCAiJXM6IFJYIERNQSBpcnEgaGFuZGxlclxuIiwgZGV2LT5uYW1lKTsKIAkvKiBDbGVhciB0aGUgRE1BIGludGVycnVwdCBzb3VyY2VzICovCiAJU01DX0RNQV9BQ0tfSVJRKGRldiwgZG1hKTsKQEAgLTEyNzIsNyArMTI3NSw3IEBACiAJaW50IHN0YXR1cywgbWFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CiAJc3RhdHVzID0gU01DX0dFVF9JTlQobHApOwpAQCAtMTMxMCw3ICsxMzEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgbWNyLCB1cGRhdGVfbXVsdGljYXN0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIiVzOiAtLT4gJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CiAJU01DX0dFVF9NQUNfQ1IobHAsIG1jcik7CkBAIC0xNDEyLDcgKzE0MTUsNyBAQAogewogCXN0cnVjdCBzbWM5MTF4X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAkvKgogCSAqIENoZWNrIHRoYXQgdGhlIGFkZHJlc3MgaXMgdmFsaWQuICBJZiBpdHMgbm90LCByZWZ1c2UKQEAgLTE0MjAsNyArMTQyMyw3IEBACiAJICogYWRkcmVzcyB1c2luZyBpZmNvbmZpZyBldGgwIGh3IGV0aGVyIHh4Onh4Onh4Onh4Onh4Onh4CiAJICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7Ci0JCVBSSU5USygiJXM6IG5vIHZhbGlkIGV0aGVybmV0IGh3IGFkZHJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVBSSU5USygiJXM6IG5vIHZhbGlkIGV0aGVybmV0IGh3IGFkZHJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNDQ5LDcgKzE0NTIsNyBAQAogewogCXN0cnVjdCBzbWM5MTF4X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKQEAgLTE0ODMsNyArMTQ4Niw3IEBACiAJaW50IHJldCwgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJY21kLT5tYXh0eHBrdCA9IDE7CiAJY21kLT5tYXhyeHBrdCA9IDE7CiAKQEAgLTE2MjEsNyArMTYyNCw3IEBACiAJZm9yKHRpbWVvdXQ9MTA7KGUycF9jbWQgJiBFMlBfQ01EX0VQQ19CVVNZXykgJiYgdGltZW91dDsgdGltZW91dC0tKSB7CiAJCWlmIChlMnBfY21kICYgRTJQX0NNRF9FUENfVElNRU9VVF8pIHsKIAkJCVBSSU5USygiJXM6ICVzIHRpbWVvdXQgd2FpdGluZyBmb3IgRUVQUk9NIHRvIHJlc3BvbmRcbiIsCi0JCQkJZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQkJCWRldi0+bmFtZSwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJbWRlbGF5KDEpOwpAQCAtMTYyOSw3ICsxNjMyLDcgQEAKIAl9CiAJaWYgKHRpbWVvdXQgPT0gMCkgewogCQlQUklOVEsoIiVzOiAlcyB0aW1lb3V0IHdhaXRpbmcgZm9yIEVFUFJPTSBDTUQgbm90IGJ1c3lcbiIsCi0JCQlkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCQlkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXJldHVybiAwOwpAQCAtMTc0Miw3ICsxNzQ1LDcgQEAKIAlpbnQgdGltZW91dCA9IDIwOwogCXVuc2lnbmVkIGxvbmcgY29va2llOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiLS0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCiAJY29va2llID0gcHJvYmVfaXJxX29uKCk7CiAKQEAgLTE4MDgsNyArMTgxMSw3IEBACiAJY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICIlczogLS0+ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiJXM6IC0tPiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAkvKiBGaXJzdCwgc2VlIGlmIHRoZSBlbmRpYW4gd29yZCBpcyByZWNvZ25pemVkICovCiAJdmFsID0gU01DX0dFVF9CWVRFX1RFU1QobHApOwpAQCAtMjA1OCw3ICsyMDYxLDcgQEAKIAl1bnNpZ25lZCBpbnQgKmFkZHI7CiAJaW50IHJldDsKIAotCURCRyhTTUNfREVCVUdfRlVOQywgIi0tPiAlc1xuIiwgIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiLS0+ICVzXG4iLCAgX19mdW5jX18pOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTIxMjksNyArMjEzMiw3IEBACiAJc3RydWN0IHNtYzkxMXhfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICItLT4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKQEAgLTIxNTksNyArMjE2Miw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzbWM5MTF4X2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOwogCi0JREJHKFNNQ19ERUJVR19GVU5DLCAiLS0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURCRyhTTUNfREVCVUdfRlVOQywgIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCWlmIChuZGV2KSB7CiAJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CiAJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOwpAQCAtMjE3Nyw3ICsyMTgwLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAKLQlEQkcoU01DX0RFQlVHX0ZVTkMsICItLT4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJREJHKFNNQ19ERUJVR19GVU5DLCAiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJaWYgKG5kZXYpIHsKIAkJc3RydWN0IHNtYzkxMXhfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxMXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxMXguaAppbmRleCAyYWJmYzI4Li5iZjYyNDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MTF4LmgKKysrIGIvZHJpdmVycy9uZXQvc21jOTExeC5oCkBAIC02NjYsMTAgKzY2NiwxMyBAQAogI2RlZmluZSBMQU45MTFYX0lOVEVSTkFMX1BIWV9JRAkJKDB4MDAwN0MwMDApCiAKIC8qIENoaXAgSUQgdmFsdWVzICovCi0jZGVmaW5lIENISVBfOTExNQkweDExNQotI2RlZmluZSBDSElQXzkxMTYJMHgxMTYKLSNkZWZpbmUgQ0hJUF85MTE3CTB4MTE3Ci0jZGVmaW5lIENISVBfOTExOAkweDExOAorI2RlZmluZSBDSElQXzkxMTUJMHgwMTE1CisjZGVmaW5lIENISVBfOTExNgkweDAxMTYKKyNkZWZpbmUgQ0hJUF85MTE3CTB4MDExNworI2RlZmluZSBDSElQXzkxMTgJMHgwMTE4CisjZGVmaW5lIENISVBfOTIxNQkweDExNUEKKyNkZWZpbmUgQ0hJUF85MjE3CTB4MTE3QQorI2RlZmluZSBDSElQXzkyMTgJMHgxMThBCiAKIHN0cnVjdCBjaGlwX2lkIHsKIAl1MTYgaWQ7CkBAIC02ODEsNiArNjg0LDkgQEAKIAl7IENISVBfOTExNiwgIkxBTjkxMTYiIH0sCiAJeyBDSElQXzkxMTcsICJMQU45MTE3IiB9LAogCXsgQ0hJUF85MTE4LCAiTEFOOTExOCIgfSwKKwl7IENISVBfOTIxNSwgIkxBTjkyMTUiIH0sCisJeyBDSElQXzkyMTcsICJMQU45MjE3IiB9LAorCXsgQ0hJUF85MjE4LCAiTEFOOTIxOCIgfSwKIAl7IDAsIE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggMjQ3NjhjMS4uYzcwODcwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCXVuc2lnbmVkIGludCBjdGwsIGNmZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CiAKLQlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMsIGJsb2NrIFRYIHRhc2tsZXQgKi8KIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOwogCWludCBtYXNrOwogCi0JREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAkvKiBzZWUgdGhlIGhlYWRlciBmaWxlIGZvciBvcHRpb25zIGluIFRDUi9SQ1IgREVGQVVMVCAqLwogCVNNQ19TRUxFQ1RfQkFOSyhscCwgMCk7CkBAIC0zOTcsNyArMzk3LDcgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOwogCXN0cnVjdCBza19idWZmICpwZW5kaW5nX3NrYjsKIAotCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19GVU5DVElPTl9fKTsKKwlEQkcoMiwgIiVzOiAlc1xuIiwgQ0FSRE5BTUUsIF9fZnVuY19fKTsKIAogCS8qIG5vIG1vcmUgaW50ZXJydXB0cyBmb3IgbWUgKi8KIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CkBAIC00MzAsNyArNDMwLDcgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOwogCXVuc2lnbmVkIGludCBwYWNrZXRfbnVtYmVyLCBzdGF0dXMsIHBhY2tldF9sZW47CiAKLQlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCXBhY2tldF9udW1iZXIgPSBTTUNfR0VUX1JYRklGTyhscCk7CiAJaWYgKHVubGlrZWx5KHBhY2tldF9udW1iZXIgJiBSWEZJRk9fUkVNUFRZKSkgewpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJdW5zaWduZWQgaW50IHBhY2tldF9ubywgbGVuOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAotCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJaWYgKCFzbWNfc3BlY2lhbF90cnlsb2NrKCZscC0+bG9jaykpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpAQCAtNjYyLDcgKzY2Miw3IEBACiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKIAl1bnNpZ25lZCBpbnQgbnVtUGFnZXMsIHBvbGxfY291bnQsIHN0YXR1czsKIAotCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJQlVHX09OKGxwLT5wZW5kaW5nX3R4X3NrYiAhPSBOVUxMKTsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKIAl1bnNpZ25lZCBpbnQgc2F2ZWRfcGFja2V0LCBwYWNrZXRfbm8sIHR4X3N0YXR1cywgcGt0X2xlbjsKIAotCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJLyogSWYgdGhlIFRYIEZJRk8gaXMgZW1wdHkgdGhlbiBub3RoaW5nIHRvIGRvICovCiAJcGFja2V0X25vID0gU01DX0dFVF9UWEZJRk8obHApOwpAQCAtODU2LDcgKzg1Niw3IEBACiAJU01DX1NFVF9NSUkobHAsIFNNQ19HRVRfTUlJKGxwKSAmIH4oTUlJX01DTEt8TUlJX01ET0V8TUlJX01ETykpOwogCiAJREJHKDMsICIlczogcGh5YWRkcj0weCV4LCBwaHlyZWc9MHgleCwgcGh5ZGF0YT0weCV4XG4iLAotCQlfX0ZVTkNUSU9OX18sIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CisJCV9fZnVuY19fLCBwaHlhZGRyLCBwaHlyZWcsIHBoeWRhdGEpOwogCiAJU01DX1NFTEVDVF9CQU5LKGxwLCAyKTsKIAlyZXR1cm4gcGh5ZGF0YTsKQEAgLTg4Myw3ICs4ODMsNyBAQAogCVNNQ19TRVRfTUlJKGxwLCBTTUNfR0VUX01JSShscCkgJiB+KE1JSV9NQ0xLfE1JSV9NRE9FfE1JSV9NRE8pKTsKIAogCURCRygzLCAiJXM6IHBoeWFkZHI9MHgleCwgcGh5cmVnPTB4JXgsIHBoeWRhdGE9MHgleFxuIiwKLQkJX19GVU5DVElPTl9fLCBwaHlhZGRyLCBwaHlyZWcsIHBoeWRhdGEpOworCQlfX2Z1bmNfXywgcGh5YWRkciwgcGh5cmVnLCBwaHlkYXRhKTsKIAogCVNNQ19TRUxFQ1RfQkFOSyhscCwgMik7CiB9CkBAIC04OTYsNyArODk2LDcgQEAKIAlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHBoeWFkZHI7CiAKLQlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCWxwLT5waHlfdHlwZSA9IDA7CiAKQEAgLTkzNSw3ICs5MzUsNyBAQAogCWludCBwaHlhZGRyID0gbHAtPm1paS5waHlfaWQ7CiAJaW50IGJtY3IsIGNmZzE7CiAKLQlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCS8qIEVudGVyIExpbmsgRGlzYWJsZSBzdGF0ZSAqLwogCWNmZzEgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyLCBQSFlfQ0ZHMV9SRUcpOwpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAlpbnQgcGh5YWRkciA9IGxwLT5taWkucGh5X2lkOwogCWludCBwaHkxODsKIAotCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJaWYgKGxwLT5waHlfdHlwZSA9PSAwKQogCQlyZXR1cm47CkBAIC0xMjM2LDcgKzEyMzYsNyBAQAogCWludCBzdGF0dXMsIG1hc2ssIHRpbWVvdXQsIGNhcmRfc3RhdHM7CiAJaW50IHNhdmVkX3BvaW50ZXI7CiAKLQlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCXNwaW5fbG9jaygmbHAtPmxvY2spOwogCkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CiAJaW50IHN0YXR1cywgbWFzaywgZXBoX3N0LCBtZW1pbmZvLCBmaWZvOwogCi0JREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CiAJc3RhdHVzID0gU01DX0dFVF9JTlQobHApOwpAQCAtMTQwMiw3ICsxNDAyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIG11bHRpY2FzdF90YWJsZVs4XTsKIAlpbnQgdXBkYXRlX211bHRpY2FzdCA9IDA7CiAKLQlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAogCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKIAkJREJHKDIsICIlczogUkNSX1BSTVNcbiIsIGRldi0+bmFtZSk7CkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogewogCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCiAJLyoKIAkgKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIGlzIHZhbGlkLiAgSWYgaXRzIG5vdCwgcmVmdXNlCkBAIC0xNTEzLDE0ICsxNTEzLDE2IEBACiAJICogYWRkcmVzcyB1c2luZyBpZmNvbmZpZyBldGgwIGh3IGV0aGVyIHh4Onh4Onh4Onh4Onh4Onh4CiAJICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7Ci0JCVBSSU5USygiJXM6IG5vIHZhbGlkIGV0aGVybmV0IGh3IGFkZHJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVBSSU5USygiJXM6IG5vIHZhbGlkIGV0aGVybmV0IGh3IGFkZHJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogU2V0dXAgdGhlIGRlZmF1bHQgUmVnaXN0ZXIgTW9kZXMgKi8KIAlscC0+dGNyX2N1cl9tb2RlID0gVENSX0RFRkFVTFQ7CiAJbHAtPnJjcl9jdXJfbW9kZSA9IFJDUl9ERUZBVUxUOwotCWxwLT5ycGNfY3VyX21vZGUgPSBSUENfREVGQVVMVDsKKwlscC0+cnBjX2N1cl9tb2RlID0gUlBDX0RFRkFVTFQgfAorCQkJCWxwLT5jZmcubGVkYSA8PCBSUENfTFNYQV9TSEZUIHwKKwkJCQlscC0+Y2ZnLmxlZGIgPDwgUlBDX0xTWEJfU0hGVDsKIAogCS8qCiAJICogSWYgd2UgYXJlIG5vdCB1c2luZyBhIE1JSSBpbnRlcmZhY2UsIHdlIG5lZWQgdG8KQEAgLTE1NTcsNyArMTU1OSw3IEBACiB7CiAJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKQEAgLTE3MDAsNyArMTcwMiw3IEBACiAJaW50IHRpbWVvdXQgPSAyMDsKIAl1bnNpZ25lZCBsb25nIGNvb2tpZTsKIAotCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19GVU5DVElPTl9fKTsKKwlEQkcoMiwgIiVzOiAlc1xuIiwgQ0FSRE5BTUUsIF9fZnVuY19fKTsKIAogCWNvb2tpZSA9IHByb2JlX2lycV9vbigpOwogCkBAIC0xNzc4LDcgKzE3ODAsNyBAQAogCWNvbnN0IGNoYXIgKnZlcnNpb25fc3RyaW5nOwogCURFQ0xBUkVfTUFDX0JVRihtYWMpOwogCi0JREJHKDIsICIlczogJXNcbiIsIENBUkROQU1FLCBfX0ZVTkNUSU9OX18pOworCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19mdW5jX18pOwogCiAJLyogRmlyc3QsIHNlZSBpZiB0aGUgaGlnaCBieXRlIGlzIDB4MzMgKi8KIAl2YWwgPSBTTUNfQ1VSUkVOVF9CQU5LKGxwKTsKQEAgLTE5NjEsNyArMTk2Myw4IEBACiAJCWlmIChkZXYtPmRtYSAhPSAodW5zaWduZWQgY2hhciktMSkKIAkJCXByaW50aygiIERNQSAlZCIsIGRldi0+ZG1hKTsKIAotCQlwcmludGsoIiVzJXNcbiIsIG5vd2FpdCA/ICIgW25vd2FpdF0iIDogIiIsCisJCXByaW50aygiJXMlc1xuIiwKKwkJCWxwLT5jZmcuZmxhZ3MgJiBTTUM5MVhfTk9XQUlUID8gIiBbbm93YWl0XSIgOiAiIiwKIAkJCVRIUk9UVExFX1RYX1BLVFMgPyAiIFt0aHJvdHRsZV90eF0iIDogIiIpOwogCiAJCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgewpAQCAtMjE1Nyw2ICsyMTYwLDExIEBACiAJCWxwLT5jZmcuZmxhZ3MgfD0gKG5vd2FpdCkgPyBTTUM5MVhfTk9XQUlUIDogMDsKIAl9CiAKKwlpZiAoIWxwLT5jZmcubGVkYSAmJiAhbHAtPmNmZy5sZWRiKSB7CisJCWxwLT5jZmcubGVkYSA9IFJQQ19MU0FfREVGQVVMVDsKKwkJbHAtPmNmZy5sZWRiID0gUlBDX0xTQl9ERUZBVUxUOworCX0KKwogCW5kZXYtPmRtYSA9ICh1bnNpZ25lZCBjaGFyKS0xOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNtYzkxeC1yZWdzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IDk5N2U3ZjEuLmEwN2NjOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCkBAIC00Myw3ICs0Myw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9MVUJCT0NLKSB8fFwKICAgICBkZWZpbmVkKENPTkZJR19NQUNIX01BSU5TVE9ORSkgfHxcCiAgICAgZGVmaW5lZChDT05GSUdfTUFDSF9aWUxPTklURSkgfHxcCi0gICAgZGVmaW5lZChDT05GSUdfTUFDSF9MSVRUTEVUT04pCisgICAgZGVmaW5lZChDT05GSUdfTUFDSF9MSVRUTEVUT04pIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfVklQRVIpCiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCkBAIC00NDYsNiArNDQ3LDggQEAKICNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMQogI2RlZmluZSBTTUNfTk9XQUlUCQkxCiAKKyNkZWZpbmUgU01DX0lPX1NISUZUCQkobHAtPmlvX3NoaWZ0KQorCiAjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKICNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQogI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCkBAIC03NzgsMTQgKzc4MSw2IEBACiAjZGVmaW5lIFJQQ19BTkVHCTB4MDgwMAkvLyBXaGVuIDEgUEhZIGlzIGluIEF1dG8tTmVnb3RpYXRlIE1vZGUKICNkZWZpbmUgUlBDX0xTWEFfU0hGVAk1CS8vIEJpdHMgdG8gc2hpZnQgTFMyQSxMUzFBLExTMEEgdG8gbHNiCiAjZGVmaW5lIFJQQ19MU1hCX1NIRlQJMgkvLyBCaXRzIHRvIGdldCBMUzJCLExTMUIsTFMwQiB0byBsc2IKLSNkZWZpbmUgUlBDX0xFRF8xMDBfMTAJKDB4MDApCS8vIExFRCA9IDEwME1icHMgT1IncyB3aXRoIDEwTWJwcyBsaW5rIGRldGVjdAotI2RlZmluZSBSUENfTEVEX1JFUwkoMHgwMSkJLy8gTEVEID0gUmVzZXJ2ZWQKLSNkZWZpbmUgUlBDX0xFRF8xMAkoMHgwMikJLy8gTEVEID0gMTBNYnBzIGxpbmsgZGV0ZWN0Ci0jZGVmaW5lIFJQQ19MRURfRkQJKDB4MDMpCS8vIExFRCA9IEZ1bGwgRHVwbGV4IE1vZGUKLSNkZWZpbmUgUlBDX0xFRF9UWF9SWAkoMHgwNCkJLy8gTEVEID0gVFggb3IgUlggcGFja2V0IG9jY3VycmVkCi0jZGVmaW5lIFJQQ19MRURfMTAwCSgweDA1KQkvLyBMRUQgPSAxMDBNYnBzIGxpbmsgZGVjdGVjdAotI2RlZmluZSBSUENfTEVEX1RYCSgweDA2KQkvLyBMRUQgPSBUWCBwYWNrZXQgb2NjdXJyZWQKLSNkZWZpbmUgUlBDX0xFRF9SWAkoMHgwNykJLy8gTEVEID0gUlggcGFja2V0IG9jY3VycmVkCiAKICNpZm5kZWYgUlBDX0xTQV9ERUZBVUxUCiAjZGVmaW5lIFJQQ19MU0FfREVGQVVMVAlSUENfTEVEXzEwMApAQCAtNzk0LDcgKzc4OSw3IEBACiAjZGVmaW5lIFJQQ19MU0JfREVGQVVMVCBSUENfTEVEX0ZECiAjZW5kaWYKIAotI2RlZmluZSBSUENfREVGQVVMVCAoUlBDX0FORUcgfCAoUlBDX0xTQV9ERUZBVUxUIDw8IFJQQ19MU1hBX1NIRlQpIHwgKFJQQ19MU0JfREVGQVVMVCA8PCBSUENfTFNYQl9TSEZUKSB8IFJQQ19TUEVFRCB8IFJQQ19EUExYKQorI2RlZmluZSBSUENfREVGQVVMVCAoUlBDX0FORUcgfCBSUENfU1BFRUQgfCBSUENfRFBMWCkKIAogCiAvKiBCYW5rIDAgMHgwQyBpcyByZXNlcnZlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCmluZGV4IDBlNGE4OGQuLjAxOGQwZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYworKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHN1bmJtYWMuYyx2IDEuMzAgMjAwMi8wMS8xNSAwNjo0ODo1NSBkYXZlbSBFeHAgJAotICogc3VuYm1hYy5jOiBEcml2ZXIgZm9yIFNwYXJjIEJpZ01BQyAxMDBiYXNlVCBldGhlcm5ldCBhZGFwdGVycy4KKy8qIHN1bmJtYWMuYzogRHJpdmVyIGZvciBTcGFyYyBCaWdNQUMgMTAwYmFzZVQgZXRoZXJuZXQgYWRhcHRlcnMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjMsNiArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtMzIsMTUgKzM0LDE0IEBACiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2luY2x1ZGUgInN1bmJtYWMuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkic3VuYm1hYyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMCIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIjExLzI0LzAzIgotI2RlZmluZSBEUlZfQVVUSE9SCSJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4xIgorI2RlZmluZSBEUlZfUkVMREFURQkiQXVndXN0IDI2LCAyMDA4IgorI2RlZmluZSBEUlZfQVVUSE9SCSJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogCURSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAiIERSVl9BVVRIT1IgIlxuIjsKQEAgLTk2LDggKzk3LDggQEAKIAogc3RhdGljIHZvaWQgcWVjX2luaXQoc3RydWN0IGJpZ21hYyAqYnApCiB7CisJc3RydWN0IG9mX2RldmljZSAqcWVjX29wID0gYnAtPnFlY19vcDsKIAl2b2lkIF9faW9tZW0gKmdyZWdzID0gYnAtPmdyZWdzOwotCXN0cnVjdCBzYnVzX2RldiAqcWVjX3NkZXYgPSBicC0+cWVjX3NkZXY7CiAJdTggYnNpemVzID0gYnAtPmJpZ21hY19idXJzdHM7CiAJdTMyIHJlZ3ZhbDsKIApAQCAtMTEyLDEzICsxMTMsMTMgQEAKIAlzYnVzX3dyaXRlbChHTE9CX1BTSVpFXzIwNDgsIGdyZWdzICsgR0xPQl9QU0laRSk7CiAKIAkvKiBBbGwgb2YgbWVtc2l6ZSBpcyBnaXZlbiB0byBiaWdtYWMuICovCi0Jc2J1c193cml0ZWwocWVjX3NkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSwKKwlzYnVzX3dyaXRlbChyZXNvdXJjZV9zaXplKCZxZWNfb3AtPnJlc291cmNlWzFdKSwKIAkJICAgIGdyZWdzICsgR0xPQl9NU0laRSk7CiAKIAkvKiBIYWxmIHRvIHRoZSB0cmFuc21pdHRlciwgaGFsZiB0byB0aGUgcmVjZWl2ZXIuICovCi0Jc2J1c193cml0ZWwocWVjX3NkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAxLAorCXNidXNfd3JpdGVsKHJlc291cmNlX3NpemUoJnFlY19vcC0+cmVzb3VyY2VbMV0pID4+IDEsCiAJCSAgICBncmVncyArIEdMT0JfVFNJWkUpOwotCXNidXNfd3JpdGVsKHFlY19zZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMSwKKwlzYnVzX3dyaXRlbChyZXNvdXJjZV9zaXplKCZxZWNfb3AtPnJlc291cmNlWzFdKSA+PiAxLAogCQkgICAgZ3JlZ3MgKyBHTE9CX1JTSVpFKTsKIH0KIApAQCAtMjM5LDkgKzI0MCwxMCBAQAogCQlza2JfcmVzZXJ2ZShza2IsIDM0KTsKIAogCQliYi0+YmVfcnhkW2ldLnJ4X2FkZHIgPQotCQkJc2J1c19tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2Rldiwgc2tiLT5kYXRhLAotCQkJCQlSWF9CVUZfQUxMT0NfU0laRSAtIDM0LAotCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRtYV9tYXBfc2luZ2xlKCZicC0+YmlnbWFjX29wLT5kZXYsCisJCQkJICAgICAgIHNrYi0+ZGF0YSwKKwkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKIAkJYmItPmJlX3J4ZFtpXS5yeF9mbGFncyA9CiAJCQkoUlhEX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCkgJiBSWERfTEVOR1RIKSk7CiAJfQpAQCAtNzc2LDkgKzc3OCw5IEBACiAJCXNrYiA9IGJwLT50eF9za2JzW2VsZW1dOwogCQlicC0+ZW5ldF9zdGF0cy50eF9wYWNrZXRzKys7CiAJCWJwLT5lbmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwotCQlzYnVzX3VubWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsCi0JCQkJICB0aGlzLT50eF9hZGRyLCBza2ItPmxlbiwKLQkJCQkgIFNCVVNfRE1BX1RPREVWSUNFKTsKKwkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPmJpZ21hY19vcC0+ZGV2LAorCQkJCSB0aGlzLT50eF9hZGRyLCBza2ItPmxlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CiAKIAkJRFRYKCgic2tiKCVwKSAiLCBza2IpKTsKIAkJYnAtPnR4X3NrYnNbZWxlbV0gPSBOVUxMOwpAQCAtODMxLDE4ICs4MzMsMTkgQEAKIAkJCQlkcm9wcysrOwogCQkJCWdvdG8gZHJvcF9pdDsKIAkJCX0KLQkJCXNidXNfdW5tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2RldiwKLQkJCQkJICB0aGlzLT5yeF9hZGRyLAotCQkJCQkgIFJYX0JVRl9BTExPQ19TSVpFIC0gMzQsCi0JCQkJCSAgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+YmlnbWFjX29wLT5kZXYsCisJCQkJCSB0aGlzLT5yeF9hZGRyLAorCQkJCQkgUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7CiAJCQlicC0+cnhfc2tic1tlbGVtXSA9IG5ld19za2I7CiAJCQluZXdfc2tiLT5kZXYgPSBicC0+ZGV2OwogCQkJc2tiX3B1dChuZXdfc2tiLCBFVEhfRlJBTUVfTEVOKTsKIAkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDM0KTsKLQkJCXRoaXMtPnJ4X2FkZHIgPSBzYnVzX21hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LAotCQkJCQkJCW5ld19za2ItPmRhdGEsCi0JCQkJCQkJUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKLQkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXRoaXMtPnJ4X2FkZHIgPQorCQkJCWRtYV9tYXBfc2luZ2xlKCZicC0+YmlnbWFjX29wLT5kZXYsCisJCQkJCSAgICAgICBuZXdfc2tiLT5kYXRhLAorCQkJCQkgICAgICAgUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQl0aGlzLT5yeF9mbGFncyA9CiAJCQkJKFJYRF9PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gMzQpICYgUlhEX0xFTkdUSCkpOwogCkBAIC04NTcsMTMgKzg2MCwxMyBAQAogCQkJfQogCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOwogCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKLQkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYnAtPmJpZ21hY19zZGV2LAotCQkJCQkJICAgICB0aGlzLT5yeF9hZGRyLCBsZW4sCi0JCQkJCQkgICAgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmJwLT5iaWdtYWNfb3AtPmRldiwKKwkJCQkJCXRoaXMtPnJ4X2FkZHIsIGxlbiwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CiAJCQlza2JfY29weV90b19saW5lYXJfZGF0YShjb3B5X3NrYiwgKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEsIGxlbik7Ci0JCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5iaWdtYWNfc2RldiwKLQkJCQkJCQl0aGlzLT5yeF9hZGRyLCBsZW4sCi0JCQkJCQkJU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmYnAtPmJpZ21hY19vcC0+ZGV2LAorCQkJCQkJICAgdGhpcy0+cnhfYWRkciwgbGVuLAorCQkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKIAogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCiAJCQl0aGlzLT5yeF9mbGFncyA9CkBAIC05NTksNyArOTYyLDggQEAKIAl1MzIgbWFwcGluZzsKIAogCWxlbiA9IHNrYi0+bGVuOwotCW1hcHBpbmcgPSBzYnVzX21hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LCBza2ItPmRhdGEsIGxlbiwgU0JVU19ETUFfVE9ERVZJQ0UpOworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPmJpZ21hY19vcC0+ZGV2LCBza2ItPmRhdGEsCisJCQkJIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAKIAkvKiBBdm9pZCBhIHJhY2UuLi4gKi8KIAlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CkBAIC0xMDUxLDEyICsxMDU1LDggQEAKIC8qIEV0aHRvb2wgc3VwcG9ydC4uLiAqLwogc3RhdGljIHZvaWQgYmlnbWFjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGJpZ21hYyAqYnAgPSBkZXYtPnByaXY7Ci0KIAlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VuYm1hYyIpOwogCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMi4wIik7Ci0Jc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAotCQlicC0+cWVjX3NkZXYtPnNsb3QpOwogfQogCiBzdGF0aWMgdTMyIGJpZ21hY19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTA3NSwxNCArMTA3NSwxNSBAQAogCS5nZXRfbGluawkJPSBiaWdtYWNfZ2V0X2xpbmssCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBiaWdtYWNfZXRoZXJfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnFlY19zZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgYmlnbWFjX2V0aGVyX2luaXQoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJICAgICAgIHN0cnVjdCBvZl9kZXZpY2UgKnFlY19vcCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOwotCXN0cnVjdCBiaWdtYWMgKmJwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdTggYnNpemVzLCBic2l6ZXNfbW9yZTsKLQlpbnQgaTsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKKwlzdHJ1Y3QgYmlnbWFjICpicDsKKwlpbnQgaTsKIAogCS8qIEdldCBhIG5ldyBkZXZpY2Ugc3RydWN0IGZvciB0aGlzIGludGVyZmFjZS4gKi8KIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJpZ21hYykpOwpAQCAtMTA5MiwzMiArMTA5MywyMSBAQAogCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQogCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwogCi0JZGV2LT5iYXNlX2FkZHIgPSAobG9uZykgcWVjX3NkZXY7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltpXTsKIAogCS8qIFNldHVwIHNvZnRjLCB3aXRoIGJhY2twb2ludGVycyB0byBRRUMgYW5kIEJpZ01BQyBTQlVTIGRldmljZSBzdHJ1Y3RzLiAqLwotCWJwID0gZGV2LT5wcml2OwotCWJwLT5xZWNfc2RldiA9IHFlY19zZGV2OwotCWJwLT5iaWdtYWNfc2RldiA9IHFlY19zZGV2LT5jaGlsZDsKKwlicCA9IG5ldGRldl9wcml2KGRldik7CisJYnAtPnFlY19vcCA9IHFlY19vcDsKKwlicC0+YmlnbWFjX29wID0gb3A7CiAKLQlTRVRfTkVUREVWX0RFVihkZXYsICZicC0+YmlnbWFjX3NkZXYtPm9mZGV2LmRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmb3AtPmRldik7CiAKIAlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOwogCi0JLyogVmVyaWZ5IHRoZSByZWdpc3RlcnMgd2UgZXhwZWN0LCBhcmUgYWN0dWFsbHkgdGhlcmUuICovCi0JaWYgKChicC0+YmlnbWFjX3NkZXYtPm51bV9yZWdpc3RlcnMgIT0gMykgfHwKLQkgICAoYnAtPnFlY19zZGV2LT5udW1fcmVnaXN0ZXJzICE9IDIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBEZXZpY2UgZG9lcyBub3QgaGF2ZSAyIGFuZCAzIHJlZ3MsIGl0IGhhcyAlZCBhbmQgJWQuXG4iLAotCQkgICAgICAgYnAtPnFlY19zZGV2LT5udW1fcmVnaXN0ZXJzLAotCQkgICAgICAgYnAtPmJpZ21hY19zZGV2LT5udW1fcmVnaXN0ZXJzKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IFdvdWxkIHlvdSBsaWtlIHRoYXQgZm9yIGhlcmUgb3IgdG8gZ28/XG4iKTsKLQkJZ290byBmYWlsX2FuZF9jbGVhbnVwOwotCX0KLQogCS8qIE1hcCBpbiBRRUMgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotCWJwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmYnAtPnFlY19zZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkgR0xPQl9SRUdfU0laRSwgIkJpZ01BQyBRRUMgR0xvYmFsIFJlZ3MiKTsKKwlicC0+Z3JlZ3MgPSBvZl9pb3JlbWFwKCZxZWNfb3AtPnJlc291cmNlWzBdLCAwLAorCQkJICAgICAgIEdMT0JfUkVHX1NJWkUsICJCaWdNQUMgUUVDIEdMb2JhbCBSZWdzIik7CiAJaWYgKCFicC0+Z3JlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBtYXAgUUVDIGdsb2JhbCByZWdpc3RlcnMuXG4iKTsKIAkJZ290byBmYWlsX2FuZF9jbGVhbnVwOwpAQCAtMTEzNCwxMyArMTEyNCw4IEBACiAJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKIAogCS8qIEdldCBzdXBwb3J0ZWQgU0JVUyBidXJzdCBzaXplcy4gKi8KLQlic2l6ZXMgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPnFlY19zZGV2LT5wcm9tX25vZGUsCi0JCQkJICAgICJidXJzdC1zaXplcyIsCi0JCQkJICAgIDB4ZmYpOwotCi0JYnNpemVzX21vcmUgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPnFlY19zZGV2LT5idXMtPnByb21fbm9kZSwKLQkJCQkJICJidXJzdC1zaXplcyIsCi0JCQkJCSAweGZmKTsKKwlic2l6ZXMgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQocWVjX29wLT5ub2RlLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKKwlic2l6ZXNfbW9yZSA9IG9mX2dldGludHByb3BfZGVmYXVsdChxZWNfb3AtPm5vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOwogCiAJYnNpemVzICY9IDB4ZmY7CiAJaWYgKGJzaXplc19tb3JlICE9IDB4ZmYpCkBAIC0xMTU0LDE2ICsxMTM5LDE2IEBACiAJcWVjX2luaXQoYnApOwogCiAJLyogTWFwIGluIHRoZSBCaWdNQUMgY2hhbm5lbCByZWdpc3RlcnMuICovCi0JYnAtPmNyZWcgPSBzYnVzX2lvcmVtYXAoJmJwLT5iaWdtYWNfc2Rldi0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJQ1JFR19SRUdfU0laRSwgIkJpZ01BQyBRRUMgQ2hhbm5lbCBSZWdzIik7CisJYnAtPmNyZWcgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkgICAgICBDUkVHX1JFR19TSVpFLCAiQmlnTUFDIFFFQyBDaGFubmVsIFJlZ3MiKTsKIAlpZiAoIWJwLT5jcmVnKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIFFFQyBjaGFubmVsIHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CiAJfQogCiAJLyogTWFwIGluIHRoZSBCaWdNQUMgY29udHJvbCByZWdpc3RlcnMuICovCi0JYnAtPmJyZWdzID0gc2J1c19pb3JlbWFwKCZicC0+YmlnbWFjX3NkZXYtPnJlc291cmNlWzFdLCAwLAotCQkJCSBCTUFDX1JFR19TSVpFLCAiQmlnTUFDIFByaW1hcnkgUmVncyIpOworCWJwLT5icmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsxXSwgMCwKKwkJCSAgICAgICBCTUFDX1JFR19TSVpFLCAiQmlnTUFDIFByaW1hcnkgUmVncyIpOwogCWlmICghYnAtPmJyZWdzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIEJpZ01BQyBwcmltYXJ5IHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CkBAIC0xMTcyLDggKzExNTcsOCBAQAogCS8qIE1hcCBpbiB0aGUgQmlnTUFDIHRyYW5zY2VpdmVyIHJlZ2lzdGVycywgdGhpcyBpcyBob3cgeW91IHBva2UgYXQKIAkgKiB0aGUgQmlnTUFDJ3MgUEhZLgogCSAqLwotCWJwLT50cmVncyA9IHNidXNfaW9yZW1hcCgmYnAtPmJpZ21hY19zZGV2LT5yZXNvdXJjZVsyXSwgMCwKLQkJCQkgVENWUl9SRUdfU0laRSwgIkJpZ01BQyBUcmFuc2NlaXZlciBSZWdzIik7CisJYnAtPnRyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLAorCQkJICAgICAgIFRDVlJfUkVHX1NJWkUsICJCaWdNQUMgVHJhbnNjZWl2ZXIgUmVncyIpOwogCWlmICghYnAtPnRyZWdzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIEJpZ01BQyB0cmFuc2NlaXZlciByZWdpc3RlcnMuXG4iKTsKIAkJZ290byBmYWlsX2FuZF9jbGVhbnVwOwpAQCAtMTE4MywxNyArMTE2OCwxNyBAQAogCWJpZ21hY19zdG9wKGJwKTsKIAogCS8qIEFsbG9jYXRlIHRyYW5zbWl0L3JlY2VpdmUgZGVzY3JpcHRvciBEVk1BIGJsb2NrLiAqLwotCWJwLT5ibWFjX2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KGJwLT5iaWdtYWNfc2RldiwKLQkJCQkJICAgICAgIFBBR0VfU0laRSwKLQkJCQkJICAgICAgICZicC0+YmJsb2NrX2R2bWEpOworCWJwLT5ibWFjX2Jsb2NrID0gZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+YmlnbWFjX29wLT5kZXYsCisJCQkJCSAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAmYnAtPmJibG9ja19kdm1hLCBHRlBfQVRPTUlDKTsKIAlpZiAoYnAtPmJtYWNfYmxvY2sgPT0gTlVMTCB8fCBicC0+YmJsb2NrX2R2bWEgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IGFsbG9jYXRlIGNvbnNpc3RlbnQgRE1BLlxuIik7CiAJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKIAl9CiAKIAkvKiBHZXQgdGhlIGJvYXJkIHJldmlzaW9uIG9mIHRoaXMgQmlnTUFDLiAqLwotCWJwLT5ib2FyZF9yZXYgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPmJpZ21hY19zZGV2LT5wcm9tX25vZGUsCi0JCQkJCSAgICJib2FyZC12ZXJzaW9uIiwgMSk7CisJYnAtPmJvYXJkX3JldiA9IG9mX2dldGludHByb3BfZGVmYXVsdChicC0+YmlnbWFjX29wLT5ub2RlLAorCQkJCQkgICAgICAiYm9hcmQtdmVyc2lvbiIsIDEpOwogCiAJLyogSW5pdCBhdXRvLW5lZ290aWF0aW9uIHRpbWVyIHN0YXRlLiAqLwogCWluaXRfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOwpAQCAtMTIxNyw3ICsxMjAyLDcgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAogCS8qIEZpbmlzaCBuZXQgZGV2aWNlIHJlZ2lzdHJhdGlvbi4gKi8KLQlkZXYtPmlycSA9IGJwLT5iaWdtYWNfc2Rldi0+aXJxc1swXTsKKwlkZXYtPmlycSA9IGJwLT5iaWdtYWNfb3AtPmlycXNbMF07CiAJZGV2LT5kbWEgPSAwOwogCiAJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CkBAIC0xMjI1LDcgKzEyMTAsNyBAQAogCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKCZicC0+YmlnbWFjX3NkZXYtPm9mZGV2LmRldiwgYnApOworCWRldl9zZXRfZHJ2ZGF0YSgmYnAtPmJpZ21hY19vcC0+ZGV2LCBicCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQmlnTUFDIDEwMGJhc2VUIEV0aGVybmV0ICVzXG4iLAogCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGRldi0+ZGV2X2FkZHIpKTsKQEAgLTEyMzYsNjYgKzEyMjEsNjcgQEAKIAkvKiBTb21ldGhpbmcgd2VudCB3cm9uZywgdW5kbyB3aGF0ZXZlciB3ZSBkaWQgc28gZmFyLiAqLwogCS8qIEZyZWUgcmVnaXN0ZXIgbWFwcGluZ3MgaWYgYW55LiAqLwogCWlmIChicC0+Z3JlZ3MpCi0JCXNidXNfaW91bm1hcChicC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOworCQlvZl9pb3VubWFwKCZxZWNfb3AtPnJlc291cmNlWzBdLCBicC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOwogCWlmIChicC0+Y3JlZykKLQkJc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBicC0+Y3JlZywgQ1JFR19SRUdfU0laRSk7CiAJaWYgKGJwLT5icmVncykKLQkJc2J1c19pb3VubWFwKGJwLT5icmVncywgQk1BQ19SRUdfU0laRSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKIAlpZiAoYnAtPnRyZWdzKQotCQlzYnVzX2lvdW5tYXAoYnAtPnRyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBicC0+dHJlZ3MsIFRDVlJfUkVHX1NJWkUpOwogCiAJaWYgKGJwLT5ibWFjX2Jsb2NrKQotCQlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCi0JCQkJICAgICBQQUdFX1NJWkUsCi0JCQkJICAgICBicC0+Ym1hY19ibG9jaywKLQkJCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZicC0+YmlnbWFjX29wLT5kZXYsCisJCQkJICBQQUdFX1NJWkUsCisJCQkJICBicC0+Ym1hY19ibG9jaywKKwkJCQkgIGJwLT5iYmxvY2tfZHZtYSk7CiAKIAkvKiBUaGlzIGFsc28gZnJlZXMgdGhlIGNvLWxvY2F0ZWQgJ2Rldi0+cHJpdicgKi8KIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiAtRU5PREVWOwogfQogCi0vKiBRRUMgY2FuIGJlIHRoZSBwYXJlbnQgb2YgZWl0aGVyIFF1YWRFdGhlcm5ldCBvcgotICogYSBCaWdNQUMuICBXZSB3YW50IHRoZSBsYXR0ZXIuCisvKiBRRUMgY2FuIGJlIHRoZSBwYXJlbnQgb2YgZWl0aGVyIFF1YWRFdGhlcm5ldCBvciBhIEJpZ01BQy4gIFdlIHdhbnQKKyAqIHRoZSBsYXR0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJpZ21hY19zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiaWdtYWNfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGV2LT5ub2RlOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IG9wLT5kZXYucGFyZW50OworCXN0cnVjdCBvZl9kZXZpY2UgKnFlY19vcDsKIAotCWlmICghc3RyY21wKGRwLT5uYW1lLCAiYmUiKSkKLQkJc2RldiA9IHNkZXYtPnBhcmVudDsKKwlxZWNfb3AgPSB0b19vZl9kZXZpY2UocGFyZW50KTsKIAotCXJldHVybiBiaWdtYWNfZXRoZXJfaW5pdChzZGV2KTsKKwlyZXR1cm4gYmlnbWFjX2V0aGVyX2luaXQob3AsIHFlY19vcCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGJpZ21hY19zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiaWdtYWNfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGJpZ21hYyAqYnAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gb3AtPmRldi5wYXJlbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBicC0+ZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKnFlY19vcDsKIAotCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKG5ldF9kZXYpOworCXFlY19vcCA9IHRvX29mX2RldmljZShwYXJlbnQpOwogCi0Jc2J1c19pb3VubWFwKGJwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7Ci0Jc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKLQlzYnVzX2lvdW5tYXAoYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKLQlzYnVzX2lvdW5tYXAoYnAtPnRyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKLQlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCi0JCQkgICAgIFBBR0VfU0laRSwKLQkJCSAgICAgYnAtPmJtYWNfYmxvY2ssCi0JCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisKKwlvZl9pb3VubWFwKCZxZWNfb3AtPnJlc291cmNlWzBdLCBicC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYnAtPmNyZWcsIENSRUdfUkVHX1NJWkUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMl0sIGJwLT50cmVncywgVENWUl9SRUdfU0laRSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkgIFBBR0VfU0laRSwKKwkJCSAgYnAtPmJtYWNfYmxvY2ssCisJCQkgIGJwLT5iYmxvY2tfZHZtYSk7CiAKIAlmcmVlX25ldGRldihuZXRfZGV2KTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYmlnbWFjX3NidXNfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInFlYyIsCi0JfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJpZ21hY19zYnVzX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJiZSIsCiAJfSwKQEAgLTEzMTMsNyArMTI5OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJpZ21hY19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYmlnbWFjX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYmlnbWFjX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYmlnbWFjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuaCBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuaAppbmRleCBiNTYzZDNjLi44ODQwYmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5ibWFjLmgKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5oCkBAIC0zMjksOCArMzI5LDggQEAKIAl1bnNpZ25lZCBpbnQJCXRpbWVyX3RpY2tzOwogCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5ldF9zdGF0czsKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpxZWNfc2RldjsKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpiaWdtYWNfc2RldjsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCSpxZWNfb3A7CisJc3RydWN0IG9mX2RldmljZQkqYmlnbWFjX29wOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwppbmRleCA3ZDU1NjFiLi5mODYwZWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTQwOSw2ICs0MDksNyBAQAogc3RhdGljIGludCAgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbik7CiBzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKIHN0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgbWRpb193YWl0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdhaXQpOwogc3RhdGljIGludCAgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBjaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKQEAgLTc4NSw2ICs3ODYsMjQgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBpbnQgbWRpb193YWl0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdhaXQpCit7CisJaW50IGJtc3I7CisJaW50IHBoeV9pZDsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBoeV9pZCA9IG5wLT5waHlzWzBdOworCisJZG8geworCQlibXNyID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCBNSUlfQk1TUik7CisJCWlmIChibXNyICYgMHgwMDA0KQorCQkJcmV0dXJuIDA7CisJCW1kZWxheSgxKTsKKwl9IHdoaWxlICgtLXdhaXQgPiAwKTsKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEzOTMsNDEgKzE0MTIsNTEgQEAKIAlpbnQgc3BlZWQ7CiAKIAlpZiAoaW50cl9zdGF0dXMgJiBMaW5rQ2hhbmdlKSB7Ci0JCWlmIChucC0+YW5fZW5hYmxlKSB7Ci0JCQltaWlfYWR2ZXJ0aXNlID0gbWRpb19yZWFkIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKLQkJCW1paV9scGE9IG1kaW9fcmVhZCAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0xQQSk7Ci0JCQltaWlfYWR2ZXJ0aXNlICY9IG1paV9scGE7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogIiwgZGV2LT5uYW1lKTsKLQkJCWlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEZVTEwpIHsKLQkJCQlucC0+c3BlZWQgPSAxMDA7Ci0JCQkJcHJpbnRrICgiMTAwTWJwcywgZnVsbCBkdXBsZXhcbiIpOwotCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEhBTEYpIHsKLQkJCQlucC0+c3BlZWQgPSAxMDA7Ci0JCQkJcHJpbnRrICgiMTAwTWJwcywgaGFsZiBkdXBsZXhcbiIpOwotCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwRlVMTCkgewotCQkJCW5wLT5zcGVlZCA9IDEwOwotCQkJCXByaW50ayAoIjEwTWJwcywgZnVsbCBkdXBsZXhcbiIpOwotCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwSEFMRikgewotCQkJCW5wLT5zcGVlZCA9IDEwOwotCQkJCXByaW50ayAoIjEwTWJwcywgaGFsZiBkdXBsZXhcbiIpOwotCQkJfSBlbHNlCi0JCQkJcHJpbnRrICgiXG4iKTsKKwkJaWYgKG1kaW9fd2FpdF9saW5rKGRldiwgMTApID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJCQltaWlfYWR2ZXJ0aXNlID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sCisJCQkJCQkJICAgTUlJX0FEVkVSVElTRSk7CisJCQkJbWlpX2xwYSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJCQltaWlfYWR2ZXJ0aXNlICY9IG1paV9scGE7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMDBGVUxMKSB7CisJCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQkJcHJpbnRrKCIxMDBNYnBzLCBmdWxsIGR1cGxleFxuIik7CisJCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEhBTEYpIHsKKwkJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCQlwcmludGsoIjEwME1icHMsIGhhbGYgZHVwbGV4XG4iKTsKKwkJCQl9IGVsc2UgaWYgKG1paV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTBGVUxMKSB7CisJCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCQlwcmludGsoIjEwTWJwcywgZnVsbCBkdXBsZXhcbiIpOworCQkJCX0gZWxzZSBpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEhBTEYpIHsKKwkJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJCXByaW50aygiMTBNYnBzLCBoYWxmIGR1cGxleFxuIik7CisJCQkJfSBlbHNlCisJCQkJCXByaW50aygiXG4iKTsKIAorCQkJfSBlbHNlIHsKKwkJCQltaWlfY3RsID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwkJCQlzcGVlZCA9IChtaWlfY3RsICYgQk1DUl9TUEVFRDEwMCkgPyAxMDAgOiAxMDsKKwkJCQlucC0+c3BlZWQgPSBzcGVlZDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBjaGFuZ2VkOiAlZE1icHMgLCIsCisJCQkJCWRldi0+bmFtZSwgc3BlZWQpOworCQkJCXByaW50aygiJXMgZHVwbGV4LlxuIiwKKwkJCQkJKG1paV9jdGwgJiBCTUNSX0ZVTExEUExYKSA/CisJCQkJCQkiZnVsbCIgOiAiaGFsZiIpOworCQkJfQorCQkJY2hlY2tfZHVwbGV4KGRldik7CisJCQlpZiAobnAtPmZsb3djdHJsICYmIG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpIHsKKwkJCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSsyKSB8IDB4MDIwMCwKKwkJCQkJaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSsyKTsKKwkJCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDApIHwgRW5iRmxvd0N0cmwsCisJCQkJCWlvYWRkciArIE1BQ0N0cmwwKTsKKwkJCX0KKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAkJfSBlbHNlIHsKLQkJCW1paV9jdGwgPSBtZGlvX3JlYWQgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKLQkJCXNwZWVkID0gKG1paV9jdGwgJiBCTUNSX1NQRUVEMTAwKSA/IDEwMCA6IDEwOwotCQkJbnAtPnNwZWVkID0gc3BlZWQ7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogJWRNYnBzICwiLAotCQkJCWRldi0+bmFtZSwgc3BlZWQpOwotCQkJcHJpbnRrICgiJXMgZHVwbGV4LlxuIiwgKG1paV9jdGwgJiBCTUNSX0ZVTExEUExYKSA/Ci0JCQkJImZ1bGwiIDogImhhbGYiKTsKLQkJfQotCQljaGVja19kdXBsZXggKGRldik7Ci0JCWlmIChucC0+Zmxvd2N0cmwgJiYgbnAtPm1paV9pZi5mdWxsX2R1cGxleCkgewotCQkJaW93cml0ZTE2KGlvcmVhZDE2KGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjErMikgfCAweDAyMDAsCi0JCQkJaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSsyKTsKLQkJCWlvd3JpdGUxNihpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMCkgfCBFbmJGbG93Q3RybCwKLQkJCQlpb2FkZHIgKyBNQUNDdHJsMCk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAkJfQogCX0KIAlpZiAoaW50cl9zdGF0dXMgJiBTdGF0c01heCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCBiNzlkNWYwLi5mMWViZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgICAgICAiSGFwcHkgTWVhbCBFdGhlcm5ldCIgZm91bmQgb24gU3VuU3dpZnQgU0JVUyBjYXJkcy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTksIDIwMDIsIDIwMDMsCi0JCSAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqCQkyMDA2LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqCiAgKiBDaGFuZ2VzIDoKICAqIDIwMDAvMTEvMTEgV2lsbHkgVGFycmVhdSA8d2lsbHkgQVQgbWV0YS14Lm9yZz4KQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00MSw4ICs0Miw5IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAjaWZkZWYgQ09ORklHX1NQQVJDCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNjAsOCArNjIsOCBAQAogI2luY2x1ZGUgInN1bmhtZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzdW5obWUiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIzLjAwIgotI2RlZmluZSBEUlZfUkVMREFURQkiSnVuZSAyMywgMjAwNiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjMuMTAiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJBdWd1c3QgMjYsIDIwMDgiCiAjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CkBAIC0yNTEsMTMgKzI1MywxMyBAQAogI2RlZmluZSBobWVfcmVhZF9kZXNjMzIoX19ocCwgX19wKSBcCiAJKChfX2hwKS0+cmVhZF9kZXNjMzIoX19wKSkKICNkZWZpbmUgaG1lX2RtYV9tYXAoX19ocCwgX19wdHIsIF9fc2l6ZSwgX19kaXIpIFwKLQkoKF9faHApLT5kbWFfbWFwKChfX2hwKS0+aGFwcHlfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisJKChfX2hwKS0+ZG1hX21hcCgoX19ocCktPmRtYV9kZXYsIChfX3B0ciksIChfX3NpemUpLCAoX19kaXIpKSkKICNkZWZpbmUgaG1lX2RtYV91bm1hcChfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKLQkoKF9faHApLT5kbWFfdW5tYXAoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisJKChfX2hwKS0+ZG1hX3VubWFwKChfX2hwKS0+ZG1hX2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKICNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9jcHUoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCi0JKChfX2hwKS0+ZG1hX3N5bmNfZm9yX2NwdSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKKwkoKF9faHApLT5kbWFfc3luY19mb3JfY3B1KChfX2hwKS0+ZG1hX2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKICNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCi0JKChfX2hwKS0+ZG1hX3N5bmNfZm9yX2RldmljZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKKwkoKF9faHApLT5kbWFfc3luY19mb3JfZGV2aWNlKChfX2hwKS0+ZG1hX2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKICNlbHNlCiAjaWZkZWYgQ09ORklHX1NCVVMKIC8qIFNCVVMgb25seSBjb21waWxhdGlvbiAqLwpAQCAtMjc3LDEzICsyNzksMTMgQEAKIH0gd2hpbGUoMCkKICNkZWZpbmUgaG1lX3JlYWRfZGVzYzMyKF9faHAsIF9fcCkJKChfX2ZvcmNlIHUzMikoaG1lMzIpKihfX3ApKQogI2RlZmluZSBobWVfZG1hX21hcChfX2hwLCBfX3B0ciwgX19zaXplLCBfX2RpcikgXAotCXNidXNfbWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fcHRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisJZG1hX21hcF9zaW5nbGUoKF9faHApLT5kbWFfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkKICNkZWZpbmUgaG1lX2RtYV91bm1hcChfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKLQlzYnVzX3VubWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorCWRtYV91bm1hcF9zaW5nbGUoKF9faHApLT5kbWFfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCiAjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfY3B1KF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAotCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKwlkbWFfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5kbWFfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCiAjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfZGV2aWNlKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAotCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKwlkbWFfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoKF9faHApLT5kbWFfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCiAjZWxzZQogLyogUENJIG9ubHkgY29tcGlsYXRpb24gKi8KICNkZWZpbmUgaG1lX3dyaXRlMzIoX19ocCwgX19yZWcsIF9fdmFsKSBcCkBAIC0zMDUsMzYgKzMwNywxNyBAQAogCXJldHVybiBsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXApOwogfQogI2RlZmluZSBobWVfZG1hX21hcChfX2hwLCBfX3B0ciwgX19zaXplLCBfX2RpcikgXAotCXBjaV9tYXBfc2luZ2xlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKwlwY2lfbWFwX3NpbmdsZSgoX19ocCktPmRtYV9kZXYsIChfX3B0ciksIChfX3NpemUpLCAoX19kaXIpKQogI2RlZmluZSBobWVfZG1hX3VubWFwKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAotCXBjaV91bm1hcF9zaW5nbGUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKwlwY2lfdW5tYXBfc2luZ2xlKChfX2hwKS0+ZG1hX2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQogI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2NwdShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKLQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5kbWFfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCiAjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfZGV2aWNlKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgoX19ocCktPmRtYV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKICNlbmRpZgogI2VuZGlmCiAKIAotI2lmZGVmIFNCVVNfRE1BX0JJRElSRUNUSU9OQUwKLSMJZGVmaW5lIERNQV9CSURJUkVDVElPTkFMCVNCVVNfRE1BX0JJRElSRUNUSU9OQUwKLSNlbHNlCi0jCWRlZmluZSBETUFfQklESVJFQ1RJT05BTAkwCi0jZW5kaWYKLQotI2lmZGVmIFNCVVNfRE1BX0ZST01ERVZJQ0UKLSMJZGVmaW5lIERNQV9GUk9NREVWSUNFCQlTQlVTX0RNQV9GUk9NREVWSUNFCi0jZWxzZQotIwlkZWZpbmUgRE1BX1RPREVWSUNFCQkxCi0jZW5kaWYKLQotI2lmZGVmIFNCVVNfRE1BX1RPREVWSUNFCi0jCWRlZmluZSBETUFfVE9ERVZJQ0UJCVNCVVNfRE1BX1RPREVWSUNFCi0jZWxzZQotIwlkZWZpbmUgRE1BX0ZST01ERVZJQ0UJCTIKLSNlbmRpZgotCi0KIC8qIE9oIHllcywgdGhlIE1JRiBCaXRCYW5nIGlzIG1pZ2h0eSBmdW4gdG8gcHJvZ3JhbS4gIEJpdEJ1Y2tldCBpcyBtb3JlIGxpa2UgaXQuICovCiBzdGF0aWMgdm9pZCBCQl9QVVRfQklUKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IGJpdCkKIHsKQEAgLTEyMjQsNyArMTIwNyw4IEBACiAKIAkJCXJ4ZCA9ICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfcnhkW2ldOwogCQkJZG1hX2FkZHIgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZyeGQtPnJ4X2FkZHIpOwotCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTURFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGhwLT5kbWFfZGV2LCBkbWFfYWRkciwKKwkJCQkJIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCWhwLT5yeF9za2JzW2ldID0gTlVMTDsKIAkJfQpAQCAtMTI0MiwxMCArMTIyNiwxMCBAQAogCQkJZm9yIChmcmFnID0gMDsgZnJhZyA8PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKIAkJCQl0eGQgPSAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtpXTsKIAkJCQlkbWFfYWRkciA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnR4ZC0+dHhfYWRkcik7Ci0JCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsCi0JCQkJCSAgICAgIChobWVfcmVhZF9kZXNjMzIoaHAsICZ0eGQtPnR4X2ZsYWdzKQotCQkJCQkgICAgICAgJiBUWEZMQUdfU0laRSksCi0JCQkJCSAgICAgIERNQV9UT0RFVklDRSk7CisJCQkJZG1hX3VubWFwX3NpbmdsZShocC0+ZG1hX2RldiwgZG1hX2FkZHIsCisJCQkJCQkgKGhtZV9yZWFkX2Rlc2MzMihocCwgJnR4ZC0+dHhfZmxhZ3MpCisJCQkJCQkgICYgVFhGTEFHX1NJWkUpLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOwogCiAJCQkJaWYgKGZyYWcgIT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKIAkJCQkJaSsrOwpAQCAtMTI4Nyw3ICsxMjcxLDggQEAKIAkJc2tiX3B1dChza2IsIChFVEhfRlJBTUVfTEVOICsgUlhfT0ZGU0VUICsgNCkpOwogCQlobWVfd3JpdGVfcnhkKGhwLCAmaGItPmhhcHB5X21lYWxfcnhkW2ldLAogCQkJICAgICAgKFJYRkxBR19PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gUlhfT0ZGU0VUKSA8PCAxNikpLAotCQkJICAgICAgaG1lX2RtYV9tYXAoaHAsIHNrYi0+ZGF0YSwgUlhfQlVGX0FMTE9DX1NJWkUsIERNQV9GUk9NREVWSUNFKSk7CisJCQkgICAgICBkbWFfbWFwX3NpbmdsZShocC0+ZG1hX2Rldiwgc2tiLT5kYXRhLCBSWF9CVUZfQUxMT0NfU0laRSwKKwkJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpKTsKIAkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOwogCX0KIApAQCAtMTU5Myw3ICsxNTc4LDcgQEAKIAlpZiAoKGhwLT5oYXBweV9idXJzdHMgJiBETUFfQlVSU1Q2NCkgJiYKIAkgICAgKChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpICE9IDAKICNpZmRlZiBDT05GSUdfU0JVUwotCSAgICAgfHwgc2J1c19jYW5fYnVyc3Q2NChocC0+aGFwcHlfZGV2KQorCSAgICAgfHwgc2J1c19jYW5fYnVyc3Q2NCgpCiAjZW5kaWYKIAkgICAgIHx8IDApKSB7CiAJCXUzMiBnY2ZnID0gR1JFR19DRkdfQlVSU1Q2NDsKQEAgLTE2MDMsMTEgKzE1ODgsMTMgQEAKIAkJICogZG8gbm90LiAgLURhdmVNCiAJCSAqLwogI2lmZGVmIENPTkZJR19TQlVTCi0JCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSA9PSAwICYmCi0JCSAgICBzYnVzX2Nhbl9kbWFfNjRiaXQoaHAtPmhhcHB5X2RldikpIHsKLQkJCXNidXNfc2V0X3NidXM2NChocC0+aGFwcHlfZGV2LAotCQkJCQlocC0+aGFwcHlfYnVyc3RzKTsKLQkJCWdjZmcgfD0gR1JFR19DRkdfNjRCSVQ7CisJCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSA9PSAwKSB7CisJCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGhwLT5oYXBweV9kZXY7CisJCQlpZiAoc2J1c19jYW5fZG1hXzY0Yml0KCkpIHsKKwkJCQlzYnVzX3NldF9zYnVzNjQoJm9wLT5kZXYsCisJCQkJCQlocC0+aGFwcHlfYnVyc3RzKTsKKwkJCQlnY2ZnIHw9IEdSRUdfQ0ZHXzY0QklUOworCQkJfQogCQl9CiAjZW5kaWYKIApAQCAtMTk2Niw3ICsxOTUzLDcgQEAKIAkJCWRtYV9sZW4gPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT50eF9mbGFncyk7CiAKIAkJCWRtYV9sZW4gJj0gVFhGTEFHX1NJWkU7Ci0JCQlobWVfZG1hX3VubWFwKGhwLCBkbWFfYWRkciwgZG1hX2xlbiwgRE1BX1RPREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoaHAtPmRtYV9kZXYsIGRtYV9hZGRyLCBkbWFfbGVuLCBETUFfVE9fREVWSUNFKTsKIAogCQkJZWxlbSA9IE5FWFRfVFgoZWxlbSk7CiAJCQl0aGlzID0gJnR4YmFzZVtlbGVtXTsKQEAgLTIwNDQsMTMgKzIwMzEsMTQgQEAKIAkJCQlkcm9wcysrOwogCQkJCWdvdG8gZHJvcF9pdDsKIAkJCX0KLQkJCWhtZV9kbWFfdW5tYXAoaHAsIGRtYV9hZGRyLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZShocC0+ZG1hX2RldiwgZG1hX2FkZHIsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJaHAtPnJ4X3NrYnNbZWxlbV0gPSBuZXdfc2tiOwogCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3B1dChuZXdfc2tiLCAoRVRIX0ZSQU1FX0xFTiArIFJYX09GRlNFVCArIDQpKTsKIAkJCWhtZV93cml0ZV9yeGQoaHAsIHRoaXMsCiAJCQkJICAgICAgKFJYRkxBR19PV058KChSWF9CVUZfQUxMT0NfU0laRS1SWF9PRkZTRVQpPDwxNikpLAotCQkJCSAgICAgIGhtZV9kbWFfbWFwKGhwLCBuZXdfc2tiLT5kYXRhLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpKTsKKwkJCQkgICAgICBkbWFfbWFwX3NpbmdsZShocC0+ZG1hX2RldiwgbmV3X3NrYi0+ZGF0YSwgUlhfQlVGX0FMTE9DX1NJWkUsCisJCQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSkpOwogCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgUlhfT0ZGU0VUKTsKIAogCQkJLyogVHJpbSB0aGUgb3JpZ2luYWwgc2tiIGZvciB0aGUgbmV0aWYuICovCkBAIC0yMDY1LDEwICsyMDUzLDkgQEAKIAogCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOwogCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKLQkJCWhtZV9kbWFfc3luY19mb3JfY3B1KGhwLCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTURFVklDRSk7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShocC0+ZG1hX2RldiwgZG1hX2FkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKIAkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKLQkJCWhtZV9kbWFfc3luY19mb3JfZGV2aWNlKGhwLCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTURFVklDRSk7Ci0KKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhwLT5kbWFfZGV2LCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCiAJCQlobWVfd3JpdGVfcnhkKGhwLCB0aGlzLAogCQkJCSAgICAgIChSWEZMQUdfT1dOfCgoUlhfQlVGX0FMTE9DX1NJWkUtUlhfT0ZGU0VUKTw8MTYpKSwKQEAgLTIzMDAsNyArMjI4Nyw3IEBACiAJCXUzMiBtYXBwaW5nLCBsZW47CiAKIAkJbGVuID0gc2tiLT5sZW47Ci0JCW1hcHBpbmcgPSBobWVfZG1hX21hcChocCwgc2tiLT5kYXRhLCBsZW4sIERNQV9UT0RFVklDRSk7CisJCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShocC0+ZG1hX2Rldiwgc2tiLT5kYXRhLCBsZW4sIERNQV9UT19ERVZJQ0UpOwogCQl0eF9mbGFncyB8PSAoVFhGTEFHX1NPUCB8IFRYRkxBR19FT1ApOwogCQlobWVfd3JpdGVfdHhkKGhwLCAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtlbnRyeV0sCiAJCQkgICAgICAodHhfZmxhZ3MgfCAobGVuICYgVFhGTEFHX1NJWkUpKSwKQEAgLTIzMTQsNyArMjMwMSw4IEBACiAJCSAqIE90aGVyd2lzZSB3ZSBjb3VsZCByYWNlIHdpdGggdGhlIGRldmljZS4KIAkJICovCiAJCWZpcnN0X2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7Ci0JCWZpcnN0X21hcHBpbmcgPSBobWVfZG1hX21hcChocCwgc2tiLT5kYXRhLCBmaXJzdF9sZW4sIERNQV9UT0RFVklDRSk7CisJCWZpcnN0X21hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShocC0+ZG1hX2Rldiwgc2tiLT5kYXRhLCBmaXJzdF9sZW4sCisJCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKIAkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKIAogCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CkBAIC0yMzIyLDEwICsyMzEwLDkgQEAKIAkJCXUzMiBsZW4sIG1hcHBpbmcsIHRoaXNfdHhmbGFnczsKIAogCQkJbGVuID0gdGhpc19mcmFnLT5zaXplOwotCQkJbWFwcGluZyA9IGhtZV9kbWFfbWFwKGhwLAotCQkJCQkgICAgICAoKHZvaWQgKikgcGFnZV9hZGRyZXNzKHRoaXNfZnJhZy0+cGFnZSkgKwotCQkJCQkgICAgICAgdGhpc19mcmFnLT5wYWdlX29mZnNldCksCi0JCQkJCSAgICAgIGxlbiwgRE1BX1RPREVWSUNFKTsKKwkJCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoaHAtPmRtYV9kZXYsIHRoaXNfZnJhZy0+cGFnZSwKKwkJCQkJICAgICAgIHRoaXNfZnJhZy0+cGFnZV9vZmZzZXQsIGxlbiwKKwkJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCQkJdGhpc190eGZsYWdzID0gdHhfZmxhZ3M7CiAJCQlpZiAoZnJhZyA9PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSkKIAkJCQl0aGlzX3R4ZmxhZ3MgfD0gVFhGTEFHX0VPUDsKQEAgLTI0OTMsOSArMjQ4MCwxMiBAQAogCX0KICNpZmRlZiBDT05GSUdfU0JVUwogCWVsc2UgewotCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBocC0+aGFwcHlfZGV2OwotCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiU0JVUzolZCIsCi0JCQlzZGV2LT5zbG90KTsKKwkJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOworCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGhwLT5oYXBweV9kZXY7CisJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJyZWdzIiwgTlVMTCk7CisJCWlmIChyZWdzKQorCQkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAorCQkJCXJlZ3MtPndoaWNoX2lvKTsKIAl9CiAjZW5kaWYKIH0KQEAgLTI1MjEsNjMgKzI1MTEsMjEgQEAKIHN0YXRpYyBpbnQgaG1lX3ZlcnNpb25fcHJpbnRlZDsKIAogI2lmZGVmIENPTkZJR19TQlVTCi12b2lkIF9fZGV2aW5pdCBxdWF0dHJvX2dldF9yYW5nZXMoc3RydWN0IHF1YXR0cm8gKnFwKQotewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKLQlpbnQgZXJyOwotCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShzZGV2LT5wcm9tX25vZGUsCi0JCQkgICAgICAgInJhbmdlcyIsCi0JCQkgICAgICAgKGNoYXIgKikmcXAtPnJhbmdlc1swXSwKLQkJCSAgICAgICBzaXplb2YocXAtPnJhbmdlcykpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcXAtPm5yYW5nZXMgPSAwOwotCQlyZXR1cm47Ci0JfQotCXFwLT5ucmFuZ2VzID0gKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHF1YXR0cm9fYXBwbHlfcmFuZ2VzKHN0cnVjdCBxdWF0dHJvICpxcCwgc3RydWN0IGhhcHB5X21lYWwgKmhwKQotewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGhwLT5oYXBweV9kZXY7Ci0JaW50IHJuZzsKLQotCWZvciAocm5nID0gMDsgcm5nIDwgcXAtPm5yYW5nZXM7IHJuZysrKSB7Ci0JCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcm5ncCA9ICZxcC0+cmFuZ2VzW3JuZ107Ci0JCWludCByZWc7Ci0KLQkJZm9yIChyZWcgPSAwOyByZWcgPCA1OyByZWcrKykgewotCQkJaWYgKHNkZXYtPnJlZ19hZGRyc1tyZWddLndoaWNoX2lvID09Ci0JCQkgICAgcm5ncC0+b3RfY2hpbGRfc3BhY2UpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJlZyA9PSA1KQotCQkJY29udGludWU7Ci0KLQkJc2Rldi0+cmVnX2FkZHJzW3JlZ10ud2hpY2hfaW8gPSBybmdwLT5vdF9wYXJlbnRfc3BhY2U7Ci0JCXNkZXYtPnJlZ19hZGRyc1tyZWddLnBoeXNfYWRkciArPSBybmdwLT5vdF9wYXJlbnRfYmFzZTsKLQl9Ci19Ci0KIC8qIEdpdmVuIGEgaGFwcHkgbWVhbCBzYnVzIGRldmljZSwgZmluZCBpdCdzIHF1YXR0cm8gcGFyZW50LgogICogSWYgbm9uZSBleGlzdCwgYWxsb2NhdGUgYW5kIHJldHVybiBhIG5ldyBvbmUuCiAgKgogICogUmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBxdWF0dHJvICogX19kZXZpbml0IHF1YXR0cm9fc2J1c19maW5kKHN0cnVjdCBzYnVzX2RldiAqZ29hbF9zZGV2KQorc3RhdGljIHN0cnVjdCBxdWF0dHJvICogX19kZXZpbml0IHF1YXR0cm9fc2J1c19maW5kKHN0cnVjdCBvZl9kZXZpY2UgKmNoaWxkKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBjaGlsZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcDsKIAlzdHJ1Y3QgcXVhdHRybyAqcXA7Ci0JaW50IGk7CiAKLQlmb3IgKHFwID0gcWZlX3NidXNfbGlzdDsgcXAgIT0gTlVMTDsgcXAgPSBxcC0+bmV4dCkgewotCQlmb3IgKGkgPSAwLCBzZGV2ID0gcXAtPnF1YXR0cm9fZGV2OwotCQkgICAgIChzZGV2ICE9IE5VTEwpICYmIChpIDwgNCk7Ci0JCSAgICAgc2RldiA9IHNkZXYtPm5leHQsIGkrKykgewotCQkJaWYgKHNkZXYgPT0gZ29hbF9zZGV2KQotCQkJCXJldHVybiBxcDsKLQkJfQotCX0KKwlvcCA9IHRvX29mX2RldmljZShwYXJlbnQpOworCXFwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlpZiAocXApCisJCXJldHVybiBxcDsKIAogCXFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF1YXR0cm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAocXAgIT0gTlVMTCkgewpAQCAtMjU4NiwxMCArMjUzNCwxMSBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJcXAtPmhhcHB5X21lYWxzW2ldID0gTlVMTDsKIAotCQlxcC0+cXVhdHRyb19kZXYgPSBnb2FsX3NkZXY7CisJCXFwLT5xdWF0dHJvX2RldiA9IGNoaWxkOwogCQlxcC0+bmV4dCA9IHFmZV9zYnVzX2xpc3Q7CiAJCXFmZV9zYnVzX2xpc3QgPSBxcDsKLQkJcXVhdHRyb19nZXRfcmFuZ2VzKHFwKTsKKworCQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHFwKTsKIAl9CiAJcmV0dXJuIHFwOwogfQpAQCAtMjYwMiwxMCArMjU1MSwxMCBAQAogCXN0cnVjdCBxdWF0dHJvICpxcDsKIAogCWZvciAocXAgPSBxZmVfc2J1c19saXN0OyBxcCAhPSBOVUxMOyBxcCA9IHFwLT5uZXh0KSB7Ci0JCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKKwkJc3RydWN0IG9mX2RldmljZSAqb3AgPSBxcC0+cXVhdHRyb19kZXY7CiAJCWludCBlcnI7CiAKLQkJZXJyID0gcmVxdWVzdF9pcnEoc2Rldi0+aXJxc1swXSwKKwkJZXJyID0gcmVxdWVzdF9pcnEob3AtPmlycXNbMF0sCiAJCQkJICBxdWF0dHJvX3NidXNfaW50ZXJydXB0LAogCQkJCSAgSVJRRl9TSEFSRUQsICJRdWF0dHJvIiwKIAkJCQkgIHFwKTsKQEAgLTI2MjEsOSArMjU3MCw5IEBACiAJc3RydWN0IHF1YXR0cm8gKnFwOwogCiAJZm9yIChxcCA9IHFmZV9zYnVzX2xpc3Q7IHFwICE9IE5VTEw7IHFwID0gcXAtPm5leHQpIHsKLQkJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHFwLT5xdWF0dHJvX2RldjsKIAotCQlmcmVlX2lycShzZGV2LT5pcnFzWzBdLCBxcCk7CisJCWZyZWVfaXJxKG9wLT5pcnFzWzBdLCBxcCk7CiAJfQogfQogI2VuZGlmIC8qIENPTkZJR19TQlVTICovCkBAIC0yNjYwLDkgKzI2MDksOSBAQAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmZGVmIENPTkZJR19TQlVTCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBoYXBweV9tZWFsX3NidXNfcHJvYmVfb25lKHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IGlzX3FmZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhhcHB5X21lYWxfc2J1c19wcm9iZV9vbmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGludCBpc19xZmUpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IHNkZXYtPm9mZGV2Lm5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlLCAqc2J1c19kcDsKIAlzdHJ1Y3QgcXVhdHRybyAqcXAgPSBOVUxMOwogCXN0cnVjdCBoYXBweV9tZWFsICpocDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjY3MSw3ICsyNjIwLDcgQEAKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAogCWlmIChpc19xZmUpIHsKLQkJcXAgPSBxdWF0dHJvX3NidXNfZmluZChzZGV2KTsKKwkJcXAgPSBxdWF0dHJvX3NidXNfZmluZChvcCk7CiAJCWlmIChxcCA9PSBOVUxMKQogCQkJZ290byBlcnJfb3V0OwogCQlmb3IgKHFmZV9zbG90ID0gMDsgcWZlX3Nsb3QgPCA0OyBxZmVfc2xvdCsrKQpAQCAtMjY4NSw3ICsyNjM0LDcgQEAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhhcHB5X21lYWwpKTsKIAlpZiAoIWRldikKIAkJZ290byBlcnJfb3V0OwotCVNFVF9ORVRERVZfREVWKGRldiwgJnNkZXYtPm9mZGV2LmRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmb3AtPmRldik7CiAKIAlpZiAoaG1lX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCiAJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CkBAIC0yNzEzLDU2ICsyNjYyLDUwIEBACiAJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgaWRwcm9tLT5pZF9ldGhhZGRyLCA2KTsKIAl9CiAKLQlocCA9IGRldi0+cHJpdjsKKwlocCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlocC0+aGFwcHlfZGV2ID0gc2RldjsKKwlocC0+aGFwcHlfZGV2ID0gb3A7CisJaHAtPmRtYV9kZXYgPSAmb3AtPmRldjsKIAogCXNwaW5fbG9ja19pbml0KCZocC0+aGFwcHlfbG9jayk7CiAKIAllcnIgPSAtRU5PREVWOwotCWlmIChzZGV2LT5udW1fcmVnaXN0ZXJzICE9IDUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IERldmljZSBuZWVkcyA1IHJlZ3MsIGhhcyAlZC5cbiIsCi0JCSAgICAgICBzZGV2LT5udW1fcmVnaXN0ZXJzKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCX0KLQogCWlmIChxcCAhPSBOVUxMKSB7CiAJCWhwLT5xZmVfcGFyZW50ID0gcXA7CiAJCWhwLT5xZmVfZW50ID0gcWZlX3Nsb3Q7CiAJCXFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPSBkZXY7Ci0JCXF1YXR0cm9fYXBwbHlfcmFuZ2VzKHFwLCBocCk7CiAJfQogCi0JaHAtPmdyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkgR1JFR19SRUdfU0laRSwgIkhNRSBHbG9iYWwgUmVncyIpOworCWhwLT5ncmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgICAgICBHUkVHX1JFR19TSVpFLCAiSE1FIEdsb2JhbCBSZWdzIik7CiAJaWYgKCFocC0+Z3JlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCi0JaHAtPmV0eHJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzFdLCAwLAotCQkJCSAgIEVUWF9SRUdfU0laRSwgIkhNRSBUWCBSZWdzIik7CisJaHAtPmV0eHJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsCisJCQkJIEVUWF9SRUdfU0laRSwgIkhNRSBUWCBSZWdzIik7CiAJaWYgKCFocC0+ZXR4cmVncykgewogCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBNQUMgVFggcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAotCWhwLT5lcnhyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVsyXSwgMCwKLQkJCQkgICBFUlhfUkVHX1NJWkUsICJITUUgUlggUmVncyIpOworCWhwLT5lcnhyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLAorCQkJCSBFUlhfUkVHX1NJWkUsICJITUUgUlggUmVncyIpOwogCWlmICghaHAtPmVyeHJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgTUFDIFJYIHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAl9CiAKLQlocC0+YmlnbWFjcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbM10sIDAsCi0JCQkJICAgICAgQk1BQ19SRUdfU0laRSwgIkhNRSBCSUdNQUMgUmVncyIpOworCWhwLT5iaWdtYWNyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzNdLCAwLAorCQkJCSAgICBCTUFDX1JFR19TSVpFLCAiSE1FIEJJR01BQyBSZWdzIik7CiAJaWYgKCFocC0+YmlnbWFjcmVncykgewogCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBCSUdNQUMgcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAotCWhwLT50Y3ZyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVs0XSwgMCwKLQkJCQkgICBUQ1ZSX1JFR19TSVpFLCAiSE1FIFRyYW5jZWl2ZXIgUmVncyIpOworCWhwLT50Y3ZyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzRdLCAwLAorCQkJCSBUQ1ZSX1JFR19TSVpFLCAiSE1FIFRyYW5jZWl2ZXIgUmVncyIpOwogCWlmICghaHAtPnRjdnJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgVENWUiByZWdpc3RlcnMuXG4iKTsKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CkBAIC0yNzgxLDEzICsyNzI0LDE4IEBACiAJaWYgKHFwICE9IE5VTEwpCiAJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19RVUFUVFJPOwogCisJc2J1c19kcCA9IHRvX29mX2RldmljZShvcC0+ZGV2LnBhcmVudCktPm5vZGU7CisJaWYgKGlzX3FmZSkKKwkJc2J1c19kcCA9IHRvX29mX2RldmljZShvcC0+ZGV2LnBhcmVudC0+cGFyZW50KS0+bm9kZTsKKwogCS8qIEdldCB0aGUgc3VwcG9ydGVkIERWTUEgYnVyc3Qgc2l6ZXMgZnJvbSBvdXIgSGFwcHkgU0JVUy4gKi8KLQlocC0+aGFwcHlfYnVyc3RzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHNkZXYtPmJ1cy0+b2ZkZXYubm9kZSwKKwlocC0+aGFwcHlfYnVyc3RzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHNidXNfZHAsCiAJCQkJCQkgImJ1cnN0LXNpemVzIiwgMHgwMCk7CiAKLQlocC0+aGFwcHlfYmxvY2sgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKLQkJCQkJCVBBR0VfU0laRSwKLQkJCQkJCSZocC0+aGJsb2NrX2R2bWEpOworCWhwLT5oYXBweV9ibG9jayA9IGRtYV9hbGxvY19jb2hlcmVudChocC0+ZG1hX2RldiwKKwkJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgJmhwLT5oYmxvY2tfZHZtYSwKKwkJCQkJICAgICBHRlBfQVRPTUlDKTsKIAllcnIgPSAtRU5PTUVNOwogCWlmICghaHAtPmhhcHB5X2Jsb2NrKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgYWxsb2NhdGUgZGVzY3JpcHRvcnMuXG4iKTsKQEAgLTI4MTYsMTkgKzI3NjQsMTMgQEAKIAkvKiBIYXBweSBNZWFsIGNhbiBkbyBpdCBhbGwuLi4gKi8KIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU07CiAKLQlkZXYtPmlycSA9IHNkZXYtPmlycXNbMF07CisJZGV2LT5pcnEgPSBvcC0+aXJxc1swXTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKLQkvKiBIb29rIHVwIFBDSSByZWdpc3Rlci9kbWEgYWNjZXNzb3JzLiAqLworCS8qIEhvb2sgdXAgU0JVUyByZWdpc3Rlci9kZXNjcmlwdG9yIGFjY2Vzc29ycy4gKi8KIAlocC0+cmVhZF9kZXNjMzIgPSBzYnVzX2htZV9yZWFkX2Rlc2MzMjsKIAlocC0+d3JpdGVfdHhkID0gc2J1c19obWVfd3JpdGVfdHhkOwogCWhwLT53cml0ZV9yeGQgPSBzYnVzX2htZV93cml0ZV9yeGQ7Ci0JaHAtPmRtYV9tYXAgPSAodTMyICgqKSh2b2lkICosIHZvaWQgKiwgbG9uZywgaW50KSlzYnVzX21hcF9zaW5nbGU7Ci0JaHAtPmRtYV91bm1hcCA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSlzYnVzX3VubWFwX3NpbmdsZTsKLQlocC0+ZG1hX3N5bmNfZm9yX2NwdSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKLQkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdTsKLQlocC0+ZG1hX3N5bmNfZm9yX2RldmljZSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKLQkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKIAlocC0+cmVhZDMyID0gc2J1c19obWVfcmVhZDMyOwogCWhwLT53cml0ZTMyID0gc2J1c19obWVfd3JpdGUzMjsKICNlbmRpZgpAQCAtMjg0MywxMCArMjc4NSwxMCBAQAogCWlmIChyZWdpc3Rlcl9uZXRkZXYoaHAtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCiAJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY29oZXJlbnQ7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5vZmRldi5kZXYsIGhwKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGhwKTsKIAogCWlmIChxZmVfc2xvdCAhPSAtMSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFF1YXR0cm8gSE1FIHNsb3QgJWQgKFNCVVMpIDEwLzEwMGJhc2VUIEV0aGVybmV0ICIsCkBAIC0yODU5LDIzICsyODAxLDIzIEBACiAKIAlyZXR1cm4gMDsKIAotZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ6Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKLQkJCSAgICAgUEFHRV9TSVpFLAotCQkJICAgICBocC0+aGFwcHlfYmxvY2ssCi0JCQkgICAgIGhwLT5oYmxvY2tfZHZtYSk7CitlcnJfb3V0X2ZyZWVfY29oZXJlbnQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoaHAtPmRtYV9kZXYsCisJCQkgIFBBR0VfU0laRSwKKwkJCSAgaHAtPmhhcHB5X2Jsb2NrLAorCQkJICBocC0+aGJsb2NrX2R2bWEpOwogCiBlcnJfb3V0X2lvdW5tYXA6CiAJaWYgKGhwLT5ncmVncykKLQkJc2J1c19pb3VubWFwKGhwLT5ncmVncywgR1JFR19SRUdfU0laRSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgaHAtPmdyZWdzLCBHUkVHX1JFR19TSVpFKTsKIAlpZiAoaHAtPmV0eHJlZ3MpCi0JCXNidXNfaW91bm1hcChocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzFdLCBocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKIAlpZiAoaHAtPmVyeHJlZ3MpCi0JCXNidXNfaW91bm1hcChocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKIAlpZiAoaHAtPmJpZ21hY3JlZ3MpCi0JCXNidXNfaW91bm1hcChocC0+YmlnbWFjcmVncywgQk1BQ19SRUdfU0laRSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVszXSwgaHAtPmJpZ21hY3JlZ3MsIEJNQUNfUkVHX1NJWkUpOwogCWlmIChocC0+dGN2cmVncykKLQkJc2J1c19pb3VubWFwKGhwLT50Y3ZyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzRdLCBocC0+dGN2cmVncywgVENWUl9SRUdfU0laRSk7CiAKIGVycl9vdXRfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTMwMzUsNiArMjk3Nyw3IEBACiAJbWVtc2V0KGhwLCAwLCBzaXplb2YoKmhwKSk7CiAKIAlocC0+aGFwcHlfZGV2ID0gcGRldjsKKwlocC0+ZG1hX2RldiA9ICZwZGV2LT5kZXY7CiAKIAlzcGluX2xvY2tfaW5pdCgmaHAtPmhhcHB5X2xvY2spOwogCkBAIC0zMTIxLDcgKzMwNjQsNyBAQAogI2VuZGlmCiAKIAlocC0+aGFwcHlfYmxvY2sgPSAoc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgKikKLQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUEFHRV9TSVpFLCAmaHAtPmhibG9ja19kdm1hKTsKKwkJZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIFBBR0VfU0laRSwgJmhwLT5oYmxvY2tfZHZtYSwgR0ZQX0tFUk5FTCk7CiAKIAllcnIgPSAtRU5PREVWOwogCWlmICghaHAtPmhhcHB5X2Jsb2NrKSB7CkBAIC0zMTUxLDE2ICszMDk0LDEwIEBACiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOwogCiAjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQotCS8qIEhvb2sgdXAgUENJIHJlZ2lzdGVyL2RtYSBhY2Nlc3NvcnMuICovCisJLyogSG9vayB1cCBQQ0kgcmVnaXN0ZXIvZGVzY3JpcHRvciBhY2Nlc3NvcnMuICovCiAJaHAtPnJlYWRfZGVzYzMyID0gcGNpX2htZV9yZWFkX2Rlc2MzMjsKIAlocC0+d3JpdGVfdHhkID0gcGNpX2htZV93cml0ZV90eGQ7CiAJaHAtPndyaXRlX3J4ZCA9IHBjaV9obWVfd3JpdGVfcnhkOwotCWhwLT5kbWFfbWFwID0gKHUzMiAoKikodm9pZCAqLCB2b2lkICosIGxvbmcsIGludCkpcGNpX21hcF9zaW5nbGU7Ci0JaHAtPmRtYV91bm1hcCA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSlwY2lfdW5tYXBfc2luZ2xlOwotCWhwLT5kbWFfc3luY19mb3JfY3B1ID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKQotCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHU7Ci0JaHAtPmRtYV9zeW5jX2Zvcl9kZXZpY2UgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpCi0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKIAlocC0+cmVhZDMyID0gcGNpX2htZV9yZWFkMzI7CiAJaHAtPndyaXRlMzIgPSBwY2lfaG1lX3dyaXRlMzI7CiAjZW5kaWYKQEAgLTMyMzEsMTAgKzMxNjgsOCBAQAogCiAJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCi0JCQkgICAgUEFHRV9TSVpFLAotCQkJICAgIGhwLT5oYXBweV9ibG9jaywKLQkJCSAgICBocC0+aGJsb2NrX2R2bWEpOworCWRtYV9mcmVlX2NvaGVyZW50KGhwLT5kbWFfZGV2LCBQQUdFX1NJWkUsCisJCQkgIGhwLT5oYXBweV9ibG9jaywgaHAtPmhibG9ja19kdm1hKTsKIAlpb3VubWFwKGhwLT5ncmVncyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhocC0+aGFwcHlfZGV2KTsKIApAQCAtMzI3OSw0NiArMzIxNCw0NSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU0JVUwotc3RhdGljIGludCBfX2RldmluaXQgaG1lX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhtZV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCWNvbnN0IGNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKIAlpbnQgaXNfcWZlID0gKG1hdGNoLT5kYXRhICE9IE5VTEwpOwogCiAJaWYgKCFpc19xZmUgJiYgbW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIlNVTlcsc2J1cy1xZmUiKSkKIAkJaXNfcWZlID0gMTsKIAotCXJldHVybiBoYXBweV9tZWFsX3NidXNfcHJvYmVfb25lKHNkZXYsIGlzX3FmZSk7CisJcmV0dXJuIGhhcHB5X21lYWxfc2J1c19wcm9iZV9vbmUob3AsIGlzX3FmZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGhtZV9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBobWVfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGhwLT5kZXY7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKIAogCS8qIFhYWCBxZmUgcGFyZW50IGludGVycnVwdC4uLiAqLwogCi0Jc2J1c19pb3VubWFwKGhwLT5ncmVncywgR1JFR19SRUdfU0laRSk7Ci0Jc2J1c19pb3VubWFwKGhwLT5ldHhyZWdzLCBFVFhfUkVHX1NJWkUpOwotCXNidXNfaW91bm1hcChocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKLQlzYnVzX2lvdW5tYXAoaHAtPmJpZ21hY3JlZ3MsIEJNQUNfUkVHX1NJWkUpOwotCXNidXNfaW91bm1hcChocC0+dGN2cmVncywgVENWUl9SRUdfU0laRSk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKLQkJCSAgICAgUEFHRV9TSVpFLAotCQkJICAgICBocC0+aGFwcHlfYmxvY2ssCi0JCQkgICAgIGhwLT5oYmxvY2tfZHZtYSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBocC0+Z3JlZ3MsIEdSRUdfUkVHX1NJWkUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgaHAtPmV0eHJlZ3MsIEVUWF9SRUdfU0laRSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbM10sIGhwLT5iaWdtYWNyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbNF0sIGhwLT50Y3ZyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwlkbWFfZnJlZV9jb2hlcmVudChocC0+ZG1hX2RldiwKKwkJCSAgUEFHRV9TSVpFLAorCQkJICBocC0+aGFwcHlfYmxvY2ssCisJCQkgIGhwLT5oYmxvY2tfZHZtYSk7CiAKIAlmcmVlX25ldGRldihuZXRfZGV2KTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaG1lX3NidXNfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhtZV9zYnVzX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJTVU5XLGhtZSIsCiAJfSwKQEAgLTMzNDYsNyArMzI4MCw3IEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmaG1lX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CisJZXJyID0gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZobWVfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CiAJaWYgKCFlcnIpCiAJCXF1YXR0cm9fc2J1c19yZWdpc3Rlcl9pcnFzKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5oIGIvZHJpdmVycy9uZXQvc3VuaG1lLmgKaW5kZXggNGRhNTUzOS4uZWZkMmNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuaG1lLmgKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmgKQEAgLTQwNSwxNCArNDA1LDExIEBACiAJdTMyICgqcmVhZF9kZXNjMzIpKGhtZTMyICopOwogCXZvaWQgKCp3cml0ZV90eGQpKHN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqLCB1MzIsIHUzMik7CiAJdm9pZCAoKndyaXRlX3J4ZCkoc3RydWN0IGhhcHB5X21lYWxfcnhkICosIHUzMiwgdTMyKTsKLQl1MzIgKCpkbWFfbWFwKSh2b2lkICosIHZvaWQgKiwgbG9uZywgaW50KTsKLQl2b2lkICgqZG1hX3VubWFwKSh2b2lkICosIHUzMiwgbG9uZywgaW50KTsKLQl2b2lkICgqZG1hX3N5bmNfZm9yX2NwdSkodm9pZCAqLCB1MzIsIGxvbmcsIGludCk7Ci0Jdm9pZCAoKmRtYV9zeW5jX2Zvcl9kZXZpY2UpKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpOwogI2VuZGlmCiAKLQkvKiBUaGlzIGlzIGVpdGhlciBhIHNidXNfZGV2IG9yIGEgcGNpX2Rldi4gKi8KKwkvKiBUaGlzIGlzIGVpdGhlciBhbiBvZl9kZXZpY2Ugb3IgYSBwY2lfZGV2LiAqLwogCXZvaWQJCQkgICpoYXBweV9kZXY7CisJc3RydWN0IGRldmljZQkJICAqZG1hX2RldjsKIAogCXNwaW5sb2NrX3QJCSAgaGFwcHlfbG9jazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKaW5kZXggNGU5OTRmOC4uNzA0MzAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VubGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCkBAIC05MSw2ICs5MSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTk4LDcgKzEwMSw2IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIFVzZWQgYnkgdGhlIGNoZWNrc3VtIHJvdXRpbmVzICovCiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4JCS8qIEZvciB0cGUtbGluay10ZXN0PyBzZXR0aW5nICovCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMjQ4LDcgKzI1MCw3IEBACiAJaW50CQlyeF9uZXcsIHR4X25ldzsKIAlpbnQJCXJ4X29sZCwgdHhfb2xkOwogCi0Jc3RydWN0IHNidXNfZG1hICpsZWRtYTsJLyogSWYgc2V0IHRoaXMgcG9pbnRzIHRvIGxlZG1hCSovCisJc3RydWN0IG9mX2RldmljZSAqbGVkbWE7CS8qIElmIHNldCB0aGlzIHBvaW50cyB0byBsZWRtYQkqLwogCWNoYXIJCXRwZTsJCS8qIGNhYmxlLXNlbGVjdGlvbiBpcyBUUEUJKi8KIAljaGFyCQlhdXRvX3NlbGVjdDsJLyogY2FibGUtc2VsZWN0aW9uIGJ5IGNhcnJpZXIJKi8KIAljaGFyCQlidXJzdF9zaXplczsJLyogbGVkbWEgU0J1cyBidXJzdCBzaXplcwkqLwpAQCAtMjYzLDcgKzI2NSw4IEBACiAJY2hhcgkgICAgICAgCSAgICAgICAqbmFtZTsKIAlkbWFfYWRkcl90CQlpbml0X2Jsb2NrX2R2bWE7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgICAqZGV2OwkJICAvKiBCYWNrcG9pbnRlcgkqLwotCXN0cnVjdCBzYnVzX2RldgkgICAgICAgKnNkZXY7CisJc3RydWN0IG9mX2RldmljZSAgICAgICAqb3A7CisJc3RydWN0IG9mX2RldmljZSAgICAgICAqbGVidWZmZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgbXVsdGljYXN0X3RpbWVyOwogfTsKIApAQCAtMTI3MiwyNyArMTI3NSwyOSBAQAogc3RhdGljIHZvaWQgbGFuY2VfZnJlZV9od3Jlc291cmNlcyhzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCiB7CiAJaWYgKGxwLT5scmVncykKLQkJc2J1c19pb3VubWFwKGxwLT5scmVncywgTEFOQ0VfUkVHX1NJWkUpOworCQlvZl9pb3VubWFwKCZscC0+b3AtPnJlc291cmNlWzBdLCBscC0+bHJlZ3MsIExBTkNFX1JFR19TSVpFKTsKKwlpZiAobHAtPmRyZWdzKSB7CisJCXN0cnVjdCBvZl9kZXZpY2UgKmxlZG1hID0gbHAtPmxlZG1hOworCisJCW9mX2lvdW5tYXAoJmxlZG1hLT5yZXNvdXJjZVswXSwgbHAtPmRyZWdzLAorCQkJICAgcmVzb3VyY2Vfc2l6ZSgmbGVkbWEtPnJlc291cmNlWzBdKSk7CisJfQogCWlmIChscC0+aW5pdF9ibG9ja19pb21lbSkgewotCQlzYnVzX2lvdW5tYXAobHAtPmluaXRfYmxvY2tfaW9tZW0sCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykpOworCQlvZl9pb3VubWFwKCZscC0+bGVidWZmZXItPnJlc291cmNlWzBdLCBscC0+aW5pdF9ibG9ja19pb21lbSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykpOwogCX0gZWxzZSBpZiAobHAtPmluaXRfYmxvY2tfbWVtKSB7Ci0JCXNidXNfZnJlZV9jb25zaXN0ZW50KGxwLT5zZGV2LAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwKLQkJCQkgICAgIGxwLT5pbml0X2Jsb2NrX21lbSwKLQkJCQkgICAgIGxwLT5pbml0X2Jsb2NrX2R2bWEpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmbHAtPm9wLT5kZXYsCisJCQkJICBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spLAorCQkJCSAgbHAtPmluaXRfYmxvY2tfbWVtLAorCQkJCSAgbHAtPmluaXRfYmxvY2tfZHZtYSk7CiAJfQogfQogCiAvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KIHN0YXRpYyB2b2lkIHNwYXJjX2xhbmNlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQogCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5sYW5jZSIpOwogCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMi4wMiIpOwotCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKLQkJbHAtPnNkZXYtPnNsb3QpOwogfQogCiBzdGF0aWMgdTMyIHNwYXJjX2xhbmNlX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMzA4LDE2ICsxMzEzLDE2IEBACiAJLmdldF9saW5rCQk9IHNwYXJjX2xhbmNlX2dldF9saW5rLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgc3BhcmNfbGFuY2VfcHJvYmVfb25lKHN0cnVjdCBzYnVzX2RldiAqc2RldiwKLQkJCQkJICAgc3RydWN0IHNidXNfZG1hICpsZWRtYSwKLQkJCQkJICAgc3RydWN0IHNidXNfZGV2ICpsZWJ1ZmZlcikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwYXJjX2xhbmNlX3Byb2JlX29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkJICAgc3RydWN0IG9mX2RldmljZSAqbGVkbWEsCisJCQkJCSAgIHN0cnVjdCBvZl9kZXZpY2UgKmxlYnVmZmVyKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOwotCWludCAgICBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisJaW50ICAgIGk7CiAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpICsgOCk7CiAJaWYgKCFkZXYpCkBAIC0xMzM4LDE0ICsxMzQzLDI3IEBACiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBpZHByb20tPmlkX2V0aGFkZHJbaV07CiAKIAkvKiBHZXQgdGhlIElPIHJlZ2lvbiAqLwotCWxwLT5scmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJIExBTkNFX1JFR19TSVpFLCBsYW5jZXN0cik7CisJbHAtPmxyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJICAgICAgIExBTkNFX1JFR19TSVpFLCBsYW5jZXN0cik7CiAJaWYgKCFscC0+bHJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogQ2Fubm90IG1hcCByZWdpc3RlcnMuXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAotCWxwLT5zZGV2ID0gc2RldjsKKwlscC0+bGVkbWEgPSBsZWRtYTsKKwlpZiAobHAtPmxlZG1hKSB7CisJCWxwLT5kcmVncyA9IG9mX2lvcmVtYXAoJmxlZG1hLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZSgmbGVkbWEtPnJlc291cmNlWzBdKSwKKwkJCQkgICAgICAgImxlZG1hIik7CisJCWlmICghbHAtPmRyZWdzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBDYW5ub3QgbWFwICIKKwkJCSAgICAgICAibGVkbWEgcmVnaXN0ZXJzLlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlscC0+b3AgPSBvcDsKKwlscC0+bGVidWZmZXIgPSBsZWJ1ZmZlcjsKIAlpZiAobGVidWZmZXIpIHsKIAkJLyogc2FuaXR5IGNoZWNrICovCiAJCWlmIChsZWJ1ZmZlci0+cmVzb3VyY2VbMF0uc3RhcnQgJiA3KSB7CkBAIC0xMzUzLDggKzEzNzEsOCBAQAogCQkJZ290byBmYWlsOwogCQl9CiAJCWxwLT5pbml0X2Jsb2NrX2lvbWVtID0KLQkJCXNidXNfaW9yZW1hcCgmbGVidWZmZXItPnJlc291cmNlWzBdLCAwLAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwgImxlYnVmZmVyIik7CisJCQlvZl9pb3JlbWFwKCZsZWJ1ZmZlci0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwgImxlYnVmZmVyIik7CiAJCWlmICghbHAtPmluaXRfYmxvY2tfaW9tZW0pIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCBtYXAgUElPIGJ1ZmZlci5cbiIpOwogCQkJZ290byBmYWlsOwpAQCAtMTM2Niw5ICsxMzg0LDEwIEBACiAJCWxwLT50eCA9IGxhbmNlX3R4X3BpbzsKIAl9IGVsc2UgewogCQlscC0+aW5pdF9ibG9ja19tZW0gPQotCQkJc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayksCi0JCQkJCSAgICAgICZscC0+aW5pdF9ibG9ja19kdm1hKTsKLQkJaWYgKCFscC0+aW5pdF9ibG9ja19tZW0gfHwgbHAtPmluaXRfYmxvY2tfZHZtYSA9PSAwKSB7CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayksCisJCQkJCSAgICZscC0+aW5pdF9ibG9ja19kdm1hLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFscC0+aW5pdF9ibG9ja19tZW0pIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCBhbGxvY2F0ZSBjb25zaXN0ZW50IERNQSBtZW1vcnkuXG4iKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtMTM4MywxMyArMTQwMiwxMyBAQAogCQkJCQkJICAgICAgTEVfQzNfQkNPTikpOwogCiAJbHAtPm5hbWUgPSBsYW5jZXN0cjsKLQlscC0+bGVkbWEgPSBsZWRtYTsKIAogCWxwLT5idXJzdF9zaXplcyA9IDA7CiAJaWYgKGxwLT5sZWRtYSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmxlZG1hX2RwID0gbGVkbWEtPnNkZXYtPm9mZGV2Lm5vZGU7Ci0JCWNvbnN0IGNoYXIgKnByb3A7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbGVkbWFfZHAgPSBsZWRtYS0+bm9kZTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpzYnVzX2RwOwogCQl1bnNpZ25lZCBpbnQgc2JtYXNrOworCQljb25zdCBjaGFyICpwcm9wOwogCQl1MzIgY3NyOwogCiAJCS8qIEZpbmQgYnVyc3Qtc2l6ZSBwcm9wZXJ0eSBmb3IgbGVkbWEgKi8KQEAgLTEzOTcsNyArMTQxNiw4IEBACiAJCQkJCQkJImJ1cnN0LXNpemVzIiwgMCk7CiAKIAkJLyogbGVkbWEgbWF5IGJlIGNhcGFibGUgb2YgZmFzdCBidXJzdHMsIGJ1dCBzYnVzIG1heSBub3QuICovCi0JCXNibWFzayA9IG9mX2dldGludHByb3BfZGVmYXVsdChsZWRtYV9kcCwgImJ1cnN0LXNpemVzIiwKKwkJc2J1c19kcCA9IGxlZG1hX2RwLT5wYXJlbnQ7CisJCXNibWFzayA9IG9mX2dldGludHByb3BfZGVmYXVsdChzYnVzX2RwLCAiYnVyc3Qtc2l6ZXMiLAogCQkJCQkgICAgICAgRE1BX0JVUlNUQklUUyk7CiAJCWxwLT5idXJzdF9zaXplcyAmPSBzYm1hc2s7CiAKQEAgLTE0MzUsOCArMTQ1NSw2IEBACiAJCQlscC0+dHBlID0gMTsKIAkJfQogCi0JCWxwLT5kcmVncyA9IGxlZG1hLT5yZWdzOwotCiAJCS8qIFJlc2V0IGxlZG1hICovCiAJCWNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CiAJCXNidXNfd3JpdGVsKGNzciB8IERNQV9SU1RfRU5FVCwgbHAtPmRyZWdzICsgRE1BX0NTUik7CkBAIC0xNDQ2LDcgKzE0NjQsNyBAQAogCQlscC0+ZHJlZ3MgPSBOVUxMOwogCiAJbHAtPmRldiA9IGRldjsKLQlTRVRfTkVUREVWX0RFVihkZXYsICZzZGV2LT5vZmRldi5kZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJm9wLT5kZXYpOwogCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOwogCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OwpAQCAtMTQ1NSw5ICsxNDczLDcgQEAKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OwogCWRldi0+ZXRodG9vbF9vcHMgPSAmc3BhcmNfbGFuY2VfZXRodG9vbF9vcHM7CiAKLQlkZXYtPmlycSA9IHNkZXYtPmlycXNbMF07Ci0KLQlkZXYtPmRtYSA9IDA7CisJZGV2LT5pcnEgPSBvcC0+aXJxc1swXTsKIAogCS8qIFdlIGNhbm5vdCBzbGVlcCBpZiB0aGUgY2hpcCBpcyBidXN5IGR1cmluZyBhCiAJICogbXVsdGljYXN0IGxpc3QgdXBkYXRlIGV2ZW50LCBiZWNhdXNlIHN1Y2ggZXZlbnRzCkBAIC0xNDczLDcgKzE0ODksNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5vZmRldi5kZXYsIGxwKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGxwKTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBMQU5DRSAlc1xuIiwKIAkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBkZXYtPmRldl9hZGRyKSk7CkBAIC0xNDg2LDgwICsxNTAyLDI1IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLS8qIE9uIDRtLCBmaW5kIHRoZSBhc3NvY2lhdGVkIGRtYSBmb3IgdGhlIGxhbmNlIGNoaXAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2J1c19kbWEgKiBfX2RldmluaXQgZmluZF9sZWRtYShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW5sYW5jZV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3Qgc2J1c19kbWEgKnA7Ci0KLQlmb3JfZWFjaF9kdm1hKHApIHsKLQkJaWYgKHAtPnNkZXYgPT0gc2RldikKLQkJCXJldHVybiBwOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIENPTkZJR19TVU40Ci0KLSNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+Ci0KLS8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgc3VuNF9zZGV2Owotc3RhdGljIGludCBfX2RldmluaXQgc3BhcmNfbGFuY2VfaW5pdCh2b2lkKQotewotCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONHxTTV80XzMzMCkpIHx8Ci0JICAgIChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40fFNNXzRfNDcwKSkpIHsKLQkJbWVtc2V0KCZzdW40X3NkZXYsIDAsIHNpemVvZihzdHJ1Y3Qgc2J1c19kZXYpKTsKLQkJc3VuNF9zZGV2LnJlZ19hZGRyc1swXS5waHlzX2FkZHIgPSBzdW40X2V0aF9waHlzYWRkcjsKLQkJc3VuNF9zZGV2LmlycXNbMF0gPSA2OwotCQlyZXR1cm4gc3BhcmNfbGFuY2VfcHJvYmVfb25lKCZzdW40X3NkZXYsIE5VTEwsIE5VTEwpOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgc3VubGFuY2Vfc3VuNF9yZW1vdmUodm9pZCkKLXsKLQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXZfZ2V0X2RydmRhdGEoJnN1bjRfc2Rldi5vZmRldi5kZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gbHAtPmRldjsKLQotCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwotCi0JbGFuY2VfZnJlZV9od3Jlc291cmNlcyhscCk7Ci0KLQlmcmVlX25ldGRldihuZXRfZGV2KTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmc3VuNF9zZGV2Lm9mZGV2LmRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UgLyogIUNPTkZJR19TVU40ICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHN1bmxhbmNlX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBvZl9kZXZpY2UgKnBhcmVudCA9IHRvX29mX2RldmljZShvcC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfZHAgPSBwYXJlbnQtPm5vZGU7CiAJaW50IGVycjsKIAotCWlmIChzZGV2LT5wYXJlbnQpIHsKLQkJc3RydWN0IG9mX2RldmljZSAqcGFyZW50ID0gJnNkZXYtPnBhcmVudC0+b2ZkZXY7Ci0KLQkJaWYgKCFzdHJjbXAocGFyZW50LT5ub2RlLT5uYW1lLCAibGVkbWEiKSkgewotCQkJc3RydWN0IHNidXNfZG1hICpsZWRtYSA9IGZpbmRfbGVkbWEodG9fc2J1c19kZXZpY2UoJnBhcmVudC0+ZGV2KSk7Ci0KLQkJCWVyciA9IHNwYXJjX2xhbmNlX3Byb2JlX29uZShzZGV2LCBsZWRtYSwgTlVMTCk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJlbnQtPm5vZGUtPm5hbWUsICJsZWJ1ZmZlciIpKSB7Ci0JCQllcnIgPSBzcGFyY19sYW5jZV9wcm9iZV9vbmUoc2RldiwgTlVMTCwgdG9fc2J1c19kZXZpY2UoJnBhcmVudC0+ZGV2KSk7Ci0JCX0gZWxzZQotCQkJZXJyID0gc3BhcmNfbGFuY2VfcHJvYmVfb25lKHNkZXYsIE5VTEwsIE5VTEwpOworCWlmICghc3RyY21wKHBhcmVudF9kcC0+bmFtZSwgImxlZG1hIikpIHsKKwkJZXJyID0gc3BhcmNfbGFuY2VfcHJvYmVfb25lKG9wLCBwYXJlbnQsIE5VTEwpOworCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJlbnRfZHAtPm5hbWUsICJsZWJ1ZmZlciIpKSB7CisJCWVyciA9IHNwYXJjX2xhbmNlX3Byb2JlX29uZShvcCwgTlVMTCwgcGFyZW50KTsKIAl9IGVsc2UKLQkJZXJyID0gc3BhcmNfbGFuY2VfcHJvYmVfb25lKHNkZXYsIE5VTEwsIE5VTEwpOworCQllcnIgPSBzcGFyY19sYW5jZV9wcm9iZV9vbmUob3AsIE5VTEwsIE5VTEwpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc3VubGFuY2Vfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgc3VubGFuY2Vfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGxwLT5kZXY7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKQEAgLTE1NjgsMTIgKzE1MjksMTIgQEAKIAogCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwogCi0JZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdW5sYW5jZV9zYnVzX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW5sYW5jZV9zYnVzX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJsZSIsCiAJfSwKQEAgLTE1OTMsMTcgKzE1NTQsMTIgQEAKIC8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KIHN0YXRpYyBpbnQgX19pbml0IHNwYXJjX2xhbmNlX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZzdW5sYW5jZV9zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnN1bmxhbmNlX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQotI2VuZGlmIC8qICFDT05GSUdfU1VONCAqLwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3BhcmNfbGFuY2VfZXhpdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19TVU40Ci0Jc3VubGFuY2Vfc3VuNF9yZW1vdmUoKTsKLSNlbHNlCiAJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnN1bmxhbmNlX3NidXNfZHJpdmVyKTsKLSNlbmRpZgogfQogCiBtb2R1bGVfaW5pdChzcGFyY19sYW5jZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnFlLmMgYi9kcml2ZXJzL25ldC9zdW5xZS5jCmluZGV4IGU4MTEzMzEuLmY2MzY0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bnFlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VucWUuYwpAQCAtMyw3ICszLDcgQEAKICAqICAgICAgICAgIGNvbnRyb2xsZXIgb3V0IHRoZXJlIGNhbiBiZSBtb3N0IGVmZmljaWVudGx5IHByb2dyYW1tZWQKICAqICAgICAgICAgIGlmIHlvdSBtYWtlIGl0IGxvb2sgbGlrZSBhIExBTkNFLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMywgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDMsIDIwMDYsIDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI0LDEzICsyNCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KQEAgLTQwLDggKzQyLDggQEAKICNpbmNsdWRlICJzdW5xZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzdW5xZSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjQuMCIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIkp1bmUgMjMsIDIwMDYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSI0LjEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJBdWd1c3QgMjcsIDIwMDgiCiAjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CkBAIC02OTAsMTIgKzY5MiwxOCBAQAogLyogRXRodG9vbCBzdXBwb3J0Li4uICovCiBzdGF0aWMgdm9pZCBxZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogeworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAlzdHJ1Y3Qgc3VucWUgKnFlcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcDsKIAogCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5xZSIpOwogCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMy4wIik7Ci0Jc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAotCQlxZXAtPnFlX3NkZXYtPnNsb3QpOworCisJb3AgPSBxZXAtPm9wOworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJyZWciLCBOVUxMKTsKKwlpZiAocmVncykKKwkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLCByZWdzLT53aGljaF9pbyk7CisKIH0KIAogc3RhdGljIHUzMiBxZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNzE3LDExICs3MjUsMTEgQEAKIH07CiAKIC8qIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZSBhdCBib290IHRpbWUgZm9yIGVhY2ggY2FyZCBwcm9iZWQuICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcWVjX2luaXRfb25jZShzdHJ1Y3Qgc3VucWVjICpxZWNwLCBzdHJ1Y3Qgc2J1c19kZXYgKnFzZGV2KQorc3RhdGljIHZvaWQgcWVjX2luaXRfb25jZShzdHJ1Y3Qgc3VucWVjICpxZWNwLCBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKIAl1OCBic2l6ZXMgPSBxZWNwLT5xZWNfYnVyc3RzOwogCi0JaWYgKHNidXNfY2FuX2J1cnN0NjQocXNkZXYpICYmIChic2l6ZXMgJiBETUFfQlVSU1Q2NCkpIHsKKwlpZiAoc2J1c19jYW5fYnVyc3Q2NCgpICYmIChic2l6ZXMgJiBETUFfQlVSU1Q2NCkpIHsKIAkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0I2NCwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOwogCX0gZWxzZSBpZiAoYnNpemVzICYgRE1BX0JVUlNUMzIpIHsKIAkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0IzMiwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOwpAQCAtNzM1LDE1ICs3NDMsMTUgQEAKIAlzYnVzX3dyaXRlbChHTE9CX1BTSVpFXzIwNDgsIHFlY3AtPmdyZWdzICsgR0xPQl9QU0laRSk7CiAKIAkvKiBTZXQgdGhlIGxvY2FsIG1lbXNpemUgcmVnaXN0ZXIsIGRpdmlkZWQgdXAgdG8gb25lIHBpZWNlIHBlciBRRSBjaGFubmVsLiAqLwotCXNidXNfd3JpdGVsKChxc2Rldi0+cmVnX2FkZHJzWzFdLnJlZ19zaXplID4+IDIpLAorCXNidXNfd3JpdGVsKChyZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMV0pID4+IDIpLAogCQkgICAgcWVjcC0+Z3JlZ3MgKyBHTE9CX01TSVpFKTsKIAogCS8qIERpdmlkZSB1cCB0aGUgbG9jYWwgUUVDIG1lbW9yeSBhbW9uZ3N0IHRoZSA0IFFFIHJlY2VpdmVyIGFuZAogCSAqIHRyYW5zbWl0dGVyIEZJRk9zLiAgQmFzaWNhbGx5IGl0IGlzICh0b3RhbCAvIDIgLyBudW1fY2hhbm5lbHMpLgogCSAqLwotCXNidXNfd3JpdGVsKChxc2Rldi0+cmVnX2FkZHJzWzFdLnJlZ19zaXplID4+IDIpID4+IDEsCisJc2J1c193cml0ZWwoKHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVsxXSkgPj4gMikgPj4gMSwKIAkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9UU0laRSk7Ci0Jc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMikgPj4gMSwKKwlzYnVzX3dyaXRlbCgocmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzFdKSA+PiAyKSA+PiAxLAogCQkgICAgcWVjcC0+Z3JlZ3MgKyBHTE9CX1JTSVpFKTsKIH0KIApAQCAtNzY3LDI0ICs3NzUsMjEgQEAKIAlyZXR1cm4gYnNpemVzOwogfQogCi1zdGF0aWMgc3RydWN0IHN1bnFlYyAqIF9fZGV2aW5pdCBnZXRfcWVjKHN0cnVjdCBzYnVzX2RldiAqY2hpbGRfc2RldikKK3N0YXRpYyBzdHJ1Y3Qgc3VucWVjICogX19kZXZpbml0IGdldF9xZWMoc3RydWN0IG9mX2RldmljZSAqY2hpbGQpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpxZWNfc2RldiA9IGNoaWxkX3NkZXYtPnBhcmVudDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHRvX29mX2RldmljZShjaGlsZC0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHN1bnFlYyAqcWVjcDsKIAotCWZvciAocWVjcCA9IHJvb3RfcWVjX2RldjsgcWVjcDsgcWVjcCA9IHFlY3AtPm5leHRfbW9kdWxlKSB7Ci0JCWlmIChxZWNwLT5xZWNfc2RldiA9PSBxZWNfc2RldikKLQkJCWJyZWFrOwotCX0KKwlxZWNwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAlpZiAoIXFlY3ApIHsKIAkJcWVjcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdW5xZWMpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHFlY3ApIHsKIAkJCXUzMiBjdHJsOwogCi0JCQlxZWNwLT5xZWNfc2RldiA9IHFlY19zZGV2OwotCQkJcWVjcC0+Z3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnFlY19zZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJCSAgIEdMT0JfUkVHX1NJWkUsCi0JCQkJCQkgICAiUUVDIEdsb2JhbCBSZWdpc3RlcnMiKTsKKwkJCXFlY3AtPm9wID0gb3A7CisJCQlxZWNwLT5ncmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkJCSBHTE9CX1JFR19TSVpFLAorCQkJCQkJICJRRUMgR2xvYmFsIFJlZ2lzdGVycyIpOwogCQkJaWYgKCFxZWNwLT5ncmVncykKIAkJCQlnb3RvIGZhaWw7CiAKQEAgLTc5OSwxNiArODA0LDE4IEBACiAJCQlpZiAocWVjX2dsb2JhbF9yZXNldChxZWNwLT5ncmVncykpCiAJCQkJZ290byBmYWlsOwogCi0JCQlxZWNwLT5xZWNfYnVyc3RzID0gcWVjX2dldF9idXJzdChxZWNfc2Rldi0+b2ZkZXYubm9kZSk7CisJCQlxZWNwLT5xZWNfYnVyc3RzID0gcWVjX2dldF9idXJzdChvcC0+bm9kZSk7CiAKLQkJCXFlY19pbml0X29uY2UocWVjcCwgcWVjX3NkZXYpOworCQkJcWVjX2luaXRfb25jZShxZWNwLCBvcCk7CiAKLQkJCWlmIChyZXF1ZXN0X2lycShxZWNfc2Rldi0+aXJxc1swXSwgJnFlY19pbnRlcnJ1cHQsCisJCQlpZiAocmVxdWVzdF9pcnEob3AtPmlycXNbMF0sICZxZWNfaW50ZXJydXB0LAogCQkJCQlJUlFGX1NIQVJFRCwgInFlYyIsICh2b2lkICopIHFlY3ApKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJxZWM6IENhbid0IHJlZ2lzdGVyIGlycS5cbiIpOwogCQkJCWdvdG8gZmFpbDsKIAkJCX0KIAorCQkJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBxZWNwKTsKKwogCQkJcWVjcC0+bmV4dF9tb2R1bGUgPSByb290X3FlY19kZXY7CiAJCQlyb290X3FlY19kZXYgPSBxZWNwOwogCQl9CkBAIC04MTgsMTcgKzgyNSwxNyBAQAogCiBmYWlsOgogCWlmIChxZWNwLT5ncmVncykKLQkJc2J1c19pb3VubWFwKHFlY3AtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBxZWNwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CiAJa2ZyZWUocWVjcCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHFlY19ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHFlY19ldGhlcl9pbml0KHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewogCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3VucWUgKnFlOwogCXN0cnVjdCBzdW5xZWMgKnFlY3A7CisJc3RydWN0IHN1bnFlICpxZTsKIAlpbnQgaSwgcmVzOwogCiAJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCkBAIC04NDIsNDkgKzg0OSw0MiBAQAogCiAJcWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaSA9IG9mX2dldGludHByb3BfZGVmYXVsdChzZGV2LT5vZmRldi5ub2RlLCAiY2hhbm5lbCMiLCAtMSk7Ci0JaWYgKGkgPT0gLTEpIHsKLQkJc3RydWN0IHNidXNfZGV2ICp0ZCA9IHNkZXYtPnBhcmVudC0+Y2hpbGQ7Ci0JCWkgPSAwOwotCQl3aGlsZSAodGQgIT0gc2RldikgewotCQkJdGQgPSB0ZC0+bmV4dDsKLQkJCWkrKzsKLQkJfQotCX0KKwlyZXMgPSAtRU5PREVWOworCisJaSA9IG9mX2dldGludHByb3BfZGVmYXVsdChvcC0+bm9kZSwgImNoYW5uZWwjIiwgLTEpOworCWlmIChpID09IC0xKQorCQlnb3RvIGZhaWw7CiAJcWUtPmNoYW5uZWwgPSBpOwogCXNwaW5fbG9ja19pbml0KCZxZS0+bG9jayk7CiAKLQlyZXMgPSAtRU5PREVWOwotCXFlY3AgPSBnZXRfcWVjKHNkZXYpOworCXFlY3AgPSBnZXRfcWVjKG9wKTsKIAlpZiAoIXFlY3ApCiAJCWdvdG8gZmFpbDsKIAogCXFlY3AtPnFlc1txZS0+Y2hhbm5lbF0gPSBxZTsKIAlxZS0+ZGV2ID0gZGV2OwogCXFlLT5wYXJlbnQgPSBxZWNwOwotCXFlLT5xZV9zZGV2ID0gc2RldjsKKwlxZS0+b3AgPSBvcDsKIAogCXJlcyA9IC1FTk9NRU07Ci0JcWUtPnFjcmVncyA9IHNidXNfaW9yZW1hcCgmcWUtPnFlX3NkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJCSAgQ1JFR19SRUdfU0laRSwgIlFFQyBDaGFubmVsIFJlZ2lzdGVycyIpOworCXFlLT5xY3JlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkJQ1JFR19SRUdfU0laRSwgIlFFQyBDaGFubmVsIFJlZ2lzdGVycyIpOwogCWlmICghcWUtPnFjcmVncykgewogCQlwcmludGsoS0VSTl9FUlIgInFlOiBDYW5ub3QgbWFwIGNoYW5uZWwgcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlxZS0+bXJlZ3MgPSBzYnVzX2lvcmVtYXAoJnFlLT5xZV9zZGV2LT5yZXNvdXJjZVsxXSwgMCwKLQkJCQkgTVJFR1NfUkVHX1NJWkUsICJRRSBNQUNFIFJlZ2lzdGVycyIpOworCXFlLT5tcmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsxXSwgMCwKKwkJCSAgICAgICBNUkVHU19SRUdfU0laRSwgIlFFIE1BQ0UgUmVnaXN0ZXJzIik7CiAJaWYgKCFxZS0+bXJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJxZTogQ2Fubm90IG1hcCBNQUNFIHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcWUtPnFlX2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAotCQkJCQkgICAgIFBBR0VfU0laRSwKLQkJCQkJICAgICAmcWUtPnFibG9ja19kdm1hKTsKLQlxZS0+YnVmZmVycyA9IHNidXNfYWxsb2NfY29uc2lzdGVudChxZS0+cWVfc2RldiwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCi0JCQkJCSAgICAmcWUtPmJ1ZmZlcnNfZHZtYSk7CisJcWUtPnFlX2Jsb2NrID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvcC0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJCSAgJnFlLT5xYmxvY2tfZHZtYSwgR0ZQX0FUT01JQyk7CisJcWUtPmJ1ZmZlcnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCisJCQkJCSAmcWUtPmJ1ZmZlcnNfZHZtYSwgR0ZQX0FUT01JQyk7CiAJaWYgKHFlLT5xZV9ibG9jayA9PSBOVUxMIHx8IHFlLT5xYmxvY2tfZHZtYSA9PSAwIHx8CiAJICAgIHFlLT5idWZmZXJzID09IE5VTEwgfHwgcWUtPmJ1ZmZlcnNfZHZtYSA9PSAwKQogCQlnb3RvIGZhaWw7CkBAIC04OTIsNyArODkyLDcgQEAKIAkvKiBTdG9wIHRoaXMgUUUuICovCiAJcWVfc3RvcChxZSk7CiAKLQlTRVRfTkVUREVWX0RFVihkZXYsICZzZGV2LT5vZmRldi5kZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJm9wLT5kZXYpOwogCiAJZGV2LT5vcGVuID0gcWVfb3BlbjsKIAlkZXYtPnN0b3AgPSBxZV9jbG9zZTsKQEAgLTkwMCw3ICs5MDAsNyBAQAogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWVfc2V0X211bHRpY2FzdDsKIAlkZXYtPnR4X3RpbWVvdXQgPSBxZV90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwotCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKwlkZXYtPmlycSA9IG9wLT5pcnFzWzBdOwogCWRldi0+ZG1hID0gMDsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJnFlX2V0aHRvb2xfb3BzOwogCkBAIC05MDgsNyArOTA4LDcgQEAKIAlpZiAocmVzKQogCQlnb3RvIGZhaWw7CiAKLQlkZXZfc2V0X2RydmRhdGEoJnNkZXYtPm9mZGV2LmRldiwgcWUpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcWUpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHFlIGNoYW5uZWxbJWRdICIsIGRldi0+bmFtZSwgcWUtPmNoYW5uZWwpOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCkBAIC05MjIsNTggKzkyMiw1MCBAQAogCiBmYWlsOgogCWlmIChxZS0+cWNyZWdzKQotCQlzYnVzX2lvdW5tYXAocWUtPnFjcmVncywgQ1JFR19SRUdfU0laRSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcWUtPnFjcmVncywgQ1JFR19SRUdfU0laRSk7CiAJaWYgKHFlLT5tcmVncykKLQkJc2J1c19pb3VubWFwKHFlLT5tcmVncywgTVJFR1NfUkVHX1NJWkUpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMV0sIHFlLT5tcmVncywgTVJFR1NfUkVHX1NJWkUpOwogCWlmIChxZS0+cWVfYmxvY2spCi0JCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAotCQkJCSAgICAgUEFHRV9TSVpFLAotCQkJCSAgICAgcWUtPnFlX2Jsb2NrLAotCQkJCSAgICAgcWUtPnFibG9ja19kdm1hKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsIFBBR0VfU0laRSwKKwkJCQkgIHFlLT5xZV9ibG9jaywgcWUtPnFibG9ja19kdm1hKTsKIAlpZiAocWUtPmJ1ZmZlcnMpCi0JCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKLQkJCQkgICAgIHFlLT5idWZmZXJzLAotCQkJCSAgICAgcWUtPmJ1ZmZlcnNfZHZtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkgIHFlLT5idWZmZXJzLAorCQkJCSAgcWUtPmJ1ZmZlcnNfZHZtYSk7CiAKIAlmcmVlX25ldGRldihkZXYpOwogCiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcWVjX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHFlY19zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwotCi0JcmV0dXJuIHFlY19ldGhlcl9pbml0KHNkZXYpOworCXJldHVybiBxZWNfZXRoZXJfaW5pdChvcCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHFlY19zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBxZWNfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IHN1bnFlICpxcCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBzdW5xZSAqcXAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcXAtPmRldjsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwogCi0Jc2J1c19pb3VubWFwKHFwLT5xY3JlZ3MsIENSRUdfUkVHX1NJWkUpOwotCXNidXNfaW91bm1hcChxcC0+bXJlZ3MsIE1SRUdTX1JFR19TSVpFKTsKLQlzYnVzX2ZyZWVfY29uc2lzdGVudChxcC0+cWVfc2RldiwKLQkJCSAgICAgUEFHRV9TSVpFLAotCQkJICAgICBxcC0+cWVfYmxvY2ssCi0JCQkgICAgIHFwLT5xYmxvY2tfZHZtYSk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQocXAtPnFlX3NkZXYsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCi0JCQkgICAgIHFwLT5idWZmZXJzLAotCQkJICAgICBxcC0+YnVmZmVyc19kdm1hKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHFwLT5xY3JlZ3MsIENSRUdfUkVHX1NJWkUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgcXAtPm1yZWdzLCBNUkVHU19SRUdfU0laRSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgcXAtPnFlX2Jsb2NrLCBxcC0+cWJsb2NrX2R2bWEpOworCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LCBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJICBxcC0+YnVmZmVycywgcXAtPmJ1ZmZlcnNfZHZtYSk7CiAKIAlmcmVlX25ldGRldihuZXRfZGV2KTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcWVjX3NidXNfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFlY19zYnVzX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJxZSIsCiAJfSwKQEAgLTk5MSw3ICs5ODMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBxZWNfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnFlY19zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnFlY19zYnVzX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHFlY19leGl0KHZvaWQpCkBAIC0xMDAwLDExICs5OTIsMTEgQEAKIAogCXdoaWxlIChyb290X3FlY19kZXYpIHsKIAkJc3RydWN0IHN1bnFlYyAqbmV4dCA9IHJvb3RfcWVjX2Rldi0+bmV4dF9tb2R1bGU7CisJCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gcm9vdF9xZWNfZGV2LT5vcDsKIAotCQlmcmVlX2lycShyb290X3FlY19kZXYtPnFlY19zZGV2LT5pcnFzWzBdLAotCQkJICh2b2lkICopIHJvb3RfcWVjX2Rldik7Ci0JCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKLQorCQlmcmVlX2lycShvcC0+aXJxc1swXSwgKHZvaWQgKikgcm9vdF9xZWNfZGV2KTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCByb290X3FlY19kZXYtPmdyZWdzLAorCQkJICAgR0xPQl9SRUdfU0laRSk7CiAJCWtmcmVlKHJvb3RfcWVjX2Rldik7CiAKIAkJcm9vdF9xZWNfZGV2ID0gbmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnFlLmggYi9kcml2ZXJzL25ldC9zdW5xZS5oCmluZGV4IDM0N2M4ZGQuLjU4MTNhN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bnFlLmgKKysrIGIvZHJpdmVycy9uZXQvc3VucWUuaApAQCAtMzE0LDcgKzMxNCw3IEBACiAJdm9pZCBfX2lvbWVtCQkqZ3JlZ3M7CQkvKiBRRUMgR2xvYmFsIFJlZ2lzdGVycyAgICAgICAgICovCiAJc3RydWN0IHN1bnFlCQkqcWVzWzRdOwkvKiBFYWNoIGNoaWxkIE1BQ0UgICAgICAgICAgICAgICovCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgcWVjX2J1cnN0czsJLyogU3VwcG9ydCBidXJzdCBzaXplcyAgICAgICAgICAqLwotCXN0cnVjdCBzYnVzX2RldgkJKnFlY19zZGV2OwkvKiBRRUMncyBTQlVTIGRldmljZSAgICAgICAgICAgICovCisJc3RydWN0IG9mX2RldmljZQkqb3A7CQkvKiBRRUMncyBPRiBkZXZpY2UgICAgICAgICAgICAgICovCiAJc3RydWN0IHN1bnFlYwkJKm5leHRfbW9kdWxlOwkvKiBMaXN0IG9mIGFsbCBRRUNzIGluIHN5c3RlbSAgICovCiB9OwogCkBAIC0zNDIsNyArMzQyLDcgQEAKIAlfX3UzMgkJCQlidWZmZXJzX2R2bWE7CS8qIERWTUEgdmlzaWJsZSBhZGRyZXNzLiAgICAgICAqLwogCXN0cnVjdCBzdW5xZWMJCQkqcGFyZW50OwogCXU4CQkJCW1jb25maWc7CS8qIEJhc2UgTUFDRSBtY29uZmlnIHZhbHVlICAgICAqLwotCXN0cnVjdCBzYnVzX2RldgkJCSpxZV9zZGV2OwkvKiBRRSdzIFNCVVMgZGV2aWNlIHN0cnVjdCAgICAgKi8KKwlzdHJ1Y3Qgb2ZfZGV2aWNlCQkqb3A7CQkvKiBRRSdzIE9GIGRldmljZSBzdHJ1Y3QgICAgICAgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsJCS8qIFFFJ3MgbmV0ZGV2aWNlIHN0cnVjdCAgICAgICAqLwogCWludAkJCQljaGFubmVsOwkvKiBXaG8gYW0gST8gICAgICAgICAgICAgICAgICAgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW52bmV0LmMgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKaW5kZXggNjQxNWNlMS4uYTcyMDA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHN1bnZuZXQuYzogU3VuIExET00gVmlydHVhbCBOZXR3b3JrIERyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMjYwLDcgKzEyNjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdm5ldF9wb3J0X21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgdm5ldF9wb3J0X21hdGNoW10gPSB7CiAJewogCQkudHlwZSA9ICJ2bmV0LXBvcnQiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90YzM1ODE1LmMgYi9kcml2ZXJzL25ldC90YzM1ODE1LmMKaW5kZXggODQ4N2FjZS4uZGYyMGNhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGMzNTgxNS5jCisrKyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCi0Jc3RydWN0IG1paV9idXMgbWlpX2J1czsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKIAlpbnQgZHVwbGV4OwogCWludCBzcGVlZDsKQEAgLTcwNCwxMyArNzA0LDEzIEBACiAKIAkvKiBmaW5kIHRoZSBmaXJzdCBwaHkgKi8KIAlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBQSFlfTUFYX0FERFI7IHBoeV9hZGRyKyspIHsKLQkJaWYgKGxwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdKSB7CisJCWlmIChscC0+bWlpX2J1cy0+cGh5X21hcFtwaHlfYWRkcl0pIHsKIAkJCWlmIChwaHlkZXYpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtdWx0aXBsZSBQSFlzIGZvdW5kXG4iLAogCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJcGh5ZGV2ID0gbHAtPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07CisJCQlwaHlkZXYgPSBscC0+bWlpX2J1cy0+cGh5X21hcFtwaHlfYWRkcl07CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTc2MiwyMyArNzYyLDI5IEBACiAJaW50IGVycjsKIAlpbnQgaTsKIAotCWxwLT5taWlfYnVzLm5hbWUgPSAidGMzNTgxNV9taWlfYnVzIjsKLQlscC0+bWlpX2J1cy5yZWFkID0gdGNfbWRpb19yZWFkOwotCWxwLT5taWlfYnVzLndyaXRlID0gdGNfbWRpb193cml0ZTsKLQlzbnByaW50ZihscC0+bWlpX2J1cy5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLAotCQkgKGxwLT5wY2lfZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGxwLT5wY2lfZGV2LT5kZXZmbik7Ci0JbHAtPm1paV9idXMucHJpdiA9IGRldjsKLQlscC0+bWlpX2J1cy5kZXYgPSAmbHAtPnBjaV9kZXYtPmRldjsKLQlscC0+bWlpX2J1cy5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpICogUEhZX01BWF9BRERSLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxwLT5taWlfYnVzLmlycSkgeworCWxwLT5taWlfYnVzID0gbWRpb2J1c19hbGxvYygpOworCWlmIChscC0+bWlpX2J1cyA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCi0JCWxwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCWxwLT5taWlfYnVzLT5uYW1lID0gInRjMzU4MTVfbWlpX2J1cyI7CisJbHAtPm1paV9idXMtPnJlYWQgPSB0Y19tZGlvX3JlYWQ7CisJbHAtPm1paV9idXMtPndyaXRlID0gdGNfbWRpb193cml0ZTsKKwlzbnByaW50ZihscC0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwKKwkJIChscC0+cGNpX2Rldi0+YnVzLT5udW1iZXIgPDwgOCkgfCBscC0+cGNpX2Rldi0+ZGV2Zm4pOworCWxwLT5taWlfYnVzLT5wcml2ID0gZGV2OworCWxwLT5taWlfYnVzLT5wYXJlbnQgPSAmbHAtPnBjaV9kZXYtPmRldjsKKwlscC0+bWlpX2J1cy0+aXJxID0ga21hbGxvYyhzaXplb2YoaW50KSAqIFBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscC0+bWlpX2J1cy0+aXJxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX21paV9idXM7CisJfQogCi0JZXJyID0gbWRpb2J1c19yZWdpc3RlcigmbHAtPm1paV9idXMpOworCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykKKwkJbHAtPm1paV9idXMtPmlycVtpXSA9IFBIWV9QT0xMOworCisJZXJyID0gbWRpb2J1c19yZWdpc3RlcihscC0+bWlpX2J1cyk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb19pcnE7CiAJZXJyID0gdGNfbWlpX3Byb2JlKGRldik7CkBAIC03ODcsOSArNzkzLDExIEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfdW5yZWdpc3Rlcl9idXM6Ci0JbWRpb2J1c191bnJlZ2lzdGVyKCZscC0+bWlpX2J1cyk7CisJbWRpb2J1c191bnJlZ2lzdGVyKGxwLT5taWlfYnVzKTsKIGVycl9vdXRfZnJlZV9tZGlvX2lycToKLQlrZnJlZShscC0+bWlpX2J1cy5pcnEpOworCWtmcmVlKGxwLT5taWlfYnVzLT5pcnEpOworZXJyX291dF9mcmVlX21paV9idXM6CisJbWRpb2J1c19mcmVlKGxwLT5taWlfYnVzKTsKIGVycl9vdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTk2MSw4ICs5NjksOSBAQAogCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlwaHlfZGlzY29ubmVjdChscC0+cGh5X2Rldik7Ci0JbWRpb2J1c191bnJlZ2lzdGVyKCZscC0+bWlpX2J1cyk7Ci0Ja2ZyZWUobHAtPm1paV9idXMuaXJxKTsKKwltZGlvYnVzX3VucmVnaXN0ZXIobHAtPm1paV9idXMpOworCWtmcmVlKGxwLT5taWlfYnVzLT5pcnEpOworCW1kaW9idXNfZnJlZShscC0+bWlpX2J1cyk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlmcmVlX25ldGRldihkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlaHV0aS5oIGIvZHJpdmVycy9uZXQvdGVodXRpLmgKaW5kZXggN2RiNDhmMS4uZWZhZjg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGVodXRpLmgKKysrIGIvZHJpdmVycy9uZXQvdGVodXRpLmgKQEAgLTUzOSwyMiArNTM5LDIyIEBACiAKICNkZWZpbmUgRVJSKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCwgIyMgYXJncykKICNkZWZpbmUgREJHMihmbXQsIGFyZ3MuLi4pCVwKLQlwcmludGsoS0VSTl9FUlIgICIlczolLTVkOiAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyMgYXJncykKKwlwcmludGsoS0VSTl9FUlIgICIlczolLTVkOiAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjIyBhcmdzKQogCiAjZGVmaW5lIEJEWF9BU1NFUlQoeCkgQlVHX09OKHgpCiAKICNpZmRlZiBERUJVRwogCiAjZGVmaW5lIEVOVEVSICAgICAgICAgIGRvIHsgXAotCXByaW50ayhLRVJOX0VSUiAgIiVzOiUtNWQ6IEVOVEVSXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCXByaW50ayhLRVJOX0VSUiAgIiVzOiUtNWQ6IEVOVEVSXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOyBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFJFVChhcmdzLi4uKSAgIGRvIHsgXAotCXByaW50ayhLRVJOX0VSUiAgIiVzOiUtNWQ6IFJFVFVSTlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwlwcmludGsoS0VSTl9FUlIgICIlczolLTVkOiBSRVRVUk5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7IFwKIHJldHVybiBhcmdzOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pCVwKLQlwcmludGsoS0VSTl9FUlIgICIlczolLTVkOiAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyMgYXJncykKKwlwcmludGsoS0VSTl9FUlIgICIlczolLTVkOiAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjIyBhcmdzKQogI2Vsc2UKICNkZWZpbmUgRU5URVIgICAgICAgICBkbyB7ICB9IHdoaWxlICgwKQogI2RlZmluZSBSRVQoYXJncy4uLikgICByZXR1cm4gYXJncwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCA3MWQyYzVjLi5lYjlmOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtODc2LDcgKzg3Niw3IEBACiB7CiAJdTMyIHZhbDsKIAotCWlmICh0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl0tPmludGVyZmFjZSAhPQorCWlmICh0cC0+bWRpb19idXMtPnBoeV9tYXBbUEhZX0FERFJdLT5pbnRlcmZhY2UgIT0KIAkgICAgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKQogCQlyZXR1cm47CiAKQEAgLTkyMCw5ICs5MjAsOSBAQAogc3RhdGljIHZvaWQgdGczX21kaW9fc3RhcnQoc3RydWN0IHRnMyAqdHApCiB7CiAJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfTURJT0JVU19JTklURUQpIHsKLQkJbXV0ZXhfbG9jaygmdHAtPm1kaW9fYnVzLm1kaW9fbG9jayk7CisJCW11dGV4X2xvY2soJnRwLT5tZGlvX2J1cy0+bWRpb19sb2NrKTsKIAkJdHAtPnRnM19mbGFnczMgJj0gflRHM19GTEczX01ESU9CVVNfUEFVU0VEOwotCQltdXRleF91bmxvY2soJnRwLT5tZGlvX2J1cy5tZGlvX2xvY2spOworCQltdXRleF91bmxvY2soJnRwLT5tZGlvX2J1cy0+bWRpb19sb2NrKTsKIAl9CiAKIAl0cC0+bWlfbW9kZSAmPSB+TUFDX01JX01PREVfQVVUT19QT0xMOwpAQCAtOTM2LDkgKzkzNiw5IEBACiBzdGF0aWMgdm9pZCB0ZzNfbWRpb19zdG9wKHN0cnVjdCB0ZzMgKnRwKQogewogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX01ESU9CVVNfSU5JVEVEKSB7Ci0JCW11dGV4X2xvY2soJnRwLT5tZGlvX2J1cy5tZGlvX2xvY2spOworCQltdXRleF9sb2NrKCZ0cC0+bWRpb19idXMtPm1kaW9fbG9jayk7CiAJCXRwLT50ZzNfZmxhZ3MzIHw9IFRHM19GTEczX01ESU9CVVNfUEFVU0VEOwotCQltdXRleF91bmxvY2soJnRwLT5tZGlvX2J1cy5tZGlvX2xvY2spOworCQltdXRleF91bmxvY2soJnRwLT5tZGlvX2J1cy0+bWRpb19sb2NrKTsKIAl9CiB9CiAKQEAgLTk0Nyw3ICs5NDcsNiBAQAogCWludCBpOwogCXUzMiByZWc7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKLQlzdHJ1Y3QgbWlpX2J1cyAqbWRpb19idXMgPSAmdHAtPm1kaW9fYnVzOwogCiAJdGczX21kaW9fc3RhcnQodHApOwogCkBAIC05NTUsMjEgKzk1NCwyMyBAQAogCSAgICAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19NRElPQlVTX0lOSVRFRCkpCiAJCXJldHVybiAwOwogCi0JbWVtc2V0KG1kaW9fYnVzLCAwLCBzaXplb2YoKm1kaW9fYnVzKSk7CisJdHAtPm1kaW9fYnVzID0gbWRpb2J1c19hbGxvYygpOworCWlmICh0cC0+bWRpb19idXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQltZGlvX2J1cy0+bmFtZSAgICAgPSAidGczIG1kaW8gYnVzIjsKLQlzbnByaW50ZihtZGlvX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiV4IiwKKwl0cC0+bWRpb19idXMtPm5hbWUgICAgID0gInRnMyBtZGlvIGJ1cyI7CisJc25wcmludGYodHAtPm1kaW9fYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLAogCQkgKHRwLT5wZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IHRwLT5wZGV2LT5kZXZmbik7Ci0JbWRpb19idXMtPnByaXYgICAgID0gdHA7Ci0JbWRpb19idXMtPmRldiAgICAgID0gJnRwLT5wZGV2LT5kZXY7Ci0JbWRpb19idXMtPnJlYWQgICAgID0gJnRnM19tZGlvX3JlYWQ7Ci0JbWRpb19idXMtPndyaXRlICAgID0gJnRnM19tZGlvX3dyaXRlOwotCW1kaW9fYnVzLT5yZXNldCAgICA9ICZ0ZzNfbWRpb19yZXNldDsKLQltZGlvX2J1cy0+cGh5X21hc2sgPSB+KDEgPDwgUEhZX0FERFIpOwotCW1kaW9fYnVzLT5pcnEgICAgICA9ICZ0cC0+bWRpb19pcnFbMF07CisJdHAtPm1kaW9fYnVzLT5wcml2ICAgICA9IHRwOworCXRwLT5tZGlvX2J1cy0+cGFyZW50ICAgPSAmdHAtPnBkZXYtPmRldjsKKwl0cC0+bWRpb19idXMtPnJlYWQgICAgID0gJnRnM19tZGlvX3JlYWQ7CisJdHAtPm1kaW9fYnVzLT53cml0ZSAgICA9ICZ0ZzNfbWRpb193cml0ZTsKKwl0cC0+bWRpb19idXMtPnJlc2V0ICAgID0gJnRnM19tZGlvX3Jlc2V0OworCXRwLT5tZGlvX2J1cy0+cGh5X21hc2sgPSB+KDEgPDwgUEhZX0FERFIpOworCXRwLT5tZGlvX2J1cy0+aXJxICAgICAgPSAmdHAtPm1kaW9faXJxWzBdOwogCiAJZm9yIChpID0gMDsgaSA8IFBIWV9NQVhfQUREUjsgaSsrKQotCQltZGlvX2J1cy0+aXJxW2ldID0gUEhZX1BPTEw7CisJCXRwLT5tZGlvX2J1cy0+aXJxW2ldID0gUEhZX1BPTEw7CiAKIAkvKiBUaGUgYnVzIHJlZ2lzdHJhdGlvbiB3aWxsIGxvb2sgZm9yIGFsbCB0aGUgUEhZcyBvbiB0aGUgbWRpbyBidXMuCiAJICogVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QgZW5zdXJlIHRoZSBQSFkgaXMgcG93ZXJlZCB1cCBiZWZvcmUKQEAgLTk3OSw3ICs5ODAsNyBAQAogCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZyZWcpIHx8IChyZWcgJiBCTUNSX1BET1dOKSkKIAkJdGczX2JtY3JfcmVzZXQodHApOwogCi0JaSA9IG1kaW9idXNfcmVnaXN0ZXIobWRpb19idXMpOworCWkgPSBtZGlvYnVzX3JlZ2lzdGVyKHRwLT5tZGlvX2J1cyk7CiAJaWYgKGkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1kaW9idXNfcmVnIGZhaWxlZCAoMHgleClcbiIsCiAJCQl0cC0+ZGV2LT5uYW1lLCBpKTsKQEAgLTk4OCw3ICs5ODksNyBAQAogCiAJdHAtPnRnM19mbGFnczMgfD0gVEczX0ZMRzNfTURJT0JVU19JTklURUQ7CiAKLQlwaHlkZXYgPSB0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl07CisJcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLT5waHlfbWFwW1BIWV9BRERSXTsKIAogCXN3aXRjaCAocGh5ZGV2LT5waHlfaWQpIHsKIAljYXNlIFRHM19QSFlfSURfQkNNNTA2MTA6CkBAIC0xMDE0LDcgKzEwMTUsOCBAQAogewogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX01ESU9CVVNfSU5JVEVEKSB7CiAJCXRwLT50ZzNfZmxhZ3MzICY9IH5URzNfRkxHM19NRElPQlVTX0lOSVRFRDsKLQkJbWRpb2J1c191bnJlZ2lzdGVyKCZ0cC0+bWRpb19idXMpOworCQltZGlvYnVzX3VucmVnaXN0ZXIodHAtPm1kaW9fYnVzKTsKKwkJbWRpb2J1c19mcmVlKHRwLT5tZGlvX2J1cyk7CiAJCXRwLT50ZzNfZmxhZ3MzICY9IH5URzNfRkxHM19NRElPQlVTX1BBVVNFRDsKIAl9CiB9CkBAIC0xMjIwLDcgKzEyMjIsNyBAQAogCXUzMiBvbGRfdHhfbW9kZSA9IHRwLT50eF9tb2RlOwogCiAJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfVVNFX1BIWUxJQikKLQkJYXV0b25lZyA9IHRwLT5tZGlvX2J1cy5waHlfbWFwW1BIWV9BRERSXS0+YXV0b25lZzsKKwkJYXV0b25lZyA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtQSFlfQUREUl0tPmF1dG9uZWc7CiAJZWxzZQogCQlhdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7CiAKQEAgLTEyNTcsNyArMTI1OSw3IEBACiAJdTggb2xkZmxvd2N0cmwsIGxpbmttZXNnID0gMDsKIAl1MzIgbWFjX21vZGUsIGxjbF9hZHYsIHJtdF9hZHY7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl07CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtQSFlfQUREUl07CiAKIAlzcGluX2xvY2soJnRwLT5sb2NrKTsKIApAQCAtMTMzNCw3ICsxMzM2LDcgQEAKIAkvKiBCcmluZyB0aGUgUEhZIGJhY2sgdG8gYSBrbm93biBzdGF0ZS4gKi8KIAl0ZzNfYm1jcl9yZXNldCh0cCk7CiAKLQlwaHlkZXYgPSB0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl07CisJcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLT5waHlfbWFwW1BIWV9BRERSXTsKIAogCS8qIEF0dGFjaCB0aGUgTUFDIHRvIHRoZSBQSFkuICovCiAJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QodHAtPmRldiwgcGh5ZGV2LT5kZXYuYnVzX2lkLCB0ZzNfYWRqdXN0X2xpbmssCkBAIC0xMzY3LDcgKzEzNjksNyBAQAogCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkpCiAJCXJldHVybjsKIAotCXBoeWRldiA9IHRwLT5tZGlvX2J1cy5waHlfbWFwW1BIWV9BRERSXTsKKwlwaHlkZXYgPSB0cC0+bWRpb19idXMtPnBoeV9tYXBbUEhZX0FERFJdOwogCiAJaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyKSB7CiAJCXRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID0gMDsKQEAgLTEzODcsMTMgKzEzODksMTMgQEAKIAlpZiAoISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9DT05ORUNURUQpKQogCQlyZXR1cm47CiAKLQlwaHlfc3RvcCh0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl0pOworCXBoeV9zdG9wKHRwLT5tZGlvX2J1cy0+cGh5X21hcFtQSFlfQUREUl0pOwogfQogCiBzdGF0aWMgdm9pZCB0ZzNfcGh5X2Zpbmkoc3RydWN0IHRnMyAqdHApCiB7CiAJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkgewotCQlwaHlfZGlzY29ubmVjdCh0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl0pOworCQlwaHlfZGlzY29ubmVjdCh0cC0+bWRpb19idXMtPnBoeV9tYXBbUEhZX0FERFJdKTsKIAkJdHAtPnRnM19mbGFnczMgJj0gflRHM19GTEczX1BIWV9DT05ORUNURUQ7CiAJfQogfQpAQCAtMjA0OSw3ICsyMDUxLDcgQEAKIAkJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJCQl1MzIgYWR2ZXJ0aXNpbmc7CiAKLQkJCXBoeWRldiA9IHRwLT5tZGlvX2J1cy5waHlfbWFwW1BIWV9BRERSXTsKKwkJCXBoeWRldiA9IHRwLT5tZGlvX2J1cy0+cGh5X21hcFtQSFlfQUREUl07CiAKIAkJCXRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID0gMTsKIApAQCAtMzg2MSwxMCArMzg2Myw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAotCQkJCSBwY2lfdW5tYXBfYWRkcihyaSwgbWFwcGluZyksCi0JCQkJIHNrYl9oZWFkbGVuKHNrYiksCi0JCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlza2JfZG1hX3VubWFwKCZ0cC0+cGRldi0+ZGV2LCBza2IsIERNQV9UT19ERVZJQ0UpOwogCiAJCXJpLT5za2IgPSBOVUxMOwogCkBAIC0zODc0LDEyICszODczLDYgQEAKIAkJCXJpID0gJnRwLT50eF9idWZmZXJzW3N3X2lkeF07CiAJCQlpZiAodW5saWtlbHkocmktPnNrYiAhPSBOVUxMIHx8IHN3X2lkeCA9PSBod19pZHgpKQogCQkJCXR4X2J1ZyA9IDE7Ci0KLQkJCXBjaV91bm1hcF9wYWdlKHRwLT5wZGV2LAotCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyaSwgbWFwcGluZyksCi0JCQkJICAgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSwKLQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0KIAkJCXN3X2lkeCA9IE5FWFRfVFgoc3dfaWR4KTsKIAkJfQogCkBAIC00NjMzLDEyICs0NjI2LDE2IEBACiAJfSBlbHNlIHsKIAkJLyogTmV3IFNLQiBpcyBndWFyYW50ZWVkIHRvIGJlIGxpbmVhci4gKi8KIAkJZW50cnkgPSAqc3RhcnQ7Ci0JCW5ld19hZGRyID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIG5ld19za2ItPmRhdGEsIG5ld19za2ItPmxlbiwKLQkJCQkJICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcmV0ID0gc2tiX2RtYV9tYXAoJnRwLT5wZGV2LT5kZXYsIG5ld19za2IsIERNQV9UT19ERVZJQ0UpOworCQluZXdfYWRkciA9IHNrYl9zaGluZm8obmV3X3NrYiktPmRtYV9tYXBzWzBdOworCiAJCS8qIE1ha2Ugc3VyZSBuZXcgc2tiIGRvZXMgbm90IGNyb3NzIGFueSA0RyBib3VuZGFyaWVzLgogCQkgKiBEcm9wIHRoZSBwYWNrZXQgaWYgaXQgZG9lcy4KIAkJICovCi0JCWlmICh0ZzNfNGdfb3ZlcmZsb3dfdGVzdChuZXdfYWRkciwgbmV3X3NrYi0+bGVuKSkgeworCQlpZiAocmV0IHx8IHRnM180Z19vdmVyZmxvd190ZXN0KG5ld19hZGRyLCBuZXdfc2tiLT5sZW4pKSB7CisJCQlpZiAoIXJldCkKKwkJCQlza2JfZG1hX3VubWFwKCZ0cC0+cGRldi0+ZGV2LCBuZXdfc2tiLAorCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKIAkJCXJldCA9IC0xOwogCQkJZGV2X2tmcmVlX3NrYihuZXdfc2tiKTsKIAkJCW5ld19za2IgPSBOVUxMOwpAQCAtNDY1MiwxOCArNDY0OSw4IEBACiAJLyogTm93IGNsZWFuIHVwIHRoZSBzdyByaW5nIGVudHJpZXMuICovCiAJaSA9IDA7CiAJd2hpbGUgKGVudHJ5ICE9IGxhc3RfcGx1c19vbmUpIHsKLQkJaW50IGxlbjsKLQotCQlpZiAoaSA9PSAwKQotCQkJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKLQkJZWxzZQotCQkJbGVuID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpLTFdLnNpemU7Ci0JCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCi0JCQkJIHBjaV91bm1hcF9hZGRyKCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcpLAotCQkJCSBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQlpZiAoaSA9PSAwKSB7CiAJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gbmV3X3NrYjsKLQkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBuZXdfYWRkcik7CiAJCX0gZWxzZSB7CiAJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKIAkJfQpAQCAtNDY3MSw2ICs0NjU4LDcgQEAKIAkJaSsrOwogCX0KIAorCXNrYl9kbWFfdW5tYXAoJnRwLT5wZGV2LT5kZXYsIHNrYiwgRE1BX1RPX0RFVklDRSk7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJcmV0dXJuIHJldDsKQEAgLTQ3MDUsOCArNDY5Myw5IEBACiBzdGF0aWMgaW50IHRnM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWRtYV9hZGRyX3QgbWFwcGluZzsKIAl1MzIgbGVuLCBlbnRyeSwgYmFzZV9mbGFncywgbXNzOworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNwOworCWRtYV9hZGRyX3QgbWFwcGluZzsKIAogCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAKQEAgLTQ3NjUsMTEgKzQ3NTQsMTYgQEAKIAkJCSAgICAgICAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgMTYpKTsKICNlbmRpZgogCi0JLyogUXVldWUgc2tiIGRhdGEsIGEuay5hLiB0aGUgbWFpbiBza2IgZnJhZ21lbnQuICovCi0JbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHNrYl9kbWFfbWFwKCZ0cC0+cGRldi0+ZGV2LCBza2IsIERNQV9UT19ERVZJQ0UpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXNwID0gc2tiX3NoaW5mbyhza2IpOworCisJbWFwcGluZyA9IHNwLT5kbWFfbWFwc1swXTsKIAogCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7Ci0JcGNpX3VubWFwX2FkZHJfc2V0KCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcsIG1hcHBpbmcpOwogCiAJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sIGJhc2VfZmxhZ3MsCiAJCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB8IChtc3MgPDwgMSkpOwpAQCAtNDc4NSwxMyArNDc3OSw4IEBACiAJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAKIAkJCWxlbiA9IGZyYWctPnNpemU7Ci0JCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKHRwLT5wZGV2LAotCQkJCQkgICAgICAgZnJhZy0+cGFnZSwKLQkJCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJCQkgICAgICAgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQorCQkJbWFwcGluZyA9IHNwLT5kbWFfbWFwc1tpICsgMV07CiAJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKLQkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKIAogCQkJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sCiAJCQkJICAgIGJhc2VfZmxhZ3MsIChpID09IGxhc3QpIHwgKG1zcyA8PCAxKSk7CkBAIC00ODU5LDkgKzQ4NDgsMTAgQEAKIHN0YXRpYyBpbnQgdGczX3N0YXJ0X3htaXRfZG1hX2J1ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlkbWFfYWRkcl90IG1hcHBpbmc7CiAJdTMyIGxlbiwgZW50cnksIGJhc2VfZmxhZ3MsIG1zczsKKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzcDsKIAlpbnQgd291bGRfaGl0X2h3YnVnOworCWRtYV9hZGRyX3QgbWFwcGluZzsKIAogCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAKQEAgLTQ5NDIsMTEgKzQ5MzIsMTYgQEAKIAkJCSAgICAgICAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgMTYpKTsKICNlbmRpZgogCi0JLyogUXVldWUgc2tiIGRhdGEsIGEuay5hLiB0aGUgbWFpbiBza2IgZnJhZ21lbnQuICovCi0JbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHNrYl9kbWFfbWFwKCZ0cC0+cGRldi0+ZGV2LCBza2IsIERNQV9UT19ERVZJQ0UpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXNwID0gc2tiX3NoaW5mbyhza2IpOworCisJbWFwcGluZyA9IHNwLT5kbWFfbWFwc1swXTsKIAogCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7Ci0JcGNpX3VubWFwX2FkZHJfc2V0KCZ0cC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcsIG1hcHBpbmcpOwogCiAJd291bGRfaGl0X2h3YnVnID0gMDsKIApAQCAtNDk2OSwxMyArNDk2NCw5IEBACiAJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAKIAkJCWxlbiA9IGZyYWctPnNpemU7Ci0JCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKHRwLT5wZGV2LAotCQkJCQkgICAgICAgZnJhZy0+cGFnZSwKLQkJCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LAotCQkJCQkgICAgICAgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW1hcHBpbmcgPSBzcC0+ZG1hX21hcHNbaSArIDFdOwogCiAJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKLQkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKIAogCQkJaWYgKHRnM180Z19vdmVyZmxvd190ZXN0KG1hcHBpbmcsIGxlbikpCiAJCQkJd291bGRfaGl0X2h3YnVnID0gMTsKQEAgLTUxMjgsNyArNTExOSw2IEBACiAJZm9yIChpID0gMDsgaSA8IFRHM19UWF9SSU5HX1NJWkU7ICkgewogCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICp0eHA7CiAJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCWludCBqOwogCiAJCXR4cCA9ICZ0cC0+dHhfYnVmZmVyc1tpXTsKIAkJc2tiID0gdHhwLT5za2I7CkBAIC01MTM4LDIyICs1MTI4LDExIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCi0JCQkJIHBjaV91bm1hcF9hZGRyKHR4cCwgbWFwcGluZyksCi0JCQkJIHNrYl9oZWFkbGVuKHNrYiksCi0JCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlza2JfZG1hX3VubWFwKCZ0cC0+cGRldi0+ZGV2LCBza2IsIERNQV9UT19ERVZJQ0UpOworCiAJCXR4cC0+c2tiID0gTlVMTDsKIAotCQlpKys7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGorKykgewotCQkJdHhwID0gJnRwLT50eF9idWZmZXJzW2kgJiAoVEczX1RYX1JJTkdfU0laRSAtIDEpXTsKLQkJCXBjaV91bm1hcF9wYWdlKHRwLT5wZGV2LAotCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcih0eHAsIG1hcHBpbmcpLAotCQkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2pdLnNpemUsCi0JCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJaSsrOwotCQl9CisJCWkgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDE7CiAKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CkBAIC04OTc3LDcgKzg5NTYsNyBAQAogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1VTRV9QSFlMSUIpIHsKIAkJaWYgKCEodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19QSFlfQ09OTkVDVEVEKSkKIAkJCXJldHVybiAtRUFHQUlOOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldCh0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl0sIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHRwLT5tZGlvX2J1cy0+cGh5X21hcFtQSFlfQUREUl0sIGNtZCk7CiAJfQogCiAJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOwpAQCAtOTAxOCw3ICs4OTk3LDcgQEAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7CiAJCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQodHAtPm1kaW9fYnVzLnBoeV9tYXBbUEhZX0FERFJdLCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldCh0cC0+bWRpb19idXMtPnBoeV9tYXBbUEhZX0FERFJdLCBjbWQpOwogCX0KIAogCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FOWV9TRVJERVMpIHsKQEAgLTkxNjYsNyArOTE0NSw3IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfVVNFX1BIWUxJQikgewogCQlpZiAoISh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1BIWV9DT05ORUNURUQpKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0JCXIgPSBwaHlfc3RhcnRfYW5lZyh0cC0+bWRpb19idXMucGh5X21hcFtQSFlfQUREUl0pOworCQlyID0gcGh5X3N0YXJ0X2FuZWcodHAtPm1kaW9fYnVzLT5waHlfbWFwW1BIWV9BRERSXSk7CiAJfSBlbHNlIHsKIAkJdTMyIGJtY3I7CiAKQEAgLTkyODMsNyArOTI2Miw3IEBACiAJCQl1MzIgbmV3YWR2OwogCQkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAotCQkJcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLnBoeV9tYXBbUEhZX0FERFJdOworCQkJcGh5ZGV2ID0gdHAtPm1kaW9fYnVzLT5waHlfbWFwW1BIWV9BRERSXTsKIAogCQkJaWYgKGVwYXVzZS0+cnhfcGF1c2UpIHsKIAkJCQlpZiAoZXBhdXNlLT50eF9wYXVzZSkKQEAgLTEwMjY1LDcgKzEwMjQ0LDcgQEAKIAlpZiAodHAtPnRnM19mbGFnczMgJiBURzNfRkxHM19VU0VfUEhZTElCKSB7CiAJCWlmICghKHRwLT50ZzNfZmxhZ3MzICYgVEczX0ZMRzNfUEhZX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwodHAtPm1kaW9fYnVzLnBoeV9tYXBbUEhZX0FERFJdLCBkYXRhLCBjbWQpOworCQlyZXR1cm4gcGh5X21paV9pb2N0bCh0cC0+bWRpb19idXMtPnBoeV9tYXBbUEhZX0FERFJdLCBkYXRhLCBjbWQpOwogCX0KIAogCXN3aXRjaChjbWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5oIGIvZHJpdmVycy9uZXQvdGczLmgKaW5kZXggZjViOGNhYi4uYmUyNTJhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmgKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTIxOTcsNyArMjE5Nyw2IEBACiAKIHN0cnVjdCB0eF9yaW5nX2luZm8gewogCXN0cnVjdCBza19idWZmCQkJKnNrYjsKLQlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCiAJdTMyCQkJCXByZXZfdmxhbl90YWc7CiB9OwogCkBAIC0yNTU3LDcgKzI1NTYsNyBAQAogCWludAkJCQltc2lfY2FwOwogCWludAkJCQlwY2l4X2NhcDsKIAotCXN0cnVjdCBtaWlfYnVzCQkJbWRpb19idXM7CisJc3RydWN0IG1paV9idXMJCQkqbWRpb19idXM7CiAJaW50CQkJCW1kaW9faXJxW1BIWV9NQVhfQUREUl07CiAKIAkvKiBQSFkgaW5mbyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGxhbi5jIGIvZHJpdmVycy9uZXQvdGxhbi5jCmluZGV4IGVjODcxZjYuLmM0MWQ2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RsYW4uYworKysgYi9kcml2ZXJzL25ldC90bGFuLmMKQEAgLTI5LDcgKzI5LDggQEAKICAqCiAgKglUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPjoJVExhbl9QY2lQcm9iZSgpIG5vdyB1c2VzCiAgKgkJCQkJCW5ldyBQQ0kgQklPUyBpbnRlcmZhY2UuCi0gKglBbGFuIENveAk8YWxhbkByZWRoYXQuY29tPjoJRml4ZWQgdGhlIG91dCBvZiBtZW1vcnkKKyAqCUFsYW4gQ294CTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+OgorICoJCQkJCQlGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQogICoJCQkJCQloYW5kbGluZy4KICAqCiAgKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBmYTczZTZlLi5lZDUwZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMjUsNyArMjUsNyBAQAogICogIFRvIGRvOgogICogICAgMS4gTXVsdGljYXN0IHN1cHBvcnQuCiAgKgotICogIEluaXRpYWwgMi41IGNsZWFudXAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gIDIwMDIvMTAvMjgKKyAqICBJbml0aWFsIDIuNSBjbGVhbnVwIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+ICAyMDAyLzEwLzI4CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCmluZGV4IDQzZmRlOTkuLmViMWRhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguYworKysgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQkJcmV0dXJuOwogCQl1ZGVsYXkoMTApOwogCX0KLQlwcmludGsoS0VSTl9FUlIgIiVzIGZ1bmN0aW9uIHRpbWUgb3V0IFxuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzIGZ1bmN0aW9uIHRpbWUgb3V0IFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgaW50IG1paV9zcGVlZChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKQEAgLTEwNTksNyArMTA1OSw3IEBACiAJCQlyZXR1cm47CiAJCXVkZWxheSgxMCk7CiAJfQotCXByaW50ayhLRVJOX0VSUiAiJXMgZnVuY3Rpb24gdGltZSBvdXQgXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50ayhLRVJOX0VSUiAiJXMgZnVuY3Rpb24gdGltZSBvdXQgXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIHRzaTEwOF9yZXNldF9ldGhlcihzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICogZGF0YSkKQEAgLTEyNDQsNyArMTI0NCw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCWlmIChpID09IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXMgZnVuY3Rpb24gdGltZSBvdXQgXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9FUlIgIiVzIGZ1bmN0aW9uIHRpbWUgb3V0IFxuIiwgX19mdW5jX18pOwogCiAJaWYgKGRhdGEtPnBoeV90eXBlID09IFRTSTEwOF9QSFlfQkNNNTRYWCkgewogCQl0c2kxMDhfd3JpdGVfbWlpKGRhdGEsIDB4MDksIDB4MDMwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggOTI4MWQwNi4uMTI0ZDVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtMTQxOCw3ICsxNDE4LDYgQEAKIAogCWRlX2ZyZWVfcmluZ3MoZGUpOwogCWRlX2FkYXB0ZXJfc2xlZXAoZGUpOwotCXBjaV9kaXNhYmxlX2RldmljZShkZS0+cGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2ODksNiArMTY4OCw3IEBACiAJdW5zaWduZWQgaTsKIAogCWR3MzIgKFJPTUNtZCwgMCk7CS8qIFJlc2V0IHRoZSBwb2ludGVyIHdpdGggYSBkdW1teSB3cml0ZS4gKi8KKwl1ZGVsYXkoNSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWludCB2YWx1ZSwgYm9ndXNjbnQgPSAxMDAwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwppbmRleCA2MTdlZjQxLi42NDQ0Y2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKQEAgLTgzMiw3ICs4MzIsNyBAQAogCXMzMiBjc3IxNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIFNJQSBUWC9SWCBSZWdpc3RlciAgICAgKi8KIAlzMzIgY3NyMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBTSUEgR2VuZXJhbCBSZWdpc3RlciAgICovCiAJaW50IHNhdmVfY250OyAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBpZiBzdGF0ZSBhbHJlYWR5IHNhdmVkICAqLwotCXN0cnVjdCBza19idWZmICpza2I7ICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIChyZS1vcmRlcmVkKSBza2IncyAgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOyAgICAgICAgICAvKiBTYXZlIHRoZSAocmUtb3JkZXJlZCkgc2tiJ3MgICovCiAgICAgfSBjYWNoZTsKICAgICBzdHJ1Y3QgZGU0eDVfc3JvbSBzcm9tOyAgICAgICAgICAgICAgICAgLyogQSBjb3B5IG9mIHRoZSBTUk9NICAgICAgICAgICAqLwogICAgIGludCBjZnJ2OwkJCQkgICAgLyogQ2FyZCBDRlJWIGNvcHkgKi8KQEAgLTExMjgsNiArMTEyOCw3IEBACiAJcHJpbnRrKCIgICAgICB3aGljaCBoYXMgYW4gRXRoZXJuZXQgUFJPTSBDUkMgZXJyb3IuXG4iKTsKIAlyZXR1cm4gLUVOWElPOwogICAgIH0gZWxzZSB7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbHAtPmNhY2hlLnF1ZXVlKTsKIAlscC0+Y2FjaGUuZ2VwYyA9IEdFUF9JTklUOwogCWxwLT5hc0JpdCA9IEdFUF9TTE5LOwogCWxwLT5hc1BvbGFyaXR5ID0gR0VQX1NMTks7CkBAIC0xNDg3LDcgKzE0ODgsNyBAQAogCX0KICAgICB9IGVsc2UgaWYgKHNrYi0+bGVuID4gMCkgewogCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBzdHVmZiBxdWV1ZWQgbG9jYWxseSwgdXNlIHRoYXQgZmlyc3QgKi8KLQlpZiAobHAtPmNhY2hlLnNrYiAmJiAhbHAtPmludGVycnVwdCkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZscC0+Y2FjaGUucXVldWUpICYmICFscC0+aW50ZXJydXB0KSB7CiAJICAgIGRlNHg1X3B1dF9jYWNoZShkZXYsIHNrYik7CiAJICAgIHNrYiA9IGRlNHg1X2dldF9jYWNoZShkZXYpOwogCX0KQEAgLTE1ODAsNyArMTU4MSw3IEBACiAKICAgICAvKiBMb2FkIHRoZSBUWCByaW5nIHdpdGggYW55IGxvY2FsbHkgc3RvcmVkIHBhY2tldHMgKi8KICAgICBpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmbHAtPmNhY2hlLmxvY2spKSB7Ci0Jd2hpbGUgKGxwLT5jYWNoZS5za2IgJiYgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiBscC0+dHhfZW5hYmxlKSB7CisJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJmxwLT5jYWNoZS5xdWV1ZSkgJiYgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiBscC0+dHhfZW5hYmxlKSB7CiAJICAgIGRlNHg1X3F1ZXVlX3BrdChkZTR4NV9nZXRfY2FjaGUoZGV2KSwgZGV2KTsKIAl9CiAJbHAtPmNhY2hlLmxvY2sgPSAwOwpAQCAtMzY3OSwxMSArMzY4MCw3IEBACiAgICAgfQogCiAgICAgLyogVW5sb2FkIHRoZSBsb2NhbGx5IHF1ZXVlZCBwYWNrZXRzICovCi0gICAgd2hpbGUgKGxwLT5jYWNoZS5za2IpIHsKLQlkZXZfa2ZyZWVfc2tiKGRlNHg1X2dldF9jYWNoZShkZXYpKTsKLSAgICB9Ci0KLSAgICByZXR1cm47CisgICAgX19za2JfcXVldWVfcHVyZ2UoJmxwLT5jYWNoZS5xdWV1ZSk7CiB9CiAKIC8qCkBAIC0zNzgxLDQzICszNzc4LDI0IEBACiBkZTR4NV9wdXRfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKICAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHN0cnVjdCBza19idWZmICpwOwogCi0gICAgaWYgKGxwLT5jYWNoZS5za2IpIHsKLQlmb3IgKHA9bHAtPmNhY2hlLnNrYjsgcC0+bmV4dDsgcD1wLT5uZXh0KTsKLQlwLT5uZXh0ID0gc2tiOwotICAgIH0gZWxzZSB7Ci0JbHAtPmNhY2hlLnNrYiA9IHNrYjsKLSAgICB9Ci0gICAgc2tiLT5uZXh0ID0gTlVMTDsKLQotICAgIHJldHVybjsKKyAgICBfX3NrYl9xdWV1ZV90YWlsKCZscC0+Y2FjaGUucXVldWUsIHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZTR4NV9wdXRiX2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCA9IGxwLT5jYWNoZS5za2I7CiAKLSAgICBscC0+Y2FjaGUuc2tiID0gc2tiOwotICAgIHNrYi0+bmV4dCA9IHA7Ci0KLSAgICByZXR1cm47CisgICAgX19za2JfcXVldWVfaGVhZCgmbHAtPmNhY2hlLnF1ZXVlLCBza2IpOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogZGU0eDVfZ2V0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCA9IGxwLT5jYWNoZS5za2I7CiAKLSAgICBpZiAocCkgewotCWxwLT5jYWNoZS5za2IgPSBwLT5uZXh0OwotCXAtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBwOworICAgIHJldHVybiBfX3NrYl9kZXF1ZXVlKCZscC0+Y2FjaGUucXVldWUpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IDY1NjIwMDQuLjhlNDZhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAgICBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4gOgogICAgIE1hZGUgaXQgY29tcGlsZSBpbiAyLjMgKGRldmljZSB0byBuZXRfZGV2aWNlKQogCi0gICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gOgorICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+IDoKICAgICBDbGVhbmVkIHVwIGZvciBrZXJuZWwgbWVyZ2UuCiAgICAgUmVtb3ZlZCB0aGUgYmFjayBjb21wYXRpYmlsaXR5IHN1cHBvcnQKICAgICBSZWZvcm1hdHRlZCwgZml4aW5nIHNwZWxsaW5nIGV0YyBhcyBJIHdlbnQKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICBzdXBwb3J0LiAgVXBkYXRlZCBQQ0kgcmVzb3VyY2UgYWxsb2NhdGlvbi4gIERvIG5vdAogICAgIGZvcmdldCB0byB1bm1hcCBQQ0kgbWFwcGVkIHNrYnMuCiAKLSAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgICAgQWRkZWQgbmV3IFBDSSBpZGVudGlmaWVycyBwcm92aWRlZCBieSBDbGVhciBaaGFuZyBhdCBBTGkKICAgICBmb3IgdGhlaXIgMTU2MyBldGhlcm5ldCBkZXZpY2UuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IDhmOTQ0ZTUuLmM4Nzc0N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtNDAwLDcgKzQwMCw3IEBACiAJZW5ldF9hZGRyX2NvbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciksIEdGUF9LRVJORUwpOwogCWlmICghZW5ldF9hZGRyX2NvbnQpIHsKIAkJdWdldGhfZXJyKCIlczogTm8gbWVtb3J5IGZvciBlbmV0X2FkZHJfY29udGFpbmVyIG9iamVjdC4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQkJICBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNDI3LDcgKzQyNyw3IEBACiAJc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqcF84Mnh4X2FkZHJfZmlsdDsKIAogCWlmICghKHBhZGRyX251bSA8IE5VTV9PRl9QQUREUlMpKSB7Ci0JCXVnZXRoX3dhcm4oIiVzOiBJbGxlZ2FsIHBhZGRyX251bS4iLCBfX0ZVTkNUSU9OX18pOworCQl1Z2V0aF93YXJuKCIlczogSWxsZWdhbCBwYWRkcl9udW0uIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gX19pb21lbSAqcF84Mnh4X2FkZHJfZmlsdDsKIAogCWlmICghKHBhZGRyX251bSA8IE5VTV9PRl9QQUREUlMpKSB7Ci0JCXVnZXRoX3dhcm4oIiVzOiBJbGxhZ2VsIHBhZGRyX251bS4iLCBfX0ZVTkNUSU9OX18pOworCQl1Z2V0aF93YXJuKCIlczogSWxsYWdlbCBwYWRkcl9udW0uIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0NDEsNyArMTQ0MSw3IEBACiAJdTMyIHVwc21yLCBtYWNjZmcyLCB0YmlCYXNlQWRkcmVzczsKIAl1MTYgdmFsdWU7CiAKLQl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOworCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fZnVuY19fKTsKIAogCXVnX2luZm8gPSB1Z2V0aC0+dWdfaW5mbzsKIAl1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CkBAIC0xNTA0LDcgKzE1MDQsNyBAQAogCWlmIChyZXRfdmFsICE9IDApIHsKIAkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIoIiVzOiBQcmVhbWJsZSBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDMgYW5kIDcgaW5jbHVzaXZlLiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC0xNzQ0LDcgKzE3NDQsNyBAQAogCS8qIGNoZWNrIGlmIHRoZSBVQ0MgbnVtYmVyIGlzIGluIHJhbmdlLiAqLwogCWlmICh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtID49IFVDQ19NQVhfTlVNKSB7CiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQotCQkJdWdldGhfZXJyKCIlczogdWNjX251bSBvdXQgb2YgcmFuZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJCXVnZXRoX2VycigiJXM6IHVjY19udW0gb3V0IG9mIHJhbmdlLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzczLDcgKzE3NzMsNyBAQAogCS8qIGNoZWNrIGlmIHRoZSBVQ0MgbnVtYmVyIGlzIGluIHJhbmdlLiAqLwogCWlmICh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtID49IFVDQ19NQVhfTlVNKSB7CiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQotCQkJdWdldGhfZXJyKCIlczogdWNjX251bSBvdXQgb2YgcmFuZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJCXVnZXRoX2VycigiJXM6IHVjY19udW0gb3V0IG9mIHJhbmdlLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMDYyLDcgKzIwNjIsNyBAQAogCQl1Z2V0aF93YXJuCiAJCSAgICAoIiVzOiBtdWx0aWNhc3QgYWRkcmVzcyBhZGRlZCB0byBwYWRkciB3aWxsIGhhdmUgbm8gIgogCQkgICAgICJlZmZlY3QgLSBpcyB0aGlzIHdoYXQgeW91IHdhbnRlZD8iLAotCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCSAgICAgX19mdW5jX18pOwogCiAJdWdldGgtPmluZEFkZHJSZWdVc2VkW3BhZGRyX251bV0gPSAxOwkvKiBtYXJrIHRoaXMgcGFkZHIgYXMgdXNlZCAqLwogCS8qIHN0b3JlIGFkZHJlc3MgaW4gb3VyIGRhdGFiYXNlICovCkBAIC0yMjc4LDcgKzIyNzgsNyBAQAogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB1Z2V0aC0+cGh5ZGV2OwogCXUzMiB0ZW1wdmFsOwogCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBEaXNhYmxlIHRoZSBjb250cm9sbGVyICovCiAJdWdldGhfZGlzYWJsZSh1Z2V0aCwgQ09NTV9ESVJfUlhfQU5EX1RYKTsKQEAgLTIzMTUsNyArMjMxNSw3IEBACiAJICAgICAgKHVmX2luZm8tPmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX01VUkFNKSkpIHsKIAkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbWVtb3J5IHBhcnRpdGlvbiB2YWx1ZS4iLAotCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMyNyw3ICsyMzI3LDcgQEAKIAkJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQogCQkJCXVnZXRoX2VycgogCQkJCSAgICAoIiVzOiBSeCBCRCByaW5nIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDQsIG5vIHNtYWxsZXIgdGhhbiA4LiIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJCV9fZnVuY19fKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjMzOCw3ICsyMzM4LDcgQEAKIAkJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQogCQkJCXVnZXRoX2VycgogCQkJCSAgICAoIiVzOiBUeCBCRCByaW5nIGxlbmd0aCBtdXN0IGJlIG5vIHNtYWxsZXIgdGhhbiAyLiIsCi0JCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJCSAgICAgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMzQ5LDIxICsyMzQ5LDIxIEBACiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQogCQkJdWdldGhfZXJyCiAJCQkgICAgKCIlczogbWF4X3J4X2J1Zl9sZW5ndGggbXVzdCBiZSBub24temVybyBtdWx0aXBsZSBvZiAxMjguIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBudW0gVHggcXVldWVzICovCiAJaWYgKHVnX2luZm8tPm51bVF1ZXVlc1R4ID4gTlVNX1RYX1FVRVVFUykgewogCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKLQkJCXVnZXRoX2VycigiJXM6IG51bWJlciBvZiB0eCBxdWV1ZXMgdG9vIGxhcmdlLiIsIF9fRlVOQ1RJT05fXyk7CisJCQl1Z2V0aF9lcnIoIiVzOiBudW1iZXIgb2YgdHggcXVldWVzIHRvbyBsYXJnZS4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIG51bSBSeCBxdWV1ZXMgKi8KIAlpZiAodWdfaW5mby0+bnVtUXVldWVzUnggPiBOVU1fUlhfUVVFVUVTKSB7CiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQotCQkJdWdldGhfZXJyKCIlczogbnVtYmVyIG9mIHJ4IHF1ZXVlcyB0b28gbGFyZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJCXVnZXRoX2VycigiJXM6IG51bWJlciBvZiByeCBxdWV1ZXMgdG9vIGxhcmdlLiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMzc0LDcgKzIzNzQsNyBAQAogCQkJCXVnZXRoX2VycgogCQkJCSAgICAoIiVzOiBWTEFOIHByaW9yaXR5IHRhYmxlIGVudHJ5IG11c3Qgbm90IGJlIgogCQkJCQkiIGxhcmdlciB0aGFuIG51bWJlciBvZiBSeCBxdWV1ZXMuIiwKLQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgICBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTIzODYsNyArMjM4Niw3IEBACiAJCQkJdWdldGhfZXJyCiAJCQkJICAgICgiJXM6IElQIHByaW9yaXR5IHRhYmxlIGVudHJ5IG11c3Qgbm90IGJlIgogCQkJCQkiIGxhcmdlciB0aGFuIG51bWJlciBvZiBSeCBxdWV1ZXMuIiwKLQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgICBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTIzOTQsNyArMjM5NCw3IEBACiAJaWYgKHVnX2luZm8tPmNhbSAmJiAhdWdfaW5mby0+ZWNhbXB0cikgewogCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IElmIGNhbSBtb2RlIGlzIGNob3NlbiwgbXVzdCBzdXBwbHkgY2FtIHB0ci4iLAotCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCQkgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDA0LDcgKzI0MDQsNyBAQAogCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IE51bWJlciBvZiBzdGF0aW9uIGFkZHJlc3NlcyBncmVhdGVyIHRoYW4gMSAiCiAJCQkJICAibm90IGFsbG93ZWQgaW4gZXh0ZW5kZWQgcGFyc2luZyBtb2RlLiIsCi0JCQkJICBfX0ZVTkNUSU9OX18pOworCQkJCSAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0MTgsNyArMjQxOCw3IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhbCBmYXN0IFVDQyBibG9jay4gKi8KIAlpZiAodWNjX2Zhc3RfaW5pdCh1Zl9pbmZvLCAmdWdldGgtPnVjY2YpKSB7CiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQotCQkJdWdldGhfZXJyKCIlczogRmFpbGVkIHRvIGluaXQgdWNjZi4iLCBfX0ZVTkNUSU9OX18pOworCQkJdWdldGhfZXJyKCIlczogRmFpbGVkIHRvIGluaXQgdWNjZi4iLCBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjQ0OCw3ICsyNDQ4LDcgQEAKIAl1OCBfX2lvbWVtICplbmRPZlJpbmc7CiAJdTggbnVtVGhyZWFkc1J4TnVtZXJpY2FsLCBudW1UaHJlYWRzVHhOdW1lcmljYWw7CiAKLQl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOworCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fZnVuY19fKTsKIAl1Y2NmID0gdWdldGgtPnVjY2Y7CiAJdWdfaW5mbyA9IHVnZXRoLT51Z19pbmZvOwogCXVmX2luZm8gPSAmdWdfaW5mby0+dWZfaW5mbzsKQEAgLTI0NzQsNyArMjQ3NCw3IEBACiAJZGVmYXVsdDoKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IEJhZCBudW1iZXIgb2YgUnggdGhyZWFkcyB2YWx1ZS4iLAotCQkJCSAgICAgICAJX19GVU5DVElPTl9fKTsKKwkJCQkgICAgICAgCV9fZnVuY19fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0yNDk5LDcgKzI0OTksNyBAQAogCWRlZmF1bHQ6CiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbnVtYmVyIG9mIFR4IHRocmVhZHMgdmFsdWUuIiwKLQkJCQkgICAgICAgCV9fRlVOQ1RJT05fXyk7CisJCQkJICAgICAgIAlfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMjU1Myw3ICsyNTUzLDcgQEAKIAlpZiAocmV0X3ZhbCAhPSAwKSB7CiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIoIiVzOiBJUEdJRkcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvbyBsYXJnZS4iLAotCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCQkgIF9fZnVuY19fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CkBAIC0yNTcxLDcgKzI1NzEsNyBAQAogCWlmIChyZXRfdmFsICE9IDApIHsKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IEhhbGYgRHVwbGV4IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0b28gbGFyZ2UuIiwKLQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCSAgX19mdW5jX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiByZXRfdmFsOwogCX0KQEAgLTI2MjYsNyArMjYyNiw3IEBACiAJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJCXVnZXRoX2VycgogCQkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgVHggYmQgcmluZ3MuIiwKLQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgICBfX2Z1bmNfXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjY2Miw3ICsyNjYyLDcgQEAKIAkJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQkJdWdldGhfZXJyCiAJCQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBSeCBiZCByaW5ncy4iLAotCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCQkgICAgIF9fZnVuY19fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0yNjc4LDcgKzI2NzgsNyBAQAogCQlpZiAodWdldGgtPnR4X3NrYnVmZltqXSA9PSBOVUxMKSB7CiAJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJCXVnZXRoX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSB0eF9za2J1ZmYiLAotCQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQkJCSAgX19mdW5jX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI3MTAsNyArMjcxMCw3IEBACiAJCWlmICh1Z2V0aC0+cnhfc2tidWZmW2pdID09IE5VTEwpIHsKIAkJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQkJdWdldGhfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIHJ4X3NrYnVmZiIsCi0JCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCQkJICBfX2Z1bmNfXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjc0NCw3ICsyNzQ0LDcgQEAKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycgogCQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciBwX3R4X2dsYmxfcHJhbS4iLAotCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJICAgICBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjc2Nyw3ICsyNzY3LDcgQEAKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycgogCQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciBwX3RocmVhZF9kYXRhX3R4LiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgIF9fZnVuY19fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzk3LDcgKzI3OTcsNyBAQAogCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJdWdldGhfZXJyCiAJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfc2VuZF9xX21lbV9yZWcuIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICAgX19mdW5jX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI4NDEsNyArMjg0MSw3IEBACiAJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJCXVnZXRoX2VycgogCQkJCSAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9zY2hlZHVsZXIuIiwKLQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgICBfX2Z1bmNfXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjg5Miw3ICsyODkyLDcgQEAKIAkJCQl1Z2V0aF9lcnIKIAkJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgogCQkJCQkiIHBfdHhfZndfc3RhdGlzdGljc19wcmFtLiIsCi0JCQkJICAgICAgIAlfX0ZVTkNUSU9OX18pOworCQkJCSAgICAgICAJX19mdW5jX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI5MzIsNyArMjkzMiw3IEBACiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIKIAkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9yeF9nbGJsX3ByYW0uIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICAgX19mdW5jX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI5NTQsNyArMjk1NCw3IEBACiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIKIAkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF90aHJlYWRfZGF0YV9yeC4iLAotCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJICAgICBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjk3OCw3ICsyOTc4LDcgQEAKIAkJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQkJdWdldGhfZXJyCiAJCQkJCSgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciIKLQkJCQkJIiBwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbS4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQkiIHBfcnhfZndfc3RhdGlzdGljc19wcmFtLiIsIF9fZnVuY19fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0zMDAxLDcgKzMwMDEsNyBAQAogCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJdWdldGhfZXJyCiAJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgotCQkJCSIgcF9yeF9pcnFfY29hbGVzY2luZ190YmwuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkiIHBfcnhfaXJxX2NvYWxlc2NpbmdfdGJsLiIsIF9fZnVuY19fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zMDcwLDcgKzMwNzAsNyBAQAogCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJdWdldGhfZXJyCiAJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfcnhfYmRfcXNfdGJsLiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkgICAgIF9fZnVuY19fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0zMTQ3LDcgKzMxNDcsNyBAQAogCQlpZiAoIXVnX2luZm8tPmV4dGVuZGVkRmlsdGVyaW5nQ2hhaW5Qb2ludGVyKSB7CiAJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJCXVnZXRoX2VycigiJXM6IE51bGwgRXh0ZW5kZWQgRmlsdGVyaW5nIENoYWluIFBvaW50ZXIuIiwKLQkJCQkJICBfX0ZVTkNUSU9OX18pOworCQkJCQkgIF9fZnVuY19fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0zMTYxLDcgKzMxNjEsNyBAQAogCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCQl1Z2V0aF9lcnIKIAkJCQkJKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgotCQkJCQkiIHBfZXhmX2dsYmxfcGFyYW0uIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJIiBwX2V4Zl9nbGJsX3BhcmFtLiIsIF9fZnVuY19fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0zMjA5LDcgKzMyMDksNyBAQAogCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJdWdldGhfZXJyCiAJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgotCQkJCSIgcF9VY2NJbml0RW5ldFBhcmFtU2hhZG93cy4iLCBfX0ZVTkNUSU9OX18pOworCQkJCSIgcF9VY2NJbml0RW5ldFBhcmFtU2hhZG93cy4iLCBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzI0NCw3ICszMjQ0LDcgQEAKIAkJUUVfRkxUUl9MQVJHRVNUX0VYVEVSTkFMX1RBQkxFX0xPT0tVUF9LRVlfU0laRV8xNl9CWVRFUykpIHsKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IEludmFsaWQgbGFyZ2VzdCBFeHRlcm5hbCBMb29rdXAgS2V5IFNpemUuIiwKLQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQkJICBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzI3MSw3ICszMjcxLDcgQEAKIAkJdWdfaW5mby0+cmlzY1J4LCAxKSkgIT0gMCkgewogCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQogCQkJCXVnZXRoX2VycigiJXM6IENhbiBub3QgZmlsbCBwX2luaXRfZW5ldF9wYXJhbV9zaGFkb3cuIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJX19mdW5jX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiByZXRfdmFsOwogCX0KQEAgLTMyODcsNyArMzI4Nyw3IEBACiAJCQkJICAgIHVnX2luZm8tPnJpc2NUeCwgMCkpICE9IDApIHsKIAkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCXVnZXRoX2VycigiJXM6IENhbiBub3QgZmlsbCBwX2luaXRfZW5ldF9wYXJhbV9zaGFkb3cuIiwKLQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQkJICBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQpAQCAtMzI5Nyw3ICszMjk3LDcgQEAKIAkJaWYgKChyZXRfdmFsID0gcnhfYmRfYnVmZmVyX3NldCh1Z2V0aCwgKHU4KSBpKSkgIT0gMCkgewogCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKIAkJCQl1Z2V0aF9lcnIoIiVzOiBDYW4gbm90IGZpbGwgUnggYmRzIHdpdGggYnVmZmVycy4iLAotCQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQkJCSAgX19mdW5jX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIHJldF92YWw7CiAJCX0KQEAgLTMzMDksNyArMzMwOSw3IEBACiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIKIAkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9pbml0X2VuZXRfcHJhbS4iLAotCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJICAgICBfX2Z1bmNfXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzM2MCw3ICszMzYwLDcgQEAKIHsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKIAlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCkBAIC0zMzg2LDcgKzMzODYsNyBAQAogCXUzMiBiZF9zdGF0dXM7CiAJdTggdHhRID0gMDsKIAotCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CisJdWdldGhfdmRiZygiJXM6IElOIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycSgmdWdldGgtPmxvY2spOwogCkBAIC0zNDU5LDcgKzM0NTksNyBAQAogCXU4ICpiZEJ1ZmZlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKIAlkZXYgPSB1Z2V0aC0+ZGV2OwogCkBAIC0zNDgxLDcgKzM0ODEsNyBAQAogCQkgICAgKGJkX3N0YXR1cyAmIFJfRVJST1JTX0ZBVEFMKSkgewogCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIodWdldGgpKQogCQkJCXVnZXRoX2VycigiJXMsICVkOiBFUlJPUiEhISBza2IgLSAweCUwOHgiLAotCQkJCQkgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAodTMyKSBza2IpOworCQkJCQkgICBfX2Z1bmNfXywgX19MSU5FX18sICh1MzIpIHNrYik7CiAJCQlpZiAoc2tiKQogCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAKQEAgLTM1MDcsNyArMzUwNyw3IEBACiAJCXNrYiA9IGdldF9uZXdfc2tiKHVnZXRoLCBiZCk7CiAJCWlmICghc2tiKSB7CiAJCQlpZiAobmV0aWZfbXNnX3J4X2Vycih1Z2V0aCkpCi0JCQkJdWdldGhfd2FybigiJXM6IE5vIFJ4IERhdGEgQnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKwkJCQl1Z2V0aF93YXJuKCIlczogTm8gUnggRGF0YSBCdWZmZXIiLCBfX2Z1bmNfXyk7CiAJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNjEzLDcgKzM2MTMsNyBAQAogCXJlZ2lzdGVyIHUzMiB0eF9tYXNrOwogCXU4IGk7CiAKLQl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOworCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fZnVuY19fKTsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAl1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CkBAIC0zNjgzLDEzICszNjgzLDEzIEBACiAJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZXJyOwogCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBUZXN0IHN0YXRpb24gYWRkcmVzcyAqLwogCWlmIChkZXYtPmRldl9hZGRyWzBdICYgRU5FVF9HUk9VUF9BRERSKSB7CiAJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCiAJCQl1Z2V0aF9lcnIoIiVzOiBNdWx0aWNhc3QgYWRkcmVzcyB1c2VkIGZvciBzdGF0aW9uIGFkZHJlc3MiCi0JCQkJICAiIC0gaXMgdGhpcyB3aGF0IHlvdSB3YW50ZWQ/IiwgX19GVU5DVElPTl9fKTsKKwkJCQkgICIgLSBpcyB0aGlzIHdoYXQgeW91IHdhbnRlZD8iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzc3Miw3ICszNzcyLDcgQEAKIHsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKIAluYXBpX2Rpc2FibGUoJnVnZXRoLT5uYXBpKTsKIApAQCAtMzg0MCw3ICszODQwLDcgQEAKIAkJUEhZX0lOVEVSRkFDRV9NT0RFX1RCSSwgUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkksCiAJfTsKIAotCXVnZXRoX3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CisJdWdldGhfdmRiZygiJXM6IElOIiwgX19mdW5jX18pOwogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNlbGwtaW5kZXgiLCBOVUxMKTsKIAlpZiAoIXByb3ApIHsKQEAgLTM4NTcsNyArMzg1Nyw3IEBACiAJaWYgKHVnX2luZm8gPT0gTlVMTCkgewogCQlpZiAobmV0aWZfbXNnX3Byb2JlKCZkZWJ1ZykpCiAJCQl1Z2V0aF9lcnIoIiVzOiBbJWRdIE1pc3NpbmcgYWRkaXRpb25hbCBkYXRhISIsCi0JCQkJICAgICAgIAlfX0ZVTkNUSU9OX18sIHVjY19udW0pOworCQkJCSAgICAgICAJX19mdW5jX18sIHVjY19udW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX21paS5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfbWlpLmMKaW5kZXggNmQ5ZTdhZC4uYzAwMWQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGhfbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfbWlpLmMKQEAgLTE0MSw4ICsxNDEsNyBAQAogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaW50IGssIGVyciA9IDA7CiAKLQluZXdfYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1paV9idXMpLCBHRlBfS0VSTkVMKTsKLQorCW5ld19idXMgPSBtZGlvYnVzX2FsbG9jKCk7CiAJaWYgKE5VTEwgPT0gbmV3X2J1cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE4Nyw3ICsxODYsNyBAQAogCiAJbmV3X2J1cy0+cHJpdiA9ICh2b2lkIF9fZm9yY2UgKilyZWdzOwogCi0JbmV3X2J1cy0+ZGV2ID0gZGV2aWNlOworCW5ld19idXMtPnBhcmVudCA9IGRldmljZTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBuZXdfYnVzKTsKIAogCS8qIFJlYWQgTUlJIG1hbmFnZW1lbnQgbWFzdGVyIGZyb20gZGV2aWNlIHRyZWUgKi8KQEAgLTIzNSw3ICsyMzQsNyBAQAogaW9yZW1hcF9mYWlsOgogCWtmcmVlKG5ld19idXMtPmlycSk7CiByZWdfbWFwX2ZhaWw6Ci0Ja2ZyZWUobmV3X2J1cyk7CisJbWRpb2J1c19mcmVlKG5ld19idXMpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI1MSw3ICsyNTAsNyBAQAogCiAJaW91bm1hcCgodm9pZCBfX2lvbWVtICopYnVzLT5wcml2KTsKIAlidXMtPnByaXYgPSBOVUxMOwotCWtmcmVlKGJ1cyk7CisJbWRpb2J1c19mcmVlKGJ1cyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9LY29uZmlnIGIvZHJpdmVycy9uZXQvdXNiL0tjb25maWcKaW5kZXggMDk3M2I2ZS4uOGVlMjEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvdXNiL0tjb25maWcKQEAgLTE4OCw2ICsxODgsMTQgQEAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgRGF2aWNvbSBETTk2MDEgYmFzZWQgVVNCIDEuMQogCSAgMTAvMTAwIEV0aGVybmV0IGFkYXB0ZXJzLgogCitjb25maWcgVVNCX05FVF9TTVNDOTVYWAorCXRyaXN0YXRlICJTTVNDIExBTjk1WFggYmFzZWQgVVNCIDIuMCAxMC8xMDAgZXRoZXJuZXQgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIFVTQl9VU0JORVQKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIFNNU0MgTEFOOTVYWCBiYXNlZCBVU0IgMi4wCisJICAxMC8xMDAgRXRoZXJuZXQgYWRhcHRlcnMuCisKIGNvbmZpZyBVU0JfTkVUX0dMNjIwQQogCXRyaXN0YXRlICJHZW5lU3lzIEdMNjIwVVNCLUEgYmFzZWQgY2FibGVzIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCmluZGV4IDI0ODAwYzEuLjg4YTg3ZWViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9ORVRfQVg4ODE3WCkJKz0gYXNpeC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9DRENFVEhFUikJKz0gY2RjX2V0aGVyLm8KIG9iai0kKENPTkZJR19VU0JfTkVUX0RNOTYwMSkJKz0gZG05NjAxLm8KK29iai0kKENPTkZJR19VU0JfTkVUX1NNU0M5NVhYKQkrPSBzbXNjOTV4eC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9HTDYyMEEpCSs9IGdsNjIwYS5vCiBvYmotJChDT05GSUdfVVNCX05FVF9ORVQxMDgwKQkrPSBuZXQxMDgwLm8KIG9iai0kKENPTkZJR19VU0JfTkVUX1BMVVNCKQkrPSBwbHVzYi5vCkBAIC0xOSw2ICsyMCwzIEBACiBvYmotJChDT05GSUdfVVNCX05FVF9NQ1M3ODMwKQkrPSBtY3M3ODMwLm8KIG9iai0kKENPTkZJR19VU0JfVVNCTkVUKQkrPSB1c2JuZXQubwogCi1pZmVxICgkKENPTkZJR19VU0JfREVCVUcpLHkpCi1FWFRSQV9DRkxBR1MgKz0gLURERUJVRwotZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwppbmRleCA2ZTQyYjVhLi4xMTY0YzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaHNvLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCkBAIC05Miw5ICs5Miw2IEBACiAKICNkZWZpbmUJSFNPX05FVF9UWF9USU1FT1VUCQkoSFoqMTApCiAKLS8qIFNlcmlhbCBwb3J0IGRlZmluZXMgYW5kIHN0cnVjdHMuICovCi0jZGVmaW5lIEhTT19TRVJJQUxfRkxBR19SWF9TRU5UCQkwCi0KICNkZWZpbmUgSFNPX1NFUklBTF9NQUdJQwkJMHg0ODUzNGYzMQogCiAvKiBOdW1iZXIgb2YgdHR5cyB0byBoYW5kbGUgKi8KQEAgLTE3OSw2ICsxNzYsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogfTsKIAorZW51bSByeF9jdHJsX3N0YXRleworCVJYX0lETEUsCisJUlhfU0VOVCwKKwlSWF9QRU5ESU5HCit9OworCiBzdHJ1Y3QgaHNvX3NlcmlhbCB7CiAJc3RydWN0IGhzb19kZXZpY2UgKnBhcmVudDsKIAlpbnQgbWFnaWM7CkBAIC0yMDUsNyArMjA4LDcgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmluX2VuZHA7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpvdXRfZW5kcDsKIAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSByeF9jdHJsX3N0YXRlIHJ4X3N0YXRlOwogCXU4IHJ0c19zdGF0ZTsKIAl1OCBkdHJfc3RhdGU7CiAJdW5zaWduZWQgdHhfdXJiX3VzZWQ6MTsKQEAgLTIxNiw2ICsyMTksMTUgQEAKIAlzcGlubG9ja190IHNlcmlhbF9sb2NrOwogCiAJaW50ICgqd3JpdGVfZGF0YSkgKHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwpOworCS8qIEhhY2tzIHJlcXVpcmVkIHRvIGdldCBmbG93IGNvbnRyb2wKKwkgKiB3b3JraW5nIG9uIHRoZSBzZXJpYWwgcmVjZWl2ZSBidWZmZXJzCisJICogc28gYXMgbm90IHRvIGRyb3AgY2hhcmFjdGVycyBvbiB0aGUgZmxvb3IuCisJICovCisJaW50ICBjdXJyX3J4X3VyYl9pZHg7CisJdTE2ICBjdXJyX3J4X3VyYl9vZmZzZXQ7CisJdTggICByeF91cmJfZmlsbGVkW01BWF9SWF9VUkJTXTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdW50aHJvdHRsZV90YXNrbGV0OworCXN0cnVjdCB3b3JrX3N0cnVjdCAgICByZXRyeV91bnRocm90dGxlX3dvcmtxdWV1ZTsKIH07CiAKIHN0cnVjdCBoc29fZGV2aWNlIHsKQEAgLTI3MSw3ICsyODMsNyBAQAogc3RhdGljIGludCBoc29fc2VyaWFsX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CiBzdGF0aWMgdm9pZCBjdHJsX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgdm9pZCBwdXRfcnhidWZfZGF0YShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwpOworc3RhdGljIGludCBwdXRfcnhidWZfZGF0YShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIHZvaWQgaHNvX2tpY2tfdHJhbnNtaXQoc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCk7CiAvKiBIZWxwZXIgZnVuY3Rpb25zICovCiBzdGF0aWMgaW50IGhzb19tdXhfc3VibWl0X2ludHJfdXJiKHN0cnVjdCBoc29fc2hhcmVkX2ludCAqbXV4X2ludCwKQEAgLTI4Nyw2ICsyOTksOCBAQAogc3RhdGljIHZvaWQgaHNvX2ZyZWVfc2hhcmVkX2ludChzdHJ1Y3QgaHNvX3NoYXJlZF9pbnQgKnNoYXJlZF9pbnQpOwogc3RhdGljIGludCBoc29fc3RvcF9uZXRfZGV2aWNlKHN0cnVjdCBoc29fZGV2aWNlICpoc29fZGV2KTsKIHN0YXRpYyB2b2lkIGhzb19zZXJpYWxfcmVmX2ZyZWUoc3RydWN0IGtyZWYgKnJlZik7CitzdGF0aWMgdm9pZCBoc29fc3RkX3NlcmlhbF9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgaHNvX211eF9zZXJpYWxfcmVhZChzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyB2b2lkIGFzeW5jX2dldF9pbnRmKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSk7CiBzdGF0aWMgdm9pZCBhc3luY19wdXRfaW50ZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpOwogc3RhdGljIGludCBoc29fcHV0X2FjdGl2aXR5KHN0cnVjdCBoc29fZGV2aWNlICpoc29fZGV2KTsKQEAgLTQ1OCw2ICs0NzIsMTcgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihoc290eXBlLCBTX0lSVUdPLCBoc29fc3lzZnNfc2hvd19wb3J0dHlwZSwgTlVMTCk7CiAKK3N0YXRpYyBpbnQgaHNvX3VyYl90b19pbmRleChzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgc2VyaWFsLT5udW1fcnhfdXJiczsgaWR4KyspCisJCWlmIChzZXJpYWwtPnJ4X3VyYltpZHhdID09IHVyYikKKwkJCXJldHVybiBpZHg7CisJZGV2X2VycihzZXJpYWwtPnBhcmVudC0+ZGV2LCAiaHNvX3VyYl90b19pbmRleCBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKwogLyogY29udmVydHMgbXV4IHZhbHVlIHRvIGEgcG9ydCBzcGVjIHZhbHVlICovCiBzdGF0aWMgdTMyIGhzb19tdXhfdG9fcG9ydChpbnQgbXV4KQogewpAQCAtMTAzOSw2ICsxMDY0LDE1OCBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgaHNvX3Jlc3VibWl0X3J4X2J1bGtfdXJiKHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcmVzdWx0OworI2lmZGVmIENPTkZJR19IU09fQVVUT1BNCisJdXNiX21hcmtfbGFzdF9idXN5KHVyYi0+ZGV2KTsKKyNlbmRpZgorCS8qIFdlIGFyZSBkb25lIHdpdGggdGhpcyBVUkIsIHJlc3VibWl0IGl0LiBQcmVwIHRoZSBVU0IgdG8gd2FpdCBmb3IKKwkgKiBhbm90aGVyIGZyYW1lICovCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPnBhcmVudC0+dXNiLAorCQkJICB1c2JfcmN2YnVsa3BpcGUoc2VyaWFsLT5wYXJlbnQtPnVzYiwKKwkJCQkJICBzZXJpYWwtPmluX2VuZHAtPgorCQkJCQkgIGJFbmRwb2ludEFkZHJlc3MgJiAweDdGKSwKKwkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHNlcmlhbC0+cnhfZGF0YV9sZW5ndGgsCisJCQkgIGhzb19zdGRfc2VyaWFsX3JlYWRfYnVsa19jYWxsYmFjaywgc2VyaWFsKTsKKwkvKiBHaXZlIHRoaXMgdG8gdGhlIFVTQiBzdWJzeXN0ZW0gc28gaXQgY2FuIHRlbGwgdXMgd2hlbiBtb3JlIGRhdGEKKwkgKiBhcnJpdmVzLiAqLworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgZmFpbGVkIHN1Ym1pdCBzZXJpYWwgcnhfdXJiICVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfQorfQorCisKKworCitzdGF0aWMgdm9pZCBwdXRfcnhidWZfZGF0YV9hbmRfcmVzdWJtaXRfYnVsa191cmIoc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCkKK3sKKwlpbnQgY291bnQ7CisJc3RydWN0IHVyYiAqY3Vycl91cmI7CisKKwl3aGlsZSAoc2VyaWFsLT5yeF91cmJfZmlsbGVkW3NlcmlhbC0+Y3Vycl9yeF91cmJfaWR4XSkgeworCQljdXJyX3VyYiA9IHNlcmlhbC0+cnhfdXJiW3NlcmlhbC0+Y3Vycl9yeF91cmJfaWR4XTsKKwkJY291bnQgPSBwdXRfcnhidWZfZGF0YShjdXJyX3VyYiwgc2VyaWFsKTsKKwkJaWYgKGNvdW50ID09IC0xKQorCQkJcmV0dXJuOworCQlpZiAoY291bnQgPT0gMCkgeworCQkJc2VyaWFsLT5jdXJyX3J4X3VyYl9pZHgrKzsKKwkJCWlmIChzZXJpYWwtPmN1cnJfcnhfdXJiX2lkeCA+PSBzZXJpYWwtPm51bV9yeF91cmJzKQorCQkJCXNlcmlhbC0+Y3Vycl9yeF91cmJfaWR4ID0gMDsKKwkJCWhzb19yZXN1Ym1pdF9yeF9idWxrX3VyYihzZXJpYWwsIGN1cnJfdXJiKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHV0X3J4YnVmX2RhdGFfYW5kX3Jlc3VibWl0X2N0cmxfdXJiKHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwl1cmIgPSBzZXJpYWwtPnJ4X3VyYlswXTsKKwlpZiAoc2VyaWFsLT5vcGVuX2NvdW50ID4gMCkgeworCQljb3VudCA9IHB1dF9yeGJ1Zl9kYXRhKHVyYiwgc2VyaWFsKTsKKwkJaWYgKGNvdW50ID09IC0xKQorCQkJcmV0dXJuOworCX0KKwkvKiBSZSBpc3N1ZSBhIHJlYWQgYXMgbG9uZyBhcyB3ZSByZWNlaXZlIGRhdGEuICovCisKKwlpZiAoY291bnQgPT0gMCAmJiAoKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSAwKSB8fAorCQkJICAgKHNlcmlhbC0+cnhfc3RhdGUgPT0gUlhfUEVORElORykpKSB7CisJCXNlcmlhbC0+cnhfc3RhdGUgPSBSWF9TRU5UOworCQloc29fbXV4X3NlcmlhbF9yZWFkKHNlcmlhbCk7CisJfSBlbHNlCisJCXNlcmlhbC0+cnhfc3RhdGUgPSBSWF9JRExFOworfQorCisKKy8qIHJlYWQgY2FsbGJhY2sgZm9yIERpYWcgYW5kIENTIHBvcnQgKi8KK3N0YXRpYyB2b2lkIGhzb19zdGRfc2VyaWFsX3JlYWRfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoIXNlcmlhbCkgeworCQlEMSgic2VyaWFsID09IE5VTEwiKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoc3RhdHVzKSB7CisJCWxvZ191c2Jfc3RhdHVzKHN0YXR1cywgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJRDQoIlxuLS0tIEdvdCBzZXJpYWxfcmVhZF9idWxrIGNhbGxiYWNrICUwMnggLS0tIiwgc3RhdHVzKTsKKwlEMSgiQWN0dWFsIGxlbmd0aCA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCURVTVAxKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJLyogQW55b25lIGxpc3RlbmluZz8gKi8KKwlpZiAoc2VyaWFsLT5vcGVuX2NvdW50ID09IDApCisJCXJldHVybjsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoc2VyaWFsLT5wYXJlbnQtPnBvcnRfc3BlYyAmIEhTT19JTkZPX0NSQ19CVUcpIHsKKwkJCXUzMiByZXN0OworCQkJdTggY3JjX2NoZWNrWzRdID0geyAweERFLCAweEFELCAweEJFLCAweEVGIH07CisJCQlyZXN0ID0KKwkJCSAgICB1cmItPmFjdHVhbF9sZW5ndGggJQorCQkJICAgIHNlcmlhbC0+aW5fZW5kcC0+d01heFBhY2tldFNpemU7CisJCQlpZiAoKChyZXN0ID09IDUpIHx8IChyZXN0ID09IDYpKQorCQkJICAgICYmICFtZW1jbXAoKCh1OCAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcikgKworCQkJCSAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggLSA0LCBjcmNfY2hlY2ssIDQpKSB7CisJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoIC09IDQ7CisJCQl9CisJCX0KKwkJLyogVmFsaWQgZGF0YSwgaGFuZGxlIFJYIGRhdGEgKi8KKwkJc3Bpbl9sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKKwkJc2VyaWFsLT5yeF91cmJfZmlsbGVkW2hzb191cmJfdG9faW5kZXgoc2VyaWFsLCB1cmIpXSA9IDE7CisJCXB1dF9yeGJ1Zl9kYXRhX2FuZF9yZXN1Ym1pdF9idWxrX3VyYihzZXJpYWwpOworCQlzcGluX3VubG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CisJfSBlbHNlIGlmIChzdGF0dXMgPT0gLUVOT0VOVCB8fCBzdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKKwkJLyogVW5saW5rZWQgLSBjaGVjayBmb3IgdGhyb3R0bGVkIHBvcnQuICovCisJCUQyKCJQb3J0ICVkLCBzdWNjZXNzZnVsbHkgdW5saW5rZWQgdXJiIiwgc2VyaWFsLT5taW5vcik7CisJCXNwaW5fbG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CisJCXNlcmlhbC0+cnhfdXJiX2ZpbGxlZFtoc29fdXJiX3RvX2luZGV4KHNlcmlhbCwgdXJiKV0gPSAwOworCQloc29fcmVzdWJtaXRfcnhfYnVsa191cmIoc2VyaWFsLCB1cmIpOworCQlzcGluX3VubG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CisJfSBlbHNlIHsKKwkJRDIoIlBvcnQgJWQsIHN0YXR1cyA9ICVkIGZvciByZWFkIHVyYiIsIHNlcmlhbC0+bWlub3IsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9Cit9CisKKy8qCisgKiBUaGlzIG5lZWRzIHRvIGJlIGEgdGFza2xldCBvdGhlcndpc2Ugd2Ugd2lsbAorICogZW5kIHVwIHJlY3Vyc2l2ZWx5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLwordm9pZCBoc29fdW50aHJvdHRsZV90YXNrbGV0KHN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJpYWwtPnNlcmlhbF9sb2NrLCBmbGFncyk7CisJaWYgKChzZXJpYWwtPnBhcmVudC0+cG9ydF9zcGVjICYgSFNPX0lOVEZfTVVYKSkKKwkJcHV0X3J4YnVmX2RhdGFfYW5kX3Jlc3VibWl0X2N0cmxfdXJiKHNlcmlhbCk7CisJZWxzZQorCQlwdXRfcnhidWZfZGF0YV9hbmRfcmVzdWJtaXRfYnVsa191cmIoc2VyaWFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXJpYWwtPnNlcmlhbF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYwl2b2lkIGhzb191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IGdldF9zZXJpYWxfYnlfdHR5KHR0eSk7CisKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZzZXJpYWwtPnVudGhyb3R0bGVfdGFza2xldCk7Cit9CisKK3ZvaWQgaHNvX3VudGhyb3R0bGVfd29ya2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwgPQorCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhzb19zZXJpYWwsCisJCQkgcmV0cnlfdW50aHJvdHRsZV93b3JrcXVldWUpOworCWhzb191bnRocm90dGxlX3Rhc2tsZXQoc2VyaWFsKTsKK30KKwogLyogb3BlbiB0aGUgcmVxdWVzdGVkIHNlcmlhbCBwb3J0ICovCiBzdGF0aWMgaW50IGhzb19zZXJpYWxfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKQEAgLTEwNjQsMTMgKzEyNDEsMTggQEAKIAl0dHktPmRyaXZlcl9kYXRhID0gc2VyaWFsOwogCXNlcmlhbC0+dHR5ID0gdHR5OwogCi0JLyogY2hlY2sgZm9yIHBvcnQgYWxscmVhZHkgb3BlbmVkLCBpZiBub3Qgc2V0IHRoZSB0ZXJtaW9zICovCisJLyogY2hlY2sgZm9yIHBvcnQgYWxyZWFkeSBvcGVuZWQsIGlmIG5vdCBzZXQgdGhlIHRlcm1pb3MgKi8KIAlzZXJpYWwtPm9wZW5fY291bnQrKzsKIAlpZiAoc2VyaWFsLT5vcGVuX2NvdW50ID09IDEpIHsKIAkJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7Ci0JCXNlcmlhbC0+ZmxhZ3MgPSAwOworCQlzZXJpYWwtPnJ4X3N0YXRlID0gUlhfSURMRTsKIAkJLyogRm9yY2UgZGVmYXVsdCB0ZXJtaW8gc2V0dGluZ3MgKi8KIAkJX2hzb19zZXJpYWxfc2V0X3Rlcm1pb3ModHR5LCBOVUxMKTsKKwkJdGFza2xldF9pbml0KCZzZXJpYWwtPnVudGhyb3R0bGVfdGFza2xldCwKKwkJCSAgICAgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWhzb191bnRocm90dGxlX3Rhc2tsZXQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKXNlcmlhbCk7CisJCUlOSVRfV09SSygmc2VyaWFsLT5yZXRyeV91bnRocm90dGxlX3dvcmtxdWV1ZSwKKwkJCSAgaHNvX3VudGhyb3R0bGVfd29ya2Z1bmMpOwogCQlyZXN1bHQgPSBoc29fc3RhcnRfc2VyaWFsX2RldmljZShzZXJpYWwtPnBhcmVudCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCWhzb19zdG9wX3NlcmlhbF9kZXZpY2Uoc2VyaWFsLT5wYXJlbnQpOwpAQCAtMTExNyw5ICsxMjk5LDEzIEBACiAJCX0KIAkJaWYgKCF1c2JfZ29uZSkKIAkJCWhzb19zdG9wX3NlcmlhbF9kZXZpY2Uoc2VyaWFsLT5wYXJlbnQpOworCQl0YXNrbGV0X2tpbGwoJnNlcmlhbC0+dW50aHJvdHRsZV90YXNrbGV0KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmc2VyaWFsLT5yZXRyeV91bnRocm90dGxlX3dvcmtxdWV1ZSk7CiAJfQorCiAJaWYgKCF1c2JfZ29uZSkKIAkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHNlcmlhbC0+cGFyZW50LT5pbnRlcmZhY2UpOworCiAJbXV0ZXhfdW5sb2NrKCZzZXJpYWwtPnBhcmVudC0+bXV0ZXgpOwogfQogCkBAIC0xNDIyLDE1ICsxNjA4LDIxIEBACiAJCQkJCQkJCSAgICgxIDw8IGkpKTsKIAkJCWlmIChzZXJpYWwgIT0gTlVMTCkgewogCQkJCUQxKCJQZW5kaW5nIHJlYWQgaW50ZXJydXB0IG9uIHBvcnQgJWRcbiIsIGkpOwotCQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChIU09fU0VSSUFMX0ZMQUdfUlhfU0VOVCwKLQkJCQkJCSAgICAgICZzZXJpYWwtPmZsYWdzKSkgeworCQkJCXNwaW5fbG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CisJCQkJaWYgKHNlcmlhbC0+cnhfc3RhdGUgPT0gUlhfSURMRSkgewogCQkJCQkvKiBTZXR1cCBhbmQgc2VuZCBhIGN0cmwgcmVxIHJlYWQgb24KIAkJCQkJICogcG9ydCBpICovCi0JCQkJCWhzb19tdXhfc2VyaWFsX3JlYWQoc2VyaWFsKTsKKwkJCQlpZiAoIXNlcmlhbC0+cnhfdXJiX2ZpbGxlZFswXSkgeworCQkJCQkJc2VyaWFsLT5yeF9zdGF0ZSA9IFJYX1NFTlQ7CisJCQkJCQloc29fbXV4X3NlcmlhbF9yZWFkKHNlcmlhbCk7CisJCQkJCX0gZWxzZQorCQkJCQkJc2VyaWFsLT5yeF9zdGF0ZSA9IFJYX1BFTkRJTkc7CisKIAkJCQl9IGVsc2UgewogCQkJCQlEMSgiQWxyZWFkeSBwZW5kaW5nIGEgcmVhZCBvbiAiCiAJCQkJCSAgICJwb3J0ICVkXG4iLCBpKTsKIAkJCQl9CisJCQkJc3Bpbl91bmxvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwogCQkJfQogCQl9CiAJfQpAQCAtMTUzMiwxNiArMTcyNCwxMCBAQAogCWlmIChyZXEtPmJSZXF1ZXN0VHlwZSA9PQogCSAgICAoVVNCX0RJUl9JTiB8IFVTQl9UWVBFX09QVElPTl9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFKSkgewogCQkvKiByZXNwb25zZSB0byBhIHJlYWQgY29tbWFuZCAqLwotCQlpZiAoc2VyaWFsLT5vcGVuX2NvdW50ID4gMCkgewotCQkJLyogaGFuZGxlIFJYIGRhdGEgdGhlIG5vcm1hbCB3YXkgKi8KLQkJCXB1dF9yeGJ1Zl9kYXRhKHVyYiwgc2VyaWFsKTsKLQkJfQotCi0JCS8qIFJlIGlzc3VlIGEgcmVhZCBhcyBsb25nIGFzIHdlIHJlY2VpdmUgZGF0YS4gKi8KLQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSAwKQotCQkJaHNvX211eF9zZXJpYWxfcmVhZChzZXJpYWwpOwotCQllbHNlCi0JCQljbGVhcl9iaXQoSFNPX1NFUklBTF9GTEFHX1JYX1NFTlQsICZzZXJpYWwtPmZsYWdzKTsKKwkJc2VyaWFsLT5yeF91cmJfZmlsbGVkWzBdID0gMTsKKwkJc3Bpbl9sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKKwkJcHV0X3J4YnVmX2RhdGFfYW5kX3Jlc3VibWl0X2N0cmxfdXJiKHNlcmlhbCk7CisJCXNwaW5fdW5sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKIAl9IGVsc2UgewogCQloc29fcHV0X2FjdGl2aXR5KHNlcmlhbC0+cGFyZW50KTsKIAkJaWYgKHNlcmlhbC0+dHR5KQpAQCAtMTU1Miw5MSArMTczOCw0MiBAQAogfQogCiAvKiBoYW5kbGUgUlggZGF0YSBmb3Igc2VyaWFsIHBvcnQgKi8KLXN0YXRpYyB2b2lkIHB1dF9yeGJ1Zl9kYXRhKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCkKK3N0YXRpYyBpbnQgcHV0X3J4YnVmX2RhdGEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBzZXJpYWwtPnR0eTsKLQorCWludCB3cml0ZV9sZW5ndGhfcmVtYWluaW5nID0gMDsKKwlpbnQgY3Vycl93cml0ZV9sZW47CiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKHVyYiA9PSBOVUxMIHx8IHNlcmlhbCA9PSBOVUxMKSB7CiAJCUQxKCJzZXJpYWwgPSBOVUxMIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC0yOwogCX0KIAogCS8qIFB1c2ggZGF0YSB0byB0dHkgKi8KLQlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCWlmICh0dHkpIHsKKwkJd3JpdGVfbGVuZ3RoX3JlbWFpbmluZyA9IHVyYi0+YWN0dWFsX2xlbmd0aCAtCisJCQlzZXJpYWwtPmN1cnJfcnhfdXJiX29mZnNldDsKIAkJRDEoImRhdGEgdG8gcHVzaCB0byB0dHkiKTsKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJCSAgICAgICB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCX0KLX0KLQotLyogcmVhZCBjYWxsYmFjayBmb3IgRGlhZyBhbmQgQ1MgcG9ydCAqLwotc3RhdGljIHZvaWQgaHNvX3N0ZF9zZXJpYWxfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsID0gdXJiLT5jb250ZXh0OwotCWludCByZXN1bHQ7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKCFzZXJpYWwpIHsKLQkJRDEoInNlcmlhbCA9PSBOVUxMIik7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKHN0YXR1cykgewotCQlsb2dfdXNiX3N0YXR1cyhzdGF0dXMsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCUQ0KCJcbi0tLSBHb3Qgc2VyaWFsX3JlYWRfYnVsayBjYWxsYmFjayAlMDJ4IC0tLSIsIHN0YXR1cyk7Ci0JRDEoIkFjdHVhbCBsZW5ndGggPSAlZFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQlEVU1QMSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCS8qIEFueW9uZSBsaXN0ZW5pbmc/ICovCi0JaWYgKHNlcmlhbC0+b3Blbl9jb3VudCA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNlcmlhbC0+cGFyZW50LT5wb3J0X3NwZWMgJiBIU09fSU5GT19DUkNfQlVHKSB7Ci0JCQl1MzIgcmVzdDsKLQkJCXU4IGNyY19jaGVja1s0XSA9IHsgMHhERSwgMHhBRCwgMHhCRSwgMHhFRiB9OwotCQkJcmVzdCA9Ci0JCQkgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICUKLQkJCSAgICBzZXJpYWwtPmluX2VuZHAtPndNYXhQYWNrZXRTaXplOwotCQkJaWYgKCgocmVzdCA9PSA1KSB8fCAocmVzdCA9PSA2KSkKLQkJCSAgICAmJiAhbWVtY21wKCgodTggKikgdXJiLT50cmFuc2Zlcl9idWZmZXIpICsKLQkJCQkgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoIC0gNCwgY3JjX2NoZWNrLCA0KSkgewotCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCAtPSA0OwotCQkJfQorCQl3aGlsZSAod3JpdGVfbGVuZ3RoX3JlbWFpbmluZykgeworCQkJaWYgKHRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKKwkJCQlyZXR1cm4gLTE7CisJCQljdXJyX3dyaXRlX2xlbiA9ICB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nCisJCQkJKHR0eSwgdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJCSBzZXJpYWwtPmN1cnJfcnhfdXJiX29mZnNldCwKKwkJCQkgd3JpdGVfbGVuZ3RoX3JlbWFpbmluZyk7CisJCQlzZXJpYWwtPmN1cnJfcnhfdXJiX29mZnNldCArPSBjdXJyX3dyaXRlX2xlbjsKKwkJCXdyaXRlX2xlbmd0aF9yZW1haW5pbmcgLT0gY3Vycl93cml0ZV9sZW47CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQl9Ci0JCS8qIFZhbGlkIGRhdGEsIGhhbmRsZSBSWCBkYXRhICovCi0JCXB1dF9yeGJ1Zl9kYXRhKHVyYiwgc2VyaWFsKTsKLQl9IGVsc2UgaWYgKHN0YXR1cyA9PSAtRU5PRU5UIHx8IHN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgewotCQkvKiBVbmxpbmtlZCAtIGNoZWNrIGZvciB0aHJvdHRsZWQgcG9ydC4gKi8KLQkJRDIoIlBvcnQgJWQsIHN1Y2Nlc3NmdWxseSB1bmxpbmtlZCB1cmIiLCBzZXJpYWwtPm1pbm9yKTsKLQl9IGVsc2UgewotCQlEMigiUG9ydCAlZCwgc3RhdHVzID0gJWQgZm9yIHJlYWQgdXJiIiwgc2VyaWFsLT5taW5vciwgc3RhdHVzKTsKLQkJcmV0dXJuOwogCX0KLQotCXVzYl9tYXJrX2xhc3RfYnVzeSh1cmItPmRldik7Ci0KLQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoaXMgVVJCLCByZXN1Ym1pdCBpdC4gUHJlcCB0aGUgVVNCIHRvIHdhaXQgZm9yCi0JICogYW5vdGhlciBmcmFtZSAqLwotCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VyaWFsLT5wYXJlbnQtPnVzYiwKLQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHNlcmlhbC0+cGFyZW50LT51c2IsCi0JCQkJCSAgc2VyaWFsLT5pbl9lbmRwLT4KLQkJCQkJICBiRW5kcG9pbnRBZGRyZXNzICYgMHg3RiksCi0JCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBzZXJpYWwtPnJ4X2RhdGFfbGVuZ3RoLAotCQkJICBoc29fc3RkX3NlcmlhbF9yZWFkX2J1bGtfY2FsbGJhY2ssIHNlcmlhbCk7Ci0JLyogR2l2ZSB0aGlzIHRvIHRoZSBVU0Igc3Vic3lzdGVtIHNvIGl0IGNhbiB0ZWxsIHVzIHdoZW4gbW9yZSBkYXRhCi0JICogYXJyaXZlcy4gKi8KLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXN1bHQpIHsKLQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIGZhaWxlZCBzdWJtaXQgc2VyaWFsIHJ4X3VyYiAlZCIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwlpZiAod3JpdGVfbGVuZ3RoX3JlbWFpbmluZyA9PSAwKSB7CisJCXNlcmlhbC0+Y3Vycl9yeF91cmJfb2Zmc2V0ID0gMDsKKwkJc2VyaWFsLT5yeF91cmJfZmlsbGVkW2hzb191cmJfdG9faW5kZXgoc2VyaWFsLCB1cmIpXSA9IDA7CiAJfQorCXJldHVybiB3cml0ZV9sZW5ndGhfcmVtYWluaW5nOwogfQogCisKIC8qIEJhc2UgZHJpdmVyIGZ1bmN0aW9ucyAqLwogCiBzdGF0aWMgdm9pZCBoc29fbG9nX3BvcnQoc3RydWN0IGhzb19kZXZpY2UgKmhzb19kZXYpCkBAIC0xNzk0LDkgKzE5MzEsMTMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcnhfdXJiczsgaSsrKSB7Ci0JCWlmIChzZXJpYWwtPnJ4X3VyYltpXSkKKwkJaWYgKHNlcmlhbC0+cnhfdXJiW2ldKSB7CiAJCQkJdXNiX2tpbGxfdXJiKHNlcmlhbC0+cnhfdXJiW2ldKTsKKwkJCQlzZXJpYWwtPnJ4X3VyYl9maWxsZWRbaV0gPSAwOworCQl9CiAJfQorCXNlcmlhbC0+Y3Vycl9yeF91cmJfaWR4ID0gMDsKKwlzZXJpYWwtPmN1cnJfcnhfdXJiX29mZnNldCA9IDA7CiAKIAlpZiAoc2VyaWFsLT50eF91cmIpCiAJCXVzYl9raWxsX3VyYihzZXJpYWwtPnR4X3VyYik7CkBAIC0yMjExLDE0ICsyMzUyLDE0IEBACiAJCQkJICAgICBVU0JfRElSX0lOKTsKIAlpZiAoIXNlcmlhbC0+aW5fZW5kcCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkZhaWxlZCB0byBmaW5kIEJVTEsgSU4gZXBcbiIpOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gZXhpdDI7CiAJfQogCiAJaWYgKCEKIAkgICAgKHNlcmlhbC0+b3V0X2VuZHAgPQogCSAgICAgaHNvX2dldF9lcChpbnRlcmZhY2UsIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssIFVTQl9ESVJfT1VUKSkpIHsKIAkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJGYWlsZWQgdG8gZmluZCBCVUxLIElOIGVwXG4iKTsKLQkJZ290byBleGl0OworCQlnb3RvIGV4aXQyOwogCX0KIAogCXNlcmlhbC0+d3JpdGVfZGF0YSA9IGhzb19zdGRfc2VyaWFsX3dyaXRlX2RhdGE7CkBAIC0yMjMxLDkgKzIzNzIsMTAgQEAKIAogCS8qIGRvbmUsIHJldHVybiBpdCAqLwogCXJldHVybiBoc29fZGV2OworCitleGl0MjoKKwloc29fc2VyaWFsX2NvbW1vbl9mcmVlKHNlcmlhbCk7CiBleGl0OgotCWlmIChoc29fZGV2ICYmIHNlcmlhbCkKLQkJaHNvX3NlcmlhbF9jb21tb25fZnJlZShzZXJpYWwpOwogCWtmcmVlKHNlcmlhbCk7CiAJaHNvX2ZyZWVfZGV2aWNlKGhzb19kZXYpOwogCXJldHVybiBOVUxMOwpAQCAtMjc0MCw2ICsyODgyLDcgQEAKIAkuY2hhcnNfaW5fYnVmZmVyID0gaHNvX3NlcmlhbF9jaGFyc19pbl9idWZmZXIsCiAJLnRpb2NtZ2V0ID0gaHNvX3NlcmlhbF90aW9jbWdldCwKIAkudGlvY21zZXQgPSBoc29fc2VyaWFsX3Rpb2Ntc2V0LAorCS51bnRocm90dGxlID0gaHNvX3VudGhyb3R0bGUKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBoc29fZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL21jczc4MzAuYyBiL2RyaXZlcnMvbmV0L3VzYi9tY3M3ODMwLmMKaW5kZXggY2E5ZDAwYy4uYjUxNDM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL21jczc4MzAuYworKysgYi9kcml2ZXJzL25ldC91c2IvbWNzNzgzMC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAogCWlmICh1cmItPnN0YXR1cyA8IDApCiAJCXByaW50ayhLRVJOX0RFQlVHICIlcygpIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCSAgICAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCiAJa2ZyZWUocmVxKTsKIAl1c2JfZnJlZV91cmIodXJiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDhjMTkzMDcuLjM4YjkwZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJZGVmYXVsdDoKIAkJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJZGV2X2RiZygmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMsIHN0YXR1cyAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCX0KIAlwZWdhc3VzLT5mbGFncyAmPSB+RVRIX1JFR1NfQ0hBTkdFRDsKIAl3YWtlX3VwKCZwZWdhc3VzLT5jdHJsX3dhaXQpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJaWYgKCFidWZmZXIpIHsKIAkJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykpCiAJCQlkZXZfd2FybigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSBpbiAlc1xuIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJYWRkX3dhaXRfcXVldWUoJnBlZ2FzdXMtPmN0cmxfd2FpdCwgJndhaXQpOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCQluZXRpZl9kZXZpY2VfZGV0YWNoKHBlZ2FzdXMtPm5ldCk7CiAJCWlmIChuZXRpZl9tc2dfZHJ2KHBlZ2FzdXMpKQogCQkJZGV2X2VycigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMsIHN0YXR1cyAlZFxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCByZXQpOworCQkJCQlfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlpZiAoIXRtcCkgewogCQlpZiAobmV0aWZfbXNnX2RydihwZWdhc3VzKSkKIAkJCWRldl93YXJuKCZwZWdhc3VzLT5pbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5IGluICVzXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1jcHkodG1wLCAmZGF0YSwgMSk7CkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJCW5ldGlmX2RldmljZV9kZXRhY2gocGVnYXN1cy0+bmV0KTsKIAkJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJZGV2X2VycigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMsIHN0YXR1cyAlZFxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCByZXQpOworCQkJCQlfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zMTAsNyArMzEwLDcgQEAKIAkJCW5ldGlmX2RldmljZV9kZXRhY2gocGVnYXN1cy0+bmV0KTsKIAkJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykpCiAJCQlkZXZfZXJyKCZwZWdhc3VzLT5pbnRmLT5kZXYsICIlcywgc3RhdHVzICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIHJldCk7CisJCQkJCV9fZnVuY19fLCByZXQpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zNDEsNyArMzQxLDcgQEAKIAl9CiBmYWlsOgogCWlmIChuZXRpZl9tc2dfZHJ2KHBlZ2FzdXMpKQotCQlkZXZfd2FybigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfd2FybigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzc4LDcgKzM3OCw3IEBACiAKIGZhaWw6CiAJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykpCi0JCWRldl93YXJuKCZwZWdhc3VzLT5pbnRmLT5kZXYsICIlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl93YXJuKCZwZWdhc3VzLT5pbnRmLT5kZXYsICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIApAQCAtNDE1LDcgKzQxNSw3IEBACiAKIGZhaWw6CiAJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykpCi0JCWRldl93YXJuKCZwZWdhc3VzLT5pbnRmLT5kZXYsICIlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldl93YXJuKCZwZWdhc3VzLT5pbnRmLT5kZXYsICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIApAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCXJldHVybiByZXQ7CiBmYWlsOgogCWlmIChuZXRpZl9tc2dfZHJ2KHBlZ2FzdXMpKQotCQlkZXZfd2FybigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfd2FybigmcGVnYXN1cy0+aW50Zi0+ZGV2LCAiJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAjZW5kaWYJCQkJLyogUEVHQVNVU19XUklURV9FRVBST00gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCkBAIC0wLDAgKzEsMTIyNSBAQAorIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBTTVNDCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JuZXQuaD4KKyNpbmNsdWRlICJzbXNjOTV4eC5oIgorCisjZGVmaW5lIFNNU0NfQ0hJUE5BTUUJCQkic21zYzk1eHgiCisjZGVmaW5lIFNNU0NfRFJJVkVSX1ZFUlNJT04JCSIxLjAuMyIKKyNkZWZpbmUgSFNfVVNCX1BLVF9TSVpFCQkJKDUxMikKKyNkZWZpbmUgRlNfVVNCX1BLVF9TSVpFCQkJKDY0KQorI2RlZmluZSBERUZBVUxUX0hTX0JVUlNUX0NBUF9TSVpFCSgxNiAqIDEwMjQgKyA1ICogSFNfVVNCX1BLVF9TSVpFKQorI2RlZmluZSBERUZBVUxUX0ZTX0JVUlNUX0NBUF9TSVpFCSg2ICogMTAyNCArIDMzICogRlNfVVNCX1BLVF9TSVpFKQorI2RlZmluZSBERUZBVUxUX0JVTEtfSU5fREVMQVkJCSgweDAwMDAyMDAwKQorI2RlZmluZSBNQVhfU0lOR0xFX1BBQ0tFVF9TSVpFCQkoMjA0OCkKKyNkZWZpbmUgTEFOOTVYWF9FRVBST01fTUFHSUMJCSgweDk1MDApCisjZGVmaW5lIEVFUFJPTV9NQUNfT0ZGU0VUCQkoMHgwMSkKKyNkZWZpbmUgREVGQVVMVF9SWF9DU1VNX0VOQUJMRQkJKHRydWUpCisjZGVmaW5lIFNNU0M5NVhYX0lOVEVSTkFMX1BIWV9JRAkoMSkKKyNkZWZpbmUgU01TQzk1WFhfVFhfT1ZFUkhFQUQJCSg4KQorI2RlZmluZSBGTE9XX0NUUkxfVFgJCQkoMSkKKyNkZWZpbmUgRkxPV19DVFJMX1JYCQkJKDIpCisKK3N0cnVjdCBzbXNjOTV4eF9wcml2IHsKKwl1MzIgbWFjX2NyOworCXNwaW5sb2NrX3QgbWFjX2NyX2xvY2s7CisJYm9vbCB1c2VfcnhfY3N1bTsKK307CisKK3N0cnVjdCB1c2JfY29udGV4dCB7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCByZXE7CisJc3RydWN0IGNvbXBsZXRpb24gbm90aWZ5OworCXN0cnVjdCB1c2JuZXQgKmRldjsKK307CisKK2ludCB0dXJib19tb2RlID0gdHJ1ZTsKK21vZHVsZV9wYXJhbSh0dXJib19tb2RlLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModHVyYm9fbW9kZSwgIkVuYWJsZSBtdWx0aXBsZSBmcmFtZXMgcGVyIFJ4IHRyYW5zYWN0aW9uIik7CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfcmVhZF9yZWcoc3RydWN0IHVzYm5ldCAqZGV2LCB1MzIgaW5kZXgsIHUzMiAqZGF0YSkKK3sKKwl1MzIgKmJ1ZiA9IGttYWxsb2MoNCwgR0ZQX0tFUk5FTCk7CisJaW50IHJldDsKKworCUJVR19PTighZGV2KTsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlVU0JfVkVORE9SX1JFUVVFU1RfUkVBRF9SRUdJU1RFUiwKKwkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCTAwLCBpbmRleCwgYnVmLCA0LCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgaW5kZXggMHglMDh4IiwgaW5kZXgpOworCisJbGUzMl90b19jcHVzKGJ1Zik7CisJKmRhdGEgPSAqYnVmOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X3dyaXRlX3JlZyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUzMiBpbmRleCwgdTMyIGRhdGEpCit7CisJdTMyICpidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOworCWludCByZXQ7CisKKwlCVUdfT04oIWRldik7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqYnVmID0gZGF0YTsKKwljcHVfdG9fbGUzMnMoYnVmKTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQlVU0JfVkVORE9SX1JFUVVFU1RfV1JJVEVfUkVHSVNURVIsCisJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJMDAsIGluZGV4LCBidWYsIDQsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgaW5kZXggMHglMDh4IiwgaW5kZXgpOworCisJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIExvb3AgdW50aWwgdGhlIHJlYWQgaXMgY29tcGxldGVkIHdpdGggdGltZW91dAorICogY2FsbGVkIHdpdGggcGh5X211dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgc21zYzk1eHhfcGh5X3dhaXRfbm90X2J1c3koc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7CisJdTMyIHZhbDsKKworCWRvIHsKKwkJc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBNSUlfQUREUiwgJnZhbCk7CisJCWlmICghKHZhbCAmIE1JSV9CVVNZXykpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF90aW1lICsgSFopKTsKKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgaWR4KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHZhbCwgYWRkcjsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKworCS8qIGNvbmZpcm0gTUlJIG5vdCBidXN5ICovCisJaWYgKHNtc2M5NXh4X3BoeV93YWl0X25vdF9idXN5KGRldikpIHsKKwkJZGV2d2FybihkZXYsICJNSUkgaXMgYnVzeSBpbiBzbXNjOTV4eF9tZGlvX3JlYWQiKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHNldCB0aGUgYWRkcmVzcywgaW5kZXggJiBkaXJlY3Rpb24gKHJlYWQgZnJvbSBQSFkpICovCisJcGh5X2lkICY9IGRldi0+bWlpLnBoeV9pZF9tYXNrOworCWlkeCAmPSBkZXYtPm1paS5yZWdfbnVtX21hc2s7CisJYWRkciA9IChwaHlfaWQgPDwgMTEpIHwgKGlkeCA8PCA2KSB8IE1JSV9SRUFEXzsKKwlzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBNSUlfQUREUiwgYWRkcik7CisKKwlpZiAoc21zYzk1eHhfcGh5X3dhaXRfbm90X2J1c3koZGV2KSkgeworCQlkZXZ3YXJuKGRldiwgIlRpbWVkIG91dCByZWFkaW5nIE1JSSByZWcgJTAyWCIsIGlkeCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIE1JSV9EQVRBLCAmdmFsKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworCisJcmV0dXJuICh1MTYpKHZhbCAmIDB4RkZGRik7Cit9CisKK3N0YXRpYyB2b2lkIHNtc2M5NXh4X21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGlkeCwKKwkJCQlpbnQgcmVndmFsKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIHZhbCwgYWRkcjsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKworCS8qIGNvbmZpcm0gTUlJIG5vdCBidXN5ICovCisJaWYgKHNtc2M5NXh4X3BoeV93YWl0X25vdF9idXN5KGRldikpIHsKKwkJZGV2d2FybihkZXYsICJNSUkgaXMgYnVzeSBpbiBzbXNjOTV4eF9tZGlvX3dyaXRlIik7CisJCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gcmVndmFsOworCXNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIE1JSV9EQVRBLCB2YWwpOworCisJLyogc2V0IHRoZSBhZGRyZXNzLCBpbmRleCAmIGRpcmVjdGlvbiAod3JpdGUgdG8gUEhZKSAqLworCXBoeV9pZCAmPSBkZXYtPm1paS5waHlfaWRfbWFzazsKKwlpZHggJj0gZGV2LT5taWkucmVnX251bV9tYXNrOworCWFkZHIgPSAocGh5X2lkIDw8IDExKSB8IChpZHggPDwgNikgfCBNSUlfV1JJVEVfOworCXNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIE1JSV9BRERSLCBhZGRyKTsKKworCWlmIChzbXNjOTV4eF9waHlfd2FpdF9ub3RfYnVzeShkZXYpKQorCQlkZXZ3YXJuKGRldiwgIlRpbWVkIG91dCB3cml0aW5nIE1JSSByZWcgJTAyWCIsIGlkeCk7CisKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF93YWl0X2VlcHJvbShzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKKwl1MzIgdmFsOworCisJZG8geworCQlzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIEUyUF9DTUQsICZ2YWwpOworCQlpZiAoISh2YWwgJiBFMlBfQ01EX0JVU1lfKSB8fCAodmFsICYgRTJQX0NNRF9USU1FT1VUXykpCisJCQlicmVhazsKKwkJdWRlbGF5KDQwKTsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF90aW1lICsgSFopKTsKKworCWlmICh2YWwgJiAoRTJQX0NNRF9USU1FT1VUXyB8IEUyUF9DTURfQlVTWV8pKSB7CisJCWRldndhcm4oZGV2LCAiRUVQUk9NIHJlYWQgb3BlcmF0aW9uIHRpbWVvdXQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfZWVwcm9tX2NvbmZpcm1fbm90X2J1c3koc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7CisJdTMyIHZhbDsKKworCWRvIHsKKwkJc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBFMlBfQ01ELCAmdmFsKTsKKworCQlpZiAoISh2YWwgJiBFMlBfQ01EX0xPQURFRF8pKSB7CisJCQlkZXZ3YXJuKGRldiwgIk5vIEVFUFJPTSBwcmVzZW50Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmICghKHZhbCAmIEUyUF9DTURfQlVTWV8pKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDQwKTsKKwl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF90aW1lICsgSFopKTsKKworCWRldndhcm4oZGV2LCAiRUVQUk9NIGlzIGJ1c3kiKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9yZWFkX2VlcHJvbShzdHJ1Y3QgdXNibmV0ICpkZXYsIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgsCisJCQkJdTggKmRhdGEpCit7CisJdTMyIHZhbDsKKwlpbnQgaSwgcmV0OworCisJQlVHX09OKCFkZXYpOworCUJVR19PTighZGF0YSk7CisKKwlyZXQgPSBzbXNjOTV4eF9lZXByb21fY29uZmlybV9ub3RfYnVzeShkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJdmFsID0gRTJQX0NNRF9CVVNZXyB8IEUyUF9DTURfUkVBRF8gfCAob2Zmc2V0ICYgRTJQX0NNRF9BRERSXyk7CisJCXNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIEUyUF9DTUQsIHZhbCk7CisKKwkJcmV0ID0gc21zYzk1eHhfd2FpdF9lZXByb20oZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXNtc2M5NXh4X3JlYWRfcmVnKGRldiwgRTJQX0RBVEEsICZ2YWwpOworCisJCWRhdGFbaV0gPSB2YWwgJiAweEZGOworCQlvZmZzZXQrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF93cml0ZV9lZXByb20oc3RydWN0IHVzYm5ldCAqZGV2LCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLAorCQkJCSB1OCAqZGF0YSkKK3sKKwl1MzIgdmFsOworCWludCBpLCByZXQ7CisKKwlCVUdfT04oIWRldik7CisJQlVHX09OKCFkYXRhKTsKKworCXJldCA9IHNtc2M5NXh4X2VlcHJvbV9jb25maXJtX25vdF9idXN5KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIElzc3VlIHdyaXRlL2VyYXNlIGVuYWJsZSBjb21tYW5kICovCisJdmFsID0gRTJQX0NNRF9CVVNZXyB8IEUyUF9DTURfRVdFTl87CisJc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgRTJQX0NNRCwgdmFsKTsKKworCXJldCA9IHNtc2M5NXh4X3dhaXRfZWVwcm9tKGRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKworCQkvKiBGaWxsIGRhdGEgcmVnaXN0ZXIgKi8KKwkJdmFsID0gZGF0YVtpXTsKKwkJc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgRTJQX0RBVEEsIHZhbCk7CisKKwkJLyogU2VuZCAid3JpdGUiIGNvbW1hbmQgKi8KKwkJdmFsID0gRTJQX0NNRF9CVVNZXyB8IEUyUF9DTURfV1JJVEVfIHwgKG9mZnNldCAmIEUyUF9DTURfQUREUl8pOworCQlzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBFMlBfQ01ELCB2YWwpOworCisJCXJldCA9IHNtc2M5NXh4X3dhaXRfZWVwcm9tKGRldik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlvZmZzZXQrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc21zYzk1eHhfYXN5bmNfY21kX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9jb250ZXh0ICp1c2JfY29udGV4dCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSB1c2JfY29udGV4dC0+ZGV2OworCisJaWYgKHVyYi0+c3RhdHVzIDwgMCkKKwkJZGV2d2FybihkZXYsICJhc3luYyBjYWxsYmFjayBmYWlsZWQgd2l0aCAlZCIsIHVyYi0+c3RhdHVzKTsKKworCWNvbXBsZXRlKCZ1c2JfY29udGV4dC0+bm90aWZ5KTsKKworCWtmcmVlKHVzYl9jb250ZXh0KTsKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF93cml0ZV9yZWdfYXN5bmMoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgaW5kZXgsIHUzMiAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2NvbnRleHQgKnVzYl9jb250ZXh0OworCWludCBzdGF0dXM7CisJc3RydWN0IHVyYiAqdXJiOworCWNvbnN0IHUxNiBzaXplID0gNDsKKworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCF1cmIpIHsKKwkJZGV2d2FybihkZXYsICJFcnJvciBhbGxvY2F0aW5nIFVSQiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl1c2JfY29udGV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfY29udGV4dCksIEdGUF9BVE9NSUMpOworCWlmICh1c2JfY29udGV4dCA9PSBOVUxMKSB7CisJCWRldndhcm4oZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBjb250cm9sIG1zZyIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdXNiX2NvbnRleHQtPnJlcS5iUmVxdWVzdFR5cGUgPQorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJdXNiX2NvbnRleHQtPnJlcS5iUmVxdWVzdCA9IFVTQl9WRU5ET1JfUkVRVUVTVF9XUklURV9SRUdJU1RFUjsKKwl1c2JfY29udGV4dC0+cmVxLndWYWx1ZSA9IDAwOworCXVzYl9jb250ZXh0LT5yZXEud0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCXVzYl9jb250ZXh0LT5yZXEud0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOworCWluaXRfY29tcGxldGlvbigmdXNiX2NvbnRleHQtPm5vdGlmeSk7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCSh2b2lkICopJnVzYl9jb250ZXh0LT5yZXEsIGRhdGEsIHNpemUsCisJCSh1c2JfY29tcGxldGVfdClzbXNjOTV4eF9hc3luY19jbWRfY2FsbGJhY2ssCisJCSh2b2lkICopdXNiX2NvbnRleHQpOworCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkVycm9yIHN1Ym1pdHRpbmcgY29udHJvbCBtc2csIHN0cz0lZCIsIHN0YXR1cyk7CisJCWtmcmVlKHVzYl9jb250ZXh0KTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogcmV0dXJucyBoYXNoIGJpdCBudW1iZXIgZm9yIGdpdmVuIE1BQyBhZGRyZXNzCisgKiBleGFtcGxlOgorICogMDEgMDAgNUUgMDAgMDAgMDEgLT4gcmV0dXJucyBiaXQgbnVtYmVyIDMxICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNtc2M5NXh4X2hhc2goY2hhciBhZGRyW0VUSF9BTEVOXSkKK3sKKwlyZXR1cm4gKGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcikgPj4gMjYpICYgMHgzZjsKK30KKworc3RhdGljIHZvaWQgc21zYzk1eHhfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNtc2M5NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisJdTMyIGhhc2hfaGkgPSAwOworCXUzMiBoYXNoX2xvID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5tYWNfY3JfbG9jaywgZmxhZ3MpOworCisJaWYgKGRldi0+bmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWlmIChuZXRpZl9tc2dfZHJ2KGRldikpCisJCQlkZXZkYmcoZGV2LCAicHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkIik7CisJCXBkYXRhLT5tYWNfY3IgfD0gTUFDX0NSX1BSTVNfOworCQlwZGF0YS0+bWFjX2NyICY9IH4oTUFDX0NSX01DUEFTXyB8IE1BQ19DUl9IUEZJTFRfKTsKKwl9IGVsc2UgaWYgKGRldi0+bmV0LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlpZiAobmV0aWZfbXNnX2RydihkZXYpKQorCQkJZGV2ZGJnKGRldiwgInJlY2VpdmUgYWxsIG11bHRpY2FzdCBlbmFibGVkIik7CisJCXBkYXRhLT5tYWNfY3IgfD0gTUFDX0NSX01DUEFTXzsKKwkJcGRhdGEtPm1hY19jciAmPSB+KE1BQ19DUl9QUk1TXyB8IE1BQ19DUl9IUEZJTFRfKTsKKwl9IGVsc2UgaWYgKGRldi0+bmV0LT5tY19jb3VudCA+IDApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY19saXN0ID0gZGV2LT5uZXQtPm1jX2xpc3Q7CisJCWludCBjb3VudCA9IDA7CisKKwkJcGRhdGEtPm1hY19jciB8PSBNQUNfQ1JfSFBGSUxUXzsKKwkJcGRhdGEtPm1hY19jciAmPSB+KE1BQ19DUl9QUk1TXyB8IE1BQ19DUl9NQ1BBU18pOworCisJCXdoaWxlIChtY19saXN0KSB7CisJCQljb3VudCsrOworCQkJaWYgKG1jX2xpc3QtPmRtaV9hZGRybGVuID09IEVUSF9BTEVOKSB7CisJCQkJdTMyIGJpdG51bSA9IHNtc2M5NXh4X2hhc2gobWNfbGlzdC0+ZG1pX2FkZHIpOworCQkJCXUzMiBtYXNrID0gMHgwMSA8PCAoYml0bnVtICYgMHgxRik7CisJCQkJaWYgKGJpdG51bSAmIDB4MjApCisJCQkJCWhhc2hfaGkgfD0gbWFzazsKKwkJCQllbHNlCisJCQkJCWhhc2hfbG8gfD0gbWFzazsKKwkJCX0gZWxzZSB7CisJCQkJZGV2d2FybihkZXYsICJkbWlfYWRkcmxlbiAhPSA2Iik7CisJCQl9CisJCQltY19saXN0ID0gbWNfbGlzdC0+bmV4dDsKKwkJfQorCisJCWlmIChjb3VudCAhPSAoKHUzMilkZXYtPm5ldC0+bWNfY291bnQpKQorCQkJZGV2d2FybihkZXYsICJtY19jb3VudCAhPSBkZXYtPm1jX2NvdW50Iik7CisKKwkJaWYgKG5ldGlmX21zZ19kcnYoZGV2KSkKKwkJCWRldmRiZyhkZXYsICJIQVNISD0weCUwOFgsIEhBU0hMPTB4JTA4WCIsIGhhc2hfaGksCisJCQkJaGFzaF9sbyk7CisJfSBlbHNlIHsKKwkJaWYgKG5ldGlmX21zZ19kcnYoZGV2KSkKKwkJCWRldmRiZyhkZXYsICJyZWNlaXZlIG93biBwYWNrZXRzIG9ubHkiKTsKKwkJcGRhdGEtPm1hY19jciAmPQorCQkJfihNQUNfQ1JfUFJNU18gfCBNQUNfQ1JfTUNQQVNfIHwgTUFDX0NSX0hQRklMVF8pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5tYWNfY3JfbG9jaywgZmxhZ3MpOworCisJLyogSW5pdGlhdGUgYXN5bmMgd3JpdGVzLCBhcyB3ZSBjYW4ndCB3YWl0IGZvciBjb21wbGV0aW9uIGhlcmUgKi8KKwlzbXNjOTV4eF93cml0ZV9yZWdfYXN5bmMoZGV2LCBIQVNISCwgJmhhc2hfaGkpOworCXNtc2M5NXh4X3dyaXRlX3JlZ19hc3luYyhkZXYsIEhBU0hMLCAmaGFzaF9sbyk7CisJc21zYzk1eHhfd3JpdGVfcmVnX2FzeW5jKGRldiwgTUFDX0NSLCAmcGRhdGEtPm1hY19jcik7Cit9CisKK3N0YXRpYyB1OCBzbXNjOTV4eF9yZXNvbHZlX2Zsb3djdHJsX2Z1bGxkcGx4KHUxNiBsY2xhZHYsIHUxNiBybXRhZHYpCit7CisJdTggY2FwID0gMDsKKworCWlmIChsY2xhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCWlmIChsY2xhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQkJaWYgKHJtdGFkdiAmIExQQV9QQVVTRV9DQVApCisJCQkJY2FwID0gRkxPV19DVFJMX1RYIHwgRkxPV19DVFJMX1JYOworCQkJZWxzZSBpZiAocm10YWR2ICYgTFBBX1BBVVNFX0FTWU0pCisJCQkJY2FwID0gRkxPV19DVFJMX1JYOworCQl9IGVsc2UgeworCQkJaWYgKHJtdGFkdiAmIExQQV9QQVVTRV9DQVApCisJCQkJY2FwID0gRkxPV19DVFJMX1RYIHwgRkxPV19DVFJMX1JYOworCQl9CisJfSBlbHNlIGlmIChsY2xhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQlpZiAoKHJtdGFkdiAmIExQQV9QQVVTRV9DQVApICYmIChybXRhZHYgJiBMUEFfUEFVU0VfQVNZTSkpCisJCQljYXAgPSBGTE9XX0NUUkxfVFg7CisJfQorCisJcmV0dXJuIGNhcDsKK30KKworc3RhdGljIHZvaWQgc21zYzk1eHhfcGh5X3VwZGF0ZV9mbG93Y29udHJvbChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGR1cGxleCwKKwkJCQkJICAgIHUxNiBsY2xhZHYsIHUxNiBybXRhZHYpCit7CisJdTMyIGZsb3csIGFmY19jZmcgPSAwOworCisJaW50IHJldCA9IHNtc2M5NXh4X3JlYWRfcmVnKGRldiwgQUZDX0NGRywgJmFmY19jZmcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiZXJyb3IgcmVhZGluZyBBRkNfQ0ZHIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCXU4IGNhcCA9IHNtc2M5NXh4X3Jlc29sdmVfZmxvd2N0cmxfZnVsbGRwbHgobGNsYWR2LCBybXRhZHYpOworCisJCWlmIChjYXAgJiBGTE9XX0NUUkxfUlgpCisJCQlmbG93ID0gMHhGRkZGMDAwMjsKKwkJZWxzZQorCQkJZmxvdyA9IDA7CisKKwkJaWYgKGNhcCAmIEZMT1dfQ1RSTF9UWCkKKwkJCWFmY19jZmcgfD0gMHhGOworCQllbHNlCisJCQlhZmNfY2ZnICY9IH4weEY7CisKKwkJaWYgKG5ldGlmX21zZ19saW5rKGRldikpCisJCQlkZXZkYmcoZGV2LCAicnggcGF1c2UgJXMsIHR4IHBhdXNlICVzIiwKKwkJCQkoY2FwICYgRkxPV19DVFJMX1JYID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksCisJCQkJKGNhcCAmIEZMT1dfQ1RSTF9UWCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKwl9IGVsc2UgeworCQlpZiAobmV0aWZfbXNnX2xpbmsoZGV2KSkKKwkJCWRldmRiZyhkZXYsICJoYWxmIGR1cGxleCIpOworCQlmbG93ID0gMDsKKwkJYWZjX2NmZyB8PSAweEY7CisJfQorCisJc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgRkxPVywgZmxvdyk7CisJc21zYzk1eHhfd3JpdGVfcmVnKGRldiwJQUZDX0NGRywgYWZjX2NmZyk7Cit9CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IHNtc2M5NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisJc3RydWN0IG1paV9pZl9pbmZvICptaWkgPSAmZGV2LT5taWk7CisJc3RydWN0IGV0aHRvb2xfY21kIGVjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgbGNsYWR2LCBybXRhZHY7CisJdTMyIGludGRhdGE7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJc21zYzk1eHhfbWRpb19yZWFkKGRldi0+bmV0LCBtaWktPnBoeV9pZCwgUEhZX0lOVF9TUkMpOworCWludGRhdGEgPSAweEZGRkZGRkZGOworCXNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIElOVF9TVFMsIGludGRhdGEpOworCisJbWlpX2NoZWNrX21lZGlhKG1paSwgMSwgMSk7CisJbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksICZlY21kKTsKKwlsY2xhZHYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKwlybXRhZHYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIG1paS0+cGh5X2lkLCBNSUlfTFBBKTsKKworCWlmIChuZXRpZl9tc2dfbGluayhkZXYpKQorCQlkZXZkYmcoZGV2LCAic3BlZWQ6ICVkIGR1cGxleDogJWQgbGNsYWR2OiAlMDR4IHJtdGFkdjogJTA0eCIsCisJCQllY21kLnNwZWVkLCBlY21kLmR1cGxleCwgbGNsYWR2LCBybXRhZHYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5tYWNfY3JfbG9jaywgZmxhZ3MpOworCWlmIChlY21kLmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgeworCQlwZGF0YS0+bWFjX2NyICY9IH5NQUNfQ1JfRkRQWF87CisJCXBkYXRhLT5tYWNfY3IgfD0gTUFDX0NSX1JDVk9XTl87CisJfSBlbHNlIHsKKwkJcGRhdGEtPm1hY19jciAmPSB+TUFDX0NSX1JDVk9XTl87CisJCXBkYXRhLT5tYWNfY3IgfD0gTUFDX0NSX0ZEUFhfOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+bWFjX2NyX2xvY2ssIGZsYWdzKTsKKworCXNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIE1BQ19DUiwgcGRhdGEtPm1hY19jcik7CisKKwlzbXNjOTV4eF9waHlfdXBkYXRlX2Zsb3djb250cm9sKGRldiwgZWNtZC5kdXBsZXgsIGxjbGFkdiwgcm10YWR2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbXNjOTV4eF9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdTMyIGludGRhdGE7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDQpIHsKKwkJZGV2d2FybihkZXYsICJ1bmV4cGVjdGVkIHVyYiBsZW5ndGggJWQiLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KCZpbnRkYXRhLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgNCk7CisJbGUzMl90b19jcHVzKCZpbnRkYXRhKTsKKworCWlmIChuZXRpZl9tc2dfbGluayhkZXYpKQorCQlkZXZkYmcoZGV2LCAiaW50ZGF0YTogMHglMDhYIiwgaW50ZGF0YSk7CisKKwlpZiAoaW50ZGF0YSAmIElOVF9FTlBfUEhZX0lOVF8pCisJCXVzYm5ldF9kZWZlcl9rZXZlbnQoZGV2LCBFVkVOVF9MSU5LX1JFU0VUKTsKKwllbHNlCisJCWRldndhcm4oZGV2LCAidW5leHBlY3RlZCBpbnRlcnJ1cHQsIGludGRhdGE9MHglMDhYIiwgaW50ZGF0YSk7Cit9CisKKy8qIEVuYWJsZSBvciBkaXNhYmxlIFJ4IGNoZWNrc3VtIG9mZmxvYWQgZW5naW5lICovCitzdGF0aWMgaW50IHNtc2M5NXh4X3NldF9yeF9jc3VtKHN0cnVjdCB1c2JuZXQgKmRldiwgYm9vbCBlbmFibGUpCit7CisJdTMyIHJlYWRfYnVmOworCWludCByZXQgPSBzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIENPRV9DUiwgJnJlYWRfYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIENPRV9DUjogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChlbmFibGUpCisJCXJlYWRfYnVmIHw9IFJ4X0NPRV9FTl87CisJZWxzZQorCQlyZWFkX2J1ZiAmPSB+UnhfQ09FX0VOXzsKKworCXJldCA9IHNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIENPRV9DUiwgcmVhZF9idWYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHdyaXRlIENPRV9DUjogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChuZXRpZl9tc2dfaHcoZGV2KSkKKwkJZGV2ZGJnKGRldiwgIkNPRV9DUiA9IDB4JTA4eCIsIHJlYWRfYnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9ldGh0b29sX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJcmV0dXJuIE1BWF9FRVBST01fU0laRTsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9ldGh0b29sX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZSwgdTggKmRhdGEpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWVlLT5tYWdpYyA9IExBTjk1WFhfRUVQUk9NX01BR0lDOworCisJcmV0dXJuIHNtc2M5NXh4X3JlYWRfZWVwcm9tKGRldiwgZWUtPm9mZnNldCwgZWUtPmxlbiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfZXRodG9vbF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWUsIHU4ICpkYXRhKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoZWUtPm1hZ2ljICE9IExBTjk1WFhfRUVQUk9NX01BR0lDKSB7CisJCWRldndhcm4oZGV2LCAiRUVQUk9NOiBtYWdpYyB2YWx1ZSBtaXNtYXRjaCwgbWFnaWMgPSAweCV4IiwKKwkJCWVlLT5tYWdpYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBzbXNjOTV4eF93cml0ZV9lZXByb20oZGV2LCBlZS0+b2Zmc2V0LCBlZS0+bGVuLCBkYXRhKTsKK30KKworc3RhdGljIHUzMiBzbXNjOTV4eF9ldGh0b29sX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IHNtc2M5NXh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKKworCXJldHVybiBwZGF0YS0+dXNlX3J4X2NzdW07Cit9CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfZXRodG9vbF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgdmFsKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNtc2M5NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisKKwlwZGF0YS0+dXNlX3J4X2NzdW0gPSAhIXZhbDsKKworCXJldHVybiBzbXNjOTV4eF9zZXRfcnhfY3N1bShkZXYsIHBkYXRhLT51c2VfcnhfY3N1bSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc21zYzk1eHhfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rCT0gdXNibmV0X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0CT0gdXNibmV0X253YXlfcmVzZXQsCisJLmdldF9kcnZpbmZvCT0gdXNibmV0X2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAorCS5nZXRfc2V0dGluZ3MJPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5nZXRfZWVwcm9tX2xlbgk9IHNtc2M5NXh4X2V0aHRvb2xfZ2V0X2VlcHJvbV9sZW4sCisJLmdldF9lZXByb20JPSBzbXNjOTV4eF9ldGh0b29sX2dldF9lZXByb20sCisJLnNldF9lZXByb20JPSBzbXNjOTV4eF9ldGh0b29sX3NldF9lZXByb20sCisJLmdldF9yeF9jc3VtCT0gc21zYzk1eHhfZXRodG9vbF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JPSBzbXNjOTV4eF9ldGh0b29sX3NldF9yeF9jc3VtLAorfTsKKworc3RhdGljIGludCBzbXNjOTV4eF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZ2VuZXJpY19taWlfaW9jdGwoJmRldi0+bWlpLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzbXNjOTV4eF9pbml0X21hY19hZGRyZXNzKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwkvKiB0cnkgcmVhZGluZyBtYWMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWlmIChzbXNjOTV4eF9yZWFkX2VlcHJvbShkZXYsIEVFUFJPTV9NQUNfT0ZGU0VULCBFVEhfQUxFTiwKKwkJCWRldi0+bmV0LT5kZXZfYWRkcikgPT0gMCkgeworCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPm5ldC0+ZGV2X2FkZHIpKSB7CisJCQkvKiBlZXByb20gdmFsdWVzIGFyZSB2YWxpZCBzbyB1c2UgdGhlbSAqLworCQkJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCQkJZGV2ZGJnKGRldiwgIk1BQyBhZGRyZXNzIHJlYWQgZnJvbSBFRVBST00iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIG5vIGVlcHJvbSwgb3IgZWVwcm9tIHZhbHVlcyBhcmUgaW52YWxpZC4gZ2VuZXJhdGUgcmFuZG9tIE1BQyAqLworCXJhbmRvbV9ldGhlcl9hZGRyKGRldi0+bmV0LT5kZXZfYWRkcik7CisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJNQUMgYWRkcmVzcyBzZXQgdG8gcmFuZG9tX2V0aGVyX2FkZHIiKTsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUzMiBhZGRyX2xvID0gZGV2LT5uZXQtPmRldl9hZGRyWzBdIHwgZGV2LT5uZXQtPmRldl9hZGRyWzFdIDw8IDggfAorCQlkZXYtPm5ldC0+ZGV2X2FkZHJbMl0gPDwgMTYgfCBkZXYtPm5ldC0+ZGV2X2FkZHJbM10gPDwgMjQ7CisJdTMyIGFkZHJfaGkgPSBkZXYtPm5ldC0+ZGV2X2FkZHJbNF0gfCBkZXYtPm5ldC0+ZGV2X2FkZHJbNV0gPDwgODsKKwlpbnQgcmV0OworCisJcmV0ID0gc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgQUREUkwsIGFkZHJfbG8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHdyaXRlIEFERFJMOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgQUREUkgsIGFkZHJfaGkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHdyaXRlIEFERFJIOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0YXJ0cyB0aGUgVFggcGF0aCAqLworc3RhdGljIHZvaWQgc21zYzk1eHhfc3RhcnRfdHhfcGF0aChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IHNtc2M5NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmVnX3ZhbDsKKworCS8qIEVuYWJsZSBUeCBhdCBNQUMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPm1hY19jcl9sb2NrLCBmbGFncyk7CisJcGRhdGEtPm1hY19jciB8PSBNQUNfQ1JfVFhFTl87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPm1hY19jcl9sb2NrLCBmbGFncyk7CisKKwlzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBNQUNfQ1IsIHBkYXRhLT5tYWNfY3IpOworCisJLyogRW5hYmxlIFR4IGF0IFNDU1JzICovCisJcmVnX3ZhbCA9IFRYX0NGR19PTl87CisJc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgVFhfQ0ZHLCByZWdfdmFsKTsKK30KKworLyogU3RhcnRzIHRoZSBSZWNlaXZlIHBhdGggKi8KK3N0YXRpYyB2b2lkIHNtc2M5NXh4X3N0YXJ0X3J4X3BhdGgoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPm1hY19jcl9sb2NrLCBmbGFncyk7CisJcGRhdGEtPm1hY19jciB8PSBNQUNfQ1JfUlhFTl87CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPm1hY19jcl9sb2NrLCBmbGFncyk7CisKKwlzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBNQUNfQ1IsIHBkYXRhLT5tYWNfY3IpOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X3BoeV9pbml0aWFsaXplKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwkvKiBJbml0aWFsaXplIE1JSSBzdHJ1Y3R1cmUgKi8KKwlkZXYtPm1paS5kZXYgPSBkZXYtPm5ldDsKKwlkZXYtPm1paS5tZGlvX3JlYWQgPSBzbXNjOTV4eF9tZGlvX3JlYWQ7CisJZGV2LT5taWkubWRpb193cml0ZSA9IHNtc2M5NXh4X21kaW9fd3JpdGU7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJZGV2LT5taWkucGh5X2lkID0gU01TQzk1WFhfSU5URVJOQUxfUEhZX0lEOworCisJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCQlBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwKKwkJQURWRVJUSVNFX1BBVVNFX0FTWU0pOworCisJLyogcmVhZCB0byBjbGVhciAqLworCXNtc2M5NXh4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBQSFlfSU5UX1NSQyk7CisKKwlzbXNjOTV4eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIFBIWV9JTlRfTUFTSywKKwkJUEhZX0lOVF9NQVNLX0RFRkFVTFRfKTsKKwltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoZGV2KSkKKwkJZGV2ZGJnKGRldiwgInBoeSBpbml0aWFsaXNlZCBzdWNjZXNmdWxseSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IHNtc2M5NXh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKKwl1MzIgcmVhZF9idWYsIHdyaXRlX2J1ZiwgYnVyc3RfY2FwOworCWludCByZXQgPSAwLCB0aW1lb3V0OworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJlbnRlcmluZyBzbXNjOTV4eF9yZXNldCIpOworCisJd3JpdGVfYnVmID0gSFdfQ0ZHX0xSU1RfOworCXJldCA9IHNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIEhXX0NGRywgd3JpdGVfYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byB3cml0ZSBIV19DRkdfTFJTVF8gYml0IGluIEhXX0NGRyAiCisJCQkicmVnaXN0ZXIsIHJldCA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCXJldCA9IHNtc2M5NXh4X3JlYWRfcmVnKGRldiwgSFdfQ0ZHLCAmcmVhZF9idWYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBIV19DRkc6ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbXNsZWVwKDEwKTsKKwkJdGltZW91dCsrOworCX0gd2hpbGUgKChyZWFkX2J1ZiAmIEhXX0NGR19MUlNUXykgJiYgKHRpbWVvdXQgPCAxMDApKTsKKworCWlmICh0aW1lb3V0ID49IDEwMCkgeworCQlkZXZ3YXJuKGRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBMaXRlIFJlc2V0Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJd3JpdGVfYnVmID0gUE1fQ1RMX1BIWV9SU1RfOworCXJldCA9IHNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIFBNX0NUUkwsIHdyaXRlX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgUE1fQ1RSTDogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJcmV0ID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBQTV9DVFJMLCAmcmVhZF9idWYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBQTV9DVFJMOiAlZCIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1zbGVlcCgxMCk7CisJCXRpbWVvdXQrKzsKKwl9IHdoaWxlICgocmVhZF9idWYgJiBQTV9DVExfUEhZX1JTVF8pICYmICh0aW1lb3V0IDwgMTAwKSk7CisKKwlpZiAodGltZW91dCA+PSAxMDApIHsKKwkJZGV2d2FybihkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIFBIWSBSZXNldCIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNtc2M5NXh4X2luaXRfbWFjX2FkZHJlc3MoZGV2KTsKKworCXJldCA9IHNtc2M5NXh4X3NldF9tYWNfYWRkcmVzcyhkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJNQUMgQWRkcmVzczogJXMiLAorCQkJcHJpbnRfbWFjKG1hYywgZGV2LT5uZXQtPmRldl9hZGRyKSk7CisKKwlyZXQgPSBzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIEhXX0NGRywgJnJlYWRfYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIEhXX0NGRzogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChuZXRpZl9tc2dfaWZ1cChkZXYpKQorCQlkZXZkYmcoZGV2LCAiUmVhZCBWYWx1ZSBmcm9tIEhXX0NGRyA6IDB4JTA4eCIsIHJlYWRfYnVmKTsKKworCXJlYWRfYnVmIHw9IEhXX0NGR19CSVJfOworCisJcmV0ID0gc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgSFdfQ0ZHLCByZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgSFdfQ0ZHX0JJUl8gYml0IGluIEhXX0NGRyAiCisJCQkicmVnaXN0ZXIsIHJldCA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIEhXX0NGRywgJnJlYWRfYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIEhXX0NGRzogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAobmV0aWZfbXNnX2lmdXAoZGV2KSkKKwkJZGV2ZGJnKGRldiwgIlJlYWQgVmFsdWUgZnJvbSBIV19DRkcgYWZ0ZXIgd3JpdGluZyAiCisJCQkiSFdfQ0ZHX0JJUl86IDB4JTA4eCIsIHJlYWRfYnVmKTsKKworCWlmICghdHVyYm9fbW9kZSkgeworCQlidXJzdF9jYXAgPSAwOworCQlkZXYtPnJ4X3VyYl9zaXplID0gTUFYX1NJTkdMRV9QQUNLRVRfU0laRTsKKwl9IGVsc2UgaWYgKGRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJYnVyc3RfY2FwID0gREVGQVVMVF9IU19CVVJTVF9DQVBfU0laRSAvIEhTX1VTQl9QS1RfU0laRTsKKwkJZGV2LT5yeF91cmJfc2l6ZSA9IERFRkFVTFRfSFNfQlVSU1RfQ0FQX1NJWkU7CisJfSBlbHNlIHsKKwkJYnVyc3RfY2FwID0gREVGQVVMVF9GU19CVVJTVF9DQVBfU0laRSAvIEZTX1VTQl9QS1RfU0laRTsKKwkJZGV2LT5yeF91cmJfc2l6ZSA9IERFRkFVTFRfRlNfQlVSU1RfQ0FQX1NJWkU7CisJfQorCisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJyeF91cmJfc2l6ZT0lbGQiLCAodWxvbmcpZGV2LT5yeF91cmJfc2l6ZSk7CisKKwlyZXQgPSBzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBCVVJTVF9DQVAsIGJ1cnN0X2NhcCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgQlVSU1RfQ0FQOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBCVVJTVF9DQVAsICZyZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBCVVJTVF9DQVA6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJSZWFkIFZhbHVlIGZyb20gQlVSU1RfQ0FQIGFmdGVyIHdyaXRpbmc6IDB4JTA4eCIsCisJCQlyZWFkX2J1Zik7CisKKwlyZWFkX2J1ZiA9IERFRkFVTFRfQlVMS19JTl9ERUxBWTsKKwlyZXQgPSBzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBCVUxLX0lOX0RMWSwgcmVhZF9idWYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAicmV0ID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNtc2M5NXh4X3JlYWRfcmVnKGRldiwgQlVMS19JTl9ETFksICZyZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBCVUxLX0lOX0RMWTogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAobmV0aWZfbXNnX2lmdXAoZGV2KSkKKwkJZGV2ZGJnKGRldiwgIlJlYWQgVmFsdWUgZnJvbSBCVUxLX0lOX0RMWSBhZnRlciB3cml0aW5nOiAiCisJCQkiMHglMDh4IiwgcmVhZF9idWYpOworCisJcmV0ID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBIV19DRkcsICZyZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBIV19DRkc6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJSZWFkIFZhbHVlIGZyb20gSFdfQ0ZHOiAweCUwOHgiLCByZWFkX2J1Zik7CisKKwlpZiAodHVyYm9fbW9kZSkKKwkJcmVhZF9idWYgfD0gKEhXX0NGR19NRUZfIHwgSFdfQ0ZHX0JDRV8pOworCisJcmVhZF9idWYgJj0gfkhXX0NGR19SWERPRkZfOworCisJLyogc2V0IFJ4IGRhdGEgb2Zmc2V0PTIsIE1ha2UgSVAgaGVhZGVyIGFsaWducyBvbiB3b3JkIGJvdW5kYXJ5LiAqLworCXJlYWRfYnVmIHw9IE5FVF9JUF9BTElHTiA8PCA5OworCisJcmV0ID0gc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgSFdfQ0ZHLCByZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgSFdfQ0ZHIHJlZ2lzdGVyLCByZXQ9JWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNtc2M5NXh4X3JlYWRfcmVnKGRldiwgSFdfQ0ZHLCAmcmVhZF9idWYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHJlYWQgSFdfQ0ZHOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChuZXRpZl9tc2dfaWZ1cChkZXYpKQorCQlkZXZkYmcoZGV2LCAiUmVhZCBWYWx1ZSBmcm9tIEhXX0NGRyBhZnRlciB3cml0aW5nOiAweCUwOHgiLAorCQkJcmVhZF9idWYpOworCisJd3JpdGVfYnVmID0gMHhGRkZGRkZGRjsKKwlyZXQgPSBzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBJTlRfU1RTLCB3cml0ZV9idWYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHdyaXRlIElOVF9TVFMgcmVnaXN0ZXIsIHJldD0lZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBJRF9SRVYsICZyZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBJRF9SRVY6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKG5ldGlmX21zZ19pZnVwKGRldikpCisJCWRldmRiZyhkZXYsICJJRF9SRVYgPSAweCUwOHgiLCByZWFkX2J1Zik7CisKKwkvKiBJbml0IFR4ICovCisJd3JpdGVfYnVmID0gMDsKKwlyZXQgPSBzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBGTE9XLCB3cml0ZV9idWYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHdyaXRlIEZMT1c6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWFkX2J1ZiA9IEFGQ19DRkdfREVGQVVMVDsKKwlyZXQgPSBzbXNjOTV4eF93cml0ZV9yZWcoZGV2LCBBRkNfQ0ZHLCByZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgQUZDX0NGRzogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERvbid0IG5lZWQgbWFjX2NyX2xvY2sgZHVyaW5nIGluaXRpYWxpc2F0aW9uICovCisJcmV0ID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBNQUNfQ1IsICZwZGF0YS0+bWFjX2NyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIE1BQ19DUjogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEluaXQgUnggKi8KKwkvKiBTZXQgVmxhbiAqLworCXdyaXRlX2J1ZiA9ICh1MzIpRVRIX1BfODAyMVE7CisJcmV0ID0gc21zYzk1eHhfd3JpdGVfcmVnKGRldiwgVkxBTjEsIHdyaXRlX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gd3JpdGUgVkFOMTogJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEVuYWJsZSBvciBkaXNhYmxlIFJ4IGNoZWNrc3VtIG9mZmxvYWQgZW5naW5lICovCisJcmV0ID0gc21zYzk1eHhfc2V0X3J4X2NzdW0oZGV2LCBwZGF0YS0+dXNlX3J4X2NzdW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAiRmFpbGVkIHRvIHNldCBSeCBjc3VtIG9mZmxvYWQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzbXNjOTV4eF9zZXRfbXVsdGljYXN0KGRldi0+bmV0KTsKKworCWlmIChzbXNjOTV4eF9waHlfaW5pdGlhbGl6ZShkZXYpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBzbXNjOTV4eF9yZWFkX3JlZyhkZXYsIElOVF9FUF9DVEwsICZyZWFkX2J1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2d2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCBJTlRfRVBfQ1RMOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZW5hYmxlIFBIWSBpbnRlcnJ1cHRzICovCisJcmVhZF9idWYgfD0gSU5UX0VQX0NUTF9QSFlfSU5UXzsKKworCXJldCA9IHNtc2M5NXh4X3dyaXRlX3JlZyhkZXYsIElOVF9FUF9DVEwsIHJlYWRfYnVmKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZ3YXJuKGRldiwgIkZhaWxlZCB0byB3cml0ZSBJTlRfRVBfQ1RMOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc21zYzk1eHhfc3RhcnRfdHhfcGF0aChkZXYpOworCXNtc2M5NXh4X3N0YXJ0X3J4X3BhdGgoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZ1cChkZXYpKQorCQlkZXZkYmcoZGV2LCAic21zYzk1eHhfcmVzZXQsIHJldHVybiAwIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zYzk1eHhfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IE5VTEw7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gU01TQ19DSElQTkFNRSAiIHYiIFNNU0NfRFJJVkVSX1ZFUlNJT04gIlxuIik7CisKKwlyZXQgPSB1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsIGludGYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldndhcm4oZGV2LCAidXNibmV0X2dldF9lbmRwb2ludHMgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2LT5kYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpa3phbGxvYyhzaXplb2Yoc3RydWN0IHNtc2M5NXh4X3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKKworCXBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisJaWYgKCFwZGF0YSkgeworCQlkZXZ3YXJuKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzdHJ1Y3Qgc21zYzk1eHhfcHJpdiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmcGRhdGEtPm1hY19jcl9sb2NrKTsKKworCXBkYXRhLT51c2VfcnhfY3N1bSA9IERFRkFVTFRfUlhfQ1NVTV9FTkFCTEU7CisKKwkvKiBJbml0IGFsbCByZWdpc3RlcnMgKi8KKwlyZXQgPSBzbXNjOTV4eF9yZXNldChkZXYpOworCisJZGV2LT5uZXQtPmRvX2lvY3RsID0gc21zYzk1eHhfaW9jdGw7CisJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJnNtc2M5NXh4X2V0aHRvb2xfb3BzOworCWRldi0+bmV0LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzbXNjOTV4eF9zZXRfbXVsdGljYXN0OworCWRldi0+bmV0LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOworCWRldi0+bmV0LT5oYXJkX2hlYWRlcl9sZW4gKz0gU01TQzk1WFhfVFhfT1ZFUkhFQUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNtc2M5NXh4X3VuYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWlmIChwZGF0YSkgeworCQlpZiAobmV0aWZfbXNnX2lmZG93bihkZXYpKQorCQkJZGV2ZGJnKGRldiwgImZyZWUgcGRhdGEiKTsKKwkJa2ZyZWUocGRhdGEpOworCQlwZGF0YSA9IE5VTEw7CisJCWRldi0+ZGF0YVswXSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbXNjOTV4eF9yeF9jc3VtX29mZmxvYWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmNzdW0gPSAqKHUxNiAqKShza2JfdGFpbF9wb2ludGVyKHNrYikgLSAyKTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAyKTsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNtc2M5NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjOTV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CisKKwl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCXUzMiBoZWFkZXIsIGFsaWduX2NvdW50OworCQlzdHJ1Y3Qgc2tfYnVmZiAqYXhfc2tiOworCQl1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CisJCXUxNiBzaXplOworCisJCW1lbWNweSgmaGVhZGVyLCBza2ItPmRhdGEsIHNpemVvZihoZWFkZXIpKTsKKwkJbGUzMl90b19jcHVzKCZoZWFkZXIpOworCQlza2JfcHVsbChza2IsIDQgKyBORVRfSVBfQUxJR04pOworCQlwYWNrZXQgPSBza2ItPmRhdGE7CisKKwkJLyogZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCXNpemUgPSAodTE2KSgoaGVhZGVyICYgUlhfU1RTX0ZMXykgPj4gMTYpOworCQlhbGlnbl9jb3VudCA9ICg0IC0gKChzaXplICsgTkVUX0lQX0FMSUdOKSAlIDQpKSAlIDQ7CisKKwkJaWYgKHVubGlrZWx5KGhlYWRlciAmIFJYX1NUU19FU18pKSB7CisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihkZXYpKQorCQkJCWRldmRiZyhkZXYsICJFcnJvciBoZWFkZXI9MHglMDh4IiwgaGVhZGVyKTsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKworCQkJaWYgKGhlYWRlciAmIFJYX1NUU19DUkNfKSB7CisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCWlmIChoZWFkZXIgJiAoUlhfU1RTX1RMXyB8IFJYX1NUU19SRl8pKQorCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCisJCQkJaWYgKChoZWFkZXIgJiBSWF9TVFNfTEVfKSAmJgorCQkJCQkoIShoZWFkZXIgJiBSWF9TVFNfRlRfKSkpCisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRVRIX0ZSQU1FX0xFTiArIDQoQ1JDKSArIDIoQ09FKSArIDQoVmxhbikgKi8KKwkJCWlmICh1bmxpa2VseShzaXplID4gKEVUSF9GUkFNRV9MRU4gKyAxMikpKSB7CisJCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoZGV2KSkKKwkJCQkJZGV2ZGJnKGRldiwgInNpemUgZXJyIGhlYWRlcj0weCUwOHgiLAorCQkJCQkJaGVhZGVyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJLyogbGFzdCBmcmFtZSBpbiB0aGlzIGJhdGNoICovCisJCQlpZiAoc2tiLT5sZW4gPT0gc2l6ZSkgeworCQkJCWlmIChwZGF0YS0+dXNlX3J4X2NzdW0pCisJCQkJCXNtc2M5NXh4X3J4X2NzdW1fb2ZmbG9hZChza2IpOworCisJCQkJc2tiLT50cnVlc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWF4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KCFheF9za2IpKSB7CisJCQkJZGV2d2FybihkZXYsICJFcnJvciBhbGxvY2F0aW5nIHNrYiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlheF9za2ItPmxlbiA9IHNpemU7CisJCQlheF9za2ItPmRhdGEgPSBwYWNrZXQ7CisJCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihheF9za2IsIHNpemUpOworCisJCQlpZiAocGRhdGEtPnVzZV9yeF9jc3VtKQorCQkJCXNtc2M5NXh4X3J4X2NzdW1fb2ZmbG9hZChheF9za2IpOworCisJCQlheF9za2ItPnRydWVzaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZik7CisKKwkJCXVzYm5ldF9za2JfcmV0dXJuKGRldiwgYXhfc2tiKTsKKwkJfQorCisJCXNrYl9wdWxsKHNrYiwgc2l6ZSk7CisKKwkJLyogcGFkZGluZyBieXRlcyBiZWZvcmUgdGhlIG5leHQgZnJhbWUgc3RhcnRzICovCisJCWlmIChza2ItPmxlbikKKwkJCXNrYl9wdWxsKHNrYiwgYWxpZ25fY291bnQpOworCX0KKworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IDApKSB7CisJCWRldndhcm4oZGV2LCAiaW52YWxpZCByeCBsZW5ndGg8MCAlZCIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc21zYzk1eHhfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgZmxhZ3MpCit7CisJdTMyIHR4X2NtZF9hLCB0eF9jbWRfYjsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IFNNU0M5NVhYX1RYX09WRVJIRUFEKSB7CisJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwKKwkJCVNNU0M5NVhYX1RYX09WRVJIRUFELCAwLCBmbGFncyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IHNrYjI7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiX3B1c2goc2tiLCA0KTsKKwl0eF9jbWRfYiA9ICh1MzIpKHNrYi0+bGVuIC0gNCk7CisJY3B1X3RvX2xlMzJzKCZ0eF9jbWRfYik7CisJbWVtY3B5KHNrYi0+ZGF0YSwgJnR4X2NtZF9iLCA0KTsKKworCXNrYl9wdXNoKHNrYiwgNCk7CisJdHhfY21kX2EgPSAodTMyKShza2ItPmxlbiAtIDgpIHwgVFhfQ01EX0FfRklSU1RfU0VHXyB8CisJCVRYX0NNRF9BX0xBU1RfU0VHXzsKKwljcHVfdG9fbGUzMnMoJnR4X2NtZF9hKTsKKwltZW1jcHkoc2tiLT5kYXRhLCAmdHhfY21kX2EsIDQpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBzbXNjOTV4eF9pbmZvID0geworCS5kZXNjcmlwdGlvbgk9ICJzbXNjOTV4eCBVU0IgMi4wIEV0aGVybmV0IiwKKwkuYmluZAkJPSBzbXNjOTV4eF9iaW5kLAorCS51bmJpbmQJCT0gc21zYzk1eHhfdW5iaW5kLAorCS5saW5rX3Jlc2V0CT0gc21zYzk1eHhfbGlua19yZXNldCwKKwkucmVzZXQJCT0gc21zYzk1eHhfcmVzZXQsCisJLnJ4X2ZpeHVwCT0gc21zYzk1eHhfcnhfZml4dXAsCisJLnR4X2ZpeHVwCT0gc21zYzk1eHhfdHhfZml4dXAsCisJLnN0YXR1cwkJPSBzbXNjOTV4eF9zdGF0dXMsCisJLmZsYWdzCQk9IEZMQUdfRVRIRVIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgcHJvZHVjdHNbXSA9IHsKKwl7CisJCS8qIFNNU0M5NTAwIFVTQiBFdGhlcm5ldCBEZXZpY2UgKi8KKwkJVVNCX0RFVklDRSgweDA0MjQsIDB4OTUwMCksCisJCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmc21zYzk1eHhfaW5mbywKKwl9LAorCXsgfSwJCS8qIEVORCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwcm9kdWN0cyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzbXNjOTV4eF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNtc2M5NXh4IiwKKwkuaWRfdGFibGUJPSBwcm9kdWN0cywKKwkucHJvYmUJCT0gdXNibmV0X3Byb2JlLAorCS5zdXNwZW5kCT0gdXNibmV0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSB1c2JuZXRfcmVzdW1lLAorCS5kaXNjb25uZWN0CT0gdXNibmV0X2Rpc2Nvbm5lY3QsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbXNjOTV4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc21zYzk1eHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHNtc2M5NXh4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc21zYzk1eHhfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzbXNjOTV4eF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc21zYzk1eHhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk5hbmN5IExpbiIpOworTU9EVUxFX0FVVEhPUigiU3RldmUgR2xlbmRpbm5pbmcgPHN0ZXZlLmdsZW5kaW5uaW5nQHNtc2MuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTVNDOTVYWCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiNWM4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCkBAIC0wLDAgKzEsMjUzIEBACisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFNNU0MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NNU0M5NVhYX0gKKyNkZWZpbmUgX1NNU0M5NVhYX0gKKworLyogVHggY29tbWFuZCB3b3JkcyAqLworI2RlZmluZSBUWF9DTURfQV9EQVRBX09GRlNFVF8JCSgweDAwMUYwMDAwKQorI2RlZmluZSBUWF9DTURfQV9GSVJTVF9TRUdfCQkoMHgwMDAwMjAwMCkKKyNkZWZpbmUgVFhfQ01EX0FfTEFTVF9TRUdfCQkoMHgwMDAwMTAwMCkKKyNkZWZpbmUgVFhfQ01EX0FfQlVGX1NJWkVfCQkoMHgwMDAwMDdGRikKKworI2RlZmluZSBUWF9DTURfQl9DU1VNX0VOQUJMRQkJKDB4MDAwMDQwMDApCisjZGVmaW5lIFRYX0NNRF9CX0FERF9DUkNfRElTQUJMRV8JKDB4MDAwMDIwMDApCisjZGVmaW5lIFRYX0NNRF9CX0RJU0FCTEVfUEFERElOR18JKDB4MDAwMDEwMDApCisjZGVmaW5lIFRYX0NNRF9CX1BLVF9CWVRFX0xFTkdUSF8JKDB4MDAwMDA3RkYpCisKKy8qIFJ4IHN0YXR1cyB3b3JkICovCisjZGVmaW5lIFJYX1NUU19GRl8JCQkoMHg0MDAwMDAwMCkJLyogRmlsdGVyIEZhaWwgKi8KKyNkZWZpbmUgUlhfU1RTX0ZMXwkJCSgweDNGRkYwMDAwKQkvKiBGcmFtZSBMZW5ndGggKi8KKyNkZWZpbmUgUlhfU1RTX0VTXwkJCSgweDAwMDA4MDAwKQkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFJYX1NUU19CRl8JCQkoMHgwMDAwMjAwMCkJLyogQnJvYWRjYXN0IEZyYW1lICovCisjZGVmaW5lIFJYX1NUU19MRV8JCQkoMHgwMDAwMTAwMCkJLyogTGVuZ3RoIEVycm9yICovCisjZGVmaW5lIFJYX1NUU19SRl8JCQkoMHgwMDAwMDgwMCkJLyogUnVudCBGcmFtZSAqLworI2RlZmluZSBSWF9TVFNfTUZfCQkJKDB4MDAwMDA0MDApCS8qIE11bHRpY2FzdCBGcmFtZSAqLworI2RlZmluZSBSWF9TVFNfVExfCQkJKDB4MDAwMDAwODApCS8qIEZyYW1lIHRvbyBsb25nICovCisjZGVmaW5lIFJYX1NUU19DU18JCQkoMHgwMDAwMDA0MCkJLyogQ29sbGlzaW9uIFNlZW4gKi8KKyNkZWZpbmUgUlhfU1RTX0ZUXwkJCSgweDAwMDAwMDIwKQkvKiBGcmFtZSBUeXBlICovCisjZGVmaW5lIFJYX1NUU19SV18JCQkoMHgwMDAwMDAxMCkJLyogUmVjZWl2ZSBXYXRjaGRvZyAqLworI2RlZmluZSBSWF9TVFNfTUVfCQkJKDB4MDAwMDAwMDgpCS8qIE1paSBFcnJvciAqLworI2RlZmluZSBSWF9TVFNfREJfCQkJKDB4MDAwMDAwMDQpCS8qIERyaWJibGluZyAqLworI2RlZmluZSBSWF9TVFNfQ1JDXwkJCSgweDAwMDAwMDAyKQkvKiBDUkMgRXJyb3IgKi8KKworLyogU0NTUnMgKi8KKyNkZWZpbmUgSURfUkVWCQkJCSgweDAwKQorI2RlZmluZSBJRF9SRVZfQ0hJUF9JRF9NQVNLXwkJKDB4RkZGRjAwMDApCisjZGVmaW5lIElEX1JFVl9DSElQX1JFVl9NQVNLXwkJKDB4MDAwMEZGRkYpCisjZGVmaW5lIElEX1JFVl9DSElQX0lEXzk1MDBfCQkoMHg5NTAwKQorCisjZGVmaW5lIElOVF9TVFMJCQkJKDB4MDgpCisjZGVmaW5lIElOVF9TVFNfVFhfU1RPUF8JCSgweDAwMDIwMDAwKQorI2RlZmluZSBJTlRfU1RTX1JYX1NUT1BfCQkoMHgwMDAxMDAwMCkKKyNkZWZpbmUgSU5UX1NUU19QSFlfSU5UXwkJKDB4MDAwMDgwMDApCisjZGVmaW5lIElOVF9TVFNfVFhFXwkJCSgweDAwMDA0MDAwKQorI2RlZmluZSBJTlRfU1RTX1RERlVfCQkJKDB4MDAwMDIwMDApCisjZGVmaW5lIElOVF9TVFNfVERGT18JCQkoMHgwMDAwMTAwMCkKKyNkZWZpbmUgSU5UX1NUU19SWERGXwkJCSgweDAwMDAwODAwKQorI2RlZmluZSBJTlRfU1RTX0dQSU9TXwkJCSgweDAwMDAwN0ZGKQorCisjZGVmaW5lIFJYX0NGRwkJCQkoMHgwQykKKyNkZWZpbmUgUlhfRklGT19GTFVTSF8JCQkoMHgwMDAwMDAwMSkKKworI2RlZmluZSBUWF9DRkcJCQkJKDB4MTApCisjZGVmaW5lIFRYX0NGR19PTl8JCQkoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFhfQ0ZHX1NUT1BfCQkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRYX0NGR19GSUZPX0ZMVVNIXwkJKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgSFdfQ0ZHCQkJCSgweDE0KQorI2RlZmluZSBIV19DRkdfQklSXwkJCSgweDAwMDAxMDAwKQorI2RlZmluZSBIV19DRkdfTEVEQl8JCQkoMHgwMDAwMDgwMCkKKyNkZWZpbmUgSFdfQ0ZHX1JYRE9GRl8JCQkoMHgwMDAwMDYwMCkKKyNkZWZpbmUgSFdfQ0ZHX0RSUF8JCQkoMHgwMDAwMDA0MCkKKyNkZWZpbmUgSFdfQ0ZHX01FRl8JCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgSFdfQ0ZHX0xSU1RfCQkJKDB4MDAwMDAwMDgpCisjZGVmaW5lIEhXX0NGR19QU0VMXwkJCSgweDAwMDAwMDA0KQorI2RlZmluZSBIV19DRkdfQkNFXwkJCSgweDAwMDAwMDAyKQorI2RlZmluZSBIV19DRkdfU1JTVF8JCQkoMHgwMDAwMDAwMSkKKworI2RlZmluZSBQTV9DVFJMCQkJCSgweDIwKQorI2RlZmluZSBQTV9DVExfREVWX1JEWV8JCQkoMHgwMDAwMDA4MCkKKyNkZWZpbmUgUE1fQ1RMX1NVU19NT0RFXwkJKDB4MDAwMDAwNjApCisjZGVmaW5lIFBNX0NUTF9TVVNfTU9ERV8wCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUE1fQ1RMX1NVU19NT0RFXzEJCSgweDAwMDAwMDIwKQorI2RlZmluZSBQTV9DVExfU1VTX01PREVfMgkJKDB4MDAwMDAwNjApCisjZGVmaW5lIFBNX0NUTF9QSFlfUlNUXwkJCSgweDAwMDAwMDEwKQorI2RlZmluZSBQTV9DVExfV09MX0VOXwkJCSgweDAwMDAwMDA4KQorI2RlZmluZSBQTV9DVExfRURfRU5fCQkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIFBNX0NUTF9XVVBTXwkJCSgweDAwMDAwMDAzKQorI2RlZmluZSBQTV9DVExfV1VQU19OT18JCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgUE1fQ1RMX1dVUFNfRURfCQkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIFBNX0NUTF9XVVBTX1dPTF8JCSgweDAwMDAwMDAyKQorI2RlZmluZSBQTV9DVExfV1VQU19NVUxUSV8JCSgweDAwMDAwMDAzKQorCisjZGVmaW5lIExFRF9HUElPX0NGRwkJCSgweDI0KQorCisjZGVmaW5lIEdQSU9fQ0ZHCQkJKDB4MjgpCisKKyNkZWZpbmUgQUZDX0NGRwkJCQkoMHgyQykKKworLyogSGkgd2F0ZXJtYXJrID0gMTUuNUtiICh+MTAgbXR1IHBrdHMpICovCisvKiBsb3cgd2F0ZXJtYXJrID0gM2sgKH4yIG10dSBwa3RzKSAqLworLyogYmFja3ByZXNzdXJlIGR1cmF0aW9uID0gfiAzNTB1cyAqLworLyogQXBwbHkgRkMgb24gYW55IGZyYW1lLiAqLworI2RlZmluZSBBRkNfQ0ZHX0RFRkFVTFQJCQkoMHgwMEY4MzBBMSkKKworI2RlZmluZSBFMlBfQ01ECQkJCSgweDMwKQorI2RlZmluZSBFMlBfQ01EX0JVU1lfCQkJKDB4ODAwMDAwMDApCisjZGVmaW5lIEUyUF9DTURfTUFTS18JCQkoMHg3MDAwMDAwMCkKKyNkZWZpbmUgRTJQX0NNRF9SRUFEXwkJCSgweDAwMDAwMDAwKQorI2RlZmluZSBFMlBfQ01EX0VXRFNfCQkJKDB4MTAwMDAwMDApCisjZGVmaW5lIEUyUF9DTURfRVdFTl8JCQkoMHgyMDAwMDAwMCkKKyNkZWZpbmUgRTJQX0NNRF9XUklURV8JCQkoMHgzMDAwMDAwMCkKKyNkZWZpbmUgRTJQX0NNRF9XUkFMXwkJCSgweDQwMDAwMDAwKQorI2RlZmluZSBFMlBfQ01EX0VSQVNFXwkJCSgweDUwMDAwMDAwKQorI2RlZmluZSBFMlBfQ01EX0VSQUxfCQkJKDB4NjAwMDAwMDApCisjZGVmaW5lIEUyUF9DTURfUkVMT0FEXwkJCSgweDcwMDAwMDAwKQorI2RlZmluZSBFMlBfQ01EX1RJTUVPVVRfCQkoMHgwMDAwMDQwMCkKKyNkZWZpbmUgRTJQX0NNRF9MT0FERURfCQkJKDB4MDAwMDAyMDApCisjZGVmaW5lIEUyUF9DTURfQUREUl8JCQkoMHgwMDAwMDFGRikKKworI2RlZmluZSBNQVhfRUVQUk9NX1NJWkUJCQkoNTEyKQorCisjZGVmaW5lIEUyUF9EQVRBCQkJKDB4MzQpCisjZGVmaW5lIEUyUF9EQVRBX01BU0tfCQkJKDB4MDAwMDAwRkYpCisKKyNkZWZpbmUgQlVSU1RfQ0FQCQkJKDB4MzgpCisKKyNkZWZpbmUgR1BJT19XQUtFCQkJKDB4NjQpCisKKyNkZWZpbmUgSU5UX0VQX0NUTAkJCSgweDY4KQorI2RlZmluZSBJTlRfRVBfQ1RMX0lOVEVQXwkJKDB4ODAwMDAwMDApCisjZGVmaW5lIElOVF9FUF9DVExfTUFDUlRPXwkJKDB4MDAwODAwMDApCisjZGVmaW5lIElOVF9FUF9DVExfVFhfU1RPUF8JCSgweDAwMDIwMDAwKQorI2RlZmluZSBJTlRfRVBfQ1RMX1JYX1NUT1BfCQkoMHgwMDAxMDAwMCkKKyNkZWZpbmUgSU5UX0VQX0NUTF9QSFlfSU5UXwkJKDB4MDAwMDgwMDApCisjZGVmaW5lIElOVF9FUF9DVExfVFhFXwkJCSgweDAwMDA0MDAwKQorI2RlZmluZSBJTlRfRVBfQ1RMX1RERlVfCQkoMHgwMDAwMjAwMCkKKyNkZWZpbmUgSU5UX0VQX0NUTF9UREZPXwkJKDB4MDAwMDEwMDApCisjZGVmaW5lIElOVF9FUF9DVExfUlhERl8JCSgweDAwMDAwODAwKQorI2RlZmluZSBJTlRfRVBfQ1RMX0dQSU9TXwkJKDB4MDAwMDA3RkYpCisKKyNkZWZpbmUgQlVMS19JTl9ETFkJCQkoMHg2QykKKworLyogTUFDIENTUnMgKi8KKyNkZWZpbmUgTUFDX0NSCQkJCSgweDEwMCkKKyNkZWZpbmUgTUFDX0NSX1JYQUxMXwkJCSgweDgwMDAwMDAwKQorI2RlZmluZSBNQUNfQ1JfUkNWT1dOXwkJCSgweDAwODAwMDAwKQorI2RlZmluZSBNQUNfQ1JfTE9PUEJLXwkJCSgweDAwMjAwMDAwKQorI2RlZmluZSBNQUNfQ1JfRkRQWF8JCQkoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTUFDX0NSX01DUEFTXwkJCSgweDAwMDgwMDAwKQorI2RlZmluZSBNQUNfQ1JfUFJNU18JCQkoMHgwMDA0MDAwMCkKKyNkZWZpbmUgTUFDX0NSX0lOVkZJTFRfCQkJKDB4MDAwMjAwMDApCisjZGVmaW5lIE1BQ19DUl9QQVNTQkFEXwkJCSgweDAwMDEwMDAwKQorI2RlZmluZSBNQUNfQ1JfSEZJTFRfCQkJKDB4MDAwMDgwMDApCisjZGVmaW5lIE1BQ19DUl9IUEZJTFRfCQkJKDB4MDAwMDIwMDApCisjZGVmaW5lIE1BQ19DUl9MQ09MTF8JCQkoMHgwMDAwMTAwMCkKKyNkZWZpbmUgTUFDX0NSX0JDQVNUXwkJCSgweDAwMDAwODAwKQorI2RlZmluZSBNQUNfQ1JfRElTUlRZXwkJCSgweDAwMDAwNDAwKQorI2RlZmluZSBNQUNfQ1JfUEFEU1RSXwkJCSgweDAwMDAwMTAwKQorI2RlZmluZSBNQUNfQ1JfQk9MTVRfTUFTSwkJKDB4MDAwMDAwQzApCisjZGVmaW5lIE1BQ19DUl9ERkNIS18JCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTUFDX0NSX1RYRU5fCQkJKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1BQ19DUl9SWEVOXwkJCSgweDAwMDAwMDA0KQorCisjZGVmaW5lIEFERFJICQkJCSgweDEwNCkKKworI2RlZmluZSBBRERSTAkJCQkoMHgxMDgpCisKKyNkZWZpbmUgSEFTSEgJCQkJKDB4MTBDKQorCisjZGVmaW5lIEhBU0hMCQkJCSgweDExMCkKKworI2RlZmluZSBNSUlfQUREUgkJCSgweDExNCkKKyNkZWZpbmUgTUlJX1dSSVRFXwkJCSgweDAyKQorI2RlZmluZSBNSUlfQlVTWV8JCQkoMHgwMSkKKyNkZWZpbmUgTUlJX1JFQURfCQkJKDB4MDApIC8qIH5vZiBNSUkgV3JpdGUgYml0ICovCisKKyNkZWZpbmUgTUlJX0RBVEEJCQkoMHgxMTgpCisKKyNkZWZpbmUgRkxPVwkJCQkoMHgxMUMpCisjZGVmaW5lIEZMT1dfRkNQVF8JCQkoMHhGRkZGMDAwMCkKKyNkZWZpbmUgRkxPV19GQ1BBU1NfCQkJKDB4MDAwMDAwMDQpCisjZGVmaW5lIEZMT1dfRkNFTl8JCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgRkxPV19GQ0JTWV8JCQkoMHgwMDAwMDAwMSkKKworI2RlZmluZSBWTEFOMQkJCQkoMHgxMjApCisKKyNkZWZpbmUgVkxBTjIJCQkJKDB4MTI0KQorCisjZGVmaW5lIFdVRkYJCQkJKDB4MTI4KQorCisjZGVmaW5lIFdVQ1NSCQkJCSgweDEyQykKKworI2RlZmluZSBDT0VfQ1IJCQkJKDB4MTMwKQorI2RlZmluZSBUeF9DT0VfRU5fCQkJKDB4MDAwMTAwMDApCisjZGVmaW5lIFJ4X0NPRV9NT0RFXwkJCSgweDAwMDAwMDAyKQorI2RlZmluZSBSeF9DT0VfRU5fCQkJKDB4MDAwMDAwMDEpCisKKy8qIFZlbmRvci1zcGVjaWZpYyBQSFkgRGVmaW5pdGlvbnMgKi8KKworLyogTW9kZSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTU9ERV9DVFJMX1NUUwkJKDE3KQorI2RlZmluZSBNT0RFX0NUUkxfU1RTX0VEUFdSRE9XTl8JKCh1MTYpMHgyMDAwKQorI2RlZmluZSBNT0RFX0NUUkxfU1RTX0VORVJHWU9OXwkJKCh1MTYpMHgwMDAyKQorCisjZGVmaW5lIFNQRUNJQUxfQ1RSTF9TVFMJCSgyNykKKyNkZWZpbmUgU1BFQ0lBTF9DVFJMX1NUU19PVlJSRF9BTURJWF8JKCh1MTYpMHg4MDAwKQorI2RlZmluZSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8JKCh1MTYpMHg0MDAwKQorI2RlZmluZSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXwkoKHUxNikweDIwMDApCisKKyNkZWZpbmUgUEhZX0lOVF9TUkMJCQkoMjkpCisjZGVmaW5lIFBIWV9JTlRfU1JDX0VORVJHWV9PTl8JCSgodTE2KTB4MDA4MCkKKyNkZWZpbmUgUEhZX0lOVF9TUkNfQU5FR19DT01QXwkJKCh1MTYpMHgwMDQwKQorI2RlZmluZSBQSFlfSU5UX1NSQ19SRU1PVEVfRkFVTFRfCSgodTE2KTB4MDAyMCkKKyNkZWZpbmUgUEhZX0lOVF9TUkNfTElOS19ET1dOXwkJKCh1MTYpMHgwMDEwKQorCisjZGVmaW5lIFBIWV9JTlRfTUFTSwkJCSgzMCkKKyNkZWZpbmUgUEhZX0lOVF9NQVNLX0VORVJHWV9PTl8JCSgodTE2KTB4MDA4MCkKKyNkZWZpbmUgUEhZX0lOVF9NQVNLX0FORUdfQ09NUF8JCSgodTE2KTB4MDA0MCkKKyNkZWZpbmUgUEhZX0lOVF9NQVNLX1JFTU9URV9GQVVMVF8JKCh1MTYpMHgwMDIwKQorI2RlZmluZSBQSFlfSU5UX01BU0tfTElOS19ET1dOXwkJKCh1MTYpMHgwMDEwKQorI2RlZmluZSBQSFlfSU5UX01BU0tfREVGQVVMVF8JCShQSFlfSU5UX01BU0tfQU5FR19DT01QXyB8IFwKKwkJCQkJIFBIWV9JTlRfTUFTS19MSU5LX0RPV05fKQorCisjZGVmaW5lIFBIWV9TUEVDSUFMCQkJKDMxKQorI2RlZmluZSBQSFlfU1BFQ0lBTF9TUERfCQkoKHUxNikweDAwMUMpCisjZGVmaW5lIFBIWV9TUEVDSUFMX1NQRF8xMEhBTEZfCQkoKHUxNikweDAwMDQpCisjZGVmaW5lIFBIWV9TUEVDSUFMX1NQRF8xMEZVTExfCQkoKHUxNikweDAwMTQpCisjZGVmaW5lIFBIWV9TUEVDSUFMX1NQRF8xMDBIQUxGXwkoKHUxNikweDAwMDgpCisjZGVmaW5lIFBIWV9TUEVDSUFMX1NQRF8xMDBGVUxMXwkoKHUxNikweDAwMTgpCisKKy8qIFVTQiBWZW5kb3IgUmVxdWVzdHMgKi8KKyNkZWZpbmUgVVNCX1ZFTkRPUl9SRVFVRVNUX1dSSVRFX1JFR0lTVEVSCTB4QTAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9SRVFVRVNUX1JFQURfUkVHSVNURVIJMHhBMQorI2RlZmluZSBVU0JfVkVORE9SX1JFUVVFU1RfR0VUX1NUQVRTCQkweEEyCisKKy8qIEludGVycnVwdCBFbmRwb2ludCBzdGF0dXMgd29yZCBiaXRmaWVsZHMgKi8KKyNkZWZpbmUgSU5UX0VOUF9UWF9TVE9QXwkJKCh1MzIpQklUKDE3KSkKKyNkZWZpbmUgSU5UX0VOUF9SWF9TVE9QXwkJKCh1MzIpQklUKDE2KSkKKyNkZWZpbmUgSU5UX0VOUF9QSFlfSU5UXwkJKCh1MzIpQklUKDE1KSkKKyNkZWZpbmUgSU5UX0VOUF9UWEVfCQkJKCh1MzIpQklUKDE0KSkKKyNkZWZpbmUgSU5UX0VOUF9UREZVXwkJCSgodTMyKUJJVCgxMykpCisjZGVmaW5lIElOVF9FTlBfVERGT18JCQkoKHUzMilCSVQoMTIpKQorI2RlZmluZSBJTlRfRU5QX1JYREZfCQkJKCh1MzIpQklUKDExKSkKKworI2VuZGlmIC8qIF9TTVNDOTVYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKaW5kZXggODQ2M2VmYi4uMDJkMjVjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTUxMiwxNCArNTEyLDEzIEBACiAJaW50CQkJY291bnQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZxLT5sb2NrLCBmbGFncyk7Ci0JZm9yIChza2IgPSBxLT5uZXh0OyBza2IgIT0gKHN0cnVjdCBza19idWZmICopIHE7IHNrYiA9IHNrYm5leHQpIHsKKwlza2JfcXVldWVfd2Fsa19zYWZlKHEsIHNrYiwgc2tibmV4dCkgewogCQlzdHJ1Y3Qgc2tiX2RhdGEJCSplbnRyeTsKIAkJc3RydWN0IHVyYgkJKnVyYjsKIAkJaW50CQkJcmV0dmFsOwogCiAJCWVudHJ5ID0gKHN0cnVjdCBza2JfZGF0YSAqKSBza2ItPmNiOwogCQl1cmIgPSBlbnRyeS0+dXJiOwotCQlza2JuZXh0ID0gc2tiLT5uZXh0OwogCiAJCS8vIGR1cmluZyBzb21lIFBNLWRyaXZlbiByZXN1bWUgc2NlbmFyaW9zLAogCQkvLyB0aGVzZSAoYXN5bmMpIHVubGlua3MgY29tcGxldGUgaW1tZWRpYXRlbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKaW5kZXggOTZkZmYwNC4uNWI3ODcwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTkxNCw3ICs5MTQsNyBAQAogCiAJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IocnAtPnJ4X2J1Zl9zeik7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgcnAtPnJ4X2J1Zl9zeik7CiAJCXJwLT5yeF9za2J1ZmZbaV0gPSBza2I7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwpAQCAtMTQ3Myw4ICsxNDczLDggQEAKIAkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQKIAkJCSAgIGNvcHlpbmcgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKLQkJCQkoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQkoc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHBrdF9sZW4gKyBORVRfSVBfQUxJR04pKSAhPSBOVUxMKSB7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocnAtPnBkZXYsCiAJCQkJCQkJICAgIHJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSwKIAkJCQkJCQkgICAgcnAtPnJ4X2J1Zl9zeiwKQEAgLTE1MTgsNyArMTUxOCw3IEBACiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCWVudHJ5ID0gcnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOwogCQlpZiAocnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgewotCQkJc2tiID0gZGV2X2FsbG9jX3NrYihycC0+cnhfYnVmX3N6KTsKKwkJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBycC0+cnhfYnVmX3N6KTsKIAkJCXJwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOwogCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCWJyZWFrOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwppbmRleCAwMDdjMTI5Li4yZGNlZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtMTIsNyArMTIsNyBAQAogICoJU2NhdHRlciBnYXRoZXIKICAqCU1vcmUgdGVzdGluZwogICoKLSAqIFRoZSBjaGFuZ2VzIGFyZSAoYykgQ29weXJpZ2h0IDIwMDQsIFJlZCBIYXQgSW5jLiA8YWxhbkByZWRoYXQuY29tPgorICogVGhlIGNoYW5nZXMgYXJlIChjKSBDb3B5cmlnaHQgMjAwNCwgUmVkIEhhdCBJbmMuIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiBBZGRpdGlvbmFsIGZpeGVzIGFuZCBjbGVhbiB1cDogRnJhbmNvaXMgUm9taWV1CiAgKgogICogVGhpcyBzb3VyY2UgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIGZvciB1c2UgaW4gc2FmZXR5IGNyaXRpY2FsIHN5c3RlbXMuCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogCQkJY29udGludWU7CiAJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiX2RtYSwgdnB0ci0+cnguYnVmX3N6LAogCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlyZF9pbmZvLT5za2JfZG1hID0gKGRtYV9hZGRyX3QpIE5VTEw7CisJCXJkX2luZm8tPnNrYl9kbWEgPSAwOwogCiAJCWRldl9rZnJlZV9za2IocmRfaW5mby0+c2tiKTsKIAkJcmRfaW5mby0+c2tiID0gTlVMTDsKQEAgLTEzMzMsNyArMTMzMyw3IEBACiAJCQlpZiAodGRfaW5mby0+c2tiX2RtYVtpXSkgewogCQkJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgdGRfaW5mby0+c2tiX2RtYVtpXSwKIAkJCQkJdGRfaW5mby0+c2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCXRkX2luZm8tPnNrYl9kbWFbaV0gPSAoZG1hX2FkZHJfdCkgTlVMTDsKKwkJCQl0ZF9pbmZvLT5za2JfZG1hW2ldID0gMDsKIAkJCX0KIAkJfQogCQlkZXZfa2ZyZWVfc2tiKHRkX2luZm8tPnNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaCBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oCmluZGV4IDFiOTViMDQuLjI5YTMzMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5oCkBAIC0xMzgxLDcgKzEzODEsNyBAQAogI2RlZmluZSBBU1NFUlQoeCkgeyBcCiAJaWYgKCEoeCkpIHsgXAogCQlwcmludGsoS0VSTl9FUlIgImFzc2VydGlvbiAlcyBmYWlsZWQ6IGZpbGUgJXMgbGluZSAlZFxuIiwgI3gsXAotCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7XAorCQkJX19mdW5jX18sIF9fTElORV9fKTtcCiAJCUJVRygpOyBcCiAJfVwKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKaW5kZXggMmFlMmVjNC4uMjFlZmQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiBjb25maWcgUEMzMDAKIAl0cmlzdGF0ZSAiQ3ljbGFkZXMtUEMzMDAgc3VwcG9ydCAoUlMtMjMyL1YuMzUsIFguMjEsIFQxL0UxIGJvYXJkcykiCi0JZGVwZW5kcyBvbiBIRExDICYmIFBDSQorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kgJiYgQlJPS0VOCiAJLS0taGVscC0tLQogCSAgRHJpdmVyIGZvciB0aGUgQ3ljbGFkZXMtUEMzMDAgc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBib2FyZHMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCmluZGV4IGYxNDA1MTUuLjdmOTdmOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpAQCAtMzg4LDggKzM4OCw4IEBACiAJCWdvdG8gb3V0X2NocmRldjsKIAl9CiAJZm9yIChpID0gMDsgaSA8IG5yX2NhcmRzOyBpKyspCi0JCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShjb3NhX2NsYXNzLCBOVUxMLCBNS0RFVihjb3NhX21ham9yLCBpKSwKLQkJCQkgICAgICBOVUxMLCAiY29zYSVkIiwgaSk7CisJCWRldmljZV9jcmVhdGUoY29zYV9jbGFzcywgTlVMTCwgTUtERVYoY29zYV9tYWpvciwgaSksIE5VTEwsCisJCQkgICAgICAiY29zYSVkIiwgaSk7CiAJZXJyID0gMDsKIAlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYwppbmRleCBkMTRlNjY3Li5hNWRkYzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYworKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJaWYgKGNmbS0+dmVyc2lvbiAhPSBDRk1fVkVSU0lPTikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiVzOiBmaXJtd2FyZSBmb3JtYXQgJXUgcmVqZWN0ZWQhICIKIAkJCQkiRXhwZWN0aW5nICV1LlxuIiwKLQkJCQltb2RuYW1lLCBfX0ZVTkNUSU9OX18sIGNmbS0+dmVyc2lvbiwgQ0ZNX1ZFUlNJT04pOworCQkJCW1vZG5hbWUsIF9fZnVuY19fLCBjZm0tPnZlcnNpb24sIENGTV9WRVJTSU9OKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MjAsNyArNDIwLDcgQEAKICovCiAJaWYgKGNrc3VtICE9IGNmbS0+Y2hlY2tzdW0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgY29ycnVwdGVkIVxuIiwKLQkJCQltb2RuYW1lLCBfX0ZVTkNUSU9OX18pOworCQkJCW1vZG5hbWUsIF9fZnVuY19fKTsKIAkJcHJpbnRrKEtFUk5fRVJSICIgY2RzaXplID0gMHgleCAoZXhwZWN0ZWQgMHglbHgpXG4iLAogCQkJCWxlbiAtIChpbnQpc2l6ZW9mKHN0cnVjdCBjeWN4X2Zpcm13YXJlKSAtIDEsCiAJCQkJY2ZtLT5pbmZvLmNvZGVzaXplKTsKQEAgLTQzMiw3ICs0MzIsNyBAQAogCS8qIElmIGV2ZXJ5dGhpbmcgaXMgb2ssIHNldCByZXNldCwgZGF0YSBhbmQgY29kZSBwb2ludGVycyAqLwogCWltZ19oZHIgPSAoc3RydWN0IGN5Y3hfZndfaGVhZGVyICopJmNmbS0+aW1hZ2U7CiAjaWZkZWYgRklSTVdBUkVfREVCVUcKLQlwcmludGsoS0VSTl9JTkZPICIlczolczogaW1hZ2Ugc2l6ZXNcbiIsIF9fRlVOQ1RJT05fXywgbW9kbmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6JXM6IGltYWdlIHNpemVzXG4iLCBfX2Z1bmNfXywgbW9kbmFtZSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiIHJlc2V0PSVsdVxuIiwgaW1nX2hkci0+cmVzZXRfc2l6ZSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBkYXRhPSVsdVxuIiwgaW1nX2hkci0+ZGF0YV9zaXplKTsKIAlwcmludGsoS0VSTl9JTkZPICIgIGNvZGU9JWx1XG4iLCBpbWdfaGRyLT5jb2RlX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwppbmRleCBkM2IyOGIwLi41YTczMDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYworKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwpAQCAtODc0LDcgKzg3NCw3IEBACiAJCW5pYmJsZV90b19ieXRlKGQgKyAoc2l6ZWxvYyA+PiAxKSwgcmVtLCBzaXplcmVtLCBzaXplbG9jICYgMSk7CiAKIAlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6bGNuPSVkLCBsb2NhbD0lcywgcmVtb3RlPSVzXG4iLAotCQkJICBfX0ZVTkNUSU9OX18sIGxjbiwgbG9jLCByZW0pOworCQkJICBfX2Z1bmNfXywgbGNuLCBsb2MsIHJlbSk7CiAKIAlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHdhbmRldiwgcmVtKTsKIAlpZiAoIWRldikgewpAQCAtOTAyLDcgKzkwMiw3IEBACiAJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKIAljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDEsICZrZXksIHNpemVvZihrZXkpKTsKIAlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICVzOmxjbj0lZCwga2V5PSVkXG4iLAotCQkJICBjYXJkLT5kZXZuYW1lLCBfX0ZVTkNUSU9OX18sIGxjbiwga2V5KTsKKwkJCSAgY2FyZC0+ZGV2bmFtZSwgX19mdW5jX18sIGxjbiwga2V5KTsKIAogCWRldiA9IGN5Y3hfeDI1X2dldF9kZXZfYnlfbGNuKHdhbmRldiwgLWtleSk7CiAJaWYgKCFkZXYpIHsKQEAgLTkyOSw3ICs5MjksNyBAQAogCiAJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKIAlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICVzOmxjbj0lZFxuIiwKLQkJCSAgY2FyZC0+ZGV2bmFtZSwgX19GVU5DVElPTl9fLCBsY24pOworCQkJICBjYXJkLT5kZXZuYW1lLCBfX2Z1bmNfXywgbGNuKTsKIAlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CiAJaWYgKCFkZXYpIHsKIAkJLyogSW52YWxpZCBjaGFubmVsLCBkaXNjYXJkIHBhY2tldCAqLwpAQCAtOTUwLDcgKzk1MCw3IEBACiAJdTggbGNuOwogCiAJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKLQlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6bGNuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxjbik7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOmxjbj0lZFxuIiwgX19mdW5jX18sIGxjbik7CiAKIAlkZXYgPSBjeWN4X3gyNV9nZXRfZGV2X2J5X2xjbih3YW5kZXYsIGxjbik7CiAJaWYgKGRldikgewpAQCAtMTM4MSw3ICsxMzgxLDcgQEAKIAkJY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KGRldik7CiAJZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBmb3Igc3ZjICglcykgbm90IGNvbm5lY3RlZCFcbiIsCi0JCQkJY2hhbi0+Y2FyZC0+ZGV2bmFtZSwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUpOworCQkJCWNoYW4tPmNhcmQtPmRldm5hbWUsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogfQogCiAvKiBTZXQgbG9naWNhbCBjaGFubmVsIHN0YXRlLiAqLwpAQCAtMTQ4NSw3ICsxNDg1LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwdHI7CiAKIAlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCmluZGV4IGY1ZDU1YWQuLjVmMWNjYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC02NDcsNyArNjQ3LDcgQEAKIAogCXNrYiA9IGRwcml2LT5yeF9za2J1ZmZbZHByaXYtPnJ4X2N1cnJlbnQrKyVSWF9SSU5HX1NJWkVdOwogCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tiPTAgKCVzKVxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNrYj0wICglcylcbiIsIGRldi0+bmFtZSwgX19mdW5jX18pOwogCQlnb3RvIHJlZmlsbDsKIAl9CiAJcGt0X2xlbiA9IFRPX1NJWkUobGUzMl90b19jcHUocnhfZmQtPnN0YXRlMikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY194MjUuYwppbmRleCA4YjdlNWQyLi5jYmNiZjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY194MjUuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY194MjUuYwpAQCAtMTYzLDE1ICsxNjMsMTcgQEAKIAogc3RhdGljIGludCB4MjVfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisKIAlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCXNrYi0+ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAJfQogCi0JaWYgKGxhcGJfZGF0YV9yZWNlaXZlZChza2ItPmRldiwgc2tiKSA9PSBMQVBCX09LKQorCWlmIChsYXBiX2RhdGFfcmVjZWl2ZWQoZGV2LCBza2IpID09IExBUEJfT0spCiAJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKIAotCXNrYi0+ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCmluZGV4IDQ1MThkMGEuLjQ5MTdhOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYworKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKQEAgLTU0OCw3ICs1NDgsNyBAQAogewogCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCiAKLQlDUENfVFRZX0RCRygiJXM6IHNldDoleCBjbGVhcjoleFxuIiwgX19GVU5DVElPTl9fLCBzZXQsIGNsZWFyKTsKKwlDUENfVFRZX0RCRygiJXM6IHNldDoleCBjbGVhcjoleFxuIiwgX19mdW5jX18sIHNldCwgY2xlYXIpOwogCiAJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CiAJICAgCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byBjaGFycyBpbiBidWZmZXJcbiIpOwkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCmluZGV4IDY1OTZjZDAuLmY5NzJmZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuYwpAQCAtODU2LDcgKzg1Niw3IEBACiAJCWxlbiA9IFNCTklfTUlOX0xFTjsKIAogCW5sLT50eF9idWZfcAk9IHNrYjsKLQlubC0+dHhfZnJhbWVubwk9IChsZW4gKyBubC0+bWF4ZnJhbWUgLSAxKSAvIG5sLT5tYXhmcmFtZTsKKwlubC0+dHhfZnJhbWVubwk9IERJVl9ST1VORF9VUChsZW4sIG5sLT5tYXhmcmFtZSk7CiAJbmwtPmZyYW1lbGVuCT0gbGVuIDwgbmwtPm1heGZyYW1lICA/ICBsZW4gIDogIG5sLT5tYXhmcmFtZTsKIAogCW91dGIoIGluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICkgfCBUUl9SRVEsICBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwppbmRleCAyNDNiZDhkLi5jY2Q5Y2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCkBAIC0xOCw3ICsxOCw4IEBACiAgKglETUEgbm93IHVzZXMgZ2V0X2ZyZWVfcGFnZSBhcyBrbWFsbG9jIGJ1ZmZlcnMgbWF5IHNwYW4gYSA2NEsgCiAgKglib3VuZGFyeS4KICAqCi0gKglNb2RpZmllZCBmb3IgU01QIHNhZmV0eSBhbmQgU01QIGxvY2tpbmcgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCU1vZGlmaWVkIGZvciBTTVAgc2FmZXR5IGFuZCBTTVAgbG9ja2luZyBieSBBbGFuIENveAorICoJCQkJCTxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJUGVyZm9ybWFuY2UKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmggYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmgKaW5kZXggNGYzNzIzOS4uODViM2U3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaApAQCAtMiw3ICsyLDcgQEAKICAqCURlc2NyaXB0aW9uIG9mIFo4NTMwIFo4NUMzMCBhbmQgWjg1MjMwIGNvbW11bmljYXRpb25zIGNoaXBzCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqIENvcHlyaWdodCAoQykgMTk5OCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogQ29weXJpZ2h0IChDKSAxOTk4IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKi8KIAogI2lmbmRlZiBfWjg1MzBfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggOTkzMWI1YS4uNDViZGYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0zMDAsNiArMzAwLDE5IEBACiAJLS0taGVscC0tLQogCSAgRGVidWdnaW5nIHN1cHBvcnQuCiAKK2NvbmZpZyBMSUJFUlRBU19USElORklSTQorCXRyaXN0YXRlICJNYXJ2ZWxsIDh4eHggTGliZXJ0YXMgV0xBTiBkcml2ZXIgc3VwcG9ydCB3aXRoIHRoaW4gZmlybXdhcmUiCisJZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIE1BQzgwMjExCisJc2VsZWN0IEZXX0xPQURFUgorCS0tLWhlbHAtLS0KKwkgIEEgbGlicmFyeSBmb3IgTWFydmVsbCBMaWJlcnRhcyA4eHh4IGRldmljZXMgdXNpbmcgdGhpbmZpcm0uCisKK2NvbmZpZyBMSUJFUlRBU19USElORklSTV9VU0IKKwl0cmlzdGF0ZSAiTWFydmVsbCBMaWJlcnRhcyA4Mzg4IFVTQiA4MDIuMTFiL2cgY2FyZHMgd2l0aCB0aGluIGZpcm13YXJlIgorCWRlcGVuZHMgb24gTElCRVJUQVNfVEhJTkZJUk0gJiYgVVNCCisJLS0taGVscC0tLQorCSAgQSBkcml2ZXIgZm9yIE1hcnZlbGwgTGliZXJ0YXMgODM4OCBVU0IgZGV2aWNlcyB1c2luZyB0aGluZmlybS4KKwogY29uZmlnIEFJUk8KIAl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBJU0EgYW5kIFBDSSBjYXJkcyIKIAlkZXBlbmRzIG9uIElTQV9ETUFfQVBJICYmIFdMQU5fODAyMTEgJiYgKFBDSSB8fCBCUk9LRU4pCkBAIC0zMjIsNiArMzM1LDkgQEAKIAl0cmlzdGF0ZSAiSGVybWVzIGNoaXBzZXQgODAyLjExYiBzdXBwb3J0IChPcmlub2NvL1ByaXNtMi9TeW1ib2wpIgogCWRlcGVuZHMgb24gKFBQQ19QTUFDIHx8IFBDSSB8fCBQQ01DSUEpICYmIFdMQU5fODAyMTEKIAlzZWxlY3QgV0lSRUxFU1NfRVhUCisJc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX01JQ0hBRUxfTUlDCiAJLS0taGVscC0tLQogCSAgQSBkcml2ZXIgZm9yIDgwMi4xMWIgd2lyZWxlc3MgY2FyZHMgYmFzZWQgb24gdGhlICJIZXJtZXMiIG9yCiAJICBJbnRlcnNpbCBIRkEzODR4IChQcmlzbSAyKSBNQUMgY29udHJvbGxlci4gIFRoaXMgaW5jbHVkZXMgdGhlIHZhc3QKQEAgLTQxMSw3ICs0MjcsNiBAQAogY29uZmlnIFBDTUNJQV9TUEVDVFJVTQogCXRyaXN0YXRlICJTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5IFBDTUNJQSBjYXJkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ01DSUEgJiYgSEVSTUVTCi0Jc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgODAyLjExYiBjYXJkcyB1c2luZyBSQU0tbG9hZGFibGUgU3ltYm9sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCmluZGV4IDU5YWE4OWUuLjU5ZDJkODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw3IEBACiBvYmotJChDT05GSUdfUENNQ0lBX05FVFdBVkUpCSs9IG5ldHdhdmVfY3Mubwogb2JqLSQoQ09ORklHX1BDTUNJQV9XQVZFTEFOKQkrPSB3YXZlbGFuX2NzLm8KIAotb2JqLSQoQ09ORklHX0hFUk1FUykJCSs9IG9yaW5vY28ubyBoZXJtZXMubworb2JqLSQoQ09ORklHX0hFUk1FUykJCSs9IG9yaW5vY28ubyBoZXJtZXMubyBoZXJtZXNfZGxkLm8KIG9iai0kKENPTkZJR19QQ01DSUFfSEVSTUVTKQkrPSBvcmlub2NvX2NzLm8KIG9iai0kKENPTkZJR19BUFBMRV9BSVJQT1JUKQkrPSBhaXJwb3J0Lm8KIG9iai0kKENPTkZJR19QTFhfSEVSTUVTKQkrPSBvcmlub2NvX3BseC5vCkBAIC00OCw2ICs0OCw4IEBACiBvYmotJChDT05GSUdfVVNCX1pEMTIwMSkJKz0gemQxMjAxLm8KIG9iai0kKENPTkZJR19MSUJFUlRBUykJCSs9IGxpYmVydGFzLwogCitvYmotJChDT05GSUdfTElCRVJUQVNfVEhJTkZJUk0pCSs9IGxpYmVydGFzX3RmLworCiBydGw4MTgwLW9ianMJCTo9IHJ0bDgxODBfZGV2Lm8gcnRsODE4MF9ydGw4MjI1Lm8gcnRsODE4MF9zYTI0MDAubyBydGw4MTgwX21heDI4MjAubyBydGw4MTgwX2dyZjUxMDEubwogcnRsODE4Ny1vYmpzCQk6PSBydGw4MTg3X2Rldi5vIHJ0bDgxODdfcnRsODIyNS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYwppbmRleCAzMzMzZDQ1Li5iMmMwNTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jCkBAIC03NjUsMTEgKzc2NSwxMSBAQAogCiAJcHJpdi0+c29mdF9yeF9jcmMgPSAwOwogCXN3aXRjaCAocHJpdi0+bW9kZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcHJpdi0+bmFyICY9IH4oQURNODIxMV9OQVJfUFIgfCBBRE04MjExX05BUl9FQSk7CiAJCXByaXYtPm5hciB8PSBBRE04MjExX05BUl9TVCB8IEFETTgyMTFfTkFSX1NSOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJcHJpdi0+bmFyICY9IH5BRE04MjExX05BUl9QUjsKIAkJcHJpdi0+bmFyIHw9IEFETTgyMTFfTkFSX0VBIHwgQURNODIxMV9OQVJfU1QgfCBBRE04MjExX05BUl9TUjsKIApAQCAtNzc3LDcgKzc3Nyw3IEBACiAJCWlmIChwcml2LT5wZGV2LT5yZXZpc2lvbiA+PSBBRE04MjExX1JFVl9CQSkKIAkJCXByaXYtPnNvZnRfcnhfY3JjID0gMTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJcHJpdi0+bmFyICY9IH4oQURNODIxMV9OQVJfRUEgfCBBRE04MjExX05BUl9TVCk7CiAJCXByaXYtPm5hciB8PSBBRE04MjExX05BUl9QUiB8IEFETTgyMTFfTkFSX1NSOwogCQlicmVhazsKQEAgLTE0MTAsMTEgKzE0MTAsMTEgQEAKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCiB7CiAJc3RydWN0IGFkbTgyMTFfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQlpZiAocHJpdi0+bW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKQorCWlmIChwcml2LT5tb2RlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCXN3aXRjaCAoY29uZi0+dHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcHJpdi0+bW9kZSA9IGNvbmYtPnR5cGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNDM3LDcgKzE0MzcsNyBAQAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCiB7CiAJc3RydWN0IGFkbTgyMTFfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQlwcml2LT5tb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUjsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKIH0KIAogc3RhdGljIGludCBhZG04MjExX2luaXRfcmluZ3Moc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAlBRE04MjExX0NTUl9XUklURShJRVIsIEFETTgyMTFfSUVSX05JRSB8IEFETTgyMTFfSUVSX0FJRSB8CiAJCQkgICAgICAgQURNODIxMV9JRVJfUkNJRSB8IEFETTgyMTFfSUVSX1RDSUUgfAogCQkJICAgICAgIEFETTgyMTFfSUVSX1REVUlFIHwgQURNODIxMV9JRVJfR1BUSUUpOwotCXByaXYtPm1vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwogCWFkbTgyMTFfdXBkYXRlX21vZGUoZGV2KTsKIAlBRE04MjExX0NTUl9XUklURShSRFIsIDApOwogCkBAIC0xNTcxLDcgKzE1NzEsNyBAQAogewogCXN0cnVjdCBhZG04MjExX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAKLQlwcml2LT5tb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAJcHJpdi0+bmFyID0gMDsKIAlBRE04MjExX0NTUl9XUklURShOQVIsIDApOwogCUFETTgyMTFfQ1NSX1dSSVRFKElFUiwgMCk7CkBAIC0xODg0LDYgKzE4ODQsNyBAQAogCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGFkbTgyMTFfdHhfaGRyKTsKIAkvKiBkZXYtPmZsYWdzID0gSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyBpbiBwcm9taXNjIG1vZGUgKi8KIAlkZXYtPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUM7CisJZGV2LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwogCiAJZGV2LT5jaGFubmVsX2NoYW5nZV90aW1lID0gMTAwMDsKIAlkZXYtPm1heF9zaWduYWwgPSAxMDA7ICAgIC8qIEZJWE1FOiBmaW5kIGJldHRlciB2YWx1ZSAqLwpAQCAtMTg5NSw3ICsxODk2LDcgQEAKIAlwcml2LT50eF9wb3dlciA9IDB4NDA7CiAJcHJpdi0+bHBmX2N1dG9mZiA9IDB4RkY7CiAJcHJpdi0+bG5hZ3NfdGhyZXNob2xkID0gMHhGRjsKLQlwcml2LT5tb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAKIAkvKiBQb3dlci1vbiBpc3N1ZS4gRUVQUk9NIHdvbid0IHJlYWQgY29ycmVjdGx5IHdpdGhvdXQgKi8KIAlpZiAocGRldi0+cmV2aXNpb24gPj0gQURNODIxMV9SRVZfQkEpIHsKQEAgLTE5ODUsNyArMTk4Niw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhZG04MjExX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAKLQlpZiAocHJpdi0+bW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEKSB7CisJaWYgKHByaXYtPm1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpIHsKIAkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGRldik7CiAJCWFkbTgyMTFfc3RvcChkZXYpOwogCX0KQEAgLTIwMDMsNyArMjAwNCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCi0JaWYgKHByaXYtPm1vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRCkgeworCWlmIChwcml2LT5tb2RlICE9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKSB7CiAJCWFkbTgyMTFfc3RhcnQoZGV2KTsKIAkJaWVlZTgwMjExX3dha2VfcXVldWVzKGRldik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IGI1Y2Q4NTAuLjM3MDEzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTE5MTUsNyArMTkxNSw3IEBACiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAKIAlpZiAoIXNrYikgewotCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICIlczogc2tiID09IE5VTEwhIixfX0ZVTkNUSU9OX18pOworCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICIlczogc2tiID09IE5VTEwhIixfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlucGFja3MgPSBza2JfcXVldWVfbGVuICgmYWktPnR4cSk7CkBAIC0xOTY0LDcgKzE5NjQsNyBAQAogCWlmICgoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKSA9PSBOVUxMKSB7CiAJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwKIAkJCSIlczogRGVxdWV1ZSdkIHplcm8gaW4gc2VuZF9wYWNrZXQoKSIsCi0JCQlfX0ZVTkNUSU9OX18pOworCQkJX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxMTUsNyArMjExNSw3IEBACiAJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKIAogCWlmICggc2tiID09IE5VTEwgKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIiVzOiBza2IgPT0gTlVMTCEiLCBfX0ZVTkNUSU9OX18pOworCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICIlczogc2tiID09IE5VTEwhIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxODYsNyArMjE4Niw3IEBACiAJfQogCiAJaWYgKCBza2IgPT0gTlVMTCApIHsKLQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiJXM6IHNrYiA9PSBOVUxMISIsIF9fRlVOQ1RJT05fXyk7CisJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIiVzOiBza2IgPT0gTlVMTCEiLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDEyNyw3ICs0MTI3LDcgQEAKIAkJaWYgKHRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykgJiYgKFJJRF9XRVBfVEVNUCAhPSByaWQpKQogCQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwKIAkJCQkiJXM6IE1BQyBzaG91bGQgYmUgZGlzYWJsZWQgKHJpZD0lMDR4KSIsCi0JCQkJX19GVU5DVElPTl9fLCByaWQpOworCQkJCV9fZnVuY19fLCByaWQpOwogCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCQltZW1zZXQoJnJzcCwgMCwgc2l6ZW9mKHJzcCkpOwogCkBAIC00MTQyLDcgKzQxNDIsNyBAQAogCQkJJmFpLT5jb25maWdfZGVzYy5yaWRfZGVzYywgc2l6ZW9mKFJpZCkpOwogCiAJCWlmIChsZW4gPCA0IHx8IGxlbiA+IDIwNDcpIHsKLQkJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICIlczogbGVuPSVkIiwgX19GVU5DVElPTl9fLCBsZW4pOworCQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIiVzOiBsZW49JWQiLCBfX2Z1bmNfXywgbGVuKTsKIAkJCXJjID0gLTE7CiAJCX0gZWxzZSB7CiAJCQltZW1jcHkoKGNoYXIgKilhaS0+Y29uZmlnX2Rlc2MudmlydHVhbF9ob3N0X2FkZHIsCkBAIC00MTUxLDkgKzQxNTEsOSBAQAogCQkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOwogCQkJaWYgKChyYyAmIDB4ZmYwMCkgIT0gMCkgewogCQkJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICIlczogV3JpdGUgcmlkIEVycm9yICVkIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywgcmMpOworCQkJCQkJX19mdW5jX18sIHJjKTsKIAkJCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiJXM6IENtZD0lMDR4IiwKLQkJCQkJCV9fRlVOQ1RJT05fXywgY21kLmNtZCk7CisJCQkJCQlfX2Z1bmNfXywgY21kLmNtZCk7CiAJCQl9CiAKIAkJCWlmICgocnNwLnN0YXR1cyAmIDB4N2YwMCkpCkBAIC03MTA3LDcgKzcxMDcsNyBAQAogICovCiBzdGF0aWMgaW50IGFpcm9fc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCiAJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKaW5kZXggZjEyMzU1My4uMjc2OTZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJREVCVUcoMCwgImFpcm9fYXR0YWNoKClcbiIpOwogCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JcF9kZXYtPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworCXBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAlwX2Rldi0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogCXBfZGV2LT5pcnEuSGFuZGxlciA9IE5VTEw7CiAJCkBAIC0yMDYsMTI2ICsyMDYsMTIzIEBACiAjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKIGRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCiAKK3N0YXRpYyBpbnQgYWlyb19jc19jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZywKKwkJCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJCXVuc2lnbmVkIGludCB2Y2MsCisJCQkJdm9pZCAqcHJpdl9kYXRhKQoreworCXdpbl9yZXFfdCAqcmVxID0gcHJpdl9kYXRhOworCisJaWYgKGNmZy0+aW5kZXggPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CisJCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkJcF9kZXYtPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisJfQorCisJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0gY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwllbHNlIGlmIChkZmx0LT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQlwX2Rldi0+Y29uZi5WcHAgPSBkZmx0LT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKworCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LT5pcnEuSVJRSW5mbzEpCisJCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCisJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQtPmlvLm53aW4gPiAwKSkgeworCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQtPmlvOworCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCX0KKworCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICBOb3cgc2V0IHVwIGEgY29tbW9uIG1lbW9yeSB3aW5kb3csIGlmIG5lZWRlZC4gIFRoZXJlIGlzIHJvb20KKwkgIGluIHRoZSBzdHJ1Y3QgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgZm9yIG9uZSBtZW1vcnkgd2luZG93IGhhbmRsZSwKKwkgIGJ1dCBpZiB0aGUgYmFzZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBzYXZlZCwgb3IgaWYgbXVsdGlwbGUKKwkgIHdpbmRvd3MgYXJlIG5lZWRlZCwgdGhlIGluZm8gc2hvdWxkIGdvIGluIHRoZSBwcml2YXRlIGRhdGEKKwkgIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UuCisKKwkgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IHdpbmRvdyBiYXNlIGlzIGEgcGh5c2ljYWwgYWRkcmVzcywgYW5kCisJICBuZWVkcyB0byBiZSBtYXBwZWQgdG8gdmlydHVhbCBzcGFjZSB3aXRoIGlvcmVtYXAoKSBiZWZvcmUgaXQKKwkgIGlzIHVzZWQuCisJKi8KKwlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC0+bWVtLm53aW4gPiAwKSkgeworCQljaXN0cGxfbWVtX3QgKm1lbSA9IChjZmctPm1lbS5ud2luKSA/ICZjZmctPm1lbSA6ICZkZmx0LT5tZW07CisJCW1lbXJlcV90IG1hcDsKKwkJcmVxLT5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNOworCQlyZXEtPkJhc2UgPSBtZW0tPndpblswXS5ob3N0X2FkZHI7CisJCXJlcS0+U2l6ZSA9IG1lbS0+d2luWzBdLmxlbjsKKwkJcmVxLT5BY2Nlc3NTcGVlZCA9IDA7CisJCWlmIChwY21jaWFfcmVxdWVzdF93aW5kb3coJnBfZGV2LCByZXEsICZwX2Rldi0+d2luKSAhPSAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCW1hcC5QYWdlID0gMDsKKwkJbWFwLkNhcmRPZmZzZXQgPSBtZW0tPndpblswXS5jYXJkX2FkZHI7CisJCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LT53aW4sICZtYXApICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgYWlyb19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7Ci0JdHVwbGVfdCB0dXBsZTsKLQljaXNwYXJzZV90IHBhcnNlOwogCWxvY2FsX2luZm9fdCAqZGV2OworCXdpbl9yZXFfdCAqcmVxOwogCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKLQl1X2NoYXIgYnVmWzY0XTsKLQl3aW5fcmVxX3QgcmVxOwotCW1lbXJlcV90IG1hcDsKIAogCWRldiA9IGxpbmstPnByaXY7CiAKIAlERUJVRygwLCAiYWlyb19jb25maWcoMHglcClcbiIsIGxpbmspOwogCisJcmVxID0ga3phbGxvYyhzaXplb2Yod2luX3JlcV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyoKLQkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCi0JICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCi0JICB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCi0JICAKLQkgIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UgdXNlCi0JICBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsIHdvcmxkLAotCSAgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcyBhIGNvbXBsZXRlCi0JICBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkgImtub3dzIiBtb3N0IG9mCi0JICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCi0JICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJICogSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUKKwkgKiBlbnRyaWVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQKKwkgKiBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdm9sdGFnZSwgSU8gd2luZG93LCBtZW1vcnkgd2luZG93LAorCSAqIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICoKKwkgKiBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlCisJICogdXNlIGp1c3QgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQ0lTLiAgSW4gYW4gaWRlYWwKKwkgKiB3b3JsZCwgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcworCSAqIGEgY29tcGxldGUgYW5kIGFjY3VyYXRlIENJUy4gIEluIHByYWN0aWNlLCBhIGRyaXZlciB1c3VhbGx5CisJICogImtub3dzIiBtb3N0IG9mIHRoZXNlIHRoaW5ncyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIENJUywKKwkgKiBhbmQgbW9zdCBjbGllbnQgZHJpdmVycyB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbgorCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KKwkgKi8KKwlsYXN0X3JldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBhaXJvX2NzX2NvbmZpZ19jaGVjaywgcmVxKTsKKwlpZiAobGFzdF9yZXQpCisJCWdvdG8gZmFpbGVkOworCisJLyoKKwkgIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEKKwkgIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZQorCSAgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KIAkqLwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl3aGlsZSAoMSkgewotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpICE9IDAgfHwKLQkJCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0JCQotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOwotCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCQkKLQkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCi0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwotCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKLQkJfQotCQkKLQkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCi0JCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCWVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKLQkJCWxpbmstPmNvbmYuVnBwID0KLQkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOwotCQkKLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0JCQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJfQotCQkKLQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykgIT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJCi0JCS8qCi0JCSAgTm93IHNldCB1cCBhIGNvbW1vbiBtZW1vcnkgd2luZG93LCBpZiBuZWVkZWQuICBUaGVyZSBpcyByb29tCi0JCSAgaW4gdGhlIHN0cnVjdCBwY21jaWFfZGV2aWNlIHN0cnVjdHVyZSBmb3Igb25lIG1lbW9yeSB3aW5kb3cgaGFuZGxlLAotCQkgIGJ1dCBpZiB0aGUgYmFzZSBhZGRyZXNzZXMgbmVlZCB0byBiZSBzYXZlZCwgb3IgaWYgbXVsdGlwbGUKLQkJICB3aW5kb3dzIGFyZSBuZWVkZWQsIHRoZSBpbmZvIHNob3VsZCBnbyBpbiB0aGUgcHJpdmF0ZSBkYXRhCi0JCSAgc3RydWN0dXJlIGZvciB0aGlzIGRldmljZS4KLQkJICAKLQkJICBOb3RlIHRoYXQgdGhlIG1lbW9yeSB3aW5kb3cgYmFzZSBpcyBhIHBoeXNpY2FsIGFkZHJlc3MsIGFuZAotCQkgIG5lZWRzIHRvIGJlIG1hcHBlZCB0byB2aXJ0dWFsIHNwYWNlIHdpdGggaW9yZW1hcCgpIGJlZm9yZSBpdAotCQkgIGlzIHVzZWQuCi0JCSovCi0JCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0Lm1lbS5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9tZW1fdCAqbWVtID0KLQkJCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC5tZW07Ci0JCQlyZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKLQkJCXJlcS5CYXNlID0gbWVtLT53aW5bMF0uaG9zdF9hZGRyOwotCQkJcmVxLlNpemUgPSBtZW0tPndpblswXS5sZW47Ci0JCQlyZXEuQWNjZXNzU3BlZWQgPSAwOwotCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbikgIT0gMCkKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQltYXAuUGFnZSA9IDA7IG1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOwotCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQotCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJfQotCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0JCWJyZWFrOwotCQkKLQluZXh0X2VudHJ5OgotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl9Ci0JCi0gICAgLyoKLSAgICAgIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEKLSAgICAgIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZQotICAgICAgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KLSAgICAqLwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CiAJCkBAIC0zNjIsMTQgKzM1OSwxNyBAQAogCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCiAJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwogCWlmIChsaW5rLT53aW4pCi0JCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLkJhc2UsCi0JCSAgICAgICByZXEuQmFzZStyZXEuU2l6ZS0xKTsKKwkJcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCByZXEtPkJhc2UsCisJCSAgICAgICByZXEtPkJhc2UrcmVxLT5TaXplLTEpOwogCXByaW50aygiXG4iKTsKKwlrZnJlZShyZXEpOwogCXJldHVybiAwOwogCiAgY3NfZmFpbGVkOgogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKKyBmYWlsZWQ6CiAJYWlyb19yZWxlYXNlKGxpbmspOworCWtmcmVlKHJlcSk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9IC8qIGFpcm9fY29uZmlnICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYwppbmRleCA2ZjdlYjlmLi5jZTAzYTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCkBAIC0xODAsNyArMTgwLDggQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLwotCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgYWlycG9ydF9oYXJkX3Jlc2V0KTsKKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksICZtZGV2LT5vZmRldi5kZXYsCisJCQkgICAgICAgYWlycG9ydF9oYXJkX3Jlc2V0LCBOVUxMKTsKIAlpZiAoISBkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL01ha2VmaWxlCmluZGV4IDU2NGVjZDAuLjcxOWNmYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL01ha2VmaWxlCkBAIC0xLDYgKzEsMTQgQEAKLWF0aDVrLXkJCQkJKz0gYmFzZS5vCi1hdGg1ay15CQkJCSs9IGh3Lm8KK2F0aDVrLXkJCQkJKz0gY2Fwcy5vCiBhdGg1ay15CQkJCSs9IGluaXR2YWxzLm8KK2F0aDVrLXkJCQkJKz0gZWVwcm9tLm8KK2F0aDVrLXkJCQkJKz0gZ3Bpby5vCithdGg1ay15CQkJCSs9IGRlc2MubworYXRoNWsteQkJCQkrPSBkbWEubworYXRoNWsteQkJCQkrPSBxY3UubworYXRoNWsteQkJCQkrPSBwY3UubwogYXRoNWsteQkJCQkrPSBwaHkubworYXRoNWsteQkJCQkrPSByZXNldC5vCithdGg1ay15CQkJCSs9IGF0dGFjaC5vCithdGg1ay15CQkJCSs9IGJhc2UubwogYXRoNWstJChDT05GSUdfQVRINUtfREVCVUcpCSs9IGRlYnVnLm8KIG9iai0kKENPTkZJR19BVEg1SykJCSs9IGF0aDVrLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9hdGg1ay5oCmluZGV4IDkxMDJlZWEuLjUzZWE0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2F0aDVrLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYXRoNWsuaApAQCAtMTgsMTggKzE4LDIzIEBACiAjaWZuZGVmIF9BVEg1S19ICiAjZGVmaW5lIF9BVEg1S19ICiAKLS8qIFNldCB0aGlzIHRvIDEgdG8gZGlzYWJsZSByZWd1bGF0b3J5IGRvbWFpbiByZXN0cmljdGlvbnMgZm9yIGNoYW5uZWwgdGVzdHMuCi0gKiBXQVJOSU5HOiBUaGlzIGlzIGZvciBkZWJ1Z2luZyBvbmx5IGFuZCBoYXMgc2lkZSBlZmZlY3RzIChlZy4gc2NhbiB0YWtlcyB0b28KLSAqIGxvbmcgYW5kIHJlc3VsdHMgdGltZW91dHMpLiBJdCdzIGFsc28gaWxsZWdhbCB0byB0dW5lIHRvIHNvbWUgb2YgdGhlCi0gKiBzdXBwb3J0ZWQgZnJlcXVlbmNpZXMgaW4gc29tZSBjb3VudHJpZXMsIHNvIHVzZSB0aGlzIGF0IHlvdXIgb3duIHJpc2ssCi0gKiB5b3UndmUgYmVlbiB3YXJuZWQuICovCisvKiBUT0RPOiBDbGVhbiB1cCBjaGFubmVsIGRlYnVnaW5nIC1kb2Vzbid0IHdvcmsgYW55d2F5LSBhbmQgc3RhcnQKKyAqIHdvcmtpbmcgb24gcmVnLiBjb250cm9sIGNvZGUgdXNpbmcgYWxsIGF2YWlsYWJsZSBlZXByb20gaW5mb3JtYXRpb24KKyAqIC1yZXYuIGVuZ2luZWVyaW5nIG5lZWRlZC0gKi8KICNkZWZpbmUgQ0hBTl9ERUJVRwkwCiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKLSNpbmNsdWRlICJody5oIgorLyogUlgvVFggZGVzY3JpcHRvciBodyBzdHJ1Y3RzCisgKiBUT0RPOiBEcml2ZXIgcGFydCBzaG91bGQgb25seSBzZWUgc3cgc3RydWN0cyAqLworI2luY2x1ZGUgImRlc2MuaCIKKworLyogRUVQUk9NIHN0cnVjdHMvb2Zmc2V0cworICogVE9ETzogTWFrZSBhIG1vcmUgZ2VuZXJpYyBzdHJ1Y3QgKGVnLiBhZGQgbW9yZSBzdHVmZiB0byBhdGg1a19jYXBhYmlsaXRpZXMpCisgKiBhbmQgY2xlYW4gdXAgY29tbW9uIGJpdHMsIHRoZW4gaW50cm9kdWNlIHNldC9nZXQgZnVuY3Rpb25zIGluIGVlcHJvbS5jICovCisjaW5jbHVkZSAiZWVwcm9tLmgiCiAKIC8qIFBDSSBJRHMgKi8KICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMCAJCTB4MDAwNyAvKiBBUjUyMTAgKi8KQEAgLTg3LDcgKzkyLDkyIEBACiAJQVRINUtfUFJJTlRLX0xJTUlUKF9zYywgS0VSTl9FUlIsIF9mbXQsICMjX19WQV9BUkdTX18pCiAKIC8qCisgKiBBUjVLIFJFR0lTVEVSIEFDQ0VTUworICovCisKKy8qIFNvbWUgbWFjcm9zIHRvIHJlYWQvd3JpdGUgZmllbGRzICovCisKKy8qIEZpcnN0IHNoaWZ0LCB0aGVuIG1hc2sgKi8KKyNkZWZpbmUgQVI1S19SRUdfU00oX3ZhbCwgX2ZsYWdzKQkJCQkJXAorCSgoKF92YWwpIDw8IF9mbGFncyMjX1MpICYgKF9mbGFncykpCisKKy8qIEZpcnN0IG1hc2ssIHRoZW4gc2hpZnQgKi8KKyNkZWZpbmUgQVI1S19SRUdfTVMoX3ZhbCwgX2ZsYWdzKQkJCQkJXAorCSgoKF92YWwpICYgKF9mbGFncykpID4+IF9mbGFncyMjX1MpCisKKy8qIFNvbWUgcmVnaXN0ZXJzIGNhbiBob2xkIG11bHRpcGxlIHZhbHVlcyBvZiBpbnRlcmVzdC4gRm9yIHRoaXMKKyAqIHJlYXNvbiB3aGVuIHdlIHdhbnQgdG8gd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXJzIHdlIG11c3QgZmlyc3QKKyAqIHJldHJpZXZlIHRoZSB2YWx1ZXMgd2hpY2ggd2UgZG8gbm90IHdhbnQgdG8gY2xlYXIgKGxldHMgY2FsbCB0aGlzCisgKiBvbGRfZGF0YSkgYW5kIHRoZW4gc2V0IHRoZSByZWdpc3RlciB3aXRoIHRoaXMgYW5kIG91ciBuZXdfdmFsdWU6CisgKiAoIG9sZF9kYXRhIHwgbmV3X3ZhbHVlKSAqLworI2RlZmluZSBBUjVLX1JFR19XUklURV9CSVRTKGFoLCBfcmVnLCBfZmxhZ3MsIF92YWwpCQkJXAorCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBfcmVnKSAmIH4oX2ZsYWdzKSkgfCBcCisJICAgICgoKF92YWwpIDw8IF9mbGFncyMjX1MpICYgKF9mbGFncykpLCBfcmVnKQorCisjZGVmaW5lIEFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBfcmVnLCBfZmxhZ3MsIF9tYXNrKQkJCVwKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIChhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJgkJXAorCQkJKF9tYXNrKSkgfCAoX2ZsYWdzKSwgX3JlZykKKworI2RlZmluZSBBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgX3JlZywgX2ZsYWdzKQkJCQlcCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgfCAoX2ZsYWdzKSwgX3JlZykKKworI2RlZmluZSBBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIF9yZWcsIF9mbGFncykJCQlcCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJiB+KF9mbGFncyksIF9yZWcpCisKKy8qIEFjY2VzcyB0byBQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFSNUtfUEhZX1JFQUQoYWgsIF9yZWcpCQkJCQlcCisJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIChhaCktPmFoX3BoeSArICgoX3JlZykgPDwgMikpCisKKyNkZWZpbmUgQVI1S19QSFlfV1JJVEUoYWgsIF9yZWcsIF92YWwpCQkJCQlcCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBfdmFsLCAoYWgpLT5haF9waHkgKyAoKF9yZWcpIDw8IDIpKQorCisvKiBBY2Nlc3MgUUNVIHJlZ2lzdGVycyBwZXIgcXVldWUgKi8KKyNkZWZpbmUgQVI1S19SRUdfUkVBRF9RKGFoLCBfcmVnLCBfcXVldWUpCQkJCVwKKwkoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIF9yZWcpICYgKDEgPDwgX3F1ZXVlKSkJCQlcCisKKyNkZWZpbmUgQVI1S19SRUdfV1JJVEVfUShhaCwgX3JlZywgX3F1ZXVlKQkJCQlcCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoMSA8PCBfcXVldWUpLCBfcmVnKQorCisjZGVmaW5lIEFSNUtfUV9FTkFCTEVfQklUUyhfcmVnLCBfcXVldWUpIGRvIHsJCQkJXAorCV9yZWcgfD0gMSA8PCBfcXVldWU7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBUjVLX1FfRElTQUJMRV9CSVRTKF9yZWcsIF9xdWV1ZSkgZG8gewkJCQlcCisJX3JlZyAmPSB+KDEgPDwgX3F1ZXVlKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBVc2VkIHdoaWxlIHdyaXRpbmcgaW5pdHZhbHMgKi8KKyNkZWZpbmUgQVI1S19SRUdfV0FJVChfaSkgZG8gewkJCQkJCVwKKwlpZiAoX2kgJSA2NCkJCQkJCQkJXAorCQl1ZGVsYXkoMSk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyogUmVnaXN0ZXIgZHVtcHMgYXJlIGRvbmUgcGVyIG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIEFSNUtfSU5JX1JGR0FJTl81R0haCQkwCisjZGVmaW5lIEFSNUtfSU5JX1JGR0FJTl8yR0haCQkxCisKKy8qIFRPRE86IENsZWFuIHRoaXMgdXAgKi8KKyNkZWZpbmUgQVI1S19JTklfVkFMXzExQQkJMAorI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFBX1RVUkJPCQkxCisjZGVmaW5lIEFSNUtfSU5JX1ZBTF8xMUIJCTIKKyNkZWZpbmUgQVI1S19JTklfVkFMXzExRwkJMworI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFHX1RVUkJPCQk0CisjZGVmaW5lIEFSNUtfSU5JX1ZBTF9YUgkJCTAKKyNkZWZpbmUgQVI1S19JTklfVkFMX01BWAkJNQorCisjZGVmaW5lIEFSNUtfUkY1MTExX0lOSV9SRl9NQVhfQkFOS1MJQVI1S19NQVhfUkZfQkFOS1MKKyNkZWZpbmUgQVI1S19SRjUxMTJfSU5JX1JGX01BWF9CQU5LUwlBUjVLX01BWF9SRl9CQU5LUworCisvKiBVc2VkIGZvciBCU1NJRCBldGMgbWFuaXB1bGF0aW9uICovCisjZGVmaW5lIEFSNUtfTE9XX0lEKF9hKSgJCQkJXAorKF9hKVswXSB8IChfYSlbMV0gPDwgOCB8IChfYSlbMl0gPDwgMTYgfCAoX2EpWzNdIDw8IDI0CVwKKykKKworI2RlZmluZSBBUjVLX0hJR0hfSUQoX2EpCSgoX2EpWzRdIHwgKF9hKVs1XSA8PCA4KQorCisvKgogICogU29tZSB0dW5lYWJsZSB2YWx1ZXMgKHRoZXNlIHNob3VsZCBiZSBjaGFuZ2VhYmxlIGJ5IHRoZSB1c2VyKQorICogVE9ETzogTWFrZSB1c2Ugb2YgdGhlbSBhbmQgYWRkIG1vcmUgb3B0aW9ucyBPUiB1c2UgZGVidWcvY29uZmlnZnMKICAqLwogI2RlZmluZSBBUjVLX1RVTkVfRE1BX0JFQUNPTl9SRVNQCQkyCiAjZGVmaW5lIEFSNUtfVFVORV9TV19CRUFDT05fUkVTUAkJMTAKQEAgLTk4LDEzICsxODgsMTMgQEAKICNkZWZpbmUgQVI1S19UVU5FX1JFR0lTVEVSX1RJTUVPVVQJCTIwMDAwCiAvKiBSZWdpc3RlciBmb3IgUlNTSSB0aHJlc2hvbGQgaGFzIGEgbWFzayBvZiAweGZmLCBzbyAyNTUgc2VlbXMgdG8KICAqIGJlIHRoZSBtYXggdmFsdWUuICovCi0jZGVmaW5lIEFSNUtfVFVORV9SU1NJX1RIUkVTICAgICAgICAgICAgICAgICAgIDEyOQorI2RlZmluZSBBUjVLX1RVTkVfUlNTSV9USFJFUwkJCTEyOQogLyogVGhpcyBtdXN0IGJlIHNldCB3aGVuIHNldHRpbmcgdGhlIFJTU0kgdGhyZXNob2xkIG90aGVyd2lzZSBpdCBjYW4KICAqIHByZXZlbnQgYSByZXNldC4gSWYgQVI1S19SU1NJX1RIUiBpcyByZWFkIGFmdGVyIHdyaXRpbmcgdG8gaXQKICAqIHRoZSBCTUlTU19USFJFUyB3aWxsIGJlIHNlZW4gYXMgMCwgc2VlbXMgaGFyd2FyZSBkb2Vzbid0IGtlZXAKICAqIHRyYWNrIG9mIGl0LiBNYXggdmFsdWUgZGVwZW5kcyBvbiBoYXJ3YXJlLiBGb3IgQVI1MjEwIHRoaXMgaXMganVzdCA3LgogICogRm9yIEFSNTIxMSsgdGhpcyBzZWVtcyB0byBiZSB1cCB0byAyNTUuICovCi0jZGVmaW5lIEFSNUtfVFVORV9CTUlTU19USFJFUyAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVI1S19UVU5FX0JNSVNTX1RIUkVTCQkJNwogI2RlZmluZSBBUjVLX1RVTkVfUkVHSVNURVJfRFdFTExfVElNRQkJMjAwMDAKICNkZWZpbmUgQVI1S19UVU5FX0JFQUNPTl9JTlRFUlZBTAkJMTAwCiAjZGVmaW5lIEFSNUtfVFVORV9BSUZTCQkJCTIKQEAgLTEyMyw2ICsyMTMsNTUgQEAKICNkZWZpbmUgQVI1S19UVU5FX0FOVF9ESVZFUlNJVFkJCQl0cnVlCiAjZGVmaW5lIEFSNUtfVFVORV9IV1RYVFJJRVMJCQk0CiAKKyNkZWZpbmUgQVI1S19JTklUX0NBUlJfU0VOU0VfRU4JCQkxCisKKy8qU3dhcCBSWC9UWCBEZXNjcmlwdG9yIGZvciBiaWcgZW5kaWFuIGFyY2hzKi8KKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgQVI1S19JTklUX0NGRwkoCQlcCisJQVI1S19DRkdfU1dURCB8IEFSNUtfQ0ZHX1NXUkQJXAorKQorI2Vsc2UKKyNkZWZpbmUgQVI1S19JTklUX0NGRwkweDAwMDAwMDAwCisjZW5kaWYKKworLyogSW5pdGlhbCB2YWx1ZXMgKi8KKyNkZWZpbmUgQVI1S19JTklUX1RYX0xBVEVOQ1kJCQk1MDIKKyNkZWZpbmUgQVI1S19JTklUX1VTRUMJCQkJMzkKKyNkZWZpbmUgQVI1S19JTklUX1VTRUNfVFVSQk8JCQk3OQorI2RlZmluZSBBUjVLX0lOSVRfVVNFQ18zMgkJCTMxCisjZGVmaW5lIEFSNUtfSU5JVF9TTE9UX1RJTUUJCQkzOTYKKyNkZWZpbmUgQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTwkJNDgwCisjZGVmaW5lIEFSNUtfSU5JVF9BQ0tfQ1RTX1RJTUVPVVQJCTEwMjQKKyNkZWZpbmUgQVI1S19JTklUX0FDS19DVFNfVElNRU9VVF9UVVJCTwkJMHgwODAwMDgwMAorI2RlZmluZSBBUjVLX0lOSVRfUFJPR19JRlMJCQk5MjAKKyNkZWZpbmUgQVI1S19JTklUX1BST0dfSUZTX1RVUkJPCQk5NjAKKyNkZWZpbmUgQVI1S19JTklUX0VJRlMJCQkJMzQ0MAorI2RlZmluZSBBUjVLX0lOSVRfRUlGU19UVVJCTwkJCTY4ODAKKyNkZWZpbmUgQVI1S19JTklUX1NJRlMJCQkJNTYwCisjZGVmaW5lIEFSNUtfSU5JVF9TSUZTX1RVUkJPCQkJNDgwCisjZGVmaW5lIEFSNUtfSU5JVF9TSF9SRVRSWQkJCTEwCisjZGVmaW5lIEFSNUtfSU5JVF9MR19SRVRSWQkJCUFSNUtfSU5JVF9TSF9SRVRSWQorI2RlZmluZSBBUjVLX0lOSVRfU1NIX1JFVFJZCQkJMzIKKyNkZWZpbmUgQVI1S19JTklUX1NMR19SRVRSWQkJCUFSNUtfSU5JVF9TU0hfUkVUUlkKKyNkZWZpbmUgQVI1S19JTklUX1RYX1JFVFJZCQkJMTAKKworI2RlZmluZSBBUjVLX0lOSVRfVFJBTlNNSVRfTEFURU5DWQkJKAkJCVwKKwkoQVI1S19JTklUX1RYX0xBVEVOQ1kgPDwgMTQpIHwgKEFSNUtfSU5JVF9VU0VDXzMyIDw8IDcpIHwJXAorCShBUjVLX0lOSVRfVVNFQykJCQkJCQlcCispCisjZGVmaW5lIEFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZX1RVUkJPCSgJCQlcCisJKEFSNUtfSU5JVF9UWF9MQVRFTkNZIDw8IDE0KSB8IChBUjVLX0lOSVRfVVNFQ18zMiA8PCA3KSB8CVwKKwkoQVI1S19JTklUX1VTRUNfVFVSQk8pCQkJCQkJXAorKQorI2RlZmluZSBBUjVLX0lOSVRfUFJPVE9fVElNRV9DTlRSTAkJKAkJCVwKKwkoQVI1S19JTklUX0NBUlJfU0VOU0VfRU4gPDwgMjYpIHwgKEFSNUtfSU5JVF9FSUZTIDw8IDEyKSB8CVwKKwkoQVI1S19JTklUX1BST0dfSUZTKQkJCQkJCVwKKykKKyNkZWZpbmUgQVI1S19JTklUX1BST1RPX1RJTUVfQ05UUkxfVFVSQk8JKAkJCVwKKwkoQVI1S19JTklUX0NBUlJfU0VOU0VfRU4gPDwgMjYpIHwgKEFSNUtfSU5JVF9FSUZTX1RVUkJPIDw8IDEyKSB8IFwKKwkoQVI1S19JTklUX1BST0dfSUZTX1RVUkJPKQkJCQkJXAorKQorCiAvKiB0b2tlbiB0byB1c2UgZm9yIGFpZnMsIGN3bWluLCBjd21heCBpbiBNYWRXaUZpICovCiAjZGVmaW5lCUFSNUtfVFhRX1VTRURFRkFVTFQJKCh1MzIpIC0xKQogCkBAIC0xNDIsNyArMjgxLDkgQEAKIAlBUjVLX1JGNTExMgk9IDIsCiAJQVI1S19SRjI0MTMJPSAzLAogCUFSNUtfUkY1NDEzCT0gNCwKLQlBUjVLX1JGMjQyNQk9IDUsCisJQVI1S19SRjIzMTYJPSA1LAorCUFSNUtfUkYyMzE3CT0gNiwKKwlBUjVLX1JGMjQyNQk9IDcsCiB9OwogCiAvKgpAQCAtMTUwLDcgKzI5MSw3IEBACiAgKi8KIAogZW51bSBhdGg1a19zcmV2X3R5cGUgewotCUFSNUtfVkVSU0lPTl9WRVIsCisJQVI1S19WRVJTSU9OX01BQywKIAlBUjVLX1ZFUlNJT05fUkFELAogfTsKIApAQCAtMTYyLDIzICszMDMsMjQgQEAKIAogI2RlZmluZSBBUjVLX1NSRVZfVU5LTk9XTgkweGZmZmYKIAotI2RlZmluZSBBUjVLX1NSRVZfVkVSX0FSNTIxMAkweDAwCi0jZGVmaW5lIEFSNUtfU1JFVl9WRVJfQVI1MzExCTB4MTAKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjUzMTFBCTB4MjAKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjUzMTFCCTB4MzAKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjUyMTEJMHg0MAotI2RlZmluZSBBUjVLX1NSRVZfVkVSX0FSNTIxMgkweDUwCi0jZGVmaW5lIEFSNUtfU1JFVl9WRVJfQVI1MjEzCTB4NTUKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjUyMTNBCTB4NTkKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjI0MTMJMHg3OAotI2RlZmluZSBBUjVLX1NSRVZfVkVSX0FSMjQxNAkweDc5Ci0jZGVmaW5lIEFSNUtfU1JFVl9WRVJfQVIyNDI0CTB4YTAgLyogUENJLUUgKi8KLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjU0MjQJMHhhMyAvKiBQQ0ktRSAqLwotI2RlZmluZSBBUjVLX1NSRVZfVkVSX0FSNTQxMwkweGE0Ci0jZGVmaW5lIEFSNUtfU1JFVl9WRVJfQVI1NDE0CTB4YTUKLSNkZWZpbmUgQVI1S19TUkVWX1ZFUl9BUjU0MTYJMHhjMCAvKiBQQ0ktRSAqLwotI2RlZmluZSBBUjVLX1NSRVZfVkVSX0FSNTQxOAkweGNhIC8qIFBDSS1FICovCi0jZGVmaW5lIEFSNUtfU1JFVl9WRVJfQVIyNDI1CTB4ZTIgLyogUENJLUUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMAkweDAwIC8qIENyZXRlICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjUzMTEJMHgxMCAvKiBNYXVpIDEgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTMxMUEJMHgyMCAvKiBNYXVpIDIgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTMxMUIJMHgzMCAvKiBTcGlyaXQgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMQkweDQwIC8qIE9haHUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTIxMgkweDUwIC8qIFZlbmljZSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1MjEzCTB4NTUgLyogPz8/ICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjUyMTNBCTB4NTkgLyogSGFpbmFuICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjI0MTMJMHg3OCAvKiBHcmlmZmluIGxpdGUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNAkweDcwIC8qIEdyaWZmaW4gKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSNTQyNAkweDkwIC8qIENvbmRvciAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDEzCTB4YTQgLyogRWFnbGUgbGl0ZSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDE0CTB4YTAgLyogRWFnbGUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNQkweGIwIC8qIENvYnJhICovCisjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTYJMHhjMCAvKiBQQ0ktRSAqLworI2RlZmluZSBBUjVLX1NSRVZfQVI1NDE4CTB4Y2EgLyogUENJLUUgKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQyNQkweGUwIC8qIFN3YW4gKi8KKyNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNwkweGYwIC8qIE5hbGEgKi8KIAogI2RlZmluZSBBUjVLX1NSRVZfUkFEXzUxMTAJMHgwMAogI2RlZmluZSBBUjVLX1NSRVZfUkFEXzUxMTEJMHgxMApAQCAtMTkwLDEzICszMzIsMjIgQEAKICNkZWZpbmUgQVI1S19TUkVWX1JBRF8yMTEyCTB4NDAKICNkZWZpbmUgQVI1S19TUkVWX1JBRF8yMTEyQQkweDQ1CiAjZGVmaW5lCUFSNUtfU1JFVl9SQURfMjExMkIJMHg0NgotI2RlZmluZSBBUjVLX1NSRVZfUkFEX1NDMAkweDUwCS8qIEZvdW5kIG9uIDI0MTMvMjQxNCAqLwotI2RlZmluZSBBUjVLX1NSRVZfUkFEX1NDMQkweDYwCS8qIEZvdW5kIG9uIDU0MTMvNTQxNCAqLwotI2RlZmluZSBBUjVLX1NSRVZfUkFEX1NDMgkweGEwCS8qIEZvdW5kIG9uIDI0MjQtNS81NDI0ICovCi0jZGVmaW5lIEFSNUtfU1JFVl9SQURfNTEzMwkweGMwCS8qIE1JTU8gZm91bmQgb24gNTQxOCAqLworI2RlZmluZSBBUjVLX1NSRVZfUkFEXzI0MTMJMHg1MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzU0MTMJMHg2MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzIzMTYJMHg3MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzIzMTcJMHg4MAorI2RlZmluZSBBUjVLX1NSRVZfUkFEXzU0MjQJMHhhMCAvKiBNb3N0bHkgc2FtZSBhcyA1NDEzICovCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfMjQyNQkweGEyCisjZGVmaW5lIEFSNUtfU1JFVl9SQURfNTEzMwkweGMwCisKKyNkZWZpbmUgQVI1S19TUkVWX1BIWV81MjExCTB4MzAKKyNkZWZpbmUgQVI1S19TUkVWX1BIWV81MjEyCTB4NDEKKyNkZWZpbmUgQVI1S19TUkVWX1BIWV8yMTEyQgkweDQzCisjZGVmaW5lIEFSNUtfU1JFVl9QSFlfMjQxMwkweDQ1CisjZGVmaW5lIEFSNUtfU1JFVl9QSFlfNTQxMwkweDYxCisjZGVmaW5lIEFSNUtfU1JFVl9QSFlfMjQyNQkweDcwCiAKIC8qIElFRUUgZGVmcyAqLwotCiAjZGVmaW5lIElFRUU4MDIxMV9NQVhfTEVOICAgICAgIDI1MDAKIAogLyogVE9ETyBhZGQgc3VwcG9ydCB0byBtYWM4MDIxMSBmb3IgdmVuZG9yLXNwZWNpZmljIHJhdGVzIGFuZCBtb2RlcyAqLwpAQCAtMjY4LDI3ICs0MTksMjEgQEAKIAlBUjVLX01PREVfTUFYCQk9CTUKIH07CiAKLS8qIGFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUsIHNlZSBhcjUyMTJfcmVnLmggKi8KLSNkZWZpbmUgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgMHgwNAotCi0jZGVmaW5lIEhBU19TSFBSRUFNQkxFKF9peCkgXAotCShydC0+cmF0ZXNbX2l4XS5tb2R1bGF0aW9uID09IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFKQotI2RlZmluZSBTSFBSRUFNQkxFX0ZMQUcoX2l4KSBcCi0JKEhBU19TSFBSRUFNQkxFKF9peCkgPyBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSA6IDApCi0KIAogLyoqKioqKioqKioqKioqKipcCiAgIFRYIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIFRYIFN0YXR1cworICogVFggU3RhdHVzIGRlc2NyaXB0b3IKICAqLwogc3RydWN0IGF0aDVrX3R4X3N0YXR1cyB7CiAJdTE2CXRzX3NlcW51bTsKIAl1MTYJdHNfdHN0YW1wOwogCXU4CXRzX3N0YXR1czsKLQl1OAl0c19yYXRlOworCXU4CXRzX3JhdGVbNF07CisJdTgJdHNfcmV0cnlbNF07CisJdTgJdHNfZmluYWxfaWR4OwogCXM4CXRzX3Jzc2k7CiAJdTgJdHNfc2hvcnRyZXRyeTsKIAl1OAl0c19sb25ncmV0cnk7CkBAIC0zNTQsNyArNDk5LDYgQEAKIAlBUjVLX1RYX1FVRVVFX0lEX1hSX0RBVEEJPSA5LAogfTsKIAotCiAvKgogICogRmxhZ3MgdG8gc2V0IGh3IHF1ZXVlJ3MgcGFyYW1ldGVycy4uLgogICovCkBAIC0zODcsNyArNTMxLDggQEAKIAogLyoKICAqIFRyYW5zbWl0IHBhY2tldCB0eXBlcy4KLSAqIFRoZXNlIGFyZSBub3QgZnVsbHkgdXNlZCBpbnNpZGUgT3BlbkhBTCB5ZXQKKyAqIHVzZWQgb24gdHggY29udHJvbCBkZXNjcmlwdG9yCisgKiBUT0RPOiBVc2UgdGhlbSBpbnNpZGUgYmFzZS5jIGNvcmVjdGx5CiAgKi8KIGVudW0gYXRoNWtfcGt0X3R5cGUgewogCUFSNUtfUEtUX1RZUEVfTk9STUFMCQk9IDAsCkBAIC00MzAsNyArNTc1LDcgQEAKIFwqKioqKioqKioqKioqKioqLwogCiAvKgotICogUlggU3RhdHVzCisgKiBSWCBTdGF0dXMgZGVzY3JpcHRvcgogICovCiBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzIHsKIAl1MTYJcnNfZGF0YWxlbjsKQEAgLTQ5NCwzNCArNjM5LDU5IEBACiAjZGVmaW5lIFRTRl9UT19UVShfdHNmKSAodTMyKSgoX3RzZikgPj4gMTApCiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEdBSU4gT1BUSU1JWkFUSU9OIERFRklOSVRJT05TCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBhdGg1a19yZmdhaW4geworCUFSNUtfUkZHQUlOX0lOQUNUSVZFID0gMCwKKwlBUjVLX1JGR0FJTl9SRUFEX1JFUVVFU1RFRCwKKwlBUjVLX1JGR0FJTl9ORUVEX0NIQU5HRSwKK307CisKKyNkZWZpbmUgQVI1S19HQUlOX0NSTl9GSVhfQklUU181MTExCQk0CisjZGVmaW5lIEFSNUtfR0FJTl9DUk5fRklYX0JJVFNfNTExMgkJNworI2RlZmluZSBBUjVLX0dBSU5fQ1JOX01BWF9GSVhfQklUUwkJQVI1S19HQUlOX0NSTl9GSVhfQklUU181MTEyCisjZGVmaW5lIEFSNUtfR0FJTl9EWU5fQURKVVNUX0hJX01BUkdJTgkJMTUKKyNkZWZpbmUgQVI1S19HQUlOX0RZTl9BREpVU1RfTE9fTUFSR0lOCQkyMAorI2RlZmluZSBBUjVLX0dBSU5fQ0NLX1BST0JFX0NPUlIJCTUKKyNkZWZpbmUgQVI1S19HQUlOX0NDS19PRkRNX0dBSU5fREVMVEEJCTE1CisjZGVmaW5lIEFSNUtfR0FJTl9TVEVQX0NPVU5UCQkJMTAKKyNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1RYX0NMSVAJCQkwCisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF85MAkJCTEKKyNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzg0CQkJMgorI2RlZmluZSBBUjVLX0dBSU5fUEFSQU1fR0FJTl9TRUwJCTMKKyNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX01JWF9PUk4JCQkwCisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzgJCQkxCisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzcJCQkyCisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzYJCQkzCisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzIJCQk0CisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzEJCQk1CisjZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9QRF8xMzAJCQk2CisjZGVmaW5lIEFSNUtfR0FJTl9DSEVDS19BREpVU1QoX2cpIAkJXAorCSgoX2cpLT5nX2N1cnJlbnQgPD0gKF9nKS0+Z19sb3cgfHwgKF9nKS0+Z19jdXJyZW50ID49IChfZyktPmdfaGlnaCkKKworc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgeworCXMxNgkJCQlnb3NfcGFyYW1bQVI1S19HQUlOX0NSTl9NQVhfRklYX0JJVFNdOworCXMzMgkJCQlnb3NfZ2FpbjsKK307CisKK3N0cnVjdCBhdGg1a19nYWluIHsKKwl1MzIJCQlnX3N0ZXBfaWR4OworCXUzMgkJCWdfY3VycmVudDsKKwl1MzIJCQlnX3RhcmdldDsKKwl1MzIJCQlnX2xvdzsKKwl1MzIJCQlnX2hpZ2g7CisJdTMyCQkJZ19mX2NvcnI7CisJdTMyCQkJZ19hY3RpdmU7CisJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAJKmdfc3RlcDsKK307CisKKwogLyoqKioqKioqKioqKioqKioqKioqXAogICBDT01NT04gREVGSU5JVElPTlMKIFwqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEF0aGVyb3MgaGFyZHdhcmUgZGVzY3JpcHRvcgotICogVGhpcyBpcyByZWFkIGFuZCB3cml0dGVuIHRvIGJ5IHRoZSBoYXJkd2FyZQotICovCi1zdHJ1Y3QgYXRoNWtfZGVzYyB7Ci0JdTMyCWRzX2xpbms7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciAqLwotCXUzMglkc19kYXRhOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpICovCi0KLQl1bmlvbiB7Ci0JCXN0cnVjdCBhdGg1a19od181MjEwX3R4X2Rlc2MJZHNfdHg1MjEwOwotCQlzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjCWRzX3R4NTIxMjsKLQkJc3RydWN0IGF0aDVrX2h3X2FsbF9yeF9kZXNjCWRzX3J4OwotCX0gdWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFSNUtfUlhERVNDX0lOVFJFUQkweDAwMjAKLQotI2RlZmluZSBBUjVLX1RYREVTQ19DTFJETUFTSwkweDAwMDEKLSNkZWZpbmUgQVI1S19UWERFU0NfTk9BQ0sJMHgwMDAyCS8qWzUyMTErXSovCi0jZGVmaW5lIEFSNUtfVFhERVNDX1JUU0VOQQkweDAwMDQKLSNkZWZpbmUgQVI1S19UWERFU0NfQ1RTRU5BCTB4MDAwOAotI2RlZmluZSBBUjVLX1RYREVTQ19JTlRSRVEJMHgwMDEwCi0jZGVmaW5lIEFSNUtfVFhERVNDX1ZFT0wJMHgwMDIwCS8qWzUyMTErXSovCi0KICNkZWZpbmUgQVI1S19TTE9UX1RJTUVfOQkzOTYKICNkZWZpbmUgQVI1S19TTE9UX1RJTUVfMjAJODgwCiAjZGVmaW5lIEFSNUtfU0xPVF9USU1FX01BWAkweGZmZmYKQEAgLTU1MywxNjcgKzcyMyw3OSBAQAogI2RlZmluZSBDSEFOTkVMX01PREVTCQlDSEFOTkVMX0FMTAogCiAvKgotICogVXNlZCBpbnRlcm5hbHkgaW4gT3BlbkhBTCAoYXI1MjExLmMvYXI1MjEyLmMKLSAqIGZvciByZXNldF90eF9xdWV1ZSkuIEFsc28gc2VlIHN0cnVjdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwuCisgKiBVc2VkIGludGVybmFseSBmb3IgcmVzZXRfdHhfcXVldWUpLgorICogQWxzbyBzZWUgc3RydWN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbC4KICAqLwogI2RlZmluZSBJU19DSEFOX1hSKF9jKQkoKF9jLmh3X3ZhbHVlICYgQ0hBTk5FTF9YUikgIT0gMCkKICNkZWZpbmUgSVNfQ0hBTl9CKF9jKQkoKF9jLmh3X3ZhbHVlICYgQ0hBTk5FTF9CKSAhPSAwKQogCiAvKgotICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgd2lsbCBiZSB1c2VkIHRvIG1hcCAyR0h6IGNoYW5uZWxzIHRvCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCAyR0h6IGNoYW5uZWxzIHRvCiAgKiA1R0h6IEF0aGVyb3MgY2hhbm5lbHMuCisgKiBUT0RPOiBDbGVhbiB1cAogICovCiBzdHJ1Y3QgYXRoNWtfYXRoY2hhbl8yZ2h6IHsKIAl1MzIJYTJfZmxhZ3M7CiAJdTE2CWEyX2F0aGNoYW47CiB9OwogCi0vKgotICogUmF0ZSBkZWZpbml0aW9ucwotICogVE9ETzogQ2xlYW4gdGhlbSB1cCBvciBtb3ZlIHRoZW0gb24gbWFjODAyMTEgLW1vc3Qgb2YgdGhlc2UgaW5mb3MgYXJlCi0gKiAJIHVzZWQgYnkgdGhlIHJhdGUgY29udHJvbCBhbGdvcnl0bSBvbiBNYWRXaUZpLgotICovCiAKLS8qIE1heCBudW1iZXIgb2YgcmF0ZXMgb24gdGhlIHJhdGUgdGFibGUgYW5kIHdoYXQgaXQgc2VlbXMKLSAqIEF0aGVyb3MgaGFyZHdhcmUgc3VwcG9ydHMgKi8KLSNkZWZpbmUgQVI1S19NQVhfUkFURVMgMzIKKy8qKioqKioqKioqKioqKioqKipcCisgIFJBVEUgREVGSU5JVElPTlMKK1wqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogc3RydWN0IGF0aDVrX3JhdGUgLSByYXRlIHN0cnVjdHVyZQotICogQHZhbGlkOiBpcyB0aGlzIGEgdmFsaWQgcmF0ZSBmb3IgcmF0ZSBjb250cm9sIChyZW1vdmUpCi0gKiBAbW9kdWxhdGlvbjogcmVzcGVjdGl2ZSBtYWM4MDIxMSBtb2R1bGF0aW9uCi0gKiBAcmF0ZV9rYnBzOiByYXRlIGluIGtiaXQvcwotICogQHJhdGVfY29kZTogaGFyZHdhcmUgcmF0ZSB2YWx1ZSwgdXNlZCBpbiAmc3RydWN0IGF0aDVrX2Rlc2MsIG9uIFJYIG9uCi0gKiAgICAgJnN0cnVjdCBhdGg1a19yeF9zdGF0dXMucnNfcmF0ZSBhbmQgb24gVFggb24KLSAqICAgICAmc3RydWN0IGF0aDVrX3R4X3N0YXR1cy50c19yYXRlLiBTZWVtcyB0aGUgYXI1eHh4IGhhcndhcmUgc3VwcG9ydHMKLSAqICAgICB1cCB0byAzMiByYXRlcywgaW5kZXhlZCBieSAxLTMyLiBUaGlzIG1lYW5zIHdlIHJlYWxseSBvbmx5IG5lZWQKLSAqICAgICA2IGJpdHMgZm9yIHRoZSByYXRlX2NvZGUuCi0gKiBAZG90MTFfcmF0ZTogcmVzcGVjdGl2ZSBJRUVFLTgwMi4xMSByYXRlIHZhbHVlCi0gKiBAY29udHJvbF9yYXRlOiBpbmRleCBvZiByYXRlIGFzc3VtZWQgdG8gYmUgdXNlZCB0byBzZW5kIGNvbnRyb2wgZnJhbWVzLgotICogICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IG92ZXJyaWRlIHRoZSB2YWx1ZSBvbiB0aGUgcmF0ZSBkdXJhdGlvbgotICogICAgIHJlZ2lzdGVycy4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB3ZSBjYW4gb3ZlcnJpZGUgaW4gdGhlIGhhcndhcmUgYXQKLSAqICAgICB3aGF0IHJhdGUgd2Ugd2FudCB0byBzZW5kIGNvbnRyb2wgZnJhbWVzIGF0LiBOb3RlIHRoYXQgSUVFRS04MDIuMTEKLSAqICAgICBDaC4gOS42IChhZnRlciBJRUVFIDgwMi4xMWcgY2hhbmdlcykgZGVmaW5lcyB0aGUgcmF0ZSBhdCB3aGljaCB3ZQotICogICAgIHNob3VsZCBzZW5kIEFDSy9DVFMsIGlmIHdlIGNoYW5nZSB0aGlzIHZhbHVlIHdlIGNhbiBiZSBicmVha2luZwotICogICAgIHRoZSBzcGVjLgorICogU2VlbXMgdGhlIGFyNXh4eCBoYXJ3YXJlIHN1cHBvcnRzIHVwIHRvIDMyIHJhdGVzLCBpbmRleGVkIGJ5IDEtMzIuCiAgKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnZXQgdGhlIFJYIHJhdGUgb3Igc2V0IHRoZSBUWCByYXRlIG9uIHRoZQorICogVGhlIHJhdGUgY29kZSBpcyB1c2VkIHRvIGdldCB0aGUgUlggcmF0ZSBvciBzZXQgdGhlIFRYIHJhdGUgb24gdGhlCiAgKiBoYXJkd2FyZSBkZXNjcmlwdG9ycy4gSXQgaXMgYWxzbyB1c2VkIGZvciBpbnRlcm5hbCBtb2R1bGF0aW9uIGNvbnRyb2wKICAqIGFuZCBzZXR0aW5ncy4KICAqCi0gKiBPbiBSWCBhZnRlciB0aGUgJnN0cnVjdCBhdGg1a19kZXNjIGlzIHBhcnNlZCBieSB0aGUgYXBwcm9wcmlhdGUKLSAqIGFoX3Byb2NfcnhfZGVzYygpIHRoZSByZXNwZWN0aXZlIGhhcmR3YXJlIHJhdGUgdmFsdWUgaXMgc2V0IGluCi0gKiAmc3RydWN0IGF0aDVrX3J4X3N0YXR1cy5yc19yYXRlLiBPbiBUWCB0aGUgZGVzaXJlZCByYXRlIGlzIHNldCBpbgotICogJnN0cnVjdCBhdGg1a190eF9zdGF0dXMudHNfcmF0ZSB3aGljaCBpcyBsYXRlciB1c2VkIHRvIHNldHVwIHRoZQotICogJnN0cnVjdCBhdGg1a19kZXNjIGNvcnJlY3RseS4gVGhpcyBpcyB0aGUgaGFyZHdhcmUgcmF0ZSBtYXAgd2UgYXJlCi0gKiBhd2FyZSBvZjoKKyAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZjoKICAqCi0gKiByYXRlX2NvZGUgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDgKKyAqIHJhdGVfY29kZSAgIDB4MDEgICAgMHgwMiAgICAweDAzICAgIDB4MDQgICAgMHgwNSAgICAweDA2ICAgIDB4MDcgICAgMHgwOAogICogcmF0ZV9rYnBzICAgMzAwMCAgICAxMDAwICAgID8gICAgICAgPyAgICAgICA/ICAgICAgIDIwMDAgICAgNTAwICAgICA0ODAwMAogICoKLSAqIHJhdGVfY29kZSAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNCAgICAgIDE1ICAgICAgMTYKKyAqIHJhdGVfY29kZSAgIDB4MDkgICAgMHgwQSAgICAweDBCICAgIDB4MEMgICAgMHgwRCAgICAweDBFICAgIDB4MEYgICAgMHgxMAogICogcmF0ZV9rYnBzICAgMjQwMDAgICAxMjAwMCAgIDYwMDAgICAgNTQwMDAgICAzNjAwMCAgIDE4MDAwICAgOTAwMCAgICA/CiAgKgogICogcmF0ZV9jb2RlICAgMTcgICAgICAxOCAgICAgIDE5ICAgICAgMjAgICAgICAyMSAgICAgIDIyICAgICAgMjMgICAgICAyNAogICogcmF0ZV9rYnBzICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICAxMTAwMAogICoKICAqIHJhdGVfY29kZSAgIDI1ICAgICAgMjYgICAgICAyNyAgICAgIDI4ICAgICAgMjkgICAgICAzMCAgICAgIDMxICAgICAgMzIKLSAqIHJhdGVfa2JwcyAgIDU1MDAgICAgMjAwMCAgICAxMDAwICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPworICogcmF0ZV9rYnBzICAgNTUwMCAgICAyMDAwICAgIDEwMDAgICAgMTEwMDBTICA1NTAwUyAgIDIwMDBTICAgPyAgICAgICA/CiAgKgorICogIlMiIGluZGljYXRlcyBDQ0sgcmF0ZXMgd2l0aCBzaG9ydCBwcmVhbWJsZS4KKyAqCisgKiBBUjUyMTEgaGFzIGRpZmZlcmVudCByYXRlIGNvZGVzIGZvciBDQ0sgKDgwMi4xMUIpIHJhdGVzLiBJdCBvbmx5IHVzZXMgdGhlCisgKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBiZWxvdyB3aXRoIGEgMHhGIG1hc2suCisgKiAoMHhCLCAweEEsIDB4OSBhbmQgMHg4IGZvciAxTSwgMk0sIDUuNU0gYW5kIDExTSkuCisgKiBXZSBoYW5kbGUgdGhpcyBpbiBhdGg1a19zZXR1cF9iYW5kcygpLgogICovCi1zdHJ1Y3QgYXRoNWtfcmF0ZSB7Ci0JdTgJdmFsaWQ7Ci0JdTMyCW1vZHVsYXRpb247Ci0JdTE2CXJhdGVfa2JwczsKLQl1OAlyYXRlX2NvZGU7Ci0JdTgJZG90MTFfcmF0ZTsKLQl1OAljb250cm9sX3JhdGU7Ci19OworI2RlZmluZSBBUjVLX01BWF9SQVRFUyAzMgogCi0vKiBYWFg6IEdSUiBhbGwgdGhpcyBzdHVmZiB0byBnZXQgbGVkcyBibGlua2luZyA/Pz8gKGNoZWNrIG91dCBzZXRjdXJtb2RlKSAqLwotc3RydWN0IGF0aDVrX3JhdGVfdGFibGUgewotCXUxNglyYXRlX2NvdW50OwotCXU4CXJhdGVfY29kZV90b19pbmRleFtBUjVLX01BWF9SQVRFU107CS8qIEJhY2stbWFwcGluZyAqLwotCXN0cnVjdCBhdGg1a19yYXRlIHJhdGVzW0FSNUtfTUFYX1JBVEVTXTsKLX07CisvKiBCICovCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8xTQkweDFCCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8yTQkweDFBCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV81XzVNCTB4MTkKKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzExTQkweDE4CisvKiBBIGFuZCBHICovCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV82TQkweDBCCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV85TQkweDBGCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8xMk0JMHgwQQorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfMThNCTB4MEUKKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzI0TQkweDA5CisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8zNk0JMHgwRAorI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNDhNCTB4MDgKKyNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzU0TQkweDBDCisvKiBYUiAqLworI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfNTAwSwkweDA3CisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8xTQkweDAyCisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8yTQkweDA2CisjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8zTQkweDAxCiAKLS8qCi0gKiBSYXRlIHRhYmxlcy4uLgotICogVE9ETzogQ0xFQU4gVEhJUyAhISEKLSAqLwotI2RlZmluZSBBUjVLX1JBVEVTXzExQSB7IDgsIHsJCQkJCVwKLQkyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgNiwgNCwgMiwgMCwJXAotCTcsIDUsIDMsIDEsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAlcCi0JMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwgewkJXAotCXsgMSwgMCwgNjAwMCwgMTEsIDE0MCwgMCB9LAkJXAotCXsgMSwgMCwgOTAwMCwgMTUsIDE4LCAwIH0sCQlcCi0JeyAxLCAwLCAxMjAwMCwgMTAsIDE1MiwgMiB9LAkJXAotCXsgMSwgMCwgMTgwMDAsIDE0LCAzNiwgMiB9LAkJXAotCXsgMSwgMCwgMjQwMDAsIDksIDE3NiwgNCB9LAkJXAotCXsgMSwgMCwgMzYwMDAsIDEzLCA3MiwgNCB9LAkJXAotCXsgMSwgMCwgNDgwMDAsIDgsIDk2LCA0IH0sCQlcCi0JeyAxLCAwLCA1NDAwMCwgMTIsIDEwOCwgNCB9IH0JCVwKLX0KLQotI2RlZmluZSBBUjVLX1JBVEVTXzExQiB7IDQsIHsJCQkJCQlcCi0JMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwJXAotCTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCVwKLQkzLCAyLCAxLCAwLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwgewkJCQlcCi0JeyAxLCAwLCAxMDAwLCAyNywgMTMwLCAwIH0sCVwKLQl7IDEsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFLCAyMDAwLCAyNiwgMTMyLCAxIH0sCVwKLQl7IDEsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFLCA1NTAwLCAyNSwgMTM5LCAxIH0sCVwKLQl7IDEsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFLCAxMTAwMCwgMjQsIDE1MCwgMSB9IH0JXAotfQotCi0jZGVmaW5lIEFSNUtfUkFURVNfMTFHIHsgMTIsIHsJCQkJCVwKLQkyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMTAsIDgsIDYsIDQsCVwKLQkxMSwgOSwgNywgNSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCVwKLQkzLCAyLCAxLCAwLCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwgewkJCVwKLQl7IDEsIDAsIDEwMDAsIDI3LCAyLCAwIH0sCQlcCi0JeyAxLCBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSwgMjAwMCwgMjYsIDQsIDEgfSwJCVwKLQl7IDEsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFLCA1NTAwLCAyNSwgMTEsIDEgfSwJCVwKLQl7IDEsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFLCAxMTAwMCwgMjQsIDIyLCAxIH0sCVwKLQl7IDAsIDAsIDYwMDAsIDExLCAxMiwgNCB9LAlcCi0JeyAwLCAwLCA5MDAwLCAxNSwgMTgsIDQgfSwJXAotCXsgMSwgMCwgMTIwMDAsIDEwLCAyNCwgNiB9LAlcCi0JeyAxLCAwLCAxODAwMCwgMTQsIDM2LCA2IH0sCVwKLQl7IDEsIDAsIDI0MDAwLCA5LCA0OCwgOCB9LAlcCi0JeyAxLCAwLCAzNjAwMCwgMTMsIDcyLCA4IH0sCVwKLQl7IDEsIDAsIDQ4MDAwLCA4LCA5NiwgOCB9LAlcCi0JeyAxLCAwLCA1NDAwMCwgMTIsIDEwOCwgOCB9IH0JXAotfQotCi0jZGVmaW5lIEFSNUtfUkFURVNfVFVSQk8geyA4LCB7CQkJCQlcCi0JMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDYsIDQsIDIsIDAsCVwKLQk3LCA1LCAzLCAxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwJXAotCTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sIHsJCVwKLQl7IDEsIE1PRFVMQVRJT05fVFVSQk8sIDYwMDAsIDExLCAxNDAsIDAgfSwJXAotCXsgMSwgTU9EVUxBVElPTl9UVVJCTywgOTAwMCwgMTUsIDE4LCAwIH0sCVwKLQl7IDEsIE1PRFVMQVRJT05fVFVSQk8sIDEyMDAwLCAxMCwgMTUyLCAyIH0sCVwKLQl7IDEsIE1PRFVMQVRJT05fVFVSQk8sIDE4MDAwLCAxNCwgMzYsIDIgfSwJXAotCXsgMSwgTU9EVUxBVElPTl9UVVJCTywgMjQwMDAsIDksIDE3NiwgNCB9LAlcCi0JeyAxLCBNT0RVTEFUSU9OX1RVUkJPLCAzNjAwMCwgMTMsIDcyLCA0IH0sCVwKLQl7IDEsIE1PRFVMQVRJT05fVFVSQk8sIDQ4MDAwLCA4LCA5NiwgNCB9LAlcCi0JeyAxLCBNT0RVTEFUSU9OX1RVUkJPLCA1NDAwMCwgMTIsIDEwOCwgNCB9IH0JXAotfQotCi0jZGVmaW5lIEFSNUtfUkFURVNfWFIgeyAxMiwgewkJCQkJXAotCTI1NSwgMywgMSwgMjU1LCAyNTUsIDI1NSwgMiwgMCwgMTAsIDgsIDYsIDQsCQlcCi0JMTEsIDksIDcsIDUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAlcCi0JMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwgewkJXAotCXsgMSwgTU9EVUxBVElPTl9YUiwgNTAwLCA3LCAxMjksIDAgfSwJCVwKLQl7IDEsIE1PRFVMQVRJT05fWFIsIDEwMDAsIDIsIDEzOSwgMSB9LAkJXAotCXsgMSwgTU9EVUxBVElPTl9YUiwgMjAwMCwgNiwgMTUwLCAyIH0sCQlcCi0JeyAxLCBNT0RVTEFUSU9OX1hSLCAzMDAwLCAxLCAxNTAsIDMgfSwJCVwKLQl7IDEsIDAsIDYwMDAsIDExLCAxNDAsIDQgfSwJXAotCXsgMSwgMCwgOTAwMCwgMTUsIDE4LCA0IH0sCVwKLQl7IDEsIDAsIDEyMDAwLCAxMCwgMTUyLCA2IH0sCVwKLQl7IDEsIDAsIDE4MDAwLCAxNCwgMzYsIDYgfSwJXAotCXsgMSwgMCwgMjQwMDAsIDksIDE3NiwgOCB9LAlcCi0JeyAxLCAwLCAzNjAwMCwgMTMsIDcyLCA4IH0sCVwKLQl7IDEsIDAsIDQ4MDAwLCA4LCA5NiwgOCB9LAlcCi0JeyAxLCAwLCA1NDAwMCwgMTIsIDEwOCwgOCB9IH0JXAotfQorLyogYWRkaW5nIHRoaXMgZmxhZyB0byByYXRlX2NvZGUgZW5hYmxlcyBzaG9ydCBwcmVhbWJsZSAqLworI2RlZmluZSBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSAweDA0CiAKIC8qCiAgKiBDcnlwdG8gZGVmaW5pdGlvbnMKQEAgLTczNSw3ICs4MTcsNiBAQAogCQlyZXR1cm4gKGZhbHNlKTsJCQlcCiB9IHdoaWxlICgwKQogCi0KIGVudW0gYXRoNWtfYW50X3NldHRpbmcgewogCUFSNUtfQU5UX1ZBUklBQkxFCT0gMCwJLyogdmFyaWFibGUgYnkgcHJvZ3JhbW1pbmcgKi8KIAlBUjVLX0FOVF9GSVhFRF9BCT0gMSwJLyogZml4ZWQgdG8gMTFhIGZyZXF1ZW5jaWVzICovCkBAIC04NDYsNyArOTI3LDggQEAKIAogLyoKICAqIFRoZXNlIG1hdGNoIG5ldDgwMjExIGRlZmluaXRpb25zIChub3QgdXNlZCBpbgotICogZDgwMjExKS4KKyAqIG1hYzgwMjExKS4KKyAqIFRPRE86IENsZWFuIHRoaXMgdXAKICAqLwogI2RlZmluZSBBUjVLX0xFRF9JTklUCTAgLypJRUVFODAyMTFfU19JTklUKi8KICNkZWZpbmUgQVI1S19MRURfU0NBTgkxIC8qSUVFRTgwMjExX1NfU0NBTiovCkBAIC04NjIsNyArOTQ0LDggQEAKIC8qCiAgKiBDaGlwc2V0IGNhcGFiaWxpdGllcyAtc2VlIGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5LQogICogZ2V0X2NhcGFiaWxpdHkgZnVuY3Rpb24gaXMgbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZAotICogaW4gT3BlbkhBTCBzbyBtb3N0IG9mIHRoZXNlIGRvbid0IHdvcmsgeWV0Li4uCisgKiBpbiBhdGg1ayBzbyBtb3N0IG9mIHRoZXNlIGRvbid0IHdvcmsgeWV0Li4uCisgKiBUT0RPOiBJbXBsZW1lbnQgdGhlc2UgJiBtZXJnZSB3aXRoIF9UVU5FXyBzdHVmZiBhYm92ZQogICovCiBlbnVtIGF0aDVrX2NhcGFiaWxpdHlfdHlwZSB7CiAJQVI1S19DQVBfUkVHX0RNTgkJPSAwLAkvKiBVc2VkIHRvIGdldCBjdXJyZW50IHJlZy4gZG9tYWluIGlkICovCkBAIC05MzEsNiArMTAxNCw3IEBACiAjZGVmaW5lIEFSNUtfTUFYX0dQSU8JCTEwCiAjZGVmaW5lIEFSNUtfTUFYX1JGX0JBTktTCTgKIAorLyogVE9ETzogQ2xlYW4gdXAgYW5kIG1lcmdlIHdpdGggYXRoNWtfc29mdGMgKi8KIHN0cnVjdCBhdGg1a19odyB7CiAJdTMyCQkJYWhfbWFnaWM7CiAKQEAgLTkzOSw3ICsxMDIzLDcgQEAKIAogCWVudW0gYXRoNWtfaW50CQlhaF9pbXI7CiAKLQllbnVtIGllZWU4MDIxMV9pZl90eXBlcwlhaF9vcF9tb2RlOworCWVudW0gbmw4MDIxMV9pZnR5cGUJYWhfb3BfbW9kZTsKIAllbnVtIGF0aDVrX3Bvd2VyX21vZGUJYWhfcG93ZXJfbW9kZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYWhfY3VycmVudF9jaGFubmVsOwogCWJvb2wJCQlhaF90dXJibzsKQEAgLTEwMjMsMTEgKzExMDcsMTMgQEAKIAkvKgogCSAqIEZ1bmN0aW9uIHBvaW50ZXJzCiAJICovCisJaW50ICgqYWhfc2V0dXBfcnhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQkJdTMyIHNpemUsIHVuc2lnbmVkIGludCBmbGFncyk7CiAJaW50ICgqYWhfc2V0dXBfdHhfZGVzYykoc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCiAJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBlbnVtIGF0aDVrX3BrdF90eXBlLCB1bnNpZ25lZCBpbnQsCiAJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JaW50ICgqYWhfc2V0dXBfeHR4X2Rlc2MpKHN0cnVjdCBhdGg1a19odyAqLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqLAorCWludCAoKmFoX3NldHVwX21ycl90eF9kZXNjKShzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAogCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiAJaW50ICgqYWhfcHJvY190eF9kZXNjKShzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKQEAgLTEwNDAsMzMgKzExMjYsMzggQEAKICAqIFByb3RvdHlwZXMKICAqLwogCi0vKiBHZW5lcmFsIEZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLCB1MzIgdmFsLCBib29sIGlzX3NldCk7CiAvKiBBdHRhY2gvRGV0YWNoIEZ1bmN0aW9ucyAqLwogZXh0ZXJuIHN0cnVjdCBhdGg1a19odyAqYXRoNWtfaHdfYXR0YWNoKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHU4IG1hY192ZXJzaW9uKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSAqYXRoNWtfaHdfZ2V0X3JhdGVfdGFibGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IG1vZGUpOwogZXh0ZXJuIHZvaWQgYXRoNWtfaHdfZGV0YWNoKHN0cnVjdCBhdGg1a19odyAqYWgpOworCiAvKiBSZXNldCBGdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgYXRoNWtfaHdfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgb3BfbW9kZSwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGNoYW5nZV9jaGFubmVsKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfbmljX3dha2V1cChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgZmxhZ3MsIGJvb2wgaW5pdGlhbCk7CitleHRlcm4gaW50IGF0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGNoYW5nZV9jaGFubmVsKTsKIC8qIFBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IGF0aDVrX2h3X3NldF9wb3dlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3Bvd2VyX21vZGUgbW9kZSwgYm9vbCBzZXRfY2hpcCwgdTE2IHNsZWVwX2R1cmF0aW9uKTsKKwogLyogRE1BIFJlbGF0ZWQgRnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBhdGg1a19od19zdGFydF9yeChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiB2b2lkIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfc3RvcF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCk7Ci1leHRlcm4gdTMyIGF0aDVrX2h3X2dldF9yeF9idWYoc3RydWN0IGF0aDVrX2h3ICphaCk7Ci1leHRlcm4gdm9pZCBhdGg1a19od19wdXRfcnhfYnVmKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBwaHlzX2FkZHIpOwotZXh0ZXJuIGludCBhdGg1a19od190eF9zdGFydChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOworZXh0ZXJuIHUzMiBhdGg1a19od19nZXRfcnhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKK2V4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBwaHlzX2FkZHIpOworZXh0ZXJuIGludCBhdGg1a19od19zdGFydF90eF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfc3RvcF90eF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKTsKLWV4dGVybiB1MzIgYXRoNWtfaHdfZ2V0X3R4X2J1ZihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOwotZXh0ZXJuIGludCBhdGg1a19od19wdXRfdHhfYnVmKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSwgdTMyIHBoeXNfYWRkcik7CitleHRlcm4gdTMyIGF0aDVrX2h3X2dldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSwKKwkJCQl1MzIgcGh5c19hZGRyKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGluY3JlYXNlKTsKIC8qIEludGVycnVwdCBoYW5kbGluZyAqLwogZXh0ZXJuIGJvb2wgYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpOwogZXh0ZXJuIGludCBhdGg1a19od19nZXRfaXNyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50ICppbnRlcnJ1cHRfbWFzayk7Ci1leHRlcm4gZW51bSBhdGg1a19pbnQgYXRoNWtfaHdfc2V0X2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spOworZXh0ZXJuIGVudW0gYXRoNWtfaW50IGF0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bQorYXRoNWtfaW50IG5ld19tYXNrKTsKIGV4dGVybiB2b2lkIGF0aDVrX2h3X3VwZGF0ZV9taWJfY291bnRlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKTsKKwogLyogRUVQUk9NIGFjY2VzcyBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgYXRoNWtfaHdfc2V0X3JlZ2RvbWFpbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgcmVnZG9tYWluKTsKK2V4dGVybiBpbnQgYXRoNWtfZWVwcm9tX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gaW50IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqbWFjKTsKKwogLyogUHJvdG9jb2wgQ29udHJvbCBVbml0IEZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBhdGg1a19od19zZXRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgpOwogLyogQlNTSUQgRnVuY3Rpb25zICovCkBAIC0xMDc2LDE0ICsxMTY3LDE0IEBACiBleHRlcm4gaW50IGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYXNrKTsKIC8qIFJlY2VpdmUgc3RhcnQvc3RvcCBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKLWV4dGVybiB2b2lkIGF0aDVrX2h3X3N0b3BfcGN1X3JlY3Yoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gdm9pZCBhdGg1a19od19zdG9wX3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIC8qIFJYIEZpbHRlciBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKTsKLWV4dGVybiBpbnQgYXRoNWtfaHdfc2V0X21jYXN0X2ZpbHRlcmluZGV4KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBpbmRleCk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXJfaWR4KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBpbmRleCk7CiBleHRlcm4gaW50IGF0aDVrX2h3X2NsZWFyX21jYXN0X2ZpbHRlcl9pZHgoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGluZGV4KTsKIGV4dGVybiB1MzIgYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIGV4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcik7Ci0vKiBCZWFjb24gcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qIEJlYWNvbiBjb250cm9sIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHUzMiBhdGg1a19od19nZXRfdHNmMzIoc3RydWN0IGF0aDVrX2h3ICphaCk7CiBleHRlcm4gdTY0IGF0aDVrX2h3X2dldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIGV4dGVybiB2b2lkIGF0aDVrX2h3X3Jlc2V0X3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKQEAgLTExMDUsNjEgKzExOTYsMTI5IEBACiBleHRlcm4gaW50IGF0aDVrX2h3X2lzX2tleV92YWxpZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnkpOwogZXh0ZXJuIGludCBhdGg1a19od19zZXRfa2V5KHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBlbnRyeSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LCBjb25zdCB1OCAqbWFjKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2tleV9sbGFkZHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTE2IGVudHJ5LCBjb25zdCB1OCAqbWFjKTsKKwogLyogUXVldWUgQ29udHJvbCBVbml0LCBERlMgQ29udHJvbCBVbml0IEZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBhdGg1a19od19zZXR1cF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3R4X3F1ZXVlIHF1ZXVlX3R5cGUsIHN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbyk7Ci1leHRlcm4gaW50IGF0aDVrX2h3X3NldHVwX3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLCBjb25zdCBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pOwogZXh0ZXJuIGludCBhdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsIHN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbyk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKKwkJCQljb25zdCBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pOworZXh0ZXJuIGludCBhdGg1a19od19zZXR1cF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCWVudW0gYXRoNWtfdHhfcXVldWUgcXVldWVfdHlwZSwKKwkJCQlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pOworZXh0ZXJuIHUzMiBhdGg1a19od19udW1fdHhfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOwogZXh0ZXJuIHZvaWQgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOwogZXh0ZXJuIGludCBhdGg1a19od19yZXNldF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOwotZXh0ZXJuIHUzMiBhdGg1a19od19udW1fdHhfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpOwotZXh0ZXJuIGludCBhdGg1a19od19zZXRfc2xvdF90aW1lKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzbG90X3RpbWUpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGg1a19od19nZXRfc2xvdF90aW1lKHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIGludCBhdGg1a19od19zZXRfc2xvdF90aW1lKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzbG90X3RpbWUpOworCiAvKiBIYXJkd2FyZSBEZXNjcmlwdG9yIEZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBhdGg1a19od19zZXR1cF9yeF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfaW5pdF9kZXNjX2Z1bmN0aW9ucyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKKwogLyogR1BJTyBGdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwotZXh0ZXJuIGludCBhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pOwogZXh0ZXJuIGludCBhdGg1a19od19zZXRfZ3Bpb19pbnB1dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3Bpbyk7CitleHRlcm4gaW50IGF0aDVrX2h3X3NldF9ncGlvX291dHB1dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3Bpbyk7CiBleHRlcm4gdTMyIGF0aDVrX2h3X2dldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfc2V0X2dwaW8oc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8sIHUzMiB2YWwpOwogZXh0ZXJuIHZvaWQgYXRoNWtfaHdfc2V0X2dwaW9faW50cihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgZ3BpbywgdTMyIGludGVycnVwdF9sZXZlbCk7Ci0vKiBNaXNjIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBhdGg1a19od19nZXRfY2FwYWJpbGl0eShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX2NhcGFiaWxpdHlfdHlwZSBjYXBfdHlwZSwgdTMyIGNhcGFiaWxpdHksIHUzMiAqcmVzdWx0KTsKIAorLyogTWlzYyBmdW5jdGlvbnMgKi8KK2ludCBhdGg1a19od19zZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBhdGg1a19odyAqYWgpOworZXh0ZXJuIGludCBhdGg1a19od19nZXRfY2FwYWJpbGl0eShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX2NhcGFiaWxpdHlfdHlwZSBjYXBfdHlwZSwgdTMyIGNhcGFiaWxpdHksIHUzMiAqcmVzdWx0KTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfZW5hYmxlX3BzcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqYnNzaWQsIHUxNiBhc3NvY19pZCk7CitleHRlcm4gaW50IGF0aDVrX2h3X2Rpc2FibGVfcHNwb2xsKHN0cnVjdCBhdGg1a19odyAqYWgpOwogCiAvKiBJbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBhdGg1a19od193cml0ZV9pbml0dmFscyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBtb2RlLCBib29sIGNoYW5nZV9jaGFubmVsKTsKKwogLyogSW5pdGlhbGl6ZSBSRiAqLwogZXh0ZXJuIGludCBhdGg1a19od19yZnJlZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCB1bnNpZ25lZCBpbnQgbW9kZSk7CiBleHRlcm4gaW50IGF0aDVrX2h3X3JmZ2FpbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgZnJlcSk7CiBleHRlcm4gZW51bSBhdGg1a19yZmdhaW4gYXRoNWtfaHdfZ2V0X3JmX2dhaW4oc3RydWN0IGF0aDVrX2h3ICphaCk7CiBleHRlcm4gaW50IGF0aDVrX2h3X3NldF9yZmdhaW5fb3B0KHN0cnVjdCBhdGg1a19odyAqYWgpOwotCi0KIC8qIFBIWS9SRiBjaGFubmVsIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGJvb2wgYXRoNWtfY2hhbm5lbF9vayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZnJlcSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgYXRoNWtfaHdfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpOwogLyogUEhZIGNhbGlicmF0aW9uICovCiBleHRlcm4gaW50IGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKTsKLWV4dGVybiBpbnQgYXRoNWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCk7CitleHRlcm4gaW50IGF0aDVrX2h3X25vaXNlX2Zsb29yX2NhbGlicmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgsIHNob3J0IGZyZXEpOwogLyogTWlzYyBQSFkgZnVuY3Rpb25zICovCiBleHRlcm4gdTE2IGF0aDVrX2h3X3JhZGlvX3JldmlzaW9uKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBjaGFuKTsKIGV4dGVybiB2b2lkIGF0aDVrX2h3X3NldF9kZWZfYW50ZW5uYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgYW50KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2RlZl9hbnRlbm5hKHN0cnVjdCBhdGg1a19odyAqYWgpOwotZXh0ZXJuIGludCBhdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzaG9ydCBmcmVxKTsKK2V4dGVybiBpbnQgYXRoNWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCk7CiAvKiBUWCBwb3dlciBzZXR1cCAqLwogZXh0ZXJuIGludCBhdGg1a19od190eHBvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwgdW5zaWduZWQgaW50IHR4cG93ZXIpOwogZXh0ZXJuIGludCBhdGg1a19od19zZXRfdHhwb3dlcl9saW1pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcG93ZXIpOwogCisvKgorICogRnVuY3Rpb25zIHVzZWQgaW50ZXJuYWx5CisgKi8KIAorLyoKKyAqIFRyYW5zbGF0ZSB1c2VjIHRvIGh3IGNsb2NrIHVuaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0aDVrX2h3X2h0b2Nsb2NrKHVuc2lnbmVkIGludCB1c2VjLCBib29sIHR1cmJvKQoreworCXJldHVybiB0dXJibyA/ICh1c2VjICogODApIDogKHVzZWMgKiA0MCk7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgaHcgY2xvY2sgdW5pdHMgdG8gdXNlYworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdGg1a19od19jbG9ja3RvaCh1bnNpZ25lZCBpbnQgY2xvY2ssIGJvb2wgdHVyYm8pCit7CisJcmV0dXJuIHR1cmJvID8gKGNsb2NrIC8gODApIDogKGNsb2NrIC8gNDApOworfQorCisvKgorICogUmVhZCBmcm9tIGEgcmVnaXN0ZXIKKyAqLwogc3RhdGljIGlubGluZSB1MzIgYXRoNWtfaHdfcmVnX3JlYWQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTE2IHJlZykKIHsKIAlyZXR1cm4gaW9yZWFkMzIoYWgtPmFoX2lvYmFzZSArIHJlZyk7CiB9CiAKKy8qCisgKiBXcml0ZSB0byBhIHJlZ2lzdGVyCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od19yZWdfd3JpdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHZhbCwgdTE2IHJlZykKIHsKIAlpb3dyaXRlMzIodmFsLCBhaC0+YWhfaW9iYXNlICsgcmVnKTsKIH0KIAorI2lmIGRlZmluZWQoX0FUSDVLX1JFU0VUKSB8fCBkZWZpbmVkKF9BVEg1S19QSFkpCisvKgorICogQ2hlY2sgaWYgYSByZWdpc3RlciB3cml0ZSBoYXMgYmVlbiBjb21wbGV0ZWQKKyAqLworc3RhdGljIGludCBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLAorCQl1MzIgdmFsLCBib29sIGlzX3NldCkKK3sKKwlpbnQgaTsKKwl1MzIgZGF0YTsKKworCWZvciAoaSA9IEFSNUtfVFVORV9SRUdJU1RFUl9USU1FT1VUOyBpID4gMDsgaS0tKSB7CisJCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgcmVnKTsKKwkJaWYgKGlzX3NldCAmJiAoZGF0YSAmIGZsYWcpKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKChkYXRhICYgZmxhZykgPT0gdmFsKQorCQkJYnJlYWs7CisJCXVkZWxheSgxNSk7CisJfQorCisJcmV0dXJuIChpIDw9IDApID8gLUVBR0FJTiA6IDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB1MzIgYXRoNWtfaHdfYml0c3dhcCh1MzIgdmFsLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwl1MzIgcmV0dmFsID0gMCwgYml0LCBpOworCisJZm9yIChpID0gMDsgaSA8IGJpdHM7IGkrKykgeworCQliaXQgPSAodmFsID4+IGkpICYgMTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8IGJpdDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2F0dGFjaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYXR0YWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNTY5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2F0dGFjaC5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogQXR0YWNoL0RldGFjaCBGdW5jdGlvbnMgYW5kIGhlbHBlcnMgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKioKKyAqIGF0aDVrX2h3X3Bvc3QgLSBQb3dlciBPbiBTZWxmIFRlc3QgaGVscGVyIGZ1bmN0aW9uCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3Bvc3Qoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKworCWludCBpLCBjOworCXUxNiBjdXJfcmVnOworCXUxNiByZWdzWzJdID0ge0FSNUtfU1RBX0lEMCwgQVI1S19QSFkoOCl9OworCXUzMiB2YXJfcGF0dGVybjsKKwl1MzIgc3RhdGljX3BhdHRlcm5bNF0gPSB7CisJCTB4NTU1NTU1NTUsCTB4YWFhYWFhYWEsCisJCTB4NjY2NjY2NjYsCTB4OTk5OTk5OTkKKwl9OworCXUzMiBpbml0X3ZhbDsKKwl1MzIgY3VyX3ZhbDsKKworCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKKworCQljdXJfcmVnID0gcmVnc1tjXTsKKworCQkvKiBTYXZlIHByZXZpb3VzIHZhbHVlICovCisJCWluaXRfdmFsID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGN1cl9yZWcpOworCisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJdmFyX3BhdHRlcm4gPSBpIDw8IDE2IHwgaTsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFyX3BhdHRlcm4sIGN1cl9yZWcpOworCQkJY3VyX3ZhbCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBjdXJfcmVnKTsKKworCQkJaWYgKGN1cl92YWwgIT0gdmFyX3BhdHRlcm4pIHsKKwkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiUE9TVCBGYWlsZWQgISEhXG4iKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJLyogRm91bmQgb24gbmRpc3dyYXBwZXIgZHVtcHMgKi8KKwkJCXZhcl9wYXR0ZXJuID0gMHgwMDM5MDgwZjsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFyX3BhdHRlcm4sIGN1cl9yZWcpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdmFyX3BhdHRlcm4gPSBzdGF0aWNfcGF0dGVybltpXTsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFyX3BhdHRlcm4sIGN1cl9yZWcpOworCQkJY3VyX3ZhbCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBjdXJfcmVnKTsKKworCQkJaWYgKGN1cl92YWwgIT0gdmFyX3BhdHRlcm4pIHsKKwkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiUE9TVCBGYWlsZWQgISEhXG4iKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJLyogRm91bmQgb24gbmRpc3dyYXBwZXIgZHVtcHMgKi8KKwkJCXZhcl9wYXR0ZXJuID0gMHgwMDNiMDgwZjsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFyX3BhdHRlcm4sIGN1cl9yZWcpOworCQl9CisKKwkJLyogUmVzdG9yZSBwcmV2aW91cyB2YWx1ZSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGluaXRfdmFsLCBjdXJfcmVnKTsKKworCX0KKworCXJldHVybiAwOworCit9CisKKy8qKgorICogYXRoNWtfaHdfYXR0YWNoIC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cworICoKKyAqIEBzYzogVGhlICZzdHJ1Y3QgYXRoNWtfc29mdGMgd2UgZ290IGZyb20gdGhlIGRyaXZlcidzIGF0dGFjaCBmdW5jdGlvbgorICogQG1hY192ZXJzaW9uOiBUaGUgbWFjIHZlcnNpb24gaWQgKGNoZWNrIG91dCBhdGg1ay5oKSBiYXNlZCBvbiBwY2kgaWQKKyAqCisgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCwgcGVyZm9ybSBhIFBPU1QgYW5kIGluaXRpYWxpemUgdGhlIG5lZWRlZAorICogc3RydWN0cy4gUmV0dXJucyAtRU5PTUVNIGlmIHdlIGRvbid0IGhhdmUgbWVtb3J5IGZvciB0aGUgbmVlZGVkIHN0cnVjdHMsCisgKiAtRU5PREVWIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvciBwcmludHMgYW4gZXJyb3IgbXNnIGlmIHNvbWV0aGluZworICogZWxzZSB3ZW50IHdyb25nLgorICovCitzdHJ1Y3QgYXRoNWtfaHcgKmF0aDVrX2h3X2F0dGFjaChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1OCBtYWNfdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2MtPnBkZXY7CisJdTggbWFjW0VUSF9BTEVOXTsKKwlpbnQgcmV0OworCXUzMiBzcmV2OworCisJLypJZiB3ZSBwYXNzZWQgdGhlIHRlc3QgbWFsbG9jIGEgYXRoNWtfaHcgc3RydWN0Ki8KKwlhaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGg1a19odyksIEdGUF9LRVJORUwpOworCWlmIChhaCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCUFUSDVLX0VSUihzYywgIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlhaC0+YWhfc2MgPSBzYzsKKwlhaC0+YWhfaW9iYXNlID0gc2MtPmlvYmFzZTsKKworCS8qCisJICogSFcgaW5mb3JtYXRpb24KKwkgKi8KKwlhaC0+YWhfb3BfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJYWgtPmFoX3JhZGFyLnJfZW5hYmxlZCA9IEFSNUtfVFVORV9SQURBUl9BTEVSVDsKKwlhaC0+YWhfdHVyYm8gPSBmYWxzZTsKKwlhaC0+YWhfdHhwb3dlci50eHBfdHBjID0gQVI1S19UVU5FX1RQQ19UWFBPV0VSOworCWFoLT5haF9pbXIgPSAwOworCWFoLT5haF9hdGltX3dpbmRvdyA9IDA7CisJYWgtPmFoX2FpZnMgPSBBUjVLX1RVTkVfQUlGUzsKKwlhaC0+YWhfY3dfbWluID0gQVI1S19UVU5FX0NXTUlOOworCWFoLT5haF9saW1pdF90eF9yZXRyaWVzID0gQVI1S19JTklUX1RYX1JFVFJZOworCWFoLT5haF9zb2Z0d2FyZV9yZXRyeSA9IGZhbHNlOworCWFoLT5haF9hbnRfZGl2ZXJzaXR5ID0gQVI1S19UVU5FX0FOVF9ESVZFUlNJVFk7CisKKwkvKgorCSAqIFNldCB0aGUgbWFjIHZlcnNpb24gYmFzZWQgb24gdGhlIHBjaSBpZAorCSAqLworCWFoLT5haF92ZXJzaW9uID0gbWFjX3ZlcnNpb247CisKKwkvKkZpbGwgdGhlIGF0aDVrX2h3IHN0cnVjdCB3aXRoIHRoZSBuZWVkZWQgZnVuY3Rpb25zKi8KKwlyZXQgPSBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKGFoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJLyogQnJpbmcgZGV2aWNlIG91dCBvZiBzbGVlcCBhbmQgcmVzZXQgaXQncyB1bml0cyAqLworCXJldCA9IGF0aDVrX2h3X25pY193YWtldXAoYWgsIENIQU5ORUxfQiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCS8qIEdldCBNQUMsIFBIWSBhbmQgUkFESU8gcmV2aXNpb25zICovCisJc3JldiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NSRVYpOworCWFoLT5haF9tYWNfc3JldiA9IHNyZXY7CisJYWgtPmFoX21hY192ZXJzaW9uID0gQVI1S19SRUdfTVMoc3JldiwgQVI1S19TUkVWX1ZFUik7CisJYWgtPmFoX21hY19yZXZpc2lvbiA9IEFSNUtfUkVHX01TKHNyZXYsIEFSNUtfU1JFVl9SRVYpOworCWFoLT5haF9waHlfcmV2aXNpb24gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQ0hJUF9JRCkgJgorCQkJMHhmZmZmZmZmZjsKKwlhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA9IGF0aDVrX2h3X3JhZGlvX3JldmlzaW9uKGFoLAorCQkJQ0hBTk5FTF81R0haKTsKKwlhaC0+YWhfcGh5ID0gQVI1S19QSFkoMCk7CisKKwkvKiBUcnkgdG8gaWRlbnRpZnkgcmFkaW8gY2hpcCBiYXNlZCBvbiBpdCdzIHNyZXYgKi8KKwlzd2l0Y2ggKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uICYgMHhmMCkgeworCWNhc2UgQVI1S19TUkVWX1JBRF81MTExOgorCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMTsKKwkJYWgtPmFoX3NpbmdsZV9jaGlwID0gZmFsc2U7CisJCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uID0gYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oYWgsCisJCQkJCQkJQ0hBTk5FTF8yR0haKTsKKwkJYWgtPmFoX3BoeV9zcGVuZGluZyA9IEFSNUtfUEhZX1NQRU5ESU5HX1JGNTExMTsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1NSRVZfUkFEXzUxMTI6CisJY2FzZSBBUjVLX1NSRVZfUkFEXzIxMTI6CisJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1MTEyOworCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSBmYWxzZTsKKwkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPSBhdGg1a19od19yYWRpb19yZXZpc2lvbihhaCwKKwkJCQkJCQlDSEFOTkVMXzJHSFopOworCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkY1MTEyOworCQlicmVhazsKKwljYXNlIEFSNUtfU1JFVl9SQURfMjQxMzoKKwkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MTM7CisJCWFoLT5haF9zaW5nbGVfY2hpcCA9IHRydWU7CisJCWFoLT5haF9waHlfc3BlbmRpbmcgPSBBUjVLX1BIWV9TUEVORElOR19SRjI0MTM7CisJCWJyZWFrOworCWNhc2UgQVI1S19TUkVWX1JBRF81NDEzOgorCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTQxMzsKKwkJYWgtPmFoX3NpbmdsZV9jaGlwID0gdHJ1ZTsKKwkJYWgtPmFoX3BoeV9zcGVuZGluZyA9IEFSNUtfUEhZX1NQRU5ESU5HX1JGNTQxMzsKKwkJYnJlYWs7CisJY2FzZSBBUjVLX1NSRVZfUkFEXzIzMTY6CisJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkYyMzE2OworCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkYyMzE2OworCQlicmVhazsKKwljYXNlIEFSNUtfU1JFVl9SQURfMjMxNzoKKwkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjIzMTc7CisJCWFoLT5haF9zaW5nbGVfY2hpcCA9IHRydWU7CisJCWFoLT5haF9waHlfc3BlbmRpbmcgPSBBUjVLX1BIWV9TUEVORElOR19SRjIzMTc7CisJCWJyZWFrOworCWNhc2UgQVI1S19TUkVWX1JBRF81NDI0OgorCQlpZiAoYWgtPmFoX21hY192ZXJzaW9uID09IEFSNUtfU1JFVl9BUjI0MjUgfHwKKwkJYWgtPmFoX21hY192ZXJzaW9uID09IEFSNUtfU1JFVl9BUjI0MTcpeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MjU7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQkJYWgtPmFoX3BoeV9zcGVuZGluZyA9IEFSNUtfUEhZX1NQRU5ESU5HX1JGMjQyNTsKKwkJfSBlbHNlIHsKKwkJCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1NDEzOworCQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gdHJ1ZTsKKwkJCWFoLT5haF9waHlfc3BlbmRpbmcgPSBBUjVLX1BIWV9TUEVORElOR19SRjU0MTM7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWRlbnRpZnkgcmFkaW8gYmFzZWQgb24gbWFjL3BoeSBzcmV2ICovCisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjUxMTA7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSBmYWxzZTsKKwkJfSBlbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjUxMTE7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSBmYWxzZTsKKwkJCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uID0gYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oYWgsCisJCQkJCQkJCUNIQU5ORUxfMkdIWik7CisJCX0gZWxzZSBpZiAoYWgtPmFoX21hY192ZXJzaW9uID09IChBUjVLX1NSRVZfQVIyNDI1ID4+IDQpIHx8CisJCWFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNyA+PiA0KSB8fAorCQlhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfMjQyNSkgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MjU7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzI0MjU7CisJCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkYyNDI1OworCQl9IGVsc2UgaWYgKHNyZXYgPT0gQVI1S19TUkVWX0FSNTIxM0EgJiYKKwkJYWgtPmFoX3BoeV9yZXZpc2lvbiA9PSBBUjVLX1NSRVZfUEhZXzIxMTJCKSB7CisJCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMjsKKwkJCWFoLT5haF9zaW5nbGVfY2hpcCA9IGZhbHNlOworCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzIxMTJCOworCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNSA+PiA0KSkgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjIzMTY7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzIzMTY7CisJCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkYyMzE2OworCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSNTQxNCA+PiA0KSB8fAorCQlhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfNTQxMykgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjU0MTM7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzU0MTM7CisJCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkY1NDEzOworCQl9IGVsc2UgaWYgKGFoLT5haF9tYWNfdmVyc2lvbiA9PSAoQVI1S19TUkVWX0FSMjQxNCA+PiA0KSB8fAorCQlhaC0+YWhfcGh5X3JldmlzaW9uID09IEFSNUtfU1JFVl9QSFlfMjQxMykgeworCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MTM7CisJCQlhaC0+YWhfc2luZ2xlX2NoaXAgPSB0cnVlOworCQkJYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPSBBUjVLX1NSRVZfUkFEXzI0MTM7CisJCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkYyNDEzOworCQl9IGVsc2UgeworCQkJQVRINUtfRVJSKHNjLCAiQ291bGRuJ3QgaWRlbnRpZnkgcmFkaW8gcmV2aXNpb24uXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9mcmVlOworCQl9CisJfQorCisKKwkvKiBSZXR1cm4gb24gdW5zdXBvcnRlZCBjaGlwcyAodW5zdXBwb3J0ZWQgZWVwcm9tIGV0YykgKi8KKwlpZiAoKHNyZXYgPj0gQVI1S19TUkVWX0FSNTQxNikgJiYKKwkoc3JldiA8IEFSNUtfU1JFVl9BUjI0MjUpKSB7CisJCUFUSDVLX0VSUihzYywgIkRldmljZSBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCS8qCisJICogV3JpdGUgUENJLUUgcG93ZXIgc2F2ZSBzZXR0aW5ncworCSAqLworCWlmICgoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpICYmIChwZGV2LT5pc19wY2llKSkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4OTI0OGZjMDAsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MjQ5MjQ5MjQsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBTaHV0IG9mZiBSWCB3aGVuIGVsZWNpZGxlIGlzIGFzc2VydGVkICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgyODAwMDAzOSwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHg1MzE2MDgyNCwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCS8qIFRPRE86IEVFUFJPTSB3b3JrICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHhlNTk4MDU3OSwgQVI1S19QQ0lFX1NFUkRFUyk7CisJCS8qIFNodXQgb2ZmIFBMTCBhbmQgQ0xLUkVRIGFjdGl2ZSBpbiBMMSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAxZGVmZmYsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBQcmVzZXJjZSBvdGhlciBzZXR0aW5ncyAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MWFhYWJlNDAsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4YmUxMDU1NTQsIEFSNUtfUENJRV9TRVJERVMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwZTMwMDcsIEFSNUtfUENJRV9TRVJERVMpOworCQkvKiBSZXNldCBTRVJERVMgdG8gbG9hZCBuZXcgc2V0dGluZ3MgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDAwMDAwLCBBUjVLX1BDSUVfU0VSREVTX1JFU0VUKTsKKwkJbWRlbGF5KDEpOworCX0KKworCS8qCisJICogUE9TVAorCSAqLworCXJldCA9IGF0aDVrX2h3X3Bvc3QoYWgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwkvKiBFbmFibGUgcGNpIGNvcmUgcmV0cnkgZml4IG9uIEhhaW5hbiAoNTIxM0EpIGFuZCBsYXRlciBjaGlwcyAqLworCWlmIChzcmV2ID49IEFSNUtfU1JFVl9BUjUyMTNBKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUENJQ0ZHX1JFVFJZX0ZJWCwgQVI1S19QQ0lDRkcpOworCisJLyoKKwkgKiBHZXQgY2FyZCBjYXBhYmlsaXRpZXMsIGNhbGlicmF0aW9uIHZhbHVlcyBldGMKKwkgKiBUT0RPOiBFRVBST00gd29yaworCSAqLworCXJldCA9IGF0aDVrX2VlcHJvbV9pbml0KGFoKTsKKwlpZiAocmV0KSB7CisJCUFUSDVLX0VSUihzYywgInVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJLyogR2V0IG1pc2MgY2FwYWJpbGl0aWVzICovCisJcmV0ID0gYXRoNWtfaHdfc2V0X2NhcGFiaWxpdGllcyhhaCk7CisJaWYgKHJldCkgeworCQlBVEg1S19FUlIoc2MsICJ1bmFibGUgdG8gZ2V0IGRldmljZSBjYXBhYmlsaXRpZXM6IDB4JTA0eFxuIiwKKwkJCXNjLT5wZGV2LT5kZXZpY2UpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCS8qIFNldCBNQUMgYWRkcmVzcyAqLworCXJldCA9IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhhaCwgbWFjKTsKKwlpZiAocmV0KSB7CisJCUFUSDVLX0VSUihzYywgInVuYWJsZSB0byByZWFkIGFkZHJlc3MgZnJvbSBFRVBST006IDB4JTA0eFxuIiwKKwkJCXNjLT5wZGV2LT5kZXZpY2UpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWF0aDVrX2h3X3NldF9sbGFkZHIoYWgsIG1hYyk7CisJLyogU2V0IEJTU0lEIHRvIGJjYXN0IGFkZHJlc3M6IGZmOmZmOmZmOmZmOmZmOmZmIGZvciBub3cgKi8KKwltZW1zZXQoYWgtPmFoX2Jzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJYXRoNWtfaHdfc2V0X2Fzc29jaWQoYWgsIGFoLT5haF9ic3NpZCwgMCk7CisJYXRoNWtfaHdfc2V0X29wbW9kZShhaCk7CisKKwlhdGg1a19od19zZXRfcmZnYWluX29wdChhaCk7CisKKwlyZXR1cm4gYWg7CitlcnJfZnJlZToKKwlrZnJlZShhaCk7CitlcnI6CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoqCisgKiBhdGg1a19od19kZXRhY2ggLSBGcmVlIHRoZSBhdGg1a19odyBzdHJ1Y3QKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KK3ZvaWQgYXRoNWtfaHdfZGV0YWNoKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCV9fc2V0X2JpdChBVEhfU1RBVF9JTlZBTElELCBhaC0+YWhfc2MtPnN0YXR1cyk7CisKKwlpZiAoYWgtPmFoX3JmX2JhbmtzICE9IE5VTEwpCisJCWtmcmVlKGFoLT5haF9yZl9iYW5rcyk7CisKKwkvKiBhc3N1bWUgaW50ZXJydXB0cyBhcmUgZG93biAqLworCWtmcmVlKGFoKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuYwppbmRleCAwNjc2YzZkLi45Yjk1YzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5jCkBAIC03Miw3ICs3Miw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIDV4eHggc2VyaWVzIG9mIEF0aGVyb3MgODAyLjExIHdpcmVsZXNzIExBTiBjYXJkcy4iKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdGhlcm9zIDV4eHggV0xBTiBjYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjAuNS4wIChFWFBFUklNRU5UQUwpIik7CitNT0RVTEVfVkVSU0lPTigiMC42LjAgKEVYUEVSSU1FTlRBTCkiKTsKIAogCiAvKiBLbm93biBQQ0kgaWRzICovCkBAIC05Myw0NSArOTMsOTQgQEAKIAl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxOSksIC5kcml2ZXJfZGF0YSA9IEFSNUtfQVI1MjEyIH0sIC8qIDUyMTIgY29tYmF0aWJsZSAqLwogCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDFhKSwgLmRyaXZlcl9kYXRhID0gQVI1S19BUjUyMTIgfSwgLyogMjQxMyBHcmlmZmluLWxpdGUgKi8KIAl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxYiksIC5kcml2ZXJfZGF0YSA9IEFSNUtfQVI1MjEyIH0sIC8qIDU0MTMgRWFnbGUgKi8KLQl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxYyksIC5kcml2ZXJfZGF0YSA9IEFSNUtfQVI1MjEyIH0sIC8qIDU0MjQgQ29uZG9yIChQQ0ktRSkqLworCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgMHgwMDFjKSwgLmRyaXZlcl9kYXRhID0gQVI1S19BUjUyMTIgfSwgLyogUENJLUUgY2FyZHMgKi8KKwl7IFBDSV9WREVWSUNFKEFUSEVST1MsIDB4MDAxZCksIC5kcml2ZXJfZGF0YSA9IEFSNUtfQVI1MjEyIH0sIC8qIDI0MTcgTmFsYSAqLwogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF0aDVrX3BjaV9pZF90YWJsZSk7CiAKIC8qIEtub3duIFNSRVZzICovCiBzdGF0aWMgc3RydWN0IGF0aDVrX3NyZXZfbmFtZSBzcmV2X25hbWVzW10gPSB7Ci0JeyAiNTIxMCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1MjEwIH0sCi0JeyAiNTMxMSIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1MzExIH0sCi0JeyAiNTMxMUEiLAlBUjVLX1ZFUlNJT05fVkVSLAlBUjVLX1NSRVZfVkVSX0FSNTMxMUEgfSwKLQl7ICI1MzExQiIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1MzExQiB9LAotCXsgIjUyMTEiLAlBUjVLX1ZFUlNJT05fVkVSLAlBUjVLX1NSRVZfVkVSX0FSNTIxMSB9LAotCXsgIjUyMTIiLAlBUjVLX1ZFUlNJT05fVkVSLAlBUjVLX1NSRVZfVkVSX0FSNTIxMiB9LAotCXsgIjUyMTMiLAlBUjVLX1ZFUlNJT05fVkVSLAlBUjVLX1NSRVZfVkVSX0FSNTIxMyB9LAotCXsgIjUyMTNBIiwJQVI1S19WRVJTSU9OX1ZFUiwJQVI1S19TUkVWX1ZFUl9BUjUyMTNBIH0sCi0JeyAiMjQxMyIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVIyNDEzIH0sCi0JeyAiMjQxNCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVIyNDE0IH0sCi0JeyAiMjQyNCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVIyNDI0IH0sCi0JeyAiNTQyNCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1NDI0IH0sCi0JeyAiNTQxMyIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1NDEzIH0sCi0JeyAiNTQxNCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1NDE0IH0sCi0JeyAiNTQxNiIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1NDE2IH0sCi0JeyAiNTQxOCIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVI1NDE4IH0sCi0JeyAiMjQyNSIsCUFSNUtfVkVSU0lPTl9WRVIsCUFSNUtfU1JFVl9WRVJfQVIyNDI1IH0sCi0JeyAieHh4eHgiLAlBUjVLX1ZFUlNJT05fVkVSLAlBUjVLX1NSRVZfVU5LTk9XTiB9LAorCXsgIjUyMTAiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MjEwIH0sCisJeyAiNTMxMSIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjUzMTEgfSwKKwl7ICI1MzExQSIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjUzMTFBIH0sCisJeyAiNTMxMUIiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MzExQiB9LAorCXsgIjUyMTEiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1MjExIH0sCisJeyAiNTIxMiIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjUyMTIgfSwKKwl7ICI1MjEzIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTIxMyB9LAorCXsgIjUyMTNBIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTIxM0EgfSwKKwl7ICIyNDEzIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSMjQxMyB9LAorCXsgIjI0MTQiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVIyNDE0IH0sCisJeyAiNTQyNCIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjU0MjQgfSwKKwl7ICI1NDEzIiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTQxMyB9LAorCXsgIjU0MTQiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1NDE0IH0sCisJeyAiMjQxNSIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjI0MTUgfSwKKwl7ICI1NDE2IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSNTQxNiB9LAorCXsgIjU0MTgiLAlBUjVLX1ZFUlNJT05fTUFDLAlBUjVLX1NSRVZfQVI1NDE4IH0sCisJeyAiMjQyNSIsCUFSNUtfVkVSU0lPTl9NQUMsCUFSNUtfU1JFVl9BUjI0MjUgfSwKKwl7ICIyNDE3IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX0FSMjQxNyB9LAorCXsgInh4eHh4IiwJQVI1S19WRVJTSU9OX01BQywJQVI1S19TUkVWX1VOS05PV04gfSwKIAl7ICI1MTEwIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81MTEwIH0sCiAJeyAiNTExMSIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTExMSB9LAorCXsgIjUxMTFBIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81MTExQSB9LAogCXsgIjIxMTEiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzIxMTEgfSwKIAl7ICI1MTEyIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81MTEyIH0sCiAJeyAiNTExMkEiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzUxMTJBIH0sCisJeyAiNTExMkIiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzUxMTJCIH0sCiAJeyAiMjExMiIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfMjExMiB9LAogCXsgIjIxMTJBIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF8yMTEyQSB9LAotCXsgIlNDaGlwIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF9TQzAgfSwKLQl7ICJTQ2hpcCIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfU0MxIH0sCi0JeyAiU0NoaXAiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEX1NDMiB9LAorCXsgIjIxMTJCIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF8yMTEyQiB9LAorCXsgIjI0MTMiLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzI0MTMgfSwKKwl7ICI1NDEzIiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81NDEzIH0sCisJeyAiMjMxNiIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfMjMxNiB9LAorCXsgIjIzMTciLAlBUjVLX1ZFUlNJT05fUkFELAlBUjVLX1NSRVZfUkFEXzIzMTcgfSwKKwl7ICI1NDI0IiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1JBRF81NDI0IH0sCiAJeyAiNTEzMyIsCUFSNUtfVkVSU0lPTl9SQUQsCUFSNUtfU1JFVl9SQURfNTEzMyB9LAogCXsgInh4eHh4IiwJQVI1S19WRVJTSU9OX1JBRCwJQVI1S19TUkVWX1VOS05PV04gfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgYXRoNWtfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAsCisJICAuaHdfdmFsdWUgPSBBVEg1S19SQVRFX0NPREVfMU0sIH0sCisJeyAuYml0cmF0ZSA9IDIwLAorCSAgLmh3X3ZhbHVlID0gQVRINUtfUkFURV9DT0RFXzJNLAorCSAgLmh3X3ZhbHVlX3Nob3J0ID0gQVRINUtfUkFURV9DT0RFXzJNIHwgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUsCisJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAorCXsgLmJpdHJhdGUgPSA1NSwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV81XzVNLAorCSAgLmh3X3ZhbHVlX3Nob3J0ID0gQVRINUtfUkFURV9DT0RFXzVfNU0gfCBBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSwKKwkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCisJeyAuYml0cmF0ZSA9IDExMCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV8xMU0sCisJICAuaHdfdmFsdWVfc2hvcnQgPSBBVEg1S19SQVRFX0NPREVfMTFNIHwgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUsCisJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAorCXsgLmJpdHJhdGUgPSA2MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV82TSwKKwkgIC5mbGFncyA9IDAgfSwKKwl7IC5iaXRyYXRlID0gOTAsCisJICAuaHdfdmFsdWUgPSBBVEg1S19SQVRFX0NPREVfOU0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDEyMCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV8xMk0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDE4MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV8xOE0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDI0MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV8yNE0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDM2MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV8zNk0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV80OE0sCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDU0MCwKKwkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV81NE0sCisJICAuZmxhZ3MgPSAwIH0sCisJLyogWFIgbWlzc2luZyAqLworfTsKKwogLyoKICAqIFByb3RvdHlwZXMgLSBQQ0kgc3RhY2sgcmVsYXRlZCBmdW5jdGlvbnMKICAqLwpAQCAtMTYyLDcgKzIxMSw4IEBACiAgKiBQcm90b3R5cGVzIC0gTUFDIDgwMi4xMSBzdGFjayByZWxhdGVkIGZ1bmN0aW9ucwogICovCiBzdGF0aWMgaW50IGF0aDVrX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyBpbnQgYXRoNWtfcmVzZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworc3RhdGljIGludCBhdGg1a19yZXNldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBib29sIHN0b3AsIGJvb2wgY2hhbmdlX2NoYW5uZWwpOworc3RhdGljIGludCBhdGg1a19yZXNldF93YWtlKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpOwogc3RhdGljIGludCBhdGg1a19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiBzdGF0aWMgdm9pZCBhdGg1a19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyBpbnQgYXRoNWtfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTIxOCwyMCArMjY4LDE2IEBACiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAvKiBDaGFubmVsL21vZGUgc2V0dXAgKi8KIHN0YXRpYyBpbmxpbmUgc2hvcnQgYXRoNWtfaWVlZTJtaHooc2hvcnQgY2hhbik7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGF0aDVrX2NvcHlfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcywKLQkJCQljb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSAqcnQsCi0JCQkJdW5zaWduZWQgaW50IG1heCk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGF0aDVrX2NvcHlfY2hhbm5lbHMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzLAogCQkJCXVuc2lnbmVkIGludCBtb2RlLAogCQkJCXVuc2lnbmVkIGludCBtYXgpOwotc3RhdGljIGludCAJYXRoNWtfZ2V0Y2hhbm5lbHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworc3RhdGljIGludCAJYXRoNWtfc2V0dXBfYmFuZHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogc3RhdGljIGludCAJYXRoNWtfY2hhbl9zZXQoc3RydWN0IGF0aDVrX3NvZnRjICpzYywKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4pOwogc3RhdGljIHZvaWQJYXRoNWtfc2V0Y3VybW9kZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLAogCQkJCXVuc2lnbmVkIGludCBtb2RlKTsKIHN0YXRpYyB2b2lkCWF0aDVrX21vZGVfc2V0dXAoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7Ci1zdGF0aWMgdm9pZAlhdGg1a19zZXRfdG90YWxfaHdfcmF0ZXMoc3RydWN0IGF0aDVrX3NvZnRjICpzYyk7CiAKIC8qIERlc2NyaXB0b3Igc2V0dXAgKi8KIHN0YXRpYyBpbnQJYXRoNWtfZGVzY19hbGxvYyhzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLApAQCAtMzUxLDcgKzM5NywxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNyZXZfbmFtZXMpOyBpKyspIHsKIAkJaWYgKHNyZXZfbmFtZXNbaV0uc3JfdHlwZSAhPSB0eXBlKQogCQkJY29udGludWU7Ci0JCWlmICgodmFsICYgMHhmZikgPCBzcmV2X25hbWVzW2kgKyAxXS5zcl92YWwpIHsKKworCQlpZiAoKHZhbCAmIDB4ZjApID09IHNyZXZfbmFtZXNbaV0uc3JfdmFsKQorCQkJbmFtZSA9IHNyZXZfbmFtZXNbaV0uc3JfbmFtZTsKKworCQlpZiAoKHZhbCAmIDB4ZmYpID09IHNyZXZfbmFtZXNbaV0uc3JfdmFsKSB7CiAJCQluYW1lID0gc3Jldl9uYW1lc1tpXS5zcl9uYW1lOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ0Niw2ICs0OTYsMTIgQEAKIAlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKIAkJICAgIElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKIAkJICAgIElFRUU4MDIxMV9IV19OT0lTRV9EQk07CisKKwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQykgfAorCQlCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCk7CisKIAlody0+ZXh0cmFfdHhfaGVhZHJvb20gPSAyOwogCWh3LT5jaGFubmVsX2NoYW5nZV90aW1lID0gNTAwMDsKIAlzYyA9IGh3LT5wcml2OwpAQCAtNDYyLDcgKzUxOCw3IEBACiAKIAlzYy0+aW9iYXNlID0gbWVtOyAvKiBTbyB3ZSBjYW4gdW5tYXAgaXQgb24gZGV0YWNoICovCiAJc2MtPmNhY2hlbHN6ID0gY3N6ICogc2l6ZW9mKHUzMik7IC8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KLQlzYy0+b3Btb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfU1RBOworCXNjLT5vcG1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwogCW11dGV4X2luaXQoJnNjLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc2MtPnJ4YnVmbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnNjLT50eGJ1ZmxvY2spOwpAQCAtNDg1LDEzICs1NDEsMTkgQEAKIAkJZ290byBlcnJfaXJxOwogCX0KIAorCS8qIHNldCB1cCBtdWx0aS1yYXRlIHJldHJ5IGNhcGFiaWxpdGllcyAqLworCWlmIChzYy0+YWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJaHctPm1heF9hbHRyYXRlcyA9IDM7CisJCWh3LT5tYXhfYWx0cmF0ZV90cmllcyA9IDExOworCX0KKwogCS8qIEZpbmlzaCBwcml2YXRlIGRyaXZlciBkYXRhIGluaXRpYWxpemF0aW9uICovCiAJcmV0ID0gYXRoNWtfYXR0YWNoKHBkZXYsIGh3KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9haDsKIAogCUFUSDVLX0lORk8oc2MsICJBdGhlcm9zIEFSJXMgY2hpcCBmb3VuZCAoTUFDOiAweCV4LCBQSFk6IDB4JXgpXG4iLAotCQkJYXRoNWtfY2hpcF9uYW1lKEFSNUtfVkVSU0lPTl9WRVIsc2MtPmFoLT5haF9tYWNfc3JldiksCisJCQlhdGg1a19jaGlwX25hbWUoQVI1S19WRVJTSU9OX01BQywgc2MtPmFoLT5haF9tYWNfc3JldiksCiAJCQkJCXNjLT5haC0+YWhfbWFjX3NyZXYsCiAJCQkJCXNjLT5haC0+YWhfcGh5X3JldmlzaW9uKTsKIApAQCAtNjQ2LDcgKzcwOCw2IEBACiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKipcCiAqIERyaXZlciBJbml0aWFsaXphdGlvbiAqCiBcKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NjksNyArNzMwLDcgQEAKIAkgKiByZXR1cm4gZmFsc2Ugdy9vIGRvaW5nIGFueXRoaW5nLiAgTUFDJ3MgdGhhdCBkbwogCSAqIHN1cHBvcnQgaXQgd2lsbCByZXR1cm4gdHJ1ZSB3L28gZG9pbmcgYW55dGhpbmcuCiAJICovCi0JcmV0ID0gYWgtPmFoX3NldHVwX3h0eF9kZXNjKGFoLCBOVUxMLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwlyZXQgPSBhaC0+YWhfc2V0dXBfbXJyX3R4X2Rlc2MoYWgsIE5VTEwsIDAsIDAsIDAsIDAsIDAsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAlpZiAocmV0ID4gMCkKQEAgLTY4OCwxNSArNzQ5LDEyIEBACiAJICogb24gc2V0dGluZ3MgbGlrZSB0aGUgcGh5IG1vZGUgYW5kIHJlZ3VsYXRvcnkKIAkgKiBkb21haW4gcmVzdHJpY3Rpb25zLgogCSAqLwotCXJldCA9IGF0aDVrX2dldGNoYW5uZWxzKGh3KTsKKwlyZXQgPSBhdGg1a19zZXR1cF9iYW5kcyhodyk7CiAJaWYgKHJldCkgewogCQlBVEg1S19FUlIoc2MsICJjYW4ndCBnZXQgY2hhbm5lbHNcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKLQkvKiBTZXQgKl9yYXRlcyBzbyB3ZSBjYW4gbWFwIGh3IHJhdGUgaW5kZXggKi8KLQlhdGg1a19zZXRfdG90YWxfaHdfcmF0ZXMoc2MpOwotCiAJLyogTkI6IHNldHVwIGhlcmUgc28gYXRoNWtfcmF0ZV91cGRhdGUgaXMgaGFwcHkgKi8KIAlpZiAodGVzdF9iaXQoQVI1S19NT0RFXzExQSwgYWgtPmFoX21vZGVzKSkKIAkJYXRoNWtfc2V0Y3VybW9kZShzYywgQVI1S19NT0RFXzExQSk7CkBAIC04MTMsMjcgKzg3MSw2IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWF0aDVrX2NvcHlfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcywKLQkJY29uc3Qgc3RydWN0IGF0aDVrX3JhdGVfdGFibGUgKnJ0LAotCQl1bnNpZ25lZCBpbnQgbWF4KQotewotCXVuc2lnbmVkIGludCBpLCBjb3VudDsKLQotCWlmIChydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IHJ0LT5yYXRlX2NvdW50ICYmIG1heCA+IDA7IGkrKykgewotCQlyYXRlc1tjb3VudF0uYml0cmF0ZSA9IHJ0LT5yYXRlc1tpXS5yYXRlX2ticHMgLyAxMDA7Ci0JCXJhdGVzW2NvdW50XS5od192YWx1ZSA9IHJ0LT5yYXRlc1tpXS5yYXRlX2NvZGU7Ci0JCXJhdGVzW2NvdW50XS5mbGFncyA9IHJ0LT5yYXRlc1tpXS5tb2R1bGF0aW9uOwotCQljb3VudCsrOwotCQltYXgtLTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKIGF0aDVrX2NvcHlfY2hhbm5lbHMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVscywKIAkJdW5zaWduZWQgaW50IG1vZGUsCkBAIC04OTUsNzQgKzkzMiw5NyBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHZvaWQKK2F0aDVrX3NldHVwX3JhdGVfaWR4KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmIpCit7CisJdTggaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjVLX01BWF9SQVRFUzsgaSsrKQorCQlzYy0+cmF0ZV9pZHhbYi0+YmFuZF1baV0gPSAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBiLT5uX2JpdHJhdGVzOyBpKyspIHsKKwkJc2MtPnJhdGVfaWR4W2ItPmJhbmRdW2ItPmJpdHJhdGVzW2ldLmh3X3ZhbHVlXSA9IGk7CisJCWlmIChiLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydCkKKwkJCXNjLT5yYXRlX2lkeFtiLT5iYW5kXVtiLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydF0gPSBpOworCX0KK30KKwogc3RhdGljIGludAotYXRoNWtfZ2V0Y2hhbm5lbHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCithdGg1a19zZXR1cF9iYW5kcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDVrX2h3ICphaCA9IHNjLT5haDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZHMgPSBzYy0+c2JhbmRzOwotCWNvbnN0IHN0cnVjdCBhdGg1a19yYXRlX3RhYmxlICpod19yYXRlczsKLQl1bnNpZ25lZCBpbnQgbWF4X3IsIG1heF9jLCBjb3VudF9yLCBjb3VudF9jOwotCWludCBtb2RlMmcgPSBBUjVLX01PREVfMTFHOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWludCBtYXhfYywgY291bnRfYyA9IDA7CisJaW50IGk7CiAKIAlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzYy0+c2JhbmRzKSA8IElFRUU4MDIxMV9OVU1fQkFORFMpOwotCi0JbWF4X3IgPSBBUlJBWV9TSVpFKHNjLT5yYXRlcyk7CiAJbWF4X2MgPSBBUlJBWV9TSVpFKHNjLT5jaGFubmVscyk7Ci0JY291bnRfciA9IGNvdW50X2MgPSAwOwogCiAJLyogMkdIeiBiYW5kICovCi0JaWYgKCF0ZXN0X2JpdChBUjVLX01PREVfMTFHLCBzYy0+YWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSkpIHsKLQkJbW9kZTJnID0gQVI1S19NT0RFXzExQjsKLQkJaWYgKCF0ZXN0X2JpdChBUjVLX01PREVfMTFCLAotCQkJc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKQotCQkJbW9kZTJnID0gLTE7Ci0JfQorCXNiYW5kID0gJnNjLT5zYmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJc2JhbmQtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOworCXNiYW5kLT5iaXRyYXRlcyA9ICZzYy0+cmF0ZXNbSUVFRTgwMjExX0JBTkRfMkdIWl1bMF07CiAKLQlpZiAobW9kZTJnID4gMCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9Ci0JCQkmc2JhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOworCWlmICh0ZXN0X2JpdChBUjVLX01PREVfMTFHLCBzYy0+YWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSkpIHsKKwkJLyogRyBtb2RlICovCisJCW1lbWNweShzYmFuZC0+Yml0cmF0ZXMsICZhdGg1a19yYXRlc1swXSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogMTIpOworCQlzYmFuZC0+bl9iaXRyYXRlcyA9IDEyOwogCi0JCXNiYW5kLT5iaXRyYXRlcyA9IHNjLT5yYXRlczsKIAkJc2JhbmQtPmNoYW5uZWxzID0gc2MtPmNoYW5uZWxzOwotCi0JCXNiYW5kLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKIAkJc2JhbmQtPm5fY2hhbm5lbHMgPSBhdGg1a19jb3B5X2NoYW5uZWxzKGFoLCBzYmFuZC0+Y2hhbm5lbHMsCi0JCQkJCW1vZGUyZywgbWF4X2MpOwotCi0JCWh3X3JhdGVzID0gYXRoNWtfaHdfZ2V0X3JhdGVfdGFibGUoYWgsIG1vZGUyZyk7Ci0JCXNiYW5kLT5uX2JpdHJhdGVzID0gYXRoNWtfY29weV9yYXRlcyhzYmFuZC0+Yml0cmF0ZXMsCi0JCQkJCWh3X3JhdGVzLCBtYXhfcik7Ci0KLQkJY291bnRfYyA9IHNiYW5kLT5uX2NoYW5uZWxzOwotCQljb3VudF9yID0gc2JhbmQtPm5fYml0cmF0ZXM7CisJCQkJCUFSNUtfTU9ERV8xMUcsIG1heF9jKTsKIAogCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gc2JhbmQ7Ci0KLQkJbWF4X3IgLT0gY291bnRfcjsKKwkJY291bnRfYyA9IHNiYW5kLT5uX2NoYW5uZWxzOwogCQltYXhfYyAtPSBjb3VudF9jOworCX0gZWxzZSBpZiAodGVzdF9iaXQoQVI1S19NT0RFXzExQiwgc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKSB7CisJCS8qIEIgbW9kZSAqLworCQltZW1jcHkoc2JhbmQtPmJpdHJhdGVzLCAmYXRoNWtfcmF0ZXNbMF0sCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yYXRlKSAqIDQpOworCQlzYmFuZC0+bl9iaXRyYXRlcyA9IDQ7CiAKKwkJLyogNTIxMSBvbmx5IHN1cHBvcnRzIEIgcmF0ZXMgYW5kIHVzZXMgNGJpdCByYXRlIGNvZGVzCisJCSAqIChlLmcgbm9ybWFsbHkgd2UgaGF2ZSAweDFCIGZvciAxTSwgYnV0IG9uIDUyMTEgd2UgaGF2ZSAweDBCKQorCQkgKiBmaXggdGhlbSB1cCBoZXJlOgorCQkgKi8KKwkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJc2JhbmQtPmJpdHJhdGVzW2ldLmh3X3ZhbHVlID0KKwkJCQkJc2JhbmQtPmJpdHJhdGVzW2ldLmh3X3ZhbHVlICYgMHhGOworCQkJCXNiYW5kLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9CisJCQkJCXNiYW5kLT5iaXRyYXRlc1tpXS5od192YWx1ZV9zaG9ydCAmIDB4RjsKKwkJCX0KKwkJfQorCisJCXNiYW5kLT5jaGFubmVscyA9IHNjLT5jaGFubmVsczsKKwkJc2JhbmQtPm5fY2hhbm5lbHMgPSBhdGg1a19jb3B5X2NoYW5uZWxzKGFoLCBzYmFuZC0+Y2hhbm5lbHMsCisJCQkJCUFSNUtfTU9ERV8xMUIsIG1heF9jKTsKKworCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gc2JhbmQ7CisJCWNvdW50X2MgPSBzYmFuZC0+bl9jaGFubmVsczsKKwkJbWF4X2MgLT0gY291bnRfYzsKIAl9CisJYXRoNWtfc2V0dXBfcmF0ZV9pZHgoc2MsIHNiYW5kKTsKIAotCS8qIDVHSHogYmFuZCAqLwotCisJLyogNUdIeiBiYW5kLCBBIG1vZGUgKi8KIAlpZiAodGVzdF9iaXQoQVI1S19NT0RFXzExQSwgc2MtPmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0KLQkJCSZzYmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07Ci0KLQkJc2JhbmQtPmJpdHJhdGVzID0gJnNjLT5yYXRlc1tjb3VudF9yXTsKLQkJc2JhbmQtPmNoYW5uZWxzID0gJnNjLT5jaGFubmVsc1tjb3VudF9jXTsKLQorCQlzYmFuZCA9ICZzYy0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwogCQlzYmFuZC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7CisJCXNiYW5kLT5iaXRyYXRlcyA9ICZzYy0+cmF0ZXNbSUVFRTgwMjExX0JBTkRfNUdIWl1bMF07CisKKwkJbWVtY3B5KHNiYW5kLT5iaXRyYXRlcywgJmF0aDVrX3JhdGVzWzRdLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiA4KTsKKwkJc2JhbmQtPm5fYml0cmF0ZXMgPSA4OworCisJCXNiYW5kLT5jaGFubmVscyA9ICZzYy0+Y2hhbm5lbHNbY291bnRfY107CiAJCXNiYW5kLT5uX2NoYW5uZWxzID0gYXRoNWtfY29weV9jaGFubmVscyhhaCwgc2JhbmQtPmNoYW5uZWxzLAogCQkJCQlBUjVLX01PREVfMTFBLCBtYXhfYyk7CiAKLQkJaHdfcmF0ZXMgPSBhdGg1a19od19nZXRfcmF0ZV90YWJsZShhaCwgQVI1S19NT0RFXzExQSk7Ci0JCXNiYW5kLT5uX2JpdHJhdGVzID0gYXRoNWtfY29weV9yYXRlcyhzYmFuZC0+Yml0cmF0ZXMsCi0JCQkJCWh3X3JhdGVzLCBtYXhfcik7Ci0KIAkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9IHNiYW5kOwogCX0KKwlhdGg1a19zZXR1cF9yYXRlX2lkeChzYywgc2JhbmQpOwogCiAJYXRoNWtfZGVidWdfZHVtcF9iYW5kcyhzYyk7CiAKQEAgLTk3OCw5ICsxMDM4LDYgQEAKIHN0YXRpYyBpbnQKIGF0aDVrX2NoYW5fc2V0KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbikKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwotCWludCByZXQ7Ci0KIAlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAiKCV1IE1IeikgLT4gKCV1IE1IeilcbiIsCiAJCXNjLT5jdXJjaGFuLT5jZW50ZXJfZnJlcSwgY2hhbi0+Y2VudGVyX2ZyZXEpOwogCkBAIC05OTYsNDEgKzEwNTMsNyBAQAogCQkgKiBoYXJkd2FyZSBhdCB0aGUgbmV3IGZyZXF1ZW5jeSwgYW5kIHRoZW4gcmUtZW5hYmxlCiAJCSAqIHRoZSByZWxldmFudCBiaXRzIG9mIHRoZSBoL3cuCiAJCSAqLwotCQlhdGg1a19od19zZXRfaW50cihhaCwgMCk7CS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCQlhdGg1a190eHFfY2xlYW51cChzYyk7CQkvKiBjbGVhciBwZW5kaW5nIHR4IGZyYW1lcyAqLwotCQlhdGg1a19yeF9zdG9wKHNjKTsJCS8qIHR1cm4gb2ZmIGZyYW1lIHJlY3YgKi8KLQkJcmV0ID0gYXRoNWtfaHdfcmVzZXQoYWgsIHNjLT5vcG1vZGUsIHNjLT5jdXJjaGFuLCB0cnVlKTsKLQkJaWYgKHJldCkgewotCQkJQVRINUtfRVJSKHNjLCAiJXM6IHVuYWJsZSB0byByZXNldCBjaGFubmVsICIKLQkJCQkiKCV1IE1oeilcbiIsIF9fZnVuY19fLCBjaGFuLT5jZW50ZXJfZnJlcSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc2MtPmFoLCAwKTsKLQotCQkvKgotCQkgKiBSZS1lbmFibGUgcnggZnJhbWV3b3JrLgotCQkgKi8KLQkJcmV0ID0gYXRoNWtfcnhfc3RhcnQoc2MpOwotCQlpZiAocmV0KSB7Ci0JCQlBVEg1S19FUlIoc2MsICIlczogdW5hYmxlIHRvIHJlc3RhcnQgcmVjdiBsb2dpY1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qCi0JCSAqIENoYW5nZSBjaGFubmVscyBhbmQgdXBkYXRlIHRoZSBoL3cgcmF0ZSBtYXAKLQkJICogaWYgd2UncmUgc3dpdGNoaW5nOyBlLmcuIDExYSB0byAxMWIvZy4KLQkJICoKLQkJICogWFhYIG5lZWRlZD8KLQkJICovCi0vKgkJYXRoNWtfY2hhbl9jaGFuZ2Uoc2MsIGNoYW4pOyAqLwotCi0JCWF0aDVrX2JlYWNvbl9jb25maWcoc2MpOwotCQkvKgotCQkgKiBSZS1lbmFibGUgaW50ZXJydXB0cy4KLQkJICovCi0JCWF0aDVrX2h3X3NldF9pbnRyKGFoLCBzYy0+aW1hc2spOworCQlyZXR1cm4gYXRoNWtfcmVzZXQoc2MsIHRydWUsIHRydWUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTA2OCw3NSArMTA5MSwxMyBAQAogCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfTU9ERSwgIlJYIGZpbHRlciAweCV4XG4iLCByZmlsdCk7CiB9CiAKLS8qCi0gKiBNYXRjaCB0aGUgaHcgcHJvdmlkZWQgcmF0ZSBpbmRleCAodGhyb3VnaCBkZXNjcmlwdG9ycykKLSAqIHRvIGFuIGluZGV4IGZvciBzYy0+Y3VyYmFuZC0+Yml0cmF0ZXMsIHNvIGl0IGNhbiBiZSB1c2VkCi0gKiBieSB0aGUgc3RhY2suCi0gKgotICogVGhpcyBvbmUgaXMgYSBsaXR0bGUgYml0IHRyaWNreSBidXQgaSB0aGluayBpJ20gcmlnaHQKLSAqIGFib3V0IHRoaXMuLi4KLSAqCi0gKiBXZSBoYXZlIDQgcmF0ZSB0YWJsZXMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAqIFhSICg0IHJhdGVzKQotICogODAyLjExYSAoOCByYXRlcykKLSAqIDgwMi4xMWIgKDQgcmF0ZXMpCi0gKiA4MDIuMTFnICgxMiByYXRlcykKLSAqIHRoYXQgbWFrZSB0aGUgaHcgcmF0ZSB0YWJsZS4KLSAqCi0gKiBMZXRzIHRha2UgYSA1MjExIGZvciBleGFtcGxlIHRoYXQgc3VwcG9ydHMgYSBhbmQgYiBtb2RlcyBvbmx5LgotICogRmlyc3QgY29tZXMgdGhlIDgwMi4xMWEgdGFibGUgYW5kIHRoZW4gODAyLjExYiAodG90YWwgMTIgcmF0ZXMpLgotICogV2hlbiBodyByZXR1cm5zIGVnLiAxMSBpdCBwb2ludHMgdG8gdGhlIGxhc3QgODAyLjExYiByYXRlICgxMU1iaXQpLAotICogaWYgaXQgcmV0dXJucyAyIGl0IHBvaW50cyB0byB0aGUgc2Vjb25kIDgwMi4xMWEgcmF0ZSBldGMuCi0gKgotICogU2FtZSBnb2VzIGZvciA1MjEyIHdobyBoYXMgeHIvYS9iL2cgc3VwcG9ydCAodG90YWwgMjggcmF0ZXMpLgotICogRmlyc3QgY29tZXMgdGhlIFhSIHRhYmxlLCB0aGVuIDgwMi4xMWEsIDgwMi4xMWIgYW5kIDgwMi4xMWcuCi0gKiBXaGVuIGh3IHJldHVybnMgZWcuIDI3IGl0IHBvaW50cyB0byB0aGUgbGFzdCA4MDIuMTFnIHJhdGUgKDU0TWJpdHMpIGV0YwotICovCi1zdGF0aWMgdm9pZAotYXRoNWtfc2V0X3RvdGFsX2h3X3JhdGVzKHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MpIHsKLQotCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7Ci0KLQlpZiAodGVzdF9iaXQoQVI1S19NT0RFXzExQSwgYWgtPmFoX21vZGVzKSkKLQkJc2MtPmFfcmF0ZXMgPSA4OwotCi0JaWYgKHRlc3RfYml0KEFSNUtfTU9ERV8xMUIsIGFoLT5haF9tb2RlcykpCi0JCXNjLT5iX3JhdGVzID0gNDsKLQotCWlmICh0ZXN0X2JpdChBUjVLX01PREVfMTFHLCBhaC0+YWhfbW9kZXMpKQotCQlzYy0+Z19yYXRlcyA9IDEyOwotCi0JLyogWFhYOiBOZWVkIHRvIHNlZSB3aGF0IHdoYXQgaGFwcGVucyB3aGVuCi0JCXhyIGRpc2FibGUgYml0cyBpbiBlZXByb20gYXJlIHNldCAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA+PSBBUjVLX0FSNTIxMikKLQkJc2MtPnhyX3JhdGVzID0gNDsKLQotfQotCiBzdGF0aWMgaW5saW5lIGludAotYXRoNWtfaHdfdG9fZHJpdmVyX3JpeChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBpbnQgaHdfcml4KSB7Ci0KLQlpbnQgbWFjODAyMTFfcml4OwotCi0JaWYoc2MtPmN1cmJhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgewotCQkvKiBXZSBzZXR1cCBhIGcgcmF0ZXRhYmxlIGZvciBib3RoIGIvZyBtb2RlcyAqLwotCQltYWM4MDIxMV9yaXggPQotCQkJaHdfcml4IC0gc2MtPmJfcmF0ZXMgLSBzYy0+YV9yYXRlcyAtIHNjLT54cl9yYXRlczsKLQl9IGVsc2UgewotCQltYWM4MDIxMV9yaXggPSBod19yaXggLSBzYy0+eHJfcmF0ZXM7Ci0JfQotCi0JLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIGZhbGxiYWNrIHRvIGJhc2ljIHJhdGUgZm9yIHRoaXMgYmFuZCAqLwotCWlmICgobWFjODAyMTFfcml4ID49IHNjLT5jdXJiYW5kLT5uX2JpdHJhdGVzKSB8fAotCQkobWFjODAyMTFfcml4IDw9IDAgKSkKLQkJbWFjODAyMTFfcml4ID0gMTsKLQotCXJldHVybiBtYWM4MDIxMV9yaXg7CithdGg1a19od190b19kcml2ZXJfcml4KHN0cnVjdCBhdGg1a19zb2Z0YyAqc2MsIGludCBod19yaXgpCit7CisJV0FSTl9PTihod19yaXggPCAwIHx8IGh3X3JpeCA+IEFSNUtfTUFYX1JBVEVTKTsKKwlyZXR1cm4gc2MtPnJhdGVfaWR4W3NjLT5jdXJiYW5kLT5iYW5kXVtod19yaXhdOwogfQogCi0KLQotCiAvKioqKioqKioqKioqKioqXAogKiBCdWZmZXJzIHNldHVwICoKIFwqKioqKioqKioqKioqKiovCkBAIC0xMTk5LDcgKzExNjAsNyBAQAogCWRzID0gYmYtPmRlc2M7CiAJZHMtPmRzX2xpbmsgPSBiZi0+ZGFkZHI7CS8qIGxpbmsgdG8gc2VsZiAqLwogCWRzLT5kc19kYXRhID0gYmYtPnNrYmFkZHI7Ci0JYXRoNWtfaHdfc2V0dXBfcnhfZGVzYyhhaCwgZHMsCisJYWgtPmFoX3NldHVwX3J4X2Rlc2MoYWgsIGRzLAogCQlza2JfdGFpbHJvb20oc2tiKSwJLyogYnVmZmVyIHNpemUgKi8KIAkJMCk7CiAKQEAgLTEyMTgsNyArMTE3OSw5IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGJmLT5za2I7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCXVuc2lnbmVkIGludCBwa3RsZW4sIGZsYWdzLCBrZXlpZHggPSBBUjVLX1RYS0VZSVhfSU5WQUxJRDsKLQlpbnQgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKKwl1bnNpZ25lZCBpbnQgbXJyX3JhdGVbM10sIG1ycl90cmllc1szXTsKKwlpbnQgaSwgcmV0OwogCiAJZmxhZ3MgPSBBUjVLX1RYREVTQ19JTlRSRVEgfCBBUjVLX1RYREVTQ19DTFJETUFTSzsKIApAQCAtMTIzMyw3ICsxMTk2LDcgQEAKIAogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkgewogCQlrZXlpZHggPSBpbmZvLT5jb250cm9sLmh3X2tleS0+aHdfa2V5X2lkeDsKLQkJcGt0bGVuICs9IGluZm8tPmNvbnRyb2wuaWN2X2xlbjsKKwkJcGt0bGVuICs9IGluZm8tPmNvbnRyb2wuaHdfa2V5LT5pY3ZfbGVuOwogCX0KIAlyZXQgPSBhaC0+YWhfc2V0dXBfdHhfZGVzYyhhaCwgZHMsIHBrdGxlbiwKIAkJaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKSwgQVI1S19QS1RfVFlQRV9OT1JNQUwsCkBAIC0xMjQzLDYgKzEyMDYsMjIgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bm1hcDsKIAorCW1lbXNldChtcnJfcmF0ZSwgMCwgc2l6ZW9mKG1ycl9yYXRlKSk7CisJbWVtc2V0KG1ycl90cmllcywgMCwgc2l6ZW9mKG1ycl90cmllcykpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmF0ZSA9IGllZWU4MDIxMV9nZXRfYWx0X3JldHJ5X3JhdGUoc2MtPmh3LCBpbmZvLCBpKTsKKwkJaWYgKCFyYXRlKQorCQkJYnJlYWs7CisKKwkJbXJyX3JhdGVbaV0gPSByYXRlLT5od192YWx1ZTsKKwkJbXJyX3RyaWVzW2ldID0gaW5mby0+Y29udHJvbC5yZXRyaWVzW2ldLmxpbWl0OworCX0KKworCWFoLT5haF9zZXR1cF9tcnJfdHhfZGVzYyhhaCwgZHMsCisJCW1ycl9yYXRlWzBdLCBtcnJfdHJpZXNbMF0sCisJCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCisJCW1ycl9yYXRlWzJdLCBtcnJfdHJpZXNbMl0pOworCiAJZHMtPmRzX2xpbmsgPSAwOwogCWRzLT5kc19kYXRhID0gYmYtPnNrYmFkZHI7CiAKQEAgLTEyNTAsMTIgKzEyMjksMTIgQEAKIAlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJnR4cS0+cSk7CiAJc2MtPnR4X3N0YXRzW3R4cS0+cW51bV0ubGVuKys7CiAJaWYgKHR4cS0+bGluayA9PSBOVUxMKSAvKiBpcyB0aGlzIGZpcnN0IHBhY2tldD8gKi8KLQkJYXRoNWtfaHdfcHV0X3R4X2J1ZihhaCwgdHhxLT5xbnVtLCBiZi0+ZGFkZHIpOworCQlhdGg1a19od19zZXRfdHhkcChhaCwgdHhxLT5xbnVtLCBiZi0+ZGFkZHIpOwogCWVsc2UgLyogbm8sIHNvIG9ubHkgbGluayBpdCAqLwogCQkqdHhxLT5saW5rID0gYmYtPmRhZGRyOwogCiAJdHhxLT5saW5rID0gJmRzLT5kc19saW5rOwotCWF0aDVrX2h3X3R4X3N0YXJ0KGFoLCB0eHEtPnFudW0pOworCWF0aDVrX2h3X3N0YXJ0X3R4X2RtYShhaCwgdHhxLT5xbnVtKTsKIAltbWlvd2IoKTsKIAlzcGluX3VubG9ja19iaCgmdHhxLT5sb2NrKTsKIApAQCAtMTQzMyw3ICsxNDEyLDggQEAKIAlyZXQgPSBhdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhhaCwgc2MtPmJoYWxxLCAmcWkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQlzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpIHsKIAkJLyoKIAkJICogQWx3YXlzIGJ1cnN0IG91dCBiZWFjb24gYW5kIENBQiB0cmFmZmljCiAJCSAqIChhaWZzID0gY3dtaW4gPSBjd21heCA9IDApCkBAIC0xNDQxLDcgKzE0MjEsNyBAQAogCQlxaS50cWlfYWlmcyA9IDA7CiAJCXFpLnRxaV9jd19taW4gPSAwOwogCQlxaS50cWlfY3dfbWF4ID0gMDsKLQl9IGVsc2UgaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgeworCX0gZWxzZSBpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkvKgogCQkgKiBBZGhvYyBtb2RlOyBiYWNrb2ZmIGJldHdlZW4gMCBhbmQgKDIgKiBjd19taW4pLgogCQkgKi8KQEAgLTE0NTQsNyArMTQzNCw3IEBACiAJCSJiZWFjb24gcXVldWVwcm9wcyB0cWlfYWlmczolZCB0cWlfY3dfbWluOiVkIHRxaV9jd19tYXg6JWRcbiIsCiAJCXFpLnRxaV9haWZzLCBxaS50cWlfY3dfbWluLCBxaS50cWlfY3dfbWF4KTsKIAotCXJldCA9IGF0aDVrX2h3X3NldHVwX3R4X3F1ZXVlcHJvcHMoYWgsIHNjLT5iaGFscSwgJnFpKTsKKwlyZXQgPSBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgc2MtPmJoYWxxLCAmcWkpOwogCWlmIChyZXQpIHsKIAkJQVRINUtfRVJSKHNjLCAiJXM6IHVuYWJsZSB0byB1cGRhdGUgcGFyYW1ldGVycyBmb3IgYmVhY29uICIKIAkJCSJoYXJkd2FyZSBxdWV1ZSFcbiIsIF9fZnVuY19fKTsKQEAgLTE1MDMsMTQgKzE0ODMsMTQgQEAKIAkJLyogZG9uJ3QgdG91Y2ggdGhlIGhhcmR3YXJlIGlmIG1hcmtlZCBpbnZhbGlkICovCiAJCWF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBzYy0+YmhhbHEpOwogCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAiYmVhY29uIHF1ZXVlICV4XG4iLAotCQkJYXRoNWtfaHdfZ2V0X3R4X2J1ZihhaCwgc2MtPmJoYWxxKSk7CisJCQlhdGg1a19od19nZXRfdHhkcChhaCwgc2MtPmJoYWxxKSk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNjLT50eHFzKTsgaSsrKQogCQkJaWYgKHNjLT50eHFzW2ldLnNldHVwKSB7CiAJCQkJYXRoNWtfaHdfc3RvcF90eF9kbWEoYWgsIHNjLT50eHFzW2ldLnFudW0pOwogCQkJCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJ0eHEgWyV1XSAleCwgIgogCQkJCQkibGluayAlcFxuIiwKIAkJCQkJc2MtPnR4cXNbaV0ucW51bSwKLQkJCQkJYXRoNWtfaHdfZ2V0X3R4X2J1ZihhaCwKKwkJCQkJYXRoNWtfaHdfZ2V0X3R4ZHAoYWgsCiAJCQkJCQkJc2MtPnR4cXNbaV0ucW51bSksCiAJCQkJCXNjLT50eHFzW2ldLmxpbmspOwogCQkJfQpAQCAtMTU3MCw4ICsxNTUwLDggQEAKIAliZiA9IGxpc3RfZmlyc3RfZW50cnkoJnNjLT5yeGJ1Ziwgc3RydWN0IGF0aDVrX2J1ZiwgbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnNjLT5yeGJ1ZmxvY2spOwogCi0JYXRoNWtfaHdfcHV0X3J4X2J1ZihhaCwgYmYtPmRhZGRyKTsKLQlhdGg1a19od19zdGFydF9yeChhaCk7CQkvKiBlbmFibGUgcmVjdiBkZXNjcmlwdG9ycyAqLworCWF0aDVrX2h3X3NldF9yeGRwKGFoLCBiZi0+ZGFkZHIpOworCWF0aDVrX2h3X3N0YXJ0X3J4X2RtYShhaCk7CS8qIGVuYWJsZSByZWN2IGRlc2NyaXB0b3JzICovCiAJYXRoNWtfbW9kZV9zZXR1cChzYyk7CQkvKiBzZXQgZmlsdGVycywgZXRjLiAqLwogCWF0aDVrX2h3X3N0YXJ0X3J4X3BjdShhaCk7CS8qIHJlLWVuYWJsZSBQQ1UvRE1BIGVuZ2luZSAqLwogCkBAIC0xNTg4LDcgKzE1NjgsNyBAQAogewogCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAKLQlhdGg1a19od19zdG9wX3BjdV9yZWN2KGFoKTsJLyogZGlzYWJsZSBQQ1UgKi8KKwlhdGg1a19od19zdG9wX3J4X3BjdShhaCk7CS8qIGRpc2FibGUgUENVICovCiAJYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihhaCwgMCk7CS8qIGNsZWFyIHJlY3YgZmlsdGVyICovCiAJYXRoNWtfaHdfc3RvcF9yeF9kbWEoYWgpOwkvKiBkaXNhYmxlIERNQSBlbmdpbmUgKi8KIApAQCAtMTYwMiw3ICsxNTgyLDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOwotCXVuc2lnbmVkIGludCBrZXlpeCwgaGxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKHNrYik7CisJdW5zaWduZWQgaW50IGtleWl4LCBobGVuOwogCiAJaWYgKCEocnMtPnJzX3N0YXR1cyAmIEFSNUtfUlhFUlJfREVDUllQVCkgJiYKIAkJCXJzLT5yc19rZXlpeCAhPSBBUjVLX1JYS0VZSVhfSU5WQUxJRCkKQEAgLTE2MTEsNiArMTU5MSw3IEBACiAJLyogQXBwYXJlbnRseSB3aGVuIGEgZGVmYXVsdCBrZXkgaXMgdXNlZCB0byBkZWNyeXB0IHRoZSBwYWNrZXQKIAkgICB0aGUgaHcgZG9lcyBub3Qgc2V0IHRoZSBpbmRleCB1c2VkIHRvIGRlY3J5cHQuICBJbiBzdWNoIGNhc2VzCiAJICAgZ2V0IHRoZSBpbmRleCBmcm9tIHRoZSBwYWNrZXQuICovCisJaGxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKIAlpZiAoaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICAhKHJzLT5yc19zdGF0dXMgJiBBUjVLX1JYRVJSX0RFQ1JZUFQpICYmCiAJICAgIHNrYi0+bGVuID49IGhsZW4gKyA0KSB7CkBAIC0xNzY4LDcgKzE3NDksNyBAQAogCQkJLyogbGV0IGNyeXB0by1lcnJvciBwYWNrZXRzIGZhbGwgdGhyb3VnaCBpbiBNTlRSICovCiAJCQlpZiAoKHJzLnJzX3N0YXR1cyAmCiAJCQkJfihBUjVLX1JYRVJSX0RFQ1JZUFR8QVI1S19SWEVSUl9NSUMpKSB8fAotCQkJCQlzYy0+b3Btb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX01OVFIpCisJCQkJCXNjLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKIAkJCQlnb3RvIG5leHQ7CiAJCX0KIGFjY2VwdDoKQEAgLTE4MjQsMTAgKzE4MDUsMTQgQEAKIAkJcnhzLnJhdGVfaWR4ID0gYXRoNWtfaHdfdG9fZHJpdmVyX3JpeChzYywgcnMucnNfcmF0ZSk7CiAJCXJ4cy5mbGFnIHw9IGF0aDVrX3J4X2RlY3J5cHRlZChzYywgZHMsIHNrYiwgJnJzKTsKIAorCQlpZiAocnhzLnJhdGVfaWR4ID49IDAgJiYgcnMucnNfcmF0ZSA9PQorCQkgICAgc2MtPmN1cmJhbmQtPmJpdHJhdGVzW3J4cy5yYXRlX2lkeF0uaHdfdmFsdWVfc2hvcnQpCisJCQlyeHMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOworCiAJCWF0aDVrX2RlYnVnX2R1bXBfc2tiKHNjLCBza2IsICJSWCAgIiwgMCk7CiAKIAkJLyogY2hlY2sgYmVhY29ucyBpbiBJQlNTIG1vZGUgKi8KLQkJaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwkJaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCQlhdGg1a19jaGVja19pYnNzX3RzZihzYywgc2tiLCAmcnhzKTsKIAogCQlfX2llZWU4MDIxMV9yeChzYy0+aHcsIHNrYiwgJnJ4cyk7CkBAIC0xODUzLDcgKzE4MzgsNyBAQAogCXN0cnVjdCBhdGg1a19kZXNjICpkczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQlpbnQgcmV0OworCWludCBpLCByZXQ7CiAKIAlzcGluX2xvY2soJnR4cS0+bG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJmLCBiZjAsICZ0eHEtPnEsIGxpc3QpIHsKQEAgLTE4NzUsNyArMTg2MCwyNSBAQAogCQlwY2lfdW5tYXBfc2luZ2xlKHNjLT5wZGV2LCBiZi0+c2tiYWRkciwgc2tiLT5sZW4sCiAJCQkJUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJaW5mby0+c3RhdHVzLnJldHJ5X2NvdW50ID0gdHMudHNfc2hvcnRyZXRyeSArIHRzLnRzX2xvbmdyZXRyeSAvIDY7CisJCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7CisJCWluZm8tPnR4X3JhdGVfaWR4ID0gYXRoNWtfaHdfdG9fZHJpdmVyX3JpeChzYywKKwkJCQl0cy50c19yYXRlW3RzLnRzX2ZpbmFsX2lkeF0pOworCQlpbmZvLT5zdGF0dXMucmV0cnlfY291bnQgPSB0cy50c19sb25ncmV0cnk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJc3RydWN0IGllZWU4MDIxMV90eF9hbHRyYXRlICpyID0KKwkJCQkmaW5mby0+c3RhdHVzLnJldHJpZXNbaV07CisKKwkJCWlmICh0cy50c19yYXRlW2ldKSB7CisJCQkJci0+cmF0ZV9pZHggPSBhdGg1a19od190b19kcml2ZXJfcml4KHNjLCB0cy50c19yYXRlW2ldKTsKKwkJCQlyLT5saW1pdCA9IHRzLnRzX3JldHJ5W2ldOworCQkJfSBlbHNlIHsKKwkJCQlyLT5yYXRlX2lkeCA9IC0xOworCQkJCXItPmxpbWl0ID0gMDsKKwkJCX0KKwkJfQorCisJCWluZm8tPnN0YXR1cy5leGNlc3NpdmVfcmV0cmllcyA9IDA7CiAJCWlmICh1bmxpa2VseSh0cy50c19zdGF0dXMpKSB7CiAJCQlzYy0+bGxfc3RhdHMuZG90MTFBQ0tGYWlsdXJlQ291bnQrKzsKIAkJCWlmICh0cy50c19zdGF0dXMgJiBBUjVLX1RYRVJSX1hSRVRSWSkKQEAgLTE5NDIsNyArMTk0NSw3IEBACiAJZHMgPSBiZi0+ZGVzYzsKIAogCWZsYWdzID0gQVI1S19UWERFU0NfTk9BQ0s7Ci0JaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJiBhdGg1a19od19oYXN2ZW9sKGFoKSkgeworCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIGF0aDVrX2h3X2hhc3Zlb2woYWgpKSB7CiAJCWRzLT5kc19saW5rID0gYmYtPmRhZGRyOwkvKiBzZWxmLWxpbmtlZCAqLwogCQlmbGFncyB8PSBBUjVLX1RYREVTQ19WRU9MOwogCQkvKgpAQCAtMTk5MSw4ICsxOTk0LDggQEAKIAogCUFUSDVLX0RCR19VTkxJTUlUKHNjLCBBVEg1S19ERUJVR19CRUFDT04sICJpbiBiZWFjb25fc2VuZFxuIik7CiAKLQlpZiAodW5saWtlbHkoYmYtPnNrYiA9PSBOVUxMIHx8IHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBIHx8Ci0JCQlzYy0+b3Btb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX01OVFIpKSB7CisJaWYgKHVubGlrZWx5KGJmLT5za2IgPT0gTlVMTCB8fCBzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJCXNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpIHsKIAkJQVRINUtfV0FSTihzYywgImJmPSVwIGJmX3NrYj0lcFxuIiwgYmYsIGJmID8gYmYtPnNrYiA6IE5VTEwpOwogCQlyZXR1cm47CiAJfQpAQCAtMjAzMiw4ICsyMDM1LDggQEAKIAkJLyogTkI6IGh3IHN0aWxsIHN0b3BzIERNQSwgc28gcHJvY2VlZCAqLwogCX0KIAotCWF0aDVrX2h3X3B1dF90eF9idWYoYWgsIHNjLT5iaGFscSwgYmYtPmRhZGRyKTsKLQlhdGg1a19od190eF9zdGFydChhaCwgc2MtPmJoYWxxKTsKKwlhdGg1a19od19zZXRfdHhkcChhaCwgc2MtPmJoYWxxLCBiZi0+ZGFkZHIpOworCWF0aDVrX2h3X3N0YXJ0X3R4X2RtYShhaCwgc2MtPmJoYWxxKTsKIAlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX0JFQUNPTiwgIlRYRFBbJXVdID0gJWxseCAoJXApXG4iLAogCQlzYy0+YmhhbHEsICh1bnNpZ25lZCBsb25nIGxvbmcpYmYtPmRhZGRyLCBiZi0+ZGVzYyk7CiAKQEAgLTIxNjIsMTMgKzIxNjUsMTMgQEAKIHsKIAlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gc2MtPmFoOwogCi0JYXRoNWtfaHdfc2V0X2ludHIoYWgsIDApOworCWF0aDVrX2h3X3NldF9pbXIoYWgsIDApOwogCXNjLT5ibWlzc2NvdW50ID0gMDsKIAlzYy0+aW1hc2sgJj0gfihBUjVLX0lOVF9CTUlTUyB8IEFSNUtfSU5UX1NXQkEpOwogCi0JaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSB7CisJaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogCQlzYy0+aW1hc2sgfD0gQVI1S19JTlRfQk1JU1M7Ci0JfSBlbHNlIGlmIChzYy0+b3Btb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwl9IGVsc2UgaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJLyoKIAkJICogSW4gSUJTUyBtb2RlIHdlIHVzZSBhIHNlbGYtbGlua2VkIHR4IGRlc2NyaXB0b3IgYW5kIGxldCB0aGUKIAkJICogaGFyZHdhcmUgc2VuZCB0aGUgYmVhY29ucyBhdXRvbWF0aWNhbGx5LiBXZSBoYXZlIHRvIGxvYWQgaXQKQEAgLTIxODgsNyArMjE5MSw3IEBACiAJfQogCS8qIFRPRE8gZWxzZSBBUCAqLwogCi0JYXRoNWtfaHdfc2V0X2ludHIoYWgsIHNjLT5pbWFzayk7CisJYXRoNWtfaHdfc2V0X2ltcihhaCwgc2MtPmltYXNrKTsKIH0KIAogCkBAIC0yMjIwLDM2ICsyMjIzLDEzIEBACiAJICovCiAJc2MtPmN1cmNoYW4gPSBzYy0+aHctPmNvbmYuY2hhbm5lbDsKIAlzYy0+Y3VyYmFuZCA9ICZzYy0+c2JhbmRzW3NjLT5jdXJjaGFuLT5iYW5kXTsKLQlyZXQgPSBhdGg1a19od19yZXNldChzYy0+YWgsIHNjLT5vcG1vZGUsIHNjLT5jdXJjaGFuLCBmYWxzZSk7Ci0JaWYgKHJldCkgewotCQlBVEg1S19FUlIoc2MsICJ1bmFibGUgdG8gcmVzZXQgaGFyZHdhcmU6ICVkXG4iLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qCi0JICogVGhpcyBpcyBuZWVkZWQgb25seSB0byBzZXR1cCBpbml0aWFsIHN0YXRlCi0JICogYnV0IGl0J3MgYmVzdCBkb25lIGFmdGVyIGEgcmVzZXQuCi0JICovCi0JYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc2MtPmFoLCAwKTsKLQotCS8qCi0JICogU2V0dXAgdGhlIGhhcmR3YXJlIGFmdGVyIHJlc2V0OiB0aGUga2V5IGNhY2hlCi0JICogaXMgZmlsbGVkIGFzIG5lZWRlZCBhbmQgdGhlIHJlY2VpdmUgZW5naW5lIGlzCi0JICogc2V0IGdvaW5nLiAgRnJhbWUgdHJhbnNtaXQgaXMgaGFuZGxlZCBlbnRpcmVseQotCSAqIGluIHRoZSBmcmFtZSBvdXRwdXQgcGF0aDsgdGhlcmUncyBub3RoaW5nIHRvIGRvCi0JICogaGVyZSBleGNlcHQgc2V0dXAgdGhlIGludGVycnVwdCBtYXNrLgotCSAqLwotCXJldCA9IGF0aDVrX3J4X3N0YXJ0KHNjKTsKLQlpZiAocmV0KQotCQlnb3RvIGRvbmU7Ci0KLQkvKgotCSAqIEVuYWJsZSBpbnRlcnJ1cHRzLgotCSAqLwogCXNjLT5pbWFzayA9IEFSNUtfSU5UX1JYIHwgQVI1S19JTlRfVFggfCBBUjVLX0lOVF9SWEVPTCB8CiAJCUFSNUtfSU5UX1JYT1JOIHwgQVI1S19JTlRfRkFUQUwgfCBBUjVLX0lOVF9HTE9CQUwgfAogCQlBUjVLX0lOVF9NSUI7CisJcmV0ID0gYXRoNWtfcmVzZXQoc2MsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOwogCi0JYXRoNWtfaHdfc2V0X2ludHIoc2MtPmFoLCBzYy0+aW1hc2spOwogCS8qIFNldCBhY2sgdG8gYmUgc2VudCBhdCBsb3cgYml0LXJhdGVzICovCiAJYXRoNWtfaHdfc2V0X2Fja19iaXRyYXRlX2hpZ2goc2MtPmFoLCBmYWxzZSk7CiAKQEAgLTIyOTAsNyArMjI3MCw3IEBACiAKIAlpZiAoIXRlc3RfYml0KEFUSF9TVEFUX0lOVkFMSUQsIHNjLT5zdGF0dXMpKSB7CiAJCWF0aDVrX2xlZF9vZmYoc2MpOwotCQlhdGg1a19od19zZXRfaW50cihhaCwgMCk7CisJCWF0aDVrX2h3X3NldF9pbXIoYWgsIDApOwogCQlzeW5jaHJvbml6ZV9pcnEoc2MtPnBkZXYtPmlycSk7CiAJfQogCWF0aDVrX3R4cV9jbGVhbnVwKHNjKTsKQEAgLTIzOTYsNyArMjM3Niw3IEBACiAJCQkJKiB0cmFuc21pc3Npb24gdGltZSkgaW4gb3JkZXIgdG8gZGV0ZWN0IHdldGhlcgogCQkJCSogYXV0b21hdGljIFRTRiB1cGRhdGVzIGhhcHBlbmVkLgogCQkJCSovCi0JCQkJaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgeworCQkJCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCQkJCSAvKiBYWFg6IG9ubHkgaWYgVkVPTCBzdXBwcG9ydGVkICovCiAJCQkJCXU2NCB0c2YgPSBhdGg1a19od19nZXRfdHNmNjQoYWgpOwogCQkJCQlzYy0+bmV4dHRidHQgKz0gc2MtPmJpbnR2YWw7CkBAIC0yNDUxLDcgKzI0MzEsNyBAQAogewogCXN0cnVjdCBhdGg1a19zb2Z0YyAqc2MgPSAodm9pZCAqKWRhdGE7CiAKLQlhdGg1a19yZXNldChzYy0+aHcpOworCWF0aDVrX3Jlc2V0X3dha2Uoc2MpOwogfQogCiAvKgpAQCAtMjQ3NCw3ICsyNDU0LDcgQEAKIAkJICogdG8gbG9hZCBuZXcgZ2FpbiB2YWx1ZXMuCiAJCSAqLwogCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1JFU0VULCAiY2FsaWJyYXRpb24sIHJlc2V0dGluZ1xuIik7Ci0JCWF0aDVrX3Jlc2V0KHNjLT5odyk7CisJCWF0aDVrX3Jlc2V0X3dha2Uoc2MpOwogCX0KIAlpZiAoYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShhaCwgc2MtPmN1cmNoYW4pKQogCQlBVEg1S19FUlIoc2MsICJjYWxpYnJhdGlvbiBvZiBjaGFubmVsICV1IGZhaWxlZFxuIiwKQEAgLTI2MjYsNyArMjYwNiw3IEBACiAKIAlhdGg1a19kZWJ1Z19kdW1wX3NrYihzYywgc2tiLCAiVFggICIsIDEpOwogCi0JaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikKKwlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQlBVEg1S19EQkcoc2MsIEFUSDVLX0RFQlVHX1hNSVQsICJ0eCBpbiBtb25pdG9yIChzY2FuPylcbiIpOwogCiAJLyoKQEAgLTI2NzUsNDggKzI2NTUsNjcgQEAKIH0KIAogc3RhdGljIGludAotYXRoNWtfcmVzZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCithdGg1a19yZXNldChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCBib29sIHN0b3AsIGJvb2wgY2hhbmdlX2NoYW5uZWwpCiB7Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGg1a19odyAqYWggPSBzYy0+YWg7CiAJaW50IHJldDsKIAogCUFUSDVLX0RCRyhzYywgQVRINUtfREVCVUdfUkVTRVQsICJyZXNldHRpbmdcbiIpOwogCi0JYXRoNWtfaHdfc2V0X2ludHIoYWgsIDApOwotCWF0aDVrX3R4cV9jbGVhbnVwKHNjKTsKLQlhdGg1a19yeF9zdG9wKHNjKTsKLQorCWlmIChzdG9wKSB7CisJCWF0aDVrX2h3X3NldF9pbXIoYWgsIDApOworCQlhdGg1a190eHFfY2xlYW51cChzYyk7CisJCWF0aDVrX3J4X3N0b3Aoc2MpOworCX0KIAlyZXQgPSBhdGg1a19od19yZXNldChhaCwgc2MtPm9wbW9kZSwgc2MtPmN1cmNoYW4sIHRydWUpOwotCWlmICh1bmxpa2VseShyZXQpKSB7CisJaWYgKHJldCkgewogCQlBVEg1S19FUlIoc2MsICJjYW4ndCByZXNldCBoYXJkd2FyZSAoJWQpXG4iLCByZXQpOwogCQlnb3RvIGVycjsKIAl9CisKKwkvKgorCSAqIFRoaXMgaXMgbmVlZGVkIG9ubHkgdG8gc2V0dXAgaW5pdGlhbCBzdGF0ZQorCSAqIGJ1dCBpdCdzIGJlc3QgZG9uZSBhZnRlciBhIHJlc2V0LgorCSAqLwogCWF0aDVrX2h3X3NldF90eHBvd2VyX2xpbWl0KHNjLT5haCwgMCk7CiAKIAlyZXQgPSBhdGg1a19yeF9zdGFydChzYyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKKwlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihzYywgImNhbid0IHN0YXJ0IHJlY3YgbG9naWNcbiIpOwogCQlnb3RvIGVycjsKIAl9CisKIAkvKgotCSAqIFdlIG1heSBiZSBkb2luZyBhIHJlc2V0IGluIHJlc3BvbnNlIHRvIGFuIGlvY3RsCi0JICogdGhhdCBjaGFuZ2VzIHRoZSBjaGFubmVsIHNvIHVwZGF0ZSBhbnkgc3RhdGUgdGhhdAotCSAqIG1pZ2h0IGNoYW5nZSBhcyBhIHJlc3VsdC4KKwkgKiBDaGFuZ2UgY2hhbm5lbHMgYW5kIHVwZGF0ZSB0aGUgaC93IHJhdGUgbWFwIGlmIHdlJ3JlIHN3aXRjaGluZzsKKwkgKiBlLmcuIDExYSB0byAxMWIvZy4KKwkgKgorCSAqIFdlIG1heSBiZSBkb2luZyBhIHJlc2V0IGluIHJlc3BvbnNlIHRvIGFuIGlvY3RsIHRoYXQgY2hhbmdlcyB0aGUKKwkgKiBjaGFubmVsIHNvIHVwZGF0ZSBhbnkgc3RhdGUgdGhhdCBtaWdodCBjaGFuZ2UgYXMgYSByZXN1bHQuCiAJICoKIAkgKiBYWFggbmVlZGVkPwogCSAqLwogLyoJYXRoNWtfY2hhbl9jaGFuZ2Uoc2MsIGMpOyAqLwotCWF0aDVrX2JlYWNvbl9jb25maWcoc2MpOwotCS8qIGludHJzIGFyZSBzdGFydGVkIGJ5IGF0aDVrX2JlYWNvbl9jb25maWcgKi8KIAotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisJYXRoNWtfYmVhY29uX2NvbmZpZyhzYyk7CisJLyogaW50cnMgYXJlIGVuYWJsZWQgYnkgYXRoNWtfYmVhY29uX2NvbmZpZyAqLwogCiAJcmV0dXJuIDA7CiBlcnI6CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludAorYXRoNWtfcmVzZXRfd2FrZShzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjKQoreworCWludCByZXQ7CisKKwlyZXQgPSBhdGg1a19yZXNldChzYywgdHJ1ZSwgdHJ1ZSk7CisJaWYgKCFyZXQpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhzYy0+aHcpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhdGg1a19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlyZXR1cm4gYXRoNWtfaW5pdChody0+cHJpdik7CkBAIC0yNzQyLDkgKzI3NDEsOSBAQAogCXNjLT52aWYgPSBjb25mLT52aWY7CiAKIAlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJc2MtPm9wbW9kZSA9IGNvbmYtPnR5cGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yODE1LDcgKzI4MTQsNyBAQAogCX0KIAogCWlmIChjb25mLT5jaGFuZ2VkICYgSUVFRTgwMjExX0lGQ0NfQkVBQ09OICYmCi0JICAgIHZpZi0+dHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJICAgIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CiAJCWlmICghYmVhY29uKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwpAQCAtMjgyNyw3ICsyODI2LDcgQEAKIAogCW11dGV4X3VubG9jaygmc2MtPmxvY2spOwogCi0JcmV0dXJuIGF0aDVrX3Jlc2V0KGh3KTsKKwlyZXR1cm4gYXRoNWtfcmVzZXRfd2FrZShzYyk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZzYy0+bG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTI5MzQsMTYgKzI5MzMsMTcgQEAKIAogCS8qIFhYWCBtb3ZlIHRoZXNlIHRvIG1hYzgwMjExLCBhbmQgYWRkIGEgYmVhY29uIElGRiBmbGFnIHRvIG1hYzgwMjExICovCiAKLQlpZiAoc2MtPm9wbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKQorCWlmIChzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVSX0NPTlRST0wgfCBBUjVLX1JYX0ZJTFRFUl9CRUFDT04gfAogCQkJQVI1S19SWF9GSUxURVJfUFJPQkVSRVEgfCBBUjVLX1JYX0ZJTFRFUl9QUk9NOwotCWlmIChzYy0+b3Btb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwlpZiAoc2MtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlyZmlsdCB8PSBBUjVLX1JYX0ZJTFRFUl9QUk9CRVJFUTsKLQlpZiAoc2MtPm9wbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCAmJgorCWlmIChzYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJCXNjLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCAmJgogCQl0ZXN0X2JpdChBVEhfU1RBVF9QUk9NSVNDLCBzYy0+c3RhdHVzKSkKIAkJcmZpbHQgfD0gQVI1S19SWF9GSUxURVJfUFJPTTsKLQlpZiAoc2MtPm9wbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKLQkJc2MtPm9wbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKHNjLT5vcG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCQlzYy0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCXJmaWx0IHw9IEFSNUtfUlhfRklMVEVSX0JFQUNPTjsKIAl9CiAKQEAgLTMwNDgsNyArMzA0OCw3IEBACiAJICogaW4gSUJTUyBtb2RlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBiZWFjb24gdGltZXJzIHRvby4KIAkgKiB0aGlzIHdpbGwgYWxzbyByZXNldCB0aGUgVFNGIGlmIHdlIGNhbGwgaXQgd2l0aCAwCiAJICovCi0JaWYgKHNjLT5vcG1vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwlpZiAoc2MtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJYXRoNWtfYmVhY29uX3VwZGF0ZV90aW1lcnMoc2MsIDApOwogCWVsc2UKIAkJYXRoNWtfaHdfcmVzZXRfdHNmKHNjLT5haCk7CkBAIC0zMDYzLDcgKzMwNjMsNyBAQAogCiAJYXRoNWtfZGVidWdfZHVtcF9za2Ioc2MsIHNrYiwgIkJDICAiLCAxKTsKIAotCWlmIChzYy0+b3Btb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwlpZiAoc2MtPm9wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVuZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmgKaW5kZXggN2VjMmYzNy4uOWQwYjcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuaApAQCAtMTExLDE3ICsxMTEsMTMgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3CSpodzsJCS8qIElFRUUgODAyLjExIGNvbW1vbiAqLwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgc2JhbmRzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1tBVEhfQ0hBTl9NQVhdOwotCXN0cnVjdCBpZWVlODAyMTFfcmF0ZQlyYXRlc1tBUjVLX01BWF9SQVRFUyAqIElFRUU4MDIxMV9OVU1fQkFORFNdOwotCWVudW0gaWVlZTgwMjExX2lmX3R5cGVzCW9wbW9kZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUJcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU11bQVI1S19NQVhfUkFURVNdOworCXU4CQkJcmF0ZV9pZHhbSUVFRTgwMjExX05VTV9CQU5EU11bQVI1S19NQVhfUkFURVNdOworCWVudW0gbmw4MDIxMV9pZnR5cGUJb3Btb2RlOwogCXN0cnVjdCBhdGg1a19odwkJKmFoOwkJLyogQXRoZXJvcyBIVyAqLwogCiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZAkJKmN1cmJhbmQ7CiAKLQl1OAkJCWFfcmF0ZXM7Ci0JdTgJCQliX3JhdGVzOwotCXU4CQkJZ19yYXRlczsKLQl1OAkJCXhyX3JhdGVzOwotCiAjaWZkZWYgQ09ORklHX0FUSDVLX0RFQlVHCiAJc3RydWN0IGF0aDVrX2RiZ19pbmZvCWRlYnVnOwkJLyogZGVidWcgaW5mbyAqLwogI2VuZGlmIC8qIENPTkZJR19BVEg1S19ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvY2Fwcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvY2Fwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9jYXBzLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisvKioqKioqKioqKioqKipcCisqIENhcGFiaWxpdGllcyAqCitcKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKgorICogRmlsbCB0aGUgY2FwYWJpbGl0aWVzIHN0cnVjdAorICogVE9ETzogTWVyZ2UgdGhpcyB3aXRoIEVFUFJPTSBjb2RlIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBpdAorICovCitpbnQgYXRoNWtfaHdfc2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUxNiBlZV9oZWFkZXI7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCS8qIENhcGFiaWxpdGllcyBzdG9yZWQgaW4gdGhlIEVFUFJPTSAqLworCWVlX2hlYWRlciA9IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9oZWFkZXI7CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJLyoKKwkJICogU2V0IHJhZGlvIGNhcGFiaWxpdGllcworCQkgKiAoVGhlIEFSNTExMCBvbmx5IHN1cHBvcnRzIHRoZSBtaWRkbGUgNUdIeiBiYW5kKQorCQkgKi8KKwkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfNWdoel9taW4gPSA1MTIwOworCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV81Z2h6X21heCA9IDU0MzA7CisJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzJnaHpfbWluID0gMDsKKwkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9tYXggPSAwOworCisJCS8qIFNldCBzdXBwb3J0ZWQgbW9kZXMgKi8KKwkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUEsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOworCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQV9UVVJCTywgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogWFhYIFRoZSB0cmFuY2VpdmVyIHN1cHBvcnRzIGZyZXF1ZW5jaWVzIGZyb20gNDkyMCB0byA2MTAwR0h6CisJCSAqIFhYWCBhbmQgZnJvbSAyMzEyIHRvIDI3MzJHSHouIFRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZQorCQkgKiBYWFggY3VycmVudCBpZWVlODAyMTEgaW1wbGVtZW50YXRpb24gYmVjYXVzZSB0aGUgSUVFRQorCQkgKiBYWFggY2hhbm5lbCBtYXBwaW5nIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgY2hhbm5lbAorCQkgKiBYWFggbnVtYmVycyAoMjMxMk1IeiBpcyBjaGFubmVsIC0xOSkuIE9mIGNvdXJzZSwgdGhpcworCQkgKiBYWFggZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB0aGVzZSBjaGFubmVscyBhcmUgb3V0IG9mIHJhbmdlCisJCSAqIFhYWCBidXQgc29tZSByZWd1bGF0aW9uIGRvbWFpbnMgbGlrZSBNS0sgKEphcGFuKSB3aWxsCisJCSAqIFhYWCBzdXBwb3J0IGZyZXF1ZW5jaWVzIHNvbWV3aGVyZSBhcm91bmQgNC44R0h6LgorCQkgKi8KKworCQkvKgorCQkgKiBTZXQgcmFkaW8gY2FwYWJpbGl0aWVzCisJCSAqLworCisJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFBKGVlX2hlYWRlcikpIHsKKwkJCS8qIDQ5MjAgKi8KKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWluID0gNTAwNTsKKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWF4ID0gNjEwMDsKKworCQkJLyogU2V0IHN1cHBvcnRlZCBtb2RlcyAqLworCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUEsCisJCQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOworCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUFfVFVSQk8sCisJCQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOworCQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFHX1RVUkJPLAorCQkJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7CisJCX0KKworCQkvKiBFbmFibGUgIDgwMi4xMWIgaWYgYSAyR0h6IGNhcGFibGUgcmFkaW8gKDIxMTEvNTExMikgaXMKKwkJICogY29ubmVjdGVkICovCisJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlX2hlYWRlcikgfHwKKwkJCQlBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikpIHsKKwkJCS8qIDIzMTIgKi8KKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzJnaHpfbWluID0gMjQxMjsKKwkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzJnaHpfbWF4ID0gMjczMjsKKworCQkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUIoZWVfaGVhZGVyKSkKKwkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQiwKKwkJCQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOworCisJCQlpZiAoQVI1S19FRVBST01fSERSXzExRyhlZV9oZWFkZXIpKQorCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFHLAorCQkJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7CisJCX0KKwl9CisKKwkvKiBHUElPICovCisJYWgtPmFoX2dwaW9fbnBpbnMgPSBBUjVLX05VTV9HUElPOworCisJLyogU2V0IG51bWJlciBvZiBzdXBwb3J0ZWQgVFggcXVldWVzICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0gPQorCQkJQVI1S19OVU1fVFhfUVVFVUVTX05PUUNVOworCWVsc2UKKwkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtID0gQVI1S19OVU1fVFhfUVVFVUVTOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1haW4gZnVuY3Rpb24gdXNlZCBieSB0aGUgZHJpdmVyIHBhcnQgdG8gY2hlY2sgY2FwcyAqLworaW50IGF0aDVrX2h3X2dldF9jYXBhYmlsaXR5KHN0cnVjdCBhdGg1a19odyAqYWgsCisJCWVudW0gYXRoNWtfY2FwYWJpbGl0eV90eXBlIGNhcF90eXBlLAorCQl1MzIgY2FwYWJpbGl0eSwgdTMyICpyZXN1bHQpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCXN3aXRjaCAoY2FwX3R5cGUpIHsKKwljYXNlIEFSNUtfQ0FQX05VTV9UWFFVRVVFUzoKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQkJCSpyZXN1bHQgPSBBUjVLX05VTV9UWF9RVUVVRVNfTk9RQ1U7CisJCQllbHNlCisJCQkJKnJlc3VsdCA9IEFSNUtfTlVNX1RYX1FVRVVFUzsKKwkJCWdvdG8geWVzOworCQl9CisJY2FzZSBBUjVLX0NBUF9WRU9MOgorCQlnb3RvIHllczsKKwljYXNlIEFSNUtfQ0FQX0NPTVBSRVNTSU9OOgorCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCQlnb3RvIHllczsKKwkJZWxzZQorCQkJZ290byBubzsKKwljYXNlIEFSNUtfQ0FQX0JVUlNUOgorCQlnb3RvIHllczsKKwljYXNlIEFSNUtfQ0FQX1RQQzoKKwkJZ290byB5ZXM7CisJY2FzZSBBUjVLX0NBUF9CU1NJRE1BU0s6CisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKwkJCWdvdG8geWVzOworCQllbHNlCisJCQlnb3RvIG5vOworCWNhc2UgQVI1S19DQVBfWFI6CisJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKwkJCWdvdG8geWVzOworCQllbHNlCisJCQlnb3RvIG5vOworCWRlZmF1bHQ6CisJCWdvdG8gbm87CisJfQorCitubzoKKwlyZXR1cm4gLUVJTlZBTDsKK3llczoKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRPRE86IEZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIGJlIHBhcnQgb2YgYSBuZXcgZnVuY3Rpb24KKyAqIHNldF9jYXBhYmlsaXR5CisgKi8KKworaW50IGF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKmJzc2lkLAorCQl1MTYgYXNzb2NfaWQpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKKwkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgfCBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBhdGg1a19od19kaXNhYmxlX3BzcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKKwkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgfCBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZGVidWcuYwppbmRleCA2ZmE2YzhlMC4uOGY5MmQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kZWJ1Zy5jCkBAIC01OCw4ICs1OCw4IEBACiAgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLSNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImJhc2UuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGF0aDVrX2RlYnVnOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBhdGg1a19kZWJ1ZywgdWludCwgMCk7CkBAIC01MjUsNyArNTI1LDcgQEAKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgInJ4IHF1ZXVlICV4LCBsaW5rICVwXG4iLAotCQlhdGg1a19od19nZXRfcnhfYnVmKGFoKSwgc2MtPnJ4bGluayk7CisJCWF0aDVrX2h3X2dldF9yeGRwKGFoKSwgc2MtPnJ4bGluayk7CiAKIAlzcGluX2xvY2tfYmgoJnNjLT5yeGJ1ZmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+cnhidWYsIGxpc3QpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Rlc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDEzNzQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZGVzYy5jCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyBIYXJkd2FyZSBEZXNjcmlwdG9yIEZ1bmN0aW9ucworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisKKy8qCisgKiBUWCBEZXNjcmlwdG9ycworICovCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSAyLXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTAvNTIxMQorICovCitzdGF0aWMgaW50CithdGg1a19od19zZXR1cF8yd29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwgZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAorCXVuc2lnbmVkIGludCB0eF9wb3dlciwgdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAorCXVuc2lnbmVkIGludCBrZXlfaW5kZXgsIHVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsIHVuc2lnbmVkIGludCBmbGFncywKKwl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCit7CisJdTMyIGZyYW1lX3R5cGU7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bCAqdHhfY3RsOworCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CisKKwl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEwLnR4X2N0bDsKKworCS8qCisJICogVmFsaWRhdGUgaW5wdXQKKwkgKiAtIFplcm8gcmV0cmllcyBkb24ndCBtYWtlIHNlbnNlLgorCSAqIC0gQSB6ZXJvIHJhdGUgd2lsbCBwdXQgdGhlIEhXIGludG8gYSBtb2RlIHdoZXJlIGl0IGNvbnRpbm91c2x5IHNlbmRzCisJICogICBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRoaXMuCisJICovCisJaWYgKHVubGlrZWx5KHR4X3RyaWVzMCA9PSAwKSkgeworCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByZXRyaWVzXG4iKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh1bmxpa2VseSh0eF9yYXRlMCA9PSAwKSkgeworCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByYXRlXG4iKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2xlYXIgZGVzY3JpcHRvciAqLworCW1lbXNldCgmZGVzYy0+dWQuZHNfdHg1MjEwLCAwLCBzaXplb2Yoc3RydWN0IGF0aDVrX2h3XzUyMTBfdHhfZGVzYykpOworCisJLyogU2V0dXAgY29udHJvbCBkZXNjcmlwdG9yICovCisKKwkvKiBWZXJpZnkgYW5kIHNldCBmcmFtZSBsZW5ndGggKi8KKworCS8qIHJlbW92ZSBwYWRkaW5nIHdlIG1pZ2h0IGhhdmUgYWRkZWQgYmVmb3JlICovCisJZnJhbWVfbGVuID0gcGt0X2xlbiAtIChoZHJfbGVuICYgMykgKyBGQ1NfTEVOOworCisJaWYgKGZyYW1lX2xlbiAmIH5BUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJdHhfY3RsLT50eF9jb250cm9sXzAgPSBmcmFtZV9sZW4gJiBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU47CisKKwkvKiBWZXJpZnkgYW5kIHNldCBidWZmZXIgbGVuZ3RoICovCisKKwkvKiBOQjogYmVhY29uJ3MgQnVmTGVuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzICovCisJaWYgKHR5cGUgPT0gQVI1S19QS1RfVFlQRV9CRUFDT04pCisJCXBrdF9sZW4gPSByb3VuZHVwKHBrdF9sZW4sIDQpOworCisJaWYgKHBrdF9sZW4gJiB+QVI1S18yV19UWF9ERVNDX0NUTDFfQlVGX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eF9jdGwtPnR4X2NvbnRyb2xfMSA9IHBrdF9sZW4gJiBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOOworCisJLyoKKwkgKiBWZXJpZnkgYW5kIHNldCBoZWFkZXIgbGVuZ3RoCisJICogWFhYOiBJIG9ubHkgZm91bmQgdGhhdCBvbiA1MjEwIGNvZGUsIGRvZXMgaXQgd29yayBvbiA1MjExID8KKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJaWYgKGhkcl9sZW4gJiB+QVI1S18yV19UWF9ERVNDX0NUTDBfSEVBREVSX0xFTikKKwkJCXJldHVybiAtRUlOVkFMOworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQorCQkJQVI1S19SRUdfU00oaGRyX2xlbiwgQVI1S18yV19UWF9ERVNDX0NUTDBfSEVBREVSX0xFTik7CisJfQorCisJLypEaWZlcmVuY2VzIGJldHdlZW4gNTIxMC01MjExKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQVI1S19QS1RfVFlQRV9CRUFDT046CisJCWNhc2UgQVI1S19QS1RfVFlQRV9QUk9CRV9SRVNQOgorCQkJZnJhbWVfdHlwZSA9IEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9OT19ERUxBWTsKKwkJY2FzZSBBUjVLX1BLVF9UWVBFX1BJRlM6CisJCQlmcmFtZV90eXBlID0gQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlM7CisJCWRlZmF1bHQ6CisJCQlmcmFtZV90eXBlID0gdHlwZSAvKjw8IDIgPyovOworCQl9CisKKwkJdHhfY3RsLT50eF9jb250cm9sXzAgfD0KKwkJQVI1S19SRUdfU00oZnJhbWVfdHlwZSwgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRSkgfAorCQlBUjVLX1JFR19TTSh0eF9yYXRlMCwgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFKTsKKworCX0gZWxzZSB7CisJCXR4X2N0bC0+dHhfY29udHJvbF8wIHw9CisJCQlBUjVLX1JFR19TTSh0eF9yYXRlMCwgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFKSB8CisJCQlBUjVLX1JFR19TTShhbnRlbm5hX21vZGUsCisJCQkJQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVCk7CisJCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9CisJCQlBUjVLX1JFR19TTSh0eXBlLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFKTsKKwl9CisjZGVmaW5lIF9UWF9GTEFHUyhfYywgX2ZsYWcpCQkJCQlcCisJaWYgKGZsYWdzICYgQVI1S19UWERFU0NfIyNfZmxhZykgewkJCVwKKwkJdHhfY3RsLT50eF9jb250cm9sXyMjX2MgfD0JCQlcCisJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMIyNfYyMjXyMjX2ZsYWc7CVwKKwl9CisKKwlfVFhfRkxBR1MoMCwgQ0xSRE1BU0spOworCV9UWF9GTEFHUygwLCBWRU9MKTsKKwlfVFhfRkxBR1MoMCwgSU5UUkVRKTsKKwlfVFhfRkxBR1MoMCwgUlRTRU5BKTsKKwlfVFhfRkxBR1MoMSwgTk9BQ0spOworCisjdW5kZWYgX1RYX0ZMQUdTCisKKwkvKgorCSAqIFdFUCBjcmFwCisJICovCisJaWYgKGtleV9pbmRleCAhPSBBUjVLX1RYS0VZSVhfSU5WQUxJRCkgeworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQorCQkJQVI1S18yV19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQ7CisJCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9CisJCQlBUjVLX1JFR19TTShrZXlfaW5kZXgsCisJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWCk7CisJfQorCisJLyoKKwkgKiBSVFMvQ1RTIER1cmF0aW9uIFs1MjEwID9dCisJICovCisJaWYgKChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgJiYKKwkJCShmbGFncyAmIChBUjVLX1RYREVTQ19SVFNFTkEgfCBBUjVLX1RYREVTQ19DVFNFTkEpKSkKKwkJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gcnRzY3RzX2R1cmF0aW9uICYKKwkJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9SVFNfRFVSQVRJT047CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIDQtd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3Igb24gNTIxMgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IHBrdF9sZW4sIHVuc2lnbmVkIGludCBoZHJfbGVuLAorCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHR4X3Bvd2VyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTAsCisJdW5zaWduZWQgaW50IHR4X3RyaWVzMCwgdW5zaWduZWQgaW50IGtleV9pbmRleCwKKwl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLAorCXVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCit7CisJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOworCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTIudHhfY3RsOworCisJLyoKKwkgKiBWYWxpZGF0ZSBpbnB1dAorCSAqIC0gWmVybyByZXRyaWVzIGRvbid0IG1ha2Ugc2Vuc2UuCisJICogLSBBIHplcm8gcmF0ZSB3aWxsIHB1dCB0aGUgSFcgaW50byBhIG1vZGUgd2hlcmUgaXQgY29udGlub3VzbHkgc2VuZHMKKwkgKiAgIG5vaXNlIG9uIHRoZSBjaGFubmVsLCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdGhpcy4KKwkgKi8KKwlpZiAodW5saWtlbHkodHhfdHJpZXMwID09IDApKSB7CisJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJldHJpZXNcbiIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHVubGlrZWx5KHR4X3JhdGUwID09IDApKSB7CisJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJ6ZXJvIHJhdGVcbiIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDbGVhciBkZXNjcmlwdG9yICovCisJbWVtc2V0KCZkZXNjLT51ZC5kc190eDUyMTIsIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjKSk7CisKKwkvKiBTZXR1cCBjb250cm9sIGRlc2NyaXB0b3IgKi8KKworCS8qIFZlcmlmeSBhbmQgc2V0IGZyYW1lIGxlbmd0aCAqLworCisJLyogcmVtb3ZlIHBhZGRpbmcgd2UgbWlnaHQgaGF2ZSBhZGRlZCBiZWZvcmUgKi8KKwlmcmFtZV9sZW4gPSBwa3RfbGVuIC0gKGhkcl9sZW4gJiAzKSArIEZDU19MRU47CisKKwlpZiAoZnJhbWVfbGVuICYgfkFSNUtfNFdfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eF9jdGwtPnR4X2NvbnRyb2xfMCA9IGZyYW1lX2xlbiAmIEFSNUtfNFdfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTjsKKworCS8qIFZlcmlmeSBhbmQgc2V0IGJ1ZmZlciBsZW5ndGggKi8KKworCS8qIE5COiBiZWFjb24ncyBCdWZMZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgKi8KKwlpZiAodHlwZSA9PSBBUjVLX1BLVF9UWVBFX0JFQUNPTikKKwkJcGt0X2xlbiA9IHJvdW5kdXAocGt0X2xlbiwgNCk7CisKKwlpZiAocGt0X2xlbiAmIH5BUjVLXzRXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR4X2N0bC0+dHhfY29udHJvbF8xID0gcGt0X2xlbiAmIEFSNUtfNFdfVFhfREVTQ19DVEwxX0JVRl9MRU47CisKKwl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQorCQlBUjVLX1JFR19TTSh0eF9wb3dlciwgQVI1S180V19UWF9ERVNDX0NUTDBfWE1JVF9QT1dFUikgfAorCQlBUjVLX1JFR19TTShhbnRlbm5hX21vZGUsIEFSNUtfNFdfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVQpOworCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9IEFSNUtfUkVHX1NNKHR5cGUsCisJCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEUpOworCXR4X2N0bC0+dHhfY29udHJvbF8yID0gQVI1S19SRUdfU00odHhfdHJpZXMwICsgQVI1S19UVU5FX0hXVFhUUklFUywKKwkJCQkJQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzApOworCXR4X2N0bC0+dHhfY29udHJvbF8zID0gdHhfcmF0ZTAgJiBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUwOworCisjZGVmaW5lIF9UWF9GTEFHUyhfYywgX2ZsYWcpCQkJCQlcCisJaWYgKGZsYWdzICYgQVI1S19UWERFU0NfIyNfZmxhZykgewkJCVwKKwkJdHhfY3RsLT50eF9jb250cm9sXyMjX2MgfD0JCQlcCisJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMIyNfYyMjXyMjX2ZsYWc7CVwKKwl9CisKKwlfVFhfRkxBR1MoMCwgQ0xSRE1BU0spOworCV9UWF9GTEFHUygwLCBWRU9MKTsKKwlfVFhfRkxBR1MoMCwgSU5UUkVRKTsKKwlfVFhfRkxBR1MoMCwgUlRTRU5BKTsKKwlfVFhfRkxBR1MoMCwgQ1RTRU5BKTsKKwlfVFhfRkxBR1MoMSwgTk9BQ0spOworCisjdW5kZWYgX1RYX0ZMQUdTCisKKwkvKgorCSAqIFdFUCBjcmFwCisJICovCisJaWYgKGtleV9pbmRleCAhPSBBUjVLX1RYS0VZSVhfSU5WQUxJRCkgeworCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9FTkNSWVBUX0tFWV9WQUxJRDsKKwkJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gQVI1S19SRUdfU00oa2V5X2luZGV4LAorCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYKTsKKwl9CisKKwkvKgorCSAqIFJUUy9DVFMKKwkgKi8KKwlpZiAoZmxhZ3MgJiAoQVI1S19UWERFU0NfUlRTRU5BIHwgQVI1S19UWERFU0NfQ1RTRU5BKSkgeworCQlpZiAoKGZsYWdzICYgQVI1S19UWERFU0NfUlRTRU5BKSAmJgorCQkJCShmbGFncyAmIEFSNUtfVFhERVNDX0NUU0VOQSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdHhfY3RsLT50eF9jb250cm9sXzIgfD0gcnRzY3RzX2R1cmF0aW9uICYKKwkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMl9SVFNfRFVSQVRJT047CisJCXR4X2N0bC0+dHhfY29udHJvbF8zIHw9IEFSNUtfUkVHX1NNKHJ0c2N0c19yYXRlLAorCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgNC13b3JkIG11bHRpIHJhdGUgcmV0cnkgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTIKKyAqLworc3RhdGljIGludAorYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLAorCXVfaW50IHR4X3RyaWVzMiwgdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCit7CisJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOworCisJLyoKKwkgKiBSYXRlcyBjYW4gYmUgMCBhcyBsb25nIGFzIHRoZSByZXRyeSBjb3VudCBpcyAwIHRvby4KKwkgKiBBIHplcm8gcmF0ZSBhbmQgbm9uemVybyByZXRyeSBjb3VudCB3aWxsIHB1dCB0aGUgSFcgaW50byBhIG1vZGUgd2hlcmUKKwkgKiBpdCBjb250aW5vdXNseSBzZW5kcyBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvCisJICogYXZvaWQgdGhpcy4KKwkgKi8KKwlpZiAodW5saWtlbHkoKHR4X3JhdGUxID09IDAgJiYgdHhfdHJpZXMxICE9IDApIHx8CisJCSAgICAgKHR4X3JhdGUyID09IDAgJiYgdHhfdHJpZXMyICE9IDApIHx8CisJCSAgICAgKHR4X3JhdGUzID09IDAgJiYgdHhfdHJpZXMzICE9IDApKSkgeworCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByYXRlXG4iKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7CisJCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTIudHhfY3RsOworCisjZGVmaW5lIF9YVFhfVFJJRVMoX24pCQkJCQkJCVwKKwlpZiAodHhfdHJpZXMjI19uKSB7CQkJCQkJXAorCQl0eF9jdGwtPnR4X2NvbnRyb2xfMiB8PQkJCQkJXAorCQkgICAgQVI1S19SRUdfU00odHhfdHJpZXMjI19uLAkJCQlcCisJCSAgICBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTIyNfbik7CQlcCisJCXR4X2N0bC0+dHhfY29udHJvbF8zIHw9CQkJCQlcCisJCSAgICBBUjVLX1JFR19TTSh0eF9yYXRlIyNfbiwJCQkJXAorCQkgICAgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFIyNfbik7CQlcCisJfQorCisJCV9YVFhfVFJJRVMoMSk7CisJCV9YVFhfVFJJRVMoMik7CisJCV9YVFhfVFJJRVMoMyk7CisKKyN1bmRlZiBfWFRYX1RSSUVTCisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIG5vIG1yciBzdXBwb3J0IGZvciBjYXJkcyBvbGRlciB0aGFuIDUyMTIgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3NldHVwX25vX21ycihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwl1bnNpZ25lZCBpbnQgdHhfcmF0ZTEsIHVfaW50IHR4X3RyaWVzMSwgdV9pbnQgdHhfcmF0ZTIsCisJdV9pbnQgdHhfdHJpZXMyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTMsIHVfaW50IHR4X3RyaWVzMykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2NjZXNzIHRoZSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKyAqLworc3RhdGljIGludCBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCit7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bCAqdHhfY3RsOworCXN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgKnR4X3N0YXR1czsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEwLnR4X2N0bDsKKwl0eF9zdGF0dXMgPSAmZGVzYy0+dWQuZHNfdHg1MjEwLnR4X3N0YXQ7CisKKwkvKiBObyBmcmFtZSBoYXMgYmVlbiBzZW5kIG9yIGVycm9yICovCisJaWYgKHVubGlrZWx5KCh0eF9zdGF0dXMtPnR4X3N0YXR1c18xICYgQVI1S19ERVNDX1RYX1NUQVRVUzFfRE9ORSkgPT0gMCkpCisJCXJldHVybiAtRUlOUFJPR1JFU1M7CisKKwkvKgorCSAqIEdldCBkZXNjcmlwdG9yIHN0YXR1cworCSAqLworCXRzLT50c190c3RhbXAgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUCk7CisJdHMtPnRzX3Nob3J0cmV0cnkgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVCk7CisJdHMtPnRzX2xvbmdyZXRyeSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQpOworCS8qVE9ETzogdHMtPnRzX3ZpcnRjb2wgKyB0ZXN0Ki8KKwl0cy0+dHNfc2VxbnVtID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMSwKKwkJQVI1S19ERVNDX1RYX1NUQVRVUzFfU0VRX05VTSk7CisJdHMtPnRzX3Jzc2kgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18xLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9BQ0tfU0lHX1NUUkVOR1RIKTsKKwl0cy0+dHNfYW50ZW5uYSA9IDE7CisJdHMtPnRzX3N0YXR1cyA9IDA7CisJdHMtPnRzX3JhdGVbMF0gPSBBUjVLX1JFR19NUyh0eF9jdGwtPnR4X2NvbnRyb2xfMCwKKwkJQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFKTsKKwl0cy0+dHNfcmV0cnlbMF0gPSB0cy0+dHNfbG9uZ3JldHJ5OworCXRzLT50c19maW5hbF9pZHggPSAwOworCisJaWYgKCEodHhfc3RhdHVzLT50eF9zdGF0dXNfMCAmIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZSQU1FX1hNSVRfT0spKSB7CisJCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYKKwkJCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9FWENFU1NJVkVfUkVUUklFUykKKwkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9YUkVUUlk7CisKKwkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUZPX1VOREVSUlVOKQorCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX0ZJRk87CisKKwkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRCkKKwkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9GSUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUHJvY2Nlc3MgYSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY180d29yZF90eF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQoreworCXN0cnVjdCBhdGg1a19od180d190eF9jdGwgKnR4X2N0bDsKKwlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJdHhfY3RsID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9jdGw7CisJdHhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9zdGF0OworCisJLyogTm8gZnJhbWUgaGFzIGJlZW4gc2VuZCBvciBlcnJvciAqLworCWlmICh1bmxpa2VseSghKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMV9ET05FKSkpCisJCXJldHVybiAtRUlOUFJPR1JFU1M7CisKKwkvKgorCSAqIEdldCBkZXNjcmlwdG9yIHN0YXR1cworCSAqLworCXRzLT50c190c3RhbXAgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUCk7CisJdHMtPnRzX3Nob3J0cmV0cnkgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVCk7CisJdHMtPnRzX2xvbmdyZXRyeSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQpOworCXRzLT50c19zZXFudW0gPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18xLAorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNKTsKKwl0cy0+dHNfcnNzaSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCisJCUFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEgpOworCXRzLT50c19hbnRlbm5hID0gKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJgorCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkEpID8gMiA6IDE7CisJdHMtPnRzX3N0YXR1cyA9IDA7CisKKwl0cy0+dHNfZmluYWxfaWR4ID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMSwKKwkJCUFSNUtfREVTQ19UWF9TVEFUVVMxX0ZJTkFMX1RTX0lOREVYKTsKKworCS8qIFRoZSBsb25ncmV0cnkgY291bnRlciBoYXMgdGhlIG51bWJlciBvZiB1bi1hY2tlZCByZXRyaWVzCisJICogZm9yIHRoZSBmaW5hbCByYXRlLiBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzCisJICogd2UgaGF2ZSB0byBhZGQgdGhlIHJldHJ5IGNvdW50ZXJzIGZvciB0aGUgb3RoZXIgcmF0ZXMKKwkgKiBhcyB3ZWxsCisJICovCisJdHMtPnRzX3JldHJ5W3RzLT50c19maW5hbF9pZHhdID0gdHMtPnRzX2xvbmdyZXRyeTsKKwlzd2l0Y2ggKHRzLT50c19maW5hbF9pZHgpIHsKKwljYXNlIDM6CisJCXRzLT50c19yYXRlWzNdID0gQVI1S19SRUdfTVModHhfY3RsLT50eF9jb250cm9sXzMsCisJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUzKTsKKworCQl0cy0+dHNfcmV0cnlbMl0gPSBBUjVLX1JFR19NUyh0eF9jdGwtPnR4X2NvbnRyb2xfMiwKKwkJCUFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMyKTsKKwkJdHMtPnRzX2xvbmdyZXRyeSArPSB0cy0+dHNfcmV0cnlbMl07CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMjoKKwkJdHMtPnRzX3JhdGVbMl0gPSBBUjVLX1JFR19NUyh0eF9jdGwtPnR4X2NvbnRyb2xfMywKKwkJCUFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTIpOworCisJCXRzLT50c19yZXRyeVsxXSA9IEFSNUtfUkVHX01TKHR4X2N0bC0+dHhfY29udHJvbF8yLAorCQkJQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzEpOworCQl0cy0+dHNfbG9uZ3JldHJ5ICs9IHRzLT50c19yZXRyeVsxXTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQl0cy0+dHNfcmF0ZVsxXSA9IEFSNUtfUkVHX01TKHR4X2N0bC0+dHhfY29udHJvbF8zLAorCQkJQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMSk7CisKKwkJdHMtPnRzX3JldHJ5WzBdID0gQVI1S19SRUdfTVModHhfY3RsLT50eF9jb250cm9sXzIsCisJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMSk7CisJCXRzLT50c19sb25ncmV0cnkgKz0gdHMtPnRzX3JldHJ5WzBdOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDA6CisJCXRzLT50c19yYXRlWzBdID0gdHhfY3RsLT50eF9jb250cm9sXzMgJgorCQkJQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMDsKKwkJYnJlYWs7CisJfQorCisJLyogVFggZXJyb3IgKi8KKwlpZiAoISh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSykpIHsKKwkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJgorCQkJCUFSNUtfREVTQ19UWF9TVEFUVVMwX0VYQ0VTU0lWRV9SRVRSSUVTKQorCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX1hSRVRSWTsKKworCQlpZiAodHhfc3RhdHVzLT50eF9zdGF0dXNfMCAmIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJRk9fVU5ERVJSVU4pCisJCQl0cy0+dHNfc3RhdHVzIHw9IEFSNUtfVFhFUlJfRklGTzsKKworCQlpZiAodHhfc3RhdHVzLT50eF9zdGF0dXNfMCAmIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJTFRFUkVEKQorCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX0ZJTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSWCBEZXNjcmlwdG9ycworICovCisKKy8qCisgKiBJbml0aWFsaXplIGFuIHJ4IGNvbnRyb2wgZGVzY3JpcHRvcgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBhdGg1a19od19yeF9jdGwgKnJ4X2N0bDsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJcnhfY3RsID0gJmRlc2MtPnVkLmRzX3J4LnJ4X2N0bDsKKworCS8qCisJICogQ2xlYXIgdGhlIGRlc2NyaXB0b3IKKwkgKiBJZiB3ZSBkb24ndCBjbGVhbiB0aGUgc3RhdHVzIGRlc2NyaXB0b3IsCisJICogd2hpbGUgc2Nhbm5pbmcgd2UgZ2V0IHRvbyBtYW55IHJlc3VsdHMsCisJICogbW9zdCBvZiB0aGVtIHZpcnR1YWwsIGFmdGVyIHNvbWUgc2VjcworCSAqIG9mIHNjYW5uaW5nIHN5c3RlbSBoYW5ncy4gTS5GLgorCSovCisJbWVtc2V0KCZkZXNjLT51ZC5kc19yeCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYykpOworCisJLyogU2V0dXAgZGVzY3JpcHRvciAqLworCXJ4X2N0bC0+cnhfY29udHJvbF8xID0gc2l6ZSAmIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU47CisJaWYgKHVubGlrZWx5KHJ4X2N0bC0+cnhfY29udHJvbF8xICE9IHNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmbGFncyAmIEFSNUtfUlhERVNDX0lOVFJFUSkKKwkJcnhfY3RsLT5yeF9jb250cm9sXzEgfD0gQVI1S19ERVNDX1JYX0NUTDFfSU5UUkVROworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCit7CisJc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cyAqcnhfc3RhdHVzOworCisJcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnUucnhfc3RhdDsKKworCS8qIE5vIGZyYW1lIHJlY2VpdmVkIC8gbm90IHJlYWR5ICovCisJaWYgKHVubGlrZWx5KCEocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCisJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ET05FKSkpCisJCXJldHVybiAtRUlOUFJPR1JFU1M7CisKKwkvKgorCSAqIEZyYW1lIHJlY2VpdmUgc3RhdHVzCisJICovCisJcnMtPnJzX2RhdGFsZW4gPSByeF9zdGF0dXMtPnJ4X3N0YXR1c18wICYKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9EQVRBX0xFTjsKKwlycy0+cnNfcnNzaSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCisJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9TSUdOQUwpOworCXJzLT5yc19yYXRlID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMCwKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUpOworCXJzLT5yc19hbnRlbm5hID0gcnhfc3RhdHVzLT5yeF9zdGF0dXNfMCAmCisJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BOworCXJzLT5yc19tb3JlID0gcnhfc3RhdHVzLT5yeF9zdGF0dXNfMCAmCisJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfTU9SRTsKKwkvKiBUT0RPOiB0aGlzIHRpbWVzdGFtcCBpcyAxMyBiaXQsIGxhdGVyIG9uIHdlIGFzc3VtZSAxNSBiaXQgKi8KKwlycy0+cnNfdHN0YW1wID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKKwkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUCk7CisJcnMtPnJzX3N0YXR1cyA9IDA7CisJcnMtPnJzX3BoeWVyciA9IDA7CisKKwkvKgorCSAqIEtleSB0YWJsZSBzdGF0dXMKKwkgKi8KKwlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElEKQorCQlycy0+cnNfa2V5aXggPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18xLAorCQkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgpOworCWVsc2UKKwkJcnMtPnJzX2tleWl4ID0gQVI1S19SWEtFWUlYX0lOVkFMSUQ7CisKKwkvKgorCSAqIFJlY2VpdmUvZGVzY3JpcHRvciBlcnJvcnMKKwkgKi8KKwlpZiAoIShyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spKSB7CisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUikKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9DUkM7CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRklGT19PVkVSUlVOKQorCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0ZJRk87CisKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKSB7CisJCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfUEhZOworCQkJcnMtPnJzX3BoeWVyciB8PSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18xLAorCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SKTsKKwkJfQorCisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RFQ1JZUFRfQ1JDX0VSUk9SKQorCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0RFQ1JZUFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMgorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgKnJzKQoreworCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKKwlzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IgKnJ4X2VycjsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnUucnhfc3RhdDsKKworCS8qIE92ZXJsYXkgb24gZXJyb3IgKi8KKwlyeF9lcnIgPSAmZGVzYy0+dWQuZHNfcngudS5yeF9lcnI7CisKKwkvKiBObyBmcmFtZSByZWNlaXZlZCAvIG5vdCByZWFkeSAqLworCWlmICh1bmxpa2VseSghKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRE9ORSkpKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCisJLyoKKwkgKiBGcmFtZSByZWNlaXZlIHN0YXR1cworCSAqLworCXJzLT5yc19kYXRhbGVuID0gcnhfc3RhdHVzLT5yeF9zdGF0dXNfMCAmCisJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU47CisJcnMtPnJzX3Jzc2kgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMKTsKKwlycy0+cnNfcmF0ZSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCisJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFKTsKKwlycy0+cnNfYW50ZW5uYSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQTsKKwlycy0+cnNfbW9yZSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgorCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX01PUkU7CisJcnMtPnJzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEsCisJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVApOworCXJzLT5yc19zdGF0dXMgPSAwOworCXJzLT5yc19waHllcnIgPSAwOworCisJLyoKKwkgKiBLZXkgdGFibGUgc3RhdHVzCisJICovCisJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJiBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRCkKKwkJcnMtPnJzX2tleWl4ID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKKwkJCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWCk7CisJZWxzZQorCQlycy0+cnNfa2V5aXggPSBBUjVLX1JYS0VZSVhfSU5WQUxJRDsKKworCS8qCisJICogUmVjZWl2ZS9kZXNjcmlwdG9yIGVycm9ycworCSAqLworCWlmICghKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSykpIHsKKwkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgorCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SKQorCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0NSQzsKKworCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCisJCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IpIHsKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9QSFk7CisJCQlycy0+cnNfcGh5ZXJyIHw9IEFSNUtfUkVHX01TKHJ4X2Vyci0+cnhfZXJyb3JfMSwKKwkJCQkJICAgQVI1S19SWF9ERVNDX0VSUk9SMV9QSFlfRVJST1JfQ09ERSk7CisJCX0KKworCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCisJCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUikKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9ERUNSWVBUOworCisJCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKKwkJCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX01JQ19FUlJPUikKKwkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9NSUM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0IGZ1bmN0aW9uIHBvaW50ZXJzIGluc2lkZSBhdGg1a19odyBzdHJ1Y3QKKyAqLworaW50IGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCAmJgorCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSAmJgorCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMikKKwkJCXJldHVybiAtRU5PVFNVUFA7CisKKwkvKiBYWFg6IFdoYXQgaXMgdGhpcyBtYWdpYyB2YWx1ZSBhbmQgd2hlcmUgaXMgaXQgdXNlZCA/ICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQorCQlhaC0+YWhfbWFnaWMgPSBBUjVLX0VFUFJPTV9NQUdJQ181MjEyOworCWVsc2UgaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKQorCQlhaC0+YWhfbWFnaWMgPSBBUjVLX0VFUFJPTV9NQUdJQ181MjExOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7CisJCWFoLT5haF9zZXR1cF9yeF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfcnhfZGVzYzsKKwkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjOworCQlhaC0+YWhfc2V0dXBfbXJyX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYzsKKwkJYWgtPmFoX3Byb2NfdHhfZGVzYyA9IGF0aDVrX2h3X3Byb2NfNHdvcmRfdHhfc3RhdHVzOworCX0gZWxzZSB7CisJCWFoLT5haF9zZXR1cF9yeF9kZXNjID0gYXRoNWtfaHdfc2V0dXBfcnhfZGVzYzsKKwkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF8yd29yZF90eF9kZXNjOworCQlhaC0+YWhfc2V0dXBfbXJyX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF9ub19tcnI7CisJCWFoLT5haF9wcm9jX3R4X2Rlc2MgPSBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1czsKKwl9CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCWFoLT5haF9wcm9jX3J4X2Rlc2MgPSBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzOworCWVsc2UgaWYgKGFoLT5haF92ZXJzaW9uIDw9IEFSNUtfQVI1MjExKQorCQlhaC0+YWhfcHJvY19yeF9kZXNjID0gYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1czsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kZXNjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxNThjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Rlc2MuaApAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoKKyAqIEludGVybmFsIFJYL1RYIGRlc2NyaXB0b3Igc3RydWN0dXJlcworICogKHJYOiByZXNlcnZlZCBmaWVsZHMgcG9zc2liaWx5IHVzZWQgYnkgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBhcjVrIGNoaXBzZXQpCisgKi8KKworLyoKKyAqIGNvbW1vbiBoYXJkd2FyZSBSWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3X3J4X2N0bCB7CisJdTMyCXJ4X2NvbnRyb2xfMDsgLyogUlggY29udHJvbCB3b3JkIDAgKi8KKwl1MzIJcnhfY29udHJvbF8xOyAvKiBSWCBjb250cm9sIHdvcmQgMSAqLworfSBfX3BhY2tlZDsKKworLyogUlggY29udHJvbCB3b3JkIDAgZmllbGQvc2ZsYWdzICovCisjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwwCQkJMHgwMDAwMDAwMAorCisvKiBSWCBjb250cm9sIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1JYX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLX0RFU0NfUlhfQ1RMMV9JTlRSRVEJCTB4MDAwMDIwMDAKKworLyoKKyAqIGNvbW1vbiBoYXJkd2FyZSBSWCBzdGF0dXMgZGVzY3JpcHRvcgorICogNTIxMC8xMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmxhZ3MgZGVmaW5lZCBiZWxvdworICovCitzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzIHsKKwl1MzIJcnhfc3RhdHVzXzA7IC8qIFJYIHN0YXR1cyB3b3JkIDAgKi8KKwl1MzIJcnhfc3RhdHVzXzE7IC8qIFJYIHN0YXR1cyB3b3JkIDEgKi8KK30gX19wYWNrZWQ7CisKKy8qIDUyMTAvNTIxMSAqLworLyogUlggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9EQVRBX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX01PUkUJCQkweDAwMDAxMDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFCQkweDAwMDc4MDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFX1MJMTUKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTAkweDA3ZjgwMDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9TSUdOQUxfUwkxOQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQQkweDM4MDAwMDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BX1MJMjcKKworLyogUlggc3RhdHVzIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ET05FCQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0sJMHgwMDAwMDAwMgorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUgkJMHgwMDAwMDAwNAorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZJRk9fT1ZFUlJVTgkJMHgwMDAwMDAwOAorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RFQ1JZUFRfQ1JDX0VSUk9SCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IJCTB4MDAwMDAwZTAKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1JfUwkJNQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRAkweDAwMDAwMTAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYCQkweDAwMDA3ZTAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1MJCTkKKyNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUAkweDBmZmY4MDAwCisjZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVBfUwkxNQorI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0tFWV9DQUNIRV9NSVNTCTB4MTAwMDAwMDAKKworLyogNTIxMiAqLworLyogUlggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9EQVRBX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX01PUkUJCQkweDAwMDAxMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREVDT01QX0NSQ19FUlJPUgkweDAwMDAyMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFCQkweDAwMGY4MDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFX1MJMTUKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTAkweDBmZjAwMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9TSUdOQUxfUwkyMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQQkweGYwMDAwMDAwCisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BX1MJMjgKKworLyogUlggc3RhdHVzIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ET05FCQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0sJMHgwMDAwMDAwMgorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0NSQ19FUlJPUgkJMHgwMDAwMDAwNAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0RFQ1JZUFRfQ1JDX0VSUk9SCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9NSUNfRVJST1IJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfVkFMSUQJMHgwMDAwMDEwMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWAkJMHgwMDAwZmUwMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9TCQk5CisjZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVAJMHg3ZmZmMDAwMAorI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QX1MJMTYKKyNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9LRVlfQ0FDSEVfTUlTUwkweDgwMDAwMDAwCisKKy8qCisgKiBjb21tb24gaGFyZHdhcmUgUlggZXJyb3IgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IgeworCXUzMglyeF9lcnJvcl8wOyAvKiBSWCBzdGF0dXMgd29yZCAwICovCisJdTMyCXJ4X2Vycm9yXzE7IC8qIFJYIHN0YXR1cyB3b3JkIDEgKi8KK30gX19wYWNrZWQ7CisKKy8qIFJYIGVycm9yIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMAkJCTB4MDAwMDAwMDAKKworLyogUlggZXJyb3Igd29yZCAxIGZpZWxkcy9mbGFncyAqLworI2RlZmluZSBBUjVLX1JYX0RFU0NfRVJST1IxX1BIWV9FUlJPUl9DT0RFCTB4MDAwMGZmMDAKKyNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMV9QSFlfRVJST1JfQ09ERV9TCTgKKworLyogUEhZIEVycm9yIGNvZGVzICovCisjZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfTk9ORQkJMHgwMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1RJTUlORwkJMHgyMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1BBUklUWQkJMHg0MAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1JBVEUJCTB4NjAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl9MRU5HVEgJCTB4ODAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl82NFFBTQkJMHhhMAorI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1NFUlZJQ0UJCTB4YzAKKyNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl9UUkFOU01JVE9WUgkweGUwCisKKy8qCisgKiA1MjEwLzUyMTEgaGFyZHdhcmUgMi13b3JkIFRYIGNvbnRyb2wgZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsIHsKKwl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLworCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCit9IF9fcGFja2VkOworCisvKiBUWCBjb250cm9sIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOCQkweDAwMDAwZmZmCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4JCTB4MDAwM2YwMDAgLypbNTIxMCA/XSovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU5fUwkxMgorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUJCTB4MDAzYzAwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFX1MJMTgKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfUlRTRU5BCQkweDAwNDAwMDAwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0NMUkRNQVNLCQkweDAxMDAwMDAwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0xPTkdfUEFDS0VUCTB4MDA4MDAwMDAgLypbNTIxMF0qLworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9WRU9MCQkweDAwODAwMDAwIC8qWzUyMTFdKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRQkJMHgxYzAwMDAwMCAvKls1MjEwXSovCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX1RZUEVfUwkyNgorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTAJMHgwMjAwMDAwMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTEJMHgxZTAwMDAwMAorCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVQJCQlcCisJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CQlcCisJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMCA6CVwKKwkJQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF81MjExKQorCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfUwkyNQorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9JTlRSRVEJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQJMHg0MDAwMDAwMAorCisvKiBUWCBjb250cm9sIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9NT1JFCQkweDAwMDAxMDAwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTAJMHgwMDA3ZTAwMAorI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjExCTB4MDAwZmUwMDAKKworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWAkJCQlcCisJCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwkJXAorCQkJQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfNTIxMCA6CVwKKwkJCUFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTEpCisKKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfUwkxMworI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFCQkweDAwNzAwMDAwIC8qWzUyMTFdKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRV9TCTIwCisjZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX05PQUNLCQkweDAwODAwMDAwIC8qWzUyMTFdKi8KKyNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfUlRTX0RVUkFUSU9OCTB4ZmZmODAwMDAgLypbNTIxMCA/XSovCisKKy8qIEZyYW1lIHR5cGVzICovCisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9OT1JNQUwgICAweDAwCisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9BVElNICAgICAweDA0CisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9QU1BPTEwgICAweDA4CisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9OT19ERUxBWSAweDBjCisjZGVmaW5lIEFSNUtfQVI1MjEwX1RYX0RFU0NfRlJBTUVfVFlQRV9QSUZTICAgICAweDEwCisKKy8qCisgKiA1MjEyIGhhcmR3YXJlIDQtd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCB7CisJdTMyCXR4X2NvbnRyb2xfMDsgLyogVFggY29udHJvbCB3b3JkIDAgKi8KKworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU4JCTB4MDAwMDBmZmYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfWE1JVF9QT1dFUgkJMHgwMDNmMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9YTUlUX1BPV0VSX1MJMTYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfUlRTRU5BCQkweDAwNDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1ZFT0wJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQ0xSRE1BU0sJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVAkweDFlMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfUwkyNQorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9JTlRSRVEJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQJMHg0MDAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9DVFNFTkEJCTB4ODAwMDAwMDAKKworCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCisKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQlVGX0xFTgkJMHgwMDAwMGZmZgorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9NT1JFCQkweDAwMDAxMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYCTB4MDAwZmUwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfUwkxMworI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFCQkweDAwZjAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEVfUwkyMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9OT0FDSwkJMHgwMTAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX1BST0MJCTB4MDYwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9QUk9DX1MJMjUKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JVl9MRU4JMHgxODAwMDAwMAorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lWX0xFTl9TCTI3CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSUNWX0xFTgkweDYwMDAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSUNWX0xFTl9TCTI5CisKKwl1MzIJdHhfY29udHJvbF8yOyAvKiBUWCBjb250cm9sIHdvcmQgMiAqLworCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX1JUU19EVVJBVElPTgkJMHgwMDAwN2ZmZgorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9EVVJBVElPTl9VUERBVEVfRU5BQkxFCTB4MDAwMDgwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzAJCTB4MDAwZjAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzBfUwkJMTYKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzEJCTB4MDBmMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzFfUwkJMjAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzIJCTB4MGYwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzJfUwkJMjQKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzMJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzNfUwkJMjgKKworCXUzMgl0eF9jb250cm9sXzM7IC8qIFRYIGNvbnRyb2wgd29yZCAzICovCisKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMAkJMHgwMDAwMDAxZgorI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUxCQkweDAwMDAwM2UwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTFfUwk1CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTIJCTB4MDAwMDdjMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMl9TCTEwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTMJCTB4MDAwZjgwMDAKKyNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFM19TCTE1CisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwCisjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURV9TCTIwCit9IF9fcGFja2VkOworCisvKgorICogQ29tbW9uIFRYIHN0YXR1cyBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhdGg1a19od190eF9zdGF0dXMgeworCXUzMgl0eF9zdGF0dXNfMDsgLyogVFggc3RhdHVzIHdvcmQgMCAqLworCXUzMgl0eF9zdGF0dXNfMTsgLyogVFggc3RhdHVzIHdvcmQgMSAqLworfSBfX3BhY2tlZDsKKworLyogVFggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSwkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0VYQ0VTU0lWRV9SRVRSSUVTCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRklGT19VTkRFUlJVTgkweDAwMDAwMDA0CisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJTFRFUkVECQkweDAwMDAwMDA4CisvKj8/PworI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9SVFNfRkFJTF9DT1VOVAkweDAwMDAwMGYwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1JUU19GQUlMX0NPVU5UX1MJNAorKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfU0hPUlRfUkVUUllfQ09VTlQJMHgwMDAwMDBmMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVF9TCTQKKy8qPz8/CisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVAkweDAwMDAwZjAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVF9TCTgKKyovCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQJMHgwMDAwMGYwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UX1MJOAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlQJMHgwMDAwZjAwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlRfUwkxMgorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUAkweGZmZmYwMDAwCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1NFTkRfVElNRVNUQU1QX1MJMTYKKworLyogVFggc3RhdHVzIHdvcmQgMSBmaWVsZHMvZmxhZ3MgKi8KKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRE9ORQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNCQkweDAwMDAxZmZlCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX1NFUV9OVU1fUwkJMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9BQ0tfU0lHX1NUUkVOR1RICTB4MDAxZmUwMDAKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfQUNLX1NJR19TVFJFTkdUSF9TCTEzCisjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0ZJTkFMX1RTX0lOREVYCTB4MDA2MDAwMDAKKyNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfRklOQUxfVFNfSU5ERVhfUwkyMQorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9DT01QX1NVQ0NFU1MJMHgwMDgwMDAwMAorI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkEJMHgwMTAwMDAwMAorCisvKgorICogNTIxMC81MjExIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3XzUyMTBfdHhfZGVzYyB7CisJc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bAl0eF9jdGw7CisJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OworfSBfX3BhY2tlZDsKKworLyoKKyAqIDUyMTIgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorICovCitzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjIHsKKwlzdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsCXR4X2N0bDsKKwlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzCXR4X3N0YXQ7Cit9IF9fcGFja2VkOworCisvKgorICogY29tbW9uIGhhcmR3YXJlIFJYIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGF0aDVrX2h3X2FsbF9yeF9kZXNjIHsKKwlzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCQkJcnhfY3RsOworCXVuaW9uIHsKKwkJc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cwlyeF9zdGF0OworCQlzdHJ1Y3QgYXRoNWtfaHdfcnhfZXJyb3IJcnhfZXJyOworCX0gdTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBBdGhlcm9zIGhhcmR3YXJlIGRlc2NyaXB0b3IKKyAqIFRoaXMgaXMgcmVhZCBhbmQgd3JpdHRlbiB0byBieSB0aGUgaGFyZHdhcmUKKyAqLworc3RydWN0IGF0aDVrX2Rlc2MgeworCXUzMglkc19saW5rOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKwl1MzIJZHNfZGF0YTsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciAoc2tiKSAqLworCisJdW5pb24geworCQlzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjCWRzX3R4NTIxMDsKKwkJc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYwlkc190eDUyMTI7CisJCXN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYwlkc19yeDsKKwl9IHVkOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBBUjVLX1JYREVTQ19JTlRSRVEJMHgwMDIwCisKKyNkZWZpbmUgQVI1S19UWERFU0NfQ0xSRE1BU0sJMHgwMDAxCisjZGVmaW5lIEFSNUtfVFhERVNDX05PQUNLCTB4MDAwMgkvKls1MjExK10qLworI2RlZmluZSBBUjVLX1RYREVTQ19SVFNFTkEJMHgwMDA0CisjZGVmaW5lIEFSNUtfVFhERVNDX0NUU0VOQQkweDAwMDgKKyNkZWZpbmUgQVI1S19UWERFU0NfSU5UUkVRCTB4MDAxMAorI2RlZmluZSBBUjVLX1RYREVTQ19WRU9MCTB4MDAyMAkvKls1MjExK10qLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGNlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kbWEuYwpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIERNQSBhbmQgaW50ZXJydXB0IG1hc2tpbmcgZnVuY3Rpb25zICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogZG1hLmMgLSBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2Ugc2V0dXAgZGVzY3JpcHRvciBwb2ludGVycyAocnhkcC90eGRwKSBzdGFydC9zdG9wIGRtYSBlbmdpbmUgYW5kCisgKiBoYW5kbGUgcXVldWUgc2V0dXAgZm9yIDUyMTAgY2hpcHNldCAocmVzdCBhcmUgaGFuZGxlZCBvbiBxY3UuYykuCisgKiBBbHNvIHdlIHNldHVwIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIChJTVIpIGFuZCByZWFkIHRoZSB2YXJpb3VzIGl0ZXJydXB0CisgKiBzdGF0dXMgcmVnaXN0ZXJzIChJU1IpLgorICoKKyAqIFRPRE86IEhhbmRsZSBTSVNSIG9uIDUyMTErIGFuZCBpbnRyb2R1Y2UgYSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHF1ZXVlCisgKiBudW1iZXIgdGhhdCByZXN1bHRlZCB0aGUgaW50ZXJydXB0LgorICovCisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKioqKioqKioqXAorKiBSZWNlaXZlICoKK1wqKioqKioqKiovCisKKy8qKgorICogYXRoNWtfaHdfc3RhcnRfcnhfZG1hIC0gU3RhcnQgRE1BIHJlY2VpdmUKKyAqCisgKiBAYWg6CVRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KK3ZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfQ1JfUlhFLCBBUjVLX0NSKTsKKwlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUik7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc3RvcF9yeF9kbWEgLSBTdG9wIERNQSByZWNlaXZlCisgKgorICogQGFoOglUaGUgJnN0cnVjdCBhdGg1a19odworICovCitpbnQgYXRoNWtfaHdfc3RvcF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0NSX1JYRCwgQVI1S19DUik7CisKKwkvKgorCSAqIEl0IG1heSB0YWtlIHNvbWUgdGltZSB0byBkaXNhYmxlIHRoZSBETUEgcmVjZWl2ZSB1bml0CisJICovCisJZm9yIChpID0gMTAwMDsgaSA+IDAgJiYKKwkJCShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUikgJiBBUjVLX0NSX1JYRSkgIT0gMDsKKwkJCWktLSkKKwkJdWRlbGF5KDEwKTsKKworCXJldHVybiBpID8gMCA6IC1FQlVTWTsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfcnhkcCAtIEdldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBYWFg6IElzIFJYRFAgcmVhZCBhbmQgY2xlYXIgPworICovCit1MzIgYXRoNWtfaHdfZ2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlhEUCk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X3J4ZHAgLSBTZXQgUlggRGVzY3JpcHRvcidzIGFkZHJlc3MKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcGh5c19hZGRyOiBSWCBkZXNjcmlwdG9yIGFkZHJlc3MKKyAqCisgKiBYWFg6IFNob3VsZCB3ZSBjaGVjayBpZiByeCBpcyBlbmFibGVkIGJlZm9yZSBzZXR0aW5nIHJ4ZHAgPworICovCit2b2lkIGF0aDVrX2h3X3NldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBwaHlzX2FkZHIpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5c19hZGRyLCBBUjVLX1JYRFApOworfQorCisKKy8qKioqKioqKioqXAorKiBUcmFuc21pdCAqCitcKioqKioqKioqKi8KKworLyoqCisgKiBhdGg1a19od19zdGFydF90eF9kbWEgLSBTdGFydCBETUEgdHJhbnNtaXQgZm9yIGEgc3BlY2lmaWMgcXVldWUKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKKyAqCisgKiBTdGFydCBETUEgdHJhbnNtaXQgZm9yIGEgc3BlY2lmaWMgcXVldWUgYW5kIHNpbmNlIDUyMTAgZG9lc24ndCBoYXZlCisgKiBRQ1UvRENVLCBzZXQgdXAgcXVldWUgcGFyYW1ldGVycyBmb3IgNTIxMCBoZXJlIGJhc2VkIG9uIHF1ZXVlIHR5cGUgKG9uZQorICogcXVldWUgZm9yIG5vcm1hbCBkYXRhIGFuZCBvbmUgcXVldWUgZm9yIGJlYWNvbnMpLiBGb3IgcXVldWUgc2V0dXAKKyAqIG9uIG5ld2VyIGNoaXBzIGNoZWNrIG91dCBxY3UuYy4gUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQKKyAqIG9mIHJhbmdlIG9yIGlmIHF1ZXVlIGlzIGFscmVhZHkgZGlzYWJsZWQuCisgKgorICogTk9URTogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB1cCB0eCBjb250cm9sIGRlc2NyaXB0b3IgZm9yIHRoYXQKKyAqIHF1ZXVlIChzZWUgYmVsb3cpLgorICovCitpbnQgYXRoNWtfaHdfc3RhcnRfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3sKKwl1MzIgdHhfcXVldWU7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOworCisJLyogUmV0dXJuIGlmIHF1ZXVlIGlzIGRlY2xhcmVkIGluYWN0aXZlICovCisJaWYgKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlID09IEFSNUtfVFhfUVVFVUVfSU5BQ1RJVkUpCisJCXJldHVybiAtRUlPOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCXR4X3F1ZXVlID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpOworCisJCS8qCisJCSAqIFNldCB0aGUgcXVldWUgYnkgdHlwZSBvbiA1MjEwCisJCSAqLworCQlzd2l0Y2ggKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlKSB7CisJCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgorCQkJdHhfcXVldWUgfD0gQVI1S19DUl9UWEUwICYgfkFSNUtfQ1JfVFhEMDsKKwkJCWJyZWFrOworCQljYXNlIEFSNUtfVFhfUVVFVUVfQkVBQ09OOgorCQkJdHhfcXVldWUgfD0gQVI1S19DUl9UWEUxICYgfkFSNUtfQ1JfVFhEMTsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19CQ1JfVFExViB8IEFSNUtfQkNSX0JETUFFLAorCQkJCQlBUjVLX0JTUik7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCXR4X3F1ZXVlIHw9IEFSNUtfQ1JfVFhFMSAmIH5BUjVLX0NSX1RYRDE7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfQkNSX1RRMUZWIHwgQVI1S19CQ1JfVFExViB8CisJCQkJQVI1S19CQ1JfQkRNQUUsIEFSNUtfQlNSKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogU3RhcnQgcXVldWUgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF9xdWV1ZSwgQVI1S19DUik7CisJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKKwl9IGVsc2UgeworCQkvKiBSZXR1cm4gaWYgcXVldWUgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKEFSNUtfUkVHX1JFQURfUShhaCwgQVI1S19RQ1VfVFhELCBxdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBTdGFydCBxdWV1ZSAqLworCQlBUjVLX1JFR19XUklURV9RKGFoLCBBUjVLX1FDVV9UWEUsIHF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdGg1a19od19zdG9wX3R4X2RtYSAtIFN0b3AgRE1BIHRyYW5zbWl0IG9uIGEgc3BlY2lmaWMgcXVldWUKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKKyAqCisgKiBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIGh3IHF1ZXVlIGFuZCBkcmFpbiBxdWV1ZSBzbyB3ZSBkb24ndAorICogaGF2ZSBhbnkgcGVuZGluZyBmcmFtZXMuIFJldHVybnMgLUVCVVNZIGlmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBmcmFtZXMsCisgKiAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UuCisgKgorICovCitpbnQgYXRoNWtfaHdfc3RvcF90eF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCXVuc2lnbmVkIGludCBpID0gNDA7CisJdTMyIHR4X3F1ZXVlLCBwZW5kaW5nOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKKworCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkZWNsYXJlZCBpbmFjdGl2ZSAqLworCWlmIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQl0eF9xdWV1ZSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKKworCQkvKgorCQkgKiBTZXQgYnkgcXVldWUgdHlwZQorCQkgKi8KKwkJc3dpdGNoIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSkgeworCQljYXNlIEFSNUtfVFhfUVVFVUVfREFUQToKKwkJCXR4X3F1ZXVlIHw9IEFSNUtfQ1JfVFhEMCAmIH5BUjVLX0NSX1RYRTA7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0JFQUNPTjoKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCS8qIFhYWCBGaXggbWUuLi4gKi8KKwkJCXR4X3F1ZXVlIHw9IEFSNUtfQ1JfVFhEMSAmIH5BUjVLX0NSX1RYRDE7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfQlNSKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBTdG9wIHF1ZXVlICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHhfcXVldWUsIEFSNUtfQ1IpOworCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2NoZWR1bGUgVFggZGlzYWJsZSBhbmQgd2FpdCB1bnRpbCBxdWV1ZSBpcyBlbXB0eQorCQkgKi8KKwkJQVI1S19SRUdfV1JJVEVfUShhaCwgQVI1S19RQ1VfVFhELCBxdWV1ZSk7CisKKwkJLypDaGVjayBmb3IgcGVuZGluZyBmcmFtZXMqLworCQlkbyB7CisJCQlwZW5kaW5nID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsCisJCQkJQVI1S19RVUVVRV9TVEFUVVMocXVldWUpKSAmCisJCQkJQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQ7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfSB3aGlsZSAoLS1pICYmIHBlbmRpbmcpOworCisJCS8qIEZvciAyNDEzKyBvcmRlciBQQ1UgdG8gZHJvcCBwYWNrZXRzIHVzaW5nCisJCSAqIFFVSUVUIG1lY2hhbmlzbSAqLworCQlpZiAoYWgtPmFoX21hY192ZXJzaW9uID49IChBUjVLX1NSRVZfQVIyNDE0ID4+IDQpICYmCisJCXBlbmRpbmcpeworCQkJLyogU2V0IHBlcmlvZGljaXR5IGFuZCBkdXJhdGlvbiAqLworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJCUFSNUtfUkVHX1NNKDEwMCwgQVI1S19RVUlFVF9DVEwyX1FUX1BFUil8CisJCQkJQVI1S19SRUdfU00oMTAsIEFSNUtfUVVJRVRfQ1RMMl9RVF9EVVIpLAorCQkJCUFSNUtfUVVJRVRfQ1RMMik7CisKKwkJCS8qIEVuYWJsZSBxdWlldCBwZXJpb2QgZm9yIGN1cnJlbnQgVFNGICovCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQkJQVI1S19RVUlFVF9DVEwxX1FUX0VOIHwKKwkJCQlBUjVLX1JFR19TTShhdGg1a19od19yZWdfcmVhZChhaCwKKwkJCQkJCUFSNUtfVFNGX0wzMl81MjExKSA+PiAxMCwKKwkJCQkJCUFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRiksCisJCQkJQVI1S19RVUlFVF9DVEwxKTsKKworCQkJLyogRm9yY2UgY2hhbm5lbCBpZGxlIGhpZ2ggKi8KKwkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1dfNTIxMSwKKwkJCQkJQVI1S19ESUFHX1NXX0NIQU5FTF9JRExFX0hJR0gpOworCisJCQkvKiBXYWl0IGEgd2hpbGUgYW5kIGRpc2FibGUgbWVjaGFuaXNtICovCisJCQl1ZGVsYXkoMjAwKTsKKwkJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19RVUlFVF9DVEwxLAorCQkJCQkJQVI1S19RVUlFVF9DVEwxX1FUX0VOKTsKKworCQkJLyogUmUtY2hlY2sgZm9yIHBlbmRpbmcgZnJhbWVzICovCisJCQlpID0gNDA7CisJCQlkbyB7CisJCQkJcGVuZGluZyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJCQlBUjVLX1FVRVVFX1NUQVRVUyhxdWV1ZSkpICYKKwkJCQkJQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQ7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9IHdoaWxlICgtLWkgJiYgcGVuZGluZyk7CisKKwkJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXXzUyMTEsCisJCQkJCUFSNUtfRElBR19TV19DSEFORUxfSURMRV9ISUdIKTsKKwkJfQorCisJCS8qIENsZWFyIHJlZ2lzdGVyICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19RQ1VfVFhEKTsKKwkJaWYgKHBlbmRpbmcpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFRPRE86IENoZWNrIGZvciBzdWNjZXNzIG9uIDUyMTAgZWxzZSByZXR1cm4gZXJyb3IgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfdHhkcCAtIEdldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgorICoKKyAqIEdldCBUWCBkZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4gRm9yIDUyMTAgd2UgaWdub3JlCisgKiB0aGUgcXVldWUgbnVtYmVyIGFuZCB1c2UgdHggcXVldWUgdHlwZSBzaW5jZSB3ZSBvbmx5IGhhdmUgMiBxdWV1ZXMuCisgKiBXZSB1c2UgVFhEUDAgZm9yIG5vcm1hbCBkYXRhIHF1ZXVlIGFuZCBUWERQMSBmb3IgYmVhY29uIHF1ZXVlLgorICogRm9yIG5ld2VyIGNoaXBzIHdpdGggUUNVL0RDVSB3ZSBqdXN0IHJlYWQgdGhlIGNvcnJlc3BvbmRpbmcgVFhEUCByZWdpc3Rlci4KKyAqCisgKiBYWFg6IElzIFRYRFAgcmVhZCBhbmQgY2xlYXIgPworICovCit1MzIgYXRoNWtfaHdfZ2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCXUxNiB0eF9yZWc7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOworCisJLyoKKwkgKiBHZXQgdGhlIHRyYW5zbWl0IHF1ZXVlIGRlc2NyaXB0b3IgcG9pbnRlciBmcm9tIHRoZSBzZWxlY3RlZCBxdWV1ZQorCSAqLworCS8qNTIxMCBkb2Vzbid0IGhhdmUgUUNVKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJc3dpdGNoIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSkgeworCQljYXNlIEFSNUtfVFhfUVVFVUVfREFUQToKKwkJCXR4X3JlZyA9IEFSNUtfTk9RQ1VfVFhEUDA7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0JFQUNPTjoKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCXR4X3JlZyA9IEFSNUtfTk9RQ1VfVFhEUDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAweGZmZmZmZmZmOworCQl9CisJfSBlbHNlIHsKKwkJdHhfcmVnID0gQVI1S19RVUVVRV9UWERQKHF1ZXVlKTsKKwl9CisKKwlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIHR4X3JlZyk7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X3R4ZHAgLSBTZXQgVFggRGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKKyAqCisgKiBTZXQgVFggZGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUuIEZvciA1MjEwIHdlIGlnbm9yZQorICogdGhlIHF1ZXVlIG51bWJlciBhbmQgd2UgdXNlIHR4IHF1ZXVlIHR5cGUgc2luY2Ugd2Ugb25seSBoYXZlIDIgcXVldWVzCisgKiBzbyBhcyBhYm92ZSB3ZSB1c2UgVFhEUDAgZm9yIG5vcm1hbCBkYXRhIHF1ZXVlIGFuZCBUWERQMSBmb3IgYmVhY29uIHF1ZXVlLgorICogRm9yIG5ld2VyIGNoaXBzIHdpdGggUUNVL0RDVSB3ZSBqdXN0IHNldCB0aGUgY29ycmVzcG9uZGluZyBUWERQIHJlZ2lzdGVyLgorICogUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIHR5cGUgaXMgaW52YWxpZCBmb3IgNTIxMCBhbmQgLUVJTyBpZiBxdWV1ZSBpcyBzdGlsbAorICogYWN0aXZlLgorICovCitpbnQgYXRoNWtfaHdfc2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlLCB1MzIgcGh5c19hZGRyKQoreworCXUxNiB0eF9yZWc7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOworCisJLyoKKwkgKiBTZXQgdGhlIHRyYW5zbWl0IHF1ZXVlIGRlc2NyaXB0b3IgcG9pbnRlciByZWdpc3RlciBieSB0eXBlCisJICogb24gNTIxMAorCSAqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQlzd2l0Y2ggKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlKSB7CisJCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgorCQkJdHhfcmVnID0gQVI1S19OT1FDVV9UWERQMDsKKwkJCWJyZWFrOworCQljYXNlIEFSNUtfVFhfUVVFVUVfQkVBQ09OOgorCQljYXNlIEFSNUtfVFhfUVVFVUVfQ0FCOgorCQkJdHhfcmVnID0gQVI1S19OT1FDVV9UWERQMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZXQgdGhlIHRyYW5zbWl0IHF1ZXVlIGRlc2NyaXB0b3IgcG9pbnRlciBmb3IKKwkJICogdGhlIHNlbGVjdGVkIHF1ZXVlIG9uIFFDVSBmb3IgNTIxMSsKKwkJICogKHRoaXMgd29uJ3Qgd29yayBpZiB0aGUgcXVldWUgaXMgc3RpbGwgYWN0aXZlKQorCQkgKi8KKwkJaWYgKEFSNUtfUkVHX1JFQURfUShhaCwgQVI1S19RQ1VfVFhFLCBxdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0eF9yZWcgPSBBUjVLX1FVRVVFX1RYRFAocXVldWUpOworCX0KKworCS8qIFNldCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeXNfYWRkciwgdHhfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwgLSBVcGRhdGUgdHggdHJpZ2dlciBsZXZlbAorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBpbmNyZWFzZTogRmxhZyB0byBmb3JjZSBpbmNyZWFzZSBvZiB0cmlnZ2VyIGxldmVsCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZWFzZXMvZGVjcmVhc2VzIHRoZSB0eCB0cmlnZ2VyIGxldmVsIGZvciB0aGUgdHggZmlmbworICogYnVmZmVyIChha2EgRklGTyB0aHJlc2hvbGQpIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIFBDVSBmbHVzaGVzCisgKiB0aGUgYnVmZmVyIGFuZCB0cmFuc21pdHMgaXQncyBkYXRhLiBMb3dlcmluZyB0aGlzIHJlc3VsdHMgc2VuZGluZyBzbWFsbAorICogZnJhbWVzIG1vcmUgcXVpY2tseSBidXQgY2FuIGxlYWQgdG8gdHggdW5kZXJydW5zLCByYWlzaW5nIGl0IGEgbG90IGNhbgorICogcmVzdWx0IG90aGVyIHByb2JsZW1zIChpIHRoaW5rIGJtaXNzIGlzIHJlbGF0ZWQpLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aAorICogdGhlIGxvd2VzdCBwb3NzaWJsZSAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZworICogdGhlIGluY3JlYXNlIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIGhhdmUgcmVhY2hlZCBtYXhpbXVtL21pbmltdW0uCisgKgorICogWFhYOiBMaW5rIHRoaXMgd2l0aCB0eCBETUEgc2l6ZSA/CisgKiBYWFg6IFVzZSBpdCB0byBzYXZlIGludGVycnVwdHMgPworICogVE9ETzogTmVlZHMgdGVzdGluZywgaSB0aGluayBpdCdzIHJlbGF0ZWQgdG8gYm1pc3MuLi4KKyAqLworaW50IGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBpbmNyZWFzZSkKK3sKKwl1MzIgdHJpZ2dlcl9sZXZlbCwgaW1yOworCWludCByZXQgPSAtRUlPOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCS8qCisJICogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIG1hc2sKKwkgKi8KKwlpbXIgPSBhdGg1a19od19zZXRfaW1yKGFoLCBhaC0+YWhfaW1yICYgfkFSNUtfSU5UX0dMT0JBTCk7CisKKwl0cmlnZ2VyX2xldmVsID0gQVI1S19SRUdfTVMoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVFhDRkcpLAorCQkJQVI1S19UWENGR19UWEZVTEwpOworCisJaWYgKCFpbmNyZWFzZSkgeworCQlpZiAoLS10cmlnZ2VyX2xldmVsIDwgQVI1S19UVU5FX01JTl9UWF9GSUZPX1RIUkVTKQorCQkJZ290byBkb25lOworCX0gZWxzZQorCQl0cmlnZ2VyX2xldmVsICs9CisJCQkoKEFSNUtfVFVORV9NQVhfVFhfRklGT19USFJFUyAtIHRyaWdnZXJfbGV2ZWwpIC8gMik7CisKKwkvKgorCSAqIFVwZGF0ZSB0cmlnZ2VyIGxldmVsIG9uIHN1Y2Nlc3MKKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHJpZ2dlcl9sZXZlbCwgQVI1S19UUklHX0xWTCk7CisJZWxzZQorCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAorCQkJCUFSNUtfVFhDRkdfVFhGVUxMLCB0cmlnZ2VyX2xldmVsKTsKKworCXJldCA9IDA7CisKK2RvbmU6CisJLyoKKwkgKiBSZXN0b3JlIGludGVycnVwdCBtYXNrCisJICovCisJYXRoNWtfaHdfc2V0X2ltcihhaCwgaW1yKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqXAorKiBJbnRlcnJ1cHQgbWFza2luZyAqCitcKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBhdGg1a19od19pc19pbnRyX3BlbmRpbmcgLSBDaGVjayBpZiB3ZSBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBDaGVjayBpZiB3ZSBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cyB0byBwcm9jZXNzLiBSZXR1cm5zIDEgaWYgd2UKKyAqIGhhdmUgcGVuZGluZyBpbnRlcnJ1cHRzIGFuZCAwIGlmIHdlIGhhdmVuJ3QuCisgKi8KK2Jvb2wgYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSU5UUEVORCkgPT0gMSA/IDEgOiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X2dldF9pc3IgLSBHZXQgaW50ZXJydXB0IHN0YXR1cworICoKKyAqIEBhaDogVGhlIEBzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBpbnRlcnJ1cHRfbWFzazogRHJpdmVyJ3MgaW50ZXJydXB0IG1hc2sgdXNlZCB0byBmaWx0ZXIgb3V0CisgKiBpbnRlcnJ1cHRzIGluIHN3LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUgb3VyIGludGVycnVwdCBoYW5kbGVyIHRvIGRldGVybWluZSB0aGUgcmVhc29uCisgKiBmb3IgdGhlIGludGVycnVwdCBieSByZWFkaW5nIFByaW1hcnkgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3Rlci4gUmV0dXJucyBhbgorICogYWJzdHJhY3QgaW50ZXJydXB0IHN0YXR1cyBtYXNrIHdoaWNoIGlzIG1vc3RseSBJU1Igd2l0aCBzb21lIHVuY29tbW9uIGJpdHMKKyAqIGJlaW5nIG1hcHBlZCBvbiBzb21lIHN0YW5kYXJkIG5vbiBody1zcGVjaWZpYyBwb3NpdGlvbnMKKyAqIChjaGVjayBvdXQgJmF0aDVrX2ludCkuCisgKgorICogTk9URTogV2UgdXNlIHJlYWQtYW5kLWNsZWFyIHJlZ2lzdGVyLCBzbyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBJU1IKKyAqIGlzIHplcm9lZC4KKyAqCisgKiBYWFg6IFdoeSBmaWx0ZXIgaW50ZXJydXB0cyBpbiBzdyB3aXRoIGludGVycnVwdF9tYXNrID8gTm8gYmVuZWZpdCBhdCBhbGwKKyAqIHBsdXMgaXQgY2FuIGJlIG1pc2xlYWRpbmcgKG9uZSBtaWdodCB0aGluZyB0aGF0IHdlIHNhdmUgaW50ZXJydXB0cyB0aGlzIHdheSkKKyAqLworaW50IGF0aDVrX2h3X2dldF9pc3Ioc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgKmludGVycnVwdF9tYXNrKQoreworCXUzMiBkYXRhOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCS8qCisJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gdGhlIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIKKwkgKiBvbiA1MjEwCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JU1IpOworCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7CisJCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZWFkIGludGVycnVwdCBzdGF0dXMgZnJvbSB0aGUgUmVhZC1BbmQtQ2xlYXIKKwkJICogc2hhZG93IHJlZ2lzdGVyLgorCQkgKiBOb3RlOiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwCisJCSAqLworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1BJU1IpOworCX0KKworCS8qCisJICogR2V0IGFic3RyYWN0IGludGVycnVwdCBtYXNrIChkcml2ZXItY29tcGF0aWJsZSkKKwkgKi8KKwkqaW50ZXJydXB0X21hc2sgPSAoZGF0YSAmIEFSNUtfSU5UX0NPTU1PTikgJiBhaC0+YWhfaW1yOworCisJaWYgKHVubGlrZWx5KGRhdGEgPT0gQVI1S19JTlRfTk9DQVJEKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGF0YSAmIChBUjVLX0lTUl9SWE9LIHwgQVI1S19JU1JfUlhFUlIpKQorCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfUlg7CisKKwlpZiAoZGF0YSAmIChBUjVLX0lTUl9UWE9LIHwgQVI1S19JU1JfVFhFUlIKKwkJfCBBUjVLX0lTUl9UWERFU0MgfCBBUjVLX0lTUl9UWEVPTCkpCisJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9UWDsKKworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQkvKkhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpKi8KKwkJaWYgKHVubGlrZWx5KGRhdGEgJiAoQVI1S19JU1JfSElVRVJSKSkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisKKwkJLypCZWFjb24gTm90IFJlYWR5Ki8KKwkJaWYgKHVubGlrZWx5KGRhdGEgJiAoQVI1S19JU1JfQk5SKSkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfQk5SOworCX0KKworCS8qCisJICogWFhYOiBCTUlTUyBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhZnRlciBhc3NvY2lhdGlvbi4KKwkgKiBJIGZvdW5kIHRoaXMgb24gNTIxMCBjb2RlIGJ1dCBpdCBuZWVkcyB0ZXN0aW5nLiBJZiB0aGlzIGlzCisJICogdHJ1ZSB3ZSBzaG91bGQgZGlzYWJsZSB0aGVtIGJlZm9yZSBhc3NvYyBhbmQgcmUtZW5hYmxlIHRoZW0KKwkgKiBhZnRlciBhIHN1Y2Nlc3NmdWxsIGFzc29jICsgc29tZSBqaWZmaWVzLgorCSAqLworI2lmIDAKKwlpbnRlcnJ1cHRfbWFzayAmPSB+QVI1S19JTlRfQk1JU1M7CisjZW5kaWYKKworCS8qCisJICogSW4gY2FzZSB3ZSBkaWRuJ3QgaGFuZGxlIGFueXRoaW5nLAorCSAqIHByaW50IHRoZSByZWdpc3RlciB2YWx1ZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoKmludGVycnVwdF9tYXNrID09IDAgJiYgbmV0X3JhdGVsaW1pdCgpKSkKKwkJQVRINUtfUFJJTlRGKCIweCUwOHhcbiIsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYXRoNWtfaHdfc2V0X2ltciAtIFNldCBpbnRlcnJ1cHQgbWFzaworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBuZXdfbWFzazogVGhlIG5ldyBpbnRlcnJ1cHQgbWFzayB0byBiZSBzZXQKKyAqCisgKiBTZXQgdGhlIGludGVycnVwdCBtYXNrIGluIGh3IHRvIHNhdmUgaW50ZXJydXB0cy4gV2UgZG8gdGhhdCBieSBtYXBwaW5nCisgKiBhdGg1a19pbnQgYml0cyB0byBody1zcGVjaWZpYyBiaXRzIHRvIHJlbW92ZSBhYnN0cmFjdGlvbiBhbmQgd3JpdGluZworICogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIuCisgKi8KK2VudW0gYXRoNWtfaW50IGF0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spCit7CisJZW51bSBhdGg1a19pbnQgb2xkX21hc2ssIGludF9tYXNrOworCisJLyoKKwkgKiBEaXNhYmxlIGNhcmQgaW50ZXJydXB0cyB0byBwcmV2ZW50IGFueSByYWNlIGNvbmRpdGlvbnMKKwkgKiAodGhleSB3aWxsIGJlIHJlLWVuYWJsZWQgYWZ0ZXJ3YXJkcykuCisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0lFUl9ESVNBQkxFLCBBUjVLX0lFUik7CisJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSUVSKTsKKworCW9sZF9tYXNrID0gYWgtPmFoX2ltcjsKKworCS8qCisJICogQWRkIGFkZGl0aW9uYWwsIGNoaXBzZXQtZGVwZW5kZW50IGludGVycnVwdCBtYXNrIGZsYWdzCisJICogYW5kIHdyaXRlIHRoZW0gdG8gdGhlIElNUiAoaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIpLgorCSAqLworCWludF9tYXNrID0gbmV3X21hc2sgJiBBUjVLX0lOVF9DT01NT047CisKKwlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9SWCkKKwkJaW50X21hc2sgfD0gQVI1S19JTVJfUlhPSyB8IEFSNUtfSU1SX1JYRVJSIHwgQVI1S19JTVJfUlhPUk4gfAorCQkJQVI1S19JTVJfUlhERVNDOworCisJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfVFgpCisJCWludF9tYXNrIHw9IEFSNUtfSU1SX1RYT0sgfCBBUjVLX0lNUl9UWEVSUiB8IEFSNUtfSU1SX1RYREVTQyB8CisJCQlBUjVLX0lNUl9UWFVSTjsKKworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9GQVRBTCkgeworCQkJaW50X21hc2sgfD0gQVI1S19JTVJfSElVRVJSOworCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU0lNUjIsIEFSNUtfU0lNUjJfTUNBQlQgfAorCQkJCQlBUjVLX1NJTVIyX1NTRVJSIHwgQVI1S19TSU1SMl9EUEVSUik7CisJCX0KKwl9CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludF9tYXNrLCBBUjVLX1BJTVIpOworCisJLyogU3RvcmUgbmV3IGludGVycnVwdCBtYXNrICovCisJYWgtPmFoX2ltciA9IG5ld19tYXNrOworCisJLyogLi5yZS1lbmFibGUgaW50ZXJydXB0cyAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19JRVJfRU5BQkxFLCBBUjVLX0lFUik7CisJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSUVSKTsKKworCXJldHVybiBvbGRfbWFzazsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9lZXByb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODgzODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZWVwcm9tLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBFRVBST00gYWNjZXNzIGZ1bmN0aW9ucyBhbmQgaGVscGVycyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisKKy8qCisgKiBSZWFkIGZyb20gZWVwcm9tCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfaHdfZWVwcm9tX3JlYWQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIG9mZnNldCwgdTE2ICpkYXRhKQoreworCXUzMiBzdGF0dXMsIHRpbWVvdXQ7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCS8qCisJICogSW5pdGlhbGl6ZSBFRVBST00gYWNjZXNzCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywgQVI1S19QQ0lDRkdfRUVBRSk7CisJCSh2b2lkKWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0VFUFJPTV9CQVNFICsgKDQgKiBvZmZzZXQpKTsKKwl9IGVsc2UgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIG9mZnNldCwgQVI1S19FRVBST01fQkFTRSk7CisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0VFUFJPTV9DTUQsCisJCQkJQVI1S19FRVBST01fQ01EX1JFQUQpOworCX0KKworCWZvciAodGltZW91dCA9IEFSNUtfVFVORV9SRUdJU1RFUl9USU1FT1VUOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCXN0YXR1cyA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0VFUFJPTV9TVEFUVVMpOworCQlpZiAoc3RhdHVzICYgQVI1S19FRVBST01fU1RBVF9SRERPTkUpIHsKKwkJCWlmIChzdGF0dXMgJiBBUjVLX0VFUFJPTV9TVEFUX1JERVJSKQorCQkJCXJldHVybiAtRUlPOworCQkJKmRhdGEgPSAodTE2KShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19FRVBST01fREFUQSkgJgorCQkJCQkweGZmZmYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5KDE1KTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBiaW5hcnkgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBpbiBFRVBST00gdG8gZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB1MTYgYXRoNWtfZWVwcm9tX2JpbjJmcmVxKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBiaW4sCisJCQkJdW5zaWduZWQgaW50IG1vZGUpCit7CisJdTE2IHZhbDsKKworCWlmIChiaW4gPT0gQVI1S19FRVBST01fQ0hBTk5FTF9ESVMpCisJCXJldHVybiBiaW47CisKKwlpZiAobW9kZSA9PSBBUjVLX0VFUFJPTV9NT0RFXzExQSkgeworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPiBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMikKKwkJCXZhbCA9ICg1ICogYmluKSArIDQ4MDA7CisJCWVsc2UKKwkJCXZhbCA9IGJpbiA+IDYyID8gKDEwICogNjIpICsgKDUgKiAoYmluIC0gNjIpKSArIDUxMDAgOgorCQkJCShiaW4gKiAxMCkgKyA1MTAwOworCX0gZWxzZSB7CisJCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQorCQkJdmFsID0gYmluICsgMjMwMDsKKwkJZWxzZQorCQkJdmFsID0gYmluICsgMjQwMDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogUmVhZCBhbnRlbm5hIGluZm9zIGZyb20gZWVwcm9tCisgKi8KK3N0YXRpYyBpbnQgYXRoNWtfZWVwcm9tX3JlYWRfYW50cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgKm9mZnNldCwKKwkJdW5zaWduZWQgaW50IG1vZGUpCit7CisJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CisJdTMyIG8gPSAqb2Zmc2V0OworCXUxNiB2YWw7CisJaW50IHJldCwgaSA9IDA7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfc3dpdGNoX3NldHRsaW5nW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4N2Y7CisJZWUtPmVlX2FudF90eF9yeFttb2RlXQkJPSAodmFsID4+IDIpICYgMHgzZjsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baV0JPSAodmFsIDw8IDQpICYgMHgzZjsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCXw9ICh2YWwgPj4gMTIpICYgMHhmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiA2KSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSB2YWwgJiAweDNmOworCisJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDEwKSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDQpICYgMHgzZjsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baV0JPSAodmFsIDw8IDIpICYgMHgzZjsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCXw9ICh2YWwgPj4gMTQpICYgMHgzOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiA4KSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDIpICYgMHgzZjsKKwllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baV0JPSAodmFsIDw8IDQpICYgMHgzZjsKKworCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCXw9ICh2YWwgPj4gMTIpICYgMHhmOworCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpKytdCT0gKHZhbCA+PiA2KSAmIDB4M2Y7CisJZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSB2YWwgJiAweDNmOworCisJLyogR2V0IGFudGVubmEgbW9kZXMgKi8KKwlhaC0+YWhfYW50ZW5uYVttb2RlXVswXSA9CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bMF0gPDwgNCkgfCAweDE7CisJYWgtPmFoX2FudGVubmFbbW9kZV1bQVI1S19BTlRfRklYRURfQV0gPQorCSAgICAgZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzFdIAl8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bMl0gPDwgNikgCXwKKwkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVszXSA8PCAxMikgfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzRdIDw8IDE4KSB8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bNV0gPDwgMjQpOworCWFoLT5haF9hbnRlbm5hW21vZGVdW0FSNUtfQU5UX0ZJWEVEX0JdID0KKwkgICAgIGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs2XSAJfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzddIDw8IDYpIAl8CisJICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bOF0gPDwgMTIpIHwKKwkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs5XSA8PCAxOCkgfAorCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzEwXSA8PCAyNCk7CisKKwkvKiByZXR1cm4gbmV3IG9mZnNldCAqLworCSpvZmZzZXQgPSBvOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHN1cHBvcnRlZCBtb2RlcyBmcm9tIGVlcHJvbQorICovCitzdGF0aWMgaW50IGF0aDVrX2VlcHJvbV9yZWFkX21vZGVzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiAqb2Zmc2V0LAorCQl1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKKwl1MzIgbyA9ICpvZmZzZXQ7CisJdTE2IHZhbDsKKwlpbnQgcmV0OworCisJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJZWUtPmVlX3R4X2VuZDJ4bG5hX2VuYWJsZVttb2RlXQk9ICh2YWwgPj4gOCkgJiAweGZmOworCWVlLT5lZV90aHJfNjJbbW9kZV0JCT0gdmFsICYgMHhmZjsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA8PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMikKKwkJZWUtPmVlX3Rocl82Mlttb2RlXSA9IG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEgPyAxNSA6IDI4OworCisJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7CisJZWUtPmVlX3R4X2VuZDJ4cGFfZGlzYWJsZVttb2RlXQk9ICh2YWwgPj4gOCkgJiAweGZmOworCWVlLT5lZV90eF9mcm0yeHBhX2VuYWJsZVttb2RlXQk9IHZhbCAmIDB4ZmY7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfcGdhX2Rlc2lyZWRfc2l6ZVttb2RlXQk9ICh2YWwgPj4gOCkgJiAweGZmOworCisJaWYgKCh2YWwgJiAweGZmKSAmIDB4ODApCisJCWVlLT5lZV9ub2lzZV9mbG9vcl90aHJbbW9kZV0gPSAtKCgoKHZhbCAmIDB4ZmYpIF4gMHhmZikpICsgMSk7CisJZWxzZQorCQllZS0+ZWVfbm9pc2VfZmxvb3JfdGhyW21vZGVdID0gdmFsICYgMHhmZjsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA8PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMikKKwkJZWUtPmVlX25vaXNlX2Zsb29yX3Roclttb2RlXSA9CisJCSAgICBtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBID8gLTU0IDogLTE7CisKKwlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwllZS0+ZWVfeGxuYV9nYWluW21vZGVdCQk9ICh2YWwgPj4gNSkgJiAweGZmOworCWVlLT5lZV94X2dhaW5bbW9kZV0JCT0gKHZhbCA+PiAxKSAmIDB4ZjsKKwllZS0+ZWVfeHBkW21vZGVdCQk9IHZhbCAmIDB4MTsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkKKwkJZWUtPmVlX2ZpeGVkX2JpYXNbbW9kZV0gPSAodmFsID4+IDEzKSAmIDB4MTsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMykgeworCQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKKwkJZWUtPmVlX2ZhbHNlX2RldGVjdFttb2RlXSA9ICh2YWwgPj4gNikgJiAweDdmOworCisJCWlmIChtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBKQorCQkJZWUtPmVlX3hyX3Bvd2VyW21vZGVdID0gdmFsICYgMHgzZjsKKwkJZWxzZSB7CisJCQllZS0+ZWVfb2JbbW9kZV1bMF0gPSB2YWwgJiAweDc7CisJCQllZS0+ZWVfZGJbbW9kZV1bMF0gPSAodmFsID4+IDMpICYgMHg3OworCQl9CisJfQorCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uIDwgQVI1S19FRVBST01fVkVSU0lPTl8zXzQpIHsKKwkJZWUtPmVlX2lfZ2Fpblttb2RlXSA9IEFSNUtfRUVQUk9NX0lfR0FJTjsKKwkJZWUtPmVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhID0gQVI1S19FRVBST01fQ0NLX09GRE1fREVMVEE7CisJfSBlbHNlIHsKKwkJZWUtPmVlX2lfZ2Fpblttb2RlXSA9ICh2YWwgPj4gMTMpICYgMHg3OworCisJCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOworCQllZS0+ZWVfaV9nYWluW21vZGVdIHw9ICh2YWwgPDwgMykgJiAweDM4OworCisJCWlmIChtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFHKQorCQkJZWUtPmVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhID0gKHZhbCA+PiAzKSAmIDB4ZmY7CisJfQorCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wICYmCisJCQltb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBKSB7CisJCWVlLT5lZV9pX2NhbFttb2RlXSA9ICh2YWwgPj4gOCkgJiAweDNmOworCQllZS0+ZWVfcV9jYWxbbW9kZV0gPSAodmFsID4+IDMpICYgMHgxZjsKKwl9CisKKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzYgJiYKKwkgICAgbW9kZSA9PSBBUjVLX0VFUFJPTV9NT0RFXzExRykKKwkJZWUtPmVlX3NjYWxlZF9jY2tfZGVsdGEgPSAodmFsID4+IDExKSAmIDB4MWY7CisKKwkvKiByZXR1cm4gbmV3IG9mZnNldCAqLworCSpvZmZzZXQgPSBvOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGVlcHJvbSAmIGNhcGFiaWxpdGllcyBzdHJ1Y3RzCisgKi8KK2ludCBhdGg1a19lZXByb21faW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXVuc2lnbmVkIGludCBtb2RlLCBpOworCWludCByZXQ7CisJdTMyIG9mZnNldDsKKwl1MTYgdmFsOworCisJLyogSW5pdGlhbCBUWCB0aGVybWFsIGFkanVzdG1lbnQgdmFsdWVzICovCisJZWUtPmVlX3R4X2NsaXAgPSA0OworCWVlLT5lZV9wd2RfODQgPSBlZS0+ZWVfcHdkXzkwID0gMTsKKwllZS0+ZWVfZ2Fpbl9zZWxlY3QgPSAxOworCisJLyoKKwkgKiBSZWFkIHZhbHVlcyBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKKwkgKi8KKwlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NQUdJQywgZWVfbWFnaWMpOworCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX1BST1RFQ1QsIGVlX3Byb3RlY3QpOworCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX1JFR19ET01BSU4sIGVlX3JlZ2RvbWFpbik7CisJQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fVkVSU0lPTiwgZWVfdmVyc2lvbik7CisJQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fSERSLCBlZV9oZWFkZXIpOworCisJLyogUmV0dXJuIGlmIHdlIGhhdmUgYW4gb2xkIEVFUFJPTSAqLworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA8IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18wKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIG5vdHlldAorCS8qCisJICogVmFsaWRhdGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBFRVBST00gZGF0ZS4gVGhlcmUgYXJlIHNvbWUKKwkgKiBkZXZpY2VzIHdpdGggaW52YWxpZCBFRVBST01zLgorCSAqLworCWZvciAoY2tzdW0gPSAwLCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBBUjVLX0VFUFJPTV9JTkZPX01BWDsgb2Zmc2V0KyspIHsKKwkJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9JTkZPKG9mZnNldCksIHZhbCk7CisJCWNrc3VtIF49IHZhbDsKKwl9CisJaWYgKGNrc3VtICE9IEFSNUtfRUVQUk9NX0lORk9fQ0tTVU0pIHsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgIkludmFsaWQgRUVQUk9NIGNoZWNrc3VtIDB4JTA0eFxuIiwgY2tzdW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYKKworCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX0FOVF9HQUlOKGFoLT5haF9lZV92ZXJzaW9uKSwKKwkgICAgZWVfYW50X2dhaW4pOworCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKSB7CisJCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0MwLCBlZV9taXNjMCk7CisJCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0MxLCBlZV9taXNjMSk7CisJfQorCisJaWYgKGFoLT5haF9lZV92ZXJzaW9uIDwgQVI1S19FRVBST01fVkVSU0lPTl8zXzMpIHsKKwkJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9PQkRCMF8yR0haLCB2YWwpOworCQllZS0+ZWVfb2JbQVI1S19FRVBST01fTU9ERV8xMUJdWzBdID0gdmFsICYgMHg3OworCQllZS0+ZWVfZGJbQVI1S19FRVBST01fTU9ERV8xMUJdWzBdID0gKHZhbCA+PiAzKSAmIDB4NzsKKworCQlBUjVLX0VFUFJPTV9SRUFEKEFSNUtfRUVQUk9NX09CREIxXzJHSFosIHZhbCk7CisJCWVlLT5lZV9vYltBUjVLX0VFUFJPTV9NT0RFXzExR11bMF0gPSB2YWwgJiAweDc7CisJCWVlLT5lZV9kYltBUjVLX0VFUFJPTV9NT0RFXzExR11bMF0gPSAodmFsID4+IDMpICYgMHg3OworCX0KKworCS8qCisJICogR2V0IGNvbmZvcm1hbmNlIHRlc3QgbGltaXQgdmFsdWVzCisJICovCisJb2Zmc2V0ID0gQVI1S19FRVBST01fQ1RMKGFoLT5haF9lZV92ZXJzaW9uKTsKKwllZS0+ZWVfY3RscyA9IEFSNUtfRUVQUk9NX05fQ1RMUyhhaC0+YWhfZWVfdmVyc2lvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZWUtPmVlX2N0bHM7IGkrKykgeworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQllZS0+ZWVfY3RsW2ldID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWVlLT5lZV9jdGxbaSArIDFdID0gdmFsICYgMHhmZjsKKwl9CisKKwkvKgorCSAqIEdldCB2YWx1ZXMgZm9yIDgwMi4xMWEgKDVHSHopCisJICovCisJbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOworCisJZWUtPmVlX3R1cmJvX21heF9wb3dlclttb2RlXSA9CisJCQlBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShlZS0+ZWVfaGVhZGVyKTsKKworCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExQShhaC0+YWhfZWVfdmVyc2lvbik7CisKKwlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOworCWVlLT5lZV9vYlttb2RlXVszXQkJPSAodmFsID4+IDUpICYgMHg3OworCWVlLT5lZV9kYlttb2RlXVszXQkJPSAodmFsID4+IDIpICYgMHg3OworCWVlLT5lZV9vYlttb2RlXVsyXQkJPSAodmFsIDw8IDEpICYgMHg3OworCisJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwllZS0+ZWVfb2JbbW9kZV1bMl0JCXw9ICh2YWwgPj4gMTUpICYgMHgxOworCWVlLT5lZV9kYlttb2RlXVsyXQkJPSAodmFsID4+IDEyKSAmIDB4NzsKKwllZS0+ZWVfb2JbbW9kZV1bMV0JCT0gKHZhbCA+PiA5KSAmIDB4NzsKKwllZS0+ZWVfZGJbbW9kZV1bMV0JCT0gKHZhbCA+PiA2KSAmIDB4NzsKKwllZS0+ZWVfb2JbbW9kZV1bMF0JCT0gKHZhbCA+PiAzKSAmIDB4NzsKKwllZS0+ZWVfZGJbbW9kZV1bMF0JCT0gdmFsICYgMHg3OworCisJcmV0ID0gYXRoNWtfZWVwcm9tX3JlYWRfbW9kZXMoYWgsICZvZmZzZXQsIG1vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpIHsKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJZWUtPmVlX21hcmdpbl90eF9yeFttb2RlXSA9IHZhbCAmIDB4M2Y7CisJfQorCisJLyoKKwkgKiBHZXQgdmFsdWVzIGZvciA4MDIuMTFiICgyLjRHSHopCisJICovCisJbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFCOworCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExQihhaC0+YWhfZWVfdmVyc2lvbik7CisKKwlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOworCWVlLT5lZV9vYlttb2RlXVsxXQkJPSAodmFsID4+IDQpICYgMHg3OworCWVlLT5lZV9kYlttb2RlXVsxXQkJPSB2YWwgJiAweDc7CisKKwlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9tb2RlcyhhaCwgJm9mZnNldCwgbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkgeworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMF0gPQorCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKKwkJZWUtPmVlX2NhbF9waWVyW21vZGVdWzFdID0KKwkJCWF0aDVrX2VlcHJvbV9iaW4yZnJlcShhaCwgKHZhbCA+PiA4KSAmIDB4ZmYsIG1vZGUpOworCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCWVlLT5lZV9jYWxfcGllclttb2RlXVsyXSA9CisJCQlhdGg1a19lZXByb21fYmluMmZyZXEoYWgsIHZhbCAmIDB4ZmYsIG1vZGUpOworCX0KKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMSkKKwkJZWUtPmVlX21hcmdpbl90eF9yeFttb2RlXSA9ICh2YWwgPj4gOCkgJiAweDNmOworCisJLyoKKwkgKiBHZXQgdmFsdWVzIGZvciA4MDIuMTFnICgyLjRHSHopCisJICovCisJbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOworCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExRyhhaC0+YWhfZWVfdmVyc2lvbik7CisKKwlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOworCWVlLT5lZV9vYlttb2RlXVsxXQkJPSAodmFsID4+IDQpICYgMHg3OworCWVlLT5lZV9kYlttb2RlXVsxXQkJPSB2YWwgJiAweDc7CisKKwlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9tb2RlcyhhaCwgJm9mZnNldCwgbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkgeworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMF0gPQorCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKKwkJZWUtPmVlX2NhbF9waWVyW21vZGVdWzFdID0KKwkJCWF0aDVrX2VlcHJvbV9iaW4yZnJlcShhaCwgKHZhbCA+PiA4KSAmIDB4ZmYsIG1vZGUpOworCisJCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7CisJCWVlLT5lZV90dXJib19tYXhfcG93ZXJbbW9kZV0gPSB2YWwgJiAweDdmOworCQllZS0+ZWVfeHJfcG93ZXJbbW9kZV0gPSAodmFsID4+IDcpICYgMHgzZjsKKworCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOworCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMl0gPQorCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKKworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCisJCQllZS0+ZWVfbWFyZ2luX3R4X3J4W21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisKKwkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJZWUtPmVlX2lfY2FsW21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7CisJCWVlLT5lZV9xX2NhbFttb2RlXSA9ICh2YWwgPj4gMykgJiAweDFmOworCisJCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMikgeworCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKKwkJCWVlLT5lZV9jY2tfb2ZkbV9nYWluX2RlbHRhID0gdmFsICYgMHhmZjsKKwkJfQorCX0KKworCS8qCisJICogUmVhZCA1R0h6IEVFUFJPTSBjaGFubmVscworCSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIGVlcHJvbQorICovCitpbnQgYXRoNWtfZWVwcm9tX3JlYWRfbWFjKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4ICptYWMpCit7CisJdTggbWFjX2RbRVRIX0FMRU5dOworCXUzMiB0b3RhbCwgb2Zmc2V0OworCXUxNiBkYXRhOworCWludCBvY3RldCwgcmV0OworCisJbWVtc2V0KG1hYywgMCwgRVRIX0FMRU4pOworCW1lbXNldChtYWNfZCwgMCwgRVRIX0FMRU4pOworCisJcmV0ID0gYXRoNWtfaHdfZWVwcm9tX3JlYWQoYWgsIDB4MjAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChvZmZzZXQgPSAweDFmLCBvY3RldCA9IDAsIHRvdGFsID0gMDsgb2Zmc2V0ID49IDB4MWQ7IG9mZnNldC0tKSB7CisJCXJldCA9IGF0aDVrX2h3X2VlcHJvbV9yZWFkKGFoLCBvZmZzZXQsICZkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdG90YWwgKz0gZGF0YTsKKwkJbWFjX2Rbb2N0ZXQgKyAxXSA9IGRhdGEgJiAweGZmOworCQltYWNfZFtvY3RldF0gPSBkYXRhID4+IDg7CisJCW9jdGV0ICs9IDI7CisJfQorCisJbWVtY3B5KG1hYywgbWFjX2QsIEVUSF9BTEVOKTsKKworCWlmICghdG90YWwgfHwgdG90YWwgPT0gMyAqIDB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9lZXByb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY4ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZWVwcm9tLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBDb21tb24gYXI1eHh4IEVFUFJPTSBkYXRhIG9mZnNldHMgKHNldCB0aGVzZSBvbiBBUjVLX0VFUFJPTV9CQVNFKQorICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDCQkweDAwM2QJLyogRUVQUk9NIE1hZ2ljIG51bWJlciAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ19WQUxVRQkJMHg1YWE1CS8qIERlZmF1bHQgLSBmb3VuZCBvbiBFRVBST00gKi8KKyNkZWZpbmUgQVI1S19FRVBST01fTUFHSUNfNTIxMgkJMHgwMDAwMTQ1YyAvKiA1MjEyICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDXzUyMTEJCTB4MDAwMDE0NWIgLyogNTIxMSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ181MjEwCQkweDAwMDAxNDVhIC8qIDUyMTAgKi8KKworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUCQkweDAwM2YJLyogRUVQUk9NIHByb3RlY3Qgc3RhdHVzICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMF8zMQkweDAwMDEJLyogUmVhZCBwcm90ZWN0aW9uIGJpdCBmb3Igb2Zmc2V0cyAweDAgLSAweDFmICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMF8zMQkweDAwMDIJLyogV3JpdGUgcHJvdGVjdGlvbiBiaXQgZm9yIG9mZnNldHMgMHgwIC0gMHgxZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzMyXzYzCTB4MDAwNAkvKiAweDIwIC0gMHgzZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzMyXzYzCTB4MDAwOAorI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzY0XzEyNwkweDAwMTAJLyogMHg0MCAtIDB4N2YgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl82NF8xMjcJMHgwMDIwCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMTI4XzE5MQkweDAwNDAJLyogMHg4MCAtIDB4YmYgKHJlZ2RvbSkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8xMjhfMTkxCTB4MDA4MAorI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzE5Ml8yMDcJMHgwMTAwCS8qIDB4YzAgLSAweGNmICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMTkyXzIwNwkweDAyMDAKKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF8yMDhfMjIzCTB4MDQwMAkvKiAweGQwIC0gMHhkZiAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzIwOF8yMjMJMHgwODAwCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMjI0XzIzOQkweDEwMDAJLyogMHhlMCAtIDB4ZWYgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8yMjRfMjM5CTB4MjAwMAorI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzI0MF8yNTUJMHg0MDAwCS8qIDB4ZjAgLSAweGZmICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMjQwXzI1NQkweDgwMDAKKyNkZWZpbmUgQVI1S19FRVBST01fUkVHX0RPTUFJTgkJMHgwMGJmCS8qIEVFUFJPTSByZWdkb20gKi8KKyNkZWZpbmUgQVI1S19FRVBST01fSU5GT19CQVNFCQkweDAwYzAJLyogRUVQUk9NIGhlYWRlciAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9JTkZPX01BWAkJKDB4NDAwIC0gQVI1S19FRVBST01fSU5GT19CQVNFKQorI2RlZmluZSBBUjVLX0VFUFJPTV9JTkZPX0NLU1VNCQkweGZmZmYKKyNkZWZpbmUgQVI1S19FRVBST01fSU5GTyhfbikJCShBUjVLX0VFUFJPTV9JTkZPX0JBU0UgKyAoX24pKQorCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT04JCUFSNUtfRUVQUk9NX0lORk8oMSkJLyogRUVQUk9NIFZlcnNpb24gKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzAJCTB4MzAwMAkvKiBObyBpZGVhIHdoYXQncyBnb2luZyBvbiBiZWZvcmUgdGhpcyB2ZXJzaW9uICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fM18xCQkweDMwMDEJLyogb2IvZGIgdmFsdWVzIGZvciAyR2h6IChhcjUyMTFfcmZyZWdzKSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMgkJMHgzMDAyCS8qIGRpZmZlcmVudCBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24gKGVlcHJvbV9iaW4yZnJlcSkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzMJCTB4MzAwMwkvKiBvZmZzZXRzIGNoYW5nZWQsIGhhcyAzMiBDVExzIChzZWUgYmVsb3cpIGFuZCBlZV9mYWxzZV9kZXRlY3QgKGVlcHJvbV9yZWFkX21vZGVzKSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfNAkJMHgzMDA0CS8qIGhhcyBlZV9pX2dhaW4gZWVfY2NrX29mZG1fcG93ZXJfZGVsdGEgKGVlcHJvbV9yZWFkX21vZGVzKSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMAkJMHg0MDAwCS8qIGhhcyBlZV9taXNjKiwgZWVfY2FsX3BpZXIsIGVlX3R1cmJvX21heF9wb3dlciBhbmQgZWVfeHJfcG93ZXIgKGVlcHJvbV9pbml0KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMQkJMHg0MDAxCS8qIGhhcyBlZV9tYXJnaW5fdHhfcnggKGVlcHJvbV9pbml0KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMgkJMHg0MDAyCS8qIGhhcyBlZV9jY2tfb2ZkbV9nYWluX2RlbHRhIChlZXByb21faW5pdCkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzMJCTB4NDAwMworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNAkJMHg0MDA0CisjZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fNF81CQkweDQwMDUKKyNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzYJCTB4NDAwNgkvKiBoYXMgZWVfc2NhbGVkX2Nja19kZWx0YSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNwkJMHg0MDA3CisKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUEJCTAKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUIJCTEKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUcJCTIKKworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFIJCQlBUjVLX0VFUFJPTV9JTkZPKDIpCS8qIEhlYWRlciB0aGF0IGNvbnRhaW5zIHRoZSBkZXZpY2UgY2FwcyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfMTFBKF92KQkJKCgoX3YpID4+IEFSNUtfRUVQUk9NX01PREVfMTFBKSAmIDB4MSkKKyNkZWZpbmUgQVI1S19FRVBST01fSERSXzExQihfdikJCSgoKF92KSA+PiBBUjVLX0VFUFJPTV9NT0RFXzExQikgJiAweDEpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl8xMUcoX3YpCQkoKChfdikgPj4gQVI1S19FRVBST01fTU9ERV8xMUcpICYgMHgxKQorI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF8yR0haX0RJUyhfdikJKCgoX3YpID4+IDMpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciAyR2h6ICg/KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShfdikJKCgoX3YpID4+IDQpICYgMHg3ZikJLyogTWF4IHR1cmJvIHBvd2VyIGZvciBhL1hSIG1vZGUgKGVlcHJvbV9pbml0KSAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfREVWSUNFKF92KQkoKChfdikgPj4gMTEpICYgMHg3KQorI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RJUyhfdikJKCgoX3YpID4+IDE1KSAmIDB4MSkJLyogRGlzYWJsZSB0dXJibyBmb3IgNUdoeiAoPykgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fSERSX1JGS0lMTChfdikJKCgoX3YpID4+IDE0KSAmIDB4MSkJLyogRGV2aWNlIGhhcyBSRktpbGwgc3VwcG9ydCAqLworCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTAkweDAwMDAwMDFjCisjZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTF9TCTIKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZCTB4MDAwMDAwMDIKKyNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZX1MJMQorCisvKiBOZXdlciBFRVBST01zIGFyZSB1c2luZyBhIGRpZmZlcmVudCBvZmZzZXQgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fT0ZGKF92LCBfdjNfMCwgX3YzXzMpIFwKKwkoKChfdikgPj0gQVI1S19FRVBST01fVkVSU0lPTl8zXzMpID8gX3YzXzMgOiBfdjNfMCkKKworI2RlZmluZSBBUjVLX0VFUFJPTV9BTlRfR0FJTihfdikJQVI1S19FRVBST01fT0ZGKF92LCAweDAwYzQsIDB4MDBjMykKKyNkZWZpbmUgQVI1S19FRVBST01fQU5UX0dBSU5fNUdIWihfdikJKChpbnQ4X3QpKCgoX3YpID4+IDgpICYgMHhmZikpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0FOVF9HQUlOXzJHSFooX3YpCSgoaW50OF90KSgoX3YpICYgMHhmZikpCisKKy8qIGNhbGlicmF0aW9uIHNldHRpbmdzICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX01PREVTXzExQShfdikJQVI1S19FRVBST01fT0ZGKF92LCAweDAwYzUsIDB4MDBkNCkKKyNkZWZpbmUgQVI1S19FRVBST01fTU9ERVNfMTFCKF92KQlBUjVLX0VFUFJPTV9PRkYoX3YsIDB4MDBkMCwgMHgwMGYyKQorI2RlZmluZSBBUjVLX0VFUFJPTV9NT0RFU18xMUcoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgMHgwMGRhLCAweDAxMGQpCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NUTChfdikJCUFSNUtfRUVQUk9NX09GRihfdiwgMHgwMGU0LCAweDAxMjgpCS8qIENvbmZvcm1hbmNlIHRlc3QgbGltaXRzICovCisKKy8qIFszLjEgLSAzLjNdICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX09CREIwXzJHSFoJCTB4MDBlYworI2RlZmluZSBBUjVLX0VFUFJPTV9PQkRCMV8yR0haCQkweDAwZWQKKworLyogTWlzYyB2YWx1ZXMgYXZhaWxhYmxlIHNpbmNlIEVFUFJPTSA0LjAgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fTUlTQzAJCTB4MDBjNAorI2RlZmluZSBBUjVLX0VFUFJPTV9FQVJTVEFSVChfdikJKChfdikgJiAweGZmZikKKyNkZWZpbmUgQVI1S19FRVBST01fRUVNQVAoX3YpCQkoKChfdikgPj4gMTQpICYgMHgzKQorI2RlZmluZSBBUjVLX0VFUFJPTV9NSVNDMQkJMHgwMGM1CisjZGVmaW5lIEFSNUtfRUVQUk9NX1RBUkdFVF9QV1JTVEFSVChfdikJKChfdikgJiAweGZmZikKKyNkZWZpbmUgQVI1S19FRVBST01fSEFTMzJLSFpDUllTVEFMKF92KQkoKChfdikgPj4gMTQpICYgMHgxKQorCisKKy8qIFNvbWUgRUVQUk9NIGRlZmluZXMgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fRUVQX1NDQUxFCQkxMDAKKyNkZWZpbmUgQVI1S19FRVBST01fRUVQX0RFTFRBCQkxMAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX01PREVTCQkzCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fNUdIWl9DSEFOCQkxMAorI2RlZmluZSBBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTgkJMworI2RlZmluZSBBUjVLX0VFUFJPTV9NQVhfQ0hBTgkJMTAKKyNkZWZpbmUgQVI1S19FRVBST01fTl9QQ0RBQwkJMTEKKyNkZWZpbmUgQVI1S19FRVBST01fTl9URVNUX0ZSRVEJCTgKKyNkZWZpbmUgQVI1S19FRVBST01fTl9FREdFUwkJOAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX0lOVEVSQ0VQVFMJMTEKKyNkZWZpbmUgQVI1S19FRVBST01fRlJFUV9NKF92KQkJQVI1S19FRVBST01fT0ZGKF92LCAweDdmLCAweGZmKQorI2RlZmluZSBBUjVLX0VFUFJPTV9QQ0RBQ19NCQkweDNmCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NUQVJUCQkxCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NUT1AJCTYzCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NURVAJCTEKKyNkZWZpbmUgQVI1S19FRVBST01fTk9OX0VER0VfTQkJMHg0MAorI2RlZmluZSBBUjVLX0VFUFJPTV9DSEFOTkVMX1BPV0VSCTgKKyNkZWZpbmUgQVI1S19FRVBST01fTl9PQkRCCQk0CisjZGVmaW5lIEFSNUtfRUVQUk9NX09CREJfRElTCQkweGZmZmYKKyNkZWZpbmUgQVI1S19FRVBST01fQ0hBTk5FTF9ESVMJCTB4ZmYKKyNkZWZpbmUgQVI1S19FRVBST01fU0NBTEVfT0NfREVMVEEoX3gpCSgoKF94KSAqIDIpIC8gMTApCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fQ1RMUyhfdikJCUFSNUtfRUVQUk9NX09GRihfdiwgMTYsIDMyKQorI2RlZmluZSBBUjVLX0VFUFJPTV9NQVhfQ1RMUwkJMzIKKyNkZWZpbmUgQVI1S19FRVBST01fTl9YUERfUEVSX0NIQU5ORUwJNAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX1hQRDBfUE9JTlRTCTQKKyNkZWZpbmUgQVI1S19FRVBST01fTl9YUEQzX1BPSU5UUwkzCisjZGVmaW5lIEFSNUtfRUVQUk9NX05fSU5URVJDRVBUXzEwXzJHSFoJMzUKKyNkZWZpbmUgQVI1S19FRVBST01fTl9JTlRFUkNFUFRfMTBfNUdIWgk1NQorI2RlZmluZSBBUjVLX0VFUFJPTV9QT1dFUl9NCQkweDNmCisjZGVmaW5lIEFSNUtfRUVQUk9NX1BPV0VSX01JTgkJMAorI2RlZmluZSBBUjVLX0VFUFJPTV9QT1dFUl9NQVgJCTMxNTAKKyNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfU1RFUAkJNTAKKyNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRQk2NAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX1BPV0VSX0xPQ18xMUIJNAorI2RlZmluZSBBUjVLX0VFUFJPTV9OX1BPV0VSX0xPQ18xMUcJNgorI2RlZmluZSBBUjVLX0VFUFJPTV9JX0dBSU4JCTEwCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NDS19PRkRNX0RFTFRBCTE1CisjZGVmaW5lIEFSNUtfRUVQUk9NX05fSVFfQ0FMCQkyCisKKyNkZWZpbmUgQVI1S19FRVBST01fUkVBRChfbywgX3YpIGRvIHsJCQlcCisJcmV0ID0gYXRoNWtfaHdfZWVwcm9tX3JlYWQoYWgsIChfbyksICYoX3YpKTsJXAorCWlmIChyZXQpCQkJCQlcCisJCXJldHVybiByZXQ7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQVI1S19FRVBST01fUkVBRF9IRFIoX28sIF92KQkJCQkJXAorCUFSNUtfRUVQUk9NX1JFQUQoX28sIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5fdik7CVwKKworLyogU3RydWN0IHRvIGhvbGQgRUVQUk9NIGNhbGlicmF0aW9uIGRhdGEgKi8KK3N0cnVjdCBhdGg1a19lZXByb21faW5mbyB7CisJdTE2CWVlX21hZ2ljOworCXUxNgllZV9wcm90ZWN0OworCXUxNgllZV9yZWdkb21haW47CisJdTE2CWVlX3ZlcnNpb247CisJdTE2CWVlX2hlYWRlcjsKKwl1MTYJZWVfYW50X2dhaW47CisJdTE2CWVlX21pc2MwOworCXUxNgllZV9taXNjMTsKKwl1MTYJZWVfY2NrX29mZG1fZ2Fpbl9kZWx0YTsKKwl1MTYJZWVfY2NrX29mZG1fcG93ZXJfZGVsdGE7CisJdTE2CWVlX3NjYWxlZF9jY2tfZGVsdGE7CisKKwkvKiBVc2VkIGZvciB0eCB0aGVybWFsIGFkanVzdG1lbnQgKGVlcHJvbV9pbml0LCByZnJlZ3MpICovCisJdTE2CWVlX3R4X2NsaXA7CisJdTE2CWVlX3B3ZF84NDsKKwl1MTYJZWVfcHdkXzkwOworCXUxNgllZV9nYWluX3NlbGVjdDsKKworCS8qIFJGIENhbGlicmF0aW9uIHNldHRpbmdzIChyZXNldCwgcmZyZWdzKSAqLworCXUxNgllZV9pX2NhbFtBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfcV9jYWxbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX2ZpeGVkX2JpYXNbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3R1cmJvX21heF9wb3dlcltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfeHJfcG93ZXJbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3N3aXRjaF9zZXR0bGluZ1tBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfYW50X3R4X3J4W0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV9hbnRfY29udHJvbFtBUjVLX0VFUFJPTV9OX01PREVTXVtBUjVLX0VFUFJPTV9OX1BDREFDXTsKKwl1MTYJZWVfb2JbQVI1S19FRVBST01fTl9NT0RFU11bQVI1S19FRVBST01fTl9PQkRCXTsKKwl1MTYJZWVfZGJbQVI1S19FRVBST01fTl9NT0RFU11bQVI1S19FRVBST01fTl9PQkRCXTsKKwl1MTYJZWVfdHhfZW5kMnhsbmFfZW5hYmxlW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV90eF9lbmQyeHBhX2Rpc2FibGVbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3R4X2ZybTJ4cGFfZW5hYmxlW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV90aHJfNjJbQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX3hsbmFfZ2FpbltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfeHBkW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXUxNgllZV94X2dhaW5bQVI1S19FRVBST01fTl9NT0RFU107CisJdTE2CWVlX2lfZ2FpbltBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfbWFyZ2luX3R4X3J4W0FSNUtfRUVQUk9NX05fTU9ERVNdOworCisJLyogVW51c2VkICovCisJdTE2CWVlX2ZhbHNlX2RldGVjdFtBUjVLX0VFUFJPTV9OX01PREVTXTsKKwl1MTYJZWVfY2FsX3BpZXJbQVI1S19FRVBST01fTl9NT0RFU11bQVI1S19FRVBST01fTl8yR0haX0NIQU5dOworCXUxNgllZV9jaGFubmVsW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX01BWF9DSEFOXTsgLyplbXB0eSovCisKKwkvKiBDb25mb3JtYW5jZSB0ZXN0IGxpbWl0cyAoVW51c2VkKSAqLworCXUxNgllZV9jdGxzOworCXUxNgllZV9jdGxbQVI1S19FRVBST01fTUFYX0NUTFNdOworCisJLyogTm9pc2UgRmxvb3IgQ2FsaWJyYXRpb24gc2V0dGluZ3MgKi8KKwlzMTYJZWVfbm9pc2VfZmxvb3JfdGhyW0FSNUtfRUVQUk9NX05fTU9ERVNdOworCXM4CWVlX2FkY19kZXNpcmVkX3NpemVbQVI1S19FRVBST01fTl9NT0RFU107CisJczgJZWVfcGdhX2Rlc2lyZWRfc2l6ZVtBUjVLX0VFUFJPTV9OX01PREVTXTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9ncGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3MjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2dwaW8uYwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKipcCisgIEdQSU8gRnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJiYXNlLmgiCisKKy8qCisgKiBTZXQgbGVkIHN0YXRlCisgKi8KK3ZvaWQgYXRoNWtfaHdfc2V0X2xlZHN0YXRlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwl1MzIgbGVkOworCS8qNTIxMCBoYXMgZGlmZmVyZW50IGxlZCBtb2RlIGhhbmRsaW5nKi8KKwl1MzIgbGVkXzUyMTA7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJLypSZXNldCBsZWQgc3RhdHVzKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCisJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsCisJCQlBUjVLX1BDSUNGR19MRURNT0RFIHwgIEFSNUtfUENJQ0ZHX0xFRCk7CisJZWxzZQorCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBBUjVLX1BDSUNGR19MRUQpOworCisJLyoKKwkgKiBTb21lIGJsaW5raW5nIHZhbHVlcywgZGVmaW5lIGF0IHlvdXIgd2lzaAorCSAqLworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEFSNUtfTEVEX1NDQU46CisJY2FzZSBBUjVLX0xFRF9BVVRIOgorCQlsZWQgPSBBUjVLX1BDSUNGR19MRURNT0RFX1BST1AgfCBBUjVLX1BDSUNGR19MRURfUEVORDsKKwkJbGVkXzUyMTAgPSBBUjVLX1BDSUNGR19MRURfUEVORCB8IEFSNUtfUENJQ0ZHX0xFRF9CQ1RMOworCQlicmVhazsKKworCWNhc2UgQVI1S19MRURfSU5JVDoKKwkJbGVkID0gQVI1S19QQ0lDRkdfTEVETU9ERV9QUk9QIHwgQVI1S19QQ0lDRkdfTEVEX05PTkU7CisJCWxlZF81MjEwID0gQVI1S19QQ0lDRkdfTEVEX1BFTkQ7CisJCWJyZWFrOworCisJY2FzZSBBUjVLX0xFRF9BU1NPQzoKKwljYXNlIEFSNUtfTEVEX1JVTjoKKwkJbGVkID0gQVI1S19QQ0lDRkdfTEVETU9ERV9QUk9QIHwgQVI1S19QQ0lDRkdfTEVEX0FTU09DOworCQlsZWRfNTIxMCA9IEFSNUtfUENJQ0ZHX0xFRF9BU1NPQzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlsZWQgPSBBUjVLX1BDSUNGR19MRURNT0RFX1BST00gfCBBUjVLX1BDSUNGR19MRURfTk9ORTsKKwkJbGVkXzUyMTAgPSBBUjVLX1BDSUNGR19MRURfUEVORDsKKwkJYnJlYWs7CisJfQorCisJLypXcml0ZSBuZXcgc3RhdHVzIHRvIHRoZSByZWdpc3RlciovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKQorCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsIGxlZCk7CisJZWxzZQorCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsIGxlZF81MjEwKTsKK30KKworLyoKKyAqIFNldCBHUElPIGlucHV0cworICovCitpbnQgYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlpZiAoZ3BpbyA+IEFSNUtfTlVNX0dQSU8pCisJCXJldHVybiAtRUlOVkFMOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0NSKSAmIH5BUjVLX0dQSU9DUl9PVVQoZ3BpbykpCisJCXwgQVI1S19HUElPQ1JfSU4oZ3BpbyksIEFSNUtfR1BJT0NSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IEdQSU8gb3V0cHV0cworICovCitpbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKGdwaW8gPiBBUjVLX05VTV9HUElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJiB+QVI1S19HUElPQ1JfT1VUKGdwaW8pKQorCQl8IEFSNUtfR1BJT0NSX09VVChncGlvKSwgQVI1S19HUElPQ1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgR1BJTyBzdGF0ZQorICovCit1MzIgYXRoNWtfaHdfZ2V0X2dwaW8oc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlpZiAoZ3BpbyA+IEFSNUtfTlVNX0dQSU8pCisJCXJldHVybiAweGZmZmZmZmZmOworCisJLyogR1BJTyBpbnB1dCBtYWdpYyAqLworCXJldHVybiAoKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9ESSkgJiBBUjVLX0dQSU9ESV9NKSA+PiBncGlvKSAmCisJCTB4MTsKK30KKworLyoKKyAqIFNldCBHUElPIHN0YXRlCisgKi8KK2ludCBhdGg1a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCkKK3sKKwl1MzIgZGF0YTsKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJaWYgKGdwaW8gPiBBUjVLX05VTV9HUElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEdQSU8gb3V0cHV0IG1hZ2ljICovCisJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9ETyk7CisKKwlkYXRhICY9IH4oMSA8PCBncGlvKTsKKwlkYXRhIHw9ICh2YWwgJiAxKSA8PCBncGlvOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX0dQSU9ETyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIEdQSU8gaW50ZXJydXB0IChSRktpbGwgc3dpdGNoKQorICovCit2b2lkIGF0aDVrX2h3X3NldF9ncGlvX2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGdwaW8sCisJCXUzMiBpbnRlcnJ1cHRfbGV2ZWwpCit7CisJdTMyIGRhdGE7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCWlmIChncGlvID4gQVI1S19OVU1fR1BJTykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXQgdGhlIEdQSU8gaW50ZXJydXB0CisJICovCisJZGF0YSA9IChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPQ1IpICYKKwkJfihBUjVLX0dQSU9DUl9JTlRfU0VMKGdwaW8pIHwgQVI1S19HUElPQ1JfSU5UX1NFTEggfAorCQlBUjVLX0dQSU9DUl9JTlRfRU5BIHwgQVI1S19HUElPQ1JfT1VUKGdwaW8pKSkgfAorCQkoQVI1S19HUElPQ1JfSU5UX1NFTChncGlvKSB8IEFSNUtfR1BJT0NSX0lOVF9FTkEpOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRlcnJ1cHRfbGV2ZWwgPyBkYXRhIDoKKwkJKGRhdGEgfCBBUjVLX0dQSU9DUl9JTlRfU0VMSCksIEFSNUtfR1BJT0NSKTsKKworCWFoLT5haF9pbXIgfD0gQVI1S19JTVJfR1BJTzsKKworCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KKwlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSU1SLCBBUjVLX0lNUl9HUElPKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2h3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMWE1YjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvaHcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBNYXR0aGV3IFcuIFMuIEJlbGwgIDxtZW50b3JAbWFkd2lmaS5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgTHVpcyBSb2RyaWd1ZXogPG1jZ3JvZkB3aW5sYWIucnV0Z2Vycy5lZHU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICoKLSAqLwotCi0vKgotICogSFcgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIEF0aGVyb3MgV2lyZWxlc3MgTEFOIGRldmljZXMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlICJyZWcuaCIKLSNpbmNsdWRlICJiYXNlLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotLyogUmF0ZSB0YWJsZXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSBhdGg1a19ydF8xMWEgPSBBUjVLX1JBVEVTXzExQTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSBhdGg1a19ydF8xMWIgPSBBUjVLX1JBVEVTXzExQjsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSBhdGg1a19ydF8xMWcgPSBBUjVLX1JBVEVTXzExRzsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSBhdGg1a19ydF90dXJibyA9IEFSNUtfUkFURVNfVFVSQk87Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX3JhdGVfdGFibGUgYXRoNWtfcnRfeHIgPSBBUjVLX1JBVEVTX1hSOwotCi0vKiBQcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X25pY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKiwgdTMyKTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfbmljX3dha2V1cChzdHJ1Y3QgYXRoNWtfaHcgKiwgaW50LCBib29sKTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKLQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgZW51bSBhdGg1a19wa3RfdHlwZSwgdW5zaWduZWQgaW50LAotCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0dXBfeHJfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKLQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQl1bnNpZ25lZCBpbnQpOwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKLQkJCQkJIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgKik7Ci1zdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzJ3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICosIHN0cnVjdCBhdGg1a19kZXNjICosCi0JdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGVudW0gYXRoNWtfcGt0X3R5cGUsIHVuc2lnbmVkIGludCwKLQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgaW50IGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqLAotCQkJCQkgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqKTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY181MjEyX3J4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKLQkJCQkJc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqKTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKiwgc3RydWN0IGF0aDVrX2Rlc2MgKiwKLQkJCQkJc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqKTsKLXN0YXRpYyBpbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYXRoNWtfaHcgKik7Ci0KLXN0YXRpYyBpbnQgYXRoNWtfZWVwcm9tX2luaXQoc3RydWN0IGF0aDVrX2h3ICopOwotc3RhdGljIGludCBhdGg1a19lZXByb21fcmVhZF9tYWMoc3RydWN0IGF0aDVrX2h3ICosIHU4ICopOwotCi1zdGF0aWMgaW50IGF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICosIHU4ICosIHUxNik7Ci1zdGF0aWMgaW50IGF0aDVrX2h3X2Rpc2FibGVfcHNwb2xsKHN0cnVjdCBhdGg1a19odyAqKTsKLQotLyoKLSAqIEVuYWJsZSB0byBvdmVyd3JpdGUgdGhlIGNvdW50cnkgY29kZSAodXNlICIwMCIgZm9yIGRlYnVnKQotICovCi0jaWYgMAotI2RlZmluZSBDT1VOVFJZQ09ERSAiMDAiCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKipcCi0gIEdlbmVyYWwgRnVuY3Rpb25zCi1cKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEZ1bmN0aW9ucyB1c2VkIGludGVybmFseQotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0aDVrX2h3X2h0b2Nsb2NrKHVuc2lnbmVkIGludCB1c2VjLCBib29sIHR1cmJvKQotewotCXJldHVybiB0dXJibyA/ICh1c2VjICogODApIDogKHVzZWMgKiA0MCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0aDVrX2h3X2Nsb2NrdG9oKHVuc2lnbmVkIGludCBjbG9jaywgYm9vbCB0dXJibykKLXsKLQlyZXR1cm4gdHVyYm8gPyAoY2xvY2sgLyA4MCkgOiAoY2xvY2sgLyA0MCk7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiBhIHJlZ2lzdGVyIHdyaXRlIGhhcyBiZWVuIGNvbXBsZXRlZAotICovCi1pbnQgYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcmVnLCB1MzIgZmxhZywgdTMyIHZhbCwKLQkJYm9vbCBpc19zZXQpCi17Ci0JaW50IGk7Ci0JdTMyIGRhdGE7Ci0KLQlmb3IgKGkgPSBBUjVLX1RVTkVfUkVHSVNURVJfVElNRU9VVDsgaSA+IDA7IGktLSkgewotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIHJlZyk7Ci0JCWlmIChpc19zZXQgJiYgKGRhdGEgJiBmbGFnKSkKLQkJCWJyZWFrOwotCQllbHNlIGlmICgoZGF0YSAmIGZsYWcpID09IHZhbCkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTUpOwotCX0KLQotCXJldHVybiAoaSA8PSAwKSA/IC1FQUdBSU4gOiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JQXR0YWNoL0RldGFjaCBGdW5jdGlvbnMKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBQb3dlciBPbiBTZWxmIFRlc3QgaGVscGVyIGZ1bmN0aW9uCi0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcG9zdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCi0JaW50IGksIGM7Ci0JdTE2IGN1cl9yZWc7Ci0JdTE2IHJlZ3NbMl0gPSB7QVI1S19TVEFfSUQwLCBBUjVLX1BIWSg4KX07Ci0JdTMyIHZhcl9wYXR0ZXJuOwotCXUzMiBzdGF0aWNfcGF0dGVybls0XSA9IHsKLQkJMHg1NTU1NTU1NSwJMHhhYWFhYWFhYSwKLQkJMHg2NjY2NjY2NiwJMHg5OTk5OTk5OQotCX07Ci0JdTMyIGluaXRfdmFsOwotCXUzMiBjdXJfdmFsOwotCi0JZm9yIChjID0gMDsgYyA8IDI7IGMrKykgewotCi0JCWN1cl9yZWcgPSByZWdzW2NdOwotCi0JCS8qIFNhdmUgcHJldmlvdXMgdmFsdWUgKi8KLQkJaW5pdF92YWwgPSBhdGg1a19od19yZWdfcmVhZChhaCwgY3VyX3JlZyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCQl2YXJfcGF0dGVybiA9IGkgPDwgMTYgfCBpOwotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YXJfcGF0dGVybiwgY3VyX3JlZyk7Ci0JCQljdXJfdmFsID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGN1cl9yZWcpOwotCi0JCQlpZiAoY3VyX3ZhbCAhPSB2YXJfcGF0dGVybikgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJQT1NUIEZhaWxlZCAhISFcbiIpOwotCQkJCXJldHVybiAtRUFHQUlOOwotCQkJfQotCi0JCQkvKiBGb3VuZCBvbiBuZGlzd3JhcHBlciBkdW1wcyAqLwotCQkJdmFyX3BhdHRlcm4gPSAweDAwMzkwODBmOwotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YXJfcGF0dGVybiwgY3VyX3JlZyk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQl2YXJfcGF0dGVybiA9IHN0YXRpY19wYXR0ZXJuW2ldOwotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YXJfcGF0dGVybiwgY3VyX3JlZyk7Ci0JCQljdXJfdmFsID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIGN1cl9yZWcpOwotCi0JCQlpZiAoY3VyX3ZhbCAhPSB2YXJfcGF0dGVybikgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJQT1NUIEZhaWxlZCAhISFcbiIpOwotCQkJCXJldHVybiAtRUFHQUlOOwotCQkJfQotCi0JCQkvKiBGb3VuZCBvbiBuZGlzd3JhcHBlciBkdW1wcyAqLwotCQkJdmFyX3BhdHRlcm4gPSAweDAwM2IwODBmOwotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YXJfcGF0dGVybiwgY3VyX3JlZyk7Ci0JCX0KLQotCQkvKiBSZXN0b3JlIHByZXZpb3VzIHZhbHVlICovCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgaW5pdF92YWwsIGN1cl9yZWcpOwotCi0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGFuZCBpbml0aWFsaXplIHRoZSBuZWVkZWQgc3RydWN0cwotICovCi1zdHJ1Y3QgYXRoNWtfaHcgKmF0aDVrX2h3X2F0dGFjaChzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjLCB1OCBtYWNfdmVyc2lvbikKLXsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gc2MtPnBkZXY7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQlpbnQgcmV0OwotCXUzMiBzcmV2OwotCi0JLypJZiB3ZSBwYXNzZWQgdGhlIHRlc3QgbWFsbG9jIGEgYXRoNWtfaHcgc3RydWN0Ki8KLQlhaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGg1a19odyksIEdGUF9LRVJORUwpOwotCWlmIChhaCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCUFUSDVLX0VSUihzYywgIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlhaC0+YWhfc2MgPSBzYzsKLQlhaC0+YWhfaW9iYXNlID0gc2MtPmlvYmFzZTsKLQotCS8qCi0JICogSFcgaW5mb3JtYXRpb24KLQkgKi8KLQotCWFoLT5haF9vcF9tb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfU1RBOwotCWFoLT5haF9yYWRhci5yX2VuYWJsZWQgPSBBUjVLX1RVTkVfUkFEQVJfQUxFUlQ7Ci0JYWgtPmFoX3R1cmJvID0gZmFsc2U7Ci0JYWgtPmFoX3R4cG93ZXIudHhwX3RwYyA9IEFSNUtfVFVORV9UUENfVFhQT1dFUjsKLQlhaC0+YWhfaW1yID0gMDsKLQlhaC0+YWhfYXRpbV93aW5kb3cgPSAwOwotCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlM7Ci0JYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTjsKLQlhaC0+YWhfbGltaXRfdHhfcmV0cmllcyA9IEFSNUtfSU5JVF9UWF9SRVRSWTsKLQlhaC0+YWhfc29mdHdhcmVfcmV0cnkgPSBmYWxzZTsKLQlhaC0+YWhfYW50X2RpdmVyc2l0eSA9IEFSNUtfVFVORV9BTlRfRElWRVJTSVRZOwotCi0JLyoKLQkgKiBTZXQgdGhlIG1hYyByZXZpc2lvbiBiYXNlZCBvbiB0aGUgcGNpIGlkCi0JICovCi0JYWgtPmFoX3ZlcnNpb24gPSBtYWNfdmVyc2lvbjsKLQotCS8qRmlsbCB0aGUgYXRoNWtfaHcgc3RydWN0IHdpdGggdGhlIG5lZWRlZCBmdW5jdGlvbnMqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKLQkJYWgtPmFoX21hZ2ljID0gQVI1S19FRVBST01fTUFHSUNfNTIxMjsKLQllbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkKLQkJYWgtPmFoX21hZ2ljID0gQVI1S19FRVBST01fTUFHSUNfNTIxMTsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlhaC0+YWhfc2V0dXBfdHhfZGVzYyA9IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2M7Ci0JCWFoLT5haF9zZXR1cF94dHhfZGVzYyA9IGF0aDVrX2h3X3NldHVwX3hyX3R4X2Rlc2M7Ci0JCWFoLT5haF9wcm9jX3R4X2Rlc2MgPSBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1czsKLQl9IGVsc2UgewotCQlhaC0+YWhfc2V0dXBfdHhfZGVzYyA9IGF0aDVrX2h3X3NldHVwXzJ3b3JkX3R4X2Rlc2M7Ci0JCWFoLT5haF9zZXR1cF94dHhfZGVzYyA9IGF0aDVrX2h3X3NldHVwX3hyX3R4X2Rlc2M7Ci0JCWFoLT5haF9wcm9jX3R4X2Rlc2MgPSBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1czsKLQl9Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCi0JCWFoLT5haF9wcm9jX3J4X2Rlc2MgPSBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzOwotCWVsc2UgaWYgKGFoLT5haF92ZXJzaW9uIDw9IEFSNUtfQVI1MjExKQotCQlhaC0+YWhfcHJvY19yeF9kZXNjID0gYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1czsKLQotCS8qIEJyaW5nIGRldmljZSBvdXQgb2Ygc2xlZXAgYW5kIHJlc2V0IGl0J3MgdW5pdHMgKi8KLQlyZXQgPSBhdGg1a19od19uaWNfd2FrZXVwKGFoLCBBUjVLX0lOSVRfTU9ERSwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfZnJlZTsKLQotCS8qIEdldCBNQUMsIFBIWSBhbmQgUkFESU8gcmV2aXNpb25zICovCi0Jc3JldiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NSRVYpOwotCWFoLT5haF9tYWNfc3JldiA9IHNyZXY7Ci0JYWgtPmFoX21hY192ZXJzaW9uID0gQVI1S19SRUdfTVMoc3JldiwgQVI1S19TUkVWX1ZFUik7Ci0JYWgtPmFoX21hY19yZXZpc2lvbiA9IEFSNUtfUkVHX01TKHNyZXYsIEFSNUtfU1JFVl9SRVYpOwotCWFoLT5haF9waHlfcmV2aXNpb24gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQ0hJUF9JRCkgJgotCQkJMHhmZmZmZmZmZjsKLQlhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA9IGF0aDVrX2h3X3JhZGlvX3JldmlzaW9uKGFoLAotCQkJQ0hBTk5FTF81R0haKTsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkKLQkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPSAwOwotCWVsc2UKLQkJYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPSBhdGg1a19od19yYWRpb19yZXZpc2lvbihhaCwKLQkJCQlDSEFOTkVMXzJHSFopOwotCi0JLyogUmV0dXJuIG9uIHVuc3Vwb3J0ZWQgY2hpcHMgKHVuc3VwcG9ydGVkIGVlcHJvbSBldGMpICovCi0JaWYgKChzcmV2ID49IEFSNUtfU1JFVl9WRVJfQVI1NDE2KSAmJgotCShzcmV2IDwgQVI1S19TUkVWX1ZFUl9BUjI0MjUpKSB7Ci0JCUFUSDVLX0VSUihzYywgIkRldmljZSBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlOwotCX0gZWxzZSBpZiAoc3JldiA9PSBBUjVLX1NSRVZfVkVSX0FSMjQyNSkgewotCQlBVEg1S19XQVJOKHNjLCAiU3VwcG9ydCBmb3IgUkYyNDI1IGlzIHVuZGVyIGRldmVsb3BtZW50LlxuIik7Ci0JfQotCi0JLyogSWRlbnRpZnkgc2luZ2xlIGNoaXAgc29sdXRpb25zICovCi0JaWYgKCgoc3JldiA8PSBBUjVLX1NSRVZfVkVSX0FSNTQxNCkgJiYKLQkoc3JldiA+PSBBUjVLX1NSRVZfVkVSX0FSMjQxMykpIHx8Ci0JKHNyZXYgPT0gQVI1S19TUkVWX1ZFUl9BUjI0MjUpKSB7Ci0JCWFoLT5haF9zaW5nbGVfY2hpcCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJYWgtPmFoX3NpbmdsZV9jaGlwID0gZmFsc2U7Ci0JfQotCi0JLyogU2luZ2xlIGNoaXAgcmFkaW8gKi8KLQlpZiAoYWgtPmFoX3JhZGlvXzJnaHpfcmV2aXNpb24gPT0gYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24pCi0JCWFoLT5haF9yYWRpb18yZ2h6X3JldmlzaW9uID0gMDsKLQotCS8qIElkZW50aWZ5IHRoZSByYWRpbyBjaGlwKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjUxMTA7Ci0JLyoKLQkgKiBSZWdpc3RlciByZXR1cm5zIDB4MC8weDA0IGZvciByYWRpbyByZXZpc2lvbgotCSAqIHNvIGF0aDVrX2h3X3JhZGlvX3JldmlzaW9uIGRvZXNuJ3QgcGFyc2UgdGhlIHZhbHVlCi0JICogY29ycmVjdGx5LiBGb3Igbm93IHdlIGFyZSBiYXNlZCBvbiBtYWMncyBzcmV2IHRvCi0JICogaWRlbnRpZnkgUkYyNDI1IHJhZGlvLgotCSAqLwotCX0gZWxzZSBpZiAoc3JldiA9PSBBUjVLX1NSRVZfVkVSX0FSMjQyNSkgewotCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGMjQyNTsKLQkJYWgtPmFoX3BoeV9zcGVuZGluZyA9IEFSNUtfUEhZX1NQRU5ESU5HX1JGMjQyNTsKLQl9IGVsc2UgaWYgKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uIDwgQVI1S19TUkVWX1JBRF81MTEyKSB7Ci0JCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1MTExOwotCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkY1MTExOwotCX0gZWxzZSBpZiAoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPCBBUjVLX1NSRVZfUkFEX1NDMCkgewotCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTExMjsKLQkJYWgtPmFoX3BoeV9zcGVuZGluZyA9IEFSNUtfUEhZX1NQRU5ESU5HX1JGNTExMjsKLQl9IGVsc2UgaWYgKGFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uIDwgQVI1S19TUkVWX1JBRF9TQzEpIHsKLQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MTM7Ci0JCWFoLT5haF9waHlfc3BlbmRpbmcgPSBBUjVLX1BIWV9TUEVORElOR19SRjI0MTM7Ci0JfSBlbHNlIGlmIChhaC0+YWhfcmFkaW9fNWdoel9yZXZpc2lvbiA8IEFSNUtfU1JFVl9SQURfU0MyKSB7Ci0JCWFoLT5haF9yYWRpbyA9IEFSNUtfUkY1NDEzOwotCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkY1NDEzOwotCX0gZWxzZSBpZiAoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPCBBUjVLX1NSRVZfUkFEXzUxMzMpIHsKLQkJLyogQVI1NDI0ICovCi0JCWlmIChzcmV2ID49IEFSNUtfU1JFVl9WRVJfQVI1NDI0KSB7Ci0JCQlhaC0+YWhfcmFkaW8gPSBBUjVLX1JGNTQxMzsKLQkJCWFoLT5haF9waHlfc3BlbmRpbmcgPSBBUjVLX1BIWV9TUEVORElOR19SRjU0MTM7Ci0JCS8qIEFSMjQyNCAqLwotCQl9IGVsc2UgewotCQkJYWgtPmFoX3JhZGlvID0gQVI1S19SRjI0MTM7IC8qIEZvciB0ZXN0aW5nICovCi0JCQlhaC0+YWhfcGh5X3NwZW5kaW5nID0gQVI1S19QSFlfU1BFTkRJTkdfUkYyNDEzOwotCQl9Ci0JfQotCWFoLT5haF9waHkgPSBBUjVLX1BIWSgwKTsKLQotCS8qCi0JICogV3JpdGUgUENJLUUgcG93ZXIgc2F2ZSBzZXR0aW5ncwotCSAqLwotCWlmICgoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpICYmIChwZGV2LT5pc19wY2llKSkgewotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4OTI0OGZjMDAsIDB4NDA4MCk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgyNDkyNDkyNCwgMHg0MDgwKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDI4MDAwMDM5LCAweDQwODApOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4NTMxNjA4MjQsIDB4NDA4MCk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHhlNTk4MDU3OSwgMHg0MDgwKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMWRlZmZmLCAweDQwODApOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MWFhYWJlNDAsIDB4NDA4MCk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHhiZTEwNTU1NCwgMHg0MDgwKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMGUzMDA3LCAweDQwODApOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMDAsIDB4NDA4NCk7Ci0JfQotCi0JLyoKLQkgKiBQT1NUCi0JICovCi0JcmV0ID0gYXRoNWtfaHdfcG9zdChhaCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfZnJlZTsKLQotCS8qIFdyaXRlIEFSNUtfUENJQ0ZHX1VOSyBvbiAyMTEyQiBhbmQgbGF0ZXIgY2hpcHMgKi8KLQlpZiAoYWgtPmFoX3JhZGlvXzVnaHpfcmV2aXNpb24gPiBBUjVLX1NSRVZfUkFEXzIxMTJCIHx8Ci0Jc3JldiA+IEFSNUtfU1JFVl9WRVJfQVIyNDEzKSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QQ0lDRkdfVU5LLCBBUjVLX1BDSUNGRyk7Ci0JfQotCi0JLyoKLQkgKiBHZXQgY2FyZCBjYXBhYmlsaXRpZXMsIHZhbHVlcywgLi4uCi0JICovCi0JcmV0ID0gYXRoNWtfZWVwcm9tX2luaXQoYWgpOwotCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAidW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQkvKiBHZXQgbWlzYyBjYXBhYmlsaXRpZXMgKi8KLQlyZXQgPSBhdGg1a19od19nZXRfY2FwYWJpbGl0aWVzKGFoKTsKLQlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihzYywgInVuYWJsZSB0byBnZXQgZGV2aWNlIGNhcGFiaWxpdGllczogMHglMDR4XG4iLAotCQkJc2MtPnBkZXYtPmRldmljZSk7Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JLyogR2V0IE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXRoNWtfZWVwcm9tX3JlYWRfbWFjKGFoLCBtYWMpOwotCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKHNjLCAidW5hYmxlIHRvIHJlYWQgYWRkcmVzcyBmcm9tIEVFUFJPTTogMHglMDR4XG4iLAotCQkJc2MtPnBkZXYtPmRldmljZSk7Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JYXRoNWtfaHdfc2V0X2xsYWRkcihhaCwgbWFjKTsKLQkvKiBTZXQgQlNTSUQgdG8gYmNhc3QgYWRkcmVzczogZmY6ZmY6ZmY6ZmY6ZmY6ZmYgZm9yIG5vdyAqLwotCW1lbXNldChhaC0+YWhfYnNzaWQsIDB4ZmYsIEVUSF9BTEVOKTsKLQlhdGg1a19od19zZXRfYXNzb2NpZChhaCwgYWgtPmFoX2Jzc2lkLCAwKTsKLQlhdGg1a19od19zZXRfb3Btb2RlKGFoKTsKLQotCWF0aDVrX2h3X3NldF9yZmdhaW5fb3B0KGFoKTsKLQotCXJldHVybiBhaDsKLWVycl9mcmVlOgotCWtmcmVlKGFoKTsKLWVycjoKLQlyZXR1cm4gRVJSX1BUUihyZXQpOwotfQotCi0vKgotICogQnJpbmcgdXAgTUFDICsgUEhZIENoaXBzCi0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfbmljX3dha2V1cChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgZmxhZ3MsIGJvb2wgaW5pdGlhbCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5haF9zYy0+cGRldjsKLQl1MzIgdHVyYm8sIG1vZGUsIGNsb2NrLCBidXNfZmxhZ3M7Ci0JaW50IHJldDsKLQotCXR1cmJvID0gMDsKLQltb2RlID0gMDsKLQljbG9jayA9IDA7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyogV2FrZXVwIHRoZSBkZXZpY2UgKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwotCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKLQkJLyoKLQkJICogR2V0IGNoYW5uZWwgbW9kZSBmbGFncwotCQkgKi8KLQotCQlpZiAoYWgtPmFoX3JhZGlvID49IEFSNUtfUkY1MTEyKSB7Ci0JCQltb2RlID0gQVI1S19QSFlfTU9ERV9SQURfUkY1MTEyOwotCQkJY2xvY2sgPSBBUjVLX1BIWV9QTExfUkY1MTEyOwotCQl9IGVsc2UgewotCQkJbW9kZSA9IEFSNUtfUEhZX01PREVfUkFEX1JGNTExMTsJLypaZXJvKi8KLQkJCWNsb2NrID0gQVI1S19QSFlfUExMX1JGNTExMTsJCS8qWmVybyovCi0JCX0KLQotCQlpZiAoZmxhZ3MgJiBDSEFOTkVMXzJHSFopIHsKLQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9GUkVRXzJHSFo7Ci0JCQljbG9jayB8PSBBUjVLX1BIWV9QTExfNDRNSFo7Ci0KLQkJCWlmIChmbGFncyAmIENIQU5ORUxfQ0NLKSB7Ci0JCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX01PRF9DQ0s7Ci0JCQl9IGVsc2UgaWYgKGZsYWdzICYgQ0hBTk5FTF9PRkRNKSB7Ci0JCQkJLyogWFhYIER5bmFtaWMgT0ZETS9DQ0sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLQkJCQkgKiBBUjUyMTEgc28gd2Ugc2V0IE1PRF9PRkRNIGZvciBwbGFpbiBnIChubwotCQkJCSAqIENDSyBoZWFkZXJzKSBvcGVyYXRpb24uIFdlIG5lZWQgdG8gdGVzdAotCQkJCSAqIHRoaXMsIDUyMTEgbWlnaHQgc3VwcG9ydCBvZmRtLW9ubHkgZyBhZnRlcgotCQkJCSAqIGFsbCwgdGhlcmUgYXJlIGFsc28gaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKLQkJCQkgKiBpbiB0aGUgY29kZSBmb3IgZyBtb2RlIChzZWUgaW5pdHZhbHMuYykuICovCi0JCQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExKQotCQkJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfTU9EX09GRE07Ci0JCQkJZWxzZQotCQkJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfTU9EX0RZTjsKLQkJCX0gZWxzZSB7Ci0JCQkJQVRINUtfRVJSKGFoLT5haF9zYywKLQkJCQkJImludmFsaWQgcmFkaW8gbW9kdWxhdGlvbiBtb2RlXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfSBlbHNlIGlmIChmbGFncyAmIENIQU5ORUxfNUdIWikgewotCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX0ZSRVFfNUdIWjsKLQkJCWNsb2NrIHw9IEFSNUtfUEhZX1BMTF80ME1IWjsKLQotCQkJaWYgKGZsYWdzICYgQ0hBTk5FTF9PRkRNKQotCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfT0ZETTsKLQkJCWVsc2UgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCi0JCQkJCSJpbnZhbGlkIHJhZGlvIG1vZHVsYXRpb24gbW9kZVxuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiaW52YWxpZCByYWRpbyBmcmVxdWVuY3kgbW9kZVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChmbGFncyAmIENIQU5ORUxfVFVSQk8pCi0JCQl0dXJibyA9IEFSNUtfUEhZX1RVUkJPX01PREUgfCBBUjVLX1BIWV9UVVJCT19TSE9SVDsKLQl9IGVsc2UgeyAvKiBSZXNldCB0aGUgZGV2aWNlICovCi0KLQkJLyogLi4uZW5hYmxlIEF0aGVyb3MgdHVyYm8gbW9kZSBpZiByZXF1ZXN0ZWQgKi8KLQkJaWYgKGZsYWdzICYgQ0hBTk5FTF9UVVJCTykKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfVFVSQk9fTU9ERSwKLQkJCQkJQVI1S19QSFlfVFVSQk8pOwotCX0KLQotCS8qIHJlc2V0aW5nIFBDSSBvbiBQQ0ktRSBjYXJkcyByZXN1bHRzIGNhcmQgdG8gaGFuZwotCSAqIGFuZCBhbHdheXMgcmV0dXJuIDB4ZmZmZi4uLiBzbyB3ZSBpbmdvcmUgdGhhdCBmbGFnCi0JICogZm9yIFBDSS1FIGNhcmRzICovCi0JYnVzX2ZsYWdzID0gKHBkZXYtPmlzX3BjaWUpID8gMCA6IEFSNUtfUkVTRVRfQ1RMX1BDSTsKLQotCS8qIFJlc2V0IGNoaXBzZXQgKi8KLQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8Ci0JCUFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EIHwgYnVzX2ZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCUFUSDVLX0VSUihhaC0+YWhfc2MsICJmYWlsZWQgdG8gcmVzZXQgdGhlIE1BQyBDaGlwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQotCQl1ZGVsYXkoMjMwMCk7Ci0KLQkvKiAuLi53YWtldXAgYWdhaW4hKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwotCWlmIChyZXQpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byByZXN1bWUgdGhlIE1BQyBDaGlwXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiAuLi5maW5hbCB3YXJtIHJlc2V0ICovCi0JaWYgKGF0aDVrX2h3X25pY19yZXNldChhaCwgMCkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byB3YXJtIHJlc2V0IHRoZSBNQUMgQ2hpcFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQkvKiAuLi5zZXQgdGhlIFBIWSBvcGVyYXRpbmcgbW9kZSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGNsb2NrLCBBUjVLX1BIWV9QTEwpOwotCQl1ZGVsYXkoMzAwKTsKLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIG1vZGUsIEFSNUtfUEhZX01PREUpOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHR1cmJvLCBBUjVLX1BIWV9UVVJCTyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBHZXQgdGhlIHJhdGUgdGFibGUgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIG1vZGUKLSAqLwotY29uc3Qgc3RydWN0IGF0aDVrX3JhdGVfdGFibGUgKmF0aDVrX2h3X2dldF9yYXRlX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXVuc2lnbmVkIGludCBtb2RlKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQlpZiAoIXRlc3RfYml0KG1vZGUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIEdldCByYXRlIHRhYmxlcyAqLwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQVI1S19NT0RFXzExQToKLQkJcmV0dXJuICZhdGg1a19ydF8xMWE7Ci0JY2FzZSBBUjVLX01PREVfMTFBX1RVUkJPOgotCQlyZXR1cm4gJmF0aDVrX3J0X3R1cmJvOwotCWNhc2UgQVI1S19NT0RFXzExQjoKLQkJcmV0dXJuICZhdGg1a19ydF8xMWI7Ci0JY2FzZSBBUjVLX01PREVfMTFHOgotCQlyZXR1cm4gJmF0aDVrX3J0XzExZzsKLQljYXNlIEFSNUtfTU9ERV8xMUdfVFVSQk86Ci0JCXJldHVybiAmYXRoNWtfcnRfeHI7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBGcmVlIHRoZSBhdGg1a19odyBzdHJ1Y3QKLSAqLwotdm9pZCBhdGg1a19od19kZXRhY2goc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JX19zZXRfYml0KEFUSF9TVEFUX0lOVkFMSUQsIGFoLT5haF9zYy0+c3RhdHVzKTsKLQotCWlmIChhaC0+YWhfcmZfYmFua3MgIT0gTlVMTCkKLQkJa2ZyZWUoYWgtPmFoX3JmX2JhbmtzKTsKLQotCS8qIGFzc3VtZSBpbnRlcnJ1cHRzIGFyZSBkb3duICovCi0Ja2ZyZWUoYWgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAgUmVzZXQgZnVuY3Rpb24gYW5kIGhlbHBlcnMKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyAtIHNldCBPRkRNIHRpbWluZ3Mgb24gQVI1MjEyCi0gKgotICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwotICogQGNoYW5uZWw6IHRoZSBjdXJyZW50bHkgc2V0IGNoYW5uZWwgdXBvbiByZXNldAotICoKLSAqIFdyaXRlIHRoZSBPRkRNIHRpbWluZ3MgZm9yIHRoZSBBUjUyMTIgdXBvbiByZXNldC4gVGhpcyBpcyBhIGhlbHBlciBmb3IKLSAqIGF0aDVrX2h3X3Jlc2V0KCkuIFRoaXMgc2VlbXMgdG8gdHVuZSB0aGUgUExMIGEgc3BlY2lmaWVkIGZyZXF1ZW5jeQotICogZGVwZW5kaW5nIG9uIHRoZSBiYW5kd2lkdGggb2YgdGhlIGNoYW5uZWwuCi0gKgotICovCi1zdGF0aWMgaW5saW5lIGludCBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCi17Ci0JLyogR2V0IGV4cG9uZW50IGFuZCBtYW50aXNzYSBhbmQgc2V0IGl0ICovCi0JdTMyIGNvZWZfc2NhbGVkLCBjb2VmX2V4cCwgY29lZl9tYW4sCi0JCWRzX2NvZWZfZXhwLCBkc19jb2VmX21hbiwgY2xvY2s7Ci0KLQlpZiAoIShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgfHwKLQkJIShjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfT0ZETSkpCi0JCUJVRygpOwotCi0JLyogU2VlbXMgdGhlcmUgYXJlIHR3byBQTExzLCBvbmUgZm9yIGJhc2ViYW5kIHNhbXBsaW5nIGFuZCBvbmUKLQkgKiBmb3IgdHVuaW5nLiBUdW5pbmcgYmFzZWJhbmRzIGFyZSA0MCBNSHogb3IgODBNSHogd2hlbiBpbgotCSAqIHR1cmJvLiAqLwotCWNsb2NrID0gY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMX1RVUkJPID8gODAgOiA0MDsKLQljb2VmX3NjYWxlZCA9ICgoNSAqIChjbG9jayA8PCAyNCkpIC8gMikgLwotCWNoYW5uZWwtPmNlbnRlcl9mcmVxOwotCi0JZm9yIChjb2VmX2V4cCA9IDMxOyBjb2VmX2V4cCA+IDA7IGNvZWZfZXhwLS0pCi0JCWlmICgoY29lZl9zY2FsZWQgPj4gY29lZl9leHApICYgMHgxKQotCQkJYnJlYWs7Ci0KLQlpZiAoIWNvZWZfZXhwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNvZWZfZXhwID0gMTQgLSAoY29lZl9leHAgLSAyNCk7Ci0JY29lZl9tYW4gPSBjb2VmX3NjYWxlZCArCi0JCSgxIDw8ICgyNCAtIGNvZWZfZXhwIC0gMSkpOwotCWRzX2NvZWZfbWFuID0gY29lZl9tYW4gPj4gKDI0IC0gY29lZl9leHApOwotCWRzX2NvZWZfZXhwID0gY29lZl9leHAgLSAxNjsKLQotCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX1RJTUlOR18zLAotCQlBUjVLX1BIWV9USU1JTkdfM19EU0NfTUFOLCBkc19jb2VmX21hbik7Ci0JQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfVElNSU5HXzMsCi0JCUFSNUtfUEhZX1RJTUlOR18zX0RTQ19FWFAsIGRzX2NvZWZfZXhwKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24gLSBzZXQgcmF0ZSBkdXJhdGlvbiBkdXJpbmcgaHcgcmVzZXRzCi0gKgotICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwotICogQG1vZGU6IG9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCi0gKgotICogV3JpdGUgdGhlIHJhdGUgZHVyYXRpb24gdGFibGUgZm9yIHRoZSBjdXJyZW50IG1vZGUgdXBvbiBodyByZXNldC4gVGhpcwotICogaXMgYSBoZWxwZXIgZm9yIGF0aDVrX2h3X3Jlc2V0KCkuIEl0IHNlZW1zIGFsbCB0aGlzIGlzIGRvaW5nIGlzIHNldHRpbmcKLSAqIGFuIEFDSyB0aW1lb3V0IGZvciB0aGUgaGFyZHdhcmUgZm9yIHRoZSBjdXJyZW50IG1vZGUgZm9yIGVhY2ggcmF0ZS4gVGhlCi0gKiByYXRlcyB3aGljaCBhcmUgY2FwYWJsZSBvZiBzaG9ydCBwcmVhbWJsZSAoODAyLjExYiByYXRlcyAyTWJwcywgNS41TWJwcywKLSAqIGFuZCAxMU1icHMpIGhhdmUgYW5vdGhlciByZWdpc3RlciBmb3IgdGhlIHNob3J0IHByZWFtYmxlIEFDSyB0aW1lb3V0Ci0gKiBjYWxjdWxhdGlvbi4KLSAqCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgsCi0gICAgICAgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0Jc3RydWN0IGF0aDVrX3NvZnRjICpzYyA9IGFoLT5haF9zYzsKLQljb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZV90YWJsZSAqcnQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlIHNyYXRlID0ge307Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQkvKiBHZXQgcmF0ZSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgKi8KLQlydCA9IGF0aDVrX2h3X2dldF9yYXRlX3RhYmxlKGFoLCBtb2RlKTsKLQotCS8qIFdyaXRlIHJhdGUgZHVyYXRpb24gdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnQtPnJhdGVfY291bnQ7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgYXRoNWtfcmF0ZSAqcmF0ZSwgKmNvbnRyb2xfcmF0ZTsKLQotCQl1MzIgcmVnOwotCQl1MTYgdHhfdGltZTsKLQotCQlyYXRlID0gJnJ0LT5yYXRlc1tpXTsKLQkJY29udHJvbF9yYXRlID0gJnJ0LT5yYXRlc1tyYXRlLT5jb250cm9sX3JhdGVdOwotCi0JCS8qIFNldCBBQ0sgdGltZW91dCAqLwotCQlyZWcgPSBBUjVLX1JBVEVfRFVSKHJhdGUtPnJhdGVfY29kZSk7Ci0KLQkJc3JhdGUuYml0cmF0ZSA9IGNvbnRyb2xfcmF0ZS0+cmF0ZV9rYnBzLzEwMDsKLQotCQkvKiBBbiBBQ0sgZnJhbWUgY29uc2lzdHMgb2YgMTAgYnl0ZXMuIElmIHlvdSBhZGQgdGhlIEZDUywKLQkJICogd2hpY2ggaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRpb24oKSBhZGRzLAotCQkgKiBpdHMgMTQgYnl0ZXMuIE5vdGUgd2UgdXNlIHRoZSBjb250cm9sIHJhdGUgYW5kIG5vdCB0aGUKLQkJICogYWN0dWFsIHJhdGUgZm9yIHRoaXMgcmF0ZS4gU2VlIG1hYzgwMjExIHR4LmMKLQkJICogaWVlZTgwMjExX2R1cmF0aW9uKCkgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YKLQkJICogd2hhdCByYXRlIHdlIHNob3VsZCBjaG9vc2UgdG8gVFggQUNLcy4gKi8KLQkJdHhfdGltZSA9IGxlMTZfdG9fY3B1KGllZWU4MDIxMV9nZW5lcmljX2ZyYW1lX2R1cmF0aW9uKHNjLT5odywKLQkJCQkJCQlzYy0+dmlmLCAxMCwgJnNyYXRlKSk7Ci0KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF90aW1lLCByZWcpOwotCi0JCWlmICghSEFTX1NIUFJFQU1CTEUoaSkpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBXZSdyZSBub3QgZGlzdGluZ3Vpc2hpbmcgc2hvcnQgcHJlYW1ibGUgaGVyZSwKLQkJICogVGhpcyBpcyB0cnVlLCBhbGwgd2UnbGwgZ2V0IGlzIGEgbG9uZ2VyIHZhbHVlIGhlcmUKLQkJICogd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWxseSBiYWQuIFdlIGNvdWxkIHVzZQotCQkgKiBleHBvcnQgaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKCkgYnV0IHRoYXQgbmVlZHMgdG8gYmUKLQkJICogZml4ZWQgZmlyc3QgdG8gYmUgcHJvcGVybHkgdXNlZCBieSBtYWM4MDIxMTEgZHJpdmVyczoKLQkJICoKLQkJICogIC0gcmVtb3ZlIGVycCBzdHVmZiBhbmQgbGV0IHRoZSByb3V0aW5lIGZpZ3VyZSBvZmRtCi0JCSAqICAgIGVycCByYXRlcwotCQkgKiAgLSByZW1vdmUgcGFzc2luZyBhcmd1bWVudCBpZWVlODAyMTFfbG9jYWwgYXMKLQkJICogICAgZHJpdmVycyBkb24ndCBoYXZlIGFjY2VzcyB0byBpdAotCQkgKiAgLSBtb3ZlIGRyaXZlcnMgdXNpbmcgaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRpb24oKQotCQkgKiAgICB0byB0aGlzCi0JCSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHR4X3RpbWUsCi0JCQlyZWcgKyAoQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgPDwgMikpOwotCX0KLX0KLQotLyoKLSAqIE1haW4gcmVzZXQgZnVuY3Rpb24KLSAqLwotaW50IGF0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzIG9wX21vZGUsCi0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGNoYW5nZV9jaGFubmVsKQotewotCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPmFoX3NjLT5wZGV2OwotCXUzMiBkYXRhLCBzX3NlcSwgc19hbnQsIHNfbGVkWzNdLCBkbWFfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaSwgbW9kZSwgZnJlcSwgZWVfbW9kZSwgYW50WzJdOwotCWludCByZXQ7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0Jc19zZXEgPSAwOwotCXNfYW50ID0gMDsKLQllZV9tb2RlID0gMDsKLQlmcmVxID0gMDsKLQltb2RlID0gMDsKLQotCS8qCi0JICogU2F2ZSBzb21lIHJlZ2lzdGVycyBiZWZvcmUgYSByZXNldAotCSAqLwotCS8qRENVL0FudGVubmEgc2VsZWN0aW9uIG5vdCBhdmFpbGFibGUgb24gNTIxMCovCi0JaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7Ci0JCWlmIChjaGFuZ2VfY2hhbm5lbCkgewotCQkJLyogU2VxIG51bWJlciBmb3IgcXVldWUgMCAtZG8gdGhpcyBmb3IgYWxsIHF1ZXVlcyA/ICovCi0JCQlzX3NlcSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLAotCQkJCQlBUjVLX1FVRVVFX0RGU19TRVFOVU0oMCkpOwotCQkJLypEZWZhdWx0IGFudGVubmEqLwotCQkJc19hbnQgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19ERUZBVUxUX0FOVEVOTkEpOwotCQl9Ci0JfQotCi0JLypHUElPcyovCi0Jc19sZWRbMF0gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QQ0lDRkcpICYgQVI1S19QQ0lDRkdfTEVEU1RBVEU7Ci0Jc19sZWRbMV0gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPQ1IpOwotCXNfbGVkWzJdID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0RPKTsKLQotCWlmIChjaGFuZ2VfY2hhbm5lbCAmJiBhaC0+YWhfcmZfYmFua3MgIT0gTlVMTCkKLQkJYXRoNWtfaHdfZ2V0X3JmX2dhaW4oYWgpOwotCi0KLQkvKldha2V1cCB0aGUgZGV2aWNlKi8KLQlyZXQgPSBhdGg1a19od19uaWNfd2FrZXVwKGFoLCBjaGFubmVsLT5od192YWx1ZSwgZmFsc2UpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgb3BlcmF0aW5nIG1vZGUKLQkgKi8KLQlhaC0+YWhfb3BfbW9kZSA9IG9wX21vZGU7Ci0KLQkvKgotCSAqIDUxMTEvNTExMiBTZXR0aW5ncwotCSAqIDUyMTAgb25seSBjb21lcyB3aXRoIFJGNTExMAotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQlpZiAoYWgtPmFoX3JhZGlvICE9IEFSNUtfUkY1MTExICYmCi0JCQlhaC0+YWhfcmFkaW8gIT0gQVI1S19SRjUxMTIgJiYKLQkJCWFoLT5haF9yYWRpbyAhPSBBUjVLX1JGNTQxMyAmJgotCQkJYWgtPmFoX3JhZGlvICE9IEFSNUtfUkYyNDEzICYmCi0JCQlhaC0+YWhfcmFkaW8gIT0gQVI1S19SRjI0MjUpIHsKLQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCi0JCQkJImludmFsaWQgcGh5IHJhZGlvOiAldVxuIiwgYWgtPmFoX3JhZGlvKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJc3dpdGNoIChjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfTU9ERVMpIHsKLQkJY2FzZSBDSEFOTkVMX0E6Ci0JCQltb2RlID0gQVI1S19NT0RFXzExQTsKLQkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKLQkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKLQkJCWJyZWFrOwotCQljYXNlIENIQU5ORUxfRzoKLQkJCW1vZGUgPSBBUjVLX01PREVfMTFHOwotCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl8yR0haOwotCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0hBTk5FTF9COgotCQkJbW9kZSA9IEFSNUtfTU9ERV8xMUI7Ci0JCQlmcmVxID0gQVI1S19JTklfUkZHQUlOXzJHSFo7Ci0JCQllZV9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUI7Ci0JCQlicmVhazsKLQkJY2FzZSBDSEFOTkVMX1Q6Ci0JCQltb2RlID0gQVI1S19NT0RFXzExQV9UVVJCTzsKLQkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKLQkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKLQkJCWJyZWFrOwotCQkvKklzIHRoaXMgb2sgb24gNTIxMSB0b28gPyovCi0JCWNhc2UgQ0hBTk5FTF9URzoKLQkJCW1vZGUgPSBBUjVLX01PREVfMTFHX1RVUkJPOwotCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl8yR0haOwotCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0hBTk5FTF9YUjoKLQkJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkgewotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCi0JCQkJCSJYUiBtb2RlIG5vdCBhdmFpbGFibGUgb24gNTIxMSIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJbW9kZSA9IEFSNUtfTU9ERV9YUjsKLQkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKLQkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVRINUtfRVJSKGFoLT5haF9zYywKLQkJCQkiaW52YWxpZCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBQSFkgYWNjZXNzIGVuYWJsZSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1NISUZUXzVHSFosIEFSNUtfUEhZKDApKTsKLQotCX0KLQotCXJldCA9IGF0aDVrX2h3X3dyaXRlX2luaXR2YWxzKGFoLCBtb2RlLCBjaGFuZ2VfY2hhbm5lbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogNTIxMS81MjEyIFNwZWNpZmljCi0JICovCi0JaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7Ci0JCS8qCi0JCSAqIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiBzZXR0aW5ncwotCQkgKiBUaGlzIHNob3VsZCB3b3JrIGZvciBib3RoIDUxMTEvNTExMgotCQkgKi8KLQkJcmV0ID0gYXRoNWtfaHdfcmZnYWluKGFoLCBmcmVxKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJbWRlbGF5KDEpOwotCi0JCS8qCi0JCSAqIFdyaXRlIHNvbWUgbW9yZSBpbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzCi0JCSAqLwotCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAyYTAwMiwgMHg5ODJjKTsKLQotCQkJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlID09IENIQU5ORUxfRykKLQkJCQlpZiAoYWgtPmFoX21hY19zcmV2IDwgQVI1S19TUkVWX1ZFUl9BUjI0MTMpCi0JCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMGY4MGQ4MCwKLQkJCQkJCQkJMHg5OTRjKTsKLQkJCQllbHNlIGlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfVkVSX0FSMjQyNCkKLQkJCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMzgwMTQwLAotCQkJCQkJCQkweDk5NGMpOwotCQkJCWVsc2UgaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9WRVJfQVIyNDI1KQotCQkJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDBmYzBlYzAsCi0JCQkJCQkJCTB4OTk0Yyk7Ci0JCQkJZWxzZSAvKiAyNDI1ICovCi0JCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMGZjMGZjMCwKLQkJCQkJCQkJMHg5OTRjKTsKLQkJCWVsc2UKLQkJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMDAsIDB4OTk0Yyk7Ci0KLQkJCS8qIFNvbWUgYml0cyBhcmUgZGlzYWJsZWQgaGVyZSwgd2Uga25vdyBub3RoaW5nIGFib3V0Ci0JCQkgKiByZWdpc3RlciAweGEyMjggeWV0LCBtb3N0IG9mIHRoZSB0aW1lcyB0aGlzIGVuZHMgdXAKLQkJCSAqIHdpdGggYSB2YWx1ZSAweDliNSAtaGF2ZW4ndCBzZWVuIGFueSBkdW1wIHdpdGgKLQkJCSAqIGEgZGlmZmVyZW50IHZhbHVlLSAqLwotCQkJLyogR290IHRoaXMgZnJvbSBkZWNvbXBpbGluZyBiaW5hcnkgSEFMICovCi0JCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIDB4YTIyOCk7Ci0JCQlkYXRhICY9IDB4ZmZmZmZkZmY7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIDB4YTIyOCk7Ci0KLQkJCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgMHhhMjI4KTsKLQkJCWRhdGEgJj0gMHhmZmZlMDNmZjsKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgMHhhMjI4KTsKLQkJCWRhdGEgPSAwOwotCi0JCQkvKiBKdXN0IHdyaXRlIDB4OWI1ID8gKi8KLQkJCS8qIGF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDliNSwgMHhhMjI4KTsgKi8KLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDAwZiwgQVI1S19TRVFfTUFTSyk7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMDAsIDB4YTI1NCk7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMGUsIEFSNUtfUEhZX1NDQUwpOwotCQl9Ci0KLQkJLyogRml4IGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgUkY1MTEyIFJGIGNoaXBzZXQgKi8KLQkJaWYgKGFoLT5haF9yYWRpbyA+PSBBUjVLX1JGNTExMiAmJgotCQkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uIDwKLQkJCQlBUjVLX1NSRVZfUkFEXzUxMTJBKSB7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0NDS1RYQ1RMX1dPUkxELAotCQkJCQlBUjVLX1BIWV9DQ0tUWENUTCk7Ci0JCQlpZiAoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMXzVHSFopCi0JCQkJZGF0YSA9IDB4ZmZiODEwMjA7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IDB4ZmZiODBkMjA7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUEhZX0ZSQU1FX0NUTCk7Ci0JCQlkYXRhID0gMDsKLQkJfQotCi0JCS8qCi0JCSAqIFNldCBUWCBwb3dlciAoRklYTUUpCi0JCSAqLwotCQlyZXQgPSBhdGg1a19od190eHBvd2VyKGFoLCBjaGFubmVsLCBBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJLyogV3JpdGUgcmF0ZSBkdXJhdGlvbiB0YWJsZSBvbmx5IG9uIEFSNTIxMiBhbmQgaWYKLQkJICogdmlydHVhbCBpbnRlcmZhY2UgaGFzIGFscmVhZHkgYmVlbiBicm91Z2h0IHVwCi0JCSAqIFhYWDogcmV0aGluayB0aGlzIGFmdGVyIG5ldyBtb2RlIGNoYW5nZXMgdG8KLQkJICogbWFjODAyMTEgYXJlIGludGVncmF0ZWQgKi8KLQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCi0JCQlhaC0+YWhfc2MtPnZpZiAhPSBOVUxMKQotCQkJYXRoNWtfaHdfd3JpdGVfcmF0ZV9kdXJhdGlvbihhaCwgbW9kZSk7Ci0KLQkJLyoKLQkJICogV3JpdGUgUkYgcmVnaXN0ZXJzCi0JCSAqLwotCQlyZXQgPSBhdGg1a19od19yZnJlZ3MoYWgsIGNoYW5uZWwsIG1vZGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQkvKgotCQkgKiBDb25maWd1cmUgYWRkaXRpb25hbCByZWdpc3RlcnMKLQkJICovCi0KLQkJLyogV3JpdGUgT0ZETSB0aW1pbmdzIG9uIDUyMTIqLwotCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIgJiYKLQkJCWNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSB7Ci0JCQlyZXQgPSBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3MoYWgsIGNoYW5uZWwpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLypFbmFibGUvZGlzYWJsZSA4MDIuMTFiIG1vZGUgb24gNTExMQotCQkoZW5hYmxlIDIxMTEgZnJlcXVlbmN5IGNvbnZlcnRlciArIENDSykqLwotCQlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExKSB7Ci0JCQlpZiAobW9kZSA9PSBBUjVLX01PREVfMTFCKQotCQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAotCQkJCSAgICBBUjVLX1RYQ0ZHX0JfTU9ERSk7Ci0JCQllbHNlCi0JCQkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAotCQkJCSAgICBBUjVLX1RYQ0ZHX0JfTU9ERSk7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgY2hhbm5lbCBhbmQgY2FsaWJyYXRlIHRoZSBQSFkKLQkJICovCi0JCXJldCA9IGF0aDVrX2h3X2NoYW5uZWwoYWgsIGNoYW5uZWwpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQkvKiBTZXQgYW50ZW5uYSBtb2RlICovCi0JCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9BTlRfQ1RMLAotCQkJYWgtPmFoX2FudGVubmFbZWVfbW9kZV1bMF0sIDB4ZmZmZmZjMDYpOwotCi0JCS8qCi0JCSAqIEluIGNhc2UgYSBmaXhlZCBhbnRlbm5hIHdhcyBzZXQgYXMgZGVmYXVsdAotCQkgKiB3cml0ZSB0aGUgc2FtZSBzZXR0aW5ncyBvbiBib3RoIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEUKLQkJICogcmVnaXN0ZXJzLgotCQkgKi8KLQkJaWYgKHNfYW50ICE9IDApewotCQkJaWYgKHNfYW50ID09IEFSNUtfQU5UX0ZJWEVEX0EpIC8qIDEgLSBNYWluICovCi0JCQkJYW50WzBdID0gYW50WzFdID0gQVI1S19BTlRfRklYRURfQTsKLQkJCWVsc2UJLyogMiAtIEF1eCAqLwotCQkJCWFudFswXSA9IGFudFsxXSA9IEFSNUtfQU5UX0ZJWEVEX0I7Ci0JCX0gZWxzZSB7Ci0JCQlhbnRbMF0gPSBBUjVLX0FOVF9GSVhFRF9BOwotCQkJYW50WzFdID0gQVI1S19BTlRfRklYRURfQjsKLQkJfQotCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX2FudGVubmFbZWVfbW9kZV1bYW50WzBdXSwKLQkJCUFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMCk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX2FudGVubmFbZWVfbW9kZV1bYW50WzFdXSwKLQkJCUFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMSk7Ci0KLQkJLyogQ29tbWl0IHZhbHVlcyBmcm9tIEVFUFJPTSAqLwotCQlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExKQotCQkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfRlJBTUVfQ1RMLAotCQkJICAgIEFSNUtfUEhZX0ZSQU1FX0NUTF9UWF9DTElQLCBlZS0+ZWVfdHhfY2xpcCk7Ci0KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAotCQkJQVI1S19QSFlfTkZfU1ZBTChlZS0+ZWVfbm9pc2VfZmxvb3JfdGhyW2VlX21vZGVdKSwKLQkJCUFSNUtfUEhZX05GVEhSRVMpOwotCi0JCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9TRVRUTElORywKLQkJCShlZS0+ZWVfc3dpdGNoX3NldHRsaW5nW2VlX21vZGVdIDw8IDcpICYgMHgzZjgwLAotCQkJMHhmZmZmYzA3Zik7Ci0JCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9HQUlOLAotCQkJKGVlLT5lZV9hbnRfdHhfcnhbZWVfbW9kZV0gPDwgMTIpICYgMHgzZjAwMCwKLQkJCTB4ZmZmYzBmZmYpOwotCQlBUjVLX1JFR19NQVNLRURfQklUUyhhaCwgQVI1S19QSFlfREVTSVJFRF9TSVpFLAotCQkJKGVlLT5lZV9hZGNfZGVzaXJlZF9zaXplW2VlX21vZGVdICYgMHgwMGZmKSB8Ci0JCQkoKGVlLT5lZV9wZ2FfZGVzaXJlZF9zaXplW2VlX21vZGVdIDw8IDgpICYgMHhmZjAwKSwKLQkJCTB4ZmZmZjAwMDApOwotCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKLQkJCShlZS0+ZWVfdHhfZW5kMnhwYV9kaXNhYmxlW2VlX21vZGVdIDw8IDI0KSB8Ci0JCQkoZWUtPmVlX3R4X2VuZDJ4cGFfZGlzYWJsZVtlZV9tb2RlXSA8PCAxNikgfAotCQkJKGVlLT5lZV90eF9mcm0yeHBhX2VuYWJsZVtlZV9tb2RlXSA8PCA4KSB8Ci0JCQkoZWUtPmVlX3R4X2ZybTJ4cGFfZW5hYmxlW2VlX21vZGVdKSwgQVI1S19QSFlfUkZfQ1RMNCk7Ci0KLQkJQVI1S19SRUdfTUFTS0VEX0JJVFMoYWgsIEFSNUtfUEhZX1JGX0NUTDMsCi0JCQllZS0+ZWVfdHhfZW5kMnhsbmFfZW5hYmxlW2VlX21vZGVdIDw8IDgsIDB4ZmZmZjAwZmYpOwotCQlBUjVLX1JFR19NQVNLRURfQklUUyhhaCwgQVI1S19QSFlfTkYsCi0JCQkoZWUtPmVlX3Rocl82MltlZV9tb2RlXSA8PCAxMikgJiAweDdmMDAwLCAweGZmZjgwZmZmKTsKLQkJQVI1S19SRUdfTUFTS0VEX0JJVFMoYWgsIEFSNUtfUEhZX09GRE1fU0VMRkNPUlIsIDQsIDB4ZmZmZmZmMDEpOwotCi0JCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9JUSwKLQkJICAgIEFSNUtfUEhZX0lRX0NPUlJfRU5BQkxFIHwKLQkJICAgIChlZS0+ZWVfaV9jYWxbZWVfbW9kZV0gPDwgQVI1S19QSFlfSVFfQ09SUl9RX0lfQ09GRl9TKSB8Ci0JCSAgICBlZS0+ZWVfcV9jYWxbZWVfbW9kZV0pOwotCi0JCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMSkKLQkJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0dBSU5fMkdIWiwKLQkJCQlBUjVLX1BIWV9HQUlOXzJHSFpfTUFSR0lOX1RYUlgsCi0JCQkJZWUtPmVlX21hcmdpbl90eF9yeFtlZV9tb2RlXSk7Ci0KLQl9IGVsc2UgewotCQltZGVsYXkoMSk7Ci0JCS8qIERpc2FibGUgcGh5IGFuZCB3YWl0ICovCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfQUNUX0RJU0FCTEUsIEFSNUtfUEhZX0FDVCk7Ci0JCW1kZWxheSgxKTsKLQl9Ci0KLQkvKgotCSAqIFJlc3RvcmUgc2F2ZWQgdmFsdWVzCi0JICovCi0JLypEQ1UvQW50ZW5uYSBzZWxlY3Rpb24gbm90IGF2YWlsYWJsZSBvbiA1MjEwKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX3NlcSwgQVI1S19RVUVVRV9ERlNfU0VRTlVNKDApKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX2FudCwgQVI1S19ERUZBVUxUX0FOVEVOTkEpOwotCX0KLQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsIHNfbGVkWzBdKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNfbGVkWzFdLCBBUjVLX0dQSU9DUik7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX2xlZFsyXSwgQVI1S19HUElPRE8pOwotCi0JLyoKLQkgKiBNaXNjCi0JICovCi0JLyogWFhYOiBhZGQgYWgtPmFpZCBvbmNlIG1hYzgwMjExIGdpdmVzIHRoaXMgdG8gdXMgKi8KLQlhdGg1a19od19zZXRfYXNzb2NpZChhaCwgYWgtPmFoX2Jzc2lkLCAwKTsKLQotCWF0aDVrX2h3X3NldF9vcG1vZGUoYWgpOwotCS8qUElTUi9TSVNSIE5vdCBhdmFpbGFibGUgb24gNTIxMCovCi0JaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHhmZmZmZmZmZiwgQVI1S19QSVNSKTsKLQkJLyogSWYgd2UgbGF0ZXIgYWxsb3cgdHVuaW5nIGZvciB0aGlzLCBzdG9yZSBpbnRvIHNjIHN0cnVjdHVyZSAqLwotCQlkYXRhID0gQVI1S19UVU5FX1JTU0lfVEhSRVMgfAotCQkJQVI1S19UVU5FX0JNSVNTX1RIUkVTIDw8IEFSNUtfUlNTSV9USFJfQk1JU1NfUzsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX1JTU0lfVEhSKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBSeC9UeCBETUEgQ29uZmlndXJhdGlvbgotCSAqCi0JICogU2V0IG1heGltdW0gRE1BIHNpemUgKDUxMikgZXhjZXB0IGZvciBQQ0ktRSBjYXJkcyBzaW5jZQotCSAqIGl0IGNhdXNlcyByeCBvdmVycnVucyBhbmQgdHggZXJyb3JzICh0ZXN0ZWQgb24gNTQyNCBidXQgc2luY2UKLQkgKiByeCBvdmVycnVucyBhbHNvIG9jY3VyIG9uIDU0MTYvNTQxOCB3aXRoIG1hZHdpZmkgd2Ugc2V0IDEyOAotCSAqIGZvciBhbGwgUENJLUUgY2FyZHMgdG8gYmUgc2FmZSkuCi0JICoKLQkgKiBJbiBkdW1wcyB0aGlzIGlzIDEyOCBmb3IgYWxsY2hpcHMuCi0JICoKLQkgKiBYWFg6IG5lZWQgdG8gY2hlY2sgNTIxMCBmb3IgdGhpcwotCSAqIFRPRE86IENoZWNrIG91dCB0eCB0cmlnZXIgbGV2ZWwsIGl0J3MgYWx3YXlzIDY0IG9uIGR1bXBzIGJ1dCBJCi0JICogZ3Vlc3Mgd2UgY2FuIHR3ZWFrIGl0IGFuZCBzZWUgaG93IGl0IGdvZXMgOy0pCi0JICovCi0JZG1hX3NpemUgPSAocGRldi0+aXNfcGNpZSkgPyBBUjVLX0RNQVNJWkVfMTI4QiA6IEFSNUtfRE1BU0laRV81MTJCOwotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAotCQkJQVI1S19UWENGR19TRE1BTVIsIGRtYV9zaXplKTsKLQkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19SWENGRywKLQkJCUFSNUtfUlhDRkdfU0RNQU1XLCBkbWFfc2l6ZSk7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgdGhlIFBIWSBhbmQgd2FpdCB1bnRpbCBjb21wbGV0aW9uCi0JICovCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9BQ1RfRU5BQkxFLCBBUjVLX1BIWV9BQ1QpOwotCi0JLyoKLQkgKiBPbiA1MjExKyByZWFkIGFjdGl2YXRpb24gLT4gcnggZGVsYXkKLQkgKiBhbmQgdXNlIGl0LgotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1JYX0RFTEFZKSAmCi0JCQlBUjVLX1BIWV9SWF9ERUxBWV9NOwotCQlkYXRhID0gKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9DQ0spID8KLQkJCSgoZGF0YSA8PCAyKSAvIDIyKSA6IChkYXRhIC8gMTApOwotCi0JCXVkZWxheSgxMDAgKyAoMiAqIGRhdGEpKTsKLQkJZGF0YSA9IDA7Ci0JfSBlbHNlIHsKLQkJbWRlbGF5KDEpOwotCX0KLQotCS8qCi0JICogUGVyZm9ybSBBREMgdGVzdCAoPykKLQkgKi8KLQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1RTVDEpOwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfVFNUMV9UWEhPTEQsIEFSNUtfUEhZX1RTVDEpOwotCWZvciAoaSA9IDA7IGkgPD0gMjA7IGkrKykgewotCQlpZiAoIShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQURDX1RFU1QpICYgMHgxMCkpCi0JCQlicmVhazsKLQkJdWRlbGF5KDIwMCk7Ci0JfQotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19QSFlfVFNUMSk7Ci0JZGF0YSA9IDA7Ci0KLQkvKgotCSAqIFN0YXJ0IGF1dG9tYXRpYyBnYWluIGNhbGlicmF0aW9uCi0JICoKLQkgKiBEdXJpbmcgQUdDIGNhbGlicmF0aW9uIFJYIHBhdGggaXMgcmUtcm91dGVkIHRvCi0JICogYSBzaWduYWwgZGV0ZWN0b3Igc28gd2UgZG9uJ3QgcmVjZWl2ZSBhbnl0aGluZy4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2FsaWJyYXRlIHNvbWUgc3RhdGljIG9mZnNldHMKLQkgKiB1c2VkIHRvZ2V0aGVyIHdpdGggb24tdGhlIGZseSBJL1EgY2FsaWJyYXRpb24gKHRoZQotCSAqIG9uZSBwZXJmb3JtZWQgdmlhIGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUpLCB0aGF0IGRvZXNuJ3QKLQkgKiBpbnRlcnJ1cHQgcnggcGF0aC4KLQkgKgotCSAqIElmIHdlIGFyZSBpbiBhIG5vaXN5IGVudmlyb25tZW50IEFHQyBjYWxpYnJhdGlvbiBtYXkgdGltZQotCSAqIG91dC4KLQkgKi8KLQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDQ1RMLAotCQkJCUFSNUtfUEhZX0FHQ0NUTF9DQUwpOwotCi0JLyogQXQgdGhlIHNhbWUgdGltZSBzdGFydCBJL1EgY2FsaWJyYXRpb24gZm9yIFFBTSBjb25zdGVsbGF0aW9uCi0JICogLW5vIG5lZWQgZm9yIENDSy0gKi8KLQlhaC0+YWhfY2FsaWJyYXRpb24gPSBmYWxzZTsKLQlpZiAoIShtb2RlID09IEFSNUtfTU9ERV8xMUIpKSB7Ci0JCWFoLT5haF9jYWxpYnJhdGlvbiA9IHRydWU7Ci0JCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAotCQkJCUFSNUtfUEhZX0lRX0NBTF9OVU1fTE9HX01BWCwgMTUpOwotCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsCi0JCQkJQVI1S19QSFlfSVFfUlVOKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBnYWluIGNhbGlicmF0aW9uIHRvIGZpbmlzaCAod2UgY2hlY2sgZm9yIEkvUSBjYWxpYnJhdGlvbgotCSAqIGR1cmluZyBhdGg1a19waHlfY2FsaWJyYXRlKSAqLwotCWlmIChhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLCBBUjVLX1BIWV9BR0NDVEwsCi0JCQlBUjVLX1BIWV9BR0NDVExfQ0FMLCAwLCBmYWxzZSkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgImdhaW4gY2FsaWJyYXRpb24gdGltZW91dCAoJXVNSHopXG4iLAotCQkJY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQkvKgotCSAqIFN0YXJ0IG5vaXNlIGZsb29yIGNhbGlicmF0aW9uCi0JICoKLQkgKiBJZiB3ZSBydW4gTkYgY2FsaWJyYXRpb24gYmVmb3JlIEFHQywgaXQgYWx3YXlzIHRpbWVzIG91dC4KLQkgKiBCaW5hcnkgSEFMIHN0YXJ0cyBORiBhbmQgQUdDIGNhbGlicmF0aW9uIGF0IHRoZSBzYW1lIHRpbWUKLQkgKiBhbmQgb25seSB3YWl0cyBmb3IgQUdDIHRvIGZpbmlzaC4gSSBiZWxpZXZlIHRoYXQncyB3cm9uZyBiZWNhdXNlCi0JICogZHVyaW5nIE5GIGNhbGlicmF0aW9uLCByeCBwYXRoIGlzIGFsc28gcm91dGVkIHRvIGEgZGV0ZWN0b3IsIHNvIGlmCi0JICogaXQgZG9lc24ndCBmaW5pc2ggd2Ugd29uJ3QgaGF2ZSBSWC4KLQkgKgotCSAqIFhYWDogRmluZCBhbiBpbnRlcnZhbCB0aGF0J3MgT0sgZm9yIGFsbCBjYXJkcy4uLgotCSAqLwotCXJldCA9IGF0aDVrX2h3X25vaXNlX2Zsb29yX2NhbGlicmF0aW9uKGFoLCBjaGFubmVsLT5jZW50ZXJfZnJlcSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogUmVzZXQgcXVldWVzIGFuZCBzdGFydCBiZWFjb24gdGltZXJzIGF0IHRoZSBlbmQgb2YgdGhlIHJlc2V0IHJvdXRpbmUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtOyBpKyspIHsKLQkJLypObyBRQ1Ugb24gNTIxMCovCi0JCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKLQkJCUFSNUtfUkVHX1dSSVRFX1EoYWgsIEFSNUtfUVVFVUVfUUNVTUFTSyhpKSwgaSk7Ci0KLQkJcmV0ID0gYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoYWgsIGkpOwotCQlpZiAocmV0KSB7Ci0JCQlBVEg1S19FUlIoYWgtPmFoX3NjLAotCQkJCSJmYWlsZWQgdG8gcmVzZXQgVFggcXVldWUgIyVkXG4iLCBpKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKiBQcmUtZW5hYmxlIGludGVycnVwdHMgb24gNTIxMS81MjEyKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCi0JCWF0aDVrX2h3X3NldF9pbnRyKGFoLCBBUjVLX0lOVF9SWCB8IEFSNUtfSU5UX1RYIHwKLQkJCQlBUjVLX0lOVF9GQVRBTCk7Ci0KLQkvKgotCSAqIFNldCBSRiBraWxsIGZsYWdzIGlmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIChyZWFkIGZyb20gdGhlIEVFUFJPTSkKLQkgKiBEaXNhYmxlIGdwaW9faW50ciBmb3Igbm93IHNpbmNlIGl0IHJlc3VsdHMgc3lzdGVtIGhhbmcuCi0JICogVE9ETzogSGFuZGxlIHRoaXMgaW4gYXRoNWtfaW50cgotCSAqLwotI2lmIDAKLQlpZiAoQVI1S19FRVBST01fSERSX1JGS0lMTChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfaGVhZGVyKSkgewotCQlhdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgMCk7Ci0JCWFoLT5haF9ncGlvWzBdID0gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIDApOwotCQlpZiAoYWgtPmFoX2dwaW9bMF0gPT0gMCkKLQkJCWF0aDVrX2h3X3NldF9ncGlvX2ludHIoYWgsIDAsIDEpOwotCQllbHNlCi0JCQlhdGg1a19od19zZXRfZ3Bpb19pbnRyKGFoLCAwLCAwKTsKLQl9Ci0jZW5kaWYKLQotCS8qCi0JICogU2V0IHRoZSAzMk1IeiByZWZlcmVuY2UgY2xvY2sgb24gNTIxMiBwaHkgY2xvY2sgc2xlZXAgcmVnaXN0ZXIKLQkgKgotCSAqIFRPRE86IEZpbmQgb3V0IGhvdyB0byBzd2l0Y2ggdG8gZXh0ZXJuYWwgMzJLaHogY2xvY2sgdG8gc2F2ZSBwb3dlcgotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1NDUl8zMk1IWiwgQVI1S19QSFlfU0NSKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TTE1UXzMyTUhaLCBBUjVLX1BIWV9TTE1UKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TQ0FMXzMyTUhaLCBBUjVLX1BIWV9TQ0FMKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TQ0xPQ0tfMzJNSFosIEFSNUtfUEhZX1NDTE9DSyk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfU0RFTEFZXzMyTUhaLCBBUjVLX1BIWV9TREVMQVkpOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9waHlfc3BlbmRpbmcsIEFSNUtfUEhZX1NQRU5ESU5HKTsKLQotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVVNFQ181MjExKSAmIDB4ZmZmZmMwN2YgOwotCQlkYXRhIHw9IChhaC0+YWhfcGh5X3NwZW5kaW5nID09IEFSNUtfUEhZX1NQRU5ESU5HXzE4KSA/Ci0JCQkJCQkweDAwMDAwZjgwIDogMHgwMDAwMTM4MCA7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19VU0VDXzUyMTEpOwotCQlkYXRhID0gMDsKLQl9Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDEwMGFhLCAweDgxMTgpOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDMyMTAsIDB4ODExYyk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDA1MiwgMHg4MTA4KTsKLQkJaWYgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfVkVSX0FSMjQxMykKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDAwNCwgMHg4MTIwKTsKLQl9Ci0KLQkvKgotCSAqIERpc2FibGUgYmVhY29ucyBhbmQgcmVzZXQgdGhlIHJlZ2lzdGVyCi0JICovCi0JQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX0JFQUNPTiwgQVI1S19CRUFDT05fRU5BQkxFIHwKLQkJCUFSNUtfQkVBQ09OX1JFU0VUX1RTRik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlc2V0IGNoaXBzZXQKLSAqLwotc3RhdGljIGludCBhdGg1a19od19uaWNfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHZhbCkKLXsKLQlpbnQgcmV0OwotCXUzMiBtYXNrID0gdmFsID8gdmFsIDogfjBVOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCS8qIFJlYWQtYW5kLWNsZWFyIFJYIERlc2NyaXB0b3IgUG9pbnRlciovCi0JYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlhEUCk7Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSBkZXZpY2UgYW5kIHdhaXQgdW50aWwgc3VjY2VzcwotCSAqLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFsLCBBUjVLX1JFU0VUX0NUTCk7Ci0KLQkvKiBXYWl0IGF0IGxlYXN0IDEyOCBQQ0kgY2xvY2tzICovCi0JdWRlbGF5KDE1KTsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQl2YWwgJj0gQVI1S19SRVNFVF9DVExfQ0hJUDsKLQkJbWFzayAmPSBBUjVLX1JFU0VUX0NUTF9DSElQOwotCX0gZWxzZSB7Ci0JCXZhbCAmPSBBUjVLX1JFU0VUX0NUTF9QQ1UgfCBBUjVLX1JFU0VUX0NUTF9CQVNFQkFORDsKLQkJbWFzayAmPSBBUjVLX1JFU0VUX0NUTF9QQ1UgfCBBUjVLX1JFU0VUX0NUTF9CQVNFQkFORDsKLQl9Ci0KLQlyZXQgPSBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLCBBUjVLX1JFU0VUX0NUTCwgbWFzaywgdmFsLCBmYWxzZSk7Ci0KLQkvKgotCSAqIFJlc2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKGZvciBodyBieXRlLXN3YXApLiBOb3RlIHRoYXQgdGhpcwotCSAqIGlzIG9ubHkgc2V0IGZvciBiaWcgZW5kaWFuLiBXZSBkbyB0aGUgbmVjZXNzYXJ5IG1hZ2ljIGluCi0JICogQVI1S19JTklUX0NGRy4KLQkgKi8KLQlpZiAoKHZhbCAmIEFSNUtfUkVTRVRfQ1RMX1BDVSkgPT0gMCkKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0lOSVRfQ0ZHLCBBUjVLX0NGRyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMKLSAqLwotCi0vKgotICogU2xlZXAgY29udHJvbAotICovCi1pbnQgYXRoNWtfaHdfc2V0X3Bvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfcG93ZXJfbW9kZSBtb2RlLAotCQlib29sIHNldF9jaGlwLCB1MTYgc2xlZXBfZHVyYXRpb24pCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyIHN0YWlkLCBkYXRhOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlzdGFpZCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NUQV9JRDEpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBBUjVLX1BNX0FVVE86Ci0JCXN0YWlkICY9IH5BUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BOwotCQkvKiBmYWxsdGhyb3VnaCAqLwotCWNhc2UgQVI1S19QTV9ORVRXT1JLX1NMRUVQOgotCQlpZiAoc2V0X2NoaXApCi0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCi0JCQkJQVI1S19TTEVFUF9DVExfU0xFX0FMTE9XIHwKLQkJCQlzbGVlcF9kdXJhdGlvbiwKLQkJCQlBUjVLX1NMRUVQX0NUTCk7Ci0KLQkJc3RhaWQgfD0gQVI1S19TVEFfSUQxX1BXUl9TVjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSNUtfUE1fRlVMTF9TTEVFUDoKLQkJaWYgKHNldF9jaGlwKQotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1NMRUVQX0NUTF9TTEVfU0xQLAotCQkJCUFSNUtfU0xFRVBfQ1RMKTsKLQotCQlzdGFpZCB8PSBBUjVLX1NUQV9JRDFfUFdSX1NWOwotCQlicmVhazsKLQotCWNhc2UgQVI1S19QTV9BV0FLRToKLQotCQlzdGFpZCAmPSB+QVI1S19TVEFfSUQxX1BXUl9TVjsKLQotCQlpZiAoIXNldF9jaGlwKQotCQkJZ290byBjb21taXQ7Ci0KLQkJLyogUHJlc2VydmUgc2xlZXAgZHVyYXRpb24gKi8KLQkJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NMRUVQX0NUTCk7Ci0JCWlmKCBkYXRhICYgMHhmZmMwMDAwMCApewotCQkJZGF0YSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlkYXRhID0gZGF0YSAmIDB4ZmZmY2ZmZmY7Ci0JCX0KLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfU0xFRVBfQ1RMKTsKLQkJdWRlbGF5KDE1KTsKLQotCQlmb3IgKGkgPSA1MDsgaSA+IDA7IGktLSkgewotCQkJLyogQ2hlY2sgaWYgdGhlIGNoaXAgZGlkIHdha2UgdXAgKi8KLQkJCWlmICgoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUENJQ0ZHKSAmCi0JCQkJCUFSNUtfUENJQ0ZHX1NQV1JfRE4pID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFdhaXQgYSBiaXQgYW5kIHJldHJ5ICovCi0JCQl1ZGVsYXkoMjAwKTsKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19TTEVFUF9DVEwpOwotCQl9Ci0KLQkJLyogRmFpbCBpZiB0aGUgY2hpcCBkaWRuJ3Qgd2FrZSB1cCAqLwotCQlpZiAoaSA8PSAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLWNvbW1pdDoKLQlhaC0+YWhfcG93ZXJfbW9kZSA9IG1vZGU7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzdGFpZCwgQVI1S19TVEFfSUQxKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKipcCi0gIERNQSBSZWxhdGVkIEZ1bmN0aW9ucwotXCoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogUmVjZWl2ZSBmdW5jdGlvbnMKLSAqLwotCi0vKgotICogU3RhcnQgRE1BIHJlY2VpdmUKLSAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0NSX1JYRSwgQVI1S19DUik7Ci0JYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpOwotfQotCi0vKgotICogU3RvcCBETUEgcmVjZWl2ZQotICovCi1pbnQgYXRoNWtfaHdfc3RvcF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0NSX1JYRCwgQVI1S19DUik7Ci0KLQkvKgotCSAqIEl0IG1heSB0YWtlIHNvbWUgdGltZSB0byBkaXNhYmxlIHRoZSBETUEgcmVjZWl2ZSB1bml0Ci0JICovCi0JZm9yIChpID0gMjAwMDsgaSA+IDAgJiYKLQkJCShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUikgJiBBUjVLX0NSX1JYRSkgIT0gMDsKLQkJCWktLSkKLQkJdWRlbGF5KDEwKTsKLQotCXJldHVybiBpID8gMCA6IC1FQlVTWTsKLX0KLQotLyoKLSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgUlggRGVzY3JpcHRvcgotICovCi11MzIgYXRoNWtfaHdfZ2V0X3J4X2J1ZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWERQKTsKLX0KLQotLyoKLSAqIFNldCB0aGUgYWRkcmVzcyBvZiB0aGUgUlggRGVzY3JpcHRvcgotICovCi12b2lkIGF0aDVrX2h3X3B1dF9yeF9idWYoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLypUT0RPOlNob3VsZG4ndCB3ZSBjaGVjayBpZiBSWCBpcyBlbmFibGVkIGZpcnN0ID8qLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5c19hZGRyLCBBUjVLX1JYRFApOwotfQotCi0vKgotICogVHJhbnNtaXQgZnVuY3Rpb25zCi0gKi8KLQotLyoKLSAqIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICogKHNlZSBhbHNvIFFDVS9EQ1UgZnVuY3Rpb25zKQotICovCi1pbnQgYXRoNWtfaHdfdHhfc3RhcnQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQotewotCXUzMiB0eF9xdWV1ZTsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JQVI1S19BU1NFUlRfRU5UUlkocXVldWUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSk7Ci0KLQkvKiBSZXR1cm4gaWYgcXVldWUgaXMgZGVjbGFyZWQgaW5hY3RpdmUgKi8KLQlpZiAoYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9JTkFDVElWRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJdHhfcXVldWUgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUik7Ci0KLQkJLyoKLQkJICogU2V0IHRoZSBxdWV1ZSBieSB0eXBlIG9uIDUyMTAKLQkJICovCi0JCXN3aXRjaCAoYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUpIHsKLQkJY2FzZSBBUjVLX1RYX1FVRVVFX0RBVEE6Ci0JCQl0eF9xdWV1ZSB8PSBBUjVLX0NSX1RYRTAgJiB+QVI1S19DUl9UWEQwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9CRUFDT046Ci0JCQl0eF9xdWV1ZSB8PSBBUjVLX0NSX1RYRTEgJiB+QVI1S19DUl9UWEQxOwotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0JDUl9UUTFWIHwgQVI1S19CQ1JfQkRNQUUsCi0JCQkJCUFSNUtfQlNSKTsKLQkJCWJyZWFrOwotCQljYXNlIEFSNUtfVFhfUVVFVUVfQ0FCOgotCQkJdHhfcXVldWUgfD0gQVI1S19DUl9UWEUxICYgfkFSNUtfQ1JfVFhEMTsKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19CQ1JfVFExRlYgfCBBUjVLX0JDUl9UUTFWIHwKLQkJCQlBUjVLX0JDUl9CRE1BRSwgQVI1S19CU1IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQkvKiBTdGFydCBxdWV1ZSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHR4X3F1ZXVlLCBBUjVLX0NSKTsKLQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpOwotCX0gZWxzZSB7Ci0JCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkaXNhYmxlZCAqLwotCQlpZiAoQVI1S19SRUdfUkVBRF9RKGFoLCBBUjVLX1FDVV9UWEQsIHF1ZXVlKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCS8qIFN0YXJ0IHF1ZXVlICovCi0JCUFSNUtfUkVHX1dSSVRFX1EoYWgsIEFSNUtfUUNVX1RYRSwgcXVldWUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogU3RvcCBETUEgdHJhbnNtaXQgZm9yIGEgc3BlY2lmaWMgcXVldWUKLSAqIChzZWUgYWxzbyBRQ1UvRENVIGZ1bmN0aW9ucykKLSAqLwotaW50IGF0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKLXsKLQl1bnNpZ25lZCBpbnQgaSA9IDEwMDsKLQl1MzIgdHhfcXVldWUsIHBlbmRpbmc7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOwotCi0JLyogUmV0dXJuIGlmIHF1ZXVlIGlzIGRlY2xhcmVkIGluYWN0aXZlICovCi0JaWYgKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlID09IEFSNUtfVFhfUVVFVUVfSU5BQ1RJVkUpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCXR4X3F1ZXVlID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpOwotCi0JCS8qCi0JCSAqIFNldCBieSBxdWV1ZSB0eXBlCi0JCSAqLwotCQlzd2l0Y2ggKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlKSB7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgotCQkJdHhfcXVldWUgfD0gQVI1S19DUl9UWEQwICYgfkFSNUtfQ1JfVFhFMDsKLQkJCWJyZWFrOwotCQljYXNlIEFSNUtfVFhfUVVFVUVfQkVBQ09OOgotCQljYXNlIEFSNUtfVFhfUVVFVUVfQ0FCOgotCQkJLyogWFhYIEZpeCBtZS4uLiAqLwotCQkJdHhfcXVldWUgfD0gQVI1S19DUl9UWEQxICYgfkFSNUtfQ1JfVFhEMTsKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19CU1IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qIFN0b3AgcXVldWUgKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0eF9xdWV1ZSwgQVI1S19DUik7Ci0JCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBTY2hlZHVsZSBUWCBkaXNhYmxlIGFuZCB3YWl0IHVudGlsIHF1ZXVlIGlzIGVtcHR5Ci0JCSAqLwotCQlBUjVLX1JFR19XUklURV9RKGFoLCBBUjVLX1FDVV9UWEQsIHF1ZXVlKTsKLQotCQkvKkNoZWNrIGZvciBwZW5kaW5nIGZyYW1lcyovCi0JCWRvIHsKLQkJCXBlbmRpbmcgPSBhdGg1a19od19yZWdfcmVhZChhaCwKLQkJCQlBUjVLX1FVRVVFX1NUQVRVUyhxdWV1ZSkpICYKLQkJCQlBUjVLX1FDVV9TVFNfRlJNUEVORENOVDsKLQkJCXVkZWxheSgxMDApOwotCQl9IHdoaWxlICgtLWkgJiYgcGVuZGluZyk7Ci0KLQkJLyogQ2xlYXIgcmVnaXN0ZXIgKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1FDVV9UWEQpOwotCQlpZiAocGVuZGluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgZm9yIHN1Y2Nlc3MgZWxzZSByZXR1cm4gZXJyb3IgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgVFggRGVzY3JpcHRvciBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICogKHNlZSBhbHNvIFFDVS9EQ1UgZnVuY3Rpb25zKQotICovCi11MzIgYXRoNWtfaHdfZ2V0X3R4X2J1ZihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCi17Ci0JdTE2IHR4X3JlZzsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JQVI1S19BU1NFUlRfRU5UUlkocXVldWUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSk7Ci0KLQkvKgotCSAqIEdldCB0aGUgdHJhbnNtaXQgcXVldWUgZGVzY3JpcHRvciBwb2ludGVyIGZyb20gdGhlIHNlbGVjdGVkIHF1ZXVlCi0JICovCi0JLyo1MjEwIGRvZXNuJ3QgaGF2ZSBRQ1UqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQlzd2l0Y2ggKGFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlKSB7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgotCQkJdHhfcmVnID0gQVI1S19OT1FDVV9UWERQMDsKLQkJCWJyZWFrOwotCQljYXNlIEFSNUtfVFhfUVVFVUVfQkVBQ09OOgotCQljYXNlIEFSNUtfVFhfUVVFVUVfQ0FCOgotCQkJdHhfcmVnID0gQVI1S19OT1FDVV9UWERQMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDB4ZmZmZmZmZmY7Ci0JCX0KLQl9IGVsc2UgewotCQl0eF9yZWcgPSBBUjVLX1FVRVVFX1RYRFAocXVldWUpOwotCX0KLQotCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgdHhfcmVnKTsKLX0KLQotLyoKLSAqIFNldCB0aGUgYWRkcmVzcyBvZiB0aGUgVFggRGVzY3JpcHRvciBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICogKHNlZSBhbHNvIFFDVS9EQ1UgZnVuY3Rpb25zKQotICovCi1pbnQgYXRoNWtfaHdfcHV0X3R4X2J1ZihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUsIHUzMiBwaHlzX2FkZHIpCi17Ci0JdTE2IHR4X3JlZzsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JQVI1S19BU1NFUlRfRU5UUlkocXVldWUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSk7Ci0KLQkvKgotCSAqIFNldCB0aGUgdHJhbnNtaXQgcXVldWUgZGVzY3JpcHRvciBwb2ludGVyIHJlZ2lzdGVyIGJ5IHR5cGUKLQkgKiBvbiA1MjEwCi0JICovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCXN3aXRjaCAoYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUpIHsKLQkJY2FzZSBBUjVLX1RYX1FVRVVFX0RBVEE6Ci0JCQl0eF9yZWcgPSBBUjVLX05PUUNVX1RYRFAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9CRUFDT046Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9DQUI6Ci0JCQl0eF9yZWcgPSBBUjVLX05PUUNVX1RYRFAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFNldCB0aGUgdHJhbnNtaXQgcXVldWUgZGVzY3JpcHRvciBwb2ludGVyIGZvcgotCQkgKiB0aGUgc2VsZWN0ZWQgcXVldWUgb24gUUNVIGZvciA1MjExKwotCQkgKiAodGhpcyB3b24ndCB3b3JrIGlmIHRoZSBxdWV1ZSBpcyBzdGlsbCBhY3RpdmUpCi0JCSAqLwotCQlpZiAoQVI1S19SRUdfUkVBRF9RKGFoLCBBUjVLX1FDVV9UWEUsIHF1ZXVlKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCXR4X3JlZyA9IEFSNUtfUVVFVUVfVFhEUChxdWV1ZSk7Ci0JfQotCi0JLyogU2V0IGRlc2NyaXB0b3IgcG9pbnRlciAqLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5c19hZGRyLCB0eF9yZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgdHggdHJpZ2dlciBsZXZlbAotICovCi1pbnQgYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGluY3JlYXNlKQotewotCXUzMiB0cmlnZ2VyX2xldmVsLCBpbXI7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyoKLQkgKiBEaXNhYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgbWFzawotCSAqLwotCWltciA9IGF0aDVrX2h3X3NldF9pbnRyKGFoLCBhaC0+YWhfaW1yICYgfkFSNUtfSU5UX0dMT0JBTCk7Ci0KLQkvKlRPRE86IEJvdW5kYXJ5IGNoZWNrIG9uIHRyaWdnZXJfbGV2ZWwqLwotCXRyaWdnZXJfbGV2ZWwgPSBBUjVLX1JFR19NUyhhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19UWENGRyksCi0JCQlBUjVLX1RYQ0ZHX1RYRlVMTCk7Ci0KLQlpZiAoIWluY3JlYXNlKSB7Ci0JCWlmICgtLXRyaWdnZXJfbGV2ZWwgPCBBUjVLX1RVTkVfTUlOX1RYX0ZJRk9fVEhSRVMpCi0JCQlnb3RvIGRvbmU7Ci0JfSBlbHNlCi0JCXRyaWdnZXJfbGV2ZWwgKz0KLQkJCSgoQVI1S19UVU5FX01BWF9UWF9GSUZPX1RIUkVTIC0gdHJpZ2dlcl9sZXZlbCkgLyAyKTsKLQotCS8qCi0JICogVXBkYXRlIHRyaWdnZXIgbGV2ZWwgb24gc3VjY2VzcwotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0cmlnZ2VyX2xldmVsLCBBUjVLX1RSSUdfTFZMKTsKLQllbHNlCi0JCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfVFhDRkcsCi0JCQkJQVI1S19UWENGR19UWEZVTEwsIHRyaWdnZXJfbGV2ZWwpOwotCi0JcmV0ID0gMDsKLQotZG9uZToKLQkvKgotCSAqIFJlc3RvcmUgaW50ZXJydXB0IG1hc2sKLQkgKi8KLQlhdGg1a19od19zZXRfaW50cihhaCwgaW1yKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJbnRlcnJ1cHQgaGFuZGxpbmcKLSAqLwotCi0vKgotICogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMKLSAqLwotYm9vbCBhdGg1a19od19pc19pbnRyX3BlbmRpbmcoc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JTlRQRU5EKTsKLX0KLQotLyoKLSAqIEdldCBpbnRlcnJ1cHQgbWFzayAoSVNSKQotICovCi1pbnQgYXRoNWtfaHdfZ2V0X2lzcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX2ludCAqaW50ZXJydXB0X21hc2spCi17Ci0JdTMyIGRhdGE7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyoKLQkgKiBSZWFkIGludGVycnVwdCBzdGF0dXMgZnJvbSB0aGUgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlcgotCSAqIG9uIDUyMTAKLQkgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lTUik7Ci0JCWlmICh1bmxpa2VseShkYXRhID09IEFSNUtfSU5UX05PQ0FSRCkpIHsKLQkJCSppbnRlcnJ1cHRfbWFzayA9IGRhdGE7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBSZWFkLUFuZC1DbGVhciBzaGFkb3cgcmVnaXN0ZXIKLQkJICogTm90ZTogUElTUi9TSVNSIE5vdCBhdmFpbGFibGUgb24gNTIxMAotCQkgKi8KLQkJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19QSVNSKTsKLQl9Ci0KLQkvKgotCSAqIEdldCBhYnN0cmFjdCBpbnRlcnJ1cHQgbWFzayAoZHJpdmVyLWNvbXBhdGlibGUpCi0JICovCi0JKmludGVycnVwdF9tYXNrID0gKGRhdGEgJiBBUjVLX0lOVF9DT01NT04pICYgYWgtPmFoX2ltcjsKLQotCWlmICh1bmxpa2VseShkYXRhID09IEFSNUtfSU5UX05PQ0FSRCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGRhdGEgJiAoQVI1S19JU1JfUlhPSyB8IEFSNUtfSVNSX1JYRVJSKSkKLQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1JYOwotCi0JaWYgKGRhdGEgJiAoQVI1S19JU1JfVFhPSyB8IEFSNUtfSVNSX1RYRVJSCi0JCXwgQVI1S19JU1JfVFhERVNDIHwgQVI1S19JU1JfVFhFT0wpKQotCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfVFg7Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKLQkJLypISVUgPSBIb3N0IEludGVyZmFjZSBVbml0IChQQ0kgZXRjKSovCi0JCWlmICh1bmxpa2VseShkYXRhICYgKEFSNUtfSVNSX0hJVUVSUikpKQotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0ZBVEFMOwotCi0JCS8qQmVhY29uIE5vdCBSZWFkeSovCi0JCWlmICh1bmxpa2VseShkYXRhICYgKEFSNUtfSVNSX0JOUikpKQotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0JOUjsKLQl9Ci0KLQkvKgotCSAqIFhYWDogQk1JU1MgaW50ZXJydXB0cyBtYXkgb2NjdXIgYWZ0ZXIgYXNzb2NpYXRpb24uCi0JICogSSBmb3VuZCB0aGlzIG9uIDUyMTAgY29kZSBidXQgaXQgbmVlZHMgdGVzdGluZy4gSWYgdGhpcyBpcwotCSAqIHRydWUgd2Ugc2hvdWxkIGRpc2FibGUgdGhlbSBiZWZvcmUgYXNzb2MgYW5kIHJlLWVuYWJsZSB0aGVtCi0JICogYWZ0ZXIgYSBzdWNjZXNzZnVsbCBhc3NvYyArIHNvbWUgamlmZmllcy4KLQkgKi8KLSNpZiAwCi0JaW50ZXJydXB0X21hc2sgJj0gfkFSNUtfSU5UX0JNSVNTOwotI2VuZGlmCi0KLQkvKgotCSAqIEluIGNhc2Ugd2UgZGlkbid0IGhhbmRsZSBhbnl0aGluZywKLQkgKiBwcmludCB0aGUgcmVnaXN0ZXIgdmFsdWUuCi0JICovCi0JaWYgKHVubGlrZWx5KCppbnRlcnJ1cHRfbWFzayA9PSAwICYmIG5ldF9yYXRlbGltaXQoKSkpCi0JCUFUSDVLX1BSSU5URigiMHglMDh4XG4iLCBkYXRhKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IGludGVycnVwdCBtYXNrCi0gKi8KLWVudW0gYXRoNWtfaW50IGF0aDVrX2h3X3NldF9pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50IG5ld19tYXNrKQotewotCWVudW0gYXRoNWtfaW50IG9sZF9tYXNrLCBpbnRfbWFzazsKLQotCS8qCi0JICogRGlzYWJsZSBjYXJkIGludGVycnVwdHMgdG8gcHJldmVudCBhbnkgcmFjZSBjb25kaXRpb25zCi0JICogKHRoZXkgd2lsbCBiZSByZS1lbmFibGVkIGFmdGVyd2FyZHMpLgotCSAqLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19JRVJfRElTQUJMRSwgQVI1S19JRVIpOwotCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lFUik7Ci0KLQlvbGRfbWFzayA9IGFoLT5haF9pbXI7Ci0KLQkvKgotCSAqIEFkZCBhZGRpdGlvbmFsLCBjaGlwc2V0LWRlcGVuZGVudCBpbnRlcnJ1cHQgbWFzayBmbGFncwotCSAqIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBJTVIgKGludGVycnVwdCBtYXNrIHJlZ2lzdGVyKS4KLQkgKi8KLQlpbnRfbWFzayA9IG5ld19tYXNrICYgQVI1S19JTlRfQ09NTU9OOwotCi0JaWYgKG5ld19tYXNrICYgQVI1S19JTlRfUlgpCi0JCWludF9tYXNrIHw9IEFSNUtfSU1SX1JYT0sgfCBBUjVLX0lNUl9SWEVSUiB8IEFSNUtfSU1SX1JYT1JOIHwKLQkJCUFSNUtfSU1SX1JYREVTQzsKLQotCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX1RYKQotCQlpbnRfbWFzayB8PSBBUjVLX0lNUl9UWE9LIHwgQVI1S19JTVJfVFhFUlIgfCBBUjVLX0lNUl9UWERFU0MgfAotCQkJQVI1S19JTVJfVFhVUk47Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKLQkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfRkFUQUwpIHsKLQkJCWludF9tYXNrIHw9IEFSNUtfSU1SX0hJVUVSUjsKLQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1NJTVIyLCBBUjVLX1NJTVIyX01DQUJUIHwKLQkJCQkJQVI1S19TSU1SMl9TU0VSUiB8IEFSNUtfU0lNUjJfRFBFUlIpOwotCQl9Ci0JfQotCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBpbnRfbWFzaywgQVI1S19QSU1SKTsKLQotCS8qIFN0b3JlIG5ldyBpbnRlcnJ1cHQgbWFzayAqLwotCWFoLT5haF9pbXIgPSBuZXdfbWFzazsKLQotCS8qIC4ucmUtZW5hYmxlIGludGVycnVwdHMgKi8KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfSUVSX0VOQUJMRSwgQVI1S19JRVIpOwotCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lFUik7Ci0KLQlyZXR1cm4gb2xkX21hc2s7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKipcCi0gIEVFUFJPTSBhY2Nlc3MgZnVuY3Rpb25zCi1cKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFJlYWQgZnJvbSBlZXByb20KLSAqLwotc3RhdGljIGludCBhdGg1a19od19lZXByb21fcmVhZChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgb2Zmc2V0LCB1MTYgKmRhdGEpCi17Ci0JdTMyIHN0YXR1cywgdGltZW91dDsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JLyoKLQkgKiBJbml0aWFsaXplIEVFUFJPTSBhY2Nlc3MKLQkgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBBUjVLX1BDSUNGR19FRUFFKTsKLQkJKHZvaWQpYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfRUVQUk9NX0JBU0UgKyAoNCAqIG9mZnNldCkpOwotCX0gZWxzZSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgb2Zmc2V0LCBBUjVLX0VFUFJPTV9CQVNFKTsKLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfRUVQUk9NX0NNRCwKLQkJCQlBUjVLX0VFUFJPTV9DTURfUkVBRCk7Ci0JfQotCi0JZm9yICh0aW1lb3V0ID0gQVI1S19UVU5FX1JFR0lTVEVSX1RJTUVPVVQ7IHRpbWVvdXQgPiAwOyB0aW1lb3V0LS0pIHsKLQkJc3RhdHVzID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfRUVQUk9NX1NUQVRVUyk7Ci0JCWlmIChzdGF0dXMgJiBBUjVLX0VFUFJPTV9TVEFUX1JERE9ORSkgewotCQkJaWYgKHN0YXR1cyAmIEFSNUtfRUVQUk9NX1NUQVRfUkRFUlIpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQkqZGF0YSA9ICh1MTYpKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0VFUFJPTV9EQVRBKSAmCi0JCQkJCTB4ZmZmZik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl1ZGVsYXkoMTUpOwotCX0KLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi0vKgotICogV3JpdGUgdG8gZWVwcm9tIC0gY3VycmVudGx5IGRpc2FibGVkLCB1c2UgYXQgeW91ciBvd24gcmlzawotICovCi0jaWYgMAotc3RhdGljIGludCBhdGg1a19od19lZXByb21fd3JpdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIG9mZnNldCwgdTE2IGRhdGEpCi17Ci0KLQl1MzIgc3RhdHVzLCB0aW1lb3V0OwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSBlZXByb20gYWNjZXNzCi0JICovCi0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBBUjVLX1BDSUNGR19FRUFFKTsKLQl9IGVsc2UgewotCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19FRVBST01fQ01ELAotCQkJCUFSNUtfRUVQUk9NX0NNRF9SRVNFVCk7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZSBkYXRhIHRvIGRhdGEgcmVnaXN0ZXIKLQkgKi8KLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfRUVQUk9NX0JBU0UgKyAoNCAqIG9mZnNldCkpOwotCX0gZWxzZSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgb2Zmc2V0LCBBUjVLX0VFUFJPTV9CQVNFKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX0VFUFJPTV9EQVRBKTsKLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfRUVQUk9NX0NNRCwKLQkJCQlBUjVLX0VFUFJPTV9DTURfV1JJVEUpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgc3RhdHVzCi0JICovCi0KLQlmb3IgKHRpbWVvdXQgPSBBUjVLX1RVTkVfUkVHSVNURVJfVElNRU9VVDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgewotCQlzdGF0dXMgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19FRVBST01fU1RBVFVTKTsKLQkJaWYgKHN0YXR1cyAmIEFSNUtfRUVQUk9NX1NUQVRfV1JET05FKSB7Ci0JCQlpZiAoc3RhdHVzICYgQVI1S19FRVBST01fU1RBVF9XUkVSUikKLQkJCQlyZXR1cm4gRUlPOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJdWRlbGF5KDE1KTsKLQl9Ci0KLQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiRUVQUk9NIFdyaXRlIGlzIGRpc2FibGVkISIpOwotCXJldHVybiAtRUlPOwotfQotI2VuZGlmCi0KLS8qCi0gKiBUcmFuc2xhdGUgYmluYXJ5IGNoYW5uZWwgcmVwcmVzZW50YXRpb24gaW4gRUVQUk9NIHRvIGZyZXF1ZW5jeQotICovCi1zdGF0aWMgdTE2IGF0aDVrX2VlcHJvbV9iaW4yZnJlcShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgYmluLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MTYgdmFsOwotCi0JaWYgKGJpbiA9PSBBUjVLX0VFUFJPTV9DSEFOTkVMX0RJUykKLQkJcmV0dXJuIGJpbjsKLQotCWlmIChtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFBKSB7Ci0JCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQotCQkJdmFsID0gKDUgKiBiaW4pICsgNDgwMDsKLQkJZWxzZQotCQkJdmFsID0gYmluID4gNjIgPyAoMTAgKiA2MikgKyAoNSAqIChiaW4gLSA2MikpICsgNTEwMCA6Ci0JCQkJKGJpbiAqIDEwKSArIDUxMDA7Ci0JfSBlbHNlIHsKLQkJaWYgKGFoLT5haF9lZV92ZXJzaW9uID4gQVI1S19FRVBST01fVkVSU0lPTl8zXzIpCi0JCQl2YWwgPSBiaW4gKyAyMzAwOwotCQllbHNlCi0JCQl2YWwgPSBiaW4gKyAyNDAwOwotCX0KLQotCXJldHVybiB2YWw7Ci19Ci0KLS8qCi0gKiBSZWFkIGFudGVubmEgaW5mb3MgZnJvbSBlZXByb20KLSAqLwotc3RhdGljIGludCBhdGg1a19lZXByb21fcmVhZF9hbnRzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiAqb2Zmc2V0LAotCQl1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKLQl1MzIgbyA9ICpvZmZzZXQ7Ci0JdTE2IHZhbDsKLQlpbnQgcmV0LCBpID0gMDsKLQotCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwotCWVlLT5lZV9zd2l0Y2hfc2V0dGxpbmdbbW9kZV0JPSAodmFsID4+IDgpICYgMHg3ZjsKLQllZS0+ZWVfYW50X3R4X3J4W21vZGVdCQk9ICh2YWwgPj4gMikgJiAweDNmOwotCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpXQk9ICh2YWwgPDwgNCkgJiAweDNmOwotCi0JQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JfD0gKHZhbCA+PiAxMikgJiAweGY7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDYpICYgMHgzZjsKLQllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9IHZhbCAmIDB4M2Y7Ci0KLQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKLQllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gMTApICYgMHgzZjsKLQllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gNCkgJiAweDNmOwotCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpXQk9ICh2YWwgPDwgMikgJiAweDNmOwotCi0JQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JfD0gKHZhbCA+PiAxNCkgJiAweDM7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDgpICYgMHgzZjsKLQllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9ICh2YWwgPj4gMikgJiAweDNmOwotCWVlLT5lZV9hbnRfY29udHJvbFttb2RlXVtpXQk9ICh2YWwgPDwgNCkgJiAweDNmOwotCi0JQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JfD0gKHZhbCA+PiAxMikgJiAweGY7Ci0JZWUtPmVlX2FudF9jb250cm9sW21vZGVdW2krK10JPSAodmFsID4+IDYpICYgMHgzZjsKLQllZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1baSsrXQk9IHZhbCAmIDB4M2Y7Ci0KLQkvKiBHZXQgYW50ZW5uYSBtb2RlcyAqLwotCWFoLT5haF9hbnRlbm5hW21vZGVdWzBdID0KLQkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVswXSA8PCA0KSB8IDB4MTsKLQlhaC0+YWhfYW50ZW5uYVttb2RlXVtBUjVLX0FOVF9GSVhFRF9BXSA9Ci0JICAgICBlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bMV0gCXwKLQkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVsyXSA8PCA2KSAJfAotCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzNdIDw8IDEyKSB8Ci0JICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bNF0gPDwgMTgpIHwKLQkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs1XSA8PCAyNCk7Ci0JYWgtPmFoX2FudGVubmFbbW9kZV1bQVI1S19BTlRfRklYRURfQl0gPQotCSAgICAgZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzZdIAl8Ci0JICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bN10gPDwgNikgCXwKLQkgICAgKGVlLT5lZV9hbnRfY29udHJvbFttb2RlXVs4XSA8PCAxMikgfAotCSAgICAoZWUtPmVlX2FudF9jb250cm9sW21vZGVdWzldIDw8IDE4KSB8Ci0JICAgIChlZS0+ZWVfYW50X2NvbnRyb2xbbW9kZV1bMTBdIDw8IDI0KTsKLQotCS8qIHJldHVybiBuZXcgb2Zmc2V0ICovCi0JKm9mZnNldCA9IG87Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlYWQgc3VwcG9ydGVkIG1vZGVzIGZyb20gZWVwcm9tCi0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfZWVwcm9tX3JlYWRfbW9kZXMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyICpvZmZzZXQsCi0JCXVuc2lnbmVkIGludCBtb2RlKQotewotCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwotCXUzMiBvID0gKm9mZnNldDsKLQl1MTYgdmFsOwotCWludCByZXQ7Ci0KLQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKLQllZS0+ZWVfdHhfZW5kMnhsbmFfZW5hYmxlW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JZWUtPmVlX3Rocl82Mlttb2RlXQkJPSB2YWwgJiAweGZmOwotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uIDw9IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQotCQllZS0+ZWVfdGhyXzYyW21vZGVdID0gbW9kZSA9PSBBUjVLX0VFUFJPTV9NT0RFXzExQSA/IDE1IDogMjg7Ci0KLQlBUjVLX0VFUFJPTV9SRUFEKG8rKywgdmFsKTsKLQllZS0+ZWVfdHhfZW5kMnhwYV9kaXNhYmxlW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JZWUtPmVlX3R4X2ZybTJ4cGFfZW5hYmxlW21vZGVdCT0gdmFsICYgMHhmZjsKLQotCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwotCWVlLT5lZV9wZ2FfZGVzaXJlZF9zaXplW21vZGVdCT0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0KLQlpZiAoKHZhbCAmIDB4ZmYpICYgMHg4MCkKLQkJZWUtPmVlX25vaXNlX2Zsb29yX3Roclttb2RlXSA9IC0oKCgodmFsICYgMHhmZikgXiAweGZmKSkgKyAxKTsKLQllbHNlCi0JCWVlLT5lZV9ub2lzZV9mbG9vcl90aHJbbW9kZV0gPSB2YWwgJiAweGZmOwotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uIDw9IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18yKQotCQllZS0+ZWVfbm9pc2VfZmxvb3JfdGhyW21vZGVdID0KLQkJICAgIG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEgPyAtNTQgOiAtMTsKLQotCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwotCWVlLT5lZV94bG5hX2dhaW5bbW9kZV0JCT0gKHZhbCA+PiA1KSAmIDB4ZmY7Ci0JZWUtPmVlX3hfZ2Fpblttb2RlXQkJPSAodmFsID4+IDEpICYgMHhmOwotCWVlLT5lZV94cGRbbW9kZV0JCT0gdmFsICYgMHgxOwotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKQotCQllZS0+ZWVfZml4ZWRfYmlhc1ttb2RlXSA9ICh2YWwgPj4gMTMpICYgMHgxOwotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18zKSB7Ci0JCUFSNUtfRUVQUk9NX1JFQUQobysrLCB2YWwpOwotCQllZS0+ZWVfZmFsc2VfZGV0ZWN0W21vZGVdID0gKHZhbCA+PiA2KSAmIDB4N2Y7Ci0KLQkJaWYgKG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEpCi0JCQllZS0+ZWVfeHJfcG93ZXJbbW9kZV0gPSB2YWwgJiAweDNmOwotCQllbHNlIHsKLQkJCWVlLT5lZV9vYlttb2RlXVswXSA9IHZhbCAmIDB4NzsKLQkJCWVlLT5lZV9kYlttb2RlXVswXSA9ICh2YWwgPj4gMykgJiAweDc7Ci0JCX0KLQl9Ci0KLQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfNCkgewotCQllZS0+ZWVfaV9nYWluW21vZGVdID0gQVI1S19FRVBST01fSV9HQUlOOwotCQllZS0+ZWVfY2NrX29mZG1fcG93ZXJfZGVsdGEgPSBBUjVLX0VFUFJPTV9DQ0tfT0ZETV9ERUxUQTsKLQl9IGVsc2UgewotCQllZS0+ZWVfaV9nYWluW21vZGVdID0gKHZhbCA+PiAxMykgJiAweDc7Ci0KLQkJQVI1S19FRVBST01fUkVBRChvKyssIHZhbCk7Ci0JCWVlLT5lZV9pX2dhaW5bbW9kZV0gfD0gKHZhbCA8PCAzKSAmIDB4Mzg7Ci0KLQkJaWYgKG1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUcpCi0JCQllZS0+ZWVfY2NrX29mZG1fcG93ZXJfZGVsdGEgPSAodmFsID4+IDMpICYgMHhmZjsKLQl9Ci0KLQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzAgJiYKLQkJCW1vZGUgPT0gQVI1S19FRVBST01fTU9ERV8xMUEpIHsKLQkJZWUtPmVlX2lfY2FsW21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7Ci0JCWVlLT5lZV9xX2NhbFttb2RlXSA9ICh2YWwgPj4gMykgJiAweDFmOwotCX0KLQotCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNiAmJgotCSAgICBtb2RlID09IEFSNUtfRUVQUk9NX01PREVfMTFHKQotCQllZS0+ZWVfc2NhbGVkX2Nja19kZWx0YSA9ICh2YWwgPj4gMTEpICYgMHgxZjsKLQotCS8qIHJldHVybiBuZXcgb2Zmc2V0ICovCi0JKm9mZnNldCA9IG87Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgZWVwcm9tICYgY2FwYWJpbGl0aWVzIHN0cnVjdHMKLSAqLwotc3RhdGljIGludCBhdGg1a19lZXByb21faW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwotCXVuc2lnbmVkIGludCBtb2RlLCBpOwotCWludCByZXQ7Ci0JdTMyIG9mZnNldDsKLQl1MTYgdmFsOwotCi0JLyogSW5pdGlhbCBUWCB0aGVybWFsIGFkanVzdG1lbnQgdmFsdWVzICovCi0JZWUtPmVlX3R4X2NsaXAgPSA0OwotCWVlLT5lZV9wd2RfODQgPSBlZS0+ZWVfcHdkXzkwID0gMTsKLQllZS0+ZWVfZ2Fpbl9zZWxlY3QgPSAxOwotCi0JLyoKLQkgKiBSZWFkIHZhbHVlcyBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKLQkgKi8KLQlBUjVLX0VFUFJPTV9SRUFEX0hEUihBUjVLX0VFUFJPTV9NQUdJQywgZWVfbWFnaWMpOwotCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX1BST1RFQ1QsIGVlX3Byb3RlY3QpOwotCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX1JFR19ET01BSU4sIGVlX3JlZ2RvbWFpbik7Ci0JQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fVkVSU0lPTiwgZWVfdmVyc2lvbik7Ci0JQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fSERSLCBlZV9oZWFkZXIpOwotCi0JLyogUmV0dXJuIGlmIHdlIGhhdmUgYW4gb2xkIEVFUFJPTSAqLwotCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA8IEFSNUtfRUVQUk9NX1ZFUlNJT05fM18wKQotCQlyZXR1cm4gMDsKLQotI2lmZGVmIG5vdHlldAotCS8qCi0JICogVmFsaWRhdGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBFRVBST00gZGF0ZS4gVGhlcmUgYXJlIHNvbWUKLQkgKiBkZXZpY2VzIHdpdGggaW52YWxpZCBFRVBST01zLgotCSAqLwotCWZvciAoY2tzdW0gPSAwLCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBBUjVLX0VFUFJPTV9JTkZPX01BWDsgb2Zmc2V0KyspIHsKLQkJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9JTkZPKG9mZnNldCksIHZhbCk7Ci0JCWNrc3VtIF49IHZhbDsKLQl9Ci0JaWYgKGNrc3VtICE9IEFSNUtfRUVQUk9NX0lORk9fQ0tTVU0pIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgIkludmFsaWQgRUVQUk9NIGNoZWNrc3VtIDB4JTA0eFxuIiwgY2tzdW0pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0jZW5kaWYKLQotCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX0FOVF9HQUlOKGFoLT5haF9lZV92ZXJzaW9uKSwKLQkgICAgZWVfYW50X2dhaW4pOwotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uID49IEFSNUtfRUVQUk9NX1ZFUlNJT05fNF8wKSB7Ci0JCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0MwLCBlZV9taXNjMCk7Ci0JCUFSNUtfRUVQUk9NX1JFQURfSERSKEFSNUtfRUVQUk9NX01JU0MxLCBlZV9taXNjMSk7Ci0JfQotCi0JaWYgKGFoLT5haF9lZV92ZXJzaW9uIDwgQVI1S19FRVBST01fVkVSU0lPTl8zXzMpIHsKLQkJQVI1S19FRVBST01fUkVBRChBUjVLX0VFUFJPTV9PQkRCMF8yR0haLCB2YWwpOwotCQllZS0+ZWVfb2JbQVI1S19FRVBST01fTU9ERV8xMUJdWzBdID0gdmFsICYgMHg3OwotCQllZS0+ZWVfZGJbQVI1S19FRVBST01fTU9ERV8xMUJdWzBdID0gKHZhbCA+PiAzKSAmIDB4NzsKLQotCQlBUjVLX0VFUFJPTV9SRUFEKEFSNUtfRUVQUk9NX09CREIxXzJHSFosIHZhbCk7Ci0JCWVlLT5lZV9vYltBUjVLX0VFUFJPTV9NT0RFXzExR11bMF0gPSB2YWwgJiAweDc7Ci0JCWVlLT5lZV9kYltBUjVLX0VFUFJPTV9NT0RFXzExR11bMF0gPSAodmFsID4+IDMpICYgMHg3OwotCX0KLQotCS8qCi0JICogR2V0IGNvbmZvcm1hbmNlIHRlc3QgbGltaXQgdmFsdWVzCi0JICovCi0Jb2Zmc2V0ID0gQVI1S19FRVBST01fQ1RMKGFoLT5haF9lZV92ZXJzaW9uKTsKLQllZS0+ZWVfY3RscyA9IEFSNUtfRUVQUk9NX05fQ1RMUyhhaC0+YWhfZWVfdmVyc2lvbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZWUtPmVlX2N0bHM7IGkrKykgewotCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOwotCQllZS0+ZWVfY3RsW2ldID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JCWVlLT5lZV9jdGxbaSArIDFdID0gdmFsICYgMHhmZjsKLQl9Ci0KLQkvKgotCSAqIEdldCB2YWx1ZXMgZm9yIDgwMi4xMWEgKDVHSHopCi0JICovCi0JbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFBOwotCi0JZWUtPmVlX3R1cmJvX21heF9wb3dlclttb2RlXSA9Ci0JCQlBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShlZS0+ZWVfaGVhZGVyKTsKLQotCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExQShhaC0+YWhfZWVfdmVyc2lvbik7Ci0KLQlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOwotCWVlLT5lZV9vYlttb2RlXVszXQkJPSAodmFsID4+IDUpICYgMHg3OwotCWVlLT5lZV9kYlttb2RlXVszXQkJPSAodmFsID4+IDIpICYgMHg3OwotCWVlLT5lZV9vYlttb2RlXVsyXQkJPSAodmFsIDw8IDEpICYgMHg3OwotCi0JQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQllZS0+ZWVfb2JbbW9kZV1bMl0JCXw9ICh2YWwgPj4gMTUpICYgMHgxOwotCWVlLT5lZV9kYlttb2RlXVsyXQkJPSAodmFsID4+IDEyKSAmIDB4NzsKLQllZS0+ZWVfb2JbbW9kZV1bMV0JCT0gKHZhbCA+PiA5KSAmIDB4NzsKLQllZS0+ZWVfZGJbbW9kZV1bMV0JCT0gKHZhbCA+PiA2KSAmIDB4NzsKLQllZS0+ZWVfb2JbbW9kZV1bMF0JCT0gKHZhbCA+PiAzKSAmIDB4NzsKLQllZS0+ZWVfZGJbbW9kZV1bMF0JCT0gdmFsICYgMHg3OwotCi0JcmV0ID0gYXRoNWtfZWVwcm9tX3JlYWRfbW9kZXMoYWgsICZvZmZzZXQsIG1vZGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpIHsKLQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQkJZWUtPmVlX21hcmdpbl90eF9yeFttb2RlXSA9IHZhbCAmIDB4M2Y7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdmFsdWVzIGZvciA4MDIuMTFiICgyLjRHSHopCi0JICovCi0JbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFCOwotCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExQihhaC0+YWhfZWVfdmVyc2lvbik7Ci0KLQlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOwotCWVlLT5lZV9vYlttb2RlXVsxXQkJPSAodmFsID4+IDQpICYgMHg3OwotCWVlLT5lZV9kYlttb2RlXVsxXQkJPSB2YWwgJiAweDc7Ci0KLQlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9tb2RlcyhhaCwgJm9mZnNldCwgbW9kZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkgewotCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOwotCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMF0gPQotCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKLQkJZWUtPmVlX2NhbF9waWVyW21vZGVdWzFdID0KLQkJCWF0aDVrX2VlcHJvbV9iaW4yZnJlcShhaCwgKHZhbCA+PiA4KSAmIDB4ZmYsIG1vZGUpOwotCi0JCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7Ci0JCWVlLT5lZV9jYWxfcGllclttb2RlXVsyXSA9Ci0JCQlhdGg1a19lZXByb21fYmluMmZyZXEoYWgsIHZhbCAmIDB4ZmYsIG1vZGUpOwotCX0KLQotCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMSkKLQkJZWUtPmVlX21hcmdpbl90eF9yeFttb2RlXSA9ICh2YWwgPj4gOCkgJiAweDNmOwotCi0JLyoKLQkgKiBHZXQgdmFsdWVzIGZvciA4MDIuMTFnICgyLjRHSHopCi0JICovCi0JbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOwotCW9mZnNldCA9IEFSNUtfRUVQUk9NX01PREVTXzExRyhhaC0+YWhfZWVfdmVyc2lvbik7Ci0KLQlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9hbnRzKGFoLCAmb2Zmc2V0LCBtb2RlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQllZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVttb2RlXQk9IChzOCkoKHZhbCA+PiA4KSAmIDB4ZmYpOwotCWVlLT5lZV9vYlttb2RlXVsxXQkJPSAodmFsID4+IDQpICYgMHg3OwotCWVlLT5lZV9kYlttb2RlXVsxXQkJPSB2YWwgJiAweDc7Ci0KLQlyZXQgPSBhdGg1a19lZXByb21fcmVhZF9tb2RlcyhhaCwgJm9mZnNldCwgbW9kZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMCkgewotCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOwotCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMF0gPQotCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKLQkJZWUtPmVlX2NhbF9waWVyW21vZGVdWzFdID0KLQkJCWF0aDVrX2VlcHJvbV9iaW4yZnJlcShhaCwgKHZhbCA+PiA4KSAmIDB4ZmYsIG1vZGUpOwotCi0JCUFSNUtfRUVQUk9NX1JFQUQob2Zmc2V0KyssIHZhbCk7Ci0JCWVlLT5lZV90dXJib19tYXhfcG93ZXJbbW9kZV0gPSB2YWwgJiAweDdmOwotCQllZS0+ZWVfeHJfcG93ZXJbbW9kZV0gPSAodmFsID4+IDcpICYgMHgzZjsKLQotCQlBUjVLX0VFUFJPTV9SRUFEKG9mZnNldCsrLCB2YWwpOwotCQllZS0+ZWVfY2FsX3BpZXJbbW9kZV1bMl0gPQotCQkJYXRoNWtfZWVwcm9tX2JpbjJmcmVxKGFoLCB2YWwgJiAweGZmLCBtb2RlKTsKLQotCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCi0JCQllZS0+ZWVfbWFyZ2luX3R4X3J4W21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7Ci0KLQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQkJZWUtPmVlX2lfY2FsW21vZGVdID0gKHZhbCA+PiA4KSAmIDB4M2Y7Ci0JCWVlLT5lZV9xX2NhbFttb2RlXSA9ICh2YWwgPj4gMykgJiAweDFmOwotCi0JCWlmIChhaC0+YWhfZWVfdmVyc2lvbiA+PSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMikgewotCQkJQVI1S19FRVBST01fUkVBRChvZmZzZXQrKywgdmFsKTsKLQkJCWVlLT5lZV9jY2tfb2ZkbV9nYWluX2RlbHRhID0gdmFsICYgMHhmZjsKLQkJfQotCX0KLQotCS8qCi0JICogUmVhZCA1R0h6IEVFUFJPTSBjaGFubmVscwotCSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIGVlcHJvbQotICovCi1zdGF0aWMgaW50IGF0aDVrX2VlcHJvbV9yZWFkX21hYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqbWFjKQotewotCXU4IG1hY19kW0VUSF9BTEVOXTsKLQl1MzIgdG90YWwsIG9mZnNldDsKLQl1MTYgZGF0YTsKLQlpbnQgb2N0ZXQsIHJldDsKLQotCW1lbXNldChtYWMsIDAsIEVUSF9BTEVOKTsKLQltZW1zZXQobWFjX2QsIDAsIEVUSF9BTEVOKTsKLQotCXJldCA9IGF0aDVrX2h3X2VlcHJvbV9yZWFkKGFoLCAweDIwLCAmZGF0YSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWZvciAob2Zmc2V0ID0gMHgxZiwgb2N0ZXQgPSAwLCB0b3RhbCA9IDA7IG9mZnNldCA+PSAweDFkOyBvZmZzZXQtLSkgewotCQlyZXQgPSBhdGg1a19od19lZXByb21fcmVhZChhaCwgb2Zmc2V0LCAmZGF0YSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXRvdGFsICs9IGRhdGE7Ci0JCW1hY19kW29jdGV0ICsgMV0gPSBkYXRhICYgMHhmZjsKLQkJbWFjX2Rbb2N0ZXRdID0gZGF0YSA+PiA4OwotCQlvY3RldCArPSAyOwotCX0KLQotCW1lbWNweShtYWMsIG1hY19kLCBFVEhfQUxFTik7Ci0KLQlpZiAoIXRvdGFsIHx8IHRvdGFsID09IDMgKiAweGZmZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGaWxsIHRoZSBjYXBhYmlsaXRpZXMgc3RydWN0Ci0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCXUxNiBlZV9oZWFkZXI7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCS8qIENhcGFiaWxpdGllcyBzdG9yZWQgaW4gdGhlIEVFUFJPTSAqLwotCWVlX2hlYWRlciA9IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbS5lZV9oZWFkZXI7Ci0KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJLyoKLQkJICogU2V0IHJhZGlvIGNhcGFiaWxpdGllcwotCQkgKiAoVGhlIEFSNTExMCBvbmx5IHN1cHBvcnRzIHRoZSBtaWRkbGUgNUdIeiBiYW5kKQotCQkgKi8KLQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfNWdoel9taW4gPSA1MTIwOwotCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV81Z2h6X21heCA9IDU0MzA7Ci0JCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzJnaHpfbWluID0gMDsKLQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9tYXggPSAwOwotCi0JCS8qIFNldCBzdXBwb3J0ZWQgbW9kZXMgKi8KLQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUEsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwotCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQV9UVVJCTywgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogWFhYIFRoZSB0cmFuY2VpdmVyIHN1cHBvcnRzIGZyZXF1ZW5jaWVzIGZyb20gNDkyMCB0byA2MTAwR0h6Ci0JCSAqIFhYWCBhbmQgZnJvbSAyMzEyIHRvIDI3MzJHSHouIFRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZQotCQkgKiBYWFggY3VycmVudCBpZWVlODAyMTEgaW1wbGVtZW50YXRpb24gYmVjYXVzZSB0aGUgSUVFRQotCQkgKiBYWFggY2hhbm5lbCBtYXBwaW5nIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgY2hhbm5lbAotCQkgKiBYWFggbnVtYmVycyAoMjMxMk1IeiBpcyBjaGFubmVsIC0xOSkuIE9mIGNvdXJzZSwgdGhpcwotCQkgKiBYWFggZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB0aGVzZSBjaGFubmVscyBhcmUgb3V0IG9mIHJhbmdlCi0JCSAqIFhYWCBidXQgc29tZSByZWd1bGF0aW9uIGRvbWFpbnMgbGlrZSBNS0sgKEphcGFuKSB3aWxsCi0JCSAqIFhYWCBzdXBwb3J0IGZyZXF1ZW5jaWVzIHNvbWV3aGVyZSBhcm91bmQgNC44R0h6LgotCQkgKi8KLQotCQkvKgotCQkgKiBTZXQgcmFkaW8gY2FwYWJpbGl0aWVzCi0JCSAqLwotCi0JCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFBKGVlX2hlYWRlcikpIHsKLQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3JhbmdlLnJhbmdlXzVnaHpfbWluID0gNTAwNTsgLyogNDkyMCAqLwotCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfNWdoel9tYXggPSA2MTAwOwotCi0JCQkvKiBTZXQgc3VwcG9ydGVkIG1vZGVzICovCi0JCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQSwKLQkJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7Ci0JCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQV9UVVJCTywKLQkJCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7Ci0JCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCi0JCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUdfVFVSQk8sCi0JCQkJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKTsKLQkJfQotCi0JCS8qIEVuYWJsZSAgODAyLjExYiBpZiBhIDJHSHogY2FwYWJsZSByYWRpbyAoMjExMS81MTEyKSBpcwotCQkgKiBjb25uZWN0ZWQgKi8KLQkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUIoZWVfaGVhZGVyKSB8fAotCQkJCUFSNUtfRUVQUk9NX0hEUl8xMUcoZWVfaGVhZGVyKSkgewotCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcmFuZ2UucmFuZ2VfMmdoel9taW4gPSAyNDEyOyAvKiAyMzEyICovCi0JCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21heCA9IDI3MzI7Ci0KLQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlX2hlYWRlcikpCi0JCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUIsCi0JCQkJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKTsKLQotCQkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUcoZWVfaGVhZGVyKSkKLQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExRywKLQkJCQkJCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwotCQl9Ci0JfQotCi0JLyogR1BJTyAqLwotCWFoLT5haF9ncGlvX25waW5zID0gQVI1S19OVU1fR1BJTzsKLQotCS8qIFNldCBudW1iZXIgb2Ygc3VwcG9ydGVkIFRYIHF1ZXVlcyAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkKLQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtID0KLQkJCUFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVTsKLQllbHNlCi0JCWFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSA9IEFSNUtfTlVNX1RYX1FVRVVFUzsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICBQcm90b2NvbCBDb250cm9sIFVuaXQgRnVuY3Rpb25zCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogU2V0IE9wZXJhdGlvbiBtb2RlCi0gKi8KLWludCBhdGg1a19od19zZXRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JdTMyIHBjdV9yZWcsIGJlYWNvbl9yZWcsIGxvd19pZCwgaGlnaF9pZDsKLQotCXBjdV9yZWcgPSAwOwotCWJlYWNvbl9yZWcgPSAwOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCXN3aXRjaCAoYWgtPmFoX29wX21vZGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6Ci0JCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX0FESE9DIHwgQVI1S19TVEFfSUQxX0RFU0NfQU5URU5OQSB8Ci0JCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwotCQkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgOiAwKTsKLQkJYmVhY29uX3JlZyB8PSBBUjVLX0JDUl9BREhPQzsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgotCQlwY3VfcmVnIHw9IEFSNUtfU1RBX0lEMV9BUCB8IEFSNUtfU1RBX0lEMV9SVFNfREVGX0FOVEVOTkEgfAotCQkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8KLQkJCQlBUjVLX1NUQV9JRDFfTk9fUFNQT0xMIDogMCk7Ci0JCWJlYWNvbl9yZWcgfD0gQVI1S19CQ1JfQVA7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSB8Ci0JCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwotCQkJCUFSNUtfU1RBX0lEMV9QV1JfU1YgOiAwKTsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01OVFI6Ci0JCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSB8Ci0JCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPwotCQkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgOiAwKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIFNldCBQQ1UgcmVnaXN0ZXJzCi0JICovCi0JbG93X2lkID0gQVI1S19MT1dfSUQoYWgtPmFoX3N0YV9pZCk7Ci0JaGlnaF9pZCA9IEFSNUtfSElHSF9JRChhaC0+YWhfc3RhX2lkKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19TVEFfSUQwKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBjdV9yZWcgfCBoaWdoX2lkLCBBUjVLX1NUQV9JRDEpOwotCi0JLyoKLQkgKiBTZXQgQmVhY29uIENvbnRyb2wgUmVnaXN0ZXIgb24gNTIxMAotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBiZWFjb25fcmVnLCBBUjVLX0JDUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEJTU0lEIEZ1bmN0aW9ucwotICovCi0KLS8qCi0gKiBHZXQgc3RhdGlvbiBpZAotICovCi12b2lkIGF0aDVrX2h3X2dldF9sbGFkZHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKm1hYykKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCW1lbWNweShtYWMsIGFoLT5haF9zdGFfaWQsIEVUSF9BTEVOKTsKLX0KLQotLyoKLSAqIFNldCBzdGF0aW9uIGlkCi0gKi8KLWludCBhdGg1a19od19zZXRfbGxhZGRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYWMpCi17Ci0JdTMyIGxvd19pZCwgaGlnaF9pZDsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JLyogU2V0IG5ldyBzdGF0aW9uIElEICovCi0JbWVtY3B5KGFoLT5haF9zdGFfaWQsIG1hYywgRVRIX0FMRU4pOwotCi0JbG93X2lkID0gQVI1S19MT1dfSUQobWFjKTsKLQloaWdoX2lkID0gQVI1S19ISUdIX0lEKG1hYyk7Ci0KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19TVEFfSUQwKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGhpZ2hfaWQsIEFSNUtfU1RBX0lEMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNldCBCU1NJRAotICovCi12b2lkIGF0aDVrX2h3X3NldF9hc3NvY2lkKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICpic3NpZCwgdTE2IGFzc29jX2lkKQotewotCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7Ci0JdTE2IHRpbV9vZmZzZXQgPSAwOwotCi0JLyoKLQkgKiBTZXQgc2ltcGxlIEJTU0lEIG1hc2sgb24gNTIxMgotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfQlNTX0lETTApOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfQlNTX0lETTEpOwotCX0KLQotCS8qCi0JICogU2V0IEJTU0lEIHdoaWNoIHRyaWdnZXJzIHRoZSAiU01FIEpvaW4iIG9wZXJhdGlvbgotCSAqLwotCWxvd19pZCA9IEFSNUtfTE9XX0lEKGJzc2lkKTsKLQloaWdoX2lkID0gQVI1S19ISUdIX0lEKGJzc2lkKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19CU1NfSUQwKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGhpZ2hfaWQgfCAoKGFzc29jX2lkICYgMHgzZmZmKSA8PAotCQkJCUFSNUtfQlNTX0lEMV9BSURfUyksIEFSNUtfQlNTX0lEMSk7Ci0KLQlpZiAoYXNzb2NfaWQgPT0gMCkgewotCQlhdGg1a19od19kaXNhYmxlX3BzcG9sbChhaCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX0JFQUNPTiwgQVI1S19CRUFDT05fVElNLAotCQkJdGltX29mZnNldCA/IHRpbV9vZmZzZXQgKyA0IDogMCk7Ci0KLQlhdGg1a19od19lbmFibGVfcHNwb2xsKGFoLCBOVUxMLCAwKTsKLX0KLS8qKgotICogYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2sgLSBzZXQgY29tbW9uIGJpdHMgd2Ugc2hvdWxkIGxpc3RlbiB0bwotICoKLSAqIFRoZSBic3NpZF9tYXNrIGlzIGEgdXRpbGl0eSB1c2VkIGJ5IEFSNTIxMiBoYXJkd2FyZSB0byBpbmZvcm0gdGhlIGhhcmR3YXJlCi0gKiB3aGljaCBiaXRzIG9mIHRoZSBpbnRlcmZhY2UncyBNQUMgYWRkcmVzcyBzaG91bGQgYmUgbG9va2VkIGF0IHdoZW4gdHJ5aW5nCi0gKiB0byBkZWNpZGUgd2hpY2ggcGFja2V0cyB0byBBQ0suIEluIHN0YXRpb24gbW9kZSBldmVyeSBiaXQgbWF0dGVycy4gSW4gQVAKLSAqIG1vZGUgd2l0aCBhIHNpbmdsZSBCU1MgZXZlcnkgYml0IG1hdHRlcnMgYXMgd2VsbC4gSW4gQVAgbW9kZSB3aXRoCi0gKiBtdWx0aXBsZSBCU1NlcyBub3QgZXZlcnkgYml0IG1hdHRlcnMuCi0gKgotICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwotICogQG1hc2s6IHRoZSBic3NpZF9tYXNrLCBhIHU4IGFycmF5IG9mIHNpemUgRVRIX0FMRU4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBpcyBhIHNpbXBsZSBmaWx0ZXIgYW5kICpkb2VzKiBub3QgZmlsdGVyIG91dCBhbGwKLSAqIHJlbGV2YW50IGZyYW1lcy4gU29tZSBub24tcmVsZXZhbnQgZnJhbWVzIHdpbGwgZ2V0IHRocm91Z2gsIHByb2JhYmlsaXR5Ci0gKiBqb2NrcyBhcmUgd2VsY29tZWQgdG8gY29tcHV0ZS4KLSAqCi0gKiBXaGVuIGhhbmRsaW5nIG11bHRpcGxlIEJTU2VzIChvciBWQVBzKSB5b3UgY2FuIGdldCB0aGUgQlNTSUQgbWFzayBieQotICogY29tcHV0aW5nIHRoZSBzZXQgb2Y6Ci0gKgotICogICAgIH4gKCBNQUMgWE9SIEJTU0lEICkKLSAqCi0gKiBXaGVuIHlvdSBkbyB0aGlzIHlvdSBhcmUgZXNzZW50aWFsbHkgY29tcHV0aW5nIHRoZSBjb21tb24gYml0cy4gTGF0ZXIgaXQKLSAqIGlzIGFzc3VtZWQgdGhlIGhhcndhcmUgd2lsbCAiYW5kIiAoJikgdGhlIEJTU0lEIG1hc2sgd2l0aCB0aGUgTUFDIGFkZHJlc3MKLSAqIHRvIG9idGFpbiB0aGUgcmVsZXZhbnQgYml0cyB3aGljaCBzaG91bGQgbWF0Y2ggb24gdGhlIGRlc3RpbmF0aW9uIGZyYW1lLgotICoKLSAqIFNpbXBsZSBleGFtcGxlOiBvbiB5b3VyIGNhcmQgeW91IGhhdmUgaGF2ZSB0d28gQlNTZXMgeW91IGhhdmUgY3JlYXRlZCB3aXRoCi0gKiBCU1NJRC0wMSBhbmQgQlNTSUQtMDIuIExldHMgYXNzdW1lIEJTU0lELTAxIHdpbGwgbm90IHVzZSB0aGUgTUFDIGFkZHJlc3MuCi0gKiBUaGVyZSBpcyBhbm90aGVyIEJTU0lELTAzIGJ1dCB5b3UgYXJlIG5vdCBwYXJ0IG9mIGl0LiBGb3Igc2ltcGxpY2l0eSdzIHNha2UsCi0gKiBhc3N1bWluZyBvbmx5IDQgYml0cyBmb3IgYSBtYWMgYWRkcmVzcyBhbmQgZm9yIEJTU0lEcyB5b3UgY2FuIHRoZW4gaGF2ZToKLSAqCi0gKiAgICAgICAgICAgICAgICAgIFwKLSAqIE1BQzogICAgICAgICAgICAgICAgMDAwMSB8Ci0gKiBCU1NJRC0wMTogICAwMTAwIHwgLS0+IEJlbG9uZ3MgdG8gdXMKLSAqIEJTU0lELTAyOiAgIDEwMDEgfAotICogICAgICAgICAgICAgICAgICAvCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBCU1NJRC0wMzogICAwMTEwICB8IC0tPiBFeHRlcm5hbAotICogLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIE91ciBic3NpZF9tYXNrIHdvdWxkIHRoZW4gYmU6Ci0gKgotICogICAgICAgICAgICAgT24gbG9vcCBpdGVyYXRpb24gZm9yIEJTU0lELTAxOgotICogICAgICAgICAgICAgfigwMDAxIF4gMDEwMCkgIC0+IH4oMDEwMSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgIDEwMTAKLSAqICAgICAgICAgICAgIGJzc2lkX21hc2sgICAgICA9ICAgIDEwMTAKLSAqCi0gKiAgICAgICAgICAgICBPbiBsb29wIGl0ZXJhdGlvbiBmb3IgQlNTSUQtMDI6Ci0gKiAgICAgICAgICAgICBic3NpZF9tYXNrICY9IH4oMDAwMSAgIF4gICAxMDAxKQotICogICAgICAgICAgICAgYnNzaWRfbWFzayA9ICAgKDEwMTApICAmIH4oMDAwMSBeIDEwMDEpCi0gKiAgICAgICAgICAgICBic3NpZF9tYXNrID0gICAoMTAxMCkgICYgfigxMDAxKQotICogICAgICAgICAgICAgYnNzaWRfbWFzayA9ICAgKDEwMTApICAmICAoMDExMCkKLSAqICAgICAgICAgICAgIGJzc2lkX21hc2sgPSAgIDAwMTAKLSAqCi0gKiBBIGJzc2lkX21hc2sgb2YgMDAxMCBtZWFucyAib25seSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBzZWNvbmQgbGVhc3QKLSAqIHNpZ25pZmljYW50IGJpdCIuIFRoaXMgaXMgYmVjYXVzZSBpdHMgdGhlIG9ubHkgYml0IGNvbW1vbgotICogYW1vbmdzdCB0aGUgTUFDIGFuZCBhbGwgQlNTSURzIHdlIHN1cHBvcnQuIFRvIGZpbmRvdXQgd2hhdCB0aGUgcmVhbAotICogY29tbW9uIGJpdCBpcyB3ZSBjYW4gc2ltcGx5ICImIiB0aGUgYnNzaWRfbWFzayBub3cgd2l0aCBhbnkgQlNTSUQgd2UgaGF2ZQotICogb3Igb3VyIE1BQyBhZGRyZXNzICh3ZSBhc3N1bWUgdGhlIGhhcmR3YXJlIHVzZXMgdGhlIE1BQyBhZGRyZXNzKS4KLSAqCi0gKiBOb3csIHN1cHBvc2UgdGhlcmUncyBhbiBpbmNvbWluZyBmcmFtZSBmb3IgQlNTSUQtMDM6Ci0gKgotICogSUZSQU1FLTAxOiAgMDExMAotICoKLSAqIEFuIGVhc3kgZXllLWluc3BlY2l0b24gb2YgdGhpcyBhbHJlYWR5IHNob3VsZCB0ZWxsIHlvdSB0aGF0IHRoaXMgZnJhbWUKLSAqIHdpbGwgbm90IHBhc3Mgb3VyIGNoZWNrLiBUaGlzIGlzIGJlYWN1c2UgdGhlIGJzc2lkX21hc2sgdGVsbHMgdGhlCi0gKiBoYXJkd2FyZSB0byBvbmx5IGxvb2sgYXQgdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBiaXQgYW5kIHRoZQotICogY29tbW9uIGJpdCBhbW9uZ3N0IHRoZSBNQUMgYW5kIEJTU0lEcyBpcyAwLCB0aGlzIGZyYW1lIGhhcyB0aGUgMm5kIExTQgotICogYXMgMSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggMC4KLSAqCi0gKiBTbyB3aXRoIElGUkFNRS0wMSB3ZSAqYXNzdW1lKiB0aGUgaGFyZHdhcmUgd2lsbCBkbzoKLSAqCi0gKiAgICAgYWxsb3cgPSAoSUZSQU1FLTAxICYgYnNzaWRfbWFzaykgPT0gKGJzc2lkX21hc2sgJiBNQUMpID8gMSA6IDA7Ci0gKiAgLS0+IGFsbG93ID0gKDAxMTAgJiAwMDEwKSA9PSAoMDAxMCAmIDAwMDEpID8gMSA6IDA7Ci0gKiAgLS0+IGFsbG93ID0gKDAwMTApID09IDAwMDAgPyAxIDogMDsKLSAqICAtLT4gYWxsb3cgPSAwCi0gKgotICogIExldHMgbm93IHRlc3QgYSBmcmFtZSB0aGF0IHNob3VsZCB3b3JrOgotICoKLSAqIElGUkFNRS0wMjogIDAwMDEgKHdlIHNob3VsZCBhbGxvdykKLSAqCi0gKiAgICAgYWxsb3cgPSAoMDAwMSAmIDEwMTApID09IDEwMTAKLSAqCi0gKiAgICAgYWxsb3cgPSAoSUZSQU1FLTAyICYgYnNzaWRfbWFzaykgPT0gKGJzc2lkX21hc2sgJiBNQUMpID8gMSA6IDA7Ci0gKiAgLS0+IGFsbG93ID0gKDAwMDEgJiAwMDEwKSA9PSAgKDAwMTAgJiAwMDAxKSA/IDEgOjA7Ci0gKiAgLS0+IGFsbG93ID0gKDAwMTApID09ICgwMDEwKQotICogIC0tPiBhbGxvdyA9IDEKLSAqCi0gKiBPdGhlciBleGFtcGxlczoKLSAqCi0gKiBJRlJBTUUtMDM6ICAwMTAwIC0tPiBhbGxvd2VkCi0gKiBJRlJBTUUtMDQ6ICAxMDAxIC0tPiBhbGxvd2VkCi0gKiBJRlJBTUUtMDU6ICAxMTAxIC0tPiBhbGxvd2VkIGJ1dCBpdHMgbm90IGZvciB1cyEhIQotICoKLSAqLwotaW50IGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYXNrKQotewotCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlsb3dfaWQgPSBBUjVLX0xPV19JRChtYXNrKTsKLQkJaGlnaF9pZCA9IEFSNUtfSElHSF9JRChtYXNrKTsKLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19CU1NfSURNMCk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgaGlnaF9pZCwgQVI1S19CU1NfSURNMSk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU87Ci19Ci0KLS8qCi0gKiBSZWNlaXZlIHN0YXJ0L3N0b3AgZnVuY3Rpb25zCi0gKi8KLQotLyoKLSAqIFN0YXJ0IHJlY2VpdmUgb24gUENVCi0gKi8KLXZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfcGN1KHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7Ci0KLQkvKiBUT0RPOiBBTkkgU3VwcG9ydCAqLwotfQotCi0vKgotICogU3RvcCByZWNlaXZlIG9uIFBDVQotICovCi12b2lkIGF0aDVrX2h3X3N0b3BfcGN1X3JlY3Yoc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX0RJQUdfU1csIEFSNUtfRElBR19TV19ESVNfUlgpOwotCi0JLyogVE9ETzogQU5JIFN1cHBvcnQgKi8KLX0KLQotLyoKLSAqIFJYIEZpbHRlciBmdW5jdGlvbnMKLSAqLwotCi0vKgotICogU2V0IG11bHRpY2FzdCBmaWx0ZXIKLSAqLwotdm9pZCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIwLCB1MzIgZmlsdGVyMSkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCS8qIFNldCB0aGUgbXVsdGljYXQgZmlsdGVyICovCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIwLCBBUjVLX01DQVNUX0ZJTFRFUjApOwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMSwgQVI1S19NQ0FTVF9GSUxURVIxKTsKLX0KLQotLyoKLSAqIFNldCBtdWx0aWNhc3QgZmlsdGVyIGJ5IGluZGV4Ci0gKi8KLWludCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyaW5kZXgoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGluZGV4KQotewotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlpZiAoaW5kZXggPj0gNjQpCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UgaWYgKGluZGV4ID49IDMyKQotCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19NQ0FTVF9GSUxURVIxLAotCQkJCSgxIDw8IChpbmRleCAtIDMyKSkpOwotCWVsc2UKLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfTUNBU1RfRklMVEVSMCwgKDEgPDwgaW5kZXgpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2xlYXIgTXVsdGljYXN0IGZpbHRlciBieSBpbmRleAotICovCi1pbnQgYXRoNWtfaHdfY2xlYXJfbWNhc3RfZmlsdGVyX2lkeChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgaW5kZXgpCi17Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCWlmIChpbmRleCA+PSA2NCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAoaW5kZXggPj0gMzIpCi0JCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19NQ0FTVF9GSUxURVIxLAotCQkJCSgxIDw8IChpbmRleCAtIDMyKSkpOwotCWVsc2UKLQkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX01DQVNUX0ZJTFRFUjAsICgxIDw8IGluZGV4KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCBjdXJyZW50IHJ4IGZpbHRlcgotICovCi11MzIgYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCXUzMiBkYXRhLCBmaWx0ZXIgPSAwOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlmaWx0ZXIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWF9GSUxURVIpOwotCi0JLypSYWRhciBkZXRlY3Rpb24gZm9yIDUyMTIqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0VSUl9GSUwpOwotCi0JCWlmIChkYXRhICYgQVI1S19QSFlfRVJSX0ZJTF9SQURBUikKLQkJCWZpbHRlciB8PSBBUjVLX1JYX0ZJTFRFUl9SQURBUkVSUjsKLQkJaWYgKGRhdGEgJiAoQVI1S19QSFlfRVJSX0ZJTF9PRkRNIHwgQVI1S19QSFlfRVJSX0ZJTF9DQ0spKQotCQkJZmlsdGVyIHw9IEFSNUtfUlhfRklMVEVSX1BIWUVSUjsKLQl9Ci0KLQlyZXR1cm4gZmlsdGVyOwotfQotCi0vKgotICogU2V0IHJ4IGZpbHRlcgotICovCi12b2lkIGF0aDVrX2h3X3NldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcikKLXsKLQl1MzIgZGF0YSA9IDA7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyogU2V0IFBIWSBlcnJvciBmaWx0ZXIgcmVnaXN0ZXIgb24gNTIxMiovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7Ci0JCWlmIChmaWx0ZXIgJiBBUjVLX1JYX0ZJTFRFUl9SQURBUkVSUikKLQkJCWRhdGEgfD0gQVI1S19QSFlfRVJSX0ZJTF9SQURBUjsKLQkJaWYgKGZpbHRlciAmIEFSNUtfUlhfRklMVEVSX1BIWUVSUikKLQkJCWRhdGEgfD0gQVI1S19QSFlfRVJSX0ZJTF9PRkRNIHwgQVI1S19QSFlfRVJSX0ZJTF9DQ0s7Ci0JfQotCi0JLyoKLQkgKiBUaGUgQVI1MjEwIHVzZXMgcHJvbWlzY291cyBtb2RlIHRvIGRldGVjdCByYWRhciBhY3Rpdml0eQotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCAmJgotCQkJKGZpbHRlciAmIEFSNUtfUlhfRklMVEVSX1JBREFSRVJSKSkgewotCQlmaWx0ZXIgJj0gfkFSNUtfUlhfRklMVEVSX1JBREFSRVJSOwotCQlmaWx0ZXIgfD0gQVI1S19SWF9GSUxURVJfUFJPTTsKLQl9Ci0KLQkvKlplcm8gbGVuZ3RoIERNQSovCi0JaWYgKGRhdGEpCi0JCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1JYQ0ZHLCBBUjVLX1JYQ0ZHX1pMRkRNQSk7Ci0JZWxzZQotCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfUlhDRkcsIEFSNUtfUlhDRkdfWkxGRE1BKTsKLQotCS8qV3JpdGUgUlggRmlsdGVyIHJlZ2lzdGVyKi8KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGZpbHRlciAmIDB4ZmYsIEFSNUtfUlhfRklMVEVSKTsKLQotCS8qV3JpdGUgUEhZIGVycm9yIGZpbHRlciByZWdpc3RlciBvbiA1MjEyKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19QSFlfRVJSX0ZJTCk7Ci0KLX0KLQotLyoKLSAqIEJlYWNvbiByZWxhdGVkIGZ1bmN0aW9ucwotICovCi0KLS8qCi0gKiBHZXQgYSAzMmJpdCBUU0YKLSAqLwotdTMyIGF0aDVrX2h3X2dldF90c2YzMihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1RTRl9MMzIpOwotfQotCi0vKgotICogR2V0IHRoZSBmdWxsIDY0Yml0IFRTRgotICovCi11NjQgYXRoNWtfaHdfZ2V0X3RzZjY0KHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JdTY0IHRzZiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1RTRl9VMzIpOwotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQlyZXR1cm4gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVFNGX0wzMikgfCAodHNmIDw8IDMyKTsKLX0KLQotLyoKLSAqIEZvcmNlIGEgVFNGIHJlc2V0Ci0gKi8KLXZvaWQgYXRoNWtfaHdfcmVzZXRfdHNmKHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19CRUFDT04sIEFSNUtfQkVBQ09OX1JFU0VUX1RTRik7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIGJlYWNvbiB0aW1lcnMKLSAqLwotdm9pZCBhdGg1a19od19pbml0X2JlYWNvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgbmV4dF9iZWFjb24sIHUzMiBpbnRlcnZhbCkKLXsKLQl1MzIgdGltZXIxLCB0aW1lcjIsIHRpbWVyMzsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JLyoKLQkgKiBTZXQgdGhlIGFkZGl0aW9uYWwgdGltZXJzIGJ5IG1vZGUKLQkgKi8KLQlzd2l0Y2ggKGFoLT5haF9vcF9tb2RlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQkJdGltZXIxID0gMHhmZmZmZmZmZjsKLQkJCXRpbWVyMiA9IDB4ZmZmZmZmZmY7Ci0JCX0gZWxzZSB7Ci0JCQl0aW1lcjEgPSAweDAwMDBmZmZmOwotCQkJdGltZXIyID0gMHgwMDA3ZmZmZjsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXRpbWVyMSA9IChuZXh0X2JlYWNvbiAtIEFSNUtfVFVORV9ETUFfQkVBQ09OX1JFU1ApIDw8IDM7Ci0JCXRpbWVyMiA9IChuZXh0X2JlYWNvbiAtIEFSNUtfVFVORV9TV19CRUFDT05fUkVTUCkgPDwgMzsKLQl9Ci0KLQl0aW1lcjMgPSBuZXh0X2JlYWNvbiArIChhaC0+YWhfYXRpbV93aW5kb3cgPyBhaC0+YWhfYXRpbV93aW5kb3cgOiAxKTsKLQotCS8qCi0JICogU2V0IHRoZSBiZWFjb24gcmVnaXN0ZXIgYW5kIGVuYWJsZSBhbGwgdGltZXJzLgotCSAqIChuZXh0IGJlYWNvbiwgRE1BIGJlYWNvbiwgc29mdHdhcmUgYmVhY29uLCBBVElNIHdpbmRvdyB0aW1lKQotCSAqLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbmV4dF9iZWFjb24sIEFSNUtfVElNRVIwKTsKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHRpbWVyMSwgQVI1S19USU1FUjEpOwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdGltZXIyLCBBUjVLX1RJTUVSMik7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0aW1lcjMsIEFSNUtfVElNRVIzKTsKLQotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgaW50ZXJ2YWwgJiAoQVI1S19CRUFDT05fUEVSSU9EIHwKLQkJCUFSNUtfQkVBQ09OX1JFU0VUX1RTRiB8IEFSNUtfQkVBQ09OX0VOQUJMRSksCi0JCUFSNUtfQkVBQ09OKTsKLX0KLQotI2lmIDAKLS8qCi0gKiBTZXQgYmVhY29uIHRpbWVycwotICovCi1pbnQgYXRoNWtfaHdfc2V0X2JlYWNvbl90aW1lcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKLQkJY29uc3Qgc3RydWN0IGF0aDVrX2JlYWNvbl9zdGF0ZSAqc3RhdGUpCi17Ci0JdTMyIGNmcF9wZXJpb2QsIG5leHRfY2ZwLCBkdGltLCBpbnRlcnZhbCwgbmV4dF9iZWFjb247Ci0KLQkvKgotCSAqIFRPRE86IHNob3VsZCBiZSBjaGFuZ2VkIHRocm91Z2ggKnN0YXRlCi0JICogcmV2aWV3IHN0cnVjdCBhdGg1a19iZWFjb25fc3RhdGUgc3RydWN0Ci0JICoKLQkgKiBYWFg6IFRoZXNlIGFyZSB1c2VkIGZvciBjZnAgcGVyaW9kIGJlbGxvdywgYXJlIHRoZXkKLQkgKiBvayA/IElzIGl0IE8uSy4gZm9yIHRzZiBoZXJlIHRvIGJlIDAgb3Igc2hvdWxkIHdlIHVzZQotCSAqIGdldF90c2YgPwotCSAqLwotCXUzMiBkdGltX2NvdW50ID0gMDsgLyogWFhYICovCi0JdTMyIGNmcF9jb3VudCA9IDA7IC8qIFhYWCAqLwotCXUzMiB0c2YgPSAwOyAvKiBYWFggKi8KLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JLyogUmV0dXJuIG9uIGFuIGludmFsaWQgYmVhY29uIHN0YXRlICovCi0JaWYgKHN0YXRlLT5ic19pbnRlcnZhbCA8IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW50ZXJ2YWwgPSBzdGF0ZS0+YnNfaW50ZXJ2YWw7Ci0JZHRpbSA9IHN0YXRlLT5ic19kdGltX3BlcmlvZDsKLQotCS8qCi0JICogUENGIHN1cHBvcnQ/Ci0JICovCi0JaWYgKHN0YXRlLT5ic19jZnBfcGVyaW9kID4gMCkgewotCQkvKgotCQkgKiBFbmFibGUgUENGIG1vZGUgYW5kIHNldCB0aGUgQ0ZQCi0JCSAqIChDb250ZW50aW9uIEZyZWUgUGVyaW9kKSBhbmQgdGltZXIgcmVnaXN0ZXJzCi0JCSAqLwotCQljZnBfcGVyaW9kID0gc3RhdGUtPmJzX2NmcF9wZXJpb2QgKiBzdGF0ZS0+YnNfZHRpbV9wZXJpb2QgKgotCQkJc3RhdGUtPmJzX2ludGVydmFsOwotCQluZXh0X2NmcCA9IChjZnBfY291bnQgKiBzdGF0ZS0+YnNfZHRpbV9wZXJpb2QgKyBkdGltX2NvdW50KSAqCi0JCQlzdGF0ZS0+YnNfaW50ZXJ2YWw7Ci0KLQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKLQkJCQlBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIHwKLQkJCQlBUjVLX1NUQV9JRDFfUENGKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBjZnBfcGVyaW9kLCBBUjVLX0NGUF9QRVJJT0QpOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHN0YXRlLT5ic19jZnBfbWF4X2R1cmF0aW9uLAotCQkJCUFSNUtfQ0ZQX0RVUik7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHRzZiArIChuZXh0X2NmcCA9PSAwID8gY2ZwX3BlcmlvZCA6Ci0JCQkJCQluZXh0X2NmcCkpIDw8IDMsIEFSNUtfVElNRVIyKTsKLQl9IGVsc2UgewotCQkvKiBEaXNhYmxlIFBDRiBtb2RlICovCi0JCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19TVEFfSUQxLAotCQkJCUFSNUtfU1RBX0lEMV9ERUZBVUxUX0FOVEVOTkEgfAotCQkJCUFSNUtfU1RBX0lEMV9QQ0YpOwotCX0KLQotCS8qCi0JICogRW5hYmxlIHRoZSBiZWFjb24gdGltZXIgcmVnaXN0ZXIKLQkgKi8KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHN0YXRlLT5ic19uZXh0X2JlYWNvbiwgQVI1S19USU1FUjApOwotCi0JLyoKLQkgKiBTdGFydCB0aGUgYmVhY29uIHRpbWVycwotCSAqLwotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTikgJn4KLQkJKEFSNUtfQkVBQ09OX1BFUklPRCB8IEFSNUtfQkVBQ09OX1RJTSkpIHwKLQkJQVI1S19SRUdfU00oc3RhdGUtPmJzX3RpbV9vZmZzZXQgPyBzdGF0ZS0+YnNfdGltX29mZnNldCArIDQgOiAwLAotCQlBUjVLX0JFQUNPTl9USU0pIHwgQVI1S19SRUdfU00oc3RhdGUtPmJzX2ludGVydmFsLAotCQlBUjVLX0JFQUNPTl9QRVJJT0QpLCBBUjVLX0JFQUNPTik7Ci0KLQkvKgotCSAqIFdyaXRlIG5ldyBiZWFjb24gbWlzcyB0aHJlc2hvbGQsIGlmIGl0IGFwcGVhcnMgdG8gYmUgdmFsaWQKLQkgKiBYWFg6IEZpZ3VyZSBvdXQgcmlnaHQgdmFsdWVzIGZvciBtaW4gPD0gYnNfYm1pc3NfdGhyZXNob2xkIDw9IG1heAotCSAqIGFuZCByZXR1cm4gaWYgaXRzIG5vdCBpbiByYW5nZS4gV2UgY2FuIHRlc3QgdGhpcyBieSByZWFkaW5nIHZhbHVlIGFuZAotCSAqIHNldHRpbmcgdmFsdWUgdG8gYSBsYXJnZXN0IHZhbHVlIGFuZCBzZWVpbmcgd2hpY2ggdmFsdWVzIHJlZ2lzdGVyLgotCSAqLwotCi0JQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19SU1NJX1RIUiwgQVI1S19SU1NJX1RIUl9CTUlTUywKLQkJCXN0YXRlLT5ic19ibWlzc190aHJlc2hvbGQpOwotCi0JLyoKLQkgKiBTZXQgc2xlZXAgY29udHJvbCByZWdpc3RlcgotCSAqIFhYWDogRGlkbid0IGZpbmQgdGhpcyBpbiA1MjEwIGNvZGUgYnV0IHNpbmNlIHRoaXMgcmVnaXN0ZXIKLQkgKiBleGlzdHMgYWxzbyBpbiBhcjVrJ3MgNTIxMCBoZWFkZXJzIGkgbGVhdmUgaXQgYXMgY29tbW9uIGNvZGUuCi0JICovCi0JQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19TTEVFUF9DVEwsIEFSNUtfU0xFRVBfQ1RMX1NMRFVSLAotCQkJKHN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbiAtIDMpIDw8IDMpOwotCi0JLyoKLQkgKiBTZXQgZW5oYW5jZWQgc2xlZXAgcmVnaXN0ZXJzIG9uIDUyMTIKLQkgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKLQkJaWYgKHN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbiA+IHN0YXRlLT5ic19pbnRlcnZhbCAmJgotCQkJCXJvdW5kdXAoc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uLCBpbnRlcnZhbCkgPT0KLQkJCQlzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb24pCi0JCQlpbnRlcnZhbCA9IHN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbjsKLQotCQlpZiAoc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uID4gZHRpbSAmJiAoZHRpbSA9PSAwIHx8Ci0JCQkJcm91bmR1cChzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb24sIGR0aW0pID09Ci0JCQkJc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uKSkKLQkJCWR0aW0gPSBzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb247Ci0KLQkJaWYgKGludGVydmFsID4gZHRpbSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW5leHRfYmVhY29uID0gaW50ZXJ2YWwgPT0gZHRpbSA/IHN0YXRlLT5ic19uZXh0X2R0aW0gOgotCQkJc3RhdGUtPmJzX25leHRfYmVhY29uOwotCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKLQkJCUFSNUtfUkVHX1NNKChzdGF0ZS0+YnNfbmV4dF9kdGltIC0gMykgPDwgMywKLQkJCUFSNUtfU0xFRVAwX05FWFRfRFRJTSkgfAotCQkJQVI1S19SRUdfU00oMTAsIEFSNUtfU0xFRVAwX0NBQlRPKSB8Ci0JCQlBUjVLX1NMRUVQMF9FTkhfU0xFRVBfRU4gfAotCQkJQVI1S19TTEVFUDBfQVNTVU1FX0RUSU0sIEFSNUtfU0xFRVAwKTsKLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUkVHX1NNKChuZXh0X2JlYWNvbiAtIDMpIDw8IDMsCi0JCQlBUjVLX1NMRUVQMV9ORVhUX1RJTSkgfAotCQkJQVI1S19SRUdfU00oMTAsIEFSNUtfU0xFRVAxX0JFQUNPTl9UTyksIEFSNUtfU0xFRVAxKTsKLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCi0JCQlBUjVLX1JFR19TTShpbnRlcnZhbCwgQVI1S19TTEVFUDJfVElNX1BFUikgfAotCQkJQVI1S19SRUdfU00oZHRpbSwgQVI1S19TTEVFUDJfRFRJTV9QRVIpLCBBUjVLX1NMRUVQMik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZXNldCBiZWFjb24gdGltZXJzCi0gKi8KLXZvaWQgYXRoNWtfaHdfcmVzZXRfYmVhY29uKHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQkvKgotCSAqIERpc2FibGUgYmVhY29uIHRpbWVyCi0JICovCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1RJTUVSMCk7Ci0KLQkvKgotCSAqIERpc2FibGUgc29tZSBiZWFjb24gcmVnaXN0ZXIgdmFsdWVzCi0JICovCi0JQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1NUQV9JRDEsCi0JCQlBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIHwgQVI1S19TVEFfSUQxX1BDRik7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0JFQUNPTl9QRVJJT0QsIEFSNUtfQkVBQ09OKTsKLX0KLQotLyoKLSAqIFdhaXQgZm9yIGJlYWNvbiBxdWV1ZSB0byBmaW5pc2gKLSAqLwotaW50IGF0aDVrX2h3X2JlYWNvbnFfZmluaXNoKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQotewotCXVuc2lnbmVkIGludCBpOwotCWludCByZXQ7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyogNTIxMCBkb2Vzbid0IGhhdmUgUUNVKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKLQkJLyoKLQkJICogV2FpdCBmb3IgYmVhY29ubiBxdWV1ZSB0byBmaW5pc2ggYnkgY2hlY2tpbmcKLQkJICogQ29udHJvbCBSZWdpc3RlciBhbmQgQmVhY29uIFN0YXR1cyBSZWdpc3Rlci4KLQkJICovCi0JCWZvciAoaSA9IEFSNUtfVFVORV9CRUFDT05fSU5URVJWQUwgLyAyOyBpID4gMDsgaS0tKSB7Ci0JCQlpZiAoIShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19CU1IpICYgQVI1S19CU1JfVFhRMUYpCi0JCQkJCXx8Ci0JCQkgICAgIShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19DUikgJiBBUjVLX0JTUl9UWFExRikpCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0KLQkJLyogVGltZW91dC4uLiAqLwotCQlpZiAoaSA8PSAwKSB7Ci0JCQkvKgotCQkJICogUmUtc2NoZWR1bGUgdGhlIGJlYWNvbiBxdWV1ZQotCQkJICovCi0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHBoeXNfYWRkciwgQVI1S19OT1FDVV9UWERQMSk7Ci0JCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfQkNSX1RRMVYgfCBBUjVLX0JDUl9CRE1BRSwKLQkJCQkJQVI1S19CQ1IpOwotCi0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JLyo1MjExLzUyMTIqLwotCQlyZXQgPSBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KGFoLAotCQkJQVI1S19RVUVVRV9TVEFUVVMoQVI1S19UWF9RVUVVRV9JRF9CRUFDT04pLAotCQkJQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQsIDAsIGZhbHNlKTsKLQotCQlpZiAoQVI1S19SRUdfUkVBRF9RKGFoLCBBUjVLX1FDVV9UWEUsIEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OKSkKLQkJCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFVwZGF0ZSBtaWIgY291bnRlcnMgKHN0YXRpc3RpY3MpCi0gKi8KLXZvaWQgYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAgKnN0YXRzKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQkvKiBSZWFkLUFuZC1DbGVhciAqLwotCXN0YXRzLT5kb3QxMUFDS0ZhaWx1cmVDb3VudCArPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19BQ0tfRkFJTCk7Ci0Jc3RhdHMtPmRvdDExUlRTRmFpbHVyZUNvdW50ICs9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JUU19GQUlMKTsKLQlzdGF0cy0+ZG90MTFSVFNTdWNjZXNzQ291bnQgKz0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUlRTX09LKTsKLQlzdGF0cy0+ZG90MTFGQ1NFcnJvckNvdW50ICs9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0ZDU19GQUlMKTsKLQotCS8qIFhYWDogU2hvdWxkIHdlIHVzZSB0aGlzIHRvIHRyYWNrIGJlYWNvbiBjb3VudCA/Ci0JICogLXdlIHJlYWQgaXQgYW55d2F5IHRvIGNsZWFyIHRoZSByZWdpc3RlciAqLwotCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTl9DTlQpOwotCi0JLyogUmVzZXQgcHJvZmlsZSBjb3VudCByZWdpc3RlcnMgb24gNTIxMiovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19QUk9GQ05UX1RYKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1BST0ZDTlRfUlgpOwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUFJPRkNOVF9SWENMUik7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19QUk9GQ05UX0NZQ0xFKTsKLQl9Ci19Ci0KLS8qKiBhdGg1a19od19zZXRfYWNrX2JpdHJhdGUgLSBzZXQgYml0cmF0ZSBmb3IgQUNLcwotICoKLSAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqIEBoaWdoOiBkZXRlcm1pbmVzIGlmIHRvIHVzZSBsb3cgYml0IHJhdGUgb3Igbm93Ci0gKi8KLXZvaWQgYXRoNWtfaHdfc2V0X2Fja19iaXRyYXRlX2hpZ2goc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBoaWdoKQotewotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMikKLQkJcmV0dXJuOwotCWVsc2UgewotCQl1MzIgdmFsID0gQVI1S19TVEFfSUQxX0JBU0VfUkFURV8xMUIgfCBBUjVLX1NUQV9JRDFfQUNLQ1RTXzZNQjsKLQkJaWYgKGhpZ2gpCi0JCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19TVEFfSUQxLCB2YWwpOwotCQllbHNlCi0JCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwgdmFsKTsKLQl9Ci19Ci0KLQotLyoKLSAqIEFDSy9DVFMgVGltZW91dHMKLSAqLwotCi0vKgotICogU2V0IEFDSyB0aW1lb3V0IG9uIFBDVQotICovCi1pbnQgYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKDB4ZmZmZmZmZmYsIEFSNUtfVElNRV9PVVRfQUNLKSwKLQkJCWFoLT5haF90dXJibykgPD0gdGltZW91dCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1RJTUVfT1VULCBBUjVLX1RJTUVfT1VUX0FDSywKLQkJYXRoNWtfaHdfaHRvY2xvY2sodGltZW91dCwgYWgtPmFoX3R1cmJvKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIEFDSyB0aW1lb3V0IGZyb20gUENVCi0gKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19nZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JcmV0dXJuIGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKGF0aDVrX2h3X3JlZ19yZWFkKGFoLAotCQkJQVI1S19USU1FX09VVCksIEFSNUtfVElNRV9PVVRfQUNLKSwgYWgtPmFoX3R1cmJvKTsKLX0KLQotLyoKLSAqIFNldCBDVFMgdGltZW91dCBvbiBQQ1UKLSAqLwotaW50IGF0aDVrX2h3X3NldF9jdHNfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCWlmIChhdGg1a19od19jbG9ja3RvaChBUjVLX1JFR19NUygweGZmZmZmZmZmLCBBUjVLX1RJTUVfT1VUX0NUUyksCi0JCQlhaC0+YWhfdHVyYm8pIDw9IHRpbWVvdXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19USU1FX09VVCwgQVI1S19USU1FX09VVF9DVFMsCi0JCQlhdGg1a19od19odG9jbG9jayh0aW1lb3V0LCBhaC0+YWhfdHVyYm8pKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBDVFMgdGltZW91dCBmcm9tIFBDVQotICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlyZXR1cm4gYXRoNWtfaHdfY2xvY2t0b2goQVI1S19SRUdfTVMoYXRoNWtfaHdfcmVnX3JlYWQoYWgsCi0JCQlBUjVLX1RJTUVfT1VUKSwgQVI1S19USU1FX09VVF9DVFMpLCBhaC0+YWhfdHVyYm8pOwotfQotCi0vKgotICogS2V5IHRhYmxlIChXRVApIGZ1bmN0aW9ucwotICovCi0KLWludCBhdGg1a19od19yZXNldF9rZXkoc3RydWN0IGF0aDVrX2h3ICphaCwgdTE2IGVudHJ5KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlBUjVLX0FTU0VSVF9FTlRSWShlbnRyeSwgQVI1S19LRVlUQUJMRV9TSVpFKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUjVLX0tFWUNBQ0hFX1NJWkU7IGkrKykKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgaSkpOwotCi0JLyoKLQkgKiBTZXQgTlVMTCBlbmNyeXB0aW9uIG9uIEFSNTIxMisKLQkgKgotCSAqIE5vdGU6IEFSNUtfS0VZVEFCTEVfVFlQRSAtPiBBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgNSkKLQkgKiAgICAgICBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCAtPiAweDAwMDAwMDA3Ci0JICoKLQkgKiBOb3RlMjogV2luZG93cyBkcml2ZXIgKG5kaXN3cmFwcGVyKSBzZXRzIHRoaXMgdG8KLQkgKiAgICAgICAgMHgwMDAwMDcxNCBpbnN0ZWFkIG9mIDB4MDAwMDAwMDcKLQkgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPiBBUjVLX0FSNTIxMSkKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCwKLQkJCQlBUjVLX0tFWVRBQkxFX1RZUEUoZW50cnkpKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYXRoNWtfaHdfaXNfa2V5X3ZhbGlkKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBlbnRyeSkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCUFSNUtfQVNTRVJUX0VOVFJZKGVudHJ5LCBBUjVLX0tFWVRBQkxFX1NJWkUpOwotCi0JLyogQ2hlY2sgdGhlIHZhbGlkYXRpb24gZmxhZyBhdCB0aGUgZW5kIG9mIHRoZSBlbnRyeSAqLwotCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19LRVlUQUJMRV9NQUMxKGVudHJ5KSkgJgotCQlBUjVLX0tFWVRBQkxFX1ZBTElEOwotfQotCi1pbnQgYXRoNWtfaHdfc2V0X2tleShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnksCi0JCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgY29uc3QgdTggKm1hYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlfX2xlMzIga2V5X3ZbNV0gPSB7fTsKLQl1MzIga2V5dHlwZTsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQkvKiBrZXktPmtleWxlbiBjb21lcyBpbiBmcm9tIG1hYzgwMjExIGluIGJ5dGVzICovCi0KLQlpZiAoa2V5LT5rZXlsZW4gPiBBUjVLX0tFWVRBQkxFX1NJWkUgLyA4KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlzd2l0Y2ggKGtleS0+a2V5bGVuKSB7Ci0JLyogV0VQIDQwLWJpdCAgID0gNDAtYml0ICBlbnRlcmVkIGtleSArIDI0IGJpdCBJViA9IDY0LWJpdCAqLwotCWNhc2UgNDAgLyA4OgotCQltZW1jcHkoJmtleV92WzBdLCBrZXktPmtleSwgNSk7Ci0JCWtleXR5cGUgPSBBUjVLX0tFWVRBQkxFX1RZUEVfNDA7Ci0JCWJyZWFrOwotCi0JLyogV0VQIDEwNC1iaXQgID0gMTA0LWJpdCBlbnRlcmVkIGtleSArIDI0LWJpdCBJViA9IDEyOC1iaXQgKi8KLQljYXNlIDEwNCAvIDg6Ci0JCW1lbWNweSgma2V5X3ZbMF0sICZrZXktPmtleVswXSwgNik7Ci0JCW1lbWNweSgma2V5X3ZbMl0sICZrZXktPmtleVs2XSwgNik7Ci0JCW1lbWNweSgma2V5X3ZbNF0sICZrZXktPmtleVsxMl0sIDEpOwotCQlrZXl0eXBlID0gQVI1S19LRVlUQUJMRV9UWVBFXzEwNDsKLQkJYnJlYWs7Ci0JLyogV0VQIDEyOC1iaXQgID0gMTI4LWJpdCBlbnRlcmVkIGtleSArIDI0IGJpdCBJViA9IDE1Mi1iaXQgKi8KLQljYXNlIDEyOCAvIDg6Ci0JCW1lbWNweSgma2V5X3ZbMF0sICZrZXktPmtleVswXSwgNik7Ci0JCW1lbWNweSgma2V5X3ZbMl0sICZrZXktPmtleVs2XSwgNik7Ci0JCW1lbWNweSgma2V5X3ZbNF0sICZrZXktPmtleVsxMl0sIDQpOwotCQlrZXl0eXBlID0gQVI1S19LRVlUQUJMRV9UWVBFXzEyODsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsgLyogc2hvdWxkbid0IGhhcHBlbiAqLwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleV92KTsgaSsrKQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxlMzJfdG9fY3B1KGtleV92W2ldKSwKLQkJCQlBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgaSkpOwotCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBrZXl0eXBlLCBBUjVLX0tFWVRBQkxFX1RZUEUoZW50cnkpKTsKLQotCXJldHVybiBhdGg1a19od19zZXRfa2V5X2xsYWRkcihhaCwgZW50cnksIG1hYyk7Ci19Ci0KLWludCBhdGg1a19od19zZXRfa2V5X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnksIGNvbnN0IHU4ICptYWMpCi17Ci0JdTMyIGxvd19pZCwgaGlnaF9pZDsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JIC8qIEludmFsaWQgZW50cnkgKGtleSB0YWJsZSBvdmVyZmxvdykgKi8KLQlBUjVLX0FTU0VSVF9FTlRSWShlbnRyeSwgQVI1S19LRVlUQUJMRV9TSVpFKTsKLQotCS8qIE1BQyBtYXkgYmUgTlVMTCBpZiBpdCdzIGEgYnJvYWRjYXN0IGtleS4gSW4gdGhpcyBjYXNlIG5vIG5lZWQgdG8KLQkgKiB0byBjb21wdXRlIEFSNUtfTE9XX0lEIGFuZCBBUjVLX0hJR0hfSUQgYXMgd2UgYWxyZWFkeSBrbm93IGl0LiAqLwotCWlmICh1bmxpa2VseShtYWMgPT0gTlVMTCkpIHsKLQkJbG93X2lkID0gMHhmZmZmZmZmZjsKLQkJaGlnaF9pZCA9IDB4ZmZmZiB8IEFSNUtfS0VZVEFCTEVfVkFMSUQ7Ci0JfSBlbHNlIHsKLQkJbG93X2lkID0gQVI1S19MT1dfSUQobWFjKTsKLQkJaGlnaF9pZCA9IEFSNUtfSElHSF9JRChtYWMpIHwgQVI1S19LRVlUQUJMRV9WQUxJRDsKLQl9Ci0KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19LRVlUQUJMRV9NQUMwKGVudHJ5KSk7Ci0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBoaWdoX2lkLCBBUjVLX0tFWVRBQkxFX01BQzEoZW50cnkpKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLVF1ZXVlIENvbnRyb2wgVW5pdCwgREZTIENvbnRyb2wgVW5pdCBGdW5jdGlvbnMKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEluaXRpYWxpemUgYSB0cmFuc21pdCBxdWV1ZQotICovCi1pbnQgYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a190eF9xdWV1ZSBxdWV1ZV90eXBlLAotCQlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCi17Ci0JdW5zaWduZWQgaW50IHF1ZXVlOwotCWludCByZXQ7Ci0KLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JLyoKLQkgKiBHZXQgcXVldWUgYnkgdHlwZQotCSAqLwotCS8qNTIxMCBvbmx5IGhhcyAyIHF1ZXVlcyovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCXN3aXRjaCAocXVldWVfdHlwZSkgewotCQljYXNlIEFSNUtfVFhfUVVFVUVfREFUQToKLQkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9EQVRBOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9CRUFDT046Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9DQUI6Ci0JCQlxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfQkVBQ09OOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAocXVldWVfdHlwZSkgewotCQljYXNlIEFSNUtfVFhfUVVFVUVfREFUQToKLQkJCWZvciAocXVldWUgPSBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOOwotCQkJCWFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlICE9Ci0JCQkJQVI1S19UWF9RVUVVRV9JTkFDVElWRTsgcXVldWUrKykgewotCi0JCQkJaWYgKHF1ZXVlID4gQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWCkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBBUjVLX1RYX1FVRVVFX1VBUFNEOgotCQkJcXVldWUgPSBBUjVLX1RYX1FVRVVFX0lEX1VBUFNEOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9CRUFDT046Ci0JCQlxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9DQUI6Ci0JCQlxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfQ0FCOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI1S19UWF9RVUVVRV9YUl9EQVRBOgotCQkJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEyKQotCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCi0JCQkJCSJYUiBkYXRhIHF1ZXVlcyBvbmx5IHN1cHBvcnRlZCBpbiIKLQkJCQkJIiA1MjEyIVxuIik7Ci0JCQlxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfWFJfREFUQTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldHVwIGludGVybmFsIHF1ZXVlIHN0cnVjdHVyZQotCSAqLwotCW1lbXNldCgmYWgtPmFoX3R4cVtxdWV1ZV0sIDAsIHNpemVvZihzdHJ1Y3QgYXRoNWtfdHhxX2luZm8pKTsKLQlhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9IHF1ZXVlX3R5cGU7Ci0KLQlpZiAocXVldWVfaW5mbyAhPSBOVUxMKSB7Ci0JCXF1ZXVlX2luZm8tPnRxaV90eXBlID0gcXVldWVfdHlwZTsKLQkJcmV0ID0gYXRoNWtfaHdfc2V0dXBfdHhfcXVldWVwcm9wcyhhaCwgcXVldWUsIHF1ZXVlX2luZm8pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0JLyoKLQkgKiBXZSB1c2UgYWhfdHhxX3N0YXR1cyB0byBob2xkIGEgdGVtcCB2YWx1ZSBmb3IKLQkgKiB0aGUgU2Vjb25kYXJ5IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycyBvbiA1MjExKwotCSAqIGNoZWNrIG91dCBhdGg1a19od19yZXNldF90eF9xdWV1ZQotCSAqLwotCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX3N0YXR1cywgcXVldWUpOwotCi0JcmV0dXJuIHF1ZXVlOwotfQotCi0vKgotICogU2V0dXAgYSB0cmFuc21pdCBxdWV1ZQotICovCi1pbnQgYXRoNWtfaHdfc2V0dXBfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCi0JCQkJY29uc3Qgc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxdWV1ZV9pbmZvKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JQVI1S19BU1NFUlRfRU5UUlkocXVldWUsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSk7Ci0KLQlpZiAoYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9JTkFDVElWRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1jcHkoJmFoLT5haF90eHFbcXVldWVdLCBxdWV1ZV9pbmZvLCBzaXplb2Yoc3RydWN0IGF0aDVrX3R4cV9pbmZvKSk7Ci0KLQkvKlhYWDogSXMgdGhpcyBzdXBwb3J0ZWQgb24gNTIxMCA/Ki8KLQlpZiAoKHF1ZXVlX2luZm8tPnRxaV90eXBlID09IEFSNUtfVFhfUVVFVUVfREFUQSAmJgotCQkJKChxdWV1ZV9pbmZvLT50cWlfc3VidHlwZSA9PSBBUjVLX1dNRV9BQ19WSSkgfHwKLQkJCShxdWV1ZV9pbmZvLT50cWlfc3VidHlwZSA9PSBBUjVLX1dNRV9BQ19WTykpKSB8fAotCQkJcXVldWVfaW5mby0+dHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9VQVBTRCkKLQkJYWgtPmFoX3R4cVtxdWV1ZV0udHFpX2ZsYWdzIHw9IEFSNUtfVFhRX0ZMQUdfUE9TVF9GUl9CS09GRl9ESVM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHRyYW5zbWl0IHF1ZXVlCi0gKi8KLWludCBhdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCi0JCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCW1lbWNweShxdWV1ZV9pbmZvLCAmYWgtPmFoX3R4cVtxdWV1ZV0sIHNpemVvZihzdHJ1Y3QgYXRoNWtfdHhxX2luZm8pKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNldCBhIHRyYW5zbWl0IHF1ZXVlIGluYWN0aXZlCi0gKi8KLXZvaWQgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlpZiAoV0FSTl9PTihxdWV1ZSA+PSBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pKQotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIHF1ZXVlIHdpbGwgYmUgc2tpcHBlZCBpbiBmdXJ0aGVyIG9wZXJhdGlvbnMgKi8KLQlhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9IEFSNUtfVFhfUVVFVUVfSU5BQ1RJVkU7Ci0JLypGb3IgU0lNUiBzZXR1cCovCi0JQVI1S19RX0RJU0FCTEVfQklUUyhhaC0+YWhfdHhxX3N0YXR1cywgcXVldWUpOwotfQotCi0vKgotICogU2V0IERGUyBwYXJhbXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKLSAqLwotaW50IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKLXsKLQl1MzIgY3dfbWluLCBjd19tYXgsIHJldHJ5X2xnLCByZXRyeV9zaDsKLQlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnRxID0gJmFoLT5haF90eHFbcXVldWVdOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKLQotCXRxID0gJmFoLT5haF90eHFbcXVldWVdOwotCi0JaWYgKHRxLT50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQotCQlyZXR1cm4gMDsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQkvKiBPbmx5IGhhbmRsZSBkYXRhIHF1ZXVlcywgb3RoZXJzIHdpbGwgYmUgaWdub3JlZCAqLwotCQlpZiAodHEtPnRxaV90eXBlICE9IEFSNUtfVFhfUVVFVUVfREFUQSkKLQkJCXJldHVybiAwOwotCi0JCS8qIFNldCBTbG90IHRpbWUgKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPwotCQkJQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTyA6IEFSNUtfSU5JVF9TTE9UX1RJTUUsCi0JCQlBUjVLX1NMT1RfVElNRSk7Ci0JCS8qIFNldCBBQ0tfQ1RTIHRpbWVvdXQgKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPwotCQkJQVI1S19JTklUX0FDS19DVFNfVElNRU9VVF9UVVJCTyA6Ci0JCQlBUjVLX0lOSVRfQUNLX0NUU19USU1FT1VULCBBUjVLX1NMT1RfVElNRSk7Ci0JCS8qIFNldCBUcmFuc21pdCBMYXRlbmN5ICovCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KLQkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZX1RVUkJPIDoKLQkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZLCBBUjVLX1VTRUNfNTIxMCk7Ci0JCS8qIFNldCBJRlMwICovCi0JCWlmIChhaC0+YWhfdHVyYm8pCi0JCQkgYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoKEFSNUtfSU5JVF9TSUZTX1RVUkJPICsKLQkJCQkoYWgtPmFoX2FpZnMgKyB0cS0+dHFpX2FpZnMpICoKLQkJCQlBUjVLX0lOSVRfU0xPVF9USU1FX1RVUkJPKSA8PAotCQkJCUFSNUtfSUZTMF9ESUZTX1MpIHwgQVI1S19JTklUX1NJRlNfVFVSQk8sCi0JCQkJQVI1S19JRlMwKTsKLQkJZWxzZQotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoKEFSNUtfSU5JVF9TSUZTICsKLQkJCQkoYWgtPmFoX2FpZnMgKyB0cS0+dHFpX2FpZnMpICoKLQkJCQlBUjVLX0lOSVRfU0xPVF9USU1FKSA8PCBBUjVLX0lGUzBfRElGU19TKSB8Ci0JCQkJQVI1S19JTklUX1NJRlMsIEFSNUtfSUZTMCk7Ci0KLQkJLyogU2V0IElGUzEgKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPwotCQkJQVI1S19JTklUX1BST1RPX1RJTUVfQ05UUkxfVFVSQk8gOgotCQkJQVI1S19JTklUX1BST1RPX1RJTUVfQ05UUkwsIEFSNUtfSUZTMSk7Ci0JCS8qIFNldCBBUjVLX1BIWV9TRVRUTElORyAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF90dXJibyA/Ci0JCQkoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1NFVFRMSU5HKSAmIH4weDdGKQotCQkJfCAweDM4IDoKLQkJCShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfU0VUVExJTkcpICYgfjB4N0YpCi0JCQl8IDB4MUMsCi0JCQlBUjVLX1BIWV9TRVRUTElORyk7Ci0JCS8qIFNldCBGcmFtZSBDb250cm9sIFJlZ2lzdGVyICovCi0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KLQkJCShBUjVLX1BIWV9GUkFNRV9DVExfSU5JIHwgQVI1S19QSFlfVFVSQk9fTU9ERSB8Ci0JCQlBUjVLX1BIWV9UVVJCT19TSE9SVCB8IDB4MjAyMCkgOgotCQkJKEFSNUtfUEhZX0ZSQU1FX0NUTF9JTkkgfCAweDEwMjApLAotCQkJQVI1S19QSFlfRlJBTUVfQ1RMXzUyMTApOwotCX0KLQotCS8qCi0JICogQ2FsY3VsYXRlIGN3bWluL21heCBieSBjaGFubmVsIG1vZGUKLQkgKi8KLQljd19taW4gPSBhaC0+YWhfY3dfbWluID0gQVI1S19UVU5FX0NXTUlOOwotCWN3X21heCA9IGFoLT5haF9jd19tYXggPSBBUjVLX1RVTkVfQ1dNQVg7Ci0JYWgtPmFoX2FpZnMgPSBBUjVLX1RVTkVfQUlGUzsKLQkvKlhSIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDUyMTIqLwotCWlmIChJU19DSEFOX1hSKGFoLT5haF9jdXJyZW50X2NoYW5uZWwpICYmCi0JCQlhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgewotCQljd19taW4gPSBhaC0+YWhfY3dfbWluID0gQVI1S19UVU5FX0NXTUlOX1hSOwotCQljd19tYXggPSBhaC0+YWhfY3dfbWF4ID0gQVI1S19UVU5FX0NXTUFYX1hSOwotCQlhaC0+YWhfYWlmcyA9IEFSNUtfVFVORV9BSUZTX1hSOwotCS8qQiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gNTIxMCovCi0JfSBlbHNlIGlmIChJU19DSEFOX0IoYWgtPmFoX2N1cnJlbnRfY2hhbm5lbCkgJiYKLQkJCWFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7Ci0JCWN3X21pbiA9IGFoLT5haF9jd19taW4gPSBBUjVLX1RVTkVfQ1dNSU5fMTFCOwotCQljd19tYXggPSBhaC0+YWhfY3dfbWF4ID0gQVI1S19UVU5FX0NXTUFYXzExQjsKLQkJYWgtPmFoX2FpZnMgPSBBUjVLX1RVTkVfQUlGU18xMUI7Ci0JfQotCi0JY3dfbWluID0gMTsKLQl3aGlsZSAoY3dfbWluIDwgYWgtPmFoX2N3X21pbikKLQkJY3dfbWluID0gKGN3X21pbiA8PCAxKSB8IDE7Ci0KLQljd19taW4gPSB0cS0+dHFpX2N3X21pbiA8IDAgPyAoY3dfbWluID4+ICgtdHEtPnRxaV9jd19taW4pKSA6Ci0JCSgoY3dfbWluIDw8IHRxLT50cWlfY3dfbWluKSArICgxIDw8IHRxLT50cWlfY3dfbWluKSAtIDEpOwotCWN3X21heCA9IHRxLT50cWlfY3dfbWF4IDwgMCA/IChjd19tYXggPj4gKC10cS0+dHFpX2N3X21heCkpIDoKLQkJKChjd19tYXggPDwgdHEtPnRxaV9jd19tYXgpICsgKDEgPDwgdHEtPnRxaV9jd19tYXgpIC0gMSk7Ci0KLQkvKgotCSAqIENhbGN1bGF0ZSBhbmQgc2V0IHJldHJ5IGxpbWl0cwotCSAqLwotCWlmIChhaC0+YWhfc29mdHdhcmVfcmV0cnkpIHsKLQkJLyogWFhYIE5lZWQgdG8gdGVzdCB0aGlzICovCi0JCXJldHJ5X2xnID0gYWgtPmFoX2xpbWl0X3R4X3JldHJpZXM7Ci0JCXJldHJ5X3NoID0gcmV0cnlfbGcgPSByZXRyeV9sZyA+IEFSNUtfRENVX1JFVFJZX0xNVF9TSF9SRVRSWSA/Ci0JCQlBUjVLX0RDVV9SRVRSWV9MTVRfU0hfUkVUUlkgOiByZXRyeV9sZzsKLQl9IGVsc2UgewotCQlyZXRyeV9sZyA9IEFSNUtfSU5JVF9MR19SRVRSWTsKLQkJcmV0cnlfc2ggPSBBUjVLX0lOSVRfU0hfUkVUUlk7Ci0JfQotCi0JLypObyBRQ1UvRENVIFs1MjEwXSovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKLQkJCShjd19taW4gPDwgQVI1S19OT0RDVV9SRVRSWV9MTVRfQ1dfTUlOX1MpCi0JCQl8IEFSNUtfUkVHX1NNKEFSNUtfSU5JVF9TTEdfUkVUUlksCi0JCQkJQVI1S19OT0RDVV9SRVRSWV9MTVRfU0xHX1JFVFJZKQotCQkJfCBBUjVLX1JFR19TTShBUjVLX0lOSVRfU1NIX1JFVFJZLAotCQkJCUFSNUtfTk9EQ1VfUkVUUllfTE1UX1NTSF9SRVRSWSkKLQkJCXwgQVI1S19SRUdfU00ocmV0cnlfbGcsIEFSNUtfTk9EQ1VfUkVUUllfTE1UX0xHX1JFVFJZKQotCQkJfCBBUjVLX1JFR19TTShyZXRyeV9zaCwgQVI1S19OT0RDVV9SRVRSWV9MTVRfU0hfUkVUUlkpLAotCQkJQVI1S19OT0RDVV9SRVRSWV9MTVQpOwotCX0gZWxzZSB7Ci0JCS8qUUNVL0RDVSBbNTIxMStdKi8KLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAotCQkJQVI1S19SRUdfU00oQVI1S19JTklUX1NMR19SRVRSWSwKLQkJCQlBUjVLX0RDVV9SRVRSWV9MTVRfU0xHX1JFVFJZKSB8Ci0JCQlBUjVLX1JFR19TTShBUjVLX0lOSVRfU1NIX1JFVFJZLAotCQkJCUFSNUtfRENVX1JFVFJZX0xNVF9TU0hfUkVUUlkpIHwKLQkJCUFSNUtfUkVHX1NNKHJldHJ5X2xnLCBBUjVLX0RDVV9SRVRSWV9MTVRfTEdfUkVUUlkpIHwKLQkJCUFSNUtfUkVHX1NNKHJldHJ5X3NoLCBBUjVLX0RDVV9SRVRSWV9MTVRfU0hfUkVUUlkpLAotCQkJQVI1S19RVUVVRV9ERlNfUkVUUllfTElNSVQocXVldWUpKTsKLQotCS8qPT09UmVzdCBpcyBhbHNvIGZvciBRQ1UvRENVIG9ubHkgWzUyMTErXT09PSovCi0KLQkJLyoKLQkJICogU2V0IGluaXRpYWwgY29udGVudCB3aW5kb3cgKGN3X21pbi9jd19tYXgpCi0JCSAqIGFuZCBhcmJpdHJhdGVkIGludGVyZnJhbWUgc3BhY2UgKGFpZnMpLi4uCi0JCSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCi0JCQlBUjVLX1JFR19TTShjd19taW4sIEFSNUtfRENVX0xDTF9JRlNfQ1dfTUlOKSB8Ci0JCQlBUjVLX1JFR19TTShjd19tYXgsIEFSNUtfRENVX0xDTF9JRlNfQ1dfTUFYKSB8Ci0JCQlBUjVLX1JFR19TTShhaC0+YWhfYWlmcyArIHRxLT50cWlfYWlmcywKLQkJCQlBUjVLX0RDVV9MQ0xfSUZTX0FJRlMpLAotCQkJQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKHF1ZXVlKSk7Ci0KLQkJLyoKLQkJICogU2V0IG1pc2MgcmVnaXN0ZXJzCi0JCSAqLwotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUUNVX01JU0NfRENVX0VBUkxZLAotCQkJQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSk7Ci0KLQkJaWYgKHRxLT50cWlfY2JyX3BlcmlvZCkgewotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTSh0cS0+dHFpX2Nicl9wZXJpb2QsCi0JCQkJQVI1S19RQ1VfQ0JSQ0ZHX0lOVFZBTCkgfAotCQkJCUFSNUtfUkVHX1NNKHRxLT50cWlfY2JyX292ZXJmbG93X2xpbWl0LAotCQkJCUFSNUtfUUNVX0NCUkNGR19PUk5fVEhSRVMpLAotCQkJCUFSNUtfUVVFVUVfQ0JSQ0ZHKHF1ZXVlKSk7Ci0JCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSwKLQkJCQlBUjVLX1FDVV9NSVNDX0ZSU0hFRF9DQlIpOwotCQkJaWYgKHRxLT50cWlfY2JyX292ZXJmbG93X2xpbWl0KQotCQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLAotCQkJCQlBUjVLX1FVRVVFX01JU0MocXVldWUpLAotCQkJCQlBUjVLX1FDVV9NSVNDX0NCUl9USFJFU19FTkFCTEUpOwotCQl9Ci0KLQkJaWYgKHRxLT50cWlfcmVhZHlfdGltZSkKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00odHEtPnRxaV9yZWFkeV90aW1lLAotCQkJCUFSNUtfUUNVX1JEWVRJTUVDRkdfSU5UVkFMKSB8Ci0JCQkJQVI1S19RQ1VfUkRZVElNRUNGR19FTkFCTEUsCi0JCQkJQVI1S19RVUVVRV9SRFlUSU1FQ0ZHKHF1ZXVlKSk7Ci0KLQkJaWYgKHRxLT50cWlfYnVyc3RfdGltZSkgewotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTSh0cS0+dHFpX2J1cnN0X3RpbWUsCi0JCQkJQVI1S19EQ1VfQ0hBTl9USU1FX0RVUikgfAotCQkJCUFSNUtfRENVX0NIQU5fVElNRV9FTkFCTEUsCi0JCQkJQVI1S19RVUVVRV9ERlNfQ0hBTk5FTF9USU1FKHF1ZXVlKSk7Ci0KLQkJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19SRFlUSU1FX0VYUF9QT0xJQ1lfRU5BQkxFKQotCQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLAotCQkJCQlBUjVLX1FVRVVFX01JU0MocXVldWUpLAotCQkJCQlBUjVLX1FDVV9NSVNDX1JEWV9WRU9MX1BPTElDWSk7Ci0JCX0KLQotCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfQkFDS09GRl9ESVNBQkxFKQotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0RDVV9NSVNDX1BPU1RfRlJfQktPRkZfRElTLAotCQkJCUFSNUtfUVVFVUVfREZTX01JU0MocXVldWUpKTsKLQotCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfRlJBR19CVVJTVF9CQUNLT0ZGX0VOQUJMRSkKLQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19EQ1VfTUlTQ19CQUNLT0ZGX0ZSQUcsCi0JCQkJQVI1S19RVUVVRV9ERlNfTUlTQyhxdWV1ZSkpOwotCi0JCS8qCi0JCSAqIFNldCByZWdpc3RlcnMgYnkgcXVldWUgdHlwZQotCQkgKi8KLQkJc3dpdGNoICh0cS0+dHFpX3R5cGUpIHsKLQkJY2FzZSBBUjVLX1RYX1FVRVVFX0JFQUNPTjoKLQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX01JU0MocXVldWUpLAotCQkJCUFSNUtfUUNVX01JU0NfRlJTSEVEX0RCQV9HVCB8Ci0JCQkJQVI1S19RQ1VfTUlTQ19DQlJFWFBfQkNOIHwKLQkJCQlBUjVLX1FDVV9NSVNDX0JDTl9FTkFCTEUpOwotCi0JCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9ERlNfTUlTQyhxdWV1ZSksCi0JCQkJKEFSNUtfRENVX01JU0NfQVJCTE9DS19DVExfR0xPQkFMIDw8Ci0JCQkJQVI1S19EQ1VfTUlTQ19BUkJMT0NLX0NUTF9TKSB8Ci0JCQkJQVI1S19EQ1VfTUlTQ19QT1NUX0ZSX0JLT0ZGX0RJUyB8Ci0JCQkJQVI1S19EQ1VfTUlTQ19CQ05fRU5BQkxFKTsKLQotCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoKEFSNUtfVFVORV9CRUFDT05fSU5URVJWQUwgLQotCQkJCShBUjVLX1RVTkVfU1dfQkVBQ09OX1JFU1AgLQotCQkJCUFSNUtfVFVORV9ETUFfQkVBQ09OX1JFU1ApIC0KLQkJCQlBUjVLX1RVTkVfQURESVRJT05BTF9TV0JBX0JBQ0tPRkYpICogMTAyNCkgfAotCQkJCUFSNUtfUUNVX1JEWVRJTUVDRkdfRU5BQkxFLAotCQkJCUFSNUtfUVVFVUVfUkRZVElNRUNGRyhxdWV1ZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKLQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX01JU0MocXVldWUpLAotCQkJCUFSNUtfUUNVX01JU0NfRlJTSEVEX0RCQV9HVCB8Ci0JCQkJQVI1S19RQ1VfTUlTQ19DQlJFWFAgfAotCQkJCUFSNUtfUUNVX01JU0NfQ0JSRVhQX0JDTik7Ci0KLQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX0RGU19NSVNDKHF1ZXVlKSwKLQkJCQkoQVI1S19EQ1VfTUlTQ19BUkJMT0NLX0NUTF9HTE9CQUwgPDwKLQkJCQlBUjVLX0RDVV9NSVNDX0FSQkxPQ0tfQ1RMX1MpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVI1S19UWF9RVUVVRV9VQVBTRDoKLQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX01JU0MocXVldWUpLAotCQkJCUFSNUtfUUNVX01JU0NfQ0JSRVhQKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB0eCBxdWV1ZQotCQkgKiBpbiB0aGUgc2Vjb25kYXJ5IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycwotCQkgKi8KLQkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYT0tJTlRfRU5BQkxFKQotCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4b2ssIHF1ZXVlKTsKLQotCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfVFhFUlJJTlRfRU5BQkxFKQotCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZXJyLCBxdWV1ZSk7Ci0KLQkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYVVJOSU5UX0VOQUJMRSkKLQkJCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX2ltcl90eHVybiwgcXVldWUpOwotCi0JCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWERFU0NJTlRfRU5BQkxFKQotCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZGVzYywgcXVldWUpOwotCi0JCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWEVPTElOVF9FTkFCTEUpCi0JCQlBUjVLX1FfRU5BQkxFX0JJVFMoYWgtPmFoX3R4cV9pbXJfdHhlb2wsIHF1ZXVlKTsKLQotCi0JCS8qIFVwZGF0ZSBzZWNvbmRhcnkgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXJzICovCi0JCWFoLT5haF90eHFfaW1yX3R4b2sgJj0gYWgtPmFoX3R4cV9zdGF0dXM7Ci0JCWFoLT5haF90eHFfaW1yX3R4ZXJyICY9IGFoLT5haF90eHFfc3RhdHVzOwotCQlhaC0+YWhfdHhxX2ltcl90eHVybiAmPSBhaC0+YWhfdHhxX3N0YXR1czsKLQkJYWgtPmFoX3R4cV9pbXJfdHhkZXNjICY9IGFoLT5haF90eHFfc3RhdHVzOwotCQlhaC0+YWhfdHhxX2ltcl90eGVvbCAmPSBhaC0+YWhfdHhxX3N0YXR1czsKLQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUkVHX1NNKGFoLT5haF90eHFfaW1yX3R4b2ssCi0JCQlBUjVLX1NJTVIwX1FDVV9UWE9LKSB8Ci0JCQlBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGRlc2MsCi0JCQlBUjVLX1NJTVIwX1FDVV9UWERFU0MpLCBBUjVLX1NJTVIwKTsKLQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGVyciwKLQkJCUFSNUtfU0lNUjFfUUNVX1RYRVJSKSB8Ci0JCQlBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGVvbCwKLQkJCUFSNUtfU0lNUjFfUUNVX1RYRU9MKSwgQVI1S19TSU1SMSk7Ci0JCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00oYWgtPmFoX3R4cV9pbXJfdHh1cm4sCi0JCQlBUjVLX1NJTVIyX1FDVV9UWFVSTiksIEFSNUtfU0lNUjIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogR2V0IG51bWJlciBvZiBwZW5kaW5nIGZyYW1lcwotICogZm9yIGEgc3BlY2lmaWMgcXVldWUgWzUyMTErXQotICovCi11MzIgYXRoNWtfaHdfbnVtX3R4X3BlbmRpbmcoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKSB7Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKLQotCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkZWNsYXJlZCBpbmFjdGl2ZSAqLwotCWlmIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBYWFg6IEhvdyBhYm91dCBBUjVLX0NGR19UWENOVCA/ICovCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gQVI1S19RVUVVRV9TVEFUVVMocXVldWUpICYgQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQ7Ci19Ci0KLS8qCi0gKiBTZXQgc2xvdCB0aW1lCi0gKi8KLWludCBhdGg1a19od19zZXRfc2xvdF90aW1lKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzbG90X3RpbWUpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlpZiAoc2xvdF90aW1lIDwgQVI1S19TTE9UX1RJTUVfOSB8fCBzbG90X3RpbWUgPiBBUjVLX1NMT1RfVElNRV9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGF0aDVrX2h3X2h0b2Nsb2NrKHNsb3RfdGltZSwKLQkJCQlhaC0+YWhfdHVyYm8pLCBBUjVLX1NMT1RfVElNRSk7Ci0JZWxzZQotCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNsb3RfdGltZSwgQVI1S19EQ1VfR0JMX0lGU19TTE9UKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogR2V0IHNsb3QgdGltZQotICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X3Nsb3RfdGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQotCQlyZXR1cm4gYXRoNWtfaHdfY2xvY2t0b2goYXRoNWtfaHdfcmVnX3JlYWQoYWgsCi0JCQkJQVI1S19TTE9UX1RJTUUpICYgMHhmZmZmLCBhaC0+YWhfdHVyYm8pOwotCWVsc2UKLQkJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0RDVV9HQkxfSUZTX1NMT1QpICYgMHhmZmZmOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gSGFyZHdhcmUgRGVzY3JpcHRvciBGdW5jdGlvbnMKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBUWCBEZXNjcmlwdG9yCi0gKi8KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIDItd29yZCB0eCBkZXNjcmlwdG9yIG9uIDUyMTAvNTIxMQotICovCi1zdGF0aWMgaW50Ci1hdGg1a19od19zZXR1cF8yd29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAotCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwgZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAotCXVuc2lnbmVkIGludCB0eF9wb3dlciwgdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAotCXVuc2lnbmVkIGludCBrZXlfaW5kZXgsIHVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsIHVuc2lnbmVkIGludCBmbGFncywKLQl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCi17Ci0JdTMyIGZyYW1lX3R5cGU7Ci0Jc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bCAqdHhfY3RsOwotCXVuc2lnbmVkIGludCBmcmFtZV9sZW47Ci0KLQl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEwLnR4X2N0bDsKLQotCS8qCi0JICogVmFsaWRhdGUgaW5wdXQKLQkgKiAtIFplcm8gcmV0cmllcyBkb24ndCBtYWtlIHNlbnNlLgotCSAqIC0gQSB6ZXJvIHJhdGUgd2lsbCBwdXQgdGhlIEhXIGludG8gYSBtb2RlIHdoZXJlIGl0IGNvbnRpbm91c2x5IHNlbmRzCi0JICogICBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHRoaXMuCi0JICovCi0JaWYgKHVubGlrZWx5KHR4X3RyaWVzMCA9PSAwKSkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByZXRyaWVzXG4iKTsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICh1bmxpa2VseSh0eF9yYXRlMCA9PSAwKSkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByYXRlXG4iKTsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQ2xlYXIgZGVzY3JpcHRvciAqLwotCW1lbXNldCgmZGVzYy0+dWQuZHNfdHg1MjEwLCAwLCBzaXplb2Yoc3RydWN0IGF0aDVrX2h3XzUyMTBfdHhfZGVzYykpOwotCi0JLyogU2V0dXAgY29udHJvbCBkZXNjcmlwdG9yICovCi0KLQkvKiBWZXJpZnkgYW5kIHNldCBmcmFtZSBsZW5ndGggKi8KLQotCS8qIHJlbW92ZSBwYWRkaW5nIHdlIG1pZ2h0IGhhdmUgYWRkZWQgYmVmb3JlICovCi0JZnJhbWVfbGVuID0gcGt0X2xlbiAtIChoZHJfbGVuICYgMykgKyBGQ1NfTEVOOwotCi0JaWYgKGZyYW1lX2xlbiAmIH5BUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdHhfY3RsLT50eF9jb250cm9sXzAgPSBmcmFtZV9sZW4gJiBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9GUkFNRV9MRU47Ci0KLQkvKiBWZXJpZnkgYW5kIHNldCBidWZmZXIgbGVuZ3RoICovCi0KLQkvKiBOQjogYmVhY29uJ3MgQnVmTGVuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzICovCi0JaWYodHlwZSA9PSBBUjVLX1BLVF9UWVBFX0JFQUNPTikKLQkJcGt0X2xlbiA9IHJvdW5kdXAocGt0X2xlbiwgNCk7Ci0KLQlpZiAocGt0X2xlbiAmIH5BUjVLXzJXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXR4X2N0bC0+dHhfY29udHJvbF8xID0gcGt0X2xlbiAmIEFSNUtfMldfVFhfREVTQ19DVEwxX0JVRl9MRU47Ci0KLQkvKgotCSAqIFZlcmlmeSBhbmQgc2V0IGhlYWRlciBsZW5ndGgKLQkgKiBYWFg6IEkgb25seSBmb3VuZCB0aGF0IG9uIDUyMTAgY29kZSwgZG9lcyBpdCB3b3JrIG9uIDUyMTEgPwotCSAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQlpZiAoaGRyX2xlbiAmIH5BUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXR4X2N0bC0+dHhfY29udHJvbF8wIHw9Ci0JCQlBUjVLX1JFR19TTShoZHJfbGVuLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9IRUFERVJfTEVOKTsKLQl9Ci0KLQkvKkRpZmVyZW5jZXMgYmV0d2VlbiA1MjEwLTUyMTEqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBUjVLX1BLVF9UWVBFX0JFQUNPTjoKLQkJY2FzZSBBUjVLX1BLVF9UWVBFX1BST0JFX1JFU1A6Ci0JCQlmcmFtZV90eXBlID0gQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PX0RFTEFZOwotCQljYXNlIEFSNUtfUEtUX1RZUEVfUElGUzoKLQkJCWZyYW1lX3R5cGUgPSBBUjVLX0FSNTIxMF9UWF9ERVNDX0ZSQU1FX1RZUEVfUElGUzsKLQkJZGVmYXVsdDoKLQkJCWZyYW1lX3R5cGUgPSB0eXBlIC8qPDwgMiA/Ki87Ci0JCX0KLQotCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQotCQkJQVI1S19SRUdfU00oZnJhbWVfdHlwZSwgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRSkgfAotCQkJQVI1S19SRUdfU00odHhfcmF0ZTAsIEFSNUtfMldfVFhfREVTQ19DVEwwX1hNSVRfUkFURSk7Ci0JfSBlbHNlIHsKLQkJdHhfY3RsLT50eF9jb250cm9sXzAgfD0KLQkJCUFSNUtfUkVHX1NNKHR4X3JhdGUwLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUpIHwKLQkJCUFSNUtfUkVHX1NNKGFudGVubmFfbW9kZSwgQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVCk7Ci0JCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9Ci0JCQlBUjVLX1JFR19TTSh0eXBlLCBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFKTsKLQl9Ci0jZGVmaW5lIF9UWF9GTEFHUyhfYywgX2ZsYWcpCQkJCQkJXAotCWlmIChmbGFncyAmIEFSNUtfVFhERVNDXyMjX2ZsYWcpCQkJCVwKLQkJdHhfY3RsLT50eF9jb250cm9sXyMjX2MgfD0JCQkJXAotCQkJQVI1S18yV19UWF9ERVNDX0NUTCMjX2MjI18jI19mbGFnCi0KLQlfVFhfRkxBR1MoMCwgQ0xSRE1BU0spOwotCV9UWF9GTEFHUygwLCBWRU9MKTsKLQlfVFhfRkxBR1MoMCwgSU5UUkVRKTsKLQlfVFhfRkxBR1MoMCwgUlRTRU5BKTsKLQlfVFhfRkxBR1MoMSwgTk9BQ0spOwotCi0jdW5kZWYgX1RYX0ZMQUdTCi0KLQkvKgotCSAqIFdFUCBjcmFwCi0JICovCi0JaWYgKGtleV9pbmRleCAhPSBBUjVLX1RYS0VZSVhfSU5WQUxJRCkgewotCQl0eF9jdGwtPnR4X2NvbnRyb2xfMCB8PQotCQkJQVI1S18yV19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQ7Ci0JCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9Ci0JCQlBUjVLX1JFR19TTShrZXlfaW5kZXgsCi0JCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWCk7Ci0JfQotCi0JLyoKLQkgKiBSVFMvQ1RTIER1cmF0aW9uIFs1MjEwID9dCi0JICovCi0JaWYgKChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgJiYKLQkJCShmbGFncyAmIChBUjVLX1RYREVTQ19SVFNFTkEgfCBBUjVLX1RYREVTQ19DVFNFTkEpKSkKLQkJdHhfY3RsLT50eF9jb250cm9sXzEgfD0gcnRzY3RzX2R1cmF0aW9uICYKLQkJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9SVFNfRFVSQVRJT047Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIDQtd29yZCB0eCBkZXNjcmlwdG9yIG9uIDUyMTIKLSAqLwotc3RhdGljIGludCBhdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCi0Jc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKLQllbnVtIGF0aDVrX3BrdF90eXBlIHR5cGUsIHVuc2lnbmVkIGludCB0eF9wb3dlciwgdW5zaWduZWQgaW50IHR4X3JhdGUwLAotCXVuc2lnbmVkIGludCB0eF90cmllczAsIHVuc2lnbmVkIGludCBrZXlfaW5kZXgsCi0JdW5zaWduZWQgaW50IGFudGVubmFfbW9kZSwgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19kdXJhdGlvbikKLXsKLQlzdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsICp0eF9jdGw7Ci0JdW5zaWduZWQgaW50IGZyYW1lX2xlbjsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JdHhfY3RsID0gJmRlc2MtPnVkLmRzX3R4NTIxMi50eF9jdGw7Ci0KLQkvKgotCSAqIFZhbGlkYXRlIGlucHV0Ci0JICogLSBaZXJvIHJldHJpZXMgZG9uJ3QgbWFrZSBzZW5zZS4KLQkgKiAtIEEgemVybyByYXRlIHdpbGwgcHV0IHRoZSBIVyBpbnRvIGEgbW9kZSB3aGVyZSBpdCBjb250aW5vdXNseSBzZW5kcwotCSAqICAgbm9pc2Ugb24gdGhlIGNoYW5uZWwsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhdm9pZCB0aGlzLgotCSAqLwotCWlmICh1bmxpa2VseSh0eF90cmllczAgPT0gMCkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgInplcm8gcmV0cmllc1xuIik7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodW5saWtlbHkodHhfcmF0ZTAgPT0gMCkpIHsKLQkJQVRINUtfRVJSKGFoLT5haF9zYywgInplcm8gcmF0ZVxuIik7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIENsZWFyIGRlc2NyaXB0b3IgKi8KLQltZW1zZXQoJmRlc2MtPnVkLmRzX3R4NTIxMiwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg1a19od181MjEyX3R4X2Rlc2MpKTsKLQotCS8qIFNldHVwIGNvbnRyb2wgZGVzY3JpcHRvciAqLwotCi0JLyogVmVyaWZ5IGFuZCBzZXQgZnJhbWUgbGVuZ3RoICovCi0KLQkvKiByZW1vdmUgcGFkZGluZyB3ZSBtaWdodCBoYXZlIGFkZGVkIGJlZm9yZSAqLwotCWZyYW1lX2xlbiA9IHBrdF9sZW4gLSAoaGRyX2xlbiAmIDMpICsgRkNTX0xFTjsKLQotCWlmIChmcmFtZV9sZW4gJiB+QVI1S180V19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXR4X2N0bC0+dHhfY29udHJvbF8wID0gZnJhbWVfbGVuICYgQVI1S180V19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOOwotCi0JLyogVmVyaWZ5IGFuZCBzZXQgYnVmZmVyIGxlbmd0aCAqLwotCi0JLyogTkI6IGJlYWNvbidzIEJ1ZkxlbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBieXRlcyAqLwotCWlmKHR5cGUgPT0gQVI1S19QS1RfVFlQRV9CRUFDT04pCi0JCXBrdF9sZW4gPSByb3VuZHVwKHBrdF9sZW4sIDQpOwotCi0JaWYgKHBrdF9sZW4gJiB+QVI1S180V19UWF9ERVNDX0NUTDFfQlVGX0xFTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0eF9jdGwtPnR4X2NvbnRyb2xfMSA9IHBrdF9sZW4gJiBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOOwotCi0JdHhfY3RsLT50eF9jb250cm9sXzAgfD0KLQkJQVI1S19SRUdfU00odHhfcG93ZXIsIEFSNUtfNFdfVFhfREVTQ19DVEwwX1hNSVRfUE9XRVIpIHwKLQkJQVI1S19SRUdfU00oYW50ZW5uYV9tb2RlLCBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUKTsKLQl0eF9jdGwtPnR4X2NvbnRyb2xfMSB8PSBBUjVLX1JFR19TTSh0eXBlLAotCQkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFKTsKLQl0eF9jdGwtPnR4X2NvbnRyb2xfMiA9IEFSNUtfUkVHX1NNKHR4X3RyaWVzMCArIEFSNUtfVFVORV9IV1RYVFJJRVMsCi0JCQkJCUFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMwKTsKLQl0eF9jdGwtPnR4X2NvbnRyb2xfMyA9IHR4X3JhdGUwICYgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMDsKLQotI2RlZmluZSBfVFhfRkxBR1MoX2MsIF9mbGFnKQkJCVwKLQlpZiAoZmxhZ3MgJiBBUjVLX1RYREVTQ18jI19mbGFnKQlcCi0JCXR4X2N0bC0+dHhfY29udHJvbF8jI19jIHw9CVwKLQkJCUFSNUtfNFdfVFhfREVTQ19DVEwjI19jIyNfIyNfZmxhZwotCi0JX1RYX0ZMQUdTKDAsIENMUkRNQVNLKTsKLQlfVFhfRkxBR1MoMCwgVkVPTCk7Ci0JX1RYX0ZMQUdTKDAsIElOVFJFUSk7Ci0JX1RYX0ZMQUdTKDAsIFJUU0VOQSk7Ci0JX1RYX0ZMQUdTKDAsIENUU0VOQSk7Ci0JX1RYX0ZMQUdTKDEsIE5PQUNLKTsKLQotI3VuZGVmIF9UWF9GTEFHUwotCi0JLyoKLQkgKiBXRVAgY3JhcAotCSAqLwotCWlmIChrZXlfaW5kZXggIT0gQVI1S19UWEtFWUlYX0lOVkFMSUQpIHsKLQkJdHhfY3RsLT50eF9jb250cm9sXzAgfD0gQVI1S180V19UWF9ERVNDX0NUTDBfRU5DUllQVF9LRVlfVkFMSUQ7Ci0JCXR4X2N0bC0+dHhfY29udHJvbF8xIHw9IEFSNUtfUkVHX1NNKGtleV9pbmRleCwKLQkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWCk7Ci0JfQotCi0JLyoKLQkgKiBSVFMvQ1RTCi0JICovCi0JaWYgKGZsYWdzICYgKEFSNUtfVFhERVNDX1JUU0VOQSB8IEFSNUtfVFhERVNDX0NUU0VOQSkpIHsKLQkJaWYgKChmbGFncyAmIEFSNUtfVFhERVNDX1JUU0VOQSkgJiYKLQkJCQkoZmxhZ3MgJiBBUjVLX1RYREVTQ19DVFNFTkEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXR4X2N0bC0+dHhfY29udHJvbF8yIHw9IHJ0c2N0c19kdXJhdGlvbiAmCi0JCQkJQVI1S180V19UWF9ERVNDX0NUTDJfUlRTX0RVUkFUSU9OOwotCQl0eF9jdGwtPnR4X2NvbnRyb2xfMyB8PSBBUjVLX1JFR19TTShydHNjdHNfcmF0ZSwKLQkJCQlBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBhIDQtd29yZCBtdWx0aXJhdGUgdHggZGVzY3JpcHRvciBvbiA1MjEyCi0gKi8KLXN0YXRpYyBpbnQKLWF0aDVrX2h3X3NldHVwX3hyX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLCB1X2ludCB0eF90cmllczIsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCi17Ci0Jc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwotCi0JLyoKLQkgKiBSYXRlcyBjYW4gYmUgMCBhcyBsb25nIGFzIHRoZSByZXRyeSBjb3VudCBpcyAwIHRvby4KLQkgKiBBIHplcm8gcmF0ZSBhbmQgbm9uemVybyByZXRyeSBjb3VudCB3aWxsIHB1dCB0aGUgSFcgaW50byBhIG1vZGUgd2hlcmUKLQkgKiBpdCBjb250aW5vdXNseSBzZW5kcyBub2lzZSBvbiB0aGUgY2hhbm5lbCwgc28gaXQgaXMgaW1wb3J0YW50IHRvCi0JICogYXZvaWQgdGhpcy4KLQkgKi8KLQlpZiAodW5saWtlbHkoKHR4X3JhdGUxID09IDAgJiYgdHhfdHJpZXMxICE9IDApIHx8Ci0JCSAgICAgKHR4X3JhdGUyID09IDAgJiYgdHhfdHJpZXMyICE9IDApIHx8Ci0JCSAgICAgKHR4X3JhdGUzID09IDAgJiYgdHhfdHJpZXMzICE9IDApKSkgewotCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiemVybyByYXRlXG4iKTsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7Ci0JCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTIudHhfY3RsOwotCi0jZGVmaW5lIF9YVFhfVFJJRVMoX24pCQkJCQkJCVwKLQlpZiAodHhfdHJpZXMjI19uKSB7CQkJCQkJXAotCQl0eF9jdGwtPnR4X2NvbnRyb2xfMiB8PQkJCQlcCi0JCSAgICBBUjVLX1JFR19TTSh0eF90cmllcyMjX24sCQkJCVwKLQkJICAgIEFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMjI19uKTsJCVwKLQkJdHhfY3RsLT50eF9jb250cm9sXzMgfD0JCQkJXAotCQkgICAgQVI1S19SRUdfU00odHhfcmF0ZSMjX24sCQkJCVwKLQkJICAgIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURSMjX24pOwkJXAotCX0KLQotCQlfWFRYX1RSSUVTKDEpOwotCQlfWFRYX1RSSUVTKDIpOwotCQlfWFRYX1RSSUVTKDMpOwotCi0jdW5kZWYgX1hUWF9UUklFUwotCi0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogUHJvY2Nlc3MgdGhlIHR4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTAvNTIxMQotICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzICp0cykKLXsKLQlzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsICp0eF9jdGw7Ci0Jc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cyAqdHhfc3RhdHVzOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCXR4X2N0bCA9ICZkZXNjLT51ZC5kc190eDUyMTAudHhfY3RsOwotCXR4X3N0YXR1cyA9ICZkZXNjLT51ZC5kc190eDUyMTAudHhfc3RhdDsKLQotCS8qIE5vIGZyYW1lIGhhcyBiZWVuIHNlbmQgb3IgZXJyb3IgKi8KLQlpZiAodW5saWtlbHkoKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMV9ET05FKSA9PSAwKSkKLQkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKLQotCS8qCi0JICogR2V0IGRlc2NyaXB0b3Igc3RhdHVzCi0JICovCi0JdHMtPnRzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCi0JCUFSNUtfREVTQ19UWF9TVEFUVVMwX1NFTkRfVElNRVNUQU1QKTsKLQl0cy0+dHNfc2hvcnRyZXRyeSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCi0JCUFSNUtfREVTQ19UWF9TVEFUVVMwX1NIT1JUX1JFVFJZX0NPVU5UKTsKLQl0cy0+dHNfbG9uZ3JldHJ5ID0gQVI1S19SRUdfTVModHhfc3RhdHVzLT50eF9zdGF0dXNfMCwKLQkJQVI1S19ERVNDX1RYX1NUQVRVUzBfTE9OR19SRVRSWV9DT1VOVCk7Ci0JLypUT0RPOiB0cy0+dHNfdmlydGNvbCArIHRlc3QqLwotCXRzLT50c19zZXFudW0gPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18xLAotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNKTsKLQl0cy0+dHNfcnNzaSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCi0JCUFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEgpOwotCXRzLT50c19hbnRlbm5hID0gMTsKLQl0cy0+dHNfc3RhdHVzID0gMDsKLQl0cy0+dHNfcmF0ZSA9IEFSNUtfUkVHX01TKHR4X2N0bC0+dHhfY29udHJvbF8wLAotCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUpOwotCi0JaWYgKCh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSykgPT0gMCl7Ci0JCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYKLQkJCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9FWENFU1NJVkVfUkVUUklFUykKLQkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9YUkVUUlk7Ci0KLQkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUZPX1VOREVSUlVOKQotCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX0ZJRk87Ci0KLQkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRCkKLQkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9GSUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogUHJvY2Nlc3MgYSB0eCBkZXNjcmlwdG9yIG9uIDUyMTIKLSAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCi17Ci0Jc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwotCXN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgKnR4X3N0YXR1czsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQl0eF9jdGwgPSAmZGVzYy0+dWQuZHNfdHg1MjEyLnR4X2N0bDsKLQl0eF9zdGF0dXMgPSAmZGVzYy0+dWQuZHNfdHg1MjEyLnR4X3N0YXQ7Ci0KLQkvKiBObyBmcmFtZSBoYXMgYmVlbiBzZW5kIG9yIGVycm9yICovCi0JaWYgKHVubGlrZWx5KCh0eF9zdGF0dXMtPnR4X3N0YXR1c18xICYgQVI1S19ERVNDX1RYX1NUQVRVUzFfRE9ORSkgPT0gMCkpCi0JCXJldHVybiAtRUlOUFJPR1JFU1M7Ci0KLQkvKgotCSAqIEdldCBkZXNjcmlwdG9yIHN0YXR1cwotCSAqLwotCXRzLT50c190c3RhbXAgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUCk7Ci0JdHMtPnRzX3Nob3J0cmV0cnkgPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18wLAotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVCk7Ci0JdHMtPnRzX2xvbmdyZXRyeSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAsCi0JCUFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQpOwotCXRzLT50c19zZXFudW0gPSBBUjVLX1JFR19NUyh0eF9zdGF0dXMtPnR4X3N0YXR1c18xLAotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNKTsKLQl0cy0+dHNfcnNzaSA9IEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCi0JCUFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEgpOwotCXRzLT50c19hbnRlbm5hID0gKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEgJgotCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkEpID8gMiA6IDE7Ci0JdHMtPnRzX3N0YXR1cyA9IDA7Ci0KLQlzd2l0Y2ggKEFSNUtfUkVHX01TKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzEsCi0JCQlBUjVLX0RFU0NfVFhfU1RBVFVTMV9GSU5BTF9UU19JTkRFWCkpIHsKLQljYXNlIDA6Ci0JCXRzLT50c19yYXRlID0gdHhfY3RsLT50eF9jb250cm9sXzMgJgotCQkJQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl0cy0+dHNfcmF0ZSA9IEFSNUtfUkVHX01TKHR4X2N0bC0+dHhfY29udHJvbF8zLAotCQkJQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMSk7Ci0JCXRzLT50c19sb25ncmV0cnkgKz0gQVI1S19SRUdfTVModHhfY3RsLT50eF9jb250cm9sXzIsCi0JCQlBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdHMtPnRzX3JhdGUgPSBBUjVLX1JFR19NUyh0eF9jdGwtPnR4X2NvbnRyb2xfMywKLQkJCUFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTIpOwotCQl0cy0+dHNfbG9uZ3JldHJ5ICs9IEFSNUtfUkVHX01TKHR4X2N0bC0+dHhfY29udHJvbF8yLAotCQkJQVI1S180V19UWF9ERVNDX0NUTDJfWE1JVF9UUklFUzIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXRzLT50c19yYXRlID0gQVI1S19SRUdfTVModHhfY3RsLT50eF9jb250cm9sXzMsCi0JCQlBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUzKTsKLQkJdHMtPnRzX2xvbmdyZXRyeSArPSBBUjVLX1JFR19NUyh0eF9jdGwtPnR4X2NvbnRyb2xfMiwKLQkJCUFSNUtfNFdfVFhfREVTQ19DVEwyX1hNSVRfVFJJRVMzKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSykgPT0gMCl7Ci0JCWlmICh0eF9zdGF0dXMtPnR4X3N0YXR1c18wICYKLQkJCQlBUjVLX0RFU0NfVFhfU1RBVFVTMF9FWENFU1NJVkVfUkVUUklFUykKLQkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9YUkVUUlk7Ci0KLQkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUZPX1VOREVSUlVOKQotCQkJdHMtPnRzX3N0YXR1cyB8PSBBUjVLX1RYRVJSX0ZJRk87Ci0KLQkJaWYgKHR4X3N0YXR1cy0+dHhfc3RhdHVzXzAgJiBBUjVLX0RFU0NfVFhfU1RBVFVTMF9GSUxURVJFRCkKLQkJCXRzLT50c19zdGF0dXMgfD0gQVI1S19UWEVSUl9GSUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogUlggRGVzY3JpcHRvcgotICovCi0KLS8qCi0gKiBJbml0aWFsaXplIGFuIHJ4IGRlc2NyaXB0b3IKLSAqLwotaW50IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JCQl1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXN0cnVjdCBhdGg1a19od19yeF9jdGwgKnJ4X2N0bDsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JcnhfY3RsID0gJmRlc2MtPnVkLmRzX3J4LnJ4X2N0bDsKLQotCS8qCi0JICogQ2xlYXIgdGhlIGRlc2NyaXB0b3IKLQkgKiBJZiB3ZSBkb24ndCBjbGVhbiB0aGUgc3RhdHVzIGRlc2NyaXB0b3IsCi0JICogd2hpbGUgc2Nhbm5pbmcgd2UgZ2V0IHRvbyBtYW55IHJlc3VsdHMsCi0JICogbW9zdCBvZiB0aGVtIHZpcnR1YWwsIGFmdGVyIHNvbWUgc2VjcwotCSAqIG9mIHNjYW5uaW5nIHN5c3RlbSBoYW5ncy4gTS5GLgotCSovCi0JbWVtc2V0KCZkZXNjLT51ZC5kc19yeCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYykpOwotCi0JLyogU2V0dXAgZGVzY3JpcHRvciAqLwotCXJ4X2N0bC0+cnhfY29udHJvbF8xID0gc2l6ZSAmIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU47Ci0JaWYgKHVubGlrZWx5KHJ4X2N0bC0+cnhfY29udHJvbF8xICE9IHNpemUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChmbGFncyAmIEFSNUtfUlhERVNDX0lOVFJFUSkKLQkJcnhfY3RsLT5yeF9jb250cm9sXzEgfD0gQVI1S19ERVNDX1JYX0NUTDFfSU5UUkVROwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9jY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCi0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY181MjEwX3J4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCi17Ci0Jc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cyAqcnhfc3RhdHVzOwotCi0Jcnhfc3RhdHVzID0gJmRlc2MtPnVkLmRzX3J4LnUucnhfc3RhdDsKLQotCS8qIE5vIGZyYW1lIHJlY2VpdmVkIC8gbm90IHJlYWR5ICovCi0JaWYgKHVubGlrZWx5KChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9ET05FKQotCQkJCT09IDApKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCi0JLyoKLQkgKiBGcmFtZSByZWNlaXZlIHN0YXR1cwotCSAqLwotCXJzLT5yc19kYXRhbGVuID0gcnhfc3RhdHVzLT5yeF9zdGF0dXNfMCAmCi0JCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU47Ci0JcnMtPnJzX3Jzc2kgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAotCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMKTsKLQlycy0+cnNfcmF0ZSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCi0JCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFKTsKLQlycy0+cnNfYW50ZW5uYSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgotCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQTsKLQlycy0+cnNfbW9yZSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgotCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX01PUkU7Ci0JLyogVE9ETzogdGhpcyB0aW1lc3RhbXAgaXMgMTMgYml0LCBsYXRlciBvbiB3ZSBhc3N1bWUgMTUgYml0ICovCi0JcnMtPnJzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEsCi0JCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVApOwotCXJzLT5yc19zdGF0dXMgPSAwOwotCXJzLT5yc19waHllcnIgPSAwOwotCi0JLyoKLQkgKiBLZXkgdGFibGUgc3RhdHVzCi0JICovCi0JaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJiBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRCkKLQkJcnMtPnJzX2tleWl4ID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKLQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYKTsKLQllbHNlCi0JCXJzLT5yc19rZXlpeCA9IEFSNUtfUlhLRVlJWF9JTlZBTElEOwotCi0JLyoKLQkgKiBSZWNlaXZlL2Rlc2NyaXB0b3IgZXJyb3JzCi0JICovCi0JaWYgKChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSykgPT0gMCkgewotCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCi0JCQkJQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9DUkNfRVJST1IpCi0JCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfQ1JDOwotCi0JCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0ZJRk9fT1ZFUlJVTikKLQkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9GSUZPOwotCi0JCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQkJCQlBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUikgewotCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX1BIWTsKLQkJCXJzLT5yc19waHllcnIgfD0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKLQkJCQkJICAgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IpOwotCQl9Ci0KLQkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgotCQkJCUFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IpCi0JCQlycy0+cnNfc3RhdHVzIHw9IEFSNUtfUlhFUlJfREVDUllQVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFByb2NjZXNzIHRoZSByeCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCi0gKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcHJvY181MjEyX3J4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3J4X3N0YXR1cyAqcnMpCi17Ci0Jc3RydWN0IGF0aDVrX2h3X3J4X3N0YXR1cyAqcnhfc3RhdHVzOwotCXN0cnVjdCBhdGg1a19od19yeF9lcnJvciAqcnhfZXJyOwotCi0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQlyeF9zdGF0dXMgPSAmZGVzYy0+dWQuZHNfcngudS5yeF9zdGF0OwotCi0JLyogT3ZlcmxheSBvbiBlcnJvciAqLwotCXJ4X2VyciA9ICZkZXNjLT51ZC5kc19yeC51LnJ4X2VycjsKLQotCS8qIE5vIGZyYW1lIHJlY2VpdmVkIC8gbm90IHJlYWR5ICovCi0JaWYgKHVubGlrZWx5KChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ET05FKQotCQkJCT09IDApKQotCQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCi0JLyoKLQkgKiBGcmFtZSByZWNlaXZlIHN0YXR1cwotCSAqLwotCXJzLT5yc19kYXRhbGVuID0gcnhfc3RhdHVzLT5yeF9zdGF0dXNfMCAmCi0JCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU47Ci0JcnMtPnJzX3Jzc2kgPSBBUjVLX1JFR19NUyhyeF9zdGF0dXMtPnJ4X3N0YXR1c18wLAotCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMKTsKLQlycy0+cnNfcmF0ZSA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAsCi0JCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9SQVRFKTsKLQlycy0+cnNfYW50ZW5uYSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgotCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQTsKLQlycy0+cnNfbW9yZSA9IHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzAgJgotCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX01PUkU7Ci0JcnMtPnJzX3RzdGFtcCA9IEFSNUtfUkVHX01TKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEsCi0JCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUkVDRUlWRV9USU1FU1RBTVApOwotCXJzLT5yc19zdGF0dXMgPSAwOwotCXJzLT5yc19waHllcnIgPSAwOwotCi0JLyoKLQkgKiBLZXkgdGFibGUgc3RhdHVzCi0JICovCi0JaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJiBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWF9WQUxJRCkKLQkJcnMtPnJzX2tleWl4ID0gQVI1S19SRUdfTVMocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSwKLQkJCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0tFWV9JTkRFWCk7Ci0JZWxzZQotCQlycy0+cnNfa2V5aXggPSBBUjVLX1JYS0VZSVhfSU5WQUxJRDsKLQotCS8qCi0JICogUmVjZWl2ZS9kZXNjcmlwdG9yIGVycm9ycwotCSAqLwotCWlmICgocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCi0JCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX0ZSQU1FX1JFQ0VJVkVfT0spID09IDApIHsKLQkJaWYgKHJ4X3N0YXR1cy0+cnhfc3RhdHVzXzEgJgotCQkJCUFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SKQotCQkJcnMtPnJzX3N0YXR1cyB8PSBBUjVLX1JYRVJSX0NSQzsKLQotCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCi0JCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9QSFlfRVJST1IpIHsKLQkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9QSFk7Ci0JCQlycy0+cnNfcGh5ZXJyIHw9IEFSNUtfUkVHX01TKHJ4X2Vyci0+cnhfZXJyb3JfMSwKLQkJCQkJICAgQVI1S19SWF9ERVNDX0VSUk9SMV9QSFlfRVJST1JfQ09ERSk7Ci0JCX0KLQotCQlpZiAocnhfc3RhdHVzLT5yeF9zdGF0dXNfMSAmCi0JCQkJQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUikKLQkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9ERUNSWVBUOwotCi0JCWlmIChyeF9zdGF0dXMtPnJ4X3N0YXR1c18xICYKLQkJCQlBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX01JQ19FUlJPUikKLQkJCXJzLT5yc19zdGF0dXMgfD0gQVI1S19SWEVSUl9NSUM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKipcCi0gIEdQSU8gRnVuY3Rpb25zCi1cKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFNldCBsZWQgc3RhdGUKLSAqLwotdm9pZCBhdGg1a19od19zZXRfbGVkc3RhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHN0YXRlKQotewotCXUzMiBsZWQ7Ci0JLyo1MjEwIGhhcyBkaWZmZXJlbnQgbGVkIG1vZGUgaGFuZGxpbmcqLwotCXUzMiBsZWRfNTIxMDsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQkvKlJlc2V0IGxlZCBzdGF0dXMqLwotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKLQkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywKLQkJCUFSNUtfUENJQ0ZHX0xFRE1PREUgfCAgQVI1S19QQ0lDRkdfTEVEKTsKLQllbHNlCi0JCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QQ0lDRkcsIEFSNUtfUENJQ0ZHX0xFRCk7Ci0KLQkvKgotCSAqIFNvbWUgYmxpbmtpbmcgdmFsdWVzLCBkZWZpbmUgYXQgeW91ciB3aXNoCi0JICovCi0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgQVI1S19MRURfU0NBTjoKLQljYXNlIEFSNUtfTEVEX0FVVEg6Ci0JCWxlZCA9IEFSNUtfUENJQ0ZHX0xFRE1PREVfUFJPUCB8IEFSNUtfUENJQ0ZHX0xFRF9QRU5EOwotCQlsZWRfNTIxMCA9IEFSNUtfUENJQ0ZHX0xFRF9QRU5EIHwgQVI1S19QQ0lDRkdfTEVEX0JDVEw7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUjVLX0xFRF9JTklUOgotCQlsZWQgPSBBUjVLX1BDSUNGR19MRURNT0RFX1BST1AgfCBBUjVLX1BDSUNGR19MRURfTk9ORTsKLQkJbGVkXzUyMTAgPSBBUjVLX1BDSUNGR19MRURfUEVORDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSNUtfTEVEX0FTU09DOgotCWNhc2UgQVI1S19MRURfUlVOOgotCQlsZWQgPSBBUjVLX1BDSUNGR19MRURNT0RFX1BST1AgfCBBUjVLX1BDSUNGR19MRURfQVNTT0M7Ci0JCWxlZF81MjEwID0gQVI1S19QQ0lDRkdfTEVEX0FTU09DOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWxlZCA9IEFSNUtfUENJQ0ZHX0xFRE1PREVfUFJPTSB8IEFSNUtfUENJQ0ZHX0xFRF9OT05FOwotCQlsZWRfNTIxMCA9IEFSNUtfUENJQ0ZHX0xFRF9QRU5EOwotCQlicmVhazsKLQl9Ci0KLQkvKldyaXRlIG5ldyBzdGF0dXMgdG8gdGhlIHJlZ2lzdGVyKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCi0JCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywgbGVkKTsKLQllbHNlCi0JCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BDSUNGRywgbGVkXzUyMTApOwotfQotCi0vKgotICogU2V0IEdQSU8gb3V0cHV0cwotICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JaWYgKGdwaW8gPiBBUjVLX05VTV9HUElPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJn4KLQkJQVI1S19HUElPQ1JfT1VUKGdwaW8pKSB8IEFSNUtfR1BJT0NSX09VVChncGlvKSwgQVI1S19HUElPQ1IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgR1BJTyBpbnB1dHMKLSAqLwotaW50IGF0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQotewotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JaWYgKGdwaW8gPiBBUjVLX05VTV9HUElPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJn4KLQkJQVI1S19HUElPQ1JfT1VUKGdwaW8pKSB8IEFSNUtfR1BJT0NSX0lOKGdwaW8pLCBBUjVLX0dQSU9DUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdldCBHUElPIHN0YXRlCi0gKi8KLXUzMiBhdGg1a19od19nZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCWlmIChncGlvID4gQVI1S19OVU1fR1BJTykKLQkJcmV0dXJuIDB4ZmZmZmZmZmY7Ci0KLQkvKiBHUElPIGlucHV0IG1hZ2ljICovCi0JcmV0dXJuICgoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0RJKSAmIEFSNUtfR1BJT0RJX00pID4+IGdwaW8pICYKLQkJMHgxOwotfQotCi0vKgotICogU2V0IEdQSU8gc3RhdGUKLSAqLwotaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQotewotCXUzMiBkYXRhOwotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0KLQlpZiAoZ3BpbyA+IEFSNUtfTlVNX0dQSU8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogR1BJTyBvdXRwdXQgbWFnaWMgKi8KLQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0RPKTsKLQotCWRhdGEgJj0gfigxIDw8IGdwaW8pOwotCWRhdGEgfD0gKHZhbCAmIDEpIDw8IGdwaW87Ci0KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfR1BJT0RPKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgR1BJTyBpbnRlcnJ1cHQgKFJGS2lsbCBzd2l0Y2gpCi0gKi8KLXZvaWQgYXRoNWtfaHdfc2V0X2dwaW9faW50cihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgZ3BpbywKLQkJdTMyIGludGVycnVwdF9sZXZlbCkKLXsKLQl1MzIgZGF0YTsKLQotCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7Ci0JaWYgKGdwaW8gPiBBUjVLX05VTV9HUElPKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFNldCB0aGUgR1BJTyBpbnRlcnJ1cHQKLQkgKi8KLQlkYXRhID0gKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0dQSU9DUikgJgotCQl+KEFSNUtfR1BJT0NSX0lOVF9TRUwoZ3BpbykgfCBBUjVLX0dQSU9DUl9JTlRfU0VMSCB8Ci0JCUFSNUtfR1BJT0NSX0lOVF9FTkEgfCBBUjVLX0dQSU9DUl9PVVQoZ3BpbykpKSB8Ci0JCShBUjVLX0dQSU9DUl9JTlRfU0VMKGdwaW8pIHwgQVI1S19HUElPQ1JfSU5UX0VOQSk7Ci0KLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludGVycnVwdF9sZXZlbCA/IGRhdGEgOgotCQkoZGF0YSB8IEFSNUtfR1BJT0NSX0lOVF9TRUxIKSwgQVI1S19HUElPQ1IpOwotCi0JYWgtPmFoX2ltciB8PSBBUjVLX0lNUl9HUElPOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BJTVIsIEFSNUtfSU1SX0dQSU8pOwotfQotCi0KLQotCi0vKioqKioqKioqKioqKioqKlwKLSAgTWlzYyBmdW5jdGlvbnMKLVwqKioqKioqKioqKioqKioqLwotCi1pbnQgYXRoNWtfaHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IGF0aDVrX2h3ICphaCwKLQkJZW51bSBhdGg1a19jYXBhYmlsaXR5X3R5cGUgY2FwX3R5cGUsCi0JCXUzMiBjYXBhYmlsaXR5LCB1MzIgKnJlc3VsdCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0Jc3dpdGNoIChjYXBfdHlwZSkgewotCWNhc2UgQVI1S19DQVBfTlVNX1RYUVVFVUVTOgotCQlpZiAocmVzdWx0KSB7Ci0JCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApCi0JCQkJKnJlc3VsdCA9IEFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVTsKLQkJCWVsc2UKLQkJCQkqcmVzdWx0ID0gQVI1S19OVU1fVFhfUVVFVUVTOwotCQkJZ290byB5ZXM7Ci0JCX0KLQljYXNlIEFSNUtfQ0FQX1ZFT0w6Ci0JCWdvdG8geWVzOwotCWNhc2UgQVI1S19DQVBfQ09NUFJFU1NJT046Ci0JCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKLQkJCWdvdG8geWVzOwotCQllbHNlCi0JCQlnb3RvIG5vOwotCWNhc2UgQVI1S19DQVBfQlVSU1Q6Ci0JCWdvdG8geWVzOwotCWNhc2UgQVI1S19DQVBfVFBDOgotCQlnb3RvIHllczsKLQljYXNlIEFSNUtfQ0FQX0JTU0lETUFTSzoKLQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQotCQkJZ290byB5ZXM7Ci0JCWVsc2UKLQkJCWdvdG8gbm87Ci0JY2FzZSBBUjVLX0NBUF9YUjoKLQkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKQotCQkJZ290byB5ZXM7Ci0JCWVsc2UKLQkJCWdvdG8gbm87Ci0JZGVmYXVsdDoKLQkJZ290byBubzsKLQl9Ci0KLW5vOgotCXJldHVybiAtRUlOVkFMOwoteWVzOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggKmJzc2lkLAotCQl1MTYgYXNzb2NfaWQpCi17Ci0JQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKLQotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKLQkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgfCBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyBpbnQgYXRoNWtfaHdfZGlzYWJsZV9wc3BvbGwoc3RydWN0IGF0aDVrX2h3ICphaCkKLXsKLQlBVEg1S19UUkFDRShhaC0+YWhfc2MpOwotCi0JaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1NUQV9JRDEsCi0JCQlBUjVLX1NUQV9JRDFfTk9fUFNQT0xMIHwgQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlPOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2h3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZmNhOGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA3IE1hdHRoZXcgVy4gUy4gQmVsbCAgPG1lbnRvckBtYWR3aWZpLm9yZz4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBMdWlzIFJvZHJpZ3VleiA8bWNncm9mQHdpbmxhYi5ydXRnZXJzLmVkdT4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotLyoKLSAqIEdhaW4gc2V0dGluZ3MKLSAqLwotCi1lbnVtIGF0aDVrX3JmZ2FpbiB7Ci0JQVI1S19SRkdBSU5fSU5BQ1RJVkUgPSAwLAotCUFSNUtfUkZHQUlOX1JFQURfUkVRVUVTVEVELAotCUFSNUtfUkZHQUlOX05FRURfQ0hBTkdFLAotfTsKLQotI2RlZmluZSBBUjVLX0dBSU5fQ1JOX0ZJWF9CSVRTXzUxMTEJCTQKLSNkZWZpbmUgQVI1S19HQUlOX0NSTl9GSVhfQklUU181MTEyCQk3Ci0jZGVmaW5lIEFSNUtfR0FJTl9DUk5fTUFYX0ZJWF9CSVRTCQlBUjVLX0dBSU5fQ1JOX0ZJWF9CSVRTXzUxMTIKLSNkZWZpbmUgQVI1S19HQUlOX0RZTl9BREpVU1RfSElfTUFSR0lOCQkxNQotI2RlZmluZSBBUjVLX0dBSU5fRFlOX0FESlVTVF9MT19NQVJHSU4JCTIwCi0jZGVmaW5lIEFSNUtfR0FJTl9DQ0tfUFJPQkVfQ09SUgkJNQotI2RlZmluZSBBUjVLX0dBSU5fQ0NLX09GRE1fR0FJTl9ERUxUQQkJMTUKLSNkZWZpbmUgQVI1S19HQUlOX1NURVBfQ09VTlQJCQkxMAotI2RlZmluZSBBUjVLX0dBSU5fUEFSQU1fVFhfQ0xJUAkJCTAKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzkwCQkJMQotI2RlZmluZSBBUjVLX0dBSU5fUEFSQU1fUERfODQJCQkyCi0jZGVmaW5lIEFSNUtfR0FJTl9QQVJBTV9HQUlOX1NFTAkJMwotI2RlZmluZSBBUjVLX0dBSU5fUEFSQU1fTUlYX09STgkJCTAKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzOAkJCTEKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzNwkJCTIKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzNgkJCTMKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzMgkJCTQKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzMQkJCTUKLSNkZWZpbmUgQVI1S19HQUlOX1BBUkFNX1BEXzEzMAkJCTYKLSNkZWZpbmUgQVI1S19HQUlOX0NIRUNLX0FESlVTVChfZykgCQlcCi0JKChfZyktPmdfY3VycmVudCA8PSAoX2cpLT5nX2xvdyB8fCAoX2cpLT5nX2N1cnJlbnQgPj0gKF9nKS0+Z19oaWdoKQotCi1zdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCB7Ci0JczE2CQkJCWdvc19wYXJhbVtBUjVLX0dBSU5fQ1JOX01BWF9GSVhfQklUU107Ci0JczMyCQkJCWdvc19nYWluOwotfTsKLQotc3RydWN0IGF0aDVrX2dhaW4gewotCXUzMgkJCWdfc3RlcF9pZHg7Ci0JdTMyCQkJZ19jdXJyZW50OwotCXUzMgkJCWdfdGFyZ2V0OwotCXUzMgkJCWdfbG93OwotCXUzMgkJCWdfaGlnaDsKLQl1MzIJCQlnX2ZfY29ycjsKLQl1MzIJCQlnX2FjdGl2ZTsKLQljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcAkqZ19zdGVwOwotfTsKLQotCi0vKgotICogSFcgU1BFQ0lGSUMgU1RSVUNUUwotICovCi0KLS8qIFNvbWUgRUVQUk9NIGRlZmluZXMgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fRUVQX1NDQUxFCQkxMDAKLSNkZWZpbmUgQVI1S19FRVBST01fRUVQX0RFTFRBCQkxMAotI2RlZmluZSBBUjVLX0VFUFJPTV9OX01PREVTCQkzCi0jZGVmaW5lIEFSNUtfRUVQUk9NX05fNUdIWl9DSEFOCQkxMAotI2RlZmluZSBBUjVLX0VFUFJPTV9OXzJHSFpfQ0hBTgkJMwotI2RlZmluZSBBUjVLX0VFUFJPTV9NQVhfQ0hBTgkJMTAKLSNkZWZpbmUgQVI1S19FRVBST01fTl9QQ0RBQwkJMTEKLSNkZWZpbmUgQVI1S19FRVBST01fTl9URVNUX0ZSRVEJCTgKLSNkZWZpbmUgQVI1S19FRVBST01fTl9FREdFUwkJOAotI2RlZmluZSBBUjVLX0VFUFJPTV9OX0lOVEVSQ0VQVFMJMTEKLSNkZWZpbmUgQVI1S19FRVBST01fRlJFUV9NKF92KQkJQVI1S19FRVBST01fT0ZGKF92LCAweDdmLCAweGZmKQotI2RlZmluZSBBUjVLX0VFUFJPTV9QQ0RBQ19NCQkweDNmCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NUQVJUCQkxCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NUT1AJCTYzCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BDREFDX1NURVAJCTEKLSNkZWZpbmUgQVI1S19FRVBST01fTk9OX0VER0VfTQkJMHg0MAotI2RlZmluZSBBUjVLX0VFUFJPTV9DSEFOTkVMX1BPV0VSCTgKLSNkZWZpbmUgQVI1S19FRVBST01fTl9PQkRCCQk0Ci0jZGVmaW5lIEFSNUtfRUVQUk9NX09CREJfRElTCQkweGZmZmYKLSNkZWZpbmUgQVI1S19FRVBST01fQ0hBTk5FTF9ESVMJCTB4ZmYKLSNkZWZpbmUgQVI1S19FRVBST01fU0NBTEVfT0NfREVMVEEoX3gpCSgoKF94KSAqIDIpIC8gMTApCi0jZGVmaW5lIEFSNUtfRUVQUk9NX05fQ1RMUyhfdikJCUFSNUtfRUVQUk9NX09GRihfdiwgMTYsIDMyKQotI2RlZmluZSBBUjVLX0VFUFJPTV9NQVhfQ1RMUwkJMzIKLSNkZWZpbmUgQVI1S19FRVBST01fTl9YUERfUEVSX0NIQU5ORUwJNAotI2RlZmluZSBBUjVLX0VFUFJPTV9OX1hQRDBfUE9JTlRTCTQKLSNkZWZpbmUgQVI1S19FRVBST01fTl9YUEQzX1BPSU5UUwkzCi0jZGVmaW5lIEFSNUtfRUVQUk9NX05fSU5URVJDRVBUXzEwXzJHSFoJMzUKLSNkZWZpbmUgQVI1S19FRVBST01fTl9JTlRFUkNFUFRfMTBfNUdIWgk1NQotI2RlZmluZSBBUjVLX0VFUFJPTV9QT1dFUl9NCQkweDNmCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BPV0VSX01JTgkJMAotI2RlZmluZSBBUjVLX0VFUFJPTV9QT1dFUl9NQVgJCTMxNTAKLSNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfU1RFUAkJNTAKLSNkZWZpbmUgQVI1S19FRVBST01fUE9XRVJfVEFCTEVfU0laRQk2NAotI2RlZmluZSBBUjVLX0VFUFJPTV9OX1BPV0VSX0xPQ18xMUIJNAotI2RlZmluZSBBUjVLX0VFUFJPTV9OX1BPV0VSX0xPQ18xMUcJNgotI2RlZmluZSBBUjVLX0VFUFJPTV9JX0dBSU4JCTEwCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0NDS19PRkRNX0RFTFRBCTE1Ci0jZGVmaW5lIEFSNUtfRUVQUk9NX05fSVFfQ0FMCQkyCi0KLS8qIFN0cnVjdCB0byBob2xkIEVFUFJPTSBjYWxpYnJhdGlvbiBkYXRhICovCi1zdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gewotCXUxNgllZV9tYWdpYzsKLQl1MTYJZWVfcHJvdGVjdDsKLQl1MTYJZWVfcmVnZG9tYWluOwotCXUxNgllZV92ZXJzaW9uOwotCXUxNgllZV9oZWFkZXI7Ci0JdTE2CWVlX2FudF9nYWluOwotCXUxNgllZV9taXNjMDsKLQl1MTYJZWVfbWlzYzE7Ci0JdTE2CWVlX2Nja19vZmRtX2dhaW5fZGVsdGE7Ci0JdTE2CWVlX2Nja19vZmRtX3Bvd2VyX2RlbHRhOwotCXUxNgllZV9zY2FsZWRfY2NrX2RlbHRhOwotCi0JLyogVXNlZCBmb3IgdHggdGhlcm1hbCBhZGp1c3RtZW50IChlZXByb21faW5pdCwgcmZyZWdzKSAqLwotCXUxNgllZV90eF9jbGlwOwotCXUxNgllZV9wd2RfODQ7Ci0JdTE2CWVlX3B3ZF85MDsKLQl1MTYJZWVfZ2Fpbl9zZWxlY3Q7Ci0KLQkvKiBSRiBDYWxpYnJhdGlvbiBzZXR0aW5ncyAocmVzZXQsIHJmcmVncykgKi8KLQl1MTYJZWVfaV9jYWxbQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX3FfY2FsW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV9maXhlZF9iaWFzW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV90dXJib19tYXhfcG93ZXJbQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX3hyX3Bvd2VyW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV9zd2l0Y2hfc2V0dGxpbmdbQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX2FudF90eF9yeFtBUjVLX0VFUFJPTV9OX01PREVTXTsKLQl1MTYJZWVfYW50X2NvbnRyb2xbQVI1S19FRVBST01fTl9NT0RFU11bQVI1S19FRVBST01fTl9QQ0RBQ107Ci0JdTE2CWVlX29iW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX05fT0JEQl07Ci0JdTE2CWVlX2RiW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX05fT0JEQl07Ci0JdTE2CWVlX3R4X2VuZDJ4bG5hX2VuYWJsZVtBUjVLX0VFUFJPTV9OX01PREVTXTsKLQl1MTYJZWVfdHhfZW5kMnhwYV9kaXNhYmxlW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV90eF9mcm0yeHBhX2VuYWJsZVtBUjVLX0VFUFJPTV9OX01PREVTXTsKLQl1MTYJZWVfdGhyXzYyW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV94bG5hX2dhaW5bQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX3hwZFtBUjVLX0VFUFJPTV9OX01PREVTXTsKLQl1MTYJZWVfeF9nYWluW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXUxNgllZV9pX2dhaW5bQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX21hcmdpbl90eF9yeFtBUjVLX0VFUFJPTV9OX01PREVTXTsKLQotCS8qIFVudXNlZCAqLwotCXUxNgllZV9mYWxzZV9kZXRlY3RbQVI1S19FRVBST01fTl9NT0RFU107Ci0JdTE2CWVlX2NhbF9waWVyW0FSNUtfRUVQUk9NX05fTU9ERVNdW0FSNUtfRUVQUk9NX05fMkdIWl9DSEFOXTsKLQl1MTYJZWVfY2hhbm5lbFtBUjVLX0VFUFJPTV9OX01PREVTXVtBUjVLX0VFUFJPTV9NQVhfQ0hBTl07IC8qZW1wdHkqLwotCi0JLyogQ29uZm9ybWFuY2UgdGVzdCBsaW1pdHMgKFVudXNlZCkgKi8KLQl1MTYJZWVfY3RsczsKLQl1MTYJZWVfY3RsW0FSNUtfRUVQUk9NX01BWF9DVExTXTsKLQotCS8qIE5vaXNlIEZsb29yIENhbGlicmF0aW9uIHNldHRpbmdzICovCi0JczE2CWVlX25vaXNlX2Zsb29yX3RocltBUjVLX0VFUFJPTV9OX01PREVTXTsKLQlzOAllZV9hZGNfZGVzaXJlZF9zaXplW0FSNUtfRUVQUk9NX05fTU9ERVNdOwotCXM4CWVlX3BnYV9kZXNpcmVkX3NpemVbQVI1S19FRVBST01fTl9NT0RFU107Ci19OwotCi0vKgotICogSW50ZXJuYWwgUlgvVFggZGVzY3JpcHRvciBzdHJ1Y3R1cmVzCi0gKiAoclg6IHJlc2VydmVkIGZpZWxkcyBwb3NzaWJpbHkgdXNlZCBieSBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIGFyNWsgY2hpcHNldCkKLSAqLwotCi0vKgotICogY29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgotICovCi1zdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsIHsKLQl1MzIJcnhfY29udHJvbF8wOyAvKiBSWCBjb250cm9sIHdvcmQgMCAqLwotCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwwCQkJMHgwMDAwMDAwMAotCi0JdTMyCXJ4X2NvbnRyb2xfMTsgLyogUlggY29udHJvbCB3b3JkIDEgKi8KLQotI2RlZmluZSBBUjVLX0RFU0NfUlhfQ1RMMV9CVUZfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0lOVFJFUQkJMHgwMDAwMjAwMAotfSBfX3BhY2tlZDsKLQotLyoKLSAqIGNvbW1vbiBoYXJkd2FyZSBSWCBzdGF0dXMgZGVzY3JpcHRvcgotICogNTIxMC8xMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmxhZ3MgZGVmaW5lZCBiZWxvdwotICovCi1zdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzIHsKLQl1MzIJcnhfc3RhdHVzXzA7IC8qIFJYIHN0YXR1cyB3b3JkIDAgKi8KLQl1MzIJcnhfc3RhdHVzXzE7IC8qIFJYIHN0YXR1cyB3b3JkIDEgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIDUyMTAvNTIxMSAqLwotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX0RBVEFfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfTU9SRQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEUJCTB4MDAwNzgwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1JBVEVfUwkxNQotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMCTB4MDdmODAwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX1NJR05BTF9TCTE5Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9BTlRFTk5BCTB4MzgwMDAwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkFfUwkyNwotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX0RPTkUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRlJBTUVfUkVDRUlWRV9PSwkweDAwMDAwMDAyCi0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfQ1JDX0VSUk9SCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfRklGT19PVkVSUlVOCQkweDAwMDAwMDA4Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfREVDUllQVF9DUkNfRVJST1IJMHgwMDAwMDAxMAotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUgkJMHgwMDAwMDBlMAotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1BIWV9FUlJPUl9TCQk1Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgJCTB4MDAwMDdlMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfUwkJOQotI2RlZmluZSBBUjVLXzUyMTBfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QCTB4MGZmZjgwMDAKLSNkZWZpbmUgQVI1S181MjEwX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUF9TCTE1Ci0jZGVmaW5lIEFSNUtfNTIxMF9SWF9ERVNDX1NUQVRVUzFfS0VZX0NBQ0hFX01JU1MJMHgxMDAwMDAwMAotCi0vKiA1MjEyICovCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfREFUQV9MRU4JCTB4MDAwMDBmZmYKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9NT1JFCQkJMHgwMDAwMTAwMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX0RFQ09NUF9DUkNfRVJST1IJMHgwMDAwMjAwMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfUkFURQkJMHgwMDBmODAwMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfUkFURV9TCTE1Ci0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzBfUkVDRUlWRV9TSUdOQUwJMHgwZmYwMDAwMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfU0lHTkFMX1MJMjAKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMF9SRUNFSVZFX0FOVEVOTkEJMHhmMDAwMDAwMAotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMwX1JFQ0VJVkVfQU5URU5OQV9TCTI4Ci0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfRE9ORQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9GUkFNRV9SRUNFSVZFX09LCTB4MDAwMDAwMDIKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9DUkNfRVJST1IJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9ERUNSWVBUX0NSQ19FUlJPUgkweDAwMDAwMDA4Ci0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfUEhZX0VSUk9SCQkweDAwMDAwMDEwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfTUlDX0VSUk9SCQkweDAwMDAwMDIwCi0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0lOREVYX1ZBTElECTB4MDAwMDAxMDAKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVgJCTB4MDAwMGZlMDAKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9LRVlfSU5ERVhfUwkJOQotI2RlZmluZSBBUjVLXzUyMTJfUlhfREVTQ19TVEFUVVMxX1JFQ0VJVkVfVElNRVNUQU1QCTB4N2ZmZjAwMDAKLSNkZWZpbmUgQVI1S181MjEyX1JYX0RFU0NfU1RBVFVTMV9SRUNFSVZFX1RJTUVTVEFNUF9TCTE2Ci0jZGVmaW5lIEFSNUtfNTIxMl9SWF9ERVNDX1NUQVRVUzFfS0VZX0NBQ0hFX01JU1MJMHg4MDAwMDAwMAotCi0vKgotICogY29tbW9uIGhhcmR3YXJlIFJYIGVycm9yIGRlc2NyaXB0b3IKLSAqLwotc3RydWN0IGF0aDVrX2h3X3J4X2Vycm9yIHsKLQl1MzIJcnhfZXJyb3JfMDsgLyogUlggZXJyb3Igd29yZCAwICovCi0KLSNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMAkJCTB4MDAwMDAwMDAKLQotCXUzMglyeF9lcnJvcl8xOyAvKiBSWCBlcnJvciB3b3JkIDEgKi8KLQotI2RlZmluZSBBUjVLX1JYX0RFU0NfRVJST1IxX1BIWV9FUlJPUl9DT0RFCTB4MDAwMGZmMDAKLSNkZWZpbmUgQVI1S19SWF9ERVNDX0VSUk9SMV9QSFlfRVJST1JfQ09ERV9TCTgKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVI1S19ERVNDX1JYX1BIWV9FUlJPUl9OT05FCQkweDAwCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfVElNSU5HCQkweDIwCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfUEFSSVRZCQkweDQwCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfUkFURQkJMHg2MAotI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX0xFTkdUSAkJMHg4MAotI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SXzY0UUFNCQkweGEwCi0jZGVmaW5lIEFSNUtfREVTQ19SWF9QSFlfRVJST1JfU0VSVklDRQkJMHhjMAotI2RlZmluZSBBUjVLX0RFU0NfUlhfUEhZX0VSUk9SX1RSQU5TTUlUT1ZSCTB4ZTAKLQotLyoKLSAqIDUyMTAvNTIxMSBoYXJkd2FyZSAyLXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCi0gKi8KLXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgewotCXUzMgl0eF9jb250cm9sXzA7IC8qIFRYIGNvbnRyb2wgd29yZCAwICovCi0KLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU4JCTB4MDAwM2YwMDAgLypbNTIxMCA/XSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0hFQURFUl9MRU5fUwkxMgotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9YTUlUX1JBVEUJCTB4MDAzYzAwMDAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfWE1JVF9SQVRFX1MJMTgKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfUlRTRU5BCQkweDAwNDAwMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0NMUkRNQVNLCQkweDAxMDAwMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0xPTkdfUEFDS0VUCTB4MDA4MDAwMDAgLypbNTIxMF0qLwotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9WRU9MCQkweDAwODAwMDAwIC8qWzUyMTFdKi8KLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfRlJBTUVfVFlQRQkJMHgxYzAwMDAwMCAvKls1MjEwXSovCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0ZSQU1FX1RZUEVfUwkyNgotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTAJMHgwMjAwMDAwMAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUXzUyMTEJMHgxZTAwMDAwMAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKLQkJCQkJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMCA6IFwKLQkJCQkJCUFSNUtfMldfVFhfREVTQ19DVEwwX0FOVF9NT0RFX1hNSVRfNTIxMSkKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF9TCTI1Ci0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwwX0lOVFJFUQkJMHgyMDAwMDAwMAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMF9FTkNSWVBUX0tFWV9WQUxJRAkweDQwMDAwMDAwCi0KLQl1MzIJdHhfY29udHJvbF8xOyAvKiBUWCBjb250cm9sIHdvcmQgMSAqLwotCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfTU9SRQkJMHgwMDAwMTAwMAotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjEwCTB4MDAwN2UwMDAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVhfNTIxMQkweDAwMGZlMDAwCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKLQkJCQkJCUFSNUtfMldfVFhfREVTQ19DVEwxX0VOQ1JZUFRfS0VZX0lOREVYXzUyMTAgOiBcCi0JCQkJCQlBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF81MjExKQotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF9TCTEzCi0jZGVmaW5lIEFSNUtfMldfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEUJCTB4MDA3MDAwMDAgLypbNTIxMV0qLwotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9GUkFNRV9UWVBFX1MJMjAKLSNkZWZpbmUgQVI1S18yV19UWF9ERVNDX0NUTDFfTk9BQ0sJCTB4MDA4MDAwMDAgLypbNTIxMV0qLwotI2RlZmluZSBBUjVLXzJXX1RYX0RFU0NfQ1RMMV9SVFNfRFVSQVRJT04JMHhmZmY4MDAwMCAvKls1MjEwID9dKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PUk1BTCAgIDB4MDAKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX0FUSU0gICAgIDB4MDQKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BTUE9MTCAgIDB4MDgKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX05PX0RFTEFZIDB4MGMKLSNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlMgICAgIDB4MTAKLQotLyoKLSAqIDUyMTIgaGFyZHdhcmUgNC13b3JkIFRYIGNvbnRyb2wgZGVzY3JpcHRvcgotICovCi1zdHJ1Y3QgYXRoNWtfaHdfNHdfdHhfY3RsIHsKLQl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLwotCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0ZSQU1FX0xFTgkJMHgwMDAwMGZmZgotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9YTUlUX1BPV0VSCQkweDAwM2YwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX1hNSVRfUE9XRVJfUwkxNgotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9SVFNFTkEJCTB4MDA0MDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfVkVPTAkJMHgwMDgwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9DTFJETUFTSwkJMHgwMTAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9BTlRfTU9ERV9YTUlUCTB4MWUwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDBfQU5UX01PREVfWE1JVF9TCTI1Ci0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0lOVFJFUQkJMHgyMDAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMF9FTkNSWVBUX0tFWV9WQUxJRAkweDQwMDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwwX0NUU0VOQQkJMHg4MDAwMDAwMAotCi0JdTMyCXR4X2NvbnRyb2xfMTsgLyogVFggY29udHJvbCB3b3JkIDEgKi8KLQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9CVUZfTEVOCQkweDAwMDAwZmZmCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX01PUkUJCTB4MDAwMDEwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRU5DUllQVF9LRVlfSU5ERVgJMHgwMDBmZTAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9FTkNSWVBUX0tFWV9JTkRFWF9TCTEzCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0ZSQU1FX1RZUEUJCTB4MDBmMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfRlJBTUVfVFlQRV9TCTIwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX05PQUNLCQkweDAxMDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfUFJPQwkJMHgwNjAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX1BST0NfUwkyNQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMV9DT01QX0lWX0xFTgkweDE4MDAwMDAwCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwxX0NPTVBfSVZfTEVOX1MJMjcKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JQ1ZfTEVOCTB4NjAwMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDFfQ09NUF9JQ1ZfTEVOX1MJMjkKLQotCXUzMgl0eF9jb250cm9sXzI7IC8qIFRYIGNvbnRyb2wgd29yZCAyICovCi0KLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDJfUlRTX0RVUkFUSU9OCQkweDAwMDA3ZmZmCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwyX0RVUkFUSU9OX1VQREFURV9FTkFCTEUJMHgwMDAwODAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMAkJMHgwMDBmMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMF9TCQkxNgotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMQkJMHgwMGYwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMV9TCQkyMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMgkJMHgwZjAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMl9TCQkyNAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTMwkJMHhmMDAwMDAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMMl9YTUlUX1RSSUVTM19TCQkyOAotCi0JdTMyCXR4X2NvbnRyb2xfMzsgLyogVFggY29udHJvbCB3b3JkIDMgKi8KLQotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUwCQkweDAwMDAwMDFmCi0jZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1hNSVRfUkFURTEJCTB4MDAwMDAzZTAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMV9TCTUKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMgkJMHgwMDAwN2MwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUyX1MJMTAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfWE1JVF9SQVRFMwkJMHgwMDBmODAwMAotI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19YTUlUX1JBVEUzX1MJMTUKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfUlRTX0NUU19SQVRFCTB4MDFmMDAwMDAKLSNkZWZpbmUgQVI1S180V19UWF9ERVNDX0NUTDNfUlRTX0NUU19SQVRFX1MJMjAKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBDb21tb24gVFggc3RhdHVzIGRlc2NyaXB0b3IKLSAqLwotc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cyB7Ci0JdTMyCXR4X3N0YXR1c18wOyAvKiBUWCBzdGF0dXMgd29yZCAwICovCi0KLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRlJBTUVfWE1JVF9PSwkweDAwMDAwMDAxCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0VYQ0VTU0lWRV9SRVRSSUVTCTB4MDAwMDAwMDIKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfRklGT19VTkRFUlJVTgkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0ZJTFRFUkVECQkweDAwMDAwMDA4Ci0vKj8/PwotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9SVFNfRkFJTF9DT1VOVAkweDAwMDAwMGYwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1JUU19GQUlMX0NPVU5UX1MJNAotKi8KLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzBfU0hPUlRfUkVUUllfQ09VTlQJMHgwMDAwMDBmMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TSE9SVF9SRVRSWV9DT1VOVF9TCTQKLS8qPz8/Ci0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVAkweDAwMDAwZjAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0RBVEFfRkFJTF9DT1VOVF9TCTgKLSovCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX0xPTkdfUkVUUllfQ09VTlQJMHgwMDAwMGYwMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9MT05HX1JFVFJZX0NPVU5UX1MJOAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlQJMHgwMDAwZjAwMAotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9WSVJUX0NPTExfQ09VTlRfUwkxMgotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMF9TRU5EX1RJTUVTVEFNUAkweGZmZmYwMDAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMwX1NFTkRfVElNRVNUQU1QX1MJMTYKLQotCXUzMgl0eF9zdGF0dXNfMTsgLyogVFggc3RhdHVzIHdvcmQgMSAqLwotCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0RPTkUJCTB4MDAwMDAwMDEKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfU0VRX05VTQkJMHgwMDAwMWZmZQotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9TRVFfTlVNX1MJCTEKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfQUNLX1NJR19TVFJFTkdUSAkweDAwMWZlMDAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0FDS19TSUdfU1RSRU5HVEhfUwkxMwotI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9GSU5BTF9UU19JTkRFWAkweDAwNjAwMDAwCi0jZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0ZJTkFMX1RTX0lOREVYX1MJMjEKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfQ09NUF9TVUNDRVNTCTB4MDA4MDAwMDAKLSNkZWZpbmUgQVI1S19ERVNDX1RYX1NUQVRVUzFfWE1JVF9BTlRFTk5BCTB4MDEwMDAwMDAKLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIDUyMTAvNTIxMSBoYXJkd2FyZSBUWCBkZXNjcmlwdG9yCi0gKi8KLXN0cnVjdCBhdGg1a19od181MjEwX3R4X2Rlc2MgewotCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwJdHhfY3RsOwotCXN0cnVjdCBhdGg1a19od190eF9zdGF0dXMJdHhfc3RhdDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiA1MjEyIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKLSAqLwotc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYyB7Ci0Jc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bAl0eF9jdGw7Ci0Jc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIGNvbW1vbiBoYXJkd2FyZSBSWCBkZXNjcmlwdG9yCi0gKi8KLXN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYyB7Ci0Jc3RydWN0IGF0aDVrX2h3X3J4X2N0bAkJCXJ4X2N0bDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMJcnhfc3RhdDsKLQkJc3RydWN0IGF0aDVrX2h3X3J4X2Vycm9yCXJ4X2VycjsKLQl9IHU7Ci19IF9fcGFja2VkOwotCi0KLS8qCi0gKiBBUjVLIFJFR0lTVEVSIEFDQ0VTUwotICovCi0KLS8qU3dhcCBSWC9UWCBEZXNjcmlwdG9yIGZvciBiaWcgZW5kaWFuIGFyY2hzKi8KLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLSNkZWZpbmUgQVI1S19JTklUX0NGRwkoCQlcCi0JQVI1S19DRkdfU1dURCB8IEFSNUtfQ0ZHX1NXUkQJXAotKQotI2Vsc2UKLSNkZWZpbmUgQVI1S19JTklUX0NGRwkweDAwMDAwMDAwCi0jZW5kaWYKLQotLyojZGVmaW5lIEFSNUtfUkVHX1JFQUQoX3JlZykJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIF9yZWcpCi0KLSNkZWZpbmUgQVI1S19SRUdfV1JJVEUoX3JlZywgX3ZhbCkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBfdmFsLCBfcmVnKSovCi0KLSNkZWZpbmUgQVI1S19SRUdfU00oX3ZhbCwgX2ZsYWdzKQkJCQkJXAotCSgoKF92YWwpIDw8IF9mbGFncyMjX1MpICYgKF9mbGFncykpCi0KLSNkZWZpbmUgQVI1S19SRUdfTVMoX3ZhbCwgX2ZsYWdzKQkJCQkJXAotCSgoKF92YWwpICYgKF9mbGFncykpID4+IF9mbGFncyMjX1MpCi0KLS8qIFNvbWUgcmVnaXN0ZXJzIGNhbiBob2xkIG11bHRpcGxlIHZhbHVlcyBvZiBpbnRlcmVzdC4gRm9yIHRoaXMKLSAqIHJlYXNvbiB3aGVuIHdlIHdhbnQgdG8gd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXJzIHdlIG11c3QgZmlyc3QKLSAqIHJldHJpZXZlIHRoZSB2YWx1ZXMgd2hpY2ggd2UgZG8gbm90IHdhbnQgdG8gY2xlYXIgKGxldHMgY2FsbCB0aGlzCi0gKiBvbGRfZGF0YSkgYW5kIHRoZW4gc2V0IHRoZSByZWdpc3RlciB3aXRoIHRoaXMgYW5kIG91ciBuZXdfdmFsdWU6Ci0gKiAoIG9sZF9kYXRhIHwgbmV3X3ZhbHVlKSAqLwotI2RlZmluZSBBUjVLX1JFR19XUklURV9CSVRTKGFoLCBfcmVnLCBfZmxhZ3MsIF92YWwpCQkJXAotCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBfcmVnKSAmIH4oX2ZsYWdzKSkgfCBcCi0JICAgICgoKF92YWwpIDw8IF9mbGFncyMjX1MpICYgKF9mbGFncykpLCBfcmVnKQotCi0jZGVmaW5lIEFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBfcmVnLCBfZmxhZ3MsIF9tYXNrKQkJCVwKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsIChhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJgkJXAotCQkJKF9tYXNrKSkgfCAoX2ZsYWdzKSwgX3JlZykKLQotI2RlZmluZSBBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgX3JlZywgX2ZsYWdzKQkJCQlcCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgfCAoX2ZsYWdzKSwgX3JlZykKLQotI2RlZmluZSBBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIF9yZWcsIF9mbGFncykJCQlcCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJiB+KF9mbGFncyksIF9yZWcpCi0KLSNkZWZpbmUgQVI1S19QSFlfV1JJVEUoYWgsIF9yZWcsIF92YWwpCQkJCQlcCi0JYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBfdmFsLCAoYWgpLT5haF9waHkgKyAoKF9yZWcpIDw8IDIpKQotCi0jZGVmaW5lIEFSNUtfUEhZX1JFQUQoYWgsIF9yZWcpCQkJCQlcCi0JYXRoNWtfaHdfcmVnX3JlYWQoYWgsIChhaCktPmFoX3BoeSArICgoX3JlZykgPDwgMikpCi0KLSNkZWZpbmUgQVI1S19SRUdfV0FJVChfaSkgZG8gewkJCQkJCVwKLQlpZiAoX2kgJSA2NCkJCQkJCQkJXAotCQl1ZGVsYXkoMSk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBUjVLX0VFUFJPTV9SRUFEKF9vLCBfdikgZG8gewkJCQkJXAotCWlmICgocmV0ID0gYXRoNWtfaHdfZWVwcm9tX3JlYWQoYWgsIChfbyksICYoX3YpKSkgIT0gMCkJXAotCQlyZXR1cm4gKHJldCk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBUjVLX0VFUFJPTV9SRUFEX0hEUihfbywgX3YpCQkJCQlcCi0JQVI1S19FRVBST01fUkVBRChfbywgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tLl92KTsJXAotCi0vKiBSZWFkIHN0YXR1cyBvZiBzZWxlY3RlZCBxdWV1ZSAqLwotI2RlZmluZSBBUjVLX1JFR19SRUFEX1EoYWgsIF9yZWcsIF9xdWV1ZSkJCQkJXAotCShhdGg1a19od19yZWdfcmVhZChhaCwgX3JlZykgJiAoMSA8PCBfcXVldWUpKQkJCVwKLQotI2RlZmluZSBBUjVLX1JFR19XUklURV9RKGFoLCBfcmVnLCBfcXVldWUpCQkJCVwKLQlhdGg1a19od19yZWdfd3JpdGUoYWgsICgxIDw8IF9xdWV1ZSksIF9yZWcpCi0KLSNkZWZpbmUgQVI1S19RX0VOQUJMRV9CSVRTKF9yZWcsIF9xdWV1ZSkgZG8gewkJCQlcCi0JX3JlZyB8PSAxIDw8IF9xdWV1ZTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFSNUtfUV9ESVNBQkxFX0JJVFMoX3JlZywgX3F1ZXVlKSBkbyB7CQkJCVwKLQlfcmVnICY9IH4oMSA8PCBfcXVldWUpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQVI1S19MT1dfSUQoX2EpKAkJCQlcCi0oX2EpWzBdIHwgKF9hKVsxXSA8PCA4IHwgKF9hKVsyXSA8PCAxNiB8IChfYSlbM10gPDwgMjQJXAotKQotCi0jZGVmaW5lIEFSNUtfSElHSF9JRChfYSkJKChfYSlbNF0gfCAoX2EpWzVdIDw8IDgpCi0KLS8qCi0gKiBJbml0aWFsIHJlZ2lzdGVyIHZhbHVlcwotICovCi0KLS8qCi0gKiBDb21tb24gaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKLSAqLwotI2RlZmluZSBBUjVLX0lOSVRfTU9ERQkJCQlDSEFOTkVMX0IKLQotI2RlZmluZSBBUjVLX0lOSVRfVFhfTEFURU5DWQkJCTUwMgotI2RlZmluZSBBUjVLX0lOSVRfVVNFQwkJCQkzOQotI2RlZmluZSBBUjVLX0lOSVRfVVNFQ19UVVJCTwkJCTc5Ci0jZGVmaW5lIEFSNUtfSU5JVF9VU0VDXzMyCQkJMzEKLSNkZWZpbmUgQVI1S19JTklUX0NBUlJfU0VOU0VfRU4JCQkxCi0jZGVmaW5lIEFSNUtfSU5JVF9QUk9HX0lGUwkJCTkyMAotI2RlZmluZSBBUjVLX0lOSVRfUFJPR19JRlNfVFVSQk8JCTk2MAotI2RlZmluZSBBUjVLX0lOSVRfRUlGUwkJCQkzNDQwCi0jZGVmaW5lIEFSNUtfSU5JVF9FSUZTX1RVUkJPCQkJNjg4MAotI2RlZmluZSBBUjVLX0lOSVRfU0xPVF9USU1FCQkJMzk2Ci0jZGVmaW5lIEFSNUtfSU5JVF9TTE9UX1RJTUVfVFVSQk8JCTQ4MAotI2RlZmluZSBBUjVLX0lOSVRfQUNLX0NUU19USU1FT1VUCQkxMDI0Ci0jZGVmaW5lIEFSNUtfSU5JVF9BQ0tfQ1RTX1RJTUVPVVRfVFVSQk8JCTB4MDgwMDA4MDAKLSNkZWZpbmUgQVI1S19JTklUX1NJRlMJCQkJNTYwCi0jZGVmaW5lIEFSNUtfSU5JVF9TSUZTX1RVUkJPCQkJNDgwCi0jZGVmaW5lIEFSNUtfSU5JVF9TSF9SRVRSWQkJCTEwCi0jZGVmaW5lIEFSNUtfSU5JVF9MR19SRVRSWQkJCUFSNUtfSU5JVF9TSF9SRVRSWQotI2RlZmluZSBBUjVLX0lOSVRfU1NIX1JFVFJZCQkJMzIKLSNkZWZpbmUgQVI1S19JTklUX1NMR19SRVRSWQkJCUFSNUtfSU5JVF9TU0hfUkVUUlkKLSNkZWZpbmUgQVI1S19JTklUX1RYX1JFVFJZCQkJMTAKLSNkZWZpbmUgQVI1S19JTklUX1RPUFMJCQkJOAotI2RlZmluZSBBUjVLX0lOSVRfUlhOT0ZSTQkJCTgKLSNkZWZpbmUgQVI1S19JTklUX1JQR1RPCQkJCTAKLSNkZWZpbmUgQVI1S19JTklUX1RYTk9GUk0JCQkwCi0jZGVmaW5lIEFSNUtfSU5JVF9CRUFDT05fUEVSSU9ECQkJNjU1MzUKLSNkZWZpbmUgQVI1S19JTklUX1RJTV9PRkZTRVQJCQkwCi0jZGVmaW5lIEFSNUtfSU5JVF9CRUFDT05fRU4JCQkwCi0jZGVmaW5lIEFSNUtfSU5JVF9SRVNFVF9UU0YJCQkwCi0KLSNkZWZpbmUgQVI1S19JTklUX1RSQU5TTUlUX0xBVEVOQ1kJCSgJCQlcCi0JKEFSNUtfSU5JVF9UWF9MQVRFTkNZIDw8IDE0KSB8IChBUjVLX0lOSVRfVVNFQ18zMiA8PCA3KSB8CVwKLQkoQVI1S19JTklUX1VTRUMpCQkJCQkJXAotKQotI2RlZmluZSBBUjVLX0lOSVRfVFJBTlNNSVRfTEFURU5DWV9UVVJCTwkoCQkJXAotCShBUjVLX0lOSVRfVFhfTEFURU5DWSA8PCAxNCkgfCAoQVI1S19JTklUX1VTRUNfMzIgPDwgNykgfAlcCi0JKEFSNUtfSU5JVF9VU0VDX1RVUkJPKQkJCQkJCVwKLSkKLSNkZWZpbmUgQVI1S19JTklUX1BST1RPX1RJTUVfQ05UUkwJCSgJCQlcCi0JKEFSNUtfSU5JVF9DQVJSX1NFTlNFX0VOIDw8IDI2KSB8IChBUjVLX0lOSVRfRUlGUyA8PCAxMikgfAlcCi0JKEFSNUtfSU5JVF9QUk9HX0lGUykJCQkJCQlcCi0pCi0jZGVmaW5lIEFSNUtfSU5JVF9QUk9UT19USU1FX0NOVFJMX1RVUkJPCSgJCQlcCi0JKEFSNUtfSU5JVF9DQVJSX1NFTlNFX0VOIDw8IDI2KSB8IChBUjVLX0lOSVRfRUlGU19UVVJCTyA8PCAxMikgfCBcCi0JKEFSNUtfSU5JVF9QUk9HX0lGU19UVVJCTykJCQkJCVwKLSkKLSNkZWZpbmUgQVI1S19JTklUX0JFQUNPTl9DT05UUk9MCQkoCQkJXAotCShBUjVLX0lOSVRfUkVTRVRfVFNGIDw8IDI0KSB8IChBUjVLX0lOSVRfQkVBQ09OX0VOIDw8IDIzKSB8CVwKLQkoQVI1S19JTklUX1RJTV9PRkZTRVQgPDwgMTYpIHwgKEFSNUtfSU5JVF9CRUFDT05fUEVSSU9EKQlcCi0pCi0KLS8qCi0gKiBOb24tY29tbW9uIGluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzIHdoaWNoIGhhdmUgdG8gYmUgbG9hZGVkIGludG8gdGhlCi0gKiBjYXJkIGF0IGJvb3QgdGltZSBhbmQgYWZ0ZXIgZWFjaCByZXNldC4KLSAqLwotCi0vKiBSZWdpc3RlciBkdW1wcyBhcmUgZG9uZSBwZXIgb3BlcmF0aW9uIG1vZGUgKi8KLSNkZWZpbmUgQVI1S19JTklfUkZHQUlOXzVHSFoJCTAKLSNkZWZpbmUgQVI1S19JTklfUkZHQUlOXzJHSFoJCTEKLQotI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFBCQkwCi0jZGVmaW5lIEFSNUtfSU5JX1ZBTF8xMUFfVFVSQk8JCTEKLSNkZWZpbmUgQVI1S19JTklfVkFMXzExQgkJMgotI2RlZmluZSBBUjVLX0lOSV9WQUxfMTFHCQkzCi0jZGVmaW5lIEFSNUtfSU5JX1ZBTF8xMUdfVFVSQk8JCTQKLSNkZWZpbmUgQVI1S19JTklfVkFMX1hSCQkJMAotI2RlZmluZSBBUjVLX0lOSV9WQUxfTUFYCQk1Ci0KLSNkZWZpbmUgQVI1S19SRjUxMTFfSU5JX1JGX01BWF9CQU5LUwlBUjVLX01BWF9SRl9CQU5LUwotI2RlZmluZSBBUjVLX1JGNTExMl9JTklfUkZfTUFYX0JBTktTCUFSNUtfTUFYX1JGX0JBTktTCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGF0aDVrX2h3X2JpdHN3YXAodTMyIHZhbCwgdW5zaWduZWQgaW50IGJpdHMpCi17Ci0JdTMyIHJldHZhbCA9IDAsIGJpdCwgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBiaXRzOyBpKyspIHsKLQkJYml0ID0gKHZhbCA+PiBpKSAmIDE7Ci0JCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCBiaXQ7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2luaXR2YWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9pbml0dmFscy5jCmluZGV4IDI4MDZiMjEuLmVhMmUxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2luaXR2YWxzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvaW5pdHZhbHMuYwpAQCAtMSw5ICsxLDkgQEAKIC8qCiAgKiBJbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzIGZ1bmN0aW9ucwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA3IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtMjAsMTMgKzIwLDkgQEAKICAqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKLSNpbmNsdWRlICJiYXNlLmgiCiAjaW5jbHVkZSAicmVnLmgiCi0KLS8qCi0gKiBNQUMvUEhZIFJFR0lTVEVSUwotICovCi0KKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJhc2UuaCIKIAogLyoKICAqIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKQEAgLTY1LDEwICs2MSwxMCBAQAogCXsgQVI1S19UWENGRywJCUFSNUtfRE1BU0laRV8xMjhCIH0sCiAJeyBBUjVLX1JYQ0ZHLAkJQVI1S19ETUFTSVpFXzEyOEIgfSwKIAl7IEFSNUtfQ0ZHLAkJQVI1S19JTklUX0NGRyB9LAotCXsgQVI1S19UT1BTLAkJQVI1S19JTklUX1RPUFMgfSwKLQl7IEFSNUtfUlhOT0ZSTSwJCUFSNUtfSU5JVF9SWE5PRlJNIH0sCi0JeyBBUjVLX1JQR1RPLAkJQVI1S19JTklUX1JQR1RPIH0sCi0JeyBBUjVLX1RYTk9GUk0sCQlBUjVLX0lOSVRfVFhOT0ZSTSB9LAorCXsgQVI1S19UT1BTLAkJOCB9LAorCXsgQVI1S19SWE5PRlJNLAkJOCB9LAorCXsgQVI1S19SUEdUTywJCTAgfSwKKwl7IEFSNUtfVFhOT0ZSTSwJCTAgfSwKIAl7IEFSNUtfU0ZSLAkJMCB9LAogCXsgQVI1S19NSUJDLAkJMCB9LAogCXsgQVI1S19NSVNDLAkJMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcGN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9wY3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdkZjlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcGN1LmMKQEAgLTAsMCArMSwxMDE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTWF0dGhldyBXLiBTLiBCZWxsICA8bWVudG9yQG1hZHdpZmkub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTHVpcyBSb2RyaWd1ZXogPG1jZ3JvZkB3aW5sYWIucnV0Z2Vycy5lZHU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogUHJvdG9jb2wgQ29udHJvbCBVbml0IEZ1bmN0aW9ucyAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXRoNWsuaCIKKyNpbmNsdWRlICJyZWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJhc2UuaCIKKworLyoqKioqKioqKioqKioqKioqKipcCisqIEdlbmVyaWMgZnVuY3Rpb25zICoKK1wqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X3NldF9vcG1vZGUgLSBTZXQgUENVIG9wZXJhdGluZyBtb2RlCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIEluaXRpYWxpemUgUENVIGZvciB0aGUgdmFyaW91cyBvcGVyYXRpbmcgbW9kZXMgKEFQL1NUQSBldGMpCisgKgorICogTk9URTogYWgtPmFoX29wX21vZGUgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqLworaW50IGF0aDVrX2h3X3NldF9vcG1vZGUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1MzIgcGN1X3JlZywgYmVhY29uX3JlZywgbG93X2lkLCBoaWdoX2lkOworCisJcGN1X3JlZyA9IDA7CisJYmVhY29uX3JlZyA9IDA7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJc3dpdGNoIChhaC0+YWhfb3BfbW9kZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX0FESE9DIHwgQVI1S19TVEFfSUQxX0RFU0NfQU5URU5OQSB8CisJCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPworCQkJCUFSNUtfU1RBX0lEMV9OT19QU1BPTEwgOiAwKTsKKwkJYmVhY29uX3JlZyB8PSBBUjVLX0JDUl9BREhPQzsKKwkJYnJlYWs7CisKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJcGN1X3JlZyB8PSBBUjVLX1NUQV9JRDFfQVAgfCBBUjVLX1NUQV9JRDFfUlRTX0RFRl9BTlRFTk5BIHwKKwkJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CisJCQkJQVI1S19TVEFfSUQxX05PX1BTUE9MTCA6IDApOworCQliZWFjb25fcmVnIHw9IEFSNUtfQkNSX0FQOworCQlicmVhazsKKworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJcGN1X3JlZyB8PSBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIHwKKwkJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CisJCQkJQVI1S19TVEFfSUQxX1BXUl9TViA6IDApOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJcGN1X3JlZyB8PSBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIHwKKwkJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CisJCQkJQVI1S19TVEFfSUQxX05PX1BTUE9MTCA6IDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogU2V0IFBDVSByZWdpc3RlcnMKKwkgKi8KKwlsb3dfaWQgPSBBUjVLX0xPV19JRChhaC0+YWhfc3RhX2lkKTsKKwloaWdoX2lkID0gQVI1S19ISUdIX0lEKGFoLT5haF9zdGFfaWQpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbG93X2lkLCBBUjVLX1NUQV9JRDApOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGN1X3JlZyB8IGhpZ2hfaWQsIEFSNUtfU1RBX0lEMSk7CisKKwkvKgorCSAqIFNldCBCZWFjb24gQ29udHJvbCBSZWdpc3RlciBvbiA1MjEwCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGJlYWNvbl9yZWcsIEFSNUtfQkNSKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3VwZGF0ZSAtIFVwZGF0ZSBtaWIgY291bnRlcnMgKG1hYyBsYXllciBzdGF0aXN0aWNzKQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzdGF0czogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyB3ZSB1c2UgdG8gdHJhY2sKKyAqIHN0YXRpc3RpY3Mgb24gdGhlIGRyaXZlcgorICoKKyAqIFJlYWRzIE1JQiBjb3VudGVycyBmcm9tIFBDVSBhbmQgdXBkYXRlcyBzdyBzdGF0aXN0aWNzLiBNdXN0IGJlCisgKiBjYWxsZWQgYWZ0ZXIgYSBNSUIgaW50ZXJydXB0LgorICovCit2b2lkIGF0aDVrX2h3X3VwZGF0ZV9taWJfY291bnRlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgICpzdGF0cykKK3sKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJLyogUmVhZC1BbmQtQ2xlYXIgKi8KKwlzdGF0cy0+ZG90MTFBQ0tGYWlsdXJlQ291bnQgKz0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQUNLX0ZBSUwpOworCXN0YXRzLT5kb3QxMVJUU0ZhaWx1cmVDb3VudCArPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SVFNfRkFJTCk7CisJc3RhdHMtPmRvdDExUlRTU3VjY2Vzc0NvdW50ICs9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JUU19PSyk7CisJc3RhdHMtPmRvdDExRkNTRXJyb3JDb3VudCArPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19GQ1NfRkFJTCk7CisKKwkvKiBYWFg6IFNob3VsZCB3ZSB1c2UgdGhpcyB0byB0cmFjayBiZWFjb24gY291bnQgPworCSAqIC13ZSByZWFkIGl0IGFueXdheSB0byBjbGVhciB0aGUgcmVnaXN0ZXIgKi8KKwlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19CRUFDT05fQ05UKTsKKworCS8qIFJlc2V0IHByb2ZpbGUgY291bnQgcmVnaXN0ZXJzIG9uIDUyMTIqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUFJPRkNOVF9UWCk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19QUk9GQ05UX1JYKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1BST0ZDTlRfUlhDTFIpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDAsIEFSNUtfUFJPRkNOVF9DWUNMRSk7CisJfQorfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9hY2tfYml0cmF0ZSAtIHNldCBiaXRyYXRlIGZvciBBQ0tzCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGhpZ2g6IEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIHdhbnQgdG8gdXNlIGhpZ2ggdHJhbnNtaXRpb24gcmF0ZQorICogZm9yIEFDS3Mgb3Igbm90CisgKgorICogSWYgaGlnaCBmbGFnIGlzIHNldCwgd2UgdGVsbCBodyB0byB1c2UgYSBzZXQgb2YgY29udHJvbCByYXRlcyBiYXNlZCBvbgorICogdGhlIGN1cnJlbnQgdHJhbnNtaXRpb24gcmF0ZSAoY2hlY2sgb3V0IGNvbnRyb2xfcmF0ZXMgYXJyYXkgaW5zaWRlIHJlc2V0LmMpLgorICogSWYgbm90IGh3IGp1c3QgdXNlcyB0aGUgbG93ZXN0IHJhdGUgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBtb2R1bGF0aW9uCisgKiBzY2hlbWUgYmVpbmcgdXNlZCAoMU1iaXQgZm9yIENDSyBhbmQgNk1iaXRzIGZvciBPRkRNKS4KKyAqLwordm9pZCBhdGg1a19od19zZXRfYWNrX2JpdHJhdGVfaGlnaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGhpZ2gpCit7CisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEyKQorCQlyZXR1cm47CisJZWxzZSB7CisJCXUzMiB2YWwgPSBBUjVLX1NUQV9JRDFfQkFTRV9SQVRFXzExQiB8IEFSNUtfU1RBX0lEMV9BQ0tDVFNfNk1COworCQlpZiAoaGlnaCkKKwkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1NUQV9JRDEsIHZhbCk7CisJCWVsc2UKKwkJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19TVEFfSUQxLCB2YWwpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqXAorKiBBQ0svQ1RTIFRpbWVvdXRzICoKK1wqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogYXRoNWtfaHdfaGV0X2Fja190aW1lb3V0IC0gR2V0IEFDSyB0aW1lb3V0IGZyb20gUENVIGluIHVzZWMKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KK3Vuc2lnbmVkIGludCBhdGg1a19od19nZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJcmV0dXJuIGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJQVI1S19USU1FX09VVCksIEFSNUtfVElNRV9PVVRfQUNLKSwgYWgtPmFoX3R1cmJvKTsKK30KKworLyoqCisgKiBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQgLSBTZXQgQUNLIHRpbWVvdXQgb24gUENVCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHRpbWVvdXQ6IFRpbWVvdXQgaW4gdXNlYworICovCitpbnQgYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKDB4ZmZmZmZmZmYsIEFSNUtfVElNRV9PVVRfQUNLKSwKKwkJCWFoLT5haF90dXJibykgPD0gdGltZW91dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1RJTUVfT1VULCBBUjVLX1RJTUVfT1VUX0FDSywKKwkJYXRoNWtfaHdfaHRvY2xvY2sodGltZW91dCwgYWgtPmFoX3R1cmJvKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfY3RzX3RpbWVvdXQgLSBHZXQgQ1RTIHRpbWVvdXQgZnJvbSBQQ1UgaW4gdXNlYworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwordW5zaWduZWQgaW50IGF0aDVrX2h3X2dldF9jdHNfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJcmV0dXJuIGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJQVI1S19USU1FX09VVCksIEFSNUtfVElNRV9PVVRfQ1RTKSwgYWgtPmFoX3R1cmJvKTsKK30KKworLyoqCisgKiBhdGg1a19od19zZXRfY3RzX3RpbWVvdXQgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHRpbWVvdXQ6IFRpbWVvdXQgaW4gdXNlYworICovCitpbnQgYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKEFSNUtfUkVHX01TKDB4ZmZmZmZmZmYsIEFSNUtfVElNRV9PVVRfQ1RTKSwKKwkJCWFoLT5haF90dXJibykgPD0gdGltZW91dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1RJTUVfT1VULCBBUjVLX1RJTUVfT1VUX0NUUywKKwkJCWF0aDVrX2h3X2h0b2Nsb2NrKHRpbWVvdXQsIGFoLT5haF90dXJibykpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKipcCisqIEJTU0lEIGhhbmRsaW5nICoKK1wqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X2dldF9sbGFkZHIgLSBHZXQgc3RhdGlvbiBpZAorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYWM6IFRoZSBjYXJkJ3MgbWFjIGFkZHJlc3MKKyAqCisgKiBJbml0aWFsaXplIGFoLT5haF9zdGFfaWQgdXNpbmcgdGhlIG1hYyBhZGRyZXNzIHByb3ZpZGVkCisgKiAoanVzdCBhIG1lbWNweSkuCisgKgorICogVE9ETzogUmVtb3ZlIGl0IG9uY2Ugd2UgbWVyZ2UgYXRoNWtfc29mdGMgYW5kIGF0aDVrX2h3CisgKi8KK3ZvaWQgYXRoNWtfaHdfZ2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCAqbWFjKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJbWVtY3B5KG1hYywgYWgtPmFoX3N0YV9pZCwgRVRIX0FMRU4pOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9sbGFkZHIgLSBTZXQgc3RhdGlvbiBpZAorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYWM6IFRoZSBjYXJkJ3MgbWFjIGFkZHJlc3MKKyAqCisgKiBTZXQgc3RhdGlvbiBpZCBvbiBodyB1c2luZyB0aGUgcHJvdmlkZWQgbWFjIGFkZHJlc3MKKyAqLworaW50IGF0aDVrX2h3X3NldF9sbGFkZHIoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hYykKK3sKKwl1MzIgbG93X2lkLCBoaWdoX2lkOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwkvKiBTZXQgbmV3IHN0YXRpb24gSUQgKi8KKwltZW1jcHkoYWgtPmFoX3N0YV9pZCwgbWFjLCBFVEhfQUxFTik7CisKKwlsb3dfaWQgPSBBUjVLX0xPV19JRChtYWMpOworCWhpZ2hfaWQgPSBBUjVLX0hJR0hfSUQobWFjKTsKKworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgbG93X2lkLCBBUjVLX1NUQV9JRDApOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgaGlnaF9pZCwgQVI1S19TVEFfSUQxKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9hc3NvY2lkIC0gU2V0IEJTU0lEIGZvciBhc3NvY2lhdGlvbgorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBic3NpZDogQlNTSUQKKyAqIEBhc3NvY19pZDogQXNzb2MgaWQKKyAqCisgKiBTZXRzIHRoZSBCU1NJRCB3aGljaCB0cmlnZXJzIHRoZSAiU01FIEpvaW4iIG9wZXJhdGlvbgorICovCit2b2lkIGF0aDVrX2h3X3NldF9hc3NvY2lkKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICpic3NpZCwgdTE2IGFzc29jX2lkKQoreworCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CisJdTE2IHRpbV9vZmZzZXQgPSAwOworCisJLyoKKwkgKiBTZXQgc2ltcGxlIEJTU0lEIG1hc2sgb24gNTIxMgorCSAqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfQlNTX0lETTApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfQlNTX0lETTEpOworCX0KKworCS8qCisJICogU2V0IEJTU0lEIHdoaWNoIHRyaWdnZXJzIHRoZSAiU01FIEpvaW4iIG9wZXJhdGlvbgorCSAqLworCWxvd19pZCA9IEFSNUtfTE9XX0lEKGJzc2lkKTsKKwloaWdoX2lkID0gQVI1S19ISUdIX0lEKGJzc2lkKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19CU1NfSUQwKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGhpZ2hfaWQgfCAoKGFzc29jX2lkICYgMHgzZmZmKSA8PAorCQkJCUFSNUtfQlNTX0lEMV9BSURfUyksIEFSNUtfQlNTX0lEMSk7CisKKwlpZiAoYXNzb2NfaWQgPT0gMCkgeworCQlhdGg1a19od19kaXNhYmxlX3BzcG9sbChhaCk7CisJCXJldHVybjsKKwl9CisKKwlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX0JFQUNPTiwgQVI1S19CRUFDT05fVElNLAorCQkJdGltX29mZnNldCA/IHRpbV9vZmZzZXQgKyA0IDogMCk7CisKKwlhdGg1a19od19lbmFibGVfcHNwb2xsKGFoLCBOVUxMLCAwKTsKK30KKworLyoqCisgKiBhdGg1a19od19zZXRfYnNzaWRfbWFzayAtIGZpbHRlciBvdXQgYnNzaWRzIHdlIGxpc3RlbgorICoKKyAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYXNrOiB0aGUgYnNzaWRfbWFzaywgYSB1OCBhcnJheSBvZiBzaXplIEVUSF9BTEVOCisgKgorICogQlNTSUQgbWFza2luZyBpcyBhIG1ldGhvZCB1c2VkIGJ5IEFSNTIxMiBhbmQgbmV3ZXIgaGFyZHdhcmUgdG8gaW5mb3JtIFBDVQorICogd2hpY2ggYml0cyBvZiB0aGUgaW50ZXJmYWNlJ3MgTUFDIGFkZHJlc3Mgc2hvdWxkIGJlIGxvb2tlZCBhdCB3aGVuIHRyeWluZworICogdG8gZGVjaWRlIHdoaWNoIHBhY2tldHMgdG8gQUNLLiBJbiBzdGF0aW9uIG1vZGUgYW5kIEFQIG1vZGUgd2l0aCBhIHNpbmdsZQorICogQlNTIGV2ZXJ5IGJpdCBtYXR0ZXJzIHNpbmNlIHdlIGxvY2sgdG8gb25seSBvbmUgQlNTLiBJbiBBUCBtb2RlIHdpdGgKKyAqIG11bHRpcGxlIEJTU2VzICh2aXJ0dWFsIGludGVyZmFjZXMpIG5vdCBldmVyeSBiaXQgbWF0dGVycyBiZWNhdXNlIGh3IG11c3QKKyAqIGFjY2VwdCBmcmFtZXMgZm9yIGFsbCBCU1NlcyBhbmQgc28gd2UgdHdlYWsgc29tZSBiaXRzIG9mIG91ciBtYWMgYWRkcmVzcworICogaW4gb3JkZXIgdG8gaGF2ZSBtdWx0aXBsZSBCU1Nlcy4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGEgc2ltcGxlIGZpbHRlciBhbmQgZG9lcyAqbm90KiBmaWx0ZXIgb3V0IGFsbAorICogcmVsZXZhbnQgZnJhbWVzLiBTb21lIGZyYW1lcyB0aGF0IGFyZSBub3QgZm9yIHVzIG1pZ2h0IGdldCBBQ0tlZCBmcm9tIHVzCisgKiBieSBQQ1UgYmVjYXVzZSB0aGV5IGp1c3QgbWF0Y2ggdGhlIG1hc2suCisgKgorICogV2hlbiBoYW5kbGluZyBtdWx0aXBsZSBCU1NlcyB5b3UgY2FuIGdldCB0aGUgQlNTSUQgbWFzayBieSBjb21wdXRpbmcgdGhlCisgKiBzZXQgb2YgIH4gKCBNQUMgWE9SIEJTU0lEICkgZm9yIGFsbCBic3NpZHMgd2UgaGFuZGxlLgorICoKKyAqIFdoZW4geW91IGRvIHRoaXMgeW91IGFyZSBlc3NlbnRpYWxseSBjb21wdXRpbmcgdGhlIGNvbW1vbiBiaXRzIG9mIGFsbCB5b3VyCisgKiBCU1Nlcy4gTGF0ZXIgaXQgaXMgYXNzdW1lZCB0aGUgaGFyd2FyZSB3aWxsICJhbmQiICgmKSB0aGUgQlNTSUQgbWFzayB3aXRoCisgKiB0aGUgTUFDIGFkZHJlc3MgdG8gb2J0YWluIHRoZSByZWxldmFudCBiaXRzIGFuZCBjb21wYXJlIHRoZSByZXN1bHQgd2l0aAorICogKGZyYW1lJ3MgQlNTSUQgJiBtYXNrKSB0byBzZWUgaWYgdGhleSBtYXRjaC4KKyAqLworLyoKKyAqIFNpbXBsZSBleGFtcGxlOiBvbiB5b3VyIGNhcmQgeW91IGhhdmUgaGF2ZSB0d28gQlNTZXMgeW91IGhhdmUgY3JlYXRlZCB3aXRoCisgKiBCU1NJRC0wMSBhbmQgQlNTSUQtMDIuIExldHMgYXNzdW1lIEJTU0lELTAxIHdpbGwgbm90IHVzZSB0aGUgTUFDIGFkZHJlc3MuCisgKiBUaGVyZSBpcyBhbm90aGVyIEJTU0lELTAzIGJ1dCB5b3UgYXJlIG5vdCBwYXJ0IG9mIGl0LiBGb3Igc2ltcGxpY2l0eSdzIHNha2UsCisgKiBhc3N1bWluZyBvbmx5IDQgYml0cyBmb3IgYSBtYWMgYWRkcmVzcyBhbmQgZm9yIEJTU0lEcyB5b3UgY2FuIHRoZW4gaGF2ZToKKyAqCisgKiAgICAgICAgICAgICAgICAgIFwKKyAqIE1BQzogICAgICAgICAgICAgICAgMDAwMSB8CisgKiBCU1NJRC0wMTogICAwMTAwIHwgLS0+IEJlbG9uZ3MgdG8gdXMKKyAqIEJTU0lELTAyOiAgIDEwMDEgfAorICogICAgICAgICAgICAgICAgICAvCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCU1NJRC0wMzogICAwMTEwICB8IC0tPiBFeHRlcm5hbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIE91ciBic3NpZF9tYXNrIHdvdWxkIHRoZW4gYmU6CisgKgorICogICAgICAgICAgICAgT24gbG9vcCBpdGVyYXRpb24gZm9yIEJTU0lELTAxOgorICogICAgICAgICAgICAgfigwMDAxIF4gMDEwMCkgIC0+IH4oMDEwMSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgIDEwMTAKKyAqICAgICAgICAgICAgIGJzc2lkX21hc2sgICAgICA9ICAgIDEwMTAKKyAqCisgKiAgICAgICAgICAgICBPbiBsb29wIGl0ZXJhdGlvbiBmb3IgQlNTSUQtMDI6CisgKiAgICAgICAgICAgICBic3NpZF9tYXNrICY9IH4oMDAwMSAgIF4gICAxMDAxKQorICogICAgICAgICAgICAgYnNzaWRfbWFzayA9ICAgKDEwMTApICAmIH4oMDAwMSBeIDEwMDEpCisgKiAgICAgICAgICAgICBic3NpZF9tYXNrID0gICAoMTAxMCkgICYgfigxMDAxKQorICogICAgICAgICAgICAgYnNzaWRfbWFzayA9ICAgKDEwMTApICAmICAoMDExMCkKKyAqICAgICAgICAgICAgIGJzc2lkX21hc2sgPSAgIDAwMTAKKyAqCisgKiBBIGJzc2lkX21hc2sgb2YgMDAxMCBtZWFucyAib25seSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBzZWNvbmQgbGVhc3QKKyAqIHNpZ25pZmljYW50IGJpdCIuIFRoaXMgaXMgYmVjYXVzZSBpdHMgdGhlIG9ubHkgYml0IGNvbW1vbgorICogYW1vbmdzdCB0aGUgTUFDIGFuZCBhbGwgQlNTSURzIHdlIHN1cHBvcnQuIFRvIGZpbmRvdXQgd2hhdCB0aGUgcmVhbAorICogY29tbW9uIGJpdCBpcyB3ZSBjYW4gc2ltcGx5ICImIiB0aGUgYnNzaWRfbWFzayBub3cgd2l0aCBhbnkgQlNTSUQgd2UgaGF2ZQorICogb3Igb3VyIE1BQyBhZGRyZXNzICh3ZSBhc3N1bWUgdGhlIGhhcmR3YXJlIHVzZXMgdGhlIE1BQyBhZGRyZXNzKS4KKyAqCisgKiBOb3csIHN1cHBvc2UgdGhlcmUncyBhbiBpbmNvbWluZyBmcmFtZSBmb3IgQlNTSUQtMDM6CisgKgorICogSUZSQU1FLTAxOiAgMDExMAorICoKKyAqIEFuIGVhc3kgZXllLWluc3BlY2l0b24gb2YgdGhpcyBhbHJlYWR5IHNob3VsZCB0ZWxsIHlvdSB0aGF0IHRoaXMgZnJhbWUKKyAqIHdpbGwgbm90IHBhc3Mgb3VyIGNoZWNrLiBUaGlzIGlzIGJlYWN1c2UgdGhlIGJzc2lkX21hc2sgdGVsbHMgdGhlCisgKiBoYXJkd2FyZSB0byBvbmx5IGxvb2sgYXQgdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBiaXQgYW5kIHRoZQorICogY29tbW9uIGJpdCBhbW9uZ3N0IHRoZSBNQUMgYW5kIEJTU0lEcyBpcyAwLCB0aGlzIGZyYW1lIGhhcyB0aGUgMm5kIExTQgorICogYXMgMSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggMC4KKyAqCisgKiBTbyB3aXRoIElGUkFNRS0wMSB3ZSAqYXNzdW1lKiB0aGUgaGFyZHdhcmUgd2lsbCBkbzoKKyAqCisgKiAgICAgYWxsb3cgPSAoSUZSQU1FLTAxICYgYnNzaWRfbWFzaykgPT0gKGJzc2lkX21hc2sgJiBNQUMpID8gMSA6IDA7CisgKiAgLS0+IGFsbG93ID0gKDAxMTAgJiAwMDEwKSA9PSAoMDAxMCAmIDAwMDEpID8gMSA6IDA7CisgKiAgLS0+IGFsbG93ID0gKDAwMTApID09IDAwMDAgPyAxIDogMDsKKyAqICAtLT4gYWxsb3cgPSAwCisgKgorICogIExldHMgbm93IHRlc3QgYSBmcmFtZSB0aGF0IHNob3VsZCB3b3JrOgorICoKKyAqIElGUkFNRS0wMjogIDAwMDEgKHdlIHNob3VsZCBhbGxvdykKKyAqCisgKiAgICAgYWxsb3cgPSAoMDAwMSAmIDEwMTApID09IDEwMTAKKyAqCisgKiAgICAgYWxsb3cgPSAoSUZSQU1FLTAyICYgYnNzaWRfbWFzaykgPT0gKGJzc2lkX21hc2sgJiBNQUMpID8gMSA6IDA7CisgKiAgLS0+IGFsbG93ID0gKDAwMDEgJiAwMDEwKSA9PSAgKDAwMTAgJiAwMDAxKSA/IDEgOjA7CisgKiAgLS0+IGFsbG93ID0gKDAwMTApID09ICgwMDEwKQorICogIC0tPiBhbGxvdyA9IDEKKyAqCisgKiBPdGhlciBleGFtcGxlczoKKyAqCisgKiBJRlJBTUUtMDM6ICAwMTAwIC0tPiBhbGxvd2VkCisgKiBJRlJBTUUtMDQ6ICAxMDAxIC0tPiBhbGxvd2VkCisgKiBJRlJBTUUtMDU6ICAxMTAxIC0tPiBhbGxvd2VkIGJ1dCBpdHMgbm90IGZvciB1cyEhIQorICoKKyAqLworaW50IGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYXNrKQoreworCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlsb3dfaWQgPSBBUjVLX0xPV19JRChtYXNrKTsKKwkJaGlnaF9pZCA9IEFSNUtfSElHSF9JRChtYXNrKTsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19CU1NfSURNMCk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgaGlnaF9pZCwgQVI1S19CU1NfSURNMSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU87Cit9CisKKworLyoqKioqKioqKioqKlwKKyogUlggQ29udHJvbCAqCitcKioqKioqKioqKioqLworCisvKioKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdSAtIFN0YXJ0IFJYIGVuZ2luZQorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBTdGFydHMgUlggZW5naW5lIG9uIFBDVSBzbyB0aGF0IGh3IGNhbiBwcm9jZXNzIFJYZWQgZnJhbWVzCisgKiAoQUNLIGV0YykuCisgKgorICogTk9URTogUlggRE1BIHNob3VsZCBiZSBhbHJlYWR5IGVuYWJsZWQgdXNpbmcgYXRoNWtfaHdfc3RhcnRfcnhfZG1hCisgKiBUT0RPOiBJbml0IEFOSSBoZXJlCisgKi8KK3ZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfcGN1KHN0cnVjdCBhdGg1a19odyAqYWgpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7Cit9CisKKy8qKgorICogYXQ1a19od19zdG9wX3J4X3BjdSAtIFN0b3AgUlggZW5naW5lCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFN0b3BzIFJYIGVuZ2luZSBvbiBQQ1UKKyAqCisgKiBUT0RPOiBEZXRhY2ggQU5JIGhlcmUKKyAqLwordm9pZCBhdGg1a19od19zdG9wX3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7Cit9CisKKy8qCisgKiBTZXQgbXVsdGljYXN0IGZpbHRlcgorICovCit2b2lkIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJLyogU2V0IHRoZSBtdWx0aWNhdCBmaWx0ZXIgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGZpbHRlcjAsIEFSNUtfTUNBU1RfRklMVEVSMCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIxLCBBUjVLX01DQVNUX0ZJTFRFUjEpOworfQorCisvKgorICogU2V0IG11bHRpY2FzdCBmaWx0ZXIgYnkgaW5kZXgKKyAqLworaW50IGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXJfaWR4KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBpbmRleCkKK3sKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKGluZGV4ID49IDY0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChpbmRleCA+PSAzMikKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfTUNBU1RfRklMVEVSMSwKKwkJCQkoMSA8PCAoaW5kZXggLSAzMikpKTsKKwllbHNlCisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX01DQVNUX0ZJTFRFUjAsICgxIDw8IGluZGV4KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENsZWFyIE11bHRpY2FzdCBmaWx0ZXIgYnkgaW5kZXgKKyAqLworaW50IGF0aDVrX2h3X2NsZWFyX21jYXN0X2ZpbHRlcl9pZHgoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGluZGV4KQoreworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlpZiAoaW5kZXggPj0gNjQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKGluZGV4ID49IDMyKQorCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfTUNBU1RfRklMVEVSMSwKKwkJCQkoMSA8PCAoaW5kZXggLSAzMikpKTsKKwllbHNlCisJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19NQ0FTVF9GSUxURVIwLCAoMSA8PCBpbmRleCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlciAtIEdldCBjdXJyZW50IHJ4IGZpbHRlcgorICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBSZXR1cm5zIHRoZSBSWCBmaWx0ZXIgYnkgcmVhZGluZyByeCBmaWx0ZXIgYW5kCisgKiBwaHkgZXJyb3IgZmlsdGVyIHJlZ2lzdGVycy4gUlggZmlsdGVyIGlzIHVzZWQKKyAqIHRvIHNldCB0aGUgYWxsb3dlZCBmcmFtZSB0eXBlcyB0aGF0IFBDVSB3aWxsIGFjY2VwdAorICogYW5kIHBhc3MgdG8gdGhlIGRyaXZlci4gRm9yIGEgbGlzdCBvZiBmcmFtZSB0eXBlcworICogY2hlY2sgb3V0IHJlZy5oLgorICovCit1MzIgYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCXUzMiBkYXRhLCBmaWx0ZXIgPSAwOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlmaWx0ZXIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWF9GSUxURVIpOworCisJLypSYWRhciBkZXRlY3Rpb24gZm9yIDUyMTIqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0VSUl9GSUwpOworCisJCWlmIChkYXRhICYgQVI1S19QSFlfRVJSX0ZJTF9SQURBUikKKwkJCWZpbHRlciB8PSBBUjVLX1JYX0ZJTFRFUl9SQURBUkVSUjsKKwkJaWYgKGRhdGEgJiAoQVI1S19QSFlfRVJSX0ZJTF9PRkRNIHwgQVI1S19QSFlfRVJSX0ZJTF9DQ0spKQorCQkJZmlsdGVyIHw9IEFSNUtfUlhfRklMVEVSX1BIWUVSUjsKKwl9CisKKwlyZXR1cm4gZmlsdGVyOworfQorCisvKioKKyAqIGF0aDVrX2h3X3NldF9yeF9maWx0ZXIgLSBTZXQgcnggZmlsdGVyCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGZpbHRlcjogUlggZmlsdGVyIG1hc2sgKHNlZSByZWcuaCkKKyAqCisgKiBTZXRzIFJYIGZpbHRlciByZWdpc3RlciBhbmQgYWxzbyBoYW5kbGVzIFBIWSBlcnJvciBmaWx0ZXIKKyAqIHJlZ2lzdGVyIG9uIDUyMTIgYW5kIG5ld2VyIGNoaXBzIHNvIHRoYXQgd2UgaGF2ZSBwcm9wZXIgUEhZCisgKiBlcnJvciByZXBvcnRpbmcuCisgKi8KK3ZvaWQgYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmlsdGVyKQoreworCXUzMiBkYXRhID0gMDsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwkvKiBTZXQgUEhZIGVycm9yIGZpbHRlciByZWdpc3RlciBvbiA1MjEyKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJaWYgKGZpbHRlciAmIEFSNUtfUlhfRklMVEVSX1JBREFSRVJSKQorCQkJZGF0YSB8PSBBUjVLX1BIWV9FUlJfRklMX1JBREFSOworCQlpZiAoZmlsdGVyICYgQVI1S19SWF9GSUxURVJfUEhZRVJSKQorCQkJZGF0YSB8PSBBUjVLX1BIWV9FUlJfRklMX09GRE0gfCBBUjVLX1BIWV9FUlJfRklMX0NDSzsKKwl9CisKKwkvKgorCSAqIFRoZSBBUjUyMTAgdXNlcyBwcm9taXNjb3VzIG1vZGUgdG8gZGV0ZWN0IHJhZGFyIGFjdGl2aXR5CisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwICYmCisJCQkoZmlsdGVyICYgQVI1S19SWF9GSUxURVJfUkFEQVJFUlIpKSB7CisJCWZpbHRlciAmPSB+QVI1S19SWF9GSUxURVJfUkFEQVJFUlI7CisJCWZpbHRlciB8PSBBUjVLX1JYX0ZJTFRFUl9QUk9NOworCX0KKworCS8qWmVybyBsZW5ndGggRE1BKi8KKwlpZiAoZGF0YSkKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUlhDRkcsIEFSNUtfUlhDRkdfWkxGRE1BKTsKKwllbHNlCisJCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19SWENGRywgQVI1S19SWENGR19aTEZETUEpOworCisJLypXcml0ZSBSWCBGaWx0ZXIgcmVnaXN0ZXIqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyICYgMHhmZiwgQVI1S19SWF9GSUxURVIpOworCisJLypXcml0ZSBQSFkgZXJyb3IgZmlsdGVyIHJlZ2lzdGVyIG9uIDUyMTIqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX1BIWV9FUlJfRklMKTsKKworfQorCisKKy8qKioqKioqKioqKioqKioqXAorKiBCZWFjb24gY29udHJvbCAqCitcKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBhdGg1a19od19nZXRfdHNmMzIgLSBHZXQgYSAzMmJpdCBUU0YKKyAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogUmV0dXJucyBsb3dlciAzMiBiaXRzIG9mIGN1cnJlbnQgVFNGCisgKi8KK3UzMiBhdGg1a19od19nZXRfdHNmMzIoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19UU0ZfTDMyKTsKK30KKworLyoqCisgKiBhdGg1a19od19nZXRfdHNmNjQgLSBHZXQgdGhlIGZ1bGwgNjRiaXQgVFNGCisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgVFNGCisgKi8KK3U2NCBhdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1NjQgdHNmID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVFNGX1UzMik7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19UU0ZfTDMyKSB8ICh0c2YgPDwgMzIpOworfQorCisvKioKKyAqIGF0aDVrX2h3X3Jlc2V0X3RzZiAtIEZvcmNlIGEgVFNGIHJlc2V0CisgKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIEZvcmNlcyBhIFRTRiByZXNldCBvbiBQQ1UKKyAqLwordm9pZCBhdGg1a19od19yZXNldF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCkKK3sKKwl1MzIgdmFsOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCXZhbCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTikgfCBBUjVLX0JFQUNPTl9SRVNFVF9UU0Y7CisKKwkvKgorCSAqIEVhY2ggd3JpdGUgdG8gdGhlIFJFU0VUX1RTRiBiaXQgdG9nZ2xlcyBhIGhhcmR3YXJlIGludGVybmFsCisJICogc2lnbmFsIHRvIHJlc2V0IFRTRiwgYnV0IGlmIGxlZnQgaGlnaCBpdCB3aWxsIGNhdXNlIGEgVFNGIHJlc2V0CisJICogb24gdGhlIG5leHQgY2hpcCByZXNldCBhcyB3ZWxsLiAgVGh1cyB3ZSBhbHdheXMgd3JpdGUgdGhlIHZhbHVlCisJICogdHdpY2UgdG8gY2xlYXIgdGhlIHNpZ25hbC4KKwkgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhbCwgQVI1S19CRUFDT04pOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFsLCBBUjVLX0JFQUNPTik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGJlYWNvbiB0aW1lcnMKKyAqLwordm9pZCBhdGg1a19od19pbml0X2JlYWNvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgbmV4dF9iZWFjb24sIHUzMiBpbnRlcnZhbCkKK3sKKwl1MzIgdGltZXIxLCB0aW1lcjIsIHRpbWVyMzsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJLyoKKwkgKiBTZXQgdGhlIGFkZGl0aW9uYWwgdGltZXJzIGJ5IG1vZGUKKwkgKi8KKwlzd2l0Y2ggKGFoLT5haF9vcF9tb2RlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJCXRpbWVyMSA9IDB4ZmZmZmZmZmY7CisJCQl0aW1lcjIgPSAweGZmZmZmZmZmOworCQl9IGVsc2UgeworCQkJdGltZXIxID0gMHgwMDAwZmZmZjsKKwkJCXRpbWVyMiA9IDB4MDAwN2ZmZmY7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl0aW1lcjEgPSAobmV4dF9iZWFjb24gLSBBUjVLX1RVTkVfRE1BX0JFQUNPTl9SRVNQKSA8PCAzOworCQl0aW1lcjIgPSAobmV4dF9iZWFjb24gLSBBUjVLX1RVTkVfU1dfQkVBQ09OX1JFU1ApIDw8IDM7CisJfQorCisJdGltZXIzID0gbmV4dF9iZWFjb24gKyAoYWgtPmFoX2F0aW1fd2luZG93ID8gYWgtPmFoX2F0aW1fd2luZG93IDogMSk7CisKKwkvKgorCSAqIFNldCB0aGUgYmVhY29uIHJlZ2lzdGVyIGFuZCBlbmFibGUgYWxsIHRpbWVycy4KKwkgKiAobmV4dCBiZWFjb24sIERNQSBiZWFjb24sIHNvZnR3YXJlIGJlYWNvbiwgQVRJTSB3aW5kb3cgdGltZSkKKwkgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIG5leHRfYmVhY29uLCBBUjVLX1RJTUVSMCk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB0aW1lcjEsIEFSNUtfVElNRVIxKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIHRpbWVyMiwgQVI1S19USU1FUjIpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdGltZXIzLCBBUjVLX1RJTUVSMyk7CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludGVydmFsICYgKEFSNUtfQkVBQ09OX1BFUklPRCB8CisJCQlBUjVLX0JFQUNPTl9SRVNFVF9UU0YgfCBBUjVLX0JFQUNPTl9FTkFCTEUpLAorCQlBUjVLX0JFQUNPTik7Cit9CisKKyNpZiAwCisvKgorICogU2V0IGJlYWNvbiB0aW1lcnMKKyAqLworaW50IGF0aDVrX2h3X3NldF9iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCWNvbnN0IHN0cnVjdCBhdGg1a19iZWFjb25fc3RhdGUgKnN0YXRlKQoreworCXUzMiBjZnBfcGVyaW9kLCBuZXh0X2NmcCwgZHRpbSwgaW50ZXJ2YWwsIG5leHRfYmVhY29uOworCisJLyoKKwkgKiBUT0RPOiBzaG91bGQgYmUgY2hhbmdlZCB0aHJvdWdoICpzdGF0ZQorCSAqIHJldmlldyBzdHJ1Y3QgYXRoNWtfYmVhY29uX3N0YXRlIHN0cnVjdAorCSAqCisJICogWFhYOiBUaGVzZSBhcmUgdXNlZCBmb3IgY2ZwIHBlcmlvZCBiZWxsb3csIGFyZSB0aGV5CisJICogb2sgPyBJcyBpdCBPLksuIGZvciB0c2YgaGVyZSB0byBiZSAwIG9yIHNob3VsZCB3ZSB1c2UKKwkgKiBnZXRfdHNmID8KKwkgKi8KKwl1MzIgZHRpbV9jb3VudCA9IDA7IC8qIFhYWCAqLworCXUzMiBjZnBfY291bnQgPSAwOyAvKiBYWFggKi8KKwl1MzIgdHNmID0gMDsgLyogWFhYICovCisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCS8qIFJldHVybiBvbiBhbiBpbnZhbGlkIGJlYWNvbiBzdGF0ZSAqLworCWlmIChzdGF0ZS0+YnNfaW50ZXJ2YWwgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWludGVydmFsID0gc3RhdGUtPmJzX2ludGVydmFsOworCWR0aW0gPSBzdGF0ZS0+YnNfZHRpbV9wZXJpb2Q7CisKKwkvKgorCSAqIFBDRiBzdXBwb3J0PworCSAqLworCWlmIChzdGF0ZS0+YnNfY2ZwX3BlcmlvZCA+IDApIHsKKwkJLyoKKwkJICogRW5hYmxlIFBDRiBtb2RlIGFuZCBzZXQgdGhlIENGUAorCQkgKiAoQ29udGVudGlvbiBGcmVlIFBlcmlvZCkgYW5kIHRpbWVyIHJlZ2lzdGVycworCQkgKi8KKwkJY2ZwX3BlcmlvZCA9IHN0YXRlLT5ic19jZnBfcGVyaW9kICogc3RhdGUtPmJzX2R0aW1fcGVyaW9kICoKKwkJCXN0YXRlLT5ic19pbnRlcnZhbDsKKwkJbmV4dF9jZnAgPSAoY2ZwX2NvdW50ICogc3RhdGUtPmJzX2R0aW1fcGVyaW9kICsgZHRpbV9jb3VudCkgKgorCQkJc3RhdGUtPmJzX2ludGVydmFsOworCisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1NUQV9JRDEsCisJCQkJQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSB8CisJCQkJQVI1S19TVEFfSUQxX1BDRik7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgY2ZwX3BlcmlvZCwgQVI1S19DRlBfUEVSSU9EKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzdGF0ZS0+YnNfY2ZwX21heF9kdXJhdGlvbiwKKwkJCQlBUjVLX0NGUF9EVVIpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsICh0c2YgKyAobmV4dF9jZnAgPT0gMCA/IGNmcF9wZXJpb2QgOgorCQkJCQkJbmV4dF9jZnApKSA8PCAzLCBBUjVLX1RJTUVSMik7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBQQ0YgbW9kZSAqLworCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfU1RBX0lEMSwKKwkJCQlBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIHwKKwkJCQlBUjVLX1NUQV9JRDFfUENGKTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgYmVhY29uIHRpbWVyIHJlZ2lzdGVyCisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzdGF0ZS0+YnNfbmV4dF9iZWFjb24sIEFSNUtfVElNRVIwKTsKKworCS8qCisJICogU3RhcnQgdGhlIGJlYWNvbiB0aW1lcnMKKwkgKi8KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19CRUFDT04pICYKKwkJfihBUjVLX0JFQUNPTl9QRVJJT0QgfCBBUjVLX0JFQUNPTl9USU0pKSB8CisJCUFSNUtfUkVHX1NNKHN0YXRlLT5ic190aW1fb2Zmc2V0ID8gc3RhdGUtPmJzX3RpbV9vZmZzZXQgKyA0IDogMCwKKwkJQVI1S19CRUFDT05fVElNKSB8IEFSNUtfUkVHX1NNKHN0YXRlLT5ic19pbnRlcnZhbCwKKwkJQVI1S19CRUFDT05fUEVSSU9EKSwgQVI1S19CRUFDT04pOworCisJLyoKKwkgKiBXcml0ZSBuZXcgYmVhY29uIG1pc3MgdGhyZXNob2xkLCBpZiBpdCBhcHBlYXJzIHRvIGJlIHZhbGlkCisJICogWFhYOiBGaWd1cmUgb3V0IHJpZ2h0IHZhbHVlcyBmb3IgbWluIDw9IGJzX2JtaXNzX3RocmVzaG9sZCA8PSBtYXgKKwkgKiBhbmQgcmV0dXJuIGlmIGl0cyBub3QgaW4gcmFuZ2UuIFdlIGNhbiB0ZXN0IHRoaXMgYnkgcmVhZGluZyB2YWx1ZSBhbmQKKwkgKiBzZXR0aW5nIHZhbHVlIHRvIGEgbGFyZ2VzdCB2YWx1ZSBhbmQgc2VlaW5nIHdoaWNoIHZhbHVlcyByZWdpc3Rlci4KKwkgKi8KKworCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUlNTSV9USFIsIEFSNUtfUlNTSV9USFJfQk1JU1MsCisJCQlzdGF0ZS0+YnNfYm1pc3NfdGhyZXNob2xkKTsKKworCS8qCisJICogU2V0IHNsZWVwIGNvbnRyb2wgcmVnaXN0ZXIKKwkgKiBYWFg6IERpZG4ndCBmaW5kIHRoaXMgaW4gNTIxMCBjb2RlIGJ1dCBzaW5jZSB0aGlzIHJlZ2lzdGVyCisJICogZXhpc3RzIGFsc28gaW4gYXI1aydzIDUyMTAgaGVhZGVycyBpIGxlYXZlIGl0IGFzIGNvbW1vbiBjb2RlLgorCSAqLworCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfU0xFRVBfQ1RMLCBBUjVLX1NMRUVQX0NUTF9TTERVUiwKKwkJCShzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb24gLSAzKSA8PCAzKTsKKworCS8qCisJICogU2V0IGVuaGFuY2VkIHNsZWVwIHJlZ2lzdGVycyBvbiA1MjEyCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB7CisJCWlmIChzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb24gPiBzdGF0ZS0+YnNfaW50ZXJ2YWwgJiYKKwkJCQlyb3VuZHVwKHN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbiwgaW50ZXJ2YWwpID09CisJCQkJc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uKQorCQkJaW50ZXJ2YWwgPSBzdGF0ZS0+YnNfc2xlZXBfZHVyYXRpb247CisKKwkJaWYgKHN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbiA+IGR0aW0gJiYgKGR0aW0gPT0gMCB8fAorCQkJCXJvdW5kdXAoc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uLCBkdGltKSA9PQorCQkJCXN0YXRlLT5ic19zbGVlcF9kdXJhdGlvbikpCisJCQlkdGltID0gc3RhdGUtPmJzX3NsZWVwX2R1cmF0aW9uOworCisJCWlmIChpbnRlcnZhbCA+IGR0aW0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQluZXh0X2JlYWNvbiA9IGludGVydmFsID09IGR0aW0gPyBzdGF0ZS0+YnNfbmV4dF9kdGltIDoKKwkJCXN0YXRlLT5ic19uZXh0X2JlYWNvbjsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQlBUjVLX1JFR19TTSgoc3RhdGUtPmJzX25leHRfZHRpbSAtIDMpIDw8IDMsCisJCQlBUjVLX1NMRUVQMF9ORVhUX0RUSU0pIHwKKwkJCUFSNUtfUkVHX1NNKDEwLCBBUjVLX1NMRUVQMF9DQUJUTykgfAorCQkJQVI1S19TTEVFUDBfRU5IX1NMRUVQX0VOIHwKKwkJCUFSNUtfU0xFRVAwX0FTU1VNRV9EVElNLCBBUjVLX1NMRUVQMCk7CisKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTSgobmV4dF9iZWFjb24gLSAzKSA8PCAzLAorCQkJQVI1S19TTEVFUDFfTkVYVF9USU0pIHwKKwkJCUFSNUtfUkVHX1NNKDEwLCBBUjVLX1NMRUVQMV9CRUFDT05fVE8pLCBBUjVLX1NMRUVQMSk7CisKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJQVI1S19SRUdfU00oaW50ZXJ2YWwsIEFSNUtfU0xFRVAyX1RJTV9QRVIpIHwKKwkJCUFSNUtfUkVHX1NNKGR0aW0sIEFSNUtfU0xFRVAyX0RUSU1fUEVSKSwgQVI1S19TTEVFUDIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVzZXQgYmVhY29uIHRpbWVycworICovCit2b2lkIGF0aDVrX2h3X3Jlc2V0X2JlYWNvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJLyoKKwkgKiBEaXNhYmxlIGJlYWNvbiB0aW1lcgorCSAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19USU1FUjApOworCisJLyoKKwkgKiBEaXNhYmxlIHNvbWUgYmVhY29uIHJlZ2lzdGVyIHZhbHVlcworCSAqLworCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19TVEFfSUQxLAorCQkJQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSB8IEFSNUtfU1RBX0lEMV9QQ0YpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19CRUFDT05fUEVSSU9ELCBBUjVLX0JFQUNPTik7Cit9CisKKy8qCisgKiBXYWl0IGZvciBiZWFjb24gcXVldWUgdG8gZmluaXNoCisgKi8KK2ludCBhdGg1a19od19iZWFjb25xX2ZpbmlzaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKworCS8qIDUyMTAgZG9lc24ndCBoYXZlIFFDVSovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCS8qCisJCSAqIFdhaXQgZm9yIGJlYWNvbm4gcXVldWUgdG8gZmluaXNoIGJ5IGNoZWNraW5nCisJCSAqIENvbnRyb2wgUmVnaXN0ZXIgYW5kIEJlYWNvbiBTdGF0dXMgUmVnaXN0ZXIuCisJCSAqLworCQlmb3IgKGkgPSBBUjVLX1RVTkVfQkVBQ09OX0lOVEVSVkFMIC8gMjsgaSA+IDA7IGktLSkgeworCQkJaWYgKCEoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQlNSKSAmIEFSNUtfQlNSX1RYUTFGKQorCQkJCQl8fAorCQkJICAgICEoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpICYgQVI1S19CU1JfVFhRMUYpKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCS8qIFRpbWVvdXQuLi4gKi8KKwkJaWYgKGkgPD0gMCkgeworCQkJLyoKKwkJCSAqIFJlLXNjaGVkdWxlIHRoZSBiZWFjb24gcXVldWUKKwkJCSAqLworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaHlzX2FkZHIsIEFSNUtfTk9RQ1VfVFhEUDEpOworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0JDUl9UUTFWIHwgQVI1S19CQ1JfQkRNQUUsCisJCQkJCUFSNUtfQkNSKTsKKworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCS8qNTIxMS81MjEyKi8KKwkJcmV0ID0gYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChhaCwKKwkJCUFSNUtfUVVFVUVfU1RBVFVTKEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OKSwKKwkJCUFSNUtfUUNVX1NUU19GUk1QRU5EQ05ULCAwLCBmYWxzZSk7CisKKwkJaWYgKEFSNUtfUkVHX1JFQURfUShhaCwgQVI1S19RQ1VfVFhFLCBBUjVLX1RYX1FVRVVFX0lEX0JFQUNPTikpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKlwKKyogS2V5IHRhYmxlIGZ1bmN0aW9ucyAqCitcKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUmVzZXQgYSBrZXkgZW50cnkgb24gdGhlIHRhYmxlCisgKi8KK2ludCBhdGg1a19od19yZXNldF9rZXkoc3RydWN0IGF0aDVrX2h3ICphaCwgdTE2IGVudHJ5KQoreworCXVuc2lnbmVkIGludCBpOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX0FTU0VSVF9FTlRSWShlbnRyeSwgQVI1S19LRVlUQUJMRV9TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjVLX0tFWUNBQ0hFX1NJWkU7IGkrKykKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgaSkpOworCisJLyoKKwkgKiBTZXQgTlVMTCBlbmNyeXB0aW9uIG9uIEFSNTIxMisKKwkgKgorCSAqIE5vdGU6IEFSNUtfS0VZVEFCTEVfVFlQRSAtPiBBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgNSkKKwkgKiAgICAgICBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCAtPiAweDAwMDAwMDA3CisJICoKKwkgKiBOb3RlMjogV2luZG93cyBkcml2ZXIgKG5kaXN3cmFwcGVyKSBzZXRzIHRoaXMgdG8KKwkgKiAgICAgICAgMHgwMDAwMDcxNCBpbnN0ZWFkIG9mIDB4MDAwMDAwMDcKKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPiBBUjVLX0FSNTIxMSkKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0tFWVRBQkxFX1RZUEVfTlVMTCwKKwkJCQlBUjVLX0tFWVRBQkxFX1RZUEUoZW50cnkpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgYSB0YWJsZSBlbnRyeSBpcyB2YWxpZAorICovCitpbnQgYXRoNWtfaHdfaXNfa2V5X3ZhbGlkKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBlbnRyeSkKK3sKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCUFSNUtfQVNTRVJUX0VOVFJZKGVudHJ5LCBBUjVLX0tFWVRBQkxFX1NJWkUpOworCisJLyogQ2hlY2sgdGhlIHZhbGlkYXRpb24gZmxhZyBhdCB0aGUgZW5kIG9mIHRoZSBlbnRyeSAqLworCXJldHVybiBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19LRVlUQUJMRV9NQUMxKGVudHJ5KSkgJgorCQlBUjVLX0tFWVRBQkxFX1ZBTElEOworfQorCisvKgorICogU2V0IGEga2V5IGVudHJ5IG9uIHRoZSB0YWJsZQorICovCitpbnQgYXRoNWtfaHdfc2V0X2tleShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnksCisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgY29uc3QgdTggKm1hYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlfX2xlMzIga2V5X3ZbNV0gPSB7fTsKKwl1MzIga2V5dHlwZTsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwkvKiBrZXktPmtleWxlbiBjb21lcyBpbiBmcm9tIG1hYzgwMjExIGluIGJ5dGVzICovCisKKwlpZiAoa2V5LT5rZXlsZW4gPiBBUjVLX0tFWVRBQkxFX1NJWkUgLyA4KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGtleS0+a2V5bGVuKSB7CisJLyogV0VQIDQwLWJpdCAgID0gNDAtYml0ICBlbnRlcmVkIGtleSArIDI0IGJpdCBJViA9IDY0LWJpdCAqLworCWNhc2UgNDAgLyA4OgorCQltZW1jcHkoJmtleV92WzBdLCBrZXktPmtleSwgNSk7CisJCWtleXR5cGUgPSBBUjVLX0tFWVRBQkxFX1RZUEVfNDA7CisJCWJyZWFrOworCisJLyogV0VQIDEwNC1iaXQgID0gMTA0LWJpdCBlbnRlcmVkIGtleSArIDI0LWJpdCBJViA9IDEyOC1iaXQgKi8KKwljYXNlIDEwNCAvIDg6CisJCW1lbWNweSgma2V5X3ZbMF0sICZrZXktPmtleVswXSwgNik7CisJCW1lbWNweSgma2V5X3ZbMl0sICZrZXktPmtleVs2XSwgNik7CisJCW1lbWNweSgma2V5X3ZbNF0sICZrZXktPmtleVsxMl0sIDEpOworCQlrZXl0eXBlID0gQVI1S19LRVlUQUJMRV9UWVBFXzEwNDsKKwkJYnJlYWs7CisJLyogV0VQIDEyOC1iaXQgID0gMTI4LWJpdCBlbnRlcmVkIGtleSArIDI0IGJpdCBJViA9IDE1Mi1iaXQgKi8KKwljYXNlIDEyOCAvIDg6CisJCW1lbWNweSgma2V5X3ZbMF0sICZrZXktPmtleVswXSwgNik7CisJCW1lbWNweSgma2V5X3ZbMl0sICZrZXktPmtleVs2XSwgNik7CisJCW1lbWNweSgma2V5X3ZbNF0sICZrZXktPmtleVsxMl0sIDQpOworCQlrZXl0eXBlID0gQVI1S19LRVlUQUJMRV9UWVBFXzEyODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsgLyogc2hvdWxkbid0IGhhcHBlbiAqLworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleV92KTsgaSsrKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxlMzJfdG9fY3B1KGtleV92W2ldKSwKKwkJCQlBUjVLX0tFWVRBQkxFX09GRihlbnRyeSwgaSkpOworCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBrZXl0eXBlLCBBUjVLX0tFWVRBQkxFX1RZUEUoZW50cnkpKTsKKworCXJldHVybiBhdGg1a19od19zZXRfa2V5X2xsYWRkcihhaCwgZW50cnksIG1hYyk7Cit9CisKK2ludCBhdGg1a19od19zZXRfa2V5X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgZW50cnksIGNvbnN0IHU4ICptYWMpCit7CisJdTMyIGxvd19pZCwgaGlnaF9pZDsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJIC8qIEludmFsaWQgZW50cnkgKGtleSB0YWJsZSBvdmVyZmxvdykgKi8KKwlBUjVLX0FTU0VSVF9FTlRSWShlbnRyeSwgQVI1S19LRVlUQUJMRV9TSVpFKTsKKworCS8qIE1BQyBtYXkgYmUgTlVMTCBpZiBpdCdzIGEgYnJvYWRjYXN0IGtleS4gSW4gdGhpcyBjYXNlIG5vIG5lZWQgdG8KKwkgKiB0byBjb21wdXRlIEFSNUtfTE9XX0lEIGFuZCBBUjVLX0hJR0hfSUQgYXMgd2UgYWxyZWFkeSBrbm93IGl0LiAqLworCWlmICh1bmxpa2VseShtYWMgPT0gTlVMTCkpIHsKKwkJbG93X2lkID0gMHhmZmZmZmZmZjsKKwkJaGlnaF9pZCA9IDB4ZmZmZiB8IEFSNUtfS0VZVEFCTEVfVkFMSUQ7CisJfSBlbHNlIHsKKwkJbG93X2lkID0gQVI1S19MT1dfSUQobWFjKTsKKwkJaGlnaF9pZCA9IEFSNUtfSElHSF9JRChtYWMpIHwgQVI1S19LRVlUQUJMRV9WQUxJRDsKKwl9CisKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGxvd19pZCwgQVI1S19LRVlUQUJMRV9NQUMwKGVudHJ5KSk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBoaWdoX2lkLCBBUjVLX0tFWVRBQkxFX01BQzEoZW50cnkpKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3BoeS5jCmluZGV4IGZhMGQ0N2YuLmU0M2Y2NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3BoeS5jCkBAIC0xLDkgKzEsOSBAQAogLyoKICAqIFBIWSBmdW5jdGlvbnMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KICAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKQEAgLTE5LDYgKzE5LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBfQVRINUtfUEhZCisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiYXRoNWsuaCIKQEAgLTIxMjIsNyArMjEyNCw3IEBACiAJYmVhY29uID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQkVBQ09OXzUyMTApOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYmVhY29uICYgfkFSNUtfQkVBQ09OX0VOQUJMRSwgQVI1S19CRUFDT05fNTIxMCk7CiAKLQl1ZGVsYXkoMjMwMCk7CisJbWRlbGF5KDIpOwogCiAJLyoKIAkgKiBTZXQgdGhlIGNoYW5uZWwgKHdpdGggQUdDIHR1cm5lZCBvZmYpCkBAIC0yNTAxLDMgKzI1MDMsNSBAQAogCiAJcmV0dXJuIGF0aDVrX2h3X3R4cG93ZXIoYWgsIGNoYW5uZWwsIHBvd2VyKTsKIH0KKworI3VuZGVmIF9BVEg1S19QSFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3FjdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcWN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZjA5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3FjdS5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCitRdWV1ZSBDb250cm9sIFVuaXQsIERGUyBDb250cm9sIFVuaXQgRnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhdGg1ay5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorCisvKgorICogR2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKyAqLworaW50IGF0aDVrX2h3X2dldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKKwkJc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxdWV1ZV9pbmZvKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJbWVtY3B5KHF1ZXVlX2luZm8sICZhaC0+YWhfdHhxW3F1ZXVlXSwgc2l6ZW9mKHN0cnVjdCBhdGg1a190eHFfaW5mbykpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKyAqLworaW50IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKKwkJCQljb25zdCBzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKKworCWlmIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweSgmYWgtPmFoX3R4cVtxdWV1ZV0sIHF1ZXVlX2luZm8sIHNpemVvZihzdHJ1Y3QgYXRoNWtfdHhxX2luZm8pKTsKKworCS8qWFhYOiBJcyB0aGlzIHN1cHBvcnRlZCBvbiA1MjEwID8qLworCWlmICgocXVldWVfaW5mby0+dHFpX3R5cGUgPT0gQVI1S19UWF9RVUVVRV9EQVRBICYmCisJCQkoKHF1ZXVlX2luZm8tPnRxaV9zdWJ0eXBlID09IEFSNUtfV01FX0FDX1ZJKSB8fAorCQkJKHF1ZXVlX2luZm8tPnRxaV9zdWJ0eXBlID09IEFSNUtfV01FX0FDX1ZPKSkpIHx8CisJCQlxdWV1ZV9pbmZvLT50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX1VBUFNEKQorCQlhaC0+YWhfdHhxW3F1ZXVlXS50cWlfZmxhZ3MgfD0gQVI1S19UWFFfRkxBR19QT1NUX0ZSX0JLT0ZGX0RJUzsKKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHRyYW5zbWl0IHF1ZXVlCisgKi8KK2ludCBhdGg1a19od19zZXR1cF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3R4X3F1ZXVlIHF1ZXVlX3R5cGUsCisJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgcXVldWU7CisJaW50IHJldDsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwkvKgorCSAqIEdldCBxdWV1ZSBieSB0eXBlCisJICovCisJLyo1MjEwIG9ubHkgaGFzIDIgcXVldWVzKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKKwkJc3dpdGNoIChxdWV1ZV90eXBlKSB7CisJCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgorCQkJcXVldWUgPSBBUjVLX1RYX1FVRVVFX0lEX05PUUNVX0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0JFQUNPTjoKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9CRUFDT047CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChxdWV1ZV90eXBlKSB7CisJCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgorCQkJZm9yIChxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfREFUQV9NSU47CisJCQkJYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUgIT0KKwkJCQlBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOyBxdWV1ZSsrKSB7CisKKwkJCQlpZiAocXVldWUgPiBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUFYKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFSNUtfVFhfUVVFVUVfVUFQU0Q6CisJCQlxdWV1ZSA9IEFSNUtfVFhfUVVFVUVfSURfVUFQU0Q7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0JFQUNPTjoKKwkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9CRUFDT047CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9DQUI7CisJCQlicmVhazsKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX1hSX0RBVEE6CisJCQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTIpCisJCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCQkJIlhSIGRhdGEgcXVldWVzIG9ubHkgc3VwcG9ydGVkIGluIgorCQkJCQkiIDUyMTIhXG4iKTsKKwkJCXF1ZXVlID0gQVI1S19UWF9RVUVVRV9JRF9YUl9EQVRBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qCisJICogU2V0dXAgaW50ZXJuYWwgcXVldWUgc3RydWN0dXJlCisJICovCisJbWVtc2V0KCZhaC0+YWhfdHhxW3F1ZXVlXSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg1a190eHFfaW5mbykpOworCWFoLT5haF90eHFbcXVldWVdLnRxaV90eXBlID0gcXVldWVfdHlwZTsKKworCWlmIChxdWV1ZV9pbmZvICE9IE5VTEwpIHsKKwkJcXVldWVfaW5mby0+dHFpX3R5cGUgPSBxdWV1ZV90eXBlOworCQlyZXQgPSBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhhaCwgcXVldWUsIHF1ZXVlX2luZm8pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFdlIHVzZSBhaF90eHFfc3RhdHVzIHRvIGhvbGQgYSB0ZW1wIHZhbHVlIGZvcgorCSAqIHRoZSBTZWNvbmRhcnkgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXJzIG9uIDUyMTErCisJICogY2hlY2sgb3V0IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlCisJICovCisJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfc3RhdHVzLCBxdWV1ZSk7CisKKwlyZXR1cm4gcXVldWU7Cit9CisKKy8qCisgKiBHZXQgbnVtYmVyIG9mIHBlbmRpbmcgZnJhbWVzCisgKiBmb3IgYSBzcGVjaWZpYyBxdWV1ZSBbNTIxMStdCisgKi8KK3UzMiBhdGg1a19od19udW1fdHhfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCit7CisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKKworCS8qIFJldHVybiBpZiBxdWV1ZSBpcyBkZWNsYXJlZCBpbmFjdGl2ZSAqLworCWlmIChhaC0+YWhfdHhxW3F1ZXVlXS50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBYWFg6IEhvdyBhYm91dCBBUjVLX0NGR19UWENOVCA/ICovCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gQVI1S19RVUVVRV9TVEFUVVMocXVldWUpICYgQVI1S19RQ1VfU1RTX0ZSTVBFTkRDTlQ7Cit9CisKKy8qCisgKiBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorICovCit2b2lkIGF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKFdBUk5fT04ocXVldWUgPj0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBxdWV1ZSB3aWxsIGJlIHNraXBwZWQgaW4gZnVydGhlciBvcGVyYXRpb25zICovCisJYWgtPmFoX3R4cVtxdWV1ZV0udHFpX3R5cGUgPSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOworCS8qRm9yIFNJTVIgc2V0dXAqLworCUFSNUtfUV9ESVNBQkxFX0JJVFMoYWgtPmFoX3R4cV9zdGF0dXMsIHF1ZXVlKTsKK30KKworLyoKKyAqIFNldCBERlMgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZSBvbiBEQ1UKKyAqLworaW50IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3sKKwl1MzIgY3dfbWluLCBjd19tYXgsIHJldHJ5X2xnLCByZXRyeV9zaDsKKwlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnRxID0gJmFoLT5haF90eHFbcXVldWVdOworCisJQVRINUtfVFJBQ0UoYWgtPmFoX3NjKTsKKwlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKKworCXRxID0gJmFoLT5haF90eHFbcXVldWVdOworCisJaWYgKHRxLT50cWlfdHlwZSA9PSBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQkvKiBPbmx5IGhhbmRsZSBkYXRhIHF1ZXVlcywgb3RoZXJzIHdpbGwgYmUgaWdub3JlZCAqLworCQlpZiAodHEtPnRxaV90eXBlICE9IEFSNUtfVFhfUVVFVUVfREFUQSkKKwkJCXJldHVybiAwOworCisJCS8qIFNldCBTbG90IHRpbWUgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTyA6IEFSNUtfSU5JVF9TTE9UX1RJTUUsCisJCQlBUjVLX1NMT1RfVElNRSk7CisJCS8qIFNldCBBQ0tfQ1RTIHRpbWVvdXQgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJQVI1S19JTklUX0FDS19DVFNfVElNRU9VVF9UVVJCTyA6CisJCQlBUjVLX0lOSVRfQUNLX0NUU19USU1FT1VULCBBUjVLX1NMT1RfVElNRSk7CisJCS8qIFNldCBUcmFuc21pdCBMYXRlbmN5ICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KKwkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZX1RVUkJPIDoKKwkJCUFSNUtfSU5JVF9UUkFOU01JVF9MQVRFTkNZLCBBUjVLX1VTRUNfNTIxMCk7CisKKwkJLyogU2V0IElGUzAgKi8KKwkJaWYgKGFoLT5haF90dXJibykgeworCQkJIGF0aDVrX2h3X3JlZ193cml0ZShhaCwgKChBUjVLX0lOSVRfU0lGU19UVVJCTyArCisJCQkJKGFoLT5haF9haWZzICsgdHEtPnRxaV9haWZzKSAqCisJCQkJQVI1S19JTklUX1NMT1RfVElNRV9UVVJCTykgPDwKKwkJCQlBUjVLX0lGUzBfRElGU19TKSB8IEFSNUtfSU5JVF9TSUZTX1RVUkJPLAorCQkJCUFSNUtfSUZTMCk7CisJCX0gZWxzZSB7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsICgoQVI1S19JTklUX1NJRlMgKworCQkJCShhaC0+YWhfYWlmcyArIHRxLT50cWlfYWlmcykgKgorCQkJCUFSNUtfSU5JVF9TTE9UX1RJTUUpIDw8IEFSNUtfSUZTMF9ESUZTX1MpIHwKKwkJCQlBUjVLX0lOSVRfU0lGUywgQVI1S19JRlMwKTsKKwkJfQorCisJCS8qIFNldCBJRlMxICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYWgtPmFoX3R1cmJvID8KKwkJCUFSNUtfSU5JVF9QUk9UT19USU1FX0NOVFJMX1RVUkJPIDoKKwkJCUFSNUtfSU5JVF9QUk9UT19USU1FX0NOVFJMLCBBUjVLX0lGUzEpOworCQkvKiBTZXQgQVI1S19QSFlfU0VUVExJTkcgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhaC0+YWhfdHVyYm8gPworCQkJKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9TRVRUTElORykgJiB+MHg3RikKKwkJCXwgMHgzOCA6CisJCQkoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1NFVFRMSU5HKSAmIH4weDdGKQorCQkJfCAweDFDLAorCQkJQVI1S19QSFlfU0VUVExJTkcpOworCQkvKiBTZXQgRnJhbWUgQ29udHJvbCBSZWdpc3RlciAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF90dXJibyA/CisJCQkoQVI1S19QSFlfRlJBTUVfQ1RMX0lOSSB8IEFSNUtfUEhZX1RVUkJPX01PREUgfAorCQkJQVI1S19QSFlfVFVSQk9fU0hPUlQgfCAweDIwMjApIDoKKwkJCShBUjVLX1BIWV9GUkFNRV9DVExfSU5JIHwgMHgxMDIwKSwKKwkJCUFSNUtfUEhZX0ZSQU1FX0NUTF81MjEwKTsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjd21pbi9tYXggYnkgY2hhbm5lbCBtb2RlCisJICovCisJY3dfbWluID0gYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTjsKKwljd19tYXggPSBhaC0+YWhfY3dfbWF4ID0gQVI1S19UVU5FX0NXTUFYOworCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlM7CisJLypYUiBpcyBvbmx5IHN1cHBvcnRlZCBvbiA1MjEyKi8KKwlpZiAoSVNfQ0hBTl9YUihhaC0+YWhfY3VycmVudF9jaGFubmVsKSAmJgorCQkJYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJY3dfbWluID0gYWgtPmFoX2N3X21pbiA9IEFSNUtfVFVORV9DV01JTl9YUjsKKwkJY3dfbWF4ID0gYWgtPmFoX2N3X21heCA9IEFSNUtfVFVORV9DV01BWF9YUjsKKwkJYWgtPmFoX2FpZnMgPSBBUjVLX1RVTkVfQUlGU19YUjsKKwkvKkIgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIDUyMTAqLworCX0gZWxzZSBpZiAoSVNfQ0hBTl9CKGFoLT5haF9jdXJyZW50X2NoYW5uZWwpICYmCisJCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQljd19taW4gPSBhaC0+YWhfY3dfbWluID0gQVI1S19UVU5FX0NXTUlOXzExQjsKKwkJY3dfbWF4ID0gYWgtPmFoX2N3X21heCA9IEFSNUtfVFVORV9DV01BWF8xMUI7CisJCWFoLT5haF9haWZzID0gQVI1S19UVU5FX0FJRlNfMTFCOworCX0KKworCWN3X21pbiA9IDE7CisJd2hpbGUgKGN3X21pbiA8IGFoLT5haF9jd19taW4pCisJCWN3X21pbiA9IChjd19taW4gPDwgMSkgfCAxOworCisJY3dfbWluID0gdHEtPnRxaV9jd19taW4gPCAwID8gKGN3X21pbiA+PiAoLXRxLT50cWlfY3dfbWluKSkgOgorCQkoKGN3X21pbiA8PCB0cS0+dHFpX2N3X21pbikgKyAoMSA8PCB0cS0+dHFpX2N3X21pbikgLSAxKTsKKwljd19tYXggPSB0cS0+dHFpX2N3X21heCA8IDAgPyAoY3dfbWF4ID4+ICgtdHEtPnRxaV9jd19tYXgpKSA6CisJCSgoY3dfbWF4IDw8IHRxLT50cWlfY3dfbWF4KSArICgxIDw8IHRxLT50cWlfY3dfbWF4KSAtIDEpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgYW5kIHNldCByZXRyeSBsaW1pdHMKKwkgKi8KKwlpZiAoYWgtPmFoX3NvZnR3YXJlX3JldHJ5KSB7CisJCS8qIFhYWCBOZWVkIHRvIHRlc3QgdGhpcyAqLworCQlyZXRyeV9sZyA9IGFoLT5haF9saW1pdF90eF9yZXRyaWVzOworCQlyZXRyeV9zaCA9IHJldHJ5X2xnID0gcmV0cnlfbGcgPiBBUjVLX0RDVV9SRVRSWV9MTVRfU0hfUkVUUlkgPworCQkJQVI1S19EQ1VfUkVUUllfTE1UX1NIX1JFVFJZIDogcmV0cnlfbGc7CisJfSBlbHNlIHsKKwkJcmV0cnlfbGcgPSBBUjVLX0lOSVRfTEdfUkVUUlk7CisJCXJldHJ5X3NoID0gQVI1S19JTklUX1NIX1JFVFJZOworCX0KKworCS8qTm8gUUNVL0RDVSBbNTIxMF0qLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQkoY3dfbWluIDw8IEFSNUtfTk9EQ1VfUkVUUllfTE1UX0NXX01JTl9TKQorCQkJfCBBUjVLX1JFR19TTShBUjVLX0lOSVRfU0xHX1JFVFJZLAorCQkJCUFSNUtfTk9EQ1VfUkVUUllfTE1UX1NMR19SRVRSWSkKKwkJCXwgQVI1S19SRUdfU00oQVI1S19JTklUX1NTSF9SRVRSWSwKKwkJCQlBUjVLX05PRENVX1JFVFJZX0xNVF9TU0hfUkVUUlkpCisJCQl8IEFSNUtfUkVHX1NNKHJldHJ5X2xnLCBBUjVLX05PRENVX1JFVFJZX0xNVF9MR19SRVRSWSkKKwkJCXwgQVI1S19SRUdfU00ocmV0cnlfc2gsIEFSNUtfTk9EQ1VfUkVUUllfTE1UX1NIX1JFVFJZKSwKKwkJCUFSNUtfTk9EQ1VfUkVUUllfTE1UKTsKKwl9IGVsc2UgeworCQkvKlFDVS9EQ1UgWzUyMTErXSovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJCUFSNUtfUkVHX1NNKEFSNUtfSU5JVF9TTEdfUkVUUlksCisJCQkJQVI1S19EQ1VfUkVUUllfTE1UX1NMR19SRVRSWSkgfAorCQkJQVI1S19SRUdfU00oQVI1S19JTklUX1NTSF9SRVRSWSwKKwkJCQlBUjVLX0RDVV9SRVRSWV9MTVRfU1NIX1JFVFJZKSB8CisJCQlBUjVLX1JFR19TTShyZXRyeV9sZywgQVI1S19EQ1VfUkVUUllfTE1UX0xHX1JFVFJZKSB8CisJCQlBUjVLX1JFR19TTShyZXRyeV9zaCwgQVI1S19EQ1VfUkVUUllfTE1UX1NIX1JFVFJZKSwKKwkJCUFSNUtfUVVFVUVfREZTX1JFVFJZX0xJTUlUKHF1ZXVlKSk7CisKKwkvKj09PVJlc3QgaXMgYWxzbyBmb3IgUUNVL0RDVSBvbmx5IFs1MjExK109PT0qLworCisJCS8qCisJCSAqIFNldCBpbml0aWFsIGNvbnRlbnQgd2luZG93IChjd19taW4vY3dfbWF4KQorCQkgKiBhbmQgYXJiaXRyYXRlZCBpbnRlcmZyYW1lIHNwYWNlIChhaWZzKS4uLgorCQkgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLAorCQkJQVI1S19SRUdfU00oY3dfbWluLCBBUjVLX0RDVV9MQ0xfSUZTX0NXX01JTikgfAorCQkJQVI1S19SRUdfU00oY3dfbWF4LCBBUjVLX0RDVV9MQ0xfSUZTX0NXX01BWCkgfAorCQkJQVI1S19SRUdfU00oYWgtPmFoX2FpZnMgKyB0cS0+dHFpX2FpZnMsCisJCQkJQVI1S19EQ1VfTENMX0lGU19BSUZTKSwKKwkJCUFSNUtfUVVFVUVfREZTX0xPQ0FMX0lGUyhxdWV1ZSkpOworCisJCS8qCisJCSAqIFNldCBtaXNjIHJlZ2lzdGVycworCQkgKi8KKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1FDVV9NSVNDX0RDVV9FQVJMWSwKKwkJCUFSNUtfUVVFVUVfTUlTQyhxdWV1ZSkpOworCisJCWlmICh0cS0+dHFpX2Nicl9wZXJpb2QpIHsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00odHEtPnRxaV9jYnJfcGVyaW9kLAorCQkJCUFSNUtfUUNVX0NCUkNGR19JTlRWQUwpIHwKKwkJCQlBUjVLX1JFR19TTSh0cS0+dHFpX2Nicl9vdmVyZmxvd19saW1pdCwKKwkJCQlBUjVLX1FDVV9DQlJDRkdfT1JOX1RIUkVTKSwKKwkJCQlBUjVLX1FVRVVFX0NCUkNGRyhxdWV1ZSkpOworCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUVVFVUVfTUlTQyhxdWV1ZSksCisJCQkJQVI1S19RQ1VfTUlTQ19GUlNIRURfQ0JSKTsKKwkJCWlmICh0cS0+dHFpX2Nicl9vdmVyZmxvd19saW1pdCkKKwkJCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwKKwkJCQkJQVI1S19RVUVVRV9NSVNDKHF1ZXVlKSwKKwkJCQkJQVI1S19RQ1VfTUlTQ19DQlJfVEhSRVNfRU5BQkxFKTsKKwkJfQorCisJCWlmICh0cS0+dHFpX3JlYWR5X3RpbWUpCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUkVHX1NNKHRxLT50cWlfcmVhZHlfdGltZSwKKwkJCQlBUjVLX1FDVV9SRFlUSU1FQ0ZHX0lOVFZBTCkgfAorCQkJCUFSNUtfUUNVX1JEWVRJTUVDRkdfRU5BQkxFLAorCQkJCUFSNUtfUVVFVUVfUkRZVElNRUNGRyhxdWV1ZSkpOworCisJCWlmICh0cS0+dHFpX2J1cnN0X3RpbWUpIHsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00odHEtPnRxaV9idXJzdF90aW1lLAorCQkJCUFSNUtfRENVX0NIQU5fVElNRV9EVVIpIHwKKwkJCQlBUjVLX0RDVV9DSEFOX1RJTUVfRU5BQkxFLAorCQkJCUFSNUtfUVVFVUVfREZTX0NIQU5ORUxfVElNRShxdWV1ZSkpOworCisJCQlpZiAodHEtPnRxaV9mbGFncworCQkJJiBBUjVLX1RYUV9GTEFHX1JEWVRJTUVfRVhQX1BPTElDWV9FTkFCTEUpCisJCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsCisJCQkJCUFSNUtfUVVFVUVfTUlTQyhxdWV1ZSksCisJCQkJCUFSNUtfUUNVX01JU0NfUkRZX1ZFT0xfUE9MSUNZKTsKKwkJfQorCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19CQUNLT0ZGX0RJU0FCTEUpCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfRENVX01JU0NfUE9TVF9GUl9CS09GRl9ESVMsCisJCQkJQVI1S19RVUVVRV9ERlNfTUlTQyhxdWV1ZSkpOworCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19GUkFHX0JVUlNUX0JBQ0tPRkZfRU5BQkxFKQorCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX0RDVV9NSVNDX0JBQ0tPRkZfRlJBRywKKwkJCQlBUjVLX1FVRVVFX0RGU19NSVNDKHF1ZXVlKSk7CisKKwkJLyoKKwkJICogU2V0IHJlZ2lzdGVycyBieSBxdWV1ZSB0eXBlCisJCSAqLworCQlzd2l0Y2ggKHRxLT50cWlfdHlwZSkgeworCQljYXNlIEFSNUtfVFhfUVVFVUVfQkVBQ09OOgorCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUVVFVUVfTUlTQyhxdWV1ZSksCisJCQkJQVI1S19RQ1VfTUlTQ19GUlNIRURfREJBX0dUIHwKKwkJCQlBUjVLX1FDVV9NSVNDX0NCUkVYUF9CQ05fRElTIHwKKwkJCQlBUjVLX1FDVV9NSVNDX0JDTl9FTkFCTEUpOworCisJCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19RVUVVRV9ERlNfTUlTQyhxdWV1ZSksCisJCQkJKEFSNUtfRENVX01JU0NfQVJCTE9DS19DVExfR0xPQkFMIDw8CisJCQkJQVI1S19EQ1VfTUlTQ19BUkJMT0NLX0NUTF9TKSB8CisJCQkJQVI1S19EQ1VfTUlTQ19QT1NUX0ZSX0JLT0ZGX0RJUyB8CisJCQkJQVI1S19EQ1VfTUlTQ19CQ05fRU5BQkxFKTsKKworCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAoKEFSNUtfVFVORV9CRUFDT05fSU5URVJWQUwgLQorCQkJCShBUjVLX1RVTkVfU1dfQkVBQ09OX1JFU1AgLQorCQkJCUFSNUtfVFVORV9ETUFfQkVBQ09OX1JFU1ApIC0KKwkJCQlBUjVLX1RVTkVfQURESVRJT05BTF9TV0JBX0JBQ0tPRkYpICogMTAyNCkgfAorCQkJCUFSNUtfUUNVX1JEWVRJTUVDRkdfRU5BQkxFLAorCQkJCUFSNUtfUVVFVUVfUkRZVElNRUNGRyhxdWV1ZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX0NBQjoKKwkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1FVRVVFX01JU0MocXVldWUpLAorCQkJCUFSNUtfUUNVX01JU0NfRlJTSEVEX0RCQV9HVCB8CisJCQkJQVI1S19RQ1VfTUlTQ19DQlJFWFBfRElTIHwKKwkJCQlBUjVLX1FDVV9NSVNDX0NCUkVYUF9CQ05fRElTKTsKKworCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUVVFVUVfREZTX01JU0MocXVldWUpLAorCQkJCShBUjVLX0RDVV9NSVNDX0FSQkxPQ0tfQ1RMX0dMT0JBTCA8PAorCQkJCUFSNUtfRENVX01JU0NfQVJCTE9DS19DVExfUykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUjVLX1RYX1FVRVVFX1VBUFNEOgorCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUVVFVUVfTUlTQyhxdWV1ZSksCisJCQkJQVI1S19RQ1VfTUlTQ19DQlJFWFBfRElTKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVI1S19UWF9RVUVVRV9EQVRBOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdGhpcyB0eCBxdWV1ZQorCQkgKiBpbiB0aGUgc2Vjb25kYXJ5IGludGVycnVwdCBtYXNrIHJlZ2lzdGVycworCQkgKi8KKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYT0tJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4b2ssIHF1ZXVlKTsKKworCQlpZiAodHEtPnRxaV9mbGFncyAmIEFSNUtfVFhRX0ZMQUdfVFhFUlJJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZXJyLCBxdWV1ZSk7CisKKwkJaWYgKHRxLT50cWlfZmxhZ3MgJiBBUjVLX1RYUV9GTEFHX1RYVVJOSU5UX0VOQUJMRSkKKwkJCUFSNUtfUV9FTkFCTEVfQklUUyhhaC0+YWhfdHhxX2ltcl90eHVybiwgcXVldWUpOworCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWERFU0NJTlRfRU5BQkxFKQorCQkJQVI1S19RX0VOQUJMRV9CSVRTKGFoLT5haF90eHFfaW1yX3R4ZGVzYywgcXVldWUpOworCisJCWlmICh0cS0+dHFpX2ZsYWdzICYgQVI1S19UWFFfRkxBR19UWEVPTElOVF9FTkFCTEUpCisJCQlBUjVLX1FfRU5BQkxFX0JJVFMoYWgtPmFoX3R4cV9pbXJfdHhlb2wsIHF1ZXVlKTsKKworCisJCS8qIFVwZGF0ZSBzZWNvbmRhcnkgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXJzICovCisJCWFoLT5haF90eHFfaW1yX3R4b2sgJj0gYWgtPmFoX3R4cV9zdGF0dXM7CisJCWFoLT5haF90eHFfaW1yX3R4ZXJyICY9IGFoLT5haF90eHFfc3RhdHVzOworCQlhaC0+YWhfdHhxX2ltcl90eHVybiAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKwkJYWgtPmFoX3R4cV9pbXJfdHhkZXNjICY9IGFoLT5haF90eHFfc3RhdHVzOworCQlhaC0+YWhfdHhxX2ltcl90eGVvbCAmPSBhaC0+YWhfdHhxX3N0YXR1czsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUkVHX1NNKGFoLT5haF90eHFfaW1yX3R4b2ssCisJCQlBUjVLX1NJTVIwX1FDVV9UWE9LKSB8CisJCQlBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGRlc2MsCisJCQlBUjVLX1NJTVIwX1FDVV9UWERFU0MpLCBBUjVLX1NJTVIwKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGVyciwKKwkJCUFSNUtfU0lNUjFfUUNVX1RYRVJSKSB8CisJCQlBUjVLX1JFR19TTShhaC0+YWhfdHhxX2ltcl90eGVvbCwKKwkJCUFSNUtfU0lNUjFfUUNVX1RYRU9MKSwgQVI1S19TSU1SMSk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19SRUdfU00oYWgtPmFoX3R4cV9pbXJfdHh1cm4sCisJCQlBUjVLX1NJTVIyX1FDVV9UWFVSTiksIEFSNUtfU0lNUjIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHNsb3QgdGltZSBmcm9tIERDVQorICovCit1bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X3Nsb3RfdGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQoreworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQorCQlyZXR1cm4gYXRoNWtfaHdfY2xvY2t0b2goYXRoNWtfaHdfcmVnX3JlYWQoYWgsCisJCQkJQVI1S19TTE9UX1RJTUUpICYgMHhmZmZmLCBhaC0+YWhfdHVyYm8pOworCWVsc2UKKwkJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0RDVV9HQkxfSUZTX1NMT1QpICYgMHhmZmZmOworfQorCisvKgorICogU2V0IHNsb3QgdGltZSBvbiBEQ1UKKyAqLworaW50IGF0aDVrX2h3X3NldF9zbG90X3RpbWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNsb3RfdGltZSkKK3sKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCWlmIChzbG90X3RpbWUgPCBBUjVLX1NMT1RfVElNRV85IHx8IHNsb3RfdGltZSA+IEFSNUtfU0xPVF9USU1FX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYXRoNWtfaHdfaHRvY2xvY2soc2xvdF90aW1lLAorCQkJCWFoLT5haF90dXJibyksIEFSNUtfU0xPVF9USU1FKTsKKwllbHNlCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2xvdF90aW1lLCBBUjVLX0RDVV9HQkxfSUZTX1NMT1QpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcmVnLmgKaW5kZXggNzU2MmJmMS4uZTU1N2ZlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcmVnLmgKQEAgLTEsNyArMSw3IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBUYXlsb3IgPG1pa2UudGF5bG9yQGFwcHJpb24uY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTWljaGFlbCBUYXlsb3IgPG1pa2UudGF5bG9yQGFwcHJpb24uY29tPgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtMjksNiArMjksMTAgQEAKICAqICAgICAgICBodHRwOi8vd3d3Lml0LmlpdGIuYWMuaW4vfmphbmFrL3dpZmlyZS8wMTIyMjczNC5wZGYKICAqCiAgKiA1MjExIC0gaHR0cDovL3d3dy5ob3RjaGlwcy5vcmcvYXJjaGl2ZXMvaGMxNC8zX1R1ZS8xNl9tY2ZhcmxhbmQucGRmCisgKgorICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgcmVnaXN0ZXIgdmFsdWVzIGZvdW5kIG9uIGEgbWVtb3J5IGR1bXAgb2YKKyAqIEF0aGVyb3MncyBBUlQgcHJvZ3JhbSAoQXRoZXJvcyBSYWRpbyBUZXN0KSwgb24gYXRoOWssIG9uIGxlZ2FjeS1oYWwKKyAqIHJlbGVhc2VkIGJ5IEF0aGVyb3MgYW5kIG9uIHZhcmlvdXMgZGVidWcgbWVzc2FnZXMgZm91bmQgb24gdGhlIG5ldC4KICAqLwogCiAKQEAgLTI5NSw3ICsyOTksNyBAQAogI2RlZmluZSBBUjVLX0lTUl9SWFBIWQkJMHgwMDAwNDAwMAkvKiBQSFkgZXJyb3IgKi8KICNkZWZpbmUgQVI1S19JU1JfUlhLQ00JCTB4MDAwMDgwMDAJLyogUlggS2V5IGNhY2hlIG1pc3MgKi8KICNkZWZpbmUgQVI1S19JU1JfU1dCQQkJMHgwMDAxMDAwMAkvKiBTb2Z0d2FyZSBiZWFjb24gYWxlcnQgKi8KLSNkZWZpbmUgQVI1S19JU1JfQlJTU0kJCTB4MDAwMjAwMDAKKyNkZWZpbmUgQVI1S19JU1JfQlJTU0kJCTB4MDAwMjAwMDAJLyogQmVhY29uIHJzc2kgYmVsb3cgdGhyZXNob2xkICg/KSAqLwogI2RlZmluZSBBUjVLX0lTUl9CTUlTUwkJMHgwMDA0MDAwMAkvKiBCZWFjb24gbWlzc2VkICovCiAjZGVmaW5lIEFSNUtfSVNSX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfQk5SCQkweDAwMTAwMDAwIAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KQEAgLTMwMyw0NiArMzA3LDU2IEBACiAjZGVmaW5lIEFSNUtfSVNSX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSVNSX1NTRVJSCQkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciBbNTIxMF0gKi8KICNkZWZpbmUgQVI1S19JU1JfRFBFUlIJCTB4MDA0MDAwMDAJLyogRGV0IHBhciBFcnJvciAoPykgWzUyMTBdICovCi0jZGVmaW5lIEFSNUtfSVNSX1RJTQkJMHgwMDgwMDAwMAkvKiBbNTIxMF0gKi8KLSNkZWZpbmUgQVI1S19JU1JfQkNOTUlTQwkweDAwODAwMDAwCS8qIFs1MjEyK10gKi8KLSNkZWZpbmUgQVI1S19JU1JfR1BJTwkJMHgwMTAwMDAwMAkvKiBHUElPIChyZiBraWxsKSovCi0jZGVmaW5lIEFSNUtfSVNSX1FDQlJPUk4JMHgwMjAwMDAwMAkvKiBDQlIgb3ZlcnJ1biAoPykgIFs1MjExK10gKi8KLSNkZWZpbmUgQVI1S19JU1JfUUNCUlVSTgkweDA0MDAwMDAwCS8qIENCUiB1bmRlcnJ1biAoPykgWzUyMTErXSAqLwotI2RlZmluZSBBUjVLX0lTUl9RVFJJRwkJMHgwODAwMDAwMAkvKiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSVNSX1JYRE9QUExFUgkweDAwNDAwMDAwCS8qIERvcHBsZXIgY2hpcnAgcmVjZWl2ZWQgWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0lTUl9USU0JCTB4MDA4MDAwMDAJLyogWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0lTUl9CQ05NSVNDCTB4MDA4MDAwMDAJLyogJ29yJyBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQywgQkNOX1RJTUVPVVQsCisJCQkJCQlDQUJfVElNRU9VVCBhbmQgRFRJTSBiaXRzIGZyb20gU0lTUjIgWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0lTUl9HUElPCQkweDAxMDAwMDAwCS8qIEdQSU8gKHJmIGtpbGwpICovCisjZGVmaW5lIEFSNUtfSVNSX1FDQlJPUk4JMHgwMjAwMDAwMAkvKiBRQ1UgQ0JSIG92ZXJydW4gWzUyMTErXSAqLworI2RlZmluZSBBUjVLX0lTUl9RQ0JSVVJOCTB4MDQwMDAwMDAJLyogUUNVIENCUiB1bmRlcnJ1biBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSVNSX1FUUklHCQkweDA4MDAwMDAwCS8qIFFDVSBzY2hlZHVsaW5nIHRyaWdnZXIgWzUyMTErXSAqLwogCiAvKgogICogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3RlcnMgWzUyMTErXSAoMCAtIDQpCiAgKgotICogSSBndWVzcyBmcm9tIHRoZSBuYW1lcyB0aGF0IHRoZXNlIGdpdmUgdGhlIHN0YXR1cyBmb3IgZWFjaAotICogcXVldWUsIHRoYXQncyB3aHkgb25seSBtYXNrcyBhcmUgZGVmaW5lZCBoZXJlLCBoYXZlbid0IGdvdAotICogYW55IGluZm8gYWJvdXQgdGhlbSAoY291bGRuJ3QgZmluZCB0aGVtIGFueXdoZXJlIGluIGFyNWsgY29kZSkuCisgKiBUaGVzZSBnaXZlIHRoZSBzdGF0dXMgZm9yIGVhY2ggUUNVLCBvbmx5IFFDVXMgMC05IGFyZQorICogcmVwcmVzZW50ZWQuCiAgKi8KICNkZWZpbmUgQVI1S19TSVNSMAkJMHgwMDg0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lTUjBfUUNVX1RYT0sJMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ1VfVFhPSyAqLworI2RlZmluZSBBUjVLX1NJU1IwX1FDVV9UWE9LX1MJMAogI2RlZmluZSBBUjVLX1NJU1IwX1FDVV9UWERFU0MJMHgwM2ZmMDAwMAkvKiBNYXNrIGZvciBRQ1VfVFhERVNDICovCisjZGVmaW5lIEFSNUtfU0lTUjBfUUNVX1RYREVTQ19TCTE2CiAKICNkZWZpbmUgQVI1S19TSVNSMQkJMHgwMDg4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lTUjFfUUNVX1RYRVJSCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNVX1RYRVJSICovCisjZGVmaW5lIEFSNUtfU0lTUjFfUUNVX1RYRVJSX1MJMAogI2RlZmluZSBBUjVLX1NJU1IxX1FDVV9UWEVPTAkweDAzZmYwMDAwCS8qIE1hc2sgZm9yIFFDVV9UWEVPTCAqLworI2RlZmluZSBBUjVLX1NJU1IxX1FDVV9UWEVPTF9TCTE2CiAKICNkZWZpbmUgQVI1S19TSVNSMgkJMHgwMDhjCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lTUjJfUUNVX1RYVVJOCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNVX1RYVVJOICovCisjZGVmaW5lCUFSNUtfU0lTUjJfUUNVX1RYVVJOX1MJMAogI2RlZmluZQlBUjVLX1NJU1IyX01DQUJUCTB4MDAxMDAwMDAJLyogTWFzdGVyIEN5Y2xlIEFib3J0ICovCiAjZGVmaW5lCUFSNUtfU0lTUjJfU1NFUlIJMHgwMDIwMDAwMAkvKiBTaWduYWxlZCBTeXN0ZW0gRXJyb3IgKi8KLSNkZWZpbmUJQVI1S19TSVNSMl9EUEVSUgkweDAwNDAwMDAwCS8qIERldCBwYXIgRXJyb3IgKD8pICovCisjZGVmaW5lCUFSNUtfU0lTUjJfRFBFUlIJMHgwMDQwMDAwMAkvKiBCdXMgcGFyaXR5IGVycm9yICovCiAjZGVmaW5lCUFSNUtfU0lTUjJfVElNCQkweDAxMDAwMDAwCS8qIFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9DQUJfRU5ECTB4MDIwMDAwMDAJLyogWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1NJU1IyX0RUSU1fU1lOQwkweDA0MDAwMDAwCS8qIERUSU0gc3luYyBsb3N0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9CQ05fVElNRU9VVAkweDA4MDAwMDAwCS8qIEJlYWNvbiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9DQUJfVElNRU9VVAkweDEwMDAwMDAwCS8qIENBQiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9EVElNCQkweDIwMDAwMDAwCS8qIFs1MjEyK10gKi8KKyNkZWZpbmUJQVI1S19TSVNSMl9UU0ZPT1IJMHg4MDAwMDAwMAkvKiBUU0YgT09SICg/KSAqLwogCiAjZGVmaW5lIEFSNUtfU0lTUjMJCTB4MDA5MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX1NJU1IzX1FDQlJPUk4JMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRQ0JST1JOICovCisjZGVmaW5lIEFSNUtfU0lTUjNfUUNCT1JOX1MJMAogI2RlZmluZSBBUjVLX1NJU1IzX1FDQlJVUk4JMHgwM2ZmMDAwMAkvKiBNYXNrIGZvciBRQ0JSVVJOICovCisjZGVmaW5lIEFSNUtfU0lTUjNfUUNCUlVSTl9TCTE2CiAKICNkZWZpbmUgQVI1S19TSVNSNAkJMHgwMDk0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lTUjRfUVRSSUcJMHgwMDAwMDNmZgkvKiBNYXNrIGZvciBRVFJJRyAqLworI2RlZmluZSBBUjVLX1NJU1I0X1FUUklHX1MJMAogCiAvKgogICogU2hhZG93IHJlYWQtYW5kLWNsZWFyIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzIFs1MjExK10KQEAgLTM3OSw3ICszOTMsNyBAQAogI2RlZmluZSBBUjVLX0lNUl9SWFBIWQkJMHgwMDAwNDAwMAkvKiBQSFkgZXJyb3IqLwogI2RlZmluZSBBUjVLX0lNUl9SWEtDTQkJMHgwMDAwODAwMAkvKiBSWCBLZXkgY2FjaGUgbWlzcyAqLwogI2RlZmluZSBBUjVLX0lNUl9TV0JBCQkweDAwMDEwMDAwCS8qIFNvZnR3YXJlIGJlYWNvbiBhbGVydCovCi0jZGVmaW5lIEFSNUtfSU1SX0JSU1NJCQkweDAwMDIwMDAwCisjZGVmaW5lIEFSNUtfSU1SX0JSU1NJCQkweDAwMDIwMDAwCS8qIEJlYWNvbiByc3NpIGJlbG93IHRocmVzaG9sZCAoPykgKi8KICNkZWZpbmUgQVI1S19JTVJfQk1JU1MJCTB4MDAwNDAwMDAJLyogQmVhY29uIG1pc3NlZCovCiAjZGVmaW5lIEFSNUtfSU1SX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JTVJfQk5SCQkweDAwMTAwMDAwIAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KQEAgLTM4NywxMiArNDAxLDE0IEBACiAjZGVmaW5lIEFSNUtfSU1SX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdKi8KICNkZWZpbmUgQVI1S19JTVJfU1NFUlIJCTB4MDAyMDAwMDAJLyogU2lnbmFsZWQgU3lzdGVtIEVycm9yIFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX0lNUl9EUEVSUgkJMHgwMDQwMDAwMAkvKiBEZXQgcGFyIEVycm9yICg/KSBbNTIxMF0gKi8KKyNkZWZpbmUgQVI1S19JTVJfUlhET1BQTEVSCTB4MDA0MDAwMDAJLyogRG9wcGxlciBjaGlycCByZWNlaXZlZCBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSU1SX1RJTQkJMHgwMDgwMDAwMAkvKiBbNTIxMStdICovCi0jZGVmaW5lIEFSNUtfSU1SX0JDTk1JU0MJMHgwMDgwMDAwMAkvKiBbNTIxMitdICovCisjZGVmaW5lIEFSNUtfSU1SX0JDTk1JU0MJMHgwMDgwMDAwMAkvKiAnb3InIG9mIFRJTSwgQ0FCX0VORCwgRFRJTV9TWU5DLCBCQ05fVElNRU9VVCwKKwkJCQkJCUNBQl9USU1FT1VUIGFuZCBEVElNIGJpdHMgZnJvbSBTSVNSMiBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSU1SX0dQSU8JCTB4MDEwMDAwMDAJLyogR1BJTyAocmYga2lsbCkqLwotI2RlZmluZSBBUjVLX0lNUl9RQ0JST1JOCTB4MDIwMDAwMDAJLyogQ0JSIG92ZXJydW4gKD8pIFs1MjExK10gKi8KLSNkZWZpbmUgQVI1S19JTVJfUUNCUlVSTgkweDA0MDAwMDAwCS8qIENCUiB1bmRlcnJ1biAoPykgWzUyMTErXSAqLwotI2RlZmluZSBBUjVLX0lNUl9RVFJJRwkJMHgwODAwMDAwMAkvKiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSU1SX1FDQlJPUk4JMHgwMjAwMDAwMAkvKiBRQ1UgQ0JSIG92ZXJydW4gKD8pIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JTVJfUUNCUlVSTgkweDA0MDAwMDAwCS8qIFFDVSBDQlIgdW5kZXJydW4gKD8pIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JTVJfUVRSSUcJCTB4MDgwMDAwMDAJLyogUUNVIHNjaGVkdWxpbmcgdHJpZ2dlciBbNTIxMStdICovCiAKIC8qCiAgKiBTZWNvbmRhcnkgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXJzIFs1MjExK10gKDAgLSA0KQpAQCAtNDE0LDEzICs0MzAsMTQgQEAKICNkZWZpbmUgQVI1S19TSU1SMl9RQ1VfVFhVUk5fUwkwCiAjZGVmaW5lCUFSNUtfU0lNUjJfTUNBQlQJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgKi8KICNkZWZpbmUJQVI1S19TSU1SMl9TU0VSUgkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciAqLwotI2RlZmluZQlBUjVLX1NJTVIyX0RQRVJSCTB4MDA0MDAwMDAJLyogRGV0IHBhciBFcnJvciAoPykgKi8KKyNkZWZpbmUJQVI1S19TSU1SMl9EUEVSUgkweDAwNDAwMDAwCS8qIEJ1cyBwYXJpdHkgZXJyb3IgKi8KICNkZWZpbmUJQVI1S19TSU1SMl9USU0JCTB4MDEwMDAwMDAJLyogWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1NJTVIyX0NBQl9FTkQJMHgwMjAwMDAwMAkvKiBbNTIxMitdICovCiAjZGVmaW5lCUFSNUtfU0lNUjJfRFRJTV9TWU5DCTB4MDQwMDAwMDAJLyogRFRJTSBTeW5jIGxvc3QgWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1NJTVIyX0JDTl9USU1FT1VUCTB4MDgwMDAwMDAJLyogQmVhY29uIFRpbWVvdXQgWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1NJTVIyX0NBQl9USU1FT1VUCTB4MTAwMDAwMDAJLyogQ0FCIFRpbWVvdXQgWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1NJTVIyX0RUSU0JCTB4MjAwMDAwMDAJLyogWzUyMTIrXSAqLworI2RlZmluZQlBUjVLX1NJTVIyX1RTRk9PUgkweDgwMDAwMDAwCS8qIFRTRiBPT1IgKD8pICovCiAKICNkZWZpbmUgQVI1S19TSU1SMwkJMHgwMGIwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lNUjNfUUNCUk9STgkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFDQlJPUk4gKi8KQEAgLTU4NiwxNSArNjAzLDE1IEBACiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX00JCTB4MDAwMDAwMGYJLyogRnJhbWUgc2hlZHVsaW5nIG1hc2sgKi8KICNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfQVNBUAkJMAkvKiBBU0FQICovCiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0NCUgkJMQkvKiBDb25zdGFudCBCaXQgUmF0ZSAqLwotI2RlZmluZQlBUjVLX1FDVV9NSVNDX0ZSU0hFRF9EQkFfR1QJCTIJLyogRE1BIEJlYWNvbiBhbGVydCBnYXRlZCAoPykgKi8KLSNkZWZpbmUJQVI1S19RQ1VfTUlTQ19GUlNIRURfVElNX0dUCQkzCS8qIFRpbWUgZ2F0ZWQgKD8pICovCi0jZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0JDTl9TRU5UX0dUCTQJLyogQmVhY29uIHNlbnQgZ2F0ZWQgKD8pICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0RCQV9HVAkJMgkvKiBETUEgQmVhY29uIGFsZXJ0IGdhdGVkICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX1RJTV9HVAkJMwkvKiBUSU1UIGdhdGVkICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfRlJTSEVEX0JDTl9TRU5UX0dUCTQJLyogQmVhY29uIHNlbnQgZ2F0ZWQgKi8KICNkZWZpbmUJQVI1S19RQ1VfTUlTQ19PTkVTSE9UX0VOQUJMRQkweDAwMDAwMDEwCS8qIE9uZXNob3QgZW5hYmxlICovCi0jZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSRVhQCQkweDAwMDAwMDIwCS8qIENCUiBleHBpcmVkIChub3JtYWwgcXVldWUpICovCi0jZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSRVhQX0JDTgkweDAwMDAwMDQwCS8qIENCUiBleHBpcmVkIChiZWFjb24gcXVldWUpICovCisjZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSRVhQX0RJUwkweDAwMDAwMDIwCS8qIERpc2FibGUgQ0JSIGV4cGlyZWQgY291bnRlciAobm9ybWFsIHF1ZXVlKSAqLworI2RlZmluZQlBUjVLX1FDVV9NSVNDX0NCUkVYUF9CQ05fRElTCTB4MDAwMDAwNDAJLyogRGlzYWJsZSBDQlIgZXhwaXJlZCBjb3VudGVyIChiZWFjb24gcXVldWUpICovCiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfQkNOX0VOQUJMRQkweDAwMDAwMDgwCS8qIEVuYWJsZSBCZWFjb24gdXNlICovCi0jZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSX1RIUkVTX0VOQUJMRQkweDAwMDAwMTAwCS8qIENCUiB0aHJlc2hvbGQgZW5hYmxlZCAqLwotI2RlZmluZQlBUjVLX1FDVV9NSVNDX1JEWV9WRU9MX1BPTElDWQkweDAwMDAwMjAwCS8qIFRYRSByZXNldCB3aGVuIFJEWVRJTUUgZW5hbGJlZCAqLworI2RlZmluZQlBUjVLX1FDVV9NSVNDX0NCUl9USFJFU19FTkFCTEUJMHgwMDAwMDEwMAkvKiBDQlIgZXhwaXJlZCB0aHJlc2hvbGQgZW5hYmxlZCAqLworI2RlZmluZQlBUjVLX1FDVV9NSVNDX1JEWV9WRU9MX1BPTElDWQkweDAwMDAwMjAwCS8qIFRYRSByZXNldCB3aGVuIFJEWVRJTUUgZXhwaXJlZCBvciBWRU9MICovCiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfQ0JSX1JFU0VUX0NOVAkweDAwMDAwNDAwCS8qIENCUiB0aHJlc2hvbGQgKGNvdW50ZXIpIHJlc2V0ICovCiAjZGVmaW5lCUFSNUtfUUNVX01JU0NfRENVX0VBUkxZCQkweDAwMDAwODAwCS8qIERDVSBlYXJseSB0ZXJtaW5hdGlvbiAqLwogI2RlZmluZSBBUjVLX1FDVV9NSVNDX0RDVV9DTVBfRU4JMHgwMDAwMTAwMAkvKiBFbmFibGUgZnJhbWUgY29tcHJlc3Npb24gKi8KQEAgLTY2Myw2ICs2ODAsNyBAQAogI2RlZmluZQlBUjVLX0RDVV9MQ0xfSUZTX0NXX01BWF9TCTEwCiAjZGVmaW5lCUFSNUtfRENVX0xDTF9JRlNfQUlGUwkJMHgwZmYwMDAwMAkvKiBBcmJpdHJhdGVkIEludGVyZnJhbWUgU3BhY2UgKi8KICNkZWZpbmUJQVI1S19EQ1VfTENMX0lGU19BSUZTX1MJCTIwCisjZGVmaW5lCUFSNUtfRENVX0xDTF9JRlNfQUlGU19NQVgJMHhmYwkJLyogQW55dGhpbmcgYWJvdmUgdGhhdCBjYW4gY2F1c2UgRENVIHRvIGhhbmcgKi8KICNkZWZpbmUJQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKF9xKQlBUjVLX1FVRVVFX1JFRyhBUjVLX0RDVV9MQ0xfSUZTX0JBU0UsIF9xKQogCiAvKgpAQCAtNjkxLDExICs3MDksNyBAQAogLyoKICAqIERDVSBtaXNjIHJlZ2lzdGVycyBbNTIxMStdCiAgKgotICogRm9yIHNvbWUgb2YgdGhlIHJlZ2lzdGVycyBpIGNvdWxkbid0IGZpbmQgaW4gdGhlIGNvZGUKLSAqIChvbmx5IGJhY2tvZmYgc3R1ZmYgaXMgdGhlcmUgcmVhbHkpIGkgdHJpZWQgdG8gbWF0Y2ggdGhlCi0gKiBuYW1lcyB3aXRoIDgwMi4xMWUgcGFyYW1ldGVycyBldGMsIHNvIGkgZ3Vlc3MgVklSVENPTCBoZXJlCi0gKiBtZWFucyBWaXJ0dWFsIENvbGxpc2lvbiBhbmQgSENGUE9MTCBtZWFucyBIeWJyaWQgQ29vcmRpbmF0aW9uCi0gKiBmYWN0b3IgUG9sbCAoQ0YtIFBvbGwpLiBBcmJpdGVyIGxvY2tvdXQgY29udHJvbCBjb250cm9scyB0aGUKKyAqIE5vdGU6IEFyYml0ZXIgbG9ja291dCBjb250cm9sIGNvbnRyb2xzIHRoZQogICogYmVoYXZpb3VyIG9uIGxvdyBwcmlvcml0eSBxdWV1ZXMgd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHF1ZXVlcwogICogd2l0aCBwZW5kaW5nIGZyYW1lcy4gSW50cmEtZnJhbWUgbG9ja291dCBtZWFucyB3ZSB3YWl0IHVudGlsCiAgKiB0aGUgcXVldWUncyBjdXJyZW50IGZyYW1lIHRyYW5zbWl0cyAod2l0aCBwb3N0IGZyYW1lIGJhY2tvZmYgYW5kIGJ1cnN0aW5nKQpAQCAtNzA1LDE1ICs3MTksMjAgQEAKICAqIE5vIGxvY2tvdXQgbWVhbnMgdGhlcmUgaXMgbm8gc3BlY2lhbCBoYW5kbGluZy4KICAqLwogI2RlZmluZSBBUjVLX0RDVV9NSVNDX0JBU0UJCTB4MTEwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgLVF1ZXVlMCBEQ1VfTUlTQyAqLwotI2RlZmluZQlBUjVLX0RDVV9NSVNDX0JBQ0tPRkYJCTB4MDAwMDA3ZmYJLyogTWFzayBmb3IgYmFja29mZiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19CQUNLT0ZGCQkweDAwMDAwMDNmCS8qIE1hc2sgZm9yIGJhY2tvZmYgdGhyZXNob2xkICovCisjZGVmaW5lCUFSNUtfRENVX01JU0NfRVRTX1JUU19QT0wJMHgwMDAwMDA0MAkvKiBFbmQgb2YgdHJhbnNtaXNzaW9uIHNlcmllcworCQkJCQkJCXN0YXRpb24gUlRTL2RhdGEgZmFpbHVyZSBjb3VudAorCQkJCQkJCXJlc2V0IHBvbGljeSAoPykgKi8KKyNkZWZpbmUgQVI1S19EQ1VfTUlTQ19FVFNfQ1dfUE9MCTB4MDAwMDAwODAJLyogRW5kIG9mIHRyYW5zbWlzc2lvbiBzZXJpZXMKKwkJCQkJCQlDVyByZXNldCBwb2xpY3kgKi8KKyNkZWZpbmUJQVI1S19EQ1VfTUlTQ19GUkFHX1dBSVQJCTB4MDAwMDAxMDAJLyogV2FpdCBmb3IgbmV4dCBmcmFnbWVudCAqLwogI2RlZmluZSBBUjVLX0RDVV9NSVNDX0JBQ0tPRkZfRlJBRwkweDAwMDAwMjAwCS8qIEVuYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCiAjZGVmaW5lCUFSNUtfRENVX01JU0NfSENGUE9MTF9FTkFCTEUJMHgwMDAwMDgwMAkvKiBDRiAtIFBvbGwgZW5hYmxlICovCiAjZGVmaW5lCUFSNUtfRENVX01JU0NfQkFDS09GRl9QRVJTSVNUCTB4MDAwMDEwMDAJLyogUGVyc2lzdGVudCBiYWNrb2ZmICovCiAjZGVmaW5lCUFSNUtfRENVX01JU0NfRlJNUFJGVENIX0VOQUJMRQkweDAwMDAyMDAwCS8qIEVuYWJsZSBmcmFtZSBwcmUtZmV0Y2ggKi8KICNkZWZpbmUJQVI1S19EQ1VfTUlTQ19WSVJUQ09MCQkweDAwMDBjMDAwCS8qIE1hc2sgZm9yIFZpcnR1YWwgQ29sbGlzaW9uICg/KSAqLwotI2RlZmluZQlBUjVLX0RDVV9NSVNDX1ZJUlRDT0xfTk9STUFMCQkwCi0jZGVmaW5lCUFSNUtfRENVX01JU0NfVklSVENPTF9NT0RJRklFRAkJMQotI2RlZmluZQlBUjVLX0RDVV9NSVNDX1ZJUlRDT0xfSUdOT1JFCQkyCisjZGVmaW5lCUFSNUtfRENVX01JU0NfVklSVENPTF9OT1JNQUwJMAorI2RlZmluZQlBUjVLX0RDVV9NSVNDX1ZJUlRDT0xfSUdOT1JFCTEKICNkZWZpbmUJQVI1S19EQ1VfTUlTQ19CQ05fRU5BQkxFCTB4MDAwMTAwMDAJLyogRW5hYmxlIEJlYWNvbiB1c2UgKi8KICNkZWZpbmUJQVI1S19EQ1VfTUlTQ19BUkJMT0NLX0NUTAkweDAwMDYwMDAwCS8qIEFyYml0ZXIgbG9ja291dCBjb250cm9sIG1hc2sgKi8KICNkZWZpbmUJQVI1S19EQ1VfTUlTQ19BUkJMT0NLX0NUTF9TCTE3CkBAIC03NjgsOCArNzg3LDkgQEAKICNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX1RVUkJPX01PREUJMHgwMDAwMDAwOAkvKiBUdXJibyBtb2RlICovCiAjZGVmaW5lCUFSNUtfRENVX0dCTF9JRlNfTUlTQ19TSUZTX0RVUl9VU0VDCTB4MDAwMDAzZjAJLyogU0lGUyBEdXJhdGlvbiBtYXNrICovCiAjZGVmaW5lCUFSNUtfRENVX0dCTF9JRlNfTUlTQ19VU0VDX0RVUgkJMHgwMDBmZmMwMAkvKiBVU0VDIER1cmF0aW9uIG1hc2sgKi8KKyNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX1VTRUNfRFVSX1MJMTAKICNkZWZpbmUJQVI1S19EQ1VfR0JMX0lGU19NSVNDX0RDVV9BUkJfREVMQVkJMHgwMDMwMDAwMAkvKiBEQ1UgQXJiaXRlciBkZWxheSBtYXNrICovCi0jZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19TSUZTX0NOVF9SU1QJMHgwMDQwMDAwMAkvKiBTSUZDIGNudCByZXNldCBwb2xpY3kgKD8pICovCisjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19TSUZTX0NOVF9SU1QJMHgwMDQwMDAwMAkvKiBTSUZTIGNudCByZXNldCBwb2xpY3kgKD8pICovCiAjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19BSUZTX0NOVF9SU1QJMHgwMDgwMDAwMAkvKiBBSUZTIGNudCByZXNldCBwb2xpY3kgKD8pICovCiAjZGVmaW5lIEFSNUtfRENVX0dCTF9JRlNfTUlTQ19STkRfTEZTUl9TTF9ESVMJMHgwMTAwMDAwMAkvKiBEaXNhYmxlIHJhbmRvbSBMRlNSIHNsaWNlICovCiAKQEAgLTgyMCw4ICs4NDAsNiBAQAogI2RlZmluZSBBUjVLX1JFU0VUX0NUTF9NQUMJMHgwMDAwMDAwNAkvKiBNQUMgcmVzZXQgKFBDVStCYXNlYmFuZCA/KSBbNTIxMF0gKi8KICNkZWZpbmUgQVI1S19SRVNFVF9DVExfUEhZCTB4MDAwMDAwMDgJLyogUEhZIHJlc2V0IFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX1JFU0VUX0NUTF9QQ0kJMHgwMDAwMDAxMAkvKiBQQ0kgQ29yZSByZXNldCAoaW50ZXJydXB0cyBldGMpICovCi0jZGVmaW5lIEFSNUtfUkVTRVRfQ1RMX0NISVAJKEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0RNQSB8CVwKLQkJCQlBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9QSFkpCiAKIC8qCiAgKiBTbGVlcCBjb250cm9sIHJlZ2lzdGVyCkBAIC04MzMsOSArODUxLDExIEBACiAjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9TCQkxNgogI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfV0FLRQkJMHgwMDAwMDAwMAkvKiBGb3JjZSBjaGlwIGF3YWtlICovCiAjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9TTFAJCTB4MDAwMTAwMDAJLyogRm9yY2UgY2hpcCBzbGVlcCAqLwotI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfQUxMT1cJMHgwMDAyMDAwMAorI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfQUxMT1cJMHgwMDAyMDAwMAkvKiBOb3JtYWwgc2xlZXAgcG9saWN5ICovCiAjZGVmaW5lIEFSNUtfU0xFRVBfQ1RMX1NMRV9VTklUUwkweDAwMDAwMDA4CS8qIFs1MjExK10gKi8KLS8qIG1vcmUgYml0cyAqLworI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9EVVJfVElNX1BPTAkweDAwMDQwMDAwCS8qIFNsZWVwIGR1cmF0aW9uIHRpbWluZyBwb2xpY3kgKi8KKyNkZWZpbmUgQVI1S19TTEVFUF9DVExfRFVSX1dSSVRFX1BPTAkweDAwMDgwMDAwCS8qIFNsZWVwIGR1cmF0aW9uIHdyaXRlIHBvbGljeSAqLworI2RlZmluZSBBUjVLX1NMRUVQX0NUTF9TTEVfUE9MCQkweDAwMTAwMDAwCS8qIFNsZWVwIHBvbGljeSBtb2RlICovCiAKIC8qCiAgKiBJbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcgpAQCAtODUxLDI3ICs4NzEsMjggQEAKIAogLyoKICAqIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBUT0RPOiBGaXggTEVEIHN0dWZmCiAgKi8KICNkZWZpbmUgQVI1S19QQ0lDRkcJCQkweDQwMTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFQUUJCTB4MDAwMDAwMDEJLyogRWVwcm9tIGFjY2VzcyBlbmFibGUgWzUyMTBdICovCi0jZGVmaW5lCUFSNUtfUENJQ0ZHX1NMRUVQX0NMT0NLX0VOCTB4MDAwMDAwMDIJLyogRW5hYmxlIHNsZWVwIGNsb2NrICg/KSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19TTEVFUF9DTE9DS19FTgkweDAwMDAwMDAyCS8qIEVuYWJsZSBzbGVlcCBjbG9jayAqLwogI2RlZmluZSBBUjVLX1BDSUNGR19DTEtSVU5FTgkJMHgwMDAwMDAwNAkvKiBDTEtSVU4gZW5hYmxlIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19QQ0lDRkdfRUVTSVpFCQkweDAwMDAwMDE4CS8qIE1hc2sgZm9yIEVFUFJPTSBzaXplIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19QQ0lDRkdfRUVTSVpFX1MJCTMKICNkZWZpbmUgQVI1S19QQ0lDRkdfRUVTSVpFXzRLCQkwCQkvKiA0SyAqLwogI2RlZmluZSBBUjVLX1BDSUNGR19FRVNJWkVfOEsJCTEJCS8qIDhLICovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFU0laRV8xNksJCTIJCS8qIDE2SyAqLwotI2RlZmluZSBBUjVLX1BDSUNGR19FRVNJWkVfRkFJTAkJMwkJLyogRmFpbGVkIHRvIGdldCBzaXplICg/KSBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0VFU0laRV9GQUlMCQkzCQkvKiBGYWlsZWQgdG8gZ2V0IHNpemUgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX1BDSUNGR19MRUQJCQkweDAwMDAwMDYwCS8qIExlZCBzdGF0dXMgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX1BDSUNGR19MRURfTk9ORQkJMHgwMDAwMDAwMAkvKiBEZWZhdWx0IFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19QQ0lDRkdfTEVEX1BFTkQJCTB4MDAwMDAwMjAJLyogU2NhbiAvIEF1dGggcGVuZGluZyAqLwogI2RlZmluZSBBUjVLX1BDSUNGR19MRURfQVNTT0MJCTB4MDAwMDAwNDAJLyogQXNzb2NpYXRlZCAqLwogI2RlZmluZQlBUjVLX1BDSUNGR19CVVNfU0VMCQkweDAwMDAwMzgwCS8qIE1hc2sgZm9yICJidXMgc2VsZWN0IiBbNTIxMStdICg/KSAqLwotI2RlZmluZQlBUjVLX1BDSUNGR19DQkVGSVhfRElTCQkweDAwMDAwNDAwCS8qIERpc2FibGUgQ0JFIGZpeCAoPykgKi8KLSNkZWZpbmUgQVI1S19QQ0lDRkdfU0xfSU5URU4JCTB4MDAwMDA4MDAJLyogRW5hYmxlIGludGVycnVwdHMgd2hlbiBhc2xlZXAgKD8pICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX0NCRUZJWF9ESVMJCTB4MDAwMDA0MDAJLyogRGlzYWJsZSBDQkUgZml4ICovCisjZGVmaW5lIEFSNUtfUENJQ0ZHX1NMX0lOVEVOCQkweDAwMDAwODAwCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIHdoZW4gYXNsZWVwICovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRF9CQ1RMCQkweDAwMDAxMDAwCS8qIExlZCBibGluayAoPykgWzUyMTBdICovCi0jZGVmaW5lCUFSNUtfUENJQ0ZHX1VOSwkJCTB4MDAwMDEwMDAJLyogUGFzc2VkIG9uIHNvbWUgcGFydHMgZHVycmluZyBhdHRhY2ggKD8pICovCi0jZGVmaW5lIEFSNUtfUENJQ0ZHX1NMX0lOUEVOCQkweDAwMDAyMDAwCS8qIFNsZWVwIGV2ZW4gd2hpdGggcGVuZGluZyBpbnRlcnJ1cHRzICg/KSAqLworI2RlZmluZSBBUjVLX1BDSUNGR19SRVRSWV9GSVgJCTB4MDAwMDEwMDAJLyogRW5hYmxlIHBjaSBjb3JlIHJldHJ5IGZpeCAqLworI2RlZmluZSBBUjVLX1BDSUNGR19TTF9JTlBFTgkJMHgwMDAwMjAwMAkvKiBTbGVlcCBldmVuIHdoaXRoIHBlbmRpbmcgaW50ZXJydXB0cyovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX1NQV1JfRE4JCTB4MDAwMTAwMDAJLyogTWFzayBmb3IgcG93ZXIgc3RhdHVzICovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRE1PREUJCTB4MDAwZTAwMDAJLyogTGVkbW9kZSBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRE1PREVfUFJPUAkweDAwMDAwMDAwCS8qIEJsaW5rIG9uIHN0YW5kYXJkIHRyYWZmaWMgWzUyMTErXSAqLwpAQCAtODg0LDcgKzkwNSw4IEBACiAjZGVmaW5lIEFSNUtfUENJQ0ZHX0xFRFNUQVRFCQkJCVwKIAkoQVI1S19QQ0lDRkdfTEVEIHwgQVI1S19QQ0lDRkdfTEVETU9ERSB8CVwKIAlBUjVLX1BDSUNGR19MRURCTElOSyB8IEFSNUtfUENJQ0ZHX0xFRFNMT1cpCi0jZGVmaW5lCUFSNUtfUENJQ0ZHX1NMRUVQX0NMT0NLX1JBVEUJMHgwMzAwMDAwMAkvKiBTbGVlcCBjbG9jayByYXRlIChmaWVsZCkgKi8KKyNkZWZpbmUJQVI1S19QQ0lDRkdfU0xFRVBfQ0xPQ0tfUkFURQkweDAzMDAwMDAwCS8qIFNsZWVwIGNsb2NrIHJhdGUgKi8KKyNkZWZpbmUJQVI1S19QQ0lDRkdfU0xFRVBfQ0xPQ0tfUkFURV9TCTI0CiAKIC8qCiAgKiAiR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCIgKEdQSU8pIGNvbnRyb2wgcmVnaXN0ZXIKQEAgLTkwNiw4ICs5MjgsOCBAQAogCiAjZGVmaW5lIEFSNUtfR1BJT0NSCQkweDQwMTQJCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwogI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfRU5BCTB4MDAwMDgwMDAJCS8qIEVuYWJsZSBHUElPIGludGVycnVwdCAqLwotI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfU0VMTAkweDAwMDAwMDAwCQkvKiBHZW5lcmF0ZSBpbnRlcnJ1cHQgd2hlbiBwaW4gaXMgb2ZmICg/KSAqLwotI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfU0VMSAkweDAwMDEwMDAwCQkvKiBHZW5lcmF0ZSBpbnRlcnJ1cHQgd2hlbiBwaW4gaXMgb24gKi8KKyNkZWZpbmUgQVI1S19HUElPQ1JfSU5UX1NFTEwJMHgwMDAwMDAwMAkJLyogR2VuZXJhdGUgaW50ZXJydXB0IHdoZW4gcGluIGlzIGxvdyAqLworI2RlZmluZSBBUjVLX0dQSU9DUl9JTlRfU0VMSAkweDAwMDEwMDAwCQkvKiBHZW5lcmF0ZSBpbnRlcnJ1cHQgd2hlbiBwaW4gaXMgaGlnaCAqLwogI2RlZmluZSBBUjVLX0dQSU9DUl9JTihuKQkoMCA8PCAoKG4pICogMikpCS8qIE1vZGUgMCBmb3IgcGluIG4gKi8KICNkZWZpbmUgQVI1S19HUElPQ1JfT1VUMChuKQkoMSA8PCAoKG4pICogMikpCS8qIE1vZGUgMSBmb3IgcGluIG4gKi8KICNkZWZpbmUgQVI1S19HUElPQ1JfT1VUMShuKQkoMiA8PCAoKG4pICogMikpCS8qIE1vZGUgMiBmb3IgcGluIG4gKi8KQEAgLTkyNSw3ICs5NDcsNiBAQAogI2RlZmluZSBBUjVLX0dQSU9ESQkweDQwMWMKICNkZWZpbmUgQVI1S19HUElPRElfTQkweDAwMDAwMDJmCiAKLQogLyoKICAqIFNpbGljb24gcmV2aXNpb24gcmVnaXN0ZXIKICAqLwpAQCAtOTM1LDcgKzk1Niw1OSBAQAogI2RlZmluZSBBUjVLX1NSRVZfVkVSCQkweDAwMDAwMGZmCS8qIE1hc2sgZm9yIHZlcnNpb24gKi8KICNkZWZpbmUgQVI1S19TUkVWX1ZFUl9TCQk0CiAKKy8qCisgKiBUWEUgd3JpdGUgcG9zdGluZyByZWdpc3RlcgorICovCisjZGVmaW5lCUFSNUtfVFhFUE9TVAkweDQwMjgKIAorLyoKKyAqIFFDVSBzbGVlcCBtYXNrCisgKi8KKyNkZWZpbmUJQVI1S19RQ1VfU0xFRVBfTUFTSwkweDQwMmMKKworLyogMHg0MDY4IGlzIGNvbXByZXNzaW9uIGJ1ZmZlciBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciBvbiA1NDE0IGFuZCBwbSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKiBvbiA1NDI0IGFuZCBuZXdlciBwY2ktZSBjaGlwcy4gKi8KKworLyoKKyAqIENvbXByZXNzaW9uIGJ1ZmZlciBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlciAoZW5hYmxlL2Rpc2FibGUpIFs1NDE0XQorICovCisjZGVmaW5lIEFSNUtfNTQxNF9DQkNGRwkJMHg0MDY4CisjZGVmaW5lIEFSNUtfNTQxNF9DQkNGR19CVUZfRElTCTB4MTAJLyogRGlzYWJsZSBidWZmZXIgKi8KKworLyoKKyAqIFBDSS1FIFBvd2VyIG1hbmFnbWVudCBjb25maWd1cmF0aW9uCisgKiBhbmQgc3RhdHVzIHJlZ2lzdGVyIFs1NDI0K10KKyAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMCQkweDQwNjgJCQkvKiBSZWdpc3RlciBhZGRyZXNzICovCisvKiBPbmx5IDU0MjQgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9MMV9XSEVOX0QyCTB4MDAwMDAwMDEJLyogZW5hYmxlIFBDSWUgY29yZSBlbnRlciBMMQorCQkJCQkJCXdoZW4gZDJfc2xlZXBfZW4gaXMgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9MMF9MMFNfQ0xFQVIJMHgwMDAwMDAwMgkvKiBDbGVhciBMMCBhbmQgTDBTIGNvdW50ZXJzICovCisjZGVmaW5lCUFSNUtfUENJRV9QTV9DVExfTDBfTDBTX0VOCTB4MDAwMDAwMDQJLyogU3RhcnQgTDAgbmQgTDBTIGNvdW50ZXJzICovCisjZGVmaW5lCUFSNUtfUENJRV9QTV9DVExfTERSRVNFVF9FTgkweDAwMDAwMDA4CS8qIEVuYWJsZSByZXNldCB3aGVuIGxpbmsgZ29lcworCQkJCQkJCWRvd24gKi8KKy8qIFdha2UgT24gV2lyZWxlc3MgKi8KKyNkZWZpbmUJQVI1S19QQ0lFX1BNX0NUTF9QTUVfRU4JCTB4MDAwMDAwMTAJLyogUE1FIEVuYWJsZSAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX0FVWF9QV1JfREVUCTB4MDAwMDAwMjAJLyogQXV4IHBvd2VyIGRldGVjdCAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BNRV9DTEVBUgkweDAwMDAwMDQwCS8qIENsZWFyIFBNRSAqLworI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMAkJMHgwMDAwMDA4MAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMQkJMHgwMDAwMDEwMAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMgkJMHgwMDAwMDIwMAorI2RlZmluZQlBUjVLX1BDSUVfUE1fQ1RMX1BTTV9EMwkJMHgwMDAwMDQwMAorCisvKgorICogUENJLUUgV29ya2Fyb3VuZCBlbmFibGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlBUjVLX1BDSUVfV0FFTgkweDQwN2MKKworLyoKKyAqIFBDSS1FIFNlcmlhbGl6ZXIvRGVzaXJpYWxpemVyCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZQlBUjVLX1BDSUVfU0VSREVTCTB4NDA4MAorI2RlZmluZQlBUjVLX1BDSUVfU0VSREVTX1JFU0VUCTB4NDA4NAogCiAvKj09PT1FRVBST00gUkVHSVNURVJTPT09PSovCiAKQEAgLTk3Nyw5OCArMTA1MCw2IEBACiAjZGVmaW5lIEFSNUtfRUVQUk9NX0JBU0UJMHg2MDAwCiAKIC8qCi0gKiBDb21tb24gYXI1eHh4IEVFUFJPTSBkYXRhIG9mZnNldHMgKHNldCB0aGVzZSBvbiBBUjVLX0VFUFJPTV9CQVNFKQotICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDCQkweDAwM2QJLyogRUVQUk9NIE1hZ2ljIG51bWJlciAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ19WQUxVRQkJMHg1YWE1CS8qIERlZmF1bHQgLSBmb3VuZCBvbiBFRVBST00gKi8KLSNkZWZpbmUgQVI1S19FRVBST01fTUFHSUNfNTIxMgkJMHgwMDAwMTQ1YyAvKiA1MjEyICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX01BR0lDXzUyMTEJCTB4MDAwMDE0NWIgLyogNTIxMSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9NQUdJQ181MjEwCQkweDAwMDAxNDVhIC8qIDUyMTAgKi8KLQotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUCQkweDAwM2YJLyogRUVQUk9NIHByb3RlY3Qgc3RhdHVzICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMF8zMQkweDAwMDEJLyogUmVhZCBwcm90ZWN0aW9uIGJpdCBmb3Igb2Zmc2V0cyAweDAgLSAweDFmICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMF8zMQkweDAwMDIJLyogV3JpdGUgcHJvdGVjdGlvbiBiaXQgZm9yIG9mZnNldHMgMHgwIC0gMHgxZiAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzMyXzYzCTB4MDAwNAkvKiAweDIwIC0gMHgzZiAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzMyXzYzCTB4MDAwOAotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzY0XzEyNwkweDAwMTAJLyogMHg0MCAtIDB4N2YgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl82NF8xMjcJMHgwMDIwCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMTI4XzE5MQkweDAwNDAJLyogMHg4MCAtIDB4YmYgKHJlZ2RvbSkgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8xMjhfMTkxCTB4MDA4MAotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzE5Ml8yMDcJMHgwMTAwCS8qIDB4YzAgLSAweGNmICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMTkyXzIwNwkweDAyMDAKLSNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9SRF8yMDhfMjIzCTB4MDQwMAkvKiAweGQwIC0gMHhkZiAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1dSXzIwOF8yMjMJMHgwODAwCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfUkRfMjI0XzIzOQkweDEwMDAJLyogMHhlMCAtIDB4ZWYgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fUFJPVEVDVF9XUl8yMjRfMjM5CTB4MjAwMAotI2RlZmluZSBBUjVLX0VFUFJPTV9QUk9URUNUX1JEXzI0MF8yNTUJMHg0MDAwCS8qIDB4ZjAgLSAweGZmICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1BST1RFQ1RfV1JfMjQwXzI1NQkweDgwMDAKLSNkZWZpbmUgQVI1S19FRVBST01fUkVHX0RPTUFJTgkJMHgwMGJmCS8qIEVFUFJPTSByZWdkb20gKi8KLSNkZWZpbmUgQVI1S19FRVBST01fSU5GT19CQVNFCQkweDAwYzAJLyogRUVQUk9NIGhlYWRlciAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9JTkZPX01BWAkJKDB4NDAwIC0gQVI1S19FRVBST01fSU5GT19CQVNFKQotI2RlZmluZSBBUjVLX0VFUFJPTV9JTkZPX0NLU1VNCQkweGZmZmYKLSNkZWZpbmUgQVI1S19FRVBST01fSU5GTyhfbikJCShBUjVLX0VFUFJPTV9JTkZPX0JBU0UgKyAoX24pKQotCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT04JCUFSNUtfRUVQUk9NX0lORk8oMSkJLyogRUVQUk9NIFZlcnNpb24gKi8KLSNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzAJCTB4MzAwMAkvKiBObyBpZGVhIHdoYXQncyBnb2luZyBvbiBiZWZvcmUgdGhpcyB2ZXJzaW9uICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fM18xCQkweDMwMDEJLyogb2IvZGIgdmFsdWVzIGZvciAyR2h6IChhcjUyMTFfcmZyZWdzKSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMgkJMHgzMDAyCS8qIGRpZmZlcmVudCBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24gKGVlcHJvbV9iaW4yZnJlcSkgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl8zXzMJCTB4MzAwMwkvKiBvZmZzZXRzIGNoYW5nZWQsIGhhcyAzMiBDVExzIChzZWUgYmVsb3cpIGFuZCBlZV9mYWxzZV9kZXRlY3QgKGVlcHJvbV9yZWFkX21vZGVzKSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfNAkJMHgzMDA0CS8qIGhhcyBlZV9pX2dhaW4gZWVfY2NrX29mZG1fcG93ZXJfZGVsdGEgKGVlcHJvbV9yZWFkX21vZGVzKSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMAkJMHg0MDAwCS8qIGhhcyBlZV9taXNjKiwgZWVfY2FsX3BpZXIsIGVlX3R1cmJvX21heF9wb3dlciBhbmQgZWVfeHJfcG93ZXIgKGVlcHJvbV9pbml0KSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMQkJMHg0MDAxCS8qIGhhcyBlZV9tYXJnaW5fdHhfcnggKGVlcHJvbV9pbml0KSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfMgkJMHg0MDAyCS8qIGhhcyBlZV9jY2tfb2ZkbV9nYWluX2RlbHRhIChlZXByb21faW5pdCkgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzMJCTB4NDAwMwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNAkJMHg0MDA0Ci0jZGVmaW5lIEFSNUtfRUVQUk9NX1ZFUlNJT05fNF81CQkweDQwMDUKLSNkZWZpbmUgQVI1S19FRVBST01fVkVSU0lPTl80XzYJCTB4NDAwNgkvKiBoYXMgZWVfc2NhbGVkX2Nja19kZWx0YSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9WRVJTSU9OXzRfNwkJMHg0MDA3Ci0KLSNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUEJCTAKLSNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUIJCTEKLSNkZWZpbmUgQVI1S19FRVBST01fTU9ERV8xMUcJCTIKLQotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFIJCQlBUjVLX0VFUFJPTV9JTkZPKDIpCS8qIEhlYWRlciB0aGF0IGNvbnRhaW5zIHRoZSBkZXZpY2UgY2FwcyAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfMTFBKF92KQkJKCgoX3YpID4+IEFSNUtfRUVQUk9NX01PREVfMTFBKSAmIDB4MSkKLSNkZWZpbmUgQVI1S19FRVBST01fSERSXzExQihfdikJCSgoKF92KSA+PiBBUjVLX0VFUFJPTV9NT0RFXzExQikgJiAweDEpCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0hEUl8xMUcoX3YpCQkoKChfdikgPj4gQVI1S19FRVBST01fTU9ERV8xMUcpICYgMHgxKQotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF8yR0haX0RJUyhfdikJKCgoX3YpID4+IDMpICYgMHgxKQkvKiBEaXNhYmxlIHR1cmJvIGZvciAyR2h6ICg/KSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RCTShfdikJKCgoX3YpID4+IDQpICYgMHg3ZikJLyogTWF4IHR1cmJvIHBvd2VyIGZvciBhL1hSIG1vZGUgKGVlcHJvbV9pbml0KSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfREVWSUNFKF92KQkoKChfdikgPj4gMTEpICYgMHg3KQotI2RlZmluZSBBUjVLX0VFUFJPTV9IRFJfVF81R0haX0RJUyhfdikJKCgoX3YpID4+IDE1KSAmIDB4MSkJLyogRGlzYWJsZSB0dXJibyBmb3IgNUdoeiAoPykgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fSERSX1JGS0lMTChfdikJKCgoX3YpID4+IDE0KSAmIDB4MSkJLyogRGV2aWNlIGhhcyBSRktpbGwgc3VwcG9ydCAqLwotCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTAkweDAwMDAwMDFjCi0jZGVmaW5lIEFSNUtfRUVQUk9NX1JGS0lMTF9HUElPX1NFTF9TCTIKLSNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZCTB4MDAwMDAwMDIKLSNkZWZpbmUgQVI1S19FRVBST01fUkZLSUxMX1BPTEFSSVRZX1MJMQotCi0vKiBOZXdlciBFRVBST01zIGFyZSB1c2luZyBhIGRpZmZlcmVudCBvZmZzZXQgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fT0ZGKF92LCBfdjNfMCwgX3YzXzMpIFwKLQkoKChfdikgPj0gQVI1S19FRVBST01fVkVSU0lPTl8zXzMpID8gX3YzXzMgOiBfdjNfMCkKLQotI2RlZmluZSBBUjVLX0VFUFJPTV9BTlRfR0FJTihfdikJQVI1S19FRVBST01fT0ZGKF92LCAweDAwYzQsIDB4MDBjMykKLSNkZWZpbmUgQVI1S19FRVBST01fQU5UX0dBSU5fNUdIWihfdikJKChpbnQ4X3QpKCgoX3YpID4+IDgpICYgMHhmZikpCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0FOVF9HQUlOXzJHSFooX3YpCSgoaW50OF90KSgoX3YpICYgMHhmZikpCi0KLS8qIGNhbGlicmF0aW9uIHNldHRpbmdzICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX01PREVTXzExQShfdikJQVI1S19FRVBST01fT0ZGKF92LCAweDAwYzUsIDB4MDBkNCkKLSNkZWZpbmUgQVI1S19FRVBST01fTU9ERVNfMTFCKF92KQlBUjVLX0VFUFJPTV9PRkYoX3YsIDB4MDBkMCwgMHgwMGYyKQotI2RlZmluZSBBUjVLX0VFUFJPTV9NT0RFU18xMUcoX3YpCUFSNUtfRUVQUk9NX09GRihfdiwgMHgwMGRhLCAweDAxMGQpCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0NUTChfdikJCUFSNUtfRUVQUk9NX09GRihfdiwgMHgwMGU0LCAweDAxMjgpCS8qIENvbmZvcm1hbmNlIHRlc3QgbGltaXRzICovCi0KLS8qIFszLjEgLSAzLjNdICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX09CREIwXzJHSFoJCTB4MDBlYwotI2RlZmluZSBBUjVLX0VFUFJPTV9PQkRCMV8yR0haCQkweDAwZWQKLQotLyogTWlzYyB2YWx1ZXMgYXZhaWxhYmxlIHNpbmNlIEVFUFJPTSA0LjAgKi8KLSNkZWZpbmUgQVI1S19FRVBST01fTUlTQzAJCTB4MDBjNAotI2RlZmluZSBBUjVLX0VFUFJPTV9FQVJTVEFSVChfdikJKChfdikgJiAweGZmZikKLSNkZWZpbmUgQVI1S19FRVBST01fRUVNQVAoX3YpCQkoKChfdikgPj4gMTQpICYgMHgzKQotI2RlZmluZSBBUjVLX0VFUFJPTV9NSVNDMQkJMHgwMGM1Ci0jZGVmaW5lIEFSNUtfRUVQUk9NX1RBUkdFVF9QV1JTVEFSVChfdikJKChfdikgJiAweGZmZikKLSNkZWZpbmUgQVI1S19FRVBST01fSEFTMzJLSFpDUllTVEFMKF92KQkoKChfdikgPj4gMTQpICYgMHgxKQotCi0vKgogICogRUVQUk9NIGRhdGEgcmVnaXN0ZXIKICAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9EQVRBXzUyMTEJMHg2MDA0CkBAIC0xMTAwLDE0ICsxMDgxLDI4IEBACiAgKiBFRVBST00gY29uZmlnIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgQVI1S19FRVBST01fQ0ZHCQkJMHg2MDEwCQkJLyogUmVnaXN0ZXIgQWRkcmVzICovCi0jZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFX09WUgkweDAwMDAwMDAxCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFCQkweDAwMDAwMDAzCQkvKiBTaXplIGRldGVybWluYXRpb24gb3ZlcnJpZGUgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX1NJWkVfQVVUTwkwCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFXzRLQklUCTEKKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX1NJWkVfOEtCSVQJMgorI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfU0laRV8xNktCSVQJMwogI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfV1JfV0FJVF9ESVMJMHgwMDAwMDAwNAkvKiBEaXNhYmxlIHdyaXRlIHdhaXQgKi8KICNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX0NMS19SQVRFCTB4MDAwMDAwMTgJLyogQ2xvY2sgcmF0ZSAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfUFJPVF9LRVkJMHgwMGZmZmYwMAkvKiBQcm90ZWN0aW8ga2V5ICovCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19DTEtfUkFURV9TCQkzCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19DTEtfUkFURV8xNTZLSFoJMAorI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfQ0xLX1JBVEVfMzEyS0haCTEKKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX0NMS19SQVRFXzYyNUtIWgkyCisjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19QUk9UX0tFWQkweDAwZmZmZjAwICAgICAgLyogUHJvdGVjdGlvbiBrZXkgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHX1BST1RfS0VZX1MJOAogI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfTElORF9FTgkJMHgwMTAwMDAwMAkvKiBFbmFibGUgbGVuZ3RoIGluZGljYXRvciAoPykgKi8KIAogCiAvKgorICogVE9ETzogV2FrZSBPbiBXaXJlbGVzcyByZWdpc3RlcnMKKyAqIFJhbmdlIDB4NzAwMCAtIDB4N2NlMAorICovCisKKy8qCiAgKiBQcm90b2NvbCBDb250cm9sIFVuaXQgKFBDVSkgcmVnaXN0ZXJzCiAgKi8KIC8qCkBAIC0xMTM5LDExICsxMTM0LDEzIEBACiAjZGVmaW5lIEFSNUtfU1RBX0lEMV9ERVNDX0FOVEVOTkEJMHgwMDQwMDAwMAkvKiBVcGRhdGUgYW50ZW5uYSBmcm9tIGRlc2NyaXB0b3IgKi8KICNkZWZpbmUgQVI1S19TVEFfSUQxX1JUU19ERUZfQU5URU5OQQkweDAwODAwMDAwCS8qIFVzZSBkZWZhdWx0IGFudGVubmEgZm9yIFJUUyAqLwogI2RlZmluZSBBUjVLX1NUQV9JRDFfQUNLQ1RTXzZNQgkJMHgwMTAwMDAwMAkvKiBVc2UgNk1iaXQvcyBmb3IgQUNLL0NUUyAqLwotI2RlZmluZSBBUjVLX1NUQV9JRDFfQkFTRV9SQVRFXzExQgkweDAyMDAwMDAwCS8qIFVzZSAxMWIgYmFzZSByYXRlIChmb3IgQUNLL0NUUyA/KSBbNTIxMStdICovCi0jZGVmaW5lIEFSNUtfU1RBX0lEMV9TRUxGX0dFTl9TRUNUT1JFCTB4MDQwMDAwMDAJLyogU2VsZiBnZW5lcmF0ZSBzZWN0b3JlICg/KSAqLworI2RlZmluZSBBUjVLX1NUQV9JRDFfQkFTRV9SQVRFXzExQgkweDAyMDAwMDAwCS8qIFVzZSAxMWIgYmFzZSByYXRlIGZvciBBQ0svQ1RTIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX1NFTEZHRU5fREVGX0FOVAkweDA0MDAwMDAwCS8qIFVzZSBkZWYuIGFudGVubmEgZm9yIHNlbGYgZ2VuZXJhdGVkIGZyYW1lcyAqLwogI2RlZmluZSBBUjVLX1NUQV9JRDFfQ1JZUFRfTUlDX0VOCTB4MDgwMDAwMDAJLyogRW5hYmxlIE1JQyAqLwotI2RlZmluZSBBUjVLX1NUQV9JRDFfS0VZU1JDSF9NT0RFCTB4MTAwMDAwMDAJLyogS2V5c2VhcmNoIG1vZGUgKD8pICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9LRVlTUkNIX01PREUJMHgxMDAwMDAwMAkvKiBMb29rIHVwIGtleSB3aGVuIGtleSBpZCAhPSAwICovCiAjZGVmaW5lIEFSNUtfU1RBX0lEMV9QUkVTRVJWRV9TRVFfTlVNCTB4MjAwMDAwMDAJLyogUHJlc2VydmUgc2VxdWVuY2UgbnVtYmVyICovCisjZGVmaW5lIEFSNUtfU1RBX0lEMV9DQkNJVl9FTkRJQU4JMHg0MDAwMDAwMAkvKiA/Pz8gKi8KKyNkZWZpbmUgQVI1S19TVEFfSUQxX0tFWVNSQ0hfTUNBU1QJMHg4MDAwMDAwMAkvKiBEbyBrZXkgY2FjaGUgc2VhcmNoIGZvciBtY2FzdCBmcmFtZXMgKi8KIAogLyoKICAqIEZpcnN0IEJTU0lEIHJlZ2lzdGVyIChNQUMgYWRkcmVzcywgbG93ZXIgMzJiaXRzKQpAQCAtMTQwMiwxNiArMTM5OSwxNiBAQAogI2RlZmluZSBBUjVLX0RJQUdfU1dfTE9PUF9CQUNLXzUyMTEJMHgwMDAwMDA0MAogI2RlZmluZSBBUjVLX0RJQUdfU1dfTE9PUF9CQUNLCQkoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTAgPyBcCiAJCQkJCUFSNUtfRElBR19TV19MT09QX0JBQ0tfNTIxMCA6IEFSNUtfRElBR19TV19MT09QX0JBQ0tfNTIxMSkKLSNkZWZpbmUgQVI1S19ESUFHX1NXX0NPUlJfRkNTXzUyMTAJMHgwMDAwMDEwMAorI2RlZmluZSBBUjVLX0RJQUdfU1dfQ09SUl9GQ1NfNTIxMAkweDAwMDAwMTAwCS8qIENvcnJ1cHRlZCBGQ1MgKi8KICNkZWZpbmUgQVI1S19ESUFHX1NXX0NPUlJfRkNTXzUyMTEJMHgwMDAwMDA4MAogI2RlZmluZSBBUjVLX0RJQUdfU1dfQ09SUl9GQ1MJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKIAkJCQkJQVI1S19ESUFHX1NXX0NPUlJfRkNTXzUyMTAgOiBBUjVLX0RJQUdfU1dfQ09SUl9GQ1NfNTIxMSkKLSNkZWZpbmUgQVI1S19ESUFHX1NXX0NIQU5fSU5GT181MjEwCTB4MDAwMDAyMDAKKyNkZWZpbmUgQVI1S19ESUFHX1NXX0NIQU5fSU5GT181MjEwCTB4MDAwMDAyMDAJLyogRHVtcCBjaGFubmVsIGluZm8gKi8KICNkZWZpbmUgQVI1S19ESUFHX1NXX0NIQU5fSU5GT181MjExCTB4MDAwMDAxMDAKICNkZWZpbmUgQVI1S19ESUFHX1NXX0NIQU5fSU5GTwkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8gXAogCQkJCQlBUjVLX0RJQUdfU1dfQ0hBTl9JTkZPXzUyMTAgOiBBUjVLX0RJQUdfU1dfQ0hBTl9JTkZPXzUyMTEpCi0jZGVmaW5lIEFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVEXzUyMTEJMHgwMDAwMDIwMAkvKiBFbmFibGUgc2NyYW1ibGVyIHNlZWQgKi8KLSNkZWZpbmUgQVI1S19ESUFHX1NXX0VOX1NDUkFNX1NFRURfNTIxMAkweDAwMDAwNDAwCisjZGVmaW5lIEFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVEXzUyMTAJMHgwMDAwMDQwMAkvKiBFbmFibGUgZml4ZWQgc2NyYW1ibGVyIHNlZWQgKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX0VOX1NDUkFNX1NFRURfNTIxMQkweDAwMDAwMjAwCiAjZGVmaW5lIEFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVECShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKIAkJCQkJQVI1S19ESUFHX1NXX0VOX1NDUkFNX1NFRURfNTIxMCA6IEFSNUtfRElBR19TV19FTl9TQ1JBTV9TRUVEXzUyMTEpCiAjZGVmaW5lIEFSNUtfRElBR19TV19FQ09fRU5BQkxFCQkweDAwMDAwNDAwCS8qIFs1MjExK10gKi8KQEAgLTE0MjAsMTIgKzE0MTcsMTUgQEAKICNkZWZpbmUgQVI1S19ESUFHX1NXX1NDUkFNX1NFRURfUwkxMAogI2RlZmluZSBBUjVLX0RJQUdfU1dfRElTX1NFUV9JTkMJMHgwMDA0MDAwMAkvKiBEaXNhYmxlIHNlcW51bSBpbmNyZW1lbnQgKD8pWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfRElBR19TV19GUkFNRV9OVjBfNTIxMAkweDAwMDgwMDAwCi0jZGVmaW5lIEFSNUtfRElBR19TV19GUkFNRV9OVjBfNTIxMQkweDAwMDIwMDAwCisjZGVmaW5lIEFSNUtfRElBR19TV19GUkFNRV9OVjBfNTIxMQkweDAwMDIwMDAwCS8qIEFjY2VwdCBmcmFtZXMgb2Ygbm9uLXplcm8gcHJvdG9jb2wgbnVtYmVyICovCiAjZGVmaW5lCUFSNUtfRElBR19TV19GUkFNRV9OVjAJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/IFwKIAkJCQkJQVI1S19ESUFHX1NXX0ZSQU1FX05WMF81MjEwIDogQVI1S19ESUFHX1NXX0ZSQU1FX05WMF81MjExKQotI2RlZmluZSBBUjVLX0RJQUdfU1dfT0JTUFRfTQkJMHgwMDBjMDAwMAorI2RlZmluZSBBUjVLX0RJQUdfU1dfT0JTUFRfTQkJMHgwMDBjMDAwMAkvKiBPYnNlcnZhdGlvbiBwb2ludCBzZWxlY3QgKD8pICovCiAjZGVmaW5lIEFSNUtfRElBR19TV19PQlNQVF9TCQkxOAotLyogbW9yZSBiaXRzICovCisjZGVmaW5lIEFSNUtfRElBR19TV19SWF9DTEVBUl9ISUdICTB4MDAxMDAwMAkvKiBGb3JjZSBSWCBDbGVhciBoaWdoICovCisjZGVmaW5lIEFSNUtfRElBR19TV19JR05PUkVfQ0FSUl9TRU5TRQkweDAwMjAwMDAJLyogSWdub3JlIHZpcnR1YWwgY2FycmllciBzZW5zZSAqLworI2RlZmluZSBBUjVLX0RJQUdfU1dfQ0hBTkVMX0lETEVfSElHSAkweDAwNDAwMDAJLyogRm9yY2UgY2hhbm5lbCBpZGxlIGhpZ2ggKi8KKyNkZWZpbmUgQVI1S19ESUFHX1NXX1BIRUFSX01FCQkweDAwODAwMDAJLyogPz8/ICovCiAKIC8qCiAgKiBUU0YgKGNsb2NrKSByZWdpc3RlciAobG93ZXIgMzIgYml0cykKQEAgLTE2MzYsMTYgKzE2MzYsMTYgQEAKICAqCiAgKiBYWFg6IFBDREFDIHN0ZXBzICgwLjVkYm0pIG9yIERCTSA/CiAgKgotICogWFhYOiBNYXNrIGNoYW5nZXMgZm9yIG5ld2VyIGNoaXBzIHRvIDdmCi0gKiAgICAgIGxpa2UgdHggcG93ZXIgdGFibGUgPwogICovCiAjZGVmaW5lIEFSNUtfVFhQQwkJCTB4ODBlOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgQVI1S19UWFBDX0FDS19NCQkJMHgwMDAwMDAzZgkvKiBNYXNrIGZvciBBQ0sgdHggcG93ZXIgKi8KKyNkZWZpbmUgQVI1S19UWFBDX0FDS19NCQkJMHgwMDAwMDAzZgkvKiBBQ0sgdHggcG93ZXIgKi8KICNkZWZpbmUgQVI1S19UWFBDX0FDS19TCQkJMAotI2RlZmluZSBBUjVLX1RYUENfQ1RTX00JCQkweDAwMDAzZjAwCS8qIE1hc2sgZm9yIENUUyB0eCBwb3dlciAqLworI2RlZmluZSBBUjVLX1RYUENfQ1RTX00JCQkweDAwMDAzZjAwCS8qIENUUyB0eCBwb3dlciAqLwogI2RlZmluZSBBUjVLX1RYUENfQ1RTX1MJCQk4Ci0jZGVmaW5lIEFSNUtfVFhQQ19DSElSUF9NCQkweDAwM2YwMDAwCS8qIE1hc2sgZm9yIENISVJQIHR4IHBvd2VyICovCi0jZGVmaW5lIEFSNUtfVFhQQ19DSElSUF9TCQkyMgorI2RlZmluZSBBUjVLX1RYUENfQ0hJUlBfTQkJMHgwMDNmMDAwMAkvKiBDSElSUCB0eCBwb3dlciAqLworI2RlZmluZSBBUjVLX1RYUENfQ0hJUlBfUwkJMTYKKyNkZWZpbmUgQVI1S19UWFBDX0RPUFBMRVIJCTB4MGYwMDAwMDAJLyogRG9wcGxlciBjaGlycCBzcGFuICg/KSAqLworI2RlZmluZSBBUjVLX1RYUENfRE9QUExFUl9TCQkyNAogCiAvKgogICogUHJvZmlsZSBjb3VudCByZWdpc3RlcnMKQEAgLTE2NTYsMTQgKzE2NTYsMTkgQEAKICNkZWZpbmUgQVI1S19QUk9GQ05UX0NZQ0xFCQkweDgwZjgJLyogQ3ljbGUgY291bnQgKD8pICovCiAKIC8qCi0gKiBRdWlldCAocGVyaW9kKSBjb250cm9sIHJlZ2lzdGVycyAoPykKKyAqIFF1aWV0IHBlcmlvZCBjb250cm9sIHJlZ2lzdGVycwogICovCiAjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMQkJCTB4ODBmYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgQVI1S19RVUlFVF9DVEwxX05FWFRfUVQJCTB4MDAwMGZmZmYJLyogTWFzayBmb3IgbmV4dCBxdWlldCAocGVyaW9kPykgKD8pICovCi0jZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMV9RVF9FTgkJMHgwMDAxMDAwMAkvKiBFbmFibGUgcXVpZXQgKHBlcmlvZD8pICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRgkweDAwMDBmZmZmCS8qIE5leHQgcXVpZXQgcGVyaW9kIFRTRiAoVFUpICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMV9ORVhUX1FUX1RTRl9TCTAKKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwxX1FUX0VOCQkweDAwMDEwMDAwCS8qIEVuYWJsZSBxdWlldCBwZXJpb2QgKi8KKyNkZWZpbmUgQVI1S19RVUlFVF9DVEwxX0FDS19DVFNfRU4JMHgwMDAyMDAwMAkvKiBTZW5kIEFDSy9DVFMgZHVyaW5nIHF1aWV0IHBlcmlvZCAqLworCiAjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMgkJCTB4ODEwMAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgQVI1S19RVUlFVF9DVEwyX1FUX1BFUgkJMHgwMDAwZmZmZgkvKiBNYXNrIGZvciBxdWlldCBwZXJpb2QgKD8pICovCi0jZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMl9RVF9EVVIJCTB4ZmZmZjAwMDAJLyogTWFzayBmb3IgcXVpZXQgZHVyYXRpb24gKD8pICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMl9RVF9QRVIJCTB4MDAwMGZmZmYJLyogTWFzayBmb3IgcXVpZXQgcGVyaW9kIHBlcmlvZGljaXR5ICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMl9RVF9QRVJfUwkwCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMl9RVF9EVVIJCTB4ZmZmZjAwMDAJLyogTWFzayBmb3IgcXVpZXQgcGVyaW9kIGR1cmF0aW9uICovCisjZGVmaW5lIEFSNUtfUVVJRVRfQ1RMMl9RVF9EVVJfUwkxNgogCiAvKgogICogVFNGIHBhcmFtZXRlciByZWdpc3RlcgpAQCAtMTY3MywxMiArMTY3OCwxNSBAQAogI2RlZmluZSBBUjVLX1RTRl9QQVJNX0lOQ19TCQkwCiAKIC8qCi0gKiBRb1MgcmVnaXN0ZXIgKD8pCisgKiBRb1MgTk9BQ0sgcG9saWN5CiAgKi8KLSNkZWZpbmUgQVI1S19RT1MJCQkweDgxMDgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCi0jZGVmaW5lIEFSNUtfUU9TX05PQUNLXzJCSVRfVkFMVUVTCTB4MDAwMDAwMDAJLyogKGZpZWxkKSAqLwotI2RlZmluZSBBUjVLX1FPU19OT0FDS19CSVRfT0ZGU0VUCTB4MDAwMDAwMjAJLyogKGZpZWxkKSAqLwotI2RlZmluZSBBUjVLX1FPU19OT0FDS19CWVRFX09GRlNFVAkweDAwMDAwMDgwCS8qIChmaWVsZCkgKi8KKyNkZWZpbmUgQVI1S19RT1NfTk9BQ0sJCQkweDgxMDgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLXzJCSVRfVkFMVUVTCTB4MDAwMDAwMGYJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLXzJCSVRfVkFMVUVTX1MJMAorI2RlZmluZSBBUjVLX1FPU19OT0FDS19CSVRfT0ZGU0VUCTB4MDAwMDAwNzAJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JJVF9PRkZTRVRfUwk0CisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JZVEVfT0ZGU0VUCTB4MDAwMDAxODAJLyogPz8/ICovCisjZGVmaW5lIEFSNUtfUU9TX05PQUNLX0JZVEVfT0ZGU0VUX1MJOAogCiAvKgogICogUEhZIGVycm9yIGZpbHRlciByZWdpc3RlcgpAQCAtMTcwMiwyOSArMTcxMCwxNSBAQAogLyoKICAqIE1JQyBRb1MgY29udHJvbCByZWdpc3RlciAoPykKICAqLwotI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMCTB4ODExOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUJQVI1S19NSUNfUU9TX0NUTF8wCTB4MDAwMDAwMDEJLyogTUlDIFFvUyBjb250cm9sIDAgKD8pICovCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19DVExfMQkweDAwMDAwMDA0CS8qIE1JQyBRb1MgY29udHJvbCAxICg/KSAqLwotI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMXzIJMHgwMDAwMDAxMAkvKiBNSUMgUW9TIGNvbnRyb2wgMiAoPykgKi8KLSNkZWZpbmUJQVI1S19NSUNfUU9TX0NUTF8zCTB4MDAwMDAwNDAJLyogTUlDIFFvUyBjb250cm9sIDMgKD8pICovCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19DVExfNAkweDAwMDAwMTAwCS8qIE1JQyBRb1MgY29udHJvbCA0ICg/KSAqLwotI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMXzUJMHgwMDAwMDQwMAkvKiBNSUMgUW9TIGNvbnRyb2wgNSAoPykgKi8KLSNkZWZpbmUJQVI1S19NSUNfUU9TX0NUTF82CTB4MDAwMDEwMDAJLyogTUlDIFFvUyBjb250cm9sIDYgKD8pICovCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19DVExfNwkweDAwMDA0MDAwCS8qIE1JQyBRb1MgY29udHJvbCA3ICg/KSAqLwotI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMX01RX0VOCTB4MDAwMTAwMDAJLyogRW5hYmxlIE1JQyBRb1MgKi8KKyNkZWZpbmUJQVI1S19NSUNfUU9TX0NUTAkJMHg4MTE4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZQlBUjVLX01JQ19RT1NfQ1RMX09GRihfbikJKDEgPDwgKF9uICogMikpCisjZGVmaW5lCUFSNUtfTUlDX1FPU19DVExfTVFfRU4JCTB4MDAwMTAwMDAJLyogRW5hYmxlIE1JQyBRb1MgKi8KIAogLyoKICAqIE1JQyBRb1Mgc2VsZWN0IHJlZ2lzdGVyICg/KQogICovCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUwJMHg4MTFjCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfMAkweDAwMDAwMDAxCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfMQkweDAwMDAwMDEwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfMgkweDAwMDAwMTAwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfMwkweDAwMDAxMDAwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfNAkweDAwMDEwMDAwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfNQkweDAwMTAwMDAwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfNgkweDAxMDAwMDAwCi0jZGVmaW5lCUFSNUtfTUlDX1FPU19TRUxfNwkweDEwMDAwMDAwCisjZGVmaW5lCUFSNUtfTUlDX1FPU19TRUwJCTB4ODExYworI2RlZmluZQlBUjVLX01JQ19RT1NfU0VMX09GRihfbikJKDEgPDwgKF9uICogNCkpCiAKIC8qCiAgKiBNaXNjIG1vZGUgY29udHJvbCByZWdpc3RlciAoPykKQEAgLTE3NTksNiArMTc1MywxMSBAQAogI2RlZmluZQlBUjVLX1RTRl9USFJFUwkJCTB4ODEzYwogCiAvKgorICogVE9ETzogV2FrZSBPbiBXaXJlbGVzcyByZWdpc3RlcnMKKyAqIFJhbmdlOiAweDgxNDcgLSAweDgxOGMKKyAqLworCisvKgogICogUmF0ZSAtPiBBQ0sgU0lGUyBtYXBwaW5nIHRhYmxlICgzMiBlbnRyaWVzKQogICovCiAjZGVmaW5lCUFSNUtfUkFURV9BQ0tTSUZTX0JBU0UJCTB4ODY4MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KQEAgLTE4NzMsNyArMTg3Miw4IEBACiAgKi8KICNkZWZpbmUJQVI1S19QSFlfVFVSQk8JCQkweDk4MDQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCiAjZGVmaW5lCUFSNUtfUEhZX1RVUkJPX01PREUJCTB4MDAwMDAwMDEJLyogRW5hYmxlIHR1cmJvIG1vZGUgKi8KLSNkZWZpbmUJQVI1S19QSFlfVFVSQk9fU0hPUlQJCTB4MDAwMDAwMDIJLyogU2hvcnQgbW9kZSAoMjBNaHogY2hhbm5lbHMpICg/KSAqLworI2RlZmluZQlBUjVLX1BIWV9UVVJCT19TSE9SVAkJMHgwMDAwMDAwMgkvKiBTZXQgc2hvcnQgc3ltYm9scyB0byB0dXJibyBtb2RlICovCisjZGVmaW5lCUFSNUtfUEhZX1RVUkJPX01JTU8JCTB4MDAwMDAwMDQJLyogU2V0IHR1cmJvIGZvciBtaW1vIG1pbW8gKi8KIAogLyoKICAqIFBIWSBhZ2lsaXR5IGNvbW1hbmQgcmVnaXN0ZXIKQEAgLTE4ODMsNiArMTg4MywxMSBAQAogI2RlZmluZQlBUjVLX1BIWV9UU1QxCQkJMHg5ODA4CiAjZGVmaW5lCUFSNUtfUEhZX0FHQ19ESVNBQkxFCQkweDA4MDAwMDAwCS8qIERpc2FibGUgQUdDIHRvIEEyICg/KSovCiAjZGVmaW5lCUFSNUtfUEhZX1RTVDFfVFhIT0xECQkweDAwMDAzODAwCS8qIFNldCB0eCBob2xkICg/KSAqLworI2RlZmluZQlBUjVLX1BIWV9UU1QxX1RYU1JDX1NSQwkJMHgwMDAwMDAwMgkvKiBVc2VkIHdpdGggYml0IDcgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX1RTVDFfVFhTUkNfU1JDX1MJMQorI2RlZmluZQlBUjVLX1BIWV9UU1QxX1RYU1JDX0FMVAkJMHgwMDAwMDA4MAkvKiBTZXQgaW5wdXQgdG8gdHNkYWMgKD8pICovCisjZGVmaW5lCUFSNUtfUEhZX1RTVDFfVFhTUkNfQUxUX1MJNworCiAKIC8qCiAgKiBQSFkgdGltaW5nIHJlZ2lzdGVyIDMgWzUxMTIrXQpAQCAtMTkwNywxNSArMTkxMiwyMyBAQAogCiAvKgogICogUEhZIFJGIGNvbnRyb2wgcmVnaXN0ZXJzCi0gKiAoaSB0aGluayB0aGVzZSBhcmUgZGVsYXkgdGltZXMsCi0gKiB0aGVzZSBjYWxpYnJhdGlvbiB2YWx1ZXMgZXhpc3QKLSAqIGluIEVFUFJPTSkKICAqLwogI2RlZmluZSBBUjVLX1BIWV9SRl9DVEwyCQkweDk4MjQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCi0jZGVmaW5lCUFSNUtfUEhZX1JGX0NUTDJfVFhGMlRYRF9TVEFSVAkweDAwMDAwMDBmCS8qIE1hc2sgZm9yIFRYIGZyYW1lIHRvIFRYIGQoZXNjPykgc3RhcnQgKi8KKyNkZWZpbmUJQVI1S19QSFlfUkZfQ1RMMl9UWEYyVFhEX1NUQVJUCTB4MDAwMDAwMGYJLyogVFggZnJhbWUgdG8gVFggZGF0YSBzdGFydCAqLworI2RlZmluZQlBUjVLX1BIWV9SRl9DVEwyX1RYRjJUWERfU1RBUlRfUwkwCiAKICNkZWZpbmUgQVI1S19QSFlfUkZfQ1RMMwkJMHg5ODI4CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwotI2RlZmluZSBBUjVLX1BIWV9SRl9DVEwzX1RYRTJYTE5BX09OCTB4MDAwMDAwMGYJLyogTWFzayBmb3IgVFggZW5kIHRvIFhMTkEgb24gKi8KKyNkZWZpbmUgQVI1S19QSFlfUkZfQ1RMM19UWEUyWExOQV9PTgkweDAwMDAwMDBmCS8qIFRYIGVuZCB0byBYTE5BIG9uICovCisjZGVmaW5lCUFSNUtfUEhZX1JGX0NUTDNfVFhFMlhMTkFfT05fUwkwCisKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTAkJCTB4OTgyYworI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMX0lOQlVGR0FJTl9PRkYJCTB4MDAwMDAwMDMKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTF9JTkJVRkdBSU5fT0ZGX1MJMAorI2RlZmluZQlBUjVLX1BIWV9BRENfQ1RMX1BXRF9EQUNfT0ZGCQkweDAwMDAyMDAwCisjZGVmaW5lCUFSNUtfUEhZX0FEQ19DVExfUFdEX0JBTkRfR0FQX09GRgkweDAwMDA0MDAwCisjZGVmaW5lCUFSNUtfUEhZX0FEQ19DVExfUFdEX0FEQ19PRkYJCTB4MDAwMDgwMDAKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTF9JTkJVRkdBSU5fT04JCTB4MDAwMzAwMDAKKyNkZWZpbmUJQVI1S19QSFlfQURDX0NUTF9JTkJVRkdBSU5fT05fUwkJMTYKIAogI2RlZmluZSBBUjVLX1BIWV9SRl9DVEw0CQkweDk4MzQJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCiAjZGVmaW5lIEFSNUtfUEhZX1JGX0NUTDRfVFhGMlhQQV9BX09OCTB4MDAwMDAwMDEJLyogVFggZnJhbWUgdG8gWFBBIEEgb24gKGZpZWxkKSAqLwpAQCAtMTkzNywzNSArMTk1MCw0MyBAQAogICogUEhZIHNldHRsaW5nIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgQVI1S19QSFlfU0VUVExJTkcJCTB4OTg0NAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUJQVI1S19QSFlfU0VUVExJTkdfQUdDCQkweDAwMDAwMDdmCS8qIE1hc2sgZm9yIEFHQyBzZXR0bGluZyB0aW1lICovCi0jZGVmaW5lCUFSNUtfUEhZX1NFVFRMSU5HX1NXSVRDSAkweDAwMDAzZjgwCS8qIE1hc2sgZm9yIFN3aXRjaCBzZXR0bGlnIHRpbWUgKi8KKyNkZWZpbmUJQVI1S19QSFlfU0VUVExJTkdfQUdDCQkweDAwMDAwMDdmCS8qIEFHQyBzZXR0bGluZyB0aW1lICovCisjZGVmaW5lCUFSNUtfUEhZX1NFVFRMSU5HX0FHQ19TCQkwCisjZGVmaW5lCUFSNUtfUEhZX1NFVFRMSU5HX1NXSVRDSAkweDAwMDAzZjgwCS8qIFN3aXRjaCBzZXR0bGlnIHRpbWUgKi8KKyNkZWZpbmUJQVI1S19QSFlfU0VUVExJTktfU1dJVENIX1MJNwogCiAvKgogICogUEhZIEdhaW4gcmVnaXN0ZXJzCiAgKi8KICNkZWZpbmUgQVI1S19QSFlfR0FJTgkJCTB4OTg0OAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUJQVI1S19QSFlfR0FJTl9UWFJYX0FUVEVOCTB4MDAwM2YwMDAJLyogTWFzayBmb3IgVFgtUlggQXR0ZW51YXRpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfR0FJTl9UWFJYX0FUVEVOCTB4MDAwM2YwMDAJLyogVFgtUlggQXR0ZW51YXRpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfR0FJTl9UWFJYX0FUVEVOX1MJMTIKKyNkZWZpbmUJQVI1S19QSFlfR0FJTl9UWFJYX1JGX01BWAkweDAwN2MwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fVFhSWF9SRl9NQVhfUwkxOAogCiAjZGVmaW5lCUFSNUtfUEhZX0dBSU5fT0ZGU0VUCQkweDk4NGMJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCiAjZGVmaW5lCUFSNUtfUEhZX0dBSU5fT0ZGU0VUX1JYVFhfRkxBRwkweDAwMDIwMDAwCS8qIFJYLVRYIGZsYWcgKD8pICovCiAKIC8qCi0gKiBEZXNpcmVkIHNpemUgcmVnaXN0ZXIKKyAqIERlc2lyZWQgQURDL1BHQSBzaXplIHJlZ2lzdGVyCiAgKiAoZm9yIG1vcmUgaW5mb3MgcmVhZCBBTkkgcGF0ZW50KQogICovCiAjZGVmaW5lIEFSNUtfUEhZX0RFU0lSRURfU0laRQkJMHg5ODUwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwotI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfQURDCTB4MDAwMDAwZmYJLyogTWFzayBmb3IgQURDIGRlc2lyZWQgc2l6ZSAqLwotI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfUEdBCTB4MDAwMGZmMDAJLyogTWFzayBmb3IgUEdBIGRlc2lyZWQgc2l6ZSAqLwotI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfVE9UCTB4MGZmMDAwMDAJLyogTWFzayBmb3IgVG90YWwgZGVzaXJlZCBzaXplICg/KSAqLworI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfQURDCTB4MDAwMDAwZmYJLyogQURDIGRlc2lyZWQgc2l6ZSAqLworI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfQURDX1MJMAorI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfUEdBCTB4MDAwMGZmMDAJLyogUEdBIGRlc2lyZWQgc2l6ZSAqLworI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfUEdBX1MJOAorI2RlZmluZQlBUjVLX1BIWV9ERVNJUkVEX1NJWkVfVE9UCTB4MGZmMDAwMDAJLyogVG90YWwgZGVzaXJlZCBzaXplICovCisjZGVmaW5lCUFSNUtfUEhZX0RFU0lSRURfU0laRV9UT1RfUwkyMAogCiAvKgogICogUEhZIHNpZ25hbCByZWdpc3RlcgogICogKGZvciBtb3JlIGluZm9zIHJlYWQgQU5JIHBhdGVudCkKICAqLwogI2RlZmluZQlBUjVLX1BIWV9TSUcJCQkweDk4NTgJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCi0jZGVmaW5lCUFSNUtfUEhZX1NJR19GSVJTVEVQCQkweDAwMDNmMDAwCS8qIE1hc2sgZm9yIEZJUlNURVAgKi8KKyNkZWZpbmUJQVI1S19QSFlfU0lHX0ZJUlNURVAJCTB4MDAwM2YwMDAJLyogRklSU1RFUCAqLwogI2RlZmluZQlBUjVLX1BIWV9TSUdfRklSU1RFUF9TCQkxMgotI2RlZmluZQlBUjVLX1BIWV9TSUdfRklSUFdSCQkweDAzZmMwMDAwCS8qIE1hc2sgZm9yIEZJUFdSICovCisjZGVmaW5lCUFSNUtfUEhZX1NJR19GSVJQV1IJCTB4MDNmYzAwMDAJLyogRklQV1IgKi8KICNkZWZpbmUJQVI1S19QSFlfU0lHX0ZJUlBXUl9TCQkxOAogCiAvKgpAQCAtMTk3Myw5ICsxOTk0LDkgQEAKICAqIChmb3IgbW9yZSBpbmZvcyByZWFkIEFOSSBwYXRlbnQpCiAgKi8KICNkZWZpbmUJQVI1S19QSFlfQUdDQ09BUlNFCQkweDk4NWMJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCi0jZGVmaW5lCUFSNUtfUEhZX0FHQ0NPQVJTRV9MTwkJMHgwMDAwN2Y4MAkvKiBNYXNrIGZvciBBR0MgQ29hcnNlIGxvdyAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDT0FSU0VfTE8JCTB4MDAwMDdmODAJLyogQUdDIENvYXJzZSBsb3cgKi8KICNkZWZpbmUJQVI1S19QSFlfQUdDQ09BUlNFX0xPX1MJCTcKLSNkZWZpbmUJQVI1S19QSFlfQUdDQ09BUlNFX0hJCQkweDAwM2Y4MDAwCS8qIE1hc2sgZm9yIEFHQyBDb2Fyc2UgaGlnaCAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDT0FSU0VfSEkJCTB4MDAzZjgwMDAJLyogQUdDIENvYXJzZSBoaWdoICovCiAjZGVmaW5lCUFSNUtfUEhZX0FHQ0NPQVJTRV9ISV9TCQkxNQogCiAvKgpAQCAtMTk4NCw2ICsyMDA1LDggQEAKICNkZWZpbmUJQVI1S19QSFlfQUdDQ1RMCQkJMHg5ODYwCQkJLyogUmVnaXN0ZXIgYWRkcmVzcyAqLwogI2RlZmluZQlBUjVLX1BIWV9BR0NDVExfQ0FMCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBQSFkgY2FsaWJyYXRpb24gKi8KICNkZWZpbmUJQVI1S19QSFlfQUdDQ1RMX05GCQkweDAwMDAwMDAyCS8qIEVuYWJsZSBOb2lzZSBGbG9vciBjYWxpYnJhdGlvbiAqLworI2RlZmluZQlBUjVLX1BIWV9BR0NDVExfTkZfRU4JCTB4MDAwMDgwMDAJLyogRW5hYmxlIG5mIGNhbGlicmF0aW9uIHRvIGhhcHBlbiAoPykgKi8KKyNkZWZpbmUJQVI1S19QSFlfQUdDQ1RMX05GX05PVVBEQVRFCTB4MDAwMjAwMDAJLyogRG9uJ3QgdXBkYXRlIG5mIGF1dG9tYXRpY2FseSAqLwogCiAvKgogICogUEhZIG5vaXNlIGZsb29yIHN0YXR1cyByZWdpc3RlcgpAQCAtMTk5NCw3ICsyMDE3LDEwIEBACiAjZGVmaW5lIEFSNUtfUEhZX05GX1JWQUwoX24pCQkoKChfbikgPj4gMTkpICYgQVI1S19QSFlfTkZfTSkKICNkZWZpbmUgQVI1S19QSFlfTkZfQVZBTChfbikJCSgtKChfbikgXiBBUjVLX1BIWV9ORl9NKSArIDEpCiAjZGVmaW5lIEFSNUtfUEhZX05GX1NWQUwoX24pCQkoKChfbikgJiBBUjVLX1BIWV9ORl9NKSB8ICgxIDw8IDkpKQotI2RlZmluZQlBUjVLX1BIWV9ORl9USFJFU0g2MgkJMHgwMDAwMTAwMAkvKiBUaHJlc2g2MiAtY2hlY2sgQU5JIHBhdGVudC0gKGZpZWxkKSAqLworI2RlZmluZQlBUjVLX1BIWV9ORl9USFJFU0g2MgkJMHgwMDA3ZjAwMAkvKiBUaHJlc2g2MiAtY2hlY2sgQU5JIHBhdGVudC0gKGZpZWxkKSAqLworI2RlZmluZQlBUjVLX1BIWV9ORl9USFJFU0g2Ml9TCQkxMgorI2RlZmluZQlBUjVLX1BIWV9ORl9NSU5DQ0FfUFdSCQkweDBmZjgwMDAwCS8qID8/PyAqLworI2RlZmluZQlBUjVLX1BIWV9ORl9NSU5DQ0FfUFdSX1MJMTkKIAogLyoKICAqIFBIWSBBREMgc2F0dXJhdGlvbiByZWdpc3RlciBbNTExMF0KQEAgLTIwMzQsMjQgKzIwNjAsMzEgQEAKICAqLwogI2RlZmluZSBBUjVLX1BIWV9TQ1IJCQkweDk4NzAKICNkZWZpbmUgQVI1S19QSFlfU0NSXzMyTUhaCQkweDAwMDAwMDFmCisKICNkZWZpbmUgQVI1S19QSFlfU0xNVAkJCTB4OTg3NAogI2RlZmluZSBBUjVLX1BIWV9TTE1UXzMyTUhaCQkweDAwMDAwMDdmCisKICNkZWZpbmUgQVI1S19QSFlfU0NBTAkJCTB4OTg3OAogI2RlZmluZSBBUjVLX1BIWV9TQ0FMXzMyTUhaCQkweDAwMDAwMDBlCiAKKwogLyoKICAqIFBIWSBQTEwgKFBoYXNlIExvY2tlZCBMb29wKSBjb250cm9sIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUJQVI1S19QSFlfUExMCQkJMHg5ODdjCi0jZGVmaW5lCUFSNUtfUEhZX1BMTF8yME1IWgkJMHgxMwkvKiBGb3IgaGFsZiByYXRlICg/KSBbNTExMStdICovCi0jZGVmaW5lCUFSNUtfUEhZX1BMTF80ME1IWl81MjExCQkweDE4CS8qIEZvciA4MDIuMTFhICovCisjZGVmaW5lCUFSNUtfUEhZX1BMTF8yME1IWgkJMHgwMDAwMDAxMwkvKiBGb3IgaGFsZiByYXRlICg/KSAqLworLyogNDBNSHogLT4gNUdIeiBiYW5kICovCisjZGVmaW5lCUFSNUtfUEhZX1BMTF80ME1IWl81MjExCQkweDAwMDAwMDE4CiAjZGVmaW5lCUFSNUtfUEhZX1BMTF80ME1IWl81MjEyCQkweDAwMDAwMGFhCisjZGVmaW5lCUFSNUtfUEhZX1BMTF80ME1IWl81NDEzCQkweDAwMDAwMDA0CiAjZGVmaW5lCUFSNUtfUEhZX1BMTF80ME1IWgkJKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjExID8gXAogCQkJCQlBUjVLX1BIWV9QTExfNDBNSFpfNTIxMSA6IEFSNUtfUEhZX1BMTF80ME1IWl81MjEyKQotI2RlZmluZQlBUjVLX1BIWV9QTExfNDRNSFpfNTIxMQkJMHgxOQkvKiBGb3IgODAyLjExYi9nICovCisvKiA0NE1IeiAtPiAyLjRHSHogYmFuZCAqLworI2RlZmluZQlBUjVLX1BIWV9QTExfNDRNSFpfNTIxMQkJMHgwMDAwMDAxOQogI2RlZmluZQlBUjVLX1BIWV9QTExfNDRNSFpfNTIxMgkJMHgwMDAwMDBhYgogI2RlZmluZQlBUjVLX1BIWV9QTExfNDRNSFoJCShhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSA/IFwKIAkJCQkJQVI1S19QSFlfUExMXzQ0TUhaXzUyMTEgOiBBUjVLX1BIWV9QTExfNDRNSFpfNTIxMikKKwogI2RlZmluZSBBUjVLX1BIWV9QTExfUkY1MTExCQkweDAwMDAwMDAwCiAjZGVmaW5lIEFSNUtfUEhZX1BMTF9SRjUxMTIJCTB4MDAwMDAwNDAKICNkZWZpbmUJQVI1S19QSFlfUExMX0hBTEZfUkFURQkJMHgwMDAwMDEwMApAQCAtMjExOCw2ICsyMTUxLDE5IEBACiAjZGVmaW5lIEFSNUtfUEhZX1JGU1RHX0RJU0FCTEUJCTB4MDAwMDAwMjEKIAogLyoKKyAqIEJJTiBtYXNrcyAoPykKKyAqLworI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18xCTB4OTkwMAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18yCTB4OTkwNAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS18zCTB4OTkwOAorCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTAkJMHg5OTBjCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTF9NQVNLXzQJMHgwMDAwM2ZmZgorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS19DVExfTUFTS180X1MJMAorI2RlZmluZQlBUjVLX1BIWV9CSU5fTUFTS19DVExfUkFURQkweGZmMDAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0JJTl9NQVNLX0NUTF9SQVRFX1MJMjQKKworLyoKICAqIFBIWSBBbnRlbm5hIGNvbnRyb2wgcmVnaXN0ZXIKICAqLwogI2RlZmluZSBBUjVLX1BIWV9BTlRfQ1RMCQkweDk5MTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzICovCkBAIC0yMTY0LDYgKzIyMTAsNyBAQAogI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSCQkJMHg5OTI0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwogI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX0NZUFdSX1RIUjFfRU4JMHgwMDAwMDAwMQkvKiBFbmFibGUgY3ljbGljIFJTU0kgdGhyIDEgKi8KICNkZWZpbmUJQVI1S19QSFlfT0ZETV9TRUxGQ09SUl9DWVBXUl9USFIxCTB4MDAwMDAwZmUJLyogTWFzayBmb3IgQ3ljbGljIFJTU0kgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUJQVI1S19QSFlfT0ZETV9TRUxGQ09SUl9DWVBXUl9USFIxX1MJMAogI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX0NZUFdSX1RIUjMJMHgwMDAwMDEwMAkvKiBDeWNsaWMgUlNTSSB0aHJlc2hvbGQgMyAoZmllbGQpICg/KSAqLwogI2RlZmluZQlBUjVLX1BIWV9PRkRNX1NFTEZDT1JSX1JTU0lfMUFUSFJfRU4JMHgwMDAwODAwMAkvKiBFbmFibGUgMUEgUlNTSSB0aHJlc2hvbGQgKD8pICovCiAjZGVmaW5lCUFSNUtfUEhZX09GRE1fU0VMRkNPUlJfUlNTSV8xQVRIUgkweDAwMDEwMDAwCS8qIDFBIFJTU0kgdGhyZXNob2xkIChmaWVsZCkgKD8pICovCkBAIC0yMjEwLDcgKzIyNTcsNiBAQAogI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX0lOSV81MTExCTB4MDAwMDQ4ODMJLyogWzUyMTIrXSAqLwogI2RlZmluZQlBUjVLX1BIWV9QQVBEX1BST0JFX0lOSV81MTEyCTB4MDAwMDQ4ODIJLyogWzUyMTIrXSAqLwogCi0KIC8qCiAgKiBQSFkgVFggcmF0ZSBwb3dlciByZWdpc3RlcnMgWzUxMTIrXQogICovCkBAIC0yMjMyLDYgKzIyNzgsOCBAQAogI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVExfVFhfQ0xJUAkweDAwMDAwMDM4CS8qIE1hc2sgZm9yIHR4IGNsaXAgKD8pICovCiAjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9UWF9DTElQX1MJMwogI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVExfUFJFUF9DSElORk8JMHgwMDAxMDAwMAkvKiBQcmVwZW5kIGNoYW4gaW5mbyAqLworI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVExfRU1VCQkweDgwMDAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9FTVVfUwkzMQogLyotLS1bNTExMC81MTExXS0tLSovCiAjZGVmaW5lCUFSNUtfUEhZX0ZSQU1FX0NUTF9USU1JTkdfRVJSCTB4MDEwMDAwMDAJLyogUEhZIHRpbWluZyBlcnJvciAqLwogI2RlZmluZQlBUjVLX1BIWV9GUkFNRV9DVExfUEFSSVRZX0VSUgkweDAyMDAwMDAwCS8qIFBhcml0eSBlcnJvciAqLwpAQCAtMjI1MCw0OCArMjI5OCwzNiBAQAogICogUEhZIHJhZGFyIGRldGVjdGlvbiByZWdpc3RlciBbNTExMStdCiAgKi8KICNkZWZpbmUJQVI1S19QSFlfUkFEQVIJCQkweDk5NTQKLQotLyogUmFkYXIgZW5hYmxlIAkJCS4uLi4uLi4uIC4uLi4uLi4uIC4uLi4uLi4uIC4uLi4uLi4xICovCiAjZGVmaW5lCUFSNUtfUEhZX1JBREFSX0VOQUJMRQkJMHgwMDAwMDAwMQotI2RlZmluZQlBUjVLX1BIWV9SQURBUl9ESVNBQkxFICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUJQVI1S19QSFlfUkFEQVJfRU5BQkxFX1MJCTAKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgZm91bmQgb24gdGhlIGNhcmQgIC4xLjExMS4xIC4xLjEuLi4uIDExMS4uLi4xIDEuLi4xLi4uCi1hdCBwb3dlciBvbi4gKi8KLSNkZWZpbmUJQVI1S19QSFlfUkFEQVJfUFdPTkRFRl9BUjUyMTMJMHg1ZDUwZTE4OAotCi0vKiBUaGlzIGlzIHRoZSB2YWx1ZSBmb3VuZCBvbiB0aGUgY2FyZCAJLjEuMS4xMTEgLi4xMS4uLjEgLjEuLi4xLjEgMS4uLjExLjEKLWFmdGVyIERGUyBpcyBlbmFibGVkICovCi0jZGVmaW5lCUFSNUtfUEhZX1JBREFSX0VOQUJMRURfQVI1MjEzCTB4NTczMTQ1OGQKLQotLyogRmluaXRlIEltcHVsc2UgUmVzcG9uc2UgKEZJUikgZmlsdGVyIC4xMTExMTExIC4uLi4uLi4uIC4uLi4uLi4uIC4uLi4uLi4uCi0gKiBwb3dlciBvdXQgdGhyZXNob2xkLgotICogNy1iaXRzLCBzdGFuZGFyZCBwb3dlciByYW5nZSB7MC4uMTI3fSBpbiAxLzIgZEJtIHVuaXRzLiAqLwotI2RlZmluZSBBUjVLX1BIWV9SQURBUl9GSVJQV1JPVVRUSFIgICAgCTB4N2YwMDAwMDAKLSNkZWZpbmUgQVI1S19QSFlfUkFEQVJfRklSUFdST1VUVEhSX1MJMjQKLQotLyogUmFkYXIgUlNTSS9TTlIgdGhyZXNob2xkLgkJLi4uLi4uLi4gMTExMTExLi4gLi4uLi4uLi4gLi4uLi4uLi4KLSAqIDYtYml0cywgZEJtIHJhbmdlIHswLi42M30gaW4gZEJtIHVuaXRzLiAqLwotI2RlZmluZSBBUjVLX1BIWV9SQURBUl9SQURBUlJTU0lUSFIgICAgCTB4MDBmYzAwMDAKLSNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUkFEQVJSU1NJVEhSX1MJMTgKLQotLyogUHVsc2UgaGVpZ2h0IHRocmVzaG9sZCAJCS4uLi4uLi4uIC4uLi4uLjExIDExMTEuLi4uIC4uLi4uLi4uCi0gKiA2LWJpdHMsIGRCbSByYW5nZSB7MC4uNjN9IGluIGRCbSB1bml0cy4gKi8KLSNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUFVMU0VIRUlHSFRUSFIgICAweDAwMDNmMDAwCi0jZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BVTFNFSEVJR0hUVEhSX1MJMTIKLQotLyogUHVsc2UgUlNTSS9TTlIgdGhyZXNob2xkCQkuLi4uLi4uLiAuLi4uLi4uLiAuLi4uMTExMSAxMS4uLi4uLgotICogNi1iaXRzLCBkQm0gcmFuZ2UgezAuLjYzfSBpbiBkQm0gdW5pdHMuICovCi0jZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BVTFNFUlNTSVRIUiAgICAJMHgwMDAwMGZjMAotI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QVUxTRVJTU0lUSFJfUwk2Ci0KLS8qIEluYmFuZCB0aHJlc2hvbGQgIAkJCS4uLi4uLi4uIC4uLi4uLi4uIC4uLi4uLi4uIC4uMTExMTEuCi0gKiA1LWJpdHMsIHVuaXRzIHVua25vd24gezAuLjMxfSAoPyBNSHogPykgKi8KLSNkZWZpbmUgQVI1S19QSFlfUkFEQVJfSU5CQU5EVEhSICAgIAkweDAwMDAwMDNlCisjZGVmaW5lCUFSNUtfUEhZX1JBREFSX0RJU0FCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfSU5CQU5EVEhSICAgIAkweDAwMDAwMDNlCS8qIEluYmFuZCB0aHJlc2hvbGQKKwkJCQkJCQk1LWJpdHMsIHVuaXRzIHVua25vd24gezAuLjMxfQorCQkJCQkJCSg/IE1IeiA/KSAqLwogI2RlZmluZSBBUjVLX1BIWV9SQURBUl9JTkJBTkRUSFJfUwkxCiAKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUFJTU0lfVEhSICAgIAkweDAwMDAwZmMwCS8qIFB1bHNlIFJTU0kvU05SIHRocmVzaG9sZAorCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KKwkJCQkJCQlpbiBkQm0gdW5pdHMuICovCisjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1BSU1NJX1RIUl9TCTYKKworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QSEVJR0hUX1RIUiAgIAkweDAwMDNmMDAwCS8qIFB1bHNlIGhlaWdodCB0aHJlc2hvbGQKKwkJCQkJCQk2LWJpdHMsIGRCbSByYW5nZSB7MC4uNjN9CisJCQkJCQkJaW4gZEJtIHVuaXRzLiAqLworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9QSEVJR0hUX1RIUl9TCTEyCisKKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfUlNTSV9USFIgICAgCTB4MDBmYzAwMDAJLyogUmFkYXIgUlNTSS9TTlIgdGhyZXNob2xkLgorCQkJCQkJCTYtYml0cywgZEJtIHJhbmdlIHswLi42M30KKwkJCQkJCQlpbiBkQm0gdW5pdHMuICovCisjZGVmaW5lIEFSNUtfUEhZX1JBREFSX1JTU0lfVEhSX1MJMTgKKworI2RlZmluZSBBUjVLX1BIWV9SQURBUl9GSVJQV1JfVEhSCTB4N2YwMDAwMDAJLyogRmluaXRlIEltcHVsc2UgUmVzcG9uc2UKKwkJCQkJCQlmaWx0ZXIgcG93ZXIgb3V0IHRocmVzaG9sZC4KKwkJCQkJCQk3LWJpdHMsIHN0YW5kYXJkIHBvd2VyIHJhbmdlCisJCQkJCQkJezAuLjEyN30gaW4gMS8yIGRCbSB1bml0cy4gKi8KKyNkZWZpbmUgQVI1S19QSFlfUkFEQVJfRklSUFdSX1RIUlMJMjQKKwogLyoKLSAqIFBIWSBhbnRlbm5hIHN3aXRjaCB0YWJsZSByZWdpc3RlcnMgWzUxMTBdCisgKiBQSFkgYW50ZW5uYSBzd2l0Y2ggdGFibGUgcmVnaXN0ZXJzCiAgKi8KICNkZWZpbmUgQVI1S19QSFlfQU5UX1NXSVRDSF9UQUJMRV8wCTB4OTk2MAogI2RlZmluZSBBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzEJMHg5OTY0CkBAIC0yMzAyLDI1ICsyMzM4LDY1IEBACiAjZGVmaW5lIEFSNUtfUEhZX05GVEhSRVMJCTB4OTk2OAogCiAvKgotICogUEhZIGNsb2NrIHNsZWVwIHJlZ2lzdGVycyBbNTExMitdCisgKiBTaWdtYSBEZWx0YSByZWdpc3RlciAoPykgWzUyMTNdCiAgKi8KLSNkZWZpbmUgQVI1S19QSFlfU0NMT0NLCQkJMHg5OWYwCi0jZGVmaW5lIEFSNUtfUEhZX1NDTE9DS18zMk1IWgkJMHgwMDAwMDAwYwotI2RlZmluZSBBUjVLX1BIWV9TREVMQVkJCQkweDk5ZjQKLSNkZWZpbmUgQVI1S19QSFlfU0RFTEFZXzMyTUhaCQkweDAwMDAwMGZmCi0jZGVmaW5lIEFSNUtfUEhZX1NQRU5ESU5HCQkweDk5ZjgKLSNkZWZpbmUJQVI1S19QSFlfU1BFTkRJTkdfMTQJCTB4MDAwMDAwMTQKLSNkZWZpbmUJQVI1S19QSFlfU1BFTkRJTkdfMTgJCTB4MDAwMDAwMTgKLSNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkY1MTExCTB4MDAwMDAwMTgKLSNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkY1MTEyCTB4MDAwMDAwMTQKLS8qICNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkY1MTEyQQkweDAwMDAwMDBlICovCi0vKiAjZGVmaW5lIEFSNUtfUEhZX1NQRU5ESU5HX1JGNTQyNAkweDAwMDAwMDEyICovCi0jZGVmaW5lCUFSNUtfUEhZX1NQRU5ESU5HX1JGNTQxMwkweDAwMDAwMDE0Ci0jZGVmaW5lCUFSNUtfUEhZX1NQRU5ESU5HX1JGMjQxMwkweDAwMDAwMDE0Ci0jZGVmaW5lIEFSNUtfUEhZX1NQRU5ESU5HX1JGMjQyNQkweDAwMDAwMDE4CisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBCQkweDk5NkMKKyNkZWZpbmUgQVI1S19QSFlfU0lHTUFfREVMVEFfQURDX1NFTAkweDAwMDAwMDAzCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0FEQ19TRUxfUwkwCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0ZJTFQyCTB4MDAwMDAwZjgKKyNkZWZpbmUgQVI1S19QSFlfU0lHTUFfREVMVEFfRklMVDJfUwkzCisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0ZJTFQxCTB4MDAwMDFmMDAKKyNkZWZpbmUgQVI1S19QSFlfU0lHTUFfREVMVEFfRklMVDFfUwk4CisjZGVmaW5lIEFSNUtfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQCTB4MDFmZjMwMDAKKyNkZWZpbmUgQVI1S19QSFlfU0lHTUFfREVMVEFfQURDX0NMSVBfUwkxMwogCiAvKgotICogTWlzYyBQSFkvcmFkaW8gcmVnaXN0ZXJzIFs1MTEwIC0gNTExMV0KKyAqIFJGIHJlc3RhcnQgcmVnaXN0ZXIgWzUxMTIrXSAoPykKKyAqLworI2RlZmluZSBBUjVLX1BIWV9SRVNUQVJUCQkweDk5NzAJCS8qIHJlc3RhcnQgKi8KKyNkZWZpbmUgQVI1S19QSFlfUkVTVEFSVF9ESVZfR0MJCTB4MDAxYzAwMDAJLyogRmFzdCBkaXZlcnNpdHkgZ2NfbGltaXQgKD8pICovCisjZGVmaW5lIEFSNUtfUEhZX1JFU1RBUlRfRElWX0dDX1MJMTgKKworLyoKKyAqIFJGIEJ1cyBhY2Nlc3MgcmVxdWVzdCByZWdpc3RlciAoZm9yIHN5bnRoLW9seSBjaGFubmVsIHN3aXRjaGluZykKKyAqLworI2RlZmluZSBBUjVLX1BIWV9SRkJVU19SRVEJCTB4OTk3QworI2RlZmluZSBBUjVLX1BIWV9SRkJVU19SRVFfUkVRVUVTVAkweDAwMDAwMDAxCisKKy8qCisgKiBTcHVyIG1pdGlnYXRpb24gbWFza3MgKD8pCisgKi8KKyNkZWZpbmUgQVI1S19QSFlfVElNSU5HXzcJCTB4OTk4MAorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfOAkJMHg5OTg0CisjZGVmaW5lIEFSNUtfUEhZX1RJTUlOR184X1BJTE9UX01BU0tfMgkJMHgwMDBmZmZmZgorI2RlZmluZSBBUjVLX1BIWV9USU1JTkdfOF9QSUxPVF9NQVNLXzJfUwkwCisKKyNkZWZpbmUgQVI1S19QSFlfQklOX01BU0syXzEJCTB4OTk4OAorI2RlZmluZSBBUjVLX1BIWV9CSU5fTUFTSzJfMgkJMHg5OThjCisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl8zCQkweDk5OTAKKworI2RlZmluZSBBUjVLX1BIWV9CSU5fTUFTSzJfNAkJMHg5OTk0CisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl80X01BU0tfNAkweDAwMDAzZmZmCisjZGVmaW5lIEFSNUtfUEhZX0JJTl9NQVNLMl80X01BU0tfNF9TCTAKKworI2RlZmluZSBBUl9QSFlfVElNSU5HXzkJCQkweDk5OTgKKyNkZWZpbmUgQVJfUEhZX1RJTUlOR18xMAkJMHg5OTljCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfMTBfUElMT1RfTUFTS18yCTB4MDAwZmZmZmYKKyNkZWZpbmUgQVJfUEhZX1RJTUlOR18xMF9QSUxPVF9NQVNLXzJfUwkwCisKKy8qCisgKiBTcHVyIG1pdGlnYXRpb24gY29udHJvbAorICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfMTEJCQkweDk5YTAJCS8qIFJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR18xMV9TUFVSX0RFTFRBX1BIQVNFCTB4MDAwZmZmZmYJLyogU3B1ciBkZWx0YSBwaGFzZSAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HXzExX1NQVVJfREVMVEFfUEhBU0VfUwkwCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfMTFfU1BVUl9GUkVRX1NECQkweDNmZjAwMDAwCS8qIEZyZXEgc2lnbWEgZGVsdGEgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR18xMV9TUFVSX0ZSRVFfU0RfUwkyMAorI2RlZmluZSBBUl9QSFlfVElNSU5HXzExX1VTRV9TUFVSX0lOX0FHQwkweDQwMDAwMDAwCS8qIFNwdXIgZmlsdGVyIGluIEFHQyBkZXRlY3RvciAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HXzExX1VTRV9TUFVSX0lOX1NFTEZDT1IJMHg4MDAwMDAwMAkvKiBTcHVyIGZpbHRlciBpbiBPRkRNIHNlbGYgY29ycmVsYXRvciAqLworCisvKgorICogR2FpbiB0YWJsZXMKICAqLwogI2RlZmluZQlBUjVLX0JCX0dBSU5fQkFTRQkJMHg5YjAwCS8qIEJhc2VCYW5kIEFtcGxpZmllciBHYWluIHRhYmxlIGJhc2UgYWRkcmVzcyAqLwogI2RlZmluZSBBUjVLX0JCX0dBSU4oX24pCQkoQVI1S19CQl9HQUlOX0JBU0UgKyAoKF9uKSA8PCAyKSkKQEAgLTIzNDAsOSArMjQxNiwxMCBAQAogI2RlZmluZQlBUjVLX1BIWV9DVVJSRU5UX1JTU0kJMHg5YzFjCiAKIC8qCi0gKiBQSFkgUkYgQnVzIGdyYW50IHJlZ2lzdGVyICg/KQorICogUEhZIFJGIEJ1cyBncmFudCByZWdpc3RlcgogICovCiAjZGVmaW5lCUFSNUtfUEhZX1JGQlVTX0dSQU5UCTB4OWMyMAorI2RlZmluZQlBUjVLX1BIWV9SRkJVU19HUkFOVF9PSwkweDAwMDAwMDAxCiAKIC8qCiAgKiBQSFkgQURDIHRlc3QgcmVnaXN0ZXIKQEAgLTIzODYsNiArMjQ2MywzMSBAQAogI2RlZmluZQlBUjVLX1BIWV9DSEFOX1NUQVRVU19SWF9DTFJfUEFQCTB4MDAwMDAwMDgKIAogLyoKKyAqIEhlYXZ5IGNsaXAgZW5hYmxlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJQVI1S19QSFlfSEVBVllfQ0xJUF9FTkFCTEUJMHg5OWUwCisKKy8qCisgKiBQSFkgY2xvY2sgc2xlZXAgcmVnaXN0ZXJzIFs1MTEyK10KKyAqLworI2RlZmluZSBBUjVLX1BIWV9TQ0xPQ0sJCQkweDk5ZjAKKyNkZWZpbmUgQVI1S19QSFlfU0NMT0NLXzMyTUhaCQkweDAwMDAwMDBjCisjZGVmaW5lIEFSNUtfUEhZX1NERUxBWQkJCTB4OTlmNAorI2RlZmluZSBBUjVLX1BIWV9TREVMQVlfMzJNSFoJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkcJCTB4OTlmOAorI2RlZmluZSBBUjVLX1BIWV9TUEVORElOR18xNAkJMHgwMDAwMDAxNAorI2RlZmluZSBBUjVLX1BIWV9TUEVORElOR18xOAkJMHgwMDAwMDAxOAorI2RlZmluZSBBUjVLX1BIWV9TUEVORElOR19SRjUxMTEJMHgwMDAwMDAxOAorI2RlZmluZSBBUjVLX1BIWV9TUEVORElOR19SRjUxMTIJMHgwMDAwMDAxNAorLyogI2RlZmluZSBBUjVLX1BIWV9TUEVORElOR19SRjUxMTJBCTB4MDAwMDAwMGUgKi8KKy8qICNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkY1NDI0CTB4MDAwMDAwMTIgKi8KKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkY1NDEzCTB4MDAwMDAwMTgKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkYyNDEzCTB4MDAwMDAwMTgKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkYyMzE2CTB4MDAwMDAwMTgKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkYyMzE3CTB4MDAwMDAwMTgKKyNkZWZpbmUgQVI1S19QSFlfU1BFTkRJTkdfUkYyNDI1CTB4MDAwMDAwMTQKKworLyoKICAqIFBIWSBQQVBEIEkgKHBvd2VyPykgdGFibGUgKD8pCiAgKiAoOTIhIGVudHJpZXMpCiAgKi8KQEAgLTI0MzYsMTAgKzI1MzgsNDcgQEAKICNkZWZpbmUgQVI1S19QSFlfQ0NLX0NST1NTQ09SUl9XRUFLX1NJR19USFIJMHgwMDAwMDAwZgogI2RlZmluZSBBUjVLX1BIWV9DQ0tfQ1JPU1NDT1JSX1dFQUtfU0lHX1RIUl9TCTAKIAorLyogU2FtZSBhZGRyZXNzIGlzIHVzZWQgZm9yIGFudGVubmEgZGl2ZXJzaXR5IGFjdGl2YXRpb24gKi8KKyNkZWZpbmUJQVI1S19QSFlfRkFTVF9BTlRfRElWCQkweGEyMDgKKyNkZWZpbmUJQVI1S19QSFlfRkFTVF9BTlRfRElWX0VOCTB4MDAwMDIwMDAKKwogLyoKICAqIFBIWSAyR0h6IGdhaW4gcmVnaXN0ZXIgWzUxMTErXQogICovCi0jZGVmaW5lCUFSNUtfUEhZX0dBSU5fMkdIWgkJMHhhMjBjCi0jZGVmaW5lCUFSNUtfUEhZX0dBSU5fMkdIWl9NQVJHSU5fVFhSWAkweDAwZmMwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0dBSU5fMkdIWgkJCTB4YTIwYworI2RlZmluZQlBUjVLX1BIWV9HQUlOXzJHSFpfTUFSR0lOX1RYUlgJCTB4MDBmYzAwMDAKICNkZWZpbmUJQVI1S19QSFlfR0FJTl8yR0haX01BUkdJTl9UWFJYX1MJMTgKLSNkZWZpbmUJQVI1S19QSFlfR0FJTl8yR0haX0lOSV81MTExCTB4NjQ4MDQxNmMKKyNkZWZpbmUJQVI1S19QSFlfR0FJTl8yR0haX0lOSV81MTExCQkweDY0ODA0MTZjCisKKyNkZWZpbmUJQVI1S19QSFlfQ0NLX1JYX0NUTF80CQkJMHhhMjFjCisjZGVmaW5lCUFSNUtfUEhZX0NDS19SWF9DVExfNF9GUkVRX0VTVF9TSE9SVAkweDAxZjgwMDAwCisjZGVmaW5lCUFSNUtfUEhZX0NDS19SWF9DVExfNF9GUkVRX0VTVF9TSE9SVF9TCTE5CisKKyNkZWZpbmUJQVI1S19QSFlfREFHX0NDS19DVEwJCQkweGEyMjgKKyNkZWZpbmUJQVI1S19QSFlfREFHX0NDS19DVExfRU5fUlNTSV9USFIJMHgwMDAwMDIwMAorI2RlZmluZQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9SU1NJX1RIUgkJMHgwMDAxZmMwMAorI2RlZmluZQlBUjVLX1BIWV9EQUdfQ0NLX0NUTF9SU1NJX1RIUl9TCQkxMAorCisjZGVmaW5lCUFSNUtfUEhZX0ZBU1RfQURDCTB4YTI0YworCisjZGVmaW5lCUFSNUtfUEhZX0JMVUVUT09USAkweGEyNTQKKworLyoKKyAqIFRyYW5zbWl0IFBvd2VyIENvbnRyb2wgcmVnaXN0ZXIKKyAqIFsyNDEzK10KKyAqLworI2RlZmluZQlBUjVLX1BIWV9UUENfUkcxCQkweGEyNTgKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHMV9OVU1fUERfR0FJTgkweDAwMDBjMDAwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzFfTlVNX1BEX0dBSU5fUwkxNAorCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzUJCQkweGEyNkMKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX09WRVJMQVAJMHgwMDAwMDAwRgorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fT1ZFUkxBUF9TCTAKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzEJMHgwMDAwMDNGMAorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMV9TCTQKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzIJMHgwMDAwRkMwMAorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfMl9TCTEwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzVfUERfR0FJTl9CT1VOREFSWV8zCTB4MDAzRjAwMDAKKyNkZWZpbmUJQVI1S19QSFlfVFBDX1JHNV9QRF9HQUlOX0JPVU5EQVJZXzNfUwkxNgorI2RlZmluZQlBUjVLX1BIWV9UUENfUkc1X1BEX0dBSU5fQk9VTkRBUllfNAkweDBGQzAwMDAwCisjZGVmaW5lCUFSNUtfUEhZX1RQQ19SRzVfUERfR0FJTl9CT1VOREFSWV80X1MJMjIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3Jlc2V0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTg4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9yZXNldC5jCkBAIC0wLDAgKzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmV5ayBGbG9ldGVyIDxyZXlrQG9wZW5ic2Qub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggTmljayBLb3NzaWZpZGlzIDxtaWNrZmxlbW1AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTHVpcyBSb2RyaWd1ZXogPG1jZ3JvZkB3aW5sYWIucnV0Z2Vycy5lZHU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmlyaSBTbGFieSA8amlyaXNsYWJ5QGdtYWlsLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2RlZmluZSBfQVRINUtfUkVTRVQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICBSZXNldCBmdW5jdGlvbnMgYW5kIGhlbHBlcnMKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgImF0aDVrLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiYmFzZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qKgorICogYXRoNWtfaHdfd3JpdGVfb2ZkbV90aW1pbmdzIC0gc2V0IE9GRE0gdGltaW5ncyBvbiBBUjUyMTIKKyAqCisgKiBAYWg6IHRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogdGhlIGN1cnJlbnRseSBzZXQgY2hhbm5lbCB1cG9uIHJlc2V0CisgKgorICogV3JpdGUgdGhlIE9GRE0gdGltaW5ncyBmb3IgdGhlIEFSNTIxMiB1cG9uIHJlc2V0LiBUaGlzIGlzIGEgaGVscGVyIGZvcgorICogYXRoNWtfaHdfcmVzZXQoKS4gVGhpcyBzZWVtcyB0byB0dW5lIHRoZSBQTEwgYSBzcGVjaWZpZWQgZnJlcXVlbmN5CisgKiBkZXBlbmRpbmcgb24gdGhlIGJhbmR3aWR0aCBvZiB0aGUgY2hhbm5lbC4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwkvKiBHZXQgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGFuZCBzZXQgaXQgKi8KKwl1MzIgY29lZl9zY2FsZWQsIGNvZWZfZXhwLCBjb2VmX21hbiwKKwkJZHNfY29lZl9leHAsIGRzX2NvZWZfbWFuLCBjbG9jazsKKworCWlmICghKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyKSB8fAorCQkhKGNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSkKKwkJQlVHKCk7CisKKwkvKiBTZWVtcyB0aGVyZSBhcmUgdHdvIFBMTHMsIG9uZSBmb3IgYmFzZWJhbmQgc2FtcGxpbmcgYW5kIG9uZQorCSAqIGZvciB0dW5pbmcuIFR1bmluZyBiYXNlYmFuZHMgYXJlIDQwIE1IeiBvciA4ME1IeiB3aGVuIGluCisJICogdHVyYm8uICovCisJY2xvY2sgPSBjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfVFVSQk8gPyA4MCA6IDQwOworCWNvZWZfc2NhbGVkID0gKCg1ICogKGNsb2NrIDw8IDI0KSkgLyAyKSAvCisJY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisKKwlmb3IgKGNvZWZfZXhwID0gMzE7IGNvZWZfZXhwID4gMDsgY29lZl9leHAtLSkKKwkJaWYgKChjb2VmX3NjYWxlZCA+PiBjb2VmX2V4cCkgJiAweDEpCisJCQlicmVhazsKKworCWlmICghY29lZl9leHApCisJCXJldHVybiAtRUlOVkFMOworCisJY29lZl9leHAgPSAxNCAtIChjb2VmX2V4cCAtIDI0KTsKKwljb2VmX21hbiA9IGNvZWZfc2NhbGVkICsKKwkJKDEgPDwgKDI0IC0gY29lZl9leHAgLSAxKSk7CisJZHNfY29lZl9tYW4gPSBjb2VmX21hbiA+PiAoMjQgLSBjb2VmX2V4cCk7CisJZHNfY29lZl9leHAgPSBjb2VmX2V4cCAtIDE2OworCisJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19QSFlfVElNSU5HXzMsCisJCUFSNUtfUEhZX1RJTUlOR18zX0RTQ19NQU4sIGRzX2NvZWZfbWFuKTsKKwlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9USU1JTkdfMywKKwkJQVI1S19QSFlfVElNSU5HXzNfRFNDX0VYUCwgZHNfY29lZl9leHApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIGluZGV4IGludG8gcmF0ZXMgZm9yIGNvbnRyb2wgcmF0ZXMsIHdlIGNhbiBzZXQgaXQgdXAgbGlrZSB0aGlzIGJlY2F1c2UKKyAqIHRoaXMgaXMgb25seSB1c2VkIGZvciBBUjUyMTIgYW5kIHdlIGtub3cgaXQgc3VwcG9ydHMgRyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgY29udHJvbF9yYXRlc1tdID0KKwl7IDAsIDEsIDEsIDEsIDQsIDQsIDYsIDYsIDgsIDgsIDgsIDggfTsKKworLyoqCisgKiBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uIC0gc2V0IHJhdGUgZHVyYXRpb24gZHVyaW5nIGh3IHJlc2V0cworICoKKyAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtb2RlOiBvbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICoKKyAqIFdyaXRlIHRoZSByYXRlIGR1cmF0aW9uIHRhYmxlIHVwb24gaHcgcmVzZXQuIFRoaXMgaXMgYSBoZWxwZXIgZm9yCisgKiBhdGg1a19od19yZXNldCgpLiBJdCBzZWVtcyBhbGwgdGhpcyBpcyBkb2luZyBpcyBzZXR0aW5nIGFuIEFDSyB0aW1lb3V0IGZvcgorICogdGhlIGhhcmR3YXJlIGZvciB0aGUgY3VycmVudCBtb2RlIGZvciBlYWNoIHJhdGUuIFRoZSByYXRlcyB3aGljaCBhcmUgY2FwYWJsZQorICogb2Ygc2hvcnQgcHJlYW1ibGUgKDgwMi4xMWIgcmF0ZXMgMk1icHMsIDUuNU1icHMsIGFuZCAxMU1icHMpIGhhdmUgYW5vdGhlcgorICogcmVnaXN0ZXIgZm9yIHRoZSBzaG9ydCBwcmVhbWJsZSBBQ0sgdGltZW91dCBjYWxjdWxhdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCwKKyAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXRoNWtfc29mdGMgKnNjID0gYWgtPmFoX3NjOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFdyaXRlIHJhdGUgZHVyYXRpb24gdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2MtPnNiYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2JpdHJhdGVzOyBpKyspIHsKKwkJdTMyIHJlZzsKKwkJdTE2IHR4X3RpbWU7CisKKwkJcmF0ZSA9ICZzYy0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmJpdHJhdGVzW2NvbnRyb2xfcmF0ZXNbaV1dOworCisJCS8qIFNldCBBQ0sgdGltZW91dCAqLworCQlyZWcgPSBBUjVLX1JBVEVfRFVSKHJhdGUtPmh3X3ZhbHVlKTsKKworCQkvKiBBbiBBQ0sgZnJhbWUgY29uc2lzdHMgb2YgMTAgYnl0ZXMuIElmIHlvdSBhZGQgdGhlIEZDUywKKwkJICogd2hpY2ggaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRpb24oKSBhZGRzLAorCQkgKiBpdHMgMTQgYnl0ZXMuIE5vdGUgd2UgdXNlIHRoZSBjb250cm9sIHJhdGUgYW5kIG5vdCB0aGUKKwkJICogYWN0dWFsIHJhdGUgZm9yIHRoaXMgcmF0ZS4gU2VlIG1hYzgwMjExIHR4LmMKKwkJICogaWVlZTgwMjExX2R1cmF0aW9uKCkgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YKKwkJICogd2hhdCByYXRlIHdlIHNob3VsZCBjaG9vc2UgdG8gVFggQUNLcy4gKi8KKwkJdHhfdGltZSA9IGxlMTZfdG9fY3B1KGllZWU4MDIxMV9nZW5lcmljX2ZyYW1lX2R1cmF0aW9uKHNjLT5odywKKwkJCQkJCQlzYy0+dmlmLCAxMCwgcmF0ZSkpOworCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHhfdGltZSwgcmVnKTsKKworCQlpZiAoIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlJ3JlIG5vdCBkaXN0aW5ndWlzaGluZyBzaG9ydCBwcmVhbWJsZSBoZXJlLAorCQkgKiBUaGlzIGlzIHRydWUsIGFsbCB3ZSdsbCBnZXQgaXMgYSBsb25nZXIgdmFsdWUgaGVyZQorCQkgKiB3aGljaCBpcyBub3QgbmVjZXNzYXJpbGx5IGJhZC4gV2UgY291bGQgdXNlCisJCSAqIGV4cG9ydCBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24oKSBidXQgdGhhdCBuZWVkcyB0byBiZQorCQkgKiBmaXhlZCBmaXJzdCB0byBiZSBwcm9wZXJseSB1c2VkIGJ5IG1hYzgwMjExMSBkcml2ZXJzOgorCQkgKgorCQkgKiAgLSByZW1vdmUgZXJwIHN0dWZmIGFuZCBsZXQgdGhlIHJvdXRpbmUgZmlndXJlIG9mZG0KKwkJICogICAgZXJwIHJhdGVzCisJCSAqICAtIHJlbW92ZSBwYXNzaW5nIGFyZ3VtZW50IGllZWU4MDIxMV9sb2NhbCBhcworCQkgKiAgICBkcml2ZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIGl0CisJCSAqICAtIG1vdmUgZHJpdmVycyB1c2luZyBpZWVlODAyMTFfZ2VuZXJpY19mcmFtZV9kdXJhdGlvbigpCisJCSAqICAgIHRvIHRoaXMKKwkJICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHhfdGltZSwKKwkJCXJlZyArIChBUjVLX1NFVF9TSE9SVF9QUkVBTUJMRSA8PCAyKSk7CisJfQorfQorCisvKgorICogUmVzZXQgY2hpcHNldAorICovCitzdGF0aWMgaW50IGF0aDVrX2h3X25pY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgdmFsKQoreworCWludCByZXQ7CisJdTMyIG1hc2sgPSB2YWwgPyB2YWwgOiB+MFU7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJLyogUmVhZC1hbmQtY2xlYXIgUlggRGVzY3JpcHRvciBQb2ludGVyKi8KKwlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SWERQKTsKKworCS8qCisJICogUmVzZXQgdGhlIGRldmljZSBhbmQgd2FpdCB1bnRpbCBzdWNjZXNzCisJICovCisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YWwsIEFSNUtfUkVTRVRfQ1RMKTsKKworCS8qIFdhaXQgYXQgbGVhc3QgMTI4IFBDSSBjbG9ja3MgKi8KKwl1ZGVsYXkoMTUpOworCisJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7CisJCXZhbCAmPSBBUjVLX1JFU0VUX0NUTF9QQ1UgfCBBUjVLX1JFU0VUX0NUTF9ETUEKKwkJCXwgQVI1S19SRVNFVF9DVExfTUFDIHwgQVI1S19SRVNFVF9DVExfUEhZOworCQltYXNrICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0RNQQorCQkJfCBBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9QSFk7CisJfSBlbHNlIHsKKwkJdmFsICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EOworCQltYXNrICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EOworCX0KKworCXJldCA9IGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoYWgsIEFSNUtfUkVTRVRfQ1RMLCBtYXNrLCB2YWwsIGZhbHNlKTsKKworCS8qCisJICogUmVzZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciAoZm9yIGh3IGJ5dGUtc3dhcCkuIE5vdGUgdGhhdCB0aGlzCisJICogaXMgb25seSBzZXQgZm9yIGJpZyBlbmRpYW4uIFdlIGRvIHRoZSBuZWNlc3NhcnkgbWFnaWMgaW4KKwkgKiBBUjVLX0lOSVRfQ0ZHLgorCSAqLworCWlmICgodmFsICYgQVI1S19SRVNFVF9DVExfUENVKSA9PSAwKQorCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfSU5JVF9DRkcsIEFSNUtfQ0ZHKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTbGVlcCBjb250cm9sCisgKi8KK2ludCBhdGg1a19od19zZXRfcG93ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19wb3dlcl9tb2RlIG1vZGUsCisJCWJvb2wgc2V0X2NoaXAsIHUxNiBzbGVlcF9kdXJhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgc3RhaWQsIGRhdGE7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCXN0YWlkID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU1RBX0lEMSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFSNUtfUE1fQVVUTzoKKwkJc3RhaWQgJj0gfkFSNUtfU1RBX0lEMV9ERUZBVUxUX0FOVEVOTkE7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBBUjVLX1BNX05FVFdPUktfU0xFRVA6CisJCWlmIChzZXRfY2hpcCkKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJCQlBUjVLX1NMRUVQX0NUTF9TTEVfQUxMT1cgfAorCQkJCXNsZWVwX2R1cmF0aW9uLAorCQkJCUFSNUtfU0xFRVBfQ1RMKTsKKworCQlzdGFpZCB8PSBBUjVLX1NUQV9JRDFfUFdSX1NWOworCQlicmVhazsKKworCWNhc2UgQVI1S19QTV9GVUxMX1NMRUVQOgorCQlpZiAoc2V0X2NoaXApCisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfU0xFRVBfQ1RMX1NMRV9TTFAsCisJCQkJQVI1S19TTEVFUF9DVEwpOworCisJCXN0YWlkIHw9IEFSNUtfU1RBX0lEMV9QV1JfU1Y7CisJCWJyZWFrOworCisJY2FzZSBBUjVLX1BNX0FXQUtFOgorCisJCXN0YWlkICY9IH5BUjVLX1NUQV9JRDFfUFdSX1NWOworCisJCWlmICghc2V0X2NoaXApCisJCQlnb3RvIGNvbW1pdDsKKworCQkvKiBQcmVzZXJ2ZSBzbGVlcCBkdXJhdGlvbiAqLworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0xFRVBfQ1RMKTsKKwkJaWYgKGRhdGEgJiAweGZmYzAwMDAwKQorCQkJZGF0YSA9IDA7CisJCWVsc2UKKwkJCWRhdGEgPSBkYXRhICYgMHhmZmZjZmZmZjsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfU0xFRVBfQ1RMKTsKKwkJdWRlbGF5KDE1KTsKKworCQlmb3IgKGkgPSA1MDsgaSA+IDA7IGktLSkgeworCQkJLyogQ2hlY2sgaWYgdGhlIGNoaXAgZGlkIHdha2UgdXAgKi8KKwkJCWlmICgoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUENJQ0ZHKSAmCisJCQkJCUFSNUtfUENJQ0ZHX1NQV1JfRE4pID09IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIFdhaXQgYSBiaXQgYW5kIHJldHJ5ICovCisJCQl1ZGVsYXkoMjAwKTsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19TTEVFUF9DVEwpOworCQl9CisKKwkJLyogRmFpbCBpZiB0aGUgY2hpcCBkaWRuJ3Qgd2FrZSB1cCAqLworCQlpZiAoaSA8PSAwKQorCQkJcmV0dXJuIC1FSU87CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK2NvbW1pdDoKKwlhaC0+YWhfcG93ZXJfbW9kZSA9IG1vZGU7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzdGFpZCwgQVI1S19TVEFfSUQxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQnJpbmcgdXAgTUFDICsgUEhZIENoaXBzCisgKi8KK2ludCBhdGg1a19od19uaWNfd2FrZXVwKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBmbGFncywgYm9vbCBpbml0aWFsKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPmFoX3NjLT5wZGV2OworCXUzMiB0dXJibywgbW9kZSwgY2xvY2ssIGJ1c19mbGFnczsKKwlpbnQgcmV0OworCisJdHVyYm8gPSAwOworCW1vZGUgPSAwOworCWNsb2NrID0gMDsKKworCUFUSDVLX1RSQUNFKGFoLT5haF9zYyk7CisKKwkvKiBXYWtldXAgdGhlIGRldmljZSAqLworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcihhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CisJaWYgKHJldCkgeworCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiZmFpbGVkIHRvIHdha2V1cCB0aGUgTUFDIENoaXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQkvKgorCQkgKiBHZXQgY2hhbm5lbCBtb2RlIGZsYWdzCisJCSAqLworCisJCWlmIChhaC0+YWhfcmFkaW8gPj0gQVI1S19SRjUxMTIpIHsKKwkJCW1vZGUgPSBBUjVLX1BIWV9NT0RFX1JBRF9SRjUxMTI7CisJCQljbG9jayA9IEFSNUtfUEhZX1BMTF9SRjUxMTI7CisJCX0gZWxzZSB7CisJCQltb2RlID0gQVI1S19QSFlfTU9ERV9SQURfUkY1MTExOwkvKlplcm8qLworCQkJY2xvY2sgPSBBUjVLX1BIWV9QTExfUkY1MTExOwkJLypaZXJvKi8KKwkJfQorCisJCWlmIChmbGFncyAmIENIQU5ORUxfMkdIWikgeworCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX0ZSRVFfMkdIWjsKKwkJCWNsb2NrIHw9IEFSNUtfUEhZX1BMTF80NE1IWjsKKworCQkJaWYgKGZsYWdzICYgQ0hBTk5FTF9DQ0spIHsKKwkJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfTU9EX0NDSzsKKwkJCX0gZWxzZSBpZiAoZmxhZ3MgJiBDSEFOTkVMX09GRE0pIHsKKwkJCQkvKiBYWFggRHluYW1pYyBPRkRNL0NDSyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorCQkJCSAqIEFSNTIxMSBzbyB3ZSBzZXQgTU9EX09GRE0gZm9yIHBsYWluIGcgKG5vCisJCQkJICogQ0NLIGhlYWRlcnMpIG9wZXJhdGlvbi4gV2UgbmVlZCB0byB0ZXN0CisJCQkJICogdGhpcywgNTIxMSBtaWdodCBzdXBwb3J0IG9mZG0tb25seSBnIGFmdGVyCisJCQkJICogYWxsLCB0aGVyZSBhcmUgYWxzbyBpbml0aWFsIHJlZ2lzdGVyIHZhbHVlcworCQkJCSAqIGluIHRoZSBjb2RlIGZvciBnIG1vZGUgKHNlZSBpbml0dmFscy5jKS4gKi8KKwkJCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTEpCisJCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfT0ZETTsKKwkJCQllbHNlCisJCQkJCW1vZGUgfD0gQVI1S19QSFlfTU9ERV9NT0RfRFlOOworCQkJfSBlbHNlIHsKKwkJCQlBVEg1S19FUlIoYWgtPmFoX3NjLAorCQkJCQkiaW52YWxpZCByYWRpbyBtb2R1bGF0aW9uIG1vZGVcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgaWYgKGZsYWdzICYgQ0hBTk5FTF81R0haKSB7CisJCQltb2RlIHw9IEFSNUtfUEhZX01PREVfRlJFUV81R0haOworCQkJY2xvY2sgfD0gQVI1S19QSFlfUExMXzQwTUhaOworCisJCQlpZiAoZmxhZ3MgJiBDSEFOTkVMX09GRE0pCisJCQkJbW9kZSB8PSBBUjVLX1BIWV9NT0RFX01PRF9PRkRNOworCQkJZWxzZSB7CisJCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCQkJImludmFsaWQgcmFkaW8gbW9kdWxhdGlvbiBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJpbnZhbGlkIHJhZGlvIGZyZXF1ZW5jeSBtb2RlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGZsYWdzICYgQ0hBTk5FTF9UVVJCTykKKwkJCXR1cmJvID0gQVI1S19QSFlfVFVSQk9fTU9ERSB8IEFSNUtfUEhZX1RVUkJPX1NIT1JUOworCX0gZWxzZSB7IC8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKworCQkvKiAuLi5lbmFibGUgQXRoZXJvcyB0dXJibyBtb2RlIGlmIHJlcXVlc3RlZCAqLworCQlpZiAoZmxhZ3MgJiBDSEFOTkVMX1RVUkJPKQorCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9UVVJCT19NT0RFLAorCQkJCQlBUjVLX1BIWV9UVVJCTyk7CisJfQorCisJLyogcmVzZXRpbmcgUENJIG9uIFBDSS1FIGNhcmRzIHJlc3VsdHMgY2FyZCB0byBoYW5nCisJICogYW5kIGFsd2F5cyByZXR1cm4gMHhmZmZmLi4uIHNvIHdlIGluZ29yZSB0aGF0IGZsYWcKKwkgKiBmb3IgUENJLUUgY2FyZHMgKi8KKwlidXNfZmxhZ3MgPSAocGRldi0+aXNfcGNpZSkgPyAwIDogQVI1S19SRVNFVF9DVExfUENJOworCisJLyogUmVzZXQgY2hpcHNldCAqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgeworCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CisJCQlBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9ETUEgfAorCQkJQVI1S19SRVNFVF9DVExfUEhZIHwgQVI1S19SRVNFVF9DVExfUENJKTsKKwkJCW1kZWxheSgyKTsKKwl9IGVsc2UgeworCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CisJCQlBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCB8IGJ1c19mbGFncyk7CisJfQorCWlmIChyZXQpIHsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byByZXNldCB0aGUgTUFDIENoaXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiAuLi53YWtldXAgYWdhaW4hKi8KKwlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCWlmIChyZXQpIHsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byByZXN1bWUgdGhlIE1BQyBDaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiAuLi5maW5hbCB3YXJtIHJlc2V0ICovCisJaWYgKGF0aDVrX2h3X25pY19yZXNldChhaCwgMCkpIHsKKwkJQVRINUtfRVJSKGFoLT5haF9zYywgImZhaWxlZCB0byB3YXJtIHJlc2V0IHRoZSBNQUMgQ2hpcFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQkvKiAuLi5zZXQgdGhlIFBIWSBvcGVyYXRpbmcgbW9kZSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGNsb2NrLCBBUjVLX1BIWV9QTEwpOworCQl1ZGVsYXkoMzAwKTsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIG1vZGUsIEFSNUtfUEhZX01PREUpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHR1cmJvLCBBUjVLX1BIWV9UVVJCTyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWluIHJlc2V0IGZ1bmN0aW9uCisgKi8KK2ludCBhdGg1a19od19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUsCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGNoYW5nZV9jaGFubmVsKQoreworCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPmFoX3NjLT5wZGV2OworCXUzMiBkYXRhLCBzX3NlcSwgc19hbnQsIHNfbGVkWzNdLCBkbWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaSwgbW9kZSwgZnJlcSwgZWVfbW9kZSwgYW50WzJdOworCWludCByZXQ7CisKKwlBVEg1S19UUkFDRShhaC0+YWhfc2MpOworCisJc19zZXEgPSAwOworCXNfYW50ID0gMDsKKwllZV9tb2RlID0gMDsKKwlmcmVxID0gMDsKKwltb2RlID0gMDsKKworCS8qCisJICogU2F2ZSBzb21lIHJlZ2lzdGVycyBiZWZvcmUgYSByZXNldAorCSAqLworCS8qRENVL0FudGVubmEgc2VsZWN0aW9uIG5vdCBhdmFpbGFibGUgb24gNTIxMCovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCWlmIChjaGFuZ2VfY2hhbm5lbCkgeworCQkJLyogU2VxIG51bWJlciBmb3IgcXVldWUgMCAtZG8gdGhpcyBmb3IgYWxsIHF1ZXVlcyA/ICovCisJCQlzX3NlcSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLAorCQkJCQlBUjVLX1FVRVVFX0RGU19TRVFOVU0oMCkpOworCQkJLypEZWZhdWx0IGFudGVubmEqLworCQkJc19hbnQgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19ERUZBVUxUX0FOVEVOTkEpOworCQl9CisJfQorCisJLypHUElPcyovCisJc19sZWRbMF0gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QQ0lDRkcpICYgQVI1S19QQ0lDRkdfTEVEU1RBVEU7CisJc19sZWRbMV0gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19HUElPQ1IpOworCXNfbGVkWzJdID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfR1BJT0RPKTsKKworCWlmIChjaGFuZ2VfY2hhbm5lbCAmJiBhaC0+YWhfcmZfYmFua3MgIT0gTlVMTCkKKwkJYXRoNWtfaHdfZ2V0X3JmX2dhaW4oYWgpOworCisKKwkvKldha2V1cCB0aGUgZGV2aWNlKi8KKwlyZXQgPSBhdGg1a19od19uaWNfd2FrZXVwKGFoLCBjaGFubmVsLT5od192YWx1ZSwgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgb3BlcmF0aW5nIG1vZGUKKwkgKi8KKwlhaC0+YWhfb3BfbW9kZSA9IG9wX21vZGU7CisKKwkvKgorCSAqIDUxMTEvNTExMiBTZXR0aW5ncworCSAqIDUyMTAgb25seSBjb21lcyB3aXRoIFJGNTExMAorCSAqLworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQlpZiAoYWgtPmFoX3JhZGlvICE9IEFSNUtfUkY1MTExICYmCisJCQlhaC0+YWhfcmFkaW8gIT0gQVI1S19SRjUxMTIgJiYKKwkJCWFoLT5haF9yYWRpbyAhPSBBUjVLX1JGNTQxMyAmJgorCQkJYWgtPmFoX3JhZGlvICE9IEFSNUtfUkYyNDEzICYmCisJCQlhaC0+YWhfcmFkaW8gIT0gQVI1S19SRjI0MjUpIHsKKwkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCisJCQkJImludmFsaWQgcGh5IHJhZGlvOiAldVxuIiwgYWgtPmFoX3JhZGlvKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3dpdGNoIChjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfTU9ERVMpIHsKKwkJY2FzZSBDSEFOTkVMX0E6CisJCQltb2RlID0gQVI1S19NT0RFXzExQTsKKwkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQljYXNlIENIQU5ORUxfRzoKKwkJCW1vZGUgPSBBUjVLX01PREVfMTFHOworCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl8yR0haOworCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTk5FTF9COgorCQkJbW9kZSA9IEFSNUtfTU9ERV8xMUI7CisJCQlmcmVxID0gQVI1S19JTklfUkZHQUlOXzJHSFo7CisJCQllZV9tb2RlID0gQVI1S19FRVBST01fTU9ERV8xMUI7CisJCQlicmVhazsKKwkJY2FzZSBDSEFOTkVMX1Q6CisJCQltb2RlID0gQVI1S19NT0RFXzExQV9UVVJCTzsKKwkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQkvKklzIHRoaXMgb2sgb24gNTIxMSB0b28gPyovCisJCWNhc2UgQ0hBTk5FTF9URzoKKwkJCW1vZGUgPSBBUjVLX01PREVfMTFHX1RVUkJPOworCQkJZnJlcSA9IEFSNUtfSU5JX1JGR0FJTl8yR0haOworCQkJZWVfbW9kZSA9IEFSNUtfRUVQUk9NX01PREVfMTFHOworCQkJYnJlYWs7CisJCWNhc2UgQ0hBTk5FTF9YUjoKKwkJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMSkgeworCQkJCUFUSDVLX0VSUihhaC0+YWhfc2MsCisJCQkJCSJYUiBtb2RlIG5vdCBhdmFpbGFibGUgb24gNTIxMSIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbW9kZSA9IEFSNUtfTU9ERV9YUjsKKwkJCWZyZXEgPSBBUjVLX0lOSV9SRkdBSU5fNUdIWjsKKwkJCWVlX21vZGUgPSBBUjVLX0VFUFJPTV9NT0RFXzExQTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCQkiaW52YWxpZCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBQSFkgYWNjZXNzIGVuYWJsZSAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1NISUZUXzVHSFosIEFSNUtfUEhZKDApKTsKKworCX0KKworCXJldCA9IGF0aDVrX2h3X3dyaXRlX2luaXR2YWxzKGFoLCBtb2RlLCBjaGFuZ2VfY2hhbm5lbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogNTIxMS81MjEyIFNwZWNpZmljCisJICovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCS8qCisJCSAqIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiBzZXR0aW5ncworCQkgKiBUaGlzIHNob3VsZCB3b3JrIGZvciBib3RoIDUxMTEvNTExMgorCQkgKi8KKwkJcmV0ID0gYXRoNWtfaHdfcmZnYWluKGFoLCBmcmVxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJbWRlbGF5KDEpOworCisJCS8qCisJCSAqIFdyaXRlIHNvbWUgbW9yZSBpbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzCisJCSAqLworCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAyYTAwMiwgMHg5ODJjKTsKKworCQkJaWYgKGNoYW5uZWwtPmh3X3ZhbHVlID09IENIQU5ORUxfRykKKwkJCQlpZiAoYWgtPmFoX21hY19zcmV2IDwgQVI1S19TUkVWX0FSMjQxMykKKwkJCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwZjgwZDgwLAorCQkJCQkJCQkweDk5NGMpOworCQkJCWVsc2UgaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjU0MjQpCisJCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDM4MDE0MCwKKwkJCQkJCQkJMHg5OTRjKTsKKwkJCQllbHNlIGlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfQVIyNDI1KQorCQkJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDBmYzBlYzAsCisJCQkJCQkJCTB4OTk0Yyk7CisJCQkJZWxzZSAvKiAyNDI1ICovCisJCQkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMGZjMGZjMCwKKwkJCQkJCQkJMHg5OTRjKTsKKwkJCWVsc2UKKwkJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMDAsIDB4OTk0Yyk7CisKKwkJCS8qIFNvbWUgYml0cyBhcmUgZGlzYWJsZWQgaGVyZSwgd2Uga25vdyBub3RoaW5nIGFib3V0CisJCQkgKiByZWdpc3RlciAweGEyMjggeWV0LCBtb3N0IG9mIHRoZSB0aW1lcyB0aGlzIGVuZHMgdXAKKwkJCSAqIHdpdGggYSB2YWx1ZSAweDliNSAtaGF2ZW4ndCBzZWVuIGFueSBkdW1wIHdpdGgKKwkJCSAqIGEgZGlmZmVyZW50IHZhbHVlLSAqLworCQkJLyogR290IHRoaXMgZnJvbSBkZWNvbXBpbGluZyBiaW5hcnkgSEFMICovCisJCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIDB4YTIyOCk7CisJCQlkYXRhICY9IDB4ZmZmZmZkZmY7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIDB4YTIyOCk7CisKKwkJCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgMHhhMjI4KTsKKwkJCWRhdGEgJj0gMHhmZmZlMDNmZjsKKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgMHhhMjI4KTsKKwkJCWRhdGEgPSAwOworCisJCQkvKiBKdXN0IHdyaXRlIDB4OWI1ID8gKi8KKwkJCS8qIGF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDliNSwgMHhhMjI4KTsgKi8KKwkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDAwZiwgQVI1S19TRVFfTUFTSyk7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMDAsIDB4YTI1NCk7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDAwMGUsIEFSNUtfUEhZX1NDQUwpOworCQl9CisKKwkJLyogRml4IGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgUkY1MTEyIFJGIGNoaXBzZXQgKi8KKwkJaWYgKGFoLT5haF9yYWRpbyA+PSBBUjVLX1JGNTExMiAmJgorCQkJCWFoLT5haF9yYWRpb181Z2h6X3JldmlzaW9uIDwKKwkJCQlBUjVLX1NSRVZfUkFEXzUxMTJBKSB7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0NDS1RYQ1RMX1dPUkxELAorCQkJCQlBUjVLX1BIWV9DQ0tUWENUTCk7CisJCQlpZiAoY2hhbm5lbC0+aHdfdmFsdWUgJiBDSEFOTkVMXzVHSFopCisJCQkJZGF0YSA9IDB4ZmZiODEwMjA7CisJCQllbHNlCisJCQkJZGF0YSA9IDB4ZmZiODBkMjA7CisJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUEhZX0ZSQU1FX0NUTCk7CisJCQlkYXRhID0gMDsKKwkJfQorCisJCS8qCisJCSAqIFNldCBUWCBwb3dlciAoRklYTUUpCisJCSAqLworCQlyZXQgPSBhdGg1a19od190eHBvd2VyKGFoLCBjaGFubmVsLCBBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogV3JpdGUgcmF0ZSBkdXJhdGlvbiB0YWJsZSBvbmx5IG9uIEFSNTIxMiBhbmQgaWYKKwkJICogdmlydHVhbCBpbnRlcmZhY2UgaGFzIGFscmVhZHkgYmVlbiBicm91Z2h0IHVwCisJCSAqIFhYWDogcmV0aGluayB0aGlzIGFmdGVyIG5ldyBtb2RlIGNoYW5nZXMgdG8KKwkJICogbWFjODAyMTEgYXJlIGludGVncmF0ZWQgKi8KKwkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCisJCQlhaC0+YWhfc2MtPnZpZiAhPSBOVUxMKQorCQkJYXRoNWtfaHdfd3JpdGVfcmF0ZV9kdXJhdGlvbihhaCwgbW9kZSk7CisKKwkJLyoKKwkJICogV3JpdGUgUkYgcmVnaXN0ZXJzCisJCSAqLworCQlyZXQgPSBhdGg1a19od19yZnJlZ3MoYWgsIGNoYW5uZWwsIG1vZGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBDb25maWd1cmUgYWRkaXRpb25hbCByZWdpc3RlcnMKKwkJICovCisKKwkJLyogV3JpdGUgT0ZETSB0aW1pbmdzIG9uIDUyMTIqLworCQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIgJiYKKwkJCWNoYW5uZWwtPmh3X3ZhbHVlICYgQ0hBTk5FTF9PRkRNKSB7CisJCQlyZXQgPSBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3MoYWgsIGNoYW5uZWwpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLypFbmFibGUvZGlzYWJsZSA4MDIuMTFiIG1vZGUgb24gNTExMQorCQkoZW5hYmxlIDIxMTEgZnJlcXVlbmN5IGNvbnZlcnRlciArIENDSykqLworCQlpZiAoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExKSB7CisJCQlpZiAobW9kZSA9PSBBUjVLX01PREVfMTFCKQorCQkJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAorCQkJCSAgICBBUjVLX1RYQ0ZHX0JfTU9ERSk7CisJCQllbHNlCisJCQkJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1RYQ0ZHLAorCQkJCSAgICBBUjVLX1RYQ0ZHX0JfTU9ERSk7CisJCX0KKworCQkvKgorCQkgKiBTZXQgY2hhbm5lbCBhbmQgY2FsaWJyYXRlIHRoZSBQSFkKKwkJICovCisJCXJldCA9IGF0aDVrX2h3X2NoYW5uZWwoYWgsIGNoYW5uZWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBTZXQgYW50ZW5uYSBtb2RlICovCisJCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9BTlRfQ1RMLAorCQkJYWgtPmFoX2FudGVubmFbZWVfbW9kZV1bMF0sIDB4ZmZmZmZjMDYpOworCisJCS8qCisJCSAqIEluIGNhc2UgYSBmaXhlZCBhbnRlbm5hIHdhcyBzZXQgYXMgZGVmYXVsdAorCQkgKiB3cml0ZSB0aGUgc2FtZSBzZXR0aW5ncyBvbiBib3RoIEFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEUKKwkJICogcmVnaXN0ZXJzLgorCQkgKi8KKwkJaWYgKHNfYW50ICE9IDApIHsKKwkJCWlmIChzX2FudCA9PSBBUjVLX0FOVF9GSVhFRF9BKSAvKiAxIC0gTWFpbiAqLworCQkJCWFudFswXSA9IGFudFsxXSA9IEFSNUtfQU5UX0ZJWEVEX0E7CisJCQllbHNlCS8qIDIgLSBBdXggKi8KKwkJCQlhbnRbMF0gPSBhbnRbMV0gPSBBUjVLX0FOVF9GSVhFRF9COworCQl9IGVsc2UgeworCQkJYW50WzBdID0gQVI1S19BTlRfRklYRURfQTsKKwkJCWFudFsxXSA9IEFSNUtfQU5UX0ZJWEVEX0I7CisJCX0KKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9hbnRlbm5hW2VlX21vZGVdW2FudFswXV0sCisJCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9hbnRlbm5hW2VlX21vZGVdW2FudFsxXV0sCisJCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzEpOworCisJCS8qIENvbW1pdCB2YWx1ZXMgZnJvbSBFRVBST00gKi8KKwkJaWYgKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMSkKKwkJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0ZSQU1FX0NUTCwKKwkJCSAgICBBUjVLX1BIWV9GUkFNRV9DVExfVFhfQ0xJUCwgZWUtPmVlX3R4X2NsaXApOworCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwKKwkJCUFSNUtfUEhZX05GX1NWQUwoZWUtPmVlX25vaXNlX2Zsb29yX3RocltlZV9tb2RlXSksCisJCQlBUjVLX1BIWV9ORlRIUkVTKTsKKworCQlBUjVLX1JFR19NQVNLRURfQklUUyhhaCwgQVI1S19QSFlfU0VUVExJTkcsCisJCQkoZWUtPmVlX3N3aXRjaF9zZXR0bGluZ1tlZV9tb2RlXSA8PCA3KSAmIDB4M2Y4MCwKKwkJCTB4ZmZmZmMwN2YpOworCQlBUjVLX1JFR19NQVNLRURfQklUUyhhaCwgQVI1S19QSFlfR0FJTiwKKwkJCShlZS0+ZWVfYW50X3R4X3J4W2VlX21vZGVdIDw8IDEyKSAmIDB4M2YwMDAsCisJCQkweGZmZmMwZmZmKTsKKwkJQVI1S19SRUdfTUFTS0VEX0JJVFMoYWgsIEFSNUtfUEhZX0RFU0lSRURfU0laRSwKKwkJCShlZS0+ZWVfYWRjX2Rlc2lyZWRfc2l6ZVtlZV9tb2RlXSAmIDB4MDBmZikgfAorCQkJKChlZS0+ZWVfcGdhX2Rlc2lyZWRfc2l6ZVtlZV9tb2RlXSA8PCA4KSAmIDB4ZmYwMCksCisJCQkweGZmZmYwMDAwKTsKKworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsCisJCQkoZWUtPmVlX3R4X2VuZDJ4cGFfZGlzYWJsZVtlZV9tb2RlXSA8PCAyNCkgfAorCQkJKGVlLT5lZV90eF9lbmQyeHBhX2Rpc2FibGVbZWVfbW9kZV0gPDwgMTYpIHwKKwkJCShlZS0+ZWVfdHhfZnJtMnhwYV9lbmFibGVbZWVfbW9kZV0gPDwgOCkgfAorCQkJKGVlLT5lZV90eF9mcm0yeHBhX2VuYWJsZVtlZV9tb2RlXSksIEFSNUtfUEhZX1JGX0NUTDQpOworCisJCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9SRl9DVEwzLAorCQkJZWUtPmVlX3R4X2VuZDJ4bG5hX2VuYWJsZVtlZV9tb2RlXSA8PCA4LCAweGZmZmYwMGZmKTsKKwkJQVI1S19SRUdfTUFTS0VEX0JJVFMoYWgsIEFSNUtfUEhZX05GLAorCQkJKGVlLT5lZV90aHJfNjJbZWVfbW9kZV0gPDwgMTIpICYgMHg3ZjAwMCwgMHhmZmY4MGZmZik7CisJCUFSNUtfUkVHX01BU0tFRF9CSVRTKGFoLCBBUjVLX1BIWV9PRkRNX1NFTEZDT1JSLCA0LCAweGZmZmZmZjAxKTsKKworCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsCisJCSAgICBBUjVLX1BIWV9JUV9DT1JSX0VOQUJMRSB8CisJCSAgICAoZWUtPmVlX2lfY2FsW2VlX21vZGVdIDw8IEFSNUtfUEhZX0lRX0NPUlJfUV9JX0NPRkZfUykgfAorCQkgICAgZWUtPmVlX3FfY2FsW2VlX21vZGVdKTsKKworCQlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPj0gQVI1S19FRVBST01fVkVSU0lPTl80XzEpCisJCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9HQUlOXzJHSFosCisJCQkJQVI1S19QSFlfR0FJTl8yR0haX01BUkdJTl9UWFJYLAorCQkJCWVlLT5lZV9tYXJnaW5fdHhfcnhbZWVfbW9kZV0pOworCisJfSBlbHNlIHsKKwkJbWRlbGF5KDEpOworCQkvKiBEaXNhYmxlIHBoeSBhbmQgd2FpdCAqLworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9ESVNBQkxFLCBBUjVLX1BIWV9BQ1QpOworCQltZGVsYXkoMSk7CisJfQorCisJLyoKKwkgKiBSZXN0b3JlIHNhdmVkIHZhbHVlcworCSAqLworCS8qRENVL0FudGVubmEgc2VsZWN0aW9uIG5vdCBhdmFpbGFibGUgb24gNTIxMCovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKSB7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc19zZXEsIEFSNUtfUVVFVUVfREZTX1NFUU5VTSgwKSk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc19hbnQsIEFSNUtfREVGQVVMVF9BTlRFTk5BKTsKKwl9CisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBzX2xlZFswXSk7CisJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzX2xlZFsxXSwgQVI1S19HUElPQ1IpOworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc19sZWRbMl0sIEFSNUtfR1BJT0RPKTsKKworCS8qCisJICogTWlzYworCSAqLworCS8qIFhYWDogYWRkIGFoLT5haWQgb25jZSBtYWM4MDIxMSBnaXZlcyB0aGlzIHRvIHVzICovCisJYXRoNWtfaHdfc2V0X2Fzc29jaWQoYWgsIGFoLT5haF9ic3NpZCwgMCk7CisKKwlhdGg1a19od19zZXRfb3Btb2RlKGFoKTsKKwkvKlBJU1IvU0lTUiBOb3QgYXZhaWxhYmxlIG9uIDUyMTAqLworCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4ZmZmZmZmZmYsIEFSNUtfUElTUik7CisJCS8qIElmIHdlIGxhdGVyIGFsbG93IHR1bmluZyBmb3IgdGhpcywgc3RvcmUgaW50byBzYyBzdHJ1Y3R1cmUgKi8KKwkJZGF0YSA9IEFSNUtfVFVORV9SU1NJX1RIUkVTIHwKKwkJCUFSNUtfVFVORV9CTUlTU19USFJFUyA8PCBBUjVLX1JTU0lfVEhSX0JNSVNTX1M7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19SU1NJX1RIUik7CisJfQorCisJLyoKKwkgKiBTZXQgUngvVHggRE1BIENvbmZpZ3VyYXRpb24KKwkgKgorCSAqIFNldCBtYXhpbXVtIERNQSBzaXplICg1MTIpIGV4Y2VwdCBmb3IgUENJLUUgY2FyZHMgc2luY2UKKwkgKiBpdCBjYXVzZXMgcnggb3ZlcnJ1bnMgYW5kIHR4IGVycm9ycyAodGVzdGVkIG9uIDU0MjQgYnV0IHNpbmNlCisJICogcnggb3ZlcnJ1bnMgYWxzbyBvY2N1ciBvbiA1NDE2LzU0MTggd2l0aCBtYWR3aWZpIHdlIHNldCAxMjgKKwkgKiBmb3IgYWxsIFBDSS1FIGNhcmRzIHRvIGJlIHNhZmUpLgorCSAqCisJICogSW4gZHVtcHMgdGhpcyBpcyAxMjggZm9yIGFsbGNoaXBzLgorCSAqCisJICogWFhYOiBuZWVkIHRvIGNoZWNrIDUyMTAgZm9yIHRoaXMKKwkgKiBUT0RPOiBDaGVjayBvdXQgdHggdHJpZ2VyIGxldmVsLCBpdCdzIGFsd2F5cyA2NCBvbiBkdW1wcyBidXQgSQorCSAqIGd1ZXNzIHdlIGNhbiB0d2VhayBpdCBhbmQgc2VlIGhvdyBpdCBnb2VzIDstKQorCSAqLworCWRtYV9zaXplID0gKHBkZXYtPmlzX3BjaWUpID8gQVI1S19ETUFTSVpFXzEyOEIgOiBBUjVLX0RNQVNJWkVfNTEyQjsKKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKwkJQVI1S19SRUdfV1JJVEVfQklUUyhhaCwgQVI1S19UWENGRywKKwkJCUFSNUtfVFhDRkdfU0RNQU1SLCBkbWFfc2l6ZSk7CisJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUlhDRkcsCisJCQlBUjVLX1JYQ0ZHX1NETUFNVywgZG1hX3NpemUpOworCX0KKworCS8qCisJICogRW5hYmxlIHRoZSBQSFkgYW5kIHdhaXQgdW50aWwgY29tcGxldGlvbgorCSAqLworCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfQUNUX0VOQUJMRSwgQVI1S19QSFlfQUNUKTsKKworCS8qCisJICogT24gNTIxMSsgcmVhZCBhY3RpdmF0aW9uIC0+IHJ4IGRlbGF5CisJICogYW5kIHVzZSBpdC4KKwkgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApIHsKKwkJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9SWF9ERUxBWSkgJgorCQkJQVI1S19QSFlfUlhfREVMQVlfTTsKKwkJZGF0YSA9IChjaGFubmVsLT5od192YWx1ZSAmIENIQU5ORUxfQ0NLKSA/CisJCQkoKGRhdGEgPDwgMikgLyAyMikgOiAoZGF0YSAvIDEwKTsKKworCQl1ZGVsYXkoMTAwICsgKDIgKiBkYXRhKSk7CisJCWRhdGEgPSAwOworCX0gZWxzZSB7CisJCW1kZWxheSgxKTsKKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gQURDIHRlc3QgKD8pCisJICovCisJZGF0YSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9UU1QxKTsKKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1RTVDFfVFhIT0xELCBBUjVLX1BIWV9UU1QxKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDIwOyBpKyspIHsKKwkJaWYgKCEoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0FEQ19URVNUKSAmIDB4MTApKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMDApOworCX0KKwlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEsIEFSNUtfUEhZX1RTVDEpOworCWRhdGEgPSAwOworCisJLyoKKwkgKiBTdGFydCBhdXRvbWF0aWMgZ2FpbiBjYWxpYnJhdGlvbgorCSAqCisJICogRHVyaW5nIEFHQyBjYWxpYnJhdGlvbiBSWCBwYXRoIGlzIHJlLXJvdXRlZCB0bworCSAqIGEgc2lnbmFsIGRldGVjdG9yIHNvIHdlIGRvbid0IHJlY2VpdmUgYW55dGhpbmcuCisJICoKKwkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNhbGlicmF0ZSBzb21lIHN0YXRpYyBvZmZzZXRzCisJICogdXNlZCB0b2dldGhlciB3aXRoIG9uLXRoZSBmbHkgSS9RIGNhbGlicmF0aW9uICh0aGUKKwkgKiBvbmUgcGVyZm9ybWVkIHZpYSBhdGg1a19od19waHlfY2FsaWJyYXRlKSwgdGhhdCBkb2Vzbid0CisJICogaW50ZXJydXB0IHJ4IHBhdGguCisJICoKKwkgKiBJZiB3ZSBhcmUgaW4gYSBub2lzeSBlbnZpcm9ubWVudCBBR0MgY2FsaWJyYXRpb24gbWF5IHRpbWUKKwkgKiBvdXQuCisJICovCisJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQ0NUTCwKKwkJCQlBUjVLX1BIWV9BR0NDVExfQ0FMKTsKKworCS8qIEF0IHRoZSBzYW1lIHRpbWUgc3RhcnQgSS9RIGNhbGlicmF0aW9uIGZvciBRQU0gY29uc3RlbGxhdGlvbgorCSAqIC1ubyBuZWVkIGZvciBDQ0stICovCisJYWgtPmFoX2NhbGlicmF0aW9uID0gZmFsc2U7CisJaWYgKCEobW9kZSA9PSBBUjVLX01PREVfMTFCKSkgeworCQlhaC0+YWhfY2FsaWJyYXRpb24gPSB0cnVlOworCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9JUSwKKwkJCQlBUjVLX1BIWV9JUV9DQUxfTlVNX0xPR19NQVgsIDE1KTsKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAorCQkJCUFSNUtfUEhZX0lRX1JVTik7CisJfQorCisJLyogV2FpdCBmb3IgZ2FpbiBjYWxpYnJhdGlvbiB0byBmaW5pc2ggKHdlIGNoZWNrIGZvciBJL1EgY2FsaWJyYXRpb24KKwkgKiBkdXJpbmcgYXRoNWtfcGh5X2NhbGlicmF0ZSkgKi8KKwlpZiAoYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChhaCwgQVI1S19QSFlfQUdDQ1RMLAorCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCwgMCwgZmFsc2UpKSB7CisJCUFUSDVLX0VSUihhaC0+YWhfc2MsICJnYWluIGNhbGlicmF0aW9uIHRpbWVvdXQgKCV1TUh6KVxuIiwKKwkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyoKKwkgKiBTdGFydCBub2lzZSBmbG9vciBjYWxpYnJhdGlvbgorCSAqCisJICogSWYgd2UgcnVuIE5GIGNhbGlicmF0aW9uIGJlZm9yZSBBR0MsIGl0IGFsd2F5cyB0aW1lcyBvdXQuCisJICogQmluYXJ5IEhBTCBzdGFydHMgTkYgYW5kIEFHQyBjYWxpYnJhdGlvbiBhdCB0aGUgc2FtZSB0aW1lCisJICogYW5kIG9ubHkgd2FpdHMgZm9yIEFHQyB0byBmaW5pc2guIEkgYmVsaWV2ZSB0aGF0J3Mgd3JvbmcgYmVjYXVzZQorCSAqIGR1cmluZyBORiBjYWxpYnJhdGlvbiwgcnggcGF0aCBpcyBhbHNvIHJvdXRlZCB0byBhIGRldGVjdG9yLCBzbyBpZgorCSAqIGl0IGRvZXNuJ3QgZmluaXNoIHdlIHdvbid0IGhhdmUgUlguCisJICoKKwkgKiBYWFg6IEZpbmQgYW4gaW50ZXJ2YWwgdGhhdCdzIE9LIGZvciBhbGwgY2FyZHMuLi4KKwkgKi8KKwlyZXQgPSBhdGg1a19od19ub2lzZV9mbG9vcl9jYWxpYnJhdGlvbihhaCwgY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFJlc2V0IHF1ZXVlcyBhbmQgc3RhcnQgYmVhY29uIHRpbWVycyBhdCB0aGUgZW5kIG9mIHRoZSByZXNldCByb3V0aW5lCisJICovCisJZm9yIChpID0gMDsgaSA8IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bTsgaSsrKSB7CisJCS8qTm8gUUNVIG9uIDUyMTAqLworCQlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCisJCQlBUjVLX1JFR19XUklURV9RKGFoLCBBUjVLX1FVRVVFX1FDVU1BU0soaSksIGkpOworCisJCXJldCA9IGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKGFoLCBpKTsKKwkJaWYgKHJldCkgeworCQkJQVRINUtfRVJSKGFoLT5haF9zYywKKwkJCQkiZmFpbGVkIHRvIHJlc2V0IFRYIHF1ZXVlICMlZFxuIiwgaSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogUHJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIDUyMTEvNTIxMiovCisJaWYgKGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjEwKQorCQlhdGg1a19od19zZXRfaW1yKGFoLCBBUjVLX0lOVF9SWCB8IEFSNUtfSU5UX1RYIHwKKwkJCQlBUjVLX0lOVF9GQVRBTCk7CisKKwkvKgorCSAqIFNldCBSRiBraWxsIGZsYWdzIGlmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIChyZWFkIGZyb20gdGhlIEVFUFJPTSkKKwkgKiBEaXNhYmxlIGdwaW9faW50ciBmb3Igbm93IHNpbmNlIGl0IHJlc3VsdHMgc3lzdGVtIGhhbmcuCisJICogVE9ETzogSGFuZGxlIHRoaXMgaW4gYXRoNWtfaW50cgorCSAqLworI2lmIDAKKwlpZiAoQVI1S19FRVBST01fSERSX1JGS0lMTChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb20uZWVfaGVhZGVyKSkgeworCQlhdGg1a19od19zZXRfZ3Bpb19pbnB1dChhaCwgMCk7CisJCWFoLT5haF9ncGlvWzBdID0gYXRoNWtfaHdfZ2V0X2dwaW8oYWgsIDApOworCQlpZiAoYWgtPmFoX2dwaW9bMF0gPT0gMCkKKwkJCWF0aDVrX2h3X3NldF9ncGlvX2ludHIoYWgsIDAsIDEpOworCQllbHNlCisJCQlhdGg1a19od19zZXRfZ3Bpb19pbnRyKGFoLCAwLCAwKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogU2V0IHRoZSAzMk1IeiByZWZlcmVuY2UgY2xvY2sgb24gNTIxMiBwaHkgY2xvY2sgc2xlZXAgcmVnaXN0ZXIKKwkgKgorCSAqIFRPRE86IEZpbmQgb3V0IGhvdyB0byBzd2l0Y2ggdG8gZXh0ZXJuYWwgMzJLaHogY2xvY2sgdG8gc2F2ZSBwb3dlcgorCSAqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX1NDUl8zMk1IWiwgQVI1S19QSFlfU0NSKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TTE1UXzMyTUhaLCBBUjVLX1BIWV9TTE1UKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TQ0FMXzMyTUhaLCBBUjVLX1BIWV9TQ0FMKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9TQ0xPQ0tfMzJNSFosIEFSNUtfUEhZX1NDTE9DSyk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfU0RFTEFZXzMyTUhaLCBBUjVLX1BIWV9TREVMQVkpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGFoLT5haF9waHlfc3BlbmRpbmcsIEFSNUtfUEhZX1NQRU5ESU5HKTsKKworCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfVVNFQ181MjExKSAmIDB4ZmZmZmMwN2YgOworCQlkYXRhIHw9IChhaC0+YWhfcGh5X3NwZW5kaW5nID09IEFSNUtfUEhZX1NQRU5ESU5HXzE4KSA/CisJCQkJCQkweDAwMDAwZjgwIDogMHgwMDAwMTM4MCA7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19VU0VDXzUyMTEpOworCQlkYXRhID0gMDsKKwl9CisKKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDEwMGFhLCAweDgxMTgpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDMyMTAsIDB4ODExYyk7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDA1MiwgMHg4MTA4KTsKKwkJaWYgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVIyNDEzKQorCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDAwMDA0LCAweDgxMjApOworCX0KKworCS8qCisJICogRGlzYWJsZSBiZWFjb25zIGFuZCByZXNldCB0aGUgcmVnaXN0ZXIKKwkgKi8KKwlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfQkVBQ09OLCBBUjVLX0JFQUNPTl9FTkFCTEUgfAorCQkJQVI1S19CRUFDT05fUkVTRVRfVFNGKTsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgX0FUSDVLX1JFU0VUCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvS2NvbmZpZwppbmRleCA5ZTE5ZGNjLi44MGE2OTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL0tjb25maWcKQEAgLTEsNiArMSw5IEBACiBjb25maWcgQVRIOUsKIAl0cmlzdGF0ZSAiQXRoZXJvcyA4MDIuMTFuIHdpcmVsZXNzIGNhcmRzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgTUFDODAyMTEgJiYgV0xBTl84MDIxMQorCXNlbGVjdCBNQUM4MDIxMV9MRURTCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTkVXX0xFRFMKIAktLS1oZWxwLS0tCiAJICBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIHdpcmVsZXNzIGFkYXB0ZXJzIGJhc2VkIG9uCiAJICBBdGhlcm9zIElFRUUgODAyLjExbiBBUjUwMDggYW5kIEFSOTAwMSBmYW1pbHkgb2YgY2hpcHNldHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9hdGg5ay5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvYXRoOWsuaAppbmRleCBkMWIwZmJhLi5hY2NhY2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9hdGg5ay5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2F0aDlrLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogI2RlZmluZSBBVEg5S19UWERFU0NfRVhUX0FORF9DVEwJMHgwMDgwCiAjZGVmaW5lIEFUSDlLX1RYREVTQ19WTUYJCTB4MDEwMAogI2RlZmluZSBBVEg5S19UWERFU0NfRlJBR19JU19PTiAJMHgwMjAwCisjZGVmaW5lIEFUSDlLX1RYREVTQ19DQUIJCTB4MDQwMAogCiAjZGVmaW5lIEFUSDlLX1JYREVTQ19JTlRSRVEJCTB4MDAyMAogCkBAIC01NjQsOCArNTY1LDYgQEAKICNkZWZpbmUgQ1RMXzVHSFQ0MCAgICAgICAgICAgICAgOAogCiAjZGVmaW5lIEFSX0VFUFJPTV9NQUMoaSkgICAgICAgICgweDFkKyhpKSkKLSNkZWZpbmUgRUVQX1NDQUxFICAgICAgIDEwMAotI2RlZmluZSBFRVBfREVMVEEgICAgICAgMTAKIAogI2RlZmluZSBBUl9FRVBST01fUkZTSUxFTlRfR1BJT19TRUwgICAgIDB4MDAxYwogI2RlZmluZSBBUl9FRVBST01fUkZTSUxFTlRfR1BJT19TRUxfUyAgIDIKQEAgLTYwNiw5ICs2MDUsNiBAQAogI2RlZmluZSBSRUdfQ0xSX0JJVChfYSwgX3IsIF9mKSBcCiAJUkVHX1dSSVRFKF9hLCBfciwgUkVHX1JFQUQoX2EsIF9yKSAmIH5fZikKIAotI2RlZmluZSBBVEg5S19DT01QX0JVRl9NQVhfU0laRSAgIDkyMTYKLSNkZWZpbmUgQVRIOUtfQ09NUF9CVUZfQUxJR05fU0laRSA1MTIKLQogI2RlZmluZSBBVEg5S19UWFFfVVNFX0xPQ0tPVVRfQktPRkZfRElTICAgMHgwMDAwMDAwMQogCiAjZGVmaW5lIElOSVRfQUlGUyAgICAgICAyCkBAIC02MzIsMTIgKzYyOCw2IEBACiAJCQkJIChJRUVFODAyMTFfV0VQX0lWTEVOICsJCVwKIAkJCQkgIElFRUU4MDIxMV9XRVBfS0lETEVOICsJXAogCQkJCSAgSUVFRTgwMjExX1dFUF9DUkNMRU4pKQotI2RlZmluZSBJRUVFODAyMTFfTUFYX0xFTiAgICAgICAoMjMwMCArIEZDU19MRU4gKwkJXAotCQkJCSAoSUVFRTgwMjExX1dFUF9JVkxFTiArCQlcCi0JCQkJICBJRUVFODAyMTFfV0VQX0tJRExFTiArCVwKLQkJCQkgIElFRUU4MDIxMV9XRVBfQ1JDTEVOKSkKLQotI2RlZmluZSBNQVhfUkVHX0FERF9DT1VOVCAgIDEyOQogI2RlZmluZSBNQVhfUkFURV9QT1dFUiA2MwogCiBlbnVtIGF0aDlrX3Bvd2VyX21vZGUgewpAQCAtNzA3LDEzICs2OTcsNiBAQAogfTsKICNkZWZpbmUgUEhZX0NDSyBQSFlfRFMKIAotZW51bSBzdGFydF9hZGhvY19vcHRpb24gewotCVNUQVJUX0FESE9DX05PXzExQSwKLQlTVEFSVF9BREhPQ19QRVJfMTFELAotCVNUQVJUX0FESE9DX0lOXzExQSwKLQlTVEFSVF9BREhPQ19JTl8xMUIsCi19OwotCiBlbnVtIGF0aDlrX3RwX3NjYWxlIHsKIAlBVEg5S19UUF9TQ0FMRV9NQVggPSAwLAogCUFUSDlLX1RQX1NDQUxFXzUwLApAQCAtNzY5LDE0ICs3NTIsMTEgQEAKIAogI2RlZmluZSBBVEg5S19SU1NJX0VQX01VTFRJUExJRVIgICgxPDw3KQogCi1lbnVtIGF0aDlrX2dwaW9fb3V0cHV0X211eF90eXBlIHsKLQlBVEg5S19HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVULAotCUFUSDlLX0dQSU9fT1VUUFVUX01VWF9BU19QQ0lFX0FUVEVOVElPTl9MRUQsCi0JQVRIOUtfR1BJT19PVVRQVVRfTVVYX0FTX1BDSUVfUE9XRVJfTEVELAotCUFUSDlLX0dQSU9fT1VUUFVUX01VWF9BU19NQUNfTkVUV09SS19MRUQsCi0JQVRIOUtfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19QT1dFUl9MRUQsCi0JQVRIOUtfR1BJT19PVVRQVVRfTVVYX05VTV9FTlRSSUVTCi19OworI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1BDSUVfQVRURU5USU9OX0xFRCAxCisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19QQ0lFX1BPV0VSX0xFRCAgICAgMgorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUFDX05FVFdPUktfTEVEICAgIDUKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19QT1dFUl9MRUQgICAgICA2CiAKIGVudW0gewogCUFUSDlLX1JFU0VUX1BPV0VSX09OLApAQCAtNzkwLDE5ICs3NzAsMjAgQEAKIAl1MzIgYWhfbWFnaWM7CiAJdTE2IGFoX2RldmlkOwogCXUxNiBhaF9zdWJ2ZW5kb3JpZDsKLQlzdHJ1Y3QgYXRoX3NvZnRjICphaF9zYzsKLQl2b2lkIF9faW9tZW0gKmFoX3NoOwotCXUxNiBhaF9jb3VudHJ5Q29kZTsKIAl1MzIgYWhfbWFjVmVyc2lvbjsKIAl1MTYgYWhfbWFjUmV2OwogCXUxNiBhaF9waHlSZXY7CiAJdTE2IGFoX2FuYWxvZzVHaHpSZXY7CiAJdTE2IGFoX2FuYWxvZzJHaHpSZXY7Ci0JdTggYWhfZGVjb21wTWFza1tBVEg5S19ERUNPTVBfTUFTS19TSVpFXTsKLQl1MzIgYWhfZmxhZ3M7CisKKwl2b2lkIF9faW9tZW0gKmFoX3NoOworCXN0cnVjdCBhdGhfc29mdGMgKmFoX3NjOwogCWVudW0gYXRoOWtfb3Btb2RlIGFoX29wbW9kZTsKIAlzdHJ1Y3QgYXRoOWtfb3BzX2NvbmZpZyBhaF9jb25maWc7CiAJc3RydWN0IGF0aDlrX2h3X2NhcGFiaWxpdGllcyBhaF9jYXBzOworCisJdTE2IGFoX2NvdW50cnlDb2RlOworCXUzMiBhaF9mbGFnczsKIAlpbnQxNl90IGFoX3Bvd2VyTGltaXQ7CiAJdTE2IGFoX21heFBvd2VyTGV2ZWw7CiAJdTMyIGFoX3RwU2NhbGU7CkBAIC04MTIsMTUgKzc5MywxNyBAQAogCXUxNiBhaF9jdXJyZW50UkQ1RzsKIAl1MTYgYWhfY3VycmVudFJEMkc7CiAJY2hhciBhaF9pc29bNF07Ci0JZW51bSBzdGFydF9hZGhvY19vcHRpb24gYWhfYWRIb2NNb2RlOwotCWJvb2wgYWhfY29tbW9uTW9kZTsKKwogCXN0cnVjdCBhdGg5a19jaGFubmVsIGFoX2NoYW5uZWxzWzE1MF07Ci0JdTMyIGFoX25jaGFuOwogCXN0cnVjdCBhdGg5a19jaGFubmVsICphaF9jdXJjaGFuOwotCXUxNiBhaF9yZnNpbGVudDsKLQlib29sIGFoX3Jma2lsbEVuYWJsZWQ7CisJdTMyIGFoX25jaGFuOworCiAJYm9vbCBhaF9pc1BjaUV4cHJlc3M7CiAJdTE2IGFoX3R4VHJpZ0xldmVsOworCXUxNiBhaF9yZnNpbGVudDsKKwl1MzIgYWhfcmZraWxsX2dwaW87CisJdTMyIGFoX3Jma2lsbF9wb2xhcml0eTsKKwogI2lmbmRlZiBBVEhfTkZfUEVSX0NIQU4KIAlzdHJ1Y3QgYXRoOWtfbmZjYWxfaGlzdCBuZkNhbEhpc3RbTlVNX05GX1JFQURJTkdTXTsKICNlbmRpZgpAQCAtODUzLDcgKzgzNiw3IEBACiB1MzIgYXRoOWtfaHdfbWh6MmllZWUoc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgZnJlcSwgdTMyIGZsYWdzKTsKIGVudW0gYXRoOWtfaW50IGF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCQkgICAgIGVudW0gYXRoOWtfaW50IGludHMpOwotYm9vbCBhdGg5a19od19yZXNldChzdHJ1Y3QgYXRoX2hhbCAqYWgsIGVudW0gYXRoOWtfb3Btb2RlIG9wbW9kZSwKK2Jvb2wgYXRoOWtfaHdfcmVzZXQoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCSAgICBlbnVtIGF0aDlrX2h0X21hY21vZGUgbWFjbW9kZSwKIAkJICAgIHU4IHR4Y2hhaW5tYXNrLCB1OCByeGNoYWlubWFzaywKQEAgLTg3MSw3ICs4NTQsNyBAQAogCQkJdTggcnhjaGFpbm1hc2ssCiAJCQlib29sIGxvbmdjYWwsCiAJCQlib29sICppc0NhbERvbmUpOwotaW50MTZfdCBhdGg5a19od19nZXRjaGFuX25vaXNlKHN0cnVjdCBhdGhfaGFsICphaCwKK3MxNiBhdGg5a19od19nZXRjaGFuX25vaXNlKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCSAgICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbik7CiB2b2lkIGF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc3RydWN0IGF0aF9oYWwgKmFoLCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICAgdTE2IGFzc29jSWQpOwpAQCAtMTAxOCw0ICsxMDAxLDkgQEAKIGJvb2wgYXRoOWtfZ2V0X2NoYW5uZWxfZWRnZXMoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkJICAgICB1MTYgZmxhZ3MsIHUxNiAqbG93LAogCQkJICAgICB1MTYgKmhpZ2gpOwordm9pZCBhdGg5a19od19jZmdfb3V0cHV0KHN0cnVjdCBhdGhfaGFsICphaCwgdTMyIGdwaW8sCisJCQl1MzIgYWhfc2lnbmFsX3R5cGUpOwordm9pZCBhdGg5a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoX2hhbCAqYWgsIHUzMiBncGlvLCB1MzIgdmFsdWUpOwordTMyIGF0aDlrX2h3X2dwaW9fZ2V0KHN0cnVjdCBhdGhfaGFsICphaCwgdTMyIGdwaW8pOwordm9pZCBhdGg5a19od19jZmdfZ3Bpb19pbnB1dChzdHJ1Y3QgYXRoX2hhbCAqYWgsIHUzMiBncGlvKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvYmVhY29uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9iZWFjb24uYwppbmRleCBjYWY1Njk0Li45ZTE1YzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9iZWFjb24uYwpAQCAtMTYsNyArMTYsNiBAQAogCiAgLyogSW1wbGVtZW50YXRpb24gb2YgYmVhY29uIHByb2Nlc3NpbmcuICovCiAKLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiY29yZS5oIgogCiAvKgpAQCAtMjYsMTQgKzI1LDEzIEBACiAgKiAgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBzdGF0aW9uIChBUCBvciBBZEhvYykuICBQYXJhbWV0ZXJzIGFyZSBBSUZTCiAgKiAgc2V0dGluZ3MgYW5kIGNoYW5uZWwgd2lkdGggbWluL21heAogKi8KLQogc3RhdGljIGludCBhdGhfYmVhY29ucV9jb25maWcoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvIHFpOwogCiAJYXRoOWtfaHdfZ2V0X3R4cV9wcm9wcyhhaCwgc2MtPnNjX2JoYWxxLCAmcWkpOwotCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQKSB7CisJaWYgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQKSB7CiAJCS8qIEFsd2F5cyBidXJzdCBvdXQgYmVhY29uIGFuZCBDQUIgdHJhZmZpYy4gKi8KIAkJcWkudHFpX2FpZnMgPSAxOwogCQlxaS50cWlfY3dtaW4gPSAwOwpAQCAtNjMsMTkgKzYxLDE4IEBACiAgKiAgdXAgYWxsIHJlcXVpcmVkIGFudGVubmEgc3dpdGNoIHBhcmFtZXRlcnMsIHJhdGUgY29kZXMsIGFuZCBjaGFubmVsIGZsYWdzLgogICogIEJlYWNvbnMgYXJlIGFsd2F5cyBzZW50IG91dCBhdCB0aGUgbG93ZXN0IHJhdGUsIGFuZCBhcmUgbm90IHJldHJpZWQuCiAqLwotCiBzdGF0aWMgdm9pZCBhdGhfYmVhY29uX3NldHVwKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCXN0cnVjdCBhdGhfdmFwICphdnAsIHN0cnVjdCBhdGhfYnVmICpiZikKKwkJCSAgICAgc3RydWN0IGF0aF92YXAgKmF2cCwgc3RydWN0IGF0aF9idWYgKmJmKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKiliZi0+YmZfbXBkdTsKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9kZXNjICpkczsKLQlpbnQgZmxhZ3MsIGFudGVubmE7CisJc3RydWN0IGF0aDlrXzExbl9yYXRlX3NlcmllcyBzZXJpZXNbNF07CiAJY29uc3Qgc3RydWN0IGF0aDlrX3JhdGVfdGFibGUgKnJ0OworCWludCBmbGFncywgYW50ZW5uYTsKIAl1OCByaXgsIHJhdGU7CiAJaW50IGN0c3JhdGUgPSAwOwogCWludCBjdHNkdXJhdGlvbiA9IDA7Ci0Jc3RydWN0IGF0aDlrXzExbl9yYXRlX3NlcmllcyAgc2VyaWVzWzRdOwogCiAJRFBSSU5URihzYywgQVRIX0RCR19CRUFDT04sICIlczogbSAlcCBsZW4gJXVcbiIsCiAJCV9fZnVuY19fLCBza2IsIHNrYi0+bGVuKTsKQEAgLTg1LDcgKzgyLDcgQEAKIAogCWZsYWdzID0gQVRIOUtfVFhERVNDX05PQUNLOwogCi0JaWYgKHNjLT5zY19vcG1vZGUgPT0gQVRIOUtfTV9JQlNTICYmCisJaWYgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fSUJTUyAmJgogCSAgICAoYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9WRU9MKSkgewogCQlkcy0+ZHNfbGluayA9IGJmLT5iZl9kYWRkcjsgLyogc2VsZi1saW5rZWQgKi8KIAkJZmxhZ3MgfD0gQVRIOUtfVFhERVNDX1ZFT0w7CkBAIC0xMTEsMjcgKzEwOCwyOCBAQAogCXJpeCA9IDA7CiAJcnQgPSBzYy0+c2NfY3VycmF0ZXM7CiAJcmF0ZSA9IHJ0LT5pbmZvW3JpeF0ucmF0ZUNvZGU7Ci0JaWYgKHNjLT5zY19mbGFncyAmIEFUSF9QUkVBTUJMRV9TSE9SVCkKKwlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUFJFQU1CTEVfU0hPUlQpCiAJCXJhdGUgfD0gcnQtPmluZm9bcml4XS5zaG9ydFByZWFtYmxlOwogCi0JYXRoOWtfaHdfc2V0MTFuX3R4ZGVzYyhhaCwgZHMKLQkJCSAgICAgICwgc2tiLT5sZW4gKyBGQ1NfTEVOIC8qIGZyYW1lIGxlbmd0aCAqLwotCQkJICAgICAgLCBBVEg5S19QS1RfVFlQRV9CRUFDT04gLyogQXRoZXJvcyBwYWNrZXQgdHlwZSAqLwotCQkJICAgICAgLCBhdnAtPmF2X2J0eGN0bC50eHBvd2VyIC8qIHR4cG93ZXIgWFhYICovCi0JCQkgICAgICAsIEFUSDlLX1RYS0VZSVhfSU5WQUxJRCAvKiBubyBlbmNyeXB0aW9uICovCi0JCQkgICAgICAsIEFUSDlLX0tFWV9UWVBFX0NMRUFSIC8qIG5vIGVuY3J5cHRpb24gKi8KLQkJCSAgICAgICwgZmxhZ3MgLyogbm8gYWNrLCB2ZW9sIGZvciBiZWFjb25zICovCisJYXRoOWtfaHdfc2V0MTFuX3R4ZGVzYyhhaCwgZHMsCisJCQkgICAgICAgc2tiLT5sZW4gKyBGQ1NfTEVOLCAgICAgLyogZnJhbWUgbGVuZ3RoICovCisJCQkgICAgICAgQVRIOUtfUEtUX1RZUEVfQkVBQ09OLCAgLyogQXRoZXJvcyBwYWNrZXQgdHlwZSAqLworCQkJICAgICAgIGF2cC0+YXZfYnR4Y3RsLnR4cG93ZXIsIC8qIHR4cG93ZXIgWFhYICovCisJCQkgICAgICAgQVRIOUtfVFhLRVlJWF9JTlZBTElELCAgLyogbm8gZW5jcnlwdGlvbiAqLworCQkJICAgICAgIEFUSDlLX0tFWV9UWVBFX0NMRUFSLCAgIC8qIG5vIGVuY3J5cHRpb24gKi8KKwkJCSAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAvKiBubyBhY2ssCisJCQkJCQkJICB2ZW9sIGZvciBiZWFjb25zICovCiAJCSk7CiAKIAkvKiBOQjogYmVhY29uJ3MgQnVmTGVuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzICovCi0JYXRoOWtfaHdfZmlsbHR4ZGVzYyhhaCwgZHMKLQkJCSAgICwgcm91bmR1cChza2ItPmxlbiwgNCkgLyogYnVmZmVyIGxlbmd0aCAqLwotCQkJICAgLCB0cnVlIC8qIGZpcnN0IHNlZ21lbnQgKi8KLQkJCSAgICwgdHJ1ZSAvKiBsYXN0IHNlZ21lbnQgKi8KLQkJCSAgICwgZHMgLyogZmlyc3QgZGVzY3JpcHRvciAqLworCWF0aDlrX2h3X2ZpbGx0eGRlc2MoYWgsIGRzLAorCQkJICAgIHJvdW5kdXAoc2tiLT5sZW4sIDQpLCAvKiBidWZmZXIgbGVuZ3RoICovCisJCQkgICAgdHJ1ZSwgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHNlZ21lbnQgKi8KKwkJCSAgICB0cnVlLCAgICAgICAgICAgICAgICAgLyogbGFzdCBzZWdtZW50ICovCisJCQkgICAgZHMgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGRlc2NyaXB0b3IgKi8KIAkJKTsKIAotCW1lbXplcm8oc2VyaWVzLCBzaXplb2Yoc3RydWN0IGF0aDlrXzExbl9yYXRlX3NlcmllcykgKiA0KTsKKwltZW1zZXQoc2VyaWVzLCAwLCBzaXplb2Yoc3RydWN0IGF0aDlrXzExbl9yYXRlX3NlcmllcykgKiA0KTsKIAlzZXJpZXNbMF0uVHJpZXMgPSAxOwogCXNlcmllc1swXS5SYXRlID0gcmF0ZTsKIAlzZXJpZXNbMF0uQ2hTZWwgPSBzYy0+c2NfdHhfY2hhaW5tYXNrOwpAQCAtMTQwLDU1ICsxMzgsNiBAQAogCQljdHNyYXRlLCBjdHNkdXJhdGlvbiwgc2VyaWVzLCA0LCAwKTsKIH0KIAotLyogTW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIHZhcCdzIG1jYXN0IHF1ZXVlIHRvIHRoZSBoYXJkd2FyZSBjYWIgcXVldWUuCi0gKiBDYWxsZXIgbXVzdCBob2xkIG1jYXNxIGxvY2sgYW5kIGNhYnEgbG9jawotICogWFhYIE1PUkVfREFUQSBiaXQ/Ci0gKi8KLXN0YXRpYyB2b2lkIGVtcHR5X21jYXN0cV9pbnRvX2NhYnEoc3RydWN0IGF0aF9oYWwgKmFoLAotCXN0cnVjdCBhdGhfdHhxICptY2FzdHEsIHN0cnVjdCBhdGhfdHhxICpjYWJxKQotewotCXN0cnVjdCBhdGhfYnVmICpiZm1jYXN0OwotCi0JQlVHX09OKGxpc3RfZW1wdHkoJm1jYXN0cS0+YXhxX3EpKTsKLQotCWJmbWNhc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtY2FzdHEtPmF4cV9xLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0KLQkvKiBsaW5rIHRoZSBkZXNjcmlwdG9ycyAqLwotCWlmICghY2FicS0+YXhxX2xpbmspCi0JCWF0aDlrX2h3X3B1dHR4YnVmKGFoLCBjYWJxLT5heHFfcW51bSwgYmZtY2FzdC0+YmZfZGFkZHIpOwotCWVsc2UKLQkJKmNhYnEtPmF4cV9saW5rID0gYmZtY2FzdC0+YmZfZGFkZHI7Ci0KLQkvKiBhcHBlbmQgdGhlIHByaXZhdGUgdmFwIG1jYXN0IGxpc3QgdG8gIHRoZSBjYWJxICovCi0KLQljYWJxLT5heHFfZGVwdGgJKz0gbWNhc3RxLT5heHFfZGVwdGg7Ci0JY2FicS0+YXhxX3RvdGFscXVldWVkICs9IG1jYXN0cS0+YXhxX3RvdGFscXVldWVkOwotCWNhYnEtPmF4cV9saW5rYnVmID0gbWNhc3RxLT5heHFfbGlua2J1ZjsKLQljYWJxLT5heHFfbGluayA9IG1jYXN0cS0+YXhxX2xpbms7Ci0JbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtY2FzdHEtPmF4cV9xLCAmY2FicS0+YXhxX3EpOwotCW1jYXN0cS0+YXhxX2RlcHRoID0gMDsKLQltY2FzdHEtPmF4cV90b3RhbHF1ZXVlZCA9IDA7Ci0JbWNhc3RxLT5heHFfbGlua2J1ZiA9IE5VTEw7Ci0JbWNhc3RxLT5heHFfbGluayA9IE5VTEw7Ci19Ci0KLS8qIFRoaXMgaXMgb25seSBydW4gYXQgRFRJTS4gV2UgbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIHZhcCdzIG1jYXN0IHF1ZXVlCi0gKiB0byB0aGUgaGFyZHdhcmUgY2FiIHF1ZXVlLiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtY2FzdHEgbG9jay4gKi8KLXN0YXRpYyB2b2lkIHRyaWdnZXJfbWNhc3RxKHN0cnVjdCBhdGhfaGFsICphaCwKLQlzdHJ1Y3QgYXRoX3R4cSAqbWNhc3RxLCBzdHJ1Y3QgYXRoX3R4cSAqY2FicSkKLXsKLQlzcGluX2xvY2tfYmgoJmNhYnEtPmF4cV9sb2NrKTsKLQotCWlmICghbGlzdF9lbXB0eSgmbWNhc3RxLT5heHFfcSkpCi0JCWVtcHR5X21jYXN0cV9pbnRvX2NhYnEoYWgsIG1jYXN0cSwgY2FicSk7Ci0KLQkvKiBjYWJxIGlzIGdhdGVkIGJ5IGJlYWNvbiBzbyBpdCBpcyBzYWZlIHRvIHN0YXJ0IGhlcmUgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmNhYnEtPmF4cV9xKSkKLQkJYXRoOWtfaHdfdHhzdGFydChhaCwgY2FicS0+YXhxX3FudW0pOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmNhYnEtPmF4cV9sb2NrKTsKLX0KLQogLyoKICAqICBHZW5lcmF0ZSBiZWFjb24gZnJhbWUgYW5kIHF1ZXVlIGNhYiBkYXRhIGZvciBhIHZhcC4KICAqCkBAIC0xOTksNTcgKzE0OCw1NiBAQAogKi8KIHN0YXRpYyBzdHJ1Y3QgYXRoX2J1ZiAqYXRoX2JlYWNvbl9nZW5lcmF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGlmX2lkKQogewotCXN0cnVjdCBhdGhfaGFsICphaCA9IHNjLT5zY19haDsKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmY7CiAJc3RydWN0IGF0aF92YXAgKmF2cDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBjYWJxX2RlcHRoOwotCWludCBtY2FzdHFfZGVwdGg7Ci0JaW50IGlzX2JlYWNvbl9kdGltID0gMDsKLQl1bnNpZ25lZCBpbnQgY3VybGVuOwogCXN0cnVjdCBhdGhfdHhxICpjYWJxOwotCXN0cnVjdCBhdGhfdHhxICptY2FzdHE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCWludCBjYWJxX2RlcHRoOworCiAJYXZwID0gc2MtPnNjX3ZhcHNbaWZfaWRdOwotCi0JbWNhc3RxID0gJmF2cC0+YXZfbWNhc3RxOwotCWNhYnEgPSBzYy0+c2NfY2FicTsKLQogCUFTU0VSVChhdnApOwogCisJY2FicSA9IHNjLT5zY19jYWJxOworCiAJaWYgKGF2cC0+YXZfYmNidWYgPT0gTlVMTCkgewogCQlEUFJJTlRGKHNjLCBBVEhfREJHX0JFQUNPTiwgIiVzOiBhdnA9JXAgYXZfYmNidWY9JXBcbiIsCiAJCQlfX2Z1bmNfXywgYXZwLCBhdnAtPmF2X2JjYnVmKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCiAJYmYgPSBhdnAtPmF2X2JjYnVmOwotCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBiZi0+YmZfbXBkdTsKLQotCS8qCi0JICogVXBkYXRlIGR5bmFtaWMgYmVhY29uIGNvbnRlbnRzLiAgSWYgdGhpcyByZXR1cm5zCi0JICogbm9uLXplcm8gdGhlbiB3ZSBuZWVkIHRvIHJlbWFwIHRoZSBtZW1vcnkgYmVjYXVzZQotCSAqIHRoZSBiZWFjb24gZnJhbWUgY2hhbmdlZCBzaXplIChwcm9iYWJseSBiZWNhdXNlCi0JICogb2YgdGhlIFRJTSBiaXRtYXApLgotCSAqLwotCWN1cmxlbiA9IHNrYi0+bGVuOwotCi0JLyogWFhYOiBzcGluX2xvY2tfYmggc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUsIGJ1dCBzcGFyc2UgYml0Y2hlcwotCSAqIG90aGVyd2lzZS4gV2Ugc2hvdWxkIGZpeCBzcGFyc2UgOikgKi8KLQlzcGluX2xvY2tfYmgoJm1jYXN0cS0+YXhxX2xvY2spOwotCW1jYXN0cV9kZXB0aCA9IGF2cC0+YXZfbWNhc3RxLmF4cV9kZXB0aDsKLQotCWlmIChhdGhfdXBkYXRlX2JlYWNvbihzYywgaWZfaWQsICZhdnAtPmF2X2JvZmYsIHNrYiwgbWNhc3RxX2RlcHRoKSA9PQotCSAgICAxKSB7Ci0JCWF0aF9za2JfdW5tYXBfc2luZ2xlKHNjLCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UsCi0JCQkJICAgICBnZXRfZG1hX21lbV9jb250ZXh0KGJmLCBiZl9kbWFjb250ZXh0KSk7Ci0JCWJmLT5iZl9idWZfYWRkciA9IGF0aF9za2JfbWFwX3NpbmdsZShzYywgc2tiLCBQQ0lfRE1BX1RPREVWSUNFLAotCQkJZ2V0X2RtYV9tZW1fY29udGV4dChiZiwgYmZfZG1hY29udGV4dCkpOwotCX0gZWxzZSB7Ci0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzYy0+cGRldiwKLQkJCQkJICAgIGJmLT5iZl9idWZfYWRkciwKLQkJCQkJICAgIHNrYl90YWlscm9vbShza2IpLAotCQkJCQkgICAgUENJX0RNQV9UT0RFVklDRSk7CisJc2tiID0gKHN0cnVjdCBza19idWZmICopYmYtPmJmX21wZHU7CisJaWYgKHNrYikgeworCQlwY2lfdW5tYXBfc2luZ2xlKHNjLT5wZGV2LCBiZi0+YmZfZG1hY29udGV4dCwKKwkJCQkgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwogCX0KIAorCXNrYiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KHNjLT5odywgYXZwLT5hdl9pZl9kYXRhKTsKKwliZi0+YmZfbXBkdSA9IHNrYjsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVEpIHsKKwkJLyoKKwkJICogVE9ETzogbWFrZSBzdXJlIHRoZSBzZXEjIGdldHMgYXNzaWduZWQgcHJvcGVybHkgKHZzLiBvdGhlcgorCQkgKiBUWCBmcmFtZXMpCisJCSAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCQlzYy0+c2VxX25vICs9IDB4MTA7CisJCWhkci0+c2VxX2N0cmwgJj0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7CisJCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoc2MtPnNlcV9ubyk7CisJfQorCisJYmYtPmJmX2J1Zl9hZGRyID0gYmYtPmJmX2RtYWNvbnRleHQgPQorCQlwY2lfbWFwX3NpbmdsZShzYy0+cGRldiwgc2tiLT5kYXRhLAorCQkJICAgICAgIHNrYl9lbmRfcG9pbnRlcihza2IpIC0gc2tiLT5oZWFkLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJc2tiID0gaWVlZTgwMjExX2dldF9idWZmZXJlZF9iYyhzYy0+aHcsIGF2cC0+YXZfaWZfZGF0YSk7CisKIAkvKgogCSAqIGlmIHRoZSBDQUJRIHRyYWZmaWMgZnJvbSBwcmV2aW91cyBEVElNIGlzIHBlbmRpbmcgYW5kIHRoZSBjdXJyZW50CiAJICogIGJlYWNvbiBpcyBhbHNvIGEgRFRJTS4KQEAgLTI2Miw5ICsyMTAsNyBAQAogCWNhYnFfZGVwdGggPSBjYWJxLT5heHFfZGVwdGg7CiAJc3Bpbl91bmxvY2tfYmgoJmNhYnEtPmF4cV9sb2NrKTsKIAotCWlzX2JlYWNvbl9kdGltID0gYXZwLT5hdl9ib2ZmLmJvX3RpbVs0XSAmIDE7Ci0KLQlpZiAobWNhc3RxX2RlcHRoICYmIGlzX2JlYWNvbl9kdGltICYmIGNhYnFfZGVwdGgpIHsKKwlpZiAoc2tiICYmIGNhYnFfZGVwdGgpIHsKIAkJLyoKIAkJICogVW5sb2NrIHRoZSBjYWJxIGxvY2sgYXMgYXRoX3R4X2RyYWludHhxIGFjcXVpcmVzCiAJCSAqIHRoZSBsb2NrIGFnYWluIHdoaWNoIGlzIGEgY29tbW9uIGZ1bmN0aW9uIGFuZCB0aGF0CkBAIC0yODQsMTAgKzIzMCwxMSBAQAogCSAqIEVuYWJsZSB0aGUgQ0FCIHF1ZXVlIGJlZm9yZSB0aGUgYmVhY29uIHF1ZXVlIHRvCiAJICogaW5zdXJlIGNhYiBmcmFtZXMgYXJlIHRyaWdnZXJlZCBieSB0aGlzIGJlYWNvbi4KIAkgKi8KLQlpZiAoaXNfYmVhY29uX2R0aW0pCi0JCXRyaWdnZXJfbWNhc3RxKGFoLCBtY2FzdHEsIGNhYnEpOworCXdoaWxlIChza2IpIHsKKwkJYXRoX3R4X2NhYnEoc2MsIHNrYik7CisJCXNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMoc2MtPmh3LCBhdnAtPmF2X2lmX2RhdGEpOworCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZtY2FzdHEtPmF4cV9sb2NrKTsKIAlyZXR1cm4gYmY7CiB9CiAKQEAgLTI5NSw3ICsyNDIsNiBAQAogICogU3RhcnR1cCBiZWFjb24gdHJhbnNtaXNzaW9uIGZvciBhZGhvYyBtb2RlIHdoZW4gdGhleSBhcmUgc2VudCBlbnRpcmVseQogICogYnkgdGhlIGhhcmR3YXJlIHVzaW5nIHRoZSBzZWxmLWxpbmtlZCBkZXNjcmlwdG9yICsgdmVvbCB0cmljay4KICovCi0KIHN0YXRpYyB2b2lkIGF0aF9iZWFjb25fc3RhcnRfYWRob2Moc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpZl9pZCkKIHsKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CkBAIC0zMzIsMTIgKzI3OCwxMSBAQAogICogIG1pbi9tYXgsIGFuZCBlbmFibGUgYWlmcykuIFRoZSBpbmZvIHN0cnVjdHVyZSBkb2VzIG5vdCBuZWVkIHRvIGJlCiAgKiAgcGVyc2lzdGFudC4KICovCi0KIGludCBhdGhfYmVhY29ucV9zZXR1cChzdHJ1Y3QgYXRoX2hhbCAqYWgpCiB7CiAJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gcWk7CiAKLQltZW16ZXJvKCZxaSwgc2l6ZW9mKHFpKSk7CisJbWVtc2V0KCZxaSwgMCwgc2l6ZW9mKHFpKSk7CiAJcWkudHFpX2FpZnMgPSAxOwogCXFpLnRxaV9jd21pbiA9IDA7CiAJcWkudHFpX2N3bWF4ID0gMDsKQEAgLTM1MywyOSArMjk4LDI3IEBACiAgKiAgdGhlIEFUSCBpbnRlcmZhY2UuICBUaGlzIHJvdXRpbmUgYWxzbyBjYWxjdWxhdGVzIHRoZSBiZWFjb24gInNsb3QiIGZvcgogICogIHN0YWdnYXJlZCBiZWFjb25zIGluIHRoZSBtQlNTSUQgY2FzZS4KICovCi0KIGludCBhdGhfYmVhY29uX2FsbG9jKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgaWZfaWQpCiB7CiAJc3RydWN0IGF0aF92YXAgKmF2cDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqd2g7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX2xlNjQgdHN0YW1wOwogCiAJYXZwID0gc2MtPnNjX3ZhcHNbaWZfaWRdOwogCUFTU0VSVChhdnApOwogCiAJLyogQWxsb2NhdGUgYSBiZWFjb24gZGVzY3JpcHRvciBpZiB3ZSBoYXZlbid0IGRvbmUgc28uICovCiAJaWYgKCFhdnAtPmF2X2JjYnVmKSB7Ci0JCS8qCi0JCSAqIEFsbG9jYXRlIGJlYWNvbiBzdGF0ZSBmb3IgaG9zdGFwL2lic3MuICBXZSBrbm93Ci0JCSAqIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4KLQkJICovCisJCS8qIEFsbG9jYXRlIGJlYWNvbiBzdGF0ZSBmb3IgaG9zdGFwL2lic3MuICBXZSBrbm93CisJCSAqIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4gKi8KIAogCQlhdnAtPmF2X2JjYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmc2MtPnNjX2JidWYsCi0JCQkJc3RydWN0IGF0aF9idWYsIGxpc3QpOworCQkJCQkJIHN0cnVjdCBhdGhfYnVmLCBsaXN0KTsKIAkJbGlzdF9kZWwoJmF2cC0+YXZfYmNidWYtPmxpc3QpOwogCi0JCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQIHx8CisJCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX0hPU1RBUCB8fAogCQkgICAgIShzYy0+c2NfYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9WRU9MKSkgewogCQkJaW50IHNsb3Q7CiAJCQkvKgpAQCAtNDA4LDE3ICszNTEsMTYgQEAKIAliZiA9IGF2cC0+YXZfYmNidWY7CiAJaWYgKGJmLT5iZl9tcGR1ICE9IE5VTEwpIHsKIAkJc2tiID0gKHN0cnVjdCBza19idWZmICopYmYtPmJmX21wZHU7Ci0JCWF0aF9za2JfdW5tYXBfc2luZ2xlKHNjLCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UsCi0JCQkJICAgICBnZXRfZG1hX21lbV9jb250ZXh0KGJmLCBiZl9kbWFjb250ZXh0KSk7CisJCXBjaV91bm1hcF9zaW5nbGUoc2MtPnBkZXYsIGJmLT5iZl9kbWFjb250ZXh0LAorCQkJCSBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+aGVhZCwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCWJmLT5iZl9tcGR1ID0gTlVMTDsKIAl9CiAKIAkvKgotCSAqIE5COiB0aGUgYmVhY29uIGRhdGEgYnVmZmVyIG11c3QgYmUgMzItYml0IGFsaWduZWQ7Ci0JICogd2UgYXNzdW1lIHRoZSB3YnVmIHJvdXRpbmVzIHdpbGwgcmV0dXJuIHVzIHNvbWV0aGluZwotCSAqIHdpdGggdGhpcyBhbGlnbm1lbnQgKHBlcmhhcHMgc2hvdWxkIGFzc2VydCkuCi0JICogRklYTUU6IEZpbGwgYXZwLT5hdl9ib2ZmLmJvX3RpbSxhdnAtPmF2X2J0eGN0bC50eHBvd2VyIGFuZAorCSAqIE5COiB0aGUgYmVhY29uIGRhdGEgYnVmZmVyIG11c3QgYmUgMzItYml0IGFsaWduZWQuCisJICogRklYTUU6IEZpbGwgYXZwLT5hdl9idHhjdGwudHhwb3dlciBhbmQKIAkgKiBhdnAtPmF2X2J0eGN0bC5zaG9ydFByZWFtYmxlCiAJICovCiAJc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoc2MtPmh3LCBhdnAtPmF2X2lmX2RhdGEpOwpAQCAtNDI4LDYgKzM3MCw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXRzdGFtcCA9ICgoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhKS0+dS5iZWFjb24udGltZXN0YW1wOworCXNjLT5iY190c3RhbXAgPSBsZTY0X3RvX2NwdSh0c3RhbXApOworCiAJLyoKIAkgKiBDYWxjdWxhdGUgYSBUU0YgYWRqdXN0bWVudCBmYWN0b3IgcmVxdWlyZWQgZm9yCiAJICogc3RhZ2dlcmVkIGJlYWNvbnMuICBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoZSBmb3JtYXQKQEAgLTQzOSw5ICszODQsOCBAQAogCQlfX2xlNjQgdmFsOwogCQlpbnQgaW50dmFsOwogCi0JCS8qIEZJWE1FOiBVc2UgZGVmYXVsdCB2YWx1ZSBmb3Igbm93OiBTdWppdGggKi8KLQotCQlpbnR2YWwgPSBBVEhfREVGQVVMVF9CSU5UVkFMOworCQlpbnR2YWwgPSBzYy0+aHctPmNvbmYuYmVhY29uX2ludCA/CisJCQlzYy0+aHctPmNvbmYuYmVhY29uX2ludCA6IEFUSF9ERUZBVUxUX0JJTlRWQUw7CiAKIAkJLyoKIAkJICogVGhlIGJlYWNvbiBpbnRlcnZhbCBpcyBpbiBUVSdzOyB0aGUgVFNGIGluIHVzZWNzLgpAQCAtNDYyLDEyICs0MDYsMTQgQEAKIAkJCV9fZnVuY19fLCAic3RhZ2dlciIsCiAJCQlhdnAtPmF2X2JzbG90LCBpbnR2YWwsICh1bnNpZ25lZCBsb25nIGxvbmcpdHNmYWRqdXN0KTsKIAotCQl3aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQkJbWVtY3B5KCZ3aFsxXSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJCW1lbWNweSgmaGRyWzFdLCAmdmFsLCBzaXplb2YodmFsKSk7CiAJfQogCi0JYmYtPmJmX2J1Zl9hZGRyID0gYXRoX3NrYl9tYXBfc2luZ2xlKHNjLCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UsCi0JCWdldF9kbWFfbWVtX2NvbnRleHQoYmYsIGJmX2RtYWNvbnRleHQpKTsKKwliZi0+YmZfYnVmX2FkZHIgPSBiZi0+YmZfZG1hY29udGV4dCA9CisJCXBjaV9tYXBfc2luZ2xlKHNjLT5wZGV2LCBza2ItPmRhdGEsCisJCQkgICAgICAgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsCisJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CiAJYmYtPmJmX21wZHUgPSBza2I7CiAKIAlyZXR1cm4gMDsKQEAgLTQ3Nyw5ICs0MjMsOCBAQAogICogIFJlY2xhaW0gYmVhY29uIHJlc291cmNlcyBhbmQgcmV0dXJuIGJ1ZmZlciB0byB0aGUgcG9vbC4KICAqCiAgKiAgQ2hlY2tzIHRoZSBWQVAgdG8gcHV0IHRoZSBiZWFjb24gZnJhbWUgYnVmZmVyIGJhY2sgdG8gdGhlIEFUSCBvYmplY3QKLSAqICBxdWV1ZSwgYW5kIGRlLWFsbG9jYXRlcyBhbnkgd2J1ZiBmcmFtZXMgdGhhdCB3ZXJlIHNlbnQgYXMgQ0FCIHRyYWZmaWMuCisgKiAgcXVldWUsIGFuZCBkZS1hbGxvY2F0ZXMgYW55IHNrYnMgdGhhdCB3ZXJlIHNlbnQgYXMgQ0FCIHRyYWZmaWMuCiAqLwotCiB2b2lkIGF0aF9iZWFjb25fcmV0dXJuKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3ZhcCAqYXZwKQogewogCWlmIChhdnAtPmF2X2JjYnVmICE9IE5VTEwpIHsKQEAgLTQ5Myw4ICs0MzgsOSBAQAogCQliZiA9IGF2cC0+YXZfYmNidWY7CiAJCWlmIChiZi0+YmZfbXBkdSAhPSBOVUxMKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopYmYtPmJmX21wZHU7Ci0JCQlhdGhfc2tiX3VubWFwX3NpbmdsZShzYywgc2tiLCBQQ0lfRE1BX1RPREVWSUNFLAotCQkJCWdldF9kbWFfbWVtX2NvbnRleHQoYmYsIGJmX2RtYWNvbnRleHQpKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2MtPnBkZXYsIGJmLT5iZl9kbWFjb250ZXh0LAorCQkJCQkgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQliZi0+YmZfbXBkdSA9IE5VTEw7CiAJCX0KQEAgLTUwNSw0NCArNDUxLDE0IEBACiB9CiAKIC8qCi0gKiAgUmVjbGFpbSBiZWFjb24gcmVzb3VyY2VzIGFuZCByZXR1cm4gYnVmZmVyIHRvIHRoZSBwb29sLgotICoKLSAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhbnkgd2J1ZiBmcmFtZXMgdGhhdCBhcmUgc3RpbGwgYXR0YWNoZWQgdG8gdGhlCi0gKiAgYmVhY29uIGJ1ZmZlcnMgaW4gdGhlIEFUSCBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkZS1hbGxvY2F0ZQotICogIGFueSB3YnVmIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIHRyYW5zbWl0IHF1ZXVlIGFuZCBoYXZlIG5vdCB5ZXQgcmV0dXJuZWQKLSAqICB0byB0aGUgQVRIIG9iamVjdC4KLSovCi0KLXZvaWQgYXRoX2JlYWNvbl9mcmVlKHN0cnVjdCBhdGhfc29mdGMgKnNjKQotewotCXN0cnVjdCBhdGhfYnVmICpiZjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmYsICZzYy0+c2NfYmJ1ZiwgbGlzdCkgewotCQlpZiAoYmYtPmJmX21wZHUgIT0gTlVMTCkgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBiZi0+YmZfbXBkdTsKLQkJCWF0aF9za2JfdW5tYXBfc2luZ2xlKHNjLCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UsCi0JCQkJZ2V0X2RtYV9tZW1fY29udGV4dChiZiwgYmZfZG1hY29udGV4dCkpOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCWJmLT5iZl9tcGR1ID0gTlVMTDsKLQkJfQotCX0KLX0KLQotLyoKICAqIFRhc2tsZXQgZm9yIFNlbmRpbmcgQmVhY29ucwogICoKICAqIFRyYW5zbWl0IG9uZSBvciBtb3JlIGJlYWNvbiBmcmFtZXMgYXQgU1dCQS4gIER5bmFtaWMgdXBkYXRlcyB0byB0aGUgZnJhbWUKICAqIGNvbnRlbnRzIGFyZSBkb25lIGFzIG5lZWRlZCBhbmQgdGhlIHNsb3QgdGltZSBpcyBhbHNvIGFkanVzdGVkIGJhc2VkIG9uCiAgKiBjdXJyZW50IHN0YXRlLgotICoKLSAqIFRoaXMgdGFza2xldCBpcyBub3Qgc2NoZWR1bGVkLCBpdCdzIGNhbGxlZCBpbiBJU1IgY29udGV4dC4KICovCi0KIHZvaWQgYXRoOWtfYmVhY29uX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewotI2RlZmluZSBUU0ZfVE9fVFUoX2gsX2wpCQkJCQlcCi0JKCgoKHUzMikoX2gpKSA8PCAyMikgfCAoKCh1MzIpKF9sKSkgPj4gMTApKQotCiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSAoc3RydWN0IGF0aF9zb2Z0YyAqKWRhdGE7CiAJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfYnVmICpiZiA9IE5VTEw7CkBAIC01NTUsNyArNDcxLDcgQEAKIAl1MzIgdHNmdHU7CiAJdTE2IGludHZhbDsKIAotCWlmIChzYy0+c2Nfbm9yZXNldCkgeworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9OT19SRVNFVCkgewogCQlzaG93X2N5Y2xlcyA9IGF0aDlrX2h3X0dldE1pYkN5Y2xlQ291bnRzUGN0KGFoLAogCQkJCQkJCSAgICAmcnhfY2xlYXIsCiAJCQkJCQkJICAgICZyeF9mcmFtZSwKQEAgLTU2OCw2ICs0ODQsOCBAQAogCSAqIGFuZCB3YWl0IGZvciB0aGUgbmV4dC4gIE1pc3NlZCBiZWFjb25zIGluZGljYXRlCiAJICogYSBwcm9ibGVtIGFuZCBzaG91bGQgbm90IG9jY3VyLiAgSWYgd2UgbWlzcyB0b28KIAkgKiBtYW55IGNvbnNlY3V0aXZlIGJlYWNvbnMgcmVzZXQgdGhlIGRldmljZS4KKwkgKgorCSAqIEZJWE1FOiBDbGVhbiB1cCB0aGlzIG1lc3MgISEKIAkgKi8KIAlpZiAoYXRoOWtfaHdfbnVtdHhwZW5kaW5nKGFoLCBzYy0+c2NfYmhhbHEpICE9IDApIHsKIAkJc2MtPnNjX2JtaXNzY291bnQrKzsKQEAgLTU3NywyNSArNDk1LDIyIEBACiAJCSAqICAgICAgKGluIHRoYXQgbGF5ZXIpLgogCQkgKi8KIAkJaWYgKHNjLT5zY19ibWlzc2NvdW50IDwgQlNUVUNLX1RIUkVTSCkgewotCQkJaWYgKHNjLT5zY19ub3Jlc2V0KSB7CisJCQlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfTk9fUkVTRVQpIHsKIAkJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0JFQUNPTiwKIAkJCQkJIiVzOiBtaXNzZWQgJXUgY29uc2VjdXRpdmUgYmVhY29uc1xuIiwKIAkJCQkJX19mdW5jX18sIHNjLT5zY19ibWlzc2NvdW50KTsKIAkJCQlpZiAoc2hvd19jeWNsZXMpIHsKIAkJCQkJLyoKLQkJCQkJICogRGlzcGxheSBjeWNsZSBjb3VudGVyIHN0YXRzCi0JCQkJCSAqIGZyb20gSFcgdG8gYWlkZSBpbiBkZWJ1ZyBvZgotCQkJCQkgKiBzdGlja2luZXNzLgorCQkJCQkgKiBEaXNwbGF5IGN5Y2xlIGNvdW50ZXIgc3RhdHMgZnJvbSBIVworCQkJCQkgKiB0byBhaWRlIGluIGRlYnVnIG9mIHN0aWNraW5lc3MuCiAJCQkJCSAqLwotCQkJCQlEUFJJTlRGKHNjLAotCQkJCQkJQVRIX0RCR19CRUFDT04sCisJCQkJCURQUklOVEYoc2MsIEFUSF9EQkdfQkVBQ09OLAogCQkJCQkJIiVzOiBidXN5IHRpbWVzOiByeF9jbGVhcj0lZCwgIgogCQkJCQkJInJ4X2ZyYW1lPSVkLCB0eF9mcmFtZT0lZFxuIiwKIAkJCQkJCV9fZnVuY19fLCByeF9jbGVhciwgcnhfZnJhbWUsCiAJCQkJCQl0eF9mcmFtZSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJRFBSSU5URihzYywKLQkJCQkJCUFUSF9EQkdfQkVBQ09OLAorCQkJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0JFQUNPTiwKIAkJCQkJCSIlczogdW5hYmxlIHRvIG9idGFpbiAiCiAJCQkJCQkiYnVzeSB0aW1lc1xuIiwgX19mdW5jX18pOwogCQkJCX0KQEAgLTYwNSwxMCArNTIwLDkgQEAKIAkJCQkJX19mdW5jX18sIHNjLT5zY19ibWlzc2NvdW50KTsKIAkJCX0KIAkJfSBlbHNlIGlmIChzYy0+c2NfYm1pc3Njb3VudCA+PSBCU1RVQ0tfVEhSRVNIKSB7Ci0JCQlpZiAoc2MtPnNjX25vcmVzZXQpIHsKKwkJCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9OT19SRVNFVCkgewogCQkJCWlmIChzYy0+c2NfYm1pc3Njb3VudCA9PSBCU1RVQ0tfVEhSRVNIKSB7Ci0JCQkJCURQUklOVEYoc2MsCi0JCQkJCQlBVEhfREJHX0JFQUNPTiwKKwkJCQkJRFBSSU5URihzYywgQVRIX0RCR19CRUFDT04sCiAJCQkJCQkiJXM6IGJlYWNvbiBpcyBvZmZpY2lhbGx5ICIKIAkJCQkJCSJzdHVja1xuIiwgX19mdW5jX18pOwogCQkJCQlhdGg5a19od19kbWFSZWdEdW1wKGFoKTsKQEAgLTYyMCwxMyArNTM0LDEyIEBACiAJCQkJYXRoX2JzdHVja19wcm9jZXNzKHNjKTsKIAkJCX0KIAkJfQotCiAJCXJldHVybjsKIAl9CisKIAlpZiAoc2MtPnNjX2JtaXNzY291bnQgIT0gMCkgewotCQlpZiAoc2MtPnNjX25vcmVzZXQpIHsKLQkJCURQUklOVEYoc2MsCi0JCQkJQVRIX0RCR19CRUFDT04sCisJCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9OT19SRVNFVCkgeworCQkJRFBSSU5URihzYywgQVRIX0RCR19CRUFDT04sCiAJCQkJIiVzOiByZXN1bWUgYmVhY29uIHhtaXQgYWZ0ZXIgJXUgbWlzc2VzXG4iLAogCQkJCV9fZnVuY19fLCBzYy0+c2NfYm1pc3Njb3VudCk7CiAJCX0gZWxzZSB7CkBAIC02NDMsMTcgKzU1NiwxOSBAQAogCSAqIG9uIHRoZSB0c2YgdG8gc2FmZWd1YXJkIGFnYWluc3QgbWlzc2luZyBhbiBzd2JhLgogCSAqLwogCi0JLyogRklYTUU6IFVzZSBkZWZhdWx0IHZhbHVlIGZvciBub3cgLSBTdWppdGggKi8KLQlpbnR2YWwgPSBBVEhfREVGQVVMVF9CSU5UVkFMOworCWludHZhbCA9IHNjLT5ody0+Y29uZi5iZWFjb25faW50ID8KKwkJc2MtPmh3LT5jb25mLmJlYWNvbl9pbnQgOiBBVEhfREVGQVVMVF9CSU5UVkFMOwogCiAJdHNmID0gYXRoOWtfaHdfZ2V0dHNmNjQoYWgpOwogCXRzZnR1ID0gVFNGX1RPX1RVKHRzZj4+MzIsIHRzZik7CiAJc2xvdCA9ICgodHNmdHUgJSBpbnR2YWwpICogQVRIX0JDQlVGKSAvIGludHZhbDsKIAlpZl9pZCA9IHNjLT5zY19ic2xvdFsoc2xvdCArIDEpICUgQVRIX0JDQlVGXTsKKwogCURQUklOVEYoc2MsIEFUSF9EQkdfQkVBQ09OLAotCQkJIiVzOiBzbG90ICVkIFt0c2YgJWxsdSB0c2Z0dSAldSBpbnR2YWwgJXVdIGlmX2lkICVkXG4iLAotCQkJX19mdW5jX18sIHNsb3QsICh1bnNpZ25lZCBsb25nIGxvbmcpIHRzZiwgdHNmdHUsCi0JCQlpbnR2YWwsIGlmX2lkKTsKKwkJIiVzOiBzbG90ICVkIFt0c2YgJWxsdSB0c2Z0dSAldSBpbnR2YWwgJXVdIGlmX2lkICVkXG4iLAorCQlfX2Z1bmNfXywgc2xvdCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0c2YsIHRzZnR1LAorCQlpbnR2YWwsIGlmX2lkKTsKKwogCWJmYWRkciA9IDA7CiAJaWYgKGlmX2lkICE9IEFUSF9JRl9JRF9BTlkpIHsKIAkJYmYgPSBhdGhfYmVhY29uX2dlbmVyYXRlKHNjLCBpZl9pZCk7CkBAIC03MDQsMjIgKzYxOSwyMCBAQAogCiAJCXNjLT5hc3RfYmVfeG1pdCArPSBiYzsgICAgIC8qIFhYWCBwZXItdmFwPyAqLwogCX0KLSN1bmRlZiBUU0ZfVE9fVFUKIH0KIAogLyoKICAqICBUYXNrbGV0IGZvciBCZWFjb24gU3R1Y2sgcHJvY2Vzc2luZwogICoKICAqICBQcm9jZXNzaW5nIGZvciBCZWFjb24gU3R1Y2suCi0gKiAgQmFzaWNhbGx5IGNhbGxzIHRoZSBhdGhfaW50ZXJuYWxfcmVzZXQgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIGNoaXAuCisgKiAgQmFzaWNhbGx5IHJlc2V0cyB0aGUgY2hpcC4KICovCi0KIHZvaWQgYXRoX2JzdHVja19wcm9jZXNzKHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewogCURQUklOVEYoc2MsIEFUSF9EQkdfQkVBQ09OLAogCQkiJXM6IHN0dWNrIGJlYWNvbjsgcmVzZXR0aW5nIChibWlzcyBjb3VudCAldSlcbiIsCiAJCV9fZnVuY19fLCBzYy0+c2NfYm1pc3Njb3VudCk7Ci0JYXRoX2ludGVybmFsX3Jlc2V0KHNjKTsKKwlhdGhfcmVzZXQoc2MsIGZhbHNlKTsKIH0KIAogLyoKQEAgLTczNyw0MCArNjUwLDMyIEBACiAgKiBpbnRlcnJ1cHQgd2hlbiB3ZSBzdG9wIHNlZWluZyBiZWFjb25zIGZyb20gdGhlIEFQCiAgKiB3ZSd2ZSBhc3NvY2lhdGVkIHdpdGguCiAgKi8KLQogdm9pZCBhdGhfYmVhY29uX2NvbmZpZyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGlmX2lkKQogewotI2RlZmluZSBUU0ZfVE9fVFUoX2gsX2wpCQkJCQlcCi0JKCgoKHUzMikoX2gpKSA8PCAyMikgfCAoKCh1MzIpKF9sKSkgPj4gMTApKQogCXN0cnVjdCBhdGhfaGFsICphaCA9IHNjLT5zY19haDsKLQl1MzIgbmV4dHRidHQsIGludHZhbDsKIAlzdHJ1Y3QgYXRoX2JlYWNvbl9jb25maWcgY29uZjsKIAllbnVtIGF0aDlrX29wbW9kZSBhdl9vcG1vZGU7CisJdTMyIG5leHR0YnR0LCBpbnR2YWw7CiAKIAlpZiAoaWZfaWQgIT0gQVRIX0lGX0lEX0FOWSkKIAkJYXZfb3Btb2RlID0gc2MtPnNjX3ZhcHNbaWZfaWRdLT5hdl9vcG1vZGU7CiAJZWxzZQotCQlhdl9vcG1vZGUgPSBzYy0+c2Nfb3Btb2RlOworCQlhdl9vcG1vZGUgPSBzYy0+c2NfYWgtPmFoX29wbW9kZTsKIAotCW1lbXplcm8oJmNvbmYsIHNpemVvZihzdHJ1Y3QgYXRoX2JlYWNvbl9jb25maWcpKTsKKwltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihzdHJ1Y3QgYXRoX2JlYWNvbl9jb25maWcpKTsKIAotCS8qIEZJWE1FOiBVc2UgZGVmYXVsdCB2YWx1ZXMgZm9yIG5vdyAtIFN1aml0aCAqLwotCS8qIFF1ZXJ5IGJlYWNvbiBjb25maWd1cmF0aW9uIGZpcnN0ICovCi0JLyoKLQkgKiBQcm90b2NvbCBzdGFjayBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyBiZWFjb24gY29uZmlndXJhdGlvbiwKLQkgKiB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KLQkgKi8KLQljb25mLmJlYWNvbl9pbnRlcnZhbCA9IEFUSF9ERUZBVUxUX0JJTlRWQUw7CisJY29uZi5iZWFjb25faW50ZXJ2YWwgPSBzYy0+aHctPmNvbmYuYmVhY29uX2ludCA/CisJCXNjLT5ody0+Y29uZi5iZWFjb25faW50IDogQVRIX0RFRkFVTFRfQklOVFZBTDsKIAljb25mLmxpc3Rlbl9pbnRlcnZhbCA9IDE7CiAJY29uZi5kdGltX3BlcmlvZCA9IGNvbmYuYmVhY29uX2ludGVydmFsOwogCWNvbmYuZHRpbV9jb3VudCA9IDE7CiAJY29uZi5ibWlzc190aW1lb3V0ID0gQVRIX0RFRkFVTFRfQk1JU1NfTElNSVQgKiBjb25mLmJlYWNvbl9pbnRlcnZhbDsKIAogCS8qIGV4dHJhY3QgdHN0YW1wIGZyb20gbGFzdCBiZWFjb24gYW5kIGNvbnZlcnQgdG8gVFUgKi8KLQluZXh0dGJ0dCA9IFRTRl9UT19UVShnZXRfdW5hbGlnbmVkX2xlMzIoY29uZi51Lmxhc3RfdHN0YW1wICsgNCksCi0JCQkgICAgIGdldF91bmFsaWduZWRfbGUzMihjb25mLnUubGFzdF90c3RhbXApKTsKKwluZXh0dGJ0dCA9IFRTRl9UT19UVShzYy0+YmNfdHN0YW1wID4+IDMyLCBzYy0+YmNfdHN0YW1wKTsKKwogCS8qIFhYWCBjb25kaXRpb25hbGl6ZSBtdWx0aS1ic3Mgc3VwcG9ydD8gKi8KLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX0hPU1RBUCkgeworCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX0hPU1RBUCkgewogCQkvKgogCQkgKiBGb3IgbXVsdGktYnNzIGFwIHN1cHBvcnQgYmVhY29ucyBhcmUgZWl0aGVyIHN0YWdnZXJlZAogCQkgKiBldmVubHkgb3ZlciBOIHNsb3RzIG9yIGJ1cnN0IHRvZ2V0aGVyLiAgRm9yIHRoZSBmb3JtZXIKQEAgLTc4NCwxNCArNjg5LDE2IEBACiAJCWludHZhbCA9IGNvbmYuYmVhY29uX2ludGVydmFsICYgQVRIOUtfQkVBQ09OX1BFUklPRDsKIAl9CiAKLQlpZiAobmV4dHRidHQgPT0gMCkgICAgICAvKiBlLmcuIGZvciBhcCBtb2RlICovCisJaWYgKG5leHR0YnR0ID09IDApCS8qIGUuZy4gZm9yIGFwIG1vZGUgKi8KIAkJbmV4dHRidHQgPSBpbnR2YWw7Ci0JZWxzZSBpZiAoaW50dmFsKSAgICAgICAgLyogTkI6IGNhbiBiZSAwIGZvciBtb25pdG9yIG1vZGUgKi8KKwllbHNlIGlmIChpbnR2YWwpCS8qIE5COiBjYW4gYmUgMCBmb3IgbW9uaXRvciBtb2RlICovCiAJCW5leHR0YnR0ID0gcm91bmR1cChuZXh0dGJ0dCwgaW50dmFsKTsKKwogCURQUklOVEYoc2MsIEFUSF9EQkdfQkVBQ09OLCAiJXM6IG5leHR0YnR0ICV1IGludHZhbCAldSAoJXUpXG4iLAogCQlfX2Z1bmNfXywgbmV4dHRidHQsIGludHZhbCwgY29uZi5iZWFjb25faW50ZXJ2YWwpOworCiAJLyogQ2hlY2sgZm9yIEFUSDlLX01fSE9TVEFQIGFuZCBzY19ub3N0YWJlYWNvbnMgZm9yIFdEUyBjbGllbnQgKi8KLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX1NUQSkgeworCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX1NUQSkgewogCQlzdHJ1Y3QgYXRoOWtfYmVhY29uX3N0YXRlIGJzOwogCQl1NjQgdHNmOwogCQl1MzIgdHNmdHU7CkBAIC04MDMsMTkgKzcxMCwxOSBAQAogCQkgKiBsYXN0IGJlYWNvbiB3ZSByZWNlaXZlZCAod2hpY2ggbWF5IGJlIG5vbmUpLgogCQkgKi8KIAkJZHRpbXBlcmlvZCA9IGNvbmYuZHRpbV9wZXJpb2Q7Ci0JCWlmIChkdGltcGVyaW9kIDw9IDApICAgICAgICAvKiBOQjogMCBpZiBub3Qga25vd24gKi8KKwkJaWYgKGR0aW1wZXJpb2QgPD0gMCkJCS8qIE5COiAwIGlmIG5vdCBrbm93biAqLwogCQkJZHRpbXBlcmlvZCA9IDE7CiAJCWR0aW1jb3VudCA9IGNvbmYuZHRpbV9jb3VudDsKLQkJaWYgKGR0aW1jb3VudCA+PSBkdGltcGVyaW9kKSAgICAvKiBOQjogc2FuaXR5IGNoZWNrICovCi0JCQlkdGltY291bnQgPSAwOyAgICAgIC8qIFhYWD8gKi8KLQkJY2ZwcGVyaW9kID0gMTsgICAgICAgICAgLyogTkI6IG5vIFBDRiBzdXBwb3J0IHlldCAqLworCQlpZiAoZHRpbWNvdW50ID49IGR0aW1wZXJpb2QpCS8qIE5COiBzYW5pdHkgY2hlY2sgKi8KKwkJCWR0aW1jb3VudCA9IDA7CisJCWNmcHBlcmlvZCA9IDE7CQkJLyogTkI6IG5vIFBDRiBzdXBwb3J0IHlldCAqLwogCQljZnBjb3VudCA9IDA7CiAKIAkJc2xlZXBkdXJhdGlvbiA9IGNvbmYubGlzdGVuX2ludGVydmFsICogaW50dmFsOwogCQlpZiAoc2xlZXBkdXJhdGlvbiA8PSAwKQogCQkJc2xlZXBkdXJhdGlvbiA9IGludHZhbDsKIAotI2RlZmluZSBGVURHRSAgIDIKKyNkZWZpbmUgRlVER0UgMgogCQkvKgogCQkgKiBQdWxsIG5leHR0YnR0IGZvcndhcmQgdG8gcmVmbGVjdCB0aGUgY3VycmVudAogCQkgKiBUU0YgYW5kIGNhbGN1bGF0ZSBkdGltK2NmcCBzdGF0ZSBmb3IgdGhlIHJlc3VsdC4KQEAgLTgzMSw3ICs3MzgsNyBAQAogCQkJfQogCQl9IHdoaWxlIChuZXh0dGJ0dCA8IHRzZnR1KTsKICN1bmRlZiBGVURHRQotCQltZW16ZXJvKCZicywgc2l6ZW9mKGJzKSk7CisJCW1lbXNldCgmYnMsIDAsIHNpemVvZihicykpOwogCQlicy5ic19pbnR2YWwgPSBpbnR2YWw7CiAJCWJzLmJzX25leHR0YnR0ID0gbmV4dHRidHQ7CiAJCWJzLmJzX2R0aW1wZXJpb2QgPSBkdGltcGVyaW9kKmludHZhbDsKQEAgLTgzOSw2ICs3NDYsNyBAQAogCQlicy5ic19jZnBwZXJpb2QgPSBjZnBwZXJpb2QqYnMuYnNfZHRpbXBlcmlvZDsKIAkJYnMuYnNfY2ZwbmV4dCA9IGJzLmJzX25leHRkdGltICsgY2ZwY291bnQqYnMuYnNfZHRpbXBlcmlvZDsKIAkJYnMuYnNfY2ZwbWF4ZHVyYXRpb24gPSAwOworCiAJCS8qCiAJCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbnMgdG8gbWlzcwogCQkgKiBiZWZvcmUgdGFraW5nIGEgQk1JU1MgaW50ZXJydXB0LiAgVGhlIGNvbmZpZ3VyYXRpb24KQEAgLTg0Nyw5ICs3NTUsOCBAQAogCQkgKiByZXN1bHQgdG8gYXQgbW9zdCAxNSBiZWFjb25zLgogCQkgKi8KIAkJaWYgKHNsZWVwZHVyYXRpb24gPiBpbnR2YWwpIHsKLQkJCWJzLmJzX2JtaXNzdGhyZXNob2xkID0KLQkJCQljb25mLmxpc3Rlbl9pbnRlcnZhbCAqCi0JCQkJCUFUSF9ERUZBVUxUX0JNSVNTX0xJTUlUIC8gMjsKKwkJCWJzLmJzX2JtaXNzdGhyZXNob2xkID0gY29uZi5saXN0ZW5faW50ZXJ2YWwgKgorCQkJCUFUSF9ERUZBVUxUX0JNSVNTX0xJTUlUIC8gMjsKIAkJfSBlbHNlIHsKIAkJCWJzLmJzX2JtaXNzdGhyZXNob2xkID0KIAkJCQlESVZfUk9VTkRfVVAoY29uZi5ibWlzc190aW1lb3V0LCBpbnR2YWwpOwpAQCAtODY5LDggKzc3Niw4IEBACiAJCSAqIFhYWCBmaXhlZCBhdCAxMDBtcwogCQkgKi8KIAotCQlicy5ic19zbGVlcGR1cmF0aW9uID0KLQkJCXJvdW5kdXAoSUVFRTgwMjExX01TX1RPX1RVKDEwMCksIHNsZWVwZHVyYXRpb24pOworCQlicy5ic19zbGVlcGR1cmF0aW9uID0gcm91bmR1cChJRUVFODAyMTFfTVNfVE9fVFUoMTAwKSwKKwkJCQkJICAgICAgc2xlZXBkdXJhdGlvbik7CiAJCWlmIChicy5ic19zbGVlcGR1cmF0aW9uID4gYnMuYnNfZHRpbXBlcmlvZCkKIAkJCWJzLmJzX3NsZWVwZHVyYXRpb24gPSBicy5ic19kdGltcGVyaW9kOwogCkBAIC04ODYsMTkgKzc5MywxOSBAQAogCQkJImNmcDpwZXJpb2QgJXUgIgogCQkJIm1heGR1ciAldSAiCiAJCQkibmV4dCAldSAiCi0JCQkidGltb2Zmc2V0ICV1XG4iCi0JCQksIF9fZnVuY19fCi0JCQksICh1bnNpZ25lZCBsb25nIGxvbmcpdHNmLCB0c2Z0dQotCQkJLCBicy5ic19pbnR2YWwKLQkJCSwgYnMuYnNfbmV4dHRidHQKLQkJCSwgYnMuYnNfZHRpbXBlcmlvZAotCQkJLCBicy5ic19uZXh0ZHRpbQotCQkJLCBicy5ic19ibWlzc3RocmVzaG9sZAotCQkJLCBicy5ic19zbGVlcGR1cmF0aW9uCi0JCQksIGJzLmJzX2NmcHBlcmlvZAotCQkJLCBicy5ic19jZnBtYXhkdXJhdGlvbgotCQkJLCBicy5ic19jZnBuZXh0Ci0JCQksIGJzLmJzX3RpbW9mZnNldAorCQkJInRpbW9mZnNldCAldVxuIiwKKwkJCV9fZnVuY19fLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0c2YsIHRzZnR1LAorCQkJYnMuYnNfaW50dmFsLAorCQkJYnMuYnNfbmV4dHRidHQsCisJCQlicy5ic19kdGltcGVyaW9kLAorCQkJYnMuYnNfbmV4dGR0aW0sCisJCQlicy5ic19ibWlzc3RocmVzaG9sZCwKKwkJCWJzLmJzX3NsZWVwZHVyYXRpb24sCisJCQlicy5ic19jZnBwZXJpb2QsCisJCQlicy5ic19jZnBtYXhkdXJhdGlvbiwKKwkJCWJzLmJzX2NmcG5leHQsCisJCQlicy5ic190aW1vZmZzZXQKIAkJCSk7CiAKIAkJYXRoOWtfaHdfc2V0X2ludGVycnVwdHMoYWgsIDApOwpAQCAtOTExLDEyICs4MTgsMTIgQEAKIAkJYXRoOWtfaHdfc2V0X2ludGVycnVwdHMoYWgsIDApOwogCQlpZiAobmV4dHRidHQgPT0gaW50dmFsKQogCQkJaW50dmFsIHw9IEFUSDlLX0JFQUNPTl9SRVNFVF9UU0Y7Ci0JCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSUJTUykgeworCQlpZiAoc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9JQlNTKSB7CiAJCQkvKgogCQkJICogUHVsbCBuZXh0dGJ0dCBmb3J3YXJkIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQKLQkJCSAqIFRTRiAuCisJCQkgKiBUU0YKIAkJCSAqLwotI2RlZmluZSBGVURHRSAgIDIKKyNkZWZpbmUgRlVER0UgMgogCQkJaWYgKCEoaW50dmFsICYgQVRIOUtfQkVBQ09OX1JFU0VUX1RTRikpIHsKIAkJCQl0c2YgPSBhdGg5a19od19nZXR0c2Y2NChhaCk7CiAJCQkJdHNmdHUgPSBUU0ZfVE9fVFUoKHUzMikodHNmPj4zMiksCkBAIC05NDMsNyArODUwLDcgQEAKIAkJCWlmICghKGFoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfVkVPTCkpCiAJCQkJc2MtPnNjX2ltYXNrIHw9IEFUSDlLX0lOVF9TV0JBOwogCQkJYXRoX2JlYWNvbnFfY29uZmlnKHNjKTsKLQkJfSBlbHNlIGlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQKSB7CisJCX0gZWxzZSBpZiAoc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9IT1NUQVApIHsKIAkJCS8qCiAJCQkgKiBJbiBBUCBtb2RlIHdlIGVuYWJsZSB0aGUgYmVhY29uIHRpbWVycyBhbmQKIAkJCSAqIFNXQkEgaW50ZXJydXB0cyB0byBwcmVwYXJlIGJlYWNvbiBmcmFtZXMuCkBAIC05NTksMTEgKzg2NiwxMCBAQAogCQkgKiBXaGVuIHVzaW5nIGEgc2VsZi1saW5rZWQgYmVhY29uIGRlc2NyaXB0b3IgaW4KIAkJICogaWJzcyBtb2RlIGxvYWQgaXQgb25jZSBoZXJlLgogCQkgKi8KLQkJaWYgKHNjLT5zY19vcG1vZGUgPT0gQVRIOUtfTV9JQlNTICYmCisJCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX0lCU1MgJiYKIAkJICAgIChhaC0+YWhfY2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1ZFT0wpKQogCQkJYXRoX2JlYWNvbl9zdGFydF9hZGhvYyhzYywgMCk7CiAJfQotI3VuZGVmIFRTRl9UT19UVQogfQogCiAvKiBGdW5jdGlvbiB0byBjb2xsZWN0IGJlYWNvbiByc3NpIGRhdGEgYW5kIHJlc3luYyBiZWFjb24gaWYgbmVjZXNzYXJ5ICovCkBAIC05NzUsNSArODgxLDUgQEAKIAkgKiBiZWFjb24gZnJhbWUgd2UganVzdCByZWNlaXZlZC4KIAkgKi8KIAlhdGhfYmVhY29uX2NvbmZpZyhzYywgaWZfaWQpOwotCXNjLT5zY19iZWFjb25zID0gMTsKKwlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfQkVBQ09OUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2NvcmUuYwppbmRleCBmNmM0NTI4Li5jNTAzM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvY29yZS5jCkBAIC0yMSw5ICsyMSw2IEBACiAKIHN0YXRpYyBpbnQgYXRoX291dGRvb3I7CQkvKiBlbmFibGUgb3V0ZG9vciB1c2UgKi8KIAotc3RhdGljIGNvbnN0IHU4IGF0aF9iY2FzdF9tYWNbRVRIX0FMRU5dID0KLSAgICB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKLQogc3RhdGljIHUzMiBhdGhfY2hhaW5tYXNrX3NlbF91cF9yc3NpX3RocmVzID0KIAlBVEhfQ0hBSU5NQVNLX1NFTF9VUF9SU1NJX1RIUkVTOwogc3RhdGljIHUzMiBhdGhfY2hhaW5tYXNrX3NlbF9kb3duX3Jzc2lfdGhyZXMgPQpAQCAtNTQsMTAgKzUxLDggQEAKICAqICBTZXQgY3VycmVudCBvcGVyYXRpbmcgbW9kZQogICoKICAqICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFuZCBmaWxscyB0aGUgcmF0ZSB0YWJsZSBpbiB0aGUgQVRIIG9iamVjdCBiYXNlZAotICogIG9uIHRoZSBvcGVyYXRpbmcgbW9kZS4gIFRoZSBibGluayByYXRlcyBhcmUgYWxzbyBzZXQgdXAgaGVyZSwgYWx0aG91Z2gKLSAqICB0aGV5IGhhdmUgYmVlbiBzdXBlcmNlZWRlZCBieSB0aGUgYXRoX2xlZCBtb2R1bGUuCisgKiAgb24gdGhlIG9wZXJhdGluZyBtb2RlLgogKi8KLQogc3RhdGljIHZvaWQgYXRoX3NldGN1cm1vZGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGVudW0gd2lyZWxlc3NfbW9kZSBtb2RlKQogewogCWNvbnN0IHN0cnVjdCBhdGg5a19yYXRlX3RhYmxlICpydDsKQEAgLTcwLDcgKzY1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcnQtPnJhdGVDb3VudDsgaSsrKQogCQlzYy0+c2Nfcml4bWFwW3J0LT5pbmZvW2ldLnJhdGVDb2RlXSA9ICh1OCkgaTsKIAotCW1lbXplcm8oc2MtPnNjX2h3bWFwLCBzaXplb2Yoc2MtPnNjX2h3bWFwKSk7CisJbWVtc2V0KHNjLT5zY19od21hcCwgMCwgc2l6ZW9mKHNjLT5zY19od21hcCkpOwogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogCQl1OCBpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbaV07CiAKQEAgLTIzNSw3ICsyMzAsNyBAQAogICogIERldGVybWluZSBtb2RlIGZyb20gY2hhbm5lbCBmbGFncwogICoKICAqICBUaGlzIHJvdXRpbmUgd2lsbCBwcm92aWRlIHRoZSBlbnVtZXJhdGVkIFdJUkVMRVNTU19NT0RFIHZhbHVlIGJhc2VkCi0gKiAgb24gdGhlIHNldHRpbmdzIG9mIHRoZSBjaGFubmVsIGZsYWdzLiAgSWYgaG8gdmFsaWQgc2V0IG9mIGZsYWdzCisgKiAgb24gdGhlIHNldHRpbmdzIG9mIHRoZSBjaGFubmVsIGZsYWdzLiAgSWYgbm8gdmFsaWQgc2V0IG9mIGZsYWdzCiAgKiAgZXhpc3QsIHRoZSBsb3dlc3QgbW9kZSAoMTFiKSBpcyBzZWxlY3RlZC4KICovCiAKQEAgLTI2MCw3ICsyNTUsOCBAQAogCWVsc2UgaWYgKGNoYW4tPmNoYW5tb2RlID09IENIQU5ORUxfR19IVDQwTUlOVVMpCiAJCXJldHVybiBBVEg5S19NT0RFXzExTkdfSFQ0ME1JTlVTOwogCi0JLyogTkI6IHNob3VsZCBub3QgZ2V0IGhlcmUgKi8KKwlXQVJOX09OKDEpOyAvKiBzaG91bGQgbm90IGdldCBoZXJlICovCisKIAlyZXR1cm4gQVRIOUtfTU9ERV8xMUI7CiB9CiAKQEAgLTI3NSwxNCArMjcxLDEyIEBACiB7CiAJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOwogCi0JRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogaW52YWxpZCAldVxuIiwKLQkJX19mdW5jX18sIHNjLT5zY19pbnZhbGlkKTsKKwlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBpbnZhbGlkICVsZFxuIiwKKwkJX19mdW5jX18sIHNjLT5zY19mbGFncyAmIFNDX09QX0lOVkFMSUQpOwogCiAJLyoKIAkgKiBTaHV0ZG93biB0aGUgaGFyZHdhcmUgYW5kIGRyaXZlcjoKIAkgKiAgICBzdG9wIG91dHB1dCBmcm9tIGFib3ZlCi0JICogICAgcmVzZXQgODAyLjExIHN0YXRlIG1hY2hpbmUKLQkgKiAgICAgIChzZW5kcyBzdGF0aW9uIGRlYXNzb2MvZGVhdXRoIGZyYW1lcykKIAkgKiAgICB0dXJuIG9mZiB0aW1lcnMKIAkgKiAgICBkaXNhYmxlIGludGVycnVwdHMKIAkgKiAgICBjbGVhciB0cmFuc21pdCBtYWNoaW5lcnkKQEAgLTI5NCwxMCArMjg4LDggQEAKIAkgKiBoYXJkd2FyZSBpcyBnb25lIChpbnZhbGlkKS4KIAkgKi8KIAotCWlmICghc2MtPnNjX2ludmFsaWQpCi0JCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCAwKTsKIAlhdGhfZHJhaW50eHEoc2MsIGZhbHNlKTsKLQlpZiAoIXNjLT5zY19pbnZhbGlkKSB7CisJaWYgKCEoc2MtPnNjX2ZsYWdzICYgU0NfT1BfSU5WQUxJRCkpIHsKIAkJYXRoX3N0b3ByZWN2KHNjKTsKIAkJYXRoOWtfaHdfcGh5X2Rpc2FibGUoYWgpOwogCX0gZWxzZQpAQCAtMzA3LDU2ICsyOTksNiBAQAogfQogCiAvKgotICogIFN0YXJ0IFNjYW4KLSAqCi0gKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzdGFydGluZyBhIGNoYW5uZWwgc2Nhbi4gIEl0IHdpbGwgcGVyZm9ybQotICogIHBvd2VyIHNhdmUgd2FrZXVwIHByb2Nlc3NpbmcsIHNldCB0aGUgZmlsdGVyIGZvciB0aGUgc2NhbiwgYW5kIGdldCB0aGUKLSAqICBjaGlwIHJlYWR5IHRvIHNlbmQgYnJvYWRjYXN0IHBhY2tldHMgb3V0IGR1cmluZyB0aGUgc2Nhbi4KLSovCi0KLXZvaWQgYXRoX3NjYW5fc3RhcnQoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCi17Ci0Jc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOwotCXUzMiByZmlsdDsKLQl1MzIgbm93ID0gKHUzMikgamlmZmllc190b19tc2VjcyhnZXRfdGltZXN0YW1wKCkpOwotCi0Jc2MtPnNjX3NjYW5uaW5nID0gMTsKLQlyZmlsdCA9IGF0aF9jYWxjcnhmaWx0ZXIoc2MpOwotCWF0aDlrX2h3X3NldHJ4ZmlsdGVyKGFoLCByZmlsdCk7Ci0JYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChhaCwgYXRoX2JjYXN0X21hYywgMCk7Ci0KLQkvKiBSZXN0b3JlIHByZXZpb3VzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUuICovCi0KLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVkLiUwM2QgfCAlczogUlggZmlsdGVyIDB4JXggYWlkIDBcbiIsCi0JCW5vdyAvIDEwMDAsIG5vdyAlIDEwMDAsIF9fZnVuY19fLCByZmlsdCk7Ci19Ci0KLS8qCi0gKiAgU2NhbiBFbmQKLSAqCi0gKiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgc2NhbiBpcyBjb21wbGV0ZWQuICBUaGlzCi0gKiAgd2lsbCBzZXQgdGhlIGZpbHRlcnMgYmFjayB0byBub3JtYWwgb3BlcmF0aW5nIG1vZGUsIHNldCB0aGUgQlNTSUQgdG8gdGhlCi0gKiAgY29ycmVjdCB2YWx1ZSwgYW5kIHJlc3RvcmUgdGhlIHBvd2VyIHNhdmUgc3RhdGUuCi0qLwotCi12b2lkIGF0aF9zY2FuX2VuZChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKLXsKLQlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0JdTMyIHJmaWx0OwotCXUzMiBub3cgPSAodTMyKSBqaWZmaWVzX3RvX21zZWNzKGdldF90aW1lc3RhbXAoKSk7Ci0KLQlzYy0+c2Nfc2Nhbm5pbmcgPSAwOwotCS8qIFJlcXVlc3QgZm9yIGEgZnVsbCByZXNldCBkdWUgdG8gcnggcGFja2V0IGZpbHRlciBjaGFuZ2VzICovCi0Jc2MtPnNjX2Z1bGxfcmVzZXQgPSAxOwotCXJmaWx0ID0gYXRoX2NhbGNyeGZpbHRlcihzYyk7Ci0JYXRoOWtfaHdfc2V0cnhmaWx0ZXIoYWgsIHJmaWx0KTsKLQlhdGg5a19od193cml0ZV9hc3NvY2lkKGFoLCBzYy0+c2NfY3VyYnNzaWQsIHNjLT5zY19jdXJhaWQpOwotCi0JRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlZC4lMDNkIHwgJXM6IFJYIGZpbHRlciAweCV4IGFpZCAweCV4XG4iLAotCQlub3cgLyAxMDAwLCBub3cgJSAxMDAwLCBfX2Z1bmNfXywgcmZpbHQsIHNjLT5zY19jdXJhaWQpOwotfQotCi0vKgogICogU2V0IHRoZSBjdXJyZW50IGNoYW5uZWwKICAqCiAgKiBTZXQvY2hhbmdlIGNoYW5uZWxzLiAgSWYgdGhlIGNoYW5uZWwgaXMgcmVhbGx5IGJlaW5nIGNoYW5nZWQsIGl0J3MgZG9uZQpAQCAtMzY3LDI1ICszMDksMjMgQEAKIHsKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CiAJYm9vbCBmYXN0Y2MgPSB0cnVlLCBzdG9wcGVkOwotCWVudW0gYXRoOWtfaHRfbWFjbW9kZSBodF9tYWNtb2RlOwogCi0JaWYgKHNjLT5zY19pbnZhbGlkKQkvKiBpZiB0aGUgZGV2aWNlIGlzIGludmFsaWQgb3IgcmVtb3ZlZCAqLworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKSAvKiB0aGUgZGV2aWNlIGlzIGludmFsaWQgb3IgcmVtb3ZlZCAqLwogCQlyZXR1cm4gLUVJTzsKIAogCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLAogCQkiJXM6ICV1ICgldSBNSHopIC0+ICV1ICgldSBNSHopLCBjZmxhZ3M6JXhcbiIsCiAJCV9fZnVuY19fLAotCQlhdGg5a19od19taHoyaWVlZShhaCwgc2MtPnNjX2N1cmNoYW4uY2hhbm5lbCwKLQkJCQkgIHNjLT5zY19jdXJjaGFuLmNoYW5uZWxGbGFncyksCi0JCXNjLT5zY19jdXJjaGFuLmNoYW5uZWwsCisJCWF0aDlrX2h3X21oejJpZWVlKGFoLCBzYy0+c2NfYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWwsCisJCQkJICBzYy0+c2NfYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWxGbGFncyksCisJCXNjLT5zY19haC0+YWhfY3VyY2hhbi0+Y2hhbm5lbCwKIAkJYXRoOWtfaHdfbWh6MmllZWUoYWgsIGhjaGFuLT5jaGFubmVsLCBoY2hhbi0+Y2hhbm5lbEZsYWdzKSwKIAkJaGNoYW4tPmNoYW5uZWwsIGhjaGFuLT5jaGFubmVsRmxhZ3MpOwogCi0JaHRfbWFjbW9kZSA9IGF0aF9jd21fbWFjbW9kZShzYyk7Ci0KLQlpZiAoaGNoYW4tPmNoYW5uZWwgIT0gc2MtPnNjX2N1cmNoYW4uY2hhbm5lbCB8fAotCSAgICBoY2hhbi0+Y2hhbm5lbEZsYWdzICE9IHNjLT5zY19jdXJjaGFuLmNoYW5uZWxGbGFncyB8fAotCSAgICBzYy0+c2NfdXBkYXRlX2NoYWlubWFzayB8fCBzYy0+c2NfZnVsbF9yZXNldCkgeworCWlmIChoY2hhbi0+Y2hhbm5lbCAhPSBzYy0+c2NfYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWwgfHwKKwkgICAgaGNoYW4tPmNoYW5uZWxGbGFncyAhPSBzYy0+c2NfYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWxGbGFncyB8fAorCSAgICAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfQ0hBSU5NQVNLX1VQREFURSkgfHwKKwkgICAgKHNjLT5zY19mbGFncyAmIFNDX09QX0ZVTExfUkVTRVQpKSB7CiAJCWludCBzdGF0dXM7CiAJCS8qCiAJCSAqIFRoaXMgaXMgb25seSBwZXJmb3JtZWQgaWYgdGhlIGNoYW5uZWwgc2V0dGluZ3MgaGF2ZQpAQCAtNDA0LDE1ICszNDQsMTYgQEAKIAkJICogdG8gZmx1c2ggZGF0YSBmcmFtZXMgYWxyZWFkeSBpbiBxdWV1ZSBiZWNhdXNlIG9mCiAJCSAqIGNoYW5naW5nIGNoYW5uZWwuICovCiAKLQkJaWYgKCFzdG9wcGVkIHx8IHNjLT5zY19mdWxsX3Jlc2V0KQorCQlpZiAoIXN0b3BwZWQgfHwgKHNjLT5zY19mbGFncyAmIFNDX09QX0ZVTExfUkVTRVQpKQogCQkJZmFzdGNjID0gZmFsc2U7CiAKIAkJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKLQkJaWYgKCFhdGg5a19od19yZXNldChhaCwgc2MtPnNjX29wbW9kZSwgaGNoYW4sCi0JCQkJCWh0X21hY21vZGUsIHNjLT5zY190eF9jaGFpbm1hc2ssCi0JCQkJCXNjLT5zY19yeF9jaGFpbm1hc2ssCi0JCQkJCXNjLT5zY19odF9leHRwcm90c3BhY2luZywKLQkJCQkJZmFzdGNjLCAmc3RhdHVzKSkgeworCQlpZiAoIWF0aDlrX2h3X3Jlc2V0KGFoLCBoY2hhbiwKKwkJCQkgICAgc2MtPnNjX2h0X2luZm8udHhfY2hhbl93aWR0aCwKKwkJCQkgICAgc2MtPnNjX3R4X2NoYWlubWFzaywKKwkJCQkgICAgc2MtPnNjX3J4X2NoYWlubWFzaywKKwkJCQkgICAgc2MtPnNjX2h0X2V4dHByb3RzcGFjaW5nLAorCQkJCSAgICBmYXN0Y2MsICZzdGF0dXMpKSB7CiAJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAogCQkJCSIlczogdW5hYmxlIHRvIHJlc2V0IGNoYW5uZWwgJXUgKCV1TWh6KSAiCiAJCQkJImZsYWdzIDB4JXggaGFsIHN0YXR1cyAldVxuIiwgX19mdW5jX18sCkBAIC00MjQsOSArMzY1LDggQEAKIAkJfQogCQlzcGluX3VubG9ja19iaCgmc2MtPnNjX3Jlc2V0bG9jayk7CiAKLQkJc2MtPnNjX2N1cmNoYW4gPSAqaGNoYW47Ci0JCXNjLT5zY191cGRhdGVfY2hhaW5tYXNrID0gMDsKLQkJc2MtPnNjX2Z1bGxfcmVzZXQgPSAwOworCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX0NIQUlOTUFTS19VUERBVEU7CisJCXNjLT5zY19mbGFncyAmPSB+U0NfT1BfRlVMTF9SRVNFVDsKIAogCQkvKiBSZS1lbmFibGUgcnggZnJhbWV3b3JrICovCiAJCWlmIChhdGhfc3RhcnRyZWN2KHNjKSAhPSAwKSB7CkBAIC00NzcsNyArNDE3LDcgQEAKIHsKIAlzdHJ1Y3QgYXRoX2NoYWlubWFza19zZWwgKmNtID0gJmFuLT5hbl9jaGFpbm1hc2tfc2VsOwogCi0JbWVtemVybyhjbSwgc2l6ZW9mKHN0cnVjdCBhdGhfY2hhaW5tYXNrX3NlbCkpOworCW1lbXNldChjbSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGhfY2hhaW5tYXNrX3NlbCkpOwogCiAJY20tPmN1cl90eF9tYXNrID0gc2MtPnNjX3R4X2NoYWlubWFzazsKIAljbS0+Y3VyX3J4X21hc2sgPSBzYy0+c2NfcnhfY2hhaW5tYXNrOwpAQCAtNTM3LDcgKzQ3Nyw3IEBACiAKIHZvaWQgYXRoX3VwZGF0ZV9jaGFpbm1hc2soc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpc19odCkKIHsKLQlzYy0+c2NfdXBkYXRlX2NoYWlubWFzayA9IDE7CisJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX0NIQUlOTUFTS19VUERBVEU7CiAJaWYgKGlzX2h0KSB7CiAJCXNjLT5zY190eF9jaGFpbm1hc2sgPSBzYy0+c2NfYWgtPmFoX2NhcHMudHhfY2hhaW5tYXNrOwogCQlzYy0+c2NfcnhfY2hhaW5tYXNrID0gc2MtPnNjX2FoLT5haF9jYXBzLnJ4X2NoYWlubWFzazsKQEAgLTU1MCw2NiArNDkwLDEyNiBAQAogCQlfX2Z1bmNfXywgc2MtPnNjX3R4X2NoYWlubWFzaywgc2MtPnNjX3J4X2NoYWlubWFzayk7CiB9CiAKKy8qKioqKioqLworLyogQU5JICovCisvKioqKioqKi8KKworLyoKKyAqICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdGhlIHBlcmlvZGljIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGZ1bmN0aW9uCisgKiAgdGhhdCBpcyB1c2VkIHRvIGFkanVzdCBhbmQgb3B0aW1pemUgdGhlIGNoaXAgcGVyZm9ybWFuY2UuICBUaGlzCisgKiAgdGFrZXMgZW52aXJvbm1lbnRhbCBjaGFuZ2VzIChsb2NhdGlvbiwgdGVtcGVyYXR1cmUpIGludG8gYWNjb3VudC4KKyAqICBXaGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlLCBpdCByZXNjaGVkdWxlcyBpdHNlbGYgZGVwZW5kaW5nIG9uIHRoZQorICogIGFwcHJvcHJpYXRlIGludGVydmFsIHRoYXQgd2FzIGNhbGN1bGF0ZWQuCisgKi8KKworc3RhdGljIHZvaWQgYXRoX2FuaV9jYWxpYnJhdGUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjOworCXN0cnVjdCBhdGhfaGFsICphaDsKKwlib29sIGxvbmdjYWwgPSBmYWxzZTsKKwlib29sIHNob3J0Y2FsID0gZmFsc2U7CisJYm9vbCBhbmlmbGFnID0gZmFsc2U7CisJdW5zaWduZWQgaW50IHRpbWVzdGFtcCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7CisJdTMyIGNhbF9pbnRlcnZhbDsKKworCXNjID0gKHN0cnVjdCBhdGhfc29mdGMgKilkYXRhOworCWFoID0gc2MtPnNjX2FoOworCisJLyoKKwkqIGRvbid0IGNhbGlicmF0ZSB3aGVuIHdlJ3JlIHNjYW5uaW5nLgorCSogd2UgYXJlIG1vc3QgbGlrZWx5IG5vdCBvbiBvdXIgaG9tZSBjaGFubmVsLgorCSovCisJaWYgKHNjLT5yeF9maWx0ZXIgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykKKwkJcmV0dXJuOworCisJLyogTG9uZyBjYWxpYnJhdGlvbiBydW5zIGluZGVwZW5kZW50bHkgb2Ygc2hvcnQgY2FsaWJyYXRpb24uICovCisJaWYgKCh0aW1lc3RhbXAgLSBzYy0+c2NfYW5pLnNjX2xvbmdjYWxfdGltZXIpID49IEFUSF9MT05HX0NBTElOVEVSVkFMKSB7CisJCWxvbmdjYWwgPSB0cnVlOworCQlEUFJJTlRGKHNjLCBBVEhfREJHX0FOSSwgIiVzOiBsb25nY2FsIEAlbHVcbiIsCisJCQlfX2Z1bmNfXywgamlmZmllcyk7CisJCXNjLT5zY19hbmkuc2NfbG9uZ2NhbF90aW1lciA9IHRpbWVzdGFtcDsKKwl9CisKKwkvKiBTaG9ydCBjYWxpYnJhdGlvbiBhcHBsaWVzIG9ubHkgd2hpbGUgc2NfY2FsZG9uZSBpcyBmYWxzZSAqLworCWlmICghc2MtPnNjX2FuaS5zY19jYWxkb25lKSB7CisJCWlmICgodGltZXN0YW1wIC0gc2MtPnNjX2FuaS5zY19zaG9ydGNhbF90aW1lcikgPj0KKwkJICAgIEFUSF9TSE9SVF9DQUxJTlRFUlZBTCkgeworCQkJc2hvcnRjYWwgPSB0cnVlOworCQkJRFBSSU5URihzYywgQVRIX0RCR19BTkksICIlczogc2hvcnRjYWwgQCVsdVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgamlmZmllcyk7CisJCQlzYy0+c2NfYW5pLnNjX3Nob3J0Y2FsX3RpbWVyID0gdGltZXN0YW1wOworCQkJc2MtPnNjX2FuaS5zY19yZXNldGNhbF90aW1lciA9IHRpbWVzdGFtcDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgodGltZXN0YW1wIC0gc2MtPnNjX2FuaS5zY19yZXNldGNhbF90aW1lcikgPj0KKwkJICAgIEFUSF9SRVNUQVJUX0NBTElOVEVSVkFMKSB7CisJCQlhdGg5a19od19yZXNldF9jYWx2YWxpZChhaCwgYWgtPmFoX2N1cmNoYW4sCisJCQkJCQkmc2MtPnNjX2FuaS5zY19jYWxkb25lKTsKKwkJCWlmIChzYy0+c2NfYW5pLnNjX2NhbGRvbmUpCisJCQkJc2MtPnNjX2FuaS5zY19yZXNldGNhbF90aW1lciA9IHRpbWVzdGFtcDsKKwkJfQorCX0KKworCS8qIFZlcmlmeSB3aGV0aGVyIHdlIG11c3QgY2hlY2sgQU5JICovCisJaWYgKCh0aW1lc3RhbXAgLSBzYy0+c2NfYW5pLnNjX2NoZWNrYW5pX3RpbWVyKSA+PQorCSAgIEFUSF9BTklfUE9MTElOVEVSVkFMKSB7CisJCWFuaWZsYWcgPSB0cnVlOworCQlzYy0+c2NfYW5pLnNjX2NoZWNrYW5pX3RpbWVyID0gdGltZXN0YW1wOworCX0KKworCS8qIFNraXAgYWxsIHByb2Nlc3NpbmcgaWYgdGhlcmUncyBub3RoaW5nIHRvIGRvLiAqLworCWlmIChsb25nY2FsIHx8IHNob3J0Y2FsIHx8IGFuaWZsYWcpIHsKKwkJLyogQ2FsbCBBTkkgcm91dGluZSBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGFuaWZsYWcpCisJCQlhdGg5a19od19hbmlfbW9uaXRvcihhaCwgJnNjLT5zY19oYWxzdGF0cywKKwkJCQkJICAgICBhaC0+YWhfY3VyY2hhbik7CisKKwkJLyogUGVyZm9ybSBjYWxpYnJhdGlvbiBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGxvbmdjYWwgfHwgc2hvcnRjYWwpIHsKKwkJCWJvb2wgaXNjYWxkb25lID0gZmFsc2U7CisKKwkJCWlmIChhdGg5a19od19jYWxpYnJhdGUoYWgsIGFoLT5haF9jdXJjaGFuLAorCQkJCQkgICAgICAgc2MtPnNjX3J4X2NoYWlubWFzaywgbG9uZ2NhbCwKKwkJCQkJICAgICAgICZpc2NhbGRvbmUpKSB7CisJCQkJaWYgKGxvbmdjYWwpCisJCQkJCXNjLT5zY19hbmkuc2Nfbm9pc2VfZmxvb3IgPQorCQkJCQkJYXRoOWtfaHdfZ2V0Y2hhbl9ub2lzZShhaCwKKwkJCQkJCQkgICAgICAgYWgtPmFoX2N1cmNoYW4pOworCisJCQkJRFBSSU5URihzYywgQVRIX0RCR19BTkksCisJCQkJCSIlczogY2FsaWJyYXRlIGNoYW4gJXUvJXggbmY6ICVkXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCWFoLT5haF9jdXJjaGFuLT5jaGFubmVsLAorCQkJCQlhaC0+YWhfY3VyY2hhbi0+Y2hhbm5lbEZsYWdzLAorCQkJCQlzYy0+c2NfYW5pLnNjX25vaXNlX2Zsb29yKTsKKwkJCX0gZWxzZSB7CisJCQkJRFBSSU5URihzYywgQVRIX0RCR19BTlksCisJCQkJCSIlczogY2FsaWJyYXRlIGNoYW4gJXUvJXggZmFpbGVkXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCWFoLT5haF9jdXJjaGFuLT5jaGFubmVsLAorCQkJCQlhaC0+YWhfY3VyY2hhbi0+Y2hhbm5lbEZsYWdzKTsKKwkJCX0KKwkJCXNjLT5zY19hbmkuc2NfY2FsZG9uZSA9IGlzY2FsZG9uZTsKKwkJfQorCX0KKworCS8qCisJKiBTZXQgdGltZXIgaW50ZXJ2YWwgYmFzZWQgb24gcHJldmlvdXMgcmVzdWx0cy4KKwkqIFRoZSBpbnRlcnZhbCBtdXN0IGJlIHRoZSBzaG9ydGVzdCBuZWNlc3NhcnkgdG8gc2F0aXNmeSBBTkksCisJKiBzaG9ydCBjYWxpYnJhdGlvbiBhbmQgbG9uZyBjYWxpYnJhdGlvbi4KKwkqLworCisJY2FsX2ludGVydmFsID0gQVRIX0FOSV9QT0xMSU5URVJWQUw7CisJaWYgKCFzYy0+c2NfYW5pLnNjX2NhbGRvbmUpCisJCWNhbF9pbnRlcnZhbCA9IG1pbihjYWxfaW50ZXJ2YWwsICh1MzIpQVRIX1NIT1JUX0NBTElOVEVSVkFMKTsKKworCW1vZF90aW1lcigmc2MtPnNjX2FuaS50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoY2FsX2ludGVydmFsKSk7Cit9CisKIC8qKioqKioqKioqKioqKioqKiovCiAvKiBWQVAgbWFuYWdlbWVudCAqLwogLyoqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqICBWQVAgaW4gTGlzdGVuIG1vZGUKLSAqCi0gKiAgVGhpcyByb3V0aW5lIGJyaW5ncyB0aGUgVkFQIG91dCBvZiB0aGUgZG93biBzdGF0ZSBpbnRvIGEgImxpc3RlbiIgc3RhdGUKLSAqICB3aGVyZSBpdCB3YWl0cyBmb3IgYXNzb2NpYXRpb24gcmVxdWVzdHMuICBUaGlzIGlzIHVzZWQgaW4gQVAgYW5kIEFkSG9jCi0gKiAgbW9kZXMuCi0qLwotCi1pbnQgYXRoX3ZhcF9saXN0ZW4oc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpZl9pZCkKLXsKLQlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0Jc3RydWN0IGF0aF92YXAgKmF2cDsKLQl1MzIgcmZpbHQgPSAwOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCi0JYXZwID0gc2MtPnNjX3ZhcHNbaWZfaWRdOwotCWlmIChhdnAgPT0gTlVMTCkgewotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLCAiJXM6IGludmFsaWQgaW50ZXJmYWNlIGlkICV1XG4iLAotCQkJX19mdW5jX18sIGlmX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NMT1dfQU5UX0RJVgotCWF0aF9zbG93X2FudF9kaXZfc3RvcCgmc2MtPnNjX2FudGRpdik7Ci0jZW5kaWYKLQotCS8qIHVwZGF0ZSByYXRlY3RybCBhYm91dCB0aGUgbmV3IHN0YXRlICovCi0JYXRoX3JhdGVfbmV3c3RhdGUoc2MsIGF2cCk7Ci0KLQlyZmlsdCA9IGF0aF9jYWxjcnhmaWx0ZXIoc2MpOwotCWF0aDlrX2h3X3NldHJ4ZmlsdGVyKGFoLCByZmlsdCk7Ci0KLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX1NUQSB8fCBzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSUJTUykgewotCQltZW1jcHkoc2MtPnNjX2N1cmJzc2lkLCBhdGhfYmNhc3RfbWFjLCBFVEhfQUxFTik7Ci0JCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoYWgsIHNjLT5zY19jdXJic3NpZCwgc2MtPnNjX2N1cmFpZCk7Ci0JfSBlbHNlCi0JCXNjLT5zY19jdXJhaWQgPSAwOwotCi0JRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsCi0JCSIlczogUlggZmlsdGVyIDB4JXggYnNzaWQgJXMgYWlkIDB4JXhcbiIsCi0JCV9fZnVuY19fLCByZmlsdCwgcHJpbnRfbWFjKG1hYywKLQkJCXNjLT5zY19jdXJic3NpZCksIHNjLT5zY19jdXJhaWQpOwotCi0JLyoKLQkgKiBYWFhYCi0JICogRGlzYWJsZSBCTUlTUyBpbnRlcnJ1cHQgd2hlbiB3ZSdyZSBub3QgYXNzb2NpYXRlZAotCSAqLwotCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLAotCQlzYy0+c2NfaW1hc2sgJiB+KEFUSDlLX0lOVF9TV0JBIHwgQVRIOUtfSU5UX0JNSVNTKSk7Ci0Jc2MtPnNjX2ltYXNrICY9IH4oQVRIOUtfSU5UX1NXQkEgfCBBVEg5S19JTlRfQk1JU1MpOwotCS8qIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGJlYWNvbnMgd2hlbiBpdCBtb3ZlcyB0byBSVU4gKi8KLQlzYy0+c2NfYmVhY29ucyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50IGF0aF92YXBfYXR0YWNoKHN0cnVjdCBhdGhfc29mdGMgKnNjLAogCQkgICBpbnQgaWZfaWQsCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICppZl9kYXRhLApAQCAtNjQyLDIxICs2NDIsMTkgQEAKIAlpZiAoYXZwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtemVybyhhdnAsIHNpemVvZihzdHJ1Y3QgYXRoX3ZhcCkpOworCW1lbXNldChhdnAsIDAsIHNpemVvZihzdHJ1Y3QgYXRoX3ZhcCkpOwogCWF2cC0+YXZfaWZfZGF0YSA9IGlmX2RhdGE7CiAJLyogU2V0IHRoZSBWQVAgb3Btb2RlICovCiAJYXZwLT5hdl9vcG1vZGUgPSBvcG1vZGU7CiAJYXZwLT5hdl9ic2xvdCA9IC0xOwotCUlOSVRfTElTVF9IRUFEKCZhdnAtPmF2X21jYXN0cS5heHFfcSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF2cC0+YXZfbWNhc3RxLmF4cV9hY3EpOwotCXNwaW5fbG9ja19pbml0KCZhdnAtPmF2X21jYXN0cS5heHFfbG9jayk7CiAKLQlhdGg5a19od19zZXRfdHNmYWRqdXN0KHNjLT5zY19haCwgMSk7CisJaWYgKG9wbW9kZSA9PSBBVEg5S19NX0hPU1RBUCkKKwkJYXRoOWtfaHdfc2V0X3RzZmFkanVzdChzYy0+c2NfYWgsIDEpOwogCiAJc2MtPnNjX3ZhcHNbaWZfaWRdID0gYXZwOwogCXNjLT5zY19udmFwcysrOwogCS8qIFNldCB0aGUgZGV2aWNlIG9wbW9kZSAqLwotCXNjLT5zY19vcG1vZGUgPSBvcG1vZGU7CisJc2MtPnNjX2FoLT5haF9vcG1vZGUgPSBvcG1vZGU7CiAKIAkvKiBkZWZhdWx0IFZBUCBjb25maWd1cmF0aW9uICovCiAJYXZwLT5hdl9jb25maWcuYXZfZml4ZWRfcmF0ZXNldCA9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkU7CkBAIC02ODksOSArNjg3LDYgQEAKIAlhdGhfc3RvcHJlY3Yoc2MpOwkvKiBzdG9wIHJlY3Ygc2lkZSAqLwogCWF0aF9mbHVzaHJlY3Yoc2MpOwkvKiBmbHVzaCByZWN2IHF1ZXVlICovCiAKLQkvKiBSZWNsYWltIGFueSBwZW5kaW5nIG1jYXN0IGJ1ZnMgb24gdGhlIHZhcC4gKi8KLQlhdGhfdHhfZHJhaW50eHEoc2MsICZhdnAtPmF2X21jYXN0cSwgZmFsc2UpOwotCiAJa2ZyZWUoYXZwKTsKIAlzYy0+c2NfdmFwc1tpZl9pZF0gPSBOVUxMOwogCXNjLT5zY19udmFwcy0tOwpAQCAtNzI4LDkgKzcyMyw5IEBACiAJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOwogCWludCBzdGF0dXM7CiAJaW50IGVycm9yID0gMDsKLQllbnVtIGF0aDlrX2h0X21hY21vZGUgaHRfbWFjbW9kZSA9IGF0aF9jd21fbWFjbW9kZShzYyk7CiAKLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBtb2RlICVkXG4iLCBfX2Z1bmNfXywgc2MtPnNjX29wbW9kZSk7CisJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogbW9kZSAlZFxuIiwKKwkJX19mdW5jX18sIHNjLT5zY19haC0+YWhfb3Btb2RlKTsKIAogCS8qCiAJICogU3RvcCBhbnl0aGluZyBwcmV2aW91c2x5IHNldHVwLiAgVGhpcyBpcyBzYWZlCkBAIC03NTIsMTYgKzc0NywxNiBAQAogCSAqIGJlIGZvbGxvd2VkIGJ5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSBiaXRzCiAJICogYW5kIHRoZW4gc2V0dXAgb2YgdGhlIGludGVycnVwdCBtYXNrLgogCSAqLwotCXNjLT5zY19jdXJjaGFuID0gKmluaXRpYWxfY2hhbjsKIAogCXNwaW5fbG9ja19iaCgmc2MtPnNjX3Jlc2V0bG9jayk7Ci0JaWYgKCFhdGg5a19od19yZXNldChhaCwgc2MtPnNjX29wbW9kZSwgJnNjLT5zY19jdXJjaGFuLCBodF9tYWNtb2RlLAotCQkJICAgc2MtPnNjX3R4X2NoYWlubWFzaywgc2MtPnNjX3J4X2NoYWlubWFzaywKLQkJCSAgIHNjLT5zY19odF9leHRwcm90c3BhY2luZywgZmFsc2UsICZzdGF0dXMpKSB7CisJaWYgKCFhdGg5a19od19yZXNldChhaCwgaW5pdGlhbF9jaGFuLAorCQkJICAgIHNjLT5zY19odF9pbmZvLnR4X2NoYW5fd2lkdGgsCisJCQkgICAgc2MtPnNjX3R4X2NoYWlubWFzaywgc2MtPnNjX3J4X2NoYWlubWFzaywKKwkJCSAgICBzYy0+c2NfaHRfZXh0cHJvdHNwYWNpbmcsIGZhbHNlLCAmc3RhdHVzKSkgewogCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAogCQkJIiVzOiB1bmFibGUgdG8gcmVzZXQgaGFyZHdhcmU7IGhhbCBzdGF0dXMgJXUgIgogCQkJIihmcmVxICV1IGZsYWdzIDB4JXgpXG4iLCBfX2Z1bmNfXywgc3RhdHVzLAotCQkJc2MtPnNjX2N1cmNoYW4uY2hhbm5lbCwgc2MtPnNjX2N1cmNoYW4uY2hhbm5lbEZsYWdzKTsKKwkJCWluaXRpYWxfY2hhbi0+Y2hhbm5lbCwgaW5pdGlhbF9jaGFuLT5jaGFubmVsRmxhZ3MpOwogCQllcnJvciA9IC1FSU87CiAJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKIAkJZ290byBkb25lOwpAQCAtODAyLDcgKzc5Nyw4IEBACiAJICogTm90ZSB3ZSBvbmx5IGRvIHRoaXMgKGF0IHRoZSBtb21lbnQpIGZvciBzdGF0aW9uIG1vZGUuCiAJICovCiAJaWYgKGF0aDlrX2h3X3BoeWNvdW50ZXJzKGFoKSAmJgotCSAgICAoKHNjLT5zY19vcG1vZGUgPT0gQVRIOUtfTV9TVEEpIHx8IChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSUJTUykpKQorCSAgICAoKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fU1RBKSB8fAorCSAgICAgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fSUJTUykpKQogCQlzYy0+c2NfaW1hc2sgfD0gQVRIOUtfSU5UX01JQjsKIAkvKgogCSAqIFNvbWUgaGFyZHdhcmUgcHJvY2Vzc2VzIHRoZSBUSU0gSUUgYW5kIGZpcmVzIGFuCkBAIC04MTEsNyArODA3LDcgQEAKIAkgKiBlbmFibGUgdGhlIFRJTSBpbnRlcnJ1cHQgd2hlbiBvcGVyYXRpbmcgYXMgc3RhdGlvbi4KIAkgKi8KIAlpZiAoKGFoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRU5IQU5DRURQTSkgJiYKLQkgICAgKHNjLT5zY19vcG1vZGUgPT0gQVRIOUtfTV9TVEEpICYmCisJICAgIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX1NUQSkgJiYKIAkgICAgIXNjLT5zY19jb25maWcuc3dCZWFjb25Qcm9jZXNzKQogCQlzYy0+c2NfaW1hc2sgfD0gQVRIOUtfSU5UX1RJTTsKIAkvKgpAQCAtODIzLDM0ICs4MTksMzQgQEAKIAogCS8qIFhYWDogd2UgbXVzdCBtYWtlIHN1cmUgaC93IGlzIHJlYWR5IGFuZCBjbGVhciBpbnZhbGlkIGZsYWcKIAkgKiBiZWZvcmUgdHVybmluZyBvbiBpbnRlcnJ1cHQuICovCi0Jc2MtPnNjX2ludmFsaWQgPSAwOworCXNjLT5zY19mbGFncyAmPSB+U0NfT1BfSU5WQUxJRDsKIGRvbmU6CiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogUmVzZXQgdGhlIGhhcmR3YXJlIHcvbyBsb3Npbmcgb3BlcmF0aW9uYWwgc3RhdGUuICBUaGlzIGlzCi0gKiBiYXNpY2FsbHkgYSBtb3JlIGVmZmljaWVudCB3YXkgb2YgZG9pbmcgYXRoX3N0b3AsIGF0aF9pbml0LAotICogZm9sbG93ZWQgYnkgc3RhdGUgdHJhbnNpdGlvbnMgdG8gdGhlIGN1cnJlbnQgODAyLjExCi0gKiBvcGVyYXRpb25hbCBzdGF0ZS4gIFVzZWQgdG8gcmVjb3ZlciBmcm9tIGVycm9ycyByeCBvdmVycnVuCi0gKiBhbmQgdG8gcmVzZXQgdGhlIGhhcmR3YXJlIHdoZW4gcmYgZ2FpbiBzZXR0aW5ncyBtdXN0IGJlIHJlc2V0LgotICovCi0KLXN0YXRpYyBpbnQgYXRoX3Jlc2V0X3N0YXJ0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1MzIgZmxhZykKK2ludCBhdGhfcmVzZXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGJvb2wgcmV0cnlfdHgpCiB7CiAJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCWludCBzdGF0dXM7CisJaW50IGVycm9yID0gMDsKIAogCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCAwKTsJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JYXRoX2RyYWludHhxKHNjLCBmbGFnICYgUkVTRVRfUkVUUllfVFhRKTsJLyogc3RvcCB4bWl0IHNpZGUgKi8KLQlhdGhfc3RvcHJlY3Yoc2MpOwkvKiBzdG9wIHJlY3Ygc2lkZSAqLwotCWF0aF9mbHVzaHJlY3Yoc2MpOwkvKiBmbHVzaCByZWN2IHF1ZXVlICovCisJYXRoX2RyYWludHhxKHNjLCByZXRyeV90eCk7CS8qIHN0b3AgeG1pdCAqLworCWF0aF9zdG9wcmVjdihzYyk7CQkvKiBzdG9wIHJlY3YgKi8KKwlhdGhfZmx1c2hyZWN2KHNjKTsJCS8qIGZsdXNoIHJlY3YgcXVldWUgKi8KIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0aF9yZXNldF9lbmQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHUzMiBmbGFnKQotewotCXN0cnVjdCBhdGhfaGFsICphaCA9IHNjLT5zY19haDsKKwkvKiBSZXNldCBjaGlwICovCisJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKKwlpZiAoIWF0aDlrX2h3X3Jlc2V0KGFoLCBzYy0+c2NfYWgtPmFoX2N1cmNoYW4sCisJCQkgICAgc2MtPnNjX2h0X2luZm8udHhfY2hhbl93aWR0aCwKKwkJCSAgICBzYy0+c2NfdHhfY2hhaW5tYXNrLCBzYy0+c2NfcnhfY2hhaW5tYXNrLAorCQkJICAgIHNjLT5zY19odF9leHRwcm90c3BhY2luZywgZmFsc2UsICZzdGF0dXMpKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IHVuYWJsZSB0byByZXNldCBoYXJkd2FyZTsgaGFsIHN0YXR1cyAldVxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCQllcnJvciA9IC1FSU87CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKIAogCWlmIChhdGhfc3RhcnRyZWN2KHNjKSAhPSAwKQkvKiByZXN0YXJ0IHJlY3YgKi8KIAkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKQEAgLTg2MSwxNiArODU3LDE3IEBACiAJICogdGhhdCBjaGFuZ2VzIHRoZSBjaGFubmVsIHNvIHVwZGF0ZSBhbnkgc3RhdGUgdGhhdAogCSAqIG1pZ2h0IGNoYW5nZSBhcyBhIHJlc3VsdC4KIAkgKi8KLQlhdGhfc2V0Y3VybW9kZShzYywgYXRoX2NoYW4ybW9kZSgmc2MtPnNjX2N1cmNoYW4pKTsKKwlhdGhfc2V0Y3VybW9kZShzYywgYXRoX2NoYW4ybW9kZShzYy0+c2NfYWgtPmFoX2N1cmNoYW4pKTsKIAotCWF0aF91cGRhdGVfdHhwb3coc2MpOwkvKiB1cGRhdGUgdHggcG93ZXIgc3RhdGUgKi8KKwlhdGhfdXBkYXRlX3R4cG93KHNjKTsKIAotCWlmIChzYy0+c2NfYmVhY29ucykKKwlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfQkVBQ09OUykKIAkJYXRoX2JlYWNvbl9jb25maWcoc2MsIEFUSF9JRl9JRF9BTlkpOwkvKiByZXN0YXJ0IGJlYWNvbnMgKi8KKwogCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCBzYy0+c2NfaW1hc2spOwogCiAJLyogUmVzdGFydCB0aGUgdHhxICovCi0JaWYgKGZsYWcgJiBSRVNFVF9SRVRSWV9UWFEpIHsKKwlpZiAocmV0cnlfdHgpIHsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBBVEg5S19OVU1fVFhfUVVFVUVTOyBpKyspIHsKIAkJCWlmIChBVEhfVFhRX1NFVFVQKHNjLCBpKSkgewpAQCAtODgwLDI4ICs4NzcsNiBAQAogCQkJfQogCQl9CiAJfQotCXJldHVybiAwOwotfQotCi1pbnQgYXRoX3Jlc2V0KHN0cnVjdCBhdGhfc29mdGMgKnNjKQotewotCXN0cnVjdCBhdGhfaGFsICphaCA9IHNjLT5zY19haDsKLQlpbnQgc3RhdHVzOwotCWludCBlcnJvciA9IDA7Ci0JZW51bSBhdGg5a19odF9tYWNtb2RlIGh0X21hY21vZGUgPSBhdGhfY3dtX21hY21vZGUoc2MpOwotCi0JLyogTkI6IGluZGljYXRlIGNoYW5uZWwgY2hhbmdlIHNvIHdlIGRvIGEgZnVsbCByZXNldCAqLwotCXNwaW5fbG9ja19iaCgmc2MtPnNjX3Jlc2V0bG9jayk7Ci0JaWYgKCFhdGg5a19od19yZXNldChhaCwgc2MtPnNjX29wbW9kZSwgJnNjLT5zY19jdXJjaGFuLAotCQkJICAgaHRfbWFjbW9kZSwKLQkJCSAgIHNjLT5zY190eF9jaGFpbm1hc2ssIHNjLT5zY19yeF9jaGFpbm1hc2ssCi0JCQkgICBzYy0+c2NfaHRfZXh0cHJvdHNwYWNpbmcsIGZhbHNlLCAmc3RhdHVzKSkgewotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAotCQkJIiVzOiB1bmFibGUgdG8gcmVzZXQgaGFyZHdhcmU7IGhhbCBzdGF0dXMgJXVcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJZXJyb3IgPSAtRUlPOwotCX0KLQlzcGluX3VubG9ja19iaCgmc2MtPnNjX3Jlc2V0bG9jayk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC05MTEsNyArODg2LDcgQEAKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CiAKIAkvKiBObyBJL08gaWYgZGV2aWNlIGhhcyBiZWVuIHN1cnByaXNlIHJlbW92ZWQgKi8KLQlpZiAoc2MtPnNjX2ludmFsaWQpCisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX0lOVkFMSUQpCiAJCXJldHVybiAtRUlPOwogCiAJLyogU2h1dCBvZmYgdGhlIGludGVycnVwdCBiZWZvcmUgc2V0dGluZyBzYy0+c2NfaW52YWxpZCB0byAnMScgKi8KQEAgLTkxOSw3ICs4OTQsNyBAQAogCiAJLyogWFhYOiB3ZSBtdXN0IG1ha2Ugc3VyZSBoL3cgd2lsbCBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdAogCSAqIGJlZm9yZSBzZXR0aW5nIHRoZSBpbnZhbGlkIGZsYWcuICovCi0Jc2MtPnNjX2ludmFsaWQgPSAxOworCXNjLT5zY19mbGFncyB8PSBTQ19PUF9JTlZBTElEOwogCiAJLyogZGlzYWJsZSBIQUwgYW5kIHB1dCBoL3cgdG8gc2xlZXAgKi8KIAlhdGg5a19od19kaXNhYmxlKHNjLT5zY19haCk7CkBAIC05NDAsNyArOTE1LDcgQEAKIAlib29sIHNjaGVkID0gZmFsc2U7CiAKIAlkbyB7Ci0JCWlmIChzYy0+c2NfaW52YWxpZCkgeworCQlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfSU5WQUxJRCkgewogCQkJLyoKIAkJCSAqIFRoZSBoYXJkd2FyZSBpcyBub3QgcmVhZHkvcHJlc2VudCwgZG9uJ3QKIAkJCSAqIHRvdWNoIGFueXRoaW5nLiBOb3RlIHRoaXMgY2FuIGhhcHBlbiBlYXJseQpAQCAtMTA1MCw3ICsxMDI1LDcgQEAKIAogCWlmIChzdGF0dXMgJiBBVEg5S19JTlRfRkFUQUwpIHsKIAkJLyogbmVlZCBhIGNoaXAgcmVzZXQgKi8KLQkJYXRoX2ludGVybmFsX3Jlc2V0KHNjKTsKKwkJYXRoX3Jlc2V0KHNjLCBmYWxzZSk7CiAJCXJldHVybjsKIAl9IGVsc2UgewogCkBAIC0xMDkzLDEwICsxMDY4LDkgQEAKIAlpbnQgc3RhdHVzOwogCWludCBlcnJvciA9IDAsIGk7CiAJaW50IGNzeiA9IDA7Ci0JdTMyIHJkOwogCiAJLyogWFhYOiBoYXJkd2FyZSB3aWxsIG5vdCBiZSByZWFkeSB1bnRpbCBhdGhfb3BlbigpIGJlaW5nIGNhbGxlZCAqLwotCXNjLT5zY19pbnZhbGlkID0gMTsKKwlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfSU5WQUxJRDsKIAogCXNjLT5zY19kZWJ1ZyA9IERCR19ERUZBVUxUOwogCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IGRldmlkIDB4JXhcbiIsIF9fZnVuY19fLCBkZXZpZCk7CkBAIC0xMTI2LDggKzExMDAsOSBAQAogCX0KIAlzYy0+c2NfYWggPSBhaDsKIAotCS8qIEdldCB0aGUgY2hpcHNldC1zcGVjaWZpYyBhZ2dyIGxpbWl0LiAqLwotCXNjLT5zY19ydHNhZ2dybGltaXQgPSBhaC0+YWhfY2Fwcy5ydHNfYWdncl9saW1pdDsKKwkvKiBJbml0aWFsaXplcyB0aGUgbm9pc2UgZmxvb3IgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuCisJICogTGF0ZXIgb24gdGhpcyB3aWxsIGJlIHVwZGF0ZWQgZHVyaW5nIEFOSSBwcm9jZXNzaW5nLiAqLworCXNjLT5zY19hbmkuc2Nfbm9pc2VfZmxvb3IgPSBBVEhfREVGQVVMVF9OT0lTRV9GTE9PUjsKIAogCS8qIEdldCB0aGUgaGFyZHdhcmUga2V5IGNhY2hlIHNpemUuICovCiAJc2MtPnNjX2tleW1heCA9IGFoLT5haF9jYXBzLmtleWNhY2hlX3NpemU7CkBAIC0xMTYyLDE0ICsxMTM3LDEyIEBACiAJICogaXMgcmVzcG9zaWJsZSBmb3IgZmlsdGVyaW5nIHRoaXMgbGlzdCBiYXNlZCBvbiBzZXR0aW5ncwogCSAqIGxpa2UgdGhlIHBoeSBtb2RlLgogCSAqLwotCXJkID0gYWgtPmFoX2N1cnJlbnRSRDsKLQogCWVycm9yID0gYXRoX3NldHVwX2NoYW5uZWxzKHNjKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gYmFkOwogCiAJLyogZGVmYXVsdCB0byBTVEEgbW9kZSAqLwotCXNjLT5zY19vcG1vZGUgPSBBVEg5S19NX01PTklUT1I7CisJc2MtPnNjX2FoLT5haF9vcG1vZGUgPSBBVEg5S19NX01PTklUT1I7CiAKIAkvKiBTZXR1cCByYXRlIHRhYmxlcyAqLwogCkBAIC0xMjM4LDkgKzEyMTEsMTEgQEAKIAkJZ290byBiYWQyOwogCX0KIAorCXNldHVwX3RpbWVyKCZzYy0+c2NfYW5pLnRpbWVyLCBhdGhfYW5pX2NhbGlicmF0ZSwgKHVuc2lnbmVkIGxvbmcpc2MpOworCiAJc2MtPnNjX3JjID0gYXRoX3JhdGVfYXR0YWNoKGFoKTsKIAlpZiAoc2MtPnNjX3JjID09IE5VTEwpIHsKLQkJZXJyb3IgPSBFSU87CisJCWVycm9yID0gLUVJTzsKIAkJZ290byBiYWQyOwogCX0KIApAQCAtMTI4MCwyMCArMTI1NSwxMyBAQAogCiAJLyogMTFuIENhcGFiaWxpdGllcyAqLwogCWlmIChhaC0+YWhfY2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0hUKSB7Ci0JCXNjLT5zY190eGFnZ3IgPSAxOwotCQlzYy0+c2NfcnhhZ2dyID0gMTsKKwkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX1RYQUdHUjsKKwkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX1JYQUdHUjsKIAl9CiAKIAlzYy0+c2NfdHhfY2hhaW5tYXNrID0gYWgtPmFoX2NhcHMudHhfY2hhaW5tYXNrOwogCXNjLT5zY19yeF9jaGFpbm1hc2sgPSBhaC0+YWhfY2Fwcy5yeF9jaGFpbm1hc2s7CiAKLQkvKiBDb25maWd1cmF0aW9uIGZvciByeCBjaGFpbiBkZXRlY3Rpb24gKi8KLQlzYy0+c2NfcnhjaGFpbmRldGVjdF9yZWYgPSAwOwotCXNjLT5zY19yeGNoYWluZGV0ZWN0X3RocmVzaDVHSHogPSAzNTsKLQlzYy0+c2NfcnhjaGFpbmRldGVjdF90aHJlc2gyR0h6ID0gMzU7Ci0Jc2MtPnNjX3J4Y2hhaW5kZXRlY3RfZGVsdGE1R0h6ID0gMzA7Ci0Jc2MtPnNjX3J4Y2hhaW5kZXRlY3RfZGVsdGEyR0h6ID0gMzA7Ci0KIAlhdGg5a19od19zZXRjYXBhYmlsaXR5KGFoLCBBVEg5S19DQVBfRElWRVJTSVRZLCAxLCB0cnVlLCBOVUxMKTsKIAlzYy0+c2NfZGVmYW50ID0gYXRoOWtfaHdfZ2V0ZGVmYW50ZW5uYShhaCk7CiAKQEAgLTEzMzYsOCArMTMwNCwxMCBAQAogCiAJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlc1xuIiwgX19mdW5jX18pOwogCisJdGFza2xldF9raWxsKCZzYy0+aW50cl90cSk7CisJdGFza2xldF9raWxsKCZzYy0+YmNvbl90YXNrbGV0KTsKIAlhdGhfc3RvcChzYyk7Ci0JaWYgKCFzYy0+c2NfaW52YWxpZCkKKwlpZiAoIShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKSkKIAkJYXRoOWtfaHdfc2V0cG93ZXIoc2MtPnNjX2FoLCBBVEg5S19QTV9BV0FLRSk7CiAJYXRoX3JhdGVfZGV0YWNoKHNjLT5zY19yYyk7CiAJLyogY2xlYW51cCB0eCBxdWV1ZXMgKi8KQEAgLTEzNjQsNyArMTMzNCw3IEBACiAJYW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRoX25vZGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoYW4gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtemVybyhhbiwgc2l6ZW9mKCphbikpOworCW1lbXNldChhbiwgMCwgc2l6ZW9mKCphbikpOwogCiAJYW4tPmFuX3NjID0gc2M7CiAJbWVtY3B5KGFuLT5hbl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CkBAIC0xNDY0LDkgKzE0MzQsOSBAQAogCS8qIGlmIHN0YXRpb24gcmVhc3NvY2lhdGVzLCB0ZWFyIGRvd24gdGhlIGFnZ3JlZ2F0aW9uIHN0YXRlLiAqLwogCWlmICghaXNuZXcpIHsKIAkJZm9yICh0aWRubyA9IDA7IHRpZG5vIDwgV01FX05VTV9USUQ7IHRpZG5vKyspIHsKLQkJCWlmIChzYy0+c2NfdHhhZ2dyKQorCQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikKIAkJCQlhdGhfdHhfYWdncl90ZWFyZG93bihzYywgYW4sIHRpZG5vKTsKLQkJCWlmIChzYy0+c2NfcnhhZ2dyKQorCQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JYQUdHUikKIAkJCQlhdGhfcnhfYWdncl90ZWFyZG93bihzYywgYW4sIHRpZG5vKTsKIAkJfQogCX0KQEAgLTE3NTEsNyArMTcyMSw3IEBACiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBmYWlsMjsKIAl9Ci0JbWVtemVybyhiZiwgYnNpemUpOworCW1lbXNldChiZiwgMCwgYnNpemUpOwogCWRkLT5kZF9idWZwdHIgPSBiZjsKIAogCUlOSVRfTElTVF9IRUFEKGhlYWQpOwpAQCAtMTc4Myw3ICsxNzUzLDcgQEAKIAlwY2lfZnJlZV9jb25zaXN0ZW50KHNjLT5wZGV2LAogCQlkZC0+ZGRfZGVzY19sZW4sIGRkLT5kZF9kZXNjLCBkZC0+ZGRfZGVzY19wYWRkcik7CiBmYWlsOgotCW1lbXplcm8oZGQsIHNpemVvZigqZGQpKTsKKwltZW1zZXQoZGQsIDAsIHNpemVvZigqZGQpKTsKIAlyZXR1cm4gZXJyb3I7CiAjdW5kZWYgQVRIX0RFU0NfNEtCX0JPVU5EX0NIRUNLCiAjdW5kZWYgQVRIX0RFU0NfNEtCX0JPVU5EX05VTV9TS0lQUEVECkBAIC0xODA4LDIwICsxNzc4LDEzIEBACiAKIAlJTklUX0xJU1RfSEVBRChoZWFkKTsKIAlrZnJlZShkZC0+ZGRfYnVmcHRyKTsKLQltZW16ZXJvKGRkLCBzaXplb2YoKmRkKSk7CisJbWVtc2V0KGRkLCAwLCBzaXplb2YoKmRkKSk7CiB9CiAKIC8qKioqKioqKioqKioqLwogLyogVXRpbGl0aWVzICovCiAvKioqKioqKioqKioqKi8KIAotdm9pZCBhdGhfaW50ZXJuYWxfcmVzZXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCi17Ci0JYXRoX3Jlc2V0X3N0YXJ0KHNjLCAwKTsKLQlhdGhfcmVzZXQoc2MpOwotCWF0aF9yZXNldF9lbmQoc2MsIDApOwotfQotCiBpbnQgYXRoX2dldF9oYWxfcW51bSh1MTYgcXVldWUsIHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewogCWludCBxbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvY29yZS5oCmluZGV4IDY3M2IzZDguLmNiM2U2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9jb3JlLmgKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgogCiAjaW5jbHVkZSAiYXRoOWsuaCIKICNpbmNsdWRlICJyYy5oIgpAQCAtNzksMTEgKzgxLDggQEAKIAkJfQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotLyogWFhYOiByZW1vdmUgKi8KLSNkZWZpbmUgbWVtemVybyhfYnVmLCBfbGVuKSBtZW1zZXQoX2J1ZiwgMCwgX2xlbikKLQotI2RlZmluZSBnZXRfZG1hX21lbV9jb250ZXh0KHZhciwgZmllbGQpICgmKCh2YXIpLT5maWVsZCkpCi0jZGVmaW5lIGNvcHlfZG1hX21lbV9jb250ZXh0KGRzdCwgc3JjKSAgKCpkc3QgPSAqc3JjKQorI2RlZmluZSBUU0ZfVE9fVFUoX2gsX2wpIFwKKwkoKCgodTMyKShfaCkpIDw8IDIyKSB8ICgoKHUzMikoX2wpKSA+PiAxMCkpCiAKICNkZWZpbmUgQVRIOUtfQkhfU1RBVFVTX0lOVEFDVAkJMAogI2RlZmluZSBBVEg5S19CSF9TVEFUVVNfQ0hBTkdFCQkxCkBAIC05NSw2ICs5NCw4IEBACiAJcmV0dXJuICgoamlmZmllcyAvIEhaKSAqIDEwMDApICsgKGppZmZpZXMgJSBIWikgKiAoMTAwMCAvIEhaKTsKIH0KIAorc3RhdGljIGNvbnN0IHU4IGF0aF9iY2FzdF9tYWNbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCiAvKioqKioqKioqKioqKi8KIC8qIERlYnVnZ2luZyAqLwogLyoqKioqKioqKioqKiovCkBAIC0xNzUsNDIgKzE3NiwzOCBAQAogLyogRGVzY3JpcHRvciBNYW5hZ2VtZW50ICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIHBlciBidWZmZXIuIFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2Ugc2VlIHNrYnVmZgotY2hhaW5zIGlzIGR1ZSB0byBGRiBhZ2dyZWdhdGlvbiBpbiB0aGUgZHJpdmVyLiAqLwotI2RlZmluZQlBVEhfVFhERVNDCSAgICAxCi0vKiBpZiB0aGVyZSdzIG1vcmUgZnJhZ21lbnQgZm9yIHRoaXMgTVNEVSAqLwotI2RlZmluZSBBVEhfQkZfTU9SRV9NUERVICAgIDEKICNkZWZpbmUgQVRIX1RYQlVGX1JFU0VUKF9iZikgZG8gewkJCQlcCiAJCShfYmYpLT5iZl9zdGF0dXMgPSAwOwkJCQlcCiAJCShfYmYpLT5iZl9sYXN0YmYgPSBOVUxMOwkJCVwKIAkJKF9iZiktPmJmX2xhc3Rmcm0gPSBOVUxMOwkJCVwKIAkJKF9iZiktPmJmX25leHQgPSBOVUxMOwkJCQlcCi0JCW1lbXplcm8oJigoX2JmKS0+YmZfc3RhdGUpLAkJCVwKKwkJbWVtc2V0KCYoKF9iZiktPmJmX3N0YXRlKSwgMCwJCQlcCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdGhfYnVmX3N0YXRlKSk7CVwKIAl9IHdoaWxlICgwKQogCitlbnVtIGJ1ZmZlcl90eXBlIHsKKwlCVUZfREFUQQkJPSBCSVQoMCksCisJQlVGX0FHR1IJCT0gQklUKDEpLAorCUJVRl9BTVBEVQkJPSBCSVQoMiksCisJQlVGX0hUCQkJPSBCSVQoMyksCisJQlVGX1JFVFJZCQk9IEJJVCg0KSwKKwlCVUZfWFJFVFJZCQk9IEJJVCg1KSwKKwlCVUZfU0hPUlRfUFJFQU1CTEUJPSBCSVQoNiksCisJQlVGX0JBUgkJCT0gQklUKDcpLAorCUJVRl9QU1BPTEwJCT0gQklUKDgpLAorCUJVRl9BR0dSX0JVUlNUCQk9IEJJVCg5KSwKKwlCVUZfQ0FMQ19BSVJUSU1FCT0gQklUKDEwKSwKK307CisKIHN0cnVjdCBhdGhfYnVmX3N0YXRlIHsKLQlpbnQgYmZzX25mcmFtZXM7CS8qICMgZnJhbWVzIGluIGFnZ3JlZ2F0ZSAqLwotCXUxNiBiZnNfYWw7CQkvKiBsZW5ndGggb2YgYWdncmVnYXRlICovCi0JdTE2IGJmc19mcm1sZW47CQkvKiBsZW5ndGggb2YgZnJhbWUgKi8KLQlpbnQgYmZzX3NlcW5vOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCi0JaW50IGJmc190aWRubzsJCS8qIHRpZCBvZiB0aGlzIGZyYW1lICovCi0JaW50IGJmc19yZXRyaWVzOwkvKiBjdXJyZW50IHJldHJpZXMgKi8KKwlpbnQgYmZzX25mcmFtZXM7CQkJLyogIyBmcmFtZXMgaW4gYWdncmVnYXRlICovCisJdTE2IGJmc19hbDsJCQkJLyogbGVuZ3RoIG9mIGFnZ3JlZ2F0ZSAqLworCXUxNiBiZnNfZnJtbGVuOwkJCQkvKiBsZW5ndGggb2YgZnJhbWUgKi8KKwlpbnQgYmZzX3NlcW5vOwkJCQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKwlpbnQgYmZzX3RpZG5vOwkJCQkvKiB0aWQgb2YgdGhpcyBmcmFtZSAqLworCWludCBiZnNfcmV0cmllczsJCQkvKiBjdXJyZW50IHJldHJpZXMgKi8KIAlzdHJ1Y3QgYXRoX3JjX3NlcmllcyBiZnNfcmNzWzRdOwkvKiByYXRlIHNlcmllcyAqLwotCXU4IGJmc19pc2RhdGE6MTsJLyogaXMgYSBkYXRhIGZyYW1lL2FnZ3JlZ2F0ZSAqLwotCXU4IGJmc19pc2FnZ3I6MTsJLyogaXMgYW4gYWdncmVnYXRlICovCi0JdTggYmZzX2lzYW1wZHU6MTsJLyogaXMgYW4gYS1tcGR1LCBhZ2dyZWdhdGUgb3Igbm90ICovCi0JdTggYmZzX2h0OjE7CQkvKiBpcyBhbiBIVCBmcmFtZSAqLwotCXU4IGJmc19pc3JldHJpZWQ6MTsJLyogaXMgcmV0cmllZCAqLwotCXU4IGJmc19pc3hyZXRyaWVkOjE7CS8qIGlzIGV4Y2Vzc2l2ZSByZXRyaWVkICovCi0JdTggYmZzX3NocHJlYW1ibGU6MTsJLyogaXMgc2hvcnQgcHJlYW1ibGUgKi8KLQl1OCBiZnNfaXNiYXI6MTsJCS8qIGlzIGEgQkFSICovCi0JdTggYmZzX2lzcHNwb2xsOjE7CS8qIGlzIGEgUFMtUG9sbCAqLwotCXU4IGJmc19hZ2dyYnVyc3Q6MTsJLyogaXMgYSBhZ2dyIGJ1cnN0ICovCi0JdTggYmZzX2NhbGNhaXJ0aW1lOjE7CS8qIHJlcXVlc3RzIGFpcnRpbWUgYmUgY2FsY3VsYXRlZAotCQkJCXdoZW4gc2V0IGZvciB0eCBmcmFtZSAqLwotCWludCBiZnNfcmlmc2J1cnN0X2VsZW07CS8qIFJJRlMgYnVyc3QvYmFyICovCi0JaW50IGJmc19ucmlmc3ViZnJhbWVzOwkvKiAjIG9mIGVsZW1lbnRzIGluIGJ1cnN0ICovCisJdTMyIGJmX3R5cGU7CQkJCS8qIEJVRl8qIChlbnVtIGJ1ZmZlcl90eXBlKSAqLwogCS8qIGtleSB0eXBlIHVzZSB0byBlbmNyeXB0IHRoaXMgZnJhbWUgKi8KIAllbnVtIGF0aDlrX2tleV90eXBlIGJmc19rZXl0eXBlOwogfTsKQEAgLTIyMiwyNiArMjE5LDIyIEBACiAjZGVmaW5lIGJmX3NlcW5vICAgICAgICAJYmZfc3RhdGUuYmZzX3NlcW5vCiAjZGVmaW5lIGJmX3RpZG5vICAgICAgICAJYmZfc3RhdGUuYmZzX3RpZG5vCiAjZGVmaW5lIGJmX3JjcyAgICAgICAgICAJYmZfc3RhdGUuYmZzX3JjcwotI2RlZmluZSBiZl9pc2RhdGEgICAgICAgCWJmX3N0YXRlLmJmc19pc2RhdGEKLSNkZWZpbmUgYmZfaXNhZ2dyICAgICAgIAliZl9zdGF0ZS5iZnNfaXNhZ2dyCi0jZGVmaW5lIGJmX2lzYW1wZHUgICAgICAJYmZfc3RhdGUuYmZzX2lzYW1wZHUKLSNkZWZpbmUgYmZfaHQgICAgICAgICAgIAliZl9zdGF0ZS5iZnNfaHQKLSNkZWZpbmUgYmZfaXNyZXRyaWVkICAgIAliZl9zdGF0ZS5iZnNfaXNyZXRyaWVkCi0jZGVmaW5lIGJmX2lzeHJldHJpZWQgICAJYmZfc3RhdGUuYmZzX2lzeHJldHJpZWQKLSNkZWZpbmUgYmZfc2hwcmVhbWJsZSAgIAliZl9zdGF0ZS5iZnNfc2hwcmVhbWJsZQotI2RlZmluZSBiZl9yaWZzYnVyc3RfZWxlbSAgCWJmX3N0YXRlLmJmc19yaWZzYnVyc3RfZWxlbQotI2RlZmluZSBiZl9ucmlmc3ViZnJhbWVzICAJYmZfc3RhdGUuYmZzX25yaWZzdWJmcmFtZXMKICNkZWZpbmUgYmZfa2V5dHlwZSAgICAgIAliZl9zdGF0ZS5iZnNfa2V5dHlwZQotI2RlZmluZSBiZl9pc2JhciAgICAgICAgCWJmX3N0YXRlLmJmc19pc2JhcgotI2RlZmluZSBiZl9pc3BzcG9sbCAgICAgCWJmX3N0YXRlLmJmc19pc3BzcG9sbAotI2RlZmluZSBiZl9hZ2dyYnVyc3QgICAgCWJmX3N0YXRlLmJmc19hZ2dyYnVyc3QKLSNkZWZpbmUgYmZfY2FsY2FpcnRpbWUgIAliZl9zdGF0ZS5iZnNfY2FsY2FpcnRpbWUKKyNkZWZpbmUgYmZfaXNkYXRhKGJmKQkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0RBVEEpCisjZGVmaW5lIGJmX2lzYWdncihiZikJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmIEJVRl9BR0dSKQorI2RlZmluZSBiZl9pc2FtcGR1KGJmKQkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0FNUERVKQorI2RlZmluZSBiZl9pc2h0KGJmKQkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0hUKQorI2RlZmluZSBiZl9pc3JldHJpZWQoYmYpCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmIEJVRl9SRVRSWSkKKyNkZWZpbmUgYmZfaXN4cmV0cmllZChiZikJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX1hSRVRSWSkKKyNkZWZpbmUgYmZfaXNzaHByZWFtYmxlKGJmKQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgJiBCVUZfU0hPUlRfUFJFQU1CTEUpCisjZGVmaW5lIGJmX2lzYmFyKGJmKQkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0JBUikKKyNkZWZpbmUgYmZfaXNwc3BvbGwoYmYpIAkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgJiBCVUZfUFNQT0xMKQorI2RlZmluZSBiZl9pc2FnZ3JidXJzdChiZikJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0FHR1JfQlVSU1QpCiAKIC8qCiAgKiBBYnN0cmFjdGlvbiBvZiBhIGNvbnRpZ3VvdXMgYnVmZmVyIHRvIHRyYW5zbWl0L3JlY2VpdmUuICBUaGVyZSBpcyBvbmx5CiAgKiBhIHNpbmdsZSBodyBkZXNjcmlwdG9yIGVuY2Fwc3VsYXRlZCBoZXJlLgogICovCi0KIHN0cnVjdCBhdGhfYnVmIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGFzdDsKQEAgLTMxNiw3ICszMDksNyBAQAogI2RlZmluZSBBVEhfUlhfVElNRU9VVCAgICAgICAgICAgNDAgICAgICAvKiA0MCBtaWxsaXNlY29uZHMgKi8KICNkZWZpbmUgV01FX05VTV9USUQgICAgICAgICAgICAgIDE2CiAjZGVmaW5lIElFRUU4MDIxMV9CQVJfQ1RMX1RJRF9NICAweEYwMDAgIC8qIHRpZCBtYXNrICovCi0jZGVmaW5lIElFRUU4MDIxMV9CQVJfQ1RMX1RJRF9TICAyICAgICAgIC8qIHRpZCBzaGlmdCAqLworI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUTF9USURfUyAgMTIgICAgICAvKiB0aWQgc2hpZnQgKi8KIAogZW51bSBBVEhfUlhfVFlQRSB7CiAJQVRIX1JYX05PTl9DT05TVU1FRCA9IDAsCkBAIC0zOTEsMTAgKzM4NCwxMCBAQAogCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJIHN0cnVjdCBhdGhfcmVjdl9zdGF0dXMgKnJ4X3N0YXR1cywKIAkJIGVudW0gQVRIX1JYX1RZUEUgKnN0YXR1cyk7Ci1pbnQgYXRoX19yeF9pbmRpY2F0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICBzdHJ1Y3QgYXRoX3JlY3Zfc3RhdHVzICpzdGF0dXMsCi0JCSAgICB1MTYga2V5aXgpOworaW50IF9hdGhfcnhfaW5kaWNhdGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgYXRoX3JlY3Zfc3RhdHVzICpzdGF0dXMsCisJCSAgICAgdTE2IGtleWl4KTsKIGludCBhdGhfcnhfc3ViZnJhbWUoc3RydWN0IGF0aF9ub2RlICphbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgIHN0cnVjdCBhdGhfcmVjdl9zdGF0dXMgKnN0YXR1cyk7CiAKQEAgLTQwMiw4ICszOTUsNyBAQAogLyogVFggKi8KIC8qKioqKiovCiAKLSNkZWZpbmUgQVRIX0ZSQUdfUEVSX01TRFUgICAgICAgMQotI2RlZmluZSBBVEhfVFhCVUYgICAgICAgICAgICAgICAoNTEyL0FUSF9GUkFHX1BFUl9NU0RVKQorI2RlZmluZSBBVEhfVFhCVUYgICAgICAgICAgICAgICA1MTIKIC8qIG1heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgKHRyaWVzKSAqLwogI2RlZmluZSBBVEhfVFhNQVhUUlkgICAgICAgICAgICAxMwogLyogbWF4IG51bWJlciBvZiAxMW4gdHJhbnNtaXQgYXR0ZW1wdHMgKHRyaWVzKSAqLwpAQCAtNTIyLDcgKzUxNCw2IEBACiAJdTMyIGtleWl4OwogCWludCBtaW5fcmF0ZTsKIAlpbnQgbWNhc3RfcmF0ZTsKLQl1MTYgbmV4dGZyYWdsZW47CiAJc3RydWN0IGF0aF9zb2Z0YyAqZGV2OwogCWRtYV9hZGRyX3QgZG1hY29udGV4dDsKIH07CkBAIC01NTcsMTAgKzU0OCwxMCBAQAogaW50IGF0aF90eF9zZXR1cChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGhhbHR5cGUpOwogdm9pZCBhdGhfZHJhaW50eHEoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGJvb2wgcmV0cnlfdHgpOwogdm9pZCBhdGhfdHhfZHJhaW50eHEoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0Jc3RydWN0IGF0aF90eHEgKnR4cSwgYm9vbCByZXRyeV90eCk7CisJCSAgICAgc3RydWN0IGF0aF90eHEgKnR4cSwgYm9vbCByZXRyeV90eCk7CiB2b2lkIGF0aF90eF9ub2RlX2luaXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfbm9kZSAqYW4pOwogdm9pZCBhdGhfdHhfbm9kZV9jbGVhbnVwKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCXN0cnVjdCBhdGhfbm9kZSAqYW4sIGJvb2wgYmhfZmxhZyk7CisJCQkgc3RydWN0IGF0aF9ub2RlICphbiwgYm9vbCBiaF9mbGFnKTsKIHZvaWQgYXRoX3R4X25vZGVfZnJlZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9ub2RlICphbik7CiB2b2lkIGF0aF90eHFfc2NoZWR1bGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpOwogaW50IGF0aF90eF9pbml0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgbmJ1ZnMpOwpAQCAtNTc1LDYgKzU2Niw3IEBACiB2b2lkIGF0aF9ub3RpZnlfdHhxX3N0YXR1cyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTE2IHF1ZXVlX2RlcHRoKTsKIHZvaWQgYXRoX3R4X2NvbXBsZXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBhdGhfeG1pdF9zdGF0dXMgKnR4X3N0YXR1cywgc3RydWN0IGF0aF9ub2RlICphbik7Cit2b2lkIGF0aF90eF9jYWJxKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKiovCiAvKiBOb2RlIC8gQWdncmVnYXRpb24gKi8KQEAgLTU4NSw3ICs1NzcsNiBAQAogLyogaW5kaWNhdGVzIHRoZSBub2RlIGlzIDgwMjExIHBvd2VyIHNhdmUgKi8KICNkZWZpbmUgQVRIX05PREVfUFdSU0FWRSAgICAgICAgMHgyCiAKLSNkZWZpbmUgQUREQkFfVElNRU9VVCAgICAgICAgICAgICAgMjAwIC8qIDIwMCBtaWxsaXNlY29uZHMgKi8KICNkZWZpbmUgQUREQkFfRVhDSEFOR0VfQVRURU1QVFMgICAgMTAKICNkZWZpbmUgQVRIX0FHR1JfREVMSU1fU1ogICAgICAgICAgNCAgIC8qIGRlbGltaXRlciBzaXplICAgKi8KICNkZWZpbmUgQVRIX0FHR1JfTUlOUExFTiAgICAgICAgICAgMjU2IC8qIGluIGJ5dGVzLCBtaW5pbXVtIHBhY2tldCBsZW5ndGggKi8KQEAgLTcwNSw5ICs2OTYsNiBAQAogI2RlZmluZQlBVEhfQkNCVUYgICAgICAgICAgICAgICAJNCAgIC8qIG51bWJlciBvZiBiZWFjb24gYnVmZmVycyAqLwogI2RlZmluZSBBVEhfREVGQVVMVF9CSU5UVkFMICAgICAJMTAwIC8qIGRlZmF1bHQgYmVhY29uIGludGVydmFsIGluIFRVICovCiAjZGVmaW5lIEFUSF9ERUZBVUxUX0JNSVNTX0xJTUlUIAkxMAotI2RlZmluZQlBVEhfQkVBQ09OX0FJRlNfREVGQVVMVAkJMCAgLyogRGVmYXVsdCBhaWZzIGZvciBhcCBiZWFjb24gcSAqLwotI2RlZmluZQlBVEhfQkVBQ09OX0NXTUlOX0RFRkFVTFQJMCAgLyogRGVmYXVsdCBjd21pbiBmb3IgYXAgYmVhY29uIHEgKi8KLSNkZWZpbmUJQVRIX0JFQUNPTl9DV01BWF9ERUZBVUxUCTAgIC8qIERlZmF1bHQgY3dtYXggZm9yIGFwIGJlYWNvbiBxICovCiAjZGVmaW5lIElFRUU4MDIxMV9NU19UT19UVSh4KSAgICAgICAgICAgKCgoeCkgKiAxMDAwKSAvIDEwMjQpCiAKIC8qIGJlYWNvbiBjb25maWd1cmF0aW9uICovCkBAIC03MjQsMzAgKzcxMiwxNiBAQAogCX0gdTsgLyogbGFzdCByZWNlaXZlZCBiZWFjb24vcHJvYmUgcmVzcG9uc2UgdGltZXN0YW1wIG9mIHRoaXMgQlNTLiAqLwogfTsKIAotLyogb2Zmc2V0cyBpbiBhIGJlYWNvbiBmcmFtZSBmb3IKLSAqIHF1aWNrIGFjZXNzIG9mIGJlYWNvbiBjb250ZW50IGJ5IGxvdy1sZXZlbCBkcml2ZXIgKi8KLXN0cnVjdCBhdGhfYmVhY29uX29mZnNldCB7Ci0JdTggKmJvX3RpbTsJLyogc3RhcnQgb2YgYXRpbS9kdGltICovCi19OwotCiB2b2lkIGF0aDlrX2JlYWNvbl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiB2b2lkIGF0aF9iZWFjb25fY29uZmlnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgaWZfaWQpOwogaW50IGF0aF9iZWFjb25xX3NldHVwKHN0cnVjdCBhdGhfaGFsICphaCk7CiBpbnQgYXRoX2JlYWNvbl9hbGxvYyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgaW50IGlmX2lkKTsKIHZvaWQgYXRoX2JzdHVja19wcm9jZXNzKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKLXZvaWQgYXRoX2JlYWNvbl90YXNrbGV0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBpbnQgKm5lZWRtYXJrKTsKLXZvaWQgYXRoX2JlYWNvbl9mcmVlKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKIHZvaWQgYXRoX2JlYWNvbl9yZXR1cm4oc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdmFwICphdnApOwogdm9pZCBhdGhfYmVhY29uX3N5bmMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpZl9pZCk7Ci12b2lkIGF0aF91cGRhdGVfYmVhY29uX2luZm8oc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBhdmdicnNzaSk7CiB2b2lkIGF0aF9nZXRfYmVhY29uY29uZmlnKHN0cnVjdCBhdGhfc29mdGMgKnNjLAogCQkJICBpbnQgaWZfaWQsCiAJCQkgIHN0cnVjdCBhdGhfYmVhY29uX2NvbmZpZyAqY29uZik7Ci1pbnQgYXRoX3VwZGF0ZV9iZWFjb24oc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCSAgICAgIGludCBpZl9pZCwKLQkJICAgICAgc3RydWN0IGF0aF9iZWFjb25fb2Zmc2V0ICpibywKLQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgaW50IG1jYXN0KTsKIC8qKioqKioqKi8KIC8qIFZBUHMgKi8KIC8qKioqKioqKi8KQEAgLTc3NCwxMCArNzQ4LDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqYXZfaWZfZGF0YTsKIAllbnVtIGF0aDlrX29wbW9kZSBhdl9vcG1vZGU7CS8qIFZBUCBvcGVyYXRpb25hbCBtb2RlICovCiAJc3RydWN0IGF0aF9idWYgKmF2X2JjYnVmOwkvKiBiZWFjb24gYnVmZmVyICovCi0Jc3RydWN0IGF0aF9iZWFjb25fb2Zmc2V0IGF2X2JvZmY7IC8qIGR5bmFtaWMgdXBkYXRlIHN0YXRlICovCiAJc3RydWN0IGF0aF90eF9jb250cm9sIGF2X2J0eGN0bDsgIC8qIHR4Y3RsIGluZm9ybWF0aW9uIGZvciBiZWFjb24gKi8KIAlpbnQgYXZfYnNsb3Q7CQkJLyogYmVhY29uIHNsb3QgaW5kZXggKi8KLQlzdHJ1Y3QgYXRoX3R4cSBhdl9tY2FzdHE7CS8qIG11bHRpY2FzdCB0cmFuc21pdCBxdWV1ZSAqLwogCXN0cnVjdCBhdGhfdmFwX2NvbmZpZyBhdl9jb25maWc7LyogdmFwIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyovCiAJc3RydWN0IGF0aF9yYXRlX25vZGUgKnJjX25vZGU7CiB9OwpAQCAtNzg4LDggKzc2MCw3IEBACiAJCSAgIGVudW0gYXRoOWtfb3Btb2RlIG9wbW9kZSk7CiBpbnQgYXRoX3ZhcF9kZXRhY2goc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpZl9pZCk7CiBpbnQgYXRoX3ZhcF9jb25maWcoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JaW50IGlmX2lkLCBzdHJ1Y3QgYXRoX3ZhcF9jb25maWcgKmlmX2NvbmZpZyk7Ci1pbnQgYXRoX3ZhcF9saXN0ZW4oc3RydWN0IGF0aF9zb2Z0YyAqc2MsIGludCBpZl9pZCk7CisJCSAgIGludCBpZl9pZCwgc3RydWN0IGF0aF92YXBfY29uZmlnICppZl9jb25maWcpOwogCiAvKioqKioqKioqKioqKioqKioqKioqLwogLyogQW50ZW5uYSBkaXZlcnNpdHkgKi8KQEAgLTgyOSw2ICs4MDAsNTggQEAKIAkJICAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJ4X3N0YXRzKTsKIHZvaWQgYXRoX3NldGRlZmFudGVubmEodm9pZCAqc2MsIHUzMiBhbnRlbm5hKTsKIAorLyoqKioqKiovCisvKiBBTkkgKi8KKy8qKioqKioqLworCisvKiBBTkkgdmFsdWVzIGZvciBTVEEgb25seS4KKyAgIEZJWE1FOiBBZGQgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBBUCBsYXRlciAqLworCisjZGVmaW5lIEFUSF9BTklfUE9MTElOVEVSVkFMICAgIDEwMCAgICAgLyogMTAwIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIEFOSSBwb2xsICovCisjZGVmaW5lIEFUSF9TSE9SVF9DQUxJTlRFUlZBTCAgIDEwMDAgICAgLyogMSBzZWNvbmQgYmV0d2VlbiBjYWxpYnJhdGlvbnMgKi8KKyNkZWZpbmUgQVRIX0xPTkdfQ0FMSU5URVJWQUwgICAgMzAwMDAgICAvKiAzMCBzZWNvbmRzIGJldHdlZW4gY2FsaWJyYXRpb25zICovCisjZGVmaW5lIEFUSF9SRVNUQVJUX0NBTElOVEVSVkFMIDEyMDAwMDAgLyogMjAgbWludXRlcyBiZXR3ZWVuIGNhbGlicmF0aW9ucyAqLworCitzdHJ1Y3QgYXRoX2FuaSB7CisJYm9vbCBzY19jYWxkb25lOworCWludDE2X3Qgc2Nfbm9pc2VfZmxvb3I7CisJdW5zaWduZWQgaW50IHNjX2xvbmdjYWxfdGltZXI7CisJdW5zaWduZWQgaW50IHNjX3Nob3J0Y2FsX3RpbWVyOworCXVuc2lnbmVkIGludCBzY19yZXNldGNhbF90aW1lcjsKKwl1bnNpZ25lZCBpbnQgc2NfY2hlY2thbmlfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKiovCisvKiAgIExFRCBDb250cm9sICAgICovCisvKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVRIX0xFRF9QSU4JMQorCitlbnVtIGF0aF9sZWRfdHlwZSB7CisJQVRIX0xFRF9SQURJTywKKwlBVEhfTEVEX0FTU09DLAorCUFUSF9MRURfVFgsCisJQVRIX0xFRF9SWAorfTsKKworc3RydWN0IGF0aF9sZWQgeworCXN0cnVjdCBhdGhfc29mdGMgKnNjOworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2NkZXY7CisJZW51bSBhdGhfbGVkX3R5cGUgbGVkX3R5cGU7CisJY2hhciBuYW1lWzMyXTsKKwlib29sIHJlZ2lzdGVyZWQ7Cit9OworCisvKiBSZmtpbGwgKi8KKyNkZWZpbmUgQVRIX1JGS0lMTF9QT0xMX0lOVEVSVkFMCTIwMDAgLyogbXNlY3MgKi8KKworc3RydWN0IGF0aF9yZmtpbGwgeworCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJma2lsbF9wb2xsOworCWNoYXIgcmZraWxsX25hbWVbMzJdOworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqLwogLyogTWFpbiBkcml2ZXIgY29yZSAqLwogLyoqKioqKioqKioqKioqKioqKioqLwpAQCAtODQxLDExICs4NjQsNyBAQAogI2RlZmluZQlBVEhfREVGQVVMVF9OT0lTRV9GTE9PUiAtOTUKICNkZWZpbmUgQVRIX1JFR0NMQVNTSURTX01BWCAgICAgMTAKICNkZWZpbmUgQVRIX0NBQlFfUkVBRFlfVElNRSAgICAgODAgIC8qICUgb2YgYmVhY29uIGludGVydmFsICovCi0jZGVmaW5lIEFUSF9QUkVBTUJMRV9TSE9SVAkoMTw8MCkKLSNkZWZpbmUgQVRIX1BST1RFQ1RfRU5BQkxFCSgxPDwxKQogI2RlZmluZSBBVEhfTUFYX1NXX1JFVFJJRVMgICAgICAxMAotLyogTnVtIGZhcm1lcyBkaWZmZXJlbmNlIGluIHR4IHRvIGZsaXAgZGVmYXVsdCByZWN2ICovCi0jZGVmaW5lCUFUSF9BTlRFTk5BX0RJRkYJMgogI2RlZmluZSBBVEhfQ0hBTl9NQVggICAgICAgICAgICAyNTUKICNkZWZpbmUgSUVFRTgwMjExX1dFUF9OS0lEICAgICAgNCAgICAgICAvKiBudW1iZXIgb2Yga2V5IGlkcyAqLwogI2RlZmluZSBJRUVFODAyMTFfUkFURV9WQUwgICAgICAweDdmCkBAIC04NTksOSArODc4LDcgQEAKICAqLwogI2RlZmluZQlBVEhfS0VZTUFYCSAgICAgICAgMTI4ICAgICAgICAvKiBtYXgga2V5IGNhY2hlIHNpemUgd2UgaGFuZGxlICovCiAKLSNkZWZpbmUgUkVTRVRfUkVUUllfVFhRICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBBVEhfSUZfSURfQU5ZICAgCTB4ZmYKLQogI2RlZmluZSBBVEhfVFhQT1dFUl9NQVggICAgICAgICAxMDAgICAgIC8qIC41IGRCbSB1bml0cyAqLwogCiAjZGVmaW5lIFJTU0lfTFBGX1RIUkVTSE9MRCAgICAgICAgIC0yMApAQCAtOTA3LDYwICs5MjQsNjQgQEAKIAl1OCBleHRfY2hhbl9vZmZzZXQ7CiB9OwogCisjZGVmaW5lIFNDX09QX0lOVkFMSUQJCUJJVCgwKQorI2RlZmluZSBTQ19PUF9CRUFDT05TCQlCSVQoMSkKKyNkZWZpbmUgU0NfT1BfUlhBR0dSCQlCSVQoMikKKyNkZWZpbmUgU0NfT1BfVFhBR0dSCQlCSVQoMykKKyNkZWZpbmUgU0NfT1BfQ0hBSU5NQVNLX1VQREFURQlCSVQoNCkKKyNkZWZpbmUgU0NfT1BfRlVMTF9SRVNFVAlCSVQoNSkKKyNkZWZpbmUgU0NfT1BfTk9fUkVTRVQJCUJJVCg2KQorI2RlZmluZSBTQ19PUF9QUkVBTUJMRV9TSE9SVAlCSVQoNykKKyNkZWZpbmUgU0NfT1BfUFJPVEVDVF9FTkFCTEUJQklUKDgpCisjZGVmaW5lIFNDX09QX1JYRkxVU0gJCUJJVCg5KQorI2RlZmluZSBTQ19PUF9MRURfQVNTT0NJQVRFRAlCSVQoMTApCisjZGVmaW5lIFNDX09QX1JGS0lMTF9SRUdJU1RFUkVECUJJVCgxMSkKKyNkZWZpbmUgU0NfT1BfUkZLSUxMX1NXX0JMT0NLRUQJQklUKDEyKQorI2RlZmluZSBTQ19PUF9SRktJTExfSFdfQkxPQ0tFRAlCSVQoMTMpCisKIHN0cnVjdCBhdGhfc29mdGMgewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXZvaWQgX19pb21lbSAqbWVtOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpbnRyX3RxOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBiY29uX3Rhc2tsZXQ7Ci0Jc3RydWN0IGF0aF9jb25maWcgc2NfY29uZmlnOwkvKiBsb2FkLXRpbWUgcGFyYW1ldGVycyAqLwotCWludCBzY19kZWJ1ZzsKKwlzdHJ1Y3QgYXRoX2NvbmZpZyBzY19jb25maWc7CiAJc3RydWN0IGF0aF9oYWwgKnNjX2FoOwotCXN0cnVjdCBhdGhfcmF0ZV9zb2Z0YyAqc2NfcmM7CS8qIHR4IHJhdGUgY29udHJvbCBzdXBwb3J0ICovCi0JdTMyIHNjX2ludHJzdGF0dXM7Ci0JZW51bSBhdGg5a19vcG1vZGUgc2Nfb3Btb2RlOwkvKiBjdXJyZW50IG9wZXJhdGluZyBtb2RlICovCisJc3RydWN0IGF0aF9yYXRlX3NvZnRjICpzY19yYzsKKwl2b2lkIF9faW9tZW0gKm1lbTsKIAotCXU4IHNjX2ludmFsaWQ7CQkJLyogYmVpbmcgZGV0YWNoZWQgKi8KLQl1OCBzY19iZWFjb25zOwkJCS8qIGJlYWNvbnMgcnVubmluZyAqLwotCXU4IHNjX3NjYW5uaW5nOwkJCS8qIHNjYW5uaW5nIGFjdGl2ZSAqLwotCXU4IHNjX3R4YWdncjsJCQkvKiBlbmFibGUgMTFuIHR4IGFnZ3JlZ2F0aW9uICovCi0JdTggc2NfcnhhZ2dyOwkJCS8qIGVuYWJsZSAxMW4gcnggYWdncmVnYXRpb24gKi8KLQl1OCBzY191cGRhdGVfY2hhaW5tYXNrOwkJLyogY2hhbmdlIGNoYWluIG1hc2sgKi8KLQl1OCBzY19mdWxsX3Jlc2V0OwkJLyogZm9yY2UgZnVsbCByZXNldCAqLwotCWVudW0gd2lyZWxlc3NfbW9kZSBzY19jdXJtb2RlOwkvKiBjdXJyZW50IHBoeSBtb2RlICovCi0JdTE2IHNjX2N1cnR4cG93OwotCXUxNiBzY19jdXJhaWQ7CiAJdTggc2NfY3VyYnNzaWRbRVRIX0FMRU5dOwogCXU4IHNjX215YWRkcltFVEhfQUxFTl07Ci0JZW51bSBQUk9UX01PREUgc2NfcHJvdG1vZGU7Ci0JdTggc2NfbWNhc3RhbnRlbm5hOwotCXU4IHNjX3R4YW50ZW5uYTsJCS8qIGRhdGEgdHggYW50ZW5uYSAoZml4ZWQgb3IgYXV0bykgKi8KLQl1OCBzY19uYmNudmFwczsJCQkvKiAjIG9mIHZhcHMgc2VuZGluZyBiZWFjb25zICovCi0JdTE2IHNjX252YXBzOwkJCS8qICMgb2YgYWN0aXZlIHZpcnR1YWwgYXAncyAqLwotCXN0cnVjdCBhdGhfdmFwICpzY192YXBzW0FUSF9CQ0JVRl07Ci0JZW51bSBhdGg5a19pbnQgc2NfaW1hc2s7CiAJdTggc2NfYnNzaWRtYXNrW0VUSF9BTEVOXTsKLQl1OCBzY19kZWZhbnQ7CQkJLyogY3VycmVudCBkZWZhdWx0IGFudGVubmEgKi8KLQl1OCBzY19yeG90aGVyYW50OwkJLyogcngncyBvbiBub24tZGVmYXVsdCBhbnRlbm5hICovCisKKwlpbnQgc2NfZGVidWc7CisJdTMyIHNjX2ludHJzdGF0dXM7CisJdTMyIHNjX2ZsYWdzOyAvKiBTQ19PUF8qICovCisJdW5zaWduZWQgaW50IHJ4X2ZpbHRlcjsKKwl1MTYgc2NfY3VydHhwb3c7CisJdTE2IHNjX2N1cmFpZDsKIAl1MTYgc2NfY2FjaGVsc3o7CiAJaW50IHNjX3Nsb3R1cGRhdGU7CQkvKiBzbG90IHRvIG5leHQgYWR2YW5jZSBmc20gKi8KIAlpbnQgc2Nfc2xvdHRpbWU7Ci0JdTggc2Nfbm9yZXNldDsKIAlpbnQgc2NfYnNsb3RbQVRIX0JDQlVGXTsKKwl1OCBzY190eF9jaGFpbm1hc2s7CisJdTggc2NfcnhfY2hhaW5tYXNrOworCWVudW0gYXRoOWtfaW50IHNjX2ltYXNrOworCWVudW0gd2lyZWxlc3NfbW9kZSBzY19jdXJtb2RlOwkvKiBjdXJyZW50IHBoeSBtb2RlICovCisJZW51bSBQUk9UX01PREUgc2NfcHJvdG1vZGU7CisKKwl1OCBzY19uYmNudmFwczsJCQkvKiAjIG9mIHZhcHMgc2VuZGluZyBiZWFjb25zICovCisJdTE2IHNjX252YXBzOwkJCS8qICMgb2YgYWN0aXZlIHZpcnR1YWwgYXAncyAqLworCXN0cnVjdCBhdGhfdmFwICpzY192YXBzW0FUSF9CQ0JVRl07CisKKwl1OCBzY19tY2FzdGFudGVubmE7CisJdTggc2NfZGVmYW50OwkJCS8qIGN1cnJlbnQgZGVmYXVsdCBhbnRlbm5hICovCisJdTggc2NfcnhvdGhlcmFudDsJCS8qIHJ4J3Mgb24gbm9uLWRlZmF1bHQgYW50ZW5uYSAqLworCiAJc3RydWN0IGF0aDlrX25vZGVfc3RhdHMgc2NfaGFsc3RhdHM7IC8qIHN0YXRpb24tbW9kZSByc3NpIHN0YXRzICovCiAJc3RydWN0IGxpc3RfaGVhZCBub2RlX2xpc3Q7CiAJc3RydWN0IGF0aF9odF9pbmZvIHNjX2h0X2luZm87Ci0JaW50MTZfdCBzY19ub2lzZV9mbG9vcjsJCS8qIHNpZ25hbCBub2lzZSBmbG9vciBpbiBkQm0gKi8KIAllbnVtIGF0aDlrX2h0X2V4dHByb3RzcGFjaW5nIHNjX2h0X2V4dHByb3RzcGFjaW5nOwotCXU4IHNjX3R4X2NoYWlubWFzazsKLQl1OCBzY19yeF9jaGFpbm1hc2s7Ci0JdTggc2NfcnhjaGFpbmRldGVjdF9yZWY7Ci0JdTggc2NfcnhjaGFpbmRldGVjdF90aHJlc2g1R0h6OwotCXU4IHNjX3J4Y2hhaW5kZXRlY3RfdGhyZXNoMkdIejsKLQl1OCBzY19yeGNoYWluZGV0ZWN0X2RlbHRhNUdIejsKLQl1OCBzY19yeGNoYWluZGV0ZWN0X2RlbHRhMkdIejsKLQl1MzIgc2NfcnRzYWdncmxpbWl0OwkJLyogQ2hpcHNldCBzcGVjaWZpYyBhZ2dyIGxpbWl0ICovCi0JdTMyIHNjX2ZsYWdzOworCiAjaWZkZWYgQ09ORklHX1NMT1dfQU5UX0RJVgogCXN0cnVjdCBhdGhfYW50ZGl2IHNjX2FudGRpdjsKICNlbmRpZgpAQCAtOTc0LDE1ICs5OTUsMTIgQEAKIAl1MzIgc2Nfa2V5bWF4OwkJLyogc2l6ZSBvZiBrZXkgY2FjaGUgKi8KIAlERUNMQVJFX0JJVE1BUChzY19rZXltYXAsIEFUSF9LRVlNQVgpOwkvKiBrZXkgdXNlIGJpdCBtYXAgKi8KIAl1OCBzY19zcGxpdG1pYzsJCS8qIHNwbGl0IFRLSVAgTUlDIGtleXMgKi8KLQlpbnQgc2Nfa2V5dHlwZTsKIAogCS8qIFJYICovCiAJc3RydWN0IGxpc3RfaGVhZCBzY19yeGJ1ZjsKIAlzdHJ1Y3QgYXRoX2Rlc2NkbWEgc2NfcnhkbWE7CiAJaW50IHNjX3J4YnVmc2l6ZTsJLyogcnggc2l6ZSBiYXNlZCBvbiBtdHUgKi8KIAl1MzIgKnNjX3J4bGluazsJCS8qIGxpbmsgcHRyIGluIGxhc3QgUlggZGVzYyAqLwotCXUzMiBzY19yeGZsdXNoOwkJLyogcnggZmx1c2ggaW4gcHJvZ3Jlc3MgKi8KLQl1NjQgc2NfbGFzdHJ4OwkJLyogdHNmIG9mIGxhc3QgcngnZCBmcmFtZSAqLwogCiAJLyogVFggKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHNjX3R4YnVmOwpAQCAtOTkxLDcgKzEwMDksNyBAQAogCXUzMiBzY190eHFzZXR1cDsKIAl1MzIgc2NfdHhpbnRycGVyaW9kOwkvKiB0eCBpbnRlcnJ1cHQgYmF0Y2hpbmcgKi8KIAlpbnQgc2NfaGFsdHlwZTJxW0FUSDlLX1dNRV9BQ19WTysxXTsgLyogSEFMIFdNRQlBQyAtPiBoL3cgcW51bSAqLwotCXUzMiBzY19hbnRfdHhbOF07CS8qIHJlY2VudCB0eCBmcmFtZXMvYW50ZW5uYSAqLworCXUxNiBzZXFfbm87IC8qIFRYIHNlcXVlbmNlIG51bWJlciAqLwogCiAJLyogQmVhY29uICovCiAJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gc2NfYmVhY29uX3FpOwpAQCAtMTAwMSw2ICsxMDE5LDcgQEAKIAl1MzIgc2NfYmhhbHE7CiAJdTMyIHNjX2JtaXNzY291bnQ7CiAJdTMyIGFzdF9iZV94bWl0OwkvKiBiZWFjb25zIHRyYW5zbWl0dGVkICovCisJdTY0IGJjX3RzdGFtcDsKIAogCS8qIFJhdGUgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU11bQVRIX1JBVEVfTUFYXTsKQEAgLTEwMTUsNyArMTAzNCw2IEBACiAJLyogQ2hhbm5lbCwgQmFuZCAqLwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1tJRUVFODAyMTFfTlVNX0JBTkRTXVtBVEhfQ0hBTl9NQVhdOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgc2JhbmRzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwotCXN0cnVjdCBhdGg5a19jaGFubmVsIHNjX2N1cmNoYW47CiAKIAkvKiBMb2NrcyAqLwogCXNwaW5sb2NrX3Qgc2NfcnhmbHVzaGxvY2s7CkBAIC0xMDIzLDYgKzEwNDEsMTggQEAKIAlzcGlubG9ja190IHNjX3R4YnVmbG9jazsKIAlzcGlubG9ja190IHNjX3Jlc2V0bG9jazsKIAlzcGlubG9ja190IG5vZGVfbG9jazsKKworCS8qIExFRHMgKi8KKwlzdHJ1Y3QgYXRoX2xlZCByYWRpb19sZWQ7CisJc3RydWN0IGF0aF9sZWQgYXNzb2NfbGVkOworCXN0cnVjdCBhdGhfbGVkIHR4X2xlZDsKKwlzdHJ1Y3QgYXRoX2xlZCByeF9sZWQ7CisKKwkvKiBSZmtpbGwgKi8KKwlzdHJ1Y3QgYXRoX3Jma2lsbCByZl9raWxsOworCisJLyogQU5JICovCisJc3RydWN0IGF0aF9hbmkgc2NfYW5pOwogfTsKIAogaW50IGF0aF9pbml0KHUxNiBkZXZpZCwgc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwpAQCAtMTAzMCwxNCArMTA2MCw4IEBACiBpbnQgYXRoX29wZW4oc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGg5a19jaGFubmVsICppbml0aWFsX2NoYW4pOwogaW50IGF0aF9zdXNwZW5kKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKIGlycXJldHVybl90IGF0aF9pc3IoaW50IGlycSwgdm9pZCAqZGV2KTsKLWludCBhdGhfcmVzZXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwotdm9pZCBhdGhfc2Nhbl9zdGFydChzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7Ci12b2lkIGF0aF9zY2FuX2VuZChzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7CitpbnQgYXRoX3Jlc2V0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBib29sIHJldHJ5X3R4KTsKIGludCBhdGhfc2V0X2NoYW5uZWwoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGg5a19jaGFubmVsICpoY2hhbik7Ci12b2lkIGF0aF9zZXR1cF9yYXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkgICAgZW51bSB3aXJlbGVzc19tb2RlIHdNb2RlLAotCQkgICAgZW51bSBSQVRFX1RZUEUgdHlwZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBhdGg5a19yYXRlX3RhYmxlICpydCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKiovCiAvKiBVdGlsaXR5IEZ1bmN0aW9ucyAqLwpAQCAtMTA1NiwxNyArMTA4MCw1IEBACiB2b2lkIGF0aF9nZXRfY3VycmVudENvdW50cnkoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCiAJc3RydWN0IGF0aDlrX2NvdW50cnlfZW50cnkgKmN0cnkpOwogdTY0IGF0aF9leHRlbmRfdHNmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1MzIgcnN0YW1wKTsKLXZvaWQgYXRoX2ludGVybmFsX3Jlc2V0KHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKLXUzMiBhdGhfY2hhbjJmbGFncyhzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKLWRtYV9hZGRyX3QgYXRoX3NrYl9tYXBfc2luZ2xlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGludCBkaXJlY3Rpb24sCi0JCQkgICAgICBkbWFfYWRkcl90ICpwYSk7Ci12b2lkIGF0aF9za2JfdW5tYXBfc2luZ2xlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBpbnQgZGlyZWN0aW9uLAotCQkJICBkbWFfYWRkcl90ICpwYSk7Ci12b2lkIGF0aF9tY2FzdF9tZXJnZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTMyIG1maWx0WzJdKTsKLWVudW0gYXRoOWtfaHRfbWFjbW9kZSBhdGhfY3dtX21hY21vZGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwogCiAjZW5kaWYgLyogQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvaHcuYwppbmRleCA2ZGJmZWQwLi45OGJjMjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2h3LmMKQEAgLTg1LDI5ICs4NSw2IEBACiAJYXRoOWtfaHdfYWRjX2RjY2FsX2NhbGlicmF0ZQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdGhfaGFsIGFyNTQxNmhhbCA9IHsKLQlBUjU0MTZfTUFHSUMsCi0JMCwKLQkwLAotCU5VTEwsCi0JTlVMTCwKLQlDVFJZX0RFRkFVTFQsCi0JMCwKLQkwLAotCTAsCi0JMCwKLQkwLAotCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCX0sCi19OwotCiBzdGF0aWMgc3RydWN0IGF0aDlrX3JhdGVfdGFibGUgYXI1NDE2XzExYV90YWJsZSA9IHsKIAk4LAogCXswfSwKQEAgLTM1Miw3ICszMjksNyBAQAogCWFoLT5haF9jb25maWcub2ZkbV90cmlnX2hpZ2ggPSA1MDA7CiAJYWgtPmFoX2NvbmZpZy5jY2tfdHJpZ19oaWdoID0gMjAwOwogCWFoLT5haF9jb25maWcuY2NrX3RyaWdfbG93ID0gMTAwOwotCWFoLT5haF9jb25maWcuZW5hYmxlX2FuaSA9IDA7CisJYWgtPmFoX2NvbmZpZy5lbmFibGVfYW5pID0gMTsKIAlhaC0+YWhfY29uZmlnLm5vaXNlX2ltbXVuaXR5X2xldmVsID0gNDsKIAlhaC0+YWhfY29uZmlnLm9mZG1fd2Vha3NpZ25hbF9kZXQgPSAxOwogCWFoLT5haF9jb25maWcuY2NrX3dlYWtzaWduYWxfdGhyID0gMDsKQEAgLTM3MSw3ICszNDgsNyBAQAogCWFoLT5haF9jb25maWcuaW50cl9taXRpZ2F0aW9uID0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X292ZXJyaWRlX2luaShzdHJ1Y3QgYXRoX2hhbCAqYWgsCitzdGF0aWMgdm9pZCBhdGg5a19od19vdmVycmlkZV9pbmkoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkJCQkgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiAJaWYgKCFBUl9TUkVWXzU0MTZfVjIwX09SX0xBVEVSKGFoKQpAQCAtMzgxLDggKzM1OCw4IEBACiAJUkVHX1dSSVRFKGFoLCAweDk4MDAgKyAoNjUxIDw8IDIpLCAweDExKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X2luaXRfYmIoc3RydWN0IGF0aF9oYWwgKmFoLAotCQkJCSAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2luaXRfYmIoc3RydWN0IGF0aF9oYWwgKmFoLAorCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKIAl1MzIgc3ludGhEZWxheTsKIApAQCAtMzk3LDggKzM3NCw4IEBACiAJdWRlbGF5KHN5bnRoRGVsYXkgKyBCQVNFX0FDVElWQVRFX0RFTEFZKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X2luaXRfaW50ZXJydXB0X21hc2tzKHN0cnVjdCBhdGhfaGFsICphaCwKLQkJCQkJCSBlbnVtIGF0aDlrX29wbW9kZSBvcG1vZGUpCitzdGF0aWMgdm9pZCBhdGg5a19od19pbml0X2ludGVycnVwdF9tYXNrcyhzdHJ1Y3QgYXRoX2hhbCAqYWgsCisJCQkJCSAgZW51bSBhdGg5a19vcG1vZGUgb3Btb2RlKQogewogCXN0cnVjdCBhdGhfaGFsXzU0MTYgKmFocCA9IEFINTQxNihhaCk7CiAKQEAgLTQyOCw3ICs0MDUsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X2luaXRfcW9zKHN0cnVjdCBhdGhfaGFsICphaCkKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2luaXRfcW9zKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAlSRUdfV1JJVEUoYWgsIEFSX01JQ19RT1NfQ09OVFJPTCwgMHgxMDBhYSk7CiAJUkVHX1dSSVRFKGFoLCBBUl9NSUNfUU9TX1NFTEVDVCwgMHgzMjEwKTsKQEAgLTUyMyw3ICs1MDAsNyBAQAogCQlyZXR1cm4gYXRoOWtfaHdfZWVwcm9tX3JlYWQoYWgsIG9mZiwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBhdGg5a19od19maWxsX2VlcHJvbShzdHJ1Y3QgYXRoX2hhbCAqYWgpCitzdGF0aWMgYm9vbCBhdGg5a19od19maWxsX2VlcHJvbShzdHJ1Y3QgYXRoX2hhbCAqYWgpCiB7CiAJc3RydWN0IGF0aF9oYWxfNTQxNiAqYWhwID0gQUg1NDE2KGFoKTsKIAlzdHJ1Y3QgYXI1NDE2X2VlcHJvbSAqZWVwID0gJmFocC0+YWhfZWVwcm9tOwpAQCAtNzkwLDcgKzc2Nyw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGF0aDlrX2h3X2NoZWNrX2VlcHJvbShzdHJ1Y3QgYXRoX2hhbCAqYWgpCitzdGF0aWMgaW50IGF0aDlrX2h3X2NoZWNrX2VlcHJvbShzdHJ1Y3QgYXRoX2hhbCAqYWgpCiB7CiAJdTMyIHN1bSA9IDAsIGVsOwogCXUxNiAqZWVwZGF0YTsKQEAgLTExOTYsMTEgKzExNzMsMTIgQEAKIAogCWFoID0gJmFocC0+YWg7CiAKLQltZW1jcHkoJmFocC0+YWgsICZhcjU0MTZoYWwsIHNpemVvZihzdHJ1Y3QgYXRoX2hhbCkpOwotCiAJYWgtPmFoX3NjID0gc2M7CiAJYWgtPmFoX3NoID0gbWVtOwogCisJYWgtPmFoX21hZ2ljID0gQVI1NDE2X01BR0lDOworCWFoLT5haF9jb3VudHJ5Q29kZSA9IENUUllfREVGQVVMVDsKKwogCWFoLT5haF9kZXZpZCA9IGRldmlkOwogCWFoLT5haF9zdWJ2ZW5kb3JpZCA9IDA7CiAKQEAgLTEyOTQsNyArMTI3Miw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBhdGg5a19od19nZXRfcmFkaW9yZXYoc3RydWN0IGF0aF9oYWwgKmFoKQorc3RhdGljIGludCBhdGg5a19od19nZXRfcmFkaW9yZXYoc3RydWN0IGF0aF9oYWwgKmFoKQogewogCXUzMiB2YWw7CiAJaW50IGk7CkBAIC0xMzA3LDcgKzEyODUsNyBAQAogCXJldHVybiBhdGg5a19od19yZXZlcnNlX2JpdHModmFsLCA4KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXRoOWtfaHdfaW5pdF9tYWNhZGRyKHN0cnVjdCBhdGhfaGFsICphaCkKK3N0YXRpYyBpbnQgYXRoOWtfaHdfaW5pdF9tYWNhZGRyKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAl1MzIgc3VtOwogCWludCBpOwpAQCAtMTM4OSw3ICsxMzY3LDcgQEAKIAlyZXR1cm4gc3B1cl92YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGF0aDlrX2h3X3JmYXR0YWNoKHN0cnVjdCBhdGhfaGFsICphaCkKK3N0YXRpYyBpbnQgYXRoOWtfaHdfcmZhdHRhY2goc3RydWN0IGF0aF9oYWwgKmFoKQogewogCWJvb2wgcmZTdGF0dXMgPSBmYWxzZTsKIAlpbnQgZWNvZGUgPSAwOwpAQCAtMTQzNCw4ICsxNDEyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X2luaXRfcGxsKHN0cnVjdCBhdGhfaGFsICphaCwKLQkJCQkgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQorc3RhdGljIHZvaWQgYXRoOWtfaHdfaW5pdF9wbGwoc3RydWN0IGF0aF9oYWwgKmFoLAorCQkJICAgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiAJdTMyIHBsbDsKIApAQCAtMTU1Myw3ICsxNTMxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGF0aDlrX2h3X3NldF9yZm1vZGUoc3RydWN0IGF0aF9oYWwgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKIAl1MzIgcmZNb2RlID0gMDsKQEAgLTE2MjMsNyArMTYwMSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBhdGg5a19od19zZXRfcmVzZXRfcG93ZXJfb24oc3RydWN0IGF0aF9oYWwgKmFoKQorc3RhdGljIGJvb2wgYXRoOWtfaHdfc2V0X3Jlc2V0X3Bvd2VyX29uKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAlSRUdfV1JJVEUoYWgsIEFSX1JUQ19GT1JDRV9XQUtFLCBBUl9SVENfRk9SQ0VfV0FLRV9FTiB8CiAJCSAgQVJfUlRDX0ZPUkNFX1dBS0VfT05fSU5UKTsKQEAgLTE2NjQsNyArMTY0Miw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lCitzdGF0aWMKIHN0cnVjdCBhdGg5a19jaGFubmVsICphdGg5a19od19jaGVja19jaGFuKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKQEAgLTIwOTgsNyArMjA3Niw3IEBACiAJCWFocC0+YWhfcHJvY1BoeUVyciB8PSBIQUxfUFJPQ0VTU19BTkk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19od19hbmlfc2V0dXAoc3RydWN0IGF0aF9oYWwgKmFoKQorc3RhdGljIHZvaWQgYXRoOWtfaHdfYW5pX3NldHVwKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAlzdHJ1Y3QgYXRoX2hhbF81NDE2ICphaHAgPSBBSDU0MTYoYWgpOwogCWludCBpOwpAQCAtMjU0OCw2ICsyNTI2LDExIEBACiAJfQogfQogCisvKgorICogUHJvY2VzcyBhIE1JQiBpbnRlcnJ1cHQuICBXZSBtYXkgcG90ZW50aWFsbHkgYmUgaW52b2tlZCBiZWNhdXNlCisgKiBhbnkgb2YgdGhlIE1JQiBjb3VudGVycyBvdmVyZmxvdy90cmlnZ2VyIHNvIGRvbid0IGFzc3VtZSB3ZSdyZQorICogaGVyZSBiZWNhdXNlIGEgUEhZIGVycm9yIGNvdW50ZXIgdHJpZ2dlcmVkLgorICovCiB2b2lkIGF0aDlrX2h3X3Byb2NtaWJldmVudChzdHJ1Y3QgYXRoX2hhbCAqYWgsCiAJCQkgICBjb25zdCBzdHJ1Y3QgYXRoOWtfbm9kZV9zdGF0cyAqc3RhdHMpCiB7CkBAIC0yNTU1LDE4ICsyNTM4LDIwIEBACiAJdTMyIHBoeUNudDEsIHBoeUNudDI7CiAKIAlEUFJJTlRGKGFoLT5haF9zYywgQVRIX0RCR19BTkksICJQcm9jZXNzaW5nIE1pYiBJbnRyXG4iKTsKLQorCS8qIFJlc2V0IHRoZXNlIGNvdW50ZXJzIHJlZ2FyZGxlc3MgKi8KIAlSRUdfV1JJVEUoYWgsIEFSX0ZJTFRfT0ZETSwgMCk7CiAJUkVHX1dSSVRFKGFoLCBBUl9GSUxUX0NDSywgMCk7CiAJaWYgKCEoUkVHX1JFQUQoYWgsIEFSX1NMUF9NSUJfQ1RSTCkgJiBBUl9TTFBfTUlCX1BFTkRJTkcpKQogCQlSRUdfV1JJVEUoYWgsIEFSX1NMUF9NSUJfQ1RSTCwgQVJfU0xQX01JQl9DTEVBUik7CiAKKwkvKiBDbGVhciB0aGUgbWliIGNvdW50ZXJzIGFuZCBzYXZlIHRoZW0gaW4gdGhlIHN0YXRzICovCiAJYXRoOWtfaHdfdXBkYXRlX21pYnN0YXRzKGFoLCAmYWhwLT5haF9taWJTdGF0cyk7CiAJYWhwLT5haF9zdGF0cy5hc3Rfbm9kZXN0YXRzID0gKnN0YXRzOwogCiAJaWYgKCFET19BTkkoYWgpKQogCQlyZXR1cm47CiAKKwkvKiBOQjogdGhlc2UgYXJlIG5vdCByZXNldC1vbi1yZWFkICovCiAJcGh5Q250MSA9IFJFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzEpOwogCXBoeUNudDIgPSBSRUdfUkVBRChhaCwgQVJfUEhZX0VSUl8yKTsKIAlpZiAoKChwaHlDbnQxICYgQVJfTUlCQ05UX0lOVFJNQVNLKSA9PSBBUl9NSUJDTlRfSU5UUk1BU0spIHx8CkBAIC0yNTc0LDYgKzI1NTksNyBAQAogCQlzdHJ1Y3QgYXI1NDE2QW5pU3RhdGUgKmFuaVN0YXRlID0gYWhwLT5haF9jdXJhbmk7CiAJCXUzMiBvZmRtUGh5RXJyQ250LCBjY2tQaHlFcnJDbnQ7CiAKKwkJLyogTkI6IG9ubHkgdXNlIGFzdF9hbmlfKmVycnMgd2l0aCBBSF9QUklWQVRFX0RJQUcgKi8KIAkJb2ZkbVBoeUVyckNudCA9IHBoeUNudDEgLSBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2U7CiAJCWFocC0+YWhfc3RhdHMuYXN0X2FuaV9vZmRtZXJycyArPQogCQkJb2ZkbVBoeUVyckNudCAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQ7CkBAIC0yNTg0LDExICsyNTcwLDE3IEBACiAJCQljY2tQaHlFcnJDbnQgLSBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQ7CiAJCWFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA9IGNja1BoeUVyckNudDsKIAorCQkvKgorCQkgKiBOQjogZmlndXJlIG91dCB3aGljaCBjb3VudGVyIHRyaWdnZXJlZC4gIElmIGJvdGgKKwkJICogdHJpZ2dlciB3ZSdsbCBvbmx5IGRlYWwgd2l0aCBvbmUgYXMgdGhlIHByb2Nlc3NpbmcKKwkJICogY2xvYmJlcnMgdGhlIGVycm9yIGNvdW50ZXIgc28gdGhlIHRyaWdnZXIgdGhyZXNob2xkCisJCSAqIGNoZWNrIHdpbGwgbmV2ZXIgYmUgdHJ1ZS4KKwkJICovCiAJCWlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID4gYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCkKIAkJCWF0aDlrX2h3X2FuaV9vZmRtX2Vycl90cmlnZ2VyKGFoKTsKIAkJaWYgKGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA+IGFuaVN0YXRlLT5jY2tUcmlnSGlnaCkKIAkJCWF0aDlrX2h3X2FuaV9jY2tfZXJyX3RyaWdnZXIoYWgpOwotCisJCS8qIE5COiBhbHdheXMgcmVzdGFydCB0byBpbnN1cmUgdGhlIGgvdyBjb3VudGVycyBhcmUgcmVzZXQgKi8KIAkJYXRoOWtfYW5pX3Jlc3RhcnQoYWgpOwogCX0KIH0KQEAgLTI4MjIsMzIgKzI4MTQsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sIGF0aDlrX2h3X2NmZ19vdXRwdXQoc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgZ3BpbywKLQkJCQllbnVtIGF0aDlrX2dwaW9fb3V0cHV0X211eF90eXBlCi0JCQkJaGFsU2lnbmFsVHlwZSkKK3ZvaWQgYXRoOWtfaHdfY2ZnX291dHB1dChzdHJ1Y3QgYXRoX2hhbCAqYWgsIHUzMiBncGlvLAorCQkJIHUzMiBhaF9zaWduYWxfdHlwZSkKIHsKLQl1MzIgYWhfc2lnbmFsX3R5cGU7CiAJdTMyIGdwaW9fc2hpZnQ7CiAKLQlzdGF0aWMgdTMyIE11eFNpZ25hbENvbnZlcnNpb25UYWJsZVtdID0gewotCi0JCUFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQsCi0KLQkJQVJfR1BJT19PVVRQVVRfTVVYX0FTX1BDSUVfQVRURU5USU9OX0xFRCwKLQotCQlBUl9HUElPX09VVFBVVF9NVVhfQVNfUENJRV9QT1dFUl9MRUQsCi0KLQkJQVJfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19ORVRXT1JLX0xFRCwKLQotCQlBUl9HUElPX09VVFBVVF9NVVhfQVNfTUFDX1BPV0VSX0xFRCwKLQl9OwotCi0JaWYgKChoYWxTaWduYWxUeXBlID49IDApCi0JICAgICYmIChoYWxTaWduYWxUeXBlIDwgQVJSQVlfU0laRShNdXhTaWduYWxDb252ZXJzaW9uVGFibGUpKSkKLQkJYWhfc2lnbmFsX3R5cGUgPSBNdXhTaWduYWxDb252ZXJzaW9uVGFibGVbaGFsU2lnbmFsVHlwZV07Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci0KIAlhdGg5a19od19ncGlvX2NmZ19vdXRwdXRfbXV4KGFoLCBncGlvLCBhaF9zaWduYWxfdHlwZSk7CiAKIAlncGlvX3NoaWZ0ID0gMiAqIGdwaW87CkBAIC0yODU2LDE5ICsyODI3LDQ2IEBACiAJCUFSX0dQSU9fT0VfT1VULAogCQkoQVJfR1BJT19PRV9PVVRfRFJWX0FMTCA8PCBncGlvX3NoaWZ0KSwKIAkJKEFSX0dQSU9fT0VfT1VUX0RSViA8PCBncGlvX3NoaWZ0KSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgYXRoOWtfaHdfc2V0X2dwaW8oc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgZ3BpbywKLQkJCSAgICAgIHUzMiB2YWwpCit2b2lkIGF0aDlrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGhfaGFsICphaCwgdTMyIGdwaW8sIHUzMiB2YWwpCiB7CiAJUkVHX1JNVyhhaCwgQVJfR1BJT19JTl9PVVQsICgodmFsICYgMSkgPDwgZ3BpbyksCiAJCUFSX0dQSU9fQklUKGdwaW8pKTsKLQlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHUzMiBhdGg5a19od19ncGlvX2dldChzdHJ1Y3QgYXRoX2hhbCAqYWgsIHUzMiBncGlvKQorLyoKKyAqIENvbmZpZ3VyZSBHUElPIElucHV0IGxpbmVzCisgKi8KK3ZvaWQgYXRoOWtfaHdfY2ZnX2dwaW9faW5wdXQoc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgZ3BpbykKK3sKKwl1MzIgZ3Bpb19zaGlmdDsKKworCUFTU0VSVChncGlvIDwgYWgtPmFoX2NhcHMubnVtX2dwaW9fcGlucyk7CisKKwlncGlvX3NoaWZ0ID0gZ3BpbyA8PCAxOworCisJUkVHX1JNVyhhaCwKKwkJQVJfR1BJT19PRV9PVVQsCisJCShBUl9HUElPX09FX09VVF9EUlZfTk8gPDwgZ3Bpb19zaGlmdCksCisJCShBUl9HUElPX09FX09VVF9EUlYgPDwgZ3Bpb19zaGlmdCkpOworfQorCisjaWZkZWYgQ09ORklHX1JGS0lMTAorc3RhdGljIHZvaWQgYXRoOWtfZW5hYmxlX3Jma2lsbChzdHJ1Y3QgYXRoX2hhbCAqYWgpCit7CisJUkVHX1NFVF9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfRU5fVkFMLAorCQkgICAgQVJfR1BJT19JTlBVVF9FTl9WQUxfUkZTSUxFTlRfQkIpOworCisJUkVHX0NMUl9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfTVVYMiwKKwkJICAgIEFSX0dQSU9fSU5QVVRfTVVYMl9SRlNJTEVOVCk7CisKKwlhdGg5a19od19jZmdfZ3Bpb19pbnB1dChhaCwgYWgtPmFoX3Jma2lsbF9ncGlvKTsKKwlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX1RFU1QsIFJGU0lMRU5UX0JCKTsKK30KKyNlbmRpZgorCit1MzIgYXRoOWtfaHdfZ3Bpb19nZXQoc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgZ3BpbykKIHsKIAlpZiAoZ3BpbyA+PSBhaC0+YWhfY2Fwcy5udW1fZ3Bpb19waW5zKQogCQlyZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTI4ODMsNyArMjg4MSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBhdGg5a19od19wb3N0X2F0dGFjaChzdHJ1Y3QgYXRoX2hhbCAqYWgpCitzdGF0aWMgaW50IGF0aDlrX2h3X3Bvc3RfYXR0YWNoKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAlpbnQgZWNvZGU7CiAKQEAgLTMwODEsMTcgKzMwNzksMTcgQEAKIAogCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0VOSEFOQ0VEUE07CiAKKyNpZmRlZiBDT05GSUdfUkZLSUxMCiAJYWgtPmFoX3Jmc2lsZW50ID0gYXRoOWtfaHdfZ2V0X2VlcHJvbShhaHAsIEVFUF9SRl9TSUxFTlQpOwogCWlmIChhaC0+YWhfcmZzaWxlbnQgJiBFRVBfUkZTSUxFTlRfRU5BQkxFRCkgewotCQlhaHAtPmFoX2dwaW9TZWxlY3QgPQorCQlhaC0+YWhfcmZraWxsX2dwaW8gPQogCQkJTVMoYWgtPmFoX3Jmc2lsZW50LCBFRVBfUkZTSUxFTlRfR1BJT19TRUwpOwotCQlhaHAtPmFoX3BvbGFyaXR5ID0KKwkJYWgtPmFoX3Jma2lsbF9wb2xhcml0eSA9CiAJCQlNUyhhaC0+YWhfcmZzaWxlbnQsIEVFUF9SRlNJTEVOVF9QT0xBUklUWSk7CiAKLQkJYXRoOWtfaHdfc2V0Y2FwYWJpbGl0eShhaCwgQVRIOUtfQ0FQX1JGU0lMRU5ULCAxLCB0cnVlLAotCQkJCSAgICAgICBOVUxMKTsKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfUkZTSUxFTlQ7CiAJfQorI2VuZGlmCiAKIAlpZiAoKGFoLT5haF9tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl81NDE2X1BDSSkgfHwKIAkgICAgKGFoLT5haF9tYWNWZXJzaW9uID09IEFSX1NSRVZfVkVSU0lPTl81NDE2X1BDSUUpIHx8CkBAIC0zNTk1LDcgKzM1OTMsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBhdGg5a19od19nZXRfZ2Fpbl9ib3VuZGFyaWVzX3BkYWRjcyhzdHJ1Y3QgYXRoX2hhbCAqYWgsCiAJCQkJICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAogCQkJCSAgICBzdHJ1Y3QgY2FsX2RhdGFfcGVyX2ZyZXEgKnBSYXdEYXRhU2V0LApAQCAtMzc3Nyw3ICszNzc1LDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbAorc3RhdGljIGJvb2wKIGF0aDlrX2h3X3NldF9wb3dlcl9jYWxfdGFibGUoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkJICAgICBzdHJ1Y3QgYXI1NDE2X2VlcHJvbSAqcEVlcERhdGEsCiAJCQkgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLApAQCAtMzk4MCw3ICszOTc4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGF0aDlrX2h3X2dldF9sZWdhY3lfdGFyZ2V0X3Bvd2VycyhzdHJ1Y3QgYXRoX2hhbCAqYWgsCiAJCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwKIAkJCQkgIHN0cnVjdCBjYWxfdGFyZ2V0X3Bvd2VyX2xlZyAqcG93SW5mbywKQEAgLTQwNDYsNyArNDA0NCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBhdGg5a19od19nZXRfdGFyZ2V0X3Bvd2VycyhzdHJ1Y3QgYXRoX2hhbCAqYWgsCiAJCQkgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbiwKIAkJCSAgIHN0cnVjdCBjYWxfdGFyZ2V0X3Bvd2VyX2h0ICpwb3dJbmZvLApAQCAtNDExMyw3ICs0MTExLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2CitzdGF0aWMgdTE2CiBhdGg5a19od19nZXRfbWF4X2VkZ2VfcG93ZXIodTE2IGZyZXEsCiAJCQkgICAgc3RydWN0IGNhbF9jdGxfZWRnZXMgKnBSZEVkZ2VzUG93ZXIsCiAJCQkgICAgYm9vbCBpczJHSHopCkBAIC00MTQzLDcgKzQxNDEsNyBAQAogCXJldHVybiB0d2ljZU1heEVkZ2VQb3dlcjsKIH0KIAotc3RhdGljIGlubGluZSBib29sCitzdGF0aWMgYm9vbAogYXRoOWtfaHdfc2V0X3Bvd2VyX3Blcl9yYXRlX3RhYmxlKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCQkgIHN0cnVjdCBhcjU0MTZfZWVwcm9tICpwRWVwRGF0YSwKIAkJCQkgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLApAQCAtNTEyMiw3ICs1MTIwLDcgQEAKIAlSRUdfV1JJVEUoYWgsIEFSX1BIWV9NQVNLMl9QXzYxXzQ1LCB0bXBfbWFzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19od19pbml0X2NoYWluX21hc2tzKHN0cnVjdCBhdGhfaGFsICphaCkKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2luaXRfY2hhaW5fbWFza3Moc3RydWN0IGF0aF9oYWwgKmFoKQogewogCXN0cnVjdCBhdGhfaGFsXzU0MTYgKmFocCA9IEFINTQxNihhaCk7CiAJaW50IHJ4X2NoYWlubWFzaywgdHhfY2hhaW5tYXNrOwpAQCAtNTMyNiw3ICs1MzI0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19od19pbml0X3VzZXJfc2V0dGluZ3Moc3RydWN0IGF0aF9oYWwgKmFoKQorc3RhdGljIHZvaWQgYXRoOWtfaHdfaW5pdF91c2VyX3NldHRpbmdzKHN0cnVjdCBhdGhfaGFsICphaCkKIHsKIAlzdHJ1Y3QgYXRoX2hhbF81NDE2ICphaHAgPSBBSDU0MTYoYWgpOwogCkBAIC01MzQ1LDcgKzUzNDMsNyBAQAogCQlhdGg5a19od19zZXRfZ2xvYmFsX3R4dGltZW91dChhaCwgYWhwLT5haF9nbG9iYWx0eHRpbWVvdXQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAogYXRoOWtfaHdfcHJvY2Vzc19pbmkoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAogCQkgICAgIGVudW0gYXRoOWtfaHRfbWFjbW9kZSBtYWNtb2RlKQpAQCAtNTQ3Niw3ICs1NDc0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X3NldHVwX2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaGFsICphaCwKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X3NldHVwX2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCQkJICAgICAgc3RydWN0IGhhbF9jYWxfbGlzdCAqY3VyckNhbCkKIHsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVElNSU5HX0NUUkw0KDApLApAQCAtNTUxMiw4ICs1NTEwLDggQEAKIAkJICAgIEFSX1BIWV9USU1JTkdfQ1RSTDRfRE9fQ0FMKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X3Jlc2V0X2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaGFsICphaCwKLQkJCQkJICAgICAgc3RydWN0IGhhbF9jYWxfbGlzdCAqY3VyckNhbCkKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X3Jlc2V0X2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaGFsICphaCwKKwkJCQkgICAgICAgc3RydWN0IGhhbF9jYWxfbGlzdCAqY3VyckNhbCkKIHsKIAlzdHJ1Y3QgYXRoX2hhbF81NDE2ICphaHAgPSBBSDU0MTYoYWgpOwogCWludCBpOwpAQCAtNTUzMiw3ICs1NTMwLDcgQEAKIAlhaHAtPmFoX0NhbFNhbXBsZXMgPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBhdGg5a19od19wZXJfY2FsaWJyYXRpb24oc3RydWN0IGF0aF9oYWwgKmFoLAogCQkJIHN0cnVjdCBhdGg5a19jaGFubmVsICppY2hhbiwKIAkJCSB1OCByeGNoYWlubWFzaywKQEAgLTU2MjIsNyArNTYyMCw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbAorc3RhdGljIGJvb2wKIGF0aDlrX2h3X2NoYW5uZWxfY2hhbmdlKHN0cnVjdCBhdGhfaGFsICphaCwKIAkJCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAogCQkJZW51bSBhdGg5a19odF9tYWNtb2RlIG1hY21vZGUpCkBAIC01Nzk5LDggKzU3OTcsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBhdGg5a19od19pbml0X2NhbChzdHJ1Y3QgYXRoX2hhbCAqYWgsCi0JCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKK3N0YXRpYyBib29sIGF0aDlrX2h3X2luaXRfY2FsKHN0cnVjdCBhdGhfaGFsICphaCwKKwkJCSAgICAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBhdGhfaGFsXzU0MTYgKmFocCA9IEFINTQxNihhaCk7CiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmljaGFuID0KQEAgLTU4NjEsNyArNTg1OSw3IEBACiB9CiAKIAotYm9vbCBhdGg5a19od19yZXNldChzdHJ1Y3QgYXRoX2hhbCAqYWgsIGVudW0gYXRoOWtfb3Btb2RlIG9wbW9kZSwKK2Jvb2wgYXRoOWtfaHdfcmVzZXQoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkgICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCiAJCSAgICBlbnVtIGF0aDlrX2h0X21hY21vZGUgbWFjbW9kZSwKIAkJICAgIHU4IHR4Y2hhaW5tYXNrLCB1OCByeGNoYWlubWFzaywKQEAgLTU4NjksNyArNTg2Nyw2IEBACiAJCSAgICBib29sIGJDaGFubmVsQ2hhbmdlLAogCQkgICAgaW50ICpzdGF0dXMpCiB7Ci0jZGVmaW5lIEZBSUwoX2NvZGUpICAgICBkbyB7IGVjb2RlID0gX2NvZGU7IGdvdG8gYmFkOyB9IHdoaWxlICgwKQogCXUzMiBzYXZlTGVkU3RhdGU7CiAJc3RydWN0IGF0aF9oYWxfNTQxNiAqYWhwID0gQUg1NDE2KGFoKTsKIAlzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY3VyY2hhbiA9IGFoLT5haF9jdXJjaGFuOwpAQCAtNTg5MSwxMSArNTg4OCwxNCBAQAogCQlEUFJJTlRGKGFoLT5haF9zYywgQVRIX0RCR19DSEFOTkVMLAogCQkJICIlczogaW52YWxpZCBjaGFubmVsICV1LzB4JXg7IG5vIG1hcHBpbmdcbiIsCiAJCQkgX19mdW5jX18sIGNoYW4tPmNoYW5uZWwsIGNoYW4tPmNoYW5uZWxGbGFncyk7Ci0JCUZBSUwoLUVJTlZBTCk7CisJCWVjb2RlID0gLUVJTlZBTDsKKwkJZ290byBiYWQ7CiAJfQogCi0JaWYgKCFhdGg5a19od19zZXRwb3dlcihhaCwgQVRIOUtfUE1fQVdBS0UpKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKCFhdGg5a19od19zZXRwb3dlcihhaCwgQVRIOUtfUE1fQVdBS0UpKSB7CisJCWVjb2RlID0gLUVJTzsKKwkJZ290byBiYWQ7CisJfQogCiAJaWYgKGN1cmNoYW4pCiAJCWF0aDlrX2h3X2dldG5mKGFoLCBjdXJjaGFuKTsKQEAgLTU5MzIsNyArNTkzMiw4IEBACiAJaWYgKCFhdGg5a19od19jaGlwX3Jlc2V0KGFoLCBjaGFuKSkgewogCQlEUFJJTlRGKGFoLT5haF9zYywgQVRIX0RCR19SRVNFVCwgIiVzOiBjaGlwIHJlc2V0IGZhaWxlZFxuIiwKIAkJCSBfX2Z1bmNfXyk7Ci0JCUZBSUwoLUVJTyk7CisJCWVjb2RlID0gLUVJTlZBTDsKKwkJZ290byBiYWQ7CiAJfQogCiAJaWYgKEFSX1NSRVZfOTI4MChhaCkpIHsKQEAgLTU5NDUsMTIgKzU5NDYsMTQgQEAKIAkJCWVsc2UKIAkJCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgOSwgMSk7CiAJCX0KLQkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgOSwgQVRIOUtfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDksIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOwogCX0KIAogCWVjb2RlID0gYXRoOWtfaHdfcHJvY2Vzc19pbmkoYWgsIGNoYW4sIG1hY21vZGUpOwotCWlmIChlY29kZSAhPSAwKQorCWlmIChlY29kZSAhPSAwKSB7CisJCWVjb2RlID0gLUVJTlZBTDsKIAkJZ290byBiYWQ7CisJfQogCiAJaWYgKElTX0NIQU5fT0ZETShjaGFuKSB8fCBJU19DSEFOX0hUKGNoYW4pKQogCQlhdGg5a19od19zZXRfZGVsdGFfc2xvcGUoYWgsIGNoYW4pOwpAQCAtNTk2Myw3ICs1OTY2LDggQEAKIAlpZiAoIWF0aDlrX2h3X2VlcHJvbV9zZXRfYm9hcmRfdmFsdWVzKGFoLCBjaGFuKSkgewogCQlEUFJJTlRGKGFoLT5haF9zYywgQVRIX0RCR19FRVBST00sCiAJCQkgIiVzOiBlcnJvciBzZXR0aW5nIGJvYXJkIG9wdGlvbnNcbiIsIF9fZnVuY19fKTsKLQkJRkFJTCgtRUlPKTsKKwkJZWNvZGUgPSAtRUlPOworCQlnb3RvIGJhZDsKIAl9CiAKIAlhdGg5a19od19kZWNyZWFzZV9jaGFpbl9wb3dlcihhaCwgY2hhbik7CkBAIC01OTc1LDcgKzU5NzksNyBAQAogCQkgIHwgKGFoLT5haF9jb25maWcuCiAJCSAgICAgYWNrXzZtYiA/IEFSX1NUQV9JRDFfQUNLQ1RTXzZNQiA6IDApCiAJCSAgfCBhaHAtPmFoX3N0YUlkMURlZmF1bHRzKTsKLQlhdGg5a19od19zZXRfb3BlcmF0aW5nX21vZGUoYWgsIG9wbW9kZSk7CisJYXRoOWtfaHdfc2V0X29wZXJhdGluZ19tb2RlKGFoLCBhaC0+YWhfb3Btb2RlKTsKIAogCVJFR19XUklURShhaCwgQVJfQlNTTVNLTCwgZ2V0X3VuYWxpZ25lZF9sZTMyKGFocC0+YWhfYnNzaWRtYXNrKSk7CiAJUkVHX1dSSVRFKGFoLCBBUl9CU1NNU0tVLCBnZXRfdW5hbGlnbmVkX2xlMTYoYWhwLT5haF9ic3NpZG1hc2sgKyA0KSk7CkBAIC01OTkxLDExICs1OTk1LDE1IEBACiAJUkVHX1dSSVRFKGFoLCBBUl9SU1NJX1RIUiwgSU5JVF9SU1NJX1RIUik7CiAKIAlpZiAoQVJfU1JFVl85MjgwXzEwX09SX0xBVEVSKGFoKSkgewotCQlpZiAoIShhdGg5a19od19hcjkyODBfc2V0X2NoYW5uZWwoYWgsIGNoYW4pKSkKLQkJCUZBSUwoLUVJTyk7CisJCWlmICghKGF0aDlrX2h3X2FyOTI4MF9zZXRfY2hhbm5lbChhaCwgY2hhbikpKSB7CisJCQllY29kZSA9IC1FSU87CisJCQlnb3RvIGJhZDsKKwkJfQogCX0gZWxzZSB7Ci0JCWlmICghKGF0aDlrX2h3X3NldF9jaGFubmVsKGFoLCBjaGFuKSkpCi0JCQlGQUlMKC1FSU8pOworCQlpZiAoIShhdGg5a19od19zZXRfY2hhbm5lbChhaCwgY2hhbikpKSB7CisJCQllY29kZSA9IC1FSU87CisJCQlnb3RvIGJhZDsKKwkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUl9OVU1fRENVOyBpKyspCkBAIC02MDA1LDEzICs2MDEzLDE1IEBACiAJZm9yIChpID0gMDsgaSA8IGFoLT5haF9jYXBzLnRvdGFsX3F1ZXVlczsgaSsrKQogCQlhdGg5a19od19yZXNldHR4cXVldWUoYWgsIGkpOwogCi0JYXRoOWtfaHdfaW5pdF9pbnRlcnJ1cHRfbWFza3MoYWgsIG9wbW9kZSk7CisJYXRoOWtfaHdfaW5pdF9pbnRlcnJ1cHRfbWFza3MoYWgsIGFoLT5haF9vcG1vZGUpOwogCWF0aDlrX2h3X2luaXRfcW9zKGFoKTsKIAorI2lmZGVmIENPTkZJR19SRktJTEwKKwlpZiAoYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SRlNJTEVOVCkKKwkJYXRoOWtfZW5hYmxlX3Jma2lsbChhaCk7CisjZW5kaWYKIAlhdGg5a19od19pbml0X3VzZXJfc2V0dGluZ3MoYWgpOwogCi0JYWgtPmFoX29wbW9kZSA9IG9wbW9kZTsKLQogCVJFR19XUklURShhaCwgQVJfU1RBX0lEMSwKIAkJICBSRUdfUkVBRChhaCwgQVJfU1RBX0lEMSkgfCBBUl9TVEFfSUQxX1BSRVNFUlZFX1NFUU5VTSk7CiAKQEAgLTYwMjcsOCArNjAzNywxMCBAQAogCiAJYXRoOWtfaHdfaW5pdF9iYihhaCwgY2hhbik7CiAKLQlpZiAoIWF0aDlrX2h3X2luaXRfY2FsKGFoLCBjaGFuKSkKLQkJRkFJTCgtRU5PREVWKTsKKwlpZiAoIWF0aDlrX2h3X2luaXRfY2FsKGFoLCBjaGFuKSl7CisJCWVjb2RlID0gLUVJTzs7CisJCWdvdG8gYmFkOworCX0KIAogCXJ4X2NoYWlubWFzayA9IGFocC0+YWhfcnhjaGFpbm1hc2s7CiAJaWYgKChyeF9jaGFpbm1hc2sgPT0gMHg1KSB8fCAocnhfY2hhaW5tYXNrID09IDB4MykpIHsKQEAgLTYwNjQsNyArNjA3Niw2IEBACiAJaWYgKHN0YXR1cykKIAkJKnN0YXR1cyA9IGVjb2RlOwogCXJldHVybiBmYWxzZTsKLSN1bmRlZiBGQUlMCiB9CiAKIGJvb2wgYXRoOWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aF9oYWwgKmFoKQpAQCAtNjUzOSwzMSArNjU1MCw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLSNpZmRlZiBDT05GSUdfQVRIOUtfUkZLSUxMCi1zdGF0aWMgdm9pZCBhdGg5a19lbmFibGVfcmZraWxsKHN0cnVjdCBhdGhfaGFsICphaCkKLXsKLQlzdHJ1Y3QgYXRoX2hhbF81NDE2ICphaHAgPSBBSDU0MTYoYWgpOwotCi0JUkVHX1NFVF9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfRU5fVkFMLAotCQkgICAgQVJfR1BJT19JTlBVVF9FTl9WQUxfUkZTSUxFTlRfQkIpOwotCi0JUkVHX0NMUl9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfTVVYMiwKLQkJICAgIEFSX0dQSU9fSU5QVVRfTVVYMl9SRlNJTEVOVCk7Ci0KLQlhdGg5a19od19jZmdfZ3Bpb19pbnB1dChhaCwgYWhwLT5haF9ncGlvU2VsZWN0KTsKLQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX1RFU1QsIFJGU0lMRU5UX0JCKTsKLQotCWlmIChhaHAtPmFoX2dwaW9CaXQgPT0gYXRoOWtfaHdfZ3Bpb19nZXQoYWgsIGFocC0+YWhfZ3Bpb1NlbGVjdCkpIHsKLQotCQlhdGg5a19od19zZXRfZ3Bpb19pbnRyKGFoLCBhaHAtPmFoX2dwaW9TZWxlY3QsCi0JCQkJICAgICAgICFhaHAtPmFoX2dwaW9CaXQpOwotCX0gZWxzZSB7Ci0JCWF0aDlrX2h3X3NldF9ncGlvX2ludHIoYWgsIGFocC0+YWhfZ3Bpb1NlbGVjdCwKLQkJCQkgICAgICAgYWhwLT5haF9ncGlvQml0KTsKLQl9Ci19Ci0jZW5kaWYKLQogdm9pZAogYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChzdHJ1Y3QgYXRoX2hhbCAqYWgsIGNvbnN0IHU4ICpic3NpZCwKIAkJICAgICAgIHUxNiBhc3NvY0lkKQpAQCAtNzY3OCw4ICs3NjY0LDcgQEAKIAlSRUdfV1JJVEUoYWgsIEFSX0RSRVRSWV9MSU1JVChxKSwKIAkJICBTTShJTklUX1NTSF9SRVRSWSwgQVJfRF9SRVRSWV9MSU1JVF9TVEFfU0gpCiAJCSAgfCBTTShJTklUX1NMR19SRVRSWSwgQVJfRF9SRVRSWV9MSU1JVF9TVEFfTEcpCi0JCSAgfCBTTShxaS0+dHFpX3NocmV0cnksIEFSX0RfUkVUUllfTElNSVRfRlJfU0gpCi0JCSk7CisJCSAgfCBTTShxaS0+dHFpX3NocmV0cnksIEFSX0RfUkVUUllfTElNSVRfRlJfU0gpKTsKIAogCVJFR19XUklURShhaCwgQVJfUU1JU0MocSksIEFSX1FfTUlTQ19EQ1VfRUFSTFlfVEVSTV9SRVEpOwogCVJFR19XUklURShhaCwgQVJfRE1JU0MocSksCkBAIC04MzI0LDE1ICs4MzA5LDcgQEAKIAkJKmVycm9yID0gLUVOWElPOwogCQlicmVhazsKIAl9Ci0JaWYgKGFoICE9IE5VTEwpIHsKLQkJYWgtPmFoX2RldmlkID0gYWgtPmFoX2RldmlkOwotCQlhaC0+YWhfc3VidmVuZG9yaWQgPSBhaC0+YWhfc3VidmVuZG9yaWQ7Ci0JCWFoLT5haF9tYWNWZXJzaW9uID0gYWgtPmFoX21hY1ZlcnNpb247Ci0JCWFoLT5haF9tYWNSZXYgPSBhaC0+YWhfbWFjUmV2OwotCQlhaC0+YWhfcGh5UmV2ID0gYWgtPmFoX3BoeVJldjsKLQkJYWgtPmFoX2FuYWxvZzVHaHpSZXYgPSBhaC0+YWhfYW5hbG9nNUdoelJldjsKLQkJYWgtPmFoX2FuYWxvZzJHaHpSZXYgPSBhaC0+YWhfYW5hbG9nMkdoelJldjsKLQl9CisKIAlyZXR1cm4gYWg7CiB9CiAKQEAgLTg0MzksMjMgKzg0MTYsNDggQEAKIAl9CiB9CiAKLWludDE2X3QKKy8qIFdlIGNhbiB0dW5lIHRoaXMgYXMgd2UgZ28gYnkgbW9uaXRvcmluZyByZWFsbHkgbG93IHZhbHVlcyAqLworI2RlZmluZSBBVEg5S19ORl9UT09fTE9XCS02MAorCisvKiBBUjU0MTYgbWF5IHJldHVybiB2ZXJ5IGhpZ2ggdmFsdWUgKGxpa2UgLTMxIGRCbSksIGluIHRob3NlIGNhc2VzIHRoZSBuZgorICogaXMgaW5jb3JyZWN0IGFuZCB3ZSBzaG91bGQgdXNlIHRoZSBzdGF0aWMgTkYgdmFsdWUuIExhdGVyIHdlIGNhbiB0cnkgdG8KKyAqIGZpbmQgb3V0IHdoeSB0aGV5IGFyZSByZXBvcnRpbmcgdGhlc2UgdmFsdWVzICovCitzdGF0aWMgYm9vbCBhdGg5a19od19uZl9pbl9yYW5nZShzdHJ1Y3QgYXRoX2hhbCAqYWgsIHMxNiBuZikKK3sKKwlpZiAobmYgPiBBVEg5S19ORl9UT09fTE9XKSB7CisJCURQUklOVEYoYWgtPmFoX3NjLCBBVEhfREJHX05GX0NBTCwKKwkJCSAiJXM6IG5vaXNlIGZsb29yIHZhbHVlIGRldGVjdGVkICglZCkgaXMgIgorCQkJImxvd2VyIHRoYW4gd2hhdCB3ZSB0aGluayBpcyBhICIKKwkJCSJyZWFzb25hYmxlIHZhbHVlICglZClcbiIsCisJCQkgX19mdW5jX18sIG5mLCBBVEg5S19ORl9UT09fTE9XKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworczE2CiBhdGg5a19od19nZXRjaGFuX25vaXNlKHN0cnVjdCBhdGhfaGFsICphaCwgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pCiB7CiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmljaGFuOworCXMxNiBuZjsKIAogCWljaGFuID0gYXRoOWtfcmVnZF9jaGVja19jaGFubmVsKGFoLCBjaGFuKTsKIAlpZiAoaWNoYW4gPT0gTlVMTCkgewogCQlEUFJJTlRGKGFoLT5haF9zYywgQVRIX0RCR19ORl9DQUwsCiAJCQkgIiVzOiBpbnZhbGlkIGNoYW5uZWwgJXUvMHgleDsgbm8gbWFwcGluZ1xuIiwKIAkJCSBfX2Z1bmNfXywgY2hhbi0+Y2hhbm5lbCwgY2hhbi0+Y2hhbm5lbEZsYWdzKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBBVEhfREVGQVVMVF9OT0lTRV9GTE9PUjsKIAl9CiAJaWYgKGljaGFuLT5yYXdOb2lzZUZsb29yID09IDApIHsKIAkJZW51bSB3aXJlbGVzc19tb2RlIG1vZGUgPSBhdGg5a19od19jaGFuMndtb2RlKGFoLCBjaGFuKTsKLQkJcmV0dXJuIE5PSVNFX0ZMT09SW21vZGVdOworCQluZiA9IE5PSVNFX0ZMT09SW21vZGVdOwogCX0gZWxzZQotCQlyZXR1cm4gaWNoYW4tPnJhd05vaXNlRmxvb3I7CisJCW5mID0gaWNoYW4tPnJhd05vaXNlRmxvb3I7CisKKwlpZiAoIWF0aDlrX2h3X25mX2luX3JhbmdlKGFoLCBuZikpCisJCW5mID0gQVRIX0RFRkFVTFRfTk9JU0VfRkxPT1I7CisKKwlyZXR1cm4gbmY7CiB9CiAKIGJvb2wgYXRoOWtfaHdfc2V0X3RzZmFkanVzdChzdHJ1Y3QgYXRoX2hhbCAqYWgsIHUzMiBzZXR0aW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL2h3LmgKaW5kZXggYWU2ODBmMi4uMjExMzgxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9ody5oCkBAIC0zMTQsMTQgKzMxNCwxMSBAQAogI2RlZmluZSBSWFNUQVRVU19SQVRFKGFoLCBhZHMpICAoQVJfU1JFVl81NDE2X1YyMF9PUl9MQVRFUihhaCkgPwlcCiAJCQkJIE1TKGFkcy0+ZHNfcnhzdGF0dXMwLCBBUl9SeFJhdGUpIDoJXAogCQkJCSAoYWRzLT5kc19yeHN0YXR1czMgPj4gMikgJiAweEZGKQotI2RlZmluZSBSWFNUQVRVU19EVVBMSUNBVEUoYWgsIGFkcykgIChBUl9TUkVWXzU0MTZfVjIwX09SX0xBVEVSKGFoKSA/CVwKLQkJCQkgICAgICBNUyhhZHMtPmRzX3J4c3RhdHVzMywgQVJfUGFyYWxsZWw0MCkgOiBcCi0JCQkJICAgICAgKGFkcy0+ZHNfcnhzdGF0dXMzID4+IDEwKSAmIDB4MSkKIAotI2RlZmluZSBzZXQxMW5Ucmllcyhfc2VyaWVzLCBfaW5kZXgpCQkJCVwKKyNkZWZpbmUgc2V0MTFuVHJpZXMoX3NlcmllcywgX2luZGV4KSBcCiAJKFNNKChfc2VyaWVzKVtfaW5kZXhdLlRyaWVzLCBBUl9YbWl0RGF0YVRyaWVzIyNfaW5kZXgpKQogCi0jZGVmaW5lIHNldDExblJhdGUoX3NlcmllcywgX2luZGV4KQkJCQlcCisjZGVmaW5lIHNldDExblJhdGUoX3NlcmllcywgX2luZGV4KSBcCiAJKFNNKChfc2VyaWVzKVtfaW5kZXhdLlJhdGUsIEFSX1htaXRSYXRlIyNfaW5kZXgpKQogCiAjZGVmaW5lIHNldDExblBrdER1clJUU0NUUyhfc2VyaWVzLCBfaW5kZXgpCQkJCVwKQEAgLTMzMCwxMSArMzI3LDExIEBACiAJCUFSX1JUU0NUU1F1YWwjI19pbmRleCA6IDApKQogCiAjZGVmaW5lIHNldDExblJhdGVGbGFncyhfc2VyaWVzLCBfaW5kZXgpCQkJCVwKLQkoKChfc2VyaWVzKVtfaW5kZXhdLlJhdGVGbGFncyAmIEFUSDlLX1JBVEVTRVJJRVNfMjA0MCA/IFwKLQkJQVJfMjA0MF8jI19pbmRleCA6IDApIFwKLQl8KChfc2VyaWVzKVtfaW5kZXhdLlJhdGVGbGFncyAmIEFUSDlLX1JBVEVTRVJJRVNfSEFMRkdJID8gXAotCQlBUl9HSSMjX2luZGV4IDogMCkgXAotCXxTTSgoX3NlcmllcylbX2luZGV4XS5DaFNlbCwgQVJfQ2hhaW5TZWwjI19pbmRleCkpCisJKCgoX3NlcmllcylbX2luZGV4XS5SYXRlRmxhZ3MgJiBBVEg5S19SQVRFU0VSSUVTXzIwNDAgPwkJXAorCSAgQVJfMjA0MF8jI19pbmRleCA6IDApCQkJCQkJXAorCSB8KChfc2VyaWVzKVtfaW5kZXhdLlJhdGVGbGFncyAmIEFUSDlLX1JBVEVTRVJJRVNfSEFMRkdJID8JXAorCSAgIEFSX0dJIyNfaW5kZXggOiAwKQkJCQkJCVwKKwkgfFNNKChfc2VyaWVzKVtfaW5kZXhdLkNoU2VsLCBBUl9DaGFpblNlbCMjX2luZGV4KSkKIAogI2RlZmluZSBBUl9TUkVWXzkxMDAoYWgpICgoYWgtPmFoX21hY1ZlcnNpb24pID09IEFSX1NSRVZfVkVSU0lPTl85MTAwKQogCkBAIC0zNDYsOSArMzQzLDYgQEAKICNkZWZpbmUgTUFYX1RYX0ZJRk9fVEhSRVNIT0xEICAgKCg0MDk2IC8gNjQpIC0gMSkKICNkZWZpbmUgSU5JVF9UWF9GSUZPX1RIUkVTSE9MRCAgTUlOX1RYX0ZJRk9fVEhSRVNIT0xECiAKLSNkZWZpbmUgTlVNX0NPUk5FUl9GSVhfQklUU18yMTMzICAgIDcKLSNkZWZpbmUgQ0NLX09GRE1fR0FJTl9ERUxUQSAgICAgICAgIDE1Ci0KIHN0cnVjdCBhcjU0MTZBbmlTdGF0ZSB7CiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgYzsKIAl1OCBub2lzZUltbXVuaXR5TGV2ZWw7CkBAIC0zNzcsMTEgKzM3MSw4IEBACiB9OwogCiAjZGVmaW5lIEhBTF9QUk9DRVNTX0FOSSAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBIQUxfUkFEQVJfRU4gICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSEFMX0FSX0VOICAgICAgICAgICAweDQwMDAwMDAwCi0KICNkZWZpbmUgRE9fQU5JKGFoKSBcCi0gICAgKChBSDU0MTYoYWgpLT5haF9wcm9jUGh5RXJyICYgSEFMX1BST0NFU1NfQU5JKSkKKwkoKEFINTQxNihhaCktPmFoX3Byb2NQaHlFcnIgJiBIQUxfUFJPQ0VTU19BTkkpKQogCiBzdHJ1Y3QgYXI1NDE2U3RhdHMgewogCXUzMiBhc3RfYW5pX25pdXA7CkBAIC00MjUsNyArNDE2LDYgQEAKICNkZWZpbmUgQVI1NDE2X0VFUF9NSU5PUl9WRVJfNyAgICAgICAweDcKICNkZWZpbmUgQVI1NDE2X0VFUF9NSU5PUl9WRVJfOSAgICAgICAweDkKIAotI2RlZmluZSBBUjU0MTZfRUVQX1NUQVJUX0xPQyAgICAgICAgICAgIDI1NgogI2RlZmluZSBBUjU0MTZfTlVNXzVHX0NBTF9QSUVSUyAgICAgICAgIDgKICNkZWZpbmUgQVI1NDE2X05VTV8yR19DQUxfUElFUlMgICAgICAgICA0CiAjZGVmaW5lIEFSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSUyAgOApAQCAtNDQxLDI1ICs0MzEsMTAgQEAKICNkZWZpbmUgQVI1NDE2X0VFUFJPTV9NT0RBTF9TUFVSUyAgICAgICA1CiAjZGVmaW5lIEFSNTQxNl9NQVhfUkFURV9QT1dFUiAgICAgICAgICAgNjMKICNkZWZpbmUgQVI1NDE2X05VTV9QREFEQ19WQUxVRVMgICAgICAgICAxMjgKLSNkZWZpbmUgQVI1NDE2X05VTV9SQVRFUyAgICAgICAgICAgICAgICAxNgogI2RlZmluZSBBUjU0MTZfQkNIQU5fVU5VU0VEICAgICAgICAgICAgIDB4RkYKICNkZWZpbmUgQVI1NDE2X01BWF9QV1JfUkFOR0VfSU5fSEFMRl9EQiA2NAotI2RlZmluZSBBUjU0MTZfRUVQTUlTQ19CSUdfRU5ESUFOICAgICAgIDB4MDEKICNkZWZpbmUgQVI1NDE2X01BWF9DSEFJTlMgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEFSNTQxNl9BTlRfMTZTICAgICAgICAgICAgICAgICAgMjUKLQotI2RlZmluZSBBUjU0MTZfTlVNX0FOVF9DSEFJTl9GSUVMRFMgICAgIDcKLSNkZWZpbmUgQVI1NDE2X05VTV9BTlRfQ09NTU9OX0ZJRUxEUyAgICA0Ci0jZGVmaW5lIEFSNTQxNl9TSVpFX0FOVF9DSEFJTl9GSUVMRCAgICAgMwotI2RlZmluZSBBUjU0MTZfU0laRV9BTlRfQ09NTU9OX0ZJRUxEICAgIDQKLSNkZWZpbmUgQVI1NDE2X0FOVF9DSEFJTl9NQVNLICAgICAgICAgICAweDcKLSNkZWZpbmUgQVI1NDE2X0FOVF9DT01NT05fTUFTSyAgICAgICAgICAweGYKLSNkZWZpbmUgQVI1NDE2X0NIQUlOXzBfSURYICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFSNTQxNl9DSEFJTl8xX0lEWCAgICAgICAgICAgICAgMQotI2RlZmluZSBBUjU0MTZfQ0hBSU5fMl9JRFggICAgICAgICAgICAgIDIKLQogI2RlZmluZSBBUjU0MTZfUFdSX1RBQkxFX09GRlNFVCAgICAgICAgIC01Ci0jZGVmaW5lIEFSNTQxNl9MRUdBQ1lfQ0hBSU5NQVNLICAgICAgICAgMQogCiBlbnVtIGVlcHJvbV9wYXJhbSB7CiAJRUVQX05GVEhSRVNIXzUsCkBAIC02MzMsNyArNjA4LDcgQEAKIH07CiAKICNkZWZpbmUgSU5JVF9JTklfQVJSQVkoaW5pYXJyYXksIGFycmF5LCByb3dzLCBjb2x1bW5zKSBkbyB7CVwKLQkJKGluaWFycmF5KS0+aWFfYXJyYXkgPSAodTMyICopKGFycmF5KTsgICAgXAorCQkoaW5pYXJyYXkpLT5pYV9hcnJheSA9ICh1MzIgKikoYXJyYXkpOwkJXAogCQkoaW5pYXJyYXkpLT5pYV9yb3dzID0gKHJvd3MpOwkJCVwKIAkJKGluaWFycmF5KS0+aWFfY29sdW1ucyA9IChjb2x1bW5zKTsJCVwKIAl9IHdoaWxlICgwKQpAQCAtNjQxLDE2ICs2MTYsMTYgQEAKICNkZWZpbmUgSU5JX1JBKGluaWFycmF5LCByb3csIGNvbHVtbikgXAogCSgoKGluaWFycmF5KS0+aWFfYXJyYXkpWyhyb3cpICoJKChpbmlhcnJheSktPmlhX2NvbHVtbnMpICsgKGNvbHVtbildKQogCi0jZGVmaW5lIElOSVRfQ0FMKF9wZXJDYWwpIGRvIHsgXAotCQkoX3BlckNhbCktPmNhbFN0YXRlID0gQ0FMX1dBSVRJTkc7IFwKLQkJKF9wZXJDYWwpLT5jYWxOZXh0ID0gTlVMTDsgXAorI2RlZmluZSBJTklUX0NBTChfcGVyQ2FsKSBkbyB7CQkJCVwKKwkJKF9wZXJDYWwpLT5jYWxTdGF0ZSA9IENBTF9XQUlUSU5HOwlcCisJCShfcGVyQ2FsKS0+Y2FsTmV4dCA9IE5VTEw7CQlcCiAJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBJTlNFUlRfQ0FMKF9haHAsIF9wZXJDYWwpCQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlpZiAoKF9haHApLT5haF9jYWxfbGlzdF9sYXN0ID09IE5VTEwpIHsJCQlcCi0JCQkoX2FocCktPmFoX2NhbF9saXN0ID0gXAotCQkJCShfYWhwKS0+YWhfY2FsX2xpc3RfbGFzdCA9IChfcGVyQ2FsKTsgXAorCQkJKF9haHApLT5haF9jYWxfbGlzdCA9CQkJCVwKKwkJCQkoX2FocCktPmFoX2NhbF9saXN0X2xhc3QgPSAoX3BlckNhbCk7CVwKIAkJCSgoX2FocCktPmFoX2NhbF9saXN0X2xhc3QpLT5jYWxOZXh0ID0gKF9wZXJDYWwpOyBcCiAJCX0gZWxzZSB7CQkJCQkJXAogCQkJKChfYWhwKS0+YWhfY2FsX2xpc3RfbGFzdCktPmNhbE5leHQgPSAoX3BlckNhbCk7IFwKQEAgLTY5NiwyNSArNjcxLDI5IEBACiBzdHJ1Y3QgYXRoX2hhbF81NDE2IHsKIAlzdHJ1Y3QgYXRoX2hhbCBhaDsKIAlzdHJ1Y3QgYXI1NDE2X2VlcHJvbSBhaF9lZXByb207CisJc3RydWN0IGFyNTQxNlN0YXRzIGFoX3N0YXRzOworCXN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvIGFoX3R4cVtBVEg5S19OVU1fVFhfUVVFVUVTXTsKKwl2b2lkIF9faW9tZW0gKmFoX2NhbF9tZW07CisKIAl1OCBhaF9tYWNhZGRyW0VUSF9BTEVOXTsKIAl1OCBhaF9ic3NpZFtFVEhfQUxFTl07CiAJdTggYWhfYnNzaWRtYXNrW0VUSF9BTEVOXTsKIAl1MTYgYWhfYXNzb2NJZDsKKwogCWludDE2X3QgYWhfY3VyY2hhblJhZEluZGV4OwogCXUzMiBhaF9tYXNrUmVnOwotCXN0cnVjdCBhcjU0MTZTdGF0cyBhaF9zdGF0czsKLQl1MzIgYWhfdHhEZXNjTWFzazsKIAl1MzIgYWhfdHhPa0ludGVycnVwdE1hc2s7CiAJdTMyIGFoX3R4RXJySW50ZXJydXB0TWFzazsKIAl1MzIgYWhfdHhEZXNjSW50ZXJydXB0TWFzazsKIAl1MzIgYWhfdHhFb2xJbnRlcnJ1cHRNYXNrOwogCXUzMiBhaF90eFVybkludGVycnVwdE1hc2s7Ci0Jc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gYWhfdHhxW0FUSDlLX05VTV9UWF9RVUVVRVNdOwotCWVudW0gYXRoOWtfcG93ZXJfbW9kZSBhaF9wb3dlck1vZGU7CiAJYm9vbCBhaF9jaGlwRnVsbFNsZWVwOwogCXUzMiBhaF9hdGltV2luZG93OwotCWVudW0gYXRoOWtfYW50X3NldHRpbmcgYWhfZGl2ZXJzaXR5Q29udHJvbDsKIAl1MTYgYWhfYW50ZW5uYVN3aXRjaFN3YXA7CisJZW51bSBhdGg5a19wb3dlcl9tb2RlIGFoX3Bvd2VyTW9kZTsKKwllbnVtIGF0aDlrX2FudF9zZXR0aW5nIGFoX2RpdmVyc2l0eUNvbnRyb2w7CisKKwkvKiBDYWxpYnJhdGlvbiAqLwogCWVudW0gaGFsX2NhbF90eXBlcyBhaF9zdXBwQ2FsczsKIAlzdHJ1Y3QgaGFsX2NhbF9saXN0IGFoX2lxQ2FsRGF0YTsKIAlzdHJ1Y3QgaGFsX2NhbF9saXN0IGFoX2FkY0dhaW5DYWxEYXRhOwpAQCAtNzUxLDE2ICs3MzAsMTYgQEAKIAkJaW50MzJfdCBzaWduW0FSNTQxNl9NQVhfQ0hBSU5TXTsKIAl9IGFoX01lYXMzOwogCXUxNiBhaF9DYWxTYW1wbGVzOwotCXUzMiBhaF90eDZQb3dlckluSGFsZkRibTsKKwogCXUzMiBhaF9zdGFJZDFEZWZhdWx0czsKIAl1MzIgYWhfbWlzY01vZGU7Ci0JYm9vbCBhaF90cGNFbmFibGVkOwotCXUzMiBhaF9iZWFjb25JbnRlcnZhbDsKIAllbnVtIHsKIAkJQVVUT18zMktIWiwKIAkJVVNFXzMyS0haLAogCQlET05UX1VTRV8zMktIWiwKIAl9IGFoX2VuYWJsZTMya0h6Q2xvY2s7CisKKwkvKiBSRiAqLwogCXUzMiAqYWhfYW5hbG9nQmFuazBEYXRhOwogCXUzMiAqYWhfYW5hbG9nQmFuazFEYXRhOwogCXUzMiAqYWhfYW5hbG9nQmFuazJEYXRhOwpAQCAtNzcwLDggKzc0OSw5IEBACiAJdTMyICphaF9hbmFsb2dCYW5rN0RhdGE7CiAJdTMyICphaF9hZGRhYzU0MTZfMjE7CiAJdTMyICphaF9iYW5rNlRlbXA7Ci0JdTMyIGFoX29mZG1UeFBvd2VyOworCiAJaW50MTZfdCBhaF90eFBvd2VySW5kZXhPZmZzZXQ7CisJdTMyIGFoX2JlYWNvbkludGVydmFsOwogCXUzMiBhaF9zbG90dGltZTsKIAl1MzIgYWhfYWNrdGltZW91dDsKIAl1MzIgYWhfY3RzdGltZW91dDsKQEAgLTc4MCw3ICs3NjAsOCBAQAogCXUzMiBhaF9ncGlvU2VsZWN0OwogCXUzMiBhaF9wb2xhcml0eTsKIAl1MzIgYWhfZ3Bpb0JpdDsKLQlib29sIGFoX2VlcEVuYWJsZWQ7CisKKwkvKiBBTkkgKi8KIAl1MzIgYWhfcHJvY1BoeUVycjsKIAlib29sIGFoX2hhc0h3UGh5Q291bnRlcnM7CiAJdTMyIGFoX2FuaVBlcmlvZDsKQEAgLTc5MCwxOCArNzcxLDE0IEBACiAJaW50IGFoX2NvYXJzZUhpZ2hbNV07CiAJaW50IGFoX2NvYXJzZUxvd1s1XTsKIAlpbnQgYWhfZmlycHdyWzVdOwotCXUxNiBhaF9yYXRlc0FycmF5WzE2XTsKKwllbnVtIGF0aDlrX2FuaV9jbWQgYWhfYW5pX2Z1bmN0aW9uOworCiAJdTMyIGFoX2ludHJUeHFzOwogCWJvb2wgYWhfaW50ck1pdGlnYXRpb247Ci0JdTMyIGFoX2N5Y2xlQ291bnQ7Ci0JdTMyIGFoX2N0bEJ1c3k7Ci0JdTMyIGFoX2V4dEJ1c3k7CiAJZW51bSBhdGg5a19odF9leHRwcm90c3BhY2luZyBhaF9leHRwcm90c3BhY2luZzsKIAl1OCBhaF90eGNoYWlubWFzazsKIAl1OCBhaF9yeGNoYWlubWFzazsKLQlpbnQgYWhfaHdwOwotCXZvaWQgX19pb21lbSAqYWhfY2FsX21lbTsKLQllbnVtIGF0aDlrX2FuaV9jbWQgYWhfYW5pX2Z1bmN0aW9uOworCiAJc3RydWN0IGFyNTQxNkluaUFycmF5IGFoX2luaU1vZGVzOwogCXN0cnVjdCBhcjU0MTZJbmlBcnJheSBhaF9pbmlDb21tb247CiAJc3RydWN0IGFyNTQxNkluaUFycmF5IGFoX2luaUJhbmswOwpAQCAtODIwLDEwICs3OTcsNiBAQAogCiAjZGVmaW5lIEZSRVEyRkJJTih4LCB5KSAoKHkpID8gKCh4KSAtIDIzMDApIDogKCgoeCkgLSA0ODAwKSAvIDUpKQogCi0jZGVmaW5lIElTXzU0MTZfRU1VKGFoKQkJCQkJXAotCSgoYWgtPmFoX2RldmlkID09IEFSNTQxNl9ERVZJRF9FTVUpIHx8CQlcCi0JIChhaC0+YWhfZGV2aWQgPT0gQVI1NDE2X0RFVklEX0VNVV9QQ0lFKSkKLQogI2RlZmluZSBhcjU0MTZSZkRldGFjaChhaCkgZG8gewkJCQkJXAogCQlpZiAoQUg1NDE2KGFoKS0+YWhfcmZIYWwucmZEZXRhY2ggIT0gTlVMTCkJXAogCQkJQUg1NDE2KGFoKS0+YWhfcmZIYWwucmZEZXRhY2goYWgpOwlcCkBAIC04NDEsOCArODE0LDggQEAKICNkZWZpbmUgUkVHX1dSSVRFX0FSUkFZKGluaWFycmF5LCBjb2x1bW4sIHJlZ1dyKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKIAkJaW50IHI7CQkJCQkJCVwKIAkJZm9yIChyID0gMDsgciA8ICgoaW5pYXJyYXkpLT5pYV9yb3dzKTsgcisrKSB7CQlcCi0JCQlSRUdfV1JJVEUoYWgsIElOSV9SQSgoaW5pYXJyYXkpLCAociksIDApLCBcCi0JCQkJSU5JX1JBKChpbmlhcnJheSksIHIsIChjb2x1bW4pKSk7IFwKKwkJCVJFR19XUklURShhaCwgSU5JX1JBKChpbmlhcnJheSksIChyKSwgMCksCVwKKwkJCQkgIElOSV9SQSgoaW5pYXJyYXkpLCByLCAoY29sdW1uKSkpOwlcCiAJCQlET19ERUxBWShyZWdXcik7CQkJCVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKQEAgLTg1MiwzMCArODI1LDIxIEBACiAjZGVmaW5lIENPRUZfU0NBTEVfUyAgICAgICAgICAgICAgICAyNAogI2RlZmluZSBIVDQwX0NIQU5ORUxfQ0VOVEVSX1NISUZUICAgMTAKIAotI2RlZmluZSBhcjU0MTZDaGVja09wTW9kZShfb3Btb2RlKQkJCQkJXAotCSgoX29wbW9kZSA9PSBBVEg5S19NX1NUQSkgfHwgKF9vcG1vZGUgPT0gQVRIOUtfTV9JQlNTKSB8fAlcCi0JIChfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQKSB8fCAoX29wbW9kZSA9PSBBVEg5S19NX01PTklUT1IpKQotCiAjZGVmaW5lIEFSNTQxNl9FRVBST01fTUFHSUNfT0ZGU0VUICAweDAKIAogI2RlZmluZSBBUjU0MTZfRUVQUk9NX1MgICAgICAgICAgICAgMgogI2RlZmluZSBBUjU0MTZfRUVQUk9NX09GRlNFVCAgICAgICAgMHgyMDAwCi0jZGVmaW5lIEFSNTQxNl9FRVBST01fU1RBUlRfQUREUgkJCVwKKyNkZWZpbmUgQVI1NDE2X0VFUFJPTV9TVEFSVF9BRERSIFwKIAkoQVJfU1JFVl85MTAwKGFoKSkgPyAweDFmZmYxMDAwIDogMHg1MDNmMTIwMAogI2RlZmluZSBBUjU0MTZfRUVQUk9NX01BWCAgICAgICAgICAgMHhhZTAKLSNkZWZpbmUgYXI1NDE2X2dldF9lZXBfdmVyKF9haHApCQkJCVwKKyNkZWZpbmUgYXI1NDE2X2dldF9lZXBfdmVyKF9haHApIFwKIAkoKChfYWhwKS0+YWhfZWVwcm9tLmJhc2VFZXBIZWFkZXIudmVyc2lvbiA+PiAxMikgJiAweEYpCi0jZGVmaW5lIGFyNTQxNl9nZXRfZWVwX3JldihfYWhwKQkJCQlcCisjZGVmaW5lIGFyNTQxNl9nZXRfZWVwX3JldihfYWhwKSBcCiAJKCgoX2FocCktPmFoX2VlcHJvbS5iYXNlRWVwSGVhZGVyLnZlcnNpb24pICYgMHhGRkYpCi0jZGVmaW5lIGFyNTQxNl9nZXRfbnR4Y2hhaW5zKF90eGNoYWlubWFzaykJCQkJXAorI2RlZmluZSBhcjU0MTZfZ2V0X250eGNoYWlucyhfdHhjaGFpbm1hc2spIFwKIAkoKChfdHhjaGFpbm1hc2sgPj4gMikgJiAxKSArIFwKIAkJKChfdHhjaGFpbm1hc2sgPj4gMSkgJiAxKSArIChfdHhjaGFpbm1hc2sgJiAxKSkKIAotI2RlZmluZSBJU19FRVBfTUlOT1JfVjMoX2FocCkgXAotCShhdGg5a19od19nZXRfZWVwcm9tKChfYWhwKSwgRUVQX01JTk9SX1JFVikgID49IEFSNTQxNl9FRVBfTUlOT1JfVkVSXzMpCi0KLSNkZWZpbmUgRklYRURfQ0NBX1RIUkVTSE9MRCAxNQotCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAjZGVmaW5lIEFSNTQxNl9FRVBST01fTUFHSUMgMHg1YWE1CiAjZWxzZQpAQCAtOTEwLDggKzg3NCw2IEBACiAjZGVmaW5lIEFSX0dQSU9EX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMUZGRgogI2RlZmluZSBBUl9HUElPX0JJVChfZ3BpbykgICAgICAgICAgICAgICgxIDw8IChfZ3BpbykpCiAKLSNkZWZpbmUgTUFYX0FOQUxPR19TVEFSVCAgICAgICAgICAgICAgICAzMTkKLQogI2RlZmluZSBIQUxfRVBfUk5EKHgsIG11bCkgXAogCSgoKCh4KSUobXVsKSkgPj0gKChtdWwpLzIpKSA/ICgoeCkgKyAoKG11bCkgLSAxKSkgLyAobXVsKSA6ICh4KS8obXVsKSkKICNkZWZpbmUgQkVBQ09OX1JTU0koYWhwKSBcCkBAIC05MjMsOCArODg1LDYgQEAKICNkZWZpbmUgQUhfVElNRU9VVCAgICAgICAgIDEwMDAwMAogI2RlZmluZSBBSF9USU1FX1FVQU5UVU0gICAgICAgIDEwCiAKLSNkZWZpbmUgSVMoX2MsIF9mKSAgICAgICAoKChfYyktPmNoYW5uZWxGbGFncyAmIF9mKSB8fCAwKQotCiAjZGVmaW5lIEFSX0tFWVRBQkxFX1NJWkUgMTI4CiAjZGVmaW5lIFBPV0VSX1VQX1RJTUUgICAgMjAwMDAwCiAKQEAgLTk2NCw2ICs5MjQsNiBAQAogI2RlZmluZSBPRkRNX1NZTUJPTF9USU1FX1FVQVJURVIgICAgMTYKIAogdTMyIGF0aDlrX2h3X2dldF9lZXByb20oc3RydWN0IGF0aF9oYWxfNTQxNiAqYWhwLAotCQkJICAgICAgZW51bSBlZXByb21fcGFyYW0gcGFyYW0pOworCQkJZW51bSBlZXByb21fcGFyYW0gcGFyYW0pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL21haW4uYwppbmRleCBjNTEwN2YyLi5mMDVmNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvbWFpbi5jCkBAIC0yMiw4ICsyMiw2IEBACiAjZGVmaW5lIEFUSF9QQ0lfVkVSU0lPTiAiMC4xIgogCiAjZGVmaW5lIElFRUU4MDIxMV9IVENBUF9NQVhSWEFNUERVX0ZBQ1RPUgkxMwotI2RlZmluZSBJRUVFODAyMTFfQUNUSU9OX0NBVF9IVAkJCTcKLSNkZWZpbmUgSUVFRTgwMjExX0FDVElPTl9IVF9UWENIV0lEVEgJCTAKIAogc3RhdGljIGNoYXIgKmRldl9pbmZvID0gImF0aDlrIjsKIApAQCAtMTQyLDcgKzE0MCw3IEBACiAJc3RydWN0IGF0aDlrX2tleXZhbCBoazsKIAljb25zdCB1OCAqbWFjID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKLQllbnVtIGllZWU4MDIxMV9pZl90eXBlcyBvcG1vZGU7CisJZW51bSBubDgwMjExX2lmdHlwZSBvcG1vZGU7CiAKIAltZW1zZXQoJmhrLCAwLCBzaXplb2YoaGspKTsKIApAQCAtMTgxLDE0ICsxNzksMTQgQEAKIAkgKi8KIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkcikpIHsKIAkJc3dpdGNoIChvcG1vZGUpIHsKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJCS8qIGRlZmF1bHQga2V5OiAgY291bGQgYmUgZ3JvdXAgV1BBIGtleQogCQkJICogb3IgY291bGQgYmUgc3RhdGljIFdFUCBrZXkgKi8KIAkJCW1hYyA9IE5VTEw7CiAJCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUFTU0VSVCgwKTsKQEAgLTIwNiwzNyArMjA0LDMwIEBACiAJaWYgKCFyZXQpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKG1hYykKLQkJc2MtPnNjX2tleXR5cGUgPSBoay5rdl90eXBlOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfa2V5X2RlbGV0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQogewotI2RlZmluZSBBVEhfTUFYX05VTV9LRVlTIDQKIAlpbnQgZnJlZXNsb3Q7CiAKLQlmcmVlc2xvdCA9IChrZXktPmtleWlkeCA+PSBBVEhfTUFYX05VTV9LRVlTKSA/IDEgOiAwOworCWZyZWVzbG90ID0gKGtleS0+a2V5aWR4ID49IDQpID8gMSA6IDA7CiAJYXRoX2tleV9yZXNldChzYywga2V5LT5rZXlpZHgsIGZyZWVzbG90KTsKLSN1bmRlZiBBVEhfTUFYX05VTV9LRVlTCiB9CiAKIHN0YXRpYyB2b2lkIHNldHVwX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pCiB7Ci0vKiBVbnRpbCBtYWM4MDIxMSBpbmNsdWRlcyB0aGVzZSBmaWVsZHMgKi8KLQotI2RlZmluZSBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCAweDEwMDAKLSNkZWZpbmUJSUVFRTgwMjExX0hUX0NBUF9NQVhSWEFNUERVXzY1NTM2IDB4MyAgIC8qIDIgXiAxNiAqLwotI2RlZmluZQlJRUVFODAyMTFfSFRfQ0FQX01QRFVERU5TSVRZXzggMHg2ICAgICAJLyogOCB1c2VjICovCisjZGVmaW5lCUFUSDlLX0hUX0NBUF9NQVhSWEFNUERVXzY1NTM2IDB4MwkvKiAyIF4gMTYgKi8KKyNkZWZpbmUJQVRIOUtfSFRfQ0FQX01QRFVERU5TSVRZXzggMHg2CQkvKiA4IHVzZWMgKi8KIAogCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IDE7CiAJaHRfaW5mby0+Y2FwID0gKHUxNilJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSAotCQkJfCh1MTYpSUVFRTgwMjExX0hUX0NBUF9NSU1PX1BTCisJCQl8KHUxNilJRUVFODAyMTFfSFRfQ0FQX1NNX1BTCiAJCQl8KHUxNilJRUVFODAyMTFfSFRfQ0FQX1NHSV80MAogCQkJfCh1MTYpSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDA7CiAKLQlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfQ0FQX01BWFJYQU1QRFVfNjU1MzY7Ci0JaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9DQVBfTVBEVURFTlNJVFlfODsKKwlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBBVEg5S19IVF9DQVBfTUFYUlhBTVBEVV82NTUzNjsKKwlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gQVRIOUtfSFRfQ0FQX01QRFVERU5TSVRZXzg7CiAJLyogc2V0dXAgc3VwcG9ydGVkIG1jcyBzZXQgKi8KIAltZW1zZXQoaHRfaW5mby0+c3VwcF9tY3Nfc2V0LCAwLCAxNik7CiAJaHRfaW5mby0+c3VwcF9tY3Nfc2V0WzBdID0gMHhmZjsKQEAgLTI4MywxMCArMjc0LDEyIEBACiAJcnhfc3RhdHVzLT5tYWN0aW1lID0gc3RhdHVzLT50c2Y7CiAJcnhfc3RhdHVzLT5iYW5kID0gY3VyY2hhbi0+YmFuZDsKIAlyeF9zdGF0dXMtPmZyZXEgPSAgY3VyY2hhbi0+Y2VudGVyX2ZyZXE7Ci0Jcnhfc3RhdHVzLT5ub2lzZSA9IEFUSF9ERUZBVUxUX05PSVNFX0ZMT09SOworCXJ4X3N0YXR1cy0+bm9pc2UgPSBzYy0+c2NfYW5pLnNjX25vaXNlX2Zsb29yOwogCXJ4X3N0YXR1cy0+c2lnbmFsID0gcnhfc3RhdHVzLT5ub2lzZSArIHN0YXR1cy0+cnNzaTsKIAlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gYXRoX3JhdGUyaWR4KHNjLCAoc3RhdHVzLT5yYXRlS2JwcyAvIDEwMCkpOwogCXJ4X3N0YXR1cy0+YW50ZW5uYSA9IHN0YXR1cy0+YW50ZW5uYTsKKworCS8qIFhYWCBGaXggbWUsIDY0IGNhbm5vdCBiZSB0aGUgbWF4IHJzc2kgdmFsdWUsIHJpZ3VyZSBpdCBvdXQgKi8KIAlyeF9zdGF0dXMtPnF1YWwgPSBzdGF0dXMtPnJzc2kgKiAxMDAgLyA2NDsKIAogCWlmIChzdGF0dXMtPmZsYWdzICYgQVRIX1JYX01JQ19FUlJPUikKQEAgLTMzMiw0NDcgKzMyNSw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGF0aDlrX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjdXJjaGFuID0gaHctPmNvbmYuY2hhbm5lbDsKLQlpbnQgZXJyb3IgPSAwLCBwb3M7Ci0KLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBTdGFydGluZyBkcml2ZXIgd2l0aCAiCi0JCSJpbml0aWFsIGNoYW5uZWw6ICVkIE1IelxuIiwgX19mdW5jX18sIGN1cmNoYW4tPmNlbnRlcl9mcmVxKTsKLQotCS8qIHNldHVwIGluaXRpYWwgY2hhbm5lbCAqLwotCi0JcG9zID0gYXRoX2dldF9jaGFubmVsKHNjLCBjdXJjaGFuKTsKLQlpZiAocG9zID09IC0xKSB7Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsICIlczogSW52YWxpZCBjaGFubmVsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXS5jaGFubW9kZSA9Ci0JCShjdXJjaGFuLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8gQ0hBTk5FTF9HIDogQ0hBTk5FTF9BOwotCi0JLyogb3BlbiBhdGhfZGV2ICovCi0JZXJyb3IgPSBhdGhfb3BlbihzYywgJnNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXSk7Ci0JaWYgKGVycm9yKSB7Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkiJXM6IFVuYWJsZSB0byBjb21wbGV0ZSBhdGhfb3BlblxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGg5a190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKLQlpbnQgaGRybGVuLCBwYWRzaXplOwotCi0JLyogQWRkIHRoZSBwYWRkaW5nIGFmdGVyIHRoZSBoZWFkZXIgaWYgdGhpcyBpcyBub3QgYWxyZWFkeSBkb25lICovCi0JaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKLQlpZiAoaGRybGVuICYgMykgewotCQlwYWRzaXplID0gaGRybGVuICUgNDsKLQkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgcGFkc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJc2tiX3B1c2goc2tiLCBwYWRzaXplKTsKLQkJbWVtbW92ZShza2ItPmRhdGEsIHNrYi0+ZGF0YSArIHBhZHNpemUsIGhkcmxlbik7Ci0JfQotCi0JRFBSSU5URihzYywgQVRIX0RCR19YTUlULCAiJXM6IHRyYW5zbWl0dGluZyBwYWNrZXQsIHNrYjogJXBcbiIsCi0JCV9fZnVuY19fLAotCQlza2IpOwotCi0JaWYgKGF0aF90eF9zdGFydChzYywgc2tiKSAhPSAwKSB7Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfWE1JVCwgIiVzOiBUWCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJLyogRklYTUU6IENoZWNrIGZvciBwcm9wZXIgcmV0dXJuIHZhbHVlIGZyb20gQVRIX0RFViAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXRoOWtfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCWludCBlcnJvcjsKLQotCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IERyaXZlciBoYWx0XG4iLCBfX2Z1bmNfXyk7Ci0KLQllcnJvciA9IGF0aF9zdXNwZW5kKHNjKTsKLQlpZiAoZXJyb3IpCi0JCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLAotCQkJIiVzOiBEZXZpY2UgaXMgbm8gbG9uZ2VyIHByZXNlbnRcbiIsIF9fZnVuY19fKTsKLQotCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhodyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoOWtfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCWludCBlcnJvciwgaWNfb3Btb2RlID0gMDsKLQotCS8qIFN1cHBvcnQgb25seSB2YXAgZm9yIG5vdyAqLwotCi0JaWYgKHNjLT5zY19udmFwcykKLQkJcmV0dXJuIC1FTk9CVUZTOwotCi0Jc3dpdGNoIChjb25mLT50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCWljX29wbW9kZSA9IEFUSDlLX01fU1RBOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6Ci0JCWljX29wbW9kZSA9IEFUSDlLX01fSUJTUzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKLQkJCSIlczogT25seSBTVEEgYW5kIElCU1MgYXJlIHN1cHBvcnRlZCBjdXJyZW50bHlcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBBdHRhY2ggYSBWQVAgb2YgdHlwZTogJWRcbiIsCi0JCV9fZnVuY19fLAotCQlpY19vcG1vZGUpOwotCi0JZXJyb3IgPSBhdGhfdmFwX2F0dGFjaChzYywgMCwgY29uZi0+dmlmLCBpY19vcG1vZGUpOwotCWlmIChlcnJvcikgewotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAotCQkJIiVzOiBVbmFibGUgdG8gYXR0YWNoIHZhcCwgZXJyb3I6ICVkXG4iLAotCQkJX19mdW5jX18sIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdGg5a19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF92YXAgKmF2cDsKLQlpbnQgZXJyb3I7Ci0KLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBEZXRhY2ggVkFQXG4iLCBfX2Z1bmNfXyk7Ci0KLQlhdnAgPSBzYy0+c2NfdmFwc1swXTsKLQlpZiAoYXZwID09IE5VTEwpIHsKLQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIiVzOiBJbnZhbGlkIGludGVyZmFjZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotI2lmZGVmIENPTkZJR19TTE9XX0FOVF9ESVYKLQlhdGhfc2xvd19hbnRfZGl2X3N0b3AoJnNjLT5zY19hbnRkaXYpOwotI2VuZGlmCi0KLQkvKiBVcGRhdGUgcmF0ZWN0cmwgKi8KLQlhdGhfcmF0ZV9uZXdzdGF0ZShzYywgYXZwKTsKLQotCS8qIFJlY2xhaW0gYmVhY29uIHJlc291cmNlcyAqLwotCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSE9TVEFQIHx8IHNjLT5zY19vcG1vZGUgPT0gQVRIOUtfTV9JQlNTKSB7Ci0JCWF0aDlrX2h3X3N0b3B0eGRtYShzYy0+c2NfYWgsIHNjLT5zY19iaGFscSk7Ci0JCWF0aF9iZWFjb25fcmV0dXJuKHNjLCBhdnApOwotCX0KLQotCS8qIFNldCBpbnRlcnJ1cHQgbWFzayAqLwotCXNjLT5zY19pbWFzayAmPSB+KEFUSDlLX0lOVF9TV0JBIHwgQVRIOUtfSU5UX0JNSVNTKTsKLQlhdGg5a19od19zZXRfaW50ZXJydXB0cyhzYy0+c2NfYWgsIHNjLT5zY19pbWFzayAmIH5BVEg5S19JTlRfR0xPQkFMKTsKLQlzYy0+c2NfYmVhY29ucyA9IDA7Ci0KLQllcnJvciA9IGF0aF92YXBfZGV0YWNoKHNjLCAwKTsKLQlpZiAoZXJyb3IpCi0JCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkiJXM6IFVuYWJsZSB0byBkZXRhY2ggdmFwLCBlcnJvcjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgZXJyb3IpOwotfQotCi1zdGF0aWMgaW50IGF0aDlrX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKLXsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7Ci0JaW50IHBvczsKLQotCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IFNldCBjaGFubmVsOiAlZCBNSHpcbiIsCi0JCV9fZnVuY19fLAotCQljdXJjaGFuLT5jZW50ZXJfZnJlcSk7Ci0KLQlwb3MgPSBhdGhfZ2V0X2NoYW5uZWwoc2MsIGN1cmNoYW4pOwotCWlmIChwb3MgPT0gLTEpIHsKLQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIiVzOiBJbnZhbGlkIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2MtPnNjX2FoLT5haF9jaGFubmVsc1twb3NdLmNoYW5tb2RlID0KLQkJKGN1cmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPwotCQlDSEFOTkVMX0cgOiBDSEFOTkVMX0E7Ci0KLQlpZiAoc2MtPnNjX2N1cmFpZCAmJiBody0+Y29uZi5odF9jb25mLmh0X3N1cHBvcnRlZCkKLQkJc2MtPnNjX2FoLT5haF9jaGFubmVsc1twb3NdLmNoYW5tb2RlID0KLQkJCWF0aF9nZXRfZXh0Y2hhbm1vZGUoc2MsIGN1cmNoYW4pOwotCi0Jc2MtPnNjX2NvbmZpZy50eHBvd2xpbWl0ID0gMiAqIGNvbmYtPnBvd2VyX2xldmVsOwotCi0JLyogc2V0IGgvdyBjaGFubmVsICovCi0JaWYgKGF0aF9zZXRfY2hhbm5lbChzYywgJnNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXSkgPCAwKQotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLCAiJXM6IFVuYWJsZSB0byBzZXQgY2hhbm5lbFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0aDlrX2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF92YXAgKmF2cDsKLQl1MzIgcmZpbHQgPSAwOwotCWludCBlcnJvciwgaTsKLQlERUNMQVJFX01BQ19CVUYobWFjKTsKLQotCWF2cCA9IHNjLT5zY192YXBzWzBdOwotCWlmIChhdnAgPT0gTlVMTCkgewotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLCAiJXM6IEludmFsaWQgaW50ZXJmYWNlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CU1NJRCkgJiYKLQkgICAgIWlzX3plcm9fZXRoZXJfYWRkcihjb25mLT5ic3NpZCkpIHsKLQkJc3dpdGNoICh2aWYtPnR5cGUpIHsKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKLQkJCS8qIFVwZGF0ZSByYXRlY3RybCBhYm91dCB0aGUgbmV3IHN0YXRlICovCi0JCQlhdGhfcmF0ZV9uZXdzdGF0ZShzYywgYXZwKTsKLQotCQkJLyogU2V0IHJ4IGZpbHRlciAqLwotCQkJcmZpbHQgPSBhdGhfY2FsY3J4ZmlsdGVyKHNjKTsKLQkJCWF0aDlrX2h3X3NldHJ4ZmlsdGVyKHNjLT5zY19haCwgcmZpbHQpOwotCi0JCQkvKiBTZXQgQlNTSUQgKi8KLQkJCW1lbWNweShzYy0+c2NfY3VyYnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCQlzYy0+c2NfY3VyYWlkID0gMDsKLQkJCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc2MtPnNjX2FoLCBzYy0+c2NfY3VyYnNzaWQsCi0JCQkJCSAgICAgICBzYy0+c2NfY3VyYWlkKTsKLQotCQkJLyogU2V0IGFnZ3JlZ2F0aW9uIHByb3RlY3Rpb24gbW9kZSBwYXJhbWV0ZXJzICovCi0JCQlzYy0+c2NfY29uZmlnLmF0aF9hZ2dyX3Byb3QgPSAwOwotCi0JCQkvKgotCQkJICogUmVzZXQgb3VyIFRTRiBzbyB0aGF0IGl0cyB2YWx1ZSBpcyBsb3dlciB0aGFuIHRoZQotCQkJICogYmVhY29uIHRoYXQgd2UgYXJlIHRyeWluZyB0byBjYXRjaC4KLQkJCSAqIE9ubHkgdGhlbiBodyB3aWxsIHVwZGF0ZSBpdHMgVFNGIHJlZ2lzdGVyIHdpdGggdGhlCi0JCQkgKiBuZXcgYmVhY29uLiBSZXNldCB0aGUgVFNGIGJlZm9yZSBzZXR0aW5nIHRoZSBCU1NJRAotCQkJICogdG8gYXZvaWQgYWxsb3dpbmcgaW4gYW55IGZyYW1lcyB0aGF0IHdvdWxkIHVwZGF0ZQotCQkJICogb3VyIFRTRiBvbmx5IHRvIGhhdmUgdXMgY2xlYXIgaXQKLQkJCSAqIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuCi0JCQkgKi8KLQkJCWF0aDlrX2h3X3Jlc2V0X3RzZihzYy0+c2NfYWgpOwotCi0JCQkvKiBEaXNhYmxlIEJNSVNTIGludGVycnVwdCB3aGVuIHdlJ3JlIG5vdCBhc3NvY2lhdGVkICovCi0JCQlhdGg5a19od19zZXRfaW50ZXJydXB0cyhzYy0+c2NfYWgsCi0JCQkJCXNjLT5zY19pbWFzayAmCi0JCQkJCX4oQVRIOUtfSU5UX1NXQkEgfCBBVEg5S19JTlRfQk1JU1MpKTsKLQkJCXNjLT5zY19pbWFzayAmPSB+KEFUSDlLX0lOVF9TV0JBIHwgQVRIOUtfSU5UX0JNSVNTKTsKLQotCQkJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsCi0JCQkJIiVzOiBSWCBmaWx0ZXIgMHgleCBic3NpZCAlcyBhaWQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcmZpbHQsCi0JCQkJcHJpbnRfbWFjKG1hYywgc2MtPnNjX2N1cmJzc2lkKSwgc2MtPnNjX2N1cmFpZCk7Ci0KLQkJCS8qIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGJlYWNvbiAqLwotCQkJc2MtPnNjX2JlYWNvbnMgPSAwOwotCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKChjb25mLT5jaGFuZ2VkICYgSUVFRTgwMjExX0lGQ0NfQkVBQ09OKSAmJgotCSAgICAodmlmLT50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpKSB7Ci0JCS8qCi0JCSAqIEFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgYmVhY29uIGZyYW1lLgotCQkgKgotCQkgKiBTdG9wIGFueSBwcmV2aW91cyBiZWFjb24gRE1BLiAgVGhpcyBtYXkgYmUKLQkJICogbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSwgd2hlbiBhbiBpYnNzIG1lcmdlCi0JCSAqIGNhdXNlcyByZWNvbmZpZ3VyYXRpb247IHdlIG1heSBiZSBjYWxsZWQKLQkJICogd2l0aCBiZWFjb24gdHJhbnNtaXNzaW9uIGFjdGl2ZS4KLQkJICovCi0JCWF0aDlrX2h3X3N0b3B0eGRtYShzYy0+c2NfYWgsIHNjLT5zY19iaGFscSk7Ci0KLQkJZXJyb3IgPSBhdGhfYmVhY29uX2FsbG9jKHNjLCAwKTsKLQkJaWYgKGVycm9yICE9IDApCi0JCQlyZXR1cm4gZXJyb3I7Ci0KLQkJYXRoX2JlYWNvbl9zeW5jKHNjLCAwKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgPyAqLwotCWlmICgoYXZwLT5hdl9vcG1vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX1dFUF9OS0lEOyBpKyspCi0JCQlpZiAoYXRoOWtfaHdfa2V5aXN2YWxpZChzYy0+c2NfYWgsICh1MTYpaSkpCi0JCQkJYXRoOWtfaHdfa2V5c2V0bWFjKHNjLT5zY19haCwKLQkJCQkJCSAgICh1MTYpaSwKLQkJCQkJCSAgIHNjLT5zY19jdXJic3NpZCk7Ci0JfQotCi0JLyogT25seSBsZWdhY3kgSUJTUyBmb3Igbm93ICovCi0JaWYgKHZpZi0+dHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQotCQlhdGhfdXBkYXRlX2NoYWlubWFzayhzYywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBTVVBQT1JURURfRklMVEVSUwkJCVwKLQkoRklGX1BST01JU0NfSU5fQlNTIHwJCQlcCi0JRklGX0FMTE1VTFRJIHwJCQkJXAotCUZJRl9DT05UUk9MIHwJCQkJXAotCUZJRl9PVEhFUl9CU1MgfAkJCQlcCi0JRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfAkJXAotCUZJRl9GQ1NGQUlMKQotCi0vKiBBY2NlcHQgdW5pY2FzdCwgYmNhc3QgYW5kIG1jYXN0IGZyYW1lcyAqLwotCi1zdGF0aWMgdm9pZCBhdGg5a19jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkJICAgaW50IG1jX2NvdW50LAotCQkJCSAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0KLQljaGFuZ2VkX2ZsYWdzICY9IFNVUFBPUlRFRF9GSUxURVJTOwotCSp0b3RhbF9mbGFncyAmPSBTVVBQT1JURURfRklMVEVSUzsKLQotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQotCQkJYXRoX3NjYW5fc3RhcnQoc2MpOwotCQllbHNlCi0JCQlhdGhfc2Nhbl9lbmQoc2MpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXRoOWtfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCi0JCQkgICAgIGNvbnN0IHU4ICphZGRyKQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF9ub2RlICphbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5ub2RlX2xvY2ssIGZsYWdzKTsKLQlhbiA9IGF0aF9ub2RlX2ZpbmQoc2MsICh1OCAqKSBhZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bm9kZV9sb2NrLCBmbGFncyk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU1RBX05PVElGWV9BREQ6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bm9kZV9sb2NrLCBmbGFncyk7Ci0JCWlmICghYW4pIHsKLQkJCWF0aF9ub2RlX2F0dGFjaChzYywgKHU4ICopYWRkciwgMCk7Ci0JCQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBBdHRhY2ggYSBub2RlOiAlc1xuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlwcmludF9tYWMobWFjLCBhZGRyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhdGhfbm9kZV9nZXQoc2MsICh1OCAqKWFkZHIpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5ub2RlX2xvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFfTk9USUZZX1JFTU9WRToKLQkJaWYgKCFhbikKLQkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkJIiVzOiBSZW1vdmFsIG9mIGEgbm9uLWV4aXN0ZW50IG5vZGVcbiIsCi0JCQkJX19mdW5jX18pOwotCQllbHNlIHsKLQkJCWF0aF9ub2RlX3B1dChzYywgYW4sIEFUSDlLX0JIX1NUQVRVU19JTlRBQ1QpOwotCQkJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogUHV0IGEgbm9kZTogJXNcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJcHJpbnRfbWFjKG1hYywgYWRkcikpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBhdGg5a19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJIHUxNiBxdWV1ZSwKLQkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gcWk7Ci0JaW50IHJldCA9IDAsIHFudW07Ci0KLQlpZiAocXVldWUgPj0gV01FX05VTV9BQykKLQkJcmV0dXJuIDA7Ci0KLQlxaS50cWlfYWlmcyA9IHBhcmFtcy0+YWlmczsKLQlxaS50cWlfY3dtaW4gPSBwYXJhbXMtPmN3X21pbjsKLQlxaS50cWlfY3dtYXggPSBwYXJhbXMtPmN3X21heDsKLQlxaS50cWlfYnVyc3RUaW1lID0gcGFyYW1zLT50eG9wOwotCXFudW0gPSBhdGhfZ2V0X2hhbF9xbnVtKHF1ZXVlLCBzYyk7Ci0KLQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywKLQkJIiVzOiBDb25maWd1cmUgdHggW3F1ZXVlL2hhbHFdIFslZC8lZF0sICAiCi0JCSJhaWZzOiAlZCwgY3dfbWluOiAlZCwgY3dfbWF4OiAlZCwgdHhvcDogJWRcbiIsCi0JCV9fZnVuY19fLAotCQlxdWV1ZSwKLQkJcW51bSwKLQkJcGFyYW1zLT5haWZzLAotCQlwYXJhbXMtPmN3X21pbiwKLQkJcGFyYW1zLT5jd19tYXgsCi0JCXBhcmFtcy0+dHhvcCk7Ci0KLQlyZXQgPSBhdGhfdHhxX3VwZGF0ZShzYywgcW51bSwgJnFpKTsKLQlpZiAocmV0KQotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAotCQkJIiVzOiBUWFEgVXBkYXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg5a19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkJIGNvbnN0IHU4ICpsb2NhbF9hZGRyLAotCQkJIGNvbnN0IHU4ICphZGRyLAotCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCWludCByZXQgPSAwOwotCi0JRFBSSU5URihzYywgQVRIX0RCR19LRVlDQUNIRSwgIiAlczogU2V0IEhXIEtleVxuIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNFVF9LRVk6Ci0JCXJldCA9IGF0aF9rZXlfY29uZmlnKHNjLCBhZGRyLCBrZXkpOwotCQlpZiAoIXJldCkgewotCQkJc2V0X2JpdChrZXktPmtleWlkeCwgc2MtPnNjX2tleW1hcCk7Ci0JCQlrZXktPmh3X2tleV9pZHggPSBrZXktPmtleWlkeDsKLQkJCS8qIHB1c2ggSVYgYW5kIE1pY2hhZWwgTUlDIGdlbmVyYXRpb24gdG8gc3RhY2sgKi8KLQkJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCQkJaWYgKGtleS0+YWxnID09IEFMR19US0lQKQotCQkJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX01NSUM7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBESVNBQkxFX0tFWToKLQkJYXRoX2tleV9kZWxldGUoc2MsIGtleSk7Ci0JCWNsZWFyX2JpdChrZXktPmtleWlkeCwgc2MtPnNjX2tleW1hcCk7Ci0JCXNjLT5zY19rZXl0eXBlID0gQVRIOUtfQ0lQSEVSX0NMUjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgdm9pZCBhdGg5a19odF9jb25mKHN0cnVjdCBhdGhfc29mdGMgKnNjLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZikKIHsKQEAgLTgzMyw3ICszODUsNyBAQAogCiAJCS8qIENvbmZpZ3VyZSB0aGUgYmVhY29uICovCiAJCWF0aF9iZWFjb25fY29uZmlnKHNjLCAwKTsKLQkJc2MtPnNjX2JlYWNvbnMgPSAxOworCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfQkVBQ09OUzsKIAogCQkvKiBSZXNldCByc3NpIHN0YXRzICovCiAJCXNjLT5zY19oYWxzdGF0cy5uc19hdmdicnNzaSA9IEFUSF9SU1NJX0RVTU1ZX01BUktFUjsKQEAgLTg3Nyw2ICs0MjksMTEgQEAKIAkJYXRoX3JhdGVfbmV3c3RhdGUoc2MsIGF2cCk7CiAJCS8qIFVwZGF0ZSByYXRlY3RybCBhYm91dCB0aGUgbmV3IHN0YXRlICovCiAJCWF0aF9yY19ub2RlX3VwZGF0ZShodywgYXZwLT5yY19ub2RlKTsKKworCQkvKiBTdGFydCBBTkkgKi8KKwkJbW9kX3RpbWVyKCZzYy0+c2NfYW5pLnRpbWVyLAorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVRIX0FOSV9QT0xMSU5URVJWQUwpKTsKKwogCX0gZWxzZSB7CiAJCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLAogCQkiJXM6IEJzcyBJbmZvIERJU1NPQ1xuIiwgX19mdW5jX18pOwpAQCAtODg0LDE0NSArNDQxLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDlrX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKLQkJCQkgICB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCi0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpIHsKLQkJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogQlNTIENoYW5nZWQgUFJFQU1CTEUgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpOwotCQlpZiAoYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCXNjLT5zY19mbGFncyB8PSBBVEhfUFJFQU1CTEVfU0hPUlQ7Ci0JCWVsc2UKLQkJCXNjLT5zY19mbGFncyAmPSB+QVRIX1BSRUFNQkxFX1NIT1JUOwotCX0KLQotCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEJTUyBDaGFuZ2VkIENUUyBQUk9UICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlic3NfY29uZi0+dXNlX2N0c19wcm90KTsKLQkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QgJiYKLQkJICAgIGh3LT5jb25mLmNoYW5uZWwtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXNjLT5zY19mbGFncyB8PSBBVEhfUFJPVEVDVF9FTkFCTEU7Ci0JCWVsc2UKLQkJCXNjLT5zY19mbGFncyAmPSB+QVRIX1BST1RFQ1RfRU5BQkxFOwotCX0KLQotCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpIHsKLQkJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogQlNTIENoYW5nZWQgSFQgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWJzc19jb25mLT5hc3NvY19odCk7Ci0JCWF0aDlrX2h0X2NvbmYoc2MsIGJzc19jb25mKTsKLQl9Ci0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0FTU09DKSB7Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEJTUyBDaGFuZ2VkIEFTU09DICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlic3NfY29uZi0+YXNzb2MpOwotCQlhdGg5a19ic3NfYXNzb2NfaW5mbyhzYywgYnNzX2NvbmYpOwotCX0KLX0KLQotc3RhdGljIHU2NCBhdGg5a19nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXU2NCB0c2Y7Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKLQlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0KLQl0c2YgPSBhdGg5a19od19nZXR0c2Y2NChhaCk7Ci0KLQlyZXR1cm4gdHNmOwotfQotCi1zdGF0aWMgdm9pZCBhdGg5a19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKLQlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0KLQlhdGg5a19od19yZXNldF90c2YoYWgpOwotfQotCi1zdGF0aWMgaW50IGF0aDlrX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJICAgICAgIGNvbnN0IHU4ICphZGRyLAotCQkgICAgICAgdTE2IHRpZCwKLQkJICAgICAgIHUxNiAqc3NuKQotewotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgotCQlyZXQgPSBhdGhfcnhfYWdncl9zdGFydChzYywgYWRkciwgdGlkLCBzc24pOwotCQlpZiAocmV0IDwgMCkKLQkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkJIiVzOiBVbmFibGUgdG8gc3RhcnQgUlggYWdncmVnYXRpb25cbiIsCi0JCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOgotCQlyZXQgPSBhdGhfcnhfYWdncl9zdG9wKHNjLCBhZGRyLCB0aWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkJIiVzOiBVbmFibGUgdG8gc3RvcCBSWCBhZ2dyZWdhdGlvblxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgotCQlyZXQgPSBhdGhfdHhfYWdncl9zdGFydChzYywgYWRkciwgdGlkLCBzc24pOwotCQlpZiAocmV0IDwgMCkKLQkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkJIiVzOiBVbmFibGUgdG8gc3RhcnQgVFggYWdncmVnYXRpb25cbiIsCi0JCQkJX19mdW5jX18pOwotCQllbHNlCi0JCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShodywgKHU4ICopYWRkciwgdGlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKLQkJcmV0ID0gYXRoX3R4X2FnZ3Jfc3RvcChzYywgYWRkciwgdGlkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAotCQkJCSIlczogVW5hYmxlIHRvIHN0b3AgVFggYWdncmVnYXRpb25cbiIsCi0JCQkJX19mdW5jX18pOwotCi0JCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoaHcsICh1OCAqKWFkZHIsIHRpZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCi0JCQkiJXM6IFVua25vd24gQU1QRFUgYWN0aW9uXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfb3BzIGF0aDlrX29wcyA9IHsKLQkudHggCQkgICAgPSBhdGg5a190eCwKLQkuc3RhcnQgCQkgICAgPSBhdGg5a19zdGFydCwKLQkuc3RvcCAJCSAgICA9IGF0aDlrX3N0b3AsCi0JLmFkZF9pbnRlcmZhY2UgCSAgICA9IGF0aDlrX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgICA9IGF0aDlrX3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNvbmZpZyAJICAgID0gYXRoOWtfY29uZmlnLAotCS5jb25maWdfaW50ZXJmYWNlICAgPSBhdGg5a19jb25maWdfaW50ZXJmYWNlLAotCS5jb25maWd1cmVfZmlsdGVyICAgPSBhdGg5a19jb25maWd1cmVfZmlsdGVyLAotCS5nZXRfc3RhdHMgICAgICAgICAgPSBOVUxMLAotCS5zdGFfbm90aWZ5ICAgICAgICAgPSBhdGg5a19zdGFfbm90aWZ5LAotCS5jb25mX3R4IAkgICAgPSBhdGg5a19jb25mX3R4LAotCS5nZXRfdHhfc3RhdHMgCSAgICA9IE5VTEwsCi0JLmJzc19pbmZvX2NoYW5nZWQgICA9IGF0aDlrX2Jzc19pbmZvX2NoYW5nZWQsCi0JLnNldF90aW0gICAgICAgICAgICA9IE5VTEwsCi0JLnNldF9rZXkgICAgICAgICAgICA9IGF0aDlrX3NldF9rZXksCi0JLmh3X3NjYW4gICAgICAgICAgICA9IE5VTEwsCi0JLmdldF90a2lwX3NlcSAgICAgICA9IE5VTEwsCi0JLnNldF9ydHNfdGhyZXNob2xkICA9IE5VTEwsCi0JLnNldF9mcmFnX3RocmVzaG9sZCA9IE5VTEwsCi0JLnNldF9yZXRyeV9saW1pdCAgICA9IE5VTEwsCi0JLmdldF90c2YgCSAgICA9IGF0aDlrX2dldF90c2YsCi0JLnJlc2V0X3RzZiAJICAgID0gYXRoOWtfcmVzZXRfdHNmLAotCS50eF9sYXN0X2JlYWNvbiAgICAgPSBOVUxMLAotCS5hbXBkdV9hY3Rpb24gICAgICAgPSBhdGg5a19hbXBkdV9hY3Rpb24KLX07Ci0KIHZvaWQgYXRoX2dldF9iZWFjb25jb25maWcoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCiAJCQkgIGludCBpZl9pZCwKIAkJCSAgc3RydWN0IGF0aF9iZWFjb25fY29uZmlnICpjb25mKQpAQCAtMTAzNywxNSArNDU1LDYgQEAKIAljb25mLT5ibWlzc190aW1lb3V0ID0gQVRIX0RFRkFVTFRfQk1JU1NfTElNSVQgKiBjb25mLT5saXN0ZW5faW50ZXJ2YWw7CiB9CiAKLWludCBhdGhfdXBkYXRlX2JlYWNvbihzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJICAgICAgaW50IGlmX2lkLAotCQkgICAgICBzdHJ1Y3QgYXRoX2JlYWNvbl9vZmZzZXQgKmJvLAotCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBpbnQgbWNhc3QpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgYXRoX3R4X2NvbXBsZXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBhdGhfeG1pdF9zdGF0dXMgKnR4X3N0YXR1cywgc3RydWN0IGF0aF9ub2RlICphbikKIHsKQEAgLTEwODUsNyArNDk0LDcgQEAKIAkJYXRoX25vZGVfcHV0KHNjLCBhbiwgQVRIOUtfQkhfU1RBVFVTX0NIQU5HRSk7CiB9CiAKLWludCBhdGhfX3J4X2luZGljYXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAoraW50IF9hdGhfcnhfaW5kaWNhdGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCiAJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICBzdHJ1Y3QgYXRoX3JlY3Zfc3RhdHVzICpzdGF0dXMsCiAJCSAgICAgdTE2IGtleWl4KQpAQCAtMTEwNSw5ICs1MTQsNiBAQAogCQlza2JfcHVsbChza2IsIHBhZHNpemUpOwogCX0KIAotCS8qIHJlbW92ZSBGQ1MgYmVmb3JlIHBhc3NpbmcgdXAgdG8gcHJvdG9jb2wgc3RhY2sgKi8KLQlza2JfdHJpbShza2IsIChza2ItPmxlbiAtIEZDU19MRU4pKTsKLQogCS8qIFByZXBhcmUgcnggc3RhdHVzICovCiAJYXRoOWtfcnhfcHJlcGFyZShzYywgc2tiLCBzdGF0dXMsICZyeF9zdGF0dXMpOwogCkBAIC0xMTU2LDE3ICs1NjIsMzM4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWVudW0gYXRoOWtfaHRfbWFjbW9kZSBhdGhfY3dtX21hY21vZGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgTEVEIGZ1bmN0aW9ucwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYXRoX2xlZF9icmlnaHRuZXNzKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJICAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKIHsKLQlyZXR1cm4gc2MtPnNjX2h0X2luZm8udHhfY2hhbl93aWR0aDsKKwlzdHJ1Y3QgYXRoX2xlZCAqbGVkID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYXRoX2xlZCwgbGVkX2NkZXYpOworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gbGVkLT5zYzsKKworCXN3aXRjaCAoYnJpZ2h0bmVzcykgeworCWNhc2UgTEVEX09GRjoKKwkJaWYgKGxlZC0+bGVkX3R5cGUgPT0gQVRIX0xFRF9BU1NPQyB8fAorCQkgICAgbGVkLT5sZWRfdHlwZSA9PSBBVEhfTEVEX1JBRElPKQorCQkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9MRURfQVNTT0NJQVRFRDsKKwkJYXRoOWtfaHdfc2V0X2dwaW8oc2MtPnNjX2FoLCBBVEhfTEVEX1BJTiwKKwkJCQkobGVkLT5sZWRfdHlwZSA9PSBBVEhfTEVEX1JBRElPKSA/IDEgOgorCQkJCSEhKHNjLT5zY19mbGFncyAmIFNDX09QX0xFRF9BU1NPQ0lBVEVEKSk7CisJCWJyZWFrOworCWNhc2UgTEVEX0ZVTEw6CisJCWlmIChsZWQtPmxlZF90eXBlID09IEFUSF9MRURfQVNTT0MpCisJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfTEVEX0FTU09DSUFURUQ7CisJCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgQVRIX0xFRF9QSU4sIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiB9CiAKK3N0YXRpYyBpbnQgYXRoX3JlZ2lzdGVyX2xlZChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9sZWQgKmxlZCwKKwkJCSAgICBjaGFyICp0cmlnZ2VyKQoreworCWludCByZXQ7CisKKwlsZWQtPnNjID0gc2M7CisJbGVkLT5sZWRfY2Rldi5uYW1lID0gbGVkLT5uYW1lOworCWxlZC0+bGVkX2NkZXYuZGVmYXVsdF90cmlnZ2VyID0gdHJpZ2dlcjsKKwlsZWQtPmxlZF9jZGV2LmJyaWdodG5lc3Nfc2V0ID0gYXRoX2xlZF9icmlnaHRuZXNzOworCisJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHdpcGh5X2RldihzYy0+aHctPndpcGh5KSwgJmxlZC0+bGVkX2NkZXYpOworCWlmIChyZXQpCisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIGxlZDolcyIsIGxlZC0+bmFtZSk7CisJZWxzZQorCQlsZWQtPnJlZ2lzdGVyZWQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0aF91bnJlZ2lzdGVyX2xlZChzdHJ1Y3QgYXRoX2xlZCAqbGVkKQoreworCWlmIChsZWQtPnJlZ2lzdGVyZWQpIHsKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxlZC0+bGVkX2NkZXYpOworCQlsZWQtPnJlZ2lzdGVyZWQgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgYXRoX2RlaW5pdF9sZWRzKHN0cnVjdCBhdGhfc29mdGMgKnNjKQoreworCWF0aF91bnJlZ2lzdGVyX2xlZCgmc2MtPmFzc29jX2xlZCk7CisJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9MRURfQVNTT0NJQVRFRDsKKwlhdGhfdW5yZWdpc3Rlcl9sZWQoJnNjLT50eF9sZWQpOworCWF0aF91bnJlZ2lzdGVyX2xlZCgmc2MtPnJ4X2xlZCk7CisJYXRoX3VucmVnaXN0ZXJfbGVkKCZzYy0+cmFkaW9fbGVkKTsKKwlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIEFUSF9MRURfUElOLCAxKTsKK30KKworc3RhdGljIHZvaWQgYXRoX2luaXRfbGVkcyhzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwljaGFyICp0cmlnZ2VyOworCWludCByZXQ7CisKKwkvKiBDb25maWd1cmUgZ3BpbyAxIGZvciBvdXRwdXQgKi8KKwlhdGg5a19od19jZmdfb3V0cHV0KHNjLT5zY19haCwgQVRIX0xFRF9QSU4sCisJCQkgICAgQVJfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCk7CisJLyogTEVEIG9mZiwgYWN0aXZlIGxvdyAqLworCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgQVRIX0xFRF9QSU4sIDEpOworCisJdHJpZ2dlciA9IGllZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUoc2MtPmh3KTsKKwlzbnByaW50ZihzYy0+cmFkaW9fbGVkLm5hbWUsIHNpemVvZihzYy0+cmFkaW9fbGVkLm5hbWUpLAorCQkiYXRoOWstJXM6cmFkaW8iLCB3aXBoeV9uYW1lKHNjLT5ody0+d2lwaHkpKTsKKwlyZXQgPSBhdGhfcmVnaXN0ZXJfbGVkKHNjLCAmc2MtPnJhZGlvX2xlZCwgdHJpZ2dlcik7CisJc2MtPnJhZGlvX2xlZC5sZWRfdHlwZSA9IEFUSF9MRURfUkFESU87CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJdHJpZ2dlciA9IGllZWU4MDIxMV9nZXRfYXNzb2NfbGVkX25hbWUoc2MtPmh3KTsKKwlzbnByaW50ZihzYy0+YXNzb2NfbGVkLm5hbWUsIHNpemVvZihzYy0+YXNzb2NfbGVkLm5hbWUpLAorCQkiYXRoOWstJXM6YXNzb2MiLCB3aXBoeV9uYW1lKHNjLT5ody0+d2lwaHkpKTsKKwlyZXQgPSBhdGhfcmVnaXN0ZXJfbGVkKHNjLCAmc2MtPmFzc29jX2xlZCwgdHJpZ2dlcik7CisJc2MtPmFzc29jX2xlZC5sZWRfdHlwZSA9IEFUSF9MRURfQVNTT0M7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJdHJpZ2dlciA9IGllZWU4MDIxMV9nZXRfdHhfbGVkX25hbWUoc2MtPmh3KTsKKwlzbnByaW50ZihzYy0+dHhfbGVkLm5hbWUsIHNpemVvZihzYy0+dHhfbGVkLm5hbWUpLAorCQkiYXRoOWstJXM6dHgiLCB3aXBoeV9uYW1lKHNjLT5ody0+d2lwaHkpKTsKKwlyZXQgPSBhdGhfcmVnaXN0ZXJfbGVkKHNjLCAmc2MtPnR4X2xlZCwgdHJpZ2dlcik7CisJc2MtPnR4X2xlZC5sZWRfdHlwZSA9IEFUSF9MRURfVFg7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJdHJpZ2dlciA9IGllZWU4MDIxMV9nZXRfcnhfbGVkX25hbWUoc2MtPmh3KTsKKwlzbnByaW50ZihzYy0+cnhfbGVkLm5hbWUsIHNpemVvZihzYy0+cnhfbGVkLm5hbWUpLAorCQkiYXRoOWstJXM6cngiLCB3aXBoeV9uYW1lKHNjLT5ody0+d2lwaHkpKTsKKwlyZXQgPSBhdGhfcmVnaXN0ZXJfbGVkKHNjLCAmc2MtPnJ4X2xlZCwgdHJpZ2dlcik7CisJc2MtPnJ4X2xlZC5sZWRfdHlwZSA9IEFUSF9MRURfUlg7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuOworCitmYWlsOgorCWF0aF9kZWluaXRfbGVkcyhzYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUkZLSUxMCisvKioqKioqKioqKioqKioqKioqKi8KKy8qCVJma2lsbAkgICAqLworLyoqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGF0aF9yYWRpb19lbmFibGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2tfYmgoJnNjLT5zY19yZXNldGxvY2spOworCWlmICghYXRoOWtfaHdfcmVzZXQoYWgsIGFoLT5haF9jdXJjaGFuLAorCQkJICAgIHNjLT5zY19odF9pbmZvLnR4X2NoYW5fd2lkdGgsCisJCQkgICAgc2MtPnNjX3R4X2NoYWlubWFzaywKKwkJCSAgICBzYy0+c2NfcnhfY2hhaW5tYXNrLAorCQkJICAgIHNjLT5zY19odF9leHRwcm90c3BhY2luZywKKwkJCSAgICBmYWxzZSwgJnN0YXR1cykpIHsKKwkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKKwkJCSIlczogdW5hYmxlIHRvIHJlc2V0IGNoYW5uZWwgJXUgKCV1TWh6KSAiCisJCQkiZmxhZ3MgMHgleCBoYWwgc3RhdHVzICV1XG4iLCBfX2Z1bmNfXywKKwkJCWF0aDlrX2h3X21oejJpZWVlKGFoLAorCQkJCQkgIGFoLT5haF9jdXJjaGFuLT5jaGFubmVsLAorCQkJCQkgIGFoLT5haF9jdXJjaGFuLT5jaGFubmVsRmxhZ3MpLAorCQkJYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWwsCisJCQlhaC0+YWhfY3VyY2hhbi0+Y2hhbm5lbEZsYWdzLCBzdGF0dXMpOworCX0KKwlzcGluX3VubG9ja19iaCgmc2MtPnNjX3Jlc2V0bG9jayk7CisKKwlhdGhfdXBkYXRlX3R4cG93KHNjKTsKKwlpZiAoYXRoX3N0YXJ0cmVjdihzYykgIT0gMCkgeworCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJIiVzOiB1bmFibGUgdG8gcmVzdGFydCByZWN2IGxvZ2ljXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfQkVBQ09OUykKKwkJYXRoX2JlYWNvbl9jb25maWcoc2MsIEFUSF9JRl9JRF9BTlkpOwkvKiByZXN0YXJ0IGJlYWNvbnMgKi8KKworCS8qIFJlLUVuYWJsZSAgaW50ZXJydXB0cyAqLworCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCBzYy0+c2NfaW1hc2spOworCisJLyogRW5hYmxlIExFRCAqLworCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIEFUSF9MRURfUElOLAorCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOworCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBBVEhfTEVEX1BJTiwgMCk7CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoc2MtPmh3KTsKK30KKworc3RhdGljIHZvaWQgYXRoX3JhZGlvX2Rpc2FibGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCWludCBzdGF0dXM7CisKKworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhzYy0+aHcpOworCisJLyogRGlzYWJsZSBMRUQgKi8KKwlhdGg5a19od19zZXRfZ3BpbyhhaCwgQVRIX0xFRF9QSU4sIDEpOworCWF0aDlrX2h3X2NmZ19ncGlvX2lucHV0KGFoLCBBVEhfTEVEX1BJTik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlhdGg5a19od19zZXRfaW50ZXJydXB0cyhhaCwgMCk7CisKKwlhdGhfZHJhaW50eHEoc2MsIGZhbHNlKTsJLyogY2xlYXIgcGVuZGluZyB0eCBmcmFtZXMgKi8KKwlhdGhfc3RvcHJlY3Yoc2MpOwkJLyogdHVybiBvZmYgZnJhbWUgcmVjdiAqLworCWF0aF9mbHVzaHJlY3Yoc2MpOwkJLyogZmx1c2ggcmVjdiBxdWV1ZSAqLworCisJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKKwlpZiAoIWF0aDlrX2h3X3Jlc2V0KGFoLCBhaC0+YWhfY3VyY2hhbiwKKwkJCSAgICBzYy0+c2NfaHRfaW5mby50eF9jaGFuX3dpZHRoLAorCQkJICAgIHNjLT5zY190eF9jaGFpbm1hc2ssCisJCQkgICAgc2MtPnNjX3J4X2NoYWlubWFzaywKKwkJCSAgICBzYy0+c2NfaHRfZXh0cHJvdHNwYWNpbmcsCisJCQkgICAgZmFsc2UsICZzdGF0dXMpKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IHVuYWJsZSB0byByZXNldCBjaGFubmVsICV1ICgldU1oeikgIgorCQkJImZsYWdzIDB4JXggaGFsIHN0YXR1cyAldVxuIiwgX19mdW5jX18sCisJCQlhdGg5a19od19taHoyaWVlZShhaCwKKwkJCQlhaC0+YWhfY3VyY2hhbi0+Y2hhbm5lbCwKKwkJCQlhaC0+YWhfY3VyY2hhbi0+Y2hhbm5lbEZsYWdzKSwKKwkJCWFoLT5haF9jdXJjaGFuLT5jaGFubmVsLAorCQkJYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWxGbGFncywgc3RhdHVzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19yZXNldGxvY2spOworCisJYXRoOWtfaHdfcGh5X2Rpc2FibGUoYWgpOworCWF0aDlrX2h3X3NldHBvd2VyKGFoLCBBVEg5S19QTV9GVUxMX1NMRUVQKTsKK30KKworc3RhdGljIGJvb2wgYXRoX2lzX3Jma2lsbF9zZXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCisJcmV0dXJuIGF0aDlrX2h3X2dwaW9fZ2V0KGFoLCBhaC0+YWhfcmZraWxsX2dwaW8pID09CisJCQkJICBhaC0+YWhfcmZraWxsX3BvbGFyaXR5OworfQorCisvKiBoL3cgcmZraWxsIHBvbGwgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGF0aF9yZmtpbGxfcG9sbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aF9zb2Z0YywKKwkJCQkJICAgIHJmX2tpbGwucmZraWxsX3BvbGwud29yayk7CisJYm9vbCByYWRpb19vbjsKKworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKQorCQlyZXR1cm47CisKKwlyYWRpb19vbiA9ICFhdGhfaXNfcmZraWxsX3NldChzYyk7CisKKwkvKgorCSAqIGVuYWJsZS9kaXNhYmxlIHJhZGlvIG9ubHkgd2hlbiB0aGVyZSBpcyBhCisJICogc3RhdGUgY2hhbmdlIGluIFJGIHN3aXRjaAorCSAqLworCWlmIChyYWRpb19vbiA9PSAhIShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9SRktJTExfSFdfQkxPQ0tFRCkpIHsKKwkJZW51bSByZmtpbGxfc3RhdGUgc3RhdGU7CisKKwkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JGS0lMTF9TV19CTE9DS0VEKSB7CisJCQlzdGF0ZSA9IHJhZGlvX29uID8gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRAorCQkJCTogUkZLSUxMX1NUQVRFX0hBUkRfQkxPQ0tFRDsKKwkJfSBlbHNlIGlmIChyYWRpb19vbikgeworCQkJYXRoX3JhZGlvX2VuYWJsZShzYyk7CisJCQlzdGF0ZSA9IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ7CisJCX0gZWxzZSB7CisJCQlhdGhfcmFkaW9fZGlzYWJsZShzYyk7CisJCQlzdGF0ZSA9IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQ7CisJCX0KKworCQlpZiAoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX0hBUkRfQkxPQ0tFRCkKKwkJCXNjLT5zY19mbGFncyB8PSBTQ19PUF9SRktJTExfSFdfQkxPQ0tFRDsKKwkJZWxzZQorCQkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9SRktJTExfSFdfQkxPQ0tFRDsKKworCQlyZmtpbGxfZm9yY2Vfc3RhdGUoc2MtPnJmX2tpbGwucmZraWxsLCBzdGF0ZSk7CisJfQorCisJcXVldWVfZGVsYXllZF93b3JrKHNjLT5ody0+d29ya3F1ZXVlLCAmc2MtPnJmX2tpbGwucmZraWxsX3BvbGwsCisJCQkgICBtc2Vjc190b19qaWZmaWVzKEFUSF9SRktJTExfUE9MTF9JTlRFUlZBTCkpOworfQorCisvKiBzL3cgcmZraWxsIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYXRoX3N3X3RvZ2dsZV9yYWRpbyh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGRhdGE7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOgorCQlpZiAoIShzYy0+c2NfZmxhZ3MgJiAoU0NfT1BfUkZLSUxMX0hXX0JMT0NLRUQgfAorCQkgICAgU0NfT1BfUkZLSUxMX1NXX0JMT0NLRUQpKSkKKwkJCWF0aF9yYWRpb19kaXNhYmxlKHNjKTsKKwkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX1JGS0lMTF9TV19CTE9DS0VEOworCQlyZXR1cm4gMDsKKwljYXNlIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ6CisJCWlmICgoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUkZLSUxMX1NXX0JMT0NLRUQpKSB7CisJCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX1JGS0lMTF9TV19CTE9DS0VEOworCQkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JGS0lMTF9IV19CTE9DS0VEKSB7CisJCQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIkNhbid0IHR1cm4gb24gdGhlIgorCQkJCQkicmFkaW8gYXMgaXQgaXMgZGlzYWJsZWQgYnkgaC93IFxuIik7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJCWF0aF9yYWRpb19lbmFibGUoc2MpOworCQl9CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyogSW5pdCBzL3cgcmZraWxsICovCitzdGF0aWMgaW50IGF0aF9pbml0X3N3X3Jma2lsbChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwlzYy0+cmZfa2lsbC5yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUod2lwaHlfZGV2KHNjLT5ody0+d2lwaHkpLAorCQkJCQkgICAgIFJGS0lMTF9UWVBFX1dMQU4pOworCWlmICghc2MtPnJmX2tpbGwucmZraWxsKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmZraWxsXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc25wcmludGYoc2MtPnJmX2tpbGwucmZraWxsX25hbWUsIHNpemVvZihzYy0+cmZfa2lsbC5yZmtpbGxfbmFtZSksCisJCSJhdGg5ay0lczpyZmtpbGwiLCB3aXBoeV9uYW1lKHNjLT5ody0+d2lwaHkpKTsKKwlzYy0+cmZfa2lsbC5yZmtpbGwtPm5hbWUgPSBzYy0+cmZfa2lsbC5yZmtpbGxfbmFtZTsKKwlzYy0+cmZfa2lsbC5yZmtpbGwtPmRhdGEgPSBzYzsKKwlzYy0+cmZfa2lsbC5yZmtpbGwtPnRvZ2dsZV9yYWRpbyA9IGF0aF9zd190b2dnbGVfcmFkaW87CisJc2MtPnJmX2tpbGwucmZraWxsLT5zdGF0ZSA9IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ7CisJc2MtPnJmX2tpbGwucmZraWxsLT51c2VyX2NsYWltX3Vuc3VwcG9ydGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKiBEZWluaXRpYWxpemUgcmZraWxsICovCitzdGF0aWMgdm9pZCBhdGhfZGVpbml0X3Jma2lsbChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3sKKwlpZiAoc2MtPnNjX2FoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfUkZTSUxFTlQpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2MtPnJmX2tpbGwucmZraWxsX3BvbGwpOworCisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JGS0lMTF9SRUdJU1RFUkVEKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKHNjLT5yZl9raWxsLnJma2lsbCk7CisJCXNjLT5zY19mbGFncyAmPSB+U0NfT1BfUkZLSUxMX1JFR0lTVEVSRUQ7CisJCXNjLT5yZl9raWxsLnJma2lsbCA9IE5VTEw7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19SRktJTEwgKi8KKwogc3RhdGljIGludCBhdGhfZGV0YWNoKHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gc2MtPmh3OwogCiAJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogRGV0YWNoIEFUSCBod1xuIiwgX19mdW5jX18pOwogCisJLyogRGVpbml0IExFRCBjb250cm9sICovCisJYXRoX2RlaW5pdF9sZWRzKHNjKTsKKworI2lmZGVmIENPTkZJR19SRktJTEwKKwkvKiBkZWluaXQgcmZraWxsICovCisJYXRoX2RlaW5pdF9yZmtpbGwoc2MpOworI2VuZGlmCisKIAkvKiBVbnJlZ2lzdGVyIGh3ICovCiAKIAlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhodyk7CkBAIC0xMjYwLDIzICs5ODcsNjkyIEBACiAJCWdvdG8gYmFkOwogCX0KIAorCS8qIEluaXRpYWxpemUgTEVEIGNvbnRyb2wgKi8KKwlhdGhfaW5pdF9sZWRzKHNjKTsKKworI2lmZGVmIENPTkZJR19SRktJTEwKKwkvKiBJbml0aWFsemUgaC93IFJma2lsbCAqLworCWlmIChzYy0+c2NfYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SRlNJTEVOVCkKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnNjLT5yZl9raWxsLnJma2lsbF9wb2xsLCBhdGhfcmZraWxsX3BvbGwpOworCisJLyogSW5pdGlhbGl6ZSBzL3cgcmZraWxsICovCisJaWYgKGF0aF9pbml0X3N3X3Jma2lsbChzYykpCisJCWdvdG8gZGV0YWNoOworI2VuZGlmCisKIAkvKiBpbml0aWFsaXplIHR4L3J4IGVuZ2luZSAqLwogCiAJZXJyb3IgPSBhdGhfdHhfaW5pdChzYywgQVRIX1RYQlVGKTsKIAlpZiAoZXJyb3IgIT0gMCkKLQkJZ290byBiYWQxOworCQlnb3RvIGRldGFjaDsKIAogCWVycm9yID0gYXRoX3J4X2luaXQoc2MsIEFUSF9SWEJVRik7CiAJaWYgKGVycm9yICE9IDApCi0JCWdvdG8gYmFkMTsKKwkJZ290byBkZXRhY2g7CiAKIAlyZXR1cm4gMDsKLWJhZDE6CitkZXRhY2g6CiAJYXRoX2RldGFjaChzYyk7CiBiYWQ6CiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IGF0aDlrX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjdXJjaGFuID0gaHctPmNvbmYuY2hhbm5lbDsKKwlpbnQgZXJyb3IgPSAwLCBwb3M7CisKKwlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBTdGFydGluZyBkcml2ZXIgd2l0aCAiCisJCSJpbml0aWFsIGNoYW5uZWw6ICVkIE1IelxuIiwgX19mdW5jX18sIGN1cmNoYW4tPmNlbnRlcl9mcmVxKTsKKworCS8qIHNldHVwIGluaXRpYWwgY2hhbm5lbCAqLworCisJcG9zID0gYXRoX2dldF9jaGFubmVsKHNjLCBjdXJjaGFuKTsKKwlpZiAocG9zID09IC0xKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsICIlczogSW52YWxpZCBjaGFubmVsXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXS5jaGFubW9kZSA9CisJCShjdXJjaGFuLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8gQ0hBTk5FTF9HIDogQ0hBTk5FTF9BOworCisJLyogb3BlbiBhdGhfZGV2ICovCisJZXJyb3IgPSBhdGhfb3BlbihzYywgJnNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXSk7CisJaWYgKGVycm9yKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IFVuYWJsZSB0byBjb21wbGV0ZSBhdGhfb3BlblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisjaWZkZWYgQ09ORklHX1JGS0lMTAorCS8qIFN0YXJ0IHJma2lsbCBwb2xsaW5nICovCisJaWYgKHNjLT5zY19haC0+YWhfY2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX1JGU0lMRU5UKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc2MtPmh3LT53b3JrcXVldWUsCisJCQkJICAgJnNjLT5yZl9raWxsLnJma2lsbF9wb2xsLCAwKTsKKworCWlmICghKHNjLT5zY19mbGFncyAmIFNDX09QX1JGS0lMTF9SRUdJU1RFUkVEKSkgeworCQlpZiAocmZraWxsX3JlZ2lzdGVyKHNjLT5yZl9raWxsLnJma2lsbCkpIHsKKwkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgcmZraWxsXG4iKTsKKwkJCXJma2lsbF9mcmVlKHNjLT5yZl9raWxsLnJma2lsbCk7CisKKwkJCS8qIERlaW5pdGlhbGl6ZSB0aGUgZGV2aWNlICovCisJCQlpZiAoc2MtPnBkZXYtPmlycSkKKwkJCQlmcmVlX2lycShzYy0+cGRldi0+aXJxLCBzYyk7CisJCQlhdGhfZGV0YWNoKHNjKTsKKwkJCXBjaV9pb3VubWFwKHNjLT5wZGV2LCBzYy0+bWVtKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbihzYy0+cGRldiwgMCk7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2Uoc2MtPnBkZXYpOworCQkJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOworCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSB7CisJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfUkZLSUxMX1JFR0lTVEVSRUQ7CisJCX0KKwl9CisjZW5kaWYKKworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoOWtfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJaW50IGhkcmxlbiwgcGFkc2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwkvKgorCSAqIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQsIGFzc2lnbiBzZXEjIGhlcmU7IHRoaXMgd2lsbCBsaWtlbHkgbmVlZAorCSAqIHRvIGJlIGNsZWFuZWQgdXAgdG8gd29yayBiZXR0ZXIgd2l0aCBCZWFjb24gdHJhbnNtaXNzaW9uIGFuZCB2aXJ0dWFsCisJICogQlNTZXMuCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UKQorCQkJc2MtPnNlcV9ubyArPSAweDEwOworCQloZHItPnNlcV9jdHJsICY9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOworCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNjLT5zZXFfbm8pOworCX0KKworCS8qIEFkZCB0aGUgcGFkZGluZyBhZnRlciB0aGUgaGVhZGVyIGlmIHRoaXMgaXMgbm90IGFscmVhZHkgZG9uZSAqLworCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKHNrYik7CisJaWYgKGhkcmxlbiAmIDMpIHsKKwkJcGFkc2l6ZSA9IGhkcmxlbiAlIDQ7CisJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHBhZHNpemUpCisJCQlyZXR1cm4gLTE7CisJCXNrYl9wdXNoKHNrYiwgcGFkc2l6ZSk7CisJCW1lbW1vdmUoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBwYWRzaXplLCBoZHJsZW4pOworCX0KKworCURQUklOVEYoc2MsIEFUSF9EQkdfWE1JVCwgIiVzOiB0cmFuc21pdHRpbmcgcGFja2V0LCBza2I6ICVwXG4iLAorCQlfX2Z1bmNfXywKKwkJc2tiKTsKKworCWlmIChhdGhfdHhfc3RhcnQoc2MsIHNrYikgIT0gMCkgeworCQlEUFJJTlRGKHNjLCBBVEhfREJHX1hNSVQsICIlczogVFggZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCS8qIEZJWE1FOiBDaGVjayBmb3IgcHJvcGVyIHJldHVybiB2YWx1ZSBmcm9tIEFUSF9ERVYgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDlrX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlpbnQgZXJyb3I7CisKKwlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBEcml2ZXIgaGFsdFxuIiwgX19mdW5jX18pOworCisJZXJyb3IgPSBhdGhfc3VzcGVuZChzYyk7CisJaWYgKGVycm9yKQorCQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywKKwkJCSIlczogRGV2aWNlIGlzIG5vIGxvbmdlciBwcmVzZW50XG4iLCBfX2Z1bmNfXyk7CisKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisjaWZkZWYgQ09ORklHX1JGS0lMTAorCWlmIChzYy0+c2NfYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SRlNJTEVOVCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzYy0+cmZfa2lsbC5yZmtpbGxfcG9sbCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBhdGg5a19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJaW50IGVycm9yLCBpY19vcG1vZGUgPSAwOworCisJLyogU3VwcG9ydCBvbmx5IHZhcCBmb3Igbm93ICovCisKKwlpZiAoc2MtPnNjX252YXBzKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWljX29wbW9kZSA9IEFUSDlLX01fU1RBOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQlpY19vcG1vZGUgPSBBVEg5S19NX0lCU1M7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCWljX29wbW9kZSA9IEFUSDlLX01fSE9TVEFQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJIiVzOiBJbnRlcmZhY2UgdHlwZSAlZCBub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBjb25mLT50eXBlKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEF0dGFjaCBhIFZBUCBvZiB0eXBlOiAlZFxuIiwKKwkJX19mdW5jX18sCisJCWljX29wbW9kZSk7CisKKwllcnJvciA9IGF0aF92YXBfYXR0YWNoKHNjLCAwLCBjb25mLT52aWYsIGljX29wbW9kZSk7CisJaWYgKGVycm9yKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IFVuYWJsZSB0byBhdHRhY2ggdmFwLCBlcnJvcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWYgKGNvbmYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJLyogVE9ETzogaXMgdGhpcyBhIHN1aXRhYmxlIHBsYWNlIHRvIHN0YXJ0IEFOSSBmb3IgQVAgbW9kZT8gKi8KKwkJLyogU3RhcnQgQU5JICovCisJCW1vZF90aW1lcigmc2MtPnNjX2FuaS50aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVRIX0FOSV9QT0xMSU5URVJWQUwpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGhfdmFwICphdnA7CisJaW50IGVycm9yOworCisJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsICIlczogRGV0YWNoIFZBUFxuIiwgX19mdW5jX18pOworCisJYXZwID0gc2MtPnNjX3ZhcHNbMF07CisJaWYgKGF2cCA9PSBOVUxMKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsICIlczogSW52YWxpZCBpbnRlcmZhY2VcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfU0xPV19BTlRfRElWCisJYXRoX3Nsb3dfYW50X2Rpdl9zdG9wKCZzYy0+c2NfYW50ZGl2KTsKKyNlbmRpZgorCS8qIFN0b3AgQU5JICovCisJZGVsX3RpbWVyX3N5bmMoJnNjLT5zY19hbmkudGltZXIpOworCisJLyogVXBkYXRlIHJhdGVjdHJsICovCisJYXRoX3JhdGVfbmV3c3RhdGUoc2MsIGF2cCk7CisKKwkvKiBSZWNsYWltIGJlYWNvbiByZXNvdXJjZXMgKi8KKwlpZiAoc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9IT1NUQVAgfHwKKwkgICAgc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9JQlNTKSB7CisJCWF0aDlrX2h3X3N0b3B0eGRtYShzYy0+c2NfYWgsIHNjLT5zY19iaGFscSk7CisJCWF0aF9iZWFjb25fcmV0dXJuKHNjLCBhdnApOworCX0KKworCS8qIFNldCBpbnRlcnJ1cHQgbWFzayAqLworCXNjLT5zY19pbWFzayAmPSB+KEFUSDlLX0lOVF9TV0JBIHwgQVRIOUtfSU5UX0JNSVNTKTsKKwlhdGg5a19od19zZXRfaW50ZXJydXB0cyhzYy0+c2NfYWgsIHNjLT5zY19pbWFzayAmIH5BVEg5S19JTlRfR0xPQkFMKTsKKwlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX0JFQUNPTlM7CisKKwllcnJvciA9IGF0aF92YXBfZGV0YWNoKHNjLCAwKTsKKwlpZiAoZXJyb3IpCisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IFVuYWJsZSB0byBkZXRhY2ggdmFwLCBlcnJvcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgaW50IGF0aDlrX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7CisJaW50IHBvczsKKworCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IFNldCBjaGFubmVsOiAlZCBNSHpcbiIsCisJCV9fZnVuY19fLAorCQljdXJjaGFuLT5jZW50ZXJfZnJlcSk7CisKKwlwb3MgPSBhdGhfZ2V0X2NoYW5uZWwoc2MsIGN1cmNoYW4pOworCWlmIChwb3MgPT0gLTEpIHsKKwkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIiVzOiBJbnZhbGlkIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2MtPnNjX2FoLT5haF9jaGFubmVsc1twb3NdLmNoYW5tb2RlID0KKwkJKGN1cmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPworCQlDSEFOTkVMX0cgOiBDSEFOTkVMX0E7CisKKwlpZiAoc2MtPnNjX2N1cmFpZCAmJiBody0+Y29uZi5odF9jb25mLmh0X3N1cHBvcnRlZCkKKwkJc2MtPnNjX2FoLT5haF9jaGFubmVsc1twb3NdLmNoYW5tb2RlID0KKwkJCWF0aF9nZXRfZXh0Y2hhbm1vZGUoc2MsIGN1cmNoYW4pOworCisJc2MtPnNjX2NvbmZpZy50eHBvd2xpbWl0ID0gMiAqIGNvbmYtPnBvd2VyX2xldmVsOworCisJLyogc2V0IGgvdyBjaGFubmVsICovCisJaWYgKGF0aF9zZXRfY2hhbm5lbChzYywgJnNjLT5zY19haC0+YWhfY2hhbm5lbHNbcG9zXSkgPCAwKQorCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLCAiJXM6IFVuYWJsZSB0byBzZXQgY2hhbm5lbFxuIiwKKwkJCV9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDlrX2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfdmFwICphdnA7CisJdTMyIHJmaWx0ID0gMDsKKwlpbnQgZXJyb3IsIGk7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlhdnAgPSBzYy0+c2NfdmFwc1swXTsKKwlpZiAoYXZwID09IE5VTEwpIHsKKwkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIiVzOiBJbnZhbGlkIGludGVyZmFjZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVE9ETzogTmVlZCB0byBkZWNpZGUgd2hpY2ggaHcgb3Btb2RlIHRvIHVzZSBmb3IgbXVsdGktaW50ZXJmYWNlCisJICogY2FzZXMgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIGFoLT5haF9vcG1vZGUgIT0gQVRIOUtfTV9IT1NUQVApIHsKKwkJYWgtPmFoX29wbW9kZSA9IEFUSDlLX01fSE9TVEFQOworCQlhdGg5a19od19zZXRvcG1vZGUoYWgpOworCQlhdGg5a19od193cml0ZV9hc3NvY2lkKGFoLCBzYy0+c2NfbXlhZGRyLCAwKTsKKwkJLyogUmVxdWVzdCBmdWxsIHJlc2V0IHRvIGdldCBodyBvcG1vZGUgY2hhbmdlZCBwcm9wZXJseSAqLworCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfRlVMTF9SRVNFVDsKKwl9CisKKwlpZiAoKGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CU1NJRCkgJiYKKwkgICAgIWlzX3plcm9fZXRoZXJfYWRkcihjb25mLT5ic3NpZCkpIHsKKwkJc3dpdGNoICh2aWYtPnR5cGUpIHsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQkJLyogVXBkYXRlIHJhdGVjdHJsIGFib3V0IHRoZSBuZXcgc3RhdGUgKi8KKwkJCWF0aF9yYXRlX25ld3N0YXRlKHNjLCBhdnApOworCisJCQkvKiBTZXQgQlNTSUQgKi8KKwkJCW1lbWNweShzYy0+c2NfY3VyYnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7CisJCQlzYy0+c2NfY3VyYWlkID0gMDsKKwkJCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc2MtPnNjX2FoLCBzYy0+c2NfY3VyYnNzaWQsCisJCQkJCSAgICAgICBzYy0+c2NfY3VyYWlkKTsKKworCQkJLyogU2V0IGFnZ3JlZ2F0aW9uIHByb3RlY3Rpb24gbW9kZSBwYXJhbWV0ZXJzICovCisJCQlzYy0+c2NfY29uZmlnLmF0aF9hZ2dyX3Byb3QgPSAwOworCisJCQkvKgorCQkJICogUmVzZXQgb3VyIFRTRiBzbyB0aGF0IGl0cyB2YWx1ZSBpcyBsb3dlciB0aGFuIHRoZQorCQkJICogYmVhY29uIHRoYXQgd2UgYXJlIHRyeWluZyB0byBjYXRjaC4KKwkJCSAqIE9ubHkgdGhlbiBodyB3aWxsIHVwZGF0ZSBpdHMgVFNGIHJlZ2lzdGVyIHdpdGggdGhlCisJCQkgKiBuZXcgYmVhY29uLiBSZXNldCB0aGUgVFNGIGJlZm9yZSBzZXR0aW5nIHRoZSBCU1NJRAorCQkJICogdG8gYXZvaWQgYWxsb3dpbmcgaW4gYW55IGZyYW1lcyB0aGF0IHdvdWxkIHVwZGF0ZQorCQkJICogb3VyIFRTRiBvbmx5IHRvIGhhdmUgdXMgY2xlYXIgaXQKKwkJCSAqIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuCisJCQkgKi8KKwkJCWF0aDlrX2h3X3Jlc2V0X3RzZihzYy0+c2NfYWgpOworCisJCQkvKiBEaXNhYmxlIEJNSVNTIGludGVycnVwdCB3aGVuIHdlJ3JlIG5vdCBhc3NvY2lhdGVkICovCisJCQlhdGg5a19od19zZXRfaW50ZXJydXB0cyhzYy0+c2NfYWgsCisJCQkJCXNjLT5zY19pbWFzayAmCisJCQkJCX4oQVRIOUtfSU5UX1NXQkEgfCBBVEg5S19JTlRfQk1JU1MpKTsKKwkJCXNjLT5zY19pbWFzayAmPSB+KEFUSDlLX0lOVF9TV0JBIHwgQVRIOUtfSU5UX0JNSVNTKTsKKworCQkJRFBSSU5URihzYywgQVRIX0RCR19DT05GSUcsCisJCQkJIiVzOiBSWCBmaWx0ZXIgMHgleCBic3NpZCAlcyBhaWQgMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgcmZpbHQsCisJCQkJcHJpbnRfbWFjKG1hYywgc2MtPnNjX2N1cmJzc2lkKSwgc2MtPnNjX2N1cmFpZCk7CisKKwkJCS8qIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGJlYWNvbiAqLworCQkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9CRUFDT05TIDsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICgoY29uZi0+Y2hhbmdlZCAmIElFRUU4MDIxMV9JRkNDX0JFQUNPTikgJiYKKwkgICAgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHx8CisJICAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSkpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYW5kIHNldHVwIHRoZSBiZWFjb24gZnJhbWUuCisJCSAqCisJCSAqIFN0b3AgYW55IHByZXZpb3VzIGJlYWNvbiBETUEuICBUaGlzIG1heSBiZQorCQkgKiBuZWNlc3NhcnksIGZvciBleGFtcGxlLCB3aGVuIGFuIGlic3MgbWVyZ2UKKwkJICogY2F1c2VzIHJlY29uZmlndXJhdGlvbjsgd2UgbWF5IGJlIGNhbGxlZAorCQkgKiB3aXRoIGJlYWNvbiB0cmFuc21pc3Npb24gYWN0aXZlLgorCQkgKi8KKwkJYXRoOWtfaHdfc3RvcHR4ZG1hKHNjLT5zY19haCwgc2MtPnNjX2JoYWxxKTsKKworCQllcnJvciA9IGF0aF9iZWFjb25fYWxsb2Moc2MsIDApOworCQlpZiAoZXJyb3IgIT0gMCkKKwkJCXJldHVybiBlcnJvcjsKKworCQlhdGhfYmVhY29uX3N5bmMoc2MsIDApOworCX0KKworCS8qIENoZWNrIGZvciBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSA/ICovCisJaWYgKChhdnAtPmF2X29wbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX1dFUF9OS0lEOyBpKyspCisJCQlpZiAoYXRoOWtfaHdfa2V5aXN2YWxpZChzYy0+c2NfYWgsICh1MTYpaSkpCisJCQkJYXRoOWtfaHdfa2V5c2V0bWFjKHNjLT5zY19haCwKKwkJCQkJCSAgICh1MTYpaSwKKwkJCQkJCSAgIHNjLT5zY19jdXJic3NpZCk7CisJfQorCisJLyogT25seSBsZWdhY3kgSUJTUyBmb3Igbm93ICovCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJYXRoX3VwZGF0ZV9jaGFpbm1hc2soc2MsIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1VQUE9SVEVEX0ZJTFRFUlMJCQlcCisJKEZJRl9QUk9NSVNDX0lOX0JTUyB8CQkJXAorCUZJRl9BTExNVUxUSSB8CQkJCVwKKwlGSUZfQ09OVFJPTCB8CQkJCVwKKwlGSUZfT1RIRVJfQlNTIHwJCQkJXAorCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwJCVwKKwlGSUZfRkNTRkFJTCkKKworLyogRklYTUU6IHNjLT5zY19mdWxsX3Jlc2V0ID8gKi8KK3N0YXRpYyB2b2lkIGF0aDlrX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKKwkJCQkgICBpbnQgbWNfY291bnQsCisJCQkJICAgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwl1MzIgcmZpbHQ7CisKKwljaGFuZ2VkX2ZsYWdzICY9IFNVUFBPUlRFRF9GSUxURVJTOworCSp0b3RhbF9mbGFncyAmPSBTVVBQT1JURURfRklMVEVSUzsKKworCXNjLT5yeF9maWx0ZXIgPSAqdG90YWxfZmxhZ3M7CisJcmZpbHQgPSBhdGhfY2FsY3J4ZmlsdGVyKHNjKTsKKwlhdGg5a19od19zZXRyeGZpbHRlcihzYy0+c2NfYWgsIHJmaWx0KTsKKworCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKKwkJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCQkJYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChzYy0+c2NfYWgsIGF0aF9iY2FzdF9tYWMsIDApOworCX0KKworCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IFNldCBIVyBSWCBmaWx0ZXI6IDB4JXhcbiIsCisJCV9fZnVuY19fLCBzYy0+cnhfZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoX25vZGUgKmFuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPm5vZGVfbG9jaywgZmxhZ3MpOworCWFuID0gYXRoX25vZGVfZmluZChzYywgc3RhLT5hZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bm9kZV9sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU1RBX05PVElGWV9BREQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bm9kZV9sb2NrLCBmbGFncyk7CisJCWlmICghYW4pIHsKKwkJCWF0aF9ub2RlX2F0dGFjaChzYywgc3RhLT5hZGRyLCAwKTsKKwkJCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEF0dGFjaCBhIG5vZGU6ICVzXG4iLAorCQkJCV9fZnVuY19fLCBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCWF0aF9ub2RlX2dldChzYywgc3RhLT5hZGRyKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bm9kZV9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU1RBX05PVElGWV9SRU1PVkU6CisJCWlmICghYW4pCisJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJCSIlczogUmVtb3ZhbCBvZiBhIG5vbi1leGlzdGVudCBub2RlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJZWxzZSB7CisJCQlhdGhfbm9kZV9wdXQoc2MsIGFuLCBBVEg5S19CSF9TVEFUVVNfSU5UQUNUKTsKKwkJCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IFB1dCBhIG5vZGU6ICVzXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXByaW50X21hYyhtYWMsIHN0YS0+YWRkcikpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhdGg5a19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIHUxNiBxdWV1ZSwKKwkJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aDlrX3R4X3F1ZXVlX2luZm8gcWk7CisJaW50IHJldCA9IDAsIHFudW07CisKKwlpZiAocXVldWUgPj0gV01FX05VTV9BQykKKwkJcmV0dXJuIDA7CisKKwlxaS50cWlfYWlmcyA9IHBhcmFtcy0+YWlmczsKKwlxaS50cWlfY3dtaW4gPSBwYXJhbXMtPmN3X21pbjsKKwlxaS50cWlfY3dtYXggPSBwYXJhbXMtPmN3X21heDsKKwlxaS50cWlfYnVyc3RUaW1lID0gcGFyYW1zLT50eG9wOworCXFudW0gPSBhdGhfZ2V0X2hhbF9xbnVtKHF1ZXVlLCBzYyk7CisKKwlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywKKwkJIiVzOiBDb25maWd1cmUgdHggW3F1ZXVlL2hhbHFdIFslZC8lZF0sICAiCisJCSJhaWZzOiAlZCwgY3dfbWluOiAlZCwgY3dfbWF4OiAlZCwgdHhvcDogJWRcbiIsCisJCV9fZnVuY19fLAorCQlxdWV1ZSwKKwkJcW51bSwKKwkJcGFyYW1zLT5haWZzLAorCQlwYXJhbXMtPmN3X21pbiwKKwkJcGFyYW1zLT5jd19tYXgsCisJCXBhcmFtcy0+dHhvcCk7CisKKwlyZXQgPSBhdGhfdHhxX3VwZGF0ZShzYywgcW51bSwgJnFpKTsKKwlpZiAocmV0KQorCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJIiVzOiBUWFEgVXBkYXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGg5a19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJIGNvbnN0IHU4ICpsb2NhbF9hZGRyLAorCQkJIGNvbnN0IHU4ICphZGRyLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OworCWludCByZXQgPSAwOworCisJRFBSSU5URihzYywgQVRIX0RCR19LRVlDQUNIRSwgIiAlczogU2V0IEhXIEtleVxuIiwgX19mdW5jX18pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFVF9LRVk6CisJCXJldCA9IGF0aF9rZXlfY29uZmlnKHNjLCBhZGRyLCBrZXkpOworCQlpZiAoIXJldCkgeworCQkJc2V0X2JpdChrZXktPmtleWlkeCwgc2MtPnNjX2tleW1hcCk7CisJCQlrZXktPmh3X2tleV9pZHggPSBrZXktPmtleWlkeDsKKwkJCS8qIHB1c2ggSVYgYW5kIE1pY2hhZWwgTUlDIGdlbmVyYXRpb24gdG8gc3RhY2sgKi8KKwkJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCQkJaWYgKGtleS0+YWxnID09IEFMR19US0lQKQorCQkJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX01NSUM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwkJYXRoX2tleV9kZWxldGUoc2MsIGtleSk7CisJCWNsZWFyX2JpdChrZXktPmtleWlkeCwgc2MtPnNjX2tleW1hcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAorCQkJCSAgIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgeworCQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBCU1MgQ2hhbmdlZCBQUkVBTUJMRSAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSk7CisJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX1BSRUFNQkxFX1NIT1JUOworCQllbHNlCisJCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX1BSRUFNQkxFX1NIT1JUOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEJTUyBDaGFuZ2VkIENUUyBQUk9UICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlic3NfY29uZi0+dXNlX2N0c19wcm90KTsKKwkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QgJiYKKwkJICAgIGh3LT5jb25mLmNoYW5uZWwtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCXNjLT5zY19mbGFncyB8PSBTQ19PUF9QUk9URUNUX0VOQUJMRTsKKwkJZWxzZQorCQkJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9QUk9URUNUX0VOQUJMRTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0hUKSB7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfQ09ORklHLCAiJXM6IEJTUyBDaGFuZ2VkIEhUICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlic3NfY29uZi0+YXNzb2NfaHQpOworCQlhdGg5a19odF9jb25mKHNjLCBic3NfY29uZik7CisJfQorCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgeworCQlEUFJJTlRGKHNjLCBBVEhfREJHX0NPTkZJRywgIiVzOiBCU1MgQ2hhbmdlZCBBU1NPQyAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJYnNzX2NvbmYtPmFzc29jKTsKKwkJYXRoOWtfYnNzX2Fzc29jX2luZm8oc2MsIGJzc19jb25mKTsKKwl9Cit9CisKK3N0YXRpYyB1NjQgYXRoOWtfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwl1NjQgdHNmOworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCisJdHNmID0gYXRoOWtfaHdfZ2V0dHNmNjQoYWgpOworCisJcmV0dXJuIHRzZjsKK30KKworc3RhdGljIHZvaWQgYXRoOWtfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2FoOworCisJYXRoOWtfaHdfcmVzZXRfdHNmKGFoKTsKK30KKworc3RhdGljIGludCBhdGg5a19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICAgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICAgdTE2IHRpZCwgdTE2ICpzc24pCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CisJCXJldCA9IGF0aF9yeF9hZ2dyX3N0YXJ0KHNjLCBzdGEtPmFkZHIsIHRpZCwgc3NuKTsKKwkJaWYgKHJldCA8IDApCisJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJCSIlczogVW5hYmxlIHRvIHN0YXJ0IFJYIGFnZ3JlZ2F0aW9uXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKKwkJcmV0ID0gYXRoX3J4X2FnZ3Jfc3RvcChzYywgc3RhLT5hZGRyLCB0aWQpOworCQlpZiAocmV0IDwgMCkKKwkJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkJIiVzOiBVbmFibGUgdG8gc3RvcCBSWCBhZ2dyZWdhdGlvblxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgorCQlyZXQgPSBhdGhfdHhfYWdncl9zdGFydChzYywgc3RhLT5hZGRyLCB0aWQsIHNzbik7CisJCWlmIChyZXQgPCAwKQorCQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKKwkJCQkiJXM6IFVuYWJsZSB0byBzdGFydCBUWCBhZ2dyZWdhdGlvblxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWVsc2UKKwkJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKGh3LCBzdGEtPmFkZHIsIHRpZCk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6CisJCXJldCA9IGF0aF90eF9hZ2dyX3N0b3Aoc2MsIHN0YS0+YWRkciwgdGlkKTsKKwkJaWYgKHJldCA8IDApCisJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAorCQkJCSIlczogVW5hYmxlIHRvIHN0b3AgVFggYWdncmVnYXRpb25cbiIsCisJCQkJX19mdW5jX18pOworCisJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoaHcsIHN0YS0+YWRkciwgdGlkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKKwkJCSIlczogVW5rbm93biBBTVBEVSBhY3Rpb25cbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDlrX25vX2ZyYWdtZW50YXRpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhdGg5a19vcHMgPSB7CisJLnR4IAkJICAgID0gYXRoOWtfdHgsCisJLnN0YXJ0IAkJICAgID0gYXRoOWtfc3RhcnQsCisJLnN0b3AgCQkgICAgPSBhdGg5a19zdG9wLAorCS5hZGRfaW50ZXJmYWNlIAkgICAgPSBhdGg5a19hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlICAgPSBhdGg5a19yZW1vdmVfaW50ZXJmYWNlLAorCS5jb25maWcgCSAgICA9IGF0aDlrX2NvbmZpZywKKwkuY29uZmlnX2ludGVyZmFjZSAgID0gYXRoOWtfY29uZmlnX2ludGVyZmFjZSwKKwkuY29uZmlndXJlX2ZpbHRlciAgID0gYXRoOWtfY29uZmlndXJlX2ZpbHRlciwKKwkuZ2V0X3N0YXRzICAgICAgICAgID0gTlVMTCwKKwkuc3RhX25vdGlmeSAgICAgICAgID0gYXRoOWtfc3RhX25vdGlmeSwKKwkuY29uZl90eCAJICAgID0gYXRoOWtfY29uZl90eCwKKwkuZ2V0X3R4X3N0YXRzIAkgICAgPSBOVUxMLAorCS5ic3NfaW5mb19jaGFuZ2VkICAgPSBhdGg5a19ic3NfaW5mb19jaGFuZ2VkLAorCS5zZXRfdGltICAgICAgICAgICAgPSBOVUxMLAorCS5zZXRfa2V5ICAgICAgICAgICAgPSBhdGg5a19zZXRfa2V5LAorCS5od19zY2FuICAgICAgICAgICAgPSBOVUxMLAorCS5nZXRfdGtpcF9zZXEgICAgICAgPSBOVUxMLAorCS5zZXRfcnRzX3RocmVzaG9sZCAgPSBOVUxMLAorCS5zZXRfZnJhZ190aHJlc2hvbGQgPSBOVUxMLAorCS5zZXRfcmV0cnlfbGltaXQgICAgPSBOVUxMLAorCS5nZXRfdHNmIAkgICAgPSBhdGg5a19nZXRfdHNmLAorCS5yZXNldF90c2YgCSAgICA9IGF0aDlrX3Jlc2V0X3RzZiwKKwkudHhfbGFzdF9iZWFjb24gICAgID0gTlVMTCwKKwkuYW1wZHVfYWN0aW9uICAgICAgID0gYXRoOWtfYW1wZHVfYWN0aW9uLAorCS5zZXRfZnJhZ190aHJlc2hvbGQgPSBhdGg5a19ub19mcmFnbWVudGF0aW9uLAorfTsKKwogc3RhdGljIGludCBhdGhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdm9pZCBfX2lvbWVtICptZW07CkBAIC0xMzUwLDkgKzE3NDYsMTYgQEAKIAkJZ290byBiYWQyOwogCX0KIAotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKKwlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKKwkJSUVFRTgwMjExX0hXX0hPU1RfQlJPQURDQVNUX1BTX0JVRkZFUklORyB8CisJCUlFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKIAkJSUVFRTgwMjExX0hXX05PSVNFX0RCTTsKIAorCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KKwkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisKIAlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGh3KTsKIApAQCAtMTQwMCwxMCArMTgwMywxNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CisJZW51bSBhdGg5a19pbnQgc3RhdHVzOwogCi0JaWYgKHBkZXYtPmlycSkKKwlpZiAocGRldi0+aXJxKSB7CisJCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKHNjLT5zY19haCwgMCk7CisJCS8qIGNsZWFyIHRoZSBJU1IgKi8KKwkJYXRoOWtfaHdfZ2V0aXNyKHNjLT5zY19haCwgJnN0YXR1cyk7CisJCXNjLT5zY19mbGFncyB8PSBTQ19PUF9JTlZBTElEOwogCQlmcmVlX2lycShwZGV2LT5pcnEsIHNjKTsKKwl9CiAJYXRoX2RldGFjaChzYyk7CisKIAlwY2lfaW91bm1hcChwZGV2LCBzYy0+bWVtKTsKIAlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTQxNCw2ICsxODI0LDE2IEBACiAKIHN0YXRpYyBpbnQgYXRoX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKKworCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgQVRIX0xFRF9QSU4sIDEpOworCisjaWZkZWYgQ09ORklHX1JGS0lMTAorCWlmIChzYy0+c2NfYWgtPmFoX2NhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SRlNJTEVOVCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzYy0+cmZfa2lsbC5yZmtpbGxfcG9sbCk7CisjZW5kaWYKKwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDMpOwpAQCAtMTQyMyw2ICsxODQzLDggQEAKIAogc3RhdGljIGludCBhdGhfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCXUzMiB2YWw7CiAJaW50IGVycjsKIApAQCAtMTQzOSw2ICsxODYxLDIxIEBACiAJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwogCisJLyogRW5hYmxlIExFRCAqLworCWF0aDlrX2h3X2NmZ19vdXRwdXQoc2MtPnNjX2FoLCBBVEhfTEVEX1BJTiwKKwkJCSAgICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKKwlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIEFUSF9MRURfUElOLCAxKTsKKworI2lmZGVmIENPTkZJR19SRktJTEwKKwkvKgorCSAqIGNoZWNrIHRoZSBoL3cgcmZraWxsIHN0YXRlIG9uIHJlc3VtZQorCSAqIGFuZCBzdGFydCB0aGUgcmZraWxsIHBvbGwgdGltZXIKKwkgKi8KKwlpZiAoc2MtPnNjX2FoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfUkZTSUxFTlQpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzYy0+aHctPndvcmtxdWV1ZSwKKwkJCQkgICAmc2MtPnJmX2tpbGwucmZraWxsX3BvbGwsIDApOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9waHkuaAppbmRleCAwY2QzOTlhLi4xNDcwMjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9waHkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9waHkuaApAQCAtMTgsMTkgKzE4LDE5IEBACiAjZGVmaW5lIFBIWV9ICiAKIGJvb2wgYXRoOWtfaHdfYXI5MjgwX3NldF9jaGFubmVsKHN0cnVjdCBhdGhfaGFsICphaCwKLQkJCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbAotCQkJCQkgICpjaGFuKTsKKwkJCQkgc3RydWN0IGF0aDlrX2NoYW5uZWwKKwkJCQkgKmNoYW4pOwogYm9vbCBhdGg5a19od19zZXRfY2hhbm5lbChzdHJ1Y3QgYXRoX2hhbCAqYWgsCi0JCQkJICAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4pOworCQkJICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbik7CiB2b2lkIGF0aDlrX2h3X3dyaXRlX3JlZ3Moc3RydWN0IGF0aF9oYWwgKmFoLCB1MzIgbW9kZXNJbmRleCwKIAkJCSB1MzIgZnJlcUluZGV4LCBpbnQgcmVnV3JpdGVzKTsKIGJvb2wgYXRoOWtfaHdfc2V0X3JmX3JlZ3Moc3RydWN0IGF0aF9oYWwgKmFoLAotCQkJCSAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuLAotCQkJCSAgIHUxNiBtb2Rlc0luZGV4KTsKKwkJCSAgc3RydWN0IGF0aDlrX2NoYW5uZWwgKmNoYW4sCisJCQkgIHUxNiBtb2Rlc0luZGV4KTsKIHZvaWQgYXRoOWtfaHdfZGVjcmVhc2VfY2hhaW5fcG93ZXIoc3RydWN0IGF0aF9oYWwgKmFoLAogCQkJCSAgIHN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuKTsKIGJvb2wgYXRoOWtfaHdfaW5pdF9yZihzdHJ1Y3QgYXRoX2hhbCAqYWgsCi0JCQkgICAgICAgaW50ICpzdGF0dXMpOworCQkgICAgICBpbnQgKnN0YXR1cyk7CiAKICNkZWZpbmUgQVJfUEhZX0JBU0UgICAgIDB4OTgwMAogI2RlZmluZSBBUl9QSFkoX24pICAgICAgKEFSX1BIWV9CQVNFICsgKChfbik8PDIpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JjLmMKaW5kZXggNzNjNDYwYS4uY2NhMmZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvcmMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImNvcmUuaCIKKy8qIEZJWE1FOiByZW1vdmUgdGhpcyBpbmNsdWRlISAqLwogI2luY2x1ZGUgIi4uL25ldC9tYWM4MDIxMS9yYXRlLmgiCiAKIHN0YXRpYyB1MzIgdHhfdHJpZ2xldmVsX21heDsKQEAgLTY1Myw4ICs2NTQsOCBAQAogCXJhdGVfY3RybCA9IChzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsICopKGF0aF9yY19wcml2KTsKIAlmb3IgKGkgPSAwOyBpIDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQ7IGkrKykgewogCQl2YWxpZCA9IChhdGhfcmNfcHJpdi0+c2luZ2xlX3N0cmVhbSA/Ci0JCQkJcmF0ZV90YWJsZS0+aW5mb1tpXS52YWxpZF9zaW5nbGVfc3RyZWFtIDoKLQkJCQlyYXRlX3RhYmxlLT5pbmZvW2ldLnZhbGlkKTsKKwkJCSByYXRlX3RhYmxlLT5pbmZvW2ldLnZhbGlkX3NpbmdsZV9zdHJlYW0gOgorCQkJIHJhdGVfdGFibGUtPmluZm9baV0udmFsaWQpOwogCQlpZiAodmFsaWQgPT0gVFJVRSkgewogCQkJdTMyIHBoeSA9IHJhdGVfdGFibGUtPmluZm9baV0ucGh5OwogCQkJdTggdmFsaWRfcmF0ZV9jb3VudCA9IDA7CkBAIC03NDAsMTQgKzc0MSwxNCBAQAogCQlmb3IgKGogPSAwOyBqIDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQ7IGorKykgewogCQkJdTMyIHBoeSA9IHJhdGVfdGFibGUtPmluZm9bal0ucGh5OwogCQkJdTMyIHZhbGlkID0gKGF0aF9yY19wcml2LT5zaW5nbGVfc3RyZWFtID8KLQkJCQlyYXRlX3RhYmxlLT5pbmZvW2pdLnZhbGlkX3NpbmdsZV9zdHJlYW0gOgotCQkJCXJhdGVfdGFibGUtPmluZm9bal0udmFsaWQpOworCQkJCSAgICAgcmF0ZV90YWJsZS0+aW5mb1tqXS52YWxpZF9zaW5nbGVfc3RyZWFtIDoKKwkJCQkgICAgIHJhdGVfdGFibGUtPmluZm9bal0udmFsaWQpOwogCiAJCQlpZiAoKCgoKHN0cnVjdCBhdGhfcmF0ZXNldCAqKQotCQkJCW1jc19zZXQpLT5yc19yYXRlc1tpXSAmIDB4N0YpICE9Ci0JCQkJKHJhdGVfdGFibGUtPmluZm9bal0uZG90MTFyYXRlICYgMHg3RikpIHx8Ci0JCQkJCSFXTEFOX1JDX1BIWV9IVChwaHkpIHx8Ci0JCQkJCSFXTEFOX1JDX1BIWV9IVF9WQUxJRCh2YWxpZCwgY2FwZmxhZykpCisJCQkgICAgICAgbWNzX3NldCktPnJzX3JhdGVzW2ldICYgMHg3RikgIT0KKwkJCSAgICAgKHJhdGVfdGFibGUtPmluZm9bal0uZG90MTFyYXRlICYgMHg3RikpIHx8CisJCQkgICAgIVdMQU5fUkNfUEhZX0hUKHBoeSkgfHwKKwkJCSAgICAhV0xBTl9SQ19QSFlfSFRfVkFMSUQodmFsaWQsIGNhcGZsYWcpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoIWF0aF9yY192YWxpZF9waHlyYXRlKHBoeSwgY2FwZmxhZywgRkFMU0UpKQpAQCAtODQ3LDkgKzg0OCw5IEBACiAJLyogRm9yIGhhbGYgYW5kIHF1YXJ0ZXIgcmF0ZSBjaGFubmxlcyB1c2UgZGlmZmVyZW50CiAJICogcmF0ZSB0YWJsZXMKIAkgKi8KLQlpZiAoc2MtPnNjX2N1cmNoYW4uY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9IQUxGKQorCWlmIChzYy0+c2NfYWgtPmFoX2N1cmNoYW4tPmNoYW5uZWxGbGFncyAmIENIQU5ORUxfSEFMRikKIAkJYXI1NDE2X3NldGhhbGZfcmF0ZXRhYmxlKGFzYyk7Ci0JZWxzZSBpZiAoc2MtPnNjX2N1cmNoYW4uY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9RVUFSVEVSKQorCWVsc2UgaWYgKHNjLT5zY19haC0+YWhfY3VyY2hhbi0+Y2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9RVUFSVEVSKQogCQlhcjU0MTZfc2V0cXVhcnRlcl9yYXRldGFibGUoYXNjKTsKIAllbHNlIC8qIGZ1bGwgcmF0ZSAqLwogCQlhcjU0MTZfc2V0ZnVsbF9yYXRldGFibGUoYXNjKTsKQEAgLTg2NiwxMCArODY3LDEwIEBACiB9CiAKIHN0YXRpYyB1OCBhdGhfcmNfcmF0ZWZpbmRfaHQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCQkJICAgc3RydWN0IGF0aF9yYXRlX25vZGUgKmF0aF9yY19wcml2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqcmF0ZV90YWJsZSwKLQkJCQkgICBpbnQgcHJvYmVfYWxsb3dlZCwgaW50ICppc19wcm9iaW5nLAotCQkJCSAgIGludCBpc19yZXRyeSkKKwkJCSAgICAgc3RydWN0IGF0aF9yYXRlX25vZGUgKmF0aF9yY19wcml2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYXRoX3JhdGVfdGFibGUgKnJhdGVfdGFibGUsCisJCQkgICAgIGludCBwcm9iZV9hbGxvd2VkLCBpbnQgKmlzX3Byb2JpbmcsCisJCQkgICAgIGludCBpc19yZXRyeSkKIHsKIAl1MzIgZHQsIGJlc3RfdGhydXB1dCwgdGhpc190aHJ1cHV0LCBub3dfbXNlYzsKIAl1OCByYXRlLCBuZXh0X3JhdGUsIGJlc3RfcmF0ZSwgbWF4aW5kZXgsIG1pbmluZGV4OwpAQCAtOTk3LDggKzk5OCw4IEBACiAJCXJhdGUgPSByYXRlX2N0cmwtPnJhdGVfdGFibGVfc2l6ZSAtIDE7CiAKIAlBU1NFUlQoKHJhdGVfdGFibGUtPmluZm9bcmF0ZV0udmFsaWQgJiYgIWF0aF9yY19wcml2LT5zaW5nbGVfc3RyZWFtKSB8fAotCQkocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS52YWxpZF9zaW5nbGVfc3RyZWFtICYmCi0JCQlhdGhfcmNfcHJpdi0+c2luZ2xlX3N0cmVhbSkpOworCSAgICAgICAocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS52YWxpZF9zaW5nbGVfc3RyZWFtICYmCisJCWF0aF9yY19wcml2LT5zaW5nbGVfc3RyZWFtKSk7CiAKIAlyZXR1cm4gcmF0ZTsKIH0KQEAgLTEwMjMsMTAgKzEwMjQsMTAgQEAKIH0KIAogc3RhdGljIHU4IGF0aF9yY19yYXRlX2dldGlkeChzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJCQkgICBzdHJ1Y3QgYXRoX3JhdGVfbm9kZSAqYXRoX3JjX3ByaXYsCi0JCQkJICAgY29uc3Qgc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlLAotCQkJCSAgIHU4IHJpeCwgdTE2IHN0ZXBkb3duLAotCQkJCSAgIHUxNiBtaW5fcmF0ZSkKKwkJCSAgICAgc3RydWN0IGF0aF9yYXRlX25vZGUgKmF0aF9yY19wcml2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYXRoX3JhdGVfdGFibGUgKnJhdGVfdGFibGUsCisJCQkgICAgIHU4IHJpeCwgdTE2IHN0ZXBkb3duLAorCQkJICAgICB1MTYgbWluX3JhdGUpCiB7CiAJdTMyIGo7CiAJdTggbmV4dGluZGV4OwpAQCAtMTA2Niw4ICsxMDY3LDggQEAKIAlyYXRlX3RhYmxlID0KIAkJKHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqKWFzYy0+aHdfcmF0ZV90YWJsZVtzYy0+c2NfY3VybW9kZV07CiAJcml4ID0gYXRoX3JjX3JhdGVmaW5kX2h0KHNjLCBhdGhfcmNfcHJpdiwgcmF0ZV90YWJsZSwKLQkJCQkocmNmbGFnICYgQVRIX1JDX1BST0JFX0FMTE9XRUQpID8gMSA6IDAsCi0JCQkJaXNfcHJvYmUsIGlzX3JldHJ5KTsKKwkJCQkgKHJjZmxhZyAmIEFUSF9SQ19QUk9CRV9BTExPV0VEKSA/IDEgOiAwLAorCQkJCSBpc19wcm9iZSwgaXNfcmV0cnkpOwogCW5yaXggPSByaXg7CiAKIAlpZiAoKHJjZmxhZyAmIEFUSF9SQ19QUk9CRV9BTExPV0VEKSAmJiAoKmlzX3Byb2JlKSkgewpAQCAtMTA5OSwxMyArMTEwMCwxMyBAQAogCQl0cnlfbnVtID0gKChpICsgMSkgPT0gbnVtX3JhdGVzKSA/CiAJCQludW1fdHJpZXMgLSAodHJ5X3Blcl9yYXRlICogaSkgOiB0cnlfcGVyX3JhdGUgOwogCQltaW5fcmF0ZSA9ICgoKGkgKyAxKSA9PSBudW1fcmF0ZXMpICYmCi0JCQkocmNmbGFnICYgQVRIX1JDX01JTlJBVEVfTEFTVFJBVEUpKSA/IDEgOiAwOworCQkJICAgIChyY2ZsYWcgJiBBVEhfUkNfTUlOUkFURV9MQVNUUkFURSkpID8gMSA6IDA7CiAKIAkJbnJpeCA9IGF0aF9yY19yYXRlX2dldGlkeChzYywgYXRoX3JjX3ByaXYsCi0JCQlyYXRlX3RhYmxlLCBucml4LCAxLCBtaW5fcmF0ZSk7CisJCQkJCSAgcmF0ZV90YWJsZSwgbnJpeCwgMSwgbWluX3JhdGUpOwogCQkvKiBBbGwgb3RoZXIgcmF0ZXMgaW4gdGhlIHNlcmllcyBoYXZlIFJUUyBlbmFibGVkICovCiAJCWF0aF9yY19yYXRlX3NldF9zZXJpZXMocmF0ZV90YWJsZSwKLQkJCSZzZXJpZXNbaV0sIHRyeV9udW0sIG5yaXgsIFRSVUUpOworCQkJCSAgICAgICAmc2VyaWVzW2ldLCB0cnlfbnVtLCBucml4LCBUUlVFKTsKIAl9CiAKIAkvKgpAQCAtMTEyNCwxMyArMTEyNSwxMyBAQAogCSAqIGFib3ZlIGNvbmRpdGlvbnMuCiAJICovCiAJaWYgKChzYy0+c2NfY3VybW9kZSA9PSBBVEg5S19NT0RFXzExTkdfSFQyMCkgfHwKLQkJCShzYy0+c2NfY3VybW9kZSA9PSBBVEg5S19NT0RFXzExTkdfSFQ0MFBMVVMpIHx8Ci0JCQkoc2MtPnNjX2N1cm1vZGUgPT0gQVRIOUtfTU9ERV8xMU5HX0hUNDBNSU5VUykpIHsKKwkgICAgKHNjLT5zY19jdXJtb2RlID09IEFUSDlLX01PREVfMTFOR19IVDQwUExVUykgfHwKKwkgICAgKHNjLT5zY19jdXJtb2RlID09IEFUSDlLX01PREVfMTFOR19IVDQwTUlOVVMpKSB7CiAJCXU4ICBkb3QxMXJhdGUgPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0uZG90MTFyYXRlOwogCQl1OCBwaHkgPSByYXRlX3RhYmxlLT5pbmZvW3JpeF0ucGh5OwogCQlpZiAoaSA9PSA0ICYmCiAJCSAgICAoKGRvdDExcmF0ZSA9PSAyICYmIHBoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9TUykgfHwKLQkJICAgIChkb3QxMXJhdGUgPT0gMyAmJiBwaHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfU1MpKSkgeworCQkgICAgIChkb3QxMXJhdGUgPT0gMyAmJiBwaHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfU1MpKSkgewogCQkJc2VyaWVzWzNdLnJpeCA9IHNlcmllc1syXS5yaXg7CiAJCQlzZXJpZXNbM10uZmxhZ3MgPSBzZXJpZXNbMl0uZmxhZ3M7CiAJCQlzZXJpZXNbM10ubWF4XzRtc19mcmFtZWxlbiA9IHNlcmllc1syXS5tYXhfNG1zX2ZyYW1lbGVuOwpAQCAtMTE0MSwxOCArMTE0MiwxOSBAQAogLyoKICAqIFJldHVybiB0aGUgVHggcmF0ZSBzZXJpZXMuCiAgKi8KLXZvaWQgYXRoX3JhdGVfZmluZHJhdGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCSAgICAgICBzdHJ1Y3QgYXRoX3JhdGVfbm9kZSAqYXRoX3JjX3ByaXYsCi0JCSAgICAgICBpbnQgbnVtX3RyaWVzLAotCQkgICAgICAgaW50IG51bV9yYXRlcywKLQkJICAgICAgIHVuc2lnbmVkIGludCByY2ZsYWcsCi0JCSAgICAgICBzdHJ1Y3QgYXRoX3JjX3NlcmllcyBzZXJpZXNbXSwKLQkJICAgICAgIGludCAqaXNfcHJvYmUsCi0JCSAgICAgICBpbnQgaXNfcmV0cnkpCitzdGF0aWMgdm9pZCBhdGhfcmF0ZV9maW5kcmF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywKKwkJCSAgICAgIHN0cnVjdCBhdGhfcmF0ZV9ub2RlICphdGhfcmNfcHJpdiwKKwkJCSAgICAgIGludCBudW1fdHJpZXMsCisJCQkgICAgICBpbnQgbnVtX3JhdGVzLAorCQkJICAgICAgdW5zaWduZWQgaW50IHJjZmxhZywKKwkJCSAgICAgIHN0cnVjdCBhdGhfcmNfc2VyaWVzIHNlcmllc1tdLAorCQkJICAgICAgaW50ICppc19wcm9iZSwKKwkJCSAgICAgIGludCBpc19yZXRyeSkKIHsKIAlzdHJ1Y3QgYXRoX3ZhcCAqYXZwID0gYXRoX3JjX3ByaXYtPmF2cDsKIAotCURQUklOVEYoc2MsIEFUSF9EQkdfUkFURSwgIiVzIiwgX19mdW5jX18pOworCURQUklOVEYoc2MsIEFUSF9EQkdfUkFURSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIW51bV9yYXRlcyB8fCAhbnVtX3RyaWVzKQogCQlyZXR1cm47CiAKQEAgLTExNzQsOSArMTE3Niw4IEBACiAJCQl1bnNpZ25lZCBpbnQgICAgbWNzOwogCQkJdTggc2VyaWVzX3JpeCA9IDA7CiAKLQkJCXNlcmllc1tpZHhdLnRyaWVzID0KLQkJCQlJRUVFODAyMTFfUkFURV9JRFhfRU5UUlkoCi0JCQkJCWF2cC0+YXZfY29uZmlnLmF2X2ZpeGVkX3JldHJ5c2V0LCBpZHgpOworCQkJc2VyaWVzW2lkeF0udHJpZXMgPSBJRUVFODAyMTFfUkFURV9JRFhfRU5UUlkoCisJCQkJYXZwLT5hdl9jb25maWcuYXZfZml4ZWRfcmV0cnlzZXQsIGlkeCk7CiAKIAkJCW1jcyA9IElFRUU4MDIxMV9SQVRFX0lEWF9FTlRSWSgKIAkJCQlhdnAtPmF2X2NvbmZpZy5hdl9maXhlZF9yYXRlc2V0LCBpZHgpOwpAQCAtMTIyOCw3ICsxMjI5LDcgQEAKIAl1MzIgbm93X21zZWMgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwogCWludCBzdGF0ZV9jaGFuZ2UgPSBGQUxTRSwgcmF0ZSwgY291bnQ7CiAJdTggbGFzdF9wZXI7Ci0Jc3RydWN0IGF0aF9yYXRlX3NvZnRjICAqYXNjID0gKHN0cnVjdCBhdGhfcmF0ZV9zb2Z0YyAqKXNjLT5zY19yYzsKKwlzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgKmFzYyA9IChzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgKilzYy0+c2NfcmM7CiAJc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlID0KIAkJKHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqKWFzYy0+aHdfcmF0ZV90YWJsZVtzYy0+c2NfY3VybW9kZV07CiAKQEAgLTEyNzIsMTQgKzEyNzMsMTQgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIHhyZXRyaWVzID09IDIgKi8KIAkJCWNvdW50ID0gc2l6ZW9mKG5yZXRyeV90b19wZXJfbG9va3VwKSAvCi0JCQkJCXNpemVvZihucmV0cnlfdG9fcGVyX2xvb2t1cFswXSk7CisJCQkJc2l6ZW9mKG5yZXRyeV90b19wZXJfbG9va3VwWzBdKTsKIAkJCWlmIChyZXRyaWVzID49IGNvdW50KQogCQkJCXJldHJpZXMgPSBjb3VudCAtIDE7CiAJCQkvKiBuZXdfUEVSID0gNy84Km9sZF9QRVIgKyAxLzgqKGN1cnJlbnRQRVIpICovCiAJCQlyYXRlX2N0cmwtPnN0YXRlW3R4X3JhdGVdLnBlciA9CiAJCQkJKHU4KShyYXRlX2N0cmwtPnN0YXRlW3R4X3JhdGVdLnBlciAtCi0JCQkJKHJhdGVfY3RybC0+c3RhdGVbdHhfcmF0ZV0ucGVyID4+IDMpICsKLQkJCQkoKDEwMCkgPj4gMykpOworCQkJCSAgICAgKHJhdGVfY3RybC0+c3RhdGVbdHhfcmF0ZV0ucGVyID4+IDMpICsKKwkJCQkgICAgICgoMTAwKSA+PiAzKSk7CiAJCX0KIAogCQkvKiB4cmV0cmllcyA9PSAxIG9yIDIgKi8KQEAgLTEyOTUsOCArMTI5Niw3IEBACiAJCWlmIChyZXRyaWVzID49IGNvdW50KQogCQkJcmV0cmllcyA9IGNvdW50IC0gMTsKIAkJaWYgKGluZm9fcHJpdi0+bl9iYWRfZnJhbWVzKSB7Ci0JCQkvKiBuZXdfUEVSID0gNy84Km9sZF9QRVIgKyAxLzgqKGN1cnJlbnRQRVIpICAqLwotCQkJLyoKKwkJCS8qIG5ld19QRVIgPSA3Lzgqb2xkX1BFUiArIDEvOCooY3VycmVudFBFUikKIAkJCSAqIEFzc3VtaW5nIHRoYXQgbl9mcmFtZXMgaXMgbm90IDAuICBUaGUgY3VycmVudCBQRVIKIAkJCSAqIGZyb20gdGhlIHJldHJpZXMgaXMgMTAwICogcmV0cmllcyAvIChyZXRyaWVzKzEpLAogCQkJICogc2luY2UgdGhlIGZpcnN0IHJldHJpZXMgYXR0ZW1wdHMgZmFpbGVkLCBhbmQgdGhlCkBAIC0xMzg2LDcgKzEzODYsNyBAQAogCQkJICogcnNzaV9hY2sgdmFsdWVzLgogCQkJICovCiAJCQlpZiAodHhfcmF0ZSA9PSByYXRlX2N0cmwtPnJhdGVfbWF4X3BoeSAmJgotCQkJCQlyYXRlX2N0cmwtPmh3X21heHJldHJ5X3BrdGNudCA8IDI1NSkgeworCQkJICAgIHJhdGVfY3RybC0+aHdfbWF4cmV0cnlfcGt0Y250IDwgMjU1KSB7CiAJCQkJcmF0ZV9jdHJsLT5od19tYXhyZXRyeV9wa3RjbnQrKzsKIAkJCX0KIApAQCAtMTQxOCw3ICsxNDE4LDcgQEAKIAkJCQkJLyogTm93IHJlZHVjZSB0aGUgY3VycmVudAogCQkJCQkgKiByc3NpIHRocmVzaG9sZC4gKi8KIAkJCQkJaWYgKChyc3NpX2Fja0F2ZyA8IHJzc2lfdGhyZXMgKyAyKSAmJgotCQkJCQkJKHJzc2lfdGhyZXMgPiByc3NpX2Fja192bWluKSkgeworCQkJCQkgICAgKHJzc2lfdGhyZXMgPiByc3NpX2Fja192bWluKSkgewogCQkJCQkJcmF0ZV9jdHJsLT5zdGF0ZVt0eF9yYXRlXS4KIAkJCQkJCQlyc3NpX3RocmVzLS07CiAJCQkJCX0KQEAgLTE0MzYsMTAgKzE0MzYsMTAgQEAKIAkgKiBhIHdoaWxlIChleGNlcHQgaWYgd2UgYXJlIHByb2JpbmcpLgogCSAqLwogCWlmIChyYXRlX2N0cmwtPnN0YXRlW3R4X3JhdGVdLnBlciA+PSA1NSAmJiB0eF9yYXRlID4gMCAmJgotCQkJcmF0ZV90YWJsZS0+aW5mb1t0eF9yYXRlXS5yYXRla2JwcyA8PQotCQkJcmF0ZV90YWJsZS0+aW5mb1tyYXRlX2N0cmwtPnJhdGVfbWF4X3BoeV0ucmF0ZWticHMpIHsKKwkgICAgcmF0ZV90YWJsZS0+aW5mb1t0eF9yYXRlXS5yYXRla2JwcyA8PQorCSAgICByYXRlX3RhYmxlLT5pbmZvW3JhdGVfY3RybC0+cmF0ZV9tYXhfcGh5XS5yYXRla2JwcykgewogCQlhdGhfcmNfZ2V0X25leHRsb3dlcnZhbGlkX3R4cmF0ZShyYXRlX3RhYmxlLCByYXRlX2N0cmwsCi0JCQkJKHU4KSB0eF9yYXRlLCAmcmF0ZV9jdHJsLT5yYXRlX21heF9waHkpOworCQkJCSAodTgpIHR4X3JhdGUsICZyYXRlX2N0cmwtPnJhdGVfbWF4X3BoeSk7CiAKIAkJLyogRG9uJ3QgcHJvYmUgZm9yIGEgbGl0dGxlIHdoaWxlLiAqLwogCQlyYXRlX2N0cmwtPnByb2JlX3RpbWUgPSBub3dfbXNlYzsKQEAgLTE0NjAsNDMgKzE0NjAsNDMgQEAKIAkJCQlicmVhazsKIAogCQkJaWYgKHJhdGVfY3RybC0+c3RhdGVbcmF0ZV0ucnNzaV90aHJlcyArCi0JCQkJcmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5yc3NpX2Fja19kZWx0YW1pbiA+Ci0JCQkJCXJhdGVfY3RybC0+c3RhdGVbcmF0ZSsxXS5yc3NpX3RocmVzKSB7CisJCQkgICAgcmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5yc3NpX2Fja19kZWx0YW1pbiA+CisJCQkgICAgcmF0ZV9jdHJsLT5zdGF0ZVtyYXRlKzFdLnJzc2lfdGhyZXMpIHsKIAkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGUrMV0ucnNzaV90aHJlcyA9CiAJCQkJCXJhdGVfY3RybC0+c3RhdGVbcmF0ZV0uCi0JCQkJCQlyc3NpX3RocmVzICsKKwkJCQkJcnNzaV90aHJlcyArCiAJCQkJCXJhdGVfdGFibGUtPmluZm9bcmF0ZV0uCi0JCQkJCQlyc3NpX2Fja19kZWx0YW1pbjsKKwkJCQkJcnNzaV9hY2tfZGVsdGFtaW47CiAJCQl9CiAJCX0KIAogCQkvKiBNYWtlIHN1cmUgdGhlIHJhdGVzIGJlbG93IHRoaXMgaGF2ZSBsb3dlciByc3NpIHRocmVzaG9sZHMuICovCiAJCWZvciAocmF0ZSA9IHR4X3JhdGUgLSAxOyByYXRlID49IDA7IHJhdGUtLSkgewogCQkJaWYgKHJhdGVfdGFibGUtPmluZm9bcmF0ZV0ucGh5ICE9Ci0JCQkJcmF0ZV90YWJsZS0+aW5mb1t0eF9yYXRlXS5waHkpCisJCQkgICAgcmF0ZV90YWJsZS0+aW5mb1t0eF9yYXRlXS5waHkpCiAJCQkJYnJlYWs7CiAKIAkJCWlmIChyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnJzc2lfdGhyZXMgKwotCQkJCXJhdGVfdGFibGUtPmluZm9bcmF0ZV0ucnNzaV9hY2tfZGVsdGFtaW4gPgotCQkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGUrMV0ucnNzaV90aHJlcykgeworCQkJICAgIHJhdGVfdGFibGUtPmluZm9bcmF0ZV0ucnNzaV9hY2tfZGVsdGFtaW4gPgorCQkJICAgIHJhdGVfY3RybC0+c3RhdGVbcmF0ZSsxXS5yc3NpX3RocmVzKSB7CiAJCQkJaWYgKHJhdGVfY3RybC0+c3RhdGVbcmF0ZSsxXS5yc3NpX3RocmVzIDwKLQkJCQkJcmF0ZV90YWJsZS0+aW5mb1tyYXRlXS4KLQkJCQkJcnNzaV9hY2tfZGVsdGFtaW4pCisJCQkJICAgIHJhdGVfdGFibGUtPmluZm9bcmF0ZV0uCisJCQkJICAgIHJzc2lfYWNrX2RlbHRhbWluKQogCQkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnJzc2lfdGhyZXMgPSAwOwogCQkJCWVsc2UgewogCQkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnJzc2lfdGhyZXMgPQogCQkJCQkJcmF0ZV9jdHJsLT5zdGF0ZVtyYXRlKzFdLgotCQkJCQkJCXJzc2lfdGhyZXMgLQotCQkJCQkJCXJhdGVfdGFibGUtPmluZm9bcmF0ZV0uCi0JCQkJCQkJcnNzaV9hY2tfZGVsdGFtaW47CisJCQkJCQlyc3NpX3RocmVzIC0KKwkJCQkJCXJhdGVfdGFibGUtPmluZm9bcmF0ZV0uCisJCQkJCQlyc3NpX2Fja19kZWx0YW1pbjsKIAkJCQl9CiAKIAkJCQlpZiAocmF0ZV9jdHJsLT5zdGF0ZVtyYXRlXS5yc3NpX3RocmVzIDwKLQkJCQkJcmF0ZV90YWJsZS0+aW5mb1tyYXRlXS4KLQkJCQkJCXJzc2lfYWNrX3ZhbGlkbWluKSB7CisJCQkJICAgIHJhdGVfdGFibGUtPmluZm9bcmF0ZV0uCisJCQkJICAgIHJzc2lfYWNrX3ZhbGlkbWluKSB7CiAJCQkJCXJhdGVfY3RybC0+c3RhdGVbcmF0ZV0ucnNzaV90aHJlcyA9CiAJCQkJCQlyYXRlX3RhYmxlLT5pbmZvW3JhdGVdLgotCQkJCQkJCXJzc2lfYWNrX3ZhbGlkbWluOworCQkJCQkJcnNzaV9hY2tfdmFsaWRtaW47CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNTA3LDExICsxNTA3LDExIEBACiAJaWYgKHJhdGVfY3RybC0+c3RhdGVbdHhfcmF0ZV0ucGVyIDwgbGFzdF9wZXIpIHsKIAkJZm9yIChyYXRlID0gdHhfcmF0ZSAtIDE7IHJhdGUgPj0gMDsgcmF0ZS0tKSB7CiAJCQlpZiAocmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5waHkgIT0KLQkJCQlyYXRlX3RhYmxlLT5pbmZvW3R4X3JhdGVdLnBoeSkKKwkJCSAgICByYXRlX3RhYmxlLT5pbmZvW3R4X3JhdGVdLnBoeSkKIAkJCQlicmVhazsKIAogCQkJaWYgKHJhdGVfY3RybC0+c3RhdGVbcmF0ZV0ucGVyID4KLQkJCQkJcmF0ZV9jdHJsLT5zdGF0ZVtyYXRlKzFdLnBlcikgeworCQkJICAgIHJhdGVfY3RybC0+c3RhdGVbcmF0ZSsxXS5wZXIpIHsKIAkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnBlciA9CiAJCQkJCXJhdGVfY3RybC0+c3RhdGVbcmF0ZSsxXS5wZXI7CiAJCQl9CkBAIC0xNTI4LDExICsxNTI4LDExIEBACiAJLyogRXZlcnkgc28gb2Z0ZW4sIHdlIHJlZHVjZSB0aGUgdGhyZXNob2xkcyBhbmQKIAkgKiBQRVIgKGRpZmZlcmVudCBmb3IgQ0NLIGFuZCBPRkRNKS4gKi8KIAlpZiAobm93X21zZWMgLSByYXRlX2N0cmwtPnJzc2lfZG93bl90aW1lID49Ci0JCXJhdGVfdGFibGUtPnJzc2lfcmVkdWNlX2ludGVydmFsKSB7CisJICAgIHJhdGVfdGFibGUtPnJzc2lfcmVkdWNlX2ludGVydmFsKSB7CiAKIAkJZm9yIChyYXRlID0gMDsgcmF0ZSA8IHJhdGVfY3RybC0+cmF0ZV90YWJsZV9zaXplOyByYXRlKyspIHsKIAkJCWlmIChyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnJzc2lfdGhyZXMgPgotCQkJCXJhdGVfdGFibGUtPmluZm9bcmF0ZV0ucnNzaV9hY2tfdmFsaWRtaW4pCisJCQkgICAgcmF0ZV90YWJsZS0+aW5mb1tyYXRlXS5yc3NpX2Fja192YWxpZG1pbikKIAkJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnJzc2lfdGhyZXMgLT0gMTsKIAkJfQogCQlyYXRlX2N0cmwtPnJzc2lfZG93bl90aW1lID0gbm93X21zZWM7CkBAIC0xNTQxLDcgKzE1NDEsNyBAQAogCS8qIEV2ZXJ5IHNvIG9mdGVuLCB3ZSByZWR1Y2UgdGhlIHRocmVzaG9sZHMKIAkgKiBhbmQgUEVSIChkaWZmZXJlbnQgZm9yIENDSyBhbmQgT0ZETSkuICovCiAJaWYgKG5vd19tc2VjIC0gcmF0ZV9jdHJsLT5wZXJfZG93bl90aW1lID49Ci0JCXJhdGVfdGFibGUtPnJzc2lfcmVkdWNlX2ludGVydmFsKSB7CisJICAgIHJhdGVfdGFibGUtPnJzc2lfcmVkdWNlX2ludGVydmFsKSB7CiAJCWZvciAocmF0ZSA9IDA7IHJhdGUgPCByYXRlX2N0cmwtPnJhdGVfdGFibGVfc2l6ZTsgcmF0ZSsrKSB7CiAJCQlyYXRlX2N0cmwtPnN0YXRlW3JhdGVdLnBlciA9CiAJCQkJNyAqIHJhdGVfY3RybC0+c3RhdGVbcmF0ZV0ucGVyIC8gODsKQEAgLTE1NjAsNyArMTU2MCw3IEBACiAJCQkgIHN0cnVjdCBhdGhfdHhfaW5mb19wcml2ICppbmZvX3ByaXYsIGludCBmaW5hbF90c19pZHgsCiAJCQkgIGludCB4cmV0cmllcywgaW50IGxvbmdfcmV0cnkpCiB7Ci0Jc3RydWN0IGF0aF9yYXRlX3NvZnRjICAqYXNjID0gKHN0cnVjdCBhdGhfcmF0ZV9zb2Z0YyAqKXNjLT5zY19yYzsKKwlzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgKmFzYyA9IChzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgKilzYy0+c2NfcmM7CiAJc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlOwogCXN0cnVjdCBhdGhfdHhfcmF0ZWN0cmwgKnJhdGVfY3RybDsKIAlzdHJ1Y3QgYXRoX3JjX3NlcmllcyByY3NbNF07CkBAIC0xNjM3LDcgKzE2MzcsNiBAQAogCQl4cmV0cmllcywgbG9uZ19yZXRyeSk7CiB9CiAKLQogLyoKICAqIFByb2Nlc3MgYSB0eCBkZXNjcmlwdG9yIGZvciBhIGNvbXBsZXRlZCB0cmFuc21pdCAoc3VjY2VzcyBvciBmYWlsdXJlKS4KICAqLwpAQCAtMTY1MSwxMyArMTY1MCwxMyBAQAogCXN0cnVjdCBhdGhfdmFwICphdnA7CiAKIAlhdnAgPSByY19wcml2LT5hdnA7Ci0JaWYgKChhdnAtPmF2X2NvbmZpZy5hdl9maXhlZF9yYXRlc2V0ICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpCi0JCQl8fCBpbmZvX3ByaXYtPnR4LnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX0ZJTFQpCisJaWYgKChhdnAtPmF2X2NvbmZpZy5hdl9maXhlZF9yYXRlc2V0ICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHx8CisJICAgIChpbmZvX3ByaXYtPnR4LnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX0ZJTFQpKQogCQlyZXR1cm47CiAKIAlpZiAoaW5mb19wcml2LT50eC50c19yc3NpID4gMCkgewogCQlBVEhfUlNTSV9MUEYoYW4tPmFuX2NoYWlubWFza19zZWwudHhfYXZncnNzaSwKLQkJCQlpbmZvX3ByaXYtPnR4LnRzX3Jzc2kpOworCQkJICAgICBpbmZvX3ByaXYtPnR4LnRzX3Jzc2kpOwogCX0KIAogCS8qCkBAIC0xNjgyLDcgKzE2ODEsNiBAQAogCQkgICAgICBpbmZvX3ByaXYtPnR4LnRzX2xvbmdyZXRyeSk7CiB9CiAKLQogLyoKICAqICBVcGRhdGUgdGhlIFNJQidzIHJhdGUgY29udHJvbCBpbmZvcm1hdGlvbgogICoKQEAgLTE3MDEsOCArMTY5OSw4IEBACiAJc3RydWN0IGF0aF9yYXRlX3NvZnRjICphc2MgPSAoc3RydWN0IGF0aF9yYXRlX3NvZnRjICopc2MtPnNjX3JjOwogCXN0cnVjdCBhdGhfcmF0ZXNldCAqcmF0ZXNldCA9IG5lZ290aWF0ZWRfcmF0ZXM7CiAJdTggKmh0X21jcyA9ICh1OCAqKW5lZ290aWF0ZWRfaHRyYXRlczsKLQlzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsICpyYXRlX2N0cmwgID0gKHN0cnVjdCBhdGhfdHhfcmF0ZWN0cmwgKikKLQkJKGF0aF9yY19wcml2KTsKKwlzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsICpyYXRlX2N0cmwgPQorCQkoc3RydWN0IGF0aF90eF9yYXRlY3RybCAqKWF0aF9yY19wcml2OwogCXU4IGksIGosIGssIGhpID0gMCwgaHRoaSA9IDA7CiAKIAlyYXRlX3RhYmxlID0gKHN0cnVjdCBhdGhfcmF0ZV90YWJsZSAqKQpAQCAtMTgxNSwxOSArMTgxMywxOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGF0aF9zZXR1cF9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IHN0YV9pbmZvICpzdGEpCitzdGF0aWMgdm9pZCBhdGhfc2V0dXBfcmF0ZXMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICBzdHJ1Y3QgYXRoX3JhdGVfbm9kZSAqcmNfcHJpdikKIAogewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbG9jYWxfdG9faHcobG9jYWwpOwotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF9yYXRlX25vZGUgKnJjX3ByaXYgPSBzdGEtPnJhdGVfY3RybF9wcml2OwogCWludCBpLCBqID0gMDsKIAotCURQUklOVEYoc2MsIEFUSF9EQkdfUkFURSwgIiVzIiwgX19mdW5jX18pOwotCXNiYW5kID0gIGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07CisJRFBSSU5URihzYywgQVRIX0RCR19SQVRFLCAiJXNcbiIsIF9fZnVuY19fKTsKKwogCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9iaXRyYXRlczsgaSsrKSB7Ci0JCWlmIChzdGEtPnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gJiBCSVQoaSkpIHsKKwkJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0gJiBCSVQoaSkpIHsKIAkJCXJjX3ByaXYtPm5lZ19yYXRlcy5yc19yYXRlc1tqXQogCQkJCT0gKHNiYW5kLT5iaXRyYXRlc1tpXS5iaXRyYXRlICogMikgLyAxMDsKIAkJCWorKzsKQEAgLTE4NTQsMTkgKzE4NTEsMTcgQEAKIH0KIAogLyogUmF0ZSBDb250cm9sIGNhbGxiYWNrcyAqLwotc3RhdGljIHZvaWQgYXRoX3R4X3N0YXR1cyh2b2lkICpwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgYXRoX3R4X3N0YXR1cyh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCiAJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBwcml2OwogCXN0cnVjdCBhdGhfdHhfaW5mb19wcml2ICp0eF9pbmZvX3ByaXY7CiAJc3RydWN0IGF0aF9ub2RlICphbjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlfX2xlMTYgZmM7CiAKLQlsb2NhbCA9IGh3X3RvX2xvY2FsKHNjLT5odyk7CiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCXR4X2luZm9fcHJpdiA9IChzdHJ1Y3QgYXRoX3R4X2luZm9fcHJpdiAqKXR4X2luZm8tPmRyaXZlcl9kYXRhWzBdOwpAQCAtMTg3NSw4ICsxODcwLDcgQEAKIAlhbiA9IGF0aF9ub2RlX2ZpbmQoc2MsIGhkci0+YWRkcjEpOwogCXNwaW5fdW5sb2NrX2JoKCZzYy0+bm9kZV9sb2NrKTsKIAotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgaGRyLT5hZGRyMSk7Ci0JaWYgKCFhbiB8fCAhc3RhIHx8ICFpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKKwlpZiAoIWFuIHx8ICFwcml2X3N0YSB8fCAhaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CiAJCWlmICh0eF9pbmZvLT5kcml2ZXJfZGF0YVswXSAhPSBOVUxMKSB7CiAJCQlrZnJlZSh0eF9pbmZvLT5kcml2ZXJfZGF0YVswXSk7CiAJCQl0eF9pbmZvLT5kcml2ZXJfZGF0YVswXSA9IE5VTEw7CkBAIC0xODg0LDM3ICsxODc4LDQwIEBACiAJCXJldHVybjsKIAl9CiAJaWYgKHR4X2luZm8tPmRyaXZlcl9kYXRhWzBdICE9IE5VTEwpIHsKLQkJYXRoX3JhdGVfdHhfY29tcGxldGUoc2MsIGFuLCBzdGEtPnJhdGVfY3RybF9wcml2LCB0eF9pbmZvX3ByaXYpOworCQlhdGhfcmF0ZV90eF9jb21wbGV0ZShzYywgYW4sIHByaXZfc3RhLCB0eF9pbmZvX3ByaXYpOwogCQlrZnJlZSh0eF9pbmZvLT5kcml2ZXJfZGF0YVswXSk7CiAJCXR4X2luZm8tPmRyaXZlcl9kYXRhWzBdID0gTlVMTDsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF90eF9hZ2dyX3Jlc3Aoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCSAgICAgc3RydWN0IGF0aF9ub2RlICphbiwKIAkJCSAgICAgdTggdGlkbm8pCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGF0aF9hdHhfdGlkICp0eHRpZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAl1MTYgYnVmZmVyc2l6ZSA9IDA7CiAJaW50IHN0YXRlOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCXN0cnVjdCBzdGFfaW5mbyAqc2k7CiAKLQlpZiAoIXNjLT5zY190eGFnZ3IpCisJaWYgKCEoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSkKIAkJcmV0dXJuOwogCiAJdHh0aWQgPSBBVEhfQU5fMl9USUQoYW4sIHRpZG5vKTsKIAlpZiAoIXR4dGlkLT5wYXVzZWQpCiAJCXJldHVybjsKIAotCWxvY2FsID0gaHdfdG9fbG9jYWwoc2MtPmh3KTsKLQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbaHctPmNvbmYuY2hhbm5lbC0+YmFuZF07CisJLyoKKwkgKiBYWFg6IFRoaXMgaXMgZW50aXJlbHkgYnVzdGVkLCB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8KKwkgKglhY2Nlc3MgdGhlIHN0YSBmcm9tIGhlcmUgYmVjYXVzZSBpdCdzIGludGVybmFsCisJICoJdG8gbWFjODAyMTEsIGFuZCBsb29raW5nIGF0IHRoZSBzdGF0ZSB3aXRob3V0CisJICoJbG9ja2luZyBpcyB3cm9uZyB0b28uCisJICovCisJc2kgPSBjb250YWluZXJfb2Yoc3RhLCBzdHJ1Y3Qgc3RhX2luZm8sIHN0YSk7CiAJYnVmZmVyc2l6ZSA9IElFRUU4MDIxMV9NSU5fQU1QRFVfQlVGIDw8CiAJCXNiYW5kLT5odF9pbmZvLmFtcGR1X2ZhY3RvcjsgLyogRklYTUUgKi8KLQlzdGF0ZSA9IHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkbm9dOworCXN0YXRlID0gc2ktPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZG5vXTsKIAogCWlmIChzdGF0ZSAmIEhUX0FEREJBX1JFQ0VJVkVEX01TSykgewogCQl0eHRpZC0+YWRkYmFfZXhjaGFuZ2Vjb21wbGV0ZSA9IDE7CkBAIC0xOTMwLDIxICsxOTI3LDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGhfZ2V0X3JhdGUodm9pZCAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAqc2VsKQorc3RhdGljIHZvaWQgYXRoX2dldF9yYXRlKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAorCQkJIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAqc2VsKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IChzdHJ1Y3QgYXRoX3NvZnRjICopcHJpdjsKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IHByaXY7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IGF0aF90eF9pbmZvX3ByaXYgKnR4X2luZm9fcHJpdjsKLQlzdHJ1Y3QgYXRoX3JhdGVfbm9kZSAqYXRoX3JjX3ByaXY7CisJc3RydWN0IGF0aF9yYXRlX25vZGUgKmF0aF9yY19wcml2ID0gcHJpdl9zdGE7CiAJc3RydWN0IGF0aF9ub2RlICphbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0JaW50IGlzX3Byb2JlLCBjaGssIHJldDsKKwlpbnQgaXNfcHJvYmUgPSBGQUxTRSwgY2hrLCByZXQ7CiAJczggbG93ZXN0X2lkeDsKIAlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CiAJdTggKnFjLCB0aWQ7CkBAIC0xOTU3LDE4ICsxOTUxLDE1IEBACiAJQVNTRVJUKHR4X2luZm8tPmRyaXZlcl9kYXRhWzBdICE9IE5VTEwpOwogCXR4X2luZm9fcHJpdiA9IChzdHJ1Y3QgYXRoX3R4X2luZm9fcHJpdiAqKXR4X2luZm8tPmRyaXZlcl9kYXRhWzBdOwogCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQlsb3dlc3RfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgobG9jYWwsIHNiYW5kLCBzdGEpOworCWxvd2VzdF9pZHggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKIAl0eF9pbmZvX3ByaXYtPm1pbl9yYXRlID0gKHNiYW5kLT5iaXRyYXRlc1tsb3dlc3RfaWR4XS5iaXRyYXRlICogMikgLyAxMDsKIAkvKiBsb3dlc3QgcmF0ZSBmb3IgbWFuYWdlbWVudCBhbmQgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZXMgKi8KIAlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSB8fAotCQkJaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwgIXN0YSkgeworCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fCAhc3RhKSB7CiAJCXNlbC0+cmF0ZV9pZHggPSBsb3dlc3RfaWR4OwogCQlyZXR1cm47CiAJfQogCi0JYXRoX3JjX3ByaXYgPSBzdGEtPnJhdGVfY3RybF9wcml2OwotCiAJLyogRmluZCB0eCByYXRlIGZvciB1bmljYXN0IGZyYW1lcyAqLwogCWF0aF9yYXRlX2ZpbmRyYXRlKHNjLCBhdGhfcmNfcHJpdiwKIAkJCSAgQVRIXzExTl9UWE1BWFRSWSwgNCwKQEAgLTE5NzcsOCArMTk2OCw3IEBACiAJCQkgICZpc19wcm9iZSwKIAkJCSAgZmFsc2UpOwogCWlmIChpc19wcm9iZSkKLQkJc2VsLT5wcm9iZV9pZHggPSAoKHN0cnVjdCBhdGhfdHhfcmF0ZWN0cmwgKikKLQkJCXN0YS0+cmF0ZV9jdHJsX3ByaXYpLT5wcm9iZV9yYXRlOworCQlzZWwtPnByb2JlX2lkeCA9IGF0aF9yY19wcml2LT50eF9yYXRlY3RybC5wcm9iZV9yYXRlOwogCiAJLyogUmF0ZWNvbnRyb2wgc29tZXRpbWVzIHJldHVybnMgaW52YWxpZCByYXRlIGluZGV4ICovCiAJaWYgKHR4X2luZm9fcHJpdi0+cmNzWzBdLnJpeCAhPSAweGZmKQpAQCAtMjAyMiwzOCArMjAxMiwzMSBAQAogCQkJCQkJX19mdW5jX18sCiAJCQkJCQlwcmludF9tYWMobWFjLCBoZHItPmFkZHIxKSk7CiAJCQl9IGVsc2UgaWYgKGNoayA9PSBBR0dSX0VYQ0hBTkdFX1BST0dSRVNTKQotCQkJCWF0aF90eF9hZ2dyX3Jlc3Aoc2MsIHN0YSwgYW4sIHRpZCk7CisJCQkJYXRoX3R4X2FnZ3JfcmVzcChzYywgc2JhbmQsIHN0YSwgYW4sIHRpZCk7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0aF9yYXRlX2luaXQodm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3N0YXRpYyB2b2lkIGF0aF9yYXRlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbG9jYWxfdG9faHcobG9jYWwpOwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZsb2NhbC0+aHcuY29uZjsKLQlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gcHJpdjsKKwlzdHJ1Y3QgYXRoX3JhdGVfbm9kZSAqYXRoX3JjX3ByaXYgPSBwcml2X3N0YTsKIAlpbnQgaSwgaiA9IDA7CiAKIAlEUFJJTlRGKHNjLCBBVEhfREJHX1JBVEUsICIlc1xuIiwgX19mdW5jX18pOwogCi0Jc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdOwotCXN0YS0+dHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KGxvY2FsLCBzYmFuZCwgc3RhKTsKLQotCWF0aF9zZXR1cF9yYXRlcyhsb2NhbCwgc3RhKTsKLQlpZiAoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9TVVBQT1JUX0hUX01PREUpIHsKKwlhdGhfc2V0dXBfcmF0ZXMoc2MsIHNiYW5kLCBzdGEsIGF0aF9yY19wcml2KTsKKwlpZiAoc2MtPmh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfU1VQUE9SVF9IVF9NT0RFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBNQ1NfU0VUX1NJWkU7IGkrKykgewotCQkJaWYgKGNvbmYtPmh0X2NvbmYuc3VwcF9tY3Nfc2V0W2kvOF0gJiAoMTw8KGklOCkpKQotCQkJCSgoc3RydWN0IGF0aF9yYXRlX25vZGUgKikKLQkJCQlwcml2X3N0YSktPm5lZ19odF9yYXRlcy5yc19yYXRlc1tqKytdID0gaTsKKwkJCWlmIChzYy0+aHctPmNvbmYuaHRfY29uZi5zdXBwX21jc19zZXRbaS84XSAmICgxPDwoaSU4KSkpCisJCQkJYXRoX3JjX3ByaXYtPm5lZ19odF9yYXRlcy5yc19yYXRlc1tqKytdID0gaTsKIAkJCWlmIChqID09IEFUSF9SQVRFX01BWCkKIAkJCQlicmVhazsKIAkJfQotCQkoKHN0cnVjdCBhdGhfcmF0ZV9ub2RlICopcHJpdl9zdGEpLT5uZWdfaHRfcmF0ZXMucnNfbnJhdGVzID0gajsKKwkJYXRoX3JjX3ByaXYtPm5lZ19odF9yYXRlcy5yc19ucmF0ZXMgPSBqOwogCX0KLQlhdGhfcmNfbm9kZV91cGRhdGUoaHcsIHByaXZfc3RhKTsKKwlhdGhfcmNfbm9kZV91cGRhdGUoc2MtPmh3LCBwcml2X3N0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF9yYXRlX2NsZWFyKHZvaWQgKnByaXYpCkBAIC0yMDYxLDEzICsyMDQ0LDEyIEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCAqYXRoX3JhdGVfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCitzdGF0aWMgdm9pZCAqYXRoX3JhdGVfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXIpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBsb2NhbF90b19odyhsb2NhbCk7CiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKIAotCURQUklOVEYoc2MsIEFUSF9EQkdfUkFURSwgIiVzIiwgX19mdW5jX18pOwotCXJldHVybiBsb2NhbC0+aHcucHJpdjsKKwlEUFJJTlRGKHNjLCBBVEhfREJHX1JBVEUsICIlc1xuIiwgX19mdW5jX18pOworCXJldHVybiBody0+cHJpdjsKIH0KIAogc3RhdGljIHZvaWQgYXRoX3JhdGVfZnJlZSh2b2lkICpwcml2KQpAQCAtMjA3NSwyNCArMjA1NywyOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgKmF0aF9yYXRlX2FsbG9jX3N0YSh2b2lkICpwcml2LCBnZnBfdCBnZnApCitzdGF0aWMgdm9pZCAqYXRoX3JhdGVfYWxsb2Nfc3RhKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IHByaXY7CiAJc3RydWN0IGF0aF92YXAgKmF2cCA9IHNjLT5zY192YXBzWzBdOwogCXN0cnVjdCBhdGhfcmF0ZV9ub2RlICpyYXRlX3ByaXY7CiAKLQlEUFJJTlRGKHNjLCBBVEhfREJHX1JBVEUsICIlcyIsIF9fZnVuY19fKTsKKwlEUFJJTlRGKHNjLCBBVEhfREJHX1JBVEUsICIlc1xuIiwgX19mdW5jX18pOworCiAJcmF0ZV9wcml2ID0gYXRoX3JhdGVfbm9kZV9hbGxvYyhhdnAsIHNjLT5zY19yYywgZ2ZwKTsKIAlpZiAoIXJhdGVfcHJpdikgewotCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLCAiJXM6VW5hYmxlIHRvIGFsbG9jYXRlIgotCQkJCSJwcml2YXRlIHJhdGUgY29udHJvbCBzdHJ1Y3R1cmUiLCBfX2Z1bmNfXyk7CisJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCisJCQkiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIHJjIHN0cnVjdHVyZVxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWF0aF9yY19zaWJfaW5pdChyYXRlX3ByaXYpOworCiAJcmV0dXJuIHJhdGVfcHJpdjsKIH0KIAotc3RhdGljIHZvaWQgYXRoX3JhdGVfZnJlZV9zdGEodm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCitzdGF0aWMgdm9pZCBhdGhfcmF0ZV9mcmVlX3N0YSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgICAgdm9pZCAqcHJpdl9zdGEpCiB7CiAJc3RydWN0IGF0aF9yYXRlX25vZGUgKnJhdGVfcHJpdiA9IHByaXZfc3RhOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gcHJpdjsKQEAgLTIxMTEsNyArMjA5Nyw3IEBACiAJLmFsbG9jID0gYXRoX3JhdGVfYWxsb2MsCiAJLmZyZWUgPSBhdGhfcmF0ZV9mcmVlLAogCS5hbGxvY19zdGEgPSBhdGhfcmF0ZV9hbGxvY19zdGEsCi0JLmZyZWVfc3RhID0gYXRoX3JhdGVfZnJlZV9zdGEKKwkuZnJlZV9zdGEgPSBhdGhfcmF0ZV9mcmVlX3N0YSwKIH07CiAKIGludCBhdGhfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvcmMuaAppbmRleCA3MWFlZjljLi5iOTViNDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JjLmgKQEAgLTcxLDkgKzcxLDYgQEAKICAqLwogI2RlZmluZSBJRUVFODAyMTFfUkFURV9JRFhfRU5UUlkodmFsLCBpZHgpICgoKHZhbCYoMHhmZjw8KGlkeCo4KSkpPj4oaWR4KjgpKSkKIAotI2RlZmluZSBTSE9SVF9QUkUgMQotI2RlZmluZSBMT05HX1BSRSAwCi0KICNkZWZpbmUgV0xBTl9QSFlfSFRfMjBfU1MgICAgICAgV0xBTl9SQ19QSFlfSFRfMjBfU1MKICNkZWZpbmUgV0xBTl9QSFlfSFRfMjBfRFMgICAgICAgV0xBTl9SQ19QSFlfSFRfMjBfRFMKICNkZWZpbmUgV0xBTl9QSFlfSFRfMjBfRFNfSEdJICAgV0xBTl9SQ19QSFlfSFRfMjBfRFNfSEdJCkBAIC0xMDIsMTggKzk5LDE4IEBACiAJV0xBTl9SQ19QSFlfTUFYCiB9OwogCi0jZGVmaW5lIFdMQU5fUkNfUEhZX0RTKF9waHkpICAgKChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTKSAgICAgICAgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTKSAgICAgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSkgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSkpCi0jZGVmaW5lIFdMQU5fUkNfUEhZXzQwKF9waHkpICAgKChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX1NTKSAgICAgICAgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTKSAgICAgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX1NTX0hHSSkgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTX0hHSSkpCisjZGVmaW5lIFdMQU5fUkNfUEhZX0RTKF9waHkpICAgKChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTKQkJXAorCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzQwX0RTKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfMjBfRFNfSEdJKQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfRFNfSEdJKSkKKyNkZWZpbmUgV0xBTl9SQ19QSFlfNDAoX3BoeSkgICAoKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfU1MpCQlcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfRFMpCVwKKwkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9TU19IR0kpCVwKKwkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9EU19IR0kpKQogI2RlZmluZSBXTEFOX1JDX1BIWV9TR0koX3BoeSkgICgoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF8yMF9TU19IR0kpICAgICAgXAotCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSkgICBcCi0JfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfU1NfSEdJKSAgIFwKLQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9EU19IR0kpKQorCQkJCXx8IChfcGh5ID09IFdMQU5fUkNfUEhZX0hUXzIwX0RTX0hHSSkgICBcCisJCQkJfHwgKF9waHkgPT0gV0xBTl9SQ19QSFlfSFRfNDBfU1NfSEdJKSAgIFwKKwkJCQl8fCAoX3BoeSA9PSBXTEFOX1JDX1BIWV9IVF80MF9EU19IR0kpKQogCiAjZGVmaW5lIFdMQU5fUkNfUEhZX0hUKF9waHkpICAgIChfcGh5ID49IFdMQU5fUkNfUEhZX0hUXzIwX1NTKQogCkBAIC0xMzUsNTYgKzEzMiw1OSBAQAogI2RlZmluZSBXTEFOX1JDX1NHSV9GTEFHICAgICAgICAoMHgwNCkKICNkZWZpbmUgV0xBTl9SQ19IVF9GTEFHICAgICAgICAgKDB4MDgpCiAKLS8qIEluZGV4IGludG8gdGhlIHJhdGUgdGFibGUgKi8KLSNkZWZpbmUgSU5JVF9SQVRFX01BWF8yMAkyMwotI2RlZmluZSBJTklUX1JBVEVfTUFYXzQwCTQwCi0KICNkZWZpbmUgUkFURV9UQUJMRV9TSVpFCQk2NAogCi0vKiBYWFg6IENvbnZlcnQgdG8ga2RvYyAqLworLyoqCisgKiBzdHJ1Y3QgYXRoX3JhdGVfdGFibGUgLSBSYXRlIENvbnRyb2wgdGFibGUKKyAqIEB2YWxpZDogdmFsaWQgZm9yIHVzZSBpbiByYXRlIGNvbnRyb2wKKyAqIEB2YWxpZF9zaW5nbGVfc3RyZWFtOiB2YWxpZCBmb3IgdXNlIGluIHJhdGUgY29udHJvbCBmb3IKKyAqIAlzaW5nbGUgc3RyZWFtIG9wZXJhdGlvbgorICogQHBoeTogQ0NLL09GRE0KKyAqIEByYXRla2JwczogcmF0ZSBpbiBLYml0cyBwZXIgc2Vjb25kCisgKiBAdXNlcl9yYXRla2JwczogdXNlciByYXRlIGluIEtiaXRzIHBlciBzZWNvbmQKKyAqIEByYXRlY29kZTogcmF0ZSB0aGF0IGdvZXMgaW50byBIVyBkZXNjcmlwdG9ycworICogQHNob3J0X3ByZWFtYmxlOiBNYXNrIGZvciBlbmFibGluZyBzaG9ydCBwcmVhbWJsZSBpbiByYXRlY29kZSBmb3IgQ0NLCisgKiBAZG90MTFyYXRlOiB2YWx1ZSB0aGF0IGdvZXMgaW50byBzdXBwb3J0ZWQKKyAqIAlyYXRlcyBpbmZvIGVsZW1lbnQgb2YgTUxNRQorICogQGN0cmxfcmF0ZTogSW5kZXggb2YgbmV4dCBsb3dlciBiYXNpYyByYXRlLCB1c2VkIGZvciBkdXJhdGlvbiBjb21wdXRhdGlvbgorICogQG1heF80bXNfZnJhbWVsZW46IG1heGltdW0gZnJhbWUgbGVuZ3RoKGJ5dGVzKSBmb3IgdHggZHVyYXRpb24KKyAqIEBwcm9iZV9pbnRlcnZhbDogaW50ZXJ2YWwgZm9yIHJhdGUgY29udHJvbCB0byBwcm9iZSBmb3Igb3RoZXIgcmF0ZXMKKyAqIEByc3NpX3JlZHVjZV9pbnRlcnZhbDogaW50ZXJ2YWwgZm9yIHJhdGUgY29udHJvbCB0byByZWR1Y2UgcnNzaQorICogQGluaXRpYWxfcmF0ZW1heDogaW5pdGlhbCByYXRlbWF4IHZhbHVlIHVzZWQgaW4gYXRoX3JjX3NpYl91cGRhdGUoKQorICovCiBzdHJ1Y3QgYXRoX3JhdGVfdGFibGUgewogCWludCByYXRlX2NudDsKIAlzdHJ1Y3QgewotCQlpbnQgdmFsaWQ7ICAgICAgICAgICAgLyogVmFsaWQgZm9yIHVzZSBpbiByYXRlIGNvbnRyb2wgKi8KLQkJaW50IHZhbGlkX3NpbmdsZV9zdHJlYW07LyogVmFsaWQgZm9yIHVzZSBpbiByYXRlIGNvbnRyb2wKLQkJCQkJZm9yIHNpbmdsZSBzdHJlYW0gb3BlcmF0aW9uICovCi0JCXU4IHBoeTsgICAgICAgICAgICAgIC8qIENDSy9PRkRNL1RVUkJPL1hSICovCi0JCXUzMiByYXRla2JwczsgICAgICAgICAvKiBSYXRlIGluIEtiaXRzIHBlciBzZWNvbmQgKi8KLQkJdTMyIHVzZXJfcmF0ZWticHM7ICAgICAvKiBVc2VyIHJhdGUgaW4gS0JpdHMgcGVyIHNlY29uZCAqLwotCQl1OCByYXRlY29kZTsgICAgICAgICAvKiByYXRlIHRoYXQgZ29lcyBpbnRvCi0JCQkJCWh3IGRlc2NyaXB0b3JzICovCi0JCXU4IHNob3J0X3ByZWFtYmxlOyAgICAvKiBNYXNrIGZvciBlbmFibGluZyBzaG9ydCBwcmVhbWJsZQotCQkJCQkJaW4gcmF0ZSBjb2RlIGZvciBDQ0sgKi8KLQkJdTggZG90MTFyYXRlOyAgICAgICAgLyogVmFsdWUgdGhhdCBnb2VzIGludG8gc3VwcG9ydGVkCi0JCQkJCXJhdGVzIGluZm8gZWxlbWVudCBvZiBNTE1FICovCi0JCXU4IGN0cmxfcmF0ZTsgICAgICAvKiBJbmRleCBvZiBuZXh0IGxvd2VyIGJhc2ljIHJhdGUsCi0JCQkJCXVzZWQgZm9yIGR1cmF0aW9uIGNvbXB1dGF0aW9uICovCi0JCWludDhfdCByc3NpX2Fja192YWxpZG1pbjsgIC8qIFJhdGUgY29udHJvbCByZWxhdGVkICovCi0JCWludDhfdCByc3NpX2Fja19kZWx0YW1pbjsgIC8qIFJhdGUgY29udHJvbCByZWxhdGVkICovCi0JCXU4IGJhc2VfaW5kZXg7ICAgICAgICAvKiBiYXNlIHJhdGUgaW5kZXggKi8KLQkJdTggY3c0MGluZGV4OyAgICAgICAgLyogNDBjYXAgcmF0ZSBpbmRleCAqLwotCQl1OCBzZ2lfaW5kZXg7ICAgICAgICAgLyogc2hvcnRnaSByYXRlIGluZGV4ICovCi0JCXU4IGh0X2luZGV4OyAgICAgICAgICAvKiBzaG9ydGdpIHJhdGUgaW5kZXggKi8KLQkJdTMyIG1heF80bXNfZnJhbWVsZW47ICAgLyogTWF4aW11bSBmcmFtZSBsZW5ndGgoYnl0ZXMpCi0JCQkJCQlmb3IgNG1zIHR4IGR1cmF0aW9uICovCisJCWludCB2YWxpZDsKKwkJaW50IHZhbGlkX3NpbmdsZV9zdHJlYW07CisJCXU4IHBoeTsKKwkJdTMyIHJhdGVrYnBzOworCQl1MzIgdXNlcl9yYXRla2JwczsKKwkJdTggcmF0ZWNvZGU7CisJCXU4IHNob3J0X3ByZWFtYmxlOworCQl1OCBkb3QxMXJhdGU7CisJCXU4IGN0cmxfcmF0ZTsKKwkJaW50OF90IHJzc2lfYWNrX3ZhbGlkbWluOworCQlpbnQ4X3QgcnNzaV9hY2tfZGVsdGFtaW47CisJCXU4IGJhc2VfaW5kZXg7CisJCXU4IGN3NDBpbmRleDsKKwkJdTggc2dpX2luZGV4OworCQl1OCBodF9pbmRleDsKKwkJdTMyIG1heF80bXNfZnJhbWVsZW47CiAJfSBpbmZvW1JBVEVfVEFCTEVfU0laRV07Ci0JdTMyIHByb2JlX2ludGVydmFsOyAgICAgICAgLyogaW50ZXJ2YWwgZm9yIHJhdGVjdHJsIHRvCi0JCQkJCXByb2JlIGZvciBvdGhlciByYXRlcyAqLwotCXUzMiByc3NpX3JlZHVjZV9pbnRlcnZhbDsgICAvKiBpbnRlcnZhbCBmb3IgcmF0ZWN0cmwKLQkJCQkJCXRvIHJlZHVjZSBSU1NJICovCi0JdTggaW5pdGlhbF9yYXRlbWF4OyAgIC8qIHRoZSBpbml0aWFsIHJhdGVtYXggdmFsdWUgdXNlZAotCQkJCQlpbiBhdGhfcmNfc2liX3VwZGF0ZSgpICovCisJdTMyIHByb2JlX2ludGVydmFsOworCXUzMiByc3NpX3JlZHVjZV9pbnRlcnZhbDsKKwl1OCBpbml0aWFsX3JhdGVtYXg7CiB9OwogCiAjZGVmaW5lIEFUSF9SQ19QUk9CRV9BTExPV0VEICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBBVEhfUkNfTUlOUkFURV9MQVNUUkFURSAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQVRIX1JDX1NIT1JUX1BSRUFNQkxFICAgICAgICAgICAweDAwMDAwMDA0CiAKIHN0cnVjdCBhdGhfcmNfc2VyaWVzIHsKLQl1OCAgICByaXg7Ci0JdTggICAgdHJpZXM7Ci0JdTggICAgZmxhZ3M7Ci0JdTMyICAgbWF4XzRtc19mcmFtZWxlbjsKKwl1OCByaXg7CisJdTggdHJpZXM7CisJdTggZmxhZ3M7CisJdTMyIG1heF80bXNfZnJhbWVsZW47CiB9OwogCiAvKiByY3NfZmxhZ3MgZGVmaW5pdGlvbiAqLwpAQCAtMjAxLDQyICsyMDEsNTYgQEAKICNkZWZpbmUgTUFYX1RYX1JBVEVfUEhZICAgICAgICAgNDgKIAogc3RydWN0IGF0aF90eF9yYXRlY3RybF9zdGF0ZSB7Ci0JaW50OF90IHJzc2lfdGhyZXM7IC8qIHJlcXVpcmVkIHJzc2kgZm9yIHRoaXMgcmF0ZSAoZEIpICovCi0JdTggcGVyOyAvKiByZWNlbnQgZXN0aW1hdGUgb2YgcGFja2V0IGVycm9yIHJhdGUgKCUpICovCisJaW50OF90IHJzc2lfdGhyZXM7CS8qIHJlcXVpcmVkIHJzc2kgZm9yIHRoaXMgcmF0ZSAoZEIpICovCisJdTggcGVyOwkJCS8qIHJlY2VudCBlc3RpbWF0ZSBvZiBwYWNrZXQgZXJyb3IgcmF0ZSAoJSkgKi8KIH07CiAKKy8qKgorICogc3RydWN0IGF0aF90eF9yYXRlY3RybCAtIFRYIFJhdGUgY29udHJvbCBJbmZvcm1hdGlvbgorICogQHN0YXRlOiBSQyBzdGF0ZQorICogQHJzc2lfbGFzdDogbGFzdCBBQ0sgcnNzaQorICogQHJzc2lfbGFzdF9sb29rdXA6IGxhc3QgQUNLIHJzc2kgdXNlZCBmb3IgbG9va3VwCisgKiBAcnNzaV9sYXN0X3ByZXY6IHByZXZpb3VzIGxhc3QgQUNLIHJzc2kKKyAqIEByc3NpX2xhc3RfcHJldjI6IDJuZCBwcmV2aW91cyBsYXN0IEFDSyByc3NpCisgKiBAcnNzaV9zdW1fY250OiBjb3VudCBvZiByc3NpX3N1bSBmb3IgYXZlcmFnaW5nCisgKiBAcnNzaV9zdW1fcmF0ZTogcmF0ZSB0aGF0IHdlIGFyZSBhdmVyYWdpbmcKKyAqIEByc3NpX3N1bTogcnVubmluZyBzdW0gb2YgcnNzaSBmb3IgYXZlcmFnaW5nCisgKiBAcHJvYmVfcmF0ZTogcmF0ZSB3ZSBhcmUgcHJvYmluZyBhdAorICogQHJzc2lfdGltZTogbXNlYyB0aW1lc3RhbXAgZm9yIGxhc3QgYWNrIHJzc2kKKyAqIEByc3NpX2Rvd25fdGltZTogbXNlYyB0aW1lc3RhbXAgZm9yIGxhc3QgZG93biBzdGVwCisgKiBAcHJvYmVfdGltZTogbXNlYyB0aW1lc3RhbXAgZm9yIGxhc3QgcHJvYmUKKyAqIEBod19tYXhyZXRyeV9wa3RjbnQ6IG51bSBvZiBwYWNrZXRzIHNpbmNlIHdlIGdvdCBIVyBtYXggcmV0cnkgZXJyb3IKKyAqIEBtYXhfdmFsaWRfcmF0ZTogbWF4aW11bSBudW1iZXIgb2YgdmFsaWQgcmF0ZQorICogQHBlcl9kb3duX3RpbWU6IG1zZWMgdGltZXN0YW1wIGZvciBsYXN0IFBFUiBkb3duIHN0ZXAKKyAqIEB2YWxpZF9waHlfcmF0ZWNudDogdmFsaWQgcmF0ZSBjb3VudAorICogQHJhdGVfbWF4X3BoeTogcGh5IGluZGV4IGZvciB0aGUgbWF4IHJhdGUKKyAqIEBwcm9iZV9pbnRlcnZhbDogaW50ZXJ2YWwgZm9yIHJhdGVjdHJsIHRvIHByb2JlIGZvciBvdGhlciByYXRlcworICovCiBzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsIHsKLQlzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsX3N0YXRlIHN0YXRlW01BWF9UWF9SQVRFX1RCTF07IC8qIHN0YXRlICovCi0JaW50OF90IHJzc2lfbGFzdDsgICAgICAgICAgICAvKiBsYXN0IGFjayByc3NpICovCi0JaW50OF90IHJzc2lfbGFzdF9sb29rdXA7CS8qIGxhc3QgYWNrIHJzc2kgdXNlZCBmb3IgbG9va3VwICovCi0JaW50OF90IHJzc2lfbGFzdF9wcmV2OwkvKiBwcmV2aW91cyBsYXN0IGFjayByc3NpICovCi0JaW50OF90IHJzc2lfbGFzdF9wcmV2MjsJLyogMm5kIHByZXZpb3VzIGxhc3QgYWNrIHJzc2kgKi8KLQlpbnQzMl90IHJzc2lfc3VtX2NudDsgICAgICAgIC8qIGNvdW50IG9mIHJzc2lfc3VtIGZvciBhdmVyYWdpbmcgKi8KLQlpbnQzMl90IHJzc2lfc3VtX3JhdGU7ICAgICAgIC8qIHJhdGUgdGhhdCB3ZSBhcmUgYXZlcmFnaW5nICovCi0JaW50MzJfdCByc3NpX3N1bTsgICAgICAgICAgIC8qIHJ1bm5pbmcgc3VtIG9mIHJzc2kgZm9yIGF2ZXJhZ2luZyAqLwotCXUzMiB2YWxpZF90eHJhdGVfbWFzazsgICAvKiBtYXNrIG9mIHZhbGlkIHJhdGVzICovCi0JdTggcmF0ZV90YWJsZV9zaXplOyAgICAgIC8qIHJhdGUgdGFibGUgc2l6ZSAqLwotCXU4IHJhdGVfbWF4OyAgICAgICAgICAgIC8qIG1heCByYXRlIHRoYXQgaGFzIHJlY2VudGx5IHdvcmtlZCAqLwotCXU4IHByb2JlX3JhdGU7ICAgICAgICAgIC8qIHJhdGUgd2UgYXJlIHByb2JpbmcgYXQgKi8KLQl1MzIgcnNzaV90aW1lOyAgICAgICAgICAvKiBtc2VjIHRpbWVzdGFtcCBmb3IgbGFzdCBhY2sgcnNzaSAqLwotCXUzMiByc3NpX2Rvd25fdGltZTsgICAgICAvKiBtc2VjIHRpbWVzdGFtcCBmb3IgbGFzdCBkb3duIHN0ZXAgKi8KLQl1MzIgcHJvYmVfdGltZTsgICAgICAgICAvKiBtc2VjIHRpbWVzdGFtcCBmb3IgbGFzdCBwcm9iZSAqLwotCXU4IGh3X21heHJldHJ5X3BrdGNudDsgICAvKiBudW0gcGFja2V0cyBzaW5jZSB3ZSBnb3QKLQkJCQkJSFcgbWF4IHJldHJ5IGVycm9yICovCi0JdTggbWF4X3ZhbGlkX3JhdGU7ICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHZhbGlkIHJhdGUgKi8KLQl1OCB2YWxpZF9yYXRlX2luZGV4W01BWF9UWF9SQVRFX1RCTF07IC8qIHZhbGlkIHJhdGUgaW5kZXggKi8KLQl1MzIgcGVyX2Rvd25fdGltZTsgICAgICAgLyogbXNlYyB0aW1zdGFtcCBmb3IgbGFzdAotCQkJCQlQRVIgZG93biBzdGVwICovCisJc3RydWN0IGF0aF90eF9yYXRlY3RybF9zdGF0ZSBzdGF0ZVtNQVhfVFhfUkFURV9UQkxdOworCWludDhfdCByc3NpX2xhc3Q7CisJaW50OF90IHJzc2lfbGFzdF9sb29rdXA7CisJaW50OF90IHJzc2lfbGFzdF9wcmV2OworCWludDhfdCByc3NpX2xhc3RfcHJldjI7CisJaW50MzJfdCByc3NpX3N1bV9jbnQ7CisJaW50MzJfdCByc3NpX3N1bV9yYXRlOworCWludDMyX3QgcnNzaV9zdW07CisJdTggcmF0ZV90YWJsZV9zaXplOworCXU4IHByb2JlX3JhdGU7CisJdTMyIHJzc2lfdGltZTsKKwl1MzIgcnNzaV9kb3duX3RpbWU7CisJdTMyIHByb2JlX3RpbWU7CisJdTggaHdfbWF4cmV0cnlfcGt0Y250OworCXU4IG1heF92YWxpZF9yYXRlOworCXU4IHZhbGlkX3JhdGVfaW5kZXhbTUFYX1RYX1JBVEVfVEJMXTsKKwl1MzIgcGVyX2Rvd25fdGltZTsKIAogCS8qIDExbiBzdGF0ZSAqLwotCXU4ICB2YWxpZF9waHlfcmF0ZWNudFtXTEFOX1JDX1BIWV9NQVhdOyAvKiB2YWxpZCByYXRlIGNvdW50ICovCi0JdTggIHZhbGlkX3BoeV9yYXRlaWR4W1dMQU5fUkNfUEhZX01BWF1bTUFYX1RYX1JBVEVfVEJMXTsKLQl1OCAgcmNfcGh5X21vZGU7Ci0JdTggIHJhdGVfbWF4X3BoeTsgICAgICAgIC8qIFBoeSBpbmRleCBmb3IgdGhlIG1heCByYXRlICovCi0JdTMyIHJhdGVfbWF4X2xhc3R1c2VkOyAgIC8qIG1zZWMgdGltc3RhbXAgb2Ygd2hlbiB3ZQotCQkJCQlsYXN0IHVzZWQgcmF0ZU1heFBoeSAqLwotCXUzMiBwcm9iZV9pbnRlcnZhbDsgICAgIC8qIGludGVydmFsIGZvciByYXRlY3RybCB0byBwcm9iZQotCQkJCQlmb3Igb3RoZXIgcmF0ZXMgKi8KKwl1OCB2YWxpZF9waHlfcmF0ZWNudFtXTEFOX1JDX1BIWV9NQVhdOworCXU4IHZhbGlkX3BoeV9yYXRlaWR4W1dMQU5fUkNfUEhZX01BWF1bTUFYX1RYX1JBVEVfVEJMXTsKKwl1OCByY19waHlfbW9kZTsKKwl1OCByYXRlX21heF9waHk7CisJdTMyIHByb2JlX2ludGVydmFsOwogfTsKIAogc3RydWN0IGF0aF9yYXRlc2V0IHsKQEAgLTI0OCwyOSArMjYyLDMyIEBACiBzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgewogCS8qIHBoeSB0YWJsZXMgdGhhdCBjb250YWluIHJhdGUgY29udHJvbCBkYXRhICovCiAJY29uc3Qgdm9pZCAqaHdfcmF0ZV90YWJsZVtBVEg5S19NT0RFX01BWF07Ci0JaW50IGZpeGVkcml4OwkvKiAtMSBvciBpbmRleCBvZiBmaXhlZCByYXRlICovCisKKwkvKiAtMSBvciBpbmRleCBvZiBmaXhlZCByYXRlICovCisJaW50IGZpeGVkcml4OwogfTsKIAogLyogcGVyLW5vZGUgc3RhdGUgKi8KIHN0cnVjdCBhdGhfcmF0ZV9ub2RlIHsKLQlzdHJ1Y3QgYXRoX3R4X3JhdGVjdHJsIHR4X3JhdGVjdHJsOwkvKiByYXRlIGNvbnRyb2wgc3RhdGUgcHJvcGVyICovCi0JdTMyIHByZXZfZGF0YV9yaXg7CS8qIHJhdGUgaWR4IG9mIGxhc3QgZGF0YSBmcmFtZSAqLworCXN0cnVjdCBhdGhfdHhfcmF0ZWN0cmwgdHhfcmF0ZWN0cmw7CiAKLQkvKiBtYXAgb2YgcmF0ZSBpeCAtPiBuZWdvdGlhdGVkIHJhdGUgc2V0IGl4ICovCi0JdTggcml4bWFwW01BWF9UWF9SQVRFX1RCTF07CisJLyogcmF0ZSBpZHggb2YgbGFzdCBkYXRhIGZyYW1lICovCisJdTMyIHByZXZfZGF0YV9yaXg7CiAKLQkvKiBtYXAgb2YgaHQgcmF0ZSBpeCAtPiBuZWdvdGlhdGVkIHJhdGUgc2V0IGl4ICovCi0JdTggaHRfcml4bWFwW01BWF9UWF9SQVRFX1RCTF07CisJLyogaHQgY2FwYWJpbGl0aWVzICovCisJdTggaHRfY2FwOwogCi0JdTggaHRfY2FwOwkJLyogaHQgY2FwYWJpbGl0aWVzICovCi0JdTggYW50X3R4OwkJLyogY3VycmVudCB0cmFuc21pdCBhbnRlbm5hICovCisJLyogV2hlbiBUUlVFLCBvbmx5IHNpbmdsZSBzdHJlYW0gVHggcG9zc2libGUgKi8KKwl1OCBzaW5nbGVfc3RyZWFtOwogCi0JdTggc2luZ2xlX3N0cmVhbTsgICAvKiBXaGVuIFRSVUUsIG9ubHkgc2luZ2xlCi0JCQkJc3RyZWFtIFR4IHBvc3NpYmxlICovCi0Jc3RydWN0IGF0aF9yYXRlc2V0IG5lZ19yYXRlczsJLyogTmVnb3RpYXRlZCByYXRlcyAqLwotCXN0cnVjdCBhdGhfcmF0ZXNldCBuZWdfaHRfcmF0ZXM7CS8qIE5lZ290aWF0ZWQgSFQgcmF0ZXMgKi8KLQlzdHJ1Y3QgYXRoX3JhdGVfc29mdGMgKmFzYzsgLyogYmFjayBwb2ludGVyIHRvIGF0aGVyb3Mgc29mdGMgKi8KLQlzdHJ1Y3QgYXRoX3ZhcCAqYXZwOwkvKiBiYWNrIHBvaW50ZXIgdG8gdmFwICovCisJLyogTmVnb3RpYXRlZCByYXRlcyAqLworCXN0cnVjdCBhdGhfcmF0ZXNldCBuZWdfcmF0ZXM7CisKKwkvKiBOZWdvdGlhdGVkIEhUIHJhdGVzICovCisJc3RydWN0IGF0aF9yYXRlc2V0IG5lZ19odF9yYXRlczsKKworCXN0cnVjdCBhdGhfcmF0ZV9zb2Z0YyAqYXNjOworCXN0cnVjdCBhdGhfdmFwICphdnA7CiB9OwogCiAvKiBEcml2ZXIgZGF0YSBvZiBpZWVlODAyMTFfdHhfaW5mbyAqLwpAQCAtMjk3LDE3ICszMTQsMTAgQEAKIHZvaWQgYXRoX3JhdGVfbmV3c3RhdGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdmFwICphdnApOwogCiAvKgotICogUmV0dXJuIHRoZSB0eCByYXRlIHNlcmllcy4KLSAqLwotdm9pZCBhdGhfcmF0ZV9maW5kcmF0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9yYXRlX25vZGUgKmF0aF9yY19wcml2LAotCQkgICAgICAgaW50IG51bV90cmllcywgaW50IG51bV9yYXRlcywKLQkJICAgICAgIHVuc2lnbmVkIGludCByY2ZsYWcsIHN0cnVjdCBhdGhfcmNfc2VyaWVzW10sCi0JCSAgICAgICBpbnQgKmlzX3Byb2JlLCBpbnQgaXNyZXRyeSk7Ci0vKgogICogUmV0dXJuIHJhdGUgaW5kZXggZm9yIGdpdmVuIERvdDExIFJhdGUuCiAgKi8KIHU4IGF0aF9yYXRlX2ZpbmRyYXRlaXgoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCQkgICAgIHU4IGRvdDExX3JhdGUpOworCQkgICAgICAgdTggZG90MTFfcmF0ZSk7CiAKIC8qIFJvdXRpbmVzIHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobSAqLwogaW50IGF0aF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yZWN2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yZWN2LmMKaW5kZXggMjBkZGI3YS4uNDk4MzQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvcmVjdi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JlY3YuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCXRpZCA9IHFjWzBdICYgMHhmOwogCX0KIAotCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fU1RBKSB7CisJaWYgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fU1RBKSB7CiAJCS8qIERyb3AgdGhlIGZyYW1lIG5vdCBiZWxvbmdpbmcgdG8gbWUuICovCiAJCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgc2MtPnNjX215YWRkciwgRVRIX0FMRU4pKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC00NDksMTcgKzQ0OSwxNiBAQAogCWludCB0eXBlOwogCiAJLyogaW5kaWNhdGUgZnJhbWUgdG8gdGhlIHN0YWNrLCB3aGljaCB3aWxsIGZyZWUgdGhlIG9sZCBza2IuICovCi0JdHlwZSA9IGF0aF9fcnhfaW5kaWNhdGUoc2MsIHNrYiwgc3RhdHVzLCBrZXlpeCk7CisJdHlwZSA9IF9hdGhfcnhfaW5kaWNhdGUoc2MsIHNrYiwgc3RhdHVzLCBrZXlpeCk7CiAKIAkvKiBhbGxvY2F0ZSBhIG5ldyBza2IgYW5kIHF1ZXVlIGl0IHRvIGZvciBIL1cgcHJvY2Vzc2luZyAqLwogCW5za2IgPSBhdGhfcnhidWZfYWxsb2Moc2MsIHNjLT5zY19yeGJ1ZnNpemUpOwogCWlmIChuc2tiICE9IE5VTEwpIHsKIAkJYmYtPmJmX21wZHUgPSBuc2tiOwotCQliZi0+YmZfYnVmX2FkZHIgPSBhdGhfc2tiX21hcF9zaW5nbGUoc2MsCi0JCQluc2tiLAotCQkJUENJX0RNQV9GUk9NREVWSUNFLAotCQkJLyogWFhYOiBSZW1vdmUgZ2V0X2RtYV9tZW1fY29udGV4dCgpICovCi0JCQlnZXRfZG1hX21lbV9jb250ZXh0KGJmLCBiZl9kbWFjb250ZXh0KSk7CisJCWJmLT5iZl9idWZfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHNjLT5wZGV2LCBuc2tiLT5kYXRhLAorCQkJCQkgc2tiX2VuZF9wb2ludGVyKG5za2IpIC0gbnNrYi0+aGVhZCwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWJmLT5iZl9kbWFjb250ZXh0ID0gYmYtPmJmX2J1Zl9hZGRyOwogCQlBVEhfUlhfQ09OVEVYVChuc2tiKS0+Y3R4X3J4YnVmID0gYmY7CiAKIAkJLyogcXVldWUgdGhlIG5ldyB3YnVmIHRvIEgvVyAqLwpAQCAtNTA1LDcgKzUwNCw3IEBACiAKIAlkbyB7CiAJCXNwaW5fbG9ja19pbml0KCZzYy0+c2NfcnhmbHVzaGxvY2spOwotCQlzYy0+c2NfcnhmbHVzaCA9IDA7CisJCXNjLT5zY19mbGFncyAmPSB+U0NfT1BfUlhGTFVTSDsKIAkJc3Bpbl9sb2NrX2luaXQoJnNjLT5zY19yeGJ1ZmxvY2spOwogCiAJCS8qCkBAIC01NDIsOSArNTQxLDEwIEBACiAJCQl9CiAKIAkJCWJmLT5iZl9tcGR1ID0gc2tiOwotCQkJYmYtPmJmX2J1Zl9hZGRyID0KLQkJCQlhdGhfc2tiX21hcF9zaW5nbGUoc2MsIHNrYiwgUENJX0RNQV9GUk9NREVWSUNFLAotCQkJCSAgICAgICBnZXRfZG1hX21lbV9jb250ZXh0KGJmLCBiZl9kbWFjb250ZXh0KSk7CisJCQliZi0+YmZfYnVmX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShzYy0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJYmYtPmJmX2RtYWNvbnRleHQgPSBiZi0+YmZfYnVmX2FkZHI7CiAJCQlBVEhfUlhfQ09OVEVYVChza2IpLT5jdHhfcnhidWYgPSBiZjsKIAkJfQogCQlzYy0+c2NfcnhsaW5rID0gTlVMTDsKQEAgLTU5OCw2ICs1OTgsNyBAQAogdTMyIGF0aF9jYWxjcnhmaWx0ZXIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAjZGVmaW5lCVJYX0ZJTFRFUl9QUkVTRVJWRSAoQVRIOUtfUlhfRklMVEVSX1BIWUVSUiB8IEFUSDlLX1JYX0ZJTFRFUl9QSFlSQURBUikKKwogCXUzMiByZmlsdDsKIAogCXJmaWx0ID0gKGF0aDlrX2h3X2dldHJ4ZmlsdGVyKHNjLT5zY19haCkgJiBSWF9GSUxURVJfUFJFU0VSVkUpCkBAIC02MDUsMjUgKzYwNiwyOSBAQAogCQl8IEFUSDlLX1JYX0ZJTFRFUl9NQ0FTVDsKIAogCS8qIElmIG5vdCBhIFNUQSwgZW5hYmxlIHByb2Nlc3Npbmcgb2YgUHJvYmUgUmVxdWVzdHMgKi8KLQlpZiAoc2MtPnNjX29wbW9kZSAhPSBBVEg5S19NX1NUQSkKKwlpZiAoc2MtPnNjX2FoLT5haF9vcG1vZGUgIT0gQVRIOUtfTV9TVEEpCiAJCXJmaWx0IHw9IEFUSDlLX1JYX0ZJTFRFUl9QUk9CRVJFUTsKIAogCS8qIENhbid0IHNldCBIT1NUQVAgaW50byBwcm9taXNjb3VzIG1vZGUgKi8KLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX01PTklUT1IpIHsKKwlpZiAoKChzYy0+c2NfYWgtPmFoX29wbW9kZSAhPSBBVEg5S19NX0hPU1RBUCkgJiYKKwkgICAgIChzYy0+cnhfZmlsdGVyICYgRklGX1BST01JU0NfSU5fQlNTKSkgfHwKKwkgICAgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fTU9OSVRPUikpIHsKIAkJcmZpbHQgfD0gQVRIOUtfUlhfRklMVEVSX1BST007CiAJCS8qID8/PyBUbyBwcmV2ZW50IGZyb20gc2VuZGluZyBBQ0sgKi8KIAkJcmZpbHQgJj0gfkFUSDlLX1JYX0ZJTFRFUl9VQ0FTVDsKIAl9CiAKLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX1NUQSB8fCBzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fSUJTUyB8fAotCSAgICBzYy0+c2Nfc2Nhbm5pbmcpCisJaWYgKCgoc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9TVEEpICYmCisJICAgICAoc2MtPnJ4X2ZpbHRlciAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSkgfHwKKwkgICAgKHNjLT5zY19haC0+YWhfb3Btb2RlID09IEFUSDlLX01fSUJTUykpCiAJCXJmaWx0IHw9IEFUSDlLX1JYX0ZJTFRFUl9CRUFDT047CiAKIAkvKiBJZiBpbiBIT1NUQVAgbW9kZSwgd2FudCB0byBlbmFibGUgcmVjZXB0aW9uIG9mIFBTUE9MTCBmcmFtZXMKIAkgICAmIGJlYWNvbiBmcmFtZXMgKi8KLQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX0hPU1RBUCkKKwlpZiAoc2MtPnNjX2FoLT5haF9vcG1vZGUgPT0gQVRIOUtfTV9IT1NUQVApCiAJCXJmaWx0IHw9IChBVEg5S19SWF9GSUxURVJfQkVBQ09OIHwgQVRIOUtfUlhfRklMVEVSX1BTUE9MTCk7CiAJcmV0dXJuIHJmaWx0OworCiAjdW5kZWYgUlhfRklMVEVSX1BSRVNFUlZFCiB9CiAKQEAgLTcwMywxMSArNzA4LDExIEBACiAJICogcHJvZ3Jlc3MgKHNlZSByZWZlcmVuY2VzIHRvIHNjX3J4Zmx1c2gpCiAJICovCiAJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcnhmbHVzaGxvY2spOwotCXNjLT5zY19yeGZsdXNoID0gMTsKKwlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfUlhGTFVTSDsKIAogCWF0aF9yeF90YXNrbGV0KHNjLCAxKTsKIAotCXNjLT5zY19yeGZsdXNoID0gMDsKKwlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX1JYRkxVU0g7CiAJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19yeGZsdXNobG9jayk7CiB9CiAKQEAgLTcyMCw3ICs3MjUsNyBAQAogCQkgc3RydWN0IGF0aF9yZWN2X3N0YXR1cyAqcnhfc3RhdHVzLAogCQkgZW51bSBBVEhfUlhfVFlQRSAqc3RhdHVzKQogewotCWlmIChpc19hbXBkdSAmJiBzYy0+c2NfcnhhZ2dyKSB7CisJaWYgKGlzX2FtcGR1ICYmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9SWEFHR1IpKSB7CiAJCSpzdGF0dXMgPSBBVEhfUlhfQ09OU1VNRUQ7CiAJCXJldHVybiBhdGhfYW1wZHVfaW5wdXQoc2MsIGFuLCBza2IsIHJ4X3N0YXR1cyk7CiAJfSBlbHNlIHsKQEAgLTc1MSw3ICs3NTYsNyBAQAogCiAJZG8gewogCQkvKiBJZiBoYW5kbGluZyByeCBpbnRlcnJ1cHQgYW5kIGZsdXNoIGlzIGluIHByb2dyZXNzID0+IGV4aXQgKi8KLQkJaWYgKHNjLT5zY19yeGZsdXNoICYmIChmbHVzaCA9PSAwKSkKKwkJaWYgKChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9SWEZMVVNIKSAmJiAoZmx1c2ggPT0gMCkpCiAJCQlicmVhazsKIAogCQlzcGluX2xvY2tfYmgoJnNjLT5zY19yeGJ1ZmxvY2spOwpAQCAtODg3LDcgKzg5Miw3IEBACiAKIAkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCQlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQkJbWVtemVybygmcnhfc3RhdHVzLCBzaXplb2Yoc3RydWN0IGF0aF9yZWN2X3N0YXR1cykpOworCQltZW1zZXQoJnJ4X3N0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBhdGhfcmVjdl9zdGF0dXMpKTsKIAogCQlpZiAoZHMtPmRzX3J4c3RhdC5yc19tb3JlKSB7CiAJCQkvKgpAQCAtOTAxLDcgKzkwNiw3IEBACiAJCQkgKiBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0byBzZWUKIAkJCSAqIGVycm9yIGZyYW1lcyBpbiBNb25pdG9yIG1vZGUuCiAJCQkgKi8KLQkJCWlmIChzYy0+c2Nfb3Btb2RlICE9IEFUSDlLX01fTU9OSVRPUikKKwkJCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSAhPSBBVEg5S19NX01PTklUT1IpCiAJCQkJZ290byByeF9uZXh0OwogI2VuZGlmCiAJCQkvKiBmYWxsIHRocnUgZm9yIG1vbml0b3IgbW9kZSBoYW5kbGluZy4uLiAqLwpAQCAtOTQ2LDcgKzk1MSw3IEBACiAJCQkgKiBkZWNyeXB0aW9uIGFuZCBNSUMgZmFpbHVyZXMuIEZvciBtb25pdG9yIG1vZGUsCiAJCQkgKiB3ZSBhbHNvIGlnbm9yZSB0aGUgQ1JDIGVycm9yLgogCQkJICovCi0JCQlpZiAoc2MtPnNjX29wbW9kZSA9PSBBVEg5S19NX01PTklUT1IpIHsKKwkJCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX01PTklUT1IpIHsKIAkJCQlpZiAoZHMtPmRzX3J4c3RhdC5yc19zdGF0dXMgJgogCQkJCSAgICB+KEFUSDlLX1JYRVJSX0RFQ1JZUFQgfCBBVEg5S19SWEVSUl9NSUMgfAogCQkJCQlBVEg5S19SWEVSUl9DUkMpKQpAQCAtOTk0LDIwICs5OTksMTEgQEAKIAkJCQlyeF9zdGF0dXMuZmxhZ3MgfD0gQVRIX1JYX1NIT1JUX0dJOwogCQl9CiAKLQkJLyogc2MtPnNjX25vaXNlX2Zsb29yIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIHN0YXRpb24KKwkJLyogc2Nfbm9pc2VfZmxvb3IgaXMgb25seSBhdmFpbGFibGUgd2hlbiB0aGUgc3RhdGlvbgogCQkgICBhdHRhY2hlcyB0byBhbiBBUCwgc28gd2UgdXNlIGEgZGVmYXVsdCB2YWx1ZQogCQkgICBpZiB3ZSBhcmUgbm90IHlldCBhdHRhY2hlZC4gKi8KLQotCQkvKiBYWFggd2Ugc2hvdWxkIHVzZSBlaXRoZXIgc2MtPnNjX25vaXNlX2Zsb29yIG9yCi0JCSAqIGF0aF9oYWxfZ2V0Q2hhbk5vaXNlKGFoLCAmc2MtPnNjX2N1cmNoYW4pCi0JCSAqIHRvIGNhbGN1bGF0ZSB0aGUgbm9pc2UgZmxvb3IuCi0JCSAqIEhvd2V2ZXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBhdGhfaGFsX2dldENoYW5Ob2lzZQotCQkgKiBzZWVtcyB0byBiZSBpbmNvcnJlY3QgKC0zMWRCbSBvbiB0aGUgbGFzdCB0ZXN0KSwKLQkJICogc28gd2Ugd2lsbCB1c2UgYSBoYXJkLWNvZGVkIHZhbHVlIHVudGlsIHdlCi0JCSAqIGZpZ3VyZSBvdXQgd2hhdCBpcyBnb2luZyBvbi4KLQkJICovCiAJCXJ4X3N0YXR1cy5hYnNfcnNzaSA9Ci0JCQlkcy0+ZHNfcnhzdGF0LnJzX3Jzc2kgKyBBVEhfREVGQVVMVF9OT0lTRV9GTE9PUjsKKwkJCWRzLT5kc19yeHN0YXQucnNfcnNzaSArIHNjLT5zY19hbmkuc2Nfbm9pc2VfZmxvb3I7CiAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNjLT5wZGV2LAogCQkJCQkgICAgYmYtPmJmX2J1Zl9hZGRyLApAQCAtMTA5MCw3ICsxMDg2LDcgQEAKIAkJCSIlczogUmVzZXQgcnggY2hhaW4gbWFzay4gIgogCQkJIkRvIGludGVybmFsIHJlc2V0XG4iLCBfX2Z1bmNfXyk7CiAJCUFTU0VSVChmbHVzaCA9PSAwKTsKLQkJYXRoX2ludGVybmFsX3Jlc2V0KHNjKTsKKwkJYXRoX3Jlc2V0KHNjLCBmYWxzZSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTI4LDcgKzExMjQsNyBAQAogCXJ4dGlkID0gJmFuLT5hbl9hZ2dyLnJ4LnRpZFt0aWRdOwogCiAJc3Bpbl9sb2NrX2JoKCZyeHRpZC0+dGlkbG9jayk7Ci0JaWYgKHNjLT5zY19yeGFnZ3IpIHsKKwlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUlhBR0dSKSB7CiAJCS8qIEFsbG93IGFnZ3JlZ2F0aW9uIHJlY2VwdGlvbgogCQkgKiBBZGp1c3QgcnggQkEgd2luZG93IHNpemUuIFBlZXIgbWlnaHQgaW5kaWNhdGUgYQogCQkgKiB6ZXJvIGJ1ZmZlciBzaXplIGZvciBhIF9kb250X2NhcmVfIGNvbmRpdGlvbi4KQEAgLTExNjEsNyArMTE1Nyw3IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBFbnN1cmUgdGhlIG1lbW9yeSBpcyB6ZXJvZWQgb3V0IChhbGwgaW50ZXJuYWwKIAkJCSAqIHBvaW50ZXJzIGFyZSBudWxsKSAqLwotCQkJbWVtemVybyhyeHRpZC0+cnhidWYsIEFUSF9USURfTUFYX0JVRlMgKgorCQkJbWVtc2V0KHJ4dGlkLT5yeGJ1ZiwgMCwgQVRIX1RJRF9NQVhfQlVGUyAqCiAJCQkJc2l6ZW9mKHN0cnVjdCBhdGhfcnhidWYpKTsKIAkJCURQUklOVEYoc2MsIEFUSF9EQkdfQUdHUiwKIAkJCQkiJXM6IEFsbG9jYXRlZCBAJXBcbiIsIF9fZnVuY19fLCByeHRpZC0+cnhidWYpOwpAQCAtMTIyOCw3ICsxMjI0LDcgQEAKIAogdm9pZCBhdGhfcnhfbm9kZV9pbml0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX25vZGUgKmFuKQogewotCWlmIChzYy0+c2NfcnhhZ2dyKSB7CisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1JYQUdHUikgewogCQlzdHJ1Y3QgYXRoX2FyeF90aWQgKnJ4dGlkOwogCQlpbnQgdGlkbm87CiAKQEAgLTEyNjAsNyArMTI1Niw3IEBACiAKIHZvaWQgYXRoX3J4X25vZGVfY2xlYW51cChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9ub2RlICphbikKIHsKLQlpZiAoc2MtPnNjX3J4YWdncikgeworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9SWEFHR1IpIHsKIAkJc3RydWN0IGF0aF9hcnhfdGlkICpyeHRpZDsKIAkJaW50IHRpZG5vLCBpOwogCkBAIC0xMjkzLDI3ICsxMjg5LDMgQEAKIHsKIAlhdGhfcnhfbm9kZV9jbGVhbnVwKHNjLCBhbik7CiB9Ci0KLWRtYV9hZGRyX3QgYXRoX3NrYl9tYXBfc2luZ2xlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGludCBkaXJlY3Rpb24sCi0JCQkgICAgICBkbWFfYWRkcl90ICpwYSkKLXsKLQkvKgotCSAqIE5COiBkbyBOT1QgdXNlIHNrYi0+bGVuLCB3aGljaCBpcyAwIG9uIGluaXRpYWxpemF0aW9uLgotCSAqIFVzZSBza2IncyBlbnRpcmUgZGF0YSBhcmVhIGluc3RlYWQuCi0JICovCi0JKnBhID0gcGNpX21hcF9zaW5nbGUoc2MtPnBkZXYsIHNrYi0+ZGF0YSwKLQkJc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsIGRpcmVjdGlvbik7Ci0JcmV0dXJuICpwYTsKLX0KLQotdm9pZCBhdGhfc2tiX3VubWFwX3NpbmdsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgaW50IGRpcmVjdGlvbiwKLQkJCSAgZG1hX2FkZHJfdCAqcGEpCi17Ci0JLyogVW5tYXAgc2tiJ3MgZW50aXJlIGRhdGEgYXJlYSAqLwotCXBjaV91bm1hcF9zaW5nbGUoc2MtPnBkZXYsICpwYSwKLQkJc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQsIGRpcmVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JlZy5oCmluZGV4IDQyYjA4OTAuLjYwNjE3YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3JlZy5oCkBAIC04OTksMTIgKzg5OSw2IEBACiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWDIgICAgICAgICAgICAgICAgICAgICAgMHg0MDY0CiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWDMgICAgICAgICAgICAgICAgICAgICAgMHg0MDY4CiAKLSNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCAgICAgICAgICAgICAwCi0jZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19QQ0lFX0FUVEVOVElPTl9MRUQgMQotI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfUENJRV9QT1dFUl9MRUQgICAgIDIKLSNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19ORVRXT1JLX0xFRCAgICA1Ci0jZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQUNfUE9XRVJfTEVEICAgICAgNgotCiAjZGVmaW5lIEFSX0lOUFVUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDZjCiAKICNkZWZpbmUgQVJfRUVQUk9NX1NUQVRVU19EQVRBICAgICAgICAgICAgICAgICAgICAweDQwN2MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3htaXQuYwppbmRleCA1NTAxMjlmLi4zYTQ3NTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsveG1pdC5jCkBAIC02MCw3OSArNjAsNiBAQAogI2RlZmluZSBJU19IVF9SQVRFKF9yYXRlKSAgICAgKChfcmF0ZSkgJiAweDgwKQogCiAvKgotICogSW5zZXJ0IGEgY2hhaW4gb2YgYXRoX2J1ZiAoZGVzY3JpcHRvcnMpIG9uIGEgbXVsdGljYXN0IHR4cQotICogYnV0IGRvIE5PVCBzdGFydCB0eCBETUEgb24gdGhpcyBxdWV1ZS4KLSAqIE5COiBtdXN0IGJlIGNhbGxlZCB3aXRoIHR4cSBsb2NrIGhlbGQKLSAqLwotCi1zdGF0aWMgdm9pZCBhdGhfdHhfbWNhc3RxYWRkYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkJCXN0cnVjdCBhdGhfdHhxICp0eHEsCi0JCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0Jc3RydWN0IGF0aF9idWYgKmJmOwotCi0JaWYgKGxpc3RfZW1wdHkoaGVhZCkpCi0JCXJldHVybjsKLQotCS8qCi0JICogSW5zZXJ0IHRoZSBmcmFtZSBvbiB0aGUgb3V0Ym91bmQgbGlzdCBhbmQKLQkgKiBwYXNzIGl0IG9uIHRvIHRoZSBoYXJkd2FyZS4KLQkgKi8KLQliZiA9IGxpc3RfZmlyc3RfZW50cnkoaGVhZCwgc3RydWN0IGF0aF9idWYsIGxpc3QpOwotCi0JLyoKLQkgKiBUaGUgQ0FCIHF1ZXVlIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgU1dCQSBoYW5kbGVyIHNpbmNlCi0JICogZnJhbWVzIG9ubHkgZ28gb3V0IG9uIERUSU0gYW5kIHRvIGF2b2lkIHBvc3NpYmxlIHJhY2VzLgotCSAqLwotCWF0aDlrX2h3X3NldF9pbnRlcnJ1cHRzKGFoLCAwKTsKLQotCS8qCi0JICogSWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlIG1jYXN0cSwgd2Ugd2FudCB0byBzZXQKLQkgKiB0aGUgIm1vcmUgZGF0YSIgYml0IGluIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHF1ZXVlIHRvCi0JICogaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyAibW9yZSBkYXRhIi4gSXQgbWFrZXMgc2Vuc2UgdG8gYWRkCi0JICogaXQgaGVyZSBzaW5jZSB5b3UgYXJlICphbHdheXMqIGdvaW5nIHRvIGhhdmUKLQkgKiBtb3JlIGRhdGEgd2hlbiBhZGRpbmcgdG8gdGhpcyBxdWV1ZSwgbm8gbWF0dGVyIHdoZXJlCi0JICogeW91IGNhbGwgZnJvbS4KLQkgKi8KLQotCWlmICh0eHEtPmF4cV9kZXB0aCkgewotCQlzdHJ1Y3QgYXRoX2J1ZiAqbGJmOwotCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCi0JCS8qCi0JCSAqIEFkZCB0aGUgIm1vcmUgZGF0YSBmbGFnIiB0byB0aGUgbGFzdCBmcmFtZQotCQkgKi8KLQotCQlsYmYgPSBsaXN0X2VudHJ5KHR4cS0+YXhxX3EucHJldiwgc3RydWN0IGF0aF9idWYsIGxpc3QpOwotCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikKLQkJCSgoc3RydWN0IHNrX2J1ZmYgKikobGJmLT5iZl9tcGR1KSktPmRhdGE7Ci0JCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFREFUQSk7Ci0JfQotCi0JLyoKLQkgKiBOb3csIGNvbmNhdCB0aGUgZnJhbWUgb250byB0aGUgcXVldWUKLQkgKi8KLQlsaXN0X3NwbGljZV90YWlsX2luaXQoaGVhZCwgJnR4cS0+YXhxX3EpOwotCXR4cS0+YXhxX2RlcHRoKys7Ci0JdHhxLT5heHFfdG90YWxxdWV1ZWQrKzsKLQl0eHEtPmF4cV9saW5rYnVmID0gbGlzdF9lbnRyeSh0eHEtPmF4cV9xLnByZXYsIHN0cnVjdCBhdGhfYnVmLCBsaXN0KTsKLQotCURQUklOVEYoc2MsIEFUSF9EQkdfUVVFVUUsCi0JCSIlczogdHhxIGRlcHRoID0gJWRcbiIsIF9fZnVuY19fLCB0eHEtPmF4cV9kZXB0aCk7Ci0JaWYgKHR4cS0+YXhxX2xpbmsgIT0gTlVMTCkgewotCQkqdHhxLT5heHFfbGluayA9IGJmLT5iZl9kYWRkcjsKLQkJRFBSSU5URihzYywgQVRIX0RCR19YTUlULAotCQkJIiVzOiBsaW5rWyV1XSglcCk9JWxseCAoJXApXG4iLAotCQkJX19mdW5jX18sCi0JCQl0eHEtPmF4cV9xbnVtLCB0eHEtPmF4cV9saW5rLAotCQkJaXRvNjQoYmYtPmJmX2RhZGRyKSwgYmYtPmJmX2Rlc2MpOwotCX0KLQl0eHEtPmF4cV9saW5rID0gJihiZi0+YmZfbGFzdGJmLT5iZl9kZXNjLT5kc19saW5rKTsKLQlhdGg5a19od19zZXRfaW50ZXJydXB0cyhhaCwgc2MtPnNjX2ltYXNrKTsKLX0KLQotLyoKICAqIEluc2VydCBhIGNoYWluIG9mIGF0aF9idWYgKGRlc2NyaXB0b3JzKSBvbiBhIHR4cSBhbmQKICAqIGFzc3VtZSB0aGUgZGVzY3JpcHRvcnMgYXJlIGFscmVhZHkgY2hhaW5lZCB0b2dldGhlciBieSBjYWxsZXIuCiAgKiBOQjogbXVzdCBiZSBjYWxsZWQgd2l0aCB0eHEgbG9jayBoZWxkCkBAIC0yNzcsOCArMjA0LDYgQEAKIAlfX2xlMTYgZmM7CiAJdTggKnFjOwogCi0JbWVtc2V0KHR4Y3RsLCAwLCBzaXplb2Yoc3RydWN0IGF0aF90eF9jb250cm9sKSk7Ci0KIAl0eGN0bC0+ZGV2ID0gc2M7CiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKHNrYik7CkBAIC0zMDIsNyArMjI3LDYgQEAKIAl9CiAKIAl0eGN0bC0+aWZfaWQgPSAwOwotCXR4Y3RsLT5uZXh0ZnJhZ2xlbiA9IDA7CiAJdHhjdGwtPmZybWxlbiA9IHNrYi0+bGVuICsgRkNTX0xFTiAtIChoZHJsZW4gJiAzKTsKIAl0eGN0bC0+dHhwb3dlciA9IE1BWF9SQVRFX1BPV0VSOyAvKiBGSVhNRSAqLwogCkBAIC0zMTMsMTMgKzIzNywxMyBAQAogCiAJaWYgKHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5KSB7CiAJCXR4Y3RsLT5rZXlpeCA9IHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5LT5od19rZXlfaWR4OwotCQl0eGN0bC0+ZnJtbGVuICs9IHR4X2luZm8tPmNvbnRyb2wuaWN2X2xlbjsKKwkJdHhjdGwtPmZybWxlbiArPSB0eF9pbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbjsKIAotCQlpZiAoc2MtPnNjX2tleXR5cGUgPT0gQVRIOUtfQ0lQSEVSX1dFUCkKKwkJaWYgKHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5LT5hbGcgPT0gQUxHX1dFUCkKIAkJCXR4Y3RsLT5rZXl0eXBlID0gQVRIOUtfS0VZX1RZUEVfV0VQOwotCQllbHNlIGlmIChzYy0+c2Nfa2V5dHlwZSA9PSBBVEg5S19DSVBIRVJfVEtJUCkKKwkJZWxzZSBpZiAodHhfaW5mby0+Y29udHJvbC5od19rZXktPmFsZyA9PSBBTEdfVEtJUCkKIAkJCXR4Y3RsLT5rZXl0eXBlID0gQVRIOUtfS0VZX1RZUEVfVEtJUDsKLQkJZWxzZSBpZiAoc2MtPnNjX2tleXR5cGUgPT0gQVRIOUtfQ0lQSEVSX0FFU19DQ00pCisJCWVsc2UgaWYgKHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5LT5hbGcgPT0gQUxHX0NDTVApCiAJCQl0eGN0bC0+a2V5dHlwZSA9IEFUSDlLX0tFWV9UWVBFX0FFUzsKIAl9CiAKQEAgLTMyOSwxMiArMjUzLDE4IEBACiAKIAkvKiBGaWxsIHFudW0gKi8KIAotCXR4Y3RsLT5xbnVtID0gYXRoX2dldF9oYWxfcW51bShza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSwgc2MpOwotCXR4cSA9ICZzYy0+c2NfdHhxW3R4Y3RsLT5xbnVtXTsKKwlpZiAodW5saWtlbHkodHhjdGwtPmZsYWdzICYgQVRIOUtfVFhERVNDX0NBQikpIHsKKwkJdHhjdGwtPnFudW0gPSAwOworCQl0eHEgPSBzYy0+c2NfY2FicTsKKwl9IGVsc2UgeworCQl0eGN0bC0+cW51bSA9IGF0aF9nZXRfaGFsX3FudW0oc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYiksIHNjKTsKKwkJdHhxID0gJnNjLT5zY190eHFbdHhjdGwtPnFudW1dOworCX0KIAlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJLyogVHJ5IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIGRlc2NyaXB0b3JzICovCi0JaWYgKHR4cS0+YXhxX2RlcHRoID49IChBVEhfVFhCVUYgLSAyMCkpIHsKKwlpZiAodHhxLT5heHFfZGVwdGggPj0gKEFUSF9UWEJVRiAtIDIwKSAmJgorCSAgICAhKHR4Y3RsLT5mbGFncyAmIEFUSDlLX1RYREVTQ19DQUIpKSB7CiAJCURQUklOVEYoc2MsIEFUSF9EQkdfRkFUQUwsCiAJCQkiJXM6IFRYIHF1ZXVlOiAlZCBpcyBmdWxsLCBkZXB0aDogJWRcbiIsCiAJCQlfX2Z1bmNfXywKQEAgLTM1NCw3ICsyODQsNyBAQAogCiAJLyogRmlsbCBmbGFncyAqLwogCi0JdHhjdGwtPmZsYWdzID0gQVRIOUtfVFhERVNDX0NMUkRNQVNLOyAgICAvKiBuZWVkZWQgZm9yIGNyeXB0byBlcnJvcnMgKi8KKwl0eGN0bC0+ZmxhZ3MgfD0gQVRIOUtfVFhERVNDX0NMUkRNQVNLOyAvKiBuZWVkZWQgZm9yIGNyeXB0byBlcnJvcnMgKi8KIAogCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKQogCQl0eGN0bC0+ZmxhZ3MgfD0gQVRIOUtfVFhERVNDX05PQUNLOwpAQCAtMzkyLDcgKzMyMiw3IEBACiAJCSAqIGluY3JlbWVudGVkIGJ5IHRoZSBmcmFnbWVudGF0aW9uIHJvdXRpbmUuCiAJCSAqLwogCQlpZiAobGlrZWx5KCEodHhjdGwtPmZsYWdzICYgQVRIOUtfVFhERVNDX0ZSQUdfSVNfT04pKSAmJgotCQkJdHhjdGwtPmh0ICYmIHNjLT5zY190eGFnZ3IpIHsKKwkJICAgIHR4Y3RsLT5odCAmJiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSkgewogCQkJc3RydWN0IGF0aF9hdHhfdGlkICp0aWQ7CiAKIAkJCXRpZCA9IEFUSF9BTl8yX1RJRCh0eGN0bC0+YW4sIHR4Y3RsLT50aWRubyk7CkBAIC00MTMsNTAgKzM0MywxOCBAQAogCX0KIAlyaXggPSByY3NbMF0ucml4OwogCi0JLyoKLQkgKiBDYWxjdWxhdGUgZHVyYXRpb24uICBUaGlzIGxvZ2ljYWxseSBiZWxvbmdzIGluIHRoZSA4MDIuMTEKLQkgKiBsYXllciBidXQgaXQgbGFja3Mgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgaXQuCi0JICovCi0JaWYgKCh0eGN0bC0+ZmxhZ3MgJiBBVEg5S19UWERFU0NfTk9BQ0spID09IDAgJiYgIWllZWU4MDIxMV9pc19jdGwoZmMpKSB7Ci0JCXUxNiBkdXI7CisJaWYgKGllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSB8fAorCSAgICAobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKSkgewogCQkvKgotCQkgKiBYWFggbm90IHJpZ2h0IHdpdGggZnJhZ21lbnRhdGlvbi4KLQkJICovCi0JCWlmIChzYy0+c2NfZmxhZ3MgJiBBVEhfUFJFQU1CTEVfU0hPUlQpCi0JCQlkdXIgPSBydC0+aW5mb1tyaXhdLnNwQWNrRHVyYXRpb247Ci0JCWVsc2UKLQkJCWR1ciA9IHJ0LT5pbmZvW3JpeF0ubHBBY2tEdXJhdGlvbjsKLQotCQlpZiAobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmCi0JCQkJSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSB7Ci0JCQlkdXIgKz0gZHVyOyAgLyogQWRkIGFkZGl0aW9uYWwgJ1NJRlMgKyBBQ0snICovCi0KLQkJCS8qCi0JCQkqKiBDb21wdXRlIHNpemUgb2YgbmV4dCBmcmFnbWVudCBpbiBvcmRlciB0byBjb21wdXRlCi0JCQkqKiBkdXJhdGlvbnMgbmVlZGVkIHRvIHVwZGF0ZSBOQVYuCi0JCQkqKiBUaGUgbGFzdCBmcmFnbWVudCB1c2VzIHRoZSBBQ0sgZHVyYXRpb24gb25seS4KLQkJCSoqIEFkZCB0aW1lIGZvciBuZXh0IGZyYWdtZW50LgotCQkJKi8KLQkJCWR1ciArPSBhdGg5a19od19jb21wdXRldHh0aW1lKHNjLT5zY19haCwgcnQsCi0JCQkJCXR4Y3RsLT5uZXh0ZnJhZ2xlbiwKLQkJCQkJcml4LCBzYy0+c2NfZmxhZ3MgJiBBVEhfUFJFQU1CTEVfU0hPUlQpOwotCQl9Ci0KLQkJaWYgKGllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSB8fAotCQkgICAgIChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpKSB7Ci0JCQkvKgotCQkJKiogIEZvcmNlIGhhcmR3YXJlIHRvIHVzZSBjb21wdXRlZCBkdXJhdGlvbiBmb3IgbmV4dAotCQkJKiogIGZyYWdtZW50IGJ5IGRpc2FibGluZyBtdWx0aS1yYXRlIHJldHJ5LCB3aGljaAotCQkJKiogIHVwZGF0ZXMgZHVyYXRpb24gYmFzZWQgb24gdGhlIG11bHRpLXJhdGUKLQkJCSoqICBkdXJhdGlvbiB0YWJsZS4KLQkJCSovCi0JCQlyY3NbMV0udHJpZXMgPSByY3NbMl0udHJpZXMgPSByY3NbM10udHJpZXMgPSAwOwotCQkJcmNzWzFdLnJpeCA9IHJjc1syXS5yaXggPSByY3NbM10ucml4ID0gMDsKLQkJCS8qIHJlc2V0IHRyaWVzIGJ1dCBrZWVwIHJhdGUgaW5kZXggKi8KLQkJCXJjc1swXS50cmllcyA9IEFUSF9UWE1BWFRSWTsKLQkJfQotCi0JCWhkci0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNihkdXIpOworCQkqKiAgRm9yY2UgaGFyZHdhcmUgdG8gdXNlIGNvbXB1dGVkIGR1cmF0aW9uIGZvciBuZXh0CisJCSoqICBmcmFnbWVudCBieSBkaXNhYmxpbmcgbXVsdGktcmF0ZSByZXRyeSwgd2hpY2gKKwkJKiogIHVwZGF0ZXMgZHVyYXRpb24gYmFzZWQgb24gdGhlIG11bHRpLXJhdGUKKwkJKiogIGR1cmF0aW9uIHRhYmxlLgorCQkqLworCQlyY3NbMV0udHJpZXMgPSByY3NbMl0udHJpZXMgPSByY3NbM10udHJpZXMgPSAwOworCQlyY3NbMV0ucml4ID0gcmNzWzJdLnJpeCA9IHJjc1szXS5yaXggPSAwOworCQkvKiByZXNldCB0cmllcyBidXQga2VlcCByYXRlIGluZGV4ICovCisJCXJjc1swXS50cmllcyA9IEFUSF9UWE1BWFRSWTsKIAl9CiAKIAkvKgpAQCAtNDg0LDEyICszODIsOCBAQAogCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewogCQlhbnRlbm5hID0gc2MtPnNjX21jYXN0YW50ZW5uYSArIDE7CiAJCXNjLT5zY19tY2FzdGFudGVubmEgPSAoc2MtPnNjX21jYXN0YW50ZW5uYSArIDEpICYgMHgxOwotCX0gZWxzZQotCQlhbnRlbm5hID0gc2MtPnNjX3R4YW50ZW5uYTsKKwl9CiAKLSNpZmRlZiBVU0VfTEVHQUNZX0hBTAotCXR4Y3RsLT5hbnRlbm5hID0gYW50ZW5uYTsKLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC01MDIsNyArMzk2LDYgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYmYtPmJmX21wZHU7CiAJc3RydWN0IGF0aF94bWl0X3N0YXR1cyB0eF9zdGF0dXM7Ci0JZG1hX2FkZHJfdCAqcGE7CiAKIAkvKgogCSAqIFNldCByZXRyeSBpbmZvcm1hdGlvbi4KQEAgLTUxOCwxMyArNDExLDEyIEBACiAJaWYgKCF0eG9rKSB7CiAJCXR4X3N0YXR1cy5mbGFncyB8PSBBVEhfVFhfRVJST1I7CiAKLQkJaWYgKGJmLT5iZl9pc3hyZXRyaWVkKQorCQlpZiAoYmZfaXN4cmV0cmllZChiZikpCiAJCQl0eF9zdGF0dXMuZmxhZ3MgfD0gQVRIX1RYX1hSRVRSWTsKIAl9CiAJLyogVW5tYXAgdGhpcyBmcmFtZSAqLwotCXBhID0gZ2V0X2RtYV9tZW1fY29udGV4dChiZiwgYmZfZG1hY29udGV4dCk7CiAJcGNpX3VubWFwX3NpbmdsZShzYy0+cGRldiwKLQkJCSAqcGEsCisJCQkgYmYtPmJmX2RtYWNvbnRleHQsCiAJCQkgc2tiLT5sZW4sCiAJCQkgUENJX0RNQV9UT0RFVklDRSk7CiAJLyogY29tcGxldGUgdGhpcyBmcmFtZSAqLwpAQCAtNjI5LDcgKzUyMSw3IEBACiAJaWYgKGlzbm9kZWdvbmUgfHwgZHMtPmRzX3R4c3RhdC50c19mbGFncyA9PSBBVEg5S19UWF9TV19BQk9SVEVEKQogCQlyZXR1cm4gMDsKIAotCWlzYWdnciA9IGJmLT5iZl9pc2FnZ3I7CisJaXNhZ2dyID0gYmZfaXNhZ2dyKGJmKTsKIAlpZiAoaXNhZ2dyKSB7CiAJCXNlcV9zdCA9IEFUSF9EU19CQV9TRVEoZHMpOwogCQltZW1jcHkoYmEsIEFUSF9EU19CQV9CSVRNQVAoZHMpLCBXTUVfQkFfQk1QX1NJWkUgPj4gMyk7CkBAIC02NTEsNyArNTQzLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAKLQliZi0+YmZfaXNyZXRyaWVkID0gMTsKKwliZi0+YmZfc3RhdGUuYmZfdHlwZSB8PSBCVUZfUkVUUlk7CiAJYmYtPmJmX3JldHJpZXMrKzsKIAogCXNrYiA9IGJmLT5iZl9tcGR1OwpAQCAtNjk4LDcgKzU5MCw3IEBACiAJdTggcmM7CiAJaW50IHN0cmVhbXMsIHBrdGxlbjsKIAotCXBrdGxlbiA9IGJmLT5iZl9pc2FnZ3IgPyBiZi0+YmZfYWwgOiBiZi0+YmZfZnJtbGVuOworCXBrdGxlbiA9IGJmX2lzYWdncihiZikgPyBiZi0+YmZfYWwgOiBiZi0+YmZfZnJtbGVuOwogCXJjID0gcnQtPmluZm9bcml4XS5yYXRlQ29kZTsKIAogCS8qCkBAIC03NDIsNyArNjM0LDcgQEAKIAlpbnQgaSwgZmxhZ3MsIHJ0c2N0c2VuYSA9IDAsIGR5bmFtaWNfbWltb3BzID0gMDsKIAl1MzIgY3RzZHVyYXRpb24gPSAwOwogCXU4IHJpeCA9IDAsIGNpeCwgY3RzcmF0ZSA9IDA7Ci0JdTMyIGFnZ3JfbGltaXRfd2l0aF9ydHMgPSBzYy0+c2NfcnRzYWdncmxpbWl0OworCXUzMiBhZ2dyX2xpbWl0X3dpdGhfcnRzID0gYWgtPmFoX2NhcHMucnRzX2FnZ3JfbGltaXQ7CiAJc3RydWN0IGF0aF9ub2RlICphbiA9IChzdHJ1Y3QgYXRoX25vZGUgKikgYmYtPmJmX25vZGU7CiAKIAkvKgpAQCAtNzgxLDcgKzY3Myw3IEBACiAJICogbGV0IHJhdGUgc2VyaWVzIGZsYWdzIGRldGVybWluZSB3aGljaCByYXRlcyB3aWxsIGFjdHVhbGx5CiAJICogdXNlIFJUUy4KIAkgKi8KLQlpZiAoKGFoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfSFQpICYmIGJmLT5iZl9pc2RhdGEpIHsKKwlpZiAoKGFoLT5haF9jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfSFQpICYmIGJmX2lzZGF0YShiZikpIHsKIAkJQlVHX09OKCFhbik7CiAJCS8qCiAJCSAqIDgwMi4xMWcgcHJvdGVjdGlvbiBub3QgbmVlZGVkLCB1c2Ugb3VyIGRlZmF1bHQgYmVoYXZpb3IKQEAgLTc5Myw3ICs2ODUsNyBAQAogCQkgKiBhbmQgdGhlIHNlY29uZCBhZ2dyZWdhdGUgc2hvdWxkIGhhdmUgYW55IHByb3RlY3Rpb24gYXQgYWxsLgogCQkgKi8KIAkJaWYgKGFuLT5hbl9zbW1vZGUgPT0gQVRIX1NNX1BXUlNBVl9EWU5BTUlDKSB7Ci0JCQlpZiAoIWJmLT5iZl9hZ2dyYnVyc3QpIHsKKwkJCWlmICghYmZfaXNhZ2dyYnVyc3QoYmYpKSB7CiAJCQkJZmxhZ3MgPSBBVEg5S19UWERFU0NfUlRTRU5BOwogCQkJCWR5bmFtaWNfbWltb3BzID0gMTsKIAkJCX0gZWxzZSB7CkBAIC04MDYsNyArNjk4LDcgQEAKIAkgKiBTZXQgcHJvdGVjdGlvbiBpZiBhZ2dyZWdhdGUgcHJvdGVjdGlvbiBvbgogCSAqLwogCWlmIChzYy0+c2NfY29uZmlnLmF0aF9hZ2dyX3Byb3QgJiYKLQkgICAgKCFiZi0+YmZfaXNhZ2dyIHx8IChiZi0+YmZfaXNhZ2dyICYmIGJmLT5iZl9hbCA8IDgxOTIpKSkgeworCSAgICAoIWJmX2lzYWdncihiZikgfHwgKGJmX2lzYWdncihiZikgJiYgYmYtPmJmX2FsIDwgODE5MikpKSB7CiAJCWZsYWdzID0gQVRIOUtfVFhERVNDX1JUU0VOQTsKIAkJY2l4ID0gcnQtPmluZm9bc2MtPnNjX3Byb3RyaXhdLmNvbnRyb2xSYXRlOwogCQlydHNjdHNlbmEgPSAxOwpAQCAtODE1LDcgKzcwNyw3IEBACiAJLyoKIAkgKiAgRm9yIEFSNTQxNiAtIFJUUyBjYW5ub3QgYmUgZm9sbG93ZWQgYnkgYSBmcmFtZSBsYXJnZXIgdGhhbiA4Sy4KIAkgKi8KLQlpZiAoYmYtPmJmX2lzYWdnciAmJiAoYmYtPmJmX2FsID4gYWdncl9saW1pdF93aXRoX3J0cykpIHsKKwlpZiAoYmZfaXNhZ2dyKGJmKSAmJiAoYmYtPmJmX2FsID4gYWdncl9saW1pdF93aXRoX3J0cykpIHsKIAkJLyoKIAkJICogRW5zdXJlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgU00gRHluYW1pYyBwb3dlciBzYXZlCiAJCSAqIHdoaWxlIHdlIGFyZSBidXJzdGluZyB0aGUgc2Vjb25kIGFnZ3JlZ2F0ZSB0aGUKQEAgLTgzMiwxMiArNzI0LDEyIEBACiAJLyogTkI6IGNpeCBpcyBzZXQgYWJvdmUgd2hlcmUgUlRTL0NUUyBpcyBlbmFibGVkICovCiAJQlVHX09OKGNpeCA9PSAweGZmKTsKIAljdHNyYXRlID0gcnQtPmluZm9bY2l4XS5yYXRlQ29kZSB8Ci0JCShiZi0+YmZfc2hwcmVhbWJsZSA/IHJ0LT5pbmZvW2NpeF0uc2hvcnRQcmVhbWJsZSA6IDApOworCQkoYmZfaXNzaHByZWFtYmxlKGJmKSA/IHJ0LT5pbmZvW2NpeF0uc2hvcnRQcmVhbWJsZSA6IDApOwogCiAJLyoKIAkgKiBTZXR1cCBIQUwgcmF0ZSBzZXJpZXMKIAkgKi8KLQltZW16ZXJvKHNlcmllcywgc2l6ZW9mKHN0cnVjdCBhdGg5a18xMW5fcmF0ZV9zZXJpZXMpICogNCk7CisJbWVtc2V0KHNlcmllcywgMCwgc2l6ZW9mKHN0cnVjdCBhdGg5a18xMW5fcmF0ZV9zZXJpZXMpICogNCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmICghYmYtPmJmX3Jjc1tpXS50cmllcykKQEAgLTg0Niw3ICs3MzgsNyBAQAogCQlyaXggPSBiZi0+YmZfcmNzW2ldLnJpeDsKIAogCQlzZXJpZXNbaV0uUmF0ZSA9IHJ0LT5pbmZvW3JpeF0ucmF0ZUNvZGUgfAotCQkJKGJmLT5iZl9zaHByZWFtYmxlID8gcnQtPmluZm9bcml4XS5zaG9ydFByZWFtYmxlIDogMCk7CisJCQkoYmZfaXNzaHByZWFtYmxlKGJmKSA/IHJ0LT5pbmZvW3JpeF0uc2hvcnRQcmVhbWJsZSA6IDApOwogCiAJCXNlcmllc1tpXS5UcmllcyA9IGJmLT5iZl9yY3NbaV0udHJpZXM7CiAKQEAgLTg2Miw3ICs3NTQsNyBAQAogCQkJc2MsIHJpeCwgYmYsCiAJCQkoYmYtPmJmX3Jjc1tpXS5mbGFncyAmIEFUSF9SQ19DVzQwX0ZMQUcpICE9IDAsCiAJCQkoYmYtPmJmX3Jjc1tpXS5mbGFncyAmIEFUSF9SQ19TR0lfRkxBRyksCi0JCQliZi0+YmZfc2hwcmVhbWJsZSk7CisJCQliZl9pc3NocHJlYW1ibGUoYmYpKTsKIAogCQlpZiAoKGFuLT5hbl9zbW1vZGUgPT0gQVRIX1NNX1BXUlNBVl9TVEFUSUMpICYmCiAJCSAgICAoYmYtPmJmX3Jjc1tpXS5mbGFncyAmIEFUSF9SQ19EU19GTEFHKSA9PSAwKSB7CkBAIC04NzUsNyArNzY3LDcgQEAKIAkJCSAqLwogCQkJc2VyaWVzW2ldLkNoU2VsID0gc2MtPnNjX3R4X2NoYWlubWFzazsKIAkJfSBlbHNlIHsKLQkJCWlmIChiZi0+YmZfaHQpCisJCQlpZiAoYmZfaXNodChiZikpCiAJCQkJc2VyaWVzW2ldLkNoU2VsID0KIAkJCQkJYXRoX2NoYWlubWFza19zZWxfbG9naWMoc2MsIGFuKTsKIAkJCWVsc2UKQEAgLTkwOCw3ICs4MDAsNyBAQAogCQkgKiAgICAgdXNlIHRoZSBwcmVjYWxjdWxhdGVkIEFDSyBkdXJhdGlvbnMuCiAJCSAqLwogCQlpZiAoZmxhZ3MgJiBBVEg5S19UWERFU0NfUlRTRU5BKSB7ICAgIC8qIFNJRlMgKyBDVFMgKi8KLQkJCWN0c2R1cmF0aW9uICs9IGJmLT5iZl9zaHByZWFtYmxlID8KKwkJCWN0c2R1cmF0aW9uICs9IGJmX2lzc2hwcmVhbWJsZShiZikgPwogCQkJCXJ0LT5pbmZvW2NpeF0uc3BBY2tEdXJhdGlvbiA6CiAJCQkJcnQtPmluZm9bY2l4XS5scEFja0R1cmF0aW9uOwogCQl9CkBAIC05MTYsNyArODA4LDcgQEAKIAkJY3RzZHVyYXRpb24gKz0gc2VyaWVzWzBdLlBrdER1cmF0aW9uOwogCiAJCWlmICgoYmYtPmJmX2ZsYWdzICYgQVRIOUtfVFhERVNDX05PQUNLKSA9PSAwKSB7IC8qIFNJRlMgKyBBQ0sgKi8KLQkJCWN0c2R1cmF0aW9uICs9IGJmLT5iZl9zaHByZWFtYmxlID8KKwkJCWN0c2R1cmF0aW9uICs9IGJmX2lzc2hwcmVhbWJsZShiZikgPwogCQkJCXJ0LT5pbmZvW3JpeF0uc3BBY2tEdXJhdGlvbiA6CiAJCQkJcnQtPmluZm9bcml4XS5scEFja0R1cmF0aW9uOwogCQl9CkBAIC05MjUsMTcgKzgxNywxNyBAQAogCQkgKiBEaXNhYmxlIG11bHRpLXJhdGUgcmV0cnkgd2hlbiB1c2luZyBSVFMvQ1RTIGJ5IGNsZWFyaW5nCiAJCSAqIHNlcmllcyAxLCAyIGFuZCAzLgogCQkgKi8KLQkJbWVtemVybygmc2VyaWVzWzFdLCBzaXplb2Yoc3RydWN0IGF0aDlrXzExbl9yYXRlX3NlcmllcykgKiAzKTsKKwkJbWVtc2V0KCZzZXJpZXNbMV0sIDAsIHNpemVvZihzdHJ1Y3QgYXRoOWtfMTFuX3JhdGVfc2VyaWVzKSAqIDMpOwogCX0KIAogCS8qCiAJICogc2V0IGR1cl91cGRhdGVfZW4gZm9yIGwtc2lnIGNvbXB1dGF0aW9uIGV4Y2VwdCBmb3IgUFMtUG9sbCBmcmFtZXMKIAkgKi8KIAlhdGg5a19od19zZXQxMW5fcmF0ZXNjZW5hcmlvKGFoLCBkcywgbGFzdGRzLAotCQkJCSAgICAhYmYtPmJmX2lzcHNwb2xsLAotCQkJCSAgICBjdHNyYXRlLAotCQkJCSAgICBjdHNkdXJhdGlvbiwKLQkJCQkgICAgc2VyaWVzLCA0LCBmbGFncyk7CisJCQkJICAgICAhYmZfaXNwc3BvbGwoYmYpLAorCQkJCSAgICAgY3RzcmF0ZSwKKwkJCQkgICAgIGN0c2R1cmF0aW9uLAorCQkJCSAgICAgc2VyaWVzLCA0LCBmbGFncyk7CiAJaWYgKHNjLT5zY19jb25maWcuYXRoX2FnZ3JfcHJvdCAmJiBmbGFncykKIAkJYXRoOWtfaHdfc2V0MTFuX2J1cnN0ZHVyYXRpb24oYWgsIGRzLCA4MTkyKTsKIH0KQEAgLTk1OCw3ICs4NTAsNyBAQAogCUJVR19PTihsaXN0X2VtcHR5KGJmX2hlYWQpKTsKIAogCWJmID0gbGlzdF9maXJzdF9lbnRyeShiZl9oZWFkLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JYmYtPmJmX2lzYW1wZHUgPSAwOyAvKiByZWd1bGFyIEhUIGZyYW1lICovCisJYmYtPmJmX3N0YXRlLmJmX3R5cGUgJj0gfkJVRl9BTVBEVTsgLyogcmVndWxhciBIVCBmcmFtZSAqLwogCiAJc2tiID0gKHN0cnVjdCBza19idWZmICopYmYtPmJmX21wZHU7CiAJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKQEAgLTk5OCw3ICs4OTAsNyBAQAogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0aWQtPmJ1Zl9xKSkgewogCQliZiA9IGxpc3RfZmlyc3RfZW50cnkoJnRpZC0+YnVmX3EsIHN0cnVjdCBhdGhfYnVmLCBsaXN0KTsKLQkJQVNTRVJUKCFiZi0+YmZfaXNyZXRyaWVkKTsKKwkJQVNTRVJUKCFiZl9pc3JldHJpZWQoYmYpKTsKIAkJbGlzdF9jdXRfcG9zaXRpb24oJmJmX2hlYWQsICZ0aWQtPmJ1Zl9xLCAmYmYtPmJmX2xhc3Rmcm0tPmxpc3QpOwogCQlhdGhfdHhfc2VuZF9ub3JtYWwoc2MsIHR4cSwgdGlkLCAmYmZfaGVhZCk7CiAJfQpAQCAtMTAyNSw3ICs5MTcsNyBAQAogCWludCBpc2FnZ3IsIHR4ZmFpbCwgdHhwZW5kaW5nLCBzZW5kYmFyID0gMCwgbmVlZHJlc2V0ID0gMDsKIAlpbnQgaXNub2RlZ29uZSA9IChhbi0+YW5fZmxhZ3MgJiBBVEhfTk9ERV9DTEVBTik7CiAKLQlpc2FnZ3IgPSBiZi0+YmZfaXNhZ2dyOworCWlzYWdnciA9IGJmX2lzYWdncihiZik7CiAJaWYgKGlzYWdncikgewogCQlpZiAodHhvaykgewogCQkJaWYgKEFUSF9EU19UWF9CQShkcykpIHsKQEAgLTEwMzgsNyArOTMwLDcgQEAKIAkJCQkJQVRIX0RTX0JBX0JJVE1BUChkcyksCiAJCQkJCVdNRV9CQV9CTVBfU0laRSA+PiAzKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWVtemVybyhiYSwgV01FX0JBX0JNUF9TSVpFID4+IDMpOworCQkJCW1lbXNldChiYSwgMCwgV01FX0JBX0JNUF9TSVpFID4+IDMpOwogCiAJCQkJLyoKIAkJCQkgKiBBUjU0MTYgY2FuIGJlY29tZSBkZWFmL211dGUgd2hlbiBCQQpAQCAtMTA0NywxMSArOTM5LDExIEBACiAJCQkJICogd2hlbiBwZXJmb3JtIGludGVybmFsIHJlc2V0IGluIHRoaXMgcm91dGluZS4KIAkJCQkgKiBPbmx5IGVuYWJsZSByZXNldCBpbiBTVEEgbW9kZSBmb3Igbm93LgogCQkJCSAqLwotCQkJCWlmIChzYy0+c2Nfb3Btb2RlID09IEFUSDlLX01fU1RBKQorCQkJCWlmIChzYy0+c2NfYWgtPmFoX29wbW9kZSA9PSBBVEg5S19NX1NUQSkKIAkJCQkJbmVlZHJlc2V0ID0gMTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCW1lbXplcm8oYmEsIFdNRV9CQV9CTVBfU0laRSA+PiAzKTsKKwkJCW1lbXNldChiYSwgMCwgV01FX0JBX0JNUF9TSVpFID4+IDMpOwogCQl9CiAJfQogCkBAIC0xMDc1LDcgKzk2Nyw3IEBACiAJCQkJCWF0aF90eF9zZXRfcmV0cnkoc2MsIGJmKTsKIAkJCQkJdHhwZW5kaW5nID0gMTsKIAkJCQl9IGVsc2UgewotCQkJCQliZi0+YmZfaXN4cmV0cmllZCA9IDE7CisJCQkJCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9YUkVUUlk7CiAJCQkJCXR4ZmFpbCA9IDE7CiAJCQkJCXNlbmRiYXIgPSAxOwogCQkJCX0KQEAgLTExNzUsMTEgKzEwNjcsOCBAQAogCQkJCQkJdGJmLT5iZl9sYXN0ZnJtLT5iZl9kZXNjKTsKIAogCQkJCQkvKiBjb3B5IHRoZSBETUEgY29udGV4dCAqLwotCQkJCQljb3B5X2RtYV9tZW1fY29udGV4dCgKLQkJCQkJCWdldF9kbWFfbWVtX2NvbnRleHQodGJmLAotCQkJCQkJCWJmX2RtYWNvbnRleHQpLAotCQkJCQkJZ2V0X2RtYV9tZW1fY29udGV4dChiZl9sYXN0LAotCQkJCQkJCWJmX2RtYWNvbnRleHQpKTsKKwkJCQkJdGJmLT5iZl9kbWFjb250ZXh0ID0KKwkJCQkJCWJmX2xhc3QtPmJmX2RtYWNvbnRleHQ7CiAJCQkJfQogCQkJCWxpc3RfYWRkX3RhaWwoJnRiZi0+bGlzdCwgJmJmX2hlYWQpOwogCQkJfSBlbHNlIHsKQEAgLTExODgsNyArMTA3Nyw3IEBACiAJCQkJICogc29mdHdhcmUgcmV0cnkKIAkJCQkgKi8KIAkJCQlhdGg5a19od19jbGVhcnR4ZGVzYyhzYy0+c2NfYWgsCi0JCQkJCWJmLT5iZl9sYXN0ZnJtLT5iZl9kZXNjKTsKKwkJCQkJCSAgICAgYmYtPmJmX2xhc3Rmcm0tPmJmX2Rlc2MpOwogCQkJfQogCiAJCQkvKgpAQCAtMTI0Miw3ICsxMTMxLDcgQEAKIAl9CiAKIAlpZiAobmVlZHJlc2V0KQotCQlhdGhfaW50ZXJuYWxfcmVzZXQoc2MpOworCQlhdGhfcmVzZXQoc2MsIGZhbHNlKTsKIAogCXJldHVybjsKIH0KQEAgLTEzMzEsNyArMTIyMCw3IEBACiAKIAkJdHhxLT5heHFfZGVwdGgtLTsKIAotCQlpZiAoYmYtPmJmX2lzYWdncikKKwkJaWYgKGJmX2lzYWdncihiZikpCiAJCQl0eHEtPmF4cV9hZ2dyX2RlcHRoLS07CiAKIAkJdHhvayA9IChkcy0+ZHNfdHhzdGF0LnRzX3N0YXR1cyA9PSAwKTsKQEAgLTEzNDUsMTQgKzEyMzQsMTQgQEAKIAkJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfdHhidWZsb2NrKTsKIAkJfQogCi0JCWlmICghYmYtPmJmX2lzYW1wZHUpIHsKKwkJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewogCQkJLyoKIAkJCSAqIFRoaXMgZnJhbWUgaXMgc2VudCBvdXQgYXMgYSBzaW5nbGUgZnJhbWUuCiAJCQkgKiBVc2UgaGFyZHdhcmUgcmV0cnkgc3RhdHVzIGZvciB0aGlzIGZyYW1lLgogCQkJICovCiAJCQliZi0+YmZfcmV0cmllcyA9IGRzLT5kc190eHN0YXQudHNfbG9uZ3JldHJ5OwogCQkJaWYgKGRzLT5kc190eHN0YXQudHNfc3RhdHVzICYgQVRIOUtfVFhFUlJfWFJFVFJZKQotCQkJCWJmLT5iZl9pc3hyZXRyaWVkID0gMTsKKwkJCQliZi0+YmZfc3RhdGUuYmZfdHlwZSB8PSBCVUZfWFJFVFJZOwogCQkJbmJhZCA9IDA7CiAJCX0gZWxzZSB7CiAJCQluYmFkID0gYXRoX3R4X251bV9iYWRmcm1zKHNjLCBiZiwgdHhvayk7CkBAIC0xMzY4LDcgKzEyNTcsNyBAQAogCQkJaWYgKGRzLT5kc190eHN0YXQudHNfc3RhdHVzID09IDApCiAJCQkJbmFja2VkKys7CiAKLQkJCWlmIChiZi0+YmZfaXNkYXRhKSB7CisJCQlpZiAoYmZfaXNkYXRhKGJmKSkgewogCQkJCWlmIChpc3JpZnMpCiAJCQkJCXRtcF9kcyA9IGJmLT5iZl9yaWZzbGFzdC0+YmZfZGVzYzsKIAkJCQllbHNlCkBAIC0xMzg0LDcgKzEyNzMsNyBAQAogCQkvKgogCQkgKiBDb21wbGV0ZSB0aGlzIHRyYW5zbWl0IHVuaXQKIAkJICovCi0JCWlmIChiZi0+YmZfaXNhbXBkdSkKKwkJaWYgKGJmX2lzYW1wZHUoYmYpKQogCQkJYXRoX3R4X2NvbXBsZXRlX2FnZ3JfcmlmcyhzYywgdHhxLCBiZiwgJmJmX2hlYWQsIHR4b2spOwogCQllbHNlCiAJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgJmJmX2hlYWQsIHR4b2ssIDApOwpAQCAtMTQwNiw3ICsxMjk1LDcgQEAKIAkJLyoKIAkJICogc2NoZWR1bGUgYW55IHBlbmRpbmcgcGFja2V0cyBpZiBhZ2dyZWdhdGlvbiBpcyBlbmFibGVkCiAJCSAqLwotCQlpZiAoc2MtPnNjX3R4YWdncikKKwkJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikKIAkJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAl9CkBAIC0xNDMwLDEwICsxMzE5LDkgQEAKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CiAJaW50IGk7CiAJaW50IG5wZW5kID0gMDsKLQllbnVtIGF0aDlrX2h0X21hY21vZGUgaHRfbWFjbW9kZSA9IGF0aF9jd21fbWFjbW9kZShzYyk7CiAKIAkvKiBYWFggcmV0dXJuIHZhbHVlICovCi0JaWYgKCFzYy0+c2NfaW52YWxpZCkgeworCWlmICghKHNjLT5zY19mbGFncyAmIFNDX09QX0lOVkFMSUQpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBVEg5S19OVU1fVFhfUVVFVUVTOyBpKyspIHsKIAkJCWlmIChBVEhfVFhRX1NFVFVQKHNjLCBpKSkgewogCQkJCWF0aF90eF9zdG9wZG1hKHNjLCAmc2MtPnNjX3R4cVtpXSk7CkBAIC0xNDU0LDEwICsxMzQyLDExIEBACiAJCQkiJXM6IFVuYWJsZSB0byBzdG9wIFR4RE1BLiBSZXNldCBIQUwhXG4iLCBfX2Z1bmNfXyk7CiAKIAkJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcmVzZXRsb2NrKTsKLQkJaWYgKCFhdGg5a19od19yZXNldChhaCwgc2MtPnNjX29wbW9kZSwKLQkJCSZzYy0+c2NfY3VyY2hhbiwgaHRfbWFjbW9kZSwKLQkJCXNjLT5zY190eF9jaGFpbm1hc2ssIHNjLT5zY19yeF9jaGFpbm1hc2ssCi0JCQlzYy0+c2NfaHRfZXh0cHJvdHNwYWNpbmcsIHRydWUsICZzdGF0dXMpKSB7CisJCWlmICghYXRoOWtfaHdfcmVzZXQoYWgsCisJCQkJICAgIHNjLT5zY19haC0+YWhfY3VyY2hhbiwKKwkJCQkgICAgc2MtPnNjX2h0X2luZm8udHhfY2hhbl93aWR0aCwKKwkJCQkgICAgc2MtPnNjX3R4X2NoYWlubWFzaywgc2MtPnNjX3J4X2NoYWlubWFzaywKKwkJCQkgICAgc2MtPnNjX2h0X2V4dHByb3RzcGFjaW5nLCB0cnVlLCAmc3RhdHVzKSkgewogCiAJCQlEUFJJTlRGKHNjLCBBVEhfREJHX0ZBVEFMLAogCQkJCSIlczogdW5hYmxlIHRvIHJlc2V0IGhhcmR3YXJlOyBoYWwgc3RhdHVzICV1XG4iLApAQCAtMTQ4MSw3ICsxMzcwLDcgQEAKIHsKIAlpbnQgaW5kZXgsIGNpbmRleDsKIAotCWlmIChiZi0+YmZfaXNyZXRyaWVkKQorCWlmIChiZl9pc3JldHJpZWQoYmYpKQogCQlyZXR1cm47CiAKIAlpbmRleCAgPSBBVEhfQkFfSU5ERVgodGlkLT5zZXFfc3RhcnQsIGJmLT5iZl9zZXFubyk7CkBAIC0xNTE2LDcgKzE0MDUsNyBAQAogCUJVR19PTihsaXN0X2VtcHR5KGJmX2hlYWQpKTsKIAogCWJmID0gbGlzdF9maXJzdF9lbnRyeShiZl9oZWFkLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JYmYtPmJmX2lzYW1wZHUgPSAxOworCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9BTVBEVTsKIAliZi0+YmZfc2Vxbm8gPSB0eGN0bC0+c2Vxbm87IC8qIHNhdmUgc2Vxbm8gYW5kIHRpZG5vIGluIGJ1ZmZlciAqLwogCWJmLT5iZl90aWRubyA9IHR4Y3RsLT50aWRubzsKIApAQCAtMTg2MCw3ICsxNzQ5LDcgQEAKIAkJaWYgKGJmLT5iZl9uZnJhbWVzID09IDEpIHsKIAkJCUFTU0VSVChiZi0+YmZfbGFzdGZybSA9PSBiZl9sYXN0KTsKIAotCQkJYmYtPmJmX2lzYWdnciA9IDA7CisJCQliZi0+YmZfc3RhdGUuYmZfdHlwZSAmPSB+QlVGX0FHR1I7CiAJCQkvKgogCQkJICogY2xlYXIgYWdnciBiaXRzIGZvciBldmVyeSBkZXNjcmlwdG9yCiAJCQkgKiBYWFggVE9ETzogaXMgdGhlcmUgYSB3YXkgdG8gb3B0aW1pemUgaXQ/CkBAIC0xODc3LDcgKzE3NjYsNyBAQAogCQkvKgogCQkgKiBzZXR1cCBmaXJzdCBkZXNjIHdpdGggcmF0ZSBhbmQgYWdnciBpbmZvCiAJCSAqLwotCQliZi0+YmZfaXNhZ2dyICA9IDE7CisJCWJmLT5iZl9zdGF0ZS5iZl90eXBlIHw9IEJVRl9BR0dSOwogCQlhdGhfYnVmX3NldF9yYXRlKHNjLCBiZik7CiAJCWF0aDlrX2h3X3NldDExbl9hZ2dyX2ZpcnN0KHNjLT5zY19haCwgYmYtPmJmX2Rlc2MsIGJmLT5iZl9hbCk7CiAKQEAgLTE5MjUsNyArMTgxNCw3IEBACiAJCWxpc3RfY3V0X3Bvc2l0aW9uKCZiZl9oZWFkLCAmdGlkLT5idWZfcSwgJmJmLT5iZl9sYXN0ZnJtLT5saXN0KTsKIAogCQkvKiB1cGRhdGUgYmF3IGZvciBzb2Z0d2FyZSByZXRyaWVkIGZyYW1lICovCi0JCWlmIChiZi0+YmZfaXNyZXRyaWVkKQorCQlpZiAoYmZfaXNyZXRyaWVkKGJmKSkKIAkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIGJmLT5iZl9zZXFubyk7CiAKIAkJLyoKQEAgLTE5OTAsMTMgKzE4NzksMTggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJmX2hlYWQ7CiAJc3RydWN0IGF0aF9kZXNjICpkczsKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7Ci0Jc3RydWN0IGF0aF90eHEgKnR4cSA9ICZzYy0+c2NfdHhxW3R4Y3RsLT5xbnVtXTsKKwlzdHJ1Y3QgYXRoX3R4cSAqdHhxOwogCXN0cnVjdCBhdGhfdHhfaW5mb19wcml2ICp0eF9pbmZvX3ByaXY7CiAJc3RydWN0IGF0aF9yY19zZXJpZXMgKnJjczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9ICBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCisJaWYgKHVubGlrZWx5KHR4Y3RsLT5mbGFncyAmIEFUSDlLX1RYREVTQ19DQUIpKQorCQl0eHEgPSBzYy0+c2NfY2FicTsKKwllbHNlCisJCXR4cSA9ICZzYy0+c2NfdHhxW3R4Y3RsLT5xbnVtXTsKKwogCS8qIEZvciBlYWNoIHNnbGlzdCBlbnRyeSwgYWxsb2NhdGUgYW4gYXRoX2J1ZiBmb3IgRE1BICovCiAJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOwogCXNwaW5fbG9ja19iaCgmc2MtPnNjX3R4YnVmbG9jayk7CkBAIC0yMDE0LDExICsxOTA4LDIxIEBACiAJLyogc2V0IHVwIHRoaXMgYnVmZmVyICovCiAJQVRIX1RYQlVGX1JFU0VUKGJmKTsKIAliZi0+YmZfZnJtbGVuID0gdHhjdGwtPmZybWxlbjsKLQliZi0+YmZfaXNkYXRhID0gaWVlZTgwMjExX2lzX2RhdGEoZmMpOwotCWJmLT5iZl9pc2JhciA9IGllZWU4MDIxMV9pc19iYWNrX3JlcShmYyk7Ci0JYmYtPmJmX2lzcHNwb2xsID0gaWVlZTgwMjExX2lzX3BzcG9sbChmYyk7CisKKwlpZWVlODAyMTFfaXNfZGF0YShmYykgPworCQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX0RBVEEpIDoKKwkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICY9IH5CVUZfREFUQSk7CisJaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSA/CisJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSB8PSBCVUZfQkFSKSA6CisJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmPSB+QlVGX0JBUik7CisJaWVlZTgwMjExX2lzX3BzcG9sbChmYykgPworCQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX1BTUE9MTCkgOgorCQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgJj0gfkJVRl9QU1BPTEwpOworCShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9QUkVBTUJMRV9TSE9SVCkgPworCQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX1NIT1JUX1BSRUFNQkxFKSA6CisJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmPSB+QlVGX1NIT1JUX1BSRUFNQkxFKTsKKwogCWJmLT5iZl9mbGFncyA9IHR4Y3RsLT5mbGFnczsKLQliZi0+YmZfc2hwcmVhbWJsZSA9IHNjLT5zY19mbGFncyAmIEFUSF9QUkVBTUJMRV9TSE9SVDsKIAliZi0+YmZfa2V5dHlwZSA9IHR4Y3RsLT5rZXl0eXBlOwogCXR4X2luZm9fcHJpdiA9IChzdHJ1Y3QgYXRoX3R4X2luZm9fcHJpdiAqKXR4X2luZm8tPmRyaXZlcl9kYXRhWzBdOwogCXJjcyA9IHR4X2luZm9fcHJpdi0+cmNzOwpAQCAtMjAzOCw4ICsxOTQyLDcgQEAKIAkvKgogCSAqIFNhdmUgdGhlIERNQSBjb250ZXh0IGluIHRoZSBmaXJzdCBhdGhfYnVmCiAJICovCi0JY29weV9kbWFfbWVtX2NvbnRleHQoZ2V0X2RtYV9tZW1fY29udGV4dChiZiwgYmZfZG1hY29udGV4dCksCi0JCQkgICAgIGdldF9kbWFfbWVtX2NvbnRleHQodHhjdGwsIGRtYWNvbnRleHQpKTsKKwliZi0+YmZfZG1hY29udGV4dCA9IHR4Y3RsLT5kbWFjb250ZXh0OwogCiAJLyoKIAkgKiBGb3JtdWxhdGUgZmlyc3QgdHggZGVzY3JpcHRvciB3aXRoIHR4IGNvbnRyb2xzLgpAQCAtMjA2MCwxMSArMTk2MywxMyBAQAogCQkJICAgIGRzKTsgICAgICAgICAgICAgICAgLyogZmlyc3QgZGVzY3JpcHRvciAqLwogCiAJYmYtPmJmX2xhc3Rmcm0gPSBiZjsKLQliZi0+YmZfaHQgPSB0eGN0bC0+aHQ7CisJKHR4Y3RsLT5odCkgPworCQkoYmYtPmJmX3N0YXRlLmJmX3R5cGUgfD0gQlVGX0hUKSA6CisJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmPSB+QlVGX0hUKTsKIAogCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAKLQlpZiAodHhjdGwtPmh0ICYmIHNjLT5zY190eGFnZ3IpIHsKKwlpZiAodHhjdGwtPmh0ICYmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpKSB7CiAJCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkID0gQVRIX0FOXzJfVElEKGFuLCB0eGN0bC0+dGlkbm8pOwogCQlpZiAoYXRoX2FnZ3JfcXVlcnkoc2MsIGFuLCB0eGN0bC0+dGlkbm8pKSB7CiAJCQkvKgpAQCAtMjA5MCwyNyArMTk5NSw3IEBACiAJCQliZi0+YmZfdGlkbm8gPSB0eGN0bC0+dGlkbm87CiAJCX0KIAotCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKLQkJCXN0cnVjdCBhdGhfdmFwICphdnAgPSBzYy0+c2NfdmFwc1t0eGN0bC0+aWZfaWRdOwotCi0JCQkvKgotCQkJICogV2hlbiBzZXJ2aWNpbmcgb25lIG9yIG1vcmUgc3RhdGlvbnMgaW4gcG93ZXItc2F2ZQotCQkJICogbW9kZSAob3IpIGlmIHRoZXJlIGlzIHNvbWUgbWNhc3QgZGF0YSB3YWl0aW5nIG9uCi0JCQkgKiBtY2FzdCBxdWV1ZSAodG8gcHJldmVudCBvdXQgb2Ygb3JkZXIgZGVsaXZlcnkgb2YKLQkJCSAqIG1jYXN0LGJjYXN0IHBhY2tldHMpIG11bHRpY2FzdCBmcmFtZXMgbXVzdCBiZQotCQkJICogYnVmZmVyZWQgdW50aWwgYWZ0ZXIgdGhlIGJlYWNvbi4gV2UgdXNlIHRoZSBwcml2YXRlCi0JCQkgKiBtY2FzdCBxdWV1ZSBmb3IgdGhhdC4KLQkJCSAqLwotCQkJLyogWFhYPyBtb3JlIGJpdCBpbiA4MDIuMTEgZnJhbWUgaGVhZGVyICovCi0JCQlzcGluX2xvY2tfYmgoJmF2cC0+YXZfbWNhc3RxLmF4cV9sb2NrKTsKLQkJCWlmICh0eGN0bC0+cHMgfHwgYXZwLT5hdl9tY2FzdHEuYXhxX2RlcHRoKQotCQkJCWF0aF90eF9tY2FzdHFhZGRidWYoc2MsCi0JCQkJCSZhdnAtPmF2X21jYXN0cSwgJmJmX2hlYWQpOwotCQkJZWxzZQotCQkJCWF0aF90eF90eHFhZGRidWYoc2MsIHR4cSwgJmJmX2hlYWQpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmF2cC0+YXZfbWNhc3RxLmF4cV9sb2NrKTsKLQkJfSBlbHNlCi0JCQlhdGhfdHhfdHhxYWRkYnVmKHNjLCB0eHEsICZiZl9oZWFkKTsKKwkJYXRoX3R4X3R4cWFkZGJ1ZihzYywgdHhxLCAmYmZfaGVhZCk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTIxMTgsMzAgKzIwMDMsMzEgQEAKIAogc3RhdGljIHZvaWQgeG1pdF9tYXBfc2coc3RydWN0IGF0aF9zb2Z0YyAqc2MsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJZG1hX2FkZHJfdCAqcGEsCiAJCQlzdHJ1Y3QgYXRoX3R4X2NvbnRyb2wgKnR4Y3RsKQogewogCXN0cnVjdCBhdGhfeG1pdF9zdGF0dXMgdHhfc3RhdHVzOwogCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAotCSpwYSA9IHBjaV9tYXBfc2luZ2xlKHNjLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0eGN0bC0+ZG1hY29udGV4dCA9IHBjaV9tYXBfc2luZ2xlKHNjLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCS8qIHNldHVwIFMvRyBsaXN0ICovCiAJbWVtc2V0KCZzZywgMCwgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkpOwotCXNnX2RtYV9hZGRyZXNzKCZzZykgPSAqcGE7CisJc2dfZG1hX2FkZHJlc3MoJnNnKSA9IHR4Y3RsLT5kbWFjb250ZXh0OwogCXNnX2RtYV9sZW4oJnNnKSA9IHNrYi0+bGVuOwogCiAJaWYgKGF0aF90eF9zdGFydF9kbWEoc2MsIHNrYiwgJnNnLCAxLCB0eGN0bCkgIT0gMCkgewogCQkvKgogCQkgKiAgV2UgaGF2ZSB0byBkbyBkcm9wIGZyYW1lIGhlcmUuCiAJCSAqLwotCQlwY2lfdW5tYXBfc2luZ2xlKHNjLT5wZGV2LCAqcGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcGNpX3VubWFwX3NpbmdsZShzYy0+cGRldiwgdHhjdGwtPmRtYWNvbnRleHQsCisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCQl0eF9zdGF0dXMucmV0cmllcyA9IDA7CiAJCXR4X3N0YXR1cy5mbGFncyA9IEFUSF9UWF9FUlJPUjsKIAotCQlpZiAodHhjdGwtPmh0ICYmIHNjLT5zY190eGFnZ3IpIHsKKwkJaWYgKHR4Y3RsLT5odCAmJiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSkgewogCQkJLyogUmVjbGFpbSB0aGUgc2Vxbm8uICovCiAJCQl0aWQgPSBBVEhfQU5fMl9USUQoKHN0cnVjdCBhdGhfbm9kZSAqKQogCQkJCXR4Y3RsLT5hbiwgdHhjdGwtPnRpZG5vKTsKQEAgLTIxNjIsNyArMjA0OCw3IEBACiAKIAkJLyogU2V0dXAgdHggZGVzY3JpcHRvcnMgKi8KIAkJZXJyb3IgPSBhdGhfZGVzY2RtYV9zZXR1cChzYywgJnNjLT5zY190eGRtYSwgJnNjLT5zY190eGJ1ZiwKLQkJCSJ0eCIsIG5idWZzICogQVRIX0ZSQUdfUEVSX01TRFUsIEFUSF9UWERFU0MpOworCQkJInR4IiwgbmJ1ZnMsIDEpOwogCQlpZiAoZXJyb3IgIT0gMCkgewogCQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwKIAkJCQkiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSB0eCBkZXNjcmlwdG9yczogJWRcbiIsCkBAIC0yMjEyLDcgKzIwOTgsNyBAQAogCXN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvIHFpOwogCWludCBxbnVtOwogCi0JbWVtemVybygmcWksIHNpemVvZihxaSkpOworCW1lbXNldCgmcWksIDAsIHNpemVvZihxaSkpOwogCXFpLnRxaV9zdWJ0eXBlID0gc3VidHlwZTsKIAlxaS50cWlfYWlmcyA9IEFUSDlLX1RYUV9VU0VERUZBVUxUOwogCXFpLnRxaV9jd21pbiA9IEFUSDlLX1RYUV9VU0VERUZBVUxUOwpAQCAtMjQwMyw2ICsyMjg5LDcgQEAKIAlzdHJ1Y3QgYXRoX3R4X2NvbnRyb2wgdHhjdGw7CiAJaW50IGVycm9yID0gMDsKIAorCW1lbXNldCgmdHhjdGwsIDAsIHNpemVvZihzdHJ1Y3QgYXRoX3R4X2NvbnRyb2wpKTsKIAllcnJvciA9IGF0aF90eF9wcmVwYXJlKHNjLCBza2IsICZ0eGN0bCk7CiAJaWYgKGVycm9yID09IDApCiAJCS8qCkBAIC0yNDEwLDkgKzIyOTcsNyBAQAogCQkgKiBhdGhfdHhfc3RhcnRfZG1hKCkgd2lsbCBiZSBjYWxsZWQgZWl0aGVyIHN5bmNocm9ub3VzbHkKIAkJICogb3IgYXN5bmNocm91bnNseSBvbmNlIERNQSBpcyBjb21wbGV0ZS4KIAkJICovCi0JCXhtaXRfbWFwX3NnKHNjLCBza2IsCi0JCQkgICAgZ2V0X2RtYV9tZW1fY29udGV4dCgmdHhjdGwsIGRtYWNvbnRleHQpLAotCQkJICAgICZ0eGN0bCk7CisJCXhtaXRfbWFwX3NnKHNjLCBza2IsICZ0eGN0bCk7CiAJZWxzZQogCQlhdGhfbm9kZV9wdXQoc2MsIHR4Y3RsLmFuLCBBVEg5S19CSF9TVEFUVVNfQ0hBTkdFKTsKIApAQCAtMjQyNCw4ICsyMzA5LDcgQEAKIAogdm9pZCBhdGhfdHhfdGFza2xldChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKLQl1NjQgdHNmID0gYXRoOWtfaHdfZ2V0dHNmNjQoc2MtPnNjX2FoKTsKLQlpbnQgaSwgbmFja2VkID0gMDsKKwlpbnQgaTsKIAl1MzIgcWN1bWFzayA9ICgoMSA8PCBBVEg5S19OVU1fVFhfUVVFVUVTKSAtIDEpOwogCiAJYXRoOWtfaHdfZ2V0dHhpbnRydHhxcyhzYy0+c2NfYWgsICZxY3VtYXNrKTsKQEAgLTI0MzUsMTAgKzIzMTksOCBAQAogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBBVEg5S19OVU1fVFhfUVVFVUVTOyBpKyspIHsKIAkJaWYgKEFUSF9UWFFfU0VUVVAoc2MsIGkpICYmIChxY3VtYXNrICYgKDEgPDwgaSkpKQotCQkJbmFja2VkICs9IGF0aF90eF9wcm9jZXNzcShzYywgJnNjLT5zY190eHFbaV0pOworCQkJYXRoX3R4X3Byb2Nlc3NxKHNjLCAmc2MtPnNjX3R4cVtpXSk7CiAJfQotCWlmIChuYWNrZWQpCi0JCXNjLT5zY19sYXN0cnggPSB0c2Y7CiB9CiAKIHZvaWQgYXRoX3R4X2RyYWludHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjLApAQCAtMjQ4NiwxNCArMjM2OCwxNCBAQAogCiAJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAotCQlpZiAoYmYtPmJmX2lzYW1wZHUpCisJCWlmIChiZl9pc2FtcGR1KGJmKSkKIAkJCWF0aF90eF9jb21wbGV0ZV9hZ2dyX3JpZnMoc2MsIHR4cSwgYmYsICZiZl9oZWFkLCAwKTsKIAkJZWxzZQogCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsICZiZl9oZWFkLCAwLCAwKTsKIAl9CiAKIAkvKiBmbHVzaCBhbnkgcGVuZGluZyBmcmFtZXMgaWYgYWdncmVnYXRpb24gaXMgZW5hYmxlZCAqLwotCWlmIChzYy0+c2NfdHhhZ2dyKSB7CisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgewogCQlpZiAoIXJldHJ5X3R4KSB7CiAJCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCQkJYXRoX3R4cV9kcmFpbl9wZW5kaW5nX2J1ZmZlcnMoc2MsIHR4cSwKQEAgLTI1MDksNyArMjM5MSw3IEBACiB7CiAJLyogc3RvcCBiZWFjb24gcXVldWUuIFRoZSBiZWFjb24gd2lsbCBiZSBmcmVlZCB3aGVuCiAJICogd2UgZ28gdG8gSU5JVCBzdGF0ZSAqLwotCWlmICghc2MtPnNjX2ludmFsaWQpIHsKKwlpZiAoIShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKSkgewogCQkodm9pZCkgYXRoOWtfaHdfc3RvcHR4ZG1hKHNjLT5zY19haCwgc2MtPnNjX2JoYWxxKTsKIAkJRFBSSU5URihzYywgQVRIX0RCR19YTUlULCAiJXM6IGJlYWNvbiBxdWV1ZSAleFxuIiwgX19mdW5jX18sCiAJCQlhdGg5a19od19nZXR0eGJ1ZihzYy0+c2NfYWgsIHNjLT5zY19iaGFscSkpOwpAQCAtMjUzNiw3ICsyNDE4LDcgQEAKIAlzdHJ1Y3QgYXRoX2F0eF90aWQgKnR4dGlkOwogCURFQ0xBUkVfTUFDX0JVRihtYWMpOwogCi0JaWYgKCFzYy0+c2NfdHhhZ2dyKQorCWlmICghKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikpCiAJCXJldHVybiBBR0dSX05PVF9SRVFVSVJFRDsKIAogCS8qIEFEREJBIGV4Y2hhbmdlIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBzZW5kaW5nIGFnZ3JlZ2F0ZXMgKi8KQEAgLTI1ODMsNyArMjQ2NSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoc2MtPnNjX3R4YWdncikgeworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpIHsKIAkJdHh0aWQgPSBBVEhfQU5fMl9USUQoYW4sIHRpZCk7CiAJCXR4dGlkLT5hZGRiYV9leGNoYW5nZWlucHJvZ3Jlc3MgPSAxOwogCQlhdGhfdHhfcGF1c2VfdGlkKHNjLCB0eHRpZCk7CkBAIC0yNjQ3LDcgKzI1MjksNyBAQAogCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0eHRpZC0+YnVmX3EpKSB7CiAJCWJmID0gbGlzdF9maXJzdF9lbnRyeSgmdHh0aWQtPmJ1Zl9xLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7Ci0JCWlmICghYmYtPmJmX2lzcmV0cmllZCkgeworCQlpZiAoIWJmX2lzcmV0cmllZChiZikpIHsKIAkJCS8qCiAJCQkgKiBOQjogaXQncyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CiAJCQkgKiBzb2Z0d2FyZSByZXRyaWVkIGZyYW1lIHdpbGwgYWx3YXlzIHN0YXkKQEAgLTI3NDMsNyArMjYyNSw3IEBACiAKIHZvaWQgYXRoX3R4X25vZGVfaW5pdChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9ub2RlICphbikKIHsKLQlpZiAoc2MtPnNjX3R4YWdncikgeworCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpIHsKIAkJc3RydWN0IGF0aF9hdHhfdGlkICp0aWQ7CiAJCXN0cnVjdCBhdGhfYXR4X2FjICphYzsKIAkJaW50IHRpZG5vLCBhY25vOwpAQCAtMjg1NSw3ICsyNzM3LDcgQEAKIAogdm9pZCBhdGhfdHhfbm9kZV9mcmVlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX25vZGUgKmFuKQogewotCWlmIChzYy0+c2NfdHhhZ2dyKSB7CisJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgewogCQlzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZDsKIAkJaW50IHRpZG5vLCBpOwogCkBAIC0yODY5LDMgKzI3NTEsNTcgQEAKIAkJfQogCX0KIH0KKwordm9pZCBhdGhfdHhfY2FicShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaGRybGVuLCBwYWRzaXplOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgYXRoX3R4X2NvbnRyb2wgdHhjdGw7CisKKwkvKgorCSAqIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQsIGFzc2lnbiBzZXEjIGhlcmU7IHRoaXMgd2lsbCBsaWtlbHkgbmVlZAorCSAqIHRvIGJlIGNsZWFuZWQgdXAgdG8gd29yayBiZXR0ZXIgd2l0aCBCZWFjb24gdHJhbnNtaXNzaW9uIGFuZCB2aXJ0dWFsCisJICogQlNTZXMuCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UKQorCQkJc2MtPnNlcV9ubyArPSAweDEwOworCQloZHItPnNlcV9jdHJsICY9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOworCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNjLT5zZXFfbm8pOworCX0KKworCS8qIEFkZCB0aGUgcGFkZGluZyBhZnRlciB0aGUgaGVhZGVyIGlmIHRoaXMgaXMgbm90IGFscmVhZHkgZG9uZSAqLworCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKHNrYik7CisJaWYgKGhkcmxlbiAmIDMpIHsKKwkJcGFkc2l6ZSA9IGhkcmxlbiAlIDQ7CisJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHBhZHNpemUpIHsKKwkJCURQUklOVEYoc2MsIEFUSF9EQkdfWE1JVCwgIiVzOiBUWCBDQUJRIHBhZGRpbmcgIgorCQkJCSJmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiX3B1c2goc2tiLCBwYWRzaXplKTsKKwkJbWVtbW92ZShza2ItPmRhdGEsIHNrYi0+ZGF0YSArIHBhZHNpemUsIGhkcmxlbik7CisJfQorCisJRFBSSU5URihzYywgQVRIX0RCR19YTUlULCAiJXM6IHRyYW5zbWl0dGluZyBDQUJRIHBhY2tldCwgc2tiOiAlcFxuIiwKKwkJX19mdW5jX18sCisJCXNrYik7CisKKwltZW1zZXQoJnR4Y3RsLCAwLCBzaXplb2Yoc3RydWN0IGF0aF90eF9jb250cm9sKSk7CisJdHhjdGwuZmxhZ3MgPSBBVEg5S19UWERFU0NfQ0FCOworCWlmIChhdGhfdHhfcHJlcGFyZShzYywgc2tiLCAmdHhjdGwpID09IDApIHsKKwkJLyoKKwkJICogU3RhcnQgRE1BIG1hcHBpbmcuCisJCSAqIGF0aF90eF9zdGFydF9kbWEoKSB3aWxsIGJlIGNhbGxlZCBlaXRoZXIgc3luY2hyb25vdXNseQorCQkgKiBvciBhc3luY2hyb3Vuc2x5IG9uY2UgRE1BIGlzIGNvbXBsZXRlLgorCQkgKi8KKwkJeG1pdF9tYXBfc2coc2MsIHNrYiwgJnR4Y3RsKTsKKwl9IGVsc2UgeworCQlhdGhfbm9kZV9wdXQoc2MsIHR4Y3RsLmFuLCBBVEg5S19CSF9TVEFUVVNfQ0hBTkdFKTsKKwkJRFBSSU5URihzYywgQVRIX0RCR19YTUlULCAiJXM6IFRYIENBQlEgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCBiZDY1YzQ4Li5lY2IwMmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTIyNTgsNyArMjI1OCw3IEBACiAKIHN0YXRpYyBpbnQgYXRtZWxfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCiAJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IDEyNjE3Y2QuLjc3NDA2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJREVCVUcoMCwgImF0bWVsX2F0dGFjaCgpXG4iKTsKIAogCS8qIEludGVycnVwdCBzZXR1cCAqLwotCXBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKwlwX2Rldi0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAJcF9kZXYtPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKIAlwX2Rldi0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCkBAIC0yMjQsMTMgKzIyNCw1OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0bWVsX2NvbmZpZ19jaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgICAgdW5zaWduZWQgaW50IHZjYywKKwkJCSAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLworCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQlwX2Rldi0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwl9CisKKwkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQlwX2Rldi0+Y29uZi5WcHAgPSBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCWVsc2UgaWYgKGRmbHQtPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9IGRmbHQtPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCisJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQtPmlycS5JUlFJbmZvMSkKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQl9CisJfQorCisJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworfQorCiBzdGF0aWMgaW50IGF0bWVsX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7CiAJbG9jYWxfaW5mb190ICpkZXY7CiAJaW50IGxhc3RfZm4sIGxhc3RfcmV0OwotCXVfY2hhciBidWZbNjRdOwogCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQ7CiAKIAlkZXYgPSBsaW5rLT5wcml2OwpAQCAtMjM4LDExICsyODMsNiBAQAogCiAJREVCVUcoMCwgImF0bWVsX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCiAJLyoKIAkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCiAJICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCkBAIC0yNTUsNjYgKzI5NSw4IEBACiAJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCiAJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCiAJKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXdoaWxlICgxKSB7Ci0JCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OwotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOwotCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQkJCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOwotCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCi0JCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLwotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7Ci0JCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKLQkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7Ci0JCX0KLQotCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KLQkJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCi0JCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKLQkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0KLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSAhPSAwKQotCQkJZ290byBuZXh0X2VudHJ5OwotCi0JCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KLQkJYnJlYWs7Ci0KLQluZXh0X2VudHJ5OgotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl9CisJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBhdG1lbF9jb25maWdfY2hlY2ssIE5VTEwpKQorCQlnb3RvIGZhaWxlZDsKIAogCS8qCiAJICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCkBAIC0zNjAsNiArMzQyLDcgQEAKIAogIGNzX2ZhaWxlZDoKIAljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisgZmFpbGVkOgogCWF0bWVsX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCmluZGV4IDFmYTA0M2QuLjFmODFkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9LY29uZmlnCkBAIC04MCw2ICs4MCwxOCBAQAogCiAJICBTQVkgTi4KIAorY29uZmlnIEI0M19QSFlfTFAKKwlib29sICJJRUVFIDgwMi4xMWcgTFAtUEhZIHN1cHBvcnQgKEJST0tFTikiCisJZGVwZW5kcyBvbiBCNDMgJiYgRVhQRVJJTUVOVEFMICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBMUC1QSFkuCisJICBUaGUgTFAtUEhZIGlzIGFuIElFRUUgODAyLjExZyBiYXNlZCBQSFkgYnVpbHQgaW50byBzb21lIG5vdGVib29rcworCSAgYW5kIGVtYmVkZGVkIGRldmljZXMuCisKKwkgIFRISVMgSVMgQlJPS0VOIEFORCBET0VTIE5PVCBXT1JLIFlFVC4KKworCSAgU0FZIE4uCisKICMgVGhpcyBjb25maWcgb3B0aW9uIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBiNDMgTEVEUyBzdXBwb3J0LAogIyBpZiBpdCdzIHBvc3NpYmxlLgogY29uZmlnIEI0M19MRURTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvTWFrZWZpbGUKaW5kZXggOGM1MmIwYi4uMTRhMDJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9NYWtlZmlsZQpAQCAtMSw4ICsxLDExIEBACiBiNDMteQkJCQkrPSBtYWluLm8KIGI0My15CQkJCSs9IHRhYmxlcy5vCiBiNDMtJChDT05GSUdfQjQzX05QSFkpCQkrPSB0YWJsZXNfbnBoeS5vCi1iNDMteQkJCQkrPSBwaHkubwotYjQzLSQoQ09ORklHX0I0M19OUEhZKQkJKz0gbnBoeS5vCitiNDMteQkJCQkrPSBwaHlfY29tbW9uLm8KK2I0My15CQkJCSs9IHBoeV9nLm8KK2I0My15CQkJCSs9IHBoeV9hLm8KK2I0My0kKENPTkZJR19CNDNfTlBIWSkJCSs9IHBoeV9uLm8KK2I0My0kKENPTkZJR19CNDNfUEhZX0xQKQkrPSBwaHlfbHAubwogYjQzLXkJCQkJKz0gc3lzZnMubwogYjQzLXkJCQkJKz0geG1pdC5vCiBiNDMteQkJCQkrPSBsby5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKaW5kZXggZWRjZGZhMy4uNDI3YjgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaApAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgImxlZHMuaCIKICNpbmNsdWRlICJyZmtpbGwuaCIKICNpbmNsdWRlICJsby5oIgotI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgInBoeV9jb21tb24uaCIKIAogCiAvKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpcm13YXJlIHRoYXQncyBvZmZpY2lhbGx5IHN1cHBvcnRlZCBieQpAQCAtMTczLDYgKzE3MywxMSBAQAogI2RlZmluZSBCNDNfU0hNX1NIX0NIQU4JCQkweDAwQTAJLyogQ3VycmVudCBjaGFubmVsIChsb3cgOGJpdCBvbmx5KSAqLwogI2RlZmluZSAgQjQzX1NITV9TSF9DSEFOXzVHSFoJCTB4MDEwMAkvKiBCaXQgc2V0LCBpZiA1R2h6IGNoYW5uZWwgKi8KICNkZWZpbmUgQjQzX1NITV9TSF9CQ01DRklGT0lECQkweDAxMDgJLyogTGFzdCBwb3N0ZWQgY29va2llIHRvIHRoZSBiY2FzdC9tY2FzdCBGSUZPICovCisvKiBUU1NJIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEI0M19TSE1fU0hfVFNTSV9DQ0sJCTB4MDA1OAkvKiBUU1NJIGZvciBsYXN0IDQgQ0NLIGZyYW1lcyAoMzJiaXQpICovCisjZGVmaW5lIEI0M19TSE1fU0hfVFNTSV9PRkRNX0EJCTB4MDA2OAkvKiBUU1NJIGZvciBsYXN0IDQgT0ZETSBmcmFtZXMgKDMyYml0KSAqLworI2RlZmluZSBCNDNfU0hNX1NIX1RTU0lfT0ZETV9HCQkweDAwNzAJLyogVFNTSSBmb3IgbGFzdCA0IE9GRE0gZnJhbWVzICgzMmJpdCkgKi8KKyNkZWZpbmUgIEI0M19UU1NJX01BWAkJCTB4N0YJLyogTWF4IHZhbHVlIGZvciBvbmUgVFNTSSB2YWx1ZSAqLwogLyogU0hNX1NIQVJFRCBUWCBGSUZPIHZhcmlhYmxlcyAqLwogI2RlZmluZSBCNDNfU0hNX1NIX1NJWkUwMQkJMHgwMDk4CS8qIFRYIEZJRk8gc2l6ZSBmb3IgRklGTyAwIChsb3cpIGFuZCAxIChoaWdoKSAqLwogI2RlZmluZSBCNDNfU0hNX1NIX1NJWkUyMwkJMHgwMDlBCS8qIFRYIEZJRk8gc2l6ZSBmb3IgRklGTyAyIGFuZCAzICovCkBAIC01MDgsMTIyICs1MTMsNiBAQAogfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIAotc3RydWN0IGI0M19waHkgewotCS8qIEJhbmQgc3VwcG9ydCBmbGFncy4gKi8KLQlib29sIHN1cHBvcnRzXzJnaHo7Ci0JYm9vbCBzdXBwb3J0c181Z2h6OwotCi0JLyogR01PREUgYml0IGVuYWJsZWQ/ICovCi0JYm9vbCBnbW9kZTsKLQotCS8qIEFuYWxvZyBUeXBlICovCi0JdTggYW5hbG9nOwotCS8qIEI0M19QSFlUWVBFXyAqLwotCXU4IHR5cGU7Ci0JLyogUEhZIHJldmlzaW9uIG51bWJlci4gKi8KLQl1OCByZXY7Ci0KLQkvKiBSYWRpbyB2ZXJzaW9uaW5nICovCi0JdTE2IHJhZGlvX21hbnVmOwkvKiBSYWRpbyBtYW51ZmFjdHVyZXIgKi8KLQl1MTYgcmFkaW9fdmVyOwkJLyogUmFkaW8gdmVyc2lvbiAqLwotCXU4IHJhZGlvX3JldjsJCS8qIFJhZGlvIHJldmlzaW9uICovCi0KLQlib29sIGR5bl90c3NpX3RibDsJLyogdHNzaTJkYm0gaXMga21hbGxvYygpZWQuICovCi0KLQkvKiBBQ0kgKGFkamFjZW50IGNoYW5uZWwgaW50ZXJmZXJlbmNlKSBmbGFncy4gKi8KLQlib29sIGFjaV9lbmFibGU7Ci0JYm9vbCBhY2lfd2xhbl9hdXRvbWF0aWM7Ci0JYm9vbCBhY2lfaHdfcnNzaTsKLQotCS8qIFJhZGlvIHN3aXRjaGVkIG9uL29mZiAqLwotCWJvb2wgcmFkaW9fb247Ci0Jc3RydWN0IHsKLQkJLyogVmFsdWVzIHNhdmVkIHdoZW4gdHVybmluZyB0aGUgcmFkaW8gb2ZmLgotCQkgKiBUaGV5IGFyZSBuZWVkZWQgd2hlbiB0dXJuaW5nIGl0IG9uIGFnYWluLiAqLwotCQlib29sIHZhbGlkOwotCQl1MTYgcmZvdmVyOwotCQl1MTYgcmZvdmVydmFsOwotCX0gcmFkaW9fb2ZmX2NvbnRleHQ7Ci0KLQl1MTYgbWlubG93c2lnWzJdOwotCXUxNiBtaW5sb3dzaWdwb3NbMl07Ci0KLQkvKiBUU1NJIHRvIGRCbSB0YWJsZSBpbiB1c2UgKi8KLQljb25zdCBzOCAqdHNzaTJkYm07Ci0JLyogVGFyZ2V0IGlkbGUgVFNTSSAqLwotCWludCB0Z3RfaWRsZV90c3NpOwotCS8qIEN1cnJlbnQgaWRsZSBUU1NJICovCi0JaW50IGN1cl9pZGxlX3Rzc2k7Ci0KLQkvKiBMb2NhbE9zY2lsbGF0b3IgY29udHJvbCB2YWx1ZXMuICovCi0Jc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvX2NvbnRyb2w7Ci0JLyogVmFsdWVzIGZyb20gYjQzX2NhbGNfbG9vcGJhY2tfZ2FpbigpICovCi0JczE2IG1heF9sYl9nYWluOwkvKiBNYXhpbXVtIExvb3BiYWNrIGdhaW4gaW4gaGRCICovCi0JczE2IHRyc3dfcnhfZ2FpbjsJLyogVFJTVyBSWCBnYWluIGluIGhkQiAqLwotCXMxNiBsbmFfbG9kX2dhaW47CS8qIExOQSBsb2QgKi8KLQlzMTYgbG5hX2dhaW47CQkvKiBMTkEgKi8KLQlzMTYgcGdhX2dhaW47CQkvKiBQR0EgKi8KLQotCS8qIERlc2lyZWQgVFggcG93ZXIgbGV2ZWwgKGluIGRCbSkuCi0JICogVGhpcyBpcyBzZXQgYnkgdGhlIHVzZXIgYW5kIGFkanVzdGVkIGluIGI0M19waHlfeG1pdHBvd2VyKCkuICovCi0JdTggcG93ZXJfbGV2ZWw7Ci0JLyogQS1QSFkgVFggUG93ZXIgY29udHJvbCB2YWx1ZS4gKi8KLQl1MTYgdHhwd3Jfb2Zmc2V0OwotCi0JLyogQ3VycmVudCBUWCBwb3dlciBsZXZlbCBhdHRlbnVhdGlvbiBjb250cm9sIHZhbHVlcyAqLwotCXN0cnVjdCBiNDNfYmJhdHQgYmJhdHQ7Ci0Jc3RydWN0IGI0M19yZmF0dCByZmF0dDsKLQl1OCB0eF9jb250cm9sOwkJLyogQjQzX1RYQ1RMX1hYWCAqLwotCi0JLyogSGFyZHdhcmUgUG93ZXIgQ29udHJvbCBlbmFibGVkPyAqLwotCWJvb2wgaGFyZHdhcmVfcG93ZXJfY29udHJvbDsKLQotCS8qIEN1cnJlbnQgSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gbW9kZSAqLwotCWludCBpbnRlcmZtb2RlOwotCS8qIFN0YWNrIG9mIHNhdmVkIHZhbHVlcyBmcm9tIHRoZSBJbnRlcmZlcmVuY2UgTWl0aWdhdGlvbiBjb2RlLgotCSAqIEVhY2ggdmFsdWUgaW4gdGhlIHN0YWNrIGlzIGxheWVkIG91dCBhcyBmb2xsb3dzOgotCSAqIGJpdCAwLTExOiAgb2Zmc2V0Ci0JICogYml0IDEyLTE1OiByZWdpc3RlciBJRAotCSAqIGJpdCAxNi0zMjogdmFsdWUKLQkgKiByZWdpc3RlciBJRCBpczogMHgxIFBIWSwgMHgyIFJhZGlvLCAweDMgSUxUCi0JICovCi0jZGVmaW5lIEI0M19JTlRFUkZTVEFDS19TSVpFCTI2Ci0JdTMyIGludGVyZnN0YWNrW0I0M19JTlRFUkZTVEFDS19TSVpFXTsJLy9GSVhNRTogdXNlIGEgZGF0YSBzdHJ1Y3R1cmUKLQotCS8qIFNhdmVkIHZhbHVlcyBmcm9tIHRoZSBOUlNTSSBTbG9wZSBjYWxjdWxhdGlvbiAqLwotCXMxNiBucnNzaVsyXTsKLQlzMzIgbnJzc2lzbG9wZTsKLQkvKiBJbiBtZW1vcnkgbnJzc2kgbG9va3VwIHRhYmxlLiAqLwotCXM4IG5yc3NpX2x0WzY0XTsKLQotCS8qIGN1cnJlbnQgY2hhbm5lbCAqLwotCXU4IGNoYW5uZWw7Ci0KLQl1MTYgbG9mY2FsOwotCi0JdTE2IGluaXR2YWw7CQkvL0ZJWE1FIHJlbmFtZT8KLQotCS8qIFBIWSBUWCBlcnJvcnMgY291bnRlci4gKi8KLQlhdG9taWNfdCB0eGVycl9jbnQ7Ci0KLQkvKiBUaGUgZGV2aWNlIGRvZXMgYWRkcmVzcyBhdXRvIGluY3JlbWVudCBmb3IgdGhlIE9GRE0gdGFibGVzLgotCSAqIFdlIGNhY2hlIHRoZSBwcmV2aW91c2x5IHVzZWQgYWRkcmVzcyBoZXJlIGFuZCBvbWl0IHRoZSBhZGRyZXNzCi0JICogd3JpdGUgb24gdGhlIG5leHQgdGFibGUgYWNjZXNzLCBpZiBwb3NzaWJsZS4gKi8KLQl1MTYgb2ZkbXRhYl9hZGRyOyAvKiBUaGUgYWRkcmVzcyBjdXJyZW50bHkgc2V0IGluIGhhcmR3YXJlLiAqLwotCWVudW0geyAvKiBUaGUgbGFzdCBkYXRhIGZsb3cgZGlyZWN0aW9uLiAqLwotCQlCNDNfT0ZETVRBQl9ESVJFQ1RJT05fVU5LTk9XTiA9IDAsCi0JCUI0M19PRkRNVEFCX0RJUkVDVElPTl9SRUFELAotCQlCNDNfT0ZETVRBQl9ESVJFQ1RJT05fV1JJVEUsCi0JfSBvZmRtdGFiX2FkZHJfZGlyZWN0aW9uOwotCi0jaWYgQjQzX0RFQlVHCi0JLyogTWFudWFsIFRYLXBvd2VyIGNvbnRyb2wgZW5hYmxlZD8gKi8KLQlib29sIG1hbnVhbF90eHBvd2VyX2NvbnRyb2w7Ci0JLyogUEhZIHJlZ2lzdGVycyBsb2NrZWQgYnkgYjQzX3BoeV9sb2NrKCk/ICovCi0JYm9vbCBwaHlfbG9ja2VkOwotI2VuZGlmIC8qIEI0M19ERUJVRyAqLwotfTsKLQogLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBETUEgdHJhbnNtaXNzaW9uLCBwZXIgODAyMTEgY29yZS4gKi8KIHN0cnVjdCBiNDNfZG1hIHsKIAlzdHJ1Y3QgYjQzX2RtYXJpbmcgKnR4X3JpbmdfQUNfQks7IC8qIEJhY2tncm91bmQgKi8KQEAgLTY4MCw3ICs1NjksNyBAQAogI2RlZmluZSBCNDNfUU9TX1ZPSUNFCQlCNDNfUU9TX1BBUkFNUygzKQogCiAvKiBRT1MgcGFyYW1ldGVyIGhhcmR3YXJlIGRhdGEgc3RydWN0dXJlIG9mZnNldHMuICovCi0jZGVmaW5lIEI0M19OUl9RT1NQQVJBTVMJMjIKKyNkZWZpbmUgQjQzX05SX1FPU1BBUkFNUwkxNgogZW51bSB7CiAJQjQzX1FPU1BBUkFNX1RYT1AgPSAwLAogCUI0M19RT1NQQVJBTV9DV01JTiwKQEAgLTY5Niw4ICs1ODUsNiBAQAogc3RydWN0IGI0M19xb3NfcGFyYW1zIHsKIAkvKiBUaGUgUU9TIHBhcmFtZXRlcnMgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyBwOwotCS8qIERvZXMgdGhpcyBuZWVkIHRvIGdldCB1cGxvYWRlZCB0byBoYXJkd2FyZT8gKi8KLQlib29sIG5lZWRfaHdfdXBkYXRlOwogfTsKIAogc3RydWN0IGI0M193bGRldjsKQEAgLTc1OSwxMSArNjQ2LDEzIEBACiAJYm9vbCBiZWFjb25fdGVtcGxhdGVzX3ZpcmdpbjsgLyogTmV2ZXIgd3JvdGUgdGhlIHRlbXBsYXRlcz8gKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmVhY29uX3VwZGF0ZV90cmlnZ2VyOwogCi0JLyogVGhlIGN1cnJlbnQgUU9TIHBhcmFtZXRlcnMgZm9yIHRoZSA0IHF1ZXVlcy4KLQkgKiBUaGlzIGlzIHByb3RlY3RlZCBieSB0aGUgaXJxX2xvY2suICovCisJLyogVGhlIGN1cnJlbnQgUU9TIHBhcmFtZXRlcnMgZm9yIHRoZSA0IHF1ZXVlcy4gKi8KIAlzdHJ1Y3QgYjQzX3Fvc19wYXJhbXMgcW9zX3BhcmFtc1s0XTsKLQkvKiBXb3JrcXVldWUgZm9yIHVwZGF0aW5nIFFPUyBwYXJhbWV0ZXJzIGluIGhhcmR3YXJlLiAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBxb3NfdXBkYXRlX3dvcms7CisKKwkvKiBXb3JrIGZvciBhZGp1c3RtZW50IG9mIHRoZSB0cmFuc21pc3Npb24gcG93ZXIuCisJICogVGhpcyBpcyBzY2hlZHVsZWQgd2hlbiB3ZSBkZXRlcm1pbmUgdGhhdCB0aGUgYWN0dWFsIFRYIG91dHB1dAorCSAqIHBvd2VyIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3ZSB3YW50LiAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eHBvd2VyX2FkanVzdF93b3JrOwogfTsKIAogLyogSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGEgY2FjaGVkIG1pY3JvY29kZSBmaWxlLiAqLwpAQCAtOTA4LDYgKzc5NywxNSBAQAogCXJldHVybiAod2wtPm9wZXJhdGluZyAmJiB3bC0+aWZfdHlwZSA9PSB0eXBlKTsKIH0KIAorLyoqCisgKiBiNDNfY3VycmVudF9iYW5kIC0gUmV0dXJucyB0aGUgY3VycmVudGx5IHVzZWQgYmFuZC4KKyAqIFJldHVybnMgb25lIG9mIElFRUU4MDIxMV9CQU5EXzJHSFogYW5kIElFRUU4MDIxMV9CQU5EXzVHSFouCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBpZWVlODAyMTFfYmFuZCBiNDNfY3VycmVudF9iYW5kKHN0cnVjdCBiNDNfd2wgKndsKQoreworCXJldHVybiB3bC0+aHctPmNvbmYuY2hhbm5lbC0+YmFuZDsKK30KKwogc3RhdGljIGlubGluZSB1MTYgYjQzX3JlYWQxNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQpCiB7CiAJcmV0dXJuIHNzYl9yZWFkMTYoZGV2LT5kZXYsIG9mZnNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RlYnVnZnMuYwppbmRleCAyOTg1MWJjLi4wNmEwMWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kZWJ1Z2ZzLmMKQEAgLTQ0Myw3NiArNDQzLDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHR4cG93ZXJfZ19yZWFkX2ZpbGUoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpCi17Ci0Jc3NpemVfdCBjb3VudCA9IDA7Ci0KLQlpZiAoZGV2LT5waHkudHlwZSAhPSBCNDNfUEhZVFlQRV9HKSB7Ci0JCWZhcHBlbmQoIkRldmljZSBpcyBub3QgYSBHLVBIWVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlmYXBwZW5kKCJDb250cm9sOiAgICAgICAgICAgICAgICVzXG4iLCBkZXYtPnBoeS5tYW51YWxfdHhwb3dlcl9jb250cm9sID8KLQkJIk1BTlVBTCIgOiAiQVVUT01BVElDIik7Ci0JZmFwcGVuZCgiQmFzZWJhbmQgYXR0ZW51YXRpb246ICAldVxuIiwgZGV2LT5waHkuYmJhdHQuYXR0KTsKLQlmYXBwZW5kKCJSYWRpbyBhdHRlbnVhdGlvbjogICAgICV1XG4iLCBkZXYtPnBoeS5yZmF0dC5hdHQpOwotCWZhcHBlbmQoIlRYIE1peGVyIEdhaW46ICAgICAgICAgJXNcbiIsCi0JCShkZXYtPnBoeS50eF9jb250cm9sICYgQjQzX1RYQ1RMX1RYTUlYKSA/ICJPTiIgOiAiT0ZGIik7Ci0JZmFwcGVuZCgiUEEgR2FpbiAyZEI6ICAgICAgICAgICAlc1xuIiwKLQkJKGRldi0+cGh5LnR4X2NvbnRyb2wgJiBCNDNfVFhDVExfUEEyREIpID8gIk9OIiA6ICJPRkYiKTsKLQlmYXBwZW5kKCJQQSBHYWluIDNkQjogICAgICAgICAgICVzXG4iLAotCQkoZGV2LT5waHkudHhfY29udHJvbCAmIEI0M19UWENUTF9QQTNEQikgPyAiT04iIDogIk9GRiIpOwotCWZhcHBlbmQoIlxuXG4iKTsKLQlmYXBwZW5kKCJZb3UgY2FuIHdyaXRlIHRvIHRoaXMgZmlsZTpcbiIpOwotCWZhcHBlbmQoIldyaXRpbmcgXCJhdXRvXCIgZW5hYmxlcyBhdXRvbWF0aWMgdHhwb3dlciBjb250cm9sLlxuIik7Ci0JZmFwcGVuZAotCSAgICAoIldyaXRpbmcgdGhlIGF0dGVudWF0aW9uIHZhbHVlcyBhcyBcImJiYXR0IHJmYXR0IHR4bWl4IHBhMmRiIHBhM2RiXCIgIgotCSAgICAgImVuYWJsZXMgbWFudWFsIHR4cG93ZXIgY29udHJvbC5cbiIpOwotCWZhcHBlbmQoIkV4YW1wbGU6IDUgNCAwIDAgMVxuIik7Ci0JZmFwcGVuZCgiRW5hYmxlcyBtYW51YWwgY29udHJvbCB3aXRoIEJhc2ViYW5kIGF0dGVudWF0aW9uIDUsICIKLQkJIlJhZGlvIGF0dGVudWF0aW9uIDQsIE5vIFRYIE1peGVyIEdhaW4sICIKLQkJIk5vIFBBIEdhaW4gMmRCLCBXaXRoIFBBIEdhaW4gM2RCLlxuIik7Ci1vdXQ6Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHR4cG93ZXJfZ193cml0ZV9maWxlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpZiAoZGV2LT5waHkudHlwZSAhPSBCNDNfUEhZVFlQRV9HKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoKGNvdW50ID49IDQpICYmIChtZW1jbXAoYnVmLCAiYXV0byIsIDQpID09IDApKSB7Ci0JCS8qIEF1dG9tYXRpYyBjb250cm9sICovCi0JCWRldi0+cGh5Lm1hbnVhbF90eHBvd2VyX2NvbnRyb2wgPSAwOwotCQliNDNfcGh5X3htaXRwb3dlcihkZXYpOwotCX0gZWxzZSB7Ci0JCWludCBiYmF0dCA9IDAsIHJmYXR0ID0gMCwgdHhtaXggPSAwLCBwYTJkYiA9IDAsIHBhM2RiID0gMDsKLQkJLyogTWFudWFsIGNvbnRyb2wgKi8KLQkJaWYgKHNzY2FuZihidWYsICIlZCAlZCAlZCAlZCAlZCIsICZiYmF0dCwgJnJmYXR0LAotCQkJICAgJnR4bWl4LCAmcGEyZGIsICZwYTNkYikgIT0gNSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQliNDNfcHV0X2F0dGVudWF0aW9uX2ludG9fcmFuZ2VzKGRldiwgJmJiYXR0LCAmcmZhdHQpOwotCQlkZXYtPnBoeS5tYW51YWxfdHhwb3dlcl9jb250cm9sID0gMTsKLQkJZGV2LT5waHkuYmJhdHQuYXR0ID0gYmJhdHQ7Ci0JCWRldi0+cGh5LnJmYXR0LmF0dCA9IHJmYXR0OwotCQlkZXYtPnBoeS50eF9jb250cm9sID0gMDsKLQkJaWYgKHR4bWl4KQotCQkJZGV2LT5waHkudHhfY29udHJvbCB8PSBCNDNfVFhDVExfVFhNSVg7Ci0JCWlmIChwYTJkYikKLQkJCWRldi0+cGh5LnR4X2NvbnRyb2wgfD0gQjQzX1RYQ1RMX1BBMkRCOwotCQlpZiAocGEzZGIpCi0JCQlkZXYtPnBoeS50eF9jb250cm9sIHw9IEI0M19UWENUTF9QQTNEQjsKLQkJYjQzX3BoeV9sb2NrKGRldik7Ci0JCWI0M19yYWRpb19sb2NrKGRldik7Ci0JCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJmRldi0+cGh5LmJiYXR0LAotCQkJCSAgJmRldi0+cGh5LnJmYXR0LCBkZXYtPnBoeS50eF9jb250cm9sKTsKLQkJYjQzX3JhZGlvX3VubG9jayhkZXYpOwotCQliNDNfcGh5X3VubG9jayhkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKiB3bC0+aXJxX2xvY2sgaXMgbG9ja2VkICovCiBzdGF0aWMgaW50IHJlc3RhcnRfd3JpdGVfZmlsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCiAJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTU2MCw3ICs0OTAsNyBAQAogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9Ci0JbG8gPSBwaHktPmxvX2NvbnRyb2w7CisJbG8gPSBwaHktPmctPmxvX2NvbnRyb2w7CiAJZmFwcGVuZCgiLS0gTG9jYWwgT3NjaWxsYXRvciBjYWxpYnJhdGlvbiBkYXRhIC0tXG5cbiIpOwogCWZhcHBlbmQoIkhXLXBvd2VyLWNvbnRyb2wgZW5hYmxlZDogJWRcbiIsCiAJCWRldi0+cGh5LmhhcmR3YXJlX3Bvd2VyX2NvbnRyb2wpOwpAQCAtNTc4LDggKzUwOCw4IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWwsICZsby0+Y2FsaWJfbGlzdCwgbGlzdCkgewogCQlib29sIGFjdGl2ZTsKIAotCQlhY3RpdmUgPSAoYjQzX2NvbXBhcmVfYmJhdHQoJmNhbC0+YmJhdHQsICZwaHktPmJiYXR0KSAmJgotCQkJICBiNDNfY29tcGFyZV9yZmF0dCgmY2FsLT5yZmF0dCwgJnBoeS0+cmZhdHQpKTsKKwkJYWN0aXZlID0gKGI0M19jb21wYXJlX2JiYXR0KCZjYWwtPmJiYXR0LCAmcGh5LT5nLT5iYmF0dCkgJiYKKwkJCSAgYjQzX2NvbXBhcmVfcmZhdHQoJmNhbC0+cmZhdHQsICZwaHktPmctPnJmYXR0KSk7CiAJCWZhcHBlbmQoIkJCKCVkKSwgUkYoJWQsJWQpICAtPiAgST0lZCwgUT0lZCAgIgogCQkJIihleHBpcmVzIGluICVsdSBzZWMpJXNcbiIsCiAJCQljYWwtPmJiYXR0LmF0dCwKQEAgLTc2Myw3ICs2OTMsNiBAQAogQjQzX0RFQlVHRlNfRk9QUyhtbWlvMzJ3cml0ZSwgTlVMTCwgbW1pbzMyd3JpdGVfX3dyaXRlX2ZpbGUsIDEpOwogQjQzX0RFQlVHRlNfRk9QUyh0c2YsIHRzZl9yZWFkX2ZpbGUsIHRzZl93cml0ZV9maWxlLCAxKTsKIEI0M19ERUJVR0ZTX0ZPUFModHhzdGF0LCB0eHN0YXRfcmVhZF9maWxlLCBOVUxMLCAwKTsKLUI0M19ERUJVR0ZTX0ZPUFModHhwb3dlcl9nLCB0eHBvd2VyX2dfcmVhZF9maWxlLCB0eHBvd2VyX2dfd3JpdGVfZmlsZSwgMCk7CiBCNDNfREVCVUdGU19GT1BTKHJlc3RhcnQsIE5VTEwsIHJlc3RhcnRfd3JpdGVfZmlsZSwgMSk7CiBCNDNfREVCVUdGU19GT1BTKGxvY3RscywgbG9jdGxzX3JlYWRfZmlsZSwgTlVMTCwgMCk7CiAKQEAgLTg3Nyw3ICs4MDYsNiBAQAogCUFERF9GSUxFKG1taW8zMndyaXRlLCAwMjAwKTsKIAlBRERfRklMRSh0c2YsIDA2MDApOwogCUFERF9GSUxFKHR4c3RhdCwgMDQwMCk7Ci0JQUREX0ZJTEUodHhwb3dlcl9nLCAwNjAwKTsKIAlBRERfRklMRShyZXN0YXJ0LCAwMjAwKTsKIAlBRERfRklMRShsb2N0bHMsIDA0MDApOwogCkBAIC05MDcsNyArODM1LDYgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShlLT5maWxlX21taW8zMndyaXRlLmRlbnRyeSk7CiAJZGVidWdmc19yZW1vdmUoZS0+ZmlsZV90c2YuZGVudHJ5KTsKIAlkZWJ1Z2ZzX3JlbW92ZShlLT5maWxlX3R4c3RhdC5kZW50cnkpOwotCWRlYnVnZnNfcmVtb3ZlKGUtPmZpbGVfdHhwb3dlcl9nLmRlbnRyeSk7CiAJZGVidWdmc19yZW1vdmUoZS0+ZmlsZV9yZXN0YXJ0LmRlbnRyeSk7CiAJZGVidWdmc19yZW1vdmUoZS0+ZmlsZV9sb2N0bHMuZGVudHJ5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYwppbmRleCA5Yzg1NGQ2Li42YTE4YTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYwpAQCAtMjksNyArMjksNyBAQAogCiAjaW5jbHVkZSAiYjQzLmgiCiAjaW5jbHVkZSAibG8uaCIKLSNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJwaHlfZy5oIgogI2luY2x1ZGUgIm1haW4uaCIKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xNzQsNyArMTc0LDggQEAKIHN0YXRpYyB2b2lkIGxvX21lYXN1cmVfdHhjdGxfdmFsdWVzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IHBoeS0+bG9fY29udHJvbDsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGdwaHktPmxvX2NvbnRyb2w7CiAJdTE2IHJlZywgbWFzazsKIAl1MTYgdHJzd19yeCwgcGdhOwogCXUxNiByYWRpb19wY3RsX3JlZzsKQEAgLTE5NSw3ICsxOTYsNyBAQAogCQlpbnQgbGJfZ2FpbjsJLyogTG9vcGJhY2sgZ2FpbiAoaW4gZEIpICovCiAKIAkJdHJzd19yeCA9IDA7Ci0JCWxiX2dhaW4gPSBwaHktPm1heF9sYl9nYWluIC8gMjsKKwkJbGJfZ2FpbiA9IGdwaHktPm1heF9sYl9nYWluIC8gMjsKIAkJaWYgKGxiX2dhaW4gPiAxMCkgewogCQkJcmFkaW9fcGN0bF9yZWcgPSAwOwogCQkJcGdhID0gYWJzKDEwIC0gbGJfZ2FpbikgLyA2OwpAQCAtMjI2LDcgKzIyNyw3IEBACiAJfQogCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDQzKQogCQkJCSAgICAgICYgMHhGRkYwKSB8IHJhZGlvX3BjdGxfcmVnKTsKLQliNDNfcGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIDIpOworCWI0M19ncGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIDIpOwogCiAJcmVnID0gbG9fdHhjdGxfcmVnaXN0ZXJfdGFibGUoZGV2LCAmbWFzaywgTlVMTCk7CiAJbWFzayA9IH5tYXNrOwpAQCAtMjc3LDcgKzI3OCw4IEBACiBzdGF0aWMgdm9pZCBsb19yZWFkX3Bvd2VyX3ZlY3RvcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBwaHktPmxvX2NvbnRyb2w7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBncGh5LT5sb19jb250cm9sOwogCWludCBpOwogCXU2NCB0bXA7CiAJdTY0IHBvd2VyX3ZlY3RvciA9IDA7CkBAIC0yOTgsNiArMzAwLDcgQEAKIAkJCQkgICBzMTYgbWF4X3J4X2dhaW4sIGludCB1c2VfdHJzd19yeCkKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CiAJdTE2IHRtcDsKIAogCWlmIChtYXhfcnhfZ2FpbiA8IDApCkBAIC0zMDgsNyArMzExLDcgQEAKIAkJaW50IHRyc3dfcnhfZ2FpbjsKIAogCQlpZiAodXNlX3Ryc3dfcngpIHsKLQkJCXRyc3dfcnhfZ2FpbiA9IHBoeS0+dHJzd19yeF9nYWluIC8gMjsKKwkJCXRyc3dfcnhfZ2FpbiA9IGdwaHktPnRyc3dfcnhfZ2FpbiAvIDI7CiAJCQlpZiAobWF4X3J4X2dhaW4gPj0gdHJzd19yeF9nYWluKSB7CiAJCQkJdHJzd19yeF9nYWluID0gbWF4X3J4X2dhaW4gLSB0cnN3X3J4X2dhaW47CiAJCQkJdHJzd19yeCA9IDB4MjA7CkBAIC0zMTYsMzggKzMxOSwzOCBAQAogCQl9IGVsc2UKIAkJCXRyc3dfcnhfZ2FpbiA9IG1heF9yeF9nYWluOwogCQlpZiAodHJzd19yeF9nYWluIDwgOSkgewotCQkJcGh5LT5sbmFfbG9kX2dhaW4gPSAwOworCQkJZ3BoeS0+bG5hX2xvZF9nYWluID0gMDsKIAkJfSBlbHNlIHsKLQkJCXBoeS0+bG5hX2xvZF9nYWluID0gMTsKKwkJCWdwaHktPmxuYV9sb2RfZ2FpbiA9IDE7CiAJCQl0cnN3X3J4X2dhaW4gLT0gODsKIAkJfQogCQl0cnN3X3J4X2dhaW4gPSBjbGFtcF92YWwodHJzd19yeF9nYWluLCAwLCAweDJEKTsKLQkJcGh5LT5wZ2FfZ2FpbiA9IHRyc3dfcnhfZ2FpbiAvIDM7Ci0JCWlmIChwaHktPnBnYV9nYWluID49IDUpIHsKLQkJCXBoeS0+cGdhX2dhaW4gLT0gNTsKLQkJCXBoeS0+bG5hX2dhaW4gPSAyOworCQlncGh5LT5wZ2FfZ2FpbiA9IHRyc3dfcnhfZ2FpbiAvIDM7CisJCWlmIChncGh5LT5wZ2FfZ2FpbiA+PSA1KSB7CisJCQlncGh5LT5wZ2FfZ2FpbiAtPSA1OworCQkJZ3BoeS0+bG5hX2dhaW4gPSAyOwogCQl9IGVsc2UKLQkJCXBoeS0+bG5hX2dhaW4gPSAwOworCQkJZ3BoeS0+bG5hX2dhaW4gPSAwOwogCX0gZWxzZSB7Ci0JCXBoeS0+bG5hX2dhaW4gPSAwOwotCQlwaHktPnRyc3dfcnhfZ2FpbiA9IDB4MjA7CisJCWdwaHktPmxuYV9nYWluID0gMDsKKwkJZ3BoeS0+dHJzd19yeF9nYWluID0gMHgyMDsKIAkJaWYgKG1heF9yeF9nYWluID49IDB4MTQpIHsKLQkJCXBoeS0+bG5hX2xvZF9nYWluID0gMTsKLQkJCXBoeS0+cGdhX2dhaW4gPSAyOworCQkJZ3BoeS0+bG5hX2xvZF9nYWluID0gMTsKKwkJCWdwaHktPnBnYV9nYWluID0gMjsKIAkJfSBlbHNlIGlmIChtYXhfcnhfZ2FpbiA+PSAweDEyKSB7Ci0JCQlwaHktPmxuYV9sb2RfZ2FpbiA9IDE7Ci0JCQlwaHktPnBnYV9nYWluID0gMTsKKwkJCWdwaHktPmxuYV9sb2RfZ2FpbiA9IDE7CisJCQlncGh5LT5wZ2FfZ2FpbiA9IDE7CiAJCX0gZWxzZSBpZiAobWF4X3J4X2dhaW4gPj0gMHhGKSB7Ci0JCQlwaHktPmxuYV9sb2RfZ2FpbiA9IDE7Ci0JCQlwaHktPnBnYV9nYWluID0gMDsKKwkJCWdwaHktPmxuYV9sb2RfZ2FpbiA9IDE7CisJCQlncGh5LT5wZ2FfZ2FpbiA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwaHktPmxuYV9sb2RfZ2FpbiA9IDA7Ci0JCQlwaHktPnBnYV9nYWluID0gMDsKKwkJCWdwaHktPmxuYV9sb2RfZ2FpbiA9IDA7CisJCQlncGh5LT5wZ2FfZ2FpbiA9IDA7CiAJCX0KIAl9CiAKIAl0bXAgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg3QSk7Ci0JaWYgKHBoeS0+bG5hX2xvZF9nYWluID09IDApCisJaWYgKGdwaHktPmxuYV9sb2RfZ2FpbiA9PSAwKQogCQl0bXAgJj0gfjB4MDAwODsKIAllbHNlCiAJCXRtcCB8PSAweDAwMDg7CkBAIC0zOTIsMTAgKzM5NSwxMSBAQAogewogCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJmRldi0+ZGV2LT5idXMtPnNwcm9tOwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0Jc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvID0gcGh5LT5sb19jb250cm9sOworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CisJc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvID0gZ3BoeS0+bG9fY29udHJvbDsKIAl1MTYgdG1wOwogCi0JaWYgKGI0M19oYXNfaGFyZHdhcmVfcGN0bChwaHkpKSB7CisJaWYgKGI0M19oYXNfaGFyZHdhcmVfcGN0bChkZXYpKSB7CiAJCXNhdi0+cGh5X2xvX21hc2sgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0xPX01BU0spOwogCQlzYXYtPnBoeV9leHRnXzAxID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FWFRHKDB4MDEpKTsKIAkJc2F2LT5waHlfZGFjY3RsX2h3cGN0bCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfREFDQ1RMKTsKQEAgLTQ5Niw3ICs1MDAsNyBAQAogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyQiksIDB4MDgwMik7CiAJaWYgKHBoeS0+cmV2ID49IDIpCiAJCWI0M19kdW1teV90cmFuc21pc3Npb24oZGV2KTsKLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIDYsIDApOworCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgNiwgMCk7CiAJYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTEpOwkvKiBkdW1teSByZWFkICovCiAJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKQogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyRiksIDApOwpAQCAtNTIwLDE4ICs1MjQsMTkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgbG9fZ19zYXZlZF92YWx1ZXMgKnNhdikKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CiAJdTE2IHRtcDsKIAogCWlmIChwaHktPnJldiA+PSAyKSB7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhFMzAwKTsKLQkJdG1wID0gKHBoeS0+cGdhX2dhaW4gPDwgOCk7CisJCXRtcCA9IChncGh5LT5wZ2FfZ2FpbiA8PCA4KTsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLCB0bXAgfCAweEEwKTsKIAkJdWRlbGF5KDUpOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsIHRtcCB8IDB4QTIpOwogCQl1ZGVsYXkoMik7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwgdG1wIHwgMHhBMyk7CiAJfSBlbHNlIHsKLQkJdG1wID0gKHBoeS0+cGdhX2dhaW4gfCAweEVGQTApOworCQl0bXAgPSAoZ3BoeS0+cGdhX2dhaW4gfCAweEVGQTApOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIHRtcCk7CiAJfQogCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykgewpAQCAtNTcyLDcgKzU3Nyw3IEBACiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDNFKSwgc2F2LT5waHlfY2NrXzNFKTsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwgc2F2LT5waHlfY3JzMCk7CiAJfQotCWlmIChiNDNfaGFzX2hhcmR3YXJlX3BjdGwocGh5KSkgeworCWlmIChiNDNfaGFzX2hhcmR3YXJlX3BjdGwoZGV2KSkgewogCQl0bXAgPSAoc2F2LT5waHlfbG9fbWFzayAmIDB4QkZGRik7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX01BU0ssIHRtcCk7CiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0VYVEcoMHgwMSksIHNhdi0+cGh5X2V4dGdfMDEpOwpAQCAtNTgwLDcgKzU4NSw3IEBACiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDE0KSwgc2F2LT5waHlfY2NrXzE0KTsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfSFBXUl9UU1NJQ1RMLCBzYXYtPnBoeV9ocHdyX3Rzc2ljdGwpOwogCX0KLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIHNhdi0+b2xkX2NoYW5uZWwsIDEpOworCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgc2F2LT5vbGRfY2hhbm5lbCwgMSk7CiB9CiAKIHN0cnVjdCBiNDNfbG9fZ19zdGF0ZW1hY2hpbmUgewpAQCAtNTk3LDYgKzYwMiw3IEBACiAJCQkJICAgIHN0cnVjdCBiNDNfbG9fZ19zdGF0ZW1hY2hpbmUgKmQpCiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOwogCXN0cnVjdCBiNDNfbG9jdGwgdGVzdF9sb2N0bDsKIAlzdHJ1Y3QgYjQzX2xvY3RsIG9yaWdfbG9jdGw7CiAJc3RydWN0IGI0M19sb2N0bCBwcmV2X2xvY3RsID0gewpAQCAtNjQ2LDkgKzY1Miw5IEBACiAJCSAgICAgdGVzdF9sb2N0bC5xICE9IHByZXZfbG9jdGwucSkgJiYKIAkJICAgIChhYnModGVzdF9sb2N0bC5pKSA8PSAxNiAmJiBhYnModGVzdF9sb2N0bC5xKSA8PSAxNikpIHsKIAkJCWI0M19sb193cml0ZShkZXYsICZ0ZXN0X2xvY3RsKTsKLQkJCWZlZWR0aCA9IGxvX21lYXN1cmVfZmVlZHRocm91Z2goZGV2LCBwaHktPmxuYV9nYWluLAotCQkJCQkJCXBoeS0+cGdhX2dhaW4sCi0JCQkJCQkJcGh5LT50cnN3X3J4X2dhaW4pOworCQkJZmVlZHRoID0gbG9fbWVhc3VyZV9mZWVkdGhyb3VnaChkZXYsIGdwaHktPmxuYV9nYWluLAorCQkJCQkJCWdwaHktPnBnYV9nYWluLAorCQkJCQkJCWdwaHktPnRyc3dfcnhfZ2Fpbik7CiAJCQlpZiAoZmVlZHRoIDwgZC0+bG93ZXN0X2ZlZWR0aCkgewogCQkJCW1lbWNweShwcm9iZV9sb2N0bCwgJnRlc3RfbG9jdGwsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYjQzX2xvY3RsKSk7CkBAIC02NzcsNiArNjgzLDcgQEAKIAkJCQkJIGludCAqbWF4X3J4X2dhaW4pCiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOwogCXN0cnVjdCBiNDNfbG9fZ19zdGF0ZW1hY2hpbmUgZDsKIAl1MTYgZmVlZHRoOwogCWludCBmb3VuZF9sb3dlcjsKQEAgLTY5MywxNyArNzAwLDE3IEBACiAJCW1heF9yZXBlYXQgPSA0OwogCWRvIHsKIAkJYjQzX2xvX3dyaXRlKGRldiwgJmQubWluX2xvY3RsKTsKLQkJZmVlZHRoID0gbG9fbWVhc3VyZV9mZWVkdGhyb3VnaChkZXYsIHBoeS0+bG5hX2dhaW4sCi0JCQkJCQlwaHktPnBnYV9nYWluLAotCQkJCQkJcGh5LT50cnN3X3J4X2dhaW4pOworCQlmZWVkdGggPSBsb19tZWFzdXJlX2ZlZWR0aHJvdWdoKGRldiwgZ3BoeS0+bG5hX2dhaW4sCisJCQkJCQlncGh5LT5wZ2FfZ2FpbiwKKwkJCQkJCWdwaHktPnRyc3dfcnhfZ2Fpbik7CiAJCWlmIChmZWVkdGggPCAweDI1OCkgewogCQkJaWYgKGZlZWR0aCA+PSAweDEyQykKIAkJCQkqbWF4X3J4X2dhaW4gKz0gNjsKIAkJCWVsc2UKIAkJCQkqbWF4X3J4X2dhaW4gKz0gMzsKLQkJCWZlZWR0aCA9IGxvX21lYXN1cmVfZmVlZHRocm91Z2goZGV2LCBwaHktPmxuYV9nYWluLAotCQkJCQkJCXBoeS0+cGdhX2dhaW4sCi0JCQkJCQkJcGh5LT50cnN3X3J4X2dhaW4pOworCQkJZmVlZHRoID0gbG9fbWVhc3VyZV9mZWVkdGhyb3VnaChkZXYsIGdwaHktPmxuYV9nYWluLAorCQkJCQkJCWdwaHktPnBnYV9nYWluLAorCQkJCQkJCWdwaHktPnRyc3dfcnhfZ2Fpbik7CiAJCX0KIAkJZC5sb3dlc3RfZmVlZHRoID0gZmVlZHRoOwogCkBAIC03NTIsNiArNzU5LDcgQEAKIAkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBiNDNfcmZhdHQgKnJmYXR0KQogewogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKIAlzdHJ1Y3QgYjQzX2xvY3RsIGxvY3RsID0gewogCQkuaSA9IDAsCiAJCS5xID0gMCwKQEAgLTc4MiwxMSArNzkwLDExIEBACiAJaWYgKHJmYXR0LT53aXRoX3BhZG1peCkKIAkJbWF4X3J4X2dhaW4gLT0gcGFkX21peF9nYWluOwogCWlmIChoYXNfbG9vcGJhY2tfZ2FpbihwaHkpKQotCQltYXhfcnhfZ2FpbiArPSBwaHktPm1heF9sYl9nYWluOworCQltYXhfcnhfZ2FpbiArPSBncGh5LT5tYXhfbGJfZ2FpbjsKIAlsb19tZWFzdXJlX2dhaW5fdmFsdWVzKGRldiwgbWF4X3J4X2dhaW4sCiAJCQkgICAgICAgaGFzX2xvb3BiYWNrX2dhaW4ocGh5KSk7CiAKLQliNDNfcGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIGJiYXR0LT5hdHQpOworCWI0M19ncGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIGJiYXR0LT5hdHQpOwogCWxvX3Byb2JlX2xvY3Rsc19zdGF0ZW1hY2hpbmUoZGV2LCAmbG9jdGwsICZtYXhfcnhfZ2Fpbik7CiAKIAlsb19tZWFzdXJlX3Jlc3RvcmUoZGV2LCAmc2F2ZWRfcmVncyk7CkBAIC04MjAsNyArODI4LDcgQEAKIAkJCQkJCWNvbnN0IHN0cnVjdCBiNDNfYmJhdHQgKmJiYXR0LAogCQkJCQkJY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqcmZhdHQpCiB7Ci0Jc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvID0gZGV2LT5waHkubG9fY29udHJvbDsKKwlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBkZXYtPnBoeS5nLT5sb19jb250cm9sOwogCXN0cnVjdCBiNDNfbG9fY2FsaWIgKmM7CiAKIAljID0gYjQzX2ZpbmRfbG9fY2FsaWIobG8sIGJiYXR0LCByZmF0dCk7CkBAIC04MzksNyArODQ3LDggQEAKIHZvaWQgYjQzX2dwaHlfZGNfbHRfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgdXBkYXRlX2FsbCkKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IHBoeS0+bG9fY29udHJvbDsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGdwaHktPmxvX2NvbnRyb2w7CiAJaW50IGk7CiAJaW50IHJmX29mZnNldCwgYmJfb2Zmc2V0OwogCWNvbnN0IHN0cnVjdCBiNDNfcmZhdHQgKnJmYXR0OwpAQCAtOTE3LDE0ICs5MjYsMTQgQEAKIAogdm9pZCBiNDNfbG9fZ19hZGp1c3Qoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IGRldi0+cGh5Lmc7CiAJc3RydWN0IGI0M19sb19jYWxpYiAqY2FsOwogCXN0cnVjdCBiNDNfcmZhdHQgcmY7CiAKLQltZW1jcHkoJnJmLCAmcGh5LT5yZmF0dCwgc2l6ZW9mKHJmKSk7CisJbWVtY3B5KCZyZiwgJmdwaHktPnJmYXR0LCBzaXplb2YocmYpKTsKIAliNDNfbG9fZml4dXBfcmZhdHQoJnJmKTsKIAotCWNhbCA9IGI0M19nZXRfY2FsaWJfbG9fc2V0dGluZ3MoZGV2LCAmcGh5LT5iYmF0dCwgJnJmKTsKKwljYWwgPSBiNDNfZ2V0X2NhbGliX2xvX3NldHRpbmdzKGRldiwgJmdwaHktPmJiYXR0LCAmcmYpOwogCWlmICghY2FsKQogCQlyZXR1cm47CiAJYjQzX2xvX3dyaXRlKGRldiwgJmNhbC0+Y3RsKTsKQEAgLTk1Miw3ICs5NjEsOCBAQAogdm9pZCBiNDNfbG9fZ19tYWludGFuYW5jZV93b3JrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IHBoeS0+bG9fY29udHJvbDsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGdwaHktPmxvX2NvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBub3c7CiAJdW5zaWduZWQgbG9uZyBleHBpcmU7CiAJc3RydWN0IGI0M19sb19jYWxpYiAqY2FsLCAqdG1wOwpAQCAtOTYyLDcgKzk3Miw3IEBACiAJaWYgKCFsbykKIAkJcmV0dXJuOwogCW5vdyA9IGppZmZpZXM7Ci0JaHdwY3RsID0gYjQzX2hhc19oYXJkd2FyZV9wY3RsKHBoeSk7CisJaHdwY3RsID0gYjQzX2hhc19oYXJkd2FyZV9wY3RsKGRldik7CiAKIAlpZiAoaHdwY3RsKSB7CiAJCS8qIFJlYWQgdGhlIHBvd2VyIHZlY3RvciBhbmQgdXBkYXRlIGl0LCBpZiBuZWVkZWQuICovCkBAIC05ODMsOCArOTkzLDggQEAKIAkJaWYgKCF0aW1lX2JlZm9yZShjYWwtPmNhbGliX3RpbWUsIGV4cGlyZSkpCiAJCQljb250aW51ZTsKIAkJLyogVGhpcyBpdGVtIGV4cGlyZWQuICovCi0JCWlmIChiNDNfY29tcGFyZV9iYmF0dCgmY2FsLT5iYmF0dCwgJnBoeS0+YmJhdHQpICYmCi0JCSAgICBiNDNfY29tcGFyZV9yZmF0dCgmY2FsLT5yZmF0dCwgJnBoeS0+cmZhdHQpKSB7CisJCWlmIChiNDNfY29tcGFyZV9iYmF0dCgmY2FsLT5iYmF0dCwgJmdwaHktPmJiYXR0KSAmJgorCQkgICAgYjQzX2NvbXBhcmVfcmZhdHQoJmNhbC0+cmZhdHQsICZncGh5LT5yZmF0dCkpIHsKIAkJCUI0M19XQVJOX09OKGN1cnJlbnRfaXRlbV9leHBpcmVkKTsKIAkJCWN1cnJlbnRfaXRlbV9leHBpcmVkID0gMTsKIAkJfQpAQCAtMTAwMiw3ICsxMDEyLDcgQEAKIAkJLyogUmVjYWxpYnJhdGUgY3VycmVudGx5IHVzZWQgTE8gc2V0dGluZy4gKi8KIAkJaWYgKGI0M19kZWJ1ZyhkZXYsIEI0M19EQkdfTE8pKQogCQkJYjQzZGJnKGRldi0+d2wsICJMTzogUmVjYWxpYnJhdGluZyBjdXJyZW50IExPIHNldHRpbmdcbiIpOwotCQljYWwgPSBiNDNfY2FsaWJyYXRlX2xvX3NldHRpbmcoZGV2LCAmcGh5LT5iYmF0dCwgJnBoeS0+cmZhdHQpOworCQljYWwgPSBiNDNfY2FsaWJyYXRlX2xvX3NldHRpbmcoZGV2LCAmZ3BoeS0+YmJhdHQsICZncGh5LT5yZmF0dCk7CiAJCWlmIChjYWwpIHsKIAkJCWxpc3RfYWRkKCZjYWwtPmxpc3QsICZsby0+Y2FsaWJfbGlzdCk7CiAJCQliNDNfbG9fd3JpdGUoZGV2LCAmY2FsLT5jdGwpOwpAQCAtMTAxMyw3ICsxMDIzLDcgQEAKIAogdm9pZCBiNDNfbG9fZ19jbGVhbnVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBkZXYtPnBoeS5sb19jb250cm9sOworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGRldi0+cGh5LmctPmxvX2NvbnRyb2w7CiAJc3RydWN0IGI0M19sb19jYWxpYiAqY2FsLCAqdG1wOwogCiAJaWYgKCFsbykKQEAgLTEwMjcsOSArMTAzNyw3IEBACiAvKiBMTyBJbml0aWFsaXphdGlvbiAqLwogdm9pZCBiNDNfbG9fZ19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JaWYgKGI0M19oYXNfaGFyZHdhcmVfcGN0bChwaHkpKSB7CisJaWYgKGI0M19oYXNfaGFyZHdhcmVfcGN0bChkZXYpKSB7CiAJCWxvX3JlYWRfcG93ZXJfdmVjdG9yKGRldik7CiAJCWI0M19ncGh5X2RjX2x0X2luaXQoZGV2LCAxKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sby5oCmluZGV4IDFkYTMyMWMuLjNiMjdlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sby5oCkBAIC0xLDcgKzEsOSBAQAogI2lmbmRlZiBCNDNfTE9fSF8KICNkZWZpbmUgQjQzX0xPX0hfCiAKLSNpbmNsdWRlICJwaHkuaCIKKy8qIEctUEhZIExvY2FsIE9zY2lsbGF0b3IgKi8KKworI2luY2x1ZGUgInBoeV9nLmgiCiAKIHN0cnVjdCBiNDNfd2xkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDcyMDVhOTMuLjE0YzQ0ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtNDQsOCArNDQsOSBAQAogI2luY2x1ZGUgImI0My5oIgogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlICJkZWJ1Z2ZzLmgiCi0jaW5jbHVkZSAicGh5LmgiCi0jaW5jbHVkZSAibnBoeS5oIgorI2luY2x1ZGUgInBoeV9jb21tb24uaCIKKyNpbmNsdWRlICJwaHlfZy5oIgorI2luY2x1ZGUgInBoeV9uLmgiCiAjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGlvLmgiCiAjaW5jbHVkZSAic3lzZnMuaCIKQEAgLTgxNCw3ICs4MTUsNyBAQAogCQkJYnJlYWs7CiAJCXVkZWxheSgxMCk7CiAJfQotCWZvciAoaSA9IDB4MDA7IGkgPCAweDBBOyBpKyspIHsKKwlmb3IgKGkgPSAweDAwOyBpIDwgMHgxOTsgaSsrKSB7CiAJCXZhbHVlID0gYjQzX3JlYWQxNihkZXYsIDB4MDY5MCk7CiAJCWlmICghKHZhbHVlICYgMHgwMTAwKSkKIAkJCWJyZWFrOwpAQCAtMTA1MSwyMyArMTA1Miw2IEBACiAJfQogfQogCi0vKiBUdXJuIHRoZSBBbmFsb2cgT04vT0ZGICovCi1zdGF0aWMgdm9pZCBiNDNfc3dpdGNoX2FuYWxvZyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBvbikKLXsKLQlzd2l0Y2ggKGRldi0+cGh5LnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JY2FzZSBCNDNfUEhZVFlQRV9HOgotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWTAsIG9uID8gMCA6IDB4RjQpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX046Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwKLQkJCSAgICAgIG9uID8gMCA6IDB4N0ZGRik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCX0KLX0KLQogdm9pZCBiNDNfd2lyZWxlc3NfY29yZV9yZXNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBmbGFncykKIHsKIAl1MzIgdG1zbG93OwpAQCAtMTA5MCw4ICsxMDc0LDEyIEBACiAJc3NiX3JlYWQzMihkZXYtPmRldiwgU1NCX1RNU0xPVyk7CS8qIGZsdXNoICovCiAJbXNsZWVwKDEpOwogCi0JLyogVHVybiBBbmFsb2cgT04gKi8KLQliNDNfc3dpdGNoX2FuYWxvZyhkZXYsIDEpOworCS8qIFR1cm4gQW5hbG9nIE9OLCBidXQgb25seSBpZiB3ZSBhbHJlYWR5IGtub3cgdGhlIFBIWS10eXBlLgorCSAqIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCB2ZXJ5IGVhcmx5IHNldHVwIHdoZXJlIHdlIGRvbid0IGtub3cgdGhlCisJICogUEhZLXR5cGUsIHlldC4gd2lyZWxlc3NfY29yZV9yZXNldCB3aWxsIGJlIGNhbGxlZCBvbmNlIGFnYWluIGxhdGVyLAorCSAqIHdoZW4gd2Uga25vdyB0aGUgUEhZLXR5cGUuICovCisJaWYgKGRldi0+cGh5Lm9wcykKKwkJZGV2LT5waHkub3BzLT5zd2l0Y2hfYW5hbG9nKGRldiwgMSk7CiAKIAltYWNjdGwgPSBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsKIAltYWNjdGwgJj0gfkI0M19NQUNDVExfR01PREU7CkBAIC0xMTc0LDYgKzExNjIsOCBAQAogewogCS8qIFRvcCBoYWxmIG9mIExpbmsgUXVhbGl0eSBjYWxjdWxhdGlvbi4gKi8KIAorCWlmIChkZXYtPnBoeS50eXBlICE9IEI0M19QSFlUWVBFX0cpCisJCXJldHVybjsKIAlpZiAoZGV2LT5ub2lzZWNhbGMuY2FsY3VsYXRpb25fcnVubmluZykKIAkJcmV0dXJuOwogCWRldi0+bm9pc2VjYWxjLmNhbGN1bGF0aW9uX3J1bm5pbmcgPSAxOwpAQCAtMTE4NCw3ICsxMTc0LDcgQEAKIAogc3RhdGljIHZvaWQgaGFuZGxlX2lycV9ub2lzZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpwaHkgPSBkZXYtPnBoeS5nOwogCXUxNiB0bXA7CiAJdTggbm9pc2VbNF07CiAJdTggaSwgajsKQEAgLTExOTIsNiArMTE4Miw5IEBACiAKIAkvKiBCb3R0b20gaGFsZiBvZiBMaW5rIFF1YWxpdHkgY2FsY3VsYXRpb24uICovCiAKKwlpZiAoZGV2LT5waHkudHlwZSAhPSBCNDNfUEhZVFlQRV9HKQorCQlyZXR1cm47CisKIAkvKiBQb3NzaWJsZSByYWNlIGNvbmRpdGlvbjogSXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCB0aGUgdXNlcgogCSAqIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgY2hhbm5lbCBpbiB0aGUgbWVhbnRpbWUgc2luY2Ugd2UKIAkgKiBzdGFydGVkIHRoZSBjYWxjdWxhdGlvbi4gV2UgaWdub3JlIHRoYXQgZmFjdCwgc2luY2UgaXQncwpAQCAtMTI1MSwxMyArMTI0NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBoYW5kbGVfaXJxX3RidHRfaW5kaWNhdGlvbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0JaWYgKGI0M19pc19tb2RlKGRldi0+d2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSkgeworCWlmIChiNDNfaXNfbW9kZShkZXYtPndsLCBOTDgwMjExX0lGVFlQRV9BUCkpIHsKIAkJLy8vVE9ETzogUFMgVEJUVAogCX0gZWxzZSB7CiAJCWlmICgxIC8qRklYTUU6IHRoZSBsYXN0IFBTcG9sbCBmcmFtZSB3YXMgc2VudCBzdWNjZXNzZnVsbHkgKi8gKQogCQkJYjQzX3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIDApOwogCX0KLQlpZiAoYjQzX2lzX21vZGUoZGV2LT53bCwgSUVFRTgwMjExX0lGX1RZUEVfSUJTUykpCisJaWYgKGI0M19pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSkKIAkJZGV2LT5kZnFfdmFsaWQgPSAxOwogfQogCkBAIC0xNjA2LDggKzE1OTksOCBAQAogCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKIAl1MzIgY21kLCBiZWFjb24wX3ZhbGlkLCBiZWFjb24xX3ZhbGlkOwogCi0JaWYgKCFiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfQVApICYmCi0JICAgICFiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVCkpCisJaWYgKCFiNDNfaXNfbW9kZSh3bCwgTkw4MDIxMV9JRlRZUEVfQVApICYmCisJICAgICFiNDNfaXNfbW9kZSh3bCwgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkpCiAJCXJldHVybjsKIAogCS8qIFRoaXMgaXMgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBhc3luY2hyb25vdXMgYmVhY29uIHVwZGF0ZS4gKi8KQEAgLTI1NzUsMTAgKzI1NjgsMTAgQEAKIAljdGwgJj0gfkI0M19NQUNDVExfQkVBQ1BST01JU0M7CiAJY3RsIHw9IEI0M19NQUNDVExfSU5GUkE7CiAKLQlpZiAoYjQzX2lzX21vZGUod2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSB8fAotCSAgICBiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVCkpCisJaWYgKGI0M19pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9BUCkgfHwKKwkgICAgYjQzX2lzX21vZGUod2wsIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpKQogCQljdGwgfD0gQjQzX01BQ0NUTF9BUDsKLQllbHNlIGlmIChiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfSUJTUykpCisJZWxzZSBpZiAoYjQzX2lzX21vZGUod2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSkKIAkJY3RsICY9IH5CNDNfTUFDQ1RMX0lORlJBOwogCiAJaWYgKHdsLT5maWx0ZXJfZmxhZ3MgJiBGSUZfQ09OVFJPTCkKQEAgLTI2ODgsOSArMjY4MSw4IEBACiAvKiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBiNDNfY2hpcF9pbml0KCkgKi8KIHN0YXRpYyB2b2lkIGI0M19jaGlwX2V4aXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCWI0M19yYWRpb190dXJuX29mZihkZXYsIDEpOworCWI0M19waHlfZXhpdChkZXYpOwogCWI0M19ncGlvX2NsZWFudXAoZGV2KTsKLQliNDNfbG9fZ19jbGVhbnVwKGRldik7CiAJLyogZmlybXdhcmUgaXMgcmVsZWFzZWQgbGF0ZXIgKi8KIH0KIApAQCAtMjcwMCw3ICsyNjkyLDcgQEAKIHN0YXRpYyBpbnQgYjQzX2NoaXBfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlpbnQgZXJyLCB0bXA7CisJaW50IGVycjsKIAl1MzIgdmFsdWUzMiwgbWFjY3RsOwogCXUxNiB2YWx1ZTE2OwogCkBAIC0yNzI1LDE5ICsyNzE3LDIwIEBACiAJZXJyID0gYjQzX3VwbG9hZF9pbml0dmFscyhkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2dwaW9fY2xlYW47Ci0JYjQzX3JhZGlvX3R1cm5fb24oZGV2KTsKIAotCWI0M193cml0ZTE2KGRldiwgMHgwM0U2LCAweDAwMDApOworCS8qIFR1cm4gdGhlIEFuYWxvZyBvbiBhbmQgaW5pdGlhbGl6ZSB0aGUgUEhZLiAqLworCXBoeS0+b3BzLT5zd2l0Y2hfYW5hbG9nKGRldiwgMSk7CiAJZXJyID0gYjQzX3BoeV9pbml0KGRldik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfcmFkaW9fb2ZmOworCQlnb3RvIGVycl9ncGlvX2NsZWFuOwogCi0JLyogU2VsZWN0IGluaXRpYWwgSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24uICovCi0JdG1wID0gcGh5LT5pbnRlcmZtb2RlOwotCXBoeS0+aW50ZXJmbW9kZSA9IEI0M19JTlRFUkZNT0RFX05PTkU7Ci0JYjQzX3JhZGlvX3NldF9pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbihkZXYsIHRtcCk7CisJLyogRGlzYWJsZSBJbnRlcmZlcmVuY2UgTWl0aWdhdGlvbi4gKi8KKwlpZiAocGh5LT5vcHMtPmludGVyZl9taXRpZ2F0aW9uKQorCQlwaHktPm9wcy0+aW50ZXJmX21pdGlnYXRpb24oZGV2LCBCNDNfSU5URVJGTU9ERV9OT05FKTsKIAotCWI0M19zZXRfcnhfYW50ZW5uYShkZXYsIEI0M19BTlRFTk5BX0RFRkFVTFQpOworCS8qIFNlbGVjdCB0aGUgYW50ZW5uYWUgKi8KKwlpZiAocGh5LT5vcHMtPnNldF9yeF9hbnRlbm5hKQorCQlwaHktPm9wcy0+c2V0X3J4X2FudGVubmEoZGV2LCBCNDNfQU5URU5OQV9ERUZBVUxUKTsKIAliNDNfbWdtdGZyYW1lX3R4YW50ZW5uYShkZXYsIEI0M19BTlRFTk5BX0RFRkFVTFQpOwogCiAJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9CKSB7CkBAIC0yNzkwLDggKzI3ODMsNiBAQAogb3V0OgogCXJldHVybiBlcnI7CiAKLWVycl9yYWRpb19vZmY6Ci0JYjQzX3JhZGlvX3R1cm5fb2ZmKGRldiwgMSk7CiBlcnJfZ3Bpb19jbGVhbjoKIAliNDNfZ3Bpb19jbGVhbnVwKGRldik7CiAJcmV0dXJuIGVycjsKQEAgLTI3OTksMjUgKzI3OTAsMTMgQEAKIAogc3RhdGljIHZvaWQgYjQzX3BlcmlvZGljX2V2ZXJ5NjBzZWMoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyAqb3BzID0gZGV2LT5waHkub3BzOwogCi0JaWYgKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKQotCQlyZXR1cm47Ci0JaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1JTU0kpIHsKLQkJYjQzX21hY19zdXNwZW5kKGRldik7Ci0JCWI0M19jYWxjX25yc3NpX3Nsb3BlKGRldik7Ci0JCWlmICgocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwKSAmJiAocGh5LT5yYWRpb19yZXYgPT0gOCkpIHsKLQkJCXU4IG9sZF9jaGFuID0gcGh5LT5jaGFubmVsOworCWlmIChvcHMtPnB3b3JrXzYwc2VjKQorCQlvcHMtPnB3b3JrXzYwc2VjKGRldik7CiAKLQkJCS8qIFZDTyBDYWxpYnJhdGlvbiAqLwotCQkJaWYgKG9sZF9jaGFuID49IDgpCi0JCQkJYjQzX3JhZGlvX3NlbGVjdGNoYW5uZWwoZGV2LCAxLCAwKTsKLQkJCWVsc2UKLQkJCQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIDEzLCAwKTsKLQkJCWI0M19yYWRpb19zZWxlY3RjaGFubmVsKGRldiwgb2xkX2NoYW4sIDApOwotCQl9Ci0JCWI0M19tYWNfZW5hYmxlKGRldik7Ci0JfQorCS8qIEZvcmNlIGNoZWNrIHRoZSBUWCBwb3dlciBlbWlzc2lvbiBub3cuICovCisJYjQzX3BoeV90eHBvd2VyX2NoZWNrKGRldiwgQjQzX1RYUFdSX0lHTk9SRV9USU1FKTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX3BlcmlvZGljX2V2ZXJ5MzBzZWMoc3RydWN0IGI0M193bGRldiAqZGV2KQpAQCAtMjg0NSwzMiArMjgyNCw4IEBACiAJCX0KIAl9CiAKLQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0cpIHsKLQkJLy9UT0RPOiB1cGRhdGVfYWNpX21vdmluZ19hdmVyYWdlCi0JCWlmIChwaHktPmFjaV9lbmFibGUgJiYgcGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMpIHsKLQkJCWI0M19tYWNfc3VzcGVuZChkZXYpOwotCQkJaWYgKCFwaHktPmFjaV9lbmFibGUgJiYgMSAvKlRPRE86IG5vdCBzY2FubmluZz8gKi8gKSB7Ci0JCQkJaWYgKDAgLypUT0RPOiBidW5jaCBvZiBjb25kaXRpb25zICovICkgewotCQkJCQliNDNfcmFkaW9fc2V0X2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uCi0JCQkJCSAgICAoZGV2LCBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKDEgLypUT0RPKi8pIHsKLQkJCQkvKgotCQkJCSAgIGlmICgoYWNpX2F2ZXJhZ2UgPiAxMDAwKSAmJiAhKGI0M19yYWRpb19hY2lfc2NhbihkZXYpKSkgewotCQkJCSAgIGI0M19yYWRpb19zZXRfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24oZGV2LAotCQkJCSAgIEI0M19JTlRFUkZNT0RFX05PTkUpOwotCQkJCSAgIH0KLQkJCQkgKi8KLQkJCX0KLQkJCWI0M19tYWNfZW5hYmxlKGRldik7Ci0JCX0gZWxzZSBpZiAocGh5LT5pbnRlcmZtb2RlID09IEI0M19JTlRFUkZNT0RFX05PTldMQU4gJiYKLQkJCSAgIHBoeS0+cmV2ID09IDEpIHsKLQkJCS8vVE9ETzogaW1wbGVtZW50IHJldjEgd29ya2Fyb3VuZAotCQl9Ci0JfQotCWI0M19waHlfeG1pdHBvd2VyKGRldik7CS8vRklYTUU6IHVubGVzcyBzY2FubmluZz8KLQliNDNfbG9fZ19tYWludGFuYW5jZV93b3JrKGRldik7Ci0JLy9UT0RPIGZvciBBUEhZICh0ZW1wZXJhdHVyZT8pCisJaWYgKHBoeS0+b3BzLT5wd29ya18xNXNlYykKKwkJcGh5LT5vcHMtPnB3b3JrXzE1c2VjKGRldik7CiAKIAlhdG9taWNfc2V0KCZwaHktPnR4ZXJyX2NudCwgQjQzX1BIWV9UWF9CQURORVNTX0xJTUlUKTsKIAl3bWIoKTsKQEAgLTMxMDQsMzYgKzMwNTksMzEgQEAKIAl9CiB9CiAKLS8qIFVwZGF0ZSB0aGUgUU9TIHBhcmFtZXRlcnMgaW4gaGFyZHdhcmUuICovCi1zdGF0aWMgdm9pZCBiNDNfcW9zX3VwZGF0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCisvKiBNYXBwaW5nIG9mIG1hYzgwMjExIHF1ZXVlIG51bWJlcnMgdG8gYjQzIFFvUyBTSE0gb2Zmc2V0cy4gKi8KK3N0YXRpYyBjb25zdCB1MTYgYjQzX3Fvc19zaG1fb2Zmc2V0c1tdID0geworCS8qIFttYWM4MDIxMS1xdWV1ZS1ucl0gPSBTSE1fT0ZGU0VULCAqLworCVswXSA9IEI0M19RT1NfVk9JQ0UsCisJWzFdID0gQjQzX1FPU19WSURFTywKKwlbMl0gPSBCNDNfUU9TX0JFU1RFRkZPUlQsCisJWzNdID0gQjQzX1FPU19CQUNLR1JPVU5ELAorfTsKKworLyogVXBkYXRlIGFsbCBRT1MgcGFyYW1ldGVycyBpbiBoYXJkd2FyZS4gKi8KK3N0YXRpYyB2b2lkIGI0M19xb3NfdXBsb2FkX2FsbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJc3RydWN0IGI0M193bCAqd2wgPSBkZXYtPndsOwogCXN0cnVjdCBiNDNfcW9zX3BhcmFtcyAqcGFyYW1zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGk7CiAKLQkvKiBNYXBwaW5nIG9mIG1hYzgwMjExIHF1ZXVlcyB0byBiNDMgU0hNIG9mZnNldHMuICovCi0Jc3RhdGljIGNvbnN0IHUxNiBxb3Nfc2htX29mZnNldHNbXSA9IHsKLQkJWzBdID0gQjQzX1FPU19WT0lDRSwKLQkJWzFdID0gQjQzX1FPU19WSURFTywKLQkJWzJdID0gQjQzX1FPU19CRVNURUZGT1JULAotCQlbM10gPSBCNDNfUU9TX0JBQ0tHUk9VTkQsCi0JfTsKLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShxb3Nfc2htX29mZnNldHMpICE9IEFSUkFZX1NJWkUod2wtPnFvc19wYXJhbXMpKTsKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShiNDNfcW9zX3NobV9vZmZzZXRzKSAhPQorCQkgICAgIEFSUkFZX1NJWkUod2wtPnFvc19wYXJhbXMpKTsKIAogCWI0M19tYWNfc3VzcGVuZChkZXYpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+aXJxX2xvY2ssIGZsYWdzKTsKLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdsLT5xb3NfcGFyYW1zKTsgaSsrKSB7CiAJCXBhcmFtcyA9ICYod2wtPnFvc19wYXJhbXNbaV0pOwotCQlpZiAocGFyYW1zLT5uZWVkX2h3X3VwZGF0ZSkgewotCQkJYjQzX3Fvc19wYXJhbXNfdXBsb2FkKGRldiwgJihwYXJhbXMtPnApLAotCQkJCQkgICAgICBxb3Nfc2htX29mZnNldHNbaV0pOwotCQkJcGFyYW1zLT5uZWVkX2h3X3VwZGF0ZSA9IDA7Ci0JCX0KKwkJYjQzX3Fvc19wYXJhbXNfdXBsb2FkKGRldiwgJihwYXJhbXMtPnApLAorCQkJCSAgICAgIGI0M19xb3Nfc2htX29mZnNldHNbaV0pOwogCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT5pcnFfbG9jaywgZmxhZ3MpOwogCWI0M19tYWNfZW5hYmxlKGRldik7CiB9CiAKQEAgLTMxNDIsMjUgKzMwOTIsNTAgQEAKIAlzdHJ1Y3QgYjQzX3Fvc19wYXJhbXMgKnBhcmFtczsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCS8qIEluaXRpYWxpemUgUW9TIHBhcmFtZXRlcnMgdG8gc2FuZSBkZWZhdWx0cy4gKi8KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGI0M19xb3Nfc2htX29mZnNldHMpICE9CisJCSAgICAgQVJSQVlfU0laRSh3bC0+cW9zX3BhcmFtcykpOworCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2wtPnFvc19wYXJhbXMpOyBpKyspIHsKIAkJcGFyYW1zID0gJih3bC0+cW9zX3BhcmFtc1tpXSk7CiAKLQkJbWVtc2V0KCYocGFyYW1zLT5wKSwgMCwgc2l6ZW9mKHBhcmFtcy0+cCkpOwotCQlwYXJhbXMtPnAuYWlmcyA9IC0xOwotCQlwYXJhbXMtPm5lZWRfaHdfdXBkYXRlID0gMTsKKwkJc3dpdGNoIChiNDNfcW9zX3NobV9vZmZzZXRzW2ldKSB7CisJCWNhc2UgQjQzX1FPU19WT0lDRToKKwkJCXBhcmFtcy0+cC50eG9wID0gMDsKKwkJCXBhcmFtcy0+cC5haWZzID0gMjsKKwkJCXBhcmFtcy0+cC5jd19taW4gPSAweDAwMDE7CisJCQlwYXJhbXMtPnAuY3dfbWF4ID0gMHgwMDAxOworCQkJYnJlYWs7CisJCWNhc2UgQjQzX1FPU19WSURFTzoKKwkJCXBhcmFtcy0+cC50eG9wID0gMDsKKwkJCXBhcmFtcy0+cC5haWZzID0gMjsKKwkJCXBhcmFtcy0+cC5jd19taW4gPSAweDAwMDE7CisJCQlwYXJhbXMtPnAuY3dfbWF4ID0gMHgwMDAxOworCQkJYnJlYWs7CisJCWNhc2UgQjQzX1FPU19CRVNURUZGT1JUOgorCQkJcGFyYW1zLT5wLnR4b3AgPSAwOworCQkJcGFyYW1zLT5wLmFpZnMgPSAzOworCQkJcGFyYW1zLT5wLmN3X21pbiA9IDB4MDAwMTsKKwkJCXBhcmFtcy0+cC5jd19tYXggPSAweDAzRkY7CisJCQlicmVhazsKKwkJY2FzZSBCNDNfUU9TX0JBQ0tHUk9VTkQ6CisJCQlwYXJhbXMtPnAudHhvcCA9IDA7CisJCQlwYXJhbXMtPnAuYWlmcyA9IDc7CisJCQlwYXJhbXMtPnAuY3dfbWluID0gMHgwMDAxOworCQkJcGFyYW1zLT5wLmN3X21heCA9IDB4MDNGRjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQjQzX1dBUk5fT04oMSk7CisJCX0KIAl9CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGNvcmUncyBRT1MgY2FwYWJpbGl0aWVzICovCiBzdGF0aWMgdm9pZCBiNDNfcW9zX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBiNDNfd2wgKndsID0gZGV2LT53bDsKLQl1bnNpZ25lZCBpbnQgaTsKLQogCS8qIFVwbG9hZCB0aGUgY3VycmVudCBRT1MgcGFyYW1ldGVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bC0+cW9zX3BhcmFtcyk7IGkrKykKLQkJd2wtPnFvc19wYXJhbXNbaV0ubmVlZF9od191cGRhdGUgPSAxOwotCWI0M19xb3NfdXBkYXRlKGRldik7CisJYjQzX3Fvc191cGxvYWRfYWxsKGRldik7CiAKIAkvKiBFbmFibGUgUU9TIHN1cHBvcnQuICovCiAJYjQzX2hmX3dyaXRlKGRldiwgYjQzX2hmX3JlYWQoZGV2KSB8IEI0M19IRl9FRENGKTsKQEAgLTMxNjksMjUgKzMxNDQsMTMgQEAKIAkJICAgIHwgQjQzX01NSU9fSUZTQ1RMX1VTRV9FRENGKTsKIH0KIAotc3RhdGljIHZvaWQgYjQzX3Fvc191cGRhdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGI0M193bCAqd2wgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGI0M193bCwgcW9zX3VwZGF0ZV93b3JrKTsKLQlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXY7Ci0KLQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCWRldiA9IHdsLT5jdXJyZW50X2RldjsKLQlpZiAobGlrZWx5KGRldiAmJiAoYjQzX3N0YXR1cyhkZXYpID49IEI0M19TVEFUX0lOSVRJQUxJWkVEKSkpCi0JCWI0M19xb3NfdXBkYXRlKGRldik7Ci0JbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwotfQotCiBzdGF0aWMgaW50IGI0M19vcF9jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgX3F1ZXVlLAogCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBiNDNfd2wgKndsID0gaHdfdG9fYjQzX3dsKGh3KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiNDNfd2xkZXYgKmRldjsKIAl1bnNpZ25lZCBpbnQgcXVldWUgPSAodW5zaWduZWQgaW50KV9xdWV1ZTsKLQlzdHJ1Y3QgYjQzX3Fvc19wYXJhbXMgKnA7CisJaW50IGVyciA9IC1FTk9ERVY7CiAKIAlpZiAocXVldWUgPj0gQVJSQVlfU0laRSh3bC0+cW9zX3BhcmFtcykpIHsKIAkJLyogUXVldWUgbm90IGF2YWlsYWJsZSBvciBkb24ndCBzdXBwb3J0IHNldHRpbmcKQEAgLTMxOTUsMTYgKzMxNTgsMjUgQEAKIAkJICogY29uZnVzZSBtYWM4MDIxMS4gKi8KIAkJcmV0dXJuIDA7CiAJfQorCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGI0M19xb3Nfc2htX29mZnNldHMpICE9CisJCSAgICAgQVJSQVlfU0laRSh3bC0+cW9zX3BhcmFtcykpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndsLT5pcnFfbG9jaywgZmxhZ3MpOwotCXAgPSAmKHdsLT5xb3NfcGFyYW1zW3F1ZXVlXSk7Ci0JbWVtY3B5KCYocC0+cCksIHBhcmFtcywgc2l6ZW9mKHAtPnApKTsKLQlwLT5uZWVkX2h3X3VwZGF0ZSA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPmlycV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwlkZXYgPSB3bC0+Y3VycmVudF9kZXY7CisJaWYgKHVubGlrZWx5KCFkZXYgfHwgKGI0M19zdGF0dXMoZGV2KSA8IEI0M19TVEFUX0lOSVRJQUxJWkVEKSkpCisJCWdvdG8gb3V0X3VubG9jazsKIAotCXF1ZXVlX3dvcmsoaHctPndvcmtxdWV1ZSwgJndsLT5xb3NfdXBkYXRlX3dvcmspOworCW1lbWNweSgmKHdsLT5xb3NfcGFyYW1zW3F1ZXVlXS5wKSwgcGFyYW1zLCBzaXplb2YoKnBhcmFtcykpOworCWI0M19tYWNfc3VzcGVuZChkZXYpOworCWI0M19xb3NfcGFyYW1zX3VwbG9hZChkZXYsICYod2wtPnFvc19wYXJhbXNbcXVldWVdLnApLAorCQkJICAgICAgYjQzX3Fvc19zaG1fb2Zmc2V0c1txdWV1ZV0pOworCWI0M19tYWNfZW5hYmxlKGRldik7CisJZXJyID0gMDsKIAotCXJldHVybiAwOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGI0M19vcF9nZXRfdHhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0zNDAxLDcgKzMzNzMsNyBAQAogCS8qIFN3aXRjaCB0byB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuCiAJICogVGhlIGZpcm13YXJlIHRha2VzIGNhcmUgb2YgcmFjZXMgd2l0aCB0aGUgVFggaGFuZGxlci4gKi8KIAlpZiAoY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUgIT0gcGh5LT5jaGFubmVsKQotCQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIGNvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlLCAwKTsKKwkJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUpOwogCiAJLyogRW5hYmxlL0Rpc2FibGUgU2hvcnRTbG90IHRpbWluZy4gKi8KIAlpZiAoKCEhKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfU0hPUlRfU0xPVF9USU1FKSkgIT0KQEAgLTM0MTcsMjYgKzMzODksMzAgQEAKIAogCS8qIEFkanVzdCB0aGUgZGVzaXJlZCBUWCBwb3dlciBsZXZlbC4gKi8KIAlpZiAoY29uZi0+cG93ZXJfbGV2ZWwgIT0gMCkgewotCQlpZiAoY29uZi0+cG93ZXJfbGV2ZWwgIT0gcGh5LT5wb3dlcl9sZXZlbCkgewotCQkJcGh5LT5wb3dlcl9sZXZlbCA9IGNvbmYtPnBvd2VyX2xldmVsOwotCQkJYjQzX3BoeV94bWl0cG93ZXIoZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT5pcnFfbG9jaywgZmxhZ3MpOworCQlpZiAoY29uZi0+cG93ZXJfbGV2ZWwgIT0gcGh5LT5kZXNpcmVkX3R4cG93ZXIpIHsKKwkJCXBoeS0+ZGVzaXJlZF90eHBvd2VyID0gY29uZi0+cG93ZXJfbGV2ZWw7CisJCQliNDNfcGh5X3R4cG93ZXJfY2hlY2soZGV2LCBCNDNfVFhQV1JfSUdOT1JFX1RJTUUgfAorCQkJCQkJICAgQjQzX1RYUFdSX0lHTk9SRV9UU1NJKTsKIAkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+aXJxX2xvY2ssIGZsYWdzKTsKIAl9CiAKIAkvKiBBbnRlbm5hcyBmb3IgUlggYW5kIG1hbmFnZW1lbnQgZnJhbWUgVFguICovCiAJYW50ZW5uYSA9IGI0M19hbnRlbm5hX2Zyb21faWVlZTgwMjExKGRldiwgY29uZi0+YW50ZW5uYV9zZWxfdHgpOwogCWI0M19tZ210ZnJhbWVfdHhhbnRlbm5hKGRldiwgYW50ZW5uYSk7CiAJYW50ZW5uYSA9IGI0M19hbnRlbm5hX2Zyb21faWVlZTgwMjExKGRldiwgY29uZi0+YW50ZW5uYV9zZWxfcngpOwotCWI0M19zZXRfcnhfYW50ZW5uYShkZXYsIGFudGVubmEpOworCWlmIChwaHktPm9wcy0+c2V0X3J4X2FudGVubmEpCisJCXBoeS0+b3BzLT5zZXRfcnhfYW50ZW5uYShkZXYsIGFudGVubmEpOwogCiAJLyogVXBkYXRlIHRlbXBsYXRlcyBmb3IgQVAvbWVzaCBtb2RlLiAqLwotCWlmIChiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfQVApIHx8Ci0JICAgIGI0M19pc19tb2RlKHdsLCBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UKSkKKwlpZiAoYjQzX2lzX21vZGUod2wsIE5MODAyMTFfSUZUWVBFX0FQKSB8fAorCSAgICBiNDNfaXNfbW9kZSh3bCwgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkpCiAJCWI0M19zZXRfYmVhY29uX2ludChkZXYsIGNvbmYtPmJlYWNvbl9pbnQpOwogCiAJaWYgKCEhY29uZi0+cmFkaW9fZW5hYmxlZCAhPSBwaHktPnJhZGlvX29uKSB7CiAJCWlmIChjb25mLT5yYWRpb19lbmFibGVkKSB7Ci0JCQliNDNfcmFkaW9fdHVybl9vbihkZXYpOworCQkJYjQzX3NvZnR3YXJlX3Jma2lsbChkZXYsIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpOwogCQkJYjQzaW5mbyhkZXYtPndsLCAiUmFkaW8gdHVybmVkIG9uIGJ5IHNvZnR3YXJlXG4iKTsKIAkJCWlmICghZGV2LT5yYWRpb19od19lbmFibGUpIHsKIAkJCQliNDNpbmZvKGRldi0+d2wsICJUaGUgaGFyZHdhcmUgUkYta2lsbCBidXR0b24gIgpAQCAtMzQ0NCw3ICszNDIwLDcgQEAKIAkJCQkJIlByZXNzIHRoZSBidXR0b24gdG8gdHVybiBpdCBvbi5cbiIpOwogCQkJfQogCQl9IGVsc2UgewotCQkJYjQzX3JhZGlvX3R1cm5fb2ZmKGRldiwgMCk7CisJCQliNDNfc29mdHdhcmVfcmZraWxsKGRldiwgUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCk7CiAJCQliNDNpbmZvKGRldi0+d2wsICJSYWRpbyB0dXJuZWQgb2ZmIGJ5IHNvZnR3YXJlXG4iKTsKIAkJfQogCX0KQEAgLTM2MTksMTQgKzM1OTUsMTQgQEAKIAllbHNlCiAJCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKIAlpZiAoYjQzX3N0YXR1cyhkZXYpID49IEI0M19TVEFUX0lOSVRJQUxJWkVEKSB7Ci0JCWlmIChiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfQVApIHx8Ci0JCSAgICBiNDNfaXNfbW9kZSh3bCwgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVCkpIHsKKwkJaWYgKGI0M19pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9BUCkgfHwKKwkJICAgIGI0M19pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSkgewogCQkJQjQzX1dBUk5fT04odmlmLT50eXBlICE9IHdsLT5pZl90eXBlKTsKIAkJCWlmIChjb25mLT5jaGFuZ2VkICYgSUVFRTgwMjExX0lGQ0NfU1NJRCkKIAkJCQliNDNfc2V0X3NzaWQoZGV2LCBjb25mLT5zc2lkLCBjb25mLT5zc2lkX2xlbik7CiAJCQlpZiAoY29uZi0+Y2hhbmdlZCAmIElFRUU4MDIxMV9JRkNDX0JFQUNPTikKIAkJCQliNDNfdXBkYXRlX3RlbXBsYXRlcyh3bCk7Ci0JCX0gZWxzZSBpZiAoYjQzX2lzX21vZGUod2wsIElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpKSB7CisJCX0gZWxzZSBpZiAoYjQzX2lzX21vZGUod2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSkgewogCQkJaWYgKGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CRUFDT04pCiAJCQkJYjQzX3VwZGF0ZV90ZW1wbGF0ZXMod2wpOwogCQl9CkBAIC0zODE4LDQ4ICszNzk0LDEwIEBACiBzdGF0aWMgdm9pZCBzZXR1cF9zdHJ1Y3RfcGh5X2Zvcl9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgYjQzX3BoeSAqcGh5KQogewotCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbzsKLQlpbnQgaTsKLQotCW1lbXNldChwaHktPm1pbmxvd3NpZywgMHhGRiwgc2l6ZW9mKHBoeS0+bWlubG93c2lnKSk7Ci0JbWVtc2V0KHBoeS0+bWlubG93c2lncG9zLCAwLCBzaXplb2YocGh5LT5taW5sb3dzaWdwb3MpKTsKLQotCXBoeS0+YWNpX2VuYWJsZSA9IDA7Ci0JcGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSAwOwotCXBoeS0+YWNpX2h3X3Jzc2kgPSAwOwotCi0JcGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IDA7Ci0KLQlsbyA9IHBoeS0+bG9fY29udHJvbDsKLQlpZiAobG8pIHsKLQkJbWVtc2V0KGxvLCAwLCBzaXplb2YoKihwaHktPmxvX2NvbnRyb2wpKSk7Ci0JCWxvLT50eF9iaWFzID0gMHhGRjsKLQkJSU5JVF9MSVNUX0hFQUQoJmxvLT5jYWxpYl9saXN0KTsKLQl9Ci0JcGh5LT5tYXhfbGJfZ2FpbiA9IDA7Ci0JcGh5LT50cnN3X3J4X2dhaW4gPSAwOwotCXBoeS0+dHhwd3Jfb2Zmc2V0ID0gMDsKLQotCS8qIE5SU1NJICovCi0JcGh5LT5ucnNzaXNsb3BlID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwaHktPm5yc3NpKTsgaSsrKQotCQlwaHktPm5yc3NpW2ldID0gLTEwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5LT5ucnNzaV9sdCk7IGkrKykKLQkJcGh5LT5ucnNzaV9sdFtpXSA9IGk7Ci0KLQlwaHktPmxvZmNhbCA9IDB4RkZGRjsKLQlwaHktPmluaXR2YWwgPSAweEZGRkY7Ci0KLQlwaHktPmludGVyZm1vZGUgPSBCNDNfSU5URVJGTU9ERV9OT05FOwotCXBoeS0+Y2hhbm5lbCA9IDB4RkY7Ci0KIAlwaHktPmhhcmR3YXJlX3Bvd2VyX2NvbnRyb2wgPSAhIW1vZHBhcmFtX2h3cGN0bDsKLQorCXBoeS0+bmV4dF90eHB3cl9jaGVja190aW1lID0gamlmZmllczsKIAkvKiBQSFkgVFggZXJyb3JzIGNvdW50ZXIuICovCiAJYXRvbWljX3NldCgmcGh5LT50eGVycl9jbnQsIEI0M19QSFlfVFhfQkFETkVTU19MSU1JVCk7Ci0KLQkvKiBPRkRNLXRhYmxlIGFkZHJlc3MgY2FjaGluZy4gKi8KLQlwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fVU5LTk9XTjsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfc3RydWN0X3dsZGV2X2Zvcl9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKQEAgLTM5NjUsNyArMzkwMyw3IEBACiAJCXB1X2RlbGF5ID0gMzcwMDsKIAllbHNlCiAJCXB1X2RlbGF5ID0gMTA1MDsKLQlpZiAoYjQzX2lzX21vZGUoZGV2LT53bCwgSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgfHwgaWRsZSkKKwlpZiAoYjQzX2lzX21vZGUoZGV2LT53bCwgTkw4MDIxMV9JRlRZUEVfQURIT0MpIHx8IGlkbGUpCiAJCXB1X2RlbGF5ID0gNTAwOwogCWlmICgoZGV2LT5waHkucmFkaW9fdmVyID09IDB4MjA1MCkgJiYgKGRldi0+cGh5LnJhZGlvX3JldiA9PSA4KSkKIAkJcHVfZGVsYXkgPSBtYXgocHVfZGVsYXksICh1MTYpMjQwMCk7CkBAIC0zOTc5LDcgKzM5MTcsNyBAQAogCXUxNiBwcmV0YnR0OwogCiAJLyogVGhlIHRpbWUgdmFsdWUgaXMgaW4gbWljcm9zZWNvbmRzLiAqLwotCWlmIChiNDNfaXNfbW9kZShkZXYtPndsLCBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSkgeworCWlmIChiNDNfaXNfbW9kZShkZXYtPndsLCBOTDgwMjExX0lGVFlQRV9BREhPQykpIHsKIAkJcHJldGJ0dCA9IDI7CiAJfSBlbHNlIHsKIAkJaWYgKGRldi0+cGh5LnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkKQEAgLTM5OTUsNyArMzkzMyw2IEBACiAvKiBMb2NraW5nOiB3bC0+bXV0ZXggKi8KIHN0YXRpYyB2b2lkIGI0M193aXJlbGVzc19jb3JlX2V4aXQoc3RydWN0IGI0M193bGRldiAqZGV2KQogewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJdTMyIG1hY2N0bDsKIAogCUI0M19XQVJOX09OKGI0M19zdGF0dXMoZGV2KSA+IEI0M19TVEFUX0lOSVRJQUxJWkVEKTsKQEAgLTQwMTYsMTIgKzM5NTMsNyBAQAogCWI0M19kbWFfZnJlZShkZXYpOwogCWI0M19waW9fZnJlZShkZXYpOwogCWI0M19jaGlwX2V4aXQoZGV2KTsKLQliNDNfcmFkaW9fdHVybl9vZmYoZGV2LCAxKTsKLQliNDNfc3dpdGNoX2FuYWxvZyhkZXYsIDApOwotCWlmIChwaHktPmR5bl90c3NpX3RibCkKLQkJa2ZyZWUocGh5LT50c3NpMmRibSk7Ci0Ja2ZyZWUocGh5LT5sb19jb250cm9sKTsKLQlwaHktPmxvX2NvbnRyb2wgPSBOVUxMOworCWRldi0+cGh5Lm9wcy0+c3dpdGNoX2FuYWxvZyhkZXYsIDApOwogCWlmIChkZXYtPndsLT5jdXJyZW50X2JlYWNvbikgewogCQlkZXZfa2ZyZWVfc2tiX2FueShkZXYtPndsLT5jdXJyZW50X2JlYWNvbik7CiAJCWRldi0+d2wtPmN1cnJlbnRfYmVhY29uID0gTlVMTDsKQEAgLTQwNTIsMjkgKzM5ODQsMjMgQEAKIAkJYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCB0bXApOwogCX0KIAotCWlmICgocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0IpIHx8IChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykpIHsKLQkJcGh5LT5sb19jb250cm9sID0KLQkJICAgIGt6YWxsb2Moc2l6ZW9mKCoocGh5LT5sb19jb250cm9sKSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBoeS0+bG9fY29udHJvbCkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2J1c2Rvd247Ci0JCX0KLQl9CisJLyogUmVzZXQgYWxsIGRhdGEgc3RydWN0dXJlcy4gKi8KIAlzZXR1cF9zdHJ1Y3Rfd2xkZXZfZm9yX2luaXQoZGV2KTsKLQotCWVyciA9IGI0M19waHlfaW5pdF90c3NpMmRibV90YWJsZShkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2tmcmVlX2xvX2NvbnRyb2w7CisJcGh5LT5vcHMtPnByZXBhcmVfc3RydWN0cyhkZXYpOwogCiAJLyogRW5hYmxlIElSUSByb3V0aW5nIHRvIHRoaXMgZGV2aWNlLiAqLwogCXNzYl9wY2ljb3JlX2Rldl9pcnF2ZWNzX2VuYWJsZSgmYnVzLT5wY2ljb3JlLCBkZXYtPmRldik7CiAKIAliNDNfaW1jZmdsb190aW1lb3V0c193b3JrYXJvdW5kKGRldik7CiAJYjQzX2JsdWV0b290aF9jb2V4dF9kaXNhYmxlKGRldik7Ci0JYjQzX3BoeV9lYXJseV9pbml0KGRldik7CisJaWYgKHBoeS0+b3BzLT5wcmVwYXJlX2hhcmR3YXJlKSB7CisJCWVyciA9IHBoeS0+b3BzLT5wcmVwYXJlX2hhcmR3YXJlKGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9idXNkb3duOworCX0KIAllcnIgPSBiNDNfY2hpcF9pbml0KGRldik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfa2ZyZWVfdHNzaXRibDsKKwkJZ290byBlcnJfYnVzZG93bjsKIAliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwKIAkJCUI0M19TSE1fU0hfV0xDT1JFUkVWLCBkZXYtPmRldi0+aWQucmV2aXNpb24pOwogCWhmID0gYjQzX2hmX3JlYWQoZGV2KTsKQEAgLTQxNDAsMTUgKzQwNjYsOSBAQAogb3V0OgogCXJldHVybiBlcnI7CiAKLSAgICAgIGVycl9jaGlwX2V4aXQ6CitlcnJfY2hpcF9leGl0OgogCWI0M19jaGlwX2V4aXQoZGV2KTsKLSAgICAgIGVycl9rZnJlZV90c3NpdGJsOgotCWlmIChwaHktPmR5bl90c3NpX3RibCkKLQkJa2ZyZWUocGh5LT50c3NpMmRibSk7Ci0gICAgICBlcnJfa2ZyZWVfbG9fY29udHJvbDoKLQlrZnJlZShwaHktPmxvX2NvbnRyb2wpOwotCXBoeS0+bG9fY29udHJvbCA9IE5VTEw7Ci0gICAgICBlcnJfYnVzZG93bjoKK2Vycl9idXNkb3duOgogCXNzYl9idXNfbWF5X3Bvd2VyZG93bihidXMpOwogCUI0M19XQVJOX09OKGI0M19zdGF0dXMoZGV2KSAhPSBCNDNfU1RBVF9VTklOSVQpOwogCXJldHVybiBlcnI7CkBAIC00MTY0LDExICs0MDg0LDExIEBACiAKIAkvKiBUT0RPOiBhbGxvdyBXRFMvQVAgZGV2aWNlcyB0byBjb2V4aXN0ICovCiAKLQlpZiAoY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCAmJgotCSAgICBjb25mLT50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9XRFMgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCWlmIChjb25mLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIGNvbmYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCAmJgorCSAgICBjb25mLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgY29uZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9XRFMgJiYKKwkgICAgY29uZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKQEAgLTQyODMsNyArNDIwMyw2IEBACiAJc3RydWN0IGI0M193bGRldiAqZGV2ID0gd2wtPmN1cnJlbnRfZGV2OwogCiAJYjQzX3Jma2lsbF9leGl0KGRldik7Ci0JY2FuY2VsX3dvcmtfc3luYygmKHdsLT5xb3NfdXBkYXRlX3dvcmspKTsKIAljYW5jZWxfd29ya19zeW5jKCYod2wtPmJlYWNvbl91cGRhdGVfdHJpZ2dlcikpOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKQEAgLTQyOTEsNiArNDIxMCw4IEBACiAJCWI0M193aXJlbGVzc19jb3JlX3N0b3AoZGV2KTsKIAliNDNfd2lyZWxlc3NfY29yZV9leGl0KGRldik7CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCisJY2FuY2VsX3dvcmtfc3luYygmKHdsLT50eHBvd2VyX2FkanVzdF93b3JrKSk7CiB9CiAKIHN0YXRpYyBpbnQgYjQzX29wX3NldF9yZXRyeV9saW1pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTQzMTMsNyArNDIzNCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBiNDNfb3BfYmVhY29uX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBhaWQsIGludCBzZXQpCitzdGF0aWMgaW50IGI0M19vcF9iZWFjb25fc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgYm9vbCBzZXQpCiB7CiAJc3RydWN0IGI0M193bCAqd2wgPSBod190b19iNDNfd2woaHcpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MzI4LDcgKzQyNTAsNyBAQAogc3RhdGljIHZvaWQgYjQzX29wX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICAgZW51bSBzdGFfbm90aWZ5X2NtZCBub3RpZnlfY21kLAotCQkJICAgICAgY29uc3QgdTggKmFkZHIpCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCBiNDNfd2wgKndsID0gaHdfdG9fYjQzX3dsKGh3KTsKIApAQCAtNDQyMiw2ICs0MzQ0LDcgQEAKIAkvKiBXZSByZWxlYXNlIGZpcm13YXJlIHRoYXQgbGF0ZSB0byBub3QgYmUgcmVxdWlyZWQgdG8gcmUtcmVxdWVzdAogCSAqIGlzIGFsbCB0aGUgdGltZSB3aGVuIHdlIHJlaW5pdCB0aGUgY29yZS4gKi8KIAliNDNfcmVsZWFzZV9maXJtd2FyZShkZXYpOworCWI0M19waHlfZnJlZShkZXYpOwogfQogCiBzdGF0aWMgaW50IGI0M193aXJlbGVzc19jb3JlX2F0dGFjaChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCkBAIC00NDk1LDMwICs0NDE4LDM1IEBACiAJCX0KIAl9CiAKKwllcnIgPSBiNDNfcGh5X2FsbG9jYXRlKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfcG93ZXJkb3duOworCiAJZGV2LT5waHkuZ21vZGUgPSBoYXZlXzJnaHpfcGh5OwogCXRtcCA9IGRldi0+cGh5Lmdtb2RlID8gQjQzX1RNU0xPV19HTU9ERSA6IDA7CiAJYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCB0bXApOwogCiAJZXJyID0gYjQzX3ZhbGlkYXRlX2NoaXBhY2Nlc3MoZGV2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9wb3dlcmRvd247CisJCWdvdG8gZXJyX3BoeV9mcmVlOwogCWVyciA9IGI0M19zZXR1cF9iYW5kcyhkZXYsIGhhdmVfMmdoel9waHksIGhhdmVfNWdoel9waHkpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX3Bvd2VyZG93bjsKKwkJZ290byBlcnJfcGh5X2ZyZWU7CiAKIAkvKiBOb3cgc2V0IHNvbWUgZGVmYXVsdCAiY3VycmVudF9kZXYiICovCiAJaWYgKCF3bC0+Y3VycmVudF9kZXYpCiAJCXdsLT5jdXJyZW50X2RldiA9IGRldjsKIAlJTklUX1dPUksoJmRldi0+cmVzdGFydF93b3JrLCBiNDNfY2hpcF9yZXNldCk7CiAKLQliNDNfcmFkaW9fdHVybl9vZmYoZGV2LCAxKTsKLQliNDNfc3dpdGNoX2FuYWxvZyhkZXYsIDApOworCWRldi0+cGh5Lm9wcy0+c3dpdGNoX2FuYWxvZyhkZXYsIDApOwogCXNzYl9kZXZpY2VfZGlzYWJsZShkZXYtPmRldiwgMCk7CiAJc3NiX2J1c19tYXlfcG93ZXJkb3duKGJ1cyk7CiAKIG91dDoKIAlyZXR1cm4gZXJyOwogCitlcnJfcGh5X2ZyZWU6CisJYjQzX3BoeV9mcmVlKGRldik7CiBlcnJfcG93ZXJkb3duOgogCXNzYl9idXNfbWF5X3Bvd2VyZG93bihidXMpOwogCXJldHVybiBlcnI7CkBAIC00NjE1LDkgKzQ1NDMsMTEgQEAKIAkJcGRldiA9IGJ1cy0+aG9zdF9wY2k7CiAJCWlmIChJU19QREVWKHBkZXYsIEJST0FEQ09NLCAweDQzMTgsIEFTVVNURUssIDB4MTAwRikgfHwKIAkJICAgIElTX1BERVYocGRldiwgQlJPQURDT00sIDB4NDMyMCwgICAgREVMTCwgMHgwMDAzKSB8fAorCQkgICAgSVNfUERFVihwZGV2LCBCUk9BRENPTSwgMHg0MzIwLCAgICAgIEhQLCAweDEyZjgpIHx8CiAJCSAgICBJU19QREVWKHBkZXYsIEJST0FEQ09NLCAweDQzMjAsIExJTktTWVMsIDB4MDAxNSkgfHwKIAkJICAgIElTX1BERVYocGRldiwgQlJPQURDT00sIDB4NDMyMCwgTElOS1NZUywgMHgwMDE0KSB8fAotCQkgICAgSVNfUERFVihwZGV2LCBCUk9BRENPTSwgMHg0MzIwLCBMSU5LU1lTLCAweDAwMTMpKQorCQkgICAgSVNfUERFVihwZGV2LCBCUk9BRENPTSwgMHg0MzIwLCBMSU5LU1lTLCAweDAwMTMpIHx8CisJCSAgICBJU19QREVWKHBkZXYsIEJST0FEQ09NLCAweDQzMjAsIE1PVE9ST0xBLCAweDcwMTApKQogCQkJYnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICY9IH5CNDNfQkZMX0JUQ09FWElTVDsKIAl9CiB9CkBAIC00NjUwLDcgKzQ1ODAsMTUgQEAKIAkJICAgIElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKIAkJICAgIElFRUU4MDIxMV9IV19OT0lTRV9EQk07CiAKKwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJCUJJVChOTDgwMjExX0lGVFlQRV9BUCkgfAorCQlCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgfAorCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCQlCSVQoTkw4MDIxMV9JRlRZUEVfV0RTKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisKIAlody0+cXVldWVzID0gYjQzX21vZHBhcmFtX3FvcyA/IDQgOiAxOworCWh3LT5tYXhfYWx0cmF0ZXMgPSAxOwogCVNFVF9JRUVFODAyMTFfREVWKGh3LCBkZXYtPmRldik7CiAJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoc3Byb20tPmV0MW1hYykpCiAJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBzcHJvbS0+ZXQxbWFjKTsKQEAgLTQ2NjcsOCArNDYwNSw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJndsLT5zaG1fbG9jayk7CiAJbXV0ZXhfaW5pdCgmd2wtPm11dGV4KTsKIAlJTklUX0xJU1RfSEVBRCgmd2wtPmRldmxpc3QpOwotCUlOSVRfV09SSygmd2wtPnFvc191cGRhdGVfd29yaywgYjQzX3Fvc191cGRhdGVfd29yayk7CiAJSU5JVF9XT1JLKCZ3bC0+YmVhY29uX3VwZGF0ZV90cmlnZ2VyLCBiNDNfYmVhY29uX3VwZGF0ZV90cmlnZ2VyX3dvcmspOworCUlOSVRfV09SSygmd2wtPnR4cG93ZXJfYWRqdXN0X3dvcmssIGI0M19waHlfdHhwb3dlcl9hZGp1c3Rfd29yayk7CiAKIAlzc2Jfc2V0X2RldnR5cGVkYXRhKGRldiwgd2wpOwogCWI0M2luZm8od2wsICJCcm9hZGNvbSAlMDRYIFdMQU4gZm91bmRcbiIsIGRldi0+YnVzLT5jaGlwX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9ucGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbnBoeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRlZWQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9ucGh5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoKLQotICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCi0gIElFRUUgODAyLjExbiBQSFkgc3VwcG9ydAotCi0gIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKLSAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJiNDMuaCIKLSNpbmNsdWRlICJucGh5LmgiCi0jaW5jbHVkZSAidGFibGVzX25waHkuaCIKLQotCi12b2lkIGI0M19ucGh5X3NldF9yeGFudGVubmEoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgYW50ZW5uYSkKLXsvL1RPRE8KLX0KLQotdm9pZCBiNDNfbnBoeV94bWl0cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2KQotey8vVE9ETwotfQotCi1zdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9yYWRpb191cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnkgKmUpCi17Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9QTExfUkVGLCBlLT5yYWRpb19wbGxfcmVmKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1JGX1BMTE1PRDAsIGUtPnJhZGlvX3JmX3BsbG1vZDApOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfUkZfUExMTU9EMSwgZS0+cmFkaW9fcmZfcGxsbW9kMSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9WQ09fQ0FQVEFJTCwgZS0+cmFkaW9fdmNvX2NhcHRhaWwpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfVkNPX0NBTDEsIGUtPnJhZGlvX3Zjb19jYWwxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1ZDT19DQUwyLCBlLT5yYWRpb192Y29fY2FsMik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9QTExfTEZDMSwgZS0+cmFkaW9fcGxsX2xmYzEpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfUExMX0xGUjEsIGUtPnJhZGlvX3BsbF9sZnIxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1BMTF9MRkMyLCBlLT5yYWRpb19wbGxfbGZjMik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9MR0JVRl9DRU5CVUYsIGUtPnJhZGlvX2xnYnVmX2NlbmJ1Zik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9MR0VOX1RVTkUxLCBlLT5yYWRpb19sZ2VuX3R1bmUxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0xHRU5fVFVORTIsIGUtPnJhZGlvX2xnZW5fdHVuZTIpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQzFfTEdCVUZfQVRVTkUsIGUtPnJhZGlvX2MxX2xnYnVmX2F0dW5lKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX0xHQlVGX0dUVU5FLCBlLT5yYWRpb19jMV9sZ2J1Zl9ndHVuZSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9SWF9SRlIxLCBlLT5yYWRpb19jMV9yeF9yZnIxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX1RYX1BHQVBBRFROLCBlLT5yYWRpb19jMV90eF9wZ2FwYWR0bik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9UWF9NWEJHVFJJTSwgZS0+cmFkaW9fYzFfdHhfbXhiZ3RyaW0pOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQzJfTEdCVUZfQVRVTkUsIGUtPnJhZGlvX2MyX2xnYnVmX2F0dW5lKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX0xHQlVGX0dUVU5FLCBlLT5yYWRpb19jMl9sZ2J1Zl9ndHVuZSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMl9SWF9SRlIxLCBlLT5yYWRpb19jMl9yeF9yZnIxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX1RYX1BHQVBBRFROLCBlLT5yYWRpb19jMl90eF9wZ2FwYWR0bik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMl9UWF9NWEJHVFJJTSwgZS0+cmFkaW9fYzJfdHhfbXhiZ3RyaW0pOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9waHlfdXBsb2FkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeSAqZSkKLXsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQlcxQSwgZS0+cGh5X2J3MWEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzIsIGUtPnBoeV9idzIpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzMsIGUtPnBoeV9idzMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzQsIGUtPnBoeV9idzQpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzUsIGUtPnBoeV9idzUpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzYsIGUtPnBoeV9idzYpOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV90eF9wb3dlcl9maXgoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCS8vVE9ETwotfQotCi0vKiBUdW5lIHRoZSBoYXJkd2FyZSB0byBhIG5ldyBjaGFubmVsLiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuCi0gKiBVc2UgYjQzX3JhZGlvX3NlbGVjdGNoYW5uZWwoKSAqLwotaW50IGI0M19ucGh5X3NlbGVjdGNoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjaGFubmVsKQotewotCWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5ICp0YWJlbnQ7Ci0KLQl0YWJlbnQgPSBiNDNfbnBoeV9nZXRfY2hhbnRhYmVudChkZXYsIGNoYW5uZWwpOwotCWlmICghdGFiZW50KQotCQlyZXR1cm4gLUVTUkNIOwotCi0JLy9GSVhNRSBlbmFibGUvZGlzYWJsZSBiYW5kIHNlbGVjdCB1cHBlcjIwIGluIFJYQ1RMCi0JaWYgKDAgLypGSVhNRSA1R2h6Ki8pCi0JCWI0M19yYWRpb19tYXNrc2V0KGRldiwgQjIwNTVfTUFTVEVSMSwgMHhGRjhGLCAweDIwKTsKLQllbHNlCi0JCWI0M19yYWRpb19tYXNrc2V0KGRldiwgQjIwNTVfTUFTVEVSMSwgMHhGRjhGLCAweDUwKTsKLQliNDNfY2hhbnRhYl9yYWRpb191cGxvYWQoZGV2LCB0YWJlbnQpOwotCXVkZWxheSg1MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9WQ09fQ0FMMTAsIDUpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfVkNPX0NBTDEwLCA0NSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9WQ09fQ0FMMTAsIDY1KTsKLQl1ZGVsYXkoMzAwKTsKLQlpZiAoMCAvKkZJWE1FIDVHaHoqLykKLQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9CQU5EQ1RMLCBCNDNfTlBIWV9CQU5EQ1RMXzVHSFopOwotCWVsc2UKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQkFORENUTCwgfkI0M19OUEhZX0JBTkRDVExfNUdIWik7Ci0JYjQzX2NoYW50YWJfcGh5X3VwbG9hZChkZXYsIHRhYmVudCk7Ci0JYjQzX25waHlfdHhfcG93ZXJfZml4KGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3JhZGlvX2luaXQyMDU1X3ByZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkgICAgIH5CNDNfTlBIWV9SRkNUTF9DTURfUE9SRk9SQ0UpOwotCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkgICAgQjQzX05QSFlfUkZDVExfQ01EX0NISVAwUFUgfAotCQkgICAgQjQzX05QSFlfUkZDVExfQ01EX09FUE9SRk9SQ0UpOwotCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkgICAgQjQzX05QSFlfUkZDVExfQ01EX1BPUkZPUkNFKTsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3JhZGlvX2luaXQyMDU1X3Bvc3Qoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJihkZXYtPmRldi0+YnVzLT5zcHJvbSk7Ci0Jc3RydWN0IHNzYl9ib2FyZGluZm8gKmJpbmZvID0gJihkZXYtPmRldi0+YnVzLT5ib2FyZGluZm8pOwotCWludCBpOwotCXUxNiB2YWw7Ci0KLQliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X01BU1RFUjEsIDB4RkZGMyk7Ci0JbXNsZWVwKDEpOwotCWlmICgoc3Byb20tPnJldmlzaW9uICE9IDQpIHx8ICEoc3Byb20tPmJvYXJkZmxhZ3NfaGkgJiAweDAwMDIpKSB7Ci0JCWlmICgoYmluZm8tPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NKSB8fAotCQkgICAgKGJpbmZvLT50eXBlICE9IDB4NDZEKSB8fAotCQkgICAgKGJpbmZvLT5yZXYgPCAweDQxKSkgewotCQkJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DMV9SWF9CQl9SRUcsIDB4N0YpOwotCQkJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DMV9SWF9CQl9SRUcsIDB4N0YpOwotCQkJbXNsZWVwKDEpOwotCQl9Ci0JfQotCWI0M19yYWRpb19tYXNrc2V0KGRldiwgQjIwNTVfUlJDQ0FMX05PUFRTRUwsIDB4M0YsIDB4MkMpOwotCW1zbGVlcCgxKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0NBTF9NSVNDLCAweDNDKTsKLQltc2xlZXAoMSk7Ci0JYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DQUxfTUlTQywgMHhGRkJFKTsKLQltc2xlZXAoMSk7Ci0JYjQzX3JhZGlvX3NldChkZXYsIEIyMDU1X0NBTF9MUE9DVEwsIDB4ODApOwotCW1zbGVlcCgxKTsKLQliNDNfcmFkaW9fc2V0KGRldiwgQjIwNTVfQ0FMX01JU0MsIDB4MSk7Ci0JbXNsZWVwKDEpOwotCWI0M19yYWRpb19zZXQoZGV2LCBCMjA1NV9DQUxfTUlTQywgMHg0MCk7Ci0JbXNsZWVwKDEpOwotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQl2YWwgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgQjIwNTVfQ0FMX0NPVVQyKTsKLQkJaWYgKHZhbCAmIDB4ODApCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0JbXNsZWVwKDEpOwotCWI0M19yYWRpb19tYXNrKGRldiwgQjIwNTVfQ0FMX0xQT0NUTCwgMHhGRjdGKTsKLQltc2xlZXAoMSk7Ci0JYjQzX3JhZGlvX3NlbGVjdGNoYW5uZWwoZGV2LCBkZXYtPnBoeS5jaGFubmVsLCAwKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX1JYX0JCX0xQRiwgMHg5KTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX1JYX0JCX0xQRiwgMHg5KTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX1JYX0JCX01JREFDSFAsIDB4ODMpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQzJfUlhfQkJfTUlEQUNIUCwgMHg4Myk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBCcm9hZGNvbSAyMDU1IE4tcmFkaW8gKi8KLXN0YXRpYyB2b2lkIGI0M19yYWRpb19pbml0MjA1NShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JYjQzX3JhZGlvX2luaXQyMDU1X3ByZShkZXYpOwotCWlmIChiNDNfc3RhdHVzKGRldikgPCBCNDNfU1RBVF9JTklUSUFMSVpFRCkKLQkJYjIwNTVfdXBsb2FkX2luaXR0YWIoZGV2LCAwLCAxKTsKLQllbHNlCi0JCWIyMDU1X3VwbG9hZF9pbml0dGFiKGRldiwgMC8qRklYTUUgb24gNWdoeiBiYW5kKi8sIDApOwotCWI0M19yYWRpb19pbml0MjA1NV9wb3N0KGRldik7Ci19Ci0KLXZvaWQgYjQzX25waHlfcmFkaW9fdHVybl9vbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JYjQzX3JhZGlvX2luaXQyMDU1KGRldik7Ci19Ci0KLXZvaWQgYjQzX25waHlfcmFkaW9fdHVybl9vZmYoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKLQkJICAgICB+QjQzX05QSFlfUkZDVExfQ01EX0VOKTsKLX0KLQotI2RlZmluZSBudGFiX3VwbG9hZChkZXYsIG9mZnNldCwgZGF0YSkgZG8geyBcCi0JCXVuc2lnbmVkIGludCBpOwkJCQkJCVwKLQkJZm9yIChpID0gMDsgaSA8IChvZmZzZXQjI19TSVpFKTsgaSsrKQkJCVwKLQkJCWI0M19udGFiX3dyaXRlKGRldiwgKG9mZnNldCkgKyBpLCAoZGF0YSlbaV0pOwlcCi0JfSB3aGlsZSAoMCkKLQotLyogVXBsb2FkIHRoZSBOLVBIWSB0YWJsZXMuICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV90YWJsZXNfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JLyogU3RhdGljIHRhYmxlcyAqLwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfRlJBTUVTVFJVQ1QsIGI0M19udGFiX2ZyYW1lc3RydWN0KTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0ZSQU1FTFQsIGI0M19udGFiX2ZyYW1lbG9va3VwKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RNQVAsIGI0M19udGFiX3RtYXApOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERUUk4sIGI0M19udGFiX3RkdHJuKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0lOVExFVkVMLCBiNDNfbnRhYl9pbnRsZXZlbCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9QSUxPVCwgYjQzX250YWJfcGlsb3QpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfUElMT1RMVCwgYjQzX250YWJfcGlsb3RsdCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UREkyMEEwLCBiNDNfbnRhYl90ZGkyMGEwKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTIwQTEsIGI0M19udGFiX3RkaTIwYTEpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMCwgYjQzX250YWJfdGRpNDBhMCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UREk0MEExLCBiNDNfbnRhYl90ZGk0MGExKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0JESSwgYjQzX250YWJfYmRpKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0NIQU5FU1QsIGI0M19udGFiX2NoYW5uZWxlc3QpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTUNTLCBiNDNfbnRhYl9tY3MpOwotCi0JLyogVm9sYXRpbGUgdGFibGVzICovCi0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9OT0lTRVZBUjEwLCBiNDNfbnRhYl9ub2lzZXZhcjEwKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX05PSVNFVkFSMTEsIGI0M19udGFiX25vaXNldmFyMTEpOwotCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfRVNUUExULCBiNDNfbnRhYl9lc3RpbWF0ZXBvd2VybHQwKTsKLQludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MxX0VTVFBMVCwgYjQzX250YWJfZXN0aW1hdGVwb3dlcmx0MSk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9BREpQTFQsIGI0M19udGFiX2FkanVzdHBvd2VyMCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9BREpQTFQsIGI0M19udGFiX2FkanVzdHBvd2VyMSk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9HQUlOQ1RMLCBiNDNfbnRhYl9nYWluY3RsMCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9HQUlOQ1RMLCBiNDNfbnRhYl9nYWluY3RsMSk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9JUUxULCBiNDNfbnRhYl9pcWx0MCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9JUUxULCBiNDNfbnRhYl9pcWx0MSk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMF9MT0ZFRURUSCwgYjQzX250YWJfbG9mdGx0MCk7Ci0JbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9MT0ZFRURUSCwgYjQzX250YWJfbG9mdGx0MSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXVuc2lnbmVkIGludCBpOwotCi0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9JUUZMSVAsCi0JCSAgICBCNDNfTlBIWV9JUUZMSVBfQURDMSB8IEI0M19OUEhZX0lRRkxJUF9BREMyKTsKLQlpZiAoMSAvKiBGSVhNRSBiYW5kIGlzIDIuNEdIeiAqLykgewotCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0NMQVNTQ1RMLAotCQkJICAgIEI0M19OUEhZX0NMQVNTQ1RMX0NDS0VOKTsKLQl9IGVsc2UgewotCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9DTEFTU0NUTCwKLQkJCSAgICAgfkI0M19OUEhZX0NMQVNTQ1RMX0NDS0VOKTsKLQl9Ci0JYjQzX3JhZGlvX3NldChkZXYsIEIyMDU1X0MxX1RYX1JGX1NQQVJFLCAweDgpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZSQU1FREVMQVksIDgpOwotCi0JLyogRml4dXAgc29tZSB0YWJsZXMgKi8KLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwMCksIDB4QSk7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTApLCAweEEpOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDAyKSwgMHhDREFBKTsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgxMiksIDB4Q0RBQSk7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDgpLCAwKTsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgxOCksIDApOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDA3KSwgMHg3QUFCKTsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgxNyksIDB4N0FBQik7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDYpLCAweDgwMCk7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTYpLCAweDgwMCk7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8xLCAweDJEOCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMSwgMHgzMDEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzIsIDB4MkQ4KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLCAweDMwMSk7Ci0KLQkvL1RPRE8gc2V0IFJGIHNlcXVlbmNlCi0KLQkvKiBTZXQgbmFycm93YmFuZCBjbGlwIHRocmVzaG9sZCAqLwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9OQkNMSVBUSFJFUywgNjYpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9OQkNMSVBUSFJFUywgNjYpOwotCi0JLyogU2V0IHdpZGViYW5kIGNsaXAgMiB0aHJlc2hvbGQgKi8KLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMV9DTElQV0JUSFJFUywKLQkJCX5CNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMiwKLQkJCTIxIDw8IEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTX0NMSVAyX1NISUZUKTsKLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9DTElQV0JUSFJFUywKLQkJCX5CNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMiwKLQkJCTIxIDw8IEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAyX1NISUZUKTsKLQotCS8qIFNldCBDbGlwIDIgZGV0ZWN0ICovCi0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DMV9DR0FJTkksCi0JCSAgICBCNDNfTlBIWV9DMV9DR0FJTklfQ0wyREVURUNUKTsKLQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0MyX0NHQUlOSSwKLQkJICAgIEI0M19OUEhZX0MyX0NHQUlOSV9DTDJERVRFQ1QpOwotCi0JaWYgKDAgLypGSVhNRSovKSB7Ci0JCS8qIFNldCBkd2VsbCBsZW5ndGhzICovCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DTElQMV9OQkRXRUxMX0xFTiwgNDMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ0xJUDJfTkJEV0VMTF9MRU4sIDQzKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1cxQ0xJUDFfRFdFTExfTEVOLCA5KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1cxQ0xJUDJfRFdFTExfTEVOLCA5KTsKLQotCQkvKiBTZXQgZ2FpbiBiYWNrb2ZmICovCi0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0NHQUlOSSwKLQkJCQl+QjQzX05QSFlfQzFfQ0dBSU5JX0dBSU5CS09GRiwKLQkJCQkxIDw8IEI0M19OUEhZX0MxX0NHQUlOSV9HQUlOQktPRkZfU0hJRlQpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9DR0FJTkksCi0JCQkJfkI0M19OUEhZX0MyX0NHQUlOSV9HQUlOQktPRkYsCi0JCQkJMSA8PCBCNDNfTlBIWV9DMl9DR0FJTklfR0FJTkJLT0ZGX1NISUZUKTsKLQotCQkvKiBTZXQgSFBWR0EyIGluZGV4ICovCi0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0lOSVRHQUlOLAotCQkJCX5CNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTIsCi0JCQkJNiA8PCBCNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTJfU0hJRlQpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9JTklUR0FJTiwKLQkJCQl+QjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0EyLAotCQkJCTYgPDwgQjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0EyX1NISUZUKTsKLQotCQkvL0ZJWE1FIHZlcmlmeSB0aGF0IHRoZSBzcGVjcyByZWFsbHkgbWVhbiB0byB1c2UgYXV0b2luYyBoZXJlLgotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDcsIDB4MTA2KSArIGksIDB4NjczKTsKLQl9Ci0KLQkvKiBTZXQgbWluaW11bSBnYWluIHZhbHVlICovCi0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfTUlOTUFYX0dBSU4sCi0JCQl+QjQzX05QSFlfQzFfTUlOR0FJTiwKLQkJCTIzIDw8IEI0M19OUEhZX0MxX01JTkdBSU5fU0hJRlQpOwotCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MyX01JTk1BWF9HQUlOLAotCQkJfkI0M19OUEhZX0MyX01JTkdBSU4sCi0JCQkyMyA8PCBCNDNfTlBIWV9DMl9NSU5HQUlOX1NISUZUKTsKLQotCWlmIChwaHktPnJldiA8IDIpIHsKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfU0NSQU1fU0lHQ1RMLAotCQkJICAgICB+QjQzX05QSFlfU0NSQU1fU0lHQ1RMX1NDTSk7Ci0JfQotCi0JLyogU2V0IHBoYXNlIHRyYWNrIGFscGhhIGFuZCBiZXRhICovCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQTAsIDB4MTI1KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMSwgMHgxQjMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0EyLCAweDEwNSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQjAsIDB4MTZFKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMSwgMHhDRCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQjIsIDB4MjApOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yZXNldF9jY2Eoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXUxNiBiYmNmZzsKLQotCXNzYl93cml0ZTMyKGRldi0+ZGV2LCBTU0JfVE1TTE9XLAotCQkgICAgc3NiX3JlYWQzMihkZXYtPmRldiwgU1NCX1RNU0xPVykgfCBTU0JfVE1TTE9XX0ZHQyk7Ci0JYmJjZmcgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQkNGRyk7Ci0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9CQkNGRywgQjQzX05QSFlfQkJDRkdfUlNUQ0NBKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQkJDRkcsCi0JCSAgICAgIGJiY2ZnICYgfkI0M19OUEhZX0JCQ0ZHX1JTVENDQSk7Ci0Jc3NiX3dyaXRlMzIoZGV2LT5kZXYsIFNTQl9UTVNMT1csCi0JCSAgICBzc2JfcmVhZDMyKGRldi0+ZGV2LCBTU0JfVE1TTE9XKSAmIH5TU0JfVE1TTE9XX0ZHQyk7Ci19Ci0KLWVudW0gYjQzX25waHlfcmZfc2VxdWVuY2UgewotCUI0M19SRlNFUV9SWDJUWCwKLQlCNDNfUkZTRVFfVFgyUlgsCi0JQjQzX1JGU0VRX1JFU0VUMlJYLAotCUI0M19SRlNFUV9VUERBVEVfR0FJTkgsCi0JQjQzX1JGU0VRX1VQREFURV9HQUlOTCwKLQlCNDNfUkZTRVFfVVBEQVRFX0dBSU5VLAotfTsKLQotc3RhdGljIHZvaWQgYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2Uoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgICAgICBlbnVtIGI0M19ucGh5X3JmX3NlcXVlbmNlIHNlcSkKLXsKLQlzdGF0aWMgY29uc3QgdTE2IHRyaWdnZXJbXSA9IHsKLQkJW0I0M19SRlNFUV9SWDJUWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9SWDJUWCwKLQkJW0I0M19SRlNFUV9UWDJSWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9UWDJSWCwKLQkJW0I0M19SRlNFUV9SRVNFVDJSWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9SU1QyUlgsCi0JCVtCNDNfUkZTRVFfVVBEQVRFX0dBSU5IXQk9IEI0M19OUEhZX1JGU0VRVFJfVVBHSCwKLQkJW0I0M19SRlNFUV9VUERBVEVfR0FJTkxdCT0gQjQzX05QSFlfUkZTRVFUUl9VUEdMLAotCQlbQjQzX1JGU0VRX1VQREFURV9HQUlOVV0JPSBCNDNfTlBIWV9SRlNFUVRSX1VQR1UsCi0JfTsKLQlpbnQgaTsKLQotCUI0M19XQVJOX09OKHNlcSA+PSBBUlJBWV9TSVpFKHRyaWdnZXIpKTsKLQotCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZTRVFNT0RFLAotCQkgICAgQjQzX05QSFlfUkZTRVFNT0RFX0NBT1ZFUiB8IEI0M19OUEhZX1JGU0VRTU9ERV9UUk9WRVIpOwotCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZTRVFUUiwgdHJpZ2dlcltzZXFdKTsKLQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJaWYgKCEoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZTRVFTVCkgJiB0cmlnZ2VyW3NlcV0pKQotCQkJZ290byBvazsKLQkJbXNsZWVwKDEpOwotCX0KLQliNDNlcnIoZGV2LT53bCwgIlJGIHNlcXVlbmNlIHN0YXR1cyB0aW1lb3V0XG4iKTsKLW9rOgotCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwKLQkJICAgICB+KEI0M19OUEhZX1JGU0VRTU9ERV9DQU9WRVIgfCBCNDNfTlBIWV9SRlNFUU1PREVfVFJPVkVSKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19ucGh5X2JwaHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTE2IHZhbDsKLQotCXZhbCA9IDB4MUUxRjsKLQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9OX0JNT0RFKDB4ODggKyBpKSwgdmFsKTsKLQkJdmFsIC09IDB4MjAyOwotCX0KLQl2YWwgPSAweDNFM0Y7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTl9CTU9ERSgweDk3ICsgaSksIHZhbCk7Ci0JCXZhbCAtPSAweDIwMjsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTl9CTU9ERSgweDM4KSwgMHg2NjgpOwotfQotCi0vKiBSU1NJIENhbGlicmF0aW9uICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yc3NpX2NhbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IHR5cGUpCi17Ci0JLy9UT0RPCi19Ci0KLWludCBiNDNfcGh5X2luaXRuKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXUxNiB0bXA7Ci0KLQkvL1RPRE86IFNwZWN0cmFsIG1hbmFnZW1lbnQKLQliNDNfbnBoeV90YWJsZXNfaW5pdChkZXYpOwotCi0JLyogQ2xlYXIgYWxsIG92ZXJyaWRlcyAqLwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfSU5UQzEsIDApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMiwgMCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMzLCAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfSU5UQzQsIDApOwotCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwKLQkJICAgICB+KEI0M19OUEhZX1JGU0VRTU9ERV9DQU9WRVIgfAotCQkgICAgICAgQjQzX05QSFlfUkZTRVFNT0RFX1RST1ZFUikpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMCk7Ci0KLQl0bXAgPSAocGh5LT5yZXYgPCAyKSA/IDY0IDogNTk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQlBIWV9DVEwzLAotCQkJfkI0M19OUEhZX0JQSFlfQ1RMM19TQ0FMRSwKLQkJCXRtcCA8PCBCNDNfTlBIWV9CUEhZX0NUTDNfU0NBTEVfU0hJRlQpOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfMjBNLCAweDIwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFU0VRX1RYMlJYX1BVRF80ME0sIDB4MjApOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYUkVBTEZELCAxODQpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9NSU1PX0NSU1RYRVhULCAyMDApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QTE9BRF9DU0VOU0VfRVhUTEVOLCA4MCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX0JDTElQQktPRkYsIDUxMSk7Ci0KLQkvL1RPRE8gTUlNTy1Db25maWcKLQkvL1RPRE8gVXBkYXRlIFRYL1JYIGNoYWluCi0KLQlpZiAocGh5LT5yZXYgPCAyKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9EVVA0MF9HRkJMLCAweEFBOCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9EVVA0MF9CTCwgMHg5QTQpOwotCX0KLQliNDNfbnBoeV93b3JrYXJvdW5kcyhkZXYpOwotCWI0M19ucGh5X3Jlc2V0X2NjYShkZXYpOwotCi0Jc3NiX3dyaXRlMzIoZGV2LT5kZXYsIFNTQl9UTVNMT1csCi0JCSAgICBzc2JfcmVhZDMyKGRldi0+ZGV2LCBTU0JfVE1TTE9XKSB8IEI0M19UTVNMT1dfTUFDUEhZQ0xLRU4pOwotCWI0M19ucGh5X2ZvcmNlX3JmX3NlcXVlbmNlKGRldiwgQjQzX1JGU0VRX1JYMlRYKTsKLQliNDNfbnBoeV9mb3JjZV9yZl9zZXF1ZW5jZShkZXYsIEI0M19SRlNFUV9SRVNFVDJSWCk7Ci0KLQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DTEFTU0NUTCk7IC8qIGR1bW15IHJlYWQgKi8KLQkvL1RPRE8gcmVhZCBjb3JlMS8yIGNsaXAxIHRocmVzIHJlZ3MKLQotCWlmICgxIC8qIEZJWE1FIEJhbmQgaXMgMi40R0h6ICovKQotCQliNDNfbnBoeV9icGh5X2luaXQoZGV2KTsKLQkvL1RPRE8gZGlzYWJsZSBUWCBwb3dlciBjb250cm9sCi0JLy9UT0RPIEZpeCB0aGUgVFggcG93ZXIgc2V0dGluZ3MKLQkvL1RPRE8gSW5pdCBwZXJpb2RpYyBjYWxpYnJhdGlvbiB3aXRoIHJlYXNvbiAzCi0JYjQzX25waHlfcnNzaV9jYWwoZGV2LCAyKTsKLQliNDNfbnBoeV9yc3NpX2NhbChkZXYsIDApOwotCWI0M19ucGh5X3Jzc2lfY2FsKGRldiwgMSk7Ci0JLy9UT0RPIGdldCBUWCBnYWluCi0JLy9UT0RPIGluaXQgc3VwZXJzd2l0Y2gKLQkvL1RPRE8gY2FsaWJyYXRlIExPCi0JLy9UT0RPIGlkbGUgVFNTSSBUWCBwY3RsCi0JLy9UT0RPIFRYIHBvd2VyIGNvbnRyb2wgcG93ZXIgc2V0dXAKLQkvL1RPRE8gdGFibGUgd3JpdGVzCi0JLy9UT0RPIFRYIHBvd2VyIGNvbnRyb2wgY29lZmZpY2llbnRzCi0JLy9UT0RPIGVuYWJsZSBUWCBwb3dlciBjb250cm9sCi0JLy9UT0RPIGNvbnRyb2wgYW50ZW5uYSBzZWxlY3Rpb24KLQkvL1RPRE8gaW5pdCByYWRhciBkZXRlY3Rpb24KLQkvL1RPRE8gcmVzZXQgY2hhbm5lbCBpZiBjaGFuZ2VkCi0KLQliNDNlcnIoZGV2LT53bCwgIklFRUUgODAyLjExbiBkZXZpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLCB5ZXQuXG4iKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9ucGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbnBoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY0NmI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9ucGh5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NzIgKzAsMCBAQAotI2lmbmRlZiBCNDNfTlBIWV9IXwotI2RlZmluZSBCNDNfTlBIWV9IXwotCi0jaW5jbHVkZSAicGh5LmgiCi0KLQotLyogTi1QSFkgcmVnaXN0ZXJzLiAqLwotCi0jZGVmaW5lIEI0M19OUEhZX0JCQ0ZHCQkJCUI0M19QSFlfTigweDAwMSkgLyogQkIgY29uZmlnICovCi0jZGVmaW5lICBCNDNfTlBIWV9CQkNGR19SU1RDQ0EJCQkweDQwMDAgLyogUmVzZXQgQ0NBICovCi0jZGVmaW5lICBCNDNfTlBIWV9CQkNGR19SU1RSWAkJCTB4ODAwMCAvKiBSZXNldCBSWCAqLwotI2RlZmluZSBCNDNfTlBIWV9DSEFOTkVMCQkJQjQzX1BIWV9OKDB4MDA1KSAvKiBDaGFubmVsICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRVJSCQkJCUI0M19QSFlfTigweDAwNykgLyogVFggZXJyb3IgKi8KLSNkZWZpbmUgQjQzX05QSFlfQkFORENUTAkJCUI0M19QSFlfTigweDAwOSkgLyogQmFuZCBjb250cm9sICovCi0jZGVmaW5lICBCNDNfTlBIWV9CQU5EQ1RMXzVHSFoJCQkweDAwMDEgLyogVXNlIHRoZSA1R0h6IGJhbmQgKi8KLSNkZWZpbmUgQjQzX05QSFlfNFdJX0FERFIJCQlCNDNfUEhZX04oMHgwMEIpIC8qIEZvdXItd2lyZSBidXMgYWRkcmVzcyAqLwotI2RlZmluZSBCNDNfTlBIWV80V0lfREFUQUhJCQkJQjQzX1BIWV9OKDB4MDBDKSAvKiBGb3VyLXdpcmUgYnVzIGRhdGEgaGlnaCAqLwotI2RlZmluZSBCNDNfTlBIWV80V0lfREFUQUxPCQkJQjQzX1BIWV9OKDB4MDBEKSAvKiBGb3VyLXdpcmUgYnVzIGRhdGEgbG93ICovCi0jZGVmaW5lIEI0M19OUEhZX0JJU1RfU1RBVDAJCQlCNDNfUEhZX04oMHgwMEUpIC8qIEJ1aWx0LWluIHNlbGYgdGVzdCBzdGF0dXMgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9CSVNUX1NUQVQxCQkJQjQzX1BIWV9OKDB4MDBGKSAvKiBCdWlsdC1pbiBzZWxmIHRlc3Qgc3RhdHVzIDEgKi8KLQotI2RlZmluZSBCNDNfTlBIWV9DMV9ERVNQV1IJCQlCNDNfUEhZX04oMHgwMTgpIC8qIENvcmUgMSBkZXNpcmVkIHBvd2VyICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX0NDS19ERVNQV1IJCQlCNDNfUEhZX04oMHgwMTkpIC8qIENvcmUgMSBDQ0sgZGVzaXJlZCBwb3dlciAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9CQ0xJUEJLT0ZGCQkJQjQzX1BIWV9OKDB4MDFBKSAvKiBDb3JlIDEgYmFyZWx5IGNsaXAgYmFja29mZiAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9DQ0tfQkNMSVBCS09GRgkJQjQzX1BIWV9OKDB4MDFCKSAvKiBDb3JlIDEgQ0NLIGJhcmVseSBjbGlwIGJhY2tvZmYgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0dBSU5JCQkJQjQzX1BIWV9OKDB4MDFDKSAvKiBDb3JlIDEgY29tcHV0ZSBnYWluIGluZm8gKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9HQUlOQktPRkYJCTB4MDAxRiAvKiBHYWluIGJhY2tvZmYgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9HQUlOQktPRkZfU0hJRlQJMAotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0dBSU5JX0NMSVBHQktPRkYJCTB4MDNFMCAvKiBDbGlwIGdhaW4gYmFja29mZiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0dBSU5JX0NMSVBHQktPRkZfU0hJRlQJNQotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0dBSU5JX0dBSU5TVEVQCQkweDFDMDAgLyogR2FpbiBzdGVwICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9DR0FJTklfR0FJTlNURVBfU0hJRlQJMTAKLSNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9DTDJERVRFQ1QJCTB4MjAwMCAvKiBDbGlwIDIgZGV0ZWN0IG1hc2sgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0NLX0NHQUlOSQkJCUI0M19QSFlfTigweDAxRCkgLyogQ29yZSAxIENDSyBjb21wdXRlIGdhaW4gaW5mbyAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0NLX0NHQUlOSV9HQUlOQktPRkYJMHgwMDFGIC8qIEdhaW4gYmFja29mZiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0NLX0NHQUlOSV9DTElQR0JLT0ZGCTB4MDFFMCAvKiBDQ0sgYmFyZWx5IGNsaXAgZ2FpbiBiYWNrb2ZmICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX01JTk1BWF9HQUlOCQkJQjQzX1BIWV9OKDB4MDFFKSAvKiBDb3JlIDEgbWluL21heCBnYWluICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9NSU5HQUlOCQkJMHgwMEZGIC8qIE1pbmltdW0gZ2FpbiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfTUlOR0FJTl9TSElGVAkJMAotI2RlZmluZSAgQjQzX05QSFlfQzFfTUFYR0FJTgkJCTB4RkYwMCAvKiBNYXhpbXVtIGdhaW4gKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MxX01BWEdBSU5fU0hJRlQJCTgKLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0NLX01JTk1BWF9HQUlOCQlCNDNfUEhZX04oMHgwMUYpIC8qIENvcmUgMSBDQ0sgbWluL21heCBnYWluICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9DQ0tfTUlOR0FJTgkJMHgwMEZGIC8qIE1pbmltdW0gZ2FpbiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0NLX01JTkdBSU5fU0hJRlQJCTAKLSNkZWZpbmUgIEI0M19OUEhZX0MxX0NDS19NQVhHQUlOCQkweEZGMDAgLyogTWF4aW11bSBnYWluICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9DQ0tfTUFYR0FJTl9TSElGVAkJOAotI2RlZmluZSBCNDNfTlBIWV9DMV9JTklUR0FJTgkJCUI0M19QSFlfTigweDAyMCkgLyogQ29yZSAxIGluaXRpYWwgZ2FpbiBjb2RlICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9JTklUR0FJTl9FWFRMTkEJCTB4MDAwMSAvKiBFeHRlcm5hbCBMTkEgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0xOQQkJMHgwMDA2IC8qIExOQSBpbmRleCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfSU5JVEdBSU5fTE5BSURYX1NISUZUCTEKLSNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0hQVkdBMQkJMHgwMDc4IC8qIEhQVkdBMSBpbmRleCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfSU5JVEdBSU5fSFBWR0ExX1NISUZUCTMKLSNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0hQVkdBMgkJMHgwRjgwIC8qIEhQVkdBMiBpbmRleCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfSU5JVEdBSU5fSFBWR0EyX1NISUZUCTcKLSNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX1RSUlgJCTB4MTAwMCAvKiBUUiBSWCBpbmRleCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfSU5JVEdBSU5fVFJUWAkJMHgyMDAwIC8qIFRSIFRYIGluZGV4ICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX0NMSVAxX0hJR0FJTgkJQjQzX1BIWV9OKDB4MDIxKSAvKiBDb3JlIDEgY2xpcDEgaGlnaCBnYWluIGNvZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUDFfTUVER0FJTgkJQjQzX1BIWV9OKDB4MDIyKSAvKiBDb3JlIDEgY2xpcDEgbWVkaXVtIGdhaW4gY29kZSAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9DTElQMV9MT0dBSU4JCUI0M19QSFlfTigweDAyMykgLyogQ29yZSAxIGNsaXAxIGxvdyBnYWluIGNvZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUDJfR0FJTgkJCUI0M19QSFlfTigweDAyNCkgLyogQ29yZSAxIGNsaXAyIGdhaW4gY29kZSAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9GSUxURVJHQUlOCQkJQjQzX1BIWV9OKDB4MDI1KSAvKiBDb3JlIDEgZmlsdGVyIGdhaW4gKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfTFBGX1FIUEZfQlcJCQlCNDNfUEhZX04oMHgwMjYpIC8qIENvcmUgMSBMUEYgUSBIUCBGIGJhbmR3aWR0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9DTElQV0JUSFJFUwkJCUI0M19QSFlfTigweDAyNykgLyogQ29yZSAxIGNsaXAgd2lkZWJhbmQgdGhyZXNob2xkICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMgkJMHgwMDNGIC8qIENsaXAgMiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVNfQ0xJUDJfU0hJRlQJMAotI2RlZmluZSAgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVNfQ0xJUDEJCTB4MEZDMCAvKiBDbGlwIDEgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTX0NMSVAxX1NISUZUCTYKLSNkZWZpbmUgQjQzX05QSFlfQzFfVzFUSFJFUwkJCUI0M19QSFlfTigweDAyOCkgLyogQ29yZSAxIFcxIHRocmVzaG9sZCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9FRFRIUkVTCQkJQjQzX1BIWV9OKDB4MDI5KSAvKiBDb3JlIDEgRUQgdGhyZXNob2xkICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX1NNU0lHVEhSRVMJCQlCNDNfUEhZX04oMHgwMkEpIC8qIENvcmUgMSBzbWFsbCBzaWcgdGhyZXNob2xkICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX05CQ0xJUFRIUkVTCQkJQjQzX1BIWV9OKDB4MDJCKSAvKiBDb3JlIDEgTkIgY2xpcCB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUDFUSFJFUwkJCUI0M19QSFlfTigweDAyQykgLyogQ29yZSAxIGNsaXAxIHRocmVzaG9sZCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9DTElQMlRIUkVTCQkJQjQzX1BIWV9OKDB4MDJEKSAvKiBDb3JlIDEgY2xpcDIgdGhyZXNob2xkICovCi0KLSNkZWZpbmUgQjQzX05QSFlfQzJfREVTUFdSCQkJQjQzX1BIWV9OKDB4MDJFKSAvKiBDb3JlIDIgZGVzaXJlZCBwb3dlciAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9DQ0tfREVTUFdSCQkJQjQzX1BIWV9OKDB4MDJGKSAvKiBDb3JlIDIgQ0NLIGRlc2lyZWQgcG93ZXIgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQkNMSVBCS09GRgkJCUI0M19QSFlfTigweDAzMCkgLyogQ29yZSAyIGJhcmVseSBjbGlwIGJhY2tvZmYgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQ0NLX0JDTElQQktPRkYJCUI0M19QSFlfTigweDAzMSkgLyogQ29yZSAyIENDSyBiYXJlbHkgY2xpcCBiYWNrb2ZmICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0NHQUlOSQkJCUI0M19QSFlfTigweDAzMikgLyogQ29yZSAyIGNvbXB1dGUgZ2FpbiBpbmZvICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfR0FJTkJLT0ZGCQkweDAwMUYgLyogR2FpbiBiYWNrb2ZmICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfR0FJTkJLT0ZGX1NISUZUCTAKLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NHQUlOSV9DTElQR0JLT0ZGCQkweDAzRTAgLyogQ2xpcCBnYWluIGJhY2tvZmYgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NHQUlOSV9DTElQR0JLT0ZGX1NISUZUCTUKLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NHQUlOSV9HQUlOU1RFUAkJMHgxQzAwIC8qIEdhaW4gc3RlcCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfQ0dBSU5JX0dBSU5TVEVQX1NISUZUCTEwCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfQ0wyREVURUNUCQkweDIwMDAgLyogQ2xpcCAyIGRldGVjdCBtYXNrICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0NDS19DR0FJTkkJCQlCNDNfUEhZX04oMHgwMzMpIC8qIENvcmUgMiBDQ0sgY29tcHV0ZSBnYWluIGluZm8gKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NDS19DR0FJTklfR0FJTkJLT0ZGCTB4MDAxRiAvKiBHYWluIGJhY2tvZmYgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NDS19DR0FJTklfQ0xJUEdCS09GRgkweDAxRTAgLyogQ0NLIGJhcmVseSBjbGlwIGdhaW4gYmFja29mZiAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9NSU5NQVhfR0FJTgkJCUI0M19QSFlfTigweDAzNCkgLyogQ29yZSAyIG1pbi9tYXggZ2FpbiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfTUlOR0FJTgkJCTB4MDBGRiAvKiBNaW5pbXVtIGdhaW4gKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX01JTkdBSU5fU0hJRlQJCTAKLSNkZWZpbmUgIEI0M19OUEhZX0MyX01BWEdBSU4JCQkweEZGMDAgLyogTWF4aW11bSBnYWluICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9NQVhHQUlOX1NISUZUCQk4Ci0jZGVmaW5lIEI0M19OUEhZX0MyX0NDS19NSU5NQVhfR0FJTgkJQjQzX1BIWV9OKDB4MDM1KSAvKiBDb3JlIDIgQ0NLIG1pbi9tYXggZ2FpbiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfQ0NLX01JTkdBSU4JCTB4MDBGRiAvKiBNaW5pbXVtIGdhaW4gKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NDS19NSU5HQUlOX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9DQ0tfTUFYR0FJTgkJMHhGRjAwIC8qIE1heGltdW0gZ2FpbiAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfQ0NLX01BWEdBSU5fU0hJRlQJCTgKLSNkZWZpbmUgQjQzX05QSFlfQzJfSU5JVEdBSU4JCQlCNDNfUEhZX04oMHgwMzYpIC8qIENvcmUgMiBpbml0aWFsIGdhaW4gY29kZSAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfSU5JVEdBSU5fRVhUTE5BCQkweDAwMDEgLyogRXh0ZXJuYWwgTE5BIGluZGV4ICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9MTkEJCTB4MDAwNiAvKiBMTkEgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0lOSVRHQUlOX0xOQUlEWF9TSElGVAkxCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9IUFZHQTEJCTB4MDA3OCAvKiBIUFZHQTEgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0lOSVRHQUlOX0hQVkdBMV9TSElGVAkzCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9IUFZHQTIJCTB4MEY4MCAvKiBIUFZHQTIgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0lOSVRHQUlOX0hQVkdBMl9TSElGVAk3Ci0jZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9UUlJYCQkweDEwMDAgLyogVFIgUlggaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0lOSVRHQUlOX1RSVFgJCTB4MjAwMCAvKiBUUiBUWCBpbmRleCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9DTElQMV9ISUdBSU4JCUI0M19QSFlfTigweDAzNykgLyogQ29yZSAyIGNsaXAxIGhpZ2ggZ2FpbiBjb2RlICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0NMSVAxX01FREdBSU4JCUI0M19QSFlfTigweDAzOCkgLyogQ29yZSAyIGNsaXAxIG1lZGl1bSBnYWluIGNvZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQ0xJUDFfTE9HQUlOCQlCNDNfUEhZX04oMHgwMzkpIC8qIENvcmUgMiBjbGlwMSBsb3cgZ2FpbiBjb2RlICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0NMSVAyX0dBSU4JCQlCNDNfUEhZX04oMHgwM0EpIC8qIENvcmUgMiBjbGlwMiBnYWluIGNvZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfRklMVEVSR0FJTgkJCUI0M19QSFlfTigweDAzQikgLyogQ29yZSAyIGZpbHRlciBnYWluICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0xQRl9RSFBGX0JXCQkJQjQzX1BIWV9OKDB4MDNDKSAvKiBDb3JlIDIgTFBGIFEgSFAgRiBiYW5kd2lkdGggKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVMJCQlCNDNfUEhZX04oMHgwM0QpIC8qIENvcmUgMiBjbGlwIHdpZGViYW5kIHRocmVzaG9sZCAqLwotI2RlZmluZSAgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVNfQ0xJUDIJCTB4MDAzRiAvKiBDbGlwIDIgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAyX1NISUZUCTAKLSNkZWZpbmUgIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAxCQkweDBGQzAgLyogQ2xpcCAxICovCi0jZGVmaW5lICBCNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMV9TSElGVAk2Ci0jZGVmaW5lIEI0M19OUEhZX0MyX1cxVEhSRVMJCQlCNDNfUEhZX04oMHgwM0UpIC8qIENvcmUgMiBXMSB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfRURUSFJFUwkJCUI0M19QSFlfTigweDAzRikgLyogQ29yZSAyIEVEIHRocmVzaG9sZCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9TTVNJR1RIUkVTCQkJQjQzX1BIWV9OKDB4MDQwKSAvKiBDb3JlIDIgc21hbGwgc2lnIHRocmVzaG9sZCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9OQkNMSVBUSFJFUwkJCUI0M19QSFlfTigweDA0MSkgLyogQ29yZSAyIE5CIGNsaXAgdGhyZXNob2xkICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0NMSVAxVEhSRVMJCQlCNDNfUEhZX04oMHgwNDIpIC8qIENvcmUgMiBjbGlwMSB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQ0xJUDJUSFJFUwkJCUI0M19QSFlfTigweDA0MykgLyogQ29yZSAyIGNsaXAyIHRocmVzaG9sZCAqLwotCi0jZGVmaW5lIEI0M19OUEhZX0NSU19USFJFUzEJCQlCNDNfUEhZX04oMHgwNDQpIC8qIENSUyB0aHJlc2hvbGQgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9DUlNfVEhSRVMyCQkJQjQzX1BIWV9OKDB4MDQ1KSAvKiBDUlMgdGhyZXNob2xkIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTX1RIUkVTMwkJCUI0M19QSFlfTigweDA0NikgLyogQ1JTIHRocmVzaG9sZCAzICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU0NUTAkJCQlCNDNfUEhZX04oMHgwNDcpIC8qIENSUyBjb250cm9sICovCi0jZGVmaW5lIEI0M19OUEhZX0RDRkFERFIJCQlCNDNfUEhZX04oMHgwNDgpIC8qIERDIGZpbHRlciBhZGRyZXNzICovCi0jZGVmaW5lIEI0M19OUEhZX1JYRjIwX05VTTAJCQlCNDNfUEhZX04oMHgwNDkpIC8qIFJYIGZpbHRlciAyMCBudW1lcmF0b3IgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9OVU0xCQkJQjQzX1BIWV9OKDB4MDRBKSAvKiBSWCBmaWx0ZXIgMjAgbnVtZXJhdG9yIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGMjBfTlVNMgkJCUI0M19QSFlfTigweDA0QikgLyogUlggZmlsdGVyIDIwIG51bWVyYXRvciAyICovCi0jZGVmaW5lIEI0M19OUEhZX1JYRjIwX0RFTk9NMAkJCUI0M19QSFlfTigweDA0QykgLyogUlggZmlsdGVyIDIwIGRlbm9taW5hdG9yIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGMjBfREVOT00xCQkJQjQzX1BIWV9OKDB4MDREKSAvKiBSWCBmaWx0ZXIgMjAgZGVub21pbmF0b3IgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9OVU0xMAkJCUI0M19QSFlfTigweDA0RSkgLyogUlggZmlsdGVyIDIwIG51bWVyYXRvciAxMCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9OVU0xMQkJCUI0M19QSFlfTigweDA0RikgLyogUlggZmlsdGVyIDIwIG51bWVyYXRvciAxMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9OVU0xMgkJCUI0M19QSFlfTigweDA1MCkgLyogUlggZmlsdGVyIDIwIG51bWVyYXRvciAxMiAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9ERU5PTTEwCQkJQjQzX1BIWV9OKDB4MDUxKSAvKiBSWCBmaWx0ZXIgMjAgZGVub21pbmF0b3IgMTAgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGMjBfREVOT00xMQkJCUI0M19QSFlfTigweDA1MikgLyogUlggZmlsdGVyIDIwIGRlbm9taW5hdG9yIDExICovCi0jZGVmaW5lIEI0M19OUEhZX1JYRjQwX05VTTAJCQlCNDNfUEhZX04oMHgwNTMpIC8qIFJYIGZpbHRlciA0MCBudW1lcmF0b3IgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9OVU0xCQkJQjQzX1BIWV9OKDB4MDU0KSAvKiBSWCBmaWx0ZXIgNDAgbnVtZXJhdG9yIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGNDBfTlVNMgkJCUI0M19QSFlfTigweDA1NSkgLyogUlggZmlsdGVyIDQwIG51bWVyYXRvciAyICovCi0jZGVmaW5lIEI0M19OUEhZX1JYRjQwX0RFTk9NMAkJCUI0M19QSFlfTigweDA1NikgLyogUlggZmlsdGVyIDQwIGRlbm9taW5hdG9yIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGNDBfREVOT00xCQkJQjQzX1BIWV9OKDB4MDU3KSAvKiBSWCBmaWx0ZXIgNDAgZGVub21pbmF0b3IgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9OVU0xMAkJCUI0M19QSFlfTigweDA1OCkgLyogUlggZmlsdGVyIDQwIG51bWVyYXRvciAxMCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9OVU0xMQkJCUI0M19QSFlfTigweDA1OSkgLyogUlggZmlsdGVyIDQwIG51bWVyYXRvciAxMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9OVU0xMgkJCUI0M19QSFlfTigweDA1QSkgLyogUlggZmlsdGVyIDQwIG51bWVyYXRvciAxMiAqLwotI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9ERU5PTTEwCQkJQjQzX1BIWV9OKDB4MDVCKSAvKiBSWCBmaWx0ZXIgNDAgZGVub21pbmF0b3IgMTAgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhGNDBfREVOT00xMQkJCUI0M19QSFlfTigweDA1QykgLyogUlggZmlsdGVyIDQwIGRlbm9taW5hdG9yIDExICovCi0jZGVmaW5lIEI0M19OUEhZX1BQUk9DX1JTVExFTgkJCUI0M19QSFlfTigweDA2MCkgLyogUGFja2V0IHByb2Nlc3NpbmcgcmVzZXQgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX0lOSVRDQVJSX0RMRU4JCQlCNDNfUEhZX04oMHgwNjEpIC8qIEluaXRpYWwgY2FycmllciBkZXRlY3Rpb24gbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX0NMSVAxQ0FSUl9ETEVOCQkJQjQzX1BIWV9OKDB4MDYyKSAvKiBDbGlwMSBjYXJyaWVyIGRldGVjdGlvbiBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfQ0xJUDJDQVJSX0RMRU4JCQlCNDNfUEhZX04oMHgwNjMpIC8qIENsaXAyIGNhcnJpZXIgZGV0ZWN0aW9uIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9JTklUR0FJTl9TTEVOCQkJQjQzX1BIWV9OKDB4MDY0KSAvKiBJbml0aWFsIGdhaW4gc2V0dGxlIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9DTElQMUdBSU5fU0xFTgkJCUI0M19QSFlfTigweDA2NSkgLyogQ2xpcDEgZ2FpbiBzZXR0bGUgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX0NMSVAyR0FJTl9TTEVOCQkJQjQzX1BIWV9OKDB4MDY2KSAvKiBDbGlwMiBnYWluIHNldHRsZSBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfUEFDS0dBSU5fU0xFTgkJCUI0M19QSFlfTigweDA2NykgLyogUGFja2V0IGdhaW4gc2V0dGxlIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9DQVJSU1JDX1RMRU4JCQlCNDNfUEhZX04oMHgwNjgpIC8qIENhcnJpZXIgc2VhcmNoIHRpbWVvdXQgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX1RJU1JDX1RMRU4JCQlCNDNfUEhZX04oMHgwNjkpIC8qIFRpbWluZyBzZWFyY2ggdGltZW91dCBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfRU5EUk9QX1RMRU4JCQlCNDNfUEhZX04oMHgwNkEpIC8qIEVuZXJneSBkcm9wIHRpbWVvdXQgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX0NMSVAxX05CRFdFTExfTEVOCQlCNDNfUEhZX04oMHgwNkIpIC8qIENsaXAxIE5CIGR3ZWxsIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9DTElQMl9OQkRXRUxMX0xFTgkJQjQzX1BIWV9OKDB4MDZDKSAvKiBDbGlwMiBOQiBkd2VsbCBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfVzFDTElQMV9EV0VMTF9MRU4JCUI0M19QSFlfTigweDA2RCkgLyogVzEgY2xpcDEgZHdlbGwgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX1cxQ0xJUDJfRFdFTExfTEVOCQlCNDNfUEhZX04oMHgwNkUpIC8qIFcxIGNsaXAyIGR3ZWxsIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9XMkNMSVAxX0RXRUxMX0xFTgkJQjQzX1BIWV9OKDB4MDZGKSAvKiBXMiBjbGlwMSBkd2VsbCBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfUExPQURfQ1NFTlNFX0VYVExFTgkJQjQzX1BIWV9OKDB4MDcwKSAvKiBQYXlsb2FkIGNhcnJpZXIgc2Vuc2UgZXh0ZW5zaW9uIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9FRFJPUF9DU0VOU0VfRVhUTEVOCQlCNDNfUEhZX04oMHgwNzEpIC8qIEVuZXJneSBkcm9wIGNhcnJpZXIgc2Vuc2UgZXh0ZW5zaW9uIGxlbmd0aCAqLwotI2RlZmluZSBCNDNfTlBIWV9UQUJMRV9BRERSCQkJQjQzX1BIWV9OKDB4MDcyKSAvKiBUYWJsZSBhZGRyZXNzICovCi0jZGVmaW5lIEI0M19OUEhZX1RBQkxFX0RBVEFMTwkJCUI0M19QSFlfTigweDA3MykgLyogVGFibGUgZGF0YSBsb3cgKi8KLSNkZWZpbmUgQjQzX05QSFlfVEFCTEVfREFUQUhJCQkJQjQzX1BIWV9OKDB4MDc0KSAvKiBUYWJsZSBkYXRhIGhpZ2ggKi8KLSNkZWZpbmUgQjQzX05QSFlfV1dJU0VfTEVOSURYCQkJQjQzX1BIWV9OKDB4MDc1KSAvKiBXV2lTRSBsZW5ndGggaW5kZXggKi8KLSNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ19MRU5JRFgJCQlCNDNfUEhZX04oMHgwNzYpIC8qIFRHTnN5bmMgbGVuZ3RoIGluZGV4ICovCi0jZGVmaW5lIEI0M19OUEhZX1RYTUFDSUZfSE9MRE9GRgkJQjQzX1BIWV9OKDB4MDc3KSAvKiBUWCBNQUMgSUYgSG9sZCBvZmYgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfQ01ECQkJQjQzX1BIWV9OKDB4MDc4KSAvKiBSRiBjb250cm9sIChjb21tYW5kKSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX1NUQVJUCQkweDAwMDEgLyogU3RhcnQgc2VxdWVuY2UgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9SWFRYCQkweDAwMDIgLyogUlgvVFggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9DT1JFU0VMCQkweDAwMzggLyogQ29yZSBzZWxlY3QgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9DT1JFU0VMX1NISUZUCTMKLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9QT1JGT1JDRQkJMHgwMDQwIC8qIFBPUiBmb3JjZSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX09FUE9SRk9SQ0UJCTB4MDA4MCAvKiBPRSBQT1IgZm9yY2UgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9SWEVOCQkweDAxMDAgLyogUlggZW5hYmxlICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfVFhFTgkJMHgwMjAwIC8qIFRYIGVuYWJsZSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX0NISVAwUFUJCTB4MDQwMCAvKiBDaGlwMCBQVSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX0VOCQkJMHgwODAwIC8qIFJhZGlvIGVuYWJsZWQgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9TRVFFTkNPUkUJCTB4RjAwMCAvKiBTZXEgZW4gY29yZSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX1NFUUVOQ09SRV9TSElGVAkxMgotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SU1NJTzEJCQlCNDNfUEhZX04oMHgwN0EpIC8qIFJGIGNvbnRyb2wgKFJTU0kgb3RoZXJzIDEpICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzFfUlhQRAkJMHgwMDAxIC8qIFJYIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzFfVFhQRAkJMHgwMDAyIC8qIFRYIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzFfUEFQRAkJMHgwMDA0IC8qIFBBIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzFfUlNTSUNUTAkJMHgwMDMwIC8qIFJTU0kgY29udHJvbCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX0xQRkJXCQkweDAwQzAgLyogTFBGIGJhbmR3aWR0aCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX0hQRkJXSEkJCTB4MDEwMCAvKiBIUEYgYmFuZHdpZHRoIGhpZ2ggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMV9ISVFESVNDTwkJMHgwMjAwIC8qIEhJUSBkaXMgY29yZSAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SWEcxCQkJQjQzX1BIWV9OKDB4MDdCKSAvKiBSRiBjb250cm9sIChSWCBnYWluIDEpICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1RYRzEJCQlCNDNfUEhZX04oMHgwN0MpIC8qIFJGIGNvbnRyb2wgKFRYIGdhaW4gMSkgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlNTSU8yCQkJQjQzX1BIWV9OKDB4MDdEKSAvKiBSRiBjb250cm9sIChSU1NJIG90aGVycyAyKSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8yX1JYUEQJCTB4MDAwMSAvKiBSWCBQRCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8yX1RYUEQJCTB4MDAwMiAvKiBUWCBQRCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8yX1BBUEQJCTB4MDAwNCAvKiBQQSBQRCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8yX1JTU0lDVEwJCTB4MDAzMCAvKiBSU1NJIGNvbnRyb2wgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9MUEZCVwkJMHgwMEMwIC8qIExQRiBiYW5kd2lkdGggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9IUEZCV0hJCQkweDAxMDAgLyogSFBGIGJhbmR3aWR0aCBoaWdoICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzJfSElRRElTQ08JCTB4MDIwMCAvKiBISVEgZGlzIGNvcmUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlhHMgkJCUI0M19QSFlfTigweDA3RSkgLyogUkYgY29udHJvbCAoUlggZ2FpbiAyKSAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9UWEcyCQkJQjQzX1BIWV9OKDB4MDdGKSAvKiBSRiBjb250cm9sIChUWCBnYWluIDIpICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1JTU0lPMwkJCUI0M19QSFlfTigweDA4MCkgLyogUkYgY29udHJvbCAoUlNTSSBvdGhlcnMgMykgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPM19SWFBECQkweDAwMDEgLyogUlggUEQgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPM19UWFBECQkweDAwMDIgLyogVFggUEQgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPM19QQVBECQkweDAwMDQgLyogUEEgUEQgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPM19SU1NJQ1RMCQkweDAwMzAgLyogUlNTSSBjb250cm9sICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfTFBGQlcJCTB4MDBDMCAvKiBMUEYgYmFuZHdpZHRoICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfSFBGQldISQkJMHgwMTAwIC8qIEhQRiBiYW5kd2lkdGggaGlnaCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8zX0hJUURJU0NPCQkweDAyMDAgLyogSElRIGRpcyBjb3JlICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1JYRzMJCQlCNDNfUEhZX04oMHgwODEpIC8qIFJGIGNvbnRyb2wgKFJYIGdhaW4gMykgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfVFhHMwkJCUI0M19QSFlfTigweDA4MikgLyogUkYgY29udHJvbCAoVFggZ2FpbiAzKSAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SU1NJTzQJCQlCNDNfUEhZX04oMHgwODMpIC8qIFJGIGNvbnRyb2wgKFJTU0kgb3RoZXJzIDQpICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzRfUlhQRAkJMHgwMDAxIC8qIFJYIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzRfVFhQRAkJMHgwMDAyIC8qIFRYIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzRfUEFQRAkJMHgwMDA0IC8qIFBBIFBEICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzRfUlNTSUNUTAkJMHgwMDMwIC8qIFJTU0kgY29udHJvbCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X0xQRkJXCQkweDAwQzAgLyogTFBGIGJhbmR3aWR0aCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X0hQRkJXSEkJCTB4MDEwMCAvKiBIUEYgYmFuZHdpZHRoIGhpZ2ggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPNF9ISVFESVNDTwkJMHgwMjAwIC8qIEhJUSBkaXMgY29yZSAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SWEc0CQkJQjQzX1BIWV9OKDB4MDg0KSAvKiBSRiBjb250cm9sIChSWCBnYWluIDQpICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1RYRzQJCQlCNDNfUEhZX04oMHgwODUpIC8qIFJGIGNvbnRyb2wgKFRYIGdhaW4gNCkgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfVFhJUV9DT01QX09GRgkJQjQzX1BIWV9OKDB4MDg3KSAvKiBDb3JlIDEgVFggSS9RIGNvbXAgb2Zmc2V0ICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX1RYSVFfQ09NUF9PRkYJCUI0M19QSFlfTigweDA4OCkgLyogQ29yZSAyIFRYIEkvUSBjb21wIG9mZnNldCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9UWENUTAkJCUI0M19QSFlfTigweDA4QikgLyogQ29yZSAxIFRYIGNvbnRyb2wgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfVFhDVEwJCQlCNDNfUEhZX04oMHgwOEMpIC8qIENvcmUgMiBUWCBjb250cm9sICovCi0jZGVmaW5lIEI0M19OUEhZX1NDUkFNX1NJR0NUTAkJCUI0M19QSFlfTigweDA5MCkgLyogU2NyYW0gc2lnbmFsIGNvbnRyb2wgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1NDUkFNX1NJR0NUTF9JTklUU1QJCTB4MDA3RiAvKiBJbml0aWFsIHN0YXRlIHZhbHVlICovCi0jZGVmaW5lICBCNDNfTlBIWV9TQ1JBTV9TSUdDVExfSU5JVFNUX1NISUZUCTAKLSNkZWZpbmUgIEI0M19OUEhZX1NDUkFNX1NJR0NUTF9TQ00JCTB4MDA4MCAvKiBTY3JhbSBjb250cm9sIG1vZGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1NDUkFNX1NJR0NUTF9TSUNFCQkweDAxMDAgLyogU2NyYW0gaW5kZXggY29udHJvbCBlbmFibGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1NDUkFNX1NJR0NUTF9TVEFSVAkJMHhGRTAwIC8qIFNjcmFtIHN0YXJ0IGJpdCAqLwotI2RlZmluZSAgQjQzX05QSFlfU0NSQU1fU0lHQ1RMX1NUQVJUX1NISUZUCTkKLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfSU5UQzEJCQlCNDNfUEhZX04oMHgwOTEpIC8qIFJGIGNvbnRyb2wgKGludGMgMSkgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfSU5UQzIJCQlCNDNfUEhZX04oMHgwOTIpIC8qIFJGIGNvbnRyb2wgKGludGMgMikgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfSU5UQzMJCQlCNDNfUEhZX04oMHgwOTMpIC8qIFJGIGNvbnRyb2wgKGludGMgMykgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfSU5UQzQJCQlCNDNfUEhZX04oMHgwOTQpIC8qIFJGIGNvbnRyb2wgKGludGMgNCkgKi8KLSNkZWZpbmUgQjQzX05QSFlfTlJEVE9fV1dJU0UJCQlCNDNfUEhZX04oMHgwOTUpIC8qICMgZGF0YXRvbmVzIFdXaVNFICovCi0jZGVmaW5lIEI0M19OUEhZX05SRFRPX1RHTlNZTkMJCQlCNDNfUEhZX04oMHgwOTYpIC8qICMgZGF0YXRvbmVzIFRHTnN5bmMgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0lHRk1PRF9XV0lTRQkJCUI0M19QSFlfTigweDA5NykgLyogU2lnbmFsIGZpZWxkIG1vZCBXV2lTRSAqLwotI2RlZmluZSBCNDNfTlBIWV9MRUdfU0lHRk1PRF8xMU4JCUI0M19QSFlfTigweDA5OCkgLyogTGVnYWN5IHNpZ25hbCBmaWVsZCBtb2QgMTFuICovCi0jZGVmaW5lIEI0M19OUEhZX0hUX1NJR0ZNT0RfMTFOCQkJQjQzX1BIWV9OKDB4MDk5KSAvKiBIVCBzaWduYWwgZmllbGQgbW9kIDExbiAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9SWElRX0NPTVBBMAkJCUI0M19QSFlfTigweDA5QSkgLyogQ29yZSAxIFJYIEkvUSBjb21wIEEwICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX1JYSVFfQ09NUEIwCQkJQjQzX1BIWV9OKDB4MDlCKSAvKiBDb3JlIDEgUlggSS9RIGNvbXAgQjAgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfUlhJUV9DT01QQTEJCQlCNDNfUEhZX04oMHgwOUMpIC8qIENvcmUgMiBSWCBJL1EgY29tcCBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9SWElRX0NPTVBCMQkJCUI0M19QSFlfTigweDA5RCkgLyogQ29yZSAyIFJYIEkvUSBjb21wIEIxICovCi0jZGVmaW5lIEI0M19OUEhZX1JYQ1RMCQkJCUI0M19QSFlfTigweDBBMCkgLyogUlggY29udHJvbCAqLwotI2RlZmluZSAgQjQzX05QSFlfUlhDVExfQlNFTFUyMAkJCTB4MDAxMCAvKiBCYW5kIHNlbGVjdCB1cHBlciAyMCAqLwotI2RlZmluZSAgQjQzX05QSFlfUlhDVExfUklGU0VOCQkJMHgwMDgwIC8qIFJJRlMgZW5hYmxlICovCi0jZGVmaW5lIEI0M19OUEhZX1JGU0VRTU9ERQkJCUI0M19QSFlfTigweDBBMSkgLyogUkYgc2VxIG1vZGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGU0VRTU9ERV9DQU9WRVIJCTB4MDAwMSAvKiBDb3JlIGFjdGl2ZSBvdmVycmlkZSAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZTRVFNT0RFX1RST1ZFUgkJMHgwMDAyIC8qIFRyaWdnZXIgb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZTRVFDQQkJCUI0M19QSFlfTigweDBBMikgLyogUkYgc2VxIGNvcmUgYWN0aXZlICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1RYRU4JCQkweDAwMEYgLyogVFggZW5hYmxlICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1RYRU5fU0hJRlQJCTAKLSNkZWZpbmUgIEI0M19OUEhZX1JGU0VRQ0FfUlhFTgkJCTB4MDBGMCAvKiBSWCBlbmFibGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGU0VRQ0FfUlhFTl9TSElGVAkJNAotI2RlZmluZSAgQjQzX05QSFlfUkZTRVFDQV9UWERJUwkJCTB4MEYwMCAvKiBUWCBkaXNhYmxlICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1RYRElTX1NISUZUCQk4Ci0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1JYRElTCQkJMHhGMDAwIC8qIFJYIGRpc2FibGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGU0VRQ0FfUlhESVNfU0hJRlQJCTEyCi0jZGVmaW5lIEI0M19OUEhZX1JGU0VRVFIJCQlCNDNfUEhZX04oMHgwQTMpIC8qIFJGIHNlcSB0cmlnZ2VyICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUVRSX1JYMlRYCQkJMHgwMDAxIC8qIFJYMlRYICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUVRSX1RYMlJYCQkJMHgwMDAyIC8qIFRYMlJYICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUVRSX1VQR0gJCQkweDAwMDQgLyogVXBkYXRlIGdhaW4gSCAqLwotI2RlZmluZSAgQjQzX05QSFlfUkZTRVFUUl9VUEdMCQkJMHgwMDA4IC8qIFVwZGF0ZSBnYWluIEwgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1JGU0VRVFJfVVBHVQkJCTB4MDAxMCAvKiBVcGRhdGUgZ2FpbiBVICovCi0jZGVmaW5lICBCNDNfTlBIWV9SRlNFUVRSX1JTVDJSWAkJMHgwMDIwIC8qIFJlc2V0IHRvIFJYICovCi0jZGVmaW5lIEI0M19OUEhZX1JGU0VRU1QJCQlCNDNfUEhZX04oMHgwQTQpIC8qIFJGIHNlcSBzdGF0dXMuIFZhbHVlcyBzYW1lIGFzIHRyaWdnZXIuICovCi0jZGVmaW5lIEI0M19OUEhZX0FGRUNUTF9PVkVSCQkJQjQzX1BIWV9OKDB4MEE1KSAvKiBBRkUgY29udHJvbCBvdmVycmlkZSAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfQzEJCQlCNDNfUEhZX04oMHgwQTYpIC8qIEFGRSBjb250cm9sIGNvcmUgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfQzIJCQlCNDNfUEhZX04oMHgwQTcpIC8qIEFGRSBjb250cm9sIGNvcmUgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfQzMJCQlCNDNfUEhZX04oMHgwQTgpIC8qIEFGRSBjb250cm9sIGNvcmUgMyAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfQzQJCQlCNDNfUEhZX04oMHgwQTkpIC8qIEFGRSBjb250cm9sIGNvcmUgNCAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfREFDR0FJTjEJCUI0M19QSFlfTigweDBBQSkgLyogQUZFIGNvbnRyb2wgREFDIGdhaW4gMSAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfREFDR0FJTjIJCUI0M19QSFlfTigweDBBQikgLyogQUZFIGNvbnRyb2wgREFDIGdhaW4gMiAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfREFDR0FJTjMJCUI0M19QSFlfTigweDBBQykgLyogQUZFIGNvbnRyb2wgREFDIGdhaW4gMyAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfREFDR0FJTjQJCUI0M19QSFlfTigweDBBRCkgLyogQUZFIGNvbnRyb2wgREFDIGdhaW4gNCAqLwotI2RlZmluZSBCNDNfTlBIWV9TVFJfQUREUjEJCQlCNDNfUEhZX04oMHgwQUUpIC8qIFNUUiBhZGRyZXNzIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfU1RSX0FERFIyCQkJQjQzX1BIWV9OKDB4MEFGKSAvKiBTVFIgYWRkcmVzcyAyICovCi0jZGVmaW5lIEI0M19OUEhZX0NMQVNTQ1RMCQkJQjQzX1BIWV9OKDB4MEIwKSAvKiBDbGFzc2lmaWVyIGNvbnRyb2wgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0NMQVNTQ1RMX0NDS0VOCQkweDAwMDEgLyogQ0NLIGVuYWJsZSAqLwotI2RlZmluZSAgQjQzX05QSFlfQ0xBU1NDVExfT0ZETUVOCQkweDAwMDIgLyogT0ZETSBlbmFibGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0NMQVNTQ1RMX1dBSVRFREVOCQkweDAwMDQgLyogV2FpdGVkIGVuYWJsZSAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUZMSVAJCQkJQjQzX1BIWV9OKDB4MEIxKSAvKiBJL1EgZmxpcCAqLwotI2RlZmluZSAgQjQzX05QSFlfSVFGTElQX0FEQzEJCQkweDAwMDEgLyogQURDMSAqLwotI2RlZmluZSAgQjQzX05QSFlfSVFGTElQX0FEQzIJCQkweDAwMTAgLyogQURDMiAqLwotI2RlZmluZSBCNDNfTlBIWV9TSVNPX1NOUl9USFJFUwkJCUI0M19QSFlfTigweDBCMikgLyogU0lTTyBTTlIgdGhyZXNob2xkICovCi0jZGVmaW5lIEI0M19OUEhZX1NJR01BX05fTVVMVAkJCUI0M19QSFlfTigweDBCMykgLyogU2lnbWEgTiBtdWx0aXBsaWVyICovCi0jZGVmaW5lIEI0M19OUEhZX1RYTUFDREVMQVkJCQlCNDNfUEhZX04oMHgwQjQpIC8qIFRYIE1BQyBkZWxheSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZSQU1FREVMQVkJCQlCNDNfUEhZX04oMHgwQjUpIC8qIFRYIGZyYW1lIGRlbGF5ICovCi0jZGVmaW5lIEI0M19OUEhZX01MUEFSTQkJCQlCNDNfUEhZX04oMHgwQjYpIC8qIE1MIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgQjQzX05QSFlfTUxDVEwJCQkJQjQzX1BIWV9OKDB4MEI3KSAvKiBNTCBjb250cm9sICovCi0jZGVmaW5lIEI0M19OUEhZX1dXSVNFXzIwTkNZQ0RBVAkJQjQzX1BIWV9OKDB4MEI4KSAvKiBXV2lTRSAyMCBOIGN5YyBkYXRhICovCi0jZGVmaW5lIEI0M19OUEhZX1dXSVNFXzQwTkNZQ0RBVAkJQjQzX1BIWV9OKDB4MEI5KSAvKiBXV2lTRSA0MCBOIGN5YyBkYXRhICovCi0jZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfMjBOQ1lDREFUCQlCNDNfUEhZX04oMHgwQkEpIC8qIFRHTnN5bmMgMjAgTiBjeWMgZGF0YSAqLwotI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DXzQwTkNZQ0RBVAkJQjQzX1BIWV9OKDB4MEJCKSAvKiBUR05zeW5jIDQwIE4gY3ljIGRhdGEgKi8KLSNkZWZpbmUgQjQzX05QSFlfSU5JVFNXSVpQCQkJQjQzX1BIWV9OKDB4MEJDKSAvKiBJbml0aWFsIHN3aXp6bGUgcGF0dGVybiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWFRBSUxDTlQJCQlCNDNfUEhZX04oMHgwQkQpIC8qIFRYIHRhaWwgY291bnQgdmFsdWUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQlBIWV9DVEwxCQkJQjQzX1BIWV9OKDB4MEJFKSAvKiBCIFBIWSBjb250cm9sIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQlBIWV9DVEwyCQkJQjQzX1BIWV9OKDB4MEJGKSAvKiBCIFBIWSBjb250cm9sIDIgKi8KLSNkZWZpbmUgIEI0M19OUEhZX0JQSFlfQ1RMMl9MVVQJCQkweDAwMUYgLyogTFVUIGluZGV4ICovCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDJfTFVUX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDJfTUFDREVMCQkweDdGRTAgLyogTUFDIGRlbGF5ICovCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDJfTUFDREVMX1NISUZUCTUKLSNkZWZpbmUgQjQzX05QSFlfSVFMT0NBTF9DTUQJCQlCNDNfUEhZX04oMHgwQzApIC8qIEkvUSBMTyBjYWwgY29tbWFuZCAqLwotI2RlZmluZSAgQjQzX05QSFlfSVFMT0NBTF9DTURfRU4JCTB4ODAwMAotI2RlZmluZSBCNDNfTlBIWV9JUUxPQ0FMX0NNRE5OVU0JCUI0M19QSFlfTigweDBDMSkgLyogSS9RIExPIGNhbCBjb21tYW5kIE4gbnVtICovCi0jZGVmaW5lIEI0M19OUEhZX0lRTE9DQUxfQ01ER0NUTAkJQjQzX1BIWV9OKDB4MEMyKSAvKiBJL1EgTE8gY2FsIGNvbW1hbmQgRyBjb250cm9sICovCi0jZGVmaW5lIEI0M19OUEhZX1NBTVBfQ01ECQkJQjQzX1BIWV9OKDB4MEMzKSAvKiBTYW1wbGUgY29tbWFuZCAqLwotI2RlZmluZSAgQjQzX05QSFlfU0FNUF9DTURfU1RPUAkJCTB4MDAwMiAvKiBTdG9wICovCi0jZGVmaW5lIEI0M19OUEhZX1NBTVBfTE9PUENOVAkJCUI0M19QSFlfTigweDBDNCkgLyogU2FtcGxlIGxvb3AgY291bnQgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0FNUF9XQUlUQ05UCQkJQjQzX1BIWV9OKDB4MEM1KSAvKiBTYW1wbGUgd2FpdCBjb3VudCAqLwotI2RlZmluZSBCNDNfTlBIWV9TQU1QX0RFUENOVAkJCUI0M19QSFlfTigweDBDNikgLyogU2FtcGxlIGRlcHRoIGNvdW50ICovCi0jZGVmaW5lIEI0M19OUEhZX1NBTVBfU1RBVAkJCUI0M19QSFlfTigweDBDNykgLyogU2FtcGxlIHN0YXR1cyAqLwotI2RlZmluZSBCNDNfTlBIWV9HUElPX0xPT0VOCQkJQjQzX1BIWV9OKDB4MEM4KSAvKiBHUElPIGxvdyBvdXQgZW5hYmxlICovCi0jZGVmaW5lIEI0M19OUEhZX0dQSU9fSElPRU4JCQlCNDNfUEhZX04oMHgwQzkpIC8qIEdQSU8gaGlnaCBvdXQgZW5hYmxlICovCi0jZGVmaW5lIEI0M19OUEhZX0dQSU9fU0VMCQkJQjQzX1BIWV9OKDB4MENBKSAvKiBHUElPIHNlbGVjdCAqLwotI2RlZmluZSBCNDNfTlBIWV9HUElPX0NMS0NUTAkJCUI0M19QSFlfTigweDBDQikgLyogR1BJTyBjbG9jayBjb250cm9sICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0FTMAkJCUI0M19QSFlfTigweDBDQykgLyogVFggZmlsdGVyIDIwIGNvZWZmIEEgc3RhZ2UgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19BUzEJCQlCNDNfUEhZX04oMHgwQ0QpIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBBIHN0YWdlIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQVMyCQkJQjQzX1BIWV9OKDB4MENFKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQSBzdGFnZSAyICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0IzMlMwCQkJQjQzX1BIWV9OKDB4MENGKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQjMyIHN0YWdlIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQjFTMAkJCUI0M19QSFlfTigweDBEMCkgLyogVFggZmlsdGVyIDIwIGNvZWZmIEIxIHN0YWdlIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQjMyUzEJCQlCNDNfUEhZX04oMHgwRDEpIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBCMzIgc3RhZ2UgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19CMVMxCQkJQjQzX1BIWV9OKDB4MEQyKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQjEgc3RhZ2UgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19CMzJTMgkJCUI0M19QSFlfTigweDBEMykgLyogVFggZmlsdGVyIDIwIGNvZWZmIEIzMiBzdGFnZSAyICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0IxUzIJCQlCNDNfUEhZX04oMHgwRDQpIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBCMSBzdGFnZSAyICovCi0jZGVmaW5lIEI0M19OUEhZX1NJR0ZMRFRPTAkJCUI0M19QSFlfTigweDBENSkgLyogU2lnbmFsIGZsZCB0b2xlcmFuY2UgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhTRVJGTEQJCQlCNDNfUEhZX04oMHgwRDYpIC8qIFRYIHNlcnZpY2UgZmllbGQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQUZFU0VRX1JYMlRYX1BVRAkJQjQzX1BIWV9OKDB4MEQ3KSAvKiBBRkUgc2VxIFJYMlRYIHBvd2VyIHVwL2Rvd24gZGVsYXkgKi8KLSNkZWZpbmUgQjQzX05QSFlfQUZFU0VRX1RYMlJYX1BVRAkJQjQzX1BIWV9OKDB4MEQ4KSAvKiBBRkUgc2VxIFRYMlJYIHBvd2VyIHVwL2Rvd24gZGVsYXkgKi8KLSNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ19TQ1JBTUkwCQlCNDNfUEhZX04oMHgwRDkpIC8qIFRHTnN5bmMgc2NyYW0gaW5pdCAwICovCi0jZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfU0NSQU1JMQkJQjQzX1BIWV9OKDB4MERBKSAvKiBUR05zeW5jIHNjcmFtIGluaXQgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9JTklUU1dJWlBBVFRMRUcJCUI0M19QSFlfTigweDBEQikgLyogSW5pdGlhbCBzd2l6emxlIHBhdHRlcm4gbGVnICovCi0jZGVmaW5lIEI0M19OUEhZX0JQSFlfQ1RMMwkJCUI0M19QSFlfTigweDBEQykgLyogQiBQSFkgY29udHJvbCAzICovCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDNfU0NBTEUJCTB4MDBGRiAvKiBTY2FsZSAqLwotI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwzX1NDQUxFX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDNfRlNDCQkJMHhGRjAwIC8qIEZyYW1lIHN0YXJ0IGNvdW50IHZhbHVlICovCi0jZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDNfRlNDX1NISUZUCQk4Ci0jZGVmaW5lIEI0M19OUEhZX0JQSFlfQ1RMNAkJCUI0M19QSFlfTigweDBERCkgLyogQiBQSFkgY29udHJvbCA0ICovCi0jZGVmaW5lIEI0M19OUEhZX0MxX1RYQkJNVUxUCQkJQjQzX1BIWV9OKDB4MERFKSAvKiBDb3JlIDEgVFggQkIgbXVsdGlwbGllciAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9UWEJCTVVMVAkJCUI0M19QSFlfTigweDBERikgLyogQ29yZSAyIFRYIEJCIG11bHRpcGxpZXIgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQVMwCQkJQjQzX1BIWV9OKDB4MEUxKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQSBzdGFnZSAwICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0FTMQkJCUI0M19QSFlfTigweDBFMikgLyogVFggZmlsdGVyIDQwIGNvZWZmIEEgc3RhZ2UgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19BUzIJCQlCNDNfUEhZX04oMHgwRTMpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBBIHN0YWdlIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQjMyUzAJCQlCNDNfUEhZX04oMHgwRTQpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBCMzIgc3RhZ2UgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19CMVMwCQkJQjQzX1BIWV9OKDB4MEU1KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQjEgc3RhZ2UgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19CMzJTMQkJCUI0M19QSFlfTigweDBFNikgLyogVFggZmlsdGVyIDQwIGNvZWZmIEIzMiBzdGFnZSAxICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0IxUzEJCQlCNDNfUEhZX04oMHgwRTcpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBCMSBzdGFnZSAxICovCi0jZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0IzMlMyCQkJQjQzX1BIWV9OKDB4MEU4KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQjMyIHN0YWdlIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQjFTMgkJCUI0M19QSFlfTigweDBFOSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIEIxIHN0YWdlIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfQklTVF9TVEFUMgkJCUI0M19QSFlfTigweDBFQSkgLyogQklTVCBzdGF0dXMgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9CSVNUX1NUQVQzCQkJQjQzX1BIWV9OKDB4MEVCKSAvKiBCSVNUIHN0YXR1cyAzICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX09WRVIJCQlCNDNfUEhZX04oMHgwRUMpIC8qIFJGIGNvbnRyb2wgb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfTUlNT0NGRwkJCUI0M19QSFlfTigweDBFRCkgLyogTUlNTyBjb25maWcgKi8KLSNkZWZpbmUgIEI0M19OUEhZX01JTU9DRkdfR0ZNSVgJCQkweDAwMDQgLyogR3JlZW5maWVsZCBvciBtaXhlZCBtb2RlICovCi0jZGVmaW5lICBCNDNfTlBIWV9NSU1PQ0ZHX0FVVE8JCQkweDAxMDAgLyogR3JlZW5maWVsZC9taXhlZCBtb2RlIGF1dG8gKi8KLSNkZWZpbmUgQjQzX05QSFlfUkFEQVJfQkxOS0NUTAkJCUI0M19QSFlfTigweDBFRSkgLyogUmFkYXIgYmxhbmsgY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9BMFJBREFSX0ZJRk9DVEwJCUI0M19QSFlfTigweDBFRikgLyogQW50ZW5uYSAwIHJhZGFyIEZJRk8gY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9BMVJBREFSX0ZJRk9DVEwJCUI0M19QSFlfTigweDBGMCkgLyogQW50ZW5uYSAxIHJhZGFyIEZJRk8gY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9BMFJBREFSX0ZJRk9EQVQJCUI0M19QSFlfTigweDBGMSkgLyogQW50ZW5uYSAwIHJhZGFyIEZJRk8gZGF0YSAqLwotI2RlZmluZSBCNDNfTlBIWV9BMVJBREFSX0ZJRk9EQVQJCUI0M19QSFlfTigweDBGMikgLyogQW50ZW5uYSAxIHJhZGFyIEZJRk8gZGF0YSAqLwotI2RlZmluZSBCNDNfTlBIWV9SQURBUl9USFJFUzAJCQlCNDNfUEhZX04oMHgwRjMpIC8qIFJhZGFyIHRocmVzaG9sZCAwICovCi0jZGVmaW5lIEI0M19OUEhZX1JBREFSX1RIUkVTMQkJCUI0M19QSFlfTigweDBGNCkgLyogUmFkYXIgdGhyZXNob2xkIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkFEQVJfVEhSRVMwUgkJCUI0M19QSFlfTigweDBGNSkgLyogUmFkYXIgdGhyZXNob2xkIDBSICovCi0jZGVmaW5lIEI0M19OUEhZX1JBREFSX1RIUkVTMVIJCQlCNDNfUEhZX04oMHgwRjYpIC8qIFJhZGFyIHRocmVzaG9sZCAxUiAqLwotI2RlZmluZSBCNDNfTlBIWV9DU0VOXzIwSU40MF9ETEVOCQlCNDNfUEhZX04oMHgwRjcpIC8qIENhcnJpZXIgc2Vuc2UgMjAgaW4gNDAgZHdlbGwgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX0xPMQkJQjQzX1BIWV9OKDB4MEY4KSAvKiBSRiBjb250cm9sIExVVCBUUlNXIGxvd2VyIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAxCQlCNDNfUEhZX04oMHgwRjkpIC8qIFJGIGNvbnRyb2wgTFVUIFRSU1cgdXBwZXIgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzIJCUI0M19QSFlfTigweDBGQSkgLyogUkYgY29udHJvbCBMVVQgVFJTVyBsb3dlciAyICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMgkJQjQzX1BIWV9OKDB4MEZCKSAvKiBSRiBjb250cm9sIExVVCBUUlNXIHVwcGVyIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8zCQlCNDNfUEhZX04oMHgwRkMpIC8qIFJGIGNvbnRyb2wgTFVUIFRSU1cgbG93ZXIgMyAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDMJCUI0M19QSFlfTigweDBGRCkgLyogUkYgY29udHJvbCBMVVQgVFJTVyB1cHBlciAzICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX0xPNAkJQjQzX1BIWV9OKDB4MEZFKSAvKiBSRiBjb250cm9sIExVVCBUUlNXIGxvd2VyIDQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVA0CQlCNDNfUEhZX04oMHgwRkYpIC8qIFJGIGNvbnRyb2wgTFVUIFRSU1cgdXBwZXIgNCAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfTE5BUEExCQlCNDNfUEhZX04oMHgxMDApIC8qIFJGIGNvbnRyb2wgTFVUIExOQSBQQSAxICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9MTkFQQTIJCUI0M19QSFlfTigweDEwMSkgLyogUkYgY29udHJvbCBMVVQgTE5BIFBBIDIgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX0xOQVBBMwkJQjQzX1BIWV9OKDB4MTAyKSAvKiBSRiBjb250cm9sIExVVCBMTkEgUEEgMyAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfTE5BUEE0CQlCNDNfUEhZX04oMHgxMDMpIC8qIFJGIGNvbnRyb2wgTFVUIExOQSBQQSA0ICovCi0jZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfQ1JDTTAJCQlCNDNfUEhZX04oMHgxMDQpIC8qIFRHTnN5bmMgQ1JDIG1hc2sgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DX0NSQ00xCQkJQjQzX1BIWV9OKDB4MTA1KSAvKiBUR05zeW5jIENSQyBtYXNrIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ19DUkNNMgkJCUI0M19QSFlfTigweDEwNikgLyogVEdOc3luYyBDUkMgbWFzayAyICovCi0jZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfQ1JDTTMJCQlCNDNfUEhZX04oMHgxMDcpIC8qIFRHTnN5bmMgQ1JDIG1hc2sgMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DX0NSQ000CQkJQjQzX1BIWV9OKDB4MTA4KSAvKiBUR05zeW5jIENSQyBtYXNrIDQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JDUE9MWQkJCUI0M19QSFlfTigweDEwOSkgLyogQ1JDIHBvbHlub21pYWwgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0lHQ05UCQkJCUI0M19QSFlfTigweDEwQSkgLyogIyBzaWcgY291bnQgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0lHU1RBUlRCSVRfQ1RMCQlCNDNfUEhZX04oMHgxMEIpIC8qIFNpZyBzdGFydCBiaXQgY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9DUkNQT0xZX09SREVSCQkJQjQzX1BIWV9OKDB4MTBDKSAvKiBDUkMgcG9seW5vbWlhbCBvcmRlciAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9DU1QwCQkJQjQzX1BIWV9OKDB4MTBEKSAvKiBSRiBjb250cm9sIGNvcmUgc3dhcCB0YWJsZSAwICovCi0jZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0NTVDEJCQlCNDNfUEhZX04oMHgxMEUpIC8qIFJGIGNvbnRyb2wgY29yZSBzd2FwIHRhYmxlIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZDVExfQ1NUMk8JCQlCNDNfUEhZX04oMHgxMEYpIC8qIFJGIGNvbnRyb2wgY29yZSBzd2FwIHRhYmxlIDIgKyBvdGhlcnMgKi8KLSNkZWZpbmUgQjQzX05QSFlfQlBIWV9DVEw1CQkJQjQzX1BIWV9OKDB4MTExKSAvKiBCIFBIWSBjb250cm9sIDUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkZTRVFfTFBGQlcJCQlCNDNfUEhZX04oMHgxMTIpIC8qIFJGIHNlcSBMUEYgYmFuZHdpZHRoICovCi0jZGVmaW5lIEI0M19OUEhZX1RTU0lCSUFTMQkJCUI0M19QSFlfTigweDExNCkgLyogVFNTSSBiaWFzIHZhbCAxICovCi0jZGVmaW5lIEI0M19OUEhZX1RTU0lCSUFTMgkJCUI0M19QSFlfTigweDExNSkgLyogVFNTSSBiaWFzIHZhbCAyICovCi0jZGVmaW5lICBCNDNfTlBIWV9UU1NJQklBU19CSUFTCQkJMHgwMEZGIC8qIEJpYXMgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RTU0lCSUFTX0JJQVNfU0hJRlQJCTAKLSNkZWZpbmUgIEI0M19OUEhZX1RTU0lCSUFTX1ZBTAkJCTB4RkYwMCAvKiBWYWx1ZSAqLwotI2RlZmluZSAgQjQzX05QSFlfVFNTSUJJQVNfVkFMX1NISUZUCQk4Ci0jZGVmaW5lIEI0M19OUEhZX0VTVFBXUjEJCQlCNDNfUEhZX04oMHgxMTgpIC8qIEVzdGltYXRlZCBwb3dlciAxICovCi0jZGVmaW5lIEI0M19OUEhZX0VTVFBXUjIJCQlCNDNfUEhZX04oMHgxMTkpIC8qIEVzdGltYXRlZCBwb3dlciAyICovCi0jZGVmaW5lICBCNDNfTlBIWV9FU1RQV1JfUFdSCQkJMHgwMEZGIC8qIEVzdGltYXRlZCBwb3dlciAqLwotI2RlZmluZSAgQjQzX05QSFlfRVNUUFdSX1BXUl9TSElGVAkJMAotI2RlZmluZSAgQjQzX05QSFlfRVNUUFdSX1ZBTElECQkJMHgwMTAwIC8qIEVzdGltYXRlZCBwb3dlciB2YWxpZCAqLwotI2RlZmluZSBCNDNfTlBIWV9UU1NJX01BWFRYRkRUCQkJQjQzX1BIWV9OKDB4MTFDKSAvKiBUU1NJIG1heCBUWCBmcmFtZSBkZWxheSB0aW1lICovCi0jZGVmaW5lICBCNDNfTlBIWV9UU1NJX01BWFRYRkRUX1ZBTAkJMHgwMEZGIC8qIG1heCBUWCBmcmFtZSBkZWxheSB0aW1lICovCi0jZGVmaW5lICBCNDNfTlBIWV9UU1NJX01BWFRYRkRUX1ZBTF9TSElGVAkwCi0jZGVmaW5lIEI0M19OUEhZX1RTU0lfTUFYVERUCQkJQjQzX1BIWV9OKDB4MTFEKSAvKiBUU1NJIG1heCBUU1NJIGRlbGF5IHRpbWUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RTU0lfTUFYVERUX1ZBTAkJMHgwMEZGIC8qIG1heCBUU1NJIGRlbGF5IHRpbWUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RTU0lfTUFYVERUX1ZBTF9TSElGVAkJMAotI2RlZmluZSBCNDNfTlBIWV9JVFNTSTEJCQkJQjQzX1BIWV9OKDB4MTFFKSAvKiBUU1NJIGlkbGUgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9JVFNTSTIJCQkJQjQzX1BIWV9OKDB4MTFGKSAvKiBUU1NJIGlkbGUgMiAqLwotI2RlZmluZSAgQjQzX05QSFlfSVRTU0lfVkFMCQkJMHgwMEZGIC8qIElkbGUgVFNTSSAqLwotI2RlZmluZSAgQjQzX05QSFlfSVRTU0lfVkFMX1NISUZUCQkwCi0jZGVmaW5lIEI0M19OUEhZX1RTU0lNT0RFCQkJQjQzX1BIWV9OKDB4MTIyKSAvKiBUU1NJIG1vZGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RTU0lNT0RFX0VOCQkJMHgwMDAxIC8qIFRTU0kgZW5hYmxlICovCi0jZGVmaW5lICBCNDNfTlBIWV9UU1NJTU9ERV9QREVOCQkJMHgwMDAyIC8qIFBvd2VyIGRldCBlbmFibGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhNQUNJRk0JCQlCNDNfUEhZX04oMHgxMjMpIC8qIFJYIE1hY2lmIG1vZGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTSVRfQ09DTlRfTE8JCQlCNDNfUEhZX04oMHgxMjQpIC8qIENSUyBpZGxlIHRpbWUgQ1JTLW9uIGNvdW50IChsb3cpICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU0lUX0NPQ05UX0hJCQkJQjQzX1BIWV9OKDB4MTI1KSAvKiBDUlMgaWRsZSB0aW1lIENSUy1vbiBjb3VudCAoaGlnaCkgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTSVRfTVRDTlRfTE8JCQlCNDNfUEhZX04oMHgxMjYpIC8qIENSUyBpZGxlIHRpbWUgbWVhc3VyZSB0aW1lIGNvdW50IChsb3cpICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU0lUX01UQ05UX0hJCQkJQjQzX1BIWV9OKDB4MTI3KSAvKiBDUlMgaWRsZSB0aW1lIG1lYXN1cmUgdGltZSBjb3VudCAoaGlnaCkgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0FNVFdDCQkJCUI0M19QSFlfTigweDEyOCkgLyogU2FtcGxlIHRhaWwgd2FpdCBjb3VudCAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9DTUQJCQlCNDNfUEhZX04oMHgxMjkpIC8qIEkvUSBlc3RpbWF0ZSBjb21tYW5kICovCi0jZGVmaW5lICBCNDNfTlBIWV9JUUVTVF9DTURfU1RBUlQJCTB4MDAwMSAvKiBTdGFydCAqLwotI2RlZmluZSAgQjQzX05QSFlfSVFFU1RfQ01EX01PREUJCTB4MDAwMiAvKiBNb2RlICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX1dUCQkJQjQzX1BIWV9OKDB4MTJBKSAvKiBJL1EgZXN0aW1hdGUgd2FpdCB0aW1lICovCi0jZGVmaW5lICBCNDNfTlBIWV9JUUVTVF9XVF9WQUwJCQkweDAwRkYgLyogV2FpdCB0aW1lICovCi0jZGVmaW5lICBCNDNfTlBIWV9JUUVTVF9XVF9WQUxfU0hJRlQJCTAKLSNkZWZpbmUgQjQzX05QSFlfSVFFU1RfU0FNQ05UCQkJQjQzX1BIWV9OKDB4MTJCKSAvKiBJL1EgZXN0aW1hdGUgc2FtcGxlIGNvdW50ICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX0lRQUNDX0xPMAkJQjQzX1BIWV9OKDB4MTJDKSAvKiBJL1EgZXN0aW1hdGUgSS9RIGFjYyBsbyAwICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX0lRQUNDX0hJMAkJQjQzX1BIWV9OKDB4MTJEKSAvKiBJL1EgZXN0aW1hdGUgSS9RIGFjYyBoaSAwICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX0lQQUNDX0xPMAkJQjQzX1BIWV9OKDB4MTJFKSAvKiBJL1EgZXN0aW1hdGUgSSBwb3dlciBhY2MgbG8gMCAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUEFDQ19ISTAJCUI0M19QSFlfTigweDEyRikgLyogSS9RIGVzdGltYXRlIEkgcG93ZXIgYWNjIGhpIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfSVFFU1RfUVBBQ0NfTE8wCQlCNDNfUEhZX04oMHgxMzApIC8qIEkvUSBlc3RpbWF0ZSBRIHBvd2VyIGFjYyBsbyAwICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX1FQQUNDX0hJMAkJQjQzX1BIWV9OKDB4MTMxKSAvKiBJL1EgZXN0aW1hdGUgUSBwb3dlciBhY2MgaGkgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUUFDQ19MTzEJCUI0M19QSFlfTigweDEzNCkgLyogSS9RIGVzdGltYXRlIEkvUSBhY2MgbG8gMSAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUUFDQ19ISTEJCUI0M19QSFlfTigweDEzNSkgLyogSS9RIGVzdGltYXRlIEkvUSBhY2MgaGkgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUEFDQ19MTzEJCUI0M19QSFlfTigweDEzNikgLyogSS9RIGVzdGltYXRlIEkgcG93ZXIgYWNjIGxvIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfSVFFU1RfSVBBQ0NfSEkxCQlCNDNfUEhZX04oMHgxMzcpIC8qIEkvUSBlc3RpbWF0ZSBJIHBvd2VyIGFjYyBoaSAxICovCi0jZGVmaW5lIEI0M19OUEhZX0lRRVNUX1FQQUNDX0xPMQkJQjQzX1BIWV9OKDB4MTM4KSAvKiBJL1EgZXN0aW1hdGUgUSBwb3dlciBhY2MgbG8gMSAqLwotI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9RUEFDQ19ISTEJCUI0M19QSFlfTigweDEzOSkgLyogSS9RIGVzdGltYXRlIFEgcG93ZXIgYWNjIGhpIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfTUlNT19DUlNUWEVYVAkJCUI0M19QSFlfTigweDEzQSkgLyogTUlNTyBQSFkgQ1JTIFRYIGV4dGVuc2lvbiAqLwotI2RlZmluZSBCNDNfTlBIWV9QV1JERVQxCQkJQjQzX1BIWV9OKDB4MTNCKSAvKiBQb3dlciBkZXQgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9QV1JERVQyCQkJQjQzX1BIWV9OKDB4MTNDKSAvKiBQb3dlciBkZXQgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9NQVhSU1NJX0RUSU1FCQkJQjQzX1BIWV9OKDB4MTNGKSAvKiBSU1NJIG1heCBSU1NJIGRlbGF5IHRpbWUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUElMX0RXMAkJCUI0M19QSFlfTigweDE0MSkgLyogUGlsb3QgZGF0YSB3ZWlnaHQgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9QSUxfRFcxCQkJQjQzX1BIWV9OKDB4MTQyKSAvKiBQaWxvdCBkYXRhIHdlaWdodCAxICovCi0jZGVmaW5lIEI0M19OUEhZX1BJTF9EVzIJCQlCNDNfUEhZX04oMHgxNDMpIC8qIFBpbG90IGRhdGEgd2VpZ2h0IDIgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1BJTF9EV19CUFNLCQkJMHgwMDBGIC8qIEJQU0sgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1BJTF9EV19CUFNLX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfUVBTSwkJCTB4MDBGMCAvKiBRUFNLICovCi0jZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfUVBTS19TSElGVAkJNAotI2RlZmluZSAgQjQzX05QSFlfUElMX0RXXzE2UUFNCQkJMHgwRjAwIC8qIDE2LVFBTSAqLwotI2RlZmluZSAgQjQzX05QSFlfUElMX0RXXzE2UUFNX1NISUZUCQk4Ci0jZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfNjRRQU0JCQkweEYwMDAgLyogNjQtUUFNICovCi0jZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfNjRRQU1fU0hJRlQJCTEyCi0jZGVmaW5lIEI0M19OUEhZX0ZNREVNX0NGRwkJCUI0M19QSFlfTigweDE0NCkgLyogRk0gZGVtb2R1bGF0aW9uIGNvbmZpZyAqLwotI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0EwCQkJQjQzX1BIWV9OKDB4MTQ1KSAvKiBQaGFzZSB0cmFjayBhbHBoYSAwICovCi0jZGVmaW5lIEI0M19OUEhZX1BIQVNFVFJfQTEJCQlCNDNfUEhZX04oMHgxNDYpIC8qIFBoYXNlIHRyYWNrIGFscGhhIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEhBU0VUUl9BMgkJCUI0M19QSFlfTigweDE0NykgLyogUGhhc2UgdHJhY2sgYWxwaGEgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0IwCQkJQjQzX1BIWV9OKDB4MTQ4KSAvKiBQaGFzZSB0cmFjayBiZXRhIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEhBU0VUUl9CMQkJCUI0M19QSFlfTigweDE0OSkgLyogUGhhc2UgdHJhY2sgYmV0YSAxICovCi0jZGVmaW5lIEI0M19OUEhZX1BIQVNFVFJfQjIJCQlCNDNfUEhZX04oMHgxNEEpIC8qIFBoYXNlIHRyYWNrIGJldGEgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0NIRzAJCQlCNDNfUEhZX04oMHgxNEIpIC8qIFBoYXNlIHRyYWNrIGNoYW5nZSAwICovCi0jZGVmaW5lIEI0M19OUEhZX1BIQVNFVFJfQ0hHMQkJCUI0M19QSFlfTigweDE0QykgLyogUGhhc2UgdHJhY2sgY2hhbmdlIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEhBU0VUV19PRkYJCQlCNDNfUEhZX04oMHgxNEQpIC8qIFBoYXNlIHRyYWNrIG9mZnNldCAqLwotI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9EQkcJCQlCNDNfUEhZX04oMHgxNEUpIC8qIFJGIGNvbnRyb2wgZGVidWcgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ0NLX1NISUZUQl9SRUYJCQlCNDNfUEhZX04oMHgxNTApIC8qIENDSyBzaGlmdGJpdHMgcmVmZXJlbmNlIHZhciAqLwotI2RlZmluZSBCNDNfTlBIWV9PVkVSX0RHQUlOMAkJCUI0M19QSFlfTigweDE1MikgLyogT3ZlcnJpZGUgZGlnaXRhbCBnYWluIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfT1ZFUl9ER0FJTjEJCQlCNDNfUEhZX04oMHgxNTMpIC8qIE92ZXJyaWRlIGRpZ2l0YWwgZ2FpbiAxICovCi0jZGVmaW5lICBCNDNfTlBIWV9PVkVSX0RHQUlOX0ZER1YJCTB4MDAwNyAvKiBGb3JjZSBkaWdpdGFsIGdhaW4gdmFsdWUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX09WRVJfREdBSU5fRkRHVl9TSElGVAkJMAotI2RlZmluZSAgQjQzX05QSFlfT1ZFUl9ER0FJTl9GREdFTgkJMHgwMDA4IC8qIEZvcmNlIGRpZ2l0YWwgZ2FpbiBlbmFibGUgKi8KLSNkZWZpbmUgIEI0M19OUEhZX09WRVJfREdBSU5fQ0NLREdFQ1YJCTB4RkYwMCAvKiBDQ0sgZGlnaXRhbCBnYWluIGVuYWJsZSBjb3VudCB2YWx1ZSAqLwotI2RlZmluZSAgQjQzX05QSFlfT1ZFUl9ER0FJTl9DQ0tER0VDVl9TSElGVAk4Ci0jZGVmaW5lIEI0M19OUEhZX0JJU1RfU1RBVDQJCQlCNDNfUEhZX04oMHgxNTYpIC8qIEJJU1Qgc3RhdHVzIDQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUkFEQVJfTUFMCQkJQjQzX1BIWV9OKDB4MTU3KSAvKiBSYWRhciBNQSBsZW5ndGggKi8KLSNkZWZpbmUgQjQzX05QSFlfUkFEQVJfU1JDQ1RMCQkJQjQzX1BIWV9OKDB4MTU4KSAvKiBSYWRhciBzZWFyY2ggY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9WTERfRFRTSUcJCQlCNDNfUEhZX04oMHgxNTkpIC8qIFZMRCBkYXRhIHRvbmVzIHNpZyAqLwotI2RlZmluZSBCNDNfTlBIWV9WTERfRFREQVQJCQlCNDNfUEhZX04oMHgxNUEpIC8qIFZMRCBkYXRhIHRvbmVzIGRhdGEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzFfQlBIWV9SWElRQ0EwCQlCNDNfUEhZX04oMHgxNUIpIC8qIENvcmUgMSBCIFBIWSBSWCBJL1EgY29tcCBBMCAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9CUEhZX1JYSVFDQjAJCUI0M19QSFlfTigweDE1QykgLyogQ29yZSAxIEIgUEhZIFJYIEkvUSBjb21wIEIwICovCi0jZGVmaW5lIEI0M19OUEhZX0MyX0JQSFlfUlhJUUNBMQkJQjQzX1BIWV9OKDB4MTVEKSAvKiBDb3JlIDIgQiBQSFkgUlggSS9RIGNvbXAgQTEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQlBIWV9SWElRQ0IxCQlCNDNfUEhZX04oMHgxNUUpIC8qIENvcmUgMiBCIFBIWSBSWCBJL1EgY29tcCBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTjAJCQlCNDNfUEhZX04oMHgxNjApIC8qIEZyZXF1ZW5jeSBnYWluIDAgKi8KLSNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU4xCQkJQjQzX1BIWV9OKDB4MTYxKSAvKiBGcmVxdWVuY3kgZ2FpbiAxICovCi0jZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlOMgkJCUI0M19QSFlfTigweDE2MikgLyogRnJlcXVlbmN5IGdhaW4gMiAqLwotI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTjMJCQlCNDNfUEhZX04oMHgxNjMpIC8qIEZyZXF1ZW5jeSBnYWluIDMgKi8KLSNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU40CQkJQjQzX1BIWV9OKDB4MTY0KSAvKiBGcmVxdWVuY3kgZ2FpbiA0ICovCi0jZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlONQkJCUI0M19QSFlfTigweDE2NSkgLyogRnJlcXVlbmN5IGdhaW4gNSAqLwotI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTjYJCQlCNDNfUEhZX04oMHgxNjYpIC8qIEZyZXF1ZW5jeSBnYWluIDYgKi8KLSNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU43CQkJQjQzX1BIWV9OKDB4MTY3KSAvKiBGcmVxdWVuY3kgZ2FpbiA3ICovCi0jZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlOX0JZUEFTUwkJQjQzX1BIWV9OKDB4MTY4KSAvKiBGcmVxdWVuY3kgZ2FpbiBieXBhc3MgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFJMT1NTCQkJCUI0M19QSFlfTigweDE2OSkgLyogVFIgbG9zcyB2YWx1ZSAqLwotI2RlZmluZSBCNDNfTlBIWV9DMV9BRENDTElQCQkJQjQzX1BIWV9OKDB4MTZBKSAvKiBDb3JlIDEgQURDIGNsaXAgKi8KLSNkZWZpbmUgQjQzX05QSFlfQzJfQURDQ0xJUAkJCUI0M19QSFlfTigweDE2QikgLyogQ29yZSAyIEFEQyBjbGlwICovCi0jZGVmaW5lIEI0M19OUEhZX0xUUk5fT0ZGR0FJTgkJCUI0M19QSFlfTigweDE2RikgLyogTFRSTiBvZmZzZXQgZ2FpbiAqLwotI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRgkJCUI0M19QSFlfTigweDE3MCkgLyogTFRSTiBvZmZzZXQgKi8KLSNkZWZpbmUgQjQzX05QSFlfTlJEQVRBVF9XV0lTRTIwU0lHCQlCNDNfUEhZX04oMHgxNzEpIC8qICMgZGF0YSB0b25lcyBXV2lTRSAyMCBzaWcgKi8KLSNkZWZpbmUgQjQzX05QSFlfTlJEQVRBVF9XV0lTRTQwU0lHCQlCNDNfUEhZX04oMHgxNzIpIC8qICMgZGF0YSB0b25lcyBXV2lTRSA0MCBzaWcgKi8KLSNkZWZpbmUgQjQzX05QSFlfTlJEQVRBVF9UR05TWU5DMjBTSUcJCUI0M19QSFlfTigweDE3MykgLyogIyBkYXRhIHRvbmVzIFRHTnN5bmMgMjAgc2lnICovCi0jZGVmaW5lIEI0M19OUEhZX05SREFUQVRfVEdOU1lOQzQwU0lHCQlCNDNfUEhZX04oMHgxNzQpIC8qICMgZGF0YSB0b25lcyBUR05zeW5jIDQwIHNpZyAqLwotI2RlZmluZSBCNDNfTlBIWV9XV0lTRV9DUkNNMAkJCUI0M19QSFlfTigweDE3NSkgLyogV1dpU0UgQ1JDIG1hc2sgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9XV0lTRV9DUkNNMQkJCUI0M19QSFlfTigweDE3NikgLyogV1dpU0UgQ1JDIG1hc2sgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9XV0lTRV9DUkNNMgkJCUI0M19QSFlfTigweDE3NykgLyogV1dpU0UgQ1JDIG1hc2sgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9XV0lTRV9DUkNNMwkJCUI0M19QSFlfTigweDE3OCkgLyogV1dpU0UgQ1JDIG1hc2sgMyAqLwotI2RlZmluZSBCNDNfTlBIWV9XV0lTRV9DUkNNNAkJCUI0M19QSFlfTigweDE3OSkgLyogV1dpU0UgQ1JDIG1hc2sgNCAqLwotI2RlZmluZSBCNDNfTlBIWV9DSEFORVNUX0NERFNICQkJQjQzX1BIWV9OKDB4MTdBKSAvKiBDaGFubmVsIGVzdGltYXRlIENERCBzaGlmdCAqLwotI2RlZmluZSBCNDNfTlBIWV9IVEFHQ19XQ05UCQkJQjQzX1BIWV9OKDB4MTdCKSAvKiBIVCBBREMgd2FpdCBjb3VudGVycyAqLwotI2RlZmluZSBCNDNfTlBIWV9TUVBBUk0JCQkJQjQzX1BIWV9OKDB4MTdDKSAvKiBTUSBwYXJhbXMgKi8KLSNkZWZpbmUgQjQzX05QSFlfTUNTRFVQNk0JCQlCNDNfUEhZX04oMHgxN0QpIC8qIE1DUyBkdXAgNk0gKi8KLSNkZWZpbmUgQjQzX05QSFlfTkRBVEFUX0RVUDQwCQkJQjQzX1BIWV9OKDB4MTdFKSAvKiAjIGRhdGEgdG9uZXMgZHVwIDQwICovCi0jZGVmaW5lIEI0M19OUEhZX0RVUDQwX1RHTlNZTkNfQ1lDRAkJQjQzX1BIWV9OKDB4MTdGKSAvKiBEdXA0MCBUR05zeW5jIGN5Y2xlIGRhdGEgKi8KLSNkZWZpbmUgQjQzX05QSFlfRFVQNDBfR0ZCTAkJCUI0M19QSFlfTigweDE4MCkgLyogRHVwNDAgR0YgZm9ybWF0IEJMIGFkZHJlc3MgKi8KLSNkZWZpbmUgQjQzX05QSFlfRFVQNDBfQkwJCQlCNDNfUEhZX04oMHgxODEpIC8qIER1cDQwIGZvcm1hdCBCTCBhZGRyZXNzICovCi0jZGVmaW5lIEI0M19OUEhZX0xFR0RVUF9GVEEJCQlCNDNfUEhZX04oMHgxODIpIC8qIExlZ2FjeSBkdXAgZnJtIHRhYmxlIGFkZHJlc3MgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEFDUFJPQ19EQkcJCQlCNDNfUEhZX04oMHgxODMpIC8qIFBhY2tldCBwcm9jZXNzaW5nIGRlYnVnICovCi0jZGVmaW5lIEI0M19OUEhZX1BJTF9DWUMxCQkJQjQzX1BIWV9OKDB4MTg0KSAvKiBQaWxvdCBjeWNsZSBjb3VudGVyIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUElMX0NZQzIJCQlCNDNfUEhZX04oMHgxODUpIC8qIFBpbG90IGN5Y2xlIGNvdW50ZXIgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMEExCQkJQjQzX1BIWV9OKDB4MTg2KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMCBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMEEyCQkJQjQzX1BIWV9OKDB4MTg3KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMCBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMUExCQkJQjQzX1BIWV9OKDB4MTg4KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMSBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMUEyCQkJQjQzX1BIWV9OKDB4MTg5KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMSBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMkExCQkJQjQzX1BIWV9OKDB4MThBKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMiBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMkEyCQkJQjQzX1BIWV9OKDB4MThCKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMiBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMEIxCQkJQjQzX1BIWV9OKDB4MThDKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMCBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMEIyCQkJQjQzX1BIWV9OKDB4MThEKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMCBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMEIzCQkJQjQzX1BIWV9OKDB4MThFKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMCBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMUIxCQkJQjQzX1BIWV9OKDB4MThGKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMSBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMUIyCQkJQjQzX1BIWV9OKDB4MTkwKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMSBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMUIzCQkJQjQzX1BIWV9OKDB4MTkxKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMSBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMkIxCQkJQjQzX1BIWV9OKDB4MTkyKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMiBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMkIyCQkJQjQzX1BIWV9OKDB4MTkzKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMiBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19TMkIzCQkJQjQzX1BIWV9OKDB4MTk0KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgc3RhZ2UgMiBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMEExCQkJQjQzX1BIWV9OKDB4MTk1KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMCBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMEEyCQkJQjQzX1BIWV9OKDB4MTk2KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMCBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMUExCQkJQjQzX1BIWV9OKDB4MTk3KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMSBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMUEyCQkJQjQzX1BIWV9OKDB4MTk4KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMSBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMkExCQkJQjQzX1BIWV9OKDB4MTk5KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMiBBMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMkEyCQkJQjQzX1BIWV9OKDB4MTlBKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMiBBMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMEIxCQkJQjQzX1BIWV9OKDB4MTlCKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMCBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMEIyCQkJQjQzX1BIWV9OKDB4MTlDKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMCBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMEIzCQkJQjQzX1BIWV9OKDB4MTlEKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMCBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMUIxCQkJQjQzX1BIWV9OKDB4MTlFKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMSBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMUIyCQkJQjQzX1BIWV9OKDB4MTlGKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMSBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMUIzCQkJQjQzX1BIWV9OKDB4MUEwKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMSBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMkIxCQkJQjQzX1BIWV9OKDB4MUExKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMiBCMSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMkIyCQkJQjQzX1BIWV9OKDB4MUEyKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMiBCMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19TMkIzCQkJQjQzX1BIWV9OKDB4MUEzKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgc3RhZ2UgMiBCMyAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMElfUlNTSV9YCQlCNDNfUEhZX04oMHgxQTQpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBJIFJTU0kgWCAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMElfUlNTSV9ZCQlCNDNfUEhZX04oMHgxQTUpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBJIFJTU0kgWSAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMElfUlNTSV9aCQlCNDNfUEhZX04oMHgxQTYpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBJIFJTU0kgWiAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMElfVEJECQkJQjQzX1BIWV9OKDB4MUE3KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBUQkQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1BXUkRFVAkJQjQzX1BIWV9OKDB4MUE4KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBwb3dlciBkZXQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1RTU0kJCQlCNDNfUEhZX04oMHgxQTkpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBJIFRTU0kgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBRX1JTU0lfWAkJQjQzX1BIWV9OKDB4MUFBKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgUSBSU1NJIFggKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBRX1JTU0lfWQkJQjQzX1BIWV9OKDB4MUFCKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgUSBSU1NJIFkgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBRX1JTU0lfWgkJQjQzX1BIWV9OKDB4MUFDKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgUSBSU1NJIFogKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBRX1RCRAkJCUI0M19QSFlfTigweDFBRCkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgVEJEICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9QV1JERVQJCUI0M19QSFlfTigweDFBRSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgcG93ZXIgZGV0ICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9UU1NJCQkJQjQzX1BIWV9OKDB4MUFGKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgUSBUU1NJICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xSV9SU1NJX1gJCUI0M19QSFlfTigweDFCMCkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIEkgUlNTSSBYICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xSV9SU1NJX1kJCUI0M19QSFlfTigweDFCMSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIEkgUlNTSSBZICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xSV9SU1NJX1oJCUI0M19QSFlfTigweDFCMikgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIEkgUlNTSSBaICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xSV9UQkQJCQlCNDNfUEhZX04oMHgxQjMpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIFRCRCAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfUFdSREVUCQlCNDNfUEhZX04oMHgxQjQpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIHBvd2VyIGRldCAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfVFNTSQkJCUI0M19QSFlfTigweDFCNSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIEkgVFNTSSAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMVFfUlNTSV9YCQlCNDNfUEhZX04oMHgxQjYpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBRIFJTU0kgWCAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMVFfUlNTSV9ZCQlCNDNfUEhZX04oMHgxQjcpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBRIFJTU0kgWSAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMVFfUlNTSV9aCQlCNDNfUEhZX04oMHgxQjgpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBRIFJTU0kgWiAqLwotI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMVFfVEJECQkJQjQzX1BIWV9OKDB4MUI5KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBUQkQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1BXUkRFVAkJQjQzX1BIWV9OKDB4MUJBKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBwb3dlciBkZXQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1RTU0kJCQlCNDNfUEhZX04oMHgxQkIpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBRIFRTU0kgKi8KLSNkZWZpbmUgQjQzX05QSFlfU0FNQ19XQ05UCQkJQjQzX1BIWV9OKDB4MUJDKSAvKiBTYW1wbGUgY29sbGVjdCB3YWl0IGNvdW50ZXIgKi8KLSNkZWZpbmUgQjQzX05QSFlfUFRIUk9VR0hfQ05UCQkJQjQzX1BIWV9OKDB4MUJEKSAvKiBQYXNzLXRocm91Z2ggY291bnRlciAqLwotI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRl9HMjBMCQkJQjQzX1BIWV9OKDB4MUM0KSAvKiBMVFJOIG9mZnNldCBnYWluIDIwTCAqLwotI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRl8yMEwJCQlCNDNfUEhZX04oMHgxQzUpIC8qIExUUk4gb2Zmc2V0IDIwTCAqLwotI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRl9HMjBVCQkJQjQzX1BIWV9OKDB4MUM2KSAvKiBMVFJOIG9mZnNldCBnYWluIDIwVSAqLwotI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRl8yMFUJCQlCNDNfUEhZX04oMHgxQzcpIC8qIExUUk4gb2Zmc2V0IDIwVSAqLwotI2RlZmluZSBCNDNfTlBIWV9EU1NTQ0NLX0dBSU5TTAkJCUI0M19QSFlfTigweDFDOCkgLyogRFNTUy9DQ0sgZ2FpbiBzZXR0bGUgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX0dQSU9fTE9PVVQJCQlCNDNfUEhZX04oMHgxQzkpIC8qIEdQSU8gbG93IG91dCAqLwotI2RlZmluZSBCNDNfTlBIWV9HUElPX0hJT1VUCQkJQjQzX1BIWV9OKDB4MUNBKSAvKiBHUElPIGhpZ2ggb3V0ICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU19DSEVDSwkJCUI0M19QSFlfTigweDFDQikgLyogQ1JTIGNoZWNrICovCi0jZGVmaW5lIEI0M19OUEhZX01MX0xPR1NTX1JBVAkJCUI0M19QSFlfTigweDFDQykgLyogTUwvbG9nc3MgcmF0aW8gKi8KLSNkZWZpbmUgQjQzX05QSFlfRFVQU0NBTEUJCQlCNDNfUEhZX04oMHgxQ0QpIC8qIER1cCBzY2FsZSAqLwotI2RlZmluZSBCNDNfTlBIWV9CVzFBCQkJCUI0M19QSFlfTigweDFDRSkgLyogQlcgMUEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQlcyCQkJCUI0M19QSFlfTigweDFDRikgLyogQlcgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9CVzMJCQkJQjQzX1BIWV9OKDB4MUQwKSAvKiBCVyAzICovCi0jZGVmaW5lIEI0M19OUEhZX0JXNAkJCQlCNDNfUEhZX04oMHgxRDEpIC8qIEJXIDQgKi8KLSNkZWZpbmUgQjQzX05QSFlfQlc1CQkJCUI0M19QSFlfTigweDFEMikgLyogQlcgNSAqLwotI2RlZmluZSBCNDNfTlBIWV9CVzYJCQkJQjQzX1BIWV9OKDB4MUQzKSAvKiBCVyA2ICovCi0jZGVmaW5lIEI0M19OUEhZX0NPQUxFTjAJCQlCNDNfUEhZX04oMHgxRDQpIC8qIENvYXJzZSBsZW5ndGggMCAqLwotI2RlZmluZSBCNDNfTlBIWV9DT0FMRU4xCQkJQjQzX1BIWV9OKDB4MUQ1KSAvKiBDb2Fyc2UgbGVuZ3RoIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTVEhSRVNfMVUJCQlCNDNfUEhZX04oMHgxRDYpIC8qIENSUyB0aHJlc2hvbGQgMSBVICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU1RIUkVTXzJVCQkJQjQzX1BIWV9OKDB4MUQ3KSAvKiBDUlMgdGhyZXNob2xkIDIgVSAqLwotI2RlZmluZSBCNDNfTlBIWV9DUlNUSFJFU18zVQkJCUI0M19QSFlfTigweDFEOCkgLyogQ1JTIHRocmVzaG9sZCAzIFUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTQ1RMX1UJCQlCNDNfUEhZX04oMHgxRDkpIC8qIENSUyBjb250cm9sIFUgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTVEhSRVNfMUwJCQlCNDNfUEhZX04oMHgxREEpIC8qIENSUyB0aHJlc2hvbGQgMSBMICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU1RIUkVTXzJMCQkJQjQzX1BIWV9OKDB4MURCKSAvKiBDUlMgdGhyZXNob2xkIDIgTCAqLwotI2RlZmluZSBCNDNfTlBIWV9DUlNUSFJFU18zTAkJCUI0M19QSFlfTigweDFEQykgLyogQ1JTIHRocmVzaG9sZCAzIEwgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTQ1RMX0wJCQlCNDNfUEhZX04oMHgxREQpIC8qIENSUyBjb250cm9sIEwgKi8KLSNkZWZpbmUgQjQzX05QSFlfU1RSQV8xVQkJCUI0M19QSFlfTigweDFERSkgLyogU1RSIGFkZHJlc3MgMSBVICovCi0jZGVmaW5lIEI0M19OUEhZX1NUUkFfMlUJCQlCNDNfUEhZX04oMHgxREYpIC8qIFNUUiBhZGRyZXNzIDIgVSAqLwotI2RlZmluZSBCNDNfTlBIWV9TVFJBXzFMCQkJQjQzX1BIWV9OKDB4MUUwKSAvKiBTVFIgYWRkcmVzcyAxIEwgKi8KLSNkZWZpbmUgQjQzX05QSFlfU1RSQV8yTAkJCUI0M19QSFlfTigweDFFMSkgLyogU1RSIGFkZHJlc3MgMiBMICovCi0jZGVmaW5lIEI0M19OUEhZX0NSU0NIRUNLMQkJCUI0M19QSFlfTigweDFFMikgLyogQ1JTIGNoZWNrIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfQ1JTQ0hFQ0syCQkJQjQzX1BIWV9OKDB4MUUzKSAvKiBDUlMgY2hlY2sgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9DUlNDSEVDSzMJCQlCNDNfUEhZX04oMHgxRTQpIC8qIENSUyBjaGVjayAzICovCi0jZGVmaW5lIEI0M19OUEhZX0pNUFNUUDAJCQlCNDNfUEhZX04oMHgxRTUpIC8qIEp1bXAgc3RlcCAwICovCi0jZGVmaW5lIEI0M19OUEhZX0pNUFNUUDEJCQlCNDNfUEhZX04oMHgxRTYpIC8qIEp1bXAgc3RlcCAxICovCi0jZGVmaW5lIEI0M19OUEhZX1RYUENUTF9DTUQJCQlCNDNfUEhZX04oMHgxRTcpIC8qIFRYIHBvd2VyIGNvbnRyb2wgY29tbWFuZCAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0NNRF9JTklUCQkweDAwN0YgLyogSW5pdCAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0NNRF9JTklUX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfQ01EX0NPRUZGCQkweDIwMDAgLyogUG93ZXIgY29udHJvbCBjb2VmZmljaWVudHMgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9DTURfSFdQQ1RMRU4JCTB4NDAwMCAvKiBIYXJkd2FyZSBUWCBwb3dlciBjb250cm9sIGVuYWJsZSAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0NNRF9QQ1RMRU4JCTB4ODAwMCAvKiBUWCBwb3dlciBjb250cm9sIGVuYWJsZSAqLwotI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfTgkJCUI0M19QSFlfTigweDFFOCkgLyogVFggcG93ZXIgY29udHJvbCBOIG51bSAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX05fVFNTSUQJCTB4MDBGRiAvKiBOIFRTU0kgZGVsYXkgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9OX1RTU0lEX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfTl9OUFRJTDIJCTB4MDcwMCAvKiBOIFBUIGludGVnZXIgbG9nMiAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX05fTlBUSUwyX1NISUZUCQk4Ci0jZGVmaW5lIEI0M19OUEhZX1RYUENUTF9JVFNTSQkJCUI0M19QSFlfTigweDFFOSkgLyogVFggcG93ZXIgY29udHJvbCBpZGxlIFRTU0kgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9JVFNTSV8wCQkweDAwM0YgLyogSWRsZSBUU1NJIDAgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9JVFNTSV8wX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfSVRTU0lfMQkJMHgzRjAwIC8qIElkbGUgVFNTSSAxICovCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfSVRTU0lfMV9TSElGVAkJOAotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0lUU1NJX0JJTkYJCTB4ODAwMCAvKiBSYXcgVFNTSSBvZmZzZXQgYmluIGZvcm1hdCAqLwotI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfVFBXUgkJCUI0M19QSFlfTigweDFFQSkgLyogVFggcG93ZXIgY29udHJvbCB0YXJnZXQgcG93ZXIgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9UUFdSXzAJCQkweDAwRkYgLyogUG93ZXIgMCAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1RQV1JfMF9TSElGVAkJMAotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1RQV1JfMQkJCTB4RkYwMCAvKiBQb3dlciAxICovCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfVFBXUl8xX1NISUZUCQk4Ci0jZGVmaW5lIEI0M19OUEhZX1RYUENUTF9CSURYCQkJQjQzX1BIWV9OKDB4MUVCKSAvKiBUWCBwb3dlciBjb250cm9sIGJhc2UgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9CSURYXzAJCQkweDAwN0YgLyogdUMgYmFzZSBpbmRleCAwICovCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfQklEWF8wX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfQklEWF8xCQkJMHg3RjAwIC8qIHVDIGJhc2UgaW5kZXggMSAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0JJRFhfMV9TSElGVAkJOAotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0JJRFhfTE9BRAkJMHg4MDAwIC8qIExvYWQgYmFzZSBpbmRleCAqLwotI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfUElEWAkJCUI0M19QSFlfTigweDFFQykgLyogVFggcG93ZXIgY29udHJvbCBwb3dlciBpbmRleCAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1BJRFhfMAkJCTB4MDA3RiAvKiB1QyBwb3dlciBpbmRleCAwICovCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfUElEWF8wX1NISUZUCQkwCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfUElEWF8xCQkJMHg3RjAwIC8qIHVDIHBvd2VyIGluZGV4IDEgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9QSURYXzFfU0hJRlQJCTgKLSNkZWZpbmUgQjQzX05QSFlfQzFfVFhQQ1RMX1NUQVQJCQlCNDNfUEhZX04oMHgxRUQpIC8qIENvcmUgMSBUWCBwb3dlciBjb250cm9sIHN0YXR1cyAqLwotI2RlZmluZSBCNDNfTlBIWV9DMl9UWFBDVExfU1RBVAkJCUI0M19QSFlfTigweDFFRSkgLyogQ29yZSAyIFRYIHBvd2VyIGNvbnRyb2wgc3RhdHVzICovCi0jZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfU1RBVF9FU1QJCTB4MDBGRiAvKiBFc3RpbWF0ZWQgcG93ZXIgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9TVEFUX0VTVF9TSElGVAkJMAotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1NUQVRfQklEWAkJMHg3RjAwIC8qIEJhc2UgaW5kZXggKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9TVEFUX0JJRFhfU0hJRlQJOAotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1NUQVRfRVNUVkFMSUQJCTB4ODAwMCAvKiBFc3RpbWF0ZWQgcG93ZXIgdmFsaWQgKi8KLSNkZWZpbmUgQjQzX05QSFlfU01BTExTR1NfTEVOCQkJQjQzX1BIWV9OKDB4MUVGKSAvKiBTbWFsbCBzaWcgZ2FpbiBzZXR0bGUgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX1BIWVNUQVRfR0FJTjAJCQlCNDNfUEhZX04oMHgxRjApIC8qIFBIWSBzdGF0cyBnYWluIGluZm8gMCAqLwotI2RlZmluZSBCNDNfTlBIWV9QSFlTVEFUX0dBSU4xCQkJQjQzX1BIWV9OKDB4MUYxKSAvKiBQSFkgc3RhdHMgZ2FpbiBpbmZvIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEhZU1RBVF9GUkVRRVNUCQlCNDNfUEhZX04oMHgxRjIpIC8qIFBIWSBzdGF0cyBmcmVxdWVuY3kgZXN0aW1hdGUgKi8KLSNkZWZpbmUgQjQzX05QSFlfUEhZU1RBVF9BRFZSRVQJCQlCNDNfUEhZX04oMHgxRjMpIC8qIFBIWSBzdGF0cyBBRFYgcmV0YXJkICovCi0jZGVmaW5lIEI0M19OUEhZX1BIWUxCX01PREUJCQlCNDNfUEhZX04oMHgxRjQpIC8qIFBIWSBsb29wYmFjayBtb2RlICovCi0jZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDIwXzEJCQlCNDNfUEhZX04oMHgxRjUpIC8qIFRvbmUgbWFwIGluZGV4IDIwLzEgKi8KLSNkZWZpbmUgQjQzX05QSFlfVE9ORV9NSURYMjBfMgkJCUI0M19QSFlfTigweDFGNikgLyogVG9uZSBtYXAgaW5kZXggMjAvMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFgyMF8zCQkJQjQzX1BIWV9OKDB4MUY3KSAvKiBUb25lIG1hcCBpbmRleCAyMC8zICovCi0jZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDQwXzEJCQlCNDNfUEhZX04oMHgxRjgpIC8qIFRvbmUgbWFwIGluZGV4IDQwLzEgKi8KLSNkZWZpbmUgQjQzX05QSFlfVE9ORV9NSURYNDBfMgkJCUI0M19QSFlfTigweDFGOSkgLyogVG9uZSBtYXAgaW5kZXggNDAvMiAqLwotI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFg0MF8zCQkJQjQzX1BIWV9OKDB4MUZBKSAvKiBUb25lIG1hcCBpbmRleCA0MC8zICovCi0jZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDQwXzQJCQlCNDNfUEhZX04oMHgxRkIpIC8qIFRvbmUgbWFwIGluZGV4IDQwLzQgKi8KLSNkZWZpbmUgQjQzX05QSFlfUElMVE9ORV9NSURYMQkJCUI0M19QSFlfTigweDFGQykgLyogUGlsb3QgdG9uZSBtYXAgaW5kZXggMSAqLwotI2RlZmluZSBCNDNfTlBIWV9QSUxUT05FX01JRFgyCQkJQjQzX1BIWV9OKDB4MUZEKSAvKiBQaWxvdCB0b25lIG1hcCBpbmRleCAyICovCi0jZGVmaW5lIEI0M19OUEhZX1BJTFRPTkVfTUlEWDMJCQlCNDNfUEhZX04oMHgxRkUpIC8qIFBpbG90IHRvbmUgbWFwIGluZGV4IDMgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhSSUZTX0ZSREVMCQkJQjQzX1BIWV9OKDB4MUZGKSAvKiBUWCBSSUZTIGZyYW1lIGRlbGF5ICovCi0jZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9SWDJUWF9QVURfNDBNCQlCNDNfUEhZX04oMHgyMDApIC8qIEFGRSBzZXEgcngydHggcG93ZXIgdXAvZG93biBkZWxheSA0ME0gKi8KLSNkZWZpbmUgQjQzX05QSFlfQUZFU0VRX1RYMlJYX1BVRF80ME0JCUI0M19QSFlfTigweDIwMSkgLyogQUZFIHNlcSB0eDJyeCBwb3dlciB1cC9kb3duIGRlbGF5IDQwTSAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVTRVFfUlgyVFhfUFVEXzIwTQkJQjQzX1BIWV9OKDB4MjAyKSAvKiBBRkUgc2VxIHJ4MnR4IHBvd2VyIHVwL2Rvd24gZGVsYXkgMjBNICovCi0jZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfMjBNCQlCNDNfUEhZX04oMHgyMDMpIC8qIEFGRSBzZXEgdHgycnggcG93ZXIgdXAvZG93biBkZWxheSAyME0gKi8KLSNkZWZpbmUgQjQzX05QSFlfUlhfU0lHQ1RMCQkJQjQzX1BIWV9OKDB4MjA0KSAvKiBSWCBzaWduYWwgY29udHJvbCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWFBJTF9DWUNOVDAJCQlCNDNfUEhZX04oMHgyMDUpIC8qIFJYIHBpbG90IGN5Y2xlIGNvdW50ZXIgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9SWFBJTF9DWUNOVDEJCQlCNDNfUEhZX04oMHgyMDYpIC8qIFJYIHBpbG90IGN5Y2xlIGNvdW50ZXIgMSAqLwotI2RlZmluZSBCNDNfTlBIWV9SWFBJTF9DWUNOVDIJCQlCNDNfUEhZX04oMHgyMDcpIC8qIFJYIHBpbG90IGN5Y2xlIGNvdW50ZXIgMiAqLwotI2RlZmluZSBCNDNfTlBIWV9BRkVTRVFfUlgyVFhfUFVEXzEwTQkJQjQzX1BIWV9OKDB4MjA4KSAvKiBBRkUgc2VxIHJ4MnR4IHBvd2VyIHVwL2Rvd24gZGVsYXkgMTBNICovCi0jZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfMTBNCQlCNDNfUEhZX04oMHgyMDkpIC8qIEFGRSBzZXEgdHgycnggcG93ZXIgdXAvZG93biBkZWxheSAxME0gKi8KLSNkZWZpbmUgQjQzX05QSFlfRFNTU0NDS19DUlNFWFRMCQlCNDNfUEhZX04oMHgyMEEpIC8qIERTU1MvQ0NLIENSUyBleHRlbnNpb24gbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX01MX0xPR1NTX1JBVFNMT1BFCQlCNDNfUEhZX04oMHgyMEIpIC8qIE1ML2xvZ3NzIHJhdGlvIHNsb3BlICovCi0jZGVmaW5lIEI0M19OUEhZX1JJRlNfU1JDVEwJCQlCNDNfUEhZX04oMHgyMEMpIC8qIFJJRlMgc2VhcmNoIHRpbWVvdXQgbGVuZ3RoICovCi0jZGVmaW5lIEI0M19OUEhZX1RYUkVBTEZECQkJQjQzX1BIWV9OKDB4MjBEKSAvKiBUWCByZWFsIGZyYW1lIGRlbGF5ICovCi0jZGVmaW5lIEI0M19OUEhZX0hQQU5UX1NXVEhSRVMJCQlCNDNfUEhZX04oMHgyMEUpIC8qIEhpZ2ggcG93ZXIgYW50ZW5uYSBzd2l0Y2ggdGhyZXNob2xkICovCi0jZGVmaW5lIEI0M19OUEhZX0VEQ1JTX0FTU1RIUkVTMAkJQjQzX1BIWV9OKDB4MjEwKSAvKiBFRCBDUlMgYXNzZXJ0IHRocmVzaG9sZCAwICovCi0jZGVmaW5lIEI0M19OUEhZX0VEQ1JTX0FTU1RIUkVTMQkJQjQzX1BIWV9OKDB4MjExKSAvKiBFRCBDUlMgYXNzZXJ0IHRocmVzaG9sZCAxICovCi0jZGVmaW5lIEI0M19OUEhZX0VEQ1JTX0RFQVNTVEhSRVMwCQlCNDNfUEhZX04oMHgyMTIpIC8qIEVEIENSUyBkZWFzc2VydCB0aHJlc2hvbGQgMCAqLwotI2RlZmluZSBCNDNfTlBIWV9FRENSU19ERUFTU1RIUkVTMQkJQjQzX1BIWV9OKDB4MjEzKSAvKiBFRCBDUlMgZGVhc3NlcnQgdGhyZXNob2xkIDEgKi8KLSNkZWZpbmUgQjQzX05QSFlfU1RSX1dUSU1FMjBVCQkJQjQzX1BIWV9OKDB4MjE0KSAvKiBTVFIgd2FpdCB0aW1lIDIwVSAqLwotI2RlZmluZSBCNDNfTlBIWV9TVFJfV1RJTUUyMEwJCQlCNDNfUEhZX04oMHgyMTUpIC8qIFNUUiB3YWl0IHRpbWUgMjBMICovCi0jZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDY1N00JCQlCNDNfUEhZX04oMHgyMTYpIC8qIFRvbmUgbWFwIGluZGV4IDY1N00gKi8KLSNkZWZpbmUgQjQzX05QSFlfSFRTSUdUT05FUwkJCUI0M19QSFlfTigweDIxNykgLyogSFQgc2lnbmFsIHRvbmVzICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0kxCQkJCUI0M19QSFlfTigweDIxOSkgLyogUlNTSSB2YWx1ZSAxICovCi0jZGVmaW5lIEI0M19OUEhZX1JTU0kyCQkJCUI0M19QSFlfTigweDIxQSkgLyogUlNTSSB2YWx1ZSAyICovCi0jZGVmaW5lIEI0M19OUEhZX0NIQU5fRVNUSEFORwkJCUI0M19QSFlfTigweDIxRCkgLyogQ2hhbm5lbCBlc3RpbWF0ZSBoYW5nICovCi0jZGVmaW5lIEI0M19OUEhZX0ZJTkVSWDJfQ0dDCQkJQjQzX1BIWV9OKDB4MjIxKSAvKiBGaW5lIFJYIDIgY2xvY2sgZ2F0ZSBjb250cm9sICovCi0jZGVmaW5lICBCNDNfTlBIWV9GSU5FUlgyX0NHQ19ERUNHQwkJMHgwMDA4IC8qIERlY29kZSBnYXRlZCBjbG9ja3MgKi8KLSNkZWZpbmUgQjQzX05QSFlfVFhQQ1RMX0lOSVQJCQlCNDNfUEhZX04oMHgyMjIpIC8qIFRYIHBvd2VyIGNvbnRyb2xsIGluaXQgKi8KLSNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9JTklUX1BJRFhJMQkJMHgwMEZGIC8qIFBvd2VyIGluZGV4IGluaXQgMSAqLwotI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0lOSVRfUElEWEkxX1NISUZUCTAKLQotCi0KLS8qIEJyb2FkY29tIDIwNTUgcmFkaW8gcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgQjIwNTVfR0VOX1NQQVJFCQkJMHgwMCAvKiBHRU4gc3BhcmUgKi8KLSNkZWZpbmUgQjIwNTVfU1BfUElOUEQJCQkweDAyIC8qIFNQIFBJTiBQRCAqLwotI2RlZmluZSBCMjA1NV9DMV9TUF9SU1NJCQkweDAzIC8qIFNQIFJTU0kgQ29yZSAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1NQX1BETUlTQwkJMHgwNCAvKiBTUCBQRCBNSVNDIENvcmUgMSAqLwotI2RlZmluZSBCMjA1NV9DMl9TUF9SU1NJCQkweDA1IC8qIFNQIFJTU0kgQ29yZSAyICovCi0jZGVmaW5lIEIyMDU1X0MyX1NQX1BETUlTQwkJMHgwNiAvKiBTUCBQRCBNSVNDIENvcmUgMiAqLwotI2RlZmluZSBCMjA1NV9DMV9TUF9SWEdDMQkJMHgwNyAvKiBTUCBSWCBHQzEgQ29yZSAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1NQX1JYR0MyCQkweDA4IC8qIFNQIFJYIEdDMiBDb3JlIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfU1BfUlhHQzEJCTB4MDkgLyogU1AgUlggR0MxIENvcmUgMiAqLwotI2RlZmluZSBCMjA1NV9DMl9TUF9SWEdDMgkJMHgwQSAvKiBTUCBSWCBHQzIgQ29yZSAyICovCi0jZGVmaW5lIEIyMDU1X0MxX1NQX0xQRkJXU0VMCQkweDBCIC8qIFNQIExQRiBCVyBzZWxlY3QgQ29yZSAxICovCi0jZGVmaW5lIEIyMDU1X0MyX1NQX0xQRkJXU0VMCQkweDBDIC8qIFNQIExQRiBCVyBzZWxlY3QgQ29yZSAyICovCi0jZGVmaW5lIEIyMDU1X0MxX1NQX1RYR0MxCQkweDBEIC8qIFNQIFRYIEdDMSBDb3JlIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzFfU1BfVFhHQzIJCTB4MEUgLyogU1AgVFggR0MyIENvcmUgMSAqLwotI2RlZmluZSBCMjA1NV9DMl9TUF9UWEdDMQkJMHgwRiAvKiBTUCBUWCBHQzEgQ29yZSAyICovCi0jZGVmaW5lIEIyMDU1X0MyX1NQX1RYR0MyCQkweDEwIC8qIFNQIFRYIEdDMiBDb3JlIDIgKi8KLSNkZWZpbmUgQjIwNTVfTUFTVEVSMQkJCTB4MTEgLyogTWFzdGVyIGNvbnRyb2wgMSAqLwotI2RlZmluZSBCMjA1NV9NQVNURVIyCQkJMHgxMiAvKiBNYXN0ZXIgY29udHJvbCAyICovCi0jZGVmaW5lIEIyMDU1X1BEX0xHRU4JCQkweDEzIC8qIFBEIExHRU4gKi8KLSNkZWZpbmUgQjIwNTVfUERfUExMVFMJCQkweDE0IC8qIFBEIFBMTCBUUyAqLwotI2RlZmluZSBCMjA1NV9DMV9QRF9MR0JVRgkJMHgxNSAvKiBQRCBDb3JlIDEgTEdCVUYgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUERfVFgJCQkweDE2IC8qIFBEIENvcmUgMSBUWCAqLwotI2RlZmluZSBCMjA1NV9DMV9QRF9SWFRYCQkweDE3IC8qIFBEIENvcmUgMSBSWFRYICovCi0jZGVmaW5lIEIyMDU1X0MxX1BEX1JTU0lNSVNDCQkweDE4IC8qIFBEIENvcmUgMSBSU1NJIE1JU0MgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUERfTEdCVUYJCTB4MTkgLyogUEQgQ29yZSAyIExHQlVGICovCi0jZGVmaW5lIEIyMDU1X0MyX1BEX1RYCQkJMHgxQSAvKiBQRCBDb3JlIDIgVFggKi8KLSNkZWZpbmUgQjIwNTVfQzJfUERfUlhUWAkJMHgxQiAvKiBQRCBDb3JlIDIgUlhUWCAqLwotI2RlZmluZSBCMjA1NV9DMl9QRF9SU1NJTUlTQwkJMHgxQyAvKiBQRCBDb3JlIDIgUlNTSSBNSVNDICovCi0jZGVmaW5lIEIyMDU1X1BXUkRFVF9MR0VOCQkweDFEIC8qIFBXUkRFVCBMR0VOICovCi0jZGVmaW5lIEIyMDU1X0MxX1BXUkRFVF9MR0JVRgkJMHgxRSAvKiBQV1JERVQgTEdCVUYgQ29yZSAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1BXUkRFVF9SWFRYCQkweDFGIC8qIFBXUkRFVCBSWFRYIENvcmUgMSAqLwotI2RlZmluZSBCMjA1NV9DMl9QV1JERVRfTEdCVUYJCTB4MjAgLyogUFdSREVUIExHQlVGIENvcmUgMiAqLwotI2RlZmluZSBCMjA1NV9DMl9QV1JERVRfUlhUWAkJMHgyMSAvKiBQV1JERVQgUlhUWCBDb3JlIDIgKi8KLSNkZWZpbmUgQjIwNTVfUlJDQ0FMX0NTCQkJMHgyMiAvKiBSUkNDQUwgQ29udHJvbCBzcGFyZSAqLwotI2RlZmluZSBCMjA1NV9SUkNDQUxfTk9QVFNFTAkJMHgyMyAvKiBSUkNDQUwgTiBPUFQgU0VMICovCi0jZGVmaW5lIEIyMDU1X0NBTF9NSVNDCQkJMHgyNCAvKiBDQUwgTUlTQyAqLwotI2RlZmluZSBCMjA1NV9DQUxfQ09VVAkJCTB4MjUgLyogQ0FMIENvdW50ZXIgb3V0ICovCi0jZGVmaW5lIEIyMDU1X0NBTF9DT1VUMgkJCTB4MjYgLyogQ0FMIENvdW50ZXIgb3V0IDIgKi8KLSNkZWZpbmUgQjIwNTVfQ0FMX0NWQVJDVEwJCTB4MjcgLyogQ0FMIENWQVIgQ29udHJvbCAqLwotI2RlZmluZSBCMjA1NV9DQUxfUlZBUkNUTAkJMHgyOCAvKiBDQUwgUlZBUiBDb250cm9sICovCi0jZGVmaW5lIEIyMDU1X0NBTF9MUE9DVEwJCTB4MjkgLyogQ0FMIExQTyBDb250cm9sICovCi0jZGVmaW5lIEIyMDU1X0NBTF9UUwkJCTB4MkEgLyogQ0FMIFRTICovCi0jZGVmaW5lIEIyMDU1X0NBTF9SQ0NBTFJUUwkJMHgyQiAvKiBDQUwgUkNDQUwgUkVBRCBUUyAqLwotI2RlZmluZSBCMjA1NV9DQUxfUkNBTFJUUwkJMHgyQyAvKiBDQUwgUkNBTCBSRUFEIFRTICovCi0jZGVmaW5lIEIyMDU1X1BBRERSVgkJCTB4MkQgLyogUEFEIGRyaXZlciAqLwotI2RlZmluZSBCMjA1NV9YT0NUTDEJCQkweDJFIC8qIFhPIENvbnRyb2wgMSAqLwotI2RlZmluZSBCMjA1NV9YT0NUTDIJCQkweDJGIC8qIFhPIENvbnRyb2wgMiAqLwotI2RlZmluZSBCMjA1NV9YT1JFR1VMCQkJMHgzMCAvKiBYTyBSZWd1bGF0b3IgKi8KLSNkZWZpbmUgQjIwNTVfWE9NSVNDCQkJMHgzMSAvKiBYTyBtaXNjICovCi0jZGVmaW5lIEIyMDU1X1BMTF9MRkMxCQkJMHgzMiAvKiBQTEwgTEYgQzEgKi8KLSNkZWZpbmUgQjIwNTVfUExMX0NBTFZUSAkJMHgzMyAvKiBQTEwgQ0FMIFZUSCAqLwotI2RlZmluZSBCMjA1NV9QTExfTEZDMgkJCTB4MzQgLyogUExMIExGIEMyICovCi0jZGVmaW5lIEIyMDU1X1BMTF9SRUYJCQkweDM1IC8qIFBMTCByZWZlcmVuY2UgKi8KLSNkZWZpbmUgQjIwNTVfUExMX0xGUjEJCQkweDM2IC8qIFBMTCBMRiBSMSAqLwotI2RlZmluZSBCMjA1NV9QTExfUEZEQ1AJCQkweDM3IC8qIFBMTCBQRkQgQ1AgKi8KLSNkZWZpbmUgQjIwNTVfUExMX0lEQUNfQ1BPUEFNUAkJMHgzOCAvKiBQTEwgSURBQyBDUE9QQU1QICovCi0jZGVmaW5lIEIyMDU1X1BMTF9DUFJFRwkJCTB4MzkgLyogUExMIENQIFJlZ3VsYXRvciAqLwotI2RlZmluZSBCMjA1NV9QTExfUkNBTAkJCTB4M0EgLyogUExMIFJDQUwgKi8KLSNkZWZpbmUgQjIwNTVfUkZfUExMTU9EMAkJMHgzQiAvKiBSRiBQTEwgTU9EMCAqLwotI2RlZmluZSBCMjA1NV9SRl9QTExNT0QxCQkweDNDIC8qIFJGIFBMTCBNT0QxICovCi0jZGVmaW5lIEIyMDU1X1JGX01NRElEQUMxCQkweDNEIC8qIFJGIE1NRCBJREFDIDEgKi8KLSNkZWZpbmUgQjIwNTVfUkZfTU1ESURBQzAJCTB4M0UgLyogUkYgTU1EIElEQUMgMCAqLwotI2RlZmluZSBCMjA1NV9SRl9NTURTUAkJCTB4M0YgLyogUkYgTU1EIHNwYXJlICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUwxCQkJMHg0MCAvKiBWQ08gY2FsIDEgKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBTDIJCQkweDQxIC8qIFZDTyBjYWwgMiAqLwotI2RlZmluZSBCMjA1NV9WQ09fQ0FMMwkJCTB4NDIgLyogVkNPIGNhbCAzICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUw0CQkJMHg0MyAvKiBWQ08gY2FsIDQgKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBTDUJCQkweDQ0IC8qIFZDTyBjYWwgNSAqLwotI2RlZmluZSBCMjA1NV9WQ09fQ0FMNgkJCTB4NDUgLyogVkNPIGNhbCA2ICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUw3CQkJMHg0NiAvKiBWQ08gY2FsIDcgKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBTDgJCQkweDQ3IC8qIFZDTyBjYWwgOCAqLwotI2RlZmluZSBCMjA1NV9WQ09fQ0FMOQkJCTB4NDggLyogVkNPIGNhbCA5ICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUwxMAkJCTB4NDkgLyogVkNPIGNhbCAxMCAqLwotI2RlZmluZSBCMjA1NV9WQ09fQ0FMMTEJCQkweDRBIC8qIFZDTyBjYWwgMTEgKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBTDEyCQkJMHg0QiAvKiBWQ08gY2FsIDEyICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUwxMwkJCTB4NEMgLyogVkNPIGNhbCAxMyAqLwotI2RlZmluZSBCMjA1NV9WQ09fQ0FMMTQJCQkweDREIC8qIFZDTyBjYWwgMTQgKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBTDE1CQkJMHg0RSAvKiBWQ08gY2FsIDE1ICovCi0jZGVmaW5lIEIyMDU1X1ZDT19DQUwxNgkJCTB4NEYgLyogVkNPIGNhbCAxNiAqLwotI2RlZmluZSBCMjA1NV9WQ09fS1ZDTwkJCTB4NTAgLyogVkNPIEtWQ08gKi8KLSNkZWZpbmUgQjIwNTVfVkNPX0NBUFRBSUwJCTB4NTEgLyogVkNPIENBUCBUQUlMICovCi0jZGVmaW5lIEIyMDU1X1ZDT19JREFDVkNPCQkweDUyIC8qIFZDTyBJREFDIFZDTyAqLwotI2RlZmluZSBCMjA1NV9WQ09fUkVHCQkJMHg1MyAvKiBWQ08gUmVndWxhdG9yICovCi0jZGVmaW5lIEIyMDU1X1BMTF9SRlZUSAkJCTB4NTQgLyogUExMIFJGIFZUSCAqLwotI2RlZmluZSBCMjA1NV9MR0JVRl9DRU5CVUYJCTB4NTUgLyogTEdCVUYgQ0VOIEJVRiAqLwotI2RlZmluZSBCMjA1NV9MR0VOX1RVTkUxCQkweDU2IC8qIExHRU4gdHVuZSAxICovCi0jZGVmaW5lIEIyMDU1X0xHRU5fVFVORTIJCTB4NTcgLyogTEdFTiB0dW5lIDIgKi8KLSNkZWZpbmUgQjIwNTVfTEdFTl9JREFDMQkJMHg1OCAvKiBMR0VOIElEQUMgMSAqLwotI2RlZmluZSBCMjA1NV9MR0VOX0lEQUMyCQkweDU5IC8qIExHRU4gSURBQyAyICovCi0jZGVmaW5lIEIyMDU1X0xHRU5fQklBU0MJCTB4NUEgLyogTEdFTiBCSUFTIGNvdW50ZXIgKi8KLSNkZWZpbmUgQjIwNTVfTEdFTl9CSUFTSURBQwkJMHg1QiAvKiBMR0VOIEJJQVMgSURBQyAqLwotI2RlZmluZSBCMjA1NV9MR0VOX1JDQUwJCQkweDVDIC8qIExHRU4gUkNBTCAqLwotI2RlZmluZSBCMjA1NV9MR0VOX0RJVgkJCTB4NUQgLyogTEdFTiBkaXYgKi8KLSNkZWZpbmUgQjIwNTVfTEdFTl9TUEFSRTIJCTB4NUUgLyogTEdFTiBzcGFyZSAyICovCi0jZGVmaW5lIEIyMDU1X0MxX0xHQlVGX0FUVU5FCQkweDVGIC8qIENvcmUgMSBMR0JVRiBBIHR1bmUgKi8KLSNkZWZpbmUgQjIwNTVfQzFfTEdCVUZfR1RVTkUJCTB4NjAgLyogQ29yZSAxIExHQlVGIEcgdHVuZSAqLwotI2RlZmluZSBCMjA1NV9DMV9MR0JVRl9ESVYJCTB4NjEgLyogQ29yZSAxIExHQlVGIGRpdiAqLwotI2RlZmluZSBCMjA1NV9DMV9MR0JVRl9BSURBQwkJMHg2MiAvKiBDb3JlIDEgTEdCVUYgQSBJREFDICovCi0jZGVmaW5lIEIyMDU1X0MxX0xHQlVGX0dJREFDCQkweDYzIC8qIENvcmUgMSBMR0JVRiBHIElEQUMgKi8KLSNkZWZpbmUgQjIwNTVfQzFfTEdCVUZfSURBQ0ZPCQkweDY0IC8qIENvcmUgMSBMR0JVRiBJREFDIGZpbHRlciBvdmVycmlkZSAqLwotI2RlZmluZSBCMjA1NV9DMV9MR0JVRl9TUEFSRQkJMHg2NSAvKiBDb3JlIDEgTEdCVUYgc3BhcmUgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfUkZTUEMxCQkweDY2IC8qIENvcmUgMSBSWCBSRiBTUEMxICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX1JGUjEJCTB4NjcgLyogQ29yZSAxIFJYIFJGIHJlZyAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX1JGUjIJCTB4NjggLyogQ29yZSAxIFJYIFJGIHJlZyAyICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX1JGUkNBTAkJMHg2OSAvKiBDb3JlIDEgUlggUkYgUkNBTCAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9CTENNUAkJMHg2QSAvKiBDb3JlIDEgUlggQmFzZWJhbmQgQlVGSSBMUEYgQ01QICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX0JCX0xQRgkJMHg2QiAvKiBDb3JlIDEgUlggQmFzZWJhbmQgTFBGICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX0JCX01JREFDSFAJCTB4NkMgLyogQ29yZSAxIFJYIEJhc2ViYW5kIE1JREFDIEhpZ2gtcGFzcyAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9WR0ExSURBQwkJMHg2RCAvKiBDb3JlIDEgUlggQmFzZWJhbmQgVkdBMSBJREFDICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1ZHQTJJREFDCQkweDZFIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBWR0EyIElEQUMgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfVkdBM0lEQUMJCTB4NkYgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFZHQTMgSURBQyAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9CVUZPQ1RMCQkweDcwIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBCVUZPIENvbnRyb2wgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfUkNDQUxDVEwJCTB4NzEgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFJDQ0FMIENvbnRyb2wgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfUlNTSUNUTDEJCTB4NzIgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1JTU0lDVEwyCQkweDczIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgMiAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9SU1NJQ1RMMwkJMHg3NCAvKiBDb3JlIDEgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDMgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfUlNTSUNUTDQJCTB4NzUgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCA0ICovCi0jZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1JTU0lDVEw1CQkweDc2IC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgNSAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9SRUcJCTB4NzcgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFJlZ3VsYXRvciAqLwotI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9TUEFSRTEJCTB4NzggLyogQ29yZSAxIFJYIEJhc2ViYW5kIHNwYXJlIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzFfUlhfVFhCQlJDQUwJCTB4NzkgLyogQ29yZSAxIFJYIFRYIEJCIFJDQUwgKi8KLSNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfU1BHQQkJMHg3QSAvKiBDb3JlIDEgVFggUkYgU0dNIFBHQSAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9TUEFECQkweDdCIC8qIENvcmUgMSBUWCBSRiBTR00gUEFEICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX1JGX0NOVFBHQTEJCTB4N0MgLyogQ29yZSAxIFRYIFJGIGNvdW50ZXIgUEdBIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfQ05UUEFEMQkJMHg3RCAvKiBDb3JlIDEgVFggUkYgY291bnRlciBQQUQgMSAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9QR0FJREFDCQkweDdFIC8qIENvcmUgMSBUWCBSRiBQR0EgSURBQyAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9QR0FQQURUTgkJMHg3RiAvKiBDb3JlIDEgVFggUEdBIFBBRCBUTiAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9QQURJREFDMQkJMHg4MCAvKiBDb3JlIDEgVFggUEFEIElEQUMgMSAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9QQURJREFDMgkJMHg4MSAvKiBDb3JlIDEgVFggUEFEIElEQUMgMiAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9NWEJHVFJJTQkJMHg4MiAvKiBDb3JlIDEgVFggTVggQi9HIFRSSU0gKi8KLSNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfUkNBTAkJMHg4MyAvKiBDb3JlIDEgVFggUkYgUkNBTCAqLwotI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9QQURUU1NJMQkJMHg4NCAvKiBDb3JlIDEgVFggUkYgUEFEIFRTU0kxICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX1JGX1BBRFRTU0kyCQkweDg1IC8qIENvcmUgMSBUWCBSRiBQQUQgVFNTSTIgKi8KLSNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfU1BBUkUJCTB4ODYgLyogQ29yZSAxIFRYIFJGIHNwYXJlICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX1JGX0lRQ0FMMQkJMHg4NyAvKiBDb3JlIDEgVFggUkYgSS9RIENBTCAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX1JGX0lRQ0FMMgkJMHg4OCAvKiBDb3JlIDEgVFggUkYgSS9RIENBTCAyICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYQkJfUkNDQUwJCTB4ODkgLyogQ29yZSAxIFRYQkIgUkMgQ0FMIENvbnRyb2wgKi8KLSNkZWZpbmUgQjIwNTVfQzFfVFhCQl9MUEYxCQkweDhBIC8qIENvcmUgMSBUWEJCIExQRiAxICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX1ZPU0NOQ0wJCTB4OEIgLyogQ29yZSAxIFRYIFZPUyBDTkNMICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX0xQRl9NWEdNSURBQwkweDhDIC8qIENvcmUgMSBUWCBMUEYgTVhHTSBJREFDICovCi0jZGVmaW5lIEIyMDU1X0MxX1RYX0JCX01YR00JCTB4OEQgLyogQ29yZSAxIFRYIEJCIE1YR00gKi8KLSNkZWZpbmUgQjIwNTVfQzJfTEdCVUZfQVRVTkUJCTB4OEUgLyogQ29yZSAyIExHQlVGIEEgdHVuZSAqLwotI2RlZmluZSBCMjA1NV9DMl9MR0JVRl9HVFVORQkJMHg4RiAvKiBDb3JlIDIgTEdCVUYgRyB0dW5lICovCi0jZGVmaW5lIEIyMDU1X0MyX0xHQlVGX0RJVgkJMHg5MCAvKiBDb3JlIDIgTEdCVUYgZGl2ICovCi0jZGVmaW5lIEIyMDU1X0MyX0xHQlVGX0FJREFDCQkweDkxIC8qIENvcmUgMiBMR0JVRiBBIElEQUMgKi8KLSNkZWZpbmUgQjIwNTVfQzJfTEdCVUZfR0lEQUMJCTB4OTIgLyogQ29yZSAyIExHQlVGIEcgSURBQyAqLwotI2RlZmluZSBCMjA1NV9DMl9MR0JVRl9JREFDRk8JCTB4OTMgLyogQ29yZSAyIExHQlVGIElEQUMgZmlsdGVyIG92ZXJyaWRlICovCi0jZGVmaW5lIEIyMDU1X0MyX0xHQlVGX1NQQVJFCQkweDk0IC8qIENvcmUgMiBMR0JVRiBzcGFyZSAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9SRlNQQzEJCTB4OTUgLyogQ29yZSAyIFJYIFJGIFNQQzEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfUkZSMQkJMHg5NiAvKiBDb3JlIDIgUlggUkYgcmVnIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfUkZSMgkJMHg5NyAvKiBDb3JlIDIgUlggUkYgcmVnIDIgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfUkZSQ0FMCQkweDk4IC8qIENvcmUgMiBSWCBSRiBSQ0FMICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX0JMQ01QCQkweDk5IC8qIENvcmUgMiBSWCBCYXNlYmFuZCBCVUZJIExQRiBDTVAgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfTFBGCQkweDlBIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBMUEYgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfTUlEQUNIUAkJMHg5QiAvKiBDb3JlIDIgUlggQmFzZWJhbmQgTUlEQUMgSGlnaC1wYXNzICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1ZHQTFJREFDCQkweDlDIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBWR0ExIElEQUMgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfVkdBMklEQUMJCTB4OUQgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFZHQTIgSURBQyAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9WR0EzSURBQwkJMHg5RSAvKiBDb3JlIDIgUlggQmFzZWJhbmQgVkdBMyBJREFDICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX0JVRk9DVEwJCTB4OUYgLyogQ29yZSAyIFJYIEJhc2ViYW5kIEJVRk8gQ29udHJvbCAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9SQ0NBTENUTAkJMHhBMCAvKiBDb3JlIDIgUlggQmFzZWJhbmQgUkNDQUwgQ29udHJvbCAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9SU1NJQ1RMMQkJMHhBMSAvKiBDb3JlIDIgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfUlNTSUNUTDIJCTB4QTIgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCAyICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1JTU0lDVEwzCQkweEEzIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgMyAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9SU1NJQ1RMNAkJMHhBNCAvKiBDb3JlIDIgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDQgKi8KLSNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfUlNTSUNUTDUJCTB4QTUgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCA1ICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1JFRwkJMHhBNiAvKiBDb3JlIDIgUlggQmFzZWJhbmQgUmVndWxhdG9yICovCi0jZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1NQQVJFMQkJMHhBNyAvKiBDb3JlIDIgUlggQmFzZWJhbmQgc3BhcmUgMSAqLwotI2RlZmluZSBCMjA1NV9DMl9SWF9UWEJCUkNBTAkJMHhBOCAvKiBDb3JlIDIgUlggVFggQkIgUkNBTCAqLwotI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9TUEdBCQkweEE5IC8qIENvcmUgMiBUWCBSRiBTR00gUEdBICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1JGX1NQQUQJCTB4QUEgLyogQ29yZSAyIFRYIFJGIFNHTSBQQUQgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfQ05UUEdBMQkJMHhBQiAvKiBDb3JlIDIgVFggUkYgY291bnRlciBQR0EgMSAqLwotI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9DTlRQQUQxCQkweEFDIC8qIENvcmUgMiBUWCBSRiBjb3VudGVyIFBBRCAxICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1JGX1BHQUlEQUMJCTB4QUQgLyogQ29yZSAyIFRYIFJGIFBHQSBJREFDICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1BHQVBBRFROCQkweEFFIC8qIENvcmUgMiBUWCBQR0EgUEFEIFROICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1BBRElEQUMxCQkweEFGIC8qIENvcmUgMiBUWCBQQUQgSURBQyAxICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1BBRElEQUMyCQkweEIwIC8qIENvcmUgMiBUWCBQQUQgSURBQyAyICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX01YQkdUUklNCQkweEIxIC8qIENvcmUgMiBUWCBNWCBCL0cgVFJJTSAqLwotI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9SQ0FMCQkweEIyIC8qIENvcmUgMiBUWCBSRiBSQ0FMICovCi0jZGVmaW5lIEIyMDU1X0MyX1RYX1JGX1BBRFRTU0kxCQkweEIzIC8qIENvcmUgMiBUWCBSRiBQQUQgVFNTSTEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfUEFEVFNTSTIJCTB4QjQgLyogQ29yZSAyIFRYIFJGIFBBRCBUU1NJMiAqLwotI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9TUEFSRQkJMHhCNSAvKiBDb3JlIDIgVFggUkYgc3BhcmUgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfSVFDQUwxCQkweEI2IC8qIENvcmUgMiBUWCBSRiBJL1EgQ0FMIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfSVFDQUwyCQkweEI3IC8qIENvcmUgMiBUWCBSRiBJL1EgQ0FMIDIgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhCQl9SQ0NBTAkJMHhCOCAvKiBDb3JlIDIgVFhCQiBSQyBDQUwgQ29udHJvbCAqLwotI2RlZmluZSBCMjA1NV9DMl9UWEJCX0xQRjEJCTB4QjkgLyogQ29yZSAyIFRYQkIgTFBGIDEgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfVk9TQ05DTAkJMHhCQSAvKiBDb3JlIDIgVFggVk9TIENOQ0wgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfTFBGX01YR01JREFDCTB4QkIgLyogQ29yZSAyIFRYIExQRiBNWEdNIElEQUMgKi8KLSNkZWZpbmUgQjIwNTVfQzJfVFhfQkJfTVhHTQkJMHhCQyAvKiBDb3JlIDIgVFggQkIgTVhHTSAqLwotI2RlZmluZSBCMjA1NV9QUkdfR0NIUDIxCQkweEJEIC8qIFBSRyBHQyBIUFZHQTIzIDIxICovCi0jZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjIJCTB4QkUgLyogUFJHIEdDIEhQVkdBMjMgMjIgKi8KLSNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyMwkJMHhCRiAvKiBQUkcgR0MgSFBWR0EyMyAyMyAqLwotI2RlZmluZSBCMjA1NV9QUkdfR0NIUDI0CQkweEMwIC8qIFBSRyBHQyBIUFZHQTIzIDI0ICovCi0jZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjUJCTB4QzEgLyogUFJHIEdDIEhQVkdBMjMgMjUgKi8KLSNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyNgkJMHhDMiAvKiBQUkcgR0MgSFBWR0EyMyAyNiAqLwotI2RlZmluZSBCMjA1NV9QUkdfR0NIUDI3CQkweEMzIC8qIFBSRyBHQyBIUFZHQTIzIDI3ICovCi0jZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjgJCTB4QzQgLyogUFJHIEdDIEhQVkdBMjMgMjggKi8KLSNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyOQkJMHhDNSAvKiBQUkcgR0MgSFBWR0EyMyAyOSAqLwotI2RlZmluZSBCMjA1NV9QUkdfR0NIUDMwCQkweEM2IC8qIFBSRyBHQyBIUFZHQTIzIDMwICovCi0jZGVmaW5lIEIyMDU1X0MxX0xOQV9HQUlOQlNUCQkweENEIC8qIENvcmUgMSBMTkEgR0FJTkJTVCAqLwotI2RlZmluZSBCMjA1NV9DMV9CME5CX1JTU0lWQ00JCTB4RDIgLyogQ29yZSAxIEIwIG5hcnJvdy1iYW5kIFJTU0kgVkNNICovCi0jZGVmaW5lIEIyMDU1X0MxX0dFTlNQQVJFMgkJMHhENiAvKiBDb3JlIDEgR0VOIHNwYXJlIDIgKi8KLSNkZWZpbmUgQjIwNTVfQzJfTE5BX0dBSU5CU1QJCTB4RDkgLyogQ29yZSAyIExOQSBHQUlOQlNUICovCi0jZGVmaW5lIEIyMDU1X0MyX0IwTkJfUlNTSVZDTQkJMHhERSAvKiBDb3JlIDIgQjAgbmFycm93LWJhbmQgUlNTSSBWQ00gKi8KLSNkZWZpbmUgQjIwNTVfQzJfR0VOU1BBUkUyCQkweEUyIC8qIENvcmUgMiBHRU4gc3BhcmUgMiAqLwotCi0KLQotc3RydWN0IGI0M193bGRldjsKLQotCi0jaWZkZWYgQ09ORklHX0I0M19OUEhZCi0vKiBOLVBIWSBzdXBwb3J0IGVuYWJsZWQgKi8KLQotaW50IGI0M19waHlfaW5pdG4oc3RydWN0IGI0M193bGRldiAqZGV2KTsKLQotdm9pZCBiNDNfbnBoeV9yYWRpb190dXJuX29uKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci12b2lkIGI0M19ucGh5X3JhZGlvX3R1cm5fb2ZmKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci0KLWludCBiNDNfbnBoeV9zZWxlY3RjaGFubmVsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY2hhbm5lbCk7Ci0KLXZvaWQgYjQzX25waHlfeG1pdHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci12b2lkIGI0M19ucGh5X3NldF9yeGFudGVubmEoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgYW50ZW5uYSk7Ci0KLQotI2Vsc2UgLyogQ09ORklHX0I0M19OUEhZICovCi0vKiBOLVBIWSBzdXBwb3J0IGRpc2FibGVkICovCi0KLQotc3RhdGljIGlubGluZQotaW50IGI0M19waHlfaW5pdG4oc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCBiNDNfbnBoeV9yYWRpb190dXJuX29uKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLX0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgYjQzX25waHlfcmFkaW9fdHVybl9vZmYoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQgYjQzX25waHlfc2VsZWN0Y2hhbm5lbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGNoYW5uZWwpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgYjQzX25waHlfeG1pdHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLX0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgYjQzX25waHlfc2V0X3J4YW50ZW5uYShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBhbnRlbm5hKQotewotfQotCi0jZW5kaWYgLyogQ09ORklHX0I0M19OUEhZICovCi0jZW5kaWYgLyogQjQzX05QSFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYwppbmRleCBiOGFhMTYzLi4zY2ZjMzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jCkBAIC04MiwxMyArODIsMTMgQEAKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAKIAlyZXMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGRldiwgJnR1cGxlKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpCisJaWYgKHJlcyAhPSAwKQogCQlnb3RvIGVycl9rZnJlZV9zc2I7CiAJcmVzID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGRldiwgJnR1cGxlKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpCisJaWYgKHJlcyAhPSAwKQogCQlnb3RvIGVycl9rZnJlZV9zc2I7Ci0JcmVzID0gcGNtY2lhX3BhcnNlX3R1cGxlKGRldiwgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykKKwlyZXMgPSBwY21jaWFfcGFyc2VfdHVwbGUoJnR1cGxlLCAmcGFyc2UpOworCWlmIChyZXMgIT0gMCkKIAkJZ290byBlcnJfa2ZyZWVfc3NiOwogCiAJZGV2LT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKQEAgLTEwNywxMyArMTA3LDEzIEBACiAJd2luLlNpemUgPSBTU0JfQ09SRV9TSVpFOwogCXdpbi5BY2Nlc3NTcGVlZCA9IDI1MDsKIAlyZXMgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmRldiwgJndpbiwgJmRldi0+d2luKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpCisJaWYgKHJlcyAhPSAwKQogCQlnb3RvIGVycl9rZnJlZV9zc2I7CiAKIAltZW0uQ2FyZE9mZnNldCA9IDA7CiAJbWVtLlBhZ2UgPSAwOwogCXJlcyA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UoZGV2LT53aW4sICZtZW0pOwotCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykKKwlpZiAocmVzICE9IDApCiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAKIAlkZXYtPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HOwpAQCAtMTIxLDExICsxMjEsMTEgQEAKIAlkZXYtPmlycS5IYW5kbGVyID0gTlVMTDsgLyogVGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBsYXRlci4gKi8KIAlkZXYtPmlycS5JbnN0YW5jZSA9IE5VTEw7CiAJcmVzID0gcGNtY2lhX3JlcXVlc3RfaXJxKGRldiwgJmRldi0+aXJxKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpCisJaWYgKHJlcyAhPSAwKQogCQlnb3RvIGVycl9kaXNhYmxlOwogCiAJcmVzID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihkZXYsICZkZXYtPmNvbmYpOwotCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykKKwlpZiAocmVzICE9IDApCiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAKIAllcnIgPSBzc2JfYnVzX3BjbWNpYWJ1c19yZWdpc3Rlcihzc2IsIGRldiwgd2luLkJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVkNGNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MDYgKzAsMCBAQAotLyoKLQotICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCi0KLSAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKLSAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KLSAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+Ci0gIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KLSAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKLSAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KLQotI2luY2x1ZGUgImI0My5oIgotI2luY2x1ZGUgInBoeS5oIgotI2luY2x1ZGUgIm5waHkuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAidGFibGVzLmgiCi0jaW5jbHVkZSAibG8uaCIKLSNpbmNsdWRlICJ3YS5oIgotCi0KLXN0YXRpYyBjb25zdCBzOCBiNDNfdHNzaTJkYm1fYl90YWJsZVtdID0gewotCTB4NEQsIDB4NEMsIDB4NEIsIDB4NEEsCi0JMHg0QSwgMHg0OSwgMHg0OCwgMHg0NywKLQkweDQ3LCAweDQ2LCAweDQ1LCAweDQ1LAotCTB4NDQsIDB4NDMsIDB4NDIsIDB4NDIsCi0JMHg0MSwgMHg0MCwgMHgzRiwgMHgzRSwKLQkweDNELCAweDNDLCAweDNCLCAweDNBLAotCTB4MzksIDB4MzgsIDB4MzcsIDB4MzYsCi0JMHgzNSwgMHgzNCwgMHgzMiwgMHgzMSwKLQkweDMwLCAweDJGLCAweDJELCAweDJDLAotCTB4MkIsIDB4MjksIDB4MjgsIDB4MjYsCi0JMHgyNSwgMHgyMywgMHgyMSwgMHgxRiwKLQkweDFELCAweDFBLCAweDE3LCAweDE0LAotCTB4MTAsIDB4MEMsIDB4MDYsIDB4MDAsCi0JLTcsIC03LCAtNywgLTcsCi0JLTcsIC03LCAtNywgLTcsCi0JLTcsIC03LCAtNywgLTcsCi19OwotCi1zdGF0aWMgY29uc3QgczggYjQzX3Rzc2kyZGJtX2dfdGFibGVbXSA9IHsKLQk3NywgNzcsIDc3LCA3NiwKLQk3NiwgNzYsIDc1LCA3NSwKLQk3NCwgNzQsIDczLCA3MywKLQk3MywgNzIsIDcyLCA3MSwKLQk3MSwgNzAsIDcwLCA2OSwKLQk2OCwgNjgsIDY3LCA2NywKLQk2NiwgNjUsIDY1LCA2NCwKLQk2MywgNjMsIDYyLCA2MSwKLQk2MCwgNTksIDU4LCA1NywKLQk1NiwgNTUsIDU0LCA1MywKLQk1MiwgNTAsIDQ5LCA0NywKLQk0NSwgNDMsIDQwLCAzNywKLQkzMywgMjgsIDIyLCAxNCwKLQk1LCAtNywgLTIwLCAtMjAsCi0JLTIwLCAtMjAsIC0yMCwgLTIwLAotCS0yMCwgLTIwLCAtMjAsIC0yMCwKLX07Ci0KLWNvbnN0IHU4IGI0M19yYWRpb19jaGFubmVsX2NvZGVzX2JnW10gPSB7Ci0JMTIsIDE3LCAyMiwgMjcsCi0JMzIsIDM3LCA0MiwgNDcsCi0JNTIsIDU3LCA2MiwgNjcsCi0JNzIsIDg0LAotfTsKLQotI2RlZmluZSBiaXRyZXY0KHRtcCkgKGJpdHJldjgodG1wKSA+PiA0KQotc3RhdGljIHZvaWQgYjQzX3BoeV9pbml0ZyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9yZmF0dF9saXN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQlzdHJ1Y3QgYjQzX3JmYXR0X2xpc3QgKmxpc3QpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQotCS8qIEFQSFkucmV2IDwgNSB8fCBHUEhZLnJldiA8IDYgKi8KLQlzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19yZmF0dCByZmF0dF8wW10gPSB7Ci0JCXsuYXR0ID0gMywud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gMSwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gNSwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gNywud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gOSwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gMiwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gMCwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gNCwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gNiwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gOCwud2l0aF9wYWRtaXggPSAwLH0sCi0JCXsuYXR0ID0gMSwud2l0aF9wYWRtaXggPSAxLH0sCi0JCXsuYXR0ID0gMiwud2l0aF9wYWRtaXggPSAxLH0sCi0JCXsuYXR0ID0gMywud2l0aF9wYWRtaXggPSAxLH0sCi0JCXsuYXR0ID0gNCwud2l0aF9wYWRtaXggPSAxLH0sCi0JfTsKLQkvKiBSYWRpby5yZXYgPT0gOCAmJiBSYWRpby52ZXJzaW9uID09IDB4MjA1MCAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0XzFbXSA9IHsKLQkJey5hdHQgPSAyLC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA0LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA2LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA4LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSAxMCwud2l0aF9wYWRtaXggPSAxLH0sCi0JCXsuYXR0ID0gMTIsLndpdGhfcGFkbWl4ID0gMSx9LAotCQl7LmF0dCA9IDE0LC53aXRoX3BhZG1peCA9IDEsfSwKLQl9OwotCS8qIE90aGVyd2lzZSAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0XzJbXSA9IHsKLQkJey5hdHQgPSAwLC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSAyLC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA0LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA2LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA4LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA5LC53aXRoX3BhZG1peCA9IDEsfSwKLQkJey5hdHQgPSA5LC53aXRoX3BhZG1peCA9IDEsfSwKLQl9OwotCi0JaWYgKCFiNDNfaGFzX2hhcmR3YXJlX3BjdGwocGh5KSkgewotCQkvKiBTb2Z0d2FyZSBwY3RsICovCi0JCWxpc3QtPmxpc3QgPSByZmF0dF8wOwotCQlsaXN0LT5sZW4gPSBBUlJBWV9TSVpFKHJmYXR0XzApOwotCQlsaXN0LT5taW5fdmFsID0gMDsKLQkJbGlzdC0+bWF4X3ZhbCA9IDk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCAmJiBwaHktPnJhZGlvX3JldiA9PSA4KSB7Ci0JCS8qIEhhcmR3YXJlIHBjdGwgKi8KLQkJbGlzdC0+bGlzdCA9IHJmYXR0XzE7Ci0JCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUocmZhdHRfMSk7Ci0JCWxpc3QtPm1pbl92YWwgPSAwOwotCQlsaXN0LT5tYXhfdmFsID0gMTQ7Ci0JCXJldHVybjsKLQl9Ci0JLyogSGFyZHdhcmUgcGN0bCAqLwotCWxpc3QtPmxpc3QgPSByZmF0dF8yOwotCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUocmZhdHRfMik7Ci0JbGlzdC0+bWluX3ZhbCA9IDA7Ci0JbGlzdC0+bWF4X3ZhbCA9IDk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2JiYXR0X2xpc3Qoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCXN0cnVjdCBiNDNfYmJhdHRfbGlzdCAqbGlzdCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19iYmF0dCBiYmF0dF8wW10gPSB7Ci0JCXsuYXR0ID0gMCx9LAotCQl7LmF0dCA9IDEsfSwKLQkJey5hdHQgPSAyLH0sCi0JCXsuYXR0ID0gMyx9LAotCQl7LmF0dCA9IDQsfSwKLQkJey5hdHQgPSA1LH0sCi0JCXsuYXR0ID0gNix9LAotCQl7LmF0dCA9IDcsfSwKLQkJey5hdHQgPSA4LH0sCi0JfTsKLQotCWxpc3QtPmxpc3QgPSBiYmF0dF8wOwotCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUoYmJhdHRfMCk7Ci0JbGlzdC0+bWluX3ZhbCA9IDA7Ci0JbGlzdC0+bWF4X3ZhbCA9IDg7Ci19Ci0KLWJvb2wgYjQzX2hhc19oYXJkd2FyZV9wY3RsKHN0cnVjdCBiNDNfcGh5ICpwaHkpCi17Ci0JaWYgKCFwaHktPmhhcmR3YXJlX3Bvd2VyX2NvbnRyb2wpCi0JCXJldHVybiAwOwotCXN3aXRjaCAocGh5LT50eXBlKSB7Ci0JY2FzZSBCNDNfUEhZVFlQRV9BOgotCQlpZiAocGh5LT5yZXYgPj0gNSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWlmIChwaHktPnJldiA+PSA2KQotCQkJcmV0dXJuIDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3NobV9jbGVhcl90c3NpKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0Jc3dpdGNoIChwaHktPnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNjgsIDB4N0Y3Rik7Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNmEsIDB4N0Y3Rik7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfQjoKLQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNTgsIDB4N0Y3Rik7Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNWEsIDB4N0Y3Rik7Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNzAsIDB4N0Y3Rik7Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNzIsIDB4N0Y3Rik7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogTG9jayB0aGUgUEhZIHJlZ2lzdGVycyBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIGZyb20gdGhlIG1pY3JvY29kZS4KLSAqIFRoaXMgbG9jayBpcyBub25yZWN1cnNpdmUuICovCi12b2lkIGI0M19waHlfbG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0jaWYgQjQzX0RFQlVHCi0JQjQzX1dBUk5fT04oZGV2LT5waHkucGh5X2xvY2tlZCk7Ci0JZGV2LT5waHkucGh5X2xvY2tlZCA9IDE7Ci0jZW5kaWYKLQlCNDNfV0FSTl9PTihkZXYtPmRldi0+aWQucmV2aXNpb24gPCAzKTsKLQotCWlmICghYjQzX2lzX21vZGUoZGV2LT53bCwgSUVFRTgwMjExX0lGX1RZUEVfQVApKQotCQliNDNfcG93ZXJfc2F2aW5nX2N0bF9iaXRzKGRldiwgQjQzX1BTX0FXQUtFKTsKLX0KLQotdm9pZCBiNDNfcGh5X3VubG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0jaWYgQjQzX0RFQlVHCi0JQjQzX1dBUk5fT04oIWRldi0+cGh5LnBoeV9sb2NrZWQpOwotCWRldi0+cGh5LnBoeV9sb2NrZWQgPSAwOwotI2VuZGlmCi0JQjQzX1dBUk5fT04oZGV2LT5kZXYtPmlkLnJldmlzaW9uIDwgMyk7Ci0KLQlpZiAoIWI0M19pc19tb2RlKGRldi0+d2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSkKLQkJYjQzX3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIDApOwotfQotCi0vKiBEaWZmZXJlbnQgUEhZcyByZXF1aXJlIGRpZmZlcmVudCByZWdpc3RlciByb3V0aW5nIGZsYWdzLgotICogVGhpcyBhZGp1c3RzIChhbmQgZG9lcyBzYW5pdHkgY2hlY2tzIG9uKSB0aGUgcm91dGluZyBmbGFncy4KLSAqLwotc3RhdGljIGlubGluZSB1MTYgYWRqdXN0X3BoeXJlZ19mb3JfcGh5dHlwZShzdHJ1Y3QgYjQzX3BoeSAqcGh5LAotCQkJCQkgICAgdTE2IG9mZnNldCwgc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkgewotCQkvKiBPRkRNIHJlZ2lzdGVycyBhcmUgYmFzZS1yZWdpc3RlcnMgZm9yIHRoZSBBLVBIWS4gKi8KLQkJaWYgKChvZmZzZXQgJiBCNDNfUEhZUk9VVEUpID09IEI0M19QSFlST1VURV9PRkRNX0dQSFkpIHsKLQkJCW9mZnNldCAmPSB+QjQzX1BIWVJPVVRFOwotCQkJb2Zmc2V0IHw9IEI0M19QSFlST1VURV9CQVNFOwotCQl9Ci0JfQotCi0jaWYgQjQzX0RFQlVHCi0JaWYgKChvZmZzZXQgJiBCNDNfUEhZUk9VVEUpID09IEI0M19QSFlST1VURV9FWFRfR1BIWSkgewotCQkvKiBFeHQtRyByZWdpc3RlcnMgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIEctUEhZcyAqLwotCQlpZiAocGh5LT50eXBlICE9IEI0M19QSFlUWVBFX0cpIHsKLQkJCWI0M2VycihkZXYtPndsLCAiSW52YWxpZCBFWFQtRyBQSFkgYWNjZXNzIGF0ICIKLQkJCSAgICAgICAiMHglMDRYIG9uIFBIWSB0eXBlICV1XG4iLCBvZmZzZXQsIHBoeS0+dHlwZSk7Ci0JCQlkdW1wX3N0YWNrKCk7Ci0JCX0KLQl9Ci0JaWYgKChvZmZzZXQgJiBCNDNfUEhZUk9VVEUpID09IEI0M19QSFlST1VURV9OX0JNT0RFKSB7Ci0JCS8qIE4tQk1PREUgcmVnaXN0ZXJzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBOLVBIWXMgKi8KLQkJaWYgKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9OKSB7Ci0JCQliNDNlcnIoZGV2LT53bCwgIkludmFsaWQgTi1CTU9ERSBQSFkgYWNjZXNzIGF0ICIKLQkJCSAgICAgICAiMHglMDRYIG9uIFBIWSB0eXBlICV1XG4iLCBvZmZzZXQsIHBoeS0+dHlwZSk7Ci0JCQlkdW1wX3N0YWNrKCk7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogQjQzX0RFQlVHICovCi0KLQlyZXR1cm4gb2Zmc2V0OwotfQotCi11MTYgYjQzX3BoeV9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKiBkZXYsIHUxNiBvZmZzZXQpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQotCW9mZnNldCA9IGFkanVzdF9waHlyZWdfZm9yX3BoeXR5cGUocGh5LCBvZmZzZXQsIGRldik7Ci0JYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgb2Zmc2V0KTsKLQlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBKTsKLX0KLQotdm9pZCBiNDNfcGh5X3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IHZhbCkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0Jb2Zmc2V0ID0gYWRqdXN0X3BoeXJlZ19mb3JfcGh5dHlwZShwaHksIG9mZnNldCwgZGV2KTsKLQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9DT05UUk9MLCBvZmZzZXQpOwotCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX0RBVEEsIHZhbCk7Ci19Ci0KLXZvaWQgYjQzX3BoeV9tYXNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2spCi17Ci0JYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgb2Zmc2V0KSAmIG1hc2spOwotfQotCi12b2lkIGI0M19waHlfc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IHNldCkKLXsKLQliNDNfcGh5X3dyaXRlKGRldiwgb2Zmc2V0LAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBvZmZzZXQpIHwgc2V0KTsKLX0KLQotdm9pZCBiNDNfcGh5X21hc2tzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgbWFzaywgdTE2IHNldCkKLXsKLQliNDNfcGh5X3dyaXRlKGRldiwgb2Zmc2V0LAotCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgb2Zmc2V0KSAmIG1hc2spIHwgc2V0KTsKLX0KLQotLyogQWRqdXN0IHRoZSB0cmFuc21pc3Npb24gcG93ZXIgb3V0cHV0IChHLVBIWSkgKi8KLXZvaWQgYjQzX3NldF90eHBvd2VyX2coc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkgICAgICAgY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqYmJhdHQsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0ICpyZmF0dCwgdTggdHhfY29udHJvbCkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IHBoeS0+bG9fY29udHJvbDsKLQl1MTYgYmIsIHJmOwotCXUxNiB0eF9iaWFzLCB0eF9tYWduOwotCi0JYmIgPSBiYmF0dC0+YXR0OwotCXJmID0gcmZhdHQtPmF0dDsKLQl0eF9iaWFzID0gbG8tPnR4X2JpYXM7Ci0JdHhfbWFnbiA9IGxvLT50eF9tYWduOwotCWlmICh1bmxpa2VseSh0eF9iaWFzID09IDB4RkYpKQotCQl0eF9iaWFzID0gMDsKLQotCS8qIFNhdmUgdGhlIHZhbHVlcyBmb3IgbGF0ZXIgKi8KLQlwaHktPnR4X2NvbnRyb2wgPSB0eF9jb250cm9sOwotCW1lbWNweSgmcGh5LT5yZmF0dCwgcmZhdHQsIHNpemVvZigqcmZhdHQpKTsKLQlwaHktPnJmYXR0LndpdGhfcGFkbWl4ID0gISEodHhfY29udHJvbCAmIEI0M19UWENUTF9UWE1JWCk7Ci0JbWVtY3B5KCZwaHktPmJiYXR0LCBiYmF0dCwgc2l6ZW9mKCpiYmF0dCkpOwotCi0JaWYgKGI0M19kZWJ1ZyhkZXYsIEI0M19EQkdfWE1JVFBPV0VSKSkgewotCQliNDNkYmcoZGV2LT53bCwgIlR1bmluZyBUWC1wb3dlciB0byBiYmF0dCgldSksICIKLQkJICAgICAgICJyZmF0dCgldSksIHR4X2NvbnRyb2woMHglMDJYKSwgIgotCQkgICAgICAgInR4X2JpYXMoMHglMDJYKSwgdHhfbWFnbigweCUwMlgpXG4iLAotCQkgICAgICAgYmIsIHJmLCB0eF9jb250cm9sLCB0eF9iaWFzLCB0eF9tYWduKTsKLQl9Ci0KLQliNDNfcGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIGJiKTsKLQliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgQjQzX1NITV9TSF9SRkFUVCwgcmYpOwotCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsCi0JCQkJICAocmYgJiAweDAwMEYpIHwgKHR4X2NvbnRyb2wgJiAweDAwNzApKTsKLQl9IGVsc2UgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg0MykKLQkJCQkJICAgICAgJiAweEZGRjApIHwgKHJmICYgMHgwMDBGKSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MiwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUyKQotCQkJCQkgICAgICAmIH4weDAwNzApIHwgKHR4X2NvbnRyb2wgJgotCQkJCQkJCSAgICAweDAwNzApKTsKLQl9Ci0JaWYgKGhhc190eF9tYWduaWZpY2F0aW9uKHBoeSkpIHsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCB0eF9tYWduIHwgdHhfYmlhcyk7Ci0JfSBlbHNlIHsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTIpCi0JCQkJCSAgICAgICYgMHhGRkYwKSB8ICh0eF9iaWFzICYgMHgwMDBGKSk7Ci0JfQotCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykKLQkJYjQzX2xvX2dfYWRqdXN0KGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlZmF1bHRfYmFzZWJhbmRfYXR0ZW51YXRpb24oc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCQkgc3RydWN0IGI0M19iYmF0dCAqYmIpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQotCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5yYWRpb19yZXYgPCA2KQotCQliYi0+YXR0ID0gMDsKLQllbHNlCi0JCWJiLT5hdHQgPSAyOwotfQotCi1zdGF0aWMgdm9pZCBkZWZhdWx0X3JhZGlvX2F0dGVudWF0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgYjQzX3JmYXR0ICpyZikKLXsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JcmYtPndpdGhfcGFkbWl4ID0gMDsKLQotCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSAmJgotCSAgICBidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RykgewotCQlpZiAoYnVzLT5ib2FyZGluZm8ucmV2IDwgMHg0MykgewotCQkJcmYtPmF0dCA9IDI7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAoYnVzLT5ib2FyZGluZm8ucmV2IDwgMHg1MSkgewotCQkJcmYtPmF0dCA9IDM7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0EpIHsKLQkJcmYtPmF0dCA9IDB4NjA7Ci0JCXJldHVybjsKLQl9Ci0KLQlzd2l0Y2ggKHBoeS0+cmFkaW9fdmVyKSB7Ci0JY2FzZSAweDIwNTM6Ci0JCXN3aXRjaCAocGh5LT5yYWRpb19yZXYpIHsKLQkJY2FzZSAxOgotCQkJcmYtPmF0dCA9IDY7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAweDIwNTA6Ci0JCXN3aXRjaCAocGh5LT5yYWRpb19yZXYpIHsKLQkJY2FzZSAwOgotCQkJcmYtPmF0dCA9IDU7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgMToKLQkJCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykgewotCQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTQotCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RwotCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby5yZXYgPj0gMzApCi0JCQkJCXJmLT5hdHQgPSAzOwotCQkJCWVsc2UgaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PQotCQkJCQkgU1NCX0JPQVJEVkVORE9SX0JDTQotCQkJCQkgJiYgYnVzLT5ib2FyZGluZm8udHlwZSA9PQotCQkJCQkgU1NCX0JPQVJEX0JVNDMwNikKLQkJCQkJcmYtPmF0dCA9IDM7Ci0JCQkJZWxzZQotCQkJCQlyZi0+YXR0ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKLQkJCQkJcmYtPmF0dCA9IDc7Ci0JCQkJZWxzZQotCQkJCQlyZi0+YXR0ID0gNjsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSAyOgotCQkJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7Ci0JCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCi0JCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKLQkJCQkJcmYtPmF0dCA9IDM7Ci0JCQkJZWxzZSBpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09Ci0JCQkJCSBTU0JfQk9BUkRWRU5ET1JfQkNNCi0JCQkJCSAmJiBidXMtPmJvYXJkaW5mby50eXBlID09Ci0JCQkJCSBTU0JfQk9BUkRfQlU0MzA2KQotCQkJCQlyZi0+YXR0ID0gNTsKLQkJCQllbHNlIGlmIChidXMtPmNoaXBfaWQgPT0gMHg0MzIwKQotCQkJCQlyZi0+YXR0ID0gNDsKLQkJCQllbHNlCi0JCQkJCXJmLT5hdHQgPSAzOwotCQkJfSBlbHNlCi0JCQkJcmYtPmF0dCA9IDY7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgMzoKLQkJCXJmLT5hdHQgPSA1OwotCQkJcmV0dXJuOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXJmLT5hdHQgPSAxOwotCQkJcmV0dXJuOwotCQljYXNlIDY6Ci0JCWNhc2UgNzoKLQkJCXJmLT5hdHQgPSA1OwotCQkJcmV0dXJuOwotCQljYXNlIDg6Ci0JCQlyZi0+YXR0ID0gMHhBOwotCQkJcmYtPndpdGhfcGFkbWl4ID0gMTsKLQkJCXJldHVybjsKLQkJY2FzZSA5OgotCQlkZWZhdWx0OgotCQkJcmYtPmF0dCA9IDU7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JcmYtPmF0dCA9IDU7Ci19Ci0KLXN0YXRpYyB1MTYgZGVmYXVsdF90eF9jb250cm9sKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JaWYgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHBoeS0+cmFkaW9fcmV2ID09IDEpCi0JCXJldHVybiBCNDNfVFhDVExfUEEyREIgfCBCNDNfVFhDVExfVFhNSVg7Ci0JaWYgKHBoeS0+cmFkaW9fcmV2IDwgNikKLQkJcmV0dXJuIEI0M19UWENUTF9QQTJEQjsKLQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkKLQkJcmV0dXJuIEI0M19UWENUTF9UWE1JWDsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jIGlzIGNhbGxlZCAiUEhZIGNhbGlicmF0ZSIgaW4gdGhlIHNwZWNzLi4uICovCi12b2lkIGI0M19waHlfZWFybHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBwaHktPmxvX2NvbnRyb2w7Ci0KLQlkZWZhdWx0X2Jhc2ViYW5kX2F0dGVudWF0aW9uKGRldiwgJnBoeS0+YmJhdHQpOwotCWRlZmF1bHRfcmFkaW9fYXR0ZW51YXRpb24oZGV2LCAmcGh5LT5yZmF0dCk7Ci0JcGh5LT50eF9jb250cm9sID0gKGRlZmF1bHRfdHhfY29udHJvbChkZXYpIDw8IDQpOwotCi0JLyogQ29tbWl0IHByZXZpb3VzIHdyaXRlcyAqLwotCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOwotCi0JaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9CIHx8IHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7Ci0JCWdlbmVyYXRlX3JmYXR0X2xpc3QoZGV2LCAmbG8tPnJmYXR0X2xpc3QpOwotCQlnZW5lcmF0ZV9iYmF0dF9saXN0KGRldiwgJmxvLT5iYmF0dF9saXN0KTsKLQl9Ci0JaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HICYmIHBoeS0+cmV2ID09IDEpIHsKLQkJLyogV29ya2Fyb3VuZDogVGVtcG9yYXJseSBkaXNhYmxlIGdtb2RlIHRocm91Z2ggdGhlIGVhcmx5IGluaXQKLQkJICogcGhhc2UsIGFzIHRoZSBnbW9kZSBzdHVmZiBpcyBub3QgbmVlZGVkIGZvciBwaHkgcmV2IDEgKi8KLQkJcGh5LT5nbW9kZSA9IDA7Ci0JCWI0M193aXJlbGVzc19jb3JlX3Jlc2V0KGRldiwgMCk7Ci0JCWI0M19waHlfaW5pdGcoZGV2KTsKLQkJcGh5LT5nbW9kZSA9IDE7Ci0JCWI0M193aXJlbGVzc19jb3JlX3Jlc2V0KGRldiwgQjQzX1RNU0xPV19HTU9ERSk7Ci0JfQotfQotCi0vKiBHUEhZX1RTU0lfUG93ZXJfTG9va3VwX1RhYmxlX0luaXQgKi8KLXN0YXRpYyB2b2lkIGI0M19ncGh5X3Rzc2lfcG93ZXJfbHRfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlpbnQgaTsKLQl1MTYgdmFsdWU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIDB4M0MyMCwgaSwgcGh5LT50c3NpMmRibVtpXSk7Ci0JZm9yIChpID0gMzI7IGkgPCA2NDsgaSsrKQotCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgMHgzQzAwLCBpIC0gMzIsIHBoeS0+dHNzaTJkYm1baV0pOwotCWZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSAyKSB7Ci0JCXZhbHVlID0gKHUxNikgcGh5LT50c3NpMmRibVtpXTsKLQkJdmFsdWUgfD0gKCh1MTYpIHBoeS0+dHNzaTJkYm1baSArIDFdKSA8PCA4OwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgzODAgKyAoaSAvIDIpLCB2YWx1ZSk7Ci0JfQotfQotCi0vKiBHUEhZX0dhaW5fTG9va3VwX1RhYmxlX0luaXQgKi8KLXN0YXRpYyB2b2lkIGI0M19ncGh5X2dhaW5fbHRfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBwaHktPmxvX2NvbnRyb2w7Ci0JdTE2IG5yX3dyaXR0ZW4gPSAwOwotCXUxNiB0bXA7Ci0JdTggcmYsIGJiOwotCi0JZm9yIChyZiA9IDA7IHJmIDwgbG8tPnJmYXR0X2xpc3QubGVuOyByZisrKSB7Ci0JCWZvciAoYmIgPSAwOyBiYiA8IGxvLT5iYmF0dF9saXN0LmxlbjsgYmIrKykgewotCQkJaWYgKG5yX3dyaXR0ZW4gPj0gMHg0MCkKLQkJCQlyZXR1cm47Ci0JCQl0bXAgPSBsby0+YmJhdHRfbGlzdC5saXN0W2JiXS5hdHQ7Ci0JCQl0bXAgPDw9IDg7Ci0JCQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkKLQkJCQl0bXAgfD0gMHg1MDsKLQkJCWVsc2UKLQkJCQl0bXAgfD0gMHg0MDsKLQkJCXRtcCB8PSBsby0+cmZhdHRfbGlzdC5saXN0W3JmXS5hdHQ7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgzQzAgKyBucl93cml0dGVuLCB0bXApOwotCQkJbnJfd3JpdHRlbisrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBoYXJkd2FyZV9wY3RsX2luaXRfYXBoeShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JLy9UT0RPCi19Ci0KLXN0YXRpYyB2b2lkIGhhcmR3YXJlX3BjdGxfaW5pdF9ncGh5KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNiwgKGI0M19waHlfcmVhZChkZXYsIDB4MDAzNikgJiAweEZGQzApCi0JCSAgICAgIHwgKHBoeS0+dGd0X2lkbGVfdHNzaSAtIHBoeS0+Y3VyX2lkbGVfdHNzaSkpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA0NzgsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpICYgMHhGRjAwKQotCQkgICAgICB8IChwaHktPnRndF9pZGxlX3Rzc2kgLSBwaHktPmN1cl9pZGxlX3Rzc2kpKTsKLQliNDNfZ3BoeV90c3NpX3Bvd2VyX2x0X2luaXQoZGV2KTsKLQliNDNfZ3BoeV9nYWluX2x0X2luaXQoZGV2KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApICYgMHhGRkJGKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE0LCAweDAwMDApOwotCi0JQjQzX1dBUk5fT04ocGh5LT5yZXYgPCA2KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpCi0JCSAgICAgIHwgMHgwODAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpCi0JCSAgICAgICYgMHhGRUZGKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAxLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDEpCi0JCSAgICAgICYgMHhGRkJGKTsKLQotCWI0M19ncGh5X2RjX2x0X2luaXQoZGV2LCAxKTsKLX0KLQotLyogSGFyZHdhcmVQb3dlckNvbnRyb2wgaW5pdCBmb3IgQSBhbmQgRyBQSFkgKi8KLXN0YXRpYyB2b2lkIGI0M19oYXJkd2FyZV9wY3RsX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0KLQlpZiAoIWI0M19oYXNfaGFyZHdhcmVfcGN0bChwaHkpKSB7Ci0JCS8qIE5vIGhhcmR3YXJlIHBvd2VyIGNvbnRyb2wgKi8KLQkJYjQzX2hmX3dyaXRlKGRldiwgYjQzX2hmX3JlYWQoZGV2KSAmIH5CNDNfSEZfSFdQQ1RMKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBJbml0IHRoZSBod3BjdGwgcmVsYXRlZCBoYXJkd2FyZSAqLwotCXN3aXRjaCAocGh5LT50eXBlKSB7Ci0JY2FzZSBCNDNfUEhZVFlQRV9BOgotCQloYXJkd2FyZV9wY3RsX2luaXRfYXBoeShkZXYpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWhhcmR3YXJlX3BjdGxfaW5pdF9ncGh5KGRldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCX0KLQkvKiBFbmFibGUgaGFyZHdhcmUgcGN0bCBpbiBmaXJtd2FyZS4gKi8KLQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpIHwgQjQzX0hGX0hXUENUTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19oYXJkd2FyZV9wY3RsX2Vhcmx5X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0KLQlpZiAoIWI0M19oYXNfaGFyZHdhcmVfcGN0bChwaHkpKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIDB4QzExMSk7Ci0JCXJldHVybjsKLQl9Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM2LCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzYpICYgMHhGRUZGKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJGLCAweDAyMDIpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0MsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3QykgfCAweDAwMDIpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3QSkgfCAweEYwMDApOwotCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDdBLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdBKQotCQkJCQkgICAgJiAweEZGMEYpIHwgMHgwMDEwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1RCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDVEKQotCQkJICAgICAgfCAweDgwMDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDRFLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDRFKQotCQkJCQkgICAgJiAweEZGQzApIHwgMHgwMDEwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRSwgMHhDMDdGKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM2KQotCQkJICAgICAgfCAweDA0MDApOwotCX0gZWxzZSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzYsIGI0M19waHlfcmVhZChkZXYsIDB4MDAzNikKLQkJCSAgICAgIHwgMHgwMjAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM2KQotCQkJICAgICAgfCAweDA0MDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDVELCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNUQpCi0JCQkgICAgICAmIDB4N0ZGRik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNEYsIGI0M19waHlfcmVhZChkZXYsIDB4MDA0RikKLQkJCSAgICAgICYgMHhGRkZFKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA0RSwgKGI0M19waHlfcmVhZChkZXYsIDB4MDA0RSkKLQkJCQkJICAgICYgMHhGRkMwKSB8IDB4MDAxMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkUsIDB4QzA3Rik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0EpCi0JCQkJCSAgICAmIDB4RkYwRikgfCAweDAwMTApOwotCX0KLX0KLQotLyogSW50aWFsaXplIEIvRyBQSFkgcG93ZXIgY29udHJvbAotICogYXMgZGVzY3JpYmVkIGluIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9Jbml0UG93ZXJDb250cm9sCi0gKi8KLXN0YXRpYyB2b2lkIGI0M19waHlfaW5pdF9wY3RsKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfcmZhdHQgb2xkX3JmYXR0OwotCXN0cnVjdCBiNDNfYmJhdHQgb2xkX2JiYXR0OwotCXU4IG9sZF90eF9jb250cm9sID0gMDsKLQotCWlmICgoYnVzLT5ib2FyZGluZm8udmVuZG9yID09IFNTQl9CT0FSRFZFTkRPUl9CQ00pICYmCi0JICAgIChidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CVTQzMDYpKQotCQlyZXR1cm47Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDI4LCAweDgwMTgpOwotCi0JLyogVGhpcyBkb2VzIHNvbWV0aGluZyB3aXRoIHRoZSBBbmFsb2cuLi4gKi8KLQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWTAsIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFkwKQotCQkgICAgJiAweEZGREYpOwotCi0JaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HICYmICFwaHktPmdtb2RlKQotCQlyZXR1cm47Ci0JYjQzX2hhcmR3YXJlX3BjdGxfZWFybHlfaW5pdChkZXYpOwotCWlmIChwaHktPmN1cl9pZGxlX3Rzc2kgPT0gMCkgewotCQlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwICYmIHBoeS0+YW5hbG9nID09IDApIHsKLQkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDc2LAotCQkJCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDc2KQotCQkJCQkgICAmIDB4MDBGNykgfCAweDAwODQpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGI0M19yZmF0dCByZmF0dDsKLQkJCXN0cnVjdCBiNDNfYmJhdHQgYmJhdHQ7Ci0KLQkJCW1lbWNweSgmb2xkX3JmYXR0LCAmcGh5LT5yZmF0dCwgc2l6ZW9mKG9sZF9yZmF0dCkpOwotCQkJbWVtY3B5KCZvbGRfYmJhdHQsICZwaHktPmJiYXR0LCBzaXplb2Yob2xkX2JiYXR0KSk7Ci0JCQlvbGRfdHhfY29udHJvbCA9IHBoeS0+dHhfY29udHJvbDsKLQotCQkJYmJhdHQuYXR0ID0gMTE7Ci0JCQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQkJCXJmYXR0LmF0dCA9IDE1OwotCQkJCXJmYXR0LndpdGhfcGFkbWl4ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmZhdHQuYXR0ID0gOTsKLQkJCQlyZmF0dC53aXRoX3BhZG1peCA9IDA7Ci0JCQl9Ci0JCQliNDNfc2V0X3R4cG93ZXJfZyhkZXYsICZiYmF0dCwgJnJmYXR0LCAwKTsKLQkJfQotCQliNDNfZHVtbXlfdHJhbnNtaXNzaW9uKGRldik7Ci0JCXBoeS0+Y3VyX2lkbGVfdHNzaSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfSVRTU0kpOwotCQlpZiAoQjQzX0RFQlVHKSB7Ci0JCQkvKiBDdXJyZW50LUlkbGUtVFNTSSBzYW5pdHkgY2hlY2suICovCi0JCQlpZiAoYWJzKHBoeS0+Y3VyX2lkbGVfdHNzaSAtIHBoeS0+dGd0X2lkbGVfdHNzaSkgPj0gMjApIHsKLQkJCQliNDNkYmcoZGV2LT53bCwKLQkJCQkgICAgICAgIiFXQVJOSU5HISBJZGxlLVRTU0kgcGh5LT5jdXJfaWRsZV90c3NpICIKLQkJCQkgICAgICAgIm1lYXN1cmluZyBmYWlsZWQuIChjdXI9JWQsIHRndD0lZCkuIERpc2FibGluZyBUWCBwb3dlciAiCi0JCQkJICAgICAgICJhZGp1c3RtZW50LlxuIiwgcGh5LT5jdXJfaWRsZV90c3NpLAotCQkJCSAgICAgICBwaHktPnRndF9pZGxlX3Rzc2kpOwotCQkJCXBoeS0+Y3VyX2lkbGVfdHNzaSA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCAmJiBwaHktPmFuYWxvZyA9PSAwKSB7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3NiwKLQkJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDc2KQotCQkJCQkgICYgMHhGRjdCKTsKLQkJfSBlbHNlIHsKLQkJCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJm9sZF9iYmF0dCwKLQkJCQkJICAmb2xkX3JmYXR0LCBvbGRfdHhfY29udHJvbCk7Ci0JCX0KLQl9Ci0JYjQzX2hhcmR3YXJlX3BjdGxfaW5pdChkZXYpOwotCWI0M19zaG1fY2xlYXJfdHNzaShkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfcGh5X3Jzc2lhZ2Moc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBlbmFibGUpCi17Ci0JaW50IGk7Ci0KLQlpZiAoZGV2LT5waHkucmV2IDwgMykgewotCQlpZiAoZW5hYmxlKQotCQkJZm9yIChpID0gMDsgaSA8IEI0M19UQUJfUlNTSUFHQzFfU0laRTsgaSsrKSB7Ci0JCQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsCi0JCQkJCUI0M19PRkRNVEFCX0xOQUhQRkdBSU4xLCBpLCAweEZGRjgpOwotCQkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LAotCQkJCQlCNDNfT0ZETVRBQl9XUlNTSSwgaSwgMHhGRkY4KTsKLQkJCX0KLQkJZWxzZQotCQkJZm9yIChpID0gMDsgaSA8IEI0M19UQUJfUlNTSUFHQzFfU0laRTsgaSsrKSB7Ci0JCQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsCi0JCQkJCUI0M19PRkRNVEFCX0xOQUhQRkdBSU4xLCBpLCBiNDNfdGFiX3Jzc2lhZ2MxW2ldKTsKLQkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwKLQkJCQkJQjQzX09GRE1UQUJfV1JTU0ksIGksIGI0M190YWJfcnNzaWFnYzFbaV0pOwotCQkJfQotCX0gZWxzZSB7Ci0JCWlmIChlbmFibGUpCi0JCQlmb3IgKGkgPSAwOyBpIDwgQjQzX1RBQl9SU1NJQUdDMV9TSVpFOyBpKyspCi0JCQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsCi0JCQkJCUI0M19PRkRNVEFCX1dSU1NJLCBpLCAweDA4MjApOwotCQllbHNlCi0JCQlmb3IgKGkgPSAwOyBpIDwgQjQzX1RBQl9SU1NJQUdDMl9TSVpFOyBpKyspCi0JCQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsCi0JCQkJCUI0M19PRkRNVEFCX1dSU1NJLCBpLCBiNDNfdGFiX3Jzc2lhZ2MyW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19waHlfd3coc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXUxNiBiLCBjdXJyX3MsIGJlc3RfcyA9IDB4RkZGRjsKLQlpbnQgaTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NSUzAsCi0JCWI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ1JTMCkgJiB+QjQzX1BIWV9DUlMwX0VOKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4MUIpLAotCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHgxQikpIHwgMHgxMDAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4ODIpLAotCQkoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4ODIpKSAmIDB4RjBGRikgfCAweDAzMDApOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA5LAotCQliNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA5KSB8IDB4MDA4MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMTIsCi0JCShiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDEyKSAmIDB4RkZGQykgfCAweDAwMDIpOwotCWI0M193YV9pbml0Z2FpbnMoZGV2KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QkEpLCAweDNFRDUpOwotCWIgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BXUkRPV04pOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BXUkRPV04sIChiICYgMHhGRkY4KSB8IDB4MDAwNSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDQsCi0JCWI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDQpIHwgMHgwMDA0KTsKLQlmb3IgKGkgPSAweDEwOyBpIDw9IDB4MjA7IGkrKykgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAxMywgaSk7Ci0JCWN1cnJfcyA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT1RBQkxFUSkgJiAweDAwRkY7Ci0JCWlmICghY3Vycl9zKSB7Ci0JCQliZXN0X3MgPSAweDAwMDA7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChjdXJyX3MgPj0gMHgwMDgwKQotCQkJY3Vycl9zID0gMHgwMTAwIC0gY3Vycl9zOwotCQlpZiAoY3Vycl9zIDwgYmVzdF9zKQotCQkJYmVzdF9zID0gY3Vycl9zOwotCX0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QV1JET1dOLCBiKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNCwKLQkJYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAwNCkgJiAweEZGRkIpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDEzLCBiZXN0X3MpOwotCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxX1IxLCAwLCAweEZGRUMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhCNyksIDB4MUU4MCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweEI2KSwgMHgxQzAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QjUpLCAweDBFQzApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhCMiksIDB4MDBDMCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweEI5KSwgMHgxRkZGKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QkIpLAotCQkoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4QkIpKSAmIDB4RjAwMCkgfCAweDAwNTMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE02MSwKLQkJKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETTYxKSAmIDB4RkUxRikgfCAweDAxMjApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgxMyksCi0JCShiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHgxMykpICYgMHgwRkZGKSB8IDB4MzAwMCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweDE0KSwKLQkJKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDE0KSkgJiAweDBGRkYpIHwgMHgzMDAwKTsKLQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgNiwgMHgwMDE3KTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgaSwgMHgwMDBGKTsKLQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgMHgwRCwgMHgwMDBFKTsKLQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgMHgwRSwgMHgwMDExKTsKLQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgQjQzX09GRE1UQUJfQUdDMSwgMHgwRiwgMHgwMDEzKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4MzMpLCAweDUwMzApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NSUzAsCi0JCWI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ1JTMCkgfCBCNDNfUEhZX0NSUzBfRU4pOwotfQotCi0vKiBJbml0aWFsaXplIEFQSFkuIFRoaXMgaXMgYWxzbyBjYWxsZWQgZm9yIHRoZSBHUEhZIGluIHNvbWUgY2FzZXMuICovCi1zdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRhKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCWlmIChwaHktPnJldiA+PSA2KSB7Ci0JCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgxQiksCi0JCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4MUIpKSAmIH4weDEwMDApOwotCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FTkNPUkUpICYgQjQzX1BIWV9FTkNPUkVfRU4pCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9FTkNPUkUsCi0JCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FTkNPUkUpIHwgMHgwMDEwKTsKLQkJZWxzZQotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfRU5DT1JFLAotCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfRU5DT1JFKSAmIH4weDEwMTApOwotCX0KLQotCWI0M193YV9hbGwoZGV2KTsKLQotCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkgewotCQlpZiAocGh5LT5nbW9kZSAmJiAocGh5LT5yZXYgPCAzKSkKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzQsCi0JCQkJYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM0KSB8IDB4MDAwMSk7Ci0JCWI0M19waHlfcnNzaWFnYyhkZXYsIDApOwotCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NSUzAsCi0JCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApIHwgQjQzX1BIWV9DUlMwX0VOKTsKLQotCQliNDNfcmFkaW9faW5pdDIwNjAoZGV2KTsKLQotCQlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgotCQkgICAgKChidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CVTQzMDYpIHx8Ci0JCSAgICAgKGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwOSkpKSB7Ci0JCQk7IC8vVE9ETzogQSBQSFkgTE8KLQkJfQotCi0JCWlmIChwaHktPnJldiA+PSAzKQotCQkJYjQzX3BoeV93dyhkZXYpOwotCi0JCWhhcmR3YXJlX3BjdGxfaW5pdF9hcGh5KGRldik7Ci0KLQkJLy9UT0RPOiByYWRhciBkZXRlY3Rpb24KLQl9Ci0KLQlpZiAoKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSAmJgotCSAgICAoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUEFDVFJMKSkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4NkUpLAotCQkJCSAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDZFKSkKLQkJCQkgICAmIDB4RTAwMCkgfCAweDNDRik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRiNShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5idXM7Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQl1MTYgb2Zmc2V0LCB2YWx1ZTsKLQl1OCBvbGRfY2hhbm5lbDsKLQotCWlmIChwaHktPmFuYWxvZyA9PSAxKSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKQotCQkJCSAgfCAweDAwNTApOwotCX0KLQlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciAhPSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgotCSAgICAoYnVzLT5ib2FyZGluZm8udHlwZSAhPSBTU0JfQk9BUkRfQlU0MzA2KSkgewotCQl2YWx1ZSA9IDB4MjEyMDsKLQkJZm9yIChvZmZzZXQgPSAweDAwQTg7IG9mZnNldCA8IDB4MDBDNzsgb2Zmc2V0KyspIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBvZmZzZXQsIHZhbHVlKTsKLQkJCXZhbHVlICs9IDB4MjAyOwotCQl9Ci0JfQotCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzUsIChiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzUpICYgMHhGMEZGKQotCQkgICAgICB8IDB4MDcwMCk7Ci0JaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCkKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzOCwgMHgwNjY3KTsKLQotCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKLQkJaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCkgewotCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCi0JCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkKLQkJCQkJICB8IDB4MDAyMCk7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MSwKLQkJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDUxKQotCQkJCQkgIHwgMHgwMDA0KTsKLQkJfQotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9SQURJTywgMHgwMDAwKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAyLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDIpIHwgMHgwMTAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyQiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDJCKSB8IDB4MjAwMCk7Ci0KLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxQywgMHgxODZBKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDEzLAotCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDAxMykgJiAweDAwRkYpIHwgMHgxOTAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNSwKLQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzUpICYgMHhGRkMwKSB8IDB4MDA2NCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNUQsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDVEKSAmIDB4RkY4MCkgfCAweDAwMEEpOwotCX0KLQotCWlmIChkZXYtPmJhZF9mcmFtZXNfcHJlZW1wdCkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCwKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsCi0JCQkJCSAgIEI0M19QSFlfUkFESU9fQklURklFTEQpIHwgKDEgPDwgMTEpKTsKLQl9Ci0KLQlpZiAocGh5LT5hbmFsb2cgPT0gMSkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDI2LCAweENFMDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDIxLCAweDM3NjMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDIyLCAweDFCQzMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDIzLCAweDA2RjkpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDI0LCAweDAzN0UpOwotCX0gZWxzZQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDI2LCAweENDMDApOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzAsIDB4MDBDNik7Ci0JYjQzX3dyaXRlMTYoZGV2LCAweDAzRUMsIDB4M0YyMik7Ci0KLQlpZiAocGh5LT5hbmFsb2cgPT0gMSkKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyMCwgMHgzRTFDKTsKLQllbHNlCi0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjAsIDB4MzAxQyk7Ci0KLQlpZiAocGh5LT5hbmFsb2cgPT0gMCkKLQkJYjQzX3dyaXRlMTYoZGV2LCAweDAzRTQsIDB4MzAwMCk7Ci0KLQlvbGRfY2hhbm5lbCA9IHBoeS0+Y2hhbm5lbDsKLQkvKiBGb3JjZSB0byBjaGFubmVsIDcsIGV2ZW4gaWYgbm90IHN1cHBvcnRlZC4gKi8KLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIDcsIDApOwotCi0JaWYgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3NSwgMHgwMDgwKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNzksIDB4MDA4MSk7Ci0JfQotCi0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMyk7Ci0KLQlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwKSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUwLCAweDAwMjApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1QSwgMHgwMDcwKTsKLQl9Ci0KLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1QiwgMHgwMDdCKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1QywgMHgwMEIwKTsKLQotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDAwNyk7Ci0KLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIG9sZF9jaGFubmVsLCAwKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTQsIDB4MDA4MCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzMiwgMHgwMENBKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJBLCAweDg4QTMpOwotCi0JYjQzX3NldF90eHBvd2VyX2coZGV2LCAmcGh5LT5iYmF0dCwgJnBoeS0+cmZhdHQsIHBoeS0+dHhfY29udHJvbCk7Ci0KLQlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwKQotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1RCwgMHgwMDBEKTsKLQotCWI0M193cml0ZTE2KGRldiwgMHgwM0U0LCAoYjQzX3JlYWQxNihkZXYsIDB4MDNFNCkgJiAweEZGQzApIHwgMHgwMDA0KTsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3BoeV9pbml0YjYoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0JdTE2IG9mZnNldCwgdmFsOwotCXU4IG9sZF9jaGFubmVsOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzRSwgMHg4MTdBKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKLQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDU4KSk7Ci0JaWYgKHBoeS0+cmFkaW9fcmV2ID09IDQgfHwgcGh5LT5yYWRpb19yZXYgPT0gNSkgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTEsIDB4MzcpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIDB4NzApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTMsIDB4QjMpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTQsIDB4OUIpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUEsIDB4ODgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUIsIDB4ODgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUQsIDB4ODgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUUsIDB4ODgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4N0QsIDB4ODgpOwotCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpCi0JCQkgICAgIHwgQjQzX0hGX1RTU0lSUFNNVyk7Ci0JfQotCUI0M19XQVJOX09OKHBoeS0+cmFkaW9fcmV2ID09IDYgfHwgcGh5LT5yYWRpb19yZXYgPT0gNyk7CS8qIFdlIGhhZCBjb2RlIGZvciB0aGVzZSByZXZzIGhlcmUuLi4gKi8KLQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTEsIDApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIDB4NDApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTMsIDB4QjcpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTQsIDB4OTgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUEsIDB4ODgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUIsIDB4NkIpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUMsIDB4MEYpOwotCQlpZiAoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfQUxUSVEpIHsKLQkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1RCwgMHhGQSk7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUUsIDB4RDgpOwotCQl9IGVsc2UgewotCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVELCAweEY1KTsKLQkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1RSwgMHhCOCk7Ci0JCX0KLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNzMsIDB4MDAwMyk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdELCAweDAwQTgpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QywgMHgwMDAxKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0UsIDB4MDAwOCk7Ci0JfQotCXZhbCA9IDB4MUUxRjsKLQlmb3IgKG9mZnNldCA9IDB4MDA4ODsgb2Zmc2V0IDwgMHgwMDk4OyBvZmZzZXQrKykgewotCQliNDNfcGh5X3dyaXRlKGRldiwgb2Zmc2V0LCB2YWwpOwotCQl2YWwgLT0gMHgwMjAyOwotCX0KLQl2YWwgPSAweDNFM0Y7Ci0JZm9yIChvZmZzZXQgPSAweDAwOTg7IG9mZnNldCA8IDB4MDBBODsgb2Zmc2V0KyspIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwgdmFsKTsKLQkJdmFsIC09IDB4MDIwMjsKLQl9Ci0JdmFsID0gMHgyMTIwOwotCWZvciAob2Zmc2V0ID0gMHgwMEE4OyBvZmZzZXQgPCAweDAwQzg7IG9mZnNldCsrKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBvZmZzZXQsICh2YWwgJiAweDNGM0YpKTsKLQkJdmFsICs9IDB4MDIwMjsKLQl9Ci0JaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgfCAweDAwMjApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MSwKLQkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNTEpIHwgMHgwMDA0KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSB8IDB4MDEwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MkIsIGI0M19waHlfcmVhZChkZXYsIDB4MDQyQikgfCAweDIwMDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHg1QiwgMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDVDLCAwKTsKLQl9Ci0KLQlvbGRfY2hhbm5lbCA9IHBoeS0+Y2hhbm5lbDsKLQlpZiAob2xkX2NoYW5uZWwgPj0gOCkKLQkJYjQzX3JhZGlvX3NlbGVjdGNoYW5uZWwoZGV2LCAxLCAwKTsKLQllbHNlCi0JCWI0M19yYWRpb19zZWxlY3RjaGFubmVsKGRldiwgMTMsIDApOwotCi0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMyk7Ci0JdWRlbGF5KDQwKTsKLQlpZiAocGh5LT5yYWRpb19yZXYgPCA2IHx8IHBoeS0+cmFkaW9fcmV2ID09IDgpIHsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDdDLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4N0MpCi0JCQkJCSAgICAgIHwgMHgwMDAyKSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MCwgMHgyMCk7Ci0JfQotCWlmIChwaHktPnJhZGlvX3JldiA8PSAyKSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3QywgMHgyMCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1QSwgMHg3MCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1QiwgMHg3Qik7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1QywgMHhCMCk7Ci0JfQotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJICAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgJiAweDAwRjgpIHwgMHgwMDA3KTsKLQotCWI0M19yYWRpb19zZWxlY3RjaGFubmVsKGRldiwgb2xkX2NoYW5uZWwsIDApOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgMHgwMjAwKTsKLQlpZiAocGh5LT5yYWRpb19yZXYgPj0gNikKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MkEsIDB4ODhDMik7Ci0JZWxzZQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgyQSwgMHg4QUMwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM4LCAweDA2NjgpOwotCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJnBoeS0+YmJhdHQsICZwaHktPnJmYXR0LCBwaHktPnR4X2NvbnRyb2wpOwotCWlmIChwaHktPnJhZGlvX3JldiA8PSA1KSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDVELCAoYjQzX3BoeV9yZWFkKGRldiwgMHg1RCkKLQkJCQkJICAmIDB4RkY4MCkgfCAweDAwMDMpOwotCX0KLQlpZiAocGh5LT5yYWRpb19yZXYgPD0gMikKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNUQsIDB4MDAwRCk7Ci0KLQlpZiAocGh5LT5hbmFsb2cgPT0gNCkgewotCQliNDNfd3JpdGUxNihkZXYsIDB4M0U0LCA5KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4NjEsIGI0M19waHlfcmVhZChkZXYsIDB4NjEpCi0JCQkgICAgICAmIDB4MEZGRik7Ci0JfSBlbHNlIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAwMiwgKGI0M19waHlfcmVhZChkZXYsIDB4MDAwMikgJiAweEZGQzApCi0JCQkgICAgICB8IDB4MDAwNCk7Ci0JfQotCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQikKLQkJQjQzX1dBUk5fT04oMSk7Ci0JZWxzZSBpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0cpCi0JCWI0M193cml0ZTE2KGRldiwgMHgwM0U2LCAweDApOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfY2FsY19sb29wYmFja19nYWluKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXUxNiBiYWNrdXBfcGh5WzE2XSA9IHsgMCB9OwotCXUxNiBiYWNrdXBfcmFkaW9bM107Ci0JdTE2IGJhY2t1cF9iYmFuZDsKLQl1MTYgaSwgaiwgbG9vcF9pX21heDsKLQl1MTYgdHJzd19yeDsKLQl1MTYgbG9vcDFfb3V0ZXJfZG9uZSwgbG9vcDFfaW5uZXJfZG9uZTsKLQotCWJhY2t1cF9waHlbMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApOwotCWJhY2t1cF9waHlbMV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDS0JCQU5EQ0ZHKTsKLQliYWNrdXBfcGh5WzJdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpOwotCWJhY2t1cF9waHlbM10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCk7Ci0JaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KLQkJYmFja3VwX3BoeVs0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUik7Ci0JCWJhY2t1cF9waHlbNV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwpOwotCX0KLQliYWNrdXBfcGh5WzZdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHg1QSkpOwotCWJhY2t1cF9waHlbN10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDU5KSk7Ci0JYmFja3VwX3BoeVs4XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4NTgpKTsKLQliYWNrdXBfcGh5WzldID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwQSkpOwotCWJhY2t1cF9waHlbMTBdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwMykpOwotCWJhY2t1cF9waHlbMTFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9MT19NQVNLKTsKLQliYWNrdXBfcGh5WzEyXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fQ1RMKTsKLQliYWNrdXBfcGh5WzEzXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MkIpKTsKLQliYWNrdXBfcGh5WzE0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKTsKLQliYWNrdXBfcGh5WzE1XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTEVBS0FHRSk7Ci0JYmFja3VwX2JiYW5kID0gcGh5LT5iYmF0dC5hdHQ7Ci0JYmFja3VwX3JhZGlvWzBdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTIpOwotCWJhY2t1cF9yYWRpb1sxXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDQzKTsKLQliYWNrdXBfcmFkaW9bMl0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg3QSk7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DUlMwLAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApICYgMHgzRkZGKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0tCQkFORENGRywKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0tCQkFORENGRykgfCAweDgwMDApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpIHwgMHgwMDAyKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKSAmIDB4RkZGRCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUikgfCAweDAwMDEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwpICYgMHhGRkZFKTsKLQlpZiAocGh5LT5yZXYgIT0gMSkgewkvKiBOb3QgaW4gc3BlY3MsIGJ1dCBuZWVkZWQgdG8gcHJldmVudCBQUEMgbWFjaGluZSBjaGVjayAqLwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSKSB8IDB4MDAwMSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwsCi0JCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LAotCQkJCQkgICBCNDNfUEhZX0FOQUxPR09WRVJWQUwpICYgMHhGRkZFKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUiwKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUikgfCAweDAwMDIpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKLQkJCQkJICAgQjQzX1BIWV9BTkFMT0dPVkVSVkFMKSAmIDB4RkZGRCk7Ci0JfQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpIHwgMHgwMDBDKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKSB8IDB4MDAwQyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUikgfCAweDAwMzApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKQotCQkgICAgICAgJiAweEZGQ0YpIHwgMHgxMCk7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1QSksIDB4MDc4MCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTkpLCAweEM4MTApOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU4KSwgMHgwMDBEKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDBBKSwKLQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwQSkpIHwgMHgyMDAwKTsKLQlpZiAocGh5LT5yZXYgIT0gMSkgewkvKiBOb3QgaW4gc3BlY3MsIGJ1dCBuZWVkZWQgdG8gcHJldmVudCBQUEMgbWFjaGluZSBjaGVjayAqLwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSKSB8IDB4MDAwNCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwsCi0JCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LAotCQkJCQkgICBCNDNfUEhZX0FOQUxPR09WRVJWQUwpICYgMHhGRkZCKTsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MDMpLAotCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwMykpCi0JCSAgICAgICAmIDB4RkY5RikgfCAweDQwKTsKLQotCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywgMHgwMDBGKTsKLQl9IGVsc2UgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIDApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg0MykKLQkJCQkJICAgICAgJiAweEZGRjApIHwgMHg5KTsKLQl9Ci0JYjQzX3BoeV9zZXRfYmFzZWJhbmRfYXR0ZW51YXRpb24oZGV2LCAxMSk7Ci0KLQlpZiAocGh5LT5yZXYgPj0gMykKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgMHhDMDIwKTsKLQllbHNlCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX01BU0ssIDB4ODAyMCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fQ1RMLCAwKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJCKSwKLQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MkIpKQotCQkgICAgICAgJiAweEZGQzApIHwgMHgwMSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkIpLAotCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgyQikpCi0JCSAgICAgICAmIDB4QzBGRikgfCAweDgwMCk7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsCi0JCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKSB8IDB4MDEwMCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkgJiAweENGRkYpOwotCi0JaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0VYVExOQSkgewotCQlpZiAocGh5LT5yZXYgPj0gNykgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLAotCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKQotCQkJCSAgICAgIHwgMHgwODAwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkKLQkJCQkgICAgICB8IDB4ODAwMCk7Ci0JCX0KLQl9Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDdBLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg3QSkKLQkJCSAgJiAweDAwRjcpOwotCi0JaiA9IDA7Ci0JbG9vcF9pX21heCA9IChwaHktPnJhZGlvX3JldiA9PSA4KSA/IDE1IDogOTsKLQlmb3IgKGkgPSAwOyBpIDwgbG9vcF9pX21heDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIGkpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkKLQkJCQkgICAgICAgJiAweEYwRkYpIHwgKGogPDwgOCkpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BHQUNUTCkKLQkJCQkgICAgICAgJiAweDBGRkYpIHwgMHhBMDAwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BHQUNUTCkKLQkJCQkgICAgICB8IDB4RjAwMCk7Ci0JCQl1ZGVsYXkoMjApOwotCQkJaWYgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTEVBS0FHRSkgPj0gMHhERkMpCi0JCQkJZ290byBleGl0X2xvb3AxOwotCQl9Ci0JfQotICAgICAgZXhpdF9sb29wMToKLQlsb29wMV9vdXRlcl9kb25lID0gaTsKLQlsb29wMV9pbm5lcl9kb25lID0gajsKLQlpZiAoaiA+PSA4KSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKQotCQkJICAgICAgfCAweDMwKTsKLQkJdHJzd19yeCA9IDB4MUI7Ci0JCWZvciAoaiA9IGogLSA4OyBqIDwgMTY7IGorKykgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkKLQkJCQkgICAgICAgJiAweEYwRkYpIHwgKGogPDwgOCkpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BHQUNUTCkKLQkJCQkgICAgICAgJiAweDBGRkYpIHwgMHhBMDAwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BHQUNUTCkKLQkJCQkgICAgICB8IDB4RjAwMCk7Ci0JCQl1ZGVsYXkoMjApOwotCQkJdHJzd19yeCAtPSAzOwotCQkJaWYgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTEVBS0FHRSkgPj0gMHhERkMpCi0JCQkJZ290byBleGl0X2xvb3AyOwotCQl9Ci0JfSBlbHNlCi0JCXRyc3dfcnggPSAweDE4OwotICAgICAgZXhpdF9sb29wMjoKLQotCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVIsIGJhY2t1cF9waHlbNF0pOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLCBiYWNrdXBfcGh5WzVdKTsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NUEpLCBiYWNrdXBfcGh5WzZdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OSksIGJhY2t1cF9waHlbN10pOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU4KSwgYmFja3VwX3BoeVs4XSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MEEpLCBiYWNrdXBfcGh5WzldKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgwMyksIGJhY2t1cF9waHlbMTBdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19NQVNLLCBiYWNrdXBfcGh5WzExXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fQ1RMLCBiYWNrdXBfcGh5WzEyXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkIpLCBiYWNrdXBfcGh5WzEzXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCBiYWNrdXBfcGh5WzE0XSk7Ci0KLQliNDNfcGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIGJhY2t1cF9iYmFuZCk7Ci0KLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIGJhY2t1cF9yYWRpb1swXSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDQzLCBiYWNrdXBfcmFkaW9bMV0pOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3QSwgYmFja3VwX3JhZGlvWzJdKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwgYmFja3VwX3BoeVsyXSB8IDB4MDAwMyk7Ci0JdWRlbGF5KDEwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsIGJhY2t1cF9waHlbMl0pOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwgYmFja3VwX3BoeVszXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwgYmFja3VwX3BoeVswXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLQkJBTkRDRkcsIGJhY2t1cF9waHlbMV0pOwotCi0JcGh5LT5tYXhfbGJfZ2FpbiA9Ci0JICAgICgobG9vcDFfaW5uZXJfZG9uZSAqIDYpIC0gKGxvb3AxX291dGVyX2RvbmUgKiA0KSkgLSAxMTsKLQlwaHktPnRyc3dfcnhfZ2FpbiA9IHRyc3dfcnggKiAyOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRnKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXUxNiB0bXA7Ci0KLQlpZiAocGh5LT5yZXYgPT0gMSkKLQkJYjQzX3BoeV9pbml0YjUoZGV2KTsKLQllbHNlCi0JCWI0M19waHlfaW5pdGI2KGRldik7Ci0KLQlpZiAocGh5LT5yZXYgPj0gMiB8fCBwaHktPmdtb2RlKQotCQliNDNfcGh5X2luaXRhKGRldik7Ci0KLQlpZiAocGh5LT5yZXYgPj0gMikgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLCAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCwgMCk7Ci0JfQotCWlmIChwaHktPnJldiA9PSAyKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwgMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhDMCk7Ci0JfQotCWlmIChwaHktPnJldiA+IDUpIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCAweDQwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhDMCk7Ci0JfQotCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKLQkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9WRVJTSU9OX09GRE0pOwotCQl0bXAgJj0gQjQzX1BIWVZFUl9WRVJTSU9OOwotCQlpZiAodG1wID09IDMgfHwgdG1wID09IDUpIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhDMiksIDB4MTgxNik7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QzMpLCAweDgwMDYpOwotCQl9Ci0JCWlmICh0bXAgPT0gNSkgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweENDKSwKLQkJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4Q0MpKQotCQkJCSAgICAgICAmIDB4MDBGRikgfCAweDFGMDApOwotCQl9Ci0JfQotCWlmICgocGh5LT5yZXYgPD0gMiAmJiBwaHktPmdtb2RlKSB8fCBwaHktPnJldiA+PSAyKQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4N0UpLCAweDc4KTsKLQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9FWFRHKDB4MDEpLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FWFRHKDB4MDEpKQotCQkJICAgICAgfCAweDgwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweDNFKSwKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDNFKSkKLQkJCSAgICAgIHwgMHg0KTsKLQl9Ci0JaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpCi0JCWI0M19jYWxjX2xvb3BiYWNrX2dhaW4oZGV2KTsKLQotCWlmIChwaHktPnJhZGlvX3JldiAhPSA4KSB7Ci0JCWlmIChwaHktPmluaXR2YWwgPT0gMHhGRkZGKQotCQkJcGh5LT5pbml0dmFsID0gYjQzX3JhZGlvX2luaXQyMDUwKGRldik7Ci0JCWVsc2UKLQkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDc4LCBwaHktPmluaXR2YWwpOwotCX0KLQliNDNfbG9fZ19pbml0KGRldik7Ci0JaWYgKGhhc190eF9tYWduaWZpY2F0aW9uKHBoeSkpIHsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLAotCQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUyKSAmIDB4RkYwMCkKLQkJCQkgIHwgcGh5LT5sb19jb250cm9sLT50eF9iaWFzIHwgcGh5LT4KLQkJCQkgIGxvX2NvbnRyb2wtPnR4X21hZ24pOwotCX0gZWxzZSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MiwKLQkJCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg1MikgJiAweEZGRjApCi0JCQkJICB8IHBoeS0+bG9fY29udHJvbC0+dHhfYmlhcyk7Ci0JfQotCWlmIChwaHktPnJldiA+PSA2KSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDM2KSwKLQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDM2KSkKLQkJCSAgICAgICAmIDB4MEZGRikgfCAocGh5LT5sb19jb250cm9sLT4KLQkJCQkJICAgIHR4X2JpYXMgPDwgMTIpKTsKLQl9Ci0JaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkUpLCAweDgwNzUpOwotCWVsc2UKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkUpLCAweDgwN0YpOwotCWlmIChwaHktPnJldiA8IDIpCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJGKSwgMHgxMDEpOwotCWVsc2UKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkYpLCAweDIwMik7Ci0JaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgewotCQliNDNfbG9fZ19hZGp1c3QoZGV2KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgMHg4MDc4KTsKLQl9Ci0KLQlpZiAoIShkZXYtPmRldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9SU1NJKSkgewotCQkvKiBUaGUgc3BlY3Mgc3RhdGUgdG8gdXBkYXRlIHRoZSBOUlNTSSBMVCB3aXRoCi0JCSAqIHRoZSB2YWx1ZSAweDdGRkZGRkZGIGhlcmUuIEkgdGhpbmsgdGhhdCBpcyBzb21lIHdlaXJkCi0JCSAqIGNvbXBpbGVyIG9wdGltaXphdGlvbiBpbiB0aGUgb3JpZ2luYWwgZHJpdmVyLgotCQkgKiBFc3NlbnRpYWxseSwgd2hhdCB3ZSBkbyBoZXJlIGlzIHJlc2V0dGluZyBhbGwgTlJTU0kgTFQKLQkJICogZW50cmllcyB0byAtMzIgKHNlZSB0aGUgY2xhbXBfdmFsKCkgaW4gbnJzc2lfaHdfdXBkYXRlKCkpCi0JCSAqLwotCQliNDNfbnJzc2lfaHdfdXBkYXRlKGRldiwgMHhGRkZGKTsJLy9GSVhNRT8KLQkJYjQzX2NhbGNfbnJzc2lfdGhyZXNob2xkKGRldik7Ci0JfSBlbHNlIGlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKLQkJaWYgKHBoeS0+bnJzc2lbMF0gPT0gLTEwMDApIHsKLQkJCUI0M19XQVJOX09OKHBoeS0+bnJzc2lbMV0gIT0gLTEwMDApOwotCQkJYjQzX2NhbGNfbnJzc2lfc2xvcGUoZGV2KTsKLQkJfSBlbHNlCi0JCQliNDNfY2FsY19ucnNzaV90aHJlc2hvbGQoZGV2KTsKLQl9Ci0JaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0VYVEcoMHgwNSksIDB4MzIzMCk7Ci0JYjQzX3BoeV9pbml0X3BjdGwoZGV2KTsKLQkvKiBGSVhNRTogVGhlIHNwZWMgc2F5cyBpbiB0aGUgZm9sbG93aW5nIGlmLCB0aGUgMCBzaG91bGQgYmUgcmVwbGFjZWQKLQkgICAnaWYgT0ZETSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlJwotCSAgIGJ1dCBPRkRNIGlzIGxlZ2FsIGV2ZXJ5d2hlcmUgKi8KLQlpZiAoKGRldi0+ZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0MzA2Ci0JICAgICAmJiBkZXYtPmRldi0+YnVzLT5jaGlwX3BhY2thZ2UgPT0gMikgfHwgMCkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DUlMwLCBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApCi0JCQkgICAgICAmIDB4QkZGRik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhDMyksCi0JCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHhDMykpCi0JCQkgICAgICAmIDB4N0ZGRik7Ci0JfQotfQotCi0vKiBTZXQgdGhlIGJhc2ViYW5kIGF0dGVudWF0aW9uIHZhbHVlIG9uIGNoaXAuICovCi12b2lkIGI0M19waHlfc2V0X2Jhc2ViYW5kX2F0dGVudWF0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICAgICB1MTYgYmFzZWJhbmRfYXR0ZW51YXRpb24pCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQotCWlmIChwaHktPmFuYWxvZyA9PSAwKSB7Ci0JCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZMCwgKGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFkwKQotCQkJCQkJICYgMHhGRkYwKSB8Ci0JCQkgICAgYmFzZWJhbmRfYXR0ZW51YXRpb24pOwotCX0gZWxzZSBpZiAocGh5LT5hbmFsb2cgPiAxKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0RBQ0NUTCwKLQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0RBQ0NUTCkKLQkJCSAgICAgICAmIDB4RkZDMykgfCAoYmFzZWJhbmRfYXR0ZW51YXRpb24gPDwgMikpOwotCX0gZWxzZSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0RBQ0NUTCwKLQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0RBQ0NUTCkKLQkJCSAgICAgICAmIDB4RkY4NykgfCAoYmFzZWJhbmRfYXR0ZW51YXRpb24gPDwgMykpOwotCX0KLX0KLQotLyogaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L0VzdGltYXRlUG93ZXJPdXQKLSAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBUU1NJIHZhbHVlIHRvIGRCbSBpbiBRNS4yCi0gKi8KLXN0YXRpYyBzOCBiNDNfcGh5X2VzdGltYXRlX3Bvd2VyX291dChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHM4IHRzc2kpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlzOCBkYm0gPSAwOwotCXMzMiB0bXA7Ci0KLQl0bXAgPSAocGh5LT50Z3RfaWRsZV90c3NpIC0gcGh5LT5jdXJfaWRsZV90c3NpICsgdHNzaSk7Ci0KLQlzd2l0Y2ggKHBoeS0+dHlwZSkgewotCWNhc2UgQjQzX1BIWVRZUEVfQToKLQkJdG1wICs9IDB4ODA7Ci0JCXRtcCA9IGNsYW1wX3ZhbCh0bXAsIDB4MDAsIDB4RkYpOwotCQlkYm0gPSBwaHktPnRzc2kyZGJtW3RtcF07Ci0JCS8vVE9ETzogVGhlcmUncyBhIEZJWE1FIG9uIHRoZSBzcGVjcwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0I6Ci0JY2FzZSBCNDNfUEhZVFlQRV9HOgotCQl0bXAgPSBjbGFtcF92YWwodG1wLCAweDAwLCAweDNGKTsKLQkJZGJtID0gcGh5LT50c3NpMmRibVt0bXBdOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci0KLQlyZXR1cm4gZGJtOwotfQotCi12b2lkIGI0M19wdXRfYXR0ZW51YXRpb25faW50b19yYW5nZXMoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgICAgaW50ICpfYmJhdHQsIGludCAqX3JmYXR0KQotewotCWludCByZmF0dCA9ICpfcmZhdHQ7Ci0JaW50IGJiYXR0ID0gKl9iYmF0dDsKLQlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBkZXYtPnBoeS5sb19jb250cm9sOwotCi0JLyogR2V0IGJhc2ViYW5kIGFuZCByYWRpbyBhdHRlbnVhdGlvbiB2YWx1ZXMgaW50byB0aGVpciBwZXJtaXR0ZWQgcmFuZ2VzLgotCSAqIFJhZGlvIGF0dGVudWF0aW9uIGFmZmVjdHMgcG93ZXIgbGV2ZWwgNCB0aW1lcyBhcyBtdWNoIGFzIGJhc2ViYW5kLiAqLwotCi0JLyogUmFuZ2UgY29uc3RhbnRzICovCi0JY29uc3QgaW50IHJmX21pbiA9IGxvLT5yZmF0dF9saXN0Lm1pbl92YWw7Ci0JY29uc3QgaW50IHJmX21heCA9IGxvLT5yZmF0dF9saXN0Lm1heF92YWw7Ci0JY29uc3QgaW50IGJiX21pbiA9IGxvLT5iYmF0dF9saXN0Lm1pbl92YWw7Ci0JY29uc3QgaW50IGJiX21heCA9IGxvLT5iYmF0dF9saXN0Lm1heF92YWw7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAocmZhdHQgPiByZl9tYXggJiYgYmJhdHQgPiBiYl9tYXggLSA0KQotCQkJYnJlYWs7CS8qIENhbiBub3QgZ2V0IGl0IGludG8gcmFuZ2VzICovCi0JCWlmIChyZmF0dCA8IHJmX21pbiAmJiBiYmF0dCA8IGJiX21pbiArIDQpCi0JCQlicmVhazsJLyogQ2FuIG5vdCBnZXQgaXQgaW50byByYW5nZXMgKi8KLQkJaWYgKGJiYXR0ID4gYmJfbWF4ICYmIHJmYXR0ID4gcmZfbWF4IC0gMSkKLQkJCWJyZWFrOwkvKiBDYW4gbm90IGdldCBpdCBpbnRvIHJhbmdlcyAqLwotCQlpZiAoYmJhdHQgPCBiYl9taW4gJiYgcmZhdHQgPCByZl9taW4gKyAxKQotCQkJYnJlYWs7CS8qIENhbiBub3QgZ2V0IGl0IGludG8gcmFuZ2VzICovCi0KLQkJaWYgKGJiYXR0ID4gYmJfbWF4KSB7Ci0JCQliYmF0dCAtPSA0OwotCQkJcmZhdHQgKz0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChiYmF0dCA8IGJiX21pbikgewotCQkJYmJhdHQgKz0gNDsKLQkJCXJmYXR0IC09IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocmZhdHQgPiByZl9tYXgpIHsKLQkJCXJmYXR0IC09IDE7Ci0JCQliYmF0dCArPSA0OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHJmYXR0IDwgcmZfbWluKSB7Ci0JCQlyZmF0dCArPSAxOwotCQkJYmJhdHQgLT0gNDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCSpfcmZhdHQgPSBjbGFtcF92YWwocmZhdHQsIHJmX21pbiwgcmZfbWF4KTsKLQkqX2JiYXR0ID0gY2xhbXBfdmFsKGJiYXR0LCBiYl9taW4sIGJiX21heCk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9SZWNhbGN1bGF0ZVRyYW5zbWlzc2lvblBvd2VyICovCi12b2lkIGI0M19waHlfeG1pdHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JaWYgKHBoeS0+Y3VyX2lkbGVfdHNzaSA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSkgJiYKLQkgICAgKGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwNikpCi0JCXJldHVybjsKLSNpZmRlZiBDT05GSUdfQjQzX0RFQlVHCi0JaWYgKHBoeS0+bWFudWFsX3R4cG93ZXJfY29udHJvbCkKLQkJcmV0dXJuOwotI2VuZGlmCi0KLQlzd2l0Y2ggKHBoeS0+dHlwZSkgewotCWNhc2UgQjQzX1BIWVRZUEVfQTp7Ci0KLQkJCS8vVE9ETzogTm90aGluZyBmb3IgQSBQSFlzIHlldCA6LS8KLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEI0M19QSFlUWVBFX0I6Ci0JY2FzZSBCNDNfUEhZVFlQRV9HOnsKLQkJCXUxNiB0bXA7Ci0JCQlzOCB2MCwgdjEsIHYyLCB2MzsKLQkJCXM4IGF2ZXJhZ2U7Ci0JCQlpbnQgbWF4X3B3cjsKLQkJCWludCBkZXNpcmVkX3B3ciwgZXN0aW1hdGVkX3B3ciwgcHdyX2FkanVzdDsKLQkJCWludCByZmF0dF9kZWx0YSwgYmJhdHRfZGVsdGE7Ci0JCQlpbnQgcmZhdHQsIGJiYXR0OwotCQkJdTggdHhfY29udHJvbDsKLQotCQkJdG1wID0gYjQzX3NobV9yZWFkMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgMHgwMDU4KTsKLQkJCXYwID0gKHM4KSAodG1wICYgMHgwMEZGKTsKLQkJCXYxID0gKHM4KSAoKHRtcCAmIDB4RkYwMCkgPj4gOCk7Ci0JCQl0bXAgPSBiNDNfc2htX3JlYWQxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNUEpOwotCQkJdjIgPSAoczgpICh0bXAgJiAweDAwRkYpOwotCQkJdjMgPSAoczgpICgodG1wICYgMHhGRjAwKSA+PiA4KTsKLQkJCXRtcCA9IDA7Ci0KLQkJCWlmICh2MCA9PSAweDdGIHx8IHYxID09IDB4N0YgfHwgdjIgPT0gMHg3RgotCQkJICAgIHx8IHYzID09IDB4N0YpIHsKLQkJCQl0bXAgPQotCQkJCSAgICBiNDNfc2htX3JlYWQxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNzApOwotCQkJCXYwID0gKHM4KSAodG1wICYgMHgwMEZGKTsKLQkJCQl2MSA9IChzOCkgKCh0bXAgJiAweEZGMDApID4+IDgpOwotCQkJCXRtcCA9Ci0JCQkJICAgIGI0M19zaG1fcmVhZDE2KGRldiwgQjQzX1NITV9TSEFSRUQsIDB4MDA3Mik7Ci0JCQkJdjIgPSAoczgpICh0bXAgJiAweDAwRkYpOwotCQkJCXYzID0gKHM4KSAoKHRtcCAmIDB4RkYwMCkgPj4gOCk7Ci0JCQkJaWYgKHYwID09IDB4N0YgfHwgdjEgPT0gMHg3RiB8fCB2MiA9PSAweDdGCi0JCQkJICAgIHx8IHYzID09IDB4N0YpCi0JCQkJCXJldHVybjsKLQkJCQl2MCA9ICh2MCArIDB4MjApICYgMHgzRjsKLQkJCQl2MSA9ICh2MSArIDB4MjApICYgMHgzRjsKLQkJCQl2MiA9ICh2MiArIDB4MjApICYgMHgzRjsKLQkJCQl2MyA9ICh2MyArIDB4MjApICYgMHgzRjsKLQkJCQl0bXAgPSAxOwotCQkJfQotCQkJYjQzX3NobV9jbGVhcl90c3NpKGRldik7Ci0KLQkJCWF2ZXJhZ2UgPSAodjAgKyB2MSArIHYyICsgdjMgKyAyKSAvIDQ7Ci0KLQkJCWlmICh0bXAKLQkJCSAgICAmJiAoYjQzX3NobV9yZWFkMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgMHgwMDVFKSAmCi0JCQkJMHg4KSkKLQkJCQlhdmVyYWdlIC09IDEzOwotCi0JCQllc3RpbWF0ZWRfcHdyID0KLQkJCSAgICBiNDNfcGh5X2VzdGltYXRlX3Bvd2VyX291dChkZXYsIGF2ZXJhZ2UpOwotCi0JCQltYXhfcHdyID0gZGV2LT5kZXYtPmJ1cy0+c3Byb20ubWF4cHdyX2JnOwotCQkJaWYgKChkZXYtPmRldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvCi0JCQkgICAgJiBCNDNfQkZMX1BBQ1RSTCkgJiYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSkKLQkJCQltYXhfcHdyIC09IDB4MzsKLQkJCWlmICh1bmxpa2VseShtYXhfcHdyIDw9IDApKSB7Ci0JCQkJYjQzd2FybihkZXYtPndsLAotCQkJCQkiSW52YWxpZCBtYXgtVFgtcG93ZXIgdmFsdWUgaW4gU1BST00uXG4iKTsKLQkJCQltYXhfcHdyID0gNjA7CS8qIGZha2UgaXQgKi8KLQkJCQlkZXYtPmRldi0+YnVzLT5zcHJvbS5tYXhwd3JfYmcgPSBtYXhfcHdyOwotCQkJfQotCi0JCQkvKlRPRE86Ci0JCQkgICBtYXhfcHdyID0gbWluKFJFRyAtIGRldi0+ZGV2LT5idXMtPnNwcm9tLmFudGVubmFnYWluX2JncGh5IC0gMHg2LCBtYXhfcHdyKQotCQkJICAgd2hlcmUgUkVHIGlzIHRoZSBtYXggcG93ZXIgYXMgcGVyIHRoZSByZWd1bGF0b3J5IGRvbWFpbgotCQkJICovCi0KLQkJCS8qIEdldCBkZXNpcmVkIHBvd2VyIChpbiBRNS4yKSAqLwotCQkJZGVzaXJlZF9wd3IgPSBJTlRfVE9fUTUyKHBoeS0+cG93ZXJfbGV2ZWwpOwotCQkJLyogQW5kIGxpbWl0IGl0LiBtYXhfcHdyIGFscmVhZHkgaXMgUTUuMiAqLwotCQkJZGVzaXJlZF9wd3IgPSBjbGFtcF92YWwoZGVzaXJlZF9wd3IsIDAsIG1heF9wd3IpOwotCQkJaWYgKGI0M19kZWJ1ZyhkZXYsIEI0M19EQkdfWE1JVFBPV0VSKSkgewotCQkJCWI0M2RiZyhkZXYtPndsLAotCQkJCSAgICAgICAiQ3VycmVudCBUWCBwb3dlciBvdXRwdXQ6ICIgUTUyX0ZNVAotCQkJCSAgICAgICAiIGRCbSwgIiAiRGVzaXJlZCBUWCBwb3dlciBvdXRwdXQ6ICIKLQkJCQkgICAgICAgUTUyX0ZNVCAiIGRCbVxuIiwgUTUyX0FSRyhlc3RpbWF0ZWRfcHdyKSwKLQkJCQkgICAgICAgUTUyX0FSRyhkZXNpcmVkX3B3cikpOwotCQkJfQotCi0JCQkvKiBDYWxjdWxhdGUgdGhlIGFkanVzdG1lbnQgZGVsdGEuICovCi0JCQlwd3JfYWRqdXN0ID0gZGVzaXJlZF9wd3IgLSBlc3RpbWF0ZWRfcHdyOwotCi0JCQkvKiBSRiBhdHRlbnVhdGlvbiBkZWx0YS4gKi8KLQkJCXJmYXR0X2RlbHRhID0gKChwd3JfYWRqdXN0ICsgNykgLyA4KTsKLQkJCS8qIExvd2VyIGF0dGVudWF0aW9uID0+IEJpZ2dlciBwb3dlciBvdXRwdXQuIE5lZ2F0ZSBpdC4gKi8KLQkJCXJmYXR0X2RlbHRhID0gLXJmYXR0X2RlbHRhOwotCi0JCQkvKiBCYXNlYmFuZCBhdHRlbnVhdGlvbiBkZWx0YS4gKi8KLQkJCWJiYXR0X2RlbHRhID0gcHdyX2FkanVzdCAvIDI7Ci0JCQkvKiBMb3dlciBhdHRlbnVhdGlvbiA9PiBCaWdnZXIgcG93ZXIgb3V0cHV0LiBOZWdhdGUgaXQuICovCi0JCQliYmF0dF9kZWx0YSA9IC1iYmF0dF9kZWx0YTsKLQkJCS8qIFJGIGF0dCBhZmZlY3RzIHBvd2VyIGxldmVsIDQgdGltZXMgYXMgbXVjaCBhcwotCQkJICogQmFzZWJhbmQgYXR0ZW5udWF0aW9uLiBTdWJ0cmFjdCBpdC4gKi8KLQkJCWJiYXR0X2RlbHRhIC09IDQgKiByZmF0dF9kZWx0YTsKLQotCQkJLyogU28gZG8gd2UgZmluYWxseSBuZWVkIHRvIGFkanVzdCBzb21ldGhpbmc/ICovCi0JCQlpZiAoKHJmYXR0X2RlbHRhID09IDApICYmIChiYmF0dF9kZWx0YSA9PSAwKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8qIENhbGN1bGF0ZSB0aGUgbmV3IGF0dGVudWF0aW9uIHZhbHVlcy4gKi8KLQkJCWJiYXR0ID0gcGh5LT5iYmF0dC5hdHQ7Ci0JCQliYmF0dCArPSBiYmF0dF9kZWx0YTsKLQkJCXJmYXR0ID0gcGh5LT5yZmF0dC5hdHQ7Ci0JCQlyZmF0dCArPSByZmF0dF9kZWx0YTsKLQotCQkJYjQzX3B1dF9hdHRlbnVhdGlvbl9pbnRvX3JhbmdlcyhkZXYsICZiYmF0dCwgJnJmYXR0KTsKLQkJCXR4X2NvbnRyb2wgPSBwaHktPnR4X2NvbnRyb2w7Ci0JCQlpZiAoKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCkgJiYgKHBoeS0+cmFkaW9fcmV2ID09IDIpKSB7Ci0JCQkJaWYgKHJmYXR0IDw9IDEpIHsKLQkJCQkJaWYgKHR4X2NvbnRyb2wgPT0gMCkgewotCQkJCQkJdHhfY29udHJvbCA9Ci0JCQkJCQkgICAgQjQzX1RYQ1RMX1BBMkRCIHwKLQkJCQkJCSAgICBCNDNfVFhDVExfVFhNSVg7Ci0JCQkJCQlyZmF0dCArPSAyOwotCQkJCQkJYmJhdHQgKz0gMjsKLQkJCQkJfSBlbHNlIGlmIChkZXYtPmRldi0+YnVzLT5zcHJvbS4KLQkJCQkJCSAgIGJvYXJkZmxhZ3NfbG8gJgotCQkJCQkJICAgQjQzX0JGTF9QQUNUUkwpIHsKLQkJCQkJCWJiYXR0ICs9IDQgKiAocmZhdHQgLSAyKTsKLQkJCQkJCXJmYXR0ID0gMjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmZhdHQgPiA0ICYmIHR4X2NvbnRyb2wpIHsKLQkJCQkJdHhfY29udHJvbCA9IDA7Ci0JCQkJCWlmIChiYmF0dCA8IDMpIHsKLQkJCQkJCXJmYXR0IC09IDM7Ci0JCQkJCQliYmF0dCArPSAyOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmZhdHQgLT0gMjsKLQkJCQkJCWJiYXR0IC09IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvKiBTYXZlIHRoZSBjb250cm9sIHZhbHVlcyAqLwotCQkJcGh5LT50eF9jb250cm9sID0gdHhfY29udHJvbDsKLQkJCWI0M19wdXRfYXR0ZW51YXRpb25faW50b19yYW5nZXMoZGV2LCAmYmJhdHQsICZyZmF0dCk7Ci0JCQlwaHktPnJmYXR0LmF0dCA9IHJmYXR0OwotCQkJcGh5LT5iYmF0dC5hdHQgPSBiYmF0dDsKLQotCQkJLyogQWRqdXN0IHRoZSBoYXJkd2FyZSAqLwotCQkJYjQzX3BoeV9sb2NrKGRldik7Ci0JCQliNDNfcmFkaW9fbG9jayhkZXYpOwotCQkJYjQzX3NldF90eHBvd2VyX2coZGV2LCAmcGh5LT5iYmF0dCwgJnBoeS0+cmZhdHQsCi0JCQkJCSAgcGh5LT50eF9jb250cm9sKTsKLQkJCWI0M19yYWRpb191bmxvY2soZGV2KTsKLQkJCWI0M19waHlfdW5sb2NrKGRldik7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQjQzX1BIWVRZUEVfTjoKLQkJYjQzX25waHlfeG1pdHBvd2VyKGRldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBzMzIgYjQzX3Rzc2kyZGJtX2FkKHMzMiBudW0sIHMzMiBkZW4pCi17Ci0JaWYgKG51bSA8IDApCi0JCXJldHVybiBudW0gLyBkZW47Ci0JZWxzZQotCQlyZXR1cm4gKG51bSArIGRlbiAvIDIpIC8gZGVuOwotfQotCi1zdGF0aWMgaW5saW5lCi0gICAgczggYjQzX3Rzc2kyZGJtX2VudHJ5KHM4IGVudHJ5W10sIHU4IGluZGV4LCBzMTYgcGFiMCwgczE2IHBhYjEsIHMxNiBwYWIyKQotewotCXMzMiBtMSwgbTIsIGYgPSAyNTYsIHEsIGRlbHRhOwotCXM4IGkgPSAwOwotCi0JbTEgPSBiNDNfdHNzaTJkYm1fYWQoMTYgKiBwYWIwICsgaW5kZXggKiBwYWIxLCAzMik7Ci0JbTIgPSBtYXgoYjQzX3Rzc2kyZGJtX2FkKDMyNzY4ICsgaW5kZXggKiBwYWIyLCAyNTYpLCAxKTsKLQlkbyB7Ci0JCWlmIChpID4gMTUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcSA9IGI0M190c3NpMmRibV9hZChmICogNDA5NiAtCi0JCQkJICAgIGI0M190c3NpMmRibV9hZChtMiAqIGYsIDE2KSAqIGYsIDIwNDgpOwotCQlkZWx0YSA9IGFicyhxIC0gZik7Ci0JCWYgPSBxOwotCQlpKys7Ci0JfSB3aGlsZSAoZGVsdGEgPj0gMik7Ci0JZW50cnlbaW5kZXhdID0gY2xhbXBfdmFsKGI0M190c3NpMmRibV9hZChtMSAqIGYsIDgxOTIpLCAtMTI3LCAxMjgpOwotCXJldHVybiAwOwotfQotCi0vKiBodHRwOi8vYmNtLXNwZWNzLnNpcHNvbHV0aW9ucy5uZXQvVFNTSV90b19EQk1fVGFibGUgKi8KLWludCBiNDNfcGh5X2luaXRfdHNzaTJkYm1fdGFibGUoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0JczE2IHBhYjAsIHBhYjEsIHBhYjI7Ci0JdTggaWR4OwotCXM4ICpkeW5fdHNzaTJkYm07Ci0KLQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0EpIHsKLQkJcGFiMCA9IChzMTYpIChkZXYtPmRldi0+YnVzLT5zcHJvbS5wYTFiMCk7Ci0JCXBhYjEgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGExYjEpOwotCQlwYWIyID0gKHMxNikgKGRldi0+ZGV2LT5idXMtPnNwcm9tLnBhMWIyKTsKLQl9IGVsc2UgewotCQlwYWIwID0gKHMxNikgKGRldi0+ZGV2LT5idXMtPnNwcm9tLnBhMGIwKTsKLQkJcGFiMSA9IChzMTYpIChkZXYtPmRldi0+YnVzLT5zcHJvbS5wYTBiMSk7Ci0JCXBhYjIgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGEwYjIpOwotCX0KLQotCWlmICgoZGV2LT5kZXYtPmJ1cy0+Y2hpcF9pZCA9PSAweDQzMDEpICYmIChwaHktPnJhZGlvX3ZlciAhPSAweDIwNTApKSB7Ci0JCXBoeS0+dGd0X2lkbGVfdHNzaSA9IDB4MzQ7Ci0JCXBoeS0+dHNzaTJkYm0gPSBiNDNfdHNzaTJkYm1fYl90YWJsZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHBhYjAgIT0gMCAmJiBwYWIxICE9IDAgJiYgcGFiMiAhPSAwICYmCi0JICAgIHBhYjAgIT0gLTEgJiYgcGFiMSAhPSAtMSAmJiBwYWIyICE9IC0xKSB7Ci0JCS8qIFRoZSBwYWJYIHZhbHVlcyBhcmUgc2V0IGluIFNQUk9NLiBVc2UgdGhlbS4gKi8KLQkJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9BKSB7Ci0JCQlpZiAoKHM4KSBkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9hICE9IDAgJiYKLQkJCSAgICAoczgpIGRldi0+ZGV2LT5idXMtPnNwcm9tLml0c3NpX2EgIT0gLTEpCi0JCQkJcGh5LT50Z3RfaWRsZV90c3NpID0KLQkJCQkgICAgKHM4KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20uaXRzc2lfYSk7Ci0JCQllbHNlCi0JCQkJcGh5LT50Z3RfaWRsZV90c3NpID0gNjI7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHM4KSBkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyAhPSAwICYmCi0JCQkgICAgKHM4KSBkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyAhPSAtMSkKLQkJCQlwaHktPnRndF9pZGxlX3Rzc2kgPQotCQkJCSAgICAoczgpIChkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyk7Ci0JCQllbHNlCi0JCQkJcGh5LT50Z3RfaWRsZV90c3NpID0gNjI7Ci0JCX0KLQkJZHluX3Rzc2kyZGJtID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkeW5fdHNzaTJkYm0gPT0gTlVMTCkgewotCQkJYjQzZXJyKGRldi0+d2wsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5ICIKLQkJCSAgICAgICAiZm9yIHRzc2kyZGJtIHRhYmxlXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgNjQ7IGlkeCsrKQotCQkJaWYgKGI0M190c3NpMmRibV9lbnRyeQotCQkJICAgIChkeW5fdHNzaTJkYm0sIGlkeCwgcGFiMCwgcGFiMSwgcGFiMikpIHsKLQkJCQlwaHktPnRzc2kyZGJtID0gTlVMTDsKLQkJCQliNDNlcnIoZGV2LT53bCwgIkNvdWxkIG5vdCBnZW5lcmF0ZSAiCi0JCQkJICAgICAgICJ0c3NpMmRCbSB0YWJsZVxuIik7Ci0JCQkJa2ZyZWUoZHluX3Rzc2kyZGJtKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJcGh5LT50c3NpMmRibSA9IGR5bl90c3NpMmRibTsKLQkJcGh5LT5keW5fdHNzaV90YmwgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIHBhYlggdmFsdWVzIG5vdCBzZXQgaW4gU1BST00uICovCi0JCXN3aXRjaCAocGh5LT50eXBlKSB7Ci0JCWNhc2UgQjQzX1BIWVRZUEVfQToKLQkJCS8qIEFQSFkgbmVlZHMgYSBnZW5lcmF0ZWQgdGFibGUuICovCi0JCQlwaHktPnRzc2kyZGJtID0gTlVMTDsKLQkJCWI0M2VycihkZXYtPndsLCAiQ291bGQgbm90IGdlbmVyYXRlIHRzc2kyZEJtICIKLQkJCSAgICAgICAidGFibGUgKHdyb25nIFNQUk9NIGluZm8pIVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJY2FzZSBCNDNfUEhZVFlQRV9COgotCQkJcGh5LT50Z3RfaWRsZV90c3NpID0gMHgzNDsKLQkJCXBoeS0+dHNzaTJkYm0gPSBiNDNfdHNzaTJkYm1fYl90YWJsZTsKLQkJCWJyZWFrOwotCQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCQlwaHktPnRndF9pZGxlX3Rzc2kgPSAweDM0OwotCQkJcGh5LT50c3NpMmRibSA9IGI0M190c3NpMmRibV9nX3RhYmxlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGI0M19waHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQlib29sIHVuc3VwcG9ydGVkID0gMDsKLQlpbnQgZXJyID0gMDsKLQotCXN3aXRjaCAocGh5LT50eXBlKSB7Ci0JY2FzZSBCNDNfUEhZVFlQRV9BOgotCQlpZiAocGh5LT5yZXYgPT0gMiB8fCBwaHktPnJldiA9PSAzKQotCQkJYjQzX3BoeV9pbml0YShkZXYpOwotCQllbHNlCi0JCQl1bnN1cHBvcnRlZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfRzoKLQkJYjQzX3BoeV9pbml0ZyhkZXYpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX046Ci0JCWVyciA9IGI0M19waHlfaW5pdG4oZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdW5zdXBwb3J0ZWQgPSAxOwotCX0KLQlpZiAodW5zdXBwb3J0ZWQpCi0JCWI0M2VycihkZXYtPndsLCAiVW5rbm93biBQSFlUWVBFIGZvdW5kXG4iKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXZvaWQgYjQzX3NldF9yeF9hbnRlbm5hKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgaW50IGFudGVubmEpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQl1NjQgaGY7Ci0JdTE2IHRtcDsKLQlpbnQgYXV0b2RpdiA9IDA7Ci0KLQlpZiAoYW50ZW5uYSA9PSBCNDNfQU5URU5OQV9BVVRPMCB8fCBhbnRlbm5hID09IEI0M19BTlRFTk5BX0FVVE8xKQotCQlhdXRvZGl2ID0gMTsKLQotCWhmID0gYjQzX2hmX3JlYWQoZGV2KTsKLQloZiAmPSB+QjQzX0hGX0FOVERJVkhFTFA7Ci0JYjQzX2hmX3dyaXRlKGRldiwgaGYpOwotCi0Jc3dpdGNoIChwaHktPnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JY2FzZSBCNDNfUEhZVFlQRV9HOgotCQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0JCQU5EQ0ZHKTsKLQkJdG1wICY9IH5CNDNfUEhZX0JCQU5EQ0ZHX1JYQU5UOwotCQl0bXAgfD0gKGF1dG9kaXYgPyBCNDNfQU5URU5OQV9BVVRPMCA6IGFudGVubmEpCi0JCSAgICA8PCBCNDNfUEhZX0JCQU5EQ0ZHX1JYQU5UX1NISUZUOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9CQkFORENGRywgdG1wKTsKLQotCQlpZiAoYXV0b2RpdikgewotCQkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTlREV0VMTCk7Ci0JCQlpZiAoYW50ZW5uYSA9PSBCNDNfQU5URU5OQV9BVVRPMCkKLQkJCQl0bXAgJj0gfkI0M19QSFlfQU5URFdFTExfQVVUT0RJVjE7Ci0JCQllbHNlCi0JCQkJdG1wIHw9IEI0M19QSFlfQU5URFdFTExfQVVUT0RJVjE7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTlREV0VMTCwgdG1wKTsKLQkJfQotCQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0cpIHsKLQkJCXRtcCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5UV1JTRVRUKTsKLQkJCWlmIChhdXRvZGl2KQotCQkJCXRtcCB8PSBCNDNfUEhZX0FOVFdSU0VUVF9BUlhESVY7Ci0JCQllbHNlCi0JCQkJdG1wICY9IH5CNDNfUEhZX0FOVFdSU0VUVF9BUlhESVY7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTlRXUlNFVFQsIHRtcCk7Ci0JCQlpZiAocGh5LT5yZXYgPj0gMikgewotCQkJCXRtcCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETTYxKTsKLQkJCQl0bXAgfD0gQjQzX1BIWV9PRkRNNjFfMTA7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETTYxLCB0bXApOwotCi0JCQkJdG1wID0KLQkJCQkgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9ESVZTUkNIR0FJTkJBQ0spOwotCQkJCXRtcCA9ICh0bXAgJiAweEZGMDApIHwgMHgxNTsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9ESVZTUkNIR0FJTkJBQ0ssCi0JCQkJCSAgICAgIHRtcCk7Ci0KLQkJCQlpZiAocGh5LT5yZXYgPT0gMikgewotCQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BRElWUkVMQVRFRCwKLQkJCQkJCSAgICAgIDgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRtcCA9Ci0JCQkJCSAgICBiNDNfcGh5X3JlYWQoZGV2LAotCQkJCQkJCSBCNDNfUEhZX0FESVZSRUxBVEVEKTsKLQkJCQkJdG1wID0gKHRtcCAmIDB4RkYwMCkgfCA4OwotCQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BRElWUkVMQVRFRCwKLQkJCQkJCSAgICAgIHRtcCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBoeS0+cmV2ID49IDYpCi0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETTlCLCAweERDKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwaHktPnJldiA8IDMpIHsKLQkJCQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOVERXRUxMKTsKLQkJCQl0bXAgPSAodG1wICYgMHhGRjAwKSB8IDB4MjQ7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5URFdFTEwsIHRtcCk7Ci0JCQl9IGVsc2UgewotCQkJCXRtcCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETTYxKTsKLQkJCQl0bXAgfD0gMHgxMDsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNNjEsIHRtcCk7Ci0JCQkJaWYgKHBoeS0+YW5hbG9nID09IDMpIHsKLQkJCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0xJUFBXUkRPV05ULAotCQkJCQkJICAgICAgMHgxRCk7Ci0JCQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FESVZSRUxBVEVELAotCQkJCQkJICAgICAgOCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0xJUFBXUkRPV05ULAotCQkJCQkJICAgICAgMHgzQSk7Ci0JCQkJCXRtcCA9Ci0JCQkJCSAgICBiNDNfcGh5X3JlYWQoZGV2LAotCQkJCQkJCSBCNDNfUEhZX0FESVZSRUxBVEVEKTsKLQkJCQkJdG1wID0gKHRtcCAmIDB4RkYwMCkgfCA4OwotCQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BRElWUkVMQVRFRCwKLQkJCQkJCSAgICAgIHRtcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfQjoKLQkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0tCQkFORENGRyk7Ci0JCXRtcCAmPSB+QjQzX1BIWV9CQkFORENGR19SWEFOVDsKLQkJdG1wIHw9IChhdXRvZGl2ID8gQjQzX0FOVEVOTkFfQVVUTzAgOiBhbnRlbm5hKQotCQkgICAgPDwgQjQzX1BIWV9CQkFORENGR19SWEFOVF9TSElGVDsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLQkJBTkRDRkcsIHRtcCk7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfTjoKLQkJYjQzX25waHlfc2V0X3J4YW50ZW5uYShkZXYsIGFudGVubmEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci0KLQloZiB8PSBCNDNfSEZfQU5URElWSEVMUDsKLQliNDNfaGZfd3JpdGUoZGV2LCBoZik7Ci19Ci0KLS8qIEdldCB0aGUgZnJlcSwgYXMgaXQgaGFzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZS4gKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGNoYW5uZWwyZnJlcV9iZyh1OCBjaGFubmVsKQotewotCUI0M19XQVJOX09OKCEoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpKTsKLQotCXJldHVybiBiNDNfcmFkaW9fY2hhbm5lbF9jb2Rlc19iZ1tjaGFubmVsIC0gMV07Ci19Ci0KLS8qIEdldCB0aGUgZnJlcSwgYXMgaXQgaGFzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZS4gKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGNoYW5uZWwyZnJlcV9hKHU4IGNoYW5uZWwpCi17Ci0JQjQzX1dBUk5fT04oY2hhbm5lbCA+IDIwMCk7Ci0KLQlyZXR1cm4gKDUwMDAgKyA1ICogY2hhbm5lbCk7Ci19Ci0KLXZvaWQgYjQzX3JhZGlvX2xvY2soc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXUzMiBtYWNjdGw7Ci0KLQltYWNjdGwgPSBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsKLQlCNDNfV0FSTl9PTihtYWNjdGwgJiBCNDNfTUFDQ1RMX1JBRElPTE9DSyk7Ci0JbWFjY3RsIHw9IEI0M19NQUNDVExfUkFESU9MT0NLOwotCWI0M193cml0ZTMyKGRldiwgQjQzX01NSU9fTUFDQ1RMLCBtYWNjdGwpOwotCS8qIENvbW1pdCB0aGUgd3JpdGUgYW5kIHdhaXQgZm9yIHRoZSBkZXZpY2UKLQkgKiB0byBleGl0IGFueSByYWRpbyByZWdpc3RlciBhY2Nlc3MuICovCi0JYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7Ci0JdWRlbGF5KDEwKTsKLX0KLQotdm9pZCBiNDNfcmFkaW9fdW5sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQl1MzIgbWFjY3RsOwotCi0JLyogQ29tbWl0IGFueSB3cml0ZSAqLwotCWI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFlfVkVSKTsKLQkvKiB1bmxvY2sgKi8KLQltYWNjdGwgPSBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsKLQlCNDNfV0FSTl9PTighKG1hY2N0bCAmIEI0M19NQUNDVExfUkFESU9MT0NLKSk7Ci0JbWFjY3RsICY9IH5CNDNfTUFDQ1RMX1JBRElPTE9DSzsKLQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwgbWFjY3RsKTsKLX0KLQotdTE2IGI0M19yYWRpb19yZWFkMTYoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0KLQkvKiBPZmZzZXQgMSBpcyBhIDMyLWJpdCByZWdpc3Rlci4gKi8KLQlCNDNfV0FSTl9PTihvZmZzZXQgPT0gMSk7Ci0KLQlzd2l0Y2ggKHBoeS0+dHlwZSkgewotCWNhc2UgQjQzX1BIWVRZUEVfQToKLQkJb2Zmc2V0IHw9IDB4NDA7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfQjoKLQkJaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MykgewotCQkJaWYgKG9mZnNldCA8IDB4NzApCi0JCQkJb2Zmc2V0ICs9IDB4ODA7Ci0JCQllbHNlIGlmIChvZmZzZXQgPCAweDgwKQotCQkJCW9mZnNldCArPSAweDcwOwotCQl9IGVsc2UgaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCkgewotCQkJb2Zmc2V0IHw9IDB4ODA7Ci0JCX0gZWxzZQotCQkJQjQzX1dBUk5fT04oMSk7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfRzoKLQkJb2Zmc2V0IHw9IDB4ODA7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX1BIWVRZUEVfTjoKLQkJb2Zmc2V0IHw9IDB4MTAwOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0xQOgotCQkvKiBObyBhZGp1c3RtZW50IHJlcXVpcmVkLiAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci0KLQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsIG9mZnNldCk7Ci0JcmV0dXJuIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0xPVyk7Ci19Ci0KLXZvaWQgYjQzX3JhZGlvX3dyaXRlMTYoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgdmFsKQotewotCS8qIE9mZnNldCAxIGlzIGEgMzItYml0IHJlZ2lzdGVyLiAqLwotCUI0M19XQVJOX09OKG9mZnNldCA9PSAxKTsKLQotCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fQ09OVFJPTCwgb2Zmc2V0KTsKLQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0RBVEFfTE9XLCB2YWwpOwotfQotCi12b2lkIGI0M19yYWRpb19tYXNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2spCi17Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBvZmZzZXQsCi0JCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCBvZmZzZXQpICYgbWFzayk7Ci19Ci0KLXZvaWQgYjQzX3JhZGlvX3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBzZXQpCi17Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBvZmZzZXQsCi0JCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCBvZmZzZXQpIHwgc2V0KTsKLX0KLQotdm9pZCBiNDNfcmFkaW9fbWFza3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBtYXNrLCB1MTYgc2V0KQotewotCWI0M19yYWRpb193cml0ZTE2KGRldiwgb2Zmc2V0LAotCQkJICAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19zZXRfYWxsX2dhaW5zKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCSAgICAgIHMxNiBmaXJzdCwgczE2IHNlY29uZCwgczE2IHRoaXJkKQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0JdTE2IGk7Ci0JdTE2IHN0YXJ0ID0gMHgwOCwgZW5kID0gMHgxODsKLQl1MTYgdG1wOwotCXUxNiB0YWJsZTsKLQotCWlmIChwaHktPnJldiA8PSAxKSB7Ci0JCXN0YXJ0ID0gMHgxMDsKLQkJZW5kID0gMHgyMDsKLQl9Ci0KLQl0YWJsZSA9IEI0M19PRkRNVEFCX0dBSU5YOwotCWlmIChwaHktPnJldiA8PSAxKQotCQl0YWJsZSA9IEI0M19PRkRNVEFCX0dBSU5YX1IxOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCB0YWJsZSwgaSwgZmlyc3QpOwotCi0JZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykKLQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIHRhYmxlLCBpLCBzZWNvbmQpOwotCi0JaWYgKHRoaXJkICE9IC0xKSB7Ci0JCXRtcCA9ICgodTE2KSB0aGlyZCA8PCAxNCkgfCAoKHUxNikgdGhpcmQgPDwgNik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTAsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEwKSAmIDB4QkZCRikgfCB0bXApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEExLAotCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMSkgJiAweEJGQkYpIHwgdG1wKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMiwKLQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTIpICYgMHhCRkJGKSB8IHRtcCk7Ci0JfQotCWI0M19kdW1teV90cmFuc21pc3Npb24oZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3NldF9vcmlnaW5hbF9nYWlucyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQl1MTYgaSwgdG1wOwotCXUxNiB0YWJsZTsKLQl1MTYgc3RhcnQgPSAweDAwMDgsIGVuZCA9IDB4MDAxODsKLQotCWlmIChwaHktPnJldiA8PSAxKSB7Ci0JCXN0YXJ0ID0gMHgwMDEwOwotCQllbmQgPSAweDAwMjA7Ci0JfQotCi0JdGFibGUgPSBCNDNfT0ZETVRBQl9HQUlOWDsKLQlpZiAocGh5LT5yZXYgPD0gMSkKLQkJdGFibGUgPSBCNDNfT0ZETVRBQl9HQUlOWF9SMTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXRtcCA9IChpICYgMHhGRkZDKTsKLQkJdG1wIHw9IChpICYgMHgwMDAxKSA8PCAxOwotCQl0bXAgfD0gKGkgJiAweDAwMDIpID4+IDE7Ci0KLQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIHRhYmxlLCBpLCB0bXApOwotCX0KLQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspCi0JCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCB0YWJsZSwgaSwgaSAtIHN0YXJ0KTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTAsCi0JCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTApICYgMHhCRkJGKSB8IDB4NDA0MCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMSwKLQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMSkgJiAweEJGQkYpIHwgMHg0MDQwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEyLAotCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEyKSAmIDB4QkZCRikgfCAweDQwMDApOwotCWI0M19kdW1teV90cmFuc21pc3Npb24oZGV2KTsKLX0KLQotLyogU3ludGhldGljIFBVIHdvcmthcm91bmQgKi8KLXN0YXRpYyB2b2lkIGI0M19zeW50aF9wdV93b3JrYXJvdW5kKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCWlmIChwaHktPnJhZGlvX3ZlciAhPSAweDIwNTAgfHwgcGh5LT5yYWRpb19yZXYgPj0gNikgewotCQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgd29ya2Fyb3VuZC4gKi8KLQkJcmV0dXJuOwotCX0KLQotCWlmIChjaGFubmVsIDw9IDEwKSB7Ci0JCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTCwKLQkJCSAgICBjaGFubmVsMmZyZXFfYmcoY2hhbm5lbCArIDQpKTsKLQl9IGVsc2UgewotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUwsIGNoYW5uZWwyZnJlcV9iZygxKSk7Ci0JfQotCW1zbGVlcCgxKTsKLQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUwsIGNoYW5uZWwyZnJlcV9iZyhjaGFubmVsKSk7Ci19Ci0KLXU4IGI0M19yYWRpb19hY2lfZGV0ZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXU4IHJldCA9IDA7Ci0JdTE2IHNhdmVkLCByc3NpLCB0ZW1wOwotCWludCBpLCBqID0gMDsKLQotCXNhdmVkID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwNDAzKTsKLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIGNoYW5uZWwsIDApOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MDMsIChzYXZlZCAmIDB4RkZGOCkgfCA1KTsKLQlpZiAocGh5LT5hY2lfaHdfcnNzaSkKLQkJcnNzaSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDQ4QSkgJiAweDNGOwotCWVsc2UKLQkJcnNzaSA9IHNhdmVkICYgMHgzRjsKLQkvKiBjbGFtcCB0ZW1wIHRvIHNpZ25lZCA1Yml0ICovCi0JaWYgKHJzc2kgPiAzMikKLQkJcnNzaSAtPSA2NDsKLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJdGVtcCA9IChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYgMHgzRjsKLQkJaWYgKHRlbXAgPiAzMikKLQkJCXRlbXAgLT0gNjQ7Ci0JCWlmICh0ZW1wIDwgcnNzaSkKLQkJCWorKzsKLQkJaWYgKGogPj0gMjApCi0JCQlyZXQgPSAxOwotCX0KLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDAzLCBzYXZlZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi11OCBiNDNfcmFkaW9fYWNpX3NjYW4oc3RydWN0IGI0M193bGRldiAqIGRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXU4IHJldFsxM107Ci0JdW5zaWduZWQgaW50IGNoYW5uZWwgPSBwaHktPmNoYW5uZWw7Ci0JdW5zaWduZWQgaW50IGksIGosIHN0YXJ0LCBlbmQ7Ci0KLQlpZiAoISgocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0cpICYmIChwaHktPnJldiA+IDApKSkKLQkJcmV0dXJuIDA7Ci0KLQliNDNfcGh5X2xvY2soZGV2KTsKLQliNDNfcmFkaW9fbG9jayhkZXYpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgJiAweEZGRkMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAotCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0dfQ1JTKSAmIDB4N0ZGRik7Ci0JYjQzX3NldF9hbGxfZ2FpbnMoZGV2LCAzLCA4LCAxKTsKLQotCXN0YXJ0ID0gKGNoYW5uZWwgLSA1ID4gMCkgPyBjaGFubmVsIC0gNSA6IDE7Ci0JZW5kID0gKGNoYW5uZWwgKyA1IDwgMTQpID8gY2hhbm5lbCArIDUgOiAxMzsKLQotCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7Ci0JCWlmIChhYnMoY2hhbm5lbCAtIGkpID4gMikKLQkJCXJldFtpIC0gMV0gPSBiNDNfcmFkaW9fYWNpX2RldGVjdChkZXYsIGkpOwotCX0KLQliNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIGNoYW5uZWwsIDApOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsCi0JCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDIpICYgMHhGRkZDKSB8IDB4MDAwMyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDQwMywgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDAzKSAmIDB4RkZGOCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfR19DUlMsCi0JCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19DUlMpIHwgMHg4MDAwKTsKLQliNDNfc2V0X29yaWdpbmFsX2dhaW5zKGRldik7Ci0JZm9yIChpID0gMDsgaSA8IDEzOyBpKyspIHsKLQkJaWYgKCFyZXRbaV0pCi0JCQljb250aW51ZTsKLQkJZW5kID0gKGkgKyA1IDwgMTMpID8gaSArIDUgOiAxMzsKLQkJZm9yIChqID0gaTsgaiA8IGVuZDsgaisrKQotCQkJcmV0W2pdID0gMTsKLQl9Ci0JYjQzX3JhZGlvX3VubG9jayhkZXYpOwotCWI0M19waHlfdW5sb2NrKGRldik7Ci0KLQlyZXR1cm4gcmV0W2NoYW5uZWwgLSAxXTsKLX0KLQotLyogaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L05SU1NJTG9va3VwVGFibGUgKi8KLXZvaWQgYjQzX25yc3NpX2h3X3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgczE2IHZhbCkKLXsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9OUlNTSUxUX0NUUkwsIG9mZnNldCk7Ci0JbW1pb3diKCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTlJTU0lMVF9EQVRBLCAodTE2KSB2YWwpOwotfQotCi0vKiBodHRwOi8vYmNtLXNwZWNzLnNpcHNvbHV0aW9ucy5uZXQvTlJTU0lMb29rdXBUYWJsZSAqLwotczE2IGI0M19ucnNzaV9od19yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCkKLXsKLQl1MTYgdmFsOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTlJTU0lMVF9DVFJMLCBvZmZzZXQpOwotCXZhbCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTlJTU0lMVF9EQVRBKTsKLQotCXJldHVybiAoczE2KSB2YWw7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9OUlNTSUxvb2t1cFRhYmxlICovCi12b2lkIGI0M19ucnNzaV9od191cGRhdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgdmFsKQotewotCXUxNiBpOwotCXMxNiB0bXA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQl0bXAgPSBiNDNfbnJzc2lfaHdfcmVhZChkZXYsIGkpOwotCQl0bXAgLT0gdmFsOwotCQl0bXAgPSBjbGFtcF92YWwodG1wLCAtMzIsIDMxKTsKLQkJYjQzX25yc3NpX2h3X3dyaXRlKGRldiwgaSwgdG1wKTsKLQl9Ci19Ci0KLS8qIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9OUlNTSUxvb2t1cFRhYmxlICovCi12b2lkIGI0M19ucnNzaV9tZW1fdXBkYXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXMxNiBpLCBkZWx0YTsKLQlzMzIgdG1wOwotCi0JZGVsdGEgPSAweDFGIC0gcGh5LT5ucnNzaVswXTsKLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCQl0bXAgPSAoaSAtIGRlbHRhKSAqIHBoeS0+bnJzc2lzbG9wZTsKLQkJdG1wIC89IDB4MTAwMDA7Ci0JCXRtcCArPSAweDNBOwotCQl0bXAgPSBjbGFtcF92YWwodG1wLCAwLCAweDNGKTsKLQkJcGh5LT5ucnNzaV9sdFtpXSA9IHRtcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19jYWxjX25yc3NpX29mZnNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQl1MTYgYmFja3VwWzIwXSA9IHsgMCB9OwotCXMxNiB2NDdGOwotCXUxNiBpOwotCXUxNiBzYXZlZCA9IDB4RkZGRjsKLQotCWJhY2t1cFswXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAwMSk7Ci0JYmFja3VwWzFdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwODExKTsKLQliYWNrdXBbMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTIpOwotCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCi0JCWJhY2t1cFszXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCk7Ci0JCWJhY2t1cFs0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgxNSk7Ci0JfQotCWJhY2t1cFs1XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1QSk7Ci0JYmFja3VwWzZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDU5KTsKLQliYWNrdXBbN10gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNTgpOwotCWJhY2t1cFs4XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAwQSk7Ci0JYmFja3VwWzldID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDAzKTsKLQliYWNrdXBbMTBdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSk7Ci0JYmFja3VwWzExXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNDMpOwotCi0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyOSwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDI5KSAmIDB4N0ZGRik7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAwMSwKLQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDAwMSkgJiAweDNGRkYpIHwgMHg0MDAwKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODExLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpIHwgMHgwMDBDKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAotCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSAmIDB4RkZGMykgfCAweDAwMDQpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgJiB+KDB4MSB8IDB4MikpOwotCWlmIChwaHktPnJldiA+PSA2KSB7Ci0JCWJhY2t1cFsxMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMkUpOwotCQliYWNrdXBbMTNdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDJGKTsKLQkJYmFja3VwWzE0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgwRik7Ci0JCWJhY2t1cFsxNV0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTApOwotCQliYWNrdXBbMTZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwODAxKTsKLQkJYmFja3VwWzE3XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA2MCk7Ci0JCWJhY2t1cFsxOF0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMTQpOwotCQliYWNrdXBbMTldID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwNDc4KTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRiwgMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MEYsIDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEwLCAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQ3OCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDc4KSB8IDB4MDEwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkgfCAweDAwNDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApIHwgMHgwMDQwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDE0KSB8IDB4MDIwMCk7Ci0JfQotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDA3MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDgwKTsKLQl1ZGVsYXkoMzApOwotCi0JdjQ3RiA9IChzMTYpICgoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdGKSA+PiA4KSAmIDB4MDAzRik7Ci0JaWYgKHY0N0YgPj0gMHgyMCkKLQkJdjQ3RiAtPSAweDQwOwotCWlmICh2NDdGID09IDMxKSB7Ci0JCWZvciAoaSA9IDc7IGkgPj0gNDsgaS0tKSB7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QiwgaSk7Ci0JCQl1ZGVsYXkoMjApOwotCQkJdjQ3RiA9Ci0JCQkgICAgKHMxNikgKChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYgMHgwMDNGKTsKLQkJCWlmICh2NDdGID49IDB4MjApCi0JCQkJdjQ3RiAtPSAweDQwOwotCQkJaWYgKHY0N0YgPCAzMSAmJiBzYXZlZCA9PSAweEZGRkYpCi0JCQkJc2F2ZWQgPSBpOwotCQl9Ci0JCWlmIChzYXZlZCA9PSAweEZGRkYpCi0JCQlzYXZlZCA9IDQ7Ci0JfSBlbHNlIHsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCi0JCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSAmIDB4MDA3Rik7Ci0JCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODE0LAotCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCkgfCAweDAwMDEpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTUpICYgMHhGRkZFKTsKLQkJfQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODExLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpIHwgMHgwMDBDKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSB8IDB4MDAwQyk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTEsIGI0M19waHlfcmVhZChkZXYsIDB4MDgxMSkgfCAweDAwMzApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTIpIHwgMHgwMDMwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgMHgwNDgwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OSwgMHgwODEwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OCwgMHgwMDBEKTsKLQkJaWYgKHBoeS0+cmV2ID09IDApIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMDMsIDB4MDEyMik7Ci0JCX0gZWxzZSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDBBLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMEEpCi0JCQkJICAgICAgfCAweDIwMDApOwotCQl9Ci0JCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODE0LAotCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCkgfCAweDAwMDQpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTUpICYgMHhGRkZCKTsKLQkJfQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAzLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDAzKSAmIDB4RkY5RikKLQkJCSAgICAgIHwgMHgwMDQwKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCi0JCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDAwRik7Ci0JCWI0M19zZXRfYWxsX2dhaW5zKGRldiwgMywgMCwgMSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA0MykKLQkJCQkJCSYgMHgwMEYwKSB8IDB4MDAwRik7Ci0JCXVkZWxheSgzMCk7Ci0JCXY0N0YgPSAoczE2KSAoKGI0M19waHlfcmVhZChkZXYsIDB4MDQ3RikgPj4gOCkgJiAweDAwM0YpOwotCQlpZiAodjQ3RiA+PSAweDIwKQotCQkJdjQ3RiAtPSAweDQwOwotCQlpZiAodjQ3RiA9PSAtMzIpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QiwgaSk7Ci0JCQkJdWRlbGF5KDIwKTsKLQkJCQl2NDdGID0KLQkJCQkgICAgKHMxNikgKChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYKLQkJCQkJICAgMHgwMDNGKTsKLQkJCQlpZiAodjQ3RiA+PSAweDIwKQotCQkJCQl2NDdGIC09IDB4NDA7Ci0JCQkJaWYgKHY0N0YgPiAtMzEgJiYgc2F2ZWQgPT0gMHhGRkZGKQotCQkJCQlzYXZlZCA9IGk7Ci0JCQl9Ci0JCQlpZiAoc2F2ZWQgPT0gMHhGRkZGKQotCQkJCXNhdmVkID0gMzsKLQkJfSBlbHNlCi0JCQlzYXZlZCA9IDA7Ci0JfQotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdCLCBzYXZlZCk7Ci0KLQlpZiAocGh5LT5yZXYgPj0gNikgewotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCBiYWNrdXBbMTJdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRiwgYmFja3VwWzEzXSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MEYsIGJhY2t1cFsxNF0pOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEwLCBiYWNrdXBbMTVdKTsKLQl9Ci0JaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNCwgYmFja3VwWzNdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwgYmFja3VwWzRdKTsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgYmFja3VwWzVdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU5LCBiYWNrdXBbNl0pOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNTgsIGJhY2t1cFs3XSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDAwQSwgYmFja3VwWzhdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAzLCBiYWNrdXBbOV0pOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLCBiYWNrdXBbMTFdKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwgYmFja3VwWzEwXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSB8IDB4MSB8IDB4Mik7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyOSwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDI5KSB8IDB4ODAwMCk7Ci0JYjQzX3NldF9vcmlnaW5hbF9nYWlucyhkZXYpOwotCWlmIChwaHktPnJldiA+PSA2KSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsIGJhY2t1cFsxNl0pOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiYWNrdXBbMTddKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgYmFja3VwWzE4XSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0NzgsIGJhY2t1cFsxOV0pOwotCX0KLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAxLCBiYWNrdXBbMF0pOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTIsIGJhY2t1cFsyXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwgYmFja3VwWzFdKTsKLX0KLQotdm9pZCBiNDNfY2FsY19ucnNzaV9zbG9wZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQl1MTYgYmFja3VwWzE4XSA9IHsgMCB9OwotCXUxNiB0bXA7Ci0JczE2IG5yc3NpMCwgbnJzc2kxOwotCi0Jc3dpdGNoIChwaHktPnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0I6Ci0JCWJhY2t1cFswXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpOwotCQliYWNrdXBbMV0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDUyKTsKLQkJYmFja3VwWzJdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA0Myk7Ci0JCWJhY2t1cFszXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAzMCk7Ci0JCWJhY2t1cFs0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAyNik7Ci0JCWJhY2t1cFs1XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAxNSk7Ci0JCWJhY2t1cFs2XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAyQSk7Ci0JCWJhY2t1cFs3XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAyMCk7Ci0JCWJhY2t1cFs4XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1QSk7Ci0JCWJhY2t1cFs5XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1OSk7Ci0JCWJhY2t1cFsxMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNTgpOwotCQliYWNrdXBbMTFdID0gYjQzX3JlYWQxNihkZXYsIDB4MDNFMik7Ci0JCWJhY2t1cFsxMl0gPSBiNDNfcmVhZDE2KGRldiwgMHgwM0U2KTsKLQkJYmFja3VwWzEzXSA9IGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCk7Ci0KLQkJdG1wID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSk7Ci0JCXRtcCAmPSAocGh5LT5yZXYgPj0gNSkgPyAweDAwN0YgOiAweDAwMEY7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCB0bXApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDMwLCAweDAwRkYpOwotCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFQywgMHg3RjdGKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyNiwgMHgwMDAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDE1KSB8IDB4MDAyMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkEsIDB4MDhBMyk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgfCAweDAwODApOwotCi0JCW5yc3NpMCA9IChzMTYpIGI0M19waHlfcmVhZChkZXYsIDB4MDAyNyk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgJiAweDAwN0YpOwotCQlpZiAocGh5LT5yZXYgPj0gMikgewotCQkJYjQzX3dyaXRlMTYoZGV2LCAweDAzRTYsIDB4MDA0MCk7Ci0JCX0gZWxzZSBpZiAocGh5LT5yZXYgPT0gMCkgewotCQkJYjQzX3dyaXRlMTYoZGV2LCAweDAzRTYsIDB4MDEyMik7Ci0JCX0gZWxzZSB7Ci0JCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhULAotCQkJCSAgICBiNDNfcmVhZDE2KGRldiwKLQkJCQkJICAgICAgIEI0M19NTUlPX0NIQU5ORUxfRVhUKSAmIDB4MjAwMCk7Ci0JCX0KLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyMCwgMHgzRjNGKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgMHhGMzMwKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNUEsIDB4MDA2MCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA0MykgJiAweDAwRjApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDVBLCAweDA0ODApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU5LCAweDA4MTApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU4LCAweDAwMEQpOwotCQl1ZGVsYXkoMjApOwotCi0JCW5yc3NpMSA9IChzMTYpIGI0M19waHlfcmVhZChkZXYsIDB4MDAyNyk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzAsIGJhY2t1cFszXSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiYWNrdXBbMF0pOwotCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFMiwgYmFja3VwWzExXSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjYsIGJhY2t1cFs0XSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTUsIGJhY2t1cFs1XSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkEsIGJhY2t1cFs2XSk7Ci0JCWI0M19zeW50aF9wdV93b3JrYXJvdW5kKGRldiwgcGh5LT5jaGFubmVsKTsKLQkJaWYgKHBoeS0+cmV2ICE9IDApCi0JCQliNDNfd3JpdGUxNihkZXYsIDB4MDNGNCwgYmFja3VwWzEzXSk7Ci0KLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyMCwgYmFja3VwWzddKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgYmFja3VwWzhdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OSwgYmFja3VwWzldKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OCwgYmFja3VwWzEwXSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUyLCBiYWNrdXBbMV0pOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA0MywgYmFja3VwWzJdKTsKLQotCQlpZiAobnJzc2kwID09IG5yc3NpMSkKLQkJCXBoeS0+bnJzc2lzbG9wZSA9IDB4MDAwMTAwMDA7Ci0JCWVsc2UKLQkJCXBoeS0+bnJzc2lzbG9wZSA9IDB4MDA0MDAwMDAgLyAobnJzc2kwIC0gbnJzc2kxKTsKLQotCQlpZiAobnJzc2kwIDw9IC00KSB7Ci0JCQlwaHktPm5yc3NpWzBdID0gbnJzc2kwOwotCQkJcGh5LT5ucnNzaVsxXSA9IG5yc3NpMTsKLQkJfQotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWlmIChwaHktPnJhZGlvX3JldiA+PSA5KQotCQkJcmV0dXJuOwotCQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkKLQkJCWI0M19jYWxjX25yc3NpX29mZnNldChkZXYpOwotCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9HX0NSUykgJiAweDdGRkYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAyLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDIpICYgMHhGRkZDKTsKLQkJYmFja3VwWzddID0gYjQzX3JlYWQxNihkZXYsIDB4MDNFMik7Ci0JCWI0M193cml0ZTE2KGRldiwgMHgwM0UyLCBiNDNfcmVhZDE2KGRldiwgMHgwM0UyKSB8IDB4ODAwMCk7Ci0JCWJhY2t1cFswXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpOwotCQliYWNrdXBbMV0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDUyKTsKLQkJYmFja3VwWzJdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA0Myk7Ci0JCWJhY2t1cFszXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAxNSk7Ci0JCWJhY2t1cFs0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1QSk7Ci0JCWJhY2t1cFs1XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1OSk7Ci0JCWJhY2t1cFs2XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1OCk7Ci0JCWJhY2t1cFs4XSA9IGI0M19yZWFkMTYoZGV2LCAweDAzRTYpOwotCQliYWNrdXBbOV0gPSBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQpOwotCQlpZiAocGh5LT5yZXYgPj0gMykgewotCQkJYmFja3VwWzEwXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAyRSk7Ci0JCQliYWNrdXBbMTFdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDJGKTsKLQkJCWJhY2t1cFsxMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MEYpOwotCQkJYmFja3VwWzEzXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19MT19DT05UUk9MKTsKLQkJCWJhY2t1cFsxNF0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDEpOwotCQkJYmFja3VwWzE1XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA2MCk7Ci0JCQliYWNrdXBbMTZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDE0KTsKLQkJCWJhY2t1cFsxN10gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRSwgMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0xPX0NPTlRST0wsIDApOwotCQkJc3dpdGNoIChwaHktPnJldikgewotCQkJY2FzZSA0OgotCQkJY2FzZSA2OgotCQkJY2FzZSA3OgotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0NzgsCi0JCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3OCkKLQkJCQkJICAgICAgfCAweDAxMDApOwotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsCi0JCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkKLQkJCQkJICAgICAgfCAweDAwNDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJY2FzZSA1OgotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsCi0JCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkKLQkJCQkJICAgICAgJiAweEZGQkYpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA2MCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDYwKQotCQkJCSAgICAgIHwgMHgwMDQwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTQsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxNCkKLQkJCQkgICAgICB8IDB4MDIwMCk7Ci0JCX0KLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCi0JCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDA3MCk7Ci0JCWI0M19zZXRfYWxsX2dhaW5zKGRldiwgMCwgOCwgMCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgJiAweDAwRjcpOwotCQlpZiAocGh5LT5yZXYgPj0gMikgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwKLQkJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwODExKSAmIDB4RkZDRikgfAotCQkJCSAgICAgIDB4MDAzMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTIpICYgMHhGRkNGKSB8Ci0JCQkJICAgICAgMHgwMDEwKTsKLQkJfQotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKLQkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDgwKTsKLQkJdWRlbGF5KDIwKTsKLQotCQlucnNzaTAgPSAoczE2KSAoKGI0M19waHlfcmVhZChkZXYsIDB4MDQ3RikgPj4gOCkgJiAweDAwM0YpOwotCQlpZiAobnJzc2kwID49IDB4MDAyMCkKLQkJCW5yc3NpMCAtPSAweDAwNDA7Ci0KLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCi0JCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSAmIDB4MDA3Rik7Ci0JCWlmIChwaHktPnJldiA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAzLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDAzKQotCQkJCQkJICAgICYgMHhGRjlGKSB8IDB4MDA0MCk7Ci0JCX0KLQotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhULAotCQkJICAgIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCkKLQkJCSAgICB8IDB4MjAwMCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgfCAweDAwMEYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE1LCAweEYzMzApOwotCQlpZiAocGh5LT5yZXYgPj0gMikgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMiwKLQkJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSAmIDB4RkZDRikgfAotCQkJCSAgICAgIDB4MDAyMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODExLAotCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpICYgMHhGRkNGKSB8Ci0JCQkJICAgICAgMHgwMDIwKTsKLQkJfQotCi0JCWI0M19zZXRfYWxsX2dhaW5zKGRldiwgMywgMCwgMSk7Ci0JCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KSB7Ci0JCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA0MywgMHgwMDFGKTsKLQkJfSBlbHNlIHsKLQkJCXRtcCA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNTIpICYgMHhGRjBGOwotCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTIsIHRtcCB8IDB4MDA2MCk7Ci0JCQl0bXAgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDQzKSAmIDB4RkZGMDsKLQkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLCB0bXAgfCAweDAwMDkpOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNUEsIDB4MDQ4MCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNTksIDB4MDgxMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNTgsIDB4MDAwRCk7Ci0JCXVkZWxheSgyMCk7Ci0JCW5yc3NpMSA9IChzMTYpICgoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdGKSA+PiA4KSAmIDB4MDAzRik7Ci0JCWlmIChucnNzaTEgPj0gMHgwMDIwKQotCQkJbnJzc2kxIC09IDB4MDA0MDsKLQkJaWYgKG5yc3NpMCA9PSBucnNzaTEpCi0JCQlwaHktPm5yc3Npc2xvcGUgPSAweDAwMDEwMDAwOwotCQllbHNlCi0JCQlwaHktPm5yc3Npc2xvcGUgPSAweDAwNDAwMDAwIC8gKG5yc3NpMCAtIG5yc3NpMSk7Ci0JCWlmIChucnNzaTAgPj0gLTQpIHsKLQkJCXBoeS0+bnJzc2lbMF0gPSBucnNzaTE7Ci0JCQlwaHktPm5yc3NpWzFdID0gbnJzc2kwOwotCQl9Ci0JCWlmIChwaHktPnJldiA+PSAzKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCBiYWNrdXBbMTBdKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkYsIGJhY2t1cFsxMV0pOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwRiwgYmFja3VwWzEyXSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0xPX0NPTlRST0wsIGJhY2t1cFsxM10pOwotCQl9Ci0JCWlmIChwaHktPnJldiA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAotCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgxMikgJiAweEZGQ0YpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpICYgMHhGRkNGKTsKLQkJfQotCi0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiYWNrdXBbMF0pOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MiwgYmFja3VwWzFdKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNDMsIGJhY2t1cFsyXSk7Ci0JCWI0M193cml0ZTE2KGRldiwgMHgwM0UyLCBiYWNrdXBbN10pOwotCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFNiwgYmFja3VwWzhdKTsKLQkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCwgYmFja3VwWzldKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgYmFja3VwWzNdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgYmFja3VwWzRdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OSwgYmFja3VwWzVdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OCwgYmFja3VwWzZdKTsKLQkJYjQzX3N5bnRoX3B1X3dvcmthcm91bmQoZGV2LCBwaHktPmNoYW5uZWwpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAyLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSB8ICgweDAwMDEgfCAweDAwMDIpKTsKLQkJYjQzX3NldF9vcmlnaW5hbF9nYWlucyhkZXYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0NSUywKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19DUlMpIHwgMHg4MDAwKTsKLQkJaWYgKHBoeS0+cmV2ID49IDMpIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsIGJhY2t1cFsxNF0pOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA2MCwgYmFja3VwWzE1XSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE0LCBiYWNrdXBbMTZdKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0NzgsIGJhY2t1cFsxN10pOwotCQl9Ci0JCWI0M19ucnNzaV9tZW1fdXBkYXRlKGRldik7Ci0JCWI0M19jYWxjX25yc3NpX3RocmVzaG9sZChkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci19Ci0KLXZvaWQgYjQzX2NhbGNfbnJzc2lfdGhyZXNob2xkKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXMzMiB0aHJlc2hvbGQ7Ci0JczMyIGEsIGI7Ci0JczE2IHRtcDE2OwotCXUxNiB0bXBfdTE2OwotCi0Jc3dpdGNoIChwaHktPnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0I6ewotCQkJaWYgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIQotCQkJICAgIChkZXYtPmRldi0+YnVzLT5zcHJvbS4KLQkJCSAgICAgYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUlNTSSkpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAocGh5LT5yYWRpb19yZXYgPj0gNikgewotCQkJCXRocmVzaG9sZCA9Ci0JCQkJICAgIChwaHktPm5yc3NpWzFdIC0gcGh5LT5ucnNzaVswXSkgKiAzMjsKLQkJCQl0aHJlc2hvbGQgKz0gMjAgKiAocGh5LT5ucnNzaVswXSArIDEpOwotCQkJCXRocmVzaG9sZCAvPSA0MDsKLQkJCX0gZWxzZQotCQkJCXRocmVzaG9sZCA9IHBoeS0+bnJzc2lbMV0gLSA1OwotCi0JCQl0aHJlc2hvbGQgPSBjbGFtcF92YWwodGhyZXNob2xkLCAwLCAweDNFKTsKLQkJCWI0M19waHlfcmVhZChkZXYsIDB4MDAyMCk7CS8qIGR1bW15IHJlYWQgKi8KLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjAsCi0JCQkJICAgICAgKCgodTE2KSB0aHJlc2hvbGQpIDw8IDgpIHwgMHgwMDFDKTsKLQotCQkJaWYgKHBoeS0+cmFkaW9fcmV2ID49IDYpIHsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDg3LCAweDBFMEQpOwotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwODYsIDB4MEMwQik7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA4NSwgMHgwQTA5KTsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDg0LCAweDA4MDgpOwotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwODMsIDB4MDgwOCk7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA4MiwgMHgwNjA0KTsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDgxLCAweDAzMDIpOwotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwODAsIDB4MDEwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQjQzX1BIWVRZUEVfRzoKLQkJaWYgKCFwaHktPmdtb2RlIHx8Ci0JCSAgICAhKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1JTU0kpKSB7Ci0JCQl0bXAxNiA9IGI0M19ucnNzaV9od19yZWFkKGRldiwgMHgyMCk7Ci0JCQlpZiAodG1wMTYgPj0gMHgyMCkKLQkJCQl0bXAxNiAtPSAweDQwOwotCQkJaWYgKHRtcDE2IDwgMykgewotCQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEEsCi0JCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpCi0JCQkJCSAgICAgICAmIDB4RjAwMCkgfCAweDA5RUIpOwotCQkJfSBlbHNlIHsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLAotCQkJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDhBKQotCQkJCQkgICAgICAgJiAweEYwMDApIHwgMHgwQUVEKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChwaHktPmludGVyZm1vZGUgPT0gQjQzX0lOVEVSRk1PREVfTk9OV0xBTikgewotCQkJCWEgPSAweEU7Ci0JCQkJYiA9IDB4QTsKLQkJCX0gZWxzZSBpZiAoIXBoeS0+YWNpX3dsYW5fYXV0b21hdGljICYmIHBoeS0+YWNpX2VuYWJsZSkgewotCQkJCWEgPSAweDEzOwotCQkJCWIgPSAweDEyOwotCQkJfSBlbHNlIHsKLQkJCQlhID0gMHhFOwotCQkJCWIgPSAweDExOwotCQkJfQotCi0JCQlhID0gYSAqIChwaHktPm5yc3NpWzFdIC0gcGh5LT5ucnNzaVswXSk7Ci0JCQlhICs9IChwaHktPm5yc3NpWzBdIDw8IDYpOwotCQkJaWYgKGEgPCAzMikKLQkJCQlhICs9IDMxOwotCQkJZWxzZQotCQkJCWEgKz0gMzI7Ci0JCQlhID0gYSA+PiA2OwotCQkJYSA9IGNsYW1wX3ZhbChhLCAtMzEsIDMxKTsKLQotCQkJYiA9IGIgKiAocGh5LT5ucnNzaVsxXSAtIHBoeS0+bnJzc2lbMF0pOwotCQkJYiArPSAocGh5LT5ucnNzaVswXSA8PCA2KTsKLQkJCWlmIChiIDwgMzIpCi0JCQkJYiArPSAzMTsKLQkJCWVsc2UKLQkJCQliICs9IDMyOwotCQkJYiA9IGIgPj4gNjsKLQkJCWIgPSBjbGFtcF92YWwoYiwgLTMxLCAzMSk7Ci0KLQkJCXRtcF91MTYgPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpICYgMHhGMDAwOwotCQkJdG1wX3UxNiB8PSAoKHUzMikgYiAmIDB4MDAwMDAwM0YpOwotCQkJdG1wX3UxNiB8PSAoKCh1MzIpIGEgJiAweDAwMDAwMDNGKSA8PCA2KTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEEsIHRtcF91MTYpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUI0M19XQVJOX09OKDEpOwotCX0KLX0KLQotLyogU3RhY2sgaW1wbGVtZW50YXRpb24gdG8gc2F2ZS9yZXN0b3JlIHZhbHVlcyBmcm9tIHRoZQotICogaW50ZXJmZXJlbmNlIG1pdGlnYXRpb24gY29kZS4KLSAqIEl0IGlzIHNhdmUgdG8gcmVzdG9yZSB2YWx1ZXMgaW4gcmFuZG9tIG9yZGVyLgotICovCi1zdGF0aWMgdm9pZCBfc3RhY2tfc2F2ZSh1MzIgKiBfc3RhY2twdHIsIHNpemVfdCAqIHN0YWNraWR4LAotCQkJdTggaWQsIHUxNiBvZmZzZXQsIHUxNiB2YWx1ZSkKLXsKLQl1MzIgKnN0YWNrcHRyID0gJihfc3RhY2twdHJbKnN0YWNraWR4XSk7Ci0KLQlCNDNfV0FSTl9PTihvZmZzZXQgJiAweEYwMDApOwotCUI0M19XQVJOX09OKGlkICYgMHhGMCk7Ci0JKnN0YWNrcHRyID0gb2Zmc2V0OwotCSpzdGFja3B0ciB8PSAoKHUzMikgaWQpIDw8IDEyOwotCSpzdGFja3B0ciB8PSAoKHUzMikgdmFsdWUpIDw8IDE2OwotCSgqc3RhY2tpZHgpKys7Ci0JQjQzX1dBUk5fT04oKnN0YWNraWR4ID49IEI0M19JTlRFUkZTVEFDS19TSVpFKTsKLX0KLQotc3RhdGljIHUxNiBfc3RhY2tfcmVzdG9yZSh1MzIgKiBzdGFja3B0ciwgdTggaWQsIHUxNiBvZmZzZXQpCi17Ci0Jc2l6ZV90IGk7Ci0KLQlCNDNfV0FSTl9PTihvZmZzZXQgJiAweEYwMDApOwotCUI0M19XQVJOX09OKGlkICYgMHhGMCk7Ci0JZm9yIChpID0gMDsgaSA8IEI0M19JTlRFUkZTVEFDS19TSVpFOyBpKyssIHN0YWNrcHRyKyspIHsKLQkJaWYgKCgqc3RhY2twdHIgJiAweDAwMDAwRkZGKSAhPSBvZmZzZXQpCi0JCQljb250aW51ZTsKLQkJaWYgKCgoKnN0YWNrcHRyICYgMHgwMDAwRjAwMCkgPj4gMTIpICE9IGlkKQotCQkJY29udGludWU7Ci0JCXJldHVybiAoKCpzdGFja3B0ciAmIDB4RkZGRjAwMDApID4+IDE2KTsKLQl9Ci0JQjQzX1dBUk5fT04oMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBwaHlfc3RhY2tzYXZlKG9mZnNldCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJX3N0YWNrX3NhdmUoc3RhY2ssICZzdGFja2lkeCwgMHgxLCAob2Zmc2V0KSwJXAotCQkJICAgIGI0M19waHlfcmVhZChkZXYsIChvZmZzZXQpKSk7CVwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBwaHlfc3RhY2tyZXN0b3JlKG9mZnNldCkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQliNDNfcGh5X3dyaXRlKGRldiwgKG9mZnNldCksCQlcCi0JCQkJICBfc3RhY2tfcmVzdG9yZShzdGFjaywgMHgxLAlcCi0JCQkJCQkgKG9mZnNldCkpKTsJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIHJhZGlvX3N0YWNrc2F2ZShvZmZzZXQpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJX3N0YWNrX3NhdmUoc3RhY2ssICZzdGFja2lkeCwgMHgyLCAob2Zmc2V0KSwJCVwKLQkJCSAgICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgKG9mZnNldCkpKTsJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIHJhZGlvX3N0YWNrcmVzdG9yZShvZmZzZXQpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIChvZmZzZXQpLAkJCVwKLQkJCQkgICAgICBfc3RhY2tfcmVzdG9yZShzdGFjaywgMHgyLAlcCi0JCQkJCQkgICAgIChvZmZzZXQpKSk7CVwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBvZmRtdGFiX3N0YWNrc2F2ZSh0YWJsZSwgb2Zmc2V0KQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJX3N0YWNrX3NhdmUoc3RhY2ssICZzdGFja2lkeCwgMHgzLCAob2Zmc2V0KXwodGFibGUpLAlcCi0JCQkgICAgYjQzX29mZG10YWJfcmVhZDE2KGRldiwgKHRhYmxlKSwgKG9mZnNldCkpKTsJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIG9mZG10YWJfc3RhY2tyZXN0b3JlKHRhYmxlLCBvZmZzZXQpCQkJXAotCWRvIHsJCQkJCQkJXAotCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgKHRhYmxlKSwJKG9mZnNldCksCVwKLQkJCQkgIF9zdGFja19yZXN0b3JlKHN0YWNrLCAweDMsCVwKLQkJCQkJCSAob2Zmc2V0KXwodGFibGUpKSk7CVwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZAotYjQzX3JhZGlvX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uX2VuYWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBtb2RlKQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0JdTE2IHRtcCwgZmxpcHBlZDsKLQlzaXplX3Qgc3RhY2tpZHggPSAwOwotCXUzMiAqc3RhY2sgPSBwaHktPmludGVyZnN0YWNrOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBCNDNfSU5URVJGTU9ERV9OT05XTEFOOgotCQlpZiAocGh5LT5yZXYgIT0gMSkgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyQiwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpIHwgMHgwODAwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAotCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsCi0JCQkJCQkgICBCNDNfUEhZX0dfQ1JTKSAmIH4weDQwMDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmFkaW9fc3RhY2tzYXZlKDB4MDA3OCk7Ci0JCXRtcCA9IChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDc4KSAmIDB4MDAxRSk7Ci0JCUI0M19XQVJOX09OKHRtcCA+IDE1KTsKLQkJZmxpcHBlZCA9IGJpdHJldjQodG1wKTsKLQkJaWYgKGZsaXBwZWQgPCAxMCAmJiBmbGlwcGVkID49IDgpCi0JCQlmbGlwcGVkID0gNzsKLQkJZWxzZSBpZiAoZmxpcHBlZCA+PSAxMCkKLQkJCWZsaXBwZWQgLT0gMzsKLQkJZmxpcHBlZCA9IChiaXRyZXY0KGZsaXBwZWQpIDw8IDEpIHwgMHgwMDIwOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3OCwgZmxpcHBlZCk7Ci0KLQkJYjQzX2NhbGNfbnJzc2lfdGhyZXNob2xkKGRldik7Ci0KLQkJcGh5X3N0YWNrc2F2ZSgweDA0MDYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDA2LCAweDdFMjgpOwotCi0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MkIsIGI0M19waHlfcmVhZChkZXYsIDB4MDQyQikgfCAweDA4MDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCwKLQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsCi0JCQkJCSAgIEI0M19QSFlfUkFESU9fQklURklFTEQpIHwgMHgxMDAwKTsKLQotCQlwaHlfc3RhY2tzYXZlKDB4MDRBMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTAsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEwKSAmIDB4QzBDMCkgfCAweDAwMDgpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBMSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTEsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEExKSAmIDB4QzBDMCkgfCAweDA2MDUpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBMik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTIsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEyKSAmIDB4QzBDMCkgfCAweDAyMDQpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBOCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTgsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEE4KSAmIDB4QzBDMCkgfCAweDA4MDMpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBQik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUIsCi0JCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEFCKSAmIDB4QzBDMCkgfCAweDA2MDUpOwotCi0JCXBoeV9zdGFja3NhdmUoMHgwNEE3KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBNywgMHgwMDAyKTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QTMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEzLCAweDI4N0EpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBOSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTksIDB4MjAyNyk7Ci0JCXBoeV9zdGFja3NhdmUoMHgwNDkzKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQ5MywgMHgzMkY1KTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QUEpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFBLCAweDIwMjcpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBQyk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUMsIDB4MzJGNSk7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX0lOVEVSRk1PREVfTUFOVUFMV0xBTjoKLQkJaWYgKGI0M19waHlfcmVhZChkZXYsIDB4MDAzMykgJiAweDA4MDApCi0JCQlicmVhazsKLQotCQlwaHktPmFjaV9lbmFibGUgPSAxOwotCi0JCXBoeV9zdGFja3NhdmUoQjQzX1BIWV9SQURJT19CSVRGSUVMRCk7Ci0JCXBoeV9zdGFja3NhdmUoQjQzX1BIWV9HX0NSUyk7Ci0JCWlmIChwaHktPnJldiA8IDIpIHsKLQkJCXBoeV9zdGFja3NhdmUoMHgwNDA2KTsKLQkJfSBlbHNlIHsKLQkJCXBoeV9zdGFja3NhdmUoMHgwNEMwKTsKLQkJCXBoeV9zdGFja3NhdmUoMHgwNEMxKTsKLQkJfQotCQlwaHlfc3RhY2tzYXZlKDB4MDAzMyk7Ci0JCXBoeV9zdGFja3NhdmUoMHgwNEE3KTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QTMpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBOSk7Ci0JCXBoeV9zdGFja3NhdmUoMHgwNEFBKTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QUMpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDQ5Myk7Ci0JCXBoeV9zdGFja3NhdmUoMHgwNEExKTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QTApOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBMik7Ci0JCXBoeV9zdGFja3NhdmUoMHgwNDhBKTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0QTgpOwotCQlwaHlfc3RhY2tzYXZlKDB4MDRBQik7Ci0JCWlmIChwaHktPnJldiA9PSAyKSB7Ci0JCQlwaHlfc3RhY2tzYXZlKDB4MDRBRCk7Ci0JCQlwaHlfc3RhY2tzYXZlKDB4MDRBRSk7Ci0JCX0gZWxzZSBpZiAocGh5LT5yZXYgPj0gMykgewotCQkJcGh5X3N0YWNrc2F2ZSgweDA0QUQpOwotCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTUpOwotCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTYpOwotCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTcpOwotCQkJb2ZkbXRhYl9zdGFja3NhdmUoMHgxQTAwLCAweDIpOwotCQkJb2ZkbXRhYl9zdGFja3NhdmUoMHgxQTAwLCAweDMpOwotCQl9Ci0JCXBoeV9zdGFja3NhdmUoMHgwNDJCKTsKLQkJcGh5X3N0YWNrc2F2ZSgweDA0OEMpOwotCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JBRElPX0JJVEZJRUxELAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkKLQkJCSAgICAgICYgfjB4MTAwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAotCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19DUlMpCi0JCQkgICAgICAgJiAweEZGRkMpIHwgMHgwMDAyKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDMzLCAweDA4MDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEzLCAweDIwMjcpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEE5LCAweDFDQTgpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDkzLCAweDI4N0EpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFBLCAweDFDQTgpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFDLCAweDI4N0EpOwotCi0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTAsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTApCi0JCQkJCSAgICAmIDB4RkZDMCkgfCAweDAwMUEpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEE3LCAweDAwMEQpOwotCi0JCWlmIChwaHktPnJldiA8IDIpIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MDYsIDB4RkYwRCk7Ci0JCX0gZWxzZSBpZiAocGh5LT5yZXYgPT0gMikgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRDMCwgMHhGRkZGKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QzEsIDB4MDBBOSk7Ci0JCX0gZWxzZSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEMwLCAweDAwQzEpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRDMSwgMHgwMDU5KTsKLQkJfQotCi0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTEsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTEpCi0JCQkJCSAgICAmIDB4QzBGRikgfCAweDE4MDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEExLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEExKQotCQkJCQkgICAgJiAweEZGQzApIHwgMHgwMDE1KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBOCkKLQkJCQkJICAgICYgMHhDRkZGKSB8IDB4MTAwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTgsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTgpCi0JCQkJCSAgICAmIDB4RjBGRikgfCAweDBBMDApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFCLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEFCKQotCQkJCQkgICAgJiAweENGRkYpIHwgMHgxMDAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBQiwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBQikKLQkJCQkJICAgICYgMHhGMEZGKSB8IDB4MDgwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUIsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QUIpCi0JCQkJCSAgICAmIDB4RkZDRikgfCAweDAwMTApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFCLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEFCKQotCQkJCQkgICAgJiAweEZGRjApIHwgMHgwMDA1KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBOCkKLQkJCQkJICAgICYgMHhGRkNGKSB8IDB4MDAxMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTgsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTgpCi0JCQkJCSAgICAmIDB4RkZGMCkgfCAweDAwMDYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEyLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEyKQotCQkJCQkgICAgJiAweEYwRkYpIHwgMHgwODAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMCkKLQkJCQkJICAgICYgMHhGMEZGKSB8IDB4MDUwMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTIsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTIpCi0JCQkJCSAgICAmIDB4RkZGMCkgfCAweDAwMEIpOwotCi0JCWlmIChwaHktPnJldiA+PSAzKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpCi0JCQkJICAgICAgJiB+MHg4MDAwKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTUsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTUpCi0JCQkJCQkgICAgJiAweDgwMDApIHwgMHgzNkQ4KTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTYsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTYpCi0JCQkJCQkgICAgJiAweDgwMDApIHwgMHgzNkQ4KTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTcsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTcpCi0JCQkJCQkgICAgJiAweEZFMDApIHwgMHgwMTZEKTsKLQkJfSBlbHNlIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEEsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ4QSkKLQkJCQkgICAgICB8IDB4MTAwMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDhBKQotCQkJCQkJICAgICYgMHg5RkZGKSB8IDB4MjAwMCk7Ci0JCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpIHwgQjQzX0hGX0FDSVcpOwotCQl9Ci0JCWlmIChwaHktPnJldiA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDJCLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpCi0JCQkJICAgICAgfCAweDA4MDApOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEMsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEMpCi0JCQkJCSAgICAmIDB4RjBGRikgfCAweDAyMDApOwotCQlpZiAocGh5LT5yZXYgPT0gMikgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBRSwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBRSkKLQkJCQkJCSAgICAmIDB4RkYwMCkgfCAweDAwN0YpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBRCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBRCkKLQkJCQkJCSAgICAmIDB4MDBGRikgfCAweDEzMDApOwotCQl9IGVsc2UgaWYgKHBoeS0+cmV2ID49IDYpIHsKLQkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCAweDFBMDAsIDB4MywgMHgwMDdGKTsKLQkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCAweDFBMDAsIDB4MiwgMHgwMDdGKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUQsIGI0M19waHlfcmVhZChkZXYsIDB4MDRBRCkKLQkJCQkgICAgICAmIDB4MDBGRik7Ci0JCX0KLQkJYjQzX2NhbGNfbnJzc2lfc2xvcGUoZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQjQzX1dBUk5fT04oMSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYjQzX3JhZGlvX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uX2Rpc2FibGUoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXUzMiAqc3RhY2sgPSBwaHktPmludGVyZnN0YWNrOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBCNDNfSU5URVJGTU9ERV9OT05XTEFOOgotCQlpZiAocGh5LT5yZXYgIT0gMSkgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyQiwKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpICYgfjB4MDgwMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0NSUywKLQkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LAotCQkJCQkJICAgQjQzX1BIWV9HX0NSUykgfCAweDQwMDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmFkaW9fc3RhY2tyZXN0b3JlKDB4MDA3OCk7Ci0JCWI0M19jYWxjX25yc3NpX3RocmVzaG9sZChkZXYpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQwNik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MkIsIGI0M19waHlfcmVhZChkZXYsIDB4MDQyQikgJiB+MHgwODAwKTsKLQkJaWYgKCFkZXYtPmJhZF9mcmFtZXNfcHJlZW1wdCkgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkFESU9fQklURklFTEQsCi0JCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkKLQkJCQkgICAgICAmIH4oMSA8PCAxMSkpOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9HX0NSUykgfCAweDQwMDApOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMCk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEExKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTIpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBOCk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFCKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTcpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMyk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEE5KTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0OTMpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBQSk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFDKTsKLQkJYnJlYWs7Ci0JY2FzZSBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOOgotCQlpZiAoIShiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzMpICYgMHgwODAwKSkKLQkJCWJyZWFrOwotCi0JCXBoeS0+YWNpX2VuYWJsZSA9IDA7Ci0KLQkJcGh5X3N0YWNrcmVzdG9yZShCNDNfUEhZX1JBRElPX0JJVEZJRUxEKTsKLQkJcGh5X3N0YWNrcmVzdG9yZShCNDNfUEhZX0dfQ1JTKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDAwMzMpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMyk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEE5KTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0OTMpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBQSk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFDKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTApOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBNyk7Ci0JCWlmIChwaHktPnJldiA+PSAyKSB7Ci0JCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRDMCk7Ci0JCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRDMSk7Ci0JCX0gZWxzZQotCQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0MDYpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMSk7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFCKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTgpOwotCQlpZiAocGh5LT5yZXYgPT0gMikgewotCQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QUQpOwotCQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QUUpOwotCQl9IGVsc2UgaWYgKHBoeS0+cmV2ID49IDMpIHsKLQkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFEKTsKLQkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDE1KTsKLQkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDE2KTsKLQkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDE3KTsKLQkJCW9mZG10YWJfc3RhY2tyZXN0b3JlKDB4MUEwMCwgMHgyKTsKLQkJCW9mZG10YWJfc3RhY2tyZXN0b3JlKDB4MUEwMCwgMHgzKTsKLQkJfQotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMik7Ci0JCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDhBKTsKLQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0MkIpOwotCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQ4Qyk7Ci0JCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgJiB+QjQzX0hGX0FDSVcpOwotCQliNDNfY2FsY19ucnNzaV9zbG9wZShkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci19Ci0KLSN1bmRlZiBwaHlfc3RhY2tzYXZlCi0jdW5kZWYgcGh5X3N0YWNrcmVzdG9yZQotI3VuZGVmIHJhZGlvX3N0YWNrc2F2ZQotI3VuZGVmIHJhZGlvX3N0YWNrcmVzdG9yZQotI3VuZGVmIG9mZG10YWJfc3RhY2tzYXZlCi0jdW5kZWYgb2ZkbXRhYl9zdGFja3Jlc3RvcmUKLQotaW50IGI0M19yYWRpb19zZXRfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24oc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCWludCBjdXJyZW50bW9kZTsKLQotCWlmICgocGh5LT50eXBlICE9IEI0M19QSFlUWVBFX0cpIHx8IChwaHktPnJldiA9PSAwKSB8fCAoIXBoeS0+Z21vZGUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXBoeS0+YWNpX3dsYW5fYXV0b21hdGljID0gMDsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIEI0M19JTlRFUkZNT0RFX0FVVE9XTEFOOgotCQlwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IDE7Ci0JCWlmIChwaHktPmFjaV9lbmFibGUpCi0JCQltb2RlID0gQjQzX0lOVEVSRk1PREVfTUFOVUFMV0xBTjsKLQkJZWxzZQotCQkJbW9kZSA9IEI0M19JTlRFUkZNT0RFX05PTkU7Ci0JCWJyZWFrOwotCWNhc2UgQjQzX0lOVEVSRk1PREVfTk9ORToKLQljYXNlIEI0M19JTlRFUkZNT0RFX05PTldMQU46Ci0JY2FzZSBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdXJyZW50bW9kZSA9IHBoeS0+aW50ZXJmbW9kZTsKLQlpZiAoY3VycmVudG1vZGUgPT0gbW9kZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGN1cnJlbnRtb2RlICE9IEI0M19JTlRFUkZNT0RFX05PTkUpCi0JCWI0M19yYWRpb19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbl9kaXNhYmxlKGRldiwgY3VycmVudG1vZGUpOwotCi0JaWYgKG1vZGUgPT0gQjQzX0lOVEVSRk1PREVfTk9ORSkgewotCQlwaHktPmFjaV9lbmFibGUgPSAwOwotCQlwaHktPmFjaV9od19yc3NpID0gMDsKLQl9IGVsc2UKLQkJYjQzX3JhZGlvX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uX2VuYWJsZShkZXYsIG1vZGUpOwotCXBoeS0+aW50ZXJmbW9kZSA9IG1vZGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUxNiBiNDNfcmFkaW9fY29yZV9jYWxpYnJhdGlvbl92YWx1ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JdTE2IHJlZywgaW5kZXgsIHJldDsKLQotCXN0YXRpYyBjb25zdCB1OCByY2NfdGFibGVbXSA9IHsKLQkJMHgwMiwgMHgwMywgMHgwMSwgMHgwRiwKLQkJMHgwNiwgMHgwNywgMHgwNSwgMHgwRiwKLQkJMHgwQSwgMHgwQiwgMHgwOSwgMHgwRiwKLQkJMHgwRSwgMHgwRiwgMHgwRCwgMHgwRiwKLQl9OwotCi0JcmVnID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NjApOwotCWluZGV4ID0gKHJlZyAmIDB4MDAxRSkgPj4gMTsKLQlyZXQgPSByY2NfdGFibGVbaW5kZXhdIDw8IDE7Ci0JcmV0IHw9IChyZWcgJiAweDAwMDEpOwotCXJldCB8PSAweDAwMjA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIExQRChMLCBQLCBEKQkoKChMKSA8PCAyKSB8ICgoUCkgPDwgMSkgfCAoKEQpIDw8IDApKQotc3RhdGljIHUxNiByYWRpbzIwNTBfcmZvdmVyX3ZhbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCi0JCQkJdTE2IHBoeV9yZWdpc3RlciwgdW5zaWduZWQgaW50IGxwZCkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJihkZXYtPmRldi0+YnVzLT5zcHJvbSk7Ci0KLQlpZiAoIXBoeS0+Z21vZGUpCi0JCXJldHVybiAwOwotCi0JaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpIHsKLQkJaW50IG1heF9sYl9nYWluID0gcGh5LT5tYXhfbGJfZ2FpbjsKLQkJdTE2IGV4dGxuYTsKLQkJdTE2IGk7Ci0KLQkJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpCi0JCQltYXhfbGJfZ2FpbiArPSAweDNFOwotCQllbHNlCi0JCQltYXhfbGJfZ2FpbiArPSAweDI2OwotCQlpZiAobWF4X2xiX2dhaW4gPj0gMHg0NikgewotCQkJZXh0bG5hID0gMHgzMDAwOwotCQkJbWF4X2xiX2dhaW4gLT0gMHg0NjsKLQkJfSBlbHNlIGlmIChtYXhfbGJfZ2FpbiA+PSAweDNBKSB7Ci0JCQlleHRsbmEgPSAweDEwMDA7Ci0JCQltYXhfbGJfZ2FpbiAtPSAweDNBOwotCQl9IGVsc2UgaWYgKG1heF9sYl9nYWluID49IDB4MkUpIHsKLQkJCWV4dGxuYSA9IDB4MjAwMDsKLQkJCW1heF9sYl9nYWluIC09IDB4MkU7Ci0JCX0gZWxzZSB7Ci0JCQlleHRsbmEgPSAwOwotCQkJbWF4X2xiX2dhaW4gLT0gMHgxMDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQltYXhfbGJfZ2FpbiAtPSAoaSAqIDYpOwotCQkJaWYgKG1heF9sYl9nYWluIDwgNikKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICgocGh5LT5yZXYgPCA3KSB8fAotCQkgICAgIShzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSkgewotCQkJaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUikgewotCQkJCXJldHVybiAweDFCMzsKLQkJCX0gZWxzZSBpZiAocGh5X3JlZ2lzdGVyID09IEI0M19QSFlfUkZPVkVSVkFMKSB7Ci0JCQkJZXh0bG5hIHw9IChpIDw8IDgpOwotCQkJCXN3aXRjaCAobHBkKSB7Ci0JCQkJY2FzZSBMUEQoMCwgMSwgMSk6Ci0JCQkJCXJldHVybiAweDBGOTI7Ci0JCQkJY2FzZSBMUEQoMCwgMCwgMSk6Ci0JCQkJY2FzZSBMUEQoMSwgMCwgMSk6Ci0JCQkJCXJldHVybiAoMHgwMDkyIHwgZXh0bG5hKTsKLQkJCQljYXNlIExQRCgxLCAwLCAwKToKLQkJCQkJcmV0dXJuICgweDAwOTMgfCBleHRsbmEpOwotCQkJCX0KLQkJCQlCNDNfV0FSTl9PTigxKTsKLQkJCX0KLQkJCUI0M19XQVJOX09OKDEpOwotCQl9IGVsc2UgewotCQkJaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUikgewotCQkJCXJldHVybiAweDlCMzsKLQkJCX0gZWxzZSBpZiAocGh5X3JlZ2lzdGVyID09IEI0M19QSFlfUkZPVkVSVkFMKSB7Ci0JCQkJaWYgKGV4dGxuYSkKLQkJCQkJZXh0bG5hIHw9IDB4ODAwMDsKLQkJCQlleHRsbmEgfD0gKGkgPDwgOCk7Ci0JCQkJc3dpdGNoIChscGQpIHsKLQkJCQljYXNlIExQRCgwLCAxLCAxKToKLQkJCQkJcmV0dXJuIDB4OEY5MjsKLQkJCQljYXNlIExQRCgwLCAwLCAxKToKLQkJCQkJcmV0dXJuICgweDgwOTIgfCBleHRsbmEpOwotCQkJCWNhc2UgTFBEKDEsIDAsIDEpOgotCQkJCQlyZXR1cm4gKDB4MjA5MiB8IGV4dGxuYSk7Ci0JCQkJY2FzZSBMUEQoMSwgMCwgMCk6Ci0JCQkJCXJldHVybiAoMHgyMDkzIHwgZXh0bG5hKTsKLQkJCQl9Ci0JCQkJQjQzX1dBUk5fT04oMSk7Ci0JCQl9Ci0JCQlCNDNfV0FSTl9PTigxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgocGh5LT5yZXYgPCA3KSB8fAotCQkgICAgIShzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSkgewotCQkJaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUikgewotCQkJCXJldHVybiAweDFCMzsKLQkJCX0gZWxzZSBpZiAocGh5X3JlZ2lzdGVyID09IEI0M19QSFlfUkZPVkVSVkFMKSB7Ci0JCQkJc3dpdGNoIChscGQpIHsKLQkJCQljYXNlIExQRCgwLCAxLCAxKToKLQkJCQkJcmV0dXJuIDB4MEZCMjsKLQkJCQljYXNlIExQRCgwLCAwLCAxKToKLQkJCQkJcmV0dXJuIDB4MDBCMjsKLQkJCQljYXNlIExQRCgxLCAwLCAxKToKLQkJCQkJcmV0dXJuIDB4MzBCMjsKLQkJCQljYXNlIExQRCgxLCAwLCAwKToKLQkJCQkJcmV0dXJuIDB4MzBCMzsKLQkJCQl9Ci0JCQkJQjQzX1dBUk5fT04oMSk7Ci0JCQl9Ci0JCQlCNDNfV0FSTl9PTigxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwaHlfcmVnaXN0ZXIgPT0gQjQzX1BIWV9SRk9WRVIpIHsKLQkJCQlyZXR1cm4gMHg5QjM7Ci0JCQl9IGVsc2UgaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUlZBTCkgewotCQkJCXN3aXRjaCAobHBkKSB7Ci0JCQkJY2FzZSBMUEQoMCwgMSwgMSk6Ci0JCQkJCXJldHVybiAweDhGQjI7Ci0JCQkJY2FzZSBMUEQoMCwgMCwgMSk6Ci0JCQkJCXJldHVybiAweDgwQjI7Ci0JCQkJY2FzZSBMUEQoMSwgMCwgMSk6Ci0JCQkJCXJldHVybiAweDIwQjI7Ci0JCQkJY2FzZSBMUEQoMSwgMCwgMCk6Ci0JCQkJCXJldHVybiAweDIwQjM7Ci0JCQkJfQotCQkJCUI0M19XQVJOX09OKDEpOwotCQkJfQotCQkJQjQzX1dBUk5fT04oMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBpbml0MjA1MF9zYXZlZF92YWx1ZXMgewotCS8qIENvcmUgcmVnaXN0ZXJzICovCi0JdTE2IHJlZ18zRUM7Ci0JdTE2IHJlZ18zRTY7Ci0JdTE2IHJlZ18zRjQ7Ci0JLyogUmFkaW8gcmVnaXN0ZXJzICovCi0JdTE2IHJhZGlvXzQzOwotCXUxNiByYWRpb181MTsKLQl1MTYgcmFkaW9fNTI7Ci0JLyogUEhZIHJlZ2lzdGVycyAqLwotCXUxNiBwaHlfcGdhY3RsOwotCXUxNiBwaHlfY2NrXzVBOwotCXUxNiBwaHlfY2NrXzU5OwotCXUxNiBwaHlfY2NrXzU4OwotCXUxNiBwaHlfY2NrXzMwOwotCXUxNiBwaHlfcmZvdmVyOwotCXUxNiBwaHlfcmZvdmVydmFsOwotCXUxNiBwaHlfYW5hbG9nb3ZlcjsKLQl1MTYgcGh5X2FuYWxvZ292ZXJ2YWw7Ci0JdTE2IHBoeV9jcnMwOwotCXUxNiBwaHlfY2xhc3NjdGw7Ci0JdTE2IHBoeV9sb19tYXNrOwotCXUxNiBwaHlfbG9fY3RsOwotCXUxNiBwaHlfc3luY2N0bDsKLX07Ci0KLXUxNiBiNDNfcmFkaW9faW5pdDIwNTAoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0Jc3RydWN0IGluaXQyMDUwX3NhdmVkX3ZhbHVlcyBzYXY7Ci0JdTE2IHJjYzsKLQl1MTYgcmFkaW83ODsKLQl1MTYgcmV0OwotCXUxNiBpLCBqOwotCXUzMiB0bXAxID0gMCwgdG1wMiA9IDA7Ci0KLQltZW1zZXQoJnNhdiwgMCwgc2l6ZW9mKHNhdikpOwkvKiBnZXQgcmlkIG9mICJtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLi4uIiAqLwotCi0Jc2F2LnJhZGlvXzQzID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NDMpOwotCXNhdi5yYWRpb181MSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUxKTsKLQlzYXYucmFkaW9fNTIgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg1Mik7Ci0Jc2F2LnBoeV9wZ2FjdGwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1BHQUNUTCk7Ci0Jc2F2LnBoeV9jY2tfNUEgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDVBKSk7Ci0Jc2F2LnBoeV9jY2tfNTkgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDU5KSk7Ci0Jc2F2LnBoeV9jY2tfNTggPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDU4KSk7Ci0KLQlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0IpIHsKLQkJc2F2LnBoeV9jY2tfMzAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDMwKSk7Ci0JCXNhdi5yZWdfM0VDID0gYjQzX3JlYWQxNihkZXYsIDB4M0VDKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgzMCksIDB4RkYpOwotCQliNDNfd3JpdGUxNihkZXYsIDB4M0VDLCAweDNGM0YpOwotCX0gZWxzZSBpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCXNhdi5waHlfcmZvdmVyID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpOwotCQlzYXYucGh5X3Jmb3ZlcnZhbCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKTsKLQkJc2F2LnBoeV9hbmFsb2dvdmVyID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSKTsKLQkJc2F2LnBoeV9hbmFsb2dvdmVydmFsID0KLQkJICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCk7Ci0JCXNhdi5waHlfY3JzMCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ1JTMCk7Ci0JCXNhdi5waHlfY2xhc3NjdGwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NMQVNTQ1RMKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSKQotCQkJICAgICAgfCAweDAwMDMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMKQotCQkJICAgICAgJiAweEZGRkMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DUlMwLCBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApCi0JCQkgICAgICAmIDB4N0ZGRik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NMQVNTQ1RMLAotCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DTEFTU0NUTCkKLQkJCSAgICAgICYgMHhGRkZDKTsKLQkJaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpIHsKLQkJCXNhdi5waHlfbG9fbWFzayA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTUFTSyk7Ci0JCQlzYXYucGh5X2xvX2N0bCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fQ1RMKTsKLQotCQkJaWYgKHBoeS0+cmV2ID49IDMpCi0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgMHhDMDIwKTsKLQkJCWVsc2UKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19NQVNLLCAweDgwMjApOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fQ1RMLCAwKTsKLQkJfQotCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCQkgICBMUEQoMCwgMSwgMSkpKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLAotCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LCBCNDNfUEhZX1JGT1ZFUiwgMCkpOwotCX0KLQliNDNfd3JpdGUxNihkZXYsIDB4M0UyLCBiNDNfcmVhZDE2KGRldiwgMHgzRTIpIHwgMHg4MDAwKTsKLQotCXNhdi5waHlfc3luY2N0bCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfU1lOQ0NUTCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfU1lOQ0NUTCwgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9TWU5DQ1RMKQotCQkgICAgICAmIDB4RkY3Rik7Ci0Jc2F2LnJlZ18zRTYgPSBiNDNfcmVhZDE2KGRldiwgMHgzRTYpOwotCXNhdi5yZWdfM0Y0ID0gYjQzX3JlYWQxNihkZXYsIDB4M0Y0KTsKLQotCWlmIChwaHktPmFuYWxvZyA9PSAwKSB7Ci0JCWI0M193cml0ZTE2KGRldiwgMHgwM0U2LCAweDAxMjIpOwotCX0gZWxzZSB7Ci0JCWlmIChwaHktPmFuYWxvZyA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgwMyksCi0JCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MDMpKQotCQkJCSAgICAgICAmIDB4RkZCRikgfCAweDQwKTsKLQkJfQotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhULAotCQkJICAgIChiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQpIHwgMHgyMDAwKSk7Ci0JfQotCi0JcmNjID0gYjQzX3JhZGlvX2NvcmVfY2FsaWJyYXRpb25fdmFsdWUoZGV2KTsKLQotCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQikKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDc4LCAweDI2KTsKLQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCQkgICBMUEQoMCwgMSwgMSkpKTsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEJGQUYpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJCKSwgMHgxNDAzKTsKLQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCQkgICBMUEQoMCwgMCwgMSkpKTsKLQl9Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEJGQTApOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MSwgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTEpCi0JCQkgIHwgMHgwMDA0KTsKLQlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgewotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIDB4MUYpOwotCX0gZWxzZSB7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MiwgMCk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDQzKQotCQkJCQkgICAgICAmIDB4RkZGMCkgfCAweDAwMDkpOwotCX0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDApOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NUEpLCAweDA0ODApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OSksIDB4QzgxMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU4KSwgMHgwMDBEKTsKLQkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKLQkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkJCQkgICBMUEQoMSwgMCwgMSkpKTsKLQkJfQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIDB4QUZCMCk7Ci0JCXVkZWxheSgxMCk7Ci0JCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsCi0JCQkJCQkJICAgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCQkJICAgTFBEKDEsIDAsIDEpKSk7Ci0JCX0KLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEVGQjApOwotCQl1ZGVsYXkoMTApOwotCQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAotCQkJCQkJCSAgIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCQkJCSAgIExQRCgxLCAwLCAwKSkpOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhGRkYwKTsKLQkJdWRlbGF5KDIwKTsKLQkJdG1wMSArPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0xPX0xFQUtBR0UpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDApOwotCQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAotCQkJCQkJCSAgIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCQkJCSAgIExQRCgxLCAwLCAxKSkpOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhBRkIwKTsKLQl9Ci0JdWRlbGF5KDEwKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU4KSwgMCk7Ci0JdG1wMSsrOwotCXRtcDEgPj49IDk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlyYWRpbzc4ID0gKGJpdHJldjQoaSkgPDwgMSkgfCAweDAwMjA7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3OCwgcmFkaW83OCk7Ci0JCXVkZWxheSgxMCk7Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1QSksIDB4MEQ4MCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OSksIDB4QzgxMCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDB4MDAwRCk7Ci0JCQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsCi0JCQkJCQkJCSAgIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCQkJCQkgICBMUEQoMSwgMCwKLQkJCQkJCQkJICAgICAgIDEpKSk7Ci0JCQl9Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIDB4QUZCMCk7Ci0JCQl1ZGVsYXkoMTApOwotCQkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgewotCQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAotCQkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkJCQkJICAgTFBEKDEsIDAsCi0JCQkJCQkJCSAgICAgICAxKSkpOwotCQkJfQotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEVGQjApOwotCQkJdWRlbGF5KDEwKTsKLQkJCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKLQkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKLQkJCQkJCQkJICAgQjQzX1BIWV9SRk9WRVJWQUwsCi0JCQkJCQkJCSAgIExQRCgxLCAwLAotCQkJCQkJCQkgICAgICAgMCkpKTsKLQkJCX0KLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhGRkYwKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQl0bXAyICs9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTEVBS0FHRSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDApOwotCQkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgewotCQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAotCQkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKLQkJCQkJCQkJICAgTFBEKDEsIDAsCi0JCQkJCQkJCSAgICAgICAxKSkpOwotCQkJfQotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEFGQjApOwotCQl9Ci0JCXRtcDIrKzsKLQkJdG1wMiA+Pj0gODsKLQkJaWYgKHRtcDEgPCB0bXAyKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzICovCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCBzYXYucGh5X3BnYWN0bCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUxLCBzYXYucmFkaW9fNTEpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1Miwgc2F2LnJhZGlvXzUyKTsKLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIHNhdi5yYWRpb180Myk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NUEpLCBzYXYucGh5X2Nja181QSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTkpLCBzYXYucGh5X2Nja181OSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCBzYXYucGh5X2Nja181OCk7Ci0JYjQzX3dyaXRlMTYoZGV2LCAweDNFNiwgc2F2LnJlZ18zRTYpOwotCWlmIChwaHktPmFuYWxvZyAhPSAwKQotCQliNDNfd3JpdGUxNihkZXYsIDB4M0Y0LCBzYXYucmVnXzNGNCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfU1lOQ0NUTCwgc2F2LnBoeV9zeW5jY3RsKTsKLQliNDNfc3ludGhfcHVfd29ya2Fyb3VuZChkZXYsIHBoeS0+Y2hhbm5lbCk7Ci0JaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9CKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDMwKSwgc2F2LnBoeV9jY2tfMzApOwotCQliNDNfd3JpdGUxNihkZXYsIDB4M0VDLCBzYXYucmVnXzNFQyk7Ci0JfSBlbHNlIGlmIChwaHktPmdtb2RlKSB7Ci0JCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX1JBRElPLAotCQkJICAgIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFlfUkFESU8pCi0JCQkgICAgJiAweDdGRkYpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsIHNhdi5waHlfcmZvdmVyKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLCBzYXYucGh5X3Jmb3ZlcnZhbCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVIsIHNhdi5waHlfYW5hbG9nb3Zlcik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwsCi0JCQkgICAgICBzYXYucGh5X2FuYWxvZ292ZXJ2YWwpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DUlMwLCBzYXYucGh5X2NyczApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DTEFTU0NUTCwgc2F2LnBoeV9jbGFzc2N0bCk7Ci0JCWlmIChoYXNfbG9vcGJhY2tfZ2FpbihwaHkpKSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19NQVNLLCBzYXYucGh5X2xvX21hc2spOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fQ1RMLCBzYXYucGh5X2xvX2N0bCk7Ci0JCX0KLQl9Ci0JaWYgKGkgPiAxNSkKLQkJcmV0ID0gcmFkaW83ODsKLQllbHNlCi0JCXJldCA9IHJjYzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYjQzX3JhZGlvX2luaXQyMDYwKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlpbnQgZXJyOwotCi0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDQsIDB4MDBDMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIDB4MDAwOCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDksIDB4MDA0MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIDB4MDBBQSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzIsIDB4MDA4Rik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDYsIDB4MDA4Rik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzQsIDB4MDA4Rik7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMkMsIDB4MDAwNyk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODIsIDB4MDA4MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODAsIDB4MDAwMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwM0YsIDB4MDBEQSk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDUpICYgfjB4MDAwOCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAxMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAyMCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAyMCk7Ci0JbXNsZWVwKDEpOwkJLyogZGVsYXkgNDAwdXNlYyAqLwotCi0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsCi0JCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwMjApIHwgMHgwMDEwKTsKLQltc2xlZXAoMSk7CQkvKiBkZWxheSA0MDB1c2VjICovCi0KLQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNSwKLQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDUpICYgfjB4MDAwOCkgfCAweDAwMDgpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDg1LCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDg1KSAmIH4weDAwMTApOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA1LCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA1KSAmIH4weDAwMDgpOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDgxLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwNDApOwotCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDgxLAotCQkJICAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA4MSkgJiB+MHgwMDQwKSB8IDB4MDA0MCk7Ci0JYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsCi0JCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwMDgpIHwgMHgwMDA4KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYzLCAweEREQzYpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNjksIDB4MDdCRSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MDA2QSwgMHgwMDAwKTsKLQotCWVyciA9IGI0M19yYWRpb19zZWxlY3RjaGFubmVsKGRldiwgQjQzX0RFRkFVTFRfQ0hBTk5FTF9BLCAwKTsKLQlCNDNfV0FSTl9PTihlcnIpOwotCi0JbXNsZWVwKDEpOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBmcmVxX3IzQV92YWx1ZSh1MTYgZnJlcXVlbmN5KQotewotCXUxNiB2YWx1ZTsKLQotCWlmIChmcmVxdWVuY3kgPCA1MDkxKQotCQl2YWx1ZSA9IDB4MDA0MDsKLQllbHNlIGlmIChmcmVxdWVuY3kgPCA1MzIxKQotCQl2YWx1ZSA9IDB4MDAwMDsKLQllbHNlIGlmIChmcmVxdWVuY3kgPCA1ODA2KQotCQl2YWx1ZSA9IDB4MDA4MDsKLQllbHNlCi0JCXZhbHVlID0gMHgwMDQwOwotCi0JcmV0dXJuIHZhbHVlOwotfQotCi12b2lkIGI0M19yYWRpb19zZXRfdHhfaXEoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0YXRpYyBjb25zdCB1OCBkYXRhX2hpZ2hbNV0gPSB7IDB4MDAsIDB4NDAsIDB4ODAsIDB4OTAsIDB4RDAgfTsKLQlzdGF0aWMgY29uc3QgdTggZGF0YV9sb3dbNV0gPSB7IDB4MDAsIDB4MDEsIDB4MDUsIDB4MDYsIDB4MEEgfTsKLQl1MTYgdG1wID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAxRSk7Ci0JaW50IGksIGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKLQkJCWlmICh0bXAgPT0gKGRhdGFfaGlnaFtpXSA8PCA0IHwgZGF0YV9sb3dbal0pKSB7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA2OSwKLQkJCQkJICAgICAgKGkgLSBqKSA8PCA4IHwgMHgwMEMwKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWludCBiNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCi0JCQkgICAgdTggY2hhbm5lbCwgaW50IHN5bnRoZXRpY19wdV93b3JrYXJvdW5kKQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0JdTE2IHI4LCB0bXA7Ci0JdTE2IGZyZXE7Ci0JdTE2IGNoYW5uZWxjb29raWUsIHNhdmVkY29va2llOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGNoYW5uZWwgPT0gMHhGRikgewotCQlzd2l0Y2ggKHBoeS0+dHlwZSkgewotCQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCQljaGFubmVsID0gQjQzX0RFRkFVTFRfQ0hBTk5FTF9BOwotCQkJYnJlYWs7Ci0JCWNhc2UgQjQzX1BIWVRZUEVfQjoKLQkJY2FzZSBCNDNfUEhZVFlQRV9HOgotCQkJY2hhbm5lbCA9IEI0M19ERUZBVUxUX0NIQU5ORUxfQkc7Ci0JCQlicmVhazsKLQkJY2FzZSBCNDNfUEhZVFlQRV9OOgotCQkJLy9GSVhNRSBjaGVjayBpZiB3ZSBhcmUgb24gMi40R0h6IG9yIDVHSHogYW5kIHNldCBhIGRlZmF1bHQgY2hhbm5lbC4KLQkJCWNoYW5uZWwgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCNDNfV0FSTl9PTigxKTsKLQkJfQotCX0KLQotCS8qIEZpcnN0IHdlIHNldCB0aGUgY2hhbm5lbCByYWRpbyBjb2RlIHRvIHByZXZlbnQgdGhlCi0JICogZmlybXdhcmUgZnJvbSBzZW5kaW5nIGdob3N0IHBhY2tldHMuCi0JICovCi0JY2hhbm5lbGNvb2tpZSA9IGNoYW5uZWw7Ci0JaWYgKDAgLypGSVhNRSBvbiA1R2h6ICovKQotCQljaGFubmVsY29va2llIHw9IDB4MTAwOwotCS8vRklYTUUgc2V0IDQwTWh6IGZsYWcgaWYgcmVxdWlyZWQKLQlzYXZlZGNvb2tpZSA9IGI0M19zaG1fcmVhZDE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfQ0hBTik7Ci0JYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfQ0hBTiwgY2hhbm5lbGNvb2tpZSk7Ci0KLQlzd2l0Y2ggKHBoeS0+dHlwZSkgewotCWNhc2UgQjQzX1BIWVRZUEVfQToKLQkJaWYgKGNoYW5uZWwgPiAyMDApIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlmcmVxID0gY2hhbm5lbDJmcmVxX2EoY2hhbm5lbCk7Ci0KLQkJcjggPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA4KTsKLQkJYjQzX3dyaXRlMTYoZGV2LCAweDAzRjAsIGZyZXEpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwOCwgcjgpOwotCi0JCS8vVE9ETzogd3JpdGUgbWF4IGNoYW5uZWwgVFggcG93ZXI/IHRvIFJhZGlvIDB4MkQKLQkJdG1wID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAyRSk7Ci0JCXRtcCAmPSAweDAwODA7Ci0JCS8vVE9ETzogT1IgdG1wIHdpdGggdGhlIFBvd2VyIG91dCBlc3RpbWF0aW9uIGZvciB0aGlzIGNoYW5uZWw/Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDJFLCB0bXApOwotCi0JCWlmIChmcmVxID49IDQ5MjAgJiYgZnJlcSA8PSA1NTAwKSB7Ci0JCQkvKgotCQkJICogcjggPSAoKChmcmVxICogMTUgKiAweEUxRkM3ODBGKSA+PiAzMikgLyAyOSkgJiAweDBGOwotCQkJICogICAgPSAoZnJlcSAqIDAuMDI1ODYyMDY5Ci0JCQkgKi8KLQkJCXI4ID0gMyAqIGZyZXEgLyAxMTY7CS8qIGlzIGVxdWFsIHRvIHI4ID0gZnJlcSAqIDAuMDI1ODYyICovCi0JCX0KLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDcsIChyOCA8PCA0KSB8IHI4KTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMjAsIChyOCA8PCA0KSB8IHI4KTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMjEsIChyOCA8PCA0KSB8IHI4KTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMjIsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDIyKQotCQkJCQkJJiAweDAwMEYpIHwgKHI4IDw8IDQpKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMkEsIChyOCA8PCA0KSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDJCLCAocjggPDwgNCkpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwOCwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDgpCi0JCQkJCQkmIDB4MDBGMCkgfCAocjggPDwgNCkpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAyOSwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMjkpCi0JCQkJCQkmIDB4RkYwRikgfCAweDAwQjApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAzNSwgMHgwMEFBKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzYsIDB4MDA4NSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDNBLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAzQSkKLQkJCQkJCSYgMHhGRjIwKSB8Ci0JCQkJICBmcmVxX3IzQV92YWx1ZShmcmVxKSk7Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDNELAotCQkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAzRCkgJiAweDAwRkYpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA4MSwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpCi0JCQkJCQkmIDB4RkY3RikgfCAweDAwODApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAzNSwKLQkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMzUpICYgMHhGRkVGKTsKLQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzUsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDM1KQotCQkJCQkJJiAweEZGRUYpIHwgMHgwMDEwKTsKLQkJYjQzX3JhZGlvX3NldF90eF9pcShkZXYpOwotCQkvL1RPRE86IFRTU0kyZGJtIHdvcmthcm91bmQKLQkJYjQzX3BoeV94bWl0cG93ZXIoZGV2KTsJLy9GSVhNRSBjb3JyZWN0PwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0c6Ci0JCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoc3ludGhldGljX3B1X3dvcmthcm91bmQpCi0JCQliNDNfc3ludGhfcHVfd29ya2Fyb3VuZChkZXYsIGNoYW5uZWwpOwotCi0JCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTCwgY2hhbm5lbDJmcmVxX2JnKGNoYW5uZWwpKTsKLQotCQlpZiAoY2hhbm5lbCA9PSAxNCkgewotCQkJaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmNvdW50cnlfY29kZSA9PQotCQkJICAgIFNTQl9TUFJPTTFDQ09ERV9KQVBBTikKLQkJCQliNDNfaGZfd3JpdGUoZGV2LAotCQkJCQkgICAgIGI0M19oZl9yZWFkKGRldikgJiB+QjQzX0hGX0FDUFIpOwotCQkJZWxzZQotCQkJCWI0M19oZl93cml0ZShkZXYsCi0JCQkJCSAgICAgYjQzX2hmX3JlYWQoZGV2KSB8IEI0M19IRl9BQ1BSKTsKLQkJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQsCi0JCQkJICAgIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCkKLQkJCQkgICAgfCAoMSA8PCAxMSkpOwotCQl9IGVsc2UgewotCQkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCwKLQkJCQkgICAgYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhUKQotCQkJCSAgICAmIDB4RjdCRik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCNDNfUEhZVFlQRV9OOgotCQllcnIgPSBiNDNfbnBoeV9zZWxlY3RjaGFubmVsKGRldiwgY2hhbm5lbCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQjQzX1dBUk5fT04oMSk7Ci0JfQotCi0JcGh5LT5jaGFubmVsID0gY2hhbm5lbDsKLQkvKiBXYWl0IGZvciB0aGUgcmFkaW8gdG8gdHVuZSB0byB0aGUgY2hhbm5lbCBhbmQgc3RhYmlsaXplLiAqLwotCW1zbGVlcCg4KTsKLW91dDoKLQlpZiAoZXJyKSB7Ci0JCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELAotCQkJCUI0M19TSE1fU0hfQ0hBTiwgc2F2ZWRjb29raWUpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi12b2lkIGI0M19yYWRpb190dXJuX29uKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCWludCBlcnI7Ci0JdTggY2hhbm5lbDsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlpZiAocGh5LT5yYWRpb19vbikKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChwaHktPnR5cGUpIHsKLQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA0LCAweDAwQzApOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNSwgMHgwMDA4KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxMCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDEwKSAmIDB4RkZGNyk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTEsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxMSkgJiAweEZGRjcpOwotCQliNDNfcmFkaW9faW5pdDIwNjAoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBCNDNfUEhZVFlQRV9COgotCWNhc2UgQjQzX1BIWVRZUEVfRzoKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgMHg4MDAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgMHhDQzAwKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgKHBoeS0+Z21vZGUgPyAweDAwQzAgOiAweDAwMDApKTsKLQkJaWYgKHBoeS0+cmFkaW9fb2ZmX2NvbnRleHQudmFsaWQpIHsKLQkJCS8qIFJlc3RvcmUgdGhlIFJGb3ZlciB2YWx1ZXMuICovCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsCi0JCQkJICAgICAgcGh5LT5yYWRpb19vZmZfY29udGV4dC5yZm92ZXIpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAotCQkJCSAgICAgIHBoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVydmFsKTsKLQkJCXBoeS0+cmFkaW9fb2ZmX2NvbnRleHQudmFsaWQgPSAwOwotCQl9Ci0JCWNoYW5uZWwgPSBwaHktPmNoYW5uZWw7Ci0JCWVyciA9IGI0M19yYWRpb19zZWxlY3RjaGFubmVsKGRldiwgQjQzX0RFRkFVTFRfQ0hBTk5FTF9CRywgMSk7Ci0JCWVyciB8PSBiNDNfcmFkaW9fc2VsZWN0Y2hhbm5lbChkZXYsIGNoYW5uZWwsIDApOwotCQlCNDNfV0FSTl9PTihlcnIpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX046Ci0JCWI0M19ucGh5X3JhZGlvX3R1cm5fb24oZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQjQzX1dBUk5fT04oMSk7Ci0JfQotCXBoeS0+cmFkaW9fb24gPSAxOwotfQotCi12b2lkIGI0M19yYWRpb190dXJuX29mZihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZm9yY2UpCi17Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKLQotCWlmICghcGh5LT5yYWRpb19vbiAmJiAhZm9yY2UpCi0JCXJldHVybjsKLQotCXN3aXRjaCAocGh5LT50eXBlKSB7Ci0JY2FzZSBCNDNfUEhZVFlQRV9OOgotCQliNDNfbnBoeV9yYWRpb190dXJuX29mZihkZXYpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA0LCAweDAwRkYpOwotCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNSwgMHgwMEZCKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxMCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDEwKSB8IDB4MDAwOCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTEsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxMSkgfCAweDAwMDgpOwotCQlicmVhazsKLQljYXNlIEI0M19QSFlUWVBFX0c6IHsKLQkJdTE2IHJmb3ZlciwgcmZvdmVydmFsOwotCi0JCXJmb3ZlciA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKTsKLQkJcmZvdmVydmFsID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwpOwotCQlpZiAoIWZvcmNlKSB7Ci0JCQlwaHktPnJhZGlvX29mZl9jb250ZXh0LnJmb3ZlciA9IHJmb3ZlcjsKLQkJCXBoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVydmFsID0gcmZvdmVydmFsOwotCQkJcGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IDE7Ci0JCX0KLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCByZm92ZXIgfCAweDAwOEMpOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsIHJmb3ZlcnZhbCAmIDB4RkY3Myk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlCNDNfV0FSTl9PTigxKTsKLQl9Ci0JcGh5LT5yYWRpb19vbiA9IDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWIxMDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLSNpZm5kZWYgQjQzX1BIWV9IXwotI2RlZmluZSBCNDNfUEhZX0hfCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi1zdHJ1Y3QgYjQzX3dsZGV2Owotc3RydWN0IGI0M19waHk7Ci0KLS8qKiogUEhZIFJlZ2lzdGVycyAqKiovCi0KLS8qIFJvdXRpbmcgKi8KLSNkZWZpbmUgQjQzX1BIWVJPVVRFCQkJMHgwQzAwIC8qIFBIWSByZWdpc3RlciByb3V0aW5nIGJpdHMgbWFzayAqLwotI2RlZmluZSAgQjQzX1BIWVJPVVRFX0JBU0UJCTB4MDAwMCAvKiBCYXNlIHJlZ2lzdGVycyAqLwotI2RlZmluZSAgQjQzX1BIWVJPVVRFX09GRE1fR1BIWQkJMHgwNDAwIC8qIE9GRE0gcmVnaXN0ZXIgcm91dGluZyBmb3IgRy1QSFlzICovCi0jZGVmaW5lICBCNDNfUEhZUk9VVEVfRVhUX0dQSFkJCTB4MDgwMCAvKiBFeHRlbmRlZCBHLVBIWSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgIEI0M19QSFlST1VURV9OX0JNT0RFCQkweDBDMDAgLyogTi1QSFkgQk1PREUgcmVnaXN0ZXJzICovCi0KLS8qIENDSyAoQi1QSFkpIHJlZ2lzdGVycy4gKi8KLSNkZWZpbmUgQjQzX1BIWV9DQ0socmVnKQkJKChyZWcpIHwgQjQzX1BIWVJPVVRFX0JBU0UpCi0vKiBOLVBIWSByZWdpc3RlcnMuICovCi0jZGVmaW5lIEI0M19QSFlfTihyZWcpCQkJKChyZWcpIHwgQjQzX1BIWVJPVVRFX0JBU0UpCi0vKiBOLVBIWSBCTU9ERSByZWdpc3RlcnMuICovCi0jZGVmaW5lIEI0M19QSFlfTl9CTU9ERShyZWcpCQkoKHJlZykgfCBCNDNfUEhZUk9VVEVfTl9CTU9ERSkKLS8qIE9GRE0gKEEtUEhZKSByZWdpc3RlcnMuICovCi0jZGVmaW5lIEI0M19QSFlfT0ZETShyZWcpCQkoKHJlZykgfCBCNDNfUEhZUk9VVEVfT0ZETV9HUEhZKQotLyogRXh0ZW5kZWQgRy1QSFkgcmVnaXN0ZXJzLiAqLwotI2RlZmluZSBCNDNfUEhZX0VYVEcocmVnKQkJKChyZWcpIHwgQjQzX1BIWVJPVVRFX0VYVF9HUEhZKQotCi0vKiBPRkRNIChBKSBQSFkgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEI0M19QSFlfVkVSU0lPTl9PRkRNCQlCNDNfUEhZX09GRE0oMHgwMCkJLyogVmVyc2lvbmluZyByZWdpc3RlciBmb3IgQS1QSFkgKi8KLSNkZWZpbmUgQjQzX1BIWV9CQkFORENGRwkJQjQzX1BIWV9PRkRNKDB4MDEpCS8qIEJhc2ViYW5kIGNvbmZpZyAqLwotI2RlZmluZSAgQjQzX1BIWV9CQkFORENGR19SWEFOVAkJMHgxODAJLyogUlggQW50ZW5uYSBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgIEI0M19QSFlfQkJBTkRDRkdfUlhBTlRfU0hJRlQJNwotI2RlZmluZSBCNDNfUEhZX1BXUkRPV04JCQlCNDNfUEhZX09GRE0oMHgwMykJLyogUG93ZXJkb3duICovCi0jZGVmaW5lIEI0M19QSFlfQ1JTVEhSRVMxX1IxCQlCNDNfUEhZX09GRE0oMHgwNikJLyogQ1JTIFRocmVzaG9sZCAxIChwaHkucmV2IDEgb25seSkgKi8KLSNkZWZpbmUgQjQzX1BIWV9MTkFIUEZDVEwJCUI0M19QSFlfT0ZETSgweDFDKQkvKiBMTkEvSFBGIGNvbnRyb2wgKi8KLSNkZWZpbmUgQjQzX1BIWV9MUEZHQUlOQ1RMCQlCNDNfUEhZX09GRE0oMHgyMCkJLyogTFBGIEdhaW4gY29udHJvbCAqLwotI2RlZmluZSBCNDNfUEhZX0FESVZSRUxBVEVECQlCNDNfUEhZX09GRE0oMHgyNykJLyogRklYTUUgcmVuYW1lICovCi0jZGVmaW5lIEI0M19QSFlfQ1JTMAkJCUI0M19QSFlfT0ZETSgweDI5KQotI2RlZmluZSAgQjQzX1BIWV9DUlMwX0VOCQkweDQwMDAKLSNkZWZpbmUgQjQzX1BIWV9QRUFLX0NPVU5UCQlCNDNfUEhZX09GRE0oMHgzMCkKLSNkZWZpbmUgQjQzX1BIWV9BTlREV0VMTAkJQjQzX1BIWV9PRkRNKDB4MkIpCS8qIEFudGVubmEgZHdlbGwgKi8KLSNkZWZpbmUgIEI0M19QSFlfQU5URFdFTExfQVVUT0RJVjEJMHgwMTAwCS8qIEF1dG9tYXRpYyBSWCBkaXZlcnNpdHkgc3RhcnQgYW50ZW5uYSAqLwotI2RlZmluZSBCNDNfUEhZX0VOQ09SRQkJCUI0M19QSFlfT0ZETSgweDQ5KQkvKiAiRW5jb3JlIiAoUmFuZ2VNYXggLyBCcm9hZFJhbmdlKSAqLwotI2RlZmluZSAgQjQzX1BIWV9FTkNPUkVfRU4JCTB4MDIwMAkvKiBFbmNvcmUgZW5hYmxlICovCi0jZGVmaW5lIEI0M19QSFlfTE1TCQkJQjQzX1BIWV9PRkRNKDB4NTUpCi0jZGVmaW5lIEI0M19QSFlfT0ZETTYxCQkJQjQzX1BIWV9PRkRNKDB4NjEpCS8qIEZJWE1FIHJlbmFtZSAqLwotI2RlZmluZSAgQjQzX1BIWV9PRkRNNjFfMTAJCTB4MDAxMAkvKiBGSVhNRSByZW5hbWUgKi8KLSNkZWZpbmUgQjQzX1BIWV9JUUJBTAkJCUI0M19QSFlfT0ZETSgweDY5KQkvKiBJL1EgYmFsYW5jZSAqLwotI2RlZmluZSBCNDNfUEhZX0JCVFhEQ19CSUFTCQlCNDNfUEhZX09GRE0oMHg2QikJLyogQmFzZWJhbmQgVFggREMgYmlhcyAqLwotI2RlZmluZSBCNDNfUEhZX09UQUJMRUNUTAkJQjQzX1BIWV9PRkRNKDB4NzIpCS8qIE9GRE0gdGFibGUgY29udHJvbCAoc2VlIGJlbG93KSAqLwotI2RlZmluZSAgQjQzX1BIWV9PVEFCTEVPRkYJCTB4MDNGRgkvKiBPRkRNIHRhYmxlIG9mZnNldCAoc2VlIGJlbG93KSAqLwotI2RlZmluZSAgQjQzX1BIWV9PVEFCTEVOUgkJMHhGQzAwCS8qIE9GRE0gdGFibGUgbnVtYmVyIChzZWUgYmVsb3cpICovCi0jZGVmaW5lICBCNDNfUEhZX09UQUJMRU5SX1NISUZUCQkxMAotI2RlZmluZSBCNDNfUEhZX09UQUJMRUkJCQlCNDNfUEhZX09GRE0oMHg3MykJLyogT0ZETSB0YWJsZSBkYXRhIEkgKi8KLSNkZWZpbmUgQjQzX1BIWV9PVEFCTEVRCQkJQjQzX1BIWV9PRkRNKDB4NzQpCS8qIE9GRE0gdGFibGUgZGF0YSBRICovCi0jZGVmaW5lIEI0M19QSFlfSFBXUl9UU1NJQ1RMCQlCNDNfUEhZX09GRE0oMHg3OCkJLyogSGFyZHdhcmUgcG93ZXIgVFNTSSBjb250cm9sICovCi0jZGVmaW5lIEI0M19QSFlfQURDQ1RMCQkJQjQzX1BIWV9PRkRNKDB4N0EpCS8qIEFEQyBjb250cm9sICovCi0jZGVmaW5lIEI0M19QSFlfSURMRV9UU1NJCQlCNDNfUEhZX09GRE0oMHg3QikKLSNkZWZpbmUgQjQzX1BIWV9BX1RFTVBfU0VOU0UJCUI0M19QSFlfT0ZETSgweDdDKQkvKiBBIFBIWSB0ZW1wZXJhdHVyZSBzZW5zZSAqLwotI2RlZmluZSBCNDNfUEhZX05SU1NJVEhSRVMJCUI0M19QSFlfT0ZETSgweDhBKQkvKiBOUlNTSSB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQjQzX1BIWV9BTlRXUlNFVFQJCUI0M19QSFlfT0ZETSgweDhDKQkvKiBBbnRlbm5hIFdSIHNldHRsZSAqLwotI2RlZmluZSAgQjQzX1BIWV9BTlRXUlNFVFRfQVJYRElWCTB4MjAwMAkvKiBBdXRvbWF0aWMgUlggZGl2ZXJzaXR5IGVuYWJsZWQgKi8KLSNkZWZpbmUgQjQzX1BIWV9DTElQUFdSRE9XTlQJCUI0M19QSFlfT0ZETSgweDkzKQkvKiBDbGlwIHBvd2VyZG93biB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQjQzX1BIWV9PRkRNOUIJCQlCNDNfUEhZX09GRE0oMHg5QikJLyogRklYTUUgcmVuYW1lICovCi0jZGVmaW5lIEI0M19QSFlfTjFQMUdBSU4JCUI0M19QSFlfT0ZETSgweEEwKQotI2RlZmluZSBCNDNfUEhZX1AxUDJHQUlOCQlCNDNfUEhZX09GRE0oMHhBMSkKLSNkZWZpbmUgQjQzX1BIWV9OMU4yR0FJTgkJQjQzX1BIWV9PRkRNKDB4QTIpCi0jZGVmaW5lIEI0M19QSFlfQ0xJUFRIUkVTCQlCNDNfUEhZX09GRE0oMHhBMykKLSNkZWZpbmUgQjQzX1BIWV9DTElQTjFQMlRIUkVTCQlCNDNfUEhZX09GRE0oMHhBNCkKLSNkZWZpbmUgQjQzX1BIWV9DQ0tTSElGVEJJVFNfV0EJCUI0M19QSFlfT0ZETSgweEE1KQkvKiBDQ0sgc2hpZnRiaXRzIHdvcmthcm91bmQsIEZJWE1FIHJlbmFtZSAqLwotI2RlZmluZSBCNDNfUEhZX0NDS1NISUZUQklUUwkJQjQzX1BIWV9PRkRNKDB4QTcpCS8qIEZJWE1FIHJlbmFtZSAqLwotI2RlZmluZSBCNDNfUEhZX0RJVlNSQ0hJRFgJCUI0M19QSFlfT0ZETSgweEE4KQkvKiBEaXZpZGVyIHNlYXJjaCBnYWluL2luZGV4ICovCi0jZGVmaW5lIEI0M19QSFlfQ0xJUFAyVEhSRVMJCUI0M19QSFlfT0ZETSgweEE5KQotI2RlZmluZSBCNDNfUEhZX0NMSVBQM1RIUkVTCQlCNDNfUEhZX09GRE0oMHhBQSkKLSNkZWZpbmUgQjQzX1BIWV9ESVZQMVAyR0FJTgkJQjQzX1BIWV9PRkRNKDB4QUIpCi0jZGVmaW5lIEI0M19QSFlfRElWU1JDSEdBSU5CQUNLCQlCNDNfUEhZX09GRE0oMHhBRCkJLyogRGl2aWRlciBzZWFyY2ggZ2FpbiBiYWNrICovCi0jZGVmaW5lIEI0M19QSFlfRElWU1JDSEdBSU5DSE5HCQlCNDNfUEhZX09GRE0oMHhBRSkJLyogRGl2aWRlciBzZWFyY2ggZ2FpbiBjaGFuZ2UgKi8KLSNkZWZpbmUgQjQzX1BIWV9DUlNUSFJFUzEJCUI0M19QSFlfT0ZETSgweEMwKQkvKiBDUlMgVGhyZXNob2xkIDEgKHBoeS5yZXYgPj0gMiBvbmx5KSAqLwotI2RlZmluZSBCNDNfUEhZX0NSU1RIUkVTMgkJQjQzX1BIWV9PRkRNKDB4QzEpCS8qIENSUyBUaHJlc2hvbGQgMiAocGh5LnJldiA+PSAyIG9ubHkpICovCi0jZGVmaW5lIEI0M19QSFlfVFNTSVBfTFRCQVNFCQlCNDNfUEhZX09GRE0oMHgzODApCS8qIFRTU0kgcG93ZXIgbG9va3VwIHRhYmxlIGJhc2UgKi8KLSNkZWZpbmUgQjQzX1BIWV9EQ19MVEJBU0UJCUI0M19QSFlfT0ZETSgweDNBMCkJLyogREMgbG9va3VwIHRhYmxlIGJhc2UgKi8KLSNkZWZpbmUgQjQzX1BIWV9HQUlOX0xUQkFTRQkJQjQzX1BIWV9PRkRNKDB4M0MwKQkvKiBHYWluIGxvb2t1cCB0YWJsZSBiYXNlICovCi0KLS8qIENDSyAoQikgUEhZIFJlZ2lzdGVycyAqLwotI2RlZmluZSBCNDNfUEhZX1ZFUlNJT05fQ0NLCQlCNDNfUEhZX0NDSygweDAwKQkvKiBWZXJzaW9uaW5nIHJlZ2lzdGVyIGZvciBCLVBIWSAqLwotI2RlZmluZSBCNDNfUEhZX0NDS0JCQU5EQ0ZHCQlCNDNfUEhZX0NDSygweDAxKQkvKiBDb250YWlucyBhbnRlbm5hIDAvMSBjb250cm9sIGJpdCAqLwotI2RlZmluZSBCNDNfUEhZX1BHQUNUTAkJCUI0M19QSFlfQ0NLKDB4MTUpCS8qIFBHQSBjb250cm9sICovCi0jZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9MUEYJCTB4MTAwMAkvKiBMb3cgcGFzcyBmaWx0ZXIgKD8pICovCi0jZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9MT1dCQU5EVwkweDAwNDAJLyogTG93IGJhbmR3aWR0aCBmbGFnICovCi0jZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9VTktOT1dOCQkweEVGQTAKLSNkZWZpbmUgQjQzX1BIWV9GQkNUTDEJCQlCNDNfUEhZX0NDSygweDE4KQkvKiBGcmVxdWVuY3kgYmFuZHdpZHRoIGNvbnRyb2wgMSAqLwotI2RlZmluZSBCNDNfUEhZX0lUU1NJCQkJQjQzX1BIWV9DQ0soMHgyOSkJLyogSWRsZSBUU1NJICovCi0jZGVmaW5lIEI0M19QSFlfTE9fTEVBS0FHRQkJQjQzX1BIWV9DQ0soMHgyRCkJLyogTWVhc3VyZWQgTE8gbGVha2FnZSAqLwotI2RlZmluZSBCNDNfUEhZX0VORVJHWQkJCUI0M19QSFlfQ0NLKDB4MzMpCS8qIEVuZXJneSAqLwotI2RlZmluZSBCNDNfUEhZX1NZTkNDVEwJCQlCNDNfUEhZX0NDSygweDM1KQotI2RlZmluZSBCNDNfUEhZX0ZCQ1RMMgkJCUI0M19QSFlfQ0NLKDB4MzgpCS8qIEZyZXF1ZW5jeSBiYW5kd2lkdGggY29udHJvbCAyICovCi0jZGVmaW5lIEI0M19QSFlfREFDQ1RMCQkJQjQzX1BIWV9DQ0soMHg2MCkJLyogREFDIGNvbnRyb2wgKi8KLSNkZWZpbmUgQjQzX1BIWV9SQ0NBTE9WRVIJCUI0M19QSFlfQ0NLKDB4NzgpCS8qIFJDIGNhbGlicmF0aW9uIG92ZXJyaWRlICovCi0KLS8qIEV4dGVuZGVkIEctUEhZIFJlZ2lzdGVycyAqLwotI2RlZmluZSBCNDNfUEhZX0NMQVNTQ1RMCQlCNDNfUEhZX0VYVEcoMHgwMikJLyogQ2xhc3NpZnkgY29udHJvbCAqLwotI2RlZmluZSBCNDNfUEhZX0dUQUJDVEwJCQlCNDNfUEhZX0VYVEcoMHgwMykJLyogRy1QSFkgdGFibGUgY29udHJvbCAoc2VlIGJlbG93KSAqLwotI2RlZmluZSAgQjQzX1BIWV9HVEFCT0ZGCQkweDAzRkYJLyogRy1QSFkgdGFibGUgb2Zmc2V0IChzZWUgYmVsb3cpICovCi0jZGVmaW5lICBCNDNfUEhZX0dUQUJOUgkJCTB4RkMwMAkvKiBHLVBIWSB0YWJsZSBudW1iZXIgKHNlZSBiZWxvdykgKi8KLSNkZWZpbmUgIEI0M19QSFlfR1RBQk5SX1NISUZUCQkxMAotI2RlZmluZSBCNDNfUEhZX0dUQUJEQVRBCQlCNDNfUEhZX0VYVEcoMHgwNCkJLyogRy1QSFkgdGFibGUgZGF0YSAqLwotI2RlZmluZSBCNDNfUEhZX0xPX01BU0sJCQlCNDNfUEhZX0VYVEcoMHgwRikJLyogTG9jYWwgT3NjaWxsYXRvciBjb250cm9sIG1hc2sgKi8KLSNkZWZpbmUgQjQzX1BIWV9MT19DVEwJCQlCNDNfUEhZX0VYVEcoMHgxMCkJLyogTG9jYWwgT3NjaWxsYXRvciBjb250cm9sICovCi0jZGVmaW5lIEI0M19QSFlfUkZPVkVSCQkJQjQzX1BIWV9FWFRHKDB4MTEpCS8qIFJGIG92ZXJyaWRlICovCi0jZGVmaW5lIEI0M19QSFlfUkZPVkVSVkFMCQlCNDNfUEhZX0VYVEcoMHgxMikJLyogUkYgb3ZlcnJpZGUgdmFsdWUgKi8KLSNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0VYVExOQQkweDgwMDAKLSNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0xOQQkJMHg3MDAwCi0jZGVmaW5lICBCNDNfUEhZX1JGT1ZFUlZBTF9MTkFfU0hJRlQJMTIKLSNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX1BHQQkJMHgwRjAwCi0jZGVmaW5lICBCNDNfUEhZX1JGT1ZFUlZBTF9QR0FfU0hJRlQJOAotI2RlZmluZSAgQjQzX1BIWV9SRk9WRVJWQUxfVU5LCQkweDAwMTAJLyogVW5rbm93biwgYWx3YXlzIHNldC4gKi8KLSNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX1RSU1dSWAkweDAwRTAKLSNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0JXCQkweDAwMDMJLyogQmFuZHdpZHRoIGZsYWdzICovCi0jZGVmaW5lICAgQjQzX1BIWV9SRk9WRVJWQUxfQldfTFBGCTB4MDAwMQkvKiBMb3cgUGFzcyBGaWx0ZXIgKi8KLSNkZWZpbmUgICBCNDNfUEhZX1JGT1ZFUlZBTF9CV19MQlcJMHgwMDAyCS8qIExvdyBCYW5kd2lkdGggKHdoZW4gc2V0KSwgaGlnaCB3aGVuIHVuc2V0ICovCi0jZGVmaW5lIEI0M19QSFlfQU5BTE9HT1ZFUgkJQjQzX1BIWV9FWFRHKDB4MTQpCS8qIEFuYWxvZyBvdmVycmlkZSAqLwotI2RlZmluZSBCNDNfUEhZX0FOQUxPR09WRVJWQUwJCUI0M19QSFlfRVhURygweDE1KQkvKiBBbmFsb2cgb3ZlcnJpZGUgdmFsdWUgKi8KLQotLyoqKiBPRkRNIHRhYmxlIG51bWJlcnMgKioqLwotI2RlZmluZSBCNDNfT0ZETVRBQihudW1iZXIsIG9mZnNldCkJKCgobnVtYmVyKSA8PCBCNDNfUEhZX09UQUJMRU5SX1NISUZUKSB8IChvZmZzZXQpKQotI2RlZmluZSBCNDNfT0ZETVRBQl9BR0MxCQlCNDNfT0ZETVRBQigweDAwLCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9HQUlOMAkJQjQzX09GRE1UQUIoMHgwMCwgMCkKLSNkZWZpbmUgQjQzX09GRE1UQUJfR0FJTlgJCUI0M19PRkRNVEFCKDB4MDEsIDApCS8vVE9ETyByZW5hbWUKLSNkZWZpbmUgQjQzX09GRE1UQUJfR0FJTjEJCUI0M19PRkRNVEFCKDB4MDEsIDQpCi0jZGVmaW5lIEI0M19PRkRNVEFCX0FHQzMJCUI0M19PRkRNVEFCKDB4MDIsIDApCi0jZGVmaW5lIEI0M19PRkRNVEFCX0dBSU4yCQlCNDNfT0ZETVRBQigweDAyLCAzKQotI2RlZmluZSBCNDNfT0ZETVRBQl9MTkFIUEZHQUlOMQkJQjQzX09GRE1UQUIoMHgwMywgMCkKLSNkZWZpbmUgQjQzX09GRE1UQUJfV1JTU0kJCUI0M19PRkRNVEFCKDB4MDQsIDApCi0jZGVmaW5lIEI0M19PRkRNVEFCX0xOQUhQRkdBSU4yCQlCNDNfT0ZETVRBQigweDA0LCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9OT0lTRVNDQUxFCQlCNDNfT0ZETVRBQigweDA1LCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9BR0MyCQlCNDNfT0ZETVRBQigweDA2LCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9ST1RPUgkJQjQzX09GRE1UQUIoMHgwOCwgMCkKLSNkZWZpbmUgQjQzX09GRE1UQUJfQURWUkVUQVJECQlCNDNfT0ZETVRBQigweDA5LCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9EQUMJCQlCNDNfT0ZETVRBQigweDBDLCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9EQwkJCUI0M19PRkRNVEFCKDB4MEUsIDcpCi0jZGVmaW5lIEI0M19PRkRNVEFCX1BXUkRZTjIJCUI0M19PRkRNVEFCKDB4MEUsIDEyKQotI2RlZmluZSBCNDNfT0ZETVRBQl9MTkFHQUlOCQlCNDNfT0ZETVRBQigweDBFLCAxMykKLSNkZWZpbmUgQjQzX09GRE1UQUJfVU5LTk9XTl8wRgkJQjQzX09GRE1UQUIoMHgwRiwgMCkJLy9UT0RPIHJlbmFtZQotI2RlZmluZSBCNDNfT0ZETVRBQl9VTktOT1dOX0FQSFkJQjQzX09GRE1UQUIoMHgwRiwgNykJLy9UT0RPIHJlbmFtZQotI2RlZmluZSBCNDNfT0ZETVRBQl9MUEZHQUlOCQlCNDNfT0ZETVRBQigweDBGLCAxMikKLSNkZWZpbmUgQjQzX09GRE1UQUJfUlNTSQkJQjQzX09GRE1UQUIoMHgxMCwgMCkKLSNkZWZpbmUgQjQzX09GRE1UQUJfVU5LTk9XTl8xMQkJQjQzX09GRE1UQUIoMHgxMSwgNCkJLy9UT0RPIHJlbmFtZQotI2RlZmluZSBCNDNfT0ZETVRBQl9BR0MxX1IxCQlCNDNfT0ZETVRBQigweDEzLCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9HQUlOWF9SMQkJQjQzX09GRE1UQUIoMHgxNCwgMCkJLy9UT0RPIHJlbW92ZSEKLSNkZWZpbmUgQjQzX09GRE1UQUJfTUlOU0lHU1EJCUI0M19PRkRNVEFCKDB4MTQsIDApCi0jZGVmaW5lIEI0M19PRkRNVEFCX0FHQzNfUjEJCUI0M19PRkRNVEFCKDB4MTUsIDApCi0jZGVmaW5lIEI0M19PRkRNVEFCX1dSU1NJX1IxCQlCNDNfT0ZETVRBQigweDE1LCA0KQotI2RlZmluZSBCNDNfT0ZETVRBQl9UU1NJCQlCNDNfT0ZETVRBQigweDE1LCAwKQotI2RlZmluZSBCNDNfT0ZETVRBQl9EQUNSRlBBQkIJCUI0M19PRkRNVEFCKDB4MTYsIDApCi0jZGVmaW5lIEI0M19PRkRNVEFCX0RBQ09GRgkJQjQzX09GRE1UQUIoMHgxNywgMCkKLSNkZWZpbmUgQjQzX09GRE1UQUJfRENCSUFTCQlCNDNfT0ZETVRBQigweDE4LCAwKQotCi11MTYgYjQzX29mZG10YWJfcmVhZDE2KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0KTsKLXZvaWQgYjQzX29mZG10YWJfd3JpdGUxNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB0YWJsZSwKLQkJCSB1MTYgb2Zmc2V0LCB1MTYgdmFsdWUpOwotdTMyIGI0M19vZmRtdGFiX3JlYWQzMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB0YWJsZSwgdTE2IG9mZnNldCk7Ci12b2lkIGI0M19vZmRtdGFiX3dyaXRlMzIoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgdGFibGUsCi0JCQkgdTE2IG9mZnNldCwgdTMyIHZhbHVlKTsKLQotLyoqKiBHLVBIWSB0YWJsZSBudW1iZXJzICovCi0jZGVmaW5lIEI0M19HVEFCKG51bWJlciwgb2Zmc2V0KQkoKChudW1iZXIpIDw8IEI0M19QSFlfR1RBQk5SX1NISUZUKSB8IChvZmZzZXQpKQotI2RlZmluZSBCNDNfR1RBQl9OUlNTSQkJCUI0M19HVEFCKDB4MDAsIDApCi0jZGVmaW5lIEI0M19HVEFCX1RSRkVNVwkJCUI0M19HVEFCKDB4MEMsIDB4MTIwKQotI2RlZmluZSBCNDNfR1RBQl9PUklHVFIJCQlCNDNfR1RBQigweDJFLCAweDI5OCkKLQotdTE2IGI0M19ndGFiX3JlYWQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgdGFibGUsIHUxNiBvZmZzZXQpOwkvL1RPRE8gaW1wbGVtZW50Ci12b2lkIGI0M19ndGFiX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0LCB1MTYgdmFsdWUpOwkvL1RPRE8gaW1wbGVtZW50Ci0KLSNkZWZpbmUgQjQzX0RFRkFVTFRfQ0hBTk5FTF9BCTM2Ci0jZGVmaW5lIEI0M19ERUZBVUxUX0NIQU5ORUxfQkcJNgotCi1lbnVtIHsKLQlCNDNfQU5URU5OQTAsCQkvKiBBbnRlbm5hIDAgKi8KLQlCNDNfQU5URU5OQTEsCQkvKiBBbnRlbm5hIDAgKi8KLQlCNDNfQU5URU5OQV9BVVRPMSwJLyogQXV0b21hdGljLCBzdGFydGluZyB3aXRoIGFudGVubmEgMSAqLwotCUI0M19BTlRFTk5BX0FVVE8wLAkvKiBBdXRvbWF0aWMsIHN0YXJ0aW5nIHdpdGggYW50ZW5uYSAwICovCi0JQjQzX0FOVEVOTkEyLAotCUI0M19BTlRFTk5BMyA9IDgsCi0KLQlCNDNfQU5URU5OQV9BVVRPID0gQjQzX0FOVEVOTkFfQVVUTzAsCi0JQjQzX0FOVEVOTkFfREVGQVVMVCA9IEI0M19BTlRFTk5BX0FVVE8sCi19OwotCi1lbnVtIHsKLQlCNDNfSU5URVJGTU9ERV9OT05FLAotCUI0M19JTlRFUkZNT0RFX05PTldMQU4sCi0JQjQzX0lOVEVSRk1PREVfTUFOVUFMV0xBTiwKLQlCNDNfSU5URVJGTU9ERV9BVVRPV0xBTiwKLX07Ci0KLS8qIE1hc2tzIGZvciB0aGUgZGlmZmVyZW50IFBIWSB2ZXJzaW9uaW5nIHJlZ2lzdGVycy4gKi8KLSNkZWZpbmUgQjQzX1BIWVZFUl9BTkFMT0cJCTB4RjAwMAotI2RlZmluZSBCNDNfUEhZVkVSX0FOQUxPR19TSElGVAkJMTIKLSNkZWZpbmUgQjQzX1BIWVZFUl9UWVBFCQkJMHgwRjAwCi0jZGVmaW5lIEI0M19QSFlWRVJfVFlQRV9TSElGVAkJOAotI2RlZmluZSBCNDNfUEhZVkVSX1ZFUlNJT04JCTB4MDBGRgotCi12b2lkIGI0M19waHlfbG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotdm9pZCBiNDNfcGh5X3VubG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi0KLS8qIFJlYWQgYSB2YWx1ZSBmcm9tIGEgUEhZIHJlZ2lzdGVyICovCi11MTYgYjQzX3BoeV9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCk7Ci0vKiBXcml0ZSBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyICovCi12b2lkIGI0M19waHlfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgdmFsKTsKLS8qIE1hc2sgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIG1hc2sgKi8KLXZvaWQgYjQzX3BoeV9tYXNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2spOwotLyogT1IgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIGJpdG1hcCAqLwotdm9pZCBiNDNfcGh5X3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBzZXQpOwotLyogTWFzayBhbmQgT1IgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIG1hc2sgYW5kIGJpdG1hcCAqLwotdm9pZCBiNDNfcGh5X21hc2tzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgbWFzaywgdTE2IHNldCk7Ci0KLQotaW50IGI0M19waHlfaW5pdF90c3NpMmRibV90YWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi12b2lkIGI0M19waHlfZWFybHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotaW50IGI0M19waHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi12b2lkIGI0M19zZXRfcnhfYW50ZW5uYShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBhbnRlbm5hKTsKLQotdm9pZCBiNDNfcGh5X3htaXRwb3dlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi0vKiBSZXR1cm5zIHRoZSBib29sZWFuIHdoZXRoZXIgdGhlIGJvYXJkIGhhcyBIYXJkd2FyZVBvd2VyQ29udHJvbCAqLwotYm9vbCBiNDNfaGFzX2hhcmR3YXJlX3BjdGwoc3RydWN0IGI0M19waHkgKnBoeSk7Ci0vKiBSZXR1cm5zIHRoZSBib29sZWFuIHdoZXRoZXIgIlRYIE1hZ25pZmljYXRpb24iIGlzIGVuYWJsZWQuICovCi0jZGVmaW5lIGhhc190eF9tYWduaWZpY2F0aW9uKHBoeSkgXAotCSgoKHBoeSktPnJldiA+PSAyKSAmJgkJCVwKLQkgKChwaHkpLT5yYWRpb192ZXIgPT0gMHgyMDUwKSAmJglcCi0JICgocGh5KS0+cmFkaW9fcmV2ID09IDgpKQotLyogQ2FyZCB1c2VzIHRoZSBsb29wYmFjayBnYWluIHN0dWZmICovCi0jZGVmaW5lIGhhc19sb29wYmFja19nYWluKHBoeSkgXAotCSgoKHBoeSktPnJldiA+IDEpIHx8ICgocGh5KS0+Z21vZGUpKQotCi0vKiBSYWRpbyBBdHRlbnVhdGlvbiAoUkYgQXR0ZW51YXRpb24pICovCi1zdHJ1Y3QgYjQzX3JmYXR0IHsKLQl1OCBhdHQ7CQkJLyogQXR0ZW51YXRpb24gdmFsdWUgKi8KLQlib29sIHdpdGhfcGFkbWl4OwkvKiBGbGFnLCBQQUQgTWl4ZXIgZW5hYmxlZC4gKi8KLX07Ci1zdHJ1Y3QgYjQzX3JmYXR0X2xpc3QgewotCS8qIEF0dGVudWF0aW9uIHZhbHVlcyBsaXN0ICovCi0JY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqbGlzdDsKLQl1OCBsZW47Ci0JLyogTWluaW11bS9NYXhpbXVtIGF0dGVudWF0aW9uIHZhbHVlcyAqLwotCXU4IG1pbl92YWw7Ci0JdTggbWF4X3ZhbDsKLX07Ci0KLS8qIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUuICovCi1zdGF0aWMgaW5saW5lIGJvb2wgYjQzX2NvbXBhcmVfcmZhdHQoY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqYSwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBiNDNfcmZhdHQgKmIpCi17Ci0JcmV0dXJuICgoYS0+YXR0ID09IGItPmF0dCkgJiYKLQkJKGEtPndpdGhfcGFkbWl4ID09IGItPndpdGhfcGFkbWl4KSk7Ci19Ci0KLS8qIEJhc2ViYW5kIEF0dGVudWF0aW9uICovCi1zdHJ1Y3QgYjQzX2JiYXR0IHsKLQl1OCBhdHQ7CQkJLyogQXR0ZW51YXRpb24gdmFsdWUgKi8KLX07Ci1zdHJ1Y3QgYjQzX2JiYXR0X2xpc3QgewotCS8qIEF0dGVudWF0aW9uIHZhbHVlcyBsaXN0ICovCi0JY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqbGlzdDsKLQl1OCBsZW47Ci0JLyogTWluaW11bS9NYXhpbXVtIGF0dGVudWF0aW9uIHZhbHVlcyAqLwotCXU4IG1pbl92YWw7Ci0JdTggbWF4X3ZhbDsKLX07Ci0KLS8qIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUuICovCi1zdGF0aWMgaW5saW5lIGJvb2wgYjQzX2NvbXBhcmVfYmJhdHQoY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqYSwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBiNDNfYmJhdHQgKmIpCi17Ci0JcmV0dXJuIChhLT5hdHQgPT0gYi0+YXR0KTsKLX0KLQotLyogdHhfY29udHJvbCBiaXRzLiAqLwotI2RlZmluZSBCNDNfVFhDVExfUEEzREIJCTB4NDAJLyogUEEgR2FpbiAzZEIgKi8KLSNkZWZpbmUgQjQzX1RYQ1RMX1BBMkRCCQkweDIwCS8qIFBBIEdhaW4gMmRCICovCi0jZGVmaW5lIEI0M19UWENUTF9UWE1JWAkJMHgxMAkvKiBUWCBNaXhlciBHYWluICovCi0KLS8qIFdyaXRlIEJhc2ViYW5kQXR0ZW51YXRpb24gdmFsdWUgdG8gdGhlIGRldmljZS4gKi8KLXZvaWQgYjQzX3BoeV9zZXRfYmFzZWJhbmRfYXR0ZW51YXRpb24oc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgICAgIHUxNiBiYXNlYmFuZF9hdHRlbnVhdGlvbik7Ci0KLWV4dGVybiBjb25zdCB1OCBiNDNfcmFkaW9fY2hhbm5lbF9jb2Rlc19iZ1tdOwotCi12b2lkIGI0M19yYWRpb19sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci12b2lkIGI0M19yYWRpb191bmxvY2soc3RydWN0IGI0M193bGRldiAqZGV2KTsKLQotCi0vKiBSZWFkIGEgdmFsdWUgZnJvbSBhIDE2Yml0IHJhZGlvIHJlZ2lzdGVyICovCi11MTYgYjQzX3JhZGlvX3JlYWQxNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQpOwotLyogV3JpdGUgYSB2YWx1ZSB0byBhIDE2Yml0IHJhZGlvIHJlZ2lzdGVyICovCi12b2lkIGI0M19yYWRpb193cml0ZTE2KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IHZhbCk7Ci0vKiBNYXNrIGEgMTZiaXQgcmFkaW8gcmVnaXN0ZXIgd2l0aCBhIG1hc2sgKi8KLXZvaWQgYjQzX3JhZGlvX21hc2soc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgbWFzayk7Ci0vKiBPUiBhIDE2Yml0IHJhZGlvIHJlZ2lzdGVyIHdpdGggYSBiaXRtYXAgKi8KLXZvaWQgYjQzX3JhZGlvX3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBzZXQpOwotLyogTWFzayBhbmQgT1IgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIG1hc2sgYW5kIGJpdG1hcCAqLwotdm9pZCBiNDNfcmFkaW9fbWFza3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBtYXNrLCB1MTYgc2V0KTsKLQotCi11MTYgYjQzX3JhZGlvX2luaXQyMDUwKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci12b2lkIGI0M19yYWRpb19pbml0MjA2MChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOwotCi12b2lkIGI0M19yYWRpb190dXJuX29uKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci12b2lkIGI0M19yYWRpb190dXJuX29mZihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZm9yY2UpOwotCi1pbnQgYjQzX3JhZGlvX3NlbGVjdGNoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjaGFubmVsLAotCQkJICAgIGludCBzeW50aGV0aWNfcHVfd29ya2Fyb3VuZCk7Ci0KLXU4IGI0M19yYWRpb19hY2lfZGV0ZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY2hhbm5lbCk7Ci11OCBiNDNfcmFkaW9fYWNpX3NjYW4oc3RydWN0IGI0M193bGRldiAqZGV2KTsKLQotaW50IGI0M19yYWRpb19zZXRfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24oc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgbW9kZSk7Ci0KLXZvaWQgYjQzX2NhbGNfbnJzc2lfc2xvcGUoc3RydWN0IGI0M193bGRldiAqZGV2KTsKLXZvaWQgYjQzX2NhbGNfbnJzc2lfdGhyZXNob2xkKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci1zMTYgYjQzX25yc3NpX2h3X3JlYWQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0KTsKLXZvaWQgYjQzX25yc3NpX2h3X3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgczE2IHZhbCk7Ci12b2lkIGI0M19ucnNzaV9od191cGRhdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgdmFsKTsKLXZvaWQgYjQzX25yc3NpX21lbV91cGRhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KTsKLQotdm9pZCBiNDNfcmFkaW9fc2V0X3R4X2lxKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci11MTYgYjQzX3JhZGlvX2NhbGlicmF0aW9udmFsdWUoc3RydWN0IGI0M193bGRldiAqZGV2KTsKLQotdm9pZCBiNDNfcHV0X2F0dGVudWF0aW9uX2ludG9fcmFuZ2VzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICAgIGludCAqX2JiYXR0LCBpbnQgKl9yZmF0dCk7Ci0KLXZvaWQgYjQzX3NldF90eHBvd2VyX2coc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkgICAgICAgY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqYmJhdHQsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0ICpyZmF0dCwgdTggdHhfY29udHJvbCk7Ci0KLSNlbmRpZiAvKiBCNDNfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWE4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuYwpAQCAtMCwwICsxLDY0MyBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIElFRUUgODAyLjExYSBQSFkgZHJpdmVyCisKKyAgQ29weXJpZ2h0IChjKSAyMDA1IE1hcnRpbiBMYW5nZXIgPG1hcnRpbi1sYW5nZXJAZ214LmRlPiwKKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IERhbm55IHZhbiBEeWsgPGt1Z2VsZmFuZ0BnZW50b28ub3JnPgorICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQW5kcmVhcyBKYWdnaSA8YW5kcmVhcy5qYWdnaUB3YXRlcndhdmUuY2g+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RlZXQsIEZpZnRoIEZsb29yLAorICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKworKi8KKworI2luY2x1ZGUgImI0My5oIgorI2luY2x1ZGUgInBoeV9hLmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorI2luY2x1ZGUgIndhLmgiCisjaW5jbHVkZSAidGFibGVzLmgiCisjaW5jbHVkZSAibWFpbi5oIgorCisKKy8qIEdldCB0aGUgZnJlcSwgYXMgaXQgaGFzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZS4gKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGNoYW5uZWwyZnJlcV9hKHU4IGNoYW5uZWwpCit7CisJQjQzX1dBUk5fT04oY2hhbm5lbCA+IDIwMCk7CisKKwlyZXR1cm4gKDUwMDAgKyA1ICogY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGZyZXFfcjNBX3ZhbHVlKHUxNiBmcmVxdWVuY3kpCit7CisJdTE2IHZhbHVlOworCisJaWYgKGZyZXF1ZW5jeSA8IDUwOTEpCisJCXZhbHVlID0gMHgwMDQwOworCWVsc2UgaWYgKGZyZXF1ZW5jeSA8IDUzMjEpCisJCXZhbHVlID0gMHgwMDAwOworCWVsc2UgaWYgKGZyZXF1ZW5jeSA8IDU4MDYpCisJCXZhbHVlID0gMHgwMDgwOworCWVsc2UKKwkJdmFsdWUgPSAweDAwNDA7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKyNpZiAwCisvKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgVFNTSSB2YWx1ZSB0byBkQm0gaW4gUTUuMiAqLworc3RhdGljIHM4IGI0M19hcGh5X2VzdGltYXRlX3Bvd2VyX291dChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHM4IHRzc2kpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9hICphcGh5ID0gcGh5LT5hOworCXM4IGRibSA9IDA7CisJczMyIHRtcDsKKworCXRtcCA9IChhcGh5LT50Z3RfaWRsZV90c3NpIC0gYXBoeS0+Y3VyX2lkbGVfdHNzaSArIHRzc2kpOworCXRtcCArPSAweDgwOworCXRtcCA9IGNsYW1wX3ZhbCh0bXAsIDB4MDAsIDB4RkYpOworCWRibSA9IGFwaHktPnRzc2kyZGJtW3RtcF07CisJLy9UT0RPOiBUaGVyZSdzIGEgRklYTUUgb24gdGhlIHNwZWNzCisKKwlyZXR1cm4gZGJtOworfQorI2VuZGlmCisKK3ZvaWQgYjQzX3JhZGlvX3NldF90eF9pcShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RhdGljIGNvbnN0IHU4IGRhdGFfaGlnaFs1XSA9IHsgMHgwMCwgMHg0MCwgMHg4MCwgMHg5MCwgMHhEMCB9OworCXN0YXRpYyBjb25zdCB1OCBkYXRhX2xvd1s1XSA9IHsgMHgwMCwgMHgwMSwgMHgwNSwgMHgwNiwgMHgwQSB9OworCXUxNiB0bXAgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDFFKTsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworCQkJaWYgKHRtcCA9PSAoZGF0YV9oaWdoW2ldIDw8IDQgfCBkYXRhX2xvd1tqXSkpIHsKKwkJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDY5LAorCQkJCQkgICAgICAoaSAtIGopIDw8IDggfCAweDAwQzApOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYXBoeV9jaGFubmVsX3N3aXRjaChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXUxNiBmcmVxLCByOCwgdG1wOworCisJZnJlcSA9IGNoYW5uZWwyZnJlcV9hKGNoYW5uZWwpOworCisJcjggPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA4KTsKKwliNDNfd3JpdGUxNihkZXYsIDB4MDNGMCwgZnJlcSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDgsIHI4KTsKKworCS8vVE9ETzogd3JpdGUgbWF4IGNoYW5uZWwgVFggcG93ZXI/IHRvIFJhZGlvIDB4MkQKKwl0bXAgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDJFKTsKKwl0bXAgJj0gMHgwMDgwOworCS8vVE9ETzogT1IgdG1wIHdpdGggdGhlIFBvd2VyIG91dCBlc3RpbWF0aW9uIGZvciB0aGlzIGNoYW5uZWw/CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMkUsIHRtcCk7CisKKwlpZiAoZnJlcSA+PSA0OTIwICYmIGZyZXEgPD0gNTUwMCkgeworCQkvKgorCQkgKiByOCA9ICgoKGZyZXEgKiAxNSAqIDB4RTFGQzc4MEYpID4+IDMyKSAvIDI5KSAmIDB4MEY7CisJCSAqICAgID0gKGZyZXEgKiAwLjAyNTg2MjA2OQorCQkgKi8KKwkJcjggPSAzICogZnJlcSAvIDExNjsJLyogaXMgZXF1YWwgdG8gcjggPSBmcmVxICogMC4wMjU4NjIgKi8KKwl9CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDcsIChyOCA8PCA0KSB8IHI4KTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAyMCwgKHI4IDw8IDQpIHwgcjgpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDIxLCAocjggPDwgNCkgfCByOCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMjIsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDIyKQorCQkJCQkmIDB4MDAwRikgfCAocjggPDwgNCkpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDJBLCAocjggPDwgNCkpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDJCLCAocjggPDwgNCkpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA4LCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAwOCkKKwkJCQkJJiAweDAwRjApIHwgKHI4IDw8IDQpKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAyOSwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMjkpCisJCQkJCSYgMHhGRjBGKSB8IDB4MDBCMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzUsIDB4MDBBQSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzYsIDB4MDA4NSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwM0EsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDNBKQorCQkJCQkmIDB4RkYyMCkgfAorCQkJICBmcmVxX3IzQV92YWx1ZShmcmVxKSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwM0QsCisJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwM0QpICYgMHgwMEZGKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA4MSwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpCisJCQkJCSYgMHhGRjdGKSB8IDB4MDA4MCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzUsCisJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMzUpICYgMHhGRkVGKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAzNSwgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMzUpCisJCQkJCSYgMHhGRkVGKSB8IDB4MDAxMCk7CisJYjQzX3JhZGlvX3NldF90eF9pcShkZXYpOworCS8vVE9ETzogVFNTSTJkYm0gd29ya2Fyb3VuZAorLy9GSVhNRQliNDNfcGh5X3htaXRwb3dlcihkZXYpOworfQorCit2b2lkIGI0M19yYWRpb19pbml0MjA2MChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDQsIDB4MDBDMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIDB4MDAwOCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDksIDB4MDA0MCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIDB4MDBBQSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzIsIDB4MDA4Rik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDYsIDB4MDA4Rik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMzQsIDB4MDA4Rik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMkMsIDB4MDAwNyk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODIsIDB4MDA4MCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODAsIDB4MDAwMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwM0YsIDB4MDBEQSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDUpICYgfjB4MDAwOCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAxMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAyMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwODEpICYgfjB4MDAyMCk7CisJbXNsZWVwKDEpOwkJLyogZGVsYXkgNDAwdXNlYyAqLworCisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwODEsCisJCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwMjApIHwgMHgwMDEwKTsKKwltc2xlZXAoMSk7CQkvKiBkZWxheSA0MDB1c2VjICovCisKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNSwKKwkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDUpICYgfjB4MDAwOCkgfCAweDAwMDgpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDg1LCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDg1KSAmIH4weDAwMTApOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA1LCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA1KSAmIH4weDAwMDgpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDgxLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwNDApOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDgxLAorCQkJICAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA4MSkgJiB+MHgwMDQwKSB8IDB4MDA0MCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsCisJCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDgxKSAmIH4weDAwMDgpIHwgMHgwMDA4KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYzLCAweEREQzYpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNjksIDB4MDdCRSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA2QSwgMHgwMDAwKTsKKworCWFwaHlfY2hhbm5lbF9zd2l0Y2goZGV2LCBkZXYtPnBoeS5vcHMtPmdldF9kZWZhdWx0X2NoYW4oZGV2KSk7CisKKwltc2xlZXAoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19waHlfcnNzaWFnYyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGVuYWJsZSkKK3sKKwlpbnQgaTsKKworCWlmIChkZXYtPnBoeS5yZXYgPCAzKSB7CisJCWlmIChlbmFibGUpCisJCQlmb3IgKGkgPSAwOyBpIDwgQjQzX1RBQl9SU1NJQUdDMV9TSVpFOyBpKyspIHsKKwkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwKKwkJCQkJQjQzX09GRE1UQUJfTE5BSFBGR0FJTjEsIGksIDB4RkZGOCk7CisJCQkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsCisJCQkJCUI0M19PRkRNVEFCX1dSU1NJLCBpLCAweEZGRjgpOworCQkJfQorCQllbHNlCisJCQlmb3IgKGkgPSAwOyBpIDwgQjQzX1RBQl9SU1NJQUdDMV9TSVpFOyBpKyspIHsKKwkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwKKwkJCQkJQjQzX09GRE1UQUJfTE5BSFBGR0FJTjEsIGksIGI0M190YWJfcnNzaWFnYzFbaV0pOworCQkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LAorCQkJCQlCNDNfT0ZETVRBQl9XUlNTSSwgaSwgYjQzX3RhYl9yc3NpYWdjMVtpXSk7CisJCQl9CisJfSBlbHNlIHsKKwkJaWYgKGVuYWJsZSkKKwkJCWZvciAoaSA9IDA7IGkgPCBCNDNfVEFCX1JTU0lBR0MxX1NJWkU7IGkrKykKKwkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwKKwkJCQkJQjQzX09GRE1UQUJfV1JTU0ksIGksIDB4MDgyMCk7CisJCWVsc2UKKwkJCWZvciAoaSA9IDA7IGkgPCBCNDNfVEFCX1JTU0lBR0MyX1NJWkU7IGkrKykKKwkJCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwKKwkJCQkJQjQzX09GRE1UQUJfV1JTU0ksIGksIGI0M190YWJfcnNzaWFnYzJbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgYjQzX3BoeV93dyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTE2IGIsIGN1cnJfcywgYmVzdF9zID0gMHhGRkZGOworCWludCBpOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwKKwkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DUlMwKSAmIH5CNDNfUEhZX0NSUzBfRU4pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgxQiksCisJCWI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDFCKSkgfCAweDEwMDApOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHg4MiksCisJCShiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHg4MikpICYgMHhGMEZGKSB8IDB4MDMwMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDksCisJCWI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMDkpIHwgMHgwMDgwKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAxMiwKKwkJKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwMTIpICYgMHhGRkZDKSB8IDB4MDAwMik7CisJYjQzX3dhX2luaXRnYWlucyhkZXYpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhCQSksIDB4M0VENSk7CisJYiA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUFdSRE9XTik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUFdSRE9XTiwgKGIgJiAweEZGRjgpIHwgMHgwMDA1KTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNCwKKwkJYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDAwNCkgfCAweDAwMDQpOworCWZvciAoaSA9IDB4MTA7IGkgPD0gMHgyMDsgaSsrKSB7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDEzLCBpKTsKKwkJY3Vycl9zID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PVEFCTEVRKSAmIDB4MDBGRjsKKwkJaWYgKCFjdXJyX3MpIHsKKwkJCWJlc3RfcyA9IDB4MDAwMDsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGN1cnJfcyA+PSAweDAwODApCisJCQljdXJyX3MgPSAweDAxMDAgLSBjdXJyX3M7CisJCWlmIChjdXJyX3MgPCBiZXN0X3MpCisJCQliZXN0X3MgPSBjdXJyX3M7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BXUkRPV04sIGIpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA0LAorCQliNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDA0KSAmIDB4RkZGQik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMTMsIGJlc3Rfcyk7CisJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIEI0M19PRkRNVEFCX0FHQzFfUjEsIDAsIDB4RkZFQyk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweEI3KSwgMHgxRTgwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QjYpLCAweDFDMDApOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhCNSksIDB4MEVDMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweEIyKSwgMHgwMEMwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QjkpLCAweDFGRkYpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhCQiksCisJCShiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHhCQikpICYgMHhGMDAwKSB8IDB4MDA1Myk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETTYxLAorCQkoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNNjEpICYgMHhGRTFGKSB8IDB4MDEyMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweDEzKSwKKwkJKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDEzKSkgJiAweDBGRkYpIHwgMHgzMDAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4MTQpLAorCQkoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4MTQpKSAmIDB4MEZGRikgfCAweDMwMDApOworCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxLCA2LCAweDAwMTcpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxLCBpLCAweDAwMEYpOworCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxLCAweDBELCAweDAwMEUpOworCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxLCAweDBFLCAweDAwMTEpOworCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCBCNDNfT0ZETVRBQl9BR0MxLCAweDBGLCAweDAwMTMpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgzMyksIDB4NTAzMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwKKwkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DUlMwKSB8IEI0M19QSFlfQ1JTMF9FTik7Cit9CisKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX3BjdGxfaW5pdF9hcGh5KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwkvL1RPRE8KK30KKwordm9pZCBiNDNfcGh5X2luaXRhKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJLyogVGhpcyBsb3dsZXZlbCBBLVBIWSBpbml0IGlzIGFsc28gY2FsbGVkIGZyb20gRy1QSFkgaW5pdC4KKwkgKiBTbyB3ZSBtdXN0IG5vdCBhY2Nlc3MgcGh5LT5hLCBpZiBjYWxsZWQgZnJvbSBHLVBIWSBjb2RlLgorCSAqLworCUI0M19XQVJOX09OKChwaHktPnR5cGUgIT0gQjQzX1BIWVRZUEVfQSkgJiYKKwkJICAgIChwaHktPnR5cGUgIT0gQjQzX1BIWVRZUEVfRykpOworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChwaHktPnJldiA+PSA2KSB7CisJCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHgxQiksCisJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4MUIpKSAmIH4weDEwMDApOworCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FTkNPUkUpICYgQjQzX1BIWV9FTkNPUkVfRU4pCisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9FTkNPUkUsCisJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FTkNPUkUpIHwgMHgwMDEwKTsKKwkJZWxzZQorCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfRU5DT1JFLAorCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfRU5DT1JFKSAmIH4weDEwMTApOworCX0KKworCWI0M193YV9hbGwoZGV2KTsKKworCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQSkgeworCQlpZiAocGh5LT5nbW9kZSAmJiAocGh5LT5yZXYgPCAzKSkKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzQsCisJCQkJYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM0KSB8IDB4MDAwMSk7CisJCWI0M19waHlfcnNzaWFnYyhkZXYsIDApOworCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NSUzAsCisJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApIHwgQjQzX1BIWV9DUlMwX0VOKTsKKworCQliNDNfcmFkaW9faW5pdDIwNjAoZGV2KTsKKworCQlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgorCQkgICAgKChidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CVTQzMDYpIHx8CisJCSAgICAgKGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwOSkpKSB7CisJCQk7IC8vVE9ETzogQSBQSFkgTE8KKwkJfQorCisJCWlmIChwaHktPnJldiA+PSAzKQorCQkJYjQzX3BoeV93dyhkZXYpOworCisJCWhhcmR3YXJlX3BjdGxfaW5pdF9hcGh5KGRldik7CisKKwkJLy9UT0RPOiByYWRhciBkZXRlY3Rpb24KKwl9CisKKwlpZiAoKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSAmJgorCSAgICAoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUEFDVFJMKSkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4NkUpLAorCQkJCSAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDZFKSkKKwkJCQkgICAmIDB4RTAwMCkgfCAweDNDRik7CisJfQorfQorCisvKiBJbml0aWFsaXNlIHRoZSBUU1NJLT5kQm0gbG9va3VwIHRhYmxlICovCitzdGF0aWMgaW50IGI0M19hcGh5X2luaXRfdHNzaTJkYm1fdGFibGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfYSAqYXBoeSA9IHBoeS0+YTsKKwlzMTYgcGFiMCwgcGFiMSwgcGFiMjsKKworCXBhYjAgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGExYjApOworCXBhYjEgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGExYjEpOworCXBhYjIgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGExYjIpOworCisJaWYgKHBhYjAgIT0gMCAmJiBwYWIxICE9IDAgJiYgcGFiMiAhPSAwICYmCisJICAgIHBhYjAgIT0gLTEgJiYgcGFiMSAhPSAtMSAmJiBwYWIyICE9IC0xKSB7CisJCS8qIFRoZSBwYWJYIHZhbHVlcyBhcmUgc2V0IGluIFNQUk9NLiBVc2UgdGhlbS4gKi8KKwkJaWYgKChzOCkgZGV2LT5kZXYtPmJ1cy0+c3Byb20uaXRzc2lfYSAhPSAwICYmCisJCSAgICAoczgpIGRldi0+ZGV2LT5idXMtPnNwcm9tLml0c3NpX2EgIT0gLTEpCisJCQlhcGh5LT50Z3RfaWRsZV90c3NpID0KKwkJCSAgICAoczgpIChkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9hKTsKKwkJZWxzZQorCQkJYXBoeS0+dGd0X2lkbGVfdHNzaSA9IDYyOworCQlhcGh5LT50c3NpMmRibSA9IGI0M19nZW5lcmF0ZV9keW5fdHNzaTJkYm1fdGFiKGRldiwgcGFiMCwKKwkJCQkJCQkgICAgICAgcGFiMSwgcGFiMik7CisJCWlmICghYXBoeS0+dHNzaTJkYm0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQkvKiBwYWJYIHZhbHVlcyBub3Qgc2V0IGluIFNQUk9NLAorCQkgKiBidXQgQVBIWSBuZWVkcyBhIGdlbmVyYXRlZCB0YWJsZS4gKi8KKwkJYXBoeS0+dHNzaTJkYm0gPSBOVUxMOworCQliNDNlcnIoZGV2LT53bCwgIkNvdWxkIG5vdCBnZW5lcmF0ZSB0c3NpMmRCbSAiCisJCSAgICAgICAidGFibGUgKHdyb25nIFNQUk9NIGluZm8pIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGI0M19hcGh5X29wX2FsbG9jYXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9hICphcGh5OworCWludCBlcnI7CisKKwlhcGh5ID0ga3phbGxvYyhzaXplb2YoKmFwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFwaHkpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+cGh5LmEgPSBhcGh5OworCisJZXJyID0gYjQzX2FwaHlfaW5pdF90c3NpMmRibV90YWJsZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfYXBoeTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9hcGh5OgorCWtmcmVlKGFwaHkpOworCWRldi0+cGh5LmEgPSBOVUxMOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYjQzX2FwaHlfb3BfcHJlcGFyZV9zdHJ1Y3RzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2EgKmFwaHkgPSBwaHktPmE7CisJY29uc3Qgdm9pZCAqdHNzaTJkYm07CisJaW50IHRndF9pZGxlX3Rzc2k7CisKKwkvKiB0c3NpMmRibSB0YWJsZSBpcyBjb25zdGFudCwgc28gaXQgaXMgaW5pdGlhbGl6ZWQgYXQgYWxsb2MgdGltZS4KKwkgKiBTYXZlIGEgY29weSBvZiB0aGUgcG9pbnRlci4gKi8KKwl0c3NpMmRibSA9IGFwaHktPnRzc2kyZGJtOworCXRndF9pZGxlX3Rzc2kgPSBhcGh5LT50Z3RfaWRsZV90c3NpOworCisJLyogWmVybyBvdXQgdGhlIHdob2xlIFBIWSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KGFwaHksIDAsIHNpemVvZigqYXBoeSkpOworCisJYXBoeS0+dHNzaTJkYm0gPSB0c3NpMmRibTsKKwlhcGh5LT50Z3RfaWRsZV90c3NpID0gdGd0X2lkbGVfdHNzaTsKKworCS8vVE9ETyBpbml0IHN0cnVjdCBiNDNfcGh5X2EKKworfQorCitzdGF0aWMgdm9pZCBiNDNfYXBoeV9vcF9mcmVlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2EgKmFwaHkgPSBwaHktPmE7CisKKwlrZnJlZShhcGh5LT50c3NpMmRibSk7CisJYXBoeS0+dHNzaTJkYm0gPSBOVUxMOworCisJa2ZyZWUoYXBoeSk7CisJZGV2LT5waHkuYSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYjQzX2FwaHlfb3BfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJYjQzX3BoeV9pbml0YShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGFkanVzdF9waHlyZWcoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0KQoreworCS8qIE9GRE0gcmVnaXN0ZXJzIGFyZSBiYXNlLXJlZ2lzdGVycyBmb3IgdGhlIEEtUEhZLiAqLworCWlmICgob2Zmc2V0ICYgQjQzX1BIWVJPVVRFKSA9PSBCNDNfUEhZUk9VVEVfT0ZETV9HUEhZKSB7CisJCW9mZnNldCAmPSB+QjQzX1BIWVJPVVRFOworCQlvZmZzZXQgfD0gQjQzX1BIWVJPVVRFX0JBU0U7CisJfQorCisjaWYgQjQzX0RFQlVHCisJaWYgKChvZmZzZXQgJiBCNDNfUEhZUk9VVEUpID09IEI0M19QSFlST1VURV9FWFRfR1BIWSkgeworCQkvKiBFeHQtRyByZWdpc3RlcnMgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIEctUEhZcyAqLworCQliNDNlcnIoZGV2LT53bCwgIkludmFsaWQgRVhULUcgUEhZIGFjY2VzcyBhdCAiCisJCSAgICAgICAiMHglMDRYIG9uIEEtUEhZXG4iLCBvZmZzZXQpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCWlmICgob2Zmc2V0ICYgQjQzX1BIWVJPVVRFKSA9PSBCNDNfUEhZUk9VVEVfTl9CTU9ERSkgeworCQkvKiBOLUJNT0RFIHJlZ2lzdGVycyBhcmUgb25seSBhdmFpbGFibGUgb24gTi1QSFlzICovCisJCWI0M2VycihkZXYtPndsLCAiSW52YWxpZCBOLUJNT0RFIFBIWSBhY2Nlc3MgYXQgIgorCQkgICAgICAgIjB4JTA0WCBvbiBBLVBIWVxuIiwgb2Zmc2V0KTsKKwkJZHVtcF9zdGFjaygpOworCX0KKyNlbmRpZiAvKiBCNDNfREVCVUcgKi8KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1MTYgYjQzX2FwaHlfb3BfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJcmVnID0gYWRqdXN0X3BoeXJlZyhkZXYsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2FwaHlfb3Bfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJcmVnID0gYWRqdXN0X3BoeXJlZyhkZXYsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB1MTYgYjQzX2FwaHlfb3BfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJLyogUmVnaXN0ZXIgMSBpcyBhIDMyLWJpdCByZWdpc3Rlci4gKi8KKwlCNDNfV0FSTl9PTihyZWcgPT0gMSk7CisJLyogQS1QSFkgbmVlZHMgMHg0MCBmb3IgcmVhZCBhY2Nlc3MgKi8KKwlyZWcgfD0gMHg0MDsKKworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fQ09OVFJPTCwgcmVnKTsKKwlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1JBRElPX0RBVEFfTE9XKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2FwaHlfb3BfcmFkaW9fd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJLyogUmVnaXN0ZXIgMSBpcyBhIDMyLWJpdCByZWdpc3Rlci4gKi8KKwlCNDNfV0FSTl9PTihyZWcgPT0gMSk7CisKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0xPVywgdmFsdWUpOworfQorCitzdGF0aWMgYm9vbCBiNDNfYXBoeV9vcF9zdXBwb3J0c19od3BjdGwoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXJldHVybiAoZGV2LT5waHkucmV2ID49IDUpOworfQorCitzdGF0aWMgdm9pZCBiNDNfYXBoeV9vcF9zb2Z0d2FyZV9yZmtpbGwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQllbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJaWYgKHN0YXRlID09IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpIHsKKwkJaWYgKHBoeS0+cmFkaW9fb24pCisJCQlyZXR1cm47CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDA0LCAweDAwQzApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNSwgMHgwMDA4KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxMCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDEwKSAmIDB4RkZGNyk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTEsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxMSkgJiAweEZGRjcpOworCQliNDNfcmFkaW9faW5pdDIwNjAoZGV2KTsKKwl9IGVsc2UgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDAwNCwgMHgwMEZGKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwMDUsIDB4MDBGQik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTAsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxMCkgfCAweDAwMDgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDExLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMTEpIHwgMHgwMDA4KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYjQzX2FwaHlfb3Bfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBuZXdfY2hhbm5lbCkKK3sKKwlpZiAobmV3X2NoYW5uZWwgPiAyMDApCisJCXJldHVybiAtRUlOVkFMOworCWFwaHlfY2hhbm5lbF9zd2l0Y2goZGV2LCBuZXdfY2hhbm5lbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiNDNfYXBoeV9vcF9nZXRfZGVmYXVsdF9jaGFuKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlyZXR1cm4gMzY7IC8qIERlZmF1bHQgdG8gY2hhbm5lbCAzNiAqLworfQorCitzdGF0aWMgdm9pZCBiNDNfYXBoeV9vcF9zZXRfcnhfYW50ZW5uYShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBhbnRlbm5hKQorey8vVE9ETworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJdTY0IGhmOworCXUxNiB0bXA7CisJaW50IGF1dG9kaXYgPSAwOworCisJaWYgKGFudGVubmEgPT0gQjQzX0FOVEVOTkFfQVVUTzAgfHwgYW50ZW5uYSA9PSBCNDNfQU5URU5OQV9BVVRPMSkKKwkJYXV0b2RpdiA9IDE7CisKKwloZiA9IGI0M19oZl9yZWFkKGRldik7CisJaGYgJj0gfkI0M19IRl9BTlRESVZIRUxQOworCWI0M19oZl93cml0ZShkZXYsIGhmKTsKKworCXRtcCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQkJBTkRDRkcpOworCXRtcCAmPSB+QjQzX1BIWV9CQkFORENGR19SWEFOVDsKKwl0bXAgfD0gKGF1dG9kaXYgPyBCNDNfQU5URU5OQV9BVVRPMCA6IGFudGVubmEpCisJICAgIDw8IEI0M19QSFlfQkJBTkRDRkdfUlhBTlRfU0hJRlQ7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQkJBTkRDRkcsIHRtcCk7CisKKwlpZiAoYXV0b2RpdikgeworCQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOVERXRUxMKTsKKwkJaWYgKGFudGVubmEgPT0gQjQzX0FOVEVOTkFfQVVUTzApCisJCQl0bXAgJj0gfkI0M19QSFlfQU5URFdFTExfQVVUT0RJVjE7CisJCWVsc2UKKwkJCXRtcCB8PSBCNDNfUEhZX0FOVERXRUxMX0FVVE9ESVYxOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTlREV0VMTCwgdG1wKTsKKwl9CisJaWYgKHBoeS0+cmV2IDwgMykgeworCQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOVERXRUxMKTsKKwkJdG1wID0gKHRtcCAmIDB4RkYwMCkgfCAweDI0OworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTlREV0VMTCwgdG1wKTsKKwl9IGVsc2UgeworCQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE02MSk7CisJCXRtcCB8PSAweDEwOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNNjEsIHRtcCk7CisJCWlmIChwaHktPmFuYWxvZyA9PSAzKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DTElQUFdSRE9XTlQsCisJCQkJICAgICAgMHgxRCk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BRElWUkVMQVRFRCwKKwkJCQkgICAgICA4KTsKKwkJfSBlbHNlIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NMSVBQV1JET1dOVCwKKwkJCQkgICAgICAweDNBKTsKKwkJCXRtcCA9CisJCQkgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJIEI0M19QSFlfQURJVlJFTEFURUQpOworCQkJdG1wID0gKHRtcCAmIDB4RkYwMCkgfCA4OworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQURJVlJFTEFURUQsCisJCQkJICAgICAgdG1wKTsKKwkJfQorCX0KKworCWhmIHw9IEI0M19IRl9BTlRESVZIRUxQOworCWI0M19oZl93cml0ZShkZXYsIGhmKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2FwaHlfb3BfYWRqdXN0X3R4cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2KQorey8vVE9ETworfQorCitzdGF0aWMgZW51bSBiNDNfdHhwd3JfcmVzdWx0IGI0M19hcGh5X29wX3JlY2FsY190eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkJCQlib29sIGlnbm9yZV90c3NpKQorey8vVE9ETworCXJldHVybiBCNDNfVFhQV1JfUkVTX0RPTkU7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19hcGh5X29wX3B3b3JrXzE1c2VjKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3svL1RPRE8KK30KKworc3RhdGljIHZvaWQgYjQzX2FwaHlfb3BfcHdvcmtfNjBzZWMoc3RydWN0IGI0M193bGRldiAqZGV2KQorey8vVE9ETworfQorCitjb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIGI0M19waHlvcHNfYSA9IHsKKwkuYWxsb2NhdGUJCT0gYjQzX2FwaHlfb3BfYWxsb2NhdGUsCisJLmZyZWUJCQk9IGI0M19hcGh5X29wX2ZyZWUsCisJLnByZXBhcmVfc3RydWN0cwk9IGI0M19hcGh5X29wX3ByZXBhcmVfc3RydWN0cywKKwkuaW5pdAkJCT0gYjQzX2FwaHlfb3BfaW5pdCwKKwkucGh5X3JlYWQJCT0gYjQzX2FwaHlfb3BfcmVhZCwKKwkucGh5X3dyaXRlCQk9IGI0M19hcGh5X29wX3dyaXRlLAorCS5yYWRpb19yZWFkCQk9IGI0M19hcGh5X29wX3JhZGlvX3JlYWQsCisJLnJhZGlvX3dyaXRlCQk9IGI0M19hcGh5X29wX3JhZGlvX3dyaXRlLAorCS5zdXBwb3J0c19od3BjdGwJPSBiNDNfYXBoeV9vcF9zdXBwb3J0c19od3BjdGwsCisJLnNvZnR3YXJlX3Jma2lsbAk9IGI0M19hcGh5X29wX3NvZnR3YXJlX3Jma2lsbCwKKwkuc3dpdGNoX2FuYWxvZwkJPSBiNDNfcGh5b3Bfc3dpdGNoX2FuYWxvZ19nZW5lcmljLAorCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfYXBoeV9vcF9zd2l0Y2hfY2hhbm5lbCwKKwkuZ2V0X2RlZmF1bHRfY2hhbgk9IGI0M19hcGh5X29wX2dldF9kZWZhdWx0X2NoYW4sCisJLnNldF9yeF9hbnRlbm5hCQk9IGI0M19hcGh5X29wX3NldF9yeF9hbnRlbm5hLAorCS5yZWNhbGNfdHhwb3dlcgkJPSBiNDNfYXBoeV9vcF9yZWNhbGNfdHhwb3dlciwKKwkuYWRqdXN0X3R4cG93ZXIJCT0gYjQzX2FwaHlfb3BfYWRqdXN0X3R4cG93ZXIsCisJLnB3b3JrXzE1c2VjCQk9IGI0M19hcGh5X29wX3B3b3JrXzE1c2VjLAorCS5wd29ya182MHNlYwkJPSBiNDNfYXBoeV9vcF9wd29ya182MHNlYywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZmFhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2EuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBMSU5VWF9CNDNfUEhZX0FfSF8KKyNkZWZpbmUgTElOVVhfQjQzX1BIWV9BX0hfCisKKyNpbmNsdWRlICJwaHlfY29tbW9uLmgiCisKKworLyogT0ZETSAoQSkgUEhZIFJlZ2lzdGVycyAqLworI2RlZmluZSBCNDNfUEhZX1ZFUlNJT05fT0ZETQkJQjQzX1BIWV9PRkRNKDB4MDApCS8qIFZlcnNpb25pbmcgcmVnaXN0ZXIgZm9yIEEtUEhZICovCisjZGVmaW5lIEI0M19QSFlfQkJBTkRDRkcJCUI0M19QSFlfT0ZETSgweDAxKQkvKiBCYXNlYmFuZCBjb25maWcgKi8KKyNkZWZpbmUgIEI0M19QSFlfQkJBTkRDRkdfUlhBTlQJCTB4MTgwCS8qIFJYIEFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lICBCNDNfUEhZX0JCQU5EQ0ZHX1JYQU5UX1NISUZUCTcKKyNkZWZpbmUgQjQzX1BIWV9QV1JET1dOCQkJQjQzX1BIWV9PRkRNKDB4MDMpCS8qIFBvd2VyZG93biAqLworI2RlZmluZSBCNDNfUEhZX0NSU1RIUkVTMV9SMQkJQjQzX1BIWV9PRkRNKDB4MDYpCS8qIENSUyBUaHJlc2hvbGQgMSAocGh5LnJldiAxIG9ubHkpICovCisjZGVmaW5lIEI0M19QSFlfTE5BSFBGQ1RMCQlCNDNfUEhZX09GRE0oMHgxQykJLyogTE5BL0hQRiBjb250cm9sICovCisjZGVmaW5lIEI0M19QSFlfTFBGR0FJTkNUTAkJQjQzX1BIWV9PRkRNKDB4MjApCS8qIExQRiBHYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX1BIWV9BRElWUkVMQVRFRAkJQjQzX1BIWV9PRkRNKDB4MjcpCS8qIEZJWE1FIHJlbmFtZSAqLworI2RlZmluZSBCNDNfUEhZX0NSUzAJCQlCNDNfUEhZX09GRE0oMHgyOSkKKyNkZWZpbmUgIEI0M19QSFlfQ1JTMF9FTgkJMHg0MDAwCisjZGVmaW5lIEI0M19QSFlfUEVBS19DT1VOVAkJQjQzX1BIWV9PRkRNKDB4MzApCisjZGVmaW5lIEI0M19QSFlfQU5URFdFTEwJCUI0M19QSFlfT0ZETSgweDJCKQkvKiBBbnRlbm5hIGR3ZWxsICovCisjZGVmaW5lICBCNDNfUEhZX0FOVERXRUxMX0FVVE9ESVYxCTB4MDEwMAkvKiBBdXRvbWF0aWMgUlggZGl2ZXJzaXR5IHN0YXJ0IGFudGVubmEgKi8KKyNkZWZpbmUgQjQzX1BIWV9FTkNPUkUJCQlCNDNfUEhZX09GRE0oMHg0OSkJLyogIkVuY29yZSIgKFJhbmdlTWF4IC8gQnJvYWRSYW5nZSkgKi8KKyNkZWZpbmUgIEI0M19QSFlfRU5DT1JFX0VOCQkweDAyMDAJLyogRW5jb3JlIGVuYWJsZSAqLworI2RlZmluZSBCNDNfUEhZX0xNUwkJCUI0M19QSFlfT0ZETSgweDU1KQorI2RlZmluZSBCNDNfUEhZX09GRE02MQkJCUI0M19QSFlfT0ZETSgweDYxKQkvKiBGSVhNRSByZW5hbWUgKi8KKyNkZWZpbmUgIEI0M19QSFlfT0ZETTYxXzEwCQkweDAwMTAJLyogRklYTUUgcmVuYW1lICovCisjZGVmaW5lIEI0M19QSFlfSVFCQUwJCQlCNDNfUEhZX09GRE0oMHg2OSkJLyogSS9RIGJhbGFuY2UgKi8KKyNkZWZpbmUgQjQzX1BIWV9CQlRYRENfQklBUwkJQjQzX1BIWV9PRkRNKDB4NkIpCS8qIEJhc2ViYW5kIFRYIERDIGJpYXMgKi8KKyNkZWZpbmUgQjQzX1BIWV9PVEFCTEVDVEwJCUI0M19QSFlfT0ZETSgweDcyKQkvKiBPRkRNIHRhYmxlIGNvbnRyb2wgKHNlZSBiZWxvdykgKi8KKyNkZWZpbmUgIEI0M19QSFlfT1RBQkxFT0ZGCQkweDAzRkYJLyogT0ZETSB0YWJsZSBvZmZzZXQgKHNlZSBiZWxvdykgKi8KKyNkZWZpbmUgIEI0M19QSFlfT1RBQkxFTlIJCTB4RkMwMAkvKiBPRkRNIHRhYmxlIG51bWJlciAoc2VlIGJlbG93KSAqLworI2RlZmluZSAgQjQzX1BIWV9PVEFCTEVOUl9TSElGVAkJMTAKKyNkZWZpbmUgQjQzX1BIWV9PVEFCTEVJCQkJQjQzX1BIWV9PRkRNKDB4NzMpCS8qIE9GRE0gdGFibGUgZGF0YSBJICovCisjZGVmaW5lIEI0M19QSFlfT1RBQkxFUQkJCUI0M19QSFlfT0ZETSgweDc0KQkvKiBPRkRNIHRhYmxlIGRhdGEgUSAqLworI2RlZmluZSBCNDNfUEhZX0hQV1JfVFNTSUNUTAkJQjQzX1BIWV9PRkRNKDB4NzgpCS8qIEhhcmR3YXJlIHBvd2VyIFRTU0kgY29udHJvbCAqLworI2RlZmluZSBCNDNfUEhZX0FEQ0NUTAkJCUI0M19QSFlfT0ZETSgweDdBKQkvKiBBREMgY29udHJvbCAqLworI2RlZmluZSBCNDNfUEhZX0lETEVfVFNTSQkJQjQzX1BIWV9PRkRNKDB4N0IpCisjZGVmaW5lIEI0M19QSFlfQV9URU1QX1NFTlNFCQlCNDNfUEhZX09GRE0oMHg3QykJLyogQSBQSFkgdGVtcGVyYXR1cmUgc2Vuc2UgKi8KKyNkZWZpbmUgQjQzX1BIWV9OUlNTSVRIUkVTCQlCNDNfUEhZX09GRE0oMHg4QSkJLyogTlJTU0kgdGhyZXNob2xkICovCisjZGVmaW5lIEI0M19QSFlfQU5UV1JTRVRUCQlCNDNfUEhZX09GRE0oMHg4QykJLyogQW50ZW5uYSBXUiBzZXR0bGUgKi8KKyNkZWZpbmUgIEI0M19QSFlfQU5UV1JTRVRUX0FSWERJVgkweDIwMDAJLyogQXV0b21hdGljIFJYIGRpdmVyc2l0eSBlbmFibGVkICovCisjZGVmaW5lIEI0M19QSFlfQ0xJUFBXUkRPV05UCQlCNDNfUEhZX09GRE0oMHg5MykJLyogQ2xpcCBwb3dlcmRvd24gdGhyZXNob2xkICovCisjZGVmaW5lIEI0M19QSFlfT0ZETTlCCQkJQjQzX1BIWV9PRkRNKDB4OUIpCS8qIEZJWE1FIHJlbmFtZSAqLworI2RlZmluZSBCNDNfUEhZX04xUDFHQUlOCQlCNDNfUEhZX09GRE0oMHhBMCkKKyNkZWZpbmUgQjQzX1BIWV9QMVAyR0FJTgkJQjQzX1BIWV9PRkRNKDB4QTEpCisjZGVmaW5lIEI0M19QSFlfTjFOMkdBSU4JCUI0M19QSFlfT0ZETSgweEEyKQorI2RlZmluZSBCNDNfUEhZX0NMSVBUSFJFUwkJQjQzX1BIWV9PRkRNKDB4QTMpCisjZGVmaW5lIEI0M19QSFlfQ0xJUE4xUDJUSFJFUwkJQjQzX1BIWV9PRkRNKDB4QTQpCisjZGVmaW5lIEI0M19QSFlfQ0NLU0hJRlRCSVRTX1dBCQlCNDNfUEhZX09GRE0oMHhBNSkJLyogQ0NLIHNoaWZ0Yml0cyB3b3JrYXJvdW5kLCBGSVhNRSByZW5hbWUgKi8KKyNkZWZpbmUgQjQzX1BIWV9DQ0tTSElGVEJJVFMJCUI0M19QSFlfT0ZETSgweEE3KQkvKiBGSVhNRSByZW5hbWUgKi8KKyNkZWZpbmUgQjQzX1BIWV9ESVZTUkNISURYCQlCNDNfUEhZX09GRE0oMHhBOCkJLyogRGl2aWRlciBzZWFyY2ggZ2Fpbi9pbmRleCAqLworI2RlZmluZSBCNDNfUEhZX0NMSVBQMlRIUkVTCQlCNDNfUEhZX09GRE0oMHhBOSkKKyNkZWZpbmUgQjQzX1BIWV9DTElQUDNUSFJFUwkJQjQzX1BIWV9PRkRNKDB4QUEpCisjZGVmaW5lIEI0M19QSFlfRElWUDFQMkdBSU4JCUI0M19QSFlfT0ZETSgweEFCKQorI2RlZmluZSBCNDNfUEhZX0RJVlNSQ0hHQUlOQkFDSwkJQjQzX1BIWV9PRkRNKDB4QUQpCS8qIERpdmlkZXIgc2VhcmNoIGdhaW4gYmFjayAqLworI2RlZmluZSBCNDNfUEhZX0RJVlNSQ0hHQUlOQ0hORwkJQjQzX1BIWV9PRkRNKDB4QUUpCS8qIERpdmlkZXIgc2VhcmNoIGdhaW4gY2hhbmdlICovCisjZGVmaW5lIEI0M19QSFlfQ1JTVEhSRVMxCQlCNDNfUEhZX09GRE0oMHhDMCkJLyogQ1JTIFRocmVzaG9sZCAxIChwaHkucmV2ID49IDIgb25seSkgKi8KKyNkZWZpbmUgQjQzX1BIWV9DUlNUSFJFUzIJCUI0M19QSFlfT0ZETSgweEMxKQkvKiBDUlMgVGhyZXNob2xkIDIgKHBoeS5yZXYgPj0gMiBvbmx5KSAqLworI2RlZmluZSBCNDNfUEhZX1RTU0lQX0xUQkFTRQkJQjQzX1BIWV9PRkRNKDB4MzgwKQkvKiBUU1NJIHBvd2VyIGxvb2t1cCB0YWJsZSBiYXNlICovCisjZGVmaW5lIEI0M19QSFlfRENfTFRCQVNFCQlCNDNfUEhZX09GRE0oMHgzQTApCS8qIERDIGxvb2t1cCB0YWJsZSBiYXNlICovCisjZGVmaW5lIEI0M19QSFlfR0FJTl9MVEJBU0UJCUI0M19QSFlfT0ZETSgweDNDMCkJLyogR2FpbiBsb29rdXAgdGFibGUgYmFzZSAqLworCisvKioqIE9GRE0gdGFibGUgbnVtYmVycyAqKiovCisjZGVmaW5lIEI0M19PRkRNVEFCKG51bWJlciwgb2Zmc2V0KQkoKChudW1iZXIpIDw8IEI0M19QSFlfT1RBQkxFTlJfU0hJRlQpIHwgKG9mZnNldCkpCisjZGVmaW5lIEI0M19PRkRNVEFCX0FHQzEJCUI0M19PRkRNVEFCKDB4MDAsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0dBSU4wCQlCNDNfT0ZETVRBQigweDAwLCAwKQorI2RlZmluZSBCNDNfT0ZETVRBQl9HQUlOWAkJQjQzX09GRE1UQUIoMHgwMSwgMCkJLy9UT0RPIHJlbmFtZQorI2RlZmluZSBCNDNfT0ZETVRBQl9HQUlOMQkJQjQzX09GRE1UQUIoMHgwMSwgNCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfQUdDMwkJQjQzX09GRE1UQUIoMHgwMiwgMCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfR0FJTjIJCUI0M19PRkRNVEFCKDB4MDIsIDMpCisjZGVmaW5lIEI0M19PRkRNVEFCX0xOQUhQRkdBSU4xCQlCNDNfT0ZETVRBQigweDAzLCAwKQorI2RlZmluZSBCNDNfT0ZETVRBQl9XUlNTSQkJQjQzX09GRE1UQUIoMHgwNCwgMCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfTE5BSFBGR0FJTjIJCUI0M19PRkRNVEFCKDB4MDQsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX05PSVNFU0NBTEUJCUI0M19PRkRNVEFCKDB4MDUsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0FHQzIJCUI0M19PRkRNVEFCKDB4MDYsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX1JPVE9SCQlCNDNfT0ZETVRBQigweDA4LCAwKQorI2RlZmluZSBCNDNfT0ZETVRBQl9BRFZSRVRBUkQJCUI0M19PRkRNVEFCKDB4MDksIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0RBQwkJCUI0M19PRkRNVEFCKDB4MEMsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0RDCQkJQjQzX09GRE1UQUIoMHgwRSwgNykKKyNkZWZpbmUgQjQzX09GRE1UQUJfUFdSRFlOMgkJQjQzX09GRE1UQUIoMHgwRSwgMTIpCisjZGVmaW5lIEI0M19PRkRNVEFCX0xOQUdBSU4JCUI0M19PRkRNVEFCKDB4MEUsIDEzKQorI2RlZmluZSBCNDNfT0ZETVRBQl9VTktOT1dOXzBGCQlCNDNfT0ZETVRBQigweDBGLCAwKQkvL1RPRE8gcmVuYW1lCisjZGVmaW5lIEI0M19PRkRNVEFCX1VOS05PV05fQVBIWQlCNDNfT0ZETVRBQigweDBGLCA3KQkvL1RPRE8gcmVuYW1lCisjZGVmaW5lIEI0M19PRkRNVEFCX0xQRkdBSU4JCUI0M19PRkRNVEFCKDB4MEYsIDEyKQorI2RlZmluZSBCNDNfT0ZETVRBQl9SU1NJCQlCNDNfT0ZETVRBQigweDEwLCAwKQorI2RlZmluZSBCNDNfT0ZETVRBQl9VTktOT1dOXzExCQlCNDNfT0ZETVRBQigweDExLCA0KQkvL1RPRE8gcmVuYW1lCisjZGVmaW5lIEI0M19PRkRNVEFCX0FHQzFfUjEJCUI0M19PRkRNVEFCKDB4MTMsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0dBSU5YX1IxCQlCNDNfT0ZETVRBQigweDE0LCAwKQkvL1RPRE8gcmVtb3ZlIQorI2RlZmluZSBCNDNfT0ZETVRBQl9NSU5TSUdTUQkJQjQzX09GRE1UQUIoMHgxNCwgMCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfQUdDM19SMQkJQjQzX09GRE1UQUIoMHgxNSwgMCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfV1JTU0lfUjEJCUI0M19PRkRNVEFCKDB4MTUsIDQpCisjZGVmaW5lIEI0M19PRkRNVEFCX1RTU0kJCUI0M19PRkRNVEFCKDB4MTUsIDApCisjZGVmaW5lIEI0M19PRkRNVEFCX0RBQ1JGUEFCQgkJQjQzX09GRE1UQUIoMHgxNiwgMCkKKyNkZWZpbmUgQjQzX09GRE1UQUJfREFDT0ZGCQlCNDNfT0ZETVRBQigweDE3LCAwKQorI2RlZmluZSBCNDNfT0ZETVRBQl9EQ0JJQVMJCUI0M19PRkRNVEFCKDB4MTgsIDApCisKK3UxNiBiNDNfb2ZkbXRhYl9yZWFkMTYoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgdGFibGUsIHUxNiBvZmZzZXQpOwordm9pZCBiNDNfb2ZkbXRhYl93cml0ZTE2KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLAorCQkJIHUxNiBvZmZzZXQsIHUxNiB2YWx1ZSk7Cit1MzIgYjQzX29mZG10YWJfcmVhZDMyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0KTsKK3ZvaWQgYjQzX29mZG10YWJfd3JpdGUzMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB0YWJsZSwKKwkJCSB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpOworCisKK3N0cnVjdCBiNDNfcGh5X2EgeworCS8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIHVzZWQgdG8gY29udmVydCBhCisJICogVFNTSSB2YWx1ZSB0byBkQm0tUTUuMiAqLworCWNvbnN0IHM4ICp0c3NpMmRibTsKKwkvKiBUYXJnZXQgaWRsZSBUU1NJICovCisJaW50IHRndF9pZGxlX3Rzc2k7CisJLyogQ3VycmVudCBpZGxlIFRTU0kgKi8KKwlpbnQgY3VyX2lkbGVfdHNzaTsvL0ZJWE1FIHZhbHVlIGN1cnJlbnRseSBub3Qgc2V0CisKKwkvKiBBLVBIWSBUWCBQb3dlciBjb250cm9sIHZhbHVlLiAqLworCXUxNiB0eHB3cl9vZmZzZXQ7CisKKwkvL1RPRE8gbG90cyBvZiBtaXNzaW5nIHN0dWZmCit9OworCisvKioKKyAqIGI0M19waHlfaW5pdGEgLSBMb3dsZXZlbCBBLVBIWSBpbml0IHJvdXRpbmUuCisgKiBUaGlzIGlzIF9vbmx5XyB1c2VkIGJ5IHRoZSBHLVBIWSBjb2RlLgorICovCit2b2lkIGI0M19waHlfaW5pdGEoc3RydWN0IGI0M193bGRldiAqZGV2KTsKKworCitzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnMgYjQzX3BoeW9wc19hOworCisjZW5kaWYgLyogTElOVVhfQjQzX1BIWV9BX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM3YWJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIENvbW1vbiBQSFkgcm91dGluZXMKKworICBDb3B5cmlnaHQgKGMpIDIwMDUgTWFydGluIExhbmdlciA8bWFydGluLWxhbmdlckBnbXguZGU+LAorICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBTdGVmYW5vIEJyaXZpbyA8c3RlZmFuby5icml2aW9AcG9saW1pLml0PgorICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgRGFubnkgdmFuIER5ayA8a3VnZWxmYW5nQGdlbnRvby5vcmc+CisgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBBbmRyZWFzIEphZ2dpIDxhbmRyZWFzLmphZ2dpQHdhdGVyd2F2ZS5jaD4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdGVldCwgRmlmdGggRmxvb3IsCisgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisqLworCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorI2luY2x1ZGUgInBoeV9nLmgiCisjaW5jbHVkZSAicGh5X2EuaCIKKyNpbmNsdWRlICJwaHlfbi5oIgorI2luY2x1ZGUgInBoeV9scC5oIgorI2luY2x1ZGUgImI0My5oIgorI2luY2x1ZGUgIm1haW4uaCIKKworCitpbnQgYjQzX3BoeV9hbGxvY2F0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICYoZGV2LT5waHkpOworCWludCBlcnI7CisKKwlwaHktPm9wcyA9IE5VTEw7CisKKwlzd2l0Y2ggKHBoeS0+dHlwZSkgeworCWNhc2UgQjQzX1BIWVRZUEVfQToKKwkJcGh5LT5vcHMgPSAmYjQzX3BoeW9wc19hOworCQlicmVhazsKKwljYXNlIEI0M19QSFlUWVBFX0c6CisJCXBoeS0+b3BzID0gJmI0M19waHlvcHNfZzsKKwkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9OOgorI2lmZGVmIENPTkZJR19CNDNfTlBIWQorCQlwaHktPm9wcyA9ICZiNDNfcGh5b3BzX247CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBCNDNfUEhZVFlQRV9MUDoKKyNpZmRlZiBDT05GSUdfQjQzX1BIWV9MUAorCQlwaHktPm9wcyA9ICZiNDNfcGh5b3BzX2xwOworI2VuZGlmCisJCWJyZWFrOworCX0KKwlpZiAoQjQzX1dBUk5fT04oIXBoeS0+b3BzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSBwaHktPm9wcy0+YWxsb2NhdGUoZGV2KTsKKwlpZiAoZXJyKQorCQlwaHktPm9wcyA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGI0M19waHlfZnJlZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJZGV2LT5waHkub3BzLT5mcmVlKGRldik7CisJZGV2LT5waHkub3BzID0gTlVMTDsKK30KKworaW50IGI0M19waHlfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwljb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zICpvcHMgPSBwaHktPm9wczsKKwlpbnQgZXJyOworCisJcGh5LT5jaGFubmVsID0gb3BzLT5nZXRfZGVmYXVsdF9jaGFuKGRldik7CisKKwlvcHMtPnNvZnR3YXJlX3Jma2lsbChkZXYsIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpOworCWVyciA9IG9wcy0+aW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJYjQzZXJyKGRldi0+d2wsICJQSFkgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9ibG9ja19yZjsKKwl9CisJLyogTWFrZSBzdXJlIHRvIHN3aXRjaCBoYXJkd2FyZSBhbmQgZmlybXdhcmUgKFNITSkgdG8KKwkgKiB0aGUgZGVmYXVsdCBjaGFubmVsLiAqLworCWVyciA9IGI0M19zd2l0Y2hfY2hhbm5lbChkZXYsIG9wcy0+Z2V0X2RlZmF1bHRfY2hhbihkZXYpKTsKKwlpZiAoZXJyKSB7CisJCWI0M2VycihkZXYtPndsLCAiUEhZIGluaXQ6IENoYW5uZWwgc3dpdGNoIHRvIGRlZmF1bHQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfcGh5X2V4aXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9waHlfZXhpdDoKKwlpZiAob3BzLT5leGl0KQorCQlvcHMtPmV4aXQoZGV2KTsKK2Vycl9ibG9ja19yZjoKKwlvcHMtPnNvZnR3YXJlX3Jma2lsbChkZXYsIFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQpOworCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBiNDNfcGh5X2V4aXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnMgKm9wcyA9IGRldi0+cGh5Lm9wczsKKworCW9wcy0+c29mdHdhcmVfcmZraWxsKGRldiwgUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCk7CisJaWYgKG9wcy0+ZXhpdCkKKwkJb3BzLT5leGl0KGRldik7Cit9CisKK2Jvb2wgYjQzX2hhc19oYXJkd2FyZV9wY3RsKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlpZiAoIWRldi0+cGh5LmhhcmR3YXJlX3Bvd2VyX2NvbnRyb2wpCisJCXJldHVybiAwOworCWlmICghZGV2LT5waHkub3BzLT5zdXBwb3J0c19od3BjdGwpCisJCXJldHVybiAwOworCXJldHVybiBkZXYtPnBoeS5vcHMtPnN1cHBvcnRzX2h3cGN0bChkZXYpOworfQorCit2b2lkIGI0M19yYWRpb19sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwl1MzIgbWFjY3RsOworCisJbWFjY3RsID0gYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7CisJQjQzX1dBUk5fT04obWFjY3RsICYgQjQzX01BQ0NUTF9SQURJT0xPQ0spOworCW1hY2N0bCB8PSBCNDNfTUFDQ1RMX1JBRElPTE9DSzsKKwliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwgbWFjY3RsKTsKKwkvKiBDb21taXQgdGhlIHdyaXRlIGFuZCB3YWl0IGZvciB0aGUgZGV2aWNlCisJICogdG8gZXhpdCBhbnkgcmFkaW8gcmVnaXN0ZXIgYWNjZXNzLiAqLworCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOworCXVkZWxheSgxMCk7Cit9CisKK3ZvaWQgYjQzX3JhZGlvX3VubG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTMyIG1hY2N0bDsKKworCS8qIENvbW1pdCBhbnkgd3JpdGUgKi8KKwliNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUEhZX1ZFUik7CisJLyogdW5sb2NrICovCisJbWFjY3RsID0gYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7CisJQjQzX1dBUk5fT04oIShtYWNjdGwgJiBCNDNfTUFDQ1RMX1JBRElPTE9DSykpOworCW1hY2N0bCAmPSB+QjQzX01BQ0NUTF9SQURJT0xPQ0s7CisJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsIG1hY2N0bCk7Cit9CisKK3ZvaWQgYjQzX3BoeV9sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKyNpZiBCNDNfREVCVUcKKwlCNDNfV0FSTl9PTihkZXYtPnBoeS5waHlfbG9ja2VkKTsKKwlkZXYtPnBoeS5waHlfbG9ja2VkID0gMTsKKyNlbmRpZgorCUI0M19XQVJOX09OKGRldi0+ZGV2LT5pZC5yZXZpc2lvbiA8IDMpOworCisJaWYgKCFiNDNfaXNfbW9kZShkZXYtPndsLCBOTDgwMjExX0lGVFlQRV9BUCkpCisJCWI0M19wb3dlcl9zYXZpbmdfY3RsX2JpdHMoZGV2LCBCNDNfUFNfQVdBS0UpOworfQorCit2b2lkIGI0M19waHlfdW5sb2NrKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKyNpZiBCNDNfREVCVUcKKwlCNDNfV0FSTl9PTighZGV2LT5waHkucGh5X2xvY2tlZCk7CisJZGV2LT5waHkucGh5X2xvY2tlZCA9IDA7CisjZW5kaWYKKwlCNDNfV0FSTl9PTihkZXYtPmRldi0+aWQucmV2aXNpb24gPCAzKTsKKworCWlmICghYjQzX2lzX21vZGUoZGV2LT53bCwgTkw4MDIxMV9JRlRZUEVfQVApKQorCQliNDNfcG93ZXJfc2F2aW5nX2N0bF9iaXRzKGRldiwgMCk7Cit9CisKK3UxNiBiNDNfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJcmV0dXJuIGRldi0+cGh5Lm9wcy0+cmFkaW9fcmVhZChkZXYsIHJlZyk7Cit9CisKK3ZvaWQgYjQzX3JhZGlvX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCWRldi0+cGh5Lm9wcy0+cmFkaW9fd3JpdGUoZGV2LCByZWcsIHZhbHVlKTsKK30KKwordm9pZCBiNDNfcmFkaW9fbWFzayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBtYXNrKQoreworCWI0M19yYWRpb193cml0ZTE2KGRldiwgb2Zmc2V0LAorCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgb2Zmc2V0KSAmIG1hc2spOworfQorCit2b2lkIGI0M19yYWRpb19zZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgc2V0KQoreworCWI0M19yYWRpb193cml0ZTE2KGRldiwgb2Zmc2V0LAorCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgb2Zmc2V0KSB8IHNldCk7Cit9CisKK3ZvaWQgYjQzX3JhZGlvX21hc2tzZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgbWFzaywgdTE2IHNldCkKK3sKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIG9mZnNldCwKKwkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCBvZmZzZXQpICYgbWFzaykgfCBzZXQpOworfQorCit1MTYgYjQzX3BoeV9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZykKK3sKKwlyZXR1cm4gZGV2LT5waHkub3BzLT5waHlfcmVhZChkZXYsIHJlZyk7Cit9CisKK3ZvaWQgYjQzX3BoeV93cml0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlkZXYtPnBoeS5vcHMtPnBoeV93cml0ZShkZXYsIHJlZywgdmFsdWUpOworfQorCit2b2lkIGI0M19waHlfbWFzayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBtYXNrKQoreworCWI0M19waHlfd3JpdGUoZGV2LCBvZmZzZXQsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIG9mZnNldCkgJiBtYXNrKTsKK30KKwordm9pZCBiNDNfcGh5X3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBzZXQpCit7CisJYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgb2Zmc2V0KSB8IHNldCk7Cit9CisKK3ZvaWQgYjQzX3BoeV9tYXNrc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2ssIHUxNiBzZXQpCit7CisJYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwKKwkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Cit9CisKK2ludCBiNDNfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LCB1bnNpZ25lZCBpbnQgbmV3X2NoYW5uZWwpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICYoZGV2LT5waHkpOworCXUxNiBjaGFubmVsY29va2llLCBzYXZlZGNvb2tpZTsKKwlpbnQgZXJyOworCisJaWYgKG5ld19jaGFubmVsID09IEI0M19ERUZBVUxUX0NIQU5ORUwpCisJCW5ld19jaGFubmVsID0gcGh5LT5vcHMtPmdldF9kZWZhdWx0X2NoYW4oZGV2KTsKKworCS8qIEZpcnN0IHdlIHNldCB0aGUgY2hhbm5lbCByYWRpbyBjb2RlIHRvIHByZXZlbnQgdGhlCisJICogZmlybXdhcmUgZnJvbSBzZW5kaW5nIGdob3N0IHBhY2tldHMuCisJICovCisJY2hhbm5lbGNvb2tpZSA9IG5ld19jaGFubmVsOworCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCWNoYW5uZWxjb29raWUgfD0gMHgxMDA7CisJLy9GSVhNRSBzZXQgNDBNaHogZmxhZyBpZiByZXF1aXJlZAorCXNhdmVkY29va2llID0gYjQzX3NobV9yZWFkMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgQjQzX1NITV9TSF9DSEFOKTsKKwliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgQjQzX1NITV9TSF9DSEFOLCBjaGFubmVsY29va2llKTsKKworCS8qIE5vdyB0cnkgdG8gc3dpdGNoIHRoZSBQSFkgaGFyZHdhcmUgY2hhbm5lbC4gKi8KKwllcnIgPSBwaHktPm9wcy0+c3dpdGNoX2NoYW5uZWwoZGV2LCBuZXdfY2hhbm5lbCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVzdG9yZV9jb29raWU7CisKKwlkZXYtPnBoeS5jaGFubmVsID0gbmV3X2NoYW5uZWw7CisJLyogV2FpdCBmb3IgdGhlIHJhZGlvIHRvIHR1bmUgdG8gdGhlIGNoYW5uZWwgYW5kIHN0YWJpbGl6ZS4gKi8KKwltc2xlZXAoOCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3Jlc3RvcmVfY29va2llOgorCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELAorCQkJQjQzX1NITV9TSF9DSEFOLCBzYXZlZGNvb2tpZSk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGI0M19zb2Z0d2FyZV9yZmtpbGwoc3RydWN0IGI0M193bGRldiAqZGV2LCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJaWYgKHN0YXRlID09IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQpIHsKKwkJLyogV2UgY2Fubm90IGhhcmR3YXJlLWJsb2NrIHRoZSBkZXZpY2UgKi8KKwkJc3RhdGUgPSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworCX0KKworCXBoeS0+b3BzLT5zb2Z0d2FyZV9yZmtpbGwoZGV2LCBzdGF0ZSk7CisJcGh5LT5yYWRpb19vbiA9IChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKTsKK30KKworLyoqCisgKiBiNDNfcGh5X3R4cG93ZXJfYWRqdXN0X3dvcmsgLSBUWCBwb3dlciB3b3JrcXVldWUuCisgKgorICogV29ya3F1ZXVlIGZvciB1cGRhdGluZyB0aGUgVFggcG93ZXIgcGFyYW1ldGVycyBpbiBoYXJkd2FyZS4KKyAqLwordm9pZCBiNDNfcGh5X3R4cG93ZXJfYWRqdXN0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiNDNfd2wgKndsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiNDNfd2wsCisJCQkJCSB0eHBvd2VyX2FkanVzdF93b3JrKTsKKwlzdHJ1Y3QgYjQzX3dsZGV2ICpkZXY7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCWRldiA9IHdsLT5jdXJyZW50X2RldjsKKworCWlmIChsaWtlbHkoZGV2ICYmIChiNDNfc3RhdHVzKGRldikgPj0gQjQzX1NUQVRfU1RBUlRFRCkpKQorCQlkZXYtPnBoeS5vcHMtPmFkanVzdF90eHBvd2VyKGRldik7CisKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7Cit9CisKKy8qIENhbGxlZCB3aXRoIHdsLT5pcnFfbG9jayBsb2NrZWQgKi8KK3ZvaWQgYjQzX3BoeV90eHBvd2VyX2NoZWNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWVudW0gYjQzX3R4cHdyX3Jlc3VsdCByZXN1bHQ7CisKKwlpZiAoIShmbGFncyAmIEI0M19UWFBXUl9JR05PUkVfVElNRSkpIHsKKwkJLyogQ2hlY2sgaWYgaXQncyB0aW1lIGZvciBhIFRYcG93ZXIgY2hlY2suICovCisJCWlmICh0aW1lX2JlZm9yZShub3csIHBoeS0+bmV4dF90eHB3cl9jaGVja190aW1lKSkKKwkJCXJldHVybjsgLyogTm90IHlldCAqLworCX0KKwkvKiBUaGUgbmV4dCBjaGVjayB3aWxsIGJlIG5lZWRlZCBpbiB0d28gc2Vjb25kcywgb3IgbGF0ZXIuICovCisJcGh5LT5uZXh0X3R4cHdyX2NoZWNrX3RpbWUgPSByb3VuZF9qaWZmaWVzKG5vdyArIChIWiAqIDIpKTsKKworCWlmICgoZGV2LT5kZXYtPmJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgorCSAgICAoZGV2LT5kZXYtPmJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JVNDMwNikpCisJCXJldHVybjsgLyogTm8gc29mdHdhcmUgdHhwb3dlciBhZGp1c3RtZW50IG5lZWRlZCAqLworCisJcmVzdWx0ID0gcGh5LT5vcHMtPnJlY2FsY190eHBvd2VyKGRldiwgISEoZmxhZ3MgJiBCNDNfVFhQV1JfSUdOT1JFX1RTU0kpKTsKKwlpZiAocmVzdWx0ID09IEI0M19UWFBXUl9SRVNfRE9ORSkKKwkJcmV0dXJuOyAvKiBXZSBhcmUgZG9uZS4gKi8KKwlCNDNfV0FSTl9PTihyZXN1bHQgIT0gQjQzX1RYUFdSX1JFU19ORUVEX0FESlVTVCk7CisJQjQzX1dBUk5fT04ocGh5LT5vcHMtPmFkanVzdF90eHBvd2VyID09IE5VTEwpOworCisJLyogV2UgbXVzdCBhZGp1c3QgdGhlIHRyYW5zbWlzc2lvbiBwb3dlciBpbiBoYXJkd2FyZS4KKwkgKiBTY2hlZHVsZSBiNDNfcGh5X3R4cG93ZXJfYWRqdXN0X3dvcmsoKS4gKi8KKwlxdWV1ZV93b3JrKGRldi0+d2wtPmh3LT53b3JrcXVldWUsICZkZXYtPndsLT50eHBvd2VyX2FkanVzdF93b3JrKTsKK30KKworaW50IGI0M19waHlfc2htX3Rzc2lfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBzaG1fb2Zmc2V0KQoreworCWNvbnN0IGJvb2wgaXNfb2ZkbSA9IChzaG1fb2Zmc2V0ICE9IEI0M19TSE1fU0hfVFNTSV9DQ0spOworCXVuc2lnbmVkIGludCBhLCBiLCBjLCBkOworCXVuc2lnbmVkIGludCBhdmVyYWdlOworCXUzMiB0bXA7CisKKwl0bXAgPSBiNDNfc2htX3JlYWQzMihkZXYsIEI0M19TSE1fU0hBUkVELCBzaG1fb2Zmc2V0KTsKKwlhID0gdG1wICYgMHhGRjsKKwliID0gKHRtcCA+PiA4KSAmIDB4RkY7CisJYyA9ICh0bXAgPj4gMTYpICYgMHhGRjsKKwlkID0gKHRtcCA+PiAyNCkgJiAweEZGOworCWlmIChhID09IDAgfHwgYSA9PSBCNDNfVFNTSV9NQVggfHwKKwkgICAgYiA9PSAwIHx8IGIgPT0gQjQzX1RTU0lfTUFYIHx8CisJICAgIGMgPT0gMCB8fCBjID09IEI0M19UU1NJX01BWCB8fAorCSAgICBkID09IDAgfHwgZCA9PSBCNDNfVFNTSV9NQVgpCisJCXJldHVybiAtRU5PRU5UOworCS8qIFRoZSB2YWx1ZXMgYXJlIE9LLiBDbGVhciB0aGVtLiAqLworCXRtcCA9IEI0M19UU1NJX01BWCB8IChCNDNfVFNTSV9NQVggPDwgOCkgfAorCSAgICAgIChCNDNfVFNTSV9NQVggPDwgMTYpIHwgKEI0M19UU1NJX01BWCA8PCAyNCk7CisJYjQzX3NobV93cml0ZTMyKGRldiwgQjQzX1NITV9TSEFSRUQsIHNobV9vZmZzZXQsIHRtcCk7CisKKwlpZiAoaXNfb2ZkbSkgeworCQlhID0gKGEgKyAzMikgJiAweDNGOworCQliID0gKGIgKyAzMikgJiAweDNGOworCQljID0gKGMgKyAzMikgJiAweDNGOworCQlkID0gKGQgKyAzMikgJiAweDNGOworCX0KKworCS8qIEdldCB0aGUgYXZlcmFnZSBvZiB0aGUgdmFsdWVzIHdpdGggMC41IGFkZGVkIHRvIGVhY2ggdmFsdWUuICovCisJYXZlcmFnZSA9IChhICsgYiArIGMgKyBkICsgMikgLyA0OworCWlmIChpc19vZmRtKSB7CisJCS8qIEFkanVzdCBmb3IgQ0NLLWJvb3N0ICovCisJCWlmIChiNDNfc2htX3JlYWQxNihkZXYsIEI0M19TSE1fU0hBUkVELCBCNDNfU0hNX1NIX0hPU1RGTE8pCisJCSAgICAmIEI0M19IRl9DQ0tCT09TVCkKKwkJCWF2ZXJhZ2UgPSAoYXZlcmFnZSA+PSAxMykgPyAoYXZlcmFnZSAtIDEzKSA6IDA7CisJfQorCisJcmV0dXJuIGF2ZXJhZ2U7Cit9CisKK3ZvaWQgYjQzX3BoeW9wX3N3aXRjaF9hbmFsb2dfZ2VuZXJpYyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgb24pCit7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFkwLCBvbiA/IDAgOiAweEY0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjU0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5oCkBAIC0wLDAgKzEsNDEzIEBACisjaWZuZGVmIExJTlVYX0I0M19QSFlfQ09NTU9OX0hfCisjZGVmaW5lIExJTlVYX0I0M19QSFlfQ09NTU9OX0hfCisKKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKworc3RydWN0IGI0M193bGRldjsKKworCisvKiBQSFkgcmVnaXN0ZXIgcm91dGluZyBiaXRzICovCisjZGVmaW5lIEI0M19QSFlST1VURQkJCTB4MEMwMCAvKiBQSFkgcmVnaXN0ZXIgcm91dGluZyBiaXRzIG1hc2sgKi8KKyNkZWZpbmUgIEI0M19QSFlST1VURV9CQVNFCQkweDAwMDAgLyogQmFzZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgIEI0M19QSFlST1VURV9PRkRNX0dQSFkJCTB4MDQwMCAvKiBPRkRNIHJlZ2lzdGVyIHJvdXRpbmcgZm9yIEctUEhZcyAqLworI2RlZmluZSAgQjQzX1BIWVJPVVRFX0VYVF9HUEhZCQkweDA4MDAgLyogRXh0ZW5kZWQgRy1QSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lICBCNDNfUEhZUk9VVEVfTl9CTU9ERQkJMHgwQzAwIC8qIE4tUEhZIEJNT0RFIHJlZ2lzdGVycyAqLworCisvKiBDQ0sgKEItUEhZKSByZWdpc3RlcnMuICovCisjZGVmaW5lIEI0M19QSFlfQ0NLKHJlZykJCSgocmVnKSB8IEI0M19QSFlST1VURV9CQVNFKQorLyogTi1QSFkgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBCNDNfUEhZX04ocmVnKQkJCSgocmVnKSB8IEI0M19QSFlST1VURV9CQVNFKQorLyogTi1QSFkgQk1PREUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBCNDNfUEhZX05fQk1PREUocmVnKQkJKChyZWcpIHwgQjQzX1BIWVJPVVRFX05fQk1PREUpCisvKiBPRkRNIChBLVBIWSkgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBCNDNfUEhZX09GRE0ocmVnKQkJKChyZWcpIHwgQjQzX1BIWVJPVVRFX09GRE1fR1BIWSkKKy8qIEV4dGVuZGVkIEctUEhZIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgQjQzX1BIWV9FWFRHKHJlZykJCSgocmVnKSB8IEI0M19QSFlST1VURV9FWFRfR1BIWSkKKworCisvKiBNYXNrcyBmb3IgdGhlIFBIWSB2ZXJzaW9uaW5nIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgQjQzX1BIWVZFUl9BTkFMT0cJCTB4RjAwMAorI2RlZmluZSBCNDNfUEhZVkVSX0FOQUxPR19TSElGVAkJMTIKKyNkZWZpbmUgQjQzX1BIWVZFUl9UWVBFCQkJMHgwRjAwCisjZGVmaW5lIEI0M19QSFlWRVJfVFlQRV9TSElGVAkJOAorI2RlZmluZSBCNDNfUEhZVkVSX1ZFUlNJT04JCTB4MDBGRgorCisvKioKKyAqIGVudW0gYjQzX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uIC0gSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gbW9kZQorICoKKyAqIEBCNDNfSU5URVJGTU9ERV9OT05FOglEaXNhYmxlZAorICogQEI0M19JTlRFUkZNT0RFX05PTldMQU46CU5vbi1XTEFOIEludGVyZmVyZW5jZSBNaXRpZ2F0aW9uCisgKiBAQjQzX0lOVEVSRk1PREVfTUFOVUFMV0xBTjoJV0xBTiBJbnRlcmZlcmVuY2UgTWl0aWdhdGlvbgorICogQEI0M19JTlRFUkZNT0RFX0FVVE9XTEFOOglBdXRvbWF0aWMgV0xBTiBJbnRlcmZlcmVuY2UgTWl0aWdhdGlvbgorICovCitlbnVtIGI0M19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbiB7CisJQjQzX0lOVEVSRk1PREVfTk9ORSwKKwlCNDNfSU5URVJGTU9ERV9OT05XTEFOLAorCUI0M19JTlRFUkZNT0RFX01BTlVBTFdMQU4sCisJQjQzX0lOVEVSRk1PREVfQVVUT1dMQU4sCit9OworCisvKiBBbnRlbm5hIGlkZW50aWZpZXJzICovCitlbnVtIHsKKwlCNDNfQU5URU5OQTAsCQkvKiBBbnRlbm5hIDAgKi8KKwlCNDNfQU5URU5OQTEsCQkvKiBBbnRlbm5hIDAgKi8KKwlCNDNfQU5URU5OQV9BVVRPMSwJLyogQXV0b21hdGljLCBzdGFydGluZyB3aXRoIGFudGVubmEgMSAqLworCUI0M19BTlRFTk5BX0FVVE8wLAkvKiBBdXRvbWF0aWMsIHN0YXJ0aW5nIHdpdGggYW50ZW5uYSAwICovCisJQjQzX0FOVEVOTkEyLAorCUI0M19BTlRFTk5BMyA9IDgsCisKKwlCNDNfQU5URU5OQV9BVVRPID0gQjQzX0FOVEVOTkFfQVVUTzAsCisJQjQzX0FOVEVOTkFfREVGQVVMVCA9IEI0M19BTlRFTk5BX0FVVE8sCit9OworCisvKioKKyAqIGVudW0gYjQzX3R4cHdyX3Jlc3VsdCAtIFJldHVybiB2YWx1ZSBmb3IgdGhlIHJlY2FsY190eHBvd2VyIFBIWSBvcC4KKyAqCisgKiBAQjQzX1RYUFdSX1JFU19ORUVEX0FESlVTVDoJVmFsdWVzIGNoYW5nZWQuIEhhcmR3YXJlIGFkanVzdG1lbnQgaXMgbmVlZGVkLgorICogQEI0M19UWFBXUl9SRVNfRE9ORToJCU5vIG1vcmUgd29yayB0byBkby4gRXZlcnl0aGluZyBpcyBkb25lLgorICovCitlbnVtIGI0M190eHB3cl9yZXN1bHQgeworCUI0M19UWFBXUl9SRVNfTkVFRF9BREpVU1QsCisJQjQzX1RYUFdSX1JFU19ET05FLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIC0gRnVuY3Rpb24gcG9pbnRlcnMgZm9yIFBIWSBvcHMuCisgKgorICogQGFsbG9jYXRlOgkJQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgdGhlIFBIWSBkYXRhIHN0cnVjdHVyZXMuCisgKiAJCQlNdXN0IG5vdCBiZSBOVUxMLgorICogQGZyZWU6CQlEZXN0cm95IGFuZCBmcmVlIHRoZSBQSFkgZGF0YSBzdHJ1Y3R1cmVzLgorICogCQkJTXVzdCBub3QgYmUgTlVMTC4KKyAqCisgKiBAcHJlcGFyZV9zdHJ1Y3RzOglQcmVwYXJlIHRoZSBQSFkgZGF0YSBzdHJ1Y3R1cmVzLgorICogCQkJVGhlIGRhdGEgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gQGFsbG9jYXRlIGFyZQorICogCQkJaW5pdGlhbGl6ZWQgaGVyZS4KKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAcHJlcGFyZV9oYXJkd2FyZToJUHJlcGFyZSB0aGUgUEhZLiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgYjQzX2NoaXBfaW5pdCB0bworICogCQkJZG8gc29tZSBlYXJseSBlYXJseSBQSFkgaGFyZHdhcmUgaW5pdC4KKyAqIAkJCUNhbiBiZSBOVUxMLCBpZiBub3QgcmVxdWlyZWQuCisgKiBAaW5pdDoJCUluaXRpYWxpemUgdGhlIFBIWS4KKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAZXhpdDoJCVNodXRkb3duIHRoZSBQSFkuCisgKiAJCQlDYW4gYmUgTlVMTCwgaWYgbm90IHJlcXVpcmVkLgorICoKKyAqIEBwaHlfcmVhZDoJCVJlYWQgZnJvbSBhIFBIWSByZWdpc3Rlci4KKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAcGh5X3dyaXRlOgkJV3JpdGUgdG8gYSBQSFkgcmVnaXN0ZXIuCisgKiAJCQlNdXN0IG5vdCBiZSBOVUxMLgorICogQHJhZGlvX3JlYWQ6CQlSZWFkIGZyb20gYSBSYWRpbyByZWdpc3Rlci4KKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAcmFkaW9fd3JpdGU6CVdyaXRlIHRvIGEgUmFkaW8gcmVnaXN0ZXIuCisgKiAJCQlNdXN0IG5vdCBiZSBOVUxMLgorICoKKyAqIEBzdXBwb3J0c19od3BjdGw6CVJldHVybnMgYSBib29sZWFuIHdoZXRoZXIgSGFyZHdhcmUgUG93ZXIgQ29udHJvbAorICogCQkJaXMgc3VwcG9ydGVkIG9yIG5vdC4KKyAqIAkJCUlmIE5VTEwsIGh3cGN0bCBpcyBhc3N1bWVkIHRvIGJlIG5ldmVyIHN1cHBvcnRlZC4KKyAqIEBzb2Z0d2FyZV9yZmtpbGw6CVR1cm4gdGhlIHJhZGlvIE9OIG9yIE9GRi4KKyAqIAkJCVBvc3NpYmxlIHN0YXRlIHZhbHVlcyBhcmUKKyAqIAkJCVJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQgb3IKKyAqIAkJCVJGS0lMTF9TVEFURV9VTkJMT0NLRUQKKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAc3dpdGNoX2FuYWxvZzoJVHVybiB0aGUgQW5hbG9nIG9uL29mZi4KKyAqIAkJCU11c3Qgbm90IGJlIE5VTEwuCisgKiBAc3dpdGNoX2NoYW5uZWw6CVN3aXRjaCB0aGUgcmFkaW8gdG8gYW5vdGhlciBjaGFubmVsLgorICogCQkJTXVzdCBub3QgYmUgTlVMTC4KKyAqIEBnZXRfZGVmYXVsdF9jaGFuOglKdXN0IHJldHVybnMgdGhlIGRlZmF1bHQgY2hhbm5lbCBudW1iZXIuCisgKiAJCQlNdXN0IG5vdCBiZSBOVUxMLgorICogQHNldF9yeF9hbnRlbm5hOglTZXQgdGhlIGFudGVubmEgdXNlZCBmb3IgUlguCisgKiAJCQlDYW4gYmUgTlVMTCwgaWYgbm90IHN1cHBvcnRlZC4KKyAqIEBpbnRlcmZfbWl0aWdhdGlvbjoJU3dpdGNoIHRoZSBJbnRlcmZlcmVuY2UgTWl0aWdhdGlvbiBtb2RlLgorICogCQkJQ2FuIGJlIE5VTEwsIGlmIG5vdCBzdXBwb3J0ZWQuCisgKgorICogQHJlY2FsY190eHBvd2VyOglSZWNhbGN1bGF0ZSB0aGUgdHJhbnNtaXNzaW9uIHBvd2VyIHBhcmFtZXRlcnMuCisgKiAJCQlUaGlzIGNhbGxiYWNrIGhhcyB0byByZWNhbGN1bGF0ZSB0aGUgVFggcG93ZXIgc2V0dGluZ3MsCisgKiAJCQlidXQgZG9lcyBub3QgbmVlZCB0byB3cml0ZSB0aGVtIHRvIHRoZSBoYXJkd2FyZSwgeWV0LgorICogCQkJUmV0dXJucyBlbnVtIGI0M190eHB3cl9yZXN1bHQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgaGFyZHdhcmUKKyAqIAkJCW5lZWRzIHRvIGJlIGFkanVzdGVkLgorICogCQkJSWYgQjQzX1RYUFdSX05FRURfQURKVVNUIGlzIHJldHVybmVkLCBAYWRqdXN0X3R4cG93ZXIKKyAqIAkJCXdpbGwgYmUgY2FsbGVkIGxhdGVyLgorICogCQkJSWYgdGhlIHBhcmFtZXRlciAiaWdub3JlX3Rzc2kiIGlzIHRydWUsIHRoZSBUU1NJIHZhbHVlcyBzaG91bGQKKyAqIAkJCWJlIGlnbm9yZWQgYW5kIGEgcmVjYWxjdWxhdGlvbiBvZiB0aGUgcG93ZXIgc2V0dGluZ3Mgc2hvdWxkIGJlCisgKiAJCQlkb25lIGV2ZW4gaWYgdGhlIFRTU0kgdmFsdWVzIGRpZCBub3QgY2hhbmdlLgorICogCQkJVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB3bC0+aXJxX2xvY2sgaGVsZCBhbmQgbXVzdCBub3Qgc2xlZXAuCisgKiAJCQlNdXN0IG5vdCBiZSBOVUxMLgorICogQGFkanVzdF90eHBvd2VyOglXcml0ZSB0aGUgcHJldmlvdXNseSBjYWxjdWxhdGVkIFRYIHBvd2VyIHNldHRpbmdzCisgKiAJCQkoZnJvbSBAcmVjYWxjX3R4cG93ZXIpIHRvIHRoZSBoYXJkd2FyZS4KKyAqIAkJCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICogCQkJQ2FuIGJlIE5VTEwsIGlmIChhbmQgT05MWSBpZikgQHJlY2FsY190eHBvd2VyIF9hbHdheXNfCisgKiAJCQlyZXR1cm5zIEI0M19UWFBXUl9SRVNfRE9ORS4KKyAqCisgKiBAcHdvcmtfMTVzZWM6CVBlcmlvZGljIHdvcmsuIENhbGxlZCBldmVyeSAxNSBzZWNvbmRzLgorICogCQkJQ2FuIGJlIE5VTEwsIGlmIG5vdCByZXF1aXJlZC4KKyAqIEBwd29ya182MHNlYzoJUGVyaW9kaWMgd29yay4gQ2FsbGVkIGV2ZXJ5IDYwIHNlY29uZHMuCisgKiAJCQlDYW4gYmUgTlVMTCwgaWYgbm90IHJlcXVpcmVkLgorICovCitzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIHsKKwkvKiBJbml0aWFsaXNhdGlvbiAqLworCWludCAoKmFsbG9jYXRlKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCXZvaWQgKCpwcmVwYXJlX3N0cnVjdHMpKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisJaW50ICgqcHJlcGFyZV9oYXJkd2FyZSkoc3RydWN0IGI0M193bGRldiAqZGV2KTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCXZvaWQgKCpleGl0KShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisJLyogUmVnaXN0ZXIgYWNjZXNzICovCisJdTE2ICgqcGh5X3JlYWQpKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZyk7CisJdm9pZCAoKnBoeV93cml0ZSkoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpOworCXUxNiAoKnJhZGlvX3JlYWQpKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZyk7CisJdm9pZCAoKnJhZGlvX3dyaXRlKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcsIHUxNiB2YWx1ZSk7CisKKwkvKiBSYWRpbyAqLworCWJvb2wgKCpzdXBwb3J0c19od3BjdGwpKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisJdm9pZCAoKnNvZnR3YXJlX3Jma2lsbCkoc3RydWN0IGI0M193bGRldiAqZGV2LCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSk7CisJdm9pZCAoKnN3aXRjaF9hbmFsb2cpKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBvbik7CisJaW50ICgqc3dpdGNoX2NoYW5uZWwpKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdW5zaWduZWQgaW50IG5ld19jaGFubmVsKTsKKwl1bnNpZ25lZCBpbnQgKCpnZXRfZGVmYXVsdF9jaGFuKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCXZvaWQgKCpzZXRfcnhfYW50ZW5uYSkoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgYW50ZW5uYSk7CisJaW50ICgqaW50ZXJmX21pdGlnYXRpb24pKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgZW51bSBiNDNfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24gbmV3X21vZGUpOworCisJLyogVHJhbnNtaXNzaW9uIHBvd2VyIGFkanVzdG1lbnQgKi8KKwllbnVtIGI0M190eHB3cl9yZXN1bHQgKCpyZWNhbGNfdHhwb3dlcikoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkJYm9vbCBpZ25vcmVfdHNzaSk7CisJdm9pZCAoKmFkanVzdF90eHBvd2VyKShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisJLyogTWlzYyAqLworCXZvaWQgKCpwd29ya18xNXNlYykoc3RydWN0IGI0M193bGRldiAqZGV2KTsKKwl2b2lkICgqcHdvcmtfNjBzZWMpKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Cit9OworCitzdHJ1Y3QgYjQzX3BoeV9hOworc3RydWN0IGI0M19waHlfZzsKK3N0cnVjdCBiNDNfcGh5X247CitzdHJ1Y3QgYjQzX3BoeV9scDsKKworc3RydWN0IGI0M19waHkgeworCS8qIEhhcmR3YXJlIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCisJY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyAqb3BzOworCisJLyogTW9zdCBoYXJkd2FyZSBjb250ZXh0IGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgc3RhbmRhcmQtCisJICogc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzIHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXJzIGJlbG93LgorCSAqIE9ubHkgb25lIG9mIHRoZW0gaXMgdmFsaWQgKHRoZSBjdXJyZW50bHkgZW5hYmxlZCBQSFkpLiAqLworI2lmZGVmIENPTkZJR19CNDNfREVCVUcKKwkvKiBObyB1bmlvbiBmb3IgZGVidWcgYnVpbGQgdG8gZm9yY2UgTlVMTCBkZXJlZnMgaW4gYnVnZ3kgY29kZS4gKi8KKwlzdHJ1Y3QgeworI2Vsc2UKKwl1bmlvbiB7CisjZW5kaWYKKwkJLyogQS1QSFkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwkJc3RydWN0IGI0M19waHlfYSAqYTsKKwkJLyogRy1QSFkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwkJc3RydWN0IGI0M19waHlfZyAqZzsKKwkJLyogTi1QSFkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwkJc3RydWN0IGI0M19waHlfbiAqbjsKKwkJLyogTFAtUEhZIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJCXN0cnVjdCBiNDNfcGh5X2xwICpscDsKKwl9OworCisJLyogQmFuZCBzdXBwb3J0IGZsYWdzLiAqLworCWJvb2wgc3VwcG9ydHNfMmdoejsKKwlib29sIHN1cHBvcnRzXzVnaHo7CisKKwkvKiBHTU9ERSBiaXQgZW5hYmxlZD8gKi8KKwlib29sIGdtb2RlOworCisJLyogQW5hbG9nIFR5cGUgKi8KKwl1OCBhbmFsb2c7CisJLyogQjQzX1BIWVRZUEVfICovCisJdTggdHlwZTsKKwkvKiBQSFkgcmV2aXNpb24gbnVtYmVyLiAqLworCXU4IHJldjsKKworCS8qIFJhZGlvIHZlcnNpb25pbmcgKi8KKwl1MTYgcmFkaW9fbWFudWY7CS8qIFJhZGlvIG1hbnVmYWN0dXJlciAqLworCXUxNiByYWRpb192ZXI7CQkvKiBSYWRpbyB2ZXJzaW9uICovCisJdTggcmFkaW9fcmV2OwkJLyogUmFkaW8gcmV2aXNpb24gKi8KKworCS8qIFNvZnR3YXJlIHN0YXRlIG9mIHRoZSByYWRpbyAqLworCWJvb2wgcmFkaW9fb247CisKKwkvKiBEZXNpcmVkIFRYIHBvd2VyIGxldmVsIChpbiBkQm0pLgorCSAqIFRoaXMgaXMgc2V0IGJ5IHRoZSB1c2VyIGFuZCBhZGp1c3RlZCBpbiBiNDNfcGh5X3htaXRwb3dlcigpLiAqLworCWludCBkZXNpcmVkX3R4cG93ZXI7CisKKwkvKiBIYXJkd2FyZSBQb3dlciBDb250cm9sIGVuYWJsZWQ/ICovCisJYm9vbCBoYXJkd2FyZV9wb3dlcl9jb250cm9sOworCisJLyogVGhlIHRpbWUgKGluIGFic29sdXRlIGppZmZpZXMpIHdoZW4gdGhlIG5leHQgVFggcG93ZXIgb3V0cHV0CisJICogY2hlY2sgaXMgbmVlZGVkLiAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF90eHB3cl9jaGVja190aW1lOworCisJLyogY3VycmVudCBjaGFubmVsICovCisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisKKwkvKiBQSFkgVFggZXJyb3JzIGNvdW50ZXIuICovCisJYXRvbWljX3QgdHhlcnJfY250OworCisjaWZkZWYgQ09ORklHX0I0M19ERUJVRworCS8qIFBIWSByZWdpc3RlcnMgbG9ja2VkIGJ5IGI0M19waHlfbG9jaygpPyAqLworCWJvb2wgcGh5X2xvY2tlZDsKKyNlbmRpZiAvKiBCNDNfREVCVUcgKi8KK307CisKKworLyoqCisgKiBiNDNfcGh5X2FsbG9jYXRlIC0gQWxsb2NhdGUgUEhZIHN0cnVjdHMKKyAqIEFsbG9jYXRlIHRoZSBQSFkgZGF0YSBzdHJ1Y3R1cmVzLCBiYXNlZCBvbiB0aGUgY3VycmVudCBkZXYtPnBoeS50eXBlCisgKi8KK2ludCBiNDNfcGh5X2FsbG9jYXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisKKy8qKgorICogYjQzX3BoeV9mcmVlIC0gRnJlZSBQSFkgc3RydWN0cworICovCit2b2lkIGI0M19waHlfZnJlZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19waHlfaW5pdCAtIEluaXRpYWxpc2UgdGhlIFBIWQorICovCitpbnQgYjQzX3BoeV9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldik7CisKKy8qKgorICogYjQzX3BoeV9leGl0IC0gQ2xlYW51cCBQSFkKKyAqLwordm9pZCBiNDNfcGh5X2V4aXQoc3RydWN0IGI0M193bGRldiAqZGV2KTsKKworLyoqCisgKiBiNDNfaGFzX2hhcmR3YXJlX3BjdGwgLSBIYXJkd2FyZSBQb3dlciBDb250cm9sIHN1cHBvcnRlZD8KKyAqIFJldHVybnMgYSBib29sZWFuLCB3aGV0aGVyIGhhcmR3YXJlIHBvd2VyIGNvbnRyb2wgaXMgc3VwcG9ydGVkLgorICovCitib29sIGI0M19oYXNfaGFyZHdhcmVfcGN0bChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19waHlfcmVhZCAtIDE2Yml0IFBIWSByZWdpc3RlciByZWFkIGFjY2VzcworICovCit1MTYgYjQzX3BoeV9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZyk7CisKKy8qKgorICogYjQzX3BoeV93cml0ZSAtIDE2Yml0IFBIWSByZWdpc3RlciB3cml0ZSBhY2Nlc3MKKyAqLwordm9pZCBiNDNfcGh5X3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKTsKKworLyoqCisgKiBiNDNfcGh5X21hc2sgLSBNYXNrIGEgUEhZIHJlZ2lzdGVyIHdpdGggYSBtYXNrCisgKi8KK3ZvaWQgYjQzX3BoeV9tYXNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2spOworCisvKioKKyAqIGI0M19waHlfc2V0IC0gT1IgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIGJpdG1hcAorICovCit2b2lkIGI0M19waHlfc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IHNldCk7CisKKy8qKgorICogYjQzX3BoeV9tYXNrc2V0IC0gTWFzayBhbmQgT1IgYSBQSFkgcmVnaXN0ZXIgd2l0aCBhIG1hc2sgYW5kIGJpdG1hcAorICovCit2b2lkIGI0M19waHlfbWFza3NldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBvZmZzZXQsIHUxNiBtYXNrLCB1MTYgc2V0KTsKKworLyoqCisgKiBiNDNfcmFkaW9fcmVhZCAtIDE2Yml0IFJhZGlvIHJlZ2lzdGVyIHJlYWQgYWNjZXNzCisgKi8KK3UxNiBiNDNfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpOworI2RlZmluZSBiNDNfcmFkaW9fcmVhZDE2CWI0M19yYWRpb19yZWFkIC8qIERFUFJFQ0FURUQgKi8KKworLyoqCisgKiBiNDNfcmFkaW9fd3JpdGUgLSAxNmJpdCBSYWRpbyByZWdpc3RlciB3cml0ZSBhY2Nlc3MKKyAqLwordm9pZCBiNDNfcmFkaW9fd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpOworI2RlZmluZSBiNDNfcmFkaW9fd3JpdGUxNgliNDNfcmFkaW9fd3JpdGUgLyogREVQUkVDQVRFRCAqLworCisvKioKKyAqIGI0M19yYWRpb19tYXNrIC0gTWFzayBhIDE2Yml0IHJhZGlvIHJlZ2lzdGVyIHdpdGggYSBtYXNrCisgKi8KK3ZvaWQgYjQzX3JhZGlvX21hc2soc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgbWFzayk7CisKKy8qKgorICogYjQzX3JhZGlvX3NldCAtIE9SIGEgMTZiaXQgcmFkaW8gcmVnaXN0ZXIgd2l0aCBhIGJpdG1hcAorICovCit2b2lkIGI0M19yYWRpb19zZXQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgc2V0KTsKKworLyoqCisgKiBiNDNfcmFkaW9fbWFza3NldCAtIE1hc2sgYW5kIE9SIGEgcmFkaW8gcmVnaXN0ZXIgd2l0aCBhIG1hc2sgYW5kIGJpdG1hcAorICovCit2b2lkIGI0M19yYWRpb19tYXNrc2V0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG9mZnNldCwgdTE2IG1hc2ssIHUxNiBzZXQpOworCisvKioKKyAqIGI0M19yYWRpb19sb2NrIC0gTG9jayBmaXJtd2FyZSByYWRpbyByZWdpc3RlciBhY2Nlc3MKKyAqLwordm9pZCBiNDNfcmFkaW9fbG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19yYWRpb191bmxvY2sgLSBVbmxvY2sgZmlybXdhcmUgcmFkaW8gcmVnaXN0ZXIgYWNjZXNzCisgKi8KK3ZvaWQgYjQzX3JhZGlvX3VubG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19waHlfbG9jayAtIExvY2sgZmlybXdhcmUgUEhZIHJlZ2lzdGVyIGFjY2VzcworICovCit2b2lkIGI0M19waHlfbG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19waHlfdW5sb2NrIC0gVW5sb2NrIGZpcm13YXJlIFBIWSByZWdpc3RlciBhY2Nlc3MKKyAqLwordm9pZCBiNDNfcGh5X3VubG9jayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisvKioKKyAqIGI0M19zd2l0Y2hfY2hhbm5lbCAtIFN3aXRjaCB0byBhbm90aGVyIGNoYW5uZWwKKyAqLworaW50IGI0M19zd2l0Y2hfY2hhbm5lbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHVuc2lnbmVkIGludCBuZXdfY2hhbm5lbCk7CisvKioKKyAqIEI0M19ERUZBVUxUX0NIQU5ORUwgLSBTd2l0Y2ggdG8gdGhlIGRlZmF1bHQgY2hhbm5lbC4KKyAqLworI2RlZmluZSBCNDNfREVGQVVMVF9DSEFOTkVMCVVJTlRfTUFYCisKKy8qKgorICogYjQzX3NvZnR3YXJlX3Jma2lsbCAtIFR1cm4gdGhlIHJhZGlvIE9OIG9yIE9GRiBpbiBzb2Z0d2FyZS4KKyAqLwordm9pZCBiNDNfc29mdHdhcmVfcmZraWxsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpOworCisvKioKKyAqIGI0M19waHlfdHhwb3dlcl9jaGVjayAtIENoZWNrIFRYIHBvd2VyIG91dHB1dC4KKyAqCisgKiBDb21wYXJlIHRoZSBjdXJyZW50IFRYIHBvd2VyIG91dHB1dCB0byB0aGUgZGVzaXJlZCBwb3dlciBlbWlzc2lvbgorICogYW5kIHNjaGVkdWxlIGFuIGFkanVzdG1lbnQgaW4gY2FzZSBpdCBtaXNtYXRjaGVzLgorICogUmVxdWlyZXMgd2wtPmlycV9sb2NrIGxvY2tlZC4KKyAqCisgKiBAZmxhZ3M6CU9SJ2VkIGVudW0gYjQzX3BoeV90eHBvd2VyX2NoZWNrX2ZsYWdzIGZsYWdzLgorICogCQlTZWUgdGhlIGRvY3MgYmVsb3cuCisgKi8KK3ZvaWQgYjQzX3BoeV90eHBvd2VyX2NoZWNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdW5zaWduZWQgaW50IGZsYWdzKTsKKy8qKgorICogZW51bSBiNDNfcGh5X3R4cG93ZXJfY2hlY2tfZmxhZ3MgLSBGbGFncyBmb3IgYjQzX3BoeV90eHBvd2VyX2NoZWNrKCkKKyAqCisgKiBAQjQzX1RYUFdSX0lHTk9SRV9USU1FOiBJZ25vcmUgdGhlIHNjaGVkdWxlIHRpbWUgYW5kIGZvcmNlLXJlZG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaGVjayBub3cuCisgKiBAQjQzX1RYUFdSX0lHTk9SRV9UU1NJOiBSZWRvIHRoZSByZWNhbGN1bGF0aW9uLCBldmVuIGlmIHRoZSBhdmVyYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBUU1NJIGRpZCBub3QgY2hhbmdlLgorICovCitlbnVtIGI0M19waHlfdHhwb3dlcl9jaGVja19mbGFncyB7CisJQjQzX1RYUFdSX0lHTk9SRV9USU1FCQk9ICgxIDw8IDApLAorCUI0M19UWFBXUl9JR05PUkVfVFNTSQkJPSAoMSA8PCAxKSwKK307CisKK3N0cnVjdCB3b3JrX3N0cnVjdDsKK3ZvaWQgYjQzX3BoeV90eHBvd2VyX2FkanVzdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKy8qKgorICogYjQzX3BoeV9zaG1fdHNzaV9yZWFkIC0gUmVhZCB0aGUgYXZlcmFnZSBvZiB0aGUgbGFzdCA0IFRTU0kgZnJvbSBTSE0uCisgKgorICogQHNobV9vZmZzZXQ6CQlUaGUgU0hNIGFkZHJlc3MgdG8gcmVhZCB0aGUgdmFsdWVzIGZyb20uCisgKgorICogUmV0dXJucyB0aGUgYXZlcmFnZSBvZiB0aGUgNCBUU1NJIHZhbHVlcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgYjQzX3BoeV9zaG1fdHNzaV9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHNobV9vZmZzZXQpOworCisvKioKKyAqIGI0M19waHlfc3dpdGNoX2FuYWxvZ19nZW5lcmljIC0gR2VuZXJpYyBQSFkgb3BlcmF0aW9uIGZvciBzd2l0Y2hpbmcgdGhlIEFuYWxvZy4KKyAqCisgKiBJdCBkb2VzIHRoZSBzd2l0Y2hpbmcgYmFzZWQgb24gdGhlIFBIWTAgY29yZSByZWdpc3Rlci4KKyAqIERvIF9ub3RfIGNhbGwgdGhpcyBkaXJlY3RseS4gT25seSB1c2UgaXQgYXMgYSBzd2l0Y2hfYW5hbG9nIGNhbGxiYWNrCisgKiBmb3Igc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucy4KKyAqLwordm9pZCBiNDNfcGh5b3Bfc3dpdGNoX2FuYWxvZ19nZW5lcmljKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBvbik7CisKKworI2VuZGlmIC8qIExJTlVYX0I0M19QSFlfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjE4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYwpAQCAtMCwwICsxLDMyODIgQEAKKy8qCisKKyAgQnJvYWRjb20gQjQzIHdpcmVsZXNzIGRyaXZlcgorICBJRUVFIDgwMi4xMWcgUEhZIGRyaXZlcgorCisgIENvcHlyaWdodCAoYykgMjAwNSBNYXJ0aW4gTGFuZ2VyIDxtYXJ0aW4tbGFuZ2VyQGdteC5kZT4sCisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+CisgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IE1pY2hhZWwgQnVlc2NoIDxtYkBidTNzY2guZGU+CisgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBEYW5ueSB2YW4gRHlrIDxrdWdlbGZhbmdAZ2VudG9vLm9yZz4KKyAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEFuZHJlYXMgSmFnZ2kgPGFuZHJlYXMuamFnZ2lAd2F0ZXJ3YXZlLmNoPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKKyAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyovCisKKyNpbmNsdWRlICJiNDMuaCIKKyNpbmNsdWRlICJwaHlfZy5oIgorI2luY2x1ZGUgInBoeV9jb21tb24uaCIKKyNpbmNsdWRlICJsby5oIgorI2luY2x1ZGUgIm1haW4uaCIKKworI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorCisKK3N0YXRpYyBjb25zdCBzOCBiNDNfdHNzaTJkYm1fZ190YWJsZVtdID0geworCTc3LCA3NywgNzcsIDc2LAorCTc2LCA3NiwgNzUsIDc1LAorCTc0LCA3NCwgNzMsIDczLAorCTczLCA3MiwgNzIsIDcxLAorCTcxLCA3MCwgNzAsIDY5LAorCTY4LCA2OCwgNjcsIDY3LAorCTY2LCA2NSwgNjUsIDY0LAorCTYzLCA2MywgNjIsIDYxLAorCTYwLCA1OSwgNTgsIDU3LAorCTU2LCA1NSwgNTQsIDUzLAorCTUyLCA1MCwgNDksIDQ3LAorCTQ1LCA0MywgNDAsIDM3LAorCTMzLCAyOCwgMjIsIDE0LAorCTUsIC03LCAtMjAsIC0yMCwKKwktMjAsIC0yMCwgLTIwLCAtMjAsCisJLTIwLCAtMjAsIC0yMCwgLTIwLAorfTsKKworY29uc3QgdTggYjQzX3JhZGlvX2NoYW5uZWxfY29kZXNfYmdbXSA9IHsKKwkxMiwgMTcsIDIyLCAyNywKKwkzMiwgMzcsIDQyLCA0NywKKwk1MiwgNTcsIDYyLCA2NywKKwk3MiwgODQsCit9OworCisKK3N0YXRpYyB2b2lkIGI0M19jYWxjX25yc3NpX3RocmVzaG9sZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpOworCisKKyNkZWZpbmUgYml0cmV2NCh0bXApIChiaXRyZXY4KHRtcCkgPj4gNCkKKworCisvKiBHZXQgdGhlIGZyZXEsIGFzIGl0IGhhcyB0byBiZSB3cml0dGVuIHRvIHRoZSBkZXZpY2UuICovCitzdGF0aWMgaW5saW5lIHUxNiBjaGFubmVsMmZyZXFfYmcodTggY2hhbm5lbCkKK3sKKwlCNDNfV0FSTl9PTighKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSk7CisKKwlyZXR1cm4gYjQzX3JhZGlvX2NoYW5uZWxfY29kZXNfYmdbY2hhbm5lbCAtIDFdOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9yZmF0dF9saXN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQlzdHJ1Y3QgYjQzX3JmYXR0X2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKworCS8qIEFQSFkucmV2IDwgNSB8fCBHUEhZLnJldiA8IDYgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19yZmF0dCByZmF0dF8wW10gPSB7CisJCXsuYXR0ID0gMywud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gMSwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gNSwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gNywud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gOSwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gMiwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gMCwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gNCwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gNiwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gOCwud2l0aF9wYWRtaXggPSAwLH0sCisJCXsuYXR0ID0gMSwud2l0aF9wYWRtaXggPSAxLH0sCisJCXsuYXR0ID0gMiwud2l0aF9wYWRtaXggPSAxLH0sCisJCXsuYXR0ID0gMywud2l0aF9wYWRtaXggPSAxLH0sCisJCXsuYXR0ID0gNCwud2l0aF9wYWRtaXggPSAxLH0sCisJfTsKKwkvKiBSYWRpby5yZXYgPT0gOCAmJiBSYWRpby52ZXJzaW9uID09IDB4MjA1MCAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0XzFbXSA9IHsKKwkJey5hdHQgPSAyLC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA0LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA2LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA4LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSAxMCwud2l0aF9wYWRtaXggPSAxLH0sCisJCXsuYXR0ID0gMTIsLndpdGhfcGFkbWl4ID0gMSx9LAorCQl7LmF0dCA9IDE0LC53aXRoX3BhZG1peCA9IDEsfSwKKwl9OworCS8qIE90aGVyd2lzZSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0XzJbXSA9IHsKKwkJey5hdHQgPSAwLC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSAyLC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA0LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA2LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA4LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA5LC53aXRoX3BhZG1peCA9IDEsfSwKKwkJey5hdHQgPSA5LC53aXRoX3BhZG1peCA9IDEsfSwKKwl9OworCisJaWYgKCFiNDNfaGFzX2hhcmR3YXJlX3BjdGwoZGV2KSkgeworCQkvKiBTb2Z0d2FyZSBwY3RsICovCisJCWxpc3QtPmxpc3QgPSByZmF0dF8wOworCQlsaXN0LT5sZW4gPSBBUlJBWV9TSVpFKHJmYXR0XzApOworCQlsaXN0LT5taW5fdmFsID0gMDsKKwkJbGlzdC0+bWF4X3ZhbCA9IDk7CisJCXJldHVybjsKKwl9CisJaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCAmJiBwaHktPnJhZGlvX3JldiA9PSA4KSB7CisJCS8qIEhhcmR3YXJlIHBjdGwgKi8KKwkJbGlzdC0+bGlzdCA9IHJmYXR0XzE7CisJCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUocmZhdHRfMSk7CisJCWxpc3QtPm1pbl92YWwgPSAwOworCQlsaXN0LT5tYXhfdmFsID0gMTQ7CisJCXJldHVybjsKKwl9CisJLyogSGFyZHdhcmUgcGN0bCAqLworCWxpc3QtPmxpc3QgPSByZmF0dF8yOworCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUocmZhdHRfMik7CisJbGlzdC0+bWluX3ZhbCA9IDA7CisJbGlzdC0+bWF4X3ZhbCA9IDk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2JiYXR0X2xpc3Qoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCXN0cnVjdCBiNDNfYmJhdHRfbGlzdCAqbGlzdCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGI0M19iYmF0dCBiYmF0dF8wW10gPSB7CisJCXsuYXR0ID0gMCx9LAorCQl7LmF0dCA9IDEsfSwKKwkJey5hdHQgPSAyLH0sCisJCXsuYXR0ID0gMyx9LAorCQl7LmF0dCA9IDQsfSwKKwkJey5hdHQgPSA1LH0sCisJCXsuYXR0ID0gNix9LAorCQl7LmF0dCA9IDcsfSwKKwkJey5hdHQgPSA4LH0sCisJfTsKKworCWxpc3QtPmxpc3QgPSBiYmF0dF8wOworCWxpc3QtPmxlbiA9IEFSUkFZX1NJWkUoYmJhdHRfMCk7CisJbGlzdC0+bWluX3ZhbCA9IDA7CisJbGlzdC0+bWF4X3ZhbCA9IDg7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19zaG1fY2xlYXJfdHNzaShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIDB4MDA1OCwgMHg3RjdGKTsKKwliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgMHgwMDVhLCAweDdGN0YpOworCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCAweDAwNzAsIDB4N0Y3Rik7CisJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIDB4MDA3MiwgMHg3RjdGKTsKK30KKworLyogU3ludGhldGljIFBVIHdvcmthcm91bmQgKi8KK3N0YXRpYyB2b2lkIGI0M19zeW50aF9wdV93b3JrYXJvdW5kKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChwaHktPnJhZGlvX3ZlciAhPSAweDIwNTAgfHwgcGh5LT5yYWRpb19yZXYgPj0gNikgeworCQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgd29ya2Fyb3VuZC4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChjaGFubmVsIDw9IDEwKSB7CisJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTCwKKwkJCSAgICBjaGFubmVsMmZyZXFfYmcoY2hhbm5lbCArIDQpKTsKKwl9IGVsc2UgeworCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUwsIGNoYW5uZWwyZnJlcV9iZygxKSk7CisJfQorCW1zbGVlcCgxKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUwsIGNoYW5uZWwyZnJlcV9iZyhjaGFubmVsKSk7Cit9CisKKy8qIFNldCB0aGUgYmFzZWJhbmQgYXR0ZW51YXRpb24gdmFsdWUgb24gY2hpcC4gKi8KK3ZvaWQgYjQzX2dwaHlfc2V0X2Jhc2ViYW5kX2F0dGVudWF0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICAgICAgdTE2IGJhc2ViYW5kX2F0dGVudWF0aW9uKQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisKKwlpZiAocGh5LT5hbmFsb2cgPT0gMCkgeworCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWTAsIChiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUEhZMCkKKwkJCQkJCSAmIDB4RkZGMCkgfAorCQkJICAgIGJhc2ViYW5kX2F0dGVudWF0aW9uKTsKKwl9IGVsc2UgaWYgKHBoeS0+YW5hbG9nID4gMSkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9EQUNDVEwsCisJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9EQUNDVEwpCisJCQkgICAgICAgJiAweEZGQzMpIHwgKGJhc2ViYW5kX2F0dGVudWF0aW9uIDw8IDIpKTsKKwl9IGVsc2UgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9EQUNDVEwsCisJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9EQUNDVEwpCisJCQkgICAgICAgJiAweEZGODcpIHwgKGJhc2ViYW5kX2F0dGVudWF0aW9uIDw8IDMpKTsKKwl9Cit9CisKKy8qIEFkanVzdCB0aGUgdHJhbnNtaXNzaW9uIHBvd2VyIG91dHB1dCAoRy1QSFkpICovCit2b2lkIGI0M19zZXRfdHhwb3dlcl9nKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBiNDNfYmJhdHQgKmJiYXR0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqcmZhdHQsIHU4IHR4X2NvbnRyb2wpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsbyA9IGdwaHktPmxvX2NvbnRyb2w7CisJdTE2IGJiLCByZjsKKwl1MTYgdHhfYmlhcywgdHhfbWFnbjsKKworCWJiID0gYmJhdHQtPmF0dDsKKwlyZiA9IHJmYXR0LT5hdHQ7CisJdHhfYmlhcyA9IGxvLT50eF9iaWFzOworCXR4X21hZ24gPSBsby0+dHhfbWFnbjsKKwlpZiAodW5saWtlbHkodHhfYmlhcyA9PSAweEZGKSkKKwkJdHhfYmlhcyA9IDA7CisKKwkvKiBTYXZlIHRoZSB2YWx1ZXMgZm9yIGxhdGVyLiBVc2UgbWVtbW92ZSwgYmVjYXVzZSBpdCdzIHZhbGlkCisJICogdG8gcGFzcyAmZ3BoeS0+cmZhdHQgYXMgcmZhdHQgcG9pbnRlciBhcmd1bWVudC4gU2FtZSBmb3IgYmJhdHQuICovCisJZ3BoeS0+dHhfY29udHJvbCA9IHR4X2NvbnRyb2w7CisJbWVtbW92ZSgmZ3BoeS0+cmZhdHQsIHJmYXR0LCBzaXplb2YoKnJmYXR0KSk7CisJZ3BoeS0+cmZhdHQud2l0aF9wYWRtaXggPSAhISh0eF9jb250cm9sICYgQjQzX1RYQ1RMX1RYTUlYKTsKKwltZW1tb3ZlKCZncGh5LT5iYmF0dCwgYmJhdHQsIHNpemVvZigqYmJhdHQpKTsKKworCWlmIChiNDNfZGVidWcoZGV2LCBCNDNfREJHX1hNSVRQT1dFUikpIHsKKwkJYjQzZGJnKGRldi0+d2wsICJUdW5pbmcgVFgtcG93ZXIgdG8gYmJhdHQoJXUpLCAiCisJCSAgICAgICAicmZhdHQoJXUpLCB0eF9jb250cm9sKDB4JTAyWCksICIKKwkJICAgICAgICJ0eF9iaWFzKDB4JTAyWCksIHR4X21hZ24oMHglMDJYKVxuIiwKKwkJICAgICAgIGJiLCByZiwgdHhfY29udHJvbCwgdHhfYmlhcywgdHhfbWFnbik7CisJfQorCisJYjQzX2dwaHlfc2V0X2Jhc2ViYW5kX2F0dGVudWF0aW9uKGRldiwgYmIpOworCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCBCNDNfU0hNX1NIX1JGQVRULCByZik7CisJaWYgKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCAmJiBwaHktPnJhZGlvX3JldiA9PSA4KSB7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywKKwkJCQkgIChyZiAmIDB4MDAwRikgfCAodHhfY29udHJvbCAmIDB4MDA3MCkpOworCX0gZWxzZSB7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDQzKQorCQkJCQkgICAgICAmIDB4RkZGMCkgfCAocmYgJiAweDAwMEYpKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTIpCisJCQkJCSAgICAgICYgfjB4MDA3MCkgfCAodHhfY29udHJvbCAmCisJCQkJCQkJICAgIDB4MDA3MCkpOworCX0KKwlpZiAoaGFzX3R4X21hZ25pZmljYXRpb24ocGh5KSkgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIHR4X21hZ24gfCB0eF9iaWFzKTsKKwl9IGVsc2UgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg1MikKKwkJCQkJICAgICAgJiAweEZGRjApIHwgKHR4X2JpYXMgJiAweDAwMEYpKTsKKwl9CisJYjQzX2xvX2dfYWRqdXN0KGRldik7Cit9CisKKy8qIEdQSFlfVFNTSV9Qb3dlcl9Mb29rdXBfVGFibGVfSW5pdCAqLworc3RhdGljIHZvaWQgYjQzX2dwaHlfdHNzaV9wb3dlcl9sdF9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gZGV2LT5waHkuZzsKKwlpbnQgaTsKKwl1MTYgdmFsdWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIDB4M0MyMCwgaSwgZ3BoeS0+dHNzaTJkYm1baV0pOworCWZvciAoaSA9IDMyOyBpIDwgNjQ7IGkrKykKKwkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIDB4M0MwMCwgaSAtIDMyLCBncGh5LT50c3NpMmRibVtpXSk7CisJZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpIHsKKwkJdmFsdWUgPSAodTE2KSBncGh5LT50c3NpMmRibVtpXTsKKwkJdmFsdWUgfD0gKCh1MTYpIGdwaHktPnRzc2kyZGJtW2kgKyAxXSkgPDwgODsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MzgwICsgKGkgLyAyKSwgdmFsdWUpOworCX0KK30KKworLyogR1BIWV9HYWluX0xvb2t1cF9UYWJsZV9Jbml0ICovCitzdGF0aWMgdm9pZCBiNDNfZ3BoeV9nYWluX2x0X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBncGh5LT5sb19jb250cm9sOworCXUxNiBucl93cml0dGVuID0gMDsKKwl1MTYgdG1wOworCXU4IHJmLCBiYjsKKworCWZvciAocmYgPSAwOyByZiA8IGxvLT5yZmF0dF9saXN0LmxlbjsgcmYrKykgeworCQlmb3IgKGJiID0gMDsgYmIgPCBsby0+YmJhdHRfbGlzdC5sZW47IGJiKyspIHsKKwkJCWlmIChucl93cml0dGVuID49IDB4NDApCisJCQkJcmV0dXJuOworCQkJdG1wID0gbG8tPmJiYXR0X2xpc3QubGlzdFtiYl0uYXR0OworCQkJdG1wIDw8PSA4OworCQkJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpCisJCQkJdG1wIHw9IDB4NTA7CisJCQllbHNlCisJCQkJdG1wIHw9IDB4NDA7CisJCQl0bXAgfD0gbG8tPnJmYXR0X2xpc3QubGlzdFtyZl0uYXR0OworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4M0MwICsgbnJfd3JpdHRlbiwgdG1wKTsKKwkJCW5yX3dyaXR0ZW4rKzsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYjQzX3NldF9hbGxfZ2FpbnMoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJICAgICAgczE2IGZpcnN0LCBzMTYgc2Vjb25kLCBzMTYgdGhpcmQpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwl1MTYgaTsKKwl1MTYgc3RhcnQgPSAweDA4LCBlbmQgPSAweDE4OworCXUxNiB0bXA7CisJdTE2IHRhYmxlOworCisJaWYgKHBoeS0+cmV2IDw9IDEpIHsKKwkJc3RhcnQgPSAweDEwOworCQllbmQgPSAweDIwOworCX0KKworCXRhYmxlID0gQjQzX09GRE1UQUJfR0FJTlg7CisJaWYgKHBoeS0+cmV2IDw9IDEpCisJCXRhYmxlID0gQjQzX09GRE1UQUJfR0FJTlhfUjE7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIHRhYmxlLCBpLCBmaXJzdCk7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKQorCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgdGFibGUsIGksIHNlY29uZCk7CisKKwlpZiAodGhpcmQgIT0gLTEpIHsKKwkJdG1wID0gKCh1MTYpIHRoaXJkIDw8IDE0KSB8ICgodTE2KSB0aGlyZCA8PCA2KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMCwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTApICYgMHhCRkJGKSB8IHRtcCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTEsCisJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEExKSAmIDB4QkZCRikgfCB0bXApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEyLAorCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMikgJiAweEJGQkYpIHwgdG1wKTsKKwl9CisJYjQzX2R1bW15X3RyYW5zbWlzc2lvbihkZXYpOworfQorCitzdGF0aWMgdm9pZCBiNDNfc2V0X29yaWdpbmFsX2dhaW5zKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXUxNiBpLCB0bXA7CisJdTE2IHRhYmxlOworCXUxNiBzdGFydCA9IDB4MDAwOCwgZW5kID0gMHgwMDE4OworCisJaWYgKHBoeS0+cmV2IDw9IDEpIHsKKwkJc3RhcnQgPSAweDAwMTA7CisJCWVuZCA9IDB4MDAyMDsKKwl9CisKKwl0YWJsZSA9IEI0M19PRkRNVEFCX0dBSU5YOworCWlmIChwaHktPnJldiA8PSAxKQorCQl0YWJsZSA9IEI0M19PRkRNVEFCX0dBSU5YX1IxOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdG1wID0gKGkgJiAweEZGRkMpOworCQl0bXAgfD0gKGkgJiAweDAwMDEpIDw8IDE7CisJCXRtcCB8PSAoaSAmIDB4MDAwMikgPj4gMTsKKworCQliNDNfb2ZkbXRhYl93cml0ZTE2KGRldiwgdGFibGUsIGksIHRtcCk7CisJfQorCisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykKKwkJYjQzX29mZG10YWJfd3JpdGUxNihkZXYsIHRhYmxlLCBpLCBpIC0gc3RhcnQpOworCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMCwKKwkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMCkgJiAweEJGQkYpIHwgMHg0MDQwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEExLAorCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEExKSAmIDB4QkZCRikgfCAweDQwNDApOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTIsCisJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTIpICYgMHhCRkJGKSB8IDB4NDAwMCk7CisJYjQzX2R1bW15X3RyYW5zbWlzc2lvbihkZXYpOworfQorCisvKiBodHRwOi8vYmNtLXNwZWNzLnNpcHNvbHV0aW9ucy5uZXQvTlJTU0lMb29rdXBUYWJsZSAqLwordm9pZCBiNDNfbnJzc2lfaHdfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0LCBzMTYgdmFsKQoreworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05SU1NJTFRfQ1RSTCwgb2Zmc2V0KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9OUlNTSUxUX0RBVEEsICh1MTYpIHZhbCk7Cit9CisKKy8qIGh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC9OUlNTSUxvb2t1cFRhYmxlICovCitzMTYgYjQzX25yc3NpX2h3X3JlYWQoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXUxNiB2YWw7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9OUlNTSUxUX0NUUkwsIG9mZnNldCk7CisJdmFsID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9OUlNTSUxUX0RBVEEpOworCisJcmV0dXJuIChzMTYpIHZhbDsKK30KKworLyogaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L05SU1NJTG9va3VwVGFibGUgKi8KK3ZvaWQgYjQzX25yc3NpX2h3X3VwZGF0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB2YWwpCit7CisJdTE2IGk7CisJczE2IHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCXRtcCA9IGI0M19ucnNzaV9od19yZWFkKGRldiwgaSk7CisJCXRtcCAtPSB2YWw7CisJCXRtcCA9IGNsYW1wX3ZhbCh0bXAsIC0zMiwgMzEpOworCQliNDNfbnJzc2lfaHdfd3JpdGUoZGV2LCBpLCB0bXApOworCX0KK30KKworLyogaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L05SU1NJTG9va3VwVGFibGUgKi8KK3ZvaWQgYjQzX25yc3NpX21lbV91cGRhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBkZXYtPnBoeS5nOworCXMxNiBpLCBkZWx0YTsKKwlzMzIgdG1wOworCisJZGVsdGEgPSAweDFGIC0gZ3BoeS0+bnJzc2lbMF07CisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJdG1wID0gKGkgLSBkZWx0YSkgKiBncGh5LT5ucnNzaXNsb3BlOworCQl0bXAgLz0gMHgxMDAwMDsKKwkJdG1wICs9IDB4M0E7CisJCXRtcCA9IGNsYW1wX3ZhbCh0bXAsIDAsIDB4M0YpOworCQlncGh5LT5ucnNzaV9sdFtpXSA9IHRtcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGI0M19jYWxjX25yc3NpX29mZnNldChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwl1MTYgYmFja3VwWzIwXSA9IHsgMCB9OworCXMxNiB2NDdGOworCXUxNiBpOworCXUxNiBzYXZlZCA9IDB4RkZGRjsKKworCWJhY2t1cFswXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAwMSk7CisJYmFja3VwWzFdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwODExKTsKKwliYWNrdXBbMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTIpOworCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCisJCWJhY2t1cFszXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCk7CisJCWJhY2t1cFs0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgxNSk7CisJfQorCWJhY2t1cFs1XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1QSk7CisJYmFja3VwWzZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDU5KTsKKwliYWNrdXBbN10gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNTgpOworCWJhY2t1cFs4XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAwQSk7CisJYmFja3VwWzldID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDAzKTsKKwliYWNrdXBbMTBdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSk7CisJYmFja3VwWzExXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNDMpOworCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyOSwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDI5KSAmIDB4N0ZGRik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAwMSwKKwkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDAwMSkgJiAweDNGRkYpIHwgMHg0MDAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwODExLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpIHwgMHgwMDBDKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAorCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSAmIDB4RkZGMykgfCAweDAwMDQpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgJiB+KDB4MSB8IDB4MikpOworCWlmIChwaHktPnJldiA+PSA2KSB7CisJCWJhY2t1cFsxMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMkUpOworCQliYWNrdXBbMTNdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDJGKTsKKwkJYmFja3VwWzE0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgwRik7CisJCWJhY2t1cFsxNV0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTApOworCQliYWNrdXBbMTZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwODAxKTsKKwkJYmFja3VwWzE3XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA2MCk7CisJCWJhY2t1cFsxOF0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMTQpOworCQliYWNrdXBbMTldID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwNDc4KTsKKworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRiwgMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MEYsIDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEwLCAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQ3OCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDc4KSB8IDB4MDEwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkgfCAweDAwNDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApIHwgMHgwMDQwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDE0KSB8IDB4MDIwMCk7CisJfQorCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLCBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDA3MCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDgwKTsKKwl1ZGVsYXkoMzApOworCisJdjQ3RiA9IChzMTYpICgoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdGKSA+PiA4KSAmIDB4MDAzRik7CisJaWYgKHY0N0YgPj0gMHgyMCkKKwkJdjQ3RiAtPSAweDQwOworCWlmICh2NDdGID09IDMxKSB7CisJCWZvciAoaSA9IDc7IGkgPj0gNDsgaS0tKSB7CisJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QiwgaSk7CisJCQl1ZGVsYXkoMjApOworCQkJdjQ3RiA9CisJCQkgICAgKHMxNikgKChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYgMHgwMDNGKTsKKwkJCWlmICh2NDdGID49IDB4MjApCisJCQkJdjQ3RiAtPSAweDQwOworCQkJaWYgKHY0N0YgPCAzMSAmJiBzYXZlZCA9PSAweEZGRkYpCisJCQkJc2F2ZWQgPSBpOworCQl9CisJCWlmIChzYXZlZCA9PSAweEZGRkYpCisJCQlzYXZlZCA9IDQ7CisJfSBlbHNlIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCisJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSAmIDB4MDA3Rik7CisJCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODE0LAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCkgfCAweDAwMDEpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwKKwkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTUpICYgMHhGRkZFKTsKKwkJfQorCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODExLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpIHwgMHgwMDBDKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSB8IDB4MDAwQyk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTEsIGI0M19waHlfcmVhZChkZXYsIDB4MDgxMSkgfCAweDAwMzApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTIpIHwgMHgwMDMwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgMHgwNDgwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OSwgMHgwODEwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OCwgMHgwMDBEKTsKKwkJaWYgKHBoeS0+cmV2ID09IDApIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMDMsIDB4MDEyMik7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDBBLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMEEpCisJCQkJICAgICAgfCAweDIwMDApOworCQl9CisJCWlmIChwaHktPnJldiAhPSAxKSB7CS8qIE5vdCBpbiBzcGVjcywgYnV0IG5lZWRlZCB0byBwcmV2ZW50IFBQQyBtYWNoaW5lIGNoZWNrICovCisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODE0LAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgxNCkgfCAweDAwMDQpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwKKwkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTUpICYgMHhGRkZCKTsKKwkJfQorCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAzLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDAzKSAmIDB4RkY5RikKKwkJCSAgICAgIHwgMHgwMDQwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCisJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDAwRik7CisJCWI0M19zZXRfYWxsX2dhaW5zKGRldiwgMywgMCwgMSk7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA0MykKKwkJCQkJCSYgMHgwMEYwKSB8IDB4MDAwRik7CisJCXVkZWxheSgzMCk7CisJCXY0N0YgPSAoczE2KSAoKGI0M19waHlfcmVhZChkZXYsIDB4MDQ3RikgPj4gOCkgJiAweDAwM0YpOworCQlpZiAodjQ3RiA+PSAweDIwKQorCQkJdjQ3RiAtPSAweDQwOworCQlpZiAodjQ3RiA9PSAtMzIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QiwgaSk7CisJCQkJdWRlbGF5KDIwKTsKKwkJCQl2NDdGID0KKwkJCQkgICAgKHMxNikgKChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYKKwkJCQkJICAgMHgwMDNGKTsKKwkJCQlpZiAodjQ3RiA+PSAweDIwKQorCQkJCQl2NDdGIC09IDB4NDA7CisJCQkJaWYgKHY0N0YgPiAtMzEgJiYgc2F2ZWQgPT0gMHhGRkZGKQorCQkJCQlzYXZlZCA9IGk7CisJCQl9CisJCQlpZiAoc2F2ZWQgPT0gMHhGRkZGKQorCQkJCXNhdmVkID0gMzsKKwkJfSBlbHNlCisJCQlzYXZlZCA9IDA7CisJfQorCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdCLCBzYXZlZCk7CisKKwlpZiAocGh5LT5yZXYgPj0gNikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCBiYWNrdXBbMTJdKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRiwgYmFja3VwWzEzXSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MEYsIGJhY2t1cFsxNF0pOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEwLCBiYWNrdXBbMTVdKTsKKwl9CisJaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNCwgYmFja3VwWzNdKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxNSwgYmFja3VwWzRdKTsKKwl9CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgYmFja3VwWzVdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU5LCBiYWNrdXBbNl0pOworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNTgsIGJhY2t1cFs3XSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAwQSwgYmFja3VwWzhdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAzLCBiYWNrdXBbOV0pOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDQzLCBiYWNrdXBbMTFdKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwgYmFja3VwWzEwXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSB8IDB4MSB8IDB4Mik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyOSwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDI5KSB8IDB4ODAwMCk7CisJYjQzX3NldF9vcmlnaW5hbF9nYWlucyhkZXYpOworCWlmIChwaHktPnJldiA+PSA2KSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDEsIGJhY2t1cFsxNl0pOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiYWNrdXBbMTddKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgYmFja3VwWzE4XSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0NzgsIGJhY2t1cFsxOV0pOworCX0KKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDAxLCBiYWNrdXBbMF0pOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTIsIGJhY2t1cFsyXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwgYmFja3VwWzFdKTsKK30KKwordm9pZCBiNDNfY2FsY19ucnNzaV9zbG9wZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiBiYWNrdXBbMThdID0geyAwIH07CisJdTE2IHRtcDsKKwlzMTYgbnJzc2kwLCBucnNzaTE7CisKKwlCNDNfV0FSTl9PTihwaHktPnR5cGUgIT0gQjQzX1BIWVRZUEVfRyk7CisKKwlpZiAocGh5LT5yYWRpb19yZXYgPj0gOSkKKwkJcmV0dXJuOworCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KQorCQliNDNfY2FsY19ucnNzaV9vZmZzZXQoZGV2KTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAorCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0dfQ1JTKSAmIDB4N0ZGRik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSAmIDB4RkZGQyk7CisJYmFja3VwWzddID0gYjQzX3JlYWQxNihkZXYsIDB4MDNFMik7CisJYjQzX3dyaXRlMTYoZGV2LCAweDAzRTIsIGI0M19yZWFkMTYoZGV2LCAweDAzRTIpIHwgMHg4MDAwKTsKKwliYWNrdXBbMF0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKTsKKwliYWNrdXBbMV0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDUyKTsKKwliYWNrdXBbMl0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDQzKTsKKwliYWNrdXBbM10gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMTUpOworCWJhY2t1cFs0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDA1QSk7CisJYmFja3VwWzVdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDU5KTsKKwliYWNrdXBbNl0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNTgpOworCWJhY2t1cFs4XSA9IGI0M19yZWFkMTYoZGV2LCAweDAzRTYpOworCWJhY2t1cFs5XSA9IGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCk7CisJaWYgKHBoeS0+cmV2ID49IDMpIHsKKwkJYmFja3VwWzEwXSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDAyRSk7CisJCWJhY2t1cFsxMV0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMkYpOworCQliYWNrdXBbMTJdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwODBGKTsKKwkJYmFja3VwWzEzXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19MT19DT05UUk9MKTsKKwkJYmFja3VwWzE0XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSk7CisJCWJhY2t1cFsxNV0gPSBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApOworCQliYWNrdXBbMTZdID0gYjQzX3BoeV9yZWFkKGRldiwgMHgwMDE0KTsKKwkJYmFja3VwWzE3XSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDQ3OCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkUsIDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0xPX0NPTlRST0wsIDApOworCQlzd2l0Y2ggKHBoeS0+cmV2KSB7CisJCWNhc2UgNDoKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3OCkKKwkJCQkgICAgICB8IDB4MDEwMCk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAxLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkKKwkJCQkgICAgICB8IDB4MDA0MCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQljYXNlIDU6CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAxLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMSkKKwkJCQkgICAgICAmIDB4RkZCRik7CisJCQlicmVhazsKKwkJfQorCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApCisJCQkgICAgICB8IDB4MDA0MCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTQsIGI0M19waHlfcmVhZChkZXYsIDB4MDAxNCkKKwkJCSAgICAgIHwgMHgwMjAwKTsKKwl9CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCisJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDcwKTsKKwliNDNfc2V0X2FsbF9nYWlucyhkZXYsIDAsIDgsIDApOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAorCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSAmIDB4MDBGNyk7CisJaWYgKHBoeS0+cmV2ID49IDIpIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpICYgMHhGRkNGKSB8CisJCQkgICAgICAweDAwMzApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAorCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDgxMikgJiAweEZGQ0YpIHwKKwkJCSAgICAgIDB4MDAxMCk7CisJfQorCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdBLAorCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDA4MCk7CisJdWRlbGF5KDIwKTsKKworCW5yc3NpMCA9IChzMTYpICgoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdGKSA+PiA4KSAmIDB4MDAzRik7CisJaWYgKG5yc3NpMCA+PSAweDAwMjApCisJCW5yc3NpMCAtPSAweDAwNDA7CisKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKKwkJCSAgYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA3QSkgJiAweDAwN0YpOworCWlmIChwaHktPnJldiA+PSAyKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMDMsIChiNDNfcGh5X3JlYWQoZGV2LCAweDAwMDMpCisJCQkJCSAgICAmIDB4RkY5RikgfCAweDAwNDApOworCX0KKworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQsCisJCSAgICBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQpCisJCSAgICB8IDB4MjAwMCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCisJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDBGKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE1LCAweEYzMzApOworCWlmIChwaHktPnJldiA+PSAyKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTIsCisJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSAmIDB4RkZDRikgfAorCQkJICAgICAgMHgwMDIwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgxMSwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpICYgMHhGRkNGKSB8CisJCQkgICAgICAweDAwMjApOworCX0KKworCWI0M19zZXRfYWxsX2dhaW5zKGRldiwgMywgMCwgMSk7CisJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNDMsIDB4MDAxRik7CisJfSBlbHNlIHsKKwkJdG1wID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4MDA1MikgJiAweEZGMEY7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUyLCB0bXAgfCAweDAwNjApOworCQl0bXAgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDQzKSAmIDB4RkZGMDsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNDMsIHRtcCB8IDB4MDAwOSk7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNUEsIDB4MDQ4MCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1OSwgMHgwODEwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU4LCAweDAwMEQpOworCXVkZWxheSgyMCk7CisJbnJzc2kxID0gKHMxNikgKChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYgMHgwMDNGKTsKKwlpZiAobnJzc2kxID49IDB4MDAyMCkKKwkJbnJzc2kxIC09IDB4MDA0MDsKKwlpZiAobnJzc2kwID09IG5yc3NpMSkKKwkJZ3BoeS0+bnJzc2lzbG9wZSA9IDB4MDAwMTAwMDA7CisJZWxzZQorCQlncGh5LT5ucnNzaXNsb3BlID0gMHgwMDQwMDAwMCAvIChucnNzaTAgLSBucnNzaTEpOworCWlmIChucnNzaTAgPj0gLTQpIHsKKwkJZ3BoeS0+bnJzc2lbMF0gPSBucnNzaTE7CisJCWdwaHktPm5yc3NpWzFdID0gbnJzc2kwOworCX0KKwlpZiAocGh5LT5yZXYgPj0gMykgeworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJFLCBiYWNrdXBbMTBdKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRiwgYmFja3VwWzExXSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MEYsIGJhY2t1cFsxMl0pOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0xPX0NPTlRST0wsIGJhY2t1cFsxM10pOworCX0KKwlpZiAocGh5LT5yZXYgPj0gMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwODEyLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgMHgwODEyKSAmIDB4RkZDRik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MTEsCisJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MTEpICYgMHhGRkNGKTsKKwl9CisKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwgYmFja3VwWzBdKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MiwgYmFja3VwWzFdKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA0MywgYmFja3VwWzJdKTsKKwliNDNfd3JpdGUxNihkZXYsIDB4MDNFMiwgYmFja3VwWzddKTsKKwliNDNfd3JpdGUxNihkZXYsIDB4MDNFNiwgYmFja3VwWzhdKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhULCBiYWNrdXBbOV0pOworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTUsIGJhY2t1cFszXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1QSwgYmFja3VwWzRdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDU5LCBiYWNrdXBbNV0pOworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNTgsIGJhY2t1cFs2XSk7CisJYjQzX3N5bnRoX3B1X3dvcmthcm91bmQoZGV2LCBwaHktPmNoYW5uZWwpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgfCAoMHgwMDAxIHwgMHgwMDAyKSk7CisJYjQzX3NldF9vcmlnaW5hbF9nYWlucyhkZXYpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAorCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0dfQ1JTKSB8IDB4ODAwMCk7CisJaWYgKHBoeS0+cmV2ID49IDMpIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMSwgYmFja3VwWzE0XSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNjAsIGJhY2t1cFsxNV0pOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE0LCBiYWNrdXBbMTZdKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQ3OCwgYmFja3VwWzE3XSk7CisJfQorCWI0M19ucnNzaV9tZW1fdXBkYXRlKGRldik7CisJYjQzX2NhbGNfbnJzc2lfdGhyZXNob2xkKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19jYWxjX25yc3NpX3RocmVzaG9sZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXMzMiBhLCBiOworCXMxNiB0bXAxNjsKKwl1MTYgdG1wX3UxNjsKKworCUI0M19XQVJOX09OKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKTsKKworCWlmICghcGh5LT5nbW9kZSB8fAorCSAgICAhKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1JTU0kpKSB7CisJCXRtcDE2ID0gYjQzX25yc3NpX2h3X3JlYWQoZGV2LCAweDIwKTsKKwkJaWYgKHRtcDE2ID49IDB4MjApCisJCQl0bXAxNiAtPSAweDQwOworCQlpZiAodG1wMTYgPCAzKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLAorCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpCisJCQkJICAgICAgICYgMHhGMDAwKSB8IDB4MDlFQik7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLAorCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpCisJCQkJICAgICAgICYgMHhGMDAwKSB8IDB4MEFFRCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZ3BoeS0+aW50ZXJmbW9kZSA9PSBCNDNfSU5URVJGTU9ERV9OT05XTEFOKSB7CisJCQlhID0gMHhFOworCQkJYiA9IDB4QTsKKwkJfSBlbHNlIGlmICghZ3BoeS0+YWNpX3dsYW5fYXV0b21hdGljICYmIGdwaHktPmFjaV9lbmFibGUpIHsKKwkJCWEgPSAweDEzOworCQkJYiA9IDB4MTI7CisJCX0gZWxzZSB7CisJCQlhID0gMHhFOworCQkJYiA9IDB4MTE7CisJCX0KKworCQlhID0gYSAqIChncGh5LT5ucnNzaVsxXSAtIGdwaHktPm5yc3NpWzBdKTsKKwkJYSArPSAoZ3BoeS0+bnJzc2lbMF0gPDwgNik7CisJCWlmIChhIDwgMzIpCisJCQlhICs9IDMxOworCQllbHNlCisJCQlhICs9IDMyOworCQlhID0gYSA+PiA2OworCQlhID0gY2xhbXBfdmFsKGEsIC0zMSwgMzEpOworCisJCWIgPSBiICogKGdwaHktPm5yc3NpWzFdIC0gZ3BoeS0+bnJzc2lbMF0pOworCQliICs9IChncGh5LT5ucnNzaVswXSA8PCA2KTsKKwkJaWYgKGIgPCAzMikKKwkJCWIgKz0gMzE7CisJCWVsc2UKKwkJCWIgKz0gMzI7CisJCWIgPSBiID4+IDY7CisJCWIgPSBjbGFtcF92YWwoYiwgLTMxLCAzMSk7CisKKwkJdG1wX3UxNiA9IGI0M19waHlfcmVhZChkZXYsIDB4MDQ4QSkgJiAweEYwMDA7CisJCXRtcF91MTYgfD0gKCh1MzIpIGIgJiAweDAwMDAwMDNGKTsKKwkJdG1wX3UxNiB8PSAoKCh1MzIpIGEgJiAweDAwMDAwMDNGKSA8PCA2KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQ4QSwgdG1wX3UxNik7CisJfQorfQorCisvKiBTdGFjayBpbXBsZW1lbnRhdGlvbiB0byBzYXZlL3Jlc3RvcmUgdmFsdWVzIGZyb20gdGhlCisgKiBpbnRlcmZlcmVuY2UgbWl0aWdhdGlvbiBjb2RlLgorICogSXQgaXMgc2F2ZSB0byByZXN0b3JlIHZhbHVlcyBpbiByYW5kb20gb3JkZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9zdGFja19zYXZlKHUzMiAqIF9zdGFja3B0ciwgc2l6ZV90ICogc3RhY2tpZHgsCisJCQl1OCBpZCwgdTE2IG9mZnNldCwgdTE2IHZhbHVlKQoreworCXUzMiAqc3RhY2twdHIgPSAmKF9zdGFja3B0clsqc3RhY2tpZHhdKTsKKworCUI0M19XQVJOX09OKG9mZnNldCAmIDB4RjAwMCk7CisJQjQzX1dBUk5fT04oaWQgJiAweEYwKTsKKwkqc3RhY2twdHIgPSBvZmZzZXQ7CisJKnN0YWNrcHRyIHw9ICgodTMyKSBpZCkgPDwgMTI7CisJKnN0YWNrcHRyIHw9ICgodTMyKSB2YWx1ZSkgPDwgMTY7CisJKCpzdGFja2lkeCkrKzsKKwlCNDNfV0FSTl9PTigqc3RhY2tpZHggPj0gQjQzX0lOVEVSRlNUQUNLX1NJWkUpOworfQorCitzdGF0aWMgdTE2IF9zdGFja19yZXN0b3JlKHUzMiAqIHN0YWNrcHRyLCB1OCBpZCwgdTE2IG9mZnNldCkKK3sKKwlzaXplX3QgaTsKKworCUI0M19XQVJOX09OKG9mZnNldCAmIDB4RjAwMCk7CisJQjQzX1dBUk5fT04oaWQgJiAweEYwKTsKKwlmb3IgKGkgPSAwOyBpIDwgQjQzX0lOVEVSRlNUQUNLX1NJWkU7IGkrKywgc3RhY2twdHIrKykgeworCQlpZiAoKCpzdGFja3B0ciAmIDB4MDAwMDBGRkYpICE9IG9mZnNldCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKCgqc3RhY2twdHIgJiAweDAwMDBGMDAwKSA+PiAxMikgIT0gaWQpCisJCQljb250aW51ZTsKKwkJcmV0dXJuICgoKnN0YWNrcHRyICYgMHhGRkZGMDAwMCkgPj4gMTYpOworCX0KKwlCNDNfV0FSTl9PTigxKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHBoeV9zdGFja3NhdmUob2Zmc2V0KQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlfc3RhY2tfc2F2ZShzdGFjaywgJnN0YWNraWR4LCAweDEsIChvZmZzZXQpLAlcCisJCQkgICAgYjQzX3BoeV9yZWFkKGRldiwgKG9mZnNldCkpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHBoeV9zdGFja3Jlc3RvcmUob2Zmc2V0KQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWI0M19waHlfd3JpdGUoZGV2LCAob2Zmc2V0KSwJCVwKKwkJCQkgIF9zdGFja19yZXN0b3JlKHN0YWNrLCAweDEsCVwKKwkJCQkJCSAob2Zmc2V0KSkpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmFkaW9fc3RhY2tzYXZlKG9mZnNldCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlfc3RhY2tfc2F2ZShzdGFjaywgJnN0YWNraWR4LCAweDIsIChvZmZzZXQpLAkJXAorCQkJICAgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAob2Zmc2V0KSkpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmFkaW9fc3RhY2tyZXN0b3JlKG9mZnNldCkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgKG9mZnNldCksCQkJXAorCQkJCSAgICAgIF9zdGFja19yZXN0b3JlKHN0YWNrLCAweDIsCVwKKwkJCQkJCSAgICAgKG9mZnNldCkpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIG9mZG10YWJfc3RhY2tzYXZlKHRhYmxlLCBvZmZzZXQpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlfc3RhY2tfc2F2ZShzdGFjaywgJnN0YWNraWR4LCAweDMsIChvZmZzZXQpfCh0YWJsZSksCVwKKwkJCSAgICBiNDNfb2ZkbXRhYl9yZWFkMTYoZGV2LCAodGFibGUpLCAob2Zmc2V0KSkpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgb2ZkbXRhYl9zdGFja3Jlc3RvcmUodGFibGUsIG9mZnNldCkJCQlcCisJZG8gewkJCQkJCQlcCisJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCAodGFibGUpLAkob2Zmc2V0KSwJXAorCQkJCSAgX3N0YWNrX3Jlc3RvcmUoc3RhY2ssIDB4MywJXAorCQkJCQkJIChvZmZzZXQpfCh0YWJsZSkpKTsJXAorCX0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkCitiNDNfcmFkaW9faW50ZXJmZXJlbmNlX21pdGlnYXRpb25fZW5hYmxlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgaW50IG1vZGUpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiB0bXAsIGZsaXBwZWQ7CisJc2l6ZV90IHN0YWNraWR4ID0gMDsKKwl1MzIgKnN0YWNrID0gZ3BoeS0+aW50ZXJmc3RhY2s7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEI0M19JTlRFUkZNT0RFX05PTldMQU46CisJCWlmIChwaHktPnJldiAhPSAxKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDJCLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIDB4MDQyQikgfCAweDA4MDApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfR19DUlMsCisJCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJCSAgIEI0M19QSFlfR19DUlMpICYgfjB4NDAwMCk7CisJCQlicmVhazsKKwkJfQorCQlyYWRpb19zdGFja3NhdmUoMHgwMDc4KTsKKwkJdG1wID0gKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNzgpICYgMHgwMDFFKTsKKwkJQjQzX1dBUk5fT04odG1wID4gMTUpOworCQlmbGlwcGVkID0gYml0cmV2NCh0bXApOworCQlpZiAoZmxpcHBlZCA8IDEwICYmIGZsaXBwZWQgPj0gOCkKKwkJCWZsaXBwZWQgPSA3OworCQllbHNlIGlmIChmbGlwcGVkID49IDEwKQorCQkJZmxpcHBlZCAtPSAzOworCQlmbGlwcGVkID0gKGJpdHJldjQoZmxpcHBlZCkgPDwgMSkgfCAweDAwMjA7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDc4LCBmbGlwcGVkKTsKKworCQliNDNfY2FsY19ucnNzaV90aHJlc2hvbGQoZGV2KTsKKworCQlwaHlfc3RhY2tzYXZlKDB4MDQwNik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MDYsIDB4N0UyOCk7CisKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyQiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwNDJCKSB8IDB4MDgwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JBRElPX0JJVEZJRUxELAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJICAgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkgfCAweDEwMDApOworCisJCXBoeV9zdGFja3NhdmUoMHgwNEEwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMCwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTApICYgMHhDMEMwKSB8IDB4MDAwOCk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEExKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMSwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTEpICYgMHhDMEMwKSB8IDB4MDYwNSk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEEyKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMiwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTIpICYgMHhDMEMwKSB8IDB4MDIwNCk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEE4KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOCwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTgpICYgMHhDMEMwKSB8IDB4MDgwMyk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEFCKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBQiwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QUIpICYgMHhDMEMwKSB8IDB4MDYwNSk7CisKKwkJcGh5X3N0YWNrc2F2ZSgweDA0QTcpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEE3LCAweDAwMDIpOworCQlwaHlfc3RhY2tzYXZlKDB4MDRBMyk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTMsIDB4Mjg3QSk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEE5KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOSwgMHgyMDI3KTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0OTMpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDkzLCAweDMyRjUpOworCQlwaHlfc3RhY2tzYXZlKDB4MDRBQSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUEsIDB4MjAyNyk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEFDKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBQywgMHgzMkY1KTsKKwkJYnJlYWs7CisJY2FzZSBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOOgorCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDMzKSAmIDB4MDgwMCkKKwkJCWJyZWFrOworCisJCWdwaHktPmFjaV9lbmFibGUgPSAxOworCisJCXBoeV9zdGFja3NhdmUoQjQzX1BIWV9SQURJT19CSVRGSUVMRCk7CisJCXBoeV9zdGFja3NhdmUoQjQzX1BIWV9HX0NSUyk7CisJCWlmIChwaHktPnJldiA8IDIpIHsKKwkJCXBoeV9zdGFja3NhdmUoMHgwNDA2KTsKKwkJfSBlbHNlIHsKKwkJCXBoeV9zdGFja3NhdmUoMHgwNEMwKTsKKwkJCXBoeV9zdGFja3NhdmUoMHgwNEMxKTsKKwkJfQorCQlwaHlfc3RhY2tzYXZlKDB4MDAzMyk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEE3KTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0QTMpOworCQlwaHlfc3RhY2tzYXZlKDB4MDRBOSk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEFBKTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0QUMpOworCQlwaHlfc3RhY2tzYXZlKDB4MDQ5Myk7CisJCXBoeV9zdGFja3NhdmUoMHgwNEExKTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0QTApOworCQlwaHlfc3RhY2tzYXZlKDB4MDRBMik7CisJCXBoeV9zdGFja3NhdmUoMHgwNDhBKTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0QTgpOworCQlwaHlfc3RhY2tzYXZlKDB4MDRBQik7CisJCWlmIChwaHktPnJldiA9PSAyKSB7CisJCQlwaHlfc3RhY2tzYXZlKDB4MDRBRCk7CisJCQlwaHlfc3RhY2tzYXZlKDB4MDRBRSk7CisJCX0gZWxzZSBpZiAocGh5LT5yZXYgPj0gMykgeworCQkJcGh5X3N0YWNrc2F2ZSgweDA0QUQpOworCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTUpOworCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTYpOworCQkJcGh5X3N0YWNrc2F2ZSgweDA0MTcpOworCQkJb2ZkbXRhYl9zdGFja3NhdmUoMHgxQTAwLCAweDIpOworCQkJb2ZkbXRhYl9zdGFja3NhdmUoMHgxQTAwLCAweDMpOworCQl9CisJCXBoeV9zdGFja3NhdmUoMHgwNDJCKTsKKwkJcGh5X3N0YWNrc2F2ZSgweDA0OEMpOworCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JBRElPX0JJVEZJRUxELAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkKKwkJCSAgICAgICYgfjB4MTAwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAorCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19DUlMpCisJCQkgICAgICAgJiAweEZGRkMpIHwgMHgwMDAyKTsKKworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDMzLCAweDA4MDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEzLCAweDIwMjcpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEE5LCAweDFDQTgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDkzLCAweDI4N0EpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFBLCAweDFDQTgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFDLCAweDI4N0EpOworCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTAsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTApCisJCQkJCSAgICAmIDB4RkZDMCkgfCAweDAwMUEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEE3LCAweDAwMEQpOworCisJCWlmIChwaHktPnJldiA8IDIpIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MDYsIDB4RkYwRCk7CisJCX0gZWxzZSBpZiAocGh5LT5yZXYgPT0gMikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRDMCwgMHhGRkZGKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QzEsIDB4MDBBOSk7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEMwLCAweDAwQzEpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRDMSwgMHgwMDU5KTsKKwkJfQorCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTEsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTEpCisJCQkJCSAgICAmIDB4QzBGRikgfCAweDE4MDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEExLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEExKQorCQkJCQkgICAgJiAweEZGQzApIHwgMHgwMDE1KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBOCkKKwkJCQkJICAgICYgMHhDRkZGKSB8IDB4MTAwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTgsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTgpCisJCQkJCSAgICAmIDB4RjBGRikgfCAweDBBMDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFCLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEFCKQorCQkJCQkgICAgJiAweENGRkYpIHwgMHgxMDAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBQiwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBQikKKwkJCQkJICAgICYgMHhGMEZGKSB8IDB4MDgwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUIsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QUIpCisJCQkJCSAgICAmIDB4RkZDRikgfCAweDAwMTApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEFCLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEFCKQorCQkJCQkgICAgJiAweEZGRjApIHwgMHgwMDA1KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBOCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBOCkKKwkJCQkJICAgICYgMHhGRkNGKSB8IDB4MDAxMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTgsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTgpCisJCQkJCSAgICAmIDB4RkZGMCkgfCAweDAwMDYpOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNEEyLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNEEyKQorCQkJCQkgICAgJiAweEYwRkYpIHwgMHgwODAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBMCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBMCkKKwkJCQkJICAgICYgMHhGMEZGKSB8IDB4MDUwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QTIsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0QTIpCisJCQkJCSAgICAmIDB4RkZGMCkgfCAweDAwMEIpOworCisJCWlmIChwaHktPnJldiA+PSAzKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEEpCisJCQkJICAgICAgJiB+MHg4MDAwKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTUsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTUpCisJCQkJCQkgICAgJiAweDgwMDApIHwgMHgzNkQ4KTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTYsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTYpCisJCQkJCQkgICAgJiAweDgwMDApIHwgMHgzNkQ4KTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MTcsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0MTcpCisJCQkJCQkgICAgJiAweEZFMDApIHwgMHgwMTZEKTsKKwkJfSBlbHNlIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEEsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ4QSkKKwkJCQkgICAgICB8IDB4MTAwMCk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDhBLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDhBKQorCQkJCQkJICAgICYgMHg5RkZGKSB8IDB4MjAwMCk7CisJCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpIHwgQjQzX0hGX0FDSVcpOworCQl9CisJCWlmIChwaHktPnJldiA+PSAyKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDJCLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpCisJCQkJICAgICAgfCAweDA4MDApOworCQl9CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0OEMsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0OEMpCisJCQkJCSAgICAmIDB4RjBGRikgfCAweDAyMDApOworCQlpZiAocGh5LT5yZXYgPT0gMikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBRSwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBRSkKKwkJCQkJCSAgICAmIDB4RkYwMCkgfCAweDAwN0YpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDRBRCwgKGI0M19waHlfcmVhZChkZXYsIDB4MDRBRCkKKwkJCQkJCSAgICAmIDB4MDBGRikgfCAweDEzMDApOworCQl9IGVsc2UgaWYgKHBoeS0+cmV2ID49IDYpIHsKKwkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCAweDFBMDAsIDB4MywgMHgwMDdGKTsKKwkJCWI0M19vZmRtdGFiX3dyaXRlMTYoZGV2LCAweDFBMDAsIDB4MiwgMHgwMDdGKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0QUQsIGI0M19waHlfcmVhZChkZXYsIDB4MDRBRCkKKwkJCQkgICAgICAmIDB4MDBGRik7CisJCX0KKwkJYjQzX2NhbGNfbnJzc2lfc2xvcGUoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQjQzX1dBUk5fT04oMSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYjQzX3JhZGlvX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uX2Rpc2FibGUoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CisJdTMyICpzdGFjayA9IGdwaHktPmludGVyZnN0YWNrOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCNDNfSU5URVJGTU9ERV9OT05XTEFOOgorCQlpZiAocGh5LT5yZXYgIT0gMSkgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQyQiwKKwkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpICYgfjB4MDgwMCk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0NSUywKKwkJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LAorCQkJCQkJICAgQjQzX1BIWV9HX0NSUykgfCAweDQwMDApOworCQkJYnJlYWs7CisJCX0KKwkJcmFkaW9fc3RhY2tyZXN0b3JlKDB4MDA3OCk7CisJCWI0M19jYWxjX25yc3NpX3RocmVzaG9sZChkZXYpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQwNik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0MkIsIGI0M19waHlfcmVhZChkZXYsIDB4MDQyQikgJiB+MHgwODAwKTsKKwkJaWYgKCFkZXYtPmJhZF9mcmFtZXNfcHJlZW1wdCkgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkFESU9fQklURklFTEQsCisJCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkKKwkJCQkgICAgICAmIH4oMSA8PCAxMSkpOworCQl9CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0dfQ1JTLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9HX0NSUykgfCAweDQwMDApOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMCk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEExKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTIpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBOCk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFCKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTcpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBMyk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEE5KTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0OTMpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBQSk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFDKTsKKwkJYnJlYWs7CisJY2FzZSBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOOgorCQlpZiAoIShiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzMpICYgMHgwODAwKSkKKwkJCWJyZWFrOworCisJCWdwaHktPmFjaV9lbmFibGUgPSAwOworCisJCXBoeV9zdGFja3Jlc3RvcmUoQjQzX1BIWV9SQURJT19CSVRGSUVMRCk7CisJCXBoeV9zdGFja3Jlc3RvcmUoQjQzX1BIWV9HX0NSUyk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwMDMzKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTMpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBOSk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDkzKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QUEpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBQyk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEEwKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTcpOworCQlpZiAocGh5LT5yZXYgPj0gMikgeworCQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QzApOworCQkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QzEpOworCQl9IGVsc2UKKwkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDA2KTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTEpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBQik7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEE4KTsKKwkJaWYgKHBoeS0+cmV2ID09IDIpIHsKKwkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFEKTsKKwkJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNEFFKTsKKwkJfSBlbHNlIGlmIChwaHktPnJldiA+PSAzKSB7CisJCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDRBRCk7CisJCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQxNSk7CisJCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQxNik7CisJCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQxNyk7CisJCQlvZmRtdGFiX3N0YWNrcmVzdG9yZSgweDFBMDAsIDB4Mik7CisJCQlvZmRtdGFiX3N0YWNrcmVzdG9yZSgweDFBMDAsIDB4Myk7CisJCX0KKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0QTIpOworCQlwaHlfc3RhY2tyZXN0b3JlKDB4MDQ4QSk7CisJCXBoeV9zdGFja3Jlc3RvcmUoMHgwNDJCKTsKKwkJcGh5X3N0YWNrcmVzdG9yZSgweDA0OEMpOworCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpICYgfkI0M19IRl9BQ0lXKTsKKwkJYjQzX2NhbGNfbnJzc2lfc2xvcGUoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQjQzX1dBUk5fT04oMSk7CisJfQorfQorCisjdW5kZWYgcGh5X3N0YWNrc2F2ZQorI3VuZGVmIHBoeV9zdGFja3Jlc3RvcmUKKyN1bmRlZiByYWRpb19zdGFja3NhdmUKKyN1bmRlZiByYWRpb19zdGFja3Jlc3RvcmUKKyN1bmRlZiBvZmRtdGFiX3N0YWNrc2F2ZQorI3VuZGVmIG9mZG10YWJfc3RhY2tyZXN0b3JlCisKK3N0YXRpYyB1MTYgYjQzX3JhZGlvX2NvcmVfY2FsaWJyYXRpb25fdmFsdWUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXUxNiByZWcsIGluZGV4LCByZXQ7CisKKwlzdGF0aWMgY29uc3QgdTggcmNjX3RhYmxlW10gPSB7CisJCTB4MDIsIDB4MDMsIDB4MDEsIDB4MEYsCisJCTB4MDYsIDB4MDcsIDB4MDUsIDB4MEYsCisJCTB4MEEsIDB4MEIsIDB4MDksIDB4MEYsCisJCTB4MEUsIDB4MEYsIDB4MEQsIDB4MEYsCisJfTsKKworCXJlZyA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDYwKTsKKwlpbmRleCA9IChyZWcgJiAweDAwMUUpID4+IDE7CisJcmV0ID0gcmNjX3RhYmxlW2luZGV4XSA8PCAxOworCXJldCB8PSAocmVnICYgMHgwMDAxKTsKKwlyZXQgfD0gMHgwMDIwOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBMUEQoTCwgUCwgRCkJKCgoTCkgPDwgMikgfCAoKFApIDw8IDEpIHwgKChEKSA8PCAwKSkKK3N0YXRpYyB1MTYgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCXUxNiBwaHlfcmVnaXN0ZXIsIHVuc2lnbmVkIGludCBscGQpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJihkZXYtPmRldi0+YnVzLT5zcHJvbSk7CisKKwlpZiAoIXBoeS0+Z21vZGUpCisJCXJldHVybiAwOworCisJaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpIHsKKwkJaW50IG1heF9sYl9nYWluID0gZ3BoeS0+bWF4X2xiX2dhaW47CisJCXUxNiBleHRsbmE7CisJCXUxNiBpOworCisJCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KQorCQkJbWF4X2xiX2dhaW4gKz0gMHgzRTsKKwkJZWxzZQorCQkJbWF4X2xiX2dhaW4gKz0gMHgyNjsKKwkJaWYgKG1heF9sYl9nYWluID49IDB4NDYpIHsKKwkJCWV4dGxuYSA9IDB4MzAwMDsKKwkJCW1heF9sYl9nYWluIC09IDB4NDY7CisJCX0gZWxzZSBpZiAobWF4X2xiX2dhaW4gPj0gMHgzQSkgeworCQkJZXh0bG5hID0gMHgxMDAwOworCQkJbWF4X2xiX2dhaW4gLT0gMHgzQTsKKwkJfSBlbHNlIGlmIChtYXhfbGJfZ2FpbiA+PSAweDJFKSB7CisJCQlleHRsbmEgPSAweDIwMDA7CisJCQltYXhfbGJfZ2FpbiAtPSAweDJFOworCQl9IGVsc2UgeworCQkJZXh0bG5hID0gMDsKKwkJCW1heF9sYl9nYWluIC09IDB4MTA7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJbWF4X2xiX2dhaW4gLT0gKGkgKiA2KTsKKwkJCWlmIChtYXhfbGJfZ2FpbiA8IDYpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBoeS0+cmV2IDwgNykgfHwKKwkJICAgICEoc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0VYVExOQSkpIHsKKwkJCWlmIChwaHlfcmVnaXN0ZXIgPT0gQjQzX1BIWV9SRk9WRVIpIHsKKwkJCQlyZXR1cm4gMHgxQjM7CisJCQl9IGVsc2UgaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUlZBTCkgeworCQkJCWV4dGxuYSB8PSAoaSA8PCA4KTsKKwkJCQlzd2l0Y2ggKGxwZCkgeworCQkJCWNhc2UgTFBEKDAsIDEsIDEpOgorCQkJCQlyZXR1cm4gMHgwRjkyOworCQkJCWNhc2UgTFBEKDAsIDAsIDEpOgorCQkJCWNhc2UgTFBEKDEsIDAsIDEpOgorCQkJCQlyZXR1cm4gKDB4MDA5MiB8IGV4dGxuYSk7CisJCQkJY2FzZSBMUEQoMSwgMCwgMCk6CisJCQkJCXJldHVybiAoMHgwMDkzIHwgZXh0bG5hKTsKKwkJCQl9CisJCQkJQjQzX1dBUk5fT04oMSk7CisJCQl9CisJCQlCNDNfV0FSTl9PTigxKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwaHlfcmVnaXN0ZXIgPT0gQjQzX1BIWV9SRk9WRVIpIHsKKwkJCQlyZXR1cm4gMHg5QjM7CisJCQl9IGVsc2UgaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUlZBTCkgeworCQkJCWlmIChleHRsbmEpCisJCQkJCWV4dGxuYSB8PSAweDgwMDA7CisJCQkJZXh0bG5hIHw9IChpIDw8IDgpOworCQkJCXN3aXRjaCAobHBkKSB7CisJCQkJY2FzZSBMUEQoMCwgMSwgMSk6CisJCQkJCXJldHVybiAweDhGOTI7CisJCQkJY2FzZSBMUEQoMCwgMCwgMSk6CisJCQkJCXJldHVybiAoMHg4MDkyIHwgZXh0bG5hKTsKKwkJCQljYXNlIExQRCgxLCAwLCAxKToKKwkJCQkJcmV0dXJuICgweDIwOTIgfCBleHRsbmEpOworCQkJCWNhc2UgTFBEKDEsIDAsIDApOgorCQkJCQlyZXR1cm4gKDB4MjA5MyB8IGV4dGxuYSk7CisJCQkJfQorCQkJCUI0M19XQVJOX09OKDEpOworCQkJfQorCQkJQjQzX1dBUk5fT04oMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHBoeS0+cmV2IDwgNykgfHwKKwkJICAgICEoc3Byb20tPmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0VYVExOQSkpIHsKKwkJCWlmIChwaHlfcmVnaXN0ZXIgPT0gQjQzX1BIWV9SRk9WRVIpIHsKKwkJCQlyZXR1cm4gMHgxQjM7CisJCQl9IGVsc2UgaWYgKHBoeV9yZWdpc3RlciA9PSBCNDNfUEhZX1JGT1ZFUlZBTCkgeworCQkJCXN3aXRjaCAobHBkKSB7CisJCQkJY2FzZSBMUEQoMCwgMSwgMSk6CisJCQkJCXJldHVybiAweDBGQjI7CisJCQkJY2FzZSBMUEQoMCwgMCwgMSk6CisJCQkJCXJldHVybiAweDAwQjI7CisJCQkJY2FzZSBMUEQoMSwgMCwgMSk6CisJCQkJCXJldHVybiAweDMwQjI7CisJCQkJY2FzZSBMUEQoMSwgMCwgMCk6CisJCQkJCXJldHVybiAweDMwQjM7CisJCQkJfQorCQkJCUI0M19XQVJOX09OKDEpOworCQkJfQorCQkJQjQzX1dBUk5fT04oMSk7CisJCX0gZWxzZSB7CisJCQlpZiAocGh5X3JlZ2lzdGVyID09IEI0M19QSFlfUkZPVkVSKSB7CisJCQkJcmV0dXJuIDB4OUIzOworCQkJfSBlbHNlIGlmIChwaHlfcmVnaXN0ZXIgPT0gQjQzX1BIWV9SRk9WRVJWQUwpIHsKKwkJCQlzd2l0Y2ggKGxwZCkgeworCQkJCWNhc2UgTFBEKDAsIDEsIDEpOgorCQkJCQlyZXR1cm4gMHg4RkIyOworCQkJCWNhc2UgTFBEKDAsIDAsIDEpOgorCQkJCQlyZXR1cm4gMHg4MEIyOworCQkJCWNhc2UgTFBEKDEsIDAsIDEpOgorCQkJCQlyZXR1cm4gMHgyMEIyOworCQkJCWNhc2UgTFBEKDEsIDAsIDApOgorCQkJCQlyZXR1cm4gMHgyMEIzOworCQkJCX0KKwkJCQlCNDNfV0FSTl9PTigxKTsKKwkJCX0KKwkJCUI0M19XQVJOX09OKDEpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5pdDIwNTBfc2F2ZWRfdmFsdWVzIHsKKwkvKiBDb3JlIHJlZ2lzdGVycyAqLworCXUxNiByZWdfM0VDOworCXUxNiByZWdfM0U2OworCXUxNiByZWdfM0Y0OworCS8qIFJhZGlvIHJlZ2lzdGVycyAqLworCXUxNiByYWRpb180MzsKKwl1MTYgcmFkaW9fNTE7CisJdTE2IHJhZGlvXzUyOworCS8qIFBIWSByZWdpc3RlcnMgKi8KKwl1MTYgcGh5X3BnYWN0bDsKKwl1MTYgcGh5X2Nja181QTsKKwl1MTYgcGh5X2Nja181OTsKKwl1MTYgcGh5X2Nja181ODsKKwl1MTYgcGh5X2Nja18zMDsKKwl1MTYgcGh5X3Jmb3ZlcjsKKwl1MTYgcGh5X3Jmb3ZlcnZhbDsKKwl1MTYgcGh5X2FuYWxvZ292ZXI7CisJdTE2IHBoeV9hbmFsb2dvdmVydmFsOworCXUxNiBwaHlfY3JzMDsKKwl1MTYgcGh5X2NsYXNzY3RsOworCXUxNiBwaHlfbG9fbWFzazsKKwl1MTYgcGh5X2xvX2N0bDsKKwl1MTYgcGh5X3N5bmNjdGw7Cit9OworCit1MTYgYjQzX3JhZGlvX2luaXQyMDUwKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBpbml0MjA1MF9zYXZlZF92YWx1ZXMgc2F2OworCXUxNiByY2M7CisJdTE2IHJhZGlvNzg7CisJdTE2IHJldDsKKwl1MTYgaSwgajsKKwl1MzIgdG1wMSA9IDAsIHRtcDIgPSAwOworCisJbWVtc2V0KCZzYXYsIDAsIHNpemVvZihzYXYpKTsJLyogZ2V0IHJpZCBvZiAibWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4uLiIgKi8KKworCXNhdi5yYWRpb180MyA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDQzKTsKKwlzYXYucmFkaW9fNTEgPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg1MSk7CisJc2F2LnJhZGlvXzUyID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NTIpOworCXNhdi5waHlfcGdhY3RsID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9QR0FDVEwpOworCXNhdi5waHlfY2NrXzVBID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHg1QSkpOworCXNhdi5waHlfY2NrXzU5ID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHg1OSkpOworCXNhdi5waHlfY2NrXzU4ID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHg1OCkpOworCisJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9CKSB7CisJCXNhdi5waHlfY2NrXzMwID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgzMCkpOworCQlzYXYucmVnXzNFQyA9IGI0M19yZWFkMTYoZGV2LCAweDNFQyk7CisKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MzApLCAweEZGKTsKKwkJYjQzX3dyaXRlMTYoZGV2LCAweDNFQywgMHgzRjNGKTsKKwl9IGVsc2UgaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQlzYXYucGh5X3Jmb3ZlciA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKTsKKwkJc2F2LnBoeV9yZm92ZXJ2YWwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCk7CisJCXNhdi5waHlfYW5hbG9nb3ZlciA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUik7CisJCXNhdi5waHlfYW5hbG9nb3ZlcnZhbCA9CisJCSAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwpOworCQlzYXYucGh5X2NyczAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApOworCQlzYXYucGh5X2NsYXNzY3RsID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DTEFTU0NUTCk7CisKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUiwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUikKKwkJCSAgICAgIHwgMHgwMDAzKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCkKKwkJCSAgICAgICYgMHhGRkZDKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DUlMwKQorCQkJICAgICAgJiAweDdGRkYpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DTEFTU0NUTCwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0xBU1NDVEwpCisJCQkgICAgICAmIDB4RkZGQyk7CisJCWlmIChoYXNfbG9vcGJhY2tfZ2FpbihwaHkpKSB7CisJCQlzYXYucGh5X2xvX21hc2sgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0xPX01BU0spOworCQkJc2F2LnBoeV9sb19jdGwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0xPX0NUTCk7CisKKwkJCWlmIChwaHktPnJldiA+PSAzKQorCQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX01BU0ssIDB4QzAyMCk7CisJCQllbHNlCisJCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgMHg4MDIwKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX0NUTCwgMCk7CisJCX0KKworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkJICAgTFBEKDAsIDEsIDEpKSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKKwkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwgQjQzX1BIWV9SRk9WRVIsIDApKTsKKwl9CisJYjQzX3dyaXRlMTYoZGV2LCAweDNFMiwgYjQzX3JlYWQxNihkZXYsIDB4M0UyKSB8IDB4ODAwMCk7CisKKwlzYXYucGh5X3N5bmNjdGwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1NZTkNDVEwpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1NZTkNDVEwsIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfU1lOQ0NUTCkKKwkJICAgICAgJiAweEZGN0YpOworCXNhdi5yZWdfM0U2ID0gYjQzX3JlYWQxNihkZXYsIDB4M0U2KTsKKwlzYXYucmVnXzNGNCA9IGI0M19yZWFkMTYoZGV2LCAweDNGNCk7CisKKwlpZiAocGh5LT5hbmFsb2cgPT0gMCkgeworCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFNiwgMHgwMTIyKTsKKwl9IGVsc2UgeworCQlpZiAocGh5LT5hbmFsb2cgPj0gMikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MDMpLAorCQkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDAzKSkKKwkJCQkgICAgICAgJiAweEZGQkYpIHwgMHg0MCk7CisJCX0KKwkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCwKKwkJCSAgICAoYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhUKSB8IDB4MjAwMCkpOworCX0KKworCXJjYyA9IGI0M19yYWRpb19jb3JlX2NhbGlicmF0aW9uX3ZhbHVlKGRldik7CisKKwlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0IpCisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3OCwgMHgyNik7CisJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkJICAgTFBEKDAsIDEsIDEpKSk7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhCRkFGKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyQiksIDB4MTQwMyk7CisJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkJICAgTFBEKDAsIDAsIDEpKSk7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhCRkEwKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTEsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUxKQorCQkJICB8IDB4MDAwNCk7CisJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDQzLCAweDFGKTsKKwl9IGVsc2UgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIDApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg0MykKKwkJCQkJICAgICAgJiAweEZGRjApIHwgMHgwMDA5KTsKKwl9CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDVBKSwgMHgwNDgwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTkpLCAweEM4MTApOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDB4MDAwRCk7CisJCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKKwkJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsCisJCQkJCQkJICAgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJCQkJICAgTFBEKDEsIDAsIDEpKSk7CisJCX0KKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEFGQjApOworCQl1ZGVsYXkoMTApOworCQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAorCQkJCQkJCSAgIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkJCSAgIExQRCgxLCAwLCAxKSkpOworCQl9CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhFRkIwKTsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKKwkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKKwkJCQkJCQkgICBMUEQoMSwgMCwgMCkpKTsKKwkJfQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIDB4RkZGMCk7CisJCXVkZWxheSgyMCk7CisJCXRtcDEgKz0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9MT19MRUFLQUdFKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCAwKTsKKwkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKKwkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKKwkJCQkJCQkgICBMUEQoMSwgMCwgMSkpKTsKKwkJfQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIDB4QUZCMCk7CisJfQorCXVkZWxheSgxMCk7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDApOworCXRtcDErKzsKKwl0bXAxID4+PSA5OworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJcmFkaW83OCA9IChiaXRyZXY0KGkpIDw8IDEpIHwgMHgwMDIwOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NzgsIHJhZGlvNzgpOworCQl1ZGVsYXkoMTApOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NUEpLCAweDBEODApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTkpLCAweEM4MTApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCAweDAwMEQpOworCQkJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwKKwkJCQkJICAgICAgcmFkaW8yMDUwX3Jmb3Zlcl92YWwoZGV2LAorCQkJCQkJCQkgICBCNDNfUEhZX1JGT1ZFUlZBTCwKKwkJCQkJCQkJICAgTFBEKDEsIDAsCisJCQkJCQkJCSAgICAgICAxKSkpOworCQkJfQorCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLCAweEFGQjApOworCQkJdWRlbGF5KDEwKTsKKwkJCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKKwkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKKwkJCQkJCQkJICAgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJCQkJCSAgIExQRCgxLCAwLAorCQkJCQkJCQkgICAgICAgMSkpKTsKKwkJCX0KKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhFRkIwKTsKKwkJCXVkZWxheSgxMCk7CisJCQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7CisJCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkgICAgICByYWRpbzIwNTBfcmZvdmVyX3ZhbChkZXYsCisJCQkJCQkJCSAgIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCQkJCQkgICBMUEQoMSwgMCwKKwkJCQkJCQkJICAgICAgIDApKSk7CisJCQl9CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIDB4RkZGMCk7CisJCQl1ZGVsYXkoMTApOworCQkJdG1wMiArPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0xPX0xFQUtBR0UpOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCAwKTsKKwkJCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKKwkJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJCSAgICAgIHJhZGlvMjA1MF9yZm92ZXJfdmFsKGRldiwKKwkJCQkJCQkJICAgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJCQkJCSAgIExQRCgxLCAwLAorCQkJCQkJCQkgICAgICAgMSkpKTsKKwkJCX0KKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhBRkIwKTsKKwkJfQorCQl0bXAyKys7CisJCXRtcDIgPj49IDg7CisJCWlmICh0bXAxIDwgdG1wMikKKwkJCWJyZWFrOworCX0KKworCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyAqLworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgc2F2LnBoeV9wZ2FjdGwpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1MSwgc2F2LnJhZGlvXzUxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIHNhdi5yYWRpb181Mik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDQzLCBzYXYucmFkaW9fNDMpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDVBKSwgc2F2LnBoeV9jY2tfNUEpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU5KSwgc2F2LnBoeV9jY2tfNTkpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU4KSwgc2F2LnBoeV9jY2tfNTgpOworCWI0M193cml0ZTE2KGRldiwgMHgzRTYsIHNhdi5yZWdfM0U2KTsKKwlpZiAocGh5LT5hbmFsb2cgIT0gMCkKKwkJYjQzX3dyaXRlMTYoZGV2LCAweDNGNCwgc2F2LnJlZ18zRjQpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1NZTkNDVEwsIHNhdi5waHlfc3luY2N0bCk7CisJYjQzX3N5bnRoX3B1X3dvcmthcm91bmQoZGV2LCBwaHktPmNoYW5uZWwpOworCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfQikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgzMCksIHNhdi5waHlfY2NrXzMwKTsKKwkJYjQzX3dyaXRlMTYoZGV2LCAweDNFQywgc2F2LnJlZ18zRUMpOworCX0gZWxzZSBpZiAocGh5LT5nbW9kZSkgeworCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9SQURJTywKKwkJCSAgICBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUEhZX1JBRElPKQorCQkJICAgICYgMHg3RkZGKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCBzYXYucGh5X3Jmb3Zlcik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwgc2F2LnBoeV9yZm92ZXJ2YWwpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLCBzYXYucGh5X2FuYWxvZ292ZXIpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLAorCQkJICAgICAgc2F2LnBoeV9hbmFsb2dvdmVydmFsKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwgc2F2LnBoeV9jcnMwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0xBU1NDVEwsIHNhdi5waHlfY2xhc3NjdGwpOworCQlpZiAoaGFzX2xvb3BiYWNrX2dhaW4ocGh5KSkgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgc2F2LnBoeV9sb19tYXNrKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX0NUTCwgc2F2LnBoeV9sb19jdGwpOworCQl9CisJfQorCWlmIChpID4gMTUpCisJCXJldCA9IHJhZGlvNzg7CisJZWxzZQorCQlyZXQgPSByY2M7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRiNShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IHNzYl9idXMgKmJ1cyA9IGRldi0+ZGV2LT5idXM7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiBvZmZzZXQsIHZhbHVlOworCXU4IG9sZF9jaGFubmVsOworCisJaWYgKHBoeS0+YW5hbG9nID09IDEpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpCisJCQkJICB8IDB4MDA1MCk7CisJfQorCWlmICgoYnVzLT5ib2FyZGluZm8udmVuZG9yICE9IFNTQl9CT0FSRFZFTkRPUl9CQ00pICYmCisJICAgIChidXMtPmJvYXJkaW5mby50eXBlICE9IFNTQl9CT0FSRF9CVTQzMDYpKSB7CisJCXZhbHVlID0gMHgyMTIwOworCQlmb3IgKG9mZnNldCA9IDB4MDBBODsgb2Zmc2V0IDwgMHgwMEM3OyBvZmZzZXQrKykgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwgdmFsdWUpOworCQkJdmFsdWUgKz0gMHgyMDI7CisJCX0KKwl9CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNSwgKGI0M19waHlfcmVhZChkZXYsIDB4MDAzNSkgJiAweEYwRkYpCisJCSAgICAgIHwgMHgwNzAwKTsKKwlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwKQorCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM4LCAweDA2NjcpOworCisJaWYgKHBoeS0+Z21vZGUgfHwgcGh5LT5yZXYgPj0gMikgeworCQlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwKSB7CisJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKKwkJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKQorCQkJCQkgIHwgMHgwMDIwKTsKKwkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUxLAorCQkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNTEpCisJCQkJCSAgfCAweDAwMDQpOworCQl9CisJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX1JBRElPLCAweDAwMDApOworCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgfCAweDAxMDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDJCLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpIHwgMHgyMDAwKTsKKworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDFDLCAweDE4NkEpOworCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTMsCisJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDEzKSAmIDB4MDBGRikgfCAweDE5MDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM1LAorCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDAzNSkgJiAweEZGQzApIHwgMHgwMDY0KTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1RCwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCAweDAwNUQpICYgMHhGRjgwKSB8IDB4MDAwQSk7CisJfQorCisJaWYgKGRldi0+YmFkX2ZyYW1lc19wcmVlbXB0KSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JBRElPX0JJVEZJRUxELAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJICAgQjQzX1BIWV9SQURJT19CSVRGSUVMRCkgfCAoMSA8PCAxMSkpOworCX0KKworCWlmIChwaHktPmFuYWxvZyA9PSAxKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjYsIDB4Q0UwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjEsIDB4Mzc2Myk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjIsIDB4MUJDMyk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjMsIDB4MDZGOSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjQsIDB4MDM3RSk7CisJfSBlbHNlCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMjYsIDB4Q0MwMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzMCwgMHgwMEM2KTsKKwliNDNfd3JpdGUxNihkZXYsIDB4MDNFQywgMHgzRjIyKTsKKworCWlmIChwaHktPmFuYWxvZyA9PSAxKQorCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDIwLCAweDNFMUMpOworCWVsc2UKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyMCwgMHgzMDFDKTsKKworCWlmIChwaHktPmFuYWxvZyA9PSAwKQorCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFNCwgMHgzMDAwKTsKKworCW9sZF9jaGFubmVsID0gcGh5LT5jaGFubmVsOworCS8qIEZvcmNlIHRvIGNoYW5uZWwgNywgZXZlbiBpZiBub3Qgc3VwcG9ydGVkLiAqLworCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgNywgMCk7CisKKwlpZiAocGh5LT5yYWRpb192ZXIgIT0gMHgyMDUwKSB7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDc1LCAweDAwODApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3OSwgMHgwMDgxKTsKKwl9CisKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MCwgMHgwMDIwKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1MCwgMHgwMDIzKTsKKworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTApIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMCk7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVBLCAweDAwNzApOworCX0KKworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVCLCAweDAwN0IpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVDLCAweDAwQjApOworCisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDA3KTsKKworCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgb2xkX2NoYW5uZWwsIDApOworCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNCwgMHgwMDgwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDMyLCAweDAwQ0EpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkEsIDB4ODhBMyk7CisKKwliNDNfc2V0X3R4cG93ZXJfZyhkZXYsICZncGh5LT5iYmF0dCwgJmdwaHktPnJmYXR0LCBncGh5LT50eF9jb250cm9sKTsKKworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTApCisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVELCAweDAwMEQpOworCisJYjQzX3dyaXRlMTYoZGV2LCAweDAzRTQsIChiNDNfcmVhZDE2KGRldiwgMHgwM0U0KSAmIDB4RkZDMCkgfCAweDAwMDQpOworfQorCitzdGF0aWMgdm9pZCBiNDNfcGh5X2luaXRiNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiBvZmZzZXQsIHZhbDsKKwl1OCBvbGRfY2hhbm5lbDsKKworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwM0UsIDB4ODE3QSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0EsCisJCQkgIChiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDdBKSB8IDB4MDA1OCkpOworCWlmIChwaHktPnJhZGlvX3JldiA9PSA0IHx8IHBoeS0+cmFkaW9fcmV2ID09IDUpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUxLCAweDM3KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCAweDcwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUzLCAweEIzKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDU0LCAweDlCKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVBLCAweDg4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVCLCAweDg4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVELCAweDg4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVFLCAweDg4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDdELCAweDg4KTsKKwkJYjQzX2hmX3dyaXRlKGRldiwgYjQzX2hmX3JlYWQoZGV2KQorCQkJICAgICB8IEI0M19IRl9UU1NJUlBTTVcpOworCX0KKwlCNDNfV0FSTl9PTihwaHktPnJhZGlvX3JldiA9PSA2IHx8IHBoeS0+cmFkaW9fcmV2ID09IDcpOwkvKiBXZSBoYWQgY29kZSBmb3IgdGhlc2UgcmV2cyBoZXJlLi4uICovCisJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUxLCAwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCAweDQwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUzLCAweEI3KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDU0LCAweDk4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVBLCAweDg4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVCLCAweDZCKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVDLCAweDBGKTsKKwkJaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX0FMVElRKSB7CisJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUQsIDB4RkEpOworCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDVFLCAweEQ4KTsKKwkJfSBlbHNlIHsKKwkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg1RCwgMHhGNSk7CisJCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUUsIDB4QjgpOworCQl9CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDczLCAweDAwMDMpOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3RCwgMHgwMEE4KTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwN0MsIDB4MDAwMSk7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDdFLCAweDAwMDgpOworCX0KKwl2YWwgPSAweDFFMUY7CisJZm9yIChvZmZzZXQgPSAweDAwODg7IG9mZnNldCA8IDB4MDA5ODsgb2Zmc2V0KyspIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIG9mZnNldCwgdmFsKTsKKwkJdmFsIC09IDB4MDIwMjsKKwl9CisJdmFsID0gMHgzRTNGOworCWZvciAob2Zmc2V0ID0gMHgwMDk4OyBvZmZzZXQgPCAweDAwQTg7IG9mZnNldCsrKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBvZmZzZXQsIHZhbCk7CisJCXZhbCAtPSAweDAyMDI7CisJfQorCXZhbCA9IDB4MjEyMDsKKwlmb3IgKG9mZnNldCA9IDB4MDBBODsgb2Zmc2V0IDwgMHgwMEM4OyBvZmZzZXQrKykgeworCQliNDNfcGh5X3dyaXRlKGRldiwgb2Zmc2V0LCAodmFsICYgMHgzRjNGKSk7CisJCXZhbCArPSAweDAyMDI7CisJfQorCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKKwkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpIHwgMHgwMDIwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTEsCisJCQkJICBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHgwMDUxKSB8IDB4MDAwNCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA4MDIsIGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgfCAweDAxMDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDJCLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MkIpIHwgMHgyMDAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4NUIsIDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHg1QywgMCk7CisJfQorCisJb2xkX2NoYW5uZWwgPSBwaHktPmNoYW5uZWw7CisJaWYgKG9sZF9jaGFubmVsID49IDgpCisJCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgMSwgMCk7CisJZWxzZQorCQliNDNfZ3BoeV9jaGFubmVsX3N3aXRjaChkZXYsIDEzLCAwKTsKKworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUwLCAweDAwMjApOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDUwLCAweDAwMjMpOworCXVkZWxheSg0MCk7CisJaWYgKHBoeS0+cmFkaW9fcmV2IDwgNiB8fCBwaHktPnJhZGlvX3JldiA9PSA4KSB7CisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3QywgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDdDKQorCQkJCQkgICAgICB8IDB4MDAwMikpOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTAsIDB4MjApOworCX0KKwlpZiAocGh5LT5yYWRpb19yZXYgPD0gMikgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4N0MsIDB4MjApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUEsIDB4NzApOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUIsIDB4N0IpOworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NUMsIDB4QjApOworCX0KKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QSwKKwkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwN0EpICYgMHgwMEY4KSB8IDB4MDAwNyk7CisKKwliNDNfZ3BoeV9jaGFubmVsX3N3aXRjaChkZXYsIG9sZF9jaGFubmVsLCAwKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMTQsIDB4MDIwMCk7CisJaWYgKHBoeS0+cmFkaW9fcmV2ID49IDYpCisJCWI0M19waHlfd3JpdGUoZGV2LCAweDJBLCAweDg4QzIpOworCWVsc2UKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MkEsIDB4OEFDMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzOCwgMHgwNjY4KTsKKwliNDNfc2V0X3R4cG93ZXJfZyhkZXYsICZncGh5LT5iYmF0dCwgJmdwaHktPnJmYXR0LCBncGh5LT50eF9jb250cm9sKTsKKwlpZiAocGh5LT5yYWRpb19yZXYgPD0gNSkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgMHg1RCwgKGI0M19waHlfcmVhZChkZXYsIDB4NUQpCisJCQkJCSAgJiAweEZGODApIHwgMHgwMDAzKTsKKwl9CisJaWYgKHBoeS0+cmFkaW9fcmV2IDw9IDIpCisJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDVELCAweDAwMEQpOworCisJaWYgKHBoeS0+YW5hbG9nID09IDQpIHsKKwkJYjQzX3dyaXRlMTYoZGV2LCAweDNFNCwgOSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDYxLCBiNDNfcGh5X3JlYWQoZGV2LCAweDYxKQorCQkJICAgICAgJiAweDBGRkYpOworCX0gZWxzZSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMDIsIChiNDNfcGh5X3JlYWQoZGV2LCAweDAwMDIpICYgMHhGRkMwKQorCQkJICAgICAgfCAweDAwMDQpOworCX0KKwlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0IpCisJCUI0M19XQVJOX09OKDEpOworCWVsc2UgaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKQorCQliNDNfd3JpdGUxNihkZXYsIDB4MDNFNiwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2NhbGNfbG9vcGJhY2tfZ2FpbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiBiYWNrdXBfcGh5WzE2XSA9IHsgMCB9OworCXUxNiBiYWNrdXBfcmFkaW9bM107CisJdTE2IGJhY2t1cF9iYmFuZDsKKwl1MTYgaSwgaiwgbG9vcF9pX21heDsKKwl1MTYgdHJzd19yeDsKKwl1MTYgbG9vcDFfb3V0ZXJfZG9uZSwgbG9vcDFfaW5uZXJfZG9uZTsKKworCWJhY2t1cF9waHlbMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApOworCWJhY2t1cF9waHlbMV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDS0JCQU5EQ0ZHKTsKKwliYWNrdXBfcGh5WzJdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpOworCWJhY2t1cF9waHlbM10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCk7CisJaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KKwkJYmFja3VwX3BoeVs0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUik7CisJCWJhY2t1cF9waHlbNV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwpOworCX0KKwliYWNrdXBfcGh5WzZdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHg1QSkpOworCWJhY2t1cF9waHlbN10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDU5KSk7CisJYmFja3VwX3BoeVs4XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4NTgpKTsKKwliYWNrdXBfcGh5WzldID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwQSkpOworCWJhY2t1cF9waHlbMTBdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgwMykpOworCWJhY2t1cF9waHlbMTFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9MT19NQVNLKTsKKwliYWNrdXBfcGh5WzEyXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fQ1RMKTsKKwliYWNrdXBfcGh5WzEzXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MkIpKTsKKwliYWNrdXBfcGh5WzE0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKTsKKwliYWNrdXBfcGh5WzE1XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfTE9fTEVBS0FHRSk7CisJYmFja3VwX2JiYW5kID0gZ3BoeS0+YmJhdHQuYXR0OworCWJhY2t1cF9yYWRpb1swXSA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUyKTsKKwliYWNrdXBfcmFkaW9bMV0gPSBiNDNfcmFkaW9fcmVhZDE2KGRldiwgMHg0Myk7CisJYmFja3VwX3JhZGlvWzJdID0gYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4N0EpOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DUlMwKSAmIDB4M0ZGRik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLQkJBTkRDRkcsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLQkJBTkRDRkcpIHwgMHg4MDAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKSB8IDB4MDAwMik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkgJiAweEZGRkQpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpIHwgMHgwMDAxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKSAmIDB4RkZGRSk7CisJaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUiwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUikgfCAweDAwMDEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJICAgQjQzX1BIWV9BTkFMT0dPVkVSVkFMKSAmIDB4RkZGRSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVIsCisJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVIpIHwgMHgwMDAyKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsCisJCQkJCSAgIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCkgJiAweEZGRkQpOworCX0KKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSKSB8IDB4MDAwQyk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkgfCAweDAwMEMpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpIHwgMHgwMDMwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCkKKwkJICAgICAgICYgMHhGRkNGKSB8IDB4MTApOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NUEpLCAweDA3ODApOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU5KSwgMHhDODEwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1OCksIDB4MDAwRCk7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgwQSksCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MEEpKSB8IDB4MjAwMCk7CisJaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUiwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUikgfCAweDAwMDQpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSVkFMLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJICAgQjQzX1BIWV9BTkFMT0dPVkVSVkFMKSAmIDB4RkZGQik7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDAzKSwKKwkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQ0NLKDB4MDMpKQorCQkgICAgICAgJiAweEZGOUYpIHwgMHg0MCk7CisKKwlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgeworCQliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NDMsIDB4MDAwRik7CisJfSBlbHNlIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLCAwKTsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDQzLCAoYjQzX3JhZGlvX3JlYWQxNihkZXYsIDB4NDMpCisJCQkJCSAgICAgICYgMHhGRkYwKSB8IDB4OSk7CisJfQorCWI0M19ncGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIDExKTsKKworCWlmIChwaHktPnJldiA+PSAzKQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19NQVNLLCAweEMwMjApOworCWVsc2UKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTE9fTUFTSywgMHg4MDIwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19DVEwsIDApOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4MkIpLAorCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9DQ0soMHgyQikpCisJCSAgICAgICAmIDB4RkZDMCkgfCAweDAxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyQiksCisJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDJCKSkKKwkJICAgICAgICYgMHhDMEZGKSB8IDB4ODAwKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpIHwgMHgwMTAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKSAmIDB4Q0ZGRik7CisKKwlpZiAoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BKSB7CisJCWlmIChwaHktPnJldiA+PSA3KSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsCisJCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVIpCisJCQkJICAgICAgfCAweDA4MDApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKQorCQkJCSAgICAgIHwgMHg4MDAwKTsKKwkJfQorCX0KKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4N0EsIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDdBKQorCQkJICAmIDB4MDBGNyk7CisKKwlqID0gMDsKKwlsb29wX2lfbWF4ID0gKHBoeS0+cmFkaW9fcmV2ID09IDgpID8gMTUgOiA5OworCWZvciAoaSA9IDA7IGkgPCBsb29wX2lfbWF4OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg0MywgaSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKQorCQkJCSAgICAgICAmIDB4RjBGRikgfCAoaiA8PCA4KSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsCisJCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKQorCQkJCSAgICAgICAmIDB4MEZGRikgfCAweEEwMDApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKQorCQkJCSAgICAgIHwgMHhGMDAwKTsKKwkJCXVkZWxheSgyMCk7CisJCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9MT19MRUFLQUdFKSA+PSAweERGQykKKwkJCQlnb3RvIGV4aXRfbG9vcDE7CisJCX0KKwl9CisgICAgICBleGl0X2xvb3AxOgorCWxvb3AxX291dGVyX2RvbmUgPSBpOworCWxvb3AxX2lubmVyX2RvbmUgPSBqOworCWlmIChqID49IDgpIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwpCisJCQkgICAgICB8IDB4MzApOworCQl0cnN3X3J4ID0gMHgxQjsKKwkJZm9yIChqID0gaiAtIDg7IGogPCAxNjsgaisrKSB7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKQorCQkJCSAgICAgICAmIDB4RjBGRikgfCAoaiA8PCA4KSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsCisJCQkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKQorCQkJCSAgICAgICAmIDB4MEZGRikgfCAweEEwMDApOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUEdBQ1RMLAorCQkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUEdBQ1RMKQorCQkJCSAgICAgIHwgMHhGMDAwKTsKKwkJCXVkZWxheSgyMCk7CisJCQl0cnN3X3J4IC09IDM7CisJCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9MT19MRUFLQUdFKSA+PSAweERGQykKKwkJCQlnb3RvIGV4aXRfbG9vcDI7CisJCX0KKwl9IGVsc2UKKwkJdHJzd19yeCA9IDB4MTg7CisgICAgICBleGl0X2xvb3AyOgorCisJaWYgKHBoeS0+cmV2ICE9IDEpIHsJLyogTm90IGluIHNwZWNzLCBidXQgbmVlZGVkIHRvIHByZXZlbnQgUFBDIG1hY2hpbmUgY2hlY2sgKi8KKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUiwgYmFja3VwX3BoeVs0XSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOQUxPR09WRVJWQUwsIGJhY2t1cF9waHlbNV0pOworCX0KKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHg1QSksIGJhY2t1cF9waHlbNl0pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDU5KSwgYmFja3VwX3BoeVs3XSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLKDB4NTgpLCBiYWNrdXBfcGh5WzhdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgwQSksIGJhY2t1cF9waHlbOV0pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDAzKSwgYmFja3VwX3BoeVsxMF0pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX01BU0ssIGJhY2t1cF9waHlbMTFdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9MT19DVEwsIGJhY2t1cF9waHlbMTJdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyQiksIGJhY2t1cF9waHlbMTNdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9QR0FDVEwsIGJhY2t1cF9waHlbMTRdKTsKKworCWI0M19ncGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsIGJhY2t1cF9iYmFuZCk7CisKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIDB4NTIsIGJhY2t1cF9yYWRpb1swXSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDQzLCBiYWNrdXBfcmFkaW9bMV0pOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHg3QSwgYmFja3VwX3JhZGlvWzJdKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwgYmFja3VwX3BoeVsyXSB8IDB4MDAwMyk7CisJdWRlbGF5KDEwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVIsIGJhY2t1cF9waHlbMl0pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCwgYmFja3VwX3BoeVszXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ1JTMCwgYmFja3VwX3BoeVswXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQ0NLQkJBTkRDRkcsIGJhY2t1cF9waHlbMV0pOworCisJZ3BoeS0+bWF4X2xiX2dhaW4gPQorCSAgICAoKGxvb3AxX2lubmVyX2RvbmUgKiA2KSAtIChsb29wMV9vdXRlcl9kb25lICogNCkpIC0gMTE7CisJZ3BoeS0+dHJzd19yeF9nYWluID0gdHJzd19yeCAqIDI7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19oYXJkd2FyZV9wY3RsX2Vhcmx5X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisKKwlpZiAoIWI0M19oYXNfaGFyZHdhcmVfcGN0bChkZXYpKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIDB4QzExMSk7CisJCXJldHVybjsKKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM2LCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwMzYpICYgMHhGRUZGKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDJGLCAweDAyMDIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0MsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3QykgfCAweDAwMDIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIGI0M19waHlfcmVhZChkZXYsIDB4MDQ3QSkgfCAweEYwMDApOworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5yYWRpb19yZXYgPT0gOCkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDdBLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDdBKQorCQkJCQkgICAgJiAweEZGMEYpIHwgMHgwMDEwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA1RCwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDVEKQorCQkJICAgICAgfCAweDgwMDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDRFLCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDRFKQorCQkJCQkgICAgJiAweEZGQzApIHwgMHgwMDEwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyRSwgMHhDMDdGKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM2KQorCQkJICAgICAgfCAweDA0MDApOworCX0gZWxzZSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMzYsIGI0M19waHlfcmVhZChkZXYsIDB4MDAzNikKKwkJCSAgICAgIHwgMHgwMjAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAzNiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM2KQorCQkJICAgICAgfCAweDA0MDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDVELCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNUQpCisJCQkgICAgICAmIDB4N0ZGRik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwNEYsIGI0M19waHlfcmVhZChkZXYsIDB4MDA0RikKKwkJCSAgICAgICYgMHhGRkZFKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDA0RSwgKGI0M19waHlfcmVhZChkZXYsIDB4MDA0RSkKKwkJCQkJICAgICYgMHhGRkMwKSB8IDB4MDAxMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDAwMkUsIDB4QzA3Rik7CisJCWI0M19waHlfd3JpdGUoZGV2LCAweDA0N0EsIChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0EpCisJCQkJCSAgICAmIDB4RkYwRikgfCAweDAwMTApOworCX0KK30KKworLyogSGFyZHdhcmUgcG93ZXIgY29udHJvbCBmb3IgRy1QSFkgKi8KK3N0YXRpYyB2b2lkIGI0M19oYXJkd2FyZV9wY3RsX2luaXRfZ3BoeShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCisJaWYgKCFiNDNfaGFzX2hhcmR3YXJlX3BjdGwoZGV2KSkgeworCQkvKiBObyBoYXJkd2FyZSBwb3dlciBjb250cm9sICovCisJCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgJiB+QjQzX0hGX0hXUENUTCk7CisJCXJldHVybjsKKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDM2LCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDM2KSAmIDB4RkZDMCkKKwkJICAgICAgfCAoZ3BoeS0+dGd0X2lkbGVfdHNzaSAtIGdwaHktPmN1cl9pZGxlX3Rzc2kpKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LCAoYjQzX3BoeV9yZWFkKGRldiwgMHgwNDc4KSAmIDB4RkYwMCkKKwkJICAgICAgfCAoZ3BoeS0+dGd0X2lkbGVfdHNzaSAtIGdwaHktPmN1cl9pZGxlX3Rzc2kpKTsKKwliNDNfZ3BoeV90c3NpX3Bvd2VyX2x0X2luaXQoZGV2KTsKKwliNDNfZ3BoeV9nYWluX2x0X2luaXQoZGV2KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDYwLCBiNDNfcGh5X3JlYWQoZGV2LCAweDAwNjApICYgMHhGRkJGKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwMDE0LCAweDAwMDApOworCisJQjQzX1dBUk5fT04ocGh5LT5yZXYgPCA2KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpCisJCSAgICAgIHwgMHgwODAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDc4LCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0NzgpCisJCSAgICAgICYgMHhGRUZGKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwODAxLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA4MDEpCisJCSAgICAgICYgMHhGRkJGKTsKKworCWI0M19ncGh5X2RjX2x0X2luaXQoZGV2LCAxKTsKKworCS8qIEVuYWJsZSBoYXJkd2FyZSBwY3RsIGluIGZpcm13YXJlLiAqLworCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgfCBCNDNfSEZfSFdQQ1RMKTsKK30KKworLyogSW50aWFsaXplIEIvRyBQSFkgcG93ZXIgY29udHJvbCAqLworc3RhdGljIHZvaWQgYjQzX3BoeV9pbml0X3BjdGwoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBzc2JfYnVzICpidXMgPSBkZXYtPmRldi0+YnVzOworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwlzdHJ1Y3QgYjQzX3JmYXR0IG9sZF9yZmF0dDsKKwlzdHJ1Y3QgYjQzX2JiYXR0IG9sZF9iYmF0dDsKKwl1OCBvbGRfdHhfY29udHJvbCA9IDA7CisKKwlCNDNfV0FSTl9PTihwaHktPnR5cGUgIT0gQjQzX1BIWVRZUEVfRyk7CisKKwlpZiAoKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNKSAmJgorCSAgICAoYnVzLT5ib2FyZGluZm8udHlwZSA9PSBTU0JfQk9BUkRfQlU0MzA2KSkKKwkJcmV0dXJuOworCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAyOCwgMHg4MDE4KTsKKworCS8qIFRoaXMgZG9lcyBzb21ldGhpbmcgd2l0aCB0aGUgQW5hbG9nLi4uICovCisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFkwLCBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUEhZMCkKKwkJICAgICYgMHhGRkRGKTsKKworCWlmICghcGh5LT5nbW9kZSkKKwkJcmV0dXJuOworCWI0M19oYXJkd2FyZV9wY3RsX2Vhcmx5X2luaXQoZGV2KTsKKwlpZiAoZ3BoeS0+Y3VyX2lkbGVfdHNzaSA9PSAwKSB7CisJCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5hbmFsb2cgPT0gMCkgeworCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNzYsCisJCQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNzYpCisJCQkJCSAgICYgMHgwMEY3KSB8IDB4MDA4NCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0OworCQkJc3RydWN0IGI0M19iYmF0dCBiYmF0dDsKKworCQkJbWVtY3B5KCZvbGRfcmZhdHQsICZncGh5LT5yZmF0dCwgc2l6ZW9mKG9sZF9yZmF0dCkpOworCQkJbWVtY3B5KCZvbGRfYmJhdHQsICZncGh5LT5iYmF0dCwgc2l6ZW9mKG9sZF9iYmF0dCkpOworCQkJb2xkX3R4X2NvbnRyb2wgPSBncGh5LT50eF9jb250cm9sOworCisJCQliYmF0dC5hdHQgPSAxMTsKKwkJCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KSB7CisJCQkJcmZhdHQuYXR0ID0gMTU7CisJCQkJcmZhdHQud2l0aF9wYWRtaXggPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZmF0dC5hdHQgPSA5OworCQkJCXJmYXR0LndpdGhfcGFkbWl4ID0gMDsKKwkJCX0KKwkJCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJmJiYXR0LCAmcmZhdHQsIDApOworCQl9CisJCWI0M19kdW1teV90cmFuc21pc3Npb24oZGV2KTsKKwkJZ3BoeS0+Y3VyX2lkbGVfdHNzaSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfSVRTU0kpOworCQlpZiAoQjQzX0RFQlVHKSB7CisJCQkvKiBDdXJyZW50LUlkbGUtVFNTSSBzYW5pdHkgY2hlY2suICovCisJCQlpZiAoYWJzKGdwaHktPmN1cl9pZGxlX3Rzc2kgLSBncGh5LT50Z3RfaWRsZV90c3NpKSA+PSAyMCkgeworCQkJCWI0M2RiZyhkZXYtPndsLAorCQkJCSAgICAgICAiIVdBUk5JTkchIElkbGUtVFNTSSBwaHktPmN1cl9pZGxlX3Rzc2kgIgorCQkJCSAgICAgICAibWVhc3VyaW5nIGZhaWxlZC4gKGN1cj0lZCwgdGd0PSVkKS4gRGlzYWJsaW5nIFRYIHBvd2VyICIKKwkJCQkgICAgICAgImFkanVzdG1lbnQuXG4iLCBncGh5LT5jdXJfaWRsZV90c3NpLAorCQkJCSAgICAgICBncGh5LT50Z3RfaWRsZV90c3NpKTsKKwkJCQlncGh5LT5jdXJfaWRsZV90c3NpID0gMDsKKwkJCX0KKwkJfQorCQlpZiAocGh5LT5yYWRpb192ZXIgPT0gMHgyMDUwICYmIHBoeS0+YW5hbG9nID09IDApIHsKKwkJCWI0M19yYWRpb193cml0ZTE2KGRldiwgMHgwMDc2LAorCQkJCQkgIGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDAwNzYpCisJCQkJCSAgJiAweEZGN0IpOworCQl9IGVsc2UgeworCQkJYjQzX3NldF90eHBvd2VyX2coZGV2LCAmb2xkX2JiYXR0LAorCQkJCQkgICZvbGRfcmZhdHQsIG9sZF90eF9jb250cm9sKTsKKwkJfQorCX0KKwliNDNfaGFyZHdhcmVfcGN0bF9pbml0X2dwaHkoZGV2KTsKKwliNDNfc2htX2NsZWFyX3Rzc2koZGV2KTsKK30KKworc3RhdGljIHZvaWQgYjQzX3BoeV9pbml0ZyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXUxNiB0bXA7CisKKwlpZiAocGh5LT5yZXYgPT0gMSkKKwkJYjQzX3BoeV9pbml0YjUoZGV2KTsKKwllbHNlCisJCWI0M19waHlfaW5pdGI2KGRldik7CisKKwlpZiAocGh5LT5yZXYgPj0gMiB8fCBwaHktPmdtb2RlKQorCQliNDNfcGh5X2luaXRhKGRldik7CisKKwlpZiAocGh5LT5yZXYgPj0gMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTkFMT0dPVkVSLCAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfQU5BTE9HT1ZFUlZBTCwgMCk7CisJfQorCWlmIChwaHktPnJldiA9PSAyKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1JGT1ZFUiwgMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhDMCk7CisJfQorCWlmIChwaHktPnJldiA+IDUpIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCAweDQwMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX1BHQUNUTCwgMHhDMCk7CisJfQorCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKKwkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9WRVJTSU9OX09GRE0pOworCQl0bXAgJj0gQjQzX1BIWVZFUl9WRVJTSU9OOworCQlpZiAodG1wID09IDMgfHwgdG1wID09IDUpIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhDMiksIDB4MTgxNik7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4QzMpLCAweDgwMDYpOworCQl9CisJCWlmICh0bXAgPT0gNSkgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweENDKSwKKwkJCQkgICAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNKDB4Q0MpKQorCQkJCSAgICAgICAmIDB4MDBGRikgfCAweDFGMDApOworCQl9CisJfQorCWlmICgocGh5LT5yZXYgPD0gMiAmJiBwaHktPmdtb2RlKSB8fCBwaHktPnJldiA+PSAyKQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNKDB4N0UpLCAweDc4KTsKKwlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9FWFRHKDB4MDEpLAorCQkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9FWFRHKDB4MDEpKQorCQkJICAgICAgfCAweDgwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT0ZETSgweDNFKSwKKwkJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT0ZETSgweDNFKSkKKwkJCSAgICAgIHwgMHg0KTsKKwl9CisJaWYgKGhhc19sb29wYmFja19nYWluKHBoeSkpCisJCWI0M19jYWxjX2xvb3BiYWNrX2dhaW4oZGV2KTsKKworCWlmIChwaHktPnJhZGlvX3JldiAhPSA4KSB7CisJCWlmIChncGh5LT5pbml0dmFsID09IDB4RkZGRikKKwkJCWdwaHktPmluaXR2YWwgPSBiNDNfcmFkaW9faW5pdDIwNTAoZGV2KTsKKwkJZWxzZQorCQkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNzgsIGdwaHktPmluaXR2YWwpOworCX0KKwliNDNfbG9fZ19pbml0KGRldik7CisJaWYgKGhhc190eF9tYWduaWZpY2F0aW9uKHBoeSkpIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLAorCQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUyKSAmIDB4RkYwMCkKKwkJCQkgIHwgZ3BoeS0+bG9fY29udHJvbC0+dHhfYmlhcyB8IGdwaHktPgorCQkJCSAgbG9fY29udHJvbC0+dHhfbWFnbik7CisJfSBlbHNlIHsKKwkJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCAweDUyLAorCQkJCSAgKGI0M19yYWRpb19yZWFkMTYoZGV2LCAweDUyKSAmIDB4RkZGMCkKKwkJCQkgIHwgZ3BoeS0+bG9fY29udHJvbC0+dHhfYmlhcyk7CisJfQorCWlmIChwaHktPnJldiA+PSA2KSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDM2KSwKKwkJCSAgICAgIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NDSygweDM2KSkKKwkJCSAgICAgICAmIDB4MEZGRikgfCAoZ3BoeS0+bG9fY29udHJvbC0+CisJCQkJCSAgICB0eF9iaWFzIDw8IDEyKSk7CisJfQorCWlmIChkZXYtPmRldi0+YnVzLT5zcHJvbS5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9QQUNUUkwpCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJFKSwgMHg4MDc1KTsKKwllbHNlCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJFKSwgMHg4MDdGKTsKKwlpZiAocGh5LT5yZXYgPCAyKQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DQ0soMHgyRiksIDB4MTAxKTsKKwllbHNlCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0NDSygweDJGKSwgMHgyMDIpOworCWlmIChwaHktPmdtb2RlIHx8IHBoeS0+cmV2ID49IDIpIHsKKwkJYjQzX2xvX2dfYWRqdXN0KGRldik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0xPX01BU0ssIDB4ODA3OCk7CisJfQorCisJaWYgKCEoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUlNTSSkpIHsKKwkJLyogVGhlIHNwZWNzIHN0YXRlIHRvIHVwZGF0ZSB0aGUgTlJTU0kgTFQgd2l0aAorCQkgKiB0aGUgdmFsdWUgMHg3RkZGRkZGRiBoZXJlLiBJIHRoaW5rIHRoYXQgaXMgc29tZSB3ZWlyZAorCQkgKiBjb21waWxlciBvcHRpbWl6YXRpb24gaW4gdGhlIG9yaWdpbmFsIGRyaXZlci4KKwkJICogRXNzZW50aWFsbHksIHdoYXQgd2UgZG8gaGVyZSBpcyByZXNldHRpbmcgYWxsIE5SU1NJIExUCisJCSAqIGVudHJpZXMgdG8gLTMyIChzZWUgdGhlIGNsYW1wX3ZhbCgpIGluIG5yc3NpX2h3X3VwZGF0ZSgpKQorCQkgKi8KKwkJYjQzX25yc3NpX2h3X3VwZGF0ZShkZXYsIDB4RkZGRik7CS8vRklYTUU/CisJCWI0M19jYWxjX25yc3NpX3RocmVzaG9sZChkZXYpOworCX0gZWxzZSBpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7CisJCWlmIChncGh5LT5ucnNzaVswXSA9PSAtMTAwMCkgeworCQkJQjQzX1dBUk5fT04oZ3BoeS0+bnJzc2lbMV0gIT0gLTEwMDApOworCQkJYjQzX2NhbGNfbnJzc2lfc2xvcGUoZGV2KTsKKwkJfSBlbHNlCisJCQliNDNfY2FsY19ucnNzaV90aHJlc2hvbGQoZGV2KTsKKwl9CisJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDgpCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0VYVEcoMHgwNSksIDB4MzIzMCk7CisJYjQzX3BoeV9pbml0X3BjdGwoZGV2KTsKKwkvKiBGSVhNRTogVGhlIHNwZWMgc2F5cyBpbiB0aGUgZm9sbG93aW5nIGlmLCB0aGUgMCBzaG91bGQgYmUgcmVwbGFjZWQKKwkgICAnaWYgT0ZETSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgbG9jYWxlJworCSAgIGJ1dCBPRkRNIGlzIGxlZ2FsIGV2ZXJ5d2hlcmUgKi8KKwlpZiAoKGRldi0+ZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0MzA2CisJICAgICAmJiBkZXYtPmRldi0+YnVzLT5jaGlwX3BhY2thZ2UgPT0gMikgfHwgMCkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9DUlMwLCBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0NSUzApCisJCQkgICAgICAmIDB4QkZGRik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE0oMHhDMyksCisJCQkgICAgICBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09GRE0oMHhDMykpCisJCQkgICAgICAmIDB4N0ZGRik7CisJfQorfQorCit2b2lkIGI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgIGJvb2wgc3ludGhldGljX3B1X3dvcmthcm91bmQpCit7CisJaWYgKHN5bnRoZXRpY19wdV93b3JrYXJvdW5kKQorCQliNDNfc3ludGhfcHVfd29ya2Fyb3VuZChkZXYsIGNoYW5uZWwpOworCisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMLCBjaGFubmVsMmZyZXFfYmcoY2hhbm5lbCkpOworCisJaWYgKGNoYW5uZWwgPT0gMTQpIHsKKwkJaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmNvdW50cnlfY29kZSA9PQorCQkgICAgU1NCX1NQUk9NMUNDT0RFX0pBUEFOKQorCQkJYjQzX2hmX3dyaXRlKGRldiwKKwkJCQkgICAgIGI0M19oZl9yZWFkKGRldikgJiB+QjQzX0hGX0FDUFIpOworCQllbHNlCisJCQliNDNfaGZfd3JpdGUoZGV2LAorCQkJCSAgICAgYjQzX2hmX3JlYWQoZGV2KSB8IEI0M19IRl9BQ1BSKTsKKwkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19DSEFOTkVMX0VYVCwKKwkJCSAgICBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQpCisJCQkgICAgfCAoMSA8PCAxMSkpOworCX0gZWxzZSB7CisJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fQ0hBTk5FTF9FWFQsCisJCQkgICAgYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX0NIQU5ORUxfRVhUKQorCQkJICAgICYgMHhGN0JGKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfYmFzZWJhbmRfYXR0ZW51YXRpb24oc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkgc3RydWN0IGI0M19iYmF0dCAqYmIpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKworCWlmIChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTAgJiYgcGh5LT5yYWRpb19yZXYgPCA2KQorCQliYi0+YXR0ID0gMDsKKwllbHNlCisJCWJiLT5hdHQgPSAyOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X3JhZGlvX2F0dGVudWF0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgYjQzX3JmYXR0ICpyZikKK3sKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJcmYtPndpdGhfcGFkbWl4ID0gMDsKKworCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSAmJgorCSAgICBidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RykgeworCQlpZiAoYnVzLT5ib2FyZGluZm8ucmV2IDwgMHg0MykgeworCQkJcmYtPmF0dCA9IDI7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoYnVzLT5ib2FyZGluZm8ucmV2IDwgMHg1MSkgeworCQkJcmYtPmF0dCA9IDM7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAocGh5LT50eXBlID09IEI0M19QSFlUWVBFX0EpIHsKKwkJcmYtPmF0dCA9IDB4NjA7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHBoeS0+cmFkaW9fdmVyKSB7CisJY2FzZSAweDIwNTM6CisJCXN3aXRjaCAocGh5LT5yYWRpb19yZXYpIHsKKwkJY2FzZSAxOgorCQkJcmYtPmF0dCA9IDY7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDIwNTA6CisJCXN3aXRjaCAocGh5LT5yYWRpb19yZXYpIHsKKwkJY2FzZSAwOgorCQkJcmYtPmF0dCA9IDU7CisJCQlyZXR1cm47CisJCWNhc2UgMToKKwkJCWlmIChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykgeworCQkJCWlmIChidXMtPmJvYXJkaW5mby52ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTQorCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby50eXBlID09IFNTQl9CT0FSRF9CQ000MzA5RworCQkJCSAgICAmJiBidXMtPmJvYXJkaW5mby5yZXYgPj0gMzApCisJCQkJCXJmLT5hdHQgPSAzOworCQkJCWVsc2UgaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PQorCQkJCQkgU1NCX0JPQVJEVkVORE9SX0JDTQorCQkJCQkgJiYgYnVzLT5ib2FyZGluZm8udHlwZSA9PQorCQkJCQkgU1NCX0JPQVJEX0JVNDMwNikKKwkJCQkJcmYtPmF0dCA9IDM7CisJCQkJZWxzZQorCQkJCQlyZi0+YXR0ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCisJCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCisJCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKKwkJCQkJcmYtPmF0dCA9IDc7CisJCQkJZWxzZQorCQkJCQlyZi0+YXR0ID0gNjsKKwkJCX0KKwkJCXJldHVybjsKKwkJY2FzZSAyOgorCQkJaWYgKHBoeS0+dHlwZSA9PSBCNDNfUEhZVFlQRV9HKSB7CisJCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBTU0JfQk9BUkRWRU5ET1JfQkNNCisJCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnR5cGUgPT0gU1NCX0JPQVJEX0JDTTQzMDlHCisJCQkJICAgICYmIGJ1cy0+Ym9hcmRpbmZvLnJldiA+PSAzMCkKKwkJCQkJcmYtPmF0dCA9IDM7CisJCQkJZWxzZSBpZiAoYnVzLT5ib2FyZGluZm8udmVuZG9yID09CisJCQkJCSBTU0JfQk9BUkRWRU5ET1JfQkNNCisJCQkJCSAmJiBidXMtPmJvYXJkaW5mby50eXBlID09CisJCQkJCSBTU0JfQk9BUkRfQlU0MzA2KQorCQkJCQlyZi0+YXR0ID0gNTsKKwkJCQllbHNlIGlmIChidXMtPmNoaXBfaWQgPT0gMHg0MzIwKQorCQkJCQlyZi0+YXR0ID0gNDsKKwkJCQllbHNlCisJCQkJCXJmLT5hdHQgPSAzOworCQkJfSBlbHNlCisJCQkJcmYtPmF0dCA9IDY7CisJCQlyZXR1cm47CisJCWNhc2UgMzoKKwkJCXJmLT5hdHQgPSA1OworCQkJcmV0dXJuOworCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJCXJmLT5hdHQgPSAxOworCQkJcmV0dXJuOworCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJCXJmLT5hdHQgPSA1OworCQkJcmV0dXJuOworCQljYXNlIDg6CisJCQlyZi0+YXR0ID0gMHhBOworCQkJcmYtPndpdGhfcGFkbWl4ID0gMTsKKwkJCXJldHVybjsKKwkJY2FzZSA5OgorCQlkZWZhdWx0OgorCQkJcmYtPmF0dCA9IDU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJcmYtPmF0dCA9IDU7Cit9CisKK3N0YXRpYyB1MTYgZGVmYXVsdF90eF9jb250cm9sKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJaWYgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkKKwkJcmV0dXJuIDA7CisJaWYgKHBoeS0+cmFkaW9fcmV2ID09IDEpCisJCXJldHVybiBCNDNfVFhDVExfUEEyREIgfCBCNDNfVFhDVExfVFhNSVg7CisJaWYgKHBoeS0+cmFkaW9fcmV2IDwgNikKKwkJcmV0dXJuIEI0M19UWENUTF9QQTJEQjsKKwlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkKKwkJcmV0dXJuIEI0M19UWENUTF9UWE1JWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IGI0M19ncGh5X2FjaV9kZXRlY3Qoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwl1OCByZXQgPSAwOworCXUxNiBzYXZlZCwgcnNzaSwgdGVtcDsKKwlpbnQgaSwgaiA9IDA7CisKKwlzYXZlZCA9IGI0M19waHlfcmVhZChkZXYsIDB4MDQwMyk7CisJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgY2hhbm5lbCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDQwMywgKHNhdmVkICYgMHhGRkY4KSB8IDUpOworCWlmIChncGh5LT5hY2lfaHdfcnNzaSkKKwkJcnNzaSA9IGI0M19waHlfcmVhZChkZXYsIDB4MDQ4QSkgJiAweDNGOworCWVsc2UKKwkJcnNzaSA9IHNhdmVkICYgMHgzRjsKKwkvKiBjbGFtcCB0ZW1wIHRvIHNpZ25lZCA1Yml0ICovCisJaWYgKHJzc2kgPiAzMikKKwkJcnNzaSAtPSA2NDsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdGVtcCA9IChiNDNfcGh5X3JlYWQoZGV2LCAweDA0N0YpID4+IDgpICYgMHgzRjsKKwkJaWYgKHRlbXAgPiAzMikKKwkJCXRlbXAgLT0gNjQ7CisJCWlmICh0ZW1wIDwgcnNzaSkKKwkJCWorKzsKKwkJaWYgKGogPj0gMjApCisJCQlyZXQgPSAxOworCX0KKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDAzLCBzYXZlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTggYjQzX2dwaHlfYWNpX3NjYW4oc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJdTggcmV0WzEzXTsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IHBoeS0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgc3RhcnQsIGVuZDsKKworCWlmICghKChwaHktPnR5cGUgPT0gQjQzX1BIWVRZUEVfRykgJiYgKHBoeS0+cmV2ID4gMCkpKQorCQlyZXR1cm4gMDsKKworCWI0M19waHlfbG9jayhkZXYpOworCWI0M19yYWRpb19sb2NrKGRldik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwgYjQzX3BoeV9yZWFkKGRldiwgMHgwODAyKSAmIDB4RkZGQyk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfR19DUlMsCisJCSAgICAgIGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfR19DUlMpICYgMHg3RkZGKTsKKwliNDNfc2V0X2FsbF9nYWlucyhkZXYsIDMsIDgsIDEpOworCisJc3RhcnQgPSAoY2hhbm5lbCAtIDUgPiAwKSA/IGNoYW5uZWwgLSA1IDogMTsKKwllbmQgPSAoY2hhbm5lbCArIDUgPCAxNCkgPyBjaGFubmVsICsgNSA6IDEzOworCisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKKwkJaWYgKGFicyhjaGFubmVsIC0gaSkgPiAyKQorCQkJcmV0W2kgLSAxXSA9IGI0M19ncGh5X2FjaV9kZXRlY3QoZGV2LCBpKTsKKwl9CisJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgY2hhbm5lbCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MDgwMiwKKwkJICAgICAgKGI0M19waHlfcmVhZChkZXYsIDB4MDgwMikgJiAweEZGRkMpIHwgMHgwMDAzKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgwNDAzLCBiNDNfcGh5X3JlYWQoZGV2LCAweDA0MDMpICYgMHhGRkY4KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9HX0NSUywKKwkJICAgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9HX0NSUykgfCAweDgwMDApOworCWI0M19zZXRfb3JpZ2luYWxfZ2FpbnMoZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykgeworCQlpZiAoIXJldFtpXSkKKwkJCWNvbnRpbnVlOworCQllbmQgPSAoaSArIDUgPCAxMykgPyBpICsgNSA6IDEzOworCQlmb3IgKGogPSBpOyBqIDwgZW5kOyBqKyspCisJCQlyZXRbal0gPSAxOworCX0KKwliNDNfcmFkaW9fdW5sb2NrKGRldik7CisJYjQzX3BoeV91bmxvY2soZGV2KTsKKworCXJldHVybiByZXRbY2hhbm5lbCAtIDFdOworfQorCitzdGF0aWMgczMyIGI0M190c3NpMmRibV9hZChzMzIgbnVtLCBzMzIgZGVuKQoreworCWlmIChudW0gPCAwKQorCQlyZXR1cm4gbnVtIC8gZGVuOworCWVsc2UKKwkJcmV0dXJuIChudW0gKyBkZW4gLyAyKSAvIGRlbjsKK30KKworc3RhdGljIHM4IGI0M190c3NpMmRibV9lbnRyeShzOCBlbnRyeVtdLCB1OCBpbmRleCwKKwkJCSAgICAgczE2IHBhYjAsIHMxNiBwYWIxLCBzMTYgcGFiMikKK3sKKwlzMzIgbTEsIG0yLCBmID0gMjU2LCBxLCBkZWx0YTsKKwlzOCBpID0gMDsKKworCW0xID0gYjQzX3Rzc2kyZGJtX2FkKDE2ICogcGFiMCArIGluZGV4ICogcGFiMSwgMzIpOworCW0yID0gbWF4KGI0M190c3NpMmRibV9hZCgzMjc2OCArIGluZGV4ICogcGFiMiwgMjU2KSwgMSk7CisJZG8geworCQlpZiAoaSA+IDE1KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXEgPSBiNDNfdHNzaTJkYm1fYWQoZiAqIDQwOTYgLQorCQkJCSAgICBiNDNfdHNzaTJkYm1fYWQobTIgKiBmLCAxNikgKiBmLCAyMDQ4KTsKKwkJZGVsdGEgPSBhYnMocSAtIGYpOworCQlmID0gcTsKKwkJaSsrOworCX0gd2hpbGUgKGRlbHRhID49IDIpOworCWVudHJ5W2luZGV4XSA9IGNsYW1wX3ZhbChiNDNfdHNzaTJkYm1fYWQobTEgKiBmLCA4MTkyKSwgLTEyNywgMTI4KTsKKwlyZXR1cm4gMDsKK30KKwordTggKiBiNDNfZ2VuZXJhdGVfZHluX3Rzc2kyZGJtX3RhYihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJICAgczE2IHBhYjAsIHMxNiBwYWIxLCBzMTYgcGFiMikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCAqdGFiOworCWludCBlcnI7CisKKwl0YWIgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhYikgeworCQliNDNlcnIoZGV2LT53bCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgIgorCQkgICAgICAgImZvciB0c3NpMmRibSB0YWJsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQllcnIgPSBiNDNfdHNzaTJkYm1fZW50cnkodGFiLCBpLCBwYWIwLCBwYWIxLCBwYWIyKTsKKwkJaWYgKGVycikgeworCQkJYjQzZXJyKGRldi0+d2wsICJDb3VsZCBub3QgZ2VuZXJhdGUgIgorCQkJICAgICAgICJ0c3NpMmRCbSB0YWJsZVxuIik7CisJCQlrZnJlZSh0YWIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gdGFiOworfQorCisvKiBJbml0aWFsaXNlIHRoZSBUU1NJLT5kQm0gbG9va3VwIHRhYmxlICovCitzdGF0aWMgaW50IGI0M19ncGh5X2luaXRfdHNzaTJkYm1fdGFibGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwlzMTYgcGFiMCwgcGFiMSwgcGFiMjsKKworCXBhYjAgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGEwYjApOworCXBhYjEgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGEwYjEpOworCXBhYjIgPSAoczE2KSAoZGV2LT5kZXYtPmJ1cy0+c3Byb20ucGEwYjIpOworCisJQjQzX1dBUk5fT04oKGRldi0+ZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0MzAxKSAmJgorCQkgICAgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkpOyAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUgKi8KKworCWdwaHktPmR5bl90c3NpX3RibCA9IDA7CisKKwlpZiAocGFiMCAhPSAwICYmIHBhYjEgIT0gMCAmJiBwYWIyICE9IDAgJiYKKwkgICAgcGFiMCAhPSAtMSAmJiBwYWIxICE9IC0xICYmIHBhYjIgIT0gLTEpIHsKKwkJLyogVGhlIHBhYlggdmFsdWVzIGFyZSBzZXQgaW4gU1BST00uIFVzZSB0aGVtLiAqLworCQlpZiAoKHM4KSBkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyAhPSAwICYmCisJCSAgICAoczgpIGRldi0+ZGV2LT5idXMtPnNwcm9tLml0c3NpX2JnICE9IC0xKSB7CisJCQlncGh5LT50Z3RfaWRsZV90c3NpID0KKwkJCQkoczgpIChkZXYtPmRldi0+YnVzLT5zcHJvbS5pdHNzaV9iZyk7CisJCX0gZWxzZQorCQkJZ3BoeS0+dGd0X2lkbGVfdHNzaSA9IDYyOworCQlncGh5LT50c3NpMmRibSA9IGI0M19nZW5lcmF0ZV9keW5fdHNzaTJkYm1fdGFiKGRldiwgcGFiMCwKKwkJCQkJCQkgICAgICAgcGFiMSwgcGFiMik7CisJCWlmICghZ3BoeS0+dHNzaTJkYm0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZ3BoeS0+ZHluX3Rzc2lfdGJsID0gMTsKKwl9IGVsc2UgeworCQkvKiBwYWJYIHZhbHVlcyBub3Qgc2V0IGluIFNQUk9NLiAqLworCQlncGh5LT50Z3RfaWRsZV90c3NpID0gNTI7CisJCWdwaHktPnRzc2kyZGJtID0gYjQzX3Rzc2kyZGJtX2dfdGFibGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYjQzX2dwaHlfb3BfYWxsb2NhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHk7CisJc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvOworCWludCBlcnI7CisKKwlncGh5ID0ga3phbGxvYyhzaXplb2YoKmdwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaHkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5waHkuZyA9IGdwaHk7CisKKwlsbyA9IGt6YWxsb2Moc2l6ZW9mKCpsbyksIEdGUF9LRVJORUwpOworCWlmICghbG8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9ncGh5OworCX0KKwlncGh5LT5sb19jb250cm9sID0gbG87CisKKwllcnIgPSBiNDNfZ3BoeV9pbml0X3Rzc2kyZGJtX3RhYmxlKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9sbzsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9sbzoKKwlrZnJlZShsbyk7CitlcnJfZnJlZV9ncGh5OgorCWtmcmVlKGdwaHkpOworZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYjQzX2dwaHlfb3BfcHJlcGFyZV9zdHJ1Y3RzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CisJY29uc3Qgdm9pZCAqdHNzaTJkYm07CisJaW50IHRndF9pZGxlX3Rzc2k7CisJc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2wgKmxvOworCXVuc2lnbmVkIGludCBpOworCisJLyogdHNzaTJkYm0gdGFibGUgaXMgY29uc3RhbnQsIHNvIGl0IGlzIGluaXRpYWxpemVkIGF0IGFsbG9jIHRpbWUuCisJICogU2F2ZSBhIGNvcHkgb2YgdGhlIHBvaW50ZXIuICovCisJdHNzaTJkYm0gPSBncGh5LT50c3NpMmRibTsKKwl0Z3RfaWRsZV90c3NpID0gZ3BoeS0+dGd0X2lkbGVfdHNzaTsKKwkvKiBTYXZlIHRoZSBMTyBwb2ludGVyLiAqLworCWxvID0gZ3BoeS0+bG9fY29udHJvbDsKKworCS8qIFplcm8gb3V0IHRoZSB3aG9sZSBQSFkgc3RydWN0dXJlLiAqLworCW1lbXNldChncGh5LCAwLCBzaXplb2YoKmdwaHkpKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlcnMuICovCisJZ3BoeS0+dHNzaTJkYm0gPSB0c3NpMmRibTsKKwlncGh5LT50Z3RfaWRsZV90c3NpID0gdGd0X2lkbGVfdHNzaTsKKwlncGh5LT5sb19jb250cm9sID0gbG87CisKKwltZW1zZXQoZ3BoeS0+bWlubG93c2lnLCAweEZGLCBzaXplb2YoZ3BoeS0+bWlubG93c2lnKSk7CisKKwkvKiBOUlNTSSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaHktPm5yc3NpKTsgaSsrKQorCQlncGh5LT5ucnNzaVtpXSA9IC0xMDAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaHktPm5yc3NpX2x0KTsgaSsrKQorCQlncGh5LT5ucnNzaV9sdFtpXSA9IGk7CisKKwlncGh5LT5sb2ZjYWwgPSAweEZGRkY7CisJZ3BoeS0+aW5pdHZhbCA9IDB4RkZGRjsKKworCWdwaHktPmludGVyZm1vZGUgPSBCNDNfSU5URVJGTU9ERV9OT05FOworCisJLyogT0ZETS10YWJsZSBhZGRyZXNzIGNhY2hpbmcuICovCisJZ3BoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiA9IEI0M19PRkRNVEFCX0RJUkVDVElPTl9VTktOT1dOOworCisJZ3BoeS0+YXZlcmFnZV90c3NpID0gMHhGRjsKKworCS8qIExvY2FsIE9zY2lhbGxhdG9yIHN0cnVjdHVyZSAqLworCWxvLT50eF9iaWFzID0gMHhGRjsKKwlJTklUX0xJU1RfSEVBRCgmbG8tPmNhbGliX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBiNDNfZ3BoeV9vcF9mcmVlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CisKKwlrZnJlZShncGh5LT5sb19jb250cm9sKTsKKworCWlmIChncGh5LT5keW5fdHNzaV90YmwpCisJCWtmcmVlKGdwaHktPnRzc2kyZGJtKTsKKwlncGh5LT5keW5fdHNzaV90YmwgPSAwOworCWdwaHktPnRzc2kyZGJtID0gTlVMTDsKKworCWtmcmVlKGdwaHkpOworCWRldi0+cGh5LmcgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGI0M19ncGh5X29wX3ByZXBhcmVfaGFyZHdhcmUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBncGh5LT5sb19jb250cm9sOworCisJQjQzX1dBUk5fT04ocGh5LT50eXBlICE9IEI0M19QSFlUWVBFX0cpOworCisJZGVmYXVsdF9iYXNlYmFuZF9hdHRlbnVhdGlvbihkZXYsICZncGh5LT5iYmF0dCk7CisJZGVmYXVsdF9yYWRpb19hdHRlbnVhdGlvbihkZXYsICZncGh5LT5yZmF0dCk7CisJZ3BoeS0+dHhfY29udHJvbCA9IChkZWZhdWx0X3R4X2NvbnRyb2woZGV2KSA8PCA0KTsKKwlnZW5lcmF0ZV9yZmF0dF9saXN0KGRldiwgJmxvLT5yZmF0dF9saXN0KTsKKwlnZW5lcmF0ZV9iYmF0dF9saXN0KGRldiwgJmxvLT5iYmF0dF9saXN0KTsKKworCS8qIENvbW1pdCBwcmV2aW91cyB3cml0ZXMgKi8KKwliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsKKworCWlmIChwaHktPnJldiA9PSAxKSB7CisJCS8qIFdvcmthcm91bmQ6IFRlbXBvcmFybHkgZGlzYWJsZSBnbW9kZSB0aHJvdWdoIHRoZSBlYXJseSBpbml0CisJCSAqIHBoYXNlLCBhcyB0aGUgZ21vZGUgc3R1ZmYgaXMgbm90IG5lZWRlZCBmb3IgcGh5IHJldiAxICovCisJCXBoeS0+Z21vZGUgPSAwOworCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIDApOworCQliNDNfcGh5X2luaXRnKGRldik7CisJCXBoeS0+Z21vZGUgPSAxOworCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIEI0M19UTVNMT1dfR01PREUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGI0M19ncGh5X29wX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWI0M19waHlfaW5pdGcoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiNDNfZ3BoeV9vcF9leGl0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwliNDNfbG9fZ19jbGVhbnVwKGRldik7Cit9CisKK3N0YXRpYyB1MTYgYjQzX2dwaHlfb3BfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2dwaHlfb3Bfd3JpdGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsdWUpCit7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB1MTYgYjQzX2dwaHlfb3BfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJLyogUmVnaXN0ZXIgMSBpcyBhIDMyLWJpdCByZWdpc3Rlci4gKi8KKwlCNDNfV0FSTl9PTihyZWcgPT0gMSk7CisJLyogRy1QSFkgbmVlZHMgMHg4MCBmb3IgcmVhZCBhY2Nlc3MuICovCisJcmVnIHw9IDB4ODA7CisKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0NPTlRST0wsIHJlZyk7CisJcmV0dXJuIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19SQURJT19EQVRBX0xPVyk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ncGh5X29wX3JhZGlvX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCS8qIFJlZ2lzdGVyIDEgaXMgYSAzMi1iaXQgcmVnaXN0ZXIuICovCisJQjQzX1dBUk5fT04ocmVnID09IDEpOworCisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19SQURJT19DT05UUk9MLCByZWcpOworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fREFUQV9MT1csIHZhbHVlKTsKK30KKworc3RhdGljIGJvb2wgYjQzX2dwaHlfb3Bfc3VwcG9ydHNfaHdwY3RsKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+cGh5LnJldiA+PSA2KTsKK30KKworc3RhdGljIHZvaWQgYjQzX2dwaHlfb3Bfc29mdHdhcmVfcmZraWxsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkJZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSB7CisJCS8qIFR1cm4gcmFkaW8gT04gKi8KKwkJaWYgKHBoeS0+cmFkaW9fb24pCisJCQlyZXR1cm47CisKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgMHg4MDAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgMHhDQzAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIDB4MDAxNSwgKHBoeS0+Z21vZGUgPyAweDAwQzAgOiAweDAwMDApKTsKKwkJaWYgKGdwaHktPnJhZGlvX29mZl9jb250ZXh0LnZhbGlkKSB7CisJCQkvKiBSZXN0b3JlIHRoZSBSRm92ZXIgdmFsdWVzLiAqLworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLAorCQkJCSAgICAgIGdwaHktPnJhZGlvX29mZl9jb250ZXh0LnJmb3Zlcik7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsCisJCQkJICAgICAgZ3BoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVydmFsKTsKKwkJCWdwaHktPnJhZGlvX29mZl9jb250ZXh0LnZhbGlkID0gMDsKKwkJfQorCQljaGFubmVsID0gcGh5LT5jaGFubmVsOworCQliNDNfZ3BoeV9jaGFubmVsX3N3aXRjaChkZXYsIDYsIDEpOworCQliNDNfZ3BoeV9jaGFubmVsX3N3aXRjaChkZXYsIGNoYW5uZWwsIDApOworCX0gZWxzZSB7CisJCS8qIFR1cm4gcmFkaW8gT0ZGICovCisJCXUxNiByZm92ZXIsIHJmb3ZlcnZhbDsKKworCQlyZm92ZXIgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUik7CisJCXJmb3ZlcnZhbCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfUkZPVkVSVkFMKTsKKwkJZ3BoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVyID0gcmZvdmVyOworCQlncGh5LT5yYWRpb19vZmZfY29udGV4dC5yZm92ZXJ2YWwgPSByZm92ZXJ2YWw7CisJCWdwaHktPnJhZGlvX29mZl9jb250ZXh0LnZhbGlkID0gMTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCByZm92ZXIgfCAweDAwOEMpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsIHJmb3ZlcnZhbCAmIDB4RkY3Myk7CisJfQorfQorCitzdGF0aWMgaW50IGI0M19ncGh5X29wX3N3aXRjaF9jaGFubmVsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbmV3X2NoYW5uZWwpCit7CisJaWYgKChuZXdfY2hhbm5lbCA8IDEpIHx8IChuZXdfY2hhbm5lbCA+IDE0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYjQzX2dwaHlfY2hhbm5lbF9zd2l0Y2goZGV2LCBuZXdfY2hhbm5lbCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiNDNfZ3BoeV9vcF9nZXRfZGVmYXVsdF9jaGFuKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlyZXR1cm4gMTsgLyogRGVmYXVsdCB0byBjaGFubmVsIDEgKi8KK30KKworc3RhdGljIHZvaWQgYjQzX2dwaHlfb3Bfc2V0X3J4X2FudGVubmEoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgYW50ZW5uYSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXU2NCBoZjsKKwl1MTYgdG1wOworCWludCBhdXRvZGl2ID0gMDsKKworCWlmIChhbnRlbm5hID09IEI0M19BTlRFTk5BX0FVVE8wIHx8IGFudGVubmEgPT0gQjQzX0FOVEVOTkFfQVVUTzEpCisJCWF1dG9kaXYgPSAxOworCisJaGYgPSBiNDNfaGZfcmVhZChkZXYpOworCWhmICY9IH5CNDNfSEZfQU5URElWSEVMUDsKKwliNDNfaGZfd3JpdGUoZGV2LCBoZik7CisKKwl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0JCQU5EQ0ZHKTsKKwl0bXAgJj0gfkI0M19QSFlfQkJBTkRDRkdfUlhBTlQ7CisJdG1wIHw9IChhdXRvZGl2ID8gQjQzX0FOVEVOTkFfQVVUTzAgOiBhbnRlbm5hKQorCQkJPDwgQjQzX1BIWV9CQkFORENGR19SWEFOVF9TSElGVDsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9CQkFORENGRywgdG1wKTsKKworCWlmIChhdXRvZGl2KSB7CisJCXRtcCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfQU5URFdFTEwpOworCQlpZiAoYW50ZW5uYSA9PSBCNDNfQU5URU5OQV9BVVRPMCkKKwkJCXRtcCAmPSB+QjQzX1BIWV9BTlREV0VMTF9BVVRPRElWMTsKKwkJZWxzZQorCQkJdG1wIHw9IEI0M19QSFlfQU5URFdFTExfQVVUT0RJVjE7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FOVERXRUxMLCB0bXApOworCX0KKwl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX0FOVFdSU0VUVCk7CisJaWYgKGF1dG9kaXYpCisJCXRtcCB8PSBCNDNfUEhZX0FOVFdSU0VUVF9BUlhESVY7CisJZWxzZQorCQl0bXAgJj0gfkI0M19QSFlfQU5UV1JTRVRUX0FSWERJVjsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BTlRXUlNFVFQsIHRtcCk7CisJaWYgKHBoeS0+cmV2ID49IDIpIHsKKwkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PRkRNNjEpOworCQl0bXAgfD0gQjQzX1BIWV9PRkRNNjFfMTA7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09GRE02MSwgdG1wKTsKKworCQl0bXAgPQorCQkgICAgYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9ESVZTUkNIR0FJTkJBQ0spOworCQl0bXAgPSAodG1wICYgMHhGRjAwKSB8IDB4MTU7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0RJVlNSQ0hHQUlOQkFDSywKKwkJCSAgICAgIHRtcCk7CisKKwkJaWYgKHBoeS0+cmV2ID09IDIpIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX0FESVZSRUxBVEVELAorCQkJCSAgICAgIDgpOworCQl9IGVsc2UgeworCQkJdG1wID0KKwkJCSAgICBiNDNfcGh5X3JlYWQoZGV2LAorCQkJCQkgQjQzX1BIWV9BRElWUkVMQVRFRCk7CisJCQl0bXAgPSAodG1wICYgMHhGRjAwKSB8IDg7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9BRElWUkVMQVRFRCwKKwkJCQkgICAgICB0bXApOworCQl9CisJfQorCWlmIChwaHktPnJldiA+PSA2KQorCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PRkRNOUIsIDB4REMpOworCisJaGYgfD0gQjQzX0hGX0FOVERJVkhFTFA7CisJYjQzX2hmX3dyaXRlKGRldiwgaGYpOworfQorCitzdGF0aWMgaW50IGI0M19ncGh5X29wX2ludGVyZl9taXRpZ2F0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkJIGVudW0gYjQzX2ludGVyZmVyZW5jZV9taXRpZ2F0aW9uIG1vZGUpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gcGh5LT5nOworCWludCBjdXJyZW50bW9kZTsKKworCUI0M19XQVJOX09OKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKTsKKwlpZiAoKHBoeS0+cmV2ID09IDApIHx8ICghcGh5LT5nbW9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZ3BoeS0+YWNpX3dsYW5fYXV0b21hdGljID0gMDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEI0M19JTlRFUkZNT0RFX0FVVE9XTEFOOgorCQlncGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSAxOworCQlpZiAoZ3BoeS0+YWNpX2VuYWJsZSkKKwkJCW1vZGUgPSBCNDNfSU5URVJGTU9ERV9NQU5VQUxXTEFOOworCQllbHNlCisJCQltb2RlID0gQjQzX0lOVEVSRk1PREVfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBCNDNfSU5URVJGTU9ERV9OT05FOgorCWNhc2UgQjQzX0lOVEVSRk1PREVfTk9OV0xBTjoKKwljYXNlIEI0M19JTlRFUkZNT0RFX01BTlVBTFdMQU46CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cnJlbnRtb2RlID0gZ3BoeS0+aW50ZXJmbW9kZTsKKwlpZiAoY3VycmVudG1vZGUgPT0gbW9kZSkKKwkJcmV0dXJuIDA7CisJaWYgKGN1cnJlbnRtb2RlICE9IEI0M19JTlRFUkZNT0RFX05PTkUpCisJCWI0M19yYWRpb19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbl9kaXNhYmxlKGRldiwgY3VycmVudG1vZGUpOworCisJaWYgKG1vZGUgPT0gQjQzX0lOVEVSRk1PREVfTk9ORSkgeworCQlncGh5LT5hY2lfZW5hYmxlID0gMDsKKwkJZ3BoeS0+YWNpX2h3X3Jzc2kgPSAwOworCX0gZWxzZQorCQliNDNfcmFkaW9faW50ZXJmZXJlbmNlX21pdGlnYXRpb25fZW5hYmxlKGRldiwgbW9kZSk7CisJZ3BoeS0+aW50ZXJmbW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L0VzdGltYXRlUG93ZXJPdXQKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBUU1NJIHZhbHVlIHRvIGRCbSBpbiBRNS4yCisgKi8KK3N0YXRpYyBzOCBiNDNfZ3BoeV9lc3RpbWF0ZV9wb3dlcl9vdXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBzOCB0c3NpKQoreworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBkZXYtPnBoeS5nOworCXM4IGRibTsKKwlzMzIgdG1wOworCisJdG1wID0gKGdwaHktPnRndF9pZGxlX3Rzc2kgLSBncGh5LT5jdXJfaWRsZV90c3NpICsgdHNzaSk7CisJdG1wID0gY2xhbXBfdmFsKHRtcCwgMHgwMCwgMHgzRik7CisJZGJtID0gZ3BoeS0+dHNzaTJkYm1bdG1wXTsKKworCXJldHVybiBkYm07Cit9CisKK3N0YXRpYyB2b2lkIGI0M19wdXRfYXR0ZW51YXRpb25faW50b19yYW5nZXMoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkgICAgaW50ICpfYmJhdHQsIGludCAqX3JmYXR0KQoreworCWludCByZmF0dCA9ICpfcmZhdHQ7CisJaW50IGJiYXR0ID0gKl9iYmF0dDsKKwlzdHJ1Y3QgYjQzX3R4cG93ZXJfbG9fY29udHJvbCAqbG8gPSBkZXYtPnBoeS5nLT5sb19jb250cm9sOworCisJLyogR2V0IGJhc2ViYW5kIGFuZCByYWRpbyBhdHRlbnVhdGlvbiB2YWx1ZXMgaW50byB0aGVpciBwZXJtaXR0ZWQgcmFuZ2VzLgorCSAqIFJhZGlvIGF0dGVudWF0aW9uIGFmZmVjdHMgcG93ZXIgbGV2ZWwgNCB0aW1lcyBhcyBtdWNoIGFzIGJhc2ViYW5kLiAqLworCisJLyogUmFuZ2UgY29uc3RhbnRzICovCisJY29uc3QgaW50IHJmX21pbiA9IGxvLT5yZmF0dF9saXN0Lm1pbl92YWw7CisJY29uc3QgaW50IHJmX21heCA9IGxvLT5yZmF0dF9saXN0Lm1heF92YWw7CisJY29uc3QgaW50IGJiX21pbiA9IGxvLT5iYmF0dF9saXN0Lm1pbl92YWw7CisJY29uc3QgaW50IGJiX21heCA9IGxvLT5iYmF0dF9saXN0Lm1heF92YWw7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocmZhdHQgPiByZl9tYXggJiYgYmJhdHQgPiBiYl9tYXggLSA0KQorCQkJYnJlYWs7CS8qIENhbiBub3QgZ2V0IGl0IGludG8gcmFuZ2VzICovCisJCWlmIChyZmF0dCA8IHJmX21pbiAmJiBiYmF0dCA8IGJiX21pbiArIDQpCisJCQlicmVhazsJLyogQ2FuIG5vdCBnZXQgaXQgaW50byByYW5nZXMgKi8KKwkJaWYgKGJiYXR0ID4gYmJfbWF4ICYmIHJmYXR0ID4gcmZfbWF4IC0gMSkKKwkJCWJyZWFrOwkvKiBDYW4gbm90IGdldCBpdCBpbnRvIHJhbmdlcyAqLworCQlpZiAoYmJhdHQgPCBiYl9taW4gJiYgcmZhdHQgPCByZl9taW4gKyAxKQorCQkJYnJlYWs7CS8qIENhbiBub3QgZ2V0IGl0IGludG8gcmFuZ2VzICovCisKKwkJaWYgKGJiYXR0ID4gYmJfbWF4KSB7CisJCQliYmF0dCAtPSA0OworCQkJcmZhdHQgKz0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChiYmF0dCA8IGJiX21pbikgeworCQkJYmJhdHQgKz0gNDsKKwkJCXJmYXR0IC09IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmZhdHQgPiByZl9tYXgpIHsKKwkJCXJmYXR0IC09IDE7CisJCQliYmF0dCArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJmYXR0IDwgcmZfbWluKSB7CisJCQlyZmF0dCArPSAxOworCQkJYmJhdHQgLT0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCSpfcmZhdHQgPSBjbGFtcF92YWwocmZhdHQsIHJmX21pbiwgcmZfbWF4KTsKKwkqX2JiYXR0ID0gY2xhbXBfdmFsKGJiYXR0LCBiYl9taW4sIGJiX21heCk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ncGh5X29wX2FkanVzdF90eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBwaHktPmc7CisJaW50IHJmYXR0LCBiYmF0dDsKKwl1OCB0eF9jb250cm9sOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT53bC0+aXJxX2xvY2spOworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXcgYXR0ZW51YXRpb24gdmFsdWVzLiAqLworCWJiYXR0ID0gZ3BoeS0+YmJhdHQuYXR0OworCWJiYXR0ICs9IGdwaHktPmJiYXR0X2RlbHRhOworCXJmYXR0ID0gZ3BoeS0+cmZhdHQuYXR0OworCXJmYXR0ICs9IGdwaHktPnJmYXR0X2RlbHRhOworCisJYjQzX3B1dF9hdHRlbnVhdGlvbl9pbnRvX3JhbmdlcyhkZXYsICZiYmF0dCwgJnJmYXR0KTsKKwl0eF9jb250cm9sID0gZ3BoeS0+dHhfY29udHJvbDsKKwlpZiAoKHBoeS0+cmFkaW9fdmVyID09IDB4MjA1MCkgJiYgKHBoeS0+cmFkaW9fcmV2ID09IDIpKSB7CisJCWlmIChyZmF0dCA8PSAxKSB7CisJCQlpZiAodHhfY29udHJvbCA9PSAwKSB7CisJCQkJdHhfY29udHJvbCA9CisJCQkJICAgIEI0M19UWENUTF9QQTJEQiB8CisJCQkJICAgIEI0M19UWENUTF9UWE1JWDsKKwkJCQlyZmF0dCArPSAyOworCQkJCWJiYXR0ICs9IDI7CisJCQl9IGVsc2UgaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLgorCQkJCSAgIGJvYXJkZmxhZ3NfbG8gJgorCQkJCSAgIEI0M19CRkxfUEFDVFJMKSB7CisJCQkJYmJhdHQgKz0gNCAqIChyZmF0dCAtIDIpOworCQkJCXJmYXR0ID0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmIChyZmF0dCA+IDQgJiYgdHhfY29udHJvbCkgeworCQkJdHhfY29udHJvbCA9IDA7CisJCQlpZiAoYmJhdHQgPCAzKSB7CisJCQkJcmZhdHQgLT0gMzsKKwkJCQliYmF0dCArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlyZmF0dCAtPSAyOworCQkJCWJiYXR0IC09IDI7CisJCQl9CisJCX0KKwl9CisJLyogU2F2ZSB0aGUgY29udHJvbCB2YWx1ZXMgKi8KKwlncGh5LT50eF9jb250cm9sID0gdHhfY29udHJvbDsKKwliNDNfcHV0X2F0dGVudWF0aW9uX2ludG9fcmFuZ2VzKGRldiwgJmJiYXR0LCAmcmZhdHQpOworCWdwaHktPnJmYXR0LmF0dCA9IHJmYXR0OworCWdwaHktPmJiYXR0LmF0dCA9IGJiYXR0OworCisJLyogV2UgZHJvcCB0aGUgbG9jayBlYXJseSwgc28gd2UgY2FuIHNsZWVwIGR1cmluZyBoYXJkd2FyZQorCSAqIGFkanVzdG1lbnQuIFBvc3NpYmxlIHJhY2VzIHdpdGggb3BfcmVjYWxjX3R4cG93ZXIgYXJlIGhhcm1sZXNzLAorCSAqIGFzIHdlIHdpbGwgYmUgY2FsbGVkIG9uY2UgYWdhaW4gaW4gY2FzZSB3ZSByYWNlZC4gKi8KKwlzcGluX3VubG9ja19pcnEoJmRldi0+d2wtPmlycV9sb2NrKTsKKworCWlmIChiNDNfZGVidWcoZGV2LCBCNDNfREJHX1hNSVRQT1dFUikpCisJCWI0M2RiZyhkZXYtPndsLCAiQWRqdXN0aW5nIFRYIHBvd2VyXG4iKTsKKworCS8qIEFkanVzdCB0aGUgaGFyZHdhcmUgKi8KKwliNDNfcGh5X2xvY2soZGV2KTsKKwliNDNfcmFkaW9fbG9jayhkZXYpOworCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJmdwaHktPmJiYXR0LCAmZ3BoeS0+cmZhdHQsCisJCQkgIGdwaHktPnR4X2NvbnRyb2wpOworCWI0M19yYWRpb191bmxvY2soZGV2KTsKKwliNDNfcGh5X3VubG9jayhkZXYpOworfQorCitzdGF0aWMgZW51bSBiNDNfdHhwd3JfcmVzdWx0IGI0M19ncGh5X29wX3JlY2FsY190eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkJCQlib29sIGlnbm9yZV90c3NpKQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKwl1bnNpZ25lZCBpbnQgYXZlcmFnZV90c3NpOworCWludCBjY2tfcmVzdWx0LCBvZmRtX3Jlc3VsdDsKKwlpbnQgZXN0aW1hdGVkX3B3ciwgZGVzaXJlZF9wd3IsIHB3cl9hZGp1c3Q7CisJaW50IHJmYXR0X2RlbHRhLCBiYmF0dF9kZWx0YTsKKwl1bnNpZ25lZCBpbnQgbWF4X3B3cjsKKworCS8qIEZpcnN0IGdldCB0aGUgYXZlcmFnZSBUU1NJICovCisJY2NrX3Jlc3VsdCA9IGI0M19waHlfc2htX3Rzc2lfcmVhZChkZXYsIEI0M19TSE1fU0hfVFNTSV9DQ0spOworCW9mZG1fcmVzdWx0ID0gYjQzX3BoeV9zaG1fdHNzaV9yZWFkKGRldiwgQjQzX1NITV9TSF9UU1NJX09GRE1fRyk7CisJaWYgKChjY2tfcmVzdWx0IDwgMCkgJiYgKG9mZG1fcmVzdWx0IDwgMCkpIHsKKwkJLyogTm8gVFNTSSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgKi8KKwkJaWYgKCFpZ25vcmVfdHNzaSkKKwkJCWdvdG8gbm9fYWRqdXN0bWVudF9uZWVkZWQ7CisJCWNja19yZXN1bHQgPSAwOworCQlvZmRtX3Jlc3VsdCA9IDA7CisJfQorCWlmIChjY2tfcmVzdWx0IDwgMCkKKwkJYXZlcmFnZV90c3NpID0gb2ZkbV9yZXN1bHQ7CisJZWxzZSBpZiAob2ZkbV9yZXN1bHQgPCAwKQorCQlhdmVyYWdlX3Rzc2kgPSBjY2tfcmVzdWx0OworCWVsc2UKKwkJYXZlcmFnZV90c3NpID0gKGNja19yZXN1bHQgKyBvZmRtX3Jlc3VsdCkgLyAyOworCS8qIE1lcmdlIHRoZSBhdmVyYWdlIHdpdGggdGhlIHN0b3JlZCB2YWx1ZS4gKi8KKwlpZiAobGlrZWx5KGdwaHktPmF2ZXJhZ2VfdHNzaSAhPSAweEZGKSkKKwkJYXZlcmFnZV90c3NpID0gKGF2ZXJhZ2VfdHNzaSArIGdwaHktPmF2ZXJhZ2VfdHNzaSkgLyAyOworCWdwaHktPmF2ZXJhZ2VfdHNzaSA9IGF2ZXJhZ2VfdHNzaTsKKwlCNDNfV0FSTl9PTihhdmVyYWdlX3Rzc2kgPj0gQjQzX1RTU0lfTUFYKTsKKworCS8qIEVzdGltYXRlIHRoZSBUWCBwb3dlciBlbWlzc2lvbiBiYXNlZCBvbiB0aGUgVFNTSSAqLworCWVzdGltYXRlZF9wd3IgPSBiNDNfZ3BoeV9lc3RpbWF0ZV9wb3dlcl9vdXQoZGV2LCBhdmVyYWdlX3Rzc2kpOworCisJQjQzX1dBUk5fT04ocGh5LT50eXBlICE9IEI0M19QSFlUWVBFX0cpOworCW1heF9wd3IgPSBkZXYtPmRldi0+YnVzLT5zcHJvbS5tYXhwd3JfYmc7CisJaWYgKGRldi0+ZGV2LT5idXMtPnNwcm9tLmJvYXJkZmxhZ3NfbG8gJiBCNDNfQkZMX1BBQ1RSTCkKKwkJbWF4X3B3ciAtPSAzOyAvKiBtaW51cyAwLjc1ICovCisJaWYgKHVubGlrZWx5KG1heF9wd3IgPj0gSU5UX1RPX1E1MigzMC8qZEJtKi8pKSkgeworCQliNDN3YXJuKGRldi0+d2wsCisJCQkiSW52YWxpZCBtYXgtVFgtcG93ZXIgdmFsdWUgaW4gU1BST00uXG4iKTsKKwkJbWF4X3B3ciA9IElOVF9UT19RNTIoMjApOyAvKiBmYWtlIGl0ICovCisJCWRldi0+ZGV2LT5idXMtPnNwcm9tLm1heHB3cl9iZyA9IG1heF9wd3I7CisJfQorCisJLyogR2V0IGRlc2lyZWQgcG93ZXIgKGluIFE1LjIpICovCisJaWYgKHBoeS0+ZGVzaXJlZF90eHBvd2VyIDwgMCkKKwkJZGVzaXJlZF9wd3IgPSBJTlRfVE9fUTUyKDApOworCWVsc2UKKwkJZGVzaXJlZF9wd3IgPSBJTlRfVE9fUTUyKHBoeS0+ZGVzaXJlZF90eHBvd2VyKTsKKwkvKiBBbmQgbGltaXQgaXQuIG1heF9wd3IgYWxyZWFkeSBpcyBRNS4yICovCisJZGVzaXJlZF9wd3IgPSBjbGFtcF92YWwoZGVzaXJlZF9wd3IsIDAsIG1heF9wd3IpOworCWlmIChiNDNfZGVidWcoZGV2LCBCNDNfREJHX1hNSVRQT1dFUikpIHsKKwkJYjQzZGJnKGRldi0+d2wsCisJCSAgICAgICAiW1RYIHBvd2VyXSAgY3VycmVudCA9ICIgUTUyX0ZNVAorCQkgICAgICAgIiBkQm0sICBkZXNpcmVkID0gIiBRNTJfRk1UCisJCSAgICAgICAiIGRCbSwgIG1heCA9ICIgUTUyX0ZNVCAiXG4iLAorCQkgICAgICAgUTUyX0FSRyhlc3RpbWF0ZWRfcHdyKSwKKwkJICAgICAgIFE1Ml9BUkcoZGVzaXJlZF9wd3IpLAorCQkgICAgICAgUTUyX0FSRyhtYXhfcHdyKSk7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBhZGp1c3RtZW50IGRlbHRhLiAqLworCXB3cl9hZGp1c3QgPSBkZXNpcmVkX3B3ciAtIGVzdGltYXRlZF9wd3I7CisJaWYgKHB3cl9hZGp1c3QgPT0gMCkKKwkJZ290byBub19hZGp1c3RtZW50X25lZWRlZDsKKworCS8qIFJGIGF0dGVudWF0aW9uIGRlbHRhLiAqLworCXJmYXR0X2RlbHRhID0gKChwd3JfYWRqdXN0ICsgNykgLyA4KTsKKwkvKiBMb3dlciBhdHRlbnVhdGlvbiA9PiBCaWdnZXIgcG93ZXIgb3V0cHV0LiBOZWdhdGUgaXQuICovCisJcmZhdHRfZGVsdGEgPSAtcmZhdHRfZGVsdGE7CisKKwkvKiBCYXNlYmFuZCBhdHRlbnVhdGlvbiBkZWx0YS4gKi8KKwliYmF0dF9kZWx0YSA9IHB3cl9hZGp1c3QgLyAyOworCS8qIExvd2VyIGF0dGVudWF0aW9uID0+IEJpZ2dlciBwb3dlciBvdXRwdXQuIE5lZ2F0ZSBpdC4gKi8KKwliYmF0dF9kZWx0YSA9IC1iYmF0dF9kZWx0YTsKKwkvKiBSRiBhdHQgYWZmZWN0cyBwb3dlciBsZXZlbCA0IHRpbWVzIGFzIG11Y2ggYXMKKwkgKiBCYXNlYmFuZCBhdHRlbm51YXRpb24uIFN1YnRyYWN0IGl0LiAqLworCWJiYXR0X2RlbHRhIC09IDQgKiByZmF0dF9kZWx0YTsKKworCWlmIChiNDNfZGVidWcoZGV2LCBCNDNfREJHX1hNSVRQT1dFUikpIHsKKwkJaW50IGRibSA9IHB3cl9hZGp1c3QgPCAwID8gLXB3cl9hZGp1c3QgOiBwd3JfYWRqdXN0OworCQliNDNkYmcoZGV2LT53bCwKKwkJICAgICAgICJbVFggcG93ZXIgZGVsdGFzXSAgJXMiIFE1Ml9GTVQgIiBkQm0gICA9PiAgICIKKwkJICAgICAgICJiYmF0dC1kZWx0YSA9ICVkLCAgcmZhdHQtZGVsdGEgPSAlZFxuIiwKKwkJICAgICAgIChwd3JfYWRqdXN0IDwgMCA/ICItIiA6ICIiKSwgUTUyX0FSRyhkYm0pLAorCQkgICAgICAgYmJhdHRfZGVsdGEsIHJmYXR0X2RlbHRhKTsKKwl9CisJLyogU28gZG8gd2UgZmluYWxseSBuZWVkIHRvIGFkanVzdCBzb21ldGhpbmcgaW4gaGFyZHdhcmU/ICovCisJaWYgKChyZmF0dF9kZWx0YSA9PSAwKSAmJiAoYmJhdHRfZGVsdGEgPT0gMCkpCisJCWdvdG8gbm9fYWRqdXN0bWVudF9uZWVkZWQ7CisKKwkvKiBTYXZlIHRoZSBkZWx0YXMgZm9yIGxhdGVyIHdoZW4gd2UgYWRqdXN0IHRoZSBwb3dlci4gKi8KKwlncGh5LT5iYmF0dF9kZWx0YSA9IGJiYXR0X2RlbHRhOworCWdwaHktPnJmYXR0X2RlbHRhID0gcmZhdHRfZGVsdGE7CisKKwkvKiBXZSBuZWVkIHRvIGFkanVzdCB0aGUgVFggcG93ZXIgb24gdGhlIGRldmljZS4gKi8KKwlyZXR1cm4gQjQzX1RYUFdSX1JFU19ORUVEX0FESlVTVDsKKworbm9fYWRqdXN0bWVudF9uZWVkZWQ6CisJcmV0dXJuIEI0M19UWFBXUl9SRVNfRE9ORTsKK30KKworc3RhdGljIHZvaWQgYjQzX2dwaHlfb3BfcHdvcmtfMTVzZWMoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKKworCS8vVE9ETzogdXBkYXRlX2FjaV9tb3ZpbmdfYXZlcmFnZQorCWlmIChncGh5LT5hY2lfZW5hYmxlICYmIGdwaHktPmFjaV93bGFuX2F1dG9tYXRpYykgeworCQliNDNfbWFjX3N1c3BlbmQoZGV2KTsKKwkJaWYgKCFncGh5LT5hY2lfZW5hYmxlICYmIDEgLypUT0RPOiBub3Qgc2Nhbm5pbmc/ICovICkgeworCQkJaWYgKDAgLypUT0RPOiBidW5jaCBvZiBjb25kaXRpb25zICovICkgeworCQkJCXBoeS0+b3BzLT5pbnRlcmZfbWl0aWdhdGlvbihkZXYsCisJCQkJCUI0M19JTlRFUkZNT0RFX01BTlVBTFdMQU4pOworCQkJfQorCQl9IGVsc2UgaWYgKDAgLypUT0RPKi8pIHsKKwkJCSAgIGlmICgvKihhY2lfYXZlcmFnZSA+IDEwMDApICYmKi8gIWI0M19ncGh5X2FjaV9zY2FuKGRldikpCisJCQkJcGh5LT5vcHMtPmludGVyZl9taXRpZ2F0aW9uKGRldiwgQjQzX0lOVEVSRk1PREVfTk9ORSk7CisJCX0KKwkJYjQzX21hY19lbmFibGUoZGV2KTsKKwl9IGVsc2UgaWYgKGdwaHktPmludGVyZm1vZGUgPT0gQjQzX0lOVEVSRk1PREVfTk9OV0xBTiAmJgorCQkgICBwaHktPnJldiA9PSAxKSB7CisJCS8vVE9ETzogaW1wbGVtZW50IHJldjEgd29ya2Fyb3VuZAorCX0KKwliNDNfbG9fZ19tYWludGFuYW5jZV93b3JrKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ncGh5X29wX3B3b3JrXzYwc2VjKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJaWYgKCEoZGV2LT5kZXYtPmJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUlNTSSkpCisJCXJldHVybjsKKworCWI0M19tYWNfc3VzcGVuZChkZXYpOworCWI0M19jYWxjX25yc3NpX3Nsb3BlKGRldik7CisJaWYgKChwaHktPnJhZGlvX3ZlciA9PSAweDIwNTApICYmIChwaHktPnJhZGlvX3JldiA9PSA4KSkgeworCQl1OCBvbGRfY2hhbiA9IHBoeS0+Y2hhbm5lbDsKKworCQkvKiBWQ08gQ2FsaWJyYXRpb24gKi8KKwkJaWYgKG9sZF9jaGFuID49IDgpCisJCQliNDNfc3dpdGNoX2NoYW5uZWwoZGV2LCAxKTsKKwkJZWxzZQorCQkJYjQzX3N3aXRjaF9jaGFubmVsKGRldiwgMTMpOworCQliNDNfc3dpdGNoX2NoYW5uZWwoZGV2LCBvbGRfY2hhbik7CisJfQorCWI0M19tYWNfZW5hYmxlKGRldik7Cit9CisKK2NvbnN0IHN0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnMgYjQzX3BoeW9wc19nID0geworCS5hbGxvY2F0ZQkJPSBiNDNfZ3BoeV9vcF9hbGxvY2F0ZSwKKwkuZnJlZQkJCT0gYjQzX2dwaHlfb3BfZnJlZSwKKwkucHJlcGFyZV9zdHJ1Y3RzCT0gYjQzX2dwaHlfb3BfcHJlcGFyZV9zdHJ1Y3RzLAorCS5wcmVwYXJlX2hhcmR3YXJlCT0gYjQzX2dwaHlfb3BfcHJlcGFyZV9oYXJkd2FyZSwKKwkuaW5pdAkJCT0gYjQzX2dwaHlfb3BfaW5pdCwKKwkuZXhpdAkJCT0gYjQzX2dwaHlfb3BfZXhpdCwKKwkucGh5X3JlYWQJCT0gYjQzX2dwaHlfb3BfcmVhZCwKKwkucGh5X3dyaXRlCQk9IGI0M19ncGh5X29wX3dyaXRlLAorCS5yYWRpb19yZWFkCQk9IGI0M19ncGh5X29wX3JhZGlvX3JlYWQsCisJLnJhZGlvX3dyaXRlCQk9IGI0M19ncGh5X29wX3JhZGlvX3dyaXRlLAorCS5zdXBwb3J0c19od3BjdGwJPSBiNDNfZ3BoeV9vcF9zdXBwb3J0c19od3BjdGwsCisJLnNvZnR3YXJlX3Jma2lsbAk9IGI0M19ncGh5X29wX3NvZnR3YXJlX3Jma2lsbCwKKwkuc3dpdGNoX2FuYWxvZwkJPSBiNDNfcGh5b3Bfc3dpdGNoX2FuYWxvZ19nZW5lcmljLAorCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfZ3BoeV9vcF9zd2l0Y2hfY2hhbm5lbCwKKwkuZ2V0X2RlZmF1bHRfY2hhbgk9IGI0M19ncGh5X29wX2dldF9kZWZhdWx0X2NoYW4sCisJLnNldF9yeF9hbnRlbm5hCQk9IGI0M19ncGh5X29wX3NldF9yeF9hbnRlbm5hLAorCS5pbnRlcmZfbWl0aWdhdGlvbgk9IGI0M19ncGh5X29wX2ludGVyZl9taXRpZ2F0aW9uLAorCS5yZWNhbGNfdHhwb3dlcgkJPSBiNDNfZ3BoeV9vcF9yZWNhbGNfdHhwb3dlciwKKwkuYWRqdXN0X3R4cG93ZXIJCT0gYjQzX2dwaHlfb3BfYWRqdXN0X3R4cG93ZXIsCisJLnB3b3JrXzE1c2VjCQk9IGI0M19ncGh5X29wX3B3b3JrXzE1c2VjLAorCS5wd29ya182MHNlYwkJPSBiNDNfZ3BoeV9vcF9wd29ya182MHNlYywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxODk0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuaApAQCAtMCwwICsxLDIwOSBAQAorI2lmbmRlZiBMSU5VWF9CNDNfUEhZX0dfSF8KKyNkZWZpbmUgTElOVVhfQjQzX1BIWV9HX0hfCisKKy8qIE9GRE0gUEhZIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBpbiB0aGUgQS1QSFkgaGVhZGVyLiAqLworI2luY2x1ZGUgInBoeV9hLmgiCisKKy8qIENDSyAoQikgUEhZIFJlZ2lzdGVycyAqLworI2RlZmluZSBCNDNfUEhZX1ZFUlNJT05fQ0NLCQlCNDNfUEhZX0NDSygweDAwKQkvKiBWZXJzaW9uaW5nIHJlZ2lzdGVyIGZvciBCLVBIWSAqLworI2RlZmluZSBCNDNfUEhZX0NDS0JCQU5EQ0ZHCQlCNDNfUEhZX0NDSygweDAxKQkvKiBDb250YWlucyBhbnRlbm5hIDAvMSBjb250cm9sIGJpdCAqLworI2RlZmluZSBCNDNfUEhZX1BHQUNUTAkJCUI0M19QSFlfQ0NLKDB4MTUpCS8qIFBHQSBjb250cm9sICovCisjZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9MUEYJCTB4MTAwMAkvKiBMb3cgcGFzcyBmaWx0ZXIgKD8pICovCisjZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9MT1dCQU5EVwkweDAwNDAJLyogTG93IGJhbmR3aWR0aCBmbGFnICovCisjZGVmaW5lICBCNDNfUEhZX1BHQUNUTF9VTktOT1dOCQkweEVGQTAKKyNkZWZpbmUgQjQzX1BIWV9GQkNUTDEJCQlCNDNfUEhZX0NDSygweDE4KQkvKiBGcmVxdWVuY3kgYmFuZHdpZHRoIGNvbnRyb2wgMSAqLworI2RlZmluZSBCNDNfUEhZX0lUU1NJCQkJQjQzX1BIWV9DQ0soMHgyOSkJLyogSWRsZSBUU1NJICovCisjZGVmaW5lIEI0M19QSFlfTE9fTEVBS0FHRQkJQjQzX1BIWV9DQ0soMHgyRCkJLyogTWVhc3VyZWQgTE8gbGVha2FnZSAqLworI2RlZmluZSBCNDNfUEhZX0VORVJHWQkJCUI0M19QSFlfQ0NLKDB4MzMpCS8qIEVuZXJneSAqLworI2RlZmluZSBCNDNfUEhZX1NZTkNDVEwJCQlCNDNfUEhZX0NDSygweDM1KQorI2RlZmluZSBCNDNfUEhZX0ZCQ1RMMgkJCUI0M19QSFlfQ0NLKDB4MzgpCS8qIEZyZXF1ZW5jeSBiYW5kd2lkdGggY29udHJvbCAyICovCisjZGVmaW5lIEI0M19QSFlfREFDQ1RMCQkJQjQzX1BIWV9DQ0soMHg2MCkJLyogREFDIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX1BIWV9SQ0NBTE9WRVIJCUI0M19QSFlfQ0NLKDB4NzgpCS8qIFJDIGNhbGlicmF0aW9uIG92ZXJyaWRlICovCisKKy8qIEV4dGVuZGVkIEctUEhZIFJlZ2lzdGVycyAqLworI2RlZmluZSBCNDNfUEhZX0NMQVNTQ1RMCQlCNDNfUEhZX0VYVEcoMHgwMikJLyogQ2xhc3NpZnkgY29udHJvbCAqLworI2RlZmluZSBCNDNfUEhZX0dUQUJDVEwJCQlCNDNfUEhZX0VYVEcoMHgwMykJLyogRy1QSFkgdGFibGUgY29udHJvbCAoc2VlIGJlbG93KSAqLworI2RlZmluZSAgQjQzX1BIWV9HVEFCT0ZGCQkweDAzRkYJLyogRy1QSFkgdGFibGUgb2Zmc2V0IChzZWUgYmVsb3cpICovCisjZGVmaW5lICBCNDNfUEhZX0dUQUJOUgkJCTB4RkMwMAkvKiBHLVBIWSB0YWJsZSBudW1iZXIgKHNlZSBiZWxvdykgKi8KKyNkZWZpbmUgIEI0M19QSFlfR1RBQk5SX1NISUZUCQkxMAorI2RlZmluZSBCNDNfUEhZX0dUQUJEQVRBCQlCNDNfUEhZX0VYVEcoMHgwNCkJLyogRy1QSFkgdGFibGUgZGF0YSAqLworI2RlZmluZSBCNDNfUEhZX0xPX01BU0sJCQlCNDNfUEhZX0VYVEcoMHgwRikJLyogTG9jYWwgT3NjaWxsYXRvciBjb250cm9sIG1hc2sgKi8KKyNkZWZpbmUgQjQzX1BIWV9MT19DVEwJCQlCNDNfUEhZX0VYVEcoMHgxMCkJLyogTG9jYWwgT3NjaWxsYXRvciBjb250cm9sICovCisjZGVmaW5lIEI0M19QSFlfUkZPVkVSCQkJQjQzX1BIWV9FWFRHKDB4MTEpCS8qIFJGIG92ZXJyaWRlICovCisjZGVmaW5lIEI0M19QSFlfUkZPVkVSVkFMCQlCNDNfUEhZX0VYVEcoMHgxMikJLyogUkYgb3ZlcnJpZGUgdmFsdWUgKi8KKyNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0VYVExOQQkweDgwMDAKKyNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0xOQQkJMHg3MDAwCisjZGVmaW5lICBCNDNfUEhZX1JGT1ZFUlZBTF9MTkFfU0hJRlQJMTIKKyNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX1BHQQkJMHgwRjAwCisjZGVmaW5lICBCNDNfUEhZX1JGT1ZFUlZBTF9QR0FfU0hJRlQJOAorI2RlZmluZSAgQjQzX1BIWV9SRk9WRVJWQUxfVU5LCQkweDAwMTAJLyogVW5rbm93biwgYWx3YXlzIHNldC4gKi8KKyNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX1RSU1dSWAkweDAwRTAKKyNkZWZpbmUgIEI0M19QSFlfUkZPVkVSVkFMX0JXCQkweDAwMDMJLyogQmFuZHdpZHRoIGZsYWdzICovCisjZGVmaW5lICAgQjQzX1BIWV9SRk9WRVJWQUxfQldfTFBGCTB4MDAwMQkvKiBMb3cgUGFzcyBGaWx0ZXIgKi8KKyNkZWZpbmUgICBCNDNfUEhZX1JGT1ZFUlZBTF9CV19MQlcJMHgwMDAyCS8qIExvdyBCYW5kd2lkdGggKHdoZW4gc2V0KSwgaGlnaCB3aGVuIHVuc2V0ICovCisjZGVmaW5lIEI0M19QSFlfQU5BTE9HT1ZFUgkJQjQzX1BIWV9FWFRHKDB4MTQpCS8qIEFuYWxvZyBvdmVycmlkZSAqLworI2RlZmluZSBCNDNfUEhZX0FOQUxPR09WRVJWQUwJCUI0M19QSFlfRVhURygweDE1KQkvKiBBbmFsb2cgb3ZlcnJpZGUgdmFsdWUgKi8KKworCisvKioqIEctUEhZIHRhYmxlIG51bWJlcnMgKi8KKyNkZWZpbmUgQjQzX0dUQUIobnVtYmVyLCBvZmZzZXQpCSgoKG51bWJlcikgPDwgQjQzX1BIWV9HVEFCTlJfU0hJRlQpIHwgKG9mZnNldCkpCisjZGVmaW5lIEI0M19HVEFCX05SU1NJCQkJQjQzX0dUQUIoMHgwMCwgMCkKKyNkZWZpbmUgQjQzX0dUQUJfVFJGRU1XCQkJQjQzX0dUQUIoMHgwQywgMHgxMjApCisjZGVmaW5lIEI0M19HVEFCX09SSUdUUgkJCUI0M19HVEFCKDB4MkUsIDB4Mjk4KQorCit1MTYgYjQzX2d0YWJfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB0YWJsZSwgdTE2IG9mZnNldCk7Cit2b2lkIGI0M19ndGFiX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0LCB1MTYgdmFsdWUpOworCisKKy8qIFJldHVybnMgdGhlIGJvb2xlYW4gd2hldGhlciAiVFggTWFnbmlmaWNhdGlvbiIgaXMgZW5hYmxlZC4gKi8KKyNkZWZpbmUgaGFzX3R4X21hZ25pZmljYXRpb24ocGh5KSBcCisJKCgocGh5KS0+cmV2ID49IDIpICYmCQkJXAorCSAoKHBoeSktPnJhZGlvX3ZlciA9PSAweDIwNTApICYmCVwKKwkgKChwaHkpLT5yYWRpb19yZXYgPT0gOCkpCisvKiBDYXJkIHVzZXMgdGhlIGxvb3BiYWNrIGdhaW4gc3R1ZmYgKi8KKyNkZWZpbmUgaGFzX2xvb3BiYWNrX2dhaW4ocGh5KSBcCisJKCgocGh5KS0+cmV2ID4gMSkgfHwgKChwaHkpLT5nbW9kZSkpCisKKy8qIFJhZGlvIEF0dGVudWF0aW9uIChSRiBBdHRlbnVhdGlvbikgKi8KK3N0cnVjdCBiNDNfcmZhdHQgeworCXU4IGF0dDsJCQkvKiBBdHRlbnVhdGlvbiB2YWx1ZSAqLworCWJvb2wgd2l0aF9wYWRtaXg7CS8qIEZsYWcsIFBBRCBNaXhlciBlbmFibGVkLiAqLworfTsKK3N0cnVjdCBiNDNfcmZhdHRfbGlzdCB7CisJLyogQXR0ZW51YXRpb24gdmFsdWVzIGxpc3QgKi8KKwljb25zdCBzdHJ1Y3QgYjQzX3JmYXR0ICpsaXN0OworCXU4IGxlbjsKKwkvKiBNaW5pbXVtL01heGltdW0gYXR0ZW51YXRpb24gdmFsdWVzICovCisJdTggbWluX3ZhbDsKKwl1OCBtYXhfdmFsOworfTsKKworLyogUmV0dXJucyB0cnVlLCBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBiNDNfY29tcGFyZV9yZmF0dChjb25zdCBzdHJ1Y3QgYjQzX3JmYXR0ICphLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqYikKK3sKKwlyZXR1cm4gKChhLT5hdHQgPT0gYi0+YXR0KSAmJgorCQkoYS0+d2l0aF9wYWRtaXggPT0gYi0+d2l0aF9wYWRtaXgpKTsKK30KKworLyogQmFzZWJhbmQgQXR0ZW51YXRpb24gKi8KK3N0cnVjdCBiNDNfYmJhdHQgeworCXU4IGF0dDsJCQkvKiBBdHRlbnVhdGlvbiB2YWx1ZSAqLworfTsKK3N0cnVjdCBiNDNfYmJhdHRfbGlzdCB7CisJLyogQXR0ZW51YXRpb24gdmFsdWVzIGxpc3QgKi8KKwljb25zdCBzdHJ1Y3QgYjQzX2JiYXR0ICpsaXN0OworCXU4IGxlbjsKKwkvKiBNaW5pbXVtL01heGltdW0gYXR0ZW51YXRpb24gdmFsdWVzICovCisJdTggbWluX3ZhbDsKKwl1OCBtYXhfdmFsOworfTsKKworLyogUmV0dXJucyB0cnVlLCBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBiNDNfY29tcGFyZV9iYmF0dChjb25zdCBzdHJ1Y3QgYjQzX2JiYXR0ICphLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqYikKK3sKKwlyZXR1cm4gKGEtPmF0dCA9PSBiLT5hdHQpOworfQorCisvKiB0eF9jb250cm9sIGJpdHMuICovCisjZGVmaW5lIEI0M19UWENUTF9QQTNEQgkJMHg0MAkvKiBQQSBHYWluIDNkQiAqLworI2RlZmluZSBCNDNfVFhDVExfUEEyREIJCTB4MjAJLyogUEEgR2FpbiAyZEIgKi8KKyNkZWZpbmUgQjQzX1RYQ1RMX1RYTUlYCQkweDEwCS8qIFRYIE1peGVyIEdhaW4gKi8KKworc3RydWN0IGI0M190eHBvd2VyX2xvX2NvbnRyb2w7CisKK3N0cnVjdCBiNDNfcGh5X2cgeworCS8qIEFDSSAoYWRqYWNlbnQgY2hhbm5lbCBpbnRlcmZlcmVuY2UpIGZsYWdzLiAqLworCWJvb2wgYWNpX2VuYWJsZTsKKwlib29sIGFjaV93bGFuX2F1dG9tYXRpYzsKKwlib29sIGFjaV9od19yc3NpOworCisJLyogUmFkaW8gc3dpdGNoZWQgb24vb2ZmICovCisJYm9vbCByYWRpb19vbjsKKwlzdHJ1Y3QgeworCQkvKiBWYWx1ZXMgc2F2ZWQgd2hlbiB0dXJuaW5nIHRoZSByYWRpbyBvZmYuCisJCSAqIFRoZXkgYXJlIG5lZWRlZCB3aGVuIHR1cm5pbmcgaXQgb24gYWdhaW4uICovCisJCWJvb2wgdmFsaWQ7CisJCXUxNiByZm92ZXI7CisJCXUxNiByZm92ZXJ2YWw7CisJfSByYWRpb19vZmZfY29udGV4dDsKKworCXUxNiBtaW5sb3dzaWdbMl07CisJdTE2IG1pbmxvd3NpZ3Bvc1syXTsKKworCS8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIHVzZWQgdG8gY29udmVydCBhCisJICogVFNTSSB2YWx1ZSB0byBkQm0tUTUuMiAqLworCWNvbnN0IHM4ICp0c3NpMmRibTsKKwkvKiB0c3NpMmRibSBpcyBrbWFsbG9jKCllZC4gT25seSB1c2VkIGZvciBmcmVlKClpbmcuICovCisJYm9vbCBkeW5fdHNzaV90Ymw7CisJLyogVGFyZ2V0IGlkbGUgVFNTSSAqLworCWludCB0Z3RfaWRsZV90c3NpOworCS8qIEN1cnJlbnQgaWRsZSBUU1NJICovCisJaW50IGN1cl9pZGxlX3Rzc2k7CisJLyogVGhlIGN1cnJlbnQgYXZlcmFnZSBUU1NJLgorCSAqIE5lZWRzIGlycV9sb2NrLCBhcyBpdCdzIHVwZGF0ZWQgaW4gdGhlIElSUSBwYXRoLiAqLworCXU4IGF2ZXJhZ2VfdHNzaTsKKwkvKiBDdXJyZW50IFRYIHBvd2VyIGxldmVsIGF0dGVudWF0aW9uIGNvbnRyb2wgdmFsdWVzICovCisJc3RydWN0IGI0M19iYmF0dCBiYmF0dDsKKwlzdHJ1Y3QgYjQzX3JmYXR0IHJmYXR0OworCXU4IHR4X2NvbnRyb2w7CQkvKiBCNDNfVFhDVExfWFhYICovCisJLyogVGhlIGNhbGN1bGF0ZWQgYXR0ZW51YXRpb24gZGVsdGFzIHRoYXQgYXJlIHVzZWQgbGF0ZXIKKwkgKiB3aGVuIGFkanVzdGluZyB0aGUgYWN0dWFsIHBvd2VyIG91dHB1dC4gKi8KKwlpbnQgYmJhdHRfZGVsdGE7CisJaW50IHJmYXR0X2RlbHRhOworCisJLyogTG9jYWxPc2NpbGxhdG9yIGNvbnRyb2wgdmFsdWVzLiAqLworCXN0cnVjdCBiNDNfdHhwb3dlcl9sb19jb250cm9sICpsb19jb250cm9sOworCS8qIFZhbHVlcyBmcm9tIGI0M19jYWxjX2xvb3BiYWNrX2dhaW4oKSAqLworCXMxNiBtYXhfbGJfZ2FpbjsJLyogTWF4aW11bSBMb29wYmFjayBnYWluIGluIGhkQiAqLworCXMxNiB0cnN3X3J4X2dhaW47CS8qIFRSU1cgUlggZ2FpbiBpbiBoZEIgKi8KKwlzMTYgbG5hX2xvZF9nYWluOwkvKiBMTkEgbG9kICovCisJczE2IGxuYV9nYWluOwkJLyogTE5BICovCisJczE2IHBnYV9nYWluOwkJLyogUEdBICovCisKKwkvKiBDdXJyZW50IEludGVyZmVyZW5jZSBNaXRpZ2F0aW9uIG1vZGUgKi8KKwlpbnQgaW50ZXJmbW9kZTsKKwkvKiBTdGFjayBvZiBzYXZlZCB2YWx1ZXMgZnJvbSB0aGUgSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gY29kZS4KKwkgKiBFYWNoIHZhbHVlIGluIHRoZSBzdGFjayBpcyBsYXllZCBvdXQgYXMgZm9sbG93czoKKwkgKiBiaXQgMC0xMTogIG9mZnNldAorCSAqIGJpdCAxMi0xNTogcmVnaXN0ZXIgSUQKKwkgKiBiaXQgMTYtMzI6IHZhbHVlCisJICogcmVnaXN0ZXIgSUQgaXM6IDB4MSBQSFksIDB4MiBSYWRpbywgMHgzIElMVAorCSAqLworI2RlZmluZSBCNDNfSU5URVJGU1RBQ0tfU0laRQkyNgorCXUzMiBpbnRlcmZzdGFja1tCNDNfSU5URVJGU1RBQ0tfU0laRV07CS8vRklYTUU6IHVzZSBhIGRhdGEgc3RydWN0dXJlCisKKwkvKiBTYXZlZCB2YWx1ZXMgZnJvbSB0aGUgTlJTU0kgU2xvcGUgY2FsY3VsYXRpb24gKi8KKwlzMTYgbnJzc2lbMl07CisJczMyIG5yc3Npc2xvcGU7CisJLyogSW4gbWVtb3J5IG5yc3NpIGxvb2t1cCB0YWJsZS4gKi8KKwlzOCBucnNzaV9sdFs2NF07CisKKwl1MTYgbG9mY2FsOworCisJdTE2IGluaXR2YWw7CQkvL0ZJWE1FIHJlbmFtZT8KKworCS8qIFRoZSBkZXZpY2UgZG9lcyBhZGRyZXNzIGF1dG8gaW5jcmVtZW50IGZvciB0aGUgT0ZETSB0YWJsZXMuCisJICogV2UgY2FjaGUgdGhlIHByZXZpb3VzbHkgdXNlZCBhZGRyZXNzIGhlcmUgYW5kIG9taXQgdGhlIGFkZHJlc3MKKwkgKiB3cml0ZSBvbiB0aGUgbmV4dCB0YWJsZSBhY2Nlc3MsIGlmIHBvc3NpYmxlLiAqLworCXUxNiBvZmRtdGFiX2FkZHI7IC8qIFRoZSBhZGRyZXNzIGN1cnJlbnRseSBzZXQgaW4gaGFyZHdhcmUuICovCisJZW51bSB7IC8qIFRoZSBsYXN0IGRhdGEgZmxvdyBkaXJlY3Rpb24uICovCisJCUI0M19PRkRNVEFCX0RJUkVDVElPTl9VTktOT1dOID0gMCwKKwkJQjQzX09GRE1UQUJfRElSRUNUSU9OX1JFQUQsCisJCUI0M19PRkRNVEFCX0RJUkVDVElPTl9XUklURSwKKwl9IG9mZG10YWJfYWRkcl9kaXJlY3Rpb247Cit9OworCit2b2lkIGI0M19ncGh5X3NldF9iYXNlYmFuZF9hdHRlbnVhdGlvbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJICAgICAgIHUxNiBiYXNlYmFuZF9hdHRlbnVhdGlvbik7Cit2b2lkIGI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgIGJvb2wgc3ludGhldGljX3B1X3dvcmthcm91bmQpOwordTggKiBiNDNfZ2VuZXJhdGVfZHluX3Rzc2kyZGJtX3RhYihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJICAgczE2IHBhYjAsIHMxNiBwYWIxLCBzMTYgcGFiMik7CisKK3N0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyBiNDNfcGh5b3BzX2c7CisKKyNlbmRpZiAvKiBMSU5VWF9CNDNfUEhZX0dfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ5ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorCisgIEJyb2FkY29tIEI0MyB3aXJlbGVzcyBkcml2ZXIKKyAgSUVFRSA4MDIuMTFnIExQLVBIWSBkcml2ZXIKKworICBDb3B5cmlnaHQgKGMpIDIwMDggTWljaGFlbCBCdWVzY2ggPG1iQGJ1M3NjaC5kZT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdGVldCwgRmlmdGggRmxvb3IsCisgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiYjQzLmgiCisjaW5jbHVkZSAicGh5X2xwLmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorCisKK3N0YXRpYyBpbnQgYjQzX2xwcGh5X29wX2FsbG9jYXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHk7CisKKwlscHBoeSA9IGt6YWxsb2Moc2l6ZW9mKCpscHBoeSksIEdGUF9LRVJORUwpOworCWlmICghbHBwaHkpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+cGh5LmxwID0gbHBwaHk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX3ByZXBhcmVfc3RydWN0cyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBwaHktPmxwOworCisJbWVtc2V0KGxwcGh5LCAwLCBzaXplb2YoKmxwcGh5KSk7CisKKwkvL1RPRE8KK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX2ZyZWUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X2xwICpscHBoeSA9IGRldi0+cGh5LmxwOworCisJa2ZyZWUobHBwaHkpOworCWRldi0+cGh5LmxwID0gTlVMTDsKK30KKworc3RhdGljIGludCBiNDNfbHBwaHlfb3BfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJLy9UT0RPCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiBiNDNfbHBwaHlfb3BfcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX0NPTlRST0wsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfREFUQSwgdmFsdWUpOworfQorCitzdGF0aWMgdTE2IGI0M19scHBoeV9vcF9yYWRpb19yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZykKK3sKKwkvKiBSZWdpc3RlciAxIGlzIGEgMzItYml0IHJlZ2lzdGVyLiAqLworCUI0M19XQVJOX09OKHJlZyA9PSAxKTsKKwkvKiBMUC1QSFkgbmVlZHMgYSBzcGVjaWFsIGJpdCBzZXQgZm9yIHJlYWQgYWNjZXNzICovCisJaWYgKGRldi0+cGh5LnJldiA8IDIpIHsKKwkJaWYgKHJlZyAhPSAweDQwMDEpCisJCQlyZWcgfD0gMHgxMDA7CisJfSBlbHNlCisJCXJlZyB8PSAweDIwMDsKKworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fQ09OVFJPTCwgcmVnKTsKKwlyZXR1cm4gYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX1JBRElPX0RBVEFfTE9XKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX3JhZGlvX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCS8qIFJlZ2lzdGVyIDEgaXMgYSAzMi1iaXQgcmVnaXN0ZXIuICovCisJQjQzX1dBUk5fT04ocmVnID09IDEpOworCisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19SQURJT19DT05UUk9MLCByZWcpOworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fREFUQV9MT1csIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX3NvZnR3YXJlX3Jma2lsbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJCSBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwkvL1RPRE8KK30KKworc3RhdGljIGludCBiNDNfbHBwaHlfb3Bfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X2NoYW5uZWwpCit7CisJLy9UT0RPCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYjQzX2xwcGh5X29wX2dldF9kZWZhdWx0X2NoYW4oc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXJldHVybiAxOyAvKiBEZWZhdWx0IHRvIGNoYW5uZWwgMSAqLworfQorCitzdGF0aWMgdm9pZCBiNDNfbHBwaHlfb3Bfc2V0X3J4X2FudGVubmEoc3RydWN0IGI0M193bGRldiAqZGV2LCBpbnQgYW50ZW5uYSkKK3sKKwkvL1RPRE8KK30KKworc3RhdGljIHZvaWQgYjQzX2xwcGh5X29wX2FkanVzdF90eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwkvL1RPRE8KK30KKworc3RhdGljIGVudW0gYjQzX3R4cHdyX3Jlc3VsdCBiNDNfbHBwaHlfb3BfcmVjYWxjX3R4cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkJCSBib29sIGlnbm9yZV90c3NpKQoreworCS8vVE9ETworCXJldHVybiBCNDNfVFhQV1JfUkVTX0RPTkU7Cit9CisKKworY29uc3Qgc3RydWN0IGI0M19waHlfb3BlcmF0aW9ucyBiNDNfcGh5b3BzX2xwID0geworCS5hbGxvY2F0ZQkJPSBiNDNfbHBwaHlfb3BfYWxsb2NhdGUsCisJLmZyZWUJCQk9IGI0M19scHBoeV9vcF9mcmVlLAorCS5wcmVwYXJlX3N0cnVjdHMJPSBiNDNfbHBwaHlfb3BfcHJlcGFyZV9zdHJ1Y3RzLAorCS5pbml0CQkJPSBiNDNfbHBwaHlfb3BfaW5pdCwKKwkucGh5X3JlYWQJCT0gYjQzX2xwcGh5X29wX3JlYWQsCisJLnBoeV93cml0ZQkJPSBiNDNfbHBwaHlfb3Bfd3JpdGUsCisJLnJhZGlvX3JlYWQJCT0gYjQzX2xwcGh5X29wX3JhZGlvX3JlYWQsCisJLnJhZGlvX3dyaXRlCQk9IGI0M19scHBoeV9vcF9yYWRpb193cml0ZSwKKwkuc29mdHdhcmVfcmZraWxsCT0gYjQzX2xwcGh5X29wX3NvZnR3YXJlX3Jma2lsbCwKKwkuc3dpdGNoX2FuYWxvZwkJPSBiNDNfcGh5b3Bfc3dpdGNoX2FuYWxvZ19nZW5lcmljLAorCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfbHBwaHlfb3Bfc3dpdGNoX2NoYW5uZWwsCisJLmdldF9kZWZhdWx0X2NoYW4JPSBiNDNfbHBwaHlfb3BfZ2V0X2RlZmF1bHRfY2hhbiwKKwkuc2V0X3J4X2FudGVubmEJCT0gYjQzX2xwcGh5X29wX3NldF9yeF9hbnRlbm5hLAorCS5yZWNhbGNfdHhwb3dlcgkJPSBiNDNfbHBwaHlfb3BfcmVjYWxjX3R4cG93ZXIsCisJLmFkanVzdF90eHBvd2VyCQk9IGI0M19scHBoeV9vcF9hZGp1c3RfdHhwb3dlciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiNTM1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuaApAQCAtMCwwICsxLDU0MCBAQAorI2lmbmRlZiBMSU5VWF9CNDNfUEhZX0xQX0hfCisjZGVmaW5lIExJTlVYX0I0M19QSFlfTFBfSF8KKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMUC1QSFkgKi8KKworCisKKworI2RlZmluZSBCNDNfTFBfUkFESU8ocmFkaW9fcmVnKQkJCShyYWRpb19yZWcpCisjZGVmaW5lIEI0M19MUF9OT1JUSChyYWRpb19yZWcpCQkJQjQzX0xQX1JBRElPKHJhZGlvX3JlZykKKyNkZWZpbmUgQjQzX0xQX1NPVVRIKHJhZGlvX3JlZykJCQlCNDNfTFBfUkFESU8oKHJhZGlvX3JlZykgfCAweDQwMDApCisKKworLyoqKiBCcm9hZGNvbSAyMDYyIE5PUlRIIHJhZGlvIHJlZ2lzdGVycyAqKiovCisjZGVmaW5lIEIyMDYyX05fQ09NTTEJCQkJQjQzX0xQX05PUlRIKDB4MDAwKSAvKiBDb21tb24gMDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NPTU0yCQkJCUI0M19MUF9OT1JUSCgweDAwMikgLyogQ29tbW9uIDAyIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DT01NMwkJCQlCNDNfTFBfTk9SVEgoMHgwMDMpIC8qIENvbW1vbiAwMyAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ09NTTQJCQkJQjQzX0xQX05PUlRIKDB4MDA0KSAvKiBDb21tb24gMDQgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NPTU01CQkJCUI0M19MUF9OT1JUSCgweDAwNSkgLyogQ29tbW9uIDA1IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DT01NNgkJCQlCNDNfTFBfTk9SVEgoMHgwMDYpIC8qIENvbW1vbiAwNiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ09NTTcJCQkJQjQzX0xQX05PUlRIKDB4MDA3KSAvKiBDb21tb24gMDcgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NPTU04CQkJCUI0M19MUF9OT1JUSCgweDAwOCkgLyogQ29tbW9uIDA4IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DT01NOQkJCQlCNDNfTFBfTk9SVEgoMHgwMDkpIC8qIENvbW1vbiAwOSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ09NTTEwCQkJCUI0M19MUF9OT1JUSCgweDAwQSkgLyogQ29tbW9uIDEwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DT01NMTEJCQkJQjQzX0xQX05PUlRIKDB4MDBCKSAvKiBDb21tb24gMTEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NPTU0xMgkJCQlCNDNfTFBfTk9SVEgoMHgwMEMpIC8qIENvbW1vbiAxMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ09NTTEzCQkJCUI0M19MUF9OT1JUSCgweDAwRCkgLyogQ29tbW9uIDEzIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DT01NMTQJCQkJQjQzX0xQX05PUlRIKDB4MDBFKSAvKiBDb21tb24gMTQgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NPTU0xNQkJCQlCNDNfTFBfTk9SVEgoMHgwMEYpIC8qIENvbW1vbiAxNSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUEROX0NUTDAJCQlCNDNfTFBfTk9SVEgoMHgwMTApIC8qIFBETiBDb250cm9sIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1BETl9DVEwxCQkJQjQzX0xQX05PUlRIKDB4MDExKSAvKiBQRE4gQ29udHJvbCAxIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9QRE5fQ1RMMgkJCUI0M19MUF9OT1JUSCgweDAxMikgLyogUEROIENvbnRyb2wgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUEROX0NUTDMJCQlCNDNfTFBfTk9SVEgoMHgwMTMpIC8qIFBETiBDb250cm9sIDMgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1BETl9DVEw0CQkJQjQzX0xQX05PUlRIKDB4MDE0KSAvKiBQRE4gQ29udHJvbCA0IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9HRU5fQ1RMMAkJCUI0M19MUF9OT1JUSCgweDAxNSkgLyogR0VOIENvbnRyb2wgMCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fSVFfQ0FMSUIJCQlCNDNfTFBfTk9SVEgoMHgwMTYpIC8qIElRIENhbGlicmF0aW9uIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9MR0VOQwkJCQlCNDNfTFBfTk9SVEgoMHgwMTcpIC8qIExHRU5DIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9MR0VOQV9MUEYJCQlCNDNfTFBfTk9SVEgoMHgwMTgpIC8qIExHRU5BIExQRiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfQklBUzAJCQlCNDNfTFBfTk9SVEgoMHgwMTkpIC8qIExHRU5BIEJpYXMgMCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdORUFfQklBUzEJCQlCNDNfTFBfTk9SVEgoMHgwMUEpIC8qIExHTkVBIEJpYXMgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfQ1RMMAkJCUI0M19MUF9OT1JUSCgweDAxQikgLyogTEdFTkEgQ29udHJvbCAwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9MR0VOQV9DVEwxCQkJQjQzX0xQX05PUlRIKDB4MDFDKSAvKiBMR0VOQSBDb250cm9sIDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0xHRU5BX0NUTDIJCQlCNDNfTFBfTk9SVEgoMHgwMUQpIC8qIExHRU5BIENvbnRyb2wgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfVFVORTAJCQlCNDNfTFBfTk9SVEgoMHgwMUUpIC8qIExHRU5BIFR1bmUgMCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfVFVORTEJCQlCNDNfTFBfTk9SVEgoMHgwMUYpIC8qIExHRU5BIFR1bmUgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfVFVORTIJCQlCNDNfTFBfTk9SVEgoMHgwMjApIC8qIExHRU5BIFR1bmUgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfVFVORTMJCQlCNDNfTFBfTk9SVEgoMHgwMjEpIC8qIExHRU5BIFR1bmUgMyAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfQ1RMMwkJCUI0M19MUF9OT1JUSCgweDAyMikgLyogTEdFTkEgQ29udHJvbCAzIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9MR0VOQV9DVEw0CQkJQjQzX0xQX05PUlRIKDB4MDIzKSAvKiBMR0VOQSBDb250cm9sIDQgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0xHRU5BX0NUTDUJCQlCNDNfTFBfTk9SVEgoMHgwMjQpIC8qIExHRU5BIENvbnRyb2wgNSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fTEdFTkFfQ1RMNgkJCUI0M19MUF9OT1JUSCgweDAyNSkgLyogTEdFTkEgQ29udHJvbCA2IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9MR0VOQV9DVEw3CQkJQjQzX0xQX05PUlRIKDB4MDI2KSAvKiBMR0VOQSBDb250cm9sIDcgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQV9DVEwwCQkJQjQzX0xQX05PUlRIKDB4MDI3KSAvKiBSWEEgQ29udHJvbCAwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEFfQ1RMMQkJCUI0M19MUF9OT1JUSCgweDAyOCkgLyogUlhBIENvbnRyb2wgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhBX0NUTDIJCQlCNDNfTFBfTk9SVEgoMHgwMjkpIC8qIFJYQSBDb250cm9sIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQV9DVEwzCQkJQjQzX0xQX05PUlRIKDB4MDJBKSAvKiBSWEEgQ29udHJvbCAzIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEFfQ1RMNAkJCUI0M19MUF9OT1JUSCgweDAyQikgLyogUlhBIENvbnRyb2wgNCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhBX0NUTDUJCQlCNDNfTFBfTk9SVEgoMHgwMkMpIC8qIFJYQSBDb250cm9sIDUgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQV9DVEw2CQkJQjQzX0xQX05PUlRIKDB4MDJEKSAvKiBSWEEgQ29udHJvbCA2IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEFfQ1RMNwkJCUI0M19MUF9OT1JUSCgweDAyRSkgLyogUlhBIENvbnRyb2wgNyAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9DVEwwCQkJQjQzX0xQX05PUlRIKDB4MDJGKSAvKiBSWEJCIENvbnRyb2wgMCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9DVEwxCQkJQjQzX0xQX05PUlRIKDB4MDMwKSAvKiBSWEJCIENvbnRyb2wgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9DVEwyCQkJQjQzX0xQX05PUlRIKDB4MDMxKSAvKiBSWEJCIENvbnRyb2wgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9HQUlOMAkJCUI0M19MUF9OT1JUSCgweDAzMikgLyogUlhCQiBHYWluIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfR0FJTjEJCQlCNDNfTFBfTk9SVEgoMHgwMzMpIC8qIFJYQkIgR2FpbiAxIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX0dBSU4yCQkJQjQzX0xQX05PUlRIKDB4MDM0KSAvKiBSWEJCIEdhaW4gMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9HQUlOMwkJCUI0M19MUF9OT1JUSCgweDAzNSkgLyogUlhCQiBHYWluIDMgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfUlNTSTAJCQlCNDNfTFBfTk9SVEgoMHgwMzYpIC8qIFJYQkIgUlNTSSAwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX1JTU0kxCQkJQjQzX0xQX05PUlRIKDB4MDM3KSAvKiBSWEJCIFJTU0kgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9DQUxJQjAJCQlCNDNfTFBfTk9SVEgoMHgwMzgpIC8qIFJYQkIgQ2FsaWJyYXRpb24wIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX0NBTElCMQkJCUI0M19MUF9OT1JUSCgweDAzOSkgLyogUlhCQiBDYWxpYnJhdGlvbjEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfQ0FMSUIyCQkJQjQzX0xQX05PUlRIKDB4MDNBKSAvKiBSWEJCIENhbGlicmF0aW9uMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9CSUFTMAkJCUI0M19MUF9OT1JUSCgweDAzQikgLyogUlhCQiBCaWFzIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfQklBUzEJCQlCNDNfTFBfTk9SVEgoMHgwM0MpIC8qIFJYQkIgQmlhcyAxIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX0JJQVMyCQkJQjQzX0xQX05PUlRIKDB4MDNEKSAvKiBSWEJCIEJpYXMgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9CSUFTMwkJCUI0M19MUF9OT1JUSCgweDAzRSkgLyogUlhCQiBCaWFzIDMgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfQklBUzQJCQlCNDNfTFBfTk9SVEgoMHgwM0YpIC8qIFJYQkIgQmlhcyA0IChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX0JJQVM1CQkJQjQzX0xQX05PUlRIKDB4MDQwKSAvKiBSWEJCIEJpYXMgNSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9SU1NJMgkJCUI0M19MUF9OT1JUSCgweDA0MSkgLyogUlhCQiBSU1NJIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1JYQkJfUlNTSTMJCQlCNDNfTFBfTk9SVEgoMHgwNDIpIC8qIFJYQkIgUlNTSSAzIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9SWEJCX1JTU0k0CQkJQjQzX0xQX05PUlRIKDB4MDQzKSAvKiBSWEJCIFJTU0kgNCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUlhCQl9SU1NJNQkJCUI0M19MUF9OT1JUSCgweDA0NCkgLyogUlhCQiBSU1NJIDUgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDAJCQkJQjQzX0xQX05PUlRIKDB4MDQ1KSAvKiBUWCBDb250cm9sIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDEJCQkJQjQzX0xQX05PUlRIKDB4MDQ2KSAvKiBUWCBDb250cm9sIDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDIJCQkJQjQzX0xQX05PUlRIKDB4MDQ3KSAvKiBUWCBDb250cm9sIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDMJCQkJQjQzX0xQX05PUlRIKDB4MDQ4KSAvKiBUWCBDb250cm9sIDMgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDQJCQkJQjQzX0xQX05PUlRIKDB4MDQ5KSAvKiBUWCBDb250cm9sIDQgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDUJCQkJQjQzX0xQX05PUlRIKDB4MDRBKSAvKiBUWCBDb250cm9sIDUgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDYJCQkJQjQzX0xQX05PUlRIKDB4MDRCKSAvKiBUWCBDb250cm9sIDYgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDcJCQkJQjQzX0xQX05PUlRIKDB4MDRDKSAvKiBUWCBDb250cm9sIDcgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDgJCQkJQjQzX0xQX05PUlRIKDB4MDREKSAvKiBUWCBDb250cm9sIDggKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTDkJCQkJQjQzX0xQX05PUlRIKDB4MDRFKSAvKiBUWCBDb250cm9sIDkgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0NUTF9BCQkJQjQzX0xQX05PUlRIKDB4MDRGKSAvKiBUWCBDb250cm9sIEEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX0dDMkcJCQkJQjQzX0xQX05PUlRIKDB4MDUwKSAvKiBUWCBHQzJHIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9UWF9HQzVHCQkJCUI0M19MUF9OT1JUSCgweDA1MSkgLyogVFggR0M1RyAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fVFhfVFVORQkJCQlCNDNfTFBfTk9SVEgoMHgwNTIpIC8qIFRYIFR1bmUgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RYX1BBRAkJCQlCNDNfTFBfTk9SVEgoMHgwNTMpIC8qIFRYIFBBRCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fVFhfUEdBCQkJCUI0M19MUF9OT1JUSCgweDA1NCkgLyogVFggUEdBIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9UWF9QQURBVVgJCQlCNDNfTFBfTk9SVEgoMHgwNTUpIC8qIFRYIFBBREFVWCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fVFhfUEdBQVVYCQkJQjQzX0xQX05PUlRIKDB4MDU2KSAvKiBUWCBQR0FBVVggKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RTU0lfQ1RMMAkJCUI0M19MUF9OT1JUSCgweDA1NykgLyogVFNTSSBDb250cm9sIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RTU0lfQ1RMMQkJCUI0M19MUF9OT1JUSCgweDA1OCkgLyogVFNTSSBDb250cm9sIDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RTU0lfQ1RMMgkJCUI0M19MUF9OT1JUSCgweDA1OSkgLyogVFNTSSBDb250cm9sIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0lRX0NBTElCX0NUTDAJCQlCNDNfTFBfTk9SVEgoMHgwNUEpIC8qIElRIENhbGlicmF0aW9uIENvbnRyb2wgMCAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fSVFfQ0FMSUJfQ1RMMQkJCUI0M19MUF9OT1JUSCgweDA1QikgLyogSVEgQ2FsaWJyYXRpb24gQ29udHJvbCAxIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9JUV9DQUxJQl9DVEwyCQkJQjQzX0xQX05PUlRIKDB4MDVDKSAvKiBJUSBDYWxpYnJhdGlvbiBDb250cm9sIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX1RTCQkJQjQzX0xQX05PUlRIKDB4MDVEKSAvKiBDYWxpYnJhdGlvbiBUUyAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ0FMSUJfQ1RMMAkJCUI0M19MUF9OT1JUSCgweDA1RSkgLyogQ2FsaWJyYXRpb24gQ29udHJvbCAwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DQUxJQl9DVEwxCQkJQjQzX0xQX05PUlRIKDB4MDVGKSAvKiBDYWxpYnJhdGlvbiBDb250cm9sIDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX0NUTDIJCQlCNDNfTFBfTk9SVEgoMHgwNjApIC8qIENhbGlicmF0aW9uIENvbnRyb2wgMiAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fQ0FMSUJfQ1RMMwkJCUI0M19MUF9OT1JUSCgweDA2MSkgLyogQ2FsaWJyYXRpb24gQ29udHJvbCAzIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9DQUxJQl9DVEw0CQkJQjQzX0xQX05PUlRIKDB4MDYyKSAvKiBDYWxpYnJhdGlvbiBDb250cm9sIDQgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX0RCRzAJCQlCNDNfTFBfTk9SVEgoMHgwNjMpIC8qIENhbGlicmF0aW9uIERlYnVnIDAgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX0RCRzEJCQlCNDNfTFBfTk9SVEgoMHgwNjQpIC8qIENhbGlicmF0aW9uIERlYnVnIDEgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX0RCRzIJCQlCNDNfTFBfTk9SVEgoMHgwNjUpIC8qIENhbGlicmF0aW9uIERlYnVnIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX0NBTElCX0RCRzMJCQlCNDNfTFBfTk9SVEgoMHgwNjYpIC8qIENhbGlicmF0aW9uIERlYnVnIDMgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1BTRU5TRV9DVEwwCQkJQjQzX0xQX05PUlRIKDB4MDY5KSAvKiBQU0VOU0UgQ29udHJvbCAwIChub3J0aCkgKi8KKyNkZWZpbmUgQjIwNjJfTl9QU0VOU0VfQ1RMMQkJCUI0M19MUF9OT1JUSCgweDA2QSkgLyogUFNFTlNFIENvbnRyb2wgMSAobm9ydGgpICovCisjZGVmaW5lIEIyMDYyX05fUFNFTlNFX0NUTDIJCQlCNDNfTFBfTk9SVEgoMHgwNkIpIC8qIFBTRU5TRSBDb250cm9sIDIgKG5vcnRoKSAqLworI2RlZmluZSBCMjA2Ml9OX1RFU1RfQlVGMAkJCUI0M19MUF9OT1JUSCgweDA2QykgLyogVEVTVCBCVUYwIChub3J0aCkgKi8KKworLyoqKiBCcm9hZGNvbSAyMDYyIFNPVVRIIHJhZGlvIHJlZ2lzdGVycyAqKiovCisjZGVmaW5lIEIyMDYyX1NfQ09NTTEJCQkJQjQzX0xQX1NPVVRIKDB4MDAwKSAvKiBDb21tb24gMDEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JBRElPX0lEX0NPREUJCQlCNDNfTFBfU09VVEgoMHgwMDEpIC8qIFJhZGlvIElEIGNvZGUgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0NPTU0yCQkJCUI0M19MUF9TT1VUSCgweDAwMikgLyogQ29tbW9uIDAyIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19DT01NMwkJCQlCNDNfTFBfU09VVEgoMHgwMDMpIC8qIENvbW1vbiAwMyAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfQ09NTTQJCQkJQjQzX0xQX1NPVVRIKDB4MDA0KSAvKiBDb21tb24gMDQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0NPTU01CQkJCUI0M19MUF9TT1VUSCgweDAwNSkgLyogQ29tbW9uIDA1IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19DT01NNgkJCQlCNDNfTFBfU09VVEgoMHgwMDYpIC8qIENvbW1vbiAwNiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfQ09NTTcJCQkJQjQzX0xQX1NPVVRIKDB4MDA3KSAvKiBDb21tb24gMDcgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0NPTU04CQkJCUI0M19MUF9TT1VUSCgweDAwOCkgLyogQ29tbW9uIDA4IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19DT01NOQkJCQlCNDNfTFBfU09VVEgoMHgwMDkpIC8qIENvbW1vbiAwOSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfQ09NTTEwCQkJCUI0M19MUF9TT1VUSCgweDAwQSkgLyogQ29tbW9uIDEwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19DT01NMTEJCQkJQjQzX0xQX1NPVVRIKDB4MDBCKSAvKiBDb21tb24gMTEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0NPTU0xMgkJCQlCNDNfTFBfU09VVEgoMHgwMEMpIC8qIENvbW1vbiAxMiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfQ09NTTEzCQkJCUI0M19MUF9TT1VUSCgweDAwRCkgLyogQ29tbW9uIDEzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19DT01NMTQJCQkJQjQzX0xQX1NPVVRIKDB4MDBFKSAvKiBDb21tb24gMTQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0NPTU0xNQkJCQlCNDNfTFBfU09VVEgoMHgwMEYpIC8qIENvbW1vbiAxNSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUERTX0NUTDAJCQlCNDNfTFBfU09VVEgoMHgwMTApIC8qIFBEUyBDb250cm9sIDAgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1BEU19DVEwxCQkJQjQzX0xQX1NPVVRIKDB4MDExKSAvKiBQRFMgQ29udHJvbCAxIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19QRFNfQ1RMMgkJCUI0M19MUF9TT1VUSCgweDAxMikgLyogUERTIENvbnRyb2wgMiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUERTX0NUTDMJCQlCNDNfTFBfU09VVEgoMHgwMTMpIC8qIFBEUyBDb250cm9sIDMgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0JHX0NUTDAJCQkJQjQzX0xQX1NPVVRIKDB4MDE0KSAvKiBCRyBDb250cm9sIDAgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0JHX0NUTDEJCQkJQjQzX0xQX1NPVVRIKDB4MDE1KSAvKiBCRyBDb250cm9sIDEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0JHX0NUTDIJCQkJQjQzX0xQX1NPVVRIKDB4MDE2KSAvKiBCRyBDb250cm9sIDIgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDAJCQlCNDNfTFBfU09VVEgoMHgwMTcpIC8qIExHRU5HIENvbnRyb2wgMDAgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDEJCQlCNDNfTFBfU09VVEgoMHgwMTgpIC8qIExHRU5HIENvbnRyb2wgMDEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDIJCQlCNDNfTFBfU09VVEgoMHgwMTkpIC8qIExHRU5HIENvbnRyb2wgMDIgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDMJCQlCNDNfTFBfU09VVEgoMHgwMUEpIC8qIExHRU5HIENvbnRyb2wgMDMgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDQJCQlCNDNfTFBfU09VVEgoMHgwMUIpIC8qIExHRU5HIENvbnRyb2wgMDQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDUJCQlCNDNfTFBfU09VVEgoMHgwMUMpIC8qIExHRU5HIENvbnRyb2wgMDUgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDYJCQlCNDNfTFBfU09VVEgoMHgwMUQpIC8qIExHRU5HIENvbnRyb2wgMDYgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDcJCQlCNDNfTFBfU09VVEgoMHgwMUUpIC8qIExHRU5HIENvbnRyb2wgMDcgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDgJCQlCNDNfTFBfU09VVEgoMHgwMUYpIC8qIExHRU5HIENvbnRyb2wgMDggKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDkJCQlCNDNfTFBfU09VVEgoMHgwMjApIC8qIExHRU5HIENvbnRyb2wgMDkgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX0xHRU5HX0NUTDEwCQkJQjQzX0xQX1NPVVRIKDB4MDIxKSAvKiBMR0VORyBDb250cm9sIDEwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19MR0VOR19DVEwxMQkJCUI0M19MUF9TT1VUSCgweDAyMikgLyogTEdFTkcgQ29udHJvbCAxMSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkVGUExMX0NUTDAJCQlCNDNfTFBfU09VVEgoMHgwMjMpIC8qIFJFRlBMTCBDb250cm9sIDAwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMQkJCUI0M19MUF9TT1VUSCgweDAyNCkgLyogUkVGUExMIENvbnRyb2wgMDEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JFRlBMTF9DVEwyCQkJQjQzX0xQX1NPVVRIKDB4MDI1KSAvKiBSRUZQTEwgQ29udHJvbCAwMiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkVGUExMX0NUTDMJCQlCNDNfTFBfU09VVEgoMHgwMjYpIC8qIFJFRlBMTCBDb250cm9sIDAzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMNAkJCUI0M19MUF9TT1VUSCgweDAyNykgLyogUkVGUExMIENvbnRyb2wgMDQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JFRlBMTF9DVEw1CQkJQjQzX0xQX1NPVVRIKDB4MDI4KSAvKiBSRUZQTEwgQ29udHJvbCAwNSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkVGUExMX0NUTDYJCQlCNDNfTFBfU09VVEgoMHgwMjkpIC8qIFJFRlBMTCBDb250cm9sIDA2IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMNwkJCUI0M19MUF9TT1VUSCgweDAyQSkgLyogUkVGUExMIENvbnRyb2wgMDcgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JFRlBMTF9DVEw4CQkJQjQzX0xQX1NPVVRIKDB4MDJCKSAvKiBSRUZQTEwgQ29udHJvbCAwOCAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkVGUExMX0NUTDkJCQlCNDNfTFBfU09VVEgoMHgwMkMpIC8qIFJFRlBMTCBDb250cm9sIDA5IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTAJCQlCNDNfTFBfU09VVEgoMHgwMkQpIC8qIFJFRlBMTCBDb250cm9sIDEwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTEJCQlCNDNfTFBfU09VVEgoMHgwMkUpIC8qIFJFRlBMTCBDb250cm9sIDExIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTIJCQlCNDNfTFBfU09VVEgoMHgwMkYpIC8qIFJFRlBMTCBDb250cm9sIDEyIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTMJCQlCNDNfTFBfU09VVEgoMHgwMzApIC8qIFJFRlBMTCBDb250cm9sIDEzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTQJCQlCNDNfTFBfU09VVEgoMHgwMzEpIC8qIFJFRlBMTCBDb250cm9sIDE0IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTUJCQlCNDNfTFBfU09VVEgoMHgwMzIpIC8qIFJFRlBMTCBDb250cm9sIDE1IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRUZQTExfQ1RMMTYJCQlCNDNfTFBfU09VVEgoMHgwMzMpIC8qIFJFRlBMTCBDb250cm9sIDE2IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwwCQkJQjQzX0xQX1NPVVRIKDB4MDM0KSAvKiBSRlBMTCBDb250cm9sIDAwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwxCQkJQjQzX0xQX1NPVVRIKDB4MDM1KSAvKiBSRlBMTCBDb250cm9sIDAxIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwyCQkJQjQzX0xQX1NPVVRIKDB4MDM2KSAvKiBSRlBMTCBDb250cm9sIDAyIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwzCQkJQjQzX0xQX1NPVVRIKDB4MDM3KSAvKiBSRlBMTCBDb250cm9sIDAzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw0CQkJQjQzX0xQX1NPVVRIKDB4MDM4KSAvKiBSRlBMTCBDb250cm9sIDA0IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw1CQkJQjQzX0xQX1NPVVRIKDB4MDM5KSAvKiBSRlBMTCBDb250cm9sIDA1IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw2CQkJQjQzX0xQX1NPVVRIKDB4MDNBKSAvKiBSRlBMTCBDb250cm9sIDA2IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw3CQkJQjQzX0xQX1NPVVRIKDB4MDNCKSAvKiBSRlBMTCBDb250cm9sIDA3IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw4CQkJQjQzX0xQX1NPVVRIKDB4MDNDKSAvKiBSRlBMTCBDb250cm9sIDA4IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEw5CQkJQjQzX0xQX1NPVVRIKDB4MDNEKSAvKiBSRlBMTCBDb250cm9sIDA5IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwxMAkJCUI0M19MUF9TT1VUSCgweDAzRSkgLyogUkZQTEwgQ29udHJvbCAxMCAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMTEJCQlCNDNfTFBfU09VVEgoMHgwM0YpIC8qIFJGUExMIENvbnRyb2wgMTEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDEyCQkJQjQzX0xQX1NPVVRIKDB4MDQwKSAvKiBSRlBMTCBDb250cm9sIDEyIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwxMwkJCUI0M19MUF9TT1VUSCgweDA0MSkgLyogUkZQTEwgQ29udHJvbCAxMyAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMTQJCQlCNDNfTFBfU09VVEgoMHgwNDIpIC8qIFJGUExMIENvbnRyb2wgMTQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDE1CQkJQjQzX0xQX1NPVVRIKDB4MDQzKSAvKiBSRlBMTCBDb250cm9sIDE1IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwxNgkJCUI0M19MUF9TT1VUSCgweDA0NCkgLyogUkZQTEwgQ29udHJvbCAxNiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMTcJCQlCNDNfTFBfU09VVEgoMHgwNDUpIC8qIFJGUExMIENvbnRyb2wgMTcgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDE4CQkJQjQzX0xQX1NPVVRIKDB4MDQ2KSAvKiBSRlBMTCBDb250cm9sIDE4IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwxOQkJCUI0M19MUF9TT1VUSCgweDA0NykgLyogUkZQTEwgQ29udHJvbCAxOSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMjAJCQlCNDNfTFBfU09VVEgoMHgwNDgpIC8qIFJGUExMIENvbnRyb2wgMjAgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDIxCQkJQjQzX0xQX1NPVVRIKDB4MDQ5KSAvKiBSRlBMTCBDb250cm9sIDIxIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwyMgkJCUI0M19MUF9TT1VUSCgweDA0QSkgLyogUkZQTEwgQ29udHJvbCAyMiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMjMJCQlCNDNfTFBfU09VVEgoMHgwNEIpIC8qIFJGUExMIENvbnRyb2wgMjMgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDI0CQkJQjQzX0xQX1NPVVRIKDB4MDRDKSAvKiBSRlBMTCBDb250cm9sIDI0IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwyNQkJCUI0M19MUF9TT1VUSCgweDA0RCkgLyogUkZQTEwgQ29udHJvbCAyNSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMjYJCQlCNDNfTFBfU09VVEgoMHgwNEUpIC8qIFJGUExMIENvbnRyb2wgMjYgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDI3CQkJQjQzX0xQX1NPVVRIKDB4MDRGKSAvKiBSRlBMTCBDb250cm9sIDI3IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwyOAkJCUI0M19MUF9TT1VUSCgweDA1MCkgLyogUkZQTEwgQ29udHJvbCAyOCAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMjkJCQlCNDNfTFBfU09VVEgoMHgwNTEpIC8qIFJGUExMIENvbnRyb2wgMjkgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDMwCQkJQjQzX0xQX1NPVVRIKDB4MDUyKSAvKiBSRlBMTCBDb250cm9sIDMwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwzMQkJCUI0M19MUF9TT1VUSCgweDA1MykgLyogUkZQTEwgQ29udHJvbCAzMSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUkZQTExfQ1RMMzIJCQlCNDNfTFBfU09VVEgoMHgwNTQpIC8qIFJGUExMIENvbnRyb2wgMzIgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JGUExMX0NUTDMzCQkJQjQzX0xQX1NPVVRIKDB4MDU1KSAvKiBSRlBMTCBDb250cm9sIDMzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SRlBMTF9DVEwzNAkJCUI0M19MUF9TT1VUSCgweDA1NikgLyogUkZQTEwgQ29udHJvbCAzNCAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUlhHX0NOVDAJCQlCNDNfTFBfU09VVEgoMHgwNTcpIC8qIFJYRyBDb3VudGVyIDAwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMQkJCUI0M19MUF9TT1VUSCgweDA1OCkgLyogUlhHIENvdW50ZXIgMDEgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JYR19DTlQyCQkJQjQzX0xQX1NPVVRIKDB4MDU5KSAvKiBSWEcgQ291bnRlciAwMiAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUlhHX0NOVDMJCQlCNDNfTFBfU09VVEgoMHgwNUEpIC8qIFJYRyBDb3VudGVyIDAzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UNAkJCUI0M19MUF9TT1VUSCgweDA1QikgLyogUlhHIENvdW50ZXIgMDQgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JYR19DTlQ1CQkJQjQzX0xQX1NPVVRIKDB4MDVDKSAvKiBSWEcgQ291bnRlciAwNSAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUlhHX0NOVDYJCQlCNDNfTFBfU09VVEgoMHgwNUQpIC8qIFJYRyBDb3VudGVyIDA2IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UNwkJCUI0M19MUF9TT1VUSCgweDA1RSkgLyogUlhHIENvdW50ZXIgMDcgKHNvdXRoKSAqLworI2RlZmluZSBCMjA2Ml9TX1JYR19DTlQ4CQkJQjQzX0xQX1NPVVRIKDB4MDVGKSAvKiBSWEcgQ291bnRlciAwOCAoc291dGgpICovCisjZGVmaW5lIEIyMDYyX1NfUlhHX0NOVDkJCQlCNDNfTFBfU09VVEgoMHgwNjApIC8qIFJYRyBDb3VudGVyIDA5IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTAJCQlCNDNfTFBfU09VVEgoMHgwNjEpIC8qIFJYRyBDb3VudGVyIDEwIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTEJCQlCNDNfTFBfU09VVEgoMHgwNjIpIC8qIFJYRyBDb3VudGVyIDExIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTIJCQlCNDNfTFBfU09VVEgoMHgwNjMpIC8qIFJYRyBDb3VudGVyIDEyIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTMJCQlCNDNfTFBfU09VVEgoMHgwNjQpIC8qIFJYRyBDb3VudGVyIDEzIChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTQJCQlCNDNfTFBfU09VVEgoMHgwNjUpIC8qIFJYRyBDb3VudGVyIDE0IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTUJCQlCNDNfTFBfU09VVEgoMHgwNjYpIC8qIFJYRyBDb3VudGVyIDE1IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTYJCQlCNDNfTFBfU09VVEgoMHgwNjcpIC8qIFJYRyBDb3VudGVyIDE2IChzb3V0aCkgKi8KKyNkZWZpbmUgQjIwNjJfU19SWEdfQ05UMTcJCQlCNDNfTFBfU09VVEgoMHgwNjgpIC8qIFJYRyBDb3VudGVyIDE3IChzb3V0aCkgKi8KKworCisKKy8qKiogQnJvYWRjb20gMjA2MyByYWRpbyByZWdpc3RlcnMgKioqLworI2RlZmluZSBCMjA2M19SQURJT19JRF9DT0RFCQkJQjQzX0xQX1JBRElPKDB4MDAxKSAvKiBSYWRpbyBJRCBjb2RlICovCisjZGVmaW5lIEIyMDYzX0NPTU0xCQkJCUI0M19MUF9SQURJTygweDAwMCkgLyogQ29tbW9uIDAxICovCisjZGVmaW5lIEIyMDYzX0NPTU0yCQkJCUI0M19MUF9SQURJTygweDAwMikgLyogQ29tbW9uIDAyICovCisjZGVmaW5lIEIyMDYzX0NPTU0zCQkJCUI0M19MUF9SQURJTygweDAwMykgLyogQ29tbW9uIDAzICovCisjZGVmaW5lIEIyMDYzX0NPTU00CQkJCUI0M19MUF9SQURJTygweDAwNCkgLyogQ29tbW9uIDA0ICovCisjZGVmaW5lIEIyMDYzX0NPTU01CQkJCUI0M19MUF9SQURJTygweDAwNSkgLyogQ29tbW9uIDA1ICovCisjZGVmaW5lIEIyMDYzX0NPTU02CQkJCUI0M19MUF9SQURJTygweDAwNikgLyogQ29tbW9uIDA2ICovCisjZGVmaW5lIEIyMDYzX0NPTU03CQkJCUI0M19MUF9SQURJTygweDAwNykgLyogQ29tbW9uIDA3ICovCisjZGVmaW5lIEIyMDYzX0NPTU04CQkJCUI0M19MUF9SQURJTygweDAwOCkgLyogQ29tbW9uIDA4ICovCisjZGVmaW5lIEIyMDYzX0NPTU05CQkJCUI0M19MUF9SQURJTygweDAwOSkgLyogQ29tbW9uIDA5ICovCisjZGVmaW5lIEIyMDYzX0NPTU0xMAkJCQlCNDNfTFBfUkFESU8oMHgwMEEpIC8qIENvbW1vbiAxMCAqLworI2RlZmluZSBCMjA2M19DT01NMTEJCQkJQjQzX0xQX1JBRElPKDB4MDBCKSAvKiBDb21tb24gMTEgKi8KKyNkZWZpbmUgQjIwNjNfQ09NTTEyCQkJCUI0M19MUF9SQURJTygweDAwQykgLyogQ29tbW9uIDEyICovCisjZGVmaW5lIEIyMDYzX0NPTU0xMwkJCQlCNDNfTFBfUkFESU8oMHgwMEQpIC8qIENvbW1vbiAxMyAqLworI2RlZmluZSBCMjA2M19DT01NMTQJCQkJQjQzX0xQX1JBRElPKDB4MDBFKSAvKiBDb21tb24gMTQgKi8KKyNkZWZpbmUgQjIwNjNfQ09NTTE1CQkJCUI0M19MUF9SQURJTygweDAwRikgLyogQ29tbW9uIDE1ICovCisjZGVmaW5lIEIyMDYzX0NPTU0xNgkJCQlCNDNfTFBfUkFESU8oMHgwMTApIC8qIENvbW1vbiAxNiAqLworI2RlZmluZSBCMjA2M19DT01NMTcJCQkJQjQzX0xQX1JBRElPKDB4MDExKSAvKiBDb21tb24gMTcgKi8KKyNkZWZpbmUgQjIwNjNfQ09NTTE4CQkJCUI0M19MUF9SQURJTygweDAxMikgLyogQ29tbW9uIDE4ICovCisjZGVmaW5lIEIyMDYzX0NPTU0xOQkJCQlCNDNfTFBfUkFESU8oMHgwMTMpIC8qIENvbW1vbiAxOSAqLworI2RlZmluZSBCMjA2M19DT01NMjAJCQkJQjQzX0xQX1JBRElPKDB4MDE0KSAvKiBDb21tb24gMjAgKi8KKyNkZWZpbmUgQjIwNjNfQ09NTTIxCQkJCUI0M19MUF9SQURJTygweDAxNSkgLyogQ29tbW9uIDIxICovCisjZGVmaW5lIEIyMDYzX0NPTU0yMgkJCQlCNDNfTFBfUkFESU8oMHgwMTYpIC8qIENvbW1vbiAyMiAqLworI2RlZmluZSBCMjA2M19DT01NMjMJCQkJQjQzX0xQX1JBRElPKDB4MDE3KSAvKiBDb21tb24gMjMgKi8KKyNkZWZpbmUgQjIwNjNfQ09NTTI0CQkJCUI0M19MUF9SQURJTygweDAxOCkgLyogQ29tbW9uIDI0ICovCisjZGVmaW5lIEIyMDYzX1BXUl9TV0lUQ0hfQ1RMCQkJQjQzX0xQX1JBRElPKDB4MDE5KSAvKiBQT1dFUiBTV0lUQ0ggQ29udHJvbCAqLworI2RlZmluZSBCMjA2M19QTExfU1AxCQkJCUI0M19MUF9SQURJTygweDAxQSkgLyogUExMIFNQIDEgKi8KKyNkZWZpbmUgQjIwNjNfUExMX1NQMgkJCQlCNDNfTFBfUkFESU8oMHgwMUIpIC8qIFBMTCBTUCAyICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX1NQMQkJCQlCNDNfTFBfUkFESU8oMHgwMUMpIC8qIExPR0VOIFNQIDEgKi8KKyNkZWZpbmUgQjIwNjNfTE9HRU5fU1AyCQkJCUI0M19MUF9SQURJTygweDAxRCkgLyogTE9HRU4gU1AgMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9TUDMJCQkJQjQzX0xQX1JBRElPKDB4MDFFKSAvKiBMT0dFTiBTUCAzICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX1NQNAkJCQlCNDNfTFBfUkFESU8oMHgwMUYpIC8qIExPR0VOIFNQIDQgKi8KKyNkZWZpbmUgQjIwNjNfTE9HRU5fU1A1CQkJCUI0M19MUF9SQURJTygweDAyMCkgLyogTE9HRU4gU1AgNSAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQMQkJCQlCNDNfTFBfUkFESU8oMHgwMjEpIC8qIEcgUlggU1AgMSAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQMgkJCQlCNDNfTFBfUkFESU8oMHgwMjIpIC8qIEcgUlggU1AgMiAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQMwkJCQlCNDNfTFBfUkFESU8oMHgwMjMpIC8qIEcgUlggU1AgMyAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQNAkJCQlCNDNfTFBfUkFESU8oMHgwMjQpIC8qIEcgUlggU1AgNCAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQNQkJCQlCNDNfTFBfUkFESU8oMHgwMjUpIC8qIEcgUlggU1AgNSAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQNgkJCQlCNDNfTFBfUkFESU8oMHgwMjYpIC8qIEcgUlggU1AgNiAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQNwkJCQlCNDNfTFBfUkFESU8oMHgwMjcpIC8qIEcgUlggU1AgNyAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQOAkJCQlCNDNfTFBfUkFESU8oMHgwMjgpIC8qIEcgUlggU1AgOCAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQOQkJCQlCNDNfTFBfUkFESU8oMHgwMjkpIC8qIEcgUlggU1AgOSAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQMTAJCQkJQjQzX0xQX1JBRElPKDB4MDJBKSAvKiBHIFJYIFNQIDEwICovCisjZGVmaW5lIEIyMDYzX0dfUlhfU1AxMQkJCQlCNDNfTFBfUkFESU8oMHgwMkIpIC8qIEcgUlggU1AgMTEgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDEJCQkJQjQzX0xQX1JBRElPKDB4MDJDKSAvKiBBIFJYIFNQIDEgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDIJCQkJQjQzX0xQX1JBRElPKDB4MDJEKSAvKiBBIFJYIFNQIDIgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDMJCQkJQjQzX0xQX1JBRElPKDB4MDJFKSAvKiBBIFJYIFNQIDMgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDQJCQkJQjQzX0xQX1JBRElPKDB4MDJGKSAvKiBBIFJYIFNQIDQgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDUJCQkJQjQzX0xQX1JBRElPKDB4MDMwKSAvKiBBIFJYIFNQIDUgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDYJCQkJQjQzX0xQX1JBRElPKDB4MDMxKSAvKiBBIFJYIFNQIDYgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUDcJCQkJQjQzX0xQX1JBRElPKDB4MDMyKSAvKiBBIFJYIFNQIDcgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfU1AxCQkJCUI0M19MUF9SQURJTygweDAzMykgLyogUlggQkIgU1AgMSAqLworI2RlZmluZSBCMjA2M19SWF9CQl9TUDIJCQkJQjQzX0xQX1JBRElPKDB4MDM0KSAvKiBSWCBCQiBTUCAyICovCisjZGVmaW5lIEIyMDYzX1JYX0JCX1NQMwkJCQlCNDNfTFBfUkFESU8oMHgwMzUpIC8qIFJYIEJCIFNQIDMgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfU1A0CQkJCUI0M19MUF9SQURJTygweDAzNikgLyogUlggQkIgU1AgNCAqLworI2RlZmluZSBCMjA2M19SWF9CQl9TUDUJCQkJQjQzX0xQX1JBRElPKDB4MDM3KSAvKiBSWCBCQiBTUCA1ICovCisjZGVmaW5lIEIyMDYzX1JYX0JCX1NQNgkJCQlCNDNfTFBfUkFESU8oMHgwMzgpIC8qIFJYIEJCIFNQIDYgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfU1A3CQkJCUI0M19MUF9SQURJTygweDAzOSkgLyogUlggQkIgU1AgNyAqLworI2RlZmluZSBCMjA2M19SWF9CQl9TUDgJCQkJQjQzX0xQX1JBRElPKDB4MDNBKSAvKiBSWCBCQiBTUCA4ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMQkJCQlCNDNfTFBfUkFESU8oMHgwM0IpIC8qIFRYIFJGIFNQIDEgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfU1AyCQkJCUI0M19MUF9SQURJTygweDAzQykgLyogVFggUkYgU1AgMiAqLworI2RlZmluZSBCMjA2M19UWF9SRl9TUDMJCQkJQjQzX0xQX1JBRElPKDB4MDNEKSAvKiBUWCBSRiBTUCAzICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQNAkJCQlCNDNfTFBfUkFESU8oMHgwM0UpIC8qIFRYIFJGIFNQIDQgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfU1A1CQkJCUI0M19MUF9SQURJTygweDAzRikgLyogVFggUkYgU1AgNSAqLworI2RlZmluZSBCMjA2M19UWF9SRl9TUDYJCQkJQjQzX0xQX1JBRElPKDB4MDQwKSAvKiBUWCBSRiBTUCA2ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQNwkJCQlCNDNfTFBfUkFESU8oMHgwNDEpIC8qIFRYIFJGIFNQIDcgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfU1A4CQkJCUI0M19MUF9SQURJTygweDA0MikgLyogVFggUkYgU1AgOCAqLworI2RlZmluZSBCMjA2M19UWF9SRl9TUDkJCQkJQjQzX0xQX1JBRElPKDB4MDQzKSAvKiBUWCBSRiBTUCA5ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTAJCQlCNDNfTFBfUkFESU8oMHgwNDQpIC8qIFRYIFJGIFNQIDEwICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTEJCQlCNDNfTFBfUkFESU8oMHgwNDUpIC8qIFRYIFJGIFNQIDExICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTIJCQlCNDNfTFBfUkFESU8oMHgwNDYpIC8qIFRYIFJGIFNQIDEyICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTMJCQlCNDNfTFBfUkFESU8oMHgwNDcpIC8qIFRYIFJGIFNQIDEzICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTQJCQlCNDNfTFBfUkFESU8oMHgwNDgpIC8qIFRYIFJGIFNQIDE0ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTUJCQlCNDNfTFBfUkFESU8oMHgwNDkpIC8qIFRYIFJGIFNQIDE1ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTYJCQlCNDNfTFBfUkFESU8oMHgwNEEpIC8qIFRYIFJGIFNQIDE2ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX1NQMTcJCQlCNDNfTFBfUkFESU8oMHgwNEIpIC8qIFRYIFJGIFNQIDE3ICovCisjZGVmaW5lIEIyMDYzX1BBX1NQMQkJCQlCNDNfTFBfUkFESU8oMHgwNEMpIC8qIFBBIFNQIDEgKi8KKyNkZWZpbmUgQjIwNjNfUEFfU1AyCQkJCUI0M19MUF9SQURJTygweDA0RCkgLyogUEEgU1AgMiAqLworI2RlZmluZSBCMjA2M19QQV9TUDMJCQkJQjQzX0xQX1JBRElPKDB4MDRFKSAvKiBQQSBTUCAzICovCisjZGVmaW5lIEIyMDYzX1BBX1NQNAkJCQlCNDNfTFBfUkFESU8oMHgwNEYpIC8qIFBBIFNQIDQgKi8KKyNkZWZpbmUgQjIwNjNfUEFfU1A1CQkJCUI0M19MUF9SQURJTygweDA1MCkgLyogUEEgU1AgNSAqLworI2RlZmluZSBCMjA2M19QQV9TUDYJCQkJQjQzX0xQX1JBRElPKDB4MDUxKSAvKiBQQSBTUCA2ICovCisjZGVmaW5lIEIyMDYzX1BBX1NQNwkJCQlCNDNfTFBfUkFESU8oMHgwNTIpIC8qIFBBIFNQIDcgKi8KKyNkZWZpbmUgQjIwNjNfVFhfQkJfU1AxCQkJCUI0M19MUF9SQURJTygweDA1MykgLyogVFggQkIgU1AgMSAqLworI2RlZmluZSBCMjA2M19UWF9CQl9TUDIJCQkJQjQzX0xQX1JBRElPKDB4MDU0KSAvKiBUWCBCQiBTUCAyICovCisjZGVmaW5lIEIyMDYzX1RYX0JCX1NQMwkJCQlCNDNfTFBfUkFESU8oMHgwNTUpIC8qIFRYIEJCIFNQIDMgKi8KKyNkZWZpbmUgQjIwNjNfUkVHX1NQMQkJCQlCNDNfTFBfUkFESU8oMHgwNTYpIC8qIFJFRyBTUCAxICovCisjZGVmaW5lIEIyMDYzX0JBTkRHQVBfQ1RMMQkJCUI0M19MUF9SQURJTygweDA1NykgLyogQkFOREdBUCBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfQkFOREdBUF9DVEwyCQkJQjQzX0xQX1JBRElPKDB4MDU4KSAvKiBCQU5ER0FQIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA2M19MUE9fQ1RMMQkJCQlCNDNfTFBfUkFESU8oMHgwNTkpIC8qIExQTyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfUkNfQ0FMSUJfQ1RMMQkJCUI0M19MUF9SQURJTygweDA1QSkgLyogUkMgQ2FsaWJyYXRpb24gQ29udHJvbCAxICovCisjZGVmaW5lIEIyMDYzX1JDX0NBTElCX0NUTDIJCQlCNDNfTFBfUkFESU8oMHgwNUIpIC8qIFJDIENhbGlicmF0aW9uIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA2M19SQ19DQUxJQl9DVEwzCQkJQjQzX0xQX1JBRElPKDB4MDVDKSAvKiBSQyBDYWxpYnJhdGlvbiBDb250cm9sIDMgKi8KKyNkZWZpbmUgQjIwNjNfUkNfQ0FMSUJfQ1RMNAkJCUI0M19MUF9SQURJTygweDA1RCkgLyogUkMgQ2FsaWJyYXRpb24gQ29udHJvbCA0ICovCisjZGVmaW5lIEIyMDYzX1JDX0NBTElCX0NUTDUJCQlCNDNfTFBfUkFESU8oMHgwNUUpIC8qIFJDIENhbGlicmF0aW9uIENvbnRyb2wgNSAqLworI2RlZmluZSBCMjA2M19SQ19DQUxJQl9DVEw2CQkJQjQzX0xQX1JBRElPKDB4MDVGKSAvKiBSQyBDYWxpYnJhdGlvbiBDb250cm9sIDYgKi8KKyNkZWZpbmUgQjIwNjNfUkNfQ0FMSUJfQ1RMNwkJCUI0M19MUF9SQURJTygweDA2MCkgLyogUkMgQ2FsaWJyYXRpb24gQ29udHJvbCA3ICovCisjZGVmaW5lIEIyMDYzX1JDX0NBTElCX0NUTDgJCQlCNDNfTFBfUkFESU8oMHgwNjEpIC8qIFJDIENhbGlicmF0aW9uIENvbnRyb2wgOCAqLworI2RlZmluZSBCMjA2M19SQ19DQUxJQl9DVEw5CQkJQjQzX0xQX1JBRElPKDB4MDYyKSAvKiBSQyBDYWxpYnJhdGlvbiBDb250cm9sIDkgKi8KKyNkZWZpbmUgQjIwNjNfUkNfQ0FMSUJfQ1RMMTAJCQlCNDNfTFBfUkFESU8oMHgwNjMpIC8qIFJDIENhbGlicmF0aW9uIENvbnRyb2wgMTAgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfQ0FMTlJTVAkJCUI0M19MUF9SQURJTygweDA2NCkgLyogUExMIEpUQUcgQ0FMTlJTVCAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19JTl9QTEwxCQkJQjQzX0xQX1JBRElPKDB4MDY1KSAvKiBQTEwgSlRBRyBJTiBQTEwgMSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19JTl9QTEwyCQkJQjQzX0xQX1JBRElPKDB4MDY2KSAvKiBQTEwgSlRBRyBJTiBQTEwgMiAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfQ1AxCQkJQjQzX0xQX1JBRElPKDB4MDY3KSAvKiBQTEwgSlRBRyBQTEwgQ1AgMSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfQ1AyCQkJQjQzX0xQX1JBRElPKDB4MDY4KSAvKiBQTEwgSlRBRyBQTEwgQ1AgMiAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfQ1AzCQkJQjQzX0xQX1JBRElPKDB4MDY5KSAvKiBQTEwgSlRBRyBQTEwgQ1AgMyAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfQ1A0CQkJQjQzX0xQX1JBRElPKDB4MDZBKSAvKiBQTEwgSlRBRyBQTEwgQ1AgNCAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfQ1RMMQkJCUI0M19MUF9SQURJTygweDA2QikgLyogUExMIEpUQUcgUExMIENvbnRyb2wgMSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfTEYxCQkJQjQzX0xQX1JBRElPKDB4MDZDKSAvKiBQTEwgSlRBRyBQTEwgTEYgMSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfTEYyCQkJQjQzX0xQX1JBRElPKDB4MDZEKSAvKiBQTEwgSlRBRyBQTEwgTEYgMiAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfTEYzCQkJQjQzX0xQX1JBRElPKDB4MDZFKSAvKiBQTEwgSlRBRyBQTEwgTEYgMyAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfTEY0CQkJQjQzX0xQX1JBRElPKDB4MDZGKSAvKiBQTEwgSlRBRyBQTEwgTEYgNCAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfU0cxCQkJQjQzX0xQX1JBRElPKDB4MDcwKSAvKiBQTEwgSlRBRyBQTEwgU0cgMSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfU0cyCQkJQjQzX0xQX1JBRElPKDB4MDcxKSAvKiBQTEwgSlRBRyBQTEwgU0cgMiAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfU0czCQkJQjQzX0xQX1JBRElPKDB4MDcyKSAvKiBQTEwgSlRBRyBQTEwgU0cgMyAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfU0c0CQkJQjQzX0xQX1JBRElPKDB4MDczKSAvKiBQTEwgSlRBRyBQTEwgU0cgNCAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfU0c1CQkJQjQzX0xQX1JBRElPKDB4MDc0KSAvKiBQTEwgSlRBRyBQTEwgU0cgNSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfVkNPMQkJCUI0M19MUF9SQURJTygweDA3NSkgLyogUExMIEpUQUcgUExMIFZDTyAxICovCisjZGVmaW5lIEIyMDYzX1BMTF9KVEFHX1BMTF9WQ08yCQkJQjQzX0xQX1JBRElPKDB4MDc2KSAvKiBQTEwgSlRBRyBQTEwgVkNPIDIgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfUExMX1ZDT19DQUxJQjEJCUI0M19MUF9SQURJTygweDA3NykgLyogUExMIEpUQUcgUExMIFZDTyBDYWxpYnJhdGlvbiAxICovCisjZGVmaW5lIEIyMDYzX1BMTF9KVEFHX1BMTF9WQ09fQ0FMSUIyCQlCNDNfTFBfUkFESU8oMHgwNzgpIC8qIFBMTCBKVEFHIFBMTCBWQ08gQ2FsaWJyYXRpb24gMiAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfVkNPX0NBTElCMwkJQjQzX0xQX1JBRElPKDB4MDc5KSAvKiBQTEwgSlRBRyBQTEwgVkNPIENhbGlicmF0aW9uIDMgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfUExMX1ZDT19DQUxJQjQJCUI0M19MUF9SQURJTygweDA3QSkgLyogUExMIEpUQUcgUExMIFZDTyBDYWxpYnJhdGlvbiA0ICovCisjZGVmaW5lIEIyMDYzX1BMTF9KVEFHX1BMTF9WQ09fQ0FMSUI1CQlCNDNfTFBfUkFESU8oMHgwN0IpIC8qIFBMTCBKVEFHIFBMTCBWQ08gQ2FsaWJyYXRpb24gNSAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfVkNPX0NBTElCNgkJQjQzX0xQX1JBRElPKDB4MDdDKSAvKiBQTEwgSlRBRyBQTEwgVkNPIENhbGlicmF0aW9uIDYgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfUExMX1ZDT19DQUxJQjcJCUI0M19MUF9SQURJTygweDA3RCkgLyogUExMIEpUQUcgUExMIFZDTyBDYWxpYnJhdGlvbiA3ICovCisjZGVmaW5lIEIyMDYzX1BMTF9KVEFHX1BMTF9WQ09fQ0FMSUI4CQlCNDNfTFBfUkFESU8oMHgwN0UpIC8qIFBMTCBKVEFHIFBMTCBWQ08gQ2FsaWJyYXRpb24gOCAqLworI2RlZmluZSBCMjA2M19QTExfSlRBR19QTExfVkNPX0NBTElCOQkJQjQzX0xQX1JBRElPKDB4MDdGKSAvKiBQTEwgSlRBRyBQTEwgVkNPIENhbGlicmF0aW9uIDkgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfUExMX1ZDT19DQUxJQjEwCQlCNDNfTFBfUkFESU8oMHgwODApIC8qIFBMTCBKVEFHIFBMTCBWQ08gQ2FsaWJyYXRpb24gMTAgKi8KKyNkZWZpbmUgQjIwNjNfUExMX0pUQUdfUExMX1hUQUxfMTIJCUI0M19MUF9SQURJTygweDA4MSkgLyogUExMIEpUQUcgUExMIFhUQUwgMSAyICovCisjZGVmaW5lIEIyMDYzX1BMTF9KVEFHX1BMTF9YVEFMMwkJQjQzX0xQX1JBRElPKDB4MDgyKSAvKiBQTEwgSlRBRyBQTEwgWFRBTCAzICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0FDTDEJCQlCNDNfTFBfUkFESU8oMHgwODMpIC8qIExPR0VOIEFDTCAxICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0FDTDIJCQlCNDNfTFBfUkFESU8oMHgwODQpIC8qIExPR0VOIEFDTCAyICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0FDTDMJCQlCNDNfTFBfUkFESU8oMHgwODUpIC8qIExPR0VOIEFDTCAzICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0FDTDQJCQlCNDNfTFBfUkFESU8oMHgwODYpIC8qIExPR0VOIEFDTCA0ICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0FDTDUJCQlCNDNfTFBfUkFESU8oMHgwODcpIC8qIExPR0VOIEFDTCA1ICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX0lOUFVUUwkJCUI0M19MUF9SQURJTygweDA4OCkgLyogTE8gQ2FsaWJyYXRpb24gSU5QVVRTICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX0NUTDEJCQlCNDNfTFBfUkFESU8oMHgwODkpIC8qIExPIENhbGlicmF0aW9uIENvbnRyb2wgMSAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DVEwyCQkJQjQzX0xQX1JBRElPKDB4MDhBKSAvKiBMTyBDYWxpYnJhdGlvbiBDb250cm9sIDIgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfQ1RMMwkJCUI0M19MUF9SQURJTygweDA4QikgLyogTE8gQ2FsaWJyYXRpb24gQ29udHJvbCAzICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX1dBSVRDTlQJCQlCNDNfTFBfUkFESU8oMHgwOEMpIC8qIExPIENhbGlicmF0aW9uIFdBSVRDTlQgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfT1ZSMQkJCUI0M19MUF9SQURJTygweDA4RCkgLyogTE8gQ2FsaWJyYXRpb24gT1ZSIDEgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfT1ZSMgkJCUI0M19MUF9SQURJTygweDA4RSkgLyogTE8gQ2FsaWJyYXRpb24gT1ZSIDIgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfT1ZBTDEJCQlCNDNfTFBfUkFESU8oMHgwOEYpIC8qIExPIENhbGlicmF0aW9uIE9WQUwgMSAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9PVkFMMgkJCUI0M19MUF9SQURJTygweDA5MCkgLyogTE8gQ2FsaWJyYXRpb24gT1ZBTCAyICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX09WQUwzCQkJQjQzX0xQX1JBRElPKDB4MDkxKSAvKiBMTyBDYWxpYnJhdGlvbiBPVkFMIDMgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfT1ZBTDQJCQlCNDNfTFBfUkFESU8oMHgwOTIpIC8qIExPIENhbGlicmF0aW9uIE9WQUwgNCAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9PVkFMNQkJCUI0M19MUF9SQURJTygweDA5MykgLyogTE8gQ2FsaWJyYXRpb24gT1ZBTCA1ICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX09WQUw2CQkJQjQzX0xQX1JBRElPKDB4MDk0KSAvKiBMTyBDYWxpYnJhdGlvbiBPVkFMIDYgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfT1ZBTDcJCQlCNDNfTFBfUkFESU8oMHgwOTUpIC8qIExPIENhbGlicmF0aW9uIE9WQUwgNyAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DQUxWTEQxCQkJQjQzX0xQX1JBRElPKDB4MDk2KSAvKiBMTyBDYWxpYnJhdGlvbiBDQUxWTEQgMSAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DQUxWTEQyCQkJQjQzX0xQX1JBRElPKDB4MDk3KSAvKiBMTyBDYWxpYnJhdGlvbiBDQUxWTEQgMiAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DVkFMMQkJCUI0M19MUF9SQURJTygweDA5OCkgLyogTE8gQ2FsaWJyYXRpb24gQ1ZBTCAxICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX0NWQUwyCQkJQjQzX0xQX1JBRElPKDB4MDk5KSAvKiBMTyBDYWxpYnJhdGlvbiBDVkFMIDIgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfQ1ZBTDMJCQlCNDNfTFBfUkFESU8oMHgwOUEpIC8qIExPIENhbGlicmF0aW9uIENWQUwgMyAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DVkFMNAkJCUI0M19MUF9SQURJTygweDA5QikgLyogTE8gQ2FsaWJyYXRpb24gQ1ZBTCA0ICovCisjZGVmaW5lIEIyMDYzX0xPX0NBTElCX0NWQUw1CQkJQjQzX0xQX1JBRElPKDB4MDlDKSAvKiBMTyBDYWxpYnJhdGlvbiBDVkFMIDUgKi8KKyNkZWZpbmUgQjIwNjNfTE9fQ0FMSUJfQ1ZBTDYJCQlCNDNfTFBfUkFESU8oMHgwOUQpIC8qIExPIENhbGlicmF0aW9uIENWQUwgNiAqLworI2RlZmluZSBCMjA2M19MT19DQUxJQl9DVkFMNwkJCUI0M19MUF9SQURJTygweDA5RSkgLyogTE8gQ2FsaWJyYXRpb24gQ1ZBTCA3ICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX0NBTElCX0VOCQkJQjQzX0xQX1JBRElPKDB4MDlGKSAvKiBMT0dFTiBDYWxpYnJhdGlvbiBFTiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9QRUFLREVUMQkJCUI0M19MUF9SQURJTygweDBBMCkgLyogTE9HRU4gUEVBS0RFVCAxICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX1JDQ1IxCQkJQjQzX0xQX1JBRElPKDB4MEExKSAvKiBMT0dFTiBSQ0NSIDEgKi8KKyNkZWZpbmUgQjIwNjNfTE9HRU5fVkNPQlVGMQkJCUI0M19MUF9SQURJTygweDBBMikgLyogTE9HRU4gVkNPQlVGIDEgKi8KKyNkZWZpbmUgQjIwNjNfTE9HRU5fTUlYRVIxCQkJQjQzX0xQX1JBRElPKDB4MEEzKSAvKiBMT0dFTiBNSVhFUiAxICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX01JWEVSMgkJCUI0M19MUF9SQURJTygweDBBNCkgLyogTE9HRU4gTUlYRVIgMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9CVUYxCQkJQjQzX0xQX1JBRElPKDB4MEE1KSAvKiBMT0dFTiBCVUYgMSAqLworI2RlZmluZSBCMjA2M19MT0dFTl9CVUYyCQkJQjQzX0xQX1JBRElPKDB4MEE2KSAvKiBMT0dFTiBCVUYgMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9ESVYxCQkJQjQzX0xQX1JBRElPKDB4MEE3KSAvKiBMT0dFTiBESVYgMSAqLworI2RlZmluZSBCMjA2M19MT0dFTl9ESVYyCQkJQjQzX0xQX1JBRElPKDB4MEE4KSAvKiBMT0dFTiBESVYgMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9ESVYzCQkJQjQzX0xQX1JBRElPKDB4MEE5KSAvKiBMT0dFTiBESVYgMyAqLworI2RlZmluZSBCMjA2M19MT0dFTl9DQlVGUlgxCQkJQjQzX0xQX1JBRElPKDB4MEFBKSAvKiBMT0dFTiBDQlVGUlggMSAqLworI2RlZmluZSBCMjA2M19MT0dFTl9DQlVGUlgyCQkJQjQzX0xQX1JBRElPKDB4MEFCKSAvKiBMT0dFTiBDQlVGUlggMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9DQlVGVFgxCQkJQjQzX0xQX1JBRElPKDB4MEFDKSAvKiBMT0dFTiBDQlVGVFggMSAqLworI2RlZmluZSBCMjA2M19MT0dFTl9DQlVGVFgyCQkJQjQzX0xQX1JBRElPKDB4MEFEKSAvKiBMT0dFTiBDQlVGVFggMiAqLworI2RlZmluZSBCMjA2M19MT0dFTl9JREFDMQkJCUI0M19MUF9SQURJTygweDBBRSkgLyogTE9HRU4gSURBQyAxICovCisjZGVmaW5lIEIyMDYzX0xPR0VOX1NQQVJFMQkJCUI0M19MUF9SQURJTygweDBBRikgLyogTE9HRU4gU1BBUkUgMSAqLworI2RlZmluZSBCMjA2M19MT0dFTl9TUEFSRTIJCQlCNDNfTFBfUkFESU8oMHgwQjApIC8qIExPR0VOIFNQQVJFIDIgKi8KKyNkZWZpbmUgQjIwNjNfTE9HRU5fU1BBUkUzCQkJQjQzX0xQX1JBRElPKDB4MEIxKSAvKiBMT0dFTiBTUEFSRSAzICovCisjZGVmaW5lIEIyMDYzX0dfUlhfMVNUMQkJCQlCNDNfTFBfUkFESU8oMHgwQjIpIC8qIEcgUlggMVNUIDEgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF8xU1QyCQkJCUI0M19MUF9SQURJTygweDBCMykgLyogRyBSWCAxU1QgMiAqLworI2RlZmluZSBCMjA2M19HX1JYXzFTVDMJCQkJQjQzX0xQX1JBRElPKDB4MEI0KSAvKiBHIFJYIDFTVCAzICovCisjZGVmaW5lIEIyMDYzX0dfUlhfMk5EMQkJCQlCNDNfTFBfUkFESU8oMHgwQjUpIC8qIEcgUlggMk5EIDEgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF8yTkQyCQkJCUI0M19MUF9SQURJTygweDBCNikgLyogRyBSWCAyTkQgMiAqLworI2RlZmluZSBCMjA2M19HX1JYXzJORDMJCQkJQjQzX0xQX1JBRElPKDB4MEI3KSAvKiBHIFJYIDJORCAzICovCisjZGVmaW5lIEIyMDYzX0dfUlhfMk5ENAkJCQlCNDNfTFBfUkFESU8oMHgwQjgpIC8qIEcgUlggMk5EIDQgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF8yTkQ1CQkJCUI0M19MUF9SQURJTygweDBCOSkgLyogRyBSWCAyTkQgNSAqLworI2RlZmluZSBCMjA2M19HX1JYXzJORDYJCQkJQjQzX0xQX1JBRElPKDB4MEJBKSAvKiBHIFJYIDJORCA2ICovCisjZGVmaW5lIEIyMDYzX0dfUlhfMk5ENwkJCQlCNDNfTFBfUkFESU8oMHgwQkIpIC8qIEcgUlggMk5EIDcgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF8yTkQ4CQkJCUI0M19MUF9SQURJTygweDBCQykgLyogRyBSWCAyTkQgOCAqLworI2RlZmluZSBCMjA2M19HX1JYX1BTMQkJCQlCNDNfTFBfUkFESU8oMHgwQkQpIC8qIEcgUlggUFMgMSAqLworI2RlZmluZSBCMjA2M19HX1JYX1BTMgkJCQlCNDNfTFBfUkFESU8oMHgwQkUpIC8qIEcgUlggUFMgMiAqLworI2RlZmluZSBCMjA2M19HX1JYX1BTMwkJCQlCNDNfTFBfUkFESU8oMHgwQkYpIC8qIEcgUlggUFMgMyAqLworI2RlZmluZSBCMjA2M19HX1JYX1BTNAkJCQlCNDNfTFBfUkFESU8oMHgwQzApIC8qIEcgUlggUFMgNCAqLworI2RlZmluZSBCMjA2M19HX1JYX1BTNQkJCQlCNDNfTFBfUkFESU8oMHgwQzEpIC8qIEcgUlggUFMgNSAqLworI2RlZmluZSBCMjA2M19HX1JYX01JWDEJCQkJQjQzX0xQX1JBRElPKDB4MEMyKSAvKiBHIFJYIE1JWCAxICovCisjZGVmaW5lIEIyMDYzX0dfUlhfTUlYMgkJCQlCNDNfTFBfUkFESU8oMHgwQzMpIC8qIEcgUlggTUlYIDIgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF9NSVgzCQkJCUI0M19MUF9SQURJTygweDBDNCkgLyogRyBSWCBNSVggMyAqLworI2RlZmluZSBCMjA2M19HX1JYX01JWDQJCQkJQjQzX0xQX1JBRElPKDB4MEM1KSAvKiBHIFJYIE1JWCA0ICovCisjZGVmaW5lIEIyMDYzX0dfUlhfTUlYNQkJCQlCNDNfTFBfUkFESU8oMHgwQzYpIC8qIEcgUlggTUlYIDUgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF9NSVg2CQkJCUI0M19MUF9SQURJTygweDBDNykgLyogRyBSWCBNSVggNiAqLworI2RlZmluZSBCMjA2M19HX1JYX01JWDcJCQkJQjQzX0xQX1JBRElPKDB4MEM4KSAvKiBHIFJYIE1JWCA3ICovCisjZGVmaW5lIEIyMDYzX0dfUlhfTUlYOAkJCQlCNDNfTFBfUkFESU8oMHgwQzkpIC8qIEcgUlggTUlYIDggKi8KKyNkZWZpbmUgQjIwNjNfR19SWF9QREVUMQkJCUI0M19MUF9SQURJTygweDBDQSkgLyogRyBSWCBQREVUIDEgKi8KKyNkZWZpbmUgQjIwNjNfR19SWF9TUEFSRVMxCQkJQjQzX0xQX1JBRElPKDB4MENCKSAvKiBHIFJYIFNQQVJFUyAxICovCisjZGVmaW5lIEIyMDYzX0dfUlhfU1BBUkVTMgkJCUI0M19MUF9SQURJTygweDBDQykgLyogRyBSWCBTUEFSRVMgMiAqLworI2RlZmluZSBCMjA2M19HX1JYX1NQQVJFUzMJCQlCNDNfTFBfUkFESU8oMHgwQ0QpIC8qIEcgUlggU1BBUkVTIDMgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF8xU1QxCQkJCUI0M19MUF9SQURJTygweDBDRSkgLyogQSBSWCAxU1QgMSAqLworI2RlZmluZSBCMjA2M19BX1JYXzFTVDIJCQkJQjQzX0xQX1JBRElPKDB4MENGKSAvKiBBIFJYIDFTVCAyICovCisjZGVmaW5lIEIyMDYzX0FfUlhfMVNUMwkJCQlCNDNfTFBfUkFESU8oMHgwRDApIC8qIEEgUlggMVNUIDMgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF8xU1Q0CQkJCUI0M19MUF9SQURJTygweDBEMSkgLyogQSBSWCAxU1QgNCAqLworI2RlZmluZSBCMjA2M19BX1JYXzFTVDUJCQkJQjQzX0xQX1JBRElPKDB4MEQyKSAvKiBBIFJYIDFTVCA1ICovCisjZGVmaW5lIEIyMDYzX0FfUlhfMk5EMQkJCQlCNDNfTFBfUkFESU8oMHgwRDMpIC8qIEEgUlggMk5EIDEgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF8yTkQyCQkJCUI0M19MUF9SQURJTygweDBENCkgLyogQSBSWCAyTkQgMiAqLworI2RlZmluZSBCMjA2M19BX1JYXzJORDMJCQkJQjQzX0xQX1JBRElPKDB4MEQ1KSAvKiBBIFJYIDJORCAzICovCisjZGVmaW5lIEIyMDYzX0FfUlhfMk5ENAkJCQlCNDNfTFBfUkFESU8oMHgwRDYpIC8qIEEgUlggMk5EIDQgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF8yTkQ1CQkJCUI0M19MUF9SQURJTygweDBENykgLyogQSBSWCAyTkQgNSAqLworI2RlZmluZSBCMjA2M19BX1JYXzJORDYJCQkJQjQzX0xQX1JBRElPKDB4MEQ4KSAvKiBBIFJYIDJORCA2ICovCisjZGVmaW5lIEIyMDYzX0FfUlhfMk5ENwkJCQlCNDNfTFBfUkFESU8oMHgwRDkpIC8qIEEgUlggMk5EIDcgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzEJCQkJQjQzX0xQX1JBRElPKDB4MERBKSAvKiBBIFJYIFBTIDEgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzIJCQkJQjQzX0xQX1JBRElPKDB4MERCKSAvKiBBIFJYIFBTIDIgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzMJCQkJQjQzX0xQX1JBRElPKDB4MERDKSAvKiBBIFJYIFBTIDMgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzQJCQkJQjQzX0xQX1JBRElPKDB4MEREKSAvKiBBIFJYIFBTIDQgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzUJCQkJQjQzX0xQX1JBRElPKDB4MERFKSAvKiBBIFJYIFBTIDUgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9QUzYJCQkJQjQzX0xQX1JBRElPKDB4MERGKSAvKiBBIFJYIFBTIDYgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9NSVgxCQkJCUI0M19MUF9SQURJTygweDBFMCkgLyogQSBSWCBNSVggMSAqLworI2RlZmluZSBCMjA2M19BX1JYX01JWDIJCQkJQjQzX0xQX1JBRElPKDB4MEUxKSAvKiBBIFJYIE1JWCAyICovCisjZGVmaW5lIEIyMDYzX0FfUlhfTUlYMwkJCQlCNDNfTFBfUkFESU8oMHgwRTIpIC8qIEEgUlggTUlYIDMgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9NSVg0CQkJCUI0M19MUF9SQURJTygweDBFMykgLyogQSBSWCBNSVggNCAqLworI2RlZmluZSBCMjA2M19BX1JYX01JWDUJCQkJQjQzX0xQX1JBRElPKDB4MEU0KSAvKiBBIFJYIE1JWCA1ICovCisjZGVmaW5lIEIyMDYzX0FfUlhfTUlYNgkJCQlCNDNfTFBfUkFESU8oMHgwRTUpIC8qIEEgUlggTUlYIDYgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9NSVg3CQkJCUI0M19MUF9SQURJTygweDBFNikgLyogQSBSWCBNSVggNyAqLworI2RlZmluZSBCMjA2M19BX1JYX01JWDgJCQkJQjQzX0xQX1JBRElPKDB4MEU3KSAvKiBBIFJYIE1JWCA4ICovCisjZGVmaW5lIEIyMDYzX0FfUlhfUFdSREVUMQkJCUI0M19MUF9SQURJTygweDBFOCkgLyogQSBSWCBQV1JERVQgMSAqLworI2RlZmluZSBCMjA2M19BX1JYX1NQQVJFMQkJCUI0M19MUF9SQURJTygweDBFOSkgLyogQSBSWCBTUEFSRSAxICovCisjZGVmaW5lIEIyMDYzX0FfUlhfU1BBUkUyCQkJQjQzX0xQX1JBRElPKDB4MEVBKSAvKiBBIFJYIFNQQVJFIDIgKi8KKyNkZWZpbmUgQjIwNjNfQV9SWF9TUEFSRTMJCQlCNDNfTFBfUkFESU8oMHgwRUIpIC8qIEEgUlggU1BBUkUgMyAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMMQkJCUI0M19MUF9SQURJTygweDBFQykgLyogUlggVElBIENvbnRyb2wgMSAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMMgkJCUI0M19MUF9SQURJTygweDBFRCkgLyogUlggVElBIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMMwkJCUI0M19MUF9SQURJTygweDBFRSkgLyogUlggVElBIENvbnRyb2wgMyAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMNAkJCUI0M19MUF9SQURJTygweDBFRikgLyogUlggVElBIENvbnRyb2wgNCAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMNQkJCUI0M19MUF9SQURJTygweDBGMCkgLyogUlggVElBIENvbnRyb2wgNSAqLworI2RlZmluZSBCMjA2M19SWF9USUFfQ1RMNgkJCUI0M19MUF9SQURJTygweDBGMSkgLyogUlggVElBIENvbnRyb2wgNiAqLworI2RlZmluZSBCMjA2M19SWF9CQl9DVEwxCQkJQjQzX0xQX1JBRElPKDB4MEYyKSAvKiBSWCBCQiBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfQ1RMMgkJCUI0M19MUF9SQURJTygweDBGMykgLyogUlggQkIgQ29udHJvbCAyICovCisjZGVmaW5lIEIyMDYzX1JYX0JCX0NUTDMJCQlCNDNfTFBfUkFESU8oMHgwRjQpIC8qIFJYIEJCIENvbnRyb2wgMyAqLworI2RlZmluZSBCMjA2M19SWF9CQl9DVEw0CQkJQjQzX0xQX1JBRElPKDB4MEY1KSAvKiBSWCBCQiBDb250cm9sIDQgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfQ1RMNQkJCUI0M19MUF9SQURJTygweDBGNikgLyogUlggQkIgQ29udHJvbCA1ICovCisjZGVmaW5lIEIyMDYzX1JYX0JCX0NUTDYJCQlCNDNfTFBfUkFESU8oMHgwRjcpIC8qIFJYIEJCIENvbnRyb2wgNiAqLworI2RlZmluZSBCMjA2M19SWF9CQl9DVEw3CQkJQjQzX0xQX1JBRElPKDB4MEY4KSAvKiBSWCBCQiBDb250cm9sIDcgKi8KKyNkZWZpbmUgQjIwNjNfUlhfQkJfQ1RMOAkJCUI0M19MUF9SQURJTygweDBGOSkgLyogUlggQkIgQ29udHJvbCA4ICovCisjZGVmaW5lIEIyMDYzX1JYX0JCX0NUTDkJCQlCNDNfTFBfUkFESU8oMHgwRkEpIC8qIFJYIEJCIENvbnRyb2wgOSAqLworI2RlZmluZSBCMjA2M19UWF9SRl9DVEwxCQkJQjQzX0xQX1JBRElPKDB4MEZCKSAvKiBUWCBSRiBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfSURBQ19MT19SRl9JCQlCNDNfTFBfUkFESU8oMHgwRkMpIC8qIFRYIFJGIElEQUMgTE8gUkYgSSAqLworI2RlZmluZSBCMjA2M19UWF9SRl9JREFDX0xPX1JGX1EJCUI0M19MUF9SQURJTygweDBGRCkgLyogVFggUkYgSURBQyBMTyBSRiBRICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0lEQUNfTE9fQkJfSQkJQjQzX0xQX1JBRElPKDB4MEZFKSAvKiBUWCBSRiBJREFDIExPIEJCIEkgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfSURBQ19MT19CQl9RCQlCNDNfTFBfUkFESU8oMHgwRkYpIC8qIFRYIFJGIElEQUMgTE8gQkIgUSAqLworI2RlZmluZSBCMjA2M19UWF9SRl9DVEwyCQkJQjQzX0xQX1JBRElPKDB4MTAwKSAvKiBUWCBSRiBDb250cm9sIDIgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfQ1RMMwkJCUI0M19MUF9SQURJTygweDEwMSkgLyogVFggUkYgQ29udHJvbCAzICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0NUTDQJCQlCNDNfTFBfUkFESU8oMHgxMDIpIC8qIFRYIFJGIENvbnRyb2wgNCAqLworI2RlZmluZSBCMjA2M19UWF9SRl9DVEw1CQkJQjQzX0xQX1JBRElPKDB4MTAzKSAvKiBUWCBSRiBDb250cm9sIDUgKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfQ1RMNgkJCUI0M19MUF9SQURJTygweDEwNCkgLyogVFggUkYgQ29udHJvbCA2ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0NUTDcJCQlCNDNfTFBfUkFESU8oMHgxMDUpIC8qIFRYIFJGIENvbnRyb2wgNyAqLworI2RlZmluZSBCMjA2M19UWF9SRl9DVEw4CQkJQjQzX0xQX1JBRElPKDB4MTA2KSAvKiBUWCBSRiBDb250cm9sIDggKi8KKyNkZWZpbmUgQjIwNjNfVFhfUkZfQ1RMOQkJCUI0M19MUF9SQURJTygweDEwNykgLyogVFggUkYgQ29udHJvbCA5ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0NUTDEwCQkJQjQzX0xQX1JBRElPKDB4MTA4KSAvKiBUWCBSRiBDb250cm9sIDEwICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0NUTDE0CQkJQjQzX0xQX1JBRElPKDB4MTA5KSAvKiBUWCBSRiBDb250cm9sIDE0ICovCisjZGVmaW5lIEIyMDYzX1RYX1JGX0NUTDE1CQkJQjQzX0xQX1JBRElPKDB4MTBBKSAvKiBUWCBSRiBDb250cm9sIDE1ICovCisjZGVmaW5lIEIyMDYzX1BBX0NUTDEJCQkJQjQzX0xQX1JBRElPKDB4MTBCKSAvKiBQQSBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfUEFfQ1RMMgkJCQlCNDNfTFBfUkFESU8oMHgxMEMpIC8qIFBBIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA2M19QQV9DVEwzCQkJCUI0M19MUF9SQURJTygweDEwRCkgLyogUEEgQ29udHJvbCAzICovCisjZGVmaW5lIEIyMDYzX1BBX0NUTDQJCQkJQjQzX0xQX1JBRElPKDB4MTBFKSAvKiBQQSBDb250cm9sIDQgKi8KKyNkZWZpbmUgQjIwNjNfUEFfQ1RMNQkJCQlCNDNfTFBfUkFESU8oMHgxMEYpIC8qIFBBIENvbnRyb2wgNSAqLworI2RlZmluZSBCMjA2M19QQV9DVEw2CQkJCUI0M19MUF9SQURJTygweDExMCkgLyogUEEgQ29udHJvbCA2ICovCisjZGVmaW5lIEIyMDYzX1BBX0NUTDcJCQkJQjQzX0xQX1JBRElPKDB4MTExKSAvKiBQQSBDb250cm9sIDcgKi8KKyNkZWZpbmUgQjIwNjNfUEFfQ1RMOAkJCQlCNDNfTFBfUkFESU8oMHgxMTIpIC8qIFBBIENvbnRyb2wgOCAqLworI2RlZmluZSBCMjA2M19QQV9DVEw5CQkJCUI0M19MUF9SQURJTygweDExMykgLyogUEEgQ29udHJvbCA5ICovCisjZGVmaW5lIEIyMDYzX1BBX0NUTDEwCQkJCUI0M19MUF9SQURJTygweDExNCkgLyogUEEgQ29udHJvbCAxMCAqLworI2RlZmluZSBCMjA2M19QQV9DVEwxMQkJCQlCNDNfTFBfUkFESU8oMHgxMTUpIC8qIFBBIENvbnRyb2wgMTEgKi8KKyNkZWZpbmUgQjIwNjNfUEFfQ1RMMTIJCQkJQjQzX0xQX1JBRElPKDB4MTE2KSAvKiBQQSBDb250cm9sIDEyICovCisjZGVmaW5lIEIyMDYzX1BBX0NUTDEzCQkJCUI0M19MUF9SQURJTygweDExNykgLyogUEEgQ29udHJvbCAxMyAqLworI2RlZmluZSBCMjA2M19UWF9CQl9DVEwxCQkJQjQzX0xQX1JBRElPKDB4MTE4KSAvKiBUWCBCQiBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfVFhfQkJfQ1RMMgkJCUI0M19MUF9SQURJTygweDExOSkgLyogVFggQkIgQ29udHJvbCAyICovCisjZGVmaW5lIEIyMDYzX1RYX0JCX0NUTDMJCQlCNDNfTFBfUkFESU8oMHgxMUEpIC8qIFRYIEJCIENvbnRyb2wgMyAqLworI2RlZmluZSBCMjA2M19UWF9CQl9DVEw0CQkJQjQzX0xQX1JBRElPKDB4MTFCKSAvKiBUWCBCQiBDb250cm9sIDQgKi8KKyNkZWZpbmUgQjIwNjNfR1BJT19DVEwxCQkJCUI0M19MUF9SQURJTygweDExQykgLyogR1BJTyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfVlJFR19DVEwxCQkJCUI0M19MUF9SQURJTygweDExRCkgLyogVlJFRyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfQU1VWF9DVEwxCQkJCUI0M19MUF9SQURJTygweDExRSkgLyogQU1VWCBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfSVFfQ0FMSUJfR1ZBUgkJCUI0M19MUF9SQURJTygweDExRikgLyogSVEgQ2FsaWJyYXRpb24gR1ZBUiAqLworI2RlZmluZSBCMjA2M19JUV9DQUxJQl9DVEwxCQkJQjQzX0xQX1JBRElPKDB4MTIwKSAvKiBJUSBDYWxpYnJhdGlvbiBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNjNfSVFfQ0FMSUJfQ1RMMgkJCUI0M19MUF9SQURJTygweDEyMSkgLyogSVEgQ2FsaWJyYXRpb24gQ29udHJvbCAyICovCisjZGVmaW5lIEIyMDYzX1RFTVBTRU5TRV9DVEwxCQkJQjQzX0xQX1JBRElPKDB4MTIyKSAvKiBURU1QU0VOU0UgQ29udHJvbCAxICovCisjZGVmaW5lIEIyMDYzX1RFTVBTRU5TRV9DVEwyCQkJQjQzX0xQX1JBRElPKDB4MTIzKSAvKiBURU1QU0VOU0UgQ29udHJvbCAyICovCisjZGVmaW5lIEIyMDYzX1RYX1JYX0xPT1BCQUNLMQkJCUI0M19MUF9SQURJTygweDEyNCkgLyogVFgvUlggTE9PUEJBQ0sgMSAqLworI2RlZmluZSBCMjA2M19UWF9SWF9MT09QQkFDSzIJCQlCNDNfTFBfUkFESU8oMHgxMjUpIC8qIFRYL1JYIExPT1BCQUNLIDIgKi8KKyNkZWZpbmUgQjIwNjNfRVhUX1RTU0lfQ1RMMQkJCUI0M19MUF9SQURJTygweDEyNikgLyogRVhUIFRTU0kgQ29udHJvbCAxICovCisjZGVmaW5lIEIyMDYzX0VYVF9UU1NJX0NUTDIJCQlCNDNfTFBfUkFESU8oMHgxMjcpIC8qIEVYVCBUU1NJIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA2M19BRkVfQ1RMCQkJCUI0M19MUF9SQURJTygweDEyOCkgLyogQUZFIENvbnRyb2wgKi8KKworCisKK3N0cnVjdCBiNDNfcGh5X2xwIHsKKwkvL1RPRE8KK307CisKKworc3RydWN0IGI0M19waHlfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIGI0M19waHlvcHNfbHA7CisKKyNlbmRpZiAvKiBMSU5VWF9CNDNfUEhZX0xQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiY2ZkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwpAQCAtMCwwICsxLDYyOCBAQAorLyoKKworICBCcm9hZGNvbSBCNDMgd2lyZWxlc3MgZHJpdmVyCisgIElFRUUgODAyLjExbiBQSFkgc3VwcG9ydAorCisgIENvcHlyaWdodCAoYykgMjAwOCBNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0ZWV0LCBGaWZ0aCBGbG9vciwKKyAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJiNDMuaCIKKyNpbmNsdWRlICJwaHlfbi5oIgorI2luY2x1ZGUgInRhYmxlc19ucGh5LmgiCisKKwordm9pZCBiNDNfbnBoeV9zZXRfcnhhbnRlbm5hKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgaW50IGFudGVubmEpCit7Ly9UT0RPCit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X29wX2FkanVzdF90eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3svL1RPRE8KK30KKworc3RhdGljIGVudW0gYjQzX3R4cHdyX3Jlc3VsdCBiNDNfbnBoeV9vcF9yZWNhbGNfdHhwb3dlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJCQkJYm9vbCBpZ25vcmVfdHNzaSkKK3svL1RPRE8KKwlyZXR1cm4gQjQzX1RYUFdSX1JFU19ET05FOworfQorCitzdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9yYWRpb191cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnkgKmUpCit7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9QTExfUkVGLCBlLT5yYWRpb19wbGxfcmVmKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1JGX1BMTE1PRDAsIGUtPnJhZGlvX3JmX3BsbG1vZDApOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfUkZfUExMTU9EMSwgZS0+cmFkaW9fcmZfcGxsbW9kMSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9WQ09fQ0FQVEFJTCwgZS0+cmFkaW9fdmNvX2NhcHRhaWwpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfVkNPX0NBTDEsIGUtPnJhZGlvX3Zjb19jYWwxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1ZDT19DQUwyLCBlLT5yYWRpb192Y29fY2FsMik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9QTExfTEZDMSwgZS0+cmFkaW9fcGxsX2xmYzEpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfUExMX0xGUjEsIGUtPnJhZGlvX3BsbF9sZnIxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1BMTF9MRkMyLCBlLT5yYWRpb19wbGxfbGZjMik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9MR0JVRl9DRU5CVUYsIGUtPnJhZGlvX2xnYnVmX2NlbmJ1Zik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9MR0VOX1RVTkUxLCBlLT5yYWRpb19sZ2VuX3R1bmUxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0xHRU5fVFVORTIsIGUtPnJhZGlvX2xnZW5fdHVuZTIpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQzFfTEdCVUZfQVRVTkUsIGUtPnJhZGlvX2MxX2xnYnVmX2F0dW5lKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX0xHQlVGX0dUVU5FLCBlLT5yYWRpb19jMV9sZ2J1Zl9ndHVuZSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9SWF9SRlIxLCBlLT5yYWRpb19jMV9yeF9yZnIxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MxX1RYX1BHQVBBRFROLCBlLT5yYWRpb19jMV90eF9wZ2FwYWR0bik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9UWF9NWEJHVFJJTSwgZS0+cmFkaW9fYzFfdHhfbXhiZ3RyaW0pOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQzJfTEdCVUZfQVRVTkUsIGUtPnJhZGlvX2MyX2xnYnVmX2F0dW5lKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX0xHQlVGX0dUVU5FLCBlLT5yYWRpb19jMl9sZ2J1Zl9ndHVuZSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMl9SWF9SRlIxLCBlLT5yYWRpb19jMl9yeF9yZnIxKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX1RYX1BHQVBBRFROLCBlLT5yYWRpb19jMl90eF9wZ2FwYWR0bik7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMl9UWF9NWEJHVFJJTSwgZS0+cmFkaW9fYzJfdHhfbXhiZ3RyaW0pOworfQorCitzdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9waHlfdXBsb2FkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeSAqZSkKK3sKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQlcxQSwgZS0+cGh5X2J3MWEpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzIsIGUtPnBoeV9idzIpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzMsIGUtPnBoeV9idzMpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzQsIGUtPnBoeV9idzQpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzUsIGUtPnBoeV9idzUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzYsIGUtPnBoeV9idzYpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV90eF9wb3dlcl9maXgoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCS8vVE9ETworfQorCisvKiBUdW5lIHRoZSBoYXJkd2FyZSB0byBhIG5ldyBjaGFubmVsLiAqLworc3RhdGljIGludCBucGh5X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnkgKnRhYmVudDsKKworCXRhYmVudCA9IGI0M19ucGh5X2dldF9jaGFudGFiZW50KGRldiwgY2hhbm5lbCk7CisJaWYgKCF0YWJlbnQpCisJCXJldHVybiAtRVNSQ0g7CisKKwkvL0ZJWE1FIGVuYWJsZS9kaXNhYmxlIGJhbmQgc2VsZWN0IHVwcGVyMjAgaW4gUlhDVEwKKwlpZiAoMCAvKkZJWE1FIDVHaHoqLykKKwkJYjQzX3JhZGlvX21hc2tzZXQoZGV2LCBCMjA1NV9NQVNURVIxLCAweEZGOEYsIDB4MjApOworCWVsc2UKKwkJYjQzX3JhZGlvX21hc2tzZXQoZGV2LCBCMjA1NV9NQVNURVIxLCAweEZGOEYsIDB4NTApOworCWI0M19jaGFudGFiX3JhZGlvX3VwbG9hZChkZXYsIHRhYmVudCk7CisJdWRlbGF5KDUwKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1ZDT19DQUwxMCwgNSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9WQ09fQ0FMMTAsIDQ1KTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X1ZDT19DQUwxMCwgNjUpOworCXVkZWxheSgzMDApOworCWlmICgwIC8qRklYTUUgNUdoeiovKQorCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0JBTkRDVEwsIEI0M19OUEhZX0JBTkRDVExfNUdIWik7CisJZWxzZQorCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9CQU5EQ1RMLCB+QjQzX05QSFlfQkFORENUTF81R0haKTsKKwliNDNfY2hhbnRhYl9waHlfdXBsb2FkKGRldiwgdGFiZW50KTsKKwliNDNfbnBoeV90eF9wb3dlcl9maXgoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTVfcHJlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCSAgICAgfkI0M19OUEhZX1JGQ1RMX0NNRF9QT1JGT1JDRSk7CisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCSAgICBCNDNfTlBIWV9SRkNUTF9DTURfQ0hJUDBQVSB8CisJCSAgICBCNDNfTlBIWV9SRkNUTF9DTURfT0VQT1JGT1JDRSk7CisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCSAgICBCNDNfTlBIWV9SRkNUTF9DTURfUE9SRk9SQ0UpOworfQorCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTVfcG9zdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSAmKGRldi0+ZGV2LT5idXMtPnNwcm9tKTsKKwlzdHJ1Y3Qgc3NiX2JvYXJkaW5mbyAqYmluZm8gPSAmKGRldi0+ZGV2LT5idXMtPmJvYXJkaW5mbyk7CisJaW50IGk7CisJdTE2IHZhbDsKKworCWI0M19yYWRpb19tYXNrKGRldiwgQjIwNTVfTUFTVEVSMSwgMHhGRkYzKTsKKwltc2xlZXAoMSk7CisJaWYgKChzcHJvbS0+cmV2aXNpb24gIT0gNCkgfHwgIShzcHJvbS0+Ym9hcmRmbGFnc19oaSAmIDB4MDAwMikpIHsKKwkJaWYgKChiaW5mby0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pIHx8CisJCSAgICAoYmluZm8tPnR5cGUgIT0gMHg0NkQpIHx8CisJCSAgICAoYmluZm8tPnJldiA8IDB4NDEpKSB7CisJCQliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X0MxX1JYX0JCX1JFRywgMHg3Rik7CisJCQliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X0MxX1JYX0JCX1JFRywgMHg3Rik7CisJCQltc2xlZXAoMSk7CisJCX0KKwl9CisJYjQzX3JhZGlvX21hc2tzZXQoZGV2LCBCMjA1NV9SUkNDQUxfTk9QVFNFTCwgMHgzRiwgMHgyQyk7CisJbXNsZWVwKDEpOworCWI0M19yYWRpb193cml0ZTE2KGRldiwgQjIwNTVfQ0FMX01JU0MsIDB4M0MpOworCW1zbGVlcCgxKTsKKwliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X0NBTF9NSVNDLCAweEZGQkUpOworCW1zbGVlcCgxKTsKKwliNDNfcmFkaW9fc2V0KGRldiwgQjIwNTVfQ0FMX0xQT0NUTCwgMHg4MCk7CisJbXNsZWVwKDEpOworCWI0M19yYWRpb19zZXQoZGV2LCBCMjA1NV9DQUxfTUlTQywgMHgxKTsKKwltc2xlZXAoMSk7CisJYjQzX3JhZGlvX3NldChkZXYsIEIyMDU1X0NBTF9NSVNDLCAweDQwKTsKKwltc2xlZXAoMSk7CisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXZhbCA9IGI0M19yYWRpb19yZWFkMTYoZGV2LCBCMjA1NV9DQUxfQ09VVDIpOworCQlpZiAodmFsICYgMHg4MCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwltc2xlZXAoMSk7CisJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DQUxfTFBPQ1RMLCAweEZGN0YpOworCW1zbGVlcCgxKTsKKwlucGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgZGV2LT5waHkuY2hhbm5lbCk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9SWF9CQl9MUEYsIDB4OSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMl9SWF9CQl9MUEYsIDB4OSk7CisJYjQzX3JhZGlvX3dyaXRlMTYoZGV2LCBCMjA1NV9DMV9SWF9CQl9NSURBQ0hQLCAweDgzKTsKKwliNDNfcmFkaW9fd3JpdGUxNihkZXYsIEIyMDU1X0MyX1JYX0JCX01JREFDSFAsIDB4ODMpOworfQorCisvKiBJbml0aWFsaXplIGEgQnJvYWRjb20gMjA1NSBOLXJhZGlvICovCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWI0M19yYWRpb19pbml0MjA1NV9wcmUoZGV2KTsKKwlpZiAoYjQzX3N0YXR1cyhkZXYpIDwgQjQzX1NUQVRfSU5JVElBTElaRUQpCisJCWIyMDU1X3VwbG9hZF9pbml0dGFiKGRldiwgMCwgMSk7CisJZWxzZQorCQliMjA1NV91cGxvYWRfaW5pdHRhYihkZXYsIDAvKkZJWE1FIG9uIDVnaHogYmFuZCovLCAwKTsKKwliNDNfcmFkaW9faW5pdDIwNTVfcG9zdChkZXYpOworfQorCit2b2lkIGI0M19ucGh5X3JhZGlvX3R1cm5fb24oc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWI0M19yYWRpb19pbml0MjA1NShkZXYpOworfQorCit2b2lkIGI0M19ucGh5X3JhZGlvX3R1cm5fb2ZmKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCSAgICAgfkI0M19OUEhZX1JGQ1RMX0NNRF9FTik7Cit9CisKKyNkZWZpbmUgbnRhYl91cGxvYWQoZGV2LCBvZmZzZXQsIGRhdGEpIGRvIHsgXAorCQl1bnNpZ25lZCBpbnQgaTsJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCAob2Zmc2V0IyNfU0laRSk7IGkrKykJCQlcCisJCQliNDNfbnRhYl93cml0ZShkZXYsIChvZmZzZXQpICsgaSwgKGRhdGEpW2ldKTsJXAorCX0gd2hpbGUgKDApCisKKy8qIFVwbG9hZCB0aGUgTi1QSFkgdGFibGVzLiAqLworc3RhdGljIHZvaWQgYjQzX25waHlfdGFibGVzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCS8qIFN0YXRpYyB0YWJsZXMgKi8KKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0ZSQU1FU1RSVUNULCBiNDNfbnRhYl9mcmFtZXN0cnVjdCk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9GUkFNRUxULCBiNDNfbnRhYl9mcmFtZWxvb2t1cCk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UTUFQLCBiNDNfbnRhYl90bWFwKTsKKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1REVFJOLCBiNDNfbnRhYl90ZHRybik7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9JTlRMRVZFTCwgYjQzX250YWJfaW50bGV2ZWwpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfUElMT1QsIGI0M19udGFiX3BpbG90KTsKKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1BJTE9UTFQsIGI0M19udGFiX3BpbG90bHQpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJMjBBMCwgYjQzX250YWJfdGRpMjBhMCk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9UREkyMEExLCBiNDNfbnRhYl90ZGkyMGExKTsKKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX1RESTQwQTAsIGI0M19udGFiX3RkaTQwYTApOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfVERJNDBBMSwgYjQzX250YWJfdGRpNDBhMSk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9CREksIGI0M19udGFiX2JkaSk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DSEFORVNULCBiNDNfbnRhYl9jaGFubmVsZXN0KTsKKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX01DUywgYjQzX250YWJfbWNzKTsKKworCS8qIFZvbGF0aWxlIHRhYmxlcyAqLworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfTk9JU0VWQVIxMCwgYjQzX250YWJfbm9pc2V2YXIxMCk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9OT0lTRVZBUjExLCBiNDNfbnRhYl9ub2lzZXZhcjExKTsKKwludGFiX3VwbG9hZChkZXYsIEI0M19OVEFCX0MwX0VTVFBMVCwgYjQzX250YWJfZXN0aW1hdGVwb3dlcmx0MCk7CisJbnRhYl91cGxvYWQoZGV2LCBCNDNfTlRBQl9DMV9FU1RQTFQsIGI0M19udGFiX2VzdGltYXRlcG93ZXJsdDEpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfQURKUExULCBiNDNfbnRhYl9hZGp1c3Rwb3dlcjApOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfQURKUExULCBiNDNfbnRhYl9hZGp1c3Rwb3dlcjEpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfR0FJTkNUTCwgYjQzX250YWJfZ2FpbmN0bDApOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfR0FJTkNUTCwgYjQzX250YWJfZ2FpbmN0bDEpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfSVFMVCwgYjQzX250YWJfaXFsdDApOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfSVFMVCwgYjQzX250YWJfaXFsdDEpOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzBfTE9GRUVEVEgsIGI0M19udGFiX2xvZnRsdDApOworCW50YWJfdXBsb2FkKGRldiwgQjQzX05UQUJfQzFfTE9GRUVEVEgsIGI0M19udGFiX2xvZnRsdDEpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV93b3JrYXJvdW5kcyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfSVFGTElQLAorCQkgICAgQjQzX05QSFlfSVFGTElQX0FEQzEgfCBCNDNfTlBIWV9JUUZMSVBfQURDMik7CisJaWYgKDEgLyogRklYTUUgYmFuZCBpcyAyLjRHSHogKi8pIHsKKwkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DTEFTU0NUTCwKKwkJCSAgICBCNDNfTlBIWV9DTEFTU0NUTF9DQ0tFTik7CisJfSBlbHNlIHsKKwkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQ0xBU1NDVEwsCisJCQkgICAgIH5CNDNfTlBIWV9DTEFTU0NUTF9DQ0tFTik7CisJfQorCWI0M19yYWRpb19zZXQoZGV2LCBCMjA1NV9DMV9UWF9SRl9TUEFSRSwgMHg4KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGUkFNRURFTEFZLCA4KTsKKworCS8qIEZpeHVwIHNvbWUgdGFibGVzICovCisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDApLCAweEEpOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDEwKSwgMHhBKTsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwMiksIDB4Q0RBQSk7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTIpLCAweENEQUEpOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDA4KSwgMCk7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTgpLCAwKTsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwNyksIDB4N0FBQik7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTcpLCAweDdBQUIpOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDA2KSwgMHg4MDApOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDE2KSwgMHg4MDApOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX0xPMSwgMHgyRDgpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDEsIDB4MzAxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8yLCAweDJEOCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMiwgMHgzMDEpOworCisJLy9UT0RPIHNldCBSRiBzZXF1ZW5jZQorCisJLyogU2V0IG5hcnJvd2JhbmQgY2xpcCB0aHJlc2hvbGQgKi8KKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfTkJDTElQVEhSRVMsIDY2KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfTkJDTElQVEhSRVMsIDY2KTsKKworCS8qIFNldCB3aWRlYmFuZCBjbGlwIDIgdGhyZXNob2xkICovCisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVMsCisJCQl+QjQzX05QSFlfQzFfQ0xJUFdCVEhSRVNfQ0xJUDIsCisJCQkyMSA8PCBCNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMl9TSElGVCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVMsCisJCQl+QjQzX05QSFlfQzJfQ0xJUFdCVEhSRVNfQ0xJUDIsCisJCQkyMSA8PCBCNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMl9TSElGVCk7CisKKwkvKiBTZXQgQ2xpcCAyIGRldGVjdCAqLworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQzFfQ0dBSU5JLAorCQkgICAgQjQzX05QSFlfQzFfQ0dBSU5JX0NMMkRFVEVDVCk7CisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DMl9DR0FJTkksCisJCSAgICBCNDNfTlBIWV9DMl9DR0FJTklfQ0wyREVURUNUKTsKKworCWlmICgwIC8qRklYTUUqLykgeworCQkvKiBTZXQgZHdlbGwgbGVuZ3RocyAqLworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ0xJUDFfTkJEV0VMTF9MRU4sIDQzKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0NMSVAyX05CRFdFTExfTEVOLCA0Myk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9XMUNMSVAxX0RXRUxMX0xFTiwgOSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9XMUNMSVAyX0RXRUxMX0xFTiwgOSk7CisKKwkJLyogU2V0IGdhaW4gYmFja29mZiAqLworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMV9DR0FJTkksCisJCQkJfkI0M19OUEhZX0MxX0NHQUlOSV9HQUlOQktPRkYsCisJCQkJMSA8PCBCNDNfTlBIWV9DMV9DR0FJTklfR0FJTkJLT0ZGX1NISUZUKTsKKwkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0dBSU5JLAorCQkJCX5CNDNfTlBIWV9DMl9DR0FJTklfR0FJTkJLT0ZGLAorCQkJCTEgPDwgQjQzX05QSFlfQzJfQ0dBSU5JX0dBSU5CS09GRl9TSElGVCk7CisKKwkJLyogU2V0IEhQVkdBMiBpbmRleCAqLworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMV9JTklUR0FJTiwKKwkJCQl+QjQzX05QSFlfQzFfSU5JVEdBSU5fSFBWR0EyLAorCQkJCTYgPDwgQjQzX05QSFlfQzFfSU5JVEdBSU5fSFBWR0EyX1NISUZUKTsKKwkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfSU5JVEdBSU4sCisJCQkJfkI0M19OUEhZX0MyX0lOSVRHQUlOX0hQVkdBMiwKKwkJCQk2IDw8IEI0M19OUEhZX0MyX0lOSVRHQUlOX0hQVkdBMl9TSElGVCk7CisKKwkJLy9GSVhNRSB2ZXJpZnkgdGhhdCB0aGUgc3BlY3MgcmVhbGx5IG1lYW4gdG8gdXNlIGF1dG9pbmMgaGVyZS4KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig3LCAweDEwNikgKyBpLCAweDY3Myk7CisJfQorCisJLyogU2V0IG1pbmltdW0gZ2FpbiB2YWx1ZSAqLworCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX01JTk1BWF9HQUlOLAorCQkJfkI0M19OUEhZX0MxX01JTkdBSU4sCisJCQkyMyA8PCBCNDNfTlBIWV9DMV9NSU5HQUlOX1NISUZUKTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9NSU5NQVhfR0FJTiwKKwkJCX5CNDNfTlBIWV9DMl9NSU5HQUlOLAorCQkJMjMgPDwgQjQzX05QSFlfQzJfTUlOR0FJTl9TSElGVCk7CisKKwlpZiAocGh5LT5yZXYgPCAyKSB7CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1NDUkFNX1NJR0NUTCwKKwkJCSAgICAgfkI0M19OUEhZX1NDUkFNX1NJR0NUTF9TQ00pOworCX0KKworCS8qIFNldCBwaGFzZSB0cmFjayBhbHBoYSBhbmQgYmV0YSAqLworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0EwLCAweDEyNSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQTEsIDB4MUIzKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMiwgMHgxMDUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IwLCAweDE2RSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQjEsIDB4Q0QpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IyLCAweDIwKTsKK30KKworc3RhdGljIHZvaWQgYjQzX25waHlfcmVzZXRfY2NhKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwl1MTYgYmJjZmc7CisKKwlzc2Jfd3JpdGUzMihkZXYtPmRldiwgU1NCX1RNU0xPVywKKwkJICAgIHNzYl9yZWFkMzIoZGV2LT5kZXYsIFNTQl9UTVNMT1cpIHwgU1NCX1RNU0xPV19GR0MpOworCWJiY2ZnID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQkJDRkcpOworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQkJDRkcsIEI0M19OUEhZX0JCQ0ZHX1JTVENDQSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JCQ0ZHLAorCQkgICAgICBiYmNmZyAmIH5CNDNfTlBIWV9CQkNGR19SU1RDQ0EpOworCXNzYl93cml0ZTMyKGRldi0+ZGV2LCBTU0JfVE1TTE9XLAorCQkgICAgc3NiX3JlYWQzMihkZXYtPmRldiwgU1NCX1RNU0xPVykgJiB+U1NCX1RNU0xPV19GR0MpOworfQorCitlbnVtIGI0M19ucGh5X3JmX3NlcXVlbmNlIHsKKwlCNDNfUkZTRVFfUlgyVFgsCisJQjQzX1JGU0VRX1RYMlJYLAorCUI0M19SRlNFUV9SRVNFVDJSWCwKKwlCNDNfUkZTRVFfVVBEQVRFX0dBSU5ILAorCUI0M19SRlNFUV9VUERBVEVfR0FJTkwsCisJQjQzX1JGU0VRX1VQREFURV9HQUlOVSwKK307CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X2ZvcmNlX3JmX3NlcXVlbmNlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICAgICAgZW51bSBiNDNfbnBoeV9yZl9zZXF1ZW5jZSBzZXEpCit7CisJc3RhdGljIGNvbnN0IHUxNiB0cmlnZ2VyW10gPSB7CisJCVtCNDNfUkZTRVFfUlgyVFhdCQk9IEI0M19OUEhZX1JGU0VRVFJfUlgyVFgsCisJCVtCNDNfUkZTRVFfVFgyUlhdCQk9IEI0M19OUEhZX1JGU0VRVFJfVFgyUlgsCisJCVtCNDNfUkZTRVFfUkVTRVQyUlhdCQk9IEI0M19OUEhZX1JGU0VRVFJfUlNUMlJYLAorCQlbQjQzX1JGU0VRX1VQREFURV9HQUlOSF0JPSBCNDNfTlBIWV9SRlNFUVRSX1VQR0gsCisJCVtCNDNfUkZTRVFfVVBEQVRFX0dBSU5MXQk9IEI0M19OUEhZX1JGU0VRVFJfVVBHTCwKKwkJW0I0M19SRlNFUV9VUERBVEVfR0FJTlVdCT0gQjQzX05QSFlfUkZTRVFUUl9VUEdVLAorCX07CisJaW50IGk7CisKKwlCNDNfV0FSTl9PTihzZXEgPj0gQVJSQVlfU0laRSh0cmlnZ2VyKSk7CisKKwliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwKKwkJICAgIEI0M19OUEhZX1JGU0VRTU9ERV9DQU9WRVIgfCBCNDNfTlBIWV9SRlNFUU1PREVfVFJPVkVSKTsKKwliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGU0VRVFIsIHRyaWdnZXJbc2VxXSk7CisJZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCWlmICghKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGU0VRU1QpICYgdHJpZ2dlcltzZXFdKSkKKwkJCWdvdG8gb2s7CisJCW1zbGVlcCgxKTsKKwl9CisJYjQzZXJyKGRldi0+d2wsICJSRiBzZXF1ZW5jZSBzdGF0dXMgdGltZW91dFxuIik7CitvazoKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsCisJCSAgICAgfihCNDNfTlBIWV9SRlNFUU1PREVfQ0FPVkVSIHwgQjQzX05QSFlfUkZTRVFNT0RFX1RST1ZFUikpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9icGh5X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXVuc2lnbmVkIGludCBpOworCXUxNiB2YWw7CisKKwl2YWwgPSAweDFFMUY7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTl9CTU9ERSgweDg4ICsgaSksIHZhbCk7CisJCXZhbCAtPSAweDIwMjsKKwl9CisJdmFsID0gMHgzRTNGOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHg5NyArIGkpLCB2YWwpOworCQl2YWwgLT0gMHgyMDI7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHgzOCksIDB4NjY4KTsKK30KKworLyogUlNTSSBDYWxpYnJhdGlvbiAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcnNzaV9jYWwoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCB0eXBlKQoreworCS8vVE9ETworfQorCitpbnQgYjQzX3BoeV9pbml0bihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwl1MTYgdG1wOworCisJLy9UT0RPOiBTcGVjdHJhbCBtYW5hZ2VtZW50CisJYjQzX25waHlfdGFibGVzX2luaXQoZGV2KTsKKworCS8qIENsZWFyIGFsbCBvdmVycmlkZXMgKi8KKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfT1ZFUiwgMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMxLCAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfSU5UQzIsIDApOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMywgMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEM0LCAwKTsKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsCisJCSAgICAgfihCNDNfTlBIWV9SRlNFUU1PREVfQ0FPVkVSIHwKKwkJICAgICAgIEI0M19OUEhZX1JGU0VRTU9ERV9UUk9WRVIpKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDApOworCisJdG1wID0gKHBoeS0+cmV2IDwgMikgPyA2NCA6IDU5OworCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMywKKwkJCX5CNDNfTlBIWV9CUEhZX0NUTDNfU0NBTEUsCisJCQl0bXAgPDwgQjQzX05QSFlfQlBIWV9DVEwzX1NDQUxFX1NISUZUKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVTRVFfVFgyUlhfUFVEXzIwTSwgMHgyMCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfNDBNLCAweDIwKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWFJFQUxGRCwgMTg0KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfTUlNT19DUlNUWEVYVCwgMjAwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUExPQURfQ1NFTlNFX0VYVExFTiwgODApOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9CQ0xJUEJLT0ZGLCA1MTEpOworCisJLy9UT0RPIE1JTU8tQ29uZmlnCisJLy9UT0RPIFVwZGF0ZSBUWC9SWCBjaGFpbgorCisJaWYgKHBoeS0+cmV2IDwgMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRFVQNDBfR0ZCTCwgMHhBQTgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRFVQNDBfQkwsIDB4OUE0KTsKKwl9CisJYjQzX25waHlfd29ya2Fyb3VuZHMoZGV2KTsKKwliNDNfbnBoeV9yZXNldF9jY2EoZGV2KTsKKworCXNzYl93cml0ZTMyKGRldi0+ZGV2LCBTU0JfVE1TTE9XLAorCQkgICAgc3NiX3JlYWQzMihkZXYtPmRldiwgU1NCX1RNU0xPVykgfCBCNDNfVE1TTE9XX01BQ1BIWUNMS0VOKTsKKwliNDNfbnBoeV9mb3JjZV9yZl9zZXF1ZW5jZShkZXYsIEI0M19SRlNFUV9SWDJUWCk7CisJYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2UoZGV2LCBCNDNfUkZTRVFfUkVTRVQyUlgpOworCisJYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQ0xBU1NDVEwpOyAvKiBkdW1teSByZWFkICovCisJLy9UT0RPIHJlYWQgY29yZTEvMiBjbGlwMSB0aHJlcyByZWdzCisKKwlpZiAoMSAvKiBGSVhNRSBCYW5kIGlzIDIuNEdIeiAqLykKKwkJYjQzX25waHlfYnBoeV9pbml0KGRldik7CisJLy9UT0RPIGRpc2FibGUgVFggcG93ZXIgY29udHJvbAorCS8vVE9ETyBGaXggdGhlIFRYIHBvd2VyIHNldHRpbmdzCisJLy9UT0RPIEluaXQgcGVyaW9kaWMgY2FsaWJyYXRpb24gd2l0aCByZWFzb24gMworCWI0M19ucGh5X3Jzc2lfY2FsKGRldiwgMik7CisJYjQzX25waHlfcnNzaV9jYWwoZGV2LCAwKTsKKwliNDNfbnBoeV9yc3NpX2NhbChkZXYsIDEpOworCS8vVE9ETyBnZXQgVFggZ2FpbgorCS8vVE9ETyBpbml0IHN1cGVyc3dpdGNoCisJLy9UT0RPIGNhbGlicmF0ZSBMTworCS8vVE9ETyBpZGxlIFRTU0kgVFggcGN0bAorCS8vVE9ETyBUWCBwb3dlciBjb250cm9sIHBvd2VyIHNldHVwCisJLy9UT0RPIHRhYmxlIHdyaXRlcworCS8vVE9ETyBUWCBwb3dlciBjb250cm9sIGNvZWZmaWNpZW50cworCS8vVE9ETyBlbmFibGUgVFggcG93ZXIgY29udHJvbAorCS8vVE9ETyBjb250cm9sIGFudGVubmEgc2VsZWN0aW9uCisJLy9UT0RPIGluaXQgcmFkYXIgZGV0ZWN0aW9uCisJLy9UT0RPIHJlc2V0IGNoYW5uZWwgaWYgY2hhbmdlZAorCisJYjQzZXJyKGRldi0+d2wsICJJRUVFIDgwMi4xMW4gZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZCwgeWV0LlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYjQzX25waHlfb3BfYWxsb2NhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X24gKm5waHk7CisKKwlucGh5ID0ga3phbGxvYyhzaXplb2YoKm5waHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5waHkpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+cGh5Lm4gPSBucGh5OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X29wX3ByZXBhcmVfc3RydWN0cyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gcGh5LT5uOworCisJbWVtc2V0KG5waHksIDAsIHNpemVvZigqbnBoeSkpOworCisJLy9UT0RPIGluaXQgc3RydWN0IGI0M19waHlfbgorfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9vcF9mcmVlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBwaHktPm47CisKKwlrZnJlZShucGh5KTsKKwlwaHktPm4gPSBOVUxMOworfQorCitzdGF0aWMgaW50IGI0M19ucGh5X29wX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXJldHVybiBiNDNfcGh5X2luaXRuKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19waHlyZWcoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgb2Zmc2V0KQoreworI2lmIEI0M19ERUJVRworCWlmICgob2Zmc2V0ICYgQjQzX1BIWVJPVVRFKSA9PSBCNDNfUEhZUk9VVEVfT0ZETV9HUEhZKSB7CisJCS8qIE9GRE0gcmVnaXN0ZXJzIGFyZSBvbm5seSBhdmFpbGFibGUgb24gQS9HLVBIWXMgKi8KKwkJYjQzZXJyKGRldi0+d2wsICJJbnZhbGlkIE9GRE0gUEhZIGFjY2VzcyBhdCAiCisJCSAgICAgICAiMHglMDRYIG9uIE4tUEhZXG4iLCBvZmZzZXQpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCWlmICgob2Zmc2V0ICYgQjQzX1BIWVJPVVRFKSA9PSBCNDNfUEhZUk9VVEVfRVhUX0dQSFkpIHsKKwkJLyogRXh0LUcgcmVnaXN0ZXJzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBHLVBIWXMgKi8KKwkJYjQzZXJyKGRldi0+d2wsICJJbnZhbGlkIEVYVC1HIFBIWSBhY2Nlc3MgYXQgIgorCQkgICAgICAgIjB4JTA0WCBvbiBOLVBIWVxuIiwgb2Zmc2V0KTsKKwkJZHVtcF9zdGFjaygpOworCX0KKyNlbmRpZiAvKiBCNDNfREVCVUcgKi8KK30KKworc3RhdGljIHUxNiBiNDNfbnBoeV9vcF9yZWFkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZykKK3sKKwljaGVja19waHlyZWcoZGV2LCByZWcpOworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUEhZX0NPTlRST0wsIHJlZyk7CisJcmV0dXJuIGI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19QSFlfREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X29wX3dyaXRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHJlZywgdTE2IHZhbHVlKQoreworCWNoZWNrX3BoeXJlZyhkZXYsIHJlZyk7CisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19QSFlfQ09OVFJPTCwgcmVnKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1BIWV9EQVRBLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB1MTYgYjQzX25waHlfb3BfcmFkaW9fcmVhZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcpCit7CisJLyogUmVnaXN0ZXIgMSBpcyBhIDMyLWJpdCByZWdpc3Rlci4gKi8KKwlCNDNfV0FSTl9PTihyZWcgPT0gMSk7CisJLyogTi1QSFkgbmVlZHMgMHgxMDAgZm9yIHJlYWQgYWNjZXNzICovCisJcmVnIHw9IDB4MTAwOworCisJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19SQURJT19DT05UUk9MLCByZWcpOworCXJldHVybiBiNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fUkFESU9fREFUQV9MT1cpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9vcF9yYWRpb193cml0ZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwkvKiBSZWdpc3RlciAxIGlzIGEgMzItYml0IHJlZ2lzdGVyLiAqLworCUI0M19XQVJOX09OKHJlZyA9PSAxKTsKKworCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fUkFESU9fQ09OVFJPTCwgcmVnKTsKKwliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1JBRElPX0RBVEFfTE9XLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X29wX3NvZnR3YXJlX3Jma2lsbChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJCWVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQorey8vVE9ETworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9vcF9zd2l0Y2hfYW5hbG9nKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBvbikKK3sKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsCisJCSAgICAgIG9uID8gMCA6IDB4N0ZGRik7Cit9CisKK3N0YXRpYyBpbnQgYjQzX25waHlfb3Bfc3dpdGNoX2NoYW5uZWwoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBuZXdfY2hhbm5lbCkKK3sKKwlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CisJCWlmICgobmV3X2NoYW5uZWwgPCAxKSB8fCAobmV3X2NoYW5uZWwgPiAxNCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAobmV3X2NoYW5uZWwgPiAyMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gbnBoeV9jaGFubmVsX3N3aXRjaChkZXYsIG5ld19jaGFubmVsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiNDNfbnBoeV9vcF9nZXRfZGVmYXVsdF9jaGFuKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMzY7Cit9CisKK2NvbnN0IHN0cnVjdCBiNDNfcGh5X29wZXJhdGlvbnMgYjQzX3BoeW9wc19uID0geworCS5hbGxvY2F0ZQkJPSBiNDNfbnBoeV9vcF9hbGxvY2F0ZSwKKwkuZnJlZQkJCT0gYjQzX25waHlfb3BfZnJlZSwKKwkucHJlcGFyZV9zdHJ1Y3RzCT0gYjQzX25waHlfb3BfcHJlcGFyZV9zdHJ1Y3RzLAorCS5pbml0CQkJPSBiNDNfbnBoeV9vcF9pbml0LAorCS5waHlfcmVhZAkJPSBiNDNfbnBoeV9vcF9yZWFkLAorCS5waHlfd3JpdGUJCT0gYjQzX25waHlfb3Bfd3JpdGUsCisJLnJhZGlvX3JlYWQJCT0gYjQzX25waHlfb3BfcmFkaW9fcmVhZCwKKwkucmFkaW9fd3JpdGUJCT0gYjQzX25waHlfb3BfcmFkaW9fd3JpdGUsCisJLnNvZnR3YXJlX3Jma2lsbAk9IGI0M19ucGh5X29wX3NvZnR3YXJlX3Jma2lsbCwKKwkuc3dpdGNoX2FuYWxvZwkJPSBiNDNfbnBoeV9vcF9zd2l0Y2hfYW5hbG9nLAorCS5zd2l0Y2hfY2hhbm5lbAkJPSBiNDNfbnBoeV9vcF9zd2l0Y2hfY2hhbm5lbCwKKwkuZ2V0X2RlZmF1bHRfY2hhbgk9IGI0M19ucGh5X29wX2dldF9kZWZhdWx0X2NoYW4sCisJLnJlY2FsY190eHBvd2VyCQk9IGI0M19ucGh5X29wX3JlY2FsY190eHBvd2VyLAorCS5hZGp1c3RfdHhwb3dlcgkJPSBiNDNfbnBoeV9vcF9hZGp1c3RfdHhwb3dlciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDlhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uaApAQCAtMCwwICsxLDkzMCBAQAorI2lmbmRlZiBCNDNfTlBIWV9IXworI2RlZmluZSBCNDNfTlBIWV9IXworCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgorCisKKy8qIE4tUEhZIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBCNDNfTlBIWV9CQkNGRwkJCQlCNDNfUEhZX04oMHgwMDEpIC8qIEJCIGNvbmZpZyAqLworI2RlZmluZSAgQjQzX05QSFlfQkJDRkdfUlNUQ0NBCQkJMHg0MDAwIC8qIFJlc2V0IENDQSAqLworI2RlZmluZSAgQjQzX05QSFlfQkJDRkdfUlNUUlgJCQkweDgwMDAgLyogUmVzZXQgUlggKi8KKyNkZWZpbmUgQjQzX05QSFlfQ0hBTk5FTAkJCUI0M19QSFlfTigweDAwNSkgLyogQ2hhbm5lbCAqLworI2RlZmluZSBCNDNfTlBIWV9UWEVSUgkJCQlCNDNfUEhZX04oMHgwMDcpIC8qIFRYIGVycm9yICovCisjZGVmaW5lIEI0M19OUEhZX0JBTkRDVEwJCQlCNDNfUEhZX04oMHgwMDkpIC8qIEJhbmQgY29udHJvbCAqLworI2RlZmluZSAgQjQzX05QSFlfQkFORENUTF81R0haCQkJMHgwMDAxIC8qIFVzZSB0aGUgNUdIeiBiYW5kICovCisjZGVmaW5lIEI0M19OUEhZXzRXSV9BRERSCQkJQjQzX1BIWV9OKDB4MDBCKSAvKiBGb3VyLXdpcmUgYnVzIGFkZHJlc3MgKi8KKyNkZWZpbmUgQjQzX05QSFlfNFdJX0RBVEFISQkJCUI0M19QSFlfTigweDAwQykgLyogRm91ci13aXJlIGJ1cyBkYXRhIGhpZ2ggKi8KKyNkZWZpbmUgQjQzX05QSFlfNFdJX0RBVEFMTwkJCUI0M19QSFlfTigweDAwRCkgLyogRm91ci13aXJlIGJ1cyBkYXRhIGxvdyAqLworI2RlZmluZSBCNDNfTlBIWV9CSVNUX1NUQVQwCQkJQjQzX1BIWV9OKDB4MDBFKSAvKiBCdWlsdC1pbiBzZWxmIHRlc3Qgc3RhdHVzIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfQklTVF9TVEFUMQkJCUI0M19QSFlfTigweDAwRikgLyogQnVpbHQtaW4gc2VsZiB0ZXN0IHN0YXR1cyAxICovCisKKyNkZWZpbmUgQjQzX05QSFlfQzFfREVTUFdSCQkJQjQzX1BIWV9OKDB4MDE4KSAvKiBDb3JlIDEgZGVzaXJlZCBwb3dlciAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9DQ0tfREVTUFdSCQkJQjQzX1BIWV9OKDB4MDE5KSAvKiBDb3JlIDEgQ0NLIGRlc2lyZWQgcG93ZXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQkNMSVBCS09GRgkJCUI0M19QSFlfTigweDAxQSkgLyogQ29yZSAxIGJhcmVseSBjbGlwIGJhY2tvZmYgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQ0NLX0JDTElQQktPRkYJCUI0M19QSFlfTigweDAxQikgLyogQ29yZSAxIENDSyBiYXJlbHkgY2xpcCBiYWNrb2ZmICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0NHQUlOSQkJCUI0M19QSFlfTigweDAxQykgLyogQ29yZSAxIGNvbXB1dGUgZ2FpbiBpbmZvICovCisjZGVmaW5lICBCNDNfTlBIWV9DMV9DR0FJTklfR0FJTkJLT0ZGCQkweDAwMUYgLyogR2FpbiBiYWNrb2ZmICovCisjZGVmaW5lICBCNDNfTlBIWV9DMV9DR0FJTklfR0FJTkJLT0ZGX1NISUZUCTAKKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9DTElQR0JLT0ZGCQkweDAzRTAgLyogQ2xpcCBnYWluIGJhY2tvZmYgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9DTElQR0JLT0ZGX1NISUZUCTUKKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NHQUlOSV9HQUlOU1RFUAkJMHgxQzAwIC8qIEdhaW4gc3RlcCAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfQ0dBSU5JX0dBSU5TVEVQX1NISUZUCTEwCisjZGVmaW5lICBCNDNfTlBIWV9DMV9DR0FJTklfQ0wyREVURUNUCQkweDIwMDAgLyogQ2xpcCAyIGRldGVjdCBtYXNrICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0NDS19DR0FJTkkJCQlCNDNfUEhZX04oMHgwMUQpIC8qIENvcmUgMSBDQ0sgY29tcHV0ZSBnYWluIGluZm8gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NDS19DR0FJTklfR0FJTkJLT0ZGCTB4MDAxRiAvKiBHYWluIGJhY2tvZmYgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NDS19DR0FJTklfQ0xJUEdCS09GRgkweDAxRTAgLyogQ0NLIGJhcmVseSBjbGlwIGdhaW4gYmFja29mZiAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9NSU5NQVhfR0FJTgkJCUI0M19QSFlfTigweDAxRSkgLyogQ29yZSAxIG1pbi9tYXggZ2FpbiAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfTUlOR0FJTgkJCTB4MDBGRiAvKiBNaW5pbXVtIGdhaW4gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX01JTkdBSU5fU0hJRlQJCTAKKyNkZWZpbmUgIEI0M19OUEhZX0MxX01BWEdBSU4JCQkweEZGMDAgLyogTWF4aW11bSBnYWluICovCisjZGVmaW5lICBCNDNfTlBIWV9DMV9NQVhHQUlOX1NISUZUCQk4CisjZGVmaW5lIEI0M19OUEhZX0MxX0NDS19NSU5NQVhfR0FJTgkJQjQzX1BIWV9OKDB4MDFGKSAvKiBDb3JlIDEgQ0NLIG1pbi9tYXggZ2FpbiAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfQ0NLX01JTkdBSU4JCTB4MDBGRiAvKiBNaW5pbXVtIGdhaW4gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NDS19NSU5HQUlOX1NISUZUCQkwCisjZGVmaW5lICBCNDNfTlBIWV9DMV9DQ0tfTUFYR0FJTgkJMHhGRjAwIC8qIE1heGltdW0gZ2FpbiAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfQ0NLX01BWEdBSU5fU0hJRlQJCTgKKyNkZWZpbmUgQjQzX05QSFlfQzFfSU5JVEdBSU4JCQlCNDNfUEhZX04oMHgwMjApIC8qIENvcmUgMSBpbml0aWFsIGdhaW4gY29kZSAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfSU5JVEdBSU5fRVhUTE5BCQkweDAwMDEgLyogRXh0ZXJuYWwgTE5BIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9DMV9JTklUR0FJTl9MTkEJCTB4MDAwNiAvKiBMTkEgaW5kZXggKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0xOQUlEWF9TSElGVAkxCisjZGVmaW5lICBCNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTEJCTB4MDA3OCAvKiBIUFZHQTEgaW5kZXggKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0hQVkdBMV9TSElGVAkzCisjZGVmaW5lICBCNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTIJCTB4MEY4MCAvKiBIUFZHQTIgaW5kZXggKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX0hQVkdBMl9TSElGVAk3CisjZGVmaW5lICBCNDNfTlBIWV9DMV9JTklUR0FJTl9UUlJYCQkweDEwMDAgLyogVFIgUlggaW5kZXggKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0lOSVRHQUlOX1RSVFgJCTB4MjAwMCAvKiBUUiBUWCBpbmRleCAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9DTElQMV9ISUdBSU4JCUI0M19QSFlfTigweDAyMSkgLyogQ29yZSAxIGNsaXAxIGhpZ2ggZ2FpbiBjb2RlICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0NMSVAxX01FREdBSU4JCUI0M19QSFlfTigweDAyMikgLyogQ29yZSAxIGNsaXAxIG1lZGl1bSBnYWluIGNvZGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUDFfTE9HQUlOCQlCNDNfUEhZX04oMHgwMjMpIC8qIENvcmUgMSBjbGlwMSBsb3cgZ2FpbiBjb2RlICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0NMSVAyX0dBSU4JCQlCNDNfUEhZX04oMHgwMjQpIC8qIENvcmUgMSBjbGlwMiBnYWluIGNvZGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfRklMVEVSR0FJTgkJCUI0M19QSFlfTigweDAyNSkgLyogQ29yZSAxIGZpbHRlciBnYWluICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0xQRl9RSFBGX0JXCQkJQjQzX1BIWV9OKDB4MDI2KSAvKiBDb3JlIDEgTFBGIFEgSFAgRiBiYW5kd2lkdGggKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVMJCQlCNDNfUEhZX04oMHgwMjcpIC8qIENvcmUgMSBjbGlwIHdpZGViYW5kIHRocmVzaG9sZCAqLworI2RlZmluZSAgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVNfQ0xJUDIJCTB4MDAzRiAvKiBDbGlwIDIgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTX0NMSVAyX1NISUZUCTAKKyNkZWZpbmUgIEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTX0NMSVAxCQkweDBGQzAgLyogQ2xpcCAxICovCisjZGVmaW5lICBCNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMV9TSElGVAk2CisjZGVmaW5lIEI0M19OUEhZX0MxX1cxVEhSRVMJCQlCNDNfUEhZX04oMHgwMjgpIC8qIENvcmUgMSBXMSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfRURUSFJFUwkJCUI0M19QSFlfTigweDAyOSkgLyogQ29yZSAxIEVEIHRocmVzaG9sZCAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9TTVNJR1RIUkVTCQkJQjQzX1BIWV9OKDB4MDJBKSAvKiBDb3JlIDEgc21hbGwgc2lnIHRocmVzaG9sZCAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9OQkNMSVBUSFJFUwkJCUI0M19QSFlfTigweDAyQikgLyogQ29yZSAxIE5CIGNsaXAgdGhyZXNob2xkICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0NMSVAxVEhSRVMJCQlCNDNfUEhZX04oMHgwMkMpIC8qIENvcmUgMSBjbGlwMSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQ0xJUDJUSFJFUwkJCUI0M19QSFlfTigweDAyRCkgLyogQ29yZSAxIGNsaXAyIHRocmVzaG9sZCAqLworCisjZGVmaW5lIEI0M19OUEhZX0MyX0RFU1BXUgkJCUI0M19QSFlfTigweDAyRSkgLyogQ29yZSAyIGRlc2lyZWQgcG93ZXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfQ0NLX0RFU1BXUgkJCUI0M19QSFlfTigweDAyRikgLyogQ29yZSAyIENDSyBkZXNpcmVkIHBvd2VyICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0JDTElQQktPRkYJCQlCNDNfUEhZX04oMHgwMzApIC8qIENvcmUgMiBiYXJlbHkgY2xpcCBiYWNrb2ZmICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0NDS19CQ0xJUEJLT0ZGCQlCNDNfUEhZX04oMHgwMzEpIC8qIENvcmUgMiBDQ0sgYmFyZWx5IGNsaXAgYmFja29mZiAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9DR0FJTkkJCQlCNDNfUEhZX04oMHgwMzIpIC8qIENvcmUgMiBjb21wdXRlIGdhaW4gaW5mbyAqLworI2RlZmluZSAgQjQzX05QSFlfQzJfQ0dBSU5JX0dBSU5CS09GRgkJMHgwMDFGIC8qIEdhaW4gYmFja29mZiAqLworI2RlZmluZSAgQjQzX05QSFlfQzJfQ0dBSU5JX0dBSU5CS09GRl9TSElGVAkwCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfQ0xJUEdCS09GRgkJMHgwM0UwIC8qIENsaXAgZ2FpbiBiYWNrb2ZmICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfQ0xJUEdCS09GRl9TSElGVAk1CisjZGVmaW5lICBCNDNfTlBIWV9DMl9DR0FJTklfR0FJTlNURVAJCTB4MUMwMCAvKiBHYWluIHN0ZXAgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX0NHQUlOSV9HQUlOU1RFUF9TSElGVAkxMAorI2RlZmluZSAgQjQzX05QSFlfQzJfQ0dBSU5JX0NMMkRFVEVDVAkJMHgyMDAwIC8qIENsaXAgMiBkZXRlY3QgbWFzayAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JCQkJQjQzX1BIWV9OKDB4MDMzKSAvKiBDb3JlIDIgQ0NLIGNvbXB1dGUgZ2FpbiBpbmZvICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JX0dBSU5CS09GRgkweDAwMUYgLyogR2FpbiBiYWNrb2ZmICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JX0NMSVBHQktPRkYJMHgwMUUwIC8qIENDSyBiYXJlbHkgY2xpcCBnYWluIGJhY2tvZmYgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfTUlOTUFYX0dBSU4JCQlCNDNfUEhZX04oMHgwMzQpIC8qIENvcmUgMiBtaW4vbWF4IGdhaW4gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX01JTkdBSU4JCQkweDAwRkYgLyogTWluaW11bSBnYWluICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9NSU5HQUlOX1NISUZUCQkwCisjZGVmaW5lICBCNDNfTlBIWV9DMl9NQVhHQUlOCQkJMHhGRjAwIC8qIE1heGltdW0gZ2FpbiAqLworI2RlZmluZSAgQjQzX05QSFlfQzJfTUFYR0FJTl9TSElGVAkJOAorI2RlZmluZSBCNDNfTlBIWV9DMl9DQ0tfTUlOTUFYX0dBSU4JCUI0M19QSFlfTigweDAzNSkgLyogQ29yZSAyIENDSyBtaW4vbWF4IGdhaW4gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX0NDS19NSU5HQUlOCQkweDAwRkYgLyogTWluaW11bSBnYWluICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DQ0tfTUlOR0FJTl9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfQzJfQ0NLX01BWEdBSU4JCTB4RkYwMCAvKiBNYXhpbXVtIGdhaW4gKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX0NDS19NQVhHQUlOX1NISUZUCQk4CisjZGVmaW5lIEI0M19OUEhZX0MyX0lOSVRHQUlOCQkJQjQzX1BIWV9OKDB4MDM2KSAvKiBDb3JlIDIgaW5pdGlhbCBnYWluIGNvZGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX0lOSVRHQUlOX0VYVExOQQkJMHgwMDAxIC8qIEV4dGVybmFsIExOQSBpbmRleCAqLworI2RlZmluZSAgQjQzX05QSFlfQzJfSU5JVEdBSU5fTE5BCQkweDAwMDYgLyogTE5BIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9MTkFJRFhfU0hJRlQJMQorI2RlZmluZSAgQjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0ExCQkweDAwNzggLyogSFBWR0ExIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9IUFZHQTFfU0hJRlQJMworI2RlZmluZSAgQjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0EyCQkweDBGODAgLyogSFBWR0EyIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9IUFZHQTJfU0hJRlQJNworI2RlZmluZSAgQjQzX05QSFlfQzJfSU5JVEdBSU5fVFJSWAkJMHgxMDAwIC8qIFRSIFJYIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9JTklUR0FJTl9UUlRYCQkweDIwMDAgLyogVFIgVFggaW5kZXggKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfQ0xJUDFfSElHQUlOCQlCNDNfUEhZX04oMHgwMzcpIC8qIENvcmUgMiBjbGlwMSBoaWdoIGdhaW4gY29kZSAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9DTElQMV9NRURHQUlOCQlCNDNfUEhZX04oMHgwMzgpIC8qIENvcmUgMiBjbGlwMSBtZWRpdW0gZ2FpbiBjb2RlICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0NMSVAxX0xPR0FJTgkJQjQzX1BIWV9OKDB4MDM5KSAvKiBDb3JlIDIgY2xpcDEgbG93IGdhaW4gY29kZSAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9DTElQMl9HQUlOCQkJQjQzX1BIWV9OKDB4MDNBKSAvKiBDb3JlIDIgY2xpcDIgZ2FpbiBjb2RlICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0ZJTFRFUkdBSU4JCQlCNDNfUEhZX04oMHgwM0IpIC8qIENvcmUgMiBmaWx0ZXIgZ2FpbiAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9MUEZfUUhQRl9CVwkJCUI0M19QSFlfTigweDAzQykgLyogQ29yZSAyIExQRiBRIEhQIEYgYmFuZHdpZHRoICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTCQkJQjQzX1BIWV9OKDB4MDNEKSAvKiBDb3JlIDIgY2xpcCB3aWRlYmFuZCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAyCQkweDAwM0YgLyogQ2xpcCAyICovCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMl9TSElGVAkwCisjZGVmaW5lICBCNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMQkJMHgwRkMwIC8qIENsaXAgMSAqLworI2RlZmluZSAgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVNfQ0xJUDFfU0hJRlQJNgorI2RlZmluZSBCNDNfTlBIWV9DMl9XMVRIUkVTCQkJQjQzX1BIWV9OKDB4MDNFKSAvKiBDb3JlIDIgVzEgdGhyZXNob2xkICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0VEVEhSRVMJCQlCNDNfUEhZX04oMHgwM0YpIC8qIENvcmUgMiBFRCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfU01TSUdUSFJFUwkJCUI0M19QSFlfTigweDA0MCkgLyogQ29yZSAyIHNtYWxsIHNpZyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfTkJDTElQVEhSRVMJCQlCNDNfUEhZX04oMHgwNDEpIC8qIENvcmUgMiBOQiBjbGlwIHRocmVzaG9sZCAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9DTElQMVRIUkVTCQkJQjQzX1BIWV9OKDB4MDQyKSAvKiBDb3JlIDIgY2xpcDEgdGhyZXNob2xkICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0NMSVAyVEhSRVMJCQlCNDNfUEhZX04oMHgwNDMpIC8qIENvcmUgMiBjbGlwMiB0aHJlc2hvbGQgKi8KKworI2RlZmluZSBCNDNfTlBIWV9DUlNfVEhSRVMxCQkJQjQzX1BIWV9OKDB4MDQ0KSAvKiBDUlMgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1JTX1RIUkVTMgkJCUI0M19QSFlfTigweDA0NSkgLyogQ1JTIHRocmVzaG9sZCAyICovCisjZGVmaW5lIEI0M19OUEhZX0NSU19USFJFUzMJCQlCNDNfUEhZX04oMHgwNDYpIC8qIENSUyB0aHJlc2hvbGQgMyAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNDVEwJCQkJQjQzX1BIWV9OKDB4MDQ3KSAvKiBDUlMgY29udHJvbCAqLworI2RlZmluZSBCNDNfTlBIWV9EQ0ZBRERSCQkJQjQzX1BIWV9OKDB4MDQ4KSAvKiBEQyBmaWx0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9OVU0wCQkJQjQzX1BIWV9OKDB4MDQ5KSAvKiBSWCBmaWx0ZXIgMjAgbnVtZXJhdG9yIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGMjBfTlVNMQkJCUI0M19QSFlfTigweDA0QSkgLyogUlggZmlsdGVyIDIwIG51bWVyYXRvciAxICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjIwX05VTTIJCQlCNDNfUEhZX04oMHgwNEIpIC8qIFJYIGZpbHRlciAyMCBudW1lcmF0b3IgMiAqLworI2RlZmluZSBCNDNfTlBIWV9SWEYyMF9ERU5PTTAJCQlCNDNfUEhZX04oMHgwNEMpIC8qIFJYIGZpbHRlciAyMCBkZW5vbWluYXRvciAwICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjIwX0RFTk9NMQkJCUI0M19QSFlfTigweDA0RCkgLyogUlggZmlsdGVyIDIwIGRlbm9taW5hdG9yIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGMjBfTlVNMTAJCQlCNDNfUEhZX04oMHgwNEUpIC8qIFJYIGZpbHRlciAyMCBudW1lcmF0b3IgMTAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGMjBfTlVNMTEJCQlCNDNfUEhZX04oMHgwNEYpIC8qIFJYIGZpbHRlciAyMCBudW1lcmF0b3IgMTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGMjBfTlVNMTIJCQlCNDNfUEhZX04oMHgwNTApIC8qIFJYIGZpbHRlciAyMCBudW1lcmF0b3IgMTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGMjBfREVOT00xMAkJCUI0M19QSFlfTigweDA1MSkgLyogUlggZmlsdGVyIDIwIGRlbm9taW5hdG9yIDEwICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjIwX0RFTk9NMTEJCQlCNDNfUEhZX04oMHgwNTIpIC8qIFJYIGZpbHRlciAyMCBkZW5vbWluYXRvciAxMSAqLworI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9OVU0wCQkJQjQzX1BIWV9OKDB4MDUzKSAvKiBSWCBmaWx0ZXIgNDAgbnVtZXJhdG9yIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGNDBfTlVNMQkJCUI0M19QSFlfTigweDA1NCkgLyogUlggZmlsdGVyIDQwIG51bWVyYXRvciAxICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjQwX05VTTIJCQlCNDNfUEhZX04oMHgwNTUpIC8qIFJYIGZpbHRlciA0MCBudW1lcmF0b3IgMiAqLworI2RlZmluZSBCNDNfTlBIWV9SWEY0MF9ERU5PTTAJCQlCNDNfUEhZX04oMHgwNTYpIC8qIFJYIGZpbHRlciA0MCBkZW5vbWluYXRvciAwICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjQwX0RFTk9NMQkJCUI0M19QSFlfTigweDA1NykgLyogUlggZmlsdGVyIDQwIGRlbm9taW5hdG9yIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGNDBfTlVNMTAJCQlCNDNfUEhZX04oMHgwNTgpIC8qIFJYIGZpbHRlciA0MCBudW1lcmF0b3IgMTAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGNDBfTlVNMTEJCQlCNDNfUEhZX04oMHgwNTkpIC8qIFJYIGZpbHRlciA0MCBudW1lcmF0b3IgMTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGNDBfTlVNMTIJCQlCNDNfUEhZX04oMHgwNUEpIC8qIFJYIGZpbHRlciA0MCBudW1lcmF0b3IgMTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhGNDBfREVOT00xMAkJCUI0M19QSFlfTigweDA1QikgLyogUlggZmlsdGVyIDQwIGRlbm9taW5hdG9yIDEwICovCisjZGVmaW5lIEI0M19OUEhZX1JYRjQwX0RFTk9NMTEJCQlCNDNfUEhZX04oMHgwNUMpIC8qIFJYIGZpbHRlciA0MCBkZW5vbWluYXRvciAxMSAqLworI2RlZmluZSBCNDNfTlBIWV9QUFJPQ19SU1RMRU4JCQlCNDNfUEhZX04oMHgwNjApIC8qIFBhY2tldCBwcm9jZXNzaW5nIHJlc2V0IGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9JTklUQ0FSUl9ETEVOCQkJQjQzX1BIWV9OKDB4MDYxKSAvKiBJbml0aWFsIGNhcnJpZXIgZGV0ZWN0aW9uIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9DTElQMUNBUlJfRExFTgkJCUI0M19QSFlfTigweDA2MikgLyogQ2xpcDEgY2FycmllciBkZXRlY3Rpb24gbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX0NMSVAyQ0FSUl9ETEVOCQkJQjQzX1BIWV9OKDB4MDYzKSAvKiBDbGlwMiBjYXJyaWVyIGRldGVjdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfSU5JVEdBSU5fU0xFTgkJCUI0M19QSFlfTigweDA2NCkgLyogSW5pdGlhbCBnYWluIHNldHRsZSBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfQ0xJUDFHQUlOX1NMRU4JCQlCNDNfUEhZX04oMHgwNjUpIC8qIENsaXAxIGdhaW4gc2V0dGxlIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9DTElQMkdBSU5fU0xFTgkJCUI0M19QSFlfTigweDA2NikgLyogQ2xpcDIgZ2FpbiBzZXR0bGUgbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX1BBQ0tHQUlOX1NMRU4JCQlCNDNfUEhZX04oMHgwNjcpIC8qIFBhY2tldCBnYWluIHNldHRsZSBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfQ0FSUlNSQ19UTEVOCQkJQjQzX1BIWV9OKDB4MDY4KSAvKiBDYXJyaWVyIHNlYXJjaCB0aW1lb3V0IGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9USVNSQ19UTEVOCQkJQjQzX1BIWV9OKDB4MDY5KSAvKiBUaW1pbmcgc2VhcmNoIHRpbWVvdXQgbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX0VORFJPUF9UTEVOCQkJQjQzX1BIWV9OKDB4MDZBKSAvKiBFbmVyZ3kgZHJvcCB0aW1lb3V0IGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9DTElQMV9OQkRXRUxMX0xFTgkJQjQzX1BIWV9OKDB4MDZCKSAvKiBDbGlwMSBOQiBkd2VsbCBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfQ0xJUDJfTkJEV0VMTF9MRU4JCUI0M19QSFlfTigweDA2QykgLyogQ2xpcDIgTkIgZHdlbGwgbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX1cxQ0xJUDFfRFdFTExfTEVOCQlCNDNfUEhZX04oMHgwNkQpIC8qIFcxIGNsaXAxIGR3ZWxsIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9XMUNMSVAyX0RXRUxMX0xFTgkJQjQzX1BIWV9OKDB4MDZFKSAvKiBXMSBjbGlwMiBkd2VsbCBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfVzJDTElQMV9EV0VMTF9MRU4JCUI0M19QSFlfTigweDA2RikgLyogVzIgY2xpcDEgZHdlbGwgbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX1BMT0FEX0NTRU5TRV9FWFRMRU4JCUI0M19QSFlfTigweDA3MCkgLyogUGF5bG9hZCBjYXJyaWVyIHNlbnNlIGV4dGVuc2lvbiBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfRURST1BfQ1NFTlNFX0VYVExFTgkJQjQzX1BIWV9OKDB4MDcxKSAvKiBFbmVyZ3kgZHJvcCBjYXJyaWVyIHNlbnNlIGV4dGVuc2lvbiBsZW5ndGggKi8KKyNkZWZpbmUgQjQzX05QSFlfVEFCTEVfQUREUgkJCUI0M19QSFlfTigweDA3MikgLyogVGFibGUgYWRkcmVzcyAqLworI2RlZmluZSBCNDNfTlBIWV9UQUJMRV9EQVRBTE8JCQlCNDNfUEhZX04oMHgwNzMpIC8qIFRhYmxlIGRhdGEgbG93ICovCisjZGVmaW5lIEI0M19OUEhZX1RBQkxFX0RBVEFISQkJCUI0M19QSFlfTigweDA3NCkgLyogVGFibGUgZGF0YSBoaWdoICovCisjZGVmaW5lIEI0M19OUEhZX1dXSVNFX0xFTklEWAkJCUI0M19QSFlfTigweDA3NSkgLyogV1dpU0UgbGVuZ3RoIGluZGV4ICovCisjZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfTEVOSURYCQkJQjQzX1BIWV9OKDB4MDc2KSAvKiBUR05zeW5jIGxlbmd0aCBpbmRleCAqLworI2RlZmluZSBCNDNfTlBIWV9UWE1BQ0lGX0hPTERPRkYJCUI0M19QSFlfTigweDA3NykgLyogVFggTUFDIElGIEhvbGQgb2ZmICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0NNRAkJCUI0M19QSFlfTigweDA3OCkgLyogUkYgY29udHJvbCAoY29tbWFuZCkgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9TVEFSVAkJMHgwMDAxIC8qIFN0YXJ0IHNlcXVlbmNlICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfUlhUWAkJMHgwMDAyIC8qIFJYL1RYICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTAkJMHgwMDM4IC8qIENvcmUgc2VsZWN0ICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTF9TSElGVAkzCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfUE9SRk9SQ0UJCTB4MDA0MCAvKiBQT1IgZm9yY2UgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9PRVBPUkZPUkNFCQkweDAwODAgLyogT0UgUE9SIGZvcmNlICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfUlhFTgkJMHgwMTAwIC8qIFJYIGVuYWJsZSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfQ01EX1RYRU4JCTB4MDIwMCAvKiBUWCBlbmFibGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9DSElQMFBVCQkweDA0MDAgLyogQ2hpcDAgUFUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9FTgkJCTB4MDgwMCAvKiBSYWRpbyBlbmFibGVkICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9DTURfU0VRRU5DT1JFCQkweEYwMDAgLyogU2VxIGVuIGNvcmUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX0NNRF9TRVFFTkNPUkVfU0hJRlQJMTIKKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlNTSU8xCQkJQjQzX1BIWV9OKDB4MDdBKSAvKiBSRiBjb250cm9sIChSU1NJIG90aGVycyAxKSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX1JYUEQJCTB4MDAwMSAvKiBSWCBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX1RYUEQJCTB4MDAwMiAvKiBUWCBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX1BBUEQJCTB4MDAwNCAvKiBQQSBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8xX1JTU0lDVEwJCTB4MDAzMCAvKiBSU1NJIGNvbnRyb2wgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMV9MUEZCVwkJMHgwMEMwIC8qIExQRiBiYW5kd2lkdGggKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMV9IUEZCV0hJCQkweDAxMDAgLyogSFBGIGJhbmR3aWR0aCBoaWdoICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzFfSElRRElTQ08JCTB4MDIwMCAvKiBISVEgZGlzIGNvcmUgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlhHMQkJCUI0M19QSFlfTigweDA3QikgLyogUkYgY29udHJvbCAoUlggZ2FpbiAxKSAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9UWEcxCQkJQjQzX1BIWV9OKDB4MDdDKSAvKiBSRiBjb250cm9sIChUWCBnYWluIDEpICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1JTU0lPMgkJCUI0M19QSFlfTigweDA3RCkgLyogUkYgY29udHJvbCAoUlNTSSBvdGhlcnMgMikgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9SWFBECQkweDAwMDEgLyogUlggUEQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9UWFBECQkweDAwMDIgLyogVFggUEQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9QQVBECQkweDAwMDQgLyogUEEgUEQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPMl9SU1NJQ1RMCQkweDAwMzAgLyogUlNTSSBjb250cm9sICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzJfTFBGQlcJCTB4MDBDMCAvKiBMUEYgYmFuZHdpZHRoICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzJfSFBGQldISQkJMHgwMTAwIC8qIEhQRiBiYW5kd2lkdGggaGlnaCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8yX0hJUURJU0NPCQkweDAyMDAgLyogSElRIGRpcyBjb3JlICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1JYRzIJCQlCNDNfUEhZX04oMHgwN0UpIC8qIFJGIGNvbnRyb2wgKFJYIGdhaW4gMikgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfVFhHMgkJCUI0M19QSFlfTigweDA3RikgLyogUkYgY29udHJvbCAoVFggZ2FpbiAyKSAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SU1NJTzMJCQlCNDNfUEhZX04oMHgwODApIC8qIFJGIGNvbnRyb2wgKFJTU0kgb3RoZXJzIDMpICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfUlhQRAkJMHgwMDAxIC8qIFJYIFBEICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfVFhQRAkJMHgwMDAyIC8qIFRYIFBEICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfUEFQRAkJMHgwMDA0IC8qIFBBIFBEICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzNfUlNTSUNUTAkJMHgwMDMwIC8qIFJTU0kgY29udHJvbCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8zX0xQRkJXCQkweDAwQzAgLyogTFBGIGJhbmR3aWR0aCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU8zX0hQRkJXSEkJCTB4MDEwMCAvKiBIUEYgYmFuZHdpZHRoIGhpZ2ggKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPM19ISVFESVNDTwkJMHgwMjAwIC8qIEhJUSBkaXMgY29yZSAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9SWEczCQkJQjQzX1BIWV9OKDB4MDgxKSAvKiBSRiBjb250cm9sIChSWCBnYWluIDMpICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX1RYRzMJCQlCNDNfUEhZX04oMHgwODIpIC8qIFJGIGNvbnRyb2wgKFRYIGdhaW4gMykgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlNTSU80CQkJQjQzX1BIWV9OKDB4MDgzKSAvKiBSRiBjb250cm9sIChSU1NJIG90aGVycyA0KSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X1JYUEQJCTB4MDAwMSAvKiBSWCBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X1RYUEQJCTB4MDAwMiAvKiBUWCBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X1BBUEQJCTB4MDAwNCAvKiBQQSBQRCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZDVExfUlNTSU80X1JTU0lDVEwJCTB4MDAzMCAvKiBSU1NJIGNvbnRyb2wgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPNF9MUEZCVwkJMHgwMEMwIC8qIExQRiBiYW5kd2lkdGggKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGQ1RMX1JTU0lPNF9IUEZCV0hJCQkweDAxMDAgLyogSFBGIGJhbmR3aWR0aCBoaWdoICovCisjZGVmaW5lICBCNDNfTlBIWV9SRkNUTF9SU1NJTzRfSElRRElTQ08JCTB4MDIwMCAvKiBISVEgZGlzIGNvcmUgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfUlhHNAkJCUI0M19QSFlfTigweDA4NCkgLyogUkYgY29udHJvbCAoUlggZ2FpbiA0KSAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9UWEc0CQkJQjQzX1BIWV9OKDB4MDg1KSAvKiBSRiBjb250cm9sIChUWCBnYWluIDQpICovCisjZGVmaW5lIEI0M19OUEhZX0MxX1RYSVFfQ09NUF9PRkYJCUI0M19QSFlfTigweDA4NykgLyogQ29yZSAxIFRYIEkvUSBjb21wIG9mZnNldCAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9UWElRX0NPTVBfT0ZGCQlCNDNfUEhZX04oMHgwODgpIC8qIENvcmUgMiBUWCBJL1EgY29tcCBvZmZzZXQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfVFhDVEwJCQlCNDNfUEhZX04oMHgwOEIpIC8qIENvcmUgMSBUWCBjb250cm9sICovCisjZGVmaW5lIEI0M19OUEhZX0MyX1RYQ1RMCQkJQjQzX1BIWV9OKDB4MDhDKSAvKiBDb3JlIDIgVFggY29udHJvbCAqLworI2RlZmluZSBCNDNfTlBIWV9TQ1JBTV9TSUdDVEwJCQlCNDNfUEhZX04oMHgwOTApIC8qIFNjcmFtIHNpZ25hbCBjb250cm9sICovCisjZGVmaW5lICBCNDNfTlBIWV9TQ1JBTV9TSUdDVExfSU5JVFNUCQkweDAwN0YgLyogSW5pdGlhbCBzdGF0ZSB2YWx1ZSAqLworI2RlZmluZSAgQjQzX05QSFlfU0NSQU1fU0lHQ1RMX0lOSVRTVF9TSElGVAkwCisjZGVmaW5lICBCNDNfTlBIWV9TQ1JBTV9TSUdDVExfU0NNCQkweDAwODAgLyogU2NyYW0gY29udHJvbCBtb2RlICovCisjZGVmaW5lICBCNDNfTlBIWV9TQ1JBTV9TSUdDVExfU0lDRQkJMHgwMTAwIC8qIFNjcmFtIGluZGV4IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lICBCNDNfTlBIWV9TQ1JBTV9TSUdDVExfU1RBUlQJCTB4RkUwMCAvKiBTY3JhbSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1NDUkFNX1NJR0NUTF9TVEFSVF9TSElGVAk5CisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0lOVEMxCQkJQjQzX1BIWV9OKDB4MDkxKSAvKiBSRiBjb250cm9sIChpbnRjIDEpICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0lOVEMyCQkJQjQzX1BIWV9OKDB4MDkyKSAvKiBSRiBjb250cm9sIChpbnRjIDIpICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0lOVEMzCQkJQjQzX1BIWV9OKDB4MDkzKSAvKiBSRiBjb250cm9sIChpbnRjIDMpICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0lOVEM0CQkJQjQzX1BIWV9OKDB4MDk0KSAvKiBSRiBjb250cm9sIChpbnRjIDQpICovCisjZGVmaW5lIEI0M19OUEhZX05SRFRPX1dXSVNFCQkJQjQzX1BIWV9OKDB4MDk1KSAvKiAjIGRhdGF0b25lcyBXV2lTRSAqLworI2RlZmluZSBCNDNfTlBIWV9OUkRUT19UR05TWU5DCQkJQjQzX1BIWV9OKDB4MDk2KSAvKiAjIGRhdGF0b25lcyBUR05zeW5jICovCisjZGVmaW5lIEI0M19OUEhZX1NJR0ZNT0RfV1dJU0UJCQlCNDNfUEhZX04oMHgwOTcpIC8qIFNpZ25hbCBmaWVsZCBtb2QgV1dpU0UgKi8KKyNkZWZpbmUgQjQzX05QSFlfTEVHX1NJR0ZNT0RfMTFOCQlCNDNfUEhZX04oMHgwOTgpIC8qIExlZ2FjeSBzaWduYWwgZmllbGQgbW9kIDExbiAqLworI2RlZmluZSBCNDNfTlBIWV9IVF9TSUdGTU9EXzExTgkJCUI0M19QSFlfTigweDA5OSkgLyogSFQgc2lnbmFsIGZpZWxkIG1vZCAxMW4gKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfUlhJUV9DT01QQTAJCQlCNDNfUEhZX04oMHgwOUEpIC8qIENvcmUgMSBSWCBJL1EgY29tcCBBMCAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9SWElRX0NPTVBCMAkJCUI0M19QSFlfTigweDA5QikgLyogQ29yZSAxIFJYIEkvUSBjb21wIEIwICovCisjZGVmaW5lIEI0M19OUEhZX0MyX1JYSVFfQ09NUEExCQkJQjQzX1BIWV9OKDB4MDlDKSAvKiBDb3JlIDIgUlggSS9RIGNvbXAgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfUlhJUV9DT01QQjEJCQlCNDNfUEhZX04oMHgwOUQpIC8qIENvcmUgMiBSWCBJL1EgY29tcCBCMSAqLworI2RlZmluZSBCNDNfTlBIWV9SWENUTAkJCQlCNDNfUEhZX04oMHgwQTApIC8qIFJYIGNvbnRyb2wgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JYQ1RMX0JTRUxVMjAJCQkweDAwMTAgLyogQmFuZCBzZWxlY3QgdXBwZXIgMjAgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JYQ1RMX1JJRlNFTgkJCTB4MDA4MCAvKiBSSUZTIGVuYWJsZSAqLworI2RlZmluZSBCNDNfTlBIWV9SRlNFUU1PREUJCQlCNDNfUEhZX04oMHgwQTEpIC8qIFJGIHNlcSBtb2RlICovCisjZGVmaW5lICBCNDNfTlBIWV9SRlNFUU1PREVfQ0FPVkVSCQkweDAwMDEgLyogQ29yZSBhY3RpdmUgb3ZlcnJpZGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGU0VRTU9ERV9UUk9WRVIJCTB4MDAwMiAvKiBUcmlnZ2VyIG92ZXJyaWRlICovCisjZGVmaW5lIEI0M19OUEhZX1JGU0VRQ0EJCQlCNDNfUEhZX04oMHgwQTIpIC8qIFJGIHNlcSBjb3JlIGFjdGl2ZSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFDQV9UWEVOCQkJMHgwMDBGIC8qIFRYIGVuYWJsZSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFDQV9UWEVOX1NISUZUCQkwCisjZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1JYRU4JCQkweDAwRjAgLyogUlggZW5hYmxlICovCisjZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1JYRU5fU0hJRlQJCTQKKyNkZWZpbmUgIEI0M19OUEhZX1JGU0VRQ0FfVFhESVMJCQkweDBGMDAgLyogVFggZGlzYWJsZSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFDQV9UWERJU19TSElGVAkJOAorI2RlZmluZSAgQjQzX05QSFlfUkZTRVFDQV9SWERJUwkJCTB4RjAwMCAvKiBSWCBkaXNhYmxlICovCisjZGVmaW5lICBCNDNfTlBIWV9SRlNFUUNBX1JYRElTX1NISUZUCQkxMgorI2RlZmluZSBCNDNfTlBIWV9SRlNFUVRSCQkJQjQzX1BIWV9OKDB4MEEzKSAvKiBSRiBzZXEgdHJpZ2dlciAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFUUl9SWDJUWAkJCTB4MDAwMSAvKiBSWDJUWCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFUUl9UWDJSWAkJCTB4MDAwMiAvKiBUWDJSWCAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFUUl9VUEdICQkJMHgwMDA0IC8qIFVwZGF0ZSBnYWluIEggKi8KKyNkZWZpbmUgIEI0M19OUEhZX1JGU0VRVFJfVVBHTAkJCTB4MDAwOCAvKiBVcGRhdGUgZ2FpbiBMICovCisjZGVmaW5lICBCNDNfTlBIWV9SRlNFUVRSX1VQR1UJCQkweDAwMTAgLyogVXBkYXRlIGdhaW4gVSAqLworI2RlZmluZSAgQjQzX05QSFlfUkZTRVFUUl9SU1QyUlgJCTB4MDAyMCAvKiBSZXNldCB0byBSWCAqLworI2RlZmluZSBCNDNfTlBIWV9SRlNFUVNUCQkJQjQzX1BIWV9OKDB4MEE0KSAvKiBSRiBzZXEgc3RhdHVzLiBWYWx1ZXMgc2FtZSBhcyB0cmlnZ2VyLiAqLworI2RlZmluZSBCNDNfTlBIWV9BRkVDVExfT1ZFUgkJCUI0M19QSFlfTigweDBBNSkgLyogQUZFIGNvbnRyb2wgb3ZlcnJpZGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0MxCQkJQjQzX1BIWV9OKDB4MEE2KSAvKiBBRkUgY29udHJvbCBjb3JlIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0MyCQkJQjQzX1BIWV9OKDB4MEE3KSAvKiBBRkUgY29udHJvbCBjb3JlIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0MzCQkJQjQzX1BIWV9OKDB4MEE4KSAvKiBBRkUgY29udHJvbCBjb3JlIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0M0CQkJQjQzX1BIWV9OKDB4MEE5KSAvKiBBRkUgY29udHJvbCBjb3JlIDQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0RBQ0dBSU4xCQlCNDNfUEhZX04oMHgwQUEpIC8qIEFGRSBjb250cm9sIERBQyBnYWluIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0RBQ0dBSU4yCQlCNDNfUEhZX04oMHgwQUIpIC8qIEFGRSBjb250cm9sIERBQyBnYWluIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0RBQ0dBSU4zCQlCNDNfUEhZX04oMHgwQUMpIC8qIEFGRSBjb250cm9sIERBQyBnYWluIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFQ1RMX0RBQ0dBSU40CQlCNDNfUEhZX04oMHgwQUQpIC8qIEFGRSBjb250cm9sIERBQyBnYWluIDQgKi8KKyNkZWZpbmUgQjQzX05QSFlfU1RSX0FERFIxCQkJQjQzX1BIWV9OKDB4MEFFKSAvKiBTVFIgYWRkcmVzcyAxICovCisjZGVmaW5lIEI0M19OUEhZX1NUUl9BRERSMgkJCUI0M19QSFlfTigweDBBRikgLyogU1RSIGFkZHJlc3MgMiAqLworI2RlZmluZSBCNDNfTlBIWV9DTEFTU0NUTAkJCUI0M19QSFlfTigweDBCMCkgLyogQ2xhc3NpZmllciBjb250cm9sICovCisjZGVmaW5lICBCNDNfTlBIWV9DTEFTU0NUTF9DQ0tFTgkJMHgwMDAxIC8qIENDSyBlbmFibGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0NMQVNTQ1RMX09GRE1FTgkJMHgwMDAyIC8qIE9GRE0gZW5hYmxlICovCisjZGVmaW5lICBCNDNfTlBIWV9DTEFTU0NUTF9XQUlURURFTgkJMHgwMDA0IC8qIFdhaXRlZCBlbmFibGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFGTElQCQkJCUI0M19QSFlfTigweDBCMSkgLyogSS9RIGZsaXAgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lRRkxJUF9BREMxCQkJMHgwMDAxIC8qIEFEQzEgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lRRkxJUF9BREMyCQkJMHgwMDEwIC8qIEFEQzIgKi8KKyNkZWZpbmUgQjQzX05QSFlfU0lTT19TTlJfVEhSRVMJCQlCNDNfUEhZX04oMHgwQjIpIC8qIFNJU08gU05SIHRocmVzaG9sZCAqLworI2RlZmluZSBCNDNfTlBIWV9TSUdNQV9OX01VTFQJCQlCNDNfUEhZX04oMHgwQjMpIC8qIFNpZ21hIE4gbXVsdGlwbGllciAqLworI2RlZmluZSBCNDNfTlBIWV9UWE1BQ0RFTEFZCQkJQjQzX1BIWV9OKDB4MEI0KSAvKiBUWCBNQUMgZGVsYXkgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGUkFNRURFTEFZCQkJQjQzX1BIWV9OKDB4MEI1KSAvKiBUWCBmcmFtZSBkZWxheSAqLworI2RlZmluZSBCNDNfTlBIWV9NTFBBUk0JCQkJQjQzX1BIWV9OKDB4MEI2KSAvKiBNTCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEI0M19OUEhZX01MQ1RMCQkJCUI0M19QSFlfTigweDBCNykgLyogTUwgY29udHJvbCAqLworI2RlZmluZSBCNDNfTlBIWV9XV0lTRV8yME5DWUNEQVQJCUI0M19QSFlfTigweDBCOCkgLyogV1dpU0UgMjAgTiBjeWMgZGF0YSAqLworI2RlZmluZSBCNDNfTlBIWV9XV0lTRV80ME5DWUNEQVQJCUI0M19QSFlfTigweDBCOSkgLyogV1dpU0UgNDAgTiBjeWMgZGF0YSAqLworI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DXzIwTkNZQ0RBVAkJQjQzX1BIWV9OKDB4MEJBKSAvKiBUR05zeW5jIDIwIE4gY3ljIGRhdGEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ180ME5DWUNEQVQJCUI0M19QSFlfTigweDBCQikgLyogVEdOc3luYyA0MCBOIGN5YyBkYXRhICovCisjZGVmaW5lIEI0M19OUEhZX0lOSVRTV0laUAkJCUI0M19QSFlfTigweDBCQykgLyogSW5pdGlhbCBzd2l6emxlIHBhdHRlcm4gKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhUQUlMQ05UCQkJQjQzX1BIWV9OKDB4MEJEKSAvKiBUWCB0YWlsIGNvdW50IHZhbHVlICovCisjZGVmaW5lIEI0M19OUEhZX0JQSFlfQ1RMMQkJCUI0M19QSFlfTigweDBCRSkgLyogQiBQSFkgY29udHJvbCAxICovCisjZGVmaW5lIEI0M19OUEhZX0JQSFlfQ1RMMgkJCUI0M19QSFlfTigweDBCRikgLyogQiBQSFkgY29udHJvbCAyICovCisjZGVmaW5lICBCNDNfTlBIWV9CUEhZX0NUTDJfTFVUCQkJMHgwMDFGIC8qIExVVCBpbmRleCAqLworI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwyX0xVVF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwyX01BQ0RFTAkJMHg3RkUwIC8qIE1BQyBkZWxheSAqLworI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwyX01BQ0RFTF9TSElGVAk1CisjZGVmaW5lIEI0M19OUEhZX0lRTE9DQUxfQ01ECQkJQjQzX1BIWV9OKDB4MEMwKSAvKiBJL1EgTE8gY2FsIGNvbW1hbmQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lRTE9DQUxfQ01EX0VOCQkweDgwMDAKKyNkZWZpbmUgQjQzX05QSFlfSVFMT0NBTF9DTUROTlVNCQlCNDNfUEhZX04oMHgwQzEpIC8qIEkvUSBMTyBjYWwgY29tbWFuZCBOIG51bSAqLworI2RlZmluZSBCNDNfTlBIWV9JUUxPQ0FMX0NNREdDVEwJCUI0M19QSFlfTigweDBDMikgLyogSS9RIExPIGNhbCBjb21tYW5kIEcgY29udHJvbCAqLworI2RlZmluZSBCNDNfTlBIWV9TQU1QX0NNRAkJCUI0M19QSFlfTigweDBDMykgLyogU2FtcGxlIGNvbW1hbmQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1NBTVBfQ01EX1NUT1AJCQkweDAwMDIgLyogU3RvcCAqLworI2RlZmluZSBCNDNfTlBIWV9TQU1QX0xPT1BDTlQJCQlCNDNfUEhZX04oMHgwQzQpIC8qIFNhbXBsZSBsb29wIGNvdW50ICovCisjZGVmaW5lIEI0M19OUEhZX1NBTVBfV0FJVENOVAkJCUI0M19QSFlfTigweDBDNSkgLyogU2FtcGxlIHdhaXQgY291bnQgKi8KKyNkZWZpbmUgQjQzX05QSFlfU0FNUF9ERVBDTlQJCQlCNDNfUEhZX04oMHgwQzYpIC8qIFNhbXBsZSBkZXB0aCBjb3VudCAqLworI2RlZmluZSBCNDNfTlBIWV9TQU1QX1NUQVQJCQlCNDNfUEhZX04oMHgwQzcpIC8qIFNhbXBsZSBzdGF0dXMgKi8KKyNkZWZpbmUgQjQzX05QSFlfR1BJT19MT09FTgkJCUI0M19QSFlfTigweDBDOCkgLyogR1BJTyBsb3cgb3V0IGVuYWJsZSAqLworI2RlZmluZSBCNDNfTlBIWV9HUElPX0hJT0VOCQkJQjQzX1BIWV9OKDB4MEM5KSAvKiBHUElPIGhpZ2ggb3V0IGVuYWJsZSAqLworI2RlZmluZSBCNDNfTlBIWV9HUElPX1NFTAkJCUI0M19QSFlfTigweDBDQSkgLyogR1BJTyBzZWxlY3QgKi8KKyNkZWZpbmUgQjQzX05QSFlfR1BJT19DTEtDVEwJCQlCNDNfUEhZX04oMHgwQ0IpIC8qIEdQSU8gY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19BUzAJCQlCNDNfUEhZX04oMHgwQ0MpIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBBIHN0YWdlIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQVMxCQkJQjQzX1BIWV9OKDB4MENEKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQSBzdGFnZSAxICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0FTMgkJCUI0M19QSFlfTigweDBDRSkgLyogVFggZmlsdGVyIDIwIGNvZWZmIEEgc3RhZ2UgMiAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19CMzJTMAkJCUI0M19QSFlfTigweDBDRikgLyogVFggZmlsdGVyIDIwIGNvZWZmIEIzMiBzdGFnZSAwICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0IxUzAJCQlCNDNfUEhZX04oMHgwRDApIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBCMSBzdGFnZSAwICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl8yMENPX0IzMlMxCQkJQjQzX1BIWV9OKDB4MEQxKSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQjMyIHN0YWdlIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQjFTMQkJCUI0M19QSFlfTigweDBEMikgLyogVFggZmlsdGVyIDIwIGNvZWZmIEIxIHN0YWdlIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fQjMyUzIJCQlCNDNfUEhZX04oMHgwRDMpIC8qIFRYIGZpbHRlciAyMCBjb2VmZiBCMzIgc3RhZ2UgMiAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfMjBDT19CMVMyCQkJQjQzX1BIWV9OKDB4MEQ0KSAvKiBUWCBmaWx0ZXIgMjAgY29lZmYgQjEgc3RhZ2UgMiAqLworI2RlZmluZSBCNDNfTlBIWV9TSUdGTERUT0wJCQlCNDNfUEhZX04oMHgwRDUpIC8qIFNpZ25hbCBmbGQgdG9sZXJhbmNlICovCisjZGVmaW5lIEI0M19OUEhZX1RYU0VSRkxECQkJQjQzX1BIWV9OKDB4MEQ2KSAvKiBUWCBzZXJ2aWNlIGZpZWxkICovCisjZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9SWDJUWF9QVUQJCUI0M19QSFlfTigweDBENykgLyogQUZFIHNlcSBSWDJUWCBwb3dlciB1cC9kb3duIGRlbGF5ICovCisjZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVUQJCUI0M19QSFlfTigweDBEOCkgLyogQUZFIHNlcSBUWDJSWCBwb3dlciB1cC9kb3duIGRlbGF5ICovCisjZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfU0NSQU1JMAkJQjQzX1BIWV9OKDB4MEQ5KSAvKiBUR05zeW5jIHNjcmFtIGluaXQgMCAqLworI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DX1NDUkFNSTEJCUI0M19QSFlfTigweDBEQSkgLyogVEdOc3luYyBzY3JhbSBpbml0IDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfSU5JVFNXSVpQQVRUTEVHCQlCNDNfUEhZX04oMHgwREIpIC8qIEluaXRpYWwgc3dpenpsZSBwYXR0ZXJuIGxlZyAqLworI2RlZmluZSBCNDNfTlBIWV9CUEhZX0NUTDMJCQlCNDNfUEhZX04oMHgwREMpIC8qIEIgUEhZIGNvbnRyb2wgMyAqLworI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwzX1NDQUxFCQkweDAwRkYgLyogU2NhbGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0JQSFlfQ1RMM19TQ0FMRV9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwzX0ZTQwkJCTB4RkYwMCAvKiBGcmFtZSBzdGFydCBjb3VudCB2YWx1ZSAqLworI2RlZmluZSAgQjQzX05QSFlfQlBIWV9DVEwzX0ZTQ19TSElGVAkJOAorI2RlZmluZSBCNDNfTlBIWV9CUEhZX0NUTDQJCQlCNDNfUEhZX04oMHgwREQpIC8qIEIgUEhZIGNvbnRyb2wgNCAqLworI2RlZmluZSBCNDNfTlBIWV9DMV9UWEJCTVVMVAkJCUI0M19QSFlfTigweDBERSkgLyogQ29yZSAxIFRYIEJCIG11bHRpcGxpZXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfVFhCQk1VTFQJCQlCNDNfUEhZX04oMHgwREYpIC8qIENvcmUgMiBUWCBCQiBtdWx0aXBsaWVyICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0FTMAkJCUI0M19QSFlfTigweDBFMSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIEEgc3RhZ2UgMCAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19BUzEJCQlCNDNfUEhZX04oMHgwRTIpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBBIHN0YWdlIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQVMyCQkJQjQzX1BIWV9OKDB4MEUzKSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQSBzdGFnZSAyICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0IzMlMwCQkJQjQzX1BIWV9OKDB4MEU0KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQjMyIHN0YWdlIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQjFTMAkJCUI0M19QSFlfTigweDBFNSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIEIxIHN0YWdlIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fQjMyUzEJCQlCNDNfUEhZX04oMHgwRTYpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBCMzIgc3RhZ2UgMSAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19CMVMxCQkJQjQzX1BIWV9OKDB4MEU3KSAvKiBUWCBmaWx0ZXIgNDAgY29lZmYgQjEgc3RhZ2UgMSAqLworI2RlZmluZSBCNDNfTlBIWV9UWEZfNDBDT19CMzJTMgkJCUI0M19QSFlfTigweDBFOCkgLyogVFggZmlsdGVyIDQwIGNvZWZmIEIzMiBzdGFnZSAyICovCisjZGVmaW5lIEI0M19OUEhZX1RYRl80MENPX0IxUzIJCQlCNDNfUEhZX04oMHgwRTkpIC8qIFRYIGZpbHRlciA0MCBjb2VmZiBCMSBzdGFnZSAyICovCisjZGVmaW5lIEI0M19OUEhZX0JJU1RfU1RBVDIJCQlCNDNfUEhZX04oMHgwRUEpIC8qIEJJU1Qgc3RhdHVzIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQklTVF9TVEFUMwkJCUI0M19QSFlfTigweDBFQikgLyogQklTVCBzdGF0dXMgMyAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9PVkVSCQkJQjQzX1BIWV9OKDB4MEVDKSAvKiBSRiBjb250cm9sIG92ZXJyaWRlICovCisjZGVmaW5lIEI0M19OUEhZX01JTU9DRkcJCQlCNDNfUEhZX04oMHgwRUQpIC8qIE1JTU8gY29uZmlnICovCisjZGVmaW5lICBCNDNfTlBIWV9NSU1PQ0ZHX0dGTUlYCQkJMHgwMDA0IC8qIEdyZWVuZmllbGQgb3IgbWl4ZWQgbW9kZSAqLworI2RlZmluZSAgQjQzX05QSFlfTUlNT0NGR19BVVRPCQkJMHgwMTAwIC8qIEdyZWVuZmllbGQvbWl4ZWQgbW9kZSBhdXRvICovCisjZGVmaW5lIEI0M19OUEhZX1JBREFSX0JMTktDVEwJCQlCNDNfUEhZX04oMHgwRUUpIC8qIFJhZGFyIGJsYW5rIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfQTBSQURBUl9GSUZPQ1RMCQlCNDNfUEhZX04oMHgwRUYpIC8qIEFudGVubmEgMCByYWRhciBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfQTFSQURBUl9GSUZPQ1RMCQlCNDNfUEhZX04oMHgwRjApIC8qIEFudGVubmEgMSByYWRhciBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfQTBSQURBUl9GSUZPREFUCQlCNDNfUEhZX04oMHgwRjEpIC8qIEFudGVubmEgMCByYWRhciBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgQjQzX05QSFlfQTFSQURBUl9GSUZPREFUCQlCNDNfUEhZX04oMHgwRjIpIC8qIEFudGVubmEgMSByYWRhciBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkFEQVJfVEhSRVMwCQkJQjQzX1BIWV9OKDB4MEYzKSAvKiBSYWRhciB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBCNDNfTlBIWV9SQURBUl9USFJFUzEJCQlCNDNfUEhZX04oMHgwRjQpIC8qIFJhZGFyIHRocmVzaG9sZCAxICovCisjZGVmaW5lIEI0M19OUEhZX1JBREFSX1RIUkVTMFIJCQlCNDNfUEhZX04oMHgwRjUpIC8qIFJhZGFyIHRocmVzaG9sZCAwUiAqLworI2RlZmluZSBCNDNfTlBIWV9SQURBUl9USFJFUzFSCQkJQjQzX1BIWV9OKDB4MEY2KSAvKiBSYWRhciB0aHJlc2hvbGQgMVIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1NFTl8yMElONDBfRExFTgkJQjQzX1BIWV9OKDB4MEY3KSAvKiBDYXJyaWVyIHNlbnNlIDIwIGluIDQwIGR3ZWxsIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzEJCUI0M19QSFlfTigweDBGOCkgLyogUkYgY29udHJvbCBMVVQgVFJTVyBsb3dlciAxICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMQkJQjQzX1BIWV9OKDB4MEY5KSAvKiBSRiBjb250cm9sIExVVCBUUlNXIHVwcGVyIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8yCQlCNDNfUEhZX04oMHgwRkEpIC8qIFJGIGNvbnRyb2wgTFVUIFRSU1cgbG93ZXIgMiAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDIJCUI0M19QSFlfTigweDBGQikgLyogUkYgY29udHJvbCBMVVQgVFJTVyB1cHBlciAyICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX0xPMwkJQjQzX1BIWV9OKDB4MEZDKSAvKiBSRiBjb250cm9sIExVVCBUUlNXIGxvd2VyIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAzCQlCNDNfUEhZX04oMHgwRkQpIC8qIFJGIGNvbnRyb2wgTFVUIFRSU1cgdXBwZXIgMyAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzQJCUI0M19QSFlfTigweDBGRSkgLyogUkYgY29udHJvbCBMVVQgVFJTVyBsb3dlciA0ICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQNAkJQjQzX1BIWV9OKDB4MEZGKSAvKiBSRiBjb250cm9sIExVVCBUUlNXIHVwcGVyIDQgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX0xOQVBBMQkJQjQzX1BIWV9OKDB4MTAwKSAvKiBSRiBjb250cm9sIExVVCBMTkEgUEEgMSAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9MVVRfTE5BUEEyCQlCNDNfUEhZX04oMHgxMDEpIC8qIFJGIGNvbnRyb2wgTFVUIExOQSBQQSAyICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0xVVF9MTkFQQTMJCUI0M19QSFlfTigweDEwMikgLyogUkYgY29udHJvbCBMVVQgTE5BIFBBIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfTFVUX0xOQVBBNAkJQjQzX1BIWV9OKDB4MTAzKSAvKiBSRiBjb250cm9sIExVVCBMTkEgUEEgNCAqLworI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DX0NSQ00wCQkJQjQzX1BIWV9OKDB4MTA0KSAvKiBUR05zeW5jIENSQyBtYXNrIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ19DUkNNMQkJCUI0M19QSFlfTigweDEwNSkgLyogVEdOc3luYyBDUkMgbWFzayAxICovCisjZGVmaW5lIEI0M19OUEhZX1RHTlNZTkNfQ1JDTTIJCQlCNDNfUEhZX04oMHgxMDYpIC8qIFRHTnN5bmMgQ1JDIG1hc2sgMiAqLworI2RlZmluZSBCNDNfTlBIWV9UR05TWU5DX0NSQ00zCQkJQjQzX1BIWV9OKDB4MTA3KSAvKiBUR05zeW5jIENSQyBtYXNrIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVEdOU1lOQ19DUkNNNAkJCUI0M19QSFlfTigweDEwOCkgLyogVEdOc3luYyBDUkMgbWFzayA0ICovCisjZGVmaW5lIEI0M19OUEhZX0NSQ1BPTFkJCQlCNDNfUEhZX04oMHgxMDkpIC8qIENSQyBwb2x5bm9taWFsICovCisjZGVmaW5lIEI0M19OUEhZX1NJR0NOVAkJCQlCNDNfUEhZX04oMHgxMEEpIC8qICMgc2lnIGNvdW50ICovCisjZGVmaW5lIEI0M19OUEhZX1NJR1NUQVJUQklUX0NUTAkJQjQzX1BIWV9OKDB4MTBCKSAvKiBTaWcgc3RhcnQgYml0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1JDUE9MWV9PUkRFUgkJCUI0M19QSFlfTigweDEwQykgLyogQ1JDIHBvbHlub21pYWwgb3JkZXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfQ1NUMAkJCUI0M19QSFlfTigweDEwRCkgLyogUkYgY29udHJvbCBjb3JlIHN3YXAgdGFibGUgMCAqLworI2RlZmluZSBCNDNfTlBIWV9SRkNUTF9DU1QxCQkJQjQzX1BIWV9OKDB4MTBFKSAvKiBSRiBjb250cm9sIGNvcmUgc3dhcCB0YWJsZSAxICovCisjZGVmaW5lIEI0M19OUEhZX1JGQ1RMX0NTVDJPCQkJQjQzX1BIWV9OKDB4MTBGKSAvKiBSRiBjb250cm9sIGNvcmUgc3dhcCB0YWJsZSAyICsgb3RoZXJzICovCisjZGVmaW5lIEI0M19OUEhZX0JQSFlfQ1RMNQkJCUI0M19QSFlfTigweDExMSkgLyogQiBQSFkgY29udHJvbCA1ICovCisjZGVmaW5lIEI0M19OUEhZX1JGU0VRX0xQRkJXCQkJQjQzX1BIWV9OKDB4MTEyKSAvKiBSRiBzZXEgTFBGIGJhbmR3aWR0aCAqLworI2RlZmluZSBCNDNfTlBIWV9UU1NJQklBUzEJCQlCNDNfUEhZX04oMHgxMTQpIC8qIFRTU0kgYmlhcyB2YWwgMSAqLworI2RlZmluZSBCNDNfTlBIWV9UU1NJQklBUzIJCQlCNDNfUEhZX04oMHgxMTUpIC8qIFRTU0kgYmlhcyB2YWwgMiAqLworI2RlZmluZSAgQjQzX05QSFlfVFNTSUJJQVNfQklBUwkJCTB4MDBGRiAvKiBCaWFzICovCisjZGVmaW5lICBCNDNfTlBIWV9UU1NJQklBU19CSUFTX1NISUZUCQkwCisjZGVmaW5lICBCNDNfTlBIWV9UU1NJQklBU19WQUwJCQkweEZGMDAgLyogVmFsdWUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RTU0lCSUFTX1ZBTF9TSElGVAkJOAorI2RlZmluZSBCNDNfTlBIWV9FU1RQV1IxCQkJQjQzX1BIWV9OKDB4MTE4KSAvKiBFc3RpbWF0ZWQgcG93ZXIgMSAqLworI2RlZmluZSBCNDNfTlBIWV9FU1RQV1IyCQkJQjQzX1BIWV9OKDB4MTE5KSAvKiBFc3RpbWF0ZWQgcG93ZXIgMiAqLworI2RlZmluZSAgQjQzX05QSFlfRVNUUFdSX1BXUgkJCTB4MDBGRiAvKiBFc3RpbWF0ZWQgcG93ZXIgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0VTVFBXUl9QV1JfU0hJRlQJCTAKKyNkZWZpbmUgIEI0M19OUEhZX0VTVFBXUl9WQUxJRAkJCTB4MDEwMCAvKiBFc3RpbWF0ZWQgcG93ZXIgdmFsaWQgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFNTSV9NQVhUWEZEVAkJCUI0M19QSFlfTigweDExQykgLyogVFNTSSBtYXggVFggZnJhbWUgZGVsYXkgdGltZSAqLworI2RlZmluZSAgQjQzX05QSFlfVFNTSV9NQVhUWEZEVF9WQUwJCTB4MDBGRiAvKiBtYXggVFggZnJhbWUgZGVsYXkgdGltZSAqLworI2RlZmluZSAgQjQzX05QSFlfVFNTSV9NQVhUWEZEVF9WQUxfU0hJRlQJMAorI2RlZmluZSBCNDNfTlBIWV9UU1NJX01BWFREVAkJCUI0M19QSFlfTigweDExRCkgLyogVFNTSSBtYXggVFNTSSBkZWxheSB0aW1lICovCisjZGVmaW5lICBCNDNfTlBIWV9UU1NJX01BWFREVF9WQUwJCTB4MDBGRiAvKiBtYXggVFNTSSBkZWxheSB0aW1lICovCisjZGVmaW5lICBCNDNfTlBIWV9UU1NJX01BWFREVF9WQUxfU0hJRlQJCTAKKyNkZWZpbmUgQjQzX05QSFlfSVRTU0kxCQkJCUI0M19QSFlfTigweDExRSkgLyogVFNTSSBpZGxlIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVRTU0kyCQkJCUI0M19QSFlfTigweDExRikgLyogVFNTSSBpZGxlIDIgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lUU1NJX1ZBTAkJCTB4MDBGRiAvKiBJZGxlIFRTU0kgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lUU1NJX1ZBTF9TSElGVAkJMAorI2RlZmluZSBCNDNfTlBIWV9UU1NJTU9ERQkJCUI0M19QSFlfTigweDEyMikgLyogVFNTSSBtb2RlICovCisjZGVmaW5lICBCNDNfTlBIWV9UU1NJTU9ERV9FTgkJCTB4MDAwMSAvKiBUU1NJIGVuYWJsZSAqLworI2RlZmluZSAgQjQzX05QSFlfVFNTSU1PREVfUERFTgkJCTB4MDAwMiAvKiBQb3dlciBkZXQgZW5hYmxlICovCisjZGVmaW5lIEI0M19OUEhZX1JYTUFDSUZNCQkJQjQzX1BIWV9OKDB4MTIzKSAvKiBSWCBNYWNpZiBtb2RlICovCisjZGVmaW5lIEI0M19OUEhZX0NSU0lUX0NPQ05UX0xPCQkJQjQzX1BIWV9OKDB4MTI0KSAvKiBDUlMgaWRsZSB0aW1lIENSUy1vbiBjb3VudCAobG93KSAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNJVF9DT0NOVF9ISQkJCUI0M19QSFlfTigweDEyNSkgLyogQ1JTIGlkbGUgdGltZSBDUlMtb24gY291bnQgKGhpZ2gpICovCisjZGVmaW5lIEI0M19OUEhZX0NSU0lUX01UQ05UX0xPCQkJQjQzX1BIWV9OKDB4MTI2KSAvKiBDUlMgaWRsZSB0aW1lIG1lYXN1cmUgdGltZSBjb3VudCAobG93KSAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNJVF9NVENOVF9ISQkJCUI0M19QSFlfTigweDEyNykgLyogQ1JTIGlkbGUgdGltZSBtZWFzdXJlIHRpbWUgY291bnQgKGhpZ2gpICovCisjZGVmaW5lIEI0M19OUEhZX1NBTVRXQwkJCQlCNDNfUEhZX04oMHgxMjgpIC8qIFNhbXBsZSB0YWlsIHdhaXQgY291bnQgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfQ01ECQkJQjQzX1BIWV9OKDB4MTI5KSAvKiBJL1EgZXN0aW1hdGUgY29tbWFuZCAqLworI2RlZmluZSAgQjQzX05QSFlfSVFFU1RfQ01EX1NUQVJUCQkweDAwMDEgLyogU3RhcnQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX0lRRVNUX0NNRF9NT0RFCQkweDAwMDIgLyogTW9kZSAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9XVAkJCUI0M19QSFlfTigweDEyQSkgLyogSS9RIGVzdGltYXRlIHdhaXQgdGltZSAqLworI2RlZmluZSAgQjQzX05QSFlfSVFFU1RfV1RfVkFMCQkJMHgwMEZGIC8qIFdhaXQgdGltZSAqLworI2RlZmluZSAgQjQzX05QSFlfSVFFU1RfV1RfVkFMX1NISUZUCQkwCisjZGVmaW5lIEI0M19OUEhZX0lRRVNUX1NBTUNOVAkJCUI0M19QSFlfTigweDEyQikgLyogSS9RIGVzdGltYXRlIHNhbXBsZSBjb3VudCAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUUFDQ19MTzAJCUI0M19QSFlfTigweDEyQykgLyogSS9RIGVzdGltYXRlIEkvUSBhY2MgbG8gMCAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUUFDQ19ISTAJCUI0M19QSFlfTigweDEyRCkgLyogSS9RIGVzdGltYXRlIEkvUSBhY2MgaGkgMCAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9JUEFDQ19MTzAJCUI0M19QSFlfTigweDEyRSkgLyogSS9RIGVzdGltYXRlIEkgcG93ZXIgYWNjIGxvIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfSVBBQ0NfSEkwCQlCNDNfUEhZX04oMHgxMkYpIC8qIEkvUSBlc3RpbWF0ZSBJIHBvd2VyIGFjYyBoaSAwICovCisjZGVmaW5lIEI0M19OUEhZX0lRRVNUX1FQQUNDX0xPMAkJQjQzX1BIWV9OKDB4MTMwKSAvKiBJL1EgZXN0aW1hdGUgUSBwb3dlciBhY2MgbG8gMCAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9RUEFDQ19ISTAJCUI0M19QSFlfTigweDEzMSkgLyogSS9RIGVzdGltYXRlIFEgcG93ZXIgYWNjIGhpIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfSVFBQ0NfTE8xCQlCNDNfUEhZX04oMHgxMzQpIC8qIEkvUSBlc3RpbWF0ZSBJL1EgYWNjIGxvIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfSVFBQ0NfSEkxCQlCNDNfUEhZX04oMHgxMzUpIC8qIEkvUSBlc3RpbWF0ZSBJL1EgYWNjIGhpIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfSVBBQ0NfTE8xCQlCNDNfUEhZX04oMHgxMzYpIC8qIEkvUSBlc3RpbWF0ZSBJIHBvd2VyIGFjYyBsbyAxICovCisjZGVmaW5lIEI0M19OUEhZX0lRRVNUX0lQQUNDX0hJMQkJQjQzX1BIWV9OKDB4MTM3KSAvKiBJL1EgZXN0aW1hdGUgSSBwb3dlciBhY2MgaGkgMSAqLworI2RlZmluZSBCNDNfTlBIWV9JUUVTVF9RUEFDQ19MTzEJCUI0M19QSFlfTigweDEzOCkgLyogSS9RIGVzdGltYXRlIFEgcG93ZXIgYWNjIGxvIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfSVFFU1RfUVBBQ0NfSEkxCQlCNDNfUEhZX04oMHgxMzkpIC8qIEkvUSBlc3RpbWF0ZSBRIHBvd2VyIGFjYyBoaSAxICovCisjZGVmaW5lIEI0M19OUEhZX01JTU9fQ1JTVFhFWFQJCQlCNDNfUEhZX04oMHgxM0EpIC8qIE1JTU8gUEhZIENSUyBUWCBleHRlbnNpb24gKi8KKyNkZWZpbmUgQjQzX05QSFlfUFdSREVUMQkJCUI0M19QSFlfTigweDEzQikgLyogUG93ZXIgZGV0IDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUFdSREVUMgkJCUI0M19QSFlfTigweDEzQykgLyogUG93ZXIgZGV0IDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfTUFYUlNTSV9EVElNRQkJCUI0M19QSFlfTigweDEzRikgLyogUlNTSSBtYXggUlNTSSBkZWxheSB0aW1lICovCisjZGVmaW5lIEI0M19OUEhZX1BJTF9EVzAJCQlCNDNfUEhZX04oMHgxNDEpIC8qIFBpbG90IGRhdGEgd2VpZ2h0IDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUElMX0RXMQkJCUI0M19QSFlfTigweDE0MikgLyogUGlsb3QgZGF0YSB3ZWlnaHQgMSAqLworI2RlZmluZSBCNDNfTlBIWV9QSUxfRFcyCQkJQjQzX1BIWV9OKDB4MTQzKSAvKiBQaWxvdCBkYXRhIHdlaWdodCAyICovCisjZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfQlBTSwkJCTB4MDAwRiAvKiBCUFNLICovCisjZGVmaW5lICBCNDNfTlBIWV9QSUxfRFdfQlBTS19TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfUElMX0RXX1FQU0sJCQkweDAwRjAgLyogUVBTSyAqLworI2RlZmluZSAgQjQzX05QSFlfUElMX0RXX1FQU0tfU0hJRlQJCTQKKyNkZWZpbmUgIEI0M19OUEhZX1BJTF9EV18xNlFBTQkJCTB4MEYwMCAvKiAxNi1RQU0gKi8KKyNkZWZpbmUgIEI0M19OUEhZX1BJTF9EV18xNlFBTV9TSElGVAkJOAorI2RlZmluZSAgQjQzX05QSFlfUElMX0RXXzY0UUFNCQkJMHhGMDAwIC8qIDY0LVFBTSAqLworI2RlZmluZSAgQjQzX05QSFlfUElMX0RXXzY0UUFNX1NISUZUCQkxMgorI2RlZmluZSBCNDNfTlBIWV9GTURFTV9DRkcJCQlCNDNfUEhZX04oMHgxNDQpIC8qIEZNIGRlbW9kdWxhdGlvbiBjb25maWcgKi8KKyNkZWZpbmUgQjQzX05QSFlfUEhBU0VUUl9BMAkJCUI0M19QSFlfTigweDE0NSkgLyogUGhhc2UgdHJhY2sgYWxwaGEgMCAqLworI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0ExCQkJQjQzX1BIWV9OKDB4MTQ2KSAvKiBQaGFzZSB0cmFjayBhbHBoYSAxICovCisjZGVmaW5lIEI0M19OUEhZX1BIQVNFVFJfQTIJCQlCNDNfUEhZX04oMHgxNDcpIC8qIFBoYXNlIHRyYWNrIGFscGhhIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfUEhBU0VUUl9CMAkJCUI0M19QSFlfTigweDE0OCkgLyogUGhhc2UgdHJhY2sgYmV0YSAwICovCisjZGVmaW5lIEI0M19OUEhZX1BIQVNFVFJfQjEJCQlCNDNfUEhZX04oMHgxNDkpIC8qIFBoYXNlIHRyYWNrIGJldGEgMSAqLworI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0IyCQkJQjQzX1BIWV9OKDB4MTRBKSAvKiBQaGFzZSB0cmFjayBiZXRhIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfUEhBU0VUUl9DSEcwCQkJQjQzX1BIWV9OKDB4MTRCKSAvKiBQaGFzZSB0cmFjayBjaGFuZ2UgMCAqLworI2RlZmluZSBCNDNfTlBIWV9QSEFTRVRSX0NIRzEJCQlCNDNfUEhZX04oMHgxNEMpIC8qIFBoYXNlIHRyYWNrIGNoYW5nZSAxICovCisjZGVmaW5lIEI0M19OUEhZX1BIQVNFVFdfT0ZGCQkJQjQzX1BIWV9OKDB4MTREKSAvKiBQaGFzZSB0cmFjayBvZmZzZXQgKi8KKyNkZWZpbmUgQjQzX05QSFlfUkZDVExfREJHCQkJQjQzX1BIWV9OKDB4MTRFKSAvKiBSRiBjb250cm9sIGRlYnVnICovCisjZGVmaW5lIEI0M19OUEhZX0NDS19TSElGVEJfUkVGCQkJQjQzX1BIWV9OKDB4MTUwKSAvKiBDQ0sgc2hpZnRiaXRzIHJlZmVyZW5jZSB2YXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfT1ZFUl9ER0FJTjAJCQlCNDNfUEhZX04oMHgxNTIpIC8qIE92ZXJyaWRlIGRpZ2l0YWwgZ2FpbiAwICovCisjZGVmaW5lIEI0M19OUEhZX09WRVJfREdBSU4xCQkJQjQzX1BIWV9OKDB4MTUzKSAvKiBPdmVycmlkZSBkaWdpdGFsIGdhaW4gMSAqLworI2RlZmluZSAgQjQzX05QSFlfT1ZFUl9ER0FJTl9GREdWCQkweDAwMDcgLyogRm9yY2UgZGlnaXRhbCBnYWluIHZhbHVlICovCisjZGVmaW5lICBCNDNfTlBIWV9PVkVSX0RHQUlOX0ZER1ZfU0hJRlQJCTAKKyNkZWZpbmUgIEI0M19OUEhZX09WRVJfREdBSU5fRkRHRU4JCTB4MDAwOCAvKiBGb3JjZSBkaWdpdGFsIGdhaW4gZW5hYmxlICovCisjZGVmaW5lICBCNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWCQkweEZGMDAgLyogQ0NLIGRpZ2l0YWwgZ2FpbiBlbmFibGUgY291bnQgdmFsdWUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX09WRVJfREdBSU5fQ0NLREdFQ1ZfU0hJRlQJOAorI2RlZmluZSBCNDNfTlBIWV9CSVNUX1NUQVQ0CQkJQjQzX1BIWV9OKDB4MTU2KSAvKiBCSVNUIHN0YXR1cyA0ICovCisjZGVmaW5lIEI0M19OUEhZX1JBREFSX01BTAkJCUI0M19QSFlfTigweDE1NykgLyogUmFkYXIgTUEgbGVuZ3RoICovCisjZGVmaW5lIEI0M19OUEhZX1JBREFSX1NSQ0NUTAkJCUI0M19QSFlfTigweDE1OCkgLyogUmFkYXIgc2VhcmNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfVkxEX0RUU0lHCQkJQjQzX1BIWV9OKDB4MTU5KSAvKiBWTEQgZGF0YSB0b25lcyBzaWcgKi8KKyNkZWZpbmUgQjQzX05QSFlfVkxEX0RUREFUCQkJQjQzX1BIWV9OKDB4MTVBKSAvKiBWTEQgZGF0YSB0b25lcyBkYXRhICovCisjZGVmaW5lIEI0M19OUEhZX0MxX0JQSFlfUlhJUUNBMAkJQjQzX1BIWV9OKDB4MTVCKSAvKiBDb3JlIDEgQiBQSFkgUlggSS9RIGNvbXAgQTAgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQlBIWV9SWElRQ0IwCQlCNDNfUEhZX04oMHgxNUMpIC8qIENvcmUgMSBCIFBIWSBSWCBJL1EgY29tcCBCMCAqLworI2RlZmluZSBCNDNfTlBIWV9DMl9CUEhZX1JYSVFDQTEJCUI0M19QSFlfTigweDE1RCkgLyogQ29yZSAyIEIgUEhZIFJYIEkvUSBjb21wIEExICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0JQSFlfUlhJUUNCMQkJQjQzX1BIWV9OKDB4MTVFKSAvKiBDb3JlIDIgQiBQSFkgUlggSS9RIGNvbXAgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU4wCQkJQjQzX1BIWV9OKDB4MTYwKSAvKiBGcmVxdWVuY3kgZ2FpbiAwICovCisjZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlOMQkJCUI0M19QSFlfTigweDE2MSkgLyogRnJlcXVlbmN5IGdhaW4gMSAqLworI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTjIJCQlCNDNfUEhZX04oMHgxNjIpIC8qIEZyZXF1ZW5jeSBnYWluIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU4zCQkJQjQzX1BIWV9OKDB4MTYzKSAvKiBGcmVxdWVuY3kgZ2FpbiAzICovCisjZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlONAkJCUI0M19QSFlfTigweDE2NCkgLyogRnJlcXVlbmN5IGdhaW4gNCAqLworI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTjUJCQlCNDNfUEhZX04oMHgxNjUpIC8qIEZyZXF1ZW5jeSBnYWluIDUgKi8KKyNkZWZpbmUgQjQzX05QSFlfRlJFUUdBSU42CQkJQjQzX1BIWV9OKDB4MTY2KSAvKiBGcmVxdWVuY3kgZ2FpbiA2ICovCisjZGVmaW5lIEI0M19OUEhZX0ZSRVFHQUlONwkJCUI0M19QSFlfTigweDE2NykgLyogRnJlcXVlbmN5IGdhaW4gNyAqLworI2RlZmluZSBCNDNfTlBIWV9GUkVRR0FJTl9CWVBBU1MJCUI0M19QSFlfTigweDE2OCkgLyogRnJlcXVlbmN5IGdhaW4gYnlwYXNzICovCisjZGVmaW5lIEI0M19OUEhZX1RSTE9TUwkJCQlCNDNfUEhZX04oMHgxNjkpIC8qIFRSIGxvc3MgdmFsdWUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzFfQURDQ0xJUAkJCUI0M19QSFlfTigweDE2QSkgLyogQ29yZSAxIEFEQyBjbGlwICovCisjZGVmaW5lIEI0M19OUEhZX0MyX0FEQ0NMSVAJCQlCNDNfUEhZX04oMHgxNkIpIC8qIENvcmUgMiBBREMgY2xpcCAqLworI2RlZmluZSBCNDNfTlBIWV9MVFJOX09GRkdBSU4JCQlCNDNfUEhZX04oMHgxNkYpIC8qIExUUk4gb2Zmc2V0IGdhaW4gKi8KKyNkZWZpbmUgQjQzX05QSFlfTFRSTl9PRkYJCQlCNDNfUEhZX04oMHgxNzApIC8qIExUUk4gb2Zmc2V0ICovCisjZGVmaW5lIEI0M19OUEhZX05SREFUQVRfV1dJU0UyMFNJRwkJQjQzX1BIWV9OKDB4MTcxKSAvKiAjIGRhdGEgdG9uZXMgV1dpU0UgMjAgc2lnICovCisjZGVmaW5lIEI0M19OUEhZX05SREFUQVRfV1dJU0U0MFNJRwkJQjQzX1BIWV9OKDB4MTcyKSAvKiAjIGRhdGEgdG9uZXMgV1dpU0UgNDAgc2lnICovCisjZGVmaW5lIEI0M19OUEhZX05SREFUQVRfVEdOU1lOQzIwU0lHCQlCNDNfUEhZX04oMHgxNzMpIC8qICMgZGF0YSB0b25lcyBUR05zeW5jIDIwIHNpZyAqLworI2RlZmluZSBCNDNfTlBIWV9OUkRBVEFUX1RHTlNZTkM0MFNJRwkJQjQzX1BIWV9OKDB4MTc0KSAvKiAjIGRhdGEgdG9uZXMgVEdOc3luYyA0MCBzaWcgKi8KKyNkZWZpbmUgQjQzX05QSFlfV1dJU0VfQ1JDTTAJCQlCNDNfUEhZX04oMHgxNzUpIC8qIFdXaVNFIENSQyBtYXNrIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfV1dJU0VfQ1JDTTEJCQlCNDNfUEhZX04oMHgxNzYpIC8qIFdXaVNFIENSQyBtYXNrIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfV1dJU0VfQ1JDTTIJCQlCNDNfUEhZX04oMHgxNzcpIC8qIFdXaVNFIENSQyBtYXNrIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfV1dJU0VfQ1JDTTMJCQlCNDNfUEhZX04oMHgxNzgpIC8qIFdXaVNFIENSQyBtYXNrIDMgKi8KKyNkZWZpbmUgQjQzX05QSFlfV1dJU0VfQ1JDTTQJCQlCNDNfUEhZX04oMHgxNzkpIC8qIFdXaVNFIENSQyBtYXNrIDQgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ0hBTkVTVF9DRERTSAkJCUI0M19QSFlfTigweDE3QSkgLyogQ2hhbm5lbCBlc3RpbWF0ZSBDREQgc2hpZnQgKi8KKyNkZWZpbmUgQjQzX05QSFlfSFRBR0NfV0NOVAkJCUI0M19QSFlfTigweDE3QikgLyogSFQgQURDIHdhaXQgY291bnRlcnMgKi8KKyNkZWZpbmUgQjQzX05QSFlfU1FQQVJNCQkJCUI0M19QSFlfTigweDE3QykgLyogU1EgcGFyYW1zICovCisjZGVmaW5lIEI0M19OUEhZX01DU0RVUDZNCQkJQjQzX1BIWV9OKDB4MTdEKSAvKiBNQ1MgZHVwIDZNICovCisjZGVmaW5lIEI0M19OUEhZX05EQVRBVF9EVVA0MAkJCUI0M19QSFlfTigweDE3RSkgLyogIyBkYXRhIHRvbmVzIGR1cCA0MCAqLworI2RlZmluZSBCNDNfTlBIWV9EVVA0MF9UR05TWU5DX0NZQ0QJCUI0M19QSFlfTigweDE3RikgLyogRHVwNDAgVEdOc3luYyBjeWNsZSBkYXRhICovCisjZGVmaW5lIEI0M19OUEhZX0RVUDQwX0dGQkwJCQlCNDNfUEhZX04oMHgxODApIC8qIER1cDQwIEdGIGZvcm1hdCBCTCBhZGRyZXNzICovCisjZGVmaW5lIEI0M19OUEhZX0RVUDQwX0JMCQkJQjQzX1BIWV9OKDB4MTgxKSAvKiBEdXA0MCBmb3JtYXQgQkwgYWRkcmVzcyAqLworI2RlZmluZSBCNDNfTlBIWV9MRUdEVVBfRlRBCQkJQjQzX1BIWV9OKDB4MTgyKSAvKiBMZWdhY3kgZHVwIGZybSB0YWJsZSBhZGRyZXNzICovCisjZGVmaW5lIEI0M19OUEhZX1BBQ1BST0NfREJHCQkJQjQzX1BIWV9OKDB4MTgzKSAvKiBQYWNrZXQgcHJvY2Vzc2luZyBkZWJ1ZyAqLworI2RlZmluZSBCNDNfTlBIWV9QSUxfQ1lDMQkJCUI0M19QSFlfTigweDE4NCkgLyogUGlsb3QgY3ljbGUgY291bnRlciAxICovCisjZGVmaW5lIEI0M19OUEhZX1BJTF9DWUMyCQkJQjQzX1BIWV9OKDB4MTg1KSAvKiBQaWxvdCBjeWNsZSBjb3VudGVyIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzBBMQkJCUI0M19QSFlfTigweDE4NikgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDAgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzBBMgkJCUI0M19QSFlfTigweDE4NykgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDAgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzFBMQkJCUI0M19QSFlfTigweDE4OCkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDEgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzFBMgkJCUI0M19QSFlfTigweDE4OSkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDEgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzJBMQkJCUI0M19QSFlfTigweDE4QSkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDIgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzJBMgkJCUI0M19QSFlfTigweDE4QikgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDIgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzBCMQkJCUI0M19QSFlfTigweDE4QykgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDAgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzBCMgkJCUI0M19QSFlfTigweDE4RCkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDAgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzBCMwkJCUI0M19QSFlfTigweDE4RSkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDAgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzFCMQkJCUI0M19QSFlfTigweDE4RikgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDEgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzFCMgkJCUI0M19QSFlfTigweDE5MCkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDEgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzFCMwkJCUI0M19QSFlfTigweDE5MSkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDEgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzJCMQkJCUI0M19QSFlfTigweDE5MikgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDIgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzJCMgkJCUI0M19QSFlfTigweDE5MykgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDIgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzIwQ09fUzJCMwkJCUI0M19QSFlfTigweDE5NCkgLyogVFggZmlsdGVyIDIwIGNvZWZmIHN0YWdlIDIgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzBBMQkJCUI0M19QSFlfTigweDE5NSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDAgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzBBMgkJCUI0M19QSFlfTigweDE5NikgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDAgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzFBMQkJCUI0M19QSFlfTigweDE5NykgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDEgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzFBMgkJCUI0M19QSFlfTigweDE5OCkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDEgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzJBMQkJCUI0M19QSFlfTigweDE5OSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDIgQTEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzJBMgkJCUI0M19QSFlfTigweDE5QSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDIgQTIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzBCMQkJCUI0M19QSFlfTigweDE5QikgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDAgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzBCMgkJCUI0M19QSFlfTigweDE5QykgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDAgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzBCMwkJCUI0M19QSFlfTigweDE5RCkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDAgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzFCMQkJCUI0M19QSFlfTigweDE5RSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDEgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzFCMgkJCUI0M19QSFlfTigweDE5RikgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDEgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzFCMwkJCUI0M19QSFlfTigweDFBMCkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDEgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzJCMQkJCUI0M19QSFlfTigweDFBMSkgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDIgQjEgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzJCMgkJCUI0M19QSFlfTigweDFBMikgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDIgQjIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhGXzQwQ09fUzJCMwkJCUI0M19QSFlfTigweDFBMykgLyogVFggZmlsdGVyIDQwIGNvZWZmIHN0YWdlIDIgQjMgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1JTU0lfWAkJQjQzX1BIWV9OKDB4MUE0KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBSU1NJIFggKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1JTU0lfWQkJQjQzX1BIWV9OKDB4MUE1KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBSU1NJIFkgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1JTU0lfWgkJQjQzX1BIWV9OKDB4MUE2KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBSU1NJIFogKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzBJX1RCRAkJCUI0M19QSFlfTigweDFBNykgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIEkgVEJEICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wSV9QV1JERVQJCUI0M19QSFlfTigweDFBOCkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIEkgcG93ZXIgZGV0ICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wSV9UU1NJCQkJQjQzX1BIWV9OKDB4MUE5KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDAgSSBUU1NJICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9SU1NJX1gJCUI0M19QSFlfTigweDFBQSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgUlNTSSBYICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9SU1NJX1kJCUI0M19QSFlfTigweDFBQikgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgUlNTSSBZICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9SU1NJX1oJCUI0M19QSFlfTigweDFBQykgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgUlNTSSBaICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18wUV9UQkQJCQlCNDNfUEhZX04oMHgxQUQpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBRIFRCRCAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMFFfUFdSREVUCQlCNDNfUEhZX04oMHgxQUUpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMCBRIHBvd2VyIGRldCAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMFFfVFNTSQkJCUI0M19QSFlfTigweDFBRikgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAwIFEgVFNTSSAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfUlNTSV9YCQlCNDNfUEhZX04oMHgxQjApIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIFJTU0kgWCAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfUlNTSV9ZCQlCNDNfUEhZX04oMHgxQjEpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIFJTU0kgWSAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfUlNTSV9aCQlCNDNfUEhZX04oMHgxQjIpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIFJTU0kgWiAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJTUNfMUlfVEJECQkJQjQzX1BIWV9OKDB4MUIzKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgSSBUQkQgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFJX1BXUkRFVAkJQjQzX1BIWV9OKDB4MUI0KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgSSBwb3dlciBkZXQgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFJX1RTU0kJCQlCNDNfUEhZX04oMHgxQjUpIC8qIFJTU0kgbXVsdGlwbGljYXRpb24gY29lZmZpY2llbnQgMSBJIFRTU0kgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1JTU0lfWAkJQjQzX1BIWV9OKDB4MUI2KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBSU1NJIFggKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1JTU0lfWQkJQjQzX1BIWV9OKDB4MUI3KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBSU1NJIFkgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1JTU0lfWgkJQjQzX1BIWV9OKDB4MUI4KSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBSU1NJIFogKi8KKyNkZWZpbmUgQjQzX05QSFlfUlNTSU1DXzFRX1RCRAkJCUI0M19QSFlfTigweDFCOSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIFEgVEJEICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xUV9QV1JERVQJCUI0M19QSFlfTigweDFCQSkgLyogUlNTSSBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVudCAxIFEgcG93ZXIgZGV0ICovCisjZGVmaW5lIEI0M19OUEhZX1JTU0lNQ18xUV9UU1NJCQkJQjQzX1BIWV9OKDB4MUJCKSAvKiBSU1NJIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW50IDEgUSBUU1NJICovCisjZGVmaW5lIEI0M19OUEhZX1NBTUNfV0NOVAkJCUI0M19QSFlfTigweDFCQykgLyogU2FtcGxlIGNvbGxlY3Qgd2FpdCBjb3VudGVyICovCisjZGVmaW5lIEI0M19OUEhZX1BUSFJPVUdIX0NOVAkJCUI0M19QSFlfTigweDFCRCkgLyogUGFzcy10aHJvdWdoIGNvdW50ZXIgKi8KKyNkZWZpbmUgQjQzX05QSFlfTFRSTl9PRkZfRzIwTAkJCUI0M19QSFlfTigweDFDNCkgLyogTFRSTiBvZmZzZXQgZ2FpbiAyMEwgKi8KKyNkZWZpbmUgQjQzX05QSFlfTFRSTl9PRkZfMjBMCQkJQjQzX1BIWV9OKDB4MUM1KSAvKiBMVFJOIG9mZnNldCAyMEwgKi8KKyNkZWZpbmUgQjQzX05QSFlfTFRSTl9PRkZfRzIwVQkJCUI0M19QSFlfTigweDFDNikgLyogTFRSTiBvZmZzZXQgZ2FpbiAyMFUgKi8KKyNkZWZpbmUgQjQzX05QSFlfTFRSTl9PRkZfMjBVCQkJQjQzX1BIWV9OKDB4MUM3KSAvKiBMVFJOIG9mZnNldCAyMFUgKi8KKyNkZWZpbmUgQjQzX05QSFlfRFNTU0NDS19HQUlOU0wJCQlCNDNfUEhZX04oMHgxQzgpIC8qIERTU1MvQ0NLIGdhaW4gc2V0dGxlIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9HUElPX0xPT1VUCQkJQjQzX1BIWV9OKDB4MUM5KSAvKiBHUElPIGxvdyBvdXQgKi8KKyNkZWZpbmUgQjQzX05QSFlfR1BJT19ISU9VVAkJCUI0M19QSFlfTigweDFDQSkgLyogR1BJTyBoaWdoIG91dCAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNfQ0hFQ0sJCQlCNDNfUEhZX04oMHgxQ0IpIC8qIENSUyBjaGVjayAqLworI2RlZmluZSBCNDNfTlBIWV9NTF9MT0dTU19SQVQJCQlCNDNfUEhZX04oMHgxQ0MpIC8qIE1ML2xvZ3NzIHJhdGlvICovCisjZGVmaW5lIEI0M19OUEhZX0RVUFNDQUxFCQkJQjQzX1BIWV9OKDB4MUNEKSAvKiBEdXAgc2NhbGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQlcxQQkJCQlCNDNfUEhZX04oMHgxQ0UpIC8qIEJXIDFBICovCisjZGVmaW5lIEI0M19OUEhZX0JXMgkJCQlCNDNfUEhZX04oMHgxQ0YpIC8qIEJXIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQlczCQkJCUI0M19QSFlfTigweDFEMCkgLyogQlcgMyAqLworI2RlZmluZSBCNDNfTlBIWV9CVzQJCQkJQjQzX1BIWV9OKDB4MUQxKSAvKiBCVyA0ICovCisjZGVmaW5lIEI0M19OUEhZX0JXNQkJCQlCNDNfUEhZX04oMHgxRDIpIC8qIEJXIDUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQlc2CQkJCUI0M19QSFlfTigweDFEMykgLyogQlcgNiAqLworI2RlZmluZSBCNDNfTlBIWV9DT0FMRU4wCQkJQjQzX1BIWV9OKDB4MUQ0KSAvKiBDb2Fyc2UgbGVuZ3RoIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ09BTEVOMQkJCUI0M19QSFlfTigweDFENSkgLyogQ29hcnNlIGxlbmd0aCAxICovCisjZGVmaW5lIEI0M19OUEhZX0NSU1RIUkVTXzFVCQkJQjQzX1BIWV9OKDB4MUQ2KSAvKiBDUlMgdGhyZXNob2xkIDEgVSAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNUSFJFU18yVQkJCUI0M19QSFlfTigweDFENykgLyogQ1JTIHRocmVzaG9sZCAyIFUgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1JTVEhSRVNfM1UJCQlCNDNfUEhZX04oMHgxRDgpIC8qIENSUyB0aHJlc2hvbGQgMyBVICovCisjZGVmaW5lIEI0M19OUEhZX0NSU0NUTF9VCQkJQjQzX1BIWV9OKDB4MUQ5KSAvKiBDUlMgY29udHJvbCBVICovCisjZGVmaW5lIEI0M19OUEhZX0NSU1RIUkVTXzFMCQkJQjQzX1BIWV9OKDB4MURBKSAvKiBDUlMgdGhyZXNob2xkIDEgTCAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNUSFJFU18yTAkJCUI0M19QSFlfTigweDFEQikgLyogQ1JTIHRocmVzaG9sZCAyIEwgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1JTVEhSRVNfM0wJCQlCNDNfUEhZX04oMHgxREMpIC8qIENSUyB0aHJlc2hvbGQgMyBMICovCisjZGVmaW5lIEI0M19OUEhZX0NSU0NUTF9MCQkJQjQzX1BIWV9OKDB4MUREKSAvKiBDUlMgY29udHJvbCBMICovCisjZGVmaW5lIEI0M19OUEhZX1NUUkFfMVUJCQlCNDNfUEhZX04oMHgxREUpIC8qIFNUUiBhZGRyZXNzIDEgVSAqLworI2RlZmluZSBCNDNfTlBIWV9TVFJBXzJVCQkJQjQzX1BIWV9OKDB4MURGKSAvKiBTVFIgYWRkcmVzcyAyIFUgKi8KKyNkZWZpbmUgQjQzX05QSFlfU1RSQV8xTAkJCUI0M19QSFlfTigweDFFMCkgLyogU1RSIGFkZHJlc3MgMSBMICovCisjZGVmaW5lIEI0M19OUEhZX1NUUkFfMkwJCQlCNDNfUEhZX04oMHgxRTEpIC8qIFNUUiBhZGRyZXNzIDIgTCAqLworI2RlZmluZSBCNDNfTlBIWV9DUlNDSEVDSzEJCQlCNDNfUEhZX04oMHgxRTIpIC8qIENSUyBjaGVjayAxICovCisjZGVmaW5lIEI0M19OUEhZX0NSU0NIRUNLMgkJCUI0M19QSFlfTigweDFFMykgLyogQ1JTIGNoZWNrIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQ1JTQ0hFQ0szCQkJQjQzX1BIWV9OKDB4MUU0KSAvKiBDUlMgY2hlY2sgMyAqLworI2RlZmluZSBCNDNfTlBIWV9KTVBTVFAwCQkJQjQzX1BIWV9OKDB4MUU1KSAvKiBKdW1wIHN0ZXAgMCAqLworI2RlZmluZSBCNDNfTlBIWV9KTVBTVFAxCQkJQjQzX1BIWV9OKDB4MUU2KSAvKiBKdW1wIHN0ZXAgMSAqLworI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfQ01ECQkJQjQzX1BIWV9OKDB4MUU3KSAvKiBUWCBwb3dlciBjb250cm9sIGNvbW1hbmQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9DTURfSU5JVAkJMHgwMDdGIC8qIEluaXQgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9DTURfSU5JVF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0NNRF9DT0VGRgkJMHgyMDAwIC8qIFBvd2VyIGNvbnRyb2wgY29lZmZpY2llbnRzICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfQ01EX0hXUENUTEVOCQkweDQwMDAgLyogSGFyZHdhcmUgVFggcG93ZXIgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9DTURfUENUTEVOCQkweDgwMDAgLyogVFggcG93ZXIgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhQQ1RMX04JCQlCNDNfUEhZX04oMHgxRTgpIC8qIFRYIHBvd2VyIGNvbnRyb2wgTiBudW0gKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9OX1RTU0lECQkweDAwRkYgLyogTiBUU1NJIGRlbGF5ICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfTl9UU1NJRF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX05fTlBUSUwyCQkweDA3MDAgLyogTiBQVCBpbnRlZ2VyIGxvZzIgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9OX05QVElMMl9TSElGVAkJOAorI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfSVRTU0kJCQlCNDNfUEhZX04oMHgxRTkpIC8qIFRYIHBvd2VyIGNvbnRyb2wgaWRsZSBUU1NJICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfSVRTU0lfMAkJMHgwMDNGIC8qIElkbGUgVFNTSSAwICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfSVRTU0lfMF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0lUU1NJXzEJCTB4M0YwMCAvKiBJZGxlIFRTU0kgMSAqLworI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0lUU1NJXzFfU0hJRlQJCTgKKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9JVFNTSV9CSU5GCQkweDgwMDAgLyogUmF3IFRTU0kgb2Zmc2V0IGJpbiBmb3JtYXQgKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhQQ1RMX1RQV1IJCQlCNDNfUEhZX04oMHgxRUEpIC8qIFRYIHBvd2VyIGNvbnRyb2wgdGFyZ2V0IHBvd2VyICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfVFBXUl8wCQkJMHgwMEZGIC8qIFBvd2VyIDAgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9UUFdSXzBfU0hJRlQJCTAKKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9UUFdSXzEJCQkweEZGMDAgLyogUG93ZXIgMSAqLworI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1RQV1JfMV9TSElGVAkJOAorI2RlZmluZSBCNDNfTlBIWV9UWFBDVExfQklEWAkJCUI0M19QSFlfTigweDFFQikgLyogVFggcG93ZXIgY29udHJvbCBiYXNlIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfQklEWF8wCQkJMHgwMDdGIC8qIHVDIGJhc2UgaW5kZXggMCAqLworI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0JJRFhfMF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX0JJRFhfMQkJCTB4N0YwMCAvKiB1QyBiYXNlIGluZGV4IDEgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9CSURYXzFfU0hJRlQJCTgKKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9CSURYX0xPQUQJCTB4ODAwMCAvKiBMb2FkIGJhc2UgaW5kZXggKi8KKyNkZWZpbmUgQjQzX05QSFlfVFhQQ1RMX1BJRFgJCQlCNDNfUEhZX04oMHgxRUMpIC8qIFRYIHBvd2VyIGNvbnRyb2wgcG93ZXIgaW5kZXggKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9QSURYXzAJCQkweDAwN0YgLyogdUMgcG93ZXIgaW5kZXggMCAqLworI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1BJRFhfMF9TSElGVAkJMAorI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1BJRFhfMQkJCTB4N0YwMCAvKiB1QyBwb3dlciBpbmRleCAxICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfUElEWF8xX1NISUZUCQk4CisjZGVmaW5lIEI0M19OUEhZX0MxX1RYUENUTF9TVEFUCQkJQjQzX1BIWV9OKDB4MUVEKSAvKiBDb3JlIDEgVFggcG93ZXIgY29udHJvbCBzdGF0dXMgKi8KKyNkZWZpbmUgQjQzX05QSFlfQzJfVFhQQ1RMX1NUQVQJCQlCNDNfUEhZX04oMHgxRUUpIC8qIENvcmUgMiBUWCBwb3dlciBjb250cm9sIHN0YXR1cyAqLworI2RlZmluZSAgQjQzX05QSFlfVFhQQ1RMX1NUQVRfRVNUCQkweDAwRkYgLyogRXN0aW1hdGVkIHBvd2VyICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfU1RBVF9FU1RfU0hJRlQJCTAKKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9TVEFUX0JJRFgJCTB4N0YwMCAvKiBCYXNlIGluZGV4ICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfU1RBVF9CSURYX1NISUZUCTgKKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9TVEFUX0VTVFZBTElECQkweDgwMDAgLyogRXN0aW1hdGVkIHBvd2VyIHZhbGlkICovCisjZGVmaW5lIEI0M19OUEhZX1NNQUxMU0dTX0xFTgkJCUI0M19QSFlfTigweDFFRikgLyogU21hbGwgc2lnIGdhaW4gc2V0dGxlIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9QSFlTVEFUX0dBSU4wCQkJQjQzX1BIWV9OKDB4MUYwKSAvKiBQSFkgc3RhdHMgZ2FpbiBpbmZvIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUEhZU1RBVF9HQUlOMQkJCUI0M19QSFlfTigweDFGMSkgLyogUEhZIHN0YXRzIGdhaW4gaW5mbyAxICovCisjZGVmaW5lIEI0M19OUEhZX1BIWVNUQVRfRlJFUUVTVAkJQjQzX1BIWV9OKDB4MUYyKSAvKiBQSFkgc3RhdHMgZnJlcXVlbmN5IGVzdGltYXRlICovCisjZGVmaW5lIEI0M19OUEhZX1BIWVNUQVRfQURWUkVUCQkJQjQzX1BIWV9OKDB4MUYzKSAvKiBQSFkgc3RhdHMgQURWIHJldGFyZCAqLworI2RlZmluZSBCNDNfTlBIWV9QSFlMQl9NT0RFCQkJQjQzX1BIWV9OKDB4MUY0KSAvKiBQSFkgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFgyMF8xCQkJQjQzX1BIWV9OKDB4MUY1KSAvKiBUb25lIG1hcCBpbmRleCAyMC8xICovCisjZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDIwXzIJCQlCNDNfUEhZX04oMHgxRjYpIC8qIFRvbmUgbWFwIGluZGV4IDIwLzIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVE9ORV9NSURYMjBfMwkJCUI0M19QSFlfTigweDFGNykgLyogVG9uZSBtYXAgaW5kZXggMjAvMyAqLworI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFg0MF8xCQkJQjQzX1BIWV9OKDB4MUY4KSAvKiBUb25lIG1hcCBpbmRleCA0MC8xICovCisjZGVmaW5lIEI0M19OUEhZX1RPTkVfTUlEWDQwXzIJCQlCNDNfUEhZX04oMHgxRjkpIC8qIFRvbmUgbWFwIGluZGV4IDQwLzIgKi8KKyNkZWZpbmUgQjQzX05QSFlfVE9ORV9NSURYNDBfMwkJCUI0M19QSFlfTigweDFGQSkgLyogVG9uZSBtYXAgaW5kZXggNDAvMyAqLworI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFg0MF80CQkJQjQzX1BIWV9OKDB4MUZCKSAvKiBUb25lIG1hcCBpbmRleCA0MC80ICovCisjZGVmaW5lIEI0M19OUEhZX1BJTFRPTkVfTUlEWDEJCQlCNDNfUEhZX04oMHgxRkMpIC8qIFBpbG90IHRvbmUgbWFwIGluZGV4IDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUElMVE9ORV9NSURYMgkJCUI0M19QSFlfTigweDFGRCkgLyogUGlsb3QgdG9uZSBtYXAgaW5kZXggMiAqLworI2RlZmluZSBCNDNfTlBIWV9QSUxUT05FX01JRFgzCQkJQjQzX1BIWV9OKDB4MUZFKSAvKiBQaWxvdCB0b25lIG1hcCBpbmRleCAzICovCisjZGVmaW5lIEI0M19OUEhZX1RYUklGU19GUkRFTAkJCUI0M19QSFlfTigweDFGRikgLyogVFggUklGUyBmcmFtZSBkZWxheSAqLworI2RlZmluZSBCNDNfTlBIWV9BRkVTRVFfUlgyVFhfUFVEXzQwTQkJQjQzX1BIWV9OKDB4MjAwKSAvKiBBRkUgc2VxIHJ4MnR4IHBvd2VyIHVwL2Rvd24gZGVsYXkgNDBNICovCisjZGVmaW5lIEI0M19OUEhZX0FGRVNFUV9UWDJSWF9QVURfNDBNCQlCNDNfUEhZX04oMHgyMDEpIC8qIEFGRSBzZXEgdHgycnggcG93ZXIgdXAvZG93biBkZWxheSA0ME0gKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFU0VRX1JYMlRYX1BVRF8yME0JCUI0M19QSFlfTigweDIwMikgLyogQUZFIHNlcSByeDJ0eCBwb3dlciB1cC9kb3duIGRlbGF5IDIwTSAqLworI2RlZmluZSBCNDNfTlBIWV9BRkVTRVFfVFgyUlhfUFVEXzIwTQkJQjQzX1BIWV9OKDB4MjAzKSAvKiBBRkUgc2VxIHR4MnJ4IHBvd2VyIHVwL2Rvd24gZGVsYXkgMjBNICovCisjZGVmaW5lIEI0M19OUEhZX1JYX1NJR0NUTAkJCUI0M19QSFlfTigweDIwNCkgLyogUlggc2lnbmFsIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhQSUxfQ1lDTlQwCQkJQjQzX1BIWV9OKDB4MjA1KSAvKiBSWCBwaWxvdCBjeWNsZSBjb3VudGVyIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhQSUxfQ1lDTlQxCQkJQjQzX1BIWV9OKDB4MjA2KSAvKiBSWCBwaWxvdCBjeWNsZSBjb3VudGVyIDEgKi8KKyNkZWZpbmUgQjQzX05QSFlfUlhQSUxfQ1lDTlQyCQkJQjQzX1BIWV9OKDB4MjA3KSAvKiBSWCBwaWxvdCBjeWNsZSBjb3VudGVyIDIgKi8KKyNkZWZpbmUgQjQzX05QSFlfQUZFU0VRX1JYMlRYX1BVRF8xME0JCUI0M19QSFlfTigweDIwOCkgLyogQUZFIHNlcSByeDJ0eCBwb3dlciB1cC9kb3duIGRlbGF5IDEwTSAqLworI2RlZmluZSBCNDNfTlBIWV9BRkVTRVFfVFgyUlhfUFVEXzEwTQkJQjQzX1BIWV9OKDB4MjA5KSAvKiBBRkUgc2VxIHR4MnJ4IHBvd2VyIHVwL2Rvd24gZGVsYXkgMTBNICovCisjZGVmaW5lIEI0M19OUEhZX0RTU1NDQ0tfQ1JTRVhUTAkJQjQzX1BIWV9OKDB4MjBBKSAvKiBEU1NTL0NDSyBDUlMgZXh0ZW5zaW9uIGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9NTF9MT0dTU19SQVRTTE9QRQkJQjQzX1BIWV9OKDB4MjBCKSAvKiBNTC9sb2dzcyByYXRpbyBzbG9wZSAqLworI2RlZmluZSBCNDNfTlBIWV9SSUZTX1NSQ1RMCQkJQjQzX1BIWV9OKDB4MjBDKSAvKiBSSUZTIHNlYXJjaCB0aW1lb3V0IGxlbmd0aCAqLworI2RlZmluZSBCNDNfTlBIWV9UWFJFQUxGRAkJCUI0M19QSFlfTigweDIwRCkgLyogVFggcmVhbCBmcmFtZSBkZWxheSAqLworI2RlZmluZSBCNDNfTlBIWV9IUEFOVF9TV1RIUkVTCQkJQjQzX1BIWV9OKDB4MjBFKSAvKiBIaWdoIHBvd2VyIGFudGVubmEgc3dpdGNoIHRocmVzaG9sZCAqLworI2RlZmluZSBCNDNfTlBIWV9FRENSU19BU1NUSFJFUzAJCUI0M19QSFlfTigweDIxMCkgLyogRUQgQ1JTIGFzc2VydCB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBCNDNfTlBIWV9FRENSU19BU1NUSFJFUzEJCUI0M19QSFlfTigweDIxMSkgLyogRUQgQ1JTIGFzc2VydCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBCNDNfTlBIWV9FRENSU19ERUFTU1RIUkVTMAkJQjQzX1BIWV9OKDB4MjEyKSAvKiBFRCBDUlMgZGVhc3NlcnQgdGhyZXNob2xkIDAgKi8KKyNkZWZpbmUgQjQzX05QSFlfRURDUlNfREVBU1NUSFJFUzEJCUI0M19QSFlfTigweDIxMykgLyogRUQgQ1JTIGRlYXNzZXJ0IHRocmVzaG9sZCAxICovCisjZGVmaW5lIEI0M19OUEhZX1NUUl9XVElNRTIwVQkJCUI0M19QSFlfTigweDIxNCkgLyogU1RSIHdhaXQgdGltZSAyMFUgKi8KKyNkZWZpbmUgQjQzX05QSFlfU1RSX1dUSU1FMjBMCQkJQjQzX1BIWV9OKDB4MjE1KSAvKiBTVFIgd2FpdCB0aW1lIDIwTCAqLworI2RlZmluZSBCNDNfTlBIWV9UT05FX01JRFg2NTdNCQkJQjQzX1BIWV9OKDB4MjE2KSAvKiBUb25lIG1hcCBpbmRleCA2NTdNICovCisjZGVmaW5lIEI0M19OUEhZX0hUU0lHVE9ORVMJCQlCNDNfUEhZX04oMHgyMTcpIC8qIEhUIHNpZ25hbCB0b25lcyAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJMQkJCQlCNDNfUEhZX04oMHgyMTkpIC8qIFJTU0kgdmFsdWUgMSAqLworI2RlZmluZSBCNDNfTlBIWV9SU1NJMgkJCQlCNDNfUEhZX04oMHgyMUEpIC8qIFJTU0kgdmFsdWUgMiAqLworI2RlZmluZSBCNDNfTlBIWV9DSEFOX0VTVEhBTkcJCQlCNDNfUEhZX04oMHgyMUQpIC8qIENoYW5uZWwgZXN0aW1hdGUgaGFuZyAqLworI2RlZmluZSBCNDNfTlBIWV9GSU5FUlgyX0NHQwkJCUI0M19QSFlfTigweDIyMSkgLyogRmluZSBSWCAyIGNsb2NrIGdhdGUgY29udHJvbCAqLworI2RlZmluZSAgQjQzX05QSFlfRklORVJYMl9DR0NfREVDR0MJCTB4MDAwOCAvKiBEZWNvZGUgZ2F0ZWQgY2xvY2tzICovCisjZGVmaW5lIEI0M19OUEhZX1RYUENUTF9JTklUCQkJQjQzX1BIWV9OKDB4MjIyKSAvKiBUWCBwb3dlciBjb250cm9sbCBpbml0ICovCisjZGVmaW5lICBCNDNfTlBIWV9UWFBDVExfSU5JVF9QSURYSTEJCTB4MDBGRiAvKiBQb3dlciBpbmRleCBpbml0IDEgKi8KKyNkZWZpbmUgIEI0M19OUEhZX1RYUENUTF9JTklUX1BJRFhJMV9TSElGVAkwCisKKworCisvKiBCcm9hZGNvbSAyMDU1IHJhZGlvIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIEIyMDU1X0dFTl9TUEFSRQkJCTB4MDAgLyogR0VOIHNwYXJlICovCisjZGVmaW5lIEIyMDU1X1NQX1BJTlBECQkJMHgwMiAvKiBTUCBQSU4gUEQgKi8KKyNkZWZpbmUgQjIwNTVfQzFfU1BfUlNTSQkJMHgwMyAvKiBTUCBSU1NJIENvcmUgMSAqLworI2RlZmluZSBCMjA1NV9DMV9TUF9QRE1JU0MJCTB4MDQgLyogU1AgUEQgTUlTQyBDb3JlIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzJfU1BfUlNTSQkJMHgwNSAvKiBTUCBSU1NJIENvcmUgMiAqLworI2RlZmluZSBCMjA1NV9DMl9TUF9QRE1JU0MJCTB4MDYgLyogU1AgUEQgTUlTQyBDb3JlIDIgKi8KKyNkZWZpbmUgQjIwNTVfQzFfU1BfUlhHQzEJCTB4MDcgLyogU1AgUlggR0MxIENvcmUgMSAqLworI2RlZmluZSBCMjA1NV9DMV9TUF9SWEdDMgkJMHgwOCAvKiBTUCBSWCBHQzIgQ29yZSAxICovCisjZGVmaW5lIEIyMDU1X0MyX1NQX1JYR0MxCQkweDA5IC8qIFNQIFJYIEdDMSBDb3JlIDIgKi8KKyNkZWZpbmUgQjIwNTVfQzJfU1BfUlhHQzIJCTB4MEEgLyogU1AgUlggR0MyIENvcmUgMiAqLworI2RlZmluZSBCMjA1NV9DMV9TUF9MUEZCV1NFTAkJMHgwQiAvKiBTUCBMUEYgQlcgc2VsZWN0IENvcmUgMSAqLworI2RlZmluZSBCMjA1NV9DMl9TUF9MUEZCV1NFTAkJMHgwQyAvKiBTUCBMUEYgQlcgc2VsZWN0IENvcmUgMiAqLworI2RlZmluZSBCMjA1NV9DMV9TUF9UWEdDMQkJMHgwRCAvKiBTUCBUWCBHQzEgQ29yZSAxICovCisjZGVmaW5lIEIyMDU1X0MxX1NQX1RYR0MyCQkweDBFIC8qIFNQIFRYIEdDMiBDb3JlIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzJfU1BfVFhHQzEJCTB4MEYgLyogU1AgVFggR0MxIENvcmUgMiAqLworI2RlZmluZSBCMjA1NV9DMl9TUF9UWEdDMgkJMHgxMCAvKiBTUCBUWCBHQzIgQ29yZSAyICovCisjZGVmaW5lIEIyMDU1X01BU1RFUjEJCQkweDExIC8qIE1hc3RlciBjb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNTVfTUFTVEVSMgkJCTB4MTIgLyogTWFzdGVyIGNvbnRyb2wgMiAqLworI2RlZmluZSBCMjA1NV9QRF9MR0VOCQkJMHgxMyAvKiBQRCBMR0VOICovCisjZGVmaW5lIEIyMDU1X1BEX1BMTFRTCQkJMHgxNCAvKiBQRCBQTEwgVFMgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUERfTEdCVUYJCTB4MTUgLyogUEQgQ29yZSAxIExHQlVGICovCisjZGVmaW5lIEIyMDU1X0MxX1BEX1RYCQkJMHgxNiAvKiBQRCBDb3JlIDEgVFggKi8KKyNkZWZpbmUgQjIwNTVfQzFfUERfUlhUWAkJMHgxNyAvKiBQRCBDb3JlIDEgUlhUWCAqLworI2RlZmluZSBCMjA1NV9DMV9QRF9SU1NJTUlTQwkJMHgxOCAvKiBQRCBDb3JlIDEgUlNTSSBNSVNDICovCisjZGVmaW5lIEIyMDU1X0MyX1BEX0xHQlVGCQkweDE5IC8qIFBEIENvcmUgMiBMR0JVRiAqLworI2RlZmluZSBCMjA1NV9DMl9QRF9UWAkJCTB4MUEgLyogUEQgQ29yZSAyIFRYICovCisjZGVmaW5lIEIyMDU1X0MyX1BEX1JYVFgJCTB4MUIgLyogUEQgQ29yZSAyIFJYVFggKi8KKyNkZWZpbmUgQjIwNTVfQzJfUERfUlNTSU1JU0MJCTB4MUMgLyogUEQgQ29yZSAyIFJTU0kgTUlTQyAqLworI2RlZmluZSBCMjA1NV9QV1JERVRfTEdFTgkJMHgxRCAvKiBQV1JERVQgTEdFTiAqLworI2RlZmluZSBCMjA1NV9DMV9QV1JERVRfTEdCVUYJCTB4MUUgLyogUFdSREVUIExHQlVGIENvcmUgMSAqLworI2RlZmluZSBCMjA1NV9DMV9QV1JERVRfUlhUWAkJMHgxRiAvKiBQV1JERVQgUlhUWCBDb3JlIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUFdSREVUX0xHQlVGCQkweDIwIC8qIFBXUkRFVCBMR0JVRiBDb3JlIDIgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUFdSREVUX1JYVFgJCTB4MjEgLyogUFdSREVUIFJYVFggQ29yZSAyICovCisjZGVmaW5lIEIyMDU1X1JSQ0NBTF9DUwkJCTB4MjIgLyogUlJDQ0FMIENvbnRyb2wgc3BhcmUgKi8KKyNkZWZpbmUgQjIwNTVfUlJDQ0FMX05PUFRTRUwJCTB4MjMgLyogUlJDQ0FMIE4gT1BUIFNFTCAqLworI2RlZmluZSBCMjA1NV9DQUxfTUlTQwkJCTB4MjQgLyogQ0FMIE1JU0MgKi8KKyNkZWZpbmUgQjIwNTVfQ0FMX0NPVVQJCQkweDI1IC8qIENBTCBDb3VudGVyIG91dCAqLworI2RlZmluZSBCMjA1NV9DQUxfQ09VVDIJCQkweDI2IC8qIENBTCBDb3VudGVyIG91dCAyICovCisjZGVmaW5lIEIyMDU1X0NBTF9DVkFSQ1RMCQkweDI3IC8qIENBTCBDVkFSIENvbnRyb2wgKi8KKyNkZWZpbmUgQjIwNTVfQ0FMX1JWQVJDVEwJCTB4MjggLyogQ0FMIFJWQVIgQ29udHJvbCAqLworI2RlZmluZSBCMjA1NV9DQUxfTFBPQ1RMCQkweDI5IC8qIENBTCBMUE8gQ29udHJvbCAqLworI2RlZmluZSBCMjA1NV9DQUxfVFMJCQkweDJBIC8qIENBTCBUUyAqLworI2RlZmluZSBCMjA1NV9DQUxfUkNDQUxSVFMJCTB4MkIgLyogQ0FMIFJDQ0FMIFJFQUQgVFMgKi8KKyNkZWZpbmUgQjIwNTVfQ0FMX1JDQUxSVFMJCTB4MkMgLyogQ0FMIFJDQUwgUkVBRCBUUyAqLworI2RlZmluZSBCMjA1NV9QQUREUlYJCQkweDJEIC8qIFBBRCBkcml2ZXIgKi8KKyNkZWZpbmUgQjIwNTVfWE9DVEwxCQkJMHgyRSAvKiBYTyBDb250cm9sIDEgKi8KKyNkZWZpbmUgQjIwNTVfWE9DVEwyCQkJMHgyRiAvKiBYTyBDb250cm9sIDIgKi8KKyNkZWZpbmUgQjIwNTVfWE9SRUdVTAkJCTB4MzAgLyogWE8gUmVndWxhdG9yICovCisjZGVmaW5lIEIyMDU1X1hPTUlTQwkJCTB4MzEgLyogWE8gbWlzYyAqLworI2RlZmluZSBCMjA1NV9QTExfTEZDMQkJCTB4MzIgLyogUExMIExGIEMxICovCisjZGVmaW5lIEIyMDU1X1BMTF9DQUxWVEgJCTB4MzMgLyogUExMIENBTCBWVEggKi8KKyNkZWZpbmUgQjIwNTVfUExMX0xGQzIJCQkweDM0IC8qIFBMTCBMRiBDMiAqLworI2RlZmluZSBCMjA1NV9QTExfUkVGCQkJMHgzNSAvKiBQTEwgcmVmZXJlbmNlICovCisjZGVmaW5lIEIyMDU1X1BMTF9MRlIxCQkJMHgzNiAvKiBQTEwgTEYgUjEgKi8KKyNkZWZpbmUgQjIwNTVfUExMX1BGRENQCQkJMHgzNyAvKiBQTEwgUEZEIENQICovCisjZGVmaW5lIEIyMDU1X1BMTF9JREFDX0NQT1BBTVAJCTB4MzggLyogUExMIElEQUMgQ1BPUEFNUCAqLworI2RlZmluZSBCMjA1NV9QTExfQ1BSRUcJCQkweDM5IC8qIFBMTCBDUCBSZWd1bGF0b3IgKi8KKyNkZWZpbmUgQjIwNTVfUExMX1JDQUwJCQkweDNBIC8qIFBMTCBSQ0FMICovCisjZGVmaW5lIEIyMDU1X1JGX1BMTE1PRDAJCTB4M0IgLyogUkYgUExMIE1PRDAgKi8KKyNkZWZpbmUgQjIwNTVfUkZfUExMTU9EMQkJMHgzQyAvKiBSRiBQTEwgTU9EMSAqLworI2RlZmluZSBCMjA1NV9SRl9NTURJREFDMQkJMHgzRCAvKiBSRiBNTUQgSURBQyAxICovCisjZGVmaW5lIEIyMDU1X1JGX01NRElEQUMwCQkweDNFIC8qIFJGIE1NRCBJREFDIDAgKi8KKyNkZWZpbmUgQjIwNTVfUkZfTU1EU1AJCQkweDNGIC8qIFJGIE1NRCBzcGFyZSAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMMQkJCTB4NDAgLyogVkNPIGNhbCAxICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQUwyCQkJMHg0MSAvKiBWQ08gY2FsIDIgKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0NBTDMJCQkweDQyIC8qIFZDTyBjYWwgMyAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMNAkJCTB4NDMgLyogVkNPIGNhbCA0ICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQUw1CQkJMHg0NCAvKiBWQ08gY2FsIDUgKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0NBTDYJCQkweDQ1IC8qIFZDTyBjYWwgNiAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMNwkJCTB4NDYgLyogVkNPIGNhbCA3ICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQUw4CQkJMHg0NyAvKiBWQ08gY2FsIDggKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0NBTDkJCQkweDQ4IC8qIFZDTyBjYWwgOSAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMMTAJCQkweDQ5IC8qIFZDTyBjYWwgMTAgKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0NBTDExCQkJMHg0QSAvKiBWQ08gY2FsIDExICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQUwxMgkJCTB4NEIgLyogVkNPIGNhbCAxMiAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMMTMJCQkweDRDIC8qIFZDTyBjYWwgMTMgKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0NBTDE0CQkJMHg0RCAvKiBWQ08gY2FsIDE0ICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQUwxNQkJCTB4NEUgLyogVkNPIGNhbCAxNSAqLworI2RlZmluZSBCMjA1NV9WQ09fQ0FMMTYJCQkweDRGIC8qIFZDTyBjYWwgMTYgKi8KKyNkZWZpbmUgQjIwNTVfVkNPX0tWQ08JCQkweDUwIC8qIFZDTyBLVkNPICovCisjZGVmaW5lIEIyMDU1X1ZDT19DQVBUQUlMCQkweDUxIC8qIFZDTyBDQVAgVEFJTCAqLworI2RlZmluZSBCMjA1NV9WQ09fSURBQ1ZDTwkJMHg1MiAvKiBWQ08gSURBQyBWQ08gKi8KKyNkZWZpbmUgQjIwNTVfVkNPX1JFRwkJCTB4NTMgLyogVkNPIFJlZ3VsYXRvciAqLworI2RlZmluZSBCMjA1NV9QTExfUkZWVEgJCQkweDU0IC8qIFBMTCBSRiBWVEggKi8KKyNkZWZpbmUgQjIwNTVfTEdCVUZfQ0VOQlVGCQkweDU1IC8qIExHQlVGIENFTiBCVUYgKi8KKyNkZWZpbmUgQjIwNTVfTEdFTl9UVU5FMQkJMHg1NiAvKiBMR0VOIHR1bmUgMSAqLworI2RlZmluZSBCMjA1NV9MR0VOX1RVTkUyCQkweDU3IC8qIExHRU4gdHVuZSAyICovCisjZGVmaW5lIEIyMDU1X0xHRU5fSURBQzEJCTB4NTggLyogTEdFTiBJREFDIDEgKi8KKyNkZWZpbmUgQjIwNTVfTEdFTl9JREFDMgkJMHg1OSAvKiBMR0VOIElEQUMgMiAqLworI2RlZmluZSBCMjA1NV9MR0VOX0JJQVNDCQkweDVBIC8qIExHRU4gQklBUyBjb3VudGVyICovCisjZGVmaW5lIEIyMDU1X0xHRU5fQklBU0lEQUMJCTB4NUIgLyogTEdFTiBCSUFTIElEQUMgKi8KKyNkZWZpbmUgQjIwNTVfTEdFTl9SQ0FMCQkJMHg1QyAvKiBMR0VOIFJDQUwgKi8KKyNkZWZpbmUgQjIwNTVfTEdFTl9ESVYJCQkweDVEIC8qIExHRU4gZGl2ICovCisjZGVmaW5lIEIyMDU1X0xHRU5fU1BBUkUyCQkweDVFIC8qIExHRU4gc3BhcmUgMiAqLworI2RlZmluZSBCMjA1NV9DMV9MR0JVRl9BVFVORQkJMHg1RiAvKiBDb3JlIDEgTEdCVUYgQSB0dW5lICovCisjZGVmaW5lIEIyMDU1X0MxX0xHQlVGX0dUVU5FCQkweDYwIC8qIENvcmUgMSBMR0JVRiBHIHR1bmUgKi8KKyNkZWZpbmUgQjIwNTVfQzFfTEdCVUZfRElWCQkweDYxIC8qIENvcmUgMSBMR0JVRiBkaXYgKi8KKyNkZWZpbmUgQjIwNTVfQzFfTEdCVUZfQUlEQUMJCTB4NjIgLyogQ29yZSAxIExHQlVGIEEgSURBQyAqLworI2RlZmluZSBCMjA1NV9DMV9MR0JVRl9HSURBQwkJMHg2MyAvKiBDb3JlIDEgTEdCVUYgRyBJREFDICovCisjZGVmaW5lIEIyMDU1X0MxX0xHQlVGX0lEQUNGTwkJMHg2NCAvKiBDb3JlIDEgTEdCVUYgSURBQyBmaWx0ZXIgb3ZlcnJpZGUgKi8KKyNkZWZpbmUgQjIwNTVfQzFfTEdCVUZfU1BBUkUJCTB4NjUgLyogQ29yZSAxIExHQlVGIHNwYXJlICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX1JGU1BDMQkJMHg2NiAvKiBDb3JlIDEgUlggUkYgU1BDMSAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9SRlIxCQkweDY3IC8qIENvcmUgMSBSWCBSRiByZWcgMSAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9SRlIyCQkweDY4IC8qIENvcmUgMSBSWCBSRiByZWcgMiAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9SRlJDQUwJCTB4NjkgLyogQ29yZSAxIFJYIFJGIFJDQUwgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfQkxDTVAJCTB4NkEgLyogQ29yZSAxIFJYIEJhc2ViYW5kIEJVRkkgTFBGIENNUCAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9MUEYJCTB4NkIgLyogQ29yZSAxIFJYIEJhc2ViYW5kIExQRiAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9NSURBQ0hQCQkweDZDIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBNSURBQyBIaWdoLXBhc3MgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfVkdBMUlEQUMJCTB4NkQgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFZHQTEgSURBQyAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9WR0EySURBQwkJMHg2RSAvKiBDb3JlIDEgUlggQmFzZWJhbmQgVkdBMiBJREFDICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1ZHQTNJREFDCQkweDZGIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBWR0EzIElEQUMgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfQlVGT0NUTAkJMHg3MCAvKiBDb3JlIDEgUlggQmFzZWJhbmQgQlVGTyBDb250cm9sICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1JDQ0FMQ1RMCQkweDcxIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSQ0NBTCBDb250cm9sICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1JTU0lDVEwxCQkweDcyIC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgMSAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9SU1NJQ1RMMgkJMHg3MyAvKiBDb3JlIDEgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDIgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfUlNTSUNUTDMJCTB4NzQgLyogQ29yZSAxIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCAzICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX0JCX1JTU0lDVEw0CQkweDc1IC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgNCAqLworI2RlZmluZSBCMjA1NV9DMV9SWF9CQl9SU1NJQ1RMNQkJMHg3NiAvKiBDb3JlIDEgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDUgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfUkVHCQkweDc3IC8qIENvcmUgMSBSWCBCYXNlYmFuZCBSZWd1bGF0b3IgKi8KKyNkZWZpbmUgQjIwNTVfQzFfUlhfQkJfU1BBUkUxCQkweDc4IC8qIENvcmUgMSBSWCBCYXNlYmFuZCBzcGFyZSAxICovCisjZGVmaW5lIEIyMDU1X0MxX1JYX1RYQkJSQ0FMCQkweDc5IC8qIENvcmUgMSBSWCBUWCBCQiBSQ0FMICovCisjZGVmaW5lIEIyMDU1X0MxX1RYX1JGX1NQR0EJCTB4N0EgLyogQ29yZSAxIFRYIFJGIFNHTSBQR0EgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfU1BBRAkJMHg3QiAvKiBDb3JlIDEgVFggUkYgU0dNIFBBRCAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9DTlRQR0ExCQkweDdDIC8qIENvcmUgMSBUWCBSRiBjb3VudGVyIFBHQSAxICovCisjZGVmaW5lIEIyMDU1X0MxX1RYX1JGX0NOVFBBRDEJCTB4N0QgLyogQ29yZSAxIFRYIFJGIGNvdW50ZXIgUEFEIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfUEdBSURBQwkJMHg3RSAvKiBDb3JlIDEgVFggUkYgUEdBIElEQUMgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUEdBUEFEVE4JCTB4N0YgLyogQ29yZSAxIFRYIFBHQSBQQUQgVE4gKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUEFESURBQzEJCTB4ODAgLyogQ29yZSAxIFRYIFBBRCBJREFDIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUEFESURBQzIJCTB4ODEgLyogQ29yZSAxIFRYIFBBRCBJREFDIDIgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfTVhCR1RSSU0JCTB4ODIgLyogQ29yZSAxIFRYIE1YIEIvRyBUUklNICovCisjZGVmaW5lIEIyMDU1X0MxX1RYX1JGX1JDQUwJCTB4ODMgLyogQ29yZSAxIFRYIFJGIFJDQUwgKi8KKyNkZWZpbmUgQjIwNTVfQzFfVFhfUkZfUEFEVFNTSTEJCTB4ODQgLyogQ29yZSAxIFRYIFJGIFBBRCBUU1NJMSAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9QQURUU1NJMgkJMHg4NSAvKiBDb3JlIDEgVFggUkYgUEFEIFRTU0kyICovCisjZGVmaW5lIEIyMDU1X0MxX1RYX1JGX1NQQVJFCQkweDg2IC8qIENvcmUgMSBUWCBSRiBzcGFyZSAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9JUUNBTDEJCTB4ODcgLyogQ29yZSAxIFRYIFJGIEkvUSBDQUwgMSAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9SRl9JUUNBTDIJCTB4ODggLyogQ29yZSAxIFRYIFJGIEkvUSBDQUwgMiAqLworI2RlZmluZSBCMjA1NV9DMV9UWEJCX1JDQ0FMCQkweDg5IC8qIENvcmUgMSBUWEJCIFJDIENBTCBDb250cm9sICovCisjZGVmaW5lIEIyMDU1X0MxX1RYQkJfTFBGMQkJMHg4QSAvKiBDb3JlIDEgVFhCQiBMUEYgMSAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9WT1NDTkNMCQkweDhCIC8qIENvcmUgMSBUWCBWT1MgQ05DTCAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9MUEZfTVhHTUlEQUMJMHg4QyAvKiBDb3JlIDEgVFggTFBGIE1YR00gSURBQyAqLworI2RlZmluZSBCMjA1NV9DMV9UWF9CQl9NWEdNCQkweDhEIC8qIENvcmUgMSBUWCBCQiBNWEdNICovCisjZGVmaW5lIEIyMDU1X0MyX0xHQlVGX0FUVU5FCQkweDhFIC8qIENvcmUgMiBMR0JVRiBBIHR1bmUgKi8KKyNkZWZpbmUgQjIwNTVfQzJfTEdCVUZfR1RVTkUJCTB4OEYgLyogQ29yZSAyIExHQlVGIEcgdHVuZSAqLworI2RlZmluZSBCMjA1NV9DMl9MR0JVRl9ESVYJCTB4OTAgLyogQ29yZSAyIExHQlVGIGRpdiAqLworI2RlZmluZSBCMjA1NV9DMl9MR0JVRl9BSURBQwkJMHg5MSAvKiBDb3JlIDIgTEdCVUYgQSBJREFDICovCisjZGVmaW5lIEIyMDU1X0MyX0xHQlVGX0dJREFDCQkweDkyIC8qIENvcmUgMiBMR0JVRiBHIElEQUMgKi8KKyNkZWZpbmUgQjIwNTVfQzJfTEdCVUZfSURBQ0ZPCQkweDkzIC8qIENvcmUgMiBMR0JVRiBJREFDIGZpbHRlciBvdmVycmlkZSAqLworI2RlZmluZSBCMjA1NV9DMl9MR0JVRl9TUEFSRQkJMHg5NCAvKiBDb3JlIDIgTEdCVUYgc3BhcmUgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfUkZTUEMxCQkweDk1IC8qIENvcmUgMiBSWCBSRiBTUEMxICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX1JGUjEJCTB4OTYgLyogQ29yZSAyIFJYIFJGIHJlZyAxICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX1JGUjIJCTB4OTcgLyogQ29yZSAyIFJYIFJGIHJlZyAyICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX1JGUkNBTAkJMHg5OCAvKiBDb3JlIDIgUlggUkYgUkNBTCAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9CTENNUAkJMHg5OSAvKiBDb3JlIDIgUlggQmFzZWJhbmQgQlVGSSBMUEYgQ01QICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX0JCX0xQRgkJMHg5QSAvKiBDb3JlIDIgUlggQmFzZWJhbmQgTFBGICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX0JCX01JREFDSFAJCTB4OUIgLyogQ29yZSAyIFJYIEJhc2ViYW5kIE1JREFDIEhpZ2gtcGFzcyAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9WR0ExSURBQwkJMHg5QyAvKiBDb3JlIDIgUlggQmFzZWJhbmQgVkdBMSBJREFDICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1ZHQTJJREFDCQkweDlEIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBWR0EyIElEQUMgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfVkdBM0lEQUMJCTB4OUUgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFZHQTMgSURBQyAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9CVUZPQ1RMCQkweDlGIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBCVUZPIENvbnRyb2wgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfUkNDQUxDVEwJCTB4QTAgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJDQ0FMIENvbnRyb2wgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfUlNTSUNUTDEJCTB4QTEgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCAxICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1JTU0lDVEwyCQkweEEyIC8qIENvcmUgMiBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgMiAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9SU1NJQ1RMMwkJMHhBMyAvKiBDb3JlIDIgUlggQmFzZWJhbmQgUlNTSSBDb250cm9sIDMgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfQkJfUlNTSUNUTDQJCTB4QTQgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJTU0kgQ29udHJvbCA0ICovCisjZGVmaW5lIEIyMDU1X0MyX1JYX0JCX1JTU0lDVEw1CQkweEE1IC8qIENvcmUgMiBSWCBCYXNlYmFuZCBSU1NJIENvbnRyb2wgNSAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9SRUcJCTB4QTYgLyogQ29yZSAyIFJYIEJhc2ViYW5kIFJlZ3VsYXRvciAqLworI2RlZmluZSBCMjA1NV9DMl9SWF9CQl9TUEFSRTEJCTB4QTcgLyogQ29yZSAyIFJYIEJhc2ViYW5kIHNwYXJlIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzJfUlhfVFhCQlJDQUwJCTB4QTggLyogQ29yZSAyIFJYIFRYIEJCIFJDQUwgKi8KKyNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfU1BHQQkJMHhBOSAvKiBDb3JlIDIgVFggUkYgU0dNIFBHQSAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9TUEFECQkweEFBIC8qIENvcmUgMiBUWCBSRiBTR00gUEFEICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX1JGX0NOVFBHQTEJCTB4QUIgLyogQ29yZSAyIFRYIFJGIGNvdW50ZXIgUEdBIDEgKi8KKyNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfQ05UUEFEMQkJMHhBQyAvKiBDb3JlIDIgVFggUkYgY291bnRlciBQQUQgMSAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9QR0FJREFDCQkweEFEIC8qIENvcmUgMiBUWCBSRiBQR0EgSURBQyAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9QR0FQQURUTgkJMHhBRSAvKiBDb3JlIDIgVFggUEdBIFBBRCBUTiAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9QQURJREFDMQkJMHhBRiAvKiBDb3JlIDIgVFggUEFEIElEQUMgMSAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9QQURJREFDMgkJMHhCMCAvKiBDb3JlIDIgVFggUEFEIElEQUMgMiAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9NWEJHVFJJTQkJMHhCMSAvKiBDb3JlIDIgVFggTVggQi9HIFRSSU0gKi8KKyNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfUkNBTAkJMHhCMiAvKiBDb3JlIDIgVFggUkYgUkNBTCAqLworI2RlZmluZSBCMjA1NV9DMl9UWF9SRl9QQURUU1NJMQkJMHhCMyAvKiBDb3JlIDIgVFggUkYgUEFEIFRTU0kxICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX1JGX1BBRFRTU0kyCQkweEI0IC8qIENvcmUgMiBUWCBSRiBQQUQgVFNTSTIgKi8KKyNkZWZpbmUgQjIwNTVfQzJfVFhfUkZfU1BBUkUJCTB4QjUgLyogQ29yZSAyIFRYIFJGIHNwYXJlICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX1JGX0lRQ0FMMQkJMHhCNiAvKiBDb3JlIDIgVFggUkYgSS9RIENBTCAxICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX1JGX0lRQ0FMMgkJMHhCNyAvKiBDb3JlIDIgVFggUkYgSS9RIENBTCAyICovCisjZGVmaW5lIEIyMDU1X0MyX1RYQkJfUkNDQUwJCTB4QjggLyogQ29yZSAyIFRYQkIgUkMgQ0FMIENvbnRyb2wgKi8KKyNkZWZpbmUgQjIwNTVfQzJfVFhCQl9MUEYxCQkweEI5IC8qIENvcmUgMiBUWEJCIExQRiAxICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX1ZPU0NOQ0wJCTB4QkEgLyogQ29yZSAyIFRYIFZPUyBDTkNMICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX0xQRl9NWEdNSURBQwkweEJCIC8qIENvcmUgMiBUWCBMUEYgTVhHTSBJREFDICovCisjZGVmaW5lIEIyMDU1X0MyX1RYX0JCX01YR00JCTB4QkMgLyogQ29yZSAyIFRYIEJCIE1YR00gKi8KKyNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyMQkJMHhCRCAvKiBQUkcgR0MgSFBWR0EyMyAyMSAqLworI2RlZmluZSBCMjA1NV9QUkdfR0NIUDIyCQkweEJFIC8qIFBSRyBHQyBIUFZHQTIzIDIyICovCisjZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjMJCTB4QkYgLyogUFJHIEdDIEhQVkdBMjMgMjMgKi8KKyNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyNAkJMHhDMCAvKiBQUkcgR0MgSFBWR0EyMyAyNCAqLworI2RlZmluZSBCMjA1NV9QUkdfR0NIUDI1CQkweEMxIC8qIFBSRyBHQyBIUFZHQTIzIDI1ICovCisjZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjYJCTB4QzIgLyogUFJHIEdDIEhQVkdBMjMgMjYgKi8KKyNkZWZpbmUgQjIwNTVfUFJHX0dDSFAyNwkJMHhDMyAvKiBQUkcgR0MgSFBWR0EyMyAyNyAqLworI2RlZmluZSBCMjA1NV9QUkdfR0NIUDI4CQkweEM0IC8qIFBSRyBHQyBIUFZHQTIzIDI4ICovCisjZGVmaW5lIEIyMDU1X1BSR19HQ0hQMjkJCTB4QzUgLyogUFJHIEdDIEhQVkdBMjMgMjkgKi8KKyNkZWZpbmUgQjIwNTVfUFJHX0dDSFAzMAkJMHhDNiAvKiBQUkcgR0MgSFBWR0EyMyAzMCAqLworI2RlZmluZSBCMjA1NV9DMV9MTkFfR0FJTkJTVAkJMHhDRCAvKiBDb3JlIDEgTE5BIEdBSU5CU1QgKi8KKyNkZWZpbmUgQjIwNTVfQzFfQjBOQl9SU1NJVkNNCQkweEQyIC8qIENvcmUgMSBCMCBuYXJyb3ctYmFuZCBSU1NJIFZDTSAqLworI2RlZmluZSBCMjA1NV9DMV9HRU5TUEFSRTIJCTB4RDYgLyogQ29yZSAxIEdFTiBzcGFyZSAyICovCisjZGVmaW5lIEIyMDU1X0MyX0xOQV9HQUlOQlNUCQkweEQ5IC8qIENvcmUgMiBMTkEgR0FJTkJTVCAqLworI2RlZmluZSBCMjA1NV9DMl9CME5CX1JTU0lWQ00JCTB4REUgLyogQ29yZSAyIEIwIG5hcnJvdy1iYW5kIFJTU0kgVkNNICovCisjZGVmaW5lIEIyMDU1X0MyX0dFTlNQQVJFMgkJMHhFMiAvKiBDb3JlIDIgR0VOIHNwYXJlIDIgKi8KKworCisKK3N0cnVjdCBiNDNfd2xkZXY7CisKK3N0cnVjdCBiNDNfcGh5X24geworCS8vVE9ETyBsb3RzIG9mIG1pc3Npbmcgc3R1ZmYKK307CisKKworc3RydWN0IGI0M19waHlfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYjQzX3BoeV9vcGVyYXRpb25zIGI0M19waHlvcHNfbjsKKworI2VuZGlmIC8qIEI0M19OUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmZraWxsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmZraWxsLmMKaW5kZXggZmVjNTY0NS4uNzEzNzUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Jma2lsbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yZmtpbGwuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSAicmZraWxsLmgiCiAjaW5jbHVkZSAiYjQzLmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgogCiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCkBAIC00MywyMyArNDQsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBVcGRhdGUgdGhlIHJma2lsbCBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYjQzX3Jma2lsbF91cGRhdGVfc3RhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcmZraWxsICpyZmsgPSAmKGRldi0+d2wtPnJma2lsbCk7Ci0KLQlpZiAoIWRldi0+cmFkaW9faHdfZW5hYmxlKSB7Ci0JCXJmay0+cmZraWxsLT5zdGF0ZSA9IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQ7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWRldi0+cGh5LnJhZGlvX29uKQotCQlyZmstPnJma2lsbC0+c3RhdGUgPSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotCWVsc2UKLQkJcmZrLT5yZmtpbGwtPnN0YXRlID0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKLQotfQotCiAvKiBUaGUgcG9sbCBjYWxsYmFjayBmb3IgdGhlIGhhcmR3YXJlIGJ1dHRvbi4gKi8KIHN0YXRpYyB2b2lkIGI0M19yZmtpbGxfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqcG9sbF9kZXYpCiB7CkBAIC03Nyw3ICs2MSw2IEBACiAJaWYgKHVubGlrZWx5KGVuYWJsZWQgIT0gZGV2LT5yYWRpb19od19lbmFibGUpKSB7CiAJCWRldi0+cmFkaW9faHdfZW5hYmxlID0gZW5hYmxlZDsKIAkJcmVwb3J0X2NoYW5nZSA9IDE7Ci0JCWI0M19yZmtpbGxfdXBkYXRlX3N0YXRlKGRldik7CiAJCWI0M2luZm8od2wsICJSYWRpbyBoYXJkd2FyZSBzdGF0dXMgY2hhbmdlZCB0byAlc1xuIiwKIAkJCWVuYWJsZWQgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiKTsKIAl9CkBAIC0xMTQsMTEgKzk3LDExIEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAkJaWYgKCFkZXYtPnBoeS5yYWRpb19vbikKLQkJCWI0M19yYWRpb190dXJuX29uKGRldik7CisJCQliNDNfc29mdHdhcmVfcmZraWxsKGRldiwgc3RhdGUpOwogCQlicmVhazsKIAljYXNlIFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ6CiAJCWlmIChkZXYtPnBoeS5yYWRpb19vbikKLQkJCWI0M19yYWRpb190dXJuX29mZihkZXYsIDApOworCQkJYjQzX3NvZnR3YXJlX3Jma2lsbChkZXYsIHN0YXRlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYjQzd2Fybih3bCwgIlJlY2VpdmVkIHVuZXhwZWN0ZWQgcmZraWxsIHN0YXRlICVkLlxuIiwgc3RhdGUpOwpAQCAtMTg3LDYgKzE3MCwxMSBAQAogCQkJIlRoZSBidWlsdC1pbiByYWRpbyBMRUQgd2lsbCBub3Qgd29yay5cbiIpOwogI2VuZGlmIC8qIENPTkZJR19SRktJTExfSU5QVVQgKi8KIAorI2lmICFkZWZpbmVkKENPTkZJR19SRktJTExfSU5QVVQpICYmICFkZWZpbmVkKENPTkZJR19SRktJTExfSU5QVVRfTU9EVUxFKQorCWI0M3dhcm4od2wsICJUaGUgcmZraWxsLWlucHV0IHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlLiAiCisJCSJUaGUgYnVpbHQtaW4gcmFkaW8gTEVEIHdpbGwgbm90IHdvcmsuXG4iKTsKKyNlbmRpZgorCiAJZXJyID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShyZmstPnBvbGxfZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl91bnJlZ19yZms7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvc3lzZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zeXNmcy5jCmluZGV4IDI3NTA5NWIuLjVhZGFhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zeXNmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9zeXNmcy5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSAiYjQzLmgiCiAjaW5jbHVkZSAic3lzZnMuaCIKICNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgogCiAjZGVmaW5lIEdFTkVSSUNfRklMRVNJWkUJNjQKIApAQCAtNTksNyArNTksMTIgQEAKIAogCW11dGV4X2xvY2soJndsZGV2LT53bC0+bXV0ZXgpOwogCi0Jc3dpdGNoICh3bGRldi0+cGh5LmludGVyZm1vZGUpIHsKKwlpZiAod2xkZXYtPnBoeS50eXBlICE9IEI0M19QSFlUWVBFX0cpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ3bGRldi0+d2wtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJc3dpdGNoICh3bGRldi0+cGh5LmctPmludGVyZm1vZGUpIHsKIAljYXNlIEI0M19JTlRFUkZNT0RFX05PTkU6CiAJCWNvdW50ID0KIAkJICAgIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLApAQCAtMTE3LDExICsxMjIsMTUgQEAKIAltdXRleF9sb2NrKCZ3bGRldi0+d2wtPm11dGV4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2xkZXYtPndsLT5pcnFfbG9jaywgZmxhZ3MpOwogCi0JZXJyID0gYjQzX3JhZGlvX3NldF9pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbih3bGRldiwgbW9kZSk7Ci0JaWYgKGVycikgewotCQliNDNlcnIod2xkZXYtPndsLCAiSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gbm90ICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgZGV2aWNlXG4iKTsKLQl9CisJaWYgKHdsZGV2LT5waHkub3BzLT5pbnRlcmZfbWl0aWdhdGlvbikgeworCQllcnIgPSB3bGRldi0+cGh5Lm9wcy0+aW50ZXJmX21pdGlnYXRpb24od2xkZXYsIG1vZGUpOworCQlpZiAoZXJyKSB7CisJCQliNDNlcnIod2xkZXYtPndsLCAiSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gbm90ICIKKwkJCSAgICAgICAic3VwcG9ydGVkIGJ5IGRldmljZVxuIik7CisJCX0KKwl9IGVsc2UKKwkJZXJyID0gLUVOT1NZUzsKKwogCW1taW93YigpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsZGV2LT53bC0+aXJxX2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJndsZGV2LT53bC0+bXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlcy5jCmluZGV4IDNmNWVhMDYuLjFlZjlhNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzLmMKQEAgLTI3LDcgKzI3LDggQEAKIAogI2luY2x1ZGUgImI0My5oIgogI2luY2x1ZGUgInRhYmxlcy5oIgotI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgInBoeV9nLmgiCisKIAogY29uc3QgdTMyIGI0M190YWJfcm90b3JbXSA9IHsKIAkweEZFQjkzRkZELCAweEZFQzYzRkZELAkvKiAwICovCkBAIC0zNzcsMTcgKzM3OCwxNyBAQAogCiB1MTYgYjQzX29mZG10YWJfcmVhZDE2KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0KQogewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IGRldi0+cGh5Lmc7CiAJdTE2IGFkZHI7CiAKIAlhZGRyID0gdGFibGUgKyBvZmZzZXQ7Ci0JaWYgKChwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gIT0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1JFQUQpIHx8Ci0JICAgIChhZGRyIC0gMSAhPSBwaHktPm9mZG10YWJfYWRkcikpIHsKKwlpZiAoKGdwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gIT0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1JFQUQpIHx8CisJICAgIChhZGRyIC0gMSAhPSBncGh5LT5vZmRtdGFiX2FkZHIpKSB7CiAJCS8qIFRoZSBoYXJkd2FyZSBoYXMgYSBkaWZmZXJlbnQgYWRkcmVzcyBpbiBtZW1vcnkuIFVwZGF0ZSBpdC4gKi8KIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT1RBQkxFQ1RMLCBhZGRyKTsKLQkJcGh5LT5vZmRtdGFiX2FkZHJfZGlyZWN0aW9uID0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1JFQUQ7CisJCWdwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fUkVBRDsKIAl9Ci0JcGh5LT5vZmRtdGFiX2FkZHIgPSBhZGRyOworCWdwaHktPm9mZG10YWJfYWRkciA9IGFkZHI7CiAKIAlyZXR1cm4gYjQzX3BoeV9yZWFkKGRldiwgQjQzX1BIWV9PVEFCTEVJKTsKIApAQCAtMzk4LDM0ICszOTksMzQgQEAKIHZvaWQgYjQzX29mZG10YWJfd3JpdGUxNihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiB0YWJsZSwKIAkJCSB1MTYgb2Zmc2V0LCB1MTYgdmFsdWUpCiB7Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9nICpncGh5ID0gZGV2LT5waHkuZzsKIAl1MTYgYWRkcjsKIAogCWFkZHIgPSB0YWJsZSArIG9mZnNldDsKLQlpZiAoKHBoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiAhPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fV1JJVEUpIHx8Ci0JICAgIChhZGRyIC0gMSAhPSBwaHktPm9mZG10YWJfYWRkcikpIHsKKwlpZiAoKGdwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gIT0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1dSSVRFKSB8fAorCSAgICAoYWRkciAtIDEgIT0gZ3BoeS0+b2ZkbXRhYl9hZGRyKSkgewogCQkvKiBUaGUgaGFyZHdhcmUgaGFzIGEgZGlmZmVyZW50IGFkZHJlc3MgaW4gbWVtb3J5LiBVcGRhdGUgaXQuICovCiAJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09UQUJMRUNUTCwgYWRkcik7Ci0JCXBoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiA9IEI0M19PRkRNVEFCX0RJUkVDVElPTl9XUklURTsKKwkJZ3BoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiA9IEI0M19PRkRNVEFCX0RJUkVDVElPTl9XUklURTsKIAl9Ci0JcGh5LT5vZmRtdGFiX2FkZHIgPSBhZGRyOworCWdwaHktPm9mZG10YWJfYWRkciA9IGFkZHI7CiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT1RBQkxFSSwgdmFsdWUpOwogfQogCiB1MzIgYjQzX29mZG10YWJfcmVhZDMyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLCB1MTYgb2Zmc2V0KQogewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IGRldi0+cGh5Lmc7CiAJdTMyIHJldDsKIAl1MTYgYWRkcjsKIAogCWFkZHIgPSB0YWJsZSArIG9mZnNldDsKLQlpZiAoKHBoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiAhPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fUkVBRCkgfHwKLQkgICAgKGFkZHIgLSAxICE9IHBoeS0+b2ZkbXRhYl9hZGRyKSkgeworCWlmICgoZ3BoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiAhPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fUkVBRCkgfHwKKwkgICAgKGFkZHIgLSAxICE9IGdwaHktPm9mZG10YWJfYWRkcikpIHsKIAkJLyogVGhlIGhhcmR3YXJlIGhhcyBhIGRpZmZlcmVudCBhZGRyZXNzIGluIG1lbW9yeS4gVXBkYXRlIGl0LiAqLwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PVEFCTEVDVEwsIGFkZHIpOwotCQlwaHktPm9mZG10YWJfYWRkcl9kaXJlY3Rpb24gPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fUkVBRDsKKwkJZ3BoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiA9IEI0M19PRkRNVEFCX0RJUkVDVElPTl9SRUFEOwogCX0KLQlwaHktPm9mZG10YWJfYWRkciA9IGFkZHI7CisJZ3BoeS0+b2ZkbXRhYl9hZGRyID0gYWRkcjsKIAlyZXQgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX09UQUJMRVEpOwogCXJldCA8PD0gMTY7CiAJcmV0IHw9IGI0M19waHlfcmVhZChkZXYsIEI0M19QSFlfT1RBQkxFSSk7CkBAIC00MzYsMTcgKzQzNywxNyBAQAogdm9pZCBiNDNfb2ZkbXRhYl93cml0ZTMyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IHRhYmxlLAogCQkJIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X2cgKmdwaHkgPSBkZXYtPnBoeS5nOwogCXUxNiBhZGRyOwogCiAJYWRkciA9IHRhYmxlICsgb2Zmc2V0OwotCWlmICgocGh5LT5vZmRtdGFiX2FkZHJfZGlyZWN0aW9uICE9IEI0M19PRkRNVEFCX0RJUkVDVElPTl9XUklURSkgfHwKLQkgICAgKGFkZHIgLSAxICE9IHBoeS0+b2ZkbXRhYl9hZGRyKSkgeworCWlmICgoZ3BoeS0+b2ZkbXRhYl9hZGRyX2RpcmVjdGlvbiAhPSBCNDNfT0ZETVRBQl9ESVJFQ1RJT05fV1JJVEUpIHx8CisJICAgIChhZGRyIC0gMSAhPSBncGh5LT5vZmRtdGFiX2FkZHIpKSB7CiAJCS8qIFRoZSBoYXJkd2FyZSBoYXMgYSBkaWZmZXJlbnQgYWRkcmVzcyBpbiBtZW1vcnkuIFVwZGF0ZSBpdC4gKi8KIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfT1RBQkxFQ1RMLCBhZGRyKTsKLQkJcGh5LT5vZmRtdGFiX2FkZHJfZGlyZWN0aW9uID0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1dSSVRFOworCQlncGh5LT5vZmRtdGFiX2FkZHJfZGlyZWN0aW9uID0gQjQzX09GRE1UQUJfRElSRUNUSU9OX1dSSVRFOwogCX0KLQlwaHktPm9mZG10YWJfYWRkciA9IGFkZHI7CisJZ3BoeS0+b2ZkbXRhYl9hZGRyID0gYWRkcjsKIAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX09UQUJMRUksIHZhbHVlKTsKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9PVEFCTEVRLCAodmFsdWUgPj4gMTYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKaW5kZXggMmFhNTc1NS4uNGUyMzM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKQEAgLTI0LDggKzI0LDggQEAKIAogI2luY2x1ZGUgImI0My5oIgogI2luY2x1ZGUgInRhYmxlc19ucGh5LmgiCi0jaW5jbHVkZSAicGh5LmgiCi0jaW5jbHVkZSAibnBoeS5oIgorI2luY2x1ZGUgInBoeV9jb21tb24uaCIKKyNpbmNsdWRlICJwaHlfbi5oIgogCiAKIHN0cnVjdCBiMjA1NV9pbml0dGFiX2VudHJ5IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My93YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKaW5kZXggZGFhOTQyMS4uMGMwZmIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3dhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJiNDMuaCIKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSAidGFibGVzLmgiCi0jaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAicGh5X2NvbW1vbi5oIgogI2luY2x1ZGUgIndhLmgiCiAKIHN0YXRpYyB2b2lkIGI0M193YV9wYXBkKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5jCmluZGV4IDlkZGE4MTYuLjJmYWJjZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYwpAQCAtMjgsNyArMjgsNyBAQAogKi8KIAogI2luY2x1ZGUgInhtaXQuaCIKLSNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJwaHlfY29tbW9uLmgiCiAjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGlvLmgiCiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCXR4cmF0ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShkZXYtPndsLT5odywgaW5mbyk7CiAJcmF0ZSA9IHR4cmF0ZSA/IHR4cmF0ZS0+aHdfdmFsdWUgOiBCNDNfQ0NLX1JBVEVfMU1COwogCXJhdGVfb2ZkbSA9IGI0M19pc19vZmRtX3JhdGUocmF0ZSk7Ci0JZmJyYXRlID0gaWVlZTgwMjExX2dldF9hbHRfcmV0cnlfcmF0ZShkZXYtPndsLT5odywgaW5mbykgPyA6IHR4cmF0ZTsKKwlmYnJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGRldi0+d2wtPmh3LCBpbmZvLCAwKSA/IDogdHhyYXRlOwogCXJhdGVfZmIgPSBmYnJhdGUtPmh3X3ZhbHVlOwogCXJhdGVfZmJfb2ZkbSA9IGI0M19pc19vZmRtX3JhdGUocmF0ZV9mYik7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogCQl9CiAKIAkJLyogSGFyZHdhcmUgYXBwZW5kcyBJQ1YuICovCi0JCXBsY3BfZnJhZ21lbnRfbGVuICs9IGluZm8tPmNvbnRyb2wuaWN2X2xlbjsKKwkJcGxjcF9mcmFnbWVudF9sZW4gKz0gaW5mby0+Y29udHJvbC5od19rZXktPmljdl9sZW47CiAKIAkJa2V5X2lkeCA9IGI0M19raWR4X3RvX2Z3KGRldiwga2V5X2lkeCk7CiAJCW1hY19jdGwgfD0gKGtleV9pZHggPDwgQjQzX1RYSF9NQUNfS0VZSURYX1NISUZUKSAmCkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJbWFjX2N0bCB8PSAoa2V5LT5hbGdvcml0aG0gPDwgQjQzX1RYSF9NQUNfS0VZQUxHX1NISUZUKSAmCiAJCQkgICBCNDNfVFhIX01BQ19LRVlBTEc7CiAJCXdsaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmN0bCk7Ci0JCWl2X2xlbiA9IG1pbigoc2l6ZV90KSBpbmZvLT5jb250cm9sLml2X2xlbiwKKwkJaXZfbGVuID0gbWluKChzaXplX3QpIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5pdl9sZW4sCiAJCQkgICAgIEFSUkFZX1NJWkUodHhoZHItPml2KSk7CiAJCW1lbWNweSh0eGhkci0+aXYsICgodTggKikgd2xoZHIpICsgd2xoZHJfbGVuLCBpdl9sZW4pOwogCX0KQEAgLTQzMSw2ICs0MzEsNyBAQAogCQkJICAgICAgIGludCBhZGp1c3RfMjA1MywgaW50IGFkanVzdF8yMDUwKQogewogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfZyAqZ3BoeSA9IHBoeS0+ZzsKIAlzMzIgdG1wOwogCiAJc3dpdGNoIChwaHktPnJhZGlvX3ZlcikgewpAQCAtNDUwLDcgKzQ1MSw4IEBACiAJCQkgICAgYm9hcmRmbGFnc19sbyAmIEI0M19CRkxfUlNTSSkgewogCQkJCWlmIChpbl9yc3NpID4gNjMpCiAJCQkJCWluX3Jzc2kgPSA2MzsKLQkJCQl0bXAgPSBwaHktPm5yc3NpX2x0W2luX3Jzc2ldOworCQkJCUI0M19XQVJOX09OKHBoeS0+dHlwZSAhPSBCNDNfUEhZVFlQRV9HKTsKKwkJCQl0bXAgPSBncGh5LT5ucnNzaV9sdFtpbl9yc3NpXTsKIAkJCQl0bXAgPSAzMSAtIHRtcDsKIAkJCQl0bXAgKj0gLTEzMTsKIAkJCQl0bXAgLz0gMTI4OwpAQCAtNjc4LDYgKzY4MCw4IEBACiAJCWI0M19waW9faGFuZGxlX3R4c3RhdHVzKGRldiwgc3RhdHVzKTsKIAllbHNlCiAJCWI0M19kbWFfaGFuZGxlX3R4c3RhdHVzKGRldiwgc3RhdHVzKTsKKworCWI0M19waHlfdHhwb3dlcl9jaGVjayhkZXYsIDApOwogfQogCiAvKiBGaWxsIG91dCB0aGUgbWFjODAyMTEgVFhzdGF0dXMgcmVwb3J0IGJhc2VkIG9uIHRoZSBiNDMtc3BlY2lmaWMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCmluZGV4IDFjYjc3ZGIuLmM2NmQ1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwpAQCAtODg4LDEzICs4ODgsMTMgQEAKIAogc3RhdGljIHZvaWQgaGFuZGxlX2lycV90YnR0X2luZGljYXRpb24oc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2KQogewotCWlmIChiNDNsZWdhY3lfaXNfbW9kZShkZXYtPndsLCBJRUVFODAyMTFfSUZfVFlQRV9BUCkpIHsKKwlpZiAoYjQzbGVnYWN5X2lzX21vZGUoZGV2LT53bCwgTkw4MDIxMV9JRlRZUEVfQVApKSB7CiAJCS8qIFRPRE86IFBTIFRCVFQgKi8KIAl9IGVsc2UgewogCQlpZiAoMS8qRklYTUU6IHRoZSBsYXN0IFBTcG9sbCBmcmFtZSB3YXMgc2VudCBzdWNjZXNzZnVsbHkgKi8pCiAJCQliNDNsZWdhY3lfcG93ZXJfc2F2aW5nX2N0bF9iaXRzKGRldiwgLTEsIC0xKTsKIAl9Ci0JaWYgKGI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpKQorCWlmIChiNDNsZWdhY3lfaXNfbW9kZShkZXYtPndsLCBOTDgwMjExX0lGVFlQRV9BREhPQykpCiAJCWRldi0+ZGZxX3ZhbGlkID0gMTsKIH0KIApAQCAtMTIwMSw3ICsxMjAxLDcgQEAKIAlzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCA9IGRldi0+d2w7CiAJdTMyIGNtZDsKIAotCWlmICghYjQzbGVnYWN5X2lzX21vZGUod2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSkKKwlpZiAoIWI0M2xlZ2FjeV9pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9BUCkpCiAJCXJldHVybjsKIAogCS8qIFRoaXMgaXMgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBhc3luY2hyb25vdXMgYmVhY29uIHVwZGF0ZS4gKi8KQEAgLTE5MzYsOSArMTkzNiw5IEBACiAJY3RsICY9IH5CNDNsZWdhY3lfTUFDQ1RMX0JFQUNQUk9NSVNDOwogCWN0bCB8PSBCNDNsZWdhY3lfTUFDQ1RMX0lORlJBOwogCi0JaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBJRUVFODAyMTFfSUZfVFlQRV9BUCkpCisJaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9BUCkpCiAJCWN0bCB8PSBCNDNsZWdhY3lfTUFDQ1RMX0FQOwotCWVsc2UgaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSkKKwllbHNlIGlmIChiNDNsZWdhY3lfaXNfbW9kZSh3bCwgTkw4MDIxMV9JRlRZUEVfQURIT0MpKQogCQljdGwgJj0gfkI0M2xlZ2FjeV9NQUNDVExfSU5GUkE7CiAKIAlpZiAod2wtPmZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKQpAQCAtMjY0Niw3ICsyNjQ2LDcgQEAKIAliNDNsZWdhY3lfbWdtdGZyYW1lX3R4YW50ZW5uYShkZXYsIGFudGVubmFfdHgpOwogCiAJLyogVXBkYXRlIHRlbXBsYXRlcyBmb3IgQVAgbW9kZS4gKi8KLQlpZiAoYjQzbGVnYWN5X2lzX21vZGUod2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSkKKwlpZiAoYjQzbGVnYWN5X2lzX21vZGUod2wsIE5MODAyMTFfSUZUWVBFX0FQKSkKIAkJYjQzbGVnYWN5X3NldF9iZWFjb25faW50KGRldiwgY29uZi0+YmVhY29uX2ludCk7CiAKIApAQCAtMjczMywxMiArMjczMywxMiBAQAogCWVsc2UKIAkJbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCWlmIChiNDNsZWdhY3lfc3RhdHVzKGRldikgPj0gQjQzbGVnYWN5X1NUQVRfSU5JVElBTElaRUQpIHsKLQkJaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBJRUVFODAyMTFfSUZfVFlQRV9BUCkpIHsKLQkJCUI0M2xlZ2FjeV9XQVJOX09OKHZpZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCk7CisJCWlmIChiNDNsZWdhY3lfaXNfbW9kZSh3bCwgTkw4MDIxMV9JRlRZUEVfQVApKSB7CisJCQlCNDNsZWdhY3lfV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApOwogCQkJYjQzbGVnYWN5X3NldF9zc2lkKGRldiwgY29uZi0+c3NpZCwgY29uZi0+c3NpZF9sZW4pOwogCQkJaWYgKGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CRUFDT04pCiAJCQkJYjQzbGVnYWN5X3VwZGF0ZV90ZW1wbGF0ZXMod2wpOwotCQl9IGVsc2UgaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSkgeworCQl9IGVsc2UgaWYgKGI0M2xlZ2FjeV9pc19tb2RlKHdsLCBOTDgwMjExX0lGVFlQRV9BREhPQykpIHsKIAkJCWlmIChjb25mLT5jaGFuZ2VkICYgSUVFRTgwMjExX0lGQ0NfQkVBQ09OKQogCQkJCWI0M2xlZ2FjeV91cGRhdGVfdGVtcGxhdGVzKHdsKTsKIAkJfQpAQCAtMzAyMCw3ICszMDIwLDcgQEAKIAkJCQkJICBib29sIGlkbGUpIHsKIAl1MTYgcHVfZGVsYXkgPSAxMDUwOwogCi0JaWYgKGI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHx8IGlkbGUpCisJaWYgKGI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSB8fCBpZGxlKQogCQlwdV9kZWxheSA9IDUwMDsKIAlpZiAoKGRldi0+cGh5LnJhZGlvX3ZlciA9PSAweDIwNTApICYmIChkZXYtPnBoeS5yYWRpb19yZXYgPT0gOCkpCiAJCXB1X2RlbGF5ID0gbWF4KHB1X2RlbGF5LCAodTE2KTI0MDApOwpAQCAtMzAzNSw3ICszMDM1LDcgQEAKIAl1MTYgcHJldGJ0dDsKIAogCS8qIFRoZSB0aW1lIHZhbHVlIGlzIGluIG1pY3Jvc2Vjb25kcy4gKi8KLQlpZiAoYjQzbGVnYWN5X2lzX21vZGUoZGV2LT53bCwgSUVFRTgwMjExX0lGX1RZUEVfSUJTUykpCisJaWYgKGI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSkKIAkJcHJldGJ0dCA9IDI7CiAJZWxzZQogCQlwcmV0YnR0ID0gMjUwOwpAQCAtMzI1OSwxMCArMzI1OSwxMCBAQAogCiAJLyogVE9ETzogYWxsb3cgV0RTL0FQIGRldmljZXMgdG8gY29leGlzdCAqLwogCi0JaWYgKGNvbmYtPnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9XRFMgJiYKLQkgICAgY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCWlmIChjb25mLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIGNvbmYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBjb25mLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1dEUyAmJgorCSAgICBjb25mLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwpAQCAtMzQwMyw3ICszNDAzLDcgQEAKIH0KIAogc3RhdGljIGludCBiNDNsZWdhY3lfb3BfYmVhY29uX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICAgIGludCBhaWQsIGludCBzZXQpCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQogewogCXN0cnVjdCBiNDNsZWdhY3lfd2wgKndsID0gaHdfdG9fYjQzbGVnYWN5X3dsKGh3KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzcwNCw3ICszNzA0LDEzIEBACiAJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8CiAJCSAgICBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8CiAJCSAgICBJRUVFODAyMTFfSFdfTk9JU0VfREJNOworCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KKwkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9XRFMpIHwKKwkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKIAlody0+cXVldWVzID0gMTsgLyogRklYTUU6IGhhcmR3YXJlIGhhcyBtb3JlIHF1ZXVlcyAqLworCWh3LT5tYXhfYWx0cmF0ZXMgPSAxOwogCVNFVF9JRUVFODAyMTFfREVWKGh3LCBkZXYtPmRldik7CiAJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoc3Byb20tPmV0MW1hYykpCiAJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBzcHJvbS0+ZXQxbWFjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYwppbmRleCA3NjhjY2NiLi40Yzk0NDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlpZiAoZGV2LT5kZXYtPmlkLnJldmlzaW9uIDwgMykgewogCQliNDNsZWdhY3lfbWFjX3N1c3BlbmQoZGV2KTsKIAl9IGVsc2UgewotCQlpZiAoIWI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIElFRUU4MDIxMV9JRl9UWVBFX0FQKSkKKwkJaWYgKCFiNDNsZWdhY3lfaXNfbW9kZShkZXYtPndsLCBOTDgwMjExX0lGVFlQRV9BUCkpCiAJCQliNDNsZWdhY3lfcG93ZXJfc2F2aW5nX2N0bF9iaXRzKGRldiwgLTEsIDEpOwogCX0KIH0KQEAgLTExOCw3ICsxMTgsNyBAQAogCWlmIChkZXYtPmRldi0+aWQucmV2aXNpb24gPCAzKSB7CiAJCWI0M2xlZ2FjeV9tYWNfZW5hYmxlKGRldik7CiAJfSBlbHNlIHsKLQkJaWYgKCFiNDNsZWdhY3lfaXNfbW9kZShkZXYtPndsLCBJRUVFODAyMTFfSUZfVFlQRV9BUCkpCisJCWlmICghYjQzbGVnYWN5X2lzX21vZGUoZGV2LT53bCwgTkw4MDIxMV9JRlRZUEVfQVApKQogCQkJYjQzbGVnYWN5X3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIC0xLCAtMSk7CiAJfQogfQpAQCAtNTk1LDEyICs1OTUsMTQgQEAKIAkJCQkgICAgMHgwMDM1KSAmIDB4RkZDMCkgfCAweDAwNjQpOwogCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwMDVELCAoYjQzbGVnYWN5X3BoeV9yZWFkKGRldiwKIAkJCQkgICAgMHgwMDVEKSAmIDB4RkY4MCkgfCAweDAwMEEpOworCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHg1QiwgMHgwMDAwKTsKKwkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4NUMsIDB4MDAwMCk7CiAJfQogCiAJaWYgKGRldi0+YmFkX2ZyYW1lc19wcmVlbXB0KQogCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgQjQzbGVnYWN5X1BIWV9SQURJT19CSVRGSUVMRCwKIAkJCQkgICAgYjQzbGVnYWN5X3BoeV9yZWFkKGRldiwKLQkJCQkgICAgQjQzbGVnYWN5X1BIWV9SQURJT19CSVRGSUVMRCkgfCAoMSA8PCAxMSkpOworCQkJCSAgICBCNDNsZWdhY3lfUEhZX1JBRElPX0JJVEZJRUxEKSB8ICgxIDw8IDEyKSk7CiAKIAlpZiAocGh5LT5hbmFsb2cgPT0gMSkgewogCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwMDI2LCAweENFMDApOwpAQCAtNzUzLDcgKzc1NSw3IEBACiAJCWI0M2xlZ2FjeV9yYWRpb193cml0ZTE2KGRldiwgMHgwMDUwLCAweDAwMjApOwogCX0KIAlpZiAocGh5LT5yYWRpb19yZXYgPD0gMikgewotCQliNDNsZWdhY3lfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA3QywgMHgwMDIwKTsKKwkJYjQzbGVnYWN5X3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNTAsIDB4MDAyMCk7CiAJCWI0M2xlZ2FjeV9yYWRpb193cml0ZTE2KGRldiwgMHgwMDVBLCAweDAwNzApOwogCQliNDNsZWdhY3lfcmFkaW9fd3JpdGUxNihkZXYsIDB4MDA1QiwgMHgwMDdCKTsKIAkJYjQzbGVnYWN5X3JhZGlvX3dyaXRlMTYoZGV2LCAweDAwNUMsIDB4MDBCMCk7CkBAIC03NzEsNyArNzczLDcgQEAKIAkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4MDAyQSwgMHg4QUMwKTsKIAliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwMDM4LCAweDA2NjgpOwogCWI0M2xlZ2FjeV9yYWRpb19zZXRfdHhwb3dlcl9iZyhkZXYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYpOwotCWlmIChwaHktPnJhZGlvX3JldiA8PSA1KQorCWlmIChwaHktPnJhZGlvX3JldiA9PSA0IHx8IHBoeS0+cmFkaW9fcmV2ID09IDUpCiAJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCAweDAwNUQsIChiNDNsZWdhY3lfcGh5X3JlYWQoZGV2LAogCQkJCSAgICAweDAwNUQpICYgMHhGRjgwKSB8IDB4MDAwMyk7CiAJaWYgKHBoeS0+cmFkaW9fcmV2IDw9IDIpCkBAIC0xMDEwLDcgKzEwMTIsNyBAQAogCQliNDNsZWdhY3lfcGh5X2luaXRiNShkZXYpOwogCWVsc2UKIAkJYjQzbGVnYWN5X3BoeV9pbml0YjYoZGV2KTsKLQlpZiAocGh5LT5yZXYgPj0gMiB8fCBwaHktPmdtb2RlKQorCWlmIChwaHktPnJldiA+PSAyICYmIHBoeS0+Z21vZGUpCiAJCWI0M2xlZ2FjeV9waHlfaW5pdGEoZGV2KTsKIAogCWlmIChwaHktPnJldiA+PSAyKSB7CkBAIC0xMDI1LDE4ICsxMDI3LDIyIEBACiAJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCAweDA4MTEsIDB4MDQwMCk7CiAJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCAweDAwMTUsIDB4MDBDMCk7CiAJfQotCWlmIChwaHktPnJldiA+PSAyIHx8IHBoeS0+Z21vZGUpIHsKKwlpZiAocGh5LT5nbW9kZSkgewogCQl0bXAgPSBiNDNsZWdhY3lfcGh5X3JlYWQoZGV2LCAweDA0MDApICYgMHhGRjsKLQkJaWYgKHRtcCA9PSAzIHx8IHRtcCA9PSA1KSB7CisJCWlmICh0bXAgPT0gMykgeworCQkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4MDRDMiwgMHgxODE2KTsKKwkJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCAweDA0QzMsIDB4ODYwNik7CisJCX0KKwkJaWYgKHRtcCA9PSA0IHx8IHRtcCA9PSA1KSB7CiAJCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwNEMyLCAweDE4MTYpOwogCQkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4MDRDMywgMHg4MDA2KTsKLQkJCWlmICh0bXAgPT0gNSkKLQkJCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwNENDLAotCQkJCQkJICAgIChiNDNsZWdhY3lfcGh5X3JlYWQoZGV2LAotCQkJCQkJICAgICAweDA0Q0MpICYgMHgwMEZGKSB8Ci0JCQkJCQkgICAgIDB4MUYwMCk7CisJCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwNENDLAorCQkJCQkgICAgKGI0M2xlZ2FjeV9waHlfcmVhZChkZXYsCisJCQkJCSAgICAgMHgwNENDKSAmIDB4MDBGRikgfAorCQkJCQkgICAgIDB4MUYwMCk7CiAJCX0KLQkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4MDQ3RSwgMHgwMDc4KTsKKwkJaWYgKHBoeS0+cmV2ID49IDIpCisJCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwNDdFLCAweDAwNzgpOwogCX0KIAlpZiAocGh5LT5yYWRpb19yZXYgPT0gOCkgewogCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwODAxLCBiNDNsZWdhY3lfcGh5X3JlYWQoZGV2LCAweDA4MDEpCkBAIC0xMDc4LDcgKzEwODQsNyBAQAogCQllbHNlCiAJCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgMHgwMDJGLCAweDAyMDIpOwogCX0KLQlpZiAocGh5LT5nbW9kZSB8fCBwaHktPnJldiA+PSAyKSB7CisJaWYgKHBoeS0+Z21vZGUpIHsKIAkJYjQzbGVnYWN5X3BoeV9sb19hZGp1c3QoZGV2LCAwKTsKIAkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIDB4MDgwRiwgMHg4MDc4KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmZraWxsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmZraWxsLmMKaW5kZXggNDc2YWRkOS4uYjMyYmY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3Jma2lsbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9yZmtpbGwuYwpAQCAtNDQsMjMgKzQ0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogVXBkYXRlIHRoZSByZmtpbGwgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGI0M2xlZ2FjeV9yZmtpbGxfdXBkYXRlX3N0YXRlKHN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzbGVnYWN5X3Jma2lsbCAqcmZrID0gJihkZXYtPndsLT5yZmtpbGwpOwotCi0JaWYgKCFkZXYtPnJhZGlvX2h3X2VuYWJsZSkgewotCQlyZmstPnJma2lsbC0+c3RhdGUgPSBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFkZXYtPnBoeS5yYWRpb19vbikKLQkJcmZrLT5yZmtpbGwtPnN0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKLQllbHNlCi0JCXJmay0+cmZraWxsLT5zdGF0ZSA9IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ7Ci0KLX0KLQogLyogVGhlIHBvbGwgY2FsbGJhY2sgZm9yIHRoZSBoYXJkd2FyZSBidXR0b24uICovCiBzdGF0aWMgdm9pZCBiNDNsZWdhY3lfcmZraWxsX3BvbGwoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBvbGxfZGV2KQogewpAQCAtNzgsNyArNjEsNiBAQAogCWlmICh1bmxpa2VseShlbmFibGVkICE9IGRldi0+cmFkaW9faHdfZW5hYmxlKSkgewogCQlkZXYtPnJhZGlvX2h3X2VuYWJsZSA9IGVuYWJsZWQ7CiAJCXJlcG9ydF9jaGFuZ2UgPSAxOwotCQliNDNsZWdhY3lfcmZraWxsX3VwZGF0ZV9zdGF0ZShkZXYpOwogCQliNDNsZWdhY3lpbmZvKHdsLCAiUmFkaW8gaGFyZHdhcmUgc3RhdHVzIGNoYW5nZWQgdG8gJXNcbiIsCiAJCQllbmFibGVkID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS94bWl0LmMKaW5kZXggNjhlMWY4Yy4uNjVlODMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3htaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kveG1pdC5jCkBAIC0xOTMsNyArMTkzLDYgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqd2xoZHI7CiAJaW50IHVzZV9lbmNyeXB0aW9uID0gISFpbmZvLT5jb250cm9sLmh3X2tleTsKLQl1MTYgZmN0bDsKIAl1OCByYXRlOwogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZV9mYjsKIAlpbnQgcmF0ZV9vZmRtOwpAQCAtMjA0LDcgKzIwMyw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICp0eF9yYXRlOwogCiAJd2xoZHIgPSAoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9oZHIgKilmcmFnbWVudF9kYXRhOwotCWZjdGwgPSBsZTE2X3RvX2NwdSh3bGhkci0+ZnJhbWVfY29udHJvbCk7CiAKIAltZW1zZXQodHhoZHIsIDAsIHNpemVvZigqdHhoZHIpKTsKIApAQCAtMjEyLDcgKzIxMCw3IEBACiAKIAlyYXRlID0gdHhfcmF0ZS0+aHdfdmFsdWU7CiAJcmF0ZV9vZmRtID0gYjQzbGVnYWN5X2lzX29mZG1fcmF0ZShyYXRlKTsKLQlyYXRlX2ZiID0gaWVlZTgwMjExX2dldF9hbHRfcmV0cnlfcmF0ZShkZXYtPndsLT5odywgaW5mbykgPyA6IHR4X3JhdGU7CisJcmF0ZV9mYiA9IGllZWU4MDIxMV9nZXRfYWx0X3JldHJ5X3JhdGUoZGV2LT53bC0+aHcsIGluZm8sIDApID8gOiB0eF9yYXRlOwogCXJhdGVfZmJfb2ZkbSA9IGI0M2xlZ2FjeV9pc19vZmRtX3JhdGUocmF0ZV9mYi0+aHdfdmFsdWUpOwogCiAJdHhoZHItPm1hY19mcmFtZV9jdGwgPSB3bGhkci0+ZnJhbWVfY29udHJvbDsKQEAgLTI0NSw3ICsyNDMsNyBAQAogCiAJCWlmIChrZXktPmVuYWJsZWQpIHsKIAkJCS8qIEhhcmR3YXJlIGFwcGVuZHMgSUNWLiAqLwotCQkJcGxjcF9mcmFnbWVudF9sZW4gKz0gaW5mby0+Y29udHJvbC5pY3ZfbGVuOworCQkJcGxjcF9mcmFnbWVudF9sZW4gKz0gaW5mby0+Y29udHJvbC5od19rZXktPmljdl9sZW47CiAKIAkJCWtleV9pZHggPSBiNDNsZWdhY3lfa2lkeF90b19mdyhkZXYsIGtleV9pZHgpOwogCQkJbWFjX2N0bCB8PSAoa2V5X2lkeCA8PCBCNDNsZWdhY3lfVFg0X01BQ19LRVlJRFhfU0hJRlQpICYKQEAgLTI1Myw4ICsyNTEsOCBAQAogCQkJbWFjX2N0bCB8PSAoa2V5LT5hbGdvcml0aG0gPDwKIAkJCQkgICBCNDNsZWdhY3lfVFg0X01BQ19LRVlBTEdfU0hJRlQpICYKIAkJCQkgICBCNDNsZWdhY3lfVFg0X01BQ19LRVlBTEc7Ci0JCQl3bGhkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihmY3RsKTsKLQkJCWl2X2xlbiA9IG1pbigoc2l6ZV90KWluZm8tPmNvbnRyb2wuaXZfbGVuLAorCQkJd2xoZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbih3bGhkci0+ZnJhbWVfY29udHJvbCk7CisJCQlpdl9sZW4gPSBtaW4oKHNpemVfdClpbmZvLT5jb250cm9sLmh3X2tleS0+aXZfbGVuLAogCQkJCSAgICAgQVJSQVlfU0laRSh0eGhkci0+aXYpKTsKIAkJCW1lbWNweSh0eGhkci0+aXYsICgodTggKil3bGhkcikgKyB3bGhkcl9sZW4sIGl2X2xlbik7CiAJCX0gZWxzZSB7CkBAIC02MjYsNyArNjI0LDcgQEAKIAl0bXAgPSBody0+Y291bnQ7CiAJc3RhdHVzLmZyYW1lX2NvdW50ID0gKHRtcCA+PiA0KTsKIAlzdGF0dXMucnRzX2NvdW50ID0gKHRtcCAmIDB4MEYpOwotCXRtcCA9IGh3LT5mbGFnczsKKwl0bXAgPSBody0+ZmxhZ3MgPDwgMTsKIAlzdGF0dXMuc3VwcF9yZWFzb24gPSAoKHRtcCAmIDB4MUMpID4+IDIpOwogCXN0YXR1cy5wbV9pbmRpY2F0ZWQgPSAhISh0bXAgJiAweDgwKTsKIAlzdGF0dXMuaW50ZXJtZWRpYXRlID0gISEodG1wICYgMHg0MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCmluZGV4IDI5ZDM5MTAuLmJmYTM3NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCkBAIC04Nyw3ICs4Nyw4IEBACiAKICAgIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQuCiAqLwotc3RhdGljIGludCBoZXJtZXNfaXNzdWVfY21kKGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcmFtMCkKK3N0YXRpYyBpbnQgaGVybWVzX2lzc3VlX2NtZChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJhbTAsCisJCQkgICAgdTE2IHBhcmFtMSwgdTE2IHBhcmFtMikKIHsKIAlpbnQgayA9IENNRF9CVVNZX1RJTUVPVVQ7CiAJdTE2IHJlZzsKQEAgLTEwMyw4ICsxMDQsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTIsIDApOwotCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTEsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTIsIHBhcmFtMik7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBBUkFNMSwgcGFyYW0xKTsKIAloZXJtZXNfd3JpdGVfcmVnbihodywgUEFSQU0wLCBwYXJhbTApOwogCWhlcm1lc193cml0ZV9yZWduKGh3LCBDTUQsIGNtZCk7CiAJCkBAIC0xMTUsMTYgKzExNiw3MiBAQAogICogRnVuY3Rpb24gZGVmaW5pdGlvbnMKICAqLwogCisvKiBGb3IgZG9pbmcgY21kcyB0aGF0IHdpcGUgdGhlIG1hZ2ljIGNvbnN0YW50IGluIFNXU1VQUE9SVDAgKi8KK2ludCBoZXJtZXNfZG9pY21kX3dhaXQoaGVybWVzX3QgKmh3LCB1MTYgY21kLAorCQkgICAgICAgdTE2IHBhcm0wLCB1MTYgcGFybTEsIHUxNiBwYXJtMiwKKwkJICAgICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApCit7CisJaW50IGVyciA9IDA7CisJaW50IGs7CisJdTE2IHN0YXR1cywgcmVnOworCisJZXJyID0gaGVybWVzX2lzc3VlX2NtZChodywgY21kLCBwYXJtMCwgcGFybTEsIHBhcm0yKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlrID0gQ01EX0lOSVRfVElNRU9VVDsKKwl3aGlsZSAoKCEocmVnICYgSEVSTUVTX0VWX0NNRCkpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMTApOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBTV1NVUFBPUlQwLCBIRVJNRVNfTUFHSUMpOworCisJaWYgKCFoZXJtZXNfcHJlc2VudChodykpIHsKKwkJREVCVUcoMCwgImhlcm1lcyBAIDB4JXg6IENhcmQgcmVtb3ZlZCBkdXJpbmcgcmVzZXQuXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHJlZyAmIEhFUk1FU19FVl9DTUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIKKwkJICAgICAgICJUaW1lb3V0IHdhaXRpbmcgZm9yIGNhcmQgdG8gcmVzZXQgKHJlZz0weCUwNHgpIVxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UsIHJlZyk7CisJCWVyciA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFNUQVRVUyk7CisJaWYgKHJlc3ApIHsKKwkJcmVzcC0+c3RhdHVzID0gc3RhdHVzOworCQlyZXNwLT5yZXNwMCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJFU1AwKTsKKwkJcmVzcC0+cmVzcDEgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSRVNQMSk7CisJCXJlc3AtPnJlc3AyID0gaGVybWVzX3JlYWRfcmVnbihodywgUkVTUDIpOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgSEVSTUVTX0VWX0NNRCk7CisKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1NUQVRVU19SRVNVTFQpCisJCWVyciA9IC1FSU87CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woaGVybWVzX2RvaWNtZF93YWl0KTsKKwogdm9pZCBoZXJtZXNfc3RydWN0X2luaXQoaGVybWVzX3QgKmh3LCB2b2lkIF9faW9tZW0gKmFkZHJlc3MsIGludCByZWdfc3BhY2luZykKIHsKIAlody0+aW9iYXNlID0gYWRkcmVzczsKIAlody0+cmVnX3NwYWNpbmcgPSByZWdfc3BhY2luZzsKIAlody0+aW50ZW4gPSAweDA7CiB9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19zdHJ1Y3RfaW5pdCk7CiAKIGludCBoZXJtZXNfaW5pdChoZXJtZXNfdCAqaHcpCiB7Ci0JdTE2IHN0YXR1cywgcmVnOworCXUxNiByZWc7CiAJaW50IGVyciA9IDA7CiAJaW50IGs7CiAKQEAgLTE2Miw0NSArMjE5LDExIEBACiAKIAkvKiBXZSBkb24ndCB1c2UgaGVybWVzX2RvY21kX3dhaXQgaGVyZSwgYmVjYXVzZSB0aGUgcmVzZXQgd2lwZXMKIAkgICB0aGUgbWFnaWMgY29uc3RhbnQgaW4gU1dTVVBQT1JUMCBhd2F5LCBhbmQgaXQgZ2V0cyBjb25mdXNlZCAqLwotCWVyciA9IGhlcm1lc19pc3N1ZV9jbWQoaHcsIEhFUk1FU19DTURfSU5JVCwgMCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwllcnIgPSBoZXJtZXNfZG9pY21kX3dhaXQoaHcsIEhFUk1FU19DTURfSU5JVCwgMCwgMCwgMCwgTlVMTCk7CiAKLQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOwotCWsgPSBDTURfSU5JVF9USU1FT1VUOwotCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSAmJiBrKSB7Ci0JCWstLTsKLQkJdWRlbGF5KDEwKTsKLQkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKLQl9Ci0KLQloZXJtZXNfd3JpdGVfcmVnbihodywgU1dTVVBQT1JUMCwgSEVSTUVTX01BR0lDKTsKLQotCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgewotCQlERUJVRygwLCAiaGVybWVzIEAgMHgleDogQ2FyZCByZW1vdmVkIGR1cmluZyByZXNldC5cbiIsCi0JCSAgICAgICBody0+aW9iYXNlKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCQkKLQlpZiAoISAocmVnICYgSEVSTUVTX0VWX0NNRCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogIiAKLQkJICAgICAgICJUaW1lb3V0IHdhaXRpbmcgZm9yIGNhcmQgdG8gcmVzZXQgKHJlZz0weCUwNHgpIVxuIiwKLQkJICAgICAgIGh3LT5pb2Jhc2UsIHJlZyk7Ci0JCWVyciA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXN0YXR1cyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFNUQVRVUyk7Ci0KLQloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIEhFUk1FU19FVl9DTUQpOwotCi0JaWYgKHN0YXR1cyAmIEhFUk1FU19TVEFUVVNfUkVTVUxUKQotCQllcnIgPSAtRUlPOwotCi0gb3V0OgogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19pbml0KTsKIAogLyogSXNzdWUgYSBjb21tYW5kIHRvIHRoZSBjaGlwLCBhbmQgKGJ1c3khKSB3YWl0IGZvciBpdCB0bwogICogY29tcGxldGUuCkBAIC0yMTYsNyArMjM5LDcgQEAKIAl1MTYgcmVnOwogCXUxNiBzdGF0dXM7CiAKLQllcnIgPSBoZXJtZXNfaXNzdWVfY21kKGh3LCBjbWQsIHBhcm0wKTsKKwllcnIgPSBoZXJtZXNfaXNzdWVfY21kKGh3LCBjbWQsIHBhcm0wLCAwLCAwKTsKIAlpZiAoZXJyKSB7CiAJCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKQEAgLTI3MSw2ICsyOTQsNyBAQAogIG91dDoKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChoZXJtZXNfZG9jbWRfd2FpdCk7CiAKIGludCBoZXJtZXNfYWxsb2NhdGUoaGVybWVzX3QgKmh3LCB1MTYgc2l6ZSwgdTE2ICpmaWQpCiB7CkBAIC0zMTMsNyArMzM3LDcgQEAKIAkKIAlyZXR1cm4gMDsKIH0KLQorRVhQT1JUX1NZTUJPTChoZXJtZXNfYWxsb2NhdGUpOwogCiAvKiBTZXQgdXAgYSBCQVAgdG8gcmVhZCBhIHBhcnRpY3VsYXIgY2h1bmsgb2YgZGF0YSBmcm9tIGNhcmQncyBpbnRlcm5hbCBidWZmZXIuCiAgKgpAQCAtMzk3LDYgKzQyMSw3IEBACiAgb3V0OgogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHJlYWQpOwogCiAvKiBXcml0ZSBhIGJsb2NrIG9mIGRhdGEgdG8gdGhlIGNoaXAncyBidWZmZXIsIHZpYSB0aGUKICAqIEJBUC4gU3luY2hyb25pemF0aW9uL3NlcmlhbGl6YXRpb24gaXMgdGhlIGNhbGxlcidzIHByb2JsZW0uCkBAIC00MjIsNiArNDQ3LDcgQEAKICBvdXQ6CQogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHdyaXRlKTsKIAogLyogUmVhZCBhIExlbmd0aC1UeXBlLVZhbHVlIHJlY29yZCBmcm9tIHRoZSBjYXJkLgogICoKQEAgLTQ2Myw3ICs0ODksNyBAQAogCWlmIChydHlwZSAhPSByaWQpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAlcygpOiAiCiAJCSAgICAgICAicmlkICgweCUwNHgpIGRvZXMgbm90IG1hdGNoIHR5cGUgKDB4JTA0eClcbiIsCi0JCSAgICAgICBody0+aW9iYXNlLCBfX0ZVTkNUSU9OX18sIHJpZCwgcnR5cGUpOworCQkgICAgICAgaHctPmlvYmFzZSwgX19mdW5jX18sIHJpZCwgcnR5cGUpOwogCWlmIChIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKHJsZW5ndGgpID4gYnVmc2l6ZSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICIKIAkJICAgICAgICJUcnVuY2F0aW5nIExUViByZWNvcmQgZnJvbSAlZCB0byAlZCBieXRlcy4gIgpAQCAtNDc1LDYgKzUwMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woaGVybWVzX3JlYWRfbHR2KTsKIAogaW50IGhlcm1lc193cml0ZV9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCAKIAkJICAgICB1MTYgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSkKQEAgLTQ5NywyMCArNTI0LDExIEBACiAKIAloZXJtZXNfd3JpdGVfYnl0ZXMoaHcsIGRyZWcsIHZhbHVlLCBjb3VudCA8PCAxKTsKIAotCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FDQ0VTUyB8IEhFUk1FU19DTURfV1JJVEUsIAorCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FDQ0VTUyB8IEhFUk1FU19DTURfV1JJVEUsCiAJCQkJcmlkLCBOVUxMKTsKIAogCXJldHVybiBlcnI7CiB9Ci0KLUVYUE9SVF9TWU1CT0woaGVybWVzX3N0cnVjdF9pbml0KTsKLUVYUE9SVF9TWU1CT0woaGVybWVzX2luaXQpOwotRVhQT1JUX1NZTUJPTChoZXJtZXNfZG9jbWRfd2FpdCk7Ci1FWFBPUlRfU1lNQk9MKGhlcm1lc19hbGxvY2F0ZSk7Ci0KLUVYUE9SVF9TWU1CT0woaGVybWVzX2JhcF9wcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHdyaXRlKTsKLUVYUE9SVF9TWU1CT0woaGVybWVzX3JlYWRfbHR2KTsKIEVYUE9SVF9TWU1CT0woaGVybWVzX3dyaXRlX2x0dik7CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaGVybWVzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCmluZGV4IDhlM2YwZTMuLjhiMTNjOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCkBAIC0xNzksMTcgKzE3OSwyMyBAQAogI2RlZmluZSBIRVJNRVNfODAyXzExX09GRlNFVAkJKDE0KQogI2RlZmluZSBIRVJNRVNfODAyXzNfT0ZGU0VUCQkoMTQrMzIpCiAjZGVmaW5lIEhFUk1FU184MDJfMl9PRkZTRVQJCSgxNCszMisxNCkKKyNkZWZpbmUgSEVSTUVTX1RYQ05UTDJfT0ZGU0VUCQkoSEVSTUVTXzgwMl8zX09GRlNFVCAtIDIpCiAKICNkZWZpbmUgSEVSTUVTX1JYU1RBVF9FUlIJCSgweDAwMDMpCiAjZGVmaW5lCUhFUk1FU19SWFNUQVRfQkFEQ1JDCQkoMHgwMDAxKQogI2RlZmluZQlIRVJNRVNfUlhTVEFUX1VOREVDUllQVEFCTEUJKDB4MDAwMikKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9NSUMJCSgweDAwMTApCS8qIEZyYW1lIGNvbnRhaW5zIE1JQyAqLwogI2RlZmluZQlIRVJNRVNfUlhTVEFUX01BQ1BPUlQJCSgweDA3MDApCiAjZGVmaW5lIEhFUk1FU19SWFNUQVRfUENGCQkoMHgxMDAwKQkvKiBGcmFtZSB3YXMgcmVjZWl2ZWQgaW4gQ0YgcGVyaW9kICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfTUlDX0tFWV9JRAkoMHgxODAwKQkvKiBNSUMga2V5IHVzZWQgKi8KICNkZWZpbmUJSEVSTUVTX1JYU1RBVF9NU0dUWVBFCQkoMHhFMDAwKQogI2RlZmluZQlIRVJNRVNfUlhTVEFUXzEwNDIJCSgweDIwMDApCS8qIFJGQy0xMDQyIGZyYW1lICovCiAjZGVmaW5lCUhFUk1FU19SWFNUQVRfVFVOTkVMCQkoMHg0MDAwKQkvKiBicmlkZ2UtdHVubmVsIGVuY29kZWQgZnJhbWUgKi8KICNkZWZpbmUJSEVSTUVTX1JYU1RBVF9XTVAJCSgweDYwMDApCS8qIFdhdmVsYW4tSUkgTWFuYWdlbWVudCBQcm90b2NvbCBmcmFtZSAqLwogCisvKiBTaGlmdCBhbW91bnQgZm9yIGtleSBJRCBpbiBSWFNUQVQgYW5kIFRYQ1RSTCAqLworI2RlZmluZQlIRVJNRVNfTUlDX0tFWV9JRF9TSElGVAkJMTEKKwogc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIHsKIAlfX2xlMTYgc3RhdHVzOwogCV9fbGUxNiByZXNlcnZlZDE7CkBAIC0yMDgsNiArMjE0LDggQEAKICNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9UWF9PSwkJKDB4MDAwMikJLyogPz8gaW50ZXJydXB0IG9uIFR4IGNvbXBsZXRlICovCiAjZGVmaW5lIEhFUk1FU19UWENUUkxfVFhfRVgJCSgweDAwMDQpCS8qID8/IGludGVycnVwdCBvbiBUeCBleGNlcHRpb24gKi8KICNkZWZpbmUgSEVSTUVTX1RYQ1RSTF84MDJfMTEJCSgweDAwMDgpCS8qIFdlIHN1cHBseSA4MDIuMTEgaGVhZGVyICovCisjZGVmaW5lIEhFUk1FU19UWENUUkxfTUlDCQkoMHgwMDEwKQkvKiA4MDIuMyArIFRLSVAgKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9NSUNfS0VZX0lECSgweDE4MDApCS8qIE1JQyBLZXkgSUQgbWFzayAqLwogI2RlZmluZSBIRVJNRVNfVFhDVFJMX0FMVF9SVFJZCQkoMHgwMDIwKQogCiAvKiBJbnF1aXJ5IGNvbnN0YW50cyBhbmQgZGF0YSB0eXBlcyAqLwpAQCAtMzAyLDYgKzMxMCw0MCBAQAogCXN0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8JczsKIH07CiAKKy8qIEV4dGVuZGVkIHNjYW4gc3RydWN0IGZvciBIRVJNRVNfSU5RX0NIQU5ORUxJTkZPLgorICogd2xfbGttIGNhbGxzIHRoaXMgYW4gQUNTIHNjYW4gKEF1dG9tYXRpYyBDaGFubmVsIFNlbGVjdCkuCisgKiBLZWVwIG91dCBvZiB1bmlvbiBoZXJtZXNfc2Nhbl9pbmZvIGJlY2F1c2UgaXQgaXMgbXVjaCBiaWdnZXIgdGhhbgorICogdGhlIG9sZGVyIHNjYW4gc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBhZ2VyZV9leHRfc2Nhbl9pbmZvIHsKKwlfX2xlMTYJcmVzZXJ2ZWQwOworCisJdTgJbm9pc2U7CisJdTgJbGV2ZWw7CisJdTgJcnhfZmxvdzsKKwl1OAlyYXRlOworCV9fbGUxNglyZXNlcnZlZDFbMl07CisKKwlfX2xlMTYJZnJhbWVfY29udHJvbDsKKwlfX2xlMTYJZHVyX2lkOworCXU4CWFkZHIxW0VUSF9BTEVOXTsKKwl1OAlhZGRyMltFVEhfQUxFTl07CisJdTgJYnNzaWRbRVRIX0FMRU5dOworCV9fbGUxNglzZXF1ZW5jZTsKKwl1OAlhZGRyNFtFVEhfQUxFTl07CisKKwlfX2xlMTYJZGF0YV9sZW5ndGg7CisKKwkvKiBOZXh0IDMgZmllbGRzIGRvIG5vdCBnZXQgZmlsbGVkIGluLiAqLworCXU4CWRhZGRyW0VUSF9BTEVOXTsKKwl1OAlzYWRkcltFVEhfQUxFTl07CisJX19sZTE2CWxlbl90eXBlOworCisJX19sZTY0CXRpbWVzdGFtcDsKKwlfX2xlMTYJYmVhY29uX2ludGVydmFsOworCV9fbGUxNgljYXBhYmlsaXRpZXM7CisJdTgJZGF0YVszMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKICNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfTk9UX0NPTk5FQ1RFRCAgICgweDAwMDApICAKICNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEICAgICAgICgweDAwMDEpCiAjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0RJU0NPTk5FQ1RFRCAgICAoMHgwMDAyKQpAQCAtMzUzLDYgKzM5NSw5IEBACiBpbnQgaGVybWVzX2luaXQoaGVybWVzX3QgKmh3KTsKIGludCBoZXJtZXNfZG9jbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwKIAkJICAgICAgc3RydWN0IGhlcm1lc19yZXNwb25zZSAqcmVzcCk7CitpbnQgaGVybWVzX2RvaWNtZF93YWl0KGhlcm1lc190ICpodywgdTE2IGNtZCwKKwkJICAgICAgIHUxNiBwYXJtMCwgdTE2IHBhcm0xLCB1MTYgcGFybTIsCisJCSAgICAgICBzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlICpyZXNwKTsKIGludCBoZXJtZXNfYWxsb2NhdGUoaGVybWVzX3QgKmh3LCB1MTYgc2l6ZSwgdTE2ICpmaWQpOwogCiBpbnQgaGVybWVzX2JhcF9wcmVhZChoZXJtZXNfdCAqaHcsIGludCBiYXAsIHZvaWQgKmJ1ZiwgaW50IGxlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19kbGQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19kbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM2MjZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzX2RsZC5jCkBAIC0wLDAgKzEsNzMwIEBACisvKgorICogSGVybWVzIGRvd25sb2FkIGhlbHBlciBkcml2ZXIuCisgKgorICogVGhpcyBjb3VsZCBiZSBlbnRpcmVseSBtZXJnZWQgaW50byBoZXJtZXMuYy4KKyAqCisgKiBJJ20ga2VlcGluZyBpdCBzZXBhcmF0ZSB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIG1lcmdpbmcgYmV0d2VlbgorICoga2VybmVsIHVwZ3JhZGVzLiBJdCBhbHNvIG1lYW5zIHRoZSBtZW1vcnkgb3ZlcmhlYWQgZm9yIGRyaXZlcnMgdGhhdAorICogZG9uJ3QgbmVlZCBmaXJtd2FyZSBkb3dubG9hZCBsb3cuCisgKgorICogVGhpcyBkcml2ZXI6CisgKiAgLSBpcyBjYXBhYmxlIG9mIHdyaXRpbmcgdG8gdGhlIHZvbGF0aWxlIGFyZWEgb2YgdGhlIGhlcm1lcyBkZXZpY2UKKyAqICAtIGlzIGN1cnJlbnRseSBub3QgY2FwYWJsZSBvZiB3cml0aW5nIHRvIG5vbi12b2xhdGlsZSBhcmVhcworICogIC0gcHJvdmlkZSBoZWxwZXJzIHRvIGlkZW50aWZ5IGFuZCB1cGRhdGUgcGx1Z2luIGRhdGEKKyAqICAtIGlzIG5vdCBjYXBhYmxlIG9mIGludGVycHJldGluZyBhIGZ3IGltYWdlIGRpcmVjdGx5LiBUaGF0IGlzIHVwIHRvCisgKiAgICB0aGUgbWFpbiBjYXJkIGRyaXZlci4KKyAqICAtIGRlYWxzIHdpdGggSGVybWVzIEkgZGV2aWNlcy4gSXQgY2FuIHByb2JhYmx5IGJlIG1vZGlmaWVkIHRvIGRlYWwKKyAqICAgIHdpdGggSGVybWVzIElJIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIERhdmlkIEtpbHJveQorICoKKyAqIFBsdWcgZGF0YSBjb2RlIHNsaWdodGx5IG1vZGlmaWVkIGZyb20gc3BlY3RydW1fY3MgZHJpdmVyCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPgorICogUG9ydGlvbnMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gd2xfbGttXzcxOCBBZ2VyZSBkcml2ZXIKKyAqICAgIENPUFlSSUdIVCAoQykgMjAwMS0yMDA0IGJ5IEFnZXJlIFN5c3RlbXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJoZXJtZXMuaCIKKyNpbmNsdWRlICJoZXJtZXNfZGxkLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiRG93bmxvYWQgaGVscGVyIGZvciBMdWNlbnQgSGVybWVzIGNoaXBzZXQiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEtpbHJveSA8a2lscm95ZEBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKyNkZWZpbmUgUEZYICJoZXJtZXNfZGxkOiAiCisKKy8qCisgKiBBVVggcG9ydCBhY2Nlc3MuICBUbyB1bmxvY2sgdGhlIEFVWCBwb3J0IHdyaXRlIHRoZSBhY2Nlc3Mga2V5cyB0byB0aGUKKyAqIFBBUkFNMC0yIHJlZ2lzdGVycywgdGhlbiB3cml0ZSBIRVJNRVNfQVVYX0VOQUJMRSB0byB0aGUgSEVSTUVTX0NPTlRST0wKKyAqIHJlZ2lzdGVyLiAgVGhlbiByZWFkIGl0IGFuZCBtYWtlIHN1cmUgaXQncyBIRVJNRVNfQVVYX0VOQUJMRUQuCisgKi8KKyNkZWZpbmUgSEVSTUVTX0FVWF9FTkFCTEUJMHg4MDAwCS8qIEVuYWJsZSBhdXhpbGlhcnkgcG9ydCBhY2Nlc3MgKi8KKyNkZWZpbmUgSEVSTUVTX0FVWF9ESVNBQkxFCTB4NDAwMAkvKiBEaXNhYmxlIHRvIGF1eGlsaWFyeSBwb3J0IGFjY2VzcyAqLworI2RlZmluZSBIRVJNRVNfQVVYX0VOQUJMRUQJMHhDMDAwCS8qIEF1eGlsaWFyeSBwb3J0IGlzIG9wZW4gKi8KKyNkZWZpbmUgSEVSTUVTX0FVWF9ESVNBQkxFRAkweDAwMDAJLyogQXV4aWxpYXJ5IHBvcnQgaXMgY2xvc2VkICovCisKKyNkZWZpbmUgSEVSTUVTX0FVWF9QVzAJMHhGRTAxCisjZGVmaW5lIEhFUk1FU19BVVhfUFcxCTB4REMyMworI2RlZmluZSBIRVJNRVNfQVVYX1BXMgkweEJBNDUKKworLyogSEVSTUVTX0NNRF9ET1dOTEQgKi8KKyNkZWZpbmUgSEVSTUVTX1BST0dSQU1fRElTQUJMRSAgICAgICAgICAgICAoMHgwMDAwIHwgSEVSTUVTX0NNRF9ET1dOTEQpCisjZGVmaW5lIEhFUk1FU19QUk9HUkFNX0VOQUJMRV9WT0xBVElMRSAgICAgKDB4MDEwMCB8IEhFUk1FU19DTURfRE9XTkxEKQorI2RlZmluZSBIRVJNRVNfUFJPR1JBTV9FTkFCTEVfTk9OX1ZPTEFUSUxFICgweDAyMDAgfCBIRVJNRVNfQ01EX0RPV05MRCkKKyNkZWZpbmUgSEVSTUVTX1BST0dSQU1fTk9OX1ZPTEFUSUxFICAgICAgICAoMHgwMzAwIHwgSEVSTUVTX0NNRF9ET1dOTEQpCisKKy8qIEVuZCBtYXJrZXJzIHVzZWQgaW4gZGJsb2NrcyAqLworI2RlZmluZSBQRElfRU5ECQkweDAwMDAwMDAwCS8qIEVuZCBvZiBQREEgKi8KKyNkZWZpbmUgQkxPQ0tfRU5ECTB4RkZGRkZGRkYJLyogTGFzdCBpbWFnZSBibG9jayAqLworI2RlZmluZSBURVhUX0VORAkweDFBCQkvKiBFbmQgb2YgdGV4dCBoZWFkZXIgKi8KKworLyoKKyAqIFBEQSA9PSBQcm9kdWN0aW9uIERhdGEgQXJlYQorICoKKyAqIEluIHByaW5jaXBsZSwgdGhlIG1heC4gc2l6ZSBvZiB0aGUgUERBIGlzIGlzIDQwOTYgd29yZHMuIEN1cnJlbnRseSwKKyAqIGhvd2V2ZXIsIG9ubHkgYWJvdXQgNTAwIGJ5dGVzIG9mIHRoaXMgYXJlYSBhcmUgdXNlZC4KKyAqCisgKiBTb21lIFVTQiBpbXBsZW1lbnRhdGlvbnMgY2FuJ3QgaGFuZGxlIHNpemVzIGluIGV4Y2VzcyBvZiAxMDE2LiBOb3RlCisgKiB0aGF0IFBEQSBpcyBub3QgYWN0dWFsbHkgdXNlZCBpbiB0aG9zZSBVU0IgZW52aXJvbm1lbnRzLCBidXQgbWF5IGJlCisgKiByZXRyaWV2ZWQgYnkgY29tbW9uIGNvZGUuCisgKi8KKyNkZWZpbmUgTUFYX1BEQV9TSVpFCTEwMDAKKworLyogTGltaXQgdGhlIGFtb3V0IHdlIHRyeSB0byBkb3dubG9hZCBpbiBhIHNpbmdsZSBzaG90LgorICogU2l6ZSBpcyBpbiBieXRlcy4KKyAqLworI2RlZmluZSBNQVhfRExfU0laRSAxMDI0CisjZGVmaW5lIExJTUlUX1BST0dSQU1fU0laRSAwCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgaGF2ZSBsaXR0bGUtZW5kaWFuIGZpZWxkcyBkZW5vdGVkIGJ5CisgKiB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLiAgRG9uJ3QgYWNjZXNzIHRoZW0gZGlyZWN0bHkgLSB1c2UgaW5saW5lCisgKiBmdW5jdGlvbnMgZGVmaW5lZCBiZWxvdy4KKyAqLworCisvKgorICogVGhlIGJpbmFyeSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGNvbnNpc3RzIG9mIHNlcmllcyBvZiBkYXRhIGJsb2Nrcy4KKyAqIEVhY2ggYmxvY2sgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZGJsb2NrIHsKKwlfX2xlMzIgYWRkcjsJCS8qIGFkYXB0ZXIgYWRkcmVzcyB3aGVyZSB0byB3cml0ZSB0aGUgYmxvY2sgKi8KKwlfX2xlMTYgbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBkYXRhIG9ubHksIGluIGJ5dGVzICovCisJY2hhciBkYXRhWzBdOwkJLyogZGF0YSB0byBiZSB3cml0dGVuICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFBsdWcgRGF0YSBSZWZlcmVuY2VzIGFyZSBsb2NhdGVkIGluIGluIHRoZSBpbWFnZSBhZnRlciB0aGUgbGFzdCBkYXRhCisgKiBibG9jay4gIFRoZXkgcmVmZXIgdG8gYXJlYXMgaW4gdGhlIGFkYXB0ZXIgbWVtb3J5IHdoZXJlIHRoZSBwbHVnIGRhdGEKKyAqIGl0ZW1zIHdpdGggbWF0Y2hpbmcgSUQgc2hvdWxkIGJlIHdyaXR0ZW4uCisgKi8KK3N0cnVjdCBwZHIgeworCV9fbGUzMiBpZDsJCS8qIHJlY29yZCBJRCAqLworCV9fbGUzMiBhZGRyOwkJLyogYWRhcHRlciBhZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBkYXRhICovCisJX19sZTMyIGxlbjsJCS8qIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMgKi8KKwljaGFyIG5leHRbMF07CQkvKiBuZXh0IFBEUiBzdGFydHMgaGVyZSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBQbHVnIERhdGEgSXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIEVFUFJPTSByZWFkIGZyb20gdGhlIGFkYXB0ZXIgYnkKKyAqIHByaW1hcnkgZmlybXdhcmUuICBUaGV5IHJlZmVyIHRvIHRoZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSB0aGF0IHNob3VsZAorICogYmUgcGx1Z2dlZCBpbnRvIHRoZSBzZWNvbmRhcnkgZmlybXdhcmUuCisgKi8KK3N0cnVjdCBwZGkgeworCV9fbGUxNiBsZW47CQkvKiBsZW5ndGggb2YgSUQgYW5kIGRhdGEsIGluIHdvcmRzICovCisJX19sZTE2IGlkOwkJLyogcmVjb3JkIElEICovCisJY2hhciBkYXRhWzBdOwkJLyogcGx1ZyBkYXRhICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqKiBGVyBkYXRhIGJsb2NrIGFjY2VzcyBmdW5jdGlvbnMgKioqLworCitzdGF0aWMgaW5saW5lIHUzMgorZGJsb2NrX2FkZHIoY29uc3Qgc3RydWN0IGRibG9jayAqYmxrKQoreworCXJldHVybiBsZTMyX3RvX2NwdShibGstPmFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorZGJsb2NrX2xlbihjb25zdCBzdHJ1Y3QgZGJsb2NrICpibGspCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJsay0+bGVuKTsKK30KKworLyoqKiBQRFIgQWNjZXNzIGZ1bmN0aW9ucyAqKiovCisKK3N0YXRpYyBpbmxpbmUgdTMyCitwZHJfaWQoY29uc3Qgc3RydWN0IHBkciAqcGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdShwZHItPmlkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK3Bkcl9hZGRyKGNvbnN0IHN0cnVjdCBwZHIgKnBkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocGRyLT5hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK3Bkcl9sZW4oY29uc3Qgc3RydWN0IHBkciAqcGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdShwZHItPmxlbik7Cit9CisKKy8qKiogUERJIEFjY2VzcyBmdW5jdGlvbnMgKioqLworCitzdGF0aWMgaW5saW5lIHUzMgorcGRpX2lkKGNvbnN0IHN0cnVjdCBwZGkgKnBkaSkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUocGRpLT5pZCk7Cit9CisKKy8qIFJldHVybiBsZW5ndGggb2YgdGhlIGRhdGEgb25seSwgaW4gYnl0ZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitwZGlfbGVuKGNvbnN0IHN0cnVjdCBwZGkgKnBkaSkKK3sKKwlyZXR1cm4gMiAqIChsZTE2X3RvX2NwdShwZGktPmxlbikgLSAxKTsKK30KKworLyoqKiBIZXJtZXMgQVVYIGNvbnRyb2wgKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2hlcm1lc19hdXhfc2V0YWRkcihoZXJtZXNfdCAqaHcsIHUzMiBhZGRyKQoreworCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19BVVhQQUdFLCAodTE2KSAoYWRkciA+PiA3KSk7CisJaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX0FVWE9GRlNFVCwgKHUxNikgKGFkZHIgJiAweDdGKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitoZXJtZXNfYXV4X2NvbnRyb2woaGVybWVzX3QgKmh3LCBpbnQgZW5hYmxlZCkKK3sKKwlpbnQgZGVzaXJlZF9zdGF0ZSA9IGVuYWJsZWQgPyBIRVJNRVNfQVVYX0VOQUJMRUQgOiBIRVJNRVNfQVVYX0RJU0FCTEVEOworCWludCBhY3Rpb24gPSBlbmFibGVkID8gSEVSTUVTX0FVWF9FTkFCTEUgOiBIRVJNRVNfQVVYX0RJU0FCTEU7CisJaW50IGk7CisKKwkvKiBBbHJlYWR5IG9wZW4/ICovCisJaWYgKGhlcm1lc19yZWFkX3JlZyhodywgSEVSTUVTX0NPTlRST0wpID09IGRlc2lyZWRfc3RhdGUpCisJCXJldHVybiAwOworCisJaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX1BBUkFNMCwgSEVSTUVTX0FVWF9QVzApOworCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19QQVJBTTEsIEhFUk1FU19BVVhfUFcxKTsKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfUEFSQU0yLCBIRVJNRVNfQVVYX1BXMik7CisJaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX0NPTlRST0wsIGFjdGlvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1ZGVsYXkoMTApOworCQlpZiAoaGVybWVzX3JlYWRfcmVnKGh3LCBIRVJNRVNfQ09OVFJPTCkgPT0KKwkJICAgIGRlc2lyZWRfc3RhdGUpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKioqIFBsdWcgRGF0YSBGdW5jdGlvbnMgKioqLworCisvKgorICogU2NhbiBQRFIgZm9yIHRoZSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIFJFQ09SRF9JRC4KKyAqIElmIGl0J3Mgbm90IGZvdW5kLCByZXR1cm4gTlVMTC4KKyAqLworc3RhdGljIHN0cnVjdCBwZHIgKgoraGVybWVzX2ZpbmRfcGRyKHN0cnVjdCBwZHIgKmZpcnN0X3BkciwgdTMyIHJlY29yZF9pZCkKK3sKKwlzdHJ1Y3QgcGRyICpwZHIgPSBmaXJzdF9wZHI7CisJdm9pZCAqZW5kID0gKHZvaWQgKilmaXJzdF9wZHIgKyBNQVhfUERBX1NJWkU7CisKKwl3aGlsZSAoKCh2b2lkICopcGRyIDwgZW5kKSAmJgorCSAgICAgICAocGRyX2lkKHBkcikgIT0gUERJX0VORCkpIHsKKwkJLyoKKwkJICogUERSIGFyZWEgaXMgY3VycmVudGx5IG5vdCB0ZXJtaW5hdGVkIGJ5IFBESV9FTkQuCisJCSAqIEl0J3MgZm9sbG93ZWQgYnkgQ1JDIHJlY29yZHMsIHdoaWNoIGhhdmUgdGhlIHR5cGUKKwkJICogZmllbGQgd2hlcmUgUERSIGhhcyBsZW5ndGguICBUaGUgdHlwZSBjYW4gYmUgMCBvciAxLgorCQkgKi8KKwkJaWYgKHBkcl9sZW4ocGRyKSA8IDIpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBJZiB0aGUgcmVjb3JkIElEIG1hdGNoZXMsIHdlIGFyZSBkb25lICovCisJCWlmIChwZHJfaWQocGRyKSA9PSByZWNvcmRfaWQpCisJCQlyZXR1cm4gcGRyOworCisJCXBkciA9IChzdHJ1Y3QgcGRyICopIHBkci0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNjYW4gcHJvZHVjdGlvbiBkYXRhIGl0ZW1zIGZvciBhIHBhcnRpY3VsYXIgZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgcGRpICoKK2hlcm1lc19maW5kX3BkaShzdHJ1Y3QgcGRpICpmaXJzdF9wZGksIHUzMiByZWNvcmRfaWQpCit7CisJc3RydWN0IHBkaSAqcGRpID0gZmlyc3RfcGRpOworCisJd2hpbGUgKHBkaV9pZChwZGkpICE9IFBESV9FTkQpIHsKKworCQkvKiBJZiB0aGUgcmVjb3JkIElEIG1hdGNoZXMsIHdlIGFyZSBkb25lICovCisJCWlmIChwZGlfaWQocGRpKSA9PSByZWNvcmRfaWQpCisJCQlyZXR1cm4gcGRpOworCisJCXBkaSA9IChzdHJ1Y3QgcGRpICopICZwZGktPmRhdGFbcGRpX2xlbihwZGkpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFByb2Nlc3Mgb25lIFBsdWcgRGF0YSBJdGVtIC0gZmluZCBjb3JyZXNwb25kaW5nIFBEUiBhbmQgcGx1ZyBpdCAqLworc3RhdGljIGludAoraGVybWVzX3BsdWdfcGRpKGhlcm1lc190ICpodywgc3RydWN0IHBkciAqZmlyc3RfcGRyLCBjb25zdCBzdHJ1Y3QgcGRpICpwZGkpCit7CisJc3RydWN0IHBkciAqcGRyOworCisJLyogRmluZCB0aGUgUERSIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQREkgKi8KKwlwZHIgPSBoZXJtZXNfZmluZF9wZHIoZmlyc3RfcGRyLCBwZGlfaWQocGRpKSk7CisKKwkvKiBObyBtYXRjaCBpcyBmb3VuZCwgc2FmZSB0byBpZ25vcmUgKi8KKwlpZiAoIXBkcikKKwkJcmV0dXJuIDA7CisKKwkvKiBMZW5ndGhzIG9mIHRoZSBkYXRhIGluIFBESSBhbmQgUERSIG11c3QgbWF0Y2ggKi8KKwlpZiAocGRpX2xlbihwZGkpICE9IHBkcl9sZW4ocGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBkbyB0aGUgYWN0dWFsIHBsdWdnaW5nICovCisJaGVybWVzX2F1eF9zZXRhZGRyKGh3LCBwZHJfYWRkcihwZHIpKTsKKwloZXJtZXNfd3JpdGVfYnl0ZXMoaHcsIEhFUk1FU19BVVhEQVRBLCBwZGktPmRhdGEsIHBkaV9sZW4ocGRpKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBQREEgZnJvbSB0aGUgYWRhcHRlciAqLworaW50IGhlcm1lc19yZWFkX3BkYShoZXJtZXNfdCAqaHcsCisJCSAgICBfX2xlMTYgKnBkYSwKKwkJICAgIHUzMiBwZGFfYWRkciwKKwkJICAgIHUxNiBwZGFfbGVuLAorCQkgICAgaW50IHVzZV9lZXByb20pIC8qIGNhbiB3ZSBnZXQgdGhpcyBpbnRvIGh3PyAqLworeworCWludCByZXQ7CisJdTE2IHBkYV9zaXplOworCXUxNiBkYXRhX2xlbiA9IHBkYV9sZW47CisJX19sZTE2ICpkYXRhID0gcGRhOworCisJaWYgKHVzZV9lZXByb20pIHsKKwkJLyogUERBIG9mIHNwZWN0cnVtIHN5bWJvbCBpcyBpbiBlZXByb20gKi8KKworCQkvKiBJc3N1ZSBjb21tYW5kIHRvIHJlYWQgRUVQUk9NICovCisJCXJldCA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX1JFQURNSUYsIDAsIE5VTEwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKiB3bF9sa20gZG9lcyBub3QgaW5jbHVkZSBQREEgc2l6ZSBpbiB0aGUgUERBIGFyZWEuCisJCSAqIFdlIHdpbGwgcGFkIHRoZSBpbmZvcm1hdGlvbiBpbnRvIHBkYSwgc28gb3RoZXIgcm91dGluZXMKKwkJICogZG9uJ3QgaGF2ZSB0byBiZSBtb2RpZmllZCAqLworCQlwZGFbMF0gPSBjcHVfdG9fbGUxNihwZGFfbGVuIC0gMik7CisJCQkvKiBJbmNsdWRlcyBDRkdfUFJPRF9EQVRBIGJ1dCBub3QgaXRzZWxmICovCisJCXBkYVsxXSA9IGNwdV90b19sZTE2KDB4MDgwMCk7IC8qIENGR19QUk9EX0RBVEEgKi8KKwkJZGF0YV9sZW4gPSBwZGFfbGVuIC0gNDsKKwkJZGF0YSA9IHBkYSArIDI7CisJfQorCisJLyogT3BlbiBhdXhpbGlhcnkgcG9ydCAqLworCXJldCA9IGhlcm1lc19hdXhfY29udHJvbChodywgMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJBVVggZW5hYmxlIHJldHVybmVkICVkXG4iLCByZXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiByZWFkIFBEQSBmcm9tIEVFUFJPTSAqLworCWhlcm1lc19hdXhfc2V0YWRkcihodywgcGRhX2FkZHIpOworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfQVVYREFUQSwgZGF0YSwgZGF0YV9sZW4gLyAyKTsKKworCS8qIENsb3NlIGF1eCBwb3J0ICovCisJcmV0ID0gaGVybWVzX2F1eF9jb250cm9sKGh3LCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkFVWCBkaXNhYmxlIHJldHVybmVkICVkXG4iLCByZXQpOworCisJLyogQ2hlY2sgUERBIGxlbmd0aCAqLworCXBkYV9zaXplID0gbGUxNl90b19jcHUocGRhWzBdKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkFjdHVhbCBQREEgbGVuZ3RoICVkLCBNYXggYWxsb3dlZCAlZFxuIiwKKwkgICAgICAgcGRhX3NpemUsIHBkYV9sZW4pOworCWlmIChwZGFfc2l6ZSA+IHBkYV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19yZWFkX3BkYSk7CisKKy8qIFBhcnNlIFBEQSBhbmQgd3JpdGUgdGhlIHJlY29yZHMgaW50byB0aGUgYWRhcHRlcgorICoKKyAqIEF0dGVtcHQgdG8gd3JpdGUgZXZlcnkgcmVjb3JkcyB0aGF0IGlzIGluIHRoZSBzcGVjaWZpZWQgcGRhCisgKiB3aGljaCBhbHNvIGhhcyBhIHZhbGlkIHByb2R1Y3Rpb24gZGF0YSByZWNvcmQgZm9yIHRoZSBmaXJtd2FyZS4KKyAqLworaW50IGhlcm1lc19hcHBseV9wZGEoaGVybWVzX3QgKmh3LAorCQkgICAgIGNvbnN0IGNoYXIgKmZpcnN0X3BkciwKKwkJICAgICBjb25zdCBfX2xlMTYgKnBkYSkKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBwZGkgKnBkaTsKKwlzdHJ1Y3QgcGRyICpwZHI7CisKKwlwZHIgPSAoc3RydWN0IHBkciAqKSBmaXJzdF9wZHI7CisKKwkvKiBHbyB0aHJvdWdoIGV2ZXJ5IFBESSBhbmQgcGx1ZyB0aGVtIGludG8gdGhlIGFkYXB0ZXIgKi8KKwlwZGkgPSAoY29uc3Qgc3RydWN0IHBkaSAqKSAocGRhICsgMik7CisJd2hpbGUgKHBkaV9pZChwZGkpICE9IFBESV9FTkQpIHsKKwkJcmV0ID0gaGVybWVzX3BsdWdfcGRpKGh3LCBwZHIsIHBkaSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBQREkgKi8KKwkJcGRpID0gKGNvbnN0IHN0cnVjdCBwZGkgKikgJnBkaS0+ZGF0YVtwZGlfbGVuKHBkaSldOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaGVybWVzX2FwcGx5X3BkYSk7CisKKy8qIElkZW50aWZ5IHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIGJsb2NrcworICogaW5jbHVkaW5nIHRoZSBoZWFkZXIgZGF0YS4KKyAqLworc2l6ZV90CitoZXJtZXNfYmxvY2tzX2xlbmd0aChjb25zdCBjaGFyICpmaXJzdF9ibG9jaykKK3sKKwljb25zdCBzdHJ1Y3QgZGJsb2NrICpibGsgPSAoY29uc3Qgc3RydWN0IGRibG9jayAqKSBmaXJzdF9ibG9jazsKKwlpbnQgdG90YWxfbGVuID0gMDsKKwlpbnQgbGVuOworCisJLyogU2tpcCBhbGwgYmxvY2tzIHRvIGxvY2F0ZSBQbHVnIERhdGEgUmVmZXJlbmNlcworCSAqIChTcGVjdHJ1bSBDUykgKi8KKwl3aGlsZSAoZGJsb2NrX2FkZHIoYmxrKSAhPSBCTE9DS19FTkQpIHsKKwkJbGVuID0gZGJsb2NrX2xlbihibGspOworCQl0b3RhbF9sZW4gKz0gc2l6ZW9mKCpibGspICsgbGVuOworCQlibGsgPSAoc3RydWN0IGRibG9jayAqKSAmYmxrLT5kYXRhW2xlbl07CisJfQorCisJcmV0dXJuIHRvdGFsX2xlbjsKK30KK0VYUE9SVF9TWU1CT0woaGVybWVzX2Jsb2Nrc19sZW5ndGgpOworCisvKioqIEhlcm1lcyBwcm9ncmFtbWluZyAqKiovCisKKy8qIEFib3V0IHRvIHN0YXJ0IHByb2dyYW1taW5nIGRhdGEgKEhlcm1lcyBJKQorICogb2Zmc2V0IGlzIHRoZSBlbnRyeSBwb2ludAorICoKKyAqIFNwZWN0cnVtX2NzJyBTeW1ib2wgZncgZG9lcyBub3QgcmVxdWlyZSB0aGlzCisgKiB3bF9sa20gQWdlcmUgZncgZG9lcworICogRG9uJ3Qga25vdyBhYm91dCBpbnRlcnNpbAorICovCitpbnQgaGVybWVzaV9wcm9ncmFtX2luaXQoaGVybWVzX3QgKmh3LCB1MzIgb2Zmc2V0KQoreworCWludCBlcnI7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHM/Ki8KKwkvKmh3LT5pbnRlbiA9IDB4MDsqLworCS8qaGVybWVzX3dyaXRlX3JlZ24oaHcsIElOVEVOLCAwKTsqLworCS8qaGVybWVzX3NldF9pcnFtYXNrKGh3LCAwKTsqLworCisJLyogQWNrbm93bGVkZ2UgYW55IG91dHN0YW5kaW5nIGNvbW1hbmQgKi8KKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4RkZGRik7CisKKwkvKiBVc2luZyBkb2ljbWRfd2FpdCByYXRoZXIgdGhhbiBkb2NtZF93YWl0ICovCisJZXJyID0gaGVybWVzX2RvaWNtZF93YWl0KGh3LAorCQkJCSAweDAxMDAgfCBIRVJNRVNfQ01EX0lOSVQsCisJCQkJIDAsIDAsIDAsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBoZXJtZXNfZG9pY21kX3dhaXQoaHcsCisJCQkJIDB4MDAwMCB8IEhFUk1FU19DTURfSU5JVCwKKwkJCQkgMCwgMCwgMCwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGhlcm1lc19hdXhfY29udHJvbChodywgMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJBVVggZW5hYmxlIHJldHVybmVkICVkXG4iLCBlcnIpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRW5hYmxpbmcgdm9sYXRpbGUsIEVQIDB4JTA4eFxuIiwgb2Zmc2V0KTsKKwllcnIgPSBoZXJtZXNfZG9pY21kX3dhaXQoaHcsCisJCQkJIEhFUk1FU19QUk9HUkFNX0VOQUJMRV9WT0xBVElMRSwKKwkJCQkgb2Zmc2V0ICYgMHhGRkZGdSwKKwkJCQkgb2Zmc2V0ID4+IDE2LAorCQkJCSAwLAorCQkJCSBOVUxMKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIlBST0dSQU1fRU5BQkxFIHJldHVybmVkICVkXG4iLAorCSAgICAgICBlcnIpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woaGVybWVzaV9wcm9ncmFtX2luaXQpOworCisvKiBEb25lIHByb2dyYW1taW5nIGRhdGEgKEhlcm1lcyBJKQorICoKKyAqIFNwZWN0cnVtX2NzJyBTeW1ib2wgZncgZG9lcyBub3QgcmVxdWlyZSB0aGlzCisgKiB3bF9sa20gQWdlcmUgZncgZG9lcworICogRG9uJ3Qga25vdyBhYm91dCBpbnRlcnNpbAorICovCitpbnQgaGVybWVzaV9wcm9ncmFtX2VuZChoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IGhlcm1lc19yZXNwb25zZSByZXNwOworCWludCByYyA9IDA7CisJaW50IGVycjsKKworCXJjID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19QUk9HUkFNX0RJU0FCTEUsIDAsICZyZXNwKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiUFJPR1JBTV9ESVNBQkxFIHJldHVybmVkICVkLCAiCisJICAgICAgICJyMCAweCUwNHgsIHIxIDB4JTA0eCwgcjIgMHglMDR4XG4iLAorCSAgICAgICByYywgcmVzcC5yZXNwMCwgcmVzcC5yZXNwMSwgcmVzcC5yZXNwMik7CisKKwlpZiAoKHJjID09IDApICYmCisJICAgICgocmVzcC5zdGF0dXMgJiBIRVJNRVNfU1RBVFVTX0NNRENPREUpICE9IEhFUk1FU19DTURfRE9XTkxEKSkKKwkJcmMgPSAtRUlPOworCisJZXJyID0gaGVybWVzX2F1eF9jb250cm9sKGh3LCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkFVWCBkaXNhYmxlIHJldHVybmVkICVkXG4iLCBlcnIpOworCisJLyogQWNrbm93bGVkZ2UgYW55IG91dHN0YW5kaW5nIGNvbW1hbmQgKi8KKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4RkZGRik7CisKKwkvKiBSZWluaXRpYWxpc2UsIGlnbm9yaW5nIHJldHVybiAqLworCSh2b2lkKSBoZXJtZXNfZG9pY21kX3dhaXQoaHcsIDB4MDAwMCB8IEhFUk1FU19DTURfSU5JVCwKKwkJCQkgIDAsIDAsIDAsIE5VTEwpOworCisJcmV0dXJuIHJjID8gcmMgOiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGhlcm1lc2lfcHJvZ3JhbV9lbmQpOworCisvKiBQcm9ncmFtIHRoZSBkYXRhIGJsb2NrcyAqLworaW50IGhlcm1lc19wcm9ncmFtKGhlcm1lc190ICpodywgY29uc3QgY2hhciAqZmlyc3RfYmxvY2ssIGNvbnN0IGNoYXIgKmVuZCkKK3sKKwljb25zdCBzdHJ1Y3QgZGJsb2NrICpibGs7CisJdTMyIGJsa2FkZHI7CisJdTMyIGJsa2xlbjsKKyNpZiBMSU1JVF9QUk9HUkFNX1NJWkUKKwl1MzIgYWRkcjsKKwl1MzIgbGVuOworI2VuZGlmCisKKwlibGsgPSAoY29uc3Qgc3RydWN0IGRibG9jayAqKSBmaXJzdF9ibG9jazsKKworCWlmICgoY29uc3QgY2hhciAqKSBibGsgPiAoZW5kIC0gc2l6ZW9mKCpibGspKSkKKwkJcmV0dXJuIC1FSU87CisKKwlibGthZGRyID0gZGJsb2NrX2FkZHIoYmxrKTsKKwlibGtsZW4gPSBkYmxvY2tfbGVuKGJsayk7CisKKwl3aGlsZSAoKGJsa2FkZHIgIT0gQkxPQ0tfRU5EKSAmJgorCSAgICAgICAoKChjb25zdCBjaGFyICopIGJsayArIGJsa2xlbikgPD0gZW5kKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJICAgICAgICJQcm9ncmFtbWluZyBibG9jayBvZiBsZW5ndGggJWQgdG8gYWRkcmVzcyAweCUwOHhcbiIsCisJCSAgICAgICBibGtsZW4sIGJsa2FkZHIpOworCisjaWYgIUxJTUlUX1BST0dSQU1fU0laRQorCQkvKiB3bF9sa20gZHJpdmVyIHNwbGl0cyB0aGlzIGludG8gd3JpdGVzIG9mIDIwMDAgYnl0ZXMgKi8KKwkJaGVybWVzX2F1eF9zZXRhZGRyKGh3LCBibGthZGRyKTsKKwkJaGVybWVzX3dyaXRlX2J5dGVzKGh3LCBIRVJNRVNfQVVYREFUQSwgYmxrLT5kYXRhLAorCQkJCSAgIGJsa2xlbik7CisjZWxzZQorCQlsZW4gPSAoYmxrbGVuIDwgTUFYX0RMX1NJWkUpID8gYmxrbGVuIDogTUFYX0RMX1NJWkU7CisJCWFkZHIgPSBibGthZGRyOworCisJCXdoaWxlIChhZGRyIDwgKGJsa2FkZHIgKyBibGtsZW4pKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCSAgICAgICAiUHJvZ3JhbW1pbmcgc3ViYmxvY2sgb2YgbGVuZ3RoICVkICIKKwkJCSAgICAgICAidG8gYWRkcmVzcyAweCUwOHguIERhdGEgQCAlcFxuIiwKKwkJCSAgICAgICBsZW4sIGFkZHIsICZibGstPmRhdGFbYWRkciAtIGJsa2FkZHJdKTsKKworCQkJaGVybWVzX2F1eF9zZXRhZGRyKGh3LCBhZGRyKTsKKwkJCWhlcm1lc193cml0ZV9ieXRlcyhodywgSEVSTUVTX0FVWERBVEEsCisJCQkJCSAgICZibGstPmRhdGFbYWRkciAtIGJsa2FkZHJdLAorCQkJCQkgICBsZW4pOworCisJCQlhZGRyICs9IGxlbjsKKwkJCWxlbiA9ICgoYmxrYWRkciArIGJsa2xlbiAtIGFkZHIpIDwgTUFYX0RMX1NJWkUpID8KKwkJCQkoYmxrYWRkciArIGJsa2xlbiAtIGFkZHIpIDogTUFYX0RMX1NJWkU7CisJCX0KKyNlbmRpZgorCQlibGsgPSAoY29uc3Qgc3RydWN0IGRibG9jayAqKSAmYmxrLT5kYXRhW2Jsa2xlbl07CisKKwkJaWYgKChjb25zdCBjaGFyICopIGJsayA+IChlbmQgLSBzaXplb2YoKmJsaykpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJYmxrYWRkciA9IGRibG9ja19hZGRyKGJsayk7CisJCWJsa2xlbiA9IGRibG9ja19sZW4oYmxrKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19wcm9ncmFtKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9oZXJtZXNfZGxkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hlcm1lc19kbGQodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZXJtZXNfZGxkKTsKK21vZHVsZV9leGl0KGV4aXRfaGVybWVzX2RsZCk7CisKKy8qKiogRGVmYXVsdCBwbHVnZ2luZyBkYXRhIGZvciBIZXJtZXMgSSAqKiovCisvKiBWYWx1ZXMgZnJvbSB3bF9sa21fNzE4L2hjZi9kaGYuYyAqLworCisjZGVmaW5lIERFRklORV9ERUZBVUxUX1BEUihwaWQsIGxlbmd0aCwgZGF0YSkJCQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCB7CQkJCQkJCVwKKwlfX2xlMTYgbGVuOwkJCQkJCQlcCisJX19sZTE2IGlkOwkJCQkJCQlcCisJdTggdmFsW2xlbmd0aF07CQkJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRlZmF1bHRfcGRyX2RhdGFfIyNwaWQgPSB7CQkJXAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoKHNpemVvZihkZWZhdWx0X3Bkcl9kYXRhXyMjcGlkKS8JCVwKKwkJCQlzaXplb2YoX19sZTE2KSkgLSAxKSwJCQlcCisJX19jb25zdGFudF9jcHVfdG9fbGUxNihwaWQpLAkJCQkJXAorCWRhdGEJCQkJCQkJCVwKK30KKworI2RlZmluZSBERUZBVUxUX1BEUihwaWQpIGRlZmF1bHRfcGRyX2RhdGFfIyNwaWQKKworLyogIEhXSUYgQ29tcGF0aWJsaXR5ICovCitERUZJTkVfREVGQVVMVF9QRFIoMHgwMDA1LCAxMCwgIlx4MDBceDAwXHgwNlx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDAiKTsKKworLyogUFBQUFNpZ24gKi8KK0RFRklORV9ERUZBVUxUX1BEUigweDAxMDgsIDQsICJceDAwXHgwMFx4MDBceDAwIik7CisKKy8qIFBQUFBQcm9mICovCitERUZJTkVfREVGQVVMVF9QRFIoMHgwMTA5LCAxMCwgIlx4MDBceDAwXHgwMFx4MDBceDAzXHgwMFx4MDBceDAwXHgwMFx4MDAiKTsKKworLyogQW50ZW5uYSBkaXZlcnNpdHkgKi8KK0RFRklORV9ERUZBVUxUX1BEUigweDAxNTAsIDIsICJceDAwXHgzRiIpOworCisvKiBNb2RlbSBWQ08gYmFuZCBTZXQtdXAgKi8KK0RFRklORV9ERUZBVUxUX1BEUigweDAxNjAsIDI4LAorCQkgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisJCSAgICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKwkJICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorCQkgICAiXHgwMFx4MDBceDAwXHgwMCIpOworCisvKiBNb2RlbSBSeCBHYWluIFRhYmxlIFZhbHVlcyAqLworREVGSU5FX0RFRkFVTFRfUERSKDB4MDE2MSwgMjU2LAorCQkgICAiXHgzRlx4MDFceDNGXDAxXHgzRlx4MDFceDNGXHgwMSIKKwkJICAgIlx4M0ZceDAxXHgzRlwwMVx4M0ZceDAxXHgzRlx4MDEiCisJCSAgICJceDNGXHgwMVx4M0ZcMDFceDNGXHgwMVx4M0ZceDAxIgorCQkgICAiXHgzRlx4MDFceDNGXDAxXHgzRlx4MDFceDNGXHgwMSIKKwkJICAgIlx4M0ZceDAxXHgzRVwwMVx4M0VceDAxXHgzRFx4MDEiCisJCSAgICJceDNEXHgwMVx4M0NcMDFceDNDXHgwMVx4M0JceDAxIgorCQkgICAiXHgzQlx4MDFceDNBXDAxXHgzQVx4MDFceDM5XHgwMSIKKwkJICAgIlx4MzlceDAxXHgzOFwwMVx4MzhceDAxXHgzN1x4MDEiCisJCSAgICJceDM3XHgwMVx4MzZcMDFceDM2XHgwMVx4MzVceDAxIgorCQkgICAiXHgzNVx4MDFceDM0XDAxXHgzNFx4MDFceDMzXHgwMSIKKwkJICAgIlx4MzNceDAxXHgzMlx4MDFceDMyXHgwMVx4MzFceDAxIgorCQkgICAiXHgzMVx4MDFceDMwXHgwMVx4MzBceDAxXHg3Qlx4MDEiCisJCSAgICJceDdCXHgwMVx4N0FceDAxXHg3QVx4MDFceDc5XHgwMSIKKwkJICAgIlx4NzlceDAxXHg3OFx4MDFceDc4XHgwMVx4NzdceDAxIgorCQkgICAiXHg3N1x4MDFceDc2XHgwMVx4NzZceDAxXHg3NVx4MDEiCisJCSAgICJceDc1XHgwMVx4NzRceDAxXHg3NFx4MDFceDczXHgwMSIKKwkJICAgIlx4NzNceDAxXHg3Mlx4MDFceDcyXHgwMVx4NzFceDAxIgorCQkgICAiXHg3MVx4MDFceDcwXHgwMVx4NzBceDAxXHg2OFx4MDEiCisJCSAgICJceDY4XHgwMVx4NjdceDAxXHg2N1x4MDFceDY2XHgwMSIKKwkJICAgIlx4NjZceDAxXHg2NVx4MDFceDY1XHgwMVx4NTdceDAxIgorCQkgICAiXHg1N1x4MDFceDU2XHgwMVx4NTZceDAxXHg1NVx4MDEiCisJCSAgICJceDU1XHgwMVx4NTRceDAxXHg1NFx4MDFceDUzXHgwMSIKKwkJICAgIlx4NTNceDAxXHg1Mlx4MDFceDUyXHgwMVx4NTFceDAxIgorCQkgICAiXHg1MVx4MDFceDUwXHgwMVx4NTBceDAxXHg0OFx4MDEiCisJCSAgICJceDQ4XHgwMVx4NDdceDAxXHg0N1x4MDFceDQ2XHgwMSIKKwkJICAgIlx4NDZceDAxXHg0NVx4MDFceDQ1XHgwMVx4NDRceDAxIgorCQkgICAiXHg0NFx4MDFceDQzXHgwMVx4NDNceDAxXHg0Mlx4MDEiCisJCSAgICJceDQyXHgwMVx4NDFceDAxXHg0MVx4MDFceDQwXHgwMSIKKwkJICAgIlx4NDBceDAxXHg0MFx4MDFceDQwXHgwMVx4NDBceDAxIgorCQkgICAiXHg0MFx4MDFceDQwXHgwMVx4NDBceDAxXHg0MFx4MDEiCisJCSAgICJceDQwXHgwMVx4NDBceDAxXHg0MFx4MDFceDQwXHgwMSIKKwkJICAgIlx4NDBceDAxXHg0MFx4MDFceDQwXHgwMVx4NDBceDAxIik7CisKKy8qIFdyaXRlIFBEQSBhY2NvcmRpbmcgdG8gY2VydGFpbiBydWxlcy4KKyAqCisgKiBGb3IgZXZlcnkgcHJvZHVjdGlvbiBkYXRhIHJlY29yZCwgbG9vayBmb3IgYSBwcmV2aW91cyBzZXR0aW5nIGluCisgKiB0aGUgcGRhLCBhbmQgdXNlIHRoYXQuCisgKgorICogRm9yIGNlcnRhaW4gcmVjb3JkcywgdXNlIGRlZmF1bHRzIGlmIHRoZXkgYXJlIG5vdCBmb3VuZCBpbiBwZGEuCisgKi8KK2ludCBoZXJtZXNfYXBwbHlfcGRhX3dpdGhfZGVmYXVsdHMoaGVybWVzX3QgKmh3LAorCQkJCSAgIGNvbnN0IGNoYXIgKmZpcnN0X3BkciwKKwkJCQkgICBjb25zdCBfX2xlMTYgKnBkYSkKK3sKKwljb25zdCBzdHJ1Y3QgcGRyICpwZHIgPSAoY29uc3Qgc3RydWN0IHBkciAqKSBmaXJzdF9wZHI7CisJc3RydWN0IHBkaSAqZmlyc3RfcGRpID0gKHN0cnVjdCBwZGkgKikgJnBkYVsyXTsKKwlzdHJ1Y3QgcGRpICpwZGk7CisJc3RydWN0IHBkaSAqZGVmYXVsdF9wZGkgPSBOVUxMOworCXN0cnVjdCBwZGkgKm91dGRvb3JfcGRpOworCXZvaWQgKmVuZCA9ICh2b2lkICopZmlyc3RfcGRyICsgTUFYX1BEQV9TSVpFOworCWludCByZWNvcmRfaWQ7CisKKwl3aGlsZSAoKCh2b2lkICopcGRyIDwgZW5kKSAmJgorCSAgICAgICAocGRyX2lkKHBkcikgIT0gUERJX0VORCkpIHsKKwkJLyoKKwkJICogRm9yIHNwZWN0cnVtX2NzIGZpcm13YXJlcywKKwkJICogUERSIGFyZWEgaXMgY3VycmVudGx5IG5vdCB0ZXJtaW5hdGVkIGJ5IFBESV9FTkQuCisJCSAqIEl0J3MgZm9sbG93ZWQgYnkgQ1JDIHJlY29yZHMsIHdoaWNoIGhhdmUgdGhlIHR5cGUKKwkJICogZmllbGQgd2hlcmUgUERSIGhhcyBsZW5ndGguICBUaGUgdHlwZSBjYW4gYmUgMCBvciAxLgorCQkgKi8KKwkJaWYgKHBkcl9sZW4ocGRyKSA8IDIpCisJCQlicmVhazsKKwkJcmVjb3JkX2lkID0gcGRyX2lkKHBkcik7CisKKwkJcGRpID0gaGVybWVzX2ZpbmRfcGRpKGZpcnN0X3BkaSwgcmVjb3JkX2lkKTsKKwkJaWYgKHBkaSkKKwkJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRm91bmQgcmVjb3JkIDB4JTA0eCBhdCAlcFxuIiwKKwkJCSAgICAgICByZWNvcmRfaWQsIHBkaSk7CisKKwkJc3dpdGNoIChyZWNvcmRfaWQpIHsKKwkJY2FzZSAweDExMDogLyogTW9kZW0gUkVGREFDIHZhbHVlcyAqLworCQljYXNlIDB4MTIwOiAvKiBNb2RlbSBWR0RBQyB2YWx1ZXMgKi8KKwkJCW91dGRvb3JfcGRpID0gaGVybWVzX2ZpbmRfcGRpKGZpcnN0X3BkaSwgcmVjb3JkX2lkICsgMSk7CisJCQlkZWZhdWx0X3BkaSA9IE5VTEw7CisJCQlpZiAob3V0ZG9vcl9wZGkpIHsKKwkJCQlwZGkgPSBvdXRkb29yX3BkaTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJCQkgICAgICAgIlVzaW5nIG91dGRvb3IgcmVjb3JkIDB4JTA0eCBhdCAlcFxuIiwKKwkJCQkgICAgICAgcmVjb3JkX2lkICsgMSwgcGRpKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4NTogLyogIEhXSUYgQ29tcGF0aWJsaXR5ICovCisJCQlkZWZhdWx0X3BkaSA9IChzdHJ1Y3QgcGRpICopICZERUZBVUxUX1BEUigweDAwMDUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMDg6IC8qIFBQUFBTaWduICovCisJCQlkZWZhdWx0X3BkaSA9IChzdHJ1Y3QgcGRpICopICZERUZBVUxUX1BEUigweDAxMDgpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMDk6IC8qIFBQUFBQcm9mICovCisJCQlkZWZhdWx0X3BkaSA9IChzdHJ1Y3QgcGRpICopICZERUZBVUxUX1BEUigweDAxMDkpOworCQkJYnJlYWs7CisJCWNhc2UgMHgxNTA6IC8qIEFudGVubmEgZGl2ZXJzaXR5ICovCisJCQlkZWZhdWx0X3BkaSA9IChzdHJ1Y3QgcGRpICopICZERUZBVUxUX1BEUigweDAxNTApOworCQkJYnJlYWs7CisJCWNhc2UgMHgxNjA6IC8qIE1vZGVtIFZDTyBiYW5kIFNldC11cCAqLworCQkJZGVmYXVsdF9wZGkgPSAoc3RydWN0IHBkaSAqKSAmREVGQVVMVF9QRFIoMHgwMTYwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MTYxOiAvKiBNb2RlbSBSeCBHYWluIFRhYmxlIFZhbHVlcyAqLworCQkJZGVmYXVsdF9wZGkgPSAoc3RydWN0IHBkaSAqKSAmREVGQVVMVF9QRFIoMHgwMTYxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGVmYXVsdF9wZGkgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFwZGkgJiYgZGVmYXVsdF9wZGkpIHsKKwkJCS8qIFVzZSBkZWZhdWx0ICovCisJCQlwZGkgPSBkZWZhdWx0X3BkaTsKKwkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAorCQkJICAgICAgICJVc2luZyBkZWZhdWx0IHJlY29yZCAweCUwNHggYXQgJXBcbiIsCisJCQkgICAgICAgcmVjb3JkX2lkLCBwZGkpOworCQl9CisKKwkJaWYgKHBkaSkgeworCQkJLyogTGVuZ3RocyBvZiB0aGUgZGF0YSBpbiBQREkgYW5kIFBEUiBtdXN0IG1hdGNoICovCisJCQlpZiAocGRpX2xlbihwZGkpID09IHBkcl9sZW4ocGRyKSkgeworCQkJCS8qIGRvIHRoZSBhY3R1YWwgcGx1Z2dpbmcgKi8KKwkJCQloZXJtZXNfYXV4X3NldGFkZHIoaHcsIHBkcl9hZGRyKHBkcikpOworCQkJCWhlcm1lc193cml0ZV9ieXRlcyhodywgSEVSTUVTX0FVWERBVEEsCisJCQkJCQkgICBwZGktPmRhdGEsIHBkaV9sZW4ocGRpKSk7CisJCQl9CisJCX0KKworCQlwZHIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhlcm1lc19hcHBseV9wZGFfd2l0aF9kZWZhdWx0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfZGxkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfZGxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjI2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19kbGQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCBEYXZpZCBLaWxyb3kKKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICovCisjaWZuZGVmIF9IRVJNRVNfRExEX0gKKyNkZWZpbmUgX0hFUk1FU19ETERfSAorCisjaW5jbHVkZSAiaGVybWVzLmgiCisKK2ludCBoZXJtZXNpX3Byb2dyYW1faW5pdChoZXJtZXNfdCAqaHcsIHUzMiBvZmZzZXQpOworaW50IGhlcm1lc2lfcHJvZ3JhbV9lbmQoaGVybWVzX3QgKmh3KTsKK2ludCBoZXJtZXNfcHJvZ3JhbShoZXJtZXNfdCAqaHcsIGNvbnN0IGNoYXIgKmZpcnN0X2Jsb2NrLCBjb25zdCBjaGFyICplbmQpOworCitpbnQgaGVybWVzX3JlYWRfcGRhKGhlcm1lc190ICpodywKKwkJICAgIF9fbGUxNiAqcGRhLAorCQkgICAgdTMyIHBkYV9hZGRyLAorCQkgICAgdTE2IHBkYV9sZW4sCisJCSAgICBpbnQgdXNlX2VlcHJvbSk7CitpbnQgaGVybWVzX2FwcGx5X3BkYShoZXJtZXNfdCAqaHcsCisJCSAgICAgY29uc3QgY2hhciAqZmlyc3RfcGRyLAorCQkgICAgIGNvbnN0IF9fbGUxNiAqcGRhKTsKK2ludCBoZXJtZXNfYXBwbHlfcGRhX3dpdGhfZGVmYXVsdHMoaGVybWVzX3QgKmh3LAorCQkJCSAgIGNvbnN0IGNoYXIgKmZpcnN0X3BkciwKKwkJCQkgICBjb25zdCBfX2xlMTYgKnBkYSk7CisKK3NpemVfdCBoZXJtZXNfYmxvY2tzX2xlbmd0aChjb25zdCBjaGFyICpmaXJzdF9ibG9jayk7CisKKyNlbmRpZiAvKiBfSEVSTUVTX0RMRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmgKaW5kZXggNGY0NmI0OC4uNDJlYjY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzX3JpZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19yaWQuaApAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEVOQUJMRURfQUdFUkUJCTB4RkMyMAogI2RlZmluZSBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0FHRVJFCTB4RkMyMQogI2RlZmluZSBIRVJNRVNfUklEX0NORk1BTkRBVE9SWUJTU0lEX1NZTUJPTAkweEZDMjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZEUk9QVU5FTkNSWVBURUQJCTB4RkMyMgogI2RlZmluZSBIRVJNRVNfUklEX0NORldFUERFRkFVTFRLRVlJRAkJMHhGQzIzCiAjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTAJCTB4RkMyNAogI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkxCQkweEZDMjUKQEAgLTg1LDYgKzg2LDE2IEBACiAjZGVmaW5lIEhFUk1FU19SSURfQ05GU0NBTlNTSURfQUdFUkUJCTB4RkNCMgogI2RlZmluZSBIRVJNRVNfUklEX0NORkJBU0lDUkFURVMJCTB4RkNCMwogI2RlZmluZSBIRVJNRVNfUklEX0NORlNVUFBPUlRFRFJBVEVTCQkweEZDQjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBRERERUZBVUxUVEtJUEtFWV9BR0VSRQkweEZDQjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTRVRXUEFBVVRITUdNVFNVSVRFX0FHRVJFCTB4RkNCNQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJFTURFRkFVTFRUS0lQS0VZX0FHRVJFCTB4RkNCNgorI2RlZmluZSBIRVJNRVNfUklEX0NORkFERE1BUFBFRFRLSVBLRVlfQUdFUkUJMHhGQ0I3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUkVNTUFQUEVEVEtJUEtFWV9BR0VSRQkweEZDQjgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTRVRXUEFDQVBBQklMSVRJRVNfQUdFUkUJMHhGQ0I5CisjZGVmaW5lIEhFUk1FU19SSURfQ05GQ0FDSEVEUE1LQUREUkVTUwkJMHhGQ0JBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUkVNT1ZFUE1LQUREUkVTUwkJMHhGQ0JCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0NBTkNIQU5ORUxTMkdIWgkJMHhGQ0MyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRElTQVNTT0NJQVRFCQkweEZDQzgKICNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUSUNLVElNRQkJCTB4RkNFMAogI2RlZmluZSBIRVJNRVNfUklEX0NORlNDQU5SRVFVRVNUCQkweEZDRTEKICNkZWZpbmUgSEVSTUVTX1JJRF9DTkZKT0lOUkVRVUVTVAkJMHhGQ0UyCkBAIC0xMzcsNiArMTQ4LDEyIEBACiAjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTYJCTB4RkQ4NQogI2RlZmluZSBIRVJNRVNfUklEX09XTk1BQ0FERFIJCQkweEZEODYKICNkZWZpbmUgSEVSTUVTX1JJRF9TQ0FOUkVTVUxUU1RBQkxFCQkweEZEODgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UX0NPVU5UUllfSU5GTwkJMHhGRDg5CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVF9XUEFfSUUJCTB4RkQ4QQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRfVEtJUF9JVgkJMHhGRDhCCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVF9BU1NPQ19SRVFfSU5GTwkweEZEOEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UX0FTU09DX1JFU1BfSU5GTwkweEZEOEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9UWFFVRVVFRU1QVFkJCQkweEZEOTEKICNkZWZpbmUgSEVSTUVTX1JJRF9QSFlUWVBFCQkJMHhGREMwCiAjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVENIQU5ORUwJCTB4RkRDMQogI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRQT1dFUlNUQVRFCQkweEZEQzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwppbmRleCAzYjRlNTVjLi42MzM3NDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCkBAIC0yMzQsNyArMjM0LDcgQEAKIAlyZWcuVmFsdWUgPSBod19wcml2LT5saW5rLT5pby5CYXNlUG9ydDEgJiAweDAwZmY7CiAJcmVzID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3X3ByaXYtPmxpbmssCiAJCQkJCQkgICAmcmVnKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIlByaXNtMyBTYW5EaXNrIC0gZmFpbGVkIHRvIHNldCBJL08gYmFzZSAwIC0iCiAJCSAgICAgICAiIHJlcz0lZFxuIiwgcmVzKTsKIAl9CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlyZWcuVmFsdWUgPSAoaHdfcHJpdi0+bGluay0+aW8uQmFzZVBvcnQxICYgMHhmZjAwKSA+PiA4OwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJQcmlzbTMgU2FuRGlzayAtIGZhaWxlZCB0byBzZXQgSS9PIGJhc2UgMSAtIgogCQkgICAgICAgIiByZXM9JWRcbiIsIHJlcyk7CiAJfQpAQCAtMzA1LDcgKzMwNSw3IEBACiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0xPTkdMSU5LX01GQzsKIAlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShod19wcml2LT5saW5rLCAmdHVwbGUpIHx8CiAJICAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShod19wcml2LT5saW5rLCAmdHVwbGUpIHx8Ci0JICAgIHBjbWNpYV9wYXJzZV90dXBsZShod19wcml2LT5saW5rLCAmdHVwbGUsIHBhcnNlKSB8fAorCSAgICBwY21jaWFfcGFyc2VfdHVwbGUoJnR1cGxlLCBwYXJzZSkgfHwKIAkJcGFyc2UtPmxvbmdsaW5rX21mYy5uZm4gPCAyKSB7CiAJCS8qIE5vIG11bHRpLWZ1bmN0aW9uIGxpbmtzIGZvdW5kICovCiAJCXJldCA9IC1FTk9ERVY7CkBAIC0zMjIsNyArMzIyLDcgQEAKIAlyZWcuVmFsdWUgPSBDT1JfU09GVF9SRVNFVDsKIAlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKIAkJCQkJCSAgICZyZWcpOwotCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXMgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNhbkRpc2sgLSBDT1Igc3Jlc2V0IGZhaWxlZCAoJWQpXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCByZXMpOwogCQlnb3RvIGRvbmU7CkBAIC0zMzksNyArMzM5LDcgQEAKIAlyZWcuVmFsdWUgPSBDT1JfTEVWRUxfUkVRIHwgMHg4IHwgQ09SX0FERFJfREVDT0RFIHwgQ09SX0ZVTkNfRU5BOwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2FuRGlzayAtIENPUiBzcmVzZXQgZmFpbGVkICglZClcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIHJlcyk7CiAJCWdvdG8gZG9uZTsKQEAgLTM3NCw3ICszNzQsNyBAQAogCXJlZy5WYWx1ZSA9IDA7CiAJcmVzID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3X3ByaXYtPmxpbmssCiAJCQkJCQkgICAmcmVnKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfY29yX3NyZXNldCBmYWlsZWQgMSAoJWQpXG4iLAogCQkgICAgICAgcmVzKTsKIAkJcmV0dXJuOwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJcmVnLlZhbHVlIHw9IENPUl9TT0ZUX1JFU0VUOwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2Nvcl9zcmVzZXQgZmFpbGVkIDIgKCVkKVxuIiwKIAkJICAgICAgIHJlcyk7CiAJCXJldHVybjsKQEAgLTM5OSw3ICszOTksNyBAQAogCQlyZWcuVmFsdWUgfD0gQ09SX0lSRVFfRU5BOwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2Nvcl9zcmVzZXQgZmFpbGVkIDMgKCVkKVxuIiwKIAkJICAgICAgIHJlcyk7CiAJCXJldHVybjsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCXJlZy5WYWx1ZSA9IDA7CiAJcmVzID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3X3ByaXYtPmxpbmssCiAJCQkJCQkgICAmcmVnKTsKLQlpZiAocmVzICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAocmVzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInByaXNtMl9wY2NhcmRfZ2VuZXNpc19zcmVzZXQgZmFpbGVkIDEgIgogCQkgICAgICAgIiglZClcbiIsIHJlcyk7CiAJCXJldHVybjsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCXJlZy5WYWx1ZSB8PSBDT1JfU09GVF9SRVNFVDsKIAlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHdfcHJpdi0+bGluaywKIAkJCQkJCSAgICZyZWcpOwotCWlmIChyZXMgIT0gQ1NfU1VDQ0VTUykgeworCWlmIChyZXMgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAicHJpc20yX3BjY2FyZF9nZW5lc2lzX3NyZXNldCBmYWlsZWQgMiAiCiAJCSAgICAgICAiKCVkKVxuIiwgcmVzKTsKIAkJcmV0dXJuOwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJcmVnLk9mZnNldCA9IENJU1JFR19DQ1NSOwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0IGZhaWxlZCAzICIKIAkJICAgICAgICIoJWQpXG4iLCByZXMpOwogCQlyZXR1cm47CkBAIC00NzIsNyArNDcyLDcgQEAKIAlyZWcuVmFsdWUgPSBvbGRfY29yICYgfkNPUl9TT0ZUX1JFU0VUOwogCXJlcyA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihod19wcml2LT5saW5rLAogCQkJCQkJICAgJnJlZyk7Ci0JaWYgKHJlcyAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHJlcyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJwcmlzbTJfcGNjYXJkX2dlbmVzaXNfc3Jlc2V0IGZhaWxlZCA0ICIKIAkJICAgICAgICIoJWQpXG4iLCByZXMpOwogCQlyZXR1cm47CkBAIC01MzIsMTQ1ICs1MzIsMTE4IEBACiAjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKIGRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQ0ZHX0NIRUNLMihmbiwgcmV0ZikgXAotZG8geyBpbnQgX3JldCA9IChyZXRmKTsgXAotaWYgKF9yZXQgIT0gMCkgeyBcCi0JUERFQlVHKERFQlVHX0VYVFJBLCAiQ2FyZFNlcnZpY2VzKCIgI2ZuICIpIHJldHVybmVkICVkXG4iLCBfcmV0KTsgXAotCWNzX2Vycm9yKGxpbmssIGZuLCBfcmV0KTsgXAotCWdvdG8gbmV4dF9lbnRyeTsgXAotfSBcCi19IHdoaWxlICgwKQotCiAKIC8qIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzIHJlY2VpdmVkIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBCiAgKiBzb2NrZXQgYW5kIG1ha2UgdGhlIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbSAqLworCitzdGF0aWMgaW50IHByaXNtMl9jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZywKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCWlmIChjZmctPmluZGV4ID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJUERFQlVHKERFQlVHX0VYVFJBLCAiQ2hlY2tpbmcgQ0ZUQUJMRV9FTlRSWSAweCUwMlggIgorCSAgICAgICAiKGRlZmF1bHQgMHglMDJYKVxuIiwgY2ZnLT5pbmRleCwgZGZsdC0+aW5kZXgpOworCisJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCXBfZGV2LT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCX0KKworCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8KKwkJICAgIDEwMDAwICYmICFpZ25vcmVfY2lzX3ZjYykgeworCQkJUERFQlVHKERFQlVHX0VYVFJBLCAiICBWY2MgbWlzbWF0Y2ggLSBza2lwcGluZyIKKwkJCSAgICAgICAiIHRoaXMgZW50cnlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgaWYgKGRmbHQtPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gZGZsdC0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvCisJCSAgICAxMDAwMCAmJiAhaWdub3JlX2Npc192Y2MpIHsKKwkJCVBERUJVRyhERUJVR19FWFRSQSwgIiAgVmNjIChkZWZhdWx0KSBtaXNtYXRjaCAiCisJCQkgICAgICAgIi0gc2tpcHBpbmcgdGhpcyBlbnRyeVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0gY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCWVsc2UgaWYgKGRmbHQtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0gZGZsdC0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKworCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LT5pcnEuSVJRSW5mbzEpCisJCXBfZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCWVsc2UgaWYgKCEocF9kZXYtPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkpIHsKKwkJLyogQXQgbGVhc3QgQ29tcGFxIFdMMjAwIGRvZXMgbm90IGhhdmUgSVJRSW5mbzEgc2V0LAorCQkgKiBidXQgaXQgZG9lcyBub3Qgd29yayB3aXRob3V0IGludGVycnVwdHMuLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb25maWcgaGFzIG5vIElSUSBpbmZvLCBidXQgdHJ5aW5nIHRvICIKKwkJICAgICAgICJlbmFibGUgSVJRIGFueXdheS4uXG4iKTsKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJfQorCisJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJUERFQlVHKERFQlVHX0VYVFJBLCAiSU8gd2luZG93IHNldHRpbmdzOiBjZmctPmlvLm53aW49JWQgIgorCSAgICAgICAiZGZsdC0+aW8ubndpbj0lZFxuIiwKKwkgICAgICAgY2ZnLT5pby5ud2luLCBkZmx0LT5pby5ud2luKTsKKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQlQREVCVUcoREVCVUdfRVhUUkEsICJpby0+ZmxhZ3MgPSAweCUwNFgsICIKKwkJICAgICAgICJpby5iYXNlPTB4JTA0eCwgbGVuPSVkXG4iLCBpby0+ZmxhZ3MsCisJCSAgICAgICBpby0+d2luWzBdLmJhc2UsIGlvLT53aW5bMF0ubGVuKTsKKwkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmCisJCQlDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczIgPSBwX2Rldi0+aW8uQXR0cmlidXRlczE7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJcF9kZXYtPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQl9CisJfQorCisJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworfQorCiBzdGF0aWMgaW50IHByaXNtMl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaG9zdGFwX2ludGVyZmFjZSAqaWZhY2U7CiAJbG9jYWxfaW5mb190ICpsb2NhbDsKIAlpbnQgcmV0ID0gMTsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgKnBhcnNlOwogCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKLQl1X2NoYXIgYnVmWzY0XTsKLQljb25maWdfaW5mb190IGNvbmY7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CiAJc3RydWN0IGhvc3RhcF9jc19wcml2ICpod19wcml2OwogCiAJUERFQlVHKERFQlVHX0ZMT1csICJwcmlzbTJfY29uZmlnKClcbiIpOwogCi0JcGFyc2UgPSBrbWFsbG9jKHNpemVvZihjaXNwYXJzZV90KSwgR0ZQX0tFUk5FTCk7CiAJaHdfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpod19wcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhcnNlID09IE5VTEwgfHwgaHdfcHJpdiA9PSBOVUxMKSB7CisJaWYgKGh3X3ByaXYgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCi0JQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCi0JCSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZikpOwotCiAJLyogTG9vayBmb3IgYW4gYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyeSBpbiB0aGUgQ0lTICovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlmb3IgKDs7KSB7Ci0JCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UtPmNmdGFibGVfZW50cnkpOwotCQlDRkdfQ0hFQ0syKEdldFR1cGxlRGF0YSwKLQkJCSAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQkJQ0ZHX0NIRUNLMihQYXJzZVR1cGxlLAotCQkJICAgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgcGFyc2UpKTsKLQotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0JCQlkZmx0ID0gKmNmZzsKLQkJaWYgKGNmZy0+aW5kZXggPT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JCVBERUJVRyhERUJVR19FWFRSQSwgIkNoZWNraW5nIENGVEFCTEVfRU5UUlkgMHglMDJYICIKLQkJICAgICAgICIoZGVmYXVsdCAweCUwMlgpXG4iLCBjZmctPmluZGV4LCBkZmx0LmluZGV4KTsKLQotCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KLQkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgewotCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7Ci0JCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotCQl9Ci0KLQkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCi0JCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJaWYgKGNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvCi0JCQkgICAgMTAwMDAgJiYgIWlnbm9yZV9jaXNfdmNjKSB7Ci0JCQkJUERFQlVHKERFQlVHX0VYVFJBLCAiICBWY2MgbWlzbWF0Y2ggLSBza2lwcGluZyIKLQkJCQkgICAgICAgIiB0aGlzIGVudHJ5XG4iKTsKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJaWYgKGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvCi0JCQkgICAgMTAwMDAgJiYgIWlnbm9yZV9jaXNfdmNjKSB7Ci0JCQkJUERFQlVHKERFQlVHX0VYVFJBLCAiICBWY2MgKGRlZmF1bHQpIG1pc21hdGNoICIKLQkJCQkgICAgICAgIi0gc2tpcHBpbmcgdGhpcyBlbnRyeVxuIik7Ci0JCQkJZ290byBuZXh0X2VudHJ5OwotCQkJfQotCQl9Ci0KLQkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLQkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkJZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCi0JCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwotCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCi0JCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCQllbHNlIGlmICghKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkpIHsKLQkJCS8qIEF0IGxlYXN0IENvbXBhcSBXTDIwMCBkb2VzIG5vdCBoYXZlIElSUUluZm8xIHNldCwKLQkJCSAqIGJ1dCBpdCBkb2VzIG5vdCB3b3JrIHdpdGhvdXQgaW50ZXJydXB0cy4uICovCi0JCQlwcmludGsoIkNvbmZpZyBoYXMgbm8gSVJRIGluZm8sIGJ1dCB0cnlpbmcgdG8gZW5hYmxlICIKLQkJCSAgICAgICAiSVJRIGFueXdheS4uXG4iKTsKLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0JCX0KLQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQkJUERFQlVHKERFQlVHX0VYVFJBLCAiSU8gd2luZG93IHNldHRpbmdzOiBjZmctPmlvLm53aW49JWQgIgotCQkgICAgICAgImRmbHQuaW8ubndpbj0lZFxuIiwKLQkJICAgICAgIGNmZy0+aW8ubndpbiwgZGZsdC5pby5ud2luKTsKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlQREVCVUcoREVCVUdfRVhUUkEsICJpby0+ZmxhZ3MgPSAweCUwNFgsICIKLQkJCSAgICAgICAiaW8uYmFzZT0weCUwNHgsIGxlbj0lZFxuIiwgaW8tPmZsYWdzLAotCQkJICAgICAgIGlvLT53aW5bMF0uYmFzZSwgaW8tPndpblswXS5sZW4pOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJgotCQkJCUNJU1RQTF9JT19MSU5FU19NQVNLOwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlDRkdfQ0hFQ0syKFJlcXVlc3RJTywKLQkJCSAgIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwotCi0JCS8qIFRoaXMgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyeSBpcyBPSyAqLwotCQlicmVhazsKLQotCW5leHRfZW50cnk6Ci0JCUNTX0NIRUNLKEdldE5leHRUdXBsZSwKLQkJCSBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKSk7CisJbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgcHJpc20yX2NvbmZpZ19jaGVjaywgTlVMTCk7CisJaWYgKGxhc3RfcmV0KSB7CisJCWlmICghaWdub3JlX2Npc192Y2MpCisJCQlwcmludGsoS0VSTl9FUlIgIkdldE5leHRUdXBsZSgpOiBObyBtYXRjaGluZyAiCisJCQkgICAgICAgIkNJUyBjb25maWd1cmF0aW9uLiAgTWF5YmUgeW91IG5lZWQgdGhlICIKKwkJCSAgICAgICAiaWdub3JlX2Npc192Y2M9MSBwYXJhbWV0ZXIuXG4iKTsKKwkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBsYXN0X3JldCk7CisJCWdvdG8gZmFpbGVkOwogCX0KIAogCS8qIE5lZWQgdG8gYWxsb2NhdGUgbmV0X2RldmljZSBiZWZvcmUgcmVxdWVzdGluZyBJUlEgaGFuZGxlciAqLwpAQCAtNzM4LDE0ICs3MTEsMTIgQEAKIAkJaWYgKHJldCA9PSAwICYmIGxvY2FsLT5kZGV2KQogCQkJc3RyY3B5KGh3X3ByaXYtPm5vZGUuZGV2X25hbWUsIGxvY2FsLT5kZGV2LT5uYW1lKTsKIAl9Ci0Ja2ZyZWUocGFyc2UpOwogCXJldHVybiByZXQ7CiAKICBjc19mYWlsZWQ6CiAJY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwogCiAgZmFpbGVkOgotCWtmcmVlKHBhcnNlKTsKIAlrZnJlZShod19wcml2KTsKIAlwcmlzbTJfcmVsZWFzZSgodV9sb25nKWxpbmspOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggMTlhNDAxYy4uYmNhNzQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtMjExLDcgKzIxMSw3IEBACiBkbyB7IFwKIAlpZiAoaXB3MjEwMF9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIHsgXAogCQlwcmludGsoS0VSTl9ERUJVRyAiaXB3MjEwMDogJWMgJXMgIiwgXAotICAgICAgICAgICAgICAgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgIF9fRlVOQ1RJT05fXyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsICBfX2Z1bmNfXyk7IFwKIAkJcHJpbnRrKG1lc3NhZ2UpOyBcCiAJfSBcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCmluZGV4IGQ0YWIyOGIuLjBiYWQxZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmgKQEAgLTEzOTQsMTMgKzEzOTQsMTMgQEAKICNkZWZpbmUgSVBXX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIGRvIHsgaWYgKGlwd19kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKICAgcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUiOiAlYyAlcyAiIGZtdCwgXAotICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCiAKICNpZmRlZiBDT05GSUdfSVBXMjIwMF9ERUJVRwogI2RlZmluZSBJUFdfTExfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAogZG8geyBpZiAoaXB3X2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAogICBwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSI6ICVjICVzICIgZm10LCBcCi0gICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIElQV19MTF9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgkJCQkvKiBDT05GSUdfSVBXMjIwMF9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1kZWJ1Zy5oCmluZGV4IGYxZDAwMmYuLjMzMDE2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWRlYnVnLmgKQEAgLTM0LDEyICszNCwxMiBAQAogI2RlZmluZSBJV0xfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAogZG8geyBpZiAoaXdsMzk0NV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKICAgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FIjogJWMgJXMgIiBmbXQsIFwKLQkgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorCSBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBJV0xfREVCVUdfTElNSVQobGV2ZWwsIGZtdCwgYXJncy4uLikgXAogZG8geyBpZiAoKGl3bDM5NDVfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSAmJiBuZXRfcmF0ZWxpbWl0KCkpIFwKICAgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FIjogJWMgJXMgIiBmbXQsIFwKLQkgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorCSBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSB2b2lkIGl3bDM5NDVfcHJpbnRfaGV4X2R1bXAoaW50IGxldmVsLCB2b2lkICpwLCB1MzIgbGVuKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1pby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1pby5oCmluZGV4IDBiOTQ3NTEuLmIzZmU0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LWlvLmgKQEAgLTU5LDcgKzU5LDcgQEAKICAqCiAgKi8KIAotI2RlZmluZSBfaXdsMzk0NV93cml0ZTMyKHByaXYsIG9mcywgdmFsKSB3cml0ZWwoKHZhbCksIChwcml2KS0+aHdfYmFzZSArIChvZnMpKQorI2RlZmluZSBfaXdsMzk0NV93cml0ZTMyKHByaXYsIG9mcywgdmFsKSBpb3dyaXRlMzIoKHZhbCksIChwcml2KS0+aHdfYmFzZSArIChvZnMpKQogI2lmZGVmIENPTkZJR19JV0wzOTQ1X0RFQlVHCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pd2wzOTQ1X3dyaXRlMzIoY29uc3QgY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpd2wzOTQ1X3ByaXYgKnByaXYsCiAJCQkJIHUzMiBvZnMsIHUzMiB2YWwpCkBAIC03MywxNCArNzMsMTQgQEAKICNkZWZpbmUgaXdsMzk0NV93cml0ZTMyKHByaXYsIG9mcywgdmFsKSBfaXdsMzk0NV93cml0ZTMyKHByaXYsIG9mcywgdmFsKQogI2VuZGlmCiAKLSNkZWZpbmUgX2l3bDM5NDVfcmVhZDMyKHByaXYsIG9mcykgcmVhZGwoKHByaXYpLT5od19iYXNlICsgKG9mcykpCisjZGVmaW5lIF9pd2wzOTQ1X3JlYWQzMihwcml2LCBvZnMpIGlvcmVhZDMyKChwcml2KS0+aHdfYmFzZSArIChvZnMpKQogI2lmZGVmIENPTkZJR19JV0wzOTQ1X0RFQlVHCiBzdGF0aWMgaW5saW5lIHUzMiBfX2l3bDM5NDVfcmVhZDMyKGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2LCB1MzIgb2ZzKQogewogCUlXTF9ERUJVR19JTygicmVhZF9kaXJlY3QzMigweCUwOFgpIC0gJXMgJWRcbiIsIG9mcywgZiwgbCk7CiAJcmV0dXJuIF9pd2wzOTQ1X3JlYWQzMihwcml2LCBvZnMpOwogfQotI2RlZmluZSBpd2wzOTQ1X3JlYWQzMihwcml2LCBvZnMpIF9faXdsMzk0NV9yZWFkMzIoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCBvZnMpCisjZGVmaW5lIGl3bDM5NDVfcmVhZDMyKHByaXYsIG9mcylfX2l3bDM5NDVfcmVhZDMyKF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgb2ZzKQogI2Vsc2UKICNkZWZpbmUgaXdsMzk0NV9yZWFkMzIocCwgbykgX2l3bDM5NDVfcmVhZDMyKHAsIG8pCiAjZW5kaWYKQEAgLTE1MywyOCArMTUzLDEwIEBACiBzdGF0aWMgaW5saW5lIGludCBfaXdsMzk0NV9ncmFiX25pY19hY2Nlc3Moc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwotCXUzMiBncF9jdGw7Ci0KICNpZmRlZiBDT05GSUdfSVdMMzk0NV9ERUJVRwogCWlmIChhdG9taWNfcmVhZCgmcHJpdi0+cmVzdHJpY3RfcmVmY250KSkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKLQlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX1NXLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfV0FSTklORygiV0FSTklORzogUmVxdWVzdGluZyBNQUMgYWNjZXNzIGR1cmluZyBSRktJTEwgIgotCQkJIndha2VzIHVwIE5JQ1xuIik7Ci0KLQkJLyogMTAgbXNlYyBhbGxvd3MgdGltZSBmb3IgTklDIHRvIGNvbXBsZXRlIGl0cyBkYXRhIHNhdmUgKi8KLQkJZ3BfY3RsID0gX2l3bDM5NDVfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCk7Ci0JCWlmIChncF9jdGwgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZKSB7Ci0JCQlJV0xfREVCVUdfUkZfS0lMTCgiV2FpdCBmb3IgY29tcGxldGUgcG93ZXItZG93biwgIgotCQkJCSJncGN0bCA9IDB4JTA4eFxuIiwgZ3BfY3RsKTsKLQkJCW1kZWxheSgxMCk7Ci0JCX0gZWxzZQotCQkJSVdMX0RFQlVHX1JGX0tJTEwoInBvd2VyLWRvd24gY29tcGxldGUsICIKLQkJCQkJICAiZ3BjdGwgPSAweCUwOHhcbiIsIGdwX2N0bCk7Ci0JfQotCiAJLyogdGhpcyBiaXQgd2FrZXMgdXAgdGhlIE5JQyAqLwogCV9pd2wzOTQ1X3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwogCXJldCA9IF9pd2wzOTQ1X3BvbGxfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtcnMuYwppbmRleCAxMGM2NGJkLi42ZmM1ZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LXJzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1ycy5jCkBAIC0zNiw4ICszNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAotI2luY2x1ZGUgIi4uL25ldC9tYWM4MDIxMS9yYXRlLmgiCi0KICNpbmNsdWRlICJpd2wtMzk0NS5oIgogCiAjZGVmaW5lIFJTX05BTUUgIml3bC0zOTQ1LXJzIgpAQCAtNjUsNiArNjMsOSBAQAogCXU4IGlic3Nfc3RhX2FkZGVkOwogCXN0cnVjdCB0aW1lcl9saXN0IHJhdGVfc2NhbGVfZmx1c2g7CiAJc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHdpbltJV0xfUkFURV9DT1VOVF07CisKKwkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCisJaW50IGxhc3RfdHhyYXRlX2lkeDsKIH07CiAKIHN0YXRpYyBzMzIgaXdsMzk0NV9leHBlY3RlZF90cHRfZ1tJV0xfUkFURV9DT1VOVF0gPSB7CkBAIC0zMTYsOSArMzE3LDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByc19yYXRlX2luaXQodm9pZCAqcHJpdl9yYXRlLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IHN0YV9pbmZvICpzdGEpCitzdGF0aWMgdm9pZCByc19yYXRlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEpCiB7CisJc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKIAlpbnQgaTsKIAogCUlXTF9ERUJVR19SQVRFKCJlbnRlclxuIik7CkBAIC0zMjksMjQgKzMzMSwyMiBAQAogCSAqIGFmdGVyIGFzc29jLi4gKi8KIAogCWZvciAoaSA9IElXTF9SQVRFX0NPVU5UIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHN0YS0+c3VwcF9yYXRlc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSAmICgxIDw8IGkpKSB7Ci0JCQlzdGEtPnR4cmF0ZV9pZHggPSBpOworCQlpZiAoc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXSAmICgxIDw8IGkpKSB7CisJCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCXN0YS0+bGFzdF90eHJhdGVfaWR4ID0gc3RhLT50eHJhdGVfaWR4OwotCiAJLyogRm9yIDUgR0h6IGJhbmQgaXQgc3RhcnQgYXQgSVdMX0ZJUlNUX09GRE1fUkFURSAqLwotCWlmIChsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXN0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7CisJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7CiAKIAlJV0xfREVCVUdfUkFURSgibGVhdmVcbiIpOwogfQogCi1zdGF0aWMgdm9pZCAqcnNfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCitzdGF0aWMgdm9pZCAqcnNfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXIpCiB7Ci0JcmV0dXJuIGxvY2FsLT5ody5wcml2OworCXJldHVybiBody0+cHJpdjsKIH0KIAogLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCkBAIC0zNTQsMTcgKzM1NCwyNCBAQAogewogCXJldHVybjsKIH0KKwogc3RhdGljIHZvaWQgcnNfY2xlYXIodm9pZCAqcHJpdikKIHsKIAlyZXR1cm47CiB9CiAKIAotc3RhdGljIHZvaWQgKnJzX2FsbG9jX3N0YSh2b2lkICpwcml2LCBnZnBfdCBnZnApCitzdGF0aWMgdm9pZCAqcnNfYWxsb2Nfc3RhKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YSA9ICh2b2lkICopIHN0YS0+ZHJ2X3ByaXY7CiAJaW50IGk7CiAKKwkvKgorCSAqIFhYWDogSWYgaXQncyB1c2luZyBzdGEtPmRydl9wcml2IGFueXdheSwgaXQgbWlnaHQKKwkgKglhcyB3ZWxsIGp1c3QgcHV0IGFsbCB0aGUgaW5mb3JtYXRpb24gdGhlcmUuCisJICovCisKIAlJV0xfREVCVUdfUkFURSgiZW50ZXJcbiIpOwogCiAJcnNfc3RhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bDM5NDVfcnNfc3RhKSwgZ2ZwKTsKQEAgLTM3Myw2ICszODAsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlwc3RhLT5yc19zdGEgPSByc19zdGE7CisKIAlzcGluX2xvY2tfaW5pdCgmcnNfc3RhLT5sb2NrKTsKIAogCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IElXTF9SQVRFX0lOVkFMSUQ7CkBAIC0zOTgsMTAgKzQwNywxNCBAQAogCXJldHVybiByc19zdGE7CiB9CiAKLXN0YXRpYyB2b2lkIHJzX2ZyZWVfc3RhKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKQorc3RhdGljIHZvaWQgcnNfZnJlZV9zdGEodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCXZvaWQgKnByaXZfc3RhKQogeworCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKIAlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSA9IHByaXZfc3RhOwogCisJcHN0YS0+cnNfc3RhID0gTlVMTDsKKwogCUlXTF9ERUJVR19SQVRFKCJlbnRlclxuIik7CiAJZGVsX3RpbWVyX3N5bmMoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCk7CiAJa2ZyZWUocnNfc3RhKTsKQEAgLTQ0MywyNiArNDU2LDE5IEBACiAgKiBOT1RFOiBVc2VzIGl3bDM5NDVfcHJpdi0+cmV0cnlfcmF0ZSBmb3IgdGhlICMgb2YgcmV0cmllcyBhdHRlbXB0ZWQgYnkKICAqIHRoZSBoYXJkd2FyZSBmb3IgZWFjaCByYXRlLgogICovCi1zdGF0aWMgdm9pZCByc190eF9zdGF0dXModm9pZCAqcHJpdl9yYXRlLAotCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCByc190eF9zdGF0dXModm9pZCAqcHJpdl9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXU4IHJldHJpZXMsIGN1cnJlbnRfY291bnQ7CiAJaW50IHNjYWxlX3JhdGVfaW5kZXgsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2wzOTQ1X3ByaXYgKilwcml2X3JhdGU7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSA9IHByaXZfc3RhOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCUlXTF9ERUJVR19SQVRFKCJlbnRlclxuIik7CiAKLQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07Ci0KLQogCXJldHJpZXMgPSBpbmZvLT5zdGF0dXMucmV0cnlfY291bnQ7CiAJZmlyc3RfaW5kZXggPSBzYmFuZC0+Yml0cmF0ZXNbaW5mby0+dHhfcmF0ZV9pZHhdLmh3X3ZhbHVlOwogCWlmICgoZmlyc3RfaW5kZXggPCAwKSB8fCAoZmlyc3RfaW5kZXggPj0gSVdMX1JBVEVfQ09VTlQpKSB7CkBAIC00NzAsMTcgKzQ3NiwxMSBAQAogCQlyZXR1cm47CiAJfQogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQlpZiAoIXN0YSB8fCAhc3RhLT5yYXRlX2N0cmxfcHJpdikgewotCQlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoIXByaXZfc3RhKSB7CiAJCUlXTF9ERUJVR19SQVRFKCJsZWF2ZTogTm8gU1RBIHByaXYgZGF0YSB0byB1cGRhdGUhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCXJzX3N0YSA9ICh2b2lkICopc3RhLT5yYXRlX2N0cmxfcHJpdjsKLQogCXJzX3N0YS0+dHhfcGFja2V0cysrOwogCiAJc2NhbGVfcmF0ZV9pbmRleCA9IGZpcnN0X2luZGV4OwpAQCAtNTQ3LDggKzU0Nyw2IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKIAotCXJjdV9yZWFkX3VubG9jaygpOwotCiAJSVdMX0RFQlVHX1JBVEUoImxlYXZlXG4iKTsKIAogCXJldHVybjsKQEAgLTYzMiwxNiArNjMwLDE1IEBACiAgKiByYXRlIHRhYmxlIGFuZCBtdXN0IHJlZmVyZW5jZSB0aGUgZHJpdmVyIGFsbG9jYXRlZCByYXRlIHRhYmxlCiAgKgogICovCi1zdGF0aWMgdm9pZCByc19nZXRfcmF0ZSh2b2lkICpwcml2X3JhdGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24gKnNlbCkKK3N0YXRpYyB2b2lkIHJzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKKwkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAqc2VsKQogewogCXU4IGxvdyA9IElXTF9SQVRFX0lOVkFMSUQ7CiAJdTggaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7CiAJdTE2IGhpZ2hfbG93OwogCWludCBpbmRleDsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSA9IHByaXZfc3RhOwogCXN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGVfZGF0YSAqd2luZG93ID0gTlVMTDsKIAlpbnQgY3VycmVudF90cHQgPSBJV0xfSU5WX1RQVDsKIAlpbnQgbG93X3RwdCA9IElXTF9JTlZfVFBUOwpAQCAtNjQ5LDQwICs2NDYsMzEgQEAKIAl1MzIgZmFpbF9jb3VudDsKIAlzOCBzY2FsZV9hY3Rpb24gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXUxNiBmYywgcmF0ZV9tYXNrOwotCXN0cnVjdCBpd2wzOTQ1X3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bDM5NDVfcHJpdiAqKXByaXZfcmF0ZTsKKwlzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2wzOTQ1X3ByaXYgKilwcml2X3I7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKIAlJV0xfREVCVUdfUkFURSgiZW50ZXJcbiIpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQogCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgZGF0YSB1c2luZyBsb3dlc3QKIAkgKiByYXRlLiAqLwogCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKIAlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICE9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHx8CiAJICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8Ci0JICAgICFzdGEgfHwgIXN0YS0+cmF0ZV9jdHJsX3ByaXYpIHsKKwkgICAgIXN0YSB8fCAhcHJpdl9zdGEpIHsKIAkJSVdMX0RFQlVHX1JBVEUoImxlYXZlOiBObyBTVEEgcHJpdiBkYXRhIHRvIHVwZGF0ZSFcbiIpOwotCQlzZWwtPnJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgobG9jYWwsIHNiYW5kLCBzdGEpOwotCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwogCQlyZXR1cm47CiAJfQogCiAJcmF0ZV9tYXNrID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKLQlpbmRleCA9IG1pbihzdGEtPmxhc3RfdHhyYXRlX2lkeCAmIDB4ZmZmZiwgSVdMX1JBVEVfQ09VTlQgLSAxKTsKKwlpbmRleCA9IG1pbihyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCAmIDB4ZmZmZiwgSVdMX1JBVEVfQ09VTlQgLSAxKTsKIAogCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQogCQlyYXRlX21hc2sgPSByYXRlX21hc2sgPDwgSVdMX0ZJUlNUX09GRE1fUkFURTsKIAotCXJzX3N0YSA9ICh2b2lkICopc3RhLT5yYXRlX2N0cmxfcHJpdjsKLQotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSAmJgorCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKIAkgICAgIXJzX3N0YS0+aWJzc19zdGFfYWRkZWQpIHsKIAkJdTggc3RhX2lkID0gaXdsMzk0NV9od19maW5kX3N0YXRpb24ocHJpdiwgaGRyLT5hZGRyMSk7CiAKQEAgLTgwMywxNyArNzkxLDEzIEBACiAKICBvdXQ6CiAKLQlzdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGluZGV4OworCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaW5kZXg7CiAJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXN0YS0+dHhyYXRlX2lkeCA9IHN0YS0+bGFzdF90eHJhdGVfaWR4IC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKKwkJc2VsLT5yYXRlX2lkeCA9IHJzX3N0YS0+bGFzdF90eHJhdGVfaWR4IC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKIAllbHNlCi0JCXN0YS0+dHhyYXRlX2lkeCA9IHN0YS0+bGFzdF90eHJhdGVfaWR4OwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNlbC0+cmF0ZV9pZHggPSByc19zdGEtPmxhc3RfdHhyYXRlX2lkeDsKIAogCUlXTF9ERUJVR19SQVRFKCJsZWF2ZTogJWRcbiIsIGluZGV4KTsKLQotCXNlbC0+cmF0ZV9pZHggPSBzdGEtPnR4cmF0ZV9pZHg7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc19vcHMgPSB7CkBAIC04MjksMTE0ICs4MTMsMjggQEAKIAkuZnJlZV9zdGEgPSByc19mcmVlX3N0YSwKIH07CiAKLWludCBpd2wzOTQ1X2ZpbGxfcnNfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqYnVmLCB1OCBzdGFfaWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Ci0Jc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGNvdW50ID0gMCwgaTsKLQl1MzIgc2FtcGxlcyA9IDAsIHN1Y2Nlc3MgPSAwLCBnb29kID0gMDsKLQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JdTMyIG1heF90aW1lID0gMDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwotCWlmICghc3RhIHx8ICFzdGEtPnJhdGVfY3RybF9wcml2KSB7Ci0JCWlmIChzdGEpCi0JCQlJV0xfREVCVUdfUkFURSgibGVhdmUgLSBubyBwcml2YXRlIHJhdGUgZGF0YSFcbiIpOwotCQllbHNlCi0JCQlJV0xfREVCVUdfUkFURSgibGVhdmUgLSBubyBzdGF0aW9uIVxuIik7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm4gc3ByaW50ZihidWYsICJzdGF0aW9uICVkIG5vdCBmb3VuZFxuIiwgc3RhX2lkKTsKLQl9Ci0KLQlyc19zdGEgPSAodm9pZCAqKXN0YS0+cmF0ZV9jdHJsX3ByaXY7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCWkgPSBJV0xfUkFURV81NE1fSU5ERVg7Ci0Jd2hpbGUgKDEpIHsKLQkJdTY0IG1hc2s7Ci0JCWludCBqOwotCi0JCWNvdW50ICs9Ci0JCSAgICBzcHJpbnRmKCZidWZbY291bnRdLCAiICUyZE1iczogIiwgaXdsMzk0NV9yYXRlc1tpXS5pZWVlIC8gMik7Ci0KLQkJbWFzayA9ICgxVUxMIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpOwotCQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfTUFYX1dJTkRPVzsgaisrLCBtYXNrID4+PSAxKQotCQkJYnVmW2NvdW50KytdID0KLQkJCSAgICAocnNfc3RhLT53aW5baV0uZGF0YSAmIG1hc2spID8gJzEnIDogJzAnOwotCi0JCXNhbXBsZXMgKz0gcnNfc3RhLT53aW5baV0uY291bnRlcjsKLQkJZ29vZCArPSByc19zdGEtPndpbltpXS5zdWNjZXNzX2NvdW50ZXI7Ci0JCXN1Y2Nlc3MgKz0gcnNfc3RhLT53aW5baV0uc3VjY2Vzc19jb3VudGVyICoKLQkJCQkJCWl3bDM5NDVfcmF0ZXNbaV0uaWVlZTsKLQotCQlpZiAocnNfc3RhLT53aW5baV0uc3RhbXApIHsKLQkJCWludCBkZWx0YSA9Ci0JCQkgICAgamlmZmllc190b19tc2Vjcyhub3cgLSByc19zdGEtPndpbltpXS5zdGFtcCk7Ci0KLQkJCWlmIChkZWx0YSA+IG1heF90aW1lKQotCQkJCW1heF90aW1lID0gZGVsdGE7Ci0KLQkJCWNvdW50ICs9IHNwcmludGYoJmJ1Zltjb3VudF0sICIlNWRtc1xuIiwgZGVsdGEpOwotCQl9IGVsc2UKLQkJCWJ1Zltjb3VudCsrXSA9ICdcbic7Ci0KLQkJaiA9IGl3bDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKGkpOwotCQlpZiAoaiA9PSBpKQotCQkJYnJlYWs7Ci0JCWkgPSBqOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCS8qIERpc3BsYXkgdGhlIGF2ZXJhZ2UgcmF0ZSBvZiBhbGwgc2FtcGxlcyB0YWtlbi4KLQkgKgotCSAqIE5PVEU6ICBXZSBtdWx0aXBsZSAjIG9mIHNhbXBsZXMgYnkgMiBzaW5jZSB0aGUgSUVFRSBtZWFzdXJlbWVudAotCSAqIGFkZGVkIGZyb20gaXdsMzk0NV9yYXRlcyBpcyBhY3R1YWxseSAyWCB0aGUgcmF0ZSAqLwotCWlmIChzYW1wbGVzKQotCQljb3VudCArPSBzcHJpbnRmKAotCQkJJmJ1Zltjb3VudF0sCi0JCQkiXG5BdmVyYWdlIHJhdGUgaXMgJTNkLiUwMmRNYnMgb3ZlciBsYXN0ICU0ZG1zXG4iCi0JCQkiJTNkJSUgc3VjY2VzcyAoJWQgZ29vZCBwYWNrZXRzIG92ZXIgJWQgdHJpZXMpXG4iLAotCQkJc3VjY2VzcyAvICgyICogc2FtcGxlcyksIChzdWNjZXNzICogNSAvIHNhbXBsZXMpICUgMTAsCi0JCQltYXhfdGltZSwgZ29vZCAqIDEwMCAvIHNhbXBsZXMsIGdvb2QsIHNhbXBsZXMpOwotCWVsc2UKLQkJY291bnQgKz0gc3ByaW50ZigmYnVmW2NvdW50XSwgIlxuQXZlcmFnZSByYXRlOiAwTWJzXG4iKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQogdm9pZCBpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgczMyIHN0YV9pZCkKIHsKIAlzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2ID0gaHctPnByaXY7CiAJczMyIHJzc2kgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CiAJc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGE7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YTsKIAogCUlXTF9ERUJVR19SQVRFKCJlbnRlclxuIik7CiAKLQlpZiAoIWxvY2FsLT5yYXRlX2N0cmwtPm9wcy0+bmFtZSB8fAotCSAgICBzdHJjbXAobG9jYWwtPnJhdGVfY3RybC0+b3BzLT5uYW1lLCBSU19OQU1FKSkgewotCQlJV0xfV0FSTklORygiaXdsLTM5NDUtcnMgbm90IHNlbGVjdGVkIGFzIHJhdGUgY29udHJvbCBhbGdvIVxuIik7Ci0JCUlXTF9ERUJVR19SQVRFKCJsZWF2ZSAtIG1hYzgwMjExIHBpY2tlZCB0aGUgd3JvbmcgUkMgYWxnby5cbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJcmN1X3JlYWRfbG9jaygpOwogCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0JaWYgKCFzdGEgfHwgIXN0YS0+cmF0ZV9jdHJsX3ByaXYpIHsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEoaHcsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKKwlwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKKwlpZiAoIXN0YSB8fCAhcHN0YSkgewogCQlJV0xfREVCVUdfUkFURSgibGVhdmUgLSBubyBwcml2YXRlIHJhdGUgZGF0YSFcbiIpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwogCX0KIAotCXJzX3N0YSA9ICh2b2lkICopc3RhLT5yYXRlX2N0cmxfcHJpdjsKKwlyc19zdGEgPSBwc3RhLT5yc19zdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUtcnMuaAppbmRleCBmMDg1ZDMzLi45OGIxN2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LXJzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS1ycy5oCkBAIC0xNzYsMTUgKzE3Niw2IEBACiB9CiAKIC8qKgotICogaXdsMzk0NV9maWxsX3JzX2luZm8gLSBGaWxsIGFuIG91dHB1dCB0ZXh0IGJ1ZmZlciB3aXRoIHRoZSByYXRlIHJlcHJlc2VudGF0aW9uCi0gKgotICogTk9URTogIFRoaXMgaXMgcHJvdmlkZWQgYXMgYSBxdWljayBtZWNoYW5pc20gZm9yIGEgdXNlciB0byB2aXN1YWxpemUKLSAqIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBhbmQgaXMgbm90IG1lYW50IHRvIGJlCi0gKiBwYXJzZWQgc29mdHdhcmUuCi0gKi8KLWV4dGVybiBpbnQgaXdsMzk0NV9maWxsX3JzX2luZm8oc3RydWN0IGllZWU4MDIxMV9odyAqLCBjaGFyICpidWYsIHU4IHN0YV9pZCk7Ci0KLS8qKgogICogaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQgLSBJbml0aWFsaXplIHRoZSByYXRlIHNjYWxlIHRhYmxlIGJhc2VkIG9uIGFzc29jIGluZm8KICAqCiAgKiBUaGUgc3BlY2lmaWMgdGhyb3VnaHB1dCB0YWJsZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5ldHdvcmsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYwppbmRleCAzZjUxZjM2Li43Y2E1NjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5jCkBAIC01MjAsMTAgKzUyMCwxMCBAQAogCS8qIEZpbHRlciBpbmNvbWluZyBwYWNrZXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSB0YXJnZXRlZCB0b3dhcmQKIAkgKiB0aGlzIG5ldHdvcmssIGRpc2NhcmRpbmcgcGFja2V0cyBjb21pbmcgZnJvbSBvdXJzZWx2ZXMgKi8KIAlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6IC8qIEhlYWRlcjogRGVzdC4gfCBTb3VyY2UgICAgfCBCU1NJRCAqLworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6IC8qIEhlYWRlcjogRGVzdC4gfCBTb3VyY2UgICAgfCBCU1NJRCAqLwogCQkvKiBwYWNrZXRzIHRvIG91ciBJQlNTIHVwZGF0ZSBpbmZvcm1hdGlvbiAqLwogCQlyZXR1cm4gIWNvbXBhcmVfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIzLCBwcml2LT5ic3NpZCk7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6IC8qIEhlYWRlcjogRGVzdC4gfCBBUHtCU1NJRH0gfCBTb3VyY2UgKi8KKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046IC8qIEhlYWRlcjogRGVzdC4gfCBBUHtCU1NJRH0gfCBTb3VyY2UgKi8KIAkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KIAkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMiwgcHJpdi0+YnNzaWQpOwogCWRlZmF1bHQ6CkBAIC01MzEsOTkgKzUzMSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2FkZF9yYWRpb3RhcChzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSBzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9oZHIgKnJ4X2hkciwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQotewotCS8qIEZpcnN0IGNhY2hlIGFueSBpbmZvcm1hdGlvbiB3ZSBuZWVkIGJlZm9yZSB3ZSBvdmVyd3JpdGUKLQkgKiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIHNrYiBmcm9tIHRoZSBoYXJkd2FyZSAqLwotCXM4IHNpZ25hbCA9IHN0YXRzLT5zaWduYWw7Ci0Jczggbm9pc2UgPSAwOwotCWludCByYXRlID0gc3RhdHMtPnJhdGVfaWR4OwotCXU2NCB0c2YgPSBzdGF0cy0+bWFjdGltZTsKLQlfX2xlMTYgcGh5X2ZsYWdzX2h3ID0gcnhfaGRyLT5waHlfZmxhZ3MsIGFudGVubmE7Ci0KLQlzdHJ1Y3QgaXdsMzk0NV9ydF9yeF9oZHIgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBydF9oZHI7Ci0JCV9fbGU2NCBydF90c2Y7CQkvKiBUU0YgKi8KLQkJdTggcnRfZmxhZ3M7CQkvKiByYWRpb3RhcCBwYWNrZXQgZmxhZ3MgKi8KLQkJdTggcnRfcmF0ZTsJCS8qIHJhdGUgaW4gNTAwa2IvcyAqLwotCQlfX2xlMTYgcnRfY2hhbm5lbE1IejsJLyogY2hhbm5lbCBpbiBNSHogKi8KLQkJX19sZTE2IHJ0X2NoYml0bWFzazsJLyogY2hhbm5lbCBiaXRmaWVsZCAqLwotCQlzOCBydF9kYm1zaWduYWw7CS8qIHNpZ25hbCBpbiBkQm0sIGtsdWdlZCB0byBzaWduZWQgKi8KLQkJczggcnRfZGJtbm9pc2U7Ci0JCXU4IHJ0X2FudGVubmE7CQkvKiBhbnRlbm5hIG51bWJlciAqLwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICppd2wzOTQ1X3J0OwotCi0JaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgc2l6ZW9mKCppd2wzOTQ1X3J0KSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJub3QgZW5vdWdoIGhlYWRyb29tIFslZF0gZm9yICIKLQkJCSAgICAgICAicmFkaW90YXAgaGVhZCBbJXpkXVxuIiwKLQkJCSAgICAgICBza2JfaGVhZHJvb20oc2tiKSwgc2l6ZW9mKCppd2wzOTQ1X3J0KSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBwdXQgcmFkaW90YXAgaGVhZGVyIGluIGZyb250IG9mIDgwMi4xMSBoZWFkZXIgYW5kIGRhdGEgKi8KLQlpd2wzOTQ1X3J0ID0gKHZvaWQgKilza2JfcHVzaChza2IsIHNpemVvZigqaXdsMzk0NV9ydCkpOwotCi0JLyogaW5pdGlhbGlzZSByYWRpb3RhcCBoZWFkZXIgKi8KLQlpd2wzOTQ1X3J0LT5ydF9oZHIuaXRfdmVyc2lvbiA9IFBLVEhEUl9SQURJT1RBUF9WRVJTSU9OOwotCWl3bDM5NDVfcnQtPnJ0X2hkci5pdF9wYWQgPSAwOwotCi0JLyogdG90YWwgaGVhZGVyICsgZGF0YSAqLwotCXB1dF91bmFsaWduZWRfbGUxNihzaXplb2YoKml3bDM5NDVfcnQpLCAmaXdsMzk0NV9ydC0+cnRfaGRyLml0X2xlbik7Ci0KLQkvKiBJbmRpY2F0ZSBhbGwgdGhlIGZpZWxkcyB3ZSBhZGQgdG8gdGhlIHJhZGlvdGFwIGhlYWRlciAqLwotCXB1dF91bmFsaWduZWRfbGUzMigoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkgfAotCQkJICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8Ci0JCQkgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgfAotCQkJICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwpIHwKLQkJCSAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMKSB8Ci0JCQkgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFKSB8Ci0JCQkgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSksCi0JCQkmaXdsMzk0NV9ydC0+cnRfaGRyLml0X3ByZXNlbnQpOwotCi0JLyogWmVybyB0aGUgZmxhZ3MsIHdlJ2xsIGFkZCB0byB0aGVtIGFzIHdlIGdvICovCi0JaXdsMzk0NV9ydC0+cnRfZmxhZ3MgPSAwOwotCi0JcHV0X3VuYWxpZ25lZF9sZTY0KHRzZiwgJml3bDM5NDVfcnQtPnJ0X3RzZik7Ci0KLQlpd2wzOTQ1X3J0LT5ydF9kYm1zaWduYWwgPSBzaWduYWw7Ci0JaXdsMzk0NV9ydC0+cnRfZGJtbm9pc2UgPSBub2lzZTsKLQotCS8qIENvbnZlcnQgdGhlIGNoYW5uZWwgZnJlcXVlbmN5IGFuZCBzZXQgdGhlIGZsYWdzICovCi0JcHV0X3VuYWxpZ25lZF9sZTE2KHN0YXRzLT5mcmVxLCAmaXdsMzk0NV9ydC0+cnRfY2hhbm5lbE1Ieik7Ci0JaWYgKCEocGh5X2ZsYWdzX2h3ICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykpCi0JCXB1dF91bmFsaWduZWRfbGUxNihJRUVFODAyMTFfQ0hBTl9PRkRNIHwgSUVFRTgwMjExX0NIQU5fNUdIWiwKLQkJCSAgICAgICZpd2wzOTQ1X3J0LT5ydF9jaGJpdG1hc2spOwotCWVsc2UgaWYgKHBoeV9mbGFnc19odyAmIFJYX1JFU19QSFlfRkxBR1NfTU9EX0NDS19NU0spCi0JCXB1dF91bmFsaWduZWRfbGUxNihJRUVFODAyMTFfQ0hBTl9DQ0sgfCBJRUVFODAyMTFfQ0hBTl8yR0haLAotCQkJICAgICAgJml3bDM5NDVfcnQtPnJ0X2NoYml0bWFzayk7Ci0JZWxzZQkvKiA4MDIuMTFnICovCi0JCXB1dF91bmFsaWduZWRfbGUxNihJRUVFODAyMTFfQ0hBTl9PRkRNIHwgSUVFRTgwMjExX0NIQU5fMkdIWiwKLQkJCSAgICAgICZpd2wzOTQ1X3J0LT5ydF9jaGJpdG1hc2spOwotCi0JaWYgKHJhdGUgPT0gLTEpCi0JCWl3bDM5NDVfcnQtPnJ0X3JhdGUgPSAwOwotCWVsc2UgewotCQlpZiAoc3RhdHMtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXJhdGUgKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCQlpd2wzOTQ1X3J0LT5ydF9yYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlXS5pZWVlOwotCX0KLQotCS8qIGFudGVubmEgbnVtYmVyICovCi0JYW50ZW5uYSA9IHBoeV9mbGFnc19odyAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0s7Ci0JaXdsMzk0NV9ydC0+cnRfYW50ZW5uYSA9IGxlMTZfdG9fY3B1KGFudGVubmEpID4+IDQ7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgd2UgaGF2ZSBpdCAqLwotCWlmIChwaHlfZmxhZ3NfaHcgJiBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSykKLQkJaXdsMzk0NV9ydC0+cnRfZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX0ZfU0hPUlRQUkU7Ci0KLQlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX1JBRElPVEFQOwotfQotCiBzdGF0aWMgdm9pZCBpd2wzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHN0cnVjdCBpd2wzOTQ1X3ByaXYgKnByaXYsCiAJCQkJICAgc3RydWN0IGl3bDM5NDVfcnhfbWVtX2J1ZmZlciAqcnhiLAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKQEAgLTY1Nyw5ICs1NjQsNiBAQAogCQlpd2wzOTQ1X3NldF9kZWNyeXB0ZWRfZmxhZyhwcml2LCByeGItPnNrYiwKIAkJCQkgICAgICAgbGUzMl90b19jcHUocnhfZW5kLT5zdGF0dXMpLCBzdGF0cyk7CiAKLQlpZiAocHJpdi0+YWRkX3JhZGlvdGFwKQotCQlpd2wzOTQ1X2FkZF9yYWRpb3RhcChwcml2LCByeGItPnNrYiwgcnhfaGRyLCBzdGF0cyk7Ci0KICNpZmRlZiBDT05GSUdfSVdMMzk0NV9MRURTCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCXByaXYtPnJ4dHhwYWNrZXRzICs9IGxlbjsKQEAgLTY4NCw3ICs1ODgsNiBAQAogCXUxNiByeF9zdGF0c19ub2lzZV9kaWZmID0gbGUxNl90b19jcHUocnhfc3RhdHMtPm5vaXNlX2RpZmYpOwogCXU4IG5ldHdvcmtfcGFja2V0OwogCi0Jcnhfc3RhdHVzLmFudGVubmEgPSAwOwogCXJ4X3N0YXR1cy5mbGFnID0gMDsKIAlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKIAlyeF9zdGF0dXMuZnJlcSA9CkBAIC02OTYsNiArNTk5LDEzIEBACiAJaWYgKHJ4X3N0YXR1cy5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCiAJCXJ4X3N0YXR1cy5yYXRlX2lkeCAtPSBJV0xfRklSU1RfT0ZETV9SQVRFOwogCisJcnhfc3RhdHVzLmFudGVubmEgPSBsZTE2X3RvX2NwdShyeF9oZHItPnBoeV9mbGFncyAmCisJCQkJCVJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+IDQ7CisKKwkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocnhfaGRyLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSykKKwkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKKwogCWlmICgodW5saWtlbHkocnhfc3RhdHMtPnBoeV9jb3VudCA+IDIwKSkpIHsKIAkJSVdMX0RFQlVHX0RST1AKIAkJICAgICgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogIgpAQCAtNzcxLDEwMCArNjgxLDcgQEAKIAkJcHJpdi0+bGFzdF9yeF9ub2lzZSA9IHJ4X3N0YXR1cy5ub2lzZTsKIAl9CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKSB7Ci0JCWl3bDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEocHJpdiwgcnhiLCAmcnhfc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAobGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfTUdNVDoKLQkJc3dpdGNoIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2NvbnRyb2wpICYKLQkJCUlFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjp7Ci0JCQkJLyogSWYgdGhpcyBpcyBhIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmb3IKLQkJCQkgKiBvdXIgbmV0d29yayB0aGVuIGNhY2hlIHRoZSBiZWFjb24KLQkJCQkgKiB0aW1lc3RhbXAgKi8KLQkJCQlpZiAoKCgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpCi0JCQkJICAgICAgJiYgIWNvbXBhcmVfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIyLAotCQkJCQkJCSAgICAgcHJpdi0+YnNzaWQpKSB8fAotCQkJCSAgICAgKChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCi0JCQkJICAgICAgJiYgIWNvbXBhcmVfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIzLAotCQkJCQkJCSAgICAgcHJpdi0+YnNzaWQpKSkpIHsKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0KLQkJCQkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKiloZWFkZXI7Ci0JCQkJCV9fbGUzMiAqcG9zOwotCQkJCQlwb3MgPSAoX19sZTMyICopJm1nbXQtPnUuYmVhY29uLgotCQkJCQkgICAgdGltZXN0YW1wOwotCQkJCQlwcml2LT50aW1lc3RhbXAwID0gbGUzMl90b19jcHUocG9zWzBdKTsKLQkJCQkJcHJpdi0+dGltZXN0YW1wMSA9IGxlMzJfdG9fY3B1KHBvc1sxXSk7Ci0JCQkJCXByaXYtPmJlYWNvbl9pbnQgPSBsZTE2X3RvX2NwdSgKLQkJCQkJICAgIG1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCQkJCQlpZiAocHJpdi0+Y2FsbF9wb3N0X2Fzc29jX2Zyb21fYmVhY29uICYmCi0JCQkJCSAgICAocHJpdi0+aXdfbW9kZSA9PQotCQkJCQkJSUVFRTgwMjExX0lGX1RZUEVfU1RBKSkKLQkJCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkJICAgICZwcml2LT5wb3N0X2Fzc29jaWF0ZS53b3JrKTsKLQotCQkJCQlwcml2LT5jYWxsX3Bvc3RfYXNzb2NfZnJvbV9iZWFjb24gPSAwOwotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDVElPTjoKLQkJCS8qIFRPRE86IFBhcnNlIDgwMi4xMWggZnJhbWVzIGZvciBDU0EuLi4gKi8KLQkJCWJyZWFrOwotCi0JCQkvKgotCQkJICogVE9ETzogVXNlIHRoZSBuZXcgY2FsbGJhY2sgZnVuY3Rpb24gZnJvbQotCQkJICogbWFjODAyMTEgaW5zdGVhZCBvZiBzbmlmZmluZyB0aGVzZSBwYWNrZXRzLgotCQkJICovCi0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDp7Ci0JCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ250ID0KLQkJCQkgICAgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWhlYWRlcjsKLQotCQkJCS8qIFdlIGhhdmUganVzdCBhc3NvY2lhdGVkLCBnaXZlIHNvbWUKLQkJCQkgKiB0aW1lIGZvciB0aGUgNC13YXkgaGFuZHNoYWtlIGlmCi0JCQkJICogYW55LiBEb24ndCBzdGFydCBzY2FuIHRvbyBlYXJseS4gKi8KLQkJCQlwcml2LT5uZXh0X3NjYW5famlmZmllcyA9IGppZmZpZXMgKwotCQkJCQlJV0xfREVMQVlfTkVYVF9TQ0FOX0FGVEVSX0FTU09DOwotCi0JCQkJcHJpdi0+YXNzb2NfaWQgPSAofigoMSA8PCAxNSkgfCAoMSA8PCAxNCkpICYKLQkJCQkJCSAgbGUxNl90b19jcHUobWdudC0+dS4KLQkJCQkJCQkgICAgICBhc3NvY19yZXNwLmFpZCkpOwotCQkJCXByaXYtPmFzc29jX2NhcGFiaWxpdHkgPQotCQkJCSAgICBsZTE2X3RvX2NwdShtZ250LT51LmFzc29jX3Jlc3AuY2FwYWJfaW5mbyk7Ci0JCQkJaWYgKHByaXYtPmJlYWNvbl9pbnQpCi0JCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkgICAgJnByaXYtPnBvc3RfYXNzb2NpYXRlLndvcmspOwotCQkJCWVsc2UKLQkJCQkJcHJpdi0+Y2FsbF9wb3N0X2Fzc29jX2Zyb21fYmVhY29uID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6ewotCQkJCURFQ0xBUkVfTUFDX0JVRihtYWMxKTsKLQkJCQlERUNMQVJFX01BQ19CVUYobWFjMik7Ci0JCQkJREVDTEFSRV9NQUNfQlVGKG1hYzMpOwotCQkJCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCi0JCQkJCUlXTF9ERUJVR19EUk9QCi0JCQkJCSAgICAoIkRyb3BwaW5nIChub24gbmV0d29yayk6ICVzIgotCQkJCQkgICAgICIsICVzLCAlc1xuIiwKLQkJCQkJICAgICBwcmludF9tYWMobWFjMSwgaGVhZGVyLT5hZGRyMSksCi0JCQkJCSAgICAgcHJpbnRfbWFjKG1hYzIsIGhlYWRlci0+YWRkcjIpLAotCQkJCQkgICAgIHByaW50X21hYyhtYWMzLCBoZWFkZXItPmFkZHIzKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCQlpd2wzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHByaXYsIHJ4YiwgJnJ4X3N0YXR1cyk7Ci0JCWJyZWFrOwotCX0KKwlpd2wzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHByaXYsIHJ4YiwgJnJ4X3N0YXR1cyk7CiB9CiAKIGludCBpd2wzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2LCB2b2lkICpwdHIsCkBAIC05OTAsNyArODA3LDcgQEAKIAogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uY3VycmVudF9yYXRlLnJhdGVfbl9mbGFncyA9IHJhdGU7CiAKLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgJiYKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCiAJICAgIChzdGFfaWQgIT0gcHJpdi0+aHdfc2V0dGluZy5iY2FzdF9zdGFfaWQpICYmCiAJCShzdGFfaWQgIT0gSVdMX01VTFRJQ0FTVF9JRCkpCiAJCXByaXYtPnN0YXRpb25zW0lXTF9TVEFfSURdLmN1cnJlbnRfcmF0ZS5yYXRlX25fZmxhZ3MgPSByYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5oCmluZGV4IGZhODFiYTEuLmJkZDMyNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0zOTQ1LmgKQEAgLTczLDYgKzczLDEwIEBACiBleHRlcm4gaW50IGl3bDM5NDVfcGFyYW1faHdjcnlwdG87CiBleHRlcm4gaW50IGl3bDM5NDVfcGFyYW1fcXVldWVzX251bTsKIAorc3RydWN0IGl3bDM5NDVfc3RhX3ByaXYgeworCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOworfTsKKwogZW51bSBpd2wzOTQ1X2FudGVubmEgewogCUlXTF9BTlRFTk5BX0RJVkVSU0lUWSwKIAlJV0xfQU5URU5OQV9NQUlOLApAQCAtNzA3LDcgKzcxMSw2IEBACiAKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAJaW50IGFsbG9jX3J4Yl9za2I7Ci0JYm9vbCBhZGRfcmFkaW90YXA7CiAKIAl2b2lkICgqcnhfaGFuZGxlcnNbUkVQTFlfTUFYXSkoc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdiwKIAkJCQkgICAgICAgc3RydWN0IGl3bDM5NDVfcnhfbWVtX2J1ZmZlciAqcnhiKTsKQEAgLTg1Miw3ICs4NTUsNyBAQAogCS8qIGVlcHJvbSAqLwogCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSBlZXByb207CiAKLQllbnVtIGllZWU4MDIxMV9pZl90eXBlcyBpd19tb2RlOworCWVudW0gbmw4MDIxMV9pZnR5cGUgaXdfbW9kZTsKIAogCXN0cnVjdCBza19idWZmICppYnNzX2JlYWNvbjsKIApAQCAtODk1LDcgKzg5OCw2IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB0aGVybWFsX3BlcmlvZGljOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgZ2F0aGVyX3N0YXRzOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgc2Nhbl9jaGVjazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvc3RfYXNzb2NpYXRlOwogCiAjZGVmaW5lIElXTF9ERUZBVUxUX1RYX1BPV0VSIDB4MEYKIAlzOCB1c2VyX3R4cG93ZXJfbGltaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LWh3LmgKaW5kZXggZmNlOTUwZi4uZjQ3OTNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNDk2NS1ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUtaHcuaApAQCAtOTgsMTYgKzk4LDE3IEBACiAjZGVmaW5lIElXTF9SU1NJX09GRlNFVAk0NAogCiAKLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKIAogLyogUENJIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQQ0lfTElOS19DVFJMICAgICAgMHgwRjAJLyogMSBieXRlICovCi0jZGVmaW5lIFBDSV9QT1dFUl9TT1VSQ0UgICAweDBDOAotI2RlZmluZSBQQ0lfUkVHX1dVTTggICAgICAgMHgwRTgKKyNkZWZpbmUgUENJX0NGR19SRVRSWV9USU1FT1VUCTB4MDQxCisjZGVmaW5lIFBDSV9DRkdfUE9XRVJfU09VUkNFCTB4MEM4CisjZGVmaW5lIFBDSV9SRUdfV1VNOAkJMHgwRTgKKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkwJMHgwRjAKIAogLyogUENJIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZSBQQ0lfTElOS19WQUxfTDBTX0VOCTB4MDEKLSNkZWZpbmUgUENJX0xJTktfVkFMX0wxX0VOCTB4MDIKKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTgkweDAxCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTgkweDAyCisjZGVmaW5lIFBDSV9DRkdfQ01EX1JFR19JTlRfRElTX01TSwkweDA0CiAjZGVmaW5lIFBDSV9DRkdfUE1DX1BNRV9GUk9NX0QzQ09MRF9TVVBQT1JUICAgICAgICAgKDB4ODAwMDAwMDApCiAKICNkZWZpbmUgVEZEX1FVRVVFX1NJWkVfTUFYICAgICAgKDI1NikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTQ5NjUuYwppbmRleCAyM2ZlZDMyLi45ODM4ZGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC00OTY1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNDk2NS5jCkBAIC0zOTksNyArMzk5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB2YWw7CiAJdTE2IHJhZGlvX2NmZzsKLQl1OCB2YWxfbGluazsKKwl1MTYgbGluazsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQxMCwxMCArNDEwLDEwIEBACiAJCQkJICAgICAgIHZhbCAmIH4oMSA8PCAxMSkpOwogCX0KIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHByaXYtPnBjaV9kZXYsIFBDSV9MSU5LX0NUUkwsICZ2YWxfbGluayk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgUENJX0NGR19MSU5LX0NUUkwsICZsaW5rKTsKIAogCS8qIEwxIGlzIGVuYWJsZWQgYnkgQklPUyAqLwotCWlmICgodmFsX2xpbmsgJiBQQ0lfTElOS19WQUxfTDFfRU4pID09IFBDSV9MSU5LX1ZBTF9MMV9FTikKKwlpZiAoKGxpbmsgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pID09IFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikKIAkJLyogZGlhYmxlIEwwUyBkaXNhYmxlZCBMMUEgZW5hYmxlZCAqLwogCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR0lPX1JFRywgQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVEKTsKIAllbHNlCkBAIC0xNjA3LDggKzE2MDcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotaW50IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgY2hhbm5lbCkKKyNpZmRlZiBJRUVFODAyMTFfQ09ORl9DSEFOTkVMX1NXSVRDSAorc3RhdGljIGludCBpd2w0OTY1X2h3X2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGNoYW5uZWwpCiB7CiAJaW50IHJjOwogCXU4IGJhbmQgPSAwOwpAQCAtMTY0OCw2ICsxNjQ4LDcgQEAKIAlyYyA9IGl3bF9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKIAlyZXR1cm4gcmM7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBpd2w0OTY1X3NoYXJlZF9tZW1fcnhfaWR4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAtaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAtaHcuaAppbmRleCAxN2Q0ZjMxLi5jNDc5ZWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLWh3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC1ody5oCkBAIC0xMjksNiArMTI5LDEzIEBACiAJX19sZTMyIHBhZGRpbmcyOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKy8qIGNhbGlicmF0aW9ucyBkZWZpbmVkIGZvciA1MDAwICovCisvKiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCByZXN1bHRzIHNob3VsZCBiZSBzZW50IHRvIHRoZSBydW50aW1lIHVDb2RlICovCitlbnVtIGl3bDUwMDBfY2FsaWIgeworCUlXTDUwMDBfQ0FMSUJfTE8sCisJSVdMNTAwMF9DQUxJQl9UWF9JUSwKKwlJV0w1MDAwX0NBTElCX1RYX0lRX1BFUkQsCit9OwogCiAjZW5kaWYgLyogX19pd2xfNTAwMF9od19oX18gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IGIwODAzNmEuLjUxNTViOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTIwOSwxNCArMjA5LDE0IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgcmFkaW9fY2ZnOwotCXU4IHZhbF9saW5rOworCXUxNiBsaW5rOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHByaXYtPnBjaV9kZXYsIFBDSV9MSU5LX0NUUkwsICZ2YWxfbGluayk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgUENJX0NGR19MSU5LX0NUUkwsICZsaW5rKTsKIAogCS8qIEwxIGlzIGVuYWJsZWQgYnkgQklPUyAqLwotCWlmICgodmFsX2xpbmsgJiBQQ0lfTElOS19WQUxfTDFfRU4pID09IFBDSV9MSU5LX1ZBTF9MMV9FTikKKwlpZiAoKGxpbmsgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pID09IFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikKIAkJLyogZGlhYmxlIEwwUyBkaXNhYmxlZCBMMUEgZW5hYmxlZCAqLwogCQlpd2xfc2V0X2JpdChwcml2LCBDU1JfR0lPX1JFRywgQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVEKTsKIAllbHNlCkBAIC00NDUsNDggKzQ0NSw2IEBACiAJCQkJc2l6ZW9mKGNhbF9jbWQpLCAmY2FsX2NtZCk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsNTAwMF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCi0Jc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0gewotCQkuaWQgPSBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkubWV0YS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCi0JfTsKLQotCWlmIChwcml2LT5jYWxpYl9yZXN1bHRzLmxvX3JlcykgewotCQloY21kLmxlbiA9IHByaXYtPmNhbGliX3Jlc3VsdHMubG9fcmVzX2xlbjsKLQkJaGNtZC5kYXRhID0gcHJpdi0+Y2FsaWJfcmVzdWx0cy5sb19yZXM7Ci0JCXJldCA9IGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKLQotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKHByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcmVzKSB7Ci0JCWhjbWQubGVuID0gcHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9yZXNfbGVuOwotCQloY21kLmRhdGEgPSBwcml2LT5jYWxpYl9yZXN1bHRzLnR4X2lxX3JlczsKLQkJcmV0ID0gaXdsX3NlbmRfY21kX3N5bmMocHJpdiwgJmhjbWQpOwotCi0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9wZXJkX3JlcykgewotCQloY21kLmxlbiA9IHByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcGVyZF9yZXNfbGVuOwotCQloY21kLmRhdGEgPSBwcml2LT5jYWxpYl9yZXN1bHRzLnR4X2lxX3BlcmRfcmVzOwotCQlyZXQgPSBpd2xfc2VuZF9jbWRfc3luYyhwcml2LCAmaGNtZCk7Ci0KLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiAwOwotZXJyOgotCUlXTF9FUlJPUigiRXJyb3IgJWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBpd2w1MDAwX3NlbmRfY2FsaWJfY2ZnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXdsNTAwMF9jYWxpYl9jZmdfY21kIGNhbGliX2NmZ19jbWQ7CkBAIC01MTEsMzMgKzQ2OSwzMCBAQAogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSAodm9pZCAqKXJ4Yi0+c2tiLT5kYXRhOwogCXN0cnVjdCBpd2w1MDAwX2NhbGliX2hkciAqaGRyID0gKHN0cnVjdCBpd2w1MDAwX2NhbGliX2hkciAqKXBrdC0+dS5yYXc7CiAJaW50IGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLOwotCi0JaXdsX2ZyZWVfY2FsaWJfcmVzdWx0cyhwcml2KTsKKwlpbnQgaW5kZXg7CiAKIAkvKiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgKi8KIAlsZW4gLT0gNDsKIAorCS8qIERlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJlc3VsdHMgd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lCisJICogdUNvZGUuIGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMgc2VuZHMgdGhlbSBpbiBhIHJvdyBhY2NvcmRpbmcgdG8gdGhlaXIKKwkgKiBpbmRleC4gV2Ugc29ydCB0aGVtIGhlcmUgKi8KIAlzd2l0Y2ggKGhkci0+b3BfY29kZSkgewogCWNhc2UgSVdMNTAwMF9QSFlfQ0FMSUJSQVRFX0xPX0NNRDoKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0cy5sb19yZXMgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHMubG9fcmVzX2xlbiA9IGxlbjsKLQkJbWVtY3B5KHByaXYtPmNhbGliX3Jlc3VsdHMubG9fcmVzLCBwa3QtPnUucmF3LCBsZW4pOworCQlpbmRleCA9IElXTDUwMDBfQ0FMSUJfTE87CiAJCWJyZWFrOwogCWNhc2UgSVdMNTAwMF9QSFlfQ0FMSUJSQVRFX1RYX0lRX0NNRDoKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9yZXMgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcmVzX2xlbiA9IGxlbjsKLQkJbWVtY3B5KHByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcmVzLCBwa3QtPnUucmF3LCBsZW4pOworCQlpbmRleCA9IElXTDUwMDBfQ0FMSUJfVFhfSVE7CiAJCWJyZWFrOwogCWNhc2UgSVdMNTAwMF9QSFlfQ0FMSUJSQVRFX1RYX0lRX1BFUkRfQ01EOgotCQlwcml2LT5jYWxpYl9yZXN1bHRzLnR4X2lxX3BlcmRfcmVzID0ga3phbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwotCQlwcml2LT5jYWxpYl9yZXN1bHRzLnR4X2lxX3BlcmRfcmVzX2xlbiA9IGxlbjsKLQkJbWVtY3B5KHByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcGVyZF9yZXMsIHBrdC0+dS5yYXcsIGxlbik7CisJCWluZGV4ID0gSVdMNTAwMF9DQUxJQl9UWF9JUV9QRVJEOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlJV0xfRVJST1IoIlVua25vd24gY2FsaWJyYXRpb24gbm90aWZpY2F0aW9uICVkXG4iLAogCQkJICBoZHItPm9wX2NvZGUpOwogCQlyZXR1cm47CiAJfQorCWl3bF9jYWxpYl9zZXQoJnByaXYtPmNhbGliX3Jlc3VsdHNbaW5kZXhdLCBwa3QtPnUucmF3LCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBpd2w1MDAwX3J4X2NhbGliX2NvbXBsZXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTgzMiw3ICs3ODcsNyBAQAogCWl3bDUwMDBfc2VuZF9YdGFsX2NhbGliKHByaXYpOwogCiAJaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfUlQpCi0JCWl3bDUwMDBfc2VuZF9jYWxpYl9yZXN1bHRzKHByaXYpOworCQlpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NzgsMTIgKzgzMywxMiBAQAogCXN3aXRjaCAocHJpdi0+aHdfcmV2ICYgQ1NSX0hXX1JFVl9UWVBFX01TSykgewogCWNhc2UgQ1NSX0hXX1JFVl9UWVBFXzUxMDA6CiAJY2FzZSBDU1JfSFdfUkVWX1RZUEVfNTMwMDoKLQkJLyogNVgwMCB3YW50cyBpbiBDZWxzaXVzICovCisJY2FzZSBDU1JfSFdfUkVWX1RZUEVfNTM1MDoKKwkJLyogNVgwMCBhbmQgNTM1MCB3YW50cyBpbiBDZWxzaXVzICovCiAJCXByaXYtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCA9IENUX0tJTExfVEhSRVNIT0xEOwogCQlicmVhazsKIAljYXNlIENTUl9IV19SRVZfVFlQRV81MTUwOgotCWNhc2UgQ1NSX0hXX1JFVl9UWVBFXzUzNTA6Ci0JCS8qIDVYNTAgd2FudHMgaW4gS2VsdmluICovCisJCS8qIDUxNTAgd2FudHMgaW4gS2VsdmluICovCiAJCXByaXYtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCA9CiAJCQkJQ0VMU0lVU19UT19LRUxWSU4oQ1RfS0lMTF9USFJFU0hPTEQpOwogCQlicmVhazsKQEAgLTE2MTQsNiArMTU2OSw4IEBACiAJLm1vZF9wYXJhbXMgPSAmaXdsNTBfbW9kX3BhcmFtcywKIH07CiAKK01PRFVMRV9GSVJNV0FSRSgiaXdsd2lmaS01MDAwIiBJV0w1MDAwX1VDT0RFX0FQSSAiLnVjb2RlIik7CisKIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlNTAsIGl3bDUwX21vZF9wYXJhbXMuZGlzYWJsZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZTUwLAogCQkgICJtYW51YWxseSBkaXNhYmxlIHRoZSA1MFhYIHJhZGlvIChkZWZhdWx0IDAgW3JhZGlvIG9uXSkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKaW5kZXggOTBhMmI2ZC4uZTJhNThlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMKQEAgLTM1LDggKzM1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCi0jaW5jbHVkZSAiLi4vbmV0L21hYzgwMjExL3JhdGUuaCIKLQogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtc3RhLmgiCiAjaW5jbHVkZSAiaXdsLWNvcmUuaCIKQEAgLTE2MywxMiArMTYxLDE1IEBACiAJdTMyIGRiZ19maXhlZF9yYXRlOwogI2VuZGlmCiAJc3RydWN0IGl3bF9wcml2ICpkcnY7CisKKwkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCisJaW50IGxhc3RfdHhyYXRlX2lkeDsKIH07CiAKIHN0YXRpYyB2b2lkIHJzX3JhdGVfc2NhbGVfcGVyZm9ybShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEpOwogc3RhdGljIHZvaWQgcnNfZmlsbF9saW5rX2NtZChjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiByYXRlX25fZmxhZ3MpOwogCkBAIC0zNTQsMTcgKzM1NSwxMSBAQAogCiBzdGF0aWMgdm9pZCByc190bF90dXJuX29uX2FnZ19mb3JfdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwgdTggdGlkLAotCQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQlzdGF0ZSA9IHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCWlmIChzdGF0ZSA9PSBIVF9BR0dfU1RBVEVfSURMRSAmJgotCSAgICByc190bF9nZXRfbG9hZChscV9kYXRhLCB0aWQpID4gSVdMX0FHR19MT0FEX1RIUkVTSE9MRCkgeworCWlmIChyc190bF9nZXRfbG9hZChscV9kYXRhLCB0aWQpID4gSVdMX0FHR19MT0FEX1RIUkVTSE9MRCkgewogCQlJV0xfREVCVUdfSFQoIlN0YXJ0aW5nIFR4IGFnZzogU1RBOiAlcyB0aWQ6ICVkXG4iLAogCQkJCXByaW50X21hYyhtYWMsIHN0YS0+YWRkciksIHRpZCk7CiAJCWllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHByaXYtPmh3LCBzdGEtPmFkZHIsIHRpZCk7CkBAIC0zNzMsNyArMzY4LDcgQEAKIAogc3RhdGljIHZvaWQgcnNfdGxfdHVybl9vbl9hZ2coc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCB0aWQsCiAJCQkgICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwKLQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlpZiAoKHRpZCA8IFRJRF9NQVhfTE9BRF9DT1VOVCkpCiAJCXJzX3RsX3R1cm5fb25fYWdnX2Zvcl90aWQocHJpdiwgbHFfZGF0YSwgdGlkLCBzdGEpOwpAQCAtNDM2LDcgKzQzMSw3IEBACiAJCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgKHRocm93IGF3YXkgb2xkZXN0IGhpc3RvcnkpLAogCQkgKiBPUiBpbiAiMSIsIGFuZCBpbmNyZW1lbnQgInN1Y2Nlc3MiIGlmIHRoaXMKIAkJICogZnJhbWUgd2FzIHN1Y2Nlc3NmdWwuICovCi0JCXdpbmRvdy0+ZGF0YSA8PD0gMTs7CisJCXdpbmRvdy0+ZGF0YSA8PD0gMTsKIAkJaWYgKHN1Y2Nlc3NlcyA+IDApIHsKIAkJCXdpbmRvdy0+c3VjY2Vzc19jb3VudGVyKys7CiAJCQl3aW5kb3ctPmRhdGEgfD0gMHgxOwpAQCAtNzczLDcgKzc2OCw4IEBACiAvKgogICogbWFjODAyMTEgc2VuZHMgdXMgVHggc3RhdHVzCiAgKi8KLXN0YXRpYyB2b2lkIHJzX3R4X3N0YXR1cyh2b2lkICpwcml2X3JhdGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCByc190eF9zdGF0dXModm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBzdGF0dXM7CkBAIC03ODEsMTEgKzc3Nyw5IEBACiAJaW50IHJzX2luZGV4LCBpbmRleCA9IDA7CiAJc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YTsKIAlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKnRhYmxlOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbG9jYWxfdG9faHcobG9jYWwpOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3I7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7CiAJc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKnNlYXJjaF93aW4gPSBOVUxMOwpAQCAtODExLDE3ICs4MDUsOSBAQAogCWlmIChyZXRyaWVzID4gMTUpCiAJCXJldHJpZXMgPSAxNTsKIAotCXJjdV9yZWFkX2xvY2soKTsKKwlscV9zdGEgPSAoc3RydWN0IGl3bF9scV9zdGEgKilwcml2X3N0YTsKIAotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgaGRyLT5hZGRyMSk7Ci0KLQlpZiAoIXN0YSB8fCAhc3RhLT5yYXRlX2N0cmxfcHJpdikKLQkJZ290byBvdXQ7Ci0KLQotCWxxX3N0YSA9IChzdHJ1Y3QgaXdsX2xxX3N0YSAqKXN0YS0+cmF0ZV9jdHJsX3ByaXY7Ci0KLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgJiYKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCiAJICAgICFscV9zdGEtPmlic3Nfc3RhX2FkZGVkKQogCQlnb3RvIG91dDsKIApAQCAtOTY1LDkgKzk1MSw4IEBACiAJfQogCiAJLyogU2VlIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcmF0ZSBvciBtb2R1bGF0aW9uIG1vZGUgdG8gdHJ5LiAqLwotCXJzX3JhdGVfc2NhbGVfcGVyZm9ybShwcml2LCBkZXYsIGhkciwgc3RhKTsKKwlyc19yYXRlX3NjYWxlX3BlcmZvcm0ocHJpdiwgaGRyLCBzdGEsIGxxX3N0YSk7CiBvdXQ6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuOwogfQogCkBAIC0xMTI4LDYgKzExMTMsNyBAQAogCiAJCQkvKiBIaWdoZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCiAJCQl9IGVsc2UgeworCQkJCW5ld19yYXRlID0gcmF0ZTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTE0Miw3ICsxMTI4LDcgQEAKIHN0YXRpYyBpbnQgcnNfc3dpdGNoX3RvX21pbW8yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCSAgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaW5kZXgpCiB7CiAJdTE2IHJhdGVfbWFzazsKQEAgLTExNTMsOCArMTEzOSw4IEBACiAJICAgICFzdGEtPmh0X2luZm8uaHRfc3VwcG9ydGVkKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAoKChzdGEtPmh0X2luZm8uY2FwICYgSUVFRTgwMjExX0hUX0NBUF9NSU1PX1BTKSA+PiAyKQotCQkJCQkJPT0gSVdMX01JTU9fUFNfU1RBVElDKQorCWlmICgoKHN0YS0+aHRfaW5mby5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyKQorCQkJCQkJPT0gV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBOZWVkIGJvdGggVHggY2hhaW5zL2FudGVubmFzIHRvIHN1cHBvcnQgTUlNTyAqLwpAQCAtMTIxMCw3ICsxMTk2LDcgQEAKIHN0YXRpYyBpbnQgcnNfc3dpdGNoX3RvX3Npc28oc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCi0JCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkJICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpbmRleCkKIHsKIAl1MTYgcmF0ZV9tYXNrOwpAQCAtMTI3MCw3ICsxMjU2LDcgQEAKIHN0YXRpYyBpbnQgcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJCXN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkJaW50IGluZGV4KQogewogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwpAQCAtMTI4MSwxNSArMTI2NywyMyBAQAogCQkgIChzaXplb2Yoc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEpICogSVdMX1JBVEVfQ09VTlQpKTsKIAl1OCBzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKIAl1OCB2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCXU4IHR4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKIAlpbnQgcmV0ID0gMDsKIAogCWZvciAoOyA7KSB7CiAJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BOgorCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOgorCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyOgogCQkJSVdMX0RFQlVHX1JBVEUoIkxROiBMZWdhY3kgdG9nZ2xlIEFudGVubmFcbiIpOwogCiAJCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CiAKKwkJCWlmICgodGJsLT5hY3Rpb24gPT0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTEgJiYKKwkJCQkJCQl0eF9jaGFpbnNfbnVtIDw9IDEpIHx8CisJCQkgICAgKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyICYmCisJCQkJCQkJdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKwogCQkJLyogRG9uJ3QgY2hhbmdlIGFudGVubmEgaWYgc3VjY2VzcyBoYXMgYmVlbiBncmVhdCAqLwogCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKIAkJCQlicmVhazsKQEAgLTEyOTksNyArMTI5Myw3IEBACiAKIAkJCWlmIChyc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCiAJCQkJJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwgc2VhcmNoX3RibCkpIHsKLQkJCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMTsKKwkJCQlyc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgc2VhcmNoX3RibCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlicmVhazsKQEAgLTEzMTIsNDMgKzEzMDYsNTQgQEAKIAkJCXJldCA9IHJzX3N3aXRjaF90b19zaXNvKHByaXYsIGxxX3N0YSwgY29uZiwgc3RhLAogCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKIAkJCWlmICghcmV0KSB7Ci0JCQkJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CiAJCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKIAkJCWJyZWFrOwotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yOgorCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCOgorCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDOgorCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDOgogCQkJSVdMX0RFQlVHX1JBVEUoIkxROiBMZWdhY3kgc3dpdGNoIHRvIE1JTU8yXG4iKTsKIAogCQkJLyogU2V0IHVwIHNlYXJjaCB0YWJsZSB0byB0cnkgTUlNTyAqLwogCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwogCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gMDsKLQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FCOy8qRklYTUU6UlMqLwotCQkJCS8qRklYTUU6UlM6bmVlZCB0byBjaGVjayBhbnQgdmFsaWRpdHkqLworCisJCQlpZiAodGJsLT5hY3Rpb24gPT0gSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUIpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUI7CisJCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQykKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQzsKKwkJCWVsc2UKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9CQzsKKworCQkJaWYgKCFyc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCBzZWFyY2hfdGJsLT5hbnRfdHlwZSkpCisJCQkJYnJlYWs7CisKIAkJCXJldCA9IHJzX3N3aXRjaF90b19taW1vMihwcml2LCBscV9zdGEsIGNvbmYsIHN0YSwKIAkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7CiAJCQlpZiAoIXJldCkgewotCQkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOwogCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJYnJlYWs7CiAJCX0KIAkJdGJsLT5hY3Rpb24rKzsKLQkJaWYgKHRibC0+YWN0aW9uID4gSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzIpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkE7CisJCWlmICh0YmwtPmFjdGlvbiA+IElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDKQorCQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKIAogCQlpZiAodGJsLT5hY3Rpb24gPT0gc3RhcnRfYWN0aW9uKQogCQkJYnJlYWs7CiAKIAl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CiAJcmV0dXJuIDA7CiAKLSBvdXQ6CitvdXQ6CisJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CiAJdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMikKLQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BOworCWlmICh0YmwtPmFjdGlvbiA+IElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDKQorCQl0YmwtPmFjdGlvbiA9IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOwogCXJldHVybiAwOwogCiB9CkBAIC0xMzU5LDcgKzEzNjQsNyBAQAogc3RhdGljIGludCByc19tb3ZlX3Npc29fdG9fb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAogCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBpbnQgaW5kZXgpCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpbmRleCkKIHsKIAl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CiAJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CkBAIC0xMzcwLDM0ICsxMzc1LDUxIEBACiAJCSAgKHNpemVvZihzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSkgKiBJV0xfUkFURV9DT1VOVCkpOwogCXU4IHN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwogCXU4IHZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOwogCWludCByZXQ7CiAKIAlmb3IgKDs7KSB7CiAJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKIAkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BOgorCQljYXNlIElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMToKKwkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTI6CiAJCQlJV0xfREVCVUdfUkFURSgiTFE6IFNJU08gdG9nZ2xlIEFudGVubmFcbiIpOworCisJCQlpZiAoKHRibC0+YWN0aW9uID09IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMSAmJgorCQkJCQkJCXR4X2NoYWluc19udW0gPD0gMSkgfHwKKwkJCSAgICAodGJsLT5hY3Rpb24gPT0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkEyICYmCisJCQkJCQkJdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKwogCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKIAkJCQlicmVhazsKIAogCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwogCQkJaWYgKHJzX3RvZ2dsZV9hbnRlbm5hKHZhbGlkX3R4X2FudCwKLQkJCQkgICAgICAgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwgc2VhcmNoX3RibCkpIHsKLQkJCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMTsKKwkJCQkgICAgICAgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwgc2VhcmNoX3RibCkpCiAJCQkJZ290byBvdXQ7Ci0JCQl9CiAJCQlicmVhazsKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzI6CisJCWNhc2UgSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOgorCQljYXNlIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQzoKKwkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQkM6CiAJCQlJV0xfREVCVUdfUkFURSgiTFE6IFNJU08gc3dpdGNoIHRvIE1JTU8yXG4iKTsKIAkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKIAkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0JCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsgLypGSVhNRTpSUyovCisKKwkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUI7CisJCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7CisJCQllbHNlCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7CisKKwkJCWlmICghcnNfaXNfdmFsaWRfYW50KHZhbGlkX3R4X2FudCwgc2VhcmNoX3RibC0+YW50X3R5cGUpKQorCQkJCWJyZWFrOworCiAJCQlyZXQgPSByc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLCBjb25mLCBzdGEsCiAJCQkJCQkgc2VhcmNoX3RibCwgaW5kZXgpOwotCQkJaWYgKCFyZXQpIHsKLQkJCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMTsKKwkJCWlmICghcmV0KQogCQkJCWdvdG8gb3V0OwotCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSVdMX1NJU09fU1dJVENIX0dJOgogCQkJaWYgKCF0YmwtPmlzX2ZhdCAmJgpAQCAtMTQyNywyMiArMTQ0OSwyMyBAQAogCQkJfQogCQkJc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlID0gcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKAogCQkJCQkJc2VhcmNoX3RibCwgaW5kZXgsIGlzX2dyZWVuKTsKLQkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJdGJsLT5hY3Rpb24rKzsKIAkJaWYgKHRibC0+YWN0aW9uID4gSVdMX1NJU09fU1dJVENIX0dJKQotCQkJdGJsLT5hY3Rpb24gPSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTsKKwkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwogCiAJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCiAJCQlicmVhazsKIAl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CiAJcmV0dXJuIDA7CiAKICBvdXQ6CisJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CiAJdGJsLT5hY3Rpb24rKzsKIAlpZiAodGJsLT5hY3Rpb24gPiBJV0xfU0lTT19TV0lUQ0hfR0kpCi0JCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkE7CisJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwogCXJldHVybiAwOwogfQogCkBAIC0xNDUyLDQzICsxNDc1LDY0IEBACiBzdGF0aWMgaW50IHJzX21vdmVfbWltb190b19vdGhlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCiAJCQkJIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCQkgc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCBpbmRleCkKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IGluZGV4KQogewogCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKIAlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKIAlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KIAkJCQkmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKKwlzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwogCXUzMiBzeiA9IChzaXplb2Yoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbykgLQogCQkgIChzaXplb2Yoc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEpICogSVdMX1JBVEVfQ09VTlQpKTsKIAl1OCBzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQkvKnU4IHZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ki8KKwl1OCB2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCXU4IHR4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKIAlpbnQgcmV0OwogCiAJZm9yICg7OykgewogCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CiAJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKLQkJY2FzZSBJV0xfTUlNT19TV0lUQ0hfQU5URU5OQV9BOgotCQljYXNlIElXTF9NSU1PX1NXSVRDSF9BTlRFTk5BX0I6CisJCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMToKKwkJY2FzZSBJV0xfTUlNTzJfU1dJVENIX0FOVEVOTkEyOgorCQkJSVdMX0RFQlVHX1JBVEUoIkxROiBNSU1PIHRvZ2dsZSBBbnRlbm5hc1xuIik7CisKKwkJCWlmICh0eF9jaGFpbnNfbnVtIDw9IDIpCisJCQkJYnJlYWs7CisKKwkJCWlmICh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPj0gSVdMX1JTX0dPT0RfUkFUSU8pCisJCQkJYnJlYWs7CisKKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKwkJCWlmIChyc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCisJCQkJICAgICAgICZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsIHNlYXJjaF90YmwpKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0E6CisJCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0I6CisJCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0M6CiAJCQlJV0xfREVCVUdfUkFURSgiTFE6IE1JTU8yIHN3aXRjaCB0byBTSVNPXG4iKTsKIAogCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIFNJU08gKi8KIAkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKIAotCQkJLypGSVhNRTpSUzpuZWVkIHRvIGNoZWNrIGFudCB2YWxpZGl0eSArIEMqLwotCQkJaWYgKHRibC0+YWN0aW9uID09IElXTF9NSU1PX1NXSVRDSF9BTlRFTk5BX0EpCisJCQlpZiAodGJsLT5hY3Rpb24gPT0gSVdMX01JTU8yX1NXSVRDSF9TSVNPX0EpCiAJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQTsKLQkJCWVsc2UKKwkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElXTF9NSU1PMl9TV0lUQ0hfU0lTT19CKQogCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0I7CisJCQllbHNlCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQzsKKworCQkJaWYgKCFyc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCBzZWFyY2hfdGJsLT5hbnRfdHlwZSkpCisJCQkJYnJlYWs7CiAKIAkJCXJldCA9IHJzX3N3aXRjaF90b19zaXNvKHByaXYsIGxxX3N0YSwgY29uZiwgc3RhLAogCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CisJCQlpZiAoIXJldCkKIAkJCQlnb3RvIG91dDsKLQkJCX0KKwogCQkJYnJlYWs7CiAKLQkJY2FzZSBJV0xfTUlNT19TV0lUQ0hfR0k6CisJCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9HSToKIAkJCWlmICghdGJsLT5pc19mYXQgJiYKIAkJCQkhKHByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNnZiAmCiAJCQkJCQlIVF9TSE9SVF9HSV8yME1IWikpCkBAIC0xNTE3LDIzICsxNTYxLDIzIEBACiAJCQl9CiAJCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPSByYXRlX25fZmxhZ3NfZnJvbV90YmwoCiAJCQkJCQlzZWFyY2hfdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCQkJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CiAJCQlnb3RvIG91dDsKIAogCQl9CiAJCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9NSU1PX1NXSVRDSF9HSSkKLQkJCXRibC0+YWN0aW9uID0gSVdMX01JTU9fU1dJVENIX0FOVEVOTkFfQTsKKwkJaWYgKHRibC0+YWN0aW9uID4gSVdMX01JTU8yX1NXSVRDSF9HSSkKKwkJCXRibC0+YWN0aW9uID0gSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMTsKIAogCQlpZiAodGJsLT5hY3Rpb24gPT0gc3RhcnRfYWN0aW9uKQogCQkJYnJlYWs7CiAJfQotCisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CiAJcmV0dXJuIDA7CiAgb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOwogCXRibC0+YWN0aW9uKys7Ci0JaWYgKHRibC0+YWN0aW9uID4gSVdMX01JTU9fU1dJVENIX0dJKQotCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PX1NXSVRDSF9BTlRFTk5BX0E7CisJaWYgKHRibC0+YWN0aW9uID4gSVdMX01JTU8yX1NXSVRDSF9HSSkKKwkJdGJsLT5hY3Rpb24gPSBJV0xfTUlNTzJfU1dJVENIX0FOVEVOTkExOwogCXJldHVybiAwOwogCiB9CkBAIC0xNjI0LDEyICsxNjY4LDExIEBACiAgKiBEbyByYXRlIHNjYWxpbmcgYW5kIHNlYXJjaCBmb3IgbmV3IG1vZHVsYXRpb24gbW9kZS4KICAqLwogc3RhdGljIHZvaWQgcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCSAgc3RydWN0IHN0YV9pbmZvICpzdGEpCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbG9jYWxfdG9faHcobG9jYWwpOworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwogCWludCBsb3cgPSBJV0xfUkFURV9JTlZBTElEOwogCWludCBoaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKQEAgLTE2NDQsNyArMTY4Nyw2IEBACiAJX19sZTE2IGZjOwogCXUxNiByYXRlX21hc2s7CiAJdTggdXBkYXRlX2xxID0gMDsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhOwogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwgKnRibDE7CiAJdTE2IHJhdGVfc2NhbGVfaW5kZXhfbXNrID0gMDsKIAl1MzIgcmF0ZTsKQEAgLTE2NjUsMTAgKzE3MDcsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghc3RhIHx8ICFzdGEtPnJhdGVfY3RybF9wcml2KQorCWlmICghc3RhIHx8ICFscV9zdGEpCiAJCXJldHVybjsKIAotCWxxX3N0YSA9IChzdHJ1Y3QgaXdsX2xxX3N0YSAqKXN0YS0+cmF0ZV9jdHJsX3ByaXY7CisJbHFfc3RhLT5zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW2xxX3N0YS0+YmFuZF07CiAKIAl0aWQgPSByc190bF9hZGRfcGFja2V0KGxxX3N0YSwgaGRyKTsKIApAQCAtMTY4Niw3ICsxNzI4LDcgQEAKIAlpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CiAKIAkvKiBjdXJyZW50IHR4IHJhdGUgKi8KLQlpbmRleCA9IHN0YS0+bGFzdF90eHJhdGVfaWR4OworCWluZGV4ID0gbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CiAKIAlJV0xfREVCVUdfUkFURSgiUmF0ZSBzY2FsZSBpbmRleCAlZCBmb3IgdHlwZSAlZFxuIiwgaW5kZXgsCiAJCSAgICAgICB0YmwtPmxxX3R5cGUpOwpAQCAtMTc0NywxOSArMTc4OSwxMyBAQAogCQlyc19zdGF5X2luX3RhYmxlKGxxX3N0YSk7CiAKIAkJZ290byBvdXQ7CisJfQogCiAJLyogRWxzZSB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzOyBjYWxjdWxhdGUgZXN0aW1hdGUgb2YKIAkgKiBhY3R1YWwgYXZlcmFnZSB0aHJvdWdocHV0ICovCi0JfSBlbHNlIHsKLQkJLypGSVhNRTpSUyByZW1vdmUgdGhpcyBlbHNlIGlmIHdlIGRvbid0IGdldCB0aGlzIGVycm9yKi8KLQkJaWYgKHdpbmRvdy0+YXZlcmFnZV90cHQgIT0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCXRibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XSArIDY0KSAvIDEyOCkpIHsKLQkJCUlXTF9FUlJPUigiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCIKLQkJCQkJCQkJIiBieSBub3dcbiIpOwotCQkJd2luZG93LT5hdmVyYWdlX3RwdCA9ICgod2luZG93LT5zdWNjZXNzX3JhdGlvICoKLQkJCQkJdGJsLT5leHBlY3RlZF90cHRbaW5kZXhdICsgNjQpIC8gMTI4KTsKLQkJfQotCX0KKworCUJVR19PTih3aW5kb3ctPmF2ZXJhZ2VfdHB0ICE9ICgod2luZG93LT5zdWNjZXNzX3JhdGlvICoKKwkJCXRibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XSArIDY0KSAvIDEyOCkpOwogCiAJLyogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgY2hlY2sgc3VjY2Vzcy4gKi8KIAlpZiAobHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkgewpAQCAtMTc2OSw3ICsxODA1LDcgQEAKIAkJICogY29udGludWluZyB0byB1c2UgdGhlIHNldHVwIHRoYXQgd2UndmUgYmVlbiB0cnlpbmcuICovCiAJCWlmICh3aW5kb3ctPmF2ZXJhZ2VfdHB0ID4gbHFfc3RhLT5sYXN0X3RwdCkgewogCi0JCQlJV0xfREVCVUdfUkFURSgiTFE6IFNXSVRDSElORyBUTyBDVVJSRU5UIFRBQkxFICIKKwkJCUlXTF9ERUJVR19SQVRFKCJMUTogU1dJVENISU5HIFRPIE5FVyBUQUJMRSAiCiAJCQkJCSJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAogCQkJCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8sCiAJCQkJCXdpbmRvdy0+YXZlcmFnZV90cHQsCkBAIC0yMDA1LDE1ICsyMDQxLDcgQEAKIG91dDoKIAl0YmwtPmN1cnJlbnRfcmF0ZSA9IHJhdGVfbl9mbGFnc19mcm9tX3RibCh0YmwsIGluZGV4LCBpc19ncmVlbik7CiAJaSA9IGluZGV4OwotCXN0YS0+bGFzdF90eHJhdGVfaWR4ID0gaTsKLQotCS8qIHN0YS0+dHhyYXRlX2lkeCBpcyBhbiBpbmRleCB0byBBIG1vZGUgcmF0ZXMgd2hpY2ggc3RhcnQKLQkgKiBhdCBJV0xfRklSU1RfT0ZETV9SQVRFCi0JICovCi0JaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlzdGEtPnR4cmF0ZV9pZHggPSBpIC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQllbHNlCi0JCXN0YS0+dHhyYXRlX2lkeCA9IGk7CisJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOwogCiAJcmV0dXJuOwogfQpAQCAtMjAyMSw5ICsyMDQ5LDkgQEAKIAogc3RhdGljIHZvaWQgcnNfaW5pdGlhbGl6ZV9scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEpCiB7Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YTsKIAlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0Ymw7CiAJaW50IHJhdGVfaWR4OwogCWludCBpOwpAQCAtMjAzMiwxNCArMjA2MCwxMyBAQAogCXU4IGFjdGl2ZV90YmwgPSAwOwogCXU4IHZhbGlkX3R4X2FudDsKIAotCWlmICghc3RhIHx8ICFzdGEtPnJhdGVfY3RybF9wcml2KQorCWlmICghc3RhIHx8ICFscV9zdGEpCiAJCWdvdG8gb3V0OwogCi0JbHFfc3RhID0gKHN0cnVjdCBpd2xfbHFfc3RhICopc3RhLT5yYXRlX2N0cmxfcHJpdjsKLQlpID0gc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CisJaSA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OwogCiAJaWYgKChscV9zdGEtPmxxLnN0YV9pZCA9PSAweGZmKSAmJgotCSAgICAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSkKKwkgICAgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKQogCQlnb3RvIG91dDsKIAogCXZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CkBAIC0yMDc2LDQwICsyMTAzLDMzIEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCByc19nZXRfcmF0ZSh2b2lkICpwcml2X3JhdGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24gKnNlbCkKK3N0YXRpYyB2b2lkIHJzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKKwkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAqc2VsKQogewogCiAJaW50IGk7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWwtPmh3LmNvbmY7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmcHJpdi0+aHctPmNvbmY7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlfX2xlMTYgZmM7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKIAlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhOwogCiAJSVdMX0RFQlVHX1JBVEVfTElNSVQoInJhdGUgc2NhbGUgY2FsY3VsYXRlIG5ldyByYXRlIGZvciBza2JcbiIpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQogCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgZGF0YSB1c2luZyBsb3dlc3QKIAkgKiByYXRlLiAqLwogCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCWlmICghaWVlZTgwMjExX2lzX2RhdGEoZmMpIHx8IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8Ci0JICAgICFzdGEgfHwgIXN0YS0+cmF0ZV9jdHJsX3ByaXYpIHsKLQkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KGxvY2FsLCBzYmFuZCwgc3RhKTsKLQkJZ290byBvdXQ7CisJICAgICFzdGEgfHwgIXByaXZfc3RhKSB7CisJCXNlbC0+cmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKKwkJcmV0dXJuOwogCX0KIAotCWxxX3N0YSA9IChzdHJ1Y3QgaXdsX2xxX3N0YSAqKXN0YS0+cmF0ZV9jdHJsX3ByaXY7Ci0JaSA9IHN0YS0+bGFzdF90eHJhdGVfaWR4OworCWxxX3N0YSA9IChzdHJ1Y3QgaXdsX2xxX3N0YSAqKXByaXZfc3RhOworCWkgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKIAotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSAmJgorCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKIAkgICAgIWxxX3N0YS0+aWJzc19zdGFfYWRkZWQpIHsKIAkJdTggc3RhX2lkID0gaXdsX2ZpbmRfc3RhdGlvbihwcml2LCBoZHItPmFkZHIxKTsKIAkJREVDTEFSRV9NQUNfQlVGKG1hYyk7CkBAIC0yMTI0LDIzICsyMTQ0LDIyIEBACiAJCQlscV9zdGEtPmxxLnN0YV9pZCA9IHN0YV9pZDsKIAkJCWxxX3N0YS0+bHEucnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzID0gMDsKIAkJCWxxX3N0YS0+aWJzc19zdGFfYWRkZWQgPSAxOwotCQkJcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEpOworCQkJcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEsIGxxX3N0YSk7CiAJCX0KIAl9CiAKIAlpZiAoKGkgPCAwKSB8fCAoaSA+IElXTF9SQVRFX0NPVU5UKSkgewotCQlzZWwtPnJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgobG9jYWwsIHNiYW5kLCBzdGEpOwotCQlnb3RvIG91dDsKKwkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOworCQlyZXR1cm47CiAJfQogCiAJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCiAJCWkgLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKIAlzZWwtPnJhdGVfaWR4ID0gaTsKLW91dDoKLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIHZvaWQgKnJzX2FsbG9jX3N0YSh2b2lkICpwcml2X3JhdGUsIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkICpyc19hbGxvY19zdGEodm9pZCAqcHJpdl9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICBnZnBfdCBnZnApCiB7CiAJc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YTsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7CkBAIC0yMTYzLDMzICsyMTgyLDI4IEBACiAJcmV0dXJuIGxxX3N0YTsKIH0KIAotc3RhdGljIHZvaWQgcnNfcmF0ZV9pbml0KHZvaWQgKnByaXZfcmF0ZSwgdm9pZCAqcHJpdl9zdGEsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkgc3RydWN0IHN0YV9pbmZvICpzdGEpCitzdGF0aWMgdm9pZCByc19yYXRlX2luaXQodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKIHsKIAlpbnQgaSwgajsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWwtPmh3LmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZwcml2LT5ody0+Y29uZjsKIAlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7CiAKLQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07Ci0KIAlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKIAlscV9zdGEtPnN1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOwotCXN0YS0+dHhyYXRlX2lkeCA9IDM7CiAJZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKIAkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCiAJCQlyc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygmbHFfc3RhLT5scV9pbmZvW2pdLndpbltpXSk7CiAKLQlJV0xfREVCVUdfUkFURSgiTFE6ICoqKiByYXRlIHNjYWxlIGdsb2JhbCBpbml0ICoqKlxuIik7CisJSVdMX0RFQlVHX1JBVEUoIkxROiAqKiogcmF0ZSBzY2FsZSBzdGF0aW9uIGdsb2JhbCBpbml0ICoqKlxuIik7CiAJLyogVE9ETzogd2hhdCBpcyBhIGdvb2Qgc3RhcnRpbmcgcmF0ZSBmb3IgU1RBPyBBYm91dCBtaWRkbGU/IE1heWJlIG5vdAogCSAqIHRoZSBsb3dlc3Qgb3IgdGhlIGhpZ2hlc3QgcmF0ZS4uIENvdWxkIGNvbnNpZGVyIHVzaW5nIFJTU0kgZnJvbQogCSAqIHByZXZpb3VzIHBhY2tldHM/IE5lZWQgdG8gaGF2ZSBJRUVFIDgwMi4xWCBhdXRoIHN1Y2NlZWQgaW1tZWRpYXRlbHkKIAkgKiBhZnRlciBhc3NvYy4uICovCiAKIAlscV9zdGEtPmlic3Nfc3RhX2FkZGVkID0gMDsKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCXU4IHN0YV9pZCA9IGl3bF9maW5kX3N0YXRpb24ocHJpdiwgc3RhLT5hZGRyKTsKIAkJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKQEAgLTIyMTIsMTUgKzIyMjYsMTQgQEAKIAl9CiAKIAkvKiBGaW5kIGhpZ2hlc3QgdHggcmF0ZSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgYW5kIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KKwlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IDM7CiAJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspCiAJCWlmIChzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdICYgQklUKGkpKQotCQkJc3RhLT50eHJhdGVfaWR4ID0gaTsKKwkJCWxxX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaTsKIAotCXN0YS0+bGFzdF90eHJhdGVfaWR4ID0gc3RhLT50eHJhdGVfaWR4OwotCS8qIFdURiBpcyB3aXRoIHRoaXMgYm9ndXMgY29tbWVudD8gQSBkb2Vzbid0IGhhdmUgY2NrIHJhdGVzICovCi0JLyogRm9yIE1PREVfSUVFRTgwMjExQSwgY2NrIHJhdGVzIGFyZSBhdCBlbmQgb2YgcmF0ZSB0YWJsZSAqLwotCWlmIChsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXN0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7CisJLyogRm9yIE1PREVfSUVFRTgwMjExQSwgc2tpcCBvdmVyIGNjayByYXRlcyBpbiBnbG9iYWwgcmF0ZSB0YWJsZSAqLworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwogCiAJbHFfc3RhLT5pc19kdXAgPSAwOwogCWxxX3N0YS0+aXNfZ3JlZW4gPSByc191c2VfZ3JlZW4ocHJpdiwgY29uZik7CkBAIC0yMjYwLDcgKzIyNzMsNyBAQAogCWxxX3N0YS0+dHhfYWdnX3RpZF9lbiA9IElXTF9BR0dfQUxMX1RJRDsKIAlscV9zdGEtPmRydiA9IHByaXY7CiAKLQlyc19pbml0aWFsaXplX2xxKHByaXYsIGNvbmYsIHN0YSk7CisJcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEsIGxxX3N0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJzX2ZpbGxfbGlua19jbWQoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtMjM4Miw5ICsyMzk1LDkgQEAKIAlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPSBjcHVfdG9fbGUxNig0MDAwKTsKIH0KIAotc3RhdGljIHZvaWQgKnJzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQorc3RhdGljIHZvaWQgKnJzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQogewotCXJldHVybiBsb2NhbC0+aHcucHJpdjsKKwlyZXR1cm4gaHctPnByaXY7CiB9CiAvKiByYXRlIHNjYWxlIHJlcXVpcmVzIGZyZWUgZnVuY3Rpb24gdG8gYmUgaW1wbGVtZW50ZWQgKi8KIHN0YXRpYyB2b2lkIHJzX2ZyZWUodm9pZCAqcHJpdl9yYXRlKQpAQCAtMjQwNSwxMiArMjQxOCwxMiBAQAogI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0RFQlVHICovCiB9CiAKLXN0YXRpYyB2b2lkIHJzX2ZyZWVfc3RhKHZvaWQgKnByaXZfcmF0ZSwgdm9pZCAqcHJpdl9zdGEpCitzdGF0aWMgdm9pZCByc19mcmVlX3N0YSh2b2lkICpwcml2X3IsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQl2b2lkICpwcml2X3N0YSkKIHsKIAlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHByaXZfcjsKIAotCXByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yYXRlOwogCUlXTF9ERUJVR19SQVRFKCJlbnRlclxuIik7CiAJa2ZyZWUobHFfc3RhKTsKIAlJV0xfREVCVUdfUkFURSgibGVhdmVcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaAppbmRleCA4NGQ0ZDFlLi5kMTQ4ZDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaApAQCAtMjA2LDIxICsyMDYsMjggQEAKICNkZWZpbmUgSVdMX1JBVEVfREVDUkVBU0VfVEgJCTE5MjAJLyogIDE1JSAqLwogCiAvKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbGVnYWN5IG1vZGUgKi8KLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQQkwCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX1NJU08JCTEKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzIJCTIKKyNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTEgICAgICAwCisjZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyICAgICAgMQorI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPICAgICAgICAgIDIKKyNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUIgICAgICAzCisjZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDICAgICAgNAorI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQyAgICAgIDUKIAogLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIHNpc28gbW9kZSAqLwotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQQkJMAotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzIJCTEKLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX0dJCQkyCisjZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMSAgICAgICAgMAorI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTIgICAgICAgIDEKKyNkZWZpbmUgSVdMX1NJU09fU1dJVENIX01JTU8yX0FCICAgICAgICAyCisjZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQyAgICAgICAgMworI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQkMgICAgICAgIDQKKyNkZWZpbmUgSVdMX1NJU09fU1dJVENIX0dJICAgICAgICAgICAgICA1CiAKIC8qIHBvc3NpYmxlIGFjdGlvbnMgd2hlbiBpbiBtaW1vIG1vZGUgKi8KLSNkZWZpbmUgSVdMX01JTU9fU1dJVENIX0FOVEVOTkFfQQkwCi0jZGVmaW5lIElXTF9NSU1PX1NXSVRDSF9BTlRFTk5BX0IJMQotI2RlZmluZSBJV0xfTUlNT19TV0lUQ0hfR0kJCTIKLQotLypGSVhNRTpSUzpzZXBhcmF0ZSBNSU1PMi8zIHRyYW5zaXRpb25zKi8KKyNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMSAgICAgICAwCisjZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTIgICAgICAgMQorI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQSAgICAgICAgIDIKKyNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0IgICAgICAgICAzCisjZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfU0lTT19DICAgICAgICAgNAorI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX0dJICAgICAgICAgICAgIDUKIAogLypGSVhNRTpSUzphZGQgcG9zaWJsZSBhY2N0aW9ucyBmb3IgTUlNTzMqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCmluZGV4IGUwMWYwNDguLjI0YTFhZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkvKiBJZiB3ZSBoYXZlIHNldCB0aGUgQVNTT0NfTVNLIGFuZCB3ZSBhcmUgaW4gQlNTIG1vZGUgdGhlbgogCSAqIGFkZCB0aGUgSVdMX0FQX0lEIHRvIHRoZSBzdGF0aW9uIHJhdGUgdGFibGUgKi8KIAlpZiAobmV3X2Fzc29jKSB7Ci0JCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkgeworCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCQlyZXQgPSBpd2xfcnhvbl9hZGRfc3RhdGlvbihwcml2LAogCQkJCQkgICBwcml2LT5hY3RpdmVfcnhvbi5ic3NpZF9hZGRyLCAxKTsKIAkJCWlmIChyZXQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewpAQCAtNDQ4LDggKzQ0OCw4IEBACiAJCQkJCSAgY29uc3QgdTggKmRlc3QsIGludCBsZWZ0KQogewogCWlmICghaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikgfHwgIXByaXYtPmlic3NfYmVhY29uIHx8Ci0JICAgICgocHJpdi0+aXdfbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSAmJgotCSAgICAgKHByaXYtPml3X21vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApKSkKKwkgICAgKChwcml2LT5pd19tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJgorCSAgICAgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocHJpdi0+aWJzc19iZWFjb24tPmxlbiA+IGxlZnQpCkBAIC00ODUsNyArNDg1LDcgQEAKIAkJcmV0dXJuIElXTF9SQVRFXzZNX1BMQ1A7CiB9CiAKLXVuc2lnbmVkIGludCBpd2w0OTY1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXdsNDk2NV9od19nZXRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkJICAgICAgIHN0cnVjdCBpd2xfZnJhbWUgKmZyYW1lLCB1OCByYXRlKQogewogCXN0cnVjdCBpd2xfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZDsKQEAgLTU2NCw4ICs1NjQsNiBAQAogCWlmICghaXdsX2NvbmYtPmlzX2h0KQogCQlyZXR1cm47CiAKLQlwcml2LT5wc19tb2RlID0gKHU4KSgoaHRfY29uZi0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9NSU1PX1BTKSA+PiAyKTsKLQogCWlmIChodF9jb25mLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkKIAkJaXdsX2NvbmYtPnNnZiB8PSBIVF9TSE9SVF9HSV8yME1IWjsKIAlpZiAoaHRfY29uZi0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApCkBAIC01ODYsNiArNTg0LDggQEAKIAkJaXdsX2NvbmYtPnN1cHBvcnRlZF9jaGFuX3dpZHRoID0gMDsKIAl9CiAKKwlpd2xfY29uZi0+c21fcHMgPSAodTgpKChodF9jb25mLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyKTsKKwogCW1lbWNweShpd2xfY29uZi0+c3VwcF9tY3Nfc2V0LCBodF9jb25mLT5zdXBwX21jc19zZXQsIDE2KTsKIAogCWl3bF9jb25mLT5jb250cm9sX2NoYW5uZWwgPSBodF9ic3NfY29uZi0+cHJpbWFyeV9jaGFubmVsOwpAQCAtNjcyLDcgKzY3Miw3IEBACiAJYmVhY29uX2ludCA9IHByaXYtPmJlYWNvbl9pbnQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSB7CisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogCQlpZiAoYmVhY29uX2ludCA9PSAwKSB7CiAJCQlwcml2LT5yeG9uX3RpbWluZy5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNigxMDApOwogCQkJcHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2luaXRfdmFsID0gY3B1X3RvX2xlMzIoMTAyNDAwKTsKQEAgLTcyMSw3ICs3MjEsNyBAQAogCQllbHNlCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCi0JCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwpAQCAtNzQwLDIzICs3NDAsMjMgQEAKIAltZW1zZXQoJnByaXYtPnN0YWdpbmdfcnhvbiwgMCwgc2l6ZW9mKHByaXYtPnN0YWdpbmdfcnhvbikpOwogCiAJc3dpdGNoIChwcml2LT5pd19tb2RlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQlwcml2LT5zdGFnaW5nX3J4b24uZGV2X3R5cGUgPSBSWE9OX0RFVl9UWVBFX0FQOwogCQlicmVhazsKIAotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5maWx0ZXJfZmxhZ3MgPSBSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSzsKIAkJYnJlYWs7CiAKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9JQlNTOwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgPSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5maWx0ZXJfZmxhZ3MgPSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyB8CiAJCQkJCQkgIFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwogCQlicmVhazsKIAotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5kZXZfdHlwZSA9IFJYT05fREVWX1RZUEVfU05JRkZFUjsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX1BST01JU0NfTVNLIHwKIAkJICAgIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwpAQCAtNzg1LDcgKzc4NSw3IEBACiAJICogaW4gc29tZSBjYXNlIEEgY2hhbm5lbHMgYXJlIGFsbCBub24gSUJTUwogCSAqIGluIHRoaXMgY2FzZSBmb3JjZSBCL0cgY2hhbm5lbAogCSAqLwotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSAmJgorCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKIAkgICAgIShpc19jaGFubmVsX2lic3MoY2hfaW5mbykpKQogCQljaF9pbmZvID0gJnByaXYtPmNoYW5uZWxfaW5mb1swXTsKIApAQCAtMTE4Miw3ICsxMTgyLDcgQEAKIAkJbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7CiAjZW5kaWYKIAotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgJiYKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApICYmCiAJICAgICghdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpKQogCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmJlYWNvbl91cGRhdGUpOwogfQpAQCAtMTI3MCw3ICsxMjcwLDcgQEAKIAogCWlmIChzcmMgPT0gSVdMX1BXUl9TUkNfVkFVWCkgewogCQl1MzIgdmFsOwotCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHJpdi0+cGNpX2RldiwgUENJX1BPV0VSX1NPVVJDRSwKKwkJcmV0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHByaXYtPnBjaV9kZXYsIFBDSV9DRkdfUE9XRVJfU09VUkNFLAogCQkJCQkgICAgJnZhbCk7CiAKIAkJaWYgKHZhbCAmIFBDSV9DRkdfUE1DX1BNRV9GUk9NX0QzQ09MRF9TVVBQT1JUKQpAQCAtMjM4OCw3ICsyMzg4LDcgQEAKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAotCXJldCA9IGl3bDQ5NjVfc2V0X21vZGUocHJpdiwgSUVFRTgwMjExX0lGX1RZUEVfTU5UUik7CisJcmV0ID0gaXdsNDk2NV9zZXRfbW9kZShwcml2LCBOTDgwMjExX0lGVFlQRV9NT05JVE9SKTsKIAogCWlmIChyZXQpIHsKIAkJaWYgKHJldCA9PSAtRUFHQUlOKQpAQCAtMjQ2OSw3ICsyNDY5LDcgQEAKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlJV0xfRVJST1IoIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluIEFQIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI0ODYsNiArMjQ4Niw3IEBACiAJaWYgKCFwcml2LT52aWYgfHwgIXByaXYtPmlzX29wZW4pCiAJCXJldHVybjsKIAorCWl3bF9wb3dlcl9jYW5jZWxfdGltZW91dChwcml2KTsKIAlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwogCiAJY29uZiA9IGllZWU4MDIxMV9nZXRfaHdfY29uZihwcml2LT5odyk7CkBAIC0yNTAzLDggKzI1MDQsNyBAQAogCiAJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CiAKLQlpZiAocHJpdi0+Y3VycmVudF9odF9jb25maWcuaXNfaHQpCi0JCWl3bF9zZXRfcnhvbl9odChwcml2LCAmcHJpdi0+Y3VycmVudF9odF9jb25maWcpOworCWl3bF9zZXRfcnhvbl9odChwcml2LCAmcHJpdi0+Y3VycmVudF9odF9jb25maWcpOwogCiAJaXdsX3NldF9yeG9uX2NoYWluKHByaXYpOwogCXByaXYtPnN0YWdpbmdfcnhvbi5hc3NvY19pZCA9IGNwdV90b19sZTE2KHByaXYtPmFzc29jX2lkKTsKQEAgLTI1MjMsNyArMjUyMyw3IEBACiAJCWVsc2UKIAkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAKLQkJaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCiAJfQpAQCAtMjUzMSwxMCArMjUzMSwxMCBAQAogCWl3bDQ5NjVfY29tbWl0X3J4b24ocHJpdik7CiAKIAlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWJyZWFrOwogCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAKIAkJLyogYXNzdW1lIGRlZmF1bHQgYXNzb2MgaWQgKi8KIAkJcHJpdi0+YXNzb2NfaWQgPSAxOwpAQCAtMjU1MCw0NCArMjU1MCwyMyBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBFbmFibGUgUnggZGlmZmVyZW50aWFsIGdhaW4gYW5kIHNlbnNpdGl2aXR5IGNhbGlicmF0aW9ucyAqLwotCWl3bF9jaGFpbl9ub2lzZV9yZXNldChwcml2KTsKLQlwcml2LT5zdGFydF9jYWxpYiA9IDE7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlwcml2LT5hc3NvY19zdGF0aW9uX2FkZGVkID0gMTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaXdsX2FjdGl2YXRlX3Fvcyhwcml2LCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgMCk7Ci0JLyogd2UgaGF2ZSBqdXN0IGFzc29jaWF0ZWQsIGRvbid0IHN0YXJ0IHNjYW4gdG9vIGVhcmx5ICovCi0JcHJpdi0+bmV4dF9zY2FuX2ppZmZpZXMgPSBqaWZmaWVzICsgSVdMX0RFTEFZX05FWFRfU0NBTjsKLX0KKwkvKiB0aGUgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gd2lsbCBlbmFibGVkIFBNIHVwb24gY29tcGxldGlvbgorCSAqIElmIGNoYWluIG5vaXNlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLCB0aGVuIHdlIG5lZWQgdG8gZW5hYmxlCisJICogcG93ZXIgbWFuYWdlbWVudCBoZXJlICovCisJaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0RPTkUpCisJCWl3bF9wb3dlcl9lbmFibGVfbWFuYWdlbWVudChwcml2KTsKIAotc3RhdGljIGludCBpd2w0OTY1X21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZik7CisJLyogRW5hYmxlIFJ4IGRpZmZlcmVudGlhbCBnYWluIGFuZCBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbnMgKi8KKwlpd2xfY2hhaW5fbm9pc2VfcmVzZXQocHJpdik7CisJcHJpdi0+c3RhcnRfY2FsaWIgPSAxOwogCi1zdGF0aWMgdm9pZCBpd2xfYmdfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIHNjYW5fY29tcGxldGVkKTsKLQotCUlXTF9ERUJVR19TQ0FOKCJTQ0FOIGNvbXBsZXRlIHNjYW5cbiIpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0NPTkZfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCWl3bDQ5NjVfbWFjX2NvbmZpZyhwcml2LT5odywgaWVlZTgwMjExX2dldF9od19jb25mKHByaXYtPmh3KSk7Ci0KLQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQocHJpdi0+aHcpOwotCi0JLyogU2luY2Ugc2V0dGluZyB0aGUgVFhQT1dFUiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCi0JICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQsIHRydWUpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3MjgsMTIgKzI3MDcsNiBAQAogCiAJSVdMX0RFQlVHX01BQ0RVTVAoImVudGVyXG4iKTsKIAotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX01OVFIpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKCJsZWF2ZSAtIG1vbml0b3JcbiIpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlJV0xfREVCVUdfVFgoImRldi0+eG1pdCglZCBieXRlcykgYXQgcmF0ZSAweCUwMnhcbiIsIHNrYi0+bGVuLAogCQkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7CiAKQEAgLTI3OTgsOCArMjc3MSw2IEBACiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCUlXTF9ERUJVR19NQUM4MDIxMSgiZW50ZXIgdG8gY2hhbm5lbCAlZFxuIiwgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUpOwogCi0JcHJpdi0+YWRkX3JhZGlvdGFwID0gISEoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9SQURJT1RBUCk7Ci0KIAlpZiAoY29uZi0+cmFkaW9fZW5hYmxlZCAmJiBpd2xfcmFkaW9fa2lsbF9zd19lbmFibGVfcmFkaW8ocHJpdikpIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKCJsZWF2ZSAtIFJGLUtJTEwgLSB3YWl0aW5nIGZvciB1Q29kZVxuIik7CiAJCWdvdG8gb3V0OwpAQCAtMjgxNyw3ICsyNzg4LDYgQEAKIAlpZiAodW5saWtlbHkoIXByaXYtPmNmZy0+bW9kX3BhcmFtcy0+ZGlzYWJsZV9od19zY2FuICYmCiAJCSAgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkpIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKCJsZWF2ZSAtIHNjYW5uaW5nXG4iKTsKLQkJc2V0X2JpdChTVEFUVVNfQ09ORl9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI4MzAsNyArMjgwMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgogCSAgICAhaXNfY2hhbm5lbF9pYnNzKGNoX2luZm8pKSB7CiAJCUlXTF9FUlJPUigiY2hhbm5lbCAlZCBpbiBiYW5kICVkIG5vdCBJQlNTIGNoYW5uZWxcbiIsCiAJCQljb25mLT5jaGFubmVsLT5od192YWx1ZSwgY29uZi0+Y2hhbm5lbC0+YmFuZCk7CkBAIC0yODUxLDcgKzI4MjEsNyBAQAogCSkKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzID0gMDsKIAotCWl3bF9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNvbmYtPmNoYW5uZWwtPmJhbmQsIGNoYW5uZWwpOworCWl3bF9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNvbmYtPmNoYW5uZWwpOwogCiAJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjb25mLT5jaGFubmVsLT5iYW5kKTsKIApAQCAtMjg4MCw2ICsyODUwLDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKQorCQlyZXQgPSBpd2xfcG93ZXJfc2V0X3VzZXJfbW9kZShwcml2LCBJV0xfUE9XRVJfSU5ERVhfMyk7CisJZWxzZQorCQlyZXQgPSBpd2xfcG93ZXJfc2V0X3VzZXJfbW9kZShwcml2LCBJV0xfUE9XRVJfTU9ERV9DQU0pOworCWlmIChyZXQpCisJCUlXTF9ERUJVR19NQUM4MDIxMSgiRXJyb3Igc2V0dGluZyBwb3dlciBsZXZlbFxuIik7CisKIAlJV0xfREVCVUdfTUFDODAyMTEoIlRYIFBvd2VyIG9sZD0lZCBuZXc9JWRcbiIsCiAJCQkgICBwcml2LT50eF9wb3dlcl91c2VyX2xtdCwgY29uZi0+cG93ZXJfbGV2ZWwpOwogCkBAIC0yODk2LDcgKzI4NzMsNiBAQAogCUlXTF9ERUJVR19NQUM4MDIxMSgibGVhdmVcbiIpOwogCiBvdXQ6Ci0JY2xlYXJfYml0KFNUQVRVU19DT05GX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yOTQ1LDcgKzI5MjEsNyBAQAogCQkJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyAmPQogCQkJCQl+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CiAKLQkJCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0KIAkJCQkJflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCQl9CkBAIC0yOTg0LDcgKzI5NjAsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTICYmCisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKIAkgICAgY29uZi0+Y2hhbmdlZCAmIElFRUU4MDIxMV9JRkNDX0JFQUNPTikgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CiAJCWlmICghYmVhY29uKQpAQCAtMjk5NCw3ICsyOTcwLDcgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApICYmCisJaWYgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgogCSAgICAoIWNvbmYtPnNzaWRfbGVuKSkgewogCQlJV0xfREVCVUdfTUFDODAyMTEKIAkJICAgICgiTGVhdmluZyBpbiBBUCBtb2RlIGJlY2F1c2UgSG9zdEFQRCBpcyBub3QgcmVhZHkuXG4iKTsKQEAgLTMwMTcsNyArMjk5Myw3IEBACiAJICAgICEocHJpdi0+aHctPmZsYWdzICYgSUVFRTgwMjExX0hXX05PX1BST0JFX0ZJTFRFUklORykpIHsKICAqLwogCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlpZiAoIWNvbmYtPmJzc2lkKSB7CiAJCQljb25mLT5ic3NpZCA9IHByaXYtPm1hY19hZGRyOwogCQkJbWVtY3B5KHByaXYtPmJzc2lkLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOwpAQCAtMzA1MiwxMSArMzAyOCwxMSBAQAogCQkgKiB0byB2ZXJpZnkpIC0ganBrICovCiAJCW1lbWNweShwcml2LT5ic3NpZCwgY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKIAotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCQlpd2w0OTY1X2NvbmZpZ19hcChwcml2KTsKIAkJZWxzZSB7CiAJCQlyYyA9IGl3bDQ5NjVfY29tbWl0X3J4b24ocHJpdik7Ci0JCQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSAmJiByYykKKwkJCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSAmJiByYykKIAkJCQlpd2xfcnhvbl9hZGRfc3RhdGlvbigKIAkJCQkJcHJpdiwgcHJpdi0+YWN0aXZlX3J4b24uYnNzaWRfYWRkciwgMSk7CiAJCX0KQEAgLTMwOTIsNyArMzA2OCw3IEBACiAKIAlpZiAoY2hhbmdlZF9mbGFncyAmICgqdG90YWxfZmxhZ3MpICYgRklGX09USEVSX0JTUykgewogCQlJV0xfREVCVUdfTUFDODAyMTEoIkVudGVyOiB0eXBlICVkICgweCV4LCAweCV4KVxuIiwKLQkJCQkgICBJRUVFODAyMTFfSUZfVFlQRV9NTlRSLAorCQkJCSAgIE5MODAyMTFfSUZUWVBFX01PTklUT1IsCiAJCQkJICAgY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKIAkJLyogcXVldWUgd29yayAnY3V6IG1hYzgwMjExIGlzIGhvbGRpbmcgYSBsb2NrIHdoaWNoCiAJCSAqIHByZXZlbnRzIHVzIGZyb20gaXNzdWluZyAoc3luY2hyb25vdXMpIGYvdyBjbWRzICovCkBAIC0zMTczLDYgKzMxNDksMTAgQEAKIAkJCXByaXYtPnBvd2VyX2RhdGEuZHRpbV9wZXJpb2QgPSBic3NfY29uZi0+ZHRpbV9wZXJpb2Q7CiAJCQlwcml2LT50aW1lc3RhbXAgPSBic3NfY29uZi0+dGltZXN0YW1wOwogCQkJcHJpdi0+YXNzb2NfY2FwYWJpbGl0eSA9IGJzc19jb25mLT5hc3NvY19jYXBhYmlsaXR5OworCisJCQkvKiB3ZSBoYXZlIGp1c3QgYXNzb2NpYXRlZCwgZG9uJ3Qgc3RhcnQgc2NhbiB0b28gZWFybHkKKwkJCSAqIGxlYXZlIHRpbWUgZm9yIEVBUE9MIGV4Y2hhbmdlIHRvIGNvbXBsZXRlCisJCQkgKi8KIAkJCXByaXYtPm5leHRfc2Nhbl9qaWZmaWVzID0gamlmZmllcyArCiAJCQkJCUlXTF9ERUxBWV9ORVhUX1NDQU5fQUZURVJfQVNTT0M7CiAJCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CkBAIC0zMTg5LDExICszMTY5LDExIEBACiAKIH0KIAotc3RhdGljIGludCBpd2w0OTY1X21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqc3NpZCwgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgaXdsX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQogewotCWludCByYyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0OwogCiAJSVdMX0RFQlVHX01BQzgwMjExKCJlbnRlclxuIik7CiAKQEAgLTMyMDEsNDEgKzMxODEsNDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJcmMgPSAtRUlPOworCQlyZXQgPSAtRUlPOwogCQlJV0xfREVCVUdfTUFDODAyMTEoImxlYXZlIC0gbm90IHJlYWR5IG9yIGV4aXQgcGVuZGluZ1xuIik7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgewkvKiBBUHMgZG9uJ3Qgc2NhbiAqLwotCQlyYyA9IC1FSU87CisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsJLyogQVBzIGRvbid0IHNjYW4gKi8KKwkJcmV0ID0gLUVJTzsKIAkJSVdMX0VSUk9SKCJFUlJPUjogQVBzIGRvbid0IHNjYW5cbiIpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JLyogd2UgZG9uJ3Qgc2NoZWR1bGUgc2NhbiB3aXRoaW4gbmV4dF9zY2FuX2ppZmZpZXMgcGVyaW9kICovCisJLyogV2UgZG9uJ3Qgc2NoZWR1bGUgc2NhbiB3aXRoaW4gbmV4dF9zY2FuX2ppZmZpZXMgcGVyaW9kLgorCSAqIEF2b2lkIHNjYW5uaW5nIGR1cmluZyBwb3NzaWJsZSBFQVBPTCBleGNoYW5nZSwgcmV0dXJuCisJICogc3VjY2VzcyBpbW1lZGlhdGVseS4KKwkgKi8KIAlpZiAocHJpdi0+bmV4dF9zY2FuX2ppZmZpZXMgJiYKLQkJCXRpbWVfYWZ0ZXIocHJpdi0+bmV4dF9zY2FuX2ppZmZpZXMsIGppZmZpZXMpKSB7Ci0JCXJjID0gLUVBR0FJTjsKKwkgICAgdGltZV9hZnRlcihwcml2LT5uZXh0X3NjYW5famlmZmllcywgamlmZmllcykpIHsKKwkJSVdMX0RFQlVHX1NDQU4oInNjYW4gcmVqZWN0ZWQ6IHdpdGhpbiBuZXh0IHNjYW4gcGVyaW9kXG4iKTsKKwkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NvbXBsZXRlZCk7CisJCXJldCA9IDA7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CisKIAkvKiBpZiB3ZSBqdXN0IGZpbmlzaGVkIHNjYW4gYXNrIGZvciBkZWxheSAqLwotCWlmIChwcml2LT5sYXN0X3NjYW5famlmZmllcyAmJiB0aW1lX2FmdGVyKHByaXYtPmxhc3Rfc2Nhbl9qaWZmaWVzICsKLQkJCQlJV0xfREVMQVlfTkVYVF9TQ0FOLCBqaWZmaWVzKSkgewotCQlyYyA9IC1FQUdBSU47CisJaWYgKGl3bF9pc19hc3NvY2lhdGVkKHByaXYpICYmIHByaXYtPmxhc3Rfc2Nhbl9qaWZmaWVzICYmCisJICAgIHRpbWVfYWZ0ZXIocHJpdi0+bGFzdF9zY2FuX2ppZmZpZXMgKyBJV0xfREVMQVlfTkVYVF9TQ0FOLCBqaWZmaWVzKSkgeworCQlJV0xfREVCVUdfU0NBTigic2NhbiByZWplY3RlZDogd2l0aGluIHByZXZpb3VzIHNjYW4gcGVyaW9kXG4iKTsKKwkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NvbXBsZXRlZCk7CisJCXJldCA9IDA7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0JaWYgKGxlbikgewotCQlJV0xfREVCVUdfU0NBTigiZGlyZWN0IHNjYW4gZm9yICVzIFslZF1cbiAiLAotCQkJICAgICAgIGl3bF9lc2NhcGVfZXNzaWQoc3NpZCwgbGVuKSwgKGludClsZW4pOwogCisJaWYgKHNzaWRfbGVuKSB7CiAJCXByaXYtPm9uZV9kaXJlY3Rfc2NhbiA9IDE7Ci0JCXByaXYtPmRpcmVjdF9zc2lkX2xlbiA9ICh1OCkKLQkJICAgIG1pbigodTgpIGxlbiwgKHU4KSBJV19FU1NJRF9NQVhfU0laRSk7CisJCXByaXYtPmRpcmVjdF9zc2lkX2xlbiA9ICBtaW5fdCh1OCwgc3NpZF9sZW4sIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJbWVtY3B5KHByaXYtPmRpcmVjdF9zc2lkLCBzc2lkLCBwcml2LT5kaXJlY3Rfc3NpZF9sZW4pOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXByaXYtPm9uZV9kaXJlY3Rfc2NhbiA9IDA7CisJfQogCi0JcmMgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2KTsKKwlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2KTsKIAogCUlXTF9ERUJVR19NQUM4MDIxMSgibGVhdmVcbiIpOwogCkBAIC0zMjQzLDcgKzMyMjksNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBpd2w0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0zMzMyLDcgKzMzMTgsNyBAQAogCSAqIGluIDFYIG1vZGUuCiAJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlICovCiAJaWYgKGtleS0+YWxnID09IEFMR19XRVAgJiYgc3RhX2lkID09IHByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQgJiYKLQkJcHJpdi0+aXdfbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCQlwcml2LT5pd19tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCWlmIChjbWQgPT0gU0VUX0tFWSkKIAkJCWlzX2RlZmF1bHRfd2VwX2tleSA9ICFwcml2LT5rZXlfbWFwcGluZ19rZXk7CiAJCWVsc2UKQEAgLTM0MDMsNyArMzM4OSw3IEBACiAJcHJpdi0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLnJlc2VydmVkMSA9IDA7CiAJcHJpdi0+cW9zX2RhdGEucW9zX2FjdGl2ZSA9IDE7CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJaXdsX2FjdGl2YXRlX3Fvcyhwcml2LCAxKTsKIAllbHNlIGlmIChwcml2LT5hc3NvY19pZCAmJiBpd2xfaXNfYXNzb2NpYXRlZChwcml2KSkKIAkJaXdsX2FjdGl2YXRlX3Fvcyhwcml2LCAwKTsKQEAgLTM0MTYsMTMgKzM0MDIsMTMgQEAKIAogc3RhdGljIGludCBpd2w0OTY1X21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCSAgICAgY29uc3QgdTggKmFkZHIsIHUxNiB0aWQsIHUxNiAqc3NuKQorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAogCUlXTF9ERUJVR19IVCgiQS1NUERVIGFjdGlvbiBvbiBhZGRyICVzIHRpZCAlZFxuIiwKLQkJICAgICBwcmludF9tYWMobWFjLCBhZGRyKSwgdGlkKTsKKwkJICAgICBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLCB0aWQpOwogCiAJaWYgKCEocHJpdi0+Y2ZnLT5za3UgJiBJV0xfU0tVX04pKQogCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTM0MzAsMTYgKzM0MTYsMTYgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgogCQlJV0xfREVCVUdfSFQoInN0YXJ0IFJ4XG4iKTsKLQkJcmV0dXJuIGl3bF9yeF9hZ2dfc3RhcnQocHJpdiwgYWRkciwgdGlkLCAqc3NuKTsKKwkJcmV0dXJuIGl3bF9yeF9hZ2dfc3RhcnQocHJpdiwgc3RhLT5hZGRyLCB0aWQsICpzc24pOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CiAJCUlXTF9ERUJVR19IVCgic3RvcCBSeFxuIik7Ci0JCXJldHVybiBpd2xfcnhfYWdnX3N0b3AocHJpdiwgYWRkciwgdGlkKTsKKwkJcmV0dXJuIGl3bF9yeF9hZ2dfc3RvcChwcml2LCBzdGEtPmFkZHIsIHRpZCk7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CiAJCUlXTF9ERUJVR19IVCgic3RhcnQgVHhcbiIpOwotCQlyZXR1cm4gaXdsX3R4X2FnZ19zdGFydChwcml2LCBhZGRyLCB0aWQsIHNzbik7CisJCXJldHVybiBpd2xfdHhfYWdnX3N0YXJ0KHByaXYsIHN0YS0+YWRkciwgdGlkLCBzc24pOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6CiAJCUlXTF9ERUJVR19IVCgic3RvcCBUeFxuIik7Ci0JCXJldHVybiBpd2xfdHhfYWdnX3N0b3AocHJpdiwgYWRkciwgdGlkKTsKKwkJcmV0dXJuIGl3bF90eF9hZ2dfc3RvcChwcml2LCBzdGEtPmFkZHIsIHRpZCk7CiAJZGVmYXVsdDoKIAkJSVdMX0RFQlVHX0hUKCJ1bmtub3duXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTIxLDcgKzM1MDcsNyBAQAogCiAJcHJpdi0+YmVhY29uX2ludCA9IHByaXYtPmh3LT5jb25mLmJlYWNvbl9pbnQ7CiAJcHJpdi0+dGltZXN0YW1wID0gMDsKLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSkKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpCiAJCXByaXYtPmJlYWNvbl9pbnQgPSAwOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMzUzNSw3ICszNTIxLDcgQEAKIAkvKiB3ZSBhcmUgcmVzdGFydGluZyBhc3NvY2lhdGlvbiBwcm9jZXNzCiAJICogY2xlYXIgUlhPTl9GSUxURVJfQVNTT0NfTVNLIGJpdAogCSAqLwotCWlmIChwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0FQKSB7CisJaWYgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCQlpd2w0OTY1X2NvbW1pdF9yeG9uKHByaXYpOwpAQCAtMzU0NCw3ICszNTMwLDE3IEBACiAJaXdsX3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIDApOwogCiAJLyogUGVyIG1hYzgwMjExLmg6IFRoaXMgaXMgb25seSB1c2VkIGluIElCU1MgbW9kZS4uLiAqLwotCWlmIChwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCisJCS8qIHN3aXRjaCB0byBDQU0gZHVyaW5nIGFzc29jaWF0aW9uIHBlcmlvZC4KKwkJICogdGhlIHVjb2RlIHdpbGwgYmxvY2sgYW55IGFzc29jaWF0aW9uL2F1dGhlbnRpY2F0aW9uCisJCSAqIGZyb21lIGR1cmluZyBhc3NpY2lhdGlvbiBwZXJpb2QgaWYgaXQgY2FuIG5vdCBoZWFyCisJCSAqIHRoZSBBUCBiZWNhdXNlIG9mIFBNLiB0aGUgdGltZXIgZW5hYmxlIFBNIGJhY2sgaXMKKwkJICogYXNzb2NpYXRpb24gZG8gbm90IGNvbXBsZXRlCisJCSAqLworCQlpZiAocHJpdi0+aHctPmNvbmYuY2hhbm5lbC0+ZmxhZ3MgJiAoSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwKKwkJCQkJCSAgICAgSUVFRTgwMjExX0NIQU5fUkFEQVIpKQorCQkJCWl3bF9wb3dlcl9kaXNhYmxlX21hbmFnZW1lbnQocHJpdiwgMzAwMCk7CiAKIAkJSVdMX0RFQlVHX01BQzgwMjExKCJsZWF2ZSAtIG5vdCBpbiBJQlNTXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CkBAIC0zNTczLDcgKzM1NjksNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKCJsZWF2ZSAtIG5vdCBJQlNTXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMzYzMCwxMSArMzYyNiwxMSBAQAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkLT5kcml2ZXJfZGF0YTsKLQljaGFyICpwID0gKGNoYXIgKilidWY7Ci0JdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDApOwotCWlmIChwID09IGJ1ZikKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKIAkJICAgICAgICI6ICVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKIAllbHNlCkBAIC0zNzA2LDExICszNzAyLDExIEBACiAJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopZC0+ZHJpdmVyX2RhdGE7Ci0JY2hhciAqcCA9IChjaGFyICopYnVmOwotCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKIAotCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7Ci0JaWYgKHAgPT0gYnVmKQorCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKIAkJICAgICAgICI6ICVzIGlzIG5vdCBpbiBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwogCWVsc2UKQEAgLTM3MzQsNyArMzczMCwxMiBAQAogCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWQtPmRyaXZlcl9kYXRhOwotCXUzMiBmbGFncyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdTMyIGZsYWdzOworCWludCByZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZmxhZ3MgPSAodTMyKXZhbDsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlpZiAobGUzMl90b19jcHUocHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzKSAhPSBmbGFncykgewpAQCAtMzc0Miw4ICszNzQzLDcgQEAKIAkJaWYgKGl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCkpCiAJCQlJV0xfV0FSTklORygiQ291bGQgbm90IGNhbmNlbCBzY2FuLlxuIik7CiAJCWVsc2UgewotCQkJSVdMX0RFQlVHX0lORk8oIkNvbW1pdHRpbmcgcnhvbi5mbGFncyA9IDB4JTA0WFxuIiwKLQkJCQkgICAgICAgZmxhZ3MpOworCQkJSVdMX0RFQlVHX0lORk8oIkNvbW1pdCByeG9uLmZsYWdzID0gMHglMDRYXG4iLCBmbGFncyk7CiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CiAJCQlpd2w0OTY1X2NvbW1pdF9yeG9uKHByaXYpOwogCQl9CkBAIC0zNzY5LDcgKzM3NjksMTIgQEAKIAkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilkLT5kcml2ZXJfZGF0YTsKLQl1MzIgZmlsdGVyX2ZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1MzIgZmlsdGVyX2ZsYWdzOworCWludCByZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZmlsdGVyX2ZsYWdzID0gKHUzMil2YWw7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAJaWYgKGxlMzJfdG9fY3B1KHByaXYtPnN0YWdpbmdfcnhvbi5maWx0ZXJfZmxhZ3MpICE9IGZpbHRlcl9mbGFncykgewpAQCAtMzg3MCwxMCArMzg3NSwxMiBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0ICA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CiAKLQlwcml2LT5yZXRyeV9yYXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQlpZiAocHJpdi0+cmV0cnlfcmF0ZSA8PSAwKQotCQlwcml2LT5yZXRyeV9yYXRlID0gMTsKKwlwcml2LT5yZXRyeV9yYXRlID0gKHZhbCA+IDApID8gdmFsIDogMTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTM4OTQsOSArMzkwMSw5IEBACiB7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwogCWludCByZXQ7Ci0JaW50IG1vZGU7CisJdW5zaWduZWQgbG9uZyBtb2RlOwogCi0JbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlpZiAoIWl3bF9pc19yZWFkeShwcml2KSkgewpAQCAtMzkwNCw2ICszOTExLDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZtb2RlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwogCXJldCA9IGl3bF9wb3dlcl9zZXRfdXNlcl9tb2RlKHByaXYsIG1vZGUpOwogCWlmIChyZXQpIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKCJmYWlsZWQgc2V0dGluZyBwb3dlciBtb2RlLlxuIik7CkBAIC00MDgwLDkgKzQwOTEsOCBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2xfYmdfaW5pdF9hbGl2ZV9zdGFydCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmFsaXZlX3N0YXJ0LCBpd2xfYmdfYWxpdmVfc3RhcnQpOwogCi0JLyogRklYTUUgOiByZW1vdmUgd2hlbiByZXNvbHZlZCBQRU5ESU5HICovCi0JSU5JVF9XT1JLKCZwcml2LT5zY2FuX2NvbXBsZXRlZCwgaXdsX2JnX3NjYW5fY29tcGxldGVkKTsKIAlpd2xfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOworCWl3bF9zZXR1cF9wb3dlcl9kZWZlcnJlZF93b3JrKHByaXYpOwogCiAJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldHVwX2RlZmVycmVkX3dvcmspCiAJCXByaXYtPmNmZy0+b3BzLT5saWItPnNldHVwX2RlZmVycmVkX3dvcmsocHJpdik7CkBAIC00MTAyLDYgKzQxMTIsNyBAQAogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0KTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNldF9wb3dlcl9zYXZlKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hbGl2ZV9zdGFydCk7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+YmVhY29uX3VwZGF0ZSk7CiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMpOwpAQCAtNDE1MCw3ICs0MTYxLDcgQEAKIAkucmVzZXRfdHNmID0gaXdsNDk2NV9tYWNfcmVzZXRfdHNmLAogCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsNDk2NV9ic3NfaW5mb19jaGFuZ2VkLAogCS5hbXBkdV9hY3Rpb24gPSBpd2w0OTY1X21hY19hbXBkdV9hY3Rpb24sCi0JLmh3X3NjYW4gPSBpd2w0OTY1X21hY19od19zY2FuCisJLmh3X3NjYW4gPSBpd2xfbWFjX2h3X3NjYW4KIH07CiAKIHN0YXRpYyBpbnQgaXdsNDk2NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCkBAIC00MjA0LDEzICs0MjE1LDEzIEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CiAJaWYgKCFlcnIpCi0JCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzYpKTsKIAlpZiAoZXJyKSB7Ci0JCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoIWVycikKLQkJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCS8qIGJvdGggYXR0ZW1wdHMgZmFpbGVkOiAqLwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIsCkBAIC00MjI1LDkgKzQyMzYsNiBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCi0JLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgMHgwMCk7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioKIAkgKiAzLiBSZWFkIFJFViByZWdpc3RlcgpAQCAtNDI0Nyw2ICs0MjU1LDEwIEBACiAJCSI6IERldGVjdGVkIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayAlcyBSRVY9MHglWFxuIiwKIAkJcHJpdi0+Y2ZnLT5uYW1lLCBwcml2LT5od19yZXYpOwogCisJLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKKwogCS8qIGFtcCBpbml0ICovCiAJZXJyID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwogCWlmIChlcnIgPCAwKSB7CkBAIC00NDgxLDcgKzQ0OTMsMTAgQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM1LCBQQ0lfQU5ZX0lELCBpd2w1MzAwX2Fnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM2LCBQQ0lfQU5ZX0lELCBpd2w1MzAwX2Fnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHg0MjM3LCBQQ0lfQU5ZX0lELCBpd2w1MTAwX2Fnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNBLCBQQ0lfQU5ZX0lELCBpd2w1MzUwX2Fnbl9jZmcpfSwKKy8qIDUzNTAgV2lGaS9XaU1heCAqLworCXtJV0xfUENJX0RFVklDRSgweDQyM0EsIDB4MTAwMSwgaXdsNTM1MF9hZ25fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4NDIzQSwgMHgxMDIxLCBpd2w1MzUwX2Fnbl9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg0MjNCLCAweDEwMTEsIGl3bDUzNTBfYWduX2NmZyl9LAogI2VuZGlmIC8qIENPTkZJR19JV0w1MDAwICovCiAJezB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNhbGliLmMKaW5kZXggZWY0OTQ0MC4uNzJmYmY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jYWxpYi5jCkBAIC02Niw2ICs2Niw2NiBAQAogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWNhbGliLmgiCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVCBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyBpbnQgaXdsX3NlbmRfY2FsaWJfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IGkgPSAwOworCisJc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0geworCQkuaWQgPSBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAorCQkubWV0YS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspCisJCWlmIChwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZikgeworCQkJaGNtZC5sZW4gPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW47CisJCQloY21kLmRhdGEgPSBwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZjsKKwkJCXJldCA9IGl3bF9zZW5kX2NtZF9zeW5jKHByaXYsICZoY21kKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnI7CisJCX0KKworCXJldHVybiAwOworZXJyOgorCUlXTF9FUlJPUigiRXJyb3IgJWQgaXRlcmF0aW9uICVkXG4iLCByZXQsIGkpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMpOworCitpbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQoreworCWlmIChyZXMtPmJ1Zl9sZW4gIT0gbGVuKSB7CisJCWtmcmVlKHJlcy0+YnVmKTsKKwkJcmVzLT5idWYgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJfQorCWlmICh1bmxpa2VseShyZXMtPmJ1ZiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMtPmJ1Zl9sZW4gPSBsZW47CisJbWVtY3B5KHJlcy0+YnVmLCBidWYsIGxlbik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGl3bF9jYWxpYl9zZXQpOworCit2b2lkIGl3bF9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgeworCQlrZnJlZShwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zik7CisJCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKKwkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuID0gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUlVOVElNRSBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qICJmYWxzZSBhbGFybXMiIGFyZSBzaWduYWxzIHRoYXQgb3VyIERTUCB0cmllcyB0byBsb2NrIG9udG8sCiAgKiAgIGJ1dCB0aGVuIGRldGVybWluZXMgdGhhdCB0aGV5IGFyZSBlaXRoZXIgbm9pc2UsIG9yIHRyYW5zbWlzc2lvbnMKICAqICAgZnJvbSBhIGRpc3RhbnQgd2lyZWxlc3MgbmV0d29yayAoYWxzbyAibm9pc2UiLCByZWFsbHkpIHRoYXQgZ2V0CkBAIC03NDgsMTMgKzgwOCwxMSBAQAogCQl9CiAJfQogCisJLyogU2F2ZSBmb3IgdXNlIHdpdGhpbiBSWE9OLCBUWCwgU0NBTiBjb21tYW5kcywgZXRjLiAqLworCXByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyA9IGFjdGl2ZV9jaGFpbnM7CiAJSVdMX0RFQlVHX0NBTElCKCJhY3RpdmVfY2hhaW5zIChiaXR3aXNlKSA9IDB4JXhcbiIsCiAJCQlhY3RpdmVfY2hhaW5zKTsKIAotCS8qIFNhdmUgZm9yIHVzZSB3aXRoaW4gUlhPTiwgVFgsIFNDQU4gY29tbWFuZHMsIGV0Yy4gKi8KLQkvKnByaXYtPnZhbGlkX2FudGVubmEgPSBhY3RpdmVfY2hhaW5zOyovCi0JLypGSVhNRTogc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiBSWCBjaGFpbnMgaW4gUlhPTiAqLwotCiAJLyogQW5hbHl6ZSBub2lzZSBmb3IgcnggYmFsYW5jZSAqLwogCWF2ZXJhZ2Vfbm9pc2VbMF0gPSAoKGRhdGEtPmNoYWluX25vaXNlX2EpL0NBTF9OVU1fT0ZfQkVBQ09OUyk7CiAJYXZlcmFnZV9ub2lzZVsxXSA9ICgoZGF0YS0+Y2hhaW5fbm9pc2VfYikvQ0FMX05VTV9PRl9CRUFDT05TKTsKQEAgLTc3OSw2ICs4MzcsMTUgQEAKIAogCXByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2Fpbl9jb21wdXRhdGlvbihwcml2LCBhdmVyYWdlX25vaXNlLAogCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksIG1pbl9hdmVyYWdlX25vaXNlKTsKKworCS8qIFNvbWUgcG93ZXIgY2hhbmdlcyBtYXkgaGF2ZSBiZWVuIG1hZGUgZHVyaW5nIHRoZSBjYWxpYnJhdGlvbi4KKwkgKiBVcGRhdGUgYW5kIGNvbW1pdCB0aGUgUlhPTgorCSAqLworCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MpCisJCXByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKKworCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0RPTkU7CisJaXdsX3Bvd2VyX2VuYWJsZV9tYW5hZ2VtZW50KHByaXYpOwogfQogRVhQT1JUX1NZTUJPTChpd2xfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaAppbmRleCAyOGI1YjA5Li44ZDA0ZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKQEAgLTE2Myw2ICsxNjMsMTMgQEAKIC8qIGl3bF9jbWRfaGVhZGVyIGZsYWdzIHZhbHVlICovCiAjZGVmaW5lIElXTF9DTURfRkFJTEVEX01TSyAweDQwCiAKKyNkZWZpbmUgU0VRX1RPX1FVRVVFKHMpCSgoKHMpID4+IDgpICYgMHgxZikKKyNkZWZpbmUgUVVFVUVfVE9fU0VRKHEpCSgoKHEpICYgMHgxZikgPDwgOCkKKyNkZWZpbmUgU0VRX1RPX0lOREVYKHMpCSgocykgJiAweGZmKQorI2RlZmluZSBJTkRFWF9UT19TRVEoaSkJKChpKSAmIDB4ZmYpCisjZGVmaW5lIFNFUV9IVUdFX0ZSQU1FCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHg0MDAwKQorI2RlZmluZSBTRVFfUlhfRlJBTUUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDgwMDApCisKIC8qKgogICogc3RydWN0IGl3bF9jbWRfaGVhZGVyCiAgKgpAQCAtMTcxLDcgKzE3OCw3IEBACiAgKi8KIHN0cnVjdCBpd2xfY21kX2hlYWRlciB7CiAJdTggY21kOwkJLyogQ29tbWFuZCBJRDogIFJFUExZX1JYT04sIGV0Yy4gKi8KLQl1OCBmbGFnczsJLyogSVdMX0NNRF8qICovCisJdTggZmxhZ3M7CS8qIDA6NSByZXNlcnZlZCwgNiBhYm9ydCwgNyBpbnRlcm5hbCAqLwogCS8qCiAJICogVGhlIGRyaXZlciBzZXRzIHVwIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gdmFsdWVzIG9mIGl0cyBjaG9zaW5nLgogCSAqIHVDb2RlIGRvZXMgbm90IHVzZSB0aGlzIHZhbHVlLCBidXQgcGFzc2VzIGl0IGJhY2sgdG8gdGhlIGRyaXZlcgpAQCAtMTg3LDExICsxOTQsMTIgQEAKIAkgKgogCSAqIFRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKIAkgKgotCSAqICAwOjcgICAgaW5kZXgvcG9zaXRpb24gd2l0aGluIFR4IHF1ZXVlCi0JICogIDg6MTMgICBUeCBxdWV1ZSBzZWxlY3Rpb24KLQkgKiAxNDoxNCAgIGRyaXZlciBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgY29tbWFuZCBpcyBpbiB0aGUgJ2h1Z2UnCi0JICogICAgICAgICBzdG9yYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgYnVmZmVycywgaS5lLiBzY2FuIGNtZAotCSAqIDE1OjE1ICAgdUNvZGUgc2V0cyB0aGlzIGluIHVDb2RlLW9yaWdpbmF0ZWQgcmVzcG9uc2Uvbm90aWZpY2F0aW9uCisJICogIDA6NwkJdGZkIGluZGV4IC0gcG9zaXRpb24gd2l0aGluIFRYIHF1ZXVlCisJICogIDg6MTIJVFggcXVldWUgaWQKKwkgKiAgMTMJCXJlc2VydmVkCisJICogIDE0CQlodWdlIC0gZHJpdmVyIHNldHMgdGhpcyB0byBpbmRpY2F0ZSBjb21tYW5kIGlzIGluIHRoZQorCSAqICAJCSdodWdlJyBzdG9yYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgYnVmZmVycworCSAqICAxNQkJdW5zb2xpY2l0ZWQgUlggb3IgdUNvZGUtb3JpZ2luYXRlZCBub3RpZmljYXRpb24KIAkgKi8KIAlfX2xlMTYgc2VxdWVuY2U7CiAKQEAgLTIwMjYsOCArMjAzNCw4IEBACiAgKiAgIGJpdCAyIC0gJzAnIFBNIGhhdmUgdG8gd2FsayB1cCBldmVyeSBEVElNCiAgKiAgICAgICAgICAgJzEnIFBNIGNvdWxkIHNsZWVwIG92ZXIgRFRJTSB0aWxsIGxpc3RlbiBJbnRlcnZhbC4KICAqIFBDSSBwb3dlciBtYW5hZ2VkCi0gKiAgIGJpdCAzIC0gJzAnIChQQ0lfTElOS19DVFJMICYgMHgxKQotICogICAgICAgICAgICcxJyAhKFBDSV9MSU5LX0NUUkwgJiAweDEpCisgKiAgIGJpdCAzIC0gJzAnIChQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKKyAqICAgICAgICAgICAnMScgIShQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKICAqIEZvcmNlIHNsZWVwIE1vZGVzCiAgKiAgIGJpdCAzMS8zMC0gJzAwJyB1c2UgYm90aCBtYWMveHRhbCBzbGVlcHMKICAqICAgICAgICAgICAgICAnMDEnIGZvcmNlIE1hYyBzbGVlcApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IDgwZjJmODQuLjRjMzEyYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKQEAgLTMwNiwxNCArMzA2LDE0IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gMDsKIAotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlpZiAocHJpdi0+cW9zX2RhdGEucW9zX2VuYWJsZSkKIAkJCXByaXYtPnFvc19kYXRhLnFvc19hY3RpdmUgPSAxOwogCQlpZiAoIShwcml2LT5hY3RpdmVfcmF0ZSAmIDB4ZmZmMCkpIHsKIAkJCWN3X21pbiA9IDMxOwogCQkJaXNfbGVnYWN5ID0gMTsKIAkJfQotCX0gZWxzZSBpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCX0gZWxzZSBpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlpZiAocHJpdi0+cW9zX2RhdGEucW9zX2VuYWJsZSkKIAkJCXByaXYtPnFvc19kYXRhLnFvc19hY3RpdmUgPSAxOwogCX0gZWxzZSBpZiAoIShwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJiBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKQEAgLTM5OSw4ICszOTksOCBAQAogCiAJaHRfaW5mby0+Y2FwIHw9ICh1MTYpSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEOwogCWh0X2luZm8tPmNhcCB8PSAodTE2KUlFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwotCWh0X2luZm8tPmNhcCB8PSAodTE2KShJRUVFODAyMTFfSFRfQ0FQX01JTU9fUFMgJgotCQkJICAgICAoSVdMX01JTU9fUFNfTk9ORSA8PCAyKSk7CisJaHRfaW5mby0+Y2FwIHw9ICh1MTYpKElFRUU4MDIxMV9IVF9DQVBfU01fUFMgJgorCQkJICAgICAoV0xBTl9IVF9DQVBfU01fUFNfRElTQUJMRUQgPDwgMikpOwogCiAJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzIwX01IWjsKIAlpZiAocHJpdi0+aHdfcGFyYW1zLmZhdF9jaGFubmVsICYgQklUKGJhbmQpKSB7CkBAIC02NDYsOCArNjQ2LDE0IEBACiAJc3RydWN0IGl3bF9yeG9uX2NtZCAqcnhvbiA9ICZwcml2LT5zdGFnaW5nX3J4b247CiAJdTMyIHZhbDsKIAotCWlmICghaHRfaW5mby0+aXNfaHQpCisJaWYgKCFodF9pbmZvLT5pc19odCkgeworCQlyeG9uLT5mbGFncyAmPSB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRF9NU0sgfAorCQkJUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDBfTVNLIHwKKwkJCVJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLIHwKKwkJCVJYT05fRkxHX0ZBVF9QUk9UX01TSyB8CisJCQlSWE9OX0ZMR19IVF9QUk9UX01TSyk7CiAJCXJldHVybjsKKwl9CiAKIAkvKiBTZXQgdXAgY2hhbm5lbCBiYW5kd2lkdGg6ICAyMCBNSHogb25seSwgb3IgMjAvNDAgbWl4ZWQgaWYgZmF0IG9rICovCiAJaWYgKGl3bF9pc19mYXRfdHhfYWxsb3dlZChwcml2LCBOVUxMKSkKQEAgLTY5Nyw4ICs3MDMsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3NldF9yeG9uX2h0KTsKIAotLyoKLSAqIERldGVybWluZSBob3cgbWFueSByZWNlaXZlci9hbnRlbm5hIGNoYWlucyB0byB1c2UuCisjZGVmaW5lIElXTF9OVU1fUlhfQ0hBSU5TX01VTFRJUExFCTMKKyNkZWZpbmUgSVdMX05VTV9SWF9DSEFJTlNfU0lOR0xFCTIKKyNkZWZpbmUgSVdMX05VTV9JRExFX0NIQUlOU19EVUFMCTIKKyNkZWZpbmUgSVdMX05VTV9JRExFX0NIQUlOU19TSU5HTEUJMQorCisvKiBEZXRlcm1pbmUgaG93IG1hbnkgcmVjZWl2ZXIvYW50ZW5uYSBjaGFpbnMgdG8gdXNlLgogICogTW9yZSBwcm92aWRlcyBiZXR0ZXIgcmVjZXB0aW9uIHZpYSBkaXZlcnNpdHkuICBGZXdlciBzYXZlcyBwb3dlci4KICAqIE1JTU8gKGR1YWwgc3RyZWFtKSByZXF1aXJlcyBhdCBsZWFzdCAyLCBidXQgd29ya3MgYmV0dGVyIHdpdGggMy4KICAqIFRoaXMgZG9lcyBub3QgZGV0ZXJtaW5lICp3aGljaCogY2hhaW5zIHRvIHVzZSwganVzdCBob3cgbWFueS4KQEAgLTcwOSwxMCArNzE5LDExIEBACiAJYm9vbCBpc19jYW0gPSAhdGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cyk7CiAKIAkvKiAjIG9mIFJ4IGNoYWlucyB0byB1c2Ugd2hlbiBleHBlY3RpbmcgTUlNTy4gKi8KLQlpZiAoaXNfc2luZ2xlIHx8ICghaXNfY2FtICYmIChwcml2LT5wc19tb2RlID09IElXTF9NSU1PX1BTX1NUQVRJQykpKQotCQlyZXR1cm4gMjsKKwlpZiAoaXNfc2luZ2xlIHx8ICghaXNfY2FtICYmIChwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbV9wcyA9PQorCQkJCQkJIFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykpKQorCQlyZXR1cm4gSVdMX05VTV9SWF9DSEFJTlNfU0lOR0xFOwogCWVsc2UKLQkJcmV0dXJuIDM7CisJCXJldHVybiBJV0xfTlVNX1JYX0NIQUlOU19NVUxUSVBMRTsKIH0KIAogc3RhdGljIGludCBpd2xfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgYWN0aXZlX2NudCkKQEAgLTcyMCwxNyArNzMxLDE5IEBACiAJaW50IGlkbGVfY250OwogCWJvb2wgaXNfY2FtID0gIXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwogCS8qICMgUnggY2hhaW5zIHdoZW4gaWRsaW5nIGFuZCBtYXliZSB0cnlpbmcgdG8gc2F2ZSBwb3dlciAqLwotCXN3aXRjaCAocHJpdi0+cHNfbW9kZSkgewotCWNhc2UgSVdMX01JTU9fUFNfU1RBVElDOgotCWNhc2UgSVdMX01JTU9fUFNfRFlOQU1JQzoKLQkJaWRsZV9jbnQgPSAoaXNfY2FtKSA/IDIgOiAxOworCXN3aXRjaCAocHJpdi0+Y3VycmVudF9odF9jb25maWcuc21fcHMpIHsKKwljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQzoKKwljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUM6CisJCWlkbGVfY250ID0gKGlzX2NhbSkgPyBJV0xfTlVNX0lETEVfQ0hBSU5TX0RVQUwgOgorCQkJCQlJV0xfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRTsKIAkJYnJlYWs7Ci0JY2FzZSBJV0xfTUlNT19QU19OT05FOgotCQlpZGxlX2NudCA9IChpc19jYW0pID8gYWN0aXZlX2NudCA6IDE7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9QU19ESVNBQkxFRDoKKwkJaWRsZV9jbnQgPSAoaXNfY2FtKSA/IGFjdGl2ZV9jbnQgOiBJV0xfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRTsKIAkJYnJlYWs7Ci0JY2FzZSBJV0xfTUlNT19QU19JTlZBTElEOgorCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfSU5WQUxJRDoKIAlkZWZhdWx0OgotCQlJV0xfRVJST1IoImludmFsaWRlIG1pbW8gcHMgbW9kZSAlZFxuIiwgcHJpdi0+cHNfbW9kZSk7CisJCUlXTF9FUlJPUigiaW52YWxpZGUgbWltbyBwcyBtb2RlICVkXG4iLAorCQkJICAgcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21fcHMpOwogCQlXQVJOX09OKDEpOwogCQlpZGxlX2NudCA9IC0xOwogCQlicmVhazsKQEAgLTczOCw2ICs3NTEsMTcgQEAKIAlyZXR1cm4gaWRsZV9jbnQ7CiB9CiAKKy8qIHVwIHRvIDQgY2hhaW5zICovCitzdGF0aWMgdTggaXdsX2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQoreworCXU4IHJlczsKKwlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDQpKSA+PiA0OworCXJldHVybiByZXM7Cit9CisKIC8qKgogICogaXdsX3NldF9yeG9uX2NoYWluIC0gU2V0IHVwIFJ4IGNoYWluIHVzYWdlIGluICJzdGFnaW5nIiBSWE9OIGltYWdlCiAgKgpAQCAtNzQ4LDM3ICs3NzIsNDcgQEAKIHsKIAlib29sIGlzX3NpbmdsZSA9IGlzX3NpbmdsZV9yeF9zdHJlYW0ocHJpdik7CiAJYm9vbCBpc19jYW0gPSAhdGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cyk7Ci0JdTggaWRsZV9yeF9jbnQsIGFjdGl2ZV9yeF9jbnQ7CisJdTggaWRsZV9yeF9jbnQsIGFjdGl2ZV9yeF9jbnQsIHZhbGlkX3J4X2NudDsKKwl1MzIgYWN0aXZlX2NoYWluczsKIAl1MTYgcnhfY2hhaW47CiAKIAkvKiBUZWxsIHVDb2RlIHdoaWNoIGFudGVubmFzIGFyZSBhY3R1YWxseSBjb25uZWN0ZWQuCiAJICogQmVmb3JlIGZpcnN0IGFzc29jaWF0aW9uLCB3ZSBhc3N1bWUgYWxsIGFudGVubmFzIGFyZSBjb25uZWN0ZWQuCiAJICogSnVzdCBhZnRlciBmaXJzdCBhc3NvY2lhdGlvbiwgaXdsX2NoYWluX25vaXNlX2NhbGlicmF0aW9uKCkKIAkgKiAgICBjaGVja3Mgd2hpY2ggYW50ZW5uYXMgYWN0dWFsbHkgKmFyZSogY29ubmVjdGVkLiAqLwotCXJ4X2NoYWluID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCA8PCBSWE9OX1JYX0NIQUlOX1ZBTElEX1BPUzsKKwkgaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKKwkJYWN0aXZlX2NoYWlucyA9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczsKKwllbHNlCisJCWFjdGl2ZV9jaGFpbnMgPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OworCisJcnhfY2hhaW4gPSBhY3RpdmVfY2hhaW5zIDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwogCiAJLyogSG93IG1hbnkgcmVjZWl2ZXJzIHNob3VsZCB3ZSB1c2U/ICovCiAJYWN0aXZlX3J4X2NudCA9IGl3bF9nZXRfYWN0aXZlX3J4X2NoYWluX2NvdW50KHByaXYpOwogCWlkbGVfcnhfY250ID0gaXdsX2dldF9pZGxlX3J4X2NoYWluX2NvdW50KHByaXYsIGFjdGl2ZV9yeF9jbnQpOwogCi0JLyogY29ycmVjdCByeCBjaGFpbiBjb3VudCBhY2NvcmlkbmcgaHcgc2V0dGluZ3MgKi8KLQlpZiAocHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPCBhY3RpdmVfcnhfY250KQotCQlhY3RpdmVfcnhfY250ID0gcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW07CiAKLQlpZiAocHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPCBpZGxlX3J4X2NudCkKLQkJaWRsZV9yeF9jbnQgPSBwcml2LT5od19wYXJhbXMucnhfY2hhaW5zX251bTsKKwkvKiBjb3JyZWN0IHJ4IGNoYWluIGNvdW50IGFjY29yZGluZyBodyBzZXR0aW5ncworCSAqIGFuZCBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbgorCSAqLworCXZhbGlkX3J4X2NudCA9IGl3bF9jb3VudF9jaGFpbl9iaXRtYXAoYWN0aXZlX2NoYWlucyk7CisJaWYgKHZhbGlkX3J4X2NudCA8IGFjdGl2ZV9yeF9jbnQpCisJCWFjdGl2ZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7CisKKwlpZiAodmFsaWRfcnhfY250IDwgaWRsZV9yeF9jbnQpCisJCWlkbGVfcnhfY250ID0gdmFsaWRfcnhfY250OwogCiAJcnhfY2hhaW4gfD0gYWN0aXZlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUzsKIAlyeF9jaGFpbiB8PSBpZGxlX3J4X2NudCAgPDwgUlhPTl9SWF9DSEFJTl9DTlRfUE9TOwogCiAJcHJpdi0+c3RhZ2luZ19yeG9uLnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOwogCi0JaWYgKCFpc19zaW5nbGUgJiYgKGFjdGl2ZV9yeF9jbnQgPj0gMikgJiYgaXNfY2FtKQorCWlmICghaXNfc2luZ2xlICYmIChhY3RpdmVfcnhfY250ID49IElXTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRSkgJiYgaXNfY2FtKQogCQlwcml2LT5zdGFnaW5nX3J4b24ucnhfY2hhaW4gfD0gUlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKIAllbHNlCiAJCXByaXYtPnN0YWdpbmdfcnhvbi5yeF9jaGFpbiAmPSB+UlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKIAotCUlXTF9ERUJVR19BU1NPQygicnhfY2hhaW49MHglWGkgYWN0aXZlPSVkIGlkbGU9JWRcbiIsCisJSVdMX0RFQlVHX0FTU09DKCJyeF9jaGFpbj0weCVYIGFjdGl2ZT0lZCBpZGxlPSVkXG4iLAogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLnJ4X2NoYWluLAogCQkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOwogCkBAIC03ODgsNyArODIyLDcgQEAKIEVYUE9SVF9TWU1CT0woaXdsX3NldF9yeG9uX2NoYWluKTsKIAogLyoqCi0gKiBpd2xjb3JlX3NldF9yeG9uX2NoYW5uZWwgLSBTZXQgdGhlIHBoeW1vZGUgYW5kIGNoYW5uZWwgdmFsdWVzIGluIHN0YWdpbmcgUlhPTgorICogaXdsX3NldF9yeG9uX2NoYW5uZWwgLSBTZXQgdGhlIHBoeW1vZGUgYW5kIGNoYW5uZWwgdmFsdWVzIGluIHN0YWdpbmcgUlhPTgogICogQHBoeW1vZGU6IE1PREVfSUVFRTgwMjExQSBzZXRzIHRvIDUuMkdIejsgYWxsIGVsc2Ugc2V0IHRvIDIuNEdIegogICogQGNoYW5uZWw6IEFueSBjaGFubmVsIHZhbGlkIGZvciB0aGUgcmVxdWVzdGVkIHBoeW1vZGUKIApAQCAtNzk3LDEwICs4MzEsMTEgQEAKICAqIE5PVEU6ICBEb2VzIG5vdCBjb21taXQgdG8gdGhlIGhhcmR3YXJlOyBpdCBzZXRzIGFwcHJvcHJpYXRlIGJpdCBmaWVsZHMKICAqIGluIHRoZSBzdGFnaW5nIFJYT04gZmxhZyBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBoeW1vZGUKICAqLwotaW50IGl3bF9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJdTE2IGNoYW5uZWwpCitpbnQgaXdsX3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoKQogeworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGNoLT5iYW5kOworCXUxNiBjaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoLT5jZW50ZXJfZnJlcSk7CisKIAlpZiAoIWl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGJhbmQsIGNoYW5uZWwpKSB7CiAJCUlXTF9ERUJVR19JTkZPKCJDb3VsZCBub3Qgc2V0IGNoYW5uZWwgdG8gJWQgWyVkXVxuIiwKIAkJCSAgICAgICBjaGFubmVsLCBiYW5kKTsKQEAgLTgzNCw2ICs4NjksMTAgQEAKIAkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KIAlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8CiAJCSAgICBJRUVFODAyMTFfSFdfTk9JU0VfREJNOworCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KKwkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CiAJLyogRGVmYXVsdCB2YWx1ZTsgNCBFRENBIFFPUyBwcmlvcml0aWVzICovCiAJaHctPnF1ZXVlcyA9IDQ7CiAJLyogcXVldWVzIHRvIHN1cHBvcnQgMTFuIGFnZ3JlZ2F0aW9uICovCkBAIC04OTEsNyArOTMwLDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cG93ZXJfZGF0YS5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5oY21kX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5scV9tbmdyLmxvY2spOwogCiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZyZWVfZnJhbWVzKTsKIApAQCAtOTA1LDEwICs5NDMsMTAgQEAKIAlwcml2LT5pZWVlX3JhdGVzID0gTlVMTDsKIAlwcml2LT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKIAotCXByaXYtPml3X21vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9TVEE7CisJcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CiAKIAlwcml2LT51c2VfYW50X2JfZm9yX21hbmFnZW1lbnRfZnJhbWUgPSAxOyAvKiBzdGFydCB3aXRoIGFudCBCICovCi0JcHJpdi0+cHNfbW9kZSA9IElXTF9NSU1PX1BTX05PTkU7CisJcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21fcHMgPSBXTEFOX0hUX0NBUF9TTV9QU19ESVNBQkxFRDsKIAogCS8qIENob29zZSB3aGljaCByZWNlaXZlcnMvYW50ZW5uYXMgdG8gdXNlICovCiAJaXdsX3NldF9yeG9uX2NoYWluKHByaXYpOwpAQCAtOTIyLDggKzk2MCw2IEBACiAJcHJpdi0+cW9zX2RhdGEucW9zX2FjdGl2ZSA9IDA7CiAJcHJpdi0+cW9zX2RhdGEucW9zX2NhcC52YWwgPSAwOwogCi0JaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgSUVFRTgwMjExX0JBTkRfMkdIWiwgNik7Ci0KIAlwcml2LT5yYXRlc19tYXNrID0gSVdMX1JBVEVTX01BU0s7CiAJLyogSWYgcG93ZXIgbWFuYWdlbWVudCBpcyB0dXJuZWQgb24sIGRlZmF1bHQgdG8gQUMgbW9kZSAqLwogCXByaXYtPnBvd2VyX21vZGUgPSBJV0xfUE9XRVJfQUM7CkBAIC05NTAsMjIgKzk4Niw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9pbml0X2Rydik7CiAKLXZvaWQgaXdsX2ZyZWVfY2FsaWJfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0cy5sb19yZXMpOwotCXByaXYtPmNhbGliX3Jlc3VsdHMubG9fcmVzID0gTlVMTDsKLQlwcml2LT5jYWxpYl9yZXN1bHRzLmxvX3Jlc19sZW4gPSAwOwotCi0Ja2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9yZXMpOwotCXByaXYtPmNhbGliX3Jlc3VsdHMudHhfaXFfcmVzID0gTlVMTDsKLQlwcml2LT5jYWxpYl9yZXN1bHRzLnR4X2lxX3Jlc19sZW4gPSAwOwotCi0Ja2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9wZXJkX3Jlcyk7Ci0JcHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9wZXJkX3JlcyA9IE5VTEw7Ci0JcHJpdi0+Y2FsaWJfcmVzdWx0cy50eF9pcV9wZXJkX3Jlc19sZW4gPSAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfZnJlZV9jYWxpYl9yZXN1bHRzKTsKLQogaW50IGl3bF9zZXRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzOCB0eF9wb3dlciwgYm9vbCBmb3JjZSkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTk5MywxMCArMTAxMyw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9zZXRfdHhfcG93ZXIpOwogCi0KIHZvaWQgaXdsX3VuaW5pdF9kcnYoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCWl3bF9mcmVlX2NhbGliX3Jlc3VsdHMocHJpdik7CisJaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhwcml2KTsKIAlpd2xjb3JlX2ZyZWVfZ2Vvcyhwcml2KTsKIAlpd2xfZnJlZV9jaGFubmVsX21hcChwcml2KTsKIAlrZnJlZShwcml2LT5zY2FuKTsKQEAgLTExNTAsNyArMTE2OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGl3bF92ZXJpZnlfdWNvZGUpOwogCi0KIHN0YXRpYyBjb25zdCBjaGFyICpkZXNjX2xvb2t1cChpbnQgaSkKIHsKIAlzd2l0Y2ggKGkpIHsKQEAgLTEyMzEsOSArMTI0OSw5IEBACiAvKioKICAqIGl3bF9wcmludF9ldmVudF9sb2cgLSBEdW1wIGVycm9yIGV2ZW50IGxvZyB0byBzeXNsb2cKICAqCi0gKiBOT1RFOiBNdXN0IGJlIGNhbGxlZCB3aXRoIGl3bDQ5NjVfZ3JhYl9uaWNfYWNjZXNzKCkgYWxyZWFkeSBvYnRhaW5lZCEKKyAqIE5PVEU6IE11c3QgYmUgY2FsbGVkIHdpdGggaXdsX2dyYWJfbmljX2FjY2VzcygpIGFscmVhZHkgb2J0YWluZWQhCiAgKi8KLXZvaWQgaXdsX3ByaW50X2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBzdGFydF9pZHgsCitzdGF0aWMgdm9pZCBpd2xfcHJpbnRfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHN0YXJ0X2lkeCwKIAkJCQl1MzIgbnVtX2V2ZW50cywgdTMyIG1vZGUpCiB7CiAJdTMyIGk7CkBAIC0xMjc0LDggKzEyOTIsNiBAQAogCQl9CiAJfQogfQotRVhQT1JUX1NZTUJPTChpd2xfcHJpbnRfZXZlbnRfbG9nKTsKLQogCiB2b2lkIGl3bF9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpAQCAtMTM5MSw3ICsxNDA3LDcgQEAKIAogCWl3bF9zY2FuX2NhbmNlbChwcml2KTsKIAkvKiBGSVhNRTogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIEFQICovCi0JaWYgKHByaXYtPml3X21vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCiAJCQkgICAgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDY0ZjEzOWUuLjI4OGI2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTE4NCwxNCArMTg0LDEwIEBACiBzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHN0cnVjdCBpd2xfY2ZnICpjZmcsCiAJCXN0cnVjdCBpZWVlODAyMTFfb3BzICpod19vcHMpOwogdm9pZCBpd2xfaHdfZGV0ZWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KIHZvaWQgaXdsX2NsZWFyX3N0YXRpb25zX3RhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9mcmVlX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX3Jlc2V0X3FvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfc2V0X3J4b25fY2hhbm5lbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJCXUxNiBjaGFubmVsKTsKK2ludCBpd2xfc2V0X3J4b25fY2hhbm5lbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2gpOwogdm9pZCBpd2xfc2V0X3J4b25faHQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2h0X2luZm8gKmh0X2luZm8pOwogdTggaXdsX2lzX2ZhdF90eF9hbGxvd2VkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKnN0YV9odF9pbmYpOwpAQCAtMjE4LDcgKzIxNCw2IEBACiBpbnQgaXdsX3J4X2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwogaW50IGl3bF9yeF9hZ2dfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCAqYWRkciwgaW50IHRpZCwgdTE2IHNzbik7CiBpbnQgaXdsX3J4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgdTggKmFkZHIsIGludCB0aWQpOwotLyogRklYTUU6IHJlbW92ZSB3aGVuIFRYIGlzIG1vdmVkIHRvIGl3bCBjb3JlICovCiBpbnQgaXdsX3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSk7CiB2b2lkIGl3bF9yeF9hbGxvY2F0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpAQCAtMjM3LDExICsyMzIsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IGl3bF90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotLyogRklYTUU6IHJlbW92ZSB3aGVuIGZyZWUgVHggaXMgZnVsbHkgbWVyZ2VkIGludG8gaXdsY29yZSAqLwotaW50IGl3bF9od190eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwogdm9pZCBpd2xfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnRmZCwKLQkJCQkJZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuKTsKIGludCBpd2xfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwogaW50IGl3bF90eF9hZ2dfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCAqcmEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKIGludCBpd2xfdHhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2ICwgY29uc3QgdTggKnJhLCB1MTYgdGlkKTsKQEAgLTI1Niw2ICsyNDcsNyBAQAogICogUkYgLUtpbGwgLSBoZXJlIGFuZCBub3QgaW4gaXdsLXJma2lsbC5oIHRvIGJlIGF2YWlsYWJsZSB3aGVuCiAgKiBSRi1raWxsIHN1YnN5c3RlbSBpcyBub3QgY29tcGlsZWQuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaXdsX3JmX2tpbGwoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX3JhZGlvX2tpbGxfc3dfZGlzYWJsZV9yYWRpbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9yYWRpb19raWxsX3N3X2VuYWJsZV9yYWRpbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCkBAIC0yODYsMTEgKzI3OCwxNyBAQAogdm9pZCBpd2xfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9zY2FuX2NhbmNlbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcyk7Ci1jb25zdCBjaGFyICppd2xfZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pOwogaW50IGl3bF9zY2FuX2luaXRpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbGlicmF0aW9ucyAtIGltcGxlbWVudGVkIGluIGl3bC1jYWxpYi5jCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2ludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pOwordm9pZCBpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICBTIGUgbiBkIGkgbiBnICAgICBIIG8gcyB0ICAgICBDIG8gbSBtIGEgbiBkIHMgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMTIsOCArMzEwLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9wcmludF9ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgc3RhcnRfaWR4LAotCQkJIHUzMiBudW1fZXZlbnRzLCB1MzIgbW9kZSk7CiB2b2lkIGl3bF9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX2R1bXBfbmljX2V2ZW50X2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCkBAIC0zMzcsOCArMzMzLDcgQEAKICNkZWZpbmUgU1RBVFVTX1NDQU5fSFcJCTE1CiAjZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKICNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwotI2RlZmluZSBTVEFUVVNfQ09ORl9QRU5ESU5HCTE4Ci0jZGVmaW5lIFNUQVRVU19NT0RFX1BFTkRJTkcJMTkKKyNkZWZpbmUgU1RBVFVTX01PREVfUEVORElORwkxOAogCiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9pc19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCmluZGV4IDUyNjI5ZmIuLjY2MmVkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCkBAIC02NCw3ICs2NCw3IEBACiAjZGVmaW5lIENTUl9CQVNFICAgICgweDAwMCkKIAogI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFRyAgICAoQ1NSX0JBU0UrMHgwMDApIC8qIGhhcmR3YXJlIGludGVyZmFjZSBjb25maWcgKi8KLSNkZWZpbmUgQ1NSX0lOVF9DT0FMRVNDSU5HICAgICAgKENTUl9CQVNFKzB4MDA0KSAvKiBhY2N1bSBpbnRzLCAzMi11c2VjIHVuaXRzICovCisjZGVmaW5lIENTUl9JTlRfQ09BTEVTQ0lORyAgICAgKENTUl9CQVNFKzB4MDA0KSAvKiBhY2N1bSBpbnRzLCAzMi11c2VjIHVuaXRzICovCiAjZGVmaW5lIENTUl9JTlQgICAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAwOCkgLyogaG9zdCBpbnRlcnJ1cHQgc3RhdHVzL2FjayAqLwogI2RlZmluZSBDU1JfSU5UX01BU0sgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMGMpIC8qIGhvc3QgaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSBDU1JfRkhfSU5UX1NUQVRVUyAgICAgICAoQ1NSX0JBU0UrMHgwMTApIC8qIGJ1c21hc3RlciBpbnQgc3RhdHVzL2FjayovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaAppbmRleCBkMmRhYTE3Li5lNTQ4ZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKQEAgLTExMCwxMSArMTEwLDEyIEBACiAgKgogICovCiAKLSNkZWZpbmUgSVdMX0RMX0lORk8gICAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgSVdMX0RMX01BQzgwMjExICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgSVdMX0RMX0hPU1RfQ09NTUFORCAgKDEgPDwgMikKLSNkZWZpbmUgSVdMX0RMX1NUQVRFICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgSVdMX0RMX0lORk8JCSgxIDw8IDApCisjZGVmaW5lIElXTF9ETF9NQUM4MDIxMQkJKDEgPDwgMSkKKyNkZWZpbmUgSVdMX0RMX0hDTUQJCSgxIDw8IDIpCisjZGVmaW5lIElXTF9ETF9TVEFURQkJKDEgPDwgMykKICNkZWZpbmUgSVdMX0RMX01BQ0RVTVAJCSgxIDw8IDQpCisjZGVmaW5lIElXTF9ETF9IQ01EX0RVTVAJKDEgPDwgNSkKICNkZWZpbmUgSVdMX0RMX1JBRElPICAgICAgICAgKDEgPDwgNykKICNkZWZpbmUgSVdMX0RMX1BPV0VSICAgICAgICAgKDEgPDwgOCkKICNkZWZpbmUgSVdMX0RMX1RFTVAgICAgICAgICAgKDEgPDwgOSkKQEAgLTE2Miw3ICsxNjMsOCBAQAogI2RlZmluZSBJV0xfREVCVUdfSVNSKGYsIGEuLi4pICAgIElXTF9ERUJVRyhJV0xfRExfSVNSLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfTEVEKGYsIGEuLi4pIElXTF9ERUJVRyhJV0xfRExfTEVELCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfV0VQKGYsIGEuLi4pICAgIElXTF9ERUJVRyhJV0xfRExfV0VQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSEMoZiwgYS4uLikgSVdMX0RFQlVHKElXTF9ETF9IT1NUX0NPTU1BTkQsIGYsICMjIGEpCisjZGVmaW5lIElXTF9ERUJVR19IQyhmLCBhLi4uKSBJV0xfREVCVUcoSVdMX0RMX0hDTUQsIGYsICMjIGEpCisjZGVmaW5lIElXTF9ERUJVR19IQ19EVU1QKGYsIGEuLi4pIElXTF9ERUJVRyhJV0xfRExfSENNRF9EVU1QLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfQ0FMSUIoZiwgYS4uLikgSVdMX0RFQlVHKElXTF9ETF9DQUxJQiwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0ZXKGYsIGEuLi4pIElXTF9ERUJVRyhJV0xfRExfRlcsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19SRl9LSUxMKGYsIGEuLi4pIElXTF9ERUJVRyhJV0xfRExfUkZfS0lMTCwgZiwgIyMgYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKaW5kZXggY2RmYjM0My4uYzAxODEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKQEAgLTIyNSwxMiArMjI1LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCi0jZGVmaW5lIFNFUV9UT19RVUVVRSh4KSAgKCh4ID4+IDgpICYgMHhiZikKLSNkZWZpbmUgUVVFVUVfVE9fU0VRKHgpICAoKHggJiAweGJmKSA8PCA4KQotI2RlZmluZSBTRVFfVE9fSU5ERVgoeCkgKCh1OCkoeCAmIDB4ZmYpKQotI2RlZmluZSBJTkRFWF9UT19TRVEoeCkgKCh1OCkoeCAmIDB4ZmYpKQotI2RlZmluZSBTRVFfSFVHRV9GUkFNRSAgKDB4NDAwMCkKLSNkZWZpbmUgU0VRX1JYX0ZSQU1FICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHg4MDAwKQogI2RlZmluZSBTRVFfVE9fU04oc2VxKSAoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQogI2RlZmluZSBTTl9UT19TRVEoc3NuKSAoKChzc24pIDw8IDQpICYgSUVFRTgwMjExX1NDVExfU0VRKQogI2RlZmluZSBNQVhfU04gKChJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCkBAIC00MTIsNiArNDA2LDcgQEAKIAkvKiBzZWxmIGNvbmZpZ3VyYXRpb24gZGF0YSAqLwogCXU4IGlzX2h0OwogCXU4IHN1cHBvcnRlZF9jaGFuX3dpZHRoOworCXU4IHNtX3BzOwogCXU4IGlzX2dyZWVuX2ZpZWxkOwogCXU4IHNnZjsJCQkvKiBIVF9TSE9SVF9HSV8qIHNob3J0IGd1YXJkIGludGVydmFsICovCiAJdTggbWF4X2Ftc2R1X3NpemU7CkBAIC01NzAsNTAgKzU2NSwzMSBAQAogI2RlZmluZSBJV0xfUlhfU1RBVFMoeCkgKCZ4LT51LnJ4X2ZyYW1lLnN0YXRzKQogI2RlZmluZSBJV0xfUlhfREFUQSh4KSAoSVdMX1JYX0hEUih4KS0+cGF5bG9hZCkKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGl3bC1iYXNlLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotICogZm9yIHVzZSBieSBpd2wtKi5jCisgKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gY29yZSBtb2R1bGUgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQorICogZm9yIHVzZSBieSBpd2wtWzQtNV0uYwogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBpd2xfYWRkc3RhX2NtZDsKLWV4dGVybiBpbnQgaXdsX3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKTsKLXU4IGl3bF9hZGRfc3RhdGlvbl9mbGFncyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4ICphZGRyLCBpbnQgaXNfYXAsCi0JCQkgdTggZmxhZ3MsIHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbyk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGl3bDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCQljb25zdCB1OCAqZGVzdCwgaW50IGxlZnQpOwotZXh0ZXJuIHZvaWQgaXdsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2w0OTY1X3NldF9wd3Jfc3JjKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZW51bSBpd2xfcHdyX3NyYyBzcmMpOwotZXh0ZXJuIGludCBpd2w0OTY1X3NldF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKmNtZCk7Ci0KLWV4dGVybiBjb25zdCB1OCBpd2xfYmNhc3RfYWRkcltFVEhfQUxFTl07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gaXdsLVszNF0qLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotICogZm9yIHVzZSBieSBpd2wtYmFzZS5jCi0gKgotICogTk9URTogIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGhhcmR3YXJlIHNwZWNpZmljCi0gKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpbGVzICh2cy4gaXdsLWJhc2UuYykKKyAqIE5PVEU6ICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaGFyZHdhcmUgc3BlY2lmaWMKKyAqIHdoaWNoIGlzIHdoeSB0aGV5IGFyZSBpbiB0aGUgY29yZSBtb2R1bGUgZmlsZXMuCiAgKgogICogTmFtaW5nIGNvbnZlbnRpb24gLS0KLSAqIGl3bDQ5NjVfICAgICAgICAgPC0tIEl0cyBwYXJ0IG9mIGl3bHdpZmkgKHNob3VsZCBiZSBjaGFuZ2VkIHRvIGl3bDQ5NjVfKQotICogaXdsNDk2NV9od18gICAgICA8LS0gSGFyZHdhcmUgc3BlY2lmaWMgKGltcGxlbWVudGVkIGluIGl3bC1YWFhYLmMgYnkgYWxsIEhXKQorICogaXdsXyAgICAgICAgIDwtLSBJcyBwYXJ0IG9mIGl3bHdpZmkKICAqIGl3bFhYWFhfICAgICA8LS0gSGFyZHdhcmUgc3BlY2lmaWMgKGltcGxlbWVudGVkIGluIGl3bC1YWFhYLmMgZm9yIFhYWFgpCiAgKiBpd2w0OTY1X2JnXyAgICAgIDwtLSBDYWxsZWQgZnJvbSB3b3JrIHF1ZXVlIGNvbnRleHQKICAqIGl3bDQ5NjVfbWFjXyAgICAgPC0tIG1hYzgwMjExIGNhbGxiYWNrCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQ7CitleHRlcm4gaW50IGl3bF9zZW5kX2FkZF9zdGEoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgIHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncyk7CitleHRlcm4gdTggaXdsX2FkZF9zdGF0aW9uX2ZsYWdzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgdTggKmFkZHIsCisJCQlpbnQgaXNfYXAsIHU4IGZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pOworZXh0ZXJuIHZvaWQgaXdsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK2V4dGVybiBpbnQgaXdsNDk2NV9zZXRfcHdyX3NyYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaXdsX3B3cl9zcmMgc3JjKTsKK2V4dGVybiBjb25zdCB1OCBpd2xfYmNhc3RfYWRkcltFVEhfQUxFTl07CiBleHRlcm4gaW50IGl3bF9yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogZXh0ZXJuIHZvaWQgaXdsX3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBpd2w0OTY1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGl3bF9mcmFtZSAqZnJhbWUsIHU4IHJhdGUpOwotZXh0ZXJuIHZvaWQgaXdsNDk2NV9kaXNhYmxlX2V2ZW50cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1leHRlcm4gaW50IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgY2hhbm5lbCk7CiBleHRlcm4gaW50IGl3bF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxKTsKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEsIGludCBpKQogewpAQCAtNjM2LDEyICs2MTIsNiBAQAogCiBzdHJ1Y3QgaXdsX3ByaXY7CiAKLS8qCi0gKiBGb3J3YXJkIGRlY2xhcmUgaXdsLTQ5NjUuYyBmdW5jdGlvbnMgZm9yIGl3bC1iYXNlLmMKLSAqLwotZXh0ZXJuIHZvaWQgaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bDQ5NjVfY2hlY2tfZW1wdHlfaHdfcXVldWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLAotCQkJCQl1OCB0aWQsIGludCB0eHFfaWQpOwogCiAvKiBTdHJ1Y3R1cmVzLCBlbnVtLCBhbmQgZGVmaW5lcyBzcGVjaWZpYyB0byB0aGUgNDk2NSAqLwogCkBAIC02NTYsMTEgKzYyNiw2IEBACiAjZGVmaW5lIElXTF9DSEFOTkVMX1dJRFRIXzIwTUhaICAgMAogI2RlZmluZSBJV0xfQ0hBTk5FTF9XSURUSF80ME1IWiAgIDEKIAotI2RlZmluZSBJV0xfTUlNT19QU19TVEFUSUMgICAgICAgIDAKLSNkZWZpbmUgSVdMX01JTU9fUFNfTk9ORSAgICAgICAgICAzCi0jZGVmaW5lIElXTF9NSU1PX1BTX0RZTkFNSUMgICAgICAgMQotI2RlZmluZSBJV0xfTUlNT19QU19JTlZBTElEICAgICAgIDIKLQogI2RlZmluZSBJV0xfT1BFUkFUSU9OX01PREVfQVVUTyAgICAgMAogI2RlZmluZSBJV0xfT1BFUkFUSU9OX01PREVfSFRfT05MWSAgMQogI2RlZmluZSBJV0xfT1BFUkFUSU9OX01PREVfTUlYRUQgICAgMgpAQCAtNjcxLDE4ICs2MzYsNiBAQAogCiAjZGVmaW5lIFRYX1BPV0VSX0lXTF9JTExFR0FMX1ZPTFRBR0UgLTEwMDAwCiAKLXN0cnVjdCBpd2w0OTY1X2xxX21uZ3IgewotCXNwaW5sb2NrX3QgbG9jazsKLQlzMzIgbWF4X3dpbmRvd19zaXplOwotCXMzMiAqZXhwZWN0ZWRfdHB0OwotCXU4ICpuZXh0X2hpZ2hlcl9yYXRlOwotCXU4ICpuZXh0X2xvd2VyX3JhdGU7Ci0JdW5zaWduZWQgbG9uZyBzdGFtcDsKLQl1bnNpZ25lZCBsb25nIHN0YW1wX2xhc3Q7Ci0JdTMyIGZsdXNoX3RpbWU7Ci0JdTMyIHR4X3BhY2tldHM7Ci19OwotCiAvKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KICNkZWZpbmUgSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMSkKICNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgpAQCAtNzI3LDggKzY4MCw5IEBACiAKIGVudW0gaXdsNDk2NV9jaGFpbl9ub2lzZV9zdGF0ZSB7CiAJSVdMX0NIQUlOX05PSVNFX0FMSVZFID0gMCwgIC8qIG11c3QgYmUgMCAqLwotCUlXTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFID0gMSwKLQlJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRCA9IDIsCisJSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEUsCisJSVdMX0NIQUlOX05PSVNFX0NBTElCUkFURUQsCisJSVdMX0NIQUlOX05PSVNFX0RPTkUsCiB9OwogCiBlbnVtIGl3bDQ5NjVfY2FsaWJfZW5hYmxlZF9zdGF0ZSB7CkBAIC03NDUsMTMgKzY5OSwxMCBAQAogCXUzMiBiZWFjb25fZW5lcmd5X2M7CiB9OwogCi1zdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdHMgewotCXZvaWQgKnR4X2lxX3JlczsKLQl2b2lkICp0eF9pcV9wZXJkX3JlczsKLQl2b2lkICpsb19yZXM7Ci0JdTMyIHR4X2lxX3Jlc19sZW47Ci0JdTMyIHR4X2lxX3BlcmRfcmVzX2xlbjsKLQl1MzIgbG9fcmVzX2xlbjsKKy8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCitzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7CisJdm9pZCAqYnVmOworCXNpemVfdCBidWZfbGVuOwogfTsKIAogZW51bSB1Y29kZV90eXBlIHsKQEAgLTc4OSwxNyArNzQwLDE4IEBACiAKIC8qIENoYWluIG5vaXNlIChkaWZmZXJlbnRpYWwgUnggZ2FpbikgY2FsaWIgZGF0YSAqLwogc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhIHsKLQl1OCBzdGF0ZTsKLQl1MTYgYmVhY29uX2NvdW50OworCXUzMiBhY3RpdmVfY2hhaW5zOwogCXUzMiBjaGFpbl9ub2lzZV9hOwogCXUzMiBjaGFpbl9ub2lzZV9iOwogCXUzMiBjaGFpbl9ub2lzZV9jOwogCXUzMiBjaGFpbl9zaWduYWxfYTsKIAl1MzIgY2hhaW5fc2lnbmFsX2I7CiAJdTMyIGNoYWluX3NpZ25hbF9jOworCXUxNiBiZWFjb25fY291bnQ7CiAJdTggZGlzY29ubl9hcnJheVtOVU1fUlhfQ0hBSU5TXTsKIAl1OCBkZWx0YV9nYWluX2NvZGVbTlVNX1JYX0NIQUlOU107CiAJdTggcmFkaW9fd3JpdGU7CisJdTggc3RhdGU7CiB9OwogCiAjZGVmaW5lCUVFUFJPTV9TRU1fVElNRU9VVCAxMAkJLyogbWlsbGlzZWNvbmRzICovCkBAIC04MTMsNiArNzY1LDcgQEAKIAogCiAjZGVmaW5lIElXTF9NQVhfTlVNX1FVRVVFUwkyMCAvKiBGSVhNRTogZG8gZHluYW1pYyBhbGxvY2F0aW9uICovCisjZGVmaW5lIElXTF9DQUxJQl9NQVggIDMKIAogc3RydWN0IGl3bF9wcml2IHsKIApAQCAtODI4LDcgKzc4MSw2IEBACiAKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAJaW50IGFsbG9jX3J4Yl9za2I7Ci0JYm9vbCBhZGRfcmFkaW90YXA7CiAKIAl2b2lkICgqcnhfaGFuZGxlcnNbUkVQTFlfTUFYXSkoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7CkBAIC04NTcsNyArODA5LDcgQEAKIAlzMzIgbGFzdF90ZW1wZXJhdHVyZTsKIAogCS8qIGluaXQgY2FsaWJyYXRpb24gcmVzdWx0cyAqLwotCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0cyBjYWxpYl9yZXN1bHRzOworCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSVdMX0NBTElCX01BWF07CiAKIAkvKiBTY2FuIHJlbGF0ZWQgdmFyaWFibGVzICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5famlmZmllczsKQEAgLTkzOSw5ICs4OTEsNiBAQAogCXU4IGxhc3RfcGh5X3Jlc1sxMDBdOwogCiAJLyogUmF0ZSBzY2FsaW5nIGRhdGEgKi8KLQlzdHJ1Y3QgaXdsNDk2NV9scV9tbmdyIGxxX21uZ3I7Ci0KLQkvKiBSYXRlIHNjYWxpbmcgZGF0YSAqLwogCXM4IGRhdGFfcmV0cnlfbGltaXQ7CiAJdTggcmV0cnlfcmF0ZTsKIApAQCAtMTAwNSw3ICs5NTQsNyBAQAogCXU4ICplZXByb207CiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaW5mbyAqY2FsaWJfaW5mbzsKIAotCWVudW0gaWVlZTgwMjExX2lmX3R5cGVzIGl3X21vZGU7CisJZW51bSBubDgwMjExX2lmdHlwZSBpd19tb2RlOwogCiAJc3RydWN0IHNrX2J1ZmYgKmlic3NfYmVhY29uOwogCkBAIC0xMDI1LDcgKzk3NCw2IEBACiAJICogaGFyZHdhcmUgKi8KIAl1MTYgYXNzb2NfaWQ7CiAJdTE2IGFzc29jX2NhcGFiaWxpdHk7Ci0JdTggcHNfbW9kZTsKIAogCXN0cnVjdCBpd2xfcW9zX2luZm8gcW9zX2RhdGE7CiAKQEAgLTEwNDcsNiArOTk1LDcgQEAKIAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfdGFza2xldDsKIAorCXN0cnVjdCBkZWxheWVkX3dvcmsgc2V0X3Bvd2VyX3NhdmU7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OwogCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZmguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmgKaW5kZXggY2QxMWMwYy4uYTcyZWZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZmguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1maC5oCkBAIC0yNDcsOCArMjQ3LDggQEAKICNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJEQkNfU0laRV9NU0sgKDB4MDBGMDAwMDApIC8qIGJpdHMgMjAtMjMgKi8KICNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfRE1BX0NITkxfRU5fTVNLICgweEMwMDAwMDAwKSAvKiBiaXRzIDMwLTMxKi8KIAotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX0JJVFNISUZUCSgyMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfUkVHX0lSUV9SQlRIX0JJVFNISUZUCSg0KQorI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX1BPUwkoMjApCisjZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MJKDQpCiAjZGVmaW5lIFJYX1JCX1RJTUVPVVQJKDB4MTApCiAKICNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9WQUwgICAgICAgICAoMHgwMDAwMDAwMCkKQEAgLTI2MCw4ICsyNjAsOSBAQAogI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTJLICAgKDB4MDAwMjAwMDApCiAjZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV8xNksgICAoMHgwMDAzMDAwMCkKIAotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9OT19JTlRfVkFMICAgICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9JTlRfSE9TVF9WQUwgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0lHTk9SRV9SWEZfRU1QVFkgICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9OT19JTlRfVkFMICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9JTlRfSE9TVF9WQUwgICgweDAwMDAxMDAwKQogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jCmluZGV4IDJlYjAzZWUuLjgzMDBmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oY21kLmMKQEAgLTEyMCw4ICsxMjAsMTggQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JSVdMX0RFQlVHX0hDKCJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCQlnZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7CisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKwlzd2l0Y2ggKGNtZC0+aGRyLmNtZCkgeworCWNhc2UgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRDoKKwljYXNlIFNFTlNJVElWSVRZX0NNRDoKKwkJSVdMX0RFQlVHX0hDX0RVTVAoImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKKwkJCQlnZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7CisJCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVdMX0RFQlVHX0hDKCJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCisJCQkJZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCX0KKyNlbmRpZgogCiAJLyogTGV0IGl3bF90eF9jb21wbGV0ZSBmcmVlIHRoZSByZXNwb25zZSBza2IgKi8KIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oCmluZGV4IDViYzNkZjQuLjk3NDBmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaApAQCAtNjEsNyArNjEsNyBAQAogICoKICAqLwogCi0jZGVmaW5lIF9pd2xfd3JpdGUzMihwcml2LCBvZnMsIHZhbCkgd3JpdGVsKCh2YWwpLCAocHJpdiktPmh3X2Jhc2UgKyAob2ZzKSkKKyNkZWZpbmUgX2l3bF93cml0ZTMyKHByaXYsIG9mcywgdmFsKSBpb3dyaXRlMzIoKHZhbCksIChwcml2KS0+aHdfYmFzZSArIChvZnMpKQogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pd2xfd3JpdGUzMihjb25zdCBjaGFyICpmLCB1MzIgbCwgc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSB1MzIgb2ZzLCB1MzIgdmFsKQpAQCAtNzUsNyArNzUsNyBAQAogI2RlZmluZSBpd2xfd3JpdGUzMihwcml2LCBvZnMsIHZhbCkgX2l3bF93cml0ZTMyKHByaXYsIG9mcywgdmFsKQogI2VuZGlmCiAKLSNkZWZpbmUgX2l3bF9yZWFkMzIocHJpdiwgb2ZzKSByZWFkbCgocHJpdiktPmh3X2Jhc2UgKyAob2ZzKSkKKyNkZWZpbmUgX2l3bF9yZWFkMzIocHJpdiwgb2ZzKSBpb3JlYWQzMigocHJpdiktPmh3X2Jhc2UgKyAob2ZzKSkKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwogc3RhdGljIGlubGluZSB1MzIgX19pd2xfcmVhZDMyKGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMpCiB7CkBAIC0xNTUsMjggKzE1NSwxMCBAQAogc3RhdGljIGlubGluZSBpbnQgX2l3bF9ncmFiX25pY19hY2Nlc3Moc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCWludCByZXQ7Ci0JdTMyIGdwX2N0bDsKLQogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCiAJaWYgKGF0b21pY19yZWFkKCZwcml2LT5yZXN0cmljdF9yZWZjbnQpKQogCQlyZXR1cm4gMDsKICNlbmRpZgotCWlmICh0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfU1csICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9XQVJOSU5HKCJXQVJOSU5HOiBSZXF1ZXN0aW5nIE1BQyBhY2Nlc3MgZHVyaW5nIFJGS0lMTCAiCi0JCQkid2FrZXMgdXAgTklDXG4iKTsKLQotCQkvKiAxMCBtc2VjIGFsbG93cyB0aW1lIGZvciBOSUMgdG8gY29tcGxldGUgaXRzIGRhdGEgc2F2ZSAqLwotCQlncF9jdGwgPSBfaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpOwotCQlpZiAoZ3BfY3RsICYgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSkgewotCQkJSVdMX0RFQlVHX1JGX0tJTEwoIldhaXQgZm9yIGNvbXBsZXRlIHBvd2VyLWRvd24sICIKLQkJCQkiZ3BjdGwgPSAweCUwOHhcbiIsIGdwX2N0bCk7Ci0JCQltZGVsYXkoMTApOwotCQl9IGVsc2UKLQkJCUlXTF9ERUJVR19SRl9LSUxMKCJwb3dlci1kb3duIGNvbXBsZXRlLCAiCi0JCQkJCSAgImdwY3RsID0gMHglMDh4XG4iLCBncF9jdGwpOwotCX0KLQogCS8qIHRoaXMgYml0IHdha2VzIHVwIHRoZSBOSUMgKi8KIAlfaXdsX3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwogCXJldCA9IF9pd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmMKaW5kZXggYTA5OWM5ZS4uNjBhMDNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jCkBAIC0xNTIsOSArMTUyLDEwIEBACiAvKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgKi8KIHN0YXRpYyBpbnQgaXdsX3Bvd2VyX2luaXRfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpbnQgcmV0ID0gMCwgaTsKIAlzdHJ1Y3QgaXdsX3Bvd2VyX21nciAqcG93X2RhdGE7CiAJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9wb3dlcl92ZWNfZW50cnkpICogSVdMX1BPV0VSX01BWDsKKwlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kICpjbWQ7CisJaW50IGk7CiAJdTE2IHBjaV9wbTsKIAogCUlXTF9ERUJVR19QT1dFUigiSW5pdGlhbGl6ZSBwb3dlciBcbiIpOwpAQCAtMTY3LDI1ICsxNjgsMTkgQEAKIAltZW1jcHkoJnBvd19kYXRhLT5wd3JfcmFuZ2VfMVswXSwgJnJhbmdlXzFbMF0sIHNpemUpOwogCW1lbWNweSgmcG93X2RhdGEtPnB3cl9yYW5nZV8yWzBdLCAmcmFuZ2VfMlswXSwgc2l6ZSk7CiAKLQlyZXQgPSBwY2lfcmVhZF9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LAotCQkJCSAgUENJX0xJTktfQ1RSTCwgJnBjaV9wbSk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAqY21kOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHByaXYtPnBjaV9kZXYsIFBDSV9DRkdfTElOS19DVFJMLCAmcGNpX3BtKTsKIAotCQlJV0xfREVCVUdfUE9XRVIoImFkanVzdCBwb3dlciBjb21tYW5kIGZsYWdzXG4iKTsKKwlJV0xfREVCVUdfUE9XRVIoImFkanVzdCBwb3dlciBjb21tYW5kIGZsYWdzXG4iKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1BPV0VSX01BWDsgaSsrKSB7Ci0JCQljbWQgPSAmcG93X2RhdGEtPnB3cl9yYW5nZV8wW2ldLmNtZDsKKwlmb3IgKGkgPSAwOyBpIDwgSVdMX1BPV0VSX01BWDsgaSsrKSB7CisJCWNtZCA9ICZwb3dfZGF0YS0+cHdyX3JhbmdlXzBbaV0uY21kOwogCi0JCQlpZiAocGNpX3BtICYgMHgxKQotCQkJCWNtZC0+ZmxhZ3MgJj0gfklXTF9QT1dFUl9QQ0lfUE1fTVNLOwotCQkJZWxzZQotCQkJCWNtZC0+ZmxhZ3MgfD0gSVdMX1BPV0VSX1BDSV9QTV9NU0s7Ci0JCX0KKwkJaWYgKHBjaV9wbSAmIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4pCisJCQljbWQtPmZsYWdzICY9IH5JV0xfUE9XRVJfUENJX1BNX01TSzsKKwkJZWxzZQorCQkJY21kLT5mbGFncyB8PSBJV0xfUE9XRVJfUENJX1BNX01TSzsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogYWRqdXN0IHBvd2VyIGNvbW1hbmQgYWNjb3JkaW5nIHRvIGR0aW0gcGVyaW9kIGFuZCBwb3dlciBsZXZlbCovCkBAIC0yNTUsMTcgKzI1MCwyNiBAQAogCiAKIC8qCi0gKiBjYWx1Y2F1dGUgdGhlIGZpbmFsIHBvd2VyIG1vZGUgaW5kZXgKKyAqIGNvbXB1dGUgdGhlIGZpbmFsIHBvd2VyIG1vZGUgaW5kZXgKICAqLwotaW50IGl3bF9wb3dlcl91cGRhdGVfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHJlZnJlc2gpCitpbnQgaXdsX3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgaXdsX3Bvd2VyX21nciAqc2V0dGluZyA9ICYocHJpdi0+cG93ZXJfZGF0YSk7CiAJaW50IHJldCA9IDA7CiAJdTE2IHVuaW5pdGlhbGl6ZWRfdmFyKGZpbmFsX21vZGUpOwogCi0gICAgICAgLyogSWYgb24gYmF0dGVyeSwgc2V0IHRvIDMsCi0JKiBpZiBwbHVnZ2VkIGludG8gQUMgcG93ZXIsIHNldCB0byBDQU0gKCJjb250aW51b3VzbHkgYXdhcmUgbW9kZSIpLAotCSogZWxzZSB1c2VyIGxldmVsICovCisJLyogRG9uJ3QgdXBkYXRlIHRoZSBSWCBjaGFpbiB3aGVuIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uIGlzIHJ1bm5pbmcgKi8KKwlpZiAocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSAhPSBJV0xfQ0hBSU5fTk9JU0VfRE9ORSAmJgorCSAgICBwcml2LT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlICE9IElXTF9DSEFJTl9OT0lTRV9BTElWRSkgeworCQlJV0xfREVCVUdfUE9XRVIoIkNhbm5vdCB1cGRhdGUgdGhlIHBvd2VyLCBjaGFpbiBub2lzZSAiCisJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCisJCQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogSWYgb24gYmF0dGVyeSwgc2V0IHRvIDMsCisJICogaWYgcGx1Z2dlZCBpbnRvIEFDIHBvd2VyLCBzZXQgdG8gQ0FNICgiY29udGludW91c2x5IGF3YXJlIG1vZGUiKSwKKwkgKiBlbHNlIHVzZXIgbGV2ZWwgKi8KIAogCXN3aXRjaCAoc2V0dGluZy0+c3lzdGVtX3Bvd2VyX3NldHRpbmcpIHsKIAljYXNlIElXTF9QT1dFUl9TWVNfQVVUTzoKQEAgLTI4NiwxMSArMjkwLDExIEBACiAJCWZpbmFsX21vZGUgPSBzZXR0aW5nLT5jcml0aWNhbF9wb3dlcl9zZXR0aW5nOwogCiAJLyogZHJpdmVyIG9ubHkgc3VwcG9ydCBDQU0gZm9yIG5vbiBTVEEgbmV0d29yayAqLwotCWlmIChwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlmaW5hbF9tb2RlID0gSVdMX1BPV0VSX01PREVfQ0FNOwogCiAJaWYgKCFpd2xfaXNfcmZraWxsKHByaXYpICYmICFzZXR0aW5nLT5wb3dlcl9kaXNhYmxlZCAmJgotCSAgICAoKHNldHRpbmctPnBvd2VyX21vZGUgIT0gZmluYWxfbW9kZSkgfHwgcmVmcmVzaCkpIHsKKwkgICAgKChzZXR0aW5nLT5wb3dlcl9tb2RlICE9IGZpbmFsX21vZGUpIHx8IGZvcmNlKSkgewogCQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIGNtZDsKIAogCQlpZiAoZmluYWxfbW9kZSAhPSBJV0xfUE9XRVJfTU9ERV9DQU0pCkBAIC0zMjQsNyArMzI4LDcgQEAKICAqIHRoaXMgd2lsbCBiZSB1c2VmdWxsIGZvciByYXRlIHNjYWxlIHRvIGRpc2FibGUgUE0gZHVyaW5nIGhlYXZ5CiAgKiBUeC9SeCBhY3Rpdml0aWVzCiAgKi8KLWludCBpd2xfcG93ZXJfZGlzYWJsZV9tYW5hZ2VtZW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK2ludCBpd2xfcG93ZXJfZGlzYWJsZV9tYW5hZ2VtZW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG1zKQogewogCXUxNiBwcmV2X21vZGU7CiAJaW50IHJldCA9IDA7CkBAIC0zMzcsNiArMzQxLDExIEBACiAJcmV0ID0gaXdsX3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIDApOwogCXByaXYtPnBvd2VyX2RhdGEucG93ZXJfZGlzYWJsZWQgPSAxOwogCXByaXYtPnBvd2VyX2RhdGEudXNlcl9wb3dlcl9zZXR0aW5nID0gcHJldl9tb2RlOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNldF9wb3dlcl9zYXZlKTsKKwlpZiAobXMpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zZXRfcG93ZXJfc2F2ZSwKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKG1zKSk7CisKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zNTksMzUgKzM2OCwyNiBAQAogLyogc2V0IHVzZXJfcG93ZXJfc2V0dGluZyAqLwogaW50IGl3bF9wb3dlcl9zZXRfdXNlcl9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IG1vZGUpCiB7Ci0JaW50IHJldCA9IDA7Ci0KIAlpZiAobW9kZSA+IElXTF9QT1dFUl9MSU1JVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcml2LT5wb3dlcl9kYXRhLnVzZXJfcG93ZXJfc2V0dGluZyA9IG1vZGU7CiAKLQlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgMCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKGl3bF9wb3dlcl9zZXRfdXNlcl9tb2RlKTsKIAotCiAvKiBzZXQgc3lzdGVtX3Bvd2VyX3NldHRpbmcuIFRoaXMgc2hvdWxkIGJlIHNldCBieSBvdmVyIGFsbAogICogUE0gYXBwbGljYXRpb24uCiAgKi8KIGludCBpd2xfcG93ZXJfc2V0X3N5c3RlbV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IG1vZGUpCiB7Ci0JaW50IHJldCA9IDA7Ci0KIAlpZiAobW9kZSA+IElXTF9QT1dFUl9MSU1JVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcml2LT5wb3dlcl9kYXRhLnN5c3RlbV9wb3dlcl9zZXR0aW5nID0gbW9kZTsKIAotCXJldCA9IGl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCAwKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCAwKTsKIH0KIEVYUE9SVF9TWU1CT0woaXdsX3Bvd2VyX3NldF9zeXN0ZW1fbW9kZSk7CiAKQEAgLTQzMSwzICs0MzEsMzUgQEAKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChpd2xfcG93ZXJfdGVtcGVyYXR1cmVfY2hhbmdlKTsKKworc3RhdGljIHZvaWQgaXdsX2JnX3NldF9wb3dlcl9zYXZlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQlzdHJ1Y3QgaXdsX3ByaXYsIHNldF9wb3dlcl9zYXZlLndvcmspOworCUlXTF9ERUJVRyhJV0xfRExfU1RBVEUsICJ1cGRhdGUgcG93ZXJcbiIpOworCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisKKwkvKiBvbiBzdGFydGluZyBhc3NvY2lhdGlvbiB3ZSBkaXNhYmxlIHBvd2VyIG1hbmFnbWVudAorCSAqIHVudGlsIGFzc29jaWF0aW9uLCBpZiBhc3NvY2lhdGlvbiBmYWlsZWQgdGhlbiB0aGlzCisJICogdGltZXIgd2lsbCBleHBpcmUgYW5kIGVuYWJsZSBQTSBhZ2Fpbi4KKwkgKi8KKwlpZiAoIWl3bF9pc19hc3NvY2lhdGVkKHByaXYpKQorCQlpd2xfcG93ZXJfZW5hYmxlX21hbmFnZW1lbnQocHJpdik7CisKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKK30KK3ZvaWQgaXdsX3NldHVwX3Bvd2VyX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5zZXRfcG93ZXJfc2F2ZSwgaXdsX2JnX3NldF9wb3dlcl9zYXZlKTsKK30KK0VYUE9SVF9TWU1CT0woaXdsX3NldHVwX3Bvd2VyX2RlZmVycmVkX3dvcmspOworCit2b2lkIGl3bF9wb3dlcl9jYW5jZWxfdGltZW91dChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2V0X3Bvd2VyX3NhdmUpOworfQorRVhQT1JUX1NZTUJPTChpd2xfcG93ZXJfY2FuY2VsX3RpbWVvdXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmgKaW5kZXggYWJjYmJmOS4uZGY0ODRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5oCkBAIC03MiwxNCArNzIsMTYgQEAKIAkvKiBmaW5hbCBwb3dlciBsZXZlbCB0aGF0IHVzZWQgdG8gY2FsY3VsYXRlIGZpbmFsIHBvd2VyIGNvbW1hbmQgKi8KIAl1OCBwb3dlcl9tb2RlOwogCXU4IHVzZXJfcG93ZXJfc2V0dGluZzsgLyogc2V0IGJ5IHVzZXIgdGhyb3VnaCBtYWM4MDIxMSBvciBzeXNmcyAqLwotCXU4IHN5c3RlbV9wb3dlcl9zZXR0aW5nOyAvKiBzZXQgYnkga2VybmVsIHN5YXRlbSB0b29scyAqLworCXU4IHN5c3RlbV9wb3dlcl9zZXR0aW5nOyAvKiBzZXQgYnkga2VybmVsIHN5c3RlbSB0b29scyAqLwogCXU4IGNyaXRpY2FsX3Bvd2VyX3NldHRpbmc7IC8qIHNldCBpZiBkcml2ZXIgb3ZlciBoZWF0ZWQgKi8KIAl1OCBpc19iYXR0ZXJ5X2FjdGl2ZTsgLyogREMvQUMgcG93ZXIgKi8KIAl1OCBwb3dlcl9kaXNhYmxlZDsgLyogZmxhZyB0byBkaXNhYmxlIHVzaW5nIHBvd2VyIHNhdmluZyBsZXZlbCAqLwogfTsKIAotaW50IGl3bF9wb3dlcl91cGRhdGVfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHJlZnJlc2gpOwotaW50IGl3bF9wb3dlcl9kaXNhYmxlX21hbmFnZW1lbnQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsX3NldHVwX3Bvd2VyX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsX3Bvd2VyX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CitpbnQgaXdsX3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSk7CitpbnQgaXdsX3Bvd2VyX2Rpc2FibGVfbWFuYWdlbWVudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBtcyk7CiBpbnQgaXdsX3Bvd2VyX2VuYWJsZV9tYW5hZ2VtZW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgaXdsX3Bvd2VyX3NldF91c2VyX21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgbW9kZSk7CiBpbnQgaXdsX3Bvd2VyX3NldF9zeXN0ZW1fbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBtb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1yeC5jCmluZGV4IGU4MWJmYzQuLjdjZGU5ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcnguYwpAQCAtMzc2LDcgKzM3Niw5IEBACiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCByYl9zaXplOworCXUzMiByYl9zaXplOworCWNvbnN0IHUzMiByZmRubG9nID0gUlhfUVVFVUVfU0laRV9MT0c7IC8qIDI1NiBSQkRzICovCisJY29uc3QgdTMyIHJiX3RpbWVvdXQgPSAwOyAvKiBGSVhNRTogUlhfUkJfVElNRU9VVCB3aHkgdGhpcyBzdGFsbHMgUlggKi8KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcmV0ID0gaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKQEAgLTM5OCwyNiArNDAwLDMyIEBACiAKIAkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIFJCRCBjaXJjdWxhciBidWZmZXIgaW4gRFJBTSAqLwogCWl3bF93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRywKLQkJCSAgIHJ4cS0+ZG1hX2FkZHIgPj4gOCk7CisJCQkgICAodTMyKShyeHEtPmRtYV9hZGRyID4+IDgpKTsKIAogCS8qIFRlbGwgZGV2aWNlIHdoZXJlIGluIERSQU0gdG8gdXBkYXRlIGl0cyBSeCBzdGF0dXMgKi8KIAlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKIAkJCSAgIChwcml2LT5zaGFyZWRfcGh5cyArIHByaXYtPnJiX2Nsb3NlZF9vZmZzZXQpID4+IDQpOwogCi0JLyogRW5hYmxlIFJ4IERNQSwgZW5hYmxlIGhvc3QgaW50ZXJydXB0LCBSeCBidWZmZXIgc2l6ZSA0aywgMjU2IFJCRHMgKi8KKwkvKiBFbmFibGUgUnggRE1BCisJICogRkhfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZIGlzIHNldCBiZWN1YXNlIG9mIEhXIGJ1ZyBpbgorCSAqICAgICAgdGhlIGNyZWRpdCBtZWNoYW5pc20gaW4gNTAwMCBIVyBSWCBGSUZPCisJICogRGlyZWN0IHJ4IGludGVycnVwdHMgdG8gaG9zdHMKKwkgKiBSeCBidWZmZXIgc2l6ZSA0IG9yIDhrCisJICogUkIgdGltZW91dCAweDEwCisJICogMjU2IFJCRHMKKwkgKi8KIAlpd2xfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywKIAkJCSAgIEZIX1JDU1JfUlhfQ09ORklHX0NITkxfRU5fRU5BQkxFX1ZBTCB8CisJCQkgICBGSF9SQ1NSX0NITkwwX1JYX0lHTk9SRV9SWEZfRU1QVFkgfAogCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKLQkJCSAgIHJiX3NpemUgfAotCQkJICAgICAvKiAweDEwIDw8IDQgfCAqLwotCQkJICAgKFJYX1FVRVVFX1NJWkVfTE9HIDw8Ci0JCQkgICAgICBGSF9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX0JJVFNISUZUKSk7Ci0KLQkvKgotCSAqIGl3bF93cml0ZTMyKHByaXYsQ1NSX0lOVF9DT0FMX1JFRywwKTsKLQkgKi8KKwkJCSAgIHJiX3NpemV8CisJCQkgICAocmJfdGltZW91dCA8PCBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfSVJRX1JCVEhfUE9TKXwKKwkJCSAgIChyZmRubG9nIDw8IEZIX1JDU1JfUlhfQ09ORklHX1JCRENCX1NJWkVfUE9TKSk7CiAKIAlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOworCisJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9DT0FMRVNDSU5HLCAweDQwKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtNzg5LDEwNyArNzk3LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpd2xfYWRkX3JhZGlvdGFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgc3RydWN0IGl3bF9yeF9waHlfcmVzICpyeF9zdGFydCwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzLAotCQkJCSB1MzIgYW1wZHVfc3RhdHVzKQotewotCXM4IHNpZ25hbCA9IHN0YXRzLT5zaWduYWw7Ci0Jczggbm9pc2UgPSAwOwotCWludCByYXRlID0gc3RhdHMtPnJhdGVfaWR4OwotCXU2NCB0c2YgPSBzdGF0cy0+bWFjdGltZTsKLQlfX2xlMTYgYW50ZW5uYTsKLQlfX2xlMTYgcGh5X2ZsYWdzX2h3ID0gcnhfc3RhcnQtPnBoeV9mbGFnczsKLQlzdHJ1Y3QgaXdsNDk2NV9ydF9yeF9oZHIgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBydF9oZHI7Ci0JCV9fbGU2NCBydF90c2Y7CQkvKiBUU0YgKi8KLQkJdTggcnRfZmxhZ3M7CQkvKiByYWRpb3RhcCBwYWNrZXQgZmxhZ3MgKi8KLQkJdTggcnRfcmF0ZTsJCS8qIHJhdGUgaW4gNTAwa2IvcyAqLwotCQlfX2xlMTYgcnRfY2hhbm5lbE1IejsJLyogY2hhbm5lbCBpbiBNSHogKi8KLQkJX19sZTE2IHJ0X2NoYml0bWFzazsJLyogY2hhbm5lbCBiaXRmaWVsZCAqLwotCQlzOCBydF9kYm1zaWduYWw7CS8qIHNpZ25hbCBpbiBkQm0sIGtsdWdlZCB0byBzaWduZWQgKi8KLQkJczggcnRfZGJtbm9pc2U7Ci0JCXU4IHJ0X2FudGVubmE7CQkvKiBhbnRlbm5hIG51bWJlciAqLwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICppd2w0OTY1X3J0OwotCi0JLyogVE9ETzogV2Ugd29uJ3QgaGF2ZSBlbm91Z2ggaGVhZHJvb20gZm9yIEhUIGZyYW1lcy4gRml4IGl0IGxhdGVyLiAqLwotCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHNpemVvZigqaXdsNDk2NV9ydCkpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAibm90IGVub3VnaCBoZWFkcm9vbSBbJWRdIGZvciAiCi0JCQkgICAgICAgInJhZGlvdGFwIGhlYWQgWyV6ZF1cbiIsCi0JCQkgICAgICAgc2tiX2hlYWRyb29tKHNrYiksIHNpemVvZigqaXdsNDk2NV9ydCkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogcHV0IHJhZGlvdGFwIGhlYWRlciBpbiBmcm9udCBvZiA4MDIuMTEgaGVhZGVyIGFuZCBkYXRhICovCi0JaXdsNDk2NV9ydCA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBzaXplb2YoKml3bDQ5NjVfcnQpKTsKLQotCS8qIGluaXRpYWxpc2UgcmFkaW90YXAgaGVhZGVyICovCi0JaXdsNDk2NV9ydC0+cnRfaGRyLml0X3ZlcnNpb24gPSBQS1RIRFJfUkFESU9UQVBfVkVSU0lPTjsKLQlpd2w0OTY1X3J0LT5ydF9oZHIuaXRfcGFkID0gMDsKLQotCS8qIHRvdGFsIGhlYWRlciArIGRhdGEgKi8KLQlwdXRfdW5hbGlnbmVkX2xlMTYoc2l6ZW9mKCppd2w0OTY1X3J0KSwgJml3bDQ5NjVfcnQtPnJ0X2hkci5pdF9sZW4pOwotCi0JLyogSW5kaWNhdGUgYWxsIHRoZSBmaWVsZHMgd2UgYWRkIHRvIHRoZSByYWRpb3RhcCBoZWFkZXIgKi8KLQlwdXRfdW5hbGlnbmVkX2xlMzIoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpIHwKLQkJCSAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAotCQkJICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpIHwKLQkJCSAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMKSB8Ci0JCQkgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCkgfAotCQkJICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSkgfAotCQkJICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEpLAotCQkJICAgJihpd2w0OTY1X3J0LT5ydF9oZHIuaXRfcHJlc2VudCkpOwotCi0JLyogWmVybyB0aGUgZmxhZ3MsIHdlJ2xsIGFkZCB0byB0aGVtIGFzIHdlIGdvICovCi0JaXdsNDk2NV9ydC0+cnRfZmxhZ3MgPSAwOwotCi0JcHV0X3VuYWxpZ25lZF9sZTY0KHRzZiwgJml3bDQ5NjVfcnQtPnJ0X3RzZik7Ci0KLQlpd2w0OTY1X3J0LT5ydF9kYm1zaWduYWwgPSBzaWduYWw7Ci0JaXdsNDk2NV9ydC0+cnRfZGJtbm9pc2UgPSBub2lzZTsKLQotCS8qIENvbnZlcnQgdGhlIGNoYW5uZWwgZnJlcXVlbmN5IGFuZCBzZXQgdGhlIGZsYWdzICovCi0JcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUxNihzdGF0cy0+ZnJlcSksICZpd2w0OTY1X3J0LT5ydF9jaGFubmVsTUh6KTsKLQlpZiAoIShwaHlfZmxhZ3NfaHcgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSkKLQkJcHV0X3VuYWxpZ25lZF9sZTE2KElFRUU4MDIxMV9DSEFOX09GRE0gfCBJRUVFODAyMTFfQ0hBTl81R0haLAotCQkJCSAgICZpd2w0OTY1X3J0LT5ydF9jaGJpdG1hc2spOwotCWVsc2UgaWYgKHBoeV9mbGFnc19odyAmIFJYX1JFU19QSFlfRkxBR1NfTU9EX0NDS19NU0spCi0JCXB1dF91bmFsaWduZWRfbGUxNihJRUVFODAyMTFfQ0hBTl9DQ0sgfCBJRUVFODAyMTFfQ0hBTl8yR0haLAotCQkJCSAgICZpd2w0OTY1X3J0LT5ydF9jaGJpdG1hc2spOwotCWVsc2UJLyogODAyLjExZyAqLwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoSUVFRTgwMjExX0NIQU5fT0ZETSB8IElFRUU4MDIxMV9DSEFOXzJHSFosCi0JCQkJICAgJml3bDQ5NjVfcnQtPnJ0X2NoYml0bWFzayk7Ci0KLQlpZiAocmF0ZSA9PSAtMSkKLQkJaXdsNDk2NV9ydC0+cnRfcmF0ZSA9IDA7Ci0JZWxzZQotCQlpd2w0OTY1X3J0LT5ydF9yYXRlID0gaXdsX3JhdGVzW3JhdGVdLmllZWU7Ci0KLQkvKgotCSAqICJhbnRlbm5hIG51bWJlciIKLQkgKgotCSAqIEl0IHNlZW1zIHRoYXQgdGhlIGFudGVubmEgZmllbGQgaW4gdGhlIHBoeSBmbGFncyB2YWx1ZQotCSAqIGlzIGFjdHVhbGx5IGEgYml0ZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAotCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgotCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgotCSAqCi0JICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm91ciBvZiBhCi0JICogbmV3IDgwMi4xMW4gcmFkaW90YXAgZmllbGQgIlJYIGNoYWlucyIgdGhhdCBpcyBkZWZpbmVkCi0JICogYXMgYSBiaXRtYXNrLgotCSAqLwotCWFudGVubmEgPSBwaHlfZmxhZ3NfaHcgJiBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLOwotCWl3bDQ5NjVfcnQtPnJ0X2FudGVubmEgPSBsZTE2X3RvX2NwdShhbnRlbm5hKSA+PiA0OwotCi0JLyogc2V0IHRoZSBwcmVhbWJsZSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKHBoeV9mbGFnc19odyAmIFJYX1JFU19QSFlfRkxBR1NfU0hPUlRfUFJFQU1CTEVfTVNLKQotCQlpd2w0OTY1X3J0LT5ydF9mbGFncyB8PSBJRUVFODAyMTFfUkFESU9UQVBfRl9TSE9SVFBSRTsKLQotCXN0YXRzLT5mbGFnIHw9IFJYX0ZMQUdfUkFESU9UQVA7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bF91cGRhdGVfcnhfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmMsIHUxNiBsZW4pCiB7CiAJLyogMCAtIG1nbXQsIDEgLSBjbnQsIDIgLSBkYXRhICovCkBAIC0xMDc0LDkgKzk4MSw2IEBACiAJICAgIGl3bF9zZXRfZGVjcnlwdGVkX2ZsYWcocHJpdiwgaGRyLCBhbXBkdV9zdGF0dXMsIHN0YXRzKSkKIAkJcmV0dXJuOwogCi0JaWYgKHByaXYtPmFkZF9yYWRpb3RhcCkKLQkJaXdsX2FkZF9yYWRpb3RhcChwcml2LCByeGItPnNrYiwgcnhfc3RhcnQsIHN0YXRzLCBhbXBkdV9zdGF0dXMpOwotCiAJaXdsX3VwZGF0ZV9yeF9zdGF0cyhwcml2LCBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpLCBsZW4pOwogCWllZWU4MDIxMV9yeF9pcnFzYWZlKHByaXYtPmh3LCByeGItPnNrYiwgc3RhdHMpOwogCXByaXYtPmFsbG9jX3J4Yl9za2ItLTsKQEAgLTExMzAsMTAgKzEwMzQsMTAgQEAKIAkvKiBGaWx0ZXIgaW5jb21pbmcgcGFja2V0cyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgdGFyZ2V0ZWQgdG93YXJkCiAJICogdGhpcyBuZXR3b3JrLCBkaXNjYXJkaW5nIHBhY2tldHMgY29taW5nIGZyb20gb3Vyc2VsdmVzICovCiAJc3dpdGNoIChwcml2LT5pd19tb2RlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOiAvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOiAvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KIAkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KIAkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMywgcHJpdi0+YnNzaWQpOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOiAvKiBIZWFkZXI6IERlc3QuIHwgQVB7QlNTSUR9IHwgU291cmNlICovCisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOiAvKiBIZWFkZXI6IERlc3QuIHwgQVB7QlNTSUR9IHwgU291cmNlICovCiAJCS8qIHBhY2tldHMgdG8gb3VyIElCU1MgdXBkYXRlIGluZm9ybWF0aW9uICovCiAJCXJldHVybiAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjIsIHByaXYtPmJzc2lkKTsKIAlkZWZhdWx0OgpAQCAtMTE3MSw3ICsxMDc1LDYgQEAKIAlpZiAocnhfc3RhdHVzLmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJcnhfc3RhdHVzLnJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7CiAKLQlyeF9zdGF0dXMuYW50ZW5uYSA9IDA7CiAJcnhfc3RhdHVzLmZsYWcgPSAwOwogCiAJLyogVFNGIGlzbid0IHJlbGlhYmxlLiBJbiBvcmRlciB0byBhbGxvdyBzbW9vdGggdXNlciBleHBlcmllbmNlLApAQCAtMTI1Myw4ICsxMTU2LDI4IEBACiAJCXJ4X3N0YXR1cy5zaWduYWwsIHJ4X3N0YXR1cy5ub2lzZSwgcnhfc3RhdHVzLnNpZ25hbCwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylyeF9zdGF0dXMubWFjdGltZSk7CiAKKwkvKgorCSAqICJhbnRlbm5hIG51bWJlciIKKwkgKgorCSAqIEl0IHNlZW1zIHRoYXQgdGhlIGFudGVubmEgZmllbGQgaW4gdGhlIHBoeSBmbGFncyB2YWx1ZQorCSAqIGlzIGFjdHVhbGx5IGEgYml0ZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAorCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgorCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKKwkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgorCSAqCisJICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm91ciBvZiBhCisJICogbmV3IDgwMi4xMW4gcmFkaW90YXAgZmllbGQgIlJYIGNoYWlucyIgdGhhdCBpcyBkZWZpbmVkCisJICogYXMgYSBiaXRtYXNrLgorCSAqLworCXJ4X3N0YXR1cy5hbnRlbm5hID0gbGUxNl90b19jcHUocnhfc3RhcnQtPnBoeV9mbGFncyAmCisJCQkJCVJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+IDQ7CisKKwkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocnhfc3RhcnQtPnBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfU0hPUlRfUFJFQU1CTEVfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOworCiAJLyogVGFrZSBzaG9ydGN1dCB3aGVuIG9ubHkgaW4gbW9uaXRvciBtb2RlICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikgeworCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJaXdsX3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHByaXYsIGluY2x1ZGVfcGh5LAogCQkJCQkJIHJ4YiwgJnJ4X3N0YXR1cyk7CiAJCXJldHVybjsKQEAgLTEyNzEsNyArMTE5NCw3IEBACiAJc3dpdGNoIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7CiAJY2FzZSBJRUVFODAyMTFfRlRZUEVfTUdNVDoKIAljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCQlpd2xfdXBkYXRlX3BzX21vZGUocHJpdiwgZmMgICYgSUVFRTgwMjExX0ZDVExfUE0sCiAJCQkJCQloZWFkZXItPmFkZHIyKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKaW5kZXggNmM4YWMzYS4uM2IwYmVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYwpAQCAtODgsNyArODgsNyBAQAogCiAKIAotY29uc3QgY2hhciAqaXdsX2VzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKQorc3RhdGljIGNvbnN0IGNoYXIgKml3bF9lc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikKIHsKIAlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOwogCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKQEAgLTExMSw3ICsxMTEsNiBAQAogCSpkID0gJ1wwJzsKIAlyZXR1cm4gZXNjYXBlZDsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2VzY2FwZV9lc3NpZCk7CiAKIC8qKgogICogaXdsX3NjYW5fY2FuY2VsIC0gQ2FuY2VsIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIEhXIHNjYW4KQEAgLTQ2NCwxMSArNDYzLDYgQEAKIAogaW50IGl3bF9zY2FuX2luaXRpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgewotCQlJV0xfRVJST1IoIkFQcyBkb24ndCBzY2FuLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmICghaXdsX2lzX3JlYWR5X3JmKHByaXYpKSB7CiAJCUlXTF9ERUJVR19TQ0FOKCJBYm9ydGluZyBzY2FuIGR1ZSB0byBub3QgcmVhZHkuXG4iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC00ODAsOCArNDc0LDcgQEAKIAl9CiAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKCJTY2FuIHJlcXVlc3Qgd2hpbGUgYWJvcnQgcGVuZGluZy4gICIKLQkJCSAgICAgICAiUXVldWluZy5cbiIpOworCQlJV0xfREVCVUdfU0NBTigiU2NhbiByZXF1ZXN0IHdoaWxlIGFib3J0IHBlbmRpbmdcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTcxMCw3ICs3MDMsNyBAQAogCXUxNiBjbWRfbGVuOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAl1OCBuX3Byb2JlcyA9IDI7Ci0JdTggcnhfY2hhaW4gPSAweDc7IC8qIGJpdG1hcDogQUJDIGNoYWlucyAqLworCXU4IHJ4X2NoYWluID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKIAogCWNvbmYgPSBpZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwogCkBAIC04NTAsNyArODQzLDcgQEAKIAogCQkvKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgKDB4NikgZm9yIHNjYW4gUnggZm9yIDQ5NjUKIAkJICogQXZvaWQgQSAoMHgxKSBiZWNhdXNlIG9mIGl0cyBvZmYtY2hhbm5lbCByZWNlcHRpb24gb24gQS1iYW5kLgotCQkgKiBNSU1PIGlzIG5vdCB1c2VkIGhlcmUsIGJ1dCB2YWx1ZSBpcyByZXF1aXJlZCAqLworCQkgKi8KIAkJaWYgKChwcml2LT5od19yZXYgJiBDU1JfSFdfUkVWX1RZUEVfTVNLKSA9PSBDU1JfSFdfUkVWX1RZUEVfNDk2NSkKIAkJCXJ4X2NoYWluID0gMHg2OwogCX0gZWxzZSB7CkBAIC04NTgsNiArODUxLDcgQEAKIAkJZ290byBkb25lOwogCX0KIAorCS8qIE1JTU8gaXMgbm90IHVzZWQgaGVyZSwgYnV0IHZhbHVlIGlzIHJlcXVpcmVkICovCiAJc2Nhbi0+cnhfY2hhaW4gPSBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9NU0sgfAogCQkJCWNwdV90b19sZTE2KCgweDcgPDwgUlhPTl9SWF9DSEFJTl9WQUxJRF9QT1MpIHwKIAkJCQkocnhfY2hhaW4gPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TKSB8CkBAIC04NjksNyArODYzLDcgQEAKIAogCXNjYW4tPnR4X2NtZC5sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKIAotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX01OVFIpCisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKIAkJc2Nhbi0+ZmlsdGVyX2ZsYWdzID0gUlhPTl9GSUxURVJfUFJPTUlTQ19NU0s7CiAKIAlzY2FuLT5maWx0ZXJfZmxhZ3MgfD0gKFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLIHwKQEAgLTkyMiwxMCArOTE2LDI5IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9iZ19zY2FuX2NvbXBsZXRlZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwgc2Nhbl9jb21wbGV0ZWQpOworCisJSVdMX0RFQlVHX1NDQU4oIlNDQU4gY29tcGxldGUgc2NhblxuIik7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCisJCXJldHVybjsKKworCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChwcml2LT5odyk7CisKKwkvKiBTaW5jZSBzZXR0aW5nIHRoZSBUWFBPV0VSIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgKi8KKwltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJaXdsX3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCwgdHJ1ZSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Cit9CisKKwogdm9pZCBpd2xfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQkvKiAgRklYTUU6IG1vdmUgaGVyZSB3aGVuIHJlc29sdmVkIFBFTkRJTkcKLQkgKiAgSU5JVF9XT1JLKCZwcml2LT5zY2FuX2NvbXBsZXRlZCwgaXdsX2JnX3NjYW5fY29tcGxldGVkKTsgKi8KKwlJTklUX1dPUksoJnByaXYtPnNjYW5fY29tcGxldGVkLCBpd2xfYmdfc2Nhbl9jb21wbGV0ZWQpOwogCUlOSVRfV09SSygmcHJpdi0+cmVxdWVzdF9zY2FuLCBpd2xfYmdfcmVxdWVzdF9zY2FuKTsKIAlJTklUX1dPUksoJnByaXYtPmFib3J0X3NjYW4sIGl3bF9iZ19hYm9ydF9zY2FuKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXdsX2JnX3NjYW5fY2hlY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdGEuYwppbmRleCA2MjgzYTNhLi42MTc5N2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdGEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdGEuYwpAQCAtNDcsOCArNDcsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgfHwKLQkgICAgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApKQorCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgfHwKKwkgICAgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApKQogCQlzdGFydCA9IElXTF9TVEFfSUQ7CiAKIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkcikpCkBAIC03NCw3ICs3NCw3IEBACiAKIGludCBpd2xfZ2V0X3JhX3N0YV9pZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCiB7Ci0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSB7CisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewogCQlyZXR1cm4gSVdMX0FQX0lEOwogCX0gZWxzZSB7CiAJCXU4ICpkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAJaWYgKCFzdGFfaHRfaW5mIHx8ICFzdGFfaHRfaW5mLT5odF9zdXBwb3J0ZWQpCiAJCWdvdG8gZG9uZTsKIAotCW1pbW9fcHNfbW9kZSA9IChzdGFfaHRfaW5mLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX01JTU9fUFMpID4+IDI7CisJbWltb19wc19tb2RlID0gKHN0YV9odF9pbmYtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDI7CiAKIAlzdGFfZmxhZ3MgPSBwcml2LT5zdGF0aW9uc1tpbmRleF0uc3RhLnN0YXRpb25fZmxhZ3M7CiAKIAlzdGFfZmxhZ3MgJj0gfihTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLIHwgU1RBX0ZMR19NSU1PX0RJU19NU0spOwogCiAJc3dpdGNoIChtaW1vX3BzX21vZGUpIHsKLQljYXNlIFdMQU5fSFRfQ0FQX01JTU9fUFNfU1RBVElDOgorCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDOgogCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19NSU1PX0RJU19NU0s7CiAJCWJyZWFrOwotCWNhc2UgV0xBTl9IVF9DQVBfTUlNT19QU19EWU5BTUlDOgorCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQzoKIAkJc3RhX2ZsYWdzIHw9IFNUQV9GTEdfUlRTX01JTU9fUFJPVF9NU0s7CiAJCWJyZWFrOwotCWNhc2UgV0xBTl9IVF9DQVBfTUlNT19QU19ESVNBQkxFRDoKKwljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlJV0xfV0FSTklORygiSW52YWxpZCBNSU1PIFBTIG1vZGUgJWRcbiIsIG1pbW9fcHNfbW9kZSk7CkBAIC0yODYsNyArMjg2LDcgQEAKIAogCS8qIEJDQVNUIHN0YXRpb24gYW5kIElCU1Mgc3RhdGlvbnMgZG8gbm90IHdvcmsgaW4gSFQgbW9kZSAqLwogCWlmIChzdGFfaWQgIT0gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZCAmJgotCSAgICBwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJICAgIHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCWl3bF9zZXRfaHRfYWRkX3N0YXRpb24ocHJpdiwgc3RhX2lkLCBodF9pbmZvKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKQEAgLTgxNyw3ICs4MTcsNyBAQAogCX07CiAKIAlpZiAoKGxxLT5zdGFfaWQgPT0gMHhGRikgJiYKLQkgICAgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykpCisJICAgIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobHEtPnN0YV9pZCA9PSAweEZGKQpAQCAtOTA0LDcgKzkwNCw3IEBACiAKIAlpZiAoKGlzX2FwKSAmJgogCSAgICAoY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9TVVBQT1JUX0hUX01PREUpICYmCi0JICAgIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkpCisJICAgIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQogCQlzdGFfaWQgPSBpd2xfYWRkX3N0YXRpb25fZmxhZ3MocHJpdiwgYWRkciwgaXNfYXAsCiAJCQkJCQkgICAwLCBjdXJfaHRfY29uZmlnKTsKIAllbHNlCkBAIC05MzgsMTEgKzkzOCwxMSBAQAogCiAJLyogSWYgd2UgYXJlIGEgY2xpZW50IHN0YXRpb24gaW4gYSBCU1MgbmV0d29yaywgdXNlIHRoZSBzcGVjaWFsCiAJICogQVAgc3RhdGlvbiBlbnRyeSAodGhhdCdzIHRoZSBvbmx5IHN0YXRpb24gd2UgY29tbXVuaWNhdGUgd2l0aCkgKi8KLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCXJldHVybiBJV0xfQVBfSUQ7CiAKIAkvKiBJZiB3ZSBhcmUgYW4gQVAsIHRoZW4gZmluZCB0aGUgc3RhdGlvbiwgb3IgdXNlIEJDQVNUICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQlzdGFfaWQgPSBpd2xfZmluZF9zdGF0aW9uKHByaXYsIGhkci0+YWRkcjEpOwogCQlpZiAoc3RhX2lkICE9IElXTF9JTlZBTElEX1NUQVRJT04pCiAJCQlyZXR1cm4gc3RhX2lkOwpAQCAtOTUwLDcgKzk1MCw3IEBACiAKIAkvKiBJZiB0aGlzIGZyYW1lIGlzIGdvaW5nIG91dCB0byBhbiBJQlNTIG5ldHdvcmssIGZpbmQgdGhlIHN0YXRpb24sCiAJICogb3IgY3JlYXRlIGEgbmV3IHN0YXRpb24gdGFibGUgZW50cnkgKi8KLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJc3RhX2lkID0gaXdsX2ZpbmRfc3RhdGlvbihwcml2LCBoZHItPmFkZHIxKTsKIAkJaWYgKHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKQogCQkJcmV0dXJuIHN0YV9pZDsKQEAgLTk2OCw2ICs5NjgsMTEgQEAKIAkJaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9EUk9QLCAodTggKikgaGRyLCBzaXplb2YoKmhkcikpOwogCQlyZXR1cm4gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZDsKIAorCS8qIElmIHdlIGFyZSBpbiBtb25pdG9yIG1vZGUsIHVzZSBCQ0FTVC4gVGhpcyBpcyByZXF1aXJlZCBmb3IKKwkgKiBwYWNrZXQgaW5qZWN0aW9uLiAqLworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJcmV0dXJuIHByaXYtPmh3X3BhcmFtcy5iY2FzdF9zdGFfaWQ7CisKIAlkZWZhdWx0OgogCQlJV0xfV0FSTklORygiVW5rbm93biBtb2RlIG9mIG9wZXJhdGlvbjogJWRcbiIsIHByaXYtPml3X21vZGUpOwogCQlyZXR1cm4gcHJpdi0+aHdfcGFyYW1zLmJjYXN0X3N0YV9pZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCmluZGV4IDc4YjFhN2EuLjkwN2E1M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYwpAQCAtNjMsNyArNjMsNyBAQAogICogRG9lcyBOT1QgYWR2YW5jZSBhbnkgVEZEIGNpcmN1bGFyIGJ1ZmZlciByZWFkL3dyaXRlIGluZGV4ZXMKICAqIERvZXMgTk9UIGZyZWUgdGhlIFRGRCBpdHNlbGYgKHdoaWNoIGlzIHdpdGhpbiBjaXJjdWxhciBidWZmZXIpCiAgKi8KLWludCBpd2xfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQorc3RhdGljIGludCBpd2xfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQogewogCXN0cnVjdCBpd2xfdGZkX2ZyYW1lICpiZF90bXAgPSAoc3RydWN0IGl3bF90ZmRfZnJhbWUgKikmdHhxLT5iZFswXTsKIAlzdHJ1Y3QgaXdsX3RmZF9mcmFtZSAqYmQgPSAmYmRfdG1wW3R4cS0+cS5yZWFkX3B0cl07CkBAIC0xMTUsMTAgKzExNSw4IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChpd2xfaHdfdHhxX2ZyZWVfdGZkKTsKIAotCi1pbnQgaXdsX2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnB0ciwKK3N0YXRpYyBpbnQgaXdsX2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnB0ciwKIAkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuKQogewogCWludCBpbmRleCwgaXNfb2RkOwpAQCAtMTI2LDcgKzEyNCw3IEBACiAJdTMyIG51bV90YnMgPSBJV0xfR0VUX0JJVFMoKnRmZCwgbnVtX3Ricyk7CiAKIAkvKiBFYWNoIFRGRCBjYW4gcG9pbnQgdG8gYSBtYXhpbXVtIDIwIFR4IGJ1ZmZlcnMgKi8KLQlpZiAoKG51bV90YnMgPj0gTUFYX05VTV9PRl9UQlMpIHx8IChudW1fdGJzIDwgMCkpIHsKKwlpZiAobnVtX3RicyA+PSBNQVhfTlVNX09GX1RCUykgewogCQlJV0xfRVJST1IoIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAogCQkJICBNQVhfTlVNX09GX1RCUyk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUxLDcgKzE0OSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCk7CiAKIC8qKgogICogaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaW5kZXggdG8gaGFyZHdhcmUKQEAgLTQ3OCw3ICs0NzUsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpd2xfaHdfdHhxX2N0eF9mcmVlKTsKIAotCiAvKioKICAqIGl3bF90eHFfY3R4X3Jlc2V0IC0gUmVzZXQgVFggcXVldWUgY29udGV4dAogICogRGVzdHJveXMgYWxsIERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXNlIHRoZW0gYWdhaW4KQEAgLTU0NSw2ICs1NDEsNyBAQAogIGVycm9yX2t3OgogCXJldHVybiByZXQ7CiB9CisKIC8qKgogICogaXdsX3R4cV9jdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscywgZnJlZSBUeCBxdWV1ZSBtZW1vcnkKICAqLwpAQCAtNzk2LDExICs3OTMsNiBAQAogCQlnb3RvIGRyb3BfdW5sb2NrOwogCX0KIAotCWlmICghcHJpdi0+dmlmKSB7Ci0JCUlXTF9ERUJVR19EUk9QKCJEcm9wcGluZyAtICFwcml2LT52aWZcbiIpOwotCQlnb3RvIGRyb3BfdW5sb2NrOwotCX0KLQogCWlmICgoaWVlZTgwMjExX2dldF90eF9yYXRlKHByaXYtPmh3LCBpbmZvKS0+aHdfdmFsdWUgJiAweEZGKSA9PQogCSAgICAgSVdMX0lOVkFMSURfUkFURSkgewogCQlJV0xfRVJST1IoIkVSUk9SOiBObyBUWCByYXRlIGF2YWlsYWJsZS5cbiIpOwpAQCAtODIyLDE2ICs4MTQsMTggQEAKIAogCS8qIGRyb3AgYWxsIGRhdGEgZnJhbWUgaWYgd2UgYXJlIG5vdCBhc3NvY2lhdGVkICovCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSAmJgotCSAgICghaXdsX2lzX2Fzc29jaWF0ZWQocHJpdikgfHwKLQkgICAgKChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkgJiYgIXByaXYtPmFzc29jX2lkKSB8fAotCSAgICAhcHJpdi0+YXNzb2Nfc3RhdGlvbl9hZGRlZCkpIHsKKwkgICAgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiB8fAorCSAgICAhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9JTkpFQ1RFRCkpICYmIC8qIHBhY2tldCBpbmplY3Rpb24gKi8KKwkgICAgKCFpd2xfaXNfYXNzb2NpYXRlZChwcml2KSB8fAorCSAgICAgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pICYmICFwcml2LT5hc3NvY19pZCkgfHwKKwkgICAgICFwcml2LT5hc3NvY19zdGF0aW9uX2FkZGVkKSkgewogCQlJV0xfREVCVUdfRFJPUCgiRHJvcHBpbmcgLSAhaXdsX2lzX2Fzc29jaWF0ZWRcbiIpOwogCQlnb3RvIGRyb3BfdW5sb2NrOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWhkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShmYykpOworCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKIAogCS8qIEZpbmQgKG9yIGNyZWF0ZSkgaW5kZXggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCiAJc3RhX2lkID0gaXdsX2dldF9zdGFfaWQocHJpdiwgaGRyKTsKQEAgLTg0OSw3ICs4NDMsNyBAQAogCXR4cV9pZCA9IHN3cV9pZDsKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewogCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKIAkJc2VxX251bWJlciA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlcjsKIAkJc2VxX251bWJlciAmPSBJRUVFODAyMTFfU0NUTF9TRVE7CiAJCWhkci0+c2VxX2N0cmwgPSBoZHItPnNlcV9jdHJsICYKQEAgLTEwNjQsNyArMTA1OCw3IEBACiAJb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoUVVFVUVfVE9fU0VRKElXTF9DTURfUVVFVUVfTlVNKSB8CiAJCQlJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CiAJaWYgKG91dF9jbWQtPm1ldGEuZmxhZ3MgJiBDTURfU0laRV9IVUdFKQotCQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgfD0gY3B1X3RvX2xlMTYoU0VRX0hVR0VfRlJBTUUpOworCQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgfD0gU0VRX0hVR0VfRlJBTUU7CiAJbGVuID0gKGlkeCA9PSBURkRfQ01EX1NMT1RTKSA/CiAJCQlJV0xfTUFYX1NDQU5fU0laRSA6IHNpemVvZihzdHJ1Y3QgaXdsX2NtZCk7CiAJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2Rldiwgb3V0X2NtZCwgbGVuLApAQCAtMTA3MiwxMiArMTA2NiwyNiBAQAogCXBoeXNfYWRkciArPSBvZmZzZXRvZihzdHJ1Y3QgaXdsX2NtZCwgaGRyKTsKIAlpd2xfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHRmZCwgcGh5c19hZGRyLCBmaXhfc2l6ZSk7CiAKLQlJV0xfREVCVUdfSEMoIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKLQkJICAgICAiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAotCQkgICAgIGdldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLAotCQkgICAgIG91dF9jbWQtPmhkci5jbWQsIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksCi0JCSAgICAgZml4X3NpemUsIHEtPndyaXRlX3B0ciwgaWR4LCBJV0xfQ01EX1FVRVVFX05VTSk7Ci0KKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCXN3aXRjaCAob3V0X2NtZC0+aGRyLmNtZCkgeworCWNhc2UgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRDoKKwljYXNlIFNFTlNJVElWSVRZX0NNRDoKKwkJSVdMX0RFQlVHX0hDX0RVTVAoIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKKwkJCQkiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAorCQkJCWdldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLAorCQkJCW91dF9jbWQtPmhkci5jbWQsCisJCQkJbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSwgZml4X3NpemUsCisJCQkJcS0+d3JpdGVfcHRyLCBpZHgsIElXTF9DTURfUVVFVUVfTlVNKTsKKwkJCQlicmVhazsKKwlkZWZhdWx0OgorCQlJV0xfREVCVUdfSEMoIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKKwkJCQkiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAorCQkJCWdldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLAorCQkJCW91dF9jbWQtPmhkci5jbWQsCisJCQkJbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSwgZml4X3NpemUsCisJCQkJcS0+d3JpdGVfcHRyLCBpZHgsIElXTF9DTURfUVVFVUVfTlVNKTsKKwl9CisjZW5kaWYKIAl0eHEtPm5lZWRfdXBkYXRlID0gMTsKIAogCS8qIFNldCB1cCBlbnRyeSBpbiBxdWV1ZSdzIGJ5dGUgY291bnQgY2lyY3VsYXIgYnVmZmVyICovCkBAIC0xMTg1LDE3ICsxMTkzLDE2IEBACiAJdTE2IHNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOwogCWludCB0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxdWVuY2UpOwogCWludCBpbmRleCA9IFNFUV9UT19JTkRFWChzZXF1ZW5jZSk7Ci0JaW50IGh1Z2UgPSBzZXF1ZW5jZSAmIFNFUV9IVUdFX0ZSQU1FOwogCWludCBjbWRfaW5kZXg7CisJYm9vbCBodWdlID0gISEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfSFVHRV9GUkFNRSk7CiAJc3RydWN0IGl3bF9jbWQgKmNtZDsKIAogCS8qIElmIGEgVHggY29tbWFuZCBpcyBiZWluZyBoYW5kbGVkIGFuZCBpdCBpc24ndCBpbiB0aGUgYWN0dWFsCiAJICogY29tbWFuZCBxdWV1ZSB0aGVuIHRoZXJlIGEgY29tbWFuZCByb3V0aW5nIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkCiAJICogaW4gdGhlIHF1ZXVlIG1hbmFnZW1lbnQgY29kZS4gKi8KLQlpZiAodHhxX2lkICE9IElXTF9DTURfUVVFVUVfTlVNKQotCQlJV0xfRVJST1IoIkVycm9yIHdyb25nIGNvbW1hbmQgcXVldWUgJWQgY29tbWFuZCBpZCAweCVYXG4iLAotCQkJICB0eHFfaWQsIHBrdC0+aGRyLmNtZCk7Ci0JQlVHX09OKHR4cV9pZCAhPSBJV0xfQ01EX1FVRVVFX05VTSk7CisJaWYgKFdBUk4odHhxX2lkICE9IElXTF9DTURfUVVFVUVfTlVNLAorCQkgIndyb25nIGNvbW1hbmQgcXVldWUgJWQsIGNvbW1hbmQgaWQgMHglWFxuIiwgdHhxX2lkLCBwa3QtPmhkci5jbWQpKQorCQlyZXR1cm47CiAKIAljbWRfaW5kZXggPSBnZXRfY21kX2luZGV4KCZwcml2LT50eHFbSVdMX0NNRF9RVUVVRV9OVU1dLnEsIGluZGV4LCBodWdlKTsKIAljbWQgPSBwcml2LT50eHFbSVdMX0NNRF9RVUVVRV9OVU1dLmNtZFtjbWRfaW5kZXhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wzOTQ1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsMzk0NS1iYXNlLmMKaW5kZXggYjc3NWQ1Yi4uZDE1YTJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wzOTQ1LWJhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bDM5NDUtYmFzZS5jCkBAIC0xMTYwLDcgKzExNjAsNyBAQAogCS8qIElmIHdlIGhhdmUgc2V0IHRoZSBBU1NPQ19NU0sgYW5kIHdlIGFyZSBpbiBCU1MgbW9kZSB0aGVuCiAJICogYWRkIHRoZSBJV0xfQVBfSUQgdG8gdGhlIHN0YXRpb24gcmF0ZSB0YWJsZSAqLwogCWlmIChpd2wzOTQ1X2lzX2Fzc29jaWF0ZWQocHJpdikgJiYKLQkgICAgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSkKKwkgICAgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpCiAJCWlmIChpd2wzOTQ1X2FkZF9zdGF0aW9uKHByaXYsIHByaXYtPmFjdGl2ZV9yeG9uLmJzc2lkX2FkZHIsIDEsIDApCiAJCSAgICA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7CiAJCQlJV0xfRVJST1IoIkVycm9yIGFkZGluZyBBUCBhZGRyZXNzIGZvciB0cmFuc21pdC5cbiIpOwpAQCAtMTQ0Nyw4ICsxNDQ3LDggQEAKIHsKIAogCWlmICghaXdsMzk0NV9pc19hc3NvY2lhdGVkKHByaXYpIHx8ICFwcml2LT5pYnNzX2JlYWNvbiB8fAotCSAgICAoKHByaXYtPml3X21vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgJiYKLQkgICAgIChwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0FQKSkpCisJICAgICgocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKKwkgICAgIChwcml2LT5pd19tb2RlICE9IE5MODAyMTFfSUZUWVBFX0FQKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKHByaXYtPmlic3NfYmVhY29uLT5sZW4gPiBsZWZ0KQpAQCAtMTc0NiwxNCArMTc0NiwxNCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+cW9zX2RhdGEucW9zX2FjdGl2ZSA9IDA7CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJaWYgKHByaXYtPnFvc19kYXRhLnFvc19lbmFibGUpCiAJCQlwcml2LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gMTsKIAkJaWYgKCEocHJpdi0+YWN0aXZlX3JhdGUgJiAweGZmZjApKSB7CiAJCQljd19taW4gPSAzMTsKIAkJCWlzX2xlZ2FjeSA9IDE7CiAJCX0KLQl9IGVsc2UgaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwl9IGVsc2UgaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJaWYgKHByaXYtPnFvc19kYXRhLnFvc19lbmFibGUpCiAJCQlwcml2LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gMTsKIAl9IGVsc2UgaWYgKCEocHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICYgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSB7CkBAIC0yMTIwLDcgKzIxMjAsNyBAQAogCWJlYWNvbl9pbnQgPSBwcml2LT5iZWFjb25faW50OwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkgeworCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKIAkJaWYgKGJlYWNvbl9pbnQgPT0gMCkgewogCQkJcHJpdi0+cnhvbl90aW1pbmcuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYoMTAwKTsKIAkJCXByaXYtPnJ4b25fdGltaW5nLmJlYWNvbl9pbml0X3ZhbCA9IGNwdV90b19sZTMyKDEwMjQwMCk7CkBAIC0yMTU2LDcgKzIxNTYsNyBAQAogCiBzdGF0aWMgaW50IGl3bDM5NDVfc2Nhbl9pbml0aWF0ZShzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2KQogewotCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKSB7CisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJSVdMX0VSUk9SKCJBUHMgZG9uJ3Qgc2Nhbi5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMjE4LDcgKzIyMTgsNyBAQAogCQllbHNlCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCi0JCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAogCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwpAQCAtMjIzNywyMyArMjIzNywyMyBAQAogCW1lbXNldCgmcHJpdi0+c3RhZ2luZ19yeG9uLCAwLCBzaXplb2YocHJpdi0+c3RhZ2luZ19yeG9uKSk7CiAKIAlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5kZXZfdHlwZSA9IFJYT05fREVWX1RZUEVfQVA7CiAJCWJyZWFrOwogCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlwcml2LT5zdGFnaW5nX3J4b24uZGV2X3R5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwogCQlicmVhazsKIAotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlwcml2LT5zdGFnaW5nX3J4b24uZGV2X3R5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7CiAJCXByaXYtPnN0YWdpbmdfcnhvbi5mbGFncyA9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLIHwKIAkJCQkJCSAgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CiAJCWJyZWFrOwogCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9TTklGRkVSOwogCQlwcml2LT5zdGFnaW5nX3J4b24uZmlsdGVyX2ZsYWdzID0gUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgfAogCQkgICAgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CkBAIC0yMjgyLDcgKzIyODIsNyBAQAogCSAqIGluIHNvbWUgY2FzZSBBIGNoYW5uZWxzIGFyZSBhbGwgbm9uIElCU1MKIAkgKiBpbiB0aGlzIGNhc2UgZm9yY2UgQi9HIGNoYW5uZWwKIAkgKi8KLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgJiYKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCiAJICAgICEoaXNfY2hhbm5lbF9pYnNzKGNoX2luZm8pKSkKIAkJY2hfaW5mbyA9ICZwcml2LT5jaGFubmVsX2luZm9bMF07CiAKQEAgLTIzMDIsNyArMjMwMiw3IEBACiAKIHN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfbW9kZShzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2LCBpbnQgbW9kZSkKIHsKLQlpZiAobW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKG1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJY29uc3Qgc3RydWN0IGl3bDM5NDVfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwogCiAJCWNoX2luZm8gPSBpd2wzOTQ1X2dldF9jaGFubmVsX2luZm8ocHJpdiwKQEAgLTI0NjksMTEgKzI0NjksMTEgQEAKIAogCS8qIElmIHdlIGFyZSBhIGNsaWVudCBzdGF0aW9uIGluIGEgQlNTIG5ldHdvcmssIHVzZSB0aGUgc3BlY2lhbAogCSAqIEFQIHN0YXRpb24gZW50cnkgKHRoYXQncyB0aGUgb25seSBzdGF0aW9uIHdlIGNvbW11bmljYXRlIHdpdGgpICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlyZXR1cm4gSVdMX0FQX0lEOwogCiAJLyogSWYgd2UgYXJlIGFuIEFQLCB0aGVuIGZpbmQgdGhlIHN0YXRpb24sIG9yIHVzZSBCQ0FTVCAqLwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJc3RhX2lkID0gaXdsMzk0NV9od19maW5kX3N0YXRpb24ocHJpdiwgaGRyLT5hZGRyMSk7CiAJCWlmIChzdGFfaWQgIT0gSVdMX0lOVkFMSURfU1RBVElPTikKIAkJCXJldHVybiBzdGFfaWQ7CkBAIC0yNDgxLDcgKzI0ODEsNyBAQAogCiAJLyogSWYgdGhpcyBmcmFtZSBpcyBnb2luZyBvdXQgdG8gYW4gSUJTUyBuZXR3b3JrLCBmaW5kIHRoZSBzdGF0aW9uLAogCSAqIG9yIGNyZWF0ZSBhIG5ldyBzdGF0aW9uIHRhYmxlIGVudHJ5ICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOiB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzogewogCQlERUNMQVJFX01BQ19CVUYobWFjKTsKIAogCQkvKiBDcmVhdGUgbmV3IHN0YXRpb24gdGFibGUgZW50cnkgKi8KQEAgLTI1MDIsNyArMjUwMiw3IEBACiAJfQogCS8qIElmIHdlIGFyZSBpbiBtb25pdG9yIG1vZGUsIHVzZSBCQ0FTVC4gVGhpcyBpcyByZXF1aXJlZCBmb3IKIAkgKiBwYWNrZXQgaW5qZWN0aW9uLiAqLwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJCXJldHVybiBwcml2LT5od19zZXR0aW5nLmJjYXN0X3N0YV9pZDsKIAogCWRlZmF1bHQ6CkBAIC0yNTY1LDE2ICsyNTY1LDE2IEBACiAKIAkvKiBkcm9wIGFsbCBkYXRhIGZyYW1lIGlmIHdlIGFyZSBub3QgYXNzb2NpYXRlZCAqLwogCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykgJiYKLQkgICAgKHByaXYtPml3X21vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikgJiYgLyogcGFja2V0IGluamVjdGlvbiAqLworCSAgICAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSAmJiAvKiBwYWNrZXQgaW5qZWN0aW9uICovCiAJICAgICghaXdsMzk0NV9pc19hc3NvY2lhdGVkKHByaXYpIHx8Ci0JICAgICAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSAmJiAhcHJpdi0+YXNzb2NfaWQpKSkgeworCSAgICAgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pICYmICFwcml2LT5hc3NvY19pZCkpKSB7CiAJCUlXTF9ERUJVR19EUk9QKCJEcm9wcGluZyAtICFpd2wzOTQ1X2lzX2Fzc29jaWF0ZWRcbiIpOwogCQlnb3RvIGRyb3BfdW5sb2NrOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAotCWhkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShmYykpOworCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKIAogCS8qIEZpbmQgKG9yIGNyZWF0ZSkgaW5kZXggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCiAJc3RhX2lkID0gaXdsMzk0NV9nZXRfc3RhX2lkKHByaXYsIGhkcik7CkBAIC0yNTkwLDcgKzI1OTAsNyBAQAogCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKIAkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiAweGY7CisJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CiAJCXNlcV9udW1iZXIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXIgJgogCQkJCUlFRUU4MDIxMV9TQ1RMX1NFUTsKIAkJaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KHNlcV9udW1iZXIpIHwKQEAgLTI3MDksNyArMjcwOSw3IEBACiAJCQkgICBzaXplb2Yob3V0X2NtZC0+Y21kLnR4KSk7CiAKIAlpd2wzOTQ1X3ByaW50X2hleF9kdW1wKElXTF9ETF9UWCwgKHU4ICopb3V0X2NtZC0+Y21kLnR4LmhkciwKLQkJCSAgIGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGZjKSkpOworCQkJICAgaWVlZTgwMjExX2hkcmxlbihmYykpOwogCiAJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGluZGV4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KIAlxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKQEAgLTI4MDYsNyArMjgwNiw3IEBACiAJaWYgKGRpc2FibGVfcmFkaW8pIHsKIAkJaXdsMzk0NV9zY2FuX2NhbmNlbChwcml2KTsKIAkJLyogRklYTUU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBBUCAqLwotCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJCWl3bDM5NDVfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCiAJCQkJICAgIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKQEAgLTMxNjEsNyArMzE2MSw3IEBACiAJCWxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOwogI2VuZGlmCiAKLQlpZiAoKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApICYmCisJaWYgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgogCSAgICAoIXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSkKIAkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5iZWFjb25fdXBkYXRlKTsKIH0KQEAgLTQ3ODIsOCArNDc4MiwxMSBAQAogLyogRm9yIGFjdGl2ZSBzY2FuLCBsaXN0ZW4gQUNUSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbCBhZnRlcgogICogc2VuZGluZyBwcm9iZSByZXEuICBUaGlzIHNob3VsZCBiZSBzZXQgbG9uZyBlbm91Z2ggdG8gaGVhciBwcm9iZSByZXNwb25zZXMKICAqIGZyb20gbW9yZSB0aGFuIG9uZSBBUC4gICovCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV8yNCAgICAoMjApCS8qIGFsbCB0aW1lcyBpbiBtc2VjICovCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV81MiAgICAoMTApCisjZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV8yNCAgICAoMzApCS8qIGFsbCB0aW1lcyBpbiBtc2VjICovCisjZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV81MiAgICAoMjApCisKKyNkZWZpbmUgSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKDMpCisjZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzUyR0haICgyKQogCiAvKiBGb3IgZmFzdGVyIGFjdGl2ZSBzY2FubmluZywgc2NhbiB3aWxsIG1vdmUgdG8gdGhlIG5leHQgY2hhbm5lbCBpZiBmZXdlciB0aGFuCiAgKiBQTENQX1FVSUVUX1RIUkVTSCBwYWNrZXRzIGFyZSBoZWFyZCBvbiB0aGlzIGNoYW5uZWwgd2l0aGluCkBAIC00NzkyLDcgKzQ3OTUsNyBAQAogICogbm8gb3RoZXIgdHJhZmZpYykuCiAgKiBEaXNhYmxlICJxdWlldCIgZmVhdHVyZSBieSBzZXR0aW5nIFBMQ1BfUVVJRVRfVEhSRVNIIHRvIDAuICovCiAjZGVmaW5lIElXTF9QTENQX1FVSUVUX1RIUkVTSCAgICAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpCS8qIHBhY2tldHMgKi8KLSNkZWZpbmUgSVdMX0FDVElWRV9RVUlFVF9USU1FICAgICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNSkJLyogbXNlYyAqLworI2RlZmluZSBJV0xfQUNUSVZFX1FVSUVUX1RJTUUgICAgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNigxMCkJLyogbXNlYyAqLwogCiAvKiBGb3IgcGFzc2l2ZSBzY2FuLCBsaXN0ZW4gUEFTU0lWRV9EV0VMTF9USU1FIChtc2VjKSBvbiBlYWNoIGNoYW5uZWwuCiAgKiBNdXN0IGJlIHNldCBsb25nZXIgdGhhbiBhY3RpdmUgZHdlbGwgdGltZS4KQEAgLTQ4MDIsMTkgKzQ4MDUsMjMgQEAKICNkZWZpbmUgSVdMX1BBU1NJVkVfRFdFTExfQkFTRSAgICAgICgxMDApCiAjZGVmaW5lIElXTF9DSEFOTkVMX1RVTkVfVElNRSAgICAgICA1CiAKKyNkZWZpbmUgSVdMX1NDQU5fUFJPQkVfTUFTSyhuKQkgY3B1X3RvX2xlMzIoKEJJVChuKSB8IChCSVQobikgLSBCSVQoMSkpKSkKKwogc3RhdGljIGlubGluZSB1MTYgaXdsMzk0NV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdiwKLQkJCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKKwkJCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCQkJCXU4IG5fcHJvYmVzKQogewogCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfNTI7CisJCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfNTIgKworCQkJSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKiAobl9wcm9iZXMgKyAxKTsKIAllbHNlCi0JCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfMjQ7CisJCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfMjQgKworCQkJSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKiAobl9wcm9iZXMgKyAxKTsKIH0KIAogc3RhdGljIHUxNiBpd2wzOTQ1X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUoc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdiwKIAkJCQkJICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCiB7Ci0JdTE2IGFjdGl2ZSA9IGl3bDM5NDVfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHByaXYsIGJhbmQpOwogCXUxNiBwYXNzaXZlID0gKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPwogCSAgICBJV0xfUEFTU0lWRV9EV0VMTF9CQVNFICsgSVdMX1BBU1NJVkVfRFdFTExfVElNRV8yNCA6CiAJICAgIElXTF9QQVNTSVZFX0RXRUxMX0JBU0UgKyBJV0xfUEFTU0lWRV9EV0VMTF9USU1FXzUyOwpAQCAtNDgyOSwxNSArNDgzNiwxMiBAQAogCQlwYXNzaXZlID0gKHBhc3NpdmUgKiA5OCkgLyAxMDAgLSBJV0xfQ0hBTk5FTF9UVU5FX1RJTUUgKiAyOwogCX0KIAotCWlmIChwYXNzaXZlIDw9IGFjdGl2ZSkKLQkJcGFzc2l2ZSA9IGFjdGl2ZSArIDE7Ci0KIAlyZXR1cm4gcGFzc2l2ZTsKIH0KIAogc3RhdGljIGludCBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2LAogCQkJCQkgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJCSAgICAgdTggaXNfYWN0aXZlLCB1OCBkaXJlY3RfbWFzaywKKwkJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCiAJCQkJICAgICBzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NoYW5uZWwgKnNjYW5fY2gpCiB7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVscyA9IE5VTEw7CkBAIC00ODUzLDkgKzQ4NTcsMTIgQEAKIAogCWNoYW5uZWxzID0gc2JhbmQtPmNoYW5uZWxzOwogCi0JYWN0aXZlX2R3ZWxsID0gaXdsMzk0NV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCk7CisJYWN0aXZlX2R3ZWxsID0gaXdsMzk0NV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwogCXBhc3NpdmVfZHdlbGwgPSBpd2wzOTQ1X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCk7CiAKKwlpZiAocGFzc2l2ZV9kd2VsbCA8PSBhY3RpdmVfZHdlbGwpCisJCXBhc3NpdmVfZHdlbGwgPSBhY3RpdmVfZHdlbGwgKyAxOworCiAJZm9yIChpID0gMCwgYWRkZWQgPSAwOyBpIDwgc2JhbmQtPm5fY2hhbm5lbHM7IGkrKykgewogCQlpZiAoY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKIAkJCWNvbnRpbnVlOwpAQCAtNDg3NSw4ICs0ODgyLDggQEAKIAkJZWxzZQogCQkJc2Nhbl9jaC0+dHlwZSA9IDE7CS8qIGFjdGl2ZSAqLwogCi0JCWlmIChzY2FuX2NoLT50eXBlICYgMSkKLQkJCXNjYW5fY2gtPnR5cGUgfD0gKGRpcmVjdF9tYXNrIDw8IDEpOworCQlpZiAoKHNjYW5fY2gtPnR5cGUgJiAxKSAmJiBuX3Byb2JlcykKKwkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMX1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7CiAKIAkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKIAkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwpAQCAtNjA1Miw3ICs2MDU5LDcgQEAKIAlpZiAoIWl3bDM5NDVfaXNfcmVhZHkocHJpdikpCiAJCUlXTF9ERUJVRyhJV0xfRExfU1RBVEUsICJsZWF2ZSAtIG5vdCByZWFkeVxuIik7CiAJZWxzZQotCQlpZiAoaXdsMzk0NV9zZXRfbW9kZShwcml2LCBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKSAhPSAwKQorCQlpZiAoaXdsMzk0NV9zZXRfbW9kZShwcml2LCBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSAhPSAwKQogCQkJSVdMX0VSUk9SKCJpd2wzOTQ1X3NldF9tb2RlKCkgZmFpbGVkXG4iKTsKIAogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtNjA5Myw3ICs2MTAwLDcgQEAKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kICpzY2FuOwogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7Ci0JdTggZGlyZWN0X21hc2s7CisJdTggbl9wcm9iZXMgPSAyOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAogCWNvbmYgPSBpZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwpAQCAtNjIwMSw3ICs2MjA4LDcgQEAKIAkJc2Nhbi0+ZGlyZWN0X3NjYW5bMF0ubGVuID0gcHJpdi0+ZGlyZWN0X3NzaWRfbGVuOwogCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bMF0uc3NpZCwKIAkJICAgICAgIHByaXYtPmRpcmVjdF9zc2lkLCBwcml2LT5kaXJlY3Rfc3NpZF9sZW4pOwotCQlkaXJlY3RfbWFzayA9IDE7CisJCW5fcHJvYmVzKys7CiAJfSBlbHNlIGlmICghaXdsMzk0NV9pc19hc3NvY2lhdGVkKHByaXYpICYmIHByaXYtPmVzc2lkX2xlbikgewogCQlJV0xfREVCVUdfU0NBTgogCQkgICgiS2lja2luZyBvZmYgb25lIGRpcmVjdCBzY2FuIGZvciAnJXMnIHdoZW4gbm90IGFzc29jaWF0ZWRcbiIsCkBAIC02MjA5LDExICs2MjE2LDkgQEAKIAkJc2Nhbi0+ZGlyZWN0X3NjYW5bMF0uaWQgPSBXTEFOX0VJRF9TU0lEOwogCQlzY2FuLT5kaXJlY3Rfc2NhblswXS5sZW4gPSBwcml2LT5lc3NpZF9sZW47CiAJCW1lbWNweShzY2FuLT5kaXJlY3Rfc2NhblswXS5zc2lkLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfbGVuKTsKLQkJZGlyZWN0X21hc2sgPSAxOwotCX0gZWxzZSB7CisJCW5fcHJvYmVzKys7CisJfSBlbHNlCiAJCUlXTF9ERUJVR19TQ0FOKCJLaWNraW5nIG9mZiBvbmUgaW5kaXJlY3Qgc2Nhbi5cbiIpOwotCQlkaXJlY3RfbWFzayA9IDA7Ci0JfQogCiAJLyogV2UgZG9uJ3QgYnVpbGQgYSBkaXJlY3Qgc2NhbiBwcm9iZSByZXF1ZXN0OyB0aGUgdUNvZGUgd2lsbCBkbwogCSAqIHRoYXQgYmFzZWQgb24gdGhlIGRpcmVjdF9tYXNrIGFkZGVkIHRvIGVhY2ggY2hhbm5lbCBlbnRyeSAqLwpAQCAtNjI0MywyMSArNjI0OCwxMyBAQAogCS8qIHNlbGVjdCBSeCBhbnRlbm5hcyAqLwogCXNjYW4tPmZsYWdzIHw9IGl3bDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MocHJpdik7CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKQorCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCXNjYW4tPmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX1BST01JU0NfTVNLOwogCi0JaWYgKGRpcmVjdF9tYXNrKQotCQlzY2FuLT5jaGFubmVsX2NvdW50ID0KLQkJCWl3bDM5NDVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKAotCQkJCXByaXYsIGJhbmQsIDEsIC8qIGFjdGl2ZSAqLwotCQkJCWRpcmVjdF9tYXNrLAotCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbildKTsKLQllbHNlCi0JCXNjYW4tPmNoYW5uZWxfY291bnQgPQotCQkJaXdsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oCi0JCQkJcHJpdiwgYmFuZCwgMCwgLyogcGFzc2l2ZSAqLwotCQkJCWRpcmVjdF9tYXNrLAotCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbildKTsKKwlzY2FuLT5jaGFubmVsX2NvdW50ID0KKwkJaXdsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgYmFuZCwgMSwgLyogYWN0aXZlICovCisJCQkJCSAgICAgIG5fcHJvYmVzLAorCQkJKHZvaWQgKikmc2Nhbi0+ZGF0YVtsZTE2X3RvX2NwdShzY2FuLT50eF9jbWQubGVuKV0pOwogCiAJY21kLmxlbiArPSBsZTE2X3RvX2NwdShzY2FuLT50eF9jbWQubGVuKSArCiAJICAgIHNjYW4tPmNoYW5uZWxfY291bnQgKiBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2Nhbl9jaGFubmVsKTsKQEAgLTYzMjAsMTYgKzYzMTcsMTMgQEAKIAogI2RlZmluZSBJV0xfREVMQVlfTkVYVF9TQ0FOIChIWioyKQogCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3N0YXRpYyB2b2lkIGl3bDM5NDVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGl3bDM5NDVfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2wzOTQ1X3ByaXYsCi0JCQkJCSAgICAgcG9zdF9hc3NvY2lhdGUud29yayk7Ci0KIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCUlXTF9FUlJPUigiJXMgU2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gQVAgbW9kZVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQpAQCAtNjM0MiwxMiArNjMzNiw5IEBACiAJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQogCQlyZXR1cm47CiAKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPnZpZiB8fCAhcHJpdi0+aXNfb3BlbikgewotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwlpZiAoIXByaXYtPnZpZiB8fCAhcHJpdi0+aXNfb3BlbikKIAkJcmV0dXJuOwotCX0KKwogCWl3bDM5NDVfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwogCiAJY29uZiA9IGllZWU4MDIxMV9nZXRfaHdfY29uZihwcml2LT5odyk7CkBAIC02MzgxLDcgKzYzNzIsNyBAQAogCQllbHNlCiAJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCi0JCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAogCX0KQEAgLTYzODksMTEgKzYzODAsMTEgQEAKIAlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYpOwogCiAJc3dpdGNoIChwcml2LT5pd19tb2RlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChwcml2LT5odywgSVdMX0FQX0lEKTsKIAkJYnJlYWs7CiAKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAogCQkvKiBjbGVhciBvdXQgdGhlIHN0YXRpb24gdGFibGUgKi8KIAkJaXdsMzk0NV9jbGVhcl9zdGF0aW9uc190YWJsZShwcml2KTsKQEAgLTY0MTksNyArNjQxMCw2IEBACiAKIAkvKiB3ZSBoYXZlIGp1c3QgYXNzb2NpYXRlZCwgZG9uJ3Qgc3RhcnQgc2NhbiB0b28gZWFybHkgKi8KIAlwcml2LT5uZXh0X3NjYW5famlmZmllcyA9IGppZmZpZXMgKyBJV0xfREVMQVlfTkVYVF9TQ0FOOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX2Fib3J0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNjU2Nyw3ICs2NTU3LDYgQEAKIAkJICovCiAJCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAkJaXdsMzk0NV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnBvc3RfYXNzb2NpYXRlKTsKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiAJfQogCkBAIC02NjUwLDggKzY2MzksNiBAQAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlJV0xfREVCVUdfTUFDODAyMTEoImVudGVyIHRvIGNoYW5uZWwgJWRcbiIsIGNvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlKTsKIAotCXByaXYtPmFkZF9yYWRpb3RhcCA9ICEhKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUkFESU9UQVApOwotCiAJaWYgKCFpd2wzOTQ1X2lzX3JlYWR5KHByaXYpKSB7CiAJCUlXTF9ERUJVR19NQUM4MDIxMSgibGVhdmUgLSBub3QgcmVhZHlcbiIpOwogCQlyZXQgPSAtRUlPOwpAQCAtNjc2Nyw3ICs2NzU0LDcgQEAKIAkJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0KIAkJCQkJflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwogCi0JCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCQkJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9CiAJCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKIAkJfQpAQCAtNjgwNCw3ICs2NzkxLDcgQEAKIAl9CiAKIAkvKiBoYW5kbGUgdGhpcyB0ZW1wb3JhcmlseSBoZXJlICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJgorCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCiAJICAgIGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CRUFDT04pIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmJlYWNvbiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KGh3LCB2aWYpOwogCQlpZiAoIWJlYWNvbikKQEAgLTY4MTYsNyArNjgwMyw3IEBACiAKIAkvKiBYWFg6IHRoaXMgTVVTVCB1c2UgY29uZi0+bWFjX2FkZHIgKi8KIAotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgJiYKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApICYmCiAJICAgICghY29uZi0+c3NpZF9sZW4pKSB7CiAJCUlXTF9ERUJVR19NQUM4MDIxMQogCQkgICAgKCJMZWF2aW5nIGluIEFQIG1vZGUgYmVjYXVzZSBIb3N0QVBEIGlzIG5vdCByZWFkeS5cbiIpOwpAQCAtNjgzOSw3ICs2ODI2LDcgQEAKIAkgICAgIShwcml2LT5ody0+ZmxhZ3MgJiBJRUVFODAyMTFfSFdfTk9fUFJPQkVfRklMVEVSSU5HKSkgewogICovCiAKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCWlmICghY29uZi0+YnNzaWQpIHsKIAkJCWNvbmYtPmJzc2lkID0gcHJpdi0+bWFjX2FkZHI7CiAJCQltZW1jcHkocHJpdi0+YnNzaWQsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CkBAIC02ODc0LDExICs2ODYxLDExIEBACiAJCSAqIHRvIHZlcmlmeSkgLSBqcGsgKi8KIAkJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOwogCi0JCWlmIChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKQorCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJCWl3bDM5NDVfY29uZmlnX2FwKHByaXYpOwogCQllbHNlIHsKIAkJCXJjID0gaXdsMzk0NV9jb21taXRfcnhvbihwcml2KTsKLQkJCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpICYmIHJjKQorCQkJaWYgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pICYmIHJjKQogCQkJCWl3bDM5NDVfYWRkX3N0YXRpb24ocHJpdiwKIAkJCQkJcHJpdi0+YWN0aXZlX3J4b24uYnNzaWRfYWRkciwgMSwgMCk7CiAJCX0KQEAgLTY5MTQsNyArNjkwMSw3IEBACiAKIAlpZiAoY2hhbmdlZF9mbGFncyAmICgqdG90YWxfZmxhZ3MpICYgRklGX09USEVSX0JTUykgewogCQlJV0xfREVCVUdfTUFDODAyMTEoIkVudGVyOiB0eXBlICVkICgweCV4LCAweCV4KVxuIiwKLQkJCQkgICBJRUVFODAyMTFfSUZfVFlQRV9NTlRSLAorCQkJCSAgIE5MODAyMTFfSUZUWVBFX01PTklUT1IsCiAJCQkJICAgY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKIAkJLyogcXVldWUgd29yayAnY3V6IG1hYzgwMjExIGlzIGhvbGRpbmcgYSBsb2NrIHdoaWNoCiAJCSAqIHByZXZlbnRzIHVzIGZyb20gaXNzdWluZyAoc3luY2hyb25vdXMpIGYvdyBjbWRzICovCkBAIC02OTM1LDcgKzY5MjIsNiBAQAogCiAJaWYgKGl3bDM5NDVfaXNfcmVhZHlfcmYocHJpdikpIHsKIAkJaXdsMzk0NV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnBvc3RfYXNzb2NpYXRlKTsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYpOwogCX0KQEAgLTY5NTAsNiArNjkzNiw2MyBAQAogCUlXTF9ERUJVR19NQUM4MDIxMSgibGVhdmVcbiIpOwogfQogCisjZGVmaW5lIElXTF9ERUxBWV9ORVhUX1NDQU5fQUZURVJfQVNTT0MgKEhaKjYpCisKK3N0YXRpYyB2b2lkIGl3bDM5NDVfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKKwkJCQkgICAgIHUzMiBjaGFuZ2VzKQoreworCXN0cnVjdCBpd2wzOTQ1X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCUlXTF9ERUJVR19NQUM4MDIxMSgiY2hhbmdlcyA9IDB4JVhcbiIsIGNoYW5nZXMpOworCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKCJFUlBfUFJFQU1CTEUgJWRcbiIsCisJCQkJICAgYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSk7CisJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJcHJpdi0+c3RhZ2luZ19yeG9uLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9FUlBfQ1RTX1BST1QpIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKCJFUlBfQ1RTICVkXG4iLCBic3NfY29uZi0+dXNlX2N0c19wcm90KTsKKwkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QgJiYgKHByaXYtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikpCisJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOworCQllbHNlCisJCQlwcml2LT5zdGFnaW5nX3J4b24uZmxhZ3MgJj0gflJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0FTU09DKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMSgiQVNTT0MgJWRcbiIsIGJzc19jb25mLT5hc3NvYyk7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB0aGlzIGZ1bmN0aW9uIHNob3VsZAorCQkgKiBuZXZlciBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KKwkJaWYgKFdBUk5fT05fT05DRShpbl9pbnRlcnJ1cHQoKSkpCisJCQlyZXR1cm47CisJCWlmIChic3NfY29uZi0+YXNzb2MpIHsKKwkJCXByaXYtPmFzc29jX2lkID0gYnNzX2NvbmYtPmFpZDsKKwkJCXByaXYtPmJlYWNvbl9pbnQgPSBic3NfY29uZi0+YmVhY29uX2ludDsKKwkJCXByaXYtPnRpbWVzdGFtcDAgPSBic3NfY29uZi0+dGltZXN0YW1wICYgMHhGRkZGRkZGRjsKKwkJCXByaXYtPnRpbWVzdGFtcDEgPSAoYnNzX2NvbmYtPnRpbWVzdGFtcCA+PiAzMikgJgorCQkJCQkgICAgIDB4RkZGRkZGRkY7CisJCQlwcml2LT5hc3NvY19jYXBhYmlsaXR5ID0gYnNzX2NvbmYtPmFzc29jX2NhcGFiaWxpdHk7CisJCQlwcml2LT5uZXh0X3NjYW5famlmZmllcyA9IGppZmZpZXMgKworCQkJCQlJV0xfREVMQVlfTkVYVF9TQ0FOX0FGVEVSX0FTU09DOworCQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCQkJaXdsMzk0NV9wb3N0X2Fzc29jaWF0ZShwcml2KTsKKwkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworCQl9IGVsc2UgeworCQkJcHJpdi0+YXNzb2NfaWQgPSAwOworCQkJSVdMX0RFQlVHX01BQzgwMjExKCJESVNBU1NPQyAlZFxuIiwgYnNzX2NvbmYtPmFzc29jKTsKKwkJfQorCX0gZWxzZSBpZiAoY2hhbmdlcyAmJiBpd2wzOTQ1X2lzX2Fzc29jaWF0ZWQocHJpdikgJiYgcHJpdi0+YXNzb2NfaWQpIHsKKwkJCUlXTF9ERUJVR19NQUM4MDIxMSgiQXNzb2NpYXRlZCBDaGFuZ2VzICVkXG4iLCBjaGFuZ2VzKTsKKwkJCWl3bDM5NDVfc2VuZF9yeG9uX2Fzc29jKHByaXYpOworCX0KKworfQorCiBzdGF0aWMgaW50IGl3bDM5NDVfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpzc2lkLCBzaXplX3QgbGVuKQogewogCWludCByYyA9IDA7CkBAIC02OTY3LDcgKzcwMTAsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsJLyogQVBzIGRvbid0IHNjYW4gKi8KKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewkvKiBBUHMgZG9uJ3Qgc2NhbiAqLwogCQlyYyA9IC1FSU87CiAJCUlXTF9FUlJPUigiRVJST1I6IEFQcyBkb24ndCBzY2FuXG4iKTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNzEwOSw3ICs3MTUyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHByaXYtPml3X21vZGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKHByaXYtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCWl3bDM5NDVfYWN0aXZhdGVfcW9zKHByaXYsIDEpOwogCWVsc2UgaWYgKHByaXYtPmFzc29jX2lkICYmIGl3bDM5NDVfaXNfYXNzb2NpYXRlZChwcml2KSkKIAkJaXdsMzk0NV9hY3RpdmF0ZV9xb3MocHJpdiwgMCk7CkBAIC03MTgyLDggKzcyMjUsNiBAQAogCiAJaXdsMzk0NV9yZXNldF9xb3MocHJpdik7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5wb3N0X2Fzc29jaWF0ZSk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXByaXYtPmFzc29jX2lkID0gMDsKIAlwcml2LT5hc3NvY19jYXBhYmlsaXR5ID0gMDsKQEAgLTcxOTgsNyArNzIzOSw3IEBACiAJcHJpdi0+YmVhY29uX2ludCA9IHByaXYtPmh3LT5jb25mLmJlYWNvbl9pbnQ7CiAJcHJpdi0+dGltZXN0YW1wMSA9IDA7CiAJcHJpdi0+dGltZXN0YW1wMCA9IDA7Ci0JaWYgKChwcml2LT5pd19tb2RlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkpCisJaWYgKChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQogCQlwcml2LT5iZWFjb25faW50ID0gMDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTcyMTIsMTQgKzcyNTMsMTQgQEAKIAkvKiB3ZSBhcmUgcmVzdGFydGluZyBhc3NvY2lhdGlvbiBwcm9jZXNzCiAJICogY2xlYXIgUlhPTl9GSUxURVJfQVNTT0NfTVNLIGJpdAogCSovCi0JaWYgKHByaXYtPml3X21vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlpd2wzOTQ1X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKIAkJcHJpdi0+c3RhZ2luZ19yeG9uLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYpOwogCX0KIAogCS8qIFBlciBtYWM4MDIxMS5oOiBUaGlzIGlzIG9ubHkgdXNlZCBpbiBJQlNTIG1vZGUuLi4gKi8KLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKHByaXYtPml3X21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAogCQlJV0xfREVCVUdfTUFDODAyMTEoImxlYXZlIC0gbm90IGluIElCU1NcbiIpOwogCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKQEAgLTcyNDgsNyArNzI4OSw3IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChwcml2LT5pd19tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlJV0xfREVCVUdfTUFDODAyMTEoImxlYXZlIC0gbm90IElCU1NcbiIpOwogCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIAkJcmV0dXJuIC1FSU87CkBAIC03MjY4LDcgKzczMDksNyBAQAogCiAJaXdsMzk0NV9yZXNldF9xb3MocHJpdik7CiAKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnBvc3RfYXNzb2NpYXRlLndvcmspOworCWl3bDM5NDVfcG9zdF9hc3NvY2lhdGUocHJpdik7CiAKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIApAQCAtNzMyOSwxNSArNzM3MCw2IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcnNfd2luZG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9wcml2ICpwcml2ID0gZC0+ZHJpdmVyX2RhdGE7Ci0JcmV0dXJuIGl3bDM5NDVfZmlsbF9yc19pbmZvKHByaXYtPmh3LCBidWYsIElXTF9BUF9JRCk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocnNfd2luZG93LCBTX0lSVUdPLCBzaG93X3JzX3dpbmRvdywgTlVMTCk7Ci0KIHN0YXRpYyBzc2l6ZV90IHNob3dfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwKIAkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTc3NjcsNyArNzc5OSw2IEBACiAJSU5JVF9XT1JLKCZwcml2LT5yZl9raWxsLCBpd2wzOTQ1X2JnX3JmX2tpbGwpOwogCUlOSVRfV09SSygmcHJpdi0+YmVhY29uX3VwZGF0ZSwgaXdsMzk0NV9iZ19iZWFjb25fdXBkYXRlKTsKIAlJTklUX1dPUksoJnByaXYtPnNldF9tb25pdG9yLCBpd2wzOTQ1X2JnX3NldF9tb25pdG9yKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cG9zdF9hc3NvY2lhdGUsIGl3bDM5NDVfYmdfcG9zdF9hc3NvY2lhdGUpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2wzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsMzk0NV9iZ19hbGl2ZV9zdGFydCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnNjYW5fY2hlY2ssIGl3bDM5NDVfYmdfc2Nhbl9jaGVjayk7CkBAIC03Nzg1LDcgKzc4MTYsNiBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydCk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+c2Nhbl9jaGVjayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YWxpdmVfc3RhcnQpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnBvc3RfYXNzb2NpYXRlKTsKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5iZWFjb25fdXBkYXRlKTsKIH0KIApAQCAtNzgwMSw3ICs3ODMxLDYgQEAKICNlbmRpZgogCSZkZXZfYXR0cl9wb3dlcl9sZXZlbC5hdHRyLAogCSZkZXZfYXR0cl9yZXRyeV9yYXRlLmF0dHIsCi0JJmRldl9hdHRyX3JzX3dpbmRvdy5hdHRyLAogCSZkZXZfYXR0cl9zdGF0aXN0aWNzLmF0dHIsCiAJJmRldl9hdHRyX3N0YXR1cy5hdHRyLAogCSZkZXZfYXR0cl90ZW1wZXJhdHVyZS5hdHRyLApAQCAtNzgzMCw2ICs3ODU5LDcgQEAKIAkuY29uZl90eCA9IGl3bDM5NDVfbWFjX2NvbmZfdHgsCiAJLmdldF90c2YgPSBpd2wzOTQ1X21hY19nZXRfdHNmLAogCS5yZXNldF90c2YgPSBpd2wzOTQ1X21hY19yZXNldF90c2YsCisJLmJzc19pbmZvX2NoYW5nZWQgPSBpd2wzOTQ1X2Jzc19pbmZvX2NoYW5nZWQsCiAJLmh3X3NjYW4gPSBpd2wzOTQ1X21hY19od19zY2FuCiB9OwogCkBAIC03ODY4LDYgKzc4OTgsNyBAQAogCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmcGRldi0+ZGV2KTsKIAogCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC0zOTQ1LXJzIjsKKwlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdik7CiAKIAlJV0xfREVCVUdfSU5GTygiKioqIExPQUQgRFJJVkVSICoqKlxuIik7CiAJcHJpdiA9IGh3LT5wcml2OwpAQCAtNzg5MCw2ICs3OTIxLDExIEBACiAJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAogCQkgICAgSUVFRTgwMjExX0hXX05PSVNFX0RCTTsKIAorCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KKwkJQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisKIAkvKiA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KIAlody0+cXVldWVzID0gNDsKIApAQCAtNzk1MSw3ICs3OTg3LDcgQEAKIAkJSVdMX0RFQlVHX0lORk8oIlJhZGlvIGRpc2FibGVkLlxuIik7CiAJfQogCi0JcHJpdi0+aXdfbW9kZSA9IElFRUU4MDIxMV9JRl9UWVBFX1NUQTsKKwlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKIAogCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKIAkJIjogRGV0ZWN0ZWQgSW50ZWwgV2lyZWxlc3MgV2lGaSBMaW5rICVzXG4iLCBwcml2LT5jZmctPm5hbWUpOwpAQCAtODMzMSw2ICs4MzY3LDggQEAKIAlpd2wzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7CiB9CiAKK01PRFVMRV9GSVJNV0FSRSgiaXdsd2lmaS0zOTQ1IiBJV0wzOTQ1X1VDT0RFX0FQSSAiLnVjb2RlIik7CisKIG1vZHVsZV9wYXJhbV9uYW1lZChhbnRlbm5hLCBpd2wzOTQ1X3BhcmFtX2FudGVubmEsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFudGVubmEsICJzZWxlY3QgYW50ZW5uYSAoMT1NYWluLCAyPUF1eCwgZGVmYXVsdCAwIFtib3RoXSkiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlLCBpd2wzOTQ1X3BhcmFtX2Rpc2FibGUsIGludCwgMDQ0NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvYXNzb2MuYwppbmRleCBhMjY3ZDZlLi45MmJlNjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSAic2Nhbi5oIgogI2luY2x1ZGUgImNtZC5oIgogCitzdGF0aWMgaW50IGxic19hZGhvY19wb3N0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApOwogCiBzdGF0aWMgY29uc3QgdTggYnNzaWRfYW55W0VUSF9BTEVOXSAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDIpKSkgPQogCXsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OwpAQCAtMjAsMTIgKzIxLDg4IEBACiAjZGVmaW5lIENBUElORk9fTUFTSwkofigweGRhMDApKQogCiAKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGNvbW1vbiByYXRlcyBiZXR3ZWVuIHJhdGVzIGFuZCBjYXJkIHJhdGVzLgorICoKKyAqIEl0IHdpbGwgZmlsbCBjb21tb24gcmF0ZXMgaW4gcmF0ZXMgYXMgb3V0cHV0IGlmIGZvdW5kLgorICoKKyAqIE5PVEU6IFNldHRpbmcgdGhlIE1TQiBvZiB0aGUgYmFzaWMgcmF0ZXMgbmVlZCB0byBiZSB0YWtlbgorICogICBjYXJlLCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmF0ZXMgICAgICAgdGhlIGJ1ZmZlciB3aGljaCBrZWVwcyBpbnB1dCBhbmQgb3V0cHV0CisgKiAgQHBhcmFtIHJhdGVzX3NpemUgIHRoZSBzaXplIG9mIHJhdGUxIGJ1ZmZlcjsgbmV3IHNpemUgb2YgYnVmZmVyIG9uIHJldHVybgorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGdldF9jb21tb25fcmF0ZXMoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCXU4ICpyYXRlcywKKwl1MTYgKnJhdGVzX3NpemUpCit7CisJdTggKmNhcmRfcmF0ZXMgPSBsYnNfYmdfcmF0ZXM7CisJc2l6ZV90IG51bV9jYXJkX3JhdGVzID0gc2l6ZW9mKGxic19iZ19yYXRlcyk7CisJaW50IHJldCA9IDAsIGksIGo7CisJdTggdG1wWzMwXTsKKwlzaXplX3QgdG1wX3NpemUgPSAwOworCisJLyogRm9yIGVhY2ggcmF0ZSBpbiBjYXJkX3JhdGVzIHRoYXQgZXhpc3RzIGluIHJhdGUxLCBjb3B5IHRvIHRtcCAqLworCWZvciAoaSA9IDA7IGNhcmRfcmF0ZXNbaV0gJiYgKGkgPCBudW1fY2FyZF9yYXRlcyk7IGkrKykgeworCQlmb3IgKGogPSAwOyByYXRlc1tqXSAmJiAoaiA8ICpyYXRlc19zaXplKTsgaisrKSB7CisJCQlpZiAocmF0ZXNbal0gPT0gY2FyZF9yYXRlc1tpXSkKKwkJCQl0bXBbdG1wX3NpemUrK10gPSBjYXJkX3JhdGVzW2ldOworCQl9CisJfQorCisJbGJzX2RlYl9oZXgoTEJTX0RFQl9KT0lOLCAiQVAgcmF0ZXMgICAgIiwgcmF0ZXMsICpyYXRlc19zaXplKTsKKwlsYnNfZGViX2hleChMQlNfREVCX0pPSU4sICJjYXJkIHJhdGVzICAiLCBjYXJkX3JhdGVzLCBudW1fY2FyZF9yYXRlcyk7CisJbGJzX2RlYl9oZXgoTEJTX0RFQl9KT0lOLCAiY29tbW9uIHJhdGVzIiwgdG1wLCB0bXBfc2l6ZSk7CisJbGJzX2RlYl9qb2luKCJUWCBkYXRhIHJhdGUgMHglMDJ4XG4iLCBwcml2LT5jdXJfcmF0ZSk7CisKKwlpZiAoIXByaXYtPmVuYWJsZWh3YXV0bykgeworCQlmb3IgKGkgPSAwOyBpIDwgdG1wX3NpemU7IGkrKykgeworCQkJaWYgKHRtcFtpXSA9PSBwcml2LT5jdXJfcmF0ZSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJbGJzX3ByX2FsZXJ0KCJQcmV2aW91c2x5IHNldCBmaXhlZCBkYXRhIHJhdGUgJSN4IGlzbid0ICIKKwkJICAgICAgICJjb21wYXRpYmxlIHdpdGggdGhlIG5ldHdvcmsuXG4iLCBwcml2LT5jdXJfcmF0ZSk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCXJldCA9IDA7CisKK2RvbmU6CisJbWVtc2V0KHJhdGVzLCAwLCAqcmF0ZXNfc2l6ZSk7CisJKnJhdGVzX3NpemUgPSBtaW5fdChpbnQsIHRtcF9zaXplLCAqcmF0ZXNfc2l6ZSk7CisJbWVtY3B5KHJhdGVzLCB0bXAsICpyYXRlc19zaXplKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogIEBicmllZiBTZXRzIHRoZSBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzCisgKgorICogU2NhbiB0aHJvdWdoIGFuIGFycmF5IGFuZCBzZXQgdGhlIE1TQiBmb3IgYmFzaWMgZGF0YSByYXRlcy4KKyAqCisgKiAgQHBhcmFtIHJhdGVzICAgICBidWZmZXIgb2YgZGF0YSByYXRlcworICogIEBwYXJhbSBsZW4gICAgICAgc2l6ZSBvZiBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKHU4ICpyYXRlcywgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAocmF0ZXNbaV0gPT0gMHgwMiB8fCByYXRlc1tpXSA9PSAweDA0IHx8CisJCSAgICByYXRlc1tpXSA9PSAweDBiIHx8IHJhdGVzW2ldID09IDB4MTYpCisJCQlyYXRlc1tpXSB8PSAweDgwOworCX0KK30KKwogCiAvKioKICAqICBAYnJpZWYgQXNzb2NpYXRlIHRvIGEgc3BlY2lmaWMgQlNTIGRpc2NvdmVyZWQgaW4gYSBzY2FuCiAgKgogICogIEBwYXJhbSBwcml2ICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcGJzc2Rlc2MgIFBvaW50ZXIgdG8gdGhlIEJTUyBkZXNjcmlwdG9yIHRvIGFzc29jaWF0ZSB3aXRoLgorICogIEBwYXJhbSBhc3NvY19yZXEgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIGFzc29jaWF0ZSB3aXRoCiAgKgogICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAogICovCkBAIC0zMywyOSArMTEwLDI5IEBACiAJc3RydWN0IGFzc29jX3JlcXVlc3QgKmFzc29jX3JlcSkKIHsKIAlpbnQgcmV0OworCXU4IHByZWFtYmxlID0gUkFESU9fUFJFQU1CTEVfTE9ORzsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7CiAKIAlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfQVVUSEVOVElDQVRFLAogCQkJCSAgICAwLCBDTURfT1BUSU9OX1dBSVRGT1JSU1AsCiAJCQkJICAgIDAsIGFzc29jX3JlcS0+YnNzLmJzc2lkKTsKLQogCWlmIChyZXQpCi0JCWdvdG8gZG9uZTsKKwkJZ290byBvdXQ7CiAKLQkvKiBzZXQgcHJlYW1ibGUgdG8gZmlybXdhcmUgKi8KKwkvKiBVc2Ugc2hvcnQgcHJlYW1ibGUgb25seSB3aGVuIGJvdGggdGhlIEJTUyBhbmQgZmlybXdhcmUgc3VwcG9ydCBpdCAqLwogCWlmICgocHJpdi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkgJiYKIAkgICAgKGFzc29jX3JlcS0+YnNzLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpKQotCQlwcml2LT5wcmVhbWJsZSA9IENNRF9UWVBFX1NIT1JUX1BSRUFNQkxFOwotCWVsc2UKLQkJcHJpdi0+cHJlYW1ibGUgPSBDTURfVFlQRV9MT05HX1BSRUFNQkxFOworCQlwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX1NIT1JUOwogCi0JbGJzX3NldF9yYWRpb19jb250cm9sKHByaXYpOworCXJldCA9IGxic19zZXRfcmFkaW8ocHJpdiwgcHJlYW1ibGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBDTURfODAyXzExX0FTU09DSUFURSwKIAkJCQkgICAgMCwgQ01EX09QVElPTl9XQUlURk9SUlNQLCAwLCBhc3NvY19yZXEpOwogCi1kb25lOgorb3V0OgogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0FTU09DLCAicmV0ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQsMTcgKzE0MSwyMiBAQAogICogIEBicmllZiBKb2luIGFuIGFkaG9jIG5ldHdvcmsgZm91bmQgaW4gYSBwcmV2aW91cyBzY2FuCiAgKgogICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcGJzc2Rlc2MgICAgIFBvaW50ZXIgdG8gYSBCU1MgZGVzY3JpcHRvciBmb3VuZCBpbiBhIHByZXZpb3VzIHNjYW4KLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIGF0dGVtcHQgdG8gam9pbgorICogIEBwYXJhbSBhc3NvY19yZXEgICAgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIGpvaW4KICAqCi0gKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCAtMS0tZmFpbAorICogIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBpbnQgbGJzX2pvaW5fYWRob2NfbmV0d29yayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCitzdGF0aWMgaW50IGxic19hZGhvY19qb2luKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKIAlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQogeworCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19qb2luIGNtZDsKIAlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKmJzcyA9ICZhc3NvY19yZXEtPmJzczsKKwl1OCBwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX0xPTkc7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisJdTE2IHJhdGVzaXplID0gMDsKIAlpbnQgcmV0ID0gMDsKIAorCWxic19kZWJfZW50ZXIoTEJTX0RFQl9BU1NPQyk7CisKIAlsYnNfZGViX2pvaW4oImN1cnJlbnQgU1NJRCAnJXMnLCBzc2lkIGxlbmd0aCAldVxuIiwKIAkJZXNjYXBlX2Vzc2lkKHByaXYtPmN1cmJzc3BhcmFtcy5zc2lkLAogCQlwcml2LT5jdXJic3NwYXJhbXMuc3NpZF9sZW4pLApAQCAtMTA2LDI5ICsxODgsMTA2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIFVzZSBzaG9ydHByZWFtYmxlIG9ubHkgd2hlbiBib3RoIGNyZWF0b3IgYW5kIGNhcmQgc3VwcG9ydHMKLQkgICBzaG9ydCBwcmVhbWJsZSAqLwotCWlmICghKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkgfHwKLQkgICAgIShwcml2LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSkgewotCQlsYnNfZGViX2pvaW4oIkFkaG9jSm9pbjogTG9uZyBwcmVhbWJsZVxuIik7Ci0JCXByaXYtPnByZWFtYmxlID0gQ01EX1RZUEVfTE9OR19QUkVBTUJMRTsKLQl9IGVsc2UgeworCS8qIFVzZSBzaG9ydCBwcmVhbWJsZSBvbmx5IHdoZW4gYm90aCB0aGUgQlNTIGFuZCBmaXJtd2FyZSBzdXBwb3J0IGl0ICovCisJaWYgKChwcml2LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSAmJgorCSAgICAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSkgewogCQlsYnNfZGViX2pvaW4oIkFkaG9jSm9pbjogU2hvcnQgcHJlYW1ibGVcbiIpOwotCQlwcml2LT5wcmVhbWJsZSA9IENNRF9UWVBFX1NIT1JUX1BSRUFNQkxFOworCQlwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX1NIT1JUOwogCX0KIAotCWxic19zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKwlyZXQgPSBsYnNfc2V0X3JhZGlvKHByaXYsIHByZWFtYmxlLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAogCWxic19kZWJfam9pbigiQWRob2NKb2luOiBjaGFubmVsID0gJWRcbiIsIGFzc29jX3JlcS0+Y2hhbm5lbCk7CiAJbGJzX2RlYl9qb2luKCJBZGhvY0pvaW46IGJhbmQgPSAlY1xuIiwgYXNzb2NfcmVxLT5iYW5kKTsKIAogCXByaXYtPmFkaG9jY3JlYXRlID0gMDsKKwlwcml2LT5jdXJic3NwYXJhbXMuY2hhbm5lbCA9IGJzcy0+Y2hhbm5lbDsKIAotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9BRF9IT0NfSk9JTiwKLQkJCQkgICAgMCwgQ01EX09QVElPTl9XQUlURk9SUlNQLAotCQkJCSAgICBPSURfODAyXzExX1NTSUQsIGFzc29jX3JlcSk7CisJLyogQnVpbGQgdGhlIGpvaW4gY29tbWFuZCAqLworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCisJY21kLmJzcy50eXBlID0gQ01EX0JTU19UWVBFX0lCU1M7CisJY21kLmJzcy5iZWFjb25wZXJpb2QgPSBjcHVfdG9fbGUxNihic3MtPmJlYWNvbnBlcmlvZCk7CisKKwltZW1jcHkoJmNtZC5ic3MuYnNzaWQsICZic3MtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KCZjbWQuYnNzLnNzaWQsICZic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pOworCisJbWVtY3B5KCZjbWQuYnNzLnBoeXBhcmFtc2V0LCAmYnNzLT5waHlwYXJhbXNldCwKKwkgICAgICAgc2l6ZW9mKHVuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCkpOworCisJbWVtY3B5KCZjbWQuYnNzLnNzcGFyYW1zZXQsICZic3MtPnNzcGFyYW1zZXQsCisJICAgICAgIHNpemVvZih1bmlvbiBJRUVFdHlwZXNfc3NwYXJhbXNldCkpOworCisJY21kLmJzcy5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoYnNzLT5jYXBhYmlsaXR5ICYgQ0FQSU5GT19NQVNLKTsKKwlsYnNfZGViX2pvaW4oIkFESE9DX0pfQ01EOiB0bXBjYXA9JTRYIENBUElORk9fTUFTSz0lNFhcbiIsCisJICAgICAgIGJzcy0+Y2FwYWJpbGl0eSwgQ0FQSU5GT19NQVNLKTsKKworCS8qIGluZm9ybWF0aW9uIG9uIEJTU0lEIGRlc2NyaXB0b3IgcGFzc2VkIHRvIEZXICovCisJbGJzX2RlYl9qb2luKCJBREhPQ19KX0NNRDogQlNTSUQgPSAlcywgU1NJRCA9ICclcydcbiIsCisJCQlwcmludF9tYWMobWFjLCBjbWQuYnNzLmJzc2lkKSwgY21kLmJzcy5zc2lkKTsKKworCS8qIE9ubHkgdjggYW5kIGJlbG93IHN1cHBvcnQgc2V0dGluZyB0aGVzZSAqLworCWlmIChwcml2LT5md3JlbGVhc2UgPCAweDA5MDAwMDAwKSB7CisJCS8qIGZhaWx0aW1lb3V0ICovCisJCWNtZC5mYWlsdGltZW91dCA9IGNwdV90b19sZTE2KE1SVkRSVl9BU1NPQ0lBVElPTl9USU1FX09VVCk7CisJCS8qIHByb2JlZGVsYXkgKi8KKwkJY21kLnByb2JlZGVsYXkgPSBjcHVfdG9fbGUxNihDTURfU0NBTl9QUk9CRV9ERUxBWV9USU1FKTsKKwl9CisKKwkvKiBDb3B5IERhdGEgcmF0ZXMgZnJvbSB0aGUgcmF0ZXMgcmVjb3JkZWQgaW4gc2NhbiByZXNwb25zZSAqLworCW1lbXNldChjbWQuYnNzLnJhdGVzLCAwLCBzaXplb2YoY21kLmJzcy5yYXRlcykpOworCXJhdGVzaXplID0gbWluX3QodTE2LCBzaXplb2YoY21kLmJzcy5yYXRlcyksIE1BWF9SQVRFUyk7CisJbWVtY3B5KGNtZC5ic3MucmF0ZXMsIGJzcy0+cmF0ZXMsIHJhdGVzaXplKTsKKwlpZiAoZ2V0X2NvbW1vbl9yYXRlcyhwcml2LCBjbWQuYnNzLnJhdGVzLCAmcmF0ZXNpemUpKSB7CisJCWxic19kZWJfam9pbigiQURIT0NfSk9JTjogZ2V0X2NvbW1vbl9yYXRlcyByZXR1cm5lZCBlcnJvci5cbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ29weSB0aGUgYWQtaG9jIGNyZWF0aW9uIHJhdGVzIGludG8gQ3VycmVudCBCU1Mgc3RhdGUgc3RydWN0dXJlICovCisJbWVtc2V0KCZwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsIDAsIHNpemVvZihwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMpKTsKKwltZW1jcHkoJnByaXYtPmN1cmJzc3BhcmFtcy5yYXRlcywgY21kLmJzcy5yYXRlcywgcmF0ZXNpemUpOworCisJLyogU2V0IE1TQiBvbiBiYXNpYyByYXRlcyBhcyB0aGUgZmlybXdhcmUgcmVxdWlyZXMsIGJ1dCBfYWZ0ZXJfCisJICogY29weWluZyB0byBjdXJyZW50IGJzcyByYXRlcy4KKwkgKi8KKwlsYnNfc2V0X2Jhc2ljX3JhdGVfZmxhZ3MoY21kLmJzcy5yYXRlcywgcmF0ZXNpemUpOworCisJY21kLmJzcy5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5hdGltd2luZG93ID0gY3B1X3RvX2xlMTYoYnNzLT5hdGltd2luZG93KTsKKworCWlmIChhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQpIHsKKwkJdTE2IHRtcCA9IGxlMTZfdG9fY3B1KGNtZC5ic3MuY2FwYWJpbGl0eSk7CisJCXRtcCB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKKwkJY21kLmJzcy5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYodG1wKTsKKwl9CisKKwlpZiAocHJpdi0+cHNtb2RlID09IExCUzgwMl8xMVBPV0VSTU9ERU1BWF9QU1ApIHsKKwkJX19sZTMyIGxvY2FsX3BzX21vZGUgPSBjcHVfdG9fbGUzMihMQlM4MDJfMTFQT1dFUk1PREVDQU0pOworCisJCS8qIHdha2UgdXAgZmlyc3QgKi8KKwkJcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBDTURfODAyXzExX1BTX01PREUsCisJCQkJCQkgICBDTURfQUNUX1NFVCwgMCwgMCwKKwkJCQkJCSAgICZsb2NhbF9wc19tb2RlKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChsYnNfcGFyc2VfZG5sZF9jb3VudHJ5aW5mb18xMWQocHJpdiwgYnNzKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX0pPSU4sICZjbWQpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbGJzX2FkaG9jX3Bvc3QocHJpdiwgKHN0cnVjdCBjbWRfaGVhZGVyICopICZjbWQpOwogCiBvdXQ6CisJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfQVNTT0MsICJyZXQgJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzNiwzOSArMjk1LDEzMSBAQAogICogIEBicmllZiBTdGFydCBhbiBBZGhvYyBOZXR3b3JrCiAgKgogICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gYWRob2Nzc2lkICAgIFRoZSBzc2lkIG9mIHRoZSBBZGhvYyBOZXR3b3JrCi0gKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCAtMS0tZmFpbAorICogIEBwYXJhbSBhc3NvY19yZXEgICAgVGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZGVzY3JpYmluZyB0aGUgQlNTIHRvIHN0YXJ0CisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBpbnQgbGJzX3N0YXJ0X2FkaG9jX25ldHdvcmsoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorc3RhdGljIGludCBsYnNfYWRob2Nfc3RhcnQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAogCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEpCiB7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3N0YXJ0IGNtZDsKKwl1OCBwcmVhbWJsZSA9IFJBRElPX1BSRUFNQkxFX0xPTkc7CisJc2l6ZV90IHJhdGVzaXplID0gMDsKKwl1MTYgdG1wY2FwID0gMDsKIAlpbnQgcmV0ID0gMDsKIAotCXByaXYtPmFkaG9jY3JlYXRlID0gMTsKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQVNTT0MpOwogCiAJaWYgKHByaXYtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpIHsKLQkJbGJzX2RlYl9qb2luKCJBZGhvY1N0YXJ0OiBTaG9ydCBwcmVhbWJsZVxuIik7Ci0JCXByaXYtPnByZWFtYmxlID0gQ01EX1RZUEVfU0hPUlRfUFJFQU1CTEU7Ci0JfSBlbHNlIHsKLQkJbGJzX2RlYl9qb2luKCJBZGhvY1N0YXJ0OiBMb25nIHByZWFtYmxlXG4iKTsKLQkJcHJpdi0+cHJlYW1ibGUgPSBDTURfVFlQRV9MT05HX1BSRUFNQkxFOworCQlsYnNfZGViX2pvaW4oIkFESE9DX1NUQVJUOiBXaWxsIHVzZSBzaG9ydCBwcmVhbWJsZVxuIik7CisJCXByZWFtYmxlID0gUkFESU9fUFJFQU1CTEVfU0hPUlQ7CiAJfQogCi0JbGJzX3NldF9yYWRpb19jb250cm9sKHByaXYpOworCXJldCA9IGxic19zZXRfcmFkaW8ocHJpdiwgcHJlYW1ibGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JbGJzX2RlYl9qb2luKCJBZGhvY1N0YXJ0OiBjaGFubmVsID0gJWRcbiIsIGFzc29jX3JlcS0+Y2hhbm5lbCk7Ci0JbGJzX2RlYl9qb2luKCJBZGhvY1N0YXJ0OiBiYW5kID0gJWRcbiIsIGFzc29jX3JlcS0+YmFuZCk7CisJLyogQnVpbGQgdGhlIHN0YXJ0IGNvbW1hbmQgKi8KKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKIAotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9BRF9IT0NfU1RBUlQsCi0JCQkJICAgIDAsIENNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgYXNzb2NfcmVxKTsKKwltZW1jcHkoY21kLnNzaWQsIGFzc29jX3JlcS0+c3NpZCwgYXNzb2NfcmVxLT5zc2lkX2xlbik7CiAKKwlsYnNfZGViX2pvaW4oIkFESE9DX1NUQVJUOiBTU0lEICclcycsIHNzaWQgbGVuZ3RoICV1XG4iLAorCQllc2NhcGVfZXNzaWQoYXNzb2NfcmVxLT5zc2lkLCBhc3NvY19yZXEtPnNzaWRfbGVuKSwKKwkJYXNzb2NfcmVxLT5zc2lkX2xlbik7CisKKwljbWQuYnNzdHlwZSA9IENNRF9CU1NfVFlQRV9JQlNTOworCisJaWYgKHByaXYtPmJlYWNvbl9wZXJpb2QgPT0gMCkKKwkJcHJpdi0+YmVhY29uX3BlcmlvZCA9IE1SVkRSVl9CRUFDT05fSU5URVJWQUw7CisJY21kLmJlYWNvbnBlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOworCisJV0FSTl9PTighYXNzb2NfcmVxLT5jaGFubmVsKTsKKworCS8qIHNldCBQaHlzaWNhbCBwYXJhbWV0ZXIgc2V0ICovCisJY21kLnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQuZWxlbWVudGlkID0gTUZJRV9UWVBFX0RTX1NFVDsKKwljbWQucGh5cGFyYW1zZXQuZHNwYXJhbXNldC5sZW4gPSAxOworCWNtZC5waHlwYXJhbXNldC5kc3BhcmFtc2V0LmN1cnJlbnRjaGFuID0gYXNzb2NfcmVxLT5jaGFubmVsOworCisJLyogc2V0IElCU1MgcGFyYW1ldGVyIHNldCAqLworCWNtZC5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5lbGVtZW50aWQgPSBNRklFX1RZUEVfSUJTU19TRVQ7CisJY21kLnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmxlbiA9IDI7CisJY21kLnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmF0aW13aW5kb3cgPSAwOworCisJLyogc2V0IGNhcGFiaWxpdHkgaW5mbyAqLworCXRtcGNhcCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCWlmIChhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQpIHsKKwkJbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogV0VQIGVuYWJsZWQsIHNldHRpbmcgcHJpdmFjeSBvblxuIik7CisJCXRtcGNhcCB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKKwl9IGVsc2UKKwkJbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogV0VQIGRpc2FibGVkLCBzZXR0aW5nIHByaXZhY3kgb2ZmXG4iKTsKKworCWNtZC5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKKworCS8qIE9ubHkgdjggYW5kIGJlbG93IHN1cHBvcnQgc2V0dGluZyBwcm9iZSBkZWxheSAqLworCWlmIChwcml2LT5md3JlbGVhc2UgPCAweDA5MDAwMDAwKQorCQljbWQucHJvYmVkZWxheSA9IGNwdV90b19sZTE2KENNRF9TQ0FOX1BST0JFX0RFTEFZX1RJTUUpOworCisJcmF0ZXNpemUgPSBtaW4oc2l6ZW9mKGNtZC5yYXRlcyksIHNpemVvZihsYnNfYmdfcmF0ZXMpKTsKKwltZW1jcHkoY21kLnJhdGVzLCBsYnNfYmdfcmF0ZXMsIHJhdGVzaXplKTsKKworCS8qIENvcHkgdGhlIGFkLWhvYyBjcmVhdGluZyByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLworCW1lbXNldCgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCAwLCBzaXplb2YocHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzKSk7CisJbWVtY3B5KCZwcml2LT5jdXJic3NwYXJhbXMucmF0ZXMsICZjbWQucmF0ZXMsIHJhdGVzaXplKTsKKworCS8qIFNldCBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzLCBidXQgX2FmdGVyXworCSAqIGNvcHlpbmcgdG8gY3VycmVudCBic3MgcmF0ZXMuCisJICovCisJbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKGNtZC5yYXRlcywgcmF0ZXNpemUpOworCisJbGJzX2RlYl9qb2luKCJBREhPQ19TVEFSVDogcmF0ZXM9JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgICAgY21kLnJhdGVzWzBdLCBjbWQucmF0ZXNbMV0sIGNtZC5yYXRlc1syXSwgY21kLnJhdGVzWzNdKTsKKworCWlmIChsYnNfY3JlYXRlX2RubGRfY291bnRyeWluZm9fMTFkKHByaXYpKSB7CisJCWxic19kZWJfam9pbigiQURIT0NfU1RBUlQ6IGRubGRfY291bnRyeWluZm9fMTFkIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlsYnNfZGViX2pvaW4oIkFESE9DX1NUQVJUOiBTdGFydGluZyBBZC1Ib2MgQlNTIG9uIGNoYW5uZWwgJWQsIGJhbmQgJWRcbiIsCisJCSAgICAgYXNzb2NfcmVxLT5jaGFubmVsLCBhc3NvY19yZXEtPmJhbmQpOworCisJcHJpdi0+YWRob2NjcmVhdGUgPSAxOworCXByaXYtPm1vZGUgPSBJV19NT0RFX0FESE9DOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfQURfSE9DX1NUQVJULCAmY21kKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGxic19hZGhvY19wb3N0KHByaXYsIChzdHJ1Y3QgY21kX2hlYWRlciAqKSAmY21kKTsKKworb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0FTU09DLCAicmV0ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX3N0b3BfYWRob2NfbmV0d29yayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCisvKioKKyAqICBAYnJpZWYgU3RvcCBhbmQgQWQtSG9jIG5ldHdvcmsgYW5kIGV4aXQgQWQtSG9jIG1vZGUKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvcgorICovCitpbnQgbGJzX2FkaG9jX3N0b3Aoc3RydWN0IGxic19wcml2YXRlICpwcml2KQogewotCXJldHVybiBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIENNRF84MDJfMTFfQURfSE9DX1NUT1AsCi0JCQkJICAgICAwLCBDTURfT1BUSU9OX1dBSVRGT1JSU1AsIDAsIE5VTEwpOworCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdG9wIGNtZDsKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0pPSU4pOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZiAoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYgKHNpemVvZiAoY21kKSk7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9BRF9IT0NfU1RPUCwgJmNtZCk7CisKKwkvKiBDbGVhbiB1cCBldmVyeXRoaW5nIGV2ZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yICovCisJbGJzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisKKwlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfYnNzX25vX3NlY3VyaXR5KHN0cnVjdCBsYnNfODAyXzExX3NlY3VyaXR5ICpzZWNpbmZvLApAQCAtNDgwLDE0ICs3MzEsMTQgQEAKIAkJaWYgKGJzcyAhPSBOVUxMKSB7CiAJCQlsYnNfZGViX2Fzc29jKCJTU0lEIGZvdW5kLCB3aWxsIGpvaW5cbiIpOwogCQkJbWVtY3B5KCZhc3NvY19yZXEtPmJzcywgYnNzLCBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSk7Ci0JCQlsYnNfam9pbl9hZGhvY19uZXR3b3JrKHByaXYsIGFzc29jX3JlcSk7CisJCQlsYnNfYWRob2Nfam9pbihwcml2LCBhc3NvY19yZXEpOwogCQl9IGVsc2UgewogCQkJLyogZWxzZSBzZW5kIFNUQVJUIGNvbW1hbmQgKi8KIAkJCWxic19kZWJfYXNzb2MoIlNTSUQgbm90IGZvdW5kLCBjcmVhdGluZyBhZGhvYyBuZXR3b3JrXG4iKTsKIAkJCW1lbWNweSgmYXNzb2NfcmVxLT5ic3Muc3NpZCwgJmFzc29jX3JlcS0+c3NpZCwKIAkJCQlJV19FU1NJRF9NQVhfU0laRSk7CiAJCQlhc3NvY19yZXEtPmJzcy5zc2lkX2xlbiA9IGFzc29jX3JlcS0+c3NpZF9sZW47Ci0JCQlsYnNfc3RhcnRfYWRob2NfbmV0d29yayhwcml2LCBhc3NvY19yZXEpOworCQkJbGJzX2FkaG9jX3N0YXJ0KHByaXYsIGFzc29jX3JlcSk7CiAJCX0KIAl9CiAKQEAgLTUyMCw3ICs3NzEsNyBAQAogCQlyZXQgPSBsYnNfYXNzb2NpYXRlKHByaXYsIGFzc29jX3JlcSk7CiAJCWxic19kZWJfYXNzb2MoIkFTU09DOiBsYnNfYXNzb2NpYXRlKGJzc2lkKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKIAl9IGVsc2UgaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCWxic19qb2luX2FkaG9jX25ldHdvcmsocHJpdiwgYXNzb2NfcmVxKTsKKwkJbGJzX2FkaG9jX2pvaW4ocHJpdiwgYXNzb2NfcmVxKTsKIAl9CiAKIG91dDoKQEAgLTU3MiwxMSArODIzLDcgQEAKIAl9CiAKIAlwcml2LT5tb2RlID0gYXNzb2NfcmVxLT5tb2RlOwotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCQkgICAgQ01EXzgwMl8xMV9TTk1QX01JQiwKLQkJCQkgICAgMCwgQ01EX09QVElPTl9XQUlURk9SUlNQLAotCQkJCSAgICBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUsCi0JCS8qIFNob290IG1lIG5vdyAqLyAgKHZvaWQgKikgKHNpemVfdCkgYXNzb2NfcmVxLT5tb2RlKTsKKwlyZXQgPSBsYnNfc2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9CU1NfVFlQRSwgYXNzb2NfcmVxLT5tb2RlKTsKIAogZG9uZToKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9BU1NPQywgInJldCAlZCIsIHJldCk7CkBAIC0xMDI5LDcgKzEyNzYsOSBAQAogCSAqLwogCWlmIChwcml2LT5tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJaWYgKHNob3VsZF9kZWF1dGhfaW5mcmFzdHJ1Y3R1cmUocHJpdiwgYXNzb2NfcmVxKSkgewotCQkJcmV0ID0gbGJzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKKwkJCXJldCA9IGxic19jbWRfODAyMTFfZGVhdXRoZW50aWNhdGUocHJpdiwKKwkJCQkJCQkgICBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCQkJCQkJICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQkJaWYgKHJldCkgewogCQkJCWxic19kZWJfYXNzb2MoIkRlYXV0aGVudGljYXRpb24gZHVlIHRvIG5ldyAiCiAJCQkJCSJjb25maWd1cmF0aW9uIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKQEAgLTEwMzgsNyArMTI4Nyw3IEBACiAJCX0KIAl9IGVsc2UgaWYgKHByaXYtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQlpZiAoc2hvdWxkX3N0b3BfYWRob2MocHJpdiwgYXNzb2NfcmVxKSkgewotCQkJcmV0ID0gbGJzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKwkJCXJldCA9IGxic19hZGhvY19zdG9wKHByaXYpOwogCQkJaWYgKHJldCkgewogCQkJCWxic19kZWJfYXNzb2MoIlRlYXJkb3duIG9mIEFkSG9jIG5ldHdvcmsgZHVlIHRvICIKIAkJCQkJIm5ldyBjb25maWd1cmF0aW9uIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKQEAgLTEyMTQsOTQgKzE0NjMsNiBAQAogCiAKIC8qKgotICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGNvbW1vbiByYXRlcyBiZXR3ZWVuIHJhdGUxIGFuZCBjYXJkIHJhdGVzLgotICoKLSAqIEl0IHdpbGwgZmlsbCBjb21tb24gcmF0ZXMgaW4gcmF0ZTEgYXMgb3V0cHV0IGlmIGZvdW5kLgotICoKLSAqIE5PVEU6IFNldHRpbmcgdGhlIE1TQiBvZiB0aGUgYmFzaWMgcmF0ZXMgbmVlZCB0byBiZSB0YWtlbgotICogICBjYXJlLCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICoKLSAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcmF0ZTEgICAgICAgdGhlIGJ1ZmZlciB3aGljaCBrZWVwcyBpbnB1dCBhbmQgb3V0cHV0Ci0gKiAgQHBhcmFtIHJhdGUxX3NpemUgIHRoZSBzaXplIG9mIHJhdGUxIGJ1ZmZlcjsgbmV3IHNpemUgb2YgYnVmZmVyIG9uIHJldHVybgotICoKLSAqICBAcmV0dXJuICAgICAgICAgICAgMCBvciAtMQotICovCi1zdGF0aWMgaW50IGdldF9jb21tb25fcmF0ZXMoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCXU4ICpyYXRlcywKLQl1MTYgKnJhdGVzX3NpemUpCi17Ci0JdTggKmNhcmRfcmF0ZXMgPSBsYnNfYmdfcmF0ZXM7Ci0Jc2l6ZV90IG51bV9jYXJkX3JhdGVzID0gc2l6ZW9mKGxic19iZ19yYXRlcyk7Ci0JaW50IHJldCA9IDAsIGksIGo7Ci0JdTggdG1wWzMwXTsKLQlzaXplX3QgdG1wX3NpemUgPSAwOwotCi0JLyogRm9yIGVhY2ggcmF0ZSBpbiBjYXJkX3JhdGVzIHRoYXQgZXhpc3RzIGluIHJhdGUxLCBjb3B5IHRvIHRtcCAqLwotCWZvciAoaSA9IDA7IGNhcmRfcmF0ZXNbaV0gJiYgKGkgPCBudW1fY2FyZF9yYXRlcyk7IGkrKykgewotCQlmb3IgKGogPSAwOyByYXRlc1tqXSAmJiAoaiA8ICpyYXRlc19zaXplKTsgaisrKSB7Ci0JCQlpZiAocmF0ZXNbal0gPT0gY2FyZF9yYXRlc1tpXSkKLQkJCQl0bXBbdG1wX3NpemUrK10gPSBjYXJkX3JhdGVzW2ldOwotCQl9Ci0JfQotCi0JbGJzX2RlYl9oZXgoTEJTX0RFQl9KT0lOLCAiQVAgcmF0ZXMgICAgIiwgcmF0ZXMsICpyYXRlc19zaXplKTsKLQlsYnNfZGViX2hleChMQlNfREVCX0pPSU4sICJjYXJkIHJhdGVzICAiLCBjYXJkX3JhdGVzLCBudW1fY2FyZF9yYXRlcyk7Ci0JbGJzX2RlYl9oZXgoTEJTX0RFQl9KT0lOLCAiY29tbW9uIHJhdGVzIiwgdG1wLCB0bXBfc2l6ZSk7Ci0JbGJzX2RlYl9qb2luKCJUWCBkYXRhIHJhdGUgMHglMDJ4XG4iLCBwcml2LT5jdXJfcmF0ZSk7Ci0KLQlpZiAoIXByaXYtPmVuYWJsZWh3YXV0bykgewotCQlmb3IgKGkgPSAwOyBpIDwgdG1wX3NpemU7IGkrKykgewotCQkJaWYgKHRtcFtpXSA9PSBwcml2LT5jdXJfcmF0ZSkKLQkJCQlnb3RvIGRvbmU7Ci0JCX0KLQkJbGJzX3ByX2FsZXJ0KCJQcmV2aW91c2x5IHNldCBmaXhlZCBkYXRhIHJhdGUgJSN4IGlzbid0ICIKLQkJICAgICAgICJjb21wYXRpYmxlIHdpdGggdGhlIG5ldHdvcmsuXG4iLCBwcml2LT5jdXJfcmF0ZSk7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JbWVtc2V0KHJhdGVzLCAwLCAqcmF0ZXNfc2l6ZSk7Ci0JKnJhdGVzX3NpemUgPSBtaW5fdChpbnQsIHRtcF9zaXplLCAqcmF0ZXNfc2l6ZSk7Ci0JbWVtY3B5KHJhdGVzLCB0bXAsICpyYXRlc19zaXplKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogIEBicmllZiBTZXRzIHRoZSBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzCi0gKgotICogU2NhbiB0aHJvdWdoIGFuIGFycmF5IGFuZCBzZXQgdGhlIE1TQiBmb3IgYmFzaWMgZGF0YSByYXRlcy4KLSAqCi0gKiAgQHBhcmFtIHJhdGVzICAgICBidWZmZXIgb2YgZGF0YSByYXRlcwotICogIEBwYXJhbSBsZW4gICAgICAgc2l6ZSBvZiBidWZmZXIKLSAqLwotc3RhdGljIHZvaWQgbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKHU4ICpyYXRlcywgc2l6ZV90IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAocmF0ZXNbaV0gPT0gMHgwMiB8fCByYXRlc1tpXSA9PSAweDA0IHx8Ci0JCSAgICByYXRlc1tpXSA9PSAweDBiIHx8IHJhdGVzW2ldID09IDB4MTYpCi0JCQlyYXRlc1tpXSB8PSAweDgwOwotCX0KLX0KLQotLyoqCi0gKiAgQGJyaWVmIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBSZXF1ZXN0Ci0gKgotICogIEBwYXJhbSBwcml2ICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuICAgICAgICAgIDAtLXN1Y2Nlc3MsIC0xLS1mYWlsCi0gKi8KLWludCBsYnNfc2VuZF9kZWF1dGhlbnRpY2F0aW9uKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKLXsKLQlyZXR1cm4gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBDTURfODAyXzExX0RFQVVUSEVOVElDQVRFLAotCQkJCSAgICAgMCwgQ01EX09QVElPTl9XQUlURk9SUlNQLCAwLCBOVUxMKTsKLX0KLQotLyoqCiAgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgY29tbWFuZCBvZiBhdXRoZW50aWNhdGUuCiAgKgogICogIEBwYXJhbSBwcml2ICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKQEAgLTEzNTMsMjYgKzE1MTQsMzcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCisvKioKKyAqICBAYnJpZWYgRGVhdXRoZW50aWNhdGUgZnJvbSBhIHNwZWNpZmljIEJTUworICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgQSBwb2ludGVyIHRvIHN0cnVjdCBsYnNfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYnNzaWQgICAgICAgVGhlIHNwZWNpZmljIEJTUyB0byBkZWF1dGhlbnRpY2F0ZSBmcm9tCisgKiAgQHBhcmFtIHJlYXNvbiAgICAgIFRoZSA4MDIuMTEgc2VjLiA3LjMuMS43IFJlYXNvbiBDb2RlIGZvciBkZWF1dGhlbnRpY2F0aW5nCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxic19jbWRfODAyMTFfZGVhdXRoZW50aWNhdGUoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCBic3NpZFtFVEhfQUxFTl0sCisJCQkJIHUxNiByZWFzb24pCiB7Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfZGVhdXRoZW50aWNhdGUgKmRhdXRoID0gJmNtZC0+cGFyYW1zLmRlYXV0aDsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBjbWQ7CisJaW50IHJldDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKIAotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfREVBVVRIRU5USUNBVEUpOwotCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSkgKwotCQkJICAgICBTX0RTX0dFTik7CisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJbWVtY3B5KGNtZC5tYWNhZGRyLCAmYnNzaWRbMF0sIEVUSF9BTEVOKTsKKwljbWQucmVhc29uY29kZSA9IGNwdV90b19sZTE2KHJlYXNvbik7CiAKLQkvKiBzZXQgQVAgTUFDIGFkZHJlc3MgKi8KLQltZW1tb3ZlKGRhdXRoLT5tYWNhZGRyLCBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsIEVUSF9BTEVOKTsKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9ERUFVVEhFTlRJQ0FURSwgJmNtZCk7CiAKLQkvKiBSZWFzb24gY29kZSAzID0gU3RhdGlvbiBpcyBsZWF2aW5nICovCi0jZGVmaW5lIFJFQVNPTl9DT0RFX1NUQV9MRUFWSU5HIDMKLQlkYXV0aC0+cmVhc29uY29kZSA9IGNwdV90b19sZTE2KFJFQVNPTl9DT0RFX1NUQV9MRUFWSU5HKTsKKwkvKiBDbGVhbiB1cCBldmVyeXRoaW5nIGV2ZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yOyBjYW4ndCBhc3N1bWUgdGhhdAorCSAqIHdlJ3JlIHN0aWxsIGF1dGhlbnRpY2F0ZWQgdG8gdGhlIEFQIGFmdGVyIHRyeWluZyB0byBkZWF1dGguCisJICovCisJbGJzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CiAKIAlsYnNfZGViX2xlYXZlKExCU19ERUJfSk9JTik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGxic19jbWRfODAyMTFfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKQEAgLTE0ODksMjMxICsxNjYxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX2NtZF84MDIxMV9hZF9ob2Nfc3RhcnQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqcGRhdGFfYnVmKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCAqYWRocyA9ICZjbWQtPnBhcmFtcy5hZHM7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNtZGFwcGVuZHNpemUgPSAwOwotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEgPSBwZGF0YV9idWY7Ci0JdTE2IHRtcGNhcCA9IDA7Ci0Jc2l6ZV90IHJhdGVzaXplID0gMDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKLQotCWlmICghcHJpdikgewotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfQURfSE9DX1NUQVJUKTsKLQotCS8qCi0JICogRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgMiBkYXRhIHN0cnVjdHVyZXM6Ci0JICogICAxLiBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCBjb21tYW5kCi0JICogICAyLiBwcml2LT5zY2FudGFibGVbaV0KLQkgKgotCSAqIERyaXZlciB3aWxsIGZpbGwgdXAgU1NJRCwgYnNzdHlwZSxJQlNTIHBhcmFtLCBQaHlzaWNhbCBQYXJhbSwKLQkgKiAgIHByb2JlIGRlbGF5LCBhbmQgY2FwIGluZm8uCi0JICoKLQkgKiBGaXJtd2FyZSB3aWxsIGZpbGwgdXAgYmVhY29uIHBlcmlvZCwgRFRJTSwgQmFzaWMgcmF0ZXMKLQkgKiAgIGFuZCBvcGVyYXRpb25hbCByYXRlcy4KLQkgKi8KLQotCW1lbXNldChhZGhzLT5zc2lkLCAwLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JbWVtY3B5KGFkaHMtPnNzaWQsIGFzc29jX3JlcS0+c3NpZCwgYXNzb2NfcmVxLT5zc2lkX2xlbik7Ci0KLQlsYnNfZGViX2pvaW4oIkFESE9DX1NfQ01EOiBTU0lEICclcycsIHNzaWQgbGVuZ3RoICV1XG4iLAotCQllc2NhcGVfZXNzaWQoYXNzb2NfcmVxLT5zc2lkLCBhc3NvY19yZXEtPnNzaWRfbGVuKSwKLQkJYXNzb2NfcmVxLT5zc2lkX2xlbik7Ci0KLQkvKiBzZXQgdGhlIEJTUyB0eXBlICovCi0JYWRocy0+YnNzdHlwZSA9IENNRF9CU1NfVFlQRV9JQlNTOwotCXByaXYtPm1vZGUgPSBJV19NT0RFX0FESE9DOwotCWlmIChwcml2LT5iZWFjb25fcGVyaW9kID09IDApCi0JCXByaXYtPmJlYWNvbl9wZXJpb2QgPSBNUlZEUlZfQkVBQ09OX0lOVEVSVkFMOwotCWFkaHMtPmJlYWNvbnBlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOwotCi0JLyogc2V0IFBoeXNpY2FsIHBhcmFtIHNldCAqLwotI2RlZmluZSBEU19QQVJBX0lFX0lEICAgMwotI2RlZmluZSBEU19QQVJBX0lFX0xFTiAgMQotCi0JYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5lbGVtZW50aWQgPSBEU19QQVJBX0lFX0lEOwotCWFkaHMtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQubGVuID0gRFNfUEFSQV9JRV9MRU47Ci0KLQlXQVJOX09OKCFhc3NvY19yZXEtPmNoYW5uZWwpOwotCi0JbGJzX2RlYl9qb2luKCJBREhPQ19TX0NNRDogQ3JlYXRpbmcgQURIT0Mgb24gY2hhbm5lbCAlZFxuIiwKLQkJICAgICBhc3NvY19yZXEtPmNoYW5uZWwpOwotCi0JYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5jdXJyZW50Y2hhbiA9IGFzc29jX3JlcS0+Y2hhbm5lbDsKLQotCS8qIHNldCBJQlNTIHBhcmFtIHNldCAqLwotI2RlZmluZSBJQlNTX1BBUkFfSUVfSUQgICA2Ci0jZGVmaW5lIElCU1NfUEFSQV9JRV9MRU4gIDIKLQotCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmVsZW1lbnRpZCA9IElCU1NfUEFSQV9JRV9JRDsKLQlhZGhzLT5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5sZW4gPSBJQlNTX1BBUkFfSUVfTEVOOwotCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmF0aW13aW5kb3cgPSAwOwotCi0JLyogc2V0IGNhcGFiaWxpdHkgaW5mbyAqLwotCXRtcGNhcCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCWlmIChhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQpIHsKLQkJbGJzX2RlYl9qb2luKCJBREhPQ19TX0NNRDogV0VQIGVuYWJsZWQsICIKLQkJCSJzZXR0aW5nIHByaXZhY3kgb25cbiIpOwotCQl0bXBjYXAgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7Ci0JfSBlbHNlIHsKLQkJbGJzX2RlYl9qb2luKCJBREhPQ19TX0NNRDogV0VQIGRpc2FibGVkLCAiCi0JCQkic2V0dGluZyBwcml2YWN5IG9mZlxuIik7Ci0JfQotCWFkaHMtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNih0bXBjYXApOwotCi0JLyogcHJvYmVkZWxheSAqLwotCWFkaHMtPnByb2JlZGVsYXkgPSBjcHVfdG9fbGUxNihDTURfU0NBTl9QUk9CRV9ERUxBWV9USU1FKTsKLQotCW1lbXNldChhZGhzLT5yYXRlcywgMCwgc2l6ZW9mKGFkaHMtPnJhdGVzKSk7Ci0JcmF0ZXNpemUgPSBtaW4oc2l6ZW9mKGFkaHMtPnJhdGVzKSwgc2l6ZW9mKGxic19iZ19yYXRlcykpOwotCW1lbWNweShhZGhzLT5yYXRlcywgbGJzX2JnX3JhdGVzLCByYXRlc2l6ZSk7Ci0KLQkvKiBDb3B5IHRoZSBhZC1ob2MgY3JlYXRpbmcgcmF0ZXMgaW50byBDdXJyZW50IEJTUyBzdGF0ZSBzdHJ1Y3R1cmUgKi8KLQltZW1zZXQoJnByaXYtPmN1cmJzc3BhcmFtcy5yYXRlcywgMCwgc2l6ZW9mKHByaXYtPmN1cmJzc3BhcmFtcy5yYXRlcykpOwotCW1lbWNweSgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCAmYWRocy0+cmF0ZXMsIHJhdGVzaXplKTsKLQotCS8qIFNldCBNU0Igb24gYmFzaWMgcmF0ZXMgYXMgdGhlIGZpcm13YXJlIHJlcXVpcmVzLCBidXQgX2FmdGVyXwotCSAqIGNvcHlpbmcgdG8gY3VycmVudCBic3MgcmF0ZXMuCi0JICovCi0JbGJzX3NldF9iYXNpY19yYXRlX2ZsYWdzKGFkaHMtPnJhdGVzLCByYXRlc2l6ZSk7Ci0KLQlsYnNfZGViX2pvaW4oIkFESE9DX1NfQ01EOiByYXRlcz0lMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKLQkgICAgICAgYWRocy0+cmF0ZXNbMF0sIGFkaHMtPnJhdGVzWzFdLCBhZGhzLT5yYXRlc1syXSwgYWRocy0+cmF0ZXNbM10pOwotCi0JbGJzX2RlYl9qb2luKCJBREhPQ19TX0NNRDogQUQgSE9DIFN0YXJ0IGNvbW1hbmQgaXMgcmVhZHlcbiIpOwotCi0JaWYgKGxic19jcmVhdGVfZG5sZF9jb3VudHJ5aW5mb18xMWQocHJpdikpIHsKLQkJbGJzX2RlYl9qb2luKCJBREhPQ19TX0NNRDogZG5sZF9jb3VudHJ5aW5mb18xMWQgZmFpbGVkXG4iKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3N0YXJ0KSArCi0JCQkJU19EU19HRU4gKyBjbWRhcHBlbmRzaXplKTsKLQotCXJldCA9IDA7Ci1kb25lOgotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0pPSU4sICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBsYnNfY21kXzgwMjExX2FkX2hvY19zdG9wKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQotewotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfQURfSE9DX1NUT1ApOwotCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KFNfRFNfR0VOKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbGJzX2NtZF84MDIxMV9hZF9ob2Nfam9pbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsIHZvaWQgKnBkYXRhX2J1ZikKLXsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbiAqam9pbl9jbWQgPSAmY21kLT5wYXJhbXMuYWRqOwotCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICphc3NvY19yZXEgPSBwZGF0YV9idWY7Ci0Jc3RydWN0IGJzc19kZXNjcmlwdG9yICpic3MgPSAmYXNzb2NfcmVxLT5ic3M7Ci0JaW50IGNtZGFwcGVuZHNpemUgPSAwOwotCWludCByZXQgPSAwOwotCXUxNiByYXRlc2l6ZSA9IDA7Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfSk9JTik7Ci0KLQljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX0FEX0hPQ19KT0lOKTsKLQotCWpvaW5fY21kLT5ic3MudHlwZSA9IENNRF9CU1NfVFlQRV9JQlNTOwotCWpvaW5fY21kLT5ic3MuYmVhY29ucGVyaW9kID0gY3B1X3RvX2xlMTYoYnNzLT5iZWFjb25wZXJpb2QpOwotCi0JbWVtY3B5KCZqb2luX2NtZC0+YnNzLmJzc2lkLCAmYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweSgmam9pbl9jbWQtPmJzcy5zc2lkLCAmYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKTsKLQotCW1lbWNweSgmam9pbl9jbWQtPmJzcy5waHlwYXJhbXNldCwgJmJzcy0+cGh5cGFyYW1zZXQsCi0JICAgICAgIHNpemVvZih1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQpKTsKLQotCW1lbWNweSgmam9pbl9jbWQtPmJzcy5zc3BhcmFtc2V0LCAmYnNzLT5zc3BhcmFtc2V0LAotCSAgICAgICBzaXplb2YodW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQpKTsKLQotCWpvaW5fY21kLT5ic3MuY2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGJzcy0+Y2FwYWJpbGl0eSAmIENBUElORk9fTUFTSyk7Ci0JbGJzX2RlYl9qb2luKCJBREhPQ19KX0NNRDogdG1wY2FwPSU0WCBDQVBJTkZPX01BU0s9JTRYXG4iLAotCSAgICAgICBic3MtPmNhcGFiaWxpdHksIENBUElORk9fTUFTSyk7Ci0KLQkvKiBpbmZvcm1hdGlvbiBvbiBCU1NJRCBkZXNjcmlwdG9yIHBhc3NlZCB0byBGVyAqLwotCWxic19kZWJfam9pbigKLQkgICAgICAgIkFESE9DX0pfQ01EOiBCU1NJRCA9ICVzLCBTU0lEID0gJyVzJ1xuIiwKLQkgICAgICAgcHJpbnRfbWFjKG1hYywgam9pbl9jbWQtPmJzcy5ic3NpZCksCi0JICAgICAgIGpvaW5fY21kLT5ic3Muc3NpZCk7Ci0KLQkvKiBmYWlsdGltZW91dCAqLwotCWpvaW5fY21kLT5mYWlsdGltZW91dCA9IGNwdV90b19sZTE2KE1SVkRSVl9BU1NPQ0lBVElPTl9USU1FX09VVCk7Ci0KLQkvKiBwcm9iZWRlbGF5ICovCi0Jam9pbl9jbWQtPnByb2JlZGVsYXkgPSBjcHVfdG9fbGUxNihDTURfU0NBTl9QUk9CRV9ERUxBWV9USU1FKTsKLQotCXByaXYtPmN1cmJzc3BhcmFtcy5jaGFubmVsID0gYnNzLT5jaGFubmVsOwotCi0JLyogQ29weSBEYXRhIHJhdGVzIGZyb20gdGhlIHJhdGVzIHJlY29yZGVkIGluIHNjYW4gcmVzcG9uc2UgKi8KLQltZW1zZXQoam9pbl9jbWQtPmJzcy5yYXRlcywgMCwgc2l6ZW9mKGpvaW5fY21kLT5ic3MucmF0ZXMpKTsKLQlyYXRlc2l6ZSA9IG1pbl90KHUxNiwgc2l6ZW9mKGpvaW5fY21kLT5ic3MucmF0ZXMpLCBNQVhfUkFURVMpOwotCW1lbWNweShqb2luX2NtZC0+YnNzLnJhdGVzLCBic3MtPnJhdGVzLCByYXRlc2l6ZSk7Ci0JaWYgKGdldF9jb21tb25fcmF0ZXMocHJpdiwgam9pbl9jbWQtPmJzcy5yYXRlcywgJnJhdGVzaXplKSkgewotCQlsYnNfZGViX2pvaW4oIkFESE9DX0pfQ01EOiBnZXRfY29tbW9uX3JhdGVzIHJldHVybnMgZXJyb3IuXG4iKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBDb3B5IHRoZSBhZC1ob2MgY3JlYXRpbmcgcmF0ZXMgaW50byBDdXJyZW50IEJTUyBzdGF0ZSBzdHJ1Y3R1cmUgKi8KLQltZW1zZXQoJnByaXYtPmN1cmJzc3BhcmFtcy5yYXRlcywgMCwgc2l6ZW9mKHByaXYtPmN1cmJzc3BhcmFtcy5yYXRlcykpOwotCW1lbWNweSgmcHJpdi0+Y3VyYnNzcGFyYW1zLnJhdGVzLCBqb2luX2NtZC0+YnNzLnJhdGVzLCByYXRlc2l6ZSk7Ci0KLQkvKiBTZXQgTVNCIG9uIGJhc2ljIHJhdGVzIGFzIHRoZSBmaXJtd2FyZSByZXF1aXJlcywgYnV0IF9hZnRlcl8KLQkgKiBjb3B5aW5nIHRvIGN1cnJlbnQgYnNzIHJhdGVzLgotCSAqLwotCWxic19zZXRfYmFzaWNfcmF0ZV9mbGFncyhqb2luX2NtZC0+YnNzLnJhdGVzLCByYXRlc2l6ZSk7Ci0KLQlqb2luX2NtZC0+YnNzLnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmF0aW13aW5kb3cgPQotCSAgICBjcHVfdG9fbGUxNihic3MtPmF0aW13aW5kb3cpOwotCi0JaWYgKGFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCkgewotCQl1MTYgdG1wID0gbGUxNl90b19jcHUoam9pbl9jbWQtPmJzcy5jYXBhYmlsaXR5KTsKLQkJdG1wIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCQlqb2luX2NtZC0+YnNzLmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNih0bXApOwotCX0KLQotCWlmIChwcml2LT5wc21vZGUgPT0gTEJTODAyXzExUE9XRVJNT0RFTUFYX1BTUCkgewotCQkvKiB3YWtlIHVwIGZpcnN0ICovCi0JCV9fbGUzMiBMb2NhbHBzbW9kZTsKLQotCQlMb2NhbHBzbW9kZSA9IGNwdV90b19sZTMyKExCUzgwMl8xMVBPV0VSTU9ERUNBTSk7Ci0JCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCQkJICAgIENNRF84MDJfMTFfUFNfTU9ERSwKLQkJCQkJICAgIENNRF9BQ1RfU0VULAotCQkJCQkgICAgMCwgMCwgJkxvY2FscHNtb2RlKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtMTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChsYnNfcGFyc2VfZG5sZF9jb3VudHJ5aW5mb18xMWQocHJpdiwgYnNzKSkgewotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQotCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbikgKwotCQkJCVNfRFNfR0VOICsgY21kYXBwZW5kc2l6ZSk7Ci0KLWRvbmU6Ci0JbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfSk9JTiwgInJldCAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogaW50IGxic19yZXRfODAyMTFfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKIAkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKIHsKQEAgLTE4MTUsMzQgKzE3NjIsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX3JldF84MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGxic19wcml2YXRlICpwcml2KQotewotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9KT0lOKTsKLQotCWxic19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOwotCi0JbGJzX2RlYl9sZWF2ZShMQlNfREVCX0pPSU4pOwotCXJldHVybiAwOwotfQotCi1pbnQgbGJzX3JldF84MDIxMV9hZF9ob2Nfc3RhcnQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCitzdGF0aWMgaW50IGxic19hZGhvY19wb3N0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApCiB7CiAJaW50IHJldCA9IDA7CiAJdTE2IGNvbW1hbmQgPSBsZTE2X3RvX2NwdShyZXNwLT5jb21tYW5kKTsKIAl1MTYgcmVzdWx0ID0gbGUxNl90b19jcHUocmVzcC0+cmVzdWx0KTsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0ICpwYWRob2NyZXN1bHQ7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3Jlc3VsdCAqYWRob2NfcmVzcDsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJc3RydWN0IGJzc19kZXNjcmlwdG9yICpic3M7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfSk9JTik7CiAKLQlwYWRob2NyZXN1bHQgPSAmcmVzcC0+cGFyYW1zLnJlc3VsdDsKLQotCWxic19kZWJfam9pbigiQURIT0NfUkVTUDogc2l6ZSA9ICVkXG4iLCBsZTE2X3RvX2NwdShyZXNwLT5zaXplKSk7Ci0JbGJzX2RlYl9qb2luKCJBREhPQ19SRVNQOiBjb21tYW5kID0gJXhcbiIsIGNvbW1hbmQpOwotCWxic19kZWJfam9pbigiQURIT0NfUkVTUDogcmVzdWx0ID0gJXhcbiIsIHJlc3VsdCk7CisJYWRob2NfcmVzcCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0ICopIHJlc3A7CiAKIAlpZiAoIXByaXYtPmluX3Byb2dyZXNzX2Fzc29jX3JlcSkgewogCQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IG5vIGluLXByb2dyZXNzIGFzc29jaWF0aW9uICIKQEAgLTE4NTYsMjYgKzE3ODgsMTkgQEAKIAkgKiBKb2luIHJlc3VsdCBjb2RlIDAgLS0+IFNVQ0NFU1MKIAkgKi8KIAlpZiAocmVzdWx0KSB7Ci0JCWxic19kZWJfam9pbigiQURIT0NfUkVTUDogZmFpbGVkXG4iKTsKKwkJbGJzX2RlYl9qb2luKCJBREhPQ19SRVNQOiBmYWlsZWQgKHJlc3VsdCAweCVYKVxuIiwgcmVzdWx0KTsKIAkJaWYgKHByaXYtPmNvbm5lY3Rfc3RhdHVzID09IExCU19DT05ORUNURUQpCiAJCQlsYnNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQkvKgotCSAqIE5vdyB0aGUgam9pbiBjbWQgc2hvdWxkIGJlIHN1Y2Nlc3NmdWwKLQkgKiBJZiBCU1NJRCBoYXMgY2hhbmdlZCB1c2UgU1NJRCB0byBjb21wYXJlIGluc3RlYWQgb2YgQlNTSUQKLQkgKi8KLQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IGFzc29jaWF0ZWQgdG8gJyVzJ1xuIiwKLQkJZXNjYXBlX2Vzc2lkKGJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbikpOwotCiAJLyogU2VuZCBhIE1lZGlhIENvbm5lY3RlZCBldmVudCwgYWNjb3JkaW5nIHRvIHRoZSBTcGVjICovCiAJcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfQ09OTkVDVEVEOwogCiAJaWYgKGNvbW1hbmQgPT0gQ01EX1JFVChDTURfODAyXzExX0FEX0hPQ19TVEFSVCkpIHsKIAkJLyogVXBkYXRlIHRoZSBjcmVhdGVkIG5ldHdvcmsgZGVzY3JpcHRvciB3aXRoIHRoZSBuZXcgQlNTSUQgKi8KLQkJbWVtY3B5KGJzcy0+YnNzaWQsIHBhZGhvY3Jlc3VsdC0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzcy0+YnNzaWQsIGFkaG9jX3Jlc3AtPmJzc2lkLCBFVEhfQUxFTik7CiAJfQogCiAJLyogU2V0IHRoZSBCU1NJRCBmcm9tIHRoZSBqb2luZWQvc3RhcnRlZCBkZXNjcmlwdG9yICovCkBAIC0xODk0LDIyICsxODE5LDEzIEBACiAJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CiAKLQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IC0gSm9pbmVkL1N0YXJ0ZWQgQWQgSG9jXG4iKTsKLQlsYnNfZGViX2pvaW4oIkFESE9DX1JFU1A6IGNoYW5uZWwgPSAlZFxuIiwgcHJpdi0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOwotCWxic19kZWJfam9pbigiQURIT0NfUkVTUDogQlNTSUQgPSAlc1xuIiwKLQkJICAgICBwcmludF9tYWMobWFjLCBwYWRob2NyZXN1bHQtPmJzc2lkKSk7CisJbGJzX2RlYl9qb2luKCJBREhPQ19SRVNQOiBKb2luZWQvc3RhcnRlZCAnJXMnLCBCU1NJRCAlcywgY2hhbm5lbCAlZFxuIiwKKwkJICAgICBlc2NhcGVfZXNzaWQoYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKSwKKwkJICAgICBwcmludF9tYWMobWFjLCBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQpLAorCQkgICAgIHByaXYtPmN1cmJzc3BhcmFtcy5jaGFubmVsKTsKIAogZG9uZToKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9KT0lOLCAicmV0ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX3JldF84MDIxMV9hZF9ob2Nfc3RvcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCi17Ci0JbGJzX2RlYl9lbnRlcihMQlNfREVCX0pPSU4pOwotCi0JbGJzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7Ci0KLQlsYnNfZGViX2xlYXZlKExCU19ERUJfSk9JTik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvYXNzb2MuaAppbmRleCBjNTE2ZmJlLi44YjczMzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmgKQEAgLTEyLDI4ICsxMiwxOCBAQAogaW50IGxic19jbWRfODAyMTFfYXV0aGVudGljYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCiAJCQkJCXZvaWQgKnBkYXRhX2J1Zik7Ci1pbnQgbGJzX2NtZF84MDIxMV9hZF9ob2Nfam9pbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAotCQkJCSAgICAgICB2b2lkICpwZGF0YV9idWYpOwotaW50IGxic19jbWRfODAyMTFfYWRfaG9jX3N0b3Aoc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpOwotaW50IGxic19jbWRfODAyMTFfYWRfaG9jX3N0YXJ0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJCXZvaWQgKnBkYXRhX2J1Zik7CisKK2ludCBsYnNfYWRob2Nfc3RvcChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOworCiBpbnQgbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCi0JCQkJCSAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpOworCQkJCSB1OCBic3NpZFtFVEhfQUxFTl0sIHUxNiByZWFzb24pOwogaW50IGxic19jbWRfODAyMTFfYXNzb2NpYXRlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKIAkJCQkgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAogCQkJCSAgICAgdm9pZCAqcGRhdGFfYnVmKTsKIAogaW50IGxic19yZXRfODAyMTFfYWRfaG9jX3N0YXJ0KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKLWludCBsYnNfcmV0XzgwMjExX2FkX2hvY19zdG9wKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7Ci1pbnQgbGJzX3JldF84MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGxic19wcml2YXRlICpwcml2KTsKIGludCBsYnNfcmV0XzgwMjExX2Fzc29jaWF0ZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCiAJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOwogCi1pbnQgbGJzX3N0b3BfYWRob2NfbmV0d29yayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwotCi1pbnQgbGJzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpOwotCiAjZW5kaWYgLyogX0xCU19BU1NPQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IDc1NDI3ZTYuLjI5NzY5NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC00ODAsMTgxICs0ODAsMTY2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsYnNfY21kXzgwMl8xMV9yZXNldChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgaW50IGNtZF9hY3Rpb24pCisvKioKKyAqICBAYnJpZWYgU2V0IGFuIFNOTVAgTUlCIHZhbHVlCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBvaWQgIAlUaGUgT0lEIHRvIHNldCBpbiB0aGUgZmlybXdhcmUKKyAqICBAcGFyYW0gdmFsICAJVmFsdWUgdG8gc2V0IHRoZSBPSUQgdG8KKyAqCisgKiAgQHJldHVybiAJICAgCTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX3NldF9zbm1wX21pYihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBvaWQsIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQgKnJlc2V0ID0gJmNtZC0+cGFyYW1zLnJlc2V0OworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliIGNtZDsKKwlpbnQgcmV0OwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CiAKLQljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX1JFU0VUKTsKLQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQpICsgU19EU19HRU4pOwotCXJlc2V0LT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mIChjbWQpKTsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfU0VUKTsKKwljbWQub2lkID0gY3B1X3RvX2xlMTYoKHUxNikgb2lkKTsKIAotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19jbWRfODAyXzExX3NubXBfbWliKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCi0JCQkJICAgIGludCBjbWRfYWN0aW9uLAotCQkJCSAgICBpbnQgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliICpwU05NUE1JQiA9ICZjbWQtPnBhcmFtcy5zbWliOwotCXU4IHVjVGVtcDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JbGJzX2RlYl9jbWQoIlNOTVBfQ01EOiBjbWRfb2lkID0gMHgleFxuIiwgY21kX29pZCk7Ci0KLQljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX1NOTVBfTUlCKTsKLQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoKnBTTk1QTUlCKSArIFNfRFNfR0VOKTsKLQotCXN3aXRjaCAoY21kX29pZCkgewotCWNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgotCXsKLQkJdTggbW9kZSA9ICh1OCkgKHNpemVfdCkgcGRhdGFfYnVmOwotCQlwU05NUE1JQi0+cXVlcnl0eXBlID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOwotCQlwU05NUE1JQi0+b2lkID0gY3B1X3RvX2xlMTYoKHUxNikgREVTSVJFRF9CU1NUWVBFX0kpOwotCQlwU05NUE1JQi0+YnVmc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1OCkpOwotCQlpZiAobW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9BREhPQzsKLQkJfSBlbHNlIHsKLQkJCS8qIEluZnJhIGFuZCBBdXRvIG1vZGVzICovCi0JCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9JTkZSQTsKLQkJfQotCi0JCW1lbW1vdmUocFNOTVBNSUItPnZhbHVlLCAmdWNUZW1wLCBzaXplb2YodTgpKTsKLQorCXN3aXRjaCAob2lkKSB7CisJY2FzZSBTTk1QX01JQl9PSURfQlNTX1RZUEU6CisJCWNtZC5idWZzaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHU4KSk7CisJCWNtZC52YWx1ZVswXSA9ICh2YWwgPT0gSVdfTU9ERV9BREhPQykgPyAyIDogMTsKIAkJYnJlYWs7Ci0JfQotCi0JY2FzZSBPSURfODAyXzExRF9FTkFCTEU6Ci0JCXsKLQkJCXUzMiB1bFRlbXA7Ci0KLQkJCXBTTk1QTUlCLT5vaWQgPSBjcHVfdG9fbGUxNigodTE2KSBET1QxMURfSSk7Ci0KLQkJCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfU0VUKSB7Ci0JCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNwdV90b19sZTE2KENNRF9BQ1RfU0VUKTsKLQkJCQlwU05NUE1JQi0+YnVmc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKLQkJCQl1bFRlbXAgPSAqKHUzMiAqKXBkYXRhX2J1ZjsKLQkJCQkqKChfX2xlMTYgKikocFNOTVBNSUItPnZhbHVlKSkgPQotCQkJCSAgICBjcHVfdG9fbGUxNigodTE2KSB1bFRlbXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKLQkJewotCQkJdTMyIHVsVGVtcDsKLQotCQkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIEZSQUdUSFJFU0hfSSk7Ci0KLQkJCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfR0VUKSB7Ci0JCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNwdV90b19sZTE2KENNRF9BQ1RfR0VUKTsKLQkJCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBDTURfQUNUX1NFVCkgewotCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7Ci0JCQkJcFNOTVBNSUItPmJ1ZnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YodTE2KSk7Ci0JCQkJdWxUZW1wID0gKigodTMyICopIHBkYXRhX2J1Zik7Ci0JCQkJKigoX19sZTE2ICopKHBTTk1QTUlCLT52YWx1ZSkpID0KLQkJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgdWxUZW1wKTsKLQotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6Ci0JCXsKLQotCQkJdTMyIHVsVGVtcDsKLQkJCXBTTk1QTUlCLT5vaWQgPSBjcHVfdG9fbGUxNihSVFNUSFJFU0hfSSk7Ci0KLQkJCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfR0VUKSB7Ci0JCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNwdV90b19sZTE2KENNRF9BQ1RfR0VUKTsKLQkJCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBDTURfQUNUX1NFVCkgewotCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7Ci0JCQkJcFNOTVBNSUItPmJ1ZnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YodTE2KSk7Ci0JCQkJdWxUZW1wID0gKigodTMyICopcGRhdGFfYnVmKTsKLQkJCQkqKF9fbGUxNiAqKShwU05NUE1JQi0+dmFsdWUpID0KLQkJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgdWxUZW1wKTsKLQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIE9JRF84MDJfMTFfVFhfUkVUUllDT1VOVDoKLQkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIFNIT1JUX1JFVFJZTElNX0kpOwotCi0JCWlmIChjbWRfYWN0aW9uID09IENNRF9BQ1RfR0VUKSB7Ci0JCQlwU05NUE1JQi0+cXVlcnl0eXBlID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9HRVQpOwotCQl9IGVsc2UgaWYgKGNtZF9hY3Rpb24gPT0gQ01EX0FDVF9TRVQpIHsKLQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7Ci0JCQlwU05NUE1JQi0+YnVmc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKLQkJCSooKF9fbGUxNiAqKShwU05NUE1JQi0+dmFsdWUpKSA9Ci0JCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgcHJpdi0+dHhyZXRyeWNvdW50KTsKLQkJfQotCisJY2FzZSBTTk1QX01JQl9PSURfMTFEX0VOQUJMRToKKwljYXNlIFNOTVBfTUlCX09JRF9GUkFHX1RIUkVTSE9MRDoKKwljYXNlIFNOTVBfTUlCX09JRF9SVFNfVEhSRVNIT0xEOgorCWNhc2UgU05NUF9NSUJfT0lEX1NIT1JUX1JFVFJZX0xJTUlUOgorCWNhc2UgU05NUF9NSUJfT0lEX0xPTkdfUkVUUllfTElNSVQ6CisJCWNtZC5idWZzaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHUxNikpOworCQkqKChfX2xlMTYgKikoJmNtZC52YWx1ZSkpID0gY3B1X3RvX2xlMTYodmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCWxic19kZWJfY21kKCJTTk1QX0NNRDogKHNldCkgdW5oYW5kbGVkIE9JRCAweCV4XG4iLCBvaWQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKIAl9CiAKLQlsYnNfZGViX2NtZCgKLQkgICAgICAgIlNOTVBfQ01EOiBjb21tYW5kPTB4JXgsIHNpemU9MHgleCwgc2VxbnVtPTB4JXgsIHJlc3VsdD0weCV4XG4iLAotCSAgICAgICBsZTE2X3RvX2NwdShjbWQtPmNvbW1hbmQpLCBsZTE2X3RvX2NwdShjbWQtPnNpemUpLAotCSAgICAgICBsZTE2X3RvX2NwdShjbWQtPnNlcW51bSksIGxlMTZfdG9fY3B1KGNtZC0+cmVzdWx0KSk7CisJbGJzX2RlYl9jbWQoIlNOTVBfQ01EOiAoc2V0KSBvaWQgMHgleCwgb2lkIHNpemUgMHgleCwgdmFsdWUgMHgleFxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KGNtZC5vaWQpLCBsZTE2X3RvX2NwdShjbWQuYnVmc2l6ZSksIHZhbCk7CiAKLQlsYnNfZGViX2NtZCgKLQkgICAgICAgIlNOTVBfQ01EOiBhY3Rpb24gMHgleCwgb2lkIDB4JXgsIG9pZHNpemUgMHgleCwgdmFsdWUgMHgleFxuIiwKLQkgICAgICAgbGUxNl90b19jcHUocFNOTVBNSUItPnF1ZXJ5dHlwZSksIGxlMTZfdG9fY3B1KHBTTk1QTUlCLT5vaWQpLAotCSAgICAgICBsZTE2X3RvX2NwdShwU05NUE1JQi0+YnVmc2l6ZSksCi0JICAgICAgIGxlMTZfdG9fY3B1KCooX19sZTE2ICopIHBTTk1QTUlCLT52YWx1ZSkpOworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1NOTVBfTUlCLCAmY21kKTsKIAotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOworb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsYnNfY21kXzgwMl8xMV9yZl90eF9wb3dlcihzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKLQkJCQkgICAgICAgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKKy8qKgorICogIEBicmllZiBHZXQgYW4gU05NUCBNSUIgdmFsdWUKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIG9pZCAgCVRoZSBPSUQgdG8gcmV0cmlldmUgZnJvbSB0aGUgZmlybXdhcmUKKyAqICBAcGFyYW0gb3V0X3ZhbCAgCUxvY2F0aW9uIGZvciB0aGUgcmV0dXJuZWQgdmFsdWUKKyAqCisgKiAgQHJldHVybiAJICAgCTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX2dldF9zbm1wX21pYihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBvaWQsIHUxNiAqb3V0X3ZhbCkKIHsKLQotCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyICpwcnRwID0gJmNtZC0+cGFyYW1zLnR4cDsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbm1wX21pYiBjbWQ7CisJaW50IHJldDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwogCi0JY21kLT5zaXplID0KLQkgICAgY3B1X3RvX2xlMTYoKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl90eF9wb3dlcikpICsgU19EU19HRU4pOwotCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfUkZfVFhfUE9XRVIpOwotCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCW1lbXNldCgmY21kLCAwLCBzaXplb2YgKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9HRVQpOworCWNtZC5vaWQgPSBjcHVfdG9fbGUxNihvaWQpOwogCi0JbGJzX2RlYl9jbWQoIlJGX1RYX1BPV0VSX0NNRDogc2l6ZTolZCBjbWQ6MHgleCBBY3Q6JWRcbiIsCi0JCSAgICBsZTE2X3RvX2NwdShjbWQtPnNpemUpLCBsZTE2X3RvX2NwdShjbWQtPmNvbW1hbmQpLAotCQkgICAgbGUxNl90b19jcHUocHJ0cC0+YWN0aW9uKSk7CisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfU05NUF9NSUIsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0Jc3dpdGNoIChjbWRfYWN0aW9uKSB7Ci0JY2FzZSBDTURfQUNUX1RYX1BPV0VSX09QVF9HRVQ6Ci0JCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfR0VUKTsKLQkJcHJ0cC0+Y3VycmVudGxldmVsID0gMDsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGNtZC5idWZzaXplKSkgeworCWNhc2Ugc2l6ZW9mKHU4KToKKwkJaWYgKG9pZCA9PSBTTk1QX01JQl9PSURfQlNTX1RZUEUpIHsKKwkJCWlmIChjbWQudmFsdWVbMF0gPT0gMikKKwkJCQkqb3V0X3ZhbCA9IElXX01PREVfQURIT0M7CisJCQllbHNlCisJCQkJKm91dF92YWwgPSBJV19NT0RFX0lORlJBOworCQl9IGVsc2UKKwkJCSpvdXRfdmFsID0gY21kLnZhbHVlWzBdOwogCQlicmVhazsKLQotCWNhc2UgQ01EX0FDVF9UWF9QT1dFUl9PUFRfU0VUX0hJR0g6Ci0JCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfU0VUKTsKLQkJcHJ0cC0+Y3VycmVudGxldmVsID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9UWF9QT1dFUl9JTkRFWF9ISUdIKTsKKwljYXNlIHNpemVvZih1MTYpOgorCQkqb3V0X3ZhbCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKSgmY21kLnZhbHVlKSkpOwogCQlicmVhazsKLQotCWNhc2UgQ01EX0FDVF9UWF9QT1dFUl9PUFRfU0VUX01JRDoKLQkJcHJ0cC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOwotCQlwcnRwLT5jdXJyZW50bGV2ZWwgPSBjcHVfdG9fbGUxNihDTURfQUNUX1RYX1BPV0VSX0lOREVYX01JRCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfQUNUX1RYX1BPV0VSX09QVF9TRVRfTE9XOgotCQlwcnRwLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7Ci0JCXBydHAtPmN1cnJlbnRsZXZlbCA9IGNwdV90b19sZTE2KCooKHUxNiAqKSBwZGF0YV9idWYpKTsKKwlkZWZhdWx0OgorCQlsYnNfZGViX2NtZCgiU05NUF9DTUQ6IChnZXQpIHVuaGFuZGxlZCBPSUQgMHgleCBzaXplICVkXG4iLAorCQkgICAgICAgICAgICBvaWQsIGxlMTZfdG9fY3B1KGNtZC5idWZzaXplKSk7CiAJCWJyZWFrOwogCX0KIAorb3V0OgorCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldCB0aGUgbWluLCBtYXgsIGFuZCBjdXJyZW50IFRYIHBvd2VyCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBjdXJsZXZlbCAgCUN1cnJlbnQgcG93ZXIgbGV2ZWwgaW4gZEJtCisgKiAgQHBhcmFtIG1pbmxldmVsICAJTWluaW11bSBzdXBwb3J0ZWQgcG93ZXIgbGV2ZWwgaW4gZEJtIChvcHRpb25hbCkKKyAqICBAcGFyYW0gbWF4bGV2ZWwgIAlNYXhpbXVtIHN1cHBvcnRlZCBwb3dlciBsZXZlbCBpbiBkQm0gKG9wdGlvbmFsKQorICoKKyAqICBAcmV0dXJuIAkgICAJMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCisgKi8KK2ludCBsYnNfZ2V0X3R4X3Bvd2VyKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgczE2ICpjdXJsZXZlbCwgczE2ICptaW5sZXZlbCwKKwkJICAgICBzMTYgKm1heGxldmVsKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIGNtZDsKKwlpbnQgcmV0OworCisJbGJzX2RlYl9lbnRlcihMQlNfREVCX0NNRCk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9HRVQpOworCisJcmV0ID0gbGJzX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIENNRF84MDJfMTFfUkZfVFhfUE9XRVIsICZjbWQpOworCWlmIChyZXQgPT0gMCkgeworCQkqY3VybGV2ZWwgPSBsZTE2X3RvX2NwdShjbWQuY3VybGV2ZWwpOworCQlpZiAobWlubGV2ZWwpCisJCQkqbWlubGV2ZWwgPSBsZTE2X3RvX2NwdShjbWQubWlubGV2ZWwpOworCQlpZiAobWF4bGV2ZWwpCisJCQkqbWF4bGV2ZWwgPSBsZTE2X3RvX2NwdShjbWQubWF4bGV2ZWwpOworCX0KKwogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgdGhlIFRYIHBvd2VyCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBkYm0gIAlUaGUgZGVzaXJlZCBwb3dlciBsZXZlbCBpbiBkQm0KKyAqCisgKiAgQHJldHVybiAJICAgCTAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZQorICovCitpbnQgbGJzX3NldF90eF9wb3dlcihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHMxNiBkYm0pCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIgY21kOworCWludCByZXQ7CisKKwlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7CisJY21kLmN1cmxldmVsID0gY3B1X3RvX2xlMTYoZGJtKTsKKworCWxic19kZWJfY21kKCJTRVRfUkZfVFhfUE9XRVI6ICVkIGRCbVxuIiwgZGJtKTsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1JGX1RYX1BPV0VSLCAmY21kKTsKKworCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbGJzX2NtZF84MDJfMTFfbW9uaXRvcl9tb2RlKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLApAQCAtODM4LDcgKzgyMyw5IEBACiBpbnQgbGJzX3NldF9jaGFubmVsKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTggY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9jaGFubmVsIGNtZDsKKyNpZmRlZiBERUJVRwogCXU4IG9sZF9jaGFubmVsID0gcHJpdi0+Y3VyYnNzcGFyYW1zLmNoYW5uZWw7CisjZW5kaWYKIAlpbnQgcmV0ID0gMDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwpAQCAtMTAzMyw5ICsxMDIwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGJzX21lc2hfY29uZmlnX3NlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJIHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcgKmNtZCwKLQkJCSB1aW50MTZfdCBhY3Rpb24sIHVpbnQxNl90IHR5cGUpCitzdGF0aWMgaW50IF9fbGJzX21lc2hfY29uZmlnX3NlbmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LAorCQkJCSAgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyAqY21kLAorCQkJCSAgdWludDE2X3QgYWN0aW9uLCB1aW50MTZfdCB0eXBlKQogewogCWludCByZXQ7CiAKQEAgLTEwNTQsNiArMTA0MSwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBsYnNfbWVzaF9jb25maWdfc2VuZChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCisJCQkgc3RydWN0IGNtZF9kc19tZXNoX2NvbmZpZyAqY21kLAorCQkJIHVpbnQxNl90IGFjdGlvbiwgdWludDE2X3QgdHlwZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCEocHJpdi0+ZndjYXBpbmZvICYgRldfQ0FQSU5GT19QRVJTSVNURU5UX0NPTkZJRykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldCA9IF9fbGJzX21lc2hfY29uZmlnX3NlbmQocHJpdiwgY21kLCBhY3Rpb24sIHR5cGUpOworCXJldHVybiByZXQ7Cit9CisKIC8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIENNRF9NRVNIX0NPTkZJRyBsZWdhY3kgZnVuY3Rpb24uICBJdCBvbmx5IGhhbmRsZXMgdGhlCiAgKiBTVEFSVCBhbmQgU1RPUCBhY3Rpb25zLiAgVGhlIGV4dGVuZGVkIGFjdGlvbnMgc3VwcG9ydGVkIGJ5IENNRF9NRVNIX0NPTkZJRwogICogYXJlIGFsbCBoYW5kbGVkIGJ5IHByZXBhcmluZyBhIHN0cnVjdCBjbWRfZHNfbWVzaF9jb25maWcgYW5kIHBhc3NpbmcgaXQgdG8KQEAgLTEwOTUsNyArMTA5NSw3IEBACiAJCSAgICBhY3Rpb24sIHByaXYtPm1lc2hfdGx2LCBjaGFuLAogCQkgICAgZXNjYXBlX2Vzc2lkKHByaXYtPm1lc2hfc3NpZCwgcHJpdi0+bWVzaF9zc2lkX2xlbikpOwogCi0JcmV0dXJuIGxic19tZXNoX2NvbmZpZ19zZW5kKHByaXYsICZjbWQsIGFjdGlvbiwgcHJpdi0+bWVzaF90bHYpOworCXJldHVybiBfX2xic19tZXNoX2NvbmZpZ19zZW5kKHByaXYsICZjbWQsIGFjdGlvbiwgcHJpdi0+bWVzaF90bHYpOwogfQogCiBzdGF0aWMgaW50IGxic19jbWRfYmNuX2N0cmwoc3RydWN0IGxic19wcml2YXRlICogcHJpdiwKQEAgLTEyNTYsNDEgKzEyNTYsNDcgQEAKIAlwcml2LT5jdXJfY21kID0gTlVMTDsKIH0KIAotaW50IGxic19zZXRfcmFkaW9fY29udHJvbChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCitpbnQgbGJzX3NldF9yYWRpbyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHU4IHByZWFtYmxlLCB1OCByYWRpb19vbikKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYWRpb19jb250cm9sIGNtZDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwogCiAJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOwogCWNtZC5hY3Rpb24gPSBjcHVfdG9fbGUxNihDTURfQUNUX1NFVCk7CiAKLQlzd2l0Y2ggKHByaXYtPnByZWFtYmxlKSB7Ci0JY2FzZSBDTURfVFlQRV9TSE9SVF9QUkVBTUJMRToKLQkJY21kLmNvbnRyb2wgPSBjcHVfdG9fbGUxNihTRVRfU0hPUlRfUFJFQU1CTEUpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1RZUEVfTE9OR19QUkVBTUJMRToKLQkJY21kLmNvbnRyb2wgPSBjcHVfdG9fbGUxNihTRVRfTE9OR19QUkVBTUJMRSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfVFlQRV9BVVRPX1BSRUFNQkxFOgotCWRlZmF1bHQ6Ci0JCWNtZC5jb250cm9sID0gY3B1X3RvX2xlMTYoU0VUX0FVVE9fUFJFQU1CTEUpOwotCQlicmVhazsKKwkvKiBPbmx5IHY4IGFuZCBiZWxvdyBzdXBwb3J0IHNldHRpbmcgdGhlIHByZWFtYmxlICovCisJaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKKwkJc3dpdGNoIChwcmVhbWJsZSkgeworCQljYXNlIFJBRElPX1BSRUFNQkxFX1NIT1JUOgorCQkJaWYgKCEocHJpdi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkpCisJCQkJZ290byBvdXQ7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBSQURJT19QUkVBTUJMRV9BVVRPOgorCQljYXNlIFJBRElPX1BSRUFNQkxFX0xPTkc6CisJCQljbWQuY29udHJvbCA9IGNwdV90b19sZTE2KHByZWFtYmxlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKLQlpZiAocHJpdi0+cmFkaW9vbikKLQkJY21kLmNvbnRyb2wgfD0gY3B1X3RvX2xlMTYoVFVSTl9PTl9SRik7Ci0JZWxzZQotCQljbWQuY29udHJvbCAmPSBjcHVfdG9fbGUxNih+VFVSTl9PTl9SRik7CisJaWYgKHJhZGlvX29uKQorCQljbWQuY29udHJvbCB8PSBjcHVfdG9fbGUxNigweDEpOworCWVsc2UgeworCQljbWQuY29udHJvbCAmPSBjcHVfdG9fbGUxNih+MHgxKTsKKwkJcHJpdi0+dHhwb3dlcl9jdXIgPSAwOworCX0KIAotCWxic19kZWJfY21kKCJSQURJT19TRVQ6IHJhZGlvICVkLCBwcmVhbWJsZSAlZFxuIiwgcHJpdi0+cmFkaW9vbiwKLQkJICAgIHByaXYtPnByZWFtYmxlKTsKKwlsYnNfZGViX2NtZCgiUkFESU9fQ09OVFJPTDogcmFkaW8gJXMsIHByZWFtYmxlICVkXG4iLAorCQkgICAgcmFkaW9fb24gPyAiT04iIDogIk9GRiIsIHByZWFtYmxlKTsKKworCXByaXYtPnJhZGlvX29uID0gcmFkaW9fb247CiAKIAlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9SQURJT19DT05UUk9MLCAmY21kKTsKIAorb3V0OgogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0NNRCwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzODAsNTUgKzEzODYsMjUgQEAKIAkJcmV0ID0gbGJzX2NtZF84MDIxMV9hc3NvY2lhdGUocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOwogCQlicmVhazsKIAotCWNhc2UgQ01EXzgwMl8xMV9ERUFVVEhFTlRJQ0FURToKLQkJcmV0ID0gbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShwcml2LCBjbWRwdHIpOwotCQlicmVhazsKLQotCWNhc2UgQ01EXzgwMl8xMV9BRF9IT0NfU1RBUlQ6Ci0JCXJldCA9IGxic19jbWRfODAyMTFfYWRfaG9jX3N0YXJ0KHByaXYsIGNtZHB0ciwgcGRhdGFfYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF84MDJfMTFfUkVTRVQ6Ci0JCXJldCA9IGxic19jbWRfODAyXzExX3Jlc2V0KGNtZHB0ciwgY21kX2FjdGlvbik7Ci0JCWJyZWFrOwotCiAJY2FzZSBDTURfODAyXzExX0FVVEhFTlRJQ0FURToKIAkJcmV0ID0gbGJzX2NtZF84MDIxMV9hdXRoZW50aWNhdGUocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOwogCQlicmVhazsKIAotCWNhc2UgQ01EXzgwMl8xMV9TTk1QX01JQjoKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfc25tcF9taWIocHJpdiwgY21kcHRyLAotCQkJCQkgICAgICAgY21kX2FjdGlvbiwgY21kX29pZCwgcGRhdGFfYnVmKTsKLQkJYnJlYWs7Ci0KIAljYXNlIENNRF9NQUNfUkVHX0FDQ0VTUzoKIAljYXNlIENNRF9CQlBfUkVHX0FDQ0VTUzoKIAljYXNlIENNRF9SRl9SRUdfQUNDRVNTOgogCQlyZXQgPSBsYnNfY21kX3JlZ19hY2Nlc3MoY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOwogCQlicmVhazsKIAotCWNhc2UgQ01EXzgwMl8xMV9SRl9UWF9QT1dFUjoKLQkJcmV0ID0gbGJzX2NtZF84MDJfMTFfcmZfdHhfcG93ZXIoY21kcHRyLAotCQkJCQkJIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7Ci0JCWJyZWFrOwotCiAJY2FzZSBDTURfODAyXzExX01PTklUT1JfTU9ERToKIAkJcmV0ID0gbGJzX2NtZF84MDJfMTFfbW9uaXRvcl9tb2RlKGNtZHB0ciwKIAkJCQkgICAgICAgICAgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKIAkJYnJlYWs7CiAKLQljYXNlIENNRF84MDJfMTFfQURfSE9DX0pPSU46Ci0JCXJldCA9IGxic19jbWRfODAyMTFfYWRfaG9jX2pvaW4ocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOwotCQlicmVhazsKLQogCWNhc2UgQ01EXzgwMl8xMV9SU1NJOgogCQlyZXQgPSBsYnNfY21kXzgwMl8xMV9yc3NpKHByaXYsIGNtZHB0cik7CiAJCWJyZWFrOwogCi0JY2FzZSBDTURfODAyXzExX0FEX0hPQ19TVE9QOgotCQlyZXQgPSBsYnNfY21kXzgwMjExX2FkX2hvY19zdG9wKGNtZHB0cik7Ci0JCWJyZWFrOwotCiAJY2FzZSBDTURfODAyXzExX1NFVF9BRkM6CiAJY2FzZSBDTURfODAyXzExX0dFVF9BRkM6CiAKQEAgLTE5NTMsNiArMTkyOSw3MCBAQAogfQogCiAKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZXMgdGhlIHRyYW5zbWlzc2lvbiBwb3dlciBjb250cm9sIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiBAcGFyYW0gZW5hYmxlCVRyYW5zbWlzc2lvbiBwb3dlciBjb250cm9sIGVuYWJsZQorICogQHBhcmFtIHAwCQlQb3dlciBsZXZlbCB3aGVuIGxpbmsgcXVhbGl0eSBpcyBnb29kIChkQm0pLgorICogQHBhcmFtIHAxCQlQb3dlciBsZXZlbCB3aGVuIGxpbmsgcXVhbGl0eSBpcyBmYWlyIChkQm0pLgorICogQHBhcmFtIHAyCQlQb3dlciBsZXZlbCB3aGVuIGxpbmsgcXVhbGl0eSBpcyBwb29yIChkQm0pLgorICogQHBhcmFtIHVzZXNucglVc2UgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIGluIFRQQworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCisgKi8KK2ludCBsYnNfc2V0X3RwY19jZmcoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZW5hYmxlLCBpbnQ4X3QgcDAsIGludDhfdCBwMSwKKwkJaW50OF90IHAyLCBpbnQgdXNlc25yKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcgY21kOworCWludCByZXQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWNtZC5lbmFibGUgPSAhIWVuYWJsZTsKKwljbWQudXNlc25yID0gISF1c2VzbnI7CisJY21kLlAwID0gcDA7CisJY21kLlAxID0gcDE7CisJY21kLlAyID0gcDI7CisKKwlyZXQgPSBsYnNfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9UUENfQ0ZHLCAmY21kKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZXMgdGhlIHBvd2VyIGFkYXB0YXRpb24gc2V0dGluZ3MuCisgKgorICogQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJzX3ByaXZhdGUgc3RydWN0dXJlCisgKiBAcGFyYW0gZW5hYmxlCVBvd2VyIGFkYXB0YXRpb24gZW5hYmxlCisgKiBAcGFyYW0gcDAJCVBvd2VyIGxldmVsIGZvciAxLCAyLCA1LjUgYW5kIDExIE1icHMgKGRCbSkuCisgKiBAcGFyYW0gcDEJCVBvd2VyIGxldmVsIGZvciA2LCA5LCAxMiwgMTgsIDIyLCAyNCBhbmQgMzYgTWJwcyAoZEJtKS4KKyAqIEBwYXJhbSBwMgkJUG93ZXIgbGV2ZWwgZm9yIDQ4IGFuZCA1NCBNYnBzIChkQm0pLgorICoKKyAqIEByZXR1cm4gMCBvbiBTdWNjZXNzCisgKi8KKworaW50IGxic19zZXRfcG93ZXJfYWRhcHRfY2ZnKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgaW50IGVuYWJsZSwgaW50OF90IHAwLAorCQlpbnQ4X3QgcDEsIGludDhfdCBwMikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wYV9jZmcgY21kOworCWludCByZXQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWNtZC5lbmFibGUgPSAhIWVuYWJsZTsKKwljbWQuUDAgPSBwMDsKKwljbWQuUDEgPSBwMTsKKwljbWQuUDIgPSBwMjsKKworCXJldCA9IGxic19jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1BBX0NGRyAsICZjbWQpOworCisJcmV0dXJuIHJldDsKK30KKworCiBzdGF0aWMgc3RydWN0IGNtZF9jdHJsX25vZGUgKl9fbGJzX2NtZF9hc3luYyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsCiAJdWludDE2X3QgY29tbWFuZCwgc3RydWN0IGNtZF9oZWFkZXIgKmluX2NtZCwgaW50IGluX2NtZF9zaXplLAogCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgbGJzX3ByaXZhdGUgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGNtZF9oZWFkZXIgKiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCmluZGV4IGE1M2I1MWYuLjM2YmU0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5oCkBAIC0yNiw2ICsyNiwxOCBAQAogCSAgICAgIGludCAoKmNhbGxiYWNrKShzdHJ1Y3QgbGJzX3ByaXZhdGUgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGNtZF9oZWFkZXIgKiksCiAJICAgICAgdW5zaWduZWQgbG9uZyBjYWxsYmFja19hcmcpOwogCitpbnQgbGJzX3NldF9wb3dlcl9hZGFwdF9jZmcoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZW5hYmxlLCBpbnQ4X3QgcDAsCisJCWludDhfdCBwMSwgaW50OF90IHAyKTsKKworaW50IGxic19zZXRfdHBjX2NmZyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCBlbmFibGUsIGludDhfdCBwMCwgaW50OF90IHAxLAorCQlpbnQ4X3QgcDIsIGludCB1c2VzbnIpOworCitpbnQgbGJzX3NldF9wb3dlcl9hZGFwdF9jZmcoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBpbnQgZW5hYmxlLCBpbnQ4X3QgcDAsCisJCWludDhfdCBwMSwgaW50OF90IHAyKTsKKworaW50IGxic19zZXRfdHBjX2NmZyhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIGludCBlbmFibGUsIGludDhfdCBwMCwgaW50OF90IHAxLAorCQlpbnQ4X3QgcDIsIGludCB1c2VzbnIpOworCiBpbnQgbGJzX2NtZF9jb3B5YmFjayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZXh0cmEsCiAJCSAgICAgc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApOwogCkBAIC02MSw0ICs3MywxNCBAQAogaW50IGxic19jbWRfODAyXzExX2tleV9tYXRlcmlhbChzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNtZF9hY3Rpb24sCiAJCQkJc3RydWN0IGFzc29jX3JlcXVlc3QgKmFzc29jKTsKIAoraW50IGxic19nZXRfdHhfcG93ZXIoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzMTYgKmN1cmxldmVsLCBzMTYgKm1pbmxldmVsLAorCQkgICAgIHMxNiAqbWF4bGV2ZWwpOworaW50IGxic19zZXRfdHhfcG93ZXIoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzMTYgZGJtKTsKKworaW50IGxic19zZXRfcmFkaW8oc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCBwcmVhbWJsZSwgdTggcmFkaW9fb24pOworCitpbnQgbGJzX3NldF9zbm1wX21pYihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBvaWQsIHUxNiB2YWwpOworCitpbnQgbGJzX2dldF9zbm1wX21pYihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHUzMiBvaWQsIHUxNiAqb3V0X3ZhbCk7CisKICNlbmRpZiAvKiBfTEJTX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKaW5kZXggMjRkZTNjMy4uYmNmMmE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwpAQCAtMTQ2LDYzICsxNDYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbGJzX3JldF84MDJfMTFfc25tcF9taWIoc3RydWN0IGxic19wcml2YXRlICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCi17Ci0Jc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgKnNtaWIgPSAmcmVzcC0+cGFyYW1zLnNtaWI7Ci0JdTE2IG9pZCA9IGxlMTZfdG9fY3B1KHNtaWItPm9pZCk7Ci0JdTE2IHF1ZXJ5dHlwZSA9IGxlMTZfdG9fY3B1KHNtaWItPnF1ZXJ5dHlwZSk7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfQ01EKTsKLQotCWxic19kZWJfY21kKCJTTk1QX1JFU1A6IG9pZCAweCV4LCBxdWVyeXR5cGUgMHgleFxuIiwgb2lkLAotCSAgICAgICBxdWVyeXR5cGUpOwotCWxic19kZWJfY21kKCJTTk1QX1JFU1A6IEJ1ZiBzaXplICVkXG4iLCBsZTE2X3RvX2NwdShzbWliLT5idWZzaXplKSk7Ci0KLQlpZiAocXVlcnl0eXBlID09IENNRF9BQ1RfR0VUKSB7Ci0JCXN3aXRjaCAob2lkKSB7Ci0JCWNhc2UgRlJBR1RIUkVTSF9JOgotCQkJcHJpdi0+ZnJhZ3Roc2QgPQotCQkJCWxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKShzbWliLT52YWx1ZSkpKTsKLQkJCWxic19kZWJfY21kKCJTTk1QX1JFU1A6IGZyYWcgdGhyZXNob2xkICV1XG4iLAotCQkJCSAgICBwcml2LT5mcmFndGhzZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSVFNUSFJFU0hfSToKLQkJCXByaXYtPnJ0c3Roc2QgPQotCQkJCWxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKShzbWliLT52YWx1ZSkpKTsKLQkJCWxic19kZWJfY21kKCJTTk1QX1JFU1A6IHJ0cyB0aHJlc2hvbGQgJXVcbiIsCi0JCQkJICAgIHByaXYtPnJ0c3Roc2QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0hPUlRfUkVUUllMSU1fSToKLQkJCXByaXYtPnR4cmV0cnljb3VudCA9Ci0JCQkJbGUxNl90b19jcHUoKigoX19sZTE2ICopKHNtaWItPnZhbHVlKSkpOwotCQkJbGJzX2RlYl9jbWQoIlNOTVBfUkVTUDogdHggcmV0cnkgY291bnQgJXVcbiIsCi0JCQkJICAgIHByaXYtPnJ0c3Roc2QpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxic19yZXRfODAyXzExX3JmX3R4X3Bvd2VyKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQotewotCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyICpydHAgPSAmcmVzcC0+cGFyYW1zLnR4cDsKLQotCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DTUQpOwotCi0JcHJpdi0+dHhwb3dlcmxldmVsID0gbGUxNl90b19jcHUocnRwLT5jdXJyZW50bGV2ZWwpOwotCi0JbGJzX2RlYl9jbWQoIlRYIHBvd2VyIGN1cnJlbnRseSAlZFxuIiwgcHJpdi0+dHhwb3dlcmxldmVsKTsKLQotCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGxic19yZXRfODAyXzExX3Jzc2koc3RydWN0IGxic19wcml2YXRlICpwcml2LAogCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKIHsKQEAgLTI3MywyNCArMjE2LDYgQEAKIAkJcmV0ID0gbGJzX3JldF84MDIxMV9hc3NvY2lhdGUocHJpdiwgcmVzcCk7CiAJCWJyZWFrOwogCi0JY2FzZSBDTURfUkVUKENNRF84MDJfMTFfRElTQVNTT0NJQVRFKToKLQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9ERUFVVEhFTlRJQ0FURSk6Ci0JCXJldCA9IGxic19yZXRfODAyMTFfZGlzYXNzb2NpYXRlKHByaXYpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX0FEX0hPQ19TVEFSVCk6Ci0JY2FzZSBDTURfUkVUKENNRF84MDJfMTFfQURfSE9DX0pPSU4pOgotCQlyZXQgPSBsYnNfcmV0XzgwMjExX2FkX2hvY19zdGFydChwcml2LCByZXNwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9TTk1QX01JQik6Ci0JCXJldCA9IGxic19yZXRfODAyXzExX3NubXBfbWliKHByaXYsIHJlc3ApOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX1JGX1RYX1BPV0VSKToKLQkJcmV0ID0gbGJzX3JldF84MDJfMTFfcmZfdHhfcG93ZXIocHJpdiwgcmVzcCk7Ci0JCWJyZWFrOwotCiAJY2FzZSBDTURfUkVUKENNRF84MDJfMTFfU0VUX0FGQyk6CiAJY2FzZSBDTURfUkVUKENNRF84MDJfMTFfR0VUX0FGQyk6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOwpAQCAtMzAwLDcgKzIyNSw2IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9SRVNFVCk6CiAJY2FzZSBDTURfUkVUKENNRF84MDJfMTFfQVVUSEVOVElDQVRFKToKIAljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9CRUFDT05fU1RPUCk6CiAJCWJyZWFrOwpAQCAtMzA5LDEwICsyMzMsNiBAQAogCQlyZXQgPSBsYnNfcmV0XzgwMl8xMV9yc3NpKHByaXYsIHJlc3ApOwogCQlicmVhazsKIAotCWNhc2UgQ01EX1JFVChDTURfODAyXzExX0FEX0hPQ19TVE9QKToKLQkJcmV0ID0gbGJzX3JldF84MDIxMV9hZF9ob2Nfc3RvcChwcml2KTsKLQkJYnJlYWs7Ci0KIAljYXNlIENNRF9SRVQoQ01EXzgwMl8xMURfRE9NQUlOX0lORk8pOgogCQlyZXQgPSBsYnNfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8ocmVzcCk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVjbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVjbC5oCmluZGV4IGE4YWM5NzQuLjFhODg4OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlY2wuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmgKQEAgLTM0LDcgKzM0LDYgQEAKIHZvaWQgbGJzX3F1ZXVlX2V2ZW50KHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTMyIGV2ZW50KTsKIHZvaWQgbGJzX25vdGlmeV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdTggcmVzcF9pZHgpOwogCi1pbnQgbGJzX3NldF9yYWRpb19jb250cm9sKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdik7CiB1MzIgbGJzX2Z3X2luZGV4X3RvX2RhdGFfcmF0ZSh1OCBpbmRleCk7CiB1OCBsYnNfZGF0YV9yYXRlX3RvX2Z3X2luZGV4KHUzMiByYXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCmluZGV4IDEyZTY4NzUuLjA3NmE2MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKQEAgLTE4OSw2ICsxODksMTQgQEAKICNkZWZpbmUgTVJWRFJWX0NNRF9VUExEX1JEWQkJMHgwMDA4CiAjZGVmaW5lIE1SVkRSVl9DQVJERVZFTlQJCTB4MDAxMAogCisvKiBBdXRvbWF0aWMgVFggY29udHJvbCBkZWZhdWx0IGxldmVscyAqLworI2RlZmluZSBQT1dfQURBUFRfREVGQVVMVF9QMCAxMworI2RlZmluZSBQT1dfQURBUFRfREVGQVVMVF9QMSAxNQorI2RlZmluZSBQT1dfQURBUFRfREVGQVVMVF9QMiAxOAorI2RlZmluZSBUUENfREVGQVVMVF9QMCA1CisjZGVmaW5lIFRQQ19ERUZBVUxUX1AxIDEwCisjZGVmaW5lIFRQQ19ERUZBVUxUX1AyIDEzCisKIC8qKiBUeFBEIHN0YXR1cyAqLwogCiAvKglTdGF0aW9uIGZpcm13YXJlIHVzZSBUeFBEIHN0YXR1cyBmaWVsZCB0byByZXBvcnQgZmluYWwgVHggdHJhbnNtaXQKQEAgLTI0Myw2ICsyNTEsOSBAQAogCiAjZGVmaW5lCUNNRF9GX0hPU1RDTUQJCSgxIDw8IDApCiAjZGVmaW5lIEZXX0NBUElORk9fV1BBICAJKDEgPDwgMCkKKyNkZWZpbmUgRldfQ0FQSU5GT19GSVJNV0FSRV9VUEdSQURFCSgxIDw8IDEzKQorI2RlZmluZSBGV19DQVBJTkZPX0JPT1QyX1VQR1JBREUJKDE8PDE0KQorI2RlZmluZSBGV19DQVBJTkZPX1BFUlNJU1RFTlRfQ09ORklHCSgxPDwxNSkKIAogI2RlZmluZSBLRVlfTEVOX1dQQV9BRVMJCQkxNgogI2RlZmluZSBLRVlfTEVOX1dQQV9US0lQCQkzMgpAQCAtMzE2LDcgKzMyNyw4IEBACiBlbnVtIEROTERfU1RBVEUgewogCUROTERfUkVTX1JFQ0VJVkVELAogCUROTERfREFUQV9TRU5ULAotCUROTERfQ01EX1NFTlQKKwlETkxEX0NNRF9TRU5ULAorCUROTERfQk9PVENNRF9TRU5ULAogfTsKIAogLyoqIExCU19NRURJQV9TVEFURSAqLwpAQCAtMzM5LDI3ICszNTEsNiBAQAogCU1WTVNfRVZFTlQKIH07CiAKLS8qKiBTTk1QX01JQl9JTkRFWF9lICovCi1lbnVtIFNOTVBfTUlCX0lOREVYX2UgewotCURFU0lSRURfQlNTVFlQRV9JID0gMCwKLQlPUF9SQVRFU0VUX0ksCi0JQkNOUEVSSU9EX0ksCi0JRFRJTVBFUklPRF9JLAotCUFTU09DUlNQX1RJTUVPVVRfSSwKLQlSVFNUSFJFU0hfSSwKLQlTSE9SVF9SRVRSWUxJTV9JLAotCUxPTkdfUkVUUllMSU1fSSwKLQlGUkFHVEhSRVNIX0ksCi0JRE9UMTFEX0ksCi0JRE9UMTFIX0ksCi0JTUFOVUZJRF9JLAotCVBST0RJRF9JLAotCU1BTlVGX09VSV9JLAotCU1BTlVGX05BTUVfSSwKLQlNQU5VRl9QUk9ETkFNRV9JLAotCU1BTlVGX1BST0RWRVJfSSwKLX07Ci0KIC8qKiBLRVlfVFlQRV9JRCAqLwogZW51bSBLRVlfVFlQRV9JRCB7CiAJS0VZX1RZUEVfSURfV0VQID0gMCwKQEAgLTM3NCwxMiArMzY1LDYgQEAKIAlLRVlfSU5GT19XUEFfRU5BQkxFRCA9IDB4MDQKIH07CiAKLS8qKiBTTk1QX01JQl9WQUxVRV9lICovCi1lbnVtIFNOTVBfTUlCX1ZBTFVFX2UgewotCVNOTVBfTUlCX1ZBTFVFX0lORlJBID0gMSwKLQlTTk1QX01JQl9WQUxVRV9BREhPQwotfTsKLQogLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGZ3dCBjb21tYW5kcy4gKi8KICNkZWZpbmUgRldUX0RFRkFVTFRfTUVUUklDIDAKICNkZWZpbmUgRldUX0RFRkFVTFRfRElSIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKaW5kZXggZjViYjQwYy4uZjZmMzc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGV2LmgKQEAgLTU4LDYgKzU4LDcgQEAKIAl1OCBXUEEyZW5hYmxlZDsKIAl1OCB3ZXBfZW5hYmxlZDsKIAl1OCBhdXRoX21vZGU7CisJdTMyIGtleV9tZ210OwogfTsKIAogLyoqIEN1cnJlbnQgQmFzaWMgU2VydmljZSBTZXQgU3RhdGUgU3RydWN0dXJlICovCkBAIC0yNDAsOSArMjQxLDYgQEAKIAl1aW50MTZfdCBlbmFibGVod2F1dG87CiAJdWludDE2X3QgcmF0ZWJpdG1hcDsKIAotCXUzMiBmcmFndGhzZDsKLQl1MzIgcnRzdGhzZDsKLQogCXU4IHR4cmV0cnljb3VudDsKIAogCS8qKiBUeC1yZWxhdGVkIHZhcmlhYmxlcyAoZm9yIHNpbmdsZSBwYWNrZXQgdHgpICovCkBAIC0yNTMsNyArMjUxLDkgQEAKIAl1MzIgY29ubmVjdF9zdGF0dXM7CiAJdTMyIG1lc2hfY29ubmVjdF9zdGF0dXM7CiAJdTE2IHJlZ2lvbmNvZGU7Ci0JdTE2IHR4cG93ZXJsZXZlbDsKKwlzMTYgdHhwb3dlcl9jdXI7CisJczE2IHR4cG93ZXJfbWluOworCXMxNiB0eHBvd2VyX21heDsKIAogCS8qKiBQT1dFUiBNQU5BR0VNRU5UIEFORCBQblAgU1VQUE9SVCAqLwogCXU4IHN1cnByaXNlcmVtb3ZlZDsKQEAgLTI5MSw4ICsyOTEsNyBAQAogCXUxNiBuZXh0U05STkY7CiAJdTE2IG51bVNOUk5GOwogCi0JdTggcmFkaW9vbjsKLQl1MzIgcHJlYW1ibGU7CisJdTggcmFkaW9fb247CiAKIAkvKiogZGF0YSByYXRlIHN0dWZmICovCiAJdTggY3VyX3JhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmgKaW5kZXggYzkyZTQxYi4uNTAwNGQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3QuaApAQCAtOSwxNyArOSw2IEBACiAjZGVmaW5lIERFRkFVTFRfQURfSE9DX0NIQU5ORUwJCQk2CiAjZGVmaW5lCURFRkFVTFRfQURfSE9DX0NIQU5ORUxfQQkJMzYKIAotLyoqIElFRUUgODAyLjExIG9pZHMgKi8KLSNkZWZpbmUgT0lEXzgwMl8xMV9TU0lECQkJCTB4MDAwMDgwMDIKLSNkZWZpbmUgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCQkweDAwMDA4MDA4Ci0jZGVmaW5lIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJMHgwMDAwODAwOQotI2RlZmluZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQJCTB4MDAwMDgwMEEKLSNkZWZpbmUgT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkweDAwMDA4MDBECi0jZGVmaW5lIE9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkweDAwMDA4MDBFCi0jZGVmaW5lIE9JRF84MDJfMTFfU1RBVElTVElDUwkJCTB4MDAwMDgwMTIKLSNkZWZpbmUgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5UCQkweDAwMDA4MDFECi0jZGVmaW5lIE9JRF84MDJfMTFEX0VOQUJMRQkJCTB4MDAwMDgwMjAKLQogI2RlZmluZSBDTURfT1BUSU9OX1dBSVRGT1JSU1AJCQkweDAwMDIKIAogLyoqIEhvc3QgY29tbWFuZCBJRHMgKi8KQEAgLTYxLDcgKzUwLDYgQEAKICNkZWZpbmUgQ01EX1JGX1JFR19NQVAJCQkJMHgwMDIzCiAjZGVmaW5lIENNRF84MDJfMTFfREVBVVRIRU5USUNBVEUJCTB4MDAyNAogI2RlZmluZSBDTURfODAyXzExX1JFQVNTT0NJQVRFCQkJMHgwMDI1Ci0jZGVmaW5lIENNRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJMHgwMDI2CiAjZGVmaW5lIENNRF9NQUNfQ09OVFJPTAkJCQkweDAwMjgKICNkZWZpbmUgQ01EXzgwMl8xMV9BRF9IT0NfU1RBUlQJCQkweDAwMmIKICNkZWZpbmUgQ01EXzgwMl8xMV9BRF9IT0NfSk9JTgkJCTB4MDAyYwpAQCAtODQsNiArNzIsNyBAQAogI2RlZmluZSBDTURfODAyXzExX0lOQUNUSVZJVFlfVElNRU9VVAkJMHgwMDY3CiAjZGVmaW5lIENNRF84MDJfMTFfU0xFRVBfUEVSSU9ECQkJMHgwMDY4CiAjZGVmaW5lIENNRF84MDJfMTFfVFBDX0NGRwkJCTB4MDA3MgorI2RlZmluZSBDTURfODAyXzExX1BBX0NGRwkJCTB4MDA3MwogI2RlZmluZSBDTURfODAyXzExX0ZXX1dBS0VfTUVUSE9ECQkweDAwNzQKICNkZWZpbmUgQ01EXzgwMl8xMV9TVUJTQ1JJQkVfRVZFTlQJCTB4MDA3NQogI2RlZmluZSBDTURfODAyXzExX1JBVEVfQURBUFRfUkFURVNFVAkJMHgwMDc2CkBAIC0xNTMsMTEgKzE0Miw2IEBACiAjZGVmaW5lIENNRF9BQ1RfTUFDX0FMTF9NVUxUSUNBU1RfRU5BQkxFCTB4MDEwMAogI2RlZmluZSBDTURfQUNUX01BQ19TVFJJQ1RfUFJPVEVDVElPTl9FTkFCTEUJMHgwNDAwCiAKLS8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JBRElPX0NPTlRST0wgKi8KLSNkZWZpbmUgQ01EX1RZUEVfQVVUT19QUkVBTUJMRQkJMHgwMDAxCi0jZGVmaW5lIENNRF9UWVBFX1NIT1JUX1BSRUFNQkxFCQkweDAwMDIKLSNkZWZpbmUgQ01EX1RZUEVfTE9OR19QUkVBTUJMRQkJMHgwMDAzCi0KIC8qIEV2ZW50IGZsYWdzIGZvciBDTURfODAyXzExX1NVQlNDUklCRV9FVkVOVCAqLwogI2RlZmluZSBDTURfU1VCU0NSSUJFX1JTU0lfTE9XCQkweDAwMDEKICNkZWZpbmUgQ01EX1NVQlNDUklCRV9TTlJfTE9XCQkweDAwMDIKQEAgLTE2NiwyOCArMTUwLDE0IEBACiAjZGVmaW5lIENNRF9TVUJTQ1JJQkVfUlNTSV9ISUdICQkweDAwMTAKICNkZWZpbmUgQ01EX1NVQlNDUklCRV9TTlJfSElHSAkJMHgwMDIwCiAKLSNkZWZpbmUgVFVSTl9PTl9SRgkJCTB4MDEKLSNkZWZpbmUgUkFESU9fT04JCQkweDAxCi0jZGVmaW5lIFJBRElPX09GRgkJCTB4MDAKLQotI2RlZmluZSBTRVRfQVVUT19QUkVBTUJMRQkJMHgwNQotI2RlZmluZSBTRVRfU0hPUlRfUFJFQU1CTEUJCTB4MDMKLSNkZWZpbmUgU0VUX0xPTkdfUFJFQU1CTEUJCTB4MDEKKyNkZWZpbmUgUkFESU9fUFJFQU1CTEVfTE9ORwkweDAwCisjZGVmaW5lIFJBRElPX1BSRUFNQkxFX1NIT1JUCTB4MDIKKyNkZWZpbmUgUkFESU9fUFJFQU1CTEVfQVVUTwkweDA0CiAKIC8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JGX0NIQU5ORUwgKi8KICNkZWZpbmUgQ01EX09QVF84MDJfMTFfUkZfQ0hBTk5FTF9HRVQJMHgwMAogI2RlZmluZSBDTURfT1BUXzgwMl8xMV9SRl9DSEFOTkVMX1NFVAkweDAxCiAKLS8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JGX1RYX1BPV0VSICovCi0jZGVmaW5lIENNRF9BQ1RfVFhfUE9XRVJfT1BUX0dFVAkweDAwMDAKLSNkZWZpbmUgQ01EX0FDVF9UWF9QT1dFUl9PUFRfU0VUX0hJR0gJMHg4MDA3Ci0jZGVmaW5lIENNRF9BQ1RfVFhfUE9XRVJfT1BUX1NFVF9NSUQJMHg4MDA0Ci0jZGVmaW5lIENNRF9BQ1RfVFhfUE9XRVJfT1BUX1NFVF9MT1cJMHg4MDAwCi0KLSNkZWZpbmUgQ01EX0FDVF9UWF9QT1dFUl9JTkRFWF9ISUdICTB4MDAwNwotI2RlZmluZSBDTURfQUNUX1RYX1BPV0VSX0lOREVYX01JRAkweDAwMDQKLSNkZWZpbmUgQ01EX0FDVF9UWF9QT1dFUl9JTkRFWF9MT1cJMHgwMDAwCi0KIC8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX0RBVEFfUkFURSAqLwogI2RlZmluZSBDTURfQUNUX1NFVF9UWF9BVVRPCQkweDAwMDAKICNkZWZpbmUgQ01EX0FDVF9TRVRfVFhfRklYX1JBVEUJCTB4MDAwMQpAQCAtMjEwLDYgKzE4MCwxOSBAQAogI2RlZmluZSBDTURfV0FLRV9NRVRIT0RfQ09NTUFORF9JTlQJMHgwMDAxCiAjZGVmaW5lIENNRF9XQUtFX01FVEhPRF9HUElPCQkweDAwMDIKIAorLyogT2JqZWN0IElEcyBmb3IgQ01EXzgwMl8xMV9TTk1QX01JQiAqLworI2RlZmluZSBTTk1QX01JQl9PSURfQlNTX1RZUEUJCTB4MDAwMAorI2RlZmluZSBTTk1QX01JQl9PSURfT1BfUkFURV9TRVQJMHgwMDAxCisjZGVmaW5lIFNOTVBfTUlCX09JRF9CRUFDT05fUEVSSU9ECTB4MDAwMiAgLyogUmVzZXJ2ZWQgb24gdjkrICovCisjZGVmaW5lIFNOTVBfTUlCX09JRF9EVElNX1BFUklPRAkweDAwMDMgIC8qIFJlc2VydmVkIG9uIHY5KyAqLworI2RlZmluZSBTTk1QX01JQl9PSURfQVNTT0NfVElNRU9VVAkweDAwMDQgIC8qIFJlc2VydmVkIG9uIHY5KyAqLworI2RlZmluZSBTTk1QX01JQl9PSURfUlRTX1RIUkVTSE9MRAkweDAwMDUKKyNkZWZpbmUgU05NUF9NSUJfT0lEX1NIT1JUX1JFVFJZX0xJTUlUCTB4MDAwNgorI2RlZmluZSBTTk1QX01JQl9PSURfTE9OR19SRVRSWV9MSU1JVAkweDAwMDcKKyNkZWZpbmUgU05NUF9NSUJfT0lEX0ZSQUdfVEhSRVNIT0xECTB4MDAwOAorI2RlZmluZSBTTk1QX01JQl9PSURfMTFEX0VOQUJMRQkJMHgwMDA5CisjZGVmaW5lIFNOTVBfTUlCX09JRF8xMUhfRU5BQkxFCQkweDAwMEEKKwogLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIENNRF9CVF9BQ0NFU1MgKi8KIGVudW0gY21kX2J0X2FjY2Vzc19vcHRzIHsKIAkvKiBUaGUgYnQgY29tbWFuZHMgc3RhcnQgYXQgNSBpbnN0ZWFkIG9mIDEgYmVjYXVzZSB0aGUgb2xkIGRmdCBjb21tYW5kcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdGNtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdGNtZC5oCmluZGV4IDkxM2I0ODAuLmQ5ZjlhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3RjbWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0Y21kLmgKQEAgLTE1MSwxMCArMTUxLDYgQEAKIAlfX2xlMzIgZndjYXBpbmZvOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCBjbWRfZHNfODAyXzExX3Jlc2V0IHsKLQlfX2xlMTYgYWN0aW9uOwotfTsKLQogc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50IHsKIAlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAKQEAgLTIzMiw3ICsyMjgsOSBAQAogfTsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfZGVhdXRoZW50aWNhdGUgewotCXU4IG1hY2FkZHJbNl07CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCisJdTggbWFjYWRkcltFVEhfQUxFTl07CiAJX19sZTE2IHJlYXNvbmNvZGU7CiB9OwogCkBAIC0yNTEsMjAgKzI0OSwxMCBAQAogI2VuZGlmCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IGNtZF9kc184MDJfMTFfZGlzYXNzb2NpYXRlIHsKLQl1OCBkZXN0bWFjYWRkcls2XTsKLQlfX2xlMTYgcmVhc29uY29kZTsKLX07Ci0KIHN0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZV9yc3AgewogCXN0cnVjdCBpZWVldHlwZXNfYXNzb2Nyc3AgYXNzb2NSc3A7CiB9OwogCi1zdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHsKLQl1OCBwYWRbM107Ci0JdTggYnNzaWRbRVRIX0FMRU5dOwotfTsKLQogc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCB7CiAJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwogCkBAIC0zMDksNyArMjk3LDkgQEAKIH07CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliIHsKLQlfX2xlMTYgcXVlcnl0eXBlOworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CiAJX19sZTE2IG9pZDsKIAlfX2xlMTYgYnVmc2l6ZTsKIAl1OCB2YWx1ZVsxMjhdOwpAQCAtNDM1LDggKzQyNSwxMiBAQAogfTsKIAogc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKwogCV9fbGUxNiBhY3Rpb247Ci0JX19sZTE2IGN1cnJlbnRsZXZlbDsKKwlfX2xlMTYgY3VybGV2ZWw7CisJczggbWF4bGV2ZWw7CisJczggbWlubGV2ZWw7CiB9OwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9hbnRlbm5hIHsKQEAgLTUwNywxMCArNTAxLDEyIEBACiB9OwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKwogCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOwogCXU4IGJzc3R5cGU7CiAJX19sZTE2IGJlYWNvbnBlcmlvZDsKLQl1OCBkdGltcGVyaW9kOworCXU4IGR0aW1wZXJpb2Q7ICAgLyogUmVzZXJ2ZWQgb24gdjkgYW5kIGxhdGVyICovCiAJdW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQgc3NwYXJhbXNldDsKIAl1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQgcGh5cGFyYW1zZXQ7CiAJX19sZTE2IHByb2JlZGVsYXk7CkBAIC01MTksOSArNTE1LDE2IEBACiAJdTggdGx2X21lbW9yeV9zaXplX3BhZFsxMDBdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKK3N0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCXU4IHBhZFszXTsKKwl1OCBic3NpZFtFVEhfQUxFTl07Cit9OworCiBzdHJ1Y3QgYWRob2NfYnNzZGVzYyB7Ci0JdTggYnNzaWRbNl07Ci0JdTggc3NpZFszMl07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOwogCXU4IHR5cGU7CiAJX19sZTE2IGJlYWNvbnBlcmlvZDsKIAl1OCBkdGltcGVyaW9kOwpAQCAtNTM5LDEwICs1NDIsMTUgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbiB7Ci0Jc3RydWN0IGFkaG9jX2Jzc2Rlc2MgYnNzOwotCV9fbGUxNiBmYWlsdGltZW91dDsKLQlfX2xlMTYgcHJvYmVkZWxheTsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CiAKKwlzdHJ1Y3QgYWRob2NfYnNzZGVzYyBic3M7CisJX19sZTE2IGZhaWx0aW1lb3V0OyAgIC8qIFJlc2VydmVkIG9uIHY5IGFuZCBsYXRlciAqLworCV9fbGUxNiBwcm9iZWRlbGF5OyAgICAvKiBSZXNlcnZlZCBvbiB2OSBhbmQgbGF0ZXIgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RvcCB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBjbWRfZHNfODAyXzExX2VuYWJsZV9yc24gewpAQCAtNTk3LDE0ICs2MDUsMjggQEAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKIAlfX2xlMTYgYWN0aW9uOwotCXU4IGVuYWJsZTsKLQlzOCBQMDsKLQlzOCBQMTsKLQlzOCBQMjsKLQl1OCB1c2VzbnI7CisJdWludDhfdCBlbmFibGU7CisJaW50OF90IFAwOworCWludDhfdCBQMTsKKwlpbnQ4X3QgUDI7CisJdWludDhfdCB1c2VzbnI7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wYV9jZmcgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJdWludDhfdCBlbmFibGU7CisJaW50OF90IFAwOworCWludDhfdCBQMTsKKwlpbnQ4X3QgUDI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCiBzdHJ1Y3QgY21kX2RzXzgwMl8xMV9sZWRfY3RybCB7CiAJX19sZTE2IGFjdGlvbjsKIAlfX2xlMTYgbnVtbGVkOwpAQCAtNjkzLDIxICs3MTUsMTMgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUgcHNtb2RlOwogCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgYXNzb2NpYXRlOwotCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBkZWF1dGg7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCBhZHM7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jlc2V0IHJlc2V0OwotCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHJlc3VsdDsKIAkJc3RydWN0IGNtZF9kc184MDJfMTFfYXV0aGVudGljYXRlIGF1dGg7CiAJCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9zdGF0IGdzdGF0OwogCQlzdHJ1Y3QgY21kX2RzXzgwMl8zX2dldF9zdGF0IGdzdGF0XzgwMjM7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliIHNtaWI7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIHR4cDsKIAkJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSByYW50OwogCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tb25pdG9yX21vZGUgbW9uaXRvcjsKLQkJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX2pvaW4gYWRqOwogCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yc3NpIHJzc2k7CiAJCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2lfcnNwIHJzc2lyc3A7Ci0JCXN0cnVjdCBjbWRfZHNfODAyXzExX2Rpc2Fzc29jaWF0ZSBkYXNzb2NpYXRlOwogCQlzdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzIG1hY3JlZzsKIAkJc3RydWN0IGNtZF9kc19iYnBfcmVnX2FjY2VzcyBiYnByZWc7CiAJCXN0cnVjdCBjbWRfZHNfcmZfcmVnX2FjY2VzcyByZnJlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9jcy5jCmluZGV4IDg5NDE5MTkuLjg0MmEwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfY3MuYwpAQCAtNzEzLDcgKzcxMyw3IEBACiAJCXJldCA9IGlmX2NzX3NlbmRfY21kKHByaXYsIGJ1ZiwgbmIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlsYnNfcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKKwkJbGJzX3ByX2VycigiJXM6IHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsIF9fZnVuY19fLCB0eXBlKTsKIAl9CiAKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9DUywgInJldCAlZCIsIHJldCk7CkBAIC03OTEsNyArNzkxLDcgQEAKIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKIAlpZiAoKHJldCA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocF9kZXYsICZ0dXBsZSkpICE9IDAgfHwKIAkgICAgKHJldCA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwX2RldiwgJnR1cGxlKSkgIT0gMCB8fAotCSAgICAocmV0ID0gcGNtY2lhX3BhcnNlX3R1cGxlKHBfZGV2LCAmdHVwbGUsICZwYXJzZSkpICE9IDApCisJICAgIChyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUoJnR1cGxlLCAmcGFyc2UpKSAhPSAwKQogCXsKIAkJbGJzX3ByX2VycigiZXJyb3IgaW4gcGNtY2lhX2dldF9maXJzdF90dXBsZSBldGNcbiIpOwogCQlnb3RvIG91dDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCmluZGV4IDYzMmMyOTEuLmNhZmJjY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCkBAIC0zOSw3ICszOSwxMCBAQAogCiBzdGF0aWMgdm9pZCBpZl91c2JfcmVjZWl2ZShzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmVfZndsb2FkKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgaW50IGlmX3VzYl9wcm9nX2Zpcm13YXJlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApOworc3RhdGljIGludCBfX2lmX3VzYl9wcm9nX2Zpcm13YXJlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAsCisJCQkJCWNvbnN0IGNoYXIgKmZ3bmFtZSwgaW50IGNtZCk7CitzdGF0aWMgaW50IGlmX3VzYl9wcm9nX2Zpcm13YXJlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAsCisJCQkJCWNvbnN0IGNoYXIgKmZ3bmFtZSwgaW50IGNtZCk7CiBzdGF0aWMgaW50IGlmX3VzYl9ob3N0X3RvX2NhcmQoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1aW50OF90IHR5cGUsCiAJCQkgICAgICAgdWludDhfdCAqcGF5bG9hZCwgdWludDE2X3QgbmIpOwogc3RhdGljIGludCB1c2JfdHhfYmxvY2soc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCwgdWludDhfdCAqcGF5bG9hZCwKQEAgLTQ4LDYgKzUxLDYyIEBACiBzdGF0aWMgaW50IGlmX3VzYl9zdWJtaXRfcnhfdXJiKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApOwogc3RhdGljIGludCBpZl91c2JfcmVzZXRfZGV2aWNlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApOwogCisvKiBzeXNmcyBob29rcyAqLworCisvKioKKyAqICBTZXQgZnVuY3Rpb24gdG8gd3JpdGUgZmlybXdhcmUgdG8gZGV2aWNlJ3MgcGVyc2lzdGVudCBtZW1vcnkKKyAqLworc3RhdGljIHNzaXplX3QgaWZfdXNiX2Zpcm13YXJlX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB0b19uZXRfZGV2KGRldiktPnByaXY7CisJc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCA9IHByaXYtPmNhcmQ7CisJY2hhciBmd25hbWVbRklSTVdBUkVfTkFNRV9NQVhdOworCWludCByZXQ7CisKKwlzc2NhbmYoYnVmLCAiJTI5cyIsIGZ3bmFtZSk7IC8qIEZJUk1XQVJFX05BTUVfTUFYIC0gMSA9IDI5ICovCisJcmV0ID0gaWZfdXNiX3Byb2dfZmlybXdhcmUoY2FyZHAsIGZ3bmFtZSwgQk9PVF9DTURfVVBEQVRFX0ZXKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBjb3VudDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbGJzX2ZsYXNoX2Z3IGF0dHJpYnV0ZSB0byBiZSBleHBvcnRlZCBwZXIgZXRoWCBpbnRlcmZhY2UgdGhyb3VnaCBzeXNmcworICogKC9zeXMvY2xhc3MvbmV0L2V0aFgvbGJzX2ZsYXNoX2Z3KS4gIFVzZSB0aGlzIGxpa2Ugc28gdG8gd3JpdGUgZmlybXdhcmUgdG8KKyAqIHRoZSBkZXZpY2UncyBwZXJzaXN0ZW50IG1lbW9yeToKKyAqIGVjaG8gdXNiODM4OC01LjEyNi4wLnA1LmJpbiA+IC9zeXMvY2xhc3MvbmV0L2V0aFgvbGJzX2ZsYXNoX2Z3CisgKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihsYnNfZmxhc2hfZncsIDAyMDAsIE5VTEwsIGlmX3VzYl9maXJtd2FyZV9zZXQpOworCisvKioKKyAqICBTZXQgZnVuY3Rpb24gdG8gd3JpdGUgZmlybXdhcmUgdG8gZGV2aWNlJ3MgcGVyc2lzdGVudCBtZW1vcnkKKyAqLworc3RhdGljIHNzaXplX3QgaWZfdXNiX2Jvb3QyX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSB0b19uZXRfZGV2KGRldiktPnByaXY7CisJc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCA9IHByaXYtPmNhcmQ7CisJY2hhciBmd25hbWVbRklSTVdBUkVfTkFNRV9NQVhdOworCWludCByZXQ7CisKKwlzc2NhbmYoYnVmLCAiJTI5cyIsIGZ3bmFtZSk7IC8qIEZJUk1XQVJFX05BTUVfTUFYIC0gMSA9IDI5ICovCisJcmV0ID0gaWZfdXNiX3Byb2dfZmlybXdhcmUoY2FyZHAsIGZ3bmFtZSwgQk9PVF9DTURfVVBEQVRFX0JPT1QyKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBjb3VudDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbGJzX2ZsYXNoX2Jvb3QyIGF0dHJpYnV0ZSB0byBiZSBleHBvcnRlZCBwZXIgZXRoWCBpbnRlcmZhY2UgdGhyb3VnaCBzeXNmcworICogKC9zeXMvY2xhc3MvbmV0L2V0aFgvbGJzX2ZsYXNoX2Jvb3QyKS4gIFVzZSB0aGlzIGxpa2Ugc28gdG8gd3JpdGUgZmlybXdhcmUKKyAqIHRvIHRoZSBkZXZpY2UncyBwZXJzaXN0ZW50IG1lbW9yeToKKyAqIGVjaG8gdXNiODM4OC01LjEyNi4wLnA1LmJpbiA+IC9zeXMvY2xhc3MvbmV0L2V0aFgvbGJzX2ZsYXNoX2Jvb3QyCisgKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihsYnNfZmxhc2hfYm9vdDIsIDAyMDAsIE5VTEwsIGlmX3VzYl9ib290Ml9zZXQpOworCiAvKioKICAqICBAYnJpZWYgIGNhbGwgYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHN0YXR1cyBvZiB0aGUgVVJCCiAgKiAgQHBhcmFtIHVyYiAJCXBvaW50ZXIgdG8gdXJiIHN0cnVjdHVyZQpAQCAtNjYsMTAgKzEyNSwxMCBAQAogCQlsYnNfZGViX3VzYjIoJnVyYi0+ZGV2LT5kZXYsICJBY3R1YWwgbGVuZ3RoIHRyYW5zbWl0dGVkICVkXG4iLAogCQkJICAgICB1cmItPmFjdHVhbF9sZW5ndGgpOwogCi0JCS8qIFVzZWQgZm9yIGJvdGggZmlybXdhcmUgVFggYW5kIHJlZ3VsYXIgVFguICBwcml2IGlzbid0Ci0JCSAqIHZhbGlkIGF0IGZpcm13YXJlIGxvYWQgdGltZS4KKwkJLyogQm9vdCBjb21tYW5kcyBzdWNoIGFzIFVQREFURV9GVyBhbmQgVVBEQVRFX0JPT1QyIGFyZSBub3QKKwkJICogcGFzc2VkIHVwIHRvIHRoZSBsYnMgbGV2ZWwuCiAJCSAqLwotCQlpZiAocHJpdikKKwkJaWYgKHByaXYgJiYgcHJpdi0+ZG5sZF9zZW50ICE9IEROTERfQk9PVENNRF9TRU5UKQogCQkJbGJzX2hvc3RfdG9fY2FyZF9kb25lKHByaXYpOwogCX0gZWxzZSB7CiAJCS8qIHByaW50IHRoZSBmYWlsdXJlIHN0YXR1cyBudW1iZXIgZm9yIGRlYnVnICovCkBAIC0yMzEsNyArMjkwLDcgQEAKIAl9CiAKIAkvKiBVcGxvYWQgZmlybXdhcmUgKi8KLQlpZiAoaWZfdXNiX3Byb2dfZmlybXdhcmUoY2FyZHApKSB7CisJaWYgKF9faWZfdXNiX3Byb2dfZmlybXdhcmUoY2FyZHAsIGxic19md19uYW1lLCBCT09UX0NNRF9GV19CWV9VU0IpKSB7CiAJCWxic19kZWJfdXNiZCgmdWRldi0+ZGV2LCAiRlcgdXBsb2FkIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3Byb2dfZmlybXdhcmU7CiAJfQpAQCAtMjYwLDYgKzMxOSwxMiBAQAogCXVzYl9nZXRfZGV2KHVkZXYpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FyZHApOwogCisJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmcHJpdi0+ZGV2LT5kZXYsICZkZXZfYXR0cl9sYnNfZmxhc2hfZncpKQorCQlsYnNfcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbGJzX2ZsYXNoX2Z3IGF0dHJpYnV0ZVxuIik7CisKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwcml2LT5kZXYtPmRldiwgJmRldl9hdHRyX2xic19mbGFzaF9ib290MikpCisJCWxic19wcl9lcnIoImNhbm5vdCByZWdpc3RlciBsYnNfZmxhc2hfYm9vdDIgYXR0cmlidXRlXG4iKTsKKwogCXJldHVybiAwOwogCiBlcnJfc3RhcnRfY2FyZDoKQEAgLTI4NSw2ICszNTAsOSBAQAogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwogCisJZGV2aWNlX3JlbW92ZV9maWxlKCZwcml2LT5kZXYtPmRldiwgJmRldl9hdHRyX2xic19mbGFzaF9ib290Mik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwcml2LT5kZXYtPmRldiwgJmRldl9hdHRyX2xic19mbGFzaF9mdyk7CisKIAljYXJkcC0+c3VycHJpc2VfcmVtb3ZlZCA9IDE7CiAKIAlpZiAocHJpdikgewpAQCAtMzcxLDExICs0MzksMTAgQEAKIAkqKF9fbGUzMiAqKWNhcmRwLT5lcF9vdXRfYnVmID0gY3B1X3RvX2xlMzIoQ01EX1RZUEVfUkVRVUVTVCk7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihDTURfODAyXzExX1JFU0VUKTsKLQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQpICsgU19EU19HRU4pOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2hlYWRlcikpOwogCWNtZC0+cmVzdWx0ID0gY3B1X3RvX2xlMTYoMCk7CiAJY21kLT5zZXFudW0gPSBjcHVfdG9fbGUxNigweDVhNWEpOwotCWNtZC0+cGFyYW1zLnJlc2V0LmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfSEFMVCk7Ci0JdXNiX3R4X2Jsb2NrKGNhcmRwLCBjYXJkcC0+ZXBfb3V0X2J1ZiwgNCArIFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3Jlc2V0KSk7CisJdXNiX3R4X2Jsb2NrKGNhcmRwLCBjYXJkcC0+ZXBfb3V0X2J1ZiwgNCArIHNpemVvZihzdHJ1Y3QgY21kX2hlYWRlcikpOwogCiAJbXNsZWVwKDEwMCk7CiAJcmV0ID0gdXNiX3Jlc2V0X2RldmljZShjYXJkcC0+dWRldik7CkBAIC01MTAsNyArNTc3LDcgQEAKIAkJaWYgKGxlMTZfdG9fY3B1KGNhcmRwLT51ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkgPCAweDMxMDYpIHsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKGNhcmRwKTsKLQkJCWNhcmRwLT5ib290Y21kcmVzcCA9IDE7CisJCQljYXJkcC0+Ym9vdGNtZHJlc3AgPSBCT09UX0NNRF9SRVNQX09LOwogCQkJbGJzX2RlYl91c2JkKCZjYXJkcC0+dWRldi0+ZGV2LAogCQkJCSAgICAgIlJlY2VpdmVkIHZhbGlkIGJvb3QgY29tbWFuZCByZXNwb25zZVxuIik7CiAJCQlyZXR1cm47CkBAIC01MjYsNyArNTkzLDkgQEAKIAkJCQlsYnNfcHJfaW5mbygiYm9vdCBjbWQgcmVzcG9uc2Ugd3JvbmcgbWFnaWMgbnVtYmVyICgweCV4KVxuIiwKIAkJCQkJICAgIGxlMzJfdG9fY3B1KGJvb3RjbWRyZXNwLm1hZ2ljKSk7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoYm9vdGNtZHJlc3AuY21kICE9IEJPT1RfQ01EX0ZXX0JZX1VTQikgeworCQl9IGVsc2UgaWYgKChib290Y21kcmVzcC5jbWQgIT0gQk9PVF9DTURfRldfQllfVVNCKSAmJgorCQkJICAgKGJvb3RjbWRyZXNwLmNtZCAhPSBCT09UX0NNRF9VUERBVEVfRlcpICYmCisJCQkgICAoYm9vdGNtZHJlc3AuY21kICE9IEJPT1RfQ01EX1VQREFURV9CT09UMikpIHsKIAkJCWxic19wcl9pbmZvKCJib290IGNtZCByZXNwb25zZSBjbWRfdGFnIGVycm9yICglZClcbiIsCiAJCQkJICAgIGJvb3RjbWRyZXNwLmNtZCk7CiAJCX0gZWxzZSBpZiAoYm9vdGNtZHJlc3AucmVzdWx0ICE9IEJPT1RfQ01EX1JFU1BfT0spIHsKQEAgLTU2NCw4ICs2MzMsOCBAQAogCiAJa2ZyZWVfc2tiKHNrYik7CiAKLQkvKiByZXNjaGVkdWxlIHRpbWVyIGZvciAyMDBtcyBoZW5jZSAqLwotCW1vZF90aW1lcigmY2FyZHAtPmZ3X3RpbWVvdXQsIGppZmZpZXMgKyAoSFovNSkpOworCS8qIEdpdmUgZGV2aWNlIDVzIHRvIGVpdGhlciB3cml0ZSBmaXJtd2FyZSB0byBpdHMgUkFNIG9yIGVlcHJvbSAqLworCW1vZF90aW1lcigmY2FyZHAtPmZ3X3RpbWVvdXQsIGppZmZpZXMgKyAoSFoqNSkpOwogCiAJaWYgKGNhcmRwLT5md2ZpbmFsYmxrKSB7CiAJCWNhcmRwLT5md2RubGRvdmVyID0gMTsKQEAgLTgwOSw3ICs4NzgsNTQgQEAKIH0KIAogCi1zdGF0aWMgaW50IGlmX3VzYl9wcm9nX2Zpcm13YXJlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApCisvKioKKyogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByb2dyYW1zIHRoZSBmaXJtd2FyZSBzdWJqZWN0IHRvIGNtZAorKgorKiAgQHBhcmFtIGNhcmRwICAgICAgICAgICAgIHRoZSBpZl91c2JfY2FyZCBkZXNjcmlwdG9yCisqICAgICAgICAgZnduYW1lICAgICAgICAgICAgZmlybXdhcmUgb3IgYm9vdDIgaW1hZ2UgZmlsZSBuYW1lCisqICAgICAgICAgY21kICAgICAgICAgICAgICAgZWl0aGVyIEJPT1RfQ01EX0ZXX0JZX1VTQiwgQk9PVF9DTURfVVBEQVRFX0ZXLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEJPT1RfQ01EX1VQREFURV9CT09UMi4KKyogIEByZXR1cm4gICAgIDAgb3IgZXJyb3IgY29kZQorKi8KK3N0YXRpYyBpbnQgaWZfdXNiX3Byb2dfZmlybXdhcmUoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCwKKwkJCQljb25zdCBjaGFyICpmd25hbWUsIGludCBjbWQpCit7CisJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gY2FyZHAtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFncywgY2FwczsKKwlpbnQgcmV0OworCisJY2FwcyA9IHByaXYtPmZ3Y2FwaW5mbzsKKwlpZiAoKChjbWQgPT0gQk9PVF9DTURfVVBEQVRFX0ZXKSAmJiAhKGNhcHMgJiBGV19DQVBJTkZPX0ZJUk1XQVJFX1VQR1JBREUpKSB8fAorCSAgICAoKGNtZCA9PSBCT09UX0NNRF9VUERBVEVfQk9PVDIpICYmICEoY2FwcyAmIEZXX0NBUElORk9fQk9PVDJfVVBHUkFERSkpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBFbnN1cmUgbWFpbiB0aHJlYWQgaXMgaWRsZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAocHJpdi0+Y3VyX2NtZCAhPSBOVUxMIHx8IHByaXYtPmRubGRfc2VudCAhPSBETkxEX1JFU19SRUNFSVZFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHByaXYtPndhaXRxLAorCQkJCShwcml2LT5jdXJfY21kID09IE5VTEwgJiYKKwkJCQlwcml2LT5kbmxkX3NlbnQgPT0gRE5MRF9SRVNfUkVDRUlWRUQpKSkgeworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwl9CisJcHJpdi0+ZG5sZF9zZW50ID0gRE5MRF9CT09UQ01EX1NFTlQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IF9faWZfdXNiX3Byb2dfZmlybXdhcmUoY2FyZHAsIGZ3bmFtZSwgY21kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCXByaXYtPmRubGRfc2VudCA9IEROTERfUkVTX1JFQ0VJVkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPndhaXRxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pZl91c2JfcHJvZ19maXJtd2FyZShzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwLAorCQkJCQljb25zdCBjaGFyICpmd25hbWUsIGludCBjbWQpCiB7CiAJaW50IGkgPSAwOwogCXN0YXRpYyBpbnQgcmVzZXRfY291bnQgPSAxMDsKQEAgLTgxNywyMCArOTMzLDMyIEBACiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfVVNCKTsKIAotCWlmICgocmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmY2FyZHAtPmZ3LCBsYnNfZndfbmFtZSwKLQkJCQkgICAgJmNhcmRwLT51ZGV2LT5kZXYpKSA8IDApIHsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZjYXJkcC0+ZncsIGZ3bmFtZSwgJmNhcmRwLT51ZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CiAJCWxic19wcl9lcnIoInJlcXVlc3RfZmlybXdhcmUoKSBmYWlsZWQgd2l0aCAlI3hcbiIsIHJldCk7Ci0JCWxic19wcl9lcnIoImZpcm13YXJlICVzIG5vdCBmb3VuZFxuIiwgbGJzX2Z3X25hbWUpOworCQlsYnNfcHJfZXJyKCJmaXJtd2FyZSAlcyBub3QgZm91bmRcbiIsIGZ3bmFtZSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoY2hlY2tfZndmaWxlX2Zvcm1hdChjYXJkcC0+ZnctPmRhdGEsIGNhcmRwLT5mdy0+c2l6ZSkpCisJaWYgKGNoZWNrX2Z3ZmlsZV9mb3JtYXQoY2FyZHAtPmZ3LT5kYXRhLCBjYXJkcC0+ZnctPnNpemUpKSB7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gcmVsZWFzZV9mdzsKKwl9CisKKwkvKiBDYW5jZWwgYW55IHBlbmRpbmcgdXNiIGJ1c2luZXNzICovCisJdXNiX2tpbGxfdXJiKGNhcmRwLT5yeF91cmIpOworCXVzYl9raWxsX3VyYihjYXJkcC0+dHhfdXJiKTsKKworCWNhcmRwLT5md2xhc3RibGtzZW50ID0gMDsKKwljYXJkcC0+Zndkbmxkb3ZlciA9IDA7CisJY2FyZHAtPnRvdGFsYnl0ZXMgPSAwOworCWNhcmRwLT5md2ZpbmFsYmxrID0gMDsKKwljYXJkcC0+Ym9vdGNtZHJlc3AgPSAwOwogCiByZXN0YXJ0OgogCWlmIChpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQoY2FyZHApIDwgMCkgewogCQlsYnNfZGViX3VzYmQoJmNhcmRwLT51ZGV2LT5kZXYsICJVUkIgc3VibWlzc2lvbiBpcyBmYWlsZWRcbiIpOwotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVJTzsKIAkJZ290byByZWxlYXNlX2Z3OwogCX0KIApAQCAtODM4LDggKzk2Niw3IEBACiAJZG8gewogCQlpbnQgaiA9IDA7CiAJCWkrKzsKLQkJLyogSXNzdWUgQm9vdCBjb21tYW5kID0gMSwgQm9vdCBmcm9tIERvd25sb2FkLUZXICovCi0JCWlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQoY2FyZHAsIEJPT1RfQ01EX0ZXX0JZX1VTQik7CisJCWlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQoY2FyZHAsIGNtZCk7CiAJCS8qIHdhaXQgZm9yIGNvbW1hbmQgcmVzcG9uc2UgKi8KIAkJZG8gewogCQkJaisrOwpAQCAtODQ3LDEyICs5NzQsMjEgQEAKIAkJfSB3aGlsZSAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDAgJiYgaiA8IDEwKTsKIAl9IHdoaWxlIChjYXJkcC0+Ym9vdGNtZHJlc3AgPT0gMCAmJiBpIDwgNSk7CiAKLQlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwIDw9IDApIHsKKwlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwID09IEJPT1RfQ01EX1JFU1BfTk9UX1NVUFBPUlRFRCkgeworCQkvKiBSZXR1cm4gdG8gbm9ybWFsIG9wZXJhdGlvbiAqLworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJdXNiX2tpbGxfdXJiKGNhcmRwLT5yeF91cmIpOworCQl1c2Jfa2lsbF91cmIoY2FyZHAtPnR4X3VyYik7CisJCWlmIChpZl91c2Jfc3VibWl0X3J4X3VyYihjYXJkcCkgPCAwKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byByZWxlYXNlX2Z3OworCX0gZWxzZSBpZiAoY2FyZHAtPmJvb3RjbWRyZXNwIDw9IDApIHsKIAkJaWYgKC0tcmVzZXRfY291bnQgPj0gMCkgewogCQkJaWZfdXNiX3Jlc2V0X2RldmljZShjYXJkcCk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KLQkJcmV0dXJuIC0xOworCQlyZXQgPSAtRUlPOworCQlnb3RvIHJlbGVhc2VfZnc7CiAJfQogCiAJaSA9IDA7CkBAIC04ODIsNyArMTAxOCw3IEBACiAJCX0KIAogCQlsYnNfcHJfaW5mbygiRlcgZG93bmxvYWQgZmFpbHVyZSwgdGltZSA9ICVkIG1zXG4iLCBpICogMTAwKTsKLQkJcmV0ID0gLTE7CisJCXJldCA9IC1FSU87CiAJCWdvdG8gcmVsZWFzZV9mdzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKaW5kZXggNTc3MWE4My4uNWJhMGFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2RlZmluZSBCT09UX0NNRF9SRVNQX09LCQkweDAwMDEKICNkZWZpbmUgQk9PVF9DTURfUkVTUF9GQUlMCQkweDAwMDAKKyNkZWZpbmUgQk9PVF9DTURfUkVTUF9OT1RfU1VQUE9SVEVECTB4MDAwMgogCiBzdHJ1Y3QgYm9vdGNtZHJlc3AKIHsKQEAgLTUwLDYgKzUxLDEwIEBACiAJdWludDhfdCBlcF9pbjsKIAl1aW50OF90IGVwX291dDsKIAorCS8qIGJvb3RjbWRyZXNwID09IDAgbWVhbnMgY29tbWFuZCBpcyBwZW5kaW5nCisJICogYm9vdGNtZHJlc3AgPCAwIG1lYW5zIGVycm9yCisJICogYm9vdGNtZHJlc3AgPiAwIGlzIGEgQk9PVF9DTURfUkVTUF8qIGZyb20gZmlybXdhcmUKKwkgKi8KIAlpbnQ4X3QgYm9vdGNtZHJlc3A7CiAKIAlpbnQgZXBfaW5fc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwppbmRleCBiZDMyYWMwLi43M2RjOGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC0yOTEsOSArMjkxLDExIEBACiAJCQlpZiAocHJpdi0+aW5mcmFfb3BlbiB8fCBwcml2LT5tZXNoX29wZW4pCiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCWlmIChwcml2LT5tb2RlID09IElXX01PREVfSU5GUkEpCi0JCQkJbGJzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKKwkJCQlsYnNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHByaXYsCisJCQkJCQkJICAgICBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCQkJCQkJICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCQllbHNlIGlmIChwcml2LT5tb2RlID09IElXX01PREVfQURIT0MpCi0JCQkJbGJzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKwkJCQlsYnNfYWRob2Nfc3RvcChwcml2KTsKIAkJCWxic19hZGRfcnRhcChwcml2KTsKIAkJfQogCQlwcml2LT5tb25pdG9ybW9kZSA9IG1vbml0b3JfbW9kZTsKQEAgLTk1NiwxNyArOTU4LDI0IEBACiBzdGF0aWMgaW50IGxic19zZXR1cF9maXJtd2FyZShzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCiB7CiAJaW50IHJldCA9IC0xOworCXMxNiBjdXJsZXZlbCA9IDAsIG1pbmxldmVsID0gMCwgbWF4bGV2ZWwgPSAwOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX0ZXKTsKIAotCS8qCi0JICogUmVhZCBNQUMgYWRkcmVzcyBmcm9tIEhXCi0JICovCisJLyogUmVhZCBNQUMgYWRkcmVzcyBmcm9tIGZpcm13YXJlICovCiAJbWVtc2V0KHByaXYtPmN1cnJlbnRfYWRkciwgMHhmZiwgRVRIX0FMRU4pOwogCXJldCA9IGxic191cGRhdGVfaHdfc3BlYyhwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKKwkvKiBSZWFkIHBvd2VyIGxldmVscyBpZiBhdmFpbGFibGUgKi8KKwlyZXQgPSBsYnNfZ2V0X3R4X3Bvd2VyKHByaXYsICZjdXJsZXZlbCwgJm1pbmxldmVsLCAmbWF4bGV2ZWwpOworCWlmIChyZXQgPT0gMCkgeworCQlwcml2LT50eHBvd2VyX2N1ciA9IGN1cmxldmVsOworCQlwcml2LT50eHBvd2VyX21pbiA9IG1pbmxldmVsOworCQlwcml2LT50eHBvd2VyX21heCA9IG1heGxldmVsOworCX0KKwogCWxic19zZXRfbWFjX2NvbnRyb2wocHJpdik7CiBkb25lOgogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX0ZXLCAicmV0ICVkIiwgcmV0KTsKQEAgLTEwNDIsNyArMTA1MSw3IEBACiAJcHJpdi0+bW9kZSA9IElXX01PREVfSU5GUkE7CiAJcHJpdi0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPSBERUZBVUxUX0FEX0hPQ19DSEFOTkVMOwogCXByaXYtPm1hY19jb250cm9sID0gQ01EX0FDVF9NQUNfUlhfT04gfCBDTURfQUNUX01BQ19UWF9PTjsKLQlwcml2LT5yYWRpb29uID0gUkFESU9fT047CisJcHJpdi0+cmFkaW9fb24gPSAxOwogCXByaXYtPmVuYWJsZWh3YXV0byA9IDE7CiAJcHJpdi0+Y2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKIAlwcml2LT5wc21vZGUgPSBMQlM4MDJfMTFQT1dFUk1PREVDQU07CkBAIC0xMTk2LDcgKzEyMDUsMTMgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNjYW5fd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5hc3NvY193b3JrKTsKIAljYW5jZWxfd29ya19zeW5jKCZwcml2LT5tY2FzdF93b3JrKTsKKworCS8qIHdvcmtlciB0aHJlYWQgZGVzdHJ1Y3Rpb24gYmxvY2tzIG9uIHRoZSBpbi1mbGlnaHQgY29tbWFuZCB3aGljaAorCSAqIHNob3VsZCBoYXZlIGJlZW4gY2xlYXJlZCBhbHJlYWR5IGluIGxic19zdG9wX2NhcmQoKS4KKwkgKi8KKwlsYnNfZGViX21haW4oImRlc3Ryb3lpbmcgd29ya2VyIHRocmVhZFxuIik7CiAJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya190aHJlYWQpOworCWxic19kZWJfbWFpbigiZG9uZSBkZXN0cm95aW5nIHdvcmtlciB0aHJlYWRcbiIpOwogCiAJaWYgKHByaXYtPnBzbW9kZSA9PSBMQlM4MDJfMTFQT1dFUk1PREVNQVhfUFNQKSB7CiAJCXByaXYtPnBzbW9kZSA9IExCUzgwMl8xMVBPV0VSTU9ERUNBTTsKQEAgLTEzMTQsMTQgKzEzMjksMjYgQEAKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2xic19ydGFwKTsKIAl9CiAKLQkvKiBGbHVzaCBwZW5kaW5nIGNvbW1hbmQgbm9kZXMgKi8KKwkvKiBEZWxldGUgdGhlIHRpbWVvdXQgb2YgdGhlIGN1cnJlbnRseSBwcm9jZXNzaW5nIGNvbW1hbmQgKi8KIAlkZWxfdGltZXJfc3luYygmcHJpdi0+Y29tbWFuZF90aW1lcik7CisKKwkvKiBGbHVzaCBwZW5kaW5nIGNvbW1hbmQgbm9kZXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlsYnNfZGViX21haW4oImNsZWFyaW5nIHBlbmRpbmcgY29tbWFuZHNcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kbm9kZSwgJnByaXYtPmNtZHBlbmRpbmdxLCBsaXN0KSB7CiAJCWNtZG5vZGUtPnJlc3VsdCA9IC1FTk9FTlQ7CiAJCWNtZG5vZGUtPmNtZHdhaXRxd29rZW4gPSAxOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNtZG5vZGUtPmNtZHdhaXRfcSk7CiAJfQorCisJLyogRmx1c2ggdGhlIGNvbW1hbmQgdGhlIGNhcmQgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgKi8KKwlpZiAocHJpdi0+Y3VyX2NtZCkgeworCQlsYnNfZGViX21haW4oImNsZWFyaW5nIGN1cnJlbnQgY29tbWFuZFxuIik7CisJCXByaXYtPmN1cl9jbWQtPnJlc3VsdCA9IC1FTk9FTlQ7CisJCXByaXYtPmN1cl9jbWQtPmNtZHdhaXRxd29rZW4gPSAxOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPmN1cl9jbWQtPmNtZHdhaXRfcSk7CisJfQorCWxic19kZWJfbWFpbigiZG9uZSBjbGVhcmluZyBjb21tYW5kc1xuIik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMKaW5kZXggNGIyNzQ1Ni4uOGY2NjkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uYwpAQCAtOTQ0LDYgKzk0NCwxMSBAQAogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCisJaWYgKCFwcml2LT5yYWRpb19vbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQlyZXQgPSAtRU5FVERPV047CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCmluZGV4IDhiM2VkNzcuLjgyYzNlNWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCkBAIC0zMCw2ICszMCwxNCBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrX3RocmVhZCwgJnByaXYtPmFzc29jX3dvcmssIEhaIC8gMik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYnNfZG9fYXNzb2NpYXRpb25fd29yayhzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYpCit7CisJaWYgKHByaXYtPnN1cnByaXNlcmVtb3ZlZCkKKwkJcmV0dXJuOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmFzc29jX3dvcmspOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrX3RocmVhZCwgJnByaXYtPmFzc29jX3dvcmssIDApOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbGJzX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdikKIHsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hc3NvY193b3JrKTsKQEAgLTEyMCwzNCArMTI4LDYgQEAKIAlyZXR1cm4gY2ZwOwogfQogCi0KLS8qKgotICogIEBicmllZiBTZXQgUmFkaW8gT24vT0ZGCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxic19wcml2YXRlIHN0cnVjdHVyZQotICogIEBvcHRpb24gCQkJUmFkaW8gT3B0aW9uCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCBsYnNfcmFkaW9faW9jdGwoc3RydWN0IGxic19wcml2YXRlICpwcml2LCB1OCBvcHRpb24pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7Ci0KLQlpZiAocHJpdi0+cmFkaW9vbiAhPSBvcHRpb24pIHsKLQkJbGJzX2RlYl93ZXh0KCJzd2l0Y2hpbmcgcmFkaW8gJXNcbiIsIG9wdGlvbiA/ICJvbiIgOiAib2ZmIik7Ci0JCXByaXYtPnJhZGlvb24gPSBvcHRpb247Ci0KLQkJcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCQkgICAgQ01EXzgwMl8xMV9SQURJT19DT05UUk9MLAotCQkJCQkgICAgQ01EX0FDVF9TRVQsCi0JCQkJCSAgICBDTURfT1BUSU9OX1dBSVRGT1JSU1AsIDAsIE5VTEwpOwotCX0KLQotCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qKgogICogIEBicmllZiBDb3B5IGFjdGl2ZSBkYXRhIHJhdGVzIGJhc2VkIG9uIGFkYXB0ZXIgbW9kZSBhbmQgc3RhdHVzCiAgKgpAQCAtMjk0LDIxICsyNzQsMTcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7Ci0JdTMyIHJ0aHIgPSB2d3JxLT52YWx1ZTsKKwl1MzIgdmFsID0gdndycS0+dmFsdWU7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKLQlpZiAodndycS0+ZGlzYWJsZWQpIHsKLQkJcHJpdi0+cnRzdGhzZCA9IHJ0aHIgPSBNUlZEUlZfUlRTX01BWF9WQUxVRTsKLQl9IGVsc2UgewotCQlpZiAocnRociA8IE1SVkRSVl9SVFNfTUlOX1ZBTFVFIHx8IHJ0aHIgPiBNUlZEUlZfUlRTX01BWF9WQUxVRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlwcml2LT5ydHN0aHNkID0gcnRocjsKLQl9CisJaWYgKHZ3cnEtPmRpc2FibGVkKQorCQl2YWwgPSBNUlZEUlZfUlRTX01BWF9WQUxVRTsKIAotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9TTk1QX01JQiwKLQkJCQkgICAgQ01EX0FDVF9TRVQsIENNRF9PUFRJT05fV0FJVEZPUlJTUCwKLQkJCQkgICAgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xELCAmcnRocik7CisJaWYgKHZhbCA+IE1SVkRSVl9SVFNfTUFYX1ZBTFVFKSAvKiBtaW4gcnRzIHZhbHVlIGlzIDAgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBsYnNfc2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9SVFNfVEhSRVNIT0xELCAodTE2KSB2YWwpOwogCiAJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfV0VYVCwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTMxNywyMSArMjkzLDE4IEBACiBzdGF0aWMgaW50IGxic19nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsID0gMDsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKIAotCXByaXYtPnJ0c3Roc2QgPSAwOwotCXJldCA9IGxic19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EXzgwMl8xMV9TTk1QX01JQiwKLQkJCQkgICAgQ01EX0FDVF9HRVQsIENNRF9PUFRJT05fV0FJVEZPUlJTUCwKLQkJCQkgICAgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xELCBOVUxMKTsKKwlyZXQgPSBsYnNfZ2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9SVFNfVEhSRVNIT0xELCAmdmFsKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXZ3cnEtPnZhbHVlID0gcHJpdi0+cnRzdGhzZDsKLQl2d3JxLT5kaXNhYmxlZCA9ICgodndycS0+dmFsdWUgPCBNUlZEUlZfUlRTX01JTl9WQUxVRSkKLQkJCSAgfHwgKHZ3cnEtPnZhbHVlID4gTVJWRFJWX1JUU19NQVhfVkFMVUUpKTsKKwl2d3JxLT52YWx1ZSA9IHZhbDsKKwl2d3JxLT5kaXNhYmxlZCA9IHZhbCA+IE1SVkRSVl9SVFNfTUFYX1ZBTFVFOyAvKiBtaW4gcnRzIHZhbHVlIGlzIDAgKi8KIAl2d3JxLT5maXhlZCA9IDE7CiAKIG91dDoKQEAgLTM0MiwyNCArMzE1LDE5IEBACiBzdGF0aWMgaW50IGxic19zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCiB7Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGZ0aHIgPSB2d3JxLT52YWx1ZTsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHJldCA9IDA7CisJdTMyIHZhbCA9IHZ3cnEtPnZhbHVlOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCi0JaWYgKHZ3cnEtPmRpc2FibGVkKSB7Ci0JCXByaXYtPmZyYWd0aHNkID0gZnRociA9IE1SVkRSVl9GUkFHX01BWF9WQUxVRTsKLQl9IGVsc2UgewotCQlpZiAoZnRociA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRQotCQkgICAgfHwgZnRociA+IE1SVkRSVl9GUkFHX01BWF9WQUxVRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlwcml2LT5mcmFndGhzZCA9IGZ0aHI7Ci0JfQorCWlmICh2d3JxLT5kaXNhYmxlZCkKKwkJdmFsID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOwogCi0JcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBDTURfODAyXzExX1NOTVBfTUlCLAotCQkJCSAgICBDTURfQUNUX1NFVCwgQ01EX09QVElPTl9XQUlURk9SUlNQLAotCQkJCSAgICBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELCAmZnRocik7CisJaWYgKHZhbCA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSB8fCB2YWwgPiBNUlZEUlZfRlJBR19NQVhfVkFMVUUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gbGJzX3NldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfRlJBR19USFJFU0hPTEQsICh1MTYpIHZhbCk7CiAKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMzY4LDIyICszMzYsMTkgQEAKIHN0YXRpYyBpbnQgbGJzX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHJldCA9IDA7CisJdTE2IHZhbCA9IDA7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKLQlwcml2LT5mcmFndGhzZCA9IDA7Ci0JcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCSAgICBDTURfODAyXzExX1NOTVBfTUlCLAotCQkJCSAgICBDTURfQUNUX0dFVCwgQ01EX09QVElPTl9XQUlURk9SUlNQLAotCQkJCSAgICBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xELCBOVUxMKTsKKwlyZXQgPSBsYnNfZ2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9GUkFHX1RIUkVTSE9MRCwgJnZhbCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQl2d3JxLT52YWx1ZSA9IHByaXYtPmZyYWd0aHNkOwotCXZ3cnEtPmRpc2FibGVkID0gKCh2d3JxLT52YWx1ZSA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSkKLQkJCSAgfHwgKHZ3cnEtPnZhbHVlID4gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFKSk7CisJdndycS0+dmFsdWUgPSB2YWw7CisJdndycS0+ZGlzYWJsZWQgPSAoKHZhbCA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSkKKwkJCSAgfHwgKHZhbCA+IE1SVkRSVl9GUkFHX01BWF9WQUxVRSkpOwogCXZ3cnEtPmZpeGVkID0gMTsKIAogb3V0OgpAQCAtNDEwLDcgKzM3NSw3IEBACiB7CiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCi0JKnV3cnEgPSBJV19NT0RFX1JFUEVBVCA7CisJKnV3cnEgPSBJV19NT0RFX1JFUEVBVDsKIAogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9XRVhUKTsKIAlyZXR1cm4gMDsKQEAgLTQyMCwyOCArMzg1LDMwIEBACiAJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXMxNiBjdXJsZXZlbCA9IDA7CisJaW50IHJldCA9IDA7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKLQlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJICAgIENNRF84MDJfMTFfUkZfVFhfUE9XRVIsCi0JCQkJICAgIENNRF9BQ1RfVFhfUE9XRVJfT1BUX0dFVCwKLQkJCQkgICAgQ01EX09QVElPTl9XQUlURk9SUlNQLCAwLCBOVUxMKTsKKwlpZiAoIXByaXYtPnJhZGlvX29uKSB7CisJCWxic19kZWJfd2V4dCgidHggcG93ZXIgb2ZmXG4iKTsKKwkJdndycS0+dmFsdWUgPSAwOworCQl2d3JxLT5kaXNhYmxlZCA9IDE7CisJCWdvdG8gb3V0OworCX0KIAorCXJldCA9IGxic19nZXRfdHhfcG93ZXIocHJpdiwgJmN1cmxldmVsLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWxic19kZWJfd2V4dCgidHggcG93ZXIgbGV2ZWwgJWQgZGJtXG4iLCBwcml2LT50eHBvd2VybGV2ZWwpOwotCXZ3cnEtPnZhbHVlID0gcHJpdi0+dHhwb3dlcmxldmVsOworCWxic19kZWJfd2V4dCgidHggcG93ZXIgbGV2ZWwgJWQgZGJtXG4iLCBjdXJsZXZlbCk7CisJcHJpdi0+dHhwb3dlcl9jdXIgPSBjdXJsZXZlbDsKKworCXZ3cnEtPnZhbHVlID0gY3VybGV2ZWw7CiAJdndycS0+Zml4ZWQgPSAxOwotCWlmIChwcml2LT5yYWRpb29uKSB7Ci0JCXZ3cnEtPmRpc2FibGVkID0gMDsKLQkJdndycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07Ci0JfSBlbHNlIHsKLQkJdndycS0+ZGlzYWJsZWQgPSAxOwotCX0KKwl2d3JxLT5kaXNhYmxlZCA9IDA7CisJdndycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07CiAKIG91dDoKIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9XRVhULCAicmV0ICVkIiwgcmV0KTsKQEAgLTQ1MSwzMSArNDE4LDQ0IEBACiBzdGF0aWMgaW50IGxic19zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHJldCA9IDA7CisJdTE2IHNsaW1pdCA9IDAsIGxsaW1pdCA9IDA7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKLQlpZiAodndycS0+ZmxhZ3MgPT0gSVdfUkVUUllfTElNSVQpIHsKLQkJLyogVGhlIE1BQyBoYXMgYSA0LWJpdCBUb3RhbF9UeF9Db3VudCByZWdpc3RlcgotCQkgICBUb3RhbF9UeF9Db3VudCA9IDEgKyBUeF9SZXRyeV9Db3VudCAqLworICAgICAgICBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgIT0gSVdfUkVUUllfTElNSVQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogVGhlIE1BQyBoYXMgYSA0LWJpdCBUb3RhbF9UeF9Db3VudCByZWdpc3RlcgorCSAgIFRvdGFsX1R4X0NvdW50ID0gMSArIFR4X1JldHJ5X0NvdW50ICovCiAjZGVmaW5lIFRYX1JFVFJZX01JTiAwCiAjZGVmaW5lIFRYX1JFVFJZX01BWCAxNAotCQlpZiAodndycS0+dmFsdWUgPCBUWF9SRVRSWV9NSU4gfHwgdndycS0+dmFsdWUgPiBUWF9SRVRSWV9NQVgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodndycS0+dmFsdWUgPCBUWF9SRVRSWV9NSU4gfHwgdndycS0+dmFsdWUgPiBUWF9SRVRSWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCS8qIEFkZGluZyAxIHRvIGNvbnZlcnQgcmV0cnkgY291bnQgdG8gdHJ5IGNvdW50ICovCi0JCXByaXYtPnR4cmV0cnljb3VudCA9IHZ3cnEtPnZhbHVlICsgMTsKKwkvKiBBZGQgMSB0byBjb252ZXJ0IHJldHJ5IGNvdW50IHRvIHRyeSBjb3VudCAqLworCWlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1NIT1JUKQorCQlzbGltaXQgPSAodTE2KSAodndycS0+dmFsdWUgKyAxKTsKKwllbHNlIGlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xPTkcpCisJCWxsaW1pdCA9ICh1MTYpICh2d3JxLT52YWx1ZSArIDEpOworCWVsc2UKKwkJc2xpbWl0ID0gbGxpbWl0ID0gKHUxNikgKHZ3cnEtPnZhbHVlICsgMSk7IC8qIHNldCBib3RoICovCiAKLQkJcmV0ID0gbGJzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBDTURfODAyXzExX1NOTVBfTUlCLAotCQkJCQkgICAgQ01EX0FDVF9TRVQsCi0JCQkJCSAgICBDTURfT1BUSU9OX1dBSVRGT1JSU1AsCi0JCQkJCSAgICBPSURfODAyXzExX1RYX1JFVFJZQ09VTlQsIE5VTEwpOwotCisJaWYgKGxsaW1pdCkgeworCQlyZXQgPSBsYnNfc2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9MT05HX1JFVFJZX0xJTUlULAorCQkJCSAgICAgICBsbGltaXQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChzbGltaXQpIHsKKwkJLyogdHhyZXRyeWNvdW50IGZvbGxvd3MgdGhlIHNob3J0IHJldHJ5IGxpbWl0ICovCisJCXByaXYtPnR4cmV0cnljb3VudCA9IHNsaW1pdDsKKwkJcmV0ID0gbGJzX3NldF9zbm1wX21pYihwcml2LCBTTk1QX01JQl9PSURfU0hPUlRfUkVUUllfTElNSVQsCisJCQkJICAgICAgIHNsaW1pdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKIAl9CiAKIG91dDoKQEAgLTQ4OCwyMiArNDY4LDMwIEBACiB7CiAJc3RydWN0IGxic19wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OwogCWludCByZXQgPSAwOworCXUxNiB2YWwgPSAwOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCi0JcHJpdi0+dHhyZXRyeWNvdW50ID0gMDsKLQlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJICAgIENNRF84MDJfMTFfU05NUF9NSUIsCi0JCQkJICAgIENNRF9BQ1RfR0VULCBDTURfT1BUSU9OX1dBSVRGT1JSU1AsCi0JCQkJICAgIE9JRF84MDJfMTFfVFhfUkVUUllDT1VOVCwgTlVMTCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAl2d3JxLT5kaXNhYmxlZCA9IDA7Ci0JaWYgKCF2d3JxLT5mbGFncykgewotCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCisJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTE9ORykgeworCQlyZXQgPSBsYnNfZ2V0X3NubXBfbWliKHByaXYsIFNOTVBfTUlCX09JRF9MT05HX1JFVFJZX0xJTUlULCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCiAJCS8qIFN1YnRyYWN0IDEgdG8gY29udmVydCB0cnkgY291bnQgdG8gcmV0cnkgY291bnQgKi8KLQkJdndycS0+dmFsdWUgPSBwcml2LT50eHJldHJ5Y291bnQgLSAxOworCQl2d3JxLT52YWx1ZSA9IHZhbCAtIDE7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MT05HOworCX0gZWxzZSB7CisJCXJldCA9IGxic19nZXRfc25tcF9taWIocHJpdiwgU05NUF9NSUJfT0lEX1NIT1JUX1JFVFJZX0xJTUlULCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCS8qIHR4cmV0cnkgY291bnQgZm9sbG93cyB0aGUgc2hvcnQgcmV0cnkgbGltaXQgKi8KKwkJcHJpdi0+dHhyZXRyeWNvdW50ID0gdmFsOworCQkvKiBTdWJ0cmFjdCAxIHRvIGNvbnZlcnQgdHJ5IGNvdW50IHRvIHJldHJ5IGNvdW50ICovCisJCXZ3cnEtPnZhbHVlID0gdmFsIC0gMTsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX1NIT1JUOwogCX0KIAogb3V0OgpAQCAtNjkzLDIyICs2ODEsMTIgQEAKIAogCXJhbmdlLT5zZW5zaXRpdml0eSA9IDA7CiAKLQkvKgotCSAqIFNldHVwIHRoZSBzdXBwb3J0ZWQgcG93ZXIgbGV2ZWwgcmFuZ2VzCi0JICovCisJLyogU2V0dXAgdGhlIHN1cHBvcnRlZCBwb3dlciBsZXZlbCByYW5nZXMgKi8KIAltZW1zZXQocmFuZ2UtPnR4cG93ZXIsIDAsIHNpemVvZihyYW5nZS0+dHhwb3dlcikpOwotCXJhbmdlLT50eHBvd2VyWzBdID0gNTsKLQlyYW5nZS0+dHhwb3dlclsxXSA9IDc7Ci0JcmFuZ2UtPnR4cG93ZXJbMl0gPSA5OwotCXJhbmdlLT50eHBvd2VyWzNdID0gMTE7Ci0JcmFuZ2UtPnR4cG93ZXJbNF0gPSAxMzsKLQlyYW5nZS0+dHhwb3dlcls1XSA9IDE1OwotCXJhbmdlLT50eHBvd2VyWzZdID0gMTc7Ci0JcmFuZ2UtPnR4cG93ZXJbN10gPSAxOTsKLQotCXJhbmdlLT5udW1fdHhwb3dlciA9IDg7Ci0JcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKLQlyYW5nZS0+dHhwb3dlcl9jYXBhIHw9IElXX1RYUE9XX1JBTkdFOworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk0gfCBJV19UWFBPV19SQU5HRTsKKwlyYW5nZS0+dHhwb3dlclswXSA9IHByaXYtPnR4cG93ZXJfbWluOworCXJhbmdlLT50eHBvd2VyWzFdID0gcHJpdi0+dHhwb3dlcl9tYXg7CisJcmFuZ2UtPm51bV90eHBvd2VyID0gMjsKIAogCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwKIAkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSB8CkBAIC05OTgsOSArOTc2LDExIEBACiAJaWYgKGZ3cnEtPm0gIT0gcHJpdi0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpIHsKIAkJbGJzX2RlYl93ZXh0KCJtZXNoIGNoYW5uZWwgY2hhbmdlIGZvcmNlcyBldGggZGlzY29ubmVjdFxuIik7CiAJCWlmIChwcml2LT5tb2RlID09IElXX01PREVfSU5GUkEpCi0JCQlsYnNfc2VuZF9kZWF1dGhlbnRpY2F0aW9uKHByaXYpOworCQkJbGJzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShwcml2LAorCQkJCQkJICAgICBwcml2LT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCQkJCQkgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJZWxzZSBpZiAocHJpdi0+bW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQkJbGJzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKwkJCWxic19hZGhvY19zdG9wKHByaXYpOwogCX0KIAlsYnNfbWVzaF9jb25maWcocHJpdiwgQ01EX0FDVF9NRVNIX0NPTkZJR19TVEFSVCwgZndycS0+bSk7CiAJbGJzX3VwZGF0ZV9jaGFubmVsKHByaXYpOwpAQCAtMTA0NSw2ICsxMDI1LDE4IEBACiAJCQkJbmV3X3JhdGUpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKKwkJCXJldCA9IGxic19zZXRfcG93ZXJfYWRhcHRfY2ZnKHByaXYsIDAsCisJCQkJCVBPV19BREFQVF9ERUZBVUxUX1AwLAorCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMSwKKwkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBsYnNfc2V0X3RwY19jZmcocHJpdiwgMCwgVFBDX0RFRkFVTFRfUDAsIFRQQ19ERUZBVUxUX1AxLAorCQkJCVRQQ19ERUZBVUxUX1AyLCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OwogCX0KIAogCS8qIFRyeSB0aGUgbmV3ZXIgY29tbWFuZCBmaXJzdCAoRmlybXdhcmUgU3BlYyA1LjEgYW5kIGFib3ZlKSAqLwpAQCAtMTYxMiwxMiArMTYwNCwyNiBAQAogCQkJc2V0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKTsKIAkJfQogCi0JCWRpc2FibGVfd2VwIChhc3NvY19yZXEpOworCQkvKiBPbmx5IGRpc2FibGUgd2VwIGlmIG5lY2Vzc2FyeTogY2FuJ3Qgd2FzdGUgdGltZSBoZXJlLiAqLworCQlpZiAocHJpdi0+bWFjX2NvbnRyb2wgJiBDTURfQUNUX01BQ19XRVBfRU5BQkxFKQorCQkJZGlzYWJsZV93ZXAoYXNzb2NfcmVxKTsKIAl9CiAKIG91dDoKIAlpZiAocmV0ID09IDApIHsKLQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJCS8qIDgwMi4xeCBhbmQgV1BBIHJla2V5aW5nIG11c3QgaGFwcGVuIGFzIHF1aWNrbHkgYXMgcG9zc2libGUsCisJCSAqIGVzcGVjaWFsbHkgZHVyaW5nIHRoZSA0LXdheSBoYW5kc2hha2U7IHRodXMgaWYgaW4KKwkJICogaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgYW5kIGVpdGhlciAoYSkgODAyLjF4IGlzIGVuYWJsZWQgb3IKKwkJICogKGIpIFdQQSBpcyBiZWluZyB1c2VkLCBzZXQgdGhlIGtleSByaWdodCBhd2F5LgorCQkgKi8KKwkJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCSAgICAoKGFzc29jX3JlcS0+c2VjaW5mby5rZXlfbWdtdCAmIElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSB8fAorCQkgICAgIChhc3NvY19yZXEtPnNlY2luZm8ua2V5X21nbXQgJiBJV19BVVRIX0tFWV9NR01UX1BTSykgfHwKKwkJICAgICAgYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwKKwkJICAgICAgYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgeworCQkJbGJzX2RvX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJCX0gZWxzZQorCQkJbGJzX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CiAJfSBlbHNlIHsKIAkJbGJzX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOwogCX0KQEAgLTE3MjUsMTMgKzE3MzEsMTcgQEAKIAljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CiAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgotCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKIAkJLyoKIAkJICogbGliZXJ0YXMgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMKIAkJICovCiAJCWJyZWFrOwogCisJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorCQlhc3NvY19yZXEtPnNlY2luZm8ua2V5X21nbXQgPSBkd3JxLT52YWx1ZTsKKwkJdXBkYXRlZCA9IDE7CisJCWJyZWFrOworCiAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgogCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEKSB7CiAJCQlhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCA9IDA7CkBAIC0xODExLDYgKzE4MjEsMTAgQEAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKIAlzd2l0Y2ggKGR3cnEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJZHdycS0+dmFsdWUgPSBwcml2LT5zZWNpbmZvLmtleV9tZ210OworCQlicmVhazsKKwogCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKIAkJZHdycS0+dmFsdWUgPSAwOwogCQlpZiAocHJpdi0+c2VjaW5mby5XUEFlbmFibGVkKQpAQCAtMTg0NCwzOSArMTg1OCw3NyBAQAogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKLQotCXUxNiBkYm07CisJczE2IGRibSA9IChzMTYpIHZ3cnEtPnZhbHVlOwogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCiAJaWYgKHZ3cnEtPmRpc2FibGVkKSB7Ci0JCWxic19yYWRpb19pb2N0bChwcml2LCBSQURJT19PRkYpOwotCQlyZXR1cm4gMDsKKwkJbGJzX3NldF9yYWRpbyhwcml2LCBSQURJT19QUkVBTUJMRV9BVVRPLCAwKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JcHJpdi0+cHJlYW1ibGUgPSBDTURfVFlQRV9BVVRPX1BSRUFNQkxFOworCWlmICh2d3JxLT5maXhlZCA9PSAwKSB7CisJCS8qIFVzZXIgcmVxdWVzdHMgYXV0b21hdGljIHR4IHBvd2VyIGNvbnRyb2wsIGhvd2V2ZXIgdGhlcmUgYXJlCisJCSAqIG1hbnkgYXV0byB0eCBzZXR0aW5ncy4gIEZvciBub3cgdXNlIGZpcm13YXJlIGRlZmF1bHRzIHVudGlsCisJCSAqIHdlIGNvbWUgdXAgd2l0aCBhIGdvb2Qgd2F5IHRvIGV4cG9zZSB0aGVzZSB0byB0aGUgdXNlci4gKi8KKwkJaWYgKHByaXYtPmZ3cmVsZWFzZSA8IDB4MDkwMDAwMDApIHsKKwkJCXJldCA9IGxic19zZXRfcG93ZXJfYWRhcHRfY2ZnKHByaXYsIDEsCisJCQkJCVBPV19BREFQVF9ERUZBVUxUX1AwLAorCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMSwKKwkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBsYnNfc2V0X3RwY19jZmcocHJpdiwgMCwgVFBDX0RFRkFVTFRfUDAsIFRQQ19ERUZBVUxUX1AxLAorCQkJCVRQQ19ERUZBVUxUX1AyLCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQlkYm0gPSBwcml2LT50eHBvd2VyX21heDsKKwl9IGVsc2UgeworCQkvKiBVc2Vyc3BhY2UgY2hlY2sgaW4gaXdyYW5nZSBpZiBpdCBzaG91bGQgdXNlIGRCbSBvciBtVywKKwkJICogdGhlcmVmb3JlIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiBKZWFuIElJICovCisJCWlmICgodndycS0+ZmxhZ3MgJiBJV19UWFBPV19UWVBFKSAhPSBJV19UWFBPV19EQk0pIHsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJZ290byBvdXQ7CisJCX0KIAotCWxic19yYWRpb19pb2N0bChwcml2LCBSQURJT19PTik7CisJCS8qIFZhbGlkYXRlIHJlcXVlc3RlZCBwb3dlciBsZXZlbCBhZ2FpbnN0IGZpcm13YXJlIGFsbG93ZWQKKwkJICogbGV2ZWxzICovCisJCWlmIChwcml2LT50eHBvd2VyX21pbiAmJiAoZGJtIDwgcHJpdi0+dHhwb3dlcl9taW4pKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAotCS8qIFVzZXJzcGFjZSBjaGVjayBpbiBpd3JhbmdlIGlmIGl0IHNob3VsZCB1c2UgZEJtIG9yIG1XLAotCSAqIHRoZXJlZm9yZSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gSmVhbiBJSSAqLwotCWlmICgodndycS0+ZmxhZ3MgJiBJV19UWFBPV19UWVBFKSA9PSBJV19UWFBPV19NV0FUVCkgewotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfSBlbHNlCi0JCWRibSA9ICh1MTYpIHZ3cnEtPnZhbHVlOworCQlpZiAocHJpdi0+dHhwb3dlcl9tYXggJiYgKGRibSA+IHByaXYtPnR4cG93ZXJfbWF4KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChwcml2LT5md3JlbGVhc2UgPCAweDA5MDAwMDAwKSB7CisJCQlyZXQgPSBsYnNfc2V0X3Bvd2VyX2FkYXB0X2NmZyhwcml2LCAwLAorCQkJCQlQT1dfQURBUFRfREVGQVVMVF9QMCwKKwkJCQkJUE9XX0FEQVBUX0RFRkFVTFRfUDEsCisJCQkJCVBPV19BREFQVF9ERUZBVUxUX1AyKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gbGJzX3NldF90cGNfY2ZnKHByaXYsIDAsIFRQQ19ERUZBVUxUX1AwLCBUUENfREVGQVVMVF9QMSwKKwkJCQlUUENfREVGQVVMVF9QMiwgMSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CiAKLQkvKiBhdXRvIHR4IHBvd2VyIGNvbnRyb2wgKi8KKwkvKiBJZiB0aGUgcmFkaW8gd2FzIG9mZiwgdHVybiBpdCBvbiAqLworCWlmICghcHJpdi0+cmFkaW9fb24pIHsKKwkJcmV0ID0gbGJzX3NldF9yYWRpbyhwcml2LCBSQURJT19QUkVBTUJMRV9BVVRPLCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KIAotCWlmICh2d3JxLT5maXhlZCA9PSAwKQotCQlkYm0gPSAweGZmZmY7CisJbGJzX2RlYl93ZXh0KCJ0eHBvd2VyIHNldCAlZCBkQm1cbiIsIGRibSk7CiAKLQlsYnNfZGViX3dleHQoInR4cG93ZXIgc2V0ICVkIGRibVxuIiwgZGJtKTsKKwlyZXQgPSBsYnNfc2V0X3R4X3Bvd2VyKHByaXYsIGRibSk7CiAKLQlyZXQgPSBsYnNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJICAgIENNRF84MDJfMTFfUkZfVFhfUE9XRVIsCi0JCQkJICAgIENNRF9BQ1RfVFhfUE9XRVJfT1BUX1NFVF9MT1csCi0JCQkJICAgIENNRF9PUFRJT05fV0FJVEZPUlJTUCwgMCwgKHZvaWQgKikmZGJtKTsKLQorb3V0OgogCWxic19kZWJfbGVhdmVfYXJncyhMQlNfREVCX1dFWFQsICJyZXQgJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xOTI4LDYgKzE5ODAsMTEgQEAKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9XRVhUKTsKIAorCWlmICghcHJpdi0+cmFkaW9fb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLwogCWlmIChpbl9zc2lkX2xlbiA+IElXX0VTU0lEX01BWF9TSVpFKSB7CiAJCXJldCA9IC1FMkJJRzsKQEAgLTIwMDUsNiArMjA2MiwxMSBAQAogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX1dFWFQpOwogCisJaWYgKCFwcml2LT5yYWRpb19vbikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCiAJaWYgKGR3cnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKSB7CiAJCXJldCA9IC1FMkJJRzsKQEAgLTIwNDYsNiArMjEwOCw5IEBACiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfV0VYVCk7CiAKKwlpZiAoIXByaXYtPnJhZGlvX29uKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjU1NDRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitsaWJlcnRhc190Zi1vYmpzIDo9IG1haW4ubyBjbWQubworCitsaWJlcnRhc190Zl91c2Itb2JqcyArPSBpZl91c2IubworCitvYmotJChDT05GSUdfTElCRVJUQVNfVEhJTkZJUk0pICs9IGxpYmVydGFzX3RmLm8KK29iai0kKENPTkZJR19MSUJFUlRBU19USElORklSTV9VU0IpICs9IGxpYmVydGFzX3RmX3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmNmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9jbWQuYwpAQCAtMCwwICsxLDY2OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgsIGNvenliaXQgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA2LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSAibGliZXJ0YXNfdGYuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaGFubmVsX3JhbmdlIGNoYW5uZWxfcmFuZ2VzW10gPSB7CisJeyBMQlRGX1JFR0RPTUFJTl9VUywJCTEsIDEyIH0sCisJeyBMQlRGX1JFR0RPTUFJTl9DQSwJCTEsIDEyIH0sCisJeyBMQlRGX1JFR0RPTUFJTl9FVSwJCTEsIDE0IH0sCisJeyBMQlRGX1JFR0RPTUFJTl9KUCwJCTEsIDE0IH0sCisJeyBMQlRGX1JFR0RPTUFJTl9TUCwJCTEsIDE0IH0sCisJeyBMQlRGX1JFR0RPTUFJTl9GUiwJCTEsIDE0IH0sCit9OworCitzdGF0aWMgdTE2IGxidGZfcmVnaW9uX2NvZGVfdG9faW5kZXhbTVJWRFJWX01BWF9SRUdJT05fQ09ERV0gPQoreworCUxCVEZfUkVHRE9NQUlOX1VTLCBMQlRGX1JFR0RPTUFJTl9DQSwgTEJURl9SRUdET01BSU5fRVUsCisJTEJURl9SRUdET01BSU5fU1AsIExCVEZfUkVHRE9NQUlOX0ZSLCBMQlRGX1JFR0RPTUFJTl9KUCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqbGJ0Zl9nZXRfY21kX2N0cmxfbm9kZShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KTsKKworCisvKioKKyAqICBsYnRmX2NtZF9jb3B5YmFjayAtIFNpbXBsZSBjYWxsYmFjayB0aGF0IGNvcGllcyByZXNwb25zZSBiYWNrIGludG8gY29tbWFuZAorICoKKyAqICBAcHJpdglBIHBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAZXh0cmEJQSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBjb21tYW5kIHN0cnVjdHVyZSBmb3Igd2hpY2gKKyAqCQkncmVzcCcgaXMgYSByZXNwb25zZQorICogIEByZXNwCUEgcG9pbnRlciB0byB0aGUgY29tbWFuZCByZXNwb25zZQorICoKKyAqICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxidGZfY21kX2NvcHliYWNrKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZXh0cmEsCisJCSAgICAgc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApCit7CisJc3RydWN0IGNtZF9oZWFkZXIgKmJ1ZiA9ICh2b2lkICopZXh0cmE7CisJdWludDE2X3QgY29weV9sZW47CisKKwljb3B5X2xlbiA9IG1pbihsZTE2X3RvX2NwdShidWYtPnNpemUpLCBsZTE2X3RvX2NwdShyZXNwLT5zaXplKSk7CisJbWVtY3B5KGJ1ZiwgcmVzcCwgY29weV9sZW4pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGJ0Zl9jbWRfY29weWJhY2spOworCisjZGVmaW5lIENIQU5fVE9fSURYKGNoYW4pICgoY2hhbikgLSAxKQorCitzdGF0aWMgdm9pZCBsYnRmX2dlb19pbml0KHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpCit7CisJY29uc3Qgc3RydWN0IGNoYW5uZWxfcmFuZ2UgKnJhbmdlID0gY2hhbm5lbF9yYW5nZXM7CisJdTggY2g7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFubmVsX3Jhbmdlcyk7IGkrKykKKwkJaWYgKGNoYW5uZWxfcmFuZ2VzW2ldLnJlZ2RvbWFpbiA9PSBwcml2LT5yZWdpb25jb2RlKSB7CisJCQlyYW5nZSA9ICZjaGFubmVsX3Jhbmdlc1tpXTsKKwkJCWJyZWFrOworCQl9CisKKwlmb3IgKGNoID0gcHJpdi0+cmFuZ2Uuc3RhcnQ7IGNoIDwgcHJpdi0+cmFuZ2UuZW5kOyBjaCsrKQorCQlwcml2LT5jaGFubmVsc1tDSEFOX1RPX0lEWChjaCldLmZsYWdzID0gMDsKK30KKworLyoqCisgKiAgbGJ0Zl91cGRhdGVfaHdfc3BlYzogVXBkYXRlcyB0aGUgaGFyZHdhcmUgZGV0YWlscy4KKyAqCisgKiAgQHByaXYgICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgbGJ0Zl9wcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IGxidGZfdXBkYXRlX2h3X3NwZWMoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgY21kX2RzX2dldF9od19zcGVjIGNtZDsKKwlpbnQgcmV0ID0gLTE7CisJdTMyIGk7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwltZW1jcHkoY21kLnBlcm1hbmVudGFkZHIsIHByaXYtPmN1cnJlbnRfYWRkciwgRVRIX0FMRU4pOworCXJldCA9IGxidGZfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EX0dFVF9IV19TUEVDLCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXByaXYtPmZ3Y2FwaW5mbyA9IGxlMzJfdG9fY3B1KGNtZC5md2NhcGluZm8pOworCisJLyogVGhlIGZpcm13YXJlIHJlbGVhc2UgaXMgaW4gYW4gaW50ZXJlc3RpbmcgZm9ybWF0OiB0aGUgcGF0Y2gKKwkgKiBsZXZlbCBpcyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBuaWJibGUgLi4uIHNvIGZpeCB0aGF0OiAqLworCXByaXYtPmZ3cmVsZWFzZSA9IGxlMzJfdG9fY3B1KGNtZC5md3JlbGVhc2UpOworCXByaXYtPmZ3cmVsZWFzZSA9IChwcml2LT5md3JlbGVhc2UgPDwgOCkgfAorCQkocHJpdi0+ZndyZWxlYXNlID4+IDI0ICYgMHhmZik7CisKKwlwcmludGsoS0VSTl9JTkZPICJsaWJlcnRhc3RmOiAlcywgZncgJXUuJXUuJXVwJXUsIGNhcCAweCUwOHhcbiIsCisJCXByaW50X21hYyhtYWMsIGNtZC5wZXJtYW5lbnRhZGRyKSwKKwkJcHJpdi0+ZndyZWxlYXNlID4+IDI0ICYgMHhmZiwKKwkJcHJpdi0+ZndyZWxlYXNlID4+IDE2ICYgMHhmZiwKKwkJcHJpdi0+ZndyZWxlYXNlID4+ICA4ICYgMHhmZiwKKwkJcHJpdi0+ZndyZWxlYXNlICAgICAgICYgMHhmZiwKKwkJcHJpdi0+ZndjYXBpbmZvKTsKKworCS8qIENsYW1wIHJlZ2lvbiBjb2RlIHRvIDgtYml0IHNpbmNlIEZXIHNwZWMgaW5kaWNhdGVzIHRoYXQgaXQgc2hvdWxkCisJICogb25seSBldmVyIGJlIDgtYml0LCBldmVuIHRob3VnaCB0aGUgZmllbGQgc2l6ZSBpcyAxNi1iaXQuICBTb21lCisJICogZmlybXdhcmUgcmV0dXJucyBub24temVybyBoaWdoIDggYml0cyBoZXJlLgorCSAqLworCXByaXYtPnJlZ2lvbmNvZGUgPSBsZTE2X3RvX2NwdShjbWQucmVnaW9uY29kZSkgJiAweEZGOworCisJZm9yIChpID0gMDsgaSA8IE1SVkRSVl9NQVhfUkVHSU9OX0NPREU7IGkrKykgeworCQkvKiB1c2UgdGhlIHJlZ2lvbiBjb2RlIHRvIHNlYXJjaCBmb3IgdGhlIGluZGV4ICovCisJCWlmIChwcml2LT5yZWdpb25jb2RlID09IGxidGZfcmVnaW9uX2NvZGVfdG9faW5kZXhbaV0pCisJCQlicmVhazsKKwl9CisKKwkvKiBpZiBpdCdzIHVuaWRlbnRpZmllZCByZWdpb24gY29kZSwgdXNlIHRoZSBkZWZhdWx0IChVU0EpICovCisJaWYgKGkgPj0gTVJWRFJWX01BWF9SRUdJT05fQ09ERSkKKwkJcHJpdi0+cmVnaW9uY29kZSA9IDB4MTA7CisKKwlpZiAocHJpdi0+Y3VycmVudF9hZGRyWzBdID09IDB4ZmYpCisJCW1lbW1vdmUocHJpdi0+Y3VycmVudF9hZGRyLCBjbWQucGVybWFuZW50YWRkciwgRVRIX0FMRU4pOworCisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIocHJpdi0+aHcsIHByaXYtPmN1cnJlbnRfYWRkcik7CisKKwlsYnRmX2dlb19pbml0KHByaXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIGxidGZfc2V0X2NoYW5uZWw6IFNldCB0aGUgcmFkaW8gY2hhbm5lbAorICoKKyAqICBAcHJpdglBIHBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAY2hhbm5lbAlUaGUgZGVzaXJlZCBjaGFubmVsLCBvciAwIHRvIGNsZWFyIGEgbG9ja2VkIGNoYW5uZWwKKyAqCisgKiAgUmV0dXJuczogMCBvbiBzdWNjZXNzLCBlcnJvciBvbiBmYWlsdXJlCisgKi8KK2ludCBsYnRmX3NldF9jaGFubmVsKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCBjbWQ7CisKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9PUFRfODAyXzExX1JGX0NIQU5ORUxfU0VUKTsKKwljbWQuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoYW5uZWwpOworCisJcmV0dXJuIGxidGZfY21kX3dpdGhfcmVzcG9uc2UocHJpdiwgQ01EXzgwMl8xMV9SRl9DSEFOTkVMLCAmY21kKTsKK30KKworaW50IGxidGZfYmVhY29uX3NldChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2JlYWNvbl9zZXQgY21kOworCWludCBzaXplOworCisJaWYgKGJlYWNvbi0+bGVuID4gTVJWTF9NQVhfQkNOX1NJWkUpCisJCXJldHVybiAtMTsKKwlzaXplID0gIHNpemVvZihjbWQpIC0gc2l6ZW9mKGNtZC5iZWFjb24pICsgYmVhY29uLT5sZW47CisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisJY21kLmxlbiA9IGNwdV90b19sZTE2KGJlYWNvbi0+bGVuKTsKKwltZW1jcHkoY21kLmJlYWNvbiwgKHU4ICopIGJlYWNvbi0+ZGF0YSwgYmVhY29uLT5sZW4pOworCisJbGJ0Zl9jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9CRUFDT05fU0VULCAmY21kLmhkciwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsYnRmX2JlYWNvbl9jdHJsKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIGJvb2wgYmVhY29uX2VuYWJsZSwKKwkJICAgICBpbnQgYmVhY29uX2ludCkgeworCXN0cnVjdCBjbWRfZHNfODAyXzExX2JlYWNvbl9jb250cm9sIGNtZDsKKworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCWNtZC5iZWFjb25fZW5hYmxlID0gY3B1X3RvX2xlMTYoYmVhY29uX2VuYWJsZSk7CisJY21kLmJlYWNvbl9wZXJpb2QgPSBjcHVfdG9fbGUxNihiZWFjb25faW50KTsKKworCWxidGZfY21kX2FzeW5jKHByaXYsIENNRF84MDJfMTFfQkVBQ09OX0NUUkwsICZjbWQuaGRyLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxidGZfcXVldWVfY21kKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsCisJCQkgIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNtZG5vZGUpCisJCXJldHVybjsKKworCWlmICghY21kbm9kZS0+Y21kYnVmLT5zaXplKQorCQlyZXR1cm47CisKKwljbWRub2RlLT5yZXN1bHQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmNtZG5vZGUtPmxpc3QsICZwcml2LT5jbWRwZW5kaW5ncSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbGJ0Zl9zdWJtaXRfY29tbWFuZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LAorCQkJICAgICAgIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNtZF9oZWFkZXIgKmNtZDsKKwl1aW50MTZfdCBjbWRzaXplOworCXVpbnQxNl90IGNvbW1hbmQ7CisJaW50IHRpbWVvID0gNSAqIEhaOworCWludCByZXQ7CisKKwljbWQgPSBjbWRub2RlLT5jbWRidWY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5jdXJfY21kID0gY21kbm9kZTsKKwljbWRzaXplID0gbGUxNl90b19jcHUoY21kLT5zaXplKTsKKwljb21tYW5kID0gbGUxNl90b19jcHUoY21kLT5jb21tYW5kKTsKKwlyZXQgPSBwcml2LT5od19ob3N0X3RvX2NhcmQocHJpdiwgTVZNU19DTUQsICh1OCAqKSBjbWQsIGNtZHNpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0KQorCQkvKiBMZXQgdGhlIHRpbWVyIGtpY2sgaW4gYW5kIHJldHJ5LCBhbmQgcG90ZW50aWFsbHkgcmVzZXQKKwkJICAgdGhlIHdob2xlIHRoaW5nIGlmIHRoZSBjb25kaXRpb24gcGVyc2lzdHMgKi8KKwkJdGltZW8gPSBIWjsKKworCS8qIFNldHVwIHRoZSB0aW1lciBhZnRlciB0cmFuc21pdCBjb21tYW5kICovCisJbW9kX3RpbWVyKCZwcml2LT5jb21tYW5kX3RpbWVyLCBqaWZmaWVzICsgdGltZW8pOworfQorCisvKioKKyAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgY29tbWFuZCBub2RlIHRvIGNtZGZyZWVxCisgKiAgYWZ0ZXIgY2xlYW5zIGl0LiBSZXF1aXJlcyBwcml2LT5kcml2ZXJfbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBfX2xidGZfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LAorCQkJCQkgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGUpCit7CisJaWYgKCFjbWRub2RlKQorCQlyZXR1cm47CisKKwljbWRub2RlLT5jYWxsYmFjayA9IE5VTEw7CisJY21kbm9kZS0+Y2FsbGJhY2tfYXJnID0gMDsKKworCW1lbXNldChjbWRub2RlLT5jbWRidWYsIDAsIExCU19DTURfQlVGRkVSX1NJWkUpOworCisJbGlzdF9hZGRfdGFpbCgmY21kbm9kZS0+bGlzdCwgJnByaXYtPmNtZGZyZWVxKTsKK30KKworc3RhdGljIHZvaWQgbGJ0Zl9jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsCisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlfX2xidGZfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBwdGVtcGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBsYnRmX2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZCwKKwkJCSAgaW50IHJlc3VsdCkKK3sKKwljbWQtPnJlc3VsdCA9IHJlc3VsdDsKKwljbWQtPmNtZHdhaXRxd29rZW4gPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kLT5jbWR3YWl0X3EpOworCisJaWYgKCFjbWQtPmNhbGxiYWNrKQorCQlfX2xidGZfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWQpOworCXByaXYtPmN1cl9jbWQgPSBOVUxMOworfQorCitpbnQgbGJ0Zl9jbWRfc2V0X21hY19tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBjbWRfZHNfbWFjX211bHRpY2FzdF9hZGRyIGNtZDsKKworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCisJY21kLm5yX29mX2FkcnMgPSBjcHVfdG9fbGUxNigodTE2KSBwcml2LT5ucl9vZl9tdWx0aWNhc3RtYWNhZGRyKTsKKwltZW1jcHkoY21kLm1hY2xpc3QsIHByaXYtPm11bHRpY2FzdGxpc3QsCisJICAgICAgIHByaXYtPm5yX29mX211bHRpY2FzdG1hY2FkZHIgKiBFVEhfQUxFTik7CisKKwlsYnRmX2NtZF9hc3luYyhwcml2LCBDTURfTUFDX01VTFRJQ0FTVF9BRFIsICZjbWQuaGRyLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbGJ0Zl9zZXRfbW9kZShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBlbnVtIGxidGZfbW9kZSBtb2RlKQoreworCXN0cnVjdCBjbWRfZHNfc2V0X21vZGUgY21kOworCisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCWNtZC5tb2RlID0gY3B1X3RvX2xlMTYobW9kZSk7CisJbGJ0Zl9jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9TRVRfTU9ERSwgJmNtZC5oZHIsIHNpemVvZihjbWQpKTsKK30KKwordm9pZCBsYnRmX3NldF9ic3NpZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBib29sIGFjdGl2YXRlLCB1OCAqYnNzaWQpCit7CisJc3RydWN0IGNtZF9kc19zZXRfYnNzaWQgY21kOworCisJY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZCkpOworCWNtZC5hY3RpdmF0ZSA9IGFjdGl2YXRlID8gMSA6IDA7CisJaWYgKGFjdGl2YXRlKQorCQltZW1jcHkoY21kLmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCisJbGJ0Zl9jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9TRVRfQlNTSUQsICZjbWQuaGRyLCBzaXplb2YoY21kKSk7Cit9CisKK2ludCBsYnRmX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCB1aW50OF90ICptYWNfYWRkcikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tYWNfYWRkcmVzcyBjbWQ7CisKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KENNRF9BQ1RfU0VUKTsKKworCW1lbWNweShjbWQubWFjYWRkLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCisJbGJ0Zl9jbWRfYXN5bmMocHJpdiwgQ01EXzgwMl8xMV9NQUNfQUREUkVTUywgJmNtZC5oZHIsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxidGZfc2V0X3JhZGlvX2NvbnRyb2woc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYWRpb19jb250cm9sIGNtZDsKKworCWNtZC5oZHIuc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihjbWQpKTsKKwljbWQuYWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9TRVQpOworCisJc3dpdGNoIChwcml2LT5wcmVhbWJsZSkgeworCWNhc2UgQ01EX1RZUEVfU0hPUlRfUFJFQU1CTEU6CisJCWNtZC5jb250cm9sID0gY3B1X3RvX2xlMTYoU0VUX1NIT1JUX1BSRUFNQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9UWVBFX0xPTkdfUFJFQU1CTEU6CisJCWNtZC5jb250cm9sID0gY3B1X3RvX2xlMTYoU0VUX0xPTkdfUFJFQU1CTEUpOworCQlicmVhazsKKworCWNhc2UgQ01EX1RZUEVfQVVUT19QUkVBTUJMRToKKwlkZWZhdWx0OgorCQljbWQuY29udHJvbCA9IGNwdV90b19sZTE2KFNFVF9BVVRPX1BSRUFNQkxFKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHByaXYtPnJhZGlvb24pCisJCWNtZC5jb250cm9sIHw9IGNwdV90b19sZTE2KFRVUk5fT05fUkYpOworCWVsc2UKKwkJY21kLmNvbnRyb2wgJj0gY3B1X3RvX2xlMTYoflRVUk5fT05fUkYpOworCisJcmV0ID0gbGJ0Zl9jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfODAyXzExX1JBRElPX0NPTlRST0wsICZjbWQpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbGJ0Zl9zZXRfbWFjX2NvbnRyb2woc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sIGNtZDsKKwljbWQuaGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoY21kKSk7CisJY21kLmFjdGlvbiA9IGNwdV90b19sZTE2KHByaXYtPm1hY19jb250cm9sKTsKKwljbWQucmVzZXJ2ZWQgPSAwOworCisJbGJ0Zl9jbWRfYXN5bmMocHJpdiwgQ01EX01BQ19DT05UUk9MLAorCQkmY21kLmhkciwgc2l6ZW9mKGNtZCkpOworfQorCisvKioKKyAqICBsYnRmX2FsbG9jYXRlX2NtZF9idWZmZXIgLSBBbGxvY2F0ZXMgY21kIGJ1ZmZlciwgbGlua3MgaXQgdG8gZnJlZSBjbWQgcXVldWUKKyAqCisgKiAgQHByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnRmX3ByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJldHVybnM6IDAgb24gc3VjY2Vzcy4KKyAqLworaW50IGxidGZfYWxsb2NhdGVfY21kX2J1ZmZlcihzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXUzMiBidWZzaXplOworCXUzMiBpOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRhcnJheTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBjb21tYW5kIGFycmF5ICovCisJYnVmc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21kX2N0cmxfbm9kZSkgKiBMQlNfTlVNX0NNRF9CVUZGRVJTOworCWNtZGFycmF5ID0ga3phbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZGFycmF5KQorCQlyZXR1cm4gLTE7CisJcHJpdi0+Y21kX2FycmF5ID0gY21kYXJyYXk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBlYWNoIGNvbW1hbmQgYnVmZmVyIGluIHRoZSBjb21tYW5kIGFycmF5ICovCisJZm9yIChpID0gMDsgaSA8IExCU19OVU1fQ01EX0JVRkZFUlM7IGkrKykgeworCQljbWRhcnJheVtpXS5jbWRidWYgPSBremFsbG9jKExCU19DTURfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNtZGFycmF5W2ldLmNtZGJ1ZikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTEJTX05VTV9DTURfQlVGRkVSUzsgaSsrKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNtZGFycmF5W2ldLmNtZHdhaXRfcSk7CisJCWxidGZfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCAmY21kYXJyYXlbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgbGJ0Zl9mcmVlX2NtZF9idWZmZXIgLSBGcmVlcyB0aGUgY21kIGJ1ZmZlci4KKyAqCisgKiAgQHByaXYJQSBwb2ludGVyIHRvIHN0cnVjdCBsYnRmX3ByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJldHVybnM6IDAKKyAqLworaW50IGxidGZfZnJlZV9jbWRfYnVmZmVyKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZGFycmF5OworCXVuc2lnbmVkIGludCBpOworCisJLyogbmVlZCB0byBjaGVjayBpZiBjbWQgYXJyYXkgaXMgYWxsb2NhdGVkIG9yIG5vdCAqLworCWlmIChwcml2LT5jbWRfYXJyYXkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwljbWRhcnJheSA9IHByaXYtPmNtZF9hcnJheTsKKworCS8qIFJlbGVhc2Ugc2hhcmVkIG1lbW9yeSBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IExCU19OVU1fQ01EX0JVRkZFUlM7IGkrKykgeworCQlrZnJlZShjbWRhcnJheVtpXS5jbWRidWYpOworCQljbWRhcnJheVtpXS5jbWRidWYgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgY21kX2N0cmxfbm9kZSAqLworCWtmcmVlKHByaXYtPmNtZF9hcnJheSk7CisJcHJpdi0+Y21kX2FycmF5ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBsYnRmX2dldF9jbWRfY3RybF9ub2RlIC0gR2V0cyBmcmVlIGNtZCBub2RlIGZyb20gZnJlZSBjbWQgcXVldWUuCisgKgorICogIEBwcml2CQlBIHBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUmV0dXJuczogcG9pbnRlciB0byBhIHN0cnVjdCBjbWRfY3RybF9ub2RlIG9yIE5VTEwgaWYgbm9uZSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqbGJ0Zl9nZXRfY21kX2N0cmxfbm9kZShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBjbWRfY3RybF9ub2RlICp0ZW1wbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5jbWRmcmVlcSkpIHsKKwkJdGVtcG5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcml2LT5jbWRmcmVlcSwKKwkJCQkJICAgIHN0cnVjdCBjbWRfY3RybF9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJnRlbXBub2RlLT5saXN0KTsKKwl9IGVsc2UKKwkJdGVtcG5vZGUgPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB0ZW1wbm9kZTsKK30KKworLyoqCisgKiAgbGJ0Zl9leGVjdXRlX25leHRfY29tbWFuZDogZXhlY3V0ZSBuZXh0IGNvbW1hbmQgaW4gY21kIHBlbmRpbmcgcXVldWUuCisgKgorICogIEBwcml2ICAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUmV0dXJuczogMCBvbiBzdWNjZXNzLgorICovCitpbnQgbGJ0Zl9leGVjdXRlX25leHRfY29tbWFuZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2hlYWRlciAqY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBEZWJ1ZyBncm91cCBpcyBMQlNfREVCX1RIUkVBRCBhbmQgbm90IExCU19ERUJfSE9TVCwgYmVjYXVzZSB0aGUKKwkgKiBvbmx5IGNhbGxlciB0byB1cyBpcyBsYnRmX3RocmVhZCgpIGFuZCB3ZSBnZXQgZXZlbiB3aGVuIGEKKwkgKiBkYXRhIHBhY2tldCBpcyByZWNlaXZlZCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJpdi0+Y3VyX2NtZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5jbWRwZW5kaW5ncSkpIHsKKwkJY21kbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnByaXYtPmNtZHBlbmRpbmdxLAorCQkJCQkgICBzdHJ1Y3QgY21kX2N0cmxfbm9kZSwgbGlzdCk7CisJfQorCisJaWYgKGNtZG5vZGUpIHsKKwkJY21kID0gY21kbm9kZS0+Y21kYnVmOworCisJCWxpc3RfZGVsKCZjbWRub2RlLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJbGJ0Zl9zdWJtaXRfY29tbWFuZChwcml2LCBjbWRub2RlKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbWRfY3RybF9ub2RlICpfX2xidGZfY21kX2FzeW5jKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsCisJdWludDE2X3QgY29tbWFuZCwgc3RydWN0IGNtZF9oZWFkZXIgKmluX2NtZCwgaW50IGluX2NtZF9zaXplLAorCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICosIHVuc2lnbmVkIGxvbmcsCisJCQlzdHJ1Y3QgY21kX2hlYWRlciAqKSwKKwl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX2FyZykKK3sKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKKworCWlmIChwcml2LT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJY21kbm9kZSA9IGxidGZfZ2V0X2NtZF9jdHJsX25vZGUocHJpdik7CisJaWYgKGNtZG5vZGUgPT0gTlVMTCkgeworCQkvKiBXYWtlIHVwIG1haW4gdGhyZWFkIHRvIGV4ZWN1dGUgbmV4dCBjb21tYW5kICovCisJCXF1ZXVlX3dvcmsobGJ0Zl93cSwgJnByaXYtPmNtZF93b3JrKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0JVRlMpOworCX0KKworCWNtZG5vZGUtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJY21kbm9kZS0+Y2FsbGJhY2tfYXJnID0gY2FsbGJhY2tfYXJnOworCisJLyogQ29weSB0aGUgaW5jb21pbmcgY29tbWFuZCB0byB0aGUgYnVmZmVyICovCisJbWVtY3B5KGNtZG5vZGUtPmNtZGJ1ZiwgaW5fY21kLCBpbl9jbWRfc2l6ZSk7CisKKwkvKiBTZXQgc2VxdWVuY2UgbnVtYmVyLCBjbGVhbiByZXN1bHQsIG1vdmUgdG8gYnVmZmVyICovCisJcHJpdi0+c2VxbnVtKys7CisJY21kbm9kZS0+Y21kYnVmLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY29tbWFuZCk7CisJY21kbm9kZS0+Y21kYnVmLT5zaXplICAgID0gY3B1X3RvX2xlMTYoaW5fY21kX3NpemUpOworCWNtZG5vZGUtPmNtZGJ1Zi0+c2VxbnVtICA9IGNwdV90b19sZTE2KHByaXYtPnNlcW51bSk7CisJY21kbm9kZS0+Y21kYnVmLT5yZXN1bHQgID0gMDsKKwljbWRub2RlLT5jbWR3YWl0cXdva2VuID0gMDsKKwlsYnRmX3F1ZXVlX2NtZChwcml2LCBjbWRub2RlKTsKKwlxdWV1ZV93b3JrKGxidGZfd3EsICZwcml2LT5jbWRfd29yayk7CisKKwlyZXR1cm4gY21kbm9kZTsKK30KKwordm9pZCBsYnRmX2NtZF9hc3luYyhzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCB1aW50MTZfdCBjb21tYW5kLAorCXN0cnVjdCBjbWRfaGVhZGVyICppbl9jbWQsIGludCBpbl9jbWRfc2l6ZSkKK3sKKwlfX2xidGZfY21kX2FzeW5jKHByaXYsIGNvbW1hbmQsIGluX2NtZCwgaW5fY21kX3NpemUsIE5VTEwsIDApOworfQorCitpbnQgX19sYnRmX2NtZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCB1aW50MTZfdCBjb21tYW5kLAorCSAgICAgIHN0cnVjdCBjbWRfaGVhZGVyICppbl9jbWQsIGludCBpbl9jbWRfc2l6ZSwKKwkgICAgICBpbnQgKCpjYWxsYmFjaykoc3RydWN0IGxidGZfcHJpdmF0ZSAqLAorCQkJICAgICAgdW5zaWduZWQgbG9uZywgc3RydWN0IGNtZF9oZWFkZXIgKiksCisJICAgICAgdW5zaWduZWQgbG9uZyBjYWxsYmFja19hcmcpCit7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWNtZG5vZGUgPSBfX2xidGZfY21kX2FzeW5jKHByaXYsIGNvbW1hbmQsIGluX2NtZCwgaW5fY21kX3NpemUsCisJCQkJICBjYWxsYmFjaywgY2FsbGJhY2tfYXJnKTsKKwlpZiAoSVNfRVJSKGNtZG5vZGUpKQorCQlyZXR1cm4gUFRSX0VSUihjbWRub2RlKTsKKworCW1pZ2h0X3NsZWVwKCk7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQkgICAgICAgY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisgICAgICAgaWYgKHJldCkJeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgImxpYmVydGFzdGY6IGNvbW1hbmQgMHglMDR4IGludGVycnVwdGVkIGJ5IHNpZ25hbCIsCisJCSAgICAgICBjb21tYW5kKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBjbWRub2RlLT5yZXN1bHQ7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxpYmVydGFzdGY6IGNvbW1hbmQgMHglMDR4IGZhaWxlZDogJWRcbiIsCisJCQkgICAgY29tbWFuZCwgcmV0KTsKKworCV9fbGJ0Zl9jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19sYnRmX2NtZCk7CisKKy8qIENhbGwgaG9sZGluZyBkcml2ZXJfbG9jayAqLwordm9pZCBsYnRmX2NtZF9yZXNwb25zZV9yeChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXByaXYtPmNtZF9yZXNwb25zZV9yeGVkID0gMTsKKwlxdWV1ZV93b3JrKGxidGZfd3EsICZwcml2LT5jbWRfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsYnRmX2NtZF9yZXNwb25zZV9yeCk7CisKK2ludCBsYnRmX3Byb2Nlc3NfcnhfY29tbWFuZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXVpbnQxNl90IHJlc3BjbWQsIGN1cmNtZDsKKwlzdHJ1Y3QgY21kX2hlYWRlciAqcmVzcDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQxNl90IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKCFwcml2LT5jdXJfY21kKSB7CisJCXJldCA9IC0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzcCA9ICh2b2lkICopcHJpdi0+Y21kX3Jlc3BfYnVmZjsKKwljdXJjbWQgPSBsZTE2X3RvX2NwdShwcml2LT5jdXJfY21kLT5jbWRidWYtPmNvbW1hbmQpOworCXJlc3BjbWQgPSBsZTE2X3RvX2NwdShyZXNwLT5jb21tYW5kKTsKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwLT5yZXN1bHQpOworCisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxpYmVydGFzdGY6IGNtZCByZXNwb25zZSAweCUwNHgsIHNlcSAlZCwgc2l6ZSAlZFxuIiwKKwkJCXJlc3BjbWQsIGxlMTZfdG9fY3B1KHJlc3AtPnNlcW51bSksCisJCQlsZTE2X3RvX2NwdShyZXNwLT5zaXplKSk7CisKKwlpZiAocmVzcC0+c2VxbnVtICE9IHByaXYtPmN1cl9jbWQtPmNtZGJ1Zi0+c2VxbnVtKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChyZXNwY21kICE9IENNRF9SRVQoY3VyY21kKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChyZXNwLT5yZXN1bHQgPT0gY3B1X3RvX2xlMTYoMHgwMDA0KSkgeworCQkvKiAweDAwMDQgbWVhbnMgLUVBR0FJTi4gRHJvcCB0aGUgcmVzcG9uc2UsIGxldCBpdCB0aW1lIG91dAorCQkgICBhbmQgYmUgcmVzdWJtaXR0ZWQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBOb3cgd2UgZ290IHJlc3BvbnNlIGZyb20gRlcsIGNhbmNlbCB0aGUgY29tbWFuZCB0aW1lciAqLworCWRlbF90aW1lcigmcHJpdi0+Y29tbWFuZF90aW1lcik7CisJcHJpdi0+Y21kX3RpbWVkX291dCA9IDA7CisJaWYgKHByaXYtPm5yX3JldHJpZXMpCisJCXByaXYtPm5yX3JldHJpZXMgPSAwOworCisJLyogSWYgdGhlIGNvbW1hbmQgaXMgbm90IHN1Y2Nlc3NmdWwsIGNsZWFudXAgYW5kIHJldHVybiBmYWlsdXJlICovCisJaWYgKChyZXN1bHQgIT0gMCB8fCAhKHJlc3BjbWQgJiAweDgwMDApKSkgeworCQkvKgorCQkgKiBIYW5kbGluZyBlcnJvcnMgaGVyZQorCQkgKi8KKwkJc3dpdGNoIChyZXNwY21kKSB7CisJCWNhc2UgQ01EX1JFVChDTURfR0VUX0hXX1NQRUMpOgorCQljYXNlIENNRF9SRVQoQ01EXzgwMl8xMV9SRVNFVCk6CisJCQlwcmludGsoS0VSTl9ERUJVRyAibGliZXJ0YXN0ZjogcmVzZXQgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCisJCX0KKwkJbGJ0Zl9jb21wbGV0ZV9jb21tYW5kKHByaXYsIHByaXYtPmN1cl9jbWQsIHJlc3VsdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKHByaXYtPmN1cl9jbWQgJiYgcHJpdi0+Y3VyX2NtZC0+Y2FsbGJhY2spIHsKKwkJcmV0ID0gcHJpdi0+Y3VyX2NtZC0+Y2FsbGJhY2socHJpdiwgcHJpdi0+Y3VyX2NtZC0+Y2FsbGJhY2tfYXJnLAorCQkJCXJlc3ApOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChwcml2LT5jdXJfY21kKSB7CisJCS8qIENsZWFuIHVwIGFuZCBQdXQgY3VycmVudCBjb21tYW5kIGJhY2sgdG8gY21kZnJlZXEgKi8KKwkJbGJ0Zl9jb21wbGV0ZV9jb21tYW5kKHByaXYsIHByaXYtPmN1cl9jbWQsIHJlc3VsdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2MwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmMKQEAgLTAsMCArMSw3NjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LCBjb3p5Yml0IEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjZGVmaW5lIERSVl9OQU1FICJsYnRmX3VzYiIKKworI2luY2x1ZGUgImxpYmVydGFzX3RmLmgiCisjaW5jbHVkZSAiaWZfdXNiLmgiCisKKyNkZWZpbmUgTUVTU0FHRV9IRUFERVJfTEVOCTQKKworc3RhdGljIGNoYXIgKmxidGZfZndfbmFtZSA9ICJsYnRmX3VzYi5iaW4iOworbW9kdWxlX3BhcmFtX25hbWVkKGZ3X25hbWUsIGxidGZfZndfbmFtZSwgY2hhcnAsIDA2NDQpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWZfdXNiX3RhYmxlW10gPSB7CisJLyogRW50ZXIgdGhlIGRldmljZSBzaWduYXR1cmUgaW5zaWRlICovCisJeyBVU0JfREVWSUNFKDB4MTI4NiwgMHgyMDAxKSB9LAorCXsgVVNCX0RFVklDRSgweDA1YTMsIDB4ODM4OCkgfSwKKwl7fQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlmX3VzYl90YWJsZSk7CisKK3N0YXRpYyB2b2lkIGlmX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCBpZl91c2JfcmVjZWl2ZV9md2xvYWQoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgaWZfdXNiX3Byb2dfZmlybXdhcmUoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCk7CitzdGF0aWMgaW50IGlmX3VzYl9ob3N0X3RvX2NhcmQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgdWludDhfdCB0eXBlLAorCQkJICAgICAgIHVpbnQ4X3QgKnBheWxvYWQsIHVpbnQxNl90IG5iKTsKK3N0YXRpYyBpbnQgdXNiX3R4X2Jsb2NrKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAsIHVpbnQ4X3QgKnBheWxvYWQsCisJCQl1aW50MTZfdCBuYiwgdTggZGF0YSk7CitzdGF0aWMgdm9pZCBpZl91c2JfZnJlZShzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwKTsKK3N0YXRpYyBpbnQgaWZfdXNiX3N1Ym1pdF9yeF91cmIoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCk7CitzdGF0aWMgaW50IGlmX3VzYl9yZXNldF9kZXZpY2Uoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCk7CisKKy8qKgorICogIGlmX3VzYl93cmlrZV9idWxrX2NhbGxiYWNrIC0gIGNhbGwgYmFjayB0byBoYW5kbGUgVVJCIHN0YXR1cworICoKKyAqICBAcGFyYW0gdXJiIAkJcG9pbnRlciB0byB1cmIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGlmX3VzYl93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibGliZXJ0YXN0ZjogVVJCIGluIGZhaWx1cmUgc3RhdHVzOiAlZFxuIiwKKwkJICAgICAgIHVyYi0+c3RhdHVzKTsKK30KKworLyoqCisgKiAgaWZfdXNiX2ZyZWUgLSBmcmVlIHR4L3J4IHVyYiwgc2tiIGFuZCByeCBidWZmZXIKKyAqCisgKiAgQHBhcmFtIGNhcmRwCXBvaW50ZXIgaWZfdXNiX2NhcmQKKyAqLworc3RhdGljIHZvaWQgaWZfdXNiX2ZyZWUoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCkKK3sKKwkvKiBVbmxpbmsgdHggJiByeCB1cmIgKi8KKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnR4X3VyYik7CisJdXNiX2tpbGxfdXJiKGNhcmRwLT5yeF91cmIpOworCXVzYl9raWxsX3VyYihjYXJkcC0+Y21kX3VyYik7CisKKwl1c2JfZnJlZV91cmIoY2FyZHAtPnR4X3VyYik7CisJY2FyZHAtPnR4X3VyYiA9IE5VTEw7CisKKwl1c2JfZnJlZV91cmIoY2FyZHAtPnJ4X3VyYik7CisJY2FyZHAtPnJ4X3VyYiA9IE5VTEw7CisKKwl1c2JfZnJlZV91cmIoY2FyZHAtPmNtZF91cmIpOworCWNhcmRwLT5jbWRfdXJiID0gTlVMTDsKKworCWtmcmVlKGNhcmRwLT5lcF9vdXRfYnVmKTsKKwljYXJkcC0+ZXBfb3V0X2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGlmX3VzYl9zZXR1cF9maXJtd2FyZShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAgPSBwcml2LT5jYXJkOworCXN0cnVjdCBjbWRfZHNfc2V0X2Jvb3QyX3ZlciBiMl9jbWQ7CisKKwlpZl91c2Jfc3VibWl0X3J4X3VyYihjYXJkcCk7CisJYjJfY21kLmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGIyX2NtZCkpOworCWIyX2NtZC5hY3Rpb24gPSAwOworCWIyX2NtZC52ZXJzaW9uID0gY2FyZHAtPmJvb3QyX3ZlcnNpb247CisKKwlpZiAobGJ0Zl9jbWRfd2l0aF9yZXNwb25zZShwcml2LCBDTURfU0VUX0JPT1QyX1ZFUiwgJmIyX2NtZCkpCisJCXByaW50ayhLRVJOX0lORk8gImxpYmVydGFzdGY6IHNldHRpbmcgYm9vdDIgdmVyc2lvbiBmYWlsZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCBpZl91c2JfZndfdGltZW8odW5zaWduZWQgbG9uZyBwcml2KQoreworCXN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAgPSAodm9pZCAqKXByaXY7CisKKwlpZiAoIWNhcmRwLT5md2RubGRvdmVyKQorCQkvKiBEb3dubG9hZCB0aW1lZCBvdXQgKi8KKwkJY2FyZHAtPnByaXYtPnN1cnByaXNlcmVtb3ZlZCA9IDE7CisJd2FrZV91cCgmY2FyZHAtPmZ3X3dxKTsKK30KKworLyoqCisgKiAgaWZfdXNiX3Byb2JlIC0gc2V0cyB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZXMKKyAqCisgKiAgQGlmbnVtCWludGVyZmFjZSBudW1iZXIKKyAqICBAaWQJCXBvaW50ZXIgdG8gdXNiX2RldmljZV9pZAorICoKKyAqICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlmX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwOworCWludCBpOworCisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwljYXJkcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZl91c2JfY2FyZCksIEdGUF9LRVJORUwpOworCWlmICghY2FyZHApCisJCWdvdG8gZXJyb3I7CisKKwlzZXR1cF90aW1lcigmY2FyZHAtPmZ3X3RpbWVvdXQsIGlmX3VzYl9md190aW1lbywgKHVuc2lnbmVkIGxvbmcpY2FyZHApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmRwLT5md193cSk7CisKKwljYXJkcC0+dWRldiA9IHVkZXY7CisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKKwkJCWNhcmRwLT5lcF9pbl9zaXplID0KKwkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJY2FyZHAtPmVwX2luID0gdXNiX2VuZHBvaW50X251bShlbmRwb2ludCk7CisJCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJY2FyZHAtPmVwX291dF9zaXplID0KKwkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJY2FyZHAtPmVwX291dCA9IHVzYl9lbmRwb2ludF9udW0oZW5kcG9pbnQpOworCQl9CisJfQorCWlmICghY2FyZHAtPmVwX291dF9zaXplIHx8ICFjYXJkcC0+ZXBfaW5fc2l6ZSkKKwkJLyogRW5kcG9pbnRzIG5vdCBmb3VuZCAqLworCQlnb3RvIGRlYWxsb2M7CisKKwljYXJkcC0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmRwLT5yeF91cmIpCisJCWdvdG8gZGVhbGxvYzsKKworCWNhcmRwLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghY2FyZHAtPnR4X3VyYikKKwkJZ290byBkZWFsbG9jOworCisJY2FyZHAtPmNtZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghY2FyZHAtPmNtZF91cmIpCisJCWdvdG8gZGVhbGxvYzsKKworCWNhcmRwLT5lcF9vdXRfYnVmID0ga21hbGxvYyhNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYXJkcC0+ZXBfb3V0X2J1ZikKKwkJZ290byBkZWFsbG9jOworCisJcHJpdiA9IGxidGZfYWRkX2NhcmQoY2FyZHAsICZ1ZGV2LT5kZXYpOworCWlmICghcHJpdikKKwkJZ290byBkZWFsbG9jOworCisJY2FyZHAtPnByaXYgPSBwcml2OworCisJcHJpdi0+aHdfaG9zdF90b19jYXJkID0gaWZfdXNiX2hvc3RfdG9fY2FyZDsKKwlwcml2LT5od19wcm9nX2Zpcm13YXJlID0gaWZfdXNiX3Byb2dfZmlybXdhcmU7CisJcHJpdi0+aHdfcmVzZXRfZGV2aWNlID0gaWZfdXNiX3Jlc2V0X2RldmljZTsKKwljYXJkcC0+Ym9vdDJfdmVyc2lvbiA9IHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlOworCisJdXNiX2dldF9kZXYodWRldik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBjYXJkcCk7CisKKwlyZXR1cm4gMDsKKworZGVhbGxvYzoKKwlpZl91c2JfZnJlZShjYXJkcCk7CitlcnJvcjoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiAgaWZfdXNiX2Rpc2Nvbm5lY3QgLSAgZnJlZSByZXNvdXJjZSBhbmQgY2xlYW51cAorICoKKyAqICBAaW50ZglVU0IgaW50ZXJmYWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBpZl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBsYnRmX3ByaXZhdGUgKikgY2FyZHAtPnByaXY7CisKKwlpZl91c2JfcmVzZXRfZGV2aWNlKGNhcmRwKTsKKworCWlmIChwcml2KQorCQlsYnRmX3JlbW92ZV9jYXJkKHByaXYpOworCisJLyogVW5saW5rIGFuZCBmcmVlIHVyYiAqLworCWlmX3VzYl9mcmVlKGNhcmRwKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7Cit9CisKKy8qKgorICogIGlmX3VzYl9zZW5kX2Z3X3BrdCAtICBUaGlzIGZ1bmN0aW9uIGRvd25sb2FkcyB0aGUgRlcKKyAqCisgKiAgQHByaXYJcG9pbnRlciB0byBzdHJ1Y3QgbGJ0Zl9wcml2YXRlCisgKgorICogIFJldHVybnM6IDAKKyAqLworc3RhdGljIGludCBpZl91c2Jfc2VuZF9md19wa3Qoc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCkKK3sKKwlzdHJ1Y3QgZndkYXRhICpmd2RhdGEgPSBjYXJkcC0+ZXBfb3V0X2J1ZjsKKwl1OCAqZmlybXdhcmUgPSAodTggKikgY2FyZHAtPmZ3LT5kYXRhOworCisJLyogSWYgd2UgZ290IGEgQ1JDIGZhaWx1cmUgb24gdGhlIGxhc3QgYmxvY2ssIGJhY2sKKwkgICB1cCBhbmQgcmV0cnkgaXQgKi8KKwlpZiAoIWNhcmRwLT5DUkNfT0spIHsKKwkJY2FyZHAtPnRvdGFsYnl0ZXMgPSBjYXJkcC0+ZndsYXN0Ymxrc2VudDsKKwkJY2FyZHAtPmZ3c2VxbnVtLS07CisJfQorCisJLyogc3RydWN0IGZ3ZGF0YSAod2hpY2ggd2Ugc2VudCB0byB0aGUgY2FyZCkgaGFzIGFuCisJICAgZXh0cmEgX19sZTMyIGZpZWxkIGluIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIGRhdGEsCisJICAgd2hpY2ggaXMgbm90IGluIHRoZSBzdHJ1Y3QgZndoZWFkZXIgaW4gdGhlIGFjdHVhbAorCSAgIGZpcm13YXJlIGJpbmFyeS4gSW5zZXJ0IHRoZSBzZXFudW0gaW4gdGhlIG1pZGRsZS4uLiAqLworCW1lbWNweSgmZndkYXRhLT5oZHIsICZmaXJtd2FyZVtjYXJkcC0+dG90YWxieXRlc10sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZndoZWFkZXIpKTsKKworCWNhcmRwLT5md2xhc3RibGtzZW50ID0gY2FyZHAtPnRvdGFsYnl0ZXM7CisJY2FyZHAtPnRvdGFsYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBmd2hlYWRlcik7CisKKwltZW1jcHkoZndkYXRhLT5kYXRhLCAmZmlybXdhcmVbY2FyZHAtPnRvdGFsYnl0ZXNdLAorCSAgICAgICBsZTMyX3RvX2NwdShmd2RhdGEtPmhkci5kYXRhbGVuZ3RoKSk7CisKKwlmd2RhdGEtPnNlcW51bSA9IGNwdV90b19sZTMyKCsrY2FyZHAtPmZ3c2VxbnVtKTsKKwljYXJkcC0+dG90YWxieXRlcyArPSBsZTMyX3RvX2NwdShmd2RhdGEtPmhkci5kYXRhbGVuZ3RoKTsKKworCXVzYl90eF9ibG9jayhjYXJkcCwgY2FyZHAtPmVwX291dF9idWYsIHNpemVvZihzdHJ1Y3QgZndkYXRhKSArCisJCSAgICAgbGUzMl90b19jcHUoZndkYXRhLT5oZHIuZGF0YWxlbmd0aCksIDApOworCisJaWYgKGZ3ZGF0YS0+aGRyLmRubGRjbWQgPT0gY3B1X3RvX2xlMzIoRldfSEFTX0xBU1RfQkxPQ0spKQorCQkvKiBIb3N0IGhhcyBmaW5pc2hlZCBGVyBkb3dubG9hZGluZworCQkgKiBEb253bG9hZGluZyBGVyBKVU1QIEJMT0NLCisJCSAqLworCQljYXJkcC0+ZndmaW5hbGJsayA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZl91c2JfcmVzZXRfZGV2aWNlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQgKmNtZCA9IGNhcmRwLT5lcF9vdXRfYnVmICsgNDsKKwlpbnQgcmV0OworCisJKihfX2xlMzIgKiljYXJkcC0+ZXBfb3V0X2J1ZiA9IGNwdV90b19sZTMyKENNRF9UWVBFX1JFUVVFU1QpOworCisJY21kLT5oZHIuY29tbWFuZCA9IGNwdV90b19sZTE2KENNRF84MDJfMTFfUkVTRVQpOworCWNtZC0+aGRyLnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQpKTsKKwljbWQtPmhkci5yZXN1bHQgPSBjcHVfdG9fbGUxNigwKTsKKwljbWQtPmhkci5zZXFudW0gPSBjcHVfdG9fbGUxNigweDVhNWEpOworCWNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoQ01EX0FDVF9IQUxUKTsKKwl1c2JfdHhfYmxvY2soY2FyZHAsIGNhcmRwLT5lcF9vdXRfYnVmLAorCQkgICAgIDQgKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQpLCAwKTsKKworCW1zbGVlcCgxMDApOworCXJldCA9IHVzYl9yZXNldF9kZXZpY2UoY2FyZHAtPnVkZXYpOworCW1zbGVlcCgxMDApOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlmX3VzYl9yZXNldF9kZXZpY2UpOworCisvKioKKyAqICB1c2JfdHhfYmxvY2sgLSB0cmFuc2ZlciBkYXRhIHRvIHRoZSBkZXZpY2UKKyAqCisgKiAgQHByaXYgCXBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZQorICogIEBwYXlsb2FkCXBvaW50ZXIgdG8gcGF5bG9hZCBkYXRhCisgKiAgQG5iCQlkYXRhIGxlbmd0aAorICogIEBkYXRhCW5vbi16ZXJvIGZvciBkYXRhLCB6ZXJvIGZvciBjb21tYW5kcworICoKKyAqICBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHVzYl90eF9ibG9jayhzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwLCB1aW50OF90ICpwYXlsb2FkLAorCQkJdWludDE2X3QgbmIsIHU4IGRhdGEpCit7CisJc3RydWN0IHVyYiAqdXJiOworCisJLyogY2hlY2sgaWYgZGV2aWNlIGlzIHJlbW92ZWQgKi8KKwlpZiAoY2FyZHAtPnByaXYtPnN1cnByaXNlcmVtb3ZlZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGRhdGEpCisJCXVyYiA9IGNhcmRwLT50eF91cmI7CisJZWxzZQorCQl1cmIgPSBjYXJkcC0+Y21kX3VyYjsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgY2FyZHAtPnVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZShjYXJkcC0+dWRldiwKKwkJCQkJICBjYXJkcC0+ZXBfb3V0KSwKKwkJCSAgcGF5bG9hZCwgbmIsIGlmX3VzYl93cml0ZV9idWxrX2NhbGxiYWNrLCBjYXJkcCk7CisKKwl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKworCWlmICh1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pZl91c2Jfc3VibWl0X3J4X3VyYihzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwLAorCQkJCSAgdm9pZCAoKmNhbGxiYWNrZm4pKHN0cnVjdCB1cmIgKnVyYikpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoTVJWRFJWX0VUSF9SWF9QQUNLRVRfQlVGRkVSX1NJWkUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLTE7CisKKwljYXJkcC0+cnhfc2tiID0gc2tiOworCisJLyogRmlsbCB0aGUgcmVjZWl2ZSBjb25maWd1cmF0aW9uIFVSQiBhbmQgaW5pdGlhbGlzZSB0aGUgUnggY2FsbCBiYWNrICovCisJdXNiX2ZpbGxfYnVsa191cmIoY2FyZHAtPnJ4X3VyYiwgY2FyZHAtPnVkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShjYXJkcC0+dWRldiwgY2FyZHAtPmVwX2luKSwKKwkJCSAgKHZvaWQgKikgKHNrYi0+dGFpbCksCisJCQkgIE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFLCBjYWxsYmFja2ZuLCBjYXJkcCk7CisKKwljYXJkcC0+cnhfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CisKKwlpZiAodXNiX3N1Ym1pdF91cmIoY2FyZHAtPnJ4X3VyYiwgR0ZQX0FUT01JQykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWNhcmRwLT5yeF9za2IgPSBOVUxMOworCQlyZXR1cm4gLTE7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmX3VzYl9zdWJtaXRfcnhfdXJiX2Z3bG9hZChzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwKQoreworCXJldHVybiBfX2lmX3VzYl9zdWJtaXRfcnhfdXJiKGNhcmRwLCAmaWZfdXNiX3JlY2VpdmVfZndsb2FkKTsKK30KKworc3RhdGljIGludCBpZl91c2Jfc3VibWl0X3J4X3VyYihzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwKQoreworCXJldHVybiBfX2lmX3VzYl9zdWJtaXRfcnhfdXJiKGNhcmRwLCAmaWZfdXNiX3JlY2VpdmUpOworfQorCitzdGF0aWMgdm9pZCBpZl91c2JfcmVjZWl2ZV9md2xvYWQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHAgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNhcmRwLT5yeF9za2I7CisJc3RydWN0IGZ3c3luY2hlYWRlciAqc3luY2Z3aGVhZGVyOworCXN0cnVjdCBib290Y21kcmVzcCBiY21kcmVzcDsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYXJkcC0+Zndkbmxkb3ZlcikgeworCQlfX2xlMzIgKnRtcCA9IChfX2xlMzIgKikoc2tiLT5kYXRhKTsKKworCQlpZiAodG1wWzBdID09IGNwdV90b19sZTMyKENNRF9UWVBFX0lORElDQVRJT04pICYmCisJCSAgICB0bXBbMV0gPT0gY3B1X3RvX2xlMzIoTUFDUkVHX0lOVF9DT0RFX0ZJUk1XQVJFX1JFQURZKSkKKwkJCS8qIEZpcm13YXJlIHJlYWR5IGV2ZW50IHJlY2VpdmVkICovCisJCQl3YWtlX3VwKCZjYXJkcC0+Zndfd3EpOworCQllbHNlCisJCQlpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQoY2FyZHApOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwIDw9IDApIHsKKwkJbWVtY3B5KCZiY21kcmVzcCwgc2tiLT5kYXRhLCBzaXplb2YoYmNtZHJlc3ApKTsKKworCQlpZiAobGUxNl90b19jcHUoY2FyZHAtPnVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA8IDB4MzEwNikgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQoY2FyZHApOworCQkJY2FyZHAtPmJvb3RjbWRyZXNwID0gMTsKKwkJCS8qIFJlY2VpdmVkIHZhbGlkIGJvb3QgY29tbWFuZCByZXNwb25zZSAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChiY21kcmVzcC5tYWdpYyAhPSBjcHVfdG9fbGUzMihCT09UX0NNRF9NQUdJQ19OVU1CRVIpKSB7CisJCQlpZiAoYmNtZHJlc3AubWFnaWMgPT0gY3B1X3RvX2xlMzIoQ01EX1RZUEVfUkVRVUVTVCkgfHwKKwkJCSAgICBiY21kcmVzcC5tYWdpYyA9PSBjcHVfdG9fbGUzMihDTURfVFlQRV9EQVRBKSB8fAorCQkJICAgIGJjbWRyZXNwLm1hZ2ljID09IGNwdV90b19sZTMyKENNRF9UWVBFX0lORElDQVRJT04pKQorCQkJCWNhcmRwLT5ib290Y21kcmVzcCA9IC0xOworCQl9IGVsc2UgaWYgKGJjbWRyZXNwLmNtZCA9PSBCT09UX0NNRF9GV19CWV9VU0IgJiYKKwkJCSAgIGJjbWRyZXNwLnJlc3VsdCA9PSBCT09UX0NNRF9SRVNQX09LKQorCQkJY2FyZHAtPmJvb3RjbWRyZXNwID0gMTsKKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKGNhcmRwKTsKKwkJcmV0dXJuOworCX0KKworCXN5bmNmd2hlYWRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmd3N5bmNoZWFkZXIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXN5bmNmd2hlYWRlcikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShzeW5jZndoZWFkZXIsIHNrYi0+ZGF0YSwgc2l6ZW9mKHN0cnVjdCBmd3N5bmNoZWFkZXIpKTsKKworCWlmICghc3luY2Z3aGVhZGVyLT5jbWQpCisJCWNhcmRwLT5DUkNfT0sgPSAxOworCWVsc2UKKwkJY2FyZHAtPkNSQ19PSyA9IDA7CisJa2ZyZWVfc2tiKHNrYik7CisKKwkvKiByZXNjaGVkdWxlIHRpbWVyIGZvciAyMDBtcyBoZW5jZSAqLworCW1vZF90aW1lcigmY2FyZHAtPmZ3X3RpbWVvdXQsIGppZmZpZXMgKyAoSFovNSkpOworCisJaWYgKGNhcmRwLT5md2ZpbmFsYmxrKSB7CisJCWNhcmRwLT5md2RubGRvdmVyID0gMTsKKwkJZ290byBleGl0OworCX0KKworCWlmX3VzYl9zZW5kX2Z3X3BrdChjYXJkcCk7CisKKyBleGl0OgorCWlmX3VzYl9zdWJtaXRfcnhfdXJiX2Z3bG9hZChjYXJkcCk7CisKKwlrZnJlZShzeW5jZndoZWFkZXIpOworCisJcmV0dXJuOworfQorCisjZGVmaW5lIE1SVkRSVl9NSU5fUEtUX0xFTgkzMAorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19jbWR0eXBlZGF0YShpbnQgcmVjdmxlbmd0aCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IGlmX3VzYl9jYXJkICpjYXJkcCwKKwkJCQkgICAgICAgc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlpZiAocmVjdmxlbmd0aCA+IE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFICsgTUVTU0FHRV9IRUFERVJfTEVOCisJICAgIHx8IHJlY3ZsZW5ndGggPCBNUlZEUlZfTUlOX1BLVF9MRU4pIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlza2JfcHV0KHNrYiwgcmVjdmxlbmd0aCk7CisJc2tiX3B1bGwoc2tiLCBNRVNTQUdFX0hFQURFUl9MRU4pOworCWxidGZfcngocHJpdiwgc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfY21kcmVxdWVzdChpbnQgcmVjdmxlbmd0aCwgdWludDhfdCAqcmVjdmJ1ZmYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwLAorCQkJCSAgICAgIHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpCit7CisJaWYgKHJlY3ZsZW5ndGggPiBMQlNfQ01EX0JVRkZFUl9TSVpFKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2soJnByaXYtPmRyaXZlcl9sb2NrKTsKKwltZW1jcHkocHJpdi0+Y21kX3Jlc3BfYnVmZiwgcmVjdmJ1ZmYgKyBNRVNTQUdFX0hFQURFUl9MRU4sCisJICAgICAgIHJlY3ZsZW5ndGggLSBNRVNTQUdFX0hFQURFUl9MRU4pOworCWtmcmVlX3NrYihza2IpOworCWxidGZfY21kX3Jlc3BvbnNlX3J4KHByaXYpOworCXNwaW5fdW5sb2NrKCZwcml2LT5kcml2ZXJfbG9jayk7Cit9CisKKy8qKgorICogIGlmX3VzYl9yZWNlaXZlIC0gcmVhZCBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4KKyAqCisgKiAgQHVyYgkJcG9pbnRlciB0byBzdHJ1Y3QgdXJiCisgKi8KK3N0YXRpYyB2b2lkIGlmX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBza19idWZmICpza2IgPSBjYXJkcC0+cnhfc2tiOworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSBjYXJkcC0+cHJpdjsKKwlpbnQgcmVjdmxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwl1aW50OF90ICpyZWN2YnVmZiA9IE5VTEw7CisJdWludDMyX3QgcmVjdnR5cGUgPSAwOworCV9fbGUzMiAqcGt0ID0gKF9fbGUzMiAqKSBza2ItPmRhdGE7CisKKwlpZiAocmVjdmxlbmd0aCkgeworCQlpZiAodXJiLT5zdGF0dXMpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJZ290byBzZXR1cF9mb3JfbmV4dDsKKwkJfQorCisJCXJlY3ZidWZmID0gc2tiLT5kYXRhOworCQlyZWN2dHlwZSA9IGxlMzJfdG9fY3B1KHBrdFswXSk7CisJfSBlbHNlIGlmICh1cmItPnN0YXR1cykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAocmVjdnR5cGUpIHsKKwljYXNlIENNRF9UWVBFX0RBVEE6CisJCXByb2Nlc3NfY21kdHlwZWRhdGEocmVjdmxlbmd0aCwgc2tiLCBjYXJkcCwgcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBDTURfVFlQRV9SRVFVRVNUOgorCQlwcm9jZXNzX2NtZHJlcXVlc3QocmVjdmxlbmd0aCwgcmVjdmJ1ZmYsIHNrYiwgY2FyZHAsIHByaXYpOworCQlicmVhazsKKworCWNhc2UgQ01EX1RZUEVfSU5ESUNBVElPTjoKKwl7CisJCS8qIEV2ZW50IGNhdXNlIGhhbmRsaW5nICovCisJCXUzMiBldmVudF9jYXVzZSA9IGxlMzJfdG9fY3B1KHBrdFsxXSk7CisKKwkJLyogSWNreSB1bmRvY3VtZW50ZWQgbWFnaWMgc3BlY2lhbCBjYXNlICovCisJCWlmIChldmVudF9jYXVzZSAmIDB4ZmZmZjAwMDApIHsKKwkJCXUxNiB0bXA7CisJCQl1OCByZXRyeWNudDsKKwkJCXU4IGZhaWx1cmU7CisKKwkJCXRtcCA9IGV2ZW50X2NhdXNlID4+IDE2OworCQkJcmV0cnljbnQgPSB0bXAgJiAweDAwZmY7CisJCQlmYWlsdXJlID0gKHRtcCAmIDB4ZmYwMCkgPj4gODsKKwkJCWxidGZfc2VuZF90eF9mZWVkYmFjayhwcml2LCByZXRyeWNudCwgZmFpbHVyZSk7CisJCX0gZWxzZSBpZiAoZXZlbnRfY2F1c2UgPT0gTEJURl9FVkVOVF9CQ05fU0VOVCkKKwkJCWxidGZfYmNuX3NlbnQocHJpdik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIlVuc3VwcG9ydGVkIG5vdGlmaWNhdGlvbiAlZCByZWNlaXZlZFxuIiwKKwkJCSAgICAgICBldmVudF9jYXVzZSk7CisJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxpYmVydGFzdGY6IHVua25vd24gY29tbWFuZCB0eXBlIDB4JVhcbiIsCisJCQkgICAgIHJlY3Z0eXBlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWJyZWFrOworCX0KKworc2V0dXBfZm9yX25leHQ6CisJaWZfdXNiX3N1Ym1pdF9yeF91cmIoY2FyZHApOworfQorCisvKioKKyAqICBpZl91c2JfaG9zdF90b19jYXJkIC0gIERvd25sb2FkIGRhdGEgdG8gdGhlIGRldmljZQorICoKKyAqICBAcHJpdgkJcG9pbnRlciB0byBzdHJ1Y3QgbGJ0Zl9wcml2YXRlIHN0cnVjdHVyZQorICogIEB0eXBlCQl0eXBlIG9mIGRhdGEKKyAqICBAYnVmCQlwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiAgQGxlbgkJbnVtYmVyIG9mIGJ5dGVzCisgKgorICogIFJldHVybnM6IDAgb24gc3VjY2Vzcywgbm9uemVybyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpZl91c2JfaG9zdF90b19jYXJkKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHVpbnQ4X3QgdHlwZSwKKwkJCSAgICAgICB1aW50OF90ICpwYXlsb2FkLCB1aW50MTZfdCBuYikKK3sKKwlzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwID0gcHJpdi0+Y2FyZDsKKwl1OCBkYXRhID0gMDsKKworCWlmICh0eXBlID09IE1WTVNfQ01EKSB7CisJCSooX19sZTMyICopY2FyZHAtPmVwX291dF9idWYgPSBjcHVfdG9fbGUzMihDTURfVFlQRV9SRVFVRVNUKTsKKwl9IGVsc2UgeworCQkqKF9fbGUzMiAqKWNhcmRwLT5lcF9vdXRfYnVmID0gY3B1X3RvX2xlMzIoQ01EX1RZUEVfREFUQSk7CisJCWRhdGEgPSAxOworCX0KKworCW1lbWNweSgoY2FyZHAtPmVwX291dF9idWYgKyBNRVNTQUdFX0hFQURFUl9MRU4pLCBwYXlsb2FkLCBuYik7CisKKwlyZXR1cm4gdXNiX3R4X2Jsb2NrKGNhcmRwLCBjYXJkcC0+ZXBfb3V0X2J1ZiwgbmIgKyBNRVNTQUdFX0hFQURFUl9MRU4sCisJCQkgICAgZGF0YSk7Cit9CisKKy8qKgorICogIGlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQgLSBJc3N1ZSBib290IGNvbW1hbmQgdG8gQm9vdDIuCisgKgorICogIEBpdmFsdWUgICAxIGJvb3RzIGZyb20gRlcgYnkgVVNCLURvd25sb2FkLCAyIGJvb3RzIGZyb20gRlcgaW4gRUVQUk9NLgorICoKKyAqICBSZXR1cm5zOiAwCisgKi8KK3N0YXRpYyBpbnQgaWZfdXNiX2lzc3VlX2Jvb3RfY29tbWFuZChzdHJ1Y3QgaWZfdXNiX2NhcmQgKmNhcmRwLCBpbnQgaXZhbHVlKQoreworCXN0cnVjdCBib290Y21kICpib290Y21kID0gY2FyZHAtPmVwX291dF9idWY7CisKKwkvKiBQcmVwYXJlIGNvbW1hbmQgKi8KKwlib290Y21kLT5tYWdpYyA9IGNwdV90b19sZTMyKEJPT1RfQ01EX01BR0lDX05VTUJFUik7CisJYm9vdGNtZC0+Y21kID0gaXZhbHVlOworCW1lbXNldChib290Y21kLT5wYWQsIDAsIHNpemVvZihib290Y21kLT5wYWQpKTsKKworCS8qIElzc3VlIGNvbW1hbmQgKi8KKwl1c2JfdHhfYmxvY2soY2FyZHAsIGNhcmRwLT5lcF9vdXRfYnVmLCBzaXplb2YoKmJvb3RjbWQpLCAwKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogIGNoZWNrX2Z3ZmlsZV9mb3JtYXQgLSBDaGVjayB0aGUgdmFsaWRpdHkgb2YgQm9vdDIvRlcgaW1hZ2UuCisgKgorICogIEBkYXRhCXBvaW50ZXIgdG8gaW1hZ2UKKyAqICBAdG90bGVuCWltYWdlIGxlbmd0aAorICoKKyAqICBSZXR1cm5zOiAwIGlmIHRoZSBpbWFnZSBpcyB2YWxpZCwgbm9uemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZndmaWxlX2Zvcm1hdChjb25zdCB1OCAqZGF0YSwgdTMyIHRvdGxlbikKK3sKKwl1MzIgYmluY21kLCBleGl0OworCXUzMiBibGtzaXplLCBvZmZzZXQsIGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gMTsKKwlleGl0ID0gbGVuID0gMDsKKworCWRvIHsKKwkJc3RydWN0IGZ3aGVhZGVyICpmd2ggPSAodm9pZCAqKSBkYXRhOworCisJCWJpbmNtZCA9IGxlMzJfdG9fY3B1KGZ3aC0+ZG5sZGNtZCk7CisJCWJsa3NpemUgPSBsZTMyX3RvX2NwdShmd2gtPmRhdGFsZW5ndGgpOworCQlzd2l0Y2ggKGJpbmNtZCkgeworCQljYXNlIEZXX0hBU19EQVRBX1RPX1JFQ1Y6CisJCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGZ3aGVhZGVyKSArIGJsa3NpemU7CisJCQlkYXRhICs9IG9mZnNldDsKKwkJCWxlbiArPSBvZmZzZXQ7CisJCQlpZiAobGVuID49IHRvdGxlbikKKwkJCQlleGl0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEZXX0hBU19MQVNUX0JMT0NLOgorCQkJZXhpdCA9IDE7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlleGl0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoIWV4aXQpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgImxpYmVydGFzdGY6IGZpcm13YXJlIGZpbGUgZm9ybWF0IGNoZWNrIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGlmX3VzYl9wcm9nX2Zpcm13YXJlKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApCit7CisJaW50IGkgPSAwOworCXN0YXRpYyBpbnQgcmVzZXRfY291bnQgPSAxMDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmNhcmRwLT5mdywgbGJ0Zl9md19uYW1lLCAmY2FyZHAtPnVkZXYtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibGliZXJ0YXN0ZjogZmlybXdhcmUgJXMgbm90IGZvdW5kXG4iLAorCQkgICAgICAgbGJ0Zl9md19uYW1lKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjaGVja19md2ZpbGVfZm9ybWF0KGNhcmRwLT5mdy0+ZGF0YSwgY2FyZHAtPmZ3LT5zaXplKSkKKwkJZ290byByZWxlYXNlX2Z3OworCityZXN0YXJ0OgorCWlmIChpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQoY2FyZHApIDwgMCkgeworCQlyZXQgPSAtMTsKKwkJZ290byByZWxlYXNlX2Z3OworCX0KKworCWNhcmRwLT5ib290Y21kcmVzcCA9IDA7CisJZG8geworCQlpbnQgaiA9IDA7CisJCWkrKzsKKwkJLyogSXNzdWUgQm9vdCBjb21tYW5kID0gMSwgQm9vdCBmcm9tIERvd25sb2FkLUZXICovCisJCWlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQoY2FyZHAsIEJPT1RfQ01EX0ZXX0JZX1VTQik7CisJCS8qIHdhaXQgZm9yIGNvbW1hbmQgcmVzcG9uc2UgKi8KKwkJZG8geworCQkJaisrOworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwkJfSB3aGlsZSAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDAgJiYgaiA8IDEwKTsKKwl9IHdoaWxlIChjYXJkcC0+Ym9vdGNtZHJlc3AgPT0gMCAmJiBpIDwgNSk7CisKKwlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwIDw9IDApIHsKKwkJaWYgKC0tcmVzZXRfY291bnQgPj0gMCkgeworCQkJaWZfdXNiX3Jlc2V0X2RldmljZShjYXJkcCk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCWkgPSAwOworCisJY2FyZHAtPnRvdGFsYnl0ZXMgPSAwOworCWNhcmRwLT5md2xhc3RibGtzZW50ID0gMDsKKwljYXJkcC0+Q1JDX09LID0gMTsKKwljYXJkcC0+Zndkbmxkb3ZlciA9IDA7CisJY2FyZHAtPmZ3c2VxbnVtID0gLTE7CisJY2FyZHAtPnRvdGFsYnl0ZXMgPSAwOworCWNhcmRwLT5md2ZpbmFsYmxrID0gMDsKKworCS8qIFNlbmQgdGhlIGZpcnN0IGZpcm13YXJlIHBhY2tldC4uLiAqLworCWlmX3VzYl9zZW5kX2Z3X3BrdChjYXJkcCk7CisKKwkvKiAuLi4gYW5kIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGNvbXBsZXRlICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhcmRwLT5md193cSwgY2FyZHAtPnByaXYtPnN1cnByaXNlcmVtb3ZlZCB8fAorCQkJCQkgICAgICAgY2FyZHAtPmZ3ZG5sZG92ZXIpOworCisJZGVsX3RpbWVyX3N5bmMoJmNhcmRwLT5md190aW1lb3V0KTsKKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnJ4X3VyYik7CisKKwlpZiAoIWNhcmRwLT5md2RubGRvdmVyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImxpYmVydGFzdGY6IGZhaWxlZCB0byBsb2FkIGZ3LCIKKwkJCQkgIiByZXNldHRpbmcgZGV2aWNlIVxuIik7CisJCWlmICgtLXJlc2V0X2NvdW50ID49IDApIHsKKwkJCWlmX3VzYl9yZXNldF9kZXZpY2UoY2FyZHApOworCQkJZ290byByZXN0YXJ0OworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAibGliZXJ0YXN0ZjogZncgZG93bmxvYWQgZmFpbHVyZVxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIHJlbGVhc2VfZnc7CisJfQorCisJY2FyZHAtPnByaXYtPmZ3X3JlYWR5ID0gMTsKKworIHJlbGVhc2VfZnc6CisJcmVsZWFzZV9maXJtd2FyZShjYXJkcC0+ZncpOworCWNhcmRwLT5mdyA9IE5VTEw7CisKKwlpZl91c2Jfc2V0dXBfZmlybXdhcmUoY2FyZHAtPnByaXYpOworCisgZG9uZToKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWZfdXNiX3Byb2dfZmlybXdhcmUpOworCisKKyNkZWZpbmUgaWZfdXNiX3N1c3BlbmQgTlVMTAorI2RlZmluZSBpZl91c2JfcmVzdW1lIE5VTEwKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGlmX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkucHJvYmUgPSBpZl91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBpZl91c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBpZl91c2JfdGFibGUsCisJLnN1c3BlbmQgPSBpZl91c2Jfc3VzcGVuZCwKKwkucmVzdW1lID0gaWZfdXNiX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlmX3VzYl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gdXNiX3JlZ2lzdGVyKCZpZl91c2JfZHJpdmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWZfdXNiX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmlmX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpZl91c2JfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoaWZfdXNiX2V4aXRfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCI4Mzg4IFVTQiBXTEFOIFRoaW5maXJtIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQ296eWJpdCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2lmX3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTViM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgsIGNvenliaXQgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA2LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKK3N0cnVjdCBsYnRmX3ByaXZhdGU7CisKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9uIGZvciBVU0IgaW50ZXJmYWNlLgorICAqLworI2RlZmluZSBDTURfVFlQRV9SRVFVRVNUCQkweEYwMERGQUNFCisjZGVmaW5lIENNRF9UWVBFX0RBVEEJCQkweEJFQURDMERFCisjZGVmaW5lIENNRF9UWVBFX0lORElDQVRJT04JCTB4QkVFRkZBQ0UKKworI2RlZmluZSBCT09UX0NNRF9GV19CWV9VU0IJCTB4MDEKKyNkZWZpbmUgQk9PVF9DTURfRldfSU5fRUVQUk9NCQkweDAyCisjZGVmaW5lIEJPT1RfQ01EX1VQREFURV9CT09UMgkJMHgwMworI2RlZmluZSBCT09UX0NNRF9VUERBVEVfRlcJCTB4MDQKKyNkZWZpbmUgQk9PVF9DTURfTUFHSUNfTlVNQkVSCQkweDRDNTY1MjREICAgLyogTFZSTSAqLworCitzdHJ1Y3QgYm9vdGNtZCB7CisJX19sZTMyCW1hZ2ljOworCXVpbnQ4X3QJY21kOworCXVpbnQ4X3QJcGFkWzExXTsKK307CisKKyNkZWZpbmUgQk9PVF9DTURfUkVTUF9PSwkJMHgwMDAxCisjZGVmaW5lIEJPT1RfQ01EX1JFU1BfRkFJTAkJMHgwMDAwCisKK3N0cnVjdCBib290Y21kcmVzcCB7CisJX19sZTMyCW1hZ2ljOworCXVpbnQ4X3QJY21kOworCXVpbnQ4X3QJcmVzdWx0OworCXVpbnQ4X3QJcGFkWzJdOworfTsKKworLyoqIFVTQiBjYXJkIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSovCitzdHJ1Y3QgaWZfdXNiX2NhcmQgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1cmIgKnJ4X3VyYiwgKnR4X3VyYiwgKmNtZF91cmI7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdjsKKworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisKKwl1aW50OF90IGVwX2luOworCXVpbnQ4X3QgZXBfb3V0OworCisJaW50OF90IGJvb3RjbWRyZXNwOworCisJaW50IGVwX2luX3NpemU7CisKKwl2b2lkICplcF9vdXRfYnVmOworCWludCBlcF9vdXRfc2l6ZTsKKworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IHRpbWVyX2xpc3QgZndfdGltZW91dDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBmd193cTsKKwl1aW50MzJfdCBmd3NlcW51bTsKKwl1aW50MzJfdCB0b3RhbGJ5dGVzOworCXVpbnQzMl90IGZ3bGFzdGJsa3NlbnQ7CisJdWludDhfdCBDUkNfT0s7CisJdWludDhfdCBmd2RubGRvdmVyOworCXVpbnQ4X3QgZndmaW5hbGJsazsKKworCV9fbGUxNiBib290Ml92ZXJzaW9uOworfTsKKworLyoqIGZ3aGVhZGVyICovCitzdHJ1Y3QgZndoZWFkZXIgeworCV9fbGUzMiBkbmxkY21kOworCV9fbGUzMiBiYXNlYWRkcjsKKwlfX2xlMzIgZGF0YWxlbmd0aDsKKwlfX2xlMzIgQ1JDOworfTsKKworI2RlZmluZSBGV19NQVhfREFUQV9CTEtfU0laRQk2MDAKKy8qKiBGV0RhdGEgKi8KK3N0cnVjdCBmd2RhdGEgeworCXN0cnVjdCBmd2hlYWRlciBoZHI7CisJX19sZTMyIHNlcW51bTsKKwl1aW50OF90IGRhdGFbMF07Cit9OworCisvKiogZndzeW5jaGVhZGVyICovCitzdHJ1Y3QgZndzeW5jaGVhZGVyIHsKKwlfX2xlMzIgY21kOworCV9fbGUzMiBzZXFudW07Cit9OworCisjZGVmaW5lIEZXX0hBU19EQVRBX1RPX1JFQ1YJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRldfSEFTX0xBU1RfQkxPQ0sJCTB4MDAwMDAwMDQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2xpYmVydGFzX3RmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9saWJlcnRhc190Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTVjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9saWJlcnRhc190Zi5oCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOCwgY296eWJpdCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LCBSZWQgSGF0LCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2lmbmRlZiBEUlZfTkFNRQorI2RlZmluZSBEUlZfTkFNRSAibGliZXJ0YXNfdGYiCisjZW5kaWYKKworI2RlZmluZQlNUlZMX0RFRkFVTFRfUkVUUklFUwkJCTkKKyNkZWZpbmUgTVJWTF9QRVJfUEFDS0VUX1JBVEUJCQkweDEwCisjZGVmaW5lIE1SVkxfTUFYX0JDTl9TSVpFCQkJNDQwCisjZGVmaW5lIENNRF9PUFRJT05fV0FJVEZPUlJTUAkJCTB4MDAwMgorCisvKiBSZXR1cm4gY29tbWFuZCBhcmUgYWxtb3N0IGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgaG9zdCBjb21tYW5kLCBidXQgd2l0aAorICogYml0IDE1IHNldCBoaWdoLiAgVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMsIHRob3VnaC4uLgorICovCisjZGVmaW5lIENNRF9SRVQoY21kKQkJCSgweDgwMDAgfCBjbWQpCisKKy8qIENvbW1hbmQgY29kZXMgKi8KKyNkZWZpbmUgQ01EX0dFVF9IV19TUEVDCQkJCTB4MDAwMworI2RlZmluZSBDTURfODAyXzExX1JFU0VUCQkJMHgwMDA1CisjZGVmaW5lIENNRF9NQUNfTVVMVElDQVNUX0FEUgkJCTB4MDAxMAorI2RlZmluZSBDTURfODAyXzExX1JBRElPX0NPTlRST0wJCTB4MDAxYworI2RlZmluZSBDTURfODAyXzExX1JGX0NIQU5ORUwJCQkweDAwMWQKKyNkZWZpbmUgQ01EXzgwMl8xMV9SRl9UWF9QT1dFUgkJCTB4MDAxZQorI2RlZmluZSBDTURfTUFDX0NPTlRST0wJCQkJMHgwMDI4CisjZGVmaW5lIENNRF84MDJfMTFfTUFDX0FERFJFU1MJCQkweDAwNGQKKyNkZWZpbmUJQ01EX1NFVF9CT09UMl9WRVIJCQkweDAwYTUKKyNkZWZpbmUgQ01EXzgwMl8xMV9CRUFDT05fQ1RSTAkJCTB4MDBiMAorI2RlZmluZSBDTURfODAyXzExX0JFQUNPTl9TRVQJCQkweDAwY2IKKyNkZWZpbmUgQ01EXzgwMl8xMV9TRVRfTU9ERQkJCTB4MDBjYworI2RlZmluZSBDTURfODAyXzExX1NFVF9CU1NJRAkJCTB4MDBjZAorCisjZGVmaW5lIENNRF9BQ1RfR0VUCQkJMHgwMDAwCisjZGVmaW5lIENNRF9BQ1RfU0VUCQkJMHgwMDAxCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JFU0VUICovCisjZGVmaW5lIENNRF9BQ1RfSEFMVAkJCTB4MDAwMworCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgQ01EX01BQ19DT05UUk9MICovCisjZGVmaW5lIENNRF9BQ1RfTUFDX1JYX09OCQkJMHgwMDAxCisjZGVmaW5lIENNRF9BQ1RfTUFDX1RYX09OCQkJMHgwMDAyCisjZGVmaW5lIENNRF9BQ1RfTUFDX01VTFRJQ0FTVF9FTkFCTEUJCTB4MDAyMAorI2RlZmluZSBDTURfQUNUX01BQ19CUk9BRENBU1RfRU5BQkxFCQkweDAwNDAKKyNkZWZpbmUgQ01EX0FDVF9NQUNfUFJPTUlTQ1VPVVNfRU5BQkxFCQkweDAwODAKKyNkZWZpbmUgQ01EX0FDVF9NQUNfQUxMX01VTFRJQ0FTVF9FTkFCTEUJMHgwMTAwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JBRElPX0NPTlRST0wgKi8KKyNkZWZpbmUgQ01EX1RZUEVfQVVUT19QUkVBTUJMRQkJMHgwMDAxCisjZGVmaW5lIENNRF9UWVBFX1NIT1JUX1BSRUFNQkxFCQkweDAwMDIKKyNkZWZpbmUgQ01EX1RZUEVfTE9OR19QUkVBTUJMRQkJMHgwMDAzCisKKyNkZWZpbmUgVFVSTl9PTl9SRgkJCTB4MDEKKyNkZWZpbmUgUkFESU9fT04JCQkweDAxCisjZGVmaW5lIFJBRElPX09GRgkJCTB4MDAKKworI2RlZmluZSBTRVRfQVVUT19QUkVBTUJMRQkJMHgwNQorI2RlZmluZSBTRVRfU0hPUlRfUFJFQU1CTEUJCTB4MDMKKyNkZWZpbmUgU0VUX0xPTkdfUFJFQU1CTEUJCTB4MDEKKworLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIENNRF84MDJfMTFfUkZfQ0hBTk5FTCAqLworI2RlZmluZSBDTURfT1BUXzgwMl8xMV9SRl9DSEFOTkVMX0dFVAkweDAwCisjZGVmaW5lIENNRF9PUFRfODAyXzExX1JGX0NIQU5ORUxfU0VUCTB4MDEKKworLyogQ29kZXMgZm9yIENNRF84MDJfMTFfU0VUX01PREUgKi8KK2VudW0gbGJ0Zl9tb2RlIHsKKwlMQlRGX1BBU1NJVkVfTU9ERSwKKwlMQlRGX1NUQV9NT0RFLAorCUxCVEZfQVBfTU9ERSwKK307CisKKy8qKiBDYXJkIEV2ZW50IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTUFDUkVHX0lOVF9DT0RFX0ZJUk1XQVJFX1JFQURZCQk0OAorLyoqIEJ1ZmZlciBDb25zdGFudHMgKi8KKworLyoJVGhlIHNpemUgb2YgU1EgbWVtb3J5IFBQQSwgRFBBIGFyZSA4IERXT1JEcywgdGhhdCBrZWVwIHRoZSBwaHlzaWNhbAorKglhZGRyZXNzZXMgb2YgVHhQRCBidWZmZXJzLiBTdGF0aW9uIGhhcyBvbmx5IDggVHhQRCBhdmFpbGFibGUsIFdoZXJlYXMKKyoJZHJpdmVyIGhhcyBtb3JlIGxvY2FsIFR4UERzLiBFYWNoIFR4UEQgb24gdGhlIGhvc3QgbWVtb3J5IGlzIGFzc29jaWF0ZWQKKyoJd2l0aCBhIFR4IGNvbnRyb2wgbm9kZS4gVGhlIGRyaXZlciBtYWludGFpbnMgOCBSeFBEIGRlc2NyaXB0b3JzIGZvcgorKglzdGF0aW9uIGZpcm13YXJlIHRvIHN0b3JlIFJ4IHBhY2tldCBpbmZvcm1hdGlvbi4KKyoKKyoJQ3VycmVudCB2ZXJzaW9uIG9mIE1BQyBoYXMgYSAzMng2IG11bHRpY2FzdCBhZGRyZXNzIGJ1ZmZlci4KKyoKKyoJODAyLjExYiBjYW4gaGF2ZSB1cCB0byAgMTQgY2hhbm5lbHMsIHRoZSBkcml2ZXIga2VlcHMgdGhlCisqCUJTU0lEKE1BQyBhZGRyZXNzKSBvZiBlYWNoIEFQcyBvciBBZCBob2Mgc3RhdGlvbnMgaXQgaGFzIHNlbnNlZC4KKyovCisKKyNkZWZpbmUgTVJWRFJWX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFCTMyCisjZGVmaW5lIExCU19OVU1fQ01EX0JVRkZFUlMgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTEJTX0NNRF9CVUZGRVJfU0laRSAgICAgICAgICAgICAoMiAqIDEwMjQpCisjZGVmaW5lIE1SVkRSVl9NQVhfQ0hBTk5FTF9TSVpFCQkxNAorI2RlZmluZSBNUlZEUlZfU05BUF9IRUFERVJfTEVOICAgICAgICAgIDgKKworI2RlZmluZQlMQlNfVVBMRF9TSVpFCQkJMjMxMgorI2RlZmluZSBERVZfTkFNRV9MRU4JCQkzMgorCisvKiogTWlzYyBjb25zdGFudHMgKi8KKy8qIFRoaXMgc2VjdGlvbiBkZWZpbmVzIDgwMi4xMSBzcGVjaWZpYyBjb250YW50cyAqLworCisjZGVmaW5lIE1SVkRSVl9NQVhfUkVHSU9OX0NPREUJCQk2CisvKioKKyAqIHRoZSB0YWJsZSB0byBrZWVwIHJlZ2lvbiBjb2RlCisgKi8KKyNkZWZpbmUgTEJURl9SRUdET01BSU5fVVMJMHgxMAorI2RlZmluZSBMQlRGX1JFR0RPTUFJTl9DQQkweDIwCisjZGVmaW5lIExCVEZfUkVHRE9NQUlOX0VVCTB4MzAKKyNkZWZpbmUgTEJURl9SRUdET01BSU5fU1AJMHgzMQorI2RlZmluZSBMQlRGX1JFR0RPTUFJTl9GUgkweDMyCisjZGVmaW5lIExCVEZfUkVHRE9NQUlOX0pQCTB4NDAKKworI2RlZmluZSBTQklfRVZFTlRfQ0FVU0VfU0hJRlQJCTMKKworLyoqIFJ4UEQgc3RhdHVzICovCisKKyNkZWZpbmUgTVJWRFJWX1JYUERfU1RBVFVTX09LICAgICAgICAgICAgICAgIDB4MDAwMQorCisKKy8qIFRoaXMgaXMgZm9yIGZpcm13YXJlIHNwZWNpZmljIGxlbmd0aCAqLworI2RlZmluZSBFWFRSQV9MRU4JMzYKKworI2RlZmluZSBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSBcCisJKEVUSF9GUkFNRV9MRU4gKyBzaXplb2Yoc3RydWN0IHR4cGQpICsgRVhUUkFfTEVOKQorCisjZGVmaW5lIE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFIFwKKwkoRVRIX0ZSQU1FX0xFTiArIHNpemVvZihzdHJ1Y3QgcnhwZCkgXAorCSArIE1SVkRSVl9TTkFQX0hFQURFUl9MRU4gKyBFWFRSQV9MRU4pCisKKyNkZWZpbmUJQ01EX0ZfSE9TVENNRAkJKDEgPDwgMCkKKyNkZWZpbmUgRldfQ0FQSU5GT19XUEEgIAkoMSA8PCAwKQorCisjZGVmaW5lIFJGX0FOVEVOTkFfMQkJMHgxCisjZGVmaW5lIFJGX0FOVEVOTkFfMgkJMHgyCisjZGVmaW5lIFJGX0FOVEVOTkFfQVVUTwkJMHhGRkZGCisKKyNkZWZpbmUgTEJURl9FVkVOVF9CQ05fU0VOVAk1NQorCisvKiogR2xvYmFsIFZhcmlhYmxlIERlY2xhcmF0aW9uICovCisvKiogbXZfbXNfdHlwZSAqLworZW51bSBtdl9tc190eXBlIHsKKwlNVk1TX0RBVCA9IDAsCisJTVZNU19DTUQgPSAxLAorCU1WTVNfVFhET05FID0gMiwKKwlNVk1TX0VWRU5UCit9OworCitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmxidGZfd3E7CisKK3N0cnVjdCBsYnRmX3ByaXZhdGU7CisKK3N0cnVjdCBsYnRmX29mZnNldF92YWx1ZSB7CisJdTMyIG9mZnNldDsKKwl1MzIgdmFsdWU7Cit9OworCitzdHJ1Y3QgY2hhbm5lbF9yYW5nZSB7CisJdTggcmVnZG9tYWluOworCXU4IHN0YXJ0OworCXU4IGVuZDsgLyogZXhjbHVzaXZlIChjaGFubmVsIG11c3QgYmUgbGVzcyB0aGFuIGVuZCkgKi8KK307CisKK3N0cnVjdCBpZl91c2JfY2FyZDsKKworLyoqIFByaXZhdGUgc3RydWN0dXJlIGZvciB0aGUgTVYgZGV2aWNlICovCitzdHJ1Y3QgbGJ0Zl9wcml2YXRlIHsKKwl2b2lkICpjYXJkOworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCisJLyogQ29tbWFuZCByZXNwb25zZSBidWZmZXIgKi8KKwl1OCBjbWRfcmVzcF9idWZmW0xCU19VUExEX1NJWkVdOworCS8qIERvd25sb2FkIHNlbnQ6CisJICAgYml0MCAxLzA9ZGF0YV9zZW50L2RhdGFfdHhfZG9uZSwKKwkgICBiaXQxIDEvMD1jbWRfc2VudC9jbWRfdHhfZG9uZSwKKwkgICBhbGwgb3RoZXIgYml0cyByZXNlcnZlZCAwICovCisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBjbWRfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKKwkvKiogSGFyZHdhcmUgYWNjZXNzICovCisJaW50ICgqaHdfaG9zdF90b19jYXJkKSAoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggKnBheWxvYWQsIHUxNiBuYik7CisJaW50ICgqaHdfcHJvZ19maXJtd2FyZSkgKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApOworCWludCAoKmh3X3Jlc2V0X2RldmljZSkgKHN0cnVjdCBpZl91c2JfY2FyZCAqY2FyZHApOworCisKKwkvKiogV2xhbiBhZGFwdGVyIGRhdGEgc3RydWN0dXJlKi8KKwkvKiogU1RBVFVTIHZhcmlhYmxlcyAqLworCXUzMiBmd3JlbGVhc2U7CisJdTMyIGZ3Y2FwaW5mbzsKKwkvKiBwcm90ZWN0ZWQgd2l0aCBiaWcgbG9jayAqLworCisJc3RydWN0IG11dGV4IGxvY2s7CisKKwkvKiogY29tbWFuZC1yZWxhdGVkIHZhcmlhYmxlcyAqLworCXUxNiBzZXFudW07CisJLyogcHJvdGVjdGVkIGJ5IGJpZyBsb2NrICovCisKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kX2FycmF5OworCS8qKiBDdXJyZW50IGNvbW1hbmQgKi8KKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY3VyX2NtZDsKKwkvKiogY29tbWFuZCBRdWV1ZXMgKi8KKwkvKiogRnJlZSBjb21tYW5kIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNtZGZyZWVxOworCS8qKiBQZW5kaW5nIGNvbW1hbmQgYnVmZmVycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY21kcGVuZGluZ3E7CisKKwkvKiogc3BpbiBsb2NrcyAqLworCXNwaW5sb2NrX3QgZHJpdmVyX2xvY2s7CisKKwkvKiogVGltZXJzICovCisJc3RydWN0IHRpbWVyX2xpc3QgY29tbWFuZF90aW1lcjsKKwlpbnQgbnJfcmV0cmllczsKKwlpbnQgY21kX3RpbWVkX291dDsKKworCXU4IGNtZF9yZXNwb25zZV9yeGVkOworCisJLyoqIGNhcGFiaWxpdHkgSW5mbyB1c2VkIGluIEFzc29jaWF0aW9uLCBzdGFydCwgam9pbiAqLworCXUxNiBjYXBhYmlsaXR5OworCisJLyoqIE1BQyBhZGRyZXNzIGluZm9ybWF0aW9uICovCisJdTggY3VycmVudF9hZGRyW0VUSF9BTEVOXTsKKwl1OCBtdWx0aWNhc3RsaXN0W01SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRV1bRVRIX0FMRU5dOworCXUzMiBucl9vZl9tdWx0aWNhc3RtYWNhZGRyOworCWludCBjdXJfZnJlcTsKKworCXN0cnVjdCBza19idWZmICpza2JfdG9fdHg7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKworCS8qKiBOSUMgT3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljcyAqLworCXUxNiBtYWNfY29udHJvbDsKKwl1MTYgcmVnaW9uY29kZTsKKwlzdHJ1Y3QgY2hhbm5lbF9yYW5nZSByYW5nZTsKKworCXU4IHJhZGlvb247CisJdTMyIHByZWFtYmxlOworCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzWzE0XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNbMTJdOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKKwlzdHJ1Y3QgbGJ0Zl9vZmZzZXRfdmFsdWUgb2Zmc2V0dmFsdWU7CisKKwl1OCBmd19yZWFkeTsKKwl1OCBzdXJwcmlzZXJlbW92ZWQ7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBiY19wc19idWY7Cit9OworCisvKiA4MDIuMTEtcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisvKiBUeFBEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB0eHBkIHsKKwkvKiBDdXJyZW50IFR4IHBhY2tldCBzdGF0dXMgKi8KKwlfX2xlMzIgdHhfc3RhdHVzOworCS8qIFR4IGNvbnRyb2wgKi8KKwlfX2xlMzIgdHhfY29udHJvbDsKKwlfX2xlMzIgdHhfcGFja2V0X2xvY2F0aW9uOworCS8qIFR4IHBhY2tldCBsZW5ndGggKi8KKwlfX2xlMTYgdHhfcGFja2V0X2xlbmd0aDsKKwkvKiBGaXJzdCAyIGJ5dGUgb2YgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKwl1OCB0eF9kZXN0X2FkZHJfaGlnaFsyXTsKKwkvKiBMYXN0IDQgYnl0ZSBvZiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IHR4X2Rlc3RfYWRkcl9sb3dbNF07CisJLyogUGt0IFByaW9yaXR5ICovCisJdTggcHJpb3JpdHk7CisJLyogUGt0IFRyYXNuaXQgUG93ZXIgY29udHJvbCAqLworCXU4IHBvd2VybWdtdDsKKwkvKiBUaW1lIHRoZSBwYWNrZXQgaGFzIGJlZW4gcXVldWVkIGluIHRoZSBkcml2ZXIgKHVuaXRzID0gMm1zKSAqLworCXU4IHBrdGRlbGF5XzJtczsKKwkvKiByZXNlcnZlZCAqLworCXU4IHJlc2VydmVkMTsKK307CisKKy8qIFJ4UEQgRGVzY3JpcHRvciAqLworc3RydWN0IHJ4cGQgeworCS8qIEN1cnJlbnQgUnggcGFja2V0IHN0YXR1cyAqLworCV9fbGUxNiBzdGF0dXM7CisKKwkvKiBTTlIgKi8KKwl1OCBzbnI7CisKKwkvKiBUeCBjb250cm9sICovCisJdTggcnhfY29udHJvbDsKKworCS8qIFBrdCBsZW5ndGggKi8KKwlfX2xlMTYgcGt0X2xlbjsKKworCS8qIE5vaXNlIEZsb29yICovCisJdTggbmY7CisKKwkvKiBSeCBQYWNrZXQgUmF0ZSAqLworCXU4IHJ4X3JhdGU7CisKKwkvKiBQa3QgYWRkciAqLworCV9fbGUzMiBwa3RfcHRyOworCisJLyogTmV4dCBSeCBSeFBEIGFkZHIgKi8KKwlfX2xlMzIgbmV4dF9yeHBkX3B0cjsKKworCS8qIFBrdCBQcmlvcml0eSAqLworCXU4IHByaW9yaXR5OworCXU4IHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGNtZF9oZWFkZXIgeworCV9fbGUxNiBjb21tYW5kOworCV9fbGUxNiBzaXplOworCV9fbGUxNiBzZXFudW07CisJX19sZTE2IHJlc3VsdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2N0cmxfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCByZXN1bHQ7CisJLyogY29tbWFuZCByZXNwb25zZSAqLworCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICosCisJCQl1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgY21kX2hlYWRlciAqKTsKKwl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX2FyZzsKKwkvKiBjb21tYW5kIGRhdGEgKi8KKwlzdHJ1Y3QgY21kX2hlYWRlciAqY21kYnVmOworCS8qIHdhaXQgcXVldWUgKi8KKwl1MTYgY21kd2FpdHF3b2tlbjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjbWR3YWl0X3E7Cit9OworCisvKgorICogRGVmaW5lIGRhdGEgc3RydWN0dXJlIGZvciBDTURfR0VUX0hXX1NQRUMKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHJlc3BvbnNlIGZvciB0aGUgR0VUX0hXX1NQRUMgY29tbWFuZAorICovCitzdHJ1Y3QgY21kX2RzX2dldF9od19zcGVjIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKKwkvKiBIVyBJbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIgKi8KKwlfX2xlMTYgaHdpZnZlcnNpb247CisJLyogSFcgdmVyc2lvbiBudW1iZXIgKi8KKwlfX2xlMTYgdmVyc2lvbjsKKwkvKiBNYXggbnVtYmVyIG9mIFR4UEQgRlcgY2FuIGhhbmRsZSAqLworCV9fbGUxNiBucl90eHBkOworCS8qIE1heCBubyBvZiBNdWx0aWNhc3QgYWRkcmVzcyAqLworCV9fbGUxNiBucl9tY2FzdF9hZHI7CisJLyogTUFDIGFkZHJlc3MgKi8KKwl1OCBwZXJtYW5lbnRhZGRyWzZdOworCisJLyogcmVnaW9uIENvZGUgKi8KKwlfX2xlMTYgcmVnaW9uY29kZTsKKworCS8qIE51bWJlciBvZiBhbnRlbm5hIHVzZWQgKi8KKwlfX2xlMTYgbnJfYW50ZW5uYTsKKworCS8qIEZXIHJlbGVhc2UgbnVtYmVyLCBleGFtcGxlIDB4MDEwMzAzMDQgPSAyLjMuNHAxICovCisJX19sZTMyIGZ3cmVsZWFzZTsKKworCS8qIEJhc2UgQWRkcmVzcyBvZiBUeFBEIHF1ZXVlICovCisJX19sZTMyIHdjYl9iYXNlOworCS8qIFJlYWQgUG9pbnRlciBvZiBSeFBkIHF1ZXVlICovCisJX19sZTMyIHJ4cGRfcmRwdHI7CisKKwkvKiBXcml0ZSBQb2ludGVyIG9mIFJ4UGQgcXVldWUgKi8KKwlfX2xlMzIgcnhwZF93cnB0cjsKKworCS8qRlcvSFcgY2FwYWJpbGl0eSAqLworCV9fbGUzMiBmd2NhcGluZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc19tYWNfY29udHJvbCB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCV9fbGUxNiBhY3Rpb247CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfbWFjX2FkZHJlc3MgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJdWludDhfdCBtYWNhZGRbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGNtZF9kc19tYWNfbXVsdGljYXN0X2FkZHIgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJX19sZTE2IG5yX29mX2FkcnM7CisJdTggbWFjbGlzdFtFVEhfQUxFTiAqIE1SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRV07Cit9OworCitzdHJ1Y3QgY21kX2RzX3NldF9tb2RlIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKKwlfX2xlMTYgbW9kZTsKK307CisKK3N0cnVjdCBjbWRfZHNfc2V0X2Jzc2lkIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKKwl1OCBic3NpZFs2XTsKKwl1OCBhY3RpdmF0ZTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JhZGlvX2NvbnRyb2wgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJX19sZTE2IGNvbnRyb2w7Cit9OworCisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JmX2NoYW5uZWwgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJX19sZTE2IGNoYW5uZWw7CisJX19sZTE2IHJmdHlwZTsgICAgICAvKiB1bnVzZWQgKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7ICAgIC8qIHVudXNlZCAqLworCXU4IGNoYW5uZWxsaXN0WzMyXTsgLyogdW51c2VkICovCit9OworCitzdHJ1Y3QgY21kX2RzX3NldF9ib290Ml92ZXIgeworCXN0cnVjdCBjbWRfaGVhZGVyIGhkcjsKKworCV9fbGUxNiBhY3Rpb247CisJX19sZTE2IHZlcnNpb247Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZXNldCB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCisJX19sZTE2IGFjdGlvbjsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2JlYWNvbl9jb250cm9sIHsKKwlzdHJ1Y3QgY21kX2hlYWRlciBoZHI7CisKKwlfX2xlMTYgYWN0aW9uOworCV9fbGUxNiBiZWFjb25fZW5hYmxlOworCV9fbGUxNiBiZWFjb25fcGVyaW9kOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfYmVhY29uX3NldCB7CisJc3RydWN0IGNtZF9oZWFkZXIgaGRyOworCisJX19sZTE2IGxlbjsKKwl1OCBiZWFjb25bTVJWTF9NQVhfQkNOX1NJWkVdOworfTsKKworc3RydWN0IGxidGZfcHJpdmF0ZTsKK3N0cnVjdCBjbWRfY3RybF9ub2RlOworCisvKiogRnVuY3Rpb24gUHJvdG90eXBlIERlY2xhcmF0aW9uICovCit2b2lkIGxidGZfc2V0X21hY19jb250cm9sKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpOworCitpbnQgbGJ0Zl9mcmVlX2NtZF9idWZmZXIoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7CisKK2ludCBsYnRmX2FsbG9jYXRlX2NtZF9idWZmZXIoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7CitpbnQgbGJ0Zl9leGVjdXRlX25leHRfY29tbWFuZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KTsKK2ludCBsYnRmX3NldF9yYWRpb19jb250cm9sKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpOworaW50IGxidGZfdXBkYXRlX2h3X3NwZWMoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7CitpbnQgbGJ0Zl9jbWRfc2V0X21hY19tdWx0aWNhc3RfYWRkcihzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KTsKK3ZvaWQgbGJ0Zl9zZXRfbW9kZShzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBlbnVtIGxidGZfbW9kZSBtb2RlKTsKK3ZvaWQgbGJ0Zl9zZXRfYnNzaWQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgYm9vbCBhY3RpdmF0ZSwgdTggKmJzc2lkKTsKK2ludCBsYnRmX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCB1aW50OF90ICptYWNfYWRkcik7CisKK2ludCBsYnRmX3NldF9jaGFubmVsKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHU4IGNoYW5uZWwpOworCitpbnQgbGJ0Zl9iZWFjb25fc2V0KHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBza19idWZmICpiZWFjb24pOworaW50IGxidGZfYmVhY29uX2N0cmwoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgYm9vbCBiZWFjb25fZW5hYmxlLAorCQkgICAgIGludCBiZWFjb25faW50KTsKKworCitpbnQgbGJ0Zl9wcm9jZXNzX3J4X2NvbW1hbmQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7Cit2b2lkIGxidGZfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kLAorCQkJICBpbnQgcmVzdWx0KTsKK3ZvaWQgbGJ0Zl9jbWRfcmVzcG9uc2Vfcngoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7CisKKy8qIG1haW4uYyAqLworc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGJ0Zl9nZXRfcmVnaW9uX2NmcF90YWJsZSh1OCByZWdpb24sCisJaW50ICpjZnBfbm8pOworc3RydWN0IGxidGZfcHJpdmF0ZSAqbGJ0Zl9hZGRfY2FyZCh2b2lkICpjYXJkLCBzdHJ1Y3QgZGV2aWNlICpkbWRldik7CitpbnQgbGJ0Zl9yZW1vdmVfY2FyZChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KTsKK2ludCBsYnRmX3N0YXJ0X2NhcmQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdik7CitpbnQgbGJ0Zl9yeChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgbGJ0Zl9zZW5kX3R4X2ZlZWRiYWNrKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHU4IHJldHJ5Y250LCB1OCBmYWlsKTsKK3ZvaWQgbGJ0Zl9iY25fc2VudChzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KTsKKworLyogc3VwcG9ydCBmdW5jdGlvbnMgZm9yIGNtZC5jICovCisvKiBsYnRmX2NtZCgpIGluZmVycyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGNvcHkgZGF0YSBiYWNrIGludG8sIGZyb20KKyAgIHRoZSBzaXplIG9mIHRoZSB0YXJnZXQgb2YgdGhlIHBvaW50ZXIuIFNpbmNlIHRoZSBjb21tYW5kIHRvIGJlIHNlbnQKKyAgIG1heSBvZnRlbiBiZSBzbWFsbGVyLCB0aGF0IHNpemUgaXMgc2V0IGluIGNtZC0+c2l6ZSBieSB0aGUgY2FsbGVyLiovCisjZGVmaW5lIGxidGZfY21kKHByaXYsIGNtZG5yLCBjbWQsIGNiLCBjYl9hcmcpCSh7CQlcCisJdWludDE2X3QgX19zeiA9IGxlMTZfdG9fY3B1KChjbWQpLT5oZHIuc2l6ZSk7CQlcCisJKGNtZCktPmhkci5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCooY21kKSkpOwkJXAorCV9fbGJ0Zl9jbWQocHJpdiwgY21kbnIsICYoY21kKS0+aGRyLCBfX3N6LCBjYiwgY2JfYXJnKTsJXAorfSkKKworI2RlZmluZSBsYnRmX2NtZF93aXRoX3Jlc3BvbnNlKHByaXYsIGNtZG5yLCBjbWQpCVwKKwlsYnRmX2NtZChwcml2LCBjbWRuciwgY21kLCBsYnRmX2NtZF9jb3B5YmFjaywgKHVuc2lnbmVkIGxvbmcpIChjbWQpKQorCit2b2lkIGxidGZfY21kX2FzeW5jKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGNvbW1hbmQsCisJc3RydWN0IGNtZF9oZWFkZXIgKmluX2NtZCwgaW50IGluX2NtZF9zaXplKTsKKworaW50IF9fbGJ0Zl9jbWQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgdWludDE2X3QgY29tbWFuZCwKKwkgICAgICBzdHJ1Y3QgY21kX2hlYWRlciAqaW5fY21kLCBpbnQgaW5fY21kX3NpemUsCisJICAgICAgaW50ICgqY2FsbGJhY2spKHN0cnVjdCBsYnRmX3ByaXZhdGUgKiwgdW5zaWduZWQgbG9uZywKKwkJCSAgICAgIHN0cnVjdCBjbWRfaGVhZGVyICopLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgY2FsbGJhY2tfYXJnKTsKKworaW50IGxidGZfY21kX2NvcHliYWNrKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZXh0cmEsCisJCSAgICAgc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmY5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKQEAgLTAsMCArMSw2NjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LCBjb3p5Yml0IEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgImxpYmVydGFzX3RmLmgiCisjaW5jbHVkZSAibGludXgvZXRoZXJkZXZpY2UuaCIKKworI2RlZmluZSBEUklWRVJfUkVMRUFTRV9WRVJTSU9OICIwMDQucDAiCisvKiB0aGluZmlybSB2ZXJzaW9uOiA1LjEzMi5YLnBYICovCisjZGVmaW5lIExCVEZfRldfVkVSX01JTgkJMHgwNTg0MDMwMAorI2RlZmluZSBMQlRGX0ZXX1ZFUl9NQVgJCTB4MDU4NGZmZmYKKyNkZWZpbmUgUU9TX0NPTlRST0xfTEVOCQkyCisKK3N0YXRpYyBjb25zdCBjaGFyIGxidGZfZHJpdmVyX3ZlcnNpb25bXSA9ICJUSElORklSTS1VU0I4Mzg4LSIgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTjsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpsYnRmX3dxOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGxidGZfY2hhbm5lbHNbXSA9IHsKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTIsIC5od192YWx1ZSA9IDEgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MjIsIC5od192YWx1ZSA9IDMgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MjcsIC5od192YWx1ZSA9IDQgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzcsIC5od192YWx1ZSA9IDYgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDIsIC5od192YWx1ZSA9IDcgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDggfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NTIsIC5od192YWx1ZSA9IDkgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NTcsIC5od192YWx1ZSA9IDEwIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2NywgLmh3X3ZhbHVlID0gMTIgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NzIsIC5od192YWx1ZSA9IDEzIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCB9LAorfTsKKworLyogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgbW9kdWxhdGlvbiByYXRlcy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgbGJ0Zl9yYXRlc1tdID0geworCXsgLmJpdHJhdGUgPSAxMCwKKwkgIC5od192YWx1ZSA9IDAsIH0sCisJeyAuYml0cmF0ZSA9IDIwLAorCSAgLmh3X3ZhbHVlID0gMSwKKwkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCisJeyAuYml0cmF0ZSA9IDU1LAorCSAgLmh3X3ZhbHVlID0gMiwKKwkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCisJeyAuYml0cmF0ZSA9IDExMCwKKwkgIC5od192YWx1ZSA9IDMsCisJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAorCXsgLmJpdHJhdGUgPSA2MCwKKwkgIC5od192YWx1ZSA9IDUsCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDkwLAorCSAgLmh3X3ZhbHVlID0gNiwKKwkgIC5mbGFncyA9IDAgfSwKKwl7IC5iaXRyYXRlID0gMTIwLAorCSAgLmh3X3ZhbHVlID0gNywKKwkgIC5mbGFncyA9IDAgfSwKKwl7IC5iaXRyYXRlID0gMTgwLAorCSAgLmh3X3ZhbHVlID0gOCwKKwkgIC5mbGFncyA9IDAgfSwKKwl7IC5iaXRyYXRlID0gMjQwLAorCSAgLmh3X3ZhbHVlID0gOSwKKwkgIC5mbGFncyA9IDAgfSwKKwl7IC5iaXRyYXRlID0gMzYwLAorCSAgLmh3X3ZhbHVlID0gMTAsCisJICAuZmxhZ3MgPSAwIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwKKwkgIC5od192YWx1ZSA9IDExLAorCSAgLmZsYWdzID0gMCB9LAorCXsgLmJpdHJhdGUgPSA1NDAsCisJICAuaHdfdmFsdWUgPSAxMiwKKwkgIC5mbGFncyA9IDAgfSwKK307CisKK3N0YXRpYyB2b2lkIGxidGZfY21kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGxidGZfcHJpdmF0ZSwKKwkJCQkJIGNtZF93b3JrKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7CisJLyogY29tbWFuZCByZXNwb25zZT8gKi8KKwlpZiAocHJpdi0+Y21kX3Jlc3BvbnNlX3J4ZWQpIHsKKwkJcHJpdi0+Y21kX3Jlc3BvbnNlX3J4ZWQgPSAwOworCQlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKwkJbGJ0Zl9wcm9jZXNzX3J4X2NvbW1hbmQocHJpdik7CisJCXNwaW5fbG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKwl9CisKKwlpZiAocHJpdi0+Y21kX3RpbWVkX291dCAmJiBwcml2LT5jdXJfY21kKSB7CisJCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlID0gcHJpdi0+Y3VyX2NtZDsKKworCQlpZiAoKytwcml2LT5ucl9yZXRyaWVzID4gMTApIHsKKwkJCWxidGZfY29tcGxldGVfY29tbWFuZChwcml2LCBjbWRub2RlLAorCQkJCQkgICAgICAtRVRJTUVET1VUKTsKKwkJCXByaXYtPm5yX3JldHJpZXMgPSAwOworCQl9IGVsc2UgeworCQkJcHJpdi0+Y3VyX2NtZCA9IE5VTEw7CisKKwkJCS8qIFN0aWNrIGl0IGJhY2sgYXQgdGhlIF90b3BfIG9mIHRoZSBwZW5kaW5nCisJCQkgKiBxdWV1ZSBmb3IgaW1tZWRpYXRlIHJlc3VibWlzc2lvbiAqLworCQkJbGlzdF9hZGQoJmNtZG5vZGUtPmxpc3QsICZwcml2LT5jbWRwZW5kaW5ncSk7CisJCX0KKwl9CisJcHJpdi0+Y21kX3RpbWVkX291dCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5kcml2ZXJfbG9jayk7CisKKwlpZiAoIXByaXYtPmZ3X3JlYWR5KQorCQlyZXR1cm47CisJLyogRXhlY3V0ZSB0aGUgbmV4dCBjb21tYW5kICovCisJaWYgKCFwcml2LT5jdXJfY21kKQorCQlsYnRmX2V4ZWN1dGVfbmV4dF9jb21tYW5kKHByaXYpOworfQorCisvKioKKyAqICBsYnRmX3NldHVwX2Zpcm13YXJlOiBpbml0aWFsaXplIGZpcm13YXJlLgorICoKKyAqICBAcHJpdiAgICBBIHBvaW50ZXIgdG8gc3RydWN0IGxidGZfcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUmV0dXJuczogMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGxidGZfc2V0dXBfZmlybXdhcmUoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwkvKgorCSAqIFJlYWQgcHJpdiBhZGRyZXNzIGZyb20gSFcKKwkgKi8KKwltZW1zZXQocHJpdi0+Y3VycmVudF9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisJcmV0ID0gbGJ0Zl91cGRhdGVfaHdfc3BlYyhwcml2KTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJ0Zl9zZXRfbWFjX2NvbnRyb2wocHJpdik7CisJbGJ0Zl9zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdGltZW91dCBvZiBjb21tYW5kIHNlbmRpbmcuCisgKiAgSXQgd2lsbCByZS1zZW5kIHRoZSBzYW1lIGNvbW1hbmQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGNvbW1hbmRfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGxidGZfcHJpdmF0ZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKCFwcml2LT5jdXJfY21kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJsaWJlcnRhc3RmOiBjb21tYW5kIHRpbWVyIGV4cGlyZWQ7ICIKKwkJCQkgICJubyBwZW5kaW5nIGNvbW1hbmRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAibGliZXJ0YXM6IGNvbW1hbmQgJXggdGltZWQgb3V0XG4iLAorCQlsZTE2X3RvX2NwdShwcml2LT5jdXJfY21kLT5jbWRidWYtPmNvbW1hbmQpKTsKKworCXByaXYtPmNtZF90aW1lZF9vdXQgPSAxOworCXF1ZXVlX3dvcmsobGJ0Zl93cSwgJnByaXYtPmNtZF93b3JrKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGxidGZfaW5pdF9hZGFwdGVyKHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYpCit7CisJbWVtc2V0KHByaXYtPmN1cnJlbnRfYWRkciwgMHhmZiwgRVRIX0FMRU4pOworCW11dGV4X2luaXQoJnByaXYtPmxvY2spOworCisJcHJpdi0+dmlmID0gTlVMTDsKKwlzZXR1cF90aW1lcigmcHJpdi0+Y29tbWFuZF90aW1lciwgY29tbWFuZF90aW1lcl9mbiwKKwkJKHVuc2lnbmVkIGxvbmcpcHJpdik7CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+Y21kZnJlZXEpOworCUlOSVRfTElTVF9IRUFEKCZwcml2LT5jbWRwZW5kaW5ncSk7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+ZHJpdmVyX2xvY2spOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1hbmQgYnVmZmVycyAqLworCWlmIChsYnRmX2FsbG9jYXRlX2NtZF9idWZmZXIocHJpdikpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsYnRmX2ZyZWVfYWRhcHRlcihzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQoreworCWxidGZfZnJlZV9jbWRfYnVmZmVyKHByaXYpOworCWRlbF90aW1lcigmcHJpdi0+Y29tbWFuZF90aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgbGJ0Zl9vcF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2ID0gaHctPnByaXY7CisKKwlwcml2LT5za2JfdG9fdHggPSBza2I7CisJcXVldWVfd29yayhsYnRmX3dxLCAmcHJpdi0+dHhfd29yayk7CisJLyoKKwkgKiBxdWV1ZSB3aWxsIGJlIHJlc3RhcnRlZCB3aGVuIHdlIHJlY2VpdmUgdHJhbnNtaXNzaW9uIGZlZWRiYWNrIGlmCisJICogdGhlcmUgYXJlIG5vIGJ1ZmZlcmVkIG11bHRpY2FzdCBmcmFtZXMgdG8gc2VuZAorCSAqLworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxidGZfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbGJ0Zl9wcml2YXRlLAorCQkJCQkgdHhfd29yayk7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IHR4cGQgKnR4cGQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJaW50IGVycjsKKworCWlmICgocHJpdi0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgorCSAgICAoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+YmNfcHNfYnVmKSkpCisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwcml2LT5iY19wc19idWYpOworCWVsc2UgaWYgKHByaXYtPnNrYl90b190eCkgeworCQlza2IgPSBwcml2LT5za2JfdG9fdHg7CisJCXByaXYtPnNrYl90b190eCA9IE5VTEw7CisJfSBlbHNlCisJCXJldHVybjsKKworCWxlbiA9IHNrYi0+bGVuOworCWluZm8gID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXR4cGQgPSAoc3RydWN0IHR4cGQgKikgIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CisKKwlpZiAocHJpdi0+c3VycHJpc2VyZW1vdmVkKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQodHhwZCwgMCwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CisJLyogQWN0aXZhdGUgcGVyLXBhY2tldCByYXRlIHNlbGVjdGlvbiAqLworCXR4cGQtPnR4X2NvbnRyb2wgfD0gY3B1X3RvX2xlMzIoTVJWTF9QRVJfUEFDS0VUX1JBVEUgfAorCQkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUocHJpdi0+aHcsIGluZm8pLT5od192YWx1ZSk7CisKKwkvKiBjb3B5IGRlc3RpbmF0aW9uIGFkZHJlc3MgZnJvbSA4MDIuMTEgaGVhZGVyICovCisJbWVtY3B5KHR4cGQtPnR4X2Rlc3RfYWRkcl9oaWdoLCBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IHR4cGQpICsgNCwKKwkJRVRIX0FMRU4pOworCXR4cGQtPnR4X3BhY2tldF9sZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOworCXR4cGQtPnR4X3BhY2tldF9sb2NhdGlvbiA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgdHhwZCkpOworCUJVR19PTihwcml2LT50eF9za2IpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKwlwcml2LT50eF9za2IgPSBza2I7CisJZXJyID0gcHJpdi0+aHdfaG9zdF90b19jYXJkKHByaXYsIE1WTVNfREFULCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmRyaXZlcl9sb2NrKTsKKwlpZiAoZXJyKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXByaXYtPnR4X3NrYiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGxidGZfb3Bfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiA9IGh3LT5wcml2OworCXZvaWQgKmNhcmQgPSBwcml2LT5jYXJkOworCWludCByZXQgPSAtMTsKKworCWlmICghcHJpdi0+ZndfcmVhZHkpCisJCS8qIFVwbG9hZCBmaXJtd2FyZSAqLworCQlpZiAocHJpdi0+aHdfcHJvZ19maXJtd2FyZShjYXJkKSkKKwkJCWdvdG8gZXJyX3Byb2dfZmlybXdhcmU7CisKKwkvKiBwb2tlIHRoZSBmaXJtd2FyZSAqLworCXByaXYtPmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7CisJcHJpdi0+cmFkaW9vbiA9IFJBRElPX09OOworCXByaXYtPm1hY19jb250cm9sID0gQ01EX0FDVF9NQUNfUlhfT04gfCBDTURfQUNUX01BQ19UWF9PTjsKKwlyZXQgPSBsYnRmX3NldHVwX2Zpcm13YXJlKHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Byb2dfZmlybXdhcmU7CisKKwlpZiAoKHByaXYtPmZ3cmVsZWFzZSA8IExCVEZfRldfVkVSX01JTikgfHwKKwkgICAgKHByaXYtPmZ3cmVsZWFzZSA+IExCVEZfRldfVkVSX01BWCkpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZXJyX3Byb2dfZmlybXdhcmU7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAibGliZXJ0YXN0ZjogTWFydmVsbCBXTEFOIDgwMi4xMSB0aGluZmlybSBhZGFwdGVyXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX3Byb2dfZmlybXdhcmU6CisJcHJpdi0+aHdfcmVzZXRfZGV2aWNlKGNhcmQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxidGZfb3Bfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2ID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGU7CisJLyogRmx1c2ggcGVuZGluZyBjb21tYW5kIG5vZGVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRub2RlLCAmcHJpdi0+Y21kcGVuZGluZ3EsIGxpc3QpIHsKKwkJY21kbm9kZS0+cmVzdWx0ID0gLUVOT0VOVDsKKwkJY21kbm9kZS0+Y21kd2FpdHF3b2tlbiA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kbm9kZS0+Y21kd2FpdF9xKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPmNtZF93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT50eF93b3JrKTsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZwcml2LT5iY19wc19idWYpKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlwcml2LT5yYWRpb29uID0gUkFESU9fT0ZGOworCWxidGZfc2V0X3JhZGlvX2NvbnRyb2wocHJpdik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbGJ0Zl9vcF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiA9IGh3LT5wcml2OworCWlmIChwcml2LT52aWYgIT0gTlVMTCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcHJpdi0+dmlmID0gY29uZi0+dmlmOworCXN3aXRjaCAoY29uZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQlsYnRmX3NldF9tb2RlKHByaXYsIExCVEZfQVBfTU9ERSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJbGJ0Zl9zZXRfbW9kZShwcml2LCBMQlRGX1NUQV9NT0RFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpdi0+dmlmID0gTlVMTDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlsYnRmX3NldF9tYWNfYWRkcmVzcyhwcml2LCAodTggKikgY29uZi0+bWFjX2FkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsYnRmX29wX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2ID0gaHctPnByaXY7CisKKwlpZiAocHJpdi0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJICAgIHByaXYtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQorCQlsYnRmX2JlYWNvbl9jdHJsKHByaXYsIDAsIDApOworCWxidGZfc2V0X21vZGUocHJpdiwgTEJURl9QQVNTSVZFX01PREUpOworCWxidGZfc2V0X2Jzc2lkKHByaXYsIDAsIE5VTEwpOworCXByaXYtPnZpZiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbGJ0Zl9vcF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2ID0gaHctPnByaXY7CisJaWYgKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxICE9IHByaXYtPmN1cl9mcmVxKSB7CisJCXByaXYtPmN1cl9mcmVxID0gY29uZi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJCWxidGZfc2V0X2NoYW5uZWwocHJpdiwgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYnRmX29wX2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQoreworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYmVhY29uOworCisJc3dpdGNoIChwcml2LT52aWYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJYmVhY29uID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CisJCWlmIChiZWFjb24pIHsKKwkJCWxidGZfYmVhY29uX3NldChwcml2LCBiZWFjb24pOworCQkJa2ZyZWVfc2tiKGJlYWNvbik7CisJCQlsYnRmX2JlYWNvbl9jdHJsKHByaXYsIDEsIGh3LT5jb25mLmJlYWNvbl9pbnQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChjb25mLT5ic3NpZCkgeworCQl1OCBudWxsX2Jzc2lkW0VUSF9BTEVOXSA9IHswfTsKKwkJYm9vbCBhY3RpdmF0ZSA9IGNvbXBhcmVfZXRoZXJfYWRkcihjb25mLT5ic3NpZCwgbnVsbF9ic3NpZCk7CisJCWxidGZfc2V0X2Jzc2lkKHByaXYsIGFjdGl2YXRlLCBjb25mLT5ic3NpZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1VQUE9SVEVEX0ZJRl9GTEFHUyAgKEZJRl9QUk9NSVNDX0lOX0JTUyB8IEZJRl9BTExNVUxUSSkKK3N0YXRpYyB2b2lkIGxidGZfb3BfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCXVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJdW5zaWduZWQgaW50ICpuZXdfZmxhZ3MsCisJCQlpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQoreworCXN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgb2xkX21hY19jb250cm9sID0gcHJpdi0+bWFjX2NvbnRyb2w7CisJaW50IGk7CisJY2hhbmdlZF9mbGFncyAmPSBTVVBQT1JURURfRklGX0ZMQUdTOworCSpuZXdfZmxhZ3MgJj0gU1VQUE9SVEVEX0ZJRl9GTEFHUzsKKworCWlmICghY2hhbmdlZF9mbGFncykKKwkJcmV0dXJuOworCisJaWYgKCpuZXdfZmxhZ3MgJiAoRklGX1BST01JU0NfSU5fQlNTKSkKKwkJcHJpdi0+bWFjX2NvbnRyb2wgfD0gQ01EX0FDVF9NQUNfUFJPTUlTQ1VPVVNfRU5BQkxFOworCWVsc2UKKwkJcHJpdi0+bWFjX2NvbnRyb2wgJj0gfkNNRF9BQ1RfTUFDX1BST01JU0NVT1VTX0VOQUJMRTsKKwlpZiAoKm5ld19mbGFncyAmIChGSUZfQUxMTVVMVEkpIHx8CisJICAgIG1jX2NvdW50ID4gTVJWRFJWX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFKSB7CisJCXByaXYtPm1hY19jb250cm9sIHw9IENNRF9BQ1RfTUFDX0FMTF9NVUxUSUNBU1RfRU5BQkxFOworCQlwcml2LT5tYWNfY29udHJvbCAmPSB+Q01EX0FDVF9NQUNfTVVMVElDQVNUX0VOQUJMRTsKKwl9IGVsc2UgaWYgKG1jX2NvdW50KSB7CisJCXByaXYtPm1hY19jb250cm9sIHw9IENNRF9BQ1RfTUFDX01VTFRJQ0FTVF9FTkFCTEU7CisJCXByaXYtPm1hY19jb250cm9sICY9IH5DTURfQUNUX01BQ19BTExfTVVMVElDQVNUX0VOQUJMRTsKKwkJcHJpdi0+bnJfb2ZfbXVsdGljYXN0bWFjYWRkciA9IG1jX2NvdW50OworCQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykgeworCQkJaWYgKCFtY2xpc3QpCisJCQkJYnJlYWs7CisJCQltZW1jcHkoJnByaXYtPm11bHRpY2FzdGxpc3RbaV0sIG1jbGlzdC0+ZGFfYWRkciwKKwkJCQkJRVRIX0FMRU4pOworCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OworCQl9CisJCWxidGZfY21kX3NldF9tYWNfbXVsdGljYXN0X2FkZHIocHJpdik7CisJfSBlbHNlIHsKKwkJcHJpdi0+bWFjX2NvbnRyb2wgJj0gfihDTURfQUNUX01BQ19NVUxUSUNBU1RfRU5BQkxFIHwKKwkJCQkgICAgICAgQ01EX0FDVF9NQUNfQUxMX01VTFRJQ0FTVF9FTkFCTEUpOworCQlpZiAocHJpdi0+bnJfb2ZfbXVsdGljYXN0bWFjYWRkcikgeworCQkJcHJpdi0+bnJfb2ZfbXVsdGljYXN0bWFjYWRkciA9IDA7CisJCQlsYnRmX2NtZF9zZXRfbWFjX211bHRpY2FzdF9hZGRyKHByaXYpOworCQl9CisJfQorCisKKwlpZiAocHJpdi0+bWFjX2NvbnRyb2wgIT0gb2xkX21hY19jb250cm9sKQorCQlsYnRmX3NldF9tYWNfY29udHJvbChwcml2KTsKK30KKworc3RhdGljIHZvaWQgbGJ0Zl9vcF9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAorCQkJdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiA9IGh3LT5wcml2OworCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpIHsKKwkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpCisJCQlwcml2LT5wcmVhbWJsZSA9IENNRF9UWVBFX1NIT1JUX1BSRUFNQkxFOworCQllbHNlCisJCQlwcml2LT5wcmVhbWJsZSA9IENNRF9UWVBFX0xPTkdfUFJFQU1CTEU7CisJCWxidGZfc2V0X3JhZGlvX2NvbnRyb2wocHJpdik7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgbGJ0Zl9vcHMgPSB7CisJLnR4CQkJPSBsYnRmX29wX3R4LAorCS5zdGFydAkJCT0gbGJ0Zl9vcF9zdGFydCwKKwkuc3RvcAkJCT0gbGJ0Zl9vcF9zdG9wLAorCS5hZGRfaW50ZXJmYWNlCQk9IGxidGZfb3BfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZQk9IGxidGZfb3BfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnCQkJPSBsYnRmX29wX2NvbmZpZywKKwkuY29uZmlnX2ludGVyZmFjZQk9IGxidGZfb3BfY29uZmlnX2ludGVyZmFjZSwKKwkuY29uZmlndXJlX2ZpbHRlcgk9IGxidGZfb3BfY29uZmlndXJlX2ZpbHRlciwKKwkuYnNzX2luZm9fY2hhbmdlZAk9IGxidGZfb3BfYnNzX2luZm9fY2hhbmdlZCwKK307CisKK2ludCBsYnRmX3J4KHN0cnVjdCBsYnRmX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHM7CisJc3RydWN0IHJ4cGQgKnByeHBkOworCWludCBuZWVkX3BhZGRpbmc7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwlwcnhwZCA9IChzdHJ1Y3QgcnhwZCAqKSBza2ItPmRhdGE7CisKKwlzdGF0cy5mbGFnID0gMDsKKwlpZiAoIShwcnhwZC0+c3RhdHVzICYgY3B1X3RvX2xlMTYoTVJWRFJWX1JYUERfU1RBVFVTX09LKSkpCisJCXN0YXRzLmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKKwlzdGF0cy5mcmVxID0gcHJpdi0+Y3VyX2ZyZXE7CisJc3RhdHMuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJc3RhdHMuc2lnbmFsID0gcHJ4cGQtPnNucjsKKwlzdGF0cy5ub2lzZSA9IHByeHBkLT5uZjsKKwlzdGF0cy5xdWFsID0gcHJ4cGQtPnNuciAtIHByeHBkLT5uZjsKKwkvKiBNYXJ2ZWxsIHJhdGUgaW5kZXggaGFzIGEgaG9sZSBhdCB2YWx1ZSA0ICovCisJaWYgKHByeHBkLT5yeF9yYXRlID4gNCkKKwkJLS1wcnhwZC0+cnhfcmF0ZTsKKwlzdGF0cy5yYXRlX2lkeCA9IHByeHBkLT5yeF9yYXRlOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHBkKSk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJZmxhZ3MgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShza2ItPmRhdGEgKyA0KSk7CisKKwluZWVkX3BhZGRpbmcgPSBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKTsKKwluZWVkX3BhZGRpbmcgXj0gaWVlZTgwMjExX2hhc19hNChoZHItPmZyYW1lX2NvbnRyb2wpOworCW5lZWRfcGFkZGluZyBePSBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCQkJKCppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmCisJCQkgSUVFRTgwMjExX1FPU19DT05UUk9MX0FfTVNEVV9QUkVTRU5UKTsKKworCWlmIChuZWVkX3BhZGRpbmcpIHsKKwkJbWVtbW92ZShza2ItPmRhdGEgKyAyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwl9CisKKwlpZWVlODAyMTFfcnhfaXJxc2FmZShwcml2LT5odywgc2tiLCAmc3RhdHMpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGJ0Zl9yeCk7CisKKy8qKgorICogbGJ0Zl9hZGRfY2FyZDogQWRkIGFuZCBpbml0aWFsaXplIHRoZSBjYXJkLCBubyBmdyB1cGxvYWQgeWV0LgorICoKKyAqICBAY2FyZCAgICBBIHBvaW50ZXIgdG8gY2FyZAorICoKKyAqICBSZXR1cm5zOiBwb2ludGVyIHRvIHN0cnVjdCBsYnRmX3ByaXYuCisgKi8KK3N0cnVjdCBsYnRmX3ByaXZhdGUgKmxidGZfYWRkX2NhcmQodm9pZCAqY2FyZCwgc3RydWN0IGRldmljZSAqZG1kZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IGxidGZfcHJpdmF0ZSksICZsYnRmX29wcyk7CisJaWYgKCFodykKKwkJZ290byBkb25lOworCisJcHJpdiA9IGh3LT5wcml2OworCWlmIChsYnRmX2luaXRfYWRhcHRlcihwcml2KSkKKwkJZ290byBlcnJfaW5pdF9hZGFwdGVyOworCisJcHJpdi0+aHcgPSBodzsKKwlwcml2LT5jYXJkID0gY2FyZDsKKwlwcml2LT50eF9za2IgPSBOVUxMOworCisJaHctPnF1ZXVlcyA9IDE7CisJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX0hPU1RfQlJPQURDQVNUX1BTX0JVRkZFUklORzsKKwlody0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IHR4cGQpOworCW1lbWNweShwcml2LT5jaGFubmVscywgbGJ0Zl9jaGFubmVscywgc2l6ZW9mKGxidGZfY2hhbm5lbHMpKTsKKwltZW1jcHkocHJpdi0+cmF0ZXMsIGxidGZfcmF0ZXMsIHNpemVvZihsYnRmX3JhdGVzKSk7CisJcHJpdi0+YmFuZC5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShsYnRmX3JhdGVzKTsKKwlwcml2LT5iYW5kLmJpdHJhdGVzID0gcHJpdi0+cmF0ZXM7CisJcHJpdi0+YmFuZC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShsYnRmX2NoYW5uZWxzKTsKKwlwcml2LT5iYW5kLmNoYW5uZWxzID0gcHJpdi0+Y2hhbm5lbHM7CisJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZwcml2LT5iYW5kOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmJjX3BzX2J1Zik7CisKKwlTRVRfSUVFRTgwMjExX0RFVihodywgZG1kZXYpOworCisJSU5JVF9XT1JLKCZwcml2LT5jbWRfd29yaywgbGJ0Zl9jbWRfd29yayk7CisJSU5JVF9XT1JLKCZwcml2LT50eF93b3JrLCBsYnRmX3R4X3dvcmspOworCWlmIChpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpKQorCQlnb3RvIGVycl9pbml0X2FkYXB0ZXI7CisKKwlnb3RvIGRvbmU7CisKK2Vycl9pbml0X2FkYXB0ZXI6CisJbGJ0Zl9mcmVlX2FkYXB0ZXIocHJpdik7CisJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOworCXByaXYgPSBOVUxMOworCitkb25lOgorCXJldHVybiBwcml2OworfQorRVhQT1JUX1NZTUJPTF9HUEwobGJ0Zl9hZGRfY2FyZCk7CisKKworaW50IGxidGZfcmVtb3ZlX2NhcmQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OworCisJcHJpdi0+c3VycHJpc2VyZW1vdmVkID0gMTsKKwlkZWxfdGltZXIoJnByaXYtPmNvbW1hbmRfdGltZXIpOworCWxidGZfZnJlZV9hZGFwdGVyKHByaXYpOworCXByaXYtPmh3ID0gTlVMTDsKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhodyk7CisJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsYnRmX3JlbW92ZV9jYXJkKTsKKwordm9pZCBsYnRmX3NlbmRfdHhfZmVlZGJhY2soc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdiwgdTggcmV0cnljbnQsIHU4IGZhaWwpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eF9za2IpOworCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7CisJLyoKKwkgKiBDb21tZW50ZWQgb3V0LCBvdGhlcndpc2Ugd2UgbmV2ZXIgZ28gYmV5b25kIDFNYml0L3MgdXNpbmcgbWFjODAyMTEKKwkgKiBkZWZhdWx0IHBpZCByYyBhbGdvcml0aG0uCisJICoKKwkgKiBpbmZvLT5zdGF0dXMucmV0cnlfY291bnQgPSBNUlZMX0RFRkFVTFRfUkVUUklFUyAtIHJldHJ5Y250OworCSAqLworCWluZm8tPnN0YXR1cy5leGNlc3NpdmVfcmV0cmllcyA9IGZhaWwgPyAxIDogMDsKKwlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSAmJiAhZmFpbCkKKwkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOworCXNrYl9wdWxsKHByaXYtPnR4X3NrYiwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CisJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBwcml2LT50eF9za2IpOworCXByaXYtPnR4X3NrYiA9IE5VTEw7CisJaWYgKCFwcml2LT5za2JfdG9fdHggJiYgc2tiX3F1ZXVlX2VtcHR5KCZwcml2LT5iY19wc19idWYpKQorCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCWVsc2UKKwkJcXVldWVfd29yayhsYnRmX3dxLCAmcHJpdi0+dHhfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsYnRmX3NlbmRfdHhfZmVlZGJhY2spOworCit2b2lkIGxidGZfYmNuX3NlbnQoc3RydWN0IGxidGZfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKworCWlmIChwcml2LT52aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCXJldHVybjsKKworCWlmIChza2JfcXVldWVfZW1wdHkoJnByaXYtPmJjX3BzX2J1ZikpIHsKKwkJYm9vbCB0eF9idWZmX2JjID0gMDsKKworCQl3aGlsZSAoKHNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMocHJpdi0+aHcsIHByaXYtPnZpZikpKSB7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+YmNfcHNfYnVmLCBza2IpOworCQkJdHhfYnVmZl9iYyA9IDE7CisJCX0KKwkJaWYgKHR4X2J1ZmZfYmMpIHsKKwkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CisJCQlxdWV1ZV93b3JrKGxidGZfd3EsICZwcml2LT50eF93b3JrKTsKKwkJfQorCX0KKworCXNrYiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KHByaXYtPmh3LCBwcml2LT52aWYpOworCisJaWYgKHNrYikgeworCQlsYnRmX2JlYWNvbl9zZXQocHJpdiwgc2tiKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwobGJ0Zl9iY25fc2VudCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxidGZfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlsYnRmX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgibGliZXJ0YXN0ZiIpOworCWlmIChsYnRmX3dxID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsaWJlcnRhc3RmOiBjb3VsZG4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGJ0Zl9leGl0X21vZHVsZSh2b2lkKQoreworCWRlc3Ryb3lfd29ya3F1ZXVlKGxidGZfd3EpOworfQorCittb2R1bGVfaW5pdChsYnRmX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGxidGZfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxpYmVydGFzIFdMQU4gVGhpbmZpcm0gRHJpdmVyIExpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIkNvenliaXQgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKaW5kZXggMjQ4ZDMxYS4uMWEwMTllOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCkBAIC0xNCw2ICsxNCw4IEBACiAgKiAtIFJYIGZpbHRlcmluZyBiYXNlZCBvbiBmaWx0ZXIgY29uZmlndXJhdGlvbiAoZGF0YS0+cnhfZmlsdGVyKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CkBAIC0yOCwxMSArMzAsNTYgQEAKIG1vZHVsZV9wYXJhbShyYWRpb3MsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJhZGlvcywgIk51bWJlciBvZiBzaW11bGF0ZWQgcmFkaW9zIik7CiAKK3N0cnVjdCBod3NpbV92aWZfcHJpdiB7CisJdTMyIG1hZ2ljOworfTsKKworI2RlZmluZSBIV1NJTV9WSUZfTUFHSUMJMHg2OTUzNzc0OAorCitzdGF0aWMgaW5saW5lIHZvaWQgaHdzaW1fY2hlY2tfbWFnaWMoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYgKnZwID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCVdBUk5fT04odnAtPm1hZ2ljICE9IEhXU0lNX1ZJRl9NQUdJQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBod3NpbV9zZXRfbWFnaWMoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYgKnZwID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXZwLT5tYWdpYyA9IEhXU0lNX1ZJRl9NQUdJQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh3c2ltX2NsZWFyX21hZ2ljKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGh3c2ltX3ZpZl9wcml2ICp2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwl2cC0+bWFnaWMgPSAwOworfQorCitzdHJ1Y3QgaHdzaW1fc3RhX3ByaXYgeworCXUzMiBtYWdpYzsKK307CisKKyNkZWZpbmUgSFdTSU1fU1RBX01BR0lDCTB4NmQ1Mzc3NDgKKworc3RhdGljIGlubGluZSB2b2lkIGh3c2ltX2NoZWNrX3N0YV9tYWdpYyhzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBod3NpbV9zdGFfcHJpdiAqc3AgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJV0FSTl9PTihzcC0+bWFnaWMgIT0gSFdTSU1fVklGX01BR0lDKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh3c2ltX3NldF9zdGFfbWFnaWMoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaHdzaW1fc3RhX3ByaXYgKnNwID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXNwLT5tYWdpYyA9IEhXU0lNX1ZJRl9NQUdJQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGh3c2ltX2NsZWFyX3N0YV9tYWdpYyhzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBod3NpbV9zdGFfcHJpdiAqc3AgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3AtPm1hZ2ljID0gMDsKK30KIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqaHdzaW1fY2xhc3M7CiAKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2h3ICoqaHdzaW1fcmFkaW9zOwotc3RhdGljIGludCBod3NpbV9yYWRpb19jb3VudDsKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaHdzaW1fbW9uOyAvKiBnbG9iYWwgbW9uaXRvciBuZXRkZXYgKi8KIAogCkBAIC02OCw3ICsxMTUsMTIgQEAKIAl7IC5iaXRyYXRlID0gNTQwIH0KIH07CiAKK3N0YXRpYyBzcGlubG9ja190IGh3c2ltX3JhZGlvX2xvY2s7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBod3NpbV9yYWRpb3M7CisKIHN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5lbHNbQVJSQVlfU0laRShod3NpbV9jaGFubmVscyldOwpAQCAtMTQ0LDExICsxOTYsMTEgQEAKIH0KIAogCi1zdGF0aWMgaW50IG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgYm9vbCBtYWM4MDIxMV9od3NpbV90eF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgbWFjODAyMTFfaHdzaW1fZGF0YSAqZGF0YSA9IGh3LT5wcml2OwotCWludCBpLCBhY2sgPSAwOworCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhID0gaHctPnByaXYsICpkYXRhMjsKKwlib29sIGFjayA9IGZhbHNlOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CkBAIC0xNjEsMTMgKzIxMywxMyBAQAogCS8qIFRPRE86IHNpbXVsYXRlIHNpZ25hbCBzdHJlbmd0aCAoYW5kIG9wdGlvbmFsIHBhY2tldCBkcm9wKSAqLwogCiAJLyogQ29weSBza2IgdG8gYWxsIGVuYWJsZWQgcmFkaW9zIHRoYXQgYXJlIG9uIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSAqLwotCWZvciAoaSA9IDA7IGkgPCBod3NpbV9yYWRpb19jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhMjsKKwlzcGluX2xvY2soJmh3c2ltX3JhZGlvX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YTIsICZod3NpbV9yYWRpb3MsIGxpc3QpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAKLQkJaWYgKGh3c2ltX3JhZGlvc1tpXSA9PSBOVUxMIHx8IGh3c2ltX3JhZGlvc1tpXSA9PSBodykKKwkJaWYgKGRhdGEgPT0gZGF0YTIpCiAJCQljb250aW51ZTsKLQkJZGF0YTIgPSBod3NpbV9yYWRpb3NbaV0tPnByaXY7CisKIAkJaWYgKCFkYXRhMi0+c3RhcnRlZCB8fCAhZGF0YTItPnJhZGlvX2VuYWJsZWQgfHwKIAkJICAgIGRhdGEtPmNoYW5uZWwtPmNlbnRlcl9mcmVxICE9IGRhdGEyLT5jaGFubmVsLT5jZW50ZXJfZnJlcSkKIAkJCWNvbnRpbnVlOwpAQCAtMTc2LDExICsyMjgsMTIgQEAKIAkJaWYgKG5za2IgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtZW1jbXAoaGRyLT5hZGRyMSwgaHdzaW1fcmFkaW9zW2ldLT53aXBoeS0+cGVybV9hZGRyLAorCQlpZiAobWVtY21wKGhkci0+YWRkcjEsIGRhdGEyLT5ody0+d2lwaHktPnBlcm1fYWRkciwKIAkJCSAgIEVUSF9BTEVOKSA9PSAwKQotCQkJYWNrID0gMTsKLQkJaWVlZTgwMjExX3J4X2lycXNhZmUoaHdzaW1fcmFkaW9zW2ldLCBuc2tiLCAmcnhfc3RhdHVzKTsKKwkJCWFjayA9IHRydWU7CisJCWllZWU4MDIxMV9yeF9pcnFzYWZlKGRhdGEyLT5odywgbnNrYiwgJnJ4X3N0YXR1cyk7CiAJfQorCXNwaW5fdW5sb2NrKCZod3NpbV9yYWRpb19sb2NrKTsKIAogCXJldHVybiBhY2s7CiB9CkBAIC0xODksNyArMjQyLDcgQEAKIHN0YXRpYyBpbnQgbWFjODAyMTFfaHdzaW1fdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgKmRhdGEgPSBody0+cHJpdjsKLQlpbnQgYWNrOworCWJvb2wgYWNrOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpOwogCiAJbWFjODAyMTFfaHdzaW1fbW9uaXRvcl9yeChodywgc2tiKTsKQEAgLTIxMCw2ICsyNjMsMTIgQEAKIAlhY2sgPSBtYWM4MDIxMV9od3NpbV90eF9mcmFtZShodywgc2tiKTsKIAogCXR4aSA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCWlmICh0eGktPmNvbnRyb2wudmlmKQorCQlod3NpbV9jaGVja19tYWdpYyh0eGktPmNvbnRyb2wudmlmKTsKKwlpZiAodHhpLT5jb250cm9sLnN0YSkKKwkJaHdzaW1fY2hlY2tfc3RhX21hZ2ljKHR4aS0+Y29udHJvbC5zdGEpOworCiAJbWVtc2V0KCZ0eGktPnN0YXR1cywgMCwgc2l6ZW9mKHR4aS0+c3RhdHVzKSk7CiAJaWYgKCEodHhpLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkgewogCQlpZiAoYWNrKQpAQCAtMjQ2LDYgKzMwNSw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzICh0eXBlPSVkIG1hY19hZGRyPSVzKVxuIiwKIAkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXywgY29uZi0+dHlwZSwKIAkgICAgICAgcHJpbnRfbWFjKG1hYywgY29uZi0+bWFjX2FkZHIpKTsKKwlod3NpbV9zZXRfbWFnaWMoY29uZi0+dmlmKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU3LDYgKzMxNyw4IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzICh0eXBlPSVkIG1hY19hZGRyPSVzKVxuIiwKIAkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLCBfX2Z1bmNfXywgY29uZi0+dHlwZSwKIAkgICAgICAgcHJpbnRfbWFjKG1hYywgY29uZi0+bWFjX2FkZHIpKTsKKwlod3NpbV9jaGVja19tYWdpYyhjb25mLT52aWYpOworCWh3c2ltX2NsZWFyX21hZ2ljKGNvbmYtPnZpZik7CiB9CiAKIApAQCAtMjY3LDcgKzMyOSw5IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAKLQlpZiAodmlmLT50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0FQKQorCWh3c2ltX2NoZWNrX21hZ2ljKHZpZik7CisKKwlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQogCQlyZXR1cm47CiAKIAlza2IgPSBpZWVlODAyMTFfYmVhY29uX2dldChodywgdmlmKTsKQEAgLTM0MSw3ICs0MDUsNDUgQEAKIAkqdG90YWxfZmxhZ3MgPSBkYXRhLT5yeF9maWx0ZXI7CiB9CiAKK3N0YXRpYyBpbnQgbWFjODAyMTFfaHdzaW1fY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQoreworCWh3c2ltX2NoZWNrX21hZ2ljKHZpZik7CisJcmV0dXJuIDA7Cit9CiAKK3N0YXRpYyB2b2lkIG1hYzgwMjExX2h3c2ltX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqaW5mbywKKwkJCQkJICAgIHUzMiBjaGFuZ2VkKQoreworCWh3c2ltX2NoZWNrX21hZ2ljKHZpZik7Cit9CisKK3N0YXRpYyB2b2lkIG1hYzgwMjExX2h3c2ltX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWh3c2ltX2NoZWNrX21hZ2ljKHZpZik7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNUQV9OT1RJRllfQUREOgorCQlod3NpbV9zZXRfc3RhX21hZ2ljKHN0YSk7CisJCWJyZWFrOworCWNhc2UgU1RBX05PVElGWV9SRU1PVkU6CisJCWh3c2ltX2NsZWFyX3N0YV9tYWdpYyhzdGEpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWFjODAyMTFfaHdzaW1fc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICBib29sIHNldCkKK3sKKwlod3NpbV9jaGVja19zdGFfbWFnaWMoc3RhKTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIG1hYzgwMjExX2h3c2ltX29wcyA9CiB7CkBAIC0zNTIsMjMgKzQ1NCwzMCBAQAogCS5yZW1vdmVfaW50ZXJmYWNlID0gbWFjODAyMTFfaHdzaW1fcmVtb3ZlX2ludGVyZmFjZSwKIAkuY29uZmlnID0gbWFjODAyMTFfaHdzaW1fY29uZmlnLAogCS5jb25maWd1cmVfZmlsdGVyID0gbWFjODAyMTFfaHdzaW1fY29uZmlndXJlX2ZpbHRlciwKKwkuY29uZmlnX2ludGVyZmFjZSA9IG1hYzgwMjExX2h3c2ltX2NvbmZpZ19pbnRlcmZhY2UsCisJLmJzc19pbmZvX2NoYW5nZWQgPSBtYWM4MDIxMV9od3NpbV9ic3NfaW5mb19jaGFuZ2VkLAorCS5zdGFfbm90aWZ5ID0gbWFjODAyMTFfaHdzaW1fc3RhX25vdGlmeSwKKwkuc2V0X3RpbSA9IG1hYzgwMjExX2h3c2ltX3NldF90aW0sCiB9OwogCiAKIHN0YXRpYyB2b2lkIG1hYzgwMjExX2h3c2ltX2ZyZWUodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcGxpc3QsICppLCAqdG1wOworCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhOwogCi0JZm9yIChpID0gMDsgaSA8IGh3c2ltX3JhZGlvX2NvdW50OyBpKyspIHsKLQkJaWYgKGh3c2ltX3JhZGlvc1tpXSkgewotCQkJc3RydWN0IG1hYzgwMjExX2h3c2ltX2RhdGEgKmRhdGE7Ci0JCQlkYXRhID0gaHdzaW1fcmFkaW9zW2ldLT5wcml2OwotCQkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoaHdzaW1fcmFkaW9zW2ldKTsKLQkJCWRldmljZV91bnJlZ2lzdGVyKGRhdGEtPmRldik7Ci0JCQlpZWVlODAyMTFfZnJlZV9odyhod3NpbV9yYWRpb3NbaV0pOwotCQl9CisJSU5JVF9MSVNUX0hFQUQoJnRtcGxpc3QpOworCisJc3Bpbl9sb2NrX2JoKCZod3NpbV9yYWRpb19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoaSwgdG1wLCAmaHdzaW1fcmFkaW9zKQorCQlsaXN0X21vdmUoaSwgJnRtcGxpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZod3NpbV9yYWRpb19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJnRtcGxpc3QsIGxpc3QpIHsKKwkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoZGF0YS0+aHcpOworCQlkZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5kZXYpOworCQlpZWVlODAyMTFfZnJlZV9odyhkYXRhLT5odyk7CiAJfQotCWtmcmVlKGh3c2ltX3JhZGlvcyk7CiAJY2xhc3NfZGVzdHJveShod3NpbV9jbGFzcyk7CiB9CiAKQEAgLTM5OCw0MiArNTA3LDM3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQlpZiAocmFkaW9zIDwgMSB8fCByYWRpb3MgPiA2NTUzNSkKKwlpZiAocmFkaW9zIDwgMSB8fCByYWRpb3MgPiAxMDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaHdzaW1fcmFkaW9fY291bnQgPSByYWRpb3M7Ci0JaHdzaW1fcmFkaW9zID0ga2NhbGxvYyhod3NpbV9yYWRpb19jb3VudCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odyAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGh3c2ltX3JhZGlvcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmaHdzaW1fcmFkaW9fbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmh3c2ltX3JhZGlvcyk7CiAKIAlod3NpbV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgIm1hYzgwMjExX2h3c2ltIik7Ci0JaWYgKElTX0VSUihod3NpbV9jbGFzcykpIHsKLQkJa2ZyZWUoaHdzaW1fcmFkaW9zKTsKKwlpZiAoSVNfRVJSKGh3c2ltX2NsYXNzKSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdzaW1fY2xhc3MpOwotCX0KIAogCW1lbXNldChhZGRyLCAwLCBFVEhfQUxFTik7CiAJYWRkclswXSA9IDB4MDI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaHdzaW1fcmFkaW9fY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCByYWRpb3M7IGkrKykgewogCQlwcmludGsoS0VSTl9ERUJVRyAibWFjODAyMTFfaHdzaW06IEluaXRpYWxpemluZyByYWRpbyAlZFxuIiwKIAkJICAgICAgIGkpOwogCQlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKmRhdGEpLCAmbWFjODAyMTFfaHdzaW1fb3BzKTsKLQkJaWYgKGh3ID09IE5VTEwpIHsKKwkJaWYgKCFodykgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiBpZWVlODAyMTFfYWxsb2NfaHcgIgogCQkJICAgICAgICJmYWlsZWRcbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9Ci0JCWh3c2ltX3JhZGlvc1tpXSA9IGh3OwotCiAJCWRhdGEgPSBody0+cHJpdjsKLQkJZGF0YS0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGh3c2ltX2NsYXNzLCBOVUxMLCAwLCBodywKLQkJCQkJCSJod3NpbSVkIiwgaSk7CisJCWRhdGEtPmh3ID0gaHc7CisKKwkJZGF0YS0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShod3NpbV9jbGFzcywgTlVMTCwgMCwgaHcsCisJCQkJCSAgImh3c2ltJWQiLCBpKTsKIAkJaWYgKElTX0VSUihkYXRhLT5kZXYpKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJICAgICAgICJtYWM4MDIxMV9od3NpbTogZGV2aWNlX2NyZWF0ZV9kcnZkYXRhICIKKwkJCSAgICAgICAibWFjODAyMTFfaHdzaW06IGRldmljZV9jcmVhdGUgIgogCQkJICAgICAgICJmYWlsZWQgKCVsZClcbiIsIFBUUl9FUlIoZGF0YS0+ZGV2KSk7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsZWRfZHJ2ZGF0YTsKQEAgLTQ0Niw3ICs1NTAsMTUgQEAKIAkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIGFkZHIpOwogCiAJCWh3LT5jaGFubmVsX2NoYW5nZV90aW1lID0gMTsKLQkJaHctPnF1ZXVlcyA9IDE7CisJCWh3LT5xdWV1ZXMgPSA0OworCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAorCQkJQklUKE5MODAyMTFfSUZUWVBFX0FQKTsKKwkJaHctPmFtcGR1X3F1ZXVlcyA9IDE7CisKKwkJLyogYXNrIG1hYzgwMjExIHRvIHJlc2VydmUgc3BhY2UgZm9yIG1hZ2ljICovCisJCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBod3NpbV92aWZfcHJpdik7CisJCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBod3NpbV9zdGFfcHJpdik7CiAKIAkJbWVtY3B5KGRhdGEtPmNoYW5uZWxzLCBod3NpbV9jaGFubmVscywgc2l6ZW9mKGh3c2ltX2NoYW5uZWxzKSk7CiAJCW1lbWNweShkYXRhLT5yYXRlcywgaHdzaW1fcmF0ZXMsIHNpemVvZihod3NpbV9yYXRlcykpOwpAQCAtNDU0LDYgKzU2NiwxOSBAQAogCQlkYXRhLT5iYW5kLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGh3c2ltX2NoYW5uZWxzKTsKIAkJZGF0YS0+YmFuZC5iaXRyYXRlcyA9IGRhdGEtPnJhdGVzOwogCQlkYXRhLT5iYW5kLm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKGh3c2ltX3JhdGVzKTsKKwkJZGF0YS0+YmFuZC5odF9pbmZvLmh0X3N1cHBvcnRlZCA9IDE7CisJCWRhdGEtPmJhbmQuaHRfaW5mby5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCB8CisJCQlJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAorCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAorCQkJSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDA7CisJCWRhdGEtPmJhbmQuaHRfaW5mby5hbXBkdV9mYWN0b3IgPSAweDM7CisJCWRhdGEtPmJhbmQuaHRfaW5mby5hbXBkdV9kZW5zaXR5ID0gMHg2OworCQltZW1zZXQoZGF0YS0+YmFuZC5odF9pbmZvLnN1cHBfbWNzX3NldCwgMCwKKwkJICAgICAgIHNpemVvZihkYXRhLT5iYW5kLmh0X2luZm8uc3VwcF9tY3Nfc2V0KSk7CisJCWRhdGEtPmJhbmQuaHRfaW5mby5zdXBwX21jc19zZXRbMF0gPSAweGZmOworCQlkYXRhLT5iYW5kLmh0X2luZm8uc3VwcF9tY3Nfc2V0WzFdID0gMHhmZjsKKwkJZGF0YS0+YmFuZC5odF9pbmZvLnN1cHBfbWNzX3NldFsxMl0gPQorCQkJSUVFRTgwMjExX0hUX0NBUF9NQ1NfVFhfREVGSU5FRDsKIAkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZkYXRhLT5iYW5kOwogCiAJCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhodyk7CkBAIC00NjksNiArNTk0LDggQEAKIAogCQlzZXR1cF90aW1lcigmZGF0YS0+YmVhY29uX3RpbWVyLCBtYWM4MDIxMV9od3NpbV9iZWFjb24sCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGh3KTsKKworCQlsaXN0X2FkZF90YWlsKCZkYXRhLT5saXN0LCAmaHdzaW1fcmFkaW9zKTsKIAl9CiAKIAlod3NpbV9tb24gPSBhbGxvY19uZXRkZXYoMCwgImh3c2ltJWQiLCBod3NpbV9tb25fc2V0dXApOwpAQCAtNTAwLDcgKzYyNyw2IEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+ZGV2KTsKIGZhaWxlZF9kcnZkYXRhOgogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKLQlod3NpbV9yYWRpb3NbaV0gPSBOVUxMOwogZmFpbGVkOgogCW1hYzgwMjExX2h3c2ltX2ZyZWUoKTsKIAlyZXR1cm4gZXJyOwpAQCAtNTA5LDggKzYzNSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21hYzgwMjExX2h3c2ltKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIm1hYzgwMjExX2h3c2ltOiB1bnJlZ2lzdGVyICVkIHJhZGlvc1xuIiwKLQkgICAgICAgaHdzaW1fcmFkaW9fY291bnQpOworCXByaW50ayhLRVJOX0RFQlVHICJtYWM4MDIxMV9od3NpbTogdW5yZWdpc3RlciByYWRpb3NcbiIpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYoaHdzaW1fbW9uKTsKIAltYWM4MDIxMV9od3NpbV9mcmVlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKaW5kZXggZjQ3OWMxYS4uYTY3MGYzNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKICAgICAKICAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KLSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORyB8IElSUV9IQU5ETEVfUFJFU0VOVDsKICAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CiAgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmbmV0d2F2ZV9pbnRlcnJ1cHQ7CiAgICAgCkBAIC03NDksOSArNzQ5LDEwIEBACiAgICAgZm9yIChpID0gaiA9IDB4MDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKIAlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJaWYgKGkgPT0gMCkKKwkJYnJlYWs7CiAgICAgfQotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKyAgICBpZiAoaSAhPSAwKSB7CiAJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKIAlnb3RvIGZhaWxlZDsKICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKaW5kZXggMzZjMDA0ZS4uNTA5MDQ3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtNzksMTUgKzc5LDIxIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogCisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKwogI2luY2x1ZGUgImhlcm1lc19yaWQuaCIKKyNpbmNsdWRlICJoZXJtZXNfZGxkLmgiCiAjaW5jbHVkZSAib3Jpbm9jby5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDEsNiArMjQ3LDc0IEBACiBzdGF0aWMgdm9pZCBfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNaWNoYWVsIE1JQyBjcnlwdG8gc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JQ0hBRUxfTUlDX0xFTiA4CitzdGF0aWMgaW50IG9yaW5vY29fbWljX2luaXQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlwcml2LT50eF90Zm1fbWljID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwgMCk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm1fbWljKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAib3Jpbm9jb19taWNfaW5pdDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+dHhfdGZtX21pYyA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnJ4X3RmbV9taWMgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLCAwKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbV9taWMpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJvcmlub2NvX21pY19pbml0OiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcml2LT5yeF90Zm1fbWljID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fbWljX2ZyZWUoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlpZiAocHJpdi0+dHhfdGZtX21pYykKKwkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT50eF90Zm1fbWljKTsKKwlpZiAocHJpdi0+cnhfdGZtX21pYykKKwkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT5yeF90Zm1fbWljKTsKK30KKworc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbV9taWNoYWVsLCB1OCAqa2V5LAorCQkgICAgICAgdTggKmRhLCB1OCAqc2EsIHU4IHByaW9yaXR5LAorCQkgICAgICAgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1pYykKK3sKKwlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCXU4IGhkcltFVEhfSExFTiArIDJdOyAvKiBzaXplIG9mIGhlYWRlciArIHBhZGRpbmcgKi8KKworCWlmICh0Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENvcHkgaGVhZGVyIGludG8gYnVmZmVyLiBXZSBuZWVkIHRoZSBwYWRkaW5nIG9uIHRoZSBlbmQgemVyb2VkICovCisJbWVtY3B5KCZoZHJbMF0sIGRhLCBFVEhfQUxFTik7CisJbWVtY3B5KCZoZHJbRVRIX0FMRU5dLCBzYSwgRVRIX0FMRU4pOworCWhkcltFVEhfQUxFTioyXSA9IHByaW9yaXR5OworCWhkcltFVEhfQUxFTioyKzFdID0gMDsKKwloZHJbRVRIX0FMRU4qMisyXSA9IDA7CisJaGRyW0VUSF9BTEVOKjIrM10gPSAwOworCisJLyogVXNlIHNjYXR0ZXIgZ2F0aGVyIHRvIE1JQyBoZWFkZXIgYW5kIGRhdGEgaW4gb25lIGdvICovCisJc2dfaW5pdF90YWJsZShzZywgMik7CisJc2dfc2V0X2J1Zigmc2dbMF0sIGhkciwgc2l6ZW9mKGhkcikpOworCXNnX3NldF9idWYoJnNnWzFdLCBkYXRhLCBkYXRhX2xlbik7CisKKwlpZiAoY3J5cHRvX2hhc2hfc2V0a2V5KHRmbV9taWNoYWVsLCBrZXksIE1JQ19LRVlMRU4pKQorCQlyZXR1cm4gLTE7CisKKwlkZXNjLnRmbSA9IHRmbV9taWNoYWVsOworCWRlc2MuZmxhZ3MgPSAwOworCXJldHVybiBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsIHNnLCBkYXRhX2xlbiArIHNpemVvZihoZHIpLAorCQkJCSAgbWljKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNzMsMTIgKzM0NywxOSBAQAogI2RlZmluZSBPUklOT0NPX01BWF9CU1NfQ09VTlQJNjQKIHN0YXRpYyBpbnQgb3Jpbm9jb19ic3NfZGF0YV9hbGxvY2F0ZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQogewotCWlmIChwcml2LT5ic3NfZGF0YSkKKwlpZiAocHJpdi0+YnNzX3hic3NfZGF0YSkKIAkJcmV0dXJuIDA7CiAKLQlwcml2LT5ic3NfZGF0YSA9Ci0JICAgIGt6YWxsb2MoT1JJTk9DT19NQVhfQlNTX0NPVU5UICogc2l6ZW9mKGJzc19lbGVtZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5ic3NfZGF0YSkgeworCWlmIChwcml2LT5oYXNfZXh0X3NjYW4pCisJCXByaXYtPmJzc194YnNzX2RhdGEgPSBremFsbG9jKE9SSU5PQ09fTUFYX0JTU19DT1VOVCAqCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgeGJzc19lbGVtZW50KSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJZWxzZQorCQlwcml2LT5ic3NfeGJzc19kYXRhID0ga3phbGxvYyhPUklOT0NPX01BWF9CU1NfQ09VTlQgKgorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGJzc19lbGVtZW50KSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXYtPmJzc194YnNzX2RhdGEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnMiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjg3LDE4ICszNjgsMzE5IEBACiAKIHN0YXRpYyB2b2lkIG9yaW5vY29fYnNzX2RhdGFfZnJlZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQogewotCWtmcmVlKHByaXYtPmJzc19kYXRhKTsKLQlwcml2LT5ic3NfZGF0YSA9IE5VTEw7CisJa2ZyZWUocHJpdi0+YnNzX3hic3NfZGF0YSk7CisJcHJpdi0+YnNzX3hic3NfZGF0YSA9IE5VTEw7CiB9CiAKKyNkZWZpbmUgUFJJVl9CU1MJKChzdHJ1Y3QgYnNzX2VsZW1lbnQgKilwcml2LT5ic3NfeGJzc19kYXRhKQorI2RlZmluZSBQUklWX1hCU1MJKChzdHJ1Y3QgeGJzc19lbGVtZW50ICopcHJpdi0+YnNzX3hic3NfZGF0YSkKIHN0YXRpYyB2b2lkIG9yaW5vY29fYnNzX2RhdGFfaW5pdChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQogewogCWludCBpOwogCiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmJzc19mcmVlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ic3NfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IE9SSU5PQ09fTUFYX0JTU19DT1VOVDsgaSsrKQotCQlsaXN0X2FkZF90YWlsKCZwcml2LT5ic3NfZGF0YVtpXS5saXN0LCAmcHJpdi0+YnNzX2ZyZWVfbGlzdCk7CisJaWYgKHByaXYtPmhhc19leHRfc2NhbikKKwkJZm9yIChpID0gMDsgaSA8IE9SSU5PQ09fTUFYX0JTU19DT1VOVDsgaSsrKQorCQkJbGlzdF9hZGRfdGFpbCgmKFBSSVZfWEJTU1tpXS5saXN0KSwKKwkJCQkgICAgICAmcHJpdi0+YnNzX2ZyZWVfbGlzdCk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgT1JJTk9DT19NQVhfQlNTX0NPVU5UOyBpKyspCisJCQlsaXN0X2FkZF90YWlsKCYoUFJJVl9CU1NbaV0ubGlzdCksCisJCQkJICAgICAgJnByaXYtPmJzc19mcmVlX2xpc3QpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdTggKm9yaW5vY29fZ2V0X2llKHU4ICpkYXRhLCBzaXplX3QgbGVuLAorCQkJCSBlbnVtIGllZWU4MDIxMV9tZmllIGVpZCkKK3sKKwl1OCAqcCA9IGRhdGE7CisJd2hpbGUgKChwICsgMikgPCAoZGF0YSArIGxlbikpIHsKKwkJaWYgKHBbMF0gPT0gZWlkKQorCQkJcmV0dXJuIHA7CisJCXAgKz0gcFsxXSArIDI7CisJfQorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIFdQQV9PVUlfVFlQRQkiXHgwMFx4NTBceEYyXHgwMSIKKyNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0CitzdGF0aWMgaW5saW5lIHU4ICpvcmlub2NvX2dldF93cGFfaWUodTggKmRhdGEsIHNpemVfdCBsZW4pCit7CisJdTggKnAgPSBkYXRhOworCXdoaWxlICgocCArIDIgKyBXUEFfU0VMRUNUT1JfTEVOKSA8IChkYXRhICsgbGVuKSkgeworCQlpZiAoKHBbMF0gPT0gTUZJRV9UWVBFX0dFTkVSSUMpICYmCisJCSAgICAobWVtY21wKCZwWzJdLCBXUEFfT1VJX1RZUEUsIFdQQV9TRUxFQ1RPUl9MRU4pID09IDApKQorCQkJcmV0dXJuIHA7CisJCXAgKz0gcFsxXSArIDI7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERvd25sb2FkIGZ1bmN0aW9uYWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGZ3X2luZm8geworCWNoYXIgKnByaV9mdzsKKwljaGFyICpzdGFfZnc7CisJY2hhciAqYXBfZnc7CisJdTMyIHBkYV9hZGRyOworCXUxNiBwZGFfc2l6ZTsKK307CisKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgZndfaW5mbyBvcmlub2NvX2Z3W10gPSB7CisJeyAiIiwgImFnZXJlX3N0YV9mdy5iaW4iLCAiYWdlcmVfYXBfZncuYmluIiwgMHgwMDM5MDAwMCwgMTAwMCB9LAorCXsgIiIsICJwcmlzbV9zdGFfZncuYmluIiwgInByaXNtX2FwX2Z3LmJpbiIsIDAsIDEwMjQgfSwKKwl7ICJzeW1ib2xfc3AyNHRfcHJpbV9mdyIsICJzeW1ib2xfc3AyNHRfc2VjX2Z3IiwgIiIsIDB4MDAwMDMxMDAsIDB4MTAwIH0KK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGFjY2VzcyBmaWVsZHMgaW4gRlcKKyAqIE1ha2Ugc3VyZSBMRSBkZWNvZGluZyBtYWNyb3MgYXJlIHVzZWQKKyAqLworc3RydWN0IG9yaW5vY29fZndfaGVhZGVyIHsKKwljaGFyIGhkcl92ZXJzWzZdOyAgICAgICAvKiBBU0NJSSBzdHJpbmcgZm9yIGhlYWRlciB2ZXJzaW9uICovCisJX19sZTE2IGhlYWRlcnNpemU7ICAgICAgLyogVG90YWwgbGVuZ3RoIG9mIGhlYWRlciAqLworCV9fbGUzMiBlbnRyeV9wb2ludDsgICAgIC8qIE5JQyBlbnRyeSBwb2ludCAqLworCV9fbGUzMiBibG9ja3M7ICAgICAgICAgIC8qIE51bWJlciBvZiBibG9ja3MgdG8gcHJvZ3JhbSAqLworCV9fbGUzMiBibG9ja19vZmZzZXQ7ICAgIC8qIE9mZnNldCBvZiBibG9jayBkYXRhIGZyb20gZW9mIGhlYWRlciAqLworCV9fbGUzMiBwZHJfb2Zmc2V0OyAgICAgIC8qIE9mZnNldCB0byBQRFIgZGF0YSBmcm9tIGVvZiBoZWFkZXIgKi8KKwlfX2xlMzIgcHJpX29mZnNldDsgICAgICAvKiBPZmZzZXQgdG8gcHJpbWFyeSBwbHVnIGRhdGEgKi8KKwlfX2xlMzIgY29tcGF0X29mZnNldDsgICAvKiBPZmZzZXQgdG8gY29tcGF0aWJpbGl0eSBkYXRhKi8KKwljaGFyIHNpZ25hdHVyZVswXTsgICAgICAvKiBGVyBzaWduYXR1cmUgbGVuZ3RoIGhlYWRlcnNpemUtMjAgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBEb3dubG9hZCBlaXRoZXIgU1RBIG9yIEFQIGZpcm13YXJlIGludG8gdGhlIGNhcmQuICovCitzdGF0aWMgaW50Citvcmlub2NvX2RsX2Zpcm13YXJlKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCSAgICBjb25zdCBzdHJ1Y3QgZndfaW5mbyAqZncsCisJCSAgICBpbnQgYXApCit7CisJLyogUGx1ZyBEYXRhIEFyZWEgKFBEQSkgKi8KKwlfX2xlMTYgcGRhWzUxMl0gPSB7IDAgfTsKKworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OworCWNvbnN0IHN0cnVjdCBvcmlub2NvX2Z3X2hlYWRlciAqaGRyOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmZpcnN0X2Jsb2NrOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKwljb25zdCBjaGFyICpmaXJtd2FyZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmRldjsKKwlpbnQgZXJyOworCisJaWYgKGFwKQorCQlmaXJtd2FyZSA9IGZ3LT5hcF9mdzsKKwllbHNlCisJCWZpcm13YXJlID0gZnctPnN0YV9mdzsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogQXR0ZW1wdGluZyB0byBkb3dubG9hZCBmaXJtd2FyZSAlc1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBmaXJtd2FyZSk7CisKKwkvKiBSZWFkIGN1cnJlbnQgcGx1ZyBkYXRhICovCisJZXJyID0gaGVybWVzX3JlYWRfcGRhKGh3LCBwZGEsIGZ3LT5wZGFfYWRkciwKKwkJCSAgICAgIG1pbl90KHUxNiwgZnctPnBkYV9zaXplLCBzaXplb2YocGRhKSksIDApOworCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVhZCBQREEgcmV0dXJuZWQgJWRcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIGZpcm13YXJlLCBwcml2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGZpbmQgZmlybXdhcmUgJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGZpcm13YXJlKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaGRyID0gKGNvbnN0IHN0cnVjdCBvcmlub2NvX2Z3X2hlYWRlciAqKSBmd19lbnRyeS0+ZGF0YTsKKworCS8qIEVuYWJsZSBhdXggcG9ydCB0byBhbGxvdyBwcm9ncmFtbWluZyAqLworCWVyciA9IGhlcm1lc2lfcHJvZ3JhbV9pbml0KGh3LCBsZTMyX3RvX2NwdShoZHItPmVudHJ5X3BvaW50KSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQcm9ncmFtIGluaXQgcmV0dXJuZWQgJWRcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gYWJvcnQ7CisKKwkvKiBQcm9ncmFtIGRhdGEgKi8KKwlmaXJzdF9ibG9jayA9IChmd19lbnRyeS0+ZGF0YSArCisJCSAgICAgICBsZTE2X3RvX2NwdShoZHItPmhlYWRlcnNpemUpICsKKwkJICAgICAgIGxlMzJfdG9fY3B1KGhkci0+YmxvY2tfb2Zmc2V0KSk7CisJZW5kID0gZndfZW50cnktPmRhdGEgKyBmd19lbnRyeS0+c2l6ZTsKKworCWVyciA9IGhlcm1lc19wcm9ncmFtKGh3LCBmaXJzdF9ibG9jaywgZW5kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFByb2dyYW0gcmV0dXJuZWQgJWRcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gYWJvcnQ7CisKKwkvKiBVcGRhdGUgcHJvZHVjdGlvbiBkYXRhICovCisJZmlyc3RfYmxvY2sgPSAoZndfZW50cnktPmRhdGEgKworCQkgICAgICAgbGUxNl90b19jcHUoaGRyLT5oZWFkZXJzaXplKSArCisJCSAgICAgICBsZTMyX3RvX2NwdShoZHItPnBkcl9vZmZzZXQpKTsKKworCWVyciA9IGhlcm1lc19hcHBseV9wZGFfd2l0aF9kZWZhdWx0cyhodywgZmlyc3RfYmxvY2ssIHBkYSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBcHBseSBQREEgcmV0dXJuZWQgJWRcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGFib3J0OworCisJLyogVGVsbCBjYXJkIHdlJ3ZlIGZpbmlzaGVkICovCisJZXJyID0gaGVybWVzaV9wcm9ncmFtX2VuZChodyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQcm9ncmFtIGVuZCByZXR1cm5lZCAlZFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBhYm9ydDsKKworCS8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhlcm1lc19wcmVzZW50IHJldHVybmVkICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGhlcm1lc19wcmVzZW50KGh3KSk7CisKK2Fib3J0OgorCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEVuZCBtYXJrZXJzICovCisjZGVmaW5lIFRFWFRfRU5ECTB4MUEJCS8qIEVuZCBvZiB0ZXh0IGhlYWRlciAqLworCisvKgorICogUHJvY2VzcyBhIGZpcm13YXJlIGltYWdlIC0gc3RvcCB0aGUgY2FyZCwgbG9hZCB0aGUgZmlybXdhcmUsIHJlc2V0CisgKiB0aGUgY2FyZCBhbmQgbWFrZSBzdXJlIGl0IHJlc3BvbmRzLiAgRm9yIHRoZSBzZWNvbmRhcnkgZmlybXdhcmUgdGFrZQorICogY2FyZSBvZiB0aGUgUERBIC0gcmVhZCBpdCBhbmQgdGhlbiB3cml0ZSBpdCBvbiB0b3Agb2YgdGhlIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50CitzeW1ib2xfZGxfaW1hZ2Uoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgY29uc3Qgc3RydWN0IGZ3X2luZm8gKmZ3LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICppbWFnZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kLAorCQlpbnQgc2Vjb25kYXJ5KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgcmV0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmaXJzdF9ibG9jazsKKworCS8qIFBsdWcgRGF0YSBBcmVhIChQREEpICovCisJX19sZTE2IHBkYVsyNTZdOworCisJLyogQmluYXJ5IGJsb2NrIGJlZ2lucyBhZnRlciB0aGUgMHgxQSBtYXJrZXIgKi8KKwlwdHIgPSBpbWFnZTsKKwl3aGlsZSAoKnB0cisrICE9IFRFWFRfRU5EKTsKKwlmaXJzdF9ibG9jayA9IHB0cjsKKworCS8qIFJlYWQgdGhlIFBEQSBmcm9tIEVFUFJPTSAqLworCWlmIChzZWNvbmRhcnkpIHsKKwkJcmV0ID0gaGVybWVzX3JlYWRfcGRhKGh3LCBwZGEsIGZ3LT5wZGFfYWRkciwgc2l6ZW9mKHBkYSksIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTdG9wIHRoZSBmaXJtd2FyZSwgc28gdGhhdCBpdCBjYW4gYmUgc2FmZWx5IHJld3JpdHRlbiAqLworCWlmIChwcml2LT5zdG9wX2Z3KSB7CisJCXJldCA9IHByaXYtPnN0b3BfZncocHJpdiwgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFByb2dyYW0gdGhlIGFkYXB0ZXIgd2l0aCBuZXcgZmlybXdhcmUgKi8KKwlyZXQgPSBoZXJtZXNfcHJvZ3JhbShodywgZmlyc3RfYmxvY2ssIGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdyaXRlIHRoZSBQREEgdG8gdGhlIGFkYXB0ZXIgKi8KKwlpZiAoc2Vjb25kYXJ5KSB7CisJCXNpemVfdCBsZW4gPSBoZXJtZXNfYmxvY2tzX2xlbmd0aChmaXJzdF9ibG9jayk7CisJCXB0ciA9IGZpcnN0X2Jsb2NrICsgbGVuOworCQlyZXQgPSBoZXJtZXNfYXBwbHlfcGRhKGh3LCBwdHIsIHBkYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJ1biB0aGUgZmlybXdhcmUgKi8KKwlpZiAocHJpdi0+c3RvcF9mdykgeworCQlyZXQgPSBwcml2LT5zdG9wX2Z3KHByaXYsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXNldCBoZXJtZXMgY2hpcCBhbmQgbWFrZSBzdXJlIGl0IHJlc3BvbmRzICovCisJcmV0ID0gaGVybWVzX2luaXQoaHcpOworCisJLyogaGVybWVzX3Jlc2V0KCkgc2hvdWxkIHJldHVybiAwIHdpdGggdGhlIHNlY29uZGFyeSBmaXJtd2FyZSAqLworCWlmIChzZWNvbmRhcnkgJiYgcmV0ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQW5kIHRoaXMgc2hvdWxkIHdvcmsgd2l0aCBhbnkgZmlybXdhcmUgKi8KKwlpZiAoIWhlcm1lc19wcmVzZW50KGh3KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRG93bmxvYWQgdGhlIGZpcm13YXJlIGludG8gdGhlIGNhcmQsIHRoaXMgYWxzbyBkb2VzIGEgUENNQ0lBIHNvZnQKKyAqIHJlc2V0IG9uIHRoZSBjYXJkLCB0byBtYWtlIHN1cmUgaXQncyBpbiBhIHNhbmUgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQKK3N5bWJvbF9kbF9maXJtd2FyZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkgICBjb25zdCBzdHJ1Y3QgZndfaW5mbyAqZncpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7CisJaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmdy0+cHJpX2Z3LAorCQkJICAgICBwcml2LT5kZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGZpbmQgZmlybXdhcmU6ICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBmdy0+cHJpX2Z3KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogTG9hZCBwcmltYXJ5IGZpcm13YXJlICovCisJcmV0ID0gc3ltYm9sX2RsX2ltYWdlKHByaXYsIGZ3LCBmd19lbnRyeS0+ZGF0YSwKKwkJCSAgICAgIGZ3X2VudHJ5LT5kYXRhICsgZndfZW50cnktPnNpemUsIDApOworCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUHJpbWFyeSBmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgZnctPnN0YV9mdywKKwkJCSAgICAgcHJpdi0+ZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBmaW5kIGZpcm13YXJlOiAlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZnctPnN0YV9mdyk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIExvYWQgc2Vjb25kYXJ5IGZpcm13YXJlICovCisJcmV0ID0gc3ltYm9sX2RsX2ltYWdlKHByaXYsIGZ3LCBmd19lbnRyeS0+ZGF0YSwKKwkJCSAgICAgIGZ3X2VudHJ5LT5kYXRhICsgZndfZW50cnktPnNpemUsIDEpOworCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU2Vjb25kYXJ5IGZpcm13YXJlIGRvd25sb2FkIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2Rvd25sb2FkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGVyciA9IDA7CisJLyogUmVsb2FkIGZpcm13YXJlICovCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQkvKiBjYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6ICovCisJCWVyciA9IG9yaW5vY29fZGxfZmlybXdhcmUocHJpdiwKKwkJCQkJICAmb3Jpbm9jb19md1twcml2LT5maXJtd2FyZV90eXBlXSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJZXJyID0gc3ltYm9sX2RsX2Zpcm13YXJlKHByaXYsCisJCQkJCSAmb3Jpbm9jb19md1twcml2LT5maXJtd2FyZV90eXBlXSk7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwkJYnJlYWs7CisJfQorCS8qIFRPRE86IGlmIHdlIGZhaWwgd2UgcHJvYmFibHkgbmVlZCB0byByZWluaXRpYWxpc2UKKwkgKiB0aGUgZHJpdmVyICovCisKKwlyZXR1cm4gZXJyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NTMsOCArODM1LDcgQEAKIAlpbnQgZXJyID0gMDsKIAl1MTYgdHhmaWQgPSBwcml2LT50eGZpZDsKIAlzdHJ1Y3QgZXRoaGRyICplaDsKLQlpbnQgZGF0YV9vZmY7Ci0Jc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIGRlc2M7CisJaW50IHR4X2NvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghIG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtNDg2LDIzICs4NjcsNTQgQEAKIAlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikKIAkJZ290byBkcm9wOwogCi0JZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwl0eF9jb250cm9sID0gSEVSTUVTX1RYQ1RSTF9UWF9PSyB8IEhFUk1FU19UWENUUkxfVFhfRVg7CiAKLQltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7Ci0gCWRlc2MudHhfY29udHJvbCA9IGNwdV90b19sZTE2KEhFUk1FU19UWENUUkxfVFhfT0sgfCBIRVJNRVNfVFhDVFJMX1RYX0VYKTsKLQllcnIgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksIHR4ZmlkLCAwKTsKLQlpZiAoZXJyKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIFR4IGRlc2NyaXB0b3IgIgotCQkJICAgICAgICJ0byBCQVBcbiIsIGRldi0+bmFtZSwgZXJyKTsKLQkJZ290byBidXN5OworCWlmIChwcml2LT5lbmNvZGVfYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKKwkJdHhfY29udHJvbCB8PSAocHJpdi0+dHhfa2V5IDw8IEhFUk1FU19NSUNfS0VZX0lEX1NISUZUKSB8CisJCQlIRVJNRVNfVFhDVFJMX01JQzsKKworCWlmIChwcml2LT5oYXNfYWx0X3R4Y250bCkgeworCQkvKiBXUEEgZW5hYmxlZCBmaXJtd2FyZXMgaGF2ZSB0eF9jbnRsIGF0IHRoZSBlbmQgb2YKKwkJICogdGhlIDgwMi4xMSBoZWFkZXIuICBTbyB3cml0ZSB6ZXJvZWQgZGVzY3JpcHRvciBhbmQKKwkJICogODAyLjExIGhlYWRlciBhdCB0aGUgc2FtZSB0aW1lCisJCSAqLworCQljaGFyIGRlc2NbSEVSTUVTXzgwMl8zX09GRlNFVF07CisJCV9fbGUxNiAqdHhjbnRsID0gKF9fbGUxNiAqKSAmZGVzY1tIRVJNRVNfVFhDTlRMMl9PRkZTRVRdOworCisJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCQkqdHhjbnRsID0gY3B1X3RvX2xlMTYodHhfY29udHJvbCk7CisJCWVyciA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwKKwkJCQkJdHhmaWQsIDApOworCQlpZiAoZXJyKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgVHggIgorCQkJCSAgICAgICAiZGVzY3JpcHRvciB0byBCQVBcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJCWdvdG8gYnVzeTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCisJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCQlkZXNjLnR4X2NvbnRyb2wgPSBjcHVfdG9fbGUxNih0eF9jb250cm9sKTsKKwkJZXJyID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCAmZGVzYywgc2l6ZW9mKGRlc2MpLAorCQkJCQl0eGZpZCwgMCk7CisJCWlmIChlcnIpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgd3JpdGluZyBUeCAiCisJCQkJICAgICAgICJkZXNjcmlwdG9yIHRvIEJBUFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQkJZ290byBidXN5OworCQl9CisKKwkJLyogQ2xlYXIgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGRhdGEgbGVuZ3RoIGZpZWxkcyAtIHNvbWUKKwkJICogZmlybXdhcmVzIChlLmcuIEx1Y2VudC9BZ2VyZSA4Lnh4KSBhcHBlYXIgdG8gZ2V0IGNvbmZ1c2VkCisJCSAqIGlmIHRoaXMgaXNuJ3QgZG9uZS4gKi8KKwkJaGVybWVzX2NsZWFyX3dvcmRzKGh3LCBIRVJNRVNfREFUQTAsCisJCQkJICAgSEVSTUVTXzgwMl8zX09GRlNFVCAtIEhFUk1FU184MDJfMTFfT0ZGU0VUKTsKIAl9CiAKLQkvKiBDbGVhciB0aGUgODAyLjExIGhlYWRlciBhbmQgZGF0YSBsZW5ndGggZmllbGRzIC0gc29tZQotCSAqIGZpcm13YXJlcyAoZS5nLiBMdWNlbnQvQWdlcmUgOC54eCkgYXBwZWFyIHRvIGdldCBjb25mdXNlZAotCSAqIGlmIHRoaXMgaXNuJ3QgZG9uZS4gKi8KLQloZXJtZXNfY2xlYXJfd29yZHMoaHcsIEhFUk1FU19EQVRBMCwKLQkJCSAgIEhFUk1FU184MDJfM19PRkZTRVQgLSBIRVJNRVNfODAyXzExX09GRlNFVCk7CisJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKIAogCS8qIEVuY2Fwc3VsYXRlIEV0aGVybmV0LUlJIGZyYW1lcyAqLwogCWlmIChudG9ocyhlaC0+aF9wcm90bykgPiBFVEhfREFUQV9MRU4pIHsgLyogRXRoZXJuZXQtSUkgZnJhbWUgKi8KQEAgLTUxMywzMyArOTI1LDY1IEBACiAKIAkJLyogU3RyaXAgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBmcm9tIHRoZSBkYXRhICovCiAJCXNrYl9wdWxsKHNrYiwgMiAqIEVUSF9BTEVOKTsKLQkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzJfT0ZGU0VUICsgc2l6ZW9mKGVuY2Fwc19oZHIpOwogCiAJCS8qIEFuZCBtb3ZlIHRoZW0gdG8gYSBzZXBhcmF0ZSBoZWFkZXIgKi8KIAkJbWVtY3B5KCZoZHIuZXRoLCBlaCwgMiAqIEVUSF9BTEVOKTsKIAkJaGRyLmV0aC5oX3Byb3RvID0gaHRvbnMoc2l6ZW9mKGVuY2Fwc19oZHIpICsgc2tiLT5sZW4pOwogCQltZW1jcHkoaGRyLmVuY2FwLCBlbmNhcHNfaGRyLCBzaXplb2YoZW5jYXBzX2hkcikpOwogCi0JCWVyciA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgJmhkciwgc2l6ZW9mKGhkciksCi0JCQkJCXR4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUKTsKLQkJaWYgKGVycikgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIHBhY2tldCAiCi0JCQkJICAgICAgICJoZWFkZXIgdG8gQkFQXG4iLCBkZXYtPm5hbWUsIGVycik7Ci0JCQlnb3RvIGJ1c3k7CisJCS8qIEluc2VydCB0aGUgU05BUCBoZWFkZXIgKi8KKwkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgc2l6ZW9mKGhkcikpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogTm90IGVub3VnaCBoZWFkcm9vbSBmb3IgODAyLjIgaGVhZGVycyAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHNrYl9oZWFkcm9vbShza2IpKTsKKwkJCWdvdG8gZHJvcDsKIAkJfQotCX0gZWxzZSB7IC8qIElFRUUgODAyLjMgZnJhbWUgKi8KLQkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUOworCQllaCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKGhkcikpOworCQltZW1jcHkoZWgsICZoZHIsIHNpemVvZihoZHIpKTsKIAl9CiAKIAllcnIgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJdHhmaWQsIGRhdGFfb2ZmKTsKKwkJCQl0eGZpZCwgSEVSTUVTXzgwMl8zX09GRlNFVCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIHBhY2tldCB0byBCQVBcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CiAJCWdvdG8gYnVzeTsKIAl9CiAKKwkvKiBDYWxjdWxhdGUgTWljaGFlbCBNSUMgKi8KKwlpZiAocHJpdi0+ZW5jb2RlX2FsZyA9PSBJV19FTkNPREVfQUxHX1RLSVApIHsKKwkJdTggbWljX2J1ZltNSUNIQUVMX01JQ19MRU4gKyAxXTsKKwkJdTggKm1pYzsKKwkJc2l6ZV90IG9mZnNldDsKKwkJc2l6ZV90IGxlbjsKKworCQlpZiAoc2tiLT5sZW4gJSAyKSB7CisJCQkvKiBNSUMgc3RhcnQgaXMgb24gYW4gb2RkIGJvdW5kYXJ5ICovCisJCQltaWNfYnVmWzBdID0gc2tiLT5kYXRhW3NrYi0+bGVuIC0gMV07CisJCQltaWMgPSAmbWljX2J1ZlsxXTsKKwkJCW9mZnNldCA9IHNrYi0+bGVuIC0gMTsKKwkJCWxlbiA9IE1JQ0hBRUxfTUlDX0xFTiArIDE7CisJCX0gZWxzZSB7CisJCQltaWMgPSAmbWljX2J1ZlswXTsKKwkJCW9mZnNldCA9IHNrYi0+bGVuOworCQkJbGVuID0gTUlDSEFFTF9NSUNfTEVOOworCQl9CisKKwkJbWljaGFlbF9taWMocHJpdi0+dHhfdGZtX21pYywKKwkJCSAgICBwcml2LT50a2lwX2tleVtwcml2LT50eF9rZXldLnR4X21pYywKKwkJCSAgICBlaC0+aF9kZXN0LCBlaC0+aF9zb3VyY2UsIDAgLyogcHJpb3JpdHkgKi8sCisJCQkgICAgc2tiLT5kYXRhICsgRVRIX0hMRU4sIHNrYi0+bGVuIC0gRVRIX0hMRU4sIG1pYyk7CisKKwkJLyogV3JpdGUgdGhlIE1JQyAqLworCQllcnIgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsICZtaWNfYnVmWzBdLCBsZW4sCisJCQkJCXR4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUICsgb2Zmc2V0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgd3JpdGluZyBNSUMgdG8gQkFQXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCWdvdG8gYnVzeTsKKwkJfQorCX0KKwogCS8qIEZpbmFsbHksIHdlIGFjdHVhbGx5IGluaXRpYXRlIHRoZSBzZW5kICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCkBAIC01NTQsNyArOTk4LDcgQEAKIAl9CiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQlzdGF0cy0+dHhfYnl0ZXMgKz0gZGF0YV9vZmYgKyBza2ItPmxlbjsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gSEVSTUVTXzgwMl8zX09GRlNFVCArIHNrYi0+bGVuOwogCWdvdG8gb2s7CiAKICBkcm9wOgpAQCAtODM0LDIxICsxMjc4LDQ4IEBACiAJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKIH0KIAorLyogR2V0IHRzYyBmcm9tIHRoZSBmaXJtd2FyZSAqLworc3RhdGljIGludCBvcmlub2NvX2h3X2dldF90a2lwX2l2KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCBrZXksCisJCQkJICB1OCAqdHNjKQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1OCB0c2NfYXJyWzRdW0lXX0VOQ09ERV9TRVFfTUFYX1NJWkVdOworCisJaWYgKChrZXkgPCAwKSB8fCAoa2V5ID4gNCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UX1RLSVBfSVYsCisJCQkgICAgICBzaXplb2YodHNjX2FyciksIE5VTEwsICZ0c2NfYXJyKTsKKwlpZiAoIWVycikKKwkJbWVtY3B5KHRzYywgJnRzY19hcnJba2V5XVswXSwgc2l6ZW9mKHRzY19hcnJbMF0pKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXUxNiByeGZpZCwgc3RhdHVzLCBmYzsKKwl1MTYgcnhmaWQsIHN0YXR1czsKIAlpbnQgbGVuZ3RoOwotCXN0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciBkZXNjOwotCXN0cnVjdCBldGhoZHIgKmhkcjsKKwlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IG9yaW5vY29fcnhfZGF0YSAqcnhfZGF0YTsKIAlpbnQgZXJyOwogCisJZGVzYyA9IGttYWxsb2Moc2l6ZW9mKCpkZXNjKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkZXNjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogQ2FuJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIFJYIGRlc2NyaXB0b3JcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIHVwZGF0ZV9zdGF0czsKKwl9CisKIAlyeGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJYRklEKTsKIAotCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgZGVzYywgc2l6ZW9mKCpkZXNjKSwKIAkJCSAgICAgICByeGZpZCwgMCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIFJ4IGRlc2NyaXB0b3IuICIKQEAgLTg1Niw3ICsxMzI3LDcgQEAKIAkJZ290byB1cGRhdGVfc3RhdHM7CiAJfQogCi0Jc3RhdHVzID0gbGUxNl90b19jcHUoZGVzYy5zdGF0dXMpOworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9CQURDUkMpIHsKIAkJREVCVUcoMSwgIiVzOiBCYWQgQ1JDIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwKQEAgLTg2Nyw4ICsxMzM4LDggQEAKIAogCS8qIEhhbmRsZSBmcmFtZXMgaW4gbW9uaXRvciBtb2RlICovCiAJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCW9yaW5vY29fcnhfbW9uaXRvcihkZXYsIHJ4ZmlkLCAmZGVzYyk7Ci0JCXJldHVybjsKKwkJb3Jpbm9jb19yeF9tb25pdG9yKGRldiwgcnhmaWQsIGRlc2MpOworCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9VTkRFQ1JZUFRBQkxFKSB7CkBAIC04NzgsMTUgKzEzNDksMTQgQEAKIAkJZ290byB1cGRhdGVfc3RhdHM7CiAJfQogCi0JbGVuZ3RoID0gbGUxNl90b19jcHUoZGVzYy5kYXRhX2xlbik7Ci0JZmMgPSBsZTE2X3RvX2NwdShkZXNjLmZyYW1lX2N0bCk7CisJbGVuZ3RoID0gbGUxNl90b19jcHUoZGVzYy0+ZGF0YV9sZW4pOwogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCWlmIChsZW5ndGggPCAzKSB7IC8qIE5vIGZvciBldmVuIGFuIDgwMi4yIExMQyBoZWFkZXIgKi8KIAkJLyogQXQgbGVhc3Qgb24gU3ltYm9sIGZpcm13YXJlIHdpdGggUENGIHdlIGdldCBxdWl0ZSBhCiAgICAgICAgICAgICAgICAgICAgbG90IG9mIHRoZXNlIGxlZ2l0aW1hdGVseSAtIFBvbGwgZnJhbWVzIHdpdGggbm8KICAgICAgICAgICAgICAgICAgICBkYXRhLiAqLwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAlpZiAobGVuZ3RoID4gSUVFRTgwMjExX0RBVEFfTEVOKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgZnJhbWUgcmVjZWl2ZWQgKCVkIGJ5dGVzKVxuIiwKQEAgLTg5NSw2ICsxMzY1LDExIEBACiAJCWdvdG8gdXBkYXRlX3N0YXRzOwogCX0KIAorCS8qIFBheWxvYWQgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIE1pY2hhZWwgTUlDLiBJbmNyZWFzZSBwYXlsb2FkCisJICogc2l6ZSB0byByZWFkIGl0IHRvZ2V0aGVyIHdpdGggdGhlIGRhdGEuICovCisJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfTUlDKQorCQlsZW5ndGggKz0gTUlDSEFFTF9NSUNfTEVOOworCiAJLyogV2UgbmVlZCBzcGFjZSBmb3IgdGhlIHBhY2tldCBkYXRhIGl0c2VsZiwgcGx1cyBhbiBldGhlcm5ldAogCSAgIGhlYWRlciwgcGx1cyAyIGJ5dGVzIHNvIHdlIGNhbiBhbGlnbiB0aGUgSVAgaGVhZGVyIG9uIGEKIAkgICAzMmJpdCBib3VuZGFyeSwgcGx1cyAxIGJ5dGUgc28gd2UgY2FuIHJlYWQgaW4gb2RkIGxlbmd0aApAQCAtOTIxLDYgKzEzOTYsMTAwIEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKKwkvKiBBZGQgZGVzYyBhbmQgc2tiIHRvIHJ4IHF1ZXVlICovCisJcnhfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpyeF9kYXRhKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFyeF9kYXRhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvY2F0ZSBSWCBwYWNrZXRcbiIsCisJCQlkZXYtPm5hbWUpOworCQlnb3RvIGRyb3A7CisJfQorCXJ4X2RhdGEtPmRlc2MgPSBkZXNjOworCXJ4X2RhdGEtPnNrYiA9IHNrYjsKKwlsaXN0X2FkZF90YWlsKCZyeF9kYXRhLT5saXN0LCAmcHJpdi0+cnhfbGlzdCk7CisJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+cnhfdGFza2xldCk7CisKKwlyZXR1cm47CisKK2Ryb3A6CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKK3VwZGF0ZV9zdGF0czoKKwlzdGF0cy0+cnhfZXJyb3JzKys7CisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKK291dDoKKwlrZnJlZShkZXNjKTsKK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjLAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJdTE2IHN0YXR1cywgZmM7CisJaW50IGxlbmd0aDsKKwlzdHJ1Y3QgZXRoaGRyICpoZHI7CisKKwlzdGF0dXMgPSBsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMpOworCWxlbmd0aCA9IGxlMTZfdG9fY3B1KGRlc2MtPmRhdGFfbGVuKTsKKwlmYyA9IGxlMTZfdG9fY3B1KGRlc2MtPmZyYW1lX2N0bCk7CisKKwkvKiBDYWxjdWxhdGUgYW5kIGNoZWNrIE1JQyAqLworCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01JQykgeworCQlpbnQga2V5X2lkID0gKChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX01JQ19LRVlfSUQpID4+CisJCQkgICAgICBIRVJNRVNfTUlDX0tFWV9JRF9TSElGVCk7CisJCXU4IG1pY1tNSUNIQUVMX01JQ19MRU5dOworCQl1OCAqcnhtaWM7CisJCXU4ICpzcmMgPSAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpID8KKwkJCWRlc2MtPmFkZHIzIDogZGVzYy0+YWRkcjI7CisKKwkJLyogRXh0cmFjdCBNaWNoYWVsIE1JQyBmcm9tIHBheWxvYWQgKi8KKwkJcnhtaWMgPSBza2ItPmRhdGEgKyBza2ItPmxlbiAtIE1JQ0hBRUxfTUlDX0xFTjsKKworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gTUlDSEFFTF9NSUNfTEVOKTsKKwkJbGVuZ3RoIC09IE1JQ0hBRUxfTUlDX0xFTjsKKworCQltaWNoYWVsX21pYyhwcml2LT5yeF90Zm1fbWljLAorCQkJICAgIHByaXYtPnRraXBfa2V5W2tleV9pZF0ucnhfbWljLAorCQkJICAgIGRlc2MtPmFkZHIxLAorCQkJICAgIHNyYywKKwkJCSAgICAwLCAvKiBwcmlvcml0eSBvciBRb1M/ICovCisJCQkgICAgc2tiLT5kYXRhLAorCQkJICAgIHNrYi0+bGVuLAorCQkJICAgICZtaWNbMF0pOworCisJCWlmIChtZW1jbXAobWljLCByeG1pYywKKwkJCSAgIE1JQ0hBRUxfTUlDX0xFTikpIHsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkJCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSB3eG1pYzsKKwkJCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogIgorCQkJICAgICAgICJJbnZhbGlkIE1pY2hhZWwgTUlDIGluIGRhdGEgZnJhbWUgZnJvbSAlcywgIgorCQkJICAgICAgICJ1c2luZyBrZXkgJWlcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBzcmMpLCBrZXlfaWQpOworCisJCQkvKiBUT0RPOiB1cGRhdGUgc3RhdHMgKi8KKworCQkJLyogTm90aWZ5IHVzZXJzcGFjZSAqLworCQkJbWVtc2V0KCZ3eG1pYywgMCwgc2l6ZW9mKHd4bWljKSk7CisJCQl3eG1pYy5mbGFncyA9IGtleV9pZCAmIElXX01JQ0ZBSUxVUkVfS0VZX0lEOworCQkJd3htaWMuZmxhZ3MgfD0gKGRlc2MtPmFkZHIxWzBdICYgMSkgPworCQkJCUlXX01JQ0ZBSUxVUkVfR1JPVVAgOiBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworCQkJd3htaWMuc3JjX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJbWVtY3B5KHd4bWljLnNyY19hZGRyLnNhX2RhdGEsIHNyYywgRVRIX0FMRU4pOworCisJCQkodm9pZCkgb3Jpbm9jb19od19nZXRfdGtpcF9pdihwcml2LCBrZXlfaWQsCisJCQkJCQkgICAgICAmd3htaWMudHNjWzBdKTsKKworCQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQkJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZih3eG1pYyk7CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwKKwkJCQkJICAgIChjaGFyICopICZ3eG1pYyk7CisKKwkJCWdvdG8gZHJvcDsKKwkJfQorCX0KKwogCS8qIEhhbmRsZSBkZWNhcHN1bGF0aW9uCiAJICogSW4gbW9zdCBjYXNlcywgdGhlIGZpcm13YXJlIHRlbGwgdXMgYWJvdXQgU05BUCBmcmFtZXMuCiAJICogRm9yIHNvbWUgcmVhc29uLCB0aGUgU05BUCBmcmFtZXMgc2VudCBieSBMaW5rU3lzIEFQcwpAQCAtOTM5LDExICsxNTA4LDExIEBACiAJCWhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CiAJCWhkci0+aF9wcm90byA9IGh0b25zKGxlbmd0aCk7CiAJfQotCW1lbWNweShoZHItPmhfZGVzdCwgZGVzYy5hZGRyMSwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmhfZGVzdCwgZGVzYy0+YWRkcjEsIEVUSF9BTEVOKTsKIAlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpCi0JCW1lbWNweShoZHItPmhfc291cmNlLCBkZXNjLmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShoZHItPmhfc291cmNlLCBkZXNjLT5hZGRyMywgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtY3B5KGhkci0+aF9zb3VyY2UsIGRlc2MuYWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGhkci0+aF9zb3VyY2UsIGRlc2MtPmFkZHIyLCBFVEhfQUxFTik7CiAKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CkBAIC05NTIsNyArMTUyMSw3IEBACiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwogCQogCS8qIFByb2Nlc3MgdGhlIHdpcmVsZXNzIHN0YXRzIGlmIG5lZWRlZCAqLwotCW9yaW5vY29fc3RhdF9nYXRoZXIoZGV2LCBza2IsICZkZXNjKTsKKwlvcmlub2NvX3N0YXRfZ2F0aGVyKGRldiwgc2tiLCBkZXNjKTsKIAogCS8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgbmV0d29ya2luZyBzdGFjayAqLwogCW5ldGlmX3J4KHNrYik7CkBAIC05NjEsMTMgKzE1MzAsMzMgQEAKIAogCXJldHVybjsKIAotIGRyb3A6CQotCWRldl9rZnJlZV9za2JfaXJxKHNrYik7Ci0gdXBkYXRlX3N0YXRzOgorIGRyb3A6CisJZGV2X2tmcmVlX3NrYihza2IpOwogCXN0YXRzLT5yeF9lcnJvcnMrKzsKIAlzdGF0cy0+cnhfZHJvcHBlZCsrOwogfQogCitzdGF0aWMgdm9pZCBvcmlub2NvX3J4X2lzcl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcnhfZGF0YSAqcnhfZGF0YSwgKnRlbXA7CisJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBleHRyYWN0IGRlc2MgYW5kIHNrYiBmcm9tIHF1ZXVlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ4X2RhdGEsIHRlbXAsICZwcml2LT5yeF9saXN0LCBsaXN0KSB7CisJCWRlc2MgPSByeF9kYXRhLT5kZXNjOworCQlza2IgPSByeF9kYXRhLT5za2I7CisJCWxpc3RfZGVsKCZyeF9kYXRhLT5saXN0KTsKKwkJa2ZyZWUocnhfZGF0YSk7CisKKwkJb3Jpbm9jb19yeChkZXYsIGRlc2MsIHNrYik7CisKKwkJa2ZyZWUoZGVzYyk7CisJfQorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSeCBwYXRoIChpbmZvIGZyYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDg3LDQ5ICsxNjc2LDE2OSBAQAogfQogCiAvKiBTZW5kIG5ldyBCU1NJRCB0byB1c2Vyc3BhY2UgKi8KLXN0YXRpYyB2b2lkIG9yaW5vY29fc2VuZF93ZXZlbnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIG9yaW5vY29fc2VuZF9ic3NpZF93ZXZlbnQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKIHsKLQlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUsIHdldmVudF93b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmRldjsKIAlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJaW50IGVycjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCXJldHVybjsKIAogCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgSVJRX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQsCiAJCQkgICAgICBFVEhfQUxFTiwgTlVMTCwgd3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCWlmIChlcnIgIT0gMCkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAKIAkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KIAl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLSBvdXQ6Ci0Jb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgb3Jpbm9jb19zZW5kX2Fzc29jcmVxaWVfd2V2ZW50KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5kZXY7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCBlcnI7CisJdTggYnVmWzg4XTsKKwl1OCAqaWU7CisKKwlpZiAoIXByaXYtPmhhc193cGEpCisJCXJldHVybjsKKworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgSVJRX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UX0FTU09DX1JFUV9JTkZPLAorCQkJICAgICAgc2l6ZW9mKGJ1ZiksIE5VTEwsICZidWYpOworCWlmIChlcnIgIT0gMCkKKwkJcmV0dXJuOworCisJaWUgPSBvcmlub2NvX2dldF93cGFfaWUoYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKGllKSB7CisJCWludCByZW0gPSBzaXplb2YoYnVmKSAtIChpZSAtICZidWZbMF0pOworCQl3cnF1LmRhdGEubGVuZ3RoID0gaWVbMV0gKyAyOworCQlpZiAod3JxdS5kYXRhLmxlbmd0aCA+IHJlbSkKKwkJCXdycXUuZGF0YS5sZW5ndGggPSByZW07CisKKwkJaWYgKHdycXUuZGF0YS5sZW5ndGgpCisJCQkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQVNTT0NSRVFJRSwgJndycXUsIGllKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fc2VuZF9hc3NvY3Jlc3BpZV93ZXZlbnQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmRldjsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJaW50IGVycjsKKwl1OCBidWZbODhdOyAvKiBUT0RPOiB2ZXJpZnkgbWF4IHNpemUgb3IgSVdfR0VORVJJQ19JRV9NQVggKi8KKwl1OCAqaWU7CisKKwlpZiAoIXByaXYtPmhhc193cGEpCisJCXJldHVybjsKKworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgSVJRX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UX0FTU09DX1JFU1BfSU5GTywKKwkJCSAgICAgIHNpemVvZihidWYpLCBOVUxMLCAmYnVmKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybjsKKworCWllID0gb3Jpbm9jb19nZXRfd3BhX2llKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChpZSkgeworCQlpbnQgcmVtID0gc2l6ZW9mKGJ1ZikgLSAoaWUgLSAmYnVmWzBdKTsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IGllWzFdICsgMjsKKwkJaWYgKHdycXUuZGF0YS5sZW5ndGggPiByZW0pCisJCQl3cnF1LmRhdGEubGVuZ3RoID0gcmVtOworCisJCWlmICh3cnF1LmRhdGEubGVuZ3RoKQorCQkJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkFTU09DUkVTUElFLCAmd3JxdSwgaWUpOworCX0KK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb19zZW5kX3dldmVudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9yaW5vY29fcHJpdmF0ZSwgd2V2ZW50X3dvcmspOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuOworCisJb3Jpbm9jb19zZW5kX2Fzc29jcmVxaWVfd2V2ZW50KHByaXYpOworCW9yaW5vY29fc2VuZF9hc3NvY3Jlc3BpZV93ZXZlbnQocHJpdik7CisJb3Jpbm9jb19zZW5kX2Jzc2lkX3dldmVudChwcml2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvcmlub2NvX2NsZWFyX3NjYW5fcmVzdWx0cyhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNjYW5fYWdlKQogewotCWJzc19lbGVtZW50ICpic3M7Ci0JYnNzX2VsZW1lbnQgKnRtcF9ic3M7CisJaWYgKHByaXYtPmhhc19leHRfc2NhbikgeworCQlzdHJ1Y3QgeGJzc19lbGVtZW50ICpic3M7CisJCXN0cnVjdCB4YnNzX2VsZW1lbnQgKnRtcF9ic3M7CiAKLQkvKiBCbG93IGF3YXkgY3VycmVudCBsaXN0IG9mIHNjYW4gcmVzdWx0cyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShic3MsIHRtcF9ic3MsICZwcml2LT5ic3NfbGlzdCwgbGlzdCkgewotCQlpZiAoIXNjYW5fYWdlIHx8Ci0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGJzcy0+bGFzdF9zY2FubmVkICsgc2Nhbl9hZ2UpKSB7Ci0JCQlsaXN0X21vdmVfdGFpbCgmYnNzLT5saXN0LCAmcHJpdi0+YnNzX2ZyZWVfbGlzdCk7Ci0JCQkvKiBEb24ndCBibG93IGF3YXkgLT5saXN0LCBqdXN0IEJTUyBkYXRhICovCi0JCQltZW1zZXQoYnNzLCAwLCBzaXplb2YoYnNzLT5ic3MpKTsKLQkJCWJzcy0+bGFzdF9zY2FubmVkID0gMDsKKwkJLyogQmxvdyBhd2F5IGN1cnJlbnQgbGlzdCBvZiBzY2FuIHJlc3VsdHMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJzcywgdG1wX2JzcywgJnByaXYtPmJzc19saXN0LCBsaXN0KSB7CisJCQlpZiAoIXNjYW5fYWdlIHx8CisJCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBic3MtPmxhc3Rfc2Nhbm5lZCArIHNjYW5fYWdlKSkgeworCQkJCWxpc3RfbW92ZV90YWlsKCZic3MtPmxpc3QsCisJCQkJCSAgICAgICAmcHJpdi0+YnNzX2ZyZWVfbGlzdCk7CisJCQkJLyogRG9uJ3QgYmxvdyBhd2F5IC0+bGlzdCwganVzdCBCU1MgZGF0YSAqLworCQkJCW1lbXNldCgmYnNzLT5ic3MsIDAsIHNpemVvZihic3MtPmJzcykpOworCQkJCWJzcy0+bGFzdF9zY2FubmVkID0gMDsKKwkJCX0KIAkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBic3NfZWxlbWVudCAqYnNzOworCQlzdHJ1Y3QgYnNzX2VsZW1lbnQgKnRtcF9ic3M7CisKKwkJLyogQmxvdyBhd2F5IGN1cnJlbnQgbGlzdCBvZiBzY2FuIHJlc3VsdHMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJzcywgdG1wX2JzcywgJnByaXYtPmJzc19saXN0LCBsaXN0KSB7CisJCQlpZiAoIXNjYW5fYWdlIHx8CisJCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBic3MtPmxhc3Rfc2Nhbm5lZCArIHNjYW5fYWdlKSkgeworCQkJCWxpc3RfbW92ZV90YWlsKCZic3MtPmxpc3QsCisJCQkJCSAgICAgICAmcHJpdi0+YnNzX2ZyZWVfbGlzdCk7CisJCQkJLyogRG9uJ3QgYmxvdyBhd2F5IC0+bGlzdCwganVzdCBCU1MgZGF0YSAqLworCQkJCW1lbXNldCgmYnNzLT5ic3MsIDAsIHNpemVvZihic3MtPmJzcykpOworCQkJCWJzcy0+bGFzdF9zY2FubmVkID0gMDsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb19hZGRfZXh0X3NjYW5fcmVzdWx0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJCXN0cnVjdCBhZ2VyZV9leHRfc2Nhbl9pbmZvICphdG9tKQoreworCXN0cnVjdCB4YnNzX2VsZW1lbnQgKmJzcyA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCS8qIFRyeSB0byB1cGRhdGUgYW4gZXhpc3RpbmcgYnNzIGZpcnN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShic3MsICZwcml2LT5ic3NfbGlzdCwgbGlzdCkgeworCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGJzcy0+YnNzLmJzc2lkLCBhdG9tLT5ic3NpZCkpCisJCQljb250aW51ZTsKKwkJLyogRVNTSUQgbGVuZ3RocyAqLworCQlpZiAoYnNzLT5ic3MuZGF0YVsxXSAhPSBhdG9tLT5kYXRhWzFdKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAoJmJzcy0+YnNzLmRhdGFbMl0sICZhdG9tLT5kYXRhWzJdLAorCQkJICAgYXRvbS0+ZGF0YVsxXSkpCisJCQljb250aW51ZTsKKwkJZm91bmQgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBHcmFiIGEgYnNzIG9mZiB0aGUgZnJlZSBsaXN0ICovCisJaWYgKCFmb3VuZCAmJiAhbGlzdF9lbXB0eSgmcHJpdi0+YnNzX2ZyZWVfbGlzdCkpIHsKKwkJYnNzID0gbGlzdF9lbnRyeShwcml2LT5ic3NfZnJlZV9saXN0Lm5leHQsCisJCQkJIHN0cnVjdCB4YnNzX2VsZW1lbnQsIGxpc3QpOworCQlsaXN0X2RlbChwcml2LT5ic3NfZnJlZV9saXN0Lm5leHQpOworCisJCWxpc3RfYWRkX3RhaWwoJmJzcy0+bGlzdCwgJnByaXYtPmJzc19saXN0KTsKKwl9CisKKwlpZiAoYnNzKSB7CisJCS8qIEFsd2F5cyB1cGRhdGUgdGhlIEJTUyB0byBnZXQgbGF0ZXN0IGJlYWNvbiBpbmZvICovCisJCW1lbWNweSgmYnNzLT5ic3MsIGF0b20sIHNpemVvZihic3MtPmJzcykpOworCQlic3MtPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CiAJfQogfQogCkBAIC0xMTk0LDcgKzE5MDMsNyBAQAogCS8qIFJlYWQgdGhlIGVudHJpZXMgb25lIGJ5IG9uZSAqLwogCWZvciAoOyBvZmZzZXQgKyBhdG9tX2xlbiA8PSBsZW47IG9mZnNldCArPSBhdG9tX2xlbikgewogCQlpbnQgZm91bmQgPSAwOwotCQlic3NfZWxlbWVudCAqYnNzID0gTlVMTDsKKwkJc3RydWN0IGJzc19lbGVtZW50ICpic3MgPSBOVUxMOwogCiAJCS8qIEdldCBuZXh0IGF0b20gKi8KIAkJYXRvbSA9ICh1bmlvbiBoZXJtZXNfc2Nhbl9pbmZvICopIChidWYgKyBvZmZzZXQpOwpAQCAtMTIxNiw3ICsxOTI1LDcgQEAKIAkJLyogR3JhYiBhIGJzcyBvZmYgdGhlIGZyZWUgbGlzdCAqLwogCQlpZiAoIWZvdW5kICYmICFsaXN0X2VtcHR5KCZwcml2LT5ic3NfZnJlZV9saXN0KSkgewogCQkJYnNzID0gbGlzdF9lbnRyeShwcml2LT5ic3NfZnJlZV9saXN0Lm5leHQsCi0JCQkJCSBic3NfZWxlbWVudCwgbGlzdCk7CisJCQkJCSBzdHJ1Y3QgYnNzX2VsZW1lbnQsIGxpc3QpOwogCQkJbGlzdF9kZWwocHJpdi0+YnNzX2ZyZWVfbGlzdC5uZXh0KTsKIAogCQkJbGlzdF9hZGRfdGFpbCgmYnNzLT5saXN0LCAmcHJpdi0+YnNzX2xpc3QpOwpAQCAtMTQwNCw2ICsyMTEzLDYzIEBACiAJCWtmcmVlKGJ1Zik7CiAJfQogCWJyZWFrOworCWNhc2UgSEVSTUVTX0lOUV9DSEFOTkVMSU5GTzoKKwl7CisJCXN0cnVjdCBhZ2VyZV9leHRfc2Nhbl9pbmZvICpic3M7CisKKwkJaWYgKCFwcml2LT5zY2FuX2lucHJvZ3Jlc3MpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogR290IGNoYW5pbmZvIHdpdGhvdXQgc2NhbiwgIgorCQkJICAgICAgICJsZW49JWRcbiIsIGRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQW4gZW1wdHkgcmVzdWx0IGluZGljYXRlcyB0aGF0IHRoZSBzY2FuIGlzIGNvbXBsZXRlICovCisJCWlmIChsZW4gPT0gMCkgeworCQkJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCisJCQkvKiBTY2FuIGlzIG5vIGxvbmdlciBpbiBwcm9ncmVzcyAqLworCQkJcHJpdi0+c2Nhbl9pbnByb2dyZXNzID0gMDsKKworCQkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSAwOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNhbml0eSBjaGVjayAqLworCQllbHNlIGlmIChsZW4gPiBzaXplb2YoKmJzcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEV4dCBzY2FuIHJlc3VsdHMgdG9vIGxhcmdlICglZCBieXRlcykuICIKKwkJCSAgICAgICAiVHJ1bmNhdGluZyByZXN1bHRzIHRvICV6ZCBieXRlcy5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsZW4sIHNpemVvZigqYnNzKSk7CisJCQlsZW4gPSBzaXplb2YoKmJzcyk7CisJCX0gZWxzZSBpZiAobGVuIDwgKG9mZnNldG9mKHN0cnVjdCBhZ2VyZV9leHRfc2Nhbl9pbmZvLAorCQkJCQkgICBkYXRhKSArIDIpKSB7CisJCQkvKiBEcm9wIHRoaXMgcmVzdWx0IG5vdyBzbyB3ZSBkb24ndCBoYXZlIHRvCisJCQkgKiBrZWVwIGNoZWNraW5nIGxhdGVyICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBFeHQgc2NhbiByZXN1bHRzIHRvbyBzaG9ydCAoJWQgYnl0ZXMpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnNzID0ga21hbGxvYyhzaXplb2YoKmJzcyksIEdGUF9BVE9NSUMpOworCQlpZiAoYnNzID09IE5VTEwpCisJCQlicmVhazsKKworCQkvKiBSZWFkIHNjYW4gZGF0YSAqLworCQllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAodm9pZCAqKSBic3MsIGxlbiwKKwkJCQkgICAgICAgaW5mb2ZpZCwgc2l6ZW9mKGluZm8pKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUoYnNzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJb3Jpbm9jb19hZGRfZXh0X3NjYW5fcmVzdWx0KHByaXYsIGJzcyk7CisKKwkJa2ZyZWUoYnNzKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgSEVSTUVTX0lOUV9TRUNfU1RBVF9BR0VSRToKIAkJLyogU2VjdXJpdHkgc3RhdHVzIChBZ2VyZSBzcGVjaWZpYykgKi8KIAkJLyogSWdub3JlIHRoaXMgZnJhbWUgZm9yIG5vdyAqLwpAQCAtMTU4Niw3ICsyMzUyLDcgQEAKIH0KIAogLyogQ2hhbmdlIHRoZSBXRVAga2V5cyBhbmQvb3IgdGhlIGN1cnJlbnQga2V5cy4gIENhbiBiZSBjYWxsZWQKLSAqIGVpdGhlciBmcm9tIF9fb3Jpbm9jb19od19zZXR1cF93ZXAoKSBvciBkaXJlY3RseSBmcm9tCisgKiBlaXRoZXIgZnJvbSBfX29yaW5vY29faHdfc2V0dXBfZW5jKCkgb3IgZGlyZWN0bHkgZnJvbQogICogb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZSgpLiAgSW4gdGhlIGxhdGVyIGNhc2UgdGhlIGFzc29jaWF0aW9uCiAgKiB3aXRoIHRoZSBBUCBpcyBub3QgYnJva2VuIChpZiB0aGUgZmlybXdhcmUgY2FuIGhhbmRsZSBpdCksCiAgKiB3aGljaCBpcyBuZWVkZWQgZm9yIDgwMi4xeCBpbXBsZW1lbnRhdGlvbnMuICovCkBAIC0xNjQ2LDE0ICsyNDEyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19vcmlub2NvX2h3X3NldHVwX3dlcChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQorc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0dXBfZW5jKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCiB7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnIgPSAwOwogCWludCBtYXN0ZXJfd2VwX2ZsYWc7CiAJaW50IGF1dGhfZmxhZzsKKwlpbnQgZW5jX2ZsYWc7CiAKLQlpZiAocHJpdi0+d2VwX29uKQorCS8qIFNldHVwIFdFUCBrZXlzIGZvciBXRVAgYW5kIFdQQSAqLworCWlmIChwcml2LT5lbmNvZGVfYWxnKQogCQlfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhwcml2KTsKIAogCWlmIChwcml2LT53ZXBfcmVzdHJpY3QpCkBAIC0xNjYxLDkgKzI0MjksMTYgQEAKIAllbHNlCiAJCWF1dGhfZmxhZyA9IEhFUk1FU19BVVRIX09QRU47CiAKKwlpZiAocHJpdi0+d3BhX2VuYWJsZWQpCisJCWVuY19mbGFnID0gMjsKKwllbHNlIGlmIChwcml2LT5lbmNvZGVfYWxnID09IElXX0VOQ09ERV9BTEdfV0VQKQorCQllbmNfZmxhZyA9IDE7CisJZWxzZQorCQllbmNfZmxhZyA9IDA7CisKIAlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKIAljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6IC8qIEFnZXJlIHN0eWxlIFdFUCAqLwotCQlpZiAocHJpdi0+d2VwX29uKSB7CisJCWlmIChwcml2LT5lbmNvZGVfYWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CiAJCQkvKiBFbmFibGUgdGhlIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24uICovCiAJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCiAJCQkJCQkgICBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0FHRVJFLApAQCAtMTY3MSwxNCArMjQ0NiwyNCBAQAogCQl9CiAJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKIAkJCQkJICAgSEVSTUVTX1JJRF9DTkZXRVBFTkFCTEVEX0FHRVJFLAotCQkJCQkgICBwcml2LT53ZXBfb24pOworCQkJCQkgICBlbmNfZmxhZyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCisJCWlmIChwcml2LT5oYXNfd3BhKSB7CisJCQkvKiBTZXQgV1BBIGtleSBtYW5hZ2VtZW50ICovCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJICBIRVJNRVNfUklEX0NORlNFVFdQQUFVVEhNR01UU1VJVEVfQUdFUkUsCisJCQkJICBwcml2LT5rZXlfbWdtdCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwogCQlicmVhazsKIAogCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDogLyogSW50ZXJzaWwgc3R5bGUgV0VQICovCiAJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDogLyogU3ltYm9sIHN0eWxlIFdFUCAqLwotCQlpZiAocHJpdi0+d2VwX29uKSB7CisJCWlmIChwcml2LT5lbmNvZGVfYWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CiAJCQlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0IHx8CiAJCQkgICAgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9TWU1CT0wpKQogCQkJCW1hc3Rlcl93ZXBfZmxhZyA9IEhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VEIHwKQEAgLTE3MTAsNiArMjQ5NSw4NCBAQAogCXJldHVybiAwOwogfQogCisvKiBrZXkgbXVzdCBiZSAzMiBieXRlcywgaW5jbHVkaW5nIHRoZSB0eCBhbmQgcnggTUlDIGtleXMuCisgKiByc2MgbXVzdCBiZSA4IGJ5dGVzCisgKiB0c2MgbXVzdCBiZSA4IGJ5dGVzIG9yIE5VTEwKKyAqLworc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0X3RraXBfa2V5KGhlcm1lc190ICpodywgaW50IGtleV9pZHgsIGludCBzZXRfdHgsCisJCQkJICAgICB1OCAqa2V5LCB1OCAqcnNjLCB1OCAqdHNjKQoreworCXN0cnVjdCB7CisJCV9fbGUxNiBpZHg7CisJCXU4IHJzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXTsKKwkJdTgga2V5W1RLSVBfS0VZTEVOXTsKKwkJdTggdHhfbWljW01JQ19LRVlMRU5dOworCQl1OCByeF9taWNbTUlDX0tFWUxFTl07CisJCXU4IHRzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBidWY7CisJaW50IHJldDsKKwlpbnQgZXJyOworCWludCBrOworCXUxNiB4bWl0dGluZzsKKworCWtleV9pZHggJj0gMHgzOworCisJaWYgKHNldF90eCkKKwkJa2V5X2lkeCB8PSAweDgwMDA7CisKKwlidWYuaWR4ID0gY3B1X3RvX2xlMTYoa2V5X2lkeCk7CisJbWVtY3B5KGJ1Zi5rZXksIGtleSwKKwkgICAgICAgc2l6ZW9mKGJ1Zi5rZXkpICsgc2l6ZW9mKGJ1Zi50eF9taWMpICsgc2l6ZW9mKGJ1Zi5yeF9taWMpKTsKKworCWlmIChyc2MgPT0gTlVMTCkKKwkJbWVtc2V0KGJ1Zi5yc2MsIDAsIHNpemVvZihidWYucnNjKSk7CisJZWxzZQorCQltZW1jcHkoYnVmLnJzYywgcnNjLCBzaXplb2YoYnVmLnJzYykpOworCisJaWYgKHRzYyA9PSBOVUxMKSB7CisJCW1lbXNldChidWYudHNjLCAwLCBzaXplb2YoYnVmLnRzYykpOworCQlidWYudHNjWzRdID0gMHgxMDsKKwl9IGVsc2UgeworCQltZW1jcHkoYnVmLnRzYywgdHNjLCBzaXplb2YoYnVmLnRzYykpOworCX0KKworCS8qIFdhaXQgdXB0byAxMDBtcyBmb3IgdHggcXVldWUgdG8gZW1wdHkgKi8KKwlrID0gMTAwOworCWRvIHsKKwkJay0tOworCQl1ZGVsYXkoMTAwMCk7CisJCXJldCA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX1RYUVVFVUVFTVBUWSwKKwkJCQkJICAmeG1pdHRpbmcpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKGsgPiAwKSAmJiB4bWl0dGluZyk7CisKKwlpZiAoayA9PSAwKQorCQlyZXQgPSAtRVRJTUVET1VUOworCisJZXJyID0gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgVVNFUl9CQVAsCisJCQkJICBIRVJNRVNfUklEX0NORkFERERFRkFVTFRUS0lQS0VZX0FHRVJFLAorCQkJCSAgJmJ1Zik7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29fY2xlYXJfdGtpcF9rZXkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIGludCBrZXlfaWR4KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZwcml2LT50a2lwX2tleVtrZXlfaWR4XSwgMCwgc2l6ZW9mKHByaXYtPnRraXBfa2V5W2tleV9pZHhdKSk7CisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCSAgIEhFUk1FU19SSURfQ05GUkVNREVGQVVMVFRLSVBLRVlfQUdFUkUsCisJCQkJICAga2V5X2lkeCk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yICVkIGNsZWFyaW5nIFRLSVAga2V5ICVkXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgZXJyLCBrZXlfaWR4KTsKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE5MDYsMTAgKzI3NjksMTAgQEAKIAl9CiAKIAkvKiBTZXQgdXAgZW5jcnlwdGlvbiAqLwotCWlmIChwcml2LT5oYXNfd2VwKSB7Ci0JCWVyciA9IF9fb3Jpbm9jb19od19zZXR1cF93ZXAocHJpdik7CisJaWYgKHByaXYtPmhhc193ZXAgfHwgcHJpdi0+aGFzX3dwYSkgeworCQllcnIgPSBfX29yaW5vY29faHdfc2V0dXBfZW5jKHByaXYpOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBhY3RpdmF0aW5nIFdFUFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGFjdGl2YXRpbmcgZW5jcnlwdGlvblxuIiwKIAkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0yMDQ3LDYgKzI5MTAsMTIgQEAKIAkJfQogCX0KIAorCWlmIChwcml2LT5kb19md19kb3dubG9hZCkgeworCQllcnIgPSBvcmlub2NvX2Rvd25sb2FkKHByaXYpOworCQlpZiAoZXJyKQorCQkJcHJpdi0+ZG9fZndfZG93bmxvYWQgPSAwOworCX0KKwogCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmVcbiIsCkBAIC0yMjU4LDYgKzMxMjcsMTAgQEAKIAlwcml2LT5oYXNfaWJzcyA9IDE7CiAJcHJpdi0+aGFzX3dlcCA9IDA7CiAJcHJpdi0+aGFzX2JpZ193ZXAgPSAwOworCXByaXYtPmhhc19hbHRfdHhjbnRsID0gMDsKKwlwcml2LT5oYXNfZXh0X3NjYW4gPSAwOworCXByaXYtPmhhc193cGEgPSAwOworCXByaXYtPmRvX2Z3X2Rvd25sb2FkID0gMDsKIAogCS8qIERldGVybWluZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLwogCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgewpAQCAtMjI3Nyw4ICszMTUwLDExIEBACiAJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4NDAwMjApOyAvKiBEb24ndCB3b3JrIGluIDcuNTIgPyAqLwogCQlwcml2LT5pYnNzX3BvcnQgPSAxOwogCQlwcml2LT5oYXNfaG9zdHNjYW4gPSAoZmlybXZlciA+PSAweDgwMDBhKTsKKwkJcHJpdi0+ZG9fZndfZG93bmxvYWQgPSAxOwogCQlwcml2LT5icm9rZW5fbW9uaXRvciA9IChmaXJtdmVyID49IDB4ODAwMDApOwotCisJCXByaXYtPmhhc19hbHRfdHhjbnRsID0gKGZpcm12ZXIgPj0gMHg5MDAwMCk7IC8qIEFsbCA5LnggPyAqLworCQlwcml2LT5oYXNfZXh0X3NjYW4gPSAoZmlybXZlciA+PSAweDkwMDAwKTsgLyogQWxsIDkueCA/ICovCisJCXByaXYtPmhhc193cGEgPSAoZmlybXZlciA+PSAweDkwMDJhKTsKIAkJLyogVGVzdGVkIHdpdGggQWdlcmUgZmlybXdhcmUgOgogCQkgKgkxLjE2IDsgNC4wOCA7IDQuNTIgOyA2LjA0IDsgNi4xNiA7IDcuMjggPT4gSmVhbiBJSQogCQkgKiBUZXN0ZWQgQ2FibGVUcm9uIGZpcm13YXJlIDogNC4zMiA9PiBBbnRvbiAqLwpAQCAtMjMyMSw2ICszMTk3LDIxIEBACiAJCQkgICAgICAgZmlybXZlciA+PSAweDMxMDAwOwogCQlwcml2LT5oYXNfcHJlYW1ibGUgPSAoZmlybXZlciA+PSAweDIwMDAwKTsKIAkJcHJpdi0+aWJzc19wb3J0ID0gNDsKKworCQkvKiBTeW1ib2wgZmlybXdhcmUgaXMgZm91bmQgb24gdmFyaW91cyBjYXJkcywgYnV0CisJCSAqIHRoZXJlIGhhcyBiZWVuIG5vIGF0dGVtcHQgdG8gY2hlY2sgZmlybXdhcmUKKwkJICogZG93bmxvYWQgb24gbm9uLXNwZWN0cnVtX2NzIGJhc2VkIGNhcmRzLgorCQkgKgorCQkgKiBHaXZlbiB0aGF0IHRoZSBBZ2VyZSBmaXJtd2FyZSBkb3dubG9hZCB3b3JrcworCQkgKiBkaWZmZXJlbnRseSwgd2Ugc2hvdWxkIGF2b2lkIGRvaW5nIGEgZmlybXdhcmUKKwkJICogZG93bmxvYWQgd2l0aCB0aGUgU3ltYm9sIGFsZ29yaXRobSBvbiBub24tc3BlY3RydW0KKwkJICogY2FyZHMuCisJCSAqCisJCSAqIEZvciBub3cgd2UgY2FuIGlkZW50aWZ5IGEgc3BlY3RydW1fY3MgYmFzZWQgY2FyZAorCQkgKiBiZWNhdXNlIGl0IGhhcyBhIGZpcm13YXJlIHJlc2V0IGZ1bmN0aW9uLgorCQkgKi8KKwkJcHJpdi0+ZG9fZndfZG93bmxvYWQgPSAocHJpdi0+c3RvcF9mdyAhPSBOVUxMKTsKKwogIAkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gKGZpcm12ZXIgPT0gMHgyNTAxMykgfHwKICAJCQkJCSAgIChmaXJtdmVyID49IDB4MzAwMDAgJiYgZmlybXZlciA8PSAweDMxMDAwKTsKIAkJcHJpdi0+aGFzX2hvc3RzY2FuID0gKGZpcm12ZXIgPj0gMHgzMTAwMSkgfHwKQEAgLTIzOTEsNiArMzI4MiwyMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAocHJpdi0+ZG9fZndfZG93bmxvYWQpIHsKKwkJZXJyID0gb3Jpbm9jb19kb3dubG9hZChwcml2KTsKKwkJaWYgKGVycikKKwkJCXByaXYtPmRvX2Z3X2Rvd25sb2FkID0gMDsKKworCQkvKiBDaGVjayBmaXJtd2FyZSB2ZXJzaW9uIGFnYWluICovCisJCWVyciA9IGRldGVybWluZV9maXJtd2FyZShkZXYpOworCQlpZiAoZXJyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluY29tcGF0aWJsZSBmaXJtd2FyZSwgYWJvcnRpbmdcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJaWYgKHByaXYtPmhhc19wb3J0MykKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZC1ob2MgZGVtbyBtb2RlIHN1cHBvcnRlZFxuIiwgZGV2LT5uYW1lKTsKIAlpZiAocHJpdi0+aGFzX2lic3MpCkBAIC0yNDAzLDYgKzMzMDgsMjAgQEAKIAkJZWxzZQogCQkJcHJpbnRrKCI0MC1iaXQga2V5XG4iKTsKIAl9CisJaWYgKHByaXYtPmhhc193cGEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEtUFNLIHN1cHBvcnRlZFxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKG9yaW5vY29fbWljX2luaXQocHJpdikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBzZXR1cCBNSUMgY3J5cHRvICIKKwkJCSAgICAgICAiYWxnb3JpdGhtLiBEaXNhYmxpbmcgV1BBIHN1cHBvcnRcbiIsIGRldi0+bmFtZSk7CisJCQlwcml2LT5oYXNfd3BhID0gMDsKKwkJfQorCX0KKworCS8qIE5vdyB3ZSBoYXZlIHRoZSBmaXJtd2FyZSBjYXBhYmlsaXRpZXMsIGFsbG9jYXRlIGFwcHJvcGlhdGUKKwkgKiBzaXplZCBzY2FuIGJ1ZmZlcnMgKi8KKwlpZiAob3Jpbm9jb19ic3NfZGF0YV9hbGxvY2F0ZShwcml2KSkKKwkJZ290byBvdXQ7CisJb3Jpbm9jb19ic3NfZGF0YV9pbml0KHByaXYpOwogCiAJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwogCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTUFDQUREUiwKQEAgLTI1MTgsOCArMzQzNywxMyBAQAogCXByaXYtPmNoYW5uZWwgPSAwOyAvKiB1c2UgZmlybXdhcmUgZGVmYXVsdCAqLwogCiAJcHJpdi0+cHJvbWlzY3VvdXMgPSAwOwotCXByaXYtPndlcF9vbiA9IDA7CisJcHJpdi0+ZW5jb2RlX2FsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKIAlwcml2LT50eF9rZXkgPSAwOworCXByaXYtPndwYV9lbmFibGVkID0gMDsKKwlwcml2LT50a2lwX2NtX2FjdGl2ZSA9IDA7CisJcHJpdi0+a2V5X21nbXQgPSAwOworCXByaXYtPndwYV9pZV9sZW4gPSAwOworCXByaXYtPndwYV9pZSA9IE5VTEw7CiAKIAkvKiBNYWtlIHRoZSBoYXJkd2FyZSBhdmFpbGFibGUsIGFzIGxvbmcgYXMgaXQgaGFzbid0IGJlZW4KIAkgKiByZW1vdmVkIGVsc2V3aGVyZSAoZS5nLiBieSBQQ01DSUEgaG90IHVucGx1ZykgKi8KQEAgLTI1MzMsOCArMzQ1NywxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19vcmlub2NvZGV2KGludCBzaXplb2ZfY2FyZCwKLQkJCQkgICAgaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKSkKK3N0cnVjdCBuZXRfZGV2aWNlCisqYWxsb2Nfb3Jpbm9jb2RldihpbnQgc2l6ZW9mX2NhcmQsCisJCSAgc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkgIGludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKiksCisJCSAgaW50ICgqc3RvcF9mdykoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqLCBpbnQpKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKQEAgLTI1NDksMTAgKzM0NzYsNyBAQAogCQkJCSAgICAgICsgc2l6ZW9mKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUpKTsKIAllbHNlCiAJCXByaXYtPmNhcmQgPSBOVUxMOwotCi0JaWYgKG9yaW5vY29fYnNzX2RhdGFfYWxsb2NhdGUocHJpdikpCi0JCWdvdG8gZXJyX291dF9mcmVlOwotCW9yaW5vY29fYnNzX2RhdGFfaW5pdChwcml2KTsKKwlwcml2LT5kZXYgPSBkZXZpY2U7CiAKIAkvKiBTZXR1cCAvIG92ZXJyaWRlIG5ldF9kZXZpY2UgZmllbGRzICovCiAJZGV2LT5pbml0ID0gb3Jpbm9jb19pbml0OwpAQCAtMjU3MCwxMCArMzQ5NCwxNCBAQAogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Q7CiAJLyogd2UgdXNlIHRoZSBkZWZhdWx0IGV0aF9tYWNfYWRkciBmb3Igc2V0dGluZyB0aGUgTUFDIGFkZHIgKi8KIAorCS8qIFJlc2VydmUgc3BhY2UgaW4gc2tiIGZvciB0aGUgU05BUCBoZWFkZXIgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSBFTkNBUFNfT1ZFUkhFQUQ7CisKIAkvKiBTZXQgdXAgZGVmYXVsdCBjYWxsYmFja3MgKi8KIAlkZXYtPm9wZW4gPSBvcmlub2NvX29wZW47CiAJZGV2LT5zdG9wID0gb3Jpbm9jb19zdG9wOwogCXByaXYtPmhhcmRfcmVzZXQgPSBoYXJkX3Jlc2V0OworCXByaXYtPnN0b3BfZncgPSBzdG9wX2Z3OwogCiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCXByaXYtPm9wZW4gPSAwOwpAQCAtMjU4NCwyMCArMzUxMiwyNyBAQAogCUlOSVRfV09SSygmcHJpdi0+am9pbl93b3JrLCBvcmlub2NvX2pvaW5fYXApOwogCUlOSVRfV09SSygmcHJpdi0+d2V2ZW50X3dvcmssIG9yaW5vY29fc2VuZF93ZXZlbnRzKTsKIAorCUlOSVRfTElTVF9IRUFEKCZwcml2LT5yeF9saXN0KTsKKwl0YXNrbGV0X2luaXQoJnByaXYtPnJ4X3Rhc2tsZXQsIG9yaW5vY29fcnhfaXNyX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGRldik7CisKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IDB4ZmZmZjsKIAogCXJldHVybiBkZXY7Ci0KLWVycl9vdXRfZnJlZToKLQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiBOVUxMOwogfQogCiB2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCisJLyogTm8gbmVlZCB0byBlbXB0eSBwcml2LT5yeF9saXN0OiBpZiB0aGUgdGFza2xldCBpcyBzY2hlZHVsZWQKKwkgKiB3aGVuIHdlIGNhbGwgdGFza2xldF9raWxsIGl0IHdpbGwgcnVuIG9uZSBmaW5hbCB0aW1lLAorCSAqIGVtcHR5aW5nIHRoZSBsaXN0ICovCisJdGFza2xldF9raWxsKCZwcml2LT5yeF90YXNrbGV0KTsKKwlwcml2LT53cGFfaWVfbGVuID0gMDsKKwlrZnJlZShwcml2LT53cGFfaWUpOworCW9yaW5vY29fbWljX2ZyZWUocHJpdik7CiAJb3Jpbm9jb19ic3NfZGF0YV9mcmVlKHByaXYpOwogCWZyZWVfbmV0ZGV2KGRldik7CiB9CkBAIC0yOTA5LDcgKzM4NDQsNyBAQAogCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOwogCiAJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7Ci0JcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMjI7CiAKIAkvKiBTZXQgYXZhaWxhYmxlIGNoYW5uZWxzL2ZyZXF1ZW5jaWVzICovCiAJcmFuZ2UtPm51bV9jaGFubmVscyA9IE5VTV9DSEFOTkVMUzsKQEAgLTI5MzksNiArMzg3NCw5IEBACiAJCX0KIAl9CiAKKwlpZiAocHJpdi0+aGFzX3dwYSkKKwkJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVA7CisKIAlpZiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKCFTUFlfTlVNQkVSKHByaXYpKSl7CiAJCS8qIFF1YWxpdHkgc3RhdHMgbWVhbmluZ2xlc3MgaW4gYWQtaG9jIG1vZGUgKi8KIAl9IGVsc2UgewpAQCAtMjk4Niw2ICszOTI0LDExIEBACiAJcmFuZ2UtPm1pbl9yX3RpbWUgPSAwOwogCXJhbmdlLT5tYXhfcl90aW1lID0gNjU1MzUgKiAxMDAwOwkvKiA/Pz8gKi8KIAorCWlmIChwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfQUdFUkUpCisJCXJhbmdlLT5zY2FuX2NhcGEgPSBJV19TQ0FOX0NBUEFfRVNTSUQ7CisJZWxzZQorCQlyYW5nZS0+c2Nhbl9jYXBhID0gSVdfU0NBTl9DQVBBX05PTkU7CisKIAkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwpICovCiAJSVdfRVZFTlRfQ0FQQV9TRVRfS0VSTkVMKHJhbmdlLT5ldmVudF9jYXBhKTsKIAkvKiBFdmVudCBjYXBhYmlsaXR5IChkcml2ZXIpICovCkBAIC0zMDA1LDcgKzM5NDgsNyBAQAogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CiAJaW50IHNldGluZGV4ID0gcHJpdi0+dHhfa2V5OwotCWludCBlbmFibGUgPSBwcml2LT53ZXBfb247CisJaW50IGVuY29kZV9hbGcgPSBwcml2LT5lbmNvZGVfYWxnOwogCWludCByZXN0cmljdGVkID0gcHJpdi0+d2VwX3Jlc3RyaWN0OwogCXUxNiB4bGVuID0gMDsKIAlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwpAQCAtMzAyNiw2ICszOTY5LDEwIEBACiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CiAKKwkvKiBDbGVhciBhbnkgVEtJUCBrZXkgd2UgaGF2ZSAqLworCWlmICgocHJpdi0+aGFzX3dwYSkgJiYgKHByaXYtPmVuY29kZV9hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSkKKwkJKHZvaWQpIG9yaW5vY29fY2xlYXJfdGtpcF9rZXkocHJpdiwgc2V0aW5kZXgpOworCiAJaWYgKGVycS0+bGVuZ3RoID4gMCkgewogCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKQogCQkJaW5kZXggPSBwcml2LT50eF9rZXk7CkBAIC0zMDM5LDkgKzM5ODYsOSBAQAogCQkJeGxlbiA9IDA7CiAKIAkJLyogU3dpdGNoIG9uIFdFUCBpZiBvZmYgKi8KLQkJaWYgKCghZW5hYmxlKSAmJiAoeGxlbiA+IDApKSB7CisJCWlmICgoZW5jb2RlX2FsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkgJiYgKHhsZW4gPiAwKSkgewogCQkJc2V0aW5kZXggPSBpbmRleDsKLQkJCWVuYWJsZSA9IDE7CisJCQllbmNvZGVfYWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBJbXBvcnRhbnQgbm90ZSA6IGlmIHRoZSB1c2VyIGRvICJpd2NvbmZpZyBldGgwIGVuYyBvZmYiLApAQCAtMzA2Myw3ICs0MDEwLDcgQEAKIAl9CiAKIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKLQkJZW5hYmxlID0gMDsKKwkJZW5jb2RlX2FsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQogCQlyZXN0cmljdGVkID0gMDsKIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQpAQCAtMzA3OCwxNCArNDAyNSwxNSBAQAogCXByaXYtPnR4X2tleSA9IHNldGluZGV4OwogCiAJLyogVHJ5IGZhc3Qga2V5IGNoYW5nZSBpZiBjb25uZWN0ZWQgYW5kIG9ubHkga2V5cyBhcmUgY2hhbmdlZCAqLwotCWlmIChwcml2LT53ZXBfb24gJiYgZW5hYmxlICYmIChwcml2LT53ZXBfcmVzdHJpY3QgPT0gcmVzdHJpY3RlZCkgJiYKKwlpZiAoKHByaXYtPmVuY29kZV9hbGcgPT0gZW5jb2RlX2FsZykgJiYKKwkgICAgKHByaXYtPndlcF9yZXN0cmljdCA9PSByZXN0cmljdGVkKSAmJgogCSAgICBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKIAkJZXJyID0gX19vcmlub2NvX2h3X3NldHVwX3dlcGtleXMocHJpdik7CiAJCS8qIE5vIG5lZWQgdG8gY29tbWl0IGlmIHN1Y2Nlc3NmdWwgKi8KIAkJZ290byBvdXQ7CiAJfQogCi0JcHJpdi0+d2VwX29uID0gZW5hYmxlOworCXByaXYtPmVuY29kZV9hbGcgPSBlbmNvZGVfYWxnOwogCXByaXYtPndlcF9yZXN0cmljdCA9IHJlc3RyaWN0ZWQ7CiAKICBvdXQ6CkBAIC0zMTE0LDcgKzQwNjIsNyBAQAogCQlpbmRleCA9IHByaXYtPnR4X2tleTsKIAogCWVycS0+ZmxhZ3MgPSAwOwotCWlmICghIHByaXYtPndlcF9vbikKKwlpZiAoIXByaXYtPmVuY29kZV9hbGcpCiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCWVycS0+ZmxhZ3MgfD0gaW5kZXggKyAxOwogCkBAIC0zNjg5LDYgKzQ2MzcsMzk5IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCQkgICAgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgYWxnID0gZXh0LT5hbGcsIHNldF9rZXkgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IC1FSU5WQUw7CisJdTE2IGtleV9sZW47CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIERldGVybWluZSBhbmQgdmFsaWRhdGUgdGhlIGtleSBpbmRleCAqLworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmICgoaWR4IDwgMSkgfHwgKGlkeCA+IFdFUF9LRVlTKSkKKwkJCWdvdG8gb3V0OworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gcHJpdi0+dHhfa2V5OworCisJaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwkgICAgYWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCisJaWYgKHByaXYtPmhhc193cGEgJiYgKGFsZyAhPSBJV19FTkNPREVfQUxHX1RLSVApKSB7CisJCS8qIENsZWFyIGFueSBUS0lQIFRYIGtleSB3ZSBoYWQgKi8KKwkJKHZvaWQpIG9yaW5vY29fY2xlYXJfdGtpcF9rZXkocHJpdiwgcHJpdi0+dHhfa2V5KTsKKwl9CisKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKwkJcHJpdi0+dHhfa2V5ID0gaWR4OworCQlzZXRfa2V5ID0gKChhbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB8fAorCQkJICAgKGV4dC0+a2V5X2xlbiA+IDApKSA/IDEgOiAwOworCX0KKworCWlmIChzZXRfa2V5KSB7CisJCS8qIFNldCB0aGUgcmVxdWVzdGVkIGtleSBmaXJzdCAqLworCQlzd2l0Y2ggKGFsZykgeworCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKwkJCXByaXYtPmVuY29kZV9hbGcgPSBhbGc7CisJCQlwcml2LT5rZXlzW2lkeF0ubGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCQlpZiAoZXh0LT5rZXlfbGVuID4gU01BTExfS0VZX1NJWkUpCisJCQkJa2V5X2xlbiA9IExBUkdFX0tFWV9TSVpFOworCQkJZWxzZSBpZiAoZXh0LT5rZXlfbGVuID4gMCkKKwkJCQlrZXlfbGVuID0gU01BTExfS0VZX1NJWkU7CisJCQllbHNlCisJCQkJZ290byBvdXQ7CisKKwkJCXByaXYtPmVuY29kZV9hbGcgPSBhbGc7CisJCQlwcml2LT5rZXlzW2lkeF0ubGVuID0gY3B1X3RvX2xlMTYoa2V5X2xlbik7CisKKwkJCWtleV9sZW4gPSBtaW4oZXh0LT5rZXlfbGVuLCBrZXlfbGVuKTsKKworCQkJbWVtc2V0KHByaXYtPmtleXNbaWR4XS5kYXRhLCAwLCBPUklOT0NPX01BWF9LRVlfU0laRSk7CisJCQltZW1jcHkocHJpdi0+a2V5c1tpZHhdLmRhdGEsIGV4dC0+a2V5LCBrZXlfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQl7CisJCQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJCQl1OCAqdGtpcF9pdiA9IE5VTEw7CisKKwkJCWlmICghcHJpdi0+aGFzX3dwYSB8fAorCQkJICAgIChleHQtPmtleV9sZW4gPiBzaXplb2YocHJpdi0+dGtpcF9rZXlbMF0pKSkKKwkJCQlnb3RvIG91dDsKKworCQkJcHJpdi0+ZW5jb2RlX2FsZyA9IGFsZzsKKwkJCW1lbXNldCgmcHJpdi0+dGtpcF9rZXlbaWR4XSwgMCwKKwkJCSAgICAgICBzaXplb2YocHJpdi0+dGtpcF9rZXlbaWR4XSkpOworCQkJbWVtY3B5KCZwcml2LT50a2lwX2tleVtpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKworCQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9SWF9TRVFfVkFMSUQpCisJCQkJdGtpcF9pdiA9ICZleHQtPnJ4X3NlcVswXTsKKworCQkJZXJyID0gX19vcmlub2NvX2h3X3NldF90a2lwX2tleShodywgaWR4LAorCQkJCSBleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSwKKwkJCQkgKHU4ICopICZwcml2LT50a2lwX2tleVtpZHhdLAorCQkJCSB0a2lwX2l2LCBOVUxMKTsKKwkJCWlmIChlcnIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBUS0lQIGtleSIKKwkJCQkgICAgICAgIlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCisJCQlnb3RvIG91dDsKKwkJfQorCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCX0KKwl9CisJZXJyID0gLUVJTlBST0dSRVNTOworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCQkgICAgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSAtRUlOVkFMOworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlnb3RvIG91dDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmICgoaWR4IDwgMSkgfHwgKGlkeCA+IFdFUF9LRVlTKSkKKwkJCWdvdG8gb3V0OworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gcHJpdi0+dHhfa2V5OworCisJZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKKwltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOworCisJZXh0LT5hbGcgPSBwcml2LT5lbmNvZGVfYWxnOworCXN3aXRjaCAocHJpdi0+ZW5jb2RlX2FsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorCQlleHQtPmtleV9sZW4gPSAwOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlleHQtPmtleV9sZW4gPSBtaW5fdCh1MTYsIGxlMTZfdG9fY3B1KHByaXYtPmtleXNbaWR4XS5sZW4pLAorCQkJCSAgICAgbWF4X2tleV9sZW4pOworCQltZW1jcHkoZXh0LT5rZXksIHByaXYtPmtleXNbaWR4XS5kYXRhLCBleHQtPmtleV9sZW4pOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQlleHQtPmtleV9sZW4gPSBtaW5fdCh1MTYsIHNpemVvZihzdHJ1Y3Qgb3Jpbm9jb190a2lwX2tleSksCisJCQkJICAgICBtYXhfa2V5X2xlbik7CisJCW1lbWNweShleHQtPmtleSwgJnByaXYtPnRraXBfa2V5W2lkeF0sIGV4dC0+a2V5X2xlbik7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJYnJlYWs7CisJfQorCisJZXJyID0gMDsKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5QUk9HUkVTUzsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKwkJLyoKKwkJICogb3Jpbm9jbyBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycworCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCS8qIHdsX2xrbSBpbXBsaWVzIHZhbHVlIDIgPT0gUFNLIGZvciBIZXJtZXMgSQorCQkgKiB3aGljaCB0aWVzIGluIHdpdGggV0VYVAorCQkgKiBubyBvdGhlciBoaW50cyB0aG8gOigKKwkJICovCisJCXByaXYtPmtleV9tZ210ID0gcGFyYW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJLyogV2hlbiBjb3VudGVybWVhc3VyZXMgYXJlIGVuYWJsZWQsIHNodXQgZG93biB0aGUKKwkJICogY2FyZDsgd2hlbiBkaXNhYmxlZCwgcmUtZW5hYmxlIHRoZSBjYXJkLiBUaGlzIG11c3QKKwkJICogdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuCisJCSAqCisJCSAqIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHRoZSBFQVBPTCBtZXNzYWdlIGlzIGdldHRpbmcKKwkJICogICAgICAgb3V0IGJlZm9yZSBjYXJkIGRpc2FibGVkCisJCSAqLworCQlpZiAocGFyYW0tPnZhbHVlKSB7CisJCQlwcml2LT50a2lwX2NtX2FjdGl2ZSA9IDE7CisJCQlyZXQgPSBoZXJtZXNfZW5hYmxlX3BvcnQoaHcsIDApOworCQl9IGVsc2UgeworCQkJcHJpdi0+dGtpcF9jbV9hY3RpdmUgPSAwOworCQkJcmV0ID0gaGVybWVzX2Rpc2FibGVfcG9ydChodywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorCQkJcHJpdi0+d2VwX3Jlc3RyaWN0ID0gMTsKKwkJZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisJCQlwcml2LT53ZXBfcmVzdHJpY3QgPSAwOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJaWYgKHByaXYtPmhhc193cGEpIHsKKwkJCXByaXYtPndwYV9lbmFibGVkID0gcGFyYW0tPnZhbHVlID8gMSA6IDA7CisJCX0gZWxzZSB7CisJCQlpZiAocGFyYW0tPnZhbHVlKQorCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJLyogZWxzZSBzaWxlbnRseSBhY2NlcHQgZGlzYWJsZSBvZiBXUEEgKi8KKwkJCXByaXYtPndwYV9lbmFibGVkID0gMDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCXBhcmFtLT52YWx1ZSA9IHByaXYtPmtleV9tZ210OworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJcGFyYW0tPnZhbHVlID0gcHJpdi0+dGtpcF9jbV9hY3RpdmU7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0KQorCQkJcGFyYW0tPnZhbHVlID0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKKwkJZWxzZQorCQkJcGFyYW0tPnZhbHVlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSBwcml2LT53cGFfZW5hYmxlZDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4ICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWlmICgod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfV1BBX0lFX0xFTikgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIChleHRyYSA9PSBOVUxMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpIHsKKwkJYnVmID0ga21hbGxvYyh3cnF1LT5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbWVtY3B5KGJ1ZiwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwkJa2ZyZWUocHJpdi0+d3BhX2llKTsKKwkJcHJpdi0+d3BhX2llID0gYnVmOworCQlwcml2LT53cGFfaWVfbGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJfSBlbHNlIHsKKwkJa2ZyZWUocHJpdi0+d3BhX2llKTsKKwkJcHJpdi0+d3BhX2llID0gTlVMTDsKKwkJcHJpdi0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJaWYgKHByaXYtPndwYV9pZSkgeworCQkvKiBMb29rcyBsaWtlIHdsX2xrbSB3YW50cyB0byBjaGVjayB0aGUgYXV0aCBhbGcsIGFuZAorCQkgKiBzb21laG93IHBhc3MgaXQgdG8gdGhlIGZpcm13YXJlLgorCQkgKiBJbnN0ZWFkIGl0IGp1c3QgY2FsbHMgdGhlIGtleSBtZ210IHJpZAorCQkgKiAgIC0gd2UgZG8gdGhpcyBpbiBzZXQgYXV0aC4KKwkJICovCisJfQorCitvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0X2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoKHByaXYtPndwYV9pZV9sZW4gPT0gMCkgfHwgKHByaXYtPndwYV9pZSA9PSBOVUxMKSkgeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHByaXYtPndwYV9pZV9sZW4pIHsKKwkJZXJyID0gLUUyQklHOworCQlnb3RvIG91dDsKKwl9CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHByaXYtPndwYV9pZV9sZW47CisJbWVtY3B5KGV4dHJhLCBwcml2LT53cGFfaWUsIHByaXYtPndwYV9pZV9sZW4pOworCitvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0X21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKilleHRyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKG1sbWUtPmNtZCkgeworCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCS8qIHNpbGVudGx5IGlnbm9yZSAqLworCQlicmVhazsKKworCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwl7CisJCXN0cnVjdCB7CisJCQl1OCBhZGRyW0VUSF9BTEVOXTsKKwkJCV9fbGUxNiByZWFzb25fY29kZTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYnVmOworCisJCW1lbWNweShidWYuYWRkciwgbWxtZS0+YWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisJCWJ1Zi5yZWFzb25fY29kZSA9IGNwdV90b19sZTE2KG1sbWUtPnJlYXNvbl9jb2RlKTsKKwkJcmV0ID0gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZESVNBU1NPQ0lBVEUsCisJCQkJCSAgJmJ1Zik7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQkgIHN0cnVjdCBpd19wYXJhbSAqcnJxLApAQCAtMzk0NywxNCArNTI4OCwxNSBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFRyaWdnZXIgYSBzY2FuIChsb29rIGZvciBvdGhlciBjZWxscyBpbiB0aGUgdmljaW5pdHkgKi8KKy8qIFRyaWdnZXIgYSBzY2FuIChsb29rIGZvciBvdGhlciBjZWxscyBpbiB0aGUgdmljaW5pdHkpICovCiBzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnNycSwKKwkJCQkgc3RydWN0IGl3X3BvaW50ICpzcnEsCiAJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnNpID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKSBleHRyYTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zOTg2LDcgKzUzMjgsNiBAQAogCSAqIHdlIGFjY2VzcyBzY2FuIHZhcmlhYmxlcyBpbiBwcml2IGlzIGNyaXRpY2FsLgogCSAqCW8gc2Nhbl9pbnByb2dyZXNzIDogbm90IHRvdWNoZWQgYnkgaXJxIGhhbmRsZXIKIAkgKglvIHNjYW5fbW9kZSA6IG5vdCB0b3VjaGVkIGJ5IGlycSBoYW5kbGVyCi0JICoJbyBzY2FuX2xlbiA6IHN5bmNocm9uaXNlZCB3aXRoIHNjYW5fcmVzdWx0CiAJICogQmVmb3JlIG1vZGlmeWluZyBhbnl0aGluZyBvbiB0aG9zZSB2YXJpYWJsZXMsIHBsZWFzZSB0aGluayBoYXJkICEKIAkgKiBKZWFuIElJICovCiAKQEAgLTQwMTYsMTMgKzUzNTcsNDMgQEAKIAkJfQogCQlicmVhazsKIAkJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgotCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJaWYgKHByaXYtPnNjYW5fbW9kZSAmIElXX1NDQU5fVEhJU19FU1NJRCkgeworCQkJCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgaWRidWY7CisJCQkJc2l6ZV90IGxlbiA9IG1pbihzaXplb2YoaWRidWYudmFsKSwKKwkJCQkJCSAoc2l6ZV90KSBzaS0+ZXNzaWRfbGVuKTsKKwkJCQlpZGJ1Zi5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCQkJCW1lbWNweShpZGJ1Zi52YWwsIHNpLT5lc3NpZCwgbGVuKTsKKworCQkJCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLAorCQkJCQkgICAgICAgSEVSTUVTX1JJRF9DTkZTQ0FOU1NJRF9BR0VSRSwKKwkJCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4obGVuICsgMiksCisJCQkJCSAgICAgICAmaWRidWYpOworCQkJfSBlbHNlCisJCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAogCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZTQ0FOU1NJRF9BR0VSRSwKIAkJCQkJCSAgIDApOwkvKiBBbnkgRVNTSUQgKi8KIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CiAKLQkJCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX1NDQU4pOworCQkJaWYgKHByaXYtPmhhc19leHRfc2NhbikgeworCQkJCS8qIENsZWFyIHNjYW4gcmVzdWx0cyBhdCB0aGUgc3RhcnQgb2YKKwkJCQkgKiBhbiBleHRlbmRlZCBzY2FuICovCisJCQkJb3Jpbm9jb19jbGVhcl9zY2FuX3Jlc3VsdHMocHJpdiwKKwkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTUwMDApKTsKKworCQkJCS8qIFRPRE86IElzIHRoaXMgYXZhaWxhYmxlIG9uIG9sZGVyIGZpcm13YXJlPworCQkJCSAqICAgQ2FuIHdlIHVzZSBpdCB0byBzY2FuIHNwZWNpZmljIGNoYW5uZWxzCisJCQkJICogICBmb3IgSVdfU0NBTl9USElTX0ZSRVE/ICovCisJCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJSEVSTUVTX1JJRF9DTkZTQ0FOQ0hBTk5FTFMyR0haLAorCQkJCQkJMHg3RkZGKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIG91dDsKKworCQkJCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LAorCQkJCQkJICAgICBIRVJNRVNfSU5RX0NIQU5ORUxJTkZPKTsKKwkJCX0gZWxzZQorCQkJCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX1NDQU4pOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UKQEAgLTQwNDAsOCArNTQxMSw3IEBACiAjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CiAKIC8qIFRyYW5zbGF0ZSBzY2FuIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgY2FyZCB0byBhIGNhcmQgaW5kZXBlbmRhbnQKLSAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQgLSBKZWFuIElJCi0gKiBSZXR1cm4gbWVzc2FnZSBsZW5ndGggb3IgLWVycm5vIGZvciBmYXRhbCBlcnJvcnMgKi8KKyAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQgLSBKZWFuIElJICovCiBzdGF0aWMgaW5saW5lIGNoYXIgKm9yaW5vY29fdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQkJICAgY2hhciAqY3VycmVudF9ldiwKQEAgLTQwNTMsOSArNTQyMywxMCBAQAogCXUxNgkJCWNhcGFiaWxpdGllczsKIAl1MTYJCQljaGFubmVsOwogCXN0cnVjdCBpd19ldmVudAkJaXdlOwkJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgKnA7CiAJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOwogCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwogCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0FQOwogCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwpAQCAtNDA3Nyw4ICs1NDQ4LDggQEAKIAkvKiBBZGQgbW9kZSAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKIAljYXBhYmlsaXRpZXMgPSBsZTE2X3RvX2NwdShic3MtPmEuY2FwYWJpbGl0aWVzKTsKLQlpZiAoY2FwYWJpbGl0aWVzICYgMHgzKSB7Ci0JCWlmIChjYXBhYmlsaXRpZXMgJiAweDEpCisJaWYgKGNhcGFiaWxpdGllcyAmIChXTEFOX0NBUEFCSUxJVFlfRVNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJCWlmIChjYXBhYmlsaXRpZXMgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKQogCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOwogCQllbHNlCiAJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKQEAgLTQwODgsMTcgKzU0NTksMjIgQEAKIAogCWNoYW5uZWwgPSBic3MtPnMuY2hhbm5lbDsKIAlpZiAoKGNoYW5uZWwgPj0gMSkgJiYgKGNoYW5uZWwgPD0gTlVNX0NIQU5ORUxTKSkgewotCQkvKiBBZGQgZnJlcXVlbmN5ICovCisJCS8qIEFkZCBjaGFubmVsIGFuZCBmcmVxdWVuY3kgKi8KIAkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpd2UudS5mcmVxLm0gPSBjaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCiAJCWl3ZS51LmZyZXEubSA9IGNoYW5uZWxfZnJlcXVlbmN5W2NoYW5uZWwtMV0gKiAxMDAwMDA7CiAJCWl3ZS51LmZyZXEuZSA9IDE7CiAJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAogCQkJCQkJICAmaXdlLCBJV19FVl9GUkVRX0xFTik7CiAJfQogCi0JLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MuIGxldmVsIGFuZCBub2lzZSBpbiBkQi4gTm8gbGluayBxdWFsaXR5ICovCiAJaXdlLmNtZCA9IElXRVZRVUFMOwotCWl3ZS51LnF1YWwudXBkYXRlZCA9IDB4MTA7CS8qIG5vIGxpbmsgcXVhbGl0eSAqLworCWl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfREJNIHwgSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CiAJaXdlLnUucXVhbC5sZXZlbCA9IChfX3U4KSBsZTE2X3RvX2NwdShic3MtPmEubGV2ZWwpIC0gMHg5NTsKIAlpd2UudS5xdWFsLm5vaXNlID0gKF9fdTgpIGxlMTZfdG9fY3B1KGJzcy0+YS5ub2lzZSkgLSAweDk1OwogCS8qIFdpcmVsZXNzIHRvb2xzIHByaW9yIHRvIDI3LnByZTIyIHdpbGwgc2hvdyBsaW5rIHF1YWxpdHkKQEAgLTQxMTIsMjUgKzU0ODgsMTMgQEAKIAogCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKLQlpZiAoY2FwYWJpbGl0aWVzICYgMHgxMCkKKwlpZiAoY2FwYWJpbGl0aWVzICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCiAJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKIAllbHNlCiAJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CiAJaXdlLnUuZGF0YS5sZW5ndGggPSAwOwogCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAotCQkJCQkgICZpd2UsIGJzcy0+YS5lc3NpZCk7Ci0KLQkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKLQkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KLQlpd2UuY21kID0gSVdFVkNVU1RPTTsKLQlwID0gY3VzdG9tOwotCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCi0JCSAgICAgICIgTGFzdCBiZWFjb246ICVkbXMgYWdvIiwKLQkJICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gbGFzdF9zY2FubmVkKSk7Ci0JaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOwotCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCi0JCQkJCQkgICZpd2UsIGN1c3RvbSk7CisJCQkJCSAgJml3ZSwgTlVMTCk7CiAKIAkvKiBCaXQgcmF0ZSBpcyBub3QgYXZhaWxhYmxlIGluIEx1Y2VudC9BZ2VyZSBmaXJtd2FyZXMgKi8KIAlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSAhPSBGSVJNV0FSRV9UWVBFX0FHRVJFKSB7CkBAIC00MTUyLDcgKzU1MTYsOCBAQAogCQkJaWYgKGJzcy0+cC5yYXRlc1tpXSA9PSAweDApCiAJCQkJYnJlYWs7CiAJCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLwotCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgoYnNzLT5wLnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOworCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9CisJCQkJKChic3MtPnAucmF0ZXNbaV0gJiAweDdmKSAqIDUwMDAwMCk7CiAJCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIGN1cnJlbnRfZXYsCiAJCQkJCQkJICAgY3VycmVudF92YWwsCiAJCQkJCQkJICAgZW5kX2J1ZiwgJml3ZSwKQEAgLTQxNjMsNiArNTUyOCwxOTkgQEAKIAkJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKIAl9CiAKKwkvKiBCZWFjb24gaW50ZXJ2YWwgKi8KKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHNucHJpbnRmKGN1c3RvbSwgTUFYX0NVU1RPTV9MRU4sCisJCQkJICAgICAiYmNuX2ludD0lZCIsCisJCQkJICAgICBsZTE2X3RvX2NwdShic3MtPmEuYmVhY29uX2ludGVydikpOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkgICZpd2UsIGN1c3RvbSk7CisKKwkvKiBDYXBhYmlsaXRlcyAqLworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gc25wcmludGYoY3VzdG9tLCBNQVhfQ1VTVE9NX0xFTiwKKwkJCQkgICAgICJjYXBhYj0weCUwNHgiLAorCQkJCSAgICAgY2FwYWJpbGl0aWVzKTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBjdXN0b20pOworCisJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCisJICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJaXdlLnUuZGF0YS5sZW5ndGggPSBzbnByaW50ZihjdXN0b20sIE1BWF9DVVNUT01fTEVOLAorCQkJCSAgICAgIiBMYXN0IGJlYWNvbjogJWRtcyBhZ28iLAorCQkJCSAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gbGFzdF9zY2FubmVkKSk7CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgY3VzdG9tKTsKKworCXJldHVybiBjdXJyZW50X2V2OworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKm9yaW5vY29fdHJhbnNsYXRlX2V4dF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQkgICAgICAgY2hhciAqY3VycmVudF9ldiwKKwkJCQkJICAgICAgIGNoYXIgKmVuZF9idWYsCisJCQkJCSAgICAgICBzdHJ1Y3QgYWdlcmVfZXh0X3NjYW5faW5mbyAqYnNzLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGxhc3Rfc2Nhbm5lZCkKK3sKKwl1MTYJCQljYXBhYmlsaXRpZXM7CisJdTE2CQkJY2hhbm5lbDsKKwlzdHJ1Y3QgaXdfZXZlbnQJCWl3ZTsJCS8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKwljaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl07CisJdTggKmllOworCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKworCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJICAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkvKiBPdGhlciBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwlpZSA9IGJzcy0+ZGF0YTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IGllWzFdOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkgeworCQlpZiAoaXdlLnUuZGF0YS5sZW5ndGggPiAzMikKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgJmllWzJdKTsKKwl9CisKKwkvKiBBZGQgbW9kZSAqLworCWNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGJzcy0+Y2FwYWJpbGl0aWVzKTsKKwlpZiAoY2FwYWJpbGl0aWVzICYgKFdMQU5fQ0FQQUJJTElUWV9FU1MgfCBXTEFOX0NBUEFCSUxJVFlfSUJTUykpIHsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAoY2FwYWJpbGl0aWVzICYgV0xBTl9DQVBBQklMSVRZX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJfQorCisJaWUgPSBvcmlub2NvX2dldF9pZShic3MtPmRhdGEsIHNpemVvZihic3MtPmRhdGEpLCBNRklFX1RZUEVfRFNfU0VUKTsKKwljaGFubmVsID0gaWUgPyBpZVsyXSA6IDA7CisJaWYgKChjaGFubmVsID49IDEpICYmIChjaGFubmVsIDw9IE5VTV9DSEFOTkVMUykpIHsKKwkJLyogQWRkIGNoYW5uZWwgYW5kIGZyZXF1ZW5jeSAqLworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS51LmZyZXEubSA9IGNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKwkJaXdlLnUuZnJlcS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbY2hhbm5lbC0xXSAqIDEwMDAwMDsKKwkJaXdlLnUuZnJlcS5lID0gMTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkgICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwl9CisKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzLiBsZXZlbCBhbmQgbm9pc2UgaW4gZEIuIE5vIGxpbmsgcXVhbGl0eSAqLworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0RCTSB8IElXX1FVQUxfUVVBTF9JTlZBTElEOworCWl3ZS51LnF1YWwubGV2ZWwgPSBic3MtPmxldmVsIC0gMHg5NTsKKwlpd2UudS5xdWFsLm5vaXNlID0gYnNzLT5ub2lzZSAtIDB4OTU7CisJLyogV2lyZWxlc3MgdG9vbHMgcHJpb3IgdG8gMjcucHJlMjIgd2lsbCBzaG93IGxpbmsgcXVhbGl0eQorCSAqIGFueXdheSwgc28gd2UgcHJvdmlkZSBhIHJlYXNvbmFibGUgdmFsdWUuICovCisJaWYgKGl3ZS51LnF1YWwubGV2ZWwgPiBpd2UudS5xdWFsLm5vaXNlKQorCQlpd2UudS5xdWFsLnF1YWwgPSBpd2UudS5xdWFsLmxldmVsIC0gaXdlLnUucXVhbC5ub2lzZTsKKwllbHNlCisJCWl3ZS51LnF1YWwucXVhbCA9IDA7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSAgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmIChjYXBhYmlsaXRpZXMgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCWVsc2UKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSAgJml3ZSwgTlVMTCk7CisKKwkvKiBXUEEgSUUgKi8KKwlpZSA9IG9yaW5vY29fZ2V0X3dwYV9pZShic3MtPmRhdGEsIHNpemVvZihic3MtPmRhdGEpKTsKKwlpZiAoaWUpIHsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBpZVsxXSArIDI7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBpZSk7CisJfQorCisJLyogUlNOIElFICovCisJaWUgPSBvcmlub2NvX2dldF9pZShic3MtPmRhdGEsIHNpemVvZihic3MtPmRhdGEpLCBNRklFX1RZUEVfUlNOKTsKKwlpZiAoaWUpIHsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBpZVsxXSArIDI7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBpZSk7CisJfQorCisJaWUgPSBvcmlub2NvX2dldF9pZShic3MtPmRhdGEsIHNpemVvZihic3MtPmRhdGEpLCBNRklFX1RZUEVfUkFURVMpOworCWlmIChpZSkgeworCQljaGFyICpwID0gY3VycmVudF9ldiArIGl3ZV9zdHJlYW1fbGNwX2xlbihpbmZvKTsKKwkJaW50IGk7CisKKwkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCQkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KKwkJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisJCWZvciAoaSA9IDI7IGkgPCAoaWVbMV0gKyAyKTsgaSsrKSB7CisJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKChpZVtpXSAmIDB4N0YpICogNTAwMDAwKTsKKwkJCXAgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShpbmZvLCBjdXJyZW50X2V2LCBwLCBlbmRfYnVmLAorCQkJCQkJICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisJCX0KKwkJLyogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50ICovCisJCWlmIChwID4gKGN1cnJlbnRfZXYgKyBpd2Vfc3RyZWFtX2xjcF9sZW4oaW5mbykpKQorCQkJY3VycmVudF9ldiA9IHA7CisJfQorCisJLyogVGltZXN0YW1wICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJaXdlLnUuZGF0YS5sZW5ndGggPQorCQlzbnByaW50ZihjdXN0b20sIE1BWF9DVVNUT01fTEVOLCAidHNmPSUwMTZsbHgiLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KGJzcy0+dGltZXN0YW1wKSk7CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgY3VzdG9tKTsKKworCS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gc25wcmludGYoY3VzdG9tLCBNQVhfQ1VTVE9NX0xFTiwKKwkJCQkgICAgICJiY25faW50PSVkIiwKKwkJCQkgICAgIGxlMTZfdG9fY3B1KGJzcy0+YmVhY29uX2ludGVydmFsKSk7CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgY3VzdG9tKTsKKworCS8qIENhcGFiaWxpdGVzICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJaXdlLnUuZGF0YS5sZW5ndGggPSBzbnByaW50ZihjdXN0b20sIE1BWF9DVVNUT01fTEVOLAorCQkJCSAgICAgImNhcGFiPTB4JTA0eCIsCisJCQkJICAgICBjYXBhYmlsaXRpZXMpOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkgICZpd2UsIGN1c3RvbSk7CisKKwkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHNucHJpbnRmKGN1c3RvbSwgTUFYX0NVU1RPTV9MRU4sCisJCQkJICAgICAiIExhc3QgYmVhY29uOiAlZG1zIGFnbyIsCisJCQkJICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBsYXN0X3NjYW5uZWQpKTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBjdXN0b20pOworCiAJcmV0dXJuIGN1cnJlbnRfZXY7CiB9CiAKQEAgLTQxNzMsNyArNTczMSw2IEBACiAJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWJzc19lbGVtZW50ICpic3M7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CkBAIC00MTkzLDE4ICs1NzUwLDQ3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcHJpdi0+YnNzX2xpc3QsIGxpc3QpIHsKLQkJLyogVHJhbnNsYXRlIHRvIFdFIGZvcm1hdCB0aGlzIGVudHJ5ICovCi0JCWN1cnJlbnRfZXYgPSBvcmlub2NvX3RyYW5zbGF0ZV9zY2FuKGRldiwgaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCSAgICBleHRyYSArIHNycS0+bGVuZ3RoLAotCQkJCQkJICAgICZic3MtPmJzcywKLQkJCQkJCSAgICBic3MtPmxhc3Rfc2Nhbm5lZCk7CisJaWYgKHByaXYtPmhhc19leHRfc2NhbikgeworCQlzdHJ1Y3QgeGJzc19lbGVtZW50ICpic3M7CiAKLQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCi0JCWlmICgoZXh0cmEgKyBzcnEtPmxlbmd0aCAtIGN1cnJlbnRfZXYpIDw9IElXX0VWX0FERFJfTEVOKSB7Ci0JCQkvKiBBc2sgdXNlciBzcGFjZSB0byB0cnkgYWdhaW4gd2l0aCBhIGJpZ2dlciBidWZmZXIgKi8KLQkJCWVyciA9IC1FMkJJRzsKLQkJCWdvdG8gb3V0OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJzcywgJnByaXYtPmJzc19saXN0LCBsaXN0KSB7CisJCQkvKiBUcmFuc2xhdGUgdGhpcyBlbnRyeSB0byBXRSBmb3JtYXQgKi8KKwkJCWN1cnJlbnRfZXYgPQorCQkJCW9yaW5vY29fdHJhbnNsYXRlX2V4dF9zY2FuKGRldiwgaW5mbywKKwkJCQkJCQkgICBjdXJyZW50X2V2LAorCQkJCQkJCSAgIGV4dHJhICsgc3JxLT5sZW5ndGgsCisJCQkJCQkJICAgJmJzcy0+YnNzLAorCQkJCQkJCSAgIGJzcy0+bGFzdF9zY2FubmVkKTsKKworCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCisJCQlpZiAoKGV4dHJhICsgc3JxLT5sZW5ndGggLSBjdXJyZW50X2V2KQorCQkJICAgIDw9IElXX0VWX0FERFJfTEVOKSB7CisJCQkJLyogQXNrIHVzZXIgc3BhY2UgdG8gdHJ5IGFnYWluIHdpdGggYQorCQkJCSAqIGJpZ2dlciBidWZmZXIgKi8KKwkJCQllcnIgPSAtRTJCSUc7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCXN0cnVjdCBic3NfZWxlbWVudCAqYnNzOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcHJpdi0+YnNzX2xpc3QsIGxpc3QpIHsKKwkJCS8qIFRyYW5zbGF0ZSB0aGlzIGVudHJ5IHRvIFdFIGZvcm1hdCAqLworCQkJY3VycmVudF9ldiA9IG9yaW5vY29fdHJhbnNsYXRlX3NjYW4oZGV2LCBpbmZvLAorCQkJCQkJCSAgICBjdXJyZW50X2V2LAorCQkJCQkJCSAgICBleHRyYSArIHNycS0+bGVuZ3RoLAorCQkJCQkJCSAgICAmYnNzLT5ic3MsCisJCQkJCQkJICAgIGJzcy0+bGFzdF9zY2FubmVkKTsKKworCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCisJCQlpZiAoKGV4dHJhICsgc3JxLT5sZW5ndGggLSBjdXJyZW50X2V2KQorCQkJICAgIDw9IElXX0VWX0FERFJfTEVOKSB7CisJCQkJLyogQXNrIHVzZXIgc3BhY2UgdG8gdHJ5IGFnYWluIHdpdGggYQorCQkJCSAqIGJpZ2dlciBidWZmZXIgKi8KKwkJCQllcnIgPSAtRTJCSUc7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQyOTUsMzkgKzU4ODEsNDggQEAKICAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycwogICovCiAKKyNkZWZpbmUgU1REX0lXX0hBTkRMRVIoaWQsIGZ1bmMpIFwKKwlbSVdfSU9DVExfSURYKGlkKV0gPSAoaXdfaGFuZGxlcikgZnVuYwogc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJb3Jpbm9jb19oYW5kbGVyW10gPSB7Ci0JW1NJT0NTSVdDT01NSVQtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfY29tbWl0LAotCVtTSU9DR0lXTkFNRSAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldG5hbWUsCi0JW1NJT0NTSVdGUkVRICAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0ZnJlcSwKLQlbU0lPQ0dJV0ZSRVEgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRmcmVxLAotCVtTSU9DU0lXTU9ERSAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldG1vZGUsCi0JW1NJT0NHSVdNT0RFICAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0bW9kZSwKLQlbU0lPQ1NJV1NFTlMgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRzZW5zLAotCVtTSU9DR0lXU0VOUyAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHNlbnMsCi0JW1NJT0NHSVdSQU5HRSAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0aXdyYW5nZSwKLQlbU0lPQ1NJV1NQWSAgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgaXdfaGFuZGxlcl9zZXRfc3B5LAotCVtTSU9DR0lXU1BZICAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBpd19oYW5kbGVyX2dldF9zcHksCi0JW1NJT0NTSVdUSFJTUFktU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIGl3X2hhbmRsZXJfc2V0X3RocnNweSwKLQlbU0lPQ0dJV1RIUlNQWS1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAotCVtTSU9DU0lXQVAgICAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHdhcCwKLQlbU0lPQ0dJV0FQICAgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXR3YXAsCi0JW1NJT0NTSVdTQ0FOICAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0c2NhbiwKLQlbU0lPQ0dJV1NDQU4gIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRzY2FuLAotCVtTSU9DU0lXRVNTSUQgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGVzc2lkLAotCVtTSU9DR0lXRVNTSUQgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGVzc2lkLAotCVtTSU9DU0lXTklDS04gLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldG5pY2ssCi0JW1NJT0NHSVdOSUNLTiAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0bmljaywKLQlbU0lPQ1NJV1JBVEUgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRyYXRlLAotCVtTSU9DR0lXUkFURSAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHJhdGUsCi0JW1NJT0NTSVdSVFMgICAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cnRzLAotCVtTSU9DR0lXUlRTICAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHJ0cywKLQlbU0lPQ1NJV0ZSQUcgIC1TSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRmcmFnLAotCVtTSU9DR0lXRlJBRyAgLVNJT0NJV0ZJUlNUXSA9IChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGZyYWcsCi0JW1NJT0NHSVdSRVRSWSAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cmV0cnksCi0JW1NJT0NTSVdFTkNPREUtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0aXdlbmNvZGUsCi0JW1NJT0NHSVdFTkNPREUtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUsCi0JW1NJT0NTSVdQT1dFUiAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cG93ZXIsCi0JW1NJT0NHSVdQT1dFUiAtU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cG93ZXIsCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV0NPTU1JVCwJb3Jpbm9jb19pb2N0bF9jb21taXQpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdOQU1FLAlvcmlub2NvX2lvY3RsX2dldG5hbWUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdGUkVRLAlvcmlub2NvX2lvY3RsX3NldGZyZXEpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdGUkVRLAlvcmlub2NvX2lvY3RsX2dldGZyZXEpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdNT0RFLAlvcmlub2NvX2lvY3RsX3NldG1vZGUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdNT0RFLAlvcmlub2NvX2lvY3RsX2dldG1vZGUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdTRU5TLAlvcmlub2NvX2lvY3RsX3NldHNlbnMpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdTRU5TLAlvcmlub2NvX2lvY3RsX2dldHNlbnMpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdSQU5HRSwJb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKSwKKwlTVERfSVdfSEFORExFUihTSU9DU0lXU1BZLAlpd19oYW5kbGVyX3NldF9zcHkpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdTUFksCWl3X2hhbmRsZXJfZ2V0X3NweSksCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV1RIUlNQWSwJaXdfaGFuZGxlcl9zZXRfdGhyc3B5KSwKKwlTVERfSVdfSEFORExFUihTSU9DR0lXVEhSU1BZLAlpd19oYW5kbGVyX2dldF90aHJzcHkpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdBUCwJb3Jpbm9jb19pb2N0bF9zZXR3YXApLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdBUCwJb3Jpbm9jb19pb2N0bF9nZXR3YXApLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdTQ0FOLAlvcmlub2NvX2lvY3RsX3NldHNjYW4pLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdTQ0FOLAlvcmlub2NvX2lvY3RsX2dldHNjYW4pLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdFU1NJRCwJb3Jpbm9jb19pb2N0bF9zZXRlc3NpZCksCisJU1REX0lXX0hBTkRMRVIoU0lPQ0dJV0VTU0lELAlvcmlub2NvX2lvY3RsX2dldGVzc2lkKSwKKwlTVERfSVdfSEFORExFUihTSU9DU0lXTklDS04sCW9yaW5vY29faW9jdGxfc2V0bmljayksCisJU1REX0lXX0hBTkRMRVIoU0lPQ0dJV05JQ0tOLAlvcmlub2NvX2lvY3RsX2dldG5pY2spLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdSQVRFLAlvcmlub2NvX2lvY3RsX3NldHJhdGUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdSQVRFLAlvcmlub2NvX2lvY3RsX2dldHJhdGUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdSVFMsCW9yaW5vY29faW9jdGxfc2V0cnRzKSwKKwlTVERfSVdfSEFORExFUihTSU9DR0lXUlRTLAlvcmlub2NvX2lvY3RsX2dldHJ0cyksCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV0ZSQUcsCW9yaW5vY29faW9jdGxfc2V0ZnJhZyksCisJU1REX0lXX0hBTkRMRVIoU0lPQ0dJV0ZSQUcsCW9yaW5vY29faW9jdGxfZ2V0ZnJhZyksCisJU1REX0lXX0hBTkRMRVIoU0lPQ0dJV1JFVFJZLAlvcmlub2NvX2lvY3RsX2dldHJldHJ5KSwKKwlTVERfSVdfSEFORExFUihTSU9DU0lXRU5DT0RFLAlvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKSwKKwlTVERfSVdfSEFORExFUihTSU9DR0lXRU5DT0RFLAlvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKSwKKwlTVERfSVdfSEFORExFUihTSU9DU0lXUE9XRVIsCW9yaW5vY29faW9jdGxfc2V0cG93ZXIpLAorCVNURF9JV19IQU5ETEVSKFNJT0NHSVdQT1dFUiwJb3Jpbm9jb19pb2N0bF9nZXRwb3dlciksCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV0dFTklFLAlvcmlub2NvX2lvY3RsX3NldF9nZW5pZSksCisJU1REX0lXX0hBTkRMRVIoU0lPQ0dJV0dFTklFLAlvcmlub2NvX2lvY3RsX2dldF9nZW5pZSksCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV01MTUUsCW9yaW5vY29faW9jdGxfc2V0X21sbWUpLAorCVNURF9JV19IQU5ETEVSKFNJT0NTSVdBVVRILAlvcmlub2NvX2lvY3RsX3NldF9hdXRoKSwKKwlTVERfSVdfSEFORExFUihTSU9DR0lXQVVUSCwJb3Jpbm9jb19pb2N0bF9nZXRfYXV0aCksCisJU1REX0lXX0hBTkRMRVIoU0lPQ1NJV0VOQ09ERUVYVCwgb3Jpbm9jb19pb2N0bF9zZXRfZW5jb2RlZXh0KSwKKwlTVERfSVdfSEFORExFUihTSU9DR0lXRU5DT0RFRVhULCBvcmlub2NvX2lvY3RsX2dldF9lbmNvZGVleHQpLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKaW5kZXggYzZiMTg1OC4uOTgxNTcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaApAQCAtOSw2ICs5LDcgQEAKIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xNSIKIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KQEAgLTMwLDI3ICszMSw1NyBAQAogCWNoYXIgZGF0YVtPUklOT0NPX01BWF9LRVlfU0laRV07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorI2RlZmluZSBUS0lQX0tFWUxFTgkxNgorI2RlZmluZSBNSUNfS0VZTEVOCTgKKworc3RydWN0IG9yaW5vY29fdGtpcF9rZXkgeworCXU4IHRraXBbVEtJUF9LRVlMRU5dOworCXU4IHR4X21pY1tNSUNfS0VZTEVOXTsKKwl1OCByeF9taWNbTUlDX0tFWUxFTl07Cit9OworCiB0eXBlZGVmIGVudW0gewogCUZJUk1XQVJFX1RZUEVfQUdFUkUsCiAJRklSTVdBUkVfVFlQRV9JTlRFUlNJTCwKIAlGSVJNV0FSRV9UWVBFX1NZTUJPTAogfSBmd3R5cGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGJzc19lbGVtZW50IHsKIAl1bmlvbiBoZXJtZXNfc2Nhbl9pbmZvIGJzczsKIAl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19IGJzc19lbGVtZW50OworfTsKKworc3RydWN0IHhic3NfZWxlbWVudCB7CisJc3RydWN0IGFnZXJlX2V4dF9zY2FuX2luZm8gYnNzOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zY2FubmVkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvcjsKKworc3RydWN0IG9yaW5vY29fcnhfZGF0YSB7CisJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKIAogc3RydWN0IG9yaW5vY29fcHJpdmF0ZSB7CiAJdm9pZCAqY2FyZDsJLyogUG9pbnRlciB0byBjYXJkIGRlcGVuZGVudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKTsKKwlpbnQgKCpzdG9wX2Z3KShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICosIGludCk7CiAKIAkvKiBTeW5jaHJvbmlzYXRpb24gc3R1ZmYgKi8KIAlzcGlubG9ja190IGxvY2s7CiAJaW50IGh3X3VuYXZhaWxhYmxlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOwogCisJLyogSW50ZXJydXB0IHRhc2tsZXRzICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X3Rhc2tsZXQ7CisJc3RydWN0IGxpc3RfaGVhZCByeF9saXN0OworCXN0cnVjdCBvcmlub2NvX3J4X2RhdGEgKnJ4X2RhdGE7CisKIAkvKiBkcml2ZXIgc3RhdGUgKi8KIAlpbnQgb3BlbjsKIAl1MTYgbGFzdF9saW5rc3RhdHVzOwpAQCAtODMsMTMgKzExNCwxNyBAQAogCXVuc2lnbmVkIGludCBoYXNfcHJlYW1ibGU6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX3NlbnNpdGl2aXR5OjE7CiAJdW5zaWduZWQgaW50IGhhc19ob3N0c2NhbjoxOworCXVuc2lnbmVkIGludCBoYXNfYWx0X3R4Y250bDoxOworCXVuc2lnbmVkIGludCBoYXNfZXh0X3NjYW46MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3dwYToxOworCXVuc2lnbmVkIGludCBkb19md19kb3dubG9hZDoxOwogCXVuc2lnbmVkIGludCBicm9rZW5fZGlzYWJsZXBvcnQ6MTsKIAl1bnNpZ25lZCBpbnQgYnJva2VuX21vbml0b3I6MTsKIAogCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1hdGVycyAqLwogCXUzMiBpd19tb2RlOwogCWludCBwcmVmZXJfcG9ydDM7Ci0JdTE2IHdlcF9vbiwgd2VwX3Jlc3RyaWN0LCB0eF9rZXk7CisJdTE2IGVuY29kZV9hbGcsIHdlcF9yZXN0cmljdCwgdHhfa2V5OwogCXN0cnVjdCBvcmlub2NvX2tleSBrZXlzW09SSU5PQ09fTUFYX0tFWVNdOwogCWludCBiaXRyYXRlbW9kZTsKICAJY2hhciBuaWNrW0lXX0VTU0lEX01BWF9TSVpFKzFdOwpAQCAtMTEzLDEwICsxNDgsMjIgQEAKIAkvKiBTY2FubmluZyBzdXBwb3J0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBic3NfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJzc19mcmVlX2xpc3Q7Ci0JYnNzX2VsZW1lbnQgKmJzc19kYXRhOworCXZvaWQgKmJzc194YnNzX2RhdGE7CiAKIAlpbnQJc2Nhbl9pbnByb2dyZXNzOwkvKiBTY2FuIHBlbmRpbmcuLi4gKi8KIAl1MzIJc2Nhbl9tb2RlOwkJLyogVHlwZSBvZiBzY2FuIGRvbmUgKi8KKworCS8qIFdQQSBzdXBwb3J0ICovCisJdTggKndwYV9pZTsKKwlpbnQgd3BhX2llX2xlbjsKKworCXN0cnVjdCBvcmlub2NvX3RraXBfa2V5IHRraXBfa2V5W09SSU5PQ09fTUFYX0tFWVNdOworCXN0cnVjdCBjcnlwdG9faGFzaCAqcnhfdGZtX21pYzsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnR4X3RmbV9taWM7CisKKwl1bnNpZ25lZCBpbnQgd3BhX2VuYWJsZWQ6MTsKKwl1bnNpZ25lZCBpbnQgdGtpcF9jbV9hY3RpdmU6MTsKKwl1bnNpZ25lZCBpbnQga2V5X21nbXQ6MzsKIH07CiAKICNpZmRlZiBPUklOT0NPX0RFQlVHCkBAIC0xMzAsOCArMTc3LDEwIEBACiAvKiBFeHBvcnRlZCBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2Nfb3Jpbm9jb2RldihpbnQgc2l6ZW9mX2NhcmQsCi0JCQkJCSAgIGludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKikpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19vcmlub2NvZGV2KAorCWludCBzaXplb2ZfY2FyZCwgc3RydWN0IGRldmljZSAqZGV2aWNlLAorCWludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKiksCisJaW50ICgqc3RvcF9mdykoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqLCBpbnQpKTsKIGV4dGVybiB2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgX19vcmlub2NvX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBfX29yaW5vY29fZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwppbmRleCAxYzIxNmUwLi42ZmNmMmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCkBAIC04MCw3ICs4MCw3IEBACiAJLyogV2UgbmVlZCBhdG9taWMgb3BzIGhlcmUsIGJlY2F1c2Ugd2UncmUgbm90IGhvbGRpbmcgdGhlIGxvY2sgKi8KIAlzZXRfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKTsKIAotCWVyciA9IHBjbWNpYV9yZXNldF9jYXJkKGxpbmssIE5VTEwpOworCWVyciA9IHBjbWNpYV9yZXNldF9jYXJkKGxpbmstPnNvY2tldCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMTA5LDcgKzEwOSw4IEBACiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQ7CiAKLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fY3NfaGFyZF9yZXNldCk7CisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCAmaGFuZGxlX3RvX2RldihsaW5rKSwKKwkJCSAgICAgICBvcmlub2NvX2NzX2hhcmRfcmVzZXQsIE5VTEwpOwogCWlmICghIGRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xMjAsNyArMTIxLDcgQEAKIAlsaW5rLT5wcml2ID0gZGV2OwogCiAJLyogSW50ZXJydXB0IHNldHVwICovCi0JbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcgfCBJUlFfSEFORExFX1BSRVNFTlQ7CiAJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogCWxpbmstPmlycS5IYW5kbGVyID0gb3Jpbm9jb19pbnRlcnJ1cHQ7CiAJbGluay0+aXJxLkluc3RhbmNlID0gZGV2OyAKQEAgLTE2NCw2ICsxNjUsNzAgQEAKIAkJbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IFwKIAl9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IG9yaW5vY29fY3NfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCQkgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkJICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJCSAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQlnb3RvIG5leHRfZW50cnk7CisKKwkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkvKiBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCURFQlVHKDIsICJzcGVjdHJ1bV9jc19jb25maWc6IFZjYyBtaXNtYXRjaCAodmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIHZjYywgY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOworCQkJaWYgKCFpZ25vcmVfY2lzX3ZjYykKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKwl9IGVsc2UgaWYgKGRmbHQtPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gZGZsdC0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7CisJCQlERUJVRygyLCAic3BlY3RydW1fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKHZjYyA9ICVkLCBDSVMgPSAlZClcbiIsICB2Y2MsIGRmbHQtPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCX0KKworCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0KKwkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwllbHNlIGlmIChkZmx0LT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9CisJCQlkZmx0LT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCisJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCisJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwl9CisJcmV0dXJuIDA7CisKK25leHRfZW50cnk6CisJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBfZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK307CisKIHN0YXRpYyBpbnQKIG9yaW5vY29fY3NfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewpAQCAtMTcyLDE2ICsyMzcsOCBAQAogCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwogCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKLQl1X2NoYXIgYnVmWzY0XTsKLQljb25maWdfaW5mb190IGNvbmY7Ci0JdHVwbGVfdCB0dXBsZTsKLQljaXNwYXJzZV90IHBhcnNlOwogCXZvaWQgX19pb21lbSAqbWVtOwogCi0JLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KLQlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKLQkJIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7Ci0KIAkvKgogCSAqIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlCiAJICogZW50cmllcywgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkCkBAIC0xOTYsOTQgKzI1MywxNCBAQAogCSAqIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluCiAJICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgogCSAqLwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl3aGlsZSAoMSkgewotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOwotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IC5pbmRleCA9IDAgfTsKLQotCQlpZiAoIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSAhPSAwKQotCQkgICAgfHwgKHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkpCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0KLQkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQotCQkJZGZsdCA9ICpjZmc7Ci0JCWlmIChjZmctPmluZGV4ID09IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCi0JCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLwotCQkvKiBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJaWYgKGNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7Ci0JCQkJREVCVUcoMiwgIm9yaW5vY29fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKGNvbmYuVmNjID0gJWQsIGNmZyBDSVMgPSAlZClcbiIsICBjb25mLlZjYywgY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOwotCQkJCWlmICghaWdub3JlX2Npc192Y2MpCi0JCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJCX0KLQkJfSBlbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlpZiAoY29uZi5WY2MgIT0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKLQkJCQlERUJVRygyLCAib3Jpbm9jb19jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgZGZsdCBDSVMgPSAlZClcbiIsICBjb25mLlZjYywgZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOwotCQkJCWlmKCFpZ25vcmVfY2lzX3ZjYykKLQkJCQkJZ290byBuZXh0X2VudHJ5OwotCQkJfQotCQl9Ci0KLQkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLQkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQkKLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPQotCQkJICAgIChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPQotCQkJCSAgICBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KLQkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9Ci0JCQkgICAgaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9Ci0JCQkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQotCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pICE9IDApCi0JCQkJZ290byBuZXh0X2VudHJ5OwotCQl9Ci0KLQotCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0KLQkJYnJlYWs7Ci0JCQotCW5leHRfZW50cnk6Ci0JCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKLQkJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKTsKLQkJaWYgKGxhc3RfcmV0ICA9PSBDU19OT19NT1JFX0lURU1TKSB7CisJbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgb3Jpbm9jb19jc19jb25maWdfY2hlY2ssIE5VTEwpOworCWlmIChsYXN0X3JldCkgeworCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiR2V0TmV4dFR1cGxlKCk6IE5vIG1hdGNoaW5nICIKIAkJCSAgICAgICAiQ0lTIGNvbmZpZ3VyYXRpb24uICBNYXliZSB5b3UgbmVlZCB0aGUgIgogCQkJICAgICAgICJpZ25vcmVfY2lzX3ZjYz0xIHBhcmFtZXRlci5cbiIpOwotCQkJZ290byBjc19mYWlsZWQ7Ci0JCX0KKwkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBsYXN0X3JldCk7CisJCWdvdG8gZmFpbGVkOwogCX0KIAogCS8qCkBAIC0zMzQsNyArMzExLDYgQEAKIAkgICAgICAgIjB4JTA0eC0weCUwNHhcbiIsIGRldi0+bmFtZSwgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCiAJICAgICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSwgbGluay0+aW8uQmFzZVBvcnQxLAogCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgKyBsaW5rLT5pby5OdW1Qb3J0czEgLSAxKTsKLQogCXJldHVybiAwOwogCiAgY3NfZmFpbGVkOgpAQCAtNDAyLDYgKzM3OCw3IEBACiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKIAlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCEgdGVzdF9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpKSB7CiAJCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CkBAIC00MTEsNyArMzg4LDcgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJCXByaXYtPmh3X3VuYXZhaWxhYmxlLS07CkBAIC00MjMsNyArNDAwLDcgQEAKIAkJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOwogCQl9CiAKLQkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fbm9ydGVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX25vcnRlbC5jCmluZGV4IDM1ZWM1ZmMuLjJmYzg2NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fbm9ydGVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19ub3J0ZWwuYwpAQCAtMTgyLDcgKzE4Miw4IEBACiAJfQogCiAJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fbm9ydGVsX2Nvcl9yZXNldCk7CisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCAmcGRldi0+ZGV2LAorCQkJICAgICAgIG9yaW5vY29fbm9ydGVsX2Nvcl9yZXNldCwgTlVMTCk7CiAJaWYgKCFkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCmluZGV4IDI1NDdkNWQuLjRlYmQ2MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYwpAQCAtMTM5LDcgKzEzOSw4IEBACiAJfQogCiAJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGNpX2Nvcl9yZXNldCk7CisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCAmcGRldi0+ZGV2LAorCQkJICAgICAgIG9yaW5vY29fcGNpX2Nvcl9yZXNldCwgTlVMTCk7CiAJaWYgKCFkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCmluZGV4IDk4ZmUxNjUuLmVmNzYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wbHguYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAJfQogCiAJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGx4X2Nvcl9yZXNldCk7CisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCAmcGRldi0+ZGV2LAorCQkJICAgICAgIG9yaW5vY29fcGx4X2Nvcl9yZXNldCwgTlVMTCk7CiAJaWYgKCFkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCmluZGV4IGRmNDkzMTguLmVkZTI0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb190bWQuYwpAQCAtMTI0LDcgKzEyNCw4IEBACiAJfQogCiAJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fdG1kX2Nvcl9yZXNldCk7CisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCAmcGRldi0+ZGV2LAorCQkJICAgICAgIG9yaW5vY29fdG1kX2Nvcl9yZXNldCwgTlVMTCk7CiAJaWYgKCFkZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTQuaAppbmRleCA0ODAxYTM2Li4xZDA3MDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBQUklTTTU0X0gKLSNkZWZpbmUgUFJJU001NF9ICisjaWZuZGVmIFA1NF9ICisjZGVmaW5lIFA1NF9ICiAKIC8qCiAgKiBTaGFyZWQgZGVmaW5lcyBmb3IgYWxsIG1hYzgwMjExIFByaXNtNTQgY29kZQpAQCAtMTksMTMgKzE5LDI0IEBACiAJUDU0X0NPTlRST0xfVFlQRV9DSEFOTkVMX0NIQU5HRSwKIAlQNTRfQ09OVFJPTF9UWVBFX0ZSRVFET05FLAogCVA1NF9DT05UUk9MX1RZUEVfRENGSU5JVCwKLQlQNTRfQ09OVFJPTF9UWVBFX0ZSRUVRVUVVRSA9IDcsCisJUDU0X0NPTlRST0xfVFlQRV9FTkNSWVBUSU9OLAorCVA1NF9DT05UUk9MX1RZUEVfVElNLAorCVA1NF9DT05UUk9MX1RZUEVfUE9XRVJNR1QsCisJUDU0X0NPTlRST0xfVFlQRV9GUkVFUVVFVUUsCiAJUDU0X0NPTlRST0xfVFlQRV9UWERPTkUsCiAJUDU0X0NPTlRST0xfVFlQRV9QSU5HLAogCVA1NF9DT05UUk9MX1RZUEVfU1RBVF9SRUFEQkFDSywKIAlQNTRfQ09OVFJPTF9UWVBFX0JCUCwKIAlQNTRfQ09OVFJPTF9UWVBFX0VFUFJPTV9SRUFEQkFDSywKLQlQNTRfQ09OVFJPTF9UWVBFX0xFRAorCVA1NF9DT05UUk9MX1RZUEVfTEVELAorCVA1NF9DT05UUk9MX1RZUEVfR1BJTywKKwlQNTRfQ09OVFJPTF9UWVBFX1RJTUVSLAorCVA1NF9DT05UUk9MX1RZUEVfTU9EVUxBVElPTiwKKwlQNTRfQ09OVFJPTF9UWVBFX1NZTlRIX0NPTkZJRywKKwlQNTRfQ09OVFJPTF9UWVBFX0RFVEVDVE9SX1ZBTFVFLAorCVA1NF9DT05UUk9MX1RZUEVfWEJPV19TWU5USF9DRkcsCisJUDU0X0NPTlRST0xfVFlQRV9DQ0VfUVVJRVQsCisJUDU0X0NPTlRST0xfVFlQRV9QU01fU1RBX1VOTE9DSywKIH07CiAKIHN0cnVjdCBwNTRfY29udHJvbF9oZHIgewpAQCAtMzgsMTEgKzQ5LDE1IEBACiAJdTggZGF0YVswXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi0jZGVmaW5lIEVFUFJPTV9SRUFEQkFDS19MRU4gKHNpemVvZihzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyKSArIDQgLyogcDU0X2VlcHJvbV9sbTg2ICovKQotI2RlZmluZSBNQVhfUlhfU0laRSAoSUVFRTgwMjExX01BWF9SVFNfVEhSRVNIT0xEICsgc2l6ZW9mKHN0cnVjdCBwNTRfY29udHJvbF9oZHIpICsgMjAgLyogbGVuZ3RoIG9mIHN0cnVjdCBwNTRfcnhfaGRyICovICsgMTYgKQorI2RlZmluZSBFRVBST01fUkVBREJBQ0tfTEVOIDB4M2ZjCiAKICNkZWZpbmUgSVNMMzhYWF9ERVZfRklSTVdBUkVfQUREUiAweDIwMDAwCiAKKyNkZWZpbmUgRldfRk1BQyAweDQ2NGQ0MTQzCisjZGVmaW5lIEZXX0xNODYgMHg0YzRkMzgzNgorI2RlZmluZSBGV19MTTg3IDB4NGM0ZDM4MzcKKyNkZWZpbmUgRldfTE0yMCAweDRjNGQzMjMwCisKIHN0cnVjdCBwNTRfY29tbW9uIHsKIAl1MzIgcnhfc3RhcnQ7CiAJdTMyIHJ4X2VuZDsKQEAgLTUzLDI3ICs2OCw0MyBAQAogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpOwogCWludCBtb2RlOwogCXUxNiBzZXFubzsKKwl1MTYgcnhfbXR1OworCXU4IGhlYWRyb29tOworCXU4IHRhaWxyb29tOwogCXN0cnVjdCBtdXRleCBjb25mX211dGV4OwogCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKIAl1OCBic3NpZFtFVEhfQUxFTl07CisJX19sZTE2IGZpbHRlcl90eXBlOwogCXN0cnVjdCBwZGFfaXFfYXV0b2NhbF9lbnRyeSAqaXFfYXV0b2NhbDsKIAl1bnNpZ25lZCBpbnQgaXFfYXV0b2NhbF9sZW47CiAJc3RydWN0IHBkYV9jaGFubmVsX291dHB1dF9saW1pdCAqb3V0cHV0X2xpbWl0OwogCXVuc2lnbmVkIGludCBvdXRwdXRfbGltaXRfbGVuOwogCXN0cnVjdCBwZGFfcGFfY3VydmVfZGF0YSAqY3VydmVfZGF0YTsKLQlfX2xlMTYgcnhodzsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyX2ZsYWdzOworCXUxNiByeGh3OwogCXU4IHZlcnNpb247CisJdTggcnhfYW50ZW5uYTsKIAl1bnNpZ25lZCBpbnQgdHhfaGRyX2xlbjsKIAl2b2lkICpjYWNoZWRfdmRjZjsKIAl1bnNpZ25lZCBpbnQgZndfdmFyOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMgdHhfc3RhdHNbNF07CisJdW5zaWduZWQgaW50IGZ3X2ludGVyZmFjZTsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0X3Bvd2VyOworCXUzMiB0c2ZfbG93MzI7CisJdTMyIHRzZl9oaWdoMzI7CisJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyB0eF9zdGF0c1s4XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c190aW1lcjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGF0c19jb21wOworCXZvaWQgKmNhY2hlZF9zdGF0czsKKwlpbnQgbm9pc2U7CisJdm9pZCAqZWVwcm9tOworCXN0cnVjdCBjb21wbGV0aW9uIGVlcHJvbV9jb21wOwogfTsKIAogaW50IHA1NF9yeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBwNTRfcGFyc2VfZmlybXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKLWludCBwNTRfcGFyc2VfZWVwcm9tKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdm9pZCAqZWVwcm9tLCBpbnQgbGVuKTsKLXZvaWQgcDU0X2ZpbGxfZWVwcm9tX3JlYWRiYWNrKHN0cnVjdCBwNTRfY29udHJvbF9oZHIgKmhkcik7CitpbnQgcDU0X3BhcnNlX2Zpcm13YXJlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CitpbnQgcDU0X3JlYWRfZWVwcm9tKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldik7CiBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpwNTRfaW5pdF9jb21tb24oc2l6ZV90IHByaXZfZGF0YV9sZW4pOwogdm9pZCBwNTRfZnJlZV9jb21tb24oc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KTsKIAotI2VuZGlmIC8qIFBSSVNNNTRfSCAqLworI2VuZGlmIC8qIFA1NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmMKaW5kZXggMjliZTNkYy4uMTE3YzdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NGNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRjb21tb24uYwpAQCAtMjcsNyArMjcsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwcmlzbTU0Y29tbW9uIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcDU0X3JhdGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHA1NF9iZ3JhdGVzW10gPSB7CiAJeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAwLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAogCXsgLmJpdHJhdGUgPSAyMCwgLmh3X3ZhbHVlID0gMSwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwKIAl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDIsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCkBAIC00Miw3ICs0Miw3IEBACiAJeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMTEsIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHA1NF9jaGFubmVsc1tdID0geworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBwNTRfYmdjaGFubmVsc1tdID0gewogCXsgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwgfSwKIAl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIsIH0sCiAJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LApAQCAtNjAsMTQgKzYwLDY5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kXzJHSHogPSB7Ci0JLmNoYW5uZWxzID0gcDU0X2NoYW5uZWxzLAotCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShwNTRfY2hhbm5lbHMpLAotCS5iaXRyYXRlcyA9IHA1NF9yYXRlcywKLQkubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUocDU0X3JhdGVzKSwKKwkuY2hhbm5lbHMgPSBwNTRfYmdjaGFubmVscywKKwkubl9jaGFubmVscyA9IEFSUkFZX1NJWkUocDU0X2JnY2hhbm5lbHMpLAorCS5iaXRyYXRlcyA9IHA1NF9iZ3JhdGVzLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShwNTRfYmdyYXRlcyksCiB9OwogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHA1NF9hcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gNjAsIC5od192YWx1ZSA9IDQsIH0sCisJeyAuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSA1LCB9LAorCXsgLmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDYsIH0sCisJeyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gNywgfSwKKwl7IC5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSA4LCB9LAorCXsgLmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDksIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMTAsIH0sCisJeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMTEsIH0sCit9OwogCi12b2lkIHA1NF9wYXJzZV9maXJtd2FyZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHA1NF9hY2hhbm5lbHNbXSA9IHsKKwl7IC5jZW50ZXJfZnJlcSA9IDQ5MjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDQ5NDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDQ5NjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDQ5ODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUwNDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUwNjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUwODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUxNzAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUxODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUxOTAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyMDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyMTAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyMjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyMzAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyNDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyNjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUyODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUzMDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDUzMjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU1MDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU1MjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU1NDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU1NjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU1ODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU2MDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU2MjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU2NDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU2NjAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU2ODAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU3MDAgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU3NDUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU3NjUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU3ODUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU4MDUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDU4MjUgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGJhbmRfNUdIeiA9IHsKKwkuY2hhbm5lbHMgPSBwNTRfYWNoYW5uZWxzLAorCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShwNTRfYWNoYW5uZWxzKSwKKwkuYml0cmF0ZXMgPSBwNTRfYXJhdGVzLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShwNTRfYXJhdGVzKSwKK307CisKK2ludCBwNTRfcGFyc2VfZmlybXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQogewogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCXN0cnVjdCBib290cmVjX2V4cF9pZiAqZXhwX2lmOwpAQCAtNzksNyArMTM0LDcgQEAKIAlpbnQgaTsKIAogCWlmIChwcml2LT5yeF9zdGFydCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCXdoaWxlIChkYXRhIDwgZW5kX2RhdGEgJiYgKmRhdGEpCiAJCWRhdGErKzsKQEAgLTk0LDcgKzE0OSw5IEBACiAJCXUzMiBjb2RlID0gbGUzMl90b19jcHUoYm9vdHJlYy0+Y29kZSk7CiAJCXN3aXRjaCAoY29kZSkgewogCQljYXNlIEJSX0NPREVfQ09NUE9ORU5UX0lEOgotCQkJc3dpdGNoIChiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWJvb3RyZWMtPmRhdGEpKSB7CisJCQlwcml2LT5md19pbnRlcmZhY2UgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKQorCQkJCQkgICAgIGJvb3RyZWMtPmRhdGEpOworCQkJc3dpdGNoIChwcml2LT5md19pbnRlcmZhY2UpIHsKIAkJCWNhc2UgRldfRk1BQzoKIAkJCQlwcmludGsoS0VSTl9JTkZPICJwNTQ6IEZyZWVNQUMgZmlybXdhcmVcbiIpOwogCQkJCWJyZWFrOwpAQCAtMTA1LDcgKzE2Miw3IEBACiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAicDU0OiBMTTg2IGZpcm13YXJlXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgRldfTE04NzoKLQkJCQlwcmludGsoS0VSTl9JTkZPICJwNTQ6IExNODcgZmlybXdhcmUgLSBub3Qgc3VwcG9ydGVkIHlldCFcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gInA1NDogTE04NyBmaXJtd2FyZVxuIik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXByaW50ayhLRVJOX0lORk8gInA1NDogdW5rbm93biBmaXJtd2FyZVxuIik7CkBAIC0xMTcsMTEgKzE3NCwyMSBAQAogCQkJaWYgKHN0cm5sZW4oKHVuc2lnbmVkIGNoYXIqKWJvb3RyZWMtPmRhdGEsIDI0KSA8IDI0KQogCQkJCWZ3X3ZlcnNpb24gPSAodW5zaWduZWQgY2hhciopYm9vdHJlYy0+ZGF0YTsKIAkJCWJyZWFrOwotCQljYXNlIEJSX0NPREVfREVTQ1I6Ci0JCQlwcml2LT5yeF9zdGFydCA9IGxlMzJfdG9fY3B1KCgoX19sZTMyICopYm9vdHJlYy0+ZGF0YSlbMV0pOworCQljYXNlIEJSX0NPREVfREVTQ1I6IHsKKwkJCXN0cnVjdCBib290cmVjX2Rlc2MgKmRlc2MgPQorCQkJCShzdHJ1Y3QgYm9vdHJlY19kZXNjICopYm9vdHJlYy0+ZGF0YTsKKwkJCXByaXYtPnJ4X3N0YXJ0ID0gbGUzMl90b19jcHUoZGVzYy0+cnhfc3RhcnQpOwogCQkJLyogRklYTUUgYWRkIHNhbml0eSBjaGVja2luZyAqLwotCQkJcHJpdi0+cnhfZW5kID0gbGUzMl90b19jcHUoKChfX2xlMzIgKilib290cmVjLT5kYXRhKVsyXSkgLSAweDM1MDA7CisJCQlwcml2LT5yeF9lbmQgPSBsZTMyX3RvX2NwdShkZXNjLT5yeF9lbmQpIC0gMHgzNTAwOworCQkJcHJpdi0+aGVhZHJvb20gPSBkZXNjLT5oZWFkcm9vbTsKKwkJCXByaXYtPnRhaWxyb29tID0gZGVzYy0+dGFpbHJvb207CisJCQlpZiAobGUzMl90b19jcHUoYm9vdHJlYy0+bGVuKSA9PSAxMSkKKwkJCQlwcml2LT5yeF9tdHUgPSBsZTE2X3RvX2NwdShib290cmVjLT5yeF9tdHUpOworCQkJZWxzZQorCQkJCXByaXYtPnJ4X210dSA9IChzaXplX3QpCisJCQkJCTB4NjIwIC0gcHJpdi0+dHhfaGRyX2xlbjsKIAkJCWJyZWFrOworCQkJfQogCQljYXNlIEJSX0NPREVfRVhQT1NFRF9JRjoKIAkJCWV4cF9pZiA9IChzdHJ1Y3QgYm9vdHJlY19leHBfaWYgKikgYm9vdHJlYy0+ZGF0YTsKIAkJCWZvciAoaSA9IDA7IGkgPCAobGVuICogc2l6ZW9mKCpleHBfaWYpIC8gNCk7IGkrKykKQEAgLTE0NiwyMyArMjEzLDI1IEBACiAKIAlpZiAocHJpdi0+ZndfdmFyID49IDB4MzAwKSB7CiAJCS8qIEZpcm13YXJlIHN1cHBvcnRzIFFvUywgdXNlIGl0ISAqLwotCQlwcml2LT50eF9zdGF0c1swXS5saW1pdCA9IDM7Ci0JCXByaXYtPnR4X3N0YXRzWzFdLmxpbWl0ID0gNDsKLQkJcHJpdi0+dHhfc3RhdHNbMl0ubGltaXQgPSAzOwotCQlwcml2LT50eF9zdGF0c1szXS5saW1pdCA9IDE7CisJCXByaXYtPnR4X3N0YXRzWzRdLmxpbWl0ID0gMzsKKwkJcHJpdi0+dHhfc3RhdHNbNV0ubGltaXQgPSA0OworCQlwcml2LT50eF9zdGF0c1s2XS5saW1pdCA9IDM7CisJCXByaXYtPnR4X3N0YXRzWzddLmxpbWl0ID0gMTsKIAkJZGV2LT5xdWV1ZXMgPSA0OwogCX0KKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocDU0X3BhcnNlX2Zpcm13YXJlKTsKIAotc3RhdGljIGludCBwNTRfY29udmVydF9yZXYwX3RvX3JldjEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGEgKmN1cnZlX2RhdGEpCitzdGF0aWMgaW50IHA1NF9jb252ZXJ0X3JldjAoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICAgIHN0cnVjdCBwZGFfcGFfY3VydmVfZGF0YSAqY3VydmVfZGF0YSkKIHsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGFfc2FtcGxlX3JldjEgKnJldjE7Ci0Jc3RydWN0IHBkYV9wYV9jdXJ2ZV9kYXRhX3NhbXBsZV9yZXYwICpyZXYwOworCXN0cnVjdCBwNTRfcGFfY3VydmVfZGF0YV9zYW1wbGUgKmRzdDsKKwlzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGFfc2FtcGxlX3JldjAgKnNyYzsKIAlzaXplX3QgY2RfbGVuID0gc2l6ZW9mKCpjdXJ2ZV9kYXRhKSArCi0JCShjdXJ2ZV9kYXRhLT5wb2ludHNfcGVyX2NoYW5uZWwqc2l6ZW9mKCpyZXYxKSArIDIpICoKKwkJKGN1cnZlX2RhdGEtPnBvaW50c19wZXJfY2hhbm5lbCpzaXplb2YoKmRzdCkgKyAyKSAqCiAJCSBjdXJ2ZV9kYXRhLT5jaGFubmVsczsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAl2b2lkICpzb3VyY2UsICp0YXJnZXQ7CkBAIC0xODAsMjggKzI0OSw2OCBAQAogCQkqKChfX2xlMTYgKil0YXJnZXQpID0gKmZyZXE7CiAJCXRhcmdldCArPSBzaXplb2YoX19sZTE2KTsKIAkJZm9yIChqID0gMDsgaiA8IGN1cnZlX2RhdGEtPnBvaW50c19wZXJfY2hhbm5lbDsgaisrKSB7Ci0JCQlyZXYxID0gdGFyZ2V0OwotCQkJcmV2MCA9IHNvdXJjZTsKKwkJCWRzdCA9IHRhcmdldDsKKwkJCXNyYyA9IHNvdXJjZTsKIAotCQkJcmV2MS0+cmZfcG93ZXIgPSByZXYwLT5yZl9wb3dlcjsKLQkJCXJldjEtPnBhX2RldGVjdG9yID0gcmV2MC0+cGFfZGV0ZWN0b3I7Ci0JCQlyZXYxLT5kYXRhXzY0cWFtID0gcmV2MC0+cGN2OworCQkJZHN0LT5yZl9wb3dlciA9IHNyYy0+cmZfcG93ZXI7CisJCQlkc3QtPnBhX2RldGVjdG9yID0gc3JjLT5wYV9kZXRlY3RvcjsKKwkJCWRzdC0+ZGF0YV82NHFhbSA9IHNyYy0+cGN2OwogCQkJLyogImludmVudCIgdGhlIHBvaW50cyBmb3IgdGhlIG90aGVyIG1vZHVsYXRpb25zICovCiAjZGVmaW5lIFNVQih4LHkpICh1OCkoKHgpIC0gKHkpKSA+ICh4KSA/IDAgOiAoeCkgLSAoeSkKLQkJCXJldjEtPmRhdGFfMTZxYW0gPSBTVUIocmV2MC0+cGN2LCAxMik7Ci0JCQlyZXYxLT5kYXRhX3Fwc2sgID0gU1VCKHJldjEtPmRhdGFfMTZxYW0sIDEyKTsKLQkJCXJldjEtPmRhdGFfYnBzayAgPSBTVUIocmV2MS0+ZGF0YV9xcHNrLCAxMik7Ci0JCQlyZXYxLT5kYXRhX2Jhcmtlcj0gU1VCKHJldjEtPmRhdGFfYnBzaywgMTQpOworCQkJZHN0LT5kYXRhXzE2cWFtID0gU1VCKHNyYy0+cGN2LCAxMik7CisJCQlkc3QtPmRhdGFfcXBzayA9IFNVQihkc3QtPmRhdGFfMTZxYW0sIDEyKTsKKwkJCWRzdC0+ZGF0YV9icHNrID0gU1VCKGRzdC0+ZGF0YV9xcHNrLCAxMik7CisJCQlkc3QtPmRhdGFfYmFya2VyID0gU1VCKGRzdC0+ZGF0YV9icHNrLCAxNCk7CiAjdW5kZWYgU1VCCi0JCQl0YXJnZXQgKz0gc2l6ZW9mKCpyZXYxKTsKLQkJCXNvdXJjZSArPSBzaXplb2YoKnJldjApOworCQkJdGFyZ2V0ICs9IHNpemVvZigqZHN0KTsKKwkJCXNvdXJjZSArPSBzaXplb2YoKnNyYyk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHA1NF9wYXJzZV9lZXByb20oc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB2b2lkICplZXByb20sIGludCBsZW4pCitzdGF0aWMgaW50IHA1NF9jb252ZXJ0X3JldjEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICAgIHN0cnVjdCBwZGFfcGFfY3VydmVfZGF0YSAqY3VydmVfZGF0YSkKK3sKKwlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcDU0X3BhX2N1cnZlX2RhdGFfc2FtcGxlICpkc3Q7CisJc3RydWN0IHBkYV9wYV9jdXJ2ZV9kYXRhX3NhbXBsZV9yZXYxICpzcmM7CisJc2l6ZV90IGNkX2xlbiA9IHNpemVvZigqY3VydmVfZGF0YSkgKworCQkoY3VydmVfZGF0YS0+cG9pbnRzX3Blcl9jaGFubmVsKnNpemVvZigqZHN0KSArIDIpICoKKwkJIGN1cnZlX2RhdGEtPmNoYW5uZWxzOworCXVuc2lnbmVkIGludCBpLCBqOworCXZvaWQgKnNvdXJjZSwgKnRhcmdldDsKKworCXByaXYtPmN1cnZlX2RhdGEgPSBrbWFsbG9jKGNkX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5jdXJ2ZV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShwcml2LT5jdXJ2ZV9kYXRhLCBjdXJ2ZV9kYXRhLCBzaXplb2YoKmN1cnZlX2RhdGEpKTsKKwlzb3VyY2UgPSBjdXJ2ZV9kYXRhLT5kYXRhOworCXRhcmdldCA9IHByaXYtPmN1cnZlX2RhdGEtPmRhdGE7CisJZm9yIChpID0gMDsgaSA8IGN1cnZlX2RhdGEtPmNoYW5uZWxzOyBpKyspIHsKKwkJX19sZTE2ICpmcmVxID0gc291cmNlOworCQlzb3VyY2UgKz0gc2l6ZW9mKF9fbGUxNik7CisJCSooKF9fbGUxNiAqKXRhcmdldCkgPSAqZnJlcTsKKwkJdGFyZ2V0ICs9IHNpemVvZihfX2xlMTYpOworCQlmb3IgKGogPSAwOyBqIDwgY3VydmVfZGF0YS0+cG9pbnRzX3Blcl9jaGFubmVsOyBqKyspIHsKKwkJCW1lbWNweSh0YXJnZXQsIHNvdXJjZSwgc2l6ZW9mKCpzcmMpKTsKKworCQkJdGFyZ2V0ICs9IHNpemVvZigqZHN0KTsKKwkJCXNvdXJjZSArPSBzaXplb2YoKnNyYyk7CisJCX0KKwkJc291cmNlKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwNTRfcmZfY2hpcHNbXSA9IHsgIk5VTEwiLCAiSW5kaWdvPyIsICJEdWV0dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyaXNiZWUiLCAiWGJvdyIsICJMb25nYm93IiB9Oworc3RhdGljIGludCBwNTRfaW5pdF94Ym93X3N5bnRoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldik7CisKK3N0YXRpYyBpbnQgcDU0X3BhcnNlX2VlcHJvbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHZvaWQgKmVlcHJvbSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgZWVwcm9tX3BkYV93cmFwICp3cmFwID0gTlVMTDsKQEAgLTIxMCw2ICszMTksNyBAQAogCXZvaWQgKnRtcDsKIAlpbnQgZXJyOwogCXU4ICplbmQgPSAodTggKillZXByb20gKyBsZW47CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKIAl3cmFwID0gKHN0cnVjdCBlZXByb21fcGRhX3dyYXAgKikgZWVwcm9tOwogCWVudHJ5ID0gKHZvaWQgKil3cmFwLT5kYXRhICsgbGUxNl90b19jcHUod3JhcC0+bGVuKTsKQEAgLTI1MCwyNyArMzYwLDMyIEBACiAJCQkgICAgICAgZW50cnktPmRhdGFbMV0qc2l6ZW9mKCpwcml2LT5vdXRwdXRfbGltaXQpKTsKIAkJCXByaXYtPm91dHB1dF9saW1pdF9sZW4gPSBlbnRyeS0+ZGF0YVsxXTsKIAkJCWJyZWFrOwotCQljYXNlIFBEUl9QUklTTV9QQV9DQUxfQ1VSVkVfREFUQToKLQkJCWlmIChkYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGEpKSB7CisJCWNhc2UgUERSX1BSSVNNX1BBX0NBTF9DVVJWRV9EQVRBOiB7CisJCQlzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGEgKmN1cnZlX2RhdGEgPQorCQkJCShzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGEgKillbnRyeS0+ZGF0YTsKKwkJCWlmIChkYXRhX2xlbiA8IHNpemVvZigqY3VydmVfZGF0YSkpIHsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCi0JCQlpZiAoKChzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGEgKillbnRyeS0+ZGF0YSktPmNhbF9tZXRob2RfcmV2KSB7Ci0JCQkJcHJpdi0+Y3VydmVfZGF0YSA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwotCQkJCWlmICghcHJpdi0+Y3VydmVfZGF0YSkgewotCQkJCQllcnIgPSAtRU5PTUVNOwotCQkJCQlnb3RvIGVycjsKLQkJCQl9Ci0KLQkJCQltZW1jcHkocHJpdi0+Y3VydmVfZGF0YSwgZW50cnktPmRhdGEsIGRhdGFfbGVuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyID0gcDU0X2NvbnZlcnRfcmV2MF90b19yZXYxKGRldiwgKHN0cnVjdCBwZGFfcGFfY3VydmVfZGF0YSAqKWVudHJ5LT5kYXRhKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIGVycjsKKwkJCXN3aXRjaCAoY3VydmVfZGF0YS0+Y2FsX21ldGhvZF9yZXYpIHsKKwkJCWNhc2UgMDoKKwkJCQllcnIgPSBwNTRfY29udmVydF9yZXYwKGRldiwgY3VydmVfZGF0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJZXJyID0gcDU0X2NvbnZlcnRfcmV2MShkZXYsIGN1cnZlX2RhdGEpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgInA1NDogdW5rbm93biBjdXJ2ZSBkYXRhICIKKwkJCQkJCSJyZXZpc2lvbiAlZFxuIiwKKwkJCQkJCWN1cnZlX2RhdGEtPmNhbF9tZXRob2RfcmV2KTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWJyZWFrOwogCQkJfQorCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycjsKIAotCQkJYnJlYWs7CisJCX0KIAkJY2FzZSBQRFJfUFJJU01fWklGX1RYX0lRX0NBTElCUkFUSU9OOgogCQkJcHJpdi0+aXFfYXV0b2NhbCA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQkJaWYgKCFwcml2LT5pcV9hdXRvY2FsKSB7CkBAIC0yODYsNyArNDAxLDcgQEAKIAkJCXdoaWxlICgodTggKil0bXAgPCBlbnRyeS0+ZGF0YSArIGRhdGFfbGVuKSB7CiAJCQkJc3RydWN0IGJvb3RyZWNfZXhwX2lmICpleHBfaWYgPSB0bXA7CiAJCQkJaWYgKGxlMTZfdG9fY3B1KGV4cF9pZi0+aWZfaWQpID09IDB4RikKLQkJCQkJcHJpdi0+cnhodyA9IGV4cF9pZi0+dmFyaWFudCAmIGNwdV90b19sZTE2KDB4MDcpOworCQkJCQlwcml2LT5yeGh3ID0gbGUxNl90b19jcHUoZXhwX2lmLT52YXJpYW50KSAmIDB4MDc7CiAJCQkJdG1wICs9IHNpemVvZihzdHJ1Y3QgYm9vdHJlY19leHBfaWYpOwogCQkJfQogCQkJYnJlYWs7CkBAIC0zMTIsNiArNDI3LDM3IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCXN3aXRjaCAocHJpdi0+cnhodykgeworCWNhc2UgNDogLyogWEJvdyAqLworCQlwNTRfaW5pdF94Ym93X3N5bnRoKGRldik7CisJY2FzZSAxOiAvKiBJbmRpZ28/ICovCisJY2FzZSAyOiAvKiBEdWV0dGUgKi8KKwkJZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmYmFuZF81R0h6OworCWNhc2UgMzogLyogRnJpc2JlZSAqLworCWNhc2UgNTogLyogTG9uZ2JvdyAqLworCQlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZiYW5kXzJHSHo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuc3VwcG9ydGVkIFJGLUNoaXBcbiIsCisJCQl3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+d2lwaHktPnBlcm1fYWRkcikpIHsKKwkJdTggcGVybV9hZGRyW0VUSF9BTEVOXTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBod2FkZHIhIFVzaW5nIHJhbmRvbWx5IGdlbmVyYXRlZCBNQUMgYWRkclxuIiwKKwkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQlyYW5kb21fZXRoZXJfYWRkcihwZXJtX2FkZHIpOworCQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihkZXYsIHBlcm1fYWRkcik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGh3YWRkciAlcywgTUFDOmlzbDM4JTAyeCBSRjolc1xuIiwKKwkJd2lwaHlfbmFtZShkZXYtPndpcGh5KSwKKwkJcHJpbnRfbWFjKG1hYywgZGV2LT53aXBoeS0+cGVybV9hZGRyKSwKKwkJcHJpdi0+dmVyc2lvbiwgcDU0X3JmX2NoaXBzW3ByaXYtPnJ4aHddKTsKKwogCXJldHVybiAwOwogCiAgIGVycjoKQEAgLTMzMyw0MiArNDc5LDU2IEBACiAJcHJpbnRrKEtFUk5fRVJSICJwNTQ6IGVlcHJvbSBwYXJzZSBmYWlsZWQhXG4iKTsKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocDU0X3BhcnNlX2VlcHJvbSk7CiAKLXZvaWQgcDU0X2ZpbGxfZWVwcm9tX3JlYWRiYWNrKHN0cnVjdCBwNTRfY29udHJvbF9oZHIgKmhkcikKK3N0YXRpYyBpbnQgcDU0X3Jzc2lfdG9fZGJtKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgaW50IHJzc2kpCiB7Ci0Jc3RydWN0IHA1NF9lZXByb21fbG04NiAqZWVwcm9tX2hkcjsKLQotCWhkci0+bWFnaWMxID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKLQloZHItPmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqZWVwcm9tX2hkcikgKyAweDIwMDApOwotCWhkci0+dHlwZSA9IGNwdV90b19sZTE2KFA1NF9DT05UUk9MX1RZUEVfRUVQUk9NX1JFQURCQUNLKTsKLQloZHItPnJldHJ5MSA9IGhkci0+cmV0cnkyID0gMDsKLQllZXByb21faGRyID0gKHN0cnVjdCBwNTRfZWVwcm9tX2xtODYgKikgaGRyLT5kYXRhOwotCWVlcHJvbV9oZHItPm9mZnNldCA9IDB4MDsKLQllZXByb21faGRyLT5sZW4gPSBjcHVfdG9fbGUxNigweDIwMDApOworCS8qIFRPRE86IGdldCB0aGUgcnNzaV9hZGQgJiByc3NpX211bCBkYXRhIGZyb20gdGhlIGVlcHJvbSAqLworCXJldHVybiAoKHJzc2kgKiAweDgzKSAvIDY0IC0gNDAwKSAvIDQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwNTRfZmlsbF9lZXByb21fcmVhZGJhY2spOwogCi1zdGF0aWMgdm9pZCBwNTRfcnhfZGF0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHA1NF9yeF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgcDU0X3J4X2hkciAqaGRyID0gKHN0cnVjdCBwNTRfcnhfaGRyICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7MH07CiAJdTE2IGZyZXEgPSBsZTE2X3RvX2NwdShoZHItPmZyZXEpOworCXNpemVfdCBoZWFkZXJfbGVuID0gc2l6ZW9mKCpoZHIpOworCXUzMiB0c2YzMjsKIAotCXJ4X3N0YXR1cy5zaWduYWwgPSBoZHItPnJzc2k7CisJaWYgKCEoaGRyLT5tYWdpYyAmIGNwdV90b19sZTE2KDB4MDAwMSkpKSB7CisJCWlmIChwcml2LT5maWx0ZXJfZmxhZ3MgJiBGSUZfRkNTRkFJTCkKKwkJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCXJ4X3N0YXR1cy5zaWduYWwgPSBwNTRfcnNzaV90b19kYm0oZGV2LCBoZHItPnJzc2kpOworCXJ4X3N0YXR1cy5ub2lzZSA9IHByaXYtPm5vaXNlOwogCS8qIFhYIGNvcnJlY3Q/ICovCiAJcnhfc3RhdHVzLnF1YWwgPSAoMTAwICogaGRyLT5yc3NpKSAvIDEyNzsKLQlyeF9zdGF0dXMucmF0ZV9pZHggPSBoZHItPnJhdGUgJiAweGY7CisJcnhfc3RhdHVzLnJhdGVfaWR4ID0gKGRldi0+Y29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogPworCQkJaGRyLT5yYXRlIDogKGhkci0+cmF0ZSAtIDQpKSAmIDB4ZjsKIAlyeF9zdGF0dXMuZnJlcSA9IGZyZXE7Ci0Jcnhfc3RhdHVzLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOworCXJ4X3N0YXR1cy5iYW5kID0gIGRldi0+Y29uZi5jaGFubmVsLT5iYW5kOwogCXJ4X3N0YXR1cy5hbnRlbm5hID0gaGRyLT5hbnRlbm5hOwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUoaGRyLT50aW1lc3RhbXApOworCisJdHNmMzIgPSBsZTMyX3RvX2NwdShoZHItPnRzZjMyKTsKKwlpZiAodHNmMzIgPCBwcml2LT50c2ZfbG93MzIpCisJCXByaXYtPnRzZl9oaWdoMzIrKzsKKwlyeF9zdGF0dXMubWFjdGltZSA9ICgodTY0KXByaXYtPnRzZl9oaWdoMzIpIDw8IDMyIHwgdHNmMzI7CisJcHJpdi0+dHNmX2xvdzMyID0gdHNmMzI7CisKIAlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1RTRlQ7CiAKLQlza2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7CisJaWYgKGhkci0+bWFnaWMgJiBjcHVfdG9fbGUxNigweDQwMDApKQorCQloZWFkZXJfbGVuICs9IGhkci0+YWxpZ25bMF07CisKKwlza2JfcHVsbChza2IsIGhlYWRlcl9sZW4pOwogCXNrYl90cmltKHNrYiwgbGUxNl90b19jcHUoaGRyLT5sZW4pKTsKIAogCWllZWU4MDIxMV9yeF9pcnFzYWZlKGRldiwgc2tiLCAmcnhfc3RhdHVzKTsKKworCXJldHVybiAtMTsKIH0KIAogc3RhdGljIHZvaWQgaW5saW5lIHA1NF93YWtlX2ZyZWVfcXVldWVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKQEAgLTM3Nyw3ICs1MzcsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+cXVldWVzOyBpKyspCi0JCWlmIChwcml2LT50eF9zdGF0c1tpXS5sZW4gPCBwcml2LT50eF9zdGF0c1tpXS5saW1pdCkKKwkJaWYgKHByaXYtPnR4X3N0YXRzW2kgKyA0XS5sZW4gPCBwcml2LT50eF9zdGF0c1tpICsgNF0ubGltaXQpCiAJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShkZXYsIGkpOwogfQogCkBAIC0zODcsMTEgKzU0NywxMyBAQAogCXN0cnVjdCBwNTRfY29udHJvbF9oZHIgKmhkciA9IChzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3QgcDU0X2ZyYW1lX3NlbnRfaGRyICpwYXlsb2FkID0gKHN0cnVjdCBwNTRfZnJhbWVfc2VudF9oZHIgKikgaGRyLT5kYXRhOwogCXN0cnVjdCBza19idWZmICplbnRyeSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBwcml2LT50eF9xdWV1ZS5uZXh0OwotCXUzMiBhZGRyID0gbGUzMl90b19jcHUoaGRyLT5yZXFfaWQpIC0gMHg3MDsKKwl1MzIgYWRkciA9IGxlMzJfdG9fY3B1KGhkci0+cmVxX2lkKSAtIHByaXYtPmhlYWRyb29tOwogCXN0cnVjdCBtZW1yZWNvcmQgKnJhbmdlID0gTlVMTDsKIAl1MzIgZnJlZWQgPSAwOwogCXUzMiBsYXN0X2FkZHIgPSBwcml2LT5yeF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X3F1ZXVlLmxvY2ssIGZsYWdzKTsKIAl3aGlsZSAoZW50cnkgIT0gKHN0cnVjdCBza19idWZmICopJnByaXYtPnR4X3F1ZXVlKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoZW50cnkpOwogCQlyYW5nZSA9ICh2b2lkICopaW5mby0+ZHJpdmVyX2RhdGE7CkBAIC00MTIsMTMgKzU3NCwxNSBAQAogCiAJCQlsYXN0X2FkZHIgPSByYW5nZS0+ZW5kX2FkZHI7CiAJCQlfX3NrYl91bmxpbmsoZW50cnksICZwcml2LT50eF9xdWV1ZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKIAkJCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7CiAJCQllbnRyeV9oZHIgPSAoc3RydWN0IHA1NF9jb250cm9sX2hkciAqKSBlbnRyeS0+ZGF0YTsKIAkJCWVudHJ5X2RhdGEgPSAoc3RydWN0IHA1NF90eF9jb250cm9sX2FsbG9jZGF0YSAqKSBlbnRyeV9oZHItPmRhdGE7CiAJCQlpZiAoKGVudHJ5X2hkci0+bWFnaWMxICYgY3B1X3RvX2xlMTYoMHg0MDAwKSkgIT0gMCkKIAkJCQlwYWQgPSBlbnRyeV9kYXRhLT5hbGlnblswXTsKIAotCQkJcHJpdi0+dHhfc3RhdHNbZW50cnlfZGF0YS0+aHdfcXVldWUgLSA0XS5sZW4tLTsKKwkJCXByaXYtPnR4X3N0YXRzW2VudHJ5X2RhdGEtPmh3X3F1ZXVlXS5sZW4tLTsKIAkJCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKSB7CiAJCQkJaWYgKCEocGF5bG9hZC0+c3RhdHVzICYgMHgwMSkpCiAJCQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKQEAgLTQyNiwyMSArNTkwLDYwIEBACiAJCQkJCWluZm8tPnN0YXR1cy5leGNlc3NpdmVfcmV0cmllcyA9IDE7CiAJCQl9CiAJCQlpbmZvLT5zdGF0dXMucmV0cnlfY291bnQgPSBwYXlsb2FkLT5yZXRyaWVzIC0gMTsKLQkJCWluZm8tPnN0YXR1cy5hY2tfc2lnbmFsID0gbGUxNl90b19jcHUocGF5bG9hZC0+YWNrX3Jzc2kpOworCQkJaW5mby0+c3RhdHVzLmFja19zaWduYWwgPSBwNTRfcnNzaV90b19kYm0oZGV2LAorCQkJCQlsZTE2X3RvX2NwdShwYXlsb2FkLT5hY2tfcnNzaSkpOwogCQkJc2tiX3B1bGwoZW50cnksIHNpemVvZigqaGRyKSArIHBhZCArIHNpemVvZigqZW50cnlfZGF0YSkpOwogCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKGRldiwgZW50cnkpOwotCQkJYnJlYWs7CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlCiAJCQlsYXN0X2FkZHIgPSByYW5nZS0+ZW5kX2FkZHI7CiAJCWVudHJ5ID0gZW50cnktPm5leHQ7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X3F1ZXVlLmxvY2ssIGZsYWdzKTsKIAorb3V0OgogCWlmIChmcmVlZCA+PSBJRUVFODAyMTFfTUFYX1JUU19USFJFU0hPTEQgKyAweDE3MCArCiAJICAgIHNpemVvZihzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyKSkKIAkJcDU0X3dha2VfZnJlZV9xdWV1ZXMoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgcDU0X3J4X2NvbnRyb2woc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgcDU0X3J4X2VlcHJvbV9yZWFkYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHIgPSAoc3RydWN0IHA1NF9jb250cm9sX2hkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IHA1NF9lZXByb21fbG04NiAqZWVwcm9tID0gKHN0cnVjdCBwNTRfZWVwcm9tX2xtODYgKikgaGRyLT5kYXRhOworCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OworCisJaWYgKCFwcml2LT5lZXByb20pCisJCXJldHVybiA7CisKKwltZW1jcHkocHJpdi0+ZWVwcm9tLCBlZXByb20tPmRhdGEsIGxlMTZfdG9fY3B1KGVlcHJvbS0+bGVuKSk7CisKKwljb21wbGV0ZSgmcHJpdi0+ZWVwcm9tX2NvbXApOworfQorCitzdGF0aWMgdm9pZCBwNTRfcnhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBwNTRfY29udHJvbF9oZHIgKmhkciA9IChzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgcDU0X3N0YXRpc3RpY3MgKnN0YXRzID0gKHN0cnVjdCBwNTRfc3RhdGlzdGljcyAqKSBoZHItPmRhdGE7CisJdTMyIHRzZjMyID0gbGUzMl90b19jcHUoc3RhdHMtPnRzZjMyKTsKKworCWlmICh0c2YzMiA8IHByaXYtPnRzZl9sb3czMikKKwkJcHJpdi0+dHNmX2hpZ2gzMisrOworCXByaXYtPnRzZl9sb3czMiA9IHRzZjMyOworCisJcHJpdi0+c3RhdHMuZG90MTFSVFNGYWlsdXJlQ291bnQgPSBsZTMyX3RvX2NwdShzdGF0cy0+cnRzX2ZhaWwpOworCXByaXYtPnN0YXRzLmRvdDExUlRTU3VjY2Vzc0NvdW50ID0gbGUzMl90b19jcHUoc3RhdHMtPnJ0c19zdWNjZXNzKTsKKwlwcml2LT5zdGF0cy5kb3QxMUZDU0Vycm9yQ291bnQgPSBsZTMyX3RvX2NwdShzdGF0cy0+cnhfYmFkX2Zjcyk7CisKKwlwcml2LT5ub2lzZSA9IHA1NF9yc3NpX3RvX2RibShkZXYsIGxlMzJfdG9fY3B1KHN0YXRzLT5ub2lzZSkpOworCWNvbXBsZXRlKCZwcml2LT5zdGF0c19jb21wKTsKKworCW1vZF90aW1lcigmcHJpdi0+c3RhdHNfdGltZXIsIGppZmZpZXMgKyA1ICogSFopOworfQorCitzdGF0aWMgaW50IHA1NF9yeF9jb250cm9sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHIgPSAoc3RydWN0IHA1NF9jb250cm9sX2hkciAqKSBza2ItPmRhdGE7CiAKQEAgLTQ1MCwzNiArNjUzLDMwIEBACiAJCWJyZWFrOwogCWNhc2UgUDU0X0NPTlRST0xfVFlQRV9CQlA6CiAJCWJyZWFrOworCWNhc2UgUDU0X0NPTlRST0xfVFlQRV9TVEFUX1JFQURCQUNLOgorCQlwNTRfcnhfc3RhdHMoZGV2LCBza2IpOworCQlicmVhazsKKwljYXNlIFA1NF9DT05UUk9MX1RZUEVfRUVQUk9NX1JFQURCQUNLOgorCQlwNTRfcnhfZWVwcm9tX3JlYWRiYWNrKGRldiwgc2tiKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBub3QgaGFuZGxpbmcgMHglMDJ4IHR5cGUgY29udHJvbCBmcmFtZVxuIiwKIAkJICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksIGxlMTZfdG9fY3B1KGhkci0+dHlwZSkpOwogCQlicmVhazsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyogcmV0dXJucyB6ZXJvIGlmIHNrYiBjYW4gYmUgcmV1c2VkICovCiBpbnQgcDU0X3J4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1OCB0eXBlID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopc2tiLT5kYXRhKSkgPj4gODsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIDB4MDA6Ci0JY2FzZSAweDAxOgotCQlwNTRfcnhfZGF0YShkZXYsIHNrYik7Ci0JCXJldHVybiAtMTsKLQljYXNlIDB4NGQ6Ci0JCS8qIFRPRE86IGRvIHNvbWV0aGluZyBiZXR0ZXIuLi4gYnV0IHRoZW4gYWdhaW4sIEkndmUgbmV2ZXIgc2VlbiB0aGlzIGhhcHBlbiAqLwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlZCBmYXVsdC4gUHJvYmFibHkgbmVlZCB0byByZXN0YXJ0IGhhcmR3YXJlIG5vdy4uXG4iLAotCQkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7Ci0JCWJyZWFrOwotCWNhc2UgMHg4MDoKLQkJcDU0X3J4X2NvbnRyb2woZGV2LCBza2IpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGZyYW1lIFJYZWQgKDB4JTAyeClcbiIsCi0JCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLCB0eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOworCisJaWYgKHR5cGUgPT0gMHg4MCkKKwkJcmV0dXJuIHA1NF9yeF9jb250cm9sKGRldiwgc2tiKTsKKwllbHNlCisJCXJldHVybiBwNTRfcnhfZGF0YShkZXYsIHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwNTRfcngpOwogCkBAIC01MDMsNyArNzAwLDcgQEAKIAl1MzIgdGFyZ2V0X2FkZHIgPSBwcml2LT5yeF9zdGFydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBsZWZ0OwotCWxlbiA9IChsZW4gKyAweDE3MCArIDMpICYgfjB4MzsgLyogMHg3MCBoZWFkcm9vbSwgMHgxMDAgdGFpbHJvb20gKi8KKwlsZW4gPSAobGVuICsgcHJpdi0+aGVhZHJvb20gKyBwcml2LT50YWlscm9vbSArIDMpICYgfjB4MzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CiAJbGVmdCA9IHNrYl9xdWV1ZV9sZW4oJnByaXYtPnR4X3F1ZXVlKTsKQEAgLTUzOCwxNSArNzM1LDc1IEBACiAJCXJhbmdlLT5zdGFydF9hZGRyID0gdGFyZ2V0X2FkZHI7CiAJCXJhbmdlLT5lbmRfYWRkciA9IHRhcmdldF9hZGRyICsgbGVuOwogCQlfX3NrYl9xdWV1ZV9hZnRlcigmcHJpdi0+dHhfcXVldWUsIHRhcmdldF9za2IsIHNrYik7Ci0JCWlmIChsYXJnZXN0X2hvbGUgPCBJRUVFODAyMTFfTUFYX1JUU19USFJFU0hPTEQgKyAweDE3MCArCisJCWlmIChsYXJnZXN0X2hvbGUgPCBwcml2LT5yeF9tdHUgKyBwcml2LT5oZWFkcm9vbSArCisJCQkJICAgcHJpdi0+dGFpbHJvb20gKwogCQkJCSAgIHNpemVvZihzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyKSkKIAkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhkZXYpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CiAKLQlkYXRhLT5yZXFfaWQgPSBjcHVfdG9fbGUzMih0YXJnZXRfYWRkciArIDB4NzApOworCWRhdGEtPnJlcV9pZCA9IGNwdV90b19sZTMyKHRhcmdldF9hZGRyICsgcHJpdi0+aGVhZHJvb20pOwogfQogCitpbnQgcDU0X3JlYWRfZWVwcm9tKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHIgPSBOVUxMOworCXN0cnVjdCBwNTRfZWVwcm9tX2xtODYgKmVlcHJvbV9oZHI7CisJc2l6ZV90IGVlcHJvbV9zaXplID0gMHgyMDIwLCBvZmZzZXQgPSAwLCBibG9ja3NpemU7CisJaW50IHJldCA9IC1FTk9NRU07CisJdm9pZCAqZWVwcm9tID0gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICopa3phbGxvYyhzaXplb2YoKmhkcikgKworCQlzaXplb2YoKmVlcHJvbV9oZHIpICsgRUVQUk9NX1JFQURCQUNLX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZHIpCisJCWdvdG8gZnJlZTsKKworCXByaXYtPmVlcHJvbSA9IGt6YWxsb2MoRUVQUk9NX1JFQURCQUNLX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5lZXByb20pCisJCWdvdG8gZnJlZTsKKworCWVlcHJvbSA9IGt6YWxsb2MoZWVwcm9tX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZWVwcm9tKQorCQlnb3RvIGZyZWU7CisKKwloZHItPm1hZ2ljMSA9IGNwdV90b19sZTE2KDB4ODAwMCk7CisJaGRyLT50eXBlID0gY3B1X3RvX2xlMTYoUDU0X0NPTlRST0xfVFlQRV9FRVBST01fUkVBREJBQ0spOworCWhkci0+cmV0cnkxID0gaGRyLT5yZXRyeTIgPSAwOworCWVlcHJvbV9oZHIgPSAoc3RydWN0IHA1NF9lZXByb21fbG04NiAqKSBoZHItPmRhdGE7CisKKwl3aGlsZSAoZWVwcm9tX3NpemUpIHsKKwkJYmxvY2tzaXplID0gbWluKGVlcHJvbV9zaXplLCAoc2l6ZV90KUVFUFJPTV9SRUFEQkFDS19MRU4pOworCQloZHItPmxlbiA9IGNwdV90b19sZTE2KGJsb2Nrc2l6ZSArIHNpemVvZigqZWVwcm9tX2hkcikpOworCQllZXByb21faGRyLT5vZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCQllZXByb21faGRyLT5sZW4gPSBjcHVfdG9fbGUxNihibG9ja3NpemUpOworCQlwNTRfYXNzaWduX2FkZHJlc3MoZGV2LCBOVUxMLCBoZHIsIGxlMTZfdG9fY3B1KGhkci0+bGVuKSArCisJCQkJICAgc2l6ZW9mKCpoZHIpKTsKKwkJcHJpdi0+dHgoZGV2LCBoZHIsIGxlMTZfdG9fY3B1KGhkci0+bGVuKSArIHNpemVvZigqaGRyKSwgMCk7CisKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcHJpdi0+ZWVwcm9tX2NvbXAsIEhaKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQhXG4iLAorCQkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBmcmVlOworCSAgICAgICAgfQorCisJCW1lbWNweShlZXByb20gKyBvZmZzZXQsIHByaXYtPmVlcHJvbSwgYmxvY2tzaXplKTsKKwkJb2Zmc2V0ICs9IGJsb2Nrc2l6ZTsKKwkJZWVwcm9tX3NpemUgLT0gYmxvY2tzaXplOworCX0KKworCXJldCA9IHA1NF9wYXJzZV9lZXByb20oZGV2LCBlZXByb20sIG9mZnNldCk7CitmcmVlOgorCWtmcmVlKHByaXYtPmVlcHJvbSk7CisJcHJpdi0+ZWVwcm9tID0gTlVMTDsKKwlrZnJlZShoZHIpOworCWtmcmVlKGVlcHJvbSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocDU0X3JlYWRfZWVwcm9tKTsKKwogc3RhdGljIGludCBwNTRfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKQEAgLTU1OSw3ICs4MTYsNyBAQAogCXU4IHJhdGU7CiAJdTggY3RzX3JhdGUgPSAweDIwOwogCi0JY3VycmVudF9xdWV1ZSA9ICZwcml2LT50eF9zdGF0c1tza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CisJY3VycmVudF9xdWV1ZSA9ICZwcml2LT50eF9zdGF0c1tza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSArIDRdOwogCWlmICh1bmxpa2VseShjdXJyZW50X3F1ZXVlLT5sZW4gPiBjdXJyZW50X3F1ZXVlLT5saW1pdCkpCiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAljdXJyZW50X3F1ZXVlLT5sZW4rKzsKQEAgLTYwMSw3ICs4NTgsNyBAQAogCXR4aGRyLT5od19xdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpICsgNDsKIAl0eGhkci0+dHhfYW50ZW5uYSA9IChpbmZvLT5hbnRlbm5hX3NlbF90eCA9PSAwKSA/CiAJCTIgOiBpbmZvLT5hbnRlbm5hX3NlbF90eCAtIDE7Ci0JdHhoZHItPm91dHB1dF9wb3dlciA9IDB4N2Y7IC8vIEhXIE1heGltdW0KKwl0eGhkci0+b3V0cHV0X3Bvd2VyID0gcHJpdi0+b3V0cHV0X3Bvd2VyOwogCXR4aGRyLT5jdHNfcmF0ZSA9IChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSA/CiAJCQkgIDAgOiBjdHNfcmF0ZTsKIAlpZiAocGFkZGluZykKQEAgLTYyOCwxMiArODg1LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQgcDU0X3NldF9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1MTYgZmlsdGVyX3R5cGUsCi0JCQkgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsIHU4IGFudGVubmEsCi0JCQkgIHUzMiBtYWdpYzMsIHUzMiBtYWdpYzgsIHUzMiBtYWdpYzkpCisJCQkgIGNvbnN0IHU4ICpic3NpZCkKIHsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHI7CiAJc3RydWN0IHA1NF90eF9jb250cm9sX2ZpbHRlciAqZmlsdGVyOworCXNpemVfdCBkYXRhX2xlbjsKIAogCWhkciA9IGt6YWxsb2Moc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCpmaWx0ZXIpICsKIAkJICAgICAgcHJpdi0+dHhfaGRyX2xlbiwgR0ZQX0FUT01JQyk7CkBAIC02NDQsMjUgKzkwMSwzNSBAQAogCiAJZmlsdGVyID0gKHN0cnVjdCBwNTRfdHhfY29udHJvbF9maWx0ZXIgKikgaGRyLT5kYXRhOwogCWhkci0+bWFnaWMxID0gY3B1X3RvX2xlMTYoMHg4MDAxKTsKLQloZHItPmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqZmlsdGVyKSk7Ci0JcDU0X2Fzc2lnbl9hZGRyZXNzKGRldiwgTlVMTCwgaGRyLCBzaXplb2YoKmhkcikgKyBzaXplb2YoKmZpbHRlcikpOwogCWhkci0+dHlwZSA9IGNwdV90b19sZTE2KFA1NF9DT05UUk9MX1RZUEVfRklMVEVSX1NFVCk7CiAKLQlmaWx0ZXItPmZpbHRlcl90eXBlID0gY3B1X3RvX2xlMTYoZmlsdGVyX3R5cGUpOwotCW1lbWNweShmaWx0ZXItPmRzdCwgZHN0LCBFVEhfQUxFTik7Ci0JaWYgKCFzcmMpCi0JCW1lbXNldChmaWx0ZXItPnNyYywgfjAsIEVUSF9BTEVOKTsKKwlwcml2LT5maWx0ZXJfdHlwZSA9IGZpbHRlci0+ZmlsdGVyX3R5cGUgPSBjcHVfdG9fbGUxNihmaWx0ZXJfdHlwZSk7CisJbWVtY3B5KGZpbHRlci0+bWFjX2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKCFic3NpZCkKKwkJbWVtc2V0KGZpbHRlci0+YnNzaWQsIH4wLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1jcHkoZmlsdGVyLT5zcmMsIHNyYywgRVRIX0FMRU4pOwotCWZpbHRlci0+YW50ZW5uYSA9IGFudGVubmE7Ci0JZmlsdGVyLT5tYWdpYzMgPSBjcHVfdG9fbGUzMihtYWdpYzMpOwotCWZpbHRlci0+cnhfYWRkciA9IGNwdV90b19sZTMyKHByaXYtPnJ4X2VuZCk7Ci0JZmlsdGVyLT5tYXhfcnggPSBjcHVfdG9fbGUxNigweDA2MjApOwkvKiBGSVhNRTogZm9yIHVzYiB2ZXIgMS4uIG1heWJlICovCi0JZmlsdGVyLT5yeGh3ID0gcHJpdi0+cnhodzsKLQlmaWx0ZXItPm1hZ2ljOCA9IGNwdV90b19sZTE2KG1hZ2ljOCk7Ci0JZmlsdGVyLT5tYWdpYzkgPSBjcHVfdG9fbGUxNihtYWdpYzkpOworCQltZW1jcHkoZmlsdGVyLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKIAotCXByaXYtPnR4KGRldiwgaGRyLCBzaXplb2YoKmhkcikgKyBzaXplb2YoKmZpbHRlciksIDEpOworCWZpbHRlci0+cnhfYW50ZW5uYSA9IHByaXYtPnJ4X2FudGVubmE7CisKKwlpZiAocHJpdi0+ZndfdmFyIDwgMHg1MDApIHsKKwkJZGF0YV9sZW4gPSBQNTRfVFhfQ09OVFJPTF9GSUxURVJfVjFfTEVOOworCQlmaWx0ZXItPnYxLmJhc2ljX3JhdGVfbWFzayA9IGNwdV90b19sZTMyKDB4MTVGKTsKKwkJZmlsdGVyLT52MS5yeF9hZGRyID0gY3B1X3RvX2xlMzIocHJpdi0+cnhfZW5kKTsKKwkJZmlsdGVyLT52MS5tYXhfcnggPSBjcHVfdG9fbGUxNihwcml2LT5yeF9tdHUpOworCQlmaWx0ZXItPnYxLnJ4aHcgPSBjcHVfdG9fbGUxNihwcml2LT5yeGh3KTsKKwkJZmlsdGVyLT52MS53YWtldXBfdGltZXIgPSBjcHVfdG9fbGUxNig1MDApOworCX0gZWxzZSB7CisJCWRhdGFfbGVuID0gUDU0X1RYX0NPTlRST0xfRklMVEVSX1YyX0xFTjsKKwkJZmlsdGVyLT52Mi5yeF9hZGRyID0gY3B1X3RvX2xlMzIocHJpdi0+cnhfZW5kKTsKKwkJZmlsdGVyLT52Mi5tYXhfcnggPSBjcHVfdG9fbGUxNihwcml2LT5yeF9tdHUpOworCQlmaWx0ZXItPnYyLnJ4aHcgPSBjcHVfdG9fbGUxNihwcml2LT5yeGh3KTsKKwkJZmlsdGVyLT52Mi50aW1lciA9IGNwdV90b19sZTE2KDEwMDApOworCX0KKworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOworCXA1NF9hc3NpZ25fYWRkcmVzcyhkZXYsIE5VTEwsIGhkciwgc2l6ZW9mKCpoZHIpICsgZGF0YV9sZW4pOworCXByaXYtPnR4KGRldiwgaGRyLCBzaXplb2YoKmhkcikgKyBkYXRhX2xlbiwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY3MiwxMiArOTM5LDEwIEBACiAJc3RydWN0IHA1NF9jb250cm9sX2hkciAqaGRyOwogCXN0cnVjdCBwNTRfdHhfY29udHJvbF9jaGFubmVsICpjaGFuOwogCXVuc2lnbmVkIGludCBpOwotCXNpemVfdCBwYXlsb2FkX2xlbiA9IHNpemVvZigqY2hhbikgKyBzaXplb2YodTMyKSoyICsKLQkJCSAgICAgc2l6ZW9mKCpjaGFuLT5jdXJ2ZV9kYXRhKSAqCi0JCQkgICAgIHByaXYtPmN1cnZlX2RhdGEtPnBvaW50c19wZXJfY2hhbm5lbDsKKwlzaXplX3QgZGF0YV9sZW47CiAJdm9pZCAqZW50cnk7CiAKLQloZHIgPSBremFsbG9jKHNpemVvZigqaGRyKSArIHBheWxvYWRfbGVuICsKKwloZHIgPSBremFsbG9jKHNpemVvZigqaGRyKSArIHNpemVvZigqY2hhbikgKwogCQkgICAgICBwcml2LT50eF9oZHJfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhkcikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02ODcsMTIgKzk1MiwxMSBAQAogCWNoYW4gPSAoc3RydWN0IHA1NF90eF9jb250cm9sX2NoYW5uZWwgKikgaGRyLT5kYXRhOwogCiAJaGRyLT5tYWdpYzEgPSBjcHVfdG9fbGUxNigweDgwMDEpOwotCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjaGFuKSk7Ci0JaGRyLT50eXBlID0gY3B1X3RvX2xlMTYoUDU0X0NPTlRST0xfVFlQRV9DSEFOTkVMX0NIQU5HRSk7Ci0JcDU0X2Fzc2lnbl9hZGRyZXNzKGRldiwgTlVMTCwgaGRyLCBzaXplb2YoKmhkcikgKyBwYXlsb2FkX2xlbik7CiAKLQljaGFuLT5tYWdpYzEgPSBjcHVfdG9fbGUxNigweDEpOwotCWNoYW4tPm1hZ2ljMiA9IGNwdV90b19sZTE2KDB4MCk7CisJaGRyLT50eXBlID0gY3B1X3RvX2xlMTYoUDU0X0NPTlRST0xfVFlQRV9DSEFOTkVMX0NIQU5HRSk7CisKKwljaGFuLT5mbGFncyA9IGNwdV90b19sZTE2KDB4MSk7CisJY2hhbi0+ZHdlbGwgPSBjcHVfdG9fbGUxNigweDApOwogCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPmlxX2F1dG9jYWxfbGVuOyBpKyspIHsKIAkJaWYgKHByaXYtPmlxX2F1dG9jYWxbaV0uZnJlcSAhPSBmcmVxKQpAQCAtNzEwLDM1ICs5NzQsNTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWNoYW4tPnZhbF9iYXJrZXIgPSAweDM4OwotCQljaGFuLT52YWxfYnBzayA9IHByaXYtPm91dHB1dF9saW1pdFtpXS52YWxfYnBzazsKLQkJY2hhbi0+dmFsX3Fwc2sgPSBwcml2LT5vdXRwdXRfbGltaXRbaV0udmFsX3Fwc2s7Ci0JCWNoYW4tPnZhbF8xNnFhbSA9IHByaXYtPm91dHB1dF9saW1pdFtpXS52YWxfMTZxYW07Ci0JCWNoYW4tPnZhbF82NHFhbSA9IHByaXYtPm91dHB1dF9saW1pdFtpXS52YWxfNjRxYW07CisJCWNoYW4tPnZhbF9icHNrID0gY2hhbi0+ZHVwX2Jwc2sgPQorCQkJcHJpdi0+b3V0cHV0X2xpbWl0W2ldLnZhbF9icHNrOworCQljaGFuLT52YWxfcXBzayA9IGNoYW4tPmR1cF9xcHNrID0KKwkJCXByaXYtPm91dHB1dF9saW1pdFtpXS52YWxfcXBzazsKKwkJY2hhbi0+dmFsXzE2cWFtID0gY2hhbi0+ZHVwXzE2cWFtID0KKwkJCXByaXYtPm91dHB1dF9saW1pdFtpXS52YWxfMTZxYW07CisJCWNoYW4tPnZhbF82NHFhbSA9IGNoYW4tPmR1cF82NHFhbSA9CisJCQlwcml2LT5vdXRwdXRfbGltaXRbaV0udmFsXzY0cWFtOwogCQlicmVhazsKIAl9CiAJaWYgKGkgPT0gcHJpdi0+b3V0cHV0X2xpbWl0X2xlbikKIAkJZ290byBlcnI7CiAKLQljaGFuLT5wYV9wb2ludHNfcGVyX2N1cnZlID0gcHJpdi0+Y3VydmVfZGF0YS0+cG9pbnRzX3Blcl9jaGFubmVsOwotCiAJZW50cnkgPSBwcml2LT5jdXJ2ZV9kYXRhLT5kYXRhOwogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5jdXJ2ZV9kYXRhLT5jaGFubmVsczsgaSsrKSB7CiAJCWlmICgqKChfX2xlMTYgKillbnRyeSkgIT0gZnJlcSkgewogCQkJZW50cnkgKz0gc2l6ZW9mKF9fbGUxNik7Ci0JCQllbnRyeSArPSBzaXplb2Yoc3RydWN0IHBkYV9wYV9jdXJ2ZV9kYXRhX3NhbXBsZV9yZXYxKSAqCi0JCQkJIGNoYW4tPnBhX3BvaW50c19wZXJfY3VydmU7CisJCQllbnRyeSArPSBzaXplb2Yoc3RydWN0IHA1NF9wYV9jdXJ2ZV9kYXRhX3NhbXBsZSkgKgorCQkJCSBwcml2LT5jdXJ2ZV9kYXRhLT5wb2ludHNfcGVyX2NoYW5uZWw7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWVudHJ5ICs9IHNpemVvZihfX2xlMTYpOworCQljaGFuLT5wYV9wb2ludHNfcGVyX2N1cnZlID0KKwkJCW1pbihwcml2LT5jdXJ2ZV9kYXRhLT5wb2ludHNfcGVyX2NoYW5uZWwsICh1OCkgOCk7CisKIAkJbWVtY3B5KGNoYW4tPmN1cnZlX2RhdGEsIGVudHJ5LCBzaXplb2YoKmNoYW4tPmN1cnZlX2RhdGEpICoKIAkJICAgICAgIGNoYW4tPnBhX3BvaW50c19wZXJfY3VydmUpOwogCQlicmVhazsKIAl9CiAKLQltZW1jcHkoaGRyLT5kYXRhICsgcGF5bG9hZF9sZW4gLSA0LCAmY2hhbi0+dmFsX2Jwc2ssIDQpOworCWlmIChwcml2LT5md192YXIgPCAweDUwMCkgeworCQlkYXRhX2xlbiA9IFA1NF9UWF9DT05UUk9MX0NIQU5ORUxfVjFfTEVOOworCQljaGFuLT52MS5yc3NpY2FsX211bCA9IGNwdV90b19sZTE2KDEzMCk7CisJCWNoYW4tPnYxLnJzc2ljYWxfYWRkID0gY3B1X3RvX2xlMTYoMHhmZTcwKTsKKwl9IGVsc2UgeworCQlkYXRhX2xlbiA9IFA1NF9UWF9DT05UUk9MX0NIQU5ORUxfVjJfTEVOOworCQljaGFuLT52Mi5yc3NpY2FsX211bCA9IGNwdV90b19sZTE2KDEzMCk7CisJCWNoYW4tPnYyLnJzc2ljYWxfYWRkID0gY3B1X3RvX2xlMTYoMHhmZTcwKTsKKwkJY2hhbi0+djIuYmFzaWNfcmF0ZV9tYXNrID0gY3B1X3RvX2xlMzIoMHgxNWYpOworCX0KIAotCXByaXYtPnR4KGRldiwgaGRyLCBzaXplb2YoKmhkcikgKyBwYXlsb2FkX2xlbiwgMSk7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihkYXRhX2xlbik7CisJcDU0X2Fzc2lnbl9hZGRyZXNzKGRldiwgTlVMTCwgaGRyLCBzaXplb2YoKmhkcikgKyBkYXRhX2xlbik7CisJcHJpdi0+dHgoZGV2LCBoZHIsIHNpemVvZigqaGRyKSArIGRhdGFfbGVuLCAxKTsKIAlyZXR1cm4gMDsKIAogIGVycjoKQEAgLTg0NiwxMiArMTEyNiwyNSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaWYgKCFwcml2LT5jYWNoZWRfc3RhdHMpIHsKKwkJcHJpdi0+Y2FjaGVkX3N0YXRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHA1NF9zdGF0aXN0aWNzKSArCisJCQlwcml2LT50eF9oZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCBwNTRfY29udHJvbF9oZHIpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFwcml2LT5jYWNoZWRfc3RhdHMpIHsKKwkJCWtmcmVlKHByaXYtPmNhY2hlZF92ZGNmKTsKKwkJCXByaXYtPmNhY2hlZF92ZGNmID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCiAJZXJyID0gcHJpdi0+b3BlbihkZXYpOwogCWlmICghZXJyKQotCQlwcml2LT5tb2RlID0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUjsKKwkJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7CiAKIAlwNTRfaW5pdF92ZGNmKGRldik7CiAKKwltb2RfdGltZXIoJnByaXYtPnN0YXRzX3RpbWVyLCBqaWZmaWVzICsgSFopOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTg1OSwxMCArMTE1MiwxMyBAQAogewogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CisKKwlkZWxfdGltZXIoJnByaXYtPnN0YXRzX3RpbWVyKTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZwcml2LT50eF9xdWV1ZSkpKQogCQlrZnJlZV9za2Ioc2tiKTsKIAlwcml2LT5zdG9wKGRldik7Ci0JcHJpdi0+bW9kZSA9IElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQ7CisJcHJpdi0+dHNmX2hpZ2gzMiA9IHByaXYtPnRzZl9sb3czMiA9IDA7CisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwogfQogCiBzdGF0aWMgaW50IHA1NF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKQEAgLTg3MCwxMSArMTE2NiwxMSBAQAogewogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCi0JaWYgKHByaXYtPm1vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikKKwlpZiAocHJpdi0+bW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCXByaXYtPm1vZGUgPSBjb25mLT50eXBlOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODgzLDEyICsxMTc5LDExIEBACiAKIAltZW1jcHkocHJpdi0+bWFjX2FkZHIsIGNvbmYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlwNTRfc2V0X2ZpbHRlcihkZXYsIDAsIHByaXYtPm1hY19hZGRyLCBOVUxMLCAwLCAxLCAwLCAweEY2NDIpOwotCXA1NF9zZXRfZmlsdGVyKGRldiwgMCwgcHJpdi0+bWFjX2FkZHIsIE5VTEwsIDEsIDAsIDAsIDB4RjY0Mik7CisJcDU0X3NldF9maWx0ZXIoZGV2LCAwLCBOVUxMKTsKIAogCXN3aXRjaCAoY29uZi0+dHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgotCQlwNTRfc2V0X2ZpbHRlcihkZXYsIDEsIHByaXYtPm1hY19hZGRyLCBOVUxMLCAwLCAweDE1RiwgMHgxRjQsIDApOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJcDU0X3NldF9maWx0ZXIoZGV2LCAxLCBOVUxMKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CS8qIGltcG9zc2libGUgKi8KQEAgLTkwNCw5ICsxMTk5LDkgQEAKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCiB7CiAJc3RydWN0IHA1NF9jb21tb24gKnByaXYgPSBkZXYtPnByaXY7Ci0JcHJpdi0+bW9kZSA9IElFRUU4MDIxMV9JRl9UWVBFX01OVFI7CisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7CiAJbWVtc2V0KHByaXYtPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7Ci0JcDU0X3NldF9maWx0ZXIoZGV2LCAwLCBwcml2LT5tYWNfYWRkciwgTlVMTCwgMiwgMCwgMCwgMCk7CisJcDU0X3NldF9maWx0ZXIoZGV2LCAwLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBwNTRfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mKQpAQCAtOTE1LDYgKzEyMTAsOSBAQAogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCiAJbXV0ZXhfbG9jaygmcHJpdi0+Y29uZl9tdXRleCk7CisJcHJpdi0+cnhfYW50ZW5uYSA9IChjb25mLT5hbnRlbm5hX3NlbF9yeCA9PSAwKSA/CisJCTIgOiBjb25mLT5hbnRlbm5hX3NlbF90eCAtIDE7CisJcHJpdi0+b3V0cHV0X3Bvd2VyID0gY29uZi0+cG93ZXJfbGV2ZWwgPDwgMjsKIAlyZXQgPSBwNTRfc2V0X2ZyZXEoZGV2LCBjcHVfdG9fbGUxNihjb25mLT5jaGFubmVsLT5jZW50ZXJfZnJlcSkpOwogCXA1NF9zZXRfdmRjZihkZXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+Y29uZl9tdXRleCk7CkBAIC05MjgsOCArMTIyNiw3IEBACiAJc3RydWN0IHA1NF9jb21tb24gKnByaXYgPSBkZXYtPnByaXY7CiAKIAltdXRleF9sb2NrKCZwcml2LT5jb25mX211dGV4KTsKLQlwNTRfc2V0X2ZpbHRlcihkZXYsIDAsIHByaXYtPm1hY19hZGRyLCBjb25mLT5ic3NpZCwgMCwgMSwgMCwgMHhGNjQyKTsKLQlwNTRfc2V0X2ZpbHRlcihkZXYsIDAsIHByaXYtPm1hY19hZGRyLCBjb25mLT5ic3NpZCwgMiwgMCwgMCwgMCk7CisJcDU0X3NldF9maWx0ZXIoZGV2LCAwLCBjb25mLT5ic3NpZCk7CiAJcDU0X3NldF9sZWRzKGRldiwgMSwgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbmYtPmJzc2lkKSwgMCk7CiAJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOwogCW11dGV4X3VubG9jaygmcHJpdi0+Y29uZl9tdXRleCk7CkBAIC05NDMsMTUgKzEyNDAsMjggQEAKIHsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKIAotCSp0b3RhbF9mbGFncyAmPSBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQzsKKwkqdG90YWxfZmxhZ3MgJj0gRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfAorCQkJRklGX1BST01JU0NfSU5fQlNTIHwKKwkJCUZJRl9GQ1NGQUlMOworCisJcHJpdi0+ZmlsdGVyX2ZsYWdzID0gKnRvdGFsX2ZsYWdzOwogCiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykgewogCQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpCi0JCQlwNTRfc2V0X2ZpbHRlcihkZXYsIDAsIHByaXYtPm1hY19hZGRyLAotCQkJCSAgICAgICBOVUxMLCAyLCAwLCAwLCAwKTsKKwkJCXA1NF9zZXRfZmlsdGVyKGRldiwgbGUxNl90b19jcHUocHJpdi0+ZmlsdGVyX3R5cGUpLAorCQkJCSBOVUxMKTsKIAkJZWxzZQotCQkJcDU0X3NldF9maWx0ZXIoZGV2LCAwLCBwcml2LT5tYWNfYWRkciwKLQkJCQkgICAgICAgcHJpdi0+YnNzaWQsIDIsIDAsIDAsIDApOworCQkJcDU0X3NldF9maWx0ZXIoZGV2LCBsZTE2X3RvX2NwdShwcml2LT5maWx0ZXJfdHlwZSksCisJCQkJIHByaXYtPmJzc2lkKTsKKwl9CisKKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykgeworCQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKQorCQkJcDU0X3NldF9maWx0ZXIoZGV2LCBsZTE2X3RvX2NwdShwcml2LT5maWx0ZXJfdHlwZSkgfAorCQkJCTB4OCwgTlVMTCk7CisJCWVsc2UKKwkJCXA1NF9zZXRfZmlsdGVyKGRldiwgbGUxNl90b19jcHUocHJpdi0+ZmlsdGVyX3R5cGUpICYKKwkJCQl+MHg4LCBwcml2LT5ic3NpZCk7CiAJfQogfQogCkBAIC05NzUsMTAgKzEyODUsNjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwNTRfaW5pdF94Ym93X3N5bnRoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHI7CisJc3RydWN0IHA1NF90eF9jb250cm9sX3hib3dfc3ludGggKnhib3c7CisKKwloZHIgPSBremFsbG9jKHNpemVvZigqaGRyKSArIHNpemVvZigqeGJvdykgKworCQkgICAgICBwcml2LT50eF9oZHJfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSAodm9pZCAqKWhkciArIHByaXYtPnR4X2hkcl9sZW47CisJaGRyLT5tYWdpYzEgPSBjcHVfdG9fbGUxNigweDgwMDEpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCp4Ym93KSk7CisJaGRyLT50eXBlID0gY3B1X3RvX2xlMTYoUDU0X0NPTlRST0xfVFlQRV9YQk9XX1NZTlRIX0NGRyk7CisJcDU0X2Fzc2lnbl9hZGRyZXNzKGRldiwgTlVMTCwgaGRyLCBzaXplb2YoKmhkcikgKyBzaXplb2YoKnhib3cpKTsKKworCXhib3cgPSAoc3RydWN0IHA1NF90eF9jb250cm9sX3hib3dfc3ludGggKikgaGRyLT5kYXRhOworCXhib3ctPm1hZ2ljMSA9IGNwdV90b19sZTE2KDB4MSk7CisJeGJvdy0+bWFnaWMyID0gY3B1X3RvX2xlMTYoMHgyKTsKKwl4Ym93LT5mcmVxID0gY3B1X3RvX2xlMTYoNTM5MCk7CisKKwlwcml2LT50eChkZXYsIGhkciwgc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCp4Ym93KSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDU0X3N0YXRpc3RpY3NfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IChzdHJ1Y3QgaWVlZTgwMjExX2h3ICopIGRhdGE7CisJc3RydWN0IHA1NF9jb21tb24gKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHA1NF9jb250cm9sX2hkciAqaGRyOworCXN0cnVjdCBwNTRfc3RhdGlzdGljcyAqc3RhdHM7CisKKwlCVUdfT04oIXByaXYtPmNhY2hlZF9zdGF0cyk7CisKKwloZHIgPSAodm9pZCAqKXByaXYtPmNhY2hlZF9zdGF0cyArIHByaXYtPnR4X2hkcl9sZW47CisJaGRyLT5tYWdpYzEgPSBjcHVfdG9fbGUxNigweDgwMDApOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpzdGF0cykpOworCWhkci0+dHlwZSA9IGNwdV90b19sZTE2KFA1NF9DT05UUk9MX1RZUEVfU1RBVF9SRUFEQkFDSyk7CisJcDU0X2Fzc2lnbl9hZGRyZXNzKGRldiwgTlVMTCwgaGRyLCBzaXplb2YoKmhkcikgKyBzaXplb2YoKnN0YXRzKSk7CisKKwlwcml2LT50eChkZXYsIGhkciwgc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCpzdGF0cyksIDApOworfQorCiBzdGF0aWMgaW50IHA1NF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAogCQkJIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKIHsKLQkvKiBUT0RPICovCisJc3RydWN0IHA1NF9jb21tb24gKnByaXYgPSBkZXYtPnByaXY7CisKKwlkZWxfdGltZXIoJnByaXYtPnN0YXRzX3RpbWVyKTsKKwlwNTRfc3RhdGlzdGljc190aW1lcigodW5zaWduZWQgbG9uZylkZXYpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcHJpdi0+c3RhdHNfY29tcCwgSFopKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZSBkb2VzIG5vdCByZXNwb25kIVxuIiwKKwkJCXdpcGh5X25hbWUoZGV2LT53aXBoeSkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1lbWNweShzdGF0cywgJnByaXYtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTg3LDcgKzEzNTQsNyBAQAogewogCXN0cnVjdCBwNTRfY29tbW9uICpwcml2ID0gZGV2LT5wcml2OwogCi0JbWVtY3B5KHN0YXRzLCAmcHJpdi0+dHhfc3RhdHMsIHNpemVvZihzdGF0c1swXSkgKiBkZXYtPnF1ZXVlcyk7CisJbWVtY3B5KHN0YXRzLCAmcHJpdi0+dHhfc3RhdHNbNF0sIHNpemVvZihzdGF0c1swXSkgKiBkZXYtPnF1ZXVlcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMTYsMjIgKzEzODMsMzIgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwcml2ID0gZGV2LT5wcml2OwotCXByaXYtPm1vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT50eF9xdWV1ZSk7Ci0JZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYmFuZF8yR0h6OwogCWRldi0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfSE9TVF9CUk9BRENBU1RfUFNfQlVGRkVSSU5HIHwgLyogbm90IHN1cmUgKi8KIAkJICAgICBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKLQkJICAgICBJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQzsKKwkJICAgICBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8CisJCSAgICAgSUVFRTgwMjExX0hXX05PSVNFX0RCTTsKKworCWRldi0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKKwogCWRldi0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDEwMDA7CS8qIFRPRE86IGZpbmQgYWN0dWFsIHZhbHVlICovCi0JZGV2LT5tYXhfc2lnbmFsID0gMTI3OwogCi0JcHJpdi0+dHhfc3RhdHNbMF0ubGltaXQgPSA1OworCXByaXYtPnR4X3N0YXRzWzBdLmxpbWl0ID0gMTsKKwlwcml2LT50eF9zdGF0c1sxXS5saW1pdCA9IDE7CisJcHJpdi0+dHhfc3RhdHNbMl0ubGltaXQgPSAxOworCXByaXYtPnR4X3N0YXRzWzNdLmxpbWl0ID0gMTsKKwlwcml2LT50eF9zdGF0c1s0XS5saW1pdCA9IDU7CiAJZGV2LT5xdWV1ZXMgPSAxOwotCisJcHJpdi0+bm9pc2UgPSAtOTQ7CiAJZGV2LT5leHRyYV90eF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyKSArIDQgKwogCQkJCSBzaXplb2Yoc3RydWN0IHA1NF90eF9jb250cm9sX2FsbG9jZGF0YSk7CiAKIAltdXRleF9pbml0KCZwcml2LT5jb25mX211dGV4KTsKKwlpbml0X2NvbXBsZXRpb24oJnByaXYtPmVlcHJvbV9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJnByaXYtPnN0YXRzX2NvbXApOworCXNldHVwX3RpbWVyKCZwcml2LT5zdGF0c190aW1lciwgcDU0X3N0YXRpc3RpY3NfdGltZXIsCisJCSh1bnNpZ25lZCBsb25nKWRldik7CiAKIAlyZXR1cm4gZGV2OwogfQpAQCAtMTA0MCw2ICsxNDE3LDcgQEAKIHZvaWQgcDU0X2ZyZWVfY29tbW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKIHsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKKwlrZnJlZShwcml2LT5jYWNoZWRfc3RhdHMpOwogCWtmcmVlKHByaXYtPmlxX2F1dG9jYWwpOwogCWtmcmVlKHByaXYtPm91dHB1dF9saW1pdCk7CiAJa2ZyZWUocHJpdi0+Y3VydmVfZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmgKaW5kZXggOGRiNmMwZS4uMmZhOTk0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NGNvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRjb21tb24uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgUFJJU001NENPTU1PTl9ICi0jZGVmaW5lIFBSSVNNNTRDT01NT05fSAorI2lmbmRlZiBQNTRDT01NT05fSAorI2RlZmluZSBQNTRDT01NT05fSAogCiAvKgogICogQ29tbW9uIGNvZGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIG1hYzgwMjExIFByaXNtNTQgZHJpdmVycwpAQCAtMTgsNyArMTgsOCBAQAogc3RydWN0IGJvb3RyZWMgewogCV9fbGUzMiBjb2RlOwogCV9fbGUzMiBsZW47Ci0JdTMyIGRhdGFbMF07CisJdTMyIGRhdGFbMTBdOworCV9fbGUxNiByeF9tdHU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgYm9vdHJlY19leHBfaWYgewpAQCAtMjksNiArMzAsMTcgQEAKIAlfX2xlMTYgdG9wX2NvbXBhdDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBib290cmVjX2Rlc2MgeworCV9fbGUxNiBtb2RlczsKKwlfX2xlMTYgZmxhZ3M7CisJX19sZTMyIHJ4X3N0YXJ0OworCV9fbGUzMiByeF9lbmQ7CisJdTggaGVhZHJvb207CisJdTggdGFpbHJvb207CisJdTggdW5pbXBvcnRhbnRbNl07CisJdTggcmF0ZXNbMTZdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwogI2RlZmluZSBCUl9DT0RFX01JTgkJCTB4ODAwMDAwMDAKICNkZWZpbmUgQlJfQ09ERV9DT01QT05FTlRfSUQJCTB4ODAwMDAwMDEKICNkZWZpbmUgQlJfQ09ERV9DT01QT05FTlRfVkVSU0lPTgkweDgwMDAwMDAyCkBAIC0zOSwxMSArNTEsNiBAQAogI2RlZmluZSBCUl9DT0RFX0VORF9PRl9CUkEJCTB4RkYwMDAwRkYKICNkZWZpbmUgTEVHQUNZX0JSX0NPREVfRU5EX09GX0JSQQkweEZGRkZGRkZGCiAKLSNkZWZpbmUgRldfRk1BQyAweDQ2NGQ0MTQzCi0jZGVmaW5lIEZXX0xNODYgMHg0YzRkMzgzNgotI2RlZmluZSBGV19MTTg3IDB4NGM0ZDM4MzcKLSNkZWZpbmUgRldfTE0yMCAweDRjNGQzMjMwCi0KIC8qIFBEQSBkZWZpbmVzIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24gKHRha2VuIGZyb20gaXNsc21fcGRhLmgpICovCiAKIHN0cnVjdCBwZGFfZW50cnkgewpAQCAtODksNiArOTYsMTYgQEAKIAl1OCBkYXRhX3Fwc2s7CiAJdTggZGF0YV8xNnFhbTsKIAl1OCBkYXRhXzY0cWFtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBwNTRfcGFfY3VydmVfZGF0YV9zYW1wbGUgeworCXU4IHJmX3Bvd2VyOworCXU4IHBhX2RldGVjdG9yOworCXU4IGRhdGFfYmFya2VyOworCXU4IGRhdGFfYnBzazsKKwl1OCBkYXRhX3Fwc2s7CisJdTggZGF0YV8xNnFhbTsKKwl1OCBkYXRhXzY0cWFtOwogCXU4IHBhZGRpbmc7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApAQCAtMTY5LDggKzE4Niw5IEBACiAJdTggcnNzaTsKIAl1OCBxdWFsaXR5OwogCXUxNiB1bmtub3duMjsKLQlfX2xlNjQgdGltZXN0YW1wOwotCXU4IGRhdGFbMF07CisJX19sZTMyIHRzZjMyOworCV9fbGUzMiB1bmFsbG9jMDsKKwl1OCBhbGlnblswXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcDU0X2ZyYW1lX3NlbnRfaGRyIHsKQEAgLTE5OCwyMiArMjE2LDM3IEBACiAKIHN0cnVjdCBwNTRfdHhfY29udHJvbF9maWx0ZXIgewogCV9fbGUxNiBmaWx0ZXJfdHlwZTsKLQl1OCBkc3RbRVRIX0FMRU5dOwotCXU4IHNyY1tFVEhfQUxFTl07Ci0JdTggYW50ZW5uYTsKLQl1OCBkZWJ1ZzsKLQlfX2xlMzIgbWFnaWMzOwotCXU4IHJhdGVzWzhdOwkvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yPwotCV9fbGUzMiByeF9hZGRyOwotCV9fbGUxNiBtYXhfcng7Ci0JX19sZTE2IHJ4aHc7Ci0JX19sZTE2IG1hZ2ljODsKLQlfX2xlMTYgbWFnaWM5OworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggcnhfYW50ZW5uYTsKKwl1OCByeF9hbGlnbjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgYmFzaWNfcmF0ZV9tYXNrOworCQkJdTggcnRzX3JhdGVzWzhdOworCQkJX19sZTMyIHJ4X2FkZHI7CisJCQlfX2xlMTYgbWF4X3J4OworCQkJX19sZTE2IHJ4aHc7CisJCQlfX2xlMTYgd2FrZXVwX3RpbWVyOworCQkJX19sZTE2IHVuYWxsb2MwOworCQl9IHYxIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiByeF9hZGRyOworCQkJX19sZTE2IG1heF9yeDsKKwkJCV9fbGUxNiByeGh3OworCQkJX19sZTE2IHRpbWVyOworCQkJX19sZTE2IHVuYWxsb2MwOworCQkJX19sZTMyIHVuYWxsb2MxOworCQl9IHYyIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisjZGVmaW5lIFA1NF9UWF9DT05UUk9MX0ZJTFRFUl9WMV9MRU4gKHNpemVvZihzdHJ1Y3QgcDU0X3R4X2NvbnRyb2xfZmlsdGVyKSkKKyNkZWZpbmUgUDU0X1RYX0NPTlRST0xfRklMVEVSX1YyX0xFTiAoc2l6ZW9mKHN0cnVjdCBwNTRfdHhfY29udHJvbF9maWx0ZXIpLTgpCisKIHN0cnVjdCBwNTRfdHhfY29udHJvbF9jaGFubmVsIHsKLQlfX2xlMTYgbWFnaWMxOwotCV9fbGUxNiBtYWdpYzI7CisJX19sZTE2IGZsYWdzOworCV9fbGUxNiBkd2VsbDsKIAl1OCBwYWRkaW5nMVsyMF07CiAJc3RydWN0IHBkYV9pcV9hdXRvY2FsX2VudHJ5IGlxX2F1dG9jYWw7CiAJdTggcGFfcG9pbnRzX3Blcl9jdXJ2ZTsKQEAgLTIyMiwxMCArMjU1LDI5IEBACiAJdTggdmFsX3Fwc2s7CiAJdTggdmFsXzE2cWFtOwogCXU4IHZhbF82NHFhbTsKLQlzdHJ1Y3QgcGRhX3BhX2N1cnZlX2RhdGFfc2FtcGxlX3JldjEgY3VydmVfZGF0YVswXTsKLQkvKiBhZGRpdGlvbmFsIHBhZGRpbmcvZGF0YSBhZnRlciBjdXJ2ZV9kYXRhICovCisJc3RydWN0IHA1NF9wYV9jdXJ2ZV9kYXRhX3NhbXBsZSBjdXJ2ZV9kYXRhWzhdOworCXU4IGR1cF9icHNrOworCXU4IGR1cF9xcHNrOworCXU4IGR1cF8xNnFhbTsKKwl1OCBkdXBfNjRxYW07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19sZTE2IHJzc2ljYWxfbXVsOworCQkJX19sZTE2IHJzc2ljYWxfYWRkOworCQl9IHYxIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGJhc2ljX3JhdGVfbWFzazsKKwkJCSB1OCBydHNfcmF0ZXNbOF07CisJCQlfX2xlMTYgcnNzaWNhbF9tdWw7CisJCQlfX2xlMTYgcnNzaWNhbF9hZGQ7CisJCX0gdjIgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKyNkZWZpbmUgUDU0X1RYX0NPTlRST0xfQ0hBTk5FTF9WMV9MRU4gKHNpemVvZihzdHJ1Y3QgcDU0X3R4X2NvbnRyb2xfY2hhbm5lbCktMTIpCisjZGVmaW5lIFA1NF9UWF9DT05UUk9MX0NIQU5ORUxfVjJfTEVOIChzaXplb2Yoc3RydWN0IHA1NF90eF9jb250cm9sX2NoYW5uZWwpKQorCiBzdHJ1Y3QgcDU0X3R4X2NvbnRyb2xfbGVkIHsKIAlfX2xlMTYgbW9kZTsKIAlfX2xlMTYgbGVkX3RlbXBvcmFyeTsKQEAgLTI1MCw0ICszMDIsMjQgQEAKIAlfX2xlMTYgZnJhbWVidXJzdDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi0jZW5kaWYgLyogUFJJU001NENPTU1PTl9IICovCitzdHJ1Y3QgcDU0X3N0YXRpc3RpY3MgeworCV9fbGUzMiByeF9zdWNjZXNzOworCV9fbGUzMiByeF9iYWRfZmNzOworCV9fbGUzMiByeF9hYm9ydDsKKwlfX2xlMzIgcnhfYWJvcnRfcGh5OworCV9fbGUzMiBydHNfc3VjY2VzczsKKwlfX2xlMzIgcnRzX2ZhaWw7CisJX19sZTMyIHRzZjMyOworCV9fbGUzMiBhaXJ0aW1lOworCV9fbGUzMiBub2lzZTsKKwlfX2xlMzIgdW5rblsxMF07IC8qIENDRSAvIENDQSAvIFJBREFSICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHA1NF90eF9jb250cm9sX3hib3dfc3ludGggeworCV9fbGUxNiBtYWdpYzE7CisJX19sZTE2IG1hZ2ljMjsKKwlfX2xlMTYgZnJlcTsKKwl1MzIgcGFkZGluZ1s1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYgLyogUDU0Q09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYwppbmRleCA3ZGQ0YWRkLi4xYzJhMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5jCkBAIC0zLDYgKzMsNyBAQAogICogTGludXggZGV2aWNlIGRyaXZlciBmb3IgUENJIGJhc2VkIFByaXNtNTQKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBDaHJpc3RpYW4gTGFtcGFydGVyIDxjaHVua2VleUB3ZWIuZGU+CiAgKgogICogQmFzZWQgb24gdGhlIGlzbHNtIChzb2Z0bWFjIHByaXNtNTQpIGRyaXZlciwgd2hpY2ggaXM6CiAgKiBDb3B5cmlnaHQgMjAwNC0yMDA2IEplYW4tQmFwdGlzdGUgTm90ZSA8amVhbi1iYXB0aXN0ZS5ub3RlQG00eC5vcmc+LCBldCBhbC4KQEAgLTcxLDE2ICs3MiwxOCBAQAogCVA1NFBfV1JJVEUoY3RybF9zdGF0LCByZWcpOwogCXdtYigpOwogCi0JbWRlbGF5KDUwKTsKLQogCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaXNsMzg4NiIsICZwcml2LT5wZGV2LT5kZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAocHJpc201NHBjaSk6IGNhbm5vdCBmaW5kIGZpcm13YXJlICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAocDU0cGNpKTogY2Fubm90IGZpbmQgZmlybXdhcmUgIgogCQkgICAgICAgIihpc2wzODg2KVxuIiwgcGNpX25hbWUocHJpdi0+cGRldikpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXA1NF9wYXJzZV9maXJtd2FyZShkZXYsIGZ3X2VudHJ5KTsKKwllcnIgPSBwNTRfcGFyc2VfZmlybXdhcmUoZGV2LCBmd19lbnRyeSk7CisJaWYgKGVycikgeworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlkYXRhID0gKF9fbGUzMiAqKSBmd19lbnRyeS0+ZGF0YTsKIAlyZW1haW5zID0gZndfZW50cnktPnNpemU7CkBAIC0xMjEsMTYyICsxMjQsMTQ3IEBACiAJd21iKCk7CiAJdWRlbGF5KDEwKTsKIAorCS8qIHdhaXQgZm9yIHRoZSBmaXJtd2FyZSB0byBib290IHByb3Blcmx5ICovCisJbWRlbGF5KDEwMCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHA1NHBfc2ltcGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IHA1NHBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcDU0cF9wcml2ICopIGRldl9pZDsKLQlfX2xlMzIgcmVnOwotCi0JcmVnID0gUDU0UF9SRUFEKGludF9pZGVudCk7Ci0JUDU0UF9XUklURShpbnRfYWNrLCByZWcpOwotCi0JaWYgKHJlZyAmIFA1NFBfUkVBRChpbnRfZW5hYmxlKSkKLQkJY29tcGxldGUoJnByaXYtPmJvb3RfY29tcCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgcDU0cF9yZWFkX2VlcHJvbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCitzdGF0aWMgdm9pZCBwNTRwX3JlZmlsbF9yeF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwlpbnQgcmluZ19pbmRleCwgc3RydWN0IHA1NHBfZGVzYyAqcmluZywgdTMyIHJpbmdfbGltaXQsCisJc3RydWN0IHNrX2J1ZmYgKipyeF9idWYpCiB7CiAJc3RydWN0IHA1NHBfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgcDU0cF9yaW5nX2NvbnRyb2wgKnJpbmdfY29udHJvbCA9IHByaXYtPnJpbmdfY29udHJvbDsKLQlpbnQgZXJyOwotCXN0cnVjdCBwNTRfY29udHJvbF9oZHIgKmhkcjsKLQl2b2lkICplZXByb207Ci0JZG1hX2FkZHJfdCByeF9tYXBwaW5nLCB0eF9tYXBwaW5nOwotCXUxNiBhbGVuOworCXUzMiBsaW1pdCwgaWR4LCBpOwogCi0JaW5pdF9jb21wbGV0aW9uKCZwcml2LT5ib290X2NvbXApOwotCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPnBkZXYtPmlycSwgJnA1NHBfc2ltcGxlX2ludGVycnVwdCwKLQkJCSAgSVJRRl9TSEFSRUQsICJwcmlzbTU0cGNpIiwgcHJpdik7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIChwcmlzbTU0cGNpKTogZmFpbGVkIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iLAotCQkgICAgICAgcGNpX25hbWUocHJpdi0+cGRldikpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlpZHggPSBsZTMyX3RvX2NwdShyaW5nX2NvbnRyb2wtPmhvc3RfaWR4W3JpbmdfaW5kZXhdKTsKKwlsaW1pdCA9IGlkeDsKKwlsaW1pdCAtPSBsZTMyX3RvX2NwdShyaW5nX2NvbnRyb2wtPmRldmljZV9pZHhbcmluZ19pbmRleF0pOworCWxpbWl0ID0gcmluZ19saW1pdCAtIGxpbWl0OwogCi0JZWVwcm9tID0ga21hbGxvYygweDIwMTAgKyBFRVBST01fUkVBREJBQ0tfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVlcHJvbSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIChwcmlzbTU0cGNpKTogbm8gbWVtb3J5IGZvciBlZXByb20hXG4iLAotCQkgICAgICAgcGNpX25hbWUocHJpdi0+cGRldikpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltZW1zZXQocmluZ19jb250cm9sLCAwLCBzaXplb2YoKnJpbmdfY29udHJvbCkpOwotCVA1NFBfV1JJVEUocmluZ19jb250cm9sX2Jhc2UsIGNwdV90b19sZTMyKHByaXYtPnJpbmdfY29udHJvbF9kbWEpKTsKLQlQNTRQX1JFQUQocmluZ19jb250cm9sX2Jhc2UpOwotCXVkZWxheSgxMCk7Ci0KLQlQNTRQX1dSSVRFKGludF9lbmFibGUsIGNwdV90b19sZTMyKElTTDM4WFhfSU5UX0lERU5UX0lOSVQpKTsKLQlQNTRQX1JFQUQoaW50X2VuYWJsZSk7Ci0JdWRlbGF5KDEwKTsKLQotCVA1NFBfV1JJVEUoZGV2X2ludCwgY3B1X3RvX2xlMzIoSVNMMzhYWF9ERVZfSU5UX1JFU0VUKSk7Ci0KLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwcml2LT5ib290X2NvbXAsIEhaKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIChwcmlzbTU0cGNpKTogQ2Fubm90IGJvb3QgZmlybXdhcmUhXG4iLAotCQkgICAgICAgcGNpX25hbWUocHJpdi0+cGRldikpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlQNTRQX1dSSVRFKGludF9lbmFibGUsIGNwdV90b19sZTMyKElTTDM4WFhfSU5UX0lERU5UX1VQREFURSkpOwotCVA1NFBfUkVBRChpbnRfZW5hYmxlKTsKLQotCWhkciA9IGVlcHJvbSArIDB4MjAxMDsKLQlwNTRfZmlsbF9lZXByb21fcmVhZGJhY2soaGRyKTsKLQloZHItPnJlcV9pZCA9IGNwdV90b19sZTMyKHByaXYtPmNvbW1vbi5yeF9zdGFydCk7Ci0KLQlyeF9tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgZWVwcm9tLAotCQkJCSAgICAweDIwMTAsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JdHhfbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsICh2b2lkICopaGRyLAotCQkJCSAgICBFRVBST01fUkVBREJBQ0tfTEVOLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCXJpbmdfY29udHJvbC0+cnhfbWdtdFswXS5ob3N0X2FkZHIgPSBjcHVfdG9fbGUzMihyeF9tYXBwaW5nKTsKLQlyaW5nX2NvbnRyb2wtPnJ4X21nbXRbMF0ubGVuID0gY3B1X3RvX2xlMTYoMHgyMDEwKTsKLQlyaW5nX2NvbnRyb2wtPnR4X2RhdGFbMF0uaG9zdF9hZGRyID0gY3B1X3RvX2xlMzIodHhfbWFwcGluZyk7Ci0JcmluZ19jb250cm9sLT50eF9kYXRhWzBdLmRldmljZV9hZGRyID0gaGRyLT5yZXFfaWQ7Ci0JcmluZ19jb250cm9sLT50eF9kYXRhWzBdLmxlbiA9IGNwdV90b19sZTE2KEVFUFJPTV9SRUFEQkFDS19MRU4pOwotCi0JcmluZ19jb250cm9sLT5ob3N0X2lkeFsyXSA9IGNwdV90b19sZTMyKDEpOwotCXJpbmdfY29udHJvbC0+aG9zdF9pZHhbMV0gPSBjcHVfdG9fbGUzMigxKTsKLQotCXdtYigpOwotCW1kZWxheSgxMDApOwotCVA1NFBfV1JJVEUoZGV2X2ludCwgY3B1X3RvX2xlMzIoSVNMMzhYWF9ERVZfSU5UX1VQREFURSkpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJnByaXYtPmJvb3RfY29tcCwgSFopOwotCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwcml2LT5ib290X2NvbXAsIEhaKTsKLQotCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgdHhfbWFwcGluZywKLQkJCSBFRVBST01fUkVBREJBQ0tfTEVOLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHJ4X21hcHBpbmcsCi0JCQkgMHgyMDEwLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JYWxlbiA9IGxlMTZfdG9fY3B1KHJpbmdfY29udHJvbC0+cnhfbWdtdFswXS5sZW4pOwotCWlmIChsZTMyX3RvX2NwdShyaW5nX2NvbnRyb2wtPmRldmljZV9pZHhbMl0pICE9IDEgfHwKLQkgICAgYWxlbiA8IDB4MTApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAocHJpc201NHBjaSk6IENhbm5vdCByZWFkIGVlcHJvbSFcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwcml2LT5wZGV2KSk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXA1NF9wYXJzZV9lZXByb20oZGV2LCAodTggKillZXByb20gKyAweDEwLCBhbGVuIC0gMHgxMCk7Ci0KLSBvdXQ6Ci0Ja2ZyZWUoZWVwcm9tKTsKLQlQNTRQX1dSSVRFKGludF9lbmFibGUsIGNwdV90b19sZTMyKDApKTsKLQlQNTRQX1JFQUQoaW50X2VuYWJsZSk7Ci0JdWRlbGF5KDEwKTsKLQlmcmVlX2lycShwcml2LT5wZGV2LT5pcnEsIHByaXYpOwotCVA1NFBfV1JJVEUoZGV2X2ludCwgY3B1X3RvX2xlMzIoSVNMMzhYWF9ERVZfSU5UX1JFU0VUKSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgcDU0cF9yZWZpbGxfcnhfcmluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCi17Ci0Jc3RydWN0IHA1NHBfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgcDU0cF9yaW5nX2NvbnRyb2wgKnJpbmdfY29udHJvbCA9IHByaXYtPnJpbmdfY29udHJvbDsKLQl1MzIgbGltaXQsIGhvc3RfaWR4LCBpZHg7Ci0KLQlob3N0X2lkeCA9IGxlMzJfdG9fY3B1KHJpbmdfY29udHJvbC0+aG9zdF9pZHhbMF0pOwotCWxpbWl0ID0gaG9zdF9pZHg7Ci0JbGltaXQgLT0gbGUzMl90b19jcHUocmluZ19jb250cm9sLT5kZXZpY2VfaWR4WzBdKTsKLQlsaW1pdCA9IEFSUkFZX1NJWkUocmluZ19jb250cm9sLT5yeF9kYXRhKSAtIGxpbWl0OwotCi0JaWR4ID0gaG9zdF9pZHggJSBBUlJBWV9TSVpFKHJpbmdfY29udHJvbC0+cnhfZGF0YSk7CisJaSA9IGlkeCAlIHJpbmdfbGltaXQ7CiAJd2hpbGUgKGxpbWl0LS0gPiAxKSB7Ci0JCXN0cnVjdCBwNTRwX2Rlc2MgKmRlc2MgPSAmcmluZ19jb250cm9sLT5yeF9kYXRhW2lkeF07CisJCXN0cnVjdCBwNTRwX2Rlc2MgKmRlc2MgPSAmcmluZ1tpXTsKIAogCQlpZiAoIWRlc2MtPmhvc3RfYWRkcikgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJCWRtYV9hZGRyX3QgbWFwcGluZzsKLQkJCXNrYiA9IGRldl9hbGxvY19za2IoTUFYX1JYX1NJWkUpOworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwcml2LT5jb21tb24ucnhfbXR1ICsgMzIpOwogCQkJaWYgKCFza2IpCiAJCQkJYnJlYWs7CiAKIAkJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAogCQkJCQkJIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKLQkJCQkJCSBNQVhfUlhfU0laRSwKKwkJCQkJCSBwcml2LT5jb21tb24ucnhfbXR1ICsgMzIsCiAJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCWRlc2MtPmhvc3RfYWRkciA9IGNwdV90b19sZTMyKG1hcHBpbmcpOwogCQkJZGVzYy0+ZGV2aWNlX2FkZHIgPSAwOwkvLyBGSVhNRTogbmVjZXNzYXJ5PwotCQkJZGVzYy0+bGVuID0gY3B1X3RvX2xlMTYoTUFYX1JYX1NJWkUpOworCQkJZGVzYy0+bGVuID0gY3B1X3RvX2xlMTYocHJpdi0+Y29tbW9uLnJ4X210dSArIDMyKTsKIAkJCWRlc2MtPmZsYWdzID0gMDsKLQkJCXByaXYtPnJ4X2J1ZltpZHhdID0gc2tiOworCQkJcnhfYnVmW2ldID0gc2tiOwogCQl9CiAKKwkJaSsrOwogCQlpZHgrKzsKLQkJaG9zdF9pZHgrKzsKLQkJaWR4ICU9IEFSUkFZX1NJWkUocmluZ19jb250cm9sLT5yeF9kYXRhKTsKKwkJaSAlPSByaW5nX2xpbWl0OwogCX0KIAogCXdtYigpOwotCXJpbmdfY29udHJvbC0+aG9zdF9pZHhbMF0gPSBjcHVfdG9fbGUzMihob3N0X2lkeCk7CisJcmluZ19jb250cm9sLT5ob3N0X2lkeFtyaW5nX2luZGV4XSA9IGNwdV90b19sZTMyKGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIHA1NHBfY2hlY2tfcnhfcmluZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHUzMiAqaW5kZXgsCisJaW50IHJpbmdfaW5kZXgsIHN0cnVjdCBwNTRwX2Rlc2MgKnJpbmcsIHUzMiByaW5nX2xpbWl0LAorCXN0cnVjdCBza19idWZmICoqcnhfYnVmKQoreworCXN0cnVjdCBwNTRwX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHA1NHBfcmluZ19jb250cm9sICpyaW5nX2NvbnRyb2wgPSBwcml2LT5yaW5nX2NvbnRyb2w7CisJc3RydWN0IHA1NHBfZGVzYyAqZGVzYzsKKwl1MzIgaWR4LCBpOworCisJaSA9ICgqaW5kZXgpICUgcmluZ19saW1pdDsKKwkoKmluZGV4KSA9IGlkeCA9IGxlMzJfdG9fY3B1KHJpbmdfY29udHJvbC0+ZGV2aWNlX2lkeFtyaW5nX2luZGV4XSk7CisJaWR4ICU9IHJpbmdfbGltaXQ7CisJd2hpbGUgKGkgIT0gaWR4KSB7CisJCXUxNiBsZW47CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWRlc2MgPSAmcmluZ1tpXTsKKwkJbGVuID0gbGUxNl90b19jcHUoZGVzYy0+bGVuKTsKKwkJc2tiID0gcnhfYnVmW2ldOworCisJCWlmICghc2tiKSB7CisJCQlpKys7CisJCQlpICU9IHJpbmdfbGltaXQ7CisJCQljb250aW51ZTsKKwkJfQorCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQlpZiAocDU0X3J4KGRldiwgc2tiKSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgbGUzMl90b19jcHUoZGVzYy0+aG9zdF9hZGRyKSwKKwkJCQkJIHByaXYtPmNvbW1vbi5yeF9tdHUgKyAzMiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeF9idWZbaV0gPSBOVUxMOworCQkJZGVzYy0+aG9zdF9hZGRyID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNrYl90cmltKHNrYiwgMCk7CisJCQlkZXNjLT5sZW4gPSBjcHVfdG9fbGUxNihwcml2LT5jb21tb24ucnhfbXR1ICsgMzIpOworCQl9CisKKwkJaSsrOworCQlpICU9IHJpbmdfbGltaXQ7CisJfQorCisJcDU0cF9yZWZpbGxfcnhfcmluZyhkZXYsIHJpbmdfaW5kZXgsIHJpbmcsIHJpbmdfbGltaXQsIHJ4X2J1Zik7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgcHJpdi0+bG9jayAqLworc3RhdGljIHZvaWQgcDU0cF9jaGVja190eF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTMyICppbmRleCwKKwlpbnQgcmluZ19pbmRleCwgc3RydWN0IHA1NHBfZGVzYyAqcmluZywgdTMyIHJpbmdfbGltaXQsCisJdm9pZCAqKnR4X2J1ZikKK3sKKwlzdHJ1Y3QgcDU0cF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBwNTRwX3JpbmdfY29udHJvbCAqcmluZ19jb250cm9sID0gcHJpdi0+cmluZ19jb250cm9sOworCXN0cnVjdCBwNTRwX2Rlc2MgKmRlc2M7CisJdTMyIGlkeCwgaTsKKworCWkgPSAoKmluZGV4KSAlIHJpbmdfbGltaXQ7CisJKCppbmRleCkgPSBpZHggPSBsZTMyX3RvX2NwdShyaW5nX2NvbnRyb2wtPmRldmljZV9pZHhbMV0pOworCWlkeCAlPSByaW5nX2xpbWl0OworCisJd2hpbGUgKGkgIT0gaWR4KSB7CisJCWRlc2MgPSAmcmluZ1tpXTsKKwkJa2ZyZWUodHhfYnVmW2ldKTsKKwkJdHhfYnVmW2ldID0gTlVMTDsKKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGxlMzJfdG9fY3B1KGRlc2MtPmhvc3RfYWRkciksCisJCQkJIGxlMTZfdG9fY3B1KGRlc2MtPmxlbiksIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWRlc2MtPmhvc3RfYWRkciA9IDA7CisJCWRlc2MtPmRldmljZV9hZGRyID0gMDsKKwkJZGVzYy0+bGVuID0gMDsKKwkJZGVzYy0+ZmxhZ3MgPSAwOworCisJCWkrKzsKKwkJaSAlPSByaW5nX2xpbWl0OworCX0KK30KKworc3RhdGljIHZvaWQgcDU0cF9yeF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGV2X2lkKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IChzdHJ1Y3QgaWVlZTgwMjExX2h3ICopZGV2X2lkOworCXN0cnVjdCBwNTRwX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHA1NHBfcmluZ19jb250cm9sICpyaW5nX2NvbnRyb2wgPSBwcml2LT5yaW5nX2NvbnRyb2w7CisKKwlwNTRwX2NoZWNrX3J4X3JpbmcoZGV2LCAmcHJpdi0+cnhfaWR4X21nbXQsIDIsIHJpbmdfY29udHJvbC0+cnhfbWdtdCwKKwkJQVJSQVlfU0laRShyaW5nX2NvbnRyb2wtPnJ4X21nbXQpLCBwcml2LT5yeF9idWZfbWdtdCk7CisKKwlwNTRwX2NoZWNrX3J4X3JpbmcoZGV2LCAmcHJpdi0+cnhfaWR4X2RhdGEsIDAsIHJpbmdfY29udHJvbC0+cnhfZGF0YSwKKwkJQVJSQVlfU0laRShyaW5nX2NvbnRyb2wtPnJ4X2RhdGEpLCBwcml2LT5yeF9idWZfZGF0YSk7CisKKwl3bWIoKTsKKwlQNTRQX1dSSVRFKGRldl9pbnQsIGNwdV90b19sZTMyKElTTDM4WFhfREVWX0lOVF9VUERBVEUpKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHA1NHBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTI5OCw2NSArMjg2LDE4IEBACiAJcmVnICY9IFA1NFBfUkVBRChpbnRfZW5hYmxlKTsKIAogCWlmIChyZWcgJiBjcHVfdG9fbGUzMihJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUpKSB7Ci0JCXN0cnVjdCBwNTRwX2Rlc2MgKmRlc2M7Ci0JCXUzMiBpZHgsIGk7Ci0JCWkgPSBwcml2LT50eF9pZHg7Ci0JCWkgJT0gQVJSQVlfU0laRShyaW5nX2NvbnRyb2wtPnR4X2RhdGEpOwotCQlwcml2LT50eF9pZHggPSBpZHggPSBsZTMyX3RvX2NwdShyaW5nX2NvbnRyb2wtPmRldmljZV9pZHhbMV0pOwotCQlpZHggJT0gQVJSQVlfU0laRShyaW5nX2NvbnRyb2wtPnR4X2RhdGEpOworCQlwNTRwX2NoZWNrX3R4X3JpbmcoZGV2LCAmcHJpdi0+dHhfaWR4X21nbXQsCisJCQkJICAgMywgcmluZ19jb250cm9sLT50eF9tZ210LAorCQkJCSAgIEFSUkFZX1NJWkUocmluZ19jb250cm9sLT50eF9tZ210KSwKKwkJCQkgICBwcml2LT50eF9idWZfbWdtdCk7CiAKLQkJd2hpbGUgKGkgIT0gaWR4KSB7Ci0JCQlkZXNjID0gJnJpbmdfY29udHJvbC0+dHhfZGF0YVtpXTsKLQkJCWlmIChwcml2LT50eF9idWZbaV0pIHsKLQkJCQlrZnJlZShwcml2LT50eF9idWZbaV0pOwotCQkJCXByaXYtPnR4X2J1ZltpXSA9IE5VTEw7Ci0JCQl9CisJCXA1NHBfY2hlY2tfdHhfcmluZyhkZXYsICZwcml2LT50eF9pZHhfZGF0YSwKKwkJCQkgICAxLCByaW5nX2NvbnRyb2wtPnR4X2RhdGEsCisJCQkJICAgQVJSQVlfU0laRShyaW5nX2NvbnRyb2wtPnR4X2RhdGEpLAorCQkJCSAgIHByaXYtPnR4X2J1Zl9kYXRhKTsKIAotCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LCBsZTMyX3RvX2NwdShkZXNjLT5ob3N0X2FkZHIpLAotCQkJCQkgbGUxNl90b19jcHUoZGVzYy0+bGVuKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPnJ4X3Rhc2tsZXQpOwogCi0JCQlkZXNjLT5ob3N0X2FkZHIgPSAwOwotCQkJZGVzYy0+ZGV2aWNlX2FkZHIgPSAwOwotCQkJZGVzYy0+bGVuID0gMDsKLQkJCWRlc2MtPmZsYWdzID0gMDsKLQotCQkJaSsrOwotCQkJaSAlPSBBUlJBWV9TSVpFKHJpbmdfY29udHJvbC0+dHhfZGF0YSk7Ci0JCX0KLQotCQlpID0gcHJpdi0+cnhfaWR4OwotCQlpICU9IEFSUkFZX1NJWkUocmluZ19jb250cm9sLT5yeF9kYXRhKTsKLQkJcHJpdi0+cnhfaWR4ID0gaWR4ID0gbGUzMl90b19jcHUocmluZ19jb250cm9sLT5kZXZpY2VfaWR4WzBdKTsKLQkJaWR4ICU9IEFSUkFZX1NJWkUocmluZ19jb250cm9sLT5yeF9kYXRhKTsKLQkJd2hpbGUgKGkgIT0gaWR4KSB7Ci0JCQl1MTYgbGVuOwotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCWRlc2MgPSAmcmluZ19jb250cm9sLT5yeF9kYXRhW2ldOwotCQkJbGVuID0gbGUxNl90b19jcHUoZGVzYy0+bGVuKTsKLQkJCXNrYiA9IHByaXYtPnJ4X2J1ZltpXTsKLQotCQkJc2tiX3B1dChza2IsIGxlbik7Ci0KLQkJCWlmIChwNTRfcngoZGV2LCBza2IpKSB7Ci0JCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAotCQkJCQkJIGxlMzJfdG9fY3B1KGRlc2MtPmhvc3RfYWRkciksCi0JCQkJCQkgTUFYX1JYX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0KLQkJCQlwcml2LT5yeF9idWZbaV0gPSBOVUxMOwotCQkJCWRlc2MtPmhvc3RfYWRkciA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXNrYl90cmltKHNrYiwgMCk7Ci0JCQkJZGVzYy0+bGVuID0gY3B1X3RvX2xlMTYoTUFYX1JYX1NJWkUpOwotCQkJfQotCi0JCQlpKys7Ci0JCQlpICU9IEFSUkFZX1NJWkUocmluZ19jb250cm9sLT5yeF9kYXRhKTsKLQkJfQotCi0JCXA1NHBfcmVmaWxsX3J4X3JpbmcoZGV2KTsKLQotCQl3bWIoKTsKLQkJUDU0UF9XUklURShkZXZfaW50LCBjcHVfdG9fbGUzMihJU0wzOFhYX0RFVl9JTlRfVVBEQVRFKSk7CiAJfSBlbHNlIGlmIChyZWcgJiBjcHVfdG9fbGUzMihJU0wzOFhYX0lOVF9JREVOVF9JTklUKSkKIAkJY29tcGxldGUoJnByaXYtPmJvb3RfY29tcCk7CiAKQEAgLTM5Miw3ICszMzMsNyBAQAogCXJpbmdfY29udHJvbC0+aG9zdF9pZHhbMV0gPSBjcHVfdG9fbGUzMihpZHggKyAxKTsKIAogCWlmIChmcmVlX29uX3R4KQotCQlwcml2LT50eF9idWZbaV0gPSBkYXRhOworCQlwcml2LT50eF9idWZfZGF0YVtpXSA9IGRhdGE7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQxMiw3ICszNTMsNyBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZwcml2LT5ib290X2NvbXApOwogCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPnBkZXYtPmlycSwgJnA1NHBfaW50ZXJydXB0LAotCQkJICBJUlFGX1NIQVJFRCwgInByaXNtNTRwY2kiLCBkZXYpOworCQkJICBJUlFGX1NIQVJFRCwgInA1NHBjaSIsIGRldik7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIsCiAJCSAgICAgICB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKQEAgLTQyMCwxMCArMzYxLDE5IEBACiAJfQogCiAJbWVtc2V0KHByaXYtPnJpbmdfY29udHJvbCwgMCwgc2l6ZW9mKCpwcml2LT5yaW5nX2NvbnRyb2wpKTsKLQlwcml2LT5yeF9pZHggPSBwcml2LT50eF9pZHggPSAwOwotCXA1NHBfcmVmaWxsX3J4X3JpbmcoZGV2KTsKKwllcnIgPSBwNTRwX3VwbG9hZF9maXJtd2FyZShkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9pcnEocHJpdi0+cGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwlwcml2LT5yeF9pZHhfZGF0YSA9IHByaXYtPnR4X2lkeF9kYXRhID0gMDsKKwlwcml2LT5yeF9pZHhfbWdtdCA9IHByaXYtPnR4X2lkeF9tZ210ID0gMDsKIAotCXA1NHBfdXBsb2FkX2Zpcm13YXJlKGRldik7CisJcDU0cF9yZWZpbGxfcnhfcmluZyhkZXYsIDAsIHByaXYtPnJpbmdfY29udHJvbC0+cnhfZGF0YSwKKwkJQVJSQVlfU0laRShwcml2LT5yaW5nX2NvbnRyb2wtPnJ4X2RhdGEpLCBwcml2LT5yeF9idWZfZGF0YSk7CisKKwlwNTRwX3JlZmlsbF9yeF9yaW5nKGRldiwgMiwgcHJpdi0+cmluZ19jb250cm9sLT5yeF9tZ210LAorCQlBUlJBWV9TSVpFKHByaXYtPnJpbmdfY29udHJvbC0+cnhfbWdtdCksIHByaXYtPnJ4X2J1Zl9tZ210KTsKIAogCVA1NFBfV1JJVEUocmluZ19jb250cm9sX2Jhc2UsIGNwdV90b19sZTMyKHByaXYtPnJpbmdfY29udHJvbF9kbWEpKTsKIAlQNTRQX1JFQUQocmluZ19jb250cm9sX2Jhc2UpOwpAQCAtNDY1LDYgKzQxNSw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHA1NHBfZGVzYyAqZGVzYzsKIAorCXRhc2tsZXRfa2lsbCgmcHJpdi0+cnhfdGFza2xldCk7CisKIAlQNTRQX1dSSVRFKGludF9lbmFibGUsIGNwdV90b19sZTMyKDApKTsKIAlQNTRQX1JFQUQoaW50X2VuYWJsZSk7CiAJdWRlbGF5KDEwKTsKQEAgLTQ3MywyNiArNDI1LDUzIEBACiAKIAlQNTRQX1dSSVRFKGRldl9pbnQsIGNwdV90b19sZTMyKElTTDM4WFhfREVWX0lOVF9SRVNFVCkpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJpdi0+cnhfYnVmKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJpdi0+cnhfYnVmX2RhdGEpOyBpKyspIHsKIAkJZGVzYyA9ICZyaW5nX2NvbnRyb2wtPnJ4X2RhdGFbaV07CiAJCWlmIChkZXNjLT5ob3N0X2FkZHIpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGxlMzJfdG9fY3B1KGRlc2MtPmhvc3RfYWRkciksCi0JCQkJCSBNQVhfUlhfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJa2ZyZWVfc2tiKHByaXYtPnJ4X2J1ZltpXSk7Ci0JCXByaXYtPnJ4X2J1ZltpXSA9IE5VTEw7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBsZTMyX3RvX2NwdShkZXNjLT5ob3N0X2FkZHIpLAorCQkJCQkgcHJpdi0+Y29tbW9uLnJ4X210dSArIDMyLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJa2ZyZWVfc2tiKHByaXYtPnJ4X2J1Zl9kYXRhW2ldKTsKKwkJcHJpdi0+cnhfYnVmX2RhdGFbaV0gPSBOVUxMOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaXYtPnR4X2J1Zik7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaXYtPnJ4X2J1Zl9tZ210KTsgaSsrKSB7CisJCWRlc2MgPSAmcmluZ19jb250cm9sLT5yeF9tZ210W2ldOworCQlpZiAoZGVzYy0+aG9zdF9hZGRyKQorCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgbGUzMl90b19jcHUoZGVzYy0+aG9zdF9hZGRyKSwKKwkJCQkJIHByaXYtPmNvbW1vbi5yeF9tdHUgKyAzMiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWtmcmVlX3NrYihwcml2LT5yeF9idWZfbWdtdFtpXSk7CisJCXByaXYtPnJ4X2J1Zl9tZ210W2ldID0gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcml2LT50eF9idWZfZGF0YSk7IGkrKykgewogCQlkZXNjID0gJnJpbmdfY29udHJvbC0+dHhfZGF0YVtpXTsKIAkJaWYgKGRlc2MtPmhvc3RfYWRkcikKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgbGUzMl90b19jcHUoZGVzYy0+aG9zdF9hZGRyKSwKLQkJCQkJIGxlMTZfdG9fY3B1KGRlc2MtPmxlbiksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgbGUzMl90b19jcHUoZGVzYy0+aG9zdF9hZGRyKSwKKwkJCQkJIGxlMTZfdG9fY3B1KGRlc2MtPmxlbiksCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAotCQlrZnJlZShwcml2LT50eF9idWZbaV0pOwotCQlwcml2LT50eF9idWZbaV0gPSBOVUxMOworCQlrZnJlZShwcml2LT50eF9idWZfZGF0YVtpXSk7CisJCXByaXYtPnR4X2J1Zl9kYXRhW2ldID0gTlVMTDsKIAl9CiAKLQltZW1zZXQocmluZ19jb250cm9sLCAwLCBzaXplb2YocmluZ19jb250cm9sKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJpdi0+dHhfYnVmX21nbXQpOyBpKyspIHsKKwkJZGVzYyA9ICZyaW5nX2NvbnRyb2wtPnR4X21nbXRbaV07CisJCWlmIChkZXNjLT5ob3N0X2FkZHIpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBsZTMyX3RvX2NwdShkZXNjLT5ob3N0X2FkZHIpLAorCQkJCQkgbGUxNl90b19jcHUoZGVzYy0+bGVuKSwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWtmcmVlKHByaXYtPnR4X2J1Zl9tZ210W2ldKTsKKwkJcHJpdi0+dHhfYnVmX21nbXRbaV0gPSBOVUxMOworCX0KKworCW1lbXNldChyaW5nX2NvbnRyb2wsIDAsIHNpemVvZigqcmluZ19jb250cm9sKSk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHA1NHBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC01MDYsNyArNDg1LDcgQEAKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAocHJpc201NHBjaSk6IENhbm5vdCBlbmFibGUgbmV3IFBDSSBkZXZpY2VcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXMgKHA1NHBjaSk6IENhbm5vdCBlbmFibGUgbmV3IFBDSSBkZXZpY2VcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNTE0LDIyICs0OTMsMjIgQEAKIAltZW1fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAltZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKIAlpZiAobWVtX2xlbiA8IHNpemVvZihzdHJ1Y3QgcDU0cF9jc3IpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgKHByaXNtNTRwY2kpOiBUb28gc2hvcnQgUENJIHJlc291cmNlc1xuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAocDU0cGNpKTogVG9vIHNob3J0IFBDSSByZXNvdXJjZXNcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJwcmlzbTU0cGNpIik7CisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAicDU0cGNpIik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIChwcmlzbTU0cGNpKTogQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzIChwNTRwY2kpOiBDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXNcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spIHx8CiAJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAocHJpc201NHBjaSk6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXMgKHA1NHBjaSk6IE5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCWdvdG8gZXJyX2ZyZWVfcmVnOwogCX0KQEAgLTU0Miw3ICs1MjEsNyBAQAogCiAJZGV2ID0gcDU0X2luaXRfY29tbW9uKHNpemVvZigqcHJpdikpOwogCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgKHByaXNtNTRwY2kpOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzIChwNTRwY2kpOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX3JlZzsKQEAgLTU1Niw3ICs1MzUsNyBAQAogCiAJcHJpdi0+bWFwID0gaW9yZW1hcChtZW1fYWRkciwgbWVtX2xlbik7CiAJaWYgKCFwcml2LT5tYXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyAocHJpc201NHBjaSk6IENhbm5vdCBtYXAgZGV2aWNlIG1lbW9yeVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAocDU0cGNpKTogQ2Fubm90IG1hcCBkZXZpY2UgbWVtb3J5XG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQllcnIgPSAtRUlOVkFMOwkvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgZXJyb3IgY29kZT8KIAkJZ290byBlcnJfZnJlZV9kZXY7CkBAIC01NjUsMzkgKzU0NCwzMSBAQAogCXByaXYtPnJpbmdfY29udHJvbCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZigqcHJpdi0+cmluZ19jb250cm9sKSwKIAkJCQkJCSAgJnByaXYtPnJpbmdfY29udHJvbF9kbWEpOwogCWlmICghcHJpdi0+cmluZ19jb250cm9sKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgKHByaXNtNTRwY2kpOiBDYW5ub3QgYWxsb2NhdGUgcmluZ3NcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXMgKHA1NHBjaSk6IENhbm5vdCBhbGxvY2F0ZSByaW5nc1xuIiwKIAkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW91bm1hcDsKIAl9Ci0JbWVtc2V0KHByaXYtPnJpbmdfY29udHJvbCwgMCwgc2l6ZW9mKCpwcml2LT5yaW5nX2NvbnRyb2wpKTsKLQotCWVyciA9IHA1NHBfdXBsb2FkX2Zpcm13YXJlKGRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZV9kZXNjOwotCi0JZXJyID0gcDU0cF9yZWFkX2VlcHJvbShkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfZGVzYzsKLQogCXByaXYtPmNvbW1vbi5vcGVuID0gcDU0cF9vcGVuOwogCXByaXYtPmNvbW1vbi5zdG9wID0gcDU0cF9zdG9wOwogCXByaXYtPmNvbW1vbi50eCA9IHA1NHBfdHg7CiAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJdGFza2xldF9pbml0KCZwcml2LT5yeF90YXNrbGV0LCBwNTRwX3J4X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWRldik7CisKKwlwNTRwX29wZW4oZGV2KTsKKwllcnIgPSBwNTRfcmVhZF9lZXByb20oZGV2KTsKKwlwNTRwX3N0b3AoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2Rlc2M7CiAKIAllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgKHByaXNtNTRwY2kpOiBDYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzIChwNTRwY2kpOiBDYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQlnb3RvIGVycl9mcmVlX2NvbW1vbjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogaHdhZGRyICVzLCBpc2wzOCUwMnhcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksCi0JICAgICAgIHByaW50X21hYyhtYWMsIGRldi0+d2lwaHktPnBlcm1fYWRkciksCi0JICAgICAgIHByaXYtPmNvbW1vbi52ZXJzaW9uKTsKLQogCXJldHVybiAwOwogCiAgZXJyX2ZyZWVfY29tbW9uOgpAQCAtNjQ1LDcgKzYxNiw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBwNTRwX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAKLQlpZiAocHJpdi0+Y29tbW9uLm1vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRCkgeworCWlmIChwcml2LT5jb21tb24ubW9kZSAhPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCkgewogCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoZGV2KTsKIAkJcDU0cF9zdG9wKGRldik7CiAJfQpAQCAtNjYzLDcgKzYzNCw3IEBACiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCi0JaWYgKHByaXYtPmNvbW1vbi5tb2RlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQpIHsKKwlpZiAocHJpdi0+Y29tbW9uLm1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpIHsKIAkJcDU0cF9vcGVuKGRldik7CiAJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhkZXYpOwogCX0KQEAgLTY3Myw3ICs2NDQsNyBAQAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcDU0cF9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gInByaXNtNTRwY2kiLAorCS5uYW1lCQk9ICJwNTRwY2kiLAogCS5pZF90YWJsZQk9IHA1NHBfdGFibGUsCiAJLnByb2JlCQk9IHA1NHBfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwNTRwX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmgKaW5kZXggNWJlZGQ3YS4uNGE2Nzc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgUFJJU001NFBDSV9ICi0jZGVmaW5lIFBSSVNNNTRQQ0lfSAorI2lmbmRlZiBQNTRQQ0lfSAorI2RlZmluZSBQNTRQQ0lfSAogCiAvKgogICogRGVmaW5lcyBmb3IgUENJIGJhc2VkIG1hYzgwMjExIFByaXNtNTQgZHJpdmVyCkBAIC02OCw3ICs2OCw3IEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogdXNiIGJhY2tlbmQgb25seSBuZWVkcyB0aGUgcmVnaXN0ZXIgZGVmaW5lcyBhYm92ZSAqLwotI2lmbmRlZiBQUklTTTU0VVNCX0gKKyNpZm5kZWYgUDU0VVNCX0gKIHN0cnVjdCBwNTRwX2Rlc2MgewogCV9fbGUzMiBob3N0X2FkZHI7CiAJX19sZTMyIGRldmljZV9hZGRyOwpAQCAtOTIsMTUgKzkyLDE5IEBACiAJc3RydWN0IHA1NF9jb21tb24gY29tbW9uOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBwNTRwX2NzciBfX2lvbWVtICptYXA7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X3Rhc2tsZXQ7CiAKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHA1NHBfcmluZ19jb250cm9sICpyaW5nX2NvbnRyb2w7CiAJZG1hX2FkZHJfdCByaW5nX2NvbnRyb2xfZG1hOwotCXUzMiByeF9pZHgsIHR4X2lkeDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcnhfYnVmWzhdOwotCXZvaWQgKnR4X2J1ZlszMl07CisJdTMyIHJ4X2lkeF9kYXRhLCB0eF9pZHhfZGF0YTsKKwl1MzIgcnhfaWR4X21nbXQsIHR4X2lkeF9tZ210OworCXN0cnVjdCBza19idWZmICpyeF9idWZfZGF0YVs4XTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfYnVmX21nbXRbNF07CisJdm9pZCAqdHhfYnVmX2RhdGFbMzJdOworCXZvaWQgKnR4X2J1Zl9tZ210WzRdOwogCXN0cnVjdCBjb21wbGV0aW9uIGJvb3RfY29tcDsKIH07CiAKLSNlbmRpZiAvKiBQUklTTTU0VVNCX0ggKi8KLSNlbmRpZiAvKiBQUklTTTU0UENJX0ggKi8KKyNlbmRpZiAvKiBQNTRVU0JfSCAqLworI2VuZGlmIC8qIFA1NFBDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMKaW5kZXggY2JhY2EyMy4uNzVkNzQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwpAQCAtMzksNiArMzksNyBAQAogCXtVU0JfREVWSUNFKDB4MDg0NiwgMHg0MjAwKX0sCS8qIE5ldGdlYXIgV0cxMjEgKi8KIAl7VVNCX0RFVklDRSgweDA4NDYsIDB4NDIxMCl9LAkvKiBOZXRnZWFyIFdHMTIxIHRoZSBzZWNvbmQgPyAqLwogCXtVU0JfREVWSUNFKDB4MDg0NiwgMHg0MjIwKX0sCS8qIE5ldGdlYXIgV0cxMTEgKi8KKwl7VVNCX0RFVklDRSgweDA5YWEsIDB4MTAwMCl9LAkvKiBTcGlubmFrZXIgUHJvdG8gYm9hcmQgKi8KIAl7VVNCX0RFVklDRSgweDBjZGUsIDB4MDAwNil9LAkvKiBNZWRpb24gNDA5MDAsIFJvcGVyIEV1cm9wZSAqLwogCXtVU0JfREVWSUNFKDB4MTI0YSwgMHg0MDIzKX0sCS8qIFNodXR0bGUgUE4xNSwgQWlydmFzdCBXTTE2OGcsIElPR2VhciBHV1U1MTMgKi8KIAl7VVNCX0RFVklDRSgweDE5MTUsIDB4MjIzNCl9LAkvKiBMaW5rc3lzIFdVU0I1NEcgT0VNICovCkBAIC02Myw4ICs2NCw4IEBACiAJe1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDYpfSwgICAvKiBNZWRpb24gTUQ0MDkwMCAqLwogCXtVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDA4KX0sCS8qIFNhZ2VtIFhHNzAzQSAqLwogCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHgzNzYyKX0sCS8qIERMaW5rIERXTC1HMTIwIENvaGliYSAqLwotCXtVU0JfREVWSUNFKDB4MDlhYSwgMHgxMDAwKX0sCS8qIFNwaW5uYWtlciBQcm90byBib2FyZCAqLwogCXtVU0JfREVWSUNFKDB4MTI0YSwgMHg0MDI1KX0sCS8qIElPR2VhciBHV1U1MTMgKEdXMzg4N0lLIGNoaXApICovCisJe1VTQl9ERVZJQ0UoMHgxMjYwLCAweGVlMjIpfSwJLyogU01DIDI4NjJXLUcgdmVyc2lvbiAyICovCiAJe1VTQl9ERVZJQ0UoMHgxM2IxLCAweDAwMGEpfSwJLyogTGlua3N5cyBXVVNCNTRHIHZlciAyICovCiAJe1VTQl9ERVZJQ0UoMHgxM0IxLCAweDAwMEMpfSwJLyogTGlua3N5cyBXVVNCNTRBRyAqLwogCXtVU0JfREVWSUNFKDB4MTQzNSwgMHgwNDI3KX0sCS8qIEludmVudGVsIFVSMDU0RyAqLwpAQCAtOTEsMTEgKzkyLDE2IEBACiAKIAlza2JfdW5saW5rKHNrYiwgJnByaXYtPnJ4X3F1ZXVlKTsKIAlza2JfcHV0KHNrYiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQlpZiAoIXByaXYtPmh3X3R5cGUpCi0JCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBuZXQyMjgwX3R4X2hkcikpOworCisJaWYgKHByaXYtPmh3X3R5cGUgPT0gUDU0VV9ORVQyMjgwKQorCQlza2JfcHVsbChza2IsIHByaXYtPmNvbW1vbi50eF9oZHJfbGVuKTsKKwlpZiAocHJpdi0+Y29tbW9uLmZ3X2ludGVyZmFjZSA9PSBGV19MTTg3KSB7CisJCXNrYl9wdWxsKHNrYiwgNCk7CisJCXNrYl9wdXQoc2tiLCA0KTsKKwl9CiAKIAlpZiAocDU0X3J4KGRldiwgc2tiKSkgewotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9SWF9TSVpFKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwcml2LT5jb21tb24ucnhfbXR1ICsgMzIpOwogCQlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJCXVzYl9mcmVlX3VyYih1cmIpOwogCQkJLyogVE9ETyBjaGVjayByeCBxdWV1ZSBsZW5ndGggYW5kIHJlZmlsbCAqc29tZXdoZXJlKiAqLwpAQCAtMTA5LDkgKzExNSwxMiBAQAogCQl1cmItPmNvbnRleHQgPSBza2I7CiAJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5yeF9xdWV1ZSwgc2tiKTsKIAl9IGVsc2UgewotCQlpZiAoIXByaXYtPmh3X3R5cGUpCi0JCQlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgbmV0MjI4MF90eF9oZHIpKTsKLQorCQlpZiAocHJpdi0+aHdfdHlwZSA9PSBQNTRVX05FVDIyODApCisJCQlza2JfcHVzaChza2IsIHByaXYtPmNvbW1vbi50eF9oZHJfbGVuKTsKKwkJaWYgKHByaXYtPmNvbW1vbi5md19pbnRlcmZhY2UgPT0gRldfTE04NykgeworCQkJc2tiX3B1c2goc2tiLCA0KTsKKwkJCXNrYl9wdXQoc2tiLCA0KTsKKwkJfQogCQlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CiAJCXNrYl90cmltKHNrYiwgMCk7CiAJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciAhPSBza2JfdGFpbF9wb2ludGVyKHNrYikpIHsKQEAgLTE0NSw3ICsxNTQsNyBAQAogCXN0cnVjdCBwNTR1X3J4X2luZm8gKmluZm87CiAKIAl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+cnhfcXVldWUpIDwgMzIpIHsKLQkJc2tiID0gX19kZXZfYWxsb2Nfc2tiKE1BWF9SWF9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJc2tiID0gX19kZXZfYWxsb2Nfc2tiKHByaXYtPmNvbW1vbi5yeF9tdHUgKyAzMiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2tiKQogCQkJYnJlYWs7CiAJCWVudHJ5ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKQEAgLTE1Myw3ICsxNjIsMTAgQEAKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJYnJlYWs7CiAJCX0KLQkJdXNiX2ZpbGxfYnVsa191cmIoZW50cnksIHByaXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCBQNTRVX1BJUEVfREFUQSksIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgTUFYX1JYX1NJWkUsIHA1NHVfcnhfY2IsIHNrYik7CisJCXVzYl9maWxsX2J1bGtfdXJiKGVudHJ5LCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsIFA1NFVfUElQRV9EQVRBKSwKKwkJCQkgIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkgIHByaXYtPmNvbW1vbi5yeF9tdHUgKyAzMiwgcDU0dV9yeF9jYiwgc2tiKTsKIAkJaW5mbyA9IChzdHJ1Y3QgcDU0dV9yeF9pbmZvICopIHNrYi0+Y2I7CiAJCWluZm8tPnVyYiA9IGVudHJ5OwogCQlpbmZvLT5kZXYgPSBkZXY7CkBAIC0yMDcsNiArMjE5LDQyIEBACiAJdXNiX3N1Ym1pdF91cmIoZGF0YV91cmIsIEdGUF9BVE9NSUMpOwogfQogCitzdGF0aWMgX19sZTMyIHA1NHVfbG04N19jaGtzdW0oY29uc3QgdTMyICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCXUzMiBjaGsgPSAwOworCisJbGVuZ3RoID4+PSAyOworCXdoaWxlIChsZW5ndGgtLSkgeworCQljaGsgXj0gKmRhdGErKzsKKwkJY2hrID0gKGNoayA+PiA1KSBeIChjaGsgPDwgMyk7CisJfQorCisJcmV0dXJuIGNwdV90b19sZTMyKGNoayk7Cit9CisKK3N0YXRpYyB2b2lkIHA1NHVfdHhfbG04NyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkgc3RydWN0IHA1NF9jb250cm9sX2hkciAqZGF0YSwKKwkJCSBzaXplX3QgbGVuLCBpbnQgZnJlZV9vbl90eCkKK3sKKwlzdHJ1Y3QgcDU0dV9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCB1cmIgKmRhdGFfdXJiOworCXN0cnVjdCBsbTg3X3R4X2hkciAqaGRyID0gKHZvaWQgKilkYXRhIC0gc2l6ZW9mKCpoZHIpOworCisJZGF0YV91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghZGF0YV91cmIpCisJCXJldHVybjsKKworCWhkci0+Y2hrc3VtID0gcDU0dV9sbTg3X2Noa3N1bSgodTMyICopZGF0YSwgbGVuKTsKKwloZHItPmRldmljZV9hZGRyID0gZGF0YS0+cmVxX2lkOworCisJdXNiX2ZpbGxfYnVsa191cmIoZGF0YV91cmIsIHByaXYtPnVkZXYsCisJCXVzYl9zbmRidWxrcGlwZShwcml2LT51ZGV2LCBQNTRVX1BJUEVfREFUQSksIGhkciwKKwkJbGVuICsgc2l6ZW9mKCpoZHIpLCBmcmVlX29uX3R4ID8gcDU0dV90eF9mcmVlX2NiIDogcDU0dV90eF9jYiwKKwkJZGV2KTsKKworCXVzYl9zdWJtaXRfdXJiKGRhdGFfdXJiLCBHRlBfQVRPTUlDKTsKK30KKwogc3RhdGljIHZvaWQgcDU0dV90eF9uZXQyMjgwKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgc3RydWN0IHA1NF9jb250cm9sX2hkciAqZGF0YSwKIAkJCSAgICBzaXplX3QgbGVuLCBpbnQgZnJlZV9vbl90eCkKIHsKQEAgLTMxMiw3MyArMzYwLDYgQEAKIAkJCSAgICBkYXRhLCBsZW4sICZhbGVuLCAyMDAwKTsKIH0KIAotc3RhdGljIGludCBwNTR1X3JlYWRfZWVwcm9tKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKLXsKLQlzdHJ1Y3QgcDU0dV9wcml2ICpwcml2ID0gZGV2LT5wcml2OwotCXZvaWQgKmJ1ZjsKLQlzdHJ1Y3QgcDU0X2NvbnRyb2xfaGRyICpoZHI7Ci0JaW50IGVyciwgYWxlbjsKLQlzaXplX3Qgb2Zmc2V0ID0gcHJpdi0+aHdfdHlwZSA/IDB4MTAgOiAweDIwOwotCi0JYnVmID0ga21hbGxvYygweDIwMjAsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHJpc201NHVzYjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgotCQkgICAgICAgImVlcHJvbSByZWFkYmFjayFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAocHJpdi0+aHdfdHlwZSkgewotCQkqKCh1MzIgKikgYnVmKSA9IHByaXYtPmNvbW1vbi5yeF9zdGFydDsKLQkJZXJyID0gcDU0dV9idWxrX21zZyhwcml2LCBQNTRVX1BJUEVfREFUQSwgYnVmLCBzaXplb2YodTMyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicHJpc201NHVzYjogYWRkciBzZW5kIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJ1Y3QgbmV0MjI4MF9yZWdfd3JpdGUgKnJlZyA9IGJ1ZjsKLQkJcmVnLT5wb3J0ID0gY3B1X3RvX2xlMTYoTkVUMjI4MF9ERVZfVTMyKTsKLQkJcmVnLT5hZGRyID0gY3B1X3RvX2xlMzIoUDU0VV9ERVZfQkFTRSk7Ci0JCXJlZy0+dmFsID0gY3B1X3RvX2xlMzIoSVNMMzhYWF9ERVZfSU5UX0RBVEEpOwotCQllcnIgPSBwNTR1X2J1bGtfbXNnKHByaXYsIFA1NFVfUElQRV9ERVYsIGJ1Ziwgc2l6ZW9mKCpyZWcpKTsKLQkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0dXNiOiBkZXZfaW50IHNlbmQgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQotCWhkciA9IGJ1ZiArIHByaXYtPmNvbW1vbi50eF9oZHJfbGVuOwotCXA1NF9maWxsX2VlcHJvbV9yZWFkYmFjayhoZHIpOwotCWhkci0+cmVxX2lkID0gY3B1X3RvX2xlMzIocHJpdi0+Y29tbW9uLnJ4X3N0YXJ0KTsKLQlpZiAocHJpdi0+Y29tbW9uLnR4X2hkcl9sZW4pIHsKLQkJc3RydWN0IG5ldDIyODBfdHhfaGRyICp0eF9oZHIgPSBidWY7Ci0JCXR4X2hkci0+ZGV2aWNlX2FkZHIgPSBoZHItPnJlcV9pZDsKLQkJdHhfaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihFRVBST01fUkVBREJBQ0tfTEVOKTsKLQl9Ci0KLQkvKiB3ZSBjYW4ganVzdCBwcmV0ZW5kIHRvIHNlbmQgMHgyMDAwIGJ5dGVzIG9mIG5vdGhpbmcgaW4gdGhlIGhlYWRlcnMgKi8KLQllcnIgPSBwNTR1X2J1bGtfbXNnKHByaXYsIFA1NFVfUElQRV9EQVRBLCBidWYsCi0JCQkgICAgRUVQUk9NX1JFQURCQUNLX0xFTiArIHByaXYtPmNvbW1vbi50eF9oZHJfbGVuKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHJpc201NHVzYjogZWVwcm9tIHJlcSBzZW5kIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQllcnIgPSB1c2JfYnVsa19tc2cocHJpdi0+dWRldiwKLQkJCSAgIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCBQNTRVX1BJUEVfREFUQSksCi0JCQkgICBidWYsIDB4MjAyMCwgJmFsZW4sIDEwMDApOwotCWlmICghZXJyICYmIGFsZW4gPiBvZmZzZXQpIHsKLQkJcDU0X3BhcnNlX2VlcHJvbShkZXYsICh1OCAqKWJ1ZiArIG9mZnNldCwgYWxlbiAtIG9mZnNldCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0dXNiOiBlZXByb20gcmVhZCBmYWlsZWQhXG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBmYWlsOwotCX0KLQotIGZhaWw6Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IHA1NHVfdXBsb2FkX2Zpcm13YXJlXzM4ODcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQogewogCXN0YXRpYyBjaGFyIHN0YXJ0X3N0cmluZ1tdID0gIn5+fn48XHIiOwpAQCAtNDEyLDcgKzM5Myw5IEBACiAJCWdvdG8gZXJyX3JlcV9md19mYWlsZWQ7CiAJfQogCi0JcDU0X3BhcnNlX2Zpcm13YXJlKGRldiwgZndfZW50cnkpOworCWVyciA9IHA1NF9wYXJzZV9maXJtd2FyZShkZXYsIGZ3X2VudHJ5KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91cGxvYWRfZmFpbGVkOwogCiAJbGVmdCA9IGJsb2NrX3NpemUgPSBtaW4oKHNpemVfdClQNTRVX0ZXX0JMT0NLLCBmd19lbnRyeS0+c2l6ZSk7CiAJc3RyY3B5KGJ1Ziwgc3RhcnRfc3RyaW5nKTsKQEAgLTQ1OCw3ICs0NDEsNyBAQAogCiAJCWVyciA9IHA1NHVfYnVsa19tc2cocHJpdiwgUDU0VV9QSVBFX0RBVEEsIGJ1ZiwgYmxvY2tfc2l6ZSk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicHJpc201NHVzYjogZmlybXdhcmUgdXBsb2FkIGZhaWxlZCFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwNTR1c2I6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWQhXG4iKTsKIAkJCWdvdG8gZXJyX3VwbG9hZF9mYWlsZWQ7CiAJCX0KIApAQCAtNDY5LDcgKzQ1Miw3IEBACiAJKigoX19sZTMyICopYnVmKSA9IGNwdV90b19sZTMyKH5jcmMzMl9sZSh+MCwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKSk7CiAJZXJyID0gcDU0dV9idWxrX21zZyhwcml2LCBQNTRVX1BJUEVfREFUQSwgYnVmLCBzaXplb2YodTMyKSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInByaXNtNTR1c2I6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWQhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJwNTR1c2I6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWQhXG4iKTsKIAkJZ290byBlcnJfdXBsb2FkX2ZhaWxlZDsKIAl9CiAKQEAgLTQ4MCwxMyArNDYzLDEzIEBACiAJCQlicmVhazsKIAogCQlpZiAoYWxlbiA+IDUgJiYgIW1lbWNtcChidWYsICJFUlJPUiIsIDUpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJwcmlzbTU0dXNiOiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkIVxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJwNTR1c2I6IGZpcm13YXJlIHVwbG9hZCBmYWlsZWQhXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQogCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInByaXNtNTR1c2I6IGZpcm13YXJlIGJvb3QgdGltZWQgb3V0IVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgInA1NHVzYjogZmlybXdhcmUgYm9vdCB0aW1lZCBvdXQhXG4iKTsKIAkJCWVyciA9IC1FVElNRURPVVQ7CiAJCQlicmVhazsKIAkJfQpAQCAtNDk4LDcgKzQ4MSw3IEBACiAJYnVmWzFdID0gJ1xyJzsKIAllcnIgPSBwNTR1X2J1bGtfbXNnKHByaXYsIFA1NFVfUElQRV9EQVRBLCBidWYsIDIpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0dXNiOiBmaXJtd2FyZSBib290IGZhaWxlZCFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInA1NHVzYjogZmlybXdhcmUgYm9vdCBmYWlsZWQhXG4iKTsKIAkJZ290byBlcnJfdXBsb2FkX2ZhaWxlZDsKIAl9CiAKQEAgLTU0OSw3ICs1MzIsMTIgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlwNTRfcGFyc2VfZmlybXdhcmUoZGV2LCBmd19lbnRyeSk7CisJZXJyID0gcDU0X3BhcnNlX2Zpcm13YXJlKGRldiwgZndfZW50cnkpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCXJldHVybiBlcnI7CisJfQogCiAjZGVmaW5lIFA1NFVfV1JJVEUodHlwZSwgYWRkciwgZGF0YSkgXAogCWRvIHtcCkBAIC02NjAsNyArNjQ4LDcgQEAKIAogCQllcnIgPSBwNTR1X2J1bGtfbXNnKHByaXYsIFA1NFVfUElQRV9EQVRBLCBidWYsIGJsb2NrX2xlbik7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicHJpc201NHVzYjogZmlybXdhcmUgYmxvY2sgdXBsb2FkICIKKwkJCXByaW50ayhLRVJOX0VSUiAicDU0dXNiOiBmaXJtd2FyZSBibG9jayB1cGxvYWQgIgogCQkJICAgICAgICJmYWlsZWRcbiIpOwogCQkJZ290byBmYWlsOwogCQl9CkBAIC02OTQsNyArNjgyLDcgQEAKIAkJCSAgMHgwMDJDIHwgKHVuc2lnbmVkIGxvbmcpJmRldnJlZy0+ZGlyZWN0X21lbV93aW4pOwogCQlpZiAoIShyZWcgJiBjcHVfdG9fbGUzMihJU0wzOFhYX0RNQV9TVEFUVVNfRE9ORSkpIHx8CiAJCSAgICAhKHJlZyAmIGNwdV90b19sZTMyKElTTDM4WFhfRE1BX1NUQVRVU19SRUFEWSkpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInByaXNtNTR1c2I6IGZpcm13YXJlIERNQSB0cmFuc2ZlciAiCisJCQlwcmludGsoS0VSTl9FUlIgInA1NHVzYjogZmlybXdhcmUgRE1BIHRyYW5zZmVyICIKIAkJCSAgICAgICAiZmFpbGVkXG4iKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtODAyLDcgKzc5MCw3IEBACiAKIAlkZXYgPSBwNTRfaW5pdF9jb21tb24oc2l6ZW9mKCpwcml2KSk7CiAJaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0dXNiOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJwNTR1c2I6IGllZWU4MDIxMSBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTgzMyw0OSArODIxLDQwIEBACiAJCX0KIAl9CiAJcHJpdi0+Y29tbW9uLm9wZW4gPSBwNTR1X29wZW47Ci0KKwlwcml2LT5jb21tb24uc3RvcCA9IHA1NHVfc3RvcDsKIAlpZiAocmVjb2duaXplZF9waXBlcyA8IFA1NFVfUElQRV9OVU1CRVIpIHsKIAkJcHJpdi0+aHdfdHlwZSA9IFA1NFVfMzg4NzsKLQkJcHJpdi0+Y29tbW9uLnR4ID0gcDU0dV90eF8zODg3OworCQllcnIgPSBwNTR1X3VwbG9hZF9maXJtd2FyZV8zODg3KGRldik7CisJCWlmIChwcml2LT5jb21tb24uZndfaW50ZXJmYWNlID09IEZXX0xNODcpIHsKKwkJCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gKz0gc2l6ZW9mKHN0cnVjdCBsbTg3X3R4X2hkcik7CisJCQlwcml2LT5jb21tb24udHhfaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgbG04N190eF9oZHIpOworCQkJcHJpdi0+Y29tbW9uLnR4ID0gcDU0dV90eF9sbTg3OworCQl9IGVsc2UKKwkJCXByaXYtPmNvbW1vbi50eCA9IHA1NHVfdHhfMzg4NzsKIAl9IGVsc2UgeworCQlwcml2LT5od190eXBlID0gUDU0VV9ORVQyMjgwOwogCQlkZXYtPmV4dHJhX3R4X2hlYWRyb29tICs9IHNpemVvZihzdHJ1Y3QgbmV0MjI4MF90eF9oZHIpOwogCQlwcml2LT5jb21tb24udHhfaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgbmV0MjI4MF90eF9oZHIpOwogCQlwcml2LT5jb21tb24udHggPSBwNTR1X3R4X25ldDIyODA7Ci0JfQotCXByaXYtPmNvbW1vbi5zdG9wID0gcDU0dV9zdG9wOwotCi0JaWYgKHByaXYtPmh3X3R5cGUpCi0JCWVyciA9IHA1NHVfdXBsb2FkX2Zpcm13YXJlXzM4ODcoZGV2KTsKLQllbHNlCiAJCWVyciA9IHA1NHVfdXBsb2FkX2Zpcm13YXJlX25ldDIyODAoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX2RldjsKLQotCWVyciA9IHA1NHVfcmVhZF9lZXByb20oZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX2RldjsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPndpcGh5LT5wZXJtX2FkZHIpKSB7Ci0JCXU4IHBlcm1fYWRkcltFVEhfQUxFTl07Ci0KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHJpc201NHVzYjogSW52YWxpZCBod2FkZHIhIFVzaW5nIHJhbmRvbWx5IGdlbmVyYXRlZCBNQUMgYWRkclxuIik7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKHBlcm1fYWRkcik7Ci0JCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGRldiwgcGVybV9hZGRyKTsKIAl9CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CiAKKwlwNTR1X29wZW4oZGV2KTsKKwllcnIgPSBwNTRfcmVhZF9lZXByb20oZGV2KTsKKwlwNTR1X3N0b3AoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKwogCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0dXNiOiBDYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJwNTR1c2I6IENhbm5vdCByZWdpc3RlciBuZXRkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogaHdhZGRyICVzLCBpc2wzOCUwMnhcbiIsCi0JICAgICAgIHdpcGh5X25hbWUoZGV2LT53aXBoeSksCi0JICAgICAgIHByaW50X21hYyhtYWMsIGRldi0+d2lwaHktPnBlcm1fYWRkciksCi0JICAgICAgIHByaXYtPmNvbW1vbi52ZXJzaW9uKTsKLQogCXJldHVybiAwOwogCiAgZXJyX2ZyZWVfZGV2OgpAQCAtOTAyLDcgKzg4MSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwNTR1X2RyaXZlciA9IHsKLQkubmFtZQk9ICJwcmlzbTU0dXNiIiwKKwkubmFtZQk9ICJwNTR1c2IiLAogCS5pZF90YWJsZSA9IHA1NHVfdGFibGUsCiAJLnByb2JlID0gcDU0dV9wcm9iZSwKIAkuZGlzY29ubmVjdCA9IHA1NHVfZGlzY29ubmVjdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuaAppbmRleCBkMTg5NmIzLi41YjhmZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBQUklTTTU0VVNCX0gKLSNkZWZpbmUgUFJJU001NFVTQl9ICisjaWZuZGVmIFA1NFVTQl9ICisjZGVmaW5lIFA1NFVTQl9ICiAKIC8qCiAgKiBEZWZpbmVzIGZvciBVU0IgYmFzZWQgbWFjODAyMTEgUHJpc201NCBkcml2ZXIKQEAgLTcyLDYgKzcyLDExIEBACiAJdTggcGFkZGluZ1s4XTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBsbTg3X3R4X2hkciB7CisJX19sZTMyIGRldmljZV9hZGRyOworCV9fbGUzMiBjaGtzdW07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCiAvKiBTb21lIGZsYWdzIGZvciB0aGUgaXNsIGhhcmR3YXJlIHJlZ2lzdGVycyBjb250cm9sbGluZyBETUEgaW5zaWRlIHRoZQogICogY2hpcCAqLwogI2RlZmluZSBJU0wzOFhYX0RNQV9TVEFUVVNfRE9ORQkJCTB4MDAwMDAwMDEKQEAgLTEzMCw0ICsxMzUsNCBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfcXVldWU7CiB9OwogCi0jZW5kaWYgLyogUFJJU001NFVTQl9IICovCisjZW5kaWYgLyogUDU0VVNCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IDNkNzVhNzEuLjE2ZTY4ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwpAQCAtNzEsNyArNzEsNyBAQAogCWlmIChpd19tb2RlID09IElXX01PREVfUkVQRUFUIHx8IGl3X21vZGUgPT0gSVdfTU9ERV9TRUNPTkQpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcKIAkJICAgICAgICIlcygpOiBTb3JyeSwgUmVwZWF0ZXIgbW9kZSBhbmQgU2Vjb25kYXJ5IG1vZGUgIgotCQkgICAgICAgImFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCSAgICAgICAiYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMzMyw3ICszMzMsNyBAQAogCWlmICgqdXdycSA+IElXX01PREVfTU9OSVRPUiB8fCAqdXdycSA8IElXX01PREVfQVVUTykgewogCQlwcmludGsoS0VSTl9ERUJVRwogCQkgICAgICAgIiVzOiAlcygpIFlvdSBwYXNzZWQgYSBub24tdmFsaWQgaW5pdF9tb2RlLlxuIiwKLQkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTIzNCw3ICsxMjM0LDcgQEAKIAkJLyogZG9uJ3Qga25vdyBob3cgdG8gZGlzYWJsZSByYWRpbyAqLwogCQlwcmludGsoS0VSTl9ERUJVRwogCQkgICAgICAgIiVzOiAlcygpIGRpc2FibGluZyByYWRpbyBpcyBub3QgeWV0IHN1cHBvcnRlZC5cbiIsCi0JCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0gZWxzZSBpZiAodndycS0+Zml4ZWQpCiAJCS8qIGN1cnJlbnRseSBvbmx5IGZpeGVkIHZhbHVlIGlzIHN1cHBvcnRlZCAqLwpAQCAtMTI0Miw3ICsxMjQyLDcgQEAKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcKIAkJICAgICAgICIlczogJXMoKSBhdXRvIHBvd2VyIHdpbGwgYmUgaW1wbGVtZW50ZWQgbGF0ZXIuXG4iLAotCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDk2Mzk2MGQuLjE0MDRhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICBwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSA1OwogCiAgICAgLyogSW50ZXJydXB0IHNldHVwLiBGb3IgUENNQ0lBLCBkcml2ZXIgdGFrZXMgd2hhdCdzIGdpdmVuICovCi0gICAgcF9kZXYtPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIHBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORyB8IElSUV9IQU5ETEVfUFJFU0VOVDsKICAgICBwX2Rldi0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogICAgIHBfZGV2LT5pcnEuSGFuZGxlciA9ICZyYXlfaW50ZXJydXB0OwogCkBAIC03OTgsOSArNzk4LDkgQEAKICAgICBpb3VubWFwKGxvY2FsLT5hbWVtKTsKICAgICAvKiBEbyBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCiAgICAgaSA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsb2NhbC0+YW1lbV9oYW5kbGUpOwotICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZVdpbmRvdyhsb2NhbC0+YW1lbSkgcmV0ID0gJXhcbiIsaSk7CisgICAgaWYgKCBpICE9IDAgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5hbWVtKSByZXQgPSAleFxuIixpKTsKICAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5ybWVtX2hhbmRsZSk7Ci0gICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5ybWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpZiAoIGkgIT0gMCApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobG9jYWwtPnJtZW0pIHJldCA9ICV4XG4iLGkpOwogICAgIHBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKIAogICAgIERFQlVHKDIsInJheV9yZWxlYXNlIGVuZGluZ1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKaW5kZXggMDBlOTY1Yi4uMmI0MTQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwpAQCAtMTYyNyw3ICsxNjI3LDYgQEAKIHN0YXRpYyBpbnQgcm5kaXNfaXdfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwogCXN0cnVjdCB1c2JuZXQgKnVzYmRldiA9IGRldi0+cHJpdjsKIAl1bmlvbiBpd3JlcV9kYXRhIGV2dDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKQEAgLTE2MzUsNyArMTYzNCw3IEBACiAKIAlkZXZkYmcodXNiZGV2LCAiU0lPQ1NJV1NDQU4iKTsKIAotCWlmIChwYXJhbS0+ZmxhZ3MgPT0gMCkgeworCWlmICh3cnF1LT5kYXRhLmZsYWdzID09IDApIHsKIAkJdG1wID0gY2NwdTIoMSk7CiAJCXJldCA9IHJuZGlzX3NldF9vaWQodXNiZGV2LCBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgJnRtcCwKIAkJCQkJCQkJc2l6ZW9mKHRtcCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwppbmRleCBkNDg1YTg2Li5mODM5Y2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKLWNvbmZpZyBSVDJYMDAKLQl0cmlzdGF0ZSAiUmFsaW5rIGRyaXZlciBzdXBwb3J0IgorbWVudWNvbmZpZyBSVDJYMDAKKwlib29sICJSYWxpbmsgZHJpdmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOXzgwMjExICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgd2lsbCBlbmFibGUgdGhlIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgUmFsaW5rIGRyaXZlcnMsCkBAIC0xNywzMSArMTcsNiBAQAogCiBpZiBSVDJYMDAKIAotY29uZmlnIFJUMlgwMF9MSUIKLQl0cmlzdGF0ZQotCi1jb25maWcgUlQyWDAwX0xJQl9QQ0kKLQl0cmlzdGF0ZQotCXNlbGVjdCBSVDJYMDBfTElCCi0KLWNvbmZpZyBSVDJYMDBfTElCX1VTQgotCXRyaXN0YXRlCi0Jc2VsZWN0IFJUMlgwMF9MSUIKLQotY29uZmlnIFJUMlgwMF9MSUJfRklSTVdBUkUKLQlib29sZWFuCi0JZGVwZW5kcyBvbiBSVDJYMDBfTElCCi0Jc2VsZWN0IEZXX0xPQURFUgotCi1jb25maWcgUlQyWDAwX0xJQl9SRktJTEwKLQlib29sZWFuCi0JZGVwZW5kcyBvbiBSVDJYMDBfTElCCi0Jc2VsZWN0IFJGS0lMTAotCi1jb25maWcgUlQyWDAwX0xJQl9MRURTCi0JYm9vbGVhbgotCWRlcGVuZHMgb24gUlQyWDAwX0xJQiAmJiBORVdfTEVEUwotCiBjb25maWcgUlQyNDAwUENJCiAJdHJpc3RhdGUgIlJhbGluayBydDI0MDAgKFBDSS9QQ01DSUEpIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKQEAgLTUzLDIzICsyOCw2IEBACiAKIAkgIFdoZW4gY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoaXMgZHJpdmVyIHdpbGwgYmUgY2FsbGVkICJydDI0MDBwY2kua28iLgogCi1jb25maWcgUlQyNDAwUENJX1JGS0lMTAotCWJvb2wgIlJhbGluayBydDI0MDAgcmZraWxsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBSVDI0MDBQQ0kKLQlzZWxlY3QgUlQyWDAwX0xJQl9SRktJTEwKLQktLS1oZWxwLS0tCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgaW50ZWdyYXRlZCBydDI0MDAgaGFyZHdhcmUgdGhhdCBmZWF0dXJlcyBhCi0JICBoYXJkd2FyZSBidXR0b24gdG8gY29udHJvbCB0aGUgcmFkaW8gc3RhdGUuCi0JICBUaGlzIGZlYXR1cmUgZGVwZW5kcyBvbiB0aGUgUkYgc3dpdGNoIHN1YnN5c3RlbSByZmtpbGwuCi0KLWNvbmZpZyBSVDI0MDBQQ0lfTEVEUwotCWJvb2wgIlJhbGluayBydDI0MDAgbGVkcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUlQyNDAwUENJICYmIE5FV19MRURTCi0Jc2VsZWN0IExFRFNfQ0xBU1MKLQlzZWxlY3QgUlQyWDAwX0xJQl9MRURTCi0JLS0taGVscC0tLQotCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGxlZCB0cmlnZ2VycyBwcm92aWRlZCBteSBtYWM4MDIxMS4KLQogY29uZmlnIFJUMjUwMFBDSQogCXRyaXN0YXRlICJSYWxpbmsgcnQyNTAwIChQQ0kvUENNQ0lBKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCkBAIC04MSwyOCArMzksMTIgQEAKIAogCSAgV2hlbiBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhpcyBkcml2ZXIgd2lsbCBiZSBjYWxsZWQgInJ0MjUwMHBjaS5rbyIuCiAKLWNvbmZpZyBSVDI1MDBQQ0lfUkZLSUxMCi0JYm9vbCAiUmFsaW5rIHJ0MjUwMCByZmtpbGwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFJUMjUwMFBDSQotCXNlbGVjdCBSVDJYMDBfTElCX1JGS0lMTAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBpbnRlZ3JhdGVkIHJ0MjUwMCBoYXJkd2FyZSB0aGF0IGZlYXR1cmVzIGEKLQkgIGhhcmR3YXJlIGJ1dHRvbiB0byBjb250cm9sIHRoZSByYWRpbyBzdGF0ZS4KLQkgIFRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIHRoZSBSRiBzd2l0Y2ggc3Vic3lzdGVtIHJma2lsbC4KLQotY29uZmlnIFJUMjUwMFBDSV9MRURTCi0JYm9vbCAiUmFsaW5rIHJ0MjUwMCBsZWRzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBSVDI1MDBQQ0kgJiYgTkVXX0xFRFMKLQlzZWxlY3QgTEVEU19DTEFTUwotCXNlbGVjdCBSVDJYMDBfTElCX0xFRFMKLQktLS1oZWxwLS0tCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgbGVkIHRyaWdnZXJzIHByb3ZpZGVkIG15IG1hYzgwMjExLgotCiBjb25maWcgUlQ2MVBDSQogCXRyaXN0YXRlICJSYWxpbmsgcnQyNTAxL3J0NjEgKFBDSS9QQ01DSUEpIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgUlQyWDAwX0xJQl9QQ0kKIAlzZWxlY3QgUlQyWDAwX0xJQl9GSVJNV0FSRQorCXNlbGVjdCBSVDJYMDBfTElCX0NSWVBUTwogCXNlbGVjdCBDUkNfSVRVX1QKIAlzZWxlY3QgRUVQUk9NXzkzQ1g2CiAJLS0taGVscC0tLQpAQCAtMTExLDIzICs1Myw2IEBACiAKIAkgIFdoZW4gY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoaXMgZHJpdmVyIHdpbGwgYmUgY2FsbGVkICJydDYxcGNpLmtvIi4KIAotY29uZmlnIFJUNjFQQ0lfUkZLSUxMCi0JYm9vbCAiUmFsaW5rIHJ0MjUwMS9ydDYxIHJma2lsbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUlQ2MVBDSQotCXNlbGVjdCBSVDJYMDBfTElCX1JGS0lMTAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBpbnRlZ3JhdGVkIHJ0NjEgaGFyZHdhcmUgdGhhdCBmZWF0dXJlcyBhCi0JICBoYXJkd2FyZSBidXR0b24gdG8gY29udHJvbCB0aGUgcmFkaW8gc3RhdGUuCi0JICBUaGlzIGZlYXR1cmUgZGVwZW5kcyBvbiB0aGUgUkYgc3dpdGNoIHN1YnN5c3RlbSByZmtpbGwuCi0KLWNvbmZpZyBSVDYxUENJX0xFRFMKLQlib29sICJSYWxpbmsgcnQyNTAxL3J0NjEgbGVkcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUlQ2MVBDSSAmJiBORVdfTEVEUwotCXNlbGVjdCBMRURTX0NMQVNTCi0Jc2VsZWN0IFJUMlgwMF9MSUJfTEVEUwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBsZWQgdHJpZ2dlcnMgcHJvdmlkZWQgbXkgbWFjODAyMTEuCi0KIGNvbmZpZyBSVDI1MDBVU0IKIAl0cmlzdGF0ZSAiUmFsaW5rIHJ0MjUwMCAoVVNCKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCCkBAIC0xMzgsMTkgKzYzLDEyIEBACiAKIAkgIFdoZW4gY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoaXMgZHJpdmVyIHdpbGwgYmUgY2FsbGVkICJydDI1MDB1c2Iua28iLgogCi1jb25maWcgUlQyNTAwVVNCX0xFRFMKLQlib29sICJSYWxpbmsgcnQyNTAwIGxlZHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFJUMjUwMFVTQiAmJiBORVdfTEVEUwotCXNlbGVjdCBMRURTX0NMQVNTCi0Jc2VsZWN0IFJUMlgwMF9MSUJfTEVEUwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBsZWQgdHJpZ2dlcnMgcHJvdmlkZWQgbXkgbWFjODAyMTEuCi0KIGNvbmZpZyBSVDczVVNCCiAJdHJpc3RhdGUgIlJhbGluayBydDI1MDEvcnQ3MyAoVVNCKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCCiAJc2VsZWN0IFJUMlgwMF9MSUJfVVNCCiAJc2VsZWN0IFJUMlgwMF9MSUJfRklSTVdBUkUKKwlzZWxlY3QgUlQyWDAwX0xJQl9DUllQVE8KIAlzZWxlY3QgQ1JDX0lUVV9UCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHJ0MjUwMSB3aXJlbGVzcyBjaGlwc2V0IGZhbWlseS4KQEAgLTE1OCwxMyArNzYsMzcgQEAKIAogCSAgV2hlbiBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhpcyBkcml2ZXIgd2lsbCBiZSBjYWxsZWQgInJ0NzN1c2Iua28iLgogCi1jb25maWcgUlQ3M1VTQl9MRURTCi0JYm9vbCAiUmFsaW5rIHJ0MjUwMS9ydDczIGxlZHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFJUNzNVU0IgJiYgTkVXX0xFRFMKLQlzZWxlY3QgTEVEU19DTEFTUwotCXNlbGVjdCBSVDJYMDBfTElCX0xFRFMKLQktLS1oZWxwLS0tCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgbGVkIHRyaWdnZXJzIHByb3ZpZGVkIG15IG1hYzgwMjExLgorY29uZmlnIFJUMlgwMF9MSUJfUENJCisJdHJpc3RhdGUKKwlzZWxlY3QgUlQyWDAwX0xJQgorCitjb25maWcgUlQyWDAwX0xJQl9VU0IKKwl0cmlzdGF0ZQorCXNlbGVjdCBSVDJYMDBfTElCCisKK2NvbmZpZyBSVDJYMDBfTElCCisJdHJpc3RhdGUKKworY29uZmlnIFJUMlgwMF9MSUJfRklSTVdBUkUKKwlib29sZWFuCisJc2VsZWN0IEZXX0xPQURFUgorCitjb25maWcgUlQyWDAwX0xJQl9DUllQVE8KKwlib29sZWFuCisKK2NvbmZpZyBSVDJYMDBfTElCX1JGS0lMTAorCWJvb2xlYW4KKwlkZWZhdWx0IHkgaWYgKFJUMlgwMF9MSUI9eSAmJiBSRktJTEw9eSkgfHwgKFJUMlgwMF9MSUI9bSAmJiBSRktJTEwhPW4pCisKK2NvbW1lbnQgInJ0MngwMCByZmtpbGwgc3VwcG9ydCBkaXNhYmxlZCBkdWUgdG8gbW9kdWxhcml6ZWQgUkZLSUxMIGFuZCBidWlsdC1pbiBydDJ4MDAiCisJZGVwZW5kcyBvbiBSVDJYMDBfTElCPXkgJiYgUkZLSUxMPW0KKworY29uZmlnIFJUMlgwMF9MSUJfTEVEUworCWJvb2xlYW4KKwlkZWZhdWx0IHkgaWYgKFJUMlgwMF9MSUI9eSAmJiBMRURTX0NMQVNTPXkpIHx8IChSVDJYMDBfTElCPW0gJiYgTEVEU19DTEFTUyE9bikKKworY29tbWVudCAicnQyeDAwIGxlZHMgc3VwcG9ydCBkaXNhYmxlZCBkdWUgdG8gbW9kdWxhcml6ZWQgTEVEU19DTEFTUyBhbmQgYnVpbHQtaW4gcnQyeDAwIgorCWRlcGVuZHMgb24gUlQyWDAwX0xJQj15ICYmIExFRFNfQ0xBU1M9bQogCiBjb25maWcgUlQyWDAwX0xJQl9ERUJVR0ZTCiAJYm9vbCAiUmFsaW5rIGRlYnVnZnMgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9NYWtlZmlsZQppbmRleCAxMDg3ZGJjLi45MTdjYjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL01ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogcnQyeDAwbGliLXkJCQkJKz0gcnQyeDAwY29uZmlnLm8KIHJ0MngwMGxpYi15CQkJCSs9IHJ0MngwMHF1ZXVlLm8KIHJ0MngwMGxpYi0kKENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMpCSs9IHJ0MngwMGRlYnVnLm8KK3J0MngwMGxpYi0kKENPTkZJR19SVDJYMDBfTElCX0NSWVBUTykJKz0gcnQyeDAwY3J5cHRvLm8KIHJ0MngwMGxpYi0kKENPTkZJR19SVDJYMDBfTElCX1JGS0lMTCkJKz0gcnQyeDAwcmZraWxsLm8KIHJ0MngwMGxpYi0kKENPTkZJR19SVDJYMDBfTElCX0ZJUk1XQVJFKQkrPSBydDJ4MDBmaXJtd2FyZS5vCiBydDJ4MDBsaWItJChDT05GSUdfUlQyWDAwX0xJQl9MRURTKQkrPSBydDJ4MDBsZWRzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuYwppbmRleCA0YzA1MzhkLi4wOGNiOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5jCkBAIC0yMzEsNyArMjMxLDcgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfREVCVUdGUyAqLwogCi0jaWZkZWYgQ09ORklHX1JUMjQwMFBDSV9SRktJTEwKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwKIHN0YXRpYyBpbnQgcnQyNDAwcGNpX3Jma2lsbF9wb2xsKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJdTMyIHJlZzsKQEAgLTI0MSw5ICsyNDEsOSBAQAogfQogI2Vsc2UKICNkZWZpbmUgcnQyNDAwcGNpX3Jma2lsbF9wb2xsCU5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUlQyNDAwUENJX1JGS0lMTCAqLworI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX1JGS0lMTCAqLwogCi0jaWZkZWYgQ09ORklHX1JUMjQwMFBDSV9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogc3RhdGljIHZvaWQgcnQyNDAwcGNpX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQogewpAQCAtMjg4LDcgKzI4OCw3IEBACiAJbGVkLT5sZWRfZGV2LmJsaW5rX3NldCA9IHJ0MjQwMHBjaV9ibGlua19zZXQ7CiAJbGVkLT5mbGFncyA9IExFRF9JTklUSUFMSVpFRDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQyNDAwUENJX0xFRFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9MRURTICovCiAKIC8qCiAgKiBDb25maWd1cmF0aW9uIGhhbmRsZXJzLgpAQCAtMTI0MSw3ICsxMjQxLDcgQEAKIAlpZiAoIXJlZykKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJLyoKQEAgLTEzNzQsMjIgKzEzNzQsMjIgQEAKIAkvKgogCSAqIFN0b3JlIGxlZCBtb2RlLCBmb3IgY29ycmVjdCBsZWQgYmVoYXZpb3VyLgogCSAqLwotI2lmZGVmIENPTkZJR19SVDI0MDBQQ0lfTEVEUworI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0xFRFMKIAl2YWx1ZSA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9BTlRFTk5BX0xFRF9NT0RFKTsKIAogCXJ0MjQwMHBjaV9pbml0X2xlZChydDJ4MDBkZXYsICZydDJ4MDBkZXYtPmxlZF9yYWRpbywgTEVEX1RZUEVfUkFESU8pOwogCWlmICh2YWx1ZSA9PSBMRURfTU9ERV9UWFJYX0FDVElWSVRZKQogCQlydDI0MDBwY2lfaW5pdF9sZWQocnQyeDAwZGV2LCAmcnQyeDAwZGV2LT5sZWRfcXVhbCwKIAkJCQkgICBMRURfVFlQRV9BQ1RJVklUWSk7Ci0jZW5kaWYgLyogQ09ORklHX1JUMjQwMFBDSV9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiAJLyoKIAkgKiBEZXRlY3QgaWYgdGhpcyBkZXZpY2UgaGFzIGFuIGhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8uCiAJICovCi0jaWZkZWYgQ09ORklHX1JUMjQwMFBDSV9SRktJTEwKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwKIAlpZiAocnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX0FOVEVOTkFfSEFSRFdBUkVfUkFESU8pKQogCQlfX3NldF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQlVUVE9OLCAmcnQyeDAwZGV2LT5mbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX1JUMjQwMFBDSV9SRktJTEwgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwgKi8KIAogCS8qCiAJICogQ2hlY2sgaWYgdGhlIEJCUCB0dW5pbmcgc2hvdWxkIGJlIGVuYWJsZWQuCkBAIC0xNDA0LDcgKzE0MDQsNyBAQAogICogUkYgdmFsdWUgbGlzdCBmb3IgUkYyNDIwICYgUkYyNDIxCiAgKiBTdXBwb3J0czogMi40IEdIegogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJmX2NoYW5uZWwgcmZfdmFsc19iZ1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCByZl9jaGFubmVsIHJmX3ZhbHNfYltdID0gewogCXsgMSwgIDB4MDAwMjIwNTgsIDB4MDAwYzFmZGEsIDB4MDAwMDAxMDEsIDAgfSwKIAl7IDIsICAweDAwMDIyMDU4LCAweDAwMGMxZmVlLCAweDAwMDAwMTAxLCAwIH0sCiAJeyAzLCAgMHgwMDAyMjA1OCwgMHgwMDBjMjAwMiwgMHgwMDAwMDEwMSwgMCB9LApAQCAtMTQyMSwxMCArMTQyMSwxMSBAQAogCXsgMTQsIDB4MDAwMjIwNTgsIDB4MDAwYzIwZmEsIDB4MDAwMDAxMDEsIDAgfSwKIH07CiAKLXN0YXRpYyB2b2lkIHJ0MjQwMHBjaV9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCitzdGF0aWMgaW50IHJ0MjQwMHBjaV9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJc3RydWN0IGh3X21vZGVfc3BlYyAqc3BlYyA9ICZydDJ4MDBkZXYtPnNwZWM7Ci0JdTggKnR4cG93ZXI7CisJc3RydWN0IGNoYW5uZWxfaW5mbyAqaW5mbzsKKwljaGFyICp0eF9wb3dlcjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qCkBAIC0xNDQwLDIzICsxNDQxLDI4IEBACiAJCQkJCQkgICBFRVBST01fTUFDX0FERFJfMCkpOwogCiAJLyoKLQkgKiBDb252ZXJ0IHR4X3Bvd2VyIGFycmF5IGluIGVlcHJvbS4KLQkgKi8KLQl0eHBvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfU1RBUlQpOwotCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQl0eHBvd2VyW2ldID0gVFhQT1dFUl9GUk9NX0RFVih0eHBvd2VyW2ldKTsKLQotCS8qCiAJICogSW5pdGlhbGl6ZSBod19tb2RlIGluZm9ybWF0aW9uLgogCSAqLwogCXNwZWMtPnN1cHBvcnRlZF9iYW5kcyA9IFNVUFBPUlRfQkFORF8yR0haOwogCXNwZWMtPnN1cHBvcnRlZF9yYXRlcyA9IFNVUFBPUlRfUkFURV9DQ0s7Ci0Jc3BlYy0+dHhfcG93ZXJfYSA9IE5VTEw7Ci0Jc3BlYy0+dHhfcG93ZXJfYmcgPSB0eHBvd2VyOwotCXNwZWMtPnR4X3Bvd2VyX2RlZmF1bHQgPSBERUZBVUxUX1RYUE9XRVI7CiAKLQlzcGVjLT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHJmX3ZhbHNfYmcpOwotCXNwZWMtPmNoYW5uZWxzID0gcmZfdmFsc19iZzsKKwlzcGVjLT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHJmX3ZhbHNfYik7CisJc3BlYy0+Y2hhbm5lbHMgPSByZl92YWxzX2I7CisKKwkvKgorCSAqIENyZWF0ZSBjaGFubmVsIGluZm9ybWF0aW9uIGFycmF5CisJICovCisJaW5mbyA9IGt6YWxsb2Moc3BlYy0+bnVtX2NoYW5uZWxzICogc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwZWMtPmNoYW5uZWxzX2luZm8gPSBpbmZvOworCisJdHhfcG93ZXIgPSBydDJ4MDBfZWVwcm9tX2FkZHIocnQyeDAwZGV2LCBFRVBST01fVFhQT1dFUl9TVEFSVCk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWluZm9baV0udHhfcG93ZXIxID0gVFhQT1dFUl9GUk9NX0RFVih0eF9wb3dlcltpXSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBydDI0MDBwY2lfcHJvYmVfaHcoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKQEAgLTE0NzcsNyArMTQ4Myw5IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIGh3IHNwZWNpZmljYXRpb25zLgogCSAqLwotCXJ0MjQwMHBjaV9wcm9iZV9od19tb2RlKHJ0MngwMGRldik7CisJcmV0dmFsID0gcnQyNDAwcGNpX3Byb2JlX2h3X21vZGUocnQyeDAwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCiAJLyoKIAkgKiBUaGlzIGRldmljZSByZXF1aXJlcyB0aGUgYXRpbSBxdWV1ZSBhbmQgRE1BLW1hcHBlZCBza2JzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjQwMHBjaS5oCmluZGV4IGJjNTU2NDIuLmJiZmYzODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI0MDBwY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNDAwcGNpLmgKQEAgLTkzOCwxOSArOTM4LDEzIEBACiAjZGVmaW5lIE1BWF9UWFBPV0VSCTYyCiAjZGVmaW5lIERFRkFVTFRfVFhQT1dFUgkzOQogCi0jZGVmaW5lIFRYUE9XRVJfRlJPTV9ERVYoX190eHBvd2VyKQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JKChfX3R4cG93ZXIpID4gTUFYX1RYUE9XRVIpID8gREVGQVVMVF9UWFBPV0VSIC0gTUlOX1RYUE9XRVIgOglcCi0JKChfX3R4cG93ZXIpIDwgTUlOX1RYUE9XRVIpID8gREVGQVVMVF9UWFBPV0VSIC0gTUlOX1RYUE9XRVIgOglcCi0JKCgoX190eHBvd2VyKSAtIE1BWF9UWFBPV0VSKSArIE1JTl9UWFBPV0VSKTsJCQlcCi19KQorI2RlZmluZSBfX0NMQU1QX1RYKF9fdHhwb3dlcikgXAorCWNsYW1wX3QoY2hhciwgKF9fdHhwb3dlciksIE1JTl9UWFBPV0VSLCBNQVhfVFhQT1dFUikKIAotI2RlZmluZSBUWFBPV0VSX1RPX0RFVihfX3R4cG93ZXIpCQkJXAotKHsJCQkJCQkJXAotCShfX3R4cG93ZXIpICs9IE1JTl9UWFBPV0VSOwkJCVwKLQkoKF9fdHhwb3dlcikgPD0gTUlOX1RYUE9XRVIpID8gTUFYX1RYUE9XRVIgOglcCi0JKCgoX190eHBvd2VyKSA+PSBNQVhfVFhQT1dFUikgPyBNSU5fVFhQT1dFUiA6CVwKLQkoTUFYX1RYUE9XRVIgLSAoKF9fdHhwb3dlcikgLSBNSU5fVFhQT1dFUikpKTsJXAotfSkKKyNkZWZpbmUgVFhQT1dFUl9GUk9NX0RFVihfX3R4cG93ZXIpIFwKKwkoKF9fQ0xBTVBfVFgoX190eHBvd2VyKSAtIE1BWF9UWFBPV0VSKSArIE1JTl9UWFBPV0VSKQorCisjZGVmaW5lIFRYUE9XRVJfVE9fREVWKF9fdHhwb3dlcikgXAorCU1BWF9UWFBPV0VSIC0gKF9fQ0xBTVBfVFgoX190eHBvd2VyKSAtIE1JTl9UWFBPV0VSKQogCiAjZW5kaWYgLyogUlQyNDAwUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuYwppbmRleCAxODFhMTQ2Li5lZjQyY2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5jCkBAIC0yMzEsNyArMjMxLDcgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfREVCVUdGUyAqLwogCi0jaWZkZWYgQ09ORklHX1JUMjUwMFBDSV9SRktJTEwKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwKIHN0YXRpYyBpbnQgcnQyNTAwcGNpX3Jma2lsbF9wb2xsKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJdTMyIHJlZzsKQEAgLTI0MSw5ICsyNDEsOSBAQAogfQogI2Vsc2UKICNkZWZpbmUgcnQyNTAwcGNpX3Jma2lsbF9wb2xsCU5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUlQyNTAwUENJX1JGS0lMTCAqLworI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX1JGS0lMTCAqLwogCi0jaWZkZWYgQ09ORklHX1JUMjUwMFBDSV9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogc3RhdGljIHZvaWQgcnQyNTAwcGNpX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQogewpAQCAtMjg4LDcgKzI4OCw3IEBACiAJbGVkLT5sZWRfZGV2LmJsaW5rX3NldCA9IHJ0MjUwMHBjaV9ibGlua19zZXQ7CiAJbGVkLT5mbGFncyA9IExFRF9JTklUSUFMSVpFRDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQyNTAwUENJX0xFRFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9MRURTICovCiAKIC8qCiAgKiBDb25maWd1cmF0aW9uIGhhbmRsZXJzLgpAQCAtMTMxNiw2ICsxMzE2LDggQEAKIAogCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZDAsIFJYRF9XMF9PRkRNKSkKIAkJcnhkZXNjLT5kZXZfZmxhZ3MgfD0gUlhET05FX1NJR05BTF9QTENQOworCWVsc2UKKwkJcnhkZXNjLT5kZXZfZmxhZ3MgfD0gUlhET05FX1NJR05BTF9CSVRSQVRFOwogCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZDAsIFJYRF9XMF9NWV9CU1MpKQogCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfTVlfQlNTOwogfQpAQCAtMTM3Nyw3ICsxMzc5LDcgQEAKIAlpZiAoIXJlZykKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJLyoKQEAgLTE1MzEsMjIgKzE1MzMsMjIgQEAKIAkvKgogCSAqIFN0b3JlIGxlZCBtb2RlLCBmb3IgY29ycmVjdCBsZWQgYmVoYXZpb3VyLgogCSAqLwotI2lmZGVmIENPTkZJR19SVDI1MDBQQ0lfTEVEUworI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0xFRFMKIAl2YWx1ZSA9IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9BTlRFTk5BX0xFRF9NT0RFKTsKIAogCXJ0MjUwMHBjaV9pbml0X2xlZChydDJ4MDBkZXYsICZydDJ4MDBkZXYtPmxlZF9yYWRpbywgTEVEX1RZUEVfUkFESU8pOwogCWlmICh2YWx1ZSA9PSBMRURfTU9ERV9UWFJYX0FDVElWSVRZKQogCQlydDI1MDBwY2lfaW5pdF9sZWQocnQyeDAwZGV2LCAmcnQyeDAwZGV2LT5sZWRfcXVhbCwKIAkJCQkgICBMRURfVFlQRV9BQ1RJVklUWSk7Ci0jZW5kaWYgLyogQ09ORklHX1JUMjUwMFBDSV9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiAJLyoKIAkgKiBEZXRlY3QgaWYgdGhpcyBkZXZpY2UgaGFzIGFuIGhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8uCiAJICovCi0jaWZkZWYgQ09ORklHX1JUMjUwMFBDSV9SRktJTEwKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwKIAlpZiAocnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX0FOVEVOTkFfSEFSRFdBUkVfUkFESU8pKQogCQlfX3NldF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQlVUVE9OLCAmcnQyeDAwZGV2LT5mbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX1JUMjUwMFBDSV9SRktJTEwgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwgKi8KIAogCS8qCiAJICogQ2hlY2sgaWYgdGhlIEJCUCB0dW5pbmcgc2hvdWxkIGJlIGVuYWJsZWQuCkBAIC0xNzIxLDEwICsxNzIzLDExIEBACiAJeyAxNjEsIDB4MDAwMjIwMjAsIDB4MDAwMDkwYmUsIDB4MDAwMDAxMDEsIDB4MDAwMDBhMDcgfSwKIH07CiAKLXN0YXRpYyB2b2lkIHJ0MjUwMHBjaV9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCitzdGF0aWMgaW50IHJ0MjUwMHBjaV9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJc3RydWN0IGh3X21vZGVfc3BlYyAqc3BlYyA9ICZydDJ4MDBkZXYtPnNwZWM7Ci0JdTggKnR4cG93ZXI7CisJc3RydWN0IGNoYW5uZWxfaW5mbyAqaW5mbzsKKwljaGFyICp0eF9wb3dlcjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qCkBAIC0xNzQxLDIwICsxNzQ0LDEwIEBACiAJCQkJCQkgICBFRVBST01fTUFDX0FERFJfMCkpOwogCiAJLyoKLQkgKiBDb252ZXJ0IHR4X3Bvd2VyIGFycmF5IGluIGVlcHJvbS4KLQkgKi8KLQl0eHBvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfU1RBUlQpOwotCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQl0eHBvd2VyW2ldID0gVFhQT1dFUl9GUk9NX0RFVih0eHBvd2VyW2ldKTsKLQotCS8qCiAJICogSW5pdGlhbGl6ZSBod19tb2RlIGluZm9ybWF0aW9uLgogCSAqLwogCXNwZWMtPnN1cHBvcnRlZF9iYW5kcyA9IFNVUFBPUlRfQkFORF8yR0haOwogCXNwZWMtPnN1cHBvcnRlZF9yYXRlcyA9IFNVUFBPUlRfUkFURV9DQ0sgfCBTVVBQT1JUX1JBVEVfT0ZETTsKLQlzcGVjLT50eF9wb3dlcl9hID0gTlVMTDsKLQlzcGVjLT50eF9wb3dlcl9iZyA9IHR4cG93ZXI7Ci0Jc3BlYy0+dHhfcG93ZXJfZGVmYXVsdCA9IERFRkFVTFRfVFhQT1dFUjsKIAogCWlmIChydDJ4MDBfcmYoJnJ0MngwMGRldi0+Y2hpcCwgUkYyNTIyKSkgewogCQlzcGVjLT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHJmX3ZhbHNfYmdfMjUyMik7CkBAIC0xNzc2LDYgKzE3NjksMjYgQEAKIAkJc3BlYy0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShyZl92YWxzXzUyMjIpOwogCQlzcGVjLT5jaGFubmVscyA9IHJmX3ZhbHNfNTIyMjsKIAl9CisKKwkvKgorCSAqIENyZWF0ZSBjaGFubmVsIGluZm9ybWF0aW9uIGFycmF5CisJICovCisJaW5mbyA9IGt6YWxsb2Moc3BlYy0+bnVtX2NoYW5uZWxzICogc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwZWMtPmNoYW5uZWxzX2luZm8gPSBpbmZvOworCisJdHhfcG93ZXIgPSBydDJ4MDBfZWVwcm9tX2FkZHIocnQyeDAwZGV2LCBFRVBST01fVFhQT1dFUl9TVEFSVCk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWluZm9baV0udHhfcG93ZXIxID0gVFhQT1dFUl9GUk9NX0RFVih0eF9wb3dlcltpXSk7CisKKwlpZiAoc3BlYy0+bnVtX2NoYW5uZWxzID4gMTQpIHsKKwkJZm9yIChpID0gMTQ7IGkgPCBzcGVjLT5udW1fY2hhbm5lbHM7IGkrKykKKwkJCWluZm9baV0udHhfcG93ZXIxID0gREVGQVVMVF9UWFBPV0VSOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJ0MjUwMHBjaV9wcm9iZV9odyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQpAQCAtMTc5Niw3ICsxODA5LDkgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgaHcgc3BlY2lmaWNhdGlvbnMuCiAJICovCi0JcnQyNTAwcGNpX3Byb2JlX2h3X21vZGUocnQyeDAwZGV2KTsKKwlyZXR2YWwgPSBydDI1MDBwY2lfcHJvYmVfaHdfbW9kZShydDJ4MDBkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CiAKIAkvKgogCSAqIFRoaXMgZGV2aWNlIHJlcXVpcmVzIHRoZSBhdGltIHF1ZXVlIGFuZCBETUEtbWFwcGVkIHNrYnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwcGNpLmgKaW5kZXggNDJmMzc2OS4uOGMyNmJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDBwY2kuaApAQCAtMTIyMywxNyArMTIyMywxMCBAQAogI2RlZmluZSBNQVhfVFhQT1dFUgkzMQogI2RlZmluZSBERUZBVUxUX1RYUE9XRVIJMjQKIAotI2RlZmluZSBUWFBPV0VSX0ZST01fREVWKF9fdHhwb3dlcikJCVwKLSh7CQkJCQkJXAotCSgoX190eHBvd2VyKSA+IE1BWF9UWFBPV0VSKSA/CQlcCi0JCURFRkFVTFRfVFhQT1dFUiA6IChfX3R4cG93ZXIpOwlcCi19KQorI2RlZmluZSBUWFBPV0VSX0ZST01fREVWKF9fdHhwb3dlcikgXAorCSgoKHU4KShfX3R4cG93ZXIpKSA+IE1BWF9UWFBPV0VSKSA/IERFRkFVTFRfVFhQT1dFUiA6IChfX3R4cG93ZXIpCiAKLSNkZWZpbmUgVFhQT1dFUl9UT19ERVYoX190eHBvd2VyKQkJCVwKLSh7CQkJCQkJCVwKLQkoKF9fdHhwb3dlcikgPD0gTUlOX1RYUE9XRVIpID8gTUlOX1RYUE9XRVIgOglcCi0JKCgoX190eHBvd2VyKSA+PSBNQVhfVFhQT1dFUikgPyBNQVhfVFhQT1dFUiA6CVwKLQkoX190eHBvd2VyKSk7CQkJCQlcCi19KQorI2RlZmluZSBUWFBPV0VSX1RPX0RFVihfX3R4cG93ZXIpIFwKKwljbGFtcF90KGNoYXIsIF9fdHhwb3dlciwgTUlOX1RYUE9XRVIsIE1BWF9UWFBPV0VSKQogCiAjZW5kaWYgLyogUlQyNTAwUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYwppbmRleCBjZDVhZjY1Li5kM2JmN2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCkBAIC0yODgsNyArMjg4LDcgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfREVCVUdGUyAqLwogCi0jaWZkZWYgQ09ORklHX1JUMjUwMFVTQl9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogc3RhdGljIHZvaWQgcnQyNTAwdXNiX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQogewpAQCAtMzMzLDcgKzMzMyw3IEBACiAJbGVkLT5sZWRfZGV2LmJsaW5rX3NldCA9IHJ0MjUwMHVzYl9ibGlua19zZXQ7CiAJbGVkLT5mbGFncyA9IExFRF9JTklUSUFMSVpFRDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQyNTAwVVNCX0xFRFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9MRURTICovCiAKIC8qCiAgKiBDb25maWd1cmF0aW9uIGhhbmRsZXJzLgpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCXJ0MjUwMHVzYl9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgVFhSWF9DU1IyMCwgJnJlZyk7CiAJCXJ0MngwMF9zZXRfZmllbGQxNigmcmVnLCBUWFJYX0NTUjIwX09GRlNFVCwgYmNuX3ByZWxvYWQgPj4gNik7CiAJCXJ0MngwMF9zZXRfZmllbGQxNigmcmVnLCBUWFJYX0NTUjIwX0JDTl9FWFBFQ1RfV0lORE9XLAotCQkJCSAgIDIgKiAoY29uZi0+dHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpKTsKKwkJCQkgICAyICogKGNvbmYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikpOwogCQlydDI1MDB1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWFJYX0NTUjIwLCByZWcpOwogCiAJCS8qCkBAIC0xMTE0LDggKzExMTQsNyBAQAogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX05FV19TRVEsCiAJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfRklSU1RfRlJBR01FTlQsICZ0eGRlc2MtPmZsYWdzKSk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfSUZTLCB0eGRlc2MtPmlmcyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfREFUQUJZVEVfQ09VTlQsCi0JCQkgICBza2ItPmxlbiAtIHNrYmRlc2MtPmRlc2NfbGVuKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9EQVRBQllURV9DT1VOVCwgc2tiLT5sZW4pOwogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX0NJUEhFUiwgQ0lQSEVSX05PTkUpOwogCXJ0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMCwgd29yZCk7CiB9CkBAIC0xMTM0LDcgKzExMzMsNiBAQAogCWludCBwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIDEpOwogCWludCBsZW5ndGg7CiAJdTE2IHJlZzsKLQl1MzIgd29yZCwgbGVuOwogCiAJLyoKIAkgKiBBZGQgdGhlIGRlc2NyaXB0b3IgaW4gZnJvbnQgb2YgdGhlIHNrYi4KQEAgLTExNDQsMTcgKzExNDIsNiBAQAogCXNrYmRlc2MtPmRlc2MgPSBlbnRyeS0+c2tiLT5kYXRhOwogCiAJLyoKLQkgKiBBZGp1c3QgdGhlIGJlYWNvbiBkYXRhYnl0ZSBjb3VudC4gVGhlIGN1cnJlbnQgbnVtYmVyIGlzCi0JICogY2FsY3VsYXRlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCwgYnV0IGZhbHNlbHkKLQkgKiBhc3N1bWVzIHRoYXQgdGhlIGRlc2NyaXB0b3Igd2FzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgU0tCLgotCSAqLwotCXJ0MngwMF9kZXNjX3JlYWQoc2tiZGVzYy0+ZGVzYywgMCwgJndvcmQpOwotCWxlbiAgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhEX1cwX0RBVEFCWVRFX0NPVU5UKTsKLQlsZW4gKz0gc2tiZGVzYy0+ZGVzY19sZW47Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfREFUQUJZVEVfQ09VTlQsIGxlbik7Ci0JcnQyeDAwX2Rlc2Nfd3JpdGUoc2tiZGVzYy0+ZGVzYywgMCwgd29yZCk7Ci0KLQkvKgogCSAqIERpc2FibGUgYmVhY29uaW5nIHdoaWxlIHdlIGFyZSByZWxvYWRpbmcgdGhlIGJlYWNvbiBkYXRhLAogCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBiZSBzZW5kaW5nIG91dCBpbnZhbGlkIGRhdGEuCiAJICovCkBAIC0xMjgwLDYgKzEyNjcsOCBAQAogCiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX09GRE0pKQogCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX1BMQ1A7CisJZWxzZQorCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX0JJVFJBVEU7CiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX01ZX0JTUykpCiAJCXJ4ZGVzYy0+ZGV2X2ZsYWdzIHw9IFJYRE9ORV9NWV9CU1M7CiAKQEAgLTEyOTcsNyArMTI4Niw3IEBACiAJc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSA9IChzdHJ1Y3QgcXVldWVfZW50cnkgKil1cmItPmNvbnRleHQ7CiAJc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfdXNiX2JjbiAqYmNuX3ByaXYgPSBlbnRyeS0+cHJpdl9kYXRhOwogCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJmVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJmVudHJ5LT5xdWV1ZS0+cnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCS8qCkBAIC0xNDg0LDE0ICsxNDczLDE0IEBACiAJLyoKIAkgKiBTdG9yZSBsZWQgbW9kZSwgZm9yIGNvcnJlY3QgbGVkIGJlaGF2aW91ci4KIAkgKi8KLSNpZmRlZiBDT05GSUdfUlQyNTAwVVNCX0xFRFMKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9MRURTCiAJdmFsdWUgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fQU5URU5OQV9MRURfTU9ERSk7CiAKIAlydDI1MDB1c2JfaW5pdF9sZWQocnQyeDAwZGV2LCAmcnQyeDAwZGV2LT5sZWRfcmFkaW8sIExFRF9UWVBFX1JBRElPKTsKIAlpZiAodmFsdWUgPT0gTEVEX01PREVfVFhSWF9BQ1RJVklUWSkKIAkJcnQyNTAwdXNiX2luaXRfbGVkKHJ0MngwMGRldiwgJnJ0MngwMGRldi0+bGVkX3F1YWwsCiAJCQkJICAgTEVEX1RZUEVfQUNUSVZJVFkpOwotI2VuZGlmIC8qIENPTkZJR19SVDI1MDBVU0JfTEVEUyAqLworI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0xFRFMgKi8KIAogCS8qCiAJICogQ2hlY2sgaWYgdGhlIEJCUCB0dW5pbmcgc2hvdWxkIGJlIGRpc2FibGVkLgpAQCAtMTY2NSwxMCArMTY1NCwxMSBAQAogCXsgMTYxLCAweDAwMDIyMDIwLCAweDAwMDA5MGJlLCAweDAwMDAwMTAxLCAweDAwMDAwYTA3IH0sCiB9OwogCi1zdGF0aWMgdm9pZCBydDI1MDB1c2JfcHJvYmVfaHdfbW9kZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQorc3RhdGljIGludCBydDI1MDB1c2JfcHJvYmVfaHdfbW9kZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewogCXN0cnVjdCBod19tb2RlX3NwZWMgKnNwZWMgPSAmcnQyeDAwZGV2LT5zcGVjOwotCXU4ICp0eHBvd2VyOworCXN0cnVjdCBjaGFubmVsX2luZm8gKmluZm87CisJY2hhciAqdHhfcG93ZXI7CiAJdW5zaWduZWQgaW50IGk7CiAKIAkvKgpAQCAtMTY4NywyMCArMTY3NywxMCBAQAogCQkJCQkJICAgRUVQUk9NX01BQ19BRERSXzApKTsKIAogCS8qCi0JICogQ29udmVydCB0eF9wb3dlciBhcnJheSBpbiBlZXByb20uCi0JICovCi0JdHhwb3dlciA9IHJ0MngwMF9lZXByb21fYWRkcihydDJ4MDBkZXYsIEVFUFJPTV9UWFBPV0VSX1NUQVJUKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKLQkJdHhwb3dlcltpXSA9IFRYUE9XRVJfRlJPTV9ERVYodHhwb3dlcltpXSk7Ci0KLQkvKgogCSAqIEluaXRpYWxpemUgaHdfbW9kZSBpbmZvcm1hdGlvbi4KIAkgKi8KIAlzcGVjLT5zdXBwb3J0ZWRfYmFuZHMgPSBTVVBQT1JUX0JBTkRfMkdIWjsKIAlzcGVjLT5zdXBwb3J0ZWRfcmF0ZXMgPSBTVVBQT1JUX1JBVEVfQ0NLIHwgU1VQUE9SVF9SQVRFX09GRE07Ci0Jc3BlYy0+dHhfcG93ZXJfYSA9IE5VTEw7Ci0Jc3BlYy0+dHhfcG93ZXJfYmcgPSB0eHBvd2VyOwotCXNwZWMtPnR4X3Bvd2VyX2RlZmF1bHQgPSBERUZBVUxUX1RYUE9XRVI7CiAKIAlpZiAocnQyeDAwX3JmKCZydDJ4MDBkZXYtPmNoaXAsIFJGMjUyMikpIHsKIAkJc3BlYy0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShyZl92YWxzX2JnXzI1MjIpOwpAQCAtMTcyMiw2ICsxNzAyLDI2IEBACiAJCXNwZWMtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUocmZfdmFsc181MjIyKTsKIAkJc3BlYy0+Y2hhbm5lbHMgPSByZl92YWxzXzUyMjI7CiAJfQorCisJLyoKKwkgKiBDcmVhdGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhcnJheQorCSAqLworCWluZm8gPSBremFsbG9jKHNwZWMtPm51bV9jaGFubmVscyAqIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGVjLT5jaGFubmVsc19pbmZvID0gaW5mbzsKKworCXR4X3Bvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfU1RBUlQpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQlpbmZvW2ldLnR4X3Bvd2VyMSA9IFRYUE9XRVJfRlJPTV9ERVYodHhfcG93ZXJbaV0pOworCisJaWYgKHNwZWMtPm51bV9jaGFubmVscyA+IDE0KSB7CisJCWZvciAoaSA9IDE0OyBpIDwgc3BlYy0+bnVtX2NoYW5uZWxzOyBpKyspCisJCQlpbmZvW2ldLnR4X3Bvd2VyMSA9IERFRkFVTFRfVFhQT1dFUjsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBydDI1MDB1c2JfcHJvYmVfaHcoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKQEAgLTE3NDIsNyArMTc0Miw5IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIGh3IHNwZWNpZmljYXRpb25zLgogCSAqLwotCXJ0MjUwMHVzYl9wcm9iZV9od19tb2RlKHJ0MngwMGRldik7CisJcmV0dmFsID0gcnQyNTAwdXNiX3Byb2JlX2h3X21vZGUocnQyeDAwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCiAJLyoKIAkgKiBUaGlzIGRldmljZSByZXF1aXJlcyB0aGUgYXRpbSBxdWV1ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5oCmluZGV4IDQ3NjlmZmUuLjg5ZTVlZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmgKQEAgLTgyNSwxNyArODI1LDEwIEBACiAjZGVmaW5lIE1BWF9UWFBPV0VSCTMxCiAjZGVmaW5lIERFRkFVTFRfVFhQT1dFUgkyNAogCi0jZGVmaW5lIFRYUE9XRVJfRlJPTV9ERVYoX190eHBvd2VyKQkJXAotKHsJCQkJCQlcCi0JKChfX3R4cG93ZXIpID4gTUFYX1RYUE9XRVIpID8JCVwKLQkJREVGQVVMVF9UWFBPV0VSIDogKF9fdHhwb3dlcik7CVwKLX0pCisjZGVmaW5lIFRYUE9XRVJfRlJPTV9ERVYoX190eHBvd2VyKSBcCisJKCgodTgpKF9fdHhwb3dlcikpID4gTUFYX1RYUE9XRVIpID8gREVGQVVMVF9UWFBPV0VSIDogKF9fdHhwb3dlcikKIAotI2RlZmluZSBUWFBPV0VSX1RPX0RFVihfX3R4cG93ZXIpCQkJXAotKHsJCQkJCQkJXAotCSgoX190eHBvd2VyKSA8PSBNSU5fVFhQT1dFUikgPyBNSU5fVFhQT1dFUiA6CVwKLQkoKChfX3R4cG93ZXIpID49IE1BWF9UWFBPV0VSKSA/IE1BWF9UWFBPV0VSIDoJXAotCShfX3R4cG93ZXIpKTsJCQkJCVwKLX0pCisjZGVmaW5lIFRYUE9XRVJfVE9fREVWKF9fdHhwb3dlcikgXAorCWNsYW1wX3QoY2hhciwgX190eHBvd2VyLCBNSU5fVFhQT1dFUiwgTUFYX1RYUE9XRVIpCiAKICNlbmRpZiAvKiBSVDI1MDBVU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCmluZGV4IDhiMTBlYTQuLjEzNTlhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8qCiAgKiBNb2R1bGUgaW5mb3JtYXRpb24uCiAgKi8KLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMS44IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4yLjEiCiAjZGVmaW5lIERSVl9QUk9KRUNUCSJodHRwOi8vcnQyeDAwLnNlcmlhbG1vbmtleS5jb20iCiAKIC8qCkBAIC01MywxMSArNTMsMTEgQEAKICAqLwogI2RlZmluZSBERUJVR19QUklOVEtfTVNHKF9fZGV2LCBfX2tlcm5sdmwsIF9fbHZsLCBfX21zZywgX19hcmdzLi4uKQlcCiAJcHJpbnRrKF9fa2Vybmx2bCAiJXMgLT4gJXM6ICVzIC0gIiBfX21zZywJCQlcCi0JICAgICAgIHdpcGh5X25hbWUoKF9fZGV2KS0+aHctPndpcGh5KSwgX19GVU5DVElPTl9fLCBfX2x2bCwgIyNfX2FyZ3MpCisJICAgICAgIHdpcGh5X25hbWUoKF9fZGV2KS0+aHctPndpcGh5KSwgX19mdW5jX18sIF9fbHZsLCAjI19fYXJncykKIAogI2RlZmluZSBERUJVR19QUklOVEtfUFJPQkUoX19rZXJubHZsLCBfX2x2bCwgX19tc2csIF9fYXJncy4uLikJXAogCXByaW50ayhfX2tlcm5sdmwgIiVzIC0+ICVzOiAlcyAtICIgX19tc2csCQlcCi0JICAgICAgIEtCVUlMRF9NT0ROQU1FLCBfX0ZVTkNUSU9OX18sIF9fbHZsLCAjI19fYXJncykKKwkgICAgICAgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX2x2bCwgIyNfX2FyZ3MpCiAKICNpZmRlZiBDT05GSUdfUlQyWDAwX0RFQlVHCiAjZGVmaW5lIERFQlVHX1BSSU5USyhfX2RldiwgX19rZXJubHZsLCBfX2x2bCwgX19tc2csIF9fYXJncy4uLikJXApAQCAtMTQ0LDYgKzE0NCwxNyBAQAogfTsKIAogLyoKKyAqIENoYW5uZWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBjaGFubmVsX2luZm8geworCXVuc2lnbmVkIGludCBmbGFnczsKKyNkZWZpbmUgR0VPR1JBUEhZX0FMTE9XRUQJMHgwMDAwMDAwMQorCisJc2hvcnQgdHhfcG93ZXIxOworCXNob3J0IHR4X3Bvd2VyMjsKK307CisKKy8qCiAgKiBBbnRlbm5hIHNldHVwIHZhbHVlcy4KICAqLwogc3RydWN0IGFudGVubmFfc2V0dXAgewpAQCAtMzk0LDEwICs0MDUsNyBAQAogICogQG51bV9jaGFubmVsczogTnVtYmVyIG9mIHN1cHBvcnRlZCBjaGFubmVscy4gVGhpcyBpcyB1c2VkIGFzIGFycmF5IHNpemUKICAqCWZvciBAdHhfcG93ZXJfYSwgQHR4X3Bvd2VyX2JnIGFuZCBAY2hhbm5lbHMuCiAgKiBAY2hhbm5lbHM6IERldmljZS9jaGlwc2V0IHNwZWNpZmljIGNoYW5uZWwgdmFsdWVzIChTZWUgJnN0cnVjdCByZl9jaGFubmVsKS4KLSAqIEB0eF9wb3dlcl9hOiBUWCBwb3dlciB2YWx1ZXMgZm9yIGFsbCA1LjJHSHogY2hhbm5lbHMgKG1heSBiZSBOVUxMKS4KLSAqIEB0eF9wb3dlcl9iZzogVFggcG93ZXIgdmFsdWVzIGZvciBhbGwgMi40R0h6IGNoYW5uZWxzIChtYXkgYmUgTlVMTCkuCi0gKiBAdHhfcG93ZXJfZGVmYXVsdDogRGVmYXVsdCBUWCBwb3dlciB2YWx1ZSB0byB1c2Ugd2hlbiBlaXRoZXIKLSAqCUB0eF9wb3dlcl9hIG9yIEB0eF9wb3dlcl9iZyBpcyBtaXNzaW5nLgorICogQGNoYW5uZWxzX2luZm86IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNoYW5uZWxzIChTZWUgJnN0cnVjdCBjaGFubmVsX2luZm8pLgogICovCiBzdHJ1Y3QgaHdfbW9kZV9zcGVjIHsKIAl1bnNpZ25lZCBpbnQgc3VwcG9ydGVkX2JhbmRzOwpAQCAtNDEwLDEwICs0MTgsNyBAQAogCiAJdW5zaWduZWQgaW50IG51bV9jaGFubmVsczsKIAljb25zdCBzdHJ1Y3QgcmZfY2hhbm5lbCAqY2hhbm5lbHM7Ci0KLQljb25zdCB1OCAqdHhfcG93ZXJfYTsKLQljb25zdCB1OCAqdHhfcG93ZXJfYmc7Ci0JdTggdHhfcG93ZXJfZGVmYXVsdDsKKwljb25zdCBzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsc19pbmZvOwogfTsKIAogLyoKQEAgLTQyNSw3ICs0MzAsOSBAQAogICovCiBzdHJ1Y3QgcnQyeDAwbGliX2NvbmYgewogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZjsKKwogCXN0cnVjdCByZl9jaGFubmVsIHJmOworCXN0cnVjdCBjaGFubmVsX2luZm8gY2hhbm5lbDsKIAogCXN0cnVjdCBhbnRlbm5hX3NldHVwIGFudDsKIApAQCAtNDUyLDYgKzQ1OSwyMyBAQAogfTsKIAogLyoKKyAqIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGZvciBoYXJkd2FyZSBlbmNyeXB0aW9uLgorICovCitzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byB7CisJZW51bSBjaXBoZXIgY2lwaGVyOworCisJZW51bSBzZXRfa2V5X2NtZCBjbWQ7CisJY29uc3QgdTggKmFkZHJlc3M7CisKKwl1MzIgYnNzaWR4OworCXUzMiBhaWQ7CisKKwl1OCBrZXlbMTZdOworCXU4IHR4X21pY1s4XTsKKwl1OCByeF9taWNbOF07Cit9OworCisvKgogICogQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgd3JhcHBlciBhcm91bmQgdGhlCiAgKiBydDJ4MDAgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaGFuZGxlci4KICAqLwpAQCAtNDU5LDcgKzQ4Myw3IEBACiAJLyoKIAkgKiBJbnRlcmZhY2UgdHlwZQogCSAqLwotCWVudW0gaWVlZTgwMjExX2lmX3R5cGVzIHR5cGU7CisJZW51bSBubDgwMjExX2lmdHlwZSB0eXBlOwogCiAJLyoKIAkgKiBUU0Ygc3luYyB2YWx1ZSwgdGhpcyBpcyBkZXBlbmRhbnQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLgpAQCAtNTQ3LDYgKzU3MSwxMiBAQAogCS8qCiAJICogQ29uZmlndXJhdGlvbiBoYW5kbGVycy4KIAkgKi8KKwlpbnQgKCpjb25maWdfc2hhcmVkX2tleSkgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJICBzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byAqY3J5cHRvLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKKwlpbnQgKCpjb25maWdfcGFpcndpc2Vfa2V5KSAoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgICAgc3RydWN0IHJ0MngwMGxpYl9jcnlwdG8gKmNyeXB0bywKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKIAl2b2lkICgqY29uZmlnX2ZpbHRlcikgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGZpbHRlcl9mbGFncyk7CiAJdm9pZCAoKmNvbmZpZ19pbnRmKSAoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTU5OSwxNyArNjI5LDE2IEBACiAJLyoKIAkgKiBEZXZpY2Ugc3RhdGUgZmxhZ3MKIAkgKi8KLQlERVZJQ0VfUFJFU0VOVCwKLQlERVZJQ0VfUkVHSVNURVJFRF9IVywKLQlERVZJQ0VfSU5JVElBTElaRUQsCi0JREVWSUNFX1NUQVJURUQsCi0JREVWSUNFX1NUQVJURURfU1VTUEVORCwKLQlERVZJQ0VfRU5BQkxFRF9SQURJTywKLQlERVZJQ0VfRElTQUJMRURfUkFESU9fSFcsCi0JREVWSUNFX0RJUlRZX0NPTkZJRywKKwlERVZJQ0VfU1RBVEVfUFJFU0VOVCwKKwlERVZJQ0VfU1RBVEVfUkVHSVNURVJFRF9IVywKKwlERVZJQ0VfU1RBVEVfSU5JVElBTElaRUQsCisJREVWSUNFX1NUQVRFX1NUQVJURUQsCisJREVWSUNFX1NUQVRFX1NUQVJURURfU1VTUEVORCwKKwlERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywKKwlERVZJQ0VfU1RBVEVfRElTQUJMRURfUkFESU9fSFcsCiAKIAkvKgotCSAqIERyaXZlciBmZWF0dXJlcworCSAqIERyaXZlciByZXF1aXJlbWVudHMKIAkgKi8KIAlEUklWRVJfUkVRVUlSRV9GSVJNV0FSRSwKIAlEUklWRVJfUkVRVUlSRV9CRUFDT05fR1VBUkQsCkBAIC02MTgsOSArNjQ3LDE0IEBACiAJRFJJVkVSX1JFUVVJUkVfRE1BLAogCiAJLyoKLQkgKiBEcml2ZXIgY29uZmlndXJhdGlvbgorCSAqIERyaXZlciBmZWF0dXJlcwogCSAqLwogCUNPTkZJR19TVVBQT1JUX0hXX0JVVFRPTiwKKwlDT05GSUdfU1VQUE9SVF9IV19DUllQVE8sCisKKwkvKgorCSAqIERyaXZlciBjb25maWd1cmF0aW9uCisJICovCiAJQ09ORklHX0ZSQU1FX1RZUEUsCiAJQ09ORklHX1JGX1NFUVVFTkNFLAogCUNPTkZJR19FWFRFUk5BTF9MTkFfQSwKQEAgLTc2OSw2ICs4MDMsMTEgQEAKIAl1MzIgKnJmOwogCiAJLyoKKwkgKiBMTkEgZ2FpbgorCSAqLworCXNob3J0IGxuYV9nYWluOworCisJLyoKIAkgKiBVU0IgTWF4IGZyYW1lIHNpemUgKGZvciBydDI1MDB1c2IgJiBydDczdXNiKS4KIAkgKi8KIAl1MTYgdXNiX21heHBhY2tldDsKQEAgLTk2Niw2ICsxMDA1LDEzIEBACiAJCQkJdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCiAJCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKIAkJCQlpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfYWRkcl9saXN0ICptY19saXN0KTsKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8KK2ludCBydDJ4MDBtYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCSAgICAgIGNvbnN0IHU4ICpsb2NhbF9hZGRyZXNzLCBjb25zdCB1OCAqYWRkcmVzcywKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKKyNlbHNlCisjZGVmaW5lIHJ0MngwMG1hY19zZXRfa2V5CU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8gKi8KIGludCBydDJ4MDBtYWNfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKTsKIGludCBydDJ4MDBtYWNfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNvbmZpZy5jCmluZGV4IGQxMzRjM2IuLjRkNWU4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjb25maWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY29uZmlnLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogdm9pZCBydDJ4MDBsaWJfY29uZmlnX2ludGYoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCSAgIHN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiwKLQkJCSAgIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzIHR5cGUsCisJCQkgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkgICB1OCAqbWFjLCB1OCAqYnNzaWQpCiB7CiAJc3RydWN0IHJ0MngwMGludGZfY29uZiBjb25mOwpAQCAtNDAsMTEgKzQwLDExIEBACiAJY29uZi50eXBlID0gdHlwZTsKIAogCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJY29uZi5zeW5jID0gVFNGX1NZTkNfQkVBQ09OOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWNvbmYuc3luYyA9IFRTRl9TWU5DX0lORlJBOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTIxLDcgKzEyMSw3IEBACiAJICogQW50ZW5uYSBzZXR1cCBjaGFuZ2VzIHJlcXVpcmUgdGhlIFJYIHRvIGJlIGRpc2FibGVkLAogCSAqIGVsc2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBkZXZpY2UuCiAJICovCi0JaWYgKHRlc3RfYml0KERFVklDRV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJ0MngwMGxpYl90b2dnbGVfcngocnQyeDAwZGV2LCBTVEFURV9SQURJT19SWF9PRkZfTElOSyk7CiAKIAkvKgpAQCAtMTM2LDcgKzEzNiw3IEBACiAJcnQyeDAwZGV2LT5saW5rLmFudC5hY3RpdmUucnggPSBsaWJjb25mLmFudC5yeDsKIAlydDJ4MDBkZXYtPmxpbmsuYW50LmFjdGl2ZS50eCA9IGxpYmNvbmYuYW50LnR4OwogCi0JaWYgKHRlc3RfYml0KERFVklDRV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJ0MngwMGxpYl90b2dnbGVfcngocnQyeDAwZGV2LCBTVEFURV9SQURJT19SWF9PTl9MSU5LKTsKIH0KIApAQCAtMjQ1LDYgKzI0NSwxMCBAQAogCQltZW1jcHkoJmxpYmNvbmYucmYsCiAJCSAgICAgICAmcnQyeDAwZGV2LT5zcGVjLmNoYW5uZWxzW2NvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlXSwKIAkJICAgICAgIHNpemVvZihsaWJjb25mLnJmKSk7CisKKwkJbWVtY3B5KCZsaWJjb25mLmNoYW5uZWwsCisJCSAgICAgICAmcnQyeDAwZGV2LT5zcGVjLmNoYW5uZWxzX2luZm9bY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWVdLAorCQkgICAgICAgc2l6ZW9mKGxpYmNvbmYuY2hhbm5lbCkpOwogCX0KIAogCWlmIChmbGFncyAmIENPTkZJR19VUERBVEVfQU5URU5OQSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODU4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisJQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwOCBydDJ4MDAgU291cmNlRm9yZ2UgUHJvamVjdAorCTxodHRwOi8vcnQyeDAwLnNlcmlhbG1vbmtleS5jb20+CisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKwlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisJNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorCU1vZHVsZTogcnQyeDAwbGliCisJQWJzdHJhY3Q6IHJ0MngwMCBjcnlwdG8gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAicnQyeDAwLmgiCisjaW5jbHVkZSAicnQyeDAwbGliLmgiCisKK2VudW0gY2lwaGVyIHJ0MngwMGNyeXB0b19rZXlfdG9fY2lwaGVyKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzd2l0Y2ggKGtleS0+YWxnKSB7CisJY2FzZSBBTEdfV0VQOgorCQlpZiAoa2V5LT5rZXlsZW4gPT0gTEVOX1dFUDQwKQorCQkJcmV0dXJuIENJUEhFUl9XRVA2NDsKKwkJZWxzZQorCQkJcmV0dXJuIENJUEhFUl9XRVAxMjg7CisJY2FzZSBBTEdfVEtJUDoKKwkJcmV0dXJuIENJUEhFUl9US0lQOworCWNhc2UgQUxHX0NDTVA6CisJCXJldHVybiBDSVBIRVJfQUVTOworCWRlZmF1bHQ6CisJCXJldHVybiBDSVBIRVJfTk9ORTsKKwl9Cit9CisKK3Vuc2lnbmVkIGludCBydDJ4MDBjcnlwdG9fdHhfb3ZlcmhlYWQoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvKQoreworCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSA9IHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5OworCXVuc2lnbmVkIGludCBvdmVyaGVhZCA9IDA7CisKKwkvKgorCSAqIEV4dGVuZCBmcmFtZSBsZW5ndGggdG8gaW5jbHVkZSBJVi9FSVYvSUNWL01NSUMsCisJICogbm90ZSB0aGF0IHRoZXNlIGxlbmd0aHMgc2hvdWxkIG9ubHkgYmUgYWRkZWQgd2hlbgorCSAqIG1hYzgwMjExIGRvZXMgbm90IGdlbmVyYXRlIGl0LgorCSAqLworCW92ZXJoZWFkICs9IGtleS0+aWN2X2xlbjsKKworCWlmICghKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKQorCQlvdmVyaGVhZCArPSBrZXktPml2X2xlbjsKKworCWlmICghKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykpIHsKKwkJaWYgKGtleS0+YWxnID09IEFMR19US0lQKQorCQkJb3ZlcmhlYWQgKz0gODsKKwl9CisKKwlyZXR1cm4gb3ZlcmhlYWQ7Cit9CisKK3ZvaWQgcnQyeDAwY3J5cHRvX3R4X3JlbW92ZV9pdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaXZfbGVuKQoreworCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhza2IpOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKworCWlmICh1bmxpa2VseSghaXZfbGVuKSkKKwkJcmV0dXJuOworCisJLyogQ29weSBJVi9FSVYgZGF0YSAqLworCWlmIChpdl9sZW4gPj0gNCkKKwkJbWVtY3B5KCZza2JkZXNjLT5pdiwgc2tiLT5kYXRhICsgaGVhZGVyX2xlbmd0aCwgNCk7CisJaWYgKGl2X2xlbiA+PSA4KQorCQltZW1jcHkoJnNrYmRlc2MtPmVpdiwgc2tiLT5kYXRhICsgaGVhZGVyX2xlbmd0aCArIDQsIDQpOworCisJLyogTW92ZSBpZWVlODAyMTEgaGVhZGVyICovCisJbWVtbW92ZShza2ItPmRhdGEgKyBpdl9sZW4sIHNrYi0+ZGF0YSwgaGVhZGVyX2xlbmd0aCk7CisKKwkvKiBQdWxsIGJ1ZmZlciB0byBjb3JyZWN0IHNpemUgKi8KKwlza2JfcHVsbChza2IsIGl2X2xlbik7CisKKwkvKiBJVi9FSVYgZGF0YSBoYXMgb2ZmaWNpYWxseSBiZSBzdHJpcHBlZCAqLworCXNrYmRlc2MtPmZsYWdzIHw9IEZSQU1FX0RFU0NfSVZfU1RSSVBQRUQ7Cit9CisKK3ZvaWQgcnQyeDAwY3J5cHRvX3R4X2luc2VydF9pdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhza2IpOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgaXZfbGVuID0KKwkgICAgKCghIShza2JkZXNjLT5pdikpICogNCkgKyAoKCEhKHNrYmRlc2MtPmVpdikpICogNCk7CisKKwlpZiAoIShza2JkZXNjLT5mbGFncyAmIEZSQU1FX0RFU0NfSVZfU1RSSVBQRUQpKQorCQlyZXR1cm47CisKKwlza2JfcHVzaChza2IsIGl2X2xlbik7CisKKwkvKiBNb3ZlIGllZWU4MDIxMSBoZWFkZXIgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgaXZfbGVuLCBoZWFkZXJfbGVuZ3RoKTsKKworCS8qIENvcHkgSVYvRUlWIGRhdGEgKi8KKwlpZiAoaXZfbGVuID49IDQpCisJCW1lbWNweShza2ItPmRhdGEgKyBoZWFkZXJfbGVuZ3RoLCAmc2tiZGVzYy0+aXYsIDQpOworCWlmIChpdl9sZW4gPj0gOCkKKwkJbWVtY3B5KHNrYi0+ZGF0YSArIGhlYWRlcl9sZW5ndGggKyA0LCAmc2tiZGVzYy0+ZWl2LCA0KTsKKworCS8qIElWL0VJViBkYXRhIGhhcyByZXR1cm5lZCBpbnRvIHRoZSBmcmFtZSAqLworCXNrYmRlc2MtPmZsYWdzICY9IH5GUkFNRV9ERVNDX0lWX1NUUklQUEVEOworfQorCit2b2lkIHJ0MngwMGNyeXB0b19yeF9pbnNlcnRfaXYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGFsaWduLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoLAorCQkJICAgICAgIHN0cnVjdCByeGRvbmVfZW50cnlfZGVzYyAqcnhkZXNjKQoreworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IHJ4ZGVzYy0+c2l6ZSAtIGhlYWRlcl9sZW5ndGg7CisJdW5zaWduZWQgaW50IGl2X2xlbjsKKwl1bnNpZ25lZCBpbnQgaWN2X2xlbjsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXIgPSAwOworCisJLyoKKwkgKiBXRVA2NC9XRVAxMjg6IFByb3ZpZGVzIElWICYgSUNWCisJICogVEtJUDogUHJvdmlkZXMgSVYvRUlWICYgSUNWCisJICogQUVTOiBQcm92aWVzIElWL0VJViAmIElDVgorCSAqLworCXN3aXRjaCAocnhkZXNjLT5jaXBoZXIpIHsKKwljYXNlIENJUEhFUl9XRVA2NDoKKwljYXNlIENJUEhFUl9XRVAxMjg6CisJCWl2X2xlbiA9IDQ7CisJCWljdl9sZW4gPSA0OworCQlicmVhazsKKwljYXNlIENJUEhFUl9US0lQOgorCQlpdl9sZW4gPSA4OworCQlpY3ZfbGVuID0gNDsKKwkJYnJlYWs7CisJY2FzZSBDSVBIRVJfQUVTOgorCQlpdl9sZW4gPSA4OworCQlpY3ZfbGVuID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5zdXBwb3J0IHR5cGUgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTWFrZSByb29tIGZvciBuZXcgZGF0YSwgbm90ZSB0aGF0IHdlIGluY3JlYXNlIGJvdGgKKwkgKiBoZWFkc2l6ZSBhbmQgdGFpbHNpemUgd2hlbiByZXF1aXJlZC4gVGhlIHRhaWxzaXplIGlzCisJICogb25seSBuZWVkZWQgd2hlbiBJQ1YgZGF0YSBuZWVkcyB0byBiZSBpbnNlcnRlZCBhbmQKKwkgKiB0aGUgcGFkZGluZyBpcyBzbWFsbGVyIHRoZW4gdGhlIElDViBkYXRhLgorCSAqIFdoZW4gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBpcyBncmVhdGVyIHRoZW4gdGhlCisJICogSUNWIGRhdGEgd2UgbXVzdCB0cmltIHRoZSBza2IgdG8gdGhlIGNvcnJlY3Qgc2l6ZQorCSAqIGJlY2F1c2Ugd2UgbmVlZCB0byByZW1vdmUgdGhlIGV4dHJhIGJ5dGVzLgorCSAqLworCXNrYl9wdXNoKHNrYiwgaXZfbGVuICsgYWxpZ24pOworCWlmIChhbGlnbiA8IGljdl9sZW4pCisJCXNrYl9wdXQoc2tiLCBpY3ZfbGVuIC0gYWxpZ24pOworCWVsc2UgaWYgKGFsaWduID4gaWN2X2xlbikKKwkJc2tiX3RyaW0oc2tiLCByeGRlc2MtPnNpemUgKyBpdl9sZW4gKyBpY3ZfbGVuKTsKKworCS8qIE1vdmUgaWVlZTgwMjExIGhlYWRlciAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgdHJhbnNmZXIsCisJCXNrYi0+ZGF0YSArIHRyYW5zZmVyICsgaXZfbGVuICsgYWxpZ24sCisJCWhlYWRlcl9sZW5ndGgpOworCXRyYW5zZmVyICs9IGhlYWRlcl9sZW5ndGg7CisKKwkvKiBDb3B5IElWIGRhdGEgKi8KKwlpZiAoaXZfbGVuID49IDQpIHsKKwkJbWVtY3B5KHNrYi0+ZGF0YSArIHRyYW5zZmVyLCAmcnhkZXNjLT5pdiwgNCk7CisJCXRyYW5zZmVyICs9IDQ7CisJfQorCisJLyogQ29weSBFSVYgZGF0YSAqLworCWlmIChpdl9sZW4gPj0gOCkgeworCQltZW1jcHkoc2tiLT5kYXRhICsgdHJhbnNmZXIsICZyeGRlc2MtPmVpdiwgNCk7CisJCXRyYW5zZmVyICs9IDQ7CisJfQorCisJLyogTW92ZSBwYXlsb2FkICovCisJaWYgKGFsaWduKSB7CisJCW1lbW1vdmUoc2tiLT5kYXRhICsgdHJhbnNmZXIsCisJCQlza2ItPmRhdGEgKyB0cmFuc2ZlciArIGFsaWduLAorCQkJcGF5bG9hZF9sZW4pOworCX0KKworCS8qCisJICogTk9URTogQWx3YXlzIGNvdW50IHRoZSBwYXlsb2FkIGFzIHRyYW5zZmVyZWQsCisJICogZXZlbiB3aGVuIGFsaWdubWVudCB3YXMgc2V0IHRvIHplcm8uIFRoaXMgaXMgcmVxdWlyZWQKKwkgKiBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNvcnJlY3Qgb2Zmc2V0IGZvciB0aGUgSUNWIGRhdGEuCisJICovCisJdHJhbnNmZXIgKz0gcGF5bG9hZF9sZW47CisKKwkvKiBDb3B5IElDViBkYXRhICovCisJaWYgKGljdl9sZW4gPj0gNCkgeworCQltZW1jcHkoc2tiLT5kYXRhICsgdHJhbnNmZXIsICZyeGRlc2MtPmljdiwgNCk7CisJCS8qCisJCSAqIEFFUyBhcHBlbmRzIDggYnl0ZXMsIHdlIGNhbid0IGZpbGwgdGhlIHVwcGVyCisJCSAqIDQgYnl0ZXMsIGJ1dCBtYWM4MDIxMSBkb2Vzbid0IGNhcmUgYWJvdXQgd2hhdAorCQkgKiB3ZSBwcm92aWRlIGhlcmUgYW55d2F5IGFuZCBzdHJpcHMgaXQgaW1tZWRpYXRlbHkuCisJCSAqLworCQl0cmFuc2ZlciArPSBpY3ZfbGVuOworCX0KKworCS8qIElWL0VJVi9JQ1YgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byBmcmFtZSAqLworCXJ4ZGVzYy0+c2l6ZSA9IHRyYW5zZmVyOworCXJ4ZGVzYy0+ZmxhZ3MgJj0gflJYX0ZMQUdfSVZfU1RSSVBQRUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZWJ1Zy5jCmluZGV4IDZiZWUxZDYuLjVjZjRjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZWJ1Zy5jCkBAIC0zNSw2ICszNSwxMyBAQAogCiAjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSCA2NAogCitzdHJ1Y3QgcnQyeDAwZGVidWdfY3J5cHRvIHsKKwl1bnNpZ25lZCBsb25nIHN1Y2Nlc3M7CisJdW5zaWduZWQgbG9uZyBpY3ZfZXJyb3I7CisJdW5zaWduZWQgbG9uZyBtaWNfZXJyb3I7CisJdW5zaWduZWQgbG9uZyBrZXlfZXJyb3I7Cit9OworCiBzdHJ1Y3QgcnQyeDAwZGVidWdfaW50ZiB7CiAJLyoKIAkgKiBQb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3R1cmUgd2hlcmUKQEAgLTYzLDYgKzcwLDcgQEAKIAkgKiAgIC0gcXVldWUgZm9sZGVyCiAJICogICAgIC0gZnJhbWUgZHVtcCBmaWxlCiAJICogICAgIC0gcXVldWUgc3RhdHMgZmlsZQorCSAqICAgICAtIGNyeXB0byBzdGF0cyBmaWxlCiAJICovCiAJc3RydWN0IGRlbnRyeSAqZHJpdmVyX2ZvbGRlcjsKIAlzdHJ1Y3QgZGVudHJ5ICpkcml2ZXJfZW50cnk7CkBAIC04MCw2ICs4OCw3IEBACiAJc3RydWN0IGRlbnRyeSAqcXVldWVfZm9sZGVyOwogCXN0cnVjdCBkZW50cnkgKnF1ZXVlX2ZyYW1lX2R1bXBfZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqcXVldWVfc3RhdHNfZW50cnk7CisJc3RydWN0IGRlbnRyeSAqY3J5cHRvX3N0YXRzX2VudHJ5OwogCiAJLyoKIAkgKiBUaGUgZnJhbWUgZHVtcCBmaWxlIG9ubHkgYWxsb3dzIGEgc2luZ2xlIHJlYWRlciwKQEAgLTk4LDYgKzEwNywxMiBAQAogCXdhaXRfcXVldWVfaGVhZF90IGZyYW1lX2R1bXBfd2FpdHF1ZXVlOwogCiAJLyoKKwkgKiBIVyBjcnlwdG8gc3RhdGlzdGljcy4KKwkgKiBBbGwgc3RhdGlzdGljcyBhcmUgc3RvcmVkIHNlcGVyYXRlbHkgcGVyIGNpcGhlciB0eXBlLgorCSAqLworCXN0cnVjdCBydDJ4MDBkZWJ1Z19jcnlwdG8gY3J5cHRvX3N0YXRzW0NJUEhFUl9NQVhdOworCisJLyoKIAkgKiBEcml2ZXIgYW5kIGNoaXBzZXQgZmlsZXMgd2lsbCB1c2UgYSBkYXRhIGJ1ZmZlcgogCSAqIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBpbiBhZHZhbmNlLiBUaGlzIHdpbGwgc2ltcGxpZnkKIAkgKiB0aGUgY29kZSBzaW5jZSB3ZSBjYW4gdXNlIHRoZSBkZWJ1Z2ZzIGZ1bmN0aW9ucy4KQEAgLTExNCw2ICsxMjksMjUgQEAKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0X3JmOwogfTsKIAordm9pZCBydDJ4MDBkZWJ1Z191cGRhdGVfY3J5cHRvKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkgICAgICAgZW51bSBjaXBoZXIgY2lwaGVyLCBlbnVtIHJ4X2NyeXB0byBzdGF0dXMpCit7CisJc3RydWN0IHJ0MngwMGRlYnVnX2ludGYgKmludGYgPSBydDJ4MDBkZXYtPmRlYnVnZnNfaW50ZjsKKworCWlmIChjaXBoZXIgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQorCQljaXBoZXIgPSBDSVBIRVJfVEtJUDsKKwlpZiAoY2lwaGVyID09IENJUEhFUl9OT05FIHx8IGNpcGhlciA+IENJUEhFUl9NQVgpCisJCXJldHVybjsKKworCS8qIFJlbW92ZSBDSVBIRVJfTk9ORSBpbmRleCAqLworCWNpcGhlci0tOworCisJaW50Zi0+Y3J5cHRvX3N0YXRzW2NpcGhlcl0uc3VjY2VzcyArPSAoc3RhdHVzID09IFJYX0NSWVBUT19TVUNDRVNTKTsKKwlpbnRmLT5jcnlwdG9fc3RhdHNbY2lwaGVyXS5pY3ZfZXJyb3IgKz0gKHN0YXR1cyA9PSBSWF9DUllQVE9fRkFJTF9JQ1YpOworCWludGYtPmNyeXB0b19zdGF0c1tjaXBoZXJdLm1pY19lcnJvciArPSAoc3RhdHVzID09IFJYX0NSWVBUT19GQUlMX01JQyk7CisJaW50Zi0+Y3J5cHRvX3N0YXRzW2NpcGhlcl0ua2V5X2Vycm9yICs9IChzdGF0dXMgPT0gUlhfQ1JZUFRPX0ZBSUxfS0VZKTsKK30KKwogdm9pZCBydDJ4MDBkZWJ1Z19kdW1wX2ZyYW1lKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkgICAgZW51bSBydDJ4MDBfZHVtcF90eXBlIHR5cGUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0zMjcsNiArMzYxLDU5IEBACiAJLnJlbGVhc2UJPSBydDJ4MDBkZWJ1Z19maWxlX3JlbGVhc2UsCiB9OwogCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPCitzdGF0aWMgc3NpemVfdCBydDJ4MDBkZWJ1Z19yZWFkX2NyeXB0b19zdGF0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQkgICAgIHNpemVfdCBsZW5ndGgsCisJCQkJCSAgICAgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHJ0MngwMGRlYnVnX2ludGYgKmludGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqbmFtZVtdID0geyAiV0VQNjQiLCAiV0VQMTI4IiwgIlRLSVAiLCAiQUVTIiB9OworCWNoYXIgKmRhdGE7CisJY2hhciAqdGVtcDsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgqb2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCWRhdGEgPSBremFsbG9jKCgxICsgQ0lQSEVSX01BWCkqIE1BWF9MSU5FX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRlbXAgPSBkYXRhOworCXRlbXAgKz0gc3ByaW50ZihkYXRhLCAiY2lwaGVyXHRzdWNjZXNzXHRpY3YgZXJyXHRtaWMgZXJyXHRrZXkgZXJyXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBDSVBIRVJfTUFYOyBpKyspIHsKKwkJdGVtcCArPSBzcHJpbnRmKHRlbXAsICIlc1x0JWx1XHQlbHVcdCVsdVx0JWx1XG4iLCBuYW1lW2ldLAorCQkJCWludGYtPmNyeXB0b19zdGF0c1tpXS5zdWNjZXNzLAorCQkJCWludGYtPmNyeXB0b19zdGF0c1tpXS5pY3ZfZXJyb3IsCisJCQkJaW50Zi0+Y3J5cHRvX3N0YXRzW2ldLm1pY19lcnJvciwKKwkJCQlpbnRmLT5jcnlwdG9fc3RhdHNbaV0ua2V5X2Vycm9yKTsKKwl9CisKKwlzaXplID0gc3RybGVuKGRhdGEpOworCXNpemUgPSBtaW4oc2l6ZSwgbGVuZ3RoKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgeworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUoZGF0YSk7CisKKwkqb2Zmc2V0ICs9IHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0MngwMGRlYnVnX2ZvcF9jcnlwdG9fc3RhdHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHJ0MngwMGRlYnVnX3JlYWRfY3J5cHRvX3N0YXRzLAorCS5vcGVuCQk9IHJ0MngwMGRlYnVnX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IHJ0MngwMGRlYnVnX2ZpbGVfcmVsZWFzZSwKK307CisjZW5kaWYKKwogI2RlZmluZSBSVDJYMDBERUJVR0ZTX09QU19SRUFEKF9fbmFtZSwgX19mb3JtYXQsIF9fdHlwZSkJXAogc3RhdGljIHNzaXplX3QgcnQyeDAwZGVidWdfcmVhZF8jI19fbmFtZShzdHJ1Y3QgZmlsZSAqZmlsZSwJXAogCQkJCQkgY2hhciBfX3VzZXIgKmJ1ZiwJXApAQCAtNTY5LDYgKzY1NiwxMyBAQAogCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJxdWV1ZSIsIFNfSVJVU1IsIGludGYtPnF1ZXVlX2ZvbGRlciwKIAkJCQlpbnRmLCAmcnQyeDAwZGVidWdfZm9wX3F1ZXVlX3N0YXRzKTsKIAorI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0NSWVBUTworCWlmICh0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19DUllQVE8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJaW50Zi0+Y3J5cHRvX3N0YXRzX2VudHJ5ID0KKwkJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoImNyeXB0byIsIFNfSVJVR08sIGludGYtPnF1ZXVlX2ZvbGRlciwKKwkJCQkJaW50ZiwgJnJ0MngwMGRlYnVnX2ZvcF9jcnlwdG9fc3RhdHMpOworI2VuZGlmCisKIAlyZXR1cm47CiAKIGV4aXQ6CkBAIC01ODcsNiArNjgxLDkgQEAKIAogCXNrYl9xdWV1ZV9wdXJnZSgmaW50Zi0+ZnJhbWVfZHVtcF9za2JxdWV1ZSk7CiAKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8KKwlkZWJ1Z2ZzX3JlbW92ZShpbnRmLT5jcnlwdG9fc3RhdHNfZW50cnkpOworI2VuZGlmCiAJZGVidWdmc19yZW1vdmUoaW50Zi0+cXVldWVfc3RhdHNfZW50cnkpOwogCWRlYnVnZnNfcmVtb3ZlKGludGYtPnF1ZXVlX2ZyYW1lX2R1bXBfZW50cnkpOwogCWRlYnVnZnNfcmVtb3ZlKGludGYtPnF1ZXVlX2ZvbGRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKaW5kZXggZjQyMjgzYS4uODY4NDBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwpAQCAtMzQsNyArMzQsNyBAQAogICovCiB2b2lkIHJ0MngwMGxpYl9yZXNldF9saW5rX3R1bmVyKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7Ci0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTk0LDggKzk0LDggQEAKIAkgKiBEb24ndCBlbmFibGUgdGhlIHJhZGlvIHR3aWNlLgogCSAqIEFuZCBjaGVjayBpZiB0aGUgaGFyZHdhcmUgYnV0dG9uIGhhcyBiZWVuIGRpc2FibGVkLgogCSAqLwotCWlmICh0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KERFVklDRV9ESVNBQkxFRF9SQURJT19IVywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KERFVklDRV9TVEFURV9ESVNBQkxFRF9SQURJT19IVywgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlydDJ4MDBsZWRzX2xlZF9yYWRpbyhydDJ4MDBkZXYsIHRydWUpOwogCXJ0MngwMGxlZF9sZWRfYWN0aXZpdHkocnQyeDAwZGV2LCB0cnVlKTsKIAotCV9fc2V0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCXNldF9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKTsKIAogCS8qCiAJICogRW5hYmxlIFJYLgpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIHZvaWQgcnQyeDAwbGliX2Rpc2FibGVfcmFkaW8oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKLQlpZiAoIV9fdGVzdF9hbmRfY2xlYXJfYml0KERFVklDRV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoREVWSUNFX1NUQVRFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTM1NCw3ICszNTQsNyBAQAogCSAqIFdoZW4gdGhlIHJhZGlvIGlzIHNodXR0aW5nIGRvd24gd2Ugc2hvdWxkCiAJICogaW1tZWRpYXRlbHkgY2Vhc2UgYWxsIGxpbmsgdHVuaW5nLgogCSAqLwotCWlmICghdGVzdF9iaXQoREVWSUNFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCS8qCkBAIC00MzEsNyArNDMxLDcgQEAKIAkgKiBub3RlIHRoYXQgaW4gdGhlIHNwaW5sb2NrIHByb3RlY3RlZCBhcmVhIGFib3ZlIHRoZSBkZWxheWVkX2ZsYWdzCiAJICogaGF2ZSBiZWVuIGNsZWFyZWQgY29ycmVjdGx5LgogCSAqLwotCWlmICghdGVzdF9iaXQoREVWSUNFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCWlmIChkZWxheWVkX2ZsYWdzICYgREVMQVlFRF9VUERBVEVfQkVBQ09OKQpAQCAtNDY3LDggKzQ2Nyw4IEBACiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGRhdGE7CiAJc3RydWN0IHJ0MngwMF9pbnRmICppbnRmID0gdmlmX3RvX2ludGYodmlmKTsKIAotCWlmICh2aWYtPnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYKLQkgICAgdmlmLT50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJaWYgKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCXJldHVybjsKIAogCS8qCkBAIC00ODQsNyArNDg0LDcgQEAKIAogdm9pZCBydDJ4MDBsaWJfYmVhY29uZG9uZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewotCWlmICghdGVzdF9iaXQoREVWSUNFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCWllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhydDJ4MDBkZXYtPmh3LApAQCAtNTA4LDYgKzUwOCwxNSBAQAogCXJ0MngwMHF1ZXVlX3VubWFwX3NrYihydDJ4MDBkZXYsIGVudHJ5LT5za2IpOwogCiAJLyoKKwkgKiBJZiB0aGUgSVYvRUlWIGRhdGEgd2FzIHN0cmlwcGVkIGZyb20gdGhlIGZyYW1lIGJlZm9yZSBpdCB3YXMKKwkgKiBwYXNzZWQgdG8gdGhlIGhhcmR3YXJlLCB3ZSBzaG91bGQgbm93IHJlaW5zZXJ0IGl0IGFnYWluIGJlY2F1c2UKKwkgKiBtYWM4MDIxMSB3aWxsIGV4cGVjdCB0aGUgdGhlIHNhbWUgZGF0YSB0byBiZSBwcmVzZW50IGl0IHRoZQorCSAqIGZyYW1lIGFzIGl0IHdhcyBwYXNzZWQgdG8gdXMuCisJICovCisJaWYgKHRlc3RfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlydDJ4MDBjcnlwdG9fdHhfaW5zZXJ0X2l2KGVudHJ5LT5za2IpOworCisJLyoKIAkgKiBTZW5kIGZyYW1lIHRvIGRlYnVnZnMgaW1tZWRpYXRlbHksIGFmdGVyIHRoaXMgY2FsbCBpcyBjb21wbGV0ZWQKIAkgKiB3ZSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlIHRoZSBza2ItPmNiIGFycmF5LgogCSAqLwpAQCAtNTYzLDcgKzU3Miw3IEBACiAKIAlydDJ4MDBkZXYtPm9wcy0+bGliLT5pbml0X3R4ZW50cnkocnQyeDAwZGV2LCBlbnRyeSk7CiAKLQlfX2NsZWFyX2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CisJY2xlYXJfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKTsKIAlydDJ4MDBxdWV1ZV9pbmRleF9pbmMoZW50cnktPnF1ZXVlLCBRX0lOREVYX0RPTkUpOwogCiAJLyoKQEAgLTU4NSw3ICs1OTQsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJY29uc3Qgc3RydWN0IHJ0MngwMF9yYXRlICpyYXRlOwotCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbmd0aDsKIAl1bnNpZ25lZCBpbnQgYWxpZ247CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGlkeCA9IC0xOwpAQCAtNjEzLDEwICs2MjIsMTkgQEAKIAkgKiBUaGUgZGF0YSBiZWhpbmQgdGhlIGllZWU4MDIxMSBoZWFkZXIgbXVzdCBiZQogCSAqIGFsaWduZWQgb24gYSA0IGJ5dGUgYm91bmRhcnkuCiAJICovCi0JaGVhZGVyX3NpemUgPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihlbnRyeS0+c2tiKTsKLQlhbGlnbiA9ICgodW5zaWduZWQgbG9uZykoZW50cnktPnNrYi0+ZGF0YSArIGhlYWRlcl9zaXplKSkgJiAzOworCWhlYWRlcl9sZW5ndGggPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihlbnRyeS0+c2tiKTsKKwlhbGlnbiA9ICgodW5zaWduZWQgbG9uZykoZW50cnktPnNrYi0+ZGF0YSArIGhlYWRlcl9sZW5ndGgpKSAmIDM7CiAKLQlpZiAoYWxpZ24pIHsKKwkvKgorCSAqIEhhcmR3YXJlIG1pZ2h0IGhhdmUgc3RyaXBwZWQgdGhlIElWL0VJVi9JQ1YgZGF0YSwKKwkgKiBpbiB0aGF0IGNhc2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZGF0YSB3YXMKKwkgKiBwcm92aWRlZCBzZXBlcmF0ZWx5ICh0aHJvdWdoIGhhcmR3YXJlIGRlc2NyaXB0b3IpCisJICogaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgcmVpbnNlcnQgdGhlIGRhdGEgaW50byB0aGUgZnJhbWUuCisJICovCisJaWYgKChyeGRlc2MuZmxhZ3MgJiBSWF9GTEFHX0lWX1NUUklQUEVEKSkgeworCQlydDJ4MDBjcnlwdG9fcnhfaW5zZXJ0X2l2KGVudHJ5LT5za2IsIGFsaWduLAorCQkJCQkgIGhlYWRlcl9sZW5ndGgsICZyeGRlc2MpOworCX0gZWxzZSBpZiAoYWxpZ24pIHsKIAkJc2tiX3B1c2goZW50cnktPnNrYiwgYWxpZ24pOwogCQkvKiBNb3ZlIGVudGlyZSBmcmFtZSBpbiAxIGNvbW1hbmQgKi8KIAkJbWVtbW92ZShlbnRyeS0+c2tiLT5kYXRhLCBlbnRyeS0+c2tiLT5kYXRhICsgYWxpZ24sCkBAIC02MzUsNyArNjUzLDcgQEAKIAogCQlpZiAoKChyeGRlc2MuZGV2X2ZsYWdzICYgUlhET05FX1NJR05BTF9QTENQKSAmJgogCQkgICAgIChyYXRlLT5wbGNwID09IHJ4ZGVzYy5zaWduYWwpKSB8fAotCQkgICAgKCEocnhkZXNjLmRldl9mbGFncyAmIFJYRE9ORV9TSUdOQUxfUExDUCkgJiYKKwkJICAgICgocnhkZXNjLmRldl9mbGFncyAmIFJYRE9ORV9TSUdOQUxfQklUUkFURSkgJiYKIAkJICAgICAgKHJhdGUtPmJpdHJhdGUgPT0gcnhkZXNjLnNpZ25hbCkpKSB7CiAJCQlpZHggPSBpOwogCQkJYnJlYWs7CkBAIC02NTcsNiArNjc1LDEwIEBACiAJICAgIChyeGRlc2MuZGV2X2ZsYWdzICYgUlhET05FX01ZX0JTUykpCiAJCXJ0MngwMGxpYl91cGRhdGVfbGlua19zdGF0cygmcnQyeDAwZGV2LT5saW5rLCByeGRlc2MucnNzaSk7CiAKKwlydDJ4MDBkZWJ1Z191cGRhdGVfY3J5cHRvKHJ0MngwMGRldiwKKwkJCQkgIHJ4ZGVzYy5jaXBoZXIsCisJCQkJICByeGRlc2MuY2lwaGVyX3N0YXR1cyk7CisKIAlydDJ4MDBkZXYtPmxpbmsucXVhbC5yeF9zdWNjZXNzKys7CiAKIAlyeF9zdGF0dXMtPm1hY3RpbWUgPSByeGRlc2MudGltZXN0YW1wOwpAQCAtNzk2LDcgKzgxOCw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlczsKIAl1bnNpZ25lZCBpbnQgbnVtX3JhdGVzOwogCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGNoYXIgdHhfcG93ZXI7CiAKIAludW1fcmF0ZXMgPSAwOwogCWlmIChzcGVjLT5zdXBwb3J0ZWRfcmF0ZXMgJiBTVVBQT1JUX1JBVEVfQ0NLKQpAQCAtODIyLDIwICs4NDMsOSBAQAogCSAqIEluaXRpYWxpemUgQ2hhbm5lbCBsaXN0LgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fY2hhbm5lbHM7IGkrKykgewotCQlpZiAoc3BlYy0+Y2hhbm5lbHNbaV0uY2hhbm5lbCA8PSAxNCkgewotCQkJaWYgKHNwZWMtPnR4X3Bvd2VyX2JnKQotCQkJCXR4X3Bvd2VyID0gc3BlYy0+dHhfcG93ZXJfYmdbaV07Ci0JCQllbHNlCi0JCQkJdHhfcG93ZXIgPSBzcGVjLT50eF9wb3dlcl9kZWZhdWx0OwotCQl9IGVsc2UgewotCQkJaWYgKHNwZWMtPnR4X3Bvd2VyX2EpCi0JCQkJdHhfcG93ZXIgPSBzcGVjLT50eF9wb3dlcl9hW2ldOwotCQkJZWxzZQotCQkJCXR4X3Bvd2VyID0gc3BlYy0+dHhfcG93ZXJfZGVmYXVsdDsKLQkJfQotCiAJCXJ0MngwMGxpYl9jaGFubmVsKCZjaGFubmVsc1tpXSwKLQkJCQkgIHNwZWMtPmNoYW5uZWxzW2ldLmNoYW5uZWwsIHR4X3Bvd2VyLCBpKTsKKwkJCQkgIHNwZWMtPmNoYW5uZWxzW2ldLmNoYW5uZWwsCisJCQkJICBzcGVjLT5jaGFubmVsc19pbmZvW2ldLnR4X3Bvd2VyMSwgaSk7CiAJfQogCiAJLyoKQEAgLTg3OCw3ICs4ODgsNyBAQAogCiBzdGF0aWMgdm9pZCBydDJ4MDBsaWJfcmVtb3ZlX2h3KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7Ci0JaWYgKHRlc3RfYml0KERFVklDRV9SRUdJU1RFUkVEX0hXLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9SRUdJU1RFUkVEX0hXLCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHJ0MngwMGRldi0+aHcpOwogCiAJaWYgKGxpa2VseShydDJ4MDBkZXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0pKSB7CkBAIC04ODcsNiArODk3LDggQEAKIAkJcnQyeDAwZGV2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gTlVMTDsKIAkJcnQyeDAwZGV2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gTlVMTDsKIAl9CisKKwlrZnJlZShydDJ4MDBkZXYtPnNwZWMuY2hhbm5lbHNfaW5mbyk7CiB9CiAKIHN0YXRpYyBpbnQgcnQyeDAwbGliX3Byb2JlX2h3KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCkBAIC04OTQsNiArOTA2LDkgQEAKIAlzdHJ1Y3QgaHdfbW9kZV9zcGVjICpzcGVjID0gJnJ0MngwMGRldi0+c3BlYzsKIAlpbnQgc3RhdHVzOwogCisJaWYgKHRlc3RfYml0KERFVklDRV9TVEFURV9SRUdJU1RFUkVEX0hXLCAmcnQyeDAwZGV2LT5mbGFncykpCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBJbml0aWFsaXplIEhXIG1vZGVzLgogCSAqLwpAQCAtOTE1LDcgKzkzMCw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JX19zZXRfYml0KERFVklDRV9SRUdJU1RFUkVEX0hXLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJc2V0X2JpdChERVZJQ0VfU1RBVEVfUkVHSVNURVJFRF9IVywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MjUsNyArOTQwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgcnQyeDAwbGliX3VuaW5pdGlhbGl6ZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewotCWlmICghX190ZXN0X2FuZF9jbGVhcl9iaXQoREVWSUNFX0lOSVRJQUxJWkVELCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoREVWSUNFX1NUQVRFX0lOSVRJQUxJWkVELCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCS8qCkBAIC05NDgsNyArOTYzLDcgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKHRlc3RfYml0KERFVklDRV9JTklUSUFMSVpFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBVEVfSU5JVElBTElaRUQsICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtOTY3LDcgKzk4Miw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JX19zZXRfYml0KERFVklDRV9JTklUSUFMSVpFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpOworCXNldF9iaXQoREVWSUNFX1NUQVRFX0lOSVRJQUxJWkVELCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAkvKgogCSAqIFJlZ2lzdGVyIHRoZSBleHRyYSBjb21wb25lbnRzLgpAQCAtOTgxLDcgKzk5Niw3IEBACiB7CiAJaW50IHJldHZhbDsKIAotCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBUlRFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChERVZJQ0VfU1RBVEVfU1RBUlRFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC05OTksMjggKzEwMTQsMTggQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JLyoKLQkgKiBFbmFibGUgcmFkaW8uCi0JICovCi0JcmV0dmFsID0gcnQyeDAwbGliX2VuYWJsZV9yYWRpbyhydDJ4MDBkZXYpOwotCWlmIChyZXR2YWwpIHsKLQkJcnQyeDAwbGliX3VuaW5pdGlhbGl6ZShydDJ4MDBkZXYpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQogCXJ0MngwMGRldi0+aW50Zl9hcF9jb3VudCA9IDA7CiAJcnQyeDAwZGV2LT5pbnRmX3N0YV9jb3VudCA9IDA7CiAJcnQyeDAwZGV2LT5pbnRmX2Fzc29jaWF0ZWQgPSAwOwogCi0JX19zZXRfYml0KERFVklDRV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncyk7Ci0JX19zZXRfYml0KERFVklDRV9ESVJUWV9DT05GSUcsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwlzZXRfYml0KERFVklDRV9TVEFURV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBydDJ4MDBsaWJfc3RvcChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewotCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVJURUQsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChERVZJQ0VfU1RBVEVfU1RBUlRFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtMTAzMiw4ICsxMDM3LDYgQEAKIAlydDJ4MDBkZXYtPmludGZfYXBfY291bnQgPSAwOwogCXJ0MngwMGRldi0+aW50Zl9zdGFfY291bnQgPSAwOwogCXJ0MngwMGRldi0+aW50Zl9hc3NvY2lhdGVkID0gMDsKLQotCV9fY2xlYXJfYml0KERFVklDRV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncyk7CiB9CiAKIC8qCkBAIC0xMDQ5LDYgKzEwNTIsMTEgQEAKIAkgKi8KIAlydDJ4MDBkZXYtPmh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBydDJ4MDBfaW50Zik7CiAKKwlydDJ4MDBkZXYtPmh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0KKwkgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisKIAkvKgogCSAqIExldCB0aGUgZHJpdmVyIHByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZWN0IHRoZSBjYXBhYmlsaXRpZXMuCiAJICovCkBAIC0xMDg4LDcgKzEwOTYsNyBAQAogCXJ0MngwMHJma2lsbF9hbGxvY2F0ZShydDJ4MDBkZXYpOwogCXJ0MngwMGRlYnVnX3JlZ2lzdGVyKHJ0MngwMGRldik7CiAKLQlfX3NldF9iaXQoREVWSUNFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwlzZXRfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTEwMSw3ICsxMTA5LDcgQEAKIAogdm9pZCBydDJ4MDBsaWJfcmVtb3ZlX2RldihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewotCV9fY2xlYXJfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncyk7CisJY2xlYXJfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAkvKgogCSAqIERpc2FibGUgcmFkaW8uCkBAIC0xMTQ2LDE0ICsxMTU0LDE1IEBACiAJaW50IHJldHZhbDsKIAogCU5PVElDRShydDJ4MDBkZXYsICJHb2luZyB0byBzbGVlcC5cbiIpOwotCV9fY2xlYXJfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAkvKgogCSAqIE9ubHkgY29udGludWUgaWYgbWFjODAyMTEgaGFzIG9wZW4gaW50ZXJmYWNlcy4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSB8fAorCSAgICAhdGVzdF9iaXQoREVWSUNFX1NUQVRFX1NUQVJURUQsICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJZ290byBleGl0OwotCV9fc2V0X2JpdChERVZJQ0VfU1RBUlRFRF9TVVNQRU5ELCAmcnQyeDAwZGV2LT5mbGFncyk7CisKKwlzZXRfYml0KERFVklDRV9TVEFURV9TVEFSVEVEX1NVU1BFTkQsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAogCS8qCiAJICogRGlzYWJsZSByYWRpby4KQEAgLTEyMDMsOCArMTIxMiw4IEBACiAJLyoKIAkgKiBNYXN0ZXIgb3IgQWQtaG9jIG1vZGUgcmVxdWlyZSBhIG5ldyBiZWFjb24gdXBkYXRlLgogCSAqLwotCWlmICh2aWYtPnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgfHwKLQkgICAgdmlmLT50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCWludGYtPmRlbGF5ZWRfZmxhZ3MgfD0gREVMQVlFRF9VUERBVEVfQkVBQ09OOwogCiAJc3Bpbl91bmxvY2soJmludGYtPmxvY2spOwpAQCAtMTIyNSw3ICsxMjM0LDcgQEAKIAkvKgogCSAqIE9ubHkgY29udGludWUgaWYgbWFjODAyMTEgaGFkIG9wZW4gaW50ZXJmYWNlcy4KIAkgKi8KLQlpZiAoIV9fdGVzdF9hbmRfY2xlYXJfYml0KERFVklDRV9TVEFSVEVEX1NVU1BFTkQsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChERVZJQ0VfU1RBVEVfU1RBUlRFRF9TVVNQRU5ELCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTEyNTIsNyArMTI2MSw3IEBACiAJLyoKIAkgKiBXZSBhcmUgcmVhZHkgYWdhaW4gdG8gcmVjZWl2ZSByZXF1ZXN0cyBmcm9tIG1hYzgwMjExLgogCSAqLwotCV9fc2V0X2JpdChERVZJQ0VfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpOworCXNldF9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAogCS8qCiAJICogSXQgaXMgcG9zc2libGUgdGhhdCBkdXJpbmcgdGhhdCBtYWM4MDIxMSBoYXMgYXR0ZW1wdGVkCkBAIC0xMjcyLDcgKzEyODEsNyBAQAogCXJldHVybiAwOwogCiBleGl0OgotCXJ0MngwMGxpYl9kaXNhYmxlX3JhZGlvKHJ0MngwMGRldik7CisJcnQyeDAwbGliX3N0b3AocnQyeDAwZGV2KTsKIAlydDJ4MDBsaWJfdW5pbml0aWFsaXplKHJ0MngwMGRldik7CiAJcnQyeDAwZGVidWdfZGVyZWdpc3RlcihydDJ4MDBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKaW5kZXggYzVmYjNhNzIuLjc5N2ViNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKQEAgLTg4LDcgKzg4LDcgQEAKICAqLwogdm9pZCBydDJ4MDBsaWJfY29uZmlnX2ludGYoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCSAgIHN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiwKLQkJCSAgIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzIHR5cGUsCisJCQkgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkgICB1OCAqbWFjLCB1OCAqYnNzaWQpOwogdm9pZCBydDJ4MDBsaWJfY29uZmlnX2VycChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJICBzdHJ1Y3QgcnQyeDAwX2ludGYgKmludGYsCkBAIC0xODEsNiArMTgxLDggQEAKIHZvaWQgcnQyeDAwZGVidWdfZGVyZWdpc3RlcihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KTsKIHZvaWQgcnQyeDAwZGVidWdfZHVtcF9mcmFtZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJICAgIGVudW0gcnQyeDAwX2R1bXBfdHlwZSB0eXBlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgcnQyeDAwZGVidWdfdXBkYXRlX2NyeXB0byhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJICAgICAgIGVudW0gY2lwaGVyIGNpcGhlciwgZW51bSByeF9jcnlwdG8gc3RhdHVzKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwZGVidWdfcmVnaXN0ZXIoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKQEAgLTE5NSw5ICsxOTcsNTQgQEAKIAkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwZGVidWdfdXBkYXRlX2NyeXB0byhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJCQkgICAgIGVudW0gY2lwaGVyIGNpcGhlciwKKwkJCQkJICAgICBlbnVtIHJ4X2NyeXB0byBzdGF0dXMpCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfREVCVUdGUyAqLwogCiAvKgorICogQ3J5cHRvIGhhbmRsZXJzLgorICovCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPCitlbnVtIGNpcGhlciBydDJ4MDBjcnlwdG9fa2V5X3RvX2NpcGhlcihzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOwordW5zaWduZWQgaW50IHJ0MngwMGNyeXB0b190eF9vdmVyaGVhZChzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8pOwordm9pZCBydDJ4MDBjcnlwdG9fdHhfcmVtb3ZlX2l2KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpdl9sZW4pOwordm9pZCBydDJ4MDBjcnlwdG9fdHhfaW5zZXJ0X2l2KHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBydDJ4MDBjcnlwdG9fcnhfaW5zZXJ0X2l2KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBhbGlnbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbmd0aCwKKwkJCSAgICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBlbnVtIGNpcGhlciBydDJ4MDBjcnlwdG9fa2V5X3RvX2NpcGhlcihzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJcmV0dXJuIENJUEhFUl9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBydDJ4MDBjcnlwdG9fdHhfb3ZlcmhlYWQoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwY3J5cHRvX3R4X3JlbW92ZV9pdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBpdl9sZW4pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDJ4MDBjcnlwdG9fdHhfaW5zZXJ0X2l2KHN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDJ4MDBjcnlwdG9fcnhfaW5zZXJ0X2l2KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFsaWduLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoLAorCQkJCQkgICAgIHN0cnVjdCByeGRvbmVfZW50cnlfZGVzYyAqcnhkZXNjKQoreworfQorI2VuZGlmCisKKy8qCiAgKiBSRmtpbGwgaGFuZGxlcnMuCiAgKi8KICNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwppbmRleCBkMDY1MDczLi4yYzZjYzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCkBAIC0zNiwyMSArMzYsMjIgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGZyYWdfc2tiKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnJ0c19pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHNpemU7CisJdW5zaWduZWQgaW50IGRhdGFfbGVuZ3RoOworCWludCByZXR2YWwgPSAwOwogCiAJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpCi0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jdHMpOworCQlkYXRhX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2N0cyk7CiAJZWxzZQotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnRzKTsKKwkJZGF0YV9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9ydHMpOwogCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihzaXplICsgcnQyeDAwZGV2LT5ody0+ZXh0cmFfdHhfaGVhZHJvb20pOwotCWlmICghc2tiKSB7CisJc2tiID0gZGV2X2FsbG9jX3NrYihkYXRhX2xlbmd0aCArIHJ0MngwMGRldi0+aHctPmV4dHJhX3R4X2hlYWRyb29tKTsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJV0FSTklORyhydDJ4MDBkZXYsICJGYWlsZWQgdG8gY3JlYXRlIFJUUy9DVFMgZnJhbWUuXG4iKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlza2JfcmVzZXJ2ZShza2IsIHJ0MngwMGRldi0+aHctPmV4dHJhX3R4X2hlYWRyb29tKTsKLQlza2JfcHV0KHNrYiwgc2l6ZSk7CisJc2tiX3B1dChza2IsIGRhdGFfbGVuZ3RoKTsKIAogCS8qCiAJICogQ29weSBUWCBpbmZvcm1hdGlvbiBvdmVyIGZyb20gb3JpZ2luYWwgZnJhbWUgdG8KQEAgLTYzLDcgKzY0LDYgQEAKIAkgKi8KIAltZW1jcHkoc2tiLT5jYiwgZnJhZ19za2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOwogCXJ0c19pbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCXJ0c19pbmZvLT5jb250cm9sLmh3X2tleSA9IE5VTEw7CiAJcnRzX2luZm8tPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfQ1RMX1VTRV9SVFNfQ1RTOwogCXJ0c19pbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1Q7CiAJcnRzX2luZm8tPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfQ1RMX1JFUV9UWF9TVEFUVVM7CkBAIC03MywyMiArNzMsMzMgQEAKIAllbHNlCiAJCXJ0c19pbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7CiAKKwlza2ItPmRvX25vdF9lbmNyeXB0ID0gMTsKKworCS8qCisJICogUlRTL0NUUyBmcmFtZSBzaG91bGQgdXNlIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHBsdXMgYW55CisJICogZW5jcnlwdGlvbiBvdmVyaGVhZCB0aGF0IHdpbGwgYmUgYWRkZWQgYnkgdGhlIGhhcmR3YXJlLgorCSAqLworI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0NSWVBUTworCWlmICghZnJhZ19za2ItPmRvX25vdF9lbmNyeXB0KQorCQlkYXRhX2xlbmd0aCArPSBydDJ4MDBjcnlwdG9fdHhfb3ZlcmhlYWQodHhfaW5mbyk7CisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPICovCisKIAlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1VTRV9DVFNfUFJPVEVDVCkKIAkJaWVlZTgwMjExX2N0c3Rvc2VsZl9nZXQocnQyeDAwZGV2LT5odywgdHhfaW5mby0+Y29udHJvbC52aWYsCi0JCQkJCWZyYWdfc2tiLT5kYXRhLCBzaXplLCB0eF9pbmZvLAorCQkJCQlmcmFnX3NrYi0+ZGF0YSwgZGF0YV9sZW5ndGgsIHR4X2luZm8sCiAJCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2N0cyAqKShza2ItPmRhdGEpKTsKIAllbHNlCiAJCWllZWU4MDIxMV9ydHNfZ2V0KHJ0MngwMGRldi0+aHcsIHR4X2luZm8tPmNvbnRyb2wudmlmLAotCQkJCSAgZnJhZ19za2ItPmRhdGEsIHNpemUsIHR4X2luZm8sCisJCQkJICBmcmFnX3NrYi0+ZGF0YSwgZGF0YV9sZW5ndGgsIHR4X2luZm8sCiAJCQkJICAoc3RydWN0IGllZWU4MDIxMV9ydHMgKikoc2tiLT5kYXRhKSk7CiAKLQlpZiAocnQyeDAwcXVldWVfd3JpdGVfdHhfZnJhbWUocXVldWUsIHNrYikpIHsKKwlyZXR2YWwgPSBydDJ4MDBxdWV1ZV93cml0ZV90eF9mcmFtZShxdWV1ZSwgc2tiKTsKKwlpZiAocmV0dmFsKSB7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCVdBUk5JTkcocnQyeDAwZGV2LCAiRmFpbGVkIHRvIHNlbmQgUlRTL0NUUyBmcmFtZS5cbiIpOwotCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCi0JcmV0dXJuIE5FVERFVl9UWF9PSzsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBpbnQgcnQyeDAwbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTA2LDExICsxMTcsOCBAQAogCSAqIE5vdGUgdGhhdCB3ZSBjYW4gb25seSBzdG9wIHRoZSBUWCBxdWV1ZXMgaW5zaWRlIHRoZSBUWCBwYXRoCiAJICogZHVlIHRvIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucyBpbiBtYWM4MDIxMS4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpIHsKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKLQl9CisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlnb3RvIGV4aXRfZmFpbDsKIAogCS8qCiAJICogRGV0ZXJtaW5lIHdoaWNoIHF1ZXVlIHRvIHB1dCBwYWNrZXQgb24uCkBAIC0xNDEsMjYgKzE0OSwyNSBAQAogCWlmICgodHhfaW5mby0+ZmxhZ3MgJiAoSUVFRTgwMjExX1RYX0NUTF9VU0VfUlRTX0NUUyB8CiAJCQkgICAgICAgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpKSAmJgogCSAgICAhcnQyeDAwZGV2LT5vcHMtPmh3LT5zZXRfcnRzX3RocmVzaG9sZCkgewotCQlpZiAocnQyeDAwcXVldWVfYXZhaWxhYmxlKHF1ZXVlKSA8PSAxKSB7Ci0JCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShydDJ4MDBkZXYtPmh3LCBxaWQpOwotCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotCQl9CisJCWlmIChydDJ4MDBxdWV1ZV9hdmFpbGFibGUocXVldWUpIDw9IDEpCisJCQlnb3RvIGV4aXRfZmFpbDsKIAotCQlpZiAocnQyeDAwbWFjX3R4X3J0c19jdHMocnQyeDAwZGV2LCBxdWV1ZSwgc2tiKSkgewotCQkJaWVlZTgwMjExX3N0b3BfcXVldWUocnQyeDAwZGV2LT5odywgcWlkKTsKLQkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKLQkJfQorCQlpZiAocnQyeDAwbWFjX3R4X3J0c19jdHMocnQyeDAwZGV2LCBxdWV1ZSwgc2tiKSkKKwkJCWdvdG8gZXhpdF9mYWlsOwogCX0KIAotCWlmIChydDJ4MDBxdWV1ZV93cml0ZV90eF9mcmFtZShxdWV1ZSwgc2tiKSkgewotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShydDJ4MDBkZXYtPmh3LCBxaWQpOwotCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JfQorCWlmIChydDJ4MDBxdWV1ZV93cml0ZV90eF9mcmFtZShxdWV1ZSwgc2tiKSkKKwkJZ290byBleGl0X2ZhaWw7CiAKIAlpZiAocnQyeDAwcXVldWVfdGhyZXNob2xkKHF1ZXVlKSkKIAkJaWVlZTgwMjExX3N0b3BfcXVldWUocnQyeDAwZGV2LT5odywgcWlkKTsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CisKKyBleGl0X2ZhaWw6CisJaWVlZTgwMjExX3N0b3BfcXVldWUocnQyeDAwZGV2LT5odywgcWlkKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBtYWNfdHgpOwogCkBAIC0xNjgsNyArMTc1LDcgQEAKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CiAKLQlpZiAoIXRlc3RfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBydDJ4MDBsaWJfc3RhcnQocnQyeDAwZGV2KTsKQEAgLTE3OSw3ICsxODYsNyBAQAogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKIAotCWlmICghdGVzdF9iaXQoREVWSUNFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCiAJCXJldHVybjsKIAogCXJ0MngwMGxpYl9zdG9wKHJ0MngwMGRldik7CkBAIC0xOTksMTIgKzIwNiwxMiBAQAogCSAqIERvbid0IGFsbG93IGludGVyZmFjZXMgdG8gYmUgYWRkZWQKIAkgKiB0aGUgZGV2aWNlIGhhcyBkaXNhcHBlYXJlZC4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykgfHwKLQkgICAgIXRlc3RfYml0KERFVklDRV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpIHx8CisJICAgICF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfU1RBUlRFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAoY29uZi0+dHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJLyoKIAkJICogV2UgZG9uJ3Qgc3VwcG9ydCBtaXhlZCBjb21iaW5hdGlvbnMgb2YKIAkJICogc3RhIGFuZCBhcCBpbnRlcmZhY2VzLgpAQCAtMjIwLDggKzIyNyw4IEBACiAJCQlyZXR1cm4gLUVOT0JVRlM7CiAKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQkvKgogCQkgKiBXZSBkb24ndCBzdXBwb3J0IG1peGVkIGNvbWJpbmF0aW9ucyBvZgogCQkgKiBzdGEgYW5kIGFwIGludGVyZmFjZXMuCkBAIC0yNDksNyArMjU2LDcgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPmxpbWl0OyBpKyspIHsKIAkJZW50cnkgPSAmcXVldWUtPmVudHJpZXNbaV07Ci0JCWlmICghX190ZXN0X2FuZF9zZXRfYml0KEVOVFJZX0JDTl9BU1NJR05FRCwgJmVudHJ5LT5mbGFncykpCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChFTlRSWV9CQ05fQVNTSUdORUQsICZlbnRyeS0+ZmxhZ3MpKQogCQkJYnJlYWs7CiAJfQogCkBAIC0yNjEsNyArMjY4LDcgQEAKIAkgKiBpbmNyZWFzZSBpbnRlcmZhY2UgY291bnQgYW5kIHN0YXJ0IGluaXRpYWxpemF0aW9uLgogCSAqLwogCi0JaWYgKGNvbmYtPnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKGNvbmYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCXJ0MngwMGRldi0+aW50Zl9hcF9jb3VudCsrOwogCWVsc2UKIAkJcnQyeDAwZGV2LT5pbnRmX3N0YV9jb3VudCsrOwpAQCAtMjcwLDcgKzI3Nyw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmludGYtPnNlcWxvY2spOwogCWludGYtPmJlYWNvbiA9IGVudHJ5OwogCi0JaWYgKGNvbmYtPnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKGNvbmYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCW1lbWNweSgmaW50Zi0+YnNzaWQsIGNvbmYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAJbWVtY3B5KCZpbnRmLT5tYWMsIGNvbmYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKQEAgLTMwMywxMiArMzEwLDEyIEBACiAJICogZWl0aGVyIHRoZSBkZXZpY2UgaGFzIGRpc2FwcGVhcmVkIG9yIHdoZW4KIAkgKiBubyBpbnRlcmZhY2UgaXMgcHJlc2VudC4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykgfHwKLQkgICAgKGNvbmYtPnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYgIXJ0MngwMGRldi0+aW50Zl9hcF9jb3VudCkgfHwKLQkgICAgKGNvbmYtPnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYgIXJ0MngwMGRldi0+aW50Zl9zdGFfY291bnQpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSB8fAorCSAgICAoY29uZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJiAhcnQyeDAwZGV2LT5pbnRmX2FwX2NvdW50KSB8fAorCSAgICAoY29uZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJiAhcnQyeDAwZGV2LT5pbnRmX3N0YV9jb3VudCkpCiAJCXJldHVybjsKIAotCWlmIChjb25mLT50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKQorCWlmIChjb25mLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQogCQlydDJ4MDBkZXYtPmludGZfYXBfY291bnQtLTsKIAllbHNlCiAJCXJ0MngwMGRldi0+aW50Zl9zdGFfY291bnQtLTsKQEAgLTMxNyw1OSArMzI0LDU5IEBACiAJICogUmVsZWFzZSBiZWFjb24gZW50cnkgc28gaXQgaXMgYXZhaWxhYmxlIGZvcgogCSAqIG5ldyBpbnRlcmZhY2VzIGFnYWluLgogCSAqLwotCV9fY2xlYXJfYml0KEVOVFJZX0JDTl9BU1NJR05FRCwgJmludGYtPmJlYWNvbi0+ZmxhZ3MpOworCWNsZWFyX2JpdChFTlRSWV9CQ05fQVNTSUdORUQsICZpbnRmLT5iZWFjb24tPmZsYWdzKTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBic3NpZCBhbmQgbWFjIGFkZHJlc3MgcmVnaXN0ZXJzCiAJICogYXJlIGNsZWFyZWQgdG8gcHJldmVudCBmYWxzZSBBQ0tpbmcgb2YgZnJhbWVzLgogCSAqLwogCXJ0MngwMGxpYl9jb25maWdfaW50ZihydDJ4MDBkZXYsIGludGYsCi0JCQkgICAgICBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElELCBOVUxMLCBOVUxMKTsKKwkJCSAgICAgIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVELCBOVUxMLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMG1hY19yZW1vdmVfaW50ZXJmYWNlKTsKIAogaW50IHJ0MngwMG1hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKIHsKIAlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7Ci0JaW50IGZvcmNlX3JlY29uZmlnOworCWludCByYWRpb19vbjsKKwlpbnQgc3RhdHVzOwogCiAJLyoKIAkgKiBNYWM4MDIxMSBtaWdodCBiZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2hpbGUgd2UgYXJlIHRyeWluZwogCSAqIHRvIHJlbW92ZSB0aGUgZGV2aWNlIG9yIHBlcmhhcHMgc3VzcGVuZGluZyBpdC4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9QUkVTRU5ULCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogQ2hlY2sgaWYgd2UgbmVlZCB0byBkaXNhYmxlIHRoZSByYWRpbywKLQkgKiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgYXQgbGVhc3QgdGhlIFJYIG11c3QgYmUgZGlzYWJsZWQuCisJICogT25seSBjaGFuZ2UgZGV2aWNlIHN0YXRlIHdoZW4gdGhlIHJhZGlvIGlzIGVuYWJsZWQuIEl0IGRvZXMgbm90CisJICogbWF0dGVyIHdoYXQgcGFyYW1ldGVycyB3ZSBoYXZlIGNvbmZpZ3VyZWQgd2hlbiB0aGUgcmFkaW8gaXMgZGlzYWJsZWQKKwkgKiBiZWNhdXNlIHdlIHdvbid0IGJlIGFibGUgdG8gc2VuZCBvciByZWNlaXZlIGFueXdheS4gQWxzbyBub3RlIHRoYXQKKwkgKiBzb21lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAoZS5nLiBjaGFubmVsIGFuZCBhbnRlbm5hIHZhbHVlcykgY2FuCisJICogb25seSBiZSBzZXQgd2hlbiB0aGUgcmFkaW8gaXMgZW5hYmxlZC4KIAkgKi8KLQlpZiAodGVzdF9iaXQoREVWSUNFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkgewotCQlpZiAoIWNvbmYtPnJhZGlvX2VuYWJsZWQpCi0JCQlydDJ4MDBsaWJfZGlzYWJsZV9yYWRpbyhydDJ4MDBkZXYpOwotCQllbHNlCi0JCQlydDJ4MDBsaWJfdG9nZ2xlX3J4KHJ0MngwMGRldiwgU1RBVEVfUkFESU9fUlhfT0ZGKTsKLQl9CisJcmFkaW9fb24gPSB0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCWlmIChjb25mLT5yYWRpb19lbmFibGVkKSB7CisJCS8qIEZvciBwcm9ncmFtbWluZyB0aGUgdmFsdWVzLCB3ZSBoYXZlIHRvIHR1cm4gUlggb2ZmICovCisJCXJ0MngwMGxpYl90b2dnbGVfcngocnQyeDAwZGV2LCBTVEFURV9SQURJT19SWF9PRkYpOwogCi0JLyoKLQkgKiBXaGVuIHRoZSBERVZJQ0VfRElSVFlfQ09ORklHIGZsYWcgaXMgc2V0LCB0aGUgZGV2aWNlIGhhcyByZWNlbnRseQotCSAqIGJlZW4gc3RhcnRlZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBmb3JjZWQgdXBvbiB0aGUgaGFyZHdhcmUuCi0JICogT3RoZXJ3aXNlIHJlZ2lzdGVycyB3aWxsIG5vdCBiZSBpbnRpYWxpemVkIGNvcnJlY3RseSBhbmQgY291bGQKLQkgKiByZXN1bHQgaW4gbm9uLXdvcmtpbmcgaGFyZHdhcmUgYmVjYXVzZSBlc3NlbnRpYWwgcmVnaXN0ZXJzIGFyZW4ndAotCSAqIGluaXRpYWxpemVkLgotCSAqLwotCWZvcmNlX3JlY29uZmlnID0KLQkgICAgX190ZXN0X2FuZF9jbGVhcl9iaXQoREVWSUNFX0RJUlRZX0NPTkZJRywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCQkvKiBFbmFibGUgdGhlIHJhZGlvICovCisJCXN0YXR1cyA9IHJ0MngwMGxpYl9lbmFibGVfcmFkaW8ocnQyeDAwZGV2KTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cykpCisJCQlyZXR1cm4gc3RhdHVzOwogCi0JcnQyeDAwbGliX2NvbmZpZyhydDJ4MDBkZXYsIGNvbmYsIGZvcmNlX3JlY29uZmlnKTsKKwkJLyoKKwkJICogV2hlbiB3ZSd2ZSBqdXN0IHR1cm5lZCBvbiB0aGUgcmFkaW8sIHdlIHdhbnQgdG8gcmVwcm9ncmFtCisJCSAqIGV2ZXJ5dGhpbmcgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBzdGF0ZQorCQkgKi8KKwkJcnQyeDAwbGliX2NvbmZpZyhydDJ4MDBkZXYsIGNvbmYsICFyYWRpb19vbik7CiAKLQkvKgotCSAqIFJlZW5hYmxlIFJYIG9ubHkgaWYgdGhlIHJhZGlvIHNob3VsZCBiZSBvbi4KLQkgKi8KLQlpZiAodGVzdF9iaXQoREVWSUNFX0VOQUJMRURfUkFESU8sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJLyogVHVybiBSWCBiYWNrIG9uICovCiAJCXJ0MngwMGxpYl90b2dnbGVfcngocnQyeDAwZGV2LCBTVEFURV9SQURJT19SWF9PTik7Ci0JZWxzZSBpZiAoY29uZi0+cmFkaW9fZW5hYmxlZCkKLQkJcmV0dXJuIHJ0MngwMGxpYl9lbmFibGVfcmFkaW8ocnQyeDAwZGV2KTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIHRoZSByYWRpbyAqLworCQlydDJ4MDBsaWJfZGlzYWJsZV9yYWRpbyhydDJ4MDBkZXYpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMzg4LDcgKzM5NSw3IEBACiAJICogTWFjODAyMTEgbWlnaHQgYmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdoaWxlIHdlIGFyZSB0cnlpbmcKIAkgKiB0byByZW1vdmUgdGhlIGRldmljZSBvciBwZXJoYXBzIHN1c3BlbmRpbmcgaXQuCiAJICovCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2soJmludGYtPmxvY2spOwpAQCAtNDY3LDYgKzQ3NCw5MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbWFjX2NvbmZpZ3VyZV9maWx0ZXIpOwogCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfQ1JZUFRPCitpbnQgcnQyeDAwbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkgICAgICBjb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CisJaW50ICgqc2V0X2tleSkgKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQlzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byAqY3J5cHRvLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKKwlzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byBjcnlwdG87CisKKwlpZiAoIXRlc3RfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZWxzZSBpZiAoa2V5LT5rZXlsZW4gPiAzMikKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwltZW1zZXQoJmNyeXB0bywgMCwgc2l6ZW9mKGNyeXB0bykpOworCisJLyoKKwkgKiBXaGVuIGluIFNUQSBtb2RlLCBic3NpZHggaXMgYWx3YXlzIDAgb3RoZXJ3aXNlIGxvY2FsX2FkZHJlc3NbNV0KKwkgKiBjb250YWlucyB0aGUgYnNzIG51bWJlciwgc2VlIEJTU19JRF9NQVNLIGNvbW1lbnRzIGZvciBkZXRhaWxzLgorCSAqLworCWlmIChydDJ4MDBkZXYtPmludGZfc3RhX2NvdW50KQorCQljcnlwdG8uYnNzaWR4ID0gMDsKKwllbHNlCisJCWNyeXB0by5ic3NpZHggPQorCQkgICAgbG9jYWxfYWRkcmVzc1s1XSAmIChydDJ4MDBkZXYtPm9wcy0+bWF4X2FwX2ludGYgLSAxKTsKKworCWNyeXB0by5jaXBoZXIgPSBydDJ4MDBjcnlwdG9fa2V5X3RvX2NpcGhlcihrZXkpOworCWlmIChjcnlwdG8uY2lwaGVyID09IENJUEhFUl9OT05FKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljcnlwdG8uY21kID0gY21kOworCWNyeXB0by5hZGRyZXNzID0gYWRkcmVzczsKKworCWlmIChjcnlwdG8uY2lwaGVyID09IENJUEhFUl9US0lQKSB7CisJCWlmIChrZXktPmtleWxlbiA+IE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWSkKKwkJCW1lbWNweSgmY3J5cHRvLmtleSwKKwkJCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX0VOQ1JfS0VZXSwKKwkJCSAgICAgICBzaXplb2YoY3J5cHRvLmtleSkpOworCisJCWlmIChrZXktPmtleWxlbiA+IE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZKQorCQkJbWVtY3B5KCZjcnlwdG8udHhfbWljLAorCQkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWV0sCisJCQkgICAgICAgc2l6ZW9mKGNyeXB0by50eF9taWMpKTsKKworCQlpZiAoa2V5LT5rZXlsZW4gPiBOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWSkKKwkJCW1lbWNweSgmY3J5cHRvLnJ4X21pYywKKwkJCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1JYX01JQ19LRVldLAorCQkJICAgICAgIHNpemVvZihjcnlwdG8ucnhfbWljKSk7CisJfSBlbHNlCisJCW1lbWNweSgmY3J5cHRvLmtleSwgJmtleS0+a2V5WzBdLCBrZXktPmtleWxlbik7CisKKwkvKgorCSAqIEVhY2ggQlNTIGhhcyBhIG1heGltdW0gb2YgNCBzaGFyZWQga2V5cy4KKwkgKiBTaGFyZWQga2V5IGluZGV4IHZhbHVlczoKKwkgKgkwKSBCU1MwIGtleTAKKwkgKgkxKSBCU1MwIGtleTEKKwkgKgkuLi4KKwkgKgk0KSBCU1MxIGtleTAKKwkgKgkuLi4KKwkgKgk4KSBCU1MyIGtleTAKKwkgKgkuLi4KKwkgKiBCb3RoIHBhaXJ3aXNlIGFzIHNoYXJlZCBrZXkgaW5kZWNlcyBhcmUgZGV0ZXJtaW5lZCBieQorCSAqIGRyaXZlci4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBoYXJkd2FyZSByZXF1aXJlcworCSAqIGtleXMgdG8gYmUgYXNzaWduZWQgaW4gY29ycmVjdCBvcmRlciAoV2hlbiBrZXkgMSBpcworCSAqIHByb3ZpZGVkIGJ1dCBrZXkgMCBpcyBub3QsIHRoZW4gdGhlIGtleSBpcyBub3QgZm91bmQKKwkgKiBieSB0aGUgaGFyZHdhcmUgZHVyaW5nIFJYKS4KKwkgKi8KKwlpZiAoY21kID09IFNFVF9LRVkpCisJCWtleS0+aHdfa2V5X2lkeCA9IDA7CisKKwlpZiAoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkKKwkJc2V0X2tleSA9IHJ0MngwMGRldi0+b3BzLT5saWItPmNvbmZpZ19wYWlyd2lzZV9rZXk7CisJZWxzZQorCQlzZXRfa2V5ID0gcnQyeDAwZGV2LT5vcHMtPmxpYi0+Y29uZmlnX3NoYXJlZF9rZXk7CisKKwlpZiAoIXNldF9rZXkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiBzZXRfa2V5KHJ0MngwMGRldiwgJmNyeXB0bywga2V5KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMG1hY19zZXRfa2V5KTsKKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8gKi8KKwogaW50IHJ0MngwMG1hY19nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCiB7CkBAIC01NzUsMTAgKzY2NywxMSBAQAogCQlxdWV1ZS0+Y3dfbWF4ID0gMTA7IC8qIGN3X21pbjogMl4xMCA9IDEwMjQuICovCiAKIAlxdWV1ZS0+YWlmcyA9IHBhcmFtcy0+YWlmczsKKwlxdWV1ZS0+dHhvcCA9IHBhcmFtcy0+dHhvcDsKIAogCUlORk8ocnQyeDAwZGV2LAotCSAgICAgIkNvbmZpZ3VyZWQgVFggcXVldWUgJWQgLSBDV21pbjogJWQsIENXbWF4OiAlZCwgQWlmczogJWQuXG4iLAotCSAgICAgcXVldWVfaWR4LCBxdWV1ZS0+Y3dfbWluLCBxdWV1ZS0+Y3dfbWF4LCBxdWV1ZS0+YWlmcyk7CisJICAgICAiQ29uZmlndXJlZCBUWCBxdWV1ZSAlZCAtIENXbWluOiAlZCwgQ1dtYXg6ICVkLCBBaWZzOiAlZCwgVFhvcDogJWQuXG4iLAorCSAgICAgcXVldWVfaWR4LCBxdWV1ZS0+Y3dfbWluLCBxdWV1ZS0+Y3dfbWF4LCBxdWV1ZS0+YWlmcywgcXVldWUtPnR4b3ApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCmluZGV4IDg5OGNkZDcuLjQ1MWQ0MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCkBAIC0zMywxMCArMzMsMTEgQEAKIHN0cnVjdCBza19idWZmICpydDJ4MDBxdWV1ZV9hbGxvY19yeHNrYihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCQlzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5KQogewotCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOwotCXVuc2lnbmVkIGludCByZXNlcnZlZF9zaXplOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjOworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOworCXVuc2lnbmVkIGludCBoZWFkX3NpemUgPSAwOworCXVuc2lnbmVkIGludCB0YWlsX3NpemUgPSAwOwogCiAJLyoKIAkgKiBUaGUgZnJhbWUgc2l6ZSBpbmNsdWRlcyBkZXNjcmlwdG9yIHNpemUsIGJlY2F1c2UgdGhlCkBAIC00OSwxNiArNTAsMzIgQEAKIAkgKiB0aGlzIG1lYW5zIHdlIG5lZWQgYXQgbGVhc3QgMyBieXRlcyBmb3IgbW92aW5nIHRoZSBmcmFtZQogCSAqIGludG8gdGhlIGNvcnJlY3Qgb2Zmc2V0LgogCSAqLwotCXJlc2VydmVkX3NpemUgPSA0OworCWhlYWRfc2l6ZSA9IDQ7CisKKwkvKgorCSAqIEZvciBJVi9FSVYvSUNWIGFzc2VtYmx5IHdlIG11c3QgbWFrZSBzdXJlIHRoZXJlIGlzCisJICogYXQgbGVhc3QgOCBieXRlcyBieXRlcyBhdmFpbGFibGUgaW4gaGVhZHJvb20gZm9yIElWL0VJVgorCSAqIGFuZCA0IGJ5dGVzIGZvciBJQ1YgZGF0YSBhcyB0YWlscm9vbi4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8KKwlpZiAodGVzdF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQ1JZUFRPLCAmcnQyeDAwZGV2LT5mbGFncykpIHsKKwkJaGVhZF9zaXplICs9IDg7CisJCXRhaWxfc2l6ZSArPSA0OworCX0KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9DUllQVE8gKi8KIAogCS8qCiAJICogQWxsb2NhdGUgc2tidWZmZXIuCiAJICovCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZV9zaXplICsgcmVzZXJ2ZWRfc2l6ZSk7CisJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZV9zaXplICsgaGVhZF9zaXplICsgdGFpbF9zaXplKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlza2JfcmVzZXJ2ZShza2IsIHJlc2VydmVkX3NpemUpOworCS8qCisJICogTWFrZSBzdXJlIHdlIG5vdCBoYXZlIGEgZnJhbWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJ5dGVzCisJICogYXZhaWxhYmxlIGluIHRoZSBoZWFkIGFuZCB0YWlsLgorCSAqLworCXNrYl9yZXNlcnZlKHNrYiwgaGVhZF9zaXplKTsKIAlza2JfcHV0KHNrYiwgZnJhbWVfc2l6ZSk7CiAKIAkvKgpAQCAtODMsOCArMTAwLDIxIEBACiB7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKHNrYik7CiAKLQlza2JkZXNjLT5za2JfZG1hID0gZG1hX21hcF9zaW5nbGUocnQyeDAwZGV2LT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJCSAgRE1BX1RPX0RFVklDRSk7CisJLyoKKwkgKiBJZiBkZXZpY2UgaGFzIHJlcXVlc3RlZCBoZWFkcm9vbSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0CisJICogaXMgYWxzbyBtYXBwZWQgdG8gdGhlIERNQSBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgdHJhbnNmZXJpbmcKKwkgKiBhZGRpdGlvbmFsIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gdG8gdGhlIGhhcmR3YXJlLgorCSAqLworCXNrYl9wdXNoKHNrYiwgcnQyeDAwZGV2LT5ody0+ZXh0cmFfdHhfaGVhZHJvb20pOworCisJc2tiZGVzYy0+c2tiX2RtYSA9CisJICAgIGRtYV9tYXBfc2luZ2xlKHJ0MngwMGRldi0+ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKworCS8qCisJICogUmVzdG9yZSBkYXRhIHBvaW50ZXIgdG8gb3JpZ2luYWwgbG9jYXRpb24gYWdhaW4uCisJICovCisJc2tiX3B1bGwoc2tiLCBydDJ4MDBkZXYtPmh3LT5leHRyYV90eF9oZWFkcm9vbSk7CisKIAlza2JkZXNjLT5mbGFncyB8PSBTS0JERVNDX0RNQV9NQVBQRURfVFg7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBxdWV1ZV9tYXBfdHhza2IpOwpAQCAtMTAwLDcgKzEzMCwxMiBAQAogCX0KIAogCWlmIChza2JkZXNjLT5mbGFncyAmIFNLQkRFU0NfRE1BX01BUFBFRF9UWCkgewotCQlkbWFfdW5tYXBfc2luZ2xlKHJ0MngwMGRldi0+ZGV2LCBza2JkZXNjLT5za2JfZG1hLCBza2ItPmxlbiwKKwkJLyoKKwkJICogQWRkIGhlYWRyb29tIHRvIHRoZSBza2IgbGVuZ3RoLCBpdCBoYXMgYmVlbiByZW1vdmVkCisJCSAqIGJ5IHRoZSBkcml2ZXIsIGJ1dCBpdCB3YXMgYWN0dWFsbHkgbWFwcGVkIHRvIERNQS4KKwkJICovCisJCWRtYV91bm1hcF9zaW5nbGUocnQyeDAwZGV2LT5kZXYsIHNrYmRlc2MtPnNrYl9kbWEsCisJCQkJIHNrYi0+bGVuICsgcnQyeDAwZGV2LT5ody0+ZXh0cmFfdHhfaGVhZHJvb20sCiAJCQkJIERNQV9UT19ERVZJQ0UpOwogCQlza2JkZXNjLT5mbGFncyAmPSB+U0tCREVTQ19ETUFfTUFQUEVEX1RYOwogCX0KQEAgLTEyMCw3ICsxNTUsNiBAQAogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGVudHJ5LT5za2IpOwotCXN0cnVjdCBydDJ4MDBfaW50ZiAqaW50ZiA9IHZpZl90b19pbnRmKHR4X2luZm8tPmNvbnRyb2wudmlmKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopZW50cnktPnNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUgPQogCSAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUocnQyeDAwZGV2LT5odywgdHhfaW5mbyk7CkBAIC0xNDAsNyArMTc0LDcgQEAKIAl0eGRlc2MtPmN3X21heCA9IGVudHJ5LT5xdWV1ZS0+Y3dfbWF4OwogCXR4ZGVzYy0+YWlmcyA9IGVudHJ5LT5xdWV1ZS0+YWlmczsKIAotCS8qIERhdGEgbGVuZ3RoIHNob3VsZCBiZSBleHRlbmRlZCB3aXRoIDQgYnl0ZXMgZm9yIENSQyAqLworCS8qIERhdGEgbGVuZ3RoICsgQ1JDICsgSVYvRUlWL0lDVi9NTUlDICh3aGVuIHVzaW5nIGVuY3J5cHRpb24pICovCiAJZGF0YV9sZW5ndGggPSBlbnRyeS0+c2tiLT5sZW4gKyA0OwogCiAJLyoKQEAgLTE0OSw2ICsxODMsMzUgQEAKIAlpZiAoISh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKIAkJX19zZXRfYml0KEVOVFJZX1RYRF9BQ0ssICZ0eGRlc2MtPmZsYWdzKTsKIAorI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0NSWVBUTworCWlmICh0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19DUllQVE8sICZydDJ4MDBkZXYtPmZsYWdzKSAmJgorCSAgICAhZW50cnktPnNrYi0+ZG9fbm90X2VuY3J5cHQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqaHdfa2V5ID0gdHhfaW5mby0+Y29udHJvbC5od19rZXk7CisKKwkJX19zZXRfYml0KEVOVFJZX1RYRF9FTkNSWVBULCAmdHhkZXNjLT5mbGFncyk7CisKKwkJdHhkZXNjLT5jaXBoZXIgPSBydDJ4MDBjcnlwdG9fa2V5X3RvX2NpcGhlcihod19rZXkpOworCisJCWlmIChod19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKQorCQkJX19zZXRfYml0KEVOVFJZX1RYRF9FTkNSWVBUX1BBSVJXSVNFLCAmdHhkZXNjLT5mbGFncyk7CisKKwkJdHhkZXNjLT5rZXlfaWR4ID0gaHdfa2V5LT5od19rZXlfaWR4OworCQl0eGRlc2MtPml2X29mZnNldCA9IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKGVudHJ5LT5za2IpOworCisJCS8qCisJCSAqIEV4dGVuZCBmcmFtZSBsZW5ndGggdG8gaW5jbHVkZSBhbGwgZW5jcnlwdGlvbiBvdmVyaGVhZAorCQkgKiB0aGF0IHdpbGwgYmUgYWRkZWQgYnkgdGhlIGhhcmR3YXJlLgorCQkgKi8KKwkJZGF0YV9sZW5ndGggKz0gcnQyeDAwY3J5cHRvX3R4X292ZXJoZWFkKHR4X2luZm8pOworCisJCWlmICghKGh3X2tleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKQorCQkJX19zZXRfYml0KEVOVFJZX1RYRF9FTkNSWVBUX0lWLCAmdHhkZXNjLT5mbGFncyk7CisKKwkJaWYgKCEoaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDKSkKKwkJCV9fc2V0X2JpdChFTlRSWV9UWERfRU5DUllQVF9NTUlDLCAmdHhkZXNjLT5mbGFncyk7CisJfQorI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0NSWVBUTyAqLworCiAJLyoKIAkgKiBDaGVjayBpZiB0aGlzIGlzIGEgUlRTL0NUUyBmcmFtZQogCSAqLwpAQCAtMjE0LDE2ICsyNzcsMjIgQEAKIAkgKiBzZXF1ZW5jZSBjb3VudGVyIGdpdmVuIGJ5IG1hYzgwMjExLgogCSAqLwogCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQVNTSUdOX1NFUSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+c2VxbG9jaywgaXJxZmxhZ3MpOworCQlpZiAobGlrZWx5KHR4X2luZm8tPmNvbnRyb2wudmlmKSkgeworCQkJc3RydWN0IHJ0MngwMF9pbnRmICppbnRmOwogCi0JCWlmICh0ZXN0X2JpdChFTlRSWV9UWERfRklSU1RfRlJBR01FTlQsICZ0eGRlc2MtPmZsYWdzKSkKLQkJCWludGYtPnNlcW5vICs9IDB4MTA7Ci0JCWhkci0+c2VxX2N0cmwgJj0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7Ci0JCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoaW50Zi0+c2Vxbm8pOworCQkJaW50ZiA9IHZpZl90b19pbnRmKHR4X2luZm8tPmNvbnRyb2wudmlmKTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5zZXFsb2NrLCBpcnFmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+c2VxbG9jaywgaXJxZmxhZ3MpOwogCi0JCV9fc2V0X2JpdChFTlRSWV9UWERfR0VORVJBVEVfU0VRLCAmdHhkZXNjLT5mbGFncyk7CisJCQlpZiAodGVzdF9iaXQoRU5UUllfVFhEX0ZJUlNUX0ZSQUdNRU5ULCAmdHhkZXNjLT5mbGFncykpCisJCQkJaW50Zi0+c2Vxbm8gKz0gMHgxMDsKKwkJCWhkci0+c2VxX2N0cmwgJj0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7CisJCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KGludGYtPnNlcW5vKTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+c2VxbG9jaywgaXJxZmxhZ3MpOworCisJCQlfX3NldF9iaXQoRU5UUllfVFhEX0dFTkVSQVRFX1NFUSwgJnR4ZGVzYy0+ZmxhZ3MpOworCQl9CiAJfQogCiAJLyoKQEAgLTMwNSwxMSArMzc0LDEyIEBACiAJc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeSA9IHJ0MngwMHF1ZXVlX2dldF9lbnRyeShxdWV1ZSwgUV9JTkRFWCk7CiAJc3RydWN0IHR4ZW50cnlfZGVzYyB0eGRlc2M7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjOworCXVuc2lnbmVkIGludCBpdl9sZW4gPSAwOwogCiAJaWYgKHVubGlrZWx5KHJ0MngwMHF1ZXVlX2Z1bGwocXVldWUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoX190ZXN0X2FuZF9zZXRfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKSkgeworCWlmICh0ZXN0X2FuZF9zZXRfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKSkgewogCQlFUlJPUihxdWV1ZS0+cnQyeDAwZGV2LAogCQkgICAgICAiQXJyaXZlZCBhdCBub24tZnJlZSBlbnRyeSBpbiB0aGUgbm9uLWZ1bGwgcXVldWUgJWQuXG4iCiAJCSAgICAgICJQbGVhc2UgZmlsZSBidWcgcmVwb3J0IHRvICVzLlxuIiwKQEAgLTMyNSwyMiArMzk1LDQ0IEBACiAJZW50cnktPnNrYiA9IHNrYjsKIAlydDJ4MDBxdWV1ZV9jcmVhdGVfdHhfZGVzY3JpcHRvcihlbnRyeSwgJnR4ZGVzYyk7CiAKKwlpZiAoSUVFRTgwMjExX1NLQl9DQihza2IpLT5jb250cm9sLmh3X2tleSAhPSBOVUxMKQorCQlpdl9sZW4gPSBJRUVFODAyMTFfU0tCX0NCKHNrYiktPmNvbnRyb2wuaHdfa2V5LT5pdl9sZW47CisKIAkvKgotCSAqIHNrYi0+Y2IgYXJyYXkgaXMgbm93IG91cnMgYW5kIHdlIGFyZSBmcmVlIHRvIHVzZSBpdC4KKwkgKiBBbGwgaW5mb3JtYXRpb24gaXMgcmV0cmVpdmVkIGZyb20gdGhlIHNrYi0+Y2IgYXJyYXksCisJICogbm93IHdlIHNob3VsZCBjbGFpbSBvd25lcnNoaXAgb2YgdGhlIGRyaXZlciBwYXJ0IG9mIHRoYXQKKwkgKiBhcnJheS4KIAkgKi8KIAlza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKGVudHJ5LT5za2IpOwogCW1lbXNldChza2JkZXNjLCAwLCBzaXplb2YoKnNrYmRlc2MpKTsKIAlza2JkZXNjLT5lbnRyeSA9IGVudHJ5OwogCisJLyoKKwkgKiBXaGVuIGhhcmR3YXJlIGVuY3J5cHRpb24gaXMgc3VwcG9ydGVkLCBhbmQgdGhpcyBmcmFtZQorCSAqIGlzIHRvIGJlIGVuY3J5cHRlZCwgd2Ugc2hvdWxkIHN0cmlwIHRoZSBJVi9FSVYgZGF0YSBmcm9tCisJICogdGhlIGZyYW1lIHNvIHdlIGNhbiBwcm92aWRlIGl0IHRvIHRoZSBkcml2ZXIgc2VwZXJhdGVseS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoRU5UUllfVFhEX0VOQ1JZUFQsICZ0eGRlc2MuZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChFTlRSWV9UWERfRU5DUllQVF9JViwgJnR4ZGVzYy5mbGFncykpIHsKKwkJcnQyeDAwY3J5cHRvX3R4X3JlbW92ZV9pdihza2IsIGl2X2xlbik7CisJfQorCisJLyoKKwkgKiBJdCBjb3VsZCBiZSBwb3NzaWJsZSB0aGF0IHRoZSBxdWV1ZSB3YXMgY29ycnVwdGVkIGFuZCB0aGlzCisJICogY2FsbCBmYWlsZWQuIEp1c3QgZHJvcCB0aGUgZnJhbWUsIHdlIGNhbm5vdCByb2xsYmFjayBhbmQgcGFzcworCSAqIHRoZSBmcmFtZSB0byBtYWM4MDIxMSBiZWNhdXNlIHRoZSBza2ItPmNiIGhhcyBub3cgYmVlbiB0YWludGVkLgorCSAqLwogCWlmICh1bmxpa2VseShxdWV1ZS0+cnQyeDAwZGV2LT5vcHMtPmxpYi0+d3JpdGVfdHhfZGF0YShlbnRyeSkpKSB7Ci0JCV9fY2xlYXJfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKTsKLQkJcmV0dXJuIC1FSU87CisJCWNsZWFyX2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CisJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCQllbnRyeS0+c2tiID0gTlVMTDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHRlc3RfYml0KERSSVZFUl9SRVFVSVJFX0RNQSwgJnF1ZXVlLT5ydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcnQyeDAwcXVldWVfbWFwX3R4c2tiKHF1ZXVlLT5ydDJ4MDBkZXYsIHNrYik7CiAKLQlfX3NldF9iaXQoRU5UUllfREFUQV9QRU5ESU5HLCAmZW50cnktPmZsYWdzKTsKKwlzZXRfYml0KEVOVFJZX0RBVEFfUEVORElORywgJmVudHJ5LT5mbGFncyk7CiAKIAlydDJ4MDBxdWV1ZV9pbmRleF9pbmMocXVldWUsIFFfSU5ERVgpOwogCXJ0MngwMHF1ZXVlX3dyaXRlX3R4X2Rlc2NyaXB0b3IoZW50cnksICZ0eGRlc2MpOwpAQCAtNjUzLDYgKzc0NSw3IEBACiAKIAlxdWV1ZS0+cnQyeDAwZGV2ID0gcnQyeDAwZGV2OwogCXF1ZXVlLT5xaWQgPSBxaWQ7CisJcXVldWUtPnR4b3AgPSAwOwogCXF1ZXVlLT5haWZzID0gMjsKIAlxdWV1ZS0+Y3dfbWluID0gNTsKIAlxdWV1ZS0+Y3dfbWF4ID0gMTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5oCmluZGV4IGZmNzhlNTIuLjlkYmYwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5oCkBAIC04NywxMCArODcsMTMgQEAKICAqCiAgKiBAU0tCREVTQ19ETUFfTUFQUEVEX1JYOiAmc2tiX2RtYSBmaWVsZCBoYXMgYmVlbiBtYXBwZWQgZm9yIFJYCiAgKiBAU0tCREVTQ19ETUFfTUFQUEVEX1RYOiAmc2tiX2RtYSBmaWVsZCBoYXMgYmVlbiBtYXBwZWQgZm9yIFRYCisgKiBARlJBTUVfREVTQ19JVl9TVFJJUFBFRDogRnJhbWUgY29udGFpbmVkIGEgSVYvRUlWIHByb3ZpZGVkIGJ5CisgKgltYWM4MDIxMSBidXQgd2FzIHN0cmlwcGVkIGZvciBwcm9jZXNzaW5nIGJ5IHRoZSBkcml2ZXIuCiAgKi8KIGVudW0gc2tiX2ZyYW1lX2Rlc2NfZmxhZ3MgewotCVNLQkRFU0NfRE1BX01BUFBFRF9SWCA9ICgxIDw8IDApLAotCVNLQkRFU0NfRE1BX01BUFBFRF9UWCA9ICgxIDw8IDEpLAorCVNLQkRFU0NfRE1BX01BUFBFRF9SWCA9IDEgPDwgMCwKKwlTS0JERVNDX0RNQV9NQVBQRURfVFggPSAxIDw8IDEsCisJRlJBTUVfREVTQ19JVl9TVFJJUFBFRCA9IDEgPDwgMiwKIH07CiAKIC8qKgpAQCAtMTA0LDYgKzEwNyw4IEBACiAgKiBAZGVzYzogUG9pbnRlciB0byBkZXNjcmlwdG9yIHBhcnQgb2YgdGhlIGZyYW1lLgogICoJTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBjb3VsZCBwb2ludCB0byBzb21ldGhpbmcgb3V0c2lkZQogICoJb2YgdGhlIHNjb3BlIG9mIHRoZSBza2ItPmRhdGEgcG9pbnRlci4KKyAqIEBpdjogSVYgZGF0YSB1c2VkIGR1cmluZyBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCisgKiBAZWl2OiBFSVYgZGF0YSB1c2VkIGR1cmluZyBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCiAgKiBAc2tiX2RtYTogKFBDSS1vbmx5KSB0aGUgRE1BIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzayBidWZmZXIuCiAgKiBAZW50cnk6IFRoZSBlbnRyeSB0byB3aGljaCB0aGlzIHNrIGJ1ZmZlciBiZWxvbmdzLgogICovCkBAIC0xMTMsNiArMTE4LDkgQEAKIAl1bnNpZ25lZCBpbnQgZGVzY19sZW47CiAJdm9pZCAqZGVzYzsKIAorCV9fbGUzMiBpdjsKKwlfX2xlMzIgZWl2OworCiAJZG1hX2FkZHJfdCBza2JfZG1hOwogCiAJc3RydWN0IHF1ZXVlX2VudHJ5ICplbnRyeTsKQEAgLTEzMiwxMyArMTQwLDE0IEBACiAvKioKICAqIGVudW0gcnhkb25lX2VudHJ5X2Rlc2NfZmxhZ3M6IEZsYWdzIGZvciAmc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjCiAgKgotICogQFJYRE9ORV9TSUdOQUxfUExDUDogRG9lcyB0aGUgc2lnbmFsIGZpZWxkIGNvbnRhaW4gdGhlIHBsY3AgdmFsdWUsCi0gKglvciBkb2VzIGl0IGNvbnRhaW4gdGhlIGJpdHJhdGUgaXRzZWxmLgorICogQFJYRE9ORV9TSUdOQUxfUExDUDogU2lnbmFsIGZpZWxkIGNvbnRhaW5zIHRoZSBwbGNwIHZhbHVlLgorICogQFJYRE9ORV9TSUdOQUxfQklUUkFURTogU2lnbmFsIGZpZWxkIGNvbnRhaW5zIHRoZSBiaXRyYXRlIHZhbHVlLgogICogQFJYRE9ORV9NWV9CU1M6IERvZXMgdGhpcyBmcmFtZSBvcmlnaW5hdGUgZnJvbSBkZXZpY2UncyBCU1MuCiAgKi8KIGVudW0gcnhkb25lX2VudHJ5X2Rlc2NfZmxhZ3MgewogCVJYRE9ORV9TSUdOQUxfUExDUCA9IDEgPDwgMCwKLQlSWERPTkVfTVlfQlNTID0gMSA8PCAxLAorCVJYRE9ORV9TSUdOQUxfQklUUkFURSA9IDEgPDwgMSwKKwlSWERPTkVfTVlfQlNTID0gMSA8PCAyLAogfTsKIAogLyoqCkBAIC0xNTIsNyArMTYxLDExIEBACiAgKiBAc2l6ZTogRGF0YSBzaXplIG9mIHRoZSByZWNlaXZlZCBmcmFtZS4KICAqIEBmbGFnczogTUFDODAyMTEgcmVjZWl2ZSBmbGFncyAoU2VlICZlbnVtIG1hYzgwMjExX3J4X2ZsYWdzKS4KICAqIEBkZXZfZmxhZ3M6IFJhbGluayByZWNlaXZlIGZsYWdzIChTZWUgJmVudW0gcnhkb25lX2VudHJ5X2Rlc2NfZmxhZ3MpLgotCisgKiBAY2lwaGVyOiBDaXBoZXIgdHlwZSB1c2VkIGR1cmluZyBkZWNyeXB0aW9uLgorICogQGNpcGhlcl9zdGF0dXM6IERlY3J5cHRpb24gc3RhdHVzLgorICogQGl2OiBJViBkYXRhIHVzZWQgZHVyaW5nIGRlY3J5cHRpb24uCisgKiBAZWl2OiBFSVYgZGF0YSB1c2VkIGR1cmluZyBkZWNyeXB0aW9uLgorICogQGljdjogSUNWIGRhdGEgdXNlZCBkdXJpbmcgZGVjcnlwdGlvbi4KICAqLwogc3RydWN0IHJ4ZG9uZV9lbnRyeV9kZXNjIHsKIAl1NjQgdGltZXN0YW1wOwpAQCAtMTYxLDYgKzE3NCwxMiBAQAogCWludCBzaXplOwogCWludCBmbGFnczsKIAlpbnQgZGV2X2ZsYWdzOworCXU4IGNpcGhlcjsKKwl1OCBjaXBoZXJfc3RhdHVzOworCisJX19sZTMyIGl2OworCV9fbGUzMiBlaXY7CisJX19sZTMyIGljdjsKIH07CiAKIC8qKgpAQCAtMjA2LDYgKzIyNSwxMCBAQAogICogQEVOVFJZX1RYRF9CVVJTVDogVGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIGJ1cnN0IGV2ZW50LgogICogQEVOVFJZX1RYRF9BQ0s6IEFuIEFDSyBpcyByZXF1aXJlZCBmb3IgdGhpcyBmcmFtZS4KICAqIEBFTlRSWV9UWERfUkVUUllfTU9ERTogV2hlbiBzZXQsIHRoZSBsb25nIHJldHJ5IGNvdW50IGlzIHVzZWQuCisgKiBARU5UUllfVFhEX0VOQ1JZUFQ6IFRoaXMgZnJhbWUgc2hvdWxkIGJlIGVuY3J5cHRlZC4KKyAqIEBFTlRSWV9UWERfRU5DUllQVF9QQUlSV0lTRTogVXNlIHBhaXJ3aXNlIGtleSB0YWJsZSAoaW5zdGVhZCBvZiBzaGFyZWQpLgorICogQEVOVFJZX1RYRF9FTkNSWVBUX0lWOiBHZW5lcmF0ZSBJVi9FSVYgaW4gaGFyZHdhcmUuCisgKiBARU5UUllfVFhEX0VOQ1JZUFRfTU1JQzogR2VuZXJhdGUgTUlDIGluIGhhcmR3YXJlLgogICovCiBlbnVtIHR4ZW50cnlfZGVzY19mbGFncyB7CiAJRU5UUllfVFhEX1JUU19GUkFNRSwKQEAgLTIxOCw2ICsyNDEsMTAgQEAKIAlFTlRSWV9UWERfQlVSU1QsCiAJRU5UUllfVFhEX0FDSywKIAlFTlRSWV9UWERfUkVUUllfTU9ERSwKKwlFTlRSWV9UWERfRU5DUllQVCwKKwlFTlRSWV9UWERfRU5DUllQVF9QQUlSV0lTRSwKKwlFTlRSWV9UWERfRU5DUllQVF9JViwKKwlFTlRSWV9UWERfRU5DUllQVF9NTUlDLAogfTsKIAogLyoqCkBAIC0yMzYsNiArMjYzLDkgQEAKICAqIEBpZnM6IElGUyB2YWx1ZS4KICAqIEBjd19taW46IGN3bWluIHZhbHVlLgogICogQGN3X21heDogY3dtYXggdmFsdWUuCisgKiBAY2lwaGVyOiBDaXBoZXIgdHlwZSB1c2VkIGZvciBlbmNyeXB0aW9uLgorICogQGtleV9pZHg6IEtleSBpbmRleCB1c2VkIGZvciBlbmNyeXB0aW9uLgorICogQGl2X29mZnNldDogUG9zaXRpb24gd2hlcmUgSVYgc2hvdWxkIGJlIGluc2VydGVkIGJ5IGhhcmR3YXJlLgogICovCiBzdHJ1Y3QgdHhlbnRyeV9kZXNjIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjUyLDYgKzI4MiwxMCBAQAogCXNob3J0IGlmczsKIAlzaG9ydCBjd19taW47CiAJc2hvcnQgY3dfbWF4OworCisJZW51bSBjaXBoZXIgY2lwaGVyOworCXUxNiBrZXlfaWR4OworCXUxNiBpdl9vZmZzZXQ7CiB9OwogCiAvKioKQEAgLTMzNSw2ICszNjksNyBAQAogICogQGxlbmd0aDogTnVtYmVyIG9mIGZyYW1lcyBpbiBxdWV1ZS4KICAqIEBpbmRleDogSW5kZXggcG9pbnRlcnMgdG8gZW50cnkgcG9zaXRpb25zIGluIHRoZSBxdWV1ZSwKICAqCXVzZSAmZW51bSBxdWV1ZV9pbmRleCB0byBnZXQgYSBzcGVjaWZpYyBpbmRleCBmaWVsZC4KKyAqIEB0eG9wOiBtYXhpbXVtIGJ1cnN0IHRpbWUuCiAgKiBAYWlmczogVGhlIGFpZnMgdmFsdWUgZm9yIG91dGdvaW5nIGZyYW1lcyAoZmllbGQgaWdub3JlZCBpbiBSWCBxdWV1ZSkuCiAgKiBAY3dfbWluOiBUaGUgY3cgbWluIHZhbHVlIGZvciBvdXRnb2luZyBmcmFtZXMgKGZpZWxkIGlnbm9yZWQgaW4gUlggcXVldWUpLgogICogQGN3X21heDogVGhlIGN3IG1heCB2YWx1ZSBmb3Igb3V0Z29pbmcgZnJhbWVzIChmaWVsZCBpZ25vcmVkIGluIFJYIHF1ZXVlKS4KQEAgLTM1NCw2ICszODksNyBAQAogCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKIAl1bnNpZ25lZCBzaG9ydCBpbmRleFtRX0lOREVYX01BWF07CiAKKwl1bnNpZ25lZCBzaG9ydCB0eG9wOwogCXVuc2lnbmVkIHNob3J0IGFpZnM7CiAJdW5zaWduZWQgc2hvcnQgY3dfbWluOwogCXVuc2lnbmVkIHNob3J0IGN3X21heDsKQEAgLTQ4NCwyNSArNTIwLDUxIEBACiB9CiAKIC8qKgotICogcnQyeDAwX2Rlc2NfcmVhZCAtIFJlYWQgYSB3b3JkIGZyb20gdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3IuCisgKiBfcnQyeDAwX2Rlc2NfcmVhZCAtIFJlYWQgYSB3b3JkIGZyb20gdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3IuCisgKiBAZGVzYzogQmFzZSBkZXNjcmlwdG9yIGFkZHJlc3MKKyAqIEB3b3JkOiBXb3JkIGluZGV4IGZyb20gd2hlcmUgdGhlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHJlYWQuCisgKiBAdmFsdWU6IEFkZHJlc3Mgd2hlcmUgdGhlIGRlc2NyaXB0b3IgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gaW50by4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9ydDJ4MDBfZGVzY19yZWFkKF9fbGUzMiAqZGVzYywgY29uc3QgdTggd29yZCwgX19sZTMyICp2YWx1ZSkKK3sKKwkqdmFsdWUgPSBkZXNjW3dvcmRdOworfQorCisvKioKKyAqIHJ0MngwMF9kZXNjX3JlYWQgLSBSZWFkIGEgd29yZCBmcm9tIHRoZSBoYXJkd2FyZSBkZXNjcmlwdG9yLCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgYnl0ZSBvcmRlcmluZy4KICAqIEBkZXNjOiBCYXNlIGRlc2NyaXB0b3IgYWRkcmVzcwogICogQHdvcmQ6IFdvcmQgaW5kZXggZnJvbSB3aGVyZSB0aGUgZGVzY3JpcHRvciBzaG91bGQgYmUgcmVhZC4KICAqIEB2YWx1ZTogQWRkcmVzcyB3aGVyZSB0aGUgZGVzY3JpcHRvciB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBpbnRvLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwX2Rlc2NfcmVhZChfX2xlMzIgKmRlc2MsIGNvbnN0IHU4IHdvcmQsIHUzMiAqdmFsdWUpCiB7Ci0JKnZhbHVlID0gbGUzMl90b19jcHUoZGVzY1t3b3JkXSk7CisJX19sZTMyIHRtcDsKKwlfcnQyeDAwX2Rlc2NfcmVhZChkZXNjLCB3b3JkLCAmdG1wKTsKKwkqdmFsdWUgPSBsZTMyX3RvX2NwdSh0bXApOwogfQogCiAvKioKLSAqIHJ0MngwMF9kZXNjX3dyaXRlIC0gd3JvdGUgYSB3b3JkIHRvIHRoZSBoYXJkd2FyZSBkZXNjcmlwdG9yLgorICogcnQyeDAwX2Rlc2Nfd3JpdGUgLSB3cml0ZSBhIHdvcmQgdG8gdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3IsIHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBieXRlIG9yZGVyaW5nLgorICogQGRlc2M6IEJhc2UgZGVzY3JpcHRvciBhZGRyZXNzCisgKiBAd29yZDogV29yZCBpbmRleCBmcm9tIHdoZXJlIHRoZSBkZXNjcmlwdG9yIHNob3VsZCBiZSB3cml0dGVuLgorICogQHZhbHVlOiBWYWx1ZSB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGludG8gdGhlIGRlc2NyaXB0b3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfcnQyeDAwX2Rlc2Nfd3JpdGUoX19sZTMyICpkZXNjLCBjb25zdCB1OCB3b3JkLCBfX2xlMzIgdmFsdWUpCit7CisJZGVzY1t3b3JkXSA9IHZhbHVlOworfQorCisvKioKKyAqIHJ0MngwMF9kZXNjX3dyaXRlIC0gd3JpdGUgYSB3b3JkIHRvIHRoZSBoYXJkd2FyZSBkZXNjcmlwdG9yLgogICogQGRlc2M6IEJhc2UgZGVzY3JpcHRvciBhZGRyZXNzCiAgKiBAd29yZDogV29yZCBpbmRleCBmcm9tIHdoZXJlIHRoZSBkZXNjcmlwdG9yIHNob3VsZCBiZSB3cml0dGVuLgogICogQHZhbHVlOiBWYWx1ZSB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGludG8gdGhlIGRlc2NyaXB0b3IuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBydDJ4MDBfZGVzY193cml0ZShfX2xlMzIgKmRlc2MsIGNvbnN0IHU4IHdvcmQsIHUzMiB2YWx1ZSkKIHsKLQlkZXNjW3dvcmRdID0gY3B1X3RvX2xlMzIodmFsdWUpOworCV9ydDJ4MDBfZGVzY193cml0ZShkZXNjLCB3b3JkLCBjcHVfdG9fbGUzMih2YWx1ZSkpOwogfQogCiAjZW5kaWYgLyogUlQyWDAwUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHJlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHJlZy5oCmluZGV4IDJlYTc4NjYuLmMyZmJhN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDByZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcmVnLmgKQEAgLTI3LDYgKzI3LDE2IEBACiAjZGVmaW5lIFJUMlgwMFJFR19ICiAKIC8qCisgKiBSWCBjcnlwdG8gc3RhdHVzCisgKi8KK2VudW0gcnhfY3J5cHRvIHsKKwlSWF9DUllQVE9fU1VDQ0VTUyA9IDAsCisJUlhfQ1JZUFRPX0ZBSUxfSUNWID0gMSwKKwlSWF9DUllQVE9fRkFJTF9NSUMgPSAyLAorCVJYX0NSWVBUT19GQUlMX0tFWSA9IDMsCit9OworCisvKgogICogQW50ZW5uYSB2YWx1ZXMKICAqLwogZW51bSBhbnRlbm5hIHsKQEAgLTEwNCw3ICsxMTQsMTQgQEAKICAqLwogCUNJUEhFUl9DS0lQNjQgPSA1LAogCUNJUEhFUl9DS0lQMTI4ID0gNiwKLQlDSVBIRVJfVEtJUF9OT19NSUMgPSA3LAorCUNJUEhFUl9US0lQX05PX01JQyA9IDcsIC8qIERvbid0IHNlbmQgdG8gZGV2aWNlICovCisKKy8qCisgKiBNYXggY2lwaGVyIHR5cGUuCisgKiBOb3RlIHRoYXQgQ0lQSEVSX05PTkUgaXNuJ3QgY291bnRlZCwgYW5kIENLSVA2NCBhbmQgQ0tJUDEyOAorICogYXJlIGV4Y2x1ZGVkIGR1ZSB0byBsaW1pdGF0aW9ucyBpbiBtYWM4MDIxMS4KKyAqLworCUNJUEhFUl9NQVggPSA0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDByZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDByZmtpbGwuYwppbmRleCAwNGIyOTcxLi5jM2Y1M2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcmZraWxsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHJma2lsbC5jCkBAIC00MSwyMCArNDEsMTkgQEAKIAkvKgogCSAqIE9ubHkgY29udGludWUgaWYgdGhlcmUgYXJlIGVuYWJsZWQgaW50ZXJmYWNlcy4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFSVEVELCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfU1RBUlRFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAogCWlmIChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSB7Ci0JCUlORk8ocnQyeDAwZGV2LCAiSGFyZHdhcmUgYnV0dG9uIHByZXNzZWQsIGVuYWJsaW5nIHJhZGlvLlxuIik7Ci0JCV9fY2xlYXJfYml0KERFVklDRV9ESVNBQkxFRF9SQURJT19IVywgJnJ0MngwMGRldi0+ZmxhZ3MpOworCQlJTkZPKHJ0MngwMGRldiwgIlJGS0lMTCBldmVudDogZW5hYmxpbmcgcmFkaW8uXG4iKTsKKwkJY2xlYXJfYml0KERFVklDRV9TVEFURV9ESVNBQkxFRF9SQURJT19IVywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCQlyZXR2YWwgPSBydDJ4MDBsaWJfZW5hYmxlX3JhZGlvKHJ0MngwMGRldik7CiAJfSBlbHNlIGlmIChzdGF0ZSA9PSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEKSB7Ci0JCUlORk8ocnQyeDAwZGV2LCAiSGFyZHdhcmUgYnV0dG9uIHByZXNzZWQsIGRpc2FibGluZyByYWRpby5cbiIpOwotCQlfX3NldF9iaXQoREVWSUNFX0RJU0FCTEVEX1JBRElPX0hXLCAmcnQyeDAwZGV2LT5mbGFncyk7CisJCUlORk8ocnQyeDAwZGV2LCAiUkZLSUxMIGV2ZW50OiBkaXNhYmxpbmcgcmFkaW8uXG4iKTsKKwkJc2V0X2JpdChERVZJQ0VfU1RBVEVfRElTQUJMRURfUkFESU9fSFcsICZydDJ4MDBkZXYtPmZsYWdzKTsKIAkJcnQyeDAwbGliX2Rpc2FibGVfcmFkaW8ocnQyeDAwZGV2KTsKIAl9IGVsc2UgewotCQlXQVJOSU5HKHJ0MngwMGRldiwgIlJlY2VpdmVkIHVuZXhwZWN0ZWQgcmZraWxsIHN0YXRlICVkLlxuIiwKLQkJCXN0YXRlKTsKKwkJV0FSTklORyhydDJ4MDBkZXYsICJSRktJTEwgZXZlbnQ6IHVua25vd24gc3RhdGUgJWQuXG4iLCBzdGF0ZSk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTY0LDcgKzYzLDEyIEBACiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGRhdGE7CiAKLQkqc3RhdGUgPSBydDJ4MDBkZXYtPnJma2lsbC0+c3RhdGU7CisJLyoKKwkgKiByZmtpbGxfcG9sbCByZXBvcnRzIDEgd2hlbiB0aGUga2V5IGhhcyBiZWVuIHByZXNzZWQgYW5kIHRoZQorCSAqIHJhZGlvIHNob3VsZCBiZSBibG9ja2VkLgorCSAqLworCSpzdGF0ZSA9IHJ0MngwMGRldi0+b3BzLT5saWItPnJma2lsbF9wb2xsKHJ0MngwMGRldikgPworCSAgICBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKIAogCXJldHVybiAwOwogfQpAQCAtNzMsMTkgKzc3LDE4IEBACiB7CiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9CiAJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnQyeDAwX2RldiwgcmZraWxsX3dvcmsud29yayk7Ci0JaW50IHN0YXRlOworCWVudW0gcmZraWxsX3N0YXRlIHN0YXRlOwogCi0JaWYgKCF0ZXN0X2JpdChSRktJTExfU1RBVEVfUkVHSVNURVJFRCwgJnJ0MngwMGRldi0+cmZraWxsX3N0YXRlKSkKKwlpZiAoIXRlc3RfYml0KFJGS0lMTF9TVEFURV9SRUdJU1RFUkVELCAmcnQyeDAwZGV2LT5yZmtpbGxfc3RhdGUpIHx8CisJICAgICF0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19CVVRUT04sICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJLyoKLQkgKiByZmtpbGxfcG9sbCByZXBvcnRzIDEgd2hlbiB0aGUga2V5IGhhcyBiZWVuIHByZXNzZWQgYW5kIHRoZQotCSAqIHJhZGlvIHNob3VsZCBiZSBibG9ja2VkLgorCSAqIFBvbGwgbGF0ZXN0IHN0YXRlIGFuZCByZXBvcnQgaXQgdG8gcmZraWxsIHdobyBzaG91bGQgc29ydAorCSAqIG91dCBpZiB0aGUgc3RhdGUgc2hvdWxkIGJlIHRvZ2dsZWQgb3Igbm90LgogCSAqLwotCXN0YXRlID0gIXJ0MngwMGRldi0+b3BzLT5saWItPnJma2lsbF9wb2xsKHJ0MngwMGRldikgPwotCSAgICBSRktJTExfU1RBVEVfVU5CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKLQotCXJma2lsbF9mb3JjZV9zdGF0ZShydDJ4MDBkZXYtPnJma2lsbCwgc3RhdGUpOworCWlmICghcnQyeDAwcmZraWxsX2dldF9zdGF0ZShydDJ4MDBkZXYsICZzdGF0ZSkpCisJCXJma2lsbF9mb3JjZV9zdGF0ZShydDJ4MDBkZXYtPnJma2lsbCwgc3RhdGUpOwogCiAJcXVldWVfZGVsYXllZF93b3JrKHJ0MngwMGRldi0+aHctPndvcmtxdWV1ZSwKIAkJCSAgICZydDJ4MDBkZXYtPnJma2lsbF93b3JrLCBSRktJTExfUE9MTF9JTlRFUlZBTCk7CkBAIC05Myw4ICs5Niw4IEBACiAKIHZvaWQgcnQyeDAwcmZraWxsX3JlZ2lzdGVyKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7Ci0JaWYgKCF0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19CVVRUT04sICZydDJ4MDBkZXYtPmZsYWdzKSB8fAotCSAgICAhdGVzdF9iaXQoUkZLSUxMX1NUQVRFX0FMTE9DQVRFRCwgJnJ0MngwMGRldi0+cmZraWxsX3N0YXRlKSkKKwlpZiAoIXRlc3RfYml0KFJGS0lMTF9TVEFURV9BTExPQ0FURUQsICZydDJ4MDBkZXYtPnJma2lsbF9zdGF0ZSkgfHwKKwkgICAgdGVzdF9iaXQoUkZLSUxMX1NUQVRFX1JFR0lTVEVSRUQsICZydDJ4MDBkZXYtPnJma2lsbF9zdGF0ZSkpCiAJCXJldHVybjsKIAogCWlmIChyZmtpbGxfcmVnaXN0ZXIocnQyeDAwZGV2LT5yZmtpbGwpKSB7CkBAIC0xMTQsNyArMTE3LDcgQEAKIAogdm9pZCBydDJ4MDByZmtpbGxfdW5yZWdpc3RlcihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQogewotCWlmICghdGVzdF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQlVUVE9OLCAmcnQyeDAwZGV2LT5mbGFncykgfHwKKwlpZiAoIXRlc3RfYml0KFJGS0lMTF9TVEFURV9BTExPQ0FURUQsICZydDJ4MDBkZXYtPnJma2lsbF9zdGF0ZSkgfHwKIAkgICAgIXRlc3RfYml0KFJGS0lMTF9TVEFURV9SRUdJU1RFUkVELCAmcnQyeDAwZGV2LT5yZmtpbGxfc3RhdGUpKQogCQlyZXR1cm47CiAKQEAgLTEyNywyMSArMTMwLDMwIEBACiAKIHZvaWQgcnQyeDAwcmZraWxsX2FsbG9jYXRlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7Ci0JaWYgKCF0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19CVVRUT04sICZydDJ4MDBkZXYtPmZsYWdzKSkKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aXBoeV9kZXYocnQyeDAwZGV2LT5ody0+d2lwaHkpOworCisJaWYgKHRlc3RfYml0KFJGS0lMTF9TVEFURV9BTExPQ0FURUQsICZydDJ4MDBkZXYtPnJma2lsbF9zdGF0ZSkpCiAJCXJldHVybjsKIAotCXJ0MngwMGRldi0+cmZraWxsID0KLQkgICAgcmZraWxsX2FsbG9jYXRlKHdpcGh5X2RldihydDJ4MDBkZXYtPmh3LT53aXBoeSksIFJGS0lMTF9UWVBFX1dMQU4pOworCXJ0MngwMGRldi0+cmZraWxsID0gcmZraWxsX2FsbG9jYXRlKGRldiwgUkZLSUxMX1RZUEVfV0xBTik7CiAJaWYgKCFydDJ4MDBkZXYtPnJma2lsbCkgewogCQlFUlJPUihydDJ4MDBkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmZraWxsIGhhbmRsZXIuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAorCV9fc2V0X2JpdChSRktJTExfU1RBVEVfQUxMT0NBVEVELCAmcnQyeDAwZGV2LT5yZmtpbGxfc3RhdGUpOworCiAJcnQyeDAwZGV2LT5yZmtpbGwtPm5hbWUgPSBydDJ4MDBkZXYtPm9wcy0+bmFtZTsKIAlydDJ4MDBkZXYtPnJma2lsbC0+ZGF0YSA9IHJ0MngwMGRldjsKLQlydDJ4MDBkZXYtPnJma2lsbC0+c3RhdGUgPSAtMTsKIAlydDJ4MDBkZXYtPnJma2lsbC0+dG9nZ2xlX3JhZGlvID0gcnQyeDAwcmZraWxsX3RvZ2dsZV9yYWRpbzsKLQlydDJ4MDBkZXYtPnJma2lsbC0+Z2V0X3N0YXRlID0gcnQyeDAwcmZraWxsX2dldF9zdGF0ZTsKKwlpZiAodGVzdF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQlVUVE9OLCAmcnQyeDAwZGV2LT5mbGFncykpIHsKKwkJcnQyeDAwZGV2LT5yZmtpbGwtPmdldF9zdGF0ZSA9IHJ0MngwMHJma2lsbF9nZXRfc3RhdGU7CisJCXJ0MngwMGRldi0+cmZraWxsLT5zdGF0ZSA9CisJCQlydDJ4MDBkZXYtPm9wcy0+bGliLT5yZmtpbGxfcG9sbChydDJ4MDBkZXYpID8KKwkJCSAgICBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwl9IGVsc2UgeworCQlydDJ4MDBkZXYtPnJma2lsbC0+c3RhdGUgPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEOworCX0KIAogCUlOSVRfREVMQVlFRF9XT1JLKCZydDJ4MDBkZXYtPnJma2lsbF93b3JrLCBydDJ4MDByZmtpbGxfcG9sbCk7CiAKQEAgLTE1MCw4ICsxNjIsNyBAQAogCiB2b2lkIHJ0MngwMHJma2lsbF9mcmVlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7Ci0JaWYgKCF0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19CVVRUT04sICZydDJ4MDBkZXYtPmZsYWdzKSB8fAotCSAgICAhdGVzdF9iaXQoUkZLSUxMX1NUQVRFX0FMTE9DQVRFRCwgJnJ0MngwMGRldi0+cmZraWxsX3N0YXRlKSkKKwlpZiAoIXRlc3RfYml0KFJGS0lMTF9TVEFURV9BTExPQ0FURUQsICZydDJ4MDBkZXYtPmZsYWdzKSkKIAkJcmV0dXJuOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydDJ4MDBkZXYtPnJma2lsbF93b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYwppbmRleCAyMDUwMjI3Li5iNzNhN2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCkBAIC0xNjMsMTYgKzE2MywxMSBAQAogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBlbnRyeS0+cXVldWUtPnJ0MngwMGRldjsKIAlzdHJ1Y3QgdHhkb25lX2VudHJ5X2Rlc2MgdHhkZXNjOwogCi0JaWYgKCF0ZXN0X2JpdChERVZJQ0VfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpIHx8CisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpIHx8CiAJICAgICF0ZXN0X2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncykpCiAJCXJldHVybjsKIAogCS8qCi0JICogUmVtb3ZlIHRoZSBkZXNjcmlwdG9yIGRhdGEgZnJvbSB0aGUgYnVmZmVyLgotCSAqLwotCXNrYl9wdWxsKGVudHJ5LT5za2IsIGVudHJ5LT5xdWV1ZS0+ZGVzY19zaXplKTsKLQotCS8qCiAJICogT2J0YWluIHRoZSBzdGF0dXMgYWJvdXQgdGhpcyBwYWNrZXQuCiAJICogTm90ZSB0aGF0IHdoZW4gdGhlIHN0YXR1cyBpcyAwIGl0IGRvZXMgbm90IG1lYW4gdGhlCiAJICogZnJhbWUgd2FzIHNlbmQgb3V0IGNvcnJlY3RseS4gSXQgb25seSBtZWFucyB0aGUgZnJhbWUKQEAgLTIyNCw2ICsyMTksMTIgQEAKIAkJCSAgZW50cnktPnNrYi0+ZGF0YSwgbGVuZ3RoLAogCQkJICBydDJ4MDB1c2JfaW50ZXJydXB0X3R4ZG9uZSwgZW50cnkpOwogCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHNrYi0+ZGF0YSBwb2ludGVyIHBvaW50cyB0byB0aGUgZnJhbWUsIG5vdCB0aGUKKwkgKiBkZXNjcmlwdG9yLgorCSAqLworCXNrYl9wdWxsKGVudHJ5LT5za2IsIGVudHJ5LT5xdWV1ZS0+ZGVzY19zaXplKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwdXNiX3dyaXRlX3R4X2RhdGEpOwpAQCAtMjMyLDcgKzIzMyw3IEBACiB7CiAJc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfdXNiICplbnRyeV9wcml2ID0gZW50cnktPnByaXZfZGF0YTsKIAotCWlmIChfX3Rlc3RfYW5kX2NsZWFyX2JpdChFTlRSWV9EQVRBX1BFTkRJTkcsICZlbnRyeS0+ZmxhZ3MpKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRU5UUllfREFUQV9QRU5ESU5HLCAmZW50cnktPmZsYWdzKSkKIAkJdXNiX3N1Ym1pdF91cmIoZW50cnlfcHJpdi0+dXJiLCBHRlBfQVRPTUlDKTsKIH0KIApAQCAtMjgzLDcgKzI4NCw3IEBACiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKGVudHJ5LT5za2IpOwogCXU4IHJ4ZFszMl07CiAKLQlpZiAoIXRlc3RfYml0KERFVklDRV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykgfHwKKwlpZiAoIXRlc3RfYml0KERFVklDRV9TVEFURV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykgfHwKIAkgICAgIXRlc3RfYml0KEVOVFJZX09XTkVSX0RFVklDRV9EQVRBLCAmZW50cnktPmZsYWdzKSkKIAkJcmV0dXJuOwogCkBAIC0yOTMsNyArMjk0LDcgQEAKIAkgKiBhIHByb2JsZW0uCiAJICovCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IGVudHJ5LT5xdWV1ZS0+ZGVzY19zaXplIHx8IHVyYi0+c3RhdHVzKSB7Ci0JCV9fc2V0X2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CisJCXNldF9iaXQoRU5UUllfT1dORVJfREVWSUNFX0RBVEEsICZlbnRyeS0+ZmxhZ3MpOwogCQl1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlyZXR1cm47CiAJfQpAQCAtMzYxLDcgKzM2Miw3IEBACiAJCQkgIGVudHJ5LT5za2ItPmRhdGEsIGVudHJ5LT5za2ItPmxlbiwKIAkJCSAgcnQyeDAwdXNiX2ludGVycnVwdF9yeGRvbmUsIGVudHJ5KTsKIAotCV9fc2V0X2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CisJc2V0X2JpdChFTlRSWV9PV05FUl9ERVZJQ0VfREFUQSwgJmVudHJ5LT5mbGFncyk7CiAJdXNiX3N1Ym1pdF91cmIoZW50cnlfcHJpdi0+dXJiLCBHRlBfQVRPTUlDKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0MngwMHVzYl9pbml0X3J4ZW50cnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMKaW5kZXggMDg3ZTkwYi4uYTQ2MTYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jCkBAIC0zOCw2ICszOCwxMyBAQAogI2luY2x1ZGUgInJ0NjFwY2kuaCIKIAogLyoKKyAqIEFsbG93IGhhcmR3YXJlIGVuY3J5cHRpb24gdG8gYmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZChub2h3Y3J5cHQsIG1vZHBhcmFtX25vaHdjcnlwdCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG5vaHdjcnlwdCwgIkRpc2FibGUgaGFyZHdhcmUgZW5jcnlwdGlvbi4iKTsKKworLyoKICAqIFJlZ2lzdGVyIGFjY2Vzcy4KICAqIEJCUCBhbmQgUkYgcmVnaXN0ZXIgcmVxdWlyZSBpbmRpcmVjdCByZWdpc3RlciBhY2Nlc3MsCiAgKiBhbmQgdXNlIHRoZSBDU1IgcmVnaXN0ZXJzIFBIWV9DU1IzIGFuZCBQSFlfQ1NSNCB0byBhY2hpZXZlIHRoaXMuCkBAIC0xNTYsNyArMTYzLDcgQEAKIAlydDJ4MDBfcmZfd3JpdGUocnQyeDAwZGV2LCB3b3JkLCB2YWx1ZSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUlQ2MVBDSV9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbSBydDYxcGNpX2xlZF9icmlnaHRuZXNzKCkKICAqIG1ha2UgZ2NjIGhhcHB5IGJ5IHBsYWNpbmcgdGhpcyBmdW5jdGlvbiBpbnNpZGUgdGhlCkBAIC0xODgsNyArMTk1LDcgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgSE9TVF9DTURfQ1NSX0lOVEVSUlVQVF9NQ1UsIDEpOwogCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEhPU1RfQ01EX0NTUiwgcmVnKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQ2MVBDSV9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiBzdGF0aWMgdm9pZCBydDYxcGNpX2VlcHJvbXJlZ2lzdGVyX3JlYWQoc3RydWN0IGVlcHJvbV85M2N4NiAqZWVwcm9tKQogewpAQCAtMjY0LDcgKzI3MSw3IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19SVDJYMDBfTElCX0RFQlVHRlMgKi8KIAotI2lmZGVmIENPTkZJR19SVDYxUENJX1JGS0lMTAorI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX1JGS0lMTAogc3RhdGljIGludCBydDYxcGNpX3Jma2lsbF9wb2xsKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJdTMyIHJlZzsKQEAgLTI3NCw5ICsyODEsOSBAQAogfQogI2Vsc2UKICNkZWZpbmUgcnQ2MXBjaV9yZmtpbGxfcG9sbAlOVUxMCi0jZW5kaWYgLyogQ09ORklHX1JUNjFQQ0lfUkZLSUxMICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfUkZLSUxMICovCiAKLSNpZmRlZiBDT05GSUdfUlQ2MVBDSV9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogc3RhdGljIHZvaWQgcnQ2MXBjaV9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKIAkJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCiB7CkBAIC0zNDEsMTEgKzM0OCwyMDkgQEAKIAlsZWQtPmxlZF9kZXYuYmxpbmtfc2V0ID0gcnQ2MXBjaV9ibGlua19zZXQ7CiAJbGVkLT5mbGFncyA9IExFRF9JTklUSUFMSVpFRDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQ2MVBDSV9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiAvKgogICogQ29uZmlndXJhdGlvbiBoYW5kbGVycy4KICAqLworc3RhdGljIGludCBydDYxcGNpX2NvbmZpZ19zaGFyZWRfa2V5KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJICAgICBzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byAqY3J5cHRvLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBod19rZXlfZW50cnkga2V5X2VudHJ5OworCXN0cnVjdCBydDJ4MDBfZmllbGQzMiBmaWVsZDsKKwl1MzIgbWFzazsKKwl1MzIgcmVnOworCisJaWYgKGNyeXB0by0+Y21kID09IFNFVF9LRVkpIHsKKwkJLyoKKwkJICogcnQyeDAwbGliIGNhbid0IGRldGVybWluZSB0aGUgY29ycmVjdCBmcmVlCisJCSAqIGtleV9pZHggZm9yIHNoYXJlZCBrZXlzLiBXZSBoYXZlIDEgcmVnaXN0ZXIKKwkJICogd2l0aCBrZXkgdmFsaWQgYml0cy4gVGhlIGdvYWwgaXMgc2ltcGxlLCByZWFkCisJCSAqIHRoZSByZWdpc3RlciwgaWYgdGhhdCBpcyBmdWxsIHdlIGhhdmUgbm8gc2xvdHMKKwkJICogbGVmdC4KKwkJICogTm90ZSB0aGF0IGVhY2ggQlNTIGlzIGFsbG93ZWQgdG8gaGF2ZSB1cCB0byA0CisJCSAqIHNoYXJlZCBrZXlzLCBzbyBwdXQgYSBtYXNrIG92ZXIgdGhlIGFsbG93ZWQKKwkJICogZW50cmllcy4KKwkJICovCisJCW1hc2sgPSAoMHhmIDw8IGNyeXB0by0+YnNzaWR4KTsKKworCQlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1IwLCAmcmVnKTsKKwkJcmVnICY9IG1hc2s7CisKKwkJaWYgKHJlZyAmJiByZWcgPT0gbWFzaykKKwkJCXJldHVybiAtRU5PU1BDOworCisJCWtleS0+aHdfa2V5X2lkeCArPSByZWcgPyBmZnoocmVnKSA6IDA7CisKKwkJLyoKKwkJICogVXBsb2FkIGtleSB0byBoYXJkd2FyZQorCQkgKi8KKwkJbWVtY3B5KGtleV9lbnRyeS5rZXksIGNyeXB0by0+a2V5LAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS5rZXkpKTsKKwkJbWVtY3B5KGtleV9lbnRyeS50eF9taWMsIGNyeXB0by0+dHhfbWljLAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS50eF9taWMpKTsKKwkJbWVtY3B5KGtleV9lbnRyeS5yeF9taWMsIGNyeXB0by0+cnhfbWljLAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS5yeF9taWMpKTsKKworCQlyZWcgPSBTSEFSRURfS0VZX0VOVFJZKGtleS0+aHdfa2V5X2lkeCk7CisJCXJ0MngwMHBjaV9yZWdpc3Rlcl9tdWx0aXdyaXRlKHJ0MngwMGRldiwgcmVnLAorCQkJCQkgICAgICAma2V5X2VudHJ5LCBzaXplb2Yoa2V5X2VudHJ5KSk7CisKKwkJLyoKKwkJICogVGhlIGNpcGhlciB0eXBlcyBhcmUgc3RvcmVkIG92ZXIgMiByZWdpc3RlcnMuCisJCSAqIGJzc2lkeCAwIGFuZCAxIGtleXMgYXJlIHN0b3JlZCBpbiBTRUNfQ1NSMSBhbmQKKwkJICogYnNzaWR4IDEgYW5kIDIga2V5cyBhcmUgc3RvcmVkIGluIFNFQ19DU1I1LgorCQkgKiBVc2luZyB0aGUgY29ycmVjdCBkZWZpbmVzIGNvcnJlY3RseSB3aWxsIGNhdXNlIG92ZXJoZWFkLAorCQkgKiBzbyBqdXN0IGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBvZmZzZXQuCisJCSAqLworCQlpZiAoa2V5LT5od19rZXlfaWR4IDwgOCkgeworCQkJZmllbGQuYml0X29mZnNldCA9ICgzICoga2V5LT5od19rZXlfaWR4KTsKKwkJCWZpZWxkLmJpdF9tYXNrID0gMHg3IDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwkJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgU0VDX0NTUjEsICZyZWcpOworCQkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBjcnlwdG8tPmNpcGhlcik7CisJCQlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBTRUNfQ1NSMSwgcmVnKTsKKwkJfSBlbHNlIHsKKwkJCWZpZWxkLmJpdF9vZmZzZXQgPSAoMyAqIChrZXktPmh3X2tleV9pZHggLSA4KSk7CisJCQlmaWVsZC5iaXRfbWFzayA9IDB4NyA8PCBmaWVsZC5iaXRfb2Zmc2V0OworCisJCQlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1I1LCAmcmVnKTsKKwkJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgY3J5cHRvLT5jaXBoZXIpOworCQkJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjUsIHJlZyk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIElWL0VJViBnZW5lcmF0aW9uCisJCSAqIGluIGhhcmR3YXJlLiBIb3dldmVyIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgSVYvRUlWCisJCSAqIGluc2lkZSB0aGUgaWVlZTgwMjExIGZyYW1lIGVpdGhlciwgYnV0IHJlcXVpcmVzIGl0CisJCSAqIHRvIGJlIHByb3ZpZGVkIHNlcGVyYXRlbHkgZm9yIHRoZSBkZXNjcmlwdG9yLgorCQkgKiBydDJ4MDBsaWIgd2lsbCBjdXQgdGhlIElWL0VJViBkYXRhIG91dCBvZiBhbGwgZnJhbWVzCisJCSAqIGdpdmVuIHRvIHVzIGJ5IG1hYzgwMjExLCBidXQgd2UgbXVzdCB0ZWxsIG1hYzgwMjExCisJCSAqIHRvIGdlbmVyYXRlIHRoZSBJVi9FSVYgZGF0YS4KKwkJICovCisJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCX0KKworCS8qCisJICogU0VDX0NTUjAgY29udGFpbnMgb25seSBzaW5nbGUtYml0IGZpZWxkcyB0byBpbmRpY2F0ZQorCSAqIGEgcGFydGljdWxhciBrZXkgaXMgdmFsaWQuIEJlY2F1c2UgdXNpbmcgdGhlIEZJRUxEMzIoKQorCSAqIGRlZmluZXMgZGlyZWN0bHkgd2lsbCBjYXVzZSBhIGxvdCBvZiBvdmVyaGVhZCB3ZSB1c2UKKwkgKiBhIGNhbGN1bGF0aW9uIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBiaXQgZGlyZWN0bHkuCisJICovCisJbWFzayA9IDEgPDwga2V5LT5od19rZXlfaWR4OworCisJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMCwgJnJlZyk7CisJaWYgKGNyeXB0by0+Y21kID09IFNFVF9LRVkpCisJCXJlZyB8PSBtYXNrOworCWVsc2UgaWYgKGNyeXB0by0+Y21kID09IERJU0FCTEVfS0VZKQorCQlyZWcgJj0gfm1hc2s7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjAsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDYxcGNpX2NvbmZpZ19wYWlyd2lzZV9rZXkoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgICAgICAgc3RydWN0IHJ0MngwMGxpYl9jcnlwdG8gKmNyeXB0bywKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBod19wYWlyd2lzZV90YV9lbnRyeSBhZGRyX2VudHJ5OworCXN0cnVjdCBod19rZXlfZW50cnkga2V5X2VudHJ5OworCXUzMiBtYXNrOworCXUzMiByZWc7CisKKwlpZiAoY3J5cHRvLT5jbWQgPT0gU0VUX0tFWSkgeworCQkvKgorCQkgKiBydDJ4MDBsaWIgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGZyZWUKKwkJICoga2V5X2lkeCBmb3IgcGFpcndpc2Uga2V5cy4gV2UgaGF2ZSAyIHJlZ2lzdGVycworCQkgKiB3aXRoIGtleSB2YWxpZCBiaXRzLiBUaGUgZ29hbCBpcyBzaW1wbGUsIHJlYWQKKwkJICogdGhlIGZpcnN0IHJlZ2lzdGVyLCBpZiB0aGF0IGlzIGZ1bGwgbW92ZSB0bworCQkgKiB0aGUgbmV4dCByZWdpc3Rlci4KKwkJICogV2hlbiBib3RoIHJlZ2lzdGVycyBhcmUgZnVsbCwgd2UgZHJvcCB0aGUga2V5LAorCQkgKiBvdGhlcndpc2Ugd2UgdXNlIHRoZSBmaXJzdCBpbnZhbGlkIGVudHJ5LgorCQkgKi8KKwkJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMiwgJnJlZyk7CisJCWlmIChyZWcgJiYgcmVnID09IH4wKSB7CisJCQlrZXktPmh3X2tleV9pZHggPSAzMjsKKwkJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgU0VDX0NTUjMsICZyZWcpOworCQkJaWYgKHJlZyAmJiByZWcgPT0gfjApCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKworCQlrZXktPmh3X2tleV9pZHggKz0gcmVnID8gZmZ6KHJlZykgOiAwOworCisJCS8qCisJCSAqIFVwbG9hZCBrZXkgdG8gaGFyZHdhcmUKKwkJICovCisJCW1lbWNweShrZXlfZW50cnkua2V5LCBjcnlwdG8tPmtleSwKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkua2V5KSk7CisJCW1lbWNweShrZXlfZW50cnkudHhfbWljLCBjcnlwdG8tPnR4X21pYywKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkudHhfbWljKSk7CisJCW1lbWNweShrZXlfZW50cnkucnhfbWljLCBjcnlwdG8tPnJ4X21pYywKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkucnhfbWljKSk7CisKKwkJbWVtc2V0KCZhZGRyX2VudHJ5LCAwLCBzaXplb2YoYWRkcl9lbnRyeSkpOworCQltZW1jcHkoJmFkZHJfZW50cnksIGNyeXB0by0+YWRkcmVzcywgRVRIX0FMRU4pOworCQlhZGRyX2VudHJ5LmNpcGhlciA9IGNyeXB0by0+Y2lwaGVyOworCisJCXJlZyA9IFBBSVJXSVNFX0tFWV9FTlRSWShrZXktPmh3X2tleV9pZHgpOworCQlydDJ4MDBwY2lfcmVnaXN0ZXJfbXVsdGl3cml0ZShydDJ4MDBkZXYsIHJlZywKKwkJCQkJICAgICAgJmtleV9lbnRyeSwgc2l6ZW9mKGtleV9lbnRyeSkpOworCisJCXJlZyA9IFBBSVJXSVNFX1RBX0VOVFJZKGtleS0+aHdfa2V5X2lkeCk7CisJCXJ0MngwMHBjaV9yZWdpc3Rlcl9tdWx0aXdyaXRlKHJ0MngwMGRldiwgcmVnLAorCQkJCQkgICAgICAmYWRkcl9lbnRyeSwgc2l6ZW9mKGFkZHJfZW50cnkpKTsKKworCQkvKgorCQkgKiBFbmFibGUgcGFpcndpc2UgbG9va3VwIHRhYmxlIGZvciBnaXZlbiBCU1MgaWR4LAorCQkgKiB3aXRob3V0IHRoaXMgcmVjZWl2ZWQgZnJhbWVzIHdpbGwgbm90IGJlIGRlY3J5cHRlZAorCQkgKiBieSB0aGUgaGFyZHdhcmUuCisJCSAqLworCQlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1I0LCAmcmVnKTsKKwkJcmVnIHw9ICgxIDw8IGNyeXB0by0+YnNzaWR4KTsKKwkJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjQsIHJlZyk7CisKKwkJLyoKKwkJICogVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJVi9FSVYgZ2VuZXJhdGlvbgorCQkgKiBpbiBoYXJkd2FyZS4gSG93ZXZlciBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlIElWL0VJVgorCQkgKiBpbnNpZGUgdGhlIGllZWU4MDIxMSBmcmFtZSBlaXRoZXIsIGJ1dCByZXF1aXJlcyBpdAorCQkgKiB0byBiZSBwcm92aWRlZCBzZXBlcmF0ZWx5IGZvciB0aGUgZGVzY3JpcHRvci4KKwkJICogcnQyeDAwbGliIHdpbGwgY3V0IHRoZSBJVi9FSVYgZGF0YSBvdXQgb2YgYWxsIGZyYW1lcworCQkgKiBnaXZlbiB0byB1cyBieSBtYWM4MDIxMSwgYnV0IHdlIG11c3QgdGVsbCBtYWM4MDIxMQorCQkgKiB0byBnZW5lcmF0ZSB0aGUgSVYvRUlWIGRhdGEuCisJCSAqLworCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwl9CisKKwkvKgorCSAqIFNFQ19DU1IyIGFuZCBTRUNfQ1NSMyBjb250YWluIG9ubHkgc2luZ2xlLWJpdCBmaWVsZHMgdG8gaW5kaWNhdGUKKwkgKiBhIHBhcnRpY3VsYXIga2V5IGlzIHZhbGlkLiBCZWNhdXNlIHVzaW5nIHRoZSBGSUVMRDMyKCkKKwkgKiBkZWZpbmVzIGRpcmVjdGx5IHdpbGwgY2F1c2UgYSBsb3Qgb2Ygb3ZlcmhlYWQgd2UgdXNlCisJICogYSBjYWxjdWxhdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYml0IGRpcmVjdGx5LgorCSAqLworCWlmIChrZXktPmh3X2tleV9pZHggPCAzMikgeworCQltYXNrID0gMSA8PCBrZXktPmh3X2tleV9pZHg7CisKKwkJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMiwgJnJlZyk7CisJCWlmIChjcnlwdG8tPmNtZCA9PSBTRVRfS0VZKQorCQkJcmVnIHw9IG1hc2s7CisJCWVsc2UgaWYgKGNyeXB0by0+Y21kID09IERJU0FCTEVfS0VZKQorCQkJcmVnICY9IH5tYXNrOworCQlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBTRUNfQ1NSMiwgcmVnKTsKKwl9IGVsc2UgeworCQltYXNrID0gMSA8PCAoa2V5LT5od19rZXlfaWR4IC0gMzIpOworCisJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgU0VDX0NTUjMsICZyZWcpOworCQlpZiAoY3J5cHRvLT5jbWQgPT0gU0VUX0tFWSkKKwkJCXJlZyB8PSBtYXNrOworCQllbHNlIGlmIChjcnlwdG8tPmNtZCA9PSBESVNBQkxFX0tFWSkKKwkJCXJlZyAmPSB+bWFzazsKKwkJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjMsIHJlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHJ0NjFwY2lfY29uZmlnX2ZpbHRlcihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgY29uc3QgdW5zaWduZWQgaW50IGZpbHRlcl9mbGFncykKIHsKQEAgLTQ0MCw2ICs2NDUsMzAgQEAKIAlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWFJYX0NTUjQsIHJlZyk7CiB9CiAKKworc3RhdGljIHZvaWQgcnQ2MXBjaV9jb25maWdfbG5hX2dhaW4oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgICAgc3RydWN0IHJ0MngwMGxpYl9jb25mICpsaWJjb25mKQoreworCXUxNiBlZXByb207CisJc2hvcnQgbG5hX2dhaW4gPSAwOworCisJaWYgKGxpYmNvbmYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQlpZiAodGVzdF9iaXQoQ09ORklHX0VYVEVSTkFMX0xOQV9CRywgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQkJbG5hX2dhaW4gKz0gMTQ7CisKKwkJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX1JTU0lfT0ZGU0VUX0JHLCAmZWVwcm9tKTsKKwkJbG5hX2dhaW4gLT0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX1JTU0lfT0ZGU0VUX0JHXzEpOworCX0gZWxzZSB7CisJCWlmICh0ZXN0X2JpdChDT05GSUdfRVhURVJOQUxfTE5BX0EsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJCWxuYV9nYWluICs9IDE0OworCisJCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9SU1NJX09GRlNFVF9BLCAmZWVwcm9tKTsKKwkJbG5hX2dhaW4gLT0gcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwgRUVQUk9NX1JTU0lfT0ZGU0VUX0FfMSk7CisJfQorCisJcnQyeDAwZGV2LT5sbmFfZ2FpbiA9IGxuYV9nYWluOworfQorCiBzdGF0aWMgdm9pZCBydDYxcGNpX2NvbmZpZ19waHltb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJICAgY29uc3QgaW50IGJhc2ljX3JhdGVfbWFzaykKIHsKQEAgLTc1OCw2ICs5ODcsOSBAQAogCQkJICAgc3RydWN0IHJ0MngwMGxpYl9jb25mICpsaWJjb25mLAogCQkJICAgY29uc3QgdW5zaWduZWQgaW50IGZsYWdzKQogeworCS8qIEFsd2F5cyByZWNhbGN1bGF0ZSBMTkEgZ2FpbiBiZWZvcmUgY2hhbmdpbmcgY29uZmlndXJhdGlvbiAqLworCXJ0NjFwY2lfY29uZmlnX2xuYV9nYWluKHJ0MngwMGRldiwgbGliY29uZik7CisKIAlpZiAoZmxhZ3MgJiBDT05GSUdfVVBEQVRFX1BIWU1PREUpCiAJCXJ0NjFwY2lfY29uZmlnX3BoeW1vZGUocnQyeDAwZGV2LCBsaWJjb25mLT5iYXNpY19yYXRlcyk7CiAJaWYgKGZsYWdzICYgQ09ORklHX1VQREFURV9DSEFOTkVMKQpAQCAtMTI0NiwxNiArMTQ3OCw2IEBACiAKIAlydDJ4MDBwY2lfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBNMkhfQ01EX0RPTkVfQ1NSLCAweGZmZmZmZmZmKTsKIAotCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IwLCAmcmVnKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQUNfVFhPUF9DU1IwX0FDMF9UWF9PUCwgMCk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEFDX1RYT1BfQ1NSMF9BQzFfVFhfT1AsIDApOwotCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMCwgcmVnKTsKLQotCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IxLCAmcmVnKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQUNfVFhPUF9DU1IxX0FDMl9UWF9PUCwgMTkyKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQUNfVFhPUF9DU1IxX0FDM19UWF9PUCwgNDgpOwotCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMSwgcmVnKTsKLQogCS8qCiAJICogQ2xlYXIgYWxsIGJlYWNvbnMKIAkgKiBGb3IgdGhlIEJlYWNvbiBiYXNlIHJlZ2lzdGVycyB3ZSBvbmx5IG5lZWQgdG8gY2xlYXIKQEAgLTE1MzMsOCArMTc1NSw4IEBACiAgKiBUWCBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uCiAgKi8KIHN0YXRpYyB2b2lkIHJ0NjFwY2lfd3JpdGVfdHhfZGVzYyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQogewogCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhza2IpOwogCV9fbGUzMiAqdHhkID0gc2tiZGVzYy0+ZGVzYzsKQEAgLTE1NDgsNyArMTc3MCw3IEBACiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfQUlGU04sIHR4ZGVzYy0+YWlmcyk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfQ1dNSU4sIHR4ZGVzYy0+Y3dfbWluKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMV9DV01BWCwgdHhkZXNjLT5jd19tYXgpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cxX0lWX09GRlNFVCwgSUVFRTgwMjExX0hFQURFUik7CisJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfSVZfT0ZGU0VULCB0eGRlc2MtPml2X29mZnNldCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfSFdfU0VRVUVOQ0UsCiAJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfR0VORVJBVEVfU0VRLCAmdHhkZXNjLT5mbGFncykpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cxX0JVRkZFUl9DT1VOVCwgMSk7CkBAIC0xNTYxLDYgKzE3ODMsMTEgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMl9QTENQX0xFTkdUSF9ISUdILCB0eGRlc2MtPmxlbmd0aF9oaWdoKTsKIAlydDJ4MDBfZGVzY193cml0ZSh0eGQsIDIsIHdvcmQpOwogCisJaWYgKHRlc3RfYml0KEVOVFJZX1RYRF9FTkNSWVBULCAmdHhkZXNjLT5mbGFncykpIHsKKwkJX3J0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMywgc2tiZGVzYy0+aXYpOworCQlfcnQyeDAwX2Rlc2Nfd3JpdGUodHhkLCA0LCBza2JkZXNjLT5laXYpOworCX0KKwogCXJ0MngwMF9kZXNjX3JlYWQodHhkLCA1LCAmd29yZCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzVfUElEX1RZUEUsIHNrYmRlc2MtPmVudHJ5LT5xdWV1ZS0+cWlkKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XNV9QSURfU1VCVFlQRSwKQEAgLTE1OTUsMTEgKzE4MjIsMTUgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9JRlMsIHR4ZGVzYy0+aWZzKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9SRVRSWV9NT0RFLAogCQkJICAgdGVzdF9iaXQoRU5UUllfVFhEX1JFVFJZX01PREUsICZ0eGRlc2MtPmZsYWdzKSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfVEtJUF9NSUMsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX1RLSVBfTUlDLAorCQkJICAgdGVzdF9iaXQoRU5UUllfVFhEX0VOQ1JZUFRfTU1JQywgJnR4ZGVzYy0+ZmxhZ3MpKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9LRVlfVEFCTEUsCisJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfRU5DUllQVF9QQUlSV0lTRSwgJnR4ZGVzYy0+ZmxhZ3MpKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9LRVlfSU5ERVgsIHR4ZGVzYy0+a2V5X2lkeCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfREFUQUJZVEVfQ09VTlQsIHNrYi0+bGVuKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9CVVJTVCwKIAkJCSAgIHRlc3RfYml0KEVOVFJZX1RYRF9CVVJTVCwgJnR4ZGVzYy0+ZmxhZ3MpKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9DSVBIRVJfQUxHLCBDSVBIRVJfTk9ORSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfQ0lQSEVSX0FMRywgdHhkZXNjLT5jaXBoZXIpOwogCXJ0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMCwgd29yZCk7CiB9CiAKQEAgLTE2NzYsNDAgKzE5MDcsMjcgQEAKICAqLwogc3RhdGljIGludCBydDYxcGNpX2FnY190b19yc3NpKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsIGludCByeGRfdzEpCiB7Ci0JdTE2IGVlcHJvbTsKLQl1OCBvZmZzZXQ7CisJdTggb2Zmc2V0ID0gcnQyeDAwZGV2LT5sbmFfZ2FpbjsKIAl1OCBsbmE7CiAKIAlsbmEgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIocnhkX3cxLCBSWERfVzFfUlNTSV9MTkEpOwogCXN3aXRjaCAobG5hKSB7CiAJY2FzZSAzOgotCQlvZmZzZXQgPSA5MDsKKwkJb2Zmc2V0ICs9IDkwOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCW9mZnNldCA9IDc0OworCQlvZmZzZXQgKz0gNzQ7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJb2Zmc2V0ID0gNjQ7CisJCW9mZnNldCArPSA2NDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHJ0MngwMGRldi0+cnhfc3RhdHVzLmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQlpZiAodGVzdF9iaXQoQ09ORklHX0VYVEVSTkFMX0xOQV9BLCAmcnQyeDAwZGV2LT5mbGFncykpCi0JCQlvZmZzZXQgKz0gMTQ7Ci0KIAkJaWYgKGxuYSA9PSAzIHx8IGxuYSA9PSAyKQogCQkJb2Zmc2V0ICs9IDEwOwotCi0JCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9SU1NJX09GRlNFVF9BLCAmZWVwcm9tKTsKLQkJb2Zmc2V0IC09IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX09GRlNFVF9BXzEpOwotCX0gZWxzZSB7Ci0JCWlmICh0ZXN0X2JpdChDT05GSUdfRVhURVJOQUxfTE5BX0JHLCAmcnQyeDAwZGV2LT5mbGFncykpCi0JCQlvZmZzZXQgKz0gMTQ7Ci0KLQkJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX1JTU0lfT0ZGU0VUX0JHLCAmZWVwcm9tKTsKLQkJb2Zmc2V0IC09IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX09GRlNFVF9CR18xKTsKIAl9CiAKIAlyZXR1cm4gcnQyeDAwX2dldF9maWVsZDMyKHJ4ZF93MSwgUlhEX1cxX1JTU0lfQUdDKSAqIDIgLSBvZmZzZXQ7CkBAIC0xNzE4LDYgKzE5MzYsNyBAQAogc3RhdGljIHZvaWQgcnQ2MXBjaV9maWxsX3J4ZG9uZShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAogCQkJICAgICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYykKIHsKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7CiAJc3RydWN0IHF1ZXVlX2VudHJ5X3ByaXZfcGNpICplbnRyeV9wcml2ID0gZW50cnktPnByaXZfZGF0YTsKIAl1MzIgd29yZDA7CiAJdTMyIHdvcmQxOwpAQCAtMTcyOCw2ICsxOTQ3LDM4IEBACiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX0NSQ19FUlJPUikpCiAJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKIAorCWlmICh0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19DUllQVE8sICZydDJ4MDBkZXYtPmZsYWdzKSkgeworCQlyeGRlc2MtPmNpcGhlciA9CisJCSAgICBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZDAsIFJYRF9XMF9DSVBIRVJfQUxHKTsKKwkJcnhkZXNjLT5jaXBoZXJfc3RhdHVzID0KKwkJICAgIHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX0NJUEhFUl9FUlJPUik7CisJfQorCisJaWYgKHJ4ZGVzYy0+Y2lwaGVyICE9IENJUEhFUl9OT05FKSB7CisJCV9ydDJ4MDBfZGVzY19yZWFkKGVudHJ5X3ByaXYtPmRlc2MsIDIsICZyeGRlc2MtPml2KTsKKwkJX3J0MngwMF9kZXNjX3JlYWQoZW50cnlfcHJpdi0+ZGVzYywgMywgJnJ4ZGVzYy0+ZWl2KTsKKwkJX3J0MngwMF9kZXNjX3JlYWQoZW50cnlfcHJpdi0+ZGVzYywgNCwgJnJ4ZGVzYy0+aWN2KTsKKworCQkvKgorCQkgKiBIYXJkd2FyZSBoYXMgc3RyaXBwZWQgSVYvRUlWIGRhdGEgZnJvbSA4MDIuMTEgZnJhbWUgZHVyaW5nCisJCSAqIGRlY3J5cHRpb24uIEl0IGhhcyBwcm92aWRlZCB0aGUgZGF0YSBzZXBlcmF0ZWx5IGJ1dCBydDJ4MDBsaWIKKwkJICogc2hvdWxkIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUgcmVpbnNlcnRlZC4KKwkJICovCisJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19JVl9TVFJJUFBFRDsKKworCQkvKgorCQkgKiBGSVhNRTogTGVnYWN5IGRyaXZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgZnJhbWUgZG9lcworCQkgKiBjb250YWluIHRoZSBNaWNoYWVsIE1pYy4gVW5mb3J0dW5hdGVseSwgaW4gcnQyeDAwCisJCSAqIHRoZSBNSUMgc2VlbXMgdG8gYmUgbWlzc2luZyBjb21wbGV0ZWx5Li4uCisJCSAqLworCQlyeGRlc2MtPmZsYWdzIHw9IFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsKKworCQlpZiAocnhkZXNjLT5jaXBoZXJfc3RhdHVzID09IFJYX0NSWVBUT19TVUNDRVNTKQorCQkJcnhkZXNjLT5mbGFncyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKKwkJZWxzZSBpZiAocnhkZXNjLT5jaXBoZXJfc3RhdHVzID09IFJYX0NSWVBUT19GQUlMX01JQykKKwkJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19NTUlDX0VSUk9SOworCX0KKwogCS8qCiAJICogT2J0YWluIHRoZSBzdGF0dXMgYWJvdXQgdGhpcyBwYWNrZXQuCiAJICogV2hlbiBmcmFtZSB3YXMgcmVjZWl2ZWQgd2l0aCBhbiBPRkRNIGJpdHJhdGUsCkBAIC0xNzM1LDExICsxOTg2LDEzIEBACiAJICogYSBDQ0sgYml0cmF0ZSB0aGUgc2lnbmFsIGlzIHRoZSByYXRlIGluIDEwMGtiaXQvcy4KIAkgKi8KIAlyeGRlc2MtPnNpZ25hbCA9IHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMSwgUlhEX1cxX1NJR05BTCk7Ci0JcnhkZXNjLT5yc3NpID0gcnQ2MXBjaV9hZ2NfdG9fcnNzaShlbnRyeS0+cXVldWUtPnJ0MngwMGRldiwgd29yZDEpOworCXJ4ZGVzYy0+cnNzaSA9IHJ0NjFwY2lfYWdjX3RvX3Jzc2kocnQyeDAwZGV2LCB3b3JkMSk7CiAJcnhkZXNjLT5zaXplID0gcnQyeDAwX2dldF9maWVsZDMyKHdvcmQwLCBSWERfVzBfREFUQUJZVEVfQ09VTlQpOwogCiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX09GRE0pKQogCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX1BMQ1A7CisJZWxzZQorCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX0JJVFJBVEU7CiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX01ZX0JTUykpCiAJCXJ4ZGVzYy0+ZGV2X2ZsYWdzIHw9IFJYRE9ORV9NWV9CU1M7CiB9CkBAIC0xODYwLDcgKzIxMTMsNyBAQAogCWlmICghcmVnICYmICFyZWdfbWN1KQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpZiAoIXRlc3RfYml0KERFVklDRV9FTkFCTEVEX1JBRElPLCAmcnQyeDAwZGV2LT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfRU5BQkxFRF9SQURJTywgJnJ0MngwMGRldi0+ZmxhZ3MpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKIAkvKgpAQCAtMjA2MCwxMCArMjMxMywxMCBAQAogCS8qCiAJICogRGV0ZWN0IGlmIHRoaXMgZGV2aWNlIGhhcyBhbiBoYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvLgogCSAqLwotI2lmZGVmIENPTkZJR19SVDYxUENJX1JGS0lMTAorI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX1JGS0lMTAogCWlmIChydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fQU5URU5OQV9IQVJEV0FSRV9SQURJTykpCiAJCV9fc2V0X2JpdChDT05GSUdfU1VQUE9SVF9IV19CVVRUT04sICZydDJ4MDBkZXYtPmZsYWdzKTsKLSNlbmRpZiAvKiBDT05GSUdfUlQ2MVBDSV9SRktJTEwgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9SRktJTEwgKi8KIAogCS8qCiAJICogUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IGFuZCBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZS4KQEAgLTIxMjEsNyArMjM3NCw3IEBACiAJICogSWYgdGhlIGVlcHJvbSB2YWx1ZSBpcyBpbnZhbGlkLAogCSAqIHN3aXRjaCB0byBkZWZhdWx0IGxlZCBtb2RlLgogCSAqLwotI2lmZGVmIENPTkZJR19SVDYxUENJX0xFRFMKKyNpZmRlZiBDT05GSUdfUlQyWDAwX0xJQl9MRURTCiAJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX0xFRCwgJmVlcHJvbSk7CiAJdmFsdWUgPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fTEVEX0xFRF9NT0RFKTsKIApAQCAtMjE1NSw3ICsyNDA4LDcgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMTYoJnJ0MngwMGRldi0+bGVkX21jdV9yZWcsIE1DVV9MRURDU19QT0xBUklUWV9SRUFEWV9BLAogCQkJICAgcnQyeDAwX2dldF9maWVsZDE2KGVlcHJvbSwKIAkJCQkJICAgICAgRUVQUk9NX0xFRF9QT0xBUklUWV9SRFlfQSkpOwotI2VuZGlmIC8qIENPTkZJR19SVDYxUENJX0xFRFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9MRURTICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNzQsMTAgKzI1MjcsMTEgQEAKIAl7IDQ2LCAweDAwMDAyY2NjLCAweDAwMDA0OWE2LCAweDAwMDliZTU1LCAweDAwMGMwYTIzIH0sCiB9OwogCi1zdGF0aWMgdm9pZCBydDYxcGNpX3Byb2JlX2h3X21vZGUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKK3N0YXRpYyBpbnQgcnQ2MXBjaV9wcm9iZV9od19tb2RlKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpCiB7CiAJc3RydWN0IGh3X21vZGVfc3BlYyAqc3BlYyA9ICZydDJ4MDBkZXYtPnNwZWM7Ci0JdTggKnR4cG93ZXI7CisJc3RydWN0IGNoYW5uZWxfaW5mbyAqaW5mbzsKKwljaGFyICp0eF9wb3dlcjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qCkBAIC0yMjk0LDIwICsyNTQ4LDEwIEBACiAJCQkJCQkgICBFRVBST01fTUFDX0FERFJfMCkpOwogCiAJLyoKLQkgKiBDb252ZXJ0IHR4X3Bvd2VyIGFycmF5IGluIGVlcHJvbS4KLQkgKi8KLQl0eHBvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfR19TVEFSVCk7Ci0JZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCi0JCXR4cG93ZXJbaV0gPSBUWFBPV0VSX0ZST01fREVWKHR4cG93ZXJbaV0pOwotCi0JLyoKIAkgKiBJbml0aWFsaXplIGh3X21vZGUgaW5mb3JtYXRpb24uCiAJICovCiAJc3BlYy0+c3VwcG9ydGVkX2JhbmRzID0gU1VQUE9SVF9CQU5EXzJHSFo7CiAJc3BlYy0+c3VwcG9ydGVkX3JhdGVzID0gU1VQUE9SVF9SQVRFX0NDSyB8IFNVUFBPUlRfUkFURV9PRkRNOwotCXNwZWMtPnR4X3Bvd2VyX2EgPSBOVUxMOwotCXNwZWMtPnR4X3Bvd2VyX2JnID0gdHhwb3dlcjsKLQlzcGVjLT50eF9wb3dlcl9kZWZhdWx0ID0gREVGQVVMVF9UWFBPV0VSOwogCiAJaWYgKCF0ZXN0X2JpdChDT05GSUdfUkZfU0VRVUVOQ0UsICZydDJ4MDBkZXYtPmZsYWdzKSkgewogCQlzcGVjLT5udW1fY2hhbm5lbHMgPSAxNDsKQEAgLTIzMjEsMTMgKzI1NjUsMjggQEAKIAkgICAgcnQyeDAwX3JmKCZydDJ4MDBkZXYtPmNoaXAsIFJGNTMyNSkpIHsKIAkJc3BlYy0+c3VwcG9ydGVkX2JhbmRzIHw9IFNVUFBPUlRfQkFORF81R0haOwogCQlzcGVjLT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHJmX3ZhbHNfc2VxKTsKLQotCQl0eHBvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfQV9TVEFSVCk7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQkJdHhwb3dlcltpXSA9IFRYUE9XRVJfRlJPTV9ERVYodHhwb3dlcltpXSk7Ci0KLQkJc3BlYy0+dHhfcG93ZXJfYSA9IHR4cG93ZXI7CiAJfQorCisJLyoKKwkgKiBDcmVhdGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhcnJheQorCSAqLworCWluZm8gPSBremFsbG9jKHNwZWMtPm51bV9jaGFubmVscyAqIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGVjLT5jaGFubmVsc19pbmZvID0gaW5mbzsKKworCXR4X3Bvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfR19TVEFSVCk7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCWluZm9baV0udHhfcG93ZXIxID0gVFhQT1dFUl9GUk9NX0RFVih0eF9wb3dlcltpXSk7CisKKwlpZiAoc3BlYy0+bnVtX2NoYW5uZWxzID4gMTQpIHsKKwkJdHhfcG93ZXIgPSBydDJ4MDBfZWVwcm9tX2FkZHIocnQyeDAwZGV2LCBFRVBST01fVFhQT1dFUl9BX1NUQVJUKTsKKwkJZm9yIChpID0gMTQ7IGkgPCBzcGVjLT5udW1fY2hhbm5lbHM7IGkrKykKKwkJCWluZm9baV0udHhfcG93ZXIxID0gVFhQT1dFUl9GUk9NX0RFVih0eF9wb3dlcltpXSk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcnQ2MXBjaV9wcm9iZV9odyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQpAQCAtMjM0OCwxMyArMjYwNywxNyBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBodyBzcGVjaWZpY2F0aW9ucy4KIAkgKi8KLQlydDYxcGNpX3Byb2JlX2h3X21vZGUocnQyeDAwZGV2KTsKKwlyZXR2YWwgPSBydDYxcGNpX3Byb2JlX2h3X21vZGUocnQyeDAwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCiAJLyoKIAkgKiBUaGlzIGRldmljZSByZXF1aXJlcyBmaXJtd2FyZSBhbmQgRE1BIG1hcHBlZCBza2JzLgogCSAqLwogCV9fc2V0X2JpdChEUklWRVJfUkVRVUlSRV9GSVJNV0FSRSwgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCV9fc2V0X2JpdChEUklWRVJfUkVRVUlSRV9ETUEsICZydDJ4MDBkZXYtPmZsYWdzKTsKKwlpZiAoIW1vZHBhcmFtX25vaHdjcnlwdCkKKwkJX19zZXRfYml0KENPTkZJR19TVVBQT1JUX0hXX0NSWVBUTywgJnJ0MngwMGRldi0+ZmxhZ3MpOwogCiAJLyoKIAkgKiBTZXQgdGhlIHJzc2kgb2Zmc2V0LgpAQCAtMjM4MSw2ICsyNjQ0LDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcnQ2MXBjaV9jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgcXVldWVfaWR4LAorCQkJICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gaHctPnByaXY7CisJc3RydWN0IGRhdGFfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBydDJ4MDBfZmllbGQzMiBmaWVsZDsKKwlpbnQgcmV0dmFsOworCXUzMiByZWc7CisKKwkvKgorCSAqIEZpcnN0IHBhc3MgdGhlIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCBydDJ4MDBsaWIsIHRoYXQgd2lsbAorCSAqIHVwZGF0ZSB0aGUgcXVldWUgc2V0dGluZ3MgYW5kIHZhbGlkYXRlIHRoZSBpbnB1dC4gQWZ0ZXIgdGhhdAorCSAqIHdlIGFyZSBmcmVlIHRvIHVwZGF0ZSB0aGUgcmVnaXN0ZXJzIGJhc2VkIG9uIHRoZSB2YWx1ZQorCSAqIGluIHRoZSBxdWV1ZSBwYXJhbWV0ZXIuCisJICovCisJcmV0dmFsID0gcnQyeDAwbWFjX2NvbmZfdHgoaHcsIHF1ZXVlX2lkeCwgcGFyYW1zKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcXVldWUgPSBydDJ4MDBxdWV1ZV9nZXRfcXVldWUocnQyeDAwZGV2LCBxdWV1ZV9pZHgpOworCisJLyogVXBkYXRlIFdNTSBUWE9QIHJlZ2lzdGVyICovCisJaWYgKHF1ZXVlX2lkeCA8IDIpIHsKKwkJZmllbGQuYml0X29mZnNldCA9IHF1ZXVlX2lkeCAqIDE2OworCQlmaWVsZC5iaXRfbWFzayA9IDB4ZmZmZiA8PCBmaWVsZC5iaXRfb2Zmc2V0OworCisJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IwLCAmcmVnKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBxdWV1ZS0+dHhvcCk7CisJCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMCwgcmVnKTsKKwl9IGVsc2UgaWYgKHF1ZXVlX2lkeCA8IDQpIHsKKwkJZmllbGQuYml0X29mZnNldCA9IChxdWV1ZV9pZHggLSAyKSAqIDE2OworCQlmaWVsZC5iaXRfbWFzayA9IDB4ZmZmZiA8PCBmaWVsZC5iaXRfb2Zmc2V0OworCisJCXJ0MngwMHBjaV9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IxLCAmcmVnKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBxdWV1ZS0+dHhvcCk7CisJCXJ0MngwMHBjaV9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMSwgcmVnKTsKKwl9CisKKwkvKiBVcGRhdGUgV01NIHJlZ2lzdGVycyAqLworCWZpZWxkLmJpdF9vZmZzZXQgPSBxdWV1ZV9pZHggKiA0OworCWZpZWxkLmJpdF9tYXNrID0gMHhmIDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwlydDJ4MDBwY2lfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIEFJRlNOX0NTUiwgJnJlZyk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBxdWV1ZS0+YWlmcyk7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQUlGU05fQ1NSLCByZWcpOworCisJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBDV01JTl9DU1IsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgcXVldWUtPmN3X21pbik7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQ1dNSU5fQ1NSLCByZWcpOworCisJcnQyeDAwcGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBDV01BWF9DU1IsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgcXVldWUtPmN3X21heCk7CisJcnQyeDAwcGNpX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQ1dNQVhfQ1NSLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB1NjQgcnQ2MXBjaV9nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKQEAgLTI0MDQsMTAgKzI3MjQsMTEgQEAKIAkuY29uZmlnCQkJPSBydDJ4MDBtYWNfY29uZmlnLAogCS5jb25maWdfaW50ZXJmYWNlCT0gcnQyeDAwbWFjX2NvbmZpZ19pbnRlcmZhY2UsCiAJLmNvbmZpZ3VyZV9maWx0ZXIJPSBydDJ4MDBtYWNfY29uZmlndXJlX2ZpbHRlciwKKwkuc2V0X2tleQkJPSBydDJ4MDBtYWNfc2V0X2tleSwKIAkuZ2V0X3N0YXRzCQk9IHJ0MngwMG1hY19nZXRfc3RhdHMsCiAJLnNldF9yZXRyeV9saW1pdAk9IHJ0NjFwY2lfc2V0X3JldHJ5X2xpbWl0LAogCS5ic3NfaW5mb19jaGFuZ2VkCT0gcnQyeDAwbWFjX2Jzc19pbmZvX2NoYW5nZWQsCi0JLmNvbmZfdHgJCT0gcnQyeDAwbWFjX2NvbmZfdHgsCisJLmNvbmZfdHgJCT0gcnQ2MXBjaV9jb25mX3R4LAogCS5nZXRfdHhfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF90eF9zdGF0cywKIAkuZ2V0X3RzZgkJPSBydDYxcGNpX2dldF90c2YsCiB9OwpAQCAtMjQzMiw2ICsyNzUzLDggQEAKIAkud3JpdGVfYmVhY29uCQk9IHJ0NjFwY2lfd3JpdGVfYmVhY29uLAogCS5raWNrX3R4X3F1ZXVlCQk9IHJ0NjFwY2lfa2lja190eF9xdWV1ZSwKIAkuZmlsbF9yeGRvbmUJCT0gcnQ2MXBjaV9maWxsX3J4ZG9uZSwKKwkuY29uZmlnX3NoYXJlZF9rZXkJPSBydDYxcGNpX2NvbmZpZ19zaGFyZWRfa2V5LAorCS5jb25maWdfcGFpcndpc2Vfa2V5CT0gcnQ2MXBjaV9jb25maWdfcGFpcndpc2Vfa2V5LAogCS5jb25maWdfZmlsdGVyCQk9IHJ0NjFwY2lfY29uZmlnX2ZpbHRlciwKIAkuY29uZmlnX2ludGYJCT0gcnQ2MXBjaV9jb25maWdfaW50ZiwKIAkuY29uZmlnX2VycAkJPSBydDYxcGNpX2NvbmZpZ19lcnAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuaAppbmRleCAxMDA0ZDViODk5Li44ZWMxNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmgKQEAgLTEzNCw2ICsxMzQsMTYgQEAKICNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UJCTB4MTIwMAogI2RlZmluZSBQQUlSV0lTRV9UQV9UQUJMRV9CQVNFCQkweDFhMDAKIAorI2RlZmluZSBTSEFSRURfS0VZX0VOVFJZKF9faWR4KSBcCisJKCBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyBcCisJCSgoX19pZHgpICogc2l6ZW9mKHN0cnVjdCBod19rZXlfZW50cnkpKSApCisjZGVmaW5lIFBBSVJXSVNFX0tFWV9FTlRSWShfX2lkeCkgXAorCSggUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyBcCisJCSgoX19pZHgpICogc2l6ZW9mKHN0cnVjdCBod19rZXlfZW50cnkpKSApCisjZGVmaW5lIFBBSVJXSVNFX1RBX0VOVFJZKF9faWR4KSBcCisJKCBQQUlSV0lTRV9UQV9UQUJMRV9CQVNFICsgXAorCQkoKF9faWR4KSAqIHNpemVvZihzdHJ1Y3QgaHdfcGFpcndpc2VfdGFfZW50cnkpKSApCisKIHN0cnVjdCBod19rZXlfZW50cnkgewogCXU4IGtleVsxNl07CiAJdTggdHhfbWljWzhdOwpAQCAtMTQyLDcgKzE1Miw4IEBACiAKIHN0cnVjdCBod19wYWlyd2lzZV90YV9lbnRyeSB7CiAJdTggYWRkcmVzc1s2XTsKLQl1OCByZXNlcnZlZFsyXTsKKwl1OCBjaXBoZXI7CisJdTggcmVzZXJ2ZWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyoKQEAgLTY2Miw2ICs2NzMsMTAgQEAKICAqIFNFQ19DU1I0OiBQYWlyd2lzZSBrZXkgdGFibGUgbG9va3VwIGNvbnRyb2wuCiAgKi8KICNkZWZpbmUgU0VDX0NTUjQJCQkweDMwYjAKKyNkZWZpbmUgU0VDX0NTUjRfRU5BQkxFX0JTUzAJCUZJRUxEMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgU0VDX0NTUjRfRU5BQkxFX0JTUzEJCUZJRUxEMzIoMHgwMDAwMDAwMikKKyNkZWZpbmUgU0VDX0NTUjRfRU5BQkxFX0JTUzIJCUZJRUxEMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgU0VDX0NTUjRfRU5BQkxFX0JTUzMJCUZJRUxEMzIoMHgwMDAwMDAwOCkKIAogLyoKICAqIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIuCkBAIC0xNDI4LDggKzE0NDMsMTAgQEAKIAogLyoKICAqIFdvcmQ0CisgKiBJQ1Y6IFJlY2VpdmVkIElDViBvZiBvcmlnaW5hbGx5IGVuY3J5cHRlZC4KKyAqIE5PVEU6IFRoaXMgaXMgYSBndWVzcywgdGhlIG9mZmljaWFsIGRlZmluaXRpb24gaXMgInJlc2VydmVkIgogICovCi0jZGVmaW5lIFJYRF9XNF9SRVNFUlZFRAkJCUZJRUxEMzIoMHhmZmZmZmZmZikKKyNkZWZpbmUgUlhEX1c0X0lDVgkJCUZJRUxEMzIoMHhmZmZmZmZmZikKIAogLyoKICAqIHRoZSBhYm92ZSAyMC1ieXRlIGlzIGNhbGxlZCBSWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIFJYIGJsb2NrCkBAIC0xNDY1LDE3ICsxNDgyLDEwIEBACiAjZGVmaW5lIE1BWF9UWFBPV0VSCTMxCiAjZGVmaW5lIERFRkFVTFRfVFhQT1dFUgkyNAogCi0jZGVmaW5lIFRYUE9XRVJfRlJPTV9ERVYoX190eHBvd2VyKQkJXAotKHsJCQkJCQlcCi0JKChfX3R4cG93ZXIpID4gTUFYX1RYUE9XRVIpID8JCVwKLQkJREVGQVVMVF9UWFBPV0VSIDogKF9fdHhwb3dlcik7CVwKLX0pCisjZGVmaW5lIFRYUE9XRVJfRlJPTV9ERVYoX190eHBvd2VyKSBcCisJKCgodTgpKF9fdHhwb3dlcikpID4gTUFYX1RYUE9XRVIpID8gREVGQVVMVF9UWFBPV0VSIDogKF9fdHhwb3dlcikKIAotI2RlZmluZSBUWFBPV0VSX1RPX0RFVihfX3R4cG93ZXIpCQkJXAotKHsJCQkJCQkJXAotCSgoX190eHBvd2VyKSA8PSBNSU5fVFhQT1dFUikgPyBNSU5fVFhQT1dFUiA6CVwKLQkoKChfX3R4cG93ZXIpID49IE1BWF9UWFBPV0VSKSA/IE1BWF9UWFBPV0VSIDoJXAotCShfX3R4cG93ZXIpKTsJCQkJCVwKLX0pCisjZGVmaW5lIFRYUE9XRVJfVE9fREVWKF9fdHhwb3dlcikgXAorCWNsYW1wX3QoY2hhciwgX190eHBvd2VyLCBNSU5fVFhQT1dFUiwgTUFYX1RYUE9XRVIpCiAKICNlbmRpZiAvKiBSVDYxUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCmluZGV4IDk3NjFlYWEuLjkzNGY4ZTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKQEAgLTM3LDYgKzM3LDEzIEBACiAjaW5jbHVkZSAicnQ3M3VzYi5oIgogCiAvKgorICogQWxsb3cgaGFyZHdhcmUgZW5jcnlwdGlvbiB0byBiZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBtb2RwYXJhbV9ub2h3Y3J5cHQgPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKG5vaHdjcnlwdCwgbW9kcGFyYW1fbm9od2NyeXB0LCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9od2NyeXB0LCAiRGlzYWJsZSBoYXJkd2FyZSBlbmNyeXB0aW9uLiIpOworCisvKgogICogUmVnaXN0ZXIgYWNjZXNzLgogICogQWxsIGFjY2VzcyB0byB0aGUgQ1NSIHJlZ2lzdGVycyB3aWxsIGdvIHRocm91Z2ggdGhlIG1ldGhvZHMKICAqIHJ0NzN1c2JfcmVnaXN0ZXJfcmVhZCBhbmQgcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZS4KQEAgLTI4NSw3ICsyOTIsNyBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUlQyWDAwX0xJQl9ERUJVR0ZTICovCiAKLSNpZmRlZiBDT05GSUdfUlQ3M1VTQl9MRURTCisjaWZkZWYgQ09ORklHX1JUMlgwMF9MSUJfTEVEUwogc3RhdGljIHZvaWQgcnQ3M3VzYl9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKIAkJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCiB7CkBAIC0zNTIsMTEgKzM1OSwyMjQgQEAKIAlsZWQtPmxlZF9kZXYuYmxpbmtfc2V0ID0gcnQ3M3VzYl9ibGlua19zZXQ7CiAJbGVkLT5mbGFncyA9IExFRF9JTklUSUFMSVpFRDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUlQ3M1VTQl9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiAvKgogICogQ29uZmlndXJhdGlvbiBoYW5kbGVycy4KICAqLworc3RhdGljIGludCBydDczdXNiX2NvbmZpZ19zaGFyZWRfa2V5KHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJICAgICBzdHJ1Y3QgcnQyeDAwbGliX2NyeXB0byAqY3J5cHRvLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBod19rZXlfZW50cnkga2V5X2VudHJ5OworCXN0cnVjdCBydDJ4MDBfZmllbGQzMiBmaWVsZDsKKwlpbnQgdGltZW91dDsKKwl1MzIgbWFzazsKKwl1MzIgcmVnOworCisJaWYgKGNyeXB0by0+Y21kID09IFNFVF9LRVkpIHsKKwkJLyoKKwkJICogcnQyeDAwbGliIGNhbid0IGRldGVybWluZSB0aGUgY29ycmVjdCBmcmVlCisJCSAqIGtleV9pZHggZm9yIHNoYXJlZCBrZXlzLiBXZSBoYXZlIDEgcmVnaXN0ZXIKKwkJICogd2l0aCBrZXkgdmFsaWQgYml0cy4gVGhlIGdvYWwgaXMgc2ltcGxlLCByZWFkCisJCSAqIHRoZSByZWdpc3RlciwgaWYgdGhhdCBpcyBmdWxsIHdlIGhhdmUgbm8gc2xvdHMKKwkJICogbGVmdC4KKwkJICogTm90ZSB0aGF0IGVhY2ggQlNTIGlzIGFsbG93ZWQgdG8gaGF2ZSB1cCB0byA0CisJCSAqIHNoYXJlZCBrZXlzLCBzbyBwdXQgYSBtYXNrIG92ZXIgdGhlIGFsbG93ZWQKKwkJICogZW50cmllcy4KKwkJICovCisJCW1hc2sgPSAoMHhmIDw8IGNyeXB0by0+YnNzaWR4KTsKKworCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMCwgJnJlZyk7CisJCXJlZyAmPSBtYXNrOworCisJCWlmIChyZWcgJiYgcmVnID09IG1hc2spCisJCQlyZXR1cm4gLUVOT1NQQzsKKworCQlrZXktPmh3X2tleV9pZHggKz0gcmVnID8gZmZ6KHJlZykgOiAwOworCisJCS8qCisJCSAqIFVwbG9hZCBrZXkgdG8gaGFyZHdhcmUKKwkJICovCisJCW1lbWNweShrZXlfZW50cnkua2V5LCBjcnlwdG8tPmtleSwKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkua2V5KSk7CisJCW1lbWNweShrZXlfZW50cnkudHhfbWljLCBjcnlwdG8tPnR4X21pYywKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkudHhfbWljKSk7CisJCW1lbWNweShrZXlfZW50cnkucnhfbWljLCBjcnlwdG8tPnJ4X21pYywKKwkJICAgICAgIHNpemVvZihrZXlfZW50cnkucnhfbWljKSk7CisKKwkJcmVnID0gU0hBUkVEX0tFWV9FTlRSWShrZXktPmh3X2tleV9pZHgpOworCQl0aW1lb3V0ID0gUkVHSVNURVJfVElNRU9VVDMyKHNpemVvZihrZXlfZW50cnkpKTsKKwkJcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2xhcmdlX2J1ZmYocnQyeDAwZGV2LCBVU0JfTVVMVElfV1JJVEUsCisJCQkJCQkgICAgVVNCX1ZFTkRPUl9SRVFVRVNUX09VVCwgcmVnLAorCQkJCQkJICAgICZrZXlfZW50cnksCisJCQkJCQkgICAgc2l6ZW9mKGtleV9lbnRyeSksCisJCQkJCQkgICAgdGltZW91dCk7CisKKwkJLyoKKwkJICogVGhlIGNpcGhlciB0eXBlcyBhcmUgc3RvcmVkIG92ZXIgMiByZWdpc3RlcnMuCisJCSAqIGJzc2lkeCAwIGFuZCAxIGtleXMgYXJlIHN0b3JlZCBpbiBTRUNfQ1NSMSBhbmQKKwkJICogYnNzaWR4IDEgYW5kIDIga2V5cyBhcmUgc3RvcmVkIGluIFNFQ19DU1I1LgorCQkgKiBVc2luZyB0aGUgY29ycmVjdCBkZWZpbmVzIGNvcnJlY3RseSB3aWxsIGNhdXNlIG92ZXJoZWFkLAorCQkgKiBzbyBqdXN0IGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBvZmZzZXQuCisJCSAqLworCQlpZiAoa2V5LT5od19rZXlfaWR4IDwgOCkgeworCQkJZmllbGQuYml0X29mZnNldCA9ICgzICoga2V5LT5od19rZXlfaWR4KTsKKwkJCWZpZWxkLmJpdF9tYXNrID0gMHg3IDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwkJCXJ0NzN1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1IxLCAmcmVnKTsKKwkJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgY3J5cHRvLT5jaXBoZXIpOworCQkJcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFNFQ19DU1IxLCByZWcpOworCQl9IGVsc2UgeworCQkJZmllbGQuYml0X29mZnNldCA9ICgzICogKGtleS0+aHdfa2V5X2lkeCAtIDgpKTsKKwkJCWZpZWxkLmJpdF9tYXNrID0gMHg3IDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwkJCXJ0NzN1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1I1LCAmcmVnKTsKKwkJCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgY3J5cHRvLT5jaXBoZXIpOworCQkJcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFNFQ19DU1I1LCByZWcpOworCQl9CisKKwkJLyoKKwkJICogVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJVi9FSVYgZ2VuZXJhdGlvbgorCQkgKiBpbiBoYXJkd2FyZS4gSG93ZXZlciBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlIElWL0VJVgorCQkgKiBpbnNpZGUgdGhlIGllZWU4MDIxMSBmcmFtZSBlaXRoZXIsIGJ1dCByZXF1aXJlcyBpdAorCQkgKiB0byBiZSBwcm92aWRlZCBzZXBlcmF0ZWx5IGZvciB0aGUgZGVzY3JpcHRvci4KKwkJICogcnQyeDAwbGliIHdpbGwgY3V0IHRoZSBJVi9FSVYgZGF0YSBvdXQgb2YgYWxsIGZyYW1lcworCQkgKiBnaXZlbiB0byB1cyBieSBtYWM4MDIxMSwgYnV0IHdlIG11c3QgdGVsbCBtYWM4MDIxMQorCQkgKiB0byBnZW5lcmF0ZSB0aGUgSVYvRUlWIGRhdGEuCisJCSAqLworCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwl9CisKKwkvKgorCSAqIFNFQ19DU1IwIGNvbnRhaW5zIG9ubHkgc2luZ2xlLWJpdCBmaWVsZHMgdG8gaW5kaWNhdGUKKwkgKiBhIHBhcnRpY3VsYXIga2V5IGlzIHZhbGlkLiBCZWNhdXNlIHVzaW5nIHRoZSBGSUVMRDMyKCkKKwkgKiBkZWZpbmVzIGRpcmVjdGx5IHdpbGwgY2F1c2UgYSBsb3Qgb2Ygb3ZlcmhlYWQgd2UgdXNlCisJICogYSBjYWxjdWxhdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYml0IGRpcmVjdGx5LgorCSAqLworCW1hc2sgPSAxIDw8IGtleS0+aHdfa2V5X2lkeDsKKworCXJ0NzN1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIFNFQ19DU1IwLCAmcmVnKTsKKwlpZiAoY3J5cHRvLT5jbWQgPT0gU0VUX0tFWSkKKwkJcmVnIHw9IG1hc2s7CisJZWxzZSBpZiAoY3J5cHRvLT5jbWQgPT0gRElTQUJMRV9LRVkpCisJCXJlZyAmPSB+bWFzazsKKwlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjAsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDczdXNiX2NvbmZpZ19wYWlyd2lzZV9rZXkoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKKwkJCQkgICAgICAgc3RydWN0IHJ0MngwMGxpYl9jcnlwdG8gKmNyeXB0bywKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBod19wYWlyd2lzZV90YV9lbnRyeSBhZGRyX2VudHJ5OworCXN0cnVjdCBod19rZXlfZW50cnkga2V5X2VudHJ5OworCWludCB0aW1lb3V0OworCXUzMiBtYXNrOworCXUzMiByZWc7CisKKwlpZiAoY3J5cHRvLT5jbWQgPT0gU0VUX0tFWSkgeworCQkvKgorCQkgKiBydDJ4MDBsaWIgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGZyZWUKKwkJICoga2V5X2lkeCBmb3IgcGFpcndpc2Uga2V5cy4gV2UgaGF2ZSAyIHJlZ2lzdGVycworCQkgKiB3aXRoIGtleSB2YWxpZCBiaXRzLiBUaGUgZ29hbCBpcyBzaW1wbGUsIHJlYWQKKwkJICogdGhlIGZpcnN0IHJlZ2lzdGVyLCBpZiB0aGF0IGlzIGZ1bGwgbW92ZSB0bworCQkgKiB0aGUgbmV4dCByZWdpc3Rlci4KKwkJICogV2hlbiBib3RoIHJlZ2lzdGVycyBhcmUgZnVsbCwgd2UgZHJvcCB0aGUga2V5LAorCQkgKiBvdGhlcndpc2Ugd2UgdXNlIHRoZSBmaXJzdCBpbnZhbGlkIGVudHJ5LgorCQkgKi8KKwkJcnQ3M3VzYl9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgU0VDX0NTUjIsICZyZWcpOworCQlpZiAocmVnICYmIHJlZyA9PSB+MCkgeworCQkJa2V5LT5od19rZXlfaWR4ID0gMzI7CisJCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMywgJnJlZyk7CisJCQlpZiAocmVnICYmIHJlZyA9PSB+MCkKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCisJCWtleS0+aHdfa2V5X2lkeCArPSByZWcgPyBmZnoocmVnKSA6IDA7CisKKwkJLyoKKwkJICogVXBsb2FkIGtleSB0byBoYXJkd2FyZQorCQkgKi8KKwkJbWVtY3B5KGtleV9lbnRyeS5rZXksIGNyeXB0by0+a2V5LAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS5rZXkpKTsKKwkJbWVtY3B5KGtleV9lbnRyeS50eF9taWMsIGNyeXB0by0+dHhfbWljLAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS50eF9taWMpKTsKKwkJbWVtY3B5KGtleV9lbnRyeS5yeF9taWMsIGNyeXB0by0+cnhfbWljLAorCQkgICAgICAgc2l6ZW9mKGtleV9lbnRyeS5yeF9taWMpKTsKKworCQlyZWcgPSBQQUlSV0lTRV9LRVlfRU5UUlkoa2V5LT5od19rZXlfaWR4KTsKKwkJdGltZW91dCA9IFJFR0lTVEVSX1RJTUVPVVQzMihzaXplb2Yoa2V5X2VudHJ5KSk7CisJCXJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdF9sYXJnZV9idWZmKHJ0MngwMGRldiwgVVNCX01VTFRJX1dSSVRFLAorCQkJCQkJICAgIFVTQl9WRU5ET1JfUkVRVUVTVF9PVVQsIHJlZywKKwkJCQkJCSAgICAma2V5X2VudHJ5LAorCQkJCQkJICAgIHNpemVvZihrZXlfZW50cnkpLAorCQkJCQkJICAgIHRpbWVvdXQpOworCisJCS8qCisJCSAqIFNlbmQgdGhlIGFkZHJlc3MgYW5kIGNpcGhlciB0eXBlIHRvIHRoZSBoYXJkd2FyZSByZWdpc3Rlci4KKwkJICogVGhpcyBkYXRhIGZpdHMgd2l0aGluIHRoZSBDU1IgY2FjaGUgc2l6ZSwgc28gd2UgY2FuIHVzZQorCQkgKiBydDczdXNiX3JlZ2lzdGVyX211bHRpd3JpdGUoKSBkaXJlY3RseS4KKwkJICovCisJCW1lbXNldCgmYWRkcl9lbnRyeSwgMCwgc2l6ZW9mKGFkZHJfZW50cnkpKTsKKwkJbWVtY3B5KCZhZGRyX2VudHJ5LCBjcnlwdG8tPmFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJYWRkcl9lbnRyeS5jaXBoZXIgPSBjcnlwdG8tPmNpcGhlcjsKKworCQlyZWcgPSBQQUlSV0lTRV9UQV9FTlRSWShrZXktPmh3X2tleV9pZHgpOworCQlydDczdXNiX3JlZ2lzdGVyX211bHRpd3JpdGUocnQyeDAwZGV2LCByZWcsCisJCQkJCSAgICAmYWRkcl9lbnRyeSwgc2l6ZW9mKGFkZHJfZW50cnkpKTsKKworCQkvKgorCQkgKiBFbmFibGUgcGFpcndpc2UgbG9va3VwIHRhYmxlIGZvciBnaXZlbiBCU1MgaWR4LAorCQkgKiB3aXRob3V0IHRoaXMgcmVjZWl2ZWQgZnJhbWVzIHdpbGwgbm90IGJlIGRlY3J5cHRlZAorCQkgKiBieSB0aGUgaGFyZHdhcmUuCisJCSAqLworCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSNCwgJnJlZyk7CisJCXJlZyB8PSAoMSA8PCBjcnlwdG8tPmJzc2lkeCk7CisJCXJ0NzN1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBTRUNfQ1NSNCwgcmVnKTsKKworCQkvKgorCQkgKiBUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIElWL0VJViBnZW5lcmF0aW9uCisJCSAqIGluIGhhcmR3YXJlLiBIb3dldmVyIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgSVYvRUlWCisJCSAqIGluc2lkZSB0aGUgaWVlZTgwMjExIGZyYW1lIGVpdGhlciwgYnV0IHJlcXVpcmVzIGl0CisJCSAqIHRvIGJlIHByb3ZpZGVkIHNlcGVyYXRlbHkgZm9yIHRoZSBkZXNjcmlwdG9yLgorCQkgKiBydDJ4MDBsaWIgd2lsbCBjdXQgdGhlIElWL0VJViBkYXRhIG91dCBvZiBhbGwgZnJhbWVzCisJCSAqIGdpdmVuIHRvIHVzIGJ5IG1hYzgwMjExLCBidXQgd2UgbXVzdCB0ZWxsIG1hYzgwMjExCisJCSAqIHRvIGdlbmVyYXRlIHRoZSBJVi9FSVYgZGF0YS4KKwkJICovCisJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCX0KKworCS8qCisJICogU0VDX0NTUjIgYW5kIFNFQ19DU1IzIGNvbnRhaW4gb25seSBzaW5nbGUtYml0IGZpZWxkcyB0byBpbmRpY2F0ZQorCSAqIGEgcGFydGljdWxhciBrZXkgaXMgdmFsaWQuIEJlY2F1c2UgdXNpbmcgdGhlIEZJRUxEMzIoKQorCSAqIGRlZmluZXMgZGlyZWN0bHkgd2lsbCBjYXVzZSBhIGxvdCBvZiBvdmVyaGVhZCB3ZSB1c2UKKwkgKiBhIGNhbGN1bGF0aW9uIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBiaXQgZGlyZWN0bHkuCisJICovCisJaWYgKGtleS0+aHdfa2V5X2lkeCA8IDMyKSB7CisJCW1hc2sgPSAxIDw8IGtleS0+aHdfa2V5X2lkeDsKKworCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMiwgJnJlZyk7CisJCWlmIChjcnlwdG8tPmNtZCA9PSBTRVRfS0VZKQorCQkJcmVnIHw9IG1hc2s7CisJCWVsc2UgaWYgKGNyeXB0by0+Y21kID09IERJU0FCTEVfS0VZKQorCQkJcmVnICY9IH5tYXNrOworCQlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjIsIHJlZyk7CisJfSBlbHNlIHsKKwkJbWFzayA9IDEgPDwgKGtleS0+aHdfa2V5X2lkeCAtIDMyKTsKKworCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBTRUNfQ1NSMywgJnJlZyk7CisJCWlmIChjcnlwdG8tPmNtZCA9PSBTRVRfS0VZKQorCQkJcmVnIHw9IG1hc2s7CisJCWVsc2UgaWYgKGNyeXB0by0+Y21kID09IERJU0FCTEVfS0VZKQorCQkJcmVnICY9IH5tYXNrOworCQlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgU0VDX0NTUjMsIHJlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHJ0NzN1c2JfY29uZmlnX2ZpbHRlcihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAogCQkJCSAgY29uc3QgdW5zaWduZWQgaW50IGZpbHRlcl9mbGFncykKIHsKQEAgLTQ1MSw2ICs2NzEsMjYgQEAKIAlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhSWF9DU1I0LCByZWcpOwogfQogCitzdGF0aWMgdm9pZCBydDczdXNiX2NvbmZpZ19sbmFfZ2FpbihzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAorCQkJCSAgICBzdHJ1Y3QgcnQyeDAwbGliX2NvbmYgKmxpYmNvbmYpCit7CisJdTE2IGVlcHJvbTsKKwlzaG9ydCBsbmFfZ2FpbiA9IDA7CisKKwlpZiAobGliY29uZi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CisJCWlmICh0ZXN0X2JpdChDT05GSUdfRVhURVJOQUxfTE5BX0JHLCAmcnQyeDAwZGV2LT5mbGFncykpCisJCQlsbmFfZ2FpbiArPSAxNDsKKworCQlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fUlNTSV9PRkZTRVRfQkcsICZlZXByb20pOworCQlsbmFfZ2FpbiAtPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fUlNTSV9PRkZTRVRfQkdfMSk7CisJfSBlbHNlIHsKKwkJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX1JTU0lfT0ZGU0VUX0EsICZlZXByb20pOworCQlsbmFfZ2FpbiAtPSBydDJ4MDBfZ2V0X2ZpZWxkMTYoZWVwcm9tLCBFRVBST01fUlNTSV9PRkZTRVRfQV8xKTsKKwl9CisKKwlydDJ4MDBkZXYtPmxuYV9nYWluID0gbG5hX2dhaW47Cit9CisKIHN0YXRpYyB2b2lkIHJ0NzN1c2JfY29uZmlnX3BoeW1vZGUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKIAkJCQkgICBjb25zdCBpbnQgYmFzaWNfcmF0ZV9tYXNrKQogewpAQCAtNzA1LDYgKzk0NSw5IEBACiAJCQkgICBzdHJ1Y3QgcnQyeDAwbGliX2NvbmYgKmxpYmNvbmYsCiAJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CisJLyogQWx3YXlzIHJlY2FsY3VsYXRlIExOQSBnYWluIGJlZm9yZSBjaGFuZ2luZyBjb25maWd1cmF0aW9uICovCisJcnQ3M3VzYl9jb25maWdfbG5hX2dhaW4ocnQyeDAwZGV2LCBsaWJjb25mKTsKKwogCWlmIChmbGFncyAmIENPTkZJR19VUERBVEVfUEhZTU9ERSkKIAkJcnQ3M3VzYl9jb25maWdfcGh5bW9kZShydDJ4MDBkZXYsIGxpYmNvbmYtPmJhc2ljX3JhdGVzKTsKIAlpZiAoZmxhZ3MgJiBDT05GSUdfVVBEQVRFX0NIQU5ORUwpCkBAIC0xMDM0LDE2ICsxMjc3LDYgQEAKIAlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgUEhZX0NTUjYsIDB4MDAwODA2MDYpOwogCXJ0NzN1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBQSFlfQ1NSNywgMHgwMDAwMDQwOCk7CiAKLQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBQ19UWE9QX0NTUjAsICZyZWcpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBQ19UWE9QX0NTUjBfQUMwX1RYX09QLCAwKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQUNfVFhPUF9DU1IwX0FDMV9UWF9PUCwgMCk7Ci0JcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMCwgcmVnKTsKLQotCXJ0NzN1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMSwgJnJlZyk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEFDX1RYT1BfQ1NSMV9BQzJfVFhfT1AsIDE5Mik7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIEFDX1RYT1BfQ1NSMV9BQzNfVFhfT1AsIDQ4KTsKLQlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IxLCByZWcpOwotCiAJcnQ3M3VzYl9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX0NTUjksICZyZWcpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBNQUNfQ1NSOV9DV19TRUxFQ1QsIDApOwogCXJ0NzN1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBNQUNfQ1NSOSwgcmVnKTsKQEAgLTEyNjUsOCArMTQ5OCw4IEBACiAgKiBUWCBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uCiAgKi8KIHN0YXRpYyB2b2lkIHJ0NzN1c2Jfd3JpdGVfdHhfZGVzYyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBzdHJ1Y3QgdHhlbnRyeV9kZXNjICp0eGRlc2MpCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IHR4ZW50cnlfZGVzYyAqdHhkZXNjKQogewogCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhza2IpOwogCV9fbGUzMiAqdHhkID0gc2tiZGVzYy0+ZGVzYzsKQEAgLTEyODAsNyArMTUxMyw3IEBACiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfQUlGU04sIHR4ZGVzYy0+YWlmcyk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfQ1dNSU4sIHR4ZGVzYy0+Y3dfbWluKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMV9DV01BWCwgdHhkZXNjLT5jd19tYXgpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cxX0lWX09GRlNFVCwgSUVFRTgwMjExX0hFQURFUik7CisJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfSVZfT0ZGU0VULCB0eGRlc2MtPml2X29mZnNldCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzFfSFdfU0VRVUVOQ0UsCiAJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfR0VORVJBVEVfU0VRLCAmdHhkZXNjLT5mbGFncykpOwogCXJ0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMSwgd29yZCk7CkBAIC0xMjkyLDYgKzE1MjUsMTEgQEAKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMl9QTENQX0xFTkdUSF9ISUdILCB0eGRlc2MtPmxlbmd0aF9oaWdoKTsKIAlydDJ4MDBfZGVzY193cml0ZSh0eGQsIDIsIHdvcmQpOwogCisJaWYgKHRlc3RfYml0KEVOVFJZX1RYRF9FTkNSWVBULCAmdHhkZXNjLT5mbGFncykpIHsKKwkJX3J0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMywgc2tiZGVzYy0+aXYpOworCQlfcnQyeDAwX2Rlc2Nfd3JpdGUodHhkLCA0LCBza2JkZXNjLT5laXYpOworCX0KKwogCXJ0MngwMF9kZXNjX3JlYWQodHhkLCA1LCAmd29yZCk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzVfVFhfUE9XRVIsCiAJCQkgICBUWFBPV0VSX1RPX0RFVihydDJ4MDBkZXYtPnR4X3Bvd2VyKSk7CkBAIC0xMzEzLDEyICsxNTUxLDE1IEBACiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfSUZTLCB0eGRlc2MtPmlmcyk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfUkVUUllfTU9ERSwKIAkJCSAgIHRlc3RfYml0KEVOVFJZX1RYRF9SRVRSWV9NT0RFLCAmdHhkZXNjLT5mbGFncykpOwotCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX1RLSVBfTUlDLCAwKTsKLQlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9EQVRBQllURV9DT1VOVCwKLQkJCSAgIHNrYi0+bGVuIC0gc2tiZGVzYy0+ZGVzY19sZW4pOworCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX1RLSVBfTUlDLAorCQkJICAgdGVzdF9iaXQoRU5UUllfVFhEX0VOQ1JZUFRfTU1JQywgJnR4ZGVzYy0+ZmxhZ3MpKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9LRVlfVEFCTEUsCisJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfRU5DUllQVF9QQUlSV0lTRSwgJnR4ZGVzYy0+ZmxhZ3MpKTsKKwlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9LRVlfSU5ERVgsIHR4ZGVzYy0+a2V5X2lkeCk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfREFUQUJZVEVfQ09VTlQsIHNrYi0+bGVuKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9CVVJTVDIsCiAJCQkgICB0ZXN0X2JpdChFTlRSWV9UWERfQlVSU1QsICZ0eGRlc2MtPmZsYWdzKSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfQ0lQSEVSX0FMRywgQ0lQSEVSX05PTkUpOworCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX0NJUEhFUl9BTEcsIHR4ZGVzYy0+Y2lwaGVyKTsKIAlydDJ4MDBfZGVzY193cml0ZSh0eGQsIDAsIHdvcmQpOwogfQogCkBAIC0xMzMxLDcgKzE1NzIsNiBAQAogCXN0cnVjdCBza2JfZnJhbWVfZGVzYyAqc2tiZGVzYyA9IGdldF9za2JfZnJhbWVfZGVzYyhlbnRyeS0+c2tiKTsKIAl1bnNpZ25lZCBpbnQgYmVhY29uX2Jhc2U7CiAJdTMyIHJlZzsKLQl1MzIgd29yZCwgbGVuOwogCiAJLyoKIAkgKiBBZGQgdGhlIGRlc2NyaXB0b3IgaW4gZnJvbnQgb2YgdGhlIHNrYi4KQEAgLTEzNDEsMTcgKzE1ODEsNiBAQAogCXNrYmRlc2MtPmRlc2MgPSBlbnRyeS0+c2tiLT5kYXRhOwogCiAJLyoKLQkgKiBBZGp1c3QgdGhlIGJlYWNvbiBkYXRhYnl0ZSBjb3VudC4gVGhlIGN1cnJlbnQgbnVtYmVyIGlzCi0JICogY2FsY3VsYXRlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCwgYnV0IGZhbHNlbHkKLQkgKiBhc3N1bWVzIHRoYXQgdGhlIGRlc2NyaXB0b3Igd2FzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgU0tCLgotCSAqLwotCXJ0MngwMF9kZXNjX3JlYWQoc2tiZGVzYy0+ZGVzYywgMCwgJndvcmQpOwotCWxlbiAgPSBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZCwgVFhEX1cwX0RBVEFCWVRFX0NPVU5UKTsKLQlsZW4gKz0gc2tiZGVzYy0+ZGVzY19sZW47Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfREFUQUJZVEVfQ09VTlQsIGxlbik7Ci0JcnQyeDAwX2Rlc2Nfd3JpdGUoc2tiZGVzYy0+ZGVzYywgMCwgd29yZCk7Ci0KLQkvKgogCSAqIERpc2FibGUgYmVhY29uaW5nIHdoaWxlIHdlIGFyZSByZWxvYWRpbmcgdGhlIGJlYWNvbiBkYXRhLAogCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBiZSBzZW5kaW5nIG91dCBpbnZhbGlkIGRhdGEuCiAJICovCkBAIC0xNDIyLDIwICsxNjUxLDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgcnQ3M3VzYl9hZ2NfdG9fcnNzaShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LCBpbnQgcnhkX3cxKQogewotCXUxNiBlZXByb207Ci0JdTggb2Zmc2V0OworCXU4IG9mZnNldCA9IHJ0MngwMGRldi0+bG5hX2dhaW47CiAJdTggbG5hOwogCiAJbG5hID0gcnQyeDAwX2dldF9maWVsZDMyKHJ4ZF93MSwgUlhEX1cxX1JTU0lfTE5BKTsKIAlzd2l0Y2ggKGxuYSkgewogCWNhc2UgMzoKLQkJb2Zmc2V0ID0gOTA7CisJCW9mZnNldCArPSA5MDsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlvZmZzZXQgPSA3NDsKKwkJb2Zmc2V0ICs9IDc0OwogCQlicmVhazsKIAljYXNlIDE6Ci0JCW9mZnNldCA9IDY0OworCQlvZmZzZXQgKz0gNjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtMTQ1MSwxNSArMTY3OSw2IEBACiAJCQllbHNlIGlmIChsbmEgPT0gMikKIAkJCQlvZmZzZXQgKz0gODsKIAkJfQotCi0JCXJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9SU1NJX09GRlNFVF9BLCAmZWVwcm9tKTsKLQkJb2Zmc2V0IC09IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX09GRlNFVF9BXzEpOwotCX0gZWxzZSB7Ci0JCWlmICh0ZXN0X2JpdChDT05GSUdfRVhURVJOQUxfTE5BX0JHLCAmcnQyeDAwZGV2LT5mbGFncykpCi0JCQlvZmZzZXQgKz0gMTQ7Ci0KLQkJcnQyeDAwX2VlcHJvbV9yZWFkKHJ0MngwMGRldiwgRUVQUk9NX1JTU0lfT0ZGU0VUX0JHLCAmZWVwcm9tKTsKLQkJb2Zmc2V0IC09IHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sIEVFUFJPTV9SU1NJX09GRlNFVF9CR18xKTsKIAl9CiAKIAlyZXR1cm4gcnQyeDAwX2dldF9maWVsZDMyKHJ4ZF93MSwgUlhEX1cxX1JTU0lfQUdDKSAqIDIgLSBvZmZzZXQ7CkBAIC0xNDY4LDYgKzE2ODcsNyBAQAogc3RhdGljIHZvaWQgcnQ3M3VzYl9maWxsX3J4ZG9uZShzdHJ1Y3QgcXVldWVfZW50cnkgKmVudHJ5LAogCQkJICAgICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYykKIHsKKwlzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2ID0gZW50cnktPnF1ZXVlLT5ydDJ4MDBkZXY7CiAJc3RydWN0IHNrYl9mcmFtZV9kZXNjICpza2JkZXNjID0gZ2V0X3NrYl9mcmFtZV9kZXNjKGVudHJ5LT5za2IpOwogCV9fbGUzMiAqcnhkID0gKF9fbGUzMiAqKWVudHJ5LT5za2ItPmRhdGE7CiAJdTMyIHdvcmQwOwpAQCAtMTQ4OSw2ICsxNzA5LDM4IEBACiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX0NSQ19FUlJPUikpCiAJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKIAorCWlmICh0ZXN0X2JpdChDT05GSUdfU1VQUE9SVF9IV19DUllQVE8sICZydDJ4MDBkZXYtPmZsYWdzKSkgeworCQlyeGRlc2MtPmNpcGhlciA9CisJCSAgICBydDJ4MDBfZ2V0X2ZpZWxkMzIod29yZDAsIFJYRF9XMF9DSVBIRVJfQUxHKTsKKwkJcnhkZXNjLT5jaXBoZXJfc3RhdHVzID0KKwkJICAgIHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX0NJUEhFUl9FUlJPUik7CisJfQorCisJaWYgKHJ4ZGVzYy0+Y2lwaGVyICE9IENJUEhFUl9OT05FKSB7CisJCV9ydDJ4MDBfZGVzY19yZWFkKHJ4ZCwgMiwgJnJ4ZGVzYy0+aXYpOworCQlfcnQyeDAwX2Rlc2NfcmVhZChyeGQsIDMsICZyeGRlc2MtPmVpdik7CisJCV9ydDJ4MDBfZGVzY19yZWFkKHJ4ZCwgNCwgJnJ4ZGVzYy0+aWN2KTsKKworCQkvKgorCQkgKiBIYXJkd2FyZSBoYXMgc3RyaXBwZWQgSVYvRUlWIGRhdGEgZnJvbSA4MDIuMTEgZnJhbWUgZHVyaW5nCisJCSAqIGRlY3J5cHRpb24uIEl0IGhhcyBwcm92aWRlZCB0aGUgZGF0YSBzZXBlcmF0ZWx5IGJ1dCBydDJ4MDBsaWIKKwkJICogc2hvdWxkIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUgcmVpbnNlcnRlZC4KKwkJICovCisJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19JVl9TVFJJUFBFRDsKKworCQkvKgorCQkgKiBGSVhNRTogTGVnYWN5IGRyaXZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgZnJhbWUgZG9lcworCQkgKiBjb250YWluIHRoZSBNaWNoYWVsIE1pYy4gVW5mb3J0dW5hdGVseSwgaW4gcnQyeDAwCisJCSAqIHRoZSBNSUMgc2VlbXMgdG8gYmUgbWlzc2luZyBjb21wbGV0ZWx5Li4uCisJCSAqLworCQlyeGRlc2MtPmZsYWdzIHw9IFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsKKworCQlpZiAocnhkZXNjLT5jaXBoZXJfc3RhdHVzID09IFJYX0NSWVBUT19TVUNDRVNTKQorCQkJcnhkZXNjLT5mbGFncyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKKwkJZWxzZSBpZiAocnhkZXNjLT5jaXBoZXJfc3RhdHVzID09IFJYX0NSWVBUT19GQUlMX01JQykKKwkJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19NTUlDX0VSUk9SOworCX0KKwogCS8qCiAJICogT2J0YWluIHRoZSBzdGF0dXMgYWJvdXQgdGhpcyBwYWNrZXQuCiAJICogV2hlbiBmcmFtZSB3YXMgcmVjZWl2ZWQgd2l0aCBhbiBPRkRNIGJpdHJhdGUsCkBAIC0xNDk2LDExICsxNzQ4LDEzIEBACiAJICogYSBDQ0sgYml0cmF0ZSB0aGUgc2lnbmFsIGlzIHRoZSByYXRlIGluIDEwMGtiaXQvcy4KIAkgKi8KIAlyeGRlc2MtPnNpZ25hbCA9IHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMSwgUlhEX1cxX1NJR05BTCk7Ci0JcnhkZXNjLT5yc3NpID0gcnQ3M3VzYl9hZ2NfdG9fcnNzaShlbnRyeS0+cXVldWUtPnJ0MngwMGRldiwgd29yZDEpOworCXJ4ZGVzYy0+cnNzaSA9IHJ0NzN1c2JfYWdjX3RvX3Jzc2kocnQyeDAwZGV2LCB3b3JkMSk7CiAJcnhkZXNjLT5zaXplID0gcnQyeDAwX2dldF9maWVsZDMyKHdvcmQwLCBSWERfVzBfREFUQUJZVEVfQ09VTlQpOwogCiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX09GRE0pKQogCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX1BMQ1A7CisJZWxzZQorCQlyeGRlc2MtPmRldl9mbGFncyB8PSBSWERPTkVfU0lHTkFMX0JJVFJBVEU7CiAJaWYgKHJ0MngwMF9nZXRfZmllbGQzMih3b3JkMCwgUlhEX1cwX01ZX0JTUykpCiAJCXJ4ZGVzYy0+ZGV2X2ZsYWdzIHw9IFJYRE9ORV9NWV9CU1M7CiAKQEAgLTE2NzgsNyArMTkzMiw3IEBACiAJLyoKIAkgKiBTdG9yZSBsZWQgc2V0dGluZ3MsIGZvciBjb3JyZWN0IGxlZCBiZWhhdmlvdXIuCiAJICovCi0jaWZkZWYgQ09ORklHX1JUNzNVU0JfTEVEUworI2lmZGVmIENPTkZJR19SVDJYMDBfTElCX0xFRFMKIAlydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fTEVELCAmZWVwcm9tKTsKIAogCXJ0NzN1c2JfaW5pdF9sZWQocnQyeDAwZGV2LCAmcnQyeDAwZGV2LT5sZWRfcmFkaW8sIExFRF9UWVBFX1JBRElPKTsKQEAgLTE3MTEsNyArMTk2NSw3IEBACiAJcnQyeDAwX3NldF9maWVsZDE2KCZydDJ4MDBkZXYtPmxlZF9tY3VfcmVnLCBNQ1VfTEVEQ1NfUE9MQVJJVFlfUkVBRFlfQSwKIAkJCSAgIHJ0MngwMF9nZXRfZmllbGQxNihlZXByb20sCiAJCQkJCSAgICAgIEVFUFJPTV9MRURfUE9MQVJJVFlfUkRZX0EpKTsKLSNlbmRpZiAvKiBDT05GSUdfUlQ3M1VTQl9MRURTICovCisjZW5kaWYgLyogQ09ORklHX1JUMlgwMF9MSUJfTEVEUyAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODUyLDEwICsyMTA2LDExIEBACiB9OwogCiAKLXN0YXRpYyB2b2lkIHJ0NzN1c2JfcHJvYmVfaHdfbW9kZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQorc3RhdGljIGludCBydDczdXNiX3Byb2JlX2h3X21vZGUoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKIAlzdHJ1Y3QgaHdfbW9kZV9zcGVjICpzcGVjID0gJnJ0MngwMGRldi0+c3BlYzsKLQl1OCAqdHhwb3dlcjsKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICppbmZvOworCWNoYXIgKnR4X3Bvd2VyOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyoKQEAgLTE4NzIsMjAgKzIxMjcsMTAgQEAKIAkJCQkJCSAgIEVFUFJPTV9NQUNfQUREUl8wKSk7CiAKIAkvKgotCSAqIENvbnZlcnQgdHhfcG93ZXIgYXJyYXkgaW4gZWVwcm9tLgotCSAqLwotCXR4cG93ZXIgPSBydDJ4MDBfZWVwcm9tX2FkZHIocnQyeDAwZGV2LCBFRVBST01fVFhQT1dFUl9HX1NUQVJUKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKLQkJdHhwb3dlcltpXSA9IFRYUE9XRVJfRlJPTV9ERVYodHhwb3dlcltpXSk7Ci0KLQkvKgogCSAqIEluaXRpYWxpemUgaHdfbW9kZSBpbmZvcm1hdGlvbi4KIAkgKi8KIAlzcGVjLT5zdXBwb3J0ZWRfYmFuZHMgPSBTVVBQT1JUX0JBTkRfMkdIWjsKIAlzcGVjLT5zdXBwb3J0ZWRfcmF0ZXMgPSBTVVBQT1JUX1JBVEVfQ0NLIHwgU1VQUE9SVF9SQVRFX09GRE07Ci0Jc3BlYy0+dHhfcG93ZXJfYSA9IE5VTEw7Ci0Jc3BlYy0+dHhfcG93ZXJfYmcgPSB0eHBvd2VyOwotCXNwZWMtPnR4X3Bvd2VyX2RlZmF1bHQgPSBERUZBVUxUX1RYUE9XRVI7CiAKIAlpZiAocnQyeDAwX3JmKCZydDJ4MDBkZXYtPmNoaXAsIFJGMjUyOCkpIHsKIAkJc3BlYy0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShyZl92YWxzX2JnXzI1MjgpOwpAQCAtMTkwMywxNCArMjE0OCwyNiBAQAogCQlzcGVjLT5jaGFubmVscyA9IHJmX3ZhbHNfNTIyNV8yNTI3OwogCX0KIAotCWlmIChydDJ4MDBfcmYoJnJ0MngwMGRldi0+Y2hpcCwgUkY1MjI1KSB8fAotCSAgICBydDJ4MDBfcmYoJnJ0MngwMGRldi0+Y2hpcCwgUkY1MjI2KSkgewotCQl0eHBvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfQV9TVEFSVCk7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQkJdHhwb3dlcltpXSA9IFRYUE9XRVJfRlJPTV9ERVYodHhwb3dlcltpXSk7CisJLyoKKwkgKiBDcmVhdGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhcnJheQorCSAqLworCWluZm8gPSBremFsbG9jKHNwZWMtPm51bV9jaGFubmVscyAqIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJc3BlYy0+dHhfcG93ZXJfYSA9IHR4cG93ZXI7CisJc3BlYy0+Y2hhbm5lbHNfaW5mbyA9IGluZm87CisKKwl0eF9wb3dlciA9IHJ0MngwMF9lZXByb21fYWRkcihydDJ4MDBkZXYsIEVFUFJPTV9UWFBPV0VSX0dfU1RBUlQpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQlpbmZvW2ldLnR4X3Bvd2VyMSA9IFRYUE9XRVJfRlJPTV9ERVYodHhfcG93ZXJbaV0pOworCisJaWYgKHNwZWMtPm51bV9jaGFubmVscyA+IDE0KSB7CisJCXR4X3Bvd2VyID0gcnQyeDAwX2VlcHJvbV9hZGRyKHJ0MngwMGRldiwgRUVQUk9NX1RYUE9XRVJfQV9TVEFSVCk7CisJCWZvciAoaSA9IDE0OyBpIDwgc3BlYy0+bnVtX2NoYW5uZWxzOyBpKyspCisJCQlpbmZvW2ldLnR4X3Bvd2VyMSA9IFRYUE9XRVJfRlJPTV9ERVYodHhfcG93ZXJbaV0pOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJ0NzN1c2JfcHJvYmVfaHcoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKQEAgLTE5MzEsMTMgKzIxODgsMTcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgaHcgc3BlY2lmaWNhdGlvbnMuCiAJICovCi0JcnQ3M3VzYl9wcm9iZV9od19tb2RlKHJ0MngwMGRldik7CisJcmV0dmFsID0gcnQ3M3VzYl9wcm9iZV9od19tb2RlKHJ0MngwMGRldik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAogCS8qCiAJICogVGhpcyBkZXZpY2UgcmVxdWlyZXMgZmlybXdhcmUuCiAJICovCiAJX19zZXRfYml0KERSSVZFUl9SRVFVSVJFX0ZJUk1XQVJFLCAmcnQyeDAwZGV2LT5mbGFncyk7CiAJX19zZXRfYml0KERSSVZFUl9SRVFVSVJFX1NDSEVEVUxFRCwgJnJ0MngwMGRldi0+ZmxhZ3MpOworCWlmICghbW9kcGFyYW1fbm9od2NyeXB0KQorCQlfX3NldF9iaXQoQ09ORklHX1NVUFBPUlRfSFdfQ1JZUFRPLCAmcnQyeDAwZGV2LT5mbGFncyk7CiAKIAkvKgogCSAqIFNldCB0aGUgcnNzaSBvZmZzZXQuCkBAIC0xOTY0LDYgKzIyMjUsNjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBydDczdXNiX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZV9pZHgsCisJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgZGF0YV9xdWV1ZSAqcXVldWU7CisJc3RydWN0IHJ0MngwMF9maWVsZDMyIGZpZWxkOworCWludCByZXR2YWw7CisJdTMyIHJlZzsKKworCS8qCisJICogRmlyc3QgcGFzcyB0aGUgY29uZmlndXJhdGlvbiB0aHJvdWdoIHJ0MngwMGxpYiwgdGhhdCB3aWxsCisJICogdXBkYXRlIHRoZSBxdWV1ZSBzZXR0aW5ncyBhbmQgdmFsaWRhdGUgdGhlIGlucHV0LiBBZnRlciB0aGF0CisJICogd2UgYXJlIGZyZWUgdG8gdXBkYXRlIHRoZSByZWdpc3RlcnMgYmFzZWQgb24gdGhlIHZhbHVlCisJICogaW4gdGhlIHF1ZXVlIHBhcmFtZXRlci4KKwkgKi8KKwlyZXR2YWwgPSBydDJ4MDBtYWNfY29uZl90eChodywgcXVldWVfaWR4LCBwYXJhbXMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlxdWV1ZSA9IHJ0MngwMHF1ZXVlX2dldF9xdWV1ZShydDJ4MDBkZXYsIHF1ZXVlX2lkeCk7CisKKwkvKiBVcGRhdGUgV01NIFRYT1AgcmVnaXN0ZXIgKi8KKwlpZiAocXVldWVfaWR4IDwgMikgeworCQlmaWVsZC5iaXRfb2Zmc2V0ID0gcXVldWVfaWR4ICogMTY7CisJCWZpZWxkLmJpdF9tYXNrID0gMHhmZmZmIDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwkJcnQ3M3VzYl9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgQUNfVFhPUF9DU1IwLCAmcmVnKTsKKwkJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBxdWV1ZS0+dHhvcCk7CisJCXJ0NzN1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBBQ19UWE9QX0NTUjAsIHJlZyk7CisJfSBlbHNlIGlmIChxdWV1ZV9pZHggPCA0KSB7CisJCWZpZWxkLmJpdF9vZmZzZXQgPSAocXVldWVfaWR4IC0gMikgKiAxNjsKKwkJZmllbGQuYml0X21hc2sgPSAweGZmZmYgPDwgZmllbGQuYml0X29mZnNldDsKKworCQlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBQ19UWE9QX0NTUjEsICZyZWcpOworCQlydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgZmllbGQsIHF1ZXVlLT50eG9wKTsKKwkJcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIEFDX1RYT1BfQ1NSMSwgcmVnKTsKKwl9CisKKwkvKiBVcGRhdGUgV01NIHJlZ2lzdGVycyAqLworCWZpZWxkLmJpdF9vZmZzZXQgPSBxdWV1ZV9pZHggKiA0OworCWZpZWxkLmJpdF9tYXNrID0gMHhmIDw8IGZpZWxkLmJpdF9vZmZzZXQ7CisKKwlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBSUZTTl9DU1IsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgcXVldWUtPmFpZnMpOworCXJ0NzN1c2JfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBBSUZTTl9DU1IsIHJlZyk7CisKKwlydDczdXNiX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBDV01JTl9DU1IsICZyZWcpOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBmaWVsZCwgcXVldWUtPmN3X21pbik7CisJcnQ3M3VzYl9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIENXTUlOX0NTUiwgcmVnKTsKKworCXJ0NzN1c2JfcmVnaXN0ZXJfcmVhZChydDJ4MDBkZXYsIENXTUFYX0NTUiwgJnJlZyk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIGZpZWxkLCBxdWV1ZS0+Y3dfbWF4KTsKKwlydDczdXNiX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgQ1dNQVhfQ1NSLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKICNpZiAwCiAvKgogICogTWFjODAyMTEgZGVtYW5kcyBnZXRfdHNmIG11c3QgYmUgYXRvbWljLgpAQCAtMTk5NywxMCArMjMxNSwxMSBAQAogCS5jb25maWcJCQk9IHJ0MngwMG1hY19jb25maWcsCiAJLmNvbmZpZ19pbnRlcmZhY2UJPSBydDJ4MDBtYWNfY29uZmlnX2ludGVyZmFjZSwKIAkuY29uZmlndXJlX2ZpbHRlcgk9IHJ0MngwMG1hY19jb25maWd1cmVfZmlsdGVyLAorCS5zZXRfa2V5CQk9IHJ0MngwMG1hY19zZXRfa2V5LAogCS5nZXRfc3RhdHMJCT0gcnQyeDAwbWFjX2dldF9zdGF0cywKIAkuc2V0X3JldHJ5X2xpbWl0CT0gcnQ3M3VzYl9zZXRfcmV0cnlfbGltaXQsCiAJLmJzc19pbmZvX2NoYW5nZWQJPSBydDJ4MDBtYWNfYnNzX2luZm9fY2hhbmdlZCwKLQkuY29uZl90eAkJPSBydDJ4MDBtYWNfY29uZl90eCwKKwkuY29uZl90eAkJPSBydDczdXNiX2NvbmZfdHgsCiAJLmdldF90eF9zdGF0cwkJPSBydDJ4MDBtYWNfZ2V0X3R4X3N0YXRzLAogCS5nZXRfdHNmCQk9IHJ0NzN1c2JfZ2V0X3RzZiwKIH07CkBAIC0yMDI0LDYgKzIzNDMsOCBAQAogCS5nZXRfdHhfZGF0YV9sZW4JPSBydDczdXNiX2dldF90eF9kYXRhX2xlbiwKIAkua2lja190eF9xdWV1ZQkJPSBydDczdXNiX2tpY2tfdHhfcXVldWUsCiAJLmZpbGxfcnhkb25lCQk9IHJ0NzN1c2JfZmlsbF9yeGRvbmUsCisJLmNvbmZpZ19zaGFyZWRfa2V5CT0gcnQ3M3VzYl9jb25maWdfc2hhcmVkX2tleSwKKwkuY29uZmlnX3BhaXJ3aXNlX2tleQk9IHJ0NzN1c2JfY29uZmlnX3BhaXJ3aXNlX2tleSwKIAkuY29uZmlnX2ZpbHRlcgkJPSBydDczdXNiX2NvbmZpZ19maWx0ZXIsCiAJLmNvbmZpZ19pbnRmCQk9IHJ0NzN1c2JfY29uZmlnX2ludGYsCiAJLmNvbmZpZ19lcnAJCT0gcnQ3M3VzYl9jb25maWdfZXJwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmgKaW5kZXggMTQ4NDkzNS4uODY4Mzg2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5oCkBAIC05Miw2ICs5MiwxNiBAQAogI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRQkJMHgxMjAwCiAjZGVmaW5lIFBBSVJXSVNFX1RBX1RBQkxFX0JBU0UJCTB4MWEwMAogCisjZGVmaW5lIFNIQVJFRF9LRVlfRU5UUlkoX19pZHgpIFwKKwkoIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArIFwKKwkJKChfX2lkeCkgKiBzaXplb2Yoc3RydWN0IGh3X2tleV9lbnRyeSkpICkKKyNkZWZpbmUgUEFJUldJU0VfS0VZX0VOVFJZKF9faWR4KSBcCisJKCBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIFwKKwkJKChfX2lkeCkgKiBzaXplb2Yoc3RydWN0IGh3X2tleV9lbnRyeSkpICkKKyNkZWZpbmUgUEFJUldJU0VfVEFfRU5UUlkoX19pZHgpIFwKKwkoIFBBSVJXSVNFX1RBX1RBQkxFX0JBU0UgKyBcCisJCSgoX19pZHgpICogc2l6ZW9mKHN0cnVjdCBod19wYWlyd2lzZV90YV9lbnRyeSkpICkKKwogc3RydWN0IGh3X2tleV9lbnRyeSB7CiAJdTgga2V5WzE2XTsKIAl1OCB0eF9taWNbOF07CkBAIC0xMDAsNyArMTEwLDggQEAKIAogc3RydWN0IGh3X3BhaXJ3aXNlX3RhX2VudHJ5IHsKIAl1OCBhZGRyZXNzWzZdOwotCXU4IHJlc2VydmVkWzJdOworCXU4IGNpcGhlcjsKKwl1OCByZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKgpAQCAtNTYzLDYgKzU3NCwxMCBAQAogICogU0VDX0NTUjQ6IFBhaXJ3aXNlIGtleSB0YWJsZSBsb29rdXAgY29udHJvbC4KICAqLwogI2RlZmluZSBTRUNfQ1NSNAkJCTB4MzBiMAorI2RlZmluZSBTRUNfQ1NSNF9FTkFCTEVfQlNTMAkJRklFTEQzMigweDAwMDAwMDAxKQorI2RlZmluZSBTRUNfQ1NSNF9FTkFCTEVfQlNTMQkJRklFTEQzMigweDAwMDAwMDAyKQorI2RlZmluZSBTRUNfQ1NSNF9FTkFCTEVfQlNTMgkJRklFTEQzMigweDAwMDAwMDA0KQorI2RlZmluZSBTRUNfQ1NSNF9FTkFCTEVfQlNTMwkJRklFTEQzMigweDAwMDAwMDA4KQogCiAvKgogICogU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3Rlci4KQEAgLTEwMTAsOCArMTAyNSwxMCBAQAogCiAvKgogICogV29yZDQKKyAqIElDVjogUmVjZWl2ZWQgSUNWIG9mIG9yaWdpbmFsbHkgZW5jcnlwdGVkLgorICogTk9URTogVGhpcyBpcyBhIGd1ZXNzLCB0aGUgb2ZmaWNpYWwgZGVmaW5pdGlvbiBpcyAicmVzZXJ2ZWQiCiAgKi8KLSNkZWZpbmUgUlhEX1c0X1JFU0VSVkVECQkJRklFTEQzMigweGZmZmZmZmZmKQorI2RlZmluZSBSWERfVzRfSUNWCQkJRklFTEQzMigweGZmZmZmZmZmKQogCiAvKgogICogdGhlIGFib3ZlIDIwLWJ5dGUgaXMgY2FsbGVkIFJYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgUlggYmxvY2sKQEAgLTEwMzMsMTcgKzEwNTAsMTAgQEAKICNkZWZpbmUgTUFYX1RYUE9XRVIJMzEKICNkZWZpbmUgREVGQVVMVF9UWFBPV0VSCTI0CiAKLSNkZWZpbmUgVFhQT1dFUl9GUk9NX0RFVihfX3R4cG93ZXIpCQlcCi0oewkJCQkJCVwKLQkoKF9fdHhwb3dlcikgPiBNQVhfVFhQT1dFUikgPwkJXAotCQlERUZBVUxUX1RYUE9XRVIgOiAoX190eHBvd2VyKTsJXAotfSkKKyNkZWZpbmUgVFhQT1dFUl9GUk9NX0RFVihfX3R4cG93ZXIpIFwKKwkoKCh1OCkoX190eHBvd2VyKSkgPiBNQVhfVFhQT1dFUikgPyBERUZBVUxUX1RYUE9XRVIgOiAoX190eHBvd2VyKQogCi0jZGVmaW5lIFRYUE9XRVJfVE9fREVWKF9fdHhwb3dlcikJCQlcCi0oewkJCQkJCQlcCi0JKChfX3R4cG93ZXIpIDw9IE1JTl9UWFBPV0VSKSA/IE1JTl9UWFBPV0VSIDoJXAotCSgoKF9fdHhwb3dlcikgPj0gTUFYX1RYUE9XRVIpID8gTUFYX1RYUE9XRVIgOglcCi0JKF9fdHhwb3dlcikpOwkJCQkJXAotfSkKKyNkZWZpbmUgVFhQT1dFUl9UT19ERVYoX190eHBvd2VyKSBcCisJY2xhbXBfdChjaGFyLCBfX3R4cG93ZXIsIE1JTl9UWFBPV0VSLCBNQVhfVFhQT1dFUikKIAogI2VuZGlmIC8qIFJUNzNVU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4MC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4MC5oCmluZGV4IDA4MmExMWYuLjg3MjEyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTgwLmgKQEAgLTI0LDIwICsyNCw2IEBACiAjZGVmaW5lIEFOQVBBUkFNX1BXUjFfU0hJRlQJMjAKICNkZWZpbmUgQU5BUEFSQU1fUFdSMV9NQVNLCSgweDdGIDw8IEFOQVBBUkFNX1BXUjFfU0hJRlQpCiAKLWVudW0gcnRsODE4MF90eF9kZXNjX2ZsYWdzIHsKLQlSVEw4MTgwX1RYX0RFU0NfRkxBR19OT19FTkMJPSAoMSA8PCAxNSksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfVFhfT0sJPSAoMSA8PCAxNSksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfU1BMQ1AJPSAoMSA8PCAxNiksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfUlhfVU5ERVIJPSAoMSA8PCAxNiksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfTU9SRUZSQUcJPSAoMSA8PCAxNyksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfQ1RTCT0gKDEgPDwgMTgpLAotCVJUTDgxODBfVFhfREVTQ19GTEFHX1JUUwk9ICgxIDw8IDIzKSwKLQlSVEw4MTgwX1RYX0RFU0NfRkxBR19MUwkJPSAoMSA8PCAyOCksCi0JUlRMODE4MF9UWF9ERVNDX0ZMQUdfRlMJCT0gKDEgPDwgMjkpLAotCVJUTDgxODBfVFhfREVTQ19GTEFHX0RNQQk9ICgxIDw8IDMwKSwKLQlSVEw4MTgwX1RYX0RFU0NfRkxBR19PV04JPSAoMSA8PCAzMSkKLX07Ci0KIHN0cnVjdCBydGw4MTgwX3R4X2Rlc2MgewogCV9fbGUzMiBmbGFnczsKIAlfX2xlMTYgcnRzX2R1cmF0aW9uOwpAQCAtNTIsMjMgKzM4LDYgQEAKIAl1MzIgcmVzZXJ2ZWRbMl07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotZW51bSBydGw4MTgwX3J4X2Rlc2NfZmxhZ3MgewotCVJUTDgxODBfUlhfREVTQ19GTEFHX0lDVl9FUlIJPSAoMSA8PCAxMiksCi0JUlRMODE4MF9SWF9ERVNDX0ZMQUdfQ1JDMzJfRVJSCT0gKDEgPDwgMTMpLAotCVJUTDgxODBfUlhfREVTQ19GTEFHX1BNCQk9ICgxIDw8IDE0KSwKLQlSVEw4MTgwX1JYX0RFU0NfRkxBR19SWF9FUlIJPSAoMSA8PCAxNSksCi0JUlRMODE4MF9SWF9ERVNDX0ZMQUdfQkNBU1QJPSAoMSA8PCAxNiksCi0JUlRMODE4MF9SWF9ERVNDX0ZMQUdfUEFNCT0gKDEgPDwgMTcpLAotCVJUTDgxODBfUlhfREVTQ19GTEFHX01DQVNUCT0gKDEgPDwgMTgpLAotCVJUTDgxODBfUlhfREVTQ19GTEFHX1NQTENQCT0gKDEgPDwgMjUpLAotCVJUTDgxODBfUlhfREVTQ19GTEFHX0ZPRgk9ICgxIDw8IDI2KSwKLQlSVEw4MTgwX1JYX0RFU0NfRkxBR19ETUFfRkFJTAk9ICgxIDw8IDI3KSwKLQlSVEw4MTgwX1JYX0RFU0NfRkxBR19MUwkJPSAoMSA8PCAyOCksCi0JUlRMODE4MF9SWF9ERVNDX0ZMQUdfRlMJCT0gKDEgPDwgMjkpLAotCVJUTDgxODBfUlhfREVTQ19GTEFHX0VPUgk9ICgxIDw8IDMwKSwKLQlSVEw4MTgwX1JYX0RFU0NfRkxBR19PV04JPSAoMSA8PCAzMSkKLX07Ci0KIHN0cnVjdCBydGw4MTgwX3J4X2Rlc2MgewogCV9fbGUzMiBmbGFnczsKIAlfX2xlMzIgZmxhZ3MyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4MF9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODBfZGV2LmMKaW5kZXggYjcxNzJhMS4uZGY3ZTc4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4MF9kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTgwX2Rldi5jCkBAIC0xMTAsMTIgKzExMCwxMiBAQAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2lkeF07CiAJCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KGVudHJ5LT5mbGFncyk7CiAKLQkJaWYgKGZsYWdzICYgUlRMODE4MF9SWF9ERVNDX0ZMQUdfT1dOKQorCQlpZiAoZmxhZ3MgJiBSVEw4MThYX1JYX0RFU0NfRkxBR19PV04pCiAJCQlyZXR1cm47CiAKLQkJaWYgKHVubGlrZWx5KGZsYWdzICYgKFJUTDgxODBfUlhfREVTQ19GTEFHX0RNQV9GQUlMIHwKLQkJCQkgICAgICBSVEw4MTgwX1JYX0RFU0NfRkxBR19GT0YgfAotCQkJCSAgICAgIFJUTDgxODBfUlhfREVTQ19GTEFHX1JYX0VSUikpKQorCQlpZiAodW5saWtlbHkoZmxhZ3MgJiAoUlRMODE4WF9SWF9ERVNDX0ZMQUdfRE1BX0ZBSUwgfAorCQkJCSAgICAgIFJUTDgxOFhfUlhfREVTQ19GTEFHX0ZPRiB8CisJCQkJICAgICAgUlRMODE4WF9SWF9ERVNDX0ZMQUdfUlhfRVJSKSkpCiAJCQlnb3RvIGRvbmU7CiAJCWVsc2UgewogCQkJdTMyIGZsYWdzMiA9IGxlMzJfdG9fY3B1KGVudHJ5LT5mbGFnczIpOwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCQlyeF9zdGF0dXMuYmFuZCA9IGRldi0+Y29uZi5jaGFubmVsLT5iYW5kOwogCQkJcnhfc3RhdHVzLm1hY3RpbWUgPSBsZTY0X3RvX2NwdShlbnRyeS0+dHNmdCk7CiAJCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1RTRlQ7Ci0JCQlpZiAoZmxhZ3MgJiBSVEw4MTgwX1JYX0RFU0NfRkxBR19DUkMzMl9FUlIpCisJCQlpZiAoZmxhZ3MgJiBSVEw4MThYX1JYX0RFU0NfRkxBR19DUkMzMl9FUlIpCiAJCQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKIAogCQkJaWVlZTgwMjExX3J4X2lycXNhZmUoZGV2LCBza2IsICZyeF9zdGF0dXMpOwpAQCAtMTU0LDEwICsxNTQsMTAgQEAKIAogCWRvbmU6CiAJCWVudHJ5LT5yeF9idWYgPSBjcHVfdG9fbGUzMigqKChkbWFfYWRkcl90ICopc2tiLT5jYikpOwotCQllbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihSVEw4MTgwX1JYX0RFU0NfRkxBR19PV04gfAorCQllbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihSVEw4MThYX1JYX0RFU0NfRkxBR19PV04gfAogCQkJCQkgICBNQVhfUlhfU0laRSk7CiAJCWlmIChwcml2LT5yeF9pZHggPT0gMzEpCi0JCQllbnRyeS0+ZmxhZ3MgfD0gY3B1X3RvX2xlMzIoUlRMODE4MF9SWF9ERVNDX0ZMQUdfRU9SKTsKKwkJCWVudHJ5LT5mbGFncyB8PSBjcHVfdG9fbGUzMihSVEw4MThYX1JYX0RFU0NfRkxBR19FT1IpOwogCQlwcml2LT5yeF9pZHggPSAocHJpdi0+cnhfaWR4ICsgMSkgJSAzMjsKIAl9CiB9CkBAIC0xNzMsNyArMTczLDcgQEAKIAkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCQl1MzIgZmxhZ3MgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZmxhZ3MpOwogCi0JCWlmIChmbGFncyAmIFJUTDgxODBfVFhfREVTQ19GTEFHX09XTikKKwkJaWYgKGZsYWdzICYgUlRMODE4WF9UWF9ERVNDX0ZMQUdfT1dOKQogCQkJcmV0dXJuOwogCiAJCXJpbmctPmlkeCA9IChyaW5nLT5pZHggKyAxKSAlIHJpbmctPmVudHJpZXM7CkBAIC0xODUsNyArMTg1LDcgQEAKIAkJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKIAogCQlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkgewotCQkJaWYgKGZsYWdzICYgUlRMODE4MF9UWF9ERVNDX0ZMQUdfVFhfT0spCisJCQlpZiAoZmxhZ3MgJiBSVEw4MThYX1RYX0RFU0NfRkxBR19UWF9PSykKIAkJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CiAJCQllbHNlCiAJCQkJaW5mby0+c3RhdHVzLmV4Y2Vzc2l2ZV9yZXRyaWVzID0gMTsKQEAgLTI1MiwyMCArMjUyLDIwIEBACiAJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCi0JdHhfZmxhZ3MgPSBSVEw4MTgwX1RYX0RFU0NfRkxBR19PV04gfCBSVEw4MTgwX1RYX0RFU0NfRkxBR19GUyB8Ci0JCSAgIFJUTDgxODBfVFhfREVTQ19GTEFHX0xTIHwKKwl0eF9mbGFncyA9IFJUTDgxOFhfVFhfREVTQ19GTEFHX09XTiB8IFJUTDgxOFhfVFhfREVTQ19GTEFHX0ZTIHwKKwkJICAgUlRMODE4WF9UWF9ERVNDX0ZMQUdfTFMgfAogCQkgICAoaWVlZTgwMjExX2dldF90eF9yYXRlKGRldiwgaW5mbyktPmh3X3ZhbHVlIDw8IDI0KSB8CiAJCSAgIHNrYi0+bGVuOwogCiAJaWYgKHByaXYtPnI4MTg1KQotCQl0eF9mbGFncyB8PSBSVEw4MTgwX1RYX0RFU0NfRkxBR19ETUEgfAotCQkJICAgIFJUTDgxODBfVFhfREVTQ19GTEFHX05PX0VOQzsKKwkJdHhfZmxhZ3MgfD0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfRE1BIHwKKwkJCSAgICBSVEw4MThYX1RYX0RFU0NfRkxBR19OT19FTkM7CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1VTRV9SVFNfQ1RTKSB7Ci0JCXR4X2ZsYWdzIHw9IFJUTDgxODBfVFhfREVTQ19GTEFHX1JUUzsKKwkJdHhfZmxhZ3MgfD0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfUlRTOwogCQl0eF9mbGFncyB8PSBpZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShkZXYsIGluZm8pLT5od192YWx1ZSA8PCAxOTsKIAl9IGVsc2UgaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpIHsKLQkJdHhfZmxhZ3MgfD0gUlRMODE4MF9UWF9ERVNDX0ZMQUdfQ1RTOworCQl0eF9mbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19DVFM7CiAJCXR4X2ZsYWdzIHw9IGllZWU4MDIxMV9nZXRfcnRzX2N0c19yYXRlKGRldiwgaW5mbyktPmh3X3ZhbHVlIDw8IDE5OwogCX0KIApAQCAtMjkyLDggKzI5Miw4IEBACiAJZW50cnktPnBsY3BfbGVuID0gY3B1X3RvX2xlMTYocGxjcF9sZW4pOwogCWVudHJ5LT50eF9idWYgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKIAllbnRyeS0+ZnJhbWVfbGVuID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4pOwotCWVudHJ5LT5mbGFnczIgPSBpbmZvLT5jb250cm9sLmFsdF9yZXRyeV9yYXRlX2lkeCA+PSAwID8KLQkJaWVlZTgwMjExX2dldF9hbHRfcmV0cnlfcmF0ZShkZXYsIGluZm8pLT5iaXRyYXRlIDw8IDQgOiAwOworCWVudHJ5LT5mbGFnczIgPSBpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ucmF0ZV9pZHggPj0gMCA/CisJCWllZWU4MDIxMV9nZXRfYWx0X3JldHJ5X3JhdGUoZGV2LCBpbmZvLCAwKS0+Yml0cmF0ZSA8PCA0IDogMDsKIAllbnRyeS0+cmV0cnlfbGltaXQgPSBpbmZvLT5jb250cm9sLnJldHJ5X2xpbWl0OwogCWVudHJ5LT5mbGFncyA9IGNwdV90b19sZTMyKHR4X2ZsYWdzKTsKIAlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgc2tiKTsKQEAgLTQ0NiwxMCArNDQ2LDEwIEBACiAJCSptYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAogCQkJCQkgIE1BWF9SWF9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQllbnRyeS0+cnhfYnVmID0gY3B1X3RvX2xlMzIoKm1hcHBpbmcpOwotCQllbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihSVEw4MTgwX1JYX0RFU0NfRkxBR19PV04gfAorCQllbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihSVEw4MThYX1JYX0RFU0NfRkxBR19PV04gfAogCQkJCQkgICBNQVhfUlhfU0laRSk7CiAJfQotCWVudHJ5LT5mbGFncyB8PSBjcHVfdG9fbGUzMihSVEw4MTgwX1JYX0RFU0NfRkxBR19FT1IpOworCWVudHJ5LT5mbGFncyB8PSBjcHVfdG9fbGUzMihSVEw4MThYX1JYX0RFU0NfRkxBR19FT1IpOwogCXJldHVybiAwOwogfQogCkBAIC02MTUsNyArNjE1LDcgQEAKIAlyZWcgfD0gUlRMODE4WF9DTURfVFhfRU5BQkxFOwogCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+Q01ELCByZWcpOwogCi0JcHJpdi0+bW9kZSA9IElFRUU4MDIxMV9JRl9UWVBFX01OVFI7CisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7CiAJcmV0dXJuIDA7CiAKICBlcnJfZnJlZV9yaW5nczoKQEAgLTYzMyw3ICs2MzMsNyBAQAogCXU4IHJlZzsKIAlpbnQgaTsKIAotCXByaXYtPm1vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKIAogCXJ0bDgxOHhfaW93cml0ZTE2KHByaXYsICZwcml2LT5tYXAtPklOVF9NQVNLLCAwKTsKIApAQCAtNjYxLDExICs2NjEsMTEgQEAKIHsKIAlzdHJ1Y3QgcnRsODE4MF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCi0JaWYgKHByaXYtPm1vZGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikKKwlpZiAocHJpdi0+bW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCXByaXYtPm1vZGUgPSBjb25mLT50eXBlOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNjg4LDcgKzY4OCw3IEBACiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKIHsKIAlzdHJ1Y3QgcnRsODE4MF9wcml2ICpwcml2ID0gZGV2LT5wcml2OwotCXByaXYtPm1vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwogCXByaXYtPnZpZiA9IE5VTEw7CiB9CiAKQEAgLTg1NSw2ICs4NTUsNyBAQAogCXByaXYgPSBkZXYtPnByaXY7CiAJcHJpdi0+cGRldiA9IHBkZXY7CiAKKwlkZXYtPm1heF9hbHRyYXRlcyA9IDE7CiAJU0VUX0lFRUU4MDIxMV9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4Ny5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4Ny5oCmluZGV4IDVhOTUxNWMuLmU4MmJiNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3LmgKQEAgLTU4LDEyICs1OCw2IEBACiAKIC8qIHtydGw4MTg3LHJ0bDgxODdifV90eF9pbmZvIGlzIGluIHNrYiAqLwogCi0vKiBUeCBmbGFncyBhcmUgY29tbW9uIGJldHdlZW4gcnRsODE4NyBhbmQgcnRsODE4N2IgKi8KLSNkZWZpbmUgUlRMODE4N19UWF9GTEFHX05PX0VOQ1JZUFQJKDEgPDwgMTUpCi0jZGVmaW5lIFJUTDgxODdfVFhfRkxBR19NT1JFX0ZSQUcJKDEgPDwgMTcpCi0jZGVmaW5lIFJUTDgxODdfVFhfRkxBR19DVFMJCSgxIDw8IDE4KQotI2RlZmluZSBSVEw4MTg3X1RYX0ZMQUdfUlRTCQkoMSA8PCAyMykKLQogc3RydWN0IHJ0bDgxODdfdHhfaGRyIHsKIAlfX2xlMzIgZmxhZ3M7CiAJX19sZTE2IHJ0c19kdXJhdGlvbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X2Rldi5jCmluZGV4IGNhNWRlYjYuLjQzMWUzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19kZXYuYwpAQCAtMzMsMTAgKzMzLDEzIEBACiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRsODE4N190YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJLyogQXN1cyAqLwogCXtVU0JfREVWSUNFKDB4MGIwNSwgMHgxNzFkKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1JUTDgxODd9LAorCS8qIEJlbGtpbiAqLworCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg3MDVlKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1JUTDgxODdCfSwKIAkvKiBSZWFsdGVrICovCiAJe1VTQl9ERVZJQ0UoMHgwYmRhLCAweDgxODcpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfUlRMODE4N30sCiAJe1VTQl9ERVZJQ0UoMHgwYmRhLCAweDgxODkpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfUlRMODE4N0J9LAogCXtVU0JfREVWSUNFKDB4MGJkYSwgMHg4MTk3KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1JUTDgxODdCfSwKKwl7VVNCX0RFVklDRSgweDBiZGEsIDB4ODE5OCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9SVEw4MTg3Qn0sCiAJLyogTmV0Z2VhciAqLwogCXtVU0JfREVWSUNFKDB4MDg0NiwgMHg2MTAwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1JUTDgxODd9LAogCXtVU0JfREVWSUNFKDB4MDg0NiwgMHg2YTAwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1JUTDgxODd9LApAQCAtMTg3LDE4ICsxOTAsMTggQEAKIAl9CiAKIAlmbGFncyA9IHNrYi0+bGVuOwotCWZsYWdzIHw9IFJUTDgxODdfVFhfRkxBR19OT19FTkNSWVBUOworCWZsYWdzIHw9IFJUTDgxOFhfVFhfREVTQ19GTEFHX05PX0VOQzsKIAogCWZsYWdzIHw9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShkZXYsIGluZm8pLT5od192YWx1ZSA8PCAyNDsKIAlpZiAoaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSktPmZyYW1lX2NvbnRyb2wpKQotCQlmbGFncyB8PSBSVEw4MTg3X1RYX0ZMQUdfTU9SRV9GUkFHOworCQlmbGFncyB8PSBSVEw4MThYX1RYX0RFU0NfRkxBR19NT1JFRlJBRzsKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1VTRV9SVFNfQ1RTKSB7Ci0JCWZsYWdzIHw9IFJUTDgxODdfVFhfRkxBR19SVFM7CisJCWZsYWdzIHw9IFJUTDgxOFhfVFhfREVTQ19GTEFHX1JUUzsKIAkJZmxhZ3MgfD0gaWVlZTgwMjExX2dldF9ydHNfY3RzX3JhdGUoZGV2LCBpbmZvKS0+aHdfdmFsdWUgPDwgMTk7CiAJCXJ0c19kdXIgPSBpZWVlODAyMTFfcnRzX2R1cmF0aW9uKGRldiwgcHJpdi0+dmlmLAogCQkJCQkJIHNrYi0+bGVuLCBpbmZvKTsKIAl9IGVsc2UgaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpIHsKLQkJZmxhZ3MgfD0gUlRMODE4N19UWF9GTEFHX0NUUzsKKwkJZmxhZ3MgfD0gUlRMODE4WF9UWF9ERVNDX0ZMQUdfQ1RTOwogCQlmbGFncyB8PSBpZWVlODAyMTFfZ2V0X3J0c19jdHNfcmF0ZShkZXYsIGluZm8pLT5od192YWx1ZSA8PCAxOTsKIAl9CiAKQEAgLTM1NCw3ICszNTcsNyBAQAogCXJ4X3N0YXR1cy5mcmVxID0gZGV2LT5jb25mLmNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCXJ4X3N0YXR1cy5iYW5kID0gZGV2LT5jb25mLmNoYW5uZWwtPmJhbmQ7CiAJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19UU0ZUOwotCWlmIChmbGFncyAmICgxIDw8IDEzKSkKKwlpZiAoZmxhZ3MgJiBSVEw4MThYX1JYX0RFU0NfRkxBR19DUkMzMl9FUlIpCiAJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkM7CiAJaWVlZTgwMjExX3J4X2lycXNhZmUoZGV2LCBza2IsICZyeF9zdGF0dXMpOwogCkBAIC04MzYsMTEgKzgzOSwxMSBAQAogCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAJaW50IGk7CiAKLQlpZiAocHJpdi0+bW9kZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKQorCWlmIChwcml2LT5tb2RlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCXN3aXRjaCAoY29uZi0+dHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcHJpdi0+bW9kZSA9IGNvbmYtPnR5cGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC04NjUsNyArODY4LDcgQEAKIHsKIAlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCW11dGV4X2xvY2soJnByaXYtPmNvbmZfbXV0ZXgpOwotCXByaXYtPm1vZGUgPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwogCXByaXYtPnZpZiA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb25mX211dGV4KTsKIH0KQEAgLTEwNTcsNyArMTA2MCw3IEBACiAJZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmcHJpdi0+YmFuZDsKIAogCi0JcHJpdi0+bW9kZSA9IElFRUU4MDIxMV9JRl9UWVBFX01OVFI7CisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7CiAJZGV2LT5mbGFncyA9IElFRUU4MDIxMV9IV19IT1NUX0JST0FEQ0FTVF9QU19CVUZGRVJJTkcgfAogCQkgICAgIElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1M7CiAKQEAgLTExODQsNiArMTE4Nyw4IEBACiAJCWRldi0+bWF4X3NpZ25hbCA9IDY1OwogCX0KIAorCWRldi0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKKwogCWlmICgoaWQtPmRyaXZlcl9pbmZvID09IERFVklDRV9SVEw4MTg3KSAmJiBwcml2LT5pc19ydGw4MTg3YikKIAkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE4NzogaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGlkIHdpdGggT0VNIgogCQkgICAgICAgIiBpbmZvIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4LmgKaW5kZXggMDA5MDBmZS4uMzUzOGIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHguaApAQCAtMTkzLDQgKzE5MywzOSBAQAogCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IGllZWU4MDIxMV9odyAqLCBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKik7CiB9OwogCisvKiBUeC9SeCBmbGFncyBhcmUgY29tbW9uIGJldHdlZW4gUlRMODE4WCBjaGlwcyAqLworCitlbnVtIHJ0bDgxOHhfdHhfZGVzY19mbGFncyB7CisJUlRMODE4WF9UWF9ERVNDX0ZMQUdfTk9fRU5DCT0gKDEgPDwgMTUpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX1RYX09LCT0gKDEgPDwgMTUpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX1NQTENQCT0gKDEgPDwgMTYpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX1JYX1VOREVSCT0gKDEgPDwgMTYpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX01PUkVGUkFHCT0gKDEgPDwgMTcpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX0NUUwk9ICgxIDw8IDE4KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19SVFMJPSAoMSA8PCAyMyksCisJUlRMODE4WF9UWF9ERVNDX0ZMQUdfTFMJCT0gKDEgPDwgMjgpLAorCVJUTDgxOFhfVFhfREVTQ19GTEFHX0ZTCQk9ICgxIDw8IDI5KSwKKwlSVEw4MThYX1RYX0RFU0NfRkxBR19ETUEJPSAoMSA8PCAzMCksCisJUlRMODE4WF9UWF9ERVNDX0ZMQUdfT1dOCT0gKDEgPDwgMzEpCit9OworCitlbnVtIHJ0bDgxOHhfcnhfZGVzY19mbGFncyB7CisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfSUNWX0VSUgk9ICgxIDw8IDEyKSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19DUkMzMl9FUlIJPSAoMSA8PCAxMyksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfUE0JCT0gKDEgPDwgMTQpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX1JYX0VSUgk9ICgxIDw8IDE1KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19CQ0FTVAk9ICgxIDw8IDE2KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19QQU0JPSAoMSA8PCAxNyksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfTUNBU1QJPSAoMSA8PCAxOCksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfUU9TCT0gKDEgPDwgMTkpLCAvKiBSVEw4MTg3KEIpIG9ubHkgKi8KKwlSVEw4MThYX1JYX0RFU0NfRkxBR19UUlNXCT0gKDEgPDwgMjQpLCAvKiBSVEw4MTg3KEIpIG9ubHkgKi8KKwlSVEw4MThYX1JYX0RFU0NfRkxBR19TUExDUAk9ICgxIDw8IDI1KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19GT0YJPSAoMSA8PCAyNiksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfRE1BX0ZBSUwJPSAoMSA8PCAyNyksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfTFMJCT0gKDEgPDwgMjgpLAorCVJUTDgxOFhfUlhfREVTQ19GTEFHX0ZTCQk9ICgxIDw8IDI5KSwKKwlSVEw4MThYX1JYX0RFU0NfRkxBR19FT1IJPSAoMSA8PCAzMCksCisJUlRMODE4WF9SWF9ERVNDX0ZMQUdfT1dOCT0gKDEgPDwgMzEpCit9OworCiAjZW5kaWYgLyogUlRMODE4WF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3BlY3RydW1fY3MuYwppbmRleCA5OGRmOWJjLi44NTI3ODlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTM0LDkgKzMzLDYgQEAKIAogI2luY2x1ZGUgIm9yaW5vY28uaCIKIAotc3RhdGljIGNvbnN0IGNoYXIgcHJpbWFyeV9md19uYW1lW10gPSAic3ltYm9sX3NwMjR0X3ByaW1fZnciOwotc3RhdGljIGNvbnN0IGNoYXIgc2Vjb25kYXJ5X2Z3X25hbWVbXSA9ICJzeW1ib2xfc3AyNHRfc2VjX2Z3IjsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogTW9kdWxlIHN0dWZmCQkJCQkJCSAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzEsMTYxICs2NywxMSBAQAogc3RhdGljIGludCBzcGVjdHJ1bV9jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspOwogc3RhdGljIHZvaWQgc3BlY3RydW1fY3NfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZpcm13YXJlIGRvd25sb2FkZXIJCQkJCQkgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUG9zaXRpb24gb2YgUERBIGluIHRoZSBhZGFwdGVyIG1lbW9yeSAqLwotI2RlZmluZSBFRVBST01fQUREUgkweDMwMDAKLSNkZWZpbmUgRUVQUk9NX0xFTgkweDIwMAotI2RlZmluZSBQREFfT0ZGU0VUCTB4MTAwCi0KLSNkZWZpbmUgUERBX0FERFIJKEVFUFJPTV9BRERSICsgUERBX09GRlNFVCkKLSNkZWZpbmUgUERBX1dPUkRTCSgoRUVQUk9NX0xFTiAtIFBEQV9PRkZTRVQpIC8gMikKLQogLyogQ29uc3RhbnRzIGZvciB0aGUgQ0lTUkVHX0NDU1IgcmVnaXN0ZXIgKi8KICNkZWZpbmUgSENSX1JVTgkJMHgwNwkvKiBydW4gZmlybXdhcmUgYWZ0ZXIgcmVzZXQgKi8KICNkZWZpbmUgSENSX0lETEUJMHgwRQkvKiBkb24ndCBydW4gZmlybXdhcmUgYWZ0ZXIgcmVzZXQgKi8KICNkZWZpbmUgSENSX01FTTE2CTB4MTAJLyogbWVtb3J5IHdpZHRoIGJpdCwgc2hvdWxkIGJlIHByZXNlcnZlZCAqLwogCi0vKgotICogQVVYIHBvcnQgYWNjZXNzLiAgVG8gdW5sb2NrIHRoZSBBVVggcG9ydCB3cml0ZSB0aGUgYWNjZXNzIGtleXMgdG8gdGhlCi0gKiBQQVJBTTAtMiByZWdpc3RlcnMsIHRoZW4gd3JpdGUgSEVSTUVTX0FVWF9FTkFCTEUgdG8gdGhlIEhFUk1FU19DT05UUk9MCi0gKiByZWdpc3Rlci4gIFRoZW4gcmVhZCBpdCBhbmQgbWFrZSBzdXJlIGl0J3MgSEVSTUVTX0FVWF9FTkFCTEVELgotICovCi0jZGVmaW5lIEhFUk1FU19BVVhfRU5BQkxFCTB4ODAwMAkvKiBFbmFibGUgYXV4aWxpYXJ5IHBvcnQgYWNjZXNzICovCi0jZGVmaW5lIEhFUk1FU19BVVhfRElTQUJMRQkweDQwMDAJLyogRGlzYWJsZSB0byBhdXhpbGlhcnkgcG9ydCBhY2Nlc3MgKi8KLSNkZWZpbmUgSEVSTUVTX0FVWF9FTkFCTEVECTB4QzAwMAkvKiBBdXhpbGlhcnkgcG9ydCBpcyBvcGVuICovCi0KLSNkZWZpbmUgSEVSTUVTX0FVWF9QVzAJMHhGRTAxCi0jZGVmaW5lIEhFUk1FU19BVVhfUFcxCTB4REMyMwotI2RlZmluZSBIRVJNRVNfQVVYX1BXMgkweEJBNDUKLQotLyogRW5kIG1hcmtlcnMgKi8KLSNkZWZpbmUgUERJX0VORAkJMHgwMDAwMDAwMAkvKiBFbmQgb2YgUERBICovCi0jZGVmaW5lIEJMT0NLX0VORAkweEZGRkZGRkZGCS8qIExhc3QgaW1hZ2UgYmxvY2sgKi8KLSNkZWZpbmUgVEVYVF9FTkQJMHgxQQkJLyogRW5kIG9mIHRleHQgaGVhZGVyICovCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgaGF2ZSBsaXR0bGUtZW5kaWFuIGZpZWxkcyBkZW5vdGVkIGJ5Ci0gKiB0aGUgbGVhZGluZyB1bmRlcnNjb3JlLiAgRG9uJ3QgYWNjZXNzIHRoZW0gZGlyZWN0bHkgLSB1c2UgaW5saW5lCi0gKiBmdW5jdGlvbnMgZGVmaW5lZCBiZWxvdy4KLSAqLwotCi0vKgotICogVGhlIGJpbmFyeSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGNvbnNpc3RzIG9mIHNlcmllcyBvZiBkYXRhIGJsb2Nrcy4KLSAqIEVhY2ggYmxvY2sgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgZGJsb2NrIHsKLQlfX2xlMzIgYWRkcjsJCS8qIGFkYXB0ZXIgYWRkcmVzcyB3aGVyZSB0byB3cml0ZSB0aGUgYmxvY2sgKi8KLQlfX2xlMTYgbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBkYXRhIG9ubHksIGluIGJ5dGVzICovCi0JY2hhciBkYXRhWzBdOwkJLyogZGF0YSB0byBiZSB3cml0dGVuICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoKLSAqIFBsdWcgRGF0YSBSZWZlcmVuY2VzIGFyZSBsb2NhdGVkIGluIGluIHRoZSBpbWFnZSBhZnRlciB0aGUgbGFzdCBkYXRhCi0gKiBibG9jay4gIFRoZXkgcmVmZXIgdG8gYXJlYXMgaW4gdGhlIGFkYXB0ZXIgbWVtb3J5IHdoZXJlIHRoZSBwbHVnIGRhdGEKLSAqIGl0ZW1zIHdpdGggbWF0Y2hpbmcgSUQgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gKi8KLXN0cnVjdCBwZHIgewotCV9fbGUzMiBpZDsJCS8qIHJlY29yZCBJRCAqLwotCV9fbGUzMiBhZGRyOwkJLyogYWRhcHRlciBhZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBkYXRhICovCi0JX19sZTMyIGxlbjsJCS8qIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgZGF0YSwgaW4gYnl0ZXMgKi8KLQljaGFyIG5leHRbMF07CQkvKiBuZXh0IFBEUiBzdGFydHMgaGVyZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyoKLSAqIFBsdWcgRGF0YSBJdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgRUVQUk9NIHJlYWQgZnJvbSB0aGUgYWRhcHRlciBieQotICogcHJpbWFyeSBmaXJtd2FyZS4gIFRoZXkgcmVmZXIgdG8gdGhlIGRldmljZS1zcGVjaWZpYyBkYXRhIHRoYXQgc2hvdWxkCi0gKiBiZSBwbHVnZ2VkIGludG8gdGhlIHNlY29uZGFyeSBmaXJtd2FyZS4KLSAqLwotc3RydWN0IHBkaSB7Ci0JX19sZTE2IGxlbjsJCS8qIGxlbmd0aCBvZiBJRCBhbmQgZGF0YSwgaW4gd29yZHMgKi8KLQlfX2xlMTYgaWQ7CQkvKiByZWNvcmQgSUQgKi8KLQljaGFyIGRhdGFbMF07CQkvKiBwbHVnIGRhdGEgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIEZ1bmN0aW9ucyBmb3IgYWNjZXNzIHRvIGxpdHRsZS1lbmRpYW4gZGF0YSAqLwotc3RhdGljIGlubGluZSB1MzIKLWRibG9ja19hZGRyKGNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsaykKLXsKLQlyZXR1cm4gbGUzMl90b19jcHUoYmxrLT5hZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIKLWRibG9ja19sZW4oY29uc3Qgc3RydWN0IGRibG9jayAqYmxrKQotewotCXJldHVybiBsZTE2X3RvX2NwdShibGstPmxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyCi1wZHJfaWQoY29uc3Qgc3RydWN0IHBkciAqcGRyKQotewotCXJldHVybiBsZTMyX3RvX2NwdShwZHItPmlkKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIKLXBkcl9hZGRyKGNvbnN0IHN0cnVjdCBwZHIgKnBkcikKLXsKLQlyZXR1cm4gbGUzMl90b19jcHUocGRyLT5hZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIKLXBkcl9sZW4oY29uc3Qgc3RydWN0IHBkciAqcGRyKQotewotCXJldHVybiBsZTMyX3RvX2NwdShwZHItPmxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyCi1wZGlfaWQoY29uc3Qgc3RydWN0IHBkaSAqcGRpKQotewotCXJldHVybiBsZTE2X3RvX2NwdShwZGktPmlkKTsKLX0KLQotLyogUmV0dXJuIGxlbmd0aCBvZiB0aGUgZGF0YSBvbmx5LCBpbiBieXRlcyAqLwotc3RhdGljIGlubGluZSB1MzIKLXBkaV9sZW4oY29uc3Qgc3RydWN0IHBkaSAqcGRpKQotewotCXJldHVybiAyICogKGxlMTZfdG9fY3B1KHBkaS0+bGVuKSAtIDEpOwotfQotCi0KLS8qIFNldCBhZGRyZXNzIG9mIHRoZSBhdXhpbGlhcnkgcG9ydCAqLwotc3RhdGljIGlubGluZSB2b2lkCi1zcGVjdHJ1bV9hdXhfc2V0YWRkcihoZXJtZXNfdCAqaHcsIHUzMiBhZGRyKQotewotCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19BVVhQQUdFLCAodTE2KSAoYWRkciA+PiA3KSk7Ci0JaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX0FVWE9GRlNFVCwgKHUxNikgKGFkZHIgJiAweDdGKSk7Ci19Ci0KLQotLyogT3BlbiBhY2Nlc3MgdG8gdGhlIGF1eGlsaWFyeSBwb3J0ICovCi1zdGF0aWMgaW50Ci1zcGVjdHJ1bV9hdXhfb3BlbihoZXJtZXNfdCAqaHcpCi17Ci0JaW50IGk7Ci0KLQkvKiBBbHJlYWR5IG9wZW4/ICovCi0JaWYgKGhlcm1lc19yZWFkX3JlZyhodywgSEVSTUVTX0NPTlRST0wpID09IEhFUk1FU19BVVhfRU5BQkxFRCkKLQkJcmV0dXJuIDA7Ci0KLQloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfUEFSQU0wLCBIRVJNRVNfQVVYX1BXMCk7Ci0JaGVybWVzX3dyaXRlX3JlZyhodywgSEVSTUVTX1BBUkFNMSwgSEVSTUVTX0FVWF9QVzEpOwotCWhlcm1lc193cml0ZV9yZWcoaHcsIEhFUk1FU19QQVJBTTIsIEhFUk1FU19BVVhfUFcyKTsKLQloZXJtZXNfd3JpdGVfcmVnKGh3LCBIRVJNRVNfQ09OVFJPTCwgSEVSTUVTX0FVWF9FTkFCTEUpOwotCi0JZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJdWRlbGF5KDEwKTsKLQkJaWYgKGhlcm1lc19yZWFkX3JlZyhodywgSEVSTUVTX0NPTlRST0wpID09Ci0JCSAgICBIRVJNRVNfQVVYX0VOQUJMRUQpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVCVVNZOwotfQotCiAKICNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAogICBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQpAQCAtMjkyLDI1MiArMTM4LDYgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotCi0vKgotICogU2NhbiBQRFIgZm9yIHRoZSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIFJFQ09SRF9JRC4KLSAqIElmIGl0J3Mgbm90IGZvdW5kLCByZXR1cm4gTlVMTC4KLSAqLwotc3RhdGljIHN0cnVjdCBwZHIgKgotc3BlY3RydW1fZmluZF9wZHIoc3RydWN0IHBkciAqZmlyc3RfcGRyLCB1MzIgcmVjb3JkX2lkKQotewotCXN0cnVjdCBwZHIgKnBkciA9IGZpcnN0X3BkcjsKLQotCXdoaWxlIChwZHJfaWQocGRyKSAhPSBQRElfRU5EKSB7Ci0JCS8qCi0JCSAqIFBEUiBhcmVhIGlzIGN1cnJlbnRseSBub3QgdGVybWluYXRlZCBieSBQRElfRU5ELgotCQkgKiBJdCdzIGZvbGxvd2VkIGJ5IENSQyByZWNvcmRzLCB3aGljaCBoYXZlIHRoZSB0eXBlCi0JCSAqIGZpZWxkIHdoZXJlIFBEUiBoYXMgbGVuZ3RoLiAgVGhlIHR5cGUgY2FuIGJlIDAgb3IgMS4KLQkJICovCi0JCWlmIChwZHJfbGVuKHBkcikgPCAyKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJLyogSWYgdGhlIHJlY29yZCBJRCBtYXRjaGVzLCB3ZSBhcmUgZG9uZSAqLwotCQlpZiAocGRyX2lkKHBkcikgPT0gcmVjb3JkX2lkKQotCQkJcmV0dXJuIHBkcjsKLQotCQlwZHIgPSAoc3RydWN0IHBkciAqKSBwZHItPm5leHQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0KLS8qIFByb2Nlc3Mgb25lIFBsdWcgRGF0YSBJdGVtIC0gZmluZCBjb3JyZXNwb25kaW5nIFBEUiBhbmQgcGx1ZyBpdCAqLwotc3RhdGljIGludAotc3BlY3RydW1fcGx1Z19wZGkoaGVybWVzX3QgKmh3LCBzdHJ1Y3QgcGRyICpmaXJzdF9wZHIsIHN0cnVjdCBwZGkgKnBkaSkKLXsKLQlzdHJ1Y3QgcGRyICpwZHI7Ci0KLQkvKiBGaW5kIHRoZSBQREkgY29ycmVzcG9uZGluZyB0byB0aGlzIFBEUiAqLwotCXBkciA9IHNwZWN0cnVtX2ZpbmRfcGRyKGZpcnN0X3BkciwgcGRpX2lkKHBkaSkpOwotCi0JLyogTm8gbWF0Y2ggaXMgZm91bmQsIHNhZmUgdG8gaWdub3JlICovCi0JaWYgKCFwZHIpCi0JCXJldHVybiAwOwotCi0JLyogTGVuZ3RocyBvZiB0aGUgZGF0YSBpbiBQREkgYW5kIFBEUiBtdXN0IG1hdGNoICovCi0JaWYgKHBkaV9sZW4ocGRpKSAhPSBwZHJfbGVuKHBkcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogZG8gdGhlIGFjdHVhbCBwbHVnZ2luZyAqLwotCXNwZWN0cnVtX2F1eF9zZXRhZGRyKGh3LCBwZHJfYWRkcihwZHIpKTsKLQloZXJtZXNfd3JpdGVfYnl0ZXMoaHcsIEhFUk1FU19BVVhEQVRBLCBwZGktPmRhdGEsIHBkaV9sZW4ocGRpKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIFBEQSBmcm9tIHRoZSBhZGFwdGVyICovCi1zdGF0aWMgaW50Ci1zcGVjdHJ1bV9yZWFkX3BkYShoZXJtZXNfdCAqaHcsIF9fbGUxNiAqcGRhLCBpbnQgcGRhX2xlbikKLXsKLQlpbnQgcmV0OwotCWludCBwZGFfc2l6ZTsKLQotCS8qIElzc3VlIGNvbW1hbmQgdG8gcmVhZCBFRVBST00gKi8KLQlyZXQgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9SRUFETUlGLCAwLCBOVUxMKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogT3BlbiBhdXhpbGlhcnkgcG9ydCAqLwotCXJldCA9IHNwZWN0cnVtX2F1eF9vcGVuKGh3KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogcmVhZCBQREEgZnJvbSBFRVBST00gKi8KLQlzcGVjdHJ1bV9hdXhfc2V0YWRkcihodywgUERBX0FERFIpOwotCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfQVVYREFUQSwgcGRhLCBwZGFfbGVuIC8gMik7Ci0KLQkvKiBDaGVjayBQREEgbGVuZ3RoICovCi0JcGRhX3NpemUgPSBsZTE2X3RvX2NwdShwZGFbMF0pOwotCWlmIChwZGFfc2l6ZSA+IHBkYV9sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogUGFyc2UgUERBIGFuZCB3cml0ZSB0aGUgcmVjb3JkcyBpbnRvIHRoZSBhZGFwdGVyICovCi1zdGF0aWMgaW50Ci1zcGVjdHJ1bV9hcHBseV9wZGEoaGVybWVzX3QgKmh3LCBjb25zdCBzdHJ1Y3QgZGJsb2NrICpmaXJzdF9ibG9jaywKLQkJICAgX19sZTE2ICpwZGEpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgcGRpICpwZGk7Ci0Jc3RydWN0IHBkciAqZmlyc3RfcGRyOwotCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsayA9IGZpcnN0X2Jsb2NrOwotCi0JLyogU2tpcCBhbGwgYmxvY2tzIHRvIGxvY2F0ZSBQbHVnIERhdGEgUmVmZXJlbmNlcyAqLwotCXdoaWxlIChkYmxvY2tfYWRkcihibGspICE9IEJMT0NLX0VORCkKLQkJYmxrID0gKHN0cnVjdCBkYmxvY2sgKikgJmJsay0+ZGF0YVtkYmxvY2tfbGVuKGJsayldOwotCi0JZmlyc3RfcGRyID0gKHN0cnVjdCBwZHIgKikgYmxrOwotCi0JLyogR28gdGhyb3VnaCBldmVyeSBQREkgYW5kIHBsdWcgdGhlbSBpbnRvIHRoZSBhZGFwdGVyICovCi0JcGRpID0gKHN0cnVjdCBwZGkgKikgKHBkYSArIDIpOwotCXdoaWxlIChwZGlfaWQocGRpKSAhPSBQRElfRU5EKSB7Ci0JCXJldCA9IHNwZWN0cnVtX3BsdWdfcGRpKGh3LCBmaXJzdF9wZHIsIHBkaSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBQREkgKi8KLQkJcGRpID0gKHN0cnVjdCBwZGkgKikgJnBkaS0+ZGF0YVtwZGlfbGVuKHBkaSldOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBMb2FkIGZpcm13YXJlIGJsb2NrcyBpbnRvIHRoZSBhZGFwdGVyICovCi1zdGF0aWMgaW50Ci1zcGVjdHJ1bV9sb2FkX2Jsb2NrcyhoZXJtZXNfdCAqaHcsIGNvbnN0IHN0cnVjdCBkYmxvY2sgKmZpcnN0X2Jsb2NrKQotewotCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmJsazsKLQl1MzIgYmxrYWRkcjsKLQl1MzIgYmxrbGVuOwotCi0JYmxrID0gZmlyc3RfYmxvY2s7Ci0JYmxrYWRkciA9IGRibG9ja19hZGRyKGJsayk7Ci0JYmxrbGVuID0gZGJsb2NrX2xlbihibGspOwotCi0Jd2hpbGUgKGRibG9ja19hZGRyKGJsaykgIT0gQkxPQ0tfRU5EKSB7Ci0JCXNwZWN0cnVtX2F1eF9zZXRhZGRyKGh3LCBibGthZGRyKTsKLQkJaGVybWVzX3dyaXRlX2J5dGVzKGh3LCBIRVJNRVNfQVVYREFUQSwgYmxrLT5kYXRhLAotCQkJCSAgIGJsa2xlbik7Ci0KLQkJYmxrID0gKHN0cnVjdCBkYmxvY2sgKikgJmJsay0+ZGF0YVtibGtsZW5dOwotCQlibGthZGRyID0gZGJsb2NrX2FkZHIoYmxrKTsKLQkJYmxrbGVuID0gZGJsb2NrX2xlbihibGspOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogUHJvY2VzcyBhIGZpcm13YXJlIGltYWdlIC0gc3RvcCB0aGUgY2FyZCwgbG9hZCB0aGUgZmlybXdhcmUsIHJlc2V0Ci0gKiB0aGUgY2FyZCBhbmQgbWFrZSBzdXJlIGl0IHJlc3BvbmRzLiAgRm9yIHRoZSBzZWNvbmRhcnkgZmlybXdhcmUgdGFrZQotICogY2FyZSBvZiB0aGUgUERBIC0gcmVhZCBpdCBhbmQgdGhlbiB3cml0ZSBpdCBvbiB0b3Agb2YgdGhlIGZpcm13YXJlLgotICovCi1zdGF0aWMgaW50Ci1zcGVjdHJ1bV9kbF9pbWFnZShoZXJtZXNfdCAqaHcsIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rLAotCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmltYWdlLCBpbnQgc2Vjb25kYXJ5KQotewotCWludCByZXQ7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcHRyOwotCWNvbnN0IHN0cnVjdCBkYmxvY2sgKmZpcnN0X2Jsb2NrOwotCi0JLyogUGx1ZyBEYXRhIEFyZWEgKFBEQSkgKi8KLQlfX2xlMTYgcGRhW1BEQV9XT1JEU107Ci0KLQkvKiBCaW5hcnkgYmxvY2sgYmVnaW5zIGFmdGVyIHRoZSAweDFBIG1hcmtlciAqLwotCXB0ciA9IGltYWdlOwotCXdoaWxlICgqcHRyKysgIT0gVEVYVF9FTkQpOwotCWZpcnN0X2Jsb2NrID0gKGNvbnN0IHN0cnVjdCBkYmxvY2sgKikgcHRyOwotCi0JLyogUmVhZCB0aGUgUERBICovCi0JaWYgKHNlY29uZGFyeSkgewotCQlyZXQgPSBzcGVjdHJ1bV9yZWFkX3BkYShodywgcGRhLCBzaXplb2YocGRhKSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFN0b3AgdGhlIGZpcm13YXJlLCBzbyB0aGF0IGl0IGNhbiBiZSBzYWZlbHkgcmV3cml0dGVuICovCi0JcmV0ID0gc3BlY3RydW1fcmVzZXQobGluaywgMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFByb2dyYW0gdGhlIGFkYXB0ZXIgd2l0aCBuZXcgZmlybXdhcmUgKi8KLQlyZXQgPSBzcGVjdHJ1bV9sb2FkX2Jsb2NrcyhodywgZmlyc3RfYmxvY2spOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBXcml0ZSB0aGUgUERBIHRvIHRoZSBhZGFwdGVyICovCi0JaWYgKHNlY29uZGFyeSkgewotCQlyZXQgPSBzcGVjdHJ1bV9hcHBseV9wZGEoaHcsIGZpcnN0X2Jsb2NrLCBwZGEpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBSdW4gdGhlIGZpcm13YXJlICovCi0JcmV0ID0gc3BlY3RydW1fcmVzZXQobGluaywgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFJlc2V0IGhlcm1lcyBjaGlwIGFuZCBtYWtlIHN1cmUgaXQgcmVzcG9uZHMgKi8KLQlyZXQgPSBoZXJtZXNfaW5pdChodyk7Ci0KLQkvKiBoZXJtZXNfcmVzZXQoKSBzaG91bGQgcmV0dXJuIDAgd2l0aCB0aGUgc2Vjb25kYXJ5IGZpcm13YXJlICovCi0JaWYgKHNlY29uZGFyeSAmJiByZXQgIT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBBbmQgdGhpcyBzaG91bGQgd29yayB3aXRoIGFueSBmaXJtd2FyZSAqLwotCWlmICghaGVybWVzX3ByZXNlbnQoaHcpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2FyZCwgdGhpcyBhbHNvIGRvZXMgYSBQQ01DSUEgc29mdAotICogcmVzZXQgb24gdGhlIGNhcmQsIHRvIG1ha2Ugc3VyZSBpdCdzIGluIGEgc2FuZSBzdGF0ZS4KLSAqLwotc3RhdGljIGludAotc3BlY3RydW1fZGxfZmlybXdhcmUoaGVybWVzX3QgKmh3LCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKLXsKLQlpbnQgcmV0OwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7Ci0KLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIHByaW1hcnlfZndfbmFtZSwKLQkJCSAgICAgJmhhbmRsZV90b19kZXYobGluaykpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgZmlybXdhcmU6ICVzXG4iLAotCQkgICAgICAgcHJpbWFyeV9md19uYW1lKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JLyogTG9hZCBwcmltYXJ5IGZpcm13YXJlICovCi0JcmV0ID0gc3BlY3RydW1fZGxfaW1hZ2UoaHcsIGxpbmssIGZ3X2VudHJ5LT5kYXRhLCAwKTsKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlByaW1hcnkgZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIHNlY29uZGFyeV9md19uYW1lLAotCQkJICAgICAmaGFuZGxlX3RvX2RldihsaW5rKSkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBmaXJtd2FyZTogJXNcbiIsCi0JCSAgICAgICBzZWNvbmRhcnlfZndfbmFtZSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCS8qIExvYWQgc2Vjb25kYXJ5IGZpcm13YXJlICovCi0JcmV0ID0gc3BlY3RydW1fZGxfaW1hZ2UoaHcsIGxpbmssIGZ3X2VudHJ5LT5kYXRhLCAxKTsKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlNlY29uZGFyeSBmaXJtd2FyZSBkb3dubG9hZCBmYWlsZWRcbiIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERldmljZSBtZXRob2RzICAgICAJCQkJCQkgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU0NywyMiArMTQ3LDIyIEBACiB7CiAJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGNhcmQtPnBfZGV2OwotCWludCBlcnI7CiAKLQlpZiAoIWhlcm1lc19wcmVzZW50KCZwcml2LT5odykpIHsKLQkJLyogVGhlIGZpcm13YXJlIG5lZWRzIHRvIGJlIHJlbG9hZGVkICovCi0JCWlmIChzcGVjdHJ1bV9kbF9maXJtd2FyZSgmcHJpdi0+aHcsIGxpbmspICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIkZpcm13YXJlIGRvd25sb2FkIGZhaWxlZFxuIik7Ci0JCQllcnIgPSAtRU5PREVWOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogU29mdCByZXNldCB1c2luZyBDT1IgYW5kIEhDUiAqLwotCQlzcGVjdHJ1bV9yZXNldChsaW5rLCAwKTsKLQl9CisJLyogU29mdCByZXNldCB1c2luZyBDT1IgYW5kIEhDUiAqLworCXNwZWN0cnVtX3Jlc2V0KGxpbmssIDApOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK3NwZWN0cnVtX2NzX3N0b3BfZmlybXdhcmUoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwgaW50IGlkbGUpCit7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGNhcmQtPnBfZGV2OworCisJcmV0dXJuIHNwZWN0cnVtX3Jlc2V0KGxpbmssIGlkbGUpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQQ01DSUEgc3R1ZmYgICAgIAkJCQkJCSAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTgyLDcgKzE4Miw5IEBACiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQ7CiAKLQlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIHNwZWN0cnVtX2NzX2hhcmRfcmVzZXQpOworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgJmhhbmRsZV90b19kZXYobGluayksCisJCQkgICAgICAgc3BlY3RydW1fY3NfaGFyZF9yZXNldCwKKwkJCSAgICAgICBzcGVjdHJ1bV9jc19zdG9wX2Zpcm13YXJlKTsKIAlpZiAoISBkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNTkzLDcgKzE5NSw3IEBACiAJbGluay0+cHJpdiA9IGRldjsKIAogCS8qIEludGVycnVwdCBzZXR1cCAqLwotCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwogCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKIAlsaW5rLT5pcnEuSGFuZGxlciA9IG9yaW5vY29faW50ZXJydXB0OwogCWxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsgCkBAIC02MzMsNiArMjM1LDcwIEBACiAgKiBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCiAgKi8KIAorc3RhdGljIGludCBzcGVjdHJ1bV9jc19jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkJICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkJICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkJICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQlnb3RvIG5leHRfZW50cnk7CisKKwkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkvKiBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCURFQlVHKDIsICJzcGVjdHJ1bV9jc19jb25maWc6IFZjYyBtaXNtYXRjaCAodmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIHZjYywgY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOworCQkJaWYgKCFpZ25vcmVfY2lzX3ZjYykKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKwl9IGVsc2UgaWYgKGRmbHQtPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmICh2Y2MgIT0gZGZsdC0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7CisJCQlERUJVRygyLCAic3BlY3RydW1fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKHZjYyA9ICVkLCBDSVMgPSAlZClcbiIsICB2Y2MsIGRmbHQtPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCX0KKworCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0KKwkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwllbHNlIGlmIChkZmx0LT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9CisJCQlkZmx0LT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCisJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMyID0gcF9kZXYtPmlvLkF0dHJpYnV0ZXMxOworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCisJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbykgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwl9CisJcmV0dXJuIDA7CisKK25leHRfZW50cnk6CisJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBfZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK307CisKIHN0YXRpYyBpbnQKIHNwZWN0cnVtX2NzX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKQEAgLTY0MSwxNiArMzA3LDggQEAKIAlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKIAlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7Ci0JdV9jaGFyIGJ1Zls2NF07Ci0JY29uZmlnX2luZm9fdCBjb25mOwotCXR1cGxlX3QgdHVwbGU7Ci0JY2lzcGFyc2VfdCBwYXJzZTsKIAl2b2lkIF9faW9tZW0gKm1lbTsKIAotCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCi0JQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCi0JCSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZikpOwotCiAJLyoKIAkgKiBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZQogCSAqIGVudHJpZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZApAQCAtNjY1LDk0ICszMjMsMTQgQEAKIAkgKiBhbmQgbW9zdCBjbGllbnQgZHJpdmVycyB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbgogCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KIAkgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAuaW5kZXggPSAwIH07Ci0KLQkJaWYgKCAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCkKLQkJICAgIHx8IChwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApKQotCQkJZ290byBuZXh0X2VudHJ5OwotCi0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCWRmbHQgPSAqY2ZnOwotCQlpZiAoY2ZnLT5pbmRleCA9PSAwKQotCQkJZ290byBuZXh0X2VudHJ5OwotCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKLQotCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KLQkJLyogTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KLQkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkJCWlmIChjb25mLlZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCkgewotCQkJCURFQlVHKDIsICJzcGVjdHJ1bV9jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgQ0lTID0gJWQpXG4iLCAgY29uZi5WY2MsIGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKTsKLQkJCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQotCQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotCQkJaWYgKGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7Ci0JCQkJREVCVUcoMiwgInNwZWN0cnVtX2NzX2NvbmZpZzogVmNjIG1pc21hdGNoIChjb25mLlZjYyA9ICVkLCBDSVMgPSAlZClcbiIsICBjb25mLlZjYywgZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOwotCQkJCWlmKCFpZ25vcmVfY2lzX3ZjYykKLQkJCQkJZ290byBuZXh0X2VudHJ5OwotCQkJfQotCQl9Ci0KLQkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLQkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQkKLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPQotCQkJICAgIChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPQotCQkJCSAgICBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KLQkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9Ci0JCQkgICAgaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9Ci0JCQkJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQotCQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pICE9IDApCi0JCQkJZ290byBuZXh0X2VudHJ5OwotCQl9Ci0KLQotCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCi0KLQkJYnJlYWs7Ci0JCQotCW5leHRfZW50cnk6Ci0JCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKLQkJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKTsKLQkJaWYgKGxhc3RfcmV0ICA9PSBDU19OT19NT1JFX0lURU1TKSB7CisJbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgc3BlY3RydW1fY3NfY29uZmlnX2NoZWNrLCBOVUxMKTsKKwlpZiAobGFzdF9yZXQpIHsKKwkJaWYgKCFpZ25vcmVfY2lzX3ZjYykKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIkdldE5leHRUdXBsZSgpOiBObyBtYXRjaGluZyAiCiAJCQkgICAgICAgIkNJUyBjb25maWd1cmF0aW9uLiAgTWF5YmUgeW91IG5lZWQgdGhlICIKIAkJCSAgICAgICAiaWdub3JlX2Npc192Y2M9MSBwYXJhbWV0ZXIuXG4iKTsKLQkJCWdvdG8gY3NfZmFpbGVkOwotCQl9CisJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgbGFzdF9yZXQpOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAkvKgpAQCAtNzg0LDcgKzM2Miw3IEBACiAJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CiAJY2FyZC0+bm9kZS5tYWpvciA9IGNhcmQtPm5vZGUubWlub3IgPSAwOwogCi0JLyogUmVzZXQgY2FyZCBhbmQgZG93bmxvYWQgZmlybXdhcmUgKi8KKwkvKiBSZXNldCBjYXJkICovCiAJaWYgKHNwZWN0cnVtX2NzX2hhcmRfcmVzZXQocHJpdikgIT0gMCkgewogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC04NDgsMTAgKzQyNiwxMSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAKIAkvKiBNYXJrIHRoZSBkZXZpY2UgYXMgc3RvcHBlZCwgdG8gYmxvY2sgSU8gdW50aWwgbGF0ZXIgKi8KLQlzcGluX2xvY2soJnByaXYtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOwogCWlmIChlcnIpCkBAIC04NjEsNyArNDQwLDcgQEAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKIAotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCmluZGV4IDEzNjIyMGIuLmU5MzlhNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKQEAgLTQzODcsNyArNDM4Nyw3IEBACiAgKgogICogVGhhbmtzIGdvIGFsc28gdG86CiAgKglKYW1lcyBBc2h0b24gKGphYTEwMUBzeXNlbmcuYW51LmVkdS5hdSksCi0gKglBbGFuIENveCAoYWxhbkByZWRoYXQuY29tKSwKKyAqCUFsYW4gQ294IChhbGFuQGx4b3JndWsudWt1dS5vcmcudWspLAogICoJQWxsYW4gQ3JlaWdodG9uIChhbGxhbmNAY3MudXN5ZC5lZHUuYXUpLAogICoJTWF0dGhldyBHZWllciAobWF0dGhld0Bjcy51c3lkLmVkdS5hdSksCiAgKglSZW1vIGRpIEdpb3Zhbm5pIChyZW1vQGNzLnVzeWQuZWR1LmF1KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4ucC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKaW5kZXggYjMzYWM0Ny4uNDRkMzFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKQEAgLTE4Niw3ICsxODYsNyBAQAogICoKICAqIFRoYW5rcyBnbyBhbHNvIHRvOgogICoJSmFtZXMgQXNodG9uIDxqYWExMDFAc3lzZW5nLmFudS5lZHUuYXU+LAotICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sCisgKglBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICAqCUFsbGFuIENyZWlnaHRvbiA8YWxsYW5jQGNzLnVzeWQuZWR1LmF1PiwKICAqCU1hdHRoZXcgR2VpZXIgPG1hdHRoZXdAY3MudXN5ZC5lZHUuYXU+LAogICoJUmVtbyBkaSBHaW92YW5uaSA8cmVtb0Bjcy51c3lkLmVkdS5hdT4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKaW5kZXggMDBhMzU1OS4uZTEyNGIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpAQCAtMzcwMiw3ICszNzAyLDcgQEAKICNlbmRpZgogCiAgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluaywgJnJlZyk7Ci0gIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgaWYgKGkgIT0gMCkKICAgICB7CiAgICAgICBjc19lcnJvcihsaW5rLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOwogICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMzcxNiw3ICszNzE2LDcgQEAKICAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOwogICByZWcuVmFsdWUgPSByZWcuVmFsdWUgfCBDT1JfU1dfUkVTRVQ7CiAgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluaywgJnJlZyk7Ci0gIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgaWYgKGkgIT0gMCkKICAgICB7CiAgICAgICBjc19lcnJvcihsaW5rLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOwogICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMzcyNSw3ICszNzI1LDcgQEAKICAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOwogICByZWcuVmFsdWUgPSBDT1JfTEVWRUxfSVJRIHwgQ09SX0NPTkZJRzsKICAgaSA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLCAmcmVnKTsKLSAgaWYoaSAhPSBDU19TVUNDRVNTKQorICBpZiAoaSAhPSAwKQogICAgIHsKICAgICAgIGNzX2Vycm9yKGxpbmssIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaSk7CiAgICAgICByZXR1cm4gRkFMU0U7CkBAIC0zOTAzLDcgKzM5MDMsNyBAQAogICBkbwogICAgIHsKICAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgICAgaWYgKGkgIT0gMCkKIAl7CiAJICBjc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGkpOwogCSAgYnJlYWs7CkBAIC0zOTE0LDcgKzM5MTQsNyBAQAogICAgICAgICogYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgogICAgICAgICovCiAgICAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgICAgaWYgKGkgIT0gMCkKIAl7CiAJICBjc19lcnJvcihsaW5rLCBSZXF1ZXN0SVJRLCBpKTsKIAkgIGJyZWFrOwpAQCAtMzkyNiw3ICszOTI2LDcgQEAKICAgICAgICAqLwogICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CiAgICAgICBpID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7Ci0gICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgICBpZiAoaSAhPSAwKQogCXsKIAkgIGNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKIAkgIGJyZWFrOwpAQCAtMzk0Miw3ICszOTQyLDcgQEAKICAgICAgIHJlcS5CYXNlID0gcmVxLlNpemUgPSAwOwogICAgICAgcmVxLkFjY2Vzc1NwZWVkID0gbWVtX3NwZWVkOwogICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbik7Ci0gICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgICBpZiAoaSAhPSAwKQogCXsKIAkgIGNzX2Vycm9yKGxpbmssIFJlcXVlc3RXaW5kb3csIGkpOwogCSAgYnJlYWs7CkBAIC0zOTU0LDcgKzM5NTQsNyBAQAogCiAgICAgICBtZW0uQ2FyZE9mZnNldCA9IDA7IG1lbS5QYWdlID0gMDsKICAgICAgIGkgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7Ci0gICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgICBpZiAoaSAhPSAwKQogCXsKIAkgIGNzX2Vycm9yKGxpbmssIE1hcE1lbVBhZ2UsIGkpOwogCSAgYnJlYWs7CkBAIC00NDk2LDcgKzQ0OTYsNyBAQAogICBwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAzOwogCiAgIC8qIEludGVycnVwdCBzZXR1cCAqLwotICBwX2Rldi0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgIHBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORyB8IElSUV9IQU5ETEVfUFJFU0VOVDsKICAgcF9kZXYtPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKICAgcF9kZXYtPmlycS5IYW5kbGVyID0gd2F2ZWxhbl9pbnRlcnJ1cHQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKaW5kZXggMzc3MTQxOS4uNjg3ODljNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIG1vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKICNkZWZpbmUgZHByaW50ayhuLCBmb3JtYXQsIGFyZ3MuLi4pIFwKIAl7IGlmIChwY19kZWJ1ZyA+IChuKSkgXAotCQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyNhcmdzKTsgfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19mdW5jX18gLCAjI2FyZ3MpOyB9CiAjZWxzZQogI2RlZmluZSBkcHJpbnRrKG4sIGZvcm1hdCwgYXJncy4uLikKICNlbmRpZgpAQCAtNDcwLDcgKzQ3MCw3IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CiAJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGlzLT53YWl0LAogCQkJCXRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLnN0YXR1cyAhPSAyNTUpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHN0YXR1cz0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHN0YXR1cz0lZFxuIiwgX19mdW5jX18sCiAJCQkgICAgICAgc3VzcGVuZCA/ICJzdXNwZW5kIiA6ICJyZXN1bWUiLAogCQkJICAgICAgIHRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLnN0YXR1cyk7CiAJCQlnb3RvIG91dDsKQEAgLTExOTksNyArMTE5OSw3IEBACiAJCX0KIAkJV0wzNTAxX05PUExPT1AoMTApOwogCX0KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHJlc2V0IHRoZSBib2FyZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZXNldCB0aGUgYm9hcmQhXG4iLCBfX2Z1bmNfXyk7CiAJcmMgPSAtRU5PREVWOwogb3V0OgogCXJldHVybiByYzsKQEAgLTEyNTAsNyArMTI1MCw3IEBACiBvdXQ6CiAJcmV0dXJuIHJjOwogZmFpbDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIVxuIiwgX19mdW5jX18pOwogCWdvdG8gb3V0OwogfQogCkBAIC0xOTE3LDcgKzE5MTcsNyBAQAogCXBfZGV2LT5pby5JT0FkZHJMaW5lcwk9IDU7CiAKIAkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KLQlwX2Rldi0+aXJxLkF0dHJpYnV0ZXMJPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJcF9kZXYtPmlycS5BdHRyaWJ1dGVzCT0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwogCXBfZGV2LT5pcnEuSVJRSW5mbzEJPSBJUlFfTEVWRUxfSUQ7CiAJcF9kZXYtPmlycS5IYW5kbGVyID0gd2wzNTAxX2ludGVycnVwdDsKIApAQCAtMTk3NywxMCArMTk3NywxMCBAQAogCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqOwogCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwOwogCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJaWYgKGkgPT0gMCkKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L01ha2VmaWxlCmluZGV4IGNjMzYxMjYuLjE5MDdlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogb2JqLSQoQ09ORklHX1pEMTIxMVJXKSArPSB6ZDEyMTFydy5vCiAKLXpkMTIxMXJ3LW9ianMgOj0gemRfY2hpcC5vIHpkX2llZWU4MDIxMS5vIHpkX21hYy5vIFwKK3pkMTIxMXJ3LW9ianMgOj0gemRfY2hpcC5vIHpkX21hYy5vIFwKIAkJemRfcmZfYWwyMjMwLm8gemRfcmZfcmYyOTU5Lm8gXAogCQl6ZF9yZl9hbDcyMzBiLm8gemRfcmZfdXcyNDUzLm8gXAogCQl6ZF9yZi5vIHpkX3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKaW5kZXggMGFjYjVjMy4uZTBhYzU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAiemRfZGVmLmgiCiAjaW5jbHVkZSAiemRfY2hpcC5oIgotI2luY2x1ZGUgInpkX2llZWU4MDIxMS5oIgogI2luY2x1ZGUgInpkX21hYy5oIgogI2luY2x1ZGUgInpkX3JmLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGM0MWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogWkQxMjExIFVTQi1XTEFOIGRyaXZlciBmb3IgTGludXgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBVbHJpY2ggS3VuaXR6IDxrdW5lQGRlaW5lLXRhbGVyLmRlPgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLS8qCi0gKiBJbiB0aGUgbG9uZyB0ZXJtLCB3ZSdsbCBwcm9iYWJseSBmaW5kIGEgYmV0dGVyIHdheSBvZiBoYW5kbGluZyByZWd1bGF0b3J5Ci0gKiByZXF1aXJlbWVudHMgb3V0c2lkZSBvZiB0aGUgZHJpdmVyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgInpkX2llZWU4MDIxMS5oIgotI2luY2x1ZGUgInpkX21hYy5oIgotCi1zdHJ1Y3QgY2hhbm5lbF9yYW5nZSB7Ci0JdTggcmVnZG9tYWluOwotCXU4IHN0YXJ0OwotCXU4IGVuZDsgLyogZXhjbHVzaXZlIChjaGFubmVsIG11c3QgYmUgbGVzcyB0aGFuIGVuZCkgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2hhbm5lbF9yYW5nZSBjaGFubmVsX3Jhbmdlc1tdID0gewotCXsgWkRfUkVHRE9NQUlOX0ZDQywJCTEsIDEyIH0sCi0JeyBaRF9SRUdET01BSU5fSUMsCQkxLCAxMiB9LAotCXsgWkRfUkVHRE9NQUlOX0VUU0ksCQkxLCAxNCB9LAotCXsgWkRfUkVHRE9NQUlOX0pBUEFOLAkJMSwgMTQgfSwKLQl7IFpEX1JFR0RPTUFJTl9TUEFJTiwJCTEsIDE0IH0sCi0JeyBaRF9SRUdET01BSU5fRlJBTkNFLAkJMSwgMTQgfSwKLQotCS8qIEphcGFuIG9yaWdpbmFsbHkgb25seSBoYWQgY2hhbm5lbCAxNCBhdmFpbGFibGUgKHNlZSBDSE5MX0lEIDB4NDAgaW4KLQkgKiA4MDIuMTEpLiBIb3dldmVyLCBpbiAyMDAxIHRoZSByYW5nZSB3YXMgZXh0ZW5kZWQgdG8gaW5jbHVkZSBjaGFubmVscwotCSAqIDEtMTMuIFRoZSBaeURBUyBkZXZpY2VzIHN0aWxsIHVzZSB0aGUgb2xkIHJlZ2lvbiBjb2RlIGJ1dCBhcmUKLQkgKiBkZXNpZ25lZCB0byBhbGxvdyB0aGUgZXh0cmEgY2hhbm5lbCBhY2Nlc3MgaW4gSmFwYW4uICovCi0JeyBaRF9SRUdET01BSU5fSkFQQU5fQURELAkxLCAxNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjaGFubmVsX3JhbmdlICp6ZF9jaGFubmVsX3JhbmdlKHU4IHJlZ2RvbWFpbikKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFubmVsX3Jhbmdlcyk7IGkrKykgewotCQljb25zdCBzdHJ1Y3QgY2hhbm5lbF9yYW5nZSAqcmFuZ2UgPSAmY2hhbm5lbF9yYW5nZXNbaV07Ci0JCWlmIChyYW5nZS0+cmVnZG9tYWluID09IHJlZ2RvbWFpbikKLQkJCXJldHVybiByYW5nZTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgQ0hBTl9UT19JRFgoY2hhbikgKChjaGFuKSAtIDEpCi0KLXN0YXRpYyB2b2lkIHVubWFza19iZ19jaGFubmVscyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQljb25zdCBzdHJ1Y3QgY2hhbm5lbF9yYW5nZSAqcmFuZ2UsCi0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQpCi17Ci0JdTggY2hhbm5lbDsKLQotCWZvciAoY2hhbm5lbCA9IHJhbmdlLT5zdGFydDsgY2hhbm5lbCA8IHJhbmdlLT5lbmQ7IGNoYW5uZWwrKykgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPQotCQkJJnNiYW5kLT5jaGFubmVsc1tDSEFOX1RPX0lEWChjaGFubmVsKV07Ci0JCWNoYW4tPmZsYWdzID0gMDsKLQl9Ci19Ci0KLXZvaWQgemRfZ2VvX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHJlZ2RvbWFpbikKLXsKLQlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9od19tYWMoaHcpOwotCWNvbnN0IHN0cnVjdCBjaGFubmVsX3JhbmdlICpyYW5nZTsKLQotCWRldl9kYmcoemRfbWFjX2RldihtYWMpLCAicmVnZG9tYWluICUjMDJ4XG4iLCByZWdkb21haW4pOwotCi0JcmFuZ2UgPSB6ZF9jaGFubmVsX3JhbmdlKHJlZ2RvbWFpbik7Ci0JaWYgKCFyYW5nZSkgewotCQkvKiBUaGUgdmVuZG9yIGRyaXZlciBvdmVycmlkZXMgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIGFuZAotCQkgKiBhbGxvd2VkIGNoYW5uZWwgcmVnaXN0ZXJzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmVzdHJpY3RzCi0JCSAqIGF2YWlsYWJsZSBjaGFubmVscyB0byAxLTExIGV2ZXJ5d2hlcmUuIE1hdGNoIHRoZWlyCi0JCSAqIHF1ZXN0aW9uYWJsZSBiZWhhdmlvdXIgb25seSBmb3IgcmVnZG9tYWlucyB3aGljaCB3ZSBkb24ndAotCQkgKiByZWNvZ25pc2UuICovCi0JCWRldl93YXJuKHpkX21hY19kZXYobWFjKSwgIlVucmVjb2duaXNlZCByZWd1bGF0b3J5IGRvbWFpbjogIgotCQkJIiUjMDJ4LiBEZWZhdWx0aW5nIHRvIEZDQy5cbiIsIHJlZ2RvbWFpbik7Ci0JCXJhbmdlID0gemRfY2hhbm5lbF9yYW5nZShaRF9SRUdET01BSU5fRkNDKTsKLQl9Ci0KLQl1bm1hc2tfYmdfY2hhbm5lbHMoaHcsIHJhbmdlLCAmbWFjLT5iYW5kKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiNzlmMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIFpEMTIxMSBVU0ItV0xBTiBkcml2ZXIgZm9yIExpbnV4Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgVWxyaWNoIEt1bml0eiA8a3VuZUBkZWluZS10YWxlci5kZT4KLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IERhbmllbCBEcmFrZSA8ZHNkQGdlbnRvby5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaWZuZGVmIF9aRF9JRUVFODAyMTFfSAotI2RlZmluZSBfWkRfSUVFRTgwMjExX0gKLQotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0vKiBBZGRpdGlvbmFsIGRlZmluaXRpb25zIGZyb20gdGhlIHN0YW5kYXJkcy4KLSAqLwotCi0jZGVmaW5lIFpEX1JFR0RPTUFJTl9GQ0MJMHgxMAotI2RlZmluZSBaRF9SRUdET01BSU5fSUMJCTB4MjAKLSNkZWZpbmUgWkRfUkVHRE9NQUlOX0VUU0kJMHgzMAotI2RlZmluZSBaRF9SRUdET01BSU5fU1BBSU4JMHgzMQotI2RlZmluZSBaRF9SRUdET01BSU5fRlJBTkNFCTB4MzIKLSNkZWZpbmUgWkRfUkVHRE9NQUlOX0pBUEFOX0FERAkweDQwCi0jZGVmaW5lIFpEX1JFR0RPTUFJTl9KQVBBTgkweDQxCi0KLWVudW0gewotCU1JTl9DSEFOTkVMMjQgPSAxLAotCU1BWF9DSEFOTkVMMjQgPSAxNCwKLX07Ci0KLXZvaWQgemRfZ2VvX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IHJlZ2RvbWFpbik7Ci0KLSNkZWZpbmUgWkRfUExDUF9TRVJWSUNFX0xFTkdUSF9FWFRFTlNJT04gMHg4MAotCi1zdHJ1Y3Qgb2ZkbV9wbGNwX2hlYWRlciB7Ci0JdTggcHJlZml4WzNdOwotCV9fbGUxNiBzZXJ2aWNlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RhdGljIGlubGluZSB1OCB6ZF9vZmRtX3BsY3BfaGVhZGVyX3JhdGUoY29uc3Qgc3RydWN0IG9mZG1fcGxjcF9oZWFkZXIgKmhlYWRlcikKLXsKLQlyZXR1cm4gaGVhZGVyLT5wcmVmaXhbMF0gJiAweGY7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBnaXZlIHRoZSBlbmNvZGluZyBvZiB0aGUgNC1iaXQgcmF0ZSBmaWVsZCBpbiB0aGUKLSAqIE9GRE0gKDgwMi4xMWEvODAyLjExZykgUExDUCBoZWFkZXIuIE5vdGlmeSB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0bwotICogZGVmaW5lIHRoZSB6ZC1yYXRlIHZhbHVlcyBmb3IgT0ZETS4KLSAqCi0gKiBTZWUgdGhlIHN0cnVjdCB6ZF9jdHJsc2V0IGRlZmluaXRpb24gaW4gemRfbWFjLmguCi0gKi8KLSNkZWZpbmUgWkRfT0ZETV9QTENQX1JBVEVfNk0JMHhiCi0jZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzlNCTB4ZgotI2RlZmluZSBaRF9PRkRNX1BMQ1BfUkFURV8xMk0JMHhhCi0jZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzE4TQkweGUKLSNkZWZpbmUgWkRfT0ZETV9QTENQX1JBVEVfMjRNCTB4OQotI2RlZmluZSBaRF9PRkRNX1BMQ1BfUkFURV8zNk0JMHhkCi0jZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzQ4TQkweDgKLSNkZWZpbmUgWkRfT0ZETV9QTENQX1JBVEVfNTRNCTB4YwotCi1zdHJ1Y3QgY2NrX3BsY3BfaGVhZGVyIHsKLQl1OCBzaWduYWw7Ci0JdTggc2VydmljZTsKLQlfX2xlMTYgbGVuZ3RoOwotCV9fbGUxNiBjcmMxNjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdTggemRfY2NrX3BsY3BfaGVhZGVyX3NpZ25hbChjb25zdCBzdHJ1Y3QgY2NrX3BsY3BfaGVhZGVyICpoZWFkZXIpCi17Ci0JcmV0dXJuIGhlYWRlci0+c2lnbmFsOwotfQotCi0vKiBUaGVzZSBkZWZpbmVzIGdpdmUgdGhlIGVuY29kaW5ncyBvZiB0aGUgc2lnbmFsIGZpZWxkIGluIHRoZSA4MDIuMTFiIFBMQ1AKLSAqIGhlYWRlci4gVGhlIHNpZ25hbCBmaWVsZCBnaXZlcyB0aGUgYml0IHJhdGUgb2YgdGhlIGZvbGxvd2luZyBwYWNrZXQuIEV2ZW4KLSAqIGlmIHRlY2huaWNhbGx5IHdyb25nIHdlIHVzZSBDQ0sgaGVyZSBhbHNvIGZvciB0aGUgMSBNQml0L3MgYW5kIDIgTUJpdC9zCi0gKiByYXRlIHRvIHN0YXkgY29uc2lzdGVudCB3aXRoIFp5ZGFzIGFuZCBvdXIgdXNlIG9mIHRoZSB0ZXJtLgotICoKLSAqIE5vdGlmeSB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgKm5vdCogdXNlZCBpbiB0aGUgemQtcmF0ZXMuCi0gKi8KLSNkZWZpbmUgWkRfQ0NLX1BMQ1BfU0lHTkFMXzFNCTB4MGEKLSNkZWZpbmUgWkRfQ0NLX1BMQ1BfU0lHTkFMXzJNCTB4MTQKLSNkZWZpbmUgWkRfQ0NLX1BMQ1BfU0lHTkFMXzVNNQkweDM3Ci0jZGVmaW5lIFpEX0NDS19QTENQX1NJR05BTF8xMU0JMHg2ZQotCi0jZW5kaWYgLyogX1pEX0lFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCmluZGV4IDRkN2I5OGIuLmZlMTg2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgVWxyaWNoIEt1bml0eiA8a3VuZUBkZWluZS10YWxlci5kZT4KICAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IERhbmllbCBEcmFrZSA8ZHNkQGdlbnRvby5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNaWNoYWVsIFd1IDxmbGFtaW5naWNlQHNvdXJtaWxrLm5ldD4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHdpbmxhYi5ydXRnZXJzLmVkdT4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAd2lubGFiLnJ1dGdlcnMuZWR1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjksOSArMjksMjMgQEAKICNpbmNsdWRlICJ6ZF9kZWYuaCIKICNpbmNsdWRlICJ6ZF9jaGlwLmgiCiAjaW5jbHVkZSAiemRfbWFjLmgiCi0jaW5jbHVkZSAiemRfaWVlZTgwMjExLmgiCiAjaW5jbHVkZSAiemRfcmYuaCIKIAorc3RydWN0IHpkX3JlZ19hbHBoYTJfbWFwIHsKKwl1MzIgcmVnOworCWNoYXIgYWxwaGEyWzJdOworfTsKKworc3RhdGljIHN0cnVjdCB6ZF9yZWdfYWxwaGEyX21hcCByZWdfYWxwaGEyX21hcFtdID0geworCXsgWkRfUkVHRE9NQUlOX0ZDQywgIlVTIiB9LAorCXsgWkRfUkVHRE9NQUlOX0lDLCAiQ0EiIH0sCisJeyBaRF9SRUdET01BSU5fRVRTSSwgIkRFIiB9LCAvKiBHZW5lcmljIEVUU0ksIHVzZSBtb3N0IHJlc3RyaWN0aXZlICovCisJeyBaRF9SRUdET01BSU5fSkFQQU4sICJKUCIgfSwKKwl7IFpEX1JFR0RPTUFJTl9KQVBBTl9BREQsICJKUCIgfSwKKwl7IFpEX1JFR0RPTUFJTl9TUEFJTiwgIkVTIiB9LAorCXsgWkRfUkVHRE9NQUlOX0ZSQU5DRSwgIkZSIiB9LAorfTsKKwogLyogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgbW9kdWxhdGlvbiByYXRlcy4gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgemRfcmF0ZXNbXSA9IHsKIAl7IC5iaXRyYXRlID0gMTAsCkBAIC05NSw2ICsxMDksMjEgQEAKIHN0YXRpYyB2b2lkIGhvdXNla2VlcGluZ19lbmFibGUoc3RydWN0IHpkX21hYyAqbWFjKTsKIHN0YXRpYyB2b2lkIGhvdXNla2VlcGluZ19kaXNhYmxlKHN0cnVjdCB6ZF9tYWMgKm1hYyk7CiAKK3N0YXRpYyBpbnQgemRfcmVnMmFscGhhMih1OCByZWdkb21haW4sIGNoYXIgKmFscGhhMikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgemRfcmVnX2FscGhhMl9tYXAgKnJlZ19tYXA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVnX2FscGhhMl9tYXApOyBpKyspIHsKKwkJcmVnX21hcCA9ICZyZWdfYWxwaGEyX21hcFtpXTsKKwkJaWYgKHJlZ2RvbWFpbiA9PSByZWdfbWFwLT5yZWcpIHsKKwkJCWFscGhhMlswXSA9IHJlZ19tYXAtPmFscGhhMlswXTsKKwkJCWFscGhhMlsxXSA9IHJlZ19tYXAtPmFscGhhMlsxXTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCiBpbnQgemRfbWFjX3ByZWluaXRfaHcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJaW50IHI7CkBAIC0xMTUsNiArMTQ0LDcgQEAKIAlpbnQgcjsKIAlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9od19tYWMoaHcpOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gJm1hYy0+Y2hpcDsKKwljaGFyIGFscGhhMlsyXTsKIAl1OCBkZWZhdWx0X3JlZ2RvbWFpbjsKIAogCXIgPSB6ZF9jaGlwX2VuYWJsZV9pbnQoY2hpcCk7CkBAIC0xMzksNyArMTY5LDkgQEAKIAlpZiAocikKIAkJZ290byBkaXNhYmxlX2ludDsKIAotCXpkX2dlb19pbml0KGh3LCBtYWMtPnJlZ2RvbWFpbik7CisJciA9IHpkX3JlZzJhbHBoYTIobWFjLT5yZWdkb21haW4sIGFscGhhMik7CisJaWYgKCFyKQorCQlyZWd1bGF0b3J5X2hpbnQoaHctPndpcGh5LCBhbHBoYTIsIE5VTEwpOwogCiAJciA9IDA7CiBkaXNhYmxlX2ludDoKQEAgLTU3OSw3ICs2MTEsNyBAQAogCiAJcSA9ICZ6ZF9od19tYWMoaHcpLT5hY2tfd2FpdF9xdWV1ZTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOwotCWZvciAoc2tiID0gcS0+bmV4dDsgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKXE7IHNrYiA9IHNrYi0+bmV4dCkgeworCXNrYl9xdWV1ZV93YWxrKHEsIHNrYikgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqdHhfaGRyOwogCiAJCXR4X2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKQEAgLTY4NCwxNSArNzE2LDE1IEBACiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfaHdfbWFjKGh3KTsKIAotCS8qIHVzaW5nIElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQgdG8gaW5kaWNhdGUgbm8gbW9kZSBzZWxlY3RlZCAqLwotCWlmIChtYWMtPnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRCkKKwkvKiB1c2luZyBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCB0byBpbmRpY2F0ZSBubyBtb2RlIHNlbGVjdGVkICovCisJaWYgKG1hYy0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJc3dpdGNoIChjb25mLT50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVDoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJbWFjLT50eXBlID0gY29uZi0+dHlwZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTcwNiw3ICs3MzgsNyBAQAogCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKIHsKIAlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9od19tYWMoaHcpOwotCW1hYy0+dHlwZSA9IElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQ7CisJbWFjLT50eXBlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAJemRfc2V0X2JlYWNvbl9pbnRlcnZhbCgmbWFjLT5jaGlwLCAwKTsKIAl6ZF93cml0ZV9tYWNfYWRkcigmbWFjLT5jaGlwLCBOVUxMKTsKIH0KQEAgLTcyNSw4ICs3NTcsOCBAQAogCWludCBhc3NvY2lhdGVkOwogCWludCByOwogCi0JaWYgKG1hYy0+dHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UIHx8Ci0JICAgIG1hYy0+dHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKG1hYy0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UIHx8CisJICAgIG1hYy0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlhc3NvY2lhdGVkID0gdHJ1ZTsKIAkJaWYgKGNvbmYtPmNoYW5nZWQgJiBJRUVFODAyMTFfSUZDQ19CRUFDT04pIHsKIAkJCXN0cnVjdCBza19idWZmICpiZWFjb24gPSBpZWVlODAyMTFfYmVhY29uX2dldChodywgdmlmKTsKQEAgLTc1Myw3ICs3ODUsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHpkX3Byb2Nlc3NfaW50cihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCB6ZF9wcm9jZXNzX2ludHIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXUxNiBpbnRfc3RhdHVzOwogCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgemRfbWFjLCBwcm9jZXNzX2ludHIpOwpAQCAtOTIzLDcgKzk1NSw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJm1hYy0+bG9jayk7CiAJbWFjLT5odyA9IGh3OwogCi0JbWFjLT50eXBlID0gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDsKKwltYWMtPnR5cGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKIAogCW1lbWNweShtYWMtPmNoYW5uZWxzLCB6ZF9jaGFubmVscywgc2l6ZW9mKHpkX2NoYW5uZWxzKSk7CiAJbWVtY3B5KG1hYy0+cmF0ZXMsIHpkX3JhdGVzLCBzaXplb2YoemRfcmF0ZXMpKTsKQEAgLTkzNyw2ICs5NjksMTEgQEAKIAlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTIHwKIAkJICAgIElFRUU4MDIxMV9IV19TSUdOQUxfREI7CiAKKwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9CisJCUJJVChOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CisJCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisKIAlody0+bWF4X3NpZ25hbCA9IDEwMDsKIAlody0+cXVldWVzID0gMTsKIAlody0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IHpkX2N0cmxzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAppbmRleCAxOGMxZDU2Li40YzA1ZDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAiemRfY2hpcC5oIgotI2luY2x1ZGUgInpkX2llZWU4MDIxMS5oIgogCiBzdHJ1Y3QgemRfY3RybHNldCB7CiAJdTggICAgIG1vZHVsYXRpb247CkBAIC0xODcsNiArMTg2LDcwIEBACiAJdW5zaWduZWQgaW50IHBhc3NfY3RybDoxOwogfTsKIAorI2RlZmluZSBaRF9SRUdET01BSU5fRkNDCTB4MTAKKyNkZWZpbmUgWkRfUkVHRE9NQUlOX0lDCQkweDIwCisjZGVmaW5lIFpEX1JFR0RPTUFJTl9FVFNJCTB4MzAKKyNkZWZpbmUgWkRfUkVHRE9NQUlOX1NQQUlOCTB4MzEKKyNkZWZpbmUgWkRfUkVHRE9NQUlOX0ZSQU5DRQkweDMyCisjZGVmaW5lIFpEX1JFR0RPTUFJTl9KQVBBTl9BREQJMHg0MAorI2RlZmluZSBaRF9SRUdET01BSU5fSkFQQU4JMHg0MQorCitlbnVtIHsKKwlNSU5fQ0hBTk5FTDI0ID0gMSwKKwlNQVhfQ0hBTk5FTDI0ID0gMTQsCit9OworCisjZGVmaW5lIFpEX1BMQ1BfU0VSVklDRV9MRU5HVEhfRVhURU5TSU9OIDB4ODAKKworc3RydWN0IG9mZG1fcGxjcF9oZWFkZXIgeworCXU4IHByZWZpeFszXTsKKwlfX2xlMTYgc2VydmljZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgdTggemRfb2ZkbV9wbGNwX2hlYWRlcl9yYXRlKGNvbnN0IHN0cnVjdCBvZmRtX3BsY3BfaGVhZGVyICpoZWFkZXIpCit7CisJcmV0dXJuIGhlYWRlci0+cHJlZml4WzBdICYgMHhmOworfQorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgZ2l2ZSB0aGUgZW5jb2Rpbmcgb2YgdGhlIDQtYml0IHJhdGUgZmllbGQgaW4gdGhlCisgKiBPRkRNICg4MDIuMTFhLzgwMi4xMWcpIFBMQ1AgaGVhZGVyLiBOb3RpZnkgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8KKyAqIGRlZmluZSB0aGUgemQtcmF0ZSB2YWx1ZXMgZm9yIE9GRE0uCisgKgorICogU2VlIHRoZSBzdHJ1Y3QgemRfY3RybHNldCBkZWZpbml0aW9uIGluIHpkX21hYy5oLgorICovCisjZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzZNCTB4YgorI2RlZmluZSBaRF9PRkRNX1BMQ1BfUkFURV85TQkweGYKKyNkZWZpbmUgWkRfT0ZETV9QTENQX1JBVEVfMTJNCTB4YQorI2RlZmluZSBaRF9PRkRNX1BMQ1BfUkFURV8xOE0JMHhlCisjZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzI0TQkweDkKKyNkZWZpbmUgWkRfT0ZETV9QTENQX1JBVEVfMzZNCTB4ZAorI2RlZmluZSBaRF9PRkRNX1BMQ1BfUkFURV80OE0JMHg4CisjZGVmaW5lIFpEX09GRE1fUExDUF9SQVRFXzU0TQkweGMKKworc3RydWN0IGNja19wbGNwX2hlYWRlciB7CisJdTggc2lnbmFsOworCXU4IHNlcnZpY2U7CisJX19sZTE2IGxlbmd0aDsKKwlfX2xlMTYgY3JjMTY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIHU4IHpkX2Nja19wbGNwX2hlYWRlcl9zaWduYWwoY29uc3Qgc3RydWN0IGNja19wbGNwX2hlYWRlciAqaGVhZGVyKQoreworCXJldHVybiBoZWFkZXItPnNpZ25hbDsKK30KKworLyogVGhlc2UgZGVmaW5lcyBnaXZlIHRoZSBlbmNvZGluZ3Mgb2YgdGhlIHNpZ25hbCBmaWVsZCBpbiB0aGUgODAyLjExYiBQTENQCisgKiBoZWFkZXIuIFRoZSBzaWduYWwgZmllbGQgZ2l2ZXMgdGhlIGJpdCByYXRlIG9mIHRoZSBmb2xsb3dpbmcgcGFja2V0LiBFdmVuCisgKiBpZiB0ZWNobmljYWxseSB3cm9uZyB3ZSB1c2UgQ0NLIGhlcmUgYWxzbyBmb3IgdGhlIDEgTUJpdC9zIGFuZCAyIE1CaXQvcworICogcmF0ZSB0byBzdGF5IGNvbnNpc3RlbnQgd2l0aCBaeWRhcyBhbmQgb3VyIHVzZSBvZiB0aGUgdGVybS4KKyAqCisgKiBOb3RpZnkgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlICpub3QqIHVzZWQgaW4gdGhlIHpkLXJhdGVzLgorICovCisjZGVmaW5lIFpEX0NDS19QTENQX1NJR05BTF8xTQkweDBhCisjZGVmaW5lIFpEX0NDS19QTENQX1NJR05BTF8yTQkweDE0CisjZGVmaW5lIFpEX0NDS19QTENQX1NJR05BTF81TTUJMHgzNworI2RlZmluZSBaRF9DQ0tfUExDUF9TSUdOQUxfMTFNCTB4NmUKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgemRfbWFjICp6ZF9od19tYWMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJcmV0dXJuIGh3LT5wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKaW5kZXggZWM0MTI5My4uNzIwN2JmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlICJ6ZF9kZWYuaCIKICNpbmNsdWRlICJ6ZF9yZi5oIgotI2luY2x1ZGUgInpkX2llZWU4MDIxMS5oIgorI2luY2x1ZGUgInpkX21hYy5oIgogI2luY2x1ZGUgInpkX2NoaXAuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZnNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKaW5kZXggZGE4Yjc0My4uYTYwYWU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDcpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCiAJeyBVU0JfREVWSUNFKDB4MTI5YiwgMHgxNjY2KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAogCXsgVVNCX0RFVklDRSgweDE1N2UsIDB4MzAwYSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwMTA1LCAweDE0NWYpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCiAJLyogWkQxMjExQiAqLwogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MTIxNSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MTU3ZSwgMHgzMDBkKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKaW5kZXggYzc0OWJkYi4uNWM3YTg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShkYXRhKTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAotCWZyYWdzICs9IChvZmZzZXQgKyBsZW4gKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKKwlmcmFncyArPSBESVZfUk9VTkRfVVAob2Zmc2V0ICsgbGVuLCBQQUdFX1NJWkUpOwogCWlmICh1bmxpa2VseShmcmFncyA+IE1BWF9TS0JfRlJBR1MgKyAxKSkgewogCQlwcmludGsoS0VSTl9BTEVSVCAieGVubmV0OiBza2IgcmlkZXMgdGhlIHJvY2tldDogJWQgZnJhZ3NcbiIsCiAJCSAgICAgICBmcmFncyk7CkBAIC0xNzk0LDEwICsxNzk0LDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG5ldGlmX2luaXQodm9pZCkKIHsKLQlpZiAoIWlzX3J1bm5pbmdfb25feGVuKCkpCisJaWYgKCF4ZW5fZG9tYWluKCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGlzX2luaXRpYWxfeGVuZG9tYWluKCkpCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKQogCQlyZXR1cm4gMDsKIAogCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyBYZW4gdmlydHVhbCBldGhlcm5ldCBkcml2ZXIuXG4iKTsKQEAgLTE4MDksNyArMTgwOSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZXRpZl9leGl0KHZvaWQpCiB7Ci0JaWYgKGlzX2luaXRpYWxfeGVuZG9tYWluKCkpCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKQogCQlyZXR1cm47CiAKIAl4ZW5idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldGZyb250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnVidXMvbnVidXMuYyBiL2RyaXZlcnMvbnVidXMvbnVidXMuYwppbmRleCAyZjA0N2U1Li5mNWY3NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL251YnVzL251YnVzLmMKKysrIGIvZHJpdmVycy9udWJ1cy9udWJ1cy5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIAl7CiAJCXdoaWxlKG5vdF91c2VmdWwocCxtYXApKQogCQkJcCsrOwotCQkJcCsrOworCQlwKys7CiAJCWxlbi0tOwogCX0KIAkqcHRyID0gcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggYWQ4YWMxYS4uN2M3OWU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCWNoYXIgKm1vZGFsaWFzOwogfTsKIHN0YXRpYyBzdHJ1Y3Qgb2ZfbW9kYWxpYXNfdGFibGUgb2ZfbW9kYWxpYXNfdGFibGVbXSA9IHsKLQkvKiBFbXB0eSBmb3Igbm93OyBhZGQgZW50cmllcyBhcyBuZWVkZWQgKi8KKwl7ICJmc2wsbWN1LW1wYzgzNDllbWl0eCIsICJtY3UtbXBjODM0OWVtaXR4IiB9LAogfTsKIAogLyoqCkBAIC00MjAsMTMgKzQyMCwxMiBAQAogICogQGxlbjoJTGVuZ3RoIG9mIG1vZGFsaWFzIHZhbHVlCiAgKgogICogQmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBjb21wYXRpYmxlIHByb3BlcnR5LCB0aGlzIHJvdXRpbmUgd2lsbCBkZXRlcm1pbmUKLSAqIGFuIGFwcHJvcHJpYXRlIG1vZGFsaWFzIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgZGV2aWNlIHRyZWUgbm9kZS4gIFRocmVlCi0gKiBzZXBhcmF0ZSBtZXRob2RzIGFyZSB1c2VkIHRvIGRlcml2ZSBhIG1vZGFsaWFzIHZhbHVlLgorICogYW4gYXBwcm9wcmlhdGUgbW9kYWxpYXMgdmFsdWUgZm9yIGEgcGFydGljdWxhciBkZXZpY2UgdHJlZSBub2RlLiAgVHdvCisgKiBzZXBhcmF0ZSBtZXRob2RzIGFyZSBhdHRlbXB0ZWQgdG8gZGVyaXZlIGEgbW9kYWxpYXMgdmFsdWUuCiAgKgogICogRmlyc3QgbWV0aG9kIGlzIHRvIGxvb2t1cCB0aGUgY29tcGF0aWJsZSB2YWx1ZSBpbiBvZl9tb2RhbGlhc190YWJsZS4KLSAqIFNlY29uZCBpcyB0byBsb29rIGZvciBhICJsaW51eCw8bW9kYWxpYXM+IiBlbnRyeSBpbiB0aGUgY29tcGF0aWJsZSBsaXN0Ci0gKiBhbmQgdXNlZCB0aGF0IGZvciBtb2RhbGlhcy4gIFRoaXJkIGlzIHRvIHN0cmlwIG9mZiB0aGUgbWFudWZhY3R1cmVyCi0gKiBwcmVmaXggZnJvbSB0aGUgZmlyc3QgY29tcGF0aWJsZSBlbnRyeSBhbmQgdXNlIHRoZSByZW1haW5kZXIgYXMgbW9kYWxpYXMKKyAqIFNlY29uZCBpcyB0byBzdHJpcCBvZmYgdGhlIG1hbnVmYWN0dXJlciBwcmVmaXggZnJvbSB0aGUgZmlyc3QKKyAqIGNvbXBhdGlibGUgZW50cnkgYW5kIHVzZSB0aGUgcmVtYWluZGVyIGFzIG1vZGFsaWFzCiAgKgogICogVGhpcyByb3V0aW5lIHJldHVybnMgMCBvbiBzdWNjZXNzCiAgKi8KQEAgLTQ0OSwyMSArNDQ4LDcgQEAKIAlpZiAoIWNvbXBhdGlibGUpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogMi4gc2VhcmNoIGZvciBsaW51eCw8bW9kYWxpYXM+IGVudHJ5ICovCi0JcCA9IGNvbXBhdGlibGU7Ci0Jd2hpbGUgKGNwbGVuID4gMCkgewotCQlpZiAoIXN0cm5jbXAocCwgImxpbnV4LCIsIDYpKSB7Ci0JCQlwICs9IDY7Ci0JCQlzdHJsY3B5KG1vZGFsaWFzLCBwLCBsZW4pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpID0gc3RybGVuKHApICsgMTsKLQkJcCArPSBpOwotCQljcGxlbiAtPSBpOwotCX0KLQotCS8qIDMuIHRha2UgZmlyc3QgY29tcGF0aWJsZSBlbnRyeSBhbmQgc3RyaXAgbWFudWZhY3R1cmVyICovCisJLyogMi4gdGFrZSBmaXJzdCBjb21wYXRpYmxlIGVudHJ5IGFuZCBzdHJpcCBtYW51ZmFjdHVyZXIgKi8KIAlwID0gc3RyY2hyKGNvbXBhdGlibGUsICcsJyk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ3MywzICs0NTgsMTEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9tb2RhbGlhc19ub2RlKTsKIAorLyoqCisgKiBvZl9wYXJzZV9waGFuZGxlc193aXRoX2FyZ3MgLSBGaW5kIGEgbm9kZSBwb2ludGVkIGJ5IHBoYW5kbGUgaW4gYSBsaXN0CisgKiBAbnA6CQlwb2ludGVyIHRvIGEgZGV2aWNlIHRyZWUgbm9kZSBjb250YWluaW5nIGEgbGlzdAorICogQGxpc3RfbmFtZToJcHJvcGVydHkgbmFtZSB0aGF0IGNvbnRhaW5zIGEgbGlzdAorICogQGNlbGxzX25hbWU6CXByb3BlcnR5IG5hbWUgdGhhdCBzcGVjaWZpZXMgcGhhbmRsZXMnIGFyZ3VtZW50cyBjb3VudAorICogQGluZGV4OglpbmRleCBvZiBhIHBoYW5kbGUgdG8gcGFyc2Ugb3V0CisgKiBAb3V0X25vZGU6CXBvaW50ZXIgdG8gZGV2aWNlX25vZGUgc3RydWN0IHBvaW50ZXIgKHdpbGwgYmUgZmlsbGVkKQorICogQG91dF9hcmdzOglwb2ludGVyIHRvIGFyZ3VtZW50cyBwb2ludGVyICh3aWxsIGJlIGZpbGxlZCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0byBwYXJzZSBsaXN0cyBvZiBwaGFuZGxlcyBhbmQgdGhlaXIgYXJndW1lbnRzLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGZpbGxzIG91dF9ub2RlIGFuZCBvdXRfYXJncywgb24gZXJyb3IgcmV0dXJucworICogYXBwcm9wcmlhdGUgZXJybm8gdmFsdWUuCisgKgorICogRXhhbXBsZToKKyAqCisgKiBwaGFuZGxlMTogbm9kZTEgeworICogCSNsaXN0LWNlbGxzID0gPDI+OworICogfQorICoKKyAqIHBoYW5kbGUyOiBub2RlMiB7CisgKiAJI2xpc3QtY2VsbHMgPSA8MT47CisgKiB9CisgKgorICogbm9kZTMgeworICogCWxpc3QgPSA8JnBoYW5kbGUxIDEgMiAmcGhhbmRsZTIgMz47CisgKiB9CisgKgorICogVG8gZ2V0IGEgZGV2aWNlX25vZGUgb2YgdGhlIGBub2RlMicgbm9kZSB5b3UgbWF5IGNhbGwgdGhpczoKKyAqIG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyhub2RlMywgImxpc3QiLCAiI2xpc3QtY2VsbHMiLCAyLCAmbm9kZTIsICZhcmdzKTsKKyAqLworaW50IG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpsaXN0X25hbWUsCisJCQkJY29uc3QgY2hhciAqY2VsbHNfbmFtZSwgaW50IGluZGV4LAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm91dF9ub2RlLAorCQkJCWNvbnN0IHZvaWQgKipvdXRfYXJncykKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwljb25zdCB1MzIgKmxpc3Q7CisJY29uc3QgdTMyICpsaXN0X2VuZDsKKwlpbnQgc2l6ZTsKKwlpbnQgY3VyX2luZGV4ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBOVUxMOworCWNvbnN0IHZvaWQgKmFyZ3M7CisKKwlsaXN0ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBsaXN0X25hbWUsICZzaXplKTsKKwlpZiAoIWxpc3QpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnIwOworCX0KKwlsaXN0X2VuZCA9IGxpc3QgKyBzaXplIC8gc2l6ZW9mKCpsaXN0KTsKKworCXdoaWxlIChsaXN0IDwgbGlzdF9lbmQpIHsKKwkJY29uc3QgdTMyICpjZWxsczsKKwkJY29uc3QgcGhhbmRsZSAqcGhhbmRsZTsKKworCQlwaGFuZGxlID0gbGlzdDsKKwkJYXJncyA9IGxpc3QgKyAxOworCisJCS8qIG9uZSBjZWxsIGhvbGUgaW4gdGhlIGxpc3QgPSA8PjsgKi8KKwkJaWYgKCEqcGhhbmRsZSkgeworCQkJbGlzdCsrOworCQkJZ290byBuZXh0OworCQl9CisKKwkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaGFuZGxlKTsKKwkJaWYgKCFub2RlKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGNvdWxkIG5vdCBmaW5kIHBoYW5kbGVcbiIsCisJCQkJIG5wLT5mdWxsX25hbWUpOworCQkJZ290byBlcnIwOworCQl9CisKKwkJY2VsbHMgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgY2VsbHNfbmFtZSwgJnNpemUpOworCQlpZiAoIWNlbGxzIHx8IHNpemUgIT0gc2l6ZW9mKCpjZWxscykpIHsKKwkJCXByX2RlYnVnKCIlczogY291bGQgbm90IGdldCAlcyBmb3IgJXNcbiIsCisJCQkJIG5wLT5mdWxsX25hbWUsIGNlbGxzX25hbWUsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCQlnb3RvIGVycjE7CisJCX0KKworCQkvKiBOZXh0IHBoYW5kbGUgaXMgYXQgb2Zmc2V0IG9mIG9uZSBwaGFuZGxlIGNlbGwgKyAjY2VsbHMgKi8KKwkJbGlzdCArPSAxICsgKmNlbGxzOworCQlpZiAobGlzdCA+IGxpc3RfZW5kKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGluc3VmZmljaWVudCBhcmd1bWVudHMgbGVuZ3RoXG4iLAorCQkJCSBucC0+ZnVsbF9uYW1lKTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorbmV4dDoKKwkJaWYgKGN1cl9pbmRleCA9PSBpbmRleCkKKwkJCWJyZWFrOworCisJCW9mX25vZGVfcHV0KG5vZGUpOworCQlub2RlID0gTlVMTDsKKwkJY3VyX2luZGV4Kys7CisJfQorCisJaWYgKCFub2RlKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMDsKKwl9CisKKwkqb3V0X25vZGUgPSBub2RlOworCSpvdXRfYXJncyA9IGFyZ3M7CisKKwlyZXR1cm4gMDsKK2VycjE6CisJb2Zfbm9kZV9wdXQobm9kZSk7CitlcnIwOgorCXByX2RlYnVnKCIlcyBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2dwaW8uYyBiL2RyaXZlcnMvb2YvZ3Bpby5jCmluZGV4IDFjOWNhYjguLjdjZDczMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZ3Bpby5jCisrKyBiL2RyaXZlcnMvb2YvZ3Bpby5jCkBAIC0yOCw3OCArMjgsMzUgQEAKICAqLwogaW50IG9mX2dldF9ncGlvKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKIHsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQgcmV0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ2M7CiAJc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2MgPSBOVUxMOwogCWludCBzaXplOwotCWNvbnN0IHUzMiAqZ3Bpb3M7Ci0JdTMyIG5yX2NlbGxzOwotCWludCBpOwogCWNvbnN0IHZvaWQgKmdwaW9fc3BlYzsKIAljb25zdCB1MzIgKmdwaW9fY2VsbHM7Ci0JaW50IGdwaW9faW5kZXggPSAwOwogCi0JZ3Bpb3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJncGlvcyIsICZzaXplKTsKLQlpZiAoIWdwaW9zKSB7Ci0JCXJldCA9IC1FTk9FTlQ7CisJcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZXNfd2l0aF9hcmdzKG5wLCAiZ3Bpb3MiLCAiI2dwaW8tY2VsbHMiLCBpbmRleCwKKwkJCQkJICAmZ2MsICZncGlvX3NwZWMpOworCWlmIChyZXQpIHsKKwkJcHJfZGVidWcoIiVzOiBjYW4ndCBwYXJzZSBncGlvcyBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycjA7CiAJfQotCW5yX2NlbGxzID0gc2l6ZSAvIHNpemVvZih1MzIpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2NlbGxzOyBncGlvX2luZGV4KyspIHsKLQkJY29uc3QgcGhhbmRsZSAqZ3Bpb19waGFuZGxlOwotCi0JCWdwaW9fcGhhbmRsZSA9IGdwaW9zICsgaTsKLQkJZ3Bpb19zcGVjID0gZ3Bpb19waGFuZGxlICsgMTsKLQotCQkvKiBvbmUgY2VsbCBob2xlIGluIHRoZSBncGlvcyA9IDw+OyAqLwotCQlpZiAoISpncGlvX3BoYW5kbGUpIHsKLQkJCWlmIChncGlvX2luZGV4ID09IGluZGV4KQotCQkJCXJldHVybiAtRU5PRU5UOwotCQkJaSsrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlnYyA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpncGlvX3BoYW5kbGUpOwotCQlpZiAoIWdjKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNvdWxkIG5vdCBmaW5kIHBoYW5kbGUgZm9yIGdwaW9zXG4iLAotCQkJCSBucC0+ZnVsbF9uYW1lKTsKLQkJCWdvdG8gZXJyMDsKLQkJfQotCi0JCW9mX2djID0gZ2MtPmRhdGE7Ci0JCWlmICghb2ZfZ2MpIHsKLQkJCXByX2RlYnVnKCIlczogZ3BpbyBjb250cm9sbGVyICVzIGlzbid0IHJlZ2lzdGVyZWRcbiIsCi0JCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOwotCQkJZ290byBlcnIxOwotCQl9Ci0KLQkJZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShnYywgIiNncGlvLWNlbGxzIiwgJnNpemUpOwotCQlpZiAoIWdwaW9fY2VsbHMgfHwgc2l6ZSAhPSBzaXplb2YoKmdwaW9fY2VsbHMpIHx8Ci0JCQkJKmdwaW9fY2VsbHMgIT0gb2ZfZ2MtPmdwaW9fY2VsbHMpIHsKLQkJCXByX2RlYnVnKCIlczogd3JvbmcgI2dwaW8tY2VsbHMgZm9yICVzXG4iLAotCQkJCSBucC0+ZnVsbF9uYW1lLCBnYy0+ZnVsbF9uYW1lKTsKLQkJCWdvdG8gZXJyMTsKLQkJfQotCi0JCS8qIE5leHQgcGhhbmRsZSBpcyBhdCBwaGFuZGxlIGNlbGxzICsgI2dwaW8tY2VsbHMgKi8KLQkJaSArPSBzaXplb2YoKmdwaW9fcGhhbmRsZSkgLyBzaXplb2YodTMyKSArICpncGlvX2NlbGxzOwotCQlpZiAoaSA+PSBucl9jZWxscyArIDEpIHsKLQkJCXByX2RlYnVnKCIlczogaW5zdWZmaWNpZW50IGdwaW8tc3BlYyBsZW5ndGhcbiIsCi0JCQkJIG5wLT5mdWxsX25hbWUpOwotCQkJZ290byBlcnIxOwotCQl9Ci0KLQkJaWYgKGdwaW9faW5kZXggPT0gaW5kZXgpCi0JCQlicmVhazsKLQotCQlvZl9nYyA9IE5VTEw7Ci0JCW9mX25vZGVfcHV0KGdjKTsKLQl9Ci0KKwlvZl9nYyA9IGdjLT5kYXRhOwogCWlmICghb2ZfZ2MpIHsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBlcnIwOworCQlwcl9kZWJ1ZygiJXM6IGdwaW8gY29udHJvbGxlciAlcyBpc24ndCByZWdpc3RlcmVkXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShnYywgIiNncGlvLWNlbGxzIiwgJnNpemUpOworCWlmICghZ3Bpb19jZWxscyB8fCBzaXplICE9IHNpemVvZigqZ3Bpb19jZWxscykgfHwKKwkJCSpncGlvX2NlbGxzICE9IG9mX2djLT5ncGlvX2NlbGxzKSB7CisJCXByX2RlYnVnKCIlczogd3JvbmcgI2dwaW8tY2VsbHMgZm9yICVzXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjE7CiAJfQogCiAJcmV0ID0gb2ZfZ2MtPnhsYXRlKG9mX2djLCBucCwgZ3Bpb19zcGVjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwppbmRleCA5MzA0YzQ1Li5lZDk4MjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCkBAIC01LDYgKzUsNyBAQAogICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKICAqCiAgKiBAYXV0aG9yIEpvaG4gTGV2b24gPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPgorICogQGF1dGhvciBCYXJyeSBLYXNpbmRvcmYKICAqCiAgKiBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBidWZmZXIgbWFuYWdlbWVudC4gRWFjaAogICogQ1BVIGJ1ZmZlciBpcyBwcm9jZXNzZWQgYW5kIGVudGVyZWQgaW50byB0aGUKQEAgLTMzLDcgKzM0LDcgQEAKICNpbmNsdWRlICJldmVudF9idWZmZXIuaCIKICNpbmNsdWRlICJjcHVfYnVmZmVyLmgiCiAjaW5jbHVkZSAiYnVmZmVyX3N5bmMuaCIKLSAKKwogc3RhdGljIExJU1RfSEVBRChkeWluZ190YXNrcyk7CiBzdGF0aWMgTElTVF9IRUFEKGRlYWRfdGFza3MpOwogc3RhdGljIGNwdW1hc2tfdCBtYXJrZWRfY3B1cyA9IENQVV9NQVNLX05PTkU7CkBAIC00OCwxMCArNDksMTEgQEAKICAqIENhbiBiZSBpbnZva2VkIGZyb20gc29mdGlycSB2aWEgUkNVIGNhbGxiYWNrIGR1ZSB0bwogICogY2FsbF9yY3UoKSBvZiB0aGUgdGFzayBzdHJ1Y3QsIGhlbmNlIHRoZSBfaXJxc2F2ZS4KICAqLwotc3RhdGljIGludCB0YXNrX2ZyZWVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqIHNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICogZGF0YSkKK3N0YXRpYyBpbnQKK3Rhc2tfZnJlZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHRhc2sgPSBkYXRhOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGRhdGE7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2tfbW9ydHVhcnksIGZsYWdzKTsKIAlsaXN0X2FkZCgmdGFzay0+dGFza3MsICZkeWluZ190YXNrcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFza19tb3J0dWFyeSwgZmxhZ3MpOwpAQCAtNjIsMTMgKzY0LDE0IEBACiAvKiBUaGUgdGFzayBpcyBvbiBpdHMgd2F5IG91dC4gQSBzeW5jIG9mIHRoZSBidWZmZXIgbWVhbnMgd2UgY2FuIGNhdGNoCiAgKiBhbnkgcmVtYWluaW5nIHNhbXBsZXMgZm9yIHRoaXMgdGFzay4KICAqLwotc3RhdGljIGludCB0YXNrX2V4aXRfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqIHNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICogZGF0YSkKK3N0YXRpYyBpbnQKK3Rhc2tfZXhpdF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAkvKiBUbyBhdm9pZCBsYXRlbmN5IHByb2JsZW1zLCB3ZSBvbmx5IHByb2Nlc3MgdGhlIGN1cnJlbnQgQ1BVLAogCSAqIGhvcGluZyB0aGF0IG1vc3Qgc2FtcGxlcyBmb3IgdGhlIHRhc2sgYXJlIG9uIHRoaXMgQ1BVCiAJICovCiAJc3luY19idWZmZXIocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0gIAlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC03NywxMSArODAsMTIgQEAKICAqIHdlIGRvbid0IGxvc2UgYW55LiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgZXhhY3QsIGl0J3MgYSBRb0kgaXNzdWUKICAqIG9ubHkuCiAgKi8KLXN0YXRpYyBpbnQgbXVubWFwX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiBzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqIGRhdGEpCitzdGF0aWMgaW50CittdW5tYXBfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICogbW0gPSBjdXJyZW50LT5tbTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBtcG50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptcG50OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCkBAIC05OSwxMSArMTAzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLSAKKwogLyogV2UgbmVlZCB0byBiZSB0b2xkIGFib3V0IG5ldyBtb2R1bGVzIHNvIHdlIGRvbid0IGF0dHJpYnV0ZSB0byBhIHByZXZpb3VzbHkKICAqIGxvYWRlZCBtb2R1bGUsIG9yIGRyb3AgdGhlIHNhbXBsZXMgb24gdGhlIGZsb29yLgogICovCi1zdGF0aWMgaW50IG1vZHVsZV9sb2FkX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiBzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqIGRhdGEpCitzdGF0aWMgaW50Cittb2R1bGVfbG9hZF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKICNpZmRlZiBDT05GSUdfTU9EVUxFUwogCWlmICh2YWwgIT0gTU9EVUxFX1NUQVRFX0NPTUlORykKQEAgLTExOCw3ICsxMjMsNyBAQAogCXJldHVybiAwOwogfQogCi0gCisKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGFza19mcmVlX25iID0gewogCS5ub3RpZmllcl9jYWxsCT0gdGFza19mcmVlX25vdGlmeSwKIH07CkBAIC0xMzUsNyArMTQwLDcgQEAKIAkubm90aWZpZXJfY2FsbCA9IG1vZHVsZV9sb2FkX25vdGlmeSwKIH07CiAKLSAKKwogc3RhdGljIHZvaWQgZW5kX3N5bmModm9pZCkKIHsKIAllbmRfY3B1X3dvcmsoKTsKQEAgLTIwOCwxNCArMjEzLDE0IEBACiAgKiBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dCBhbGxvd3Mgb3Byb2ZpbGUgdG8gYXNzb2NpYXRlCiAgKiBzaGFyZWQtbGlicmFyeSBzYW1wbGVzIHdpdGggcGFydGljdWxhciBhcHBsaWNhdGlvbnMKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2V4ZWNfZGNvb2tpZShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZXhlY19kY29va2llKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXVuc2lnbmVkIGxvbmcgY29va2llID0gTk9fQ09PS0lFOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLSAKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwogCWlmICghbW0pCiAJCWdvdG8gb3V0OwotIAorCiAJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKIAkJaWYgKCF2bWEtPnZtX2ZpbGUpCiAJCQljb250aW51ZTsKQEAgLTIzNSwxMyArMjQwLDE0IEBACiAgKiBzdXJlIHRvIGRvIHRoaXMgbG9va3VwIGJlZm9yZSBhIG1tLT5tbWFwIG1vZGlmaWNhdGlvbiBoYXBwZW5zIHNvCiAgKiB3ZSBkb24ndCBsb3NlIHRyYWNrLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb29rdXBfZGNvb2tpZShzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgb2ZmX3QgKiBvZmZzZXQpCitzdGF0aWMgdW5zaWduZWQgbG9uZworbG9va3VwX2Rjb29raWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgb2ZmX3QgKm9mZnNldCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvb2tpZSA9IE5PX0NPT0tJRTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAlmb3IgKHZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKLSAKKwogCQlpZiAoYWRkciA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkciA+PSB2bWEtPnZtX2VuZCkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNjMsOSArMjY5LDIwIEBACiAJcmV0dXJuIGNvb2tpZTsKIH0KIAorc3RhdGljIHZvaWQgaW5jcmVtZW50X3RhaWwoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIpCit7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbCA9IGItPnRhaWxfcG9zICsgMTsKKworCXJtYigpOwkvKiBiZSBzdXJlIGZpZm8gcG9pbnRlcnMgYXJlIHN5bmNocm9taXplZCAqLworCisJaWYgKG5ld190YWlsIDwgYi0+YnVmZmVyX3NpemUpCisJCWItPnRhaWxfcG9zID0gbmV3X3RhaWw7CisJZWxzZQorCQliLT50YWlsX3BvcyA9IDA7Cit9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfY29va2llID0gSU5WQUxJRF9DT09LSUU7Ci0gCisKIHN0YXRpYyB2b2lkIGFkZF9jcHVfc3dpdGNoKGludCBpKQogewogCWFkZF9ldmVudF9lbnRyeShFU0NBUEVfQ09ERSk7CkBAIC0yNzgsMTYgKzI5NSwxNiBAQAogewogCWFkZF9ldmVudF9lbnRyeShFU0NBUEVfQ09ERSk7CiAJaWYgKGluX2tlcm5lbCkKLQkJYWRkX2V2ZW50X2VudHJ5KEtFUk5FTF9FTlRFUl9TV0lUQ0hfQ09ERSk7IAorCQlhZGRfZXZlbnRfZW50cnkoS0VSTkVMX0VOVEVSX1NXSVRDSF9DT0RFKTsKIAllbHNlCi0JCWFkZF9ldmVudF9lbnRyeShLRVJORUxfRVhJVF9TV0lUQ0hfQ09ERSk7IAorCQlhZGRfZXZlbnRfZW50cnkoS0VSTkVMX0VYSVRfU1dJVENIX0NPREUpOwogfQotIAorCiBzdGF0aWMgdm9pZAotYWRkX3VzZXJfY3R4X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgY29uc3QgKiB0YXNrLCB1bnNpZ25lZCBsb25nIGNvb2tpZSkKK2FkZF91c2VyX2N0eF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0IGNvbnN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIGNvb2tpZSkKIHsKIAlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOwotCWFkZF9ldmVudF9lbnRyeShDVFhfU1dJVENIX0NPREUpOyAKKwlhZGRfZXZlbnRfZW50cnkoQ1RYX1NXSVRDSF9DT0RFKTsKIAlhZGRfZXZlbnRfZW50cnkodGFzay0+cGlkKTsKIAlhZGRfZXZlbnRfZW50cnkoY29va2llKTsKIAkvKiBBbm90aGVyIGNvZGUgZm9yIGRhZW1vbiBiYWNrLWNvbXBhdCAqLwpAQCAtMjk2LDcgKzMxMyw3IEBACiAJYWRkX2V2ZW50X2VudHJ5KHRhc2stPnRnaWQpOwogfQogCi0gCisKIHN0YXRpYyB2b2lkIGFkZF9jb29raWVfc3dpdGNoKHVuc2lnbmVkIGxvbmcgY29va2llKQogewogCWFkZF9ldmVudF9lbnRyeShFU0NBUEVfQ09ERSk7CkBAIC0zMDQsMTMgKzMyMSw3OCBAQAogCWFkZF9ldmVudF9lbnRyeShjb29raWUpOwogfQogCi0gCisKIHN0YXRpYyB2b2lkIGFkZF90cmFjZV9iZWdpbih2b2lkKQogewogCWFkZF9ldmVudF9lbnRyeShFU0NBUEVfQ09ERSk7CiAJYWRkX2V2ZW50X2VudHJ5KFRSQUNFX0JFR0lOX0NPREUpOwogfQogCisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUworCisjZGVmaW5lIElCU19GRVRDSF9DT0RFX1NJWkUJMgorI2RlZmluZSBJQlNfT1BfQ09ERV9TSVpFCTUKKyNkZWZpbmUgSUJTX0VJUChvZmZzZXQpCQkJCVwKKwkoKChzdHJ1Y3Qgb3Bfc2FtcGxlICopJmNwdV9idWYtPmJ1ZmZlclsob2Zmc2V0KV0pLT5laXApCisjZGVmaW5lIElCU19FVkVOVChvZmZzZXQpCQkJCVwKKwkoKChzdHJ1Y3Qgb3Bfc2FtcGxlICopJmNwdV9idWYtPmJ1ZmZlclsob2Zmc2V0KV0pLT5ldmVudCkKKworLyoKKyAqIEFkZCBJQlMgZmV0Y2ggYW5kIG9wIGVudHJpZXMgdG8gZXZlbnQgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9pYnNfYmVnaW4oc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYsIGludCBjb2RlLAorCWludCBpbl9rZXJuZWwsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgcmlwOworCWludCBpLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGlic19jb29raWUgPSAwOworCW9mZl90IG9mZnNldDsKKworCWluY3JlbWVudF90YWlsKGNwdV9idWYpOwkvKiBtb3ZlIHRvIFJJUCBlbnRyeSAqLworCisJcmlwID0gSUJTX0VJUChjcHVfYnVmLT50YWlsX3Bvcyk7CisKKyNpZmRlZiBfX0xQNjRfXworCXJpcCArPSBJQlNfRVZFTlQoY3B1X2J1Zi0+dGFpbF9wb3MpIDw8IDMyOworI2VuZGlmCisKKwlpZiAobW0pIHsKKwkJaWJzX2Nvb2tpZSA9IGxvb2t1cF9kY29va2llKG1tLCByaXAsICZvZmZzZXQpOworCisJCWlmIChpYnNfY29va2llID09IE5PX0NPT0tJRSkKKwkJCW9mZnNldCA9IHJpcDsKKwkJaWYgKGlic19jb29raWUgPT0gSU5WQUxJRF9DT09LSUUpIHsKKwkJCWF0b21pY19pbmMoJm9wcm9maWxlX3N0YXRzLnNhbXBsZV9sb3N0X25vX21hcHBpbmcpOworCQkJb2Zmc2V0ID0gcmlwOworCQl9CisJCWlmIChpYnNfY29va2llICE9IGxhc3RfY29va2llKSB7CisJCQlhZGRfY29va2llX3N3aXRjaChpYnNfY29va2llKTsKKwkJCWxhc3RfY29va2llID0gaWJzX2Nvb2tpZTsKKwkJfQorCX0gZWxzZQorCQlvZmZzZXQgPSByaXA7CisKKwlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOworCWFkZF9ldmVudF9lbnRyeShjb2RlKTsKKwlhZGRfZXZlbnRfZW50cnkob2Zmc2V0KTsJLyogT2Zmc2V0IGZyb20gRGNvb2tpZSAqLworCisJLyogd2Ugc2VuZCB0aGUgRGNvb2tpZSBvZmZzZXQsIGJ1dCBzZW5kIHRoZSByYXcgTGluZWFyIEFkZCBhbHNvKi8KKwlhZGRfZXZlbnRfZW50cnkoSUJTX0VJUChjcHVfYnVmLT50YWlsX3BvcykpOworCWFkZF9ldmVudF9lbnRyeShJQlNfRVZFTlQoY3B1X2J1Zi0+dGFpbF9wb3MpKTsKKworCWlmIChjb2RlID09IElCU19GRVRDSF9DT0RFKQorCQljb3VudCA9IElCU19GRVRDSF9DT0RFX1NJWkU7CS8qSUJTIEZFVENIIGlzIDIgaW50NjRzKi8KKwllbHNlCisJCWNvdW50ID0gSUJTX09QX0NPREVfU0laRTsJLypJQlMgT1AgaXMgNSBpbnQ2NHMqLworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaW5jcmVtZW50X3RhaWwoY3B1X2J1Zik7CisJCWFkZF9ldmVudF9lbnRyeShJQlNfRUlQKGNwdV9idWYtPnRhaWxfcG9zKSk7CisJCWFkZF9ldmVudF9lbnRyeShJQlNfRVZFTlQoY3B1X2J1Zi0+dGFpbF9wb3MpKTsKKwl9Cit9CisKKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBhZGRfc2FtcGxlX2VudHJ5KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGV2ZW50KQogewpAQCAtMzE5LDEzICs0MDEsMTMgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFkZF91c19zYW1wbGUoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3Qgb3Bfc2FtcGxlICogcykKK3N0YXRpYyBpbnQgYWRkX3VzX3NhbXBsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IG9wX3NhbXBsZSAqcykKIHsKIAl1bnNpZ25lZCBsb25nIGNvb2tpZTsKIAlvZmZfdCBvZmZzZXQ7Ci0gCi0gCWNvb2tpZSA9IGxvb2t1cF9kY29va2llKG1tLCBzLT5laXAsICZvZmZzZXQpOwotIAorCisJY29va2llID0gbG9va3VwX2Rjb29raWUobW0sIHMtPmVpcCwgJm9mZnNldCk7CisKIAlpZiAoY29va2llID09IElOVkFMSURfQ09PS0lFKSB7CiAJCWF0b21pY19pbmMoJm9wcm9maWxlX3N0YXRzLnNhbXBsZV9sb3N0X25vX21hcHBpbmcpOwogCQlyZXR1cm4gMDsKQEAgLTM0MSwxMyArNDIzLDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKLSAKKwogLyogQWRkIGEgc2FtcGxlIHRvIHRoZSBnbG9iYWwgZXZlbnQgYnVmZmVyLiBJZiBwb3NzaWJsZSB0aGUKICAqIHNhbXBsZSBpcyBjb252ZXJ0ZWQgaW50byBhIHBlcnNpc3RlbnQgZGVudHJ5L29mZnNldCBwYWlyCiAgKiBmb3IgbGF0ZXIgbG9va3VwIGZyb20gdXNlcnNwYWNlLgogICovCiBzdGF0aWMgaW50Ci1hZGRfc2FtcGxlKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSwgc3RydWN0IG9wX3NhbXBsZSAqIHMsIGludCBpbl9rZXJuZWwpCithZGRfc2FtcGxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgb3Bfc2FtcGxlICpzLCBpbnQgaW5fa2VybmVsKQogewogCWlmIChpbl9rZXJuZWwpIHsKIAkJYWRkX3NhbXBsZV9lbnRyeShzLT5laXAsIHMtPmV2ZW50KTsKQEAgLTM1OSw5ICs0NDEsOSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLSAKIAotc3RhdGljIHZvaWQgcmVsZWFzZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJaWYgKCFtbSkKIAkJcmV0dXJuOwpAQCAtMzcwLDkgKzQ1Miw5IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBtbV9zdHJ1Y3QgKiB0YWtlX3Rhc2tzX21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRhc2spCitzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqdGFrZV90YXNrc19tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKIAlpZiAobW0pCiAJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gbW07CkBAIC0zODMsMTAgKzQ2NSwxMCBAQAogewogCXJldHVybiB2YWwgPT0gRVNDQVBFX0NPREU7CiB9Ci0gCisKIAogLyogImFjcXVpcmUiIGFzIG1hbnkgY3B1IGJ1ZmZlciBzbG90cyBhcyB3ZSBjYW4gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9zbG90cyhzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqIGIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2xvdHMoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIpCiB7CiAJdW5zaWduZWQgbG9uZyBoZWFkID0gYi0+aGVhZF9wb3M7CiAJdW5zaWduZWQgbG9uZyB0YWlsID0gYi0+dGFpbF9wb3M7CkBAIC00MTIsMTkgKzQ5NCw2IEBACiB9CiAKIAotc3RhdGljIHZvaWQgaW5jcmVtZW50X3RhaWwoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKiBiKQotewotCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWwgPSBiLT50YWlsX3BvcyArIDE7Ci0KLQlybWIoKTsKLQotCWlmIChuZXdfdGFpbCA8IGItPmJ1ZmZlcl9zaXplKQotCQliLT50YWlsX3BvcyA9IG5ld190YWlsOwotCWVsc2UKLQkJYi0+dGFpbF9wb3MgPSAwOwotfQotCi0KIC8qIE1vdmUgdGFza3MgYWxvbmcgdG93YXJkcyBkZWF0aC4gQW55IHRhc2tzIG9uIGRlYWRfdGFza3MKICAqIHdpbGwgZGVmaW5pdGVseSBoYXZlIG5vIHJlbWFpbmluZyByZWZlcmVuY2VzIGluIGFueQogICogQ1BVIGJ1ZmZlcnMgYXQgdGhpcyBwb2ludCwgYmVjYXVzZSB3ZSB1c2UgdHdvIGxpc3RzLApAQCAtNDM1LDggKzUwNCw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlMSVNUX0hFQUQobG9jYWxfZGVhZF90YXNrcyk7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICogdGFzazsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0dGFzazsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0dGFzazsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrX21vcnR1YXJ5LCBmbGFncyk7CiAKQEAgLTQ5Myw3ICs1NjIsNyBAQAogewogCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJnBlcl9jcHUoY3B1X2J1ZmZlciwgY3B1KTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICogbmV3OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3OwogCXVuc2lnbmVkIGxvbmcgY29va2llID0gMDsKIAlpbnQgaW5fa2VybmVsID0gMTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTUwMSw3ICs1NzAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlOwogCiAJbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKLSAKKwogCWFkZF9jcHVfc3dpdGNoKGNwdSk7CiAKIAkvKiBSZW1lbWJlciwgb25seSB3ZSBjYW4gbW9kaWZ5IHRhaWxfcG9zICovCkBAIC01MDksOCArNTc4LDggQEAKIAlhdmFpbGFibGUgPSBnZXRfc2xvdHMoY3B1X2J1Zik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlOyArK2kpIHsKLQkJc3RydWN0IG9wX3NhbXBsZSAqIHMgPSAmY3B1X2J1Zi0+YnVmZmVyW2NwdV9idWYtPnRhaWxfcG9zXTsKLSAKKwkJc3RydWN0IG9wX3NhbXBsZSAqcyA9ICZjcHVfYnVmLT5idWZmZXJbY3B1X2J1Zi0+dGFpbF9wb3NdOworCiAJCWlmIChpc19jb2RlKHMtPmVpcCkpIHsKIAkJCWlmIChzLT5ldmVudCA8PSBDUFVfSVNfS0VSTkVMKSB7CiAJCQkJLyoga2VybmVsL3VzZXJzcGFjZSBzd2l0Y2ggKi8KQEAgLTUyMSw4ICs1OTAsMTggQEAKIAkJCX0gZWxzZSBpZiAocy0+ZXZlbnQgPT0gQ1BVX1RSQUNFX0JFR0lOKSB7CiAJCQkJc3RhdGUgPSBzYl9idF9zdGFydDsKIAkJCQlhZGRfdHJhY2VfYmVnaW4oKTsKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCisJCQl9IGVsc2UgaWYgKHMtPmV2ZW50ID09IElCU19GRVRDSF9CRUdJTikgeworCQkJCXN0YXRlID0gc2JfYnRfc3RhcnQ7CisJCQkJYWRkX2lic19iZWdpbihjcHVfYnVmLAorCQkJCQlJQlNfRkVUQ0hfQ09ERSwgaW5fa2VybmVsLCBtbSk7CisJCQl9IGVsc2UgaWYgKHMtPmV2ZW50ID09IElCU19PUF9CRUdJTikgeworCQkJCXN0YXRlID0gc2JfYnRfc3RhcnQ7CisJCQkJYWRkX2lic19iZWdpbihjcHVfYnVmLAorCQkJCQlJQlNfT1BfQ09ERSwgaW5fa2VybmVsLCBtbSk7CisjZW5kaWYKIAkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IG1tX3N0cnVjdCAqIG9sZG1tID0gbW07CisJCQkJc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0gPSBtbTsKIAogCQkJCS8qIHVzZXJzcGFjZSBjb250ZXh0IHN3aXRjaCAqLwogCQkJCW5ldyA9IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilzLT5ldmVudDsKQEAgLTUzMywxMyArNjEyLDExIEBACiAJCQkJCWNvb2tpZSA9IGdldF9leGVjX2Rjb29raWUobW0pOwogCQkJCWFkZF91c2VyX2N0eF9zd2l0Y2gobmV3LCBjb29raWUpOwogCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN0YXRlID49IHNiX2J0X3N0YXJ0ICYmCi0JCQkgICAgIWFkZF9zYW1wbGUobW0sIHMsIGluX2tlcm5lbCkpIHsKLQkJCQlpZiAoc3RhdGUgPT0gc2JfYnRfc3RhcnQpIHsKLQkJCQkJc3RhdGUgPSBzYl9idF9pZ25vcmU7Ci0JCQkJCWF0b21pY19pbmMoJm9wcm9maWxlX3N0YXRzLmJ0X2xvc3Rfbm9fbWFwcGluZyk7Ci0JCQkJfQorCQl9IGVsc2UgaWYgKHN0YXRlID49IHNiX2J0X3N0YXJ0ICYmCisJCQkgICAhYWRkX3NhbXBsZShtbSwgcywgaW5fa2VybmVsKSkgeworCQkJaWYgKHN0YXRlID09IHNiX2J0X3N0YXJ0KSB7CisJCQkJc3RhdGUgPSBzYl9idF9pZ25vcmU7CisJCQkJYXRvbWljX2luYygmb3Byb2ZpbGVfc3RhdHMuYnRfbG9zdF9ub19tYXBwaW5nKTsKIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCmluZGV4IDdiYTc4ZTYuLmUxYmQ1YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCkBAIC01LDYgKzUsNyBAQAogICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKICAqCiAgKiBAYXV0aG9yIEpvaG4gTGV2b24gPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPgorICogQGF1dGhvciBCYXJyeSBLYXNpbmRvcmYgPGJhcnJ5Lmthc2luZG9yZkBhbWQuY29tPgogICoKICAqIEVhY2ggQ1BVIGhhcyBhIGxvY2FsIGJ1ZmZlciB0aGF0IHN0b3JlcyBQQyB2YWx1ZS9ldmVudAogICogcGFpcnMuIFdlIGFsc28gbG9nIGNvbnRleHQgc3dpdGNoZXMgd2hlbiB3ZSBub3RpY2UgdGhlbS4KQEAgLTIwOSw3ICsyMTAsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG9wcm9maWxlX2JlZ2luX3RyYWNlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICogY3B1X2J1ZikKK3N0YXRpYyBpbnQgb3Byb2ZpbGVfYmVnaW5fdHJhY2Uoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYpCiB7CiAJaWYgKG5yX2F2YWlsYWJsZV9zbG90cyhjcHVfYnVmKSA8IDQpIHsKIAkJY3B1X2J1Zi0+c2FtcGxlX2xvc3Rfb3ZlcmZsb3crKzsKQEAgLTI1NCw2ICsyNTUsNzUgQEAKIAlvcHJvZmlsZV9hZGRfZXh0X3NhbXBsZShwYywgcmVncywgZXZlbnQsIGlzX2tlcm5lbCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCisKKyNkZWZpbmUgTUFYX0lCU19TQU1QTEVfU0laRQkxNAorc3RhdGljIGludCBsb2dfaWJzX3NhbXBsZShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiwKKwl1bnNpZ25lZCBsb25nIHBjLCBpbnQgaXNfa2VybmVsLCB1bnNpZ25lZCAgaW50ICppYnMsIGludCBpYnNfY29kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKwljcHVfYnVmLT5zYW1wbGVfcmVjZWl2ZWQrKzsKKworCWlmIChucl9hdmFpbGFibGVfc2xvdHMoY3B1X2J1ZikgPCBNQVhfSUJTX1NBTVBMRV9TSVpFKSB7CisJCWNwdV9idWYtPnNhbXBsZV9sb3N0X292ZXJmbG93Kys7CisJCXJldHVybiAwOworCX0KKworCWlzX2tlcm5lbCA9ICEhaXNfa2VybmVsOworCisJLyogbm90aWNlIGEgc3dpdGNoIGZyb20gdXNlci0+a2VybmVsIG9yIHZpY2UgdmVyc2EgKi8KKwlpZiAoY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgIT0gaXNfa2VybmVsKSB7CisJCWNwdV9idWYtPmxhc3RfaXNfa2VybmVsID0gaXNfa2VybmVsOworCQlhZGRfY29kZShjcHVfYnVmLCBpc19rZXJuZWwpOworCX0KKworCS8qIG5vdGljZSBhIHRhc2sgc3dpdGNoICovCisJaWYgKCFpc19rZXJuZWwpIHsKKwkJdGFzayA9IGN1cnJlbnQ7CisKKwkJaWYgKGNwdV9idWYtPmxhc3RfdGFzayAhPSB0YXNrKSB7CisJCQljcHVfYnVmLT5sYXN0X3Rhc2sgPSB0YXNrOworCQkJYWRkX2NvZGUoY3B1X2J1ZiwgKHVuc2lnbmVkIGxvbmcpdGFzayk7CisJCX0KKwl9CisKKwlhZGRfY29kZShjcHVfYnVmLCBpYnNfY29kZSk7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbMF0sIGlic1sxXSk7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbMl0sIGlic1szXSk7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbNF0sIGlic1s1XSk7CisKKwlpZiAoaWJzX2NvZGUgPT0gSUJTX09QX0JFR0lOKSB7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbNl0sIGlic1s3XSk7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbOF0sIGlic1s5XSk7CisJYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNbMTBdLCBpYnNbMTFdKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBvcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShzdHJ1Y3QgcHRfcmVncyAqY29uc3QgcmVncywKKwkJCQl1bnNpZ25lZCBpbnQgKiBjb25zdCBpYnNfc2FtcGxlLCB1OCBjb2RlKQoreworCWludCBpc19rZXJuZWwgPSAhdXNlcl9tb2RlKHJlZ3MpOworCXVuc2lnbmVkIGxvbmcgcGMgPSBwcm9maWxlX3BjKHJlZ3MpOworCisJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPQorCQkJICZwZXJfY3B1KGNwdV9idWZmZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlpZiAoIWJhY2t0cmFjZV9kZXB0aCkgeworCQlsb2dfaWJzX3NhbXBsZShjcHVfYnVmLCBwYywgaXNfa2VybmVsLCBpYnNfc2FtcGxlLCBjb2RlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIGxvZ19zYW1wbGUoKSBmYWlscyB3ZSBjYW4ndCBiYWNrdHJhY2Ugc2luY2Ugd2UgbG9zdCB0aGUgc291cmNlCisJKiBvZiB0aGlzIGV2ZW50ICovCisJaWYgKGxvZ19pYnNfc2FtcGxlKGNwdV9idWYsIHBjLCBpc19rZXJuZWwsIGlic19zYW1wbGUsIGNvZGUpKQorCQlvcHJvZmlsZV9vcHMuYmFja3RyYWNlKHJlZ3MsIGJhY2t0cmFjZV9kZXB0aCk7Cit9CisKKyNlbmRpZgorCiB2b2lkIG9wcm9maWxlX2FkZF9wYyh1bnNpZ25lZCBsb25nIHBjLCBpbnQgaXNfa2VybmVsLCB1bnNpZ25lZCBsb25nIGV2ZW50KQogewogCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CkBAIC0yOTYsNyArMzY2LDcgQEAKIAlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqIGIgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIsIHdvcmsud29yayk7CiAJaWYgKGItPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKLQkJcHJpbnRrKCJXUSBvbiBDUFUlZCwgcHJlZmVyIENQVSVkXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiV1Egb24gQ1BVJWQsIHByZWZlciBDUFUlZFxuIiwKIAkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgYi0+Y3B1KTsKIAl9CiAJc3luY19idWZmZXIoYi0+Y3B1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5oIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKaW5kZXggYzNlMzY2Yi4uOWM0NGQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmgKQEAgLTU1LDUgKzU1LDcgQEAKIC8qIHRyYW5zaWVudCBldmVudHMgZm9yIHRoZSBDUFUgYnVmZmVyIC0+IGV2ZW50IGJ1ZmZlciAqLwogI2RlZmluZSBDUFVfSVNfS0VSTkVMIDEKICNkZWZpbmUgQ1BVX1RSQUNFX0JFR0lOIDIKKyNkZWZpbmUgSUJTX0ZFVENIX0JFR0lOIDMKKyNkZWZpbmUgSUJTX09QX0JFR0lOICAgIDQKIAogI2VuZGlmIC8qIE9QUk9GSUxFX0NQVV9CVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L0NoYW5nZUxvZyBiL2RyaXZlcnMvcGFycG9ydC9DaGFuZ2VMb2cKaW5kZXggZGI3MTdjMS4uODU2NWJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L0NoYW5nZUxvZworKysgYi9kcml2ZXJzL3BhcnBvcnQvQ2hhbmdlTG9nCkBAIC0zMTEsNyArMzExLDcgQEAKIAkqIGllZWUxMjg0X29wcy5jIChwYXJwb3J0X2llZWUxMjg0X3JlYWRfbmliYmxlKTogUmVzZXQgbkF1dG9GZAogCW9uIHRpbWVvdXQuICBNYXRjaGVzIDIuMi54IGJlaGF2aW91ci4KIAotMjAwMS0wMy0wMiAgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PgorMjAwMS0wMy0wMiAgQW5kcmV3IE1vcnRvbgogCiAJKiBwYXJwb3J0X3BjLmMgKHJlZ2lzdGVyZWRfcGFycG9ydCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCiAJKHBhcnBvcnRfcGNfZmluZF9wb3J0cyk6IFNldCBpdCB3aGVuIHdlIHJlZ2lzdGVyIFBDSSBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCmluZGV4IGU5NzA1OTQuLmFjMmE4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiBwYXJwb3J0X2llZWUxMjg0LmMsdiAxLjQgMTk5Ny8xMC8xOSAyMTozNzoyMSBwaGlsaXAgRXhwICQKKy8qCiAgKiBJRUVFLTEyODQgaW1wbGVtZW50YXRpb24gZm9yIHBhcnBvcnQuCiAgKgogICogQXV0aG9yczogUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCmluZGV4IDAwZTFkOTYuLmIxODk5ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYwpAQCAtMTQ5LDUyICsxNDksNDQgQEAKICNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAogZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKIAorc3RhdGljIGludCBwYXJwb3J0X2NvbmZpZ19jaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkJdW5zaWduZWQgaW50IHZjYywKKwkJCQl2b2lkICpwcml2X2RhdGEpCit7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCWlmIChlcHBfbW9kZSkKKwkJCXBfZGV2LT5jb25mLkNvbmZpZ0luZGV4IHw9IEZPUkNFX0VQUF9NT0RFOworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoaW8tPm53aW4gPT0gMikgeworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW50IHBhcnBvcnRfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogICAgIHBhcnBvcnRfaW5mb190ICppbmZvID0gbGluay0+cHJpdjsKLSAgICB0dXBsZV90IHR1cGxlOwotICAgIHVfc2hvcnQgYnVmWzEyOF07Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKLSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKICAgICBzdHJ1Y3QgcGFycG9ydCAqcDsKICAgICBpbnQgbGFzdF9yZXQsIGxhc3RfZm47Ci0gICAgCi0gICAgREVCVUcoMCwgInBhcnBvcnRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKLSAgICAKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCi0JICAgIGdvdG8gbmV4dF9lbnRyeTsKIAotCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JICAgIGNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JICAgIGlmIChlcHBfbW9kZSkKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCB8PSBGT1JDRV9FUFBfTU9ERTsKLQkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCSAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkgICAgaWYgKGlvLT5ud2luID09IDIpIHsKLQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkgICAgfQotCSAgICBpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSAhPSAwKQotCQlnb3RvIG5leHRfZW50cnk7Ci0JICAgIC8qIElmIHdlJ3ZlIGdvdCB0aGlzIGZhciwgd2UncmUgZG9uZSAqLwotCSAgICBicmVhazsKLQl9Ci0JCi0gICAgbmV4dF9lbnRyeToKLQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOwotCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOworICAgIERFQlVHKDAsICJwYXJwb3J0X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICBsYXN0X3JldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBwYXJwb3J0X2NvbmZpZ19jaGVjaywgTlVMTCk7CisgICAgaWYgKGxhc3RfcmV0KSB7CisJICAgIGNzX2Vycm9yKGxpbmssIFJlcXVlc3RJTywgbGFzdF9yZXQpOworCSAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgCisKICAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwogICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKaW5kZXggOWQ1OTVhYS4uMDY1ZjIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfc3VuYnBwLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAKQEAgLTM0LDcgKzM2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPiAgICAgICAgICAgLyogT3BlblByb20gTGlicmFyeSAqLwotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPiAgICAgICAgICAgICAvKiBCUFAgdXNlcyBMU0kgNjQ4NTQgZm9yIERNQSAqLwogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3VuYnBwLmg+CkBAIC0yODUsMzggKzI4NiwzNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfb25lX3BvcnQoc3RydWN0IHNidXNfZGV2ICpzZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgYnBwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgcGFycG9ydCAqcDsKLQkvKiBhdCBsZWFzdCBpbiB0aGVvcnkgdGhlcmUgbWF5IGJlIGEgIndlIGRvbid0IGRtYSIgY2FzZSAqLwogCXN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgKm9wczsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JaW50IGlycSwgZG1hLCBlcnIgPSAwLCBzaXplOwogCXN0cnVjdCBicHBfcmVncyBfX2lvbWVtICpyZWdzOworCWludCBpcnEsIGRtYSwgZXJyID0gMCwgc2l6ZTsKIAl1bnNpZ25lZCBjaGFyIHZhbHVlX3RjcjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHBhcnBvcnQgKnA7CiAKLQlpcnEgPSBzZGV2LT5pcnFzWzBdOwotCWJhc2UgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJICAgIHNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZSwgCi0JCQkgICAgInN1bmJwcCIpOworCWlycSA9IG9wLT5pcnFzWzBdOworCWJhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkgIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSksCisJCQkgICJzdW5icHAiKTsKIAlpZiAoIWJhc2UpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc2l6ZSA9IHNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZTsKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKTsKIAlkbWEgPSBQQVJQT1JUX0RNQV9OT05FOwogCiAJb3BzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhcnBvcnRfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOwogICAgICAgICBpZiAoIW9wcykKIAkJZ290byBvdXRfdW5tYXA7CiAKLSAgICAgICAgbWVtY3B5IChvcHMsICZwYXJwb3J0X3N1bmJwcF9vcHMsIHNpemVvZiAoc3RydWN0IHBhcnBvcnRfb3BlcmF0aW9ucykpOworICAgICAgICBtZW1jcHkgKG9wcywgJnBhcnBvcnRfc3VuYnBwX29wcywgc2l6ZW9mKHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMpKTsKIAogCWRwcmludGsoKCJyZWdpc3Rlcl9wb3J0XG4iKSk7CiAJaWYgKCEocCA9IHBhcnBvcnRfcmVnaXN0ZXJfcG9ydCgodW5zaWduZWQgbG9uZyliYXNlLCBpcnEsIGRtYSwgb3BzKSkpCiAJCWdvdG8gb3V0X2ZyZWVfb3BzOwogCiAJcC0+c2l6ZSA9IHNpemU7Ci0JcC0+ZGV2ID0gJnNkZXYtPm9mZGV2LmRldjsKKwlwLT5kZXYgPSAmb3AtPmRldjsKIAogCWlmICgoZXJyID0gcmVxdWVzdF9pcnEocC0+aXJxLCBwYXJwb3J0X2lycV9oYW5kbGVyLAogCQkJICAgICAgIElSUUZfU0hBUkVELCBwLT5uYW1lLCBwKSkgIT0gMCkgewpAQCAtMzMzLDcgKzMzMyw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogc3VuYnBwIGF0IDB4JWx4XG4iLCBwLT5uYW1lLCBwLT5iYXNlKTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBwKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHApOwogCiAJcGFycG9ydF9hbm5vdW5jZV9wb3J0KHApOwogCkBAIC0zNDYsMjEgKzM0NiwxNCBAQAogCWtmcmVlKG9wcyk7CiAKIG91dF91bm1hcDoKLQlzYnVzX2lvdW5tYXAoYmFzZSwgc2l6ZSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBiYXNlLCBzaXplKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGJwcF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQorc3RhdGljIGludCBfX2RldmV4aXQgYnBwX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwotCi0JcmV0dXJuIGluaXRfb25lX3BvcnQoc2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGJwcF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwYXJwb3J0ICpwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IHBhcnBvcnQgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwogCXN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgKm9wcyA9IHAtPm9wczsKIAogCXBhcnBvcnRfcmVtb3ZlX3BvcnQocCk7CkBAIC0zNzAsMTYgKzM2MywxNiBAQAogCQlmcmVlX2lycShwLT5pcnEsIHApOwogCX0KIAotCXNidXNfaW91bm1hcCgodm9pZCBfX2lvbWVtICopIHAtPmJhc2UsIHAtPnNpemUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgKHZvaWQgX19pb21lbSAqKSBwLT5iYXNlLCBwLT5zaXplKTsKIAlwYXJwb3J0X3B1dF9wb3J0KHApOwogCWtmcmVlKG9wcyk7CiAKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJwcF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYnBwX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJTVU5XLGJwcCIsCiAJfSwKQEAgLTM5Nyw3ICszOTAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwYXJwb3J0X3N1bmJwcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYnBwX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYnBwX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGFycG9ydF9zdW5icHBfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3Byb2JlLmMgYi9kcml2ZXJzL3BhcnBvcnQvcHJvYmUuYwppbmRleCBjZDU2NWJiLi4wZjY1NTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcHJvYmUuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcHJvYmUuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogcGFycG9ydF9wcm9iZS5jLHYgMS4xIDE5OTkvMDcvMDMgMDg6NTY6MTcgZGF2ZW0gRXhwICQKKy8qCiAgKiBQYXJhbGxlbCBwb3J0IGRldmljZSBwcm9iaW5nIGNvZGUKICAqCiAgKiBBdXRob3JzOiAgICBDYXJzdGVuIEdyb3NzLCBjYXJzdGVuQHNvbC53b2huaGVpbS51bmktdWxtLmRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvc2hhcmUuYyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCmluZGV4IGE4YTYyYmIuLjBlYmNhNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiBwYXJwb3J0X3NoYXJlLmMsdiAxLjE1IDE5OTgvMDEvMTEgMTI6MDY6MTcgcGhpbGlwIEV4cCAkCisvKgogICogUGFyYWxsZWwtcG9ydCByZXNvdXJjZSBtYW5hZ2VyIGNvZGUuCiAgKiAKICAqIEF1dGhvcnM6IERhdmlkIENhbXBiZWxsIDxjYW1wYmVsbEB0aXJpYW4uY2hlLmN1cnRpbi5lZHUuYXU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDdkNjNmOGMuLjRiNDdmNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0yNiw2ICsyNiw4IEBACiAjIEJ1aWxkIEludGVsIElPTU1VIHN1cHBvcnQKIG9iai0kKENPTkZJR19ETUFSKSArPSBkbWFyLm8gaW92YS5vIGludGVsLWlvbW11Lm8KIAorb2JqLSQoQ09ORklHX0lOVFJfUkVNQVApICs9IGRtYXIubyBpbnRyX3JlbWFwcGluZy5vCisKICMKICMgU29tZSBhcmNoaXRlY3R1cmVzIHVzZSB0aGUgZ2VuZXJpYyBQQ0kgc2V0dXAgZnVuY3Rpb25zCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9kbWFyLmMgYi9kcml2ZXJzL3BjaS9kbWFyLmMKaW5kZXggOGJmODZhZS4uZTg0MmU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvZG1hci5jCisrKyBiL2RyaXZlcnMvcGNpL2RtYXIuYwpAQCAtMTksMTUgKzE5LDE4IEBACiAgKiBBdXRob3I6IFNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgogICogQXV0aG9yOiBBbmlsIFMgS2VzaGF2YW11cnRoeSA8YW5pbC5zLmtlc2hhdmFtdXJ0aHlAaW50ZWwuY29tPgogICoKLSAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGVhcmx5IGRldGVjdGlvbi9wYXJzaW5nIG9mIERNQSBSZW1hcHBpbmcgRGV2aWNlcworICogVGhpcyBmaWxlIGltcGxlbWVudHMgZWFybHkgZGV0ZWN0aW9uL3BhcnNpbmcgb2YgUmVtYXBwaW5nIERldmljZXMKICAqIHJlcG9ydGVkIHRvIE9TIHRocm91Z2ggQklPUyB2aWEgRE1BIHJlbWFwcGluZyByZXBvcnRpbmcgKERNQVIpIEFDUEkKICAqIHRhYmxlcy4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBib3RoIERNQS1yZW1hcHBpbmcgYW5kIEludGVycnVwdC1yZW1hcHBpbmcKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hci5oPgotI2luY2x1ZGUgImlvdmEuaCIKLSNpbmNsdWRlICJpbnRlbC1pb21tdS5oIgorI2luY2x1ZGUgPGxpbnV4L2lvdmEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAKICN1bmRlZiBQUkVGSVgKICNkZWZpbmUgUFJFRklYICJETUFSOiIKQEAgLTM3LDcgKzQwLDYgQEAKICAqIHRoZXNlIHVuaXRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUuCiAgKi8KIExJU1RfSEVBRChkbWFyX2RyaGRfdW5pdHMpOwotTElTVF9IRUFEKGRtYXJfcm1ycl91bml0cyk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiBfX2luaXRkYXRhIGRtYXJfdGJsOwogCkBAIC01MywxMSArNTUsNiBAQAogCQlsaXN0X2FkZCgmZHJoZC0+bGlzdCwgJmRtYXJfZHJoZF91bml0cyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBkbWFyX3JlZ2lzdGVyX3JtcnJfdW5pdChzdHJ1Y3QgZG1hcl9ybXJyX3VuaXQgKnJtcnIpCi17Ci0JbGlzdF9hZGQoJnJtcnItPmxpc3QsICZkbWFyX3JtcnJfdW5pdHMpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBkbWFyX3BhcnNlX29uZV9kZXZfc2NvcGUoc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUgKnNjb3BlLAogCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqKmRldiwgdTE2IHNlZ21lbnQpCiB7CkBAIC0xNzIsMTkgKzE2OSwzNyBAQAogCXN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqZHJoZDsKIAlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRtYXJ1OwogCWludCByZXQgPSAwOwotCXN0YXRpYyBpbnQgaW5jbHVkZV9hbGw7CiAKIAlkbWFydSA9IGt6YWxsb2Moc2l6ZW9mKCpkbWFydSksIEdGUF9LRVJORUwpOwogCWlmICghZG1hcnUpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZG1hcnUtPmhkciA9IGhlYWRlcjsKIAlkcmhkID0gKHN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqKWhlYWRlcjsKIAlkbWFydS0+cmVnX2Jhc2VfYWRkciA9IGRyaGQtPmFkZHJlc3M7CiAJZG1hcnUtPmluY2x1ZGVfYWxsID0gZHJoZC0+ZmxhZ3MgJiAweDE7IC8qIEJJVDA6IElOQ0xVREVfQUxMICovCiAKKwlyZXQgPSBhbGxvY19pb21tdShkbWFydSk7CisJaWYgKHJldCkgeworCQlrZnJlZShkbWFydSk7CisJCXJldHVybiByZXQ7CisJfQorCWRtYXJfcmVnaXN0ZXJfZHJoZF91bml0KGRtYXJ1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK2RtYXJfcGFyc2VfZGV2KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZG1hcnUpCit7CisJc3RydWN0IGFjcGlfZG1hcl9oYXJkd2FyZV91bml0ICpkcmhkOworCXN0YXRpYyBpbnQgaW5jbHVkZV9hbGw7CisJaW50IHJldDsKKworCWRyaGQgPSAoc3RydWN0IGFjcGlfZG1hcl9oYXJkd2FyZV91bml0ICopIGRtYXJ1LT5oZHI7CisKIAlpZiAoIWRtYXJ1LT5pbmNsdWRlX2FsbCkKIAkJcmV0ID0gZG1hcl9wYXJzZV9kZXZfc2NvcGUoKHZvaWQgKikoZHJoZCArIDEpLAotCQkJCSgodm9pZCAqKWRyaGQpICsgaGVhZGVyLT5sZW5ndGgsCisJCQkJKCh2b2lkICopZHJoZCkgKyBkcmhkLT5oZWFkZXIubGVuZ3RoLAogCQkJCSZkbWFydS0+ZGV2aWNlc19jbnQsICZkbWFydS0+ZGV2aWNlcywKIAkJCQlkcmhkLT5zZWdtZW50KTsKIAllbHNlIHsKQEAgLTE5NywzNyArMjEyLDU5IEBACiAJCWluY2x1ZGVfYWxsID0gMTsKIAl9CiAKLQlpZiAocmV0IHx8IChkbWFydS0+ZGV2aWNlc19jbnQgPT0gMCAmJiAhZG1hcnUtPmluY2x1ZGVfYWxsKSkKKwlpZiAocmV0IHx8IChkbWFydS0+ZGV2aWNlc19jbnQgPT0gMCAmJiAhZG1hcnUtPmluY2x1ZGVfYWxsKSkgeworCQlsaXN0X2RlbCgmZG1hcnUtPmxpc3QpOwogCQlrZnJlZShkbWFydSk7Ci0JZWxzZQotCQlkbWFyX3JlZ2lzdGVyX2RyaGRfdW5pdChkbWFydSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfRE1BUgorTElTVF9IRUFEKGRtYXJfcm1ycl91bml0cyk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWFyX3JlZ2lzdGVyX3JtcnJfdW5pdChzdHJ1Y3QgZG1hcl9ybXJyX3VuaXQgKnJtcnIpCit7CisJbGlzdF9hZGQoJnJtcnItPmxpc3QsICZkbWFyX3JtcnJfdW5pdHMpOworfQorCisKIHN0YXRpYyBpbnQgX19pbml0CiBkbWFyX3BhcnNlX29uZV9ybXJyKHN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICpoZWFkZXIpCiB7CiAJc3RydWN0IGFjcGlfZG1hcl9yZXNlcnZlZF9tZW1vcnkgKnJtcnI7CiAJc3RydWN0IGRtYXJfcm1ycl91bml0ICpybXJydTsKLQlpbnQgcmV0ID0gMDsKIAogCXJtcnJ1ID0ga3phbGxvYyhzaXplb2YoKnJtcnJ1KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFybXJydSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlybXJydS0+aGRyID0gaGVhZGVyOwogCXJtcnIgPSAoc3RydWN0IGFjcGlfZG1hcl9yZXNlcnZlZF9tZW1vcnkgKiloZWFkZXI7CiAJcm1ycnUtPmJhc2VfYWRkcmVzcyA9IHJtcnItPmJhc2VfYWRkcmVzczsKIAlybXJydS0+ZW5kX2FkZHJlc3MgPSBybXJyLT5lbmRfYWRkcmVzczsKKworCWRtYXJfcmVnaXN0ZXJfcm1ycl91bml0KHJtcnJ1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK3JtcnJfcGFyc2VfZGV2KHN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1ycnUpCit7CisJc3RydWN0IGFjcGlfZG1hcl9yZXNlcnZlZF9tZW1vcnkgKnJtcnI7CisJaW50IHJldDsKKworCXJtcnIgPSAoc3RydWN0IGFjcGlfZG1hcl9yZXNlcnZlZF9tZW1vcnkgKikgcm1ycnUtPmhkcjsKIAlyZXQgPSBkbWFyX3BhcnNlX2Rldl9zY29wZSgodm9pZCAqKShybXJyICsgMSksCi0JCSgodm9pZCAqKXJtcnIpICsgaGVhZGVyLT5sZW5ndGgsCisJCSgodm9pZCAqKXJtcnIpICsgcm1yci0+aGVhZGVyLmxlbmd0aCwKIAkJJnJtcnJ1LT5kZXZpY2VzX2NudCwgJnJtcnJ1LT5kZXZpY2VzLCBybXJyLT5zZWdtZW50KTsKIAotCWlmIChyZXQgfHwgKHJtcnJ1LT5kZXZpY2VzX2NudCA9PSAwKSkKKwlpZiAocmV0IHx8IChybXJydS0+ZGV2aWNlc19jbnQgPT0gMCkpIHsKKwkJbGlzdF9kZWwoJnJtcnJ1LT5saXN0KTsKIAkJa2ZyZWUocm1ycnUpOwotCWVsc2UKLQkJZG1hcl9yZWdpc3Rlcl9ybXJyX3VuaXQocm1ycnUpOworCX0KIAlyZXR1cm4gcmV0OwogfQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW5pdAogZG1hcl90YWJsZV9wcmludF9kbWFyX2VudHJ5KHN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICpoZWFkZXIpCkBAIC0yNTIsNiArMjg5LDcgQEAKIAl9CiB9CiAKKwogLyoqCiAgKiBwYXJzZV9kbWFyX3RhYmxlIC0gcGFyc2VzIHRoZSBETUEgcmVwb3J0aW5nIHRhYmxlCiAgKi8KQEAgLTI4NCw3ICszMjIsOSBAQAogCQkJcmV0ID0gZG1hcl9wYXJzZV9vbmVfZHJoZChlbnRyeV9oZWFkZXIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9ETUFSX1RZUEVfUkVTRVJWRURfTUVNT1JZOgorI2lmZGVmIENPTkZJR19ETUFSCiAJCQlyZXQgPSBkbWFyX3BhcnNlX29uZV9ybXJyKGVudHJ5X2hlYWRlcik7CisjZW5kaWYKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKQEAgLTMwMCwxNSArMzQwLDc3IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGRtYXJfcGNpX2RldmljZV9tYXRjaChzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlc1tdLCBpbnQgY250LAorCQkJICBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpbmRleDsKKworCXdoaWxlIChkZXYpIHsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY250OyBpbmRleCsrKQorCQkJaWYgKGRldiA9PSBkZXZpY2VzW2luZGV4XSkKKwkJCQlyZXR1cm4gMTsKKworCQkvKiBDaGVjayBvdXIgcGFyZW50ICovCisJCWRldiA9IGRldi0+YnVzLT5zZWxmOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKgorZG1hcl9maW5kX21hdGNoZWRfZHJoZF91bml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJoZCwgJmRtYXJfZHJoZF91bml0cywgbGlzdCkgeworCQlpZiAoZHJoZC0+aW5jbHVkZV9hbGwgfHwgZG1hcl9wY2lfZGV2aWNlX21hdGNoKGRyaGQtPmRldmljZXMsCisJCQkJCQlkcmhkLT5kZXZpY2VzX2NudCwgZGV2KSkKKwkJCXJldHVybiBkcmhkOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgX19pbml0IGRtYXJfZGV2X3Njb3BlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlyZXQgPSBkbWFyX3BhcnNlX2RldihkcmhkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisjaWZkZWYgQ09ORklHX0RNQVIKKwl7CisJCXN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1ycjsKKwkJZm9yX2VhY2hfcm1ycl91bml0cyhybXJyKSB7CisJCQlyZXQgPSBybXJyX3BhcnNlX2RldihybXJyKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKwogCiBpbnQgX19pbml0IGRtYXJfdGFibGVfaW5pdCh2b2lkKQogewotCisJc3RhdGljIGludCBkbWFyX3RhYmxlX2luaXRpYWxpemVkOwogCWludCByZXQ7CiAKKwlpZiAoZG1hcl90YWJsZV9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwlkbWFyX3RhYmxlX2luaXRpYWxpemVkID0gMTsKKwogCXJldCA9IHBhcnNlX2RtYXJfdGFibGUoKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJwYXJzZSBETUFSIHRhYmxlIGZhaWx1cmUuXG4iKTsKKwkJaWYgKHJldCAhPSAtRU5PREVWKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggInBhcnNlIERNQVIgdGFibGUgZmFpbHVyZS5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzE3LDkgKzQxOSwxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRE1BUgogCWlmIChsaXN0X2VtcHR5KCZkbWFyX3JtcnJfdW5pdHMpKQogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTm8gUk1SUiBmb3VuZFxuIik7CisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCisJcGFyc2VfaW9hcGljc191bmRlcl9pcigpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0MSwzICs0NDgsMjU1IEBACiAKIAlyZXR1cm4gKEFDUElfU1VDQ0VTUyhzdGF0dXMpID8gMSA6IDApOwogfQorCit2b2lkIF9faW5pdCBkZXRlY3RfaW50ZWxfaW9tbXUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZWFybHlfZG1hcl9kZXRlY3QoKTsKKworI2lmZGVmIENPTkZJR19ETUFSCisJeworCQlzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICpkbWFyOworCQkvKgorCQkgKiBmb3Igbm93IHdlIHdpbGwgZGlzYWJsZSBkbWEtcmVtYXBwaW5nIHdoZW4gaW50ZXJydXB0CisJCSAqIHJlbWFwcGluZyBpcyBlbmFibGVkLgorCQkgKiBXaGVuIHN1cHBvcnQgZm9yIHF1ZXVlZCBpbnZhbGlkYXRpb24gZm9yIElPVExCIGludmFsaWRhdGlvbgorCQkgKiBpcyBhZGRlZCwgd2Ugd2lsbCBub3QgbmVlZCB0aGlzIGFueSBtb3JlLgorCQkgKi8KKwkJZG1hciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyICopIGRtYXJfdGJsOworCQlpZiAocmV0ICYmIGNwdV9oYXNfeDJhcGljICYmIGRtYXItPmZsYWdzICYgMHgxKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIlF1ZXVlZCBpbnZhbGlkYXRpb24gd2lsbCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgIgorCQkJICAgICAgICJ4MmFwaWMgYW5kIEludHItcmVtYXBwaW5nLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIkRpc2FibGluZyBJT01NVSBkZXRlY3Rpb24sIGJlY2F1c2Ugb2YgbWlzc2luZyAiCisJCQkgICAgICAgInF1ZXVlZCBpbnZhbGlkYXRpb24gc3VwcG9ydCBmb3IgSU9UTEIgIgorCQkJICAgICAgICJpbnZhbGlkYXRpb25cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJVc2UgXCJub3gyYXBpY1wiLCBpZiB5b3Ugd2FudCB0byB1c2UgSW50ZWwgIgorCQkJICAgICAgICIgSU9NTVUgZm9yIERNQS1yZW1hcHBpbmcgYW5kIGRvbid0IGNhcmUgYWJvdXQgIgorCQkJICAgICAgICIgeDJhcGljIHN1cHBvcnRcbiIpOworCisJCQlkbWFyX2Rpc2FibGVkID0gMTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyZXQgJiYgIW5vX2lvbW11ICYmICFpb21tdV9kZXRlY3RlZCAmJiAhc3dpb3RsYiAmJgorCQkgICAgIWRtYXJfZGlzYWJsZWQpCisJCQlpb21tdV9kZXRlY3RlZCA9IDE7CisJfQorI2VuZGlmCit9CisKKworaW50IGFsbG9jX2lvbW11KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCWludCBtYXBfc2l6ZTsKKwl1MzIgdmVyOworCXN0YXRpYyBpbnQgaW9tbXVfYWxsb2NhdGVkID0gMDsKKworCWlvbW11ID0ga3phbGxvYyhzaXplb2YoKmlvbW11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb21tdS0+c2VxX2lkID0gaW9tbXVfYWxsb2NhdGVkKys7CisKKwlpb21tdS0+cmVnID0gaW9yZW1hcChkcmhkLT5yZWdfYmFzZV9hZGRyLCBQQUdFX1NJWkVfNEspOworCWlmICghaW9tbXUtPnJlZykgeworCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBjYW4ndCBtYXAgdGhlIHJlZ2lvblxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlvbW11LT5jYXAgPSBkbWFyX3JlYWRxKGlvbW11LT5yZWcgKyBETUFSX0NBUF9SRUcpOworCWlvbW11LT5lY2FwID0gZG1hcl9yZWFkcShpb21tdS0+cmVnICsgRE1BUl9FQ0FQX1JFRyk7CisKKwkvKiB0aGUgcmVnaXN0ZXJzIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUgcGFnZSAqLworCW1hcF9zaXplID0gbWF4X3QoaW50LCBlY2FwX21heF9pb3RsYl9vZmZzZXQoaW9tbXUtPmVjYXApLAorCQljYXBfbWF4X2ZhdWx0X3JlZ19vZmZzZXQoaW9tbXUtPmNhcCkpOworCW1hcF9zaXplID0gUEFHRV9BTElHTl80SyhtYXBfc2l6ZSk7CisJaWYgKG1hcF9zaXplID4gUEFHRV9TSVpFXzRLKSB7CisJCWlvdW5tYXAoaW9tbXUtPnJlZyk7CisJCWlvbW11LT5yZWcgPSBpb3JlbWFwKGRyaGQtPnJlZ19iYXNlX2FkZHIsIG1hcF9zaXplKTsKKwkJaWYgKCFpb21tdS0+cmVnKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBjYW4ndCBtYXAgdGhlIHJlZ2lvblxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJdmVyID0gcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfVkVSX1JFRyk7CisJcHJfZGVidWcoIklPTU1VICVsbHg6IHZlciAlZDolZCBjYXAgJWxseCBlY2FwICVsbHhcbiIsCisJCWRyaGQtPnJlZ19iYXNlX2FkZHIsIERNQVJfVkVSX01BSk9SKHZlciksIERNQVJfVkVSX01JTk9SKHZlciksCisJCWlvbW11LT5jYXAsIGlvbW11LT5lY2FwKTsKKworCXNwaW5fbG9ja19pbml0KCZpb21tdS0+cmVnaXN0ZXJfbG9jayk7CisKKwlkcmhkLT5pb21tdSA9IGlvbW11OworCXJldHVybiAwOworZXJyb3I6CisJa2ZyZWUoaW9tbXUpOworCXJldHVybiAtMTsKK30KKwordm9pZCBmcmVlX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX0RNQVIKKwlmcmVlX2RtYXJfaW9tbXUoaW9tbXUpOworI2VuZGlmCisKKwlpZiAoaW9tbXUtPnJlZykKKwkJaW91bm1hcChpb21tdS0+cmVnKTsKKwlrZnJlZShpb21tdSk7Cit9CisKKy8qCisgKiBSZWNsYWltIGFsbCB0aGUgc3VibWl0dGVkIGRlc2NyaXB0b3JzIHdoaWNoIGhhdmUgY29tcGxldGVkIGl0cyB3b3JrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjbGFpbV9mcmVlX2Rlc2Moc3RydWN0IHFfaW52YWwgKnFpKQoreworCXdoaWxlIChxaS0+ZGVzY19zdGF0dXNbcWktPmZyZWVfdGFpbF0gPT0gUUlfRE9ORSkgeworCQlxaS0+ZGVzY19zdGF0dXNbcWktPmZyZWVfdGFpbF0gPSBRSV9GUkVFOworCQlxaS0+ZnJlZV90YWlsID0gKHFpLT5mcmVlX3RhaWwgKyAxKSAlIFFJX0xFTkdUSDsKKwkJcWktPmZyZWVfY250Kys7CisJfQorfQorCisvKgorICogU3VibWl0IHRoZSBxdWV1ZWQgaW52YWxpZGF0aW9uIGRlc2NyaXB0b3IgdG8gdGhlIHJlbWFwcGluZworICogaGFyZHdhcmUgdW5pdCBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24uCisgKi8KK3ZvaWQgcWlfc3VibWl0X3N5bmMoc3RydWN0IHFpX2Rlc2MgKmRlc2MsIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCit7CisJc3RydWN0IHFfaW52YWwgKnFpID0gaW9tbXUtPnFpOworCXN0cnVjdCBxaV9kZXNjICpodywgd2FpdF9kZXNjOworCWludCB3YWl0X2luZGV4LCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFxaSkKKwkJcmV0dXJuOworCisJaHcgPSBxaS0+ZGVzYzsKKworCXNwaW5fbG9jaygmcWktPnFfbG9jayk7CisJd2hpbGUgKHFpLT5mcmVlX2NudCA8IDMpIHsKKwkJc3Bpbl91bmxvY2soJnFpLT5xX2xvY2spOworCQljcHVfcmVsYXgoKTsKKwkJc3Bpbl9sb2NrKCZxaS0+cV9sb2NrKTsKKwl9CisKKwlpbmRleCA9IHFpLT5mcmVlX2hlYWQ7CisJd2FpdF9pbmRleCA9IChpbmRleCArIDEpICUgUUlfTEVOR1RIOworCisJcWktPmRlc2Nfc3RhdHVzW2luZGV4XSA9IHFpLT5kZXNjX3N0YXR1c1t3YWl0X2luZGV4XSA9IFFJX0lOX1VTRTsKKworCWh3W2luZGV4XSA9ICpkZXNjOworCisJd2FpdF9kZXNjLmxvdyA9IFFJX0lXRF9TVEFUVVNfREFUQSgyKSB8IFFJX0lXRF9TVEFUVVNfV1JJVEUgfCBRSV9JV0RfVFlQRTsKKwl3YWl0X2Rlc2MuaGlnaCA9IHZpcnRfdG9fcGh5cygmcWktPmRlc2Nfc3RhdHVzW3dhaXRfaW5kZXhdKTsKKworCWh3W3dhaXRfaW5kZXhdID0gd2FpdF9kZXNjOworCisJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgJmh3W2luZGV4XSwgc2l6ZW9mKHN0cnVjdCBxaV9kZXNjKSk7CisJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgJmh3W3dhaXRfaW5kZXhdLCBzaXplb2Yoc3RydWN0IHFpX2Rlc2MpKTsKKworCXFpLT5mcmVlX2hlYWQgPSAocWktPmZyZWVfaGVhZCArIDIpICUgUUlfTEVOR1RIOworCXFpLT5mcmVlX2NudCAtPSAyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiB1cGRhdGUgdGhlIEhXIHRhaWwgcmVnaXN0ZXIgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YKKwkgKiBuZXcgZGVzY3JpcHRvcnMuCisJICovCisJd3JpdGVsKHFpLT5mcmVlX2hlYWQgPDwgNCwgaW9tbXUtPnJlZyArIERNQVJfSVFUX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChxaS0+ZGVzY19zdGF0dXNbd2FpdF9pbmRleF0gIT0gUUlfRE9ORSkgeworCQlzcGluX3VubG9jaygmcWktPnFfbG9jayk7CisJCWNwdV9yZWxheCgpOworCQlzcGluX2xvY2soJnFpLT5xX2xvY2spOworCX0KKworCXFpLT5kZXNjX3N0YXR1c1tpbmRleF0gPSBRSV9ET05FOworCisJcmVjbGFpbV9mcmVlX2Rlc2MocWkpOworCXNwaW5fdW5sb2NrKCZxaS0+cV9sb2NrKTsKK30KKworLyoKKyAqIEZsdXNoIHRoZSBnbG9iYWwgaW50ZXJydXB0IGVudHJ5IGNhY2hlLgorICovCit2b2lkIHFpX2dsb2JhbF9pZWMoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKK3sKKwlzdHJ1Y3QgcWlfZGVzYyBkZXNjOworCisJZGVzYy5sb3cgPSBRSV9JRUNfVFlQRTsKKwlkZXNjLmhpZ2ggPSAwOworCisJcWlfc3VibWl0X3N5bmMoJmRlc2MsIGlvbW11KTsKK30KKworLyoKKyAqIEVuYWJsZSBRdWV1ZWQgSW52YWxpZGF0aW9uIGludGVyZmFjZS4gVGhpcyBpcyBhIG11c3QgdG8gc3VwcG9ydAorICogaW50ZXJydXB0LXJlbWFwcGluZy4gQWxzbyB1c2VkIGJ5IERNQS1yZW1hcHBpbmcsIHdoaWNoIHJlcGxhY2VzCisgKiByZWdpc3RlciBiYXNlZCBJT1RMQiBpbnZhbGlkYXRpb24uCisgKi8KK2ludCBkbWFyX2VuYWJsZV9xaShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXUzMiBjbWQsIHN0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBxX2ludmFsICpxaTsKKworCWlmICghZWNhcF9xaXMoaW9tbXUtPmVjYXApKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qCisJICogcXVldWVkIGludmFsaWRhdGlvbiBpcyBhbHJlYWR5IHNldHVwIGFuZCBlbmFibGVkLgorCSAqLworCWlmIChpb21tdS0+cWkpCisJCXJldHVybiAwOworCisJaW9tbXUtPnFpID0ga21hbGxvYyhzaXplb2YoKnFpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb21tdS0+cWkpCisJCXJldHVybiAtRU5PTUVNOworCisJcWkgPSBpb21tdS0+cWk7CisKKwlxaS0+ZGVzYyA9ICh2b2lkICopKGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSk7CisJaWYgKCFxaS0+ZGVzYykgeworCQlrZnJlZShxaSk7CisJCWlvbW11LT5xaSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXFpLT5kZXNjX3N0YXR1cyA9IGttYWxsb2MoUUlfTEVOR1RIICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlmICghcWktPmRlc2Nfc3RhdHVzKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcWktPmRlc2MpOworCQlrZnJlZShxaSk7CisJCWlvbW11LT5xaSA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXFpLT5mcmVlX2hlYWQgPSBxaS0+ZnJlZV90YWlsID0gMDsKKwlxaS0+ZnJlZV9jbnQgPSBRSV9MRU5HVEg7CisKKwlzcGluX2xvY2tfaW5pdCgmcWktPnFfbG9jayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkvKiB3cml0ZSB6ZXJvIHRvIHRoZSB0YWlsIHJlZyAqLworCXdyaXRlbCgwLCBpb21tdS0+cmVnICsgRE1BUl9JUVRfUkVHKTsKKworCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyBETUFSX0lRQV9SRUcsIHZpcnRfdG9fcGh5cyhxaS0+ZGVzYykpOworCisJY21kID0gaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9RSUU7CisJaW9tbXUtPmdjbWQgfD0gRE1BX0dDTURfUUlFOworCXdyaXRlbChjbWQsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCS8qIE1ha2Ugc3VyZSBoYXJkd2FyZSBjb21wbGV0ZSBpdCAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfUUlFUyksIHN0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYwppbmRleCA0MDMzN2EwLi4xNDZjYTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYwpAQCAtMzIwLDE1ICszMjAsMTUgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKKwkJLyogcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgcGNpIGNvcmUgKi8KKwkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisKIAkJLyogcXVldWUgd29yayBpdGVtIHRvIGJsb3cgYXdheSB0aGlzIHN5c2ZzIGVudHJ5IGFuZCBvdGhlcgogCQkgKiBwYXJ0cy4KIAkJICovCiAJCUlOSVRfV09SSygmZHNsb3QtPnJlbW92ZV93b3JrLCByZW1vdmVfc2xvdF93b3JrZXIpOwogCQlxdWV1ZV93b3JrKGR1bW15cGhwX3dxLCAmZHNsb3QtPnJlbW92ZV93b3JrKTsKIAotCQkvKiBibG93IGF3YXkgdGhpcyBzeXNmcyBlbnRyeSBhbmQgb3RoZXIgcGFydHMuICovCi0JCXJlbW92ZV9zbG90KGRzbG90KTsKLQogCQlwY2lfZGV2X3B1dChkZXYpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2ViZGEuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2ViZGEuYwppbmRleCA4NDY3ZDAyLi43ZDI3NjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9lYmRhLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfZWJkYS5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlpb3VubWFwIChpb19tZW0pOwogCWRlYnVnICgicmV0dXJuZWQgZWJkYSBzZWdtZW50OiAleFxuIiwgZWJkYV9zZWcpOwogCQotCWlvX21lbSA9IGlvcmVtYXAgKGViZGFfc2VnPDw0LCA2NTAwMCk7CisJaW9fbWVtID0gaW9yZW1hcChlYmRhX3NlZzw8NCwgMTAyNCk7CiAJaWYgKCFpb19tZW0gKQogCQlyZXR1cm4gLUVOT01FTTsKIAluZXh0X29mZnNldCA9IDB4MTgwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCBhYjMxZjViLi45ZDkzNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KLQl3aGlsZSAodGltZW91dCA+IDEwMDApIHsKKwl3aGlsZSAodGltZW91dCA+IDApIHsKIAkJbXNsZWVwKDEwKTsKIAkJdGltZW91dCAtPSAxMDsKIAkJaWYgKCFwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCmluZGV4IDliNzE0ZWEuLjUwODg0NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKQEAgLTE0Nyw5ICsxNDcsNSBAQAogCWxpc3RfYWRkKCZzbG90LT5ycGFwaHBfc2xvdF9saXN0LCAmcnBhcGhwX3Nsb3RfaGVhZCk7CiAJaW5mbygiU2xvdCBbJXNdIHJlZ2lzdGVyZWRcbiIsIHNsb3QtPm5hbWUpOwogCXJldHVybiAwOwotCi1zeXNmc19mYWlsOgotCXBjaV9ocF9kZXJlZ2lzdGVyKHBocF9zbG90KTsKLQlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCA4ZDBlNjBhLi5mYzVmMmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTMzLDggKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgImlvdmEuaCIKLSNpbmNsdWRlICJpbnRlbC1pb21tdS5oIgorI2luY2x1ZGUgPGxpbnV4L2lvdmEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPiAvKiBmb3JjZV9pb21tdSBpbiB0aGlzIGhlYWRlciBpbiB4ODYtNjQqLwogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CkBAIC00OSw4ICs0OSw2IEBACiAKICNkZWZpbmUgREVGQVVMVF9ET01BSU5fQUREUkVTU19XSURUSCA0OAogCi0jZGVmaW5lIERNQVJfT1BFUkFUSU9OX1RJTUVPVVQgKChjeWNsZXNfdCkgdHNjX2toeioxMCoxMDAwKSAvKiAxMHNlYyAqLwotCiAjZGVmaW5lIERPTUFJTl9NQVhfQUREUihnYXcpICgoKCh1NjQpMSkgPDwgZ2F3KSAtIDEpCiAKIApAQCAtNTgsOCArNTYsNiBAQAogCiBERUZJTkVfVElNRVIodW5tYXBfdGltZXIsICBmbHVzaF91bm1hcHNfdGltZW91dCwgMCwgMCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmdfaW9tbXVzOwotCiAjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyAyNTAKIHN0cnVjdCBkZWZlcnJlZF9mbHVzaF90YWJsZXMgewogCWludCBuZXh0OwpAQCAtODAsNyArNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBkb21haW5fcmVtb3ZlX2Rldl9pbmZvKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKTsKIAotc3RhdGljIGludCBkbWFyX2Rpc2FibGVkOworaW50IGRtYXJfZGlzYWJsZWQ7CiBzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hcl9tYXBfZ2Z4ID0gMTsKIHN0YXRpYyBpbnQgZG1hcl9mb3JjZWRhYzsKIHN0YXRpYyBpbnQgaW50ZWxfaW9tbXVfc3RyaWN0OwpAQCAtMTYwLDcgKzE1Niw3IEBACiAJcmV0dXJuIGlvbW11X2ttZW1fY2FjaGVfYWxsb2MoaW9tbXVfZG9tYWluX2NhY2hlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZG9tYWluX21lbSh2b2lkICp2YWRkcikKK3N0YXRpYyB2b2lkIGZyZWVfZG9tYWluX21lbSh2b2lkICp2YWRkcikKIHsKIAlrbWVtX2NhY2hlX2ZyZWUoaW9tbXVfZG9tYWluX2NhY2hlLCB2YWRkcik7CiB9CkBAIC0xODUsMTMgKzE4MSw2IEBACiAJa21lbV9jYWNoZV9mcmVlKGlvbW11X2lvdmFfY2FjaGUsIGlvdmEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21tdV9mbHVzaF9jYWNoZSgKLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB2b2lkICphZGRyLCBpbnQgc2l6ZSkKLXsKLQlpZiAoIWVjYXBfY29oZXJlbnQoaW9tbXUtPmVjYXApKQotCQljbGZsdXNoX2NhY2hlX3JhbmdlKGFkZHIsIHNpemUpOwotfQotCiAvKiBHZXRzIGNvbnRleHQgZW50cnkgZm9yIGEgZ2l2ZW4gYnVzIGFuZCBkZXZmbiAqLwogc3RhdGljIHN0cnVjdCBjb250ZXh0X2VudHJ5ICogZGV2aWNlX3RvX2NvbnRleHRfZW50cnkoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwKIAkJdTggYnVzLCB1OCBkZXZmbikKQEAgLTQ4OCwxOSArNDc3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBJT01NVV9XQUlUX09QKGlvbW11LCBvZmZzZXQsIG9wLCBjb25kLCBzdHMpIFwKLXtcCi0JY3ljbGVzX3Qgc3RhcnRfdGltZSA9IGdldF9jeWNsZXMoKTtcCi0Jd2hpbGUgKDEpIHtcCi0JCXN0cyA9IG9wIChpb21tdS0+cmVnICsgb2Zmc2V0KTtcCi0JCWlmIChjb25kKVwKLQkJCWJyZWFrO1wKLQkJaWYgKERNQVJfT1BFUkFUSU9OX1RJTUVPVVQgPCAoZ2V0X2N5Y2xlcygpIC0gc3RhcnRfdGltZSkpXAotCQkJcGFuaWMoIkRNQVIgaGFyZHdhcmUgaXMgbWFsZnVuY3Rpb25pbmdcbiIpO1wKLQkJY3B1X3JlbGF4KCk7XAotCX1cCi19Ci0KIHN0YXRpYyB2b2lkIGlvbW11X3NldF9yb290X2VudHJ5KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCiB7CiAJdm9pZCAqYWRkcjsKQEAgLTk5MCw2ICs5NjYsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCiAJLyoKIAkgKiBpZiBDYWNoaW5nIG1vZGUgaXMgc2V0LCB0aGVuIGludmFsaWQgdHJhbnNsYXRpb25zIGFyZSB0YWdnZWQKIAkgKiB3aXRoIGRvbWFpbmlkIDAuIEhlbmNlIHdlIG5lZWQgdG8gcHJlLWFsbG9jYXRlIGl0LgpAQCAtOTk4LDYyICs5NzYsMTUgQEAKIAkJc2V0X2JpdCgwLCBpb21tdS0+ZG9tYWluX2lkcyk7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgc3RydWN0IGludGVsX2lvbW11ICphbGxvY19pb21tdShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LAotCQkJCQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQpCi17Ci0JaW50IHJldDsKLQlpbnQgbWFwX3NpemU7Ci0JdTMyIHZlcjsKIAotCWlvbW11LT5yZWcgPSBpb3JlbWFwKGRyaGQtPnJlZ19iYXNlX2FkZHIsIFBBR0VfU0laRV80Syk7Ci0JaWYgKCFpb21tdS0+cmVnKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IGNhbid0IG1hcCB0aGUgcmVnaW9uXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaW9tbXUtPmNhcCA9IGRtYXJfcmVhZHEoaW9tbXUtPnJlZyArIERNQVJfQ0FQX1JFRyk7Ci0JaW9tbXUtPmVjYXAgPSBkbWFyX3JlYWRxKGlvbW11LT5yZWcgKyBETUFSX0VDQVBfUkVHKTsKLQotCS8qIHRoZSByZWdpc3RlcnMgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZSBwYWdlICovCi0JbWFwX3NpemUgPSBtYXhfdChpbnQsIGVjYXBfbWF4X2lvdGxiX29mZnNldChpb21tdS0+ZWNhcCksCi0JCWNhcF9tYXhfZmF1bHRfcmVnX29mZnNldChpb21tdS0+Y2FwKSk7Ci0JbWFwX3NpemUgPSBQQUdFX0FMSUdOXzRLKG1hcF9zaXplKTsKLQlpZiAobWFwX3NpemUgPiBQQUdFX1NJWkVfNEspIHsKLQkJaW91bm1hcChpb21tdS0+cmVnKTsKLQkJaW9tbXUtPnJlZyA9IGlvcmVtYXAoZHJoZC0+cmVnX2Jhc2VfYWRkciwgbWFwX3NpemUpOwotCQlpZiAoIWlvbW11LT5yZWcpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IGNhbid0IG1hcCB0aGUgcmVnaW9uXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQl2ZXIgPSByZWFkbChpb21tdS0+cmVnICsgRE1BUl9WRVJfUkVHKTsKLQlwcl9kZWJ1ZygiSU9NTVUgJWxseDogdmVyICVkOiVkIGNhcCAlbGx4IGVjYXAgJWxseFxuIiwKLQkJZHJoZC0+cmVnX2Jhc2VfYWRkciwgRE1BUl9WRVJfTUFKT1IodmVyKSwgRE1BUl9WRVJfTUlOT1IodmVyKSwKLQkJaW9tbXUtPmNhcCwgaW9tbXUtPmVjYXApOwotCXJldCA9IGlvbW11X2luaXRfZG9tYWlucyhpb21tdSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bm1hcDsKLQlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZpb21tdS0+cmVnaXN0ZXJfbG9jayk7Ci0KLQlkcmhkLT5pb21tdSA9IGlvbW11OwotCXJldHVybiBpb21tdTsKLWVycm9yX3VubWFwOgotCWlvdW5tYXAoaW9tbXUtPnJlZyk7Ci1lcnJvcjoKLQlrZnJlZShpb21tdSk7Ci0JcmV0dXJuIE5VTEw7Ci19CiAKIHN0YXRpYyB2b2lkIGRvbWFpbl9leGl0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluKTsKLXN0YXRpYyB2b2lkIGZyZWVfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKKwordm9pZCBmcmVlX2RtYXJfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKIHsKIAlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsKIAlpbnQgaTsKIAotCWlmICghaW9tbXUpCi0JCXJldHVybjsKLQogCWkgPSBmaW5kX2ZpcnN0X2JpdChpb21tdS0+ZG9tYWluX2lkcywgY2FwX25kb21zKGlvbW11LT5jYXApKTsKIAlmb3IgKDsgaSA8IGNhcF9uZG9tcyhpb21tdS0+Y2FwKTsgKSB7CiAJCWRvbWFpbiA9IGlvbW11LT5kb21haW5zW2ldOwpAQCAtMTA3OCwxMCArMTAwOSw2IEBACiAKIAkvKiBmcmVlIGNvbnRleHQgbWFwcGluZyAqLwogCWZyZWVfY29udGV4dF90YWJsZShpb21tdSk7Ci0KLQlpZiAoaW9tbXUtPnJlZykKLQkJaW91bm1hcChpb21tdS0+cmVnKTsKLQlrZnJlZShpb21tdSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1hcl9kb21haW4gKiBpb21tdV9hbGxvY19kb21haW4oc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKQEAgLTE0MTQsNyArMTM0MSw3IEBACiAgKiBmaW5kX2RvbWFpbgogICogTm90ZTogd2UgdXNlIHN0cnVjdCBwY2lfZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXUgc3RvcmVzIHRoZSBpbmZvCiAgKi8KLXN0cnVjdCBkbWFyX2RvbWFpbiAqCitzdGF0aWMgc3RydWN0IGRtYXJfZG9tYWluICoKIGZpbmRfZG9tYWluKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8gKmluZm87CkBAIC0xNDI2LDM3ICsxMzUzLDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBkbWFyX3BjaV9kZXZpY2VfbWF0Y2goc3RydWN0IHBjaV9kZXYgKmRldmljZXNbXSwgaW50IGNudCwKLSAgICAgc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgaW5kZXg7Ci0KLQl3aGlsZSAoZGV2KSB7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNudDsgaW5kZXgrKykKLQkJCWlmIChkZXYgPT0gZGV2aWNlc1tpbmRleF0pCi0JCQkJcmV0dXJuIDE7Ci0KLQkJLyogQ2hlY2sgb3VyIHBhcmVudCAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqCi1kbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkcmhkLCAmZG1hcl9kcmhkX3VuaXRzLCBsaXN0KSB7Ci0JCWlmIChkcmhkLT5pbmNsdWRlX2FsbCB8fCBkbWFyX3BjaV9kZXZpY2VfbWF0Y2goZHJoZC0+ZGV2aWNlcywKLQkJCQkJCWRyaGQtPmRldmljZXNfY250LCBkZXYpKQotCQkJcmV0dXJuIGRyaGQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KIC8qIGRvbWFpbiBpcyBpbml0aWFsaXplZCAqLwogc3RhdGljIHN0cnVjdCBkbWFyX2RvbWFpbiAqZ2V0X2RvbWFpbl9mb3JfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZ2F3KQogewpAQCAtMTcyOSw4ICsxNjI1LDYgQEAKIAkgKiBlbmRmb3IKIAkgKi8KIAlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgewotCQlpZiAoZHJoZC0+aWdub3JlZCkKLQkJCWNvbnRpbnVlOwogCQlnX251bV9vZl9pb21tdXMrKzsKIAkJLyoKIAkJICogbG9jayBub3QgbmVlZGVkIGFzIHRoaXMgaXMgb25seSBpbmNyZW1lbnRlZCBpbiB0aGUgc2luZ2xlCkBAIC0xNzM5LDEyICsxNjMzLDYgQEAKIAkJICovCiAJfQogCi0JZ19pb21tdXMgPSBremFsbG9jKGdfbnVtX29mX2lvbW11cyAqIHNpemVvZigqaW9tbXUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdfaW9tbXVzKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCiAJZGVmZXJyZWRfZmx1c2ggPSBremFsbG9jKGdfbnVtX29mX2lvbW11cyAqCiAJCXNpemVvZihzdHJ1Y3QgZGVmZXJyZWRfZmx1c2hfdGFibGVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZWZlcnJlZF9mbHVzaCkgewpAQCAtMTc1MiwxNiArMTY0MCwxNSBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWkgPSAwOwogCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CiAJCWlmIChkcmhkLT5pZ25vcmVkKQogCQkJY29udGludWU7Ci0JCWlvbW11ID0gYWxsb2NfaW9tbXUoJmdfaW9tbXVzW2ldLCBkcmhkKTsKLQkJaSsrOwotCQlpZiAoIWlvbW11KSB7Ci0JCQlyZXQgPSAtRU5PTUVNOworCisJCWlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJcmV0ID0gaW9tbXVfaW5pdF9kb21haW5zKGlvbW11KTsKKwkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7Ci0JCX0KIAogCQkvKgogCQkgKiBUQkQ6CkBAIC0xODQ1LDcgKzE3MzIsNiBAQAogCQlpb21tdSA9IGRyaGQtPmlvbW11OwogCQlmcmVlX2lvbW11KGlvbW11KTsKIAl9Ci0Ja2ZyZWUoZ19pb21tdXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwMDIsNyArMTg4OCwxMCBAQAogCS8qIGp1c3QgZmx1c2ggdGhlbSBhbGwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZ19udW1fb2ZfaW9tbXVzOyBpKyspIHsKIAkJaWYgKGRlZmVycmVkX2ZsdXNoW2ldLm5leHQpIHsKLQkJCWlvbW11X2ZsdXNoX2lvdGxiX2dsb2JhbCgmZ19pb21tdXNbaV0sIDApOworCQkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9CisJCQkJZGVmZXJyZWRfZmx1c2hbaV0uZG9tYWluWzBdLT5pb21tdTsKKworCQkJaW9tbXVfZmx1c2hfaW90bGJfZ2xvYmFsKGlvbW11LCAwKTsKIAkJCWZvciAoaiA9IDA7IGogPCBkZWZlcnJlZF9mbHVzaFtpXS5uZXh0OyBqKyspIHsKIAkJCQlfX2ZyZWVfaW92YSgmZGVmZXJyZWRfZmx1c2hbaV0uZG9tYWluW2pdLT5pb3ZhZCwKIAkJCQkJCWRlZmVycmVkX2ZsdXNoW2ldLmlvdmFbal0pOwpAQCAtMjAzMiw3ICsxOTIxLDggQEAKIAlpZiAobGlzdF9zaXplID09IEhJR0hfV0FURVJfTUFSSykKIAkJZmx1c2hfdW5tYXBzKCk7CiAKLQlpb21tdV9pZCA9IGRvbS0+aW9tbXUgLSBnX2lvbW11czsKKwlpb21tdV9pZCA9IGRvbS0+aW9tbXUtPnNlcV9pZDsKKwogCW5leHQgPSBkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0ubmV4dDsKIAlkZWZlcnJlZF9mbHVzaFtpb21tdV9pZF0uZG9tYWluW25leHRdID0gZG9tOwogCWRlZmVycmVkX2ZsdXNoW2lvbW11X2lkXS5pb3ZhW25leHRdID0gaW92YTsKQEAgLTIzNDgsMTUgKzIyMzgsNiBAQAogCiB9CiAKLXZvaWQgX19pbml0IGRldGVjdF9pbnRlbF9pb21tdSh2b2lkKQotewotCWlmIChzd2lvdGxiIHx8IG5vX2lvbW11IHx8IGlvbW11X2RldGVjdGVkIHx8IGRtYXJfZGlzYWJsZWQpCi0JCXJldHVybjsKLQlpZiAoZWFybHlfZG1hcl9kZXRlY3QoKSkgewotCQlpb21tdV9kZXRlY3RlZCA9IDE7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9ub19yZW1hcHBpbmdfZGV2aWNlcyh2b2lkKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKQEAgLTI0MDMsMTIgKzIyODQsMTkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChub19pb21tdSB8fCBzd2lvdGxiIHx8IGRtYXJfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCiAJaWYgKGRtYXJfdGFibGVfaW5pdCgpKQogCQlyZXR1cm4gCS1FTk9ERVY7CiAKKwlpZiAoZG1hcl9kZXZfc2NvcGVfaW5pdCgpKQorCQlyZXR1cm4gCS1FTk9ERVY7CisKKwkvKgorCSAqIENoZWNrIHRoZSBuZWVkIGZvciBETUEtcmVtYXBwaW5nIGluaXRpYWxpemF0aW9uIG5vdy4KKwkgKiBBYm92ZSBpbml0aWFsaXphdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBieSBJbnRlcnJ1cHQtcmVtYXBwaW5nLgorCSAqLworCWlmIChub19pb21tdSB8fCBzd2lvdGxiIHx8IGRtYXJfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJaW9tbXVfaW5pdF9tZW1wb29sKCk7CiAJZG1hcl9pbml0X3Jlc2VydmVkX3JhbmdlcygpOwogCkBAIC0yNDMwLDMgKzIzMTgsMTExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgaW50ZWxfaW9tbXVfZG9tYWluX2V4aXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCit7CisJdTY0IGVuZDsKKworCS8qIERvbWFpbiAwIGlzIHJlc2VydmVkLCBzbyBkb250IHByb2Nlc3MgaXQgKi8KKwlpZiAoIWRvbWFpbikKKwkJcmV0dXJuOworCisJZW5kID0gRE9NQUlOX01BWF9BRERSKGRvbWFpbi0+Z2F3KTsKKwllbmQgPSBlbmQgJiAoflBBR0VfTUFTS180Syk7CisKKwkvKiBjbGVhciBwdGVzICovCisJZG1hX3B0ZV9jbGVhcl9yYW5nZShkb21haW4sIDAsIGVuZCk7CisKKwkvKiBmcmVlIHBhZ2UgdGFibGVzICovCisJZG1hX3B0ZV9mcmVlX3BhZ2V0YWJsZShkb21haW4sIDAsIGVuZCk7CisKKwlpb21tdV9mcmVlX2RvbWFpbihkb21haW4pOworCWZyZWVfZG9tYWluX21lbShkb21haW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfaW9tbXVfZG9tYWluX2V4aXQpOworCitzdHJ1Y3QgZG1hcl9kb21haW4gKmludGVsX2lvbW11X2RvbWFpbl9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW47CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKworCWRyaGQgPSBkbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQocGRldik7CisJaWYgKCFkcmhkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW50ZWxfaW9tbXVfZG9tYWluX2FsbG9jOiBkcmhkID09IE5VTExcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpb21tdSA9IGRyaGQtPmlvbW11OworCWlmICghaW9tbXUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiaW50ZWxfaW9tbXVfZG9tYWluX2FsbG9jOiBpb21tdSA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRvbWFpbiA9IGlvbW11X2FsbG9jX2RvbWFpbihpb21tdSk7CisJaWYgKCFkb21haW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiaW50ZWxfaW9tbXVfZG9tYWluX2FsbG9jOiBkb21haW4gPT0gTlVMTFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZG9tYWluX2luaXQoZG9tYWluLCBERUZBVUxUX0RPTUFJTl9BRERSRVNTX1dJRFRIKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJpbnRlbF9pb21tdV9kb21haW5fYWxsb2M6IGRvbWFpbl9pbml0KCkgZmFpbGVkXG4iKTsKKwkJaW50ZWxfaW9tbXVfZG9tYWluX2V4aXQoZG9tYWluKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkb21haW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9pb21tdV9kb21haW5fYWxsb2MpOworCitpbnQgaW50ZWxfaW9tbXVfY29udGV4dF9tYXBwaW5nKAorCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcmM7CisJcmMgPSBkb21haW5fY29udGV4dF9tYXBwaW5nKGRvbWFpbiwgcGRldik7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfaW9tbXVfY29udGV4dF9tYXBwaW5nKTsKKworaW50IGludGVsX2lvbW11X3BhZ2VfbWFwcGluZygKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgZG1hX2FkZHJfdCBpb3ZhLAorCXU2NCBocGEsIHNpemVfdCBzaXplLCBpbnQgcHJvdCkKK3sKKwlpbnQgcmM7CisJcmMgPSBkb21haW5fcGFnZV9tYXBwaW5nKGRvbWFpbiwgaW92YSwgaHBhLCBzaXplLCBwcm90KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9pb21tdV9wYWdlX21hcHBpbmcpOworCit2b2lkIGludGVsX2lvbW11X2RldGFjaF9kZXYoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIHU4IGJ1cywgdTggZGV2Zm4pCit7CisJZGV0YWNoX2RvbWFpbl9mb3JfZGV2KGRvbWFpbiwgYnVzLCBkZXZmbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9pb21tdV9kZXRhY2hfZGV2KTsKKworc3RydWN0IGRtYXJfZG9tYWluICoKK2ludGVsX2lvbW11X2ZpbmRfZG9tYWluKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBmaW5kX2RvbWFpbihwZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX2lvbW11X2ZpbmRfZG9tYWluKTsKKworaW50IGludGVsX2lvbW11X2ZvdW5kKHZvaWQpCit7CisJcmV0dXJuIGdfbnVtX29mX2lvbW11czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX2lvbW11X2ZvdW5kKTsKKwordTY0IGludGVsX2lvbW11X2lvdmFfdG9fcGZuKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCB1NjQgaW92YSkKK3sKKwlzdHJ1Y3QgZG1hX3B0ZSAqcHRlOworCXU2NCBwZm47CisKKwlwZm4gPSAwOworCXB0ZSA9IGFkZHJfdG9fZG1hX3B0ZShkb21haW4sIGlvdmEpOworCisJaWYgKHB0ZSkKKwkJcGZuID0gZG1hX3B0ZV9hZGRyKCpwdGUpOworCisJcmV0dXJuIHBmbiA+PiBQQUdFX1NISUZUXzRLOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfaW9tbXVfaW92YV90b19wZm4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuaCBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzBhZDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQotICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggSW50ZWwgQ29ycG9yYXRpb24KLSAqIEF1dGhvcjogQXNob2sgUmFqIDxhc2hvay5yYWpAaW50ZWwuY29tPgotICogQXV0aG9yOiBBbmlsIFMgS2VzaGF2YW11cnRoeSA8YW5pbC5zLmtlc2hhdmFtdXJ0aHlAaW50ZWwuY29tPgotICovCi0KLSNpZm5kZWYgX0lOVEVMX0lPTU1VX0hfCi0jZGVmaW5lIF9JTlRFTF9JT01NVV9IXwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tc2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlICJpb3ZhLmgiCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotLyoKLSAqIFdlIG5lZWQgYSBmaXhlZCBQQUdFX1NJWkUgb2YgNEsgaXJyZXNwZWN0aXZlIG9mCi0gKiBhcmNoIFBBR0VfU0laRSBmb3IgSU9NTVUgcGFnZSB0YWJsZXMuCi0gKi8KLSNkZWZpbmUgUEFHRV9TSElGVF80SwkJKDEyKQotI2RlZmluZSBQQUdFX1NJWkVfNEsJCSgxVUwgPDwgUEFHRV9TSElGVF80SykKLSNkZWZpbmUgUEFHRV9NQVNLXzRLCQkoKCh1NjQpLTEpIDw8IFBBR0VfU0hJRlRfNEspCi0jZGVmaW5lIFBBR0VfQUxJR05fNEsoYWRkcikJKCgoYWRkcikgKyBQQUdFX1NJWkVfNEsgLSAxKSAmIFBBR0VfTUFTS180SykKLQotI2RlZmluZSBJT1ZBX1BGTihhZGRyKQkJKChhZGRyKSA+PiBQQUdFX1NISUZUXzRLKQotI2RlZmluZSBETUFfMzJCSVRfUEZOCQlJT1ZBX1BGTihETUFfMzJCSVRfTUFTSykKLSNkZWZpbmUgRE1BXzY0QklUX1BGTgkJSU9WQV9QRk4oRE1BXzY0QklUX01BU0spCi0KLS8qCi0gKiBJbnRlbCBJT01NVSByZWdpc3RlciBzcGVjaWZpY2F0aW9uIHBlciB2ZXJzaW9uIDEuMCBwdWJsaWMgc3BlYy4KLSAqLwotCi0jZGVmaW5lCURNQVJfVkVSX1JFRwkweDAJLyogQXJjaCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGlzIElPTU1VICovCi0jZGVmaW5lCURNQVJfQ0FQX1JFRwkweDgJLyogSGFyZHdhcmUgc3VwcG9ydGVkIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZQlETUFSX0VDQVBfUkVHCTB4MTAJLyogRXh0ZW5kZWQgY2FwYWJpbGl0aWVzIHN1cHBvcnRlZCAqLwotI2RlZmluZQlETUFSX0dDTURfUkVHCTB4MTgJLyogR2xvYmFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BUl9HU1RTX1JFRwkweDFjCS8qIEdsb2JhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BUl9SVEFERFJfUkVHCTB4MjAJLyogUm9vdCBlbnRyeSB0YWJsZSAqLwotI2RlZmluZQlETUFSX0NDTURfUkVHCTB4MjgJLyogQ29udGV4dCBjb21tYW5kIHJlZyAqLwotI2RlZmluZQlETUFSX0ZTVFNfUkVHCTB4MzQJLyogRmF1bHQgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCURNQVJfRkVDVExfUkVHCTB4MzgJLyogRmF1bHQgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZQlETUFSX0ZFREFUQV9SRUcJMHgzYwkvKiBGYXVsdCBldmVudCBpbnRlcnJ1cHQgZGF0YSByZWdpc3RlciAqLwotI2RlZmluZQlETUFSX0ZFQUREUl9SRUcJMHg0MAkvKiBGYXVsdCBldmVudCBpbnRlcnJ1cHQgYWRkciByZWdpc3RlciAqLwotI2RlZmluZQlETUFSX0ZFVUFERFJfUkVHIDB4NDQJLyogVXBwZXIgYWRkcmVzcyByZWdpc3RlciAqLwotI2RlZmluZQlETUFSX0FGTE9HX1JFRwkweDU4CS8qIEFkdmFuY2VkIEZhdWx0IGNvbnRyb2wgKi8KLSNkZWZpbmUJRE1BUl9QTUVOX1JFRwkweDY0CS8qIEVuYWJsZSBQcm90ZWN0ZWQgTWVtb3J5IFJlZ2lvbiAqLwotI2RlZmluZQlETUFSX1BMTUJBU0VfUkVHIDB4NjgJLyogUE1SUiBMb3cgYWRkciAqLwotI2RlZmluZQlETUFSX1BMTUxJTUlUX1JFRyAweDZjCS8qIFBNUlIgbG93IGxpbWl0ICovCi0jZGVmaW5lCURNQVJfUEhNQkFTRV9SRUcgMHg3MAkvKiBwbXJyIGhpZ2ggYmFzZSBhZGRyICovCi0jZGVmaW5lCURNQVJfUEhNTElNSVRfUkVHIDB4NzgJLyogcG1yciBoaWdoIGxpbWl0ICovCi0KLSNkZWZpbmUgT0ZGU0VUX1NUUklERQkJKDkpCi0vKgotI2RlZmluZSBkbWFyX3JlYWRsKGRtYXIsIHJlZykgcmVhZGwoZG1hciArIHJlZykKLSNkZWZpbmUgZG1hcl9yZWFkcShkbWFyLCByZWcpICh7IFwKLQkJdTMyIGxvLCBoaTsgXAotCQlsbyA9IHJlYWRsKGRtYXIgKyByZWcpOyBcCi0JCWhpID0gcmVhZGwoZG1hciArIHJlZyArIDQpOyBcCi0JCSgoKHU2NCkgaGkpIDw8IDMyKSArIGxvOyB9KQotKi8KLXN0YXRpYyBpbmxpbmUgdTY0IGRtYXJfcmVhZHEodm9pZCBfX2lvbWVtICphZGRyKQotewotCXUzMiBsbywgaGk7Ci0JbG8gPSByZWFkbChhZGRyKTsKLQloaSA9IHJlYWRsKGFkZHIgKyA0KTsKLQlyZXR1cm4gKCgodTY0KSBoaSkgPDwgMzIpICsgbG87Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFyX3dyaXRlcSh2b2lkIF9faW9tZW0gKmFkZHIsIHU2NCB2YWwpCi17Ci0Jd3JpdGVsKCh1MzIpdmFsLCBhZGRyKTsKLQl3cml0ZWwoKHUzMikodmFsID4+IDMyKSwgYWRkciArIDQpOwotfQotCi0jZGVmaW5lIERNQVJfVkVSX01BSk9SKHYpCQkoKCh2KSAmIDB4ZjApID4+IDQpCi0jZGVmaW5lIERNQVJfVkVSX01JTk9SKHYpCQkoKHYpICYgMHgwZikKLQotLyoKLSAqIERlY29kaW5nIENhcGFiaWxpdHkgUmVnaXN0ZXIKLSAqLwotI2RlZmluZSBjYXBfcmVhZF9kcmFpbihjKQkoKChjKSA+PiA1NSkgJiAxKQotI2RlZmluZSBjYXBfd3JpdGVfZHJhaW4oYykJKCgoYykgPj4gNTQpICYgMSkKLSNkZWZpbmUgY2FwX21heF9hbWFza192YWwoYykJKCgoYykgPj4gNDgpICYgMHgzZikKLSNkZWZpbmUgY2FwX251bV9mYXVsdF9yZWdzKGMpCSgoKChjKSA+PiA0MCkgJiAweGZmKSArIDEpCi0jZGVmaW5lIGNhcF9wZ3NlbF9pbnYoYykJKCgoYykgPj4gMzkpICYgMSkKLQotI2RlZmluZSBjYXBfc3VwZXJfcGFnZV92YWwoYykJKCgoYykgPj4gMzQpICYgMHhmKQotI2RlZmluZSBjYXBfc3VwZXJfb2Zmc2V0KGMpCSgoKGZpbmRfZmlyc3RfYml0KCZjYXBfc3VwZXJfcGFnZV92YWwoYyksIDQpKSBcCi0JCQkJCSogT0ZGU0VUX1NUUklERSkgKyAyMSkKLQotI2RlZmluZSBjYXBfZmF1bHRfcmVnX29mZnNldChjKQkoKCgoYykgPj4gMjQpICYgMHgzZmYpICogMTYpCi0jZGVmaW5lIGNhcF9tYXhfZmF1bHRfcmVnX29mZnNldChjKSBcCi0JKGNhcF9mYXVsdF9yZWdfb2Zmc2V0KGMpICsgY2FwX251bV9mYXVsdF9yZWdzKGMpICogMTYpCi0KLSNkZWZpbmUgY2FwX3pscihjKQkJKCgoYykgPj4gMjIpICYgMSkKLSNkZWZpbmUgY2FwX2lzb2NoKGMpCQkoKChjKSA+PiAyMykgJiAxKQotI2RlZmluZSBjYXBfbWdhdyhjKQkJKCgoKGMpID4+IDE2KSAmIDB4M2YpICsgMSkKLSNkZWZpbmUgY2FwX3NhZ2F3KGMpCQkoKChjKSA+PiA4KSAmIDB4MWYpCi0jZGVmaW5lIGNhcF9jYWNoaW5nX21vZGUoYykJKCgoYykgPj4gNykgJiAxKQotI2RlZmluZSBjYXBfcGhtcihjKQkJKCgoYykgPj4gNikgJiAxKQotI2RlZmluZSBjYXBfcGxtcihjKQkJKCgoYykgPj4gNSkgJiAxKQotI2RlZmluZSBjYXBfcndiZihjKQkJKCgoYykgPj4gNCkgJiAxKQotI2RlZmluZSBjYXBfYWZsKGMpCQkoKChjKSA+PiAzKSAmIDEpCi0jZGVmaW5lIGNhcF9uZG9tcyhjKQkJKCgodW5zaWduZWQgbG9uZykxKSA8PCAoNCArIDIgKiAoKGMpICYgMHg3KSkpCi0vKgotICogRXh0ZW5kZWQgQ2FwYWJpbGl0eSBSZWdpc3RlcgotICovCi0KLSNkZWZpbmUgZWNhcF9uaW90bGJfaXVuaXRzKGUpCSgoKChlKSA+PiAyNCkgJiAweGZmKSArIDEpCi0jZGVmaW5lIGVjYXBfaW90bGJfb2Zmc2V0KGUpIAkoKCgoZSkgPj4gOCkgJiAweDNmZikgKiAxNikKLSNkZWZpbmUgZWNhcF9tYXhfaW90bGJfb2Zmc2V0KGUpIFwKLQkoZWNhcF9pb3RsYl9vZmZzZXQoZSkgKyBlY2FwX25pb3RsYl9pdW5pdHMoZSkgKiAxNikKLSNkZWZpbmUgZWNhcF9jb2hlcmVudChlKQkoKGUpICYgMHgxKQotCi0KLS8qIElPVExCX1JFRyAqLwotI2RlZmluZSBETUFfVExCX0dMT0JBTF9GTFVTSCAoKCh1NjQpMSkgPDwgNjApCi0jZGVmaW5lIERNQV9UTEJfRFNJX0ZMVVNIICgoKHU2NCkyKSA8PCA2MCkKLSNkZWZpbmUgRE1BX1RMQl9QU0lfRkxVU0ggKCgodTY0KTMpIDw8IDYwKQotI2RlZmluZSBETUFfVExCX0lJUkcodHlwZSkgKCh0eXBlID4+IDYwKSAmIDcpCi0jZGVmaW5lIERNQV9UTEJfSUFJRyh2YWwpICgoKHZhbCkgPj4gNTcpICYgNykKLSNkZWZpbmUgRE1BX1RMQl9SRUFEX0RSQUlOICgoKHU2NCkxKSA8PCA0OSkKLSNkZWZpbmUgRE1BX1RMQl9XUklURV9EUkFJTiAoKCh1NjQpMSkgPDwgNDgpCi0jZGVmaW5lIERNQV9UTEJfRElEKGlkKQkoKCh1NjQpKChpZCkgJiAweGZmZmYpKSA8PCAzMikKLSNkZWZpbmUgRE1BX1RMQl9JVlQgKCgodTY0KTEpIDw8IDYzKQotI2RlZmluZSBETUFfVExCX0lIX05PTkxFQUYgKCgodTY0KTEpIDw8IDYpCi0jZGVmaW5lIERNQV9UTEJfTUFYX1NJWkUgKDB4M2YpCi0KLS8qIFBNRU5fUkVHICovCi0jZGVmaW5lIERNQV9QTUVOX0VQTSAoKCh1MzIpMSk8PDMxKQotI2RlZmluZSBETUFfUE1FTl9QUlMgKCgodTMyKTEpPDwwKQotCi0vKiBHQ01EX1JFRyAqLwotI2RlZmluZSBETUFfR0NNRF9URSAoKCh1MzIpMSkgPDwgMzEpCi0jZGVmaW5lIERNQV9HQ01EX1NSVFAgKCgodTMyKTEpIDw8IDMwKQotI2RlZmluZSBETUFfR0NNRF9TRkwgKCgodTMyKTEpIDw8IDI5KQotI2RlZmluZSBETUFfR0NNRF9FQUZMICgoKHUzMikxKSA8PCAyOCkKLSNkZWZpbmUgRE1BX0dDTURfV0JGICgoKHUzMikxKSA8PCAyNykKLQotLyogR1NUU19SRUcgKi8KLSNkZWZpbmUgRE1BX0dTVFNfVEVTICgoKHUzMikxKSA8PCAzMSkKLSNkZWZpbmUgRE1BX0dTVFNfUlRQUyAoKCh1MzIpMSkgPDwgMzApCi0jZGVmaW5lIERNQV9HU1RTX0ZMUyAoKCh1MzIpMSkgPDwgMjkpCi0jZGVmaW5lIERNQV9HU1RTX0FGTFMgKCgodTMyKTEpIDw8IDI4KQotI2RlZmluZSBETUFfR1NUU19XQkZTICgoKHUzMikxKSA8PCAyNykKLQotLyogQ0NNRF9SRUcgKi8KLSNkZWZpbmUgRE1BX0NDTURfSUNDICgoKHU2NCkxKSA8PCA2MykKLSNkZWZpbmUgRE1BX0NDTURfR0xPQkFMX0lOVkwgKCgodTY0KTEpIDw8IDYxKQotI2RlZmluZSBETUFfQ0NNRF9ET01BSU5fSU5WTCAoKCh1NjQpMikgPDwgNjEpCi0jZGVmaW5lIERNQV9DQ01EX0RFVklDRV9JTlZMICgoKHU2NCkzKSA8PCA2MSkKLSNkZWZpbmUgRE1BX0NDTURfRk0obSkgKCgodTY0KSgobSkgJiAweDMpKSA8PCAzMikKLSNkZWZpbmUgRE1BX0NDTURfTUFTS19OT0JJVCAwCi0jZGVmaW5lIERNQV9DQ01EX01BU0tfMUJJVCAxCi0jZGVmaW5lIERNQV9DQ01EX01BU0tfMkJJVCAyCi0jZGVmaW5lIERNQV9DQ01EX01BU0tfM0JJVCAzCi0jZGVmaW5lIERNQV9DQ01EX1NJRChzKSAoKCh1NjQpKChzKSAmIDB4ZmZmZikpIDw8IDE2KQotI2RlZmluZSBETUFfQ0NNRF9ESUQoZCkgKCh1NjQpKChkKSAmIDB4ZmZmZikpCi0KLS8qIEZFQ1RMX1JFRyAqLwotI2RlZmluZSBETUFfRkVDVExfSU0gKCgodTMyKTEpIDw8IDMxKQotCi0vKiBGU1RTX1JFRyAqLwotI2RlZmluZSBETUFfRlNUU19QUEYgKCh1MzIpMikKLSNkZWZpbmUgRE1BX0ZTVFNfUEZPICgodTMyKTEpCi0jZGVmaW5lIGRtYV9mc3RzX2ZhdWx0X3JlY29yZF9pbmRleChzKSAoKChzKSA+PiA4KSAmIDB4ZmYpCi0KLS8qIEZSQ0RfUkVHLCAzMiBiaXRzIGFjY2VzcyAqLwotI2RlZmluZSBETUFfRlJDRF9GICgoKHUzMikxKSA8PCAzMSkKLSNkZWZpbmUgZG1hX2ZyY2RfdHlwZShkKSAoKGQgPj4gMzApICYgMSkKLSNkZWZpbmUgZG1hX2ZyY2RfZmF1bHRfcmVhc29uKGMpIChjICYgMHhmZikKLSNkZWZpbmUgZG1hX2ZyY2Rfc291cmNlX2lkKGMpIChjICYgMHhmZmZmKQotI2RlZmluZSBkbWFfZnJjZF9wYWdlX2FkZHIoZCkgKGQgJiAoKCh1NjQpLTEpIDw8IDEyKSkgLyogbG93IDY0IGJpdCAqLwotCi0vKgotICogMDogUHJlc2VudAotICogMS0xMTogUmVzZXJ2ZWQKLSAqIDEyLTYzOiBDb250ZXh0IFB0ciAoMTIgLSAoaGF3LTEpKQotICogNjQtMTI3OiBSZXNlcnZlZAotICovCi1zdHJ1Y3Qgcm9vdF9lbnRyeSB7Ci0JdTY0CXZhbDsKLQl1NjQJcnN2ZDE7Ci19OwotI2RlZmluZSBST09UX0VOVFJZX05SIChQQUdFX1NJWkVfNEsvc2l6ZW9mKHN0cnVjdCByb290X2VudHJ5KSkKLXN0YXRpYyBpbmxpbmUgYm9vbCByb290X3ByZXNlbnQoc3RydWN0IHJvb3RfZW50cnkgKnJvb3QpCi17Ci0JcmV0dXJuIChyb290LT52YWwgJiAxKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcm9vdF9wcmVzZW50KHN0cnVjdCByb290X2VudHJ5ICpyb290KQotewotCXJvb3QtPnZhbCB8PSAxOwotfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9yb290X3ZhbHVlKHN0cnVjdCByb290X2VudHJ5ICpyb290LCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCXJvb3QtPnZhbCB8PSB2YWx1ZSAmIFBBR0VfTUFTS180SzsKLX0KLQotc3RydWN0IGNvbnRleHRfZW50cnk7Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBjb250ZXh0X2VudHJ5ICoKLWdldF9jb250ZXh0X2FkZHJfZnJvbV9yb290KHN0cnVjdCByb290X2VudHJ5ICpyb290KQotewotCXJldHVybiAoc3RydWN0IGNvbnRleHRfZW50cnkgKikKLQkJKHJvb3RfcHJlc2VudChyb290KT9waHlzX3RvX3ZpcnQoCi0JCXJvb3QtPnZhbCAmIFBBR0VfTUFTS180Syk6Ci0JCU5VTEwpOwotfQotCi0vKgotICogbG93IDY0IGJpdHM6Ci0gKiAwOiBwcmVzZW50Ci0gKiAxOiBmYXVsdCBwcm9jZXNzaW5nIGRpc2FibGUKLSAqIDItMzogdHJhbnNsYXRpb24gdHlwZQotICogMTItNjM6IGFkZHJlc3Mgc3BhY2Ugcm9vdAotICogaGlnaCA2NCBiaXRzOgotICogMC0yOiBhZGRyZXNzIHdpZHRoCi0gKiAzLTY6IGF2YWwKLSAqIDgtMjM6IGRvbWFpbiBpZAotICovCi1zdHJ1Y3QgY29udGV4dF9lbnRyeSB7Ci0JdTY0IGxvOwotCXU2NCBoaTsKLX07Ci0jZGVmaW5lIGNvbnRleHRfcHJlc2VudChjKSAoKGMpLmxvICYgMSkKLSNkZWZpbmUgY29udGV4dF9mYXVsdF9kaXNhYmxlKGMpICgoKGMpLmxvID4+IDEpICYgMSkKLSNkZWZpbmUgY29udGV4dF90cmFuc2xhdGlvbl90eXBlKGMpICgoKGMpLmxvID4+IDIpICYgMykKLSNkZWZpbmUgY29udGV4dF9hZGRyZXNzX3Jvb3QoYykgKChjKS5sbyAmIFBBR0VfTUFTS180SykKLSNkZWZpbmUgY29udGV4dF9hZGRyZXNzX3dpZHRoKGMpICgoYykuaGkgJiAgNykKLSNkZWZpbmUgY29udGV4dF9kb21haW5faWQoYykgKCgoYykuaGkgPj4gOCkgJiAoKDEgPDwgMTYpIC0gMSkpCi0KLSNkZWZpbmUgY29udGV4dF9zZXRfcHJlc2VudChjKSBkbyB7KGMpLmxvIHw9IDE7fSB3aGlsZSAoMCkKLSNkZWZpbmUgY29udGV4dF9zZXRfZmF1bHRfZW5hYmxlKGMpIFwKLQlkbyB7KGMpLmxvICY9ICgoKHU2NCktMSkgPDwgMikgfCAxO30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbnRleHRfc2V0X3RyYW5zbGF0aW9uX3R5cGUoYywgdmFsKSBcCi0JZG8geyBcCi0JCShjKS5sbyAmPSAoKCh1NjQpLTEpIDw8IDQpIHwgMzsgXAotCQkoYykubG8gfD0gKCh2YWwpICYgMykgPDwgMjsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIENPTlRFWFRfVFRfTVVMVElfTEVWRUwgMAotI2RlZmluZSBjb250ZXh0X3NldF9hZGRyZXNzX3Jvb3QoYywgdmFsKSBcCi0JZG8geyhjKS5sbyB8PSAodmFsKSAmIFBBR0VfTUFTS180Szt9IHdoaWxlICgwKQotI2RlZmluZSBjb250ZXh0X3NldF9hZGRyZXNzX3dpZHRoKGMsIHZhbCkgZG8geyhjKS5oaSB8PSAodmFsKSAmIDc7fSB3aGlsZSAoMCkKLSNkZWZpbmUgY29udGV4dF9zZXRfZG9tYWluX2lkKGMsIHZhbCkgXAotCWRvIHsoYykuaGkgfD0gKCh2YWwpICYgKCgxIDw8IDE2KSAtIDEpKSA8PCA4O30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbnRleHRfY2xlYXJfZW50cnkoYykgZG8geyhjKS5sbyA9IDA7IChjKS5oaSA9IDA7fSB3aGlsZSAoMCkKLQotLyoKLSAqIDA6IHJlYWRhYmxlCi0gKiAxOiB3cml0YWJsZQotICogMi02OiByZXNlcnZlZAotICogNzogc3VwZXIgcGFnZQotICogOC0xMTogYXZhaWxhYmxlCi0gKiAxMi02MzogSG9zdCBwaHlzY2lhbCBhZGRyZXNzCi0gKi8KLXN0cnVjdCBkbWFfcHRlIHsKLQl1NjQgdmFsOwotfTsKLSNkZWZpbmUgZG1hX2NsZWFyX3B0ZShwKQlkbyB7KHApLnZhbCA9IDA7fSB3aGlsZSAoMCkKLQotI2RlZmluZSBETUFfUFRFX1JFQUQgKDEpCi0jZGVmaW5lIERNQV9QVEVfV1JJVEUgKDIpCi0KLSNkZWZpbmUgZG1hX3NldF9wdGVfcmVhZGFibGUocCkgZG8geyhwKS52YWwgfD0gRE1BX1BURV9SRUFEO30gd2hpbGUgKDApCi0jZGVmaW5lIGRtYV9zZXRfcHRlX3dyaXRhYmxlKHApIGRvIHsocCkudmFsIHw9IERNQV9QVEVfV1JJVEU7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZG1hX3NldF9wdGVfcHJvdChwLCBwcm90KSBcCi0JCWRvIHsocCkudmFsID0gKChwKS52YWwgJiB+MykgfCAoKHByb3QpICYgMyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGRtYV9wdGVfYWRkcihwKSAoKHApLnZhbCAmIFBBR0VfTUFTS180SykKLSNkZWZpbmUgZG1hX3NldF9wdGVfYWRkcihwLCBhZGRyKSBkbyB7XAotCQkocCkudmFsIHw9ICgoYWRkcikgJiBQQUdFX01BU0tfNEspOyB9IHdoaWxlICgwKQotI2RlZmluZSBkbWFfcHRlX3ByZXNlbnQocCkgKCgocCkudmFsICYgMykgIT0gMCkKLQotc3RydWN0IGludGVsX2lvbW11OwotCi1zdHJ1Y3QgZG1hcl9kb21haW4gewotCWludAlpZDsJCQkvKiBkb21haW4gaWQgKi8KLQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OwkvKiBiYWNrIHBvaW50ZXIgdG8gb3duaW5nIGlvbW11ICovCi0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7IAkvKiBhbGwgZGV2aWNlcycgbGlzdCAqLwotCXN0cnVjdCBpb3ZhX2RvbWFpbiBpb3ZhZDsJLyogaW92YSdzIHRoYXQgYmVsb25nIHRvIHRoaXMgZG9tYWluICovCi0KLQlzdHJ1Y3QgZG1hX3B0ZQkqcGdkOwkJLyogdmlydHVhbCBhZGRyZXNzICovCi0Jc3BpbmxvY2tfdAltYXBwaW5nX2xvY2s7CS8qIHBhZ2UgdGFibGUgbG9jayAqLwotCWludAkJZ2F3OwkJLyogbWF4IGd1ZXN0IGFkZHJlc3Mgd2lkdGggKi8KLQotCS8qIGFkanVzdGVkIGd1ZXN0IGFkZHJlc3Mgd2lkdGgsIDAgaXMgbGV2ZWwgMiAzMC1iaXQgKi8KLQlpbnQJCWFnYXc7Ci0KLSNkZWZpbmUgRE9NQUlOX0ZMQUdfTVVMVElQTEVfREVWSUNFUyAxCi0JaW50CQlmbGFnczsKLX07Ci0KLS8qIFBDSSBkb21haW4tZGV2aWNlIHJlbGF0aW9uc2hpcCAqLwotc3RydWN0IGRldmljZV9kb21haW5faW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaW5rOwkvKiBsaW5rIHRvIGRvbWFpbiBzaWJsaW5ncyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsOyAvKiBsaW5rIHRvIGdsb2JhbCBsaXN0ICovCi0JdTggYnVzOwkJCS8qIFBDSSBidXMgbnVtZXIgKi8KLQl1OCBkZXZmbjsJCS8qIFBDSSBkZXZmbiBudW1iZXIgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OyAvKiBpdCdzIE5VTEwgZm9yIFBDSUUtdG8tUENJIGJyaWRnZSAqLwotCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluOyAvKiBwb2ludGVyIHRvIGRvbWFpbiAqLwotfTsKLQotZXh0ZXJuIGludCBpbml0X2RtYXJzKHZvaWQpOwotCi1zdHJ1Y3QgaW50ZWxfaW9tbXUgewotCXZvaWQgX19pb21lbQkqcmVnOyAvKiBQb2ludGVyIHRvIGhhcmR3YXJlIHJlZ3MsIHZpcnR1YWwgYWRkciAqLwotCXU2NAkJY2FwOwotCXU2NAkJZWNhcDsKLQl1bnNpZ25lZCBsb25nIAkqZG9tYWluX2lkczsgLyogYml0bWFwIG9mIGRvbWFpbnMgKi8KLQlzdHJ1Y3QgZG1hcl9kb21haW4gKipkb21haW5zOyAvKiBwdHIgdG8gZG9tYWlucyAqLwotCWludAkJc2VnOwotCXUzMgkJZ2NtZDsgLyogSG9sZHMgVEUsIEVBRkwuIERvbid0IG5lZWQgU1JUUCwgU0ZMLCBXQkYgKi8KLQlzcGlubG9ja190CWxvY2s7IC8qIHByb3RlY3QgY29udGV4dCwgZG9tYWluIGlkcyAqLwotCXNwaW5sb2NrX3QJcmVnaXN0ZXJfbG9jazsgLyogcHJvdGVjdCByZWdpc3RlciBoYW5kbGluZyAqLwotCXN0cnVjdCByb290X2VudHJ5ICpyb290X2VudHJ5OyAvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KLQotCXVuc2lnbmVkIGludCBpcnE7Ci0JdW5zaWduZWQgY2hhciBuYW1lWzddOyAgICAvKiBEZXZpY2UgTmFtZSAqLwotCXN0cnVjdCBtc2lfbXNnIHNhdmVkX21zZzsKLQlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7Ci19OwotCi0jaWZuZGVmIENPTkZJR19ETUFSX0dGWF9XQQotc3RhdGljIGlubGluZSB2b2lkIGlvbW11X3ByZXBhcmVfZ2Z4X21hcHBpbmcodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0jZW5kaWYgLyogIUNPTkZJR19ETUFSX0dGWF9XQSAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGQ0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCkBAIC0wLDAgKzEsNDcxIEBACisjaW5jbHVkZSA8bGludXgvZG1hci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZWwtaW9tbXUuaD4KKyNpbmNsdWRlICJpbnRyX3JlbWFwcGluZy5oIgorCitzdGF0aWMgc3RydWN0IGlvYXBpY19zY29wZSBpcl9pb2FwaWNbTUFYX0lPX0FQSUNTXTsKK3N0YXRpYyBpbnQgaXJfaW9hcGljX251bTsKK2ludCBpbnRyX3JlbWFwcGluZ19lbmFibGVkOworCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11OworCXUxNiBpcnRlX2luZGV4OworCXUxNiBzdWJfaGFuZGxlOworCXU4ICBpcnRlX21hc2s7Cit9IGlycV8yX2lvbW11W05SX0lSUVNdOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV8yX2lyX2xvY2spOworCitpbnQgaXJxX3JlbWFwcGVkKGludCBpcnEpCit7CisJaWYgKGlycSA+IE5SX0lSUVMpCisJCXJldHVybiAwOworCisJaWYgKCFpcnFfMl9pb21tdVtpcnFdLmlvbW11KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQgZ2V0X2lydGUoaW50IGlycSwgc3RydWN0IGlydGUgKmVudHJ5KQoreworCWludCBpbmRleDsKKworCWlmICghZW50cnkgfHwgaXJxID4gTlJfSVJRUykKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwlpZiAoIWlycV8yX2lvbW11W2lycV0uaW9tbXUpIHsKKwkJc3Bpbl91bmxvY2soJmlycV8yX2lyX2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5kZXggPSBpcnFfMl9pb21tdVtpcnFdLmlydGVfaW5kZXggKyBpcnFfMl9pb21tdVtpcnFdLnN1Yl9oYW5kbGU7CisJKmVudHJ5ID0gKihpcnFfMl9pb21tdVtpcnFdLmlvbW11LT5pcl90YWJsZS0+YmFzZSArIGluZGV4KTsKKworCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFsbG9jX2lydGUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IGlycSwgdTE2IGNvdW50KQoreworCXN0cnVjdCBpcl90YWJsZSAqdGFibGUgPSBpb21tdS0+aXJfdGFibGU7CisJdTE2IGluZGV4LCBzdGFydF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJaW50IGk7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIHN0YXJ0IHRoZSBJUlRFIHNlYXJjaCBmcm9tIGluZGV4IDAuCisJICovCisJaW5kZXggPSBzdGFydF9pbmRleCA9IDA7CisKKwlpZiAoY291bnQgPiAxKSB7CisJCWNvdW50ID0gX19yb3VuZHVwX3Bvd19vZl90d28oY291bnQpOworCQltYXNrID0gaWxvZzIoY291bnQpOworCX0KKworCWlmIChtYXNrID4gZWNhcF9tYXhfaGFuZGxlX21hc2soaW9tbXUtPmVjYXApKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlJlcXVlc3RlZCBtYXNrICV4IGV4Y2VlZHMgdGhlIG1heCBpbnZhbGlkYXRpb24gaGFuZGxlIgorCQkgICAgICAgIiBtYXNrIHZhbHVlICVMeFxuIiwgbWFzaywKKwkJICAgICAgIGVjYXBfbWF4X2hhbmRsZV9tYXNrKGlvbW11LT5lY2FwKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcGluX2xvY2soJmlycV8yX2lyX2xvY2spOworCWRvIHsKKwkJZm9yIChpID0gaW5kZXg7IGkgPCBpbmRleCArIGNvdW50OyBpKyspCisJCQlpZiAgKHRhYmxlLT5iYXNlW2ldLnByZXNlbnQpCisJCQkJYnJlYWs7CisJCS8qIGVtcHR5IGluZGV4IGZvdW5kICovCisJCWlmIChpID09IGluZGV4ICsgY291bnQpCisJCQlicmVhazsKKworCQlpbmRleCA9IChpbmRleCArIGNvdW50KSAlIElOVFJfUkVNQVBfVEFCTEVfRU5UUklFUzsKKworCQlpZiAoaW5kZXggPT0gc3RhcnRfaW5kZXgpIHsKKwkJCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgYW4gSVJURVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWZvciAoaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgaSsrKQorCQl0YWJsZS0+YmFzZVtpXS5wcmVzZW50ID0gMTsKKworCWlycV8yX2lvbW11W2lycV0uaW9tbXUgPSBpb21tdTsKKwlpcnFfMl9pb21tdVtpcnFdLmlydGVfaW5kZXggPSAgaW5kZXg7CisJaXJxXzJfaW9tbXVbaXJxXS5zdWJfaGFuZGxlID0gMDsKKwlpcnFfMl9pb21tdVtpcnFdLmlydGVfbWFzayA9IG1hc2s7CisKKwlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHFpX2ZsdXNoX2llYyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCBpbnQgaW5kZXgsIGludCBtYXNrKQoreworCXN0cnVjdCBxaV9kZXNjIGRlc2M7CisKKwlkZXNjLmxvdyA9IFFJX0lFQ19JSURFWChpbmRleCkgfCBRSV9JRUNfVFlQRSB8IFFJX0lFQ19JTShtYXNrKQorCQkgICB8IFFJX0lFQ19TRUxFQ1RJVkU7CisJZGVzYy5oaWdoID0gMDsKKworCXFpX3N1Ym1pdF9zeW5jKCZkZXNjLCBpb21tdSk7Cit9CisKK2ludCBtYXBfaXJxX3RvX2lydGVfaGFuZGxlKGludCBpcnEsIHUxNiAqc3ViX2hhbmRsZSkKK3sKKwlpbnQgaW5kZXg7CisKKwlzcGluX2xvY2soJmlycV8yX2lyX2xvY2spOworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhaXJxXzJfaW9tbXVbaXJxXS5pb21tdSkgeworCQlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwkqc3ViX2hhbmRsZSA9IGlycV8yX2lvbW11W2lycV0uc3ViX2hhbmRsZTsKKwlpbmRleCA9IGlycV8yX2lvbW11W2lycV0uaXJ0ZV9pbmRleDsKKwlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisJcmV0dXJuIGluZGV4OworfQorCitpbnQgc2V0X2lydGVfaXJxKGludCBpcnEsIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHUxNiBpbmRleCwgdTE2IHN1YmhhbmRsZSkKK3sKKwlzcGluX2xvY2soJmlycV8yX2lyX2xvY2spOworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCBpcnFfMl9pb21tdVtpcnFdLmlvbW11KSB7CisJCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlycV8yX2lvbW11W2lycV0uaW9tbXUgPSBpb21tdTsKKwlpcnFfMl9pb21tdVtpcnFdLmlydGVfaW5kZXggPSBpbmRleDsKKwlpcnFfMl9pb21tdVtpcnFdLnN1Yl9oYW5kbGUgPSBzdWJoYW5kbGU7CisJaXJxXzJfaW9tbXVbaXJxXS5pcnRlX21hc2sgPSAwOworCisJc3Bpbl91bmxvY2soJmlycV8yX2lyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbGVhcl9pcnRlX2lycShpbnQgaXJxLCBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1MTYgaW5kZXgpCit7CisJc3Bpbl9sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIWlycV8yX2lvbW11W2lycV0uaW9tbXUpIHsKKwkJc3Bpbl91bmxvY2soJmlycV8yX2lyX2xvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJxXzJfaW9tbXVbaXJxXS5pb21tdSA9IE5VTEw7CisJaXJxXzJfaW9tbXVbaXJxXS5pcnRlX2luZGV4ID0gMDsKKwlpcnFfMl9pb21tdVtpcnFdLnN1Yl9oYW5kbGUgPSAwOworCWlycV8yX2lvbW11W2lycV0uaXJ0ZV9tYXNrID0gMDsKKworCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW9kaWZ5X2lydGUoaW50IGlycSwgc3RydWN0IGlydGUgKmlydGVfbW9kaWZpZWQpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBpcnRlICppcnRlOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlzcGluX2xvY2soJmlycV8yX2lyX2xvY2spOworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhaXJxXzJfaW9tbXVbaXJxXS5pb21tdSkgeworCQlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpb21tdSA9IGlycV8yX2lvbW11W2lycV0uaW9tbXU7CisKKwlpbmRleCA9IGlycV8yX2lvbW11W2lycV0uaXJ0ZV9pbmRleCArIGlycV8yX2lvbW11W2lycV0uc3ViX2hhbmRsZTsKKwlpcnRlID0gJmlvbW11LT5pcl90YWJsZS0+YmFzZVtpbmRleF07CisKKwlzZXRfNjRiaXQoKHVuc2lnbmVkIGxvbmcgKilpcnRlLCBpcnRlX21vZGlmaWVkLT5sb3cgfCAoMSA8PCAxKSk7CisJX19pb21tdV9mbHVzaF9jYWNoZShpb21tdSwgaXJ0ZSwgc2l6ZW9mKCppcnRlKSk7CisKKwlxaV9mbHVzaF9pZWMoaW9tbXUsIGluZGV4LCAwKTsKKworCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZsdXNoX2lydGUoaW50IGlycSkKK3sKKwlpbnQgaW5kZXg7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKKworCXNwaW5fbG9jaygmaXJxXzJfaXJfbG9jayk7CisJaWYgKGlycSA+PSBOUl9JUlFTIHx8ICFpcnFfMl9pb21tdVtpcnFdLmlvbW11KSB7CisJCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlvbW11ID0gaXJxXzJfaW9tbXVbaXJxXS5pb21tdTsKKworCWluZGV4ID0gaXJxXzJfaW9tbXVbaXJxXS5pcnRlX2luZGV4ICsgaXJxXzJfaW9tbXVbaXJxXS5zdWJfaGFuZGxlOworCisJcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgaXJxXzJfaW9tbXVbaXJxXS5pcnRlX21hc2spOworCXNwaW5fdW5sb2NrKCZpcnFfMl9pcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW50ZWxfaW9tbXUgKm1hcF9pb2FwaWNfdG9faXIoaW50IGFwaWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX0FQSUNTOyBpKyspCisJCWlmIChpcl9pb2FwaWNbaV0uaWQgPT0gYXBpYykKKwkJCXJldHVybiBpcl9pb2FwaWNbaV0uaW9tbXU7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBpbnRlbF9pb21tdSAqbWFwX2Rldl90b19pcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKKworCWRyaGQgPSBkbWFyX2ZpbmRfbWF0Y2hlZF9kcmhkX3VuaXQoZGV2KTsKKwlpZiAoIWRyaGQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGRyaGQtPmlvbW11OworfQorCitpbnQgZnJlZV9pcnRlKGludCBpcnEpCit7CisJaW50IGluZGV4LCBpOworCXN0cnVjdCBpcnRlICppcnRlOworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisKKwlzcGluX2xvY2soJmlycV8yX2lyX2xvY2spOworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhaXJxXzJfaW9tbXVbaXJxXS5pb21tdSkgeworCQlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpb21tdSA9IGlycV8yX2lvbW11W2lycV0uaW9tbXU7CisKKwlpbmRleCA9IGlycV8yX2lvbW11W2lycV0uaXJ0ZV9pbmRleCArIGlycV8yX2lvbW11W2lycV0uc3ViX2hhbmRsZTsKKwlpcnRlID0gJmlvbW11LT5pcl90YWJsZS0+YmFzZVtpbmRleF07CisKKwlpZiAoIWlycV8yX2lvbW11W2lycV0uc3ViX2hhbmRsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgaXJxXzJfaW9tbXVbaXJxXS5pcnRlX21hc2spOyBpKyspCisJCQlzZXRfNjRiaXQoKHVuc2lnbmVkIGxvbmcgKilpcnRlLCAwKTsKKwkJcWlfZmx1c2hfaWVjKGlvbW11LCBpbmRleCwgaXJxXzJfaW9tbXVbaXJxXS5pcnRlX21hc2spOworCX0KKworCWlycV8yX2lvbW11W2lycV0uaW9tbXUgPSBOVUxMOworCWlycV8yX2lvbW11W2lycV0uaXJ0ZV9pbmRleCA9IDA7CisJaXJxXzJfaW9tbXVbaXJxXS5zdWJfaGFuZGxlID0gMDsKKwlpcnFfMl9pb21tdVtpcnFdLmlydGVfbWFzayA9IDA7CisKKwlzcGluX3VubG9jaygmaXJxXzJfaXJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfc2V0X2ludHJfcmVtYXBwaW5nKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIGludCBtb2RlKQoreworCXU2NCBhZGRyOworCXUzMiBjbWQsIHN0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYWRkciA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWlvbW11LT5pcl90YWJsZS0+YmFzZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKworCWRtYXJfd3JpdGVxKGlvbW11LT5yZWcgKyBETUFSX0lSVEFfUkVHLAorCQkgICAgKGFkZHIpIHwgSVJfWDJBUElDX01PREUobW9kZSkgfCBJTlRSX1JFTUFQX1RBQkxFX1JFR19TSVpFKTsKKworCS8qIFNldCBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIHBvaW50ZXIgKi8KKwljbWQgPSBpb21tdS0+Z2NtZCB8IERNQV9HQ01EX1NJUlRQOworCXdyaXRlbChjbWQsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCisJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfSVJUUFMpLCBzdHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGdsb2JhbCBpbnZhbGlkYXRpb24gb2YgaW50ZXJydXB0IGVudHJ5IGNhY2hlIGJlZm9yZSBlbmFibGluZworCSAqIGludGVycnVwdC1yZW1hcHBpbmcuCisJICovCisJcWlfZ2xvYmFsX2llYyhpb21tdSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQtcmVtYXBwaW5nICovCisJY21kID0gaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9JUkU7CisJaW9tbXUtPmdjbWQgfD0gRE1BX0dDTURfSVJFOworCXdyaXRlbChjbWQsIGlvbW11LT5yZWcgKyBETUFSX0dDTURfUkVHKTsKKworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCisJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfSVJFUyksIHN0cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQgc2V0dXBfaW50cl9yZW1hcHBpbmcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlyX3RhYmxlICppcl90YWJsZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXM7CisKKwlpcl90YWJsZSA9IGlvbW11LT5pcl90YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcl90YWJsZSksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWlvbW11LT5pcl90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYWdlcyA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBJTlRSX1JFTUFQX1BBR0VfT1JERVIpOworCisJaWYgKCFwYWdlcykgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhbGxvY2F0ZSBwYWdlcyBvZiBvcmRlciAlZFxuIiwKKwkJICAgICAgIElOVFJfUkVNQVBfUEFHRV9PUkRFUik7CisJCWtmcmVlKGlvbW11LT5pcl90YWJsZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlyX3RhYmxlLT5iYXNlID0gcGFnZV9hZGRyZXNzKHBhZ2VzKTsKKworCWlvbW11X3NldF9pbnRyX3JlbWFwcGluZyhpb21tdSwgbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgZW5hYmxlX2ludHJfcmVtYXBwaW5nKGludCBlaW0pCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCWludCBzZXR1cCA9IDA7CisKKwkvKgorCSAqIGNoZWNrIGZvciB0aGUgSW50ZXJydXB0LXJlbWFwcGluZyBzdXBwb3J0CisJICovCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OworCisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlaW0gJiYgIWVjYXBfZWltX3N1cHBvcnQoaW9tbXUtPmVjYXApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJEUkhEICVMeDogRUlNIG5vdCBzdXBwb3J0ZWQgYnkgRFJIRCwgIgorCQkJICAgICAgICIgZWNhcCAlTHhcbiIsIGRyaGQtPnJlZ19iYXNlX2FkZHIsIGlvbW11LT5lY2FwKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qCisJICogRW5hYmxlIHF1ZXVlZCBpbnZhbGlkYXRpb24gZm9yIGFsbCB0aGUgRFJIRCdzLgorCSAqLworCWZvcl9lYWNoX2RyaGRfdW5pdChkcmhkKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUgPSBkcmhkLT5pb21tdTsKKwkJcmV0ID0gZG1hcl9lbmFibGVfcWkoaW9tbXUpOworCisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRFJIRCAlTHg6IGZhaWxlZCB0byBlbmFibGUgcXVldWVkLCAiCisJCQkgICAgICAgIiBpbnZhbGlkYXRpb24sIGVjYXAgJUx4LCByZXQgJWRcbiIsCisJCQkgICAgICAgZHJoZC0+cmVnX2Jhc2VfYWRkciwgaW9tbXUtPmVjYXAsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldHVwIEludGVycnVwdC1yZW1hcHBpbmcgZm9yIGFsbCB0aGUgRFJIRCdzIG5vdy4KKwkgKi8KKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJaWYgKCFlY2FwX2lyX3N1cHBvcnQoaW9tbXUtPmVjYXApKQorCQkJY29udGludWU7CisKKwkJaWYgKHNldHVwX2ludHJfcmVtYXBwaW5nKGlvbW11LCBlaW0pKQorCQkJZ290byBlcnJvcjsKKworCQlzZXR1cCA9IDE7CisJfQorCisJaWYgKCFzZXR1cCkKKwkJZ290byBlcnJvcjsKKworCWludHJfcmVtYXBwaW5nX2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCS8qCisJICogaGFuZGxlIGVycm9yIGNvbmRpdGlvbiBncmFjZWZ1bGx5IGhlcmUhCisJICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlyX3BhcnNlX2lvYXBpY19zY29wZShzdHJ1Y3QgYWNwaV9kbWFyX2hlYWRlciAqaGVhZGVyLAorCQkJCSBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqZHJoZDsKKwlzdHJ1Y3QgYWNwaV9kbWFyX2RldmljZV9zY29wZSAqc2NvcGU7CisJdm9pZCAqc3RhcnQsICplbmQ7CisKKwlkcmhkID0gKHN0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCAqKWhlYWRlcjsKKworCXN0YXJ0ID0gKHZvaWQgKikoZHJoZCArIDEpOworCWVuZCA9ICgodm9pZCAqKWRyaGQpICsgaGVhZGVyLT5sZW5ndGg7CisKKwl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKwkJc2NvcGUgPSBzdGFydDsKKwkJaWYgKHNjb3BlLT5lbnRyeV90eXBlID09IEFDUElfRE1BUl9TQ09QRV9UWVBFX0lPQVBJQykgeworCQkJaWYgKGlyX2lvYXBpY19udW0gPT0gTUFYX0lPX0FQSUNTKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXhjZWVkZWQgTWF4IElPIEFQSUNTXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gIklPQVBJQyBpZCAlZCB1bmRlciBEUkhEIGJhc2UiCisJCQkgICAgICAgIiAweCVMeFxuIiwgc2NvcGUtPmVudW1lcmF0aW9uX2lkLAorCQkJICAgICAgIGRyaGQtPmFkZHJlc3MpOworCisJCQlpcl9pb2FwaWNbaXJfaW9hcGljX251bV0uaW9tbXUgPSBpb21tdTsKKwkJCWlyX2lvYXBpY1tpcl9pb2FwaWNfbnVtXS5pZCA9IHNjb3BlLT5lbnVtZXJhdGlvbl9pZDsKKwkJCWlyX2lvYXBpY19udW0rKzsKKwkJfQorCQlzdGFydCArPSBzY29wZS0+bGVuZ3RoOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRmluZHMgdGhlIGFzc29jYWl0aW9uIGJldHdlZW4gSU9BUElDJ3MgYW5kIGl0cyBJbnRlcnJ1cHQtcmVtYXBwaW5nCisgKiBoYXJkd2FyZSB1bml0LgorICovCitpbnQgX19pbml0IHBhcnNlX2lvYXBpY3NfdW5kZXJfaXIodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgKmRyaGQ7CisJaW50IGlyX3N1cHBvcnRlZCA9IDA7CisKKwlmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgeworCQlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11ID0gZHJoZC0+aW9tbXU7CisKKwkJaWYgKGVjYXBfaXJfc3VwcG9ydChpb21tdS0+ZWNhcCkpIHsKKwkJCWlmIChpcl9wYXJzZV9pb2FwaWNfc2NvcGUoZHJoZC0+aGRyLCBpb21tdSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlpcl9zdXBwb3J0ZWQgPSAxOworCQl9CisJfQorCisJaWYgKGlyX3N1cHBvcnRlZCAmJiBpcl9pb2FwaWNfbnVtICE9IG5yX2lvYXBpY3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIk5vdCBhbGwgSU8tQVBJQydzIGxpc3RlZCB1bmRlciByZW1hcHBpbmcgaGFyZHdhcmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGlyX3N1cHBvcnRlZDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmggYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDhmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5oCkBAIC0wLDAgKzEsOCBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CisKK3N0cnVjdCBpb2FwaWNfc2NvcGUgeworCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CisJdW5zaWduZWQgaW50IGlkOworfTsKKworI2RlZmluZSBJUl9YMkFQSUNfTU9ERShtb2RlKSAobW9kZSA/ICgxIDw8IDExKSA6IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3ZhLmMgYi9kcml2ZXJzL3BjaS9pb3ZhLmMKaW5kZXggM2VmNGFjMC4uMjI4NzExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW92YS5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdmEuYwpAQCAtNyw3ICs3LDcgQEAKICAqIEF1dGhvcjogQW5pbCBTIEtlc2hhdmFtdXJ0aHkgPGFuaWwucy5rZXNoYXZhbXVydGh5QGludGVsLmNvbT4KICAqLwogCi0jaW5jbHVkZSAiaW92YS5oIgorI2luY2x1ZGUgPGxpbnV4L2lvdmEuaD4KIAogdm9pZAogaW5pdF9pb3ZhX2RvbWFpbihzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkLCB1bnNpZ25lZCBsb25nIHBmbl8zMmJpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggOWM3MTg1OC4uNzdiYWZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KQEAgLTQ4NCw2ICs0ODUsMjEgQEAKICNlbmRpZiAvKiBIQVZFX1BDSV9MRUdBQ1kgKi8KIAogI2lmZGVmIEhBVkVfUENJX01NQVAKKworc3RhdGljIGludCBwY2lfbW1hcF9maXRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzbm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgbnIsIHN0YXJ0LCBzaXplOworCisJbnIgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCXN0YXJ0ID0gdm1hLT52bV9wZ29mZjsKKwlzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCByZXNubykgPj4gUEFHRV9TSElGVDsKKwlpZiAoc3RhcnQgPCBzaXplICYmIHNpemUgLSBzdGFydCA+PSBucikKKwkJcmV0dXJuIDE7CisJV0FSTigxLCAicHJvY2VzcyBcIiVzXCIgdHJpZWQgdG8gbWFwIDB4JTA4bHgtMHglMDhseCBvbiAlcyBCQVIgJWQgKHNpemUgMHglMDhseClcbiIsCisJCWN1cnJlbnQtPmNvbW0sIHN0YXJ0LCBzdGFydCtuciwgcGNpX25hbWUocGRldiksIHJlc25vLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBwY2lfbW1hcF9yZXNvdXJjZSAtIG1hcCBhIFBDSSByZXNvdXJjZSBpbnRvIHVzZXIgbWVtb3J5IHNwYWNlCiAgKiBAa29iajoga29iamVjdCBmb3IgbWFwcGluZwpAQCAtNTEwLDYgKzUyNiw5IEBACiAJaWYgKGkgPj0gUENJX1JPTV9SRVNPVVJDRSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIXBjaV9tbWFwX2ZpdHMocGRldiwgaSwgdm1hKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBwY2lfbW1hcF9wYWdlX3JhbmdlKCkgZXhwZWN0cyB0aGUgc2FtZSBraW5kIG9mIGVudHJ5IGFzIGNvbWluZwogCSAqIGZyb20gL3Byb2MvYnVzL3BjaS8gd2hpY2ggaXMgYSAidXNlciB2aXNpYmxlIiB2YWx1ZS4gSWYgdGhpcyBpcwogCSAqIGRpZmZlcmVudCBmcm9tIHRoZSByZXNvdXJjZSBpdHNlbGYsIGFyY2ggd2lsbCBkbyBuZWNlc3NhcnkgZml4dXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDlhN2M5ZTEuLjg1MWY1YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC01MjcsNyArNTI3LDcgQEAKIAkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlsZF9kZXYsIGNoaWxkX3BvcyArIFBDSV9FWFBfREVWQ0FQLAogCQkJJnJlZzMyKTsKLQkJaWYgKCEocmVnMzIgJiBQQ0lfRVhQX0RFVkNBUF9SQkVSICYmICFhc3BtX2ZvcmNlKSkgeworCQlpZiAoIShyZWczMiAmIFBDSV9FWFBfREVWQ0FQX1JCRVIpICYmICFhc3BtX2ZvcmNlKSB7CiAJCQlwcmludGsoIlByZS0xLjEgUENJZSBkZXZpY2UgZGV0ZWN0ZWQsICIKIAkJCQkiZGlzYWJsZSBBU1BNIGZvciAlcy4gSXQgY2FuIGJlIGVuYWJsZWQgZm9yY2VkbHkiCiAJCQkJIiB3aXRoICdwY2llX2FzcG09Zm9yY2UnXG4iLCBwY2lfbmFtZShwZGV2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCBjY2UyZjRjLi5kZDkxNjFhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMzA0LDYgKzMwNCw5IEBACiAJCX0gZWxzZSB7CiAJCQlyZXMtPnN0YXJ0ID0gbDY0OwogCQkJcmVzLT5lbmQgPSBsNjQgKyBzejY0OworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogJXMgcmVnICV4IDY0Yml0IG1taW86IFslbGx4LCAlbGx4XVxuIiwKKwkJCQlwY2lfbmFtZShkZXYpLCBwb3MsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZW5kKTsKIAkJfQogCX0gZWxzZSB7CiAJCXN6ID0gcGNpX3NpemUobCwgc3osIG1hc2spOwpAQCAtMzEzLDYgKzMxNiw5IEBACiAKIAkJcmVzLT5zdGFydCA9IGw7CiAJCXJlcy0+ZW5kID0gbCArIHN6OworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiAlcyByZWcgJXggJXM6IFslbGx4LCAlbGx4XVxuIiwgcGNpX25hbWUoZGV2KSwKKwkJCXBvcywgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA/ICJpbyBwb3J0IjoiMzJiaXQgbW1pbyIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQpOwogCX0KIAogIG91dDoKQEAgLTM4Myw3ICszODksOSBAQAogCQkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCWlmICghcmVzLT5lbmQpCiAJCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmY7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogYnJpZGdlICVzIGlvIHBvcnQ6IFslbGx4LCAlbGx4XVxuIiwgcGNpX25hbWUoZGV2KSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBicmlkZ2UgJXMgaW8gcG9ydDogWyVsbHgsICVsbHhdXG4iLAorCQkJcGNpX25hbWUoZGV2KSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcy0+ZW5kKTsKIAl9CiAKIAlyZXMgPSBjaGlsZC0+cmVzb3VyY2VbMV07CkBAIC0zOTUsNyArNDAzLDkgQEAKIAkJcmVzLT5mbGFncyA9IChtZW1fYmFzZV9sbyAmIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLKSB8IElPUkVTT1VSQ0VfTUVNOwogCQlyZXMtPnN0YXJ0ID0gYmFzZTsKIAkJcmVzLT5lbmQgPSBsaW1pdCArIDB4ZmZmZmY7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogYnJpZGdlICVzIDMyYml0IG1taW86IFslbGx4LCAlbGx4XVxuIiwgcGNpX25hbWUoZGV2KSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBicmlkZ2UgJXMgMzJiaXQgbW1pbzogWyVsbHgsICVsbHhdXG4iLAorCQkJcGNpX25hbWUoZGV2KSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcy0+ZW5kKTsKIAl9CiAKIAlyZXMgPSBjaGlsZC0+cmVzb3VyY2VbMl07CkBAIC00MzEsNyArNDQxLDkgQEAKIAkJcmVzLT5mbGFncyA9IChtZW1fYmFzZV9sbyAmIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLKSB8IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSDsKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IGJyaWRnZSAlcyAlc2JpdCBtbWlvIHByZWY6IFslbGx4LCAlbGx4XVxuIiwgcGNpX25hbWUoZGV2KSwgKHJlcy0+ZmxhZ3MgJiBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0KT8iNjQiOiIzMiIscmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBicmlkZ2UgJXMgJXNiaXQgbW1pbyBwcmVmOiBbJWxseCwgJWxseF1cbiIsCisJCQlwY2lfbmFtZShkZXYpLCAocmVzLT5mbGFncyAmIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQpID8gIjY0IiA6ICIzMiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSByZXMtPnN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKSByZXMtPmVuZCk7CiAJfQogfQogCkBAIC0xMjI1LDggKzEyMzcsMTEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9zY2FuX2NoaWxkX2J1cyk7CiAjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQgcGNpX3NvcnRfYmZfY21wKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICphLCBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqYikKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zb3J0X2JmX2NtcChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkX2EsIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRfYikKIHsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldiAqYSA9IHRvX3BjaV9kZXYoZF9hKTsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldiAqYiA9IHRvX3BjaV9kZXYoZF9iKTsKKwogCWlmICAgICAgKHBjaV9kb21haW5fbnIoYS0+YnVzKSA8IHBjaV9kb21haW5fbnIoYi0+YnVzKSkgcmV0dXJuIC0xOwogCWVsc2UgaWYgKHBjaV9kb21haW5fbnIoYS0+YnVzKSA+IHBjaV9kb21haW5fbnIoYi0+YnVzKSkgcmV0dXJuICAxOwogCkBAIC0xMjM5LDUwICsxMjU0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFllcywgdGhpcyBmb3JjYWJseSBicmVha3MgdGhlIGtsaXN0IGFic3RyYWN0aW9uIHRlbXBvcmFyaWx5LiAgSXQKLSAqIGp1c3Qgd2FudHMgdG8gc29ydCB0aGUga2xpc3QsIG5vdCBjaGFuZ2UgcmVmZXJlbmNlIGNvdW50cyBhbmQKLSAqIHRha2UvZHJvcCBsb2NrcyByYXBpZGx5IGluIHRoZSBwcm9jZXNzLiAgSXQgZG9lcyBhbGwgdGhpcyB3aGlsZQotICogaG9sZGluZyB0aGUgbG9jayBmb3IgdGhlIGxpc3QsIHNvIG9iamVjdHMgY2FuJ3Qgb3RoZXJ3aXNlIGJlCi0gKiBhZGRlZC9yZW1vdmVkIHdoaWxlIHdlJ3JlIHN3aXp6bGluZy4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHBjaV9pbnNlcnRpb25fc29ydF9rbGlzdChzdHJ1Y3QgcGNpX2RldiAqYSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0Jc3RydWN0IGtsaXN0X25vZGUgKm47Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBwY2lfZGV2ICpiOwotCi0JbGlzdF9mb3JfZWFjaChwb3MsIGxpc3QpIHsKLQkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKLQkJYiA9IHRvX3BjaV9kZXYoZGV2KTsKLQkJaWYgKHBjaV9zb3J0X2JmX2NtcChhLCBiKSA8PSAwKSB7Ci0JCQlsaXN0X21vdmVfdGFpbCgmYS0+ZGV2Lmtub2RlX2J1cy5uX25vZGUsICZiLT5kZXYua25vZGVfYnVzLm5fbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbGlzdF9tb3ZlX3RhaWwoJmEtPmRldi5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKLX0KLQogdm9pZCBfX2luaXQgcGNpX3NvcnRfYnJlYWR0aGZpcnN0KHZvaWQpCiB7Ci0JTElTVF9IRUFEKHNvcnRlZF9kZXZpY2VzKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7Ci0Jc3RydWN0IGtsaXN0X25vZGUgKm47Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBrbGlzdCAqZGV2aWNlX2tsaXN0OwotCi0JZGV2aWNlX2tsaXN0ID0gYnVzX2dldF9kZXZpY2Vfa2xpc3QoJnBjaV9idXNfdHlwZSk7Ci0KLQlzcGluX2xvY2soJmRldmljZV9rbGlzdC0+a19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZkZXZpY2Vfa2xpc3QtPmtfbGlzdCkgewotCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7Ci0JCWRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOwotCQlwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCQlwY2lfaW5zZXJ0aW9uX3NvcnRfa2xpc3QocGRldiwgJnNvcnRlZF9kZXZpY2VzKTsKLQl9Ci0JbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZkZXZpY2Vfa2xpc3QtPmtfbG9jayk7CisJYnVzX3NvcnRfYnJlYWR0aGZpcnN0KCZwY2lfYnVzX3R5cGUsICZwY2lfc29ydF9iZl9jbXApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCA5MjM2ZTdmLi5lODcyYWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtMTU2MSw4ICsxNTYxLDcgQEAKIAkJaWYgKChmLT52ZW5kb3IgPT0gZGV2LT52ZW5kb3IgfHwgZi0+dmVuZG9yID09ICh1MTYpIFBDSV9BTllfSUQpICYmCiAgCQkgICAgKGYtPmRldmljZSA9PSBkZXYtPmRldmljZSB8fCBmLT5kZXZpY2UgPT0gKHUxNikgUENJX0FOWV9JRCkpIHsKICNpZmRlZiBERUJVRwotCQkJZGV2X2RiZygmZGV2LT5kZXYsICJjYWxsaW5nICIpOwotCQkJcHJpbnRfZm5fZGVzY3JpcHRvcl9zeW1ib2woIiVzXG4iLCBmLT5ob29rKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiY2FsbGluZyAlcEZcbiIsIGYtPmhvb2spOwogI2VuZGlmCiAJCQlmLT5ob29rKGRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggM2IzYjVmMS4uNGVkZmM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogICogdGltZS4KICAqLwogc3RydWN0IHBjaV9kZXYgKnBjaV9maW5kX2RldmljZSh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICpmcm9tKQorCQkJCXN0cnVjdCBwY2lfZGV2ICpmcm9tKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCkBAIC0yNjMsNyArMjYzLDcgQEAKICAqIHRoaXMgZmlsZS4KICAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2Rldl9ieV9pZChjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSkKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpmcm9tKQogewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZfc3RhcnQgPSBOVUxMOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAgKi8KIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X3N1YnN5cyh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXYgKmZyb20pCisJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKmZyb20pCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCAxYWFkNTk5Li5kNWUyMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtMzc4LDExICszNzgsMTAgQEAKIAlhbGlnbiA9IDA7CiAJbWluX2FsaWduID0gMDsKIAlmb3IgKG9yZGVyID0gMDsgb3JkZXIgPD0gbWF4X29yZGVyOyBvcmRlcisrKSB7Ci0jaWZkZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAotCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24xID0gMVVMTCA8PCAob3JkZXIgKyAyMCk7Ci0jZWxzZQotCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24xID0gMVUgPDwgKG9yZGVyICsgMjApOwotI2VuZGlmCisJCXJlc291cmNlX3NpemVfdCBhbGlnbjEgPSAxOworCisJCWFsaWduMSA8PD0gKG9yZGVyICsgMjApOworCiAJCWlmICghYWxpZ24pCiAJCQltaW5fYWxpZ24gPSBhbGlnbjE7CiAJCWVsc2UgaWYgKEFMSUdOKGFsaWduICsgbWluX2FsaWduLCBtaW5fYWxpZ24pIDwgYWxpZ24xKQpAQCAtNTQwLDcgKzUzOSwxMSBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVzOiAlMDJ4IGluZGV4ICV4ICVzOiBbJWxseCwgJWxseF1cbiIsIGJ1cy0+bnVtYmVyLCBpLCAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pPyAiaW8gcG9ydCI6Im1taW8iLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCXByaW50ayhLRVJOX0lORk8gImJ1czogJTAyeCBpbmRleCAleCAlczogWyVsbHgsICVsbHhdXG4iLAorCQkJYnVzLT5udW1iZXIsIGksCisJCQkocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDogIm1taW8iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcy0+ZW5kKTsKICAgICAgICAgfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCBlMGY4ODQwLi5mNTdlZWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTIyMCw3ICsyMjAsOCBAQAogCXRyaXN0YXRlICJQWEEyeHggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX1BYQSAmJiBQQ01DSUEKIAlkZXBlbmRzIG9uIChBUkNIX0xVQkJPQ0sgfHwgTUFDSF9NQUlOU1RPTkUgfHwgUFhBX1NIQVJQU0wgXAotCQkgICAgfHwgTUFDSF9BUk1DT1JFIHx8IEFSQ0hfUFhBX1BBTE0pCisJCSAgICB8fCBNQUNIX0FSTUNPUkUgfHwgQVJDSF9QWEFfUEFMTSB8fCBUUklaRVBTX1BDTUNJQSBcCisJCSAgICB8fCBBUkNIX1ZJUEVSKQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFhBMnh4IFBDTUNJQSBjb250cm9sbGVyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKaW5kZXggMjY5YTllOS4uYjQ2YzYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKQEAgLTIsMTAgKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBwY21jaWEgc3Vic3lzdGVtIChjL28gRGF2aWQgSGluZHMpCiAjCiAKLWlmZXEgKCQoQ09ORklHX1BDTUNJQV9ERUJVRykseSkKLUVYVFJBX0NGTEFHUyArPSAtRERFQlVHCi1lbmRpZgotCiBwY21jaWFfY29yZS15CQkJCQkrPSBjcy5vIGNpc3RwbC5vIHJzcmNfbWdyLm8gc29ja2V0X3N5c2ZzLm8KIHBjbWNpYV9jb3JlLSQoQ09ORklHX0NBUkRCVVMpCQkJKz0gY2FyZGJ1cy5vCiBvYmotJChDT05GSUdfUENDQVJEKQkJCQkrPSBwY21jaWFfY29yZS5vCkBAIC0yOSw3ICsyNSw2IEBACiBvYmotJChDT05GSUdfSEQ2NDQ2NV9QQ01DSUEpCQkJKz0gaGQ2NDQ2NV9zcy5vCiBvYmotJChDT05GSUdfUENNQ0lBX1NBMTEwMCkJCQkrPSBzYTExeHhfY29yZS5vIHNhMTEwMF9jcy5vCiBvYmotJChDT05GSUdfUENNQ0lBX1NBMTExMSkJCQkrPSBzYTExeHhfY29yZS5vIHNhMTExMV9jcy5vCi1vYmotJChDT05GSUdfUENNQ0lBX1BYQTJYWCkgICAgICAgICAgICAgICAgICAgICArPSBweGEyeHhfY29yZS5vIHB4YTJ4eF9jcy5vCiBvYmotJChDT05GSUdfTTMyUl9QQ0MpCQkJCSs9IG0zMnJfcGNjLm8KIG9iai0kKENPTkZJR19NMzJSX0NGQykJCQkJKz0gbTMycl9jZmMubwogb2JqLSQoQ09ORklHX1BDTUNJQV9BVTFYMDApCQkJKz0gYXUxeDAwX3NzLm8KQEAgLTY4LDkgKzYzLDE1IEBACiBzYTExMDBfY3MtJChDT05GSUdfU0ExMTAwX1NIQU5OT04pCQkrPSBzYTExMDBfc2hhbm5vbi5vCiBzYTExMDBfY3MtJChDT05GSUdfU0ExMTAwX1NJTVBBRCkJCSs9IHNhMTEwMF9zaW1wYWQubwogCi1weGEyeHhfY3MtJChDT05GSUdfQVJDSF9MVUJCT0NLKQkJKz0gcHhhMnh4X2x1YmJvY2subyBzYTExMTFfZ2VuZXJpYy5vCi1weGEyeHhfY3MtJChDT05GSUdfTUFDSF9NQUlOU1RPTkUpCQkrPSBweGEyeHhfbWFpbnN0b25lLm8KLXB4YTJ4eF9jcy0kKENPTkZJR19QWEFfU0hBUlBTTCkJCQkrPSBweGEyeHhfc2hhcnBzbC5vCi1weGEyeHhfY3MtJChDT05GSUdfTUFDSF9BUk1DT1JFKQkJKz0gcHhhMnh4X2NtX3gyNzAubwotcHhhMnh4X2NzLSQoQ09ORklHX01BQ0hfUEFMTVRYKQkJKz0gcHhhMnh4X3BhbG10eC5vCitweGEyeHhfbHViYm9ja19jcy15CQkJCSs9IHB4YTJ4eF9sdWJib2NrLm8gc2ExMTExX2dlbmVyaWMubworcHhhMnh4X2NtX3gyeHhfY3MteQkJCQkrPSBweGEyeHhfY21feDJ4eC5vIHB4YTJ4eF9jbV94MjU1Lm8gcHhhMnh4X2NtX3gyNzAubworcHhhMnh4LW9iai0kKENPTkZJR19BUkNIX0xVQkJPQ0spCQkrPSBweGEyeHhfbHViYm9ja19jcy5vCitweGEyeHgtb2JqLSQoQ09ORklHX01BQ0hfTUFJTlNUT05FKQkJKz0gcHhhMnh4X21haW5zdG9uZS5vCitweGEyeHgtb2JqLSQoQ09ORklHX1BYQV9TSEFSUFNMKQkJKz0gcHhhMnh4X3NoYXJwc2wubworcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX0FSTUNPUkUpCQkrPSBweGEyeHhfY21feDJ4eF9jcy5vCitweGEyeHgtb2JqLSQoQ09ORklHX0FSQ0hfVklQRVIpCQkJKz0gcHhhMnh4X3ZpcGVyLm8KK3B4YTJ4eC1vYmotJChDT05GSUdfVFJJWkVQU19QQ01DSUEpCQkrPSBweGEyeHhfdHJpemVwcy5vCitweGEyeHgtb2JqLSQoQ09ORklHX01BQ0hfUEFMTVRYKQkJKz0gcHhhMnh4X3BhbG10eC5vCitweGEyeHgtb2JqLSQoQ09ORklHX01BQ0hfUEFMTUxEKQkJKz0gcHhhMnh4X3BhbG1sZC5vCiAKK29iai0kKENPTkZJR19QQ01DSUFfUFhBMlhYKQkJCSs9IHB4YTJ4eF9jb3JlLm8gJChweGEyeHgtb2JqLXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYwppbmRleCA3NWU4Zjg1Li5mYzFkZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmMKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQlza3QtPnNwZF9pb1ttYXAtPm1hcF0gPSBzcGVlZDsKIAl9CiAKLQltYXAtPnN0YXJ0PShpb2FkZHJfdCkodTMyKXNrdC0+dmlydF9pbzsKKwltYXAtPnN0YXJ0PSh1bnNpZ25lZCBpbnQpKHUzMilza3QtPnZpcnRfaW87CiAJbWFwLT5zdG9wPW1hcC0+c3RhcnQrTUFQX1NJWkU7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmggYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCmluZGV4IGE1M2VmNTkuLjEzYTRmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmgKKysrIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuaApAQCAtMTE2LDcgKzExNiw3IEBACiAJc3RydWN0IHJlc291cmNlCQlyZXNfYXR0cjsKIAogCXZvaWQgKiAgICAgICAgICAgICAgICAgCXZpcnRfaW87Ci0JaW9hZGRyX3QgICAgICAgICAgICAgIAlwaHlzX2lvOworCXVuc2lnbmVkIGludAkJcGh5c19pbzsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgIAlwaHlzX2F0dHI7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAJcGh5c19tZW07CiAJdW5zaWduZWQgc2hvcnQgICAgICAgIAlzcGVlZF9pbywgc3BlZWRfYXR0ciwgc3BlZWRfbWVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jCmluZGV4IGFhMWNkNGQuLmQ2YjRiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfcGIxeDAwLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2J1c19vcHMuaD4KLSNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF94eHMxNTAwLmMKaW5kZXggOGE5YjE4Yy4uOTYyNzM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfeHhzMTUwMC5jCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgogI2luY2x1ZGUgPHBjbWNpYS9idXNfb3BzLmg+Ci0jaW5jbHVkZSAiY3NfaW50ZXJuYWwuaCIKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYyBiL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYwppbmRleCA5MTFjYTBlLi5kYjc3ZTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiAKIAlzLT5pcnEuQXNzaWduZWRJUlEgPSBzLT5wY2lfaXJxOwotCXJldHVybiBDU19TVUNDRVNTOworCXJldHVybiAwOwogfQogCiB2b2lkIGNiX2ZyZWUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwppbmRleCA2NTEyOWI1Li5kY2NlOWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwpAQCAtOTIsNyArOTIsOCBAQAogCWlmICghKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1NUQVRJQ19NQVApICYmIChtZW0tPnJlcyA9PSBOVUxMKSkgewogCQltZW0tPnJlcyA9IHBjbWNpYV9maW5kX21lbV9yZWdpb24oMCwgcy0+bWFwX3NpemUsIHMtPm1hcF9zaXplLCAwLCBzKTsKIAkJaWYgKG1lbS0+cmVzID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiY3M6IHVuYWJsZSB0byBtYXAgY2FyZCBtZW1vcnkhXG4iKTsKKwkJCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZzLT5kZXYsCisJCQkJICAgImNzOiB1bmFibGUgdG8gbWFwIGNhcmQgbWVtb3J5IVxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlzLT5jaXNfdmlydCA9IE5VTEw7CkBAIC0yNjUsMTMgKzI2NiwxMyBAQAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIHJlYWRfY2lzX2NhY2hlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwgdV9pbnQgYWRkciwKLQkJCSAgIHVfaW50IGxlbiwgdm9pZCAqcHRyKQorCQkJICAgc2l6ZV90IGxlbiwgdm9pZCAqcHRyKQogewogICAgIHN0cnVjdCBjaXNfY2FjaGVfZW50cnkgKmNpczsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKHMtPmZha2VfY2lzKSB7Ci0JaWYgKHMtPmZha2VfY2lzX2xlbiA+IGFkZHIrbGVuKQorCWlmIChzLT5mYWtlX2Npc19sZW4gPj0gYWRkcitsZW4pCiAJICAgIG1lbWNweShwdHIsIHMtPmZha2VfY2lzK2FkZHIsIGxlbik7CiAJZWxzZQogCSAgICBtZW1zZXQocHRyLCAweGZmLCBsZW4pOwpAQCAtMzUxLDcgKzM1Miw5IEBACiAKIAlidWYgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcy0+ZGV2LAorCQkJICAgIm5vIG1lbW9yeSBmb3IgdmVyaWZ5aW5nIENJU1xuIik7CisJCXJldHVybiAtRU5PTUVNOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2lzLCAmcy0+Y2lzX2NhY2hlLCBub2RlKSB7CiAJCWludCBsZW4gPSBjaXMtPmxlbjsKIApAQCAtMzgwLDE4ICszODMsMjIgQEAKICAgICAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1pbnQgcGNtY2lhX3JlcGxhY2VfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBjaXNkdW1wX3QgKmNpcykKK2ludCBwY21jaWFfcmVwbGFjZV9jaXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgY29uc3Qgc2l6ZV90IGxlbikKIHsKLSAgICBrZnJlZShzLT5mYWtlX2Npcyk7Ci0gICAgcy0+ZmFrZV9jaXMgPSBOVUxMOwotICAgIGlmIChjaXMtPkxlbmd0aCA+IENJU1RQTF9NQVhfQ0lTX1NJWkUpCi0JcmV0dXJuIENTX0JBRF9TSVpFOwotICAgIHMtPmZha2VfY2lzID0ga21hbGxvYyhjaXMtPkxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKHMtPmZha2VfY2lzID09IE5VTEwpCi0JcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKLSAgICBzLT5mYWtlX2Npc19sZW4gPSBjaXMtPkxlbmd0aDsKLSAgICBtZW1jcHkocy0+ZmFrZV9jaXMsIGNpcy0+RGF0YSwgY2lzLT5MZW5ndGgpOwotICAgIHJldHVybiBDU19TVUNDRVNTOworCWlmIChsZW4gPiBDSVNUUExfTUFYX0NJU19TSVpFKSB7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcy0+ZGV2LCAicmVwbGFjZW1lbnQgQ0lTIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJa2ZyZWUocy0+ZmFrZV9jaXMpOworCXMtPmZha2VfY2lzID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmIChzLT5mYWtlX2NpcyA9PSBOVUxMKSB7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcy0+ZGV2LCAibm8gbWVtb3J5IHRvIHJlcGxhY2UgQ0lTXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXMtPmZha2VfY2lzX2xlbiA9IGxlbjsKKwltZW1jcHkocy0+ZmFrZV9jaXMsIGRhdGEsIGxlbik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXBsYWNlX2Npcyk7CiAKQEAgLTQxOCw5ICs0MjUsOSBAQAogaW50IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgdHVwbGVfdCAqdHVwbGUpCiB7CiAgICAgaWYgKCFzKQotCXJldHVybiBDU19CQURfSEFORExFOworCXJldHVybiAtRUlOVkFMOwogICAgIGlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOworCXJldHVybiAtRU5PREVWOwogICAgIHR1cGxlLT5UdXBsZUxpbmsgPSB0dXBsZS0+RmxhZ3MgPSAwOwogI2lmZGVmIENPTkZJR19DQVJEQlVTCiAgICAgaWYgKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpIHsKQEAgLTQ0MCwxMCArNDQ3LDEwIEBACiAJISh0dXBsZS0+QXR0cmlidXRlcyAmIFRVUExFX1JFVFVSTl9DT01NT04pKSB7CiAJY2lzZGF0YV90IHJlcSA9IHR1cGxlLT5EZXNpcmVkVHVwbGU7CiAJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9MT05HTElOS19NRkM7Ci0JaWYgKHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBmdW5jdGlvbiwgdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKKwlpZiAocGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIGZ1bmN0aW9uLCB0dXBsZSkgPT0gMCkgewogCSAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0xJTktUQVJHRVQ7Ci0JICAgIGlmIChwY2NhcmRfZ2V0X25leHRfdHVwbGUocywgZnVuY3Rpb24sIHR1cGxlKSAhPSBDU19TVUNDRVNTKQotCQlyZXR1cm4gQ1NfTk9fTU9SRV9JVEVNUzsKKwkgICAgaWYgKHBjY2FyZF9nZXRfbmV4dF90dXBsZShzLCBmdW5jdGlvbiwgdHVwbGUpICE9IDApCisJCXJldHVybiAtRU5PU1BDOwogCX0gZWxzZQogCSAgICB0dXBsZS0+Q0lTT2Zmc2V0ID0gdHVwbGUtPlR1cGxlTGluayA9IDA7CiAJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IHJlcTsKQEAgLTQ5OCw5ICs1MDUsOSBAQAogICAgIGludCBvZnMsIGksIGF0dHI7CiAKICAgICBpZiAoIXMpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7CisJcmV0dXJuIC1FTk9ERVY7CiAKICAgICBsaW5rWzFdID0gdHVwbGUtPlR1cGxlTGluazsKICAgICBvZnMgPSB0dXBsZS0+Q0lTT2Zmc2V0ICsgdHVwbGUtPlR1cGxlTGluazsKQEAgLTUxOSw3ICs1MjYsNyBAQAogCS8qIEVuZCBvZiBjaGFpbj8gIEZvbGxvdyBsb25nIGxpbmsgaWYgcG9zc2libGUgKi8KIAlpZiAobGlua1swXSA9PSBDSVNUUExfRU5EKSB7CiAJICAgIGlmICgob2ZzID0gZm9sbG93X2xpbmsocywgdHVwbGUpKSA8IDApCi0JCXJldHVybiBDU19OT19NT1JFX0lURU1TOworCQlyZXR1cm4gLUVOT1NQQzsKIAkgICAgYXR0ciA9IFNQQUNFKHR1cGxlLT5GbGFncyk7CiAJICAgIHJlYWRfY2lzX2NhY2hlKHMsIGF0dHIsIG9mcywgMiwgbGluayk7CiAJfQpAQCAtNTc3LDEzICs1ODQsMTMgQEAKICAgICB9CiAgICAgaWYgKGkgPT0gTUFYX1RVUExFUykgewogCWNzX2RiZyhzLCAxLCAiY3M6IG92ZXJydW4gaW4gcGNtY2lhX2dldF9uZXh0X3R1cGxlXG4iKTsKLQlyZXR1cm4gQ1NfTk9fTU9SRV9JVEVNUzsKKwlyZXR1cm4gLUVOT1NQQzsKICAgICB9CiAgICAgCiAgICAgdHVwbGUtPlR1cGxlQ29kZSA9IGxpbmtbMF07CiAgICAgdHVwbGUtPlR1cGxlTGluayA9IGxpbmtbMV07CiAgICAgdHVwbGUtPkNJU09mZnNldCA9IG9mcyArIDI7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7CisgICAgcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBjY2FyZF9nZXRfbmV4dF90dXBsZSk7CiAKQEAgLTU5NiwxOCArNjAzLDE4IEBACiAgICAgdV9pbnQgbGVuOwogCiAgICAgaWYgKCFzKQotCXJldHVybiBDU19CQURfSEFORExFOworCXJldHVybiAtRUlOVkFMOwogCiAgICAgaWYgKHR1cGxlLT5UdXBsZUxpbmsgPCB0dXBsZS0+VHVwbGVPZmZzZXQpCi0JcmV0dXJuIENTX05PX01PUkVfSVRFTVM7CisJcmV0dXJuIC1FTk9TUEM7CiAgICAgbGVuID0gdHVwbGUtPlR1cGxlTGluayAtIHR1cGxlLT5UdXBsZU9mZnNldDsKICAgICB0dXBsZS0+VHVwbGVEYXRhTGVuID0gdHVwbGUtPlR1cGxlTGluazsKICAgICBpZiAobGVuID09IDApCi0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiAgICAgcmVhZF9jaXNfY2FjaGUocywgU1BBQ0UodHVwbGUtPkZsYWdzKSwKIAkJICAgdHVwbGUtPkNJU09mZnNldCArIHR1cGxlLT5UdXBsZU9mZnNldCwKIAkJICAgX01JTihsZW4sIHR1cGxlLT5UdXBsZURhdGFNYXgpLCB0dXBsZS0+VHVwbGVEYXRhKTsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKKyAgICByZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocGNjYXJkX2dldF90dXBsZV9kYXRhKTsKIApAQCAtNjQwLDI1ICs2NDcsMzEgQEAKIAljYXNlIDM6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMTUwOyBicmVhazsKIAljYXNlIDQ6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMTAwOyBicmVhazsKIAljYXNlIDc6Ci0JICAgIGlmICgrK3AgPT0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwkgICAgaWYgKCsrcCA9PSBxKQorCQkgICAgcmV0dXJuIC1FSU5WQUw7CiAJICAgIGRldmljZS0+ZGV2W2ldLnNwZWVkID0gU1BFRURfQ1ZUKCpwKTsKIAkgICAgd2hpbGUgKCpwICYgMHg4MCkKLQkJaWYgKCsrcCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCQlpZiAoKytwID09IHEpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkgICAgYnJlYWs7CiAJZGVmYXVsdDoKLQkgICAgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCsrcCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOwotCWlmICgqcCA9PSAweGZmKSBicmVhazsKKwlpZiAoKytwID09IHEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqcCA9PSAweGZmKQorCQlicmVhazsKIAlzY2FsZSA9ICpwICYgNzsKLQlpZiAoc2NhbGUgPT0gNykgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlpZiAoc2NhbGUgPT0gNykKKwkJcmV0dXJuIC1FSU5WQUw7CiAJZGV2aWNlLT5kZXZbaV0uc2l6ZSA9ICgoKnAgPj4gMykgKyAxKSAqICg1MTIgPDwgKHNjYWxlKjIpKTsKIAlkZXZpY2UtPm5kZXYrKzsKLQlpZiAoKytwID09IHEpIGJyZWFrOworCWlmICgrK3AgPT0gcSkKKwkJYnJlYWs7CiAgICAgfQogICAgIAotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTY2NywxMiArNjgwLDEyIEBACiB7CiAgICAgdV9jaGFyICpwOwogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuIDwgNSkKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIHAgPSAodV9jaGFyICopIHR1cGxlLT5UdXBsZURhdGE7CiAgICAgY3N1bS0+YWRkciA9IHR1cGxlLT5DSVNPZmZzZXQgKyBnZXRfdW5hbGlnbmVkX2xlMTYocCkgLSAyOwogICAgIGNzdW0tPmxlbiA9IGdldF91bmFsaWduZWRfbGUxNihwICsgMik7CiAgICAgY3N1bS0+c3VtID0gKihwICsgNCk7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNjgwLDkgKzY5Myw5IEBACiBzdGF0aWMgaW50IHBhcnNlX2xvbmdsaW5rKHR1cGxlX3QgKnR1cGxlLCBjaXN0cGxfbG9uZ2xpbmtfdCAqbGluaykKIHsKICAgICBpZiAodHVwbGUtPlR1cGxlRGF0YUxlbiA8IDQpCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICBsaW5rLT5hZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHR1cGxlLT5UdXBsZURhdGEpOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTY5NywxMyArNzEwLDEzIEBACiAgICAgCiAgICAgbGluay0+bmZuID0gKnA7IHArKzsKICAgICBpZiAodHVwbGUtPlR1cGxlRGF0YUxlbiA8PSBsaW5rLT5uZm4qNSkKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIGZvciAoaSA9IDA7IGkgPCBsaW5rLT5uZm47IGkrKykgewogCWxpbmstPmZuW2ldLnNwYWNlID0gKnA7IHArKzsKIAlsaW5rLT5mbltpXS5hZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApOwogCXAgKz0gNDsKICAgICB9Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNzEzLDI0ICs3MjYsMjcgQEAKIHsKICAgICBpbnQgaSwgaiwgbnM7CiAKLSAgICBpZiAocCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworICAgIGlmIChwID09IHEpCisJICAgIHJldHVybiAtRUlOVkFMOwogICAgIG5zID0gMDsgaiA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JaWYgKCpwID09IDB4ZmYpIGJyZWFrOworCWlmICgqcCA9PSAweGZmKQorCQlicmVhazsKIAlvZnNbaV0gPSBqOwogCW5zKys7CiAJZm9yICg7OykgewogCSAgICBzW2orK10gPSAoKnAgPT0gMHhmZikgPyAnXDAnIDogKnA7CiAJICAgIGlmICgoKnAgPT0gJ1wwJykgfHwgKCpwID09IDB4ZmYpKSBicmVhazsKLQkgICAgaWYgKCsrcCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCSAgICBpZiAoKytwID09IHEpCisJCSAgICByZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKCgqcCA9PSAweGZmKSB8fCAoKytwID09IHEpKSBicmVhazsKICAgICB9CiAgICAgaWYgKGZvdW5kKSB7CiAJKmZvdW5kID0gbnM7Ci0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKLQlyZXR1cm4gKG5zID09IG1heCkgPyBDU19TVUNDRVNTIDogQ1NfQkFEX1RVUExFOworCXJldHVybiAobnMgPT0gbWF4KSA/IDAgOiAtRUlOVkFMOwogICAgIH0KIH0KIApAQCAtNzQ1LDcgKzc2MSw4IEBACiAgICAgCiAgICAgdmVyc18xLT5tYWpvciA9ICpwOyBwKys7CiAgICAgdmVyc18xLT5taW5vciA9ICpwOyBwKys7Ci0gICAgaWYgKHAgPj0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKyAgICBpZiAocCA+PSBxKQorCSAgICByZXR1cm4gLUVJTlZBTDsKIAogICAgIHJldHVybiBwYXJzZV9zdHJpbmdzKHAsIHEsIENJU1RQTF9WRVJTXzFfTUFYX1BST0RfU1RSSU5HUywKIAkJCSB2ZXJzXzEtPnN0ciwgdmVyc18xLT5vZnMsICZ2ZXJzXzEtPm5zKTsKQEAgLTc4MSw3ICs3OTgsNyBAQAogCXAgKz0gMjsKICAgICB9CiAgICAgamVkZWMtPm5pZCA9IG5pZDsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKKyAgICByZXR1cm4gMDsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC03ODksMTAgKzgwNiwxMCBAQAogc3RhdGljIGludCBwYXJzZV9tYW5maWQodHVwbGVfdCAqdHVwbGUsIGNpc3RwbF9tYW5maWRfdCAqbSkKIHsKICAgICBpZiAodHVwbGUtPlR1cGxlRGF0YUxlbiA8IDQpCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICBtLT5tYW5mID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHR1cGxlLT5UdXBsZURhdGEpOwogICAgIG0tPmNhcmQgPSBnZXRfdW5hbGlnbmVkX2xlMTYodHVwbGUtPlR1cGxlRGF0YSArIDIpOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgwMSwxMSArODE4LDExIEBACiB7CiAgICAgdV9jaGFyICpwOwogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuIDwgMikKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIHAgPSAodV9jaGFyICopdHVwbGUtPlR1cGxlRGF0YTsKICAgICBmLT5mdW5jID0gcFswXTsKICAgICBmLT5zeXNpbml0ID0gcFsxXTsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKKyAgICByZXR1cm4gMDsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC04MTUsMTIgKzgzMiwxMiBAQAogICAgIHVfY2hhciAqcDsKICAgICBpbnQgaTsKICAgICBpZiAodHVwbGUtPlR1cGxlRGF0YUxlbiA8IDEpCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICBwID0gKHVfY2hhciAqKXR1cGxlLT5UdXBsZURhdGE7CiAgICAgZi0+dHlwZSA9IHBbMF07CiAgICAgZm9yIChpID0gMTsgaSA8IHR1cGxlLT5UdXBsZURhdGFMZW47IGkrKykKIAlmLT5kYXRhW2ktMV0gPSBwW2ldOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgzNCw3ICs4NTEsNyBAQAogICAgIHJhc3ogPSAqcCAmIDB4MDM7CiAgICAgcm1zeiA9ICgqcCAmIDB4M2MpID4+IDI7CiAgICAgaWYgKHR1cGxlLT5UdXBsZURhdGFMZW4gPCByYXN6K3Jtc3orNCkKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIGNvbmZpZy0+bGFzdF9pZHggPSAqKCsrcCk7CiAgICAgcCsrOwogICAgIGNvbmZpZy0+YmFzZSA9IDA7CkBAIC04NDYsNyArODYzLDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDw9IHJtc3o7IGkrKykKIAljb25maWctPnJtYXNrW2k+PjJdICs9IHBbaV0gPDwgKDgqKGklNCkpOwogICAgIGNvbmZpZy0+c3VidHVwbGVzID0gdHVwbGUtPlR1cGxlRGF0YUxlbiAtIChyYXN6K3Jtc3orNCk7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTAwMiwxMCArMTAxOSwxMiBAQAogCiBzdGF0aWMgdV9jaGFyICpwYXJzZV9pcnEodV9jaGFyICpwLCB1X2NoYXIgKnEsIGNpc3RwbF9pcnFfdCAqaXJxKQogewotICAgIGlmIChwID09IHEpIHJldHVybiBOVUxMOworICAgIGlmIChwID09IHEpCisJICAgIHJldHVybiBOVUxMOwogICAgIGlycS0+SVJRSW5mbzEgPSAqcDsgcCsrOwogICAgIGlmIChpcnEtPklSUUluZm8xICYgSVJRX0lORk8yX1ZBTElEKSB7Ci0JaWYgKHArMiA+IHEpIHJldHVybiBOVUxMOworCWlmIChwKzIgPiBxKQorCQlyZXR1cm4gTlVMTDsKIAlpcnEtPklSUUluZm8yID0gKHBbMV08PDgpICsgcFswXTsKIAlwICs9IDI7CiAgICAgfQpAQCAtMTAyNiw3ICsxMDQ1LDggQEAKICAgICBpZiAoKnAgJiAweDQwKQogCWVudHJ5LT5mbGFncyB8PSBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUOwogICAgIGlmICgqcCAmIDB4ODApIHsKLQlpZiAoKytwID09IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKCsrcCA9PSBxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKnAgJiAweDEwKQogCSAgICBlbnRyeS0+ZmxhZ3MgfD0gQ0lTVFBMX0NGVEFCTEVfQlZEUzsKIAlpZiAoKnAgJiAweDIwKQpAQCAtMTA0MCwzMCArMTA2MCwzNSBAQAogCWVudHJ5LT5pbnRlcmZhY2UgPSAwOwogCiAgICAgLyogUHJvY2VzcyBvcHRpb25hbCBmZWF0dXJlcyAqLwotICAgIGlmICgrK3AgPT0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKyAgICBpZiAoKytwID09IHEpCisJICAgIHJldHVybiAtRUlOVkFMOwogICAgIGZlYXR1cmVzID0gKnA7IHArKzsKIAogICAgIC8qIFBvd2VyIG9wdGlvbnMgKi8KICAgICBpZiAoKGZlYXR1cmVzICYgMykgPiAwKSB7CiAJcCA9IHBhcnNlX3Bvd2VyKHAsIHEsICZlbnRyeS0+dmNjKTsKLQlpZiAocCA9PSBOVUxMKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOwogICAgIH0gZWxzZQogCWVudHJ5LT52Y2MucHJlc2VudCA9IDA7CiAgICAgaWYgKChmZWF0dXJlcyAmIDMpID4gMSkgewogCXAgPSBwYXJzZV9wb3dlcihwLCBxLCAmZW50cnktPnZwcDEpOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgfSBlbHNlCiAJZW50cnktPnZwcDEucHJlc2VudCA9IDA7CiAgICAgaWYgKChmZWF0dXJlcyAmIDMpID4gMikgewogCXAgPSBwYXJzZV9wb3dlcihwLCBxLCAmZW50cnktPnZwcDIpOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgfSBlbHNlCiAJZW50cnktPnZwcDIucHJlc2VudCA9IDA7CiAKICAgICAvKiBUaW1pbmcgb3B0aW9ucyAqLwogICAgIGlmIChmZWF0dXJlcyAmIDB4MDQpIHsKIAlwID0gcGFyc2VfdGltaW5nKHAsIHEsICZlbnRyeS0+dGltaW5nKTsKLQlpZiAocCA9PSBOVUxMKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOwogICAgIH0gZWxzZSB7CiAJZW50cnktPnRpbWluZy53YWl0ID0gMDsKIAllbnRyeS0+dGltaW5nLnJlYWR5ID0gMDsKQEAgLTEwNzMsMTQgKzEwOTgsMTYgQEAKICAgICAvKiBJL08gd2luZG93IG9wdGlvbnMgKi8KICAgICBpZiAoZmVhdHVyZXMgJiAweDA4KSB7CiAJcCA9IHBhcnNlX2lvKHAsIHEsICZlbnRyeS0+aW8pOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgfSBlbHNlCiAJZW50cnktPmlvLm53aW4gPSAwOwogICAgIAogICAgIC8qIEludGVycnVwdCBvcHRpb25zICovCiAgICAgaWYgKGZlYXR1cmVzICYgMHgxMCkgewogCXAgPSBwYXJzZV9pcnEocCwgcSwgJmVudHJ5LT5pcnEpOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgfSBlbHNlCiAJZW50cnktPmlycS5JUlFJbmZvMSA9IDA7CiAKQEAgLTEwOTQsNyArMTEyMSw4IEBACiAJZW50cnktPm1lbS53aW5bMF0uY2FyZF9hZGRyID0gMDsKIAllbnRyeS0+bWVtLndpblswXS5ob3N0X2FkZHIgPSAwOwogCXAgKz0gMjsKLQlpZiAocCA+IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPiBxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlicmVhazsKICAgICBjYXNlIDB4NDA6CiAJZW50cnktPm1lbS5ud2luID0gMTsKQEAgLTExMDIsMjYgKzExMzAsMzAgQEAKIAllbnRyeS0+bWVtLndpblswXS5jYXJkX2FkZHIgPSBnZXRfdW5hbGlnbmVkX2xlMTYocCArIDIpIDw8IDg7CiAJZW50cnktPm1lbS53aW5bMF0uaG9zdF9hZGRyID0gMDsKIAlwICs9IDQ7Ci0JaWYgKHAgPiBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID4gcSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJYnJlYWs7CiAgICAgY2FzZSAweDYwOgogCXAgPSBwYXJzZV9tZW0ocCwgcSwgJmVudHJ5LT5tZW0pOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJYnJlYWs7CiAgICAgfQogCiAgICAgLyogTWlzYyBmZWF0dXJlcyAqLwogICAgIGlmIChmZWF0dXJlcyAmIDB4ODApIHsKLQlpZiAocCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID09IHEpCisJCXJldHVybiAtRUlOVkFMOwogCWVudHJ5LT5mbGFncyB8PSAoKnAgPDwgOCk7CiAJd2hpbGUgKCpwICYgMHg4MCkKLQkgICAgaWYgKCsrcCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCSAgICBpZiAoKytwID09IHEpCisJCSAgICByZXR1cm4gLUVJTlZBTDsKIAlwKys7CiAgICAgfQogCiAgICAgZW50cnktPnN1YnR1cGxlcyA9IHEtcDsKICAgICAKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKKyAgICByZXR1cm4gMDsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xMTMyLDEyICsxMTY0LDEyIEBACiB7CiAgICAgdV9jaGFyICpwOwogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuIDwgNikKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIHAgPSAodV9jaGFyICopdHVwbGUtPlR1cGxlRGF0YTsKICAgICBiYXItPmF0dHIgPSAqcDsKICAgICBwICs9IDI7CiAgICAgYmFyLT5zaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19jYih0dXBsZV90ICp0dXBsZSwgY2lzdHBsX2NvbmZpZ190ICpjb25maWcpCkBAIC0xMTQ2LDEyICsxMTc4LDEyIEBACiAgICAgCiAgICAgcCA9ICh1X2NoYXIgKil0dXBsZS0+VHVwbGVEYXRhOwogICAgIGlmICgoKnAgIT0gMykgfHwgKHR1cGxlLT5UdXBsZURhdGFMZW4gPCA2KSkKLQlyZXR1cm4gQ1NfQkFEX1RVUExFOworCXJldHVybiAtRUlOVkFMOwogICAgIGNvbmZpZy0+bGFzdF9pZHggPSAqKCsrcCk7CiAgICAgcCsrOwogICAgIGNvbmZpZy0+YmFzZSA9IGdldF91bmFsaWduZWRfbGUzMihwKTsKICAgICBjb25maWctPnN1YnR1cGxlcyA9IHR1cGxlLT5UdXBsZURhdGFMZW4gLSA2OwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBhcnNlX2NmdGFibGVfZW50cnlfY2IodHVwbGVfdCAqdHVwbGUsCkBAIC0xMTY3LDI5ICsxMTk5LDM0IEBACiAJZW50cnktPmZsYWdzIHw9IENJU1RQTF9DRlRBQkxFX0RFRkFVTFQ7CiAKICAgICAvKiBQcm9jZXNzIG9wdGlvbmFsIGZlYXR1cmVzICovCi0gICAgaWYgKCsrcCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworICAgIGlmICgrK3AgPT0gcSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgZmVhdHVyZXMgPSAqcDsgcCsrOwogCiAgICAgLyogUG93ZXIgb3B0aW9ucyAqLwogICAgIGlmICgoZmVhdHVyZXMgJiAzKSA+IDApIHsKIAlwID0gcGFyc2VfcG93ZXIocCwgcSwgJmVudHJ5LT52Y2MpOwotCWlmIChwID09IE5VTEwpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgfSBlbHNlCiAJZW50cnktPnZjYy5wcmVzZW50ID0gMDsKICAgICBpZiAoKGZlYXR1cmVzICYgMykgPiAxKSB7CiAJcCA9IHBhcnNlX3Bvd2VyKHAsIHEsICZlbnRyeS0+dnBwMSk7Ci0JaWYgKHAgPT0gTlVMTCkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKICAgICB9IGVsc2UKIAllbnRyeS0+dnBwMS5wcmVzZW50ID0gMDsKICAgICBpZiAoKGZlYXR1cmVzICYgMykgPiAyKSB7CiAJcCA9IHBhcnNlX3Bvd2VyKHAsIHEsICZlbnRyeS0+dnBwMik7Ci0JaWYgKHAgPT0gTlVMTCkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKICAgICB9IGVsc2UKIAllbnRyeS0+dnBwMi5wcmVzZW50ID0gMDsKIAogICAgIC8qIEkvTyB3aW5kb3cgb3B0aW9ucyAqLwogICAgIGlmIChmZWF0dXJlcyAmIDB4MDgpIHsKLQlpZiAocCA9PSBxKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID09IHEpCisJCXJldHVybiAtRUlOVkFMOwogCWVudHJ5LT5pbyA9ICpwOyBwKys7CiAgICAgfSBlbHNlCiAJZW50cnktPmlvID0gMDsKQEAgLTExOTcsMzIgKzEyMzQsMzcgQEAKICAgICAvKiBJbnRlcnJ1cHQgb3B0aW9ucyAqLwogICAgIGlmIChmZWF0dXJlcyAmIDB4MTApIHsKIAlwID0gcGFyc2VfaXJxKHAsIHEsICZlbnRyeS0+aXJxKTsKLQlpZiAocCA9PSBOVUxMKSByZXR1cm4gQ1NfQkFEX1RVUExFOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOwogICAgIH0gZWxzZQogCWVudHJ5LT5pcnEuSVJRSW5mbzEgPSAwOwogCiAgICAgaWYgKGZlYXR1cmVzICYgMHgyMCkgewotCWlmIChwID09IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gcSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJZW50cnktPm1lbSA9ICpwOyBwKys7CiAgICAgfSBlbHNlCiAJZW50cnktPm1lbSA9IDA7CiAKICAgICAvKiBNaXNjIGZlYXR1cmVzICovCiAgICAgaWYgKGZlYXR1cmVzICYgMHg4MCkgewotCWlmIChwID09IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisJaWYgKHAgPT0gcSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJZW50cnktPmZsYWdzIHw9ICgqcCA8PCA4KTsKIAlpZiAoKnAgJiAweDgwKSB7Ci0JICAgIGlmICgrK3AgPT0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwkgICAgaWYgKCsrcCA9PSBxKQorCQkgICAgcmV0dXJuIC1FSU5WQUw7CiAJICAgIGVudHJ5LT5mbGFncyB8PSAoKnAgPDwgMTYpOwogCX0KIAl3aGlsZSAoKnAgJiAweDgwKQotCSAgICBpZiAoKytwID09IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisJICAgIGlmICgrK3AgPT0gcSkKKwkJICAgIHJldHVybiAtRUlOVkFMOwogCXArKzsKICAgICB9CiAKICAgICBlbnRyeS0+c3VidHVwbGVzID0gcS1wOwogICAgIAotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTEyNDgsNyArMTI5MCw3IEBACiAJcCArPSA2OwogICAgIH0KICAgICBnZW8tPm5nZW8gPSBuOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTEyNTgsNyArMTMwMCw3IEBACiAgICAgdV9jaGFyICpwLCAqcTsKIAogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuIDwgMTApCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICAKICAgICBwID0gdHVwbGUtPlR1cGxlRGF0YTsKICAgICBxID0gcCArIHR1cGxlLT5UdXBsZURhdGFMZW47CkBAIC0xMjgyLDE1ICsxMzI0LDE4IEBACiAgICAgCiAgICAgcCA9IHR1cGxlLT5UdXBsZURhdGE7CiAgICAgcSA9IHAgKyB0dXBsZS0+VHVwbGVEYXRhTGVuOwotICAgIGlmIChwID09IHEpIHJldHVybiBDU19CQURfVFVQTEU7CisgICAgaWYgKHAgPT0gcSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgb3JnLT5kYXRhX29yZyA9ICpwOwotICAgIGlmICgrK3AgPT0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKyAgICBpZiAoKytwID09IHEpCisJICAgIHJldHVybiAtRUlOVkFMOwogICAgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CiAJb3JnLT5kZXNjW2ldID0gKnA7CiAJaWYgKCpwID09ICdcMCcpIGJyZWFrOwotCWlmICgrK3AgPT0gcSkgcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlpZiAoKytwID09IHEpCisJCXJldHVybiAtRUlOVkFMOwogICAgIH0KLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKKyAgICByZXR1cm4gMDsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xMzAwLDcgKzEzNDUsNyBAQAogICAgIHVfY2hhciAqcDsKIAogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuIDwgMTApCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKIAogICAgIHAgPSB0dXBsZS0+VHVwbGVEYXRhOwogCkBAIC0xMzA5LDE3ICsxMzU0LDE3IEBACiAgICAgZm10LT5vZmZzZXQgPSBnZXRfdW5hbGlnbmVkX2xlMzIocCArIDIpOwogICAgIGZtdC0+bGVuZ3RoID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHAgKyA2KTsKIAotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotaW50IHBjY2FyZF9wYXJzZV90dXBsZSh0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCitpbnQgcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKIHsKLSAgICBpbnQgcmV0ID0gQ1NfU1VDQ0VTUzsKKyAgICBpbnQgcmV0ID0gMDsKICAgICAKICAgICBpZiAodHVwbGUtPlR1cGxlRGF0YUxlbiA+IHR1cGxlLT5UdXBsZURhdGFNYXgpCi0JcmV0dXJuIENTX0JBRF9UVVBMRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICBzd2l0Y2ggKHR1cGxlLT5UdXBsZUNvZGUpIHsKICAgICBjYXNlIENJU1RQTF9ERVZJQ0U6CiAgICAgY2FzZSBDSVNUUExfREVWSUNFX0E6CkBAIC0xMzg3LDE1ICsxNDMyLDE3IEBACiAJYnJlYWs7CiAgICAgY2FzZSBDSVNUUExfTk9fTElOSzoKICAgICBjYXNlIENJU1RQTF9MSU5LVEFSR0VUOgotCXJldCA9IENTX1NVQ0NFU1M7CisJcmV0ID0gMDsKIAlicmVhazsKICAgICBkZWZhdWx0OgotCXJldCA9IENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworCXJldCA9IC1FSU5WQUw7CiAJYnJlYWs7CiAgICAgfQorICAgIGlmIChyZXQpCisJICAgIF9fY3NfZGJnKDAsICJwYXJzZV90dXBsZSBmYWlsZWQgJWRcbiIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wocGNjYXJkX3BhcnNlX3R1cGxlKTsKK0VYUE9SVF9TWU1CT0wocGNtY2lhX3BhcnNlX3R1cGxlKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE0MTAsMTggKzE0NTcsMjIgQEAKICAgICBpbnQgcmV0OwogCiAgICAgYnVmID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOwotICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOworICAgIGlmIChidWYgPT0gTlVMTCkgeworCSAgICBkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnMtPmRldiwgIm5vIG1lbW9yeSB0byByZWFkIHR1cGxlXG4iKTsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IGNvZGU7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CiAgICAgcmV0ID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBmdW5jdGlvbiwgJnR1cGxlKTsKLSAgICBpZiAocmV0ICE9IENTX1NVQ0NFU1MpIGdvdG8gZG9uZTsKKyAgICBpZiAocmV0ICE9IDApCisJICAgIGdvdG8gZG9uZTsKICAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKICAgICByZXQgPSBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocywgJnR1cGxlKTsKLSAgICBpZiAocmV0ICE9IENTX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLSAgICByZXQgPSBwY2NhcmRfcGFyc2VfdHVwbGUoJnR1cGxlLCBwYXJzZSk7CisgICAgaWYgKHJldCAhPSAwKQorCSAgICBnb3RvIGRvbmU7CisgICAgcmV0ID0gcGNtY2lhX3BhcnNlX3R1cGxlKCZ0dXBsZSwgcGFyc2UpOwogZG9uZToKICAgICBrZnJlZShidWYpOwogICAgIHJldHVybiByZXQ7CkBAIC0xNDQ2LDM3ICsxNDk3LDQwIEBACiAgICAgaW50IHJldCwgcmVzZXJ2ZWQsIGRldl9vayA9IDAsIGlkZW50X29rID0gMDsKIAogICAgIGlmICghcykKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlyZXR1cm4gLUVJTlZBTDsKIAogICAgIHR1cGxlID0ga21hbGxvYyhzaXplb2YoKnR1cGxlKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKHR1cGxlID09IE5VTEwpCi0JcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkgeworCSAgICBkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnMtPmRldiwgIm5vIG1lbW9yeSB0byB2YWxpZGF0ZSBDSVNcbiIpOworCSAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CiAgICAgcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewotCWtmcmVlKHR1cGxlKTsKLQlyZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOworCSAgICBrZnJlZSh0dXBsZSk7CisJICAgIGRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcy0+ZGV2LCAibm8gbWVtb3J5IHRvIHZhbGlkYXRlIENJU1xuIik7CisJICAgIHJldHVybiAtRU5PTUVNOwogICAgIH0KIAogICAgIGNvdW50ID0gcmVzZXJ2ZWQgPSAwOwogICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBSRVRVUk5fRklSU1RfVFVQTEU7CiAgICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwogICAgIHJldCA9IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocywgZnVuY3Rpb24sIHR1cGxlKTsKLSAgICBpZiAocmV0ICE9IENTX1NVQ0NFU1MpCisgICAgaWYgKHJldCAhPSAwKQogCWdvdG8gZG9uZTsKIAogICAgIC8qIEZpcnN0IHR1cGxlIHNob3VsZCBiZSBERVZJQ0U7IHdlIHNob3VsZCByZWFsbHkgaGF2ZSBlaXRoZXIgdGhhdAogICAgICAgIG9yIGEgQ0ZUQUJMRV9FTlRSWSBvZiBzb21lIHNvcnQgKi8KICAgICBpZiAoKHR1cGxlLT5UdXBsZUNvZGUgPT0gQ0lTVFBMX0RFVklDRSkgfHwKLQkocGNjYXJkX3JlYWRfdHVwbGUocywgZnVuY3Rpb24sIENJU1RQTF9DRlRBQkxFX0VOVFJZLCBwKSA9PSBDU19TVUNDRVNTKSB8fAotCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX0NGVEFCTEVfRU5UUllfQ0IsIHApID09IENTX1NVQ0NFU1MpKQorCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX0NGVEFCTEVfRU5UUlksIHApID09IDApIHx8CisJKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGZ1bmN0aW9uLCBDSVNUUExfQ0ZUQUJMRV9FTlRSWV9DQiwgcCkgPT0gMCkpCiAJZGV2X29rKys7CiAKICAgICAvKiBBbGwgY2FyZHMgc2hvdWxkIGhhdmUgYSBNQU5GSUQgdHVwbGUsIGFuZC9vciBhIFZFUlNfMSBvciBWRVJTXzIKICAgICAgICB0dXBsZSwgZm9yIGNhcmQgaWRlbnRpZmljYXRpb24uICBDZXJ0YWluIG9sZCBELUxpbmsgYW5kIExpbmtzeXMKICAgICAgICBjYXJkcyBoYXZlIG9ubHkgYSBicm9rZW4gVkVSU18yIHR1cGxlOyBoZW5jZSB0aGUgYm9ndXMgdGVzdC4gKi8KLSAgICBpZiAoKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGZ1bmN0aW9uLCBDSVNUUExfTUFORklELCBwKSA9PSBDU19TVUNDRVNTKSB8fAotCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX1ZFUlNfMSwgcCkgPT0gQ1NfU1VDQ0VTUykgfHwKLQkocGNjYXJkX3JlYWRfdHVwbGUocywgZnVuY3Rpb24sIENJU1RQTF9WRVJTXzIsIHApICE9IENTX05PX01PUkVfSVRFTVMpKQorICAgIGlmICgocGNjYXJkX3JlYWRfdHVwbGUocywgZnVuY3Rpb24sIENJU1RQTF9NQU5GSUQsIHApID09IDApIHx8CisJKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGZ1bmN0aW9uLCBDSVNUUExfVkVSU18xLCBwKSA9PSAwKSB8fAorCShwY2NhcmRfcmVhZF90dXBsZShzLCBmdW5jdGlvbiwgQ0lTVFBMX1ZFUlNfMiwgcCkgIT0gLUVOT1NQQykpCiAJaWRlbnRfb2srKzsKIAogICAgIGlmICghZGV2X29rICYmICFpZGVudF9vaykKQEAgLTE0ODQsNyArMTUzOCw4IEBACiAKICAgICBmb3IgKGNvdW50ID0gMTsgY291bnQgPCBNQVhfVFVQTEVTOyBjb3VudCsrKSB7CiAJcmV0ID0gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIGZ1bmN0aW9uLCB0dXBsZSk7Ci0JaWYgKHJldCAhPSBDU19TVUNDRVNTKSBicmVhazsKKwlpZiAocmV0ICE9IDApCisJCWJyZWFrOwogCWlmICgoKHR1cGxlLT5UdXBsZUNvZGUgPiAweDIzKSAmJiAodHVwbGUtPlR1cGxlQ29kZSA8IDB4NDApKSB8fAogCSAgICAoKHR1cGxlLT5UdXBsZUNvZGUgPiAweDQ3KSAmJiAodHVwbGUtPlR1cGxlQ29kZSA8IDB4ODApKSB8fAogCSAgICAoKHR1cGxlLT5UdXBsZUNvZGUgPiAweDkwKSAmJiAodHVwbGUtPlR1cGxlQ29kZSA8IDB4ZmYpKSkKQEAgLTE0OTksNiArMTU1NCw2IEBACiAJICAgICppbmZvID0gY291bnQ7CiAgICAga2ZyZWUodHVwbGUpOwogICAgIGtmcmVlKHApOwotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChwY2NhcmRfdmFsaWRhdGVfY2lzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzLmMgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCmluZGV4IGQxMjA3MzkuLmM2OGM1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY3MuYwpAQCAtNjEsNyArNjEsNyBAQAogLyogQWNjZXNzIHNwZWVkIGZvciBhdHRyaWJ1dGUgbWVtb3J5IHdpbmRvd3MgKi8KIElOVF9NT0RVTEVfUEFSTShjaXNfc3BlZWQsCTMwMCk7CQkvKiBucyAqLwogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0RFQlVHCiBzdGF0aWMgaW50IHBjX2RlYnVnOwogCiBtb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMDY0NCk7CkBAIC0yNDcsNyArMjQ3LDggQEAKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnNvY2tldC0+dGhyZWFkX2RvbmUpOwogCWlmICghc29ja2V0LT50aHJlYWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENNQ0lBOiB3YXJuaW5nOiBzb2NrZXQgdGhyZWFkIGZvciBzb2NrZXQgJXAgZGlkIG5vdCBzdGFydFxuIiwgc29ja2V0KTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZzb2NrZXQtPmRldiwKKwkJCSAgICJQQ01DSUE6IHdhcm5pbmc6IHNvY2tldCB0aHJlYWQgZGlkIG5vdCBzdGFydFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMzY2LDE2ICszNjcsMTYgQEAKIAkJc2t0LT5vcHMtPmdldF9zdGF0dXMoc2t0LCAmc3RhdHVzKTsKIAogCQlpZiAoIShzdGF0dXMgJiBTU19ERVRFQ1QpKQotCQkJcmV0dXJuIENTX05PX0NBUkQ7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQlpZiAoc3RhdHVzICYgU1NfUkVBRFkpCi0JCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwkJCXJldHVybiAwOwogCiAJCW1zbGVlcCh1bnJlc2V0X2NoZWNrICogMTApOwogCX0KIAogCWNzX2Vycihza3QsICJ0aW1lIG91dCBhZnRlciByZXNldC5cbiIpOwotCXJldHVybiBDU19HRU5FUkFMX0ZBSUxVUkU7CisJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKIC8qCkBAIC00MTIsNyArNDEzLDggQEAKIAogCXMtPm9wcy0+Z2V0X3N0YXR1cyhzLCAmc3RhdHVzKTsKIAlpZiAoc3RhdHVzICYgU1NfUE9XRVJPTikgewotCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQTogc29ja2V0ICVwOiAqKiogREFOR0VSICoqKiB1bmFibGUgdG8gcmVtb3ZlIHNvY2tldCBwb3dlclxuIiwgcyk7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZzLT5kZXYsCisJCQkgICAiKioqIERBTkdFUiAqKiogdW5hYmxlIHRvIHJlbW92ZSBzb2NrZXQgcG93ZXJcbiIpOwogCX0KIAogCWNzX3NvY2tldF9wdXQocyk7CkBAIC00MjYsMTQgKzQyOCwxNCBAQAogCiAJc2t0LT5vcHMtPmdldF9zdGF0dXMoc2t0LCAmc3RhdHVzKTsKIAlpZiAoIShzdGF0dXMgJiBTU19ERVRFQ1QpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAltc2xlZXAoaW5pdGlhbF9kZWxheSAqIDEwKTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQlza3QtPm9wcy0+Z2V0X3N0YXR1cyhza3QsICZzdGF0dXMpOwogCQlpZiAoIShzdGF0dXMgJiBTU19ERVRFQ1QpKQotCQkJcmV0dXJuIENTX05PX0NBUkQ7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQlpZiAoIShzdGF0dXMgJiBTU19QRU5ESU5HKSkKIAkJCWJyZWFrOwpAQCAtNDQzLDEzICs0NDUsMTMgQEAKIAogCWlmIChzdGF0dXMgJiBTU19QRU5ESU5HKSB7CiAJCWNzX2Vycihza3QsICJ2b2x0YWdlIGludGVycm9nYXRpb24gdGltZWQgb3V0LlxuIik7Ci0JCXJldHVybiBDU19HRU5FUkFMX0ZBSUxVUkU7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAogCWlmIChzdGF0dXMgJiBTU19DQVJEQlVTKSB7CiAJCWlmICghKHNrdC0+ZmVhdHVyZXMgJiBTU19DQVBfQ0FSREJVUykpIHsKIAkJCWNzX2Vycihza3QsICJjYXJkYnVzIGNhcmRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCQlyZXR1cm4gQ1NfQkFEX1RZUEU7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlza3QtPnN0YXRlIHw9IFNPQ0tFVF9DQVJEQlVTOwogCX0KQEAgLTQ2Myw3ICs0NjUsNyBAQAogCQlza3QtPnNvY2tldC5WY2MgPSBza3QtPnNvY2tldC5WcHAgPSA1MDsKIAllbHNlIHsKIAkJY3NfZXJyKHNrdCwgInVuc3VwcG9ydGVkIHZvbHRhZ2Uga2V5LlxuIik7Ci0JCXJldHVybiBDU19CQURfVFlQRTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJaWYgKHNrdC0+cG93ZXJfaG9vaykKQEAgLTQ4MCw3ICs0ODIsNyBAQAogCXNrdC0+b3BzLT5nZXRfc3RhdHVzKHNrdCwgJnN0YXR1cyk7CiAJaWYgKCEoc3RhdHVzICYgU1NfUE9XRVJPTikpIHsKIAkJY3NfZXJyKHNrdCwgInVuYWJsZSB0byBhcHBseSBwb3dlci5cbiIpOwotCQlyZXR1cm4gQ1NfQkFEX1RZUEU7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXN0YXR1cyA9IHNvY2tldF9yZXNldChza3QpOwpAQCAtNTAyLDE1ICs1MDQsMTYgQEAKIAljc19kYmcoc2t0LCA0LCAiaW5zZXJ0XG4iKTsKIAogCWlmICghY3Nfc29ja2V0X2dldChza3QpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXQgPSBzb2NrZXRfc2V0dXAoc2t0LCBzZXR1cF9kZWxheSk7Ci0JaWYgKHJldCA9PSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCA9PSAwKSB7CiAJCXNrdC0+c3RhdGUgfD0gU09DS0VUX1BSRVNFTlQ7CiAKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJwY2NhcmQ6ICVzIGNhcmQgaW5zZXJ0ZWQgaW50byBzbG90ICVkXG4iLAotCQkgICAgICAgKHNrdC0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgPyAiQ2FyZEJ1cyIgOiAiUENNQ0lBIiwKLQkJICAgICAgIHNrdC0+c29jayk7CisJCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZza3QtPmRldiwKKwkJCSAgICJwY2NhcmQ6ICVzIGNhcmQgaW5zZXJ0ZWQgaW50byBzbG90ICVkXG4iLAorCQkJICAgKHNrdC0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgPyAiQ2FyZEJ1cyIgOiAiUENNQ0lBIiwKKwkJCSAgIHNrdC0+c29jayk7CiAKICNpZmRlZiBDT05GSUdfQ0FSREJVUwogCQlpZiAoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSB7CkBAIC01MzEsNyArNTM0LDcgQEAKIHN0YXRpYyBpbnQgc29ja2V0X3N1c3BlbmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpZiAoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKQotCQlyZXR1cm4gQ1NfSU5fVVNFOworCQlyZXR1cm4gLUVCVVNZOwogCiAJc2VuZF9ldmVudChza3QsIENTX0VWRU5UX1BNX1NVU1BFTkQsIENTX0VWRU5UX1BSSV9MT1cpOwogCXNrdC0+c29ja2V0ID0gZGVhZF9zb2NrZXQ7CkBAIC01NDAsNyArNTQzLDcgQEAKIAkJc2t0LT5vcHMtPnN1c3BlbmQoc2t0KTsKIAlza3QtPnN0YXRlIHw9IFNPQ0tFVF9TVVNQRU5EOwogCi0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC01NTMsNyArNTU2LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCEoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKSkKLQkJcmV0dXJuIENTX0lOX1VTRTsKKwkJcmV0dXJuIC1FQlVTWTsKIAogCXNrdC0+c29ja2V0ID0gZGVhZF9zb2NrZXQ7CiAJc2t0LT5vcHMtPmluaXQoc2t0KTsKQEAgLTU2NSw3ICs1NjgsNyBAQAogCX0KIAogCXJldCA9IHNvY2tldF9zZXR1cChza3QsIHJlc3VtZV9kZWxheSk7Ci0JaWYgKHJldCA9PSBDU19TVUNDRVNTKSB7CisJaWYgKHJldCA9PSAwKSB7CiAJCS8qCiAJCSAqIEZJWE1FOiBuZWVkIGEgYmV0dGVyIGNoZWNrIGhlcmUgZm9yIGNhcmRidXMgY2FyZHMuCiAJCSAqLwpAQCAtNTkwLDEyICs1OTMsMTMgQEAKIAogCXNrdC0+c3RhdGUgJj0gflNPQ0tFVF9TVVNQRU5EOwogCi0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNvY2tldF9yZW1vdmUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKLQlwcmludGsoS0VSTl9OT1RJQ0UgInBjY2FyZDogY2FyZCBlamVjdGVkIGZyb20gc2xvdCAlZFxuIiwgc2t0LT5zb2NrKTsKKwlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmc2t0LT5kZXYsCisJCSAgICJwY2NhcmQ6IGNhcmQgZWplY3RlZCBmcm9tIHNsb3QgJWRcbiIsIHNrdC0+c29jayk7CiAJc29ja2V0X3NodXRkb3duKHNrdCk7CiB9CiAKQEAgLTY0MSw4ICs2NDUsOCBAQAogCS8qIHJlZ2lzdGVyIHdpdGggdGhlIGRldmljZSBjb3JlICovCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZza3QtPmRldik7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ01DSUE6IHVuYWJsZSB0byByZWdpc3RlciBzb2NrZXQgMHglcFxuIiwKLQkJCXNrdCk7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmc2t0LT5kZXYsCisJCQkgICAiUENNQ0lBOiB1bmFibGUgdG8gcmVnaXN0ZXIgc29ja2V0XG4iKTsKIAkJc2t0LT50aHJlYWQgPSBOVUxMOwogCQljb21wbGV0ZSgmc2t0LT50aHJlYWRfZG9uZSk7CiAJCXJldHVybiAwOwpAQCAtNzQ4LDcgKzc1Miw3IEBACiAgKiBDSVMgcmVnaXN0ZXIuCiAgKi8KIAotaW50IHBjY2FyZF9yZXNldF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCitpbnQgcGNtY2lhX3Jlc2V0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpbnQgcmV0OwogCkBAIC03NTcsMTUgKzc2MSwxNSBAQAogCW11dGV4X2xvY2soJnNrdC0+c2t0X211dGV4KTsKIAlkbyB7CiAJCWlmICghKHNrdC0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpIHsKLQkJCXJldCA9IENTX05PX0NBUkQ7CisJCQlyZXQgPSAtRU5PREVWOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNrdC0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCkgewotCQkJcmV0ID0gQ1NfSU5fVVNFOworCQkJcmV0ID0gLUVCVVNZOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNrdC0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgewotCQkJcmV0ID0gQ1NfVU5TVVBQT1JURURfRlVOQ1RJT047CisJCQlyZXQgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQogCkBAIC03NzQsMjAgKzc3OCwyMCBAQAogCQkJc2VuZF9ldmVudChza3QsIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMLCBDU19FVkVOVF9QUklfTE9XKTsKIAkJCWlmIChza3QtPmNhbGxiYWNrKQogCQkJCXNrdC0+Y2FsbGJhY2stPnN1c3BlbmQoc2t0KTsKLQkJCWlmIChzb2NrZXRfcmVzZXQoc2t0KSA9PSBDU19TVUNDRVNTKSB7CisJCQlpZiAoc29ja2V0X3Jlc2V0KHNrdCkgPT0gMCkgewogCQkJCXNlbmRfZXZlbnQoc2t0LCBDU19FVkVOVF9DQVJEX1JFU0VULCBDU19FVkVOVF9QUklfTE9XKTsKIAkJCQlpZiAoc2t0LT5jYWxsYmFjaykKIAkJCQkJc2t0LT5jYWxsYmFjay0+cmVzdW1lKHNrdCk7CiAJCQl9CiAJCX0KIAotCQlyZXQgPSBDU19TVUNDRVNTOworCQlyZXQgPSAwOwogCX0gd2hpbGUgKDApOwogCW11dGV4X3VubG9jaygmc2t0LT5za3RfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0gLyogcmVzZXRfY2FyZCAqLwotRVhQT1JUX1NZTUJPTChwY2NhcmRfcmVzZXRfY2FyZCk7CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXNldF9jYXJkKTsKIAogCiAvKiBUaGVzZSBzaHV0IGRvd24gb3Igd2FrZSB1cCBhIHNvY2tldC4gIFRoZXkgYXJlIHNvcnQgb2YgdXNlcgpAQCAtODAyLDExICs4MDYsMTEgQEAKIAltdXRleF9sb2NrKCZza3QtPnNrdF9tdXRleCk7CiAJZG8gewogCQlpZiAoIShza3QtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKSB7Ci0JCQlyZXQgPSBDU19OT19DQVJEOworCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChza3QtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpIHsKLQkJCXJldCA9IENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworCQkJcmV0ID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNrdC0+Y2FsbGJhY2spIHsKQEAgLTgzMiwxMSArODM2LDExIEBACiAJbXV0ZXhfbG9jaygmc2t0LT5za3RfbXV0ZXgpOwogCWRvIHsKIAkJaWYgKCEoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkgewotCQkJcmV0ID0gQ1NfTk9fQ0FSRDsKKwkJCXJldCA9IC1FTk9ERVY7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoc2t0LT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSB7Ci0JCQlyZXQgPSBDU19VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwkJCXJldCA9IC1FUEVSTTsKIAkJCWJyZWFrOwogCQl9CiAJCXJldCA9IHNvY2tldF9yZXN1bWUoc2t0KTsKQEAgLTg5Miw3ICs4OTYsNyBAQAogCQkJcmV0ID0gLUVCVVNZOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHNvY2tldF9pbnNlcnQoc2t0KSA9PSBDU19OT19DQVJEKSB7CisJCWlmIChzb2NrZXRfaW5zZXJ0KHNrdCkgPT0gLUVOT0RFVikgewogCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAppbmRleCA2M2RjMWEyLi43OTYxNWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogY3NfaW50ZXJuYWwuaAorICogY3NfaW50ZXJuYWwuaCAtLSBkZWZpbml0aW9ucyBpbnRlcm5hbCB0byB0aGUgUENNQ0lBIGNvcmUgbW9kdWxlcwogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTAsNiArMTAsMTIgQEAKICAqIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIChDKSAxOTk5CQlEYXZpZCBBLiBIaW5kcworICogKEMpIDIwMDMgLSAyMDA4CURvbWluaWsgQnJvZG93c2tpCisgKgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBfb25seV8gbmVlZGVkIGJ5IHRoZSBQQ01DSUEgY29yZSBtb2R1bGVzLgorICogSXQgbXVzdCBub3QgYmUgaW5jbHVkZWQgYnkgUENNQ0lBIHNvY2tldCBkcml2ZXJzIG9yIGJ5IFBDTUNJQSBkZXZpY2UKKyAqIGRyaXZlcnMuCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfQ1NfSU5URVJOQUxfSApAQCAtMTgsMjkgKzI0LDI0IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogCiAvKiBGbGFncyBpbiBjbGllbnQgc3RhdGUgKi8KLSNkZWZpbmUgQ0xJRU5UX0NPTkZJR19MT0NLRUQJMHgwMDAxCi0jZGVmaW5lIENMSUVOVF9JUlFfUkVRCQkweDAwMDIKLSNkZWZpbmUgQ0xJRU5UX0lPX1JFUQkJMHgwMDA0Ci0jZGVmaW5lIENMSUVOVF9VTkJPVU5ECQkweDAwMDgKLSNkZWZpbmUgQ0xJRU5UX1NUQUxFCQkweDAwMTAKICNkZWZpbmUgQ0xJRU5UX1dJTl9SRVEoaSkJKDB4MTw8KGkpKQotI2RlZmluZSBDTElFTlRfQ0FSREJVUwkJMHg4MDAwCiAKIC8qIEVhY2ggY2FyZCBmdW5jdGlvbiBnZXRzIG9uZSBvZiB0aGVzZSBndXlzICovCiB0eXBlZGVmIHN0cnVjdCBjb25maWdfdCB7CiAJc3RydWN0IGtyZWYJcmVmOwotICAgIHVfaW50CQlzdGF0ZTsKLSAgICB1X2ludAkJQXR0cmlidXRlczsKLSAgICB1X2ludAkJSW50VHlwZTsKLSAgICB1X2ludAkJQ29uZmlnQmFzZTsKLSAgICB1X2NoYXIJCVN0YXR1cywgUGluLCBDb3B5LCBPcHRpb24sIEV4dFN0YXR1czsKLSAgICB1X2ludAkJQ2FyZFZhbHVlczsKLSAgICBpb19yZXFfdAkJaW87Ci0gICAgc3RydWN0IHsKLQl1X2ludAkJQXR0cmlidXRlczsKLSAgICB9IGlycTsKKwl1bnNpZ25lZCBpbnQJc3RhdGU7CisJdW5zaWduZWQgaW50CUF0dHJpYnV0ZXM7CisJdW5zaWduZWQgaW50CUludFR5cGU7CisJdW5zaWduZWQgaW50CUNvbmZpZ0Jhc2U7CisJdW5zaWduZWQgY2hhcglTdGF0dXMsIFBpbiwgQ29weSwgT3B0aW9uLCBFeHRTdGF0dXM7CisJdW5zaWduZWQgaW50CUNhcmRWYWx1ZXM7CisJaW9fcmVxX3QJaW87CisJc3RydWN0IHsKKwkJdV9pbnQJQXR0cmlidXRlczsKKwl9IGlycTsKIH0gY29uZmlnX3Q7CiAKKwogc3RydWN0IGNpc19jYWNoZV9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZAlub2RlOwogCXVuc2lnbmVkIGludAkJYWRkcjsKQEAgLTQ5LDYgKzUwLDMwIEBACiAJdW5zaWduZWQgY2hhcgkJY2FjaGVbMF07CiB9OwogCitzdHJ1Y3QgcGNjYXJkX3Jlc291cmNlX29wcyB7CisJaW50CSgqdmFsaWRhdGVfbWVtKQkJKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwlpbnQJKCphZGp1c3RfaW9fcmVnaW9uKQkoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJCSB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCisJCQkJCSB1bnNpZ25lZCBsb25nIHJfZW5kLAorCQkJCQkgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworCXN0cnVjdCByZXNvdXJjZSogKCpmaW5kX2lvKQkodW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgbnVtLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCQkJIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UqICgqZmluZF9tZW0pCSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnVtLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhbGlnbiwgaW50IGxvdywKKwkJCQkJIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwlpbnQJKCphZGRfaW8pCQkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCQkJCSB1bnNpZ25lZCBpbnQgYWN0aW9uLAorCQkJCQkgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAorCQkJCQkgdW5zaWduZWQgbG9uZyByX2VuZCk7CisJaW50CSgqYWRkX21lbSkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKKwkJCQkJIHVuc2lnbmVkIGludCBhY3Rpb24sCisJCQkJCSB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCisJCQkJCSB1bnNpZ25lZCBsb25nIHJfZW5kKTsKKwlpbnQJKCppbml0KQkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CisJdm9pZAkoKmV4aXQpCQkJKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKK307CisKIC8qIEZsYWdzIGluIGNvbmZpZyBzdGF0ZSAqLwogI2RlZmluZSBDT05GSUdfTE9DS0VECQkweDAxCiAjZGVmaW5lIENPTkZJR19JUlFfUkVRCQkweDAyCkBAIC01OSw3ICs4NCw2IEBACiAjZGVmaW5lIFNPQ0tFVF9JTlVTRQkJMHgwMDEwCiAjZGVmaW5lIFNPQ0tFVF9TVVNQRU5ECQkweDAwODAKICNkZWZpbmUgU09DS0VUX1dJTl9SRVEoaSkJKDB4MDEwMDw8KGkpKQotI2RlZmluZSBTT0NLRVRfUkVHSU9OX0lORk8JMHg0MDAwCiAjZGVmaW5lIFNPQ0tFVF9DQVJEQlVTCQkweDgwMDAKICNkZWZpbmUgU09DS0VUX0NBUkRCVVNfQ09ORklHCTB4MTAwMDAKIApAQCAtODMsNjkgKzEwNywxNTMgQEAKIAl9CiB9CiAKLS8qIEluIGNhcmRidXMuYyAqLwotaW50IGNiX2FsbG9jKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLXZvaWQgY2JfZnJlZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci1pbnQgcmVhZF9jYl9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBzcGFjZSwgdV9pbnQgYWRkciwgdV9pbnQgbGVuLCB2b2lkICpwdHIpOworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKK2V4dGVybiBpbnQgY3NfZGVidWdfbGV2ZWwoaW50KTsKIAotLyogSW4gY2lzdHBsLmMgKi8KLWludCBwY21jaWFfcmVhZF9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwKLQkJIHVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKTsKLXZvaWQgcGNtY2lhX3dyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAotCQkgICB1X2ludCBhZGRyLCB1X2ludCBsZW4sIHZvaWQgKnB0cik7Ci12b2lkIHJlbGVhc2VfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci12b2lkIGRlc3Ryb3lfY2lzX2NhY2hlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKyNkZWZpbmUgY3NfZGJnKHNrdCwgbHZsLCBmbXQsIGFyZy4uLikgZG8gewkJXAorCWlmIChjc19kZWJ1Z19sZXZlbChsdmwpKQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmc2t0LT5kZXYsCVwKKwkJICJjczogIiBmbXQsICMjIGFyZyk7CQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJCVwKKwlpZiAoY3NfZGVidWdfbGV2ZWwobHZsKSkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIAkJCVwKKwkJICJjczogIiBmbXQsICMjIGFyZyk7CQkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgY3NfZGJnKHNrdCwgbHZsLCBmbXQsIGFyZy4uLikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2NzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBjc19lcnIoc2t0LCBmbXQsIGFyZy4uLikgXAorCWRldl9wcmludGsoS0VSTl9FUlIsICZza3QtPmRldiwgImNzOiAiIGZtdCwgIyMgYXJnKQorCisKKy8qCisgKiBTdHVmZiBpbnRlcm5hbCB0byBtb2R1bGUgInBjbWNpYV9jb3JlIjoKKyAqLworCisvKiBjaXN0cGwuYyAqLwogaW50IHZlcmlmeV9jaXNfY2FjaGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwotaW50IHBjY2FyZF9yZWFkX3R1cGxlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIGNpc2RhdGFfdCBjb2RlLCB2b2lkICpwYXJzZSk7CiAKLS8qIEluIHJzcmNfbWdyICovCi1pbnQgcGNtY2lhX3ZhbGlkYXRlX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci1zdHJ1Y3QgcmVzb3VyY2UgKnBjbWNpYV9maW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sIHVuc2lnbmVkIGxvbmcgYWxpZ24sCi0JCSAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLWludCBwY21jaWFfYWRqdXN0X2lvX3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgcl9lbmQsIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLXN0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgdV9sb25nIGFsaWduLAotCQkgICAgaW50IGxvdywgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworLyogcnNyY19tZ3IuYyAqLwogdm9pZCByZWxlYXNlX3Jlc291cmNlX2RiKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIAotLyogSW4gc29ja2V0X3N5c2ZzLmMgKi8KKy8qIHNvY2tldF9zeXNmcy5jICovCiBleHRlcm4gaW50IHBjY2FyZF9zeXNmc19hZGRfc29ja2V0KHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBwY2NhcmRfc3lzZnNfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0vKiBJbiBjcy5jICovCi1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBwY21jaWFfc29ja2V0X2xpc3RfcndzZW07Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY21jaWFfc29ja2V0X2xpc3Q7Ci1pbnQgcGNtY2lhX2dldF93aW5kb3coc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHdpbmRvd19oYW5kbGVfdCAqaGFuZGxlLCBpbnQgaWR4LCB3aW5fcmVxX3QgKnJlcSk7Ci1pbnQgcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY29uZmlnX2luZm9fdCAqY29uZmlnKTsKLWludCBwY2NhcmRfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKKy8qIGNhcmRidXMuYyAqLworaW50IGNiX2FsbG9jKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKK3ZvaWQgY2JfZnJlZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CitpbnQgcmVhZF9jYl9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBzcGFjZSwgdV9pbnQgYWRkciwgdV9pbnQgbGVuLAorCQl2b2lkICpwdHIpOwogCiAKKworLyoKKyAqIFN0dWZmIGV4cG9ydGVkIGJ5IG1vZHVsZSAicGNtY2lhX2NvcmUiIHRvIG1vZHVsZSAicGNtY2lhIgorICovCisKIHN0cnVjdCBwY21jaWFfY2FsbGJhY2t7CiAJc3RydWN0IG1vZHVsZQkqb3duZXI7Ci0JaW50CQkoKmV2ZW50KSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSk7CisJaW50CQkoKmV2ZW50KSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCQkJICBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpOwogCXZvaWQJCSgqcmVxdWVyeSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgbmV3X2Npcyk7CiAJaW50CQkoKnN1c3BlbmQpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAJaW50CQkoKnJlc3VtZSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIH07CiAKKy8qIGNzLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbTsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHBjbWNpYV9zb2NrZXRfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgcGNtY2lhX3NvY2tldF9jbGFzczsKKworaW50IHBjbWNpYV9nZXRfd2luZG93KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkgICAgICB3aW5kb3dfaGFuZGxlX3QgKmhhbmRsZSwKKwkJICAgICAgaW50IGlkeCwKKwkJICAgICAgd2luX3JlcV90ICpyZXEpOwogaW50IHBjY2FyZF9yZWdpc3Rlcl9wY21jaWEoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHN0cnVjdCBwY21jaWFfY2FsbGJhY2sgKmMpOworc3RydWN0IHBjbWNpYV9zb2NrZXQgKnBjbWNpYV9nZXRfc29ja2V0X2J5X25yKHVuc2lnbmVkIGludCBucik7CiAKLSNkZWZpbmUgY3Nfc29ja2V0X25hbWUoc2t0KQkoKHNrdCktPmRldi5idXNfaWQpCitpbnQgcGNtY2lhX3N1c3BlbmRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKK2ludCBwY21jaWFfcmVzdW1lX2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiAKLSNpZmRlZiBERUJVRwotZXh0ZXJuIGludCBjc19kZWJ1Z19sZXZlbChpbnQpOworaW50IHBjbWNpYV9lamVjdF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOworaW50IHBjbWNpYV9pbnNlcnRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIAotI2RlZmluZSBjc19kYmcoc2t0LCBsdmwsIGZtdCwgYXJnLi4uKSBkbyB7CQlcCi0JaWYgKGNzX2RlYnVnX2xldmVsKGx2bCkpCQkJXAotCQlwcmludGsoS0VSTl9ERUJVRyAiY3M6ICVzOiAiIGZtdCwgCVwKLQkJICAgICAgIGNzX3NvY2tldF9uYW1lKHNrdCkgLCAjIyBhcmcpOwlcCi19IHdoaWxlICgwKQorc3RydWN0IHBjbWNpYV9zb2NrZXQgKnBjbWNpYV9nZXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwordm9pZCBwY21jaWFfcHV0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIAotI2Vsc2UKLSNkZWZpbmUgY3NfZGJnKHNrdCwgbHZsLCBmbXQsIGFyZy4uLikgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCisvKiBjaXN0cGwuYyAqLworaW50IHBjbWNpYV9yZWFkX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAorCQkJdV9pbnQgYWRkciwgdV9pbnQgbGVuLCB2b2lkICpwdHIpOwordm9pZCBwY21jaWFfd3JpdGVfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsCisJCQkgIHVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKTsKK3ZvaWQgcmVsZWFzZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKK3ZvaWQgZGVzdHJveV9jaXNfY2FjaGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworaW50IHBjY2FyZF9yZWFkX3R1cGxlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCSAgICAgIGNpc2RhdGFfdCBjb2RlLCB2b2lkICpwYXJzZSk7CitpbnQgcGNtY2lhX3JlcGxhY2VfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkgICAgICAgY29uc3QgdTggKmRhdGEsIGNvbnN0IHNpemVfdCBsZW4pOworaW50IHBjY2FyZF92YWxpZGF0ZV9jaXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJCXVuc2lnbmVkIGludCAqY291bnQpOwogCi0jZGVmaW5lIGNzX2Vycihza3QsIGZtdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fRVJSICJjczogJXM6ICIgZm10LCAoc2t0KS0+ZGV2LmJ1c19pZCAsICMjIGFyZykKKy8qIHJzcmNfbWdyLmMgKi8KK2ludCBwY21jaWFfdmFsaWRhdGVfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKK3N0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkgICAgICAgaW50IG51bSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCQkgICAgICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworaW50IHBjbWNpYV9hZGp1c3RfaW9fcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgcl9zdGFydCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHJfZW5kLAorCQkJICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKK3N0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwKKwkJCQkJdV9sb25nIG51bSwKKwkJCQkJdV9sb25nIGFsaWduLAorCQkJCQlpbnQgbG93LAorCQkJCQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CisKKy8qCisgKiBTdHVmZiBpbnRlcm5hbCB0byBtb2R1bGUgInBjbWNpYSIuCisgKi8KKy8qIGRzLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlOworCisvKiBwY21jaWFfcmVzb3VyY2UuYyAqLworZXh0ZXJuIGludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCisvKiBkcy5jICovCitleHRlcm4gc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKKworZXh0ZXJuIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOworZXh0ZXJuIHZvaWQgcGNtY2lhX3B1dF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKKworc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9kZXZpY2VfYWRkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkJCQl1bnNpZ25lZCBpbnQgZnVuY3Rpb24pOworCisvKiBwY21jaWFfaW9jdGwuYyAqLworZXh0ZXJuIHZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBwY21jaWFfY2xlYW51cF9pb2N0bCh2b2lkKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCk7CitleHRlcm4gaW50IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KTsKKworI2Vsc2UgLyogQ09ORklHX1BDTUNJQV9JT0NUTCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKSB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCBwY21jaWFfY2xlYW51cF9pb2N0bCh2b2lkKSB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QQ01DSUFfSU9DVEwgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCA0MTc0ZDk2Li43OTU2NjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KIAogI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZHNfaW50ZXJuYWwuaCIKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTQyLDE3ICs0MSwyMiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ01DSUEgRHJpdmVyIFNlcnZpY2VzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNpZmRlZiBERUJVRworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKIGludCBkc19wY19kZWJ1ZzsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHBjX2RlYnVnLCBkc19wY19kZWJ1ZywgaW50LCAwNjQ0KTsKIAogI2RlZmluZSBkc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJCQlcCi0JaWYgKGRzX3BjX2RlYnVnID4gKGx2bCkpCQkJCQlcCisJaWYgKGRzX3BjX2RlYnVnID4gKGx2bCkpCQkJCVwKIAkJcHJpbnRrKEtFUk5fREVCVUcgImRzOiAiIGZtdCAsICMjIGFyZyk7CQlcCiB9IHdoaWxlICgwKQorI2RlZmluZSBkc19kZXZfZGJnKGx2bCwgZGV2LCBmbXQsIGFyZy4uLikgZG8gewkJCQlcCisJaWYgKGRzX3BjX2RlYnVnID4gKGx2bCkpCQkJCQlcCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAiZHM6ICIgZm10ICwgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIGRzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRzX2Rldl9kYmcobHZsLCBkZXYsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAogc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKQEAgLTY0LDQyICs2OCwxOSBAQAogLyogU3RyaW5nIHRhYmxlcyBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgbG9va3VwX3QgewotICAgIGludCBrZXk7Ci0gICAgY2hhciAqbXNnOworICAgIGNvbnN0IGludCBrZXk7CisgICAgY29uc3QgY2hhciAqbXNnOwogfSBsb29rdXBfdDsKIAogc3RhdGljIGNvbnN0IGxvb2t1cF90IGVycm9yX3RhYmxlW10gPSB7Ci0gICAgeyBDU19TVUNDRVNTLAkJIk9wZXJhdGlvbiBzdWNjZWVkZWQiIH0sCi0gICAgeyBDU19CQURfQURBUFRFUiwJCSJCYWQgYWRhcHRlciIgfSwKLSAgICB7IENTX0JBRF9BVFRSSUJVVEUsIAkiQmFkIGF0dHJpYnV0ZSIsIH0sCi0gICAgeyBDU19CQURfQkFTRSwJCSJCYWQgYmFzZSBhZGRyZXNzIiB9LAotICAgIHsgQ1NfQkFEX0VEQywJCSJCYWQgRURDIiB9LAotICAgIHsgQ1NfQkFEX0lSUSwJCSJCYWQgSVJRIiB9LAotICAgIHsgQ1NfQkFEX09GRlNFVCwJCSJCYWQgb2Zmc2V0IiB9LAotICAgIHsgQ1NfQkFEX1BBR0UsCQkiQmFkIHBhZ2UgbnVtYmVyIiB9LAotICAgIHsgQ1NfUkVBRF9GQUlMVVJFLAkJIlJlYWQgZmFpbHVyZSIgfSwKLSAgICB7IENTX0JBRF9TSVpFLAkJIkJhZCBzaXplIiB9LAotICAgIHsgQ1NfQkFEX1NPQ0tFVCwJCSJCYWQgc29ja2V0IiB9LAotICAgIHsgQ1NfQkFEX1RZUEUsCQkiQmFkIHR5cGUiIH0sCi0gICAgeyBDU19CQURfVkNDLAkJIkJhZCBWY2MiIH0sCi0gICAgeyBDU19CQURfVlBQLAkJIkJhZCBWcHAiIH0sCi0gICAgeyBDU19CQURfV0lORE9XLAkJIkJhZCB3aW5kb3ciIH0sCi0gICAgeyBDU19XUklURV9GQUlMVVJFLAkJIldyaXRlIGZhaWx1cmUiIH0sCi0gICAgeyBDU19OT19DQVJELAkJIk5vIGNhcmQgcHJlc2VudCIgfSwKLSAgICB7IENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OLAkiVXN1cHBvcnRlZCBmdW5jdGlvbiIgfSwKLSAgICB7IENTX1VOU1VQUE9SVEVEX01PREUsCSJVbnN1cHBvcnRlZCBtb2RlIiB9LAotICAgIHsgQ1NfQkFEX1NQRUVELAkJIkJhZCBzcGVlZCIgfSwKLSAgICB7IENTX0JVU1ksCQkJIlJlc291cmNlIGJ1c3kiIH0sCi0gICAgeyBDU19HRU5FUkFMX0ZBSUxVUkUsCSJHZW5lcmFsIGZhaWx1cmUiIH0sCi0gICAgeyBDU19XUklURV9QUk9URUNURUQsCSJXcml0ZSBwcm90ZWN0ZWQiIH0sCi0gICAgeyBDU19CQURfQVJHX0xFTkdUSCwJIkJhZCBhcmd1bWVudCBsZW5ndGgiIH0sCi0gICAgeyBDU19CQURfQVJHUywJCSJCYWQgYXJndW1lbnRzIiB9LAotICAgIHsgQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQsCSJDb25maWd1cmF0aW9uIGxvY2tlZCIgfSwKLSAgICB7IENTX0lOX1VTRSwJCSJSZXNvdXJjZSBpbiB1c2UiIH0sCi0gICAgeyBDU19OT19NT1JFX0lURU1TLAkJIk5vIG1vcmUgaXRlbXMiIH0sCi0gICAgeyBDU19PVVRfT0ZfUkVTT1VSQ0UsCSJPdXQgb2YgcmVzb3VyY2UiIH0sCi0gICAgeyBDU19CQURfSEFORExFLAkJIkJhZCBoYW5kbGUiIH0sCi0gICAgeyBDU19CQURfVFVQTEUsCQkiQmFkIENJUyB0dXBsZSIgfQorICAgIHsgMCwJCQkiT3BlcmF0aW9uIHN1Y2NlZWRlZCIgfSwKKyAgICB7IC1FSU8sCQkJIklucHV0L091dHB1dCBlcnJvciIgfSwKKyAgICB7IC1FTk9ERVYsCQkJIk5vIGNhcmQgcHJlc2VudCIgfSwKKyAgICB7IC1FSU5WQUwsCQkJIkJhZCBwYXJhbWV0ZXIiIH0sCisgICAgeyAtRUFDQ0VTLAkJCSJDb25maWd1cmF0aW9uIGxvY2tlZCIgfSwKKyAgICB7IC1FQlVTWSwJCQkiUmVzb3VyY2UgaW4gdXNlIiB9LAorICAgIHsgLUVOT1NQQywJCQkiTm8gbW9yZSBpdGVtcyIgfSwKKyAgICB7IC1FTk9NRU0sCQkJIk91dCBvZiByZXNvdXJjZSIgfSwKIH07CiAKIApAQCAtMTU1LDQ2ICsxMzYsMzIgQEAKICAgICB7IFJlcGxhY2VDSVMsCQkJIlJlcGxhY2VDSVMiIH0KIH07CiAKLQotc3RhdGljIGludCBwY21jaWFfcmVwb3J0X2Vycm9yKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgZXJyb3JfaW5mb190ICplcnIpCitjb25zdCBjaGFyICpwY21jaWFfZXJyb3JfZnVuYyhpbnQgZnVuYykKIHsKIAlpbnQgaTsKLQljaGFyICpzZXJ2OwotCi0JaWYgKCFwX2RldikKLQkJcHJpbnRrKEtFUk5fTk9USUNFKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcnZpY2VfdGFibGUpOyBpKyspCi0JCWlmIChzZXJ2aWNlX3RhYmxlW2ldLmtleSA9PSBlcnItPmZ1bmMpCi0JCQlicmVhazsKLQlpZiAoaSA8IEFSUkFZX1NJWkUoc2VydmljZV90YWJsZSkpCi0JCXNlcnYgPSBzZXJ2aWNlX3RhYmxlW2ldLm1zZzsKLQllbHNlCi0JCXNlcnYgPSAiVW5rbm93biBzZXJ2aWNlIG51bWJlciI7CisJCWlmIChzZXJ2aWNlX3RhYmxlW2ldLmtleSA9PSBmdW5jKQorCQkJcmV0dXJuIHNlcnZpY2VfdGFibGVbaV0ubXNnOworCisJcmV0dXJuICJVbmtub3duIHNlcnZpY2UgbnVtYmVyIjsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2Vycm9yX2Z1bmMpOworCitjb25zdCBjaGFyICpwY21jaWFfZXJyb3JfcmV0KGludCByZXQpCit7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlcnJvcl90YWJsZSk7IGkrKykKLQkJaWYgKGVycm9yX3RhYmxlW2ldLmtleSA9PSBlcnItPnJldGNvZGUpCi0JCQlicmVhazsKLQlpZiAoaSA8IEFSUkFZX1NJWkUoZXJyb3JfdGFibGUpKQotCQlwcmludGsoIiVzOiAlc1xuIiwgc2VydiwgZXJyb3JfdGFibGVbaV0ubXNnKTsKLQllbHNlCi0JCXByaW50aygiJXM6IFVua25vd24gZXJyb3IgY29kZSAlI3hcbiIsIHNlcnYsIGVyci0+cmV0Y29kZSk7CisJCWlmIChlcnJvcl90YWJsZVtpXS5rZXkgPT0gcmV0KQorCQkJcmV0dXJuIGVycm9yX3RhYmxlW2ldLm1zZzsKIAotCXJldHVybiBDU19TVUNDRVNTOwotfSAvKiByZXBvcnRfZXJyb3IgKi8KLQotLyogZW5kIG9mIGNvZGUgd2hpY2ggd2FzIGluIGNzLmMgYmVmb3JlICovCisJcmV0dXJuICJ1bmtub3duIjsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2Vycm9yX3JldCk7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXZvaWQgY3NfZXJyb3Ioc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpbnQgZnVuYywgaW50IHJldCkKLXsKLQllcnJvcl9pbmZvX3QgZXJyID0geyBmdW5jLCByZXQgfTsKLQlwY21jaWFfcmVwb3J0X2Vycm9yKHBfZGV2LCAmZXJyKTsKLX0KLUVYUE9SVF9TWU1CT0woY3NfZXJyb3IpOwogCiAKIHN0YXRpYyB2b2lkIHBjbWNpYV9jaGVja19kcml2ZXIoc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2KQpAQCAtMzkxLDcgKzM1OCw3IEBACiBzdGF0aWMgdm9pZCBwY21jaWFfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKLQlkc19kYmcoMSwgInJlbGVhc2luZyBkZXZpY2UgJXNcbiIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKKwlkc19kZXZfZGJnKDEsIGRldiwgInJlbGVhc2luZyBkZXZpY2VcbiIpOwogCXBjbWNpYV9wdXRfc29ja2V0KHBfZGV2LT5zb2NrZXQpOwogCWtmcmVlKHBfZGV2LT5kZXZuYW1lKTsKIAlrcmVmX3B1dCgmcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZy0+cmVmLCBwY21jaWFfcmVsZWFzZV9mdW5jdGlvbik7CkBAIC00MDEsNyArMzY4LDcgQEAKIHN0YXRpYyB2b2lkIHBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgbWZjKQogewogCWlmICghcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZykgewotCQlkc19kYmcoMSwgInNjaGVkdWxpbmcgdG8gYWRkICVzIHNlY29uZGFyeSIKKwkJZHNfZGV2X2RiZygxLCAmcy0+ZGV2LCAic2NoZWR1bGluZyB0byBhZGQgJXMgc2Vjb25kYXJ5IgogCQkgICAgICAgIiBkZXZpY2UgdG8gJWRcbiIsIG1mYyA/ICJtZmMiIDogInBmYyIsIHMtPnNvY2spOwogCQlzLT5wY21jaWFfc3RhdGUuZGV2aWNlX2FkZF9wZW5kaW5nID0gMTsKIAkJcy0+cGNtY2lhX3N0YXRlLm1mY19wZmMgPSBtZmM7CkBAIC00MjcsOCArMzk0LDE5IEBACiAJcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRldi0+ZHJpdmVyKTsKIAlzID0gcF9kZXYtPnNvY2tldDsKIAotCWRzX2RiZygxLCAidHJ5aW5nIHRvIGJpbmQgJXMgdG8gJXNcbiIsIHBfZGV2LT5kZXYuYnVzX2lkLAotCSAgICAgICBwX2Rydi0+ZHJ2Lm5hbWUpOworCS8qIFRoZSBQQ01DSUEgY29kZSBwYXNzZXMgdGhlIG1hdGNoIGRhdGEgaW4gdmlhIGRldi0+ZHJpdmVyX2RhdGEKKwkgKiB3aGljaCBpcyBhbiB1Z2x5IGhhY2suIE9uY2UgdGhlIGRyaXZlciBwcm9iZSBpcyBjYWxsZWQgaXQgbWF5CisJICogYW5kIG9mdGVuIHdpbGwgb3ZlcndyaXRlIHRoZSBtYXRjaCBkYXRhIHNvIHdlIG11c3Qgc2F2ZSBpdCBmaXJzdAorCSAqCisJICogaGFuZGxlIHBzZXVkbyBtdWx0aWZ1bmN0aW9uIGRldmljZXM6CisJICogdGhlcmUgYXJlIGF0IG1vc3QgdHdvIHBzZXVkbyBtdWx0aWZ1bmN0aW9uIGRldmljZXMuCisJICogaWYgd2UncmUgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZmlyc3QsIHNjaGVkdWxlIGEKKwkgKiBjYWxsIHdoaWNoIHdpbGwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSB0d28KKwkgKiBwc2V1ZG8gZGV2aWNlcywgYW5kIGlmIG5vdCwgYWRkIHRoZSBzZWNvbmQgb25lLgorCSAqLworCWRpZCA9IHBfZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisKKwlkc19kZXZfZGJnKDEsIGRldiwgInRyeWluZyB0byBiaW5kIHRvICVzXG4iLCBwX2Rydi0+ZHJ2Lm5hbWUpOwogCiAJaWYgKCghcF9kcnYtPnByb2JlKSB8fCAoIXBfZGV2LT5mdW5jdGlvbl9jb25maWcpIHx8CiAJICAgICghdHJ5X21vZHVsZV9nZXQocF9kcnYtPm93bmVyKSkpIHsKQEAgLTQ0MywzMyArNDIxLDI3IEBACiAJCXBfZGV2LT5jb25mLkNvbmZpZ0Jhc2UgPSBjaXNfY29uZmlnLmJhc2U7CiAJCXBfZGV2LT5jb25mLlByZXNlbnQgPSBjaXNfY29uZmlnLnJtYXNrWzBdOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInBjbWNpYTogY291bGQgbm90IHBhcnNlIGJhc2UgYW5kIHJtYXNrMCBvZiBDSVNcbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgZGV2LAorCQkJICAgInBjbWNpYTogY291bGQgbm90IHBhcnNlIGJhc2UgYW5kIHJtYXNrMCBvZiBDSVNcbiIpOwogCQlwX2Rldi0+Y29uZi5Db25maWdCYXNlID0gMDsKIAkJcF9kZXYtPmNvbmYuUHJlc2VudCA9IDA7CiAJfQogCiAJcmV0ID0gcF9kcnYtPnByb2JlKHBfZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRzX2RiZygxLCAiYmluZGluZyAlcyB0byAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJICAgICAgIHBfZGV2LT5kZXYuYnVzX2lkLCBwX2Rydi0+ZHJ2Lm5hbWUsIHJldCk7CisJCWRzX2Rldl9kYmcoMSwgZGV2LCAiYmluZGluZyB0byAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCSAgIHBfZHJ2LT5kcnYubmFtZSwgcmV0KTsKIAkJZ290byBwdXRfbW9kdWxlOwogCX0KIAotCS8qIGhhbmRsZSBwc2V1ZG8gbXVsdGlmdW5jdGlvbiBkZXZpY2VzOgotCSAqIHRoZXJlIGFyZSBhdCBtb3N0IHR3byBwc2V1ZG8gbXVsdGlmdW5jdGlvbiBkZXZpY2VzLgotCSAqIGlmIHdlJ3JlIG1hdGNoaW5nIGFnYWluc3QgdGhlIGZpcnN0LCBzY2hlZHVsZSBhCi0JICogY2FsbCB3aGljaCB3aWxsIHRoZW4gY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgdHdvCi0JICogcHNldWRvIGRldmljZXMsIGFuZCBpZiBub3QsIGFkZCB0aGUgc2Vjb25kIG9uZS4KLQkgKi8KLQlkaWQgPSBwX2Rldi0+ZGV2LmRyaXZlcl9kYXRhOwogCWlmIChkaWQgJiYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTykgJiYKIAkgICAgKHBfZGV2LT5zb2NrZXQtPmRldmljZV9jb3VudCA9PSAxKSAmJiAocF9kZXYtPmRldmljZV9ubyA9PSAwKSkKIAkJcGNtY2lhX2FkZF9kZXZpY2VfbGF0ZXIocF9kZXYtPnNvY2tldCwgMCk7CiAKLSBwdXRfbW9kdWxlOgorcHV0X21vZHVsZToKIAlpZiAocmV0KQogCQltb2R1bGVfcHV0KHBfZHJ2LT5vd25lcik7Ci0gcHV0X2RldjoKK3B1dF9kZXY6CiAJaWYgKHJldCkKIAkJcHV0X2RldmljZShkZXYpOwogCXJldHVybiAocmV0KTsKQEAgLTQ4NSw4ICs0NTcsOSBAQAogCXN0cnVjdCBwY21jaWFfZGV2aWNlCSp0bXA7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKLQlkc19kYmcoMiwgInBjbWNpYV9jYXJkX3JlbW92ZSglZCkgJXNcbiIsIHMtPnNvY2ssCi0JICAgICAgIGxlZnRvdmVyID8gbGVmdG92ZXItPmRldm5hbWUgOiAiIik7CisJZHNfZGV2X2RiZygyLCBsZWZ0b3ZlciA/ICZsZWZ0b3Zlci0+ZGV2IDogJnMtPmRldiwKKwkJICAgInBjbWNpYV9jYXJkX3JlbW92ZSglZCkgJXNcbiIsIHMtPnNvY2ssCisJCSAgIGxlZnRvdmVyID8gbGVmdG92ZXItPmRldm5hbWUgOiAiIik7CiAKIAlpZiAoIWxlZnRvdmVyKQogCQlzLT5kZXZpY2VfY291bnQgPSAwOwpAQCAtNTAzLDcgKzQ3Niw3IEBACiAJCXBfZGV2LT5fcmVtb3ZlZD0xOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCi0JCWRzX2RiZygyLCAidW5yZWdpc3RlcmluZyBkZXZpY2UgJXNcbiIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKKwkJZHNfZGV2X2RiZygyLCAmcF9kZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZGV2aWNlXG4iKTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJnBfZGV2LT5kZXYpOwogCX0KIApAQCAtNTIwLDcgKzQ5Myw3IEBACiAJcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRldi0+ZHJpdmVyKTsKIAotCWRzX2RiZygxLCAicmVtb3ZpbmcgZGV2aWNlICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CisJZHNfZGV2X2RiZygxLCBkZXYsICJyZW1vdmluZyBkZXZpY2VcbiIpOwogCiAJLyogSWYgd2UncmUgcmVtb3ZpbmcgdGhlIHByaW1hcnkgbW9kdWxlIGRyaXZpbmcgYQogCSAqIHBzZXVkbyBtdWx0aS1mdW5jdGlvbiBjYXJkLCB3ZSBuZWVkIHRvIHVuYmluZApAQCAtNTQzLDEzICs1MTYsMTUgQEAKIAogCS8qIGNoZWNrIGZvciBwcm9wZXIgdW5sb2FkaW5nICovCiAJaWYgKHBfZGV2LT5faXJxIHx8IHBfZGV2LT5faW8gfHwgcF9kZXYtPl9sb2NrZWQpCi0JCXByaW50ayhLRVJOX0lORk8gInBjbWNpYTogZHJpdmVyICVzIGRpZCBub3QgcmVsZWFzZSBjb25maWcgcHJvcGVybHlcbiIsCi0JCSAgICAgICBwX2Rydi0+ZHJ2Lm5hbWUpOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgZGV2LAorCQkJInBjbWNpYTogZHJpdmVyICVzIGRpZCBub3QgcmVsZWFzZSBjb25maWcgcHJvcGVybHlcbiIsCisJCQlwX2Rydi0+ZHJ2Lm5hbWUpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9XSU47IGkrKykKIAkJaWYgKHBfZGV2LT5fd2luICYgQ0xJRU5UX1dJTl9SRVEoaSkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IGRyaXZlciAlcyBkaWQgbm90IHJlbGVhc2Ugd2luZG93cyBwcm9wZXJseVxuIiwKLQkJCSAgICAgICBwX2Rydi0+ZHJ2Lm5hbWUpOworCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKKwkJCSAgInBjbWNpYTogZHJpdmVyICVzIGRpZCBub3QgcmVsZWFzZSB3aW5kb3cgcHJvcGVybHlcbiIsCisJCQkgICBwX2Rydi0+ZHJ2Lm5hbWUpOwogCiAJLyogcmVmZXJlbmNlcyBmcm9tIHBjbWNpYV9wcm9iZV9kZXZpY2UgKi8KIAlwY21jaWFfcHV0X2RldihwX2Rldik7CkBAIC01OTgsOCArNTczLDkgQEAKIAkJfQogCQlpZiAoIXBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLAogCQkJCSAgICAgIENJU1RQTF9ERVZJQ0VfR0VPLCBkZXZnZW8pKSB7Ci0JCQlkc19kYmcoMCwgIm1lbSBkZXZpY2UgZ2VvbWV0cnkgcHJvYmFibHkgbWVhbnMgIgotCQkJICAgICAgICJGVU5DSURfTUVNT1JZXG4iKTsKKwkJCWRzX2Rldl9kYmcoMCwgJnBfZGV2LT5kZXYsCisJCQkJICAgIm1lbSBkZXZpY2UgZ2VvbWV0cnkgcHJvYmFibHkgbWVhbnMgIgorCQkJCSAgICJGVU5DSURfTUVNT1JZXG4iKTsKIAkJCXBfZGV2LT5mdW5jX2lkID0gQ0lTVFBMX0ZVTkNJRF9NRU1PUlk7CiAJCQlwX2Rldi0+aGFzX2Z1bmNfaWQgPSAxOwogCQl9CkBAIC02ODAsNyArNjU2LDcgQEAKIAlpZiAoIXBfZGV2LT5kZXZuYW1lKQogCQlnb3RvIGVycl9mcmVlOwogCXNwcmludGYgKHBfZGV2LT5kZXZuYW1lLCAicGNtY2lhJXMiLCBwX2Rldi0+ZGV2LmJ1c19pZCk7Ci0JZHNfZGJnKDMsICJkZXZuYW1lIGlzICVzXG4iLCBwX2Rldi0+ZGV2bmFtZSk7CisJZHNfZGV2X2RiZygzLCAmcF9kZXYtPmRldiwgImRldm5hbWUgaXMgJXNcbiIsIHBfZGV2LT5kZXZuYW1lKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCkBAIC03MDEsNyArNjc3LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFwX2Rldi0+ZnVuY3Rpb25fY29uZmlnKSB7Ci0JCWRzX2RiZygzLCAiY3JlYXRpbmcgY29uZmlnX3QgZm9yICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CisJCWRzX2Rldl9kYmcoMywgJnBfZGV2LT5kZXYsICJjcmVhdGluZyBjb25maWdfdFxuIik7CiAJCXBfZGV2LT5mdW5jdGlvbl9jb25maWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX3QpLAogCQkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIXBfZGV2LT5mdW5jdGlvbl9jb25maWcpCkBAIC03MDksOCArNjg1LDkgQEAKIAkJa3JlZl9pbml0KCZwX2Rldi0+ZnVuY3Rpb25fY29uZmlnLT5yZWYpOwogCX0KIAotCXByaW50ayhLRVJOX05PVElDRSAicGNtY2lhOiByZWdpc3RlcmluZyBuZXcgZGV2aWNlICVzXG4iLAotCSAgICAgICBwX2Rldi0+ZGV2bmFtZSk7CisJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBfZGV2LT5kZXYsCisJCSAgICJwY21jaWE6IHJlZ2lzdGVyaW5nIG5ldyBkZXZpY2UgJXNcbiIsCisJCSAgIHBfZGV2LT5kZXZuYW1lKTsKIAogCXBjbWNpYV9kZXZpY2VfcXVlcnkocF9kZXYpOwogCkBAIC03NDUsMTkgKzcyMiwyMCBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCEocy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSkpIHsKLQkJZHNfZGJnKDMsICJubyByZXNvdXJjZXMgYXZhaWxhYmxlLCBkZWxheWluZyBjYXJkX2FkZFxuIik7CisJCWRzX2Rldl9kYmcoMywgJnMtPmRldiwKKwkJCSAgICJubyByZXNvdXJjZXMgYXZhaWxhYmxlLCBkZWxheWluZyBjYXJkX2FkZFxuIik7CiAJCXJldHVybiAtRUFHQUlOOyAvKiB0cnkgYWdhaW4sIGJ1dCBsYXRlci4uLiAqLwogCX0KIAogCWlmIChwY21jaWFfdmFsaWRhdGVfbWVtKHMpKSB7Ci0JCWRzX2RiZygzLCAidmFsaWRhdGluZyBtZW0gcmVzb3VyY2VzIGZhaWxlZCwgIgorCQlkc19kZXZfZGJnKDMsICZzLT5kZXYsICJ2YWxpZGF0aW5nIG1lbSByZXNvdXJjZXMgZmFpbGVkLCAiCiAJCSAgICAgICAiZGVsYXlpbmcgY2FyZF9hZGRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluLCBidXQgbGF0ZXIuLi4gKi8KIAl9CiAKIAlyZXQgPSBwY2NhcmRfdmFsaWRhdGVfY2lzKHMsIEJJTkRfRk5fQUxMLCAmbm9fY2hhaW5zKTsKIAlpZiAocmV0IHx8ICFub19jaGFpbnMpIHsKLQkJZHNfZGJnKDAsICJpbnZhbGlkIENJUyBvciBpbnZhbGlkIHJlc291cmNlc1xuIik7CisJCWRzX2Rldl9kYmcoMCwgJnMtPmRldiwgImludmFsaWQgQ0lTIG9yIGludmFsaWQgcmVzb3VyY2VzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03NzgsNyArNzU2LDcgQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCwgZGV2aWNlX2FkZCk7Ci0JZHNfZGJnKDEsICJhZGRpbmcgYWRkaXRpb25hbCBkZXZpY2UgdG8gJWRcbiIsIHMtPnNvY2spOworCWRzX2Rldl9kYmcoMSwgJnMtPmRldiwgImFkZGluZyBhZGRpdGlvbmFsIGRldmljZSB0byAlZFxuIiwgcy0+c29jayk7CiAJcGNtY2lhX2RldmljZV9hZGQocywgcy0+cGNtY2lhX3N0YXRlLm1mY19wZmMpOwogCXMtPnBjbWNpYV9zdGF0ZS5kZXZpY2VfYWRkX3BlbmRpbmcgPSAwOwogCXMtPnBjbWNpYV9zdGF0ZS5tZmNfcGZjID0gMDsKQEAgLTc4OCw4ICs3NjYsNyBAQAogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKIAlpZiAoIXBfZGV2LT5kZXYuZHJpdmVyKSB7Ci0JCWRzX2RiZygxLCAidXBkYXRlIGRldmljZSBpbmZvcm1hdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICBwX2Rldi0+ZGV2LmJ1c19pZCk7CisJCWRzX2Rldl9kYmcoMSwgZGV2LCAidXBkYXRlIGRldmljZSBpbmZvcm1hdGlvblxuIik7CiAJCXBjbWNpYV9kZXZpY2VfcXVlcnkocF9kZXYpOwogCX0KIApAQCAtODAzLDcgKzc4MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIG11c3QgYmUgY2FsbGVkIHdpdGggc2t0X211dGV4IGhlbGQgKi8KLQlkc19kYmcoMCwgInJlLXNjYW5uaW5nIHNvY2tldCAlZFxuIiwgc2t0LT5zb2NrKTsKKwlkc19kZXZfZGJnKDAsICZza3QtPmRldiwgInJlLXNjYW5uaW5nIHNvY2tldCAlZFxuIiwgc2t0LT5zb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZza3QtPmRldmljZXNfbGlzdCkpCkBAIC04NTQsMTcgKzgzMSwxNyBAQAogCWludCByZXQgPSAtRU5PTUVNOwogCWludCBub19mdW5jczsKIAlpbnQgb2xkX2Z1bmNzOwotCWNpc2R1bXBfdCAqY2lzOwogCWNpc3RwbF9sb25nbGlua19tZmNfdCBtZmM7CiAKIAlpZiAoIWZpbGVuYW1lKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRzX2RiZygxLCAidHJ5aW5nIHRvIGxvYWQgQ0lTIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKwlkc19kZXZfZGJnKDEsICZkZXYtPmRldiwgInRyeWluZyB0byBsb2FkIENJUyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CiAKIAlpZiAoc3RybGVuKGZpbGVuYW1lKSA+IChGSVJNV0FSRV9OQU1FX01BWCAtIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBjbWNpYTogQ0lTIGZpbGVuYW1lIGlzIHRvbyBsb25nIFslc11cbiIsCi0JCQlmaWxlbmFtZSk7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmZGV2LT5kZXYsCisJCQkgICAicGNtY2lhOiBDSVMgZmlsZW5hbWUgaXMgdG9vIGxvbmcgWyVzXVxuIiwKKwkJCSAgIGZpbGVuYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NzMsMjMgKzg1MCwxNiBAQAogCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgcGF0aCwgJmRldi0+ZGV2KSA9PSAwKSB7CiAJCWlmIChmdy0+c2l6ZSA+PSBDSVNUUExfTUFYX0NJU19TSVpFKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwotCQkJcHJpbnRrKEtFUk5fRVJSICJwY21jaWE6IENJUyBvdmVycmlkZSBpcyB0b28gYmlnXG4iKTsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPmRldiwKKwkJCQkgICAicGNtY2lhOiBDSVMgb3ZlcnJpZGUgaXMgdG9vIGJpZ1xuIik7CiAJCQlnb3RvIHJlbGVhc2U7CiAJCX0KIAotCQljaXMgPSBremFsbG9jKHNpemVvZihjaXNkdW1wX3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaXMpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIHJlbGVhc2U7Ci0JCX0KLQotCQljaXMtPkxlbmd0aCA9IGZ3LT5zaXplICsgMTsKLQkJbWVtY3B5KGNpcy0+RGF0YSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKLQotCQlpZiAoIXBjbWNpYV9yZXBsYWNlX2NpcyhzLCBjaXMpKQorCQlpZiAoIXBjbWNpYV9yZXBsYWNlX2NpcyhzLCBmdy0+ZGF0YSwgZnctPnNpemUpKQogCQkJcmV0ID0gMDsKIAkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBjbWNpYTogQ0lTIG92ZXJyaWRlIGZhaWxlZFxuIik7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5kZXYsCisJCQkJICAgInBjbWNpYTogQ0lTIG92ZXJyaWRlIGZhaWxlZFxuIik7CiAJCQlnb3RvIHJlbGVhc2U7CiAJCX0KIApAQCAtOTkzLDE0ICs5NjMsMTQgQEAKIAkJICogYWZ0ZXIgaXQgaGFzIHJlLWNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBwb3NzaWJsZSBtb2R1bGUKIAkJICogd2l0aCBhIHByb2RfaWQvbWFuZl9pZC9jYXJkX2lkIG1hdGNoLgogCQkgKi8KLQkJZHNfZGJnKDAsICJza2lwcGluZyBGVU5DX0lEIG1hdGNoIGZvciAlcyB1bnRpbCB1c2Vyc3BhY2UgIgotCQkgICAgICAgImludGVyYWN0aW9uXG4iLCBkZXYtPmRldi5idXNfaWQpOworCQlkc19kZXZfZGJnKDAsICZkZXYtPmRldiwKKwkJCSJza2lwcGluZyBGVU5DX0lEIG1hdGNoIHVudGlsIHVzZXJzcGFjZSBpbnRlcmFjdGlvblxuIik7CiAJCWlmICghZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTKSB7Ci0JCWRzX2RiZygwLCAiZGV2aWNlICVzIG5lZWRzIGEgZmFrZSBDSVNcbiIsIGRldi0+ZGV2LmJ1c19pZCk7CisJCWRzX2Rldl9kYmcoMCwgJmRldi0+ZGV2LCAiZGV2aWNlIG5lZWRzIGEgZmFrZSBDSVNcbiIpOwogCQlpZiAoIWRldi0+c29ja2V0LT5mYWtlX2NpcykKIAkJCXBjbWNpYV9sb2FkX2Zpcm13YXJlKGRldiwgZGlkLT5jaXNmaWxlKTsKIApAQCAtMTAzMiwxMSArMTAwMiw5IEBACiAJLyogbWF0Y2ggZHluYW1pYyBkZXZpY2VzIGZpcnN0ICovCiAJc3Bpbl9sb2NrKCZwX2Rydi0+ZHluaWRzLmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHluaWQsICZwX2Rydi0+ZHluaWRzLmxpc3QsIG5vZGUpIHsKLQkJZHNfZGJnKDMsICJ0cnlpbmcgdG8gbWF0Y2ggJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAotCQkgICAgICAgZHJ2LT5uYW1lKTsKKwkJZHNfZGV2X2RiZygzLCBkZXYsICJ0cnlpbmcgdG8gbWF0Y2ggdG8gJXNcbiIsIGRydi0+bmFtZSk7CiAJCWlmIChwY21jaWFfZGV2bWF0Y2gocF9kZXYsICZkeW5pZC0+aWQpKSB7Ci0JCQlkc19kYmcoMCwgIm1hdGNoZWQgJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAotCQkJICAgICAgIGRydi0+bmFtZSk7CisJCQlkc19kZXZfZGJnKDAsIGRldiwgIm1hdGNoZWQgdG8gJXNcbiIsIGRydi0+bmFtZSk7CiAJCQlzcGluX3VubG9jaygmcF9kcnYtPmR5bmlkcy5sb2NrKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMDQ2LDE4ICsxMDE0LDE1IEBACiAjaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAogCS8qIG1hdGNoaW5nIGJ5IGNhcmRtZ3IgKi8KIAlpZiAocF9kZXYtPmNhcmRtZ3IgPT0gcF9kcnYpIHsKLQkJZHNfZGJnKDAsICJjYXJkbWdyIG1hdGNoZWQgJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAotCQkgICAgICAgZHJ2LT5uYW1lKTsKKwkJZHNfZGV2X2RiZygwLCBkZXYsICJjYXJkbWdyIG1hdGNoZWQgdG8gJXNcbiIsIGRydi0+bmFtZSk7CiAJCXJldHVybiAxOwogCX0KICNlbmRpZgogCiAJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7Ci0JCWRzX2RiZygzLCAidHJ5aW5nIHRvIG1hdGNoICVzIHRvICVzXG4iLCBkZXYtPmJ1c19pZCwKLQkJICAgICAgIGRydi0+bmFtZSk7CisJCWRzX2Rldl9kYmcoMywgZGV2LCAidHJ5aW5nIHRvIG1hdGNoIHRvICVzXG4iLCBkcnYtPm5hbWUpOwogCQlpZiAocGNtY2lhX2Rldm1hdGNoKHBfZGV2LCBkaWQpKSB7Ci0JCQlkc19kYmcoMCwgIm1hdGNoZWQgJXMgdG8gJXNcbiIsIGRldi0+YnVzX2lkLAotCQkJICAgICAgIGRydi0+bmFtZSk7CisJCQlkc19kZXZfZGJnKDAsIGRldiwgIm1hdGNoZWQgdG8gJXNcbiIsIGRydi0+bmFtZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlkaWQrKzsKQEAgLTEyNjMsNyArMTIyOCw3IEBACiAJaWYgKHBfZGV2LT5zdXNwZW5kZWQpCiAJCXJldHVybiAwOwogCi0JZHNfZGJnKDIsICJzdXNwZW5kaW5nICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJZHNfZGV2X2RiZygyLCBkZXYsICJzdXNwZW5kaW5nXG4iKTsKIAogCWlmIChkZXYtPmRyaXZlcikKIAkJcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRldi0+ZHJpdmVyKTsKQEAgLTEyNzQsMTUgKzEyMzksMTYgQEAKIAlpZiAocF9kcnYtPnN1c3BlbmQpIHsKIAkJcmV0ID0gcF9kcnYtPnN1c3BlbmQocF9kZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBjbWNpYTogZGV2aWNlICVzIChkcml2ZXIgJXMpIGRpZCAiCi0JCQkgICAgICAgIm5vdCB3YW50IHRvIGdvIHRvIHNsZWVwICglZClcbiIsCi0JCQkgICAgICAgcF9kZXYtPmRldm5hbWUsIHBfZHJ2LT5kcnYubmFtZSwgcmV0KTsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwKKwkJCQkgICAicGNtY2lhOiBkZXZpY2UgJXMgKGRyaXZlciAlcykgZGlkICIKKwkJCQkgICAibm90IHdhbnQgdG8gZ28gdG8gc2xlZXAgKCVkKVxuIiwKKwkJCQkgICBwX2Rldi0+ZGV2bmFtZSwgcF9kcnYtPmRydi5uYW1lLCByZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKIAlpZiAocF9kZXYtPmRldmljZV9ubyA9PSBwX2Rldi0+ZnVuYykgewotCQlkc19kYmcoMiwgInJlbGVhc2luZyBjb25maWd1cmF0aW9uIGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCQlkc19kZXZfZGJnKDIsIGRldiwgInJlbGVhc2luZyBjb25maWd1cmF0aW9uXG4iKTsKIAkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihwX2Rldik7CiAJfQogCkBAIC0xMzAyLDcgKzEyNjgsNyBAQAogCWlmICghcF9kZXYtPnN1c3BlbmRlZCkKIAkJcmV0dXJuIDA7CiAKLQlkc19kYmcoMiwgInJlc3VtaW5nICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJZHNfZGV2X2RiZygyLCBkZXYsICJyZXN1bWluZ1xuIik7CiAKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihkZXYtPmRyaXZlcik7CkBAIC0xMzExLDcgKzEyNzcsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmIChwX2Rldi0+ZGV2aWNlX25vID09IHBfZGV2LT5mdW5jKSB7Ci0JCWRzX2RiZygyLCAicmVxdWVzdGluZyBjb25maWd1cmF0aW9uIGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCQlkc19kZXZfZGJnKDIsIGRldiwgInJlcXVlc3RpbmcgY29uZmlndXJhdGlvblxuIik7CiAJCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24ocF9kZXYsICZwX2Rldi0+Y29uZik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKQEAgLTEzNTMsMTQgKzEzMTksMTQgQEAKIAogc3RhdGljIGludCBwY21jaWFfYnVzX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogewotCWRzX2RiZygyLCAicmVzdW1pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOworCWRzX2Rldl9kYmcoMiwgJnNrdC0+ZGV2LCAicmVzdW1pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOwogCWJ1c19mb3JfZWFjaF9kZXYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgc2t0LCBwY21jaWFfYnVzX3Jlc3VtZV9jYWxsYmFjayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX2J1c19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7Ci0JZHNfZGJnKDIsICJzdXNwZW5kaW5nIHNvY2tldCAlZFxuIiwgc2t0LT5zb2NrKTsKKwlkc19kZXZfZGJnKDIsICZza3QtPmRldiwgInN1c3BlbmRpbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOwogCWlmIChidXNfZm9yX2VhY2hfZGV2KCZwY21jaWFfYnVzX3R5cGUsIE5VTEwsIHNrdCwKIAkJCSAgICAgcGNtY2lhX2J1c19zdXNwZW5kX2NhbGxiYWNrKSkgewogCQlwY21jaWFfYnVzX3Jlc3VtZShza3QpOwpAQCAtMTM4NiwxMyArMTM1MiwxNCBAQAogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcGNtY2lhX2dldF9zb2NrZXQoc2t0KTsKIAogCWlmICghcykgewotCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQSBvYnRhaW5pbmcgcmVmZXJlbmNlIHRvIHNvY2tldCAlcCAiIFwKLQkJCSJmYWlsZWQsIGV2ZW50IDB4JXggbG9zdCFcbiIsIHNrdCwgZXZlbnQpOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmc2t0LT5kZXYsCisJCQkgICAiUENNQ0lBIG9idGFpbmluZyByZWZlcmVuY2UgdG8gc29ja2V0ICIJXAorCQkJICAgImZhaWxlZCwgZXZlbnQgMHgleCBsb3N0IVxuIiwgZXZlbnQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlkc19kYmcoMSwgImRzX2V2ZW50KDB4JTA2eCwgJWQsIDB4JXApXG4iLAotCSAgICAgICBldmVudCwgcHJpb3JpdHksIHNrdCk7CisJZHNfZGV2X2RiZygxLCAmc2t0LT5kZXYsICJkc19ldmVudCgweCUwNngsICVkLCAweCVwKVxuIiwKKwkJICAgZXZlbnQsIHByaW9yaXR5LCBza3QpOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgpAQCAtMTQ2Nyw3ICsxNDM0LDggQEAKIAogCXNvY2tldCA9IHBjbWNpYV9nZXRfc29ja2V0KHNvY2tldCk7CiAJaWYgKCFzb2NrZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ01DSUEgb2J0YWluaW5nIHJlZmVyZW5jZSB0byBzb2NrZXQgJXAgZmFpbGVkXG4iLCBzb2NrZXQpOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsCisJCQkgICAiUENNQ0lBIG9idGFpbmluZyByZWZlcmVuY2UgdG8gc29ja2V0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTQ4Nyw3ICsxNDU1LDcgQEAKIAogCXJldCA9IHBjY2FyZF9yZWdpc3Rlcl9wY21jaWEoc29ja2V0LCAmcGNtY2lhX2J1c19jYWxsYmFjayk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQSByZWdpc3RyYXRpb24gUENDYXJkIGNvcmUgZmFpbGVkIGZvciBzb2NrZXQgJXBcbiIsIHNvY2tldCk7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgIlBDTUNJQSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJcGNtY2lhX3B1dF9zb2NrZXQoc29ja2V0KTsKIAkJcmV0dXJuIChyZXQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9kc19pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJiMjVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBkc19pbnRlcm5hbC5oIC0gaW50ZXJuYWwgaGVhZGVyIGZvciAxNi1iaXQgUENNQ0lBIGRldmljZXMgbWFuYWdlbWVudCAqLwotCi1leHRlcm4gc3BpbmxvY2tfdCBwY21jaWFfZGV2X2xpc3RfbG9jazsKLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlOwotCi1leHRlcm4gc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOwotZXh0ZXJuIHZvaWQgcGNtY2lhX3B1dF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKLQotc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZGV2aWNlX2FkZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmN0aW9uKTsKLQotZXh0ZXJuIGludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7Ci0KLSNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCi1leHRlcm4gdm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IHBjbWNpYV9jbGVhbnVwX2lvY3RsKHZvaWQpOwotZXh0ZXJuIHZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KTsKLWV4dGVybiBpbnQgaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHBjbWNpYV9jbGVhbnVwX2lvY3RsKHZvaWQpIHsgcmV0dXJuOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KSB7IHJldHVybjsgfQotc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQpIHsgcmV0dXJuIENTX1NVQ0NFU1M7IH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jIGIvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jCmluZGV4IGZiMmJjMWYuLjExN2RjMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2hkNjQ0NjVfc3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9oZDY0NDY1X3NzLmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+Ci0jaW5jbHVkZSAiY3NfaW50ZXJuYWwuaCIKIAogI2RlZmluZSBNT0ROQU1FICJoZDY0NDY1X3NzIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCmluZGV4IDY4ZjZiMjcuLjcxNjUzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jCkBAIC02Myw3ICs2Myw3IEBACiAjaW5jbHVkZSAidmc0NjguaCIKICNpbmNsdWRlICJyaWNvaC5oIgogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQogImk4MjM2NS5jIDEuMjY1IDE5OTkvMTEvMTAgMTg6MzY6MjEgKERhdmlkIEhpbmRzKSI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCmluZGV4IDM2MTZkYTIuLjJhYjRmMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYwpAQCAtMzgsNyArMzgsNyBAQAogCiAjaW5jbHVkZSAibTMycl9jZmMuaCIKIAotI2lmZGVmIERFQlVHCisjaWZkZWYgQ09ORklHX1BDTUNJQV9ERUJVRwogc3RhdGljIGludCBtMzJyX2NmY19kZWJ1ZzsKIG1vZHVsZV9wYXJhbShtMzJyX2NmY19kZWJ1ZywgaW50LCAwNjQ0KTsKICNkZWZpbmUgZGVidWcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJCQlcCkBAIC01MDUsNyArNTA1LDcgQEAKIAkJcGNjX3NldChzb2NrLCh1bnNpZ25lZCBpbnQpUExEX0NGQlVGQ1IsMSk7CiAJfQogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0RFQlVHCiAJaWYoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKXsKIAkJZGVidWcoMywgIjpJT0NBUkQiKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwppbmRleCAyYjQyYjcxLi4yZjEwOGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBQQ0NfREVCVUdfREJFWAogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0RFQlVHCiBzdGF0aWMgaW50IG0zMnJfcGNjX2RlYnVnOwogbW9kdWxlX3BhcmFtKG0zMnJfcGNjX2RlYnVnLCBpbnQsIDA2NDQpOwogI2RlZmluZSBkZWJ1ZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJCVwKQEAgLTQ2MCw3ICs0NjAsNyBAQAogCiAJcGNjX3NldChzb2NrLFBDQ1NJR0NSLHJlZyk7CiAKLSNpZmRlZiBERUJVRworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKIAlpZihzdGF0ZS0+ZmxhZ3MgJiBTU19JT0NBUkQpewogCQlkZWJ1ZygzLCAiOklPQ0FSRCIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCmluZGV4IGZmNjY2MDQuLmQxYWQwOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwpAQCAtNjQsOCArNjQsOCBAQAogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogCi0jaWZkZWYgUENNQ0lBX0RFQlVHCi1zdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWc7CiBtb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIm04eHhfcGNtY2lhOiAiIGFyZ3MpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL28ybWljcm8uaCBiL2RyaXZlcnMvcGNtY2lhL28ybWljcm8uaAppbmRleCBhMjM0Y2UxLi41NTU0MDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9vMm1pY3JvLmgKKysrIGIvZHJpdmVycy9wY21jaWEvbzJtaWNyby5oCkBAIC0xNDAsNyArMTQwLDggQEAKIAkJYSA9IGNvbmZpZ19yZWFkYihzb2NrZXQsIE8yX1JFU0VSVkVEMSk7CiAJCWIgPSBjb25maWdfcmVhZGIoc29ja2V0LCBPMl9SRVNFUlZFRDIpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIlllbnRhIE8yOiByZXMgYXQgMHg5NC8weEQ0OiAlMDJ4LyUwMnhcbiIsIGEsIGIpOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCQkgICAiTzI6IHJlcyBhdCAweDk0LzB4RDQ6ICUwMngvJTAyeFxuIiwgYSwgYik7CiAKIAkJc3dpdGNoIChzb2NrZXQtPmRldi0+ZGV2aWNlKSB7CiAJCS8qCkBAIC0xNTMsNyArMTU0LDkgQEAKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzY4MTI6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9PMl82ODMyOgogCQljYXNlIFBDSV9ERVZJQ0VfSURfTzJfNjgzNjoKLQkJCXByaW50ayhLRVJOX0lORk8gIlllbnRhIE8yOiBvbGQgYnJpZGdlLCBkaXNhYmxpbmcgcmVhZCBwcmVmZXRjaC93cml0ZSBidXJzdFxuIik7CisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCQkJICAgIlllbnRhIE8yOiBvbGQgYnJpZGdlLCBkaXNhYmxpbmcgcmVhZCAiCisJCQkJICAgInByZWZldGNoL3dyaXRlIGJ1cnN0XG4iKTsKIAkJCWNvbmZpZ193cml0ZWIoc29ja2V0LCBPMl9SRVNFUlZFRDEsCiAJCQkgICAgICAgICAgICAgIGEgJiB+KE8yX1JFU19SRUFEX1BSRUZFVENIIHwgTzJfUkVTX1dSSVRFX0JVUlNUKSk7CiAJCQljb25maWdfd3JpdGViKHNvY2tldCwgTzJfUkVTRVJWRUQyLApAQCAtMTYxLDcgKzE2NCw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGEgTzI6IGVuYWJsaW5nIHJlYWQgcHJlZmV0Y2gvd3JpdGUgYnVyc3RcbiIpOworCQkJZGV2X3ByaW50ayhLRVJOX0lORk8gLCAmc29ja2V0LT5kZXYtPmRldiwKKwkJCQkgICAiTzI6IGVuYWJsaW5nIHJlYWQgcHJlZmV0Y2gvd3JpdGUgYnVyc3RcbiIpOwogCQkJY29uZmlnX3dyaXRlYihzb2NrZXQsIE8yX1JFU0VSVkVEMSwKIAkJCSAgICAgICAgICAgICAgYSB8IE8yX1JFU19SRUFEX1BSRUZFVENIIHwgTzJfUkVTX1dSSVRFX0JVUlNUKTsKIAkJCWNvbmZpZ193cml0ZWIoc29ja2V0LCBPMl9SRVNFUlZFRDIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCmluZGV4IDQxOWY5N2YuLjE3MDNiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAKICNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgotI2luY2x1ZGUgImRzX2ludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgbWFqb3JfZGV2ID0gLTE7CiAKQEAgLTU4LDcgKzU3LDcgQEAKIH0gdXNlcl9pbmZvX3Q7CiAKIAotI2lmZGVmIERFQlVHCisjaWZkZWYgQ09ORklHX1BDTUNJQV9ERUJVRwogZXh0ZXJuIGludCBkc19wY19kZWJ1ZzsKIAogI2RlZmluZSBkc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJXApAQCAtMTQ5LDcgKzE0OCw3IEBACiAKIAlpcnEgPSBhZGotPnJlc291cmNlLmlycS5JUlE7CiAJaWYgKChpcnEgPCAwKSB8fCAoaXJxID4gMTUpKQotCQlyZXR1cm4gQ1NfQkFEX0lSUTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYWRqLT5BY3Rpb24gIT0gUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0UpCiAJCXJldHVybiAwOwpAQCAtMTY3LDcgKzE2Niw3IEBACiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBhZGp1c3RfaXJxKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKSB7Ci0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpAQCAtMTc1LDcgKzE3NCw3IEBACiBzdGF0aWMgaW50IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbyhhZGp1c3RfdCAqYWRqKQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWludCByZXQgPSBDU19VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwlpbnQgcmV0ID0gLUVOT1NZUzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZG93bl9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJaWYgKHMtPnN0YXRlICYgU09DS0VUX1NVU1BFTkQpCiAJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9IENTX0VWRU5UX1BNX1NVU1BFTkQ7CiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JCXJldHVybiBDU19OT19DQVJEOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCWMgPSAocF9kZXYpID8gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZyA6IE5VTEw7CiAKQEAgLTI3NCw3ICsyNzMsNyBAQAogCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0KIAkJCQkocmVnICYgRVNSX1JFUV9BVFROKSA/IENTX0VWRU5UX1JFUVVFU1RfQVRURU5USU9OIDogMDsKIAkJfQotCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwkJcmV0dXJuIDA7CiAJfQogCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CiAJCSh2YWwgJiBTU19XUlBST1QpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7CkBAIC0yODQsOSArMjgzLDgxIEBACiAJCSh2YWwgJiBTU19CQVRXQVJOKSA/IENTX0VWRU5UX0JBVFRFUllfTE9XIDogMDsKIAlzdGF0dXMtPkNhcmRTdGF0ZSB8PQogCQkodmFsICYgU1NfUkVBRFkpID8gQ1NfRVZFTlRfUkVBRFlfQ0hBTkdFIDogMDsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogcGNjYXJkX2dldF9zdGF0dXMgKi8KIAoraW50IHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAorCQkJCSAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQoreworCWNvbmZpZ190ICpjOworCisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiAtRU5PREVWOworCisKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSB7CisJCW1lbXNldChjb25maWcsIDAsIHNpemVvZihjb25maWdfaW5mb190KSk7CisJCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKKwkJY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKKwkJY29uZmlnLT5PcHRpb24gPSBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlLT5udW1iZXI7CisJCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTX0NPTkZJRykgeworCQkJY29uZmlnLT5BdHRyaWJ1dGVzID0gQ09ORl9WQUxJRF9DTElFTlQ7CisJCQljb25maWctPkludFR5cGUgPSBJTlRfQ0FSREJVUzsKKwkJCWNvbmZpZy0+QXNzaWduZWRJUlEgPSBzLT5pcnEuQXNzaWduZWRJUlE7CisJCQlpZiAoY29uZmlnLT5Bc3NpZ25lZElSUSkKKwkJCQljb25maWctPkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQkJaWYgKHMtPmlvWzBdLnJlcykgeworCQkJCWNvbmZpZy0+QmFzZVBvcnQxID0gcy0+aW9bMF0ucmVzLT5zdGFydDsKKwkJCQljb25maWctPk51bVBvcnRzMSA9IHMtPmlvWzBdLnJlcy0+ZW5kIC0KKwkJCQkJY29uZmlnLT5CYXNlUG9ydDEgKyAxOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJaWYgKHBfZGV2KSB7CisJCWMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOworCQljb25maWctPkZ1bmN0aW9uID0gcF9kZXYtPmZ1bmM7CisJfSBlbHNlIHsKKwkJYyA9IE5VTEw7CisJCWNvbmZpZy0+RnVuY3Rpb24gPSAwOworCX0KKworCWlmICgoYyA9PSBOVUxMKSB8fCAhKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpIHsKKwkJY29uZmlnLT5BdHRyaWJ1dGVzID0gMDsKKwkJY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOworCQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25maWctPkF0dHJpYnV0ZXMgPSBjLT5BdHRyaWJ1dGVzIHwgQ09ORl9WQUxJRF9DTElFTlQ7CisJY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOworCWNvbmZpZy0+VnBwMSA9IGNvbmZpZy0+VnBwMiA9IHMtPnNvY2tldC5WcHA7CisJY29uZmlnLT5JbnRUeXBlID0gYy0+SW50VHlwZTsKKwljb25maWctPkNvbmZpZ0Jhc2UgPSBjLT5Db25maWdCYXNlOworCWNvbmZpZy0+U3RhdHVzID0gYy0+U3RhdHVzOworCWNvbmZpZy0+UGluID0gYy0+UGluOworCWNvbmZpZy0+Q29weSA9IGMtPkNvcHk7CisJY29uZmlnLT5PcHRpb24gPSBjLT5PcHRpb247CisJY29uZmlnLT5FeHRTdGF0dXMgPSBjLT5FeHRTdGF0dXM7CisJY29uZmlnLT5QcmVzZW50ID0gY29uZmlnLT5DYXJkVmFsdWVzID0gYy0+Q2FyZFZhbHVlczsKKwljb25maWctPklSUUF0dHJpYnV0ZXMgPSBjLT5pcnEuQXR0cmlidXRlczsKKwljb25maWctPkFzc2lnbmVkSVJRID0gcy0+aXJxLkFzc2lnbmVkSVJROworCWNvbmZpZy0+QmFzZVBvcnQxID0gYy0+aW8uQmFzZVBvcnQxOworCWNvbmZpZy0+TnVtUG9ydHMxID0gYy0+aW8uTnVtUG9ydHMxOworCWNvbmZpZy0+QXR0cmlidXRlczEgPSBjLT5pby5BdHRyaWJ1dGVzMTsKKwljb25maWctPkJhc2VQb3J0MiA9IGMtPmlvLkJhc2VQb3J0MjsKKwljb25maWctPk51bVBvcnRzMiA9IGMtPmlvLk51bVBvcnRzMjsKKwljb25maWctPkF0dHJpYnV0ZXMyID0gYy0+aW8uQXR0cmlidXRlczI7CisJY29uZmlnLT5JT0FkZHJMaW5lcyA9IGMtPmlvLklPQWRkckxpbmVzOworCisJcmV0dXJuIDA7Cit9IC8qIHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvICovCisKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICBUaGVzZSBtYW5hZ2UgYSByaW5nIGJ1ZmZlciBvZiBldmVudHMgcGVuZGluZyBmb3Igb25lIHVzZXIgcHJvY2VzcwpAQCAtNzY0LDcgKzgzNSw3IEBACiAgICAgY2FzZSBEU19HRVRfQ09ORklHVVJBVElPTl9JTkZPOgogCWlmIChidWYtPmNvbmZpZy5GdW5jdGlvbiAmJgogCSAgIChidWYtPmNvbmZpZy5GdW5jdGlvbiA+PSBzLT5mdW5jdGlvbnMpKQotCSAgICByZXQgPSBDU19CQURfQVJHUzsKKwkgICAgcmV0ID0gLUVJTlZBTDsKIAllbHNlIHsKIAkgICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gZ2V0X3BjbWNpYV9kZXZpY2UocywgYnVmLT5jb25maWcuRnVuY3Rpb24pOwogCSAgICByZXQgPSBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzLCBwX2RldiwgJmJ1Zi0+Y29uZmlnKTsKQEAgLTc4NywxNSArODU4LDE1IEBACiAJYnJlYWs7CiAgICAgY2FzZSBEU19QQVJTRV9UVVBMRToKIAlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKLQlyZXQgPSBwY2NhcmRfcGFyc2VfdHVwbGUoJmJ1Zi0+dHVwbGUsICZidWYtPnR1cGxlX3BhcnNlLnBhcnNlKTsKKwlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUoJmJ1Zi0+dHVwbGUsICZidWYtPnR1cGxlX3BhcnNlLnBhcnNlKTsKIAlicmVhazsKICAgICBjYXNlIERTX1JFU0VUX0NBUkQ6Ci0JcmV0ID0gcGNjYXJkX3Jlc2V0X2NhcmQocyk7CisJcmV0ID0gcGNtY2lhX3Jlc2V0X2NhcmQocyk7CiAJYnJlYWs7CiAgICAgY2FzZSBEU19HRVRfU1RBVFVTOgogCSAgICBpZiAoYnVmLT5zdGF0dXMuRnVuY3Rpb24gJiYKIAkJKGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uID49IHMtPmZ1bmN0aW9ucykpCi0JCSAgICByZXQgPSBDU19CQURfQVJHUzsKKwkJICAgIHJldCA9IC1FSU5WQUw7CiAJICAgIGVsc2UgewogCQkgICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gZ2V0X3BjbWNpYV9kZXZpY2UocywgYnVmLT5zdGF0dXMuRnVuY3Rpb24pOwogCQkgICAgcmV0ID0gcGNjYXJkX2dldF9zdGF0dXMocywgcF9kZXYsICZidWYtPnN0YXR1cyk7CkBAIC04MjYsNyArODk3LDcgQEAKIAkgICAgZ290byBmcmVlX291dDsKIAl9CiAKLQlyZXQgPSBDU19CQURfQVJHUzsKKwlyZXQgPSAtRUlOVkFMOwogCiAJaWYgKCEoYnVmLT5jb25mX3JlZy5GdW5jdGlvbiAmJgogCSAgICAgKGJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24gPj0gcy0+ZnVuY3Rpb25zKSkpIHsKQEAgLTg2Nyw3ICs5MzgsNyBAQAogCQkJICAgJmJ1Zi0+d2luX2luZm8ubWFwKTsKIAlicmVhazsKICAgICBjYXNlIERTX1JFUExBQ0VfQ0lTOgotCXJldCA9IHBjbWNpYV9yZXBsYWNlX2NpcyhzLCAmYnVmLT5jaXNkdW1wKTsKKwlyZXQgPSBwY21jaWFfcmVwbGFjZV9jaXMocywgYnVmLT5jaXNkdW1wLkRhdGEsIGJ1Zi0+Y2lzZHVtcC5MZW5ndGgpOwogCWJyZWFrOwogICAgIGNhc2UgRFNfQklORF9SRVFVRVNUOgogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewpAQCAtODg5LDIyICs5NjAsMTkgQEAKIAllcnIgPSAtRUlOVkFMOwogICAgIH0KIAotICAgIGlmICgoZXJyID09IDApICYmIChyZXQgIT0gQ1NfU1VDQ0VTUykpIHsKKyAgICBpZiAoKGVyciA9PSAwKSAmJiAocmV0ICE9IDApKSB7CiAJZHNfZGJnKDIsICJkc19pb2N0bDogcmV0ID0gJWRcbiIsIHJldCk7CiAJc3dpdGNoIChyZXQpIHsKLQljYXNlIENTX0JBRF9TT0NLRVQ6IGNhc2UgQ1NfTk9fQ0FSRDoKLQkgICAgZXJyID0gLUVOT0RFVjsgYnJlYWs7Ci0JY2FzZSBDU19CQURfQVJHUzogY2FzZSBDU19CQURfQVRUUklCVVRFOiBjYXNlIENTX0JBRF9JUlE6Ci0JY2FzZSBDU19CQURfVFVQTEU6Ci0JICAgIGVyciA9IC1FSU5WQUw7IGJyZWFrOwotCWNhc2UgQ1NfSU5fVVNFOgotCSAgICBlcnIgPSAtRUJVU1k7IGJyZWFrOwotCWNhc2UgQ1NfT1VUX09GX1JFU09VUkNFOgorCWNhc2UgLUVOT0RFVjoKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUJVU1k6CisJY2FzZSAtRU5PU1lTOgorCSAgICBlcnIgPSByZXQ7CisJICAgIGJyZWFrOworCWNhc2UgLUVOT01FTToKIAkgICAgZXJyID0gLUVOT1NQQzsgYnJlYWs7Ci0JY2FzZSBDU19OT19NT1JFX0lURU1TOgorCWNhc2UgLUVOT1NQQzoKIAkgICAgZXJyID0gLUVOT0RBVEE7IGJyZWFrOwotCWNhc2UgQ1NfVU5TVVBQT1JURURfRlVOQ1RJT046Ci0JICAgIGVyciA9IC1FTk9TWVM7IGJyZWFrOwogCWRlZmF1bHQ6CiAJICAgIGVyciA9IC1FSU87IGJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKaW5kZXggNDg4NGExOC4uYWZlYTJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KIAogI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZHNfaW50ZXJuYWwuaCIKIAogCiAvKiBBY2Nlc3Mgc3BlZWQgZm9yIElPIHdpbmRvd3MgKi8KQEAgLTQ0LDE2ICs0MywxNyBAQAogI2VuZGlmCiAKIAotI2lmZGVmIERFQlVHCisjaWZkZWYgQ09ORklHX1BDTUNJQV9ERUJVRwogZXh0ZXJuIGludCBkc19wY19kZWJ1ZzsKIAogI2RlZmluZSBkc19kYmcoc2t0LCBsdmwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJXAogCWlmIChkc19wY19kZWJ1ZyA+PSBsdmwpCQkJCQlcCi0JCXByaW50ayhLRVJOX0RFQlVHICJwY21jaWFfcmVzb3VyY2U6ICVzOiAiIGZtdCwJXAotCQkJY3Nfc29ja2V0X25hbWUoc2t0KSAsICMjIGFyZyk7CQlcCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnNrdC0+ZGV2LAkJXAorCQkJICAgInBjbWNpYV9yZXNvdXJjZTogIiBmbXQsCQlcCisJCQkgICAjIyBhcmcpOwkJCQlcCiB9IHdoaWxlICgwKQogI2Vsc2UKLSNkZWZpbmUgZHNfZGJnKGx2bCwgZm10LCBhcmcuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZHNfZGJnKHNrdCwgbHZsLCBmbXQsIGFyZy4uLikgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKIApAQCAtMTY4LDEzICsxNjgsMTMgQEAKIAl1X2NoYXIgdmFsOwogCiAJaWYgKCFwX2RldiB8fCAhcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZykKLQkJcmV0dXJuIENTX05PX0NBUkQ7CisJCXJldHVybiAtRUlOVkFMOwogCiAJcyA9IHBfZGV2LT5zb2NrZXQ7CiAJYyA9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CiAKIAlpZiAoIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKQotCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJCXJldHVybiAtRUFDQ0VTOwogCiAJYWRkciA9IChjLT5Db25maWdCYXNlICsgcmVnLT5PZmZzZXQpID4+IDE7CiAKQEAgLTE4OCw5MyArMTg4LDE0IEBACiAJCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIGFkZHIsIDEsICZ2YWwpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gQ1NfQkFEX0FSR1M7CisJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlciAqLwogRVhQT1JUX1NZTUJPTChwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpOwogCiAKLWludCBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKLQkJCQkgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKLQkJCQkgIGNvbmZpZ19pbmZvX3QgKmNvbmZpZykKLXsKLQljb25maWdfdCAqYzsKLQotCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLQotCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykgewotCQltZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoY29uZmlnX2luZm9fdCkpOwotCQljb25maWctPlZjYyA9IHMtPnNvY2tldC5WY2M7Ci0JCWNvbmZpZy0+VnBwMSA9IGNvbmZpZy0+VnBwMiA9IHMtPnNvY2tldC5WcHA7Ci0JCWNvbmZpZy0+T3B0aW9uID0gcy0+Y2JfZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyOwotCQlpZiAocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVU19DT05GSUcpIHsKLQkJCWNvbmZpZy0+QXR0cmlidXRlcyA9IENPTkZfVkFMSURfQ0xJRU5UOwotCQkJY29uZmlnLT5JbnRUeXBlID0gSU5UX0NBUkRCVVM7Ci0JCQljb25maWctPkFzc2lnbmVkSVJRID0gcy0+aXJxLkFzc2lnbmVkSVJROwotCQkJaWYgKGNvbmZpZy0+QXNzaWduZWRJUlEpCi0JCQkJY29uZmlnLT5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQkJCWlmIChzLT5pb1swXS5yZXMpIHsKLQkJCQljb25maWctPkJhc2VQb3J0MSA9IHMtPmlvWzBdLnJlcy0+c3RhcnQ7Ci0JCQkJY29uZmlnLT5OdW1Qb3J0czEgPSBzLT5pb1swXS5yZXMtPmVuZCAtIGNvbmZpZy0+QmFzZVBvcnQxICsgMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLQl9Ci0jZW5kaWYKLQotCWlmIChwX2RldikgewotCQljID0gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKLQkJY29uZmlnLT5GdW5jdGlvbiA9IHBfZGV2LT5mdW5jOwotCX0gZWxzZSB7Ci0JCWMgPSBOVUxMOwotCQljb25maWctPkZ1bmN0aW9uID0gMDsKLQl9Ci0KLQlpZiAoKGMgPT0gTlVMTCkgfHwgIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKSB7Ci0JCWNvbmZpZy0+QXR0cmlidXRlcyA9IDA7Ci0JCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKLQkJY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKLQkJcmV0dXJuIENTX1NVQ0NFU1M7Ci0JfQotCi0JY29uZmlnLT5BdHRyaWJ1dGVzID0gYy0+QXR0cmlidXRlcyB8IENPTkZfVkFMSURfQ0xJRU5UOwotCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKLQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOwotCWNvbmZpZy0+SW50VHlwZSA9IGMtPkludFR5cGU7Ci0JY29uZmlnLT5Db25maWdCYXNlID0gYy0+Q29uZmlnQmFzZTsKLQljb25maWctPlN0YXR1cyA9IGMtPlN0YXR1czsKLQljb25maWctPlBpbiA9IGMtPlBpbjsKLQljb25maWctPkNvcHkgPSBjLT5Db3B5OwotCWNvbmZpZy0+T3B0aW9uID0gYy0+T3B0aW9uOwotCWNvbmZpZy0+RXh0U3RhdHVzID0gYy0+RXh0U3RhdHVzOwotCWNvbmZpZy0+UHJlc2VudCA9IGNvbmZpZy0+Q2FyZFZhbHVlcyA9IGMtPkNhcmRWYWx1ZXM7Ci0JY29uZmlnLT5JUlFBdHRyaWJ1dGVzID0gYy0+aXJxLkF0dHJpYnV0ZXM7Ci0JY29uZmlnLT5Bc3NpZ25lZElSUSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKLQljb25maWctPkJhc2VQb3J0MSA9IGMtPmlvLkJhc2VQb3J0MTsKLQljb25maWctPk51bVBvcnRzMSA9IGMtPmlvLk51bVBvcnRzMTsKLQljb25maWctPkF0dHJpYnV0ZXMxID0gYy0+aW8uQXR0cmlidXRlczE7Ci0JY29uZmlnLT5CYXNlUG9ydDIgPSBjLT5pby5CYXNlUG9ydDI7Ci0JY29uZmlnLT5OdW1Qb3J0czIgPSBjLT5pby5OdW1Qb3J0czI7Ci0JY29uZmlnLT5BdHRyaWJ1dGVzMiA9IGMtPmlvLkF0dHJpYnV0ZXMyOwotCWNvbmZpZy0+SU9BZGRyTGluZXMgPSBjLT5pby5JT0FkZHJMaW5lczsKLQotCXJldHVybiBDU19TVUNDRVNTOwotfSAvKiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyAqLwotCi1pbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAotCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQotewotCXJldHVybiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhwX2Rldi0+c29ja2V0LCBwX2RldiwKLQkJCQkJICAgICBjb25maWcpOwotfQotRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyk7Ci0KLQogLyoqIHBjbWNpYV9nZXRfd2luZG93CiAgKi8KIGludCBwY21jaWFfZ2V0X3dpbmRvdyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgd2luZG93X2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yODQsMTIgKzIwNSwxMiBAQAogCWludCB3OwogCiAJaWYgKCFzIHx8ICEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JCXJldHVybiBDU19OT19DQVJEOworCQlyZXR1cm4gLUVOT0RFVjsKIAlmb3IgKHcgPSBpZHg7IHcgPCBNQVhfV0lOOyB3KyspCiAJCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9XSU5fUkVRKHcpKQogCQkJYnJlYWs7CiAJaWYgKHcgPT0gTUFYX1dJTikKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7CisJCXJldHVybiAtRUlOVkFMOwogCXdpbiA9ICZzLT53aW5bd107CiAJcmVxLT5CYXNlID0gd2luLT5jdGwucmVzLT5zdGFydDsKIAlyZXEtPlNpemUgPSB3aW4tPmN0bC5yZXMtPmVuZCAtIHdpbi0+Y3RsLnJlcy0+c3RhcnQgKyAxOwpAQCAtMzA0LDcgKzIyNSw3IEBACiAJaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX1VTRV9XQUlUKQogCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOwogCSpoYW5kbGUgPSB3aW47Ci0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9nZXRfd2luZG93ICovCiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfd2luZG93KTsKIApAQCAtMzE2LDEwICsyMzcsMTAgQEAKIGludCBwY21jaWFfZ2V0X21lbV9wYWdlKHdpbmRvd19oYW5kbGVfdCB3aW4sIG1lbXJlcV90ICpyZXEpCiB7CiAJaWYgKCh3aW4gPT0gTlVMTCkgfHwgKHdpbi0+bWFnaWMgIT0gV0lORE9XX01BR0lDKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJCXJldHVybiAtRUlOVkFMOwogCXJlcS0+UGFnZSA9IDA7CiAJcmVxLT5DYXJkT2Zmc2V0ID0gd2luLT5jdGwuY2FyZF9zdGFydDsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogcGNtY2lhX2dldF9tZW1fcGFnZSAqLwogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X21lbV9wYWdlKTsKIApAQCAtMzI4LDE0ICsyNDksMTggQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKIAlpZiAoKHdpbiA9PSBOVUxMKSB8fCAod2luLT5tYWdpYyAhPSBXSU5ET1dfTUFHSUMpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlpZiAocmVxLT5QYWdlICE9IDApCi0JCXJldHVybiBDU19CQURfUEFHRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcyA9IHdpbi0+c29jazsKKwlpZiAocmVxLT5QYWdlICE9IDApIHsKKwkJZHNfZGJnKHMsIDAsICJmYWlsdXJlOiByZXF1ZXN0ZWQgcGFnZSBpcyB6ZXJvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXdpbi0+Y3RsLmNhcmRfc3RhcnQgPSByZXEtPkNhcmRPZmZzZXQ7Ci0JaWYgKHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKSAhPSAwKQotCQlyZXR1cm4gQ1NfQkFEX09GRlNFVDsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlpZiAocy0+b3BzLT5zZXRfbWVtX21hcChzLCAmd2luLT5jdGwpICE9IDApIHsKKwkJZHNfZGJnKHMsIDAsICJmYWlsZWQgdG8gc2V0X21lbV9tYXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9tYXBfbWVtX3BhZ2UgKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX21hcF9tZW1fcGFnZSk7CiAKQEAgLTM1NCw5ICsyNzksOSBAQAogCWMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOwogCiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JCXJldHVybiBDU19OT19DQVJEOworCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKQotCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJCXJldHVybiAtRUFDQ0VTOwogCiAJaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfSVJRX0NIQU5HRV9WQUxJRCkgewogCQlpZiAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7CkBAIC0zNjksMjAgKzI5NCwyOCBAQAogCQlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CiAJfQogCi0JaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVkNDX0NIQU5HRV9WQUxJRCkKLQkJcmV0dXJuIENTX0JBRF9WQ0M7CisJaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVkNDX0NIQU5HRV9WQUxJRCkgeworCQlkc19kYmcocywgMCwgImNoYW5naW5nIFZjYyBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHRpbWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBXZSBvbmx5IGFsbG93IGNoYW5naW5nIFZwcDEgYW5kIFZwcDIgdG8gdGhlIHNhbWUgdmFsdWUgKi8KIAlpZiAoKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMV9DSEFOR0VfVkFMSUQpICYmCiAJICAgIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkgewogCQlpZiAobW9kLT5WcHAxICE9IG1vZC0+VnBwMikKLQkJCXJldHVybiBDU19CQURfVlBQOworCQkJZHNfZGJnKHMsIDAsICJWcHAxIGFuZCBWcHAyIG11c3QgYmUgdGhlIHNhbWVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7Ci0JCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCi0JCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwkJaWYgKHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KSkgeworCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZzLT5kZXYsCisJCQkJICAgIlVuYWJsZSB0byBzZXQgVlBQXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJfSBlbHNlIGlmICgobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAxX0NIQU5HRV9WQUxJRCkgfHwKLQkJICAgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMl9DSEFOR0VfVkFMSUQpKQotCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwkJICAgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMl9DSEFOR0VfVkFMSUQpKSB7CisJCWRzX2RiZyhzLCAwLCAiY2hhbmdpbmcgVmNjIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgdGltZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWlmIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX0lPX0NIQU5HRV9XSURUSCkgewogCQlwY2NhcmRfaW9fbWFwIGlvX29mZiA9IHsgMCwgMCwgMCwgMCwgMSB9OwpAQCAtNDA2LDcgKzMzOSw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogbW9kaWZ5X2NvbmZpZ3VyYXRpb24gKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKTsKIApAQCAtNDQxLDcgKzM3NCw3IEBACiAJCQl9CiAJfQogCi0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24gKi8KIAogCkBAIC00NTksNyArMzkyLDcgQEAKIAljb25maWdfdCAqYyA9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CiAKIAlpZiAoIXBfZGV2LT5faW8gKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwX2Rldi0+X2lvID0gMDsKIApAQCAtNDY3LDcgKzQwMCw3IEBACiAJICAgIChjLT5pby5OdW1Qb3J0czEgIT0gcmVxLT5OdW1Qb3J0czEpIHx8CiAJICAgIChjLT5pby5CYXNlUG9ydDIgIT0gcmVxLT5CYXNlUG9ydDIpIHx8CiAJICAgIChjLT5pby5OdW1Qb3J0czIgIT0gcmVxLT5OdW1Qb3J0czIpKQotCQlyZXR1cm4gQ1NfQkFEX0FSR1M7CisJCXJldHVybiAtRUlOVkFMOwogCiAJYy0+c3RhdGUgJj0gfkNPTkZJR19JT19SRVE7CiAKQEAgLTQ3NSw3ICs0MDgsNyBAQAogCWlmIChyZXEtPk51bVBvcnRzMikKIAkJcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MiwgcmVxLT5OdW1Qb3J0czIpOwogCi0JcmV0dXJuIENTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9yZWxlYXNlX2lvICovCiAKIApAQCAtNDg1LDE1ICs0MTgsMTkgQEAKIAljb25maWdfdCAqYz0gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKIAogCWlmICghcF9kZXYtPl9pcnEpCi0JCXJldHVybiBDU19CQURfSEFORExFOworCQlyZXR1cm4gLUVJTlZBTDsKIAlwX2Rldi0+X2lycSA9IDA7CiAKIAlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQotCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7Ci0JaWYgKGMtPmlycS5BdHRyaWJ1dGVzICE9IHJlcS0+QXR0cmlidXRlcykKLQkJcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7Ci0JaWYgKHMtPmlycS5Bc3NpZ25lZElSUSAhPSByZXEtPkFzc2lnbmVkSVJRKQotCQlyZXR1cm4gQ1NfQkFEX0lSUTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKGMtPmlycS5BdHRyaWJ1dGVzICE9IHJlcS0+QXR0cmlidXRlcykgeworCQlkc19kYmcocywgMCwgIklSUSBhdHRyaWJ1dGVzIG11c3QgbWF0Y2ggYXNzaWduZWQgb25lc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocy0+aXJxLkFzc2lnbmVkSVJRICE9IHJlcS0+QXNzaWduZWRJUlEpIHsKKwkJZHNfZGJnKHMsIDAsICJJUlEgbXVzdCBtYXRjaCBhc3NpZ25lZCBvbmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaWYgKC0tcy0+aXJxLkNvbmZpZyA9PSAwKSB7CiAJCWMtPnN0YXRlICY9IH5DT05GSUdfSVJRX1JFUTsKIAkJcy0+aXJxLkFzc2lnbmVkSVJRID0gMDsKQEAgLTUwNyw3ICs0NDQsNyBAQAogCXBjbWNpYV91c2VkX2lycVtyZXEtPkFzc2lnbmVkSVJRXS0tOwogI2VuZGlmCiAKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogcGNtY2lhX3JlbGVhc2VfaXJxICovCiAKIApAQCAtNTE2LDEwICs0NTMsMTAgQEAKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKIAogCWlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCi0JCXJldHVybiBDU19CQURfSEFORExFOworCQlyZXR1cm4gLUVJTlZBTDsKIAlzID0gd2luLT5zb2NrOwogCWlmICghKHdpbi0+aGFuZGxlLT5fd2luICYgQ0xJRU5UX1dJTl9SRVEod2luLT5pbmRleCkpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBTaHV0IGRvd24gbWVtb3J5IHdpbmRvdyAqLwogCXdpbi0+Y3RsLmZsYWdzICY9IH5NQVBfQUNUSVZFOwpAQCAtNTM2LDcgKzQ3Myw3IEBACiAKIAl3aW4tPm1hZ2ljID0gMDsKIAotCXJldHVybiBDU19TVUNDRVNTOworCXJldHVybiAwOwogfSAvKiBwY21jaWFfcmVsZWFzZV93aW5kb3cgKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlbGVhc2Vfd2luZG93KTsKIApAQCAtNTUxLDE4ICs0ODgsMjMgQEAKIAlwY2NhcmRfaW9fbWFwIGlvbWFwOwogCiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JCXJldHVybiBDU19OT19DQVJEOworCQlyZXR1cm4gLUVOT0RFVjs7CiAKLQlpZiAocmVxLT5JbnRUeXBlICYgSU5UX0NBUkRCVVMpCi0JCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOworCWlmIChyZXEtPkludFR5cGUgJiBJTlRfQ0FSREJVUykgeworCQlkc19kYmcocF9kZXYtPnNvY2tldCwgMCwgIkludFR5cGUgbWF5IG5vdCBiZSBJTlRfQ0FSREJVU1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAljID0gcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKIAlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQotCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJCXJldHVybiAtRUFDQ0VTOwogCiAJLyogRG8gcG93ZXIgY29udHJvbC4gIFdlIGRvbid0IGFsbG93IGNoYW5nZXMgaW4gVmNjLiAqLwogCXMtPnNvY2tldC5WcHAgPSByZXEtPlZwcDsKLQlpZiAocy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpKQotCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwlpZiAocy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpKSB7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcy0+ZGV2LAorCQkJICAgIlVuYWJsZSB0byBzZXQgc29ja2V0IHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogUGljayBtZW1vcnkgb3IgSS9PIGNhcmQsIERNQSBtb2RlLCBpbnRlcnJ1cHQgKi8KIAljLT5JbnRUeXBlID0gcmVxLT5JbnRUeXBlOwpAQCAtNjUxLDcgKzU5Myw3IEBACiAKIAljLT5zdGF0ZSB8PSBDT05GSUdfTE9DS0VEOwogCXBfZGV2LT5fbG9ja2VkID0gMTsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbiAqLwogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKTsKIApAQCAtNjY3LDM3ICs2MDksNDggQEAKIAljb25maWdfdCAqYzsKIAogCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIXJlcSkKLQkJcmV0dXJuIENTX1VOU1VQUE9SVEVEX01PREU7CisJCXJldHVybiAtRUlOVkFMOwogCWMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOwogCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCi0JCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKQotCQlyZXR1cm4gQ1NfSU5fVVNFOwotCWlmIChyZXEtPkF0dHJpYnV0ZXMxICYgKElPX1NIQVJFRCB8IElPX0ZPUkNFX0FMSUFTX0FDQ0VTUykpCi0JCXJldHVybiBDU19CQURfQVRUUklCVVRFOworCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKSB7CisJCWRzX2RiZyhzLCAwLCAiSU8gYWxyZWFkeSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKHJlcS0+QXR0cmlidXRlczEgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkgeworCQlkc19kYmcocywgMCwgImJhZCBhdHRyaWJ1dGUgc2V0dGluZyBmb3IgSU8gcmVnaW9uIDFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaWYgKChyZXEtPk51bVBvcnRzMiA+IDApICYmCi0JICAgIChyZXEtPkF0dHJpYnV0ZXMyICYgKElPX1NIQVJFRCB8IElPX0ZPUkNFX0FMSUFTX0FDQ0VTUykpKQotCQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKKwkgICAgKHJlcS0+QXR0cmlidXRlczIgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkpIHsKKwkJZHNfZGJnKHMsIDAsICJiYWQgYXR0cmlidXRlIHNldHRpbmcgZm9yIElPIHJlZ2lvbiAyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCisJZHNfZGJnKHMsIDEsICJ0cnlpbmcgdG8gYWxsb2NhdGUgcmVzb3VyY2UgMVxuIik7CiAJaWYgKGFsbG9jX2lvX3NwYWNlKHMsIHJlcS0+QXR0cmlidXRlczEsICZyZXEtPkJhc2VQb3J0MSwKLQkJCSAgIHJlcS0+TnVtUG9ydHMxLCByZXEtPklPQWRkckxpbmVzKSkKLQkJcmV0dXJuIENTX0lOX1VTRTsKKwkJCSAgIHJlcS0+TnVtUG9ydHMxLCByZXEtPklPQWRkckxpbmVzKSkgeworCQlkc19kYmcocywgMCwgImFsbG9jYXRpb24gb2YgcmVzb3VyY2UgMSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmIChyZXEtPk51bVBvcnRzMikgeworCQlkc19kYmcocywgMSwgInRyeWluZyB0byBhbGxvY2F0ZSByZXNvdXJjZSAyXG4iKTsKIAkJaWYgKGFsbG9jX2lvX3NwYWNlKHMsIHJlcS0+QXR0cmlidXRlczIsICZyZXEtPkJhc2VQb3J0MiwKIAkJCQkgICByZXEtPk51bVBvcnRzMiwgcmVxLT5JT0FkZHJMaW5lcykpIHsKKwkJCWRzX2RiZyhzLCAwLCAiYWxsb2NhdGlvbiBvZiByZXNvdXJjZSAyIGZhaWxlZFxuIik7CiAJCQlyZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQxLCByZXEtPk51bVBvcnRzMSk7Ci0JCQlyZXR1cm4gQ1NfSU5fVVNFOworCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KIAogCWMtPmlvID0gKnJlcTsKIAljLT5zdGF0ZSB8PSBDT05GSUdfSU9fUkVROwogCXBfZGV2LT5faW8gPSAxOwotCXJldHVybiBDU19TVUNDRVNTOworCXJldHVybiAwOwogfSAvKiBwY21jaWFfcmVxdWVzdF9pbyAqLwogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9pbyk7CiAKQEAgLTcyMywxNiArNjc2LDE4IEBACiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OwogCWNvbmZpZ190ICpjOwotCWludCByZXQgPSBDU19JTl9VU0UsIGlycSA9IDA7CisJaW50IHJldCA9IC1FSU5WQUwsIGlycSA9IDA7CiAJaW50IHR5cGU7CiAKIAlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQkJcmV0dXJuIENTX05PX0NBUkQ7CisJCXJldHVybiAtRU5PREVWOwogCWMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOwogCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCi0JCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSVJRX1JFUSkKLQkJcmV0dXJuIENTX0lOX1VTRTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKGMtPnN0YXRlICYgQ09ORklHX0lSUV9SRVEpIHsKKwkJZHNfZGJnKHMsIDAsICJJUlEgYWxyZWFkeSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKiBEZWNpZGUgd2hhdCB0eXBlIG9mIGludGVycnVwdCB3ZSBhcmUgcmVnaXN0ZXJpbmcgKi8KIAl0eXBlID0gMDsKQEAgLTc5NSwxNSArNzUwLDE5IEBACiAJfQogCiAJaWYgKHJldCAmJiAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSkgewotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCByZXEtPkhhbmRsZXIsIHR5cGUsICBwX2Rldi0+ZGV2bmFtZSwgcmVxLT5JbnN0YW5jZSkpCi0JCQlyZXR1cm4gQ1NfSU5fVVNFOworCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHJlcS0+SGFuZGxlciwgdHlwZSwKKwkJCQkgIHBfZGV2LT5kZXZuYW1lLCByZXEtPkluc3RhbmNlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJLyogTWFrZSBzdXJlIHRoZSBmYWN0IHRoZSByZXF1ZXN0IHR5cGUgd2FzIG92ZXJyaWRkZW4gaXMgcGFzc2VkIGJhY2sgKi8KIAlpZiAodHlwZSA9PSBJUlFGX1NIQVJFRCAmJiAhKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykpIHsKIAkJcmVxLT5BdHRyaWJ1dGVzIHw9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNtY2lhOiByZXF1ZXN0IGZvciBleGNsdXNpdmUgSVJRIGNvdWxkIG5vdCBiZSBmdWxmaWxsZWQuXG4iKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNtY2lhOiB0aGUgZHJpdmVyIG5lZWRzIHVwZGF0aW5nIHRvIHN1cHBvcnRlZCBzaGFyZWQgSVJRIGxpbmVzLlxuIik7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcF9kZXYtPmRldiwgInBjbWNpYTogIgorCQkJInJlcXVlc3QgZm9yIGV4Y2x1c2l2ZSBJUlEgY291bGQgbm90IGJlIGZ1bGZpbGxlZC5cbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBfZGV2LT5kZXYsICJwY21jaWE6IHRoZSBkcml2ZXIgIgorCQkJIm5lZWRzIHVwZGF0aW5nIHRvIHN1cHBvcnRlZCBzaGFyZWQgSVJRIGxpbmVzLlxuIik7CiAJfQogCWMtPmlycS5BdHRyaWJ1dGVzID0gcmVxLT5BdHRyaWJ1dGVzOwogCXMtPmlycS5Bc3NpZ25lZElSUSA9IHJlcS0+QXNzaWduZWRJUlEgPSBpcnE7CkBAIC04MTYsNyArNzc1LDcgQEAKIAlwY21jaWFfdXNlZF9pcnFbaXJxXSsrOwogI2VuZGlmCiAKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0gLyogcGNtY2lhX3JlcXVlc3RfaXJxICovCiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2lycSk7CiAKQEAgLTgzNCw5ICs3OTMsMTEgQEAKIAlpbnQgdzsKIAogCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLQlpZiAocmVxLT5BdHRyaWJ1dGVzICYgKFdJTl9QQUdFRCB8IFdJTl9TSEFSRUQpKQotCQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHJlcS0+QXR0cmlidXRlcyAmIChXSU5fUEFHRUQgfCBXSU5fU0hBUkVEKSkgeworCQlkc19kYmcocywgMCwgImJhZCBhdHRyaWJ1dGUgc2V0dGluZyBmb3IgaW9tZW0gcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogV2luZG93IHNpemUgZGVmYXVsdHMgdG8gc21hbGxlc3QgYXZhaWxhYmxlICovCiAJaWYgKHJlcS0+U2l6ZSA9PSAwKQpAQCAtODQ0LDE5ICs4MDUsMjUgQEAKIAlhbGlnbiA9ICgoKHMtPmZlYXR1cmVzICYgU1NfQ0FQX01FTV9BTElHTikgfHwKIAkJICAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX1NUUklDVF9BTElHTikpID8KIAkJIHJlcS0+U2l6ZSA6IHMtPm1hcF9zaXplKTsKLQlpZiAocmVxLT5TaXplICYgKHMtPm1hcF9zaXplLTEpKQotCQlyZXR1cm4gQ1NfQkFEX1NJWkU7CisJaWYgKHJlcS0+U2l6ZSAmIChzLT5tYXBfc2l6ZS0xKSkgeworCQlkc19kYmcocywgMCwgImludmFsaWQgbWFwIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaWYgKChyZXEtPkJhc2UgJiYgKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1NUQVRJQ19NQVApKSB8fAotCSAgICAocmVxLT5CYXNlICYgKGFsaWduLTEpKSkKLQkJcmV0dXJuIENTX0JBRF9CQVNFOworCSAgICAocmVxLT5CYXNlICYgKGFsaWduLTEpKSkgeworCQlkc19kYmcocywgMCwgImludmFsaWQgYmFzZSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmIChyZXEtPkJhc2UpCiAJCWFsaWduID0gMDsKIAogCS8qIEFsbG9jYXRlIHN5c3RlbSBtZW1vcnkgd2luZG93ICovCiAJZm9yICh3ID0gMDsgdyA8IE1BWF9XSU47IHcrKykKIAkJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfV0lOX1JFUSh3KSkpIGJyZWFrOwotCWlmICh3ID09IE1BWF9XSU4pCi0JCXJldHVybiBDU19PVVRfT0ZfUkVTT1VSQ0U7CisJaWYgKHcgPT0gTUFYX1dJTikgeworCQlkc19kYmcocywgMCwgImFsbCB3aW5kb3dzIGFyZSB1c2VkIGFscmVhZHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3aW4gPSAmcy0+d2luW3ddOwogCXdpbi0+bWFnaWMgPSBXSU5ET1dfTUFHSUM7CkBAIC04NjcsOCArODM0LDEwIEBACiAJaWYgKCEocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkpIHsKIAkJd2luLT5jdGwucmVzID0gcGNtY2lhX2ZpbmRfbWVtX3JlZ2lvbihyZXEtPkJhc2UsIHJlcS0+U2l6ZSwgYWxpZ24sCiAJCQkJCQkgICAgICAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX01BUF9CRUxPV18xTUIpLCBzKTsKLQkJaWYgKCF3aW4tPmN0bC5yZXMpCi0JCQlyZXR1cm4gQ1NfSU5fVVNFOworCQlpZiAoIXdpbi0+Y3RsLnJlcykgeworCQkJZHNfZGJnKHMsIDAsICJhbGxvY2F0aW5nIG1lbSByZWdpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCSgqcF9kZXYpLT5fd2luIHw9IENMSUVOVF9XSU5fUkVRKHcpOwogCkBAIC04ODUsOCArODU0LDEwIEBACiAJaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9VU0VfV0FJVCkKIAkJd2luLT5jdGwuZmxhZ3MgfD0gTUFQX1VTRV9XQUlUOwogCXdpbi0+Y3RsLmNhcmRfc3RhcnQgPSAwOwotCWlmIChzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZ3aW4tPmN0bCkgIT0gMCkKLQkJcmV0dXJuIENTX0JBRF9BUkdTOworCWlmIChzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZ3aW4tPmN0bCkgIT0gMCkgeworCQlkc19kYmcocywgMCwgImZhaWxlZCB0byBzZXQgbWVtb3J5IG1hcHBpbmdcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcy0+c3RhdGUgfD0gU09DS0VUX1dJTl9SRVEodyk7CiAKIAkvKiBSZXR1cm4gd2luZG93IGhhbmRsZSAqLwpAQCAtODk3LDcgKzg2OCw3IEBACiAJfQogCSp3aCA9IHdpbjsKIAotCXJldHVybiBDU19TVUNDRVNTOworCXJldHVybiAwOwogfSAvKiBwY21jaWFfcmVxdWVzdF93aW5kb3cgKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlcXVlc3Rfd2luZG93KTsKIApAQCAtOTA5LDMgKzg4MCw3OSBAQAogCQlwY21jaWFfcmVsZWFzZV93aW5kb3cocF9kZXYtPndpbik7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9kaXNhYmxlX2RldmljZSk7CisKKworc3RydWN0IHBjbWNpYV9jZmdfbWVtIHsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJdTggYnVmWzI1Nl07CisJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0OworfTsKKworLyoqCisgKiBwY21jaWFfbG9vcF9jb25maWcoKSAtIGxvb3Agb3ZlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIEBwX2RldjoJdGhlIHN0cnVjdCBwY21jaWFfZGV2aWNlIHdoaWNoIHdlIG5lZWQgdG8gbG9vcCBmb3IuCisgKiBAY29uZl9jaGVjazoJZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbi4KKyAqCQlJdCBnZXRzIHBhc3NlZCB0aGUgc3RydWN0IHBjbWNpYV9kZXZpY2UsIHRoZSBDSVMgZGF0YQorICoJCWRlc2NyaWJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBhbmQgcHJpdmF0ZSBkYXRhCisgKgkJYmVpbmcgcGFzc2VkIHRvIHBjbWNpYV9sb29wX2NvbmZpZygpCisgKiBAcHJpdl9kYXRhOglwcml2YXRlIGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb25mX2NoZWNrIGZ1bmN0aW9uLgorICoKKyAqIHBjbWNpYV9sb29wX2NvbmZpZygpIGxvb3BzIG92ZXIgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIGNhbGxzCisgKiB0aGUgZHJpdmVyLXNwZWNpZmljIGNvbmZfY2hlY2soKSBmb3IgZWFjaCBvbmUsIGNoZWNraW5nIHdoZXRoZXIKKyAqIGl0IGlzIGEgdmFsaWQgb25lLgorICovCitpbnQgcGNtY2lhX2xvb3BfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJICAgICAgIGludAkoKmNvbmZfY2hlY2spCShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJCQkgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJCQkJIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmRmbHQsCisJCQkJCQkgdW5zaWduZWQgaW50IHZjYywKKwkJCQkJCSB2b2lkICpwcml2X2RhdGEpLAorCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXN0cnVjdCBwY21jaWFfY2ZnX21lbSAqY2ZnX21lbTsKKworCXR1cGxlX3QgKnR1cGxlOworCWludCByZXQgPSAtRU5PREVWOworCXVuc2lnbmVkIGludCB2Y2M7CisKKwljZmdfbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjbWNpYV9jZmdfbWVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNmZ19tZW0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgVmNjIHNldHRpbmcgKi8KKwl2Y2MgPSBwX2Rldi0+c29ja2V0LT5zb2NrZXQuVmNjOworCisJdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7CisJdHVwbGUtPlR1cGxlRGF0YSA9IGNmZ19tZW0tPmJ1ZjsKKwl0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OworCXR1cGxlLT5UdXBsZU9mZnNldCA9IDA7CisJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCXR1cGxlLT5BdHRyaWJ1dGVzID0gMDsKKworCXJldCA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocF9kZXYsIHR1cGxlKTsKKwl3aGlsZSAoIXJldCkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmY2ZnX21lbS0+cGFyc2UuY2Z0YWJsZV9lbnRyeTsKKworCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKHBfZGV2LCB0dXBsZSkpCisJCQlnb3RvIG5leHRfZW50cnk7CisKKwkJaWYgKHBjbWNpYV9wYXJzZV90dXBsZSh0dXBsZSwgJmNmZ19tZW0tPnBhcnNlKSkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKworCQkvKiBkZWZhdWx0IHZhbHVlcyAqLworCQlwX2Rldi0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKKwkJCWNmZ19tZW0tPmRmbHQgPSAqY2ZnOworCisJCXJldCA9IGNvbmZfY2hlY2socF9kZXYsIGNmZywgJmNmZ19tZW0tPmRmbHQsIHZjYywgcHJpdl9kYXRhKTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKworbmV4dF9lbnRyeToKKwkJcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKHBfZGV2LCB0dXBsZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2xvb3BfY29uZmlnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCmluZGV4IDFiMDdhZjUuLmJiOWRkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KIAotI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic29jX2NvbW1vbi5oIgogI2luY2x1ZGUgInB4YTJ4eF9iYXNlLmgiCiAKQEAgLTE2NiwxOCArMTY2LDMyIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJLyoKKwkgKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBzb2NrZXQsIHNvIHNldCBNRUNSOkNJVAorCSAqIChDYXJkIElzIFRoZXJlKQorCSAqLworCU1FQ1IgfD0gTUVDUl9DSVQ7CisKKwkvKiBTZXQgTUVDUjpOT1MgKE51bWJlciBPZiBTb2NrZXRzKSAqLworCWlmIChvcHMtPm5yID4gMSB8fCBtYWNoaW5lX2lzX3ZpcGVyKCkpCisJCU1FQ1IgfD0gTUVDUl9OT1M7CisJZWxzZQorCQlNRUNSICY9IH5NRUNSX05PUzsKK30KKwogaW50IF9fcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wczsKLQlpbnQgZmlyc3QsIG5yOwogCiAJaWYgKCFkZXYgfHwgIWRldi0+cGxhdGZvcm1fZGF0YSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlvcHMgPSAoc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKilkZXYtPnBsYXRmb3JtX2RhdGE7Ci0JZmlyc3QgPSBvcHMtPmZpcnN0OwotCW5yID0gb3BzLT5ucjsKIAogCS8qIFByb3ZpZGUgb3VyIFBYQTJ4eCBzcGVjaWZpYyB0aW1pbmcgcm91dGluZXMuICovCiAJb3BzLT5zZXRfdGltaW5nICA9IHB4YTJ4eF9wY21jaWFfc2V0X3RpbWluZzsKQEAgLTE4NSwyMSArMTk5LDEwIEBACiAJb3BzLT5mcmVxdWVuY3lfY2hhbmdlID0gcHhhMnh4X3BjbWNpYV9mcmVxdWVuY3lfY2hhbmdlOwogI2VuZGlmCiAKLQlyZXQgPSBzb2NfY29tbW9uX2Rydl9wY21jaWFfcHJvYmUoZGV2LCBvcHMsIGZpcnN0LCBucik7CisJcmV0ID0gc29jX2NvbW1vbl9kcnZfcGNtY2lhX3Byb2JlKGRldiwgb3BzLCBvcHMtPmZpcnN0LCBvcHMtPm5yKTsKIAotCWlmIChyZXQgPT0gMCkgewotCQkvKgotCQkgKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBzb2NrZXQsIHNvIHNldCBNRUNSOkNJVAotCQkgKiAoQ2FyZCBJcyBUaGVyZSkKLQkJICovCi0JCU1FQ1IgfD0gTUVDUl9DSVQ7Ci0KLQkJLyogU2V0IE1FQ1I6Tk9TIChOdW1iZXIgT2YgU29ja2V0cykgKi8KLQkJaWYgKG5yID4gMSkKLQkJCU1FQ1IgfD0gTUVDUl9OT1M7Ci0JCWVsc2UKLQkJCU1FQ1IgJj0gfk1FQ1JfTk9TOwotCX0KKwlpZiAoIXJldCkKKwkJcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKGRldik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjIzLDExICsyMjYsNyBAQAogCiBzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IG5yID0gb3BzID8gb3BzLT5uciA6IDA7Ci0KLQlNRUNSID0gbnIgPiAxID8gTUVDUl9DSVQgfCBNRUNSX05PUyA6IChuciA+IDAgPyBNRUNSX0NJVCA6IDApOwotCisJcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKCZkZXYtPmRldik7CiAJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmZGV2LT5kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhiY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvcGNtY2lhL3B4YS9weGFfY21feDI1NS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb21wdWxhYiBMdGQuLCAyMDAzLCAyMDA3LCAyMDA4CisgKiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKworI2luY2x1ZGUgInNvY19jb21tb24uaCIKKworI2RlZmluZSBHUElPX1BDTUNJQV9TS1RTRUwJKDU0KQorI2RlZmluZSBHUElPX1BDTUNJQV9TMF9DRF9WQUxJRAkoMTYpCisjZGVmaW5lIEdQSU9fUENNQ0lBX1MxX0NEX1ZBTElECSgxNykKKyNkZWZpbmUgR1BJT19QQ01DSUFfUzBfUkRZSU5UCSg2KQorI2RlZmluZSBHUElPX1BDTUNJQV9TMV9SRFlJTlQJKDgpCisjZGVmaW5lIEdQSU9fUENNQ0lBX1JFU0VUCSg5KQorCisjZGVmaW5lIFBDTUNJQV9TMF9DRF9WQUxJRAlJUlFfR1BJTyhHUElPX1BDTUNJQV9TMF9DRF9WQUxJRCkKKyNkZWZpbmUgUENNQ0lBX1MxX0NEX1ZBTElECUlSUV9HUElPKEdQSU9fUENNQ0lBX1MxX0NEX1ZBTElEKQorI2RlZmluZSBQQ01DSUFfUzBfUkRZSU5UCUlSUV9HUElPKEdQSU9fUENNQ0lBX1MwX1JEWUlOVCkKKyNkZWZpbmUgUENNQ0lBX1MxX1JEWUlOVAlJUlFfR1BJTyhHUElPX1BDTUNJQV9TMV9SRFlJTlQpCisKKworc3RhdGljIHN0cnVjdCBwY21jaWFfaXJxcyBpcnFzW10gPSB7CisJeyAwLCBQQ01DSUFfUzBfQ0RfVkFMSUQsICJQQ01DSUEwIENEIiB9LAorCXsgMSwgUENNQ0lBX1MxX0NEX1ZBTElELCAiUENNQ0lBMSBDRCIgfSwKK307CisKK3N0YXRpYyBpbnQgY214MjU1X3BjbWNpYV9od19pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWludCByZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QQ01DSUFfUkVTRVQsICJQQ0NhcmQgcmVzZXQiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BDTUNJQV9SRVNFVCwgMCk7CisKKwlza3QtPmlycSA9IHNrdC0+bnIgPT0gMCA/IFBDTUNJQV9TMF9SRFlJTlQgOiBQQ01DSUFfUzFfUkRZSU5UOworCXJldCA9IHNvY19wY21jaWFfcmVxdWVzdF9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CisJaWYgKCFyZXQpCisJCWdwaW9fZnJlZShHUElPX1BDTUNJQV9SRVNFVCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NodXRkb3duKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCXNvY19wY21jaWFfZnJlZV9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CisJZ3Bpb19mcmVlKEdQSU9fUENNQ0lBX1JFU0VUKTsKK30KKworCitzdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NvY2tldF9zdGF0ZShzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwKKwkJCQkgICAgICAgc3RydWN0IHBjbWNpYV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IGNkID0gc2t0LT5uciA/IEdQSU9fUENNQ0lBX1MxX0NEX1ZBTElEIDogR1BJT19QQ01DSUFfUzBfQ0RfVkFMSUQ7CisJaW50IHJkeSA9IHNrdC0+bnIgPyBHUElPX1BDTUNJQV9TMF9SRFlJTlQgOiBHUElPX1BDTUNJQV9TMV9SRFlJTlQ7CisKKwlzdGF0ZS0+ZGV0ZWN0ID0gIWdwaW9fZ2V0X3ZhbHVlKGNkKTsKKwlzdGF0ZS0+cmVhZHkgID0gISFncGlvX2dldF92YWx1ZShyZHkpOworCXN0YXRlLT5idmQxICAgPSAxOworCXN0YXRlLT5idmQyICAgPSAxOworCXN0YXRlLT52c18zdiAgPSAwOworCXN0YXRlLT52c19YdiAgPSAwOworCXN0YXRlLT53cnByb3QgPSAwOyAgLyogbm90IGF2YWlsYWJsZSAqLworfQorCisKK3N0YXRpYyBpbnQgY214MjU1X3BjbWNpYV9jb25maWd1cmVfc29ja2V0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0LAorCQkJCQkgIGNvbnN0IHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlzd2l0Y2ggKHNrdC0+bnIpIHsKKwljYXNlIDA6CisJCWlmIChzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCkgeworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19QQ01DSUFfU0tUU0VMLCAwKTsKKwkJCXVkZWxheSgxKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUENNQ0lBX1JFU0VULCAxKTsKKwkJCXVkZWxheSgxMCk7CisJCQlncGlvX3NldF92YWx1ZShHUElPX1BDTUNJQV9SRVNFVCwgMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpIHsKKwkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUENNQ0lBX1NLVFNFTCwgMSk7CisJCQl1ZGVsYXkoMSk7CisJCQlncGlvX3NldF92YWx1ZShHUElPX1BDTUNJQV9SRVNFVCwgMSk7CisJCQl1ZGVsYXkoMTApOworCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19QQ01DSUFfUkVTRVQsIDApOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworfQorCitzdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBjbXgyNTVfcGNtY2lhX29wcyBfX2luaXRkYXRhID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmh3X2luaXQJCT0gY214MjU1X3BjbWNpYV9od19pbml0LAorCS5od19zaHV0ZG93bgkJPSBjbXgyNTVfcGNtY2lhX3NodXRkb3duLAorCS5zb2NrZXRfc3RhdGUJCT0gY214MjU1X3BjbWNpYV9zb2NrZXRfc3RhdGUsCisJLmNvbmZpZ3VyZV9zb2NrZXQJPSBjbXgyNTVfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCisJLnNvY2tldF9pbml0CQk9IGNteDI1NV9wY21jaWFfc29ja2V0X2luaXQsCisJLnNvY2tldF9zdXNwZW5kCQk9IGNteDI1NV9wY21jaWFfc29ja2V0X3N1c3BlbmQsCisJLm5yCQkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNteDI1NV9wY21jaWFfZGV2aWNlOworCitpbnQgX19pbml0IGNteDI1NV9wY21jaWFfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwljbXgyNTVfcGNtY2lhX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicHhhMnh4LXBjbWNpYSIsIC0xKTsKKworCWlmICghY214MjU1X3BjbWNpYV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGNteDI1NV9wY21jaWFfZGV2aWNlLCAmY214MjU1X3BjbWNpYV9vcHMsCisJCQkJICAgICAgIHNpemVvZihjbXgyNTVfcGNtY2lhX29wcykpOworCisJaWYgKHJldCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyaW5nIGNtLXgyNTUgUENNQ0lBIGludGVyZmFjZS5cbiIpOworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGNteDI1NV9wY21jaWFfZGV2aWNlKTsKKwl9CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGNteDI1NV9wY21jaWFfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19leGl0IGNteDI1NV9wY21jaWFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGNteDI1NV9wY21jaWFfZGV2aWNlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCmluZGV4IGJjZmY1Y2YuLjZjM2FhYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYwpAQCAtMTA1LDEzICsxMDUsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNteDI3MF9wY21jaWFfZGV2aWNlOwogCi1zdGF0aWMgaW50IF9faW5pdCBjbXgyNzBfcGNtY2lhX2luaXQodm9pZCkKK2ludCBfX2luaXQgY214MjcwX3BjbWNpYV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCWlmICghbWFjaGluZV9pc19hcm1jb3JlKCkpCi0JCXJldHVybiAtRU5PREVWOwotCiAJY214MjcwX3BjbWNpYV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInB4YTJ4eC1wY21jaWEiLCAtMSk7CiAKIAlpZiAoIWNteDI3MF9wY21jaWFfZGV2aWNlKQpAQCAtMTMxLDE0ICsxMjgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBjbXgyNzBfcGNtY2lhX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IGNteDI3MF9wY21jaWFfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGNteDI3MF9wY21jaWFfZGV2aWNlKTsKIH0KLQotbW9kdWxlX2luaXQoY214MjcwX3BjbWNpYV9pbml0KTsKLW1vZHVsZV9leGl0KGNteDI3MF9wY21jaWFfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNNLXgyNzAgUENNQ0lBIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyeHguYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94Mnh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwOTUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94Mnh4LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvcGNtY2lhL3B4YS9weGFfY21feDJ4eC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb21wdWxhYiBMdGQuLCAyMDAzLCAyMDA3LCAyMDA4CisgKiBNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgorCitpbnQgY214MjU1X3BjbWNpYV9pbml0KHZvaWQpOworaW50IGNteDI3MF9wY21jaWFfaW5pdCh2b2lkKTsKK3ZvaWQgY214MjU1X3BjbWNpYV9leGl0KHZvaWQpOwordm9pZCBjbXgyNzBfcGNtY2lhX2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNteDJ4eF9wY21jaWFfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PREVWOworCisJaWYgKG1hY2hpbmVfaXNfYXJtY29yZSgpICYmIGNwdV9pc19weGEyNXgoKSkKKwkJcmV0ID0gY214MjU1X3BjbWNpYV9pbml0KCk7CisJZWxzZSBpZiAobWFjaGluZV9pc19hcm1jb3JlKCkgJiYgY3B1X2lzX3B4YTI3eCgpKQorCQlyZXQgPSBjbXgyNzBfcGNtY2lhX2luaXQoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbXgyeHhfcGNtY2lhX2V4aXQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc19hcm1jb3JlKCkgJiYgY3B1X2lzX3B4YTI1eCgpKQorCQljbXgyNTVfcGNtY2lhX2V4aXQoKTsKKwllbHNlIGlmIChtYWNoaW5lX2lzX2FybWNvcmUoKSAmJiBjcHVfaXNfcHhhMjd4KCkpCisJCWNteDI3MF9wY21jaWFfZXhpdCgpOworfQorCittb2R1bGVfaW5pdChjbXgyeHhfcGNtY2lhX2luaXQpOworbW9kdWxlX2V4aXQoY214Mnh4X3BjbWNpYV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ00teDJ4eCBQQ01DSUEgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczNmM2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYworICoKKyAqIERyaXZlciBmb3IgUGFsbSBMaWZlRHJpdmUgUENNQ0lBCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXggT3Nib3JuZSA8YXRvQG1lc2h5Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8bWFjaC9wYWxtbGQuaD4KKyNpbmNsdWRlICJzb2NfY29tbW9uLmgiCisKK3N0YXRpYyBpbnQgcGFsbWxkX3BjbWNpYV9od19pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNTERfUENNQ0lBX1BPV0VSLCAiUENNQ0lBIFBXUiIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMTsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNTERfUENNQ0lBX1BPV0VSLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNTERfUENNQ0lBX1JFU0VULCAiUENNQ0lBIFJTVCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19OUl9QQUxNTERfUENNQ0lBX1JFU0VULCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19OUl9QQUxNTERfUENNQ0lBX1JFQURZLCAiUENNQ0lBIFJEWSIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX05SX1BBTE1MRF9QQ01DSUFfUkVBRFkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyNDsKKworCXNrdC0+aXJxID0gSVJRX0dQSU8oR1BJT19OUl9QQUxNTERfUENNQ0lBX1JFQURZKTsKKwlyZXR1cm4gMDsKKworZXJyNDoKKwlncGlvX2ZyZWUoR1BJT19OUl9QQUxNTERfUENNQ0lBX1JFQURZKTsKK2VycjM6CisJZ3Bpb19mcmVlKEdQSU9fTlJfUEFMTUxEX1BDTUNJQV9SRVNFVCk7CitlcnIyOgorCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9QQ01DSUFfUE9XRVIpOworZXJyMToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwYWxtbGRfcGNtY2lhX2h3X3NodXRkb3duKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9QQ01DSUFfUkVBRFkpOworCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9QQ01DSUFfUkVTRVQpOworCWdwaW9fZnJlZShHUElPX05SX1BBTE1MRF9QQ01DSUFfUE9XRVIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtbGRfcGNtY2lhX3NvY2tldF9zdGF0ZShzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwKKwkJCQkJc3RydWN0IHBjbWNpYV9zdGF0ZSAqc3RhdGUpCit7CisJc3RhdGUtPmRldGVjdCA9IDE7IC8qIGFsd2F5cyBpbnNlcnRlZCAqLworCXN0YXRlLT5yZWFkeSAgPSAhIWdwaW9fZ2V0X3ZhbHVlKEdQSU9fTlJfUEFMTUxEX1BDTUNJQV9SRUFEWSk7CisJc3RhdGUtPmJ2ZDEgICA9IDE7CisJc3RhdGUtPmJ2ZDIgICA9IDE7CisJc3RhdGUtPndycHJvdCA9IDA7CisJc3RhdGUtPnZzXzN2ICA9IDE7CisJc3RhdGUtPnZzX1h2ICA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbWxkX3BjbWNpYV9jb25maWd1cmVfc29ja2V0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0LAorCQkJCQljb25zdCBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpCit7CisJZ3Bpb19zZXRfdmFsdWUoR1BJT19OUl9QQUxNTERfUENNQ0lBX1BPV0VSLCAxKTsKKwlncGlvX3NldF92YWx1ZShHUElPX05SX1BBTE1MRF9QQ01DSUFfUkVTRVQsCisJCQkhIShzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG1sZF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7Cit9CisKK3N0YXRpYyB2b2lkIHBhbG1sZF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBwYWxtbGRfcGNtY2lhX29wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCisJLmZpcnN0CQkJPSAwLAorCS5ucgkJCT0gMiwKKworCS5od19pbml0CQk9IHBhbG1sZF9wY21jaWFfaHdfaW5pdCwKKwkuaHdfc2h1dGRvd24JCT0gcGFsbWxkX3BjbWNpYV9od19zaHV0ZG93biwKKworCS5zb2NrZXRfc3RhdGUJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3RhdGUsCisJLmNvbmZpZ3VyZV9zb2NrZXQJPSBwYWxtbGRfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCisKKwkuc29ja2V0X2luaXQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfaW5pdCwKKwkuc29ja2V0X3N1c3BlbmQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYWxtbGRfcGNtY2lhX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgcGFsbWxkX3BjbWNpYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc19wYWxtbGQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwYWxtbGRfcGNtY2lhX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicHhhMnh4LXBjbWNpYSIsIC0xKTsKKwlpZiAoIXBhbG1sZF9wY21jaWFfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwYWxtbGRfcGNtY2lhX2RldmljZSwgJnBhbG1sZF9wY21jaWFfb3BzLAorCQkJCQlzaXplb2YocGFsbWxkX3BjbWNpYV9vcHMpKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBhbG1sZF9wY21jaWFfZGV2aWNlKTsKKworCWlmIChyZXQpCisJCXBsYXRmb3JtX2RldmljZV9wdXQocGFsbWxkX3BjbWNpYV9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBhbG1sZF9wY21jaWFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBhbG1sZF9wY21jaWFfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQocGFsbWxkX3BjbWNpYV9pbml0KTsKK21vZHVsZV9leGl0KHBhbG1sZF9wY21jaWFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFsZXggT3Nib3JuZSA8YXRvQG1lc2h5Lm9yZz4sIgorCSAgICAiIE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDTUNJQSBzdXBwb3J0IGZvciBQYWxtIExpZmVEcml2ZSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEyeHgtcGNtY2lhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdHJpemVwczQuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF90cml6ZXBzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzdhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdHJpemVwczQuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF90cml6ZXBzNC5jCisgKgorICogVFJJWkVQUyBQQ01DSUEgc3BlY2lmaWMgcm91dGluZXMuCisgKgorICogQXV0aG9yOglKw7xyZ2VuIFNjaGluZGVsZQorICogQ3JlYXRlZDoJMjAgMDIsIDIwMDYKKyAqIENvcHlyaWdodDoJSsO8cmdlbiBTY2hpbmRlbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvdHJpemVwczQuaD4KKworI2luY2x1ZGUgInNvY19jb21tb24uaCIKKworZXh0ZXJuIHZvaWQgYm9hcmRfcGNtY2lhX3Bvd2VyKGludCBwb3dlcik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2lycXMgaXJxc1tdID0geworCXsgMCwgSVJRX0dQSU8oR1BJT19QQ0QpLCAiY3MwX2NkIiB9CisJLyogb24gb3RoZXIgYmFzZWJvYXJkcyB3ZSBjYW4gaGF2ZSBtb3JlIGlucHV0cyAqLworfTsKKworc3RhdGljIGludCB0cml6ZXBzX3BjbWNpYV9od19pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWludCByZXQsIGk7CisJLyogd2UgZG9udCBoYXZlIHZvbHRhZ2UvY2FyZC9yZWFkeSBkZXRlY3Rpb24KKwkgKiBzbyB3ZSBkb250IG5lZWQgaW50ZXJydXB0cyBmb3IgaXQKKwkgKi8KKwlzd2l0Y2ggKHNrdC0+bnIpIHsKKwljYXNlIDA6CisJCWlmIChncGlvX3JlcXVlc3QoR1BJT19QUkRZLCAiY2ZfaXJxIikgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBzb2NrICVkIHVuYWJsZSB0byByZXF1ZXN0IGdwaW8gJWRcbiIsIF9fZnVuY19fLAorCQkJCXNrdC0+bnIsIEdQSU9fUFJEWSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWlmIChncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1BSRFkpIDwgMCkgeworCQkJcHJfZXJyKCIlczogc29jayAlZCB1bmFibGUgdG8gc2V0IGlucHV0IGdwaW8gJWRcbiIsIF9fZnVuY19fLAorCQkJCXNrdC0+bnIsIEdQSU9fUFJEWSk7CisJCQlncGlvX2ZyZWUoR1BJT19QUkRZKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNrdC0+aXJxID0gSVJRX0dQSU8oR1BJT19QUkRZKTsKKwkJYnJlYWs7CisKKyNpZm5kZWYgQ09ORklHX01BQ0hfVFJJWkVQU19DT05YUworCWNhc2UgMToKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiByZWxlYXNlIHRoZSByZXNldCBvZiB0aGlzIGNhcmQgKi8KKwlwcl9kZWJ1ZygiJXM6IHNvY2sgJWQgaXJxICVkXG4iLCBfX2Z1bmNfXywgc2t0LT5uciwgc2t0LT5pcnEpOworCisJLyogc3VwcGxlbWVudG9yeSBpcnFzIGZvciB0aGUgc29ja2V0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXJxcyk7IGkrKykgeworCQlpZiAoaXJxc1tpXS5zb2NrICE9IHNrdC0+bnIpCisJCQljb250aW51ZTsKKwkJaWYgKGdwaW9fcmVxdWVzdChJUlFfVE9fR1BJTyhpcnFzW2ldLmlycSksIGlycXNbaV0uc3RyKSA8IDApIHsKKwkJCXByX2VycigiJXM6IHNvY2sgJWQgdW5hYmxlIHRvIHJlcXVlc3QgZ3BpbyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc2t0LT5uciwgSVJRX1RPX0dQSU8oaXJxc1tpXS5pcnEpKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJaWYgKGdwaW9fZGlyZWN0aW9uX2lucHV0KElSUV9UT19HUElPKGlycXNbaV0uaXJxKSkgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBzb2NrICVkIHVuYWJsZSB0byBzZXQgaW5wdXQgZ3BpbyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgc2t0LT5uciwgSVJRX1RPX0dQSU8oaXJxc1tpXS5pcnEpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXJldHVybiBzb2NfcGNtY2lhX3JlcXVlc3RfaXJxcyhza3QsIGlycXMsIEFSUkFZX1NJWkUoaXJxcykpOworCitlcnJvcjoKKwlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKwkJZ3Bpb19mcmVlKElSUV9UT19HUElPKGlycXNbaV0uaXJxKSk7CisJfQorCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIHZvaWQgdHJpemVwc19wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJaW50IGk7CisJLyogZnJlZSBhbGxvY2F0ZWQgZ3BpbydzICovCisJZ3Bpb19mcmVlKEdQSU9fUFJEWSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXJxcyk7IGkrKykKKwkJZ3Bpb19mcmVlKElSUV9UT19HUElPKGlycXNbaV0uaXJxKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRyaXplcHNfcGNtY2lhX3N0YXR1c1syXTsKKworc3RhdGljIHZvaWQgdHJpemVwc19wY21jaWFfc29ja2V0X3N0YXRlKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0LAorCQkJCXN0cnVjdCBwY21jaWFfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IDAsIGNoYW5nZTsKKwlzdGF0dXMgPSBDRlNSX3JlYWR3KCk7CisJY2hhbmdlID0gKHN0YXR1cyBeIHRyaXplcHNfcGNtY2lhX3N0YXR1c1tza3QtPm5yXSkgJgorCQkJCUNvblhTX0NGU1JfQlZEX01BU0s7CisJaWYgKGNoYW5nZSkgeworCQl0cml6ZXBzX3BjbWNpYV9zdGF0dXNbc2t0LT5ucl0gPSBzdGF0dXM7CisJCWlmIChzdGF0dXMgJiBDb25YU19DRlNSX0JWRDEpIHsKKwkJCS8qIGVuYWJsZV9pcnEgZW1wdHkgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGVfaXJxIGVtcHR5ICovCisJCX0KKwl9CisKKwlzd2l0Y2ggKHNrdC0+bnIpIHsKKwljYXNlIDA6CisJCS8qIGp1c3QgZmlsbCBpbiBmaXggc3RhdGVzICovCisJCXN0YXRlLT5kZXRlY3QgPSBncGlvX2dldF92YWx1ZShHUElPX1BDRCkgPyAwIDogMTsKKwkJc3RhdGUtPnJlYWR5ICA9IGdwaW9fZ2V0X3ZhbHVlKEdQSU9fUFJEWSkgPyAxIDogMDsKKwkJc3RhdGUtPmJ2ZDEgICA9IChzdGF0dXMgJiBDb25YU19DRlNSX0JWRDEpID8gMSA6IDA7CisJCXN0YXRlLT5idmQyICAgPSAoc3RhdHVzICYgQ29uWFNfQ0ZTUl9CVkQyKSA/IDEgOiAwOworCQlzdGF0ZS0+dnNfM3YgID0gKHN0YXR1cyAmIENvblhTX0NGU1JfVlMxKSA/IDAgOiAxOworCQlzdGF0ZS0+dnNfWHYgID0gKHN0YXR1cyAmIENvblhTX0NGU1JfVlMyKSA/IDAgOiAxOworCQlzdGF0ZS0+d3Jwcm90ID0gMDsJLyogbm90IGF2YWlsYWJsZSAqLworCQlicmVhazsKKworI2lmbmRlZiBDT05GSUdfTUFDSF9UUklaRVBTX0NPTlhTCisJLyogb24gQ29uWFMgd2Ugb25seSBoYXZlIG9uZSBzbG90LiBTZWNvbmQgaXMgaW5hY3RpdmUgKi8KKwljYXNlIDE6CisJCXN0YXRlLT5kZXRlY3QgPSAwOworCQlzdGF0ZS0+cmVhZHkgID0gMDsKKwkJc3RhdGUtPmJ2ZDEgICA9IDA7CisJCXN0YXRlLT5idmQyICAgPSAwOworCQlzdGF0ZS0+dnNfM3YgID0gMDsKKwkJc3RhdGUtPnZzX1h2ICA9IDA7CisJCXN0YXRlLT53cnByb3QgPSAwOworCQlicmVhazsKKworI2VuZGlmCisJfQorfQorCitzdGF0aWMgaW50IHRyaXplcHNfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCisJCQkJY29uc3Qgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIHNob3J0IHBvd2VyID0gMDsKKworCS8qIHdlIGRvIG5vdGhpbmcgaGVyZSBqdXN0IGNoZWNrIGEgYml0ICovCisJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CisJY2FzZSAwOiAgcG93ZXIgJj0gMHhmYzsgYnJlYWs7CisJY2FzZSAzMzogcG93ZXIgfD0gQ29uWFNfQkNSX1MwX1ZDQ18zVjM7IGJyZWFrOworCWNhc2UgNTA6CisJCXByX2VycigiJXMoKTogVmNjIDVWIG5vdCBzdXBwb3J0ZWQgaW4gc29ja2V0XG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXMoKTogYmFkIFZjYyAldVxuIiwgX19mdW5jX18sIHN0YXRlLT5WY2MpOworCQlyZXQgPSAtMTsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlLT5WcHApIHsKKwljYXNlIDA6ICBwb3dlciAmPSAweGYzOyBicmVhazsKKwljYXNlIDMzOiBwb3dlciB8PSBDb25YU19CQ1JfUzBfVlBQXzNWMzsgYnJlYWs7CisJY2FzZSAxMjA6CisJCXByX2VycigiJXMoKTogVnBwIDEyViBub3Qgc3VwcG9ydGVkIGluIHNvY2tldFxuIiwgX19mdW5jX18pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoc3RhdGUtPlZwcCAhPSBzdGF0ZS0+VmNjKSB7CisJCQlwcl9lcnIoIiVzKCk6IGJhZCBWcHAgJXVcbiIsIF9fZnVuY19fLCBzdGF0ZS0+VnBwKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCisJc3dpdGNoIChza3QtPm5yKSB7CisJY2FzZSAwOgkJCSAvKiB3ZSBvbmx5IGhhdmUgMy4zViAqLworCQlib2FyZF9wY21jaWFfcG93ZXIocG93ZXIpOworCQlicmVhazsKKworI2lmbmRlZiBDT05GSUdfTUFDSF9UUklaRVBTX0NPTlhTCisJLyogb24gQ29uWFMgd2Ugb25seSBoYXZlIG9uZSBzbG90LiBTZWNvbmQgaXMgaW5hY3RpdmUgKi8KKwljYXNlIDE6CisjZW5kaWYKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0cml6ZXBzX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKKwkvKiBkZWZhdWx0IGlzIG9uICovCisJYm9hcmRfcGNtY2lhX3Bvd2VyKDB4OSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyaXplcHNfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQoreworCWJvYXJkX3BjbWNpYV9wb3dlcigweDApOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgdHJpemVwc19wY21jaWFfb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmh3X2luaXQJCT0gdHJpemVwc19wY21jaWFfaHdfaW5pdCwKKwkuaHdfc2h1dGRvd24JCT0gdHJpemVwc19wY21jaWFfaHdfc2h1dGRvd24sCisJLnNvY2tldF9zdGF0ZQkJPSB0cml6ZXBzX3BjbWNpYV9zb2NrZXRfc3RhdGUsCisJLmNvbmZpZ3VyZV9zb2NrZXQJPSB0cml6ZXBzX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAorCS5zb2NrZXRfaW5pdAkJPSB0cml6ZXBzX3BjbWNpYV9zb2NrZXRfaW5pdCwKKwkuc29ja2V0X3N1c3BlbmQJCT0gdHJpemVwc19wY21jaWFfc29ja2V0X3N1c3BlbmQsCisjaWZkZWYgQ09ORklHX01BQ0hfVFJJWkVQU19DT05YUworCS5ucgkJCT0gMSwKKyNlbHNlCisJLm5yCQkJPSAyLAorI2VuZGlmCisJLmZpcnN0CQkJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRyaXplcHNfcGNtY2lhX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgdHJpemVwc19wY21jaWFfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwl0cml6ZXBzX3BjbWNpYV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInB4YTJ4eC1wY21jaWEiLCAtMSk7CisJaWYgKCF0cml6ZXBzX3BjbWNpYV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHRyaXplcHNfcGNtY2lhX2RldmljZSwKKwkJCSZ0cml6ZXBzX3BjbWNpYV9vcHMsIHNpemVvZih0cml6ZXBzX3BjbWNpYV9vcHMpKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh0cml6ZXBzX3BjbWNpYV9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCh0cml6ZXBzX3BjbWNpYV9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRyaXplcHNfcGNtY2lhX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0cml6ZXBzX3BjbWNpYV9kZXZpY2UpOworfQorCitmc19pbml0Y2FsbCh0cml6ZXBzX3BjbWNpYV9pbml0KTsKK21vZHVsZV9leGl0KHRyaXplcHNfcGNtY2lhX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKdWVyZ2VuIFNjaGluZGVsZSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpweGEyeHgtcGNtY2lhIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92aXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTA0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIFZJUEVSIFBDTUNJQSBzdXBwb3J0CisgKiAgIENvcHlyaWdodCAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcworICoKKyAqIE1haW50YWluZWQgYnkgTWFyYyBaeW5naWVyIDxtYXpAbWlzdGVyam9uZXMub3JnPgorICogCQkJICAgICAgPG1hcmMuenluZ2llckBhbHRyYW4uY29tPgorICoKKyAqIEJhc2VkIG9uOgorICogICBpUEFRIGgyMjAwIFBDTUNJQSBzdXBwb3J0CisgKiAgIENvcHlyaWdodCAyMDA0IEtvZW4gS29vaSA8a29lbkB2ZXN0aW5nYmFyLm5sPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8bWFjaC92aXBlci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJzb2NfY29tbW9uLmgiCisjaW5jbHVkZSAicHhhMnh4X2Jhc2UuaCIKKworc3RhdGljIHN0cnVjdCBwY21jaWFfaXJxcyBpcnFzW10gPSB7CisJeyAwLCBncGlvX3RvX2lycShWSVBFUl9DRl9DRF9HUElPKSwgICJQQ01DSUFfQ0QiIH0KK307CisKK3N0YXRpYyBpbnQgdmlwZXJfcGNtY2lhX2h3X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrdC0+aXJxID0gZ3Bpb190b19pcnEoVklQRVJfQ0ZfUkRZX0dQSU8pOworCisJaWYgKGdwaW9fcmVxdWVzdChWSVBFUl9DRl9DRF9HUElPLCAiQ0YgZGV0ZWN0IikpCisJCWdvdG8gZXJyX3JlcXVlc3RfY2Q7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KFZJUEVSX0NGX1JEWV9HUElPLCAiQ0YgcmVhZHkiKSkKKwkJZ290byBlcnJfcmVxdWVzdF9yZHk7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KFZJUEVSX0NGX1BPV0VSX0dQSU8sICJDRiBwb3dlciIpKQorCQlnb3RvIGVycl9yZXF1ZXN0X3B3cjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIEdQSU8gODIgaXMgdGhlIENGIHBvd2VyIGVuYWJsZSBsaW5lLiBpbml0aWFsbHkgb2ZmICovCisJaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChWSVBFUl9DRl9QT1dFUl9HUElPLCAwKSB8fAorCSAgICBncGlvX2RpcmVjdGlvbl9pbnB1dChWSVBFUl9DRl9DRF9HUElPKSB8fAorCSAgICBncGlvX2RpcmVjdGlvbl9pbnB1dChWSVBFUl9DRl9SRFlfR1BJTykpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlnb3RvIGVycl9kaXI7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHNvY19wY21jaWFfcmVxdWVzdF9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CisKK2Vycl9kaXI6CisJZ3Bpb19mcmVlKFZJUEVSX0NGX1BPV0VSX0dQSU8pOworZXJyX3JlcXVlc3RfcHdyOgorCWdwaW9fZnJlZShWSVBFUl9DRl9SRFlfR1BJTyk7CitlcnJfcmVxdWVzdF9yZHk6CisJZ3Bpb19mcmVlKFZJUEVSX0NGX0NEX0dQSU8pOworZXJyX3JlcXVlc3RfY2Q6CisJcHJpbnRrKEtFUk5fRVJSICJ2aXBlcjogRmFpbGVkIHRvIHNldHVwIFBDTUNJQSBHUElPc1xuIik7CisJcmV0dXJuIC0xOworfQorCisvKgorICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7CisJc29jX3BjbWNpYV9mcmVlX2lycXMoc2t0LCBpcnFzLCBBUlJBWV9TSVpFKGlycXMpKTsKKwlncGlvX2ZyZWUoVklQRVJfQ0ZfUE9XRVJfR1BJTyk7CisJZ3Bpb19mcmVlKFZJUEVSX0NGX1JEWV9HUElPKTsKKwlncGlvX2ZyZWUoVklQRVJfQ0ZfQ0RfR1BJTyk7Cit9CisKK3N0YXRpYyB2b2lkIHZpcGVyX3BjbWNpYV9zb2NrZXRfc3RhdGUoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCisJCQkJICAgICAgc3RydWN0IHBjbWNpYV9zdGF0ZSAqc3RhdGUpCit7CisJc3RhdGUtPmRldGVjdCA9IGdwaW9fZ2V0X3ZhbHVlKFZJUEVSX0NGX0NEX0dQSU8pID8gMCA6IDE7CisJc3RhdGUtPnJlYWR5ICA9IGdwaW9fZ2V0X3ZhbHVlKFZJUEVSX0NGX1JEWV9HUElPKSA/IDEgOiAwOworCXN0YXRlLT5idmQxICAgPSAxOworCXN0YXRlLT5idmQyICAgPSAxOworCXN0YXRlLT53cnByb3QgPSAwOworCXN0YXRlLT52c18zdiAgPSAxOyAvKiBDYW4gb25seSBhcHBseSAzLjNWICovCisJc3RhdGUtPnZzX1h2ICA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdmlwZXJfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCisJCQkJCSBjb25zdCBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpCit7CisJLyogU2lsZW50bHkgaWdub3JlIFZwcCwgb3V0cHV0IGVuYWJsZSwgc3BlYWtlciBlbmFibGUuICovCisJdmlwZXJfY2ZfcnN0KHN0YXRlLT5mbGFncyAmIFNTX1JFU0VUKTsKKworCS8qIEFwcGx5IHNvY2tldCB2b2x0YWdlICovCisJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CisJY2FzZSAwOgorCQlncGlvX3NldF92YWx1ZShWSVBFUl9DRl9QT1dFUl9HUElPLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJZ3Bpb19zZXRfdmFsdWUoVklQRVJfQ0ZfUE9XRVJfR1BJTywgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuc3VwcG9ydGVkIFZjYzolZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdGF0ZS0+VmNjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCit7Cit9CisKK3N0YXRpYyB2b2lkIHZpcGVyX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHZpcGVyX3BjbWNpYV9vcHMgX19pbml0ZGF0YSA9IHsKKwkub3duZXIgICAgICAgICAgCT0gVEhJU19NT0RVTEUsCisJLmh3X2luaXQgICAgICAgIAk9IHZpcGVyX3BjbWNpYV9od19pbml0LAorCS5od19zaHV0ZG93bgkJPSB2aXBlcl9wY21jaWFfaHdfc2h1dGRvd24sCisJLnNvY2tldF9zdGF0ZQkJPSB2aXBlcl9wY21jaWFfc29ja2V0X3N0YXRlLAorCS5jb25maWd1cmVfc29ja2V0CT0gdmlwZXJfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCisJLnNvY2tldF9pbml0CQk9IHZpcGVyX3BjbWNpYV9zb2NrZXRfaW5pdCwKKwkuc29ja2V0X3N1c3BlbmQJCT0gdmlwZXJfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAorCS5uciAgICAgICAgIAkJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZpcGVyX3BjbWNpYV9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IHZpcGVyX3BjbWNpYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc192aXBlcigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZpcGVyX3BjbWNpYV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInB4YTJ4eC1wY21jaWEiLCAtMSk7CisJaWYgKCF2aXBlcl9wY21jaWFfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSh2aXBlcl9wY21jaWFfZGV2aWNlLAorCQkJCSAgICAgICAmdmlwZXJfcGNtY2lhX29wcywKKwkJCQkgICAgICAgc2l6ZW9mKHZpcGVyX3BjbWNpYV9vcHMpKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHZpcGVyX3BjbWNpYV9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCh2aXBlcl9wY21jaWFfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aXBlcl9wY21jaWFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHZpcGVyX3BjbWNpYV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdCh2aXBlcl9wY21jaWFfaW5pdCk7Cittb2R1bGVfZXhpdCh2aXBlcl9wY21jaWFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCmluZGV4IDIwM2U1NzkuLjE3ZjRlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYwpAQCAtMTIyLDE5ICsxMjIsMjIgQEAKIAogc3RhdGljIGludCBhZGRfaW50ZXJ2YWwoc3RydWN0IHJlc291cmNlX21hcCAqbWFwLCB1X2xvbmcgYmFzZSwgdV9sb25nIG51bSkKIHsKLSAgICBzdHJ1Y3QgcmVzb3VyY2VfbWFwICpwLCAqcTsKKwlzdHJ1Y3QgcmVzb3VyY2VfbWFwICpwLCAqcTsKIAotICAgIGZvciAocCA9IG1hcDsgOyBwID0gcC0+bmV4dCkgewotCWlmICgocCAhPSBtYXApICYmIChwLT5iYXNlK3AtPm51bS0xID49IGJhc2UpKQotCSAgICByZXR1cm4gLTE7Ci0JaWYgKChwLT5uZXh0ID09IG1hcCkgfHwgKHAtPm5leHQtPmJhc2UgPiBiYXNlK251bS0xKSkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIHEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2VfbWFwKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFxKSByZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOwotICAgIHEtPmJhc2UgPSBiYXNlOyBxLT5udW0gPSBudW07Ci0gICAgcS0+bmV4dCA9IHAtPm5leHQ7IHAtPm5leHQgPSBxOwotICAgIHJldHVybiBDU19TVUNDRVNTOworCWZvciAocCA9IG1hcDsgOyBwID0gcC0+bmV4dCkgeworCQlpZiAoKHAgIT0gbWFwKSAmJiAocC0+YmFzZStwLT5udW0tMSA+PSBiYXNlKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKChwLT5uZXh0ID09IG1hcCkgfHwgKHAtPm5leHQtPmJhc2UgPiBiYXNlK251bS0xKSkKKwkJCWJyZWFrOworCX0KKwlxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlX21hcCksIEdGUF9LRVJORUwpOworCWlmICghcSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvdXQgb2YgbWVtb3J5IHRvIHVwZGF0ZSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcS0+YmFzZSA9IGJhc2U7IHEtPm51bSA9IG51bTsKKwlxLT5uZXh0ID0gcC0+bmV4dDsgcC0+bmV4dCA9IHE7CisJcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTY2LDcgKzE2OSwxMCBAQAogCSAgICB9IGVsc2UgewogCQkvKiBTcGxpdCB0aGUgYmxvY2sgaW50byB0d28gcGllY2VzICovCiAJCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2VfbWFwKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcCkgcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKwkJaWYgKCFwKSB7CisJCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICJvdXQgb2YgbWVtb3J5IHRvIHVwZGF0ZSByZXNvdXJjZXNcbiIpOworCQkgICAgcmV0dXJuIC1FTk9NRU07CisJCX0KIAkJcC0+YmFzZSA9IGJhc2UrbnVtOwogCQlwLT5udW0gPSBxLT5iYXNlK3EtPm51bSAtIHAtPmJhc2U7CiAJCXEtPm51bSA9IGJhc2UgLSBxLT5iYXNlOwpAQCAtMTc0LDcgKzE4MCw3IEBACiAJICAgIH0KIAl9CiAgICAgfQotICAgIHJldHVybiBDU19TVUNDRVNTOworICAgIHJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE5NCwxMyArMjAwLDE0IEBACiAgICAgaW50IGFueTsKICAgICB1X2NoYXIgKmIsIGhvbGUsIG1vc3Q7CiAKLSAgICBwcmludGsoS0VSTl9JTkZPICJjczogSU8gcG9ydCBwcm9iZSAlI3gtJSN4OiIsCi0JICAgYmFzZSwgYmFzZStudW0tMSk7CisgICAgZGV2X3ByaW50ayhLRVJOX0lORk8sICZzLT5kZXYsICJjczogSU8gcG9ydCBwcm9iZSAlI3gtJSN4OiIsCisJICAgICAgIGJhc2UsIGJhc2UrbnVtLTEpOwogCiAgICAgLyogRmlyc3QsIHdoYXQgZG9lcyBhIGZsb2F0aW5nIHBvcnQgbG9vayBsaWtlPyAqLwogICAgIGIgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAgICAgaWYgKCFiKSB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRvX2lvX3Byb2JlOiB1bmFibGUgdG8ga21hbGxvYyAyNTYgYnl0ZXMiKTsKKwkgICAgZGV2X3ByaW50ayhLRVJOX0VSUiwgJnMtPmRldiwKKwkJICAgImRvX2lvX3Byb2JlOiB1bmFibGUgdG8ga21hbGxvYyAyNTYgYnl0ZXMiKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZm9yIChpID0gYmFzZSwgbW9zdCA9IDA7IGkgPCBiYXNlK251bTsgaSArPSA4KSB7CkBAIC0zNjYsOCArMzczLDggQEAKICAgICBzdHJ1Y3Qgc29ja2V0X2RhdGEgKnNfZGF0YSA9IHMtPnJlc291cmNlX2RhdGE7CiAgICAgdV9sb25nIGksIGosIGJhZCwgZmFpbCwgc3RlcDsKIAotICAgIHByaW50ayhLRVJOX0lORk8gImNzOiBtZW1vcnkgcHJvYmUgMHglMDZseC0weCUwNmx4OiIsCi0JICAgYmFzZSwgYmFzZStudW0tMSk7CisgICAgZGV2X3ByaW50ayhLRVJOX0lORk8sICZzLT5kZXYsICJjczogbWVtb3J5IHByb2JlIDB4JTA2bHgtMHglMDZseDoiLAorCSAgICAgICBiYXNlLCBiYXNlK251bS0xKTsKICAgICBiYWQgPSBmYWlsID0gMDsKICAgICBzdGVwID0gKG51bSA8IDB4MjAwMDApID8gMHgyMDAwIDogKChudW0+PjQpICYgfjB4MWZmZik7CiAgICAgLyogZG9uJ3QgYWxsb3cgdG9vIGxhcmdlIHN0ZXBzICovCkBAIC00MzEsOCArNDM4LDggQEAKIAlpZiAocHJvYmVfbWFzayAmIE1FTV9QUk9CRV9ISUdIKSB7CiAJCWlmIChpbnZfcHJvYmUoc19kYXRhLT5tZW1fZGIubmV4dCwgcykgPiAwKQogCQkJcmV0dXJuIDA7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiY3M6IHdhcm5pbmc6IG5vIGhpZ2ggbWVtb3J5IHNwYWNlICIKLQkJICAgICAgICJhdmFpbGFibGUhXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnMtPmRldiwKKwkJCSAgICJjczogd2FybmluZzogbm8gaGlnaCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzk0LDEwICs4MDEsMTEgQEAKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCQlpZiAocmVzID09ICZpb3BvcnRfcmVzb3VyY2UpCiAJCQkJY29udGludWU7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IHBhcmVudCBQQ0kgYnJpZGdlIEkvTyAiCi0JCQkJIndpbmRvdzogMHglbGx4IC0gMHglbGx4XG4iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZW5kKTsKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcy0+Y2JfZGV2LT5kZXYsCisJCQkJICAgInBjbWNpYTogcGFyZW50IFBDSSBicmlkZ2UgSS9PICIKKwkJCQkgICAid2luZG93OiAweCVsbHggLSAweCVsbHhcbiIsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQpOwogCQkJaWYgKCFhZGp1c3RfaW8ocywgQUREX01BTkFHRURfUkVTT1VSQ0UsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKSkKIAkJCQlkb25lIHw9IElPUkVTT1VSQ0VfSU87CiAKQEAgLTgwNiwxMCArODE0LDExIEBACiAJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKIAkJCWlmIChyZXMgPT0gJmlvbWVtX3Jlc291cmNlKQogCQkJCWNvbnRpbnVlOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAicGNtY2lhOiBwYXJlbnQgUENJIGJyaWRnZSBNZW1vcnkgIgotCQkJCSJ3aW5kb3c6IDB4JWxseCAtIDB4JWxseFxuIiwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPmVuZCk7CisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnMtPmNiX2Rldi0+ZGV2LAorCQkJCSAgICJwY21jaWE6IHBhcmVudCBQQ0kgYnJpZGdlIE1lbW9yeSAiCisJCQkJICAgIndpbmRvdzogMHglbGx4IC0gMHglbGx4XG4iLAorCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwKKwkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+ZW5kKTsKIAkJCWlmICghYWRqdXN0X21lbW9yeShzLCBBRERfTUFOQUdFRF9SRVNPVVJDRSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpKQogCQkJCWRvbmUgfD0gSU9SRVNPVVJDRV9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwppbmRleCBjNDhmM2Y2Li5mNDlhYzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCkBAIC01NCw3ICs1NCw3IEBACiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2VuZGlmCiAKLSNpZmRlZiBERUJVRworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKIAogc3RhdGljIGludCBwY19kZWJ1ZzsKIG1vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTc0OCw3ICs3NDgsOSBAQAogCiAJCWFkZF90aW1lcigmc2t0LT5wb2xsX3RpbWVyKTsKIAotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNrdC0+c29ja2V0LmRldiwgJmRldl9hdHRyX3N0YXR1cyk7CisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2t0LT5zb2NrZXQuZGV2LCAmZGV2X2F0dHJfc3RhdHVzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2Vycl84OwogCX0KIAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNpbmZvKTsKQEAgLTc1OCw2ICs3NjAsOCBAQAogCWRvIHsKIAkJc2t0ID0gJnNpbmZvLT5za3RbaV07CiAKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZza3QtPnNvY2tldC5kZXYsICZkZXZfYXR0cl9zdGF0dXMpOworIG91dF9lcnJfODoKIAkJZGVsX3RpbWVyX3N5bmMoJnNrdC0+cG9sbF90aW1lcik7CiAJCXBjbWNpYV91bnJlZ2lzdGVyX3NvY2tldCgmc2t0LT5zb2NrZXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmggYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmgKaW5kZXggOTFlZjZhMC4uMzhjNjczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaApAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLSNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgogCiAKIHN0cnVjdCBkZXZpY2U7CkBAIC0xMzcsNyArMTM2LDcgQEAKIGV4dGVybiBpbnQgc29jX2NvbW1vbl9kcnZfcGNtY2lhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAKLSNpZmRlZiBERUJVRworI2lmZGVmIENPTkZJR19QQ01DSUFfREVCVUcKIAogZXh0ZXJuIHZvaWQgc29jX3BjbWNpYV9kZWJ1ZyhzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwgY29uc3QgY2hhciAqZnVuYywKIAkJCSAgICAgaW50IGx2bCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwppbmRleCAwMDZhMjllLi5mZjlhM2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwpAQCAtMzE2LDI3ICszMTYsMTggQEAKIAkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwotCWNpc2R1bXBfdCAqY2lzOwogCWludCBlcnJvcjsKIAogCWlmIChvZmYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvdW50ID49IDB4MjAwKQorCWlmIChjb3VudCA+PSBDSVNUUExfTUFYX0NJU19TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNpcyA9IGt6YWxsb2Moc2l6ZW9mKGNpc2R1bXBfdCksIEdGUF9LRVJORUwpOwotCWlmICghY2lzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNpcy0+TGVuZ3RoID0gY291bnQgKyAxOwotCW1lbWNweShjaXMtPkRhdGEsIGJ1ZiwgY291bnQpOwotCi0JZXJyb3IgPSBwY21jaWFfcmVwbGFjZV9jaXMocywgY2lzKTsKLQlrZnJlZShjaXMpOworCWVycm9yID0gcGNtY2lhX3JlcGxhY2VfY2lzKHMsIGJ1ZiwgY291bnQpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIC1FSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3RjaWMuYyBiL2RyaXZlcnMvcGNtY2lhL3RjaWMuYwppbmRleCA1NzkyYmQ1Li4yYTYxM2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvdGNpYy5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSAidGNpYy5oIgogCi0jaWZkZWYgREVCVUcKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0RFQlVHCiBzdGF0aWMgaW50IHBjX2RlYnVnOwogCiBtb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMDY0NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS90aTExM3guaCBiL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCmluZGV4IDEyOWRiN2IuLmFhYTcwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oCkBAIC0zMzksOCArMzM5LDggQEAKIAogCW1mdW5jID0gbWZ1bmNfb2xkID0gY29uZmlnX3JlYWRsKHNvY2tldCwgVEkxMjJYX01GVU5DKTsKIAlkZXZjdGwgPSBjb25maWdfcmVhZGIoc29ja2V0LCBUSTExM1hfREVWSUNFX0NPTlRST0wpOwotCXByaW50ayhLRVJOX0lORk8gIlllbnRhIFRJOiBzb2NrZXQgJXMsIG1mdW5jIDB4JTA4eCwgZGV2Y3RsIDB4JTAyeFxuIiwKLQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpLCBtZnVuYywgZGV2Y3RsKTsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCSAgICJUSTogbWZ1bmMgMHglMDh4LCBkZXZjdGwgMHglMDJ4XG4iLCBtZnVuYywgZGV2Y3RsKTsKIAogCS8qIG1ha2Ugc3VyZSBQQ0kgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBiZWZvcmUgcHJvYmluZyAqLwogCXRpX2luaXQoc29ja2V0KTsKQEAgLTM1NCw4ICszNTQsOCBAQAogCSAqIFdlJ3JlIGhlcmUgd2hpY2ggbWVhbnMgUENJIGludGVycnVwdHMgYXJlIF9ub3RfIGRlbGl2ZXJlZC4gdHJ5IHRvCiAJICogZmluZCB0aGUgcmlnaHQgc2V0dGluZyAoYWxsIHNlcmlhbCBvciBwYXJhbGxlbCkKIAkgKi8KLQlwcmludGsoS0VSTl9JTkZPICJZZW50YSBUSTogc29ja2V0ICVzIHByb2JpbmcgUENJIGludGVycnVwdCBmYWlsZWQsIHRyeWluZyB0byBmaXhcbiIsCi0JICAgICAgIHBjaV9uYW1lKHNvY2tldC0+ZGV2KSk7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkgICAiVEk6IHByb2JpbmcgUENJIGludGVycnVwdCBmYWlsZWQsIHRyeWluZyB0byBmaXhcbiIpOwogCiAJLyogZm9yIHNlcmlhbCBQQ0kgbWFrZSBzdXJlIE1GVU5DMyBpcyBzZXQgdG8gSVJRU0VSICovCiAJaWYgKChkZXZjdGwgJiBUSTExM1hfRENSX0lNT0RFX01BU0spID09IFRJMTJYWF9EQ1JfSU1PREVfQUxMX1NFUklBTCkgewpAQCAtMzc5LDggKzM3OSw4IEBACiAKIAkJCQlwY2lfaXJxX3N0YXR1cyA9IHllbnRhX3Byb2JlX2NiX2lycShzb2NrZXQpOwogCQkJCWlmIChwY2lfaXJxX3N0YXR1cyA9PSAxKSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gIlllbnRhIFRJOiBzb2NrZXQgJXMgYWxsLXNlcmlhbCBpbnRlcnJ1cHRzIG9rXG4iLAotCQkJCQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpKTsKKwkJCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJCQkgICAgIlRJOiBhbGwtc2VyaWFsIGludGVycnVwdHMgb2tcbiIpOwogCQkJCQltZnVuY19vbGQgPSBtZnVuYzsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQpAQCAtMzk1LDggKzM5NSw4IEBACiAJCX0KIAogCQkvKiBzZXJpYWwgUENJIGludGVycnVwdHMgbm90IHdvcmtpbmcgZmFsbCBiYWNrIHRvIHBhcmFsbGVsICovCi0JCXByaW50ayhLRVJOX0lORk8gIlllbnRhIFRJOiBzb2NrZXQgJXMgZmFsbGluZyBiYWNrIHRvIHBhcmFsbGVsIFBDSSBpbnRlcnJ1cHRzXG4iLAotCQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIlRJOiBmYWxsaW5nIGJhY2sgdG8gcGFyYWxsZWwgUENJIGludGVycnVwdHNcbiIpOwogCQlkZXZjdGwgJj0gflRJMTEzWF9EQ1JfSU1PREVfTUFTSzsKIAkJZGV2Y3RsIHw9IFRJMTEzWF9EQ1JfSU1PREVfU0VSSUFMOyAvKiBzZXJpYWwgSVNBIGNvdWxkIGJlIHJpZ2h0ICovCiAJCWNvbmZpZ193cml0ZWIoc29ja2V0LCBUSTExM1hfREVWSUNFX0NPTlRST0wsIGRldmN0bCk7CkBAIC00MjcsOCArNDI3LDggQEAKIAlwY2lfaXJxX3N0YXR1cyA9IHllbnRhX3Byb2JlX2NiX2lycShzb2NrZXQpOwogCWlmIChwY2lfaXJxX3N0YXR1cyA9PSAxKSB7CiAJCW1mdW5jX29sZCA9IG1mdW5jOwotCQlwcmludGsoS0VSTl9JTkZPICJZZW50YSBUSTogc29ja2V0ICVzIHBhcmFsbGVsIFBDSSBpbnRlcnJ1cHRzIG9rXG4iLAotCQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIlRJOiBwYXJhbGxlbCBQQ0kgaW50ZXJydXB0cyBva1xuIik7CiAJfSBlbHNlIHsKIAkJLyogbm90IHdvcmtpbmcsIGJhY2sgdG8gb2xkIHZhbHVlICovCiAJCW1mdW5jID0gbWZ1bmNfb2xkOwpAQCAtNDQwLDggKzQ0MCw5IEBACiBvdXQ6CiAJaWYgKHBjaV9pcnFfc3RhdHVzIDwgMSkgewogCQlzb2NrZXQtPmNiX2lycSA9IDA7Ci0JCXByaW50ayhLRVJOX0lORk8gIlllbnRhIFRJOiBzb2NrZXQgJXMgbm8gUENJIGludGVycnVwdHMuIEZpc2guIFBsZWFzZSByZXBvcnQuXG4iLAotCQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIlllbnRhIFRJOiBubyBQQ0kgaW50ZXJydXB0cy4gRmlzaC4gIgorCQkJICAgIlBsZWFzZSByZXBvcnQuXG4iKTsKIAl9CiB9CiAKQEAgLTUxMyw4ICs1MTQsOSBAQAogCiAJbWZ1bmMgPSBtZnVuY19vbGQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBUSTEyMlhfTUZVTkMpOwogCWRldmN0bCA9IGNvbmZpZ19yZWFkYihzb2NrZXQsIFRJMTEzWF9ERVZJQ0VfQ09OVFJPTCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWWVudGEgVEk6IHNvY2tldCAlcywgbWZ1bmMgMHglMDh4LCBkZXZjdGwgMHglMDJ4XG4iLAotCSAgICAgICBwY2lfbmFtZShzb2NrZXQtPmRldiksIG1mdW5jLCBkZXZjdGwpOworCWRldl9wcmludGsoS0VSTl9JTkZPLCAmc29ja2V0LT5kZXYtPmRldiwKKwkJICAgIlRJOiBtZnVuYyAweCUwOHgsIGRldmN0bCAweCUwMnhcbiIsCisJCSAgIG1mdW5jLCBkZXZjdGwpOwogCiAJLyogaWYgSVJRcyBhcmUgY29uZmlndXJlZCBhcyB0aWVkLCBhbGlnbiBpcnEgb2YgZnVuYzEgd2l0aCBmdW5jMCAqLwogCXN5c2N0bCA9IGNvbmZpZ19yZWFkbChzb2NrZXQsIFRJMTEzWF9TWVNURU1fQ09OVFJPTCk7CkBAIC01MzMsOSArNTM1LDggQEAKIAkgKiBXZSdyZSBoZXJlIHdoaWNoIG1lYW5zIFBDSSBpbnRlcnJ1cHRzIGFyZSBfbm90XyBkZWxpdmVyZWQuIHRyeSB0bwogCSAqIGZpbmQgdGhlIHJpZ2h0IHNldHRpbmcKIAkgKi8KLQlwcmludGsoS0VSTl9JTkZPICJZZW50YSBUSTogc29ja2V0ICVzIHByb2JpbmcgUENJIGludGVycnVwdCBmYWlsZWQsIHRyeWluZyB0byBmaXhcbiIsCi0JICAgICAgIHBjaV9uYW1lKHNvY2tldC0+ZGV2KSk7Ci0KKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCSAgICJUSTogcHJvYmluZyBQQ0kgaW50ZXJydXB0IGZhaWxlZCwgdHJ5aW5nIHRvIGZpeFxuIik7CiAKIAkvKiBpZiBhbGwgc2VyaWFsOiBzZXQgSU5UUlRJRSwgcHJvYmUgYWdhaW4gKi8KIAlpZiAoKGRldmN0bCAmIFRJMTEzWF9EQ1JfSU1PREVfTUFTSykgPT0gVEkxMlhYX0RDUl9JTU9ERV9BTExfU0VSSUFMKSB7CkBAIC01NDQsOCArNTQ1LDggQEAKIAkJaWYgKHRpMTJ4eF90aWVfaW50ZXJydXB0cyhzb2NrZXQsICZvbGRfaXJxKSkgewogCQkJcGNpX2lycV9zdGF0dXMgPSB5ZW50YV9wcm9iZV9jYl9pcnEoc29ja2V0KTsKIAkJCWlmIChwY2lfaXJxX3N0YXR1cyA9PSAxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGEgVEk6IHNvY2tldCAlcyBhbGwtc2VyaWFsIGludGVycnVwdHMsIHRpZWQgb2tcbiIsCi0JCQkJICAgICAgIHBjaV9uYW1lKHNvY2tldC0+ZGV2KSk7CisJCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJCQkiVEk6IGFsbC1zZXJpYWwgaW50ZXJydXB0cywgdGllZCBva1xuIik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKQEAgLTU4Miw4ICs1ODMsOCBAQAogCiAJCQlwY2lfaXJxX3N0YXR1cyA9IHllbnRhX3Byb2JlX2NiX2lycShzb2NrZXQpOwogCQkJaWYgKHBjaV9pcnFfc3RhdHVzID09IDEpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJZZW50YSBUSTogc29ja2V0ICVzIHBhcmFsbGVsIFBDSSBpbnRlcnJ1cHRzIG9rXG4iLAotCQkJCSAgICAgICBwY2lfbmFtZShzb2NrZXQtPmRldikpOworCQkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmc29ja2V0LT5kZXYtPmRldiwKKwkJCQkJICAgIlRJOiBwYXJhbGxlbCBQQ0kgaW50ZXJydXB0cyBva1xuIik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKQEAgLTU5MywxMyArNTk0LDEzIEBACiAJCQlpZiAocGNpX2lycV9zdGF0dXMgPT0gLTEpCiAJCQkJZ290byBvdXQ7CiAJCX0KLQkJCisKIAkJLyogc3RpbGwgbm90aGluZzogc2V0IElOVFJUSUUgKi8KIAkJaWYgKHRpMTJ4eF90aWVfaW50ZXJydXB0cyhzb2NrZXQsICZvbGRfaXJxKSkgewogCQkJcGNpX2lycV9zdGF0dXMgPSB5ZW50YV9wcm9iZV9jYl9pcnEoc29ja2V0KTsKIAkJCWlmIChwY2lfaXJxX3N0YXR1cyA9PSAxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGEgVEk6IHNvY2tldCAlcyBwYXJhbGxlbCBQQ0kgaW50ZXJydXB0cywgdGllZCBva1xuIiwKLQkJCQkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpKTsKKwkJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCQkJICAgICJUSTogcGFyYWxsZWwgUENJIGludGVycnVwdHMsIHRpZWQgb2tcbiIpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCkBAIC02MTAsOCArNjExLDggQEAKIG91dDoKIAlpZiAocGNpX2lycV9zdGF0dXMgPCAxKSB7CiAJCXNvY2tldC0+Y2JfaXJxID0gMDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiWWVudGEgVEk6IHNvY2tldCAlcyBubyBQQ0kgaW50ZXJydXB0cy4gRmlzaC4gUGxlYXNlIHJlcG9ydC5cbiIsCi0JCSAgICAgICBwY2lfbmFtZShzb2NrZXQtPmRldikpOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCQkgICAiVEk6IG5vIFBDSSBpbnRlcnJ1cHRzLiBGaXNoLiBQbGVhc2UgcmVwb3J0LlxuIik7CiAJfQogfQogCkBAIC04MTUsMTEgKzgxNiwxMyBAQAogCS8qIG1ha2Ugc3VyZSB0aGF0IG1lbW9yeSBidXJzdCBpcyBhY3RpdmUgKi8KIAl2YWxfb3JpZyA9IHZhbCA9IGNvbmZpZ19yZWFkbChzb2NrZXQsIFRJMTEzWF9TWVNURU1fQ09OVFJPTCk7CiAJaWYgKGRpc2FibGVfY2xrcnVuICYmIFBDSV9GVU5DKHNvY2tldC0+ZGV2LT5kZXZmbikgPT0gMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogRGlzYWJsaW5nIENMS1JVTiBmZWF0dXJlXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIkRpc2FibGluZyBDTEtSVU4gZmVhdHVyZVxuIik7CiAJCXZhbCB8PSBUSTExM1hfU0NSX0tFRVBDTEs7CiAJfQogCWlmICghKHZhbCAmIFRJMTIyWF9TQ1JfTVJCVVJTVFVQKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogRW5hYmxpbmcgYnVyc3QgbWVtb3J5IHJlYWQgdHJhbnNhY3Rpb25zXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIkVuYWJsaW5nIGJ1cnN0IG1lbW9yeSByZWFkIHRyYW5zYWN0aW9uc1xuIik7CiAJCXZhbCB8PSBUSTEyMlhfU0NSX01SQlVSU1RVUDsKIAl9CiAJaWYgKHZhbF9vcmlnICE9IHZhbCkKQEAgLTgzMCwxMCArODMzLDEyIEBACiAJICogQ1NDIGludGVycnVwdHMgdG8gUENJIHJhdGhlciB0aGFuIElOVFZBTC4KIAkgKi8KIAl2YWwgPSBjb25maWdfcmVhZGIoc29ja2V0LCBUSTEyNTBfRElBR05PU1RJQyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IFVzaW5nICVzIHRvIHJvdXRlIENTQyBpbnRlcnJ1cHRzIHRvIFBDSVxuIiwKLQkJKHZhbCAmIFRJMTI1MF9ESUFHX1BDSV9DU0MpID8gIkNTQ0lOVCIgOiAiSU5UVkFMIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IFJvdXRpbmcgQ2FyZEJ1cyBpbnRlcnJ1cHRzIHRvICVzXG4iLAotCQkodmFsICYgVEkxMjUwX0RJQUdfUENJX0lSRVEpID8gIlBDSSIgOiAiSVNBIik7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkgICAiVXNpbmcgJXMgdG8gcm91dGUgQ1NDIGludGVycnVwdHMgdG8gUENJXG4iLAorCQkgICAodmFsICYgVEkxMjUwX0RJQUdfUENJX0NTQykgPyAiQ1NDSU5UIiA6ICJJTlRWQUwiKTsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNvY2tldC0+ZGV2LT5kZXYsCisJCSAgICJSb3V0aW5nIENhcmRCdXMgaW50ZXJydXB0cyB0byAlc1xuIiwKKwkJICAgKHZhbCAmIFRJMTI1MF9ESUFHX1BDSV9JUkVRKSA/ICJQQ0kiIDogIklTQSIpOwogCiAJLyogZG8gaXJxcm91dGluZywgZGVwZW5kaW5nIG9uIGZ1bmN0aW9uICovCiAJaWYgKFBDSV9GVU5DKHNvY2tldC0+ZGV2LT5kZXZmbikgPT0gMCkKQEAgLTg1OCw4ICs4NjMsOSBAQAogCQlkaWFnIHw9IFRJMTI1MF9ESUFHX1BDSV9DU0MgfCBUSTEyNTBfRElBR19QQ0lfSVJFUTsKIAogCWlmIChkaWFnICE9IG9sZCkgewotCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogYWRqdXN0aW5nIGRpYWdub3N0aWM6ICUwMnggLT4gJTAyeFxuIiwKLQkJCW9sZCwgZGlhZyk7CisJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmc29ja2V0LT5kZXYtPmRldiwKKwkJCSAgICJhZGp1c3RpbmcgZGlhZ25vc3RpYzogJTAyeCAtPiAlMDJ4XG4iLAorCQkJICAgb2xkLCBkaWFnKTsKIAkJY29uZmlnX3dyaXRlYihzb2NrZXQsIFRJMTI1MF9ESUFHTk9TVElDLCBkaWFnKTsKIAl9CiAKQEAgLTkyNCw3ICs5MzAsOSBAQAogCQkvKiBkZWZhdWx0IHRvIGNsZWFyIFRMVEVuYWJsZSBiaXQsIG9sZCBiZWhhdmlvdXIgKi8KIAkJdGVzdF9jOSAmPSB+RU5FX1RFU1RfQzlfVExURU5BQkxFOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgRW5FOiBjaGFuaW5nIHRlc3RyZWdpc3RlciAweEM5LCAlMDJ4IC0+ICUwMnhcbiIsIG9sZF9jOSwgdGVzdF9jOSk7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkgICAiRW5FOiBjaGFuaW5nIHRlc3RyZWdpc3RlciAweEM5LCAlMDJ4IC0+ICUwMnhcbiIsCisJCSAgIG9sZF9jOSwgdGVzdF9jOSk7CiAJY29uZmlnX3dyaXRlYihzb2NrZXQsIEVORV9URVNUX0M5LCB0ZXN0X2M5KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCAwYWIxZmI2Li4zZWNkN2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMzgsMTEgKzM4LDcgQEAKIG1vZHVsZV9wYXJhbShwd3JfaXJxc19vZmYsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwd3JfaXJxc19vZmYsICJGb3JjZSBJUlFzIG9mZiBkdXJpbmcgcG93ZXItb24gb2Ygc2xvdC4gVXNlIG9ubHkgd2hlbiBzZWVpbmcgSVJRIHN0b3JtcyEiKTsKIAotI2lmIDAKLSNkZWZpbmUgZGVidWcoeCxhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgeCwgX19mdW5jX18gLCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBkZWJ1Zyh4LGFyZ3MuLi4pCi0jZW5kaWYKKyNkZWZpbmUgZGVidWcoeCwgcywgYXJncy4uLikgZGV2X2RiZygmcy0+ZGV2LT5kZXYsIHgsICMjYXJncykKIAogLyogRG9uJ3QgYXNrLi4gKi8KICNkZWZpbmUgdG9fY3ljbGVzKG5zKQkoKG5zKS8xMjApCkBAIC02OSwxMyArNjUsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdTMyIGNiX3JlYWRsKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgdW5zaWduZWQgcmVnKQogewogCXUzMiB2YWwgPSByZWFkbChzb2NrZXQtPmJhc2UgKyByZWcpOwotCWRlYnVnKCIlcCAlMDR4ICUwOHhcbiIsIHNvY2tldCwgcmVnLCB2YWwpOworCWRlYnVnKCIlMDR4ICUwOHhcbiIsIHNvY2tldCwgcmVnLCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjYl93cml0ZWwoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCByZWcsIHUzMiB2YWwpCiB7Ci0JZGVidWcoIiVwICUwNHggJTA4eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CisJZGVidWcoIiUwNHggJTA4eFxuIiwgc29ja2V0LCByZWcsIHZhbCk7CiAJd3JpdGVsKHZhbCwgc29ja2V0LT5iYXNlICsgcmVnKTsKIAlyZWFkbChzb2NrZXQtPmJhc2UgKyByZWcpOyAvKiBhdm9pZCBwcm9ibGVtcyB3aXRoIFBDSSB3cml0ZSBwb3N0aW5nICovCiB9CkBAIC04NCw3ICs4MCw3IEBACiB7CiAJdTggdmFsOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNvY2tldC0+ZGV2LCBvZmZzZXQsICZ2YWwpOwotCWRlYnVnKCIlcCAlMDR4ICUwMnhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOworCWRlYnVnKCIlMDR4ICUwMnhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTkyLDcgKzg4LDcgQEAKIHsKIAl1MTYgdmFsOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNvY2tldC0+ZGV2LCBvZmZzZXQsICZ2YWwpOwotCWRlYnVnKCIlcCAlMDR4ICUwNHhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOworCWRlYnVnKCIlMDR4ICUwNHhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTEwMCwzMiArOTYsMzIgQEAKIHsKIAl1MzIgdmFsOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb2NrZXQtPmRldiwgb2Zmc2V0LCAmdmFsKTsKLQlkZWJ1ZygiJXAgJTA0eCAlMDh4XG4iLCBzb2NrZXQsIG9mZnNldCwgdmFsKTsKKwlkZWJ1ZygiJTA0eCAlMDh4XG4iLCBzb2NrZXQsIG9mZnNldCwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlnX3dyaXRlYihzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIG9mZnNldCwgdTggdmFsKQogewotCWRlYnVnKCIlcCAlMDR4ICUwMnhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOworCWRlYnVnKCIlMDR4ICUwMnhcbiIsIHNvY2tldCwgb2Zmc2V0LCB2YWwpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShzb2NrZXQtPmRldiwgb2Zmc2V0LCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlnX3dyaXRldyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIG9mZnNldCwgdTE2IHZhbCkKIHsKLQlkZWJ1ZygiJXAgJTA0eCAlMDR4XG4iLCBzb2NrZXQsIG9mZnNldCwgdmFsKTsKKwlkZWJ1ZygiJTA0eCAlMDR4XG4iLCBzb2NrZXQsIG9mZnNldCwgdmFsKTsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc29ja2V0LT5kZXYsIG9mZnNldCwgdmFsKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ193cml0ZWwoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCBvZmZzZXQsIHUzMiB2YWwpCiB7Ci0JZGVidWcoIiVwICUwNHggJTA4eFxuIiwgc29ja2V0LCBvZmZzZXQsIHZhbCk7CisJZGVidWcoIiUwNHggJTA4eFxuIiwgc29ja2V0LCBvZmZzZXQsIHZhbCk7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb2NrZXQtPmRldiwgb2Zmc2V0LCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHU4IGV4Y2FfcmVhZGIoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCByZWcpCiB7CiAJdTggdmFsID0gcmVhZGIoc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOwotCWRlYnVnKCIlcCAlMDR4ICUwMnhcbiIsIHNvY2tldCwgcmVnLCB2YWwpOworCWRlYnVnKCIlMDR4ICUwMnhcbiIsIHNvY2tldCwgcmVnLCB2YWwpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTEzNCwyMCArMTMwLDIwIEBACiAJdTE2IHZhbDsKIAl2YWwgPSByZWFkYihzb2NrZXQtPmJhc2UgKyAweDgwMCArIHJlZyk7CiAJdmFsIHw9IHJlYWRiKHNvY2tldC0+YmFzZSArIDB4ODAwICsgcmVnICsgMSkgPDwgODsKLQlkZWJ1ZygiJXAgJTA0eCAlMDR4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKKwlkZWJ1ZygiJTA0eCAlMDR4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXhjYV93cml0ZWIoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCB1bnNpZ25lZCByZWcsIHU4IHZhbCkKIHsKLQlkZWJ1ZygiJXAgJTA0eCAlMDJ4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKKwlkZWJ1ZygiJTA0eCAlMDJ4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKIAl3cml0ZWIodmFsLCBzb2NrZXQtPmJhc2UgKyAweDgwMCArIHJlZyk7CiAJcmVhZGIoc29ja2V0LT5iYXNlICsgMHg4MDAgKyByZWcpOyAvKiBQQ0kgd3JpdGUgcG9zdGluZy4uLiAqLwogfQogCiBzdGF0aWMgdm9pZCBleGNhX3dyaXRldyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIHJlZywgdTE2IHZhbCkKIHsKLQlkZWJ1ZygiJXAgJTA0eCAlMDR4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKKwlkZWJ1ZygiJTA0eCAlMDR4XG4iLCBzb2NrZXQsIHJlZywgdmFsKTsKIAl3cml0ZWIodmFsLCBzb2NrZXQtPmJhc2UgKyAweDgwMCArIHJlZyk7CiAJd3JpdGViKHZhbCA+PiA4LCBzb2NrZXQtPmJhc2UgKyAweDgwMCArIHJlZyArIDEpOwogCkBAIC0yMDcsNyArMjAzLDcgQEAKIAogCiAJaWYgKHN0YXRlICYgQ0JfQ0JDQVJEKSB7Ci0JCXZhbCB8PSBTU19DQVJEQlVTOwkKKwkJdmFsIHw9IFNTX0NBUkRCVVM7CiAJCXZhbCB8PSAoc3RhdGUgJiBDQl9DQVJEU1RTKSA/IFNTX1NUU0NIRyA6IDA7CiAJCXZhbCB8PSAoc3RhdGUgJiAoQ0JfQ0RFVEVDVDEgfCBDQl9DREVURUNUMikpID8gMCA6IFNTX0RFVEVDVDsKIAkJdmFsIHw9IChzdGF0ZSAmIENCX1BXUkNZQ0xFKSA/IFNTX1BPV0VST04gfCBTU19SRUFEWSA6IDA7CkBAIC02NTAsOCArNjQ2LDEwIEBACiAJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7CiAJCWlmIChyb290ICYmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkpCiAJCQlyZXR1cm4gMDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAieWVudGEgJXM6IFByZWFzc2lnbmVkIHJlc291cmNlICVkIGJ1c3kgb3Igbm90IGF2YWlsYWJsZSwgcmVjb25maWd1cmluZy4uLlxuIiwKLQkJCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIG5yKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgIlByZWFzc2lnbmVkIHJlc291cmNlICVkIGJ1c3kgb3Igbm90IGF2YWlsYWJsZSwgIgorCQkJICAgInJlY29uZmlndXJpbmcuLi5cbiIsCisJCQkgICBucik7CiAJfQogCiAJaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKSB7CkBAIC02NzQsOCArNjcyLDkgQEAKIAkJCXJldHVybiAxOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gInllbnRhICVzOiBubyByZXNvdXJjZSBvZiB0eXBlICV4IGF2YWlsYWJsZSwgdHJ5aW5nIHRvIGNvbnRpbnVlLi4uXG4iLAotCSAgICAgICBwY2lfbmFtZShzb2NrZXQtPmRldiksIHR5cGUpOworCWRldl9wcmludGsoS0VSTl9JTkZPLCAmc29ja2V0LT5kZXYtPmRldiwKKwkJICAgIm5vIHJlc291cmNlIG9mIHR5cGUgJXggYXZhaWxhYmxlLCB0cnlpbmcgdG8gY29udGludWUuLi5cbiIsCisJCSAgIHR5cGUpOwogCXJlcy0+c3RhcnQgPSByZXMtPmVuZCA9IHJlcy0+ZmxhZ3MgPSAwOwogCXJldHVybiAwOwogfQpAQCAtOTIzLDcgKzkyMiw4IEBACiAJc29ja2V0LT5wcm9iZV9zdGF0dXMgPSAwOwogCiAJaWYgKHJlcXVlc3RfaXJxKHNvY2tldC0+Y2JfaXJxLCB5ZW50YV9wcm9iZV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwgInllbnRhIiwgc29ja2V0KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJZZW50YTogcmVxdWVzdF9pcnEoKSBpbiB5ZW50YV9wcm9iZV9jYl9pcnEoKSBmYWlsZWQhXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZzb2NrZXQtPmRldi0+ZGV2LAorCQkJICAgInJlcXVlc3RfaXJxKCkgaW4geWVudGFfcHJvYmVfY2JfaXJxKCkgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTk2MCw4ICs5NjAsOSBAQAogCWVsc2UKIAkJc29ja2V0LT5zb2NrZXQuaXJxX21hc2sgPSAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IElTQSBJUlEgbWFzayAweCUwNHgsIFBDSSBpcnEgJWRcbiIsCi0JICAgICAgIHNvY2tldC0+c29ja2V0LmlycV9tYXNrLCBzb2NrZXQtPmNiX2lycSk7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZzb2NrZXQtPmRldi0+ZGV2LAorCQkgICAiSVNBIElSUSBtYXNrIDB4JTA0eCwgUENJIGlycSAlZFxuIiwKKwkJICAgc29ja2V0LT5zb2NrZXQuaXJxX21hc2ssIHNvY2tldC0+Y2JfaXJxKTsKIH0KIAogLyoKQEAgLTEwNTEsOCArMTA1Miw5IEBACiAKIAkvKiBTaG93IHRoYXQgdGhlIHdhbnRlZCBzdWJvcmRpbmF0ZSBudW1iZXIgaXMgbm90IHBvc3NpYmxlOiAqLwogCWlmIChjYXJkYnVzX2JyaWRnZS0+c3Vib3JkaW5hdGUgPiB1cHBlcl9saW1pdCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWWVudGE6IFVwcGVyIGxpbWl0IGZvciBmaXhpbmcgdGhpcyAiCi0JCQkiYnJpZGdlJ3MgcGFyZW50IGJyaWRnZTogIyUwMnhcbiIsIHVwcGVyX2xpbWl0KTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZjYXJkYnVzX2JyaWRnZS0+ZGV2LAorCQkJICAgIlVwcGVyIGxpbWl0IGZvciBmaXhpbmcgdGhpcyAiCisJCQkgICAiYnJpZGdlJ3MgcGFyZW50IGJyaWRnZTogIyUwMnhcbiIsIHVwcGVyX2xpbWl0KTsKIAogCS8qIElmIHdlIGhhdmUgcm9vbSB0byBpbmNyZWFzZSB0aGUgYnJpZGdlJ3Mgc3Vib3JkaW5hdGUgbnVtYmVyLCAqLwogCWlmIChicmlkZ2VfdG9fZml4LT5zdWJvcmRpbmF0ZSA8IHVwcGVyX2xpbWl0KSB7CkBAIC0xMDYxLDEwICsxMDYzLDExIEBACiAJCXVuc2lnbmVkIGNoYXIgc3Vib3JkaW5hdGVfdG9fYXNzaWduID0KIAkJCW1pbihjYXJkYnVzX2JyaWRnZS0+c3Vib3JkaW5hdGUsIHVwcGVyX2xpbWl0KTsKIAotCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogUmFpc2luZyBzdWJvcmRpbmF0ZSBidXMjIG9mIHBhcmVudCAiCi0JCQkiYnVzICgjJTAyeCkgZnJvbSAjJTAyeCB0byAjJTAyeFxuIiwKLQkJCWJyaWRnZV90b19maXgtPm51bWJlciwKLQkJCWJyaWRnZV90b19maXgtPnN1Ym9yZGluYXRlLCBzdWJvcmRpbmF0ZV90b19hc3NpZ24pOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmJyaWRnZV90b19maXgtPmRldiwKKwkJCSAgICJSYWlzaW5nIHN1Ym9yZGluYXRlIGJ1cyMgb2YgcGFyZW50ICIKKwkJCSAgICJidXMgKCMlMDJ4KSBmcm9tICMlMDJ4IHRvICMlMDJ4XG4iLAorCQkJICAgYnJpZGdlX3RvX2ZpeC0+bnVtYmVyLAorCQkJICAgYnJpZGdlX3RvX2ZpeC0+c3Vib3JkaW5hdGUsIHN1Ym9yZGluYXRlX3RvX2Fzc2lnbik7CiAKIAkJLyogU2F2ZSB0aGUgbmV3IHN1Ym9yZGluYXRlIGluIHRoZSBidXMgc3RydWN0IG9mIHRoZSBicmlkZ2UgKi8KIAkJYnJpZGdlX3RvX2ZpeC0+c3Vib3JkaW5hdGUgPSBzdWJvcmRpbmF0ZV90b19hc3NpZ247CkBAIC0xMDkxLDggKzEwOTQsOCBAQAogCSAqIEJhaWwgb3V0IGlmIHNvLgogCSAqLwogCWlmICghZGV2LT5zdWJvcmRpbmF0ZSkgewotCQlwcmludGsoS0VSTl9FUlIgIlllbnRhOiBubyBidXMgYXNzb2NpYXRlZCB3aXRoICVzISAiCi0JCQkiKHRyeSAncGNpPWFzc2lnbi1idXNzZXMnKVxuIiwgcGNpX25hbWUoZGV2KSk7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPmRldiwgIm5vIGJ1cyBhc3NvY2lhdGVkISAiCisJCQkgICAiKHRyeSAncGNpPWFzc2lnbi1idXNzZXMnKVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTEyNyw3ICsxMTMwLDcgQEAKIAkJZ290byBkaXNhYmxlOwogCiAJaWYgKCFwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5vIGNhcmRidXMgcmVzb3VyY2UhXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmRldi0+ZGV2LCAiTm8gY2FyZGJ1cyByZXNvdXJjZSFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIHJlbGVhc2U7CiAJfQpAQCAtMTE0Niw4ICsxMTQ5LDggQEAKIAkgKiByZXBvcnQgdGhlIHN1YnN5c3RlbSB2ZW5kb3IgYW5kIGRldmljZSBmb3IgaGVscCBkZWJ1Z2dpbmcKIAkgKiB0aGUgaXJxIHN0dWZmLi4uCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiWWVudGE6IENhcmRCdXMgYnJpZGdlIGZvdW5kIGF0ICVzIFslMDR4OiUwNHhdXG4iLAotCQlwY2lfbmFtZShkZXYpLCBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsIGRldi0+c3Vic3lzdGVtX2RldmljZSk7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sICZkZXYtPmRldiwgIkNhcmRCdXMgYnJpZGdlIGZvdW5kIFslMDR4OiUwNHhdXG4iLAorCQkgICBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsIGRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAKIAl5ZW50YV9jb25maWdfaW5pdChzb2NrZXQpOwogCkBAIC0xMTc5LDggKzExODIsMTIgQEAKIAkJc29ja2V0LT5wb2xsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzb2NrZXQ7CiAJCXNvY2tldC0+cG9sbF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOwogCQlhZGRfdGltZXIoJnNvY2tldC0+cG9sbF90aW1lcik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlllbnRhOiBubyBQQ0kgSVJRLCBDYXJkQnVzIHN1cHBvcnQgZGlzYWJsZWQgZm9yIHRoaXMgc29ja2V0LlxuIgotCQkgICAgICAgS0VSTl9JTkZPICJZZW50YTogY2hlY2sgeW91ciBCSU9TIENhcmRCdXMsIEJJT1MgSVJRIG9yIEFDUEkgc2V0dGluZ3MuXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZkZXYtPmRldiwKKwkJCSAgICJubyBQQ0kgSVJRLCBDYXJkQnVzIHN1cHBvcnQgZGlzYWJsZWQgZm9yIHRoaXMgIgorCQkJICAgInNvY2tldC5cbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmRldi0+ZGV2LAorCQkJICAgImNoZWNrIHlvdXIgQklPUyBDYXJkQnVzLCBCSU9TIElSUSBvciBBQ1BJICIKKwkJCSAgICJzZXR0aW5ncy5cbiIpOwogCX0gZWxzZSB7CiAJCXNvY2tldC0+c29ja2V0LmZlYXR1cmVzIHw9IFNTX0NBUF9DQVJEQlVTOwogCX0KQEAgLTExODgsNyArMTE5NSw4IEBACiAJLyogRmlndXJlIG91dCB3aGF0IHRoZSBkYW5nIHRoaW5nIGNhbiBkbyBmb3IgdGhlIFBDTUNJQSBsYXllci4uLiAqLwogCXllbnRhX2ludGVycm9nYXRlKHNvY2tldCk7CiAJeWVudGFfZ2V0X3NvY2tldF9jYXBhYmlsaXRpZXMoc29ja2V0LCBpc2FfaW50ZXJydXB0cyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU29ja2V0IHN0YXR1czogJTA4eFxuIiwgY2JfcmVhZGwoc29ja2V0LCBDQl9TT0NLRVRfU1RBVEUpKTsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmRldi0+ZGV2LAorCQkgICAiU29ja2V0IHN0YXR1czogJTA4eFxuIiwgY2JfcmVhZGwoc29ja2V0LCBDQl9TT0NLRVRfU1RBVEUpKTsKIAogCXllbnRhX2ZpeHVwX3BhcmVudF9icmlkZ2UoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL01ha2VmaWxlIGIvZHJpdmVycy9wbnAvTWFrZWZpbGUKaW5kZXggMjZmNWFiYy4uZTgzZjM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wbnAvTWFrZWZpbGUKQEAgLTIsMTIgKzIsMTUgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBQbHVnLWFuZC1QbGF5IFN1cHBvcnQuCiAjCiAKLW9iai15CQk6PSBjb3JlLm8gY2FyZC5vIGRyaXZlci5vIHJlc291cmNlLm8gbWFuYWdlci5vIHN1cHBvcnQubyBpbnRlcmZhY2UubyBxdWlya3MubyBzeXN0ZW0ubworb2JqLXkJCTo9IGNvcmUubyBjYXJkLm8gZHJpdmVyLm8gcmVzb3VyY2UubyBtYW5hZ2VyLm8gc3VwcG9ydC5vIGludGVyZmFjZS5vIHF1aXJrcy5vCiAKIG9iai0kKENPTkZJR19QTlBBQ1BJKQkJKz0gcG5wYWNwaS8KIG9iai0kKENPTkZJR19QTlBCSU9TKQkJKz0gcG5wYmlvcy8KIG9iai0kKENPTkZJR19JU0FQTlApCQkrPSBpc2FwbnAvCiAKKyMgcG5wX3N5c3RlbV9pbml0IGdvZXMgYWZ0ZXIgcG5wYWNwaS9wbnBiaW9zIGluaXQKK29iai15CQkJCSs9IHN5c3RlbS5vCisKIGlmZXEgKCQoQ09ORklHX1BOUF9ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvYmFzZS5oIGIvZHJpdmVycy9wbnAvYmFzZS5oCmluZGV4IDlmZDdiYjkuLjNiOGI5ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2Jhc2UuaAorKysgYi9kcml2ZXJzL3BucC9iYXNlLmgKQEAgLTQsNiArNCw3IEBACiAgKi8KIAogZXh0ZXJuIHNwaW5sb2NrX3QgcG5wX2xvY2s7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcG5wX2ludGVyZmFjZV9hdHRyc1tdOwogdm9pZCAqcG5wX2FsbG9jKGxvbmcgc2l6ZSk7CiAKIGludCBwbnBfcmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IHBucF9wcm90b2NvbCAqcHJvdG9jb2wpOwpAQCAtMTYsNyArMTcsNiBAQAogCiBpbnQgcG5wX2FkZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldik7CiBzdHJ1Y3QgcG5wX2lkICpwbnBfYWRkX2lkKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNoYXIgKmlkKTsKLWludCBwbnBfaW50ZXJmYWNlX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldik7CiAKIGludCBwbnBfYWRkX2NhcmQoc3RydWN0IHBucF9jYXJkICpjYXJkKTsKIHZvaWQgcG5wX3JlbW92ZV9jYXJkKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCk7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIHZvaWQgZGJnX3BucF9zaG93X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2LCBjaGFyICpkZXNjKTsKIAogdm9pZCBwbnBfZnJlZV9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldik7Ci1pbnQgcG5wX3Jlc291cmNlX3R5cGUoc3RydWN0IHJlc291cmNlICpyZXMpOwordW5zaWduZWQgbG9uZyBwbnBfcmVzb3VyY2VfdHlwZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAKIHN0cnVjdCBwbnBfcmVzb3VyY2UgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2NvcmUuYwppbmRleCBhNDExNTgyLi44MTdmZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvY29yZS5jCkBAIC0xNTksMjEgKzE1OSwxMyBAQAogCiBpbnQgX19wbnBfYWRkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewotCWludCByZXQ7Ci0KIAlwbnBfZml4dXBfZGV2aWNlKGRldik7CiAJZGV2LT5zdGF0dXMgPSBQTlBfUkVBRFk7CiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnBucF9nbG9iYWwpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cHJvdG9jb2xfbGlzdCwgJmRldi0+cHJvdG9jb2wtPmRldmljZXMpOwogCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7Ci0KLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcG5wX2ludGVyZmFjZV9hdHRhY2hfZGV2aWNlKGRldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOwogfQogCiAvKgpAQCAtMjE4LDcgKzIxMCw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBucF9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTGludXggUGx1ZyBhbmQgUGxheSBTdXBwb3J0IHYwLjk3IChjKSBBZGFtIEJlbGF5XG4iKTsKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwbnBfYnVzX3R5cGUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9kcml2ZXIuYyBiL2RyaXZlcnMvcG5wL2RyaXZlci5jCmluZGV4IGQzZjg2OWUuLmUzZjdlODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvcG5wL2RyaXZlci5jCkBAIC0yMDYsNiArMjA2LDcgQEAKIAkucmVtb3ZlICA9IHBucF9kZXZpY2VfcmVtb3ZlLAogCS5zdXNwZW5kID0gcG5wX2J1c19zdXNwZW5kLAogCS5yZXN1bWUgID0gcG5wX2J1c19yZXN1bWUsCisJLmRldl9hdHRycyA9IHBucF9pbnRlcmZhY2VfYXR0cnMsCiB9OwogCiBpbnQgcG5wX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcG5wX2RyaXZlciAqZHJ2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3BucC9pbnRlcmZhY2UuYwppbmRleCBhODc2ZWNmLi40NzhhNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3BucC9pbnRlcmZhY2UuYwpAQCAtMjQzLDggKzI0Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKG9wdGlvbnMsIFNfSVJVR08sIHBucF9zaG93X29wdGlvbnMsIE5VTEwpOwotCiBzdGF0aWMgc3NpemVfdCBwbnBfc2hvd19jdXJyZW50X3Jlc291cmNlcyhzdHJ1Y3QgZGV2aWNlICpkbWRldiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICBjaGFyICpidWYpCkBAIC00MjAsOSArNDE4LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXNvdXJjZXMsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBwbnBfc2hvd19jdXJyZW50X3Jlc291cmNlcywgcG5wX3NldF9jdXJyZW50X3Jlc291cmNlcyk7Ci0KIHN0YXRpYyBzc2l6ZV90IHBucF9zaG93X2N1cnJlbnRfaWRzKHN0cnVjdCBkZXZpY2UgKmRtZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNDM3LDI3ICs0MzIsMTEgQEAKIAlyZXR1cm4gKHN0ciAtIGJ1Zik7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihpZCwgU19JUlVHTywgcG5wX3Nob3dfY3VycmVudF9pZHMsIE5VTEwpOwotCi1pbnQgcG5wX2ludGVyZmFjZV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCi17Ci0JaW50IHJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX29wdGlvbnMpOwotCi0JaWYgKHJjKQotCQlnb3RvIGVycjsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9yZXNvdXJjZXMpOwotCWlmIChyYykKLQkJZ290byBlcnJfb3B0OwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lkKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyX3JlczsKLQotCXJldHVybiAwOwotCi1lcnJfcmVzOgotCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9yZXNvdXJjZXMpOwotZXJyX29wdDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfb3B0aW9ucyk7Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQorc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcG5wX2ludGVyZmFjZV9hdHRyc1tdID0geworCV9fQVRUUihyZXNvdXJjZXMsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBwbnBfc2hvd19jdXJyZW50X3Jlc291cmNlcywKKwkJICAgcG5wX3NldF9jdXJyZW50X3Jlc291cmNlcyksCisJX19BVFRSKG9wdGlvbnMsIFNfSVJVR08sIHBucF9zaG93X29wdGlvbnMsIE5VTEwpLAorCV9fQVRUUihpZCwgU19JUlVHTywgcG5wX3Nob3dfY3VycmVudF9pZHMsIE5VTEwpLAorCV9fQVRUUl9OVUxMLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCmluZGV4IDEwMWE4MzUuLjQ2NDU1ZmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJCXByaW50ayhLRVJOX0lORk8gImlzYXBucDogSVNBIFBsdWcgJiBQbGF5IHN1cHBvcnQgZGlzYWJsZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0jaWZkZWYgQ09ORklHX1BQQ19NRVJHRQorI2lmZGVmIENPTkZJR19QUEMKIAlpZiAoY2hlY2tfbGVnYWN5X2lvcG9ydChfUElEWFIpIHx8IGNoZWNrX2xlZ2FjeV9pb3BvcnQoX1BOUFdSUCkpCiAJCXJldHVybiAtRUlOVkFMOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IGMxYjllYTMuLjUzNTYxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3Vic3lzX2luaXRjYWxsKHBucGFjcGlfaW5pdCk7Citmc19pbml0Y2FsbChwbnBhY3BpX2luaXQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBwbnBhY3BpX3NldHVwKGNoYXIgKnN0cikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggMTlhNGJlMS4uMmJmZTEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTUxOSw3ICs1MTksNyBAQAogewogCWludCByZXQ7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQogCWlmIChjaGVja19sZWdhY3lfaW9wb3J0KFBOUEJJT1NfQkFTRSkpCiAJCXJldHVybiAtRU5PREVWOwogI2VuZGlmCkBAIC01NzEsMTMgKzU3MSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdWJzeXNfaW5pdGNhbGwocG5wYmlvc19pbml0KTsKK2ZzX2luaXRjYWxsKHBucGJpb3NfaW5pdCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHBucGJpb3NfdGhyZWFkX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQogCWlmIChjaGVja19sZWdhY3lfaW9wb3J0KFBOUEJJT1NfQkFTRSkpCiAJCXJldHVybiAwOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9xdWlya3MuYyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCmluZGV4IDBiZGY5YjguLmMxNDRiZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKIAkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgdHlwZTsKKwkJCXVuc2lnbmVkIGxvbmcgdHlwZTsKIAogCQkJdHlwZSA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmCiAJCQkJCShJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pOwpAQCAtMzM4LDggKzMzOCw3IEBACiAJCWlmICghY29tcGFyZV9wbnBfaWQoZGV2LT5pZCwgZi0+aWQpKQogCQkJY29udGludWU7CiAjaWZkZWYgREVCVUcKLQkJZGV2X2RiZygmZGV2LT5kZXYsICIlczogY2FsbGluZyAiLCBmLT5pZCk7Ci0JCXByaW50X2ZuX2Rlc2NyaXB0b3Jfc3ltYm9sKCIlc1xuIiwgZi0+cXVpcmtfZnVuY3Rpb24pOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzOiBjYWxsaW5nICVwRlxuIiwgZi0+aWQsIGYtPnF1aXJrX2Z1bmN0aW9uKTsKICNlbmRpZgogCQlmLT5xdWlya19mdW5jdGlvbihkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMgYi9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCmluZGV4IDRjZmUzYTEuLmRiYWUyM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwpAQCAtNDY3LDE0ICs0NjcsMTQgQEAKICNlbmRpZgogfQogCi1pbnQgcG5wX3Jlc291cmNlX3R5cGUoc3RydWN0IHJlc291cmNlICpyZXMpCit1bnNpZ25lZCBsb25nIHBucF9yZXNvdXJjZV90eXBlKHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCXJldHVybiByZXMtPmZsYWdzICYgKElPUkVTT1VSQ0VfSU8gIHwgSU9SRVNPVVJDRV9NRU0gfAogCQkJICAgICBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRE1BKTsKIH0KIAogc3RydWN0IHJlc291cmNlICpwbnBfZ2V0X3Jlc291cmNlKHN0cnVjdCBwbnBfZGV2ICpkZXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IG51bSkKKwkJCQkgIHVuc2lnbmVkIGxvbmcgdHlwZSwgdW5zaWduZWQgaW50IG51bSkKIHsKIAlzdHJ1Y3QgcG5wX3Jlc291cmNlICpwbnBfcmVzOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IDljZTU1ODUuLjYzYmI1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTU2LDEwICs1NiwxMCBAQAogCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IG9uIHRoZSBTaGFycCBaYXVydXMKIAkgIFNMLTYwMDAgKHRvc2EpIG1vZGVscy4KIAotY29uZmlnIEJBVFRFUllfUEFMTVRYCi0JdHJpc3RhdGUgIlBhbG0gVHxYIGJhdHRlcnkiCi0JZGVwZW5kcyBvbiBNQUNIX1BBTE1UWAorY29uZmlnIEJBVFRFUllfV005N1hYCisJYm9vbCAiV005N3h4IGdlbmVyaWMgYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9XTTk3WFg9eQogCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBpbiBQYWxtIFR8WC4KKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IG1lYXN1cmVkIGJ5IFdNOTd4eCBhdXggcG9ydC4KIAogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IDQ3MDZiZjguLjRlMjAwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMjEsNCArMjEsNCBAQAogb2JqLSQoQ09ORklHX0JBVFRFUllfUE1VKQkrPSBwbXVfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9PTFBDKQkrPSBvbHBjX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfVE9TQSkJKz0gdG9zYV9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1BBTE1UWCkJKz0gcGFsbXR4X2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfV005N1hYKQkrPSB3bTk3eHhfYmF0dGVyeS5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMKaW5kZXggMzI1NzBhZi4uNWZiY2EyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL29scGNfYmF0dGVyeS5jCkBAIC0yMDUsOSArMjA1LDkgQEAKIAkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKIAlpbnQgcmV0ID0gMDsKLQlpbnQxNl90IGVjX3dvcmQ7CisJX19iZTE2IGVjX3dvcmQ7CiAJdWludDhfdCBlY19ieXRlOwotCXVpbnQ2NF90IHNlcl9idWY7CisJX19iZTY0IHNlcl9idWY7CiAKIAlyZXQgPSBvbHBjX2VjX2NtZChFQ19CQVRfU1RBVFVTLCBOVUxMLCAwLCAmZWNfYnl0ZSwgMSk7CiAJaWYgKHJldCkKQEAgLTI1NywxNiArMjU3LDE0IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCWVjX3dvcmQgPSBiZTE2X3RvX2NwdShlY193b3JkKTsKLQkJdmFsLT5pbnR2YWwgPSBlY193b3JkICogOTc2MEwgLyAzMjsKKwkJdmFsLT5pbnR2YWwgPSAoaW50KWJlMTZfdG9fY3B1KGVjX3dvcmQpICogOTc2MEwgLyAzMjsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKIAkJcmV0ID0gb2xwY19lY19jbWQoRUNfQkFUX0NVUlJFTlQsIE5VTEwsIDAsICh2b2lkICopJmVjX3dvcmQsIDIpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQllY193b3JkID0gYmUxNl90b19jcHUoZWNfd29yZCk7Ci0JCXZhbC0+aW50dmFsID0gZWNfd29yZCAqIDE1NjI1TCAvIDEyMDsKKwkJdmFsLT5pbnR2YWwgPSAoaW50KWJlMTZfdG9fY3B1KGVjX3dvcmQpICogMTU2MjVMIC8gMTIwOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgogCQlyZXQgPSBvbHBjX2VjX2NtZChFQ19CQVRfU09DLCBOVUxMLCAwLCAmZWNfYnl0ZSwgMSk7CkBAIC0yNzgsMjQgKzI3NiwyMiBAQAogCQlyZXQgPSBvbHBjX2VjX2NtZChFQ19CQVRfVEVNUCwgTlVMTCwgMCwgKHZvaWQgKikmZWNfd29yZCwgMik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQllY193b3JkID0gYmUxNl90b19jcHUoZWNfd29yZCk7Ci0JCXZhbC0+aW50dmFsID0gZWNfd29yZCAqIDEwMCAvIDI1NjsKKworCQl2YWwtPmludHZhbCA9IChpbnQpYmUxNl90b19jcHUoZWNfd29yZCkgKiAxMDAgLyAyNTY7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UOgogCQlyZXQgPSBvbHBjX2VjX2NtZChFQ19BTUJfVEVNUCwgTlVMTCwgMCwgKHZvaWQgKikmZWNfd29yZCwgMik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCWVjX3dvcmQgPSBiZTE2X3RvX2NwdShlY193b3JkKTsKLQkJdmFsLT5pbnR2YWwgPSBlY193b3JkICogMTAwIC8gMjU2OworCQl2YWwtPmludHZhbCA9IChpbnQpYmUxNl90b19jcHUoZWNfd29yZCkgKiAxMDAgLyAyNTY7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVI6CiAJCXJldCA9IG9scGNfZWNfY21kKEVDX0JBVF9BQ1IsIE5VTEwsIDAsICh2b2lkICopJmVjX3dvcmQsIDIpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQllY193b3JkID0gYmUxNl90b19jcHUoZWNfd29yZCk7Ci0JCXZhbC0+aW50dmFsID0gZWNfd29yZCAqIDYyNTAgLyAxNTsKKwkJdmFsLT5pbnR2YWwgPSAoaW50KWJlMTZfdG9fY3B1KGVjX3dvcmQpICogNjI1MCAvIDE1OwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVI6CiAJCXJldCA9IG9scGNfZWNfY21kKEVDX0JBVF9TRVJJQUwsIE5VTEwsIDAsICh2b2lkICopJnNlcl9idWYsIDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wYWxtdHhfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9wYWxtdHhfYmF0dGVyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDM1YmZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcG93ZXIvcGFsbXR4X2JhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogbGludXgvZHJpdmVycy9wb3dlci9wYWxtdHhfYmF0dGVyeS5jCi0gKgotICogQmF0dGVyeSBtZWFzdXJlbWVudCBjb2RlIGZvciBQYWxtIFR8WCBIYW5kaGVsZCBjb21wdXRlcgotICoKLSAqIGJhc2VkIG9uIHRvc2FfYmF0dGVyeS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL3BhbG10eC5oPgotCi1zdGF0aWMgREVGSU5FX01VVEVYKGJhdF9sb2NrKTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmF0X3dvcms7Ci1zdHJ1Y3QgbXV0ZXggd29ya19sb2NrOwotaW50IGJhdF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdHhfcmVhZF9iYXQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQotewotCXJldHVybiB3bTk3eHhfcmVhZF9hdXhfYWRjKGJhdF9wcy0+ZGV2LT5wYXJlbnQtPmRyaXZlcl9kYXRhLAotCQkJCSAgICBXTTk3WFhfQVVYX0lEMykgKiAxMDAwIC8gNDE0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtdHhfcmVhZF90ZW1wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKLXsKLQlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhiYXRfcHMtPmRldi0+cGFyZW50LT5kcml2ZXJfZGF0YSwKLQkJCQkgICAgV005N1hYX0FVWF9JRDIpOwotfQotCi1zdGF0aWMgaW50IHBhbG10eF9iYXRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcywKLQkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQl2YWwtPmludHZhbCA9IGJhdF9zdGF0dXM7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKLQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSVBPOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgotCQl2YWwtPmludHZhbCA9IHBhbG10eF9yZWFkX2JhdChiYXRfcHMpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IFBBTE1UWF9CQVRfTUFYX1ZPTFRBR0U7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgotCQl2YWwtPmludHZhbCA9IFBBTE1UWF9CQVRfTUlOX1ZPTFRBR0U7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQkJdmFsLT5pbnR2YWwgPSBwYWxtdHhfcmVhZF90ZW1wKGJhdF9wcyk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJdmFsLT5pbnR2YWwgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10eF9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCi17Ci0Jc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotfQotCi1zdGF0aWMgY2hhciAqc3RhdHVzX3RleHRbXSA9IHsKLQlbUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOXSA9CQkiVW5rbm93biIsCi0JW1BPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkddID0JIkNoYXJnaW5nIiwKLQlbUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lOR10gPQkiRGlzY2hhcmdpbmciLAotfTsKLQotc3RhdGljIHZvaWQgcGFsbXR4X2JhdF91cGRhdGUoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQotewotCWludCBvbGRfc3RhdHVzID0gYmF0X3N0YXR1czsKLQotCW11dGV4X2xvY2soJndvcmtfbG9jayk7Ci0KLQliYXRfc3RhdHVzID0gZ3Bpb19nZXRfdmFsdWUoR1BJT19OUl9QQUxNVFhfUE9XRVJfREVURUNUKSA/Ci0JCQkJICAgIFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcgOgotCQkJCSAgICBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCi0JaWYgKG9sZF9zdGF0dXMgIT0gYmF0X3N0YXR1cykgewotCQlwcl9kZWJ1ZygiJXMgJXMgLT4gJXNcbiIsIGJhdF9wcy0+bmFtZSwKLQkJCQlzdGF0dXNfdGV4dFtvbGRfc3RhdHVzXSwKLQkJCQlzdGF0dXNfdGV4dFtiYXRfc3RhdHVzXSk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdF9wcyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ3b3JrX2xvY2spOwotfQotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcGFsbXR4X2JhdF9tYWluX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVgsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCi0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLX07Ci0KLXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0X3BzID0gewotCS5uYW1lCQkJPSAibWFpbi1iYXR0ZXJ5IiwKLQkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkucHJvcGVydGllcwkJPSBwYWxtdHhfYmF0X21haW5fcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUocGFsbXR4X2JhdF9tYWluX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IHBhbG10eF9iYXRfZ2V0X3Byb3BlcnR5LAotCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gcGFsbXR4X2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAotCS51c2VfZm9yX2FwbQkJPSAxLAotfTsKLQotc3RhdGljIHZvaWQgcGFsbXR4X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlwYWxtdHhfYmF0X3VwZGF0ZSgmYmF0X3BzKTsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBwYWxtdHhfYmF0X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwYWxtdHhfYmF0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgcGFsbXR4X2JhdF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgcGFsbXR4X2JhdF9yZXN1bWUgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHBhbG10eF9iYXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKCFtYWNoaW5lX2lzX3BhbG10eCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW11dGV4X2luaXQoJndvcmtfbG9jayk7Ci0KLQlJTklUX1dPUksoJmJhdF93b3JrLCBwYWxtdHhfYmF0X3dvcmspOwotCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJmJhdF9wcyk7Ci0JaWYgKCFyZXQpCi0JCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHBhbG10eF9iYXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmF0X3BzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGFsbXR4X2JhdF9kcml2ZXIgPSB7Ci0JLmRyaXZlci5uYW1lCT0gIndtOTd4eC1iYXR0ZXJ5IiwKLQkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLnByb2JlCQk9IHBhbG10eF9iYXRfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwYWxtdHhfYmF0X3JlbW92ZSksCi0JLnN1c3BlbmQJPSBwYWxtdHhfYmF0X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBwYWxtdHhfYmF0X3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhbG10eF9iYXRfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG10eF9iYXRfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBhbG10eF9iYXRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwYWxtdHhfYmF0X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHBhbG10eF9iYXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChwYWxtdHhfYmF0X2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWxtIFR8WCBiYXR0ZXJ5IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jCmluZGV4IGNiMWNjYjQuLjMwMDc2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2NvcmUuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMKQEAgLTkxLDggKzkxLDggQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JcHN5LT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEocG93ZXJfc3VwcGx5X2NsYXNzLCBwYXJlbnQsIDAsCi0JCQkJCSBwc3ksICIlcyIsIHBzeS0+bmFtZSk7CisJcHN5LT5kZXYgPSBkZXZpY2VfY3JlYXRlKHBvd2VyX3N1cHBseV9jbGFzcywgcGFyZW50LCAwLCBwc3ksCisJCQkJICIlcyIsIHBzeS0+bmFtZSk7CiAJaWYgKElTX0VSUihwc3ktPmRldikpIHsKIAkJcmMgPSBQVFJfRVJSKHBzeS0+ZGV2KTsKIAkJZ290byBkZXZfY3JlYXRlX2ZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmRlOTIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogbGludXgvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCisgKgorICogQmF0dGVyeSBtZWFzdXJlbWVudCBjb2RlIGZvciBXTTk3eHgKKyAqCisgKiBiYXNlZCBvbiB0b3NhX2JhdHRlcnkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4X2JhdHQuaD4KKworc3RhdGljIERFRklORV9NVVRFWChiYXRfbG9jayk7CitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGJhdF93b3JrOworc3RydWN0IG11dGV4IHdvcmtfbG9jazsKK3N0YXRpYyBpbnQgYmF0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKK3N0YXRpYyBzdHJ1Y3Qgd205N3h4X2JhdHRfaW5mbyAqcGRhdGE7CitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKnByb3A7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdtOTd4eF9yZWFkX2JhdChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCit7CisJcmV0dXJuIHdtOTd4eF9yZWFkX2F1eF9hZGMoYmF0X3BzLT5kZXYtPnBhcmVudC0+ZHJpdmVyX2RhdGEsCisJCQkJCXBkYXRhLT5iYXR0X2F1eCkgKiBwZGF0YS0+YmF0dF9tdWx0IC8KKwkJCQkJcGRhdGEtPmJhdHRfZGl2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF90ZW1wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKK3sKKwlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhiYXRfcHMtPmRldi0+cGFyZW50LT5kcml2ZXJfZGF0YSwKKwkJCQkJcGRhdGEtPnRlbXBfYXV4KSAqIHBkYXRhLT50ZW1wX211bHQgLworCQkJCQlwZGF0YS0+dGVtcF9kaXY7Cit9CisKK3N0YXRpYyBpbnQgd205N3h4X2JhdF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzLAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0gYmF0X3N0YXR1czsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IHBkYXRhLT5iYXR0X3RlY2g7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gd205N3h4X3JlYWRfYmF0KGJhdF9wcyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCWlmIChwZGF0YS0+dGVtcF9hdXggPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gd205N3h4X3JlYWRfdGVtcChiYXRfcHMpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKKwkJaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSBwZGF0YS0+bWF4X3ZvbHRhZ2U7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOgorCQlpZiAocGRhdGEtPm1pbl92b2x0YWdlID49IDApCisJCQl2YWwtPmludHZhbCA9IHBkYXRhLT5taW5fdm9sdGFnZTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTd4eF9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCit7CisJc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOworfQorCitzdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3VwZGF0ZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCit7CisJaW50IG9sZF9zdGF0dXMgPSBiYXRfc3RhdHVzOworCisJbXV0ZXhfbG9jaygmd29ya19sb2NrKTsKKworCWJhdF9zdGF0dXMgPSAocGRhdGEtPmNoYXJnZV9ncGlvID49IDApID8KKwkJCShncGlvX2dldF92YWx1ZShwZGF0YS0+Y2hhcmdlX2dwaW8pID8KKwkJCVBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcgOgorCQkJUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykgOgorCQkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCisJaWYgKG9sZF9zdGF0dXMgIT0gYmF0X3N0YXR1cykgeworCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBiYXRfcHMtPm5hbWUsIG9sZF9zdGF0dXMsCisJCQkJCWJhdF9zdGF0dXMpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXRfcHMpOworCX0KKworCW11dGV4X3VubG9jaygmd29ya19sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0X3BzID0geworCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5nZXRfcHJvcGVydHkJCT0gd205N3h4X2JhdF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB3bTk3eHhfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCisJLnVzZV9mb3JfYXBtCQk9IDEsCit9OworCitzdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXdtOTd4eF9iYXRfdXBkYXRlKCZiYXRfcHMpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHdtOTd4eF9iYXRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtOTd4eF9iYXRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB3bTk3eHhfYmF0X3N1c3BlbmQgTlVMTAorI2RlZmluZSB3bTk3eHhfYmF0X3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgd205N3h4X2JhdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IHByb3BzID0gMTsJLyogUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCAqLworCWludCBpID0gMDsKKworCWlmIChkZXYtPmlkICE9IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2luaXQoJndvcmtfbG9jayk7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiUGxlYXNlIHVzZSB3bTk3eHhfYmF0X3NldF9wZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwZGF0YS0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5jaGFyZ2VfZ3BpbywgIkJBVFQgQ0hSRyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjI7CisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUyAqLworCX0KKworCWlmIChwZGF0YS0+YmF0dF90ZWNoID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1kgKi8KKwlpZiAocGRhdGEtPnRlbXBfYXV4ID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVAgKi8KKwlpZiAocGRhdGEtPmJhdHRfYXV4ID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XICovCisJaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCAqLworCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4gKi8KKworCXByb3AgPSBremFsbG9jKHByb3BzICogc2l6ZW9mKCpwcm9wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIGVycjI7CisKKwlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOworCWlmIChwZGF0YS0+Y2hhcmdlX2dwaW8gPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOworCWlmIChwZGF0YS0+YmF0dF90ZWNoID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k7CisJaWYgKHBkYXRhLT50ZW1wX2F1eCA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOworCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c7CisJaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDsKKwlpZiAocGRhdGEtPm1pbl92b2x0YWdlID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOworCisJSU5JVF9XT1JLKCZiYXRfd29yaywgd205N3h4X2JhdF93b3JrKTsKKworCWlmICghcGRhdGEtPmJhdHRfbmFtZSkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQbGVhc2UgY29uc2lkZXIgc2V0dGluZyBwcm9wZXIgYmF0dGVyeSAiCisJCQkJIm5hbWUgaW4gcGxhdGZvcm0gZGVmaW5pdGlvbiBmaWxlLCBmYWxsaW5nICIKKwkJCQkiYmFjayB0byBuYW1lIFwid205N3h4LWJhdHRcIlxuIik7CisJCWJhdF9wcy5uYW1lID0gIndtOTd4eC1iYXR0IjsKKwl9IGVsc2UKKwkJYmF0X3BzLm5hbWUgPSBwZGF0YS0+YmF0dF9uYW1lOworCisJYmF0X3BzLnByb3BlcnRpZXMgPSBwcm9wOworCWJhdF9wcy5udW1fcHJvcGVydGllcyA9IHByb3BzOworCisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJmJhdF9wcyk7CisJaWYgKCFyZXQpCisJCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKKwllbHNlCisJCWdvdG8gZXJyMzsKKworCXJldHVybiAwOworZXJyMzoKKwlrZnJlZShwcm9wKTsKK2VycjI6CisJZ3Bpb19mcmVlKHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd205N3h4X2JhdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWlmIChwZGF0YSAmJiBwZGF0YS0+Y2hhcmdlX2dwaW8gJiYgcGRhdGEtPmNoYXJnZV9ncGlvID49IDApCisJCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhdF9wcyk7CisJa2ZyZWUocHJvcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtOTd4eF9iYXRfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gIndtOTd4eC1iYXR0ZXJ5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gd205N3h4X2JhdF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtOTd4eF9iYXRfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHdtOTd4eF9iYXRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHdtOTd4eF9iYXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd205N3h4X2JhdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd205N3h4X2JhdF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd205N3h4X2JhdF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtOTd4eF9iYXRfZHJpdmVyKTsKK30KKwordm9pZCBfX2luaXQgd205N3h4X2JhdF9zZXRfcGRhdGEoc3RydWN0IHdtOTd4eF9iYXR0X2luZm8gKmRhdGEpCit7CisJcGRhdGEgPSBkYXRhOworfQorRVhQT1JUX1NZTUJPTF9HUEwod205N3h4X2JhdF9zZXRfcGRhdGEpOworCittb2R1bGVfaW5pdCh3bTk3eHhfYmF0X2luaXQpOworbW9kdWxlX2V4aXQod205N3h4X2JhdF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV005N3h4IGJhdHRlcnkgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCBhNjU2MTI4Li40ZGFkYTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTU2LDQgKzU2LDI4IEBACiAJICBjaGFyZ2luZyBzZWxlY3QgYmV0d2VlbiAxMDAgbUEgYW5kIDUwMCBtQSBjaGFyZ2luZyBjdXJyZW50CiAJICBsaW1pdC4KIAorY29uZmlnIFJFR1VMQVRPUl9XTTgzNTAKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uY2lzIFdNODM1MCBBdWRpb1BsdXMgUE1JQyIKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKwlzZWxlY3QgUkVHVUxBVE9SCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHZvbHRhZ2UgYW5kIGN1cnJlbnQgcmVndWxhdG9ycworICAgICAgICAgIG9mIHRoZSBXTTgzNTAgQXVkaW9QbHVzIFBNSUMuCisKK2NvbmZpZyBSRUdVTEFUT1JfV004NDAwCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmNpcyBXTTg0MDAgQXVkaW9QbHVzIFBNSUMiCisJZGVwZW5kcyBvbiBNRkRfV004NDAwCisJc2VsZWN0IFJFR1VMQVRPUgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSB2b2x0YWdlIHJlZ3VsYXRvcnMgb2YgdGhlCisJICBXTTg0MDAgQXVkaW9QbHVzIFBNSUMuCisKK2NvbmZpZyBSRUdVTEFUT1JfREE5MDNYCisJdHJpc3RhdGUgIlN1cHBvcnQgcmVndWxhdG9ycyBvbiBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzAvREE5MDM0IFBNSUMiCisJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWAorCXNlbGVjdCBSRUdVTEFUT1IKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIEJVQ0tzIGFuZCBMRE9zIHJlZ3VsYXRvcnMgZm91bmQgb24KKwkgIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzMC9EQTkwMzQgUE1JQy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCBhYzJjNjRlLi4yNTRkNDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtOCw1ICs4LDggQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUikgKz0gdmlydHVhbC5vCiAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMikgKz0gYnEyNDAyMi5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1dNODM1MCkgKz0gd204MzUwLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1dNODQwMCkgKz0gd204NDAwLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX0RBOTAzWCkJKz0gZGE5MDN4Lm8KIAogY2NmbGFncy0kKENPTkZJR19SRUdVTEFUT1JfREVCVUcpICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYwppbmRleCAyNjM2OTlkLi4zNjY1NjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9icTI0MDIyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYnEyNDAyMi5jCkBAIC0xOCwxMyArMTgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvYnEyNDAyMi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KIAorCiBzdGF0aWMgaW50IGJxMjQwMjJfc2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJCWludCBtaW5fdUEsIGludCBtYXhfdUEpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IGJxMjQwMjJfbWFjaF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBicTI0MDIyX21hY2hfaW5mbyAqcGRhdGEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAic2V0dGluZyBjdXJyZW50IGxpbWl0IHRvICVzIG1BXG4iLAorCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAic2V0dGluZyBjdXJyZW50IGxpbWl0IHRvICVzIG1BXG4iLAogCQltYXhfdUEgPj0gNTAwMDAwID8gIjUwMCIgOiAiMTAwIik7CiAKIAkvKiBSRVZJU0lUOiBtYXliZSByZXR1cm4gZXJyb3IgaWYgbWluX3VBICE9IDAgPyAqLwpAQCAtMzQsMTggKzM0LDE2IEBACiAKIHN0YXRpYyBpbnQgYnEyNDAyMl9nZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlzdHJ1Y3QgYnEyNDAyMl9tYWNoX2luZm8gKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGJxMjQwMjJfbWFjaF9pbmZvICpwZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAKIAlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUocGRhdGEtPmdwaW9faXNldDIpID8gNTAwMDAwIDogMTAwMDAwOwogfQogCiBzdGF0aWMgaW50IGJxMjQwMjJfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCXN0cnVjdCBicTI0MDIyX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYnEyNDAyMl9tYWNoX2luZm8gKnBkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAotCWRldl9kYmcoJnBkZXYtPmRldiwgImVuYWJsaW5nIGNoYXJnZXJcbiIpOworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiZW5hYmxpbmcgY2hhcmdlclxuIik7CiAKIAlncGlvX3NldF92YWx1ZShwZGF0YS0+Z3Bpb19uY2UsIDApOwogCXJldHVybiAwOwpAQCAtNTMsMTAgKzUxLDkgQEAKIAogc3RhdGljIGludCBicTI0MDIyX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0Jc3RydWN0IGJxMjQwMjJfbWFjaF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBicTI0MDIyX21hY2hfaW5mbyAqcGRhdGEgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiZGlzYWJsaW5nIGNoYXJnZXJcbiIpOworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiZGlzYWJsaW5nIGNoYXJnZXJcbiIpOwogCiAJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmdwaW9fbmNlLCAxKTsKIAlyZXR1cm4gMDsKQEAgLTEwOCw3ICsxMDUsNyBAQAogCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+Z3Bpb19pc2V0MiwgMCk7CiAJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5ncGlvX25jZSwgMSk7CiAKLQlicTI0MDIyID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZicTI0MDIyX2Rlc2MsIHBkZXYpOworCWJxMjQwMjIgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmJxMjQwMjJfZGVzYywgJnBkZXYtPmRldiwgcGRhdGEpOwogCWlmIChJU19FUlIoYnEyNDAyMikpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGRuJ3QgcmVnaXN0ZXIgcmVndWxhdG9yXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihicTI0MDIyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCA5Yzc5ODYyLi4wMmE3NzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0yLDggKzIsOSBAQAogICogY29yZS5jICAtLSAgVm9sdGFnZS9DdXJyZW50IFJlZ3VsYXRvciBmcmFtZXdvcmsuCiAgKgogICogQ29weXJpZ2h0IDIwMDcsIDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIENvcHlyaWdodCAyMDA4IFNsaW1Mb2dpYyBMdGQuCiAgKgotICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtNjQsMTQgKzY1LDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWNvbnN0IGNoYXIgKnN1cHBseTsKLQljb25zdCBjaGFyICpyZWd1bGF0b3I7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcjsKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnRvX3JkZXYoc3RydWN0IGRldmljZSAqZCkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCByZWd1bGF0b3JfZGV2LCBkZXYpOwotfQotCiAvKgogICogc3RydWN0IHJlZ3VsYXRvcgogICoKQEAgLTIyNyw3ICsyMjMsNyBAQAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzc2l6ZV90IHJldDsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKQEAgLTI0MCwxNSArMjM2LDMxIEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIF9yZWd1bGF0b3JfZ2V0X2N1cnJlbnRfbGltaXQocmRldikpOwogfQogCitzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlpZiAocmRldi0+Y29uc3RyYWludHMtPm5hbWUpCisJCW5hbWUgPSByZGV2LT5jb25zdHJhaW50cy0+bmFtZTsKKwllbHNlIGlmIChyZGV2LT5kZXNjLT5uYW1lKQorCQluYW1lID0gcmRldi0+ZGVzYy0+bmFtZTsKKwllbHNlCisJCW5hbWUgPSAiIjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuYW1lKTsKK30KKwogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX29wbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBtb2RlID0gX3JlZ3VsYXRvcl9nZXRfbW9kZShyZGV2KTsKIAogCXN3aXRjaCAobW9kZSkgewpAQCAtMjY3LDcgKzI3OSw3IEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBzdGF0ZSA9IF9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KTsKIAogCWlmIChzdGF0ZSA+IDApCkBAIC0yODEsNyArMjkzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9taW5fdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmICghcmRldi0+Y29uc3RyYWludHMpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbnN0cmFpbnQgbm90IGRlZmluZWRcbiIpOwpAQCAtMjkyLDcgKzMwNCw3IEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbWF4X3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJjb25zdHJhaW50IG5vdCBkZWZpbmVkXG4iKTsKQEAgLTMwMyw3ICszMTUsNyBAQAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21pbl91Vl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiY29uc3RyYWludCBub3QgZGVmaW5lZFxuIik7CkBAIC0zMTQsNyArMzI2LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9tYXhfdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmICghcmRldi0+Y29uc3RyYWludHMpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbnN0cmFpbnQgbm90IGRlZmluZWRcbiIpOwpAQCAtMzI1LDcgKzMzNyw3IEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfdG90YWxfdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKIAlpbnQgdUEgPSAwOwogCkBAIC0zMzksMTQgKzM1MSwxNCBAQAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX251bV91c2Vyc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPnVzZV9jb3VudCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl90eXBlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJc3dpdGNoIChyZGV2LT5kZXNjLT50eXBlKSB7CiAJY2FzZSBSRUdVTEFUT1JfVk9MVEFHRToKQEAgLTM2MCw3ICszNzIsNyBAQAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfbWVtX3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmICghcmRldi0+Y29uc3RyYWludHMpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKQEAgLTM3MCw3ICszODIsNyBAQAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfZGlza191Vl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7CkBAIC0zODAsNyArMzkyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwpAQCAtNDA2LDcgKzQxOCw3IEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7CkBAIC00MTcsNyArNDI5LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7CkBAIC00MjgsNyArNDQwLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7CkBAIC00MzksNyArNDUxLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX21lbV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gdG9fcmRldihkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7CkBAIC00NTMsNyArNDY1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHRvX3JkZXYoZGV2KTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwpAQCAtNDY3LDcgKzQ3OSw3IEBACiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmICghcmRldi0+Y29uc3RyYWludHMpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKQEAgLTQ3Nyw3ICs0ODksOSBAQAogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiZGlzYWJsZWRcbiIpOwogfQorCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcmVndWxhdG9yX2Rldl9hdHRyc1tdID0geworCV9fQVRUUihuYW1lLCAwNDQ0LCByZWd1bGF0b3JfbmFtZV9zaG93LCBOVUxMKSwKIAlfX0FUVFIobWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX3VWX3Nob3csIE5VTEwpLAogCV9fQVRUUihtaWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl91QV9zaG93LCBOVUxMKSwKIAlfX0FUVFIob3Btb2RlLCAwNDQ0LCByZWd1bGF0b3Jfb3Btb2RlX3Nob3csIE5VTEwpLApAQCAtNTEyLDcgKzUyNiw3IEBACiAKIHN0YXRpYyB2b2lkIHJlZ3VsYXRvcl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSB0b19yZGV2KGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlrZnJlZShyZGV2KTsKIH0KIApAQCAtNTY5LDggKzU4MywxMSBAQAogCiAJLyogZW5hYmxlICYgZGlzYWJsZSBhcmUgbWFuZGF0b3J5IGZvciBzdXNwZW5kIGNvbnRyb2wgKi8KIAlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+c2V0X3N1c3BlbmRfZW5hYmxlIHx8Ci0JCSFyZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX2Rpc2FibGUpCisJCSFyZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX2Rpc2FibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gd2F5IHRvIHNldCBzdXNwZW5kIHN0YXRlXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlpZiAocnN0YXRlLT5lbmFibGVkKQogCQlyZXQgPSByZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX2VuYWJsZShyZGV2KTsKQEAgLTY1Niw2ICs2NzMsMTU1IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAicmVndWxhdG9yOiAlczogJXNcbiIsIHJkZXYtPmRlc2MtPm5hbWUsIGJ1Zik7CiB9CiAKKy8qKgorICogc2V0X21hY2hpbmVfY29uc3RyYWludHMgLSBzZXRzIHJlZ3VsYXRvciBjb25zdHJhaW50cworICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICoKKyAqIEFsbG93cyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIGRlZmluZSBhbmQgY29uc3RyYWluCisgKiByZWd1bGF0b3IgY2lyY3VpdHMgZS5nLiB2YWxpZCB2b2x0YWdlL2N1cnJlbnQgcmFuZ2VzLCBldGMuICBOT1RFOgorICogQ29uc3RyYWludHMgKm11c3QqIGJlIHNldCBieSBwbGF0Zm9ybSBjb2RlIGluIG9yZGVyIGZvciBzb21lCisgKiByZWd1bGF0b3Igb3BlcmF0aW9ucyB0byBwcm9jZWVkIGkuZS4gc2V0X3ZvbHRhZ2UsIHNldF9jdXJyZW50X2xpbWl0LAorICogc2V0X21vZGUuCisgKi8KK3N0YXRpYyBpbnQgc2V0X21hY2hpbmVfY29uc3RyYWludHMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQoreworCWludCByZXQgPSAwOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHJlZ3VsYXRvcl9vcHMgKm9wcyA9IHJkZXYtPmRlc2MtPm9wczsKKworCWlmIChjb25zdHJhaW50cy0+bmFtZSkKKwkJbmFtZSA9IGNvbnN0cmFpbnRzLT5uYW1lOworCWVsc2UgaWYgKHJkZXYtPmRlc2MtPm5hbWUpCisJCW5hbWUgPSByZGV2LT5kZXNjLT5uYW1lOworCWVsc2UKKwkJbmFtZSA9ICJyZWd1bGF0b3IiOworCisJcmRldi0+Y29uc3RyYWludHMgPSBjb25zdHJhaW50czsKKworCS8qIGRvIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGNvbnN0cmFpbnQgdm9sdGFnZSAqLworCWlmIChyZGV2LT5jb25zdHJhaW50cy0+YXBwbHlfdVYgJiYKKwkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViA9PSByZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWICYmCisJCW9wcy0+c2V0X3ZvbHRhZ2UpIHsKKwkJcmV0ID0gb3BzLT5zZXRfdm9sdGFnZShyZGV2LAorCQkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViwgcmRldi0+Y29uc3RyYWludHMtPm1heF91Vik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhcHBseSAlZHVWIGNvbnN0cmFpbnQgdG8gJXNcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLAorCQkJCSAgICAgICByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWLCBuYW1lKTsKKwkJCQlyZGV2LT5jb25zdHJhaW50cyA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJfQorCisJLyogYXJlIHdlIGVuYWJsZWQgYXQgYm9vdCB0aW1lIGJ5IGZpcm13YXJlIC8gYm9vdGxvYWRlciAqLworCWlmIChyZGV2LT5jb25zdHJhaW50cy0+Ym9vdF9vbikKKwkJcmRldi0+dXNlX2NvdW50ID0gMTsKKworCS8qIGRvIHdlIG5lZWQgdG8gc2V0dXAgb3VyIHN1c3BlbmQgc3RhdGUgKi8KKwlpZiAoY29uc3RyYWludHMtPmluaXRpYWxfc3RhdGUpIHsKKwkJcmV0ID0gc3VzcGVuZF9wcmVwYXJlKHJkZXYsIGNvbnN0cmFpbnRzLT5pbml0aWFsX3N0YXRlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBzZXQgc3VzcGVuZCBzdGF0ZSBmb3IgJXNcbiIsCisJCQkgICAgICAgX19mdW5jX18sIG5hbWUpOworCQkJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBpZiBhbHdheXNfb24gaXMgc2V0IHRoZW4gdHVybiB0aGUgcmVndWxhdG9yIG9uIGlmIGl0J3Mgbm90CisJICogYWxyZWFkeSBvbi4gKi8KKwlpZiAoY29uc3RyYWludHMtPmFsd2F5c19vbiAmJiBvcHMtPmVuYWJsZSAmJgorCSAgICAoKG9wcy0+aXNfZW5hYmxlZCAmJiAhb3BzLT5pc19lbmFibGVkKHJkZXYpKSB8fAorCSAgICAgKCFvcHMtPmlzX2VuYWJsZWQgJiYgIWNvbnN0cmFpbnRzLT5ib290X29uKSkpIHsKKwkJcmV0ID0gb3BzLT5lbmFibGUocmRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gZW5hYmxlICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBuYW1lKTsKKwkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcHJpbnRfY29uc3RyYWludHMocmRldik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzZXRfc3VwcGx5IC0gc2V0IHJlZ3VsYXRvciBzdXBwbHkgcmVndWxhdG9yCisgKiBAcmVndWxhdG9yOiByZWd1bGF0b3IgbmFtZQorICogQHN1cHBseTogc3VwcGx5IHJlZ3VsYXRvciBuYW1lCisgKgorICogQ2FsbGVkIGJ5IHBsYXRmb3JtIGluaXRpYWxpc2F0aW9uIGNvZGUgdG8gc2V0IHRoZSBzdXBwbHkgcmVndWxhdG9yIGZvciB0aGlzCisgKiByZWd1bGF0b3IuIFRoaXMgZW5zdXJlcyB0aGF0IGEgcmVndWxhdG9ycyBzdXBwbHkgd2lsbCBhbHNvIGJlIGVuYWJsZWQgYnkgdGhlCisgKiBjb3JlIGlmIGl0J3MgY2hpbGQgaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIGludCBzZXRfc3VwcGx5KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAmc3VwcGx5X3JkZXYtPmRldi5rb2JqLAorCQkJCSJzdXBwbHkiKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBjb3VsZCBub3QgYWRkIGRldmljZSBsaW5rICVzIGVyciAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdXBwbHlfcmRldi0+ZGV2LmtvYmoubmFtZSwgZXJyKTsKKwkJICAgICAgIGdvdG8gb3V0OworCX0KKwlyZGV2LT5zdXBwbHkgPSBzdXBwbHlfcmRldjsKKwlsaXN0X2FkZCgmcmRldi0+c2xpc3QsICZzdXBwbHlfcmRldi0+c3VwcGx5X2xpc3QpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc2V0X2NvbnN1bWVyX2RldmljZV9zdXBwbHk6IEJpbmQgYSByZWd1bGF0b3IgdG8gYSBzeW1ib2xpYyBzdXBwbHkKKyAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBkZXY6ICAgICAgIGRldmljZSB0aGUgc3VwcGx5IGFwcGxpZXMgdG8KKyAqIEBzdXBwbHk6ICAgIHN5bWJvbGljIG5hbWUgZm9yIHN1cHBseQorICoKKyAqIEFsbG93cyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIG1hcCBwaHlzaWNhbCByZWd1bGF0b3IKKyAqIHNvdXJjZXMgdG8gc3ltYm9saWMgbmFtZXMgZm9yIHN1cHBsaWVzIGZvciB1c2UgYnkgZGV2aWNlcy4gIERldmljZXMKKyAqIHNob3VsZCB1c2UgdGhlc2Ugc3ltYm9saWMgbmFtZXMgdG8gcmVxdWVzdCByZWd1bGF0b3JzLCBhdm9pZGluZyB0aGUKKyAqIG5lZWQgdG8gcHJvdmlkZSBib2FyZC1zcGVjaWZpYyByZWd1bGF0b3IgbmFtZXMgYXMgcGxhdGZvcm0gZGF0YS4KKyAqLworc3RhdGljIGludCBzZXRfY29uc3VtZXJfZGV2aWNlX3N1cHBseShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwlzdHJ1Y3QgZGV2aWNlICpjb25zdW1lcl9kZXYsIGNvbnN0IGNoYXIgKnN1cHBseSkKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX21hcCAqbm9kZTsKKworCWlmIChzdXBwbHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9tYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vZGUtPnJlZ3VsYXRvciA9IHJkZXY7CisJbm9kZS0+ZGV2ID0gY29uc3VtZXJfZGV2OworCW5vZGUtPnN1cHBseSA9IHN1cHBseTsKKworCWxpc3RfYWRkKCZub2RlLT5saXN0LCAmcmVndWxhdG9yX21hcF9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5zZXRfY29uc3VtZXJfZGV2aWNlX3N1cHBseShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwlzdHJ1Y3QgZGV2aWNlICpjb25zdW1lcl9kZXYpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9tYXAgKm5vZGUsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG4sICZyZWd1bGF0b3JfbWFwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHJkZXYgPT0gbm9kZS0+cmVndWxhdG9yICYmCisJCQljb25zdW1lcl9kZXYgPT0gbm9kZS0+ZGV2KSB7CisJCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CisJCQlrZnJlZShub2RlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKwogI2RlZmluZSBSRUdfU1RSX1NJWkUJMzIKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmNyZWF0ZV9yZWd1bGF0b3Ioc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCkBAIC03NDYsNyArOTEyLDYgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX21hcCAqbWFwOwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciA9IEVSUl9QVFIoLUVOT0RFVik7Ci0JY29uc3QgY2hhciAqc3VwcGx5ID0gaWQ7CiAKIAlpZiAoaWQgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInJlZ3VsYXRvcjogZ2V0KCkgd2l0aCBubyBpZGVudGlmaWVyXG4iKTsKQEAgLTc1OCwxNSArOTIzLDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hcCwgJnJlZ3VsYXRvcl9tYXBfbGlzdCwgbGlzdCkgewogCQlpZiAoZGV2ID09IG1hcC0+ZGV2ICYmCiAJCSAgICBzdHJjbXAobWFwLT5zdXBwbHksIGlkKSA9PSAwKSB7Ci0JCQlzdXBwbHkgPSBtYXAtPnJlZ3VsYXRvcjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmcmVndWxhdG9yX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChzdXBwbHksIHJkZXYtPmRlc2MtPm5hbWUpID09IDAgJiYKLQkJICAgIHRyeV9tb2R1bGVfZ2V0KHJkZXYtPm93bmVyKSkKKwkJCXJkZXYgPSBtYXAtPnJlZ3VsYXRvcjsKIAkJCWdvdG8gZm91bmQ7CisJCX0KIAl9CiAJcHJpbnRrKEtFUk5fRVJSICJyZWd1bGF0b3I6IFVuYWJsZSB0byBnZXQgcmVxdWVzdGVkIHJlZ3VsYXRvcjogJXNcbiIsCiAJICAgICAgIGlkKTsKQEAgLTc3NCwxMiArOTMzLDE2IEBACiAJcmV0dXJuIHJlZ3VsYXRvcjsKIAogZm91bmQ6CisJaWYgKCF0cnlfbW9kdWxlX2dldChyZGV2LT5vd25lcikpCisJCWdvdG8gb3V0OworCiAJcmVndWxhdG9yID0gY3JlYXRlX3JlZ3VsYXRvcihyZGV2LCBkZXYsIGlkKTsKIAlpZiAocmVndWxhdG9yID09IE5VTEwpIHsKIAkJcmVndWxhdG9yID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJbW9kdWxlX3B1dChyZGV2LT5vd25lcik7CiAJfQogCitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJlZ3VsYXRvcjsKIH0KQEAgLTE1NTksMTEgKzE3MjIsMTIgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yX3JlZ2lzdGVyKHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yX2Rlc2MsCi0JCQkJCSAgdm9pZCAqcmVnX2RhdGEpCisJc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkcml2ZXJfZGF0YSkKIHsKIAlzdGF0aWMgYXRvbWljX3QgcmVndWxhdG9yX25vID0gQVRPTUlDX0lOSVQoMCk7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWludCByZXQsIGk7CiAKIAlpZiAocmVndWxhdG9yX2Rlc2MgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0xNTc1LDYgKzE3MzksOSBAQAogCSAgICAhcmVndWxhdG9yX2Rlc2MtPnR5cGUgPT0gUkVHVUxBVE9SX0NVUlJFTlQpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCisJaWYgKCFpbml0X2RhdGEpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCiAJcmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC0xNTgyLDcgKzE3NDksNyBAQAogCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIAogCW11dGV4X2luaXQoJnJkZXYtPm11dGV4KTsKLQlyZGV2LT5yZWdfZGF0YSA9IHJlZ19kYXRhOworCXJkZXYtPnJlZ19kYXRhID0gZHJpdmVyX2RhdGE7CiAJcmRldi0+b3duZXIgPSByZWd1bGF0b3JfZGVzYy0+b3duZXI7CiAJcmRldi0+ZGVzYyA9IHJlZ3VsYXRvcl9kZXNjOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5jb25zdW1lcl9saXN0KTsKQEAgLTE1OTEsMjAgKzE3NTgsNjggQEAKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+c2xpc3QpOwogCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmcmRldi0+bm90aWZpZXIpOwogCi0JcmRldi0+ZGV2LmNsYXNzID0gJnJlZ3VsYXRvcl9jbGFzczsKLQlkZXZpY2VfaW5pdGlhbGl6ZSgmcmRldi0+ZGV2KTsKLQlzbnByaW50ZihyZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YocmRldi0+ZGV2LmJ1c19pZCksCi0JCSAicmVndWxhdG9yXyVsZF8lcyIsCi0JCSAodW5zaWduZWQgbG9uZylhdG9taWNfaW5jX3JldHVybigmcmVndWxhdG9yX25vKSAtIDEsCi0JCSByZWd1bGF0b3JfZGVzYy0+bmFtZSk7CisJLyogcHJlZm9ybSBhbnkgcmVndWxhdG9yIHNwZWNpZmljIGluaXQgKi8KKwlpZiAoaW5pdF9kYXRhLT5yZWd1bGF0b3JfaW5pdCkgeworCQlyZXQgPSBpbml0X2RhdGEtPnJlZ3VsYXRvcl9pbml0KHJkZXYtPnJlZ19kYXRhKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWtmcmVlKHJkZXYpOworCQkJcmRldiA9IEVSUl9QVFIocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCi0JcmV0ID0gZGV2aWNlX2FkZCgmcmRldi0+ZGV2KTsKLQlpZiAocmV0ID09IDApCi0JCWxpc3RfYWRkKCZyZGV2LT5saXN0LCAmcmVndWxhdG9yX2xpc3QpOwotCWVsc2UgeworCS8qIHNldCByZWd1bGF0b3IgY29uc3RyYWludHMgKi8KKwlyZXQgPSBzZXRfbWFjaGluZV9jb25zdHJhaW50cyhyZGV2LCAmaW5pdF9kYXRhLT5jb25zdHJhaW50cyk7CisJaWYgKHJldCA8IDApIHsKIAkJa2ZyZWUocmRldik7CiAJCXJkZXYgPSBFUlJfUFRSKHJldCk7CisJCWdvdG8gb3V0OwogCX0KKworCS8qIHJlZ2lzdGVyIHdpdGggc3lzZnMgKi8KKwlyZGV2LT5kZXYuY2xhc3MgPSAmcmVndWxhdG9yX2NsYXNzOworCXJkZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJc25wcmludGYocmRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKHJkZXYtPmRldi5idXNfaWQpLAorCQkgInJlZ3VsYXRvci4lZCIsIGF0b21pY19pbmNfcmV0dXJuKCZyZWd1bGF0b3Jfbm8pIC0gMSk7CisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZyZGV2LT5kZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlrZnJlZShyZGV2KTsKKwkJcmRldiA9IEVSUl9QVFIocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKCZyZGV2LT5kZXYsIHJkZXYpOworCisJLyogc2V0IHN1cHBseSByZWd1bGF0b3IgaWYgaXQgZXhpc3RzICovCisJaWYgKGluaXRfZGF0YS0+c3VwcGx5X3JlZ3VsYXRvcl9kZXYpIHsKKwkJcmV0ID0gc2V0X3N1cHBseShyZGV2LAorCQkJZGV2X2dldF9kcnZkYXRhKGluaXRfZGF0YS0+c3VwcGx5X3JlZ3VsYXRvcl9kZXYpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOworCQkJa2ZyZWUocmRldik7CisJCQlyZGV2ID0gRVJSX1BUUihyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBhZGQgY29uc3VtZXJzIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5pdF9kYXRhLT5udW1fY29uc3VtZXJfc3VwcGxpZXM7IGkrKykgeworCQlyZXQgPSBzZXRfY29uc3VtZXJfZGV2aWNlX3N1cHBseShyZGV2LAorCQkJaW5pdF9kYXRhLT5jb25zdW1lcl9zdXBwbGllc1tpXS5kZXYsCisJCQlpbml0X2RhdGEtPmNvbnN1bWVyX3N1cHBsaWVzW2ldLnN1cHBseSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmb3IgKC0taTsgaSA+PSAwOyBpLS0pCisJCQkJdW5zZXRfY29uc3VtZXJfZGV2aWNlX3N1cHBseShyZGV2LAorCQkJCQlpbml0X2RhdGEtPmNvbnN1bWVyX3N1cHBsaWVzW2ldLmRldik7CisJCQlkZXZpY2VfdW5yZWdpc3RlcigmcmRldi0+ZGV2KTsKKwkJCWtmcmVlKHJkZXYpOworCQkJcmRldiA9IEVSUl9QVFIocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbGlzdF9hZGQoJnJkZXYtPmxpc3QsICZyZWd1bGF0b3JfbGlzdCk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJkZXY7CiB9CkBAIC0xNjMxLDE4NyArMTg0Niw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfdW5yZWdpc3Rlcik7CiAKIC8qKgotICogcmVndWxhdG9yX3NldF9zdXBwbHkgLSBzZXQgcmVndWxhdG9yIHN1cHBseSByZWd1bGF0b3IKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBuYW1lCi0gKiBAc3VwcGx5OiBzdXBwbHkgcmVndWxhdG9yIG5hbWUKLSAqCi0gKiBDYWxsZWQgYnkgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBzZXQgdGhlIHN1cHBseSByZWd1bGF0b3IgZm9yIHRoaXMKLSAqIHJlZ3VsYXRvci4gVGhpcyBlbnN1cmVzIHRoYXQgYSByZWd1bGF0b3JzIHN1cHBseSB3aWxsIGFsc28gYmUgZW5hYmxlZCBieSB0aGUKLSAqIGNvcmUgaWYgaXQncyBjaGlsZCBpcyBlbmFibGVkLgotICovCi1pbnQgcmVndWxhdG9yX3NldF9zdXBwbHkoY29uc3QgY2hhciAqcmVndWxhdG9yLCBjb25zdCBjaGFyICpzdXBwbHkpCi17Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsICpzdXBwbHlfcmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKHJlZ3VsYXRvciA9PSBOVUxMIHx8IHN1cHBseSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJnJlZ3VsYXRvcl9saXN0LCBsaXN0KSB7Ci0JCWlmICghc3RyY21wKHJkZXYtPmRlc2MtPm5hbWUsIHJlZ3VsYXRvcikpCi0JCQlnb3RvIGZvdW5kX3JlZ3VsYXRvcjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0KLWZvdW5kX3JlZ3VsYXRvcjoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1cHBseV9yZGV2LCAmcmVndWxhdG9yX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFzdHJjbXAoc3VwcGx5X3JkZXYtPmRlc2MtPm5hbWUsIHN1cHBseSkpCi0JCQlnb3RvIGZvdW5kX3N1cHBseTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0KLWZvdW5kX3N1cHBseToKLQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcmRldi0+ZGV2LmtvYmosICZzdXBwbHlfcmRldi0+ZGV2LmtvYmosCi0JCQkJInN1cHBseSIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IGNvdWxkIG5vdCBhZGQgZGV2aWNlIGxpbmsgJXMgZXJyICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHN1cHBseV9yZGV2LT5kZXYua29iai5uYW1lLCBlcnIpOwotCQkgICAgICAgZ290byBvdXQ7Ci0JfQotCXJkZXYtPnN1cHBseSA9IHN1cHBseV9yZGV2OwotCWxpc3RfYWRkKCZyZGV2LT5zbGlzdCwgJnN1cHBseV9yZGV2LT5zdXBwbHlfbGlzdCk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9zZXRfc3VwcGx5KTsKLQotLyoqCi0gKiByZWd1bGF0b3JfZ2V0X3N1cHBseSAtIGdldCByZWd1bGF0b3Igc3VwcGx5IHJlZ3VsYXRvcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIG5hbWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBzdXBwbHkgc3VwcGx5IHJlZ3VsYXRvciBuYW1lIG9yIE5VTEwgaWYgbm8gc3VwcGx5IHJlZ3VsYXRvcgotICogZXhpc3RzIChpLmUgdGhlIHJlZ3VsYXRvciBpcyBzdXBwbGllZCBkaXJlY3RseSBmcm9tIFVTQiwgTGluZSwgQmF0dGVyeSwgZXRjKQotICovCi1jb25zdCBjaGFyICpyZWd1bGF0b3JfZ2V0X3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IpCi17Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7Ci0KLQlpZiAocmVndWxhdG9yID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbXV0ZXhfbG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJnJlZ3VsYXRvcl9saXN0LCBsaXN0KSB7Ci0JCWlmICghc3RyY21wKHJkZXYtPmRlc2MtPm5hbWUsIHJlZ3VsYXRvcikpCi0JCQlnb3RvIGZvdW5kOwotCX0KLQltdXRleF91bmxvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKLQlyZXR1cm4gTlVMTDsKLQotZm91bmQ6Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0JaWYgKHJkZXYtPnN1cHBseSkKLQkJcmV0dXJuIHJkZXYtPnN1cHBseS0+ZGVzYy0+bmFtZTsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2dldF9zdXBwbHkpOwotCi0vKioKLSAqIHJlZ3VsYXRvcl9zZXRfbWFjaGluZV9jb25zdHJhaW50cyAtIHNldHMgcmVndWxhdG9yIGNvbnN0cmFpbnRzCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKgotICogQWxsb3dzIHBsYXRmb3JtIGluaXRpYWxpc2F0aW9uIGNvZGUgdG8gZGVmaW5lIGFuZCBjb25zdHJhaW4KLSAqIHJlZ3VsYXRvciBjaXJjdWl0cyBlLmcuIHZhbGlkIHZvbHRhZ2UvY3VycmVudCByYW5nZXMsIGV0Yy4gIE5PVEU6Ci0gKiBDb25zdHJhaW50cyAqbXVzdCogYmUgc2V0IGJ5IHBsYXRmb3JtIGNvZGUgaW4gb3JkZXIgZm9yIHNvbWUKLSAqIHJlZ3VsYXRvciBvcGVyYXRpb25zIHRvIHByb2NlZWQgaS5lLiBzZXRfdm9sdGFnZSwgc2V0X2N1cnJlbnRfbGltaXQsCi0gKiBzZXRfbW9kZS4KLSAqLwotaW50IHJlZ3VsYXRvcl9zZXRfbWFjaGluZV9jb25zdHJhaW50cyhjb25zdCBjaGFyICpyZWd1bGF0b3JfbmFtZSwKLQlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqY29uc3RyYWludHMpCi17Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocmVndWxhdG9yX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZyZWd1bGF0b3JfbGlzdCwgbGlzdCkgewotCQlpZiAoIXN0cmNtcChyZWd1bGF0b3JfbmFtZSwgcmRldi0+ZGVzYy0+bmFtZSkpCi0JCQlnb3RvIGZvdW5kOwotCX0KLQlyZXQgPSAtRU5PREVWOwotCWdvdG8gb3V0OwotCi1mb3VuZDoKLQltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7Ci0JcmRldi0+Y29uc3RyYWludHMgPSBjb25zdHJhaW50czsKLQotCS8qIGRvIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGNvbnN0cmFpbnQgdm9sdGFnZSAqLwotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+YXBwbHlfdVYgJiYKLQkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViA9PSByZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWICYmCi0JCXJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UpIHsKLQkJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZShyZGV2LAotCQkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViwgcmRldi0+Y29uc3RyYWludHMtPm1heF91Vik7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhcHBseSAlZHVWIgotCQkJCQkiIGNvbnN0cmFpbnRcbiIsIF9fZnVuY19fLAotCQkJCQlyZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKLQkJCQlyZGV2LT5jb25zdHJhaW50cyA9IE5VTEw7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JfQotCi0JLyogYXJlIHdlIGVuYWJsZWQgYXQgYm9vdCB0aW1lIGJ5IGZpcm13YXJlIC8gYm9vdGxvYWRlciAqLwotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+Ym9vdF9vbikKLQkJcmRldi0+dXNlX2NvdW50ID0gMTsKLQotCS8qIGRvIHdlIG5lZWQgdG8gc2V0dXAgb3VyIHN1c3BlbmQgc3RhdGUgKi8KLQlpZiAoY29uc3RyYWludHMtPmluaXRpYWxfc3RhdGUpCi0JCXJldCA9IHN1c3BlbmRfcHJlcGFyZShyZGV2LCBjb25zdHJhaW50cy0+aW5pdGlhbF9zdGF0ZSk7Ci0KLQlwcmludF9jb25zdHJhaW50cyhyZGV2KTsKLQltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3Jfc2V0X21hY2hpbmVfY29uc3RyYWludHMpOwotCi0KLS8qKgotICogcmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5OiBCaW5kIGEgcmVndWxhdG9yIHRvIGEgc3ltYm9saWMgc3VwcGx5Ci0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAZGV2OiAgICAgICBkZXZpY2UgdGhlIHN1cHBseSBhcHBsaWVzIHRvCi0gKiBAc3VwcGx5OiAgICBzeW1ib2xpYyBuYW1lIGZvciBzdXBwbHkKLSAqCi0gKiBBbGxvd3MgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBtYXAgcGh5c2ljYWwgcmVndWxhdG9yCi0gKiBzb3VyY2VzIHRvIHN5bWJvbGljIG5hbWVzIGZvciBzdXBwbGllcyBmb3IgdXNlIGJ5IGRldmljZXMuICBEZXZpY2VzCi0gKiBzaG91bGQgdXNlIHRoZXNlIHN5bWJvbGljIG5hbWVzIHRvIHJlcXVlc3QgcmVndWxhdG9ycywgYXZvaWRpbmcgdGhlCi0gKiBuZWVkIHRvIHByb3ZpZGUgYm9hcmQtc3BlY2lmaWMgcmVndWxhdG9yIG5hbWVzIGFzIHBsYXRmb3JtIGRhdGEuCi0gKi8KLWludCByZWd1bGF0b3Jfc2V0X2RldmljZV9zdXBwbHkoY29uc3QgY2hhciAqcmVndWxhdG9yLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJY29uc3QgY2hhciAqc3VwcGx5KQotewotCXN0cnVjdCByZWd1bGF0b3JfbWFwICpub2RlOwotCi0JaWYgKHJlZ3VsYXRvciA9PSBOVUxMIHx8IHN1cHBseSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW5vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX21hcCksIEdGUF9LRVJORUwpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jbm9kZS0+cmVndWxhdG9yID0gcmVndWxhdG9yOwotCW5vZGUtPmRldiA9IGRldjsKLQlub2RlLT5zdXBwbHkgPSBzdXBwbHk7Ci0KLQltdXRleF9sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7Ci0JbGlzdF9hZGQoJm5vZGUtPmxpc3QsICZyZWd1bGF0b3JfbWFwX2xpc3QpOwotCW11dGV4X3VubG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5KTsKLQotLyoqCiAgKiByZWd1bGF0b3Jfc3VzcGVuZF9wcmVwYXJlOiBwcmVwYXJlIHJlZ3VsYXRvcnMgZm9yIHN5c3RlbSB3aWRlIHN1c3BlbmQKICAqIEBzdGF0ZTogc3lzdGVtIHN1c3BlbmQgc3RhdGUKICAqCkBAIC0xODkzLDYgKzE5MjcsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJkZXZfZ2V0X2lkKTsKIAorc3RydWN0IGRldmljZSAqcmRldl9nZXRfZGV2KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXJldHVybiAmcmRldi0+ZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwocmRldl9nZXRfZGV2KTsKKwordm9pZCAqcmVndWxhdG9yX2dldF9pbml0X2RydmRhdGEoc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ19pbml0X2RhdGEpCit7CisJcmV0dXJuIHJlZ19pbml0X2RhdGEtPmRyaXZlcl9kYXRhOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2dldF9pbml0X2RydmRhdGEpOworCiBzdGF0aWMgaW50IF9faW5pdCByZWd1bGF0b3JfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gInJlZ3VsYXRvcjogY29yZSB2ZXJzaW9uICVzXG4iLCBSRUdVTEFUT1JfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODhlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIFJlZ3VsYXRvcnMgZHJpdmVyIGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwM3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbXB1bGFiIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgorCisvKiBEQTkwMzAgUmVnaXN0ZXJzICovCisjZGVmaW5lIERBOTAzMF9JTlZBTAkJKC0xKQorI2RlZmluZSBEQTkwMzBfTERPMTAxMQkJKDB4MTApCisjZGVmaW5lIERBOTAzMF9MRE8xNQkJKDB4MTEpCisjZGVmaW5lIERBOTAzMF9MRE8xNDE2CQkoMHgxMikKKyNkZWZpbmUgREE5MDMwX0xETzE4MTkJCSgweDEzKQorI2RlZmluZSBEQTkwMzBfTERPMTcJCSgweDE0KQorI2RlZmluZSBEQTkwMzBfQlVDSzJEVk0xCSgweDE1KQorI2RlZmluZSBEQTkwMzBfQlVDSzJEVk0yCSgweDE2KQorI2RlZmluZSBEQTkwMzBfUkNUTDExCQkoMHgxNykKKyNkZWZpbmUgREE5MDMwX1JDVEwyMQkJKDB4MTgpCisjZGVmaW5lIERBOTAzMF9MRE8xCQkoMHg5MCkKKyNkZWZpbmUgREE5MDMwX0xETzIzCQkoMHg5MSkKKyNkZWZpbmUgREE5MDMwX0xETzQ1CQkoMHg5MikKKyNkZWZpbmUgREE5MDMwX0xETzYJCSgweDkzKQorI2RlZmluZSBEQTkwMzBfTERPNzgJCSgweDk0KQorI2RlZmluZSBEQTkwMzBfTERPOTEyCQkoMHg5NSkKKyNkZWZpbmUgREE5MDMwX0JVQ0sJCSgweDk2KQorI2RlZmluZSBEQTkwMzBfUkNUTDEyCQkoMHg5NykKKyNkZWZpbmUgREE5MDMwX1JDVEwyMgkJKDB4OTgpCisjZGVmaW5lIERBOTAzMF9MRE9fVU5MT0NLCSgweGEwKQorI2RlZmluZSBEQTkwMzBfTERPX1VOTE9DS19NQVNLCSgweGUwKQorI2RlZmluZSBEQTkwMzRfT1ZFUjEJCSgweDEwKQorCisvKiBEQTkwMzQgUmVnaXN0ZXJzICovCisjZGVmaW5lIERBOTAzNF9JTlZBTAkJKC0xKQorI2RlZmluZSBEQTkwMzRfT1ZFUjIJCSgweDExKQorI2RlZmluZSBEQTkwMzRfT1ZFUjMJCSgweDEyKQorI2RlZmluZSBEQTkwMzRfTERPNjQzCQkoMHgxMykKKyNkZWZpbmUgREE5MDM0X0xETzk4NwkJKDB4MTQpCisjZGVmaW5lIERBOTAzNF9MRE8xMTEwCQkoMHgxNSkKKyNkZWZpbmUgREE5MDM0X0xETzEzMTIJCSgweDE2KQorI2RlZmluZSBEQTkwMzRfTERPMTUxNAkJKDB4MTcpCisjZGVmaW5lIERBOTAzNF9WQ0MxCQkoMHgyMCkKKyNkZWZpbmUgREE5MDM0X0FEVFYxCQkoMHgyMykKKyNkZWZpbmUgREE5MDM0X0FEVFYyCQkoMHgyNCkKKyNkZWZpbmUgREE5MDM0X0FWUkMJCSgweDI1KQorI2RlZmluZSBEQTkwMzRfQ0RUVjEJCSgweDI2KQorI2RlZmluZSBEQTkwMzRfQ0RUVjIJCSgweDI3KQorI2RlZmluZSBEQTkwMzRfQ1ZSQwkJKDB4MjgpCisjZGVmaW5lIERBOTAzNF9TRFRWMQkJKDB4MjkpCisjZGVmaW5lIERBOTAzNF9TRFRWMgkJKDB4MmEpCisjZGVmaW5lIERBOTAzNF9TVlJDCQkoMHgyYikKKyNkZWZpbmUgREE5MDM0X01EVFYxCQkoMHgzMikKKyNkZWZpbmUgREE5MDM0X01EVFYyCQkoMHgzMykKKyNkZWZpbmUgREE5MDM0X01WUkMJCSgweDM0KQorCitzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvIHsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzYzsKKworCWludAltaW5fdVY7CisJaW50CW1heF91VjsKKwlpbnQJc3RlcF91VjsKKwlpbnQJdm9sX3JlZzsKKwlpbnQJdm9sX3NoaWZ0OworCWludAl2b2xfbmJpdHM7CisJaW50CXVwZGF0ZV9yZWc7CisJaW50CXVwZGF0ZV9iaXQ7CisJaW50CWVuYWJsZV9yZWc7CisJaW50CWVuYWJsZV9iaXQ7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19yYW5nZShzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvLAorCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCit7CisJaWYgKG1pbl91ViA8IGluZm8tPm1pbl91ViB8fCBtaW5fdVYgPiBpbmZvLT5tYXhfdVYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERBOTAzMC9EQTkwMzQgY29tbW9uIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZGE5MDN4X3NldF9sZG9fdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCit7CisJc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRldmljZSAqZGE5MDM0X2RldiA9IHJkZXZfZ2V0X2RldihyZGV2KS0+cGFyZW50OworCXVpbnQ4X3QgdmFsLCBtYXNrOworCisJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgeworCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFsID0gKG1pbl91ViAtIGluZm8tPm1pbl91ViArIGluZm8tPnN0ZXBfdVYgLSAxKSAvIGluZm8tPnN0ZXBfdVY7CisJdmFsIDw8PSBpbmZvLT52b2xfc2hpZnQ7CisJbWFzayA9ICgoMSA8PCBpbmZvLT52b2xfbmJpdHMpIC0gMSkgIDw8IGluZm8tPnZvbF9zaGlmdDsKKworCXJldHVybiBkYTkwM3hfdXBkYXRlKGRhOTAzNF9kZXYsIGluZm8tPnZvbF9yZWcsIHZhbCwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDN4X2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRhOTAzNF9kZXYgPSByZGV2X2dldF9kZXYocmRldiktPnBhcmVudDsKKwl1aW50OF90IHZhbCwgbWFzazsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDN4X3JlYWQoZGE5MDM0X2RldiwgaW5mby0+dm9sX3JlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1hc2sgPSAoKDEgPDwgaW5mby0+dm9sX25iaXRzKSAtIDEpICA8PCBpbmZvLT52b2xfc2hpZnQ7CisJdmFsID0gKHZhbCAmIG1hc2spID4+IGluZm8tPnZvbF9zaGlmdDsKKworCXJldHVybiBpbmZvLT5taW5fdVYgKyBpbmZvLT5zdGVwX3VWICogdmFsOworfQorCitzdGF0aWMgaW50IGRhOTAzeF9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRldmljZSAqZGE5MDM0X2RldiA9IHJkZXZfZ2V0X2RldihyZGV2KS0+cGFyZW50OworCisJcmV0dXJuIGRhOTAzeF9zZXRfYml0cyhkYTkwMzRfZGV2LCBpbmZvLT5lbmFibGVfcmVnLAorCQkJCQkxIDw8IGluZm8tPmVuYWJsZV9iaXQpOworfQorCitzdGF0aWMgaW50IGRhOTAzeF9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRhOTAzNF9kZXYgPSByZGV2X2dldF9kZXYocmRldiktPnBhcmVudDsKKworCXJldHVybiBkYTkwM3hfY2xyX2JpdHMoZGE5MDM0X2RldiwgaW5mby0+ZW5hYmxlX3JlZywKKwkJCQkJMSA8PCBpbmZvLT5lbmFibGVfYml0KTsKK30KKworc3RhdGljIGludCBkYTkwM3hfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkYTkwMzRfZGV2ID0gcmRldl9nZXRfZGV2KHJkZXYpLT5wYXJlbnQ7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBkYTkwM3hfcmVhZChkYTkwMzRfZGV2LCBpbmZvLT5lbmFibGVfcmVnLCAmcmVnX3ZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZWdfdmFsICYgKDEgPDwgaW5mby0+ZW5hYmxlX2JpdCk7Cit9CisKKy8qIERBOTAzMCBzcGVjaWZpYyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGRhOTAzMF9zZXRfbGRvMV8xNV92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRhOTAzeF9kZXYgPSByZGV2X2dldF9kZXYocmRldiktPnBhcmVudDsKKwl1aW50OF90IHZhbCwgbWFzazsKKwlpbnQgcmV0OworCisJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgeworCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFsID0gKG1pbl91ViAtIGluZm8tPm1pbl91ViArIGluZm8tPnN0ZXBfdVYgLSAxKSAvIGluZm8tPnN0ZXBfdVY7CisJdmFsIDw8PSBpbmZvLT52b2xfc2hpZnQ7CisJbWFzayA9ICgoMSA8PCBpbmZvLT52b2xfbmJpdHMpIC0gMSkgIDw8IGluZm8tPnZvbF9zaGlmdDsKKwl2YWwgfD0gREE5MDMwX0xET19VTkxPQ0s7IC8qIGhhdmUgdG8gc2V0IFVOTE9DSyBiaXRzICovCisJbWFzayB8PSBEQTkwMzBfTERPX1VOTE9DS19NQVNLOworCisJLyogd3JpdGUgdHdpY2UgKi8KKwlyZXQgPSBkYTkwM3hfdXBkYXRlKGRhOTAzeF9kZXYsIGluZm8tPnZvbF9yZWcsIHZhbCwgbWFzayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkYTkwM3hfdXBkYXRlKGRhOTAzeF9kZXYsIGluZm8tPnZvbF9yZWcsIHZhbCwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDMwX3NldF9sZG8xNF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKK3sKKwlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkYTkwM3hfZGV2ID0gcmRldl9nZXRfZGV2KHJkZXYpLT5wYXJlbnQ7CisJdWludDhfdCB2YWwsIG1hc2s7CisJaW50IHRocmVzaDsKKworCWlmIChjaGVja19yYW5nZShpbmZvLCBtaW5fdVYsIG1heF91VikpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVYiLCBtaW5fdVYsIG1heF91Vik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRocmVzaCA9IChpbmZvLT5tYXhfdVYgKyBpbmZvLT5taW5fdVYpIC8gMjsKKwlpZiAobWluX3VWIDwgdGhyZXNoKSB7CisJCXZhbCA9ICh0aHJlc2ggLSBtaW5fdVYgKyBpbmZvLT5zdGVwX3VWIC0gMSkgLyBpbmZvLT5zdGVwX3VWOworCQl2YWwgfD0gMHg0OworCX0gZWxzZSB7CisJCXZhbCA9IChtaW5fdVYgLSB0aHJlc2ggKyBpbmZvLT5zdGVwX3VWIC0gMSkgLyBpbmZvLT5zdGVwX3VWOworCX0KKworCXZhbCA8PD0gaW5mby0+dm9sX3NoaWZ0OworCW1hc2sgPSAoKDEgPDwgaW5mby0+dm9sX25iaXRzKSAtIDEpICA8PCBpbmZvLT52b2xfc2hpZnQ7CisKKwlyZXR1cm4gZGE5MDN4X3VwZGF0ZShkYTkwM3hfZGV2LCBpbmZvLT52b2xfcmVnLCB2YWwsIG1hc2spOworfQorCitzdGF0aWMgaW50IGRhOTAzMF9nZXRfbGRvMTRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkYTkwM3hfZGV2ID0gcmRldl9nZXRfZGV2KHJkZXYpLT5wYXJlbnQ7CisJdWludDhfdCB2YWwsIG1hc2s7CisJaW50IHJldDsKKworCXJldCA9IGRhOTAzeF9yZWFkKGRhOTAzeF9kZXYsIGluZm8tPnZvbF9yZWcsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltYXNrID0gKCgxIDw8IGluZm8tPnZvbF9uYml0cykgLSAxKSAgPDwgaW5mby0+dm9sX3NoaWZ0OworCXZhbCA9ICh2YWwgJiBtYXNrKSA+PiBpbmZvLT52b2xfc2hpZnQ7CisKKwlpZiAodmFsICYgMHg0KQorCQlyZXR1cm4gaW5mby0+bWluX3VWICsgaW5mby0+c3RlcF91ViAqICgzIC0gKHZhbCAmIH4weDQpKTsKKwllbHNlCisJCXJldHVybiAoaW5mby0+bWF4X3VWICsgaW5mby0+bWluX3VWKSAvIDIgKworCQkJaW5mby0+c3RlcF91ViAqICh2YWwgJiB+MHg0KTsKK30KKworLyogREE5MDM0IHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZGE5MDM0X3NldF9kdmNfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCit7CisJc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRldmljZSAqZGE5MDM0X2RldiA9IHJkZXZfZ2V0X2RldihyZGV2KS0+cGFyZW50OworCXVpbnQ4X3QgdmFsLCBtYXNrOworCWludCByZXQ7CisKKwlpZiAoY2hlY2tfcmFuZ2UoaW5mbywgbWluX3VWLCBtYXhfdVYpKSB7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWIiwgbWluX3VWLCBtYXhfdVYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2YWwgPSAobWluX3VWIC0gaW5mby0+bWluX3VWICsgaW5mby0+c3RlcF91ViAtIDEpIC8gaW5mby0+c3RlcF91VjsKKwl2YWwgPDw9IGluZm8tPnZvbF9zaGlmdDsKKwltYXNrID0gKCgxIDw8IGluZm8tPnZvbF9uYml0cykgLSAxKSAgPDwgaW5mby0+dm9sX3NoaWZ0OworCisJcmV0ID0gZGE5MDN4X3VwZGF0ZShkYTkwMzRfZGV2LCBpbmZvLT52b2xfcmVnLCB2YWwsIG1hc2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkYTkwM3hfc2V0X2JpdHMoZGE5MDM0X2RldiwgaW5mby0+dXBkYXRlX3JlZywKKwkJCQkJMSA8PCBpbmZvLT51cGRhdGVfYml0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRhOTAzNF9zZXRfbGRvMTJfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKK3sKKwlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkYTkwMzRfZGV2ID0gcmRldl9nZXRfZGV2KHJkZXYpLT5wYXJlbnQ7CisJdWludDhfdCB2YWwsIG1hc2s7CisKKwlpZiAoY2hlY2tfcmFuZ2UoaW5mbywgbWluX3VWLCBtYXhfdVYpKSB7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWIiwgbWluX3VWLCBtYXhfdVYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2YWwgPSAobWluX3VWIC0gaW5mby0+bWluX3VWICsgaW5mby0+c3RlcF91ViAtIDEpIC8gaW5mby0+c3RlcF91VjsKKwl2YWwgPSAodmFsID4gNyB8fCB2YWwgPCAyMCkgPyA4IDogdmFsIC0gMTI7CisJdmFsIDw8PSBpbmZvLT52b2xfc2hpZnQ7CisJbWFzayA9ICgoMSA8PCBpbmZvLT52b2xfbmJpdHMpIC0gMSkgIDw8IGluZm8tPnZvbF9zaGlmdDsKKworCXJldHVybiBkYTkwM3hfdXBkYXRlKGRhOTAzNF9kZXYsIGluZm8tPnZvbF9yZWcsIHZhbCwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDM0X2dldF9sZG8xMl92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRhOTAzNF9kZXYgPSByZGV2X2dldF9kZXYocmRldiktPnBhcmVudDsKKwl1aW50OF90IHZhbCwgbWFzazsKKwlpbnQgcmV0OworCisJcmV0ID0gZGE5MDN4X3JlYWQoZGE5MDM0X2RldiwgaW5mby0+dm9sX3JlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1hc2sgPSAoKDEgPDwgaW5mby0+dm9sX25iaXRzKSAtIDEpICA8PCBpbmZvLT52b2xfc2hpZnQ7CisJdmFsID0gKHZhbCAmIG1hc2spID4+IGluZm8tPnZvbF9zaGlmdDsKKworCWlmICh2YWwgPj0gOCkKKwkJcmV0dXJuIDI3MDAwMDAgKyBpbmZvLT5zdGVwX3VWICogKHZhbCAtIDgpOworCisJcmV0dXJuIGluZm8tPm1pbl91ViArIGluZm8tPnN0ZXBfdVYgKiB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBkYTkwM3hfcmVndWxhdG9yX2xkb19vcHMgPSB7CisJLnNldF92b2x0YWdlCT0gZGE5MDN4X3NldF9sZG9fdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2UJPSBkYTkwM3hfZ2V0X3ZvbHRhZ2UsCisJLmVuYWJsZQkJPSBkYTkwM3hfZW5hYmxlLAorCS5kaXNhYmxlCT0gZGE5MDN4X2Rpc2FibGUsCisJLmlzX2VuYWJsZWQJPSBkYTkwM3hfaXNfZW5hYmxlZCwKK307CisKKy8qIE5PVEU6IHRoaXMgaXMgZGVkaWNhdGVkIGZvciB0aGUgaW5zYW5lIERBOTAzMCBMRE8xNCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGRhOTAzMF9yZWd1bGF0b3JfbGRvMTRfb3BzID0geworCS5zZXRfdm9sdGFnZQk9IGRhOTAzMF9zZXRfbGRvMTRfdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2UJPSBkYTkwMzBfZ2V0X2xkbzE0X3ZvbHRhZ2UsCisJLmVuYWJsZQkJPSBkYTkwM3hfZW5hYmxlLAorCS5kaXNhYmxlCT0gZGE5MDN4X2Rpc2FibGUsCisJLmlzX2VuYWJsZWQJPSBkYTkwM3hfaXNfZW5hYmxlZCwKK307CisKKy8qIE5PVEU6IHRoaXMgaXMgZGVkaWNhdGVkIGZvciB0aGUgREE5MDMwIExETzEgYW5kIExETzE1IHRoYXQgaGF2ZSBsb2NrcyAgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBkYTkwMzBfcmVndWxhdG9yX2xkbzFfMTVfb3BzID0geworCS5zZXRfdm9sdGFnZQk9IGRhOTAzMF9zZXRfbGRvMV8xNV92b2x0YWdlLAorCS5nZXRfdm9sdGFnZQk9IGRhOTAzeF9nZXRfdm9sdGFnZSwKKwkuZW5hYmxlCQk9IGRhOTAzeF9lbmFibGUsCisJLmRpc2FibGUJPSBkYTkwM3hfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAk9IGRhOTAzeF9pc19lbmFibGVkLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGRhOTAzNF9yZWd1bGF0b3JfZHZjX29wcyA9IHsKKwkuc2V0X3ZvbHRhZ2UJPSBkYTkwMzRfc2V0X2R2Y192b2x0YWdlLAorCS5nZXRfdm9sdGFnZQk9IGRhOTAzeF9nZXRfdm9sdGFnZSwKKwkuZW5hYmxlCQk9IGRhOTAzeF9lbmFibGUsCisJLmRpc2FibGUJPSBkYTkwM3hfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZAk9IGRhOTAzeF9pc19lbmFibGVkLAorfTsKKworLyogTk9URTogdGhpcyBpcyBkZWRpY2F0ZWQgZm9yIHRoZSBpbnNhbmUgTERPMTIgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBkYTkwMzRfcmVndWxhdG9yX2xkbzEyX29wcyA9IHsKKwkuc2V0X3ZvbHRhZ2UJPSBkYTkwMzRfc2V0X2xkbzEyX3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlCT0gZGE5MDM0X2dldF9sZG8xMl92b2x0YWdlLAorCS5lbmFibGUJCT0gZGE5MDN4X2VuYWJsZSwKKwkuZGlzYWJsZQk9IGRhOTAzeF9kaXNhYmxlLAorCS5pc19lbmFibGVkCT0gZGE5MDN4X2lzX2VuYWJsZWQsCit9OworCisjZGVmaW5lIERBOTAzeF9MRE8oX3BtaWMsIF9pZCwgbWluLCBtYXgsIHN0ZXAsIHZyZWcsIHNoaWZ0LCBuYml0cywgZXJlZywgZWJpdCkJXAorewkJCQkJCQkJCVwKKwkuZGVzYwk9IHsJCQkJCQkJXAorCQkubmFtZQk9ICJMRE8iICNfaWQsCQkJCQlcCisJCS5vcHMJPSAmZGE5MDN4X3JlZ3VsYXRvcl9sZG9fb3BzLAkJCVwKKwkJLnR5cGUJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQkJXAorCQkuaWQJPSBfcG1pYyMjX0lEX0xETyMjX2lkLAkJCQlcCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAkJCQkJXAorCX0sCQkJCQkJCQlcCisJLm1pbl91VgkJPSAobWluKSAqIDEwMDAsCQkJCQlcCisJLm1heF91VgkJPSAobWF4KSAqIDEwMDAsCQkJCQlcCisJLnN0ZXBfdVYJPSAoc3RlcCkgKiAxMDAwLAkJCQlcCisJLnZvbF9yZWcJPSBfcG1pYyMjXyMjdnJlZywJCQkJXAorCS52b2xfc2hpZnQJPSAoc2hpZnQpLAkJCQkJXAorCS52b2xfbmJpdHMJPSAobmJpdHMpLAkJCQkJXAorCS5lbmFibGVfcmVnCT0gX3BtaWMjI18jI2VyZWcsCQkJCVwKKwkuZW5hYmxlX2JpdAk9IChlYml0KSwJCQkJCVwKK30KKworI2RlZmluZSBEQTkwMzRfRFZDKF9pZCwgbWluLCBtYXgsIHN0ZXAsIHZyZWcsIG5iaXRzLCB1cmVnLCB1Yml0LCBlcmVnLCBlYml0KSBcCit7CQkJCQkJCQkJXAorCS5kZXNjCT0gewkJCQkJCQlcCisJCS5uYW1lCT0gI19pZCwJCQkJCQlcCisJCS5vcHMJPSAmZGE5MDM0X3JlZ3VsYXRvcl9kdmNfb3BzLAkJCVwKKwkJLnR5cGUJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQkJXAorCQkuaWQJPSBEQTkwMzRfSURfIyNfaWQsCQkJCVwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCQkJCQlcCisJfSwJCQkJCQkJCVwKKwkubWluX3VWCQk9IChtaW4pICogMTAwMCwJCQkJCVwKKwkubWF4X3VWCQk9IChtYXgpICogMTAwMCwJCQkJCVwKKwkuc3RlcF91Vgk9IChzdGVwKSAqIDEwMDAsCQkJCVwKKwkudm9sX3JlZwk9IERBOTAzNF8jI3ZyZWcsCQkJCVwKKwkudm9sX3NoaWZ0CT0gKDApLAkJCQkJCVwKKwkudm9sX25iaXRzCT0gKG5iaXRzKSwJCQkJCVwKKwkudXBkYXRlX3JlZwk9IERBOTAzNF8jI3VyZWcsCQkJCVwKKwkudXBkYXRlX2JpdAk9ICh1Yml0KSwJCQkJCVwKKwkuZW5hYmxlX3JlZwk9IERBOTAzNF8jI2VyZWcsCQkJCVwKKwkuZW5hYmxlX2JpdAk9IChlYml0KSwJCQkJCVwKK30KKworI2RlZmluZSBEQTkwMzRfTERPKF9pZCwgbWluLCBtYXgsIHN0ZXAsIHZyZWcsIHNoaWZ0LCBuYml0cywgZXJlZywgZWJpdCkJXAorCURBOTAzeF9MRE8oREE5MDM0LCBfaWQsIG1pbiwgbWF4LCBzdGVwLCB2cmVnLCBzaGlmdCwgbmJpdHMsIGVyZWcsIGViaXQpCisKKyNkZWZpbmUgREE5MDMwX0xETyhfaWQsIG1pbiwgbWF4LCBzdGVwLCB2cmVnLCBzaGlmdCwgbmJpdHMsIGVyZWcsIGViaXQpCVwKKwlEQTkwM3hfTERPKERBOTAzMCwgX2lkLCBtaW4sIG1heCwgc3RlcCwgdnJlZywgc2hpZnQsIG5iaXRzLCBlcmVnLCBlYml0KQorCitzdGF0aWMgc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyBkYTkwM3hfcmVndWxhdG9yX2luZm9bXSA9IHsKKwkvKiBEQTkwMzAgKi8KKwlEQTkwMzBfTERPKCAxLCAxMjAwLCAzMjAwLCAxMDAsICAgIExETzEsIDAsIDUsIFJDVEwxMiwgMSksCisJREE5MDMwX0xETyggMiwgMTgwMCwgMzIwMCwgMTAwLCAgIExETzIzLCAwLCA0LCBSQ1RMMTIsIDIpLAorCURBOTAzMF9MRE8oIDMsIDE4MDAsIDMyMDAsIDEwMCwgICBMRE8yMywgNCwgNCwgUkNUTDEyLCAzKSwKKwlEQTkwMzBfTERPKCA0LCAxODAwLCAzMjAwLCAxMDAsICAgTERPNDUsIDAsIDQsIFJDVEwxMiwgNCksCisJREE5MDMwX0xETyggNSwgMTgwMCwgMzIwMCwgMTAwLCAgIExETzQ1LCA0LCA0LCBSQ1RMMTIsIDUpLAorCURBOTAzMF9MRE8oIDYsIDE4MDAsIDMyMDAsIDEwMCwgICAgTERPNiwgMCwgNCwgUkNUTDEyLCA2KSwKKwlEQTkwMzBfTERPKCA3LCAxODAwLCAzMjAwLCAxMDAsICAgTERPNzgsIDAsIDQsIFJDVEwxMiwgNyksCisJREE5MDMwX0xETyggOCwgMTgwMCwgMzIwMCwgMTAwLCAgIExETzc4LCA0LCA0LCBSQ1RMMjIsIDApLAorCURBOTAzMF9MRE8oIDksIDE4MDAsIDMyMDAsIDEwMCwgIExETzkxMiwgMCwgNCwgUkNUTDIyLCAxKSwKKwlEQTkwMzBfTERPKDEwLCAxODAwLCAzMjAwLCAxMDAsIExETzEwMTEsIDAsIDQsIFJDVEwyMiwgMiksCisJREE5MDMwX0xETygxMSwgMTgwMCwgMzIwMCwgMTAwLCBMRE8xMDExLCA0LCA0LCBSQ1RMMjIsIDMpLAorCURBOTAzMF9MRE8oMTIsIDE4MDAsIDMyMDAsIDEwMCwgIExETzkxMiwgNCwgNCwgUkNUTDIyLCA0KSwKKwlEQTkwMzBfTERPKDE0LCAyNzYwLCAyOTQwLCAgMzAsIExETzE0MTYsIDAsIDMsIFJDVEwxMSwgNCksCisJREE5MDMwX0xETygxNSwgMTEwMCwgMjY1MCwgIDUwLAkgIExETzE1LCAwLCA1LCBSQ1RMMTEsIDUpLAorCURBOTAzMF9MRE8oMTYsIDExMDAsIDI2NTAsICA1MCwgTERPMTQxNiwgMywgNSwgUkNUTDExLCA2KSwKKwlEQTkwMzBfTERPKDE3LCAxODAwLCAzMjAwLCAxMDAsICAgTERPMTcsIDAsIDQsIFJDVEwxMSwgNyksCisJREE5MDMwX0xETygxOCwgMTgwMCwgMzIwMCwgMTAwLCBMRE8xODE5LCAwLCA0LCBSQ1RMMjEsIDIpLAorCURBOTAzMF9MRE8oMTksIDE4MDAsIDMyMDAsIDEwMCwgTERPMTgxOSwgNCwgNCwgUkNUTDIxLCAxKSwKKwlEQTkwMzBfTERPKDEzLCAyMTAwLCAyMTAwLCAwLCBJTlZBTCwgMCwgMCwgUkNUTDExLCAzKSwgLyogZml4ZWQgQDIuMVYgKi8KKworCS8qIERBOTAzNCAqLworCURBOTAzNF9EVkMoQlVDSzEsIDcyNSwgMTUwMCwgMjUsIEFEVFYxLCA1LCBWQ0MxLCAwLCBPVkVSMSwgMCksCisJREE5MDM0X0RWQyhCVUNLMiwgNzI1LCAxNTAwLCAyNSwgQ0RUVjEsIDUsIFZDQzEsIDIsIE9WRVIxLCAxKSwKKwlEQTkwMzRfRFZDKExETzIsICA3MjUsIDE1MDAsIDI1LCBTRFRWMSwgNSwgVkNDMSwgNCwgT1ZFUjEsIDIpLAorCURBOTAzNF9EVkMoTERPMSwgMTcwMCwgMjA3NSwgMjUsIE1EVFYxLCA0LCBWQ0MxLCA2LCBPVkVSMywgNCksCisKKwlEQTkwMzRfTERPKCAzLCAxODAwLCAzMzAwLCAxMDAsICBMRE82NDMsIDAsIDQsIE9WRVIzLCA1KSwKKwlEQTkwMzRfTERPKCA0LCAxODAwLCAyOTAwLDExMDAsICBMRE82NDMsIDQsIDEsIE9WRVIzLCA2KSwKKwlEQTkwMzRfTERPKCA2LCAyNTAwLCAyODUwLCAgNTAsICBMRE82NDMsIDUsIDMsIE9WRVIyLCAwKSwKKwlEQTkwMzRfTERPKCA3LCAyNzAwLCAzMDUwLCAgNTAsICBMRE85ODcsIDAsIDMsIE9WRVIyLCAxKSwKKwlEQTkwMzRfTERPKCA4LCAyNzAwLCAyODUwLCAgNTAsICBMRE85ODcsIDMsIDIsIE9WRVIyLCAyKSwKKwlEQTkwMzRfTERPKCA5LCAyNzAwLCAzMDUwLCAgNTAsICBMRE85ODcsIDUsIDMsIE9WRVIyLCAzKSwKKwlEQTkwMzRfTERPKDEwLCAyNzAwLCAzMDUwLCAgNTAsIExETzExMTAsIDAsIDMsIE9WRVIyLCA0KSwKKwlEQTkwMzRfTERPKDExLCAxODAwLCAzMzAwLCAxMDAsIExETzExMTAsIDQsIDQsIE9WRVIyLCA1KSwKKwlEQTkwMzRfTERPKDEyLCAxNzAwLCAzMDUwLCAgNTAsIExETzEzMTIsIDAsIDQsIE9WRVIzLCA2KSwKKwlEQTkwMzRfTERPKDEzLCAxODAwLCAzMzAwLCAxMDAsIExETzEzMTIsIDQsIDQsIE9WRVIyLCA3KSwKKwlEQTkwMzRfTERPKDE0LCAxODAwLCAzMzAwLCAxMDAsIExETzE1MTQsIDAsIDQsIE9WRVIzLCAwKSwKKwlEQTkwMzRfTERPKDE1LCAxODAwLCAzMzAwLCAxMDAsIExETzE1MTQsIDQsIDQsIE9WRVIzLCAxKSwKKwlEQTkwMzRfTERPKDUsIDMxMDAsIDMxMDAsIDAsIElOVkFMLCAwLCAwLCBPVkVSMywgNyksIC8qIGZpeGVkIEAzLjFWICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKmZpbmRfcmVndWxhdG9yX2luZm8oaW50IGlkKQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKnJpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGE5MDN4X3JlZ3VsYXRvcl9pbmZvKTsgaSsrKSB7CisJCXJpID0gJmRhOTAzeF9yZWd1bGF0b3JfaW5mb1tpXTsKKwkJaWYgKHJpLT5kZXNjLmlkID09IGlkKQorCQkJcmV0dXJuIHJpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZGE5MDN4X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwM3hfcmVndWxhdG9yX2luZm8gKnJpID0gTlVMTDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKworCXJpID0gZmluZF9yZWd1bGF0b3JfaW5mbyhwZGV2LT5pZCk7CisJaWYgKHJpID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCByZWd1bGF0b3IgSUQgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV29ya2Fyb3VuZCBmb3IgdGhlIHdlaXJkIExETzEyIHZvbHRhZ2Ugc2V0dGluZyAqLworCWlmIChyaS0+ZGVzYy5pZCA9PSBEQTkwMzRfSURfTERPMTIpCisJCXJpLT5kZXNjLm9wcyA9ICZkYTkwMzRfcmVndWxhdG9yX2xkbzEyX29wczsKKworCWlmIChyaS0+ZGVzYy5pZCA9PSBEQTkwMzBfSURfTERPMTQpCisJCXJpLT5kZXNjLm9wcyA9ICZkYTkwMzBfcmVndWxhdG9yX2xkbzE0X29wczsKKworCWlmIChyaS0+ZGVzYy5pZCA9PSBEQTkwMzBfSURfTERPMSB8fCByaS0+ZGVzYy5pZCA9PSBEQTkwMzBfSURfTERPMTUpCisJCXJpLT5kZXNjLm9wcyA9ICZkYTkwMzBfcmVndWxhdG9yX2xkbzFfMTVfb3BzOworCisJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcmktPmRlc2MsIHBkZXYtPmRldi5wYXJlbnQsIHJpKTsKKwlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCisJCQkJcmktPmRlc2MubmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkYTkwM3hfcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGE5MDN4X3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAiZGE5MDN4LXJlZ3VsYXRvciIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGRhOTAzeF9yZWd1bGF0b3JfcHJvYmUsCisJLnJlbW92ZQkJPSBkYTkwM3hfcmVndWxhdG9yX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRhOTAzeF9yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRhOTAzeF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGRhOTAzeF9yZWd1bGF0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkYTkwM3hfcmVndWxhdG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGE5MDN4X3JlZ3VsYXRvcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZGE5MDN4X3JlZ3VsYXRvcl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+IgorCSAgICAgICJNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWd1bGF0b3IgRHJpdmVyIGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwM1ggUE1JQyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkYTkwM3gtcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0NGIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDE0MzEgQEAKKy8qCisgKiB3bTgzNTAuYyAgLS0gIFZvbHRhZ2UgYW5kIGN1cnJlbnQgcmVndWxhdGlvbiBmb3IgdGhlIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorCisvKiBNaWNyb2FtcHMgKi8KK3N0YXRpYyBjb25zdCBpbnQgaXNpbmtfY3VyW10gPSB7CisJNCwKKwk1LAorCTYsCisJNywKKwk4LAorCTEwLAorCTExLAorCTE0LAorCTE2LAorCTE5LAorCTIzLAorCTI3LAorCTMyLAorCTM5LAorCTQ2LAorCTU0LAorCTY1LAorCTc3LAorCTkyLAorCTEwOSwKKwkxMzAsCisJMTU0LAorCTE4MywKKwkyMTgsCisJMjU5LAorCTMwOCwKKwkzNjcsCisJNDM2LAorCTUxOCwKKwk2MTYsCisJNzMzLAorCTg3MiwKKwkxMDM3LAorCTEyMzMsCisJMTQ2NiwKKwkxNzQ0LAorCTIwNzMsCisJMjQ2NiwKKwkyOTMzLAorCTM0ODcsCisJNDE0NywKKwk0OTMyLAorCTU4NjUsCisJNjk3NSwKKwk4Mjk0LAorCTk4NjQsCisJMTE3MzAsCisJMTM5NDksCisJMTY1ODksCisJMTk3MjgsCisJMjM0NjAsCisJMjc4OTksCisJMzMxNzgsCisJMzk0NTUsCisJNDY5MjAsCisJNTU3OTgsCisJNjYzNTUsCisJNzg5MTAsCisJOTM4NDAsCisJMTExNTk2LAorCTEzMjcxMCwKKwkxNTc4MjAsCisJMTg3NjgxLAorCTIyMzE5MQorfTsKKworc3RhdGljIGludCBnZXRfaXNpbmtfdmFsKGludCBtaW5fdUEsIGludCBtYXhfdUEsIHUxNiAqc2V0dGluZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUoaXNpbmtfY3VyKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChtaW5fdUEgPD0gaXNpbmtfY3VyW2ldICYmIG1heF91QSA+PSBpc2lua19jdXJbaV0pIHsKKwkJCSpzZXR0aW5nID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bTgzNTBfbGRvX3ZhbF90b19tdm9sdHModW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAodmFsIDwgMTYpCisJCXJldHVybiAodmFsICogNTApICsgOTAwOworCWVsc2UKKwkJcmV0dXJuICgodmFsIC0gMTYpICogMTAwKSArIDE4MDA7CisKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd204MzUwX2xkb19tdm9sdHNfdG9fdmFsKGludCBtVikKK3sKKwlpZiAobVYgPCAxODAwKQorCQlyZXR1cm4gKG1WIC0gOTAwKSAvIDUwOworCWVsc2UKKwkJcmV0dXJuICgobVYgLSAxODAwKSAvIDEwMCkgKyAxNjsKK30KKworc3RhdGljIGlubGluZSBpbnQgd204MzUwX2RjZGNfdmFsX3RvX212b2x0cyh1bnNpZ25lZCBpbnQgdmFsKQoreworCXJldHVybiAodmFsICogMjUpICsgODUwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB3bTgzNTBfZGNkY19tdm9sdHNfdG9fdmFsKGludCBtVikKK3sKKwlyZXR1cm4gKG1WIC0gODUwKSAvIDI1OworfQorCitzdGF0aWMgaW50IHdtODM1MF9pc2lua19zZXRfY3VycmVudChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91QSwKKwlpbnQgbWF4X3VBKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGlzaW5rID0gcmRldl9nZXRfaWQocmRldik7CisJdTE2IHZhbCwgc2V0dGluZzsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2lzaW5rX3ZhbChtaW5fdUEsIG1heF91QSwgJnNldHRpbmcpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoaXNpbmspIHsKKwljYXNlIFdNODM1MF9JU0lOS19BOgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQ1VSUkVOVF9TSU5LX0RSSVZFUl9BKSAmCisJCSAgICB+V004MzUwX0NTMV9JU0VMX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfQ1VSUkVOVF9TSU5LX0RSSVZFUl9BLAorCQkJCSB2YWwgfCBzZXR0aW5nKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfSVNJTktfQjoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NVUlJFTlRfU0lOS19EUklWRVJfQikgJgorCQkgICAgfldNODM1MF9DUzFfSVNFTF9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0NVUlJFTlRfU0lOS19EUklWRVJfQiwKKwkJCQkgdmFsIHwgc2V0dGluZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9pc2lua19nZXRfY3VycmVudChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCBpc2luayA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiB2YWw7CisKKwlzd2l0Y2ggKGlzaW5rKSB7CisJY2FzZSBXTTgzNTBfSVNJTktfQToKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NVUlJFTlRfU0lOS19EUklWRVJfQSkgJgorCQkgICAgV004MzUwX0NTMV9JU0VMX01BU0s7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0lTSU5LX0I6CisJCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9DVVJSRU5UX1NJTktfRFJJVkVSX0IpICYKKwkJICAgIFdNODM1MF9DUzFfSVNFTF9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKGlzaW5rX2N1clt2YWxdICsgNTApIC8gMTAwOworfQorCisvKiB0dXJuIG9uIElTSU5LIGZvbGxvd2VkIGJ5IERDREMgKi8KK3N0YXRpYyBpbnQgd204MzUwX2lzaW5rX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCBpc2luayA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCisJc3dpdGNoIChpc2luaykgeworCWNhc2UgV004MzUwX0lTSU5LX0E6CisJCXN3aXRjaCAod204MzUwLT5wbWljLmlzaW5rX0FfZGNkYykgeworCQljYXNlIFdNODM1MF9EQ0RDXzI6CisJCWNhc2UgV004MzUwX0RDRENfNToKKwkJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzcsCisJCQkJCVdNODM1MF9DUzFfRU5BKTsKKwkJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9DU0FfRkxBU0hfQ09OVFJPTCwKKwkJCQkJV004MzUwX0NTMV9EUklWRSk7CisJCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVELAorCQkJCQkxIDw8ICh3bTgzNTAtPnBtaWMuaXNpbmtfQV9kY2RjIC0KKwkJCQkJICAgICAgV004MzUwX0RDRENfMSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFdNODM1MF9JU0lOS19COgorCQlzd2l0Y2ggKHdtODM1MC0+cG1pYy5pc2lua19CX2RjZGMpIHsKKwkJY2FzZSBXTTgzNTBfRENEQ18yOgorCQljYXNlIFdNODM1MF9EQ0RDXzU6CisJCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF83LAorCQkJCQlXTTgzNTBfQ1MyX0VOQSk7CisJCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfQ1NCX0ZMQVNIX0NPTlRST0wsCisJCQkJCVdNODM1MF9DUzJfRFJJVkUpOworCQkJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0RDRENfTERPX1JFUVVFU1RFRCwKKwkJCQkJMSA8PCAod204MzUwLT5wbWljLmlzaW5rX0JfZGNkYyAtCisJCQkJCSAgICAgIFdNODM1MF9EQ0RDXzEpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9pc2lua19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGlzaW5rID0gcmRldl9nZXRfaWQocmRldik7CisKKwlzd2l0Y2ggKGlzaW5rKSB7CisJY2FzZSBXTTgzNTBfSVNJTktfQToKKwkJc3dpdGNoICh3bTgzNTAtPnBtaWMuaXNpbmtfQV9kY2RjKSB7CisJCWNhc2UgV004MzUwX0RDRENfMjoKKwkJY2FzZSBXTTgzNTBfRENEQ181OgorCQkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVELAorCQkJCQkgIDEgPDwgKHdtODM1MC0+cG1pYy5pc2lua19BX2RjZGMgLQorCQkJCQkJV004MzUwX0RDRENfMSkpOworCQkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF83LAorCQkJCQkgIFdNODM1MF9DUzFfRU5BKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfSVNJTktfQjoKKwkJc3dpdGNoICh3bTgzNTAtPnBtaWMuaXNpbmtfQl9kY2RjKSB7CisJCWNhc2UgV004MzUwX0RDRENfMjoKKwkJY2FzZSBXTTgzNTBfRENEQ181OgorCQkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVELAorCQkJCQkgIDEgPDwgKHdtODM1MC0+cG1pYy5pc2lua19CX2RjZGMgLQorCQkJCQkJV004MzUwX0RDRENfMSkpOworCQkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF83LAorCQkJCQkgIFdNODM1MF9DUzJfRU5BKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9pc2lua19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGlzaW5rID0gcmRldl9nZXRfaWQocmRldik7CisKKwlzd2l0Y2ggKGlzaW5rKSB7CisJY2FzZSBXTTgzNTBfSVNJTktfQToKKwkJcmV0dXJuIHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9DVVJSRU5UX1NJTktfRFJJVkVSX0EpICYKKwkJICAgIDB4ODAwMDsKKwljYXNlIFdNODM1MF9JU0lOS19COgorCQlyZXR1cm4gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NVUlJFTlRfU0lOS19EUklWRVJfQikgJgorCQkgICAgMHg4MDAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHdtODM1MF9pc2lua19zZXRfZmxhc2goc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXNpbmssIHUxNiBtb2RlLAorCQkJICAgdTE2IHRyaWdnZXIsIHUxNiBkdXJhdGlvbiwgdTE2IG9uX3JhbXAsIHUxNiBvZmZfcmFtcCwKKwkJCSAgIHUxNiBkcml2ZSkKK3sKKwlzd2l0Y2ggKGlzaW5rKSB7CisJY2FzZSBXTTgzNTBfSVNJTktfQToKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9DU0FfRkxBU0hfQ09OVFJPTCwKKwkJCQkgKG1vZGUgPyBXTTgzNTBfQ1MxX0ZMQVNIX01PREUgOiAwKSB8CisJCQkJICh0cmlnZ2VyID8gV004MzUwX0NTMV9UUklHU1JDIDogMCkgfAorCQkJCSBkdXJhdGlvbiB8IG9uX3JhbXAgfCBvZmZfcmFtcCB8IGRyaXZlKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfSVNJTktfQjoKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9DU0JfRkxBU0hfQ09OVFJPTCwKKwkJCQkgKG1vZGUgPyBXTTgzNTBfQ1MyX0ZMQVNIX01PREUgOiAwKSB8CisJCQkJICh0cmlnZ2VyID8gV004MzUwX0NTMl9UUklHU1JDIDogMCkgfAorCQkJCSBkdXJhdGlvbiB8IG9uX3JhbXAgfCBvZmZfcmFtcCB8IGRyaXZlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2lzaW5rX3NldF9mbGFzaCk7CisKK3N0YXRpYyBpbnQgd204MzUwX2RjZGNfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsCisJaW50IG1heF91VikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCB2b2x0X3JlZywgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpLCBtViwKKwkJbWluX21WID0gbWluX3VWIC8gMTAwMCwgbWF4X21WID0gbWF4X3VWIC8gMTAwMDsKKwl1MTYgdmFsOworCisJaWYgKG1pbl9tViA8IDg1MCB8fCBtaW5fbVYgPiA0MDI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobWF4X21WIDwgODUwIHx8IG1heF9tViA+IDQwMjUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RlcCBzaXplIGlzIDI1bVYgKi8KKwltViA9IChtaW5fbVYgLSA4MjYpIC8gMjU7CisJaWYgKHdtODM1MF9kY2RjX3ZhbF90b19tdm9sdHMobVYpID4gbWF4X21WKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlCVUdfT04od204MzUwX2RjZGNfdmFsX3RvX212b2x0cyhtVikgPCBtaW5fbVYpOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18xOgorCQl2b2x0X3JlZyA9IFdNODM1MF9EQ0RDMV9DT05UUk9MOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzM6CisJCXZvbHRfcmVnID0gV004MzUwX0RDREMzX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNDoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfRENEQzRfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ182OgorCQl2b2x0X3JlZyA9IFdNODM1MF9EQ0RDNl9DT05UUk9MOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzI6CisJY2FzZSBXTTgzNTBfRENEQ181OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbCBEQ0RDcyBoYXZlIHNhbWUgbVYgYml0cyAqLworCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfREMxX1ZTRUxfTUFTSzsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgdm9sdF9yZWcsIHZhbCB8IG1WKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfZGNkY19nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCB2b2x0X3JlZywgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiB2YWw7CisKKwlzd2l0Y2ggKGRjZGMpIHsKKwljYXNlIFdNODM1MF9EQ0RDXzE6CisJCXZvbHRfcmVnID0gV004MzUwX0RDREMxX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMzoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfRENEQzNfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ180OgorCQl2b2x0X3JlZyA9IFdNODM1MF9EQ0RDNF9DT05UUk9MOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzY6CisJCXZvbHRfcmVnID0gV004MzUwX0RDREM2X0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMjoKKwljYXNlIFdNODM1MF9EQ0RDXzU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsIERDRENzIGhhdmUgc2FtZSBtViBiaXRzICovCisJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgV004MzUwX0RDMV9WU0VMX01BU0s7CisJcmV0dXJuIHdtODM1MF9kY2RjX3ZhbF90b19tdm9sdHModmFsKSAqIDEwMDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2RjZGNfc2V0X3N1c3BlbmRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHVWKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IHZvbHRfcmVnLCBtViA9IHVWIC8gMTAwMCwgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiB2YWw7CisKKwlkZXZfZGJnKHdtODM1MC0+ZGV2LCAiJXMgJWQgbVYgJWRcbiIsIF9fZnVuY19fLCBkY2RjLCBtVik7CisKKwlpZiAobVYgJiYgKG1WIDwgODUwIHx8IG1WID4gNDAyNSkpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCSJEQ0RDJWQgc3VzcGVuZCB2b2x0YWdlICVkIG1WIG91dCBvZiByYW5nZVxuIiwKKwkJCWRjZGMsIG1WKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChtViA9PSAwKQorCQltViA9IDg1MDsKKworCXN3aXRjaCAoZGNkYykgeworCWNhc2UgV004MzUwX0RDRENfMToKKwkJdm9sdF9yZWcgPSBXTTgzNTBfRENEQzFfTE9XX1BPV0VSOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzM6CisJCXZvbHRfcmVnID0gV004MzUwX0RDREMzX0xPV19QT1dFUjsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ180OgorCQl2b2x0X3JlZyA9IFdNODM1MF9EQ0RDNF9MT1dfUE9XRVI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNjoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfRENEQzZfTE9XX1BPV0VSOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzI6CisJY2FzZSBXTTgzNTBfRENEQ181OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbCBEQ0RDcyBoYXZlIHNhbWUgbVYgYml0cyAqLworCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfREMxX1ZTRUxfTUFTSzsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgdm9sdF9yZWcsCisJCQkgdmFsIHwgd204MzUwX2RjZGNfbXZvbHRzX3RvX3ZhbChtVikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9kY2RjX3NldF9zdXNwZW5kX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCBkY2RjID0gcmRldl9nZXRfaWQocmRldik7CisJdTE2IHZhbDsKKworCXN3aXRjaCAoZGNkYykgeworCWNhc2UgV004MzUwX0RDRENfMToKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREMxX0xPV19QT1dFUikKKwkJCSYgfldNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfRENEQzFfTE9XX1BPV0VSLAorCQkJd204MzUwLT5wbWljLmRjZGMxX2hpYl9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ18zOgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQzNfTE9XX1BPV0VSKQorCQkJJiB+V004MzUwX0RDRENfSElCX01PREVfTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDM19MT1dfUE9XRVIsCisJCQl3bTgzNTAtPnBtaWMuZGNkYzNfaGliX21vZGUpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzQ6CisJCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9EQ0RDNF9MT1dfUE9XRVIpCisJCQkmIH5XTTgzNTBfRENEQ19ISUJfTU9ERV9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0RDREM0X0xPV19QT1dFUiwKKwkJCXdtODM1MC0+cG1pYy5kY2RjNF9oaWJfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNjoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM2X0xPV19QT1dFUikKKwkJCSYgfldNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfRENEQzZfTE9XX1BPV0VSLAorCQkJd204MzUwLT5wbWljLmRjZGM2X2hpYl9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ18yOgorCWNhc2UgV004MzUwX0RDRENfNToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfZGNkY19zZXRfc3VzcGVuZF9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgdmFsOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18xOgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQzFfTE9XX1BPV0VSKTsKKwkJd204MzUwLT5wbWljLmRjZGMxX2hpYl9tb2RlID0gdmFsICYgV004MzUwX0RDRENfSElCX01PREVfTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDMV9MT1dfUE9XRVIsCisJCQlXTTgzNTBfRENEQ19ISUJfTU9ERV9ESVMpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzM6CisJCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9EQ0RDM19MT1dfUE9XRVIpOworCQl3bTgzNTAtPnBtaWMuZGNkYzNfaGliX21vZGUgPSB2YWwgJiBXTTgzNTBfRENEQ19ISUJfTU9ERV9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0RDREMzX0xPV19QT1dFUiwKKwkJCVdNODM1MF9EQ0RDX0hJQl9NT0RFX0RJUyk7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNDoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM0X0xPV19QT1dFUik7CisJCXdtODM1MC0+cG1pYy5kY2RjNF9oaWJfbW9kZSA9IHZhbCAmIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfRENEQzRfTE9XX1BPV0VSLAorCQkJV004MzUwX0RDRENfSElCX01PREVfRElTKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ182OgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQzZfTE9XX1BPV0VSKTsKKwkJd204MzUwLT5wbWljLmRjZGM2X2hpYl9tb2RlID0gdmFsICYgV004MzUwX0RDRENfSElCX01PREVfTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDNl9MT1dfUE9XRVIsCisJCQlXTTgzNTBfRENEQ19ISUJfTU9ERV9ESVMpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzI6CisJY2FzZSBXTTgzNTBfRENEQ181OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9kY2RjMjVfc2V0X3N1c3BlbmRfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgdmFsOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18yOgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQzJfQ09OVFJPTCkKKwkJICAgICYgfldNODM1MF9EQzJfSElCX01PREVfTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDMl9DT05UUk9MLCB2YWwgfAorCQkJCSBXTTgzNTBfREMyX0hJQl9NT0RFX0FDVElWRSk7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNToKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM1X0NPTlRST0wpCisJCSAgICAmIH5XTTgzNTBfREMyX0hJQl9NT0RFX01BU0s7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfRENEQzVfQ09OVFJPTCwgdmFsIHwKKwkJCQkgV004MzUwX0RDNV9ISUJfTU9ERV9BQ1RJVkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2RjZGMyNV9zZXRfc3VzcGVuZF9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgdmFsOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18yOgorCQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQzJfQ09OVFJPTCkKKwkJICAgICYgfldNODM1MF9EQzJfSElCX01PREVfTUFTSzsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDMl9DT05UUk9MLCB2YWwgfAorCQkJCSBXTTgzNTBfREMyX0hJQl9NT0RFX0RJU0FCTEUpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzU6CisJCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9EQ0RDNV9DT05UUk9MKQorCQkgICAgJiB+V004MzUwX0RDMl9ISUJfTU9ERV9NQVNLOworCQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0RDREM1X0NPTlRST0wsIHZhbCB8CisJCQkJIFdNODM1MF9EQzJfSElCX01PREVfRElTQUJMRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfZGNkY19zZXRfc3VzcGVuZF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCXVuc2lnbmVkIGludCBtb2RlKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgKmhpYl9tb2RlOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18xOgorCQloaWJfbW9kZSA9ICZ3bTgzNTAtPnBtaWMuZGNkYzFfaGliX21vZGU7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMzoKKwkJaGliX21vZGUgPSAmd204MzUwLT5wbWljLmRjZGMzX2hpYl9tb2RlOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzQ6CisJCWhpYl9tb2RlID0gJndtODM1MC0+cG1pYy5kY2RjNF9oaWJfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ182OgorCQloaWJfbW9kZSA9ICZ3bTgzNTAtPnBtaWMuZGNkYzZfaGliX21vZGU7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMjoKKwljYXNlIFdNODM1MF9EQ0RDXzU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw6CisJCSpoaWJfbW9kZSA9IFdNODM1MF9EQ0RDX0hJQl9NT0RFX0lNQUdFOworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX0lETEU6CisJCSpoaWJfbW9kZSA9IFdNODM1MF9EQ0RDX0hJQl9NT0RFX1NUQU5EQlk7CisJCWJyZWFrOworCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKKwkJKmhpYl9tb2RlID0gV004MzUwX0RDRENfSElCX01PREVfTERPX0lNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfbGRvX3NldF9zdXNwZW5kX3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCB1VikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCB2b2x0X3JlZywgbVYgPSB1ViAvIDEwMDAsIGxkbyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiB2YWw7CisKKwlkZXZfZGJnKHdtODM1MC0+ZGV2LCAiJXMgJWQgbVYgJWRcbiIsIF9fZnVuY19fLCBsZG8sIG1WKTsKKworCWlmIChtViA8IDkwMCB8fCBtViA+IDMzMDApIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkxETyVkIHZvbHRhZ2UgJWQgbVYgb3V0IG9mIHJhbmdlXG4iLAorCQkJbGRvLCBtVik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobGRvKSB7CisJY2FzZSBXTTgzNTBfTERPXzE6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzFfTE9XX1BPV0VSOworCQlicmVhazsKKwljYXNlIFdNODM1MF9MRE9fMjoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfTERPMl9MT1dfUE9XRVI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18zOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8zX0xPV19QT1dFUjsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzQ6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzRfTE9XX1BPV0VSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbGwgTERPcyBoYXZlIHNhbWUgbVYgYml0cyAqLworCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfTERPMV9WU0VMX01BU0s7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIHZvbHRfcmVnLAorCQkJIHZhbCB8IHdtODM1MF9sZG9fbXZvbHRzX3RvX3ZhbChtVikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9sZG9fc2V0X3N1c3BlbmRfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IHZvbHRfcmVnLCBsZG8gPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgdmFsOworCisJc3dpdGNoIChsZG8pIHsKKwljYXNlIFdNODM1MF9MRE9fMToKKwkJdm9sdF9yZWcgPSBXTTgzNTBfTERPMV9MT1dfUE9XRVI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18yOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8yX0xPV19QT1dFUjsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzM6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzNfTE9XX1BPV0VSOworCQlicmVhazsKKwljYXNlIFdNODM1MF9MRE9fNDoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfTERPNF9MT1dfUE9XRVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbCBMRE9zIGhhdmUgc2FtZSBtViBiaXRzICovCisJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgfldNODM1MF9MRE8xX0hJQl9NT0RFX01BU0s7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIHZvbHRfcmVnLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9sZG9fc2V0X3N1c3BlbmRfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCB2b2x0X3JlZywgbGRvID0gcmRldl9nZXRfaWQocmRldik7CisJdTE2IHZhbDsKKworCXN3aXRjaCAobGRvKSB7CisJY2FzZSBXTTgzNTBfTERPXzE6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzFfTE9XX1BPV0VSOworCQlicmVhazsKKwljYXNlIFdNODM1MF9MRE9fMjoKKwkJdm9sdF9yZWcgPSBXTTgzNTBfTERPMl9MT1dfUE9XRVI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18zOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8zX0xPV19QT1dFUjsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzQ6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzRfTE9XX1BPV0VSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbGwgTERPcyBoYXZlIHNhbWUgbVYgYml0cyAqLworCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIH5XTTgzNTBfTERPMV9ISUJfTU9ERV9NQVNLOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCB2b2x0X3JlZywgV004MzUwX0xETzFfSElCX01PREVfRElTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfbGRvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLAorCWludCBtYXhfdVYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgdm9sdF9yZWcsIGxkbyA9IHJkZXZfZ2V0X2lkKHJkZXYpLCBtViwgbWluX21WID0gbWluX3VWIC8gMTAwMCwKKwkJbWF4X21WID0gbWF4X3VWIC8gMTAwMDsKKwl1MTYgdmFsOworCisJaWYgKG1pbl9tViA8IDkwMCB8fCBtaW5fbVYgPiAzMzAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobWF4X21WIDwgOTAwIHx8IG1heF9tViA+IDMzMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1pbl9tViA8IDE4MDApIHsKKwkJLyogc3RlcCBzaXplIGlzIDUwbVYgPCAxODAwbVYgKi8KKwkJbVYgPSAobWluX21WIC0gODUxKSAvIDUwOworCQlpZiAod204MzUwX2xkb192YWxfdG9fbXZvbHRzKG1WKSA+IG1heF9tVikKKwkJCXJldHVybiAtRUlOVkFMOworCQlCVUdfT04od204MzUwX2xkb192YWxfdG9fbXZvbHRzKG1WKSA8IG1pbl9tVik7CisJfSBlbHNlIHsKKwkJLyogc3RlcCBzaXplIGlzIDEwMG1WID4gMTgwMG1WICovCisJCW1WID0gKChtaW5fbVYgLSAxNzAxKSAvIDEwMCkgKyAxNjsKKwkJaWYgKHdtODM1MF9sZG9fdmFsX3RvX212b2x0cyhtVikgPiBtYXhfbVYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJQlVHX09OKHdtODM1MF9sZG9fdmFsX3RvX212b2x0cyhtVikgPCBtaW5fbVYpOworCX0KKworCXN3aXRjaCAobGRvKSB7CisJY2FzZSBXTTgzNTBfTERPXzE6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzFfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzI6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzJfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzM6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzNfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzQ6CisJCXZvbHRfcmVnID0gV004MzUwX0xETzRfQ09OVFJPTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsIExET3MgaGF2ZSBzYW1lIG1WIGJpdHMgKi8KKwl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCB2b2x0X3JlZykgJiB+V004MzUwX0xETzFfVlNFTF9NQVNLOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCB2b2x0X3JlZywgdmFsIHwgbVYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODM1MF9sZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgdm9sdF9yZWcsIGxkbyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiB2YWw7CisKKwlzd2l0Y2ggKGxkbykgeworCWNhc2UgV004MzUwX0xET18xOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8xX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18yOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8yX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18zOgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE8zX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET180OgorCQl2b2x0X3JlZyA9IFdNODM1MF9MRE80X0NPTlRST0w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbCBMRE9zIGhhdmUgc2FtZSBtViBiaXRzICovCisJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgV004MzUwX0xETzFfVlNFTF9NQVNLOworCXJldHVybiB3bTgzNTBfbGRvX3ZhbF90b19tdm9sdHModmFsKSAqIDEwMDA7Cit9CisKK2ludCB3bTgzNTBfZGNkY19zZXRfc2xvdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBkY2RjLCB1MTYgc3RhcnQsCisJCQkgdTE2IHN0b3AsIHUxNiBmYXVsdCkKK3sKKwlpbnQgc2xvdF9yZWc7CisJdTE2IHZhbDsKKworCWRldl9kYmcod204MzUwLT5kZXYsICIlcyAlZCBzdGFydCAlZCBzdG9wICVkXG4iLAorCQlfX2Z1bmNfXywgZGNkYywgc3RhcnQsIHN0b3ApOworCisJLyogc2xvdCB2YWxpZCA/ICovCisJaWYgKHN0YXJ0ID4gMTUgfHwgc3RvcCA+IDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZGNkYykgeworCWNhc2UgV004MzUwX0RDRENfMToKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzFfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMjoKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzJfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMzoKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzNfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNDoKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzRfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNToKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzVfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNjoKKwkJc2xvdF9yZWcgPSBXTTgzNTBfRENEQzZfVElNRU9VVFM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHNsb3RfcmVnKSAmCisJICAgIH4oV004MzUwX0RDMV9FTlNMT1RfTUFTSyB8IFdNODM1MF9EQzFfU0RTTE9UX01BU0sgfAorCSAgICAgIFdNODM1MF9EQzFfRVJSQUNUX01BU0spOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBzbG90X3JlZywKKwkJCSB2YWwgfCAoc3RhcnQgPDwgV004MzUwX0RDMV9FTlNMT1RfU0hJRlQpIHwKKwkJCSAoc3RvcCA8PCBXTTgzNTBfREMxX1NEU0xPVF9TSElGVCkgfAorCQkJIChmYXVsdCA8PCBXTTgzNTBfREMxX0VSUkFDVF9TSElGVCkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfZGNkY19zZXRfc2xvdCk7CisKK2ludCB3bTgzNTBfbGRvX3NldF9zbG90KHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGxkbywgdTE2IHN0YXJ0LCB1MTYgc3RvcCkKK3sKKwlpbnQgc2xvdF9yZWc7CisJdTE2IHZhbDsKKworCWRldl9kYmcod204MzUwLT5kZXYsICIlcyAlZCBzdGFydCAlZCBzdG9wICVkXG4iLAorCQlfX2Z1bmNfXywgbGRvLCBzdGFydCwgc3RvcCk7CisKKwkvKiBzbG90IHZhbGlkID8gKi8KKwlpZiAoc3RhcnQgPiAxNSB8fCBzdG9wID4gMTUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChsZG8pIHsKKwljYXNlIFdNODM1MF9MRE9fMToKKwkJc2xvdF9yZWcgPSBXTTgzNTBfTERPMV9USU1FT1VUUzsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfTERPXzI6CisJCXNsb3RfcmVnID0gV004MzUwX0xETzJfVElNRU9VVFM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0xET18zOgorCQlzbG90X3JlZyA9IFdNODM1MF9MRE8zX1RJTUVPVVRTOworCQlicmVhazsKKwljYXNlIFdNODM1MF9MRE9fNDoKKwkJc2xvdF9yZWcgPSBXTTgzNTBfTERPNF9USU1FT1VUUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgc2xvdF9yZWcpICYgfldNODM1MF9MRE8xX1NEU0xPVF9NQVNLOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBzbG90X3JlZywgdmFsIHwgKChzdGFydCA8PCAxMCkgfCAoc3RvcCA8PCA2KSkpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2xkb19zZXRfc2xvdCk7CisKK2ludCB3bTgzNTBfZGNkYzI1X3NldF9tb2RlKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGRjZGMsIHUxNiBtb2RlLAorCQkJICAgdTE2IGlsaW0sIHUxNiByYW1wLCB1MTYgZmVlZGJhY2spCit7CisJdTE2IHZhbDsKKworCWRldl9kYmcod204MzUwLT5kZXYsICIlcyAlZCBtb2RlOiAlcyAlc1xuIiwgX19mdW5jX18sIGRjZGMsCisJCW1vZGUgPyAibm9ybWFsIiA6ICJib29zdCIsIGlsaW0gPyAibG93IiA6ICJub3JtYWwiKTsKKworCXN3aXRjaCAoZGNkYykgeworCWNhc2UgV004MzUwX0RDRENfMjoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREMyX0NPTlRST0wpCisJCSAgICAmIH4oV004MzUwX0RDMl9NT0RFX01BU0sgfCBXTTgzNTBfREMyX0lMSU1fTUFTSyB8CisJCQlXTTgzNTBfREMyX1JNUF9NQVNLIHwgV004MzUwX0RDMl9GQlNSQ19NQVNLKTsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDMl9DT05UUk9MLCB2YWwgfAorCQkJCSAobW9kZSA8PCBXTTgzNTBfREMyX01PREVfU0hJRlQpIHwKKwkJCQkgKGlsaW0gPDwgV004MzUwX0RDMl9JTElNX1NISUZUKSB8CisJCQkJIChyYW1wIDw8IFdNODM1MF9EQzJfUk1QX1NISUZUKSB8CisJCQkJIChmZWVkYmFjayA8PCBXTTgzNTBfREMyX0ZCU1JDX1NISUZUKSk7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNToKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM1X0NPTlRST0wpCisJCSAgICAmIH4oV004MzUwX0RDNV9NT0RFX01BU0sgfCBXTTgzNTBfREM1X0lMSU1fTUFTSyB8CisJCQlXTTgzNTBfREM1X1JNUF9NQVNLIHwgV004MzUwX0RDNV9GQlNSQ19NQVNLKTsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9EQ0RDNV9DT05UUk9MLCB2YWwgfAorCQkJCSAobW9kZSA8PCBXTTgzNTBfREM1X01PREVfU0hJRlQpIHwKKwkJCQkgKGlsaW0gPDwgV004MzUwX0RDNV9JTElNX1NISUZUKSB8CisJCQkJIChyYW1wIDw8IFdNODM1MF9EQzVfUk1QX1NISUZUKSB8CisJCQkJIChmZWVkYmFjayA8PCBXTTgzNTBfREM1X0ZCU1JDX1NISUZUKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2RjZGMyNV9zZXRfbW9kZSk7CisKK3N0YXRpYyBpbnQgd204MzUwX2RjZGNfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgc2hpZnQ7CisKKwlpZiAoZGNkYyA8IFdNODM1MF9EQ0RDXzEgfHwgZGNkYyA+IFdNODM1MF9EQ0RDXzYpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSBkY2RjIC0gV004MzUwX0RDRENfMTsKKwl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVELCAxIDw8IHNoaWZ0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfZGNkY19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgc2hpZnQ7CisKKwlpZiAoZGNkYyA8IFdNODM1MF9EQ0RDXzEgfHwgZGNkYyA+IFdNODM1MF9EQ0RDXzYpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSBkY2RjIC0gV004MzUwX0RDRENfMTsKKwl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9EQ0RDX0xET19SRVFVRVNURUQsIDEgPDwgc2hpZnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2xkb19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgbGRvID0gcmRldl9nZXRfaWQocmRldik7CisJdTE2IHNoaWZ0OworCisJaWYgKGxkbyA8IFdNODM1MF9MRE9fMSB8fCBsZG8gPiBXTTgzNTBfTERPXzQpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSAobGRvIC0gV004MzUwX0xET18xKSArIDg7CisJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0RDRENfTERPX1JFUVVFU1RFRCwgMSA8PCBzaGlmdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2xkb19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGxkbyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXUxNiBzaGlmdDsKKworCWlmIChsZG8gPCBXTTgzNTBfTERPXzEgfHwgbGRvID4gV004MzUwX0xET180KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNoaWZ0ID0gKGxkbyAtIFdNODM1MF9MRE9fMSkgKyA4OworCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0RDRENfTERPX1JFUVVFU1RFRCwgMSA8PCBzaGlmdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9yY2VfY29udGludW91c19lbmFibGUoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgZGNkYywgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmVnID0gMCwgcmV0OworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18xOgorCQlyZWcgPSBXTTgzNTBfRENEQzFfRk9SQ0VfUFdNOworCQlicmVhazsKKwljYXNlIFdNODM1MF9EQ0RDXzM6CisJCXJlZyA9IFdNODM1MF9EQ0RDM19GT1JDRV9QV007CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNDoKKwkJcmVnID0gV004MzUwX0RDREM0X0ZPUkNFX1BXTTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ182OgorCQlyZWcgPSBXTTgzNTBfRENEQzZfRk9SQ0VfUFdNOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZW5hYmxlKQorCQlyZXQgPSB3bTgzNTBfc2V0X2JpdHMod204MzUwLCByZWcsCisJCQlXTTgzNTBfRENEQzFfRk9SQ0VfUFdNX0VOQSk7CisJZWxzZQorCQlyZXQgPSB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIHJlZywKKwkJCVdNODM1MF9EQ0RDMV9GT1JDRV9QV01fRU5BKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODM1MF9kY2RjX3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCBkY2RjID0gcmRldl9nZXRfaWQocmRldik7CisJdTE2IHZhbDsKKworCWlmIChkY2RjIDwgV004MzUwX0RDRENfMSB8fCBkY2RjID4gV004MzUwX0RDRENfNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGNkYyA9PSBXTTgzNTBfRENEQ18yIHx8IGRjZGMgPT0gV004MzUwX0RDRENfNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgPSAxIDw8IChkY2RjIC0gV004MzUwX0RDRENfMSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6CisJCS8qIGZvcmNlIGNvbnRpbnVvdXMgbW9kZSAqLworCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19BQ1RJVkVfT1BUSU9OUywgdmFsKTsKKwkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19TTEVFUF9PUFRJT05TLCB2YWwpOworCQlmb3JjZV9jb250aW51b3VzX2VuYWJsZSh3bTgzNTAsIGRjZGMsIDEpOworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKKwkJLyogYWN0aXZlIC8gcHVsc2Ugc2tpcHBpbmcgKi8KKwkJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0RDRENfQUNUSVZFX09QVElPTlMsIHZhbCk7CisJCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0RDRENfU0xFRVBfT1BUSU9OUywgdmFsKTsKKwkJZm9yY2VfY29udGludW91c19lbmFibGUod204MzUwLCBkY2RjLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9JRExFOgorCQkvKiBzdGFuZGJ5IG1vZGUgKi8KKwkJZm9yY2VfY29udGludW91c19lbmFibGUod204MzUwLCBkY2RjLCAwKTsKKwkJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfRENEQ19TTEVFUF9PUFRJT05TLCB2YWwpOworCQl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9EQ0RDX0FDVElWRV9PUFRJT05TLCB2YWwpOworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk6CisJCS8qIExETyBtb2RlICovCisJCWZvcmNlX2NvbnRpbnVvdXNfZW5hYmxlKHdtODM1MCwgZGNkYywgMCk7CisJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9EQ0RDX1NMRUVQX09QVElPTlMsIHZhbCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHdtODM1MF9kY2RjX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1MTYgbWFzaywgc2xlZXAsIGFjdGl2ZSwgZm9yY2U7CisJaW50IG1vZGUgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw7CisKKwlpZiAoZGNkYyA8IFdNODM1MF9EQ0RDXzEgfHwgZGNkYyA+IFdNODM1MF9EQ0RDXzYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRjZGMgPT0gV004MzUwX0RDRENfMiB8fCBkY2RjID09IFdNODM1MF9EQ0RDXzUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFzayA9IDEgPDwgKGRjZGMgLSBXTTgzNTBfRENEQ18xKTsKKwlhY3RpdmUgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQ19BQ1RJVkVfT1BUSU9OUykgJiBtYXNrOworCXNsZWVwID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDRENfU0xFRVBfT1BUSU9OUykgJiBtYXNrOworCWZvcmNlID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREMxX0ZPUkNFX1BXTSkKKwkgICAgJiBXTTgzNTBfRENEQzFfRk9SQ0VfUFdNX0VOQTsKKwlkZXZfZGJnKHdtODM1MC0+ZGV2LCAibWFzayAleCBhY3RpdmUgJXggc2xlZXAgJXggZm9yY2UgJXgiLAorCQltYXNrLCBhY3RpdmUsIHNsZWVwLCBmb3JjZSk7CisKKwlpZiAoYWN0aXZlICYmICFzbGVlcCkgeworCQlpZiAoZm9yY2UpCisJCQltb2RlID0gUkVHVUxBVE9SX01PREVfRkFTVDsKKwkJZWxzZQorCQkJbW9kZSA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTDsKKwl9IGVsc2UgaWYgKCFhY3RpdmUgJiYgIXNsZWVwKQorCQltb2RlID0gUkVHVUxBVE9SX01PREVfSURMRTsKKwllbHNlIGlmICghc2xlZXApCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204MzUwX2xkb19nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOworfQorCitzdHJ1Y3Qgd204MzUwX2RjZGNfZWZmaWNpZW5jeSB7CisJaW50IHVBX2xvYWRfbWluOworCWludCB1QV9sb2FkX21heDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd204MzUwX2RjZGNfZWZmaWNpZW5jeSBkY2RjMV82X2VmZmljaWVuY3lbXSA9IHsKKwl7MCwgMTAwMDAsIFJFR1VMQVRPUl9NT0RFX1NUQU5EQll9LCAgICAgICAvKiAwIC0gMTBtQSAtIExETyAqLworCXsxMDAwMCwgMTAwMDAwLCBSRUdVTEFUT1JfTU9ERV9JRExFfSwgICAgIC8qIDEwbUEgLSAxMDBtQSAtIFN0YW5kYnkgKi8KKwl7MTAwMDAwLCAxMDAwMDAwLCBSRUdVTEFUT1JfTU9ERV9OT1JNQUx9LCAvKiA+IDEwMG1BIC0gQWN0aXZlICovCisJey0xLCAtMSwgUkVHVUxBVE9SX01PREVfTk9STUFMfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd204MzUwX2RjZGNfZWZmaWNpZW5jeSBkY2RjM180X2VmZmljaWVuY3lbXSA9IHsKKwl7MCwgMTAwMDAsIFJFR1VMQVRPUl9NT0RFX1NUQU5EQll9LCAgICAgIC8qIDAgLSAxMG1BIC0gTERPICovCisJezEwMDAwLCAxMDAwMDAsIFJFR1VMQVRPUl9NT0RFX0lETEV9LCAgICAvKiAxMG1BIC0gMTAwbUEgLSBTdGFuZGJ5ICovCisJezEwMDAwMCwgODAwMDAwLCBSRUdVTEFUT1JfTU9ERV9OT1JNQUx9LCAvKiA+IDEwMG1BIC0gQWN0aXZlICovCisJey0xLCAtMSwgUkVHVUxBVE9SX01PREVfTk9STUFMfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X21vZGUoaW50IHVBLCBjb25zdCBzdHJ1Y3Qgd204MzUwX2RjZGNfZWZmaWNpZW5jeSAqZWZmKQoreworCWludCBpID0gMDsKKworCXdoaWxlIChlZmZbaV0udUFfbG9hZF9taW4gIT0gLTEpIHsKKwkJaWYgKHVBID49IGVmZltpXS51QV9sb2FkX21pbiAmJiB1QSA8PSBlZmZbaV0udUFfbG9hZF9tYXgpCisJCQlyZXR1cm4gZWZmW2ldLm1vZGU7CisJfQorCXJldHVybiBSRUdVTEFUT1JfTU9ERV9OT1JNQUw7Cit9CisKKy8qIFF1ZXJ5IHRoZSByZWd1bGF0b3IgZm9yIGl0J3MgbW9zdCBlZmZpY2llbnQgbW9kZSBAIHVWLHVBCisgKiBXTTgzNTAgcmVndWxhdG9yIGVmZmljaWVuY3kgaXMgcHJldHR5IHNpbWlsYXIgb3ZlcgorICogZGlmZmVyZW50IGlucHV0IGFuZCBvdXRwdXQgdVYuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204MzUwX2RjZGNfZ2V0X29wdGltdW1fbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJCSBpbnQgaW5wdXRfdVYsIGludCBvdXRwdXRfdVYsCisJCQkJCQkgaW50IG91dHB1dF91QSkKK3sKKwlpbnQgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpLCBtb2RlOworCisJc3dpdGNoIChkY2RjKSB7CisJY2FzZSBXTTgzNTBfRENEQ18xOgorCWNhc2UgV004MzUwX0RDRENfNjoKKwkJbW9kZSA9IGdldF9tb2RlKG91dHB1dF91QSwgZGNkYzFfNl9lZmZpY2llbmN5KTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfRENEQ18zOgorCWNhc2UgV004MzUwX0RDRENfNDoKKwkJbW9kZSA9IGdldF9tb2RlKG91dHB1dF91QSwgZGNkYzNfNF9lZmZpY2llbmN5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbW9kZSA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgaW50IHdtODM1MF9kY2RjX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpLCBzaGlmdDsKKworCWlmIChkY2RjIDwgV004MzUwX0RDRENfMSB8fCBkY2RjID4gV004MzUwX0RDRENfNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaGlmdCA9IGRjZGMgLSBXTTgzNTBfRENEQ18xOworCXJldHVybiB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVEKQorCSAgICAmICgxIDw8IHNoaWZ0KTsKK30KKworc3RhdGljIGludCB3bTgzNTBfbGRvX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgbGRvID0gcmRldl9nZXRfaWQocmRldiksIHNoaWZ0OworCisJaWYgKGxkbyA8IFdNODM1MF9MRE9fMSB8fCBsZG8gPiBXTTgzNTBfTERPXzQpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSAobGRvIC0gV004MzUwX0xET18xKSArIDg7CisJcmV0dXJuIHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9EQ0RDX0xET19SRVFVRVNURUQpCisJICAgICYgKDEgPDwgc2hpZnQpOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgd204MzUwX2RjZGNfb3BzID0geworCS5zZXRfdm9sdGFnZSA9IHdtODM1MF9kY2RjX3NldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZSA9IHdtODM1MF9kY2RjX2dldF92b2x0YWdlLAorCS5lbmFibGUgPSB3bTgzNTBfZGNkY19lbmFibGUsCisJLmRpc2FibGUgPSB3bTgzNTBfZGNkY19kaXNhYmxlLAorCS5nZXRfbW9kZSA9IHdtODM1MF9kY2RjX2dldF9tb2RlLAorCS5zZXRfbW9kZSA9IHdtODM1MF9kY2RjX3NldF9tb2RlLAorCS5nZXRfb3B0aW11bV9tb2RlID0gd204MzUwX2RjZGNfZ2V0X29wdGltdW1fbW9kZSwKKwkuaXNfZW5hYmxlZCA9IHdtODM1MF9kY2RjX2lzX2VuYWJsZWQsCisJLnNldF9zdXNwZW5kX3ZvbHRhZ2UgPSB3bTgzNTBfZGNkY19zZXRfc3VzcGVuZF92b2x0YWdlLAorCS5zZXRfc3VzcGVuZF9lbmFibGUgPSB3bTgzNTBfZGNkY19zZXRfc3VzcGVuZF9lbmFibGUsCisJLnNldF9zdXNwZW5kX2Rpc2FibGUgPSB3bTgzNTBfZGNkY19zZXRfc3VzcGVuZF9kaXNhYmxlLAorCS5zZXRfc3VzcGVuZF9tb2RlID0gd204MzUwX2RjZGNfc2V0X3N1c3BlbmRfbW9kZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzNTBfZGNkYzJfNV9vcHMgPSB7CisJLmVuYWJsZSA9IHdtODM1MF9kY2RjX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHdtODM1MF9kY2RjX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSB3bTgzNTBfZGNkY19pc19lbmFibGVkLAorCS5zZXRfc3VzcGVuZF9lbmFibGUgPSB3bTgzNTBfZGNkYzI1X3NldF9zdXNwZW5kX2VuYWJsZSwKKwkuc2V0X3N1c3BlbmRfZGlzYWJsZSA9IHdtODM1MF9kY2RjMjVfc2V0X3N1c3BlbmRfZGlzYWJsZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzNTBfbGRvX29wcyA9IHsKKwkuc2V0X3ZvbHRhZ2UgPSB3bTgzNTBfbGRvX3NldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZSA9IHdtODM1MF9sZG9fZ2V0X3ZvbHRhZ2UsCisJLmVuYWJsZSA9IHdtODM1MF9sZG9fZW5hYmxlLAorCS5kaXNhYmxlID0gd204MzUwX2xkb19kaXNhYmxlLAorCS5pc19lbmFibGVkID0gd204MzUwX2xkb19pc19lbmFibGVkLAorCS5nZXRfbW9kZSA9IHdtODM1MF9sZG9fZ2V0X21vZGUsCisJLnNldF9zdXNwZW5kX3ZvbHRhZ2UgPSB3bTgzNTBfbGRvX3NldF9zdXNwZW5kX3ZvbHRhZ2UsCisJLnNldF9zdXNwZW5kX2VuYWJsZSA9IHdtODM1MF9sZG9fc2V0X3N1c3BlbmRfZW5hYmxlLAorCS5zZXRfc3VzcGVuZF9kaXNhYmxlID0gd204MzUwX2xkb19zZXRfc3VzcGVuZF9kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHdtODM1MF9pc2lua19vcHMgPSB7CisJLnNldF9jdXJyZW50X2xpbWl0ID0gd204MzUwX2lzaW5rX3NldF9jdXJyZW50LAorCS5nZXRfY3VycmVudF9saW1pdCA9IHdtODM1MF9pc2lua19nZXRfY3VycmVudCwKKwkuZW5hYmxlID0gd204MzUwX2lzaW5rX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHdtODM1MF9pc2lua19kaXNhYmxlLAorCS5pc19lbmFibGVkID0gd204MzUwX2lzaW5rX2lzX2VuYWJsZWQsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHdtODM1MF9yZWdbTlVNX1dNODM1MF9SRUdVTEFUT1JTXSA9IHsKKwl7CisJCS5uYW1lID0gIkRDREMxIiwKKwkJLmlkID0gV004MzUwX0RDRENfMSwKKwkJLm9wcyA9ICZ3bTgzNTBfZGNkY19vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0RDMSwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMyIiwKKwkJLmlkID0gV004MzUwX0RDRENfMiwKKwkJLm9wcyA9ICZ3bTgzNTBfZGNkYzJfNV9vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0RDMiwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMzIiwKKwkJLmlkID0gV004MzUwX0RDRENfMywKKwkJLm9wcyA9ICZ3bTgzNTBfZGNkY19vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0RDMywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREM0IiwKKwkJLmlkID0gV004MzUwX0RDRENfNCwKKwkJLm9wcyA9ICZ3bTgzNTBfZGNkY19vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0RDNCwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREM1IiwKKwkJLmlkID0gV004MzUwX0RDRENfNSwKKwkJLm9wcyA9ICZ3bTgzNTBfZGNkYzJfNV9vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0RDNSwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJIH0sCisJeworCQkubmFtZSA9ICJEQ0RDNiIsCisJCS5pZCA9IFdNODM1MF9EQ0RDXzYsCisJCS5vcHMgPSAmd204MzUwX2RjZGNfb3BzLAorCQkuaXJxID0gV004MzUwX0lSUV9VVl9EQzYsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xIiwKKwkJLmlkID0gV004MzUwX0xET18xLAorCQkub3BzID0gJndtODM1MF9sZG9fb3BzLAorCQkuaXJxID0gV004MzUwX0lSUV9VVl9MRE8xLAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPMiIsCisJCS5pZCA9IFdNODM1MF9MRE9fMiwKKwkJLm9wcyA9ICZ3bTgzNTBfbGRvX29wcywKKwkJLmlycSA9IFdNODM1MF9JUlFfVVZfTERPMiwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzMiLAorCQkuaWQgPSBXTTgzNTBfTERPXzMsCisJCS5vcHMgPSAmd204MzUwX2xkb19vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX1VWX0xETzMsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSA9ICJMRE80IiwKKwkJLmlkID0gV004MzUwX0xET180LAorCQkub3BzID0gJndtODM1MF9sZG9fb3BzLAorCQkuaXJxID0gV004MzUwX0lSUV9VVl9MRE80LAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSVNJTktBIiwKKwkJLmlkID0gV004MzUwX0lTSU5LX0EsCisJCS5vcHMgPSAmd204MzUwX2lzaW5rX29wcywKKwkJLmlycSA9IFdNODM1MF9JUlFfQ1MxLAorCQkudHlwZSA9IFJFR1VMQVRPUl9DVVJSRU5ULAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkgfSwKKwl7CisJCS5uYW1lID0gIklTSU5LQiIsCisJCS5pZCA9IFdNODM1MF9JU0lOS19CLAorCQkub3BzID0gJndtODM1MF9pc2lua19vcHMsCisJCS5pcnEgPSBXTTgzNTBfSVJRX0NTMiwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfQ1VSUkVOVCwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJIH0sCit9OworCitzdGF0aWMgdm9pZCBwbWljX3V2X2hhbmRsZXIoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopZGF0YTsKKworCWlmIChpcnEgPT0gV004MzUwX0lSUV9DUzEgfHwgaXJxID09IFdNODM1MF9JUlFfQ1MyKQorCQlyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihyZGV2LAorCQkJCQkgICAgICBSRUdVTEFUT1JfRVZFTlRfUkVHVUxBVElPTl9PVVQsCisJCQkJCSAgICAgIHdtODM1MCk7CisJZWxzZQorCQlyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihyZGV2LAorCQkJCQkgICAgICBSRUdVTEFUT1JfRVZFTlRfVU5ERVJfVk9MVEFHRSwKKwkJCQkJICAgICAgd204MzUwKTsKK30KKworc3RhdGljIGludCB3bTgzNTBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCWludCByZXQ7CisJdTE2IHZhbDsKKworCWlmIChwZGV2LT5pZCA8IFdNODM1MF9EQ0RDXzEgfHwgcGRldi0+aWQgPiBXTTgzNTBfSVNJTktfQikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBkbyBhbnkgcmVndWxhdGlvciBzcGVjaWZpYyBpbml0ICovCisJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgV004MzUwX0RDRENfMToKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREMxX0xPV19QT1dFUik7CisJCXdtODM1MC0+cG1pYy5kY2RjMV9oaWJfbW9kZSA9IHZhbCAmIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfMzoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREMzX0xPV19QT1dFUik7CisJCXdtODM1MC0+cG1pYy5kY2RjM19oaWJfbW9kZSA9IHZhbCAmIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNDoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM0X0xPV19QT1dFUik7CisJCXdtODM1MC0+cG1pYy5kY2RjNF9oaWJfbW9kZSA9IHZhbCAmIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0RDRENfNjoKKwkJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RDREM2X0xPV19QT1dFUik7CisJCXdtODM1MC0+cG1pYy5kY2RjNl9oaWJfbW9kZSA9IHZhbCAmIFdNODM1MF9EQ0RDX0hJQl9NT0RFX01BU0s7CisJCWJyZWFrOworCX0KKworCisJLyogcmVnaXN0ZXIgcmVndWxhdG9yICovCisJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3Rlcigmd204MzUwX3JlZ1twZGV2LT5pZF0sICZwZGV2LT5kZXYsCisJCQkJICBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldikpOworCWlmIChJU19FUlIocmRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAorCQkJd204MzUwX3JlZ1twZGV2LT5pZF0ubmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCX0KKworCS8qIHJlZ2lzdGVyIHJlZ3VsYXRvciBJUlEgKi8KKwlyZXQgPSB3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgd204MzUwX3JlZ1twZGV2LT5pZF0uaXJxLAorCQkJCSAgcG1pY191dl9oYW5kbGVyLCByZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlcyBJUlFcbiIsCisJCQl3bTgzNTBfcmVnW3BkZXYtPmlkXS5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIHdtODM1MF9yZWdbcGRldi0+aWRdLmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIHdtODM1MF9yZWdbcGRldi0+aWRdLmlycSk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgd204MzUwX3JlZ1twZGV2LT5pZF0uaXJxKTsKKworCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHJkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3bTgzNTBfcmVnaXN0ZXJfcmVndWxhdG9yKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHJlZywKKwkJCSAgICAgIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0ZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCByZXQ7CisKKwlpZiAod204MzUwLT5wbWljLnBkZXZbcmVnXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIndtODM1MC1yZWd1bGF0b3IiLCByZWcpOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTgzNTAtPnBtaWMucGRldltyZWddID0gcGRldjsKKworCWluaXRkYXRhLT5kcml2ZXJfZGF0YSA9IHdtODM1MDsKKworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gaW5pdGRhdGE7CisJcGRldi0+ZGV2LnBhcmVudCA9IHdtODM1MC0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdtODM1MCk7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVkOiAlZFxuIiwKKwkJCXJlZywgcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX2RlbChwZGV2KTsKKwkJd204MzUwLT5wbWljLnBkZXZbcmVnXSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdpc3Rlcl9yZWd1bGF0b3IpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3bTgzNTBfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkucHJvYmUgPSB3bTgzNTBfcmVndWxhdG9yX3Byb2JlLAorCS5yZW1vdmUgPSB3bTgzNTBfcmVndWxhdG9yX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAid204MzUwLXJlZ3VsYXRvciIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdtODM1MF9yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODM1MF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh3bTgzNTBfcmVndWxhdG9yX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgd204MzUwX3JlZ3VsYXRvcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtODM1MF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtODM1MF9yZWd1bGF0b3JfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXTTgzNTAgdm9sdGFnZSBhbmQgY3VycmVudCByZWd1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiMzcyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODQwMC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIFJlZ3VsYXRvciBzdXBwb3J0IGZvciBXTTg0MDAKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204NDAwLXByaXZhdGUuaD4KKworc3RhdGljIGludCB3bTg0MDBfbGRvX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgd204NDAwICp3bTg0MDAgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKworCXZhbCA9IHdtODQwMF9yZWdfcmVhZCh3bTg0MDAsIFdNODQwMF9MRE8xX0NPTlRST0wgKyByZGV2X2dldF9pZChkZXYpKTsKKwlyZXR1cm4gKHZhbCAmIFdNODQwMF9MRE8xX0VOQSkgIT0gMDsKK30KKworc3RhdGljIGludCB3bTg0MDBfbGRvX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB3bTg0MDAgKndtODQwMCA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiB3bTg0MDBfc2V0X2JpdHMod204NDAwLCBXTTg0MDBfTERPMV9DT05UUk9MICsgcmRldl9nZXRfaWQoZGV2KSwKKwkJCSAgICAgICBXTTg0MDBfTERPMV9FTkEsIFdNODQwMF9MRE8xX0VOQSk7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2xkb19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9MRE8xX0NPTlRST0wgKyByZGV2X2dldF9pZChkZXYpLAorCQkJICAgICAgIFdNODQwMF9MRE8xX0VOQSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2xkb19nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB3bTg0MDAgKndtODQwMCA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MTYgdmFsOworCisJdmFsID0gd204NDAwX3JlZ19yZWFkKHdtODQwMCwgV004NDAwX0xETzFfQ09OVFJPTCArIHJkZXZfZ2V0X2lkKGRldikpOworCXZhbCAmPSBXTTg0MDBfTERPMV9WU0VMX01BU0s7CisKKwlpZiAodmFsIDwgMTUpCisJCXJldHVybiA5MDAwMDAgKyAodmFsICogNTAwMDApOworCWVsc2UKKwkJcmV0dXJuIDE2MDAwMDAgKyAoKHZhbCAtIDE0KSAqIDEwMDAwMCk7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKK3sKKwlzdHJ1Y3Qgd204NDAwICp3bTg0MDAgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKworCWlmIChtaW5fdVYgPCA5MDAwMDAgfHwgbWluX3VWID4gMzMwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobWluX3VWIDwgMTcwMDAwMCkgeworCQkvKiBTdGVwcyBvZiA1MG1WIGZyb20gOTAwbVY7ICAqLworCQl2YWwgPSAobWluX3VWIC0gODUwMDAxKSAvIDUwMDAwOworCisJCWlmICgodmFsICogNTAwMDApICsgOTAwMDAwID4gbWF4X3VWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCUJVR19PTigodmFsICogNTAwMDApICsgOTAwMDAwIDwgbWluX3VWKTsKKwl9IGVsc2UgeworCQkvKiBTdGVwcyBvZiAxMDBtViBmcm9tIDE3MDBtViAqLworCQl2YWwgPSAoKG1pbl91ViAtIDE2MDAwMDEpIC8gMTAwMDAwKTsKKworCQlpZiAoKHZhbCAqIDEwMDAwMCkgKyAxNzAwMDAwID4gbWF4X3VWKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCUJVR19PTigodmFsICogMTAwMDAwKSArIDE3MDAwMDAgPCBtaW5fdVYpOworCisJCXZhbCArPSAweGY7CisJfQorCisJcmV0dXJuIHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9MRE8xX0NPTlRST0wgKyByZGV2X2dldF9pZChkZXYpLAorCQkJICAgICAgIFdNODQwMF9MRE8xX1ZTRUxfTUFTSywgdmFsKTsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHdtODQwMF9sZG9fb3BzID0geworCS5pc19lbmFibGVkID0gd204NDAwX2xkb19pc19lbmFibGVkLAorCS5lbmFibGUgPSB3bTg0MDBfbGRvX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHdtODQwMF9sZG9fZGlzYWJsZSwKKwkuZ2V0X3ZvbHRhZ2UgPSB3bTg0MDBfbGRvX2dldF92b2x0YWdlLAorCS5zZXRfdm9sdGFnZSA9IHdtODQwMF9sZG9fc2V0X3ZvbHRhZ2UsCit9OworCitzdGF0aWMgaW50IHdtODQwMF9kY2RjX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgd204NDAwICp3bTg0MDAgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG9mZnNldCA9IChyZGV2X2dldF9pZChkZXYpIC0gV004NDAwX0RDREMxKSAqIDI7CisJdTE2IHZhbDsKKworCXZhbCA9IHdtODQwMF9yZWdfcmVhZCh3bTg0MDAsIFdNODQwMF9EQ0RDMV9DT05UUk9MXzEgKyBvZmZzZXQpOworCXJldHVybiAodmFsICYgV004NDAwX0RDMV9FTkEpICE9IDA7Cit9CisKK3N0YXRpYyBpbnQgd204NDAwX2RjZGNfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBvZmZzZXQgPSAocmRldl9nZXRfaWQoZGV2KSAtIFdNODQwMF9EQ0RDMSkgKiAyOworCisJcmV0dXJuIHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9EQ0RDMV9DT05UUk9MXzEgKyBvZmZzZXQsCisJCQkgICAgICAgV004NDAwX0RDMV9FTkEsIFdNODQwMF9EQzFfRU5BKTsKK30KKworc3RhdGljIGludCB3bTg0MDBfZGNkY19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBvZmZzZXQgPSAocmRldl9nZXRfaWQoZGV2KSAtIFdNODQwMF9EQ0RDMSkgKiAyOworCisJcmV0dXJuIHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9EQ0RDMV9DT05UUk9MXzEgKyBvZmZzZXQsCisJCQkgICAgICAgV004NDAwX0RDMV9FTkEsIDApOworfQorCitzdGF0aWMgaW50IHdtODQwMF9kY2RjX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiB2YWw7CisJaW50IG9mZnNldCA9IChyZGV2X2dldF9pZChkZXYpIC0gV004NDAwX0RDREMxKSAqIDI7CisKKwl2YWwgPSB3bTg0MDBfcmVnX3JlYWQod204NDAwLCBXTTg0MDBfRENEQzFfQ09OVFJPTF8xICsgb2Zmc2V0KTsKKwl2YWwgJj0gV004NDAwX0RDMV9WU0VMX01BU0s7CisKKwlyZXR1cm4gODUwMDAwICsgKDI1MDAwICogdmFsKTsKK30KKworc3RhdGljIGludCB3bTg0MDBfZGNkY19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKK3sKKwlzdHJ1Y3Qgd204NDAwICp3bTg0MDAgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKwlpbnQgb2Zmc2V0ID0gKHJkZXZfZ2V0X2lkKGRldikgLSBXTTg0MDBfRENEQzEpICogMjsKKworCWlmIChtaW5fdVYgPCA4NTAwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gKG1pbl91ViAtIDgyNTAwMSkgLyAyNTAwMDsKKworCWlmICg4NTAwMDAgKyAoMjUwMDAgKiB2YWwpID4gbWF4X3VWKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlCVUdfT04oODUwMDAwICsgKDI1MDAwICogdmFsKSA8IG1pbl91Vik7CisKKwlyZXR1cm4gd204NDAwX3NldF9iaXRzKHdtODQwMCwgV004NDAwX0RDREMxX0NPTlRST0xfMSArIG9mZnNldCwKKwkJCSAgICAgICBXTTg0MDBfREMxX1ZTRUxfTUFTSywgdmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB3bTg0MDBfZGNkY19nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB3bTg0MDAgKndtODQwMCA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgb2Zmc2V0ID0gKHJkZXZfZ2V0X2lkKGRldikgLSBXTTg0MDBfRENEQzEpICogMjsKKwl1MTYgZGF0YVsyXTsKKwlpbnQgcmV0OworCisJcmV0ID0gd204NDAwX2Jsb2NrX3JlYWQod204NDAwLCBXTTg0MDBfRENEQzFfQ09OVFJPTF8xICsgb2Zmc2V0LCAyLAorCQkJCWRhdGEpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBEYXRhc2hlZXQ6IGhpYmVybmF0ZSAqLworCWlmIChkYXRhWzBdICYgV004NDAwX0RDMV9TTEVFUCkKKwkJcmV0dXJuIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk7CisKKwkvKiBEYXRhc2hlZXQ6IHN0YW5kYnkgKi8KKwlpZiAoIShkYXRhWzBdICYgV004NDAwX0RDMV9BQ1RJVkUpKQorCQlyZXR1cm4gUkVHVUxBVE9SX01PREVfSURMRTsKKworCS8qIERhdGFzaGVldDogYWN0aXZlIHdpdGggb3Igd2l0aG91dCBmb3JjZSBQV00gKi8KKwlpZiAoZGF0YVsxXSAmIFdNODQwMF9EQzFfRlJDX1BXTSkKKwkJcmV0dXJuIFJFR1VMQVRPUl9NT0RFX0ZBU1Q7CisJZWxzZQorCQlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOworfQorCitzdGF0aWMgaW50IHdtODQwMF9kY2RjX3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXN0cnVjdCB3bTg0MDAgKndtODQwMCA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgb2Zmc2V0ID0gKHJkZXZfZ2V0X2lkKGRldikgLSBXTTg0MDBfRENEQzEpICogMjsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCQkvKiBEYXRhc2hlZXQ6IGFjdGl2ZSB3aXRoIGZvcmNlIFBXTSAqLworCQlyZXQgPSB3bTg0MDBfc2V0X2JpdHMod204NDAwLCBXTTg0MDBfRENEQzFfQ09OVFJPTF8yICsgb2Zmc2V0LAorCQkJCSAgICAgIFdNODQwMF9EQzFfRlJDX1BXTSwgV004NDAwX0RDMV9GUkNfUFdNKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gd204NDAwX3NldF9iaXRzKHdtODQwMCwgV004NDAwX0RDREMxX0NPTlRST0xfMSArIG9mZnNldCwKKwkJCQkgICAgICAgV004NDAwX0RDMV9BQ1RJVkUgfCBXTTg0MDBfREMxX1NMRUVQLAorCQkJCSAgICAgICBXTTg0MDBfREMxX0FDVElWRSk7CisKKwljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKKwkJLyogRGF0YXNoZWV0OiBhY3RpdmUgKi8KKwkJcmV0ID0gd204NDAwX3NldF9iaXRzKHdtODQwMCwgV004NDAwX0RDREMxX0NPTlRST0xfMiArIG9mZnNldCwKKwkJCQkgICAgICBXTTg0MDBfREMxX0ZSQ19QV00sIDApOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiB3bTg0MDBfc2V0X2JpdHMod204NDAwLCBXTTg0MDBfRENEQzFfQ09OVFJPTF8xICsgb2Zmc2V0LAorCQkJCSAgICAgICBXTTg0MDBfREMxX0FDVElWRSB8IFdNODQwMF9EQzFfU0xFRVAsCisJCQkJICAgICAgIFdNODQwMF9EQzFfQUNUSVZFKTsKKworCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKKwkJLyogRGF0YXNoZWV0OiBzdGFuZGJ5ICovCisJCXJldCA9IHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9EQ0RDMV9DT05UUk9MXzEgKyBvZmZzZXQsCisJCQkJICAgICAgV004NDAwX0RDMV9BQ1RJVkUsIDApOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gd204NDAwX3NldF9iaXRzKHdtODQwMCwgV004NDAwX0RDREMxX0NPTlRST0xfMSArIG9mZnNldCwKKwkJCQkgICAgICAgV004NDAwX0RDMV9TTEVFUCwgMCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204NDAwX2RjZGNfZ2V0X29wdGltdW1fbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkJIGludCBpbnB1dF91ViwgaW50IG91dHB1dF91ViwKKwkJCQkJCSBpbnQgbG9hZF91QSkKK3sKKwlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgd204NDAwX2RjZGNfb3BzID0geworCS5pc19lbmFibGVkID0gd204NDAwX2RjZGNfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gd204NDAwX2RjZGNfZW5hYmxlLAorCS5kaXNhYmxlID0gd204NDAwX2RjZGNfZGlzYWJsZSwKKwkuZ2V0X3ZvbHRhZ2UgPSB3bTg0MDBfZGNkY19nZXRfdm9sdGFnZSwKKwkuc2V0X3ZvbHRhZ2UgPSB3bTg0MDBfZGNkY19zZXRfdm9sdGFnZSwKKwkuZ2V0X21vZGUgPSB3bTg0MDBfZGNkY19nZXRfbW9kZSwKKwkuc2V0X21vZGUgPSB3bTg0MDBfZGNkY19zZXRfbW9kZSwKKwkuZ2V0X29wdGltdW1fbW9kZSA9IHdtODQwMF9kY2RjX2dldF9vcHRpbXVtX21vZGUsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIkxETzEiLAorCQkuaWQgPSBXTTg0MDBfTERPMSwKKwkJLm9wcyA9ICZ3bTg0MDBfbGRvX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzIiLAorCQkuaWQgPSBXTTg0MDBfTERPMiwKKwkJLm9wcyA9ICZ3bTg0MDBfbGRvX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzMiLAorCQkuaWQgPSBXTTg0MDBfTERPMywKKwkJLm9wcyA9ICZ3bTg0MDBfbGRvX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzQiLAorCQkuaWQgPSBXTTg0MDBfTERPNCwKKwkJLm9wcyA9ICZ3bTg0MDBfbGRvX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMxIiwKKwkJLmlkID0gV004NDAwX0RDREMxLAorCQkub3BzID0gJndtODQwMF9kY2RjX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMyIiwKKwkJLmlkID0gV004NDAwX0RDREMyLAorCQkub3BzID0gJndtODQwMF9kY2RjX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdtODQwMF9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKworCXJkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJnJlZ3VsYXRvcnNbcGRldi0+aWRdLCAmcGRldi0+ZGV2LAorCQlwZGV2LT5kZXYuZHJpdmVyX2RhdGEpOworCisJaWYgKElTX0VSUihyZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIocmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204NDAwX3JlZ3VsYXRvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmVndWxhdG9yX3VucmVnaXN0ZXIocmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204NDAwX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid204NDAwLXJlZ3VsYXRvciIsCisJfSwKKwkucHJvYmUgPSB3bTg0MDBfcmVndWxhdG9yX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh3bTg0MDBfcmVndWxhdG9yX3JlbW92ZSksCit9OworCisvKioKKyAqIHdtODQwMF9yZWdpc3Rlcl9yZWd1bGF0b3IgLSBlbmFibGUgc29mdHdhcmUgY29udHJvbCBvZiBhIFdNODQwMCByZWd1bGF0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgc29mdHdhcmUgY29udHJvbCBvZiBhIFdNODQwMCByZWd1bGF0b3IgdmlhCisgKiB0aGUgcmVndWxhdG9yIEFQSS4gIEl0IGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZQorICogcGxhdGZvcm1faW5pdCgpIGNhbGxiYWNrIG9mIHRoZSBXTTg0MDAgTUZEIGRyaXZlci4KKyAqCisgKiBAcGFyYW0gZGV2ICAgICAgVGhlIFdNODQwMCBkZXZpY2UgdG8gb3BlcmF0ZSBvbi4KKyAqIEBwYXJhbSByZWcgICAgICBUaGUgcmVndWxhdG9yIHRvIGNvbnRyb2wuCisgKiBAcGFyYW0gaW5pdGRhdGEgUmVndWxhdG9yIGluaXRkYXRhIGZvciB0aGUgcmVndWxhdG9yLgorICovCitpbnQgd204NDAwX3JlZ2lzdGVyX3JlZ3VsYXRvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsCisJCQkgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdGRhdGEpCit7CisJc3RydWN0IHdtODQwMCAqd204NDAwID0gZGV2LT5kcml2ZXJfZGF0YTsKKworCWlmICh3bTg0MDAtPnJlZ3VsYXRvcnNbcmVnXS5uYW1lKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW5pdGRhdGEtPmRyaXZlcl9kYXRhID0gd204NDAwOworCisJd204NDAwLT5yZWd1bGF0b3JzW3JlZ10ubmFtZSA9ICJ3bTg0MDAtcmVndWxhdG9yIjsKKwl3bTg0MDAtPnJlZ3VsYXRvcnNbcmVnXS5pZCA9IHJlZzsKKwl3bTg0MDAtPnJlZ3VsYXRvcnNbcmVnXS5kZXYucGFyZW50ID0gZGV2OworCXdtODQwMC0+cmVndWxhdG9yc1tyZWddLmRldi5kcml2ZXJfZGF0YSA9IHdtODQwMDsKKwl3bTg0MDAtPnJlZ3VsYXRvcnNbcmVnXS5kZXYucGxhdGZvcm1fZGF0YSA9IGluaXRkYXRhOworCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd204NDAwLT5yZWd1bGF0b3JzW3JlZ10pOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204NDAwX3JlZ2lzdGVyX3JlZ3VsYXRvcik7CisKK3N0YXRpYyBpbnQgX19pbml0IHdtODQwMF9yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndtODQwMF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtODQwMF9yZWd1bGF0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTg0MDBfcmVndWxhdG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd204NDAwX3JlZ3VsYXRvcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod204NDAwX3JlZ3VsYXRvcl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldNODQwMCByZWd1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODQwMC1yZWd1bGF0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDlhOTc1NWMuLmY2NjBlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMjIwLDIyICsyMjAsMjIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wY2Y4NTgzLgogCiBjb25maWcgUlRDX0RSVl9NNDFUODAKLQl0cmlzdGF0ZSAiU1QgTTQxVDgwLzgxLzgyLzgzLzg0Lzg1Lzg3IgorCXRyaXN0YXRlICJTVCBNNDFUNjUvTTQxVDgwLzgxLzgyLzgzLzg0Lzg1Lzg3IgogCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIFNUIE00MVQ4MCBSVEMgY2hpcHMgc2VyaWVzLiBDdXJyZW50bHkgZm9sbG93aW5nIGNoaXBzIGFyZQotCSAgc3VwcG9ydGVkOiBNNDFUODAsIE00MVQ4MSwgTTQxVDgyLCBNNDFUODMsIE00MVNUODQsIE00MVNUODUKLQkgIGFuZCBNNDFTVDg3LgorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTVCBNNDFUNjAKKwkgIGFuZCBNNDFUODAgUlRDIGNoaXBzIHNlcmllcy4gQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGNoaXBzIGFyZQorCSAgc3VwcG9ydGVkOiBNNDFUNjUsIE00MVQ4MCwgTTQxVDgxLCBNNDFUODIsIE00MVQ4MywgTTQxU1Q4NCwKKwkgIE00MVNUODUsIGFuZCBNNDFTVDg3LgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tNDF0ODAuCiAKIGNvbmZpZyBSVENfRFJWX000MVQ4MF9XRFQKLQlib29sICJTVCBNNDFUODAgc2VyaWVzIFJUQyB3YXRjaGRvZyB0aW1lciIKKwlib29sICJTVCBNNDFUNjUvTTQxVDgwIHNlcmllcyBSVEMgd2F0Y2hkb2cgdGltZXIiCiAJZGVwZW5kcyBvbiBSVENfRFJWX000MVQ4MAogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIHdhdGNoZG9nIHRpbWVyIGluIFNUIE00MVQ4MCBSVEMgY2hpcHMgc2VyaWVzLgorCSAgd2F0Y2hkb2cgdGltZXIgaW4gdGhlIFNUIE00MVQ2MCBhbmQgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuCiAKIGNvbmZpZyBSVENfRFJWX1RXTDkyMzMwCiAJYm9vbGVhbiAiVEkgVFdMOTIzMzAvTWVuZWxhdXMiCkBAIC0zMTksNiArMzE5LDE1IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1yczVjMzQ4LgogCitjb25maWcgUlRDX0RSVl9EUzMyMzQKKwl0cmlzdGF0ZSAiTWF4aW0vRGFsbGFzIERTMzIzNCIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBNYXhpbS9EYWxsYXMgRFMzMjM0IFNQSSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMzMjM0LgorCiBlbmRpZiAjIFNQSV9NQVNURVIKIAogY29tbWVudCAiUGxhdGZvcm0gUlRDIGRyaXZlcnMiCkBAIC0zMjksNyArMzM4LDcgQEAKIAogY29uZmlnIFJUQ19EUlZfQ01PUwogCXRyaXN0YXRlICJQQy1zdHlsZSAnQ01PUyciCi0JZGVwZW5kcyBvbiBYODYgfHwgQUxQSEEgfHwgQVJNIHx8IE0zMlIgfHwgQVRBUkkgfHwgUFBDIHx8IE1JUFMKKwlkZXBlbmRzIG9uIFg4NiB8fCBBTFBIQSB8fCBBUk0gfHwgTTMyUiB8fCBBVEFSSSB8fCBQUEMgfHwgTUlQUyB8fCBTUEFSQzY0CiAJZGVmYXVsdCB5IGlmIFg4NgogCWhlbHAKIAkgIFNheSAieWVzIiBoZXJlIHRvIGdldCBkaXJlY3Qgc3VwcG9ydCBmb3IgdGhlIHJlYWwgdGltZSBjbG9jawpAQCAtMzUyLDYgKzM2MSwxMSBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgRGFsbGFzIERTMTIxNiBSVEMgY2hpcHMuCiAKK2NvbmZpZyBSVENfRFJWX0RTMTI4NgorCXRyaXN0YXRlICJEYWxsYXMgRFMxMjg2IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgRGFsbGFzIERTMTI4NiBSVEMgY2hpcHMuCisKIGNvbmZpZyBSVENfRFJWX0RTMTMwMgogCXRyaXN0YXRlICJEYWxsYXMgRFMxMzAyIgogCWRlcGVuZHMgb24gU0hfU0VDVVJFRURHRTU0MTAKQEAgLTQwNSwxNSArNDE5LDM2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tNDh0ODYuCiAKLWNvbmZpZyBSVENfRFJWX000OFQ1OQotCXRyaXN0YXRlICJTVCBNNDhUNTkiCitjb25maWcgUlRDX0RSVl9NNDhUMzUKKwl0cmlzdGF0ZSAiU1QgTTQ4VDM1IgogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIFNUIE00OFQ1OSBSVEMgY2hpcC4KKwkgIFNUIE00OFQzNSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCAicnRjLW00OHQzNSIuCisKK2NvbmZpZyBSVENfRFJWX000OFQ1OQorCXRyaXN0YXRlICJTVCBNNDhUNTkvTTQ4VDA4L000OFQwMiIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBTVCBNNDhUNTkgUlRDIGNoaXAgYW5kIGNvbXBhdGlibGUgU1QgTTQ4VDA4IGFuZCBNNDhUMDIuCisKKwkgIFRoZXNlIGNoaXBzIGFyZSB1c3VhbGx5IGZvdW5kIGluIFN1biBTUEFSQyBhbmQgVWx0cmFTUEFSQworCSAgd29ya3N0YXRpb25zLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZSwgaWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkICJydGMtbTQ4dDU5Ii4KIAorY29uZmlnIFJUQ19EUlZfQlE0ODAyCisJdHJpc3RhdGUgIlRJIEJRNDgwMiIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIFRJCisJICBCUTQ4MDIgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWJxNDgwMi4KKwogY29uZmlnIFJUQ19EUlZfVjMwMjAKIAl0cmlzdGF0ZSAiRU0gTWljcm9lbGVjdHJvbmljIFYzMDIwIgogCWhlbHAKQEAgLTU3NywxMCArNjEyLDI0IEBACiAKIGNvbmZpZyBSVENfRFJWX1BQQwogICAgICAgIHRyaXN0YXRlICJQb3dlclBDIG1hY2hpbmUgZGVwZW5kZW50IFJUQyBzdXBwb3J0IgotICAgICAgIGRlcGVuZHMgb24gUFBDX01FUkdFCisgICAgICAgZGVwZW5kcyBvbiBQUEMKICAgICAgICBoZWxwCiAJIFRoZSBQb3dlclBDIGtlcm5lbCBoYXMgbWFjaGluZS1zcGVjaWZpYyBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZwogCSB0aGUgUlRDLiBUaGlzIGV4cG9zZXMgdGhhdCBmdW5jdGlvbmFsaXR5IHRocm91Z2ggdGhlIGdlbmVyaWMgUlRDCiAJIGNsYXNzLgogCitjb25maWcgUlRDX0RSVl9TVU40VgorCWJvb2wgIlNVTjRWIEh5cGVydmlzb3IgUlRDIgorCWRlcGVuZHMgb24gU1BBUkM2NAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgSHlwZXJ2aXNvcgorCSAgYmFzZWQgUlRDIG9uIFNVTjRWIHN5c3RlbXMuCisKK2NvbmZpZyBSVENfRFJWX1NUQVJGSVJFCisJYm9vbCAiU3RhcmZpcmUgUlRDIgorCWRlcGVuZHMgb24gU1BBUkM2NAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIGZvdW5kIG9uCisJICBTdGFyZmlyZSBzeXN0ZW1zLgorCiBlbmRpZiAjIFJUQ19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCAxODYyMmVmLi5kMDU5MjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMjMsNiArMjMsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfQkZJTikJKz0gcnRjLWJmaW4ubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQ01PUykJKz0gcnRjLWNtb3Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMjE2KQkrPSBydGMtZHMxMjE2Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTI4NikJKz0gcnRjLWRzMTI4Ni5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzEzMDIpCSs9IHJ0Yy1kczEzMDIubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMzA1KQkrPSBydGMtZHMxMzA1Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNykJKz0gcnRjLWRzMTMwNy5vCkBAIC0zMSwxMyArMzIsMTggQEAKIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTU1MykJKz0gcnRjLWRzMTU1My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE2NzIpCSs9IHJ0Yy1kczE2NzIubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNzQyKQkrPSBydGMtZHMxNzQyLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMzIzNCkJKz0gcnRjLWRzMzIzNC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9FUDkzWFgpCSs9IHJ0Yy1lcDkzeHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRk0zMTMwKQkrPSBydGMtZm0zMTMwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0lTTDEyMDgpCSs9IHJ0Yy1pc2wxMjA4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX000MVQ4MCkJKz0gcnRjLW00MXQ4MC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NNDFUOTQpCSs9IHJ0Yy1tNDF0OTQubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDM1KQkrPSBydGMtbTQ4dDM1Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX000OFQ1OSkJKz0gcnRjLW00OHQ1OS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NNDhUODYpCSs9IHJ0Yy1tNDh0ODYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQlE0ODAyKQkrPSBydGMtYnE0ODAyLm8KK29iai0kKENPTkZJR19SVENfRFJWX1NVTjRWKQkrPSBydGMtc3VuNHYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RBUkZJUkUpCSs9IHJ0Yy1zdGFyZmlyZS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAwKQkrPSBydGMtbWF4NjkwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAyKQkrPSBydGMtbWF4NjkwMi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9PTUFQKQkrPSBydGMtb21hcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jIGIvZHJpdmVycy9ydGMvcnRjLWF0OTFybTkyMDAuYwppbmRleCA0ZTg4OGNjLi4zNzA4MjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDkxcm05MjAwLmMKQEAgLTI5LDEwICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKICNpbmNsdWRlIDxtYWNoL2F0OTFfcnRjLmg+CiAKIAotI2RlZmluZSBBVDkxX1JUQ19GUkVRCQkxCiAjZGVmaW5lIEFUOTFfUlRDX0VQT0NICQkxOTAwVUwJLyoganVzdCBsaWtlIGFyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgKi8KIAogc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihhdDkxX3J0Y191cGRhdGVkKTsKQEAgLTIyOCw4ICsyMjgsNiBAQAogCQkJKGltciAmIEFUOTFfUlRDX0FDS1VQRCkgPyAieWVzIiA6ICJubyIpOwogCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iLAogCQkJKGltciAmIEFUOTFfUlRDX1NFQ0VWKSA/ICJ5ZXMiIDogIm5vIik7Ci0Jc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19mcmVxXHQ6ICVsZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKSBBVDkxX1JUQ19GUkVRKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWJxNDgwMi5jIGIvZHJpdmVycy9ydGMvcnRjLWJxNDgwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWEwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYnE0ODAyLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qIHJ0Yy1icTQ4MDIuYzogVEkgQlE0ODAyIFJUQyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVEkgQlE0ODAyIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGJxNDgwMiB7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl1bnNpZ25lZCBsb25nCQlpb3BvcnQ7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJdTggKCpyZWFkKShzdHJ1Y3QgYnE0ODAyICosIGludCk7CisJdm9pZCAoKndyaXRlKShzdHJ1Y3QgYnE0ODAyICosIGludCwgdTgpOworfTsKKworc3RhdGljIHU4IGJxNDgwMl9yZWFkX2lvKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYpCit7CisJcmV0dXJuIGluYihwLT5pb3BvcnQgKyBvZmYpOworfQorCitzdGF0aWMgdm9pZCBicTQ4MDJfd3JpdGVfaW8oc3RydWN0IGJxNDgwMiAqcCwgaW50IG9mZiwgdTggdmFsKQoreworCW91dGIodmFsLCBwLT5pb3BvcnQgKyBvZmYpOworfQorCitzdGF0aWMgdTggYnE0ODAyX3JlYWRfbWVtKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYpCit7CisJcmV0dXJuIHJlYWRiKHAtPnJlZ3MgKyBvZmYpOworfQorCitzdGF0aWMgdm9pZCBicTQ4MDJfd3JpdGVfbWVtKHN0cnVjdCBicTQ4MDIgKnAsIGludCBvZmYsIHU4IHZhbCkKK3sKKwl3cml0ZWIodmFsLCBwLT5yZWdzICsgb2ZmKTsKK30KKworc3RhdGljIGludCBicTQ4MDJfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGJxNDgwMiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNlbnR1cnk7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHAtPnJlYWQocCwgMHgwZSk7CisJcC0+d3JpdGUocCwgMHhlLCB2YWwgfCAweDA4KTsKKworCXRtLT50bV9zZWMgPSBwLT5yZWFkKHAsIDB4MDApOworCXRtLT50bV9taW4gPSBwLT5yZWFkKHAsIDB4MDIpOworCXRtLT50bV9ob3VyID0gcC0+cmVhZChwLCAweDA0KTsKKwl0bS0+dG1fbWRheSA9IHAtPnJlYWQocCwgMHgwNik7CisJdG0tPnRtX21vbiA9IHAtPnJlYWQocCwgMHgwOSk7CisJdG0tPnRtX3llYXIgPSBwLT5yZWFkKHAsIDB4MGEpOworCXRtLT50bV93ZGF5ID0gcC0+cmVhZChwLCAweDA4KTsKKwljZW50dXJ5ID0gcC0+cmVhZChwLCAweDBmKTsKKworCXAtPndyaXRlKHAsIDB4MGUsIHZhbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7CisKKwlCQ0RfVE9fQklOKHRtLT50bV9zZWMpOworCUJDRF9UT19CSU4odG0tPnRtX21pbik7CisJQkNEX1RPX0JJTih0bS0+dG1faG91cik7CisJQkNEX1RPX0JJTih0bS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTih0bS0+dG1fbW9uKTsKKwlCQ0RfVE9fQklOKHRtLT50bV95ZWFyKTsKKwlCQ0RfVE9fQklOKHRtLT50bV93ZGF5KTsKKwlCQ0RfVE9fQklOKGNlbnR1cnkpOworCisJdG0tPnRtX3llYXIgKz0gKGNlbnR1cnkgKiAxMDApOworCXRtLT50bV95ZWFyIC09IDE5MDA7CisKKwl0bS0+dG1fbW9uLS07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicTQ4MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYnE0ODAyICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTggc2VjLCBtaW4sIGhycywgZGF5LCBtb24sIHlycywgY2VudHVyeSwgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHllYXI7CisKKwl5ZWFyID0gdG0tPnRtX3llYXIgKyAxOTAwOworCWNlbnR1cnkgPSB5ZWFyIC8gMTAwOworCXlycyA9IHllYXIgJSAxMDA7CisKKwltb24gPSB0bS0+dG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwlkYXkgPSB0bS0+dG1fbWRheTsKKwlocnMgPSB0bS0+dG1faG91cjsKKwltaW4gPSB0bS0+dG1fbWluOworCXNlYyA9IHRtLT50bV9zZWM7CisKKwlCSU5fVE9fQkNEKHNlYyk7CisJQklOX1RPX0JDRChtaW4pOworCUJJTl9UT19CQ0QoaHJzKTsKKwlCSU5fVE9fQkNEKGRheSk7CisJQklOX1RPX0JDRChtb24pOworCUJJTl9UT19CQ0QoeXJzKTsKKwlCSU5fVE9fQkNEKGNlbnR1cnkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHAtPnJlYWQocCwgMHgwZSk7CisJcC0+d3JpdGUocCwgMHgwZSwgdmFsIHwgMHgwOCk7CisKKwlwLT53cml0ZShwLCAweDAwLCBzZWMpOworCXAtPndyaXRlKHAsIDB4MDIsIG1pbik7CisJcC0+d3JpdGUocCwgMHgwNCwgaHJzKTsKKwlwLT53cml0ZShwLCAweDA2LCBkYXkpOworCXAtPndyaXRlKHAsIDB4MDksIG1vbik7CisJcC0+d3JpdGUocCwgMHgwYSwgeXJzKTsKKwlwLT53cml0ZShwLCAweDBmLCBjZW50dXJ5KTsKKworCXAtPndyaXRlKHAsIDB4MGUsIHZhbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGJxNDgwMl9vcHMgPSB7CisJLnJlYWRfdGltZQk9IGJxNDgwMl9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gYnE0ODAyX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYnE0ODAyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJxNDgwMiAqcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAoIXApCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2luaXQoJnAtPmxvY2spOworCisJcC0+ciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFwLT5yKSB7CisJCXAtPnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmICghcC0+cikKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWlmIChwLT5yLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcC0+aW9wb3J0ID0gcC0+ci0+c3RhcnQ7CisJCXAtPnJlYWQgPSBicTQ4MDJfcmVhZF9pbzsKKwkJcC0+d3JpdGUgPSBicTQ4MDJfd3JpdGVfaW87CisJfSBlbHNlIGlmIChwLT5yLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCXAtPnJlZ3MgPSBpb3JlbWFwKHAtPnItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHAtPnIpKTsKKwkJcC0+cmVhZCA9IGJxNDgwMl9yZWFkX21lbTsKKwkJcC0+d3JpdGUgPSBicTQ4MDJfd3JpdGVfbWVtOworCX0gZWxzZSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiYnE0ODAyIiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZicTQ4MDJfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwLT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIocC0+cnRjKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9pb3VubWFwOgorCWlmIChwLT5yLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlpb3VubWFwKHAtPnJlZ3MpOworb3V0X2ZyZWU6CisJa2ZyZWUocCk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGJxNDgwMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnE0ODAyICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocC0+cnRjKTsKKwlpZiAocC0+ci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJaW91bm1hcChwLT5yZWdzKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUocCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1icTQ4MDIiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnE0ODAyX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWJxNDgwMiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGJxNDgwMl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJxNDgwMl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnE0ODAyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZicTQ4MDJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJxNDgwMl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJxNDgwMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChicTQ4MDJfaW5pdCk7Cittb2R1bGVfZXhpdChicTQ4MDJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwppbmRleCBiMTg0MzY3Li45NjNhZDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKQEAgLTYzNiw3ICs2MzYsNyBAQAogCSAqLwogI2lmCWRlZmluZWQoQ09ORklHX0FUQVJJKQogCWFkZHJlc3Nfc3BhY2UgPSA2NDsKLSNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2FybV9fKQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQogCWFkZHJlc3Nfc3BhY2UgPSAxMjg7CiAjZWxzZQogI3dhcm5pbmcgQXNzdW1pbmcgMTI4IGJ5dGVzIG9mIFJUQytOVlJBTSBhZGRyZXNzIHNwYWNlLCBub3QgNjQgYnl0ZXMuCkBAIC02OTksNyArNjk5LDggQEAKIAkvKiBGSVhNRSB0ZWFjaCB0aGUgYWxhcm0gY29kZSBob3cgdG8gaGFuZGxlIGJpbmFyeSBtb2RlOwogCSAqIDxhc20tZ2VuZXJpYy9ydGMuaD4gZG9lc24ndCBrbm93IDEyLWhvdXIgbW9kZSBlaXRoZXIuCiAJICovCi0JaWYgKCEocnRjX2NvbnRyb2wgJiBSVENfMjRIKSB8fCAocnRjX2NvbnRyb2wgJiAoUlRDX0RNX0JJTkFSWSkpKSB7CisJaWYgKGlzX3ZhbGlkX2lycShydGNfaXJxKSAmJgorCSAgICAoIShydGNfY29udHJvbCAmIFJUQ18yNEgpIHx8IChydGNfY29udHJvbCAmIChSVENfRE1fQklOQVJZKSkpKSB7CiAJCWRldl9kYmcoZGV2LCAib25seSAyNC1ociBCQ0QgbW9kZSBzdXBwb3J0ZWRcbiIpOwogCQlyZXR2YWwgPSAtRU5YSU87CiAJCWdvdG8gY2xlYW51cDE7CkBAIC05MTIsNiArOTEzLDkyIEBACiAgKiBwcmVkYXRlIGV2ZW4gUE5QQklPUyBzaG91bGQgc2V0IHVwIHBsYXRmb3JtX2J1cyBkZXZpY2VzLgogICovCiAKKyNpZmRlZglDT05GSUdfQUNQSQorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaWZkZWYJQ09ORklHX1BNCitzdGF0aWMgdTMyIHJ0Y19oYW5kbGVyKHZvaWQgKmNvbnRleHQpCit7CisJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1JUQyk7CisJYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKKwlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0Y193YWtlX3NldHVwKHZvaWQpCit7CisJYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9SVEMsIHJ0Y19oYW5kbGVyLCBOVUxMKTsKKwkvKgorCSAqIEFmdGVyIHRoZSBSVEMgaGFuZGxlciBpcyBpbnN0YWxsZWQsIHRoZSBGaXhlZF9SVEMgZXZlbnQgc2hvdWxkCisJICogYmUgZGlzYWJsZWQuIE9ubHkgd2hlbiB0aGUgUlRDIGFsYXJtIGlzIHNldCB3aWxsIGl0IGJlIGVuYWJsZWQuCisJICovCisJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1JUQyk7CisJYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKK30KKworc3RhdGljIHZvaWQgcnRjX3dha2Vfb24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOworCWFjcGlfZW5hYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKK30KKworc3RhdGljIHZvaWQgcnRjX3dha2Vfb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhY3BpX2Rpc2FibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOworfQorI2Vsc2UKKyNkZWZpbmUgcnRjX3dha2Vfc2V0dXAoKQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgcnRjX3dha2Vfb24JCU5VTEwKKyNkZWZpbmUgcnRjX3dha2Vfb2ZmCQlOVUxMCisjZW5kaWYKKworLyogRXZlcnkgQUNQSSBwbGF0Zm9ybSBoYXMgYSBtYzE0NjgxOCBjb21wYXRpYmxlICJjbW9zIHJ0YyIuICBIZXJlIHdlIGZpbmQKKyAqIGl0cyBkZXZpY2Ugbm9kZSBhbmQgcGFzcyBleHRyYSBjb25maWcgZGF0YS4gIFRoaXMgaGVscHMgaXRzIGRyaXZlciB1c2UKKyAqIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBub3ctb2Jzb2xldGUgbWMxNDY4MTggZGlkbid0IGhhdmUsIGFuZCBpbmZvcm1zIGl0CisgKiB0aGF0IHRoaXMgYm9hcmQncyBSVEMgaXMgd2FrZXVwLWNhcGFibGUgKHBlciBBQ1BJIHNwZWMpLgorICovCitzdGF0aWMgc3RydWN0IGNtb3NfcnRjX2JvYXJkX2luZm8gYWNwaV9ydGNfaW5mbzsKKworc3RhdGljIHZvaWQgX19kZXZpbml0CitjbW9zX3dha2Vfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwlydGNfd2FrZV9zZXR1cCgpOworCWFjcGlfcnRjX2luZm8ud2FrZV9vbiA9IHJ0Y193YWtlX29uOworCWFjcGlfcnRjX2luZm8ud2FrZV9vZmYgPSBydGNfd2FrZV9vZmY7CisKKwkvKiB3b3JrYXJvdW5kIGJ1ZyBpbiBzb21lIEFDUEkgdGFibGVzICovCisJaWYgKGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0gJiYgIWFjcGlfZ2JsX0ZBRFQuZGF5X2FsYXJtKSB7CisJCWRldl9kYmcoZGV2LCAiYm9ndXMgRkFEVCBtb250aF9hbGFybSAoJWQpXG4iLAorCQkJYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSk7CisJCWFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0gPSAwOworCX0KKworCWFjcGlfcnRjX2luZm8ucnRjX2RheV9hbGFybSA9IGFjcGlfZ2JsX0ZBRFQuZGF5X2FsYXJtOworCWFjcGlfcnRjX2luZm8ucnRjX21vbl9hbGFybSA9IGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm07CisJYWNwaV9ydGNfaW5mby5ydGNfY2VudHVyeSA9IGFjcGlfZ2JsX0ZBRFQuY2VudHVyeTsKKworCS8qIE5PVEU6ICBTNF9SVENfV0FLRSBpcyBOT1QgY3VycmVudGx5IHVzZWZ1bCB0byBMaW51eCAqLworCWlmIChhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX1M0X1JUQ19XQUtFKQorCQlkZXZfaW5mbyhkZXYsICJSVEMgY2FuIHdha2UgZnJvbSBTNFxuIik7CisKKwlkZXYtPnBsYXRmb3JtX2RhdGEgPSAmYWNwaV9ydGNfaW5mbzsKKworCS8qIFJUQyBhbHdheXMgd2FrZXMgZnJvbSBTMS9TMi9TMywgYW5kIG9mdGVuIFM0L1NURCAqLworCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2Ntb3Nfd2FrZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7Cit9CisKKyNlbmRpZgorCiAjaWZkZWYJQ09ORklHX1BOUAogCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC05MTksNiArMTAwNiw4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogY21vc19wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKnBucCwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQogeworCWNtb3Nfd2FrZV9zZXR1cCgmcG5wLT5kZXYpOworCiAJaWYgKHBucF9wb3J0X3N0YXJ0KHBucCwwKSA9PSAweDcwICYmICFwbnBfaXJxX3ZhbGlkKHBucCwwKSkKIAkJLyogU29tZSBtYWNoaW5lcyBjb250YWluIGEgUE5QIGVudHJ5IGZvciB0aGUgUlRDLCBidXQKIAkJICogZG9uJ3QgZGVmaW5lIHRoZSBJUlEuIEl0IHNob3VsZCBhbHdheXMgYmUgc2FmZSB0bwpAQCAtOTk2LDYgKzEwODUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjbW9zX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJY21vc193YWtlX3NldHVwKCZwZGV2LT5kZXYpOwogCXJldHVybiBjbW9zX2RvX3Byb2JlKCZwZGV2LT5kZXYsCiAJCQlwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCksCiAJCQlwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApKTsKQEAgLTEwMzAsMjkgKzExMjAsMzIgQEAKIAogc3RhdGljIGludCBfX2luaXQgY21vc19pbml0KHZvaWQpCiB7CisJaW50IHJldHZhbCA9IDA7CisKICNpZmRlZglDT05GSUdfUE5QCi0JaWYgKHBucF9wbGF0Zm9ybV9kZXZpY2VzKQotCQlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmY21vc19wbnBfZHJpdmVyKTsKLQllbHNlCi0JCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNtb3NfcGxhdGZvcm1fZHJpdmVyLAotCQkJY21vc19wbGF0Zm9ybV9wcm9iZSk7Ci0jZWxzZQotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNtb3NfcGxhdGZvcm1fZHJpdmVyLAotCQkJY21vc19wbGF0Zm9ybV9wcm9iZSk7Ci0jZW5kaWYgLyogQ09ORklHX1BOUCAqLworCXBucF9yZWdpc3Rlcl9kcml2ZXIoJmNtb3NfcG5wX2RyaXZlcik7CisjZW5kaWYKKworCWlmICghY21vc19ydGMuZGV2KQorCQlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNtb3NfcGxhdGZvcm1fZHJpdmVyLAorCQkJCQkgICAgICAgY21vc19wbGF0Zm9ybV9wcm9iZSk7CisKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworCisjaWZkZWYJQ09ORklHX1BOUAorCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmY21vc19wbnBfZHJpdmVyKTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7CiB9CiBtb2R1bGVfaW5pdChjbW9zX2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY21vc19leGl0KHZvaWQpCiB7CiAjaWZkZWYJQ09ORklHX1BOUAotCWlmIChwbnBfcGxhdGZvcm1fZGV2aWNlcykKLQkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZjbW9zX3BucF9kcml2ZXIpOwotCWVsc2UKLQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNtb3NfcGxhdGZvcm1fZHJpdmVyKTsKLSNlbHNlCisJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZjbW9zX3BucF9kcml2ZXIpOworI2VuZGlmCiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNtb3NfcGxhdGZvcm1fZHJpdmVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE5QICovCiB9CiBtb2R1bGVfZXhpdChjbW9zX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggZjExODI1Mi4uMDc5ZTllZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtNDIyLDI4ICs0MjIsMzcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHJ0Y19kZXZfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnJ0Yy0+YXN5bmNfcXVldWUpOworfQorCiBzdGF0aWMgaW50IHJ0Y19kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0jaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAotCWNsZWFyX3VpZShydGMpOwotI2VuZGlmCisJLyogV2Ugc2h1dCBkb3duIHRoZSByZXBlYXRpbmcgSVJRcyB0aGF0IHVzZXJzcGFjZSBlbmFibGVkLAorCSAqIHNpbmNlIG5vdGhpbmcgaXMgbGlzdGVuaW5nIHRvIHRoZW0uCisJICogIC0gVXBkYXRlIChVSUUpIC4uLiBjdXJyZW50bHkgb25seSBtYW5hZ2VkIHRocm91Z2ggaW9jdGxzCisJICogIC0gUGVyaW9kaWMgKFBJRSkgLi4uIGFsc28gdXNlZCB0aHJvdWdoIHJ0Y18qKCkgaW50ZXJmYWNlIGNhbGxzCisJICoKKwkgKiBMZWF2ZSB0aGUgYWxhcm0gYWxvbmU7IGl0IG1heSBiZSBzZXQgdG8gdHJpZ2dlciBhIHN5c3RlbSB3YWtldXAKKwkgKiBsYXRlciwgb3IgYmUgdXNlZCBieSBrZXJuZWwgY29kZSwgYW5kIGlzIGEgb25lLXNob3QgZXZlbnQgYW55d2F5LgorCSAqLworCXJ0Y19kZXZfaW9jdGwoZmlsZSwgUlRDX1VJRV9PRkYsIDApOwogCXJ0Y19pcnFfc2V0X3N0YXRlKHJ0YywgTlVMTCwgMCk7CiAKIAlpZiAocnRjLT5vcHMtPnJlbGVhc2UpCiAJCXJ0Yy0+b3BzLT5yZWxlYXNlKHJ0Yy0+ZGV2LnBhcmVudCk7CiAKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJcnRjX2Rldl9mYXN5bmMoLTEsIGZpbGUsIDApOworCiAJY2xlYXJfYml0X3VubG9jayhSVENfREVWX0JVU1ksICZydGMtPmZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBydGNfZGV2X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZydGMtPmFzeW5jX3F1ZXVlKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2Rldl9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEyODYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNiMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTI4Ni5jCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogRFMxMjg2IFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvZHMxMjg2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMCIKKworc3RydWN0IGRzMTI4Nl9wcml2IHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXUzMiBfX2lvbWVtICpydGNyZWdzOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIGlubGluZSB1OCBkczEyODZfcnRjX3JlYWQoc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2LCBpbnQgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbCgmcHJpdi0+cnRjcmVnc1tyZWddKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkczEyODZfcnRjX3dyaXRlKHN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiwgdTggZGF0YSwgaW50IHJlZykKK3sKKwlfX3Jhd193cml0ZWwoZGF0YSwgJnByaXYtPnJ0Y3JlZ3NbcmVnXSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWCisKK3N0YXRpYyBpbnQgZHMxMjg2X2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJLyogTWFzayBhbGFybSBpbnQuIGVuYWIuIGJpdAkqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJCXZhbCB8PSAgUlRDX1RETTsKKwkJZHMxMjg2X3J0Y193cml0ZShwcml2LCB2YWwsIFJUQ19DTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoKKwkJLyogQWxsb3cgYWxhcm0gaW50ZXJydXB0cy4JKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpOworCQl2YWwgJj0gIH5SVENfVERNOworCQlkczEyODZfcnRjX3dyaXRlKHByaXYsIHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfV0lFX09GRjoKKwkJLyogTWFzayB3YXRjaGRvZyBpbnQuIGVuYWIuIGJpdAkqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJCXZhbCB8PSBSVENfV0FNOworCQlkczEyODZfcnRjX3dyaXRlKHByaXYsIHZhbCwgUlRDX0NNRCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfV0lFX09OOgorCQkvKiBBbGxvdyB3YXRjaGRvZyBpbnRlcnJ1cHRzLgkqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX0NNRCk7CisJCXZhbCAmPSB+UlRDX1dBTTsKKwkJZHMxMjg2X3J0Y193cml0ZShwcml2LCB2YWwsIFJUQ19DTUQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBkczEyODZfaW9jdGwgICAgTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW50IGRzMTI4Nl9wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgY2hhciBtb250aCwgY21kLCBhbW9kZTsKKwljb25zdCBjaGFyICpzOworCisJbW9udGggPSBkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX01PTlRIKTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIm9zY2lsbGF0b3JcdDogJXNcbiIKKwkJICAgInNxdWFyZV93YXZlXHQ6ICVzXG4iLAorCQkgICAobW9udGggJiBSVENfRU9TQykgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAobW9udGggJiBSVENfRVNRVykgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKworCWFtb2RlID0gKChkczEyODZfcnRjX3JlYWQocHJpdiwgUlRDX01JTlVURVNfQUxBUk0pICYgMHg4MCkgPj4gNSkgfAorCQkoKGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfSE9VUlNfQUxBUk0pICYgMHg4MCkgPj4gNikgfAorCQkoKGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfREFZX0FMQVJNKSAmIDB4ODApID4+IDcpOworCXN3aXRjaCAoYW1vZGUpIHsKKwljYXNlIDc6CisJCXMgPSAiZWFjaCBtaW51dGUiOworCQlicmVhazsKKwljYXNlIDM6CisJCXMgPSAibWludXRlcyBtYXRjaCI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcyA9ICJob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJcyA9ICJkYXlzLCBob3VycyBhbmQgbWludXRlcyBtYXRjaCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXMgPSAiaW52YWxpZCI7CisJCWJyZWFrOworCX0KKwlzZXFfcHJpbnRmKHNlcSwgImFsYXJtX21vZGVcdDogJXNcbiIsIHMpOworCisJY21kID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpOworCXNlcV9wcmludGYoc2VxLAorCQkgICAiYWxhcm1fZW5hYmxlXHQ6ICVzXG4iCisJCSAgICJ3ZG9nX2FsYXJtXHQ6ICVzXG4iCisJCSAgICJhbGFybV9tYXNrXHQ6ICVzXG4iCisJCSAgICJ3ZG9nX2FsYXJtX21hc2tcdDogJXNcbiIKKwkJICAgImludGVycnVwdF9tb2RlXHQ6ICVzXG4iCisJCSAgICJJTlRCX21vZGVcdDogJXNfYWN0aXZlXG4iCisJCSAgICJpbnRlcnJ1cHRfcGluc1x0OiAlc1xuIiwKKwkJICAgKGNtZCAmIFJUQ19UREYpID8gInllcyIgOiAibm8iLAorCQkgICAoY21kICYgUlRDX1dBRikgPyAieWVzIiA6ICJubyIsCisJCSAgIChjbWQgJiBSVENfVERNKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCisJCSAgIChjbWQgJiBSVENfV0FNKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCisJCSAgIChjbWQgJiBSVENfUFVfTFZMKSA/ICJwdWxzZSIgOiAibGV2ZWwiLAorCQkgICAoY21kICYgUlRDX0lCSF9MTykgPyAibG93IiA6ICJoaWdoIiwKKwkJICAgKGNtZCAmIFJUQ19JUFNXKSA/ICJ1bnN3YXBwZWQiIDogInN3YXBwZWQiKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgZHMxMjg2X3Byb2MgICAgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGRzMTI4Nl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB1aXBfd2F0Y2hkb2cgPSBqaWZmaWVzOworCisJLyoKKwkgKiByZWFkIFJUQyBvbmNlIGFueSB1cGRhdGUgaW4gcHJvZ3Jlc3MgaXMgZG9uZS4gVGhlIHVwZGF0ZQorCSAqIGNhbiB0YWtlIGp1c3Qgb3ZlciAybXMuIFdlIHdhaXQgMTAgdG8gMjBtcy4gVGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIHRvIHBvbGwtd2FpdCAodXAgdG8gMXMgLSBlZWNjY2gpIGZvciB0aGUgZmFsbGluZyBlZGdlIG9mIFJUQ19VSVAuCisJICogSWYgeW91IG5lZWQgdG8ga25vdyAqZXhhY3RseSogd2hlbiBhIHNlY29uZCBoYXMgc3RhcnRlZCwgZW5hYmxlCisJICogcGVyaW9kaWMgdXBkYXRlIGNvbXBsZXRlIGludGVycnVwdHMsICh2aWEgaW9jdGwpIGFuZCB0aGVuCisJICogaW1tZWRpYXRlbHkgcmVhZCAvZGV2L3J0YyB3aGljaCB3aWxsIGJsb2NrIHVudGlsIHlvdSBnZXQgdGhlIElSUS4KKwkgKiBPbmNlIHRoZSByZWFkIGNsZWFycywgcmVhZCB0aGUgUlRDIHRpbWUgKGFnYWluIHZpYSBpb2N0bCkuIEVhc3kuCisJICovCisKKwlpZiAoZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpICYgUlRDX1RFKQorCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdWlwX3dhdGNoZG9nICsgMipIWi8xMDApKQorCQkJYmFycmllcigpOworCisJLyoKKwkgKiBPbmx5IHRoZSB2YWx1ZXMgdGhhdCB3ZSByZWFkIGZyb20gdGhlIFJUQyBhcmUgc2V0LiBXZSBsZWF2ZQorCSAqIHRtX3dkYXksIHRtX3lkYXkgYW5kIHRtX2lzZHN0IHVudG91Y2hlZC4gRXZlbiB0aG91Z2ggdGhlCisJICogUlRDIGhhcyBSVENfREFZX09GX1dFRUssIHdlIGlnbm9yZSBpdCwgYXMgaXQgaXMgb25seSB1cGRhdGVkCisJICogYnkgdGhlIFJUQyB3aGVuIGluaXRpYWxseSBzZXQgdG8gYSBub24temVybyB2YWx1ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfQ01EKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIChzYXZlX2NvbnRyb2x8UlRDX1RFKSwgUlRDX0NNRCk7CisKKwl0bS0+dG1fc2VjID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19TRUNPTkRTKTsKKwl0bS0+dG1fbWluID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19NSU5VVEVTKTsKKwl0bS0+dG1faG91ciA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfSE9VUlMpICYgMHgzZjsKKwl0bS0+dG1fbWRheSA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfREFURSk7CisJdG0tPnRtX21vbiA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfTU9OVEgpICYgMHgxZjsKKwl0bS0+dG1feWVhciA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfWUVBUik7CisKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIHNhdmVfY29udHJvbCwgUlRDX0NNRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4odG0tPnRtX3NlYyk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4odG0tPnRtX21pbik7CisJdG0tPnRtX2hvdXIgPSBiY2QyYmluKHRtLT50bV9ob3VyKTsKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4odG0tPnRtX21kYXkpOworCXRtLT50bV9tb24gPSBiY2QyYmluKHRtLT50bV9tb24pOworCXRtLT50bV95ZWFyID0gYmNkMmJpbih0bS0+dG1feWVhcik7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gaG93IHRoZSBSVEMgdXNlcyB0aGUgdmFsdWVzCisJICogYW5kIGhvdyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc3RydWN0IHJ0Y190aW1lOworCSAqLworCWlmICh0bS0+dG1feWVhciA8IDQ1KQorCQl0bS0+dG1feWVhciArPSAzMDsKKwl0bS0+dG1feWVhciArPSA0MDsKKwlpZiAodG0tPnRtX3llYXIgPCA3MCkKKwkJdG0tPnRtX3llYXIgKz0gMTAwOworCisJdG0tPnRtX21vbi0tOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgZHMxMjg2X3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjOworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sOworCXVuc2lnbmVkIGludCB5cnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXlycyA9IHRtLT50bV95ZWFyICsgMTkwMDsKKwltb24gPSB0bS0+dG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwlkYXkgPSB0bS0+dG1fbWRheTsKKwlocnMgPSB0bS0+dG1faG91cjsKKwltaW4gPSB0bS0+dG1fbWluOworCXNlYyA9IHRtLT50bV9zZWM7CisKKwlpZiAoeXJzIDwgMTk3MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl5cnMgLT0gMTk0MDsKKwlpZiAoeXJzID4gMjU1KSAgICAvKiBUaGV5IGFyZSB1bnNpZ25lZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh5cnMgPj0gMTAwKQorCQl5cnMgLT0gMTAwOworCisJc2VjID0gYmluMmJjZChzZWMpOworCW1pbiA9IGJpbjJiY2QobWluKTsKKwlocnMgPSBiaW4yYmNkKGhycyk7CisJZGF5ID0gYmluMmJjZChkYXkpOworCW1vbiA9IGJpbjJiY2QobW9uKTsKKwl5cnMgPSBiaW4yYmNkKHlycyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNhdmVfY29udHJvbCA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfQ01EKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIChzYXZlX2NvbnRyb2x8UlRDX1RFKSwgUlRDX0NNRCk7CisKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIHlycywgUlRDX1lFQVIpOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgbW9uLCBSVENfTU9OVEgpOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgZGF5LCBSVENfREFURSk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBocnMsIFJUQ19IT1VSUyk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBtaW4sIFJUQ19NSU5VVEVTKTsKKwlkczEyODZfcnRjX3dyaXRlKHByaXYsIHNlYywgUlRDX1NFQ09ORFMpOworCWRzMTI4Nl9ydGNfd3JpdGUocHJpdiwgMCwgUlRDX0hVTkRSRURUSF9TRUNPTkQpOworCisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBzYXZlX2NvbnRyb2wsIFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEyODZfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogT25seSB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBmcm9tIHRoZSBSVEMgYXJlIHNldC4gVGhhdAorCSAqIG1lYW5zIG9ubHkgdG1fd2RheSwgdG1faG91ciwgdG1fbWluLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJYWxtLT50aW1lLnRtX21pbiA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfTUlOVVRFU19BTEFSTSkgJiAweDdmOworCWFsbS0+dGltZS50bV9ob3VyID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19IT1VSU19BTEFSTSkgICYgMHgxZjsKKwlhbG0tPnRpbWUudG1fd2RheSA9IGRzMTI4Nl9ydGNfcmVhZChwcml2LCBSVENfREFZX0FMQVJNKSAgICAmIDB4MDc7CisJY21kID0gZHMxMjg2X3J0Y19yZWFkKHByaXYsIFJUQ19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWFsbS0+dGltZS50bV9taW4gPSBiY2QyYmluKGFsbS0+dGltZS50bV9taW4pOworCWFsbS0+dGltZS50bV9ob3VyID0gYmNkMmJpbihhbG0tPnRpbWUudG1faG91cik7CisJYWxtLT50aW1lLnRtX3NlYyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjg2X3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJc3RydWN0IGRzMTI4Nl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgY2hhciBocnMsIG1pbiwgc2VjOworCisJaHJzID0gYWxtLT50aW1lLnRtX2hvdXI7CisJbWluID0gYWxtLT50aW1lLnRtX21pbjsKKwlzZWMgPSBhbG0tPnRpbWUudG1fc2VjOworCisJaWYgKGhycyA+PSAyNCkKKwkJaHJzID0gMHhmZjsKKworCWlmIChtaW4gPj0gNjApCisJCW1pbiA9IDB4ZmY7CisKKwlpZiAoc2VjICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbWluID0gYmluMmJjZChtaW4pOworCWhycyA9IGJpbjJiY2QoaHJzKTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBocnMsIFJUQ19IT1VSU19BTEFSTSk7CisJZHMxMjg2X3J0Y193cml0ZShwcml2LCBtaW4sIFJUQ19NSU5VVEVTX0FMQVJNKTsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTI4Nl9vcHMgPSB7CisJLmlvY3RsICAgCT0gZHMxMjg2X2lvY3RsLAorCS5wcm9jICAgCT0gZHMxMjg2X3Byb2MsCisJLnJlYWRfdGltZQk9IGRzMTI4Nl9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gZHMxMjg2X3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gZHMxMjg2X3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQk9IGRzMTI4Nl9zZXRfYWxhcm0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkczEyODZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkczEyODZfcHJpdiAqcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMjg2X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPnJ0Y3JlZ3MgPSBpb3JlbWFwKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlpZiAoIXByaXYtPnJ0Y3JlZ3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyODYiLCAmcGRldi0+ZGV2LAorCQkJCSAgJmRzMTI4Nl9vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIG91dDsKKwl9CisJcHJpdi0+cnRjID0gcnRjOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCXJldHVybiAwOworCitvdXQ6CisJaWYgKHByaXYtPnJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaWYgKHByaXYtPnJ0Y3JlZ3MpCisJCWlvdW5tYXAocHJpdi0+cnRjcmVncyk7CisJaWYgKHByaXYtPmJhc2VhZGRyKQorCQlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTI4Nl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHMxMjg2X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlvdW5tYXAocHJpdi0+cnRjcmVncyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxMjg2X3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWRzMTI4NiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGRzMTI4Nl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTI4Nl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxMjg2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkczEyODZfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzMTI4Nl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTI4Nl9wbGF0Zm9ybV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQm9nZW5kb2VyZmVyIDx0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzEyODYgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtZHMxMjg2Iik7CisKK21vZHVsZV9pbml0KGRzMTI4Nl9pbml0KTsKK21vZHVsZV9leGl0KGRzMTI4Nl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCBiYmY5N2U2Li40ZmNmMDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0yMywxMCArMjMsNiBAQAogICogdG8gaGF2ZSBzZXQgdGhlIGNoaXAgdXAgYXMgYSBjbG9jayAodHVybmluZyBvbiB0aGUgb3NjaWxsYXRvciBhbmQKICAqIHNldHRpbmcgdGhlIGRhdGUgYW5kIHRpbWUpLCBMaW51eCBjYW4gaWdub3JlIHRoZSBub24tY2xvY2sgZmVhdHVyZXMuCiAgKiBUaGF0J3MgYSBuYXR1cmFsIGpvYiBmb3IgYSBmYWN0b3J5IG9yIHJlcGFpciBiZW5jaC4KLSAqCi0gKiBUaGlzIGlzIGN1cnJlbnRseSBhIHNpbXBsZSBuby1hbGFybXMgZHJpdmVyLiAgSWYgeW91ciBib2FyZCBoYXMgdGhlCi0gKiBhbGFybSBpcnEgd2lyZWQgdXAgb24gYSBkczEzMzcgb3IgZHMxMzM5LCBhbmQgeW91IHdhbnQgdG8gdXNlIHRoYXQsCi0gKiB0aGVuIGxvb2sgYXQgdGhlIHJ0Yy1yczVjMzcyIGRyaXZlciBmb3IgY29kZSB0byBzdGVhbC4uLgogICovCiBlbnVtIGRzX3R5cGUgewogCWRzXzEzMDcsCkBAIC02Nyw2ICs2Myw3IEBACiAjCWRlZmluZSBEUzEzMDdfQklUX1JTMAkJMHgwMQogI2RlZmluZSBEUzEzMzdfUkVHX0NPTlRST0wJMHgwZQogIwlkZWZpbmUgRFMxMzM3X0JJVF9uRU9TQwkJMHg4MAorIwlkZWZpbmUgRFMxMzM5X0JJVF9CQlNRSQkJMHgyMAogIwlkZWZpbmUgRFMxMzM3X0JJVF9SUzIJCTB4MTAKICMJZGVmaW5lIERTMTMzN19CSVRfUlMxCQkweDA4CiAjCWRlZmluZSBEUzEzMzdfQklUX0lOVENOCQkweDA0CkBAIC04MywxOSArODAsMjIgQEAKICMJZGVmaW5lIERTMTMzN19CSVRfT1NGCQkweDgwCiAjCWRlZmluZSBEUzEzMzdfQklUX0EySQkJMHgwMgogIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUkJCTB4MDEKKyNkZWZpbmUgRFMxMzM5X1JFR19BTEFSTTFfU0VDUwkweDA3CiAjZGVmaW5lIERTMTMzOV9SRUdfVFJJQ0tMRQkweDEwCiAKIAogCiBzdHJ1Y3QgZHMxMzA3IHsKIAl1OAkJCXJlZ19hZGRyOwotCWJvb2wJCQloYXNfbnZyYW07Ci0JdTgJCQlyZWdzWzhdOworCXU4CQkJcmVnc1sxMV07CiAJZW51bSBkc190eXBlCQl0eXBlOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworI2RlZmluZSBIQVNfTlZSQU0JMAkJLyogYml0IDAgPT0gc3lzZnMgZmlsZSBhY3RpdmUgKi8KKyNkZWZpbmUgSEFTX0FMQVJNCTEJCS8qIGJpdCAxID09IGlycSBjbGFpbWVkICovCiAJc3RydWN0IGkyY19tc2cJCW1zZ1syXTsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXN0cnVjdCBpMmNfY2xpZW50CWRldjsKIAlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogfTsKIAogc3RydWN0IGNoaXBfZGVzYyB7CkBAIC0xMzIsMTIgKzEzMiw3OSBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkczEzMDdfaWQpOwogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIElSUSBsb2dpYyBpbmNsdWRlcyBhICJyZWFsIiBoYW5kbGVyIHJ1bm5pbmcgaW4gSVJRIGNvbnRleHQganVzdAorICogbG9uZyBlbm91Z2ggdG8gc2NoZWR1bGUgdGhpcyB3b3JrcXVldWUgZW50cnkuICAgV2UgbmVlZCBhIHRhc2sgY29udGV4dAorICogdG8gdGFsayB0byB0aGUgUlRDLCBzaW5jZSBJMkMgSS9PIGNhbGxzIHJlcXVpcmUgdGhhdDsgYW5kIGRpc2FibGUgdGhlCisgKiBJUlEgdW50aWwgd2UgY2xlYXIgaXRzIHN0YXR1cyBvbiB0aGUgY2hpcCwgc28gdGhhdCB0aGlzIGhhbmRsZXIgY2FuCisgKiB3b3JrIHdpdGggYW55IHR5cGUgb2YgdHJpZ2dlcmluZyAobm90IGp1c3QgZmFsbGluZyBlZGdlKS4KKyAqCisgKiBUaGUgZHMxMzM3IGFuZCBkczEzMzkgYm90aCBoYXZlIHR3byBhbGFybXMsIGJ1dCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QKKyAqIG9uZSAod2l0aCBhICJzZWNvbmRzIiBmaWVsZCkuICBGb3IgZHMxMzM3IHdlIGV4cGVjdCBuSU5UQSBpcyBvdXIgYWxhcm0KKyAqIHNpZ25hbDsgZHMxMzM5IGNoaXBzIGhhdmUgb25seSBvbmUgYWxhcm0gc2lnbmFsLgorICovCitzdGF0aWMgdm9pZCBkczEzMDdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBtdXRleAkJKmxvY2s7CisJaW50CQkJc3RhdCwgY29udHJvbDsKKworCWRzMTMwNyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHMxMzA3LCB3b3JrKTsKKwljbGllbnQgPSBkczEzMDctPmNsaWVudDsKKwlsb2NrID0gJmRzMTMwNy0+cnRjLT5vcHNfbG9jazsKKworCW11dGV4X2xvY2sobG9jayk7CisJc3RhdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHN0YXQgJiBEUzEzMzdfQklUX0ExSSkgeworCQlzdGF0ICY9IH5EUzEzMzdfQklUX0ExSTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTLCBzdGF0KTsKKworCQljb250cm9sID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MKTsKKwkJaWYgKGNvbnRyb2wgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJY29udHJvbCAmPSB+RFMxMzM3X0JJVF9BMUlFOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MLCBjb250cm9sKTsKKworCQkvKiBydGNfdXBkYXRlX2lycSgpIGFzc3VtZXMgdGhhdCBpdCBpcyBjYWxsZWQKKwkJICogZnJvbSBJUlEtZGlzYWJsZWQgY29udGV4dC4KKwkJICovCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXJ0Y191cGRhdGVfaXJxKGRzMTMwNy0+cnRjLCAxLCBSVENfQUYgfCBSVENfSVJRRik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisKK291dDoKKwlpZiAodGVzdF9iaXQoSEFTX0FMQVJNLCAmZHMxMzA3LT5mbGFncykpCisJCWVuYWJsZV9pcnEoY2xpZW50LT5pcnEpOworCW11dGV4X3VubG9jayhsb2NrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRzMTMwN19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSBkZXZfaWQ7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJc2NoZWR1bGVfd29yaygmZHMxMzA3LT53b3JrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIHN0YXRpYyBpbnQgZHMxMzA3X2dldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQogewogCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludAkJdG1wOwogCiAJLyogcmVhZCB0aGUgUlRDIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCisJZHMxMzA3LT5yZWdfYWRkciA9IDA7CiAJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKIAlkczEzMDctPm1zZ1sxXS5sZW4gPSA3OwogCkBAIC0yMzEsOSArMjk4LDE4NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRzMTMwN19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgICAgICAgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50CQkJcmV0OworCisJaWYgKCF0ZXN0X2JpdChIQVNfQUxBUk0sICZkczEzMDctPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZWFkIGFsbCBBTEFSTTEsIEFMQVJNMiwgYW5kIHN0YXR1cyByZWdpc3RlcnMgYXQgb25jZSAqLworCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzlfUkVHX0FMQVJNMV9TRUNTOworCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJZHMxMzA3LT5tc2dbMV0ubGVuID0gOTsKKworCXJldCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLAorCQkJZHMxMzA3LT5tc2csIDIpOworCWlmIChyZXQgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gcmVhZCIsIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldl9kYmcoZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMngsICUwMnggJTAyeCAlMDJ4LCAlMDJ4ICUwMnhcbiIsCisJCQkiYWxhcm0gcmVhZCIsCisJCQlkczEzMDctPnJlZ3NbMF0sIGRzMTMwNy0+cmVnc1sxXSwKKwkJCWRzMTMwNy0+cmVnc1syXSwgZHMxMzA3LT5yZWdzWzNdLAorCQkJZHMxMzA3LT5yZWdzWzRdLCBkczEzMDctPnJlZ3NbNV0sCisJCQlkczEzMDctPnJlZ3NbNl0sIGRzMTMwNy0+cmVnc1s3XSwKKwkJCWRzMTMwNy0+cmVnc1s4XSk7CisKKwkvKiByZXBvcnQgYWxhcm0gdGltZSAoQUxBUk0xKTsgYXNzdW1lIDI0IGhvdXIgYW5kIGRheS1vZi1tb250aCBtb2RlcywKKwkgKiBhbmQgdGhhdCBhbGwgZm91ciBmaWVsZHMgYXJlIGNoZWNrZWQgbWF0Y2hlcworCSAqLworCXQtPnRpbWUudG1fc2VjID0gYmNkMmJpbihkczEzMDctPnJlZ3NbMF0gJiAweDdmKTsKKwl0LT50aW1lLnRtX21pbiA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzWzFdICYgMHg3Zik7CisJdC0+dGltZS50bV9ob3VyID0gYmNkMmJpbihkczEzMDctPnJlZ3NbMl0gJiAweDNmKTsKKwl0LT50aW1lLnRtX21kYXkgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1szXSAmIDB4M2YpOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJdC0+dGltZS50bV95ZWFyID0gLTE7CisJdC0+dGltZS50bV93ZGF5ID0gLTE7CisJdC0+dGltZS50bV95ZGF5ID0gLTE7CisJdC0+dGltZS50bV9pc2RzdCA9IC0xOworCisJLyogLi4uIGFuZCBzdGF0dXMgKi8KKwl0LT5lbmFibGVkID0gISEoZHMxMzA3LT5yZWdzWzddICYgRFMxMzM3X0JJVF9BMUlFKTsKKwl0LT5wZW5kaW5nID0gISEoZHMxMzA3LT5yZWdzWzhdICYgRFMxMzM3X0JJVF9BMUkpOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgZW5hYmxlZD0lZCwgcGVuZGluZz0lZFxuIiwKKwkJImFsYXJtIHJlYWQiLCB0LT50aW1lLnRtX3NlYywgdC0+dGltZS50bV9taW4sCisJCXQtPnRpbWUudG1faG91ciwgdC0+dGltZS50bV9tZGF5LAorCQl0LT5lbmFibGVkLCB0LT5wZW5kaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTMwN19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczEzMDcJCSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyCQkqYnVmID0gZHMxMzA3LT5yZWdzOworCXU4CQkJY29udHJvbCwgc3RhdHVzOworCWludAkJCXJldDsKKworCWlmICghdGVzdF9iaXQoSEFTX0FMQVJNLCAmZHMxMzA3LT5mbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgZW5hYmxlZD0lZCwgcGVuZGluZz0lZFxuIiwKKwkJImFsYXJtIHNldCIsIHQtPnRpbWUudG1fc2VjLCB0LT50aW1lLnRtX21pbiwKKwkJdC0+dGltZS50bV9ob3VyLCB0LT50aW1lLnRtX21kYXksCisJCXQtPmVuYWJsZWQsIHQtPnBlbmRpbmcpOworCisJLyogcmVhZCBjdXJyZW50IHN0YXR1cyBvZiBib3RoIGFsYXJtcyBhbmQgdGhlIGNoaXAgKi8KKwlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM5X1JFR19BTEFSTTFfU0VDUzsKKwlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDk7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwKKwkJCWRzMTMwNy0+bXNnLCAyKTsKKwlpZiAocmV0ICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgImFsYXJtIHdyaXRlIiwgcmV0KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWNvbnRyb2wgPSBkczEzMDctPnJlZ3NbN107CisJc3RhdHVzID0gZHMxMzA3LT5yZWdzWzhdOworCisJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCwgJTAyeCAlMDJ4ICUwMngsICUwMnggJTAyeFxuIiwKKwkJCSJhbGFybSBzZXQgKG9sZCBzdGF0dXMpIiwKKwkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAorCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCisJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKKwkJCWRzMTMwNy0+cmVnc1s2XSwgY29udHJvbCwgc3RhdHVzKTsKKworCS8qIHNldCBBTEFSTTEsIHVzaW5nIDI0IGhvdXIgYW5kIGRheS1vZi1tb250aCBtb2RlcyAqLworCSpidWYrKyA9IERTMTMzOV9SRUdfQUxBUk0xX1NFQ1M7CS8qIGZpcnN0IHJlZ2lzdGVyIGFkZHIgKi8KKwlidWZbMF0gPSBiaW4yYmNkKHQtPnRpbWUudG1fc2VjKTsKKwlidWZbMV0gPSBiaW4yYmNkKHQtPnRpbWUudG1fbWluKTsKKwlidWZbMl0gPSBiaW4yYmNkKHQtPnRpbWUudG1faG91cik7CisJYnVmWzNdID0gYmluMmJjZCh0LT50aW1lLnRtX21kYXkpOworCisJLyogc2V0IEFMQVJNMiB0byBub24tZ2FyYmFnZSAqLworCWJ1Zls0XSA9IDA7CisJYnVmWzVdID0gMDsKKwlidWZbNl0gPSAwOworCisJLyogb3B0aW9uYWxseSBlbmFibGUgQUxBUk0xICovCisJYnVmWzddID0gY29udHJvbCAmIH4oRFMxMzM3X0JJVF9BMUlFIHwgRFMxMzM3X0JJVF9BMklFKTsKKwlpZiAodC0+ZW5hYmxlZCkgeworCQlkZXZfZGJnKGRldiwgImFsYXJtIElSUSBhcm1lZFxuIik7CisJCWJ1Zls3XSB8PSBEUzEzMzdfQklUX0ExSUU7CS8qIG9ubHkgQUxBUk0xIGlzIHVzZWQgKi8KKwl9CisJYnVmWzhdID0gc3RhdHVzICYgfihEUzEzMzdfQklUX0ExSSB8IERTMTMzN19CSVRfQTJJKTsKKworCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gMDsKKwlkczEzMDctPm1zZ1sxXS5sZW4gPSAxMDsKKworCXJldCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLAorCQkJJmRzMTMwNy0+bXNnWzFdLCAxKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBzZXQgYWxhcm0gdGltZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTMwN19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzMTMwNwkJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludAkJCXJldDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJaWYgKCF0ZXN0X2JpdChIQVNfQUxBUk0sICZkczEzMDctPmZsYWdzKSkKKwkJCXJldHVybiAtRU5PVFRZOworCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgJj0gfkRTMTMzN19CSVRfQTFJRTsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCURTMTMzN19SRUdfQ09OVFJPTCwgcmV0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWJyZWFrOworCisJY2FzZSBSVENfQUlFX09OOgorCQlpZiAoIXRlc3RfYml0KEhBU19BTEFSTSwgJmRzMTMwNy0+ZmxhZ3MpKQorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCB8PSBEUzEzMzdfQklUX0ExSUU7CisKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlEUzEzMzdfUkVHX0NPTlRST0wsIHJldCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzeHhfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMxMzA3X2dldF90aW1lLAogCS5zZXRfdGltZQk9IGRzMTMwN19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IGRzMTMwN19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBkczEzMDdfc2V0X2FsYXJtLAorCS5pb2N0bAkJPSBkczEzMDdfaW9jdGwsCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzI3LDYgKzU3MSw3IEBACiAJaW50CQkJdG1wOwogCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MJKmNoaXAgPSAmY2hpcHNbaWQtPmRyaXZlcl9kYXRhXTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCWludAkJCXdhbnRfaXJxID0gZmFsc2U7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsCiAJCQlJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQpAQCAtMzUzLDYgKzU5OCwxMiBAQAogCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CiAJY2FzZSBkc18xMzM3OgogCWNhc2UgZHNfMTMzOToKKwkJLyogaGFzIElSUT8gKi8KKwkJaWYgKGRzMTMwNy0+Y2xpZW50LT5pcnEgPiAwICYmIGNoaXAtPmFsYXJtKSB7CisJCQlJTklUX1dPUksoJmRzMTMwNy0+d29yaywgZHMxMzA3X3dvcmspOworCQkJd2FudF9pcnEgPSB0cnVlOworCQl9CisKIAkJZHMxMzA3LT5yZWdfYWRkciA9IERTMTMzN19SRUdfQ09OVFJPTDsKIAkJZHMxMzA3LT5tc2dbMV0ubGVuID0gMjsKIApAQCAtMzY5LDggKzYyMCwyMCBAQAogCiAJCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCiAJCWlmIChkczEzMDctPnJlZ3NbMF0gJiBEUzEzMzdfQklUX25FT1NDKQotCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCwKLQkJCQlkczEzMDctPnJlZ3NbMF0gJiB+RFMxMzM3X0JJVF9uRU9TQyk7CisJCQlkczEzMDctPnJlZ3NbMF0gJj0gfkRTMTMzN19CSVRfbkVPU0M7CisKKwkJLyogVXNpbmcgSVJRPyAgRGlzYWJsZSB0aGUgc3F1YXJlIHdhdmUgYW5kIGJvdGggYWxhcm1zLgorCQkgKiBGb3IgZHMxMzM5LCBiZSBzdXJlIGFsYXJtcyBjYW4gdHJpZ2dlciB3aGVuIHdlJ3JlCisJCSAqIHJ1bm5pbmcgb24gVmJhY2t1cCAoQkJTUUkpOyB3ZSBhc3N1bWUgZHMxMzM3IHdpbGwKKwkJICogaWdub3JlIHRoYXQgYml0CisJCSAqLworCQlpZiAod2FudF9pcnEpIHsKKwkJCWRzMTMwNy0+cmVnc1swXSB8PSBEUzEzMzdfQklUX0lOVENOIHwgRFMxMzM5X0JJVF9CQlNRSTsKKwkJCWRzMTMwNy0+cmVnc1swXSAmPSB+KERTMTMzN19CSVRfQTJJRSB8IERTMTMzN19CSVRfQTFJRSk7CisJCX0KKworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzM3X1JFR19DT05UUk9MLAorCQkJCQkJCWRzMTMwNy0+cmVnc1swXSk7CiAKIAkJLyogb3NjaWxsYXRvciBmYXVsdD8gIGNsZWFyIGZsYWcsIGFuZCB3YXJuICovCiAJCWlmIChkczEzMDctPnJlZ3NbMV0gJiBEUzEzMzdfQklUX09TRikgewpAQCAtNDk1LDEwICs3NTgsMjIgQEAKIAkJZ290byBleGl0X2ZyZWU7CiAJfQogCisJaWYgKHdhbnRfaXJxKSB7CisJCWVyciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBkczEzMDdfaXJxLCAwLAorCQkJICBkczEzMDctPnJ0Yy0+bmFtZSwgY2xpZW50KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJInVuYWJsZSB0byByZXF1ZXN0IElSUSFcbiIpOworCQkJZ290byBleGl0X2lycTsKKwkJfQorCQlzZXRfYml0KEhBU19BTEFSTSwgJmRzMTMwNy0+ZmxhZ3MpOworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImdvdCBJUlEgJWRcbiIsIGNsaWVudC0+aXJxKTsKKwl9CisKIAlpZiAoY2hpcC0+bnZyYW01NikgewogCQllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmNsaWVudC0+ZGV2LmtvYmosICZudnJhbSk7CiAJCWlmIChlcnIgPT0gMCkgewotCQkJZHMxMzA3LT5oYXNfbnZyYW0gPSB0cnVlOworCQkJc2V0X2JpdChIQVNfTlZSQU0sICZkczEzMDctPmZsYWdzKTsKIAkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIjU2IGJ5dGVzIG52cmFtXG4iKTsKIAkJfQogCX0KQEAgLTUxMiw3ICs3ODcsOSBAQAogCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCiAJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKIAkJCWRzMTMwNy0+cmVnc1s2XSk7Ci0KK2V4aXRfaXJxOgorCWlmIChkczEzMDctPnJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKIGV4aXRfZnJlZToKIAlrZnJlZShkczEzMDcpOwogCXJldHVybiBlcnI7CkBAIC01MjAsOSArNzk3LDE0IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgZHMxMzA3CSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAoZHMxMzA3LT5oYXNfbnZyYW0pCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQVNfQUxBUk0sICZkczEzMDctPmZsYWdzKSkgeworCQlmcmVlX2lycShjbGllbnQtPmlycSwgY2xpZW50KTsKKwkJY2FuY2VsX3dvcmtfc3luYygmZHMxMzA3LT53b3JrKTsKKwl9CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhBU19OVlJBTSwgJmRzMTMwNy0+ZmxhZ3MpKQogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmNsaWVudC0+ZGV2LmtvYmosICZudnJhbSk7CiAKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA3LT5ydGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTM3NC5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTM3NC5jCmluZGV4IGExNTA0MTguLmE1YjBmYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzNzQuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzc0LmMKQEAgLTQyOSwxMiArNDI5LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZHMxMzc0X3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWlmIChjbGllbnQtPmlycSA+PSAwICYmIGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikpCisJCWVuYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzc0X3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWlmIChjbGllbnQtPmlycSA+PSAwICYmIGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikpCisJCWRpc2FibGVfaXJxX3dha2UoY2xpZW50LT5pcnEpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgZHMxMzc0X3N1c3BlbmQJTlVMTAorI2RlZmluZSBkczEzNzRfcmVzdW1lCU5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHMxMzc0X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJydGMtZHMxMzc0IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUgPSBkczEzNzRfcHJvYmUsCisJLnN1c3BlbmQgPSBkczEzNzRfc3VzcGVuZCwKKwkucmVzdW1lID0gZHMxMzc0X3Jlc3VtZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoZHMxMzc0X3JlbW92ZSksCiAJLmlkX3RhYmxlID0gZHMxMzc0X2lkLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwppbmRleCAwZjBkMjdkLi44Njk4MWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0zNzksMTggKzM3OSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0gc3RhdGljIHZvaWQKLWRzMTUxMV9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgewotCQlwZGF0YS0+aXJxZW4gPSAwOwotCQlkczE1MTFfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7Ci0JfQotfQotCiAgc3RhdGljIGludAogZHMxNTExX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDI4LDcgKzQxNiw2IEBACiAJLnNldF90aW1lCT0gZHMxNTExX3J0Y19zZXRfdGltZSwKIAkucmVhZF9hbGFybQk9IGRzMTUxMV9ydGNfcmVhZF9hbGFybSwKIAkuc2V0X2FsYXJtCT0gZHMxNTExX3J0Y19zZXRfYWxhcm0sCi0JLnJlbGVhc2UJPSBkczE1MTFfcnRjX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGRzMTUxMV9ydGNfaW9jdGwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKaW5kZXggYTE5ZjExNC4uNGVmNTkyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpAQCAtMjA3LDE3ICsyMDcsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgZHMxNTUzX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7Ci0JCXBkYXRhLT5pcnFlbiA9IDA7Ci0JCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgZHMxNTUzX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0yNTQsNyArMjQzLDYgQEAKIAkuc2V0X3RpbWUJPSBkczE1NTNfcnRjX3NldF90aW1lLAogCS5yZWFkX2FsYXJtCT0gZHMxNTUzX3J0Y19yZWFkX2FsYXJtLAogCS5zZXRfYWxhcm0JPSBkczE1NTNfcnRjX3NldF9hbGFybSwKLQkucmVsZWFzZQk9IGRzMTU1M19ydGNfcmVsZWFzZSwKIAkuaW9jdGwJCT0gZHMxNTUzX3J0Y19pb2N0bCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwppbmRleCA2ZmE0NTU2Li4zNDFkN2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCkBAIC05LDE3ICs5LDEwIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMyIKLQotLyogQWRkcmVzc2VzIHRvIHNjYW46IG5vbmUuIFRoaXMgY2hpcCBjYW5ub3QgYmUgZGV0ZWN0ZWQuICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotSTJDX0NMSUVOVF9JTlNNT0Q7CisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQiCiAKIC8qIFJlZ2lzdGVycyAqLwogCkBAIC0yOSw4ICsyMiw3IEBACiAKICNkZWZpbmUgRFMxNjcyX1JFR19DT05UUk9MX0VPU0MJMHg4MAogCi0vKiBQcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGRzMTY3Ml9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHMxNjcyX2RyaXZlcjsKIAogLyoKICAqIEluIHRoZSByb3V0aW5lcyB0aGF0IGRlYWwgZGlyZWN0bHkgd2l0aCB0aGUgZHMxNjcyIGhhcmR3YXJlLCB3ZSB1c2UKQEAgLTQ0LDggKzM2LDggQEAKIAl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKIAogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJeyBjbGllbnQtPmFkZHIsIDAsIDEsICZhZGRyIH0sCQkvKiBzZXR1cCByZWFkIHB0ciAqLwotCQl7IGNsaWVudC0+YWRkciwgSTJDX01fUkQsIDQsIGJ1ZiB9LAkvKiByZWFkIGRhdGUgKi8KKwkJe2NsaWVudC0+YWRkciwgMCwgMSwgJmFkZHJ9LAkvKiBzZXR1cCByZWFkIHB0ciAqLworCQl7Y2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgNCwgYnVmfSwJLyogcmVhZCBkYXRlICovCiAJfTsKIAogCS8qIHJlYWQgZGF0ZSByZWdpc3RlcnMgKi8KQEAgLTgwLDcgKzcyLDcgQEAKIAlidWZbMl0gPSAoc2VjcyAmIDB4MDAwMEZGMDApID4+IDg7CiAJYnVmWzNdID0gKHNlY3MgJiAweDAwRkYwMDAwKSA+PiAxNjsKIAlidWZbNF0gPSAoc2VjcyAmIDB4RkYwMDAwMDApID4+IDI0OwotCWJ1Zls1XSA9IDA7CS8qIHNldCBjb250cm9sIHJlZyB0byBlbmFibGUgY291bnRpbmcgKi8KKwlidWZbNV0gPSAwOwkJLyogc2V0IGNvbnRyb2wgcmVnIHRvIGVuYWJsZSBjb3VudGluZyAqLwogCiAJeGZlciA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgNik7CiAJaWYgKHhmZXIgIT0gNikgewpAQCAtMTI3LDggKzExOSw4IEBACiAJdW5zaWduZWQgY2hhciBhZGRyID0gRFMxNjcyX1JFR19DT05UUk9MOwogCiAJc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7IGNsaWVudC0+YWRkciwgMCwgMSwgJmFkZHIgfSwJCS8qIHNldHVwIHJlYWQgcHRyICovCi0JCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgMSwgc3RhdHVzIH0sCS8qIHJlYWQgY29udHJvbCAqLworCQl7Y2xpZW50LT5hZGRyLCAwLCAxLCAmYWRkcn0sCS8qIHNldHVwIHJlYWQgcHRyICovCisJCXtjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCBzdGF0dXN9LAkvKiByZWFkIGNvbnRyb2wgKi8KIAl9OwogCiAJLyogcmVhZCBjb250cm9sIHJlZ2lzdGVyICovCkBAIC0xNDEsNyArMTMzLDggQEAKIH0KIAogLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2NvbnRyb2woc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJdTggY29udHJvbDsKQEAgLTE1Miw4NSArMTQ1LDQ2IEBACiAJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgKGNvbnRyb2wgJiBEUzE2NzJfUkVHX0NPTlRST0xfRU9TQykKLQkJCQkJPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKwkJICAgICAgID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CiB9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihjb250cm9sLCBTX0lSVUdPLCBzaG93X2NvbnRyb2wsIE5VTEwpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxNjcyX3J0Y19vcHMgPSB7Ci0JLnJlYWRfdGltZQk9IGRzMTY3Ml9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZQk9IGRzMTY3Ml9ydGNfc2V0X3RpbWUsCi0JLnNldF9tbXNzCT0gZHMxNjcyX3J0Y19zZXRfbW1zcywKKwkucmVhZF90aW1lID0gZHMxNjcyX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gZHMxNjcyX3J0Y19zZXRfdGltZSwKKwkuc2V0X21tc3MgPSBkczE2NzJfcnRjX3NldF9tbXNzLAogfTsKIAotc3RhdGljIGludCBkczE2NzJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgZHMxNjcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxNjcyX3Byb2JlKTsKLX0KLQotc3RhdGljIGludCBkczE2NzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGVycjsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLSAJaWYgKHJ0YykKKwlpZiAocnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKIAotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCXJldHVybiBlcnI7Ci0KLQlrZnJlZShjbGllbnQpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczE2NzJfZHJpdmVyID0gewotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJkczE2NzIiLAotCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9EUzE2NzIsCi0JLmF0dGFjaF9hZGFwdGVyID0gJmRzMTY3Ml9hdHRhY2gsCi0JLmRldGFjaF9jbGllbnQJPSAmZHMxNjcyX2RldGFjaCwKLX07Ci0KLXN0YXRpYyBpbnQgZHMxNjcyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCBkczE2NzJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgZXJyID0gMDsKIAl1OCBjb250cm9sOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAotCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoIShjbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpKSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogSTJDIGNsaWVudCAqLwotCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JY2xpZW50LT5kcml2ZXIgPSAmZHMxNjcyX2RyaXZlcjsKLQljbGllbnQtPmFkYXB0ZXIJPSBhZGFwdGVyOwotCi0Jc3RybGNweShjbGllbnQtPm5hbWUsIGRzMTY3Ml9kcml2ZXIuZHJpdmVyLm5hbWUsIEkyQ19OQU1FX1NJWkUpOwotCi0JLyogSW5mb3JtIHRoZSBpMmMgbGF5ZXIgKi8KLQlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlnb3RvIGV4aXRfa2ZyZWU7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRU5PREVWOwogCiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAogCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoZHMxNjcyX2RyaXZlci5kcml2ZXIubmFtZSwgJmNsaWVudC0+ZGV2LAotCQkJCSZkczE2NzJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCQkJCSAgJmRzMTY3Ml9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAKLQlpZiAoSVNfRVJSKHJ0YykpIHsKLQkJZXJyID0gUFRSX0VSUihydGMpOwotCQlnb3RvIGV4aXRfZGV0YWNoOwotCX0KKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBydGMpOwogCkBAIC0yNDEsNyArMTk1LDcgQEAKIAogCWlmIChjb250cm9sICYgRFMxNjcyX1JFR19DT05UUk9MX0VPU0MpCiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIk9zY2lsbGF0b3Igbm90IGVuYWJsZWQuICIKLQkJCQkJIlNldCB0aW1lIHRvIGVuYWJsZS5cbiIpOworCQkJICJTZXQgdGltZSB0byBlbmFibGUuXG4iKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NvbnRyb2wpOwpAQCAtMjUwLDE5ICsyMDQsMTkgQEAKIAogCXJldHVybiAwOwogCi1leGl0X2RldnJlZzoKKyBleGl0X2RldnJlZzoKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQotZXhpdF9kZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQotZXhpdF9rZnJlZToKLQlrZnJlZShjbGllbnQpOwotCi1leGl0OgogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczE2NzJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInJ0Yy1kczE2NzIiLAorCQkgICB9LAorCS5wcm9iZSA9ICZkczE2NzJfcHJvYmUsCisJLnJlbW92ZSA9ICZkczE2NzJfcmVtb3ZlLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgZHMxNjcyX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRzMTY3Ml9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDEzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qIGRyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYworICoKKyAqIERyaXZlciBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IgKERTMzIzNCkgU1BJIFJUQyB3aXRoIEludGVncmF0ZWQgQ3J5c3RhbAorICogYW5kIFNSQU0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1JTU9NYXggV2lyZWxlc3MgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ2hhbmdlbG9nOgorICoKKyAqIDA3LU1heS0yMDA4OiBEZW5uaXMgQWJlcmlsbGEgPGRlbnp6emhvbWVAeWFob28uY29tPgorICoJCS0gQ3JlYXRlZCBiYXNlZCBvbiB0aGUgbWF4NjkwMiBjb2RlLiBPbmx5IGltcGxlbWVudHMgdGhlCisgKgkJICBkYXRlL3RpbWUga2VlcGluZyBmdW5jdGlvbnM7IG5vIFNSQU0geWV0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNkZWZpbmUgRFMzMjM0X1JFR19TRUNPTkRTCTB4MDAKKyNkZWZpbmUgRFMzMjM0X1JFR19NSU5VVEVTCTB4MDEKKyNkZWZpbmUgRFMzMjM0X1JFR19IT1VSUwkweDAyCisjZGVmaW5lIERTMzIzNF9SRUdfREFZCQkweDAzCisjZGVmaW5lIERTMzIzNF9SRUdfREFURQkJMHgwNAorI2RlZmluZSBEUzMyMzRfUkVHX01PTlRICTB4MDUKKyNkZWZpbmUgRFMzMjM0X1JFR19ZRUFSCQkweDA2CisjZGVmaW5lIERTMzIzNF9SRUdfQ0VOVFVSWQkoMSA8PCA3KSAvKiBCaXQgNyBvZiB0aGUgTW9udGggcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUzMyMzRfUkVHX0NPTlRST0wJMHgwRQorI2RlZmluZSBEUzMyMzRfUkVHX0NPTlRfU1RBVAkweDBGCisKKyN1bmRlZiBEUzMyMzRfREVCVUcKKworc3RydWN0IGRzMzIzNCB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1OCBidWZbOF07IC8qIEJ1cnN0IHJlYWQ6IGFkZHIgKyA3IHJlZ3MgKi8KKwl1OCB0eF9idWZbMl07CisJdTggcnhfYnVmWzJdOworfTsKKworc3RhdGljIHZvaWQgZHMzMjM0X3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwkvKiBNU0IgbXVzdCBiZSAnMScgdG8gaW5kaWNhdGUgd3JpdGUgKi8KKwlidWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKKwlidWZbMV0gPSBkYXRhOworCisJc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKK30KKworc3RhdGljIGludCBkczMyMzRfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJc3RydWN0IGRzMzIzNCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEJ1aWxkIG91ciBzcGkgbWVzc2FnZSAqLworCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOworCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKKworCS8qIEFkZHJlc3MgKyBkdW1teSB0eCBieXRlICovCisJeGZlci5sZW4gPSAyOworCXhmZXIudHhfYnVmID0gY2hpcC0+dHhfYnVmOworCXhmZXIucnhfYnVmID0gY2hpcC0+cnhfYnVmOworCisJY2hpcC0+dHhfYnVmWzBdID0gYWRkcmVzczsKKwljaGlwLT50eF9idWZbMV0gPSAweGZmOworCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKKworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOworCWVsc2UKKwkJcmV0dXJuIHN0YXR1czsKKworCSpkYXRhID0gY2hpcC0+cnhfYnVmWzFdOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkczMyMzRfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBkczMyMzQgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHN0YXR1czsKKworCS8qIGJ1aWxkIHRoZSBtZXNzYWdlICovCisJc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7CisJbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOworCXhmZXIubGVuID0gMSArIDc7CS8qIEFkZHIgKyA3IHJlZ2lzdGVycyAqLworCXhmZXIudHhfYnVmID0gY2hpcC0+YnVmOworCXhmZXIucnhfYnVmID0gY2hpcC0+YnVmOworCWNoaXAtPmJ1ZlswXSA9IDB4MDA7CS8qIFN0YXJ0IGFkZHJlc3MgKi8KKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOworCisJLyogZG8gdGhlIGkvbyAqLworCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7CisJZWxzZQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogU2Vjb25kcywgTWludXRlcywgSG91cnMsIERheSwgRGF0ZSwgTW9udGgsIFllYXIgKi8KKwlkdC0+dG1fc2VjCT0gYmNkMmJpbihjaGlwLT5idWZbMV0pOworCWR0LT50bV9taW4JPSBiY2QyYmluKGNoaXAtPmJ1ZlsyXSk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKGNoaXAtPmJ1ZlszXSAmIDB4M2YpOworCWR0LT50bV93ZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNF0pIC0gMTsgLyogMCA9IFN1biAqLworCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNV0pOworCWR0LT50bV9tb24JPSBiY2QyYmluKGNoaXAtPmJ1Zls2XSAmIDB4MWYpIC0gMTsgLyogMCA9IEphbiAqLworCWR0LT50bV95ZWFyIAk9IGJjZDJiaW4oY2hpcC0+YnVmWzddICYgMHhmZikgKyAxMDA7IC8qIEFzc3VtZSAyMFlZICovCisKKyNpZmRlZiBEUzMyMzRfREVCVUcKKwlkZXZfZGJnKGRldiwgIlxuJXMgOiBSZWFkIFJUQyB2YWx1ZXNcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKGRldiwgInRtX2hvdXI6ICVpXG4iLCBkdC0+dG1faG91cik7CisJZGV2X2RiZyhkZXYsICJ0bV9taW4gOiAlaVxuIiwgZHQtPnRtX21pbik7CisJZGV2X2RiZyhkZXYsICJ0bV9zZWMgOiAlaVxuIiwgZHQtPnRtX3NlYyk7CisJZGV2X2RiZyhkZXYsICJ0bV93ZGF5OiAlaVxuIiwgZHQtPnRtX3dkYXkpOworCWRldl9kYmcoZGV2LCAidG1fbWRheTogJWlcbiIsIGR0LT50bV9tZGF5KTsKKwlkZXZfZGJnKGRldiwgInRtX21vbiA6ICVpXG4iLCBkdC0+dG1fbW9uKTsKKwlkZXZfZGJnKGRldiwgInRtX3llYXI6ICVpXG4iLCBkdC0+dG1feWVhcik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMzIzNF9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworI2lmZGVmIERTMzIzNF9ERUJVRworCWRldl9kYmcoZGV2LCAiXG4lcyA6IFNldHRpbmcgUlRDIHZhbHVlc1xuIiwgX19mdW5jX18pOworCWRldl9kYmcoZGV2LCAidG1fc2VjIDogJWlcbiIsIGR0LT50bV9zZWMpOworCWRldl9kYmcoZGV2LCAidG1fbWluIDogJWlcbiIsIGR0LT50bV9taW4pOworCWRldl9kYmcoZGV2LCAidG1faG91cjogJWlcbiIsIGR0LT50bV9ob3VyKTsKKwlkZXZfZGJnKGRldiwgInRtX3dkYXk6ICVpXG4iLCBkdC0+dG1fd2RheSk7CisJZGV2X2RiZyhkZXYsICJ0bV9tZGF5OiAlaVxuIiwgZHQtPnRtX21kYXkpOworCWRldl9kYmcoZGV2LCAidG1fbW9uIDogJWlcbiIsIGR0LT50bV9tb24pOworCWRldl9kYmcoZGV2LCAidG1feWVhcjogJWlcbiIsIGR0LT50bV95ZWFyKTsKKyNlbmRpZgorCisJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX1NFQ09ORFMsIGJpbjJiY2QoZHQtPnRtX3NlYykpOworCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19NSU5VVEVTLCBiaW4yYmNkKGR0LT50bV9taW4pKTsKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfSE9VUlMsIGJpbjJiY2QoZHQtPnRtX2hvdXIpICYgMHgzZik7CisKKwkvKiAwID0gU3VuICovCisJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX0RBWSwgYmluMmJjZChkdC0+dG1fd2RheSArIDEpKTsKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfREFURSwgYmluMmJjZChkdC0+dG1fbWRheSkpOworCisJLyogMCA9IEphbiAqLworCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19NT05USCwgYmluMmJjZChkdC0+dG1fbW9uICsgMSkpOworCisJLyogQXNzdW1lIDIwWVkgYWx0aG91Z2ggd2UganVzdCB3YW50IHRvIG1ha2Ugc3VyZSBub3QgdG8gZ28gbmVnYXRpdmUuICovCisJaWYgKGR0LT50bV95ZWFyID4gMTAwKQorCQlkdC0+dG1feWVhciAtPSAxMDA7CisKKwlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfWUVBUiwgYmluMmJjZChkdC0+dG1feWVhcikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMzMjM0X3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIGRzMzIzNF9nZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgZHMzMjM0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gZHMzMjM0X3NldF9kYXRldGltZShkZXYsIHRtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMzIzNF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczMyMzRfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRzMzIzNF9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgZHMzMjM0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlzdHJ1Y3QgZHMzMjM0ICpjaGlwOworCWludCByZXM7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczMyMzQiLAorCQkJCSZzcGktPmRldiwgJmRzMzIzNF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczMyMzQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApIHsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaGlwLT5ydGMgPSBydGM7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7CisKKwlyZXMgPSBkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfU0VDT05EUywgJnRtcCk7CisJaWYgKHJlcykgeworCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBDb250cm9sIHNldHRpbmdzCisJICoKKwkgKiBDT05UUk9MX1JFRworCSAqIEJJVCA3CTYJNQk0CTMJMgkxCTAKKwkgKiAgICAgRU9TQwlCQlNRVwlDT05WCVJTMglSUzEJSU5UQ04JQTJJRQlBMUlFCisJICoKKwkgKiAgICAgMAkwCTAJMQkxCTEJMAkwCisJICoKKwkgKiBDT05UUk9MX1NUQVRfUkVHCisJICogQklUIDcJNgk1CTQJMwkyCTEJMAorCSAqICAgICBPU0YJQkIzMmtIeglDUkFURTEJQ1JBVEUwCUVOMzJrSHoJQlNZCUEyRglBMUYKKwkgKgorCSAqICAgICAxCTAJMAkwCTEJMAkwCTAKKwkgKi8KKwlkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfQ09OVFJPTCwgJnRtcCk7CisJZHMzMjM0X3NldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRST0wsIHRtcCAmIDB4MWMpOworCisJZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRfU1RBVCwgJnRtcCk7CisJZHMzMjM0X3NldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX0NPTlRfU1RBVCwgdG1wICYgMHg4OCk7CisKKwkvKiBQcmludCBvdXIgc2V0dGluZ3MgKi8KKwlkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfQ09OVFJPTCwgJnRtcCk7CisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiQ29udHJvbCBSZWc6IDB4JTAyeFxuIiwgdG1wKTsKKworCWRzMzIzNF9nZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19DT05UX1NUQVQsICZ0bXApOworCWRldl9pbmZvKCZzcGktPmRldiwgIkN0cmwvU3RhdCBSZWc6IDB4JTAyeFxuIiwgdG1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBkczMyMzRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGRzMzIzNCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGRzMzIzNF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJID0gImRzMzIzNCIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkgPSBkczMyMzRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRzMzIzNF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZHMzMjM0X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJEUzMyMzQgU1BJIFJUQyBEcml2ZXJcbiIpOworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZkczMyMzRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGRzMzIzNF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGRzMzIzNF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZkczMyMzRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRzMzIzNF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzMyMzQgU1BJIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRlbm5pcyBBYmVyaWxsYSA8ZGVuenp6aG9tZUB5YWhvby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKaW5kZXggMjRiYzE2OC4uNDcwZmIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYwpAQCAtNTYsMjEgKzU2LDI3IEBACiAjZGVmaW5lIE00MVQ4MF9BTEhPVVJfSFQJKDEgPDwgNikJLyogSFQ6IEhhbHQgVXBkYXRlIEJpdCAqLwogI2RlZmluZSBNNDFUODBfRkxBR1NfQUYJCSgxIDw8IDYpCS8qIEFGOiBBbGFybSBGbGFnIEJpdCAqLwogI2RlZmluZSBNNDFUODBfRkxBR1NfQkFUVF9MT1cJKDEgPDwgNCkJLyogQkw6IEJhdHRlcnkgTG93IEJpdCAqLworI2RlZmluZSBNNDFUODBfV0FUQ0hET0dfUkIyCSgxIDw8IDcpCS8qIFJCOiBXYXRjaGRvZyByZXNvbHV0aW9uICovCisjZGVmaW5lIE00MVQ4MF9XQVRDSERPR19SQjEJKDEgPDwgMSkJLyogUkI6IFdhdGNoZG9nIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgTTQxVDgwX1dBVENIRE9HX1JCMAkoMSA8PCAwKQkvKiBSQjogV2F0Y2hkb2cgcmVzb2x1dGlvbiAqLwogCi0jZGVmaW5lIE00MVQ4MF9GRUFUVVJFX0hUCSgxIDw8IDApCi0jZGVmaW5lIE00MVQ4MF9GRUFUVVJFX0JMCSgxIDw8IDEpCisjZGVmaW5lIE00MVQ4MF9GRUFUVVJFX0hUCSgxIDw8IDApCS8qIEhhbHQgZmVhdHVyZSAqLworI2RlZmluZSBNNDFUODBfRkVBVFVSRV9CTAkoMSA8PCAxKQkvKiBCYXR0ZXJ5IGxvdyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfU1EJKDEgPDwgMikJLyogU3F1YXJld2F2ZSBmZWF0dXJlICovCisjZGVmaW5lIE00MVQ4MF9GRUFUVVJFX1dECSgxIDw8IDMpCS8qIEV4dHJhIHdhdGNoZG9nIHJlc29sdXRpb24gKi8KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4wNSIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG00MXQ4MF9pZFtdID0gewotCXsgIm00MXQ4MCIsIDAgfSwKLQl7ICJtNDF0ODEiLCBNNDFUODBfRkVBVFVSRV9IVCB9LAotCXsgIm00MXQ4MXMiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMIH0sCi0JeyAibTQxdDgyIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB9LAotCXsgIm00MXQ4MyIsIE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwgfSwKLQl7ICJtNDFzdDg0IiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB9LAotCXsgIm00MXN0ODUiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMIH0sCi0JeyAibTQxc3Q4NyIsIE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwgfSwKKwl7ICJtNDF0NjUiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX1dEIH0sCisJeyAibTQxdDgwIiwgTTQxVDgwX0ZFQVRVUkVfU1EgfSwKKwl7ICJtNDF0ODEiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX1NRfSwKKwl7ICJtNDF0ODFzIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxdDgyIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxdDgzIiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCisJeyAibTQxc3Q4NCIsIE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwgfCBNNDFUODBfRkVBVFVSRV9TUSB9LAorCXsgIm00MXN0ODUiLCBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMIHwgTTQxVDgwX0ZFQVRVUkVfU1EgfSwKKwl7ICJtNDFzdDg3IiwgTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCB8IE00MVQ4MF9GRUFUVVJFX1NRIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG00MXQ4MF9pZCk7CkBAIC0zODYsOCArMzkyLDEyIEBACiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCB2YWw7CiAKKwlpZiAoIShjbGllbnRkYXRhLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX1NRKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NRVyk7CiAJaWYgKHZhbCA8IDApCiAJCXJldHVybiAtRUlPOwpAQCAtNDA4LDkgKzQxOCwxMyBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IGFsbW9uLCBzcXc7CiAJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CiAKKwlpZiAoIShjbGllbnRkYXRhLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX1NRKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAodmFsKSB7CiAJCWlmICghaXNfcG93ZXJfb2ZfMih2YWwpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC00OTksNiArNTEzLDggQEAKIAkJCS5idWYJPSBpMmNfZGF0YSwKIAkJfSwKIAl9OworCXN0cnVjdCBtNDF0ODBfZGF0YSAqY2xpZW50ZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShzYXZlX2NsaWVudCk7CisKIAlpMmNfZGF0YVswXSA9IDB4MDk7CQkvKiB3YXRjaGRvZyByZWdpc3RlciAqLwogCiAJaWYgKHdkdF9tYXJnaW4gPiAzMSkKQEAgLTUwOSw2ICs1MjUsMTMgQEAKIAkJICovCiAJCWkyY19kYXRhWzFdID0gd2R0X21hcmdpbjw8MiB8IDB4ODI7CiAKKwkvKgorCSAqIE00MVQ2NSBoYXMgdGhyZWUgYml0cyBmb3Igd2F0Y2hkb2cgcmVzb2x1dGlvbi4gIERvbid0IHNldCBiaXQgNywgYXMKKwkgKiB0aGF0IHdvdWxkIGJlIGFuIGludmFsaWQgcmVzb2x1dGlvbi4KKwkgKi8KKwlpZiAoY2xpZW50ZGF0YS0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9XRCkKKwkJaTJjX2RhdGFbMV0gJj0gfk00MVQ4MF9XQVRDSERPR19SQjI7CisKIAlpMmNfdHJhbnNmZXIoc2F2ZV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MxLCAxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00OHQzNS5jIGIvZHJpdmVycy9ydGMvcnRjLW00OHQzNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjE5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDM1LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBTR1MtVGhvbXNvbiBNNDhUMzUgVGltZWtlZXBlciBSQU0gY2hpcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBXcml0dGVuIGJ5IFVsZiBDYXJsc3NvbiAodWxmY0BlbmdyLnNnaS5jb20pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKiBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMCIKKworc3RydWN0IG00OHQzNV9ydGMgeworCXU4CXBhZFsweDdmZjhdOyAgICAvKiBzdGFydHMgYXQgMHg3ZmY4ICovCisJdTgJY29udHJvbDsKKwl1OAlzZWM7CisJdTgJbWluOworCXU4CWhvdXI7CisJdTgJZGF5OworCXU4CWRhdGU7CisJdTgJbW9udGg7CisJdTgJeWVhcjsKK307CisKKyNkZWZpbmUgTTQ4VDM1X1JUQ19TRVQJCTB4ODAKKyNkZWZpbmUgTTQ4VDM1X1JUQ19SRUFECQkweDQwCisKK3N0cnVjdCBtNDh0MzVfcHJpdiB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgbTQ4dDM1X3J0YyBfX2lvbWVtICpyZWc7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW50IG00OHQzNV9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IGNvbnRyb2w7CisKKwkvKgorCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCisJICogdG1fd2RheSwgdG1feWRheSBhbmQgdG1faXNkc3QgdW50b3VjaGVkLiBFdmVuIHRob3VnaCB0aGUKKwkgKiBSVEMgaGFzIFJUQ19EQVlfT0ZfV0VFSywgd2UgaWdub3JlIGl0LCBhcyBpdCBpcyBvbmx5IHVwZGF0ZWQKKwkgKiBieSB0aGUgUlRDIHdoZW4gaW5pdGlhbGx5IHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCWNvbnRyb2wgPSByZWFkYigmcHJpdi0+cmVnLT5jb250cm9sKTsKKwl3cml0ZWIoY29udHJvbCB8IE00OFQzNV9SVENfUkVBRCwgJnByaXYtPnJlZy0+Y29udHJvbCk7CisJdG0tPnRtX3NlYyA9IHJlYWRiKCZwcml2LT5yZWctPnNlYyk7CisJdG0tPnRtX21pbiA9IHJlYWRiKCZwcml2LT5yZWctPm1pbik7CisJdG0tPnRtX2hvdXIgPSByZWFkYigmcHJpdi0+cmVnLT5ob3VyKTsKKwl0bS0+dG1fbWRheSA9IHJlYWRiKCZwcml2LT5yZWctPmRhdGUpOworCXRtLT50bV9tb24gPSByZWFkYigmcHJpdi0+cmVnLT5tb250aCk7CisJdG0tPnRtX3llYXIgPSByZWFkYigmcHJpdi0+cmVnLT55ZWFyKTsKKwl3cml0ZWIoY29udHJvbCwgJnByaXYtPnJlZy0+Y29udHJvbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHRtLT50bV9zZWMpOworCXRtLT50bV9taW4gPSBiY2QyYmluKHRtLT50bV9taW4pOworCXRtLT50bV9ob3VyID0gYmNkMmJpbih0bS0+dG1faG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKHRtLT50bV9tZGF5KTsKKwl0bS0+dG1fbW9uID0gYmNkMmJpbih0bS0+dG1fbW9uKTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4odG0tPnRtX3llYXIpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGhvdyB0aGUgUlRDIHVzZXMgdGhlIHZhbHVlcworCSAqIGFuZCBob3cgdGhleSBhcmUgZGVmaW5lZCBpbiBhIHN0cnVjdCBydGNfdGltZTsKKwkgKi8KKwl0bS0+dG1feWVhciArPSA3MDsKKwlpZiAodG0tPnRtX3llYXIgPD0gNjkpCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKworCXRtLT50bV9tb24tLTsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBtNDh0MzVfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWM7CisJdW5zaWduZWQgaW50IHlyczsKKwl1OCBjb250cm9sOworCisJeXJzID0gdG0tPnRtX3llYXIgKyAxOTAwOworCW1vbiA9IHRtLT50bV9tb24gKyAxOyAgIC8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCWRheSA9IHRtLT50bV9tZGF5OworCWhycyA9IHRtLT50bV9ob3VyOworCW1pbiA9IHRtLT50bV9taW47CisJc2VjID0gdG0tPnRtX3NlYzsKKworCWlmICh5cnMgPCAxOTcwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXlycyAtPSAxOTcwOworCWlmICh5cnMgPiAyNTUpICAgIC8qIFRoZXkgYXJlIHVuc2lnbmVkICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHlycyA+IDE2OSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeXJzID49IDEwMCkKKwkJeXJzIC09IDEwMDsKKworCXNlYyA9IGJpbjJiY2Qoc2VjKTsKKwltaW4gPSBiaW4yYmNkKG1pbik7CisJaHJzID0gYmluMmJjZChocnMpOworCWRheSA9IGJpbjJiY2QoZGF5KTsKKwltb24gPSBiaW4yYmNkKG1vbik7CisJeXJzID0gYmluMmJjZCh5cnMpOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJY29udHJvbCA9IHJlYWRiKCZwcml2LT5yZWctPmNvbnRyb2wpOworCXdyaXRlYihjb250cm9sIHwgTTQ4VDM1X1JUQ19TRVQsICZwcml2LT5yZWctPmNvbnRyb2wpOworCXdyaXRlYih5cnMsICZwcml2LT5yZWctPnllYXIpOworCXdyaXRlYihtb24sICZwcml2LT5yZWctPm1vbnRoKTsKKwl3cml0ZWIoZGF5LCAmcHJpdi0+cmVnLT5kYXRlKTsKKwl3cml0ZWIoaHJzLCAmcHJpdi0+cmVnLT5ob3VyKTsKKwl3cml0ZWIobWluLCAmcHJpdi0+cmVnLT5taW4pOworCXdyaXRlYihzZWMsICZwcml2LT5yZWctPnNlYyk7CisJd3JpdGViKGNvbnRyb2wsICZwcml2LT5yZWctPmNvbnRyb2wpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDh0MzVfb3BzID0geworCS5yZWFkX3RpbWUJPSBtNDh0MzVfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG00OHQzNV9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG00OHQzNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IG00OHQzNV9wcml2ICpwcml2OworCWludCByZXQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtNDh0MzVfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwkvKgorCSAqIGtsdWRnZTogcmVtb3ZlIHRoZSAjaWZuZGVmIGFmdGVyIGlvYzMgcmVzb3VyY2UKKwkgKiBjb25mbGljdHMgYXJlIHJlc29sdmVkCisJICovCisjaWZuZGVmIENPTkZJR19TR0lfSVAyNworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPnJlZyA9IGlvcmVtYXAocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWlmICghcHJpdi0+cmVnKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibTQ4dDM1IiwgJnBkZXYtPmRldiwKKwkJCQkgICZtNDh0MzVfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPnJ0YyA9IHJ0YzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChwcml2LT5ydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlmIChwcml2LT5yZWcpCisJCWlvdW5tYXAocHJpdi0+cmVnKTsKKwlpZiAocHJpdi0+YmFzZWFkZHIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbTQ4dDM1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDh0MzVfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaW91bm1hcChwcml2LT5yZWcpOworI2lmbmRlZiBDT05GSUdfU0dJX0lQMjcKKwlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworI2VuZGlmCisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG00OHQzNV9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDh0MzUiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBtNDh0MzVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtNDh0MzVfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG00OHQzNV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbTQ4dDM1X3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtNDh0MzVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNDh0MzVfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEJvZ2VuZG9lcmZlciA8dHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTTQ4VDM1IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLW00OHQzNSIpOworCittb2R1bGVfaW5pdChtNDh0MzVfaW5pdCk7Cittb2R1bGVfZXhpdChtNDh0MzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKaW5kZXggMDEzZTZjMS4uY2U0ZWZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtMjQsOCArMjQsOSBAQAogI2RlZmluZSBOT19JUlEJKC0xKQogI2VuZGlmCiAKLSNkZWZpbmUgTTQ4VDU5X1JFQUQocmVnKQlwZGF0YS0+cmVhZF9ieXRlKGRldiwgcmVnKQotI2RlZmluZSBNNDhUNTlfV1JJVEUodmFsLCByZWcpCXBkYXRhLT53cml0ZV9ieXRlKGRldiwgcmVnLCB2YWwpCisjZGVmaW5lIE00OFQ1OV9SRUFEKHJlZykgKHBkYXRhLT5yZWFkX2J5dGUoZGV2LCBwZGF0YS0+b2Zmc2V0ICsgcmVnKSkKKyNkZWZpbmUgTTQ4VDU5X1dSSVRFKHZhbCwgcmVnKSBcCisJKHBkYXRhLT53cml0ZV9ieXRlKGRldiwgcGRhdGEtPm9mZnNldCArIHJlZywgdmFsKSkKIAogI2RlZmluZSBNNDhUNTlfU0VUX0JJVFMobWFzaywgcmVnKQlcCiAJTTQ4VDU5X1dSSVRFKChNNDhUNTlfUkVBRChyZWcpIHwgKG1hc2spKSwgKHJlZykpCkBAIC0zNCw3ICszNSw2IEBACiAKIHN0cnVjdCBtNDh0NTlfcHJpdmF0ZSB7CiAJdm9pZCBfX2lvbWVtICppb2FkZHI7Ci0JdW5zaWduZWQgaW50IHNpemU7IC8qIGlvbWVtIHNpemUgKi8KIAlpbnQgaXJxOwogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJc3BpbmxvY2tfdCBsb2NrOyAvKiBzZXJpYWxpemUgdGhlIE5WUkFNIGFuZCBSVEMgYWNjZXNzICovCkBAIC04Miw3ICs4Miw4IEBACiAJdG0tPnRtX21kYXkJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NREFZKSk7CiAKIAl2YWwgPSBNNDhUNTlfUkVBRChNNDhUNTlfV0RBWSk7Ci0JaWYgKCh2YWwgJiBNNDhUNTlfV0RBWV9DRUIpICYmICh2YWwgJiBNNDhUNTlfV0RBWV9DQikpIHsKKwlpZiAoKHBkYXRhLT50eXBlID09IE00OFQ1OVJUQ19UWVBFX000OFQ1OSkgJiYKKwkgICAgKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkgewogCQlkZXZfZGJnKGRldiwgIkNlbnR1cnkgYml0IGlzIGVuYWJsZWRcbiIpOwogCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCiAJfQpAQCAtMTI2LDcgKzEyNyw3IEBACiAJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9tb24gKyAxKSAmIDB4MUYpLCBNNDhUNTlfTU9OVEgpOwogCU00OFQ1OV9XUklURShCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKSwgTTQ4VDU5X1lFQVIpOwogCi0JaWYgKHRtLT50bV95ZWFyLzEwMCkKKwlpZiAocGRhdGEtPnR5cGUgPT0gTTQ4VDU5UlRDX1RZUEVfTTQ4VDU5ICYmICh0bS0+dG1feWVhciAvIDEwMCkpCiAJCXZhbCA9IChNNDhUNTlfV0RBWV9DRUIgfCBNNDhUNTlfV0RBWV9DQik7CiAJdmFsIHw9IChCSU4yQkNEKHRtLT50bV93ZGF5KSAmIDB4MDcpOwogCU00OFQ1OV9XUklURSh2YWwsIE00OFQ1OV9XREFZKTsKQEAgLTMxMCw2ICszMTEsMTEgQEAKIAkucHJvYwkJPSBtNDh0NTlfcnRjX3Byb2MsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbTQ4dDAyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG00OHQ1OV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG00OHQ1OV9ydGNfc2V0X3RpbWUsCit9OworCiBzdGF0aWMgc3NpemVfdCBtNDh0NTlfbnZyYW1fcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCiAJCQkJY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKQEAgLTMyMSw3ICszMjcsNyBAQAogCXNzaXplX3QgY250ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IE00OFQ1OV9OVlJBTV9TSVpFOyBjbnQrKywgc2l6ZS0tKSB7CisJZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IHBkYXRhLT5vZmZzZXQ7IGNudCsrLCBzaXplLS0pIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOwogCQkqYnVmKysgPSBNNDhUNTlfUkVBRChjbnQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKQEAgLTM0MSw3ICszNDcsNyBAQAogCXNzaXplX3QgY250ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IE00OFQ1OV9OVlJBTV9TSVpFOyBjbnQrKywgc2l6ZS0tKSB7CisJZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IHBkYXRhLT5vZmZzZXQ7IGNudCsrLCBzaXplLS0pIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOwogCQlNNDhUNTlfV1JJVEUoKmJ1ZisrLCBjbnQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKQEAgLTM1OCw3ICszNjQsNiBAQAogCX0sCiAJLnJlYWQgPSBtNDh0NTlfbnZyYW1fcmVhZCwKIAkud3JpdGUgPSBtNDh0NTlfbnZyYW1fd3JpdGUsCi0JLnNpemUgPSBNNDhUNTlfTlZSQU1fU0laRSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG00OHQ1OV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM2Nyw2ICszNzIsOCBAQAogCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0ID0gLUVOT01FTTsKKwljaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzICpvcHM7CiAKIAkvKiBUaGlzIGNoaXAgY291bGQgYmUgbWVtb3J5LW1hcHBlZCBvciBJL08tbWFwcGVkICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTM5MSw2ICszOTgsOCBAQAogCQkJLyogRW5zdXJlIHdlIG9ubHkga21hbGxvYyBwbGF0Zm9ybSBkYXRhIG9uY2UgKi8KIAkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAJCX0KKwkJaWYgKCFwZGF0YS0+dHlwZSkKKwkJCXBkYXRhLT50eXBlID0gTTQ4VDU5UlRDX1RZUEVfTTQ4VDU5OwogCiAJCS8qIFRyeSB0byB1c2UgdGhlIGdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgb3BzICovCiAJCWlmICghcGRhdGEtPndyaXRlX2J5dGUpCkBAIC00MDMsMTAgKzQxMiwxNCBAQAogCWlmICghbTQ4dDU5KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW00OHQ1OS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7Ci0JbTQ4dDU5LT5pb2FkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIG00OHQ1OS0+c2l6ZSk7Ci0JaWYgKCFtNDh0NTktPmlvYWRkcikKLQkJZ290byBvdXQ7CisJbTQ4dDU5LT5pb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCisJaWYgKCFtNDh0NTktPmlvYWRkcikgeworCQkvKiBpb2FkZHIgbm90IG1hcHBlZCBleHRlcm5hbGx5ICovCisJCW00OHQ1OS0+aW9hZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwkJaWYgKCFtNDh0NTktPmlvYWRkcikKKwkJCWdvdG8gb3V0OworCX0KIAogCS8qIFRyeSB0byBnZXQgaXJxIG51bWJlci4gV2UgYWxzbyBjYW4gd29yayBpbgogCSAqIHRoZSBtb2RlIHdpdGhvdXQgSVJRLgpAQCAtNDIxLDE0ICs0MzQsMzYgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCX0KKwlzd2l0Y2ggKHBkYXRhLT50eXBlKSB7CisJY2FzZSBNNDhUNTlSVENfVFlQRV9NNDhUNTk6CisJCW5hbWUgPSAibTQ4dDU5IjsKKwkJb3BzID0gJm00OHQ1OV9ydGNfb3BzOworCQlwZGF0YS0+b2Zmc2V0ID0gMHgxZmYwOworCQlicmVhazsKKwljYXNlIE00OFQ1OVJUQ19UWVBFX000OFQwMjoKKwkJbmFtZSA9ICJtNDh0MDIiOworCQlvcHMgPSAmbTQ4dDAyX3J0Y19vcHM7CisJCXBkYXRhLT5vZmZzZXQgPSAweDdmMDsKKwkJYnJlYWs7CisJY2FzZSBNNDhUNTlSVENfVFlQRV9NNDhUMDg6CisJCW5hbWUgPSAibTQ4dDA4IjsKKwkJb3BzID0gJm00OHQwMl9ydGNfb3BzOworCQlwZGF0YS0+b2Zmc2V0ID0gMHgxZmYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIFJUQyB0eXBlXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQogCi0JbTQ4dDU5LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtNDh0NTkiLCAmcGRldi0+ZGV2LAotCQkJCSZtNDh0NTlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCW00OHQ1OS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihuYW1lLCAmcGRldi0+ZGV2LCBvcHMsIFRISVNfTU9EVUxFKTsKIAlpZiAoSVNfRVJSKG00OHQ1OS0+cnRjKSkgewogCQlyZXQgPSBQVFJfRVJSKG00OHQ1OS0+cnRjKTsKIAkJZ290byBvdXQ7CiAJfQogCisJbTQ4dDU5X252cmFtX2F0dHIuc2l6ZSA9IHBkYXRhLT5vZmZzZXQ7CisKIAlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmbTQ4dDU5X252cmFtX2F0dHIpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtNDUyLDExICs0ODcsMTIgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG00OHQ1OV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZtNDh0NTlfbnZyYW1fYXR0cik7CiAJaWYgKCFJU19FUlIobTQ4dDU5LT5ydGMpKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIobTQ4dDU5LT5ydGMpOwotCWlmIChtNDh0NTktPmlvYWRkcikKKwlpZiAobTQ4dDU5LT5pb2FkZHIgJiYgIXBkYXRhLT5pb2FkZHIpCiAJCWlvdW5tYXAobTQ4dDU5LT5pb2FkZHIpOwogCWlmIChtNDh0NTktPmlycSAhPSBOT19JUlEpCiAJCWZyZWVfaXJxKG00OHQ1OS0+aXJxLCAmcGRldi0+ZGV2KTsKQEAgLTQ5MSw1ICs1MjcsNSBAQAogbW9kdWxlX2V4aXQobTQ4dDU5X3J0Y19leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTTQ4VDU5IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTTQ4VDU5L000OFQwMi9NNDhUMDggUlRDIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW1heDY5MDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAwLmMKaW5kZXggZGVkM2MwYS4uMTJjOWNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW1heDY5MDAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMC5jCkBAIC0xNywxOSArMTcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jZGVmaW5lIERSVl9OQU1FICJtYXg2OTAwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yIgogCiAvKgogICogcmVnaXN0ZXIgaW5kaWNlcwogICovCi0jZGVmaW5lIE1BWDY5MDBfUkVHX1NDCQkJMAkvKiBzZWNvbmRzCTAwLTU5ICovCi0jZGVmaW5lIE1BWDY5MDBfUkVHX01OCQkJMQkvKiBtaW51dGVzCTAwLTU5ICovCi0jZGVmaW5lIE1BWDY5MDBfUkVHX0hSCQkJMgkvKiBob3VycwkwMC0yMyAqLwotI2RlZmluZSBNQVg2OTAwX1JFR19EVAkJCTMJLyogZGF5IG9mIG1vbnRoCTAwLTMxICovCi0jZGVmaW5lIE1BWDY5MDBfUkVHX01PCQkJNAkvKiBtb250aAkwMS0xMiAqLwotI2RlZmluZSBNQVg2OTAwX1JFR19EVwkJCTUJLyogZGF5IG9mIHdlZWsJIDEtNyAgKi8KLSNkZWZpbmUgTUFYNjkwMF9SRUdfWVIJCQk2CS8qIHllYXIJCTAwLTk5ICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX1NDCQkJMAkvKiBzZWNvbmRzICAgICAgMDAtNTkgKi8KKyNkZWZpbmUgTUFYNjkwMF9SRUdfTU4JCQkxCS8qIG1pbnV0ZXMgICAgICAwMC01OSAqLworI2RlZmluZSBNQVg2OTAwX1JFR19IUgkJCTIJLyogaG91cnMgICAgICAgIDAwLTIzICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX0RUCQkJMwkvKiBkYXkgb2YgbW9udGggMDAtMzEgKi8KKyNkZWZpbmUgTUFYNjkwMF9SRUdfTU8JCQk0CS8qIG1vbnRoICAgICAgICAwMS0xMiAqLworI2RlZmluZSBNQVg2OTAwX1JFR19EVwkJCTUJLyogZGF5IG9mIHdlZWsgICAxLTcgICovCisjZGVmaW5lIE1BWDY5MDBfUkVHX1lSCQkJNgkvKiB5ZWFyICAgICAgICAgMDAtOTkgKi8KICNkZWZpbmUgTUFYNjkwMF9SRUdfQ1QJCQk3CS8qIGNvbnRyb2wgKi8KIAkJCQkJCS8qIHJlZ2lzdGVyIDggaXMgdW5kb2N1bWVudGVkICovCiAjZGVmaW5lIE1BWDY5MDBfUkVHX0NFTlRVUlkJCTkJLyogY2VudHVyeSAqLwpAQCAtMzksNyArMzgsNiBAQAogCiAjZGVmaW5lIE1BWDY5MDBfUkVHX0NUX1dQCQkoMSA8PCA3KQkvKiBXcml0ZSBQcm90ZWN0ICovCiAKLQogLyoKICAqIHJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMKICAqLwpAQCAtNTIsMTYgKzUwLDcgQEAKIAogI2RlZmluZSBNQVg2OTAwX0lETEVfVElNRV9BRlRFUl9XUklURQkzCS8qIHNwZWNpZmljYXRpb24gc2F5cyAyLjUgbVMgKi8KIAotI2RlZmluZSBNQVg2OTAwX0kyQ19BRERSCQkweGEwCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JTUFYNjkwMF9JMkNfQUREUiA+PiAxLAotCUkyQ19DTElFTlRfRU5ECi19OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsJCQkvKiBkZWZpbmVzIGFkZHJfZGF0YSAqLwotCi1zdGF0aWMgaW50IG1heDY5MDBfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQpOworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDY5MDBfZHJpdmVyOwogCiBzdGF0aWMgaW50IG1heDY5MDBfaTJjX3JlYWRfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCAqYnVmKQogewpAQCAtNjksMzYgKzU4LDM1IEBACiAJdTggcmVnX2NlbnR1cnlfcmVhZFsxXSA9IHsgTUFYNjkwMF9SRUdfQ0VOVFVSWV9SRUFEIH07CiAJc3RydWN0IGkyY19tc2cgbXNnc1s0XSA9IHsKIAkJewotCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCi0JCQkuZmxhZ3MJPSAwLCAvKiB3cml0ZSAqLwotCQkJLmxlbgk9IHNpemVvZihyZWdfYnVyc3RfcmVhZCksCi0JCQkuYnVmCT0gcmVnX2J1cnN0X3JlYWQKLQkJfSwKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gMCwJLyogd3JpdGUgKi8KKwkJIC5sZW4gPSBzaXplb2YocmVnX2J1cnN0X3JlYWQpLAorCQkgLmJ1ZiA9IHJlZ19idXJzdF9yZWFkfQorCQksCiAJCXsKLQkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAotCQkJLmZsYWdzCT0gSTJDX01fUkQsCi0JCQkubGVuCT0gTUFYNjkwMF9CVVJTVF9MRU4sCi0JCQkuYnVmCT0gYnVmCi0JCX0sCisJCSAuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJIC5mbGFncyA9IEkyQ19NX1JELAorCQkgLmxlbiA9IE1BWDY5MDBfQlVSU1RfTEVOLAorCQkgLmJ1ZiA9IGJ1Zn0KKwkJLAogCQl7Ci0JCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKLQkJCS5mbGFncwk9IDAsIC8qIHdyaXRlICovCi0JCQkubGVuCT0gc2l6ZW9mKHJlZ19jZW50dXJ5X3JlYWQpLAotCQkJLmJ1Zgk9IHJlZ19jZW50dXJ5X3JlYWQKLQkJfSwKKwkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkgLmZsYWdzID0gMCwJLyogd3JpdGUgKi8KKwkJIC5sZW4gPSBzaXplb2YocmVnX2NlbnR1cnlfcmVhZCksCisJCSAuYnVmID0gcmVnX2NlbnR1cnlfcmVhZH0KKwkJLAogCQl7Ci0JCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKLQkJCS5mbGFncwk9IEkyQ19NX1JELAotCQkJLmxlbgk9IHNpemVvZihidWZbTUFYNjkwMF9SRUdfQ0VOVFVSWV0pLAotCQkJLmJ1Zgk9ICZidWZbTUFYNjkwMF9SRUdfQ0VOVFVSWV0KLQkJfQorCQkgLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCSAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJIC5sZW4gPSBzaXplb2YoYnVmW01BWDY5MDBfUkVHX0NFTlRVUlldKSwKKwkJIC5idWYgPSAmYnVmW01BWDY5MDBfUkVHX0NFTlRVUlldCisJCSB9CiAJfTsKIAlpbnQgcmM7CiAKIAlyYyA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOwogCWlmIChyYyAhPSBBUlJBWV9TSVpFKG1zZ3MpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJlZ2lzdGVyIHJlYWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWdpc3RlciByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDksMjAgKzk3LDE4IEBACiAJdTggaTJjX2NlbnR1cnlfYnVmWzEgKyAxXSA9IHsgTUFYNjkwMF9SRUdfQ0VOVFVSWV9XUklURSB9OwogCXN0cnVjdCBpMmNfbXNnIGNlbnR1cnlfbXNnc1sxXSA9IHsKIAkJewotCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCi0JCQkuZmxhZ3MJPSAwLCAvKiB3cml0ZSAqLwotCQkJLmxlbgk9IHNpemVvZihpMmNfY2VudHVyeV9idWYpLAotCQkJLmJ1Zgk9IGkyY19jZW50dXJ5X2J1ZgotCQl9CisJCSAuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJIC5mbGFncyA9IDAsCS8qIHdyaXRlICovCisJCSAubGVuID0gc2l6ZW9mKGkyY19jZW50dXJ5X2J1ZiksCisJCSAuYnVmID0gaTJjX2NlbnR1cnlfYnVmfQogCX07CiAJdTggaTJjX2J1cnN0X2J1ZltNQVg2OTAwX0JVUlNUX0xFTiArIDFdID0geyBNQVg2OTAwX1JFR19CVVJTVF9XUklURSB9OwogCXN0cnVjdCBpMmNfbXNnIGJ1cnN0X21zZ3NbMV0gPSB7CiAJCXsKLQkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAotCQkJLmZsYWdzCT0gMCwgLyogd3JpdGUgKi8KLQkJCS5sZW4JPSBzaXplb2YoaTJjX2J1cnN0X2J1ZiksCi0JCQkuYnVmCT0gaTJjX2J1cnN0X2J1ZgotCQl9CisJCSAuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJIC5mbGFncyA9IDAsCS8qIHdyaXRlICovCisJCSAubGVuID0gc2l6ZW9mKGkyY19idXJzdF9idWYpLAorCQkgLmJ1ZiA9IGkyY19idXJzdF9idWZ9CiAJfTsKIAlpbnQgcmM7CiAKQEAgLTEzMywxMCArMTE5LDEyIEBACiAJICogYml0IGFzIHBhcnQgb2YgdGhlIGJ1cnN0IHdyaXRlLgogCSAqLwogCWkyY19jZW50dXJ5X2J1ZlsxXSA9IGJ1ZltNQVg2OTAwX1JFR19DRU5UVVJZXTsKKwogCXJjID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgY2VudHVyeV9tc2dzLAogCQkJICBBUlJBWV9TSVpFKGNlbnR1cnlfbXNncykpOwogCWlmIChyYyAhPSBBUlJBWV9TSVpFKGNlbnR1cnlfbXNncykpCiAJCWdvdG8gd3JpdGVfZmFpbGVkOworCiAJbXNsZWVwKE1BWDY5MDBfSURMRV9USU1FX0FGVEVSX1dSSVRFKTsKIAogCW1lbWNweSgmaTJjX2J1cnN0X2J1ZlsxXSwgYnVmLCBNQVg2OTAwX0JVUlNUX0xFTik7CkBAIC0xNDgsNDUgKzEzNiwxMSBAQAogCiAJcmV0dXJuIDA7CiAKLXdyaXRlX2ZhaWxlZDoKLQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWdpc3RlciB3cml0ZSBmYWlsZWRcbiIsCi0JCV9fZnVuY19fKTsKKyB3cml0ZV9mYWlsZWQ6CisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVnaXN0ZXIgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgbWF4NjkwMF9pMmNfdmFsaWRhdGVfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JdTggcmVnc1tNQVg2OTAwX1JFR19MRU5dOwotCXU4IHplcm9fbWFza1tdID0gewotCQkweDgwLAkvKiBzZWNvbmRzICovCi0JCTB4ODAsCS8qIG1pbnV0ZXMgKi8KLQkJMHg0MCwJLyogaG91cnMgKi8KLQkJMHhjMCwJLyogZGF5IG9mIG1vbnRoICovCi0JCTB4ZTAsCS8qIG1vbnRoICovCi0JCTB4ZjgsCS8qIGRheSBvZiB3ZWVrICovCi0JCTB4MDAsCS8qIHllYXIgKi8KLQkJMHg3ZiwJLyogY29udHJvbCAqLwotCX07Ci0JaW50IGk7Ci0JaW50IHJjOwotCWludCByZXNlcnZlZDsKLQotCXJlc2VydmVkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjkwMF9SRUdfUkVTRVJWRURfUkVBRCk7Ci0JaWYgKHJlc2VydmVkICE9IDB4MDcpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmMgPSBtYXg2OTAwX2kyY19yZWFkX3JlZ3MoY2xpZW50LCByZWdzKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh6ZXJvX21hc2spOyArK2kpIHsKLQkJaWYgKHJlZ3NbaV0gJiB6ZXJvX21hc2tbaV0pCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtYXg2OTAwX2kyY19yZWFkX3RpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKIAlpbnQgcmM7CkBAIC0yMDIsNyArMTU2LDcgQEAKIAl0bS0+dG1fbWRheSA9IEJDRDJCSU4ocmVnc1tNQVg2OTAwX1JFR19EVF0pOwogCXRtLT50bV9tb24gPSBCQ0QyQklOKHJlZ3NbTUFYNjkwMF9SRUdfTU9dKSAtIDE7CiAJdG0tPnRtX3llYXIgPSBCQ0QyQklOKHJlZ3NbTUFYNjkwMF9SRUdfWVJdKSArCi0JCSAgICAgIEJDRDJCSU4ocmVnc1tNQVg2OTAwX1JFR19DRU5UVVJZXSkgKiAxMDAgLSAxOTAwOworCSAgICBCQ0QyQklOKHJlZ3NbTUFYNjkwMF9SRUdfQ0VOVFVSWV0pICogMTAwIC0gMTkwMDsKIAl0bS0+dG1fd2RheSA9IEJDRDJCSU4ocmVnc1tNQVg2OTAwX1JFR19EV10pOwogCiAJcmV0dXJuIDA7CkBAIC0yMTEsNyArMTY1LDcgQEAKIHN0YXRpYyBpbnQgbWF4NjkwMF9pMmNfY2xlYXJfd3JpdGVfcHJvdGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCByYzsKLQlyYyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEgKGNsaWVudCwgTUFYNjkwMF9SRUdfQ09OVFJPTF9XUklURSwgMCk7CisJcmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjkwMF9SRUdfQ09OVFJPTF9XUklURSwgMCk7CiAJaWYgKHJjIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBjb250cm9sIHJlZ2lzdGVyIHdyaXRlIGZhaWxlZFxuIiwKIAkJCV9fZnVuY19fKTsKQEAgLTIyMCw4ICsxNzQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDBfaTJjX3NldF90aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJc3RydWN0IHJ0Y190aW1lIGNvbnN0ICp0bSkKK3N0YXRpYyBpbnQKK21heDY5MDBfaTJjX3NldF90aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSBjb25zdCAqdG0pCiB7CiAJdTggcmVnc1tNQVg2OTAwX1JFR19MRU5dOwogCWludCByYzsKQEAgLTI1OCw4OSArMjEyLDQ5IEBACiAJcmV0dXJuIG1heDY5MDBfaTJjX3NldF90aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBtYXg2OTAwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgbWF4NjkwMF9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjkwMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKmNvbnN0IHJ0YyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWlmIChydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwogCi0JcmV0dXJuIGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2OTAwX2RyaXZlciA9IHsKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBEUlZfTkFNRSwKLQl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfTUFYNjkwMCwKLQkuYXR0YWNoX2FkYXB0ZXIgPSBtYXg2OTAwX2F0dGFjaF9hZGFwdGVyLAotCS5kZXRhY2hfY2xpZW50CT0gbWF4NjkwMF9kZXRhY2hfY2xpZW50LAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDY5MDBfcnRjX29wcyA9IHsKLQkucmVhZF90aW1lCT0gbWF4NjkwMF9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZQk9IG1heDY5MDBfcnRjX3NldF90aW1lLAorCS5yZWFkX3RpbWUgPSBtYXg2OTAwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gbWF4NjkwMF9ydGNfc2V0X3RpbWUsCiB9OwogCi1zdGF0aWMgaW50IG1heDY5MDBfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQpCitzdGF0aWMgaW50CittYXg2OTAwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBOVUxMOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxvdXQ7Ci0JfQorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBmYWlsb3V0OwotCX0KLQotCWNsaWVudC0+YWRkciA9IGFkZHI7Ci0JY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQljbGllbnQtPmRyaXZlciA9ICZtYXg2OTAwX2RyaXZlcjsKLQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgRFJWX05BTUUsIEkyQ19OQU1FX1NJWkUpOwotCi0JaWYgKGtpbmQgPCAwKSB7Ci0JCXJjID0gbWF4NjkwMF9pMmNfdmFsaWRhdGVfY2xpZW50KGNsaWVudCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGZhaWxvdXQ7Ci0JfQotCi0JcmMgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbG91dDsKLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwKLQkJICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImNoaXAgZm91bmQsIGRyaXZlciB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKIAlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKG1heDY5MDBfZHJpdmVyLmRyaXZlci5uYW1lLAotCQkJCSAgJmNsaWVudC0+ZGV2LAotCQkJCSAgJm1heDY5MDBfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkgewotCQlyYyA9IFBUUl9FUlIocnRjKTsKLQkJZ290byBmYWlsb3V0X2RldGFjaDsKLQl9CisJCQkJICAmY2xpZW50LT5kZXYsICZtYXg2OTAwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBydGMpOwogCiAJcmV0dXJuIDA7Ci0KLWZhaWxvdXRfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci1mYWlsb3V0OgotCWtmcmVlKGNsaWVudCk7Ci0JcmV0dXJuIHJjOwogfQogCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4NjkwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAicnRjLW1heDY5MDAiLAorCQkgICB9LAorCS5wcm9iZSA9IG1heDY5MDBfcHJvYmUsCisJLnJlbW92ZSA9IG1heDY5MDBfcmVtb3ZlLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbWF4NjkwMF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtYXg2OTAwX2RyaXZlcik7CkBAIC0zNTIsNiArMjY2LDcgQEAKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSBNQVg2OTAwIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhbGUgRmFybnN3b3J0aCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMKaW5kZXggNzQ4YTUwMi4uYTgyOWYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jCkBAIC0xNzksNTggKzE3OSw2IEBACiAJdW5zaWduZWQgY2hhciBtYXg7CiB9OwogCi1zdGF0aWMgaW50IHBjZjg1NjNfdmFsaWRhdGVfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGk7Ci0KLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBjZjg1NjNfbGltaXQgcGF0dGVybltdID0gewotCQkvKiByZWdpc3RlciwgbWFzaywgbWluLCBtYXggKi8KLQkJeyBQQ0Y4NTYzX1JFR19TQywJMHg3RiwJMCwJNTkJfSwKLQkJeyBQQ0Y4NTYzX1JFR19NTiwJMHg3RiwJMCwJNTkJfSwKLQkJeyBQQ0Y4NTYzX1JFR19IUiwJMHgzRiwJMCwJMjMJfSwKLQkJeyBQQ0Y4NTYzX1JFR19ETSwJMHgzRiwJMCwJMzEJfSwKLQkJeyBQQ0Y4NTYzX1JFR19NTywJMHgxRiwJMCwJMTIJfSwKLQl9OwotCi0JLyogY2hlY2sgbGltaXRzIChvbmx5IHJlZ2lzdGVycyB3aXRoIGJjZCB2YWx1ZXMpICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0dGVybik7IGkrKykgewotCQlpbnQgeGZlcjsKLQkJdW5zaWduZWQgY2hhciB2YWx1ZTsKLQkJdW5zaWduZWQgY2hhciBidWYgPSBwYXR0ZXJuW2ldLnJlZzsKLQotCQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCQl7IGNsaWVudC0+YWRkciwgMCwgMSwgJmJ1ZiB9LAotCQkJeyBjbGllbnQtPmFkZHIsIEkyQ19NX1JELCAxLCAmYnVmIH0sCi0JCX07Ci0KLQkJeGZlciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOwotCi0JCWlmICh4ZmVyICE9IEFSUkFZX1NJWkUobXNncykpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJCSIlczogY291bGQgbm90IHJlYWQgcmVnaXN0ZXIgMHglMDJYXG4iLAotCQkJCV9fZnVuY19fLCBwYXR0ZXJuW2ldLnJlZyk7Ci0KLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJdmFsdWUgPSBCQ0QyQklOKGJ1ZiAmIHBhdHRlcm5baV0ubWFzayk7Ci0KLQkJaWYgKHZhbHVlID4gcGF0dGVybltpXS5tYXggfHwKLQkJCXZhbHVlIDwgcGF0dGVybltpXS5taW4pIHsKLQkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkJCSIlczogcGF0dGVybj0lZCwgcmVnPSV4LCBtYXNrPTB4JTAyeCwgbWluPSVkLCAiCi0JCQkJIm1heD0lZCwgdmFsdWU9JWQsIHJhdz0weCUwMlhcbiIsCi0JCQkJX19mdW5jX18sIGksIHBhdHRlcm5baV0ucmVnLCBwYXR0ZXJuW2ldLm1hc2ssCi0JCQkJcGF0dGVybltpXS5taW4sIHBhdHRlcm5baV0ubWF4LAotCQkJCXZhbHVlLCBidWYpOwotCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHBjZjg1NjNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CiAJcmV0dXJuIHBjZjg1NjNfZ2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOwpAQCAtMjYyLDEyICsyMTAsNiBAQAogCWlmICghcGNmODU2MykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBWZXJpZnkgdGhlIGNoaXAgaXMgcmVhbGx5IGFuIFBDRjg1NjMgKi8KLQlpZiAocGNmODU2M192YWxpZGF0ZV9jbGllbnQoY2xpZW50KSA8IDApIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBleGl0X2tmcmVlOwotCX0KLQogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImNoaXAgZm91bmQsIGRyaXZlciB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKIAlwY2Y4NTYzLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBjZjg1NjNfZHJpdmVyLmRyaXZlci5uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBsMDMwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcGwwMzAuYwppbmRleCA4NDQ4ZWViLi44MjYxNTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcGwwMzAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcGwwMzAuYwpAQCAtMzQsMTUgKzM0LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgcGwwMzBfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBsMDMwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCiBzdGF0aWMgaW50IHBsMDMwX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKQEAgLTEwNCw4ICs5NSw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBwbDAzMF9vcHMgPSB7Ci0JLm9wZW4JCT0gcGwwMzBfb3BlbiwKLQkucmVsZWFzZQk9IHBsMDMwX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHBsMDMwX2lvY3RsLAogCS5yZWFkX3RpbWUJPSBwbDAzMF9yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gcGwwMzBfc2V0X3RpbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcGwwMzEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCmluZGV4IDA4YjQ2MTAuLjMzM2VlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCkBAIC00NSwxOCArNDUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBwbDAzMV9vcGVuKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQkvKgotCSAqIFdlIHJlcXVlc3QgSVJRIGluIHBsMDMxX3Byb2JlLCBzbyBub3RoaW5nIHRvIGRvIGhlcmUuLi4KLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGwwMzFfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci19Ci0KIHN0YXRpYyBpbnQgcGwwMzFfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0xMTgsOCArMTA2LDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBsMDMxX29wcyA9IHsKLQkub3BlbiA9IHBsMDMxX29wZW4sCi0JLnJlbGVhc2UgPSBwbDAzMV9yZWxlYXNlLAogCS5pb2N0bCA9IHBsMDMxX2lvY3RsLAogCS5yZWFkX3RpbWUgPSBwbDAzMV9yZWFkX3RpbWUsCiAJLnNldF90aW1lID0gcGwwMzFfc2V0X3RpbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwppbmRleCA1NmNhZjZiLi44YjU2MTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKQEAgLTEsOCArMSw5IEBACiAvKgotICogQW4gSTJDIGRyaXZlciBmb3IgUmljb2ggUlM1QzM3MiBhbmQgUlY1QzM4WzY3XSBSVENzCisgKiBBbiBJMkMgZHJpdmVyIGZvciBSaWNvaCBSUzVDMzcyLCBSMjAyNVMvRCBhbmQgUlY1QzM4WzY3XSBSVENzCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdmVsIE1pcm9uY2hpayA8cG1pcm9uY2hpa0BvcHRpZmFjaW8ubmV0PgogICogQ29weXJpZ2h0IChDKSAyMDA2IFRvd2VyIFRlY2hub2xvZ2llcworICogQ29weXJpZ2h0IChDKSAyMDA4IFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTEzLDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC41IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC42IgogCiAKIC8qCkBAIC01MSw3ICs1Miw4IEBACiAjCWRlZmluZSBSUzVDX0NUUkwxX0NUNAkJKDQgPDwgMCkJLyogMSBIeiBsZXZlbCBpcnEgKi8KICNkZWZpbmUgUlM1Q19SRUdfQ1RSTDIJCTE1CiAjCWRlZmluZSBSUzVDMzcyX0NUUkwyXzI0CQkoMSA8PCA1KQotIwlkZWZpbmUgUlM1Q19DVFJMMl9YU1RQCQkoMSA8PCA0KQorIwlkZWZpbmUgUjIwMjVfQ1RSTDJfWFNUCQkoMSA8PCA1KQorIwlkZWZpbmUgUlM1Q19DVFJMMl9YU1RQCQkoMSA8PCA0KQkvKiBvbmx5IGlmICFSMjAyNVMvRCAqLwogIwlkZWZpbmUgUlM1Q19DVFJMMl9DVEZHCQkoMSA8PCAyKQogIwlkZWZpbmUgUlM1Q19DVFJMMl9BQUZHCQkoMSA8PCAxKQkvKiBvciBXQUZHICovCiAjCWRlZmluZSBSUzVDX0NUUkwyX0JBRkcJCSgxIDw8IDApCS8qIG9yIERBRkcgKi8KQEAgLTYzLDYgKzY1LDcgQEAKIAogZW51bSBydGNfdHlwZSB7CiAJcnRjX3VuZGVmID0gMCwKKwlydGNfcjIwMjVzZCwKIAlydGNfcnM1YzM3MmEsCiAJcnRjX3JzNWMzNzJiLAogCXJ0Y19ydjVjMzg2LApAQCAtNzAsNiArNzMsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJzNWMzNzJfaWRbXSA9IHsKKwl7ICJyMjAyNXNkIiwgcnRjX3IyMDI1c2QgfSwKIAl7ICJyczVjMzcyYSIsIHJ0Y19yczVjMzcyYSB9LAogCXsgInJzNWMzNzJiIiwgcnRjX3JzNWMzNzJiIH0sCiAJeyAicnY1YzM4NiIsIHJ0Y19ydjVjMzg2IH0sCkBAIC04OSw2ICs5Myw3IEBACiAJZW51bSBydGNfdHlwZQkJdHlwZTsKIAl1bnNpZ25lZAkJdGltZTI0OjE7CiAJdW5zaWduZWQJCWhhc19pcnE6MTsKKwl1bnNpZ25lZAkJc21idXM6MTsKIAljaGFyCQkJYnVmWzE3XTsKIAljaGFyCQkJKnJlZ3M7CiB9OwpAQCAtMTA2LDEwICsxMTEsMjUgQEAKIAkgKgogCSAqIFRoZSBmaXJzdCBtZXRob2QgZG9lc24ndCB3b3JrIHdpdGggdGhlIGlvcDN4eCBhZGFwdGVyIGRyaXZlciwgb24gYXQKIAkgKiBsZWFzdCA4MDIxOSBjaGlwczsgdGhpcyB3b3JrcyBhcm91bmQgdGhhdCBidWcuCisJICoKKwkgKiBUaGUgdGhpcmQgbWV0aG9kIG9uIHRoZSBvdGhlciBoYW5kIGRvZXNuJ3Qgd29yayBmb3IgdGhlIFNNQnVzLW9ubHkKKwkgKiBjb25maWd1cmF0aW9ucywgc28gd2UgdXNlIHRoZSB0aGUgZmlyc3QgbWV0aG9kIHRoZXJlLCBzdHJpcHBpbmcgb2ZmCisJICogdGhlIGV4dHJhIHJlZ2lzdGVyIGluIHRoZSBwcm9jZXNzLgogCSAqLwotCWlmICgoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSkpICE9IDEpIHsKLQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiY2FuJ3QgcmVhZCByZWdpc3RlcnNcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwlpZiAocnM1Yy0+c21idXMpIHsKKwkJaW50IGFkZHIgPSBSUzVDX0FERFIoUlM1QzM3Ml9SRUdfU0VDUyk7CisJCWludCBzaXplID0gc2l6ZW9mKHJzNWMtPmJ1ZikgLSAxOworCisJCWlmIChpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIGFkZHIsIHNpemUsCisJCQkJCQkgIHJzNWMtPmJ1ZiArIDEpICE9IHNpemUpIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImNhbid0IHJlYWQgcmVnaXN0ZXJzXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAxKSkgIT0gMSkgeworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiY2FuJ3QgcmVhZCByZWdpc3RlcnNcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9CiAKIAlkZXZfZGJnKCZjbGllbnQtPmRldiwKQEAgLTE4Nyw2ICsyMDcsNyBAQAogewogCXN0cnVjdCByczVjMzcyCSpyczVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdW5zaWduZWQgY2hhcglidWZbOF07CisJaW50CQlhZGRyOwogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQgIgogCQkibWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLApAQCAtMTk0LDE2ICsyMTUsMTYgQEAKIAkJdG0tPnRtX3NlYywgdG0tPnRtX21pbiwgdG0tPnRtX2hvdXIsCiAJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uLCB0bS0+dG1feWVhciwgdG0tPnRtX3dkYXkpOwogCi0JYnVmWzBdID0gUlM1Q19BRERSKFJTNUMzNzJfUkVHX1NFQ1MpOwotCWJ1ZlsxXSA9IEJJTjJCQ0QodG0tPnRtX3NlYyk7Ci0JYnVmWzJdID0gQklOMkJDRCh0bS0+dG1fbWluKTsKLQlidWZbM10gPSByczVjX2hyMnJlZyhyczVjLCB0bS0+dG1faG91cik7Ci0JYnVmWzRdID0gQklOMkJDRCh0bS0+dG1fd2RheSk7Ci0JYnVmWzVdID0gQklOMkJDRCh0bS0+dG1fbWRheSk7Ci0JYnVmWzZdID0gQklOMkJDRCh0bS0+dG1fbW9uICsgMSk7Ci0JYnVmWzddID0gQklOMkJDRCh0bS0+dG1feWVhciAtIDEwMCk7CisJYWRkciAgID0gUlM1Q19BRERSKFJTNUMzNzJfUkVHX1NFQ1MpOworCWJ1ZlswXSA9IEJJTjJCQ0QodG0tPnRtX3NlYyk7CisJYnVmWzFdID0gQklOMkJDRCh0bS0+dG1fbWluKTsKKwlidWZbMl0gPSByczVjX2hyMnJlZyhyczVjLCB0bS0+dG1faG91cik7CisJYnVmWzNdID0gQklOMkJDRCh0bS0+dG1fd2RheSk7CisJYnVmWzRdID0gQklOMkJDRCh0bS0+dG1fbWRheSk7CisJYnVmWzVdID0gQklOMkJDRCh0bS0+dG1fbW9uICsgMSk7CisJYnVmWzZdID0gQklOMkJDRCh0bS0+dG1feWVhciAtIDEwMCk7CiAKLQlpZiAoKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgOCkpICE9IDgpIHsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgYWRkciwgc2l6ZW9mKGJ1ZiksIGJ1ZikgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHdyaXRlIGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2NiwxNiArMjg3LDE2IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgcnM1YzM3MgkJKnJzNWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl1bnNpZ25lZCBjaGFyCQlidWZbMl07Ci0JaW50CQkJc3RhdHVzOworCXVuc2lnbmVkIGNoYXIJCWJ1ZjsKKwlpbnQJCQlzdGF0dXMsIGFkZHI7CiAKLQlidWZbMV0gPSByczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXTsKKwlidWYgPSByczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX1VJRV9PRkY6CiAJY2FzZSBSVENfVUlFX09OOgogCQkvKiBzb21lIDMyN2EgbW9kZXMgdXNlIGEgZGlmZmVyZW50IElSUSBwaW4gZm9yIDFIeiBpcnFzICovCiAJCWlmIChyczVjLT50eXBlID09IHJ0Y19yczVjMzcyYQotCQkJCSYmIChidWZbMV0gJiBSUzVDMzcyQV9DVFJMMV9TTDEpKQorCQkJCSYmIChidWYgJiBSUzVDMzcyQV9DVFJMMV9TTDEpKQogCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAljYXNlIFJUQ19BSUVfT0ZGOgogCWNhc2UgUlRDX0FJRV9PTjoKQEAgLTI5MywyOCArMzE0LDMwIEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAKLQlidWZbMF0gPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEpOworCWFkZHIgPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfQUlFX09GRjoJLyogYWxhcm0gb2ZmICovCi0JCWJ1ZlsxXSAmPSB+UlM1Q19DVFJMMV9BQUxFOworCQlidWYgJj0gflJTNUNfQ1RSTDFfQUFMRTsKIAkJYnJlYWs7CiAJY2FzZSBSVENfQUlFX09OOgkvKiBhbGFybSBvbiAqLwotCQlidWZbMV0gfD0gUlM1Q19DVFJMMV9BQUxFOworCQlidWYgfD0gUlM1Q19DVFJMMV9BQUxFOwogCQlicmVhazsKIAljYXNlIFJUQ19VSUVfT0ZGOgkvKiB1cGRhdGUgb2ZmICovCi0JCWJ1ZlsxXSAmPSB+UlM1Q19DVFJMMV9DVF9NQVNLOworCQlidWYgJj0gflJTNUNfQ1RSTDFfQ1RfTUFTSzsKIAkJYnJlYWs7CiAJY2FzZSBSVENfVUlFX09OOgkvKiB1cGRhdGUgb24gKi8KLQkJYnVmWzFdICY9IH5SUzVDX0NUUkwxX0NUX01BU0s7Ci0JCWJ1ZlsxXSB8PSBSUzVDX0NUUkwxX0NUNDsKKwkJYnVmICY9IH5SUzVDX0NUUkwxX0NUX01BU0s7CisJCWJ1ZiB8PSBSUzVDX0NUUkwxX0NUNDsKIAkJYnJlYWs7CiAJfQotCWlmICgoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKSkgIT0gMikgeworCisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBhZGRyLCBidWYpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgdXBkYXRlIGFsYXJtXG4iLAogCQkJcnM1Yy0+cnRjLT5uYW1lKTsKIAkJc3RhdHVzID0gLUVJTzsKIAl9IGVsc2UKLQkJcnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gPSBidWZbMV07CisJCXJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmOworCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzY0LDggKzM4Nyw4IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgcnM1YzM3MgkJKnJzNWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQJCQlzdGF0dXM7Ci0JdW5zaWduZWQgY2hhcgkJYnVmWzRdOworCWludAkJCXN0YXR1cywgYWRkciwgaTsKKwl1bnNpZ25lZCBjaGFyCQlidWZbM107CiAKIAkvKiBvbmx5IGhhbmRsZSB1cCB0byAyNCBob3VycyBpbiB0aGUgZnV0dXJlLCBsaWtlIFJUQ19BTE1fU0VUICovCiAJaWYgKHQtPnRpbWUudG1fbWRheSAhPSAtMQpAQCAtMzgwLDMzICs0MDMsMzYgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJcmV0dXJuIHN0YXR1czsKIAlpZiAocnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gJiBSUzVDX0NUUkwxX0FBTEUpIHsKLQkJYnVmWzBdID0gUlM1Q19BRERSKFJTNUNfUkVHX0NUUkwxKTsKLQkJYnVmWzFdID0gcnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gJiB+UlM1Q19DVFJMMV9BQUxFOwotCQlpZiAoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKSAhPSAyKSB7CisJCWFkZHIgPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEpOworCQlidWZbMF0gPSByczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSAmIH5SUzVDX0NUUkwxX0FBTEU7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmWzBdKSA8IDApIHsKIAkJCXByX2RlYnVnKCIlczogY2FuJ3QgZGlzYWJsZSBhbGFybVxuIiwgcnM1Yy0+cnRjLT5uYW1lKTsKIAkJCXJldHVybiAtRUlPOwogCQl9Ci0JCXJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmWzFdOworCQlyczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlswXTsKIAl9CiAKIAkvKiBzZXQgYWxhcm0gKi8KLQlidWZbMF0gPSBSUzVDX0FERFIoUlM1Q19SRUdfQUxBUk1fQV9NSU4pOwotCWJ1ZlsxXSA9IEJJTjJCQ0QodC0+dGltZS50bV9taW4pOwotCWJ1ZlsyXSA9IHJzNWNfaHIycmVnKHJzNWMsIHQtPnRpbWUudG1faG91cik7Ci0JYnVmWzNdID0gMHg3ZjsJLyogYW55L2FsbCBkYXlzICovCi0JaWYgKChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDQpKSAhPSA0KSB7Ci0JCXByX2RlYnVnKCIlczogY2FuJ3Qgc2V0IGFsYXJtIHRpbWVcbiIsIHJzNWMtPnJ0Yy0+bmFtZSk7Ci0JCXJldHVybiAtRUlPOworCWJ1ZlswXSA9IEJJTjJCQ0QodC0+dGltZS50bV9taW4pOworCWJ1ZlsxXSA9IHJzNWNfaHIycmVnKHJzNWMsIHQtPnRpbWUudG1faG91cik7CisJYnVmWzJdID0gMHg3ZjsJLyogYW55L2FsbCBkYXlzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlhZGRyID0gUlM1Q19BRERSKFJTNUNfUkVHX0FMQVJNX0FfTUlOICsgaSk7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmW2ldKSA8IDApIHsKKwkJCXByX2RlYnVnKCIlczogY2FuJ3Qgc2V0IGFsYXJtIHRpbWVcbiIsIHJzNWMtPnJ0Yy0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAogCS8qIC4uLiBhbmQgbWF5YmUgZW5hYmxlIGl0cyBpcnEgKi8KIAlpZiAodC0+ZW5hYmxlZCkgewotCQlidWZbMF0gPSBSUzVDX0FERFIoUlM1Q19SRUdfQ1RSTDEpOwotCQlidWZbMV0gPSByczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSB8IFJTNUNfQ1RSTDFfQUFMRTsKLQkJaWYgKChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpKSAhPSAyKQorCQlhZGRyID0gUlM1Q19BRERSKFJTNUNfUkVHX0NUUkwxKTsKKwkJYnVmWzBdID0gcnM1Yy0+cmVnc1tSUzVDX1JFR19DVFJMMV0gfCBSUzVDX0NUUkwxX0FBTEU7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgYWRkciwgYnVmWzBdKSA8IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgZW5hYmxlIGFsYXJtXG4iLAogCQkJCXJzNWMtPnJ0Yy0+bmFtZSk7Ci0JCXJzNWMtPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmWzFdOworCQlyczVjLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlswXTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTUwMywxOCArNTI5LDgxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciByczVjMzcyX2RyaXZlcjsKIAorc3RhdGljIGludCByczVjX29zY2lsbGF0b3Jfc2V0dXAoc3RydWN0IHJzNWMzNzIgKnJzNWMzNzIpCit7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IGFkZHIsIGksIHJldCA9IDA7CisKKwlpZiAocnM1YzM3Mi0+dHlwZSA9PSBydGNfcjIwMjVzZCkgeworCQlpZiAoIShyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmIFIyMDI1X0NUUkwyX1hTVCkpCisJCQlyZXR1cm4gcmV0OworCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmPSB+UjIwMjVfQ1RSTDJfWFNUOworCX0gZWxzZSB7CisJCWlmICghKHJzNWMzNzItPnJlZ3NbUlM1Q19SRUdfQ1RSTDJdICYgUlM1Q19DVFJMMl9YU1RQKSkKKwkJCXJldHVybiByZXQ7CisJCXJzNWMzNzItPnJlZ3NbUlM1Q19SRUdfQ1RSTDJdICY9IH5SUzVDX0NUUkwyX1hTVFA7CisJfQorCisJYWRkciAgID0gUlM1Q19BRERSKFJTNUNfUkVHX0NUUkwxKTsKKwlidWZbMF0gPSByczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwxXTsKKwlidWZbMV0gPSByczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXTsKKworCS8qIHVzZSAyNGhyIG1vZGUgKi8KKwlzd2l0Y2ggKHJzNWMzNzItPnR5cGUpIHsKKwljYXNlIHJ0Y19yczVjMzcyYToKKwljYXNlIHJ0Y19yczVjMzcyYjoKKwkJYnVmWzFdIHw9IFJTNUMzNzJfQ1RSTDJfMjQ7CisJCXJzNWMzNzItPnRpbWUyNCA9IDE7CisJCWJyZWFrOworCWNhc2UgcnRjX3IyMDI1c2Q6CisJY2FzZSBydGNfcnY1YzM4NjoKKwljYXNlIHJ0Y19ydjVjMzg3YToKKwkJYnVmWzBdIHw9IFJWNUMzODdfQ1RSTDFfMjQ7CisJCXJzNWMzNzItPnRpbWUyNCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGltcG9zc2libGUgKi8KKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihidWYpOyBpKyspIHsKKwkJYWRkciA9IFJTNUNfQUREUihSUzVDX1JFR19DVFJMMSArIGkpOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHJzNWMzNzItPmNsaWVudCwgYWRkciwgYnVmW2ldKTsKKwkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlswXTsKKwlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSA9IGJ1ZlsxXTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHJzNWMzNzJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IGVyciA9IDA7CisJaW50IHNtYnVzX21vZGUgPSAwOwogCXN0cnVjdCByczVjMzcyICpyczVjMzcyOwogCXN0cnVjdCBydGNfdGltZSB0bTsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDIHwKKwkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbWFzdGVyIG1vZGUgYWRhcHRlciwgdHJ5IGJyZWFraW5nCisJCSAqIGl0IGRvd24gaW4gdG8gdGhlIGJhcmVzdCBvZiBjYXBhYmlsaXRpZXMuCisJCSAqLworCQlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSkKKwkJCXNtYnVzX21vZGUgPSAxOworCQllbHNlIHsKKwkJCS8qIFN0aWxsIG5vIGdvb2QsIGdpdmUgdXAgKi8KKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIGV4aXQ7CisJCX0KIAl9CiAKIAlpZiAoIShyczVjMzcyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzNWMzNzIpLCBHRlBfS0VSTkVMKSkpIHsKQEAgLTUyOCw2ICs2MTcsNyBAQAogCiAJLyogd2UgcmVhZCByZWdpc3RlcnMgMHgwZiB0aGVuIDB4MDAtMHgwZjsgc2tpcCB0aGUgZmlyc3Qgb25lICovCiAJcnM1YzM3Mi0+cmVncyA9ICZyczVjMzcyLT5idWZbMV07CisJcnM1YzM3Mi0+c21idXMgPSBzbWJ1c19tb2RlOwogCiAJZXJyID0gcnM1Y19nZXRfcmVncyhyczVjMzcyKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTU0Myw2ICs2MzMsNyBAQAogCQlpZiAocnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gJiBSUzVDMzcyX0NUUkwyXzI0KQogCQkJcnM1YzM3Mi0+dGltZTI0ID0gMTsKIAkJYnJlYWs7CisJY2FzZSBydGNfcjIwMjVzZDoKIAljYXNlIHJ0Y19ydjVjMzg2OgogCWNhc2UgcnRjX3J2NWMzODdhOgogCQlpZiAocnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMV0gJiBSVjVDMzg3X0NUUkwxXzI0KQpAQCAtNTU4LDM5ICs2NDksMTQgQEAKIAogCS8qIGlmIHRoZSBvc2NpbGxhdG9yIGxvc3QgcG93ZXIgYW5kIG5vIG90aGVyIHNvZnR3YXJlIChsaWtlCiAJICogdGhlIGJvb3Rsb2FkZXIpIHNldCBpdCB1cCwgZG8gaXQgaGVyZS4KKwkgKgorCSAqIFRoZSBSMjAyNVMvRCBkb2VzIHRoaXMgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB0aGUgb3RoZXIKKwkgKiBwYXJ0cywgc28gd2Ugc3BlY2lhbCBjYXNlIHRoYXQuLgogCSAqLwotCWlmIChyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmIFJTNUNfQ1RSTDJfWFNUUCkgewotCQl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKLQotCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSAmPSB+UlM1Q19DVFJMMl9YU1RQOwotCi0JCWJ1ZlswXSA9IFJTNUNfQUREUihSUzVDX1JFR19DVFJMMSk7Ci0JCWJ1ZlsxXSA9IHJzNWMzNzItPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdOwotCQlidWZbMl0gPSByczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXTsKLQotCQkvKiB1c2UgMjRociBtb2RlICovCi0JCXN3aXRjaCAocnM1YzM3Mi0+dHlwZSkgewotCQljYXNlIHJ0Y19yczVjMzcyYToKLQkJY2FzZSBydGNfcnM1YzM3MmI6Ci0JCQlidWZbMl0gfD0gUlM1QzM3Ml9DVFJMMl8yNDsKLQkJCXJzNWMzNzItPnRpbWUyNCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBydGNfcnY1YzM4NjoKLQkJY2FzZSBydGNfcnY1YzM4N2E6Ci0JCQlidWZbMV0gfD0gUlY1QzM4N19DVFJMMV8yNDsKLQkJCXJzNWMzNzItPnRpbWUyNCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIGltcG9zc2libGUgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpKSAhPSAzKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNldHVwIGVycm9yXG4iKTsKLQkJCWdvdG8gZXhpdF9rZnJlZTsKLQkJfQotCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlsxXTsKLQkJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gPSBidWZbMl07CisJZXJyID0gcnM1Y19vc2NpbGxhdG9yX3NldHVwKHJzNWMzNzIpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNldHVwIGVycm9yXG4iKTsKKwkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCWlmIChyczVjMzcyX2dldF9kYXRldGltZShjbGllbnQsICZ0bSkgPCAwKQpAQCAtNTk4LDYgKzY2NCw3IEBACiAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyBmb3VuZCwgJXMsIGRyaXZlciB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIiwKIAkJCSh7IGNoYXIgKnM7IHN3aXRjaCAocnM1YzM3Mi0+dHlwZSkgeworCQkJY2FzZSBydGNfcjIwMjVzZDoJcyA9ICJyMjAyNXNkIjsgYnJlYWs7CiAJCQljYXNlIHJ0Y19yczVjMzcyYToJcyA9ICJyczVjMzcyYSI7IGJyZWFrOwogCQkJY2FzZSBydGNfcnM1YzM3MmI6CXMgPSAicnM1YzM3MmIiOyBicmVhazsKIAkJCWNhc2UgcnRjX3J2NWMzODY6CXMgPSAicnY1YzM4NiI7IGJyZWFrOwpAQCAtNjY3LDcgKzczNCw4IEBACiAKIE1PRFVMRV9BVVRIT1IoCiAJCSJQYXZlbCBNaXJvbmNoaWsgPHBtaXJvbmNoaWtAb3B0aWZhY2lvLm5ldD4sICIKLQkJIkFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PiIpOworCQkiQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+LCAiCisJCSJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSaWNvaCBSUzVDMzcyIFJUQyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zaC5jIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKaW5kZXggMWY4OGU5ZS4uZmNlYWQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNoLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKQEAgLTI1NywxMiArMjU3LDYgQEAKIAlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHNoX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzaF9ydGNfc2V0cGllKGRldiwgMCk7Ci0Jc2hfcnRjX3NldGFpZShkZXYsIDApOwotfQotCiBzdGF0aWMgaW50IHNoX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCiB7CiAJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC01NTksNyArNTUzLDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHNoX3J0Y19vcHMgPSB7Ci0JLnJlbGVhc2UJPSBzaF9ydGNfcmVsZWFzZSwKIAkuaW9jdGwJCT0gc2hfcnRjX2lvY3RsLAogCS5yZWFkX3RpbWUJPSBzaF9ydGNfcmVhZF90aW1lLAogCS5zZXRfdGltZQk9IHNoX3J0Y19zZXRfdGltZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zdGFyZmlyZS5jIGIvZHJpdmVycy9ydGMvcnRjLXN0YXJmaXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjYjBkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGFyZmlyZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBydGMtc3RhcmZpcmUuYzogU3RhcmZpcmUgcGxhdGZvcm0gUlRDIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3RhcmZpcmUgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3Qgc3RhcmZpcmVfcnRjIHsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgdTMyIHN0YXJmaXJlX2dldF90aW1lKHZvaWQpCit7CisJc3RhdGljIGNoYXIgb2JwX2dldHRvZFszMl07CisJc3RhdGljIHUzMiB1bml4X3RvZDsKKworCXNwcmludGYob2JwX2dldHRvZCwgImgjICUwOHggdW5peC1nZXR0b2QiLAorCQkodW5zaWduZWQgaW50KSAobG9uZykgJnVuaXhfdG9kKTsKKwlwcm9tX2ZldmFsKG9icF9nZXR0b2QpOworCisJcmV0dXJuIHVuaXhfdG9kOworfQorCitzdGF0aWMgaW50IHN0YXJmaXJlX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHN0YXJmaXJlX3J0YyAqcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHNlY3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+bG9jaywgZmxhZ3MpOworCXNlY3MgPSBzdGFyZmlyZV9nZXRfdGltZSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YXJmaXJlX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlY3M7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIERvIG5vdGhpbmcsIHRpbWUgaXMgc2V0IHVzaW5nIHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgorCSAqIGNvbnNvbGUgb24gdGhpcyBwbGF0Zm9ybS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHN0YXJmaXJlX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IHN0YXJmaXJlX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBzdGFyZmlyZV9zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0YXJmaXJlX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdGFyZmlyZV9ydGMgKnAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKKworCXAtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInN0YXJmaXJlIiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICZzdGFyZmlyZV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihwLT5ydGMpKSB7CisJCWludCBlcnIgPSBQVFJfRVJSKHAtPnJ0Yyk7CisJCWtmcmVlKHApOworCQlyZXR1cm4gZXJyOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc3RhcmZpcmVfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdGFyZmlyZV9ydGMgKnAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwLT5ydGMpOworCWtmcmVlKHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0YXJmaXJlX3J0Y19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1zdGFyZmlyZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHN0YXJmaXJlX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHN0YXJmaXJlX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3RhcmZpcmVfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzdGFyZmlyZV9ydGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN0YXJmaXJlX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0YXJmaXJlX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzdGFyZmlyZV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChzdGFyZmlyZV9ydGNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCmluZGV4IDMxZDNjOGMuLjlhN2U5MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCkBAIC0yMTUsMTcgKzIxNSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBzdGsxN3RhOF9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgewotCQlwZGF0YS0+aXJxZW4gPSAwOwotCQlzdGsxN3RhOF9ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgc3RrMTd0YThfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTI1NCw3ICsyNDMsNiBAQAogCS5zZXRfdGltZQk9IHN0azE3dGE4X3J0Y19zZXRfdGltZSwKIAkucmVhZF9hbGFybQk9IHN0azE3dGE4X3J0Y19yZWFkX2FsYXJtLAogCS5zZXRfYWxhcm0JPSBzdGsxN3RhOF9ydGNfc2V0X2FsYXJtLAotCS5yZWxlYXNlCT0gc3RrMTd0YThfcnRjX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHN0azE3dGE4X3J0Y19pb2N0bCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zdW40di5jIGIvZHJpdmVycy9ydGMvcnRjLXN1bjR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxMmNjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdW40di5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiBydGMtc3VuNGMuYzogSHlwZXJ2aXNvciBiYXNlZCBSVEMgZm9yIFNVTjRWIHN5c3RlbXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVU40ViBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBzdW40dl9ydGMgeworCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CisJc3BpbmxvY2tfdAkJbG9jazsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh5cGVydmlzb3JfZ2V0X3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldCwgdGltZTsKKwlpbnQgcmV0cmllcyA9IDEwMDAwOworCityZXRyeToKKwlyZXQgPSBzdW40dl90b2RfZ2V0KCZ0aW1lKTsKKwlpZiAocmV0ID09IEhWX0VPSykKKwkJcmV0dXJuIHRpbWU7CisJaWYgKHJldCA9PSBIVl9FV09VTERCTE9DSykgeworCQlpZiAoLS1yZXRyaWVzID4gMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNVTjRWOiB0b2RfZ2V0KCkgdGltZWQgb3V0LlxuIik7CisJCXJldHVybiAwOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTVU40VjogdG9kX2dldCgpIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdW40dl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBzdW40dl9ydGMgKnAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzZWNzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKwlzZWNzID0gaHlwZXJ2aXNvcl9nZXRfdGltZSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXJ0Y190aW1lX3RvX3RtKHNlY3MsIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh5cGVydmlzb3Jfc2V0X3RpbWUodW5zaWduZWQgbG9uZyBzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCWludCByZXRyaWVzID0gMTAwMDA7CisKK3JldHJ5OgorCXJldCA9IHN1bjR2X3RvZF9zZXQoc2Vjcyk7CisJaWYgKHJldCA9PSBIVl9FT0spCisJCXJldHVybiAwOworCWlmIChyZXQgPT0gSFZfRVdPVUxEQkxPQ0spIHsKKwkJaWYgKC0tcmV0cmllcyA+IDApIHsKKwkJCXVkZWxheSgxMDApOworCQkJZ290byByZXRyeTsKKwkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVU40VjogdG9kX3NldCgpIHRpbWVkIG91dC5cbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiU1VONFY6IHRvZF9zZXQoKSBub3Qgc3VwcG9ydGVkLlxuIik7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IHN1bjR2X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3Qgc3VuNHZfcnRjICpwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFncywgc2VjczsKKwlpbnQgZXJyOworCisJZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKwllcnIgPSBoeXBlcnZpc29yX3NldF90aW1lKHNlY3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzdW40dl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBzdW40dl9yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gc3VuNHZfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW40dl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3VuNHZfcnRjICpwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmcC0+bG9jayk7CisKKwlwLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJzdW40diIsICZwZGV2LT5kZXYsCisJCQkJICAgICAmc3VuNHZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocC0+cnRjKSkgeworCQlpbnQgZXJyID0gUFRSX0VSUihwLT5ydGMpOworCQlrZnJlZShwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHN1bjR2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3VuNHZfcnRjICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocC0+cnRjKTsKKwlrZnJlZShwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW40dl9ydGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtc3VuNHYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzdW40dl9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzdW40dl9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN1bjR2X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3VuNHZfcnRjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdW40dl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdW40dl9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3VuNHZfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoc3VuNHZfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggYWNiNzgwMS4uMGEyMjVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAkJCXJldHVybiByYzsKIAl9CiAJLyogcmVnaXN0ZXIgJ2RldmljZScgZGVidWcgYXJlYSwgdXNlZCBmb3IgYWxsIERCRl9ERVZfWFhYIGNhbGxzICovCi0JZGV2aWNlLT5kZWJ1Z19hcmVhID0gZGVidWdfcmVnaXN0ZXIoZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCAxLCAxLAorCWRldmljZS0+ZGVidWdfYXJlYSA9IGRlYnVnX3JlZ2lzdGVyKGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksIDEsIDEsCiAJCQkJCSAgICA4ICogc2l6ZW9mKGxvbmcpKTsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KGRldmljZS0+ZGVidWdfYXJlYSwgJmRlYnVnX3NwcmludGZfdmlldyk7CiAJZGVidWdfc2V0X2xldmVsKGRldmljZS0+ZGVidWdfYXJlYSwgREJGX1dBUk5JTkcpOwpAQCAtOTMzLDcgKzkzMyw3IEBACiAJCU1FU1NBR0UoS0VSTl9ERUJVRywKIAkJCSJpbnZhbGlkIHN0YXR1cyBpbiBoYW5kbGVfa2lsbGVkX3JlcXVlc3Q6ICIKIAkJCSJidXNfaWQgJXMsIHN0YXR1cyAlMDJ4IiwKLQkJCWNkZXYtPmRldi5idXNfaWQsIGNxci0+c3RhdHVzKTsKKwkJCWRldl9uYW1lKCZjZGV2LT5kZXYpLCBjcXItPnN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk0Miw3ICs5NDIsNyBAQAogCSAgICBkZXZpY2UgIT0gZGFzZF9kZXZpY2VfZnJvbV9jZGV2X2xvY2tlZChjZGV2KSB8fAogCSAgICBzdHJuY21wKGRldmljZS0+ZGlzY2lwbGluZS0+ZWJjbmFtZSwgKGNoYXIgKikgJmNxci0+bWFnaWMsIDQpKSB7CiAJCU1FU1NBR0UoS0VSTl9ERUJVRywgImludmFsaWQgZGV2aWNlIGluIHJlcXVlc3Q6IGJ1c19pZCAlcyIsCi0JCQljZGV2LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTgyLDExICs5ODIsMTEgQEAKIAkJCWJyZWFrOwogCQljYXNlIC1FVElNRURPVVQ6CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzKCVzKTogcmVxdWVzdCB0aW1lZCBvdXRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNkZXYtPmRldi5idXNfaWQpOworCQkJICAgICAgIF9fZnVuY19fLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkciJXMoJXMpOiB1bmtub3duIGVycm9yICVsZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgY2Rldi0+ZGV2LmJ1c19pZCwgUFRSX0VSUihpcmIpKTsKKwkJCSAgICAgICBfX2Z1bmNfXywgZGV2X25hbWUoJmNkZXYtPmRldiksIFBUUl9FUlIoaXJiKSk7CiAJCX0KIAkJZGFzZF9oYW5kbGVfa2lsbGVkX3JlcXVlc3QoY2RldiwgaW50cGFybSk7CiAJCXJldHVybjsKQEAgLTk5NSw3ICs5OTUsNyBAQAogCW5vdyA9IGdldF9jbG9jaygpOwogCiAJREJGX0VWRU5UKERCRl9FUlIsICJJbnRlcnJ1cHQ6IGJ1c19pZCAlcyBDUy9EUyAlMDR4IGlwICUwOHgiLAotCQkgIGNkZXYtPmRldi5idXNfaWQsICgoaXJiLT5zY3N3LmNtZC5jc3RhdCA8PCA4KSB8CisJCSAgZGV2X25hbWUoJmNkZXYtPmRldiksICgoaXJiLT5zY3N3LmNtZC5jc3RhdCA8PCA4KSB8CiAJCSAgaXJiLT5zY3N3LmNtZC5kc3RhdCksICh1bnNpZ25lZCBpbnQpIGludHBhcm0pOwogCiAJLyogY2hlY2sgZm9yIHVuc29saWNpdGVkIGludGVycnVwdHMgKi8KQEAgLTEwMTksNyArMTAxOSw3IEBACiAJaWYgKCFkZXZpY2UgfHwKIAkgICAgc3RybmNtcChkZXZpY2UtPmRpc2NpcGxpbmUtPmViY25hbWUsIChjaGFyICopICZjcXItPm1hZ2ljLCA0KSkgewogCQlNRVNTQUdFKEtFUk5fREVCVUcsICJpbnZhbGlkIGRldmljZSBpbiByZXF1ZXN0OiBidXNfaWQgJXMiLAotCQkJY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQlkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAJaWYgKGNxci0+c3RhdHVzICE9IERBU0RfQ1FSX0lOX0lPKSB7CiAJCU1FU1NBR0UoS0VSTl9ERUJVRywKIAkJCSJpbnZhbGlkIHN0YXR1czogYnVzX2lkICVzLCBzdGF0dXMgJTAyeCIsCi0JCQljZGV2LT5kZXYuYnVzX2lkLCBjcXItPnN0YXR1cyk7CisJCQlkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgY3FyLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCURCRl9ERVZfRVZFTlQoREJGX0RFQlVHLCBkZXZpY2UsICJJbnQ6IENTL0RTIDB4JTA0eCBmb3IgY3FyICVwIiwKQEAgLTIxMzQsMTQgKzIxMzQsMTQgQEAKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJkYXNkX2dlbmVyaWNfcHJvYmU6IGNvdWxkIG5vdCBzZXQgY2N3LWRldmljZSBvcHRpb25zICIKLQkJICAgICAgICJmb3IgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQkgICAgICAgImZvciAlc1xuIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXQgPSBkYXNkX2FkZF9zeXNmc19maWxlcyhjZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJkYXNkX2dlbmVyaWNfcHJvYmU6IGNvdWxkIG5vdCBhZGQgc3lzZnMgZW50cmllcyAiCi0JCSAgICAgICAiZm9yICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJICAgICAgICJmb3IgJXNcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJY2Rldi0+aGFuZGxlciA9ICZkYXNkX2ludF9oYW5kbGVyOwpAQCAtMjE1MiwxMyArMjE1MiwxMyBAQAogCSAqIGluaXRpYWwgcHJvYmUuCiAJICovCiAJaWYgKChkYXNkX2dldF9mZWF0dXJlKGNkZXYsIERBU0RfRkVBVFVSRV9JTklUSUFMX09OTElORSkgPiAwICkgfHwKLQkgICAgKGRhc2RfYXV0b2RldGVjdCAmJiBkYXNkX2J1c2lkX2tub3duKGNkZXYtPmRldi5idXNfaWQpICE9IDApKQorCSAgICAoZGFzZF9hdXRvZGV0ZWN0ICYmIGRhc2RfYnVzaWRfa25vd24oZGV2X25hbWUoJmNkZXYtPmRldikpICE9IDApKQogCQlyZXQgPSBjY3dfZGV2aWNlX3NldF9vbmxpbmUoY2Rldik7CiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImRhc2RfZ2VuZXJpY19wcm9iZTogY291bGQgbm90IGluaXRpYWxseSAiCiAJCSAgICAgICAib25saW5lIGNjdy1kZXZpY2UgJXM7IHJldHVybiBjb2RlOiAlZFxuIiwKLQkJICAgICAgIGNkZXYtPmRldi5idXNfaWQsIHJldCk7CisJCSAgICAgICBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgcmV0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIyNCw3ICsyMjI0LDcgQEAKIAkJICAgICAgICBwcmludGsgKEtFUk5fV0FSTklORwogCQkJCSJkYXNkX2dlbmVyaWMgY291bGRuJ3Qgb25saW5lIGRldmljZSAlcyAiCiAJCQkJIi0gZGlzY2lwbGluZSBESUFHIG5vdCBhdmFpbGFibGVcbiIsCi0JCQkJY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQkJZGFzZF9kZWxldGVfZGV2aWNlKGRldmljZSk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMjI0OCw3ICsyMjQ4LDcgQEAKIAkJcHJpbnRrIChLRVJOX1dBUk5JTkcKIAkJCSJkYXNkX2dlbmVyaWMgY291bGRuJ3Qgb25saW5lIGRldmljZSAlcyAiCiAJCQkid2l0aCBkaXNjaXBsaW5lICVzIHJjPSVpXG4iLAotCQkJY2Rldi0+ZGV2LmJ1c19pZCwgZGlzY2lwbGluZS0+bmFtZSwgcmMpOworCQkJZGV2X25hbWUoJmNkZXYtPmRldiksIGRpc2NpcGxpbmUtPm5hbWUsIHJjKTsKIAkJbW9kdWxlX3B1dChkaXNjaXBsaW5lLT5vd25lcik7CiAJCW1vZHVsZV9wdXQoYmFzZV9kaXNjaXBsaW5lLT5vd25lcik7CiAJCWRhc2RfZGVsZXRlX2RldmljZShkZXZpY2UpOwpAQCAtMjI1OSw3ICsyMjU5LDcgQEAKIAlpZiAoZGV2aWNlLT5zdGF0ZSA8PSBEQVNEX1NUQVRFX0tOT1dOKSB7CiAJCXByaW50ayAoS0VSTl9XQVJOSU5HCiAJCQkiZGFzZF9nZW5lcmljIGRpc2NpcGxpbmUgbm90IGZvdW5kIGZvciAlc1xuIiwKLQkJCWNkZXYtPmRldi5idXNfaWQpOworCQkJZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWRhc2Rfc2V0X3RhcmdldF9zdGF0ZShkZXZpY2UsIERBU0RfU1RBVEVfTkVXKTsKIAkJaWYgKGRldmljZS0+YmxvY2spCkBAIC0yMjY3LDcgKzIyNjcsNyBAQAogCQlkYXNkX2RlbGV0ZV9kZXZpY2UoZGV2aWNlKTsKIAl9IGVsc2UKIAkJcHJfZGVidWcoImRhc2RfZ2VuZXJpYyBkZXZpY2UgJXMgZm91bmRcbiIsCi0JCQkJY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJmNkZXYtPmRldikpOwogCiAJLyogRklYTUU6IHdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHJvb3QgZGV2aWNlIGJ1dCB3ZSBkb24ndCB3YW50CiAJICogdG8gd2FpdCBmb3IgZWFjaCBzaW5nbGUgZGV2aWNlIGJ1dCBmb3IgYWxsIGF0IG9uY2UuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwppbmRleCA1YzZlNmYzLi5iOGY5YzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMKQEAgLTEzOTcsNyArMTM5Nyw3IEBACiAJCQlERVZfTUVTU0FHRShLRVJOX0VSUiwgY3FyLT5zdGFydGRldiwKIAkJCQkgICAgIkVSUCBvbiBhbGlhcyBkZXZpY2UgZm9yIHJlcXVlc3QgJXAsIgogCQkJCSAgICAiIHJlY292ZXIgb24gYmFzZSBkZXZpY2UgJXMiLCBjcXIsCi0JCQkJICAgIGNxci0+YmxvY2stPmJhc2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJCSAgICBkZXZfbmFtZSgmY3FyLT5ibG9jay0+YmFzZS0+Y2Rldi0+ZGV2KSk7CiAJCX0KIAkJZGFzZF9lY2tkX3Jlc2V0X2Njd190b19iYXNlX2lvKGNxcik7CiAJCWVycC0+c3RhcnRkZXYgPSBjcXItPmJsb2NrLT5iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwppbmRleCBjZDMzMzVjLi45MjE0NDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwpAQCAtNTE1LDkgKzUxNSw5IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoY2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCi0JCWRldm1hcCA9IGRhc2RfYWRkX2J1c2lkKGNkZXYtPmRldi5idXNfaWQsCisJCWRldm1hcCA9IGRhc2RfYWRkX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpLAogCQkJCQlEQVNEX0ZFQVRVUkVfREVGQVVMVCk7CiAJcmV0dXJuIGRldm1hcDsKIH0KQEAgLTU4NCw3ICs1ODQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBGaXJzdCByZW1vdmUgZGV2aWNlIHBvaW50ZXIgZnJvbSBkZXZtYXAuICovCi0JZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCUJVR19PTihJU19FUlIoZGV2bWFwKSk7CiAJc3Bpbl9sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKIAlpZiAoZGV2bWFwLT5kZXZpY2UgIT0gZGV2aWNlKSB7CkBAIC02NzQsNyArNjc0LDcgQEAKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKIAlpbnQgcm9fZmxhZzsKIAotCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXYtPmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKGRldikpOwogCWlmICghSVNfRVJSKGRldm1hcCkpCiAJCXJvX2ZsYWcgPSAoZGV2bWFwLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9SRUFET05MWSkgIT0gMDsKIAllbHNlCkBAIC03MjMsNyArNzIzLDcgQEAKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKIAlpbnQgZXJwbG9nOwogCi0JZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldi0+YnVzX2lkKTsKKwlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoZGV2X25hbWUoZGV2KSk7CiAJaWYgKCFJU19FUlIoZGV2bWFwKSkKIAkJZXJwbG9nID0gKGRldm1hcC0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfRVJQTE9HKSAhPSAwOwogCWVsc2UKQEAgLTc3MCw3ICs3NzAsNyBAQAogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwogCWludCB1c2VfZGlhZzsKIAotCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXYtPmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKGRldikpOwogCWlmICghSVNfRVJSKGRldm1hcCkpCiAJCXVzZV9kaWFnID0gKGRldm1hcC0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfVVNFRElBRykgIT0gMDsKIAllbHNlCkBAIC04NzYsNyArODc2LDcgQEAKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKIAlpbnQgYWxpYXM7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoZGV2LT5idXNfaWQpOworCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXZfbmFtZShkZXYpKTsKIAlzcGluX2xvY2soJmRhc2RfZGV2bWFwX2xvY2spOwogCWlmIChJU19FUlIoZGV2bWFwKSB8fCBzdHJsZW4oZGV2bWFwLT51aWQudmVuZG9yKSA9PSAwKSB7CiAJCXNwaW5fdW5sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKQEAgLTg5OSw3ICs4OTksNyBAQAogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwogCWNoYXIgKnZlbmRvcjsKIAotCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXYtPmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKGRldikpOwogCXNwaW5fbG9jaygmZGFzZF9kZXZtYXBfbG9jayk7CiAJaWYgKCFJU19FUlIoZGV2bWFwKSAmJiBzdHJsZW4oZGV2bWFwLT51aWQudmVuZG9yKSA+IDApCiAJCXZlbmRvciA9IGRldm1hcC0+dWlkLnZlbmRvcjsKQEAgLTkyNCw3ICs5MjQsNyBAQAogCWNoYXIgdWFfc3RyaW5nWzNdOwogCXN0cnVjdCBkYXNkX3VpZCAqdWlkOwogCi0JZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldi0+YnVzX2lkKTsKKwlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoZGV2X25hbWUoZGV2KSk7CiAJc3Bpbl9sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkgfHwgc3RybGVuKGRldm1hcC0+dWlkLnZlbmRvcikgPT0gMCkgewogCQlzcGluX3VubG9jaygmZGFzZF9kZXZtYXBfbG9jayk7CkBAIC05NzIsNyArOTcyLDcgQEAKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKIAlpbnQgZWVyX2ZsYWc7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoZGV2LT5idXNfaWQpOworCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXZfbmFtZShkZXYpKTsKIAlpZiAoIUlTX0VSUihkZXZtYXApICYmIGRldm1hcC0+ZGV2aWNlKQogCQllZXJfZmxhZyA9IGRhc2RfZWVyX2VuYWJsZWQoZGV2bWFwLT5kZXZpY2UpOwogCWVsc2UKQEAgLTEwMzQsNyArMTAzNCw3IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoY2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7CiAJc3Bpbl9sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoY2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7CiAKQEAgLTEwNzcsNyArMTA3Nyw3IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoY2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7CiAKQEAgLTEwOTMsNyArMTA5Myw3IEBACiB7CiAJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CiAKLQlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoY2Rldi0+ZGV2LmJ1c19pZCk7CisJZGV2bWFwID0gZGFzZF9maW5kX2J1c2lkKGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlpZiAoSVNfRVJSKGRldm1hcCkpCiAJCXJldHVybiBQVFJfRVJSKGRldm1hcCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCA3NzNiM2ZlLi40OWY5ZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC02LDYgKzYsOCBAQAogICoJCSAgICBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CiAgKiBCdWdyZXBvcnRzLnRvLi46IDxMaW51eDM5MEBkZS5pYm0uY29tPgogICogKEMpIElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIDE5OTksMjAwMAorICogRU1DIFN5bW1ldHJpeCBpb2N0bCBDb3B5cmlnaHQgRU1DIENvcnBvcmF0aW9uLCAyMDA4CisgKiBBdXRob3IuLi4uLi4uLi46IE5pZ2VsIEhpc2xvcCA8aGlzbG9wX25pZ2VsQGVtYy5jb20+CiAgKgogICovCiAKQEAgLTg0LDcgKzg2LDcgQEAKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJkYXNkX2Vja2RfcHJvYmU6IGNvdWxkIG5vdCBzZXQgY2N3LWRldmljZSBvcHRpb25zICIKLQkJICAgICAgICJmb3IgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQkgICAgICAgImZvciAlc1xuIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXQgPSBkYXNkX2dlbmVyaWNfcHJvYmUoY2RldiwgJmRhc2RfZWNrZF9kaXNjaXBsaW5lKTsKQEAgLTE1MDEsMTIgKzE1MDMsMjcgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIGp1c3QgcmVwb3J0IG90aGVyIHVuc29saWNpdGVkIGludGVycnVwdHMgKi8KLQlERVZfTUVTU0FHRShLRVJOX0RFQlVHLCBkZXZpY2UsICIlcyIsCi0JCSAgICAidW5zb2xpY2l0ZWQgaW50ZXJydXB0IHJlY2VpdmVkIik7Ci0JZGV2aWNlLT5kaXNjaXBsaW5lLT5kdW1wX3NlbnNlKGRldmljZSwgTlVMTCwgaXJiKTsKLQlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOworCWlmICgoaXJiLT5zY3N3LmNtZC5jYyA9PSAxKSAmJgorCSAgICAoaXJiLT5zY3N3LmNtZC5mY3RsICYgU0NTV19GQ1RMX1NUQVJUX0ZVTkMpICYmCisJICAgIChpcmItPnNjc3cuY21kLmFjdGwgJiBTQ1NXX0FDVExfU1RBUlRfUEVORCkgJiYKKwkgICAgKGlyYi0+c2Nzdy5jbWQuc3RjdGwgJiBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSkgeworCQkvKiBmYWtlIGlyYiBkbyBub3RoaW5nLCB0aGV5IGFyZSBoYW5kbGVkIGVsc2V3aGVyZSAqLworCQlkYXNkX3NjaGVkdWxlX2RldmljZV9iaChkZXZpY2UpOworCQlyZXR1cm47CisJfQogCisJaWYgKCEoaXJiLT5lc3cuZXN3MC5lcncuY29ucykpIHsKKwkJLyoganVzdCByZXBvcnQgb3RoZXIgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cyAqLworCQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLCAiJXMiLAorCQkJICAgICJ1bnNvbGljaXRlZCBpbnRlcnJ1cHQgcmVjZWl2ZWQiKTsKKwl9IGVsc2UgeworCQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLCAiJXMiLAorCQkJICAgICJ1bnNvbGljaXRlZCBpbnRlcnJ1cHQgcmVjZWl2ZWQgIgorCQkJICAgICIoc2Vuc2UgYXZhaWxhYmxlKSIpOworCQlkZXZpY2UtPmRpc2NpcGxpbmUtPmR1bXBfc2Vuc2UoZGV2aWNlLCBOVUxMLCBpcmIpOworCX0KKworCWRhc2Rfc2NoZWR1bGVfZGV2aWNlX2JoKGRldmljZSk7CiAJcmV0dXJuOwogfTsKIApAQCAtMjA2OCw2ICsyMDg1LDEwMyBAQAogCXJldHVybiAwOwogfQogCisvKgorICogSXNzdWUgc3lzY2FsbCBJL08gdG8gRU1DIFN5bW1ldHJpeCBhcnJheS4KKyAqIENDV3MgYXJlIFBTRiBhbmQgUlNTRAorICovCitzdGF0aWMgaW50IGRhc2Rfc3ltbV9pbyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJc3RydWN0IGRhc2Rfc3ltbWlvX3Bhcm1zIHVzcnBhcm07CisJY2hhciAqcHNmX2RhdGEsICpyc3NkX3Jlc3VsdDsKKwlzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXI7CisJc3RydWN0IGNjdzEgKmNjdzsKKwlpbnQgcmM7CisKKwkvKiBDb3B5IHBhcm1zIGZyb20gY2FsbGVyICovCisJcmMgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmdXNycGFybSwgYXJncCwgc2l6ZW9mKHVzcnBhcm0pKSkKKwkJZ290byBvdXQ7CisjaWZuZGVmIENPTkZJR182NEJJVAorCS8qIE1ha2Ugc3VyZSBwb2ludGVycyBhcmUgc2FuZSBldmVuIG9uIDMxIGJpdC4gKi8KKwlpZiAoKHVzcnBhcm0ucHNmX2RhdGEgPj4gMzIpICE9IDAgfHwgKHVzcnBhcm0ucnNzZF9yZXN1bHQgPj4gMzIpICE9IDApIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwkvKiBhbGxvYyBJL08gZGF0YSBhcmVhICovCisJcHNmX2RhdGEgPSBremFsbG9jKHVzcnBhcm0ucHNmX2RhdGFfbGVuLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJcnNzZF9yZXN1bHQgPSBremFsbG9jKHVzcnBhcm0ucnNzZF9yZXN1bHRfbGVuLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFwc2ZfZGF0YSB8fCAhcnNzZF9yZXN1bHQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qIGdldCBzeXNjYWxsIGhlYWRlciBmcm9tIHVzZXIgc3BhY2UgKi8KKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKHBzZl9kYXRhLAorCQkJICAgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIHVzcnBhcm0ucHNmX2RhdGEsCisJCQkgICB1c3JwYXJtLnBzZl9kYXRhX2xlbikpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBzYW5pdHkgY2hlY2sgb24gc3lzY2FsbCBoZWFkZXIgKi8KKwlpZiAocHNmX2RhdGFbMF0gIT0gMHgxNyAmJiBwc2ZfZGF0YVsxXSAhPSAweGNlKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBzZXR1cCBDQ1dzIGZvciBQU0YgKyBSU1NEICovCisJY3FyID0gZGFzZF9zbWFsbG9jX3JlcXVlc3QoIkVDS0QiLCAyICwgMCwgZGV2aWNlKTsKKwlpZiAoSVNfRVJSKGNxcikpIHsKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICIlcyIsCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIGluaXRpYWxpemF0aW9uIHJlcXVlc3QiKTsKKwkJcmMgPSBQVFJfRVJSKGNxcik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJY3FyLT5zdGFydGRldiA9IGRldmljZTsKKwljcXItPm1lbWRldiA9IGRldmljZTsKKwljcXItPnJldHJpZXMgPSAzOworCWNxci0+ZXhwaXJlcyA9IDEwICogSFo7CisJY3FyLT5idWlsZGNsayA9IGdldF9jbG9jaygpOworCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRklMTEVEOworCisJLyogQnVpbGQgdGhlIGNjd3MgKi8KKwljY3cgPSBjcXItPmNwYWRkcjsKKworCS8qIFBTRiBjY3cgKi8KKwljY3ctPmNtZF9jb2RlID0gREFTRF9FQ0tEX0NDV19QU0Y7CisJY2N3LT5jb3VudCA9IHVzcnBhcm0ucHNmX2RhdGFfbGVuOworCWNjdy0+ZmxhZ3MgfD0gQ0NXX0ZMQUdfQ0M7CisJY2N3LT5jZGEgPSAoX191MzIpKGFkZHJfdCkgcHNmX2RhdGE7CisKKwljY3crKzsKKworCS8qIFJTU0QgY2N3ICAqLworCWNjdy0+Y21kX2NvZGUgPSBEQVNEX0VDS0RfQ0NXX1JTU0Q7CisJY2N3LT5jb3VudCA9IHVzcnBhcm0ucnNzZF9yZXN1bHRfbGVuOworCWNjdy0+ZmxhZ3MgPSBDQ1dfRkxBR19TTEkgOworCWNjdy0+Y2RhID0gKF9fdTMyKShhZGRyX3QpIHJzc2RfcmVzdWx0OworCisJcmMgPSBkYXNkX3NsZWVwX29uKGNxcik7CisJaWYgKHJjKQorCQlnb3RvIG91dF9zZnJlZTsKKworCXJjID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSB1c3JwYXJtLnJzc2RfcmVzdWx0LAorCQkJICAgcnNzZF9yZXN1bHQsIHVzcnBhcm0ucnNzZF9yZXN1bHRfbGVuKSkKKwkJZ290byBvdXRfc2ZyZWU7CisJcmMgPSAwOworCitvdXRfc2ZyZWU6CisJZGFzZF9zZnJlZV9yZXF1ZXN0KGNxciwgY3FyLT5tZW1kZXYpOworb3V0X2ZyZWU6CisJa2ZyZWUocnNzZF9yZXN1bHQpOworCWtmcmVlKHBzZl9kYXRhKTsKK291dDoKKwlEQkZfREVWX0VWRU5UKERCRl9XQVJOSU5HLCBkZXZpY2UsICJTeW1tZXRyaXggaW9jdGw6IHJjPSVkIiwgcmMpOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludAogZGFzZF9lY2tkX2lvY3RsKHN0cnVjdCBkYXNkX2Jsb2NrICpibG9jaywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCiB7CkBAIC0yMDg2LDYgKzIyMDAsOCBAQAogCQlyZXR1cm4gZGFzZF9lY2tkX3Jlc2VydmUoZGV2aWNlKTsKIAljYXNlIEJJT0RBU0RTTENLOgogCQlyZXR1cm4gZGFzZF9lY2tkX3N0ZWFsX2xvY2soZGV2aWNlKTsKKwljYXNlIEJJT0RBU0RTWU1NSU86CisJCXJldHVybiBkYXNkX3N5bW1faW8oZGV2aWNlLCBhcmdwKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KQEAgLTIxNDUsMTMgKzIyNjEsMTMgQEAKIAkvKiBkdW1wIHRoZSBzZW5zZSBkYXRhICovCiAJbGVuID0gc3ByaW50ZihwYWdlLCAgS0VSTl9FUlIgUFJJTlRLX0hFQURFUgogCQkgICAgICAiIEkvTyBzdGF0dXMgcmVwb3J0IGZvciBkZXZpY2UgJXM6XG4iLAotCQkgICAgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkgICAgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCBLRVJOX0VSUiBQUklOVEtfSEVBREVSCiAJCSAgICAgICAiIGluIHJlcTogJXAgQ1M6IDB4JTAyWCBEUzogMHglMDJYXG4iLCByZXEsCiAJCSAgICAgICBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmRzdGF0KTsKIAlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCBLRVJOX0VSUiBQUklOVEtfSEVBREVSCiAJCSAgICAgICAiIGRldmljZSAlczogRmFpbGluZyBDQ1c6ICVwXG4iLAotCQkgICAgICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkgICAgICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJICAgICAgICh2b2lkICopIChhZGRyX3QpIGlyYi0+c2Nzdy5jbWQuY3BhKTsKIAlpZiAoaXJiLT5lc3cuZXN3MC5lcncuY29ucykgewogCQlmb3IgKHNsID0gMDsgc2wgPCA0OyBzbCsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vlci5jCmluZGV4IGJmNTEyYWMuLjg5MmUyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vlci5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vlci5jCkBAIC0zMDksNyArMzA5LDggQEAKIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKIAloZWFkZXIudHZfc2VjID0gdHYudHZfc2VjOwogCWhlYWRlci50dl91c2VjID0gdHYudHZfdXNlYzsKLQlzdHJuY3B5KGhlYWRlci5idXNpZCwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBEQVNEX0VFUl9CVVNJRF9TSVpFKTsKKwlzdHJuY3B5KGhlYWRlci5idXNpZCwgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKKwkJREFTRF9FRVJfQlVTSURfU0laRSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnVmZmVybG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZWVyYiwgJmJ1ZmZlcmxpc3QsIGxpc3QpIHsKQEAgLTM0OSw3ICszNTAsOCBAQAogCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCWhlYWRlci50dl9zZWMgPSB0di50dl9zZWM7CiAJaGVhZGVyLnR2X3VzZWMgPSB0di50dl91c2VjOwotCXN0cm5jcHkoaGVhZGVyLmJ1c2lkLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIERBU0RfRUVSX0JVU0lEX1NJWkUpOworCXN0cm5jcHkoaGVhZGVyLmJ1c2lkLCBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLAorCQlEQVNEX0VFUl9CVVNJRF9TSVpFKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZidWZmZXJsb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlZXJiLCAmYnVmZmVybGlzdCwgbGlzdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwppbmRleCBhYTBjNTMzLi45M2Q5YjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwpAQCAtNDUxLDEzICs0NTEsMTMgQEAKIAl9CiAJbGVuID0gc3ByaW50ZihwYWdlLCBLRVJOX0VSUiBQUklOVEtfSEVBREVSCiAJCSAgICAgICIgSS9PIHN0YXR1cyByZXBvcnQgZm9yIGRldmljZSAlczpcbiIsCi0JCSAgICAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCSAgICAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sIEtFUk5fRVJSIFBSSU5US19IRUFERVIKIAkJICAgICAgICIgaW4gcmVxOiAlcCBDUzogMHglMDJYIERTOiAweCUwMlhcbiIsIHJlcSwKIAkJICAgICAgIGlyYi0+c2Nzdy5jbWQuY3N0YXQsIGlyYi0+c2Nzdy5jbWQuZHN0YXQpOwogCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sIEtFUk5fRVJSIFBSSU5US19IRUFERVIKIAkJICAgICAgICIgZGV2aWNlICVzOiBGYWlsaW5nIENDVzogJXBcbiIsCi0JCSAgICAgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCSAgICAgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLAogCQkgICAgICAgKHZvaWQgKikgKGFkZHJfdCkgaXJiLT5zY3N3LmNtZC5jcGEpOwogCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zKSB7CiAJCWZvciAoc2wgPSAwOyBzbCA8IDQ7IHNsKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggMzFlY2FhNC4uNDg5ZDVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTEyNiw3ICsxMjYsNyBAQAogI2RlZmluZSBERVZfTUVTU0FHRShkX2xvZ2xldmVsLGRfZGV2aWNlLGRfc3RyaW5nLGRfYXJncy4uLilcCiBkbyB7IFwKIAlwcmludGsoZF9sb2dsZXZlbCBQUklOVEtfSEVBREVSICIgJXM6ICIgZF9zdHJpbmcgIlxuIiwgXAotCSAgICAgICBkX2RldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgZF9hcmdzKTsgXAorCSAgICAgICBkZXZfbmFtZSgmZF9kZXZpY2UtPmNkZXYtPmRldiksIGRfYXJncyk7IFwKIAlEQkZfREVWX0VWRU5UKERCRl9BTEVSVCwgZF9kZXZpY2UsIGRfc3RyaW5nLCBkX2FyZ3MpOyBcCiB9IHdoaWxlKDApCiAKQEAgLTE0MCw3ICsxNDAsNyBAQAogI2RlZmluZSBERVZfTUVTU0FHRV9MT0coZF9sb2dsZXZlbCxkX2RldmljZSxkX3N0cmluZyxkX2FyZ3MuLi4pXAogZG8geyBcCiAJcHJpbnRrKGRfbG9nbGV2ZWwgUFJJTlRLX0hFQURFUiAiICVzOiAiIGRfc3RyaW5nICJcbiIsIFwKLQkgICAgICAgZF9kZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIGRfYXJncyk7IFwKKwkgICAgICAgZGV2X25hbWUoJmRfZGV2aWNlLT5jZGV2LT5kZXYpLCBkX2FyZ3MpOyBcCiB9IHdoaWxlKDApCiAKICNkZWZpbmUgTUVTU0FHRV9MT0coZF9sb2dsZXZlbCxkX3N0cmluZyxkX2FyZ3MuLi4pXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCmluZGV4IDAzYzBlNDAuLjkwODhkZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCS8qIFByaW50IGRldmljZSBudW1iZXIuICovCi0Jc2VxX3ByaW50ZihtLCAiJXMiLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCXNlcV9wcmludGYobSwgIiVzIiwgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJLyogUHJpbnQgZGlzY2lwbGluZSBzdHJpbmcuICovCiAJaWYgKGRldmljZSAhPSBOVUxMICYmIGRldmljZS0+ZGlzY2lwbGluZSAhPSBOVUxMKQogCQlzZXFfcHJpbnRmKG0sICIoJXMpIiwgZGV2aWNlLT5kaXNjaXBsaW5lLT5uYW1lKTsKQEAgLTc2LDcgKzc2LDggQEAKIAkvKiBQcmludCBrZGV2LiAqLwogCWlmIChibG9jay0+Z2RwKQogCQlzZXFfcHJpbnRmKG0sICIgYXQgKCUzZDolNmQpIiwKLQkJCSAgIGJsb2NrLT5nZHAtPm1ham9yLCBibG9jay0+Z2RwLT5maXJzdF9taW5vcik7CisJCQkgICBNQUpPUihkaXNrX2RldnQoYmxvY2stPmdkcCkpLAorCQkJICAgTUlOT1IoZGlza19kZXZ0KGJsb2NrLT5nZHApKSk7CiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICIgIGF0ICg/Pz86Pz8/Pz8/KSIpOwogCS8qIFByaW50IGRldmljZSBuYW1lLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKaW5kZXggNzExYjMwMC4uYTdmZjE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIFBSSU5UX1dBUk4oeC4uLikgIHByaW50ayhLRVJOX1dBUk5JTkcgRENTU0JMS19OQU1FICIgd2FybmluZzogIiB4KQogI2RlZmluZSBQUklOVF9FUlIoeC4uLikJICBwcmludGsoS0VSTl9FUlIgRENTU0JMS19OQU1FICIgZXJyb3I6ICIgeCkKIAotCiBzdGF0aWMgaW50IGRjc3NibGtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBzdGF0aWMgaW50IGRjc3NibGtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBzdGF0aWMgaW50IGRjc3NibGtfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwpAQCAtNDgsMjYgKzQ3LDYgQEAKIAkuZGlyZWN0X2FjY2VzcyAJPSBkY3NzYmxrX2RpcmVjdF9hY2Nlc3MsCiB9OwogCi1zdGF0aWMgc3NpemVfdCBkY3NzYmxrX2FkZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCQkgIHNpemVfdCBjb3VudCk7Ci1zdGF0aWMgc3NpemVfdCBkY3NzYmxrX3JlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCQkgIHNpemVfdCBjb3VudCk7Ci1zdGF0aWMgc3NpemVfdCBkY3NzYmxrX3NhdmVfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsCi0JCQkJICBzaXplX3QgY291bnQpOwotc3RhdGljIHNzaXplX3QgZGNzc2Jsa19zYXZlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKLXN0YXRpYyBzc2l6ZV90IGRjc3NibGtfc2hhcmVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLAotCQkJCSAgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBzc2l6ZV90IGRjc3NibGtfc2hhcmVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGFkZCwgU19JV1VTUiwgTlVMTCwgZGNzc2Jsa19hZGRfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHJlbW92ZSwgU19JV1VTUiwgTlVMTCwgZGNzc2Jsa19yZW1vdmVfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHNhdmUsIFNfSVdVU1IgfCBTX0lSVUdPLCBkY3NzYmxrX3NhdmVfc2hvdywKLQkJICAgZGNzc2Jsa19zYXZlX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzaGFyZWQsIFNfSVdVU1IgfCBTX0lSVUdPLCBkY3NzYmxrX3NoYXJlZF9zaG93LAotCQkgICBkY3NzYmxrX3NoYXJlZF9zdG9yZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpkY3NzYmxrX3Jvb3RfZGV2OwotCiBzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaDsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKQEAgLTgwLDggKzU5LDQyIEBACiAJdW5zaWduZWQgY2hhciBzYXZlX3BlbmRpbmc7CiAJdW5zaWduZWQgY2hhciBpc19zaGFyZWQ7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKmRjc3NibGtfcXVldWU7CisJaW50IG51bV9vZl9zZWdtZW50czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlZ19saXN0OwogfTsKIAorc3RydWN0IHNlZ21lbnRfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaDsKKwljaGFyIHNlZ21lbnRfbmFtZVtCVVNfSURfU0laRV07CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlpbnQgc2VnbWVudF90eXBlOworfTsKKworc3RhdGljIHNzaXplX3QgZGNzc2Jsa19hZGRfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3QgZGNzc2Jsa19yZW1vdmVfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3QgZGNzc2Jsa19zYXZlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50KTsKK3N0YXRpYyBzc2l6ZV90IGRjc3NibGtfc2F2ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBkY3NzYmxrX3NoYXJlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBkY3NzYmxrX3NoYXJlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBkY3NzYmxrX3NlZ2xpc3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKTsKKworc3RhdGljIERFVklDRV9BVFRSKGFkZCwgU19JV1VTUiwgTlVMTCwgZGNzc2Jsa19hZGRfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHJlbW92ZSwgU19JV1VTUiwgTlVMTCwgZGNzc2Jsa19yZW1vdmVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHNhdmUsIFNfSVdVU1IgfCBTX0lSVVNSLCBkY3NzYmxrX3NhdmVfc2hvdywKKwkJICAgZGNzc2Jsa19zYXZlX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaGFyZWQsIFNfSVdVU1IgfCBTX0lSVVNSLCBkY3NzYmxrX3NoYXJlZF9zaG93LAorCQkgICBkY3NzYmxrX3NoYXJlZF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2VnbGlzdCwgU19JUlVTUiwgZGNzc2Jsa19zZWdsaXN0X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGRldmljZSAqZGNzc2Jsa19yb290X2RldjsKKwogc3RhdGljIExJU1RfSEVBRChkY3NzYmxrX2RldmljZXMpOwogc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgZGNzc2Jsa19kZXZpY2VzX3NlbTsKIApAQCAtOTEsOCArMTA0LDE1IEBACiBzdGF0aWMgdm9pZAogZGNzc2Jsa19yZWxlYXNlX3NlZ21lbnQoc3RydWN0IGRldmljZSAqZGV2KQogewotCVBSSU5UX0RFQlVHKCJzZWdtZW50IHJlbGVhc2UgZm4gY2FsbGVkIGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOwotCWtmcmVlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvLCBkZXYpKTsKKwlzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm87CisJc3RydWN0IHNlZ21lbnRfaW5mbyAqZW50cnksICp0ZW1wOworCisJZGV2X2luZm8gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbywgZGV2KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRlbXAsICZkZXZfaW5mby0+c2VnX2xpc3QsIGxoKSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+bGgpOworCQlrZnJlZShlbnRyeSk7CisJfQorCWtmcmVlKGRldl9pbmZvKTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIH0KIApAQCAtMTE0LDcgKzEzNCw3IEBACiAJCWZvdW5kID0gMDsKIAkJLy8gdGVzdCBpZiBtaW5vciBhdmFpbGFibGUKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRjc3NibGtfZGV2aWNlcywgbGgpCi0JCQlpZiAobWlub3IgPT0gZW50cnktPmdkLT5maXJzdF9taW5vcikKKwkJCWlmIChtaW5vciA9PSBNSU5PUihkaXNrX2RldnQoZW50cnktPmdkKSkpCiAJCQkJZm91bmQrKzsKIAkJaWYgKCFmb3VuZCkgYnJlYWs7IC8vIGdvdCB1bnVzZWQgbWlub3IKIAl9CkBAIC0xNDIsNiArMTYyLDE2OSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKgorICogZ2V0IHRoZSBzdHJ1Y3Qgc2VnbWVudF9pbmZvIGZyb20gc2VnX2xpc3QKKyAqIGZvciB0aGUgZ2l2ZW4gbmFtZS4KKyAqIGRvd25fcmVhZCgmZGNzc2Jsa19kZXZpY2VzX3NlbSkgbXVzdCBiZSBoZWxkLgorICovCitzdGF0aWMgc3RydWN0IHNlZ21lbnRfaW5mbyAqCitkY3NzYmxrX2dldF9zZWdtZW50X2J5X25hbWUoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm87CisJc3RydWN0IHNlZ21lbnRfaW5mbyAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9pbmZvLCAmZGNzc2Jsa19kZXZpY2VzLCBsaCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2X2luZm8tPnNlZ19saXN0LCBsaCkgeworCQkJaWYgKCFzdHJjbXAobmFtZSwgZW50cnktPnNlZ21lbnRfbmFtZSkpCisJCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2V0IHRoZSBoaWdoZXN0IGFkZHJlc3Mgb2YgdGhlIG11bHRpLXNlZ21lbnQgYmxvY2suCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitkY3NzYmxrX2ZpbmRfaGlnaGVzdF9hZGRyKHN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGhpZ2hlc3RfYWRkcjsKKwlzdHJ1Y3Qgc2VnbWVudF9pbmZvICplbnRyeTsKKworCWhpZ2hlc3RfYWRkciA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJaWYgKGhpZ2hlc3RfYWRkciA8IGVudHJ5LT5lbmQpCisJCQloaWdoZXN0X2FkZHIgPSBlbnRyeS0+ZW5kOworCX0KKwlyZXR1cm4gaGlnaGVzdF9hZGRyOworfQorCisvKgorICogZ2V0IHRoZSBsb3dlc3QgYWRkcmVzcyBvZiB0aGUgbXVsdGktc2VnbWVudCBibG9jay4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2Rjc3NibGtfZmluZF9sb3dlc3RfYWRkcihzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm8pCit7CisJaW50IHNldF9maXJzdDsKKwl1bnNpZ25lZCBsb25nIGxvd2VzdF9hZGRyOworCXN0cnVjdCBzZWdtZW50X2luZm8gKmVudHJ5OworCisJc2V0X2ZpcnN0ID0gMDsKKwlsb3dlc3RfYWRkciA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJaWYgKHNldF9maXJzdCA9PSAwKSB7CisJCQlsb3dlc3RfYWRkciA9IGVudHJ5LT5zdGFydDsKKwkJCXNldF9maXJzdCA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAobG93ZXN0X2FkZHIgPiBlbnRyeS0+c3RhcnQpCisJCQkJbG93ZXN0X2FkZHIgPSBlbnRyeS0+c3RhcnQ7CisJCX0KKwl9CisJcmV0dXJuIGxvd2VzdF9hZGRyOworfQorCisvKgorICogQ2hlY2sgY29udGludWl0eSBvZiBzZWdtZW50cy4KKyAqLworc3RhdGljIGludAorZGNzc2Jsa19pc19jb250aW51b3VzKHN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbykKK3sKKwlpbnQgaSwgaiwgcmM7CisJc3RydWN0IHNlZ21lbnRfaW5mbyAqc29ydF9saXN0LCAqZW50cnksIHRlbXA7CisKKwlpZiAoZGV2X2luZm8tPm51bV9vZl9zZWdtZW50cyA8PSAxKQorCQlyZXR1cm4gMDsKKworCXNvcnRfbGlzdCA9IGt6YWxsb2MoCisJCQlzaXplb2Yoc3RydWN0IHNlZ21lbnRfaW5mbykgKiBkZXZfaW5mby0+bnVtX29mX3NlZ21lbnRzLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHNvcnRfbGlzdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2X2luZm8tPnNlZ19saXN0LCBsaCkgeworCQltZW1jcHkoJnNvcnRfbGlzdFtpXSwgZW50cnksIHNpemVvZihzdHJ1Y3Qgc2VnbWVudF9pbmZvKSk7CisJCWkrKzsKKwl9CisKKwkvKiBzb3J0IHNlZ21lbnRzICovCisJZm9yIChpID0gMDsgaSA8IGRldl9pbmZvLT5udW1fb2Zfc2VnbWVudHM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IGRldl9pbmZvLT5udW1fb2Zfc2VnbWVudHM7IGorKykKKwkJCWlmIChzb3J0X2xpc3Rbal0uc3RhcnQgPiBzb3J0X2xpc3RbaV0uc3RhcnQpIHsKKwkJCQltZW1jcHkoJnRlbXAsICZzb3J0X2xpc3RbaV0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2VnbWVudF9pbmZvKSk7CisJCQkJbWVtY3B5KCZzb3J0X2xpc3RbaV0sICZzb3J0X2xpc3Rbal0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2VnbWVudF9pbmZvKSk7CisJCQkJbWVtY3B5KCZzb3J0X2xpc3Rbal0sICZ0ZW1wLAorCQkJCQlzaXplb2Yoc3RydWN0IHNlZ21lbnRfaW5mbykpOworCQkJfQorCisJLyogY2hlY2sgY29udGludWl0eSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXZfaW5mby0+bnVtX29mX3NlZ21lbnRzIC0gMTsgaSsrKSB7CisJCWlmICgoc29ydF9saXN0W2ldLmVuZCArIDEpICE9IHNvcnRfbGlzdFtpKzFdLnN0YXJ0KSB7CisJCQlQUklOVF9FUlIoIlNlZ21lbnQgJXMgaXMgbm90IGNvbnRpZ3VvdXMgd2l0aCAiCisJCQkJInNlZ21lbnQgJXNcbiIsCisJCQkJc29ydF9saXN0W2ldLnNlZ21lbnRfbmFtZSwKKwkJCQlzb3J0X2xpc3RbaSsxXS5zZWdtZW50X25hbWUpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyogRU4gYW5kIEVXIGFyZSBhbGxvd2VkIGluIGEgYmxvY2sgZGV2aWNlICovCisJCWlmIChzb3J0X2xpc3RbaV0uc2VnbWVudF90eXBlICE9IHNvcnRfbGlzdFtpKzFdLnNlZ21lbnRfdHlwZSkgeworCQkJaWYgKCEoc29ydF9saXN0W2ldLnNlZ21lbnRfdHlwZSAmIFNFR01FTlRfRVhDTFVTSVZFKSB8fAorCQkJCShzb3J0X2xpc3RbaV0uc2VnbWVudF90eXBlID09IFNFR19UWVBFX0VSKSB8fAorCQkJCSEoc29ydF9saXN0W2krMV0uc2VnbWVudF90eXBlICYKKwkJCQlTRUdNRU5UX0VYQ0xVU0lWRSkgfHwKKwkJCQkoc29ydF9saXN0W2krMV0uc2VnbWVudF90eXBlID09IFNFR19UWVBFX0VSKSkgeworCQkJCVBSSU5UX0VSUigiU2VnbWVudCAlcyBoYXMgZGlmZmVyZW50IHR5cGUgZnJvbSAiCisJCQkJCSJzZWdtZW50ICVzXG4iLAorCQkJCQlzb3J0X2xpc3RbaV0uc2VnbWVudF9uYW1lLAorCQkJCQlzb3J0X2xpc3RbaSsxXS5zZWdtZW50X25hbWUpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwlyYyA9IDA7CitvdXQ6CisJa2ZyZWUoc29ydF9saXN0KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBMb2FkIGEgc2VnbWVudAorICovCitzdGF0aWMgaW50CitkY3NzYmxrX2xvYWRfc2VnbWVudChjaGFyICpuYW1lLCBzdHJ1Y3Qgc2VnbWVudF9pbmZvICoqc2VnX2luZm8pCit7CisJaW50IHJjOworCisJLyogYWxyZWFkeSBsb2FkZWQ/ICovCisJZG93bl9yZWFkKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKKwkqc2VnX2luZm8gPSBkY3NzYmxrX2dldF9zZWdtZW50X2J5X25hbWUobmFtZSk7CisJdXBfcmVhZCgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CisJaWYgKCpzZWdfaW5mbyAhPSBOVUxMKQorCQlyZXR1cm4gLUVFWElTVDsKKworCS8qIGdldCBhIHN0cnVjdCBzZWdtZW50X2luZm8gKi8KKwkqc2VnX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VnbWVudF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCpzZWdfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmNweSgoKnNlZ19pbmZvKS0+c2VnbWVudF9uYW1lLCBuYW1lKTsKKworCS8qIGxvYWQgdGhlIHNlZ21lbnQgKi8KKwlyYyA9IHNlZ21lbnRfbG9hZChuYW1lLCBTRUdNRU5UX1NIQVJFRCwKKwkJCSYoKnNlZ19pbmZvKS0+c3RhcnQsICYoKnNlZ19pbmZvKS0+ZW5kKTsKKwlpZiAocmMgPCAwKSB7CisJCXNlZ21lbnRfd2FybmluZyhyYywgKCpzZWdfaW5mbyktPnNlZ21lbnRfbmFtZSk7CisJCWtmcmVlKCpzZWdfaW5mbyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJigqc2VnX2luZm8pLT5saCk7CisJCSgqc2VnX2luZm8pLT5zZWdtZW50X3R5cGUgPSByYzsKKwl9CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgdm9pZCBkY3NzYmxrX3VucmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2KQogewogCWRldmljZV91bnJlZ2lzdGVyKGRldik7CkBAIC0xNjUsNiArMzQ4LDcgQEAKIGRjc3NibGtfc2hhcmVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmluYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGRjc3NibGtfZGV2X2luZm8gKmRldl9pbmZvOworCXN0cnVjdCBzZWdtZW50X2luZm8gKmVudHJ5LCAqdGVtcDsKIAlpbnQgcmM7CiAKIAlpZiAoKGNvdW50ID4gMSkgJiYgKGluYnVmWzFdICE9ICdcbicpICYmIChpbmJ1ZlsxXSAhPSAnXDAnKSkKQEAgLTE3Miw0NiArMzU2LDQ2IEBACiAJZG93bl93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CiAJZGV2X2luZm8gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbywgZGV2KTsKIAlpZiAoYXRvbWljX3JlYWQoJmRldl9pbmZvLT51c2VfY291bnQpKSB7Ci0JCVBSSU5UX0VSUigic2hhcmU6IHNlZ21lbnQgJXMgaXMgYnVzeSFcbiIsCi0JCQkgIGRldl9pbmZvLT5zZWdtZW50X25hbWUpOwogCQlyYyA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChpbmJ1ZlswXSA9PSAnMScpIHsKLQkJLy8gcmVsb2FkIHNlZ21lbnQgaW4gc2hhcmVkIG1vZGUKLQkJcmMgPSBzZWdtZW50X21vZGlmeV9zaGFyZWQoZGV2X2luZm8tPnNlZ21lbnRfbmFtZSwKLQkJCQkJICAgU0VHTUVOVF9TSEFSRUQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlCVUdfT04ocmMgPT0gLUVJTlZBTCk7Ci0JCQlpZiAocmMgIT0gLUVBR0FJTikKLQkJCQlnb3RvIHJlbW92ZXNlZzsKLQkJfSBlbHNlIHsKLQkJCWRldl9pbmZvLT5pc19zaGFyZWQgPSAxOwotCQkJc3dpdGNoIChkZXZfaW5mby0+c2VnbWVudF90eXBlKSB7Ci0JCQkJY2FzZSBTRUdfVFlQRV9TUjoKLQkJCQljYXNlIFNFR19UWVBFX0VSOgotCQkJCWNhc2UgU0VHX1RZUEVfU0M6Ci0JCQkJCXNldF9kaXNrX3JvKGRldl9pbmZvLT5nZCwxKTsKKwkJLyogcmVsb2FkIHNlZ21lbnRzIGluIHNoYXJlZCBtb2RlICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXZfaW5mby0+c2VnX2xpc3QsIGxoKSB7CisJCQlyYyA9IHNlZ21lbnRfbW9kaWZ5X3NoYXJlZChlbnRyeS0+c2VnbWVudF9uYW1lLAorCQkJCQkJU0VHTUVOVF9TSEFSRUQpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCUJVR19PTihyYyA9PSAtRUlOVkFMKTsKKwkJCQlpZiAocmMgIT0gLUVBR0FJTikKKwkJCQkJZ290byByZW1vdmVzZWc7CiAJCQl9CiAJCX0KKwkJZGV2X2luZm8tPmlzX3NoYXJlZCA9IDE7CisJCXN3aXRjaCAoZGV2X2luZm8tPnNlZ21lbnRfdHlwZSkgeworCQljYXNlIFNFR19UWVBFX1NSOgorCQljYXNlIFNFR19UWVBFX0VSOgorCQljYXNlIFNFR19UWVBFX1NDOgorCQkJc2V0X2Rpc2tfcm8oZGV2X2luZm8tPmdkLCAxKTsKKwkJfQogCX0gZWxzZSBpZiAoaW5idWZbMF0gPT0gJzAnKSB7Ci0JCS8vIHJlbG9hZCBzZWdtZW50IGluIGV4Y2x1c2l2ZSBtb2RlCisJCS8qIHJlbG9hZCBzZWdtZW50cyBpbiBleGNsdXNpdmUgbW9kZSAqLwogCQlpZiAoZGV2X2luZm8tPnNlZ21lbnRfdHlwZSA9PSBTRUdfVFlQRV9TQykgewogCQkJUFJJTlRfRVJSKCJTZWdtZW50IHR5cGUgU0MgKCVzKSBjYW5ub3QgYmUgbG9hZGVkIGluICIKLQkJCQkgICJub24tc2hhcmVkIG1vZGVcbiIsIGRldl9pbmZvLT5zZWdtZW50X25hbWUpOworCQkJCSJub24tc2hhcmVkIG1vZGVcbiIsIGRldl9pbmZvLT5zZWdtZW50X25hbWUpOwogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJcmMgPSBzZWdtZW50X21vZGlmeV9zaGFyZWQoZGV2X2luZm8tPnNlZ21lbnRfbmFtZSwKLQkJCQkJICAgU0VHTUVOVF9FWENMVVNJVkUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlCVUdfT04ocmMgPT0gLUVJTlZBTCk7Ci0JCQlpZiAocmMgIT0gLUVBR0FJTikKLQkJCQlnb3RvIHJlbW92ZXNlZzsKLQkJfSBlbHNlIHsKLQkJCWRldl9pbmZvLT5pc19zaGFyZWQgPSAwOwotCQkJc2V0X2Rpc2tfcm8oZGV2X2luZm8tPmdkLCAwKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJCXJjID0gc2VnbWVudF9tb2RpZnlfc2hhcmVkKGVudHJ5LT5zZWdtZW50X25hbWUsCisJCQkJCQkgICBTRUdNRU5UX0VYQ0xVU0lWRSk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJQlVHX09OKHJjID09IC1FSU5WQUwpOworCQkJCWlmIChyYyAhPSAtRUFHQUlOKQorCQkJCQlnb3RvIHJlbW92ZXNlZzsKKwkJCX0KIAkJfQorCQlkZXZfaW5mby0+aXNfc2hhcmVkID0gMDsKKwkJc2V0X2Rpc2tfcm8oZGV2X2luZm8tPmdkLCAwKTsKIAl9IGVsc2UgewogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMjIwLDggKzQwNCwxNCBAQAogCWdvdG8gb3V0OwogCiByZW1vdmVzZWc6Ci0JUFJJTlRfRVJSKCJDb3VsZCBub3QgcmVsb2FkIHNlZ21lbnQgJXMsIHJlbW92aW5nIGl0IG5vdyFcbiIsCi0JCQlkZXZfaW5mby0+c2VnbWVudF9uYW1lKTsKKwlQUklOVF9FUlIoIkNvdWxkIG5vdCByZWxvYWQgc2VnbWVudChzKSBvZiB0aGUgZGV2aWNlICVzLCByZW1vdmluZyAiCisJCSJzZWdtZW50KHMpIG5vdyFcbiIsCisJCWRldl9pbmZvLT5zZWdtZW50X25hbWUpOworCXRlbXAgPSBlbnRyeTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2X2luZm8tPnNlZ19saXN0LCBsaCkgeworCQlpZiAoZW50cnkgIT0gdGVtcCkKKwkJCXNlZ21lbnRfdW5sb2FkKGVudHJ5LT5zZWdtZW50X25hbWUpOworCX0KIAlsaXN0X2RlbCgmZGV2X2luZm8tPmxoKTsKIAogCWRlbF9nZW5kaXNrKGRldl9pbmZvLT5nZCk7CkBAIC0yNTQsNiArNDQ0LDcgQEAKIGRjc3NibGtfc2F2ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICppbmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKKwlzdHJ1Y3Qgc2VnbWVudF9pbmZvICplbnRyeTsKIAogCWlmICgoY291bnQgPiAxKSAmJiAoaW5idWZbMV0gIT0gJ1xuJykgJiYgKGluYnVmWzFdICE9ICdcMCcpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI2MywxNCArNDU0LDE2IEBACiAJaWYgKGluYnVmWzBdID09ICcxJykgewogCQlpZiAoYXRvbWljX3JlYWQoJmRldl9pbmZvLT51c2VfY291bnQpID09IDApIHsKIAkJCS8vIGRldmljZSBpcyBpZGxlID0+IHdlIHNhdmUgaW1tZWRpYXRlbHkKLQkJCVBSSU5UX0lORk8oIlNhdmluZyBzZWdtZW50ICVzXG4iLAorCQkJUFJJTlRfSU5GTygiU2F2aW5nIHNlZ21lbnQocykgb2YgdGhlIGRldmljZSAlc1xuIiwKIAkJCQkgICBkZXZfaW5mby0+c2VnbWVudF9uYW1lKTsKLQkJCXNlZ21lbnRfc2F2ZShkZXZfaW5mby0+c2VnbWVudF9uYW1lKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXZfaW5mby0+c2VnX2xpc3QsIGxoKSB7CisJCQkJc2VnbWVudF9zYXZlKGVudHJ5LT5zZWdtZW50X25hbWUpOworCQkJfQogCQl9ICBlbHNlIHsKIAkJCS8vIGRldmljZSBpcyBidXN5ID0+IHdlIHNhdmUgaXQgd2hlbiBpdCBiZWNvbWVzCiAJCQkvLyBpZGxlIGluIGRjc3NibGtfcmVsZWFzZQotCQkJUFJJTlRfSU5GTygiU2VnbWVudCAlcyBpcyBjdXJyZW50bHkgYnVzeSwgaXQgd2lsbCAiCi0JCQkJICAgImJlIHNhdmVkIHdoZW4gaXQgYmVjb21lcyBpZGxlLi4uXG4iLAorCQkJUFJJTlRfSU5GTygiRGV2aWNlICVzIGlzIGN1cnJlbnRseSBidXN5LCBzZWdtZW50KHMpICIKKwkJCQkgICAid2lsbCBiZSBzYXZlZCB3aGVuIGl0IGJlY29tZXMgaWRsZS4uLlxuIiwKIAkJCQkgICBkZXZfaW5mby0+c2VnbWVudF9uYW1lKTsKIAkJCWRldl9pbmZvLT5zYXZlX3BlbmRpbmcgPSAxOwogCQl9CkBAIC0yNzksNyArNDcyLDggQEAKIAkJCS8vIGRldmljZSBpcyBidXN5ICYgdGhlIHVzZXIgd2FudHMgdG8gdW5kbyBoaXMgc2F2ZQogCQkJLy8gcmVxdWVzdAogCQkJZGV2X2luZm8tPnNhdmVfcGVuZGluZyA9IDA7Ci0JCQlQUklOVF9JTkZPKCJQZW5kaW5nIHNhdmUgZm9yIHNlZ21lbnQgJXMgZGVhY3RpdmF0ZWRcbiIsCisJCQlQUklOVF9JTkZPKCJQZW5kaW5nIHNhdmUgZm9yIHNlZ21lbnQocykgb2YgdGhlIGRldmljZSAiCisJCQkJCSIlcyBkZWFjdGl2YXRlZFxuIiwKIAkJCQkJZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7CiAJCX0KIAl9IGVsc2UgewpAQCAtMjkxLDY2ICs0ODUsMTIzIEBACiB9CiAKIC8qCisgKiBkZXZpY2UgYXR0cmlidXRlIGZvciBzaG93aW5nIGFsbCBzZWdtZW50cyBpbiBhIGRldmljZQorICovCitzdGF0aWMgc3NpemVfdAorZGNzc2Jsa19zZWdsaXN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBpOworCisJc3RydWN0IGRjc3NibGtfZGV2X2luZm8gKmRldl9pbmZvOworCXN0cnVjdCBzZWdtZW50X2luZm8gKmVudHJ5OworCisJZG93bl9yZWFkKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKKwlkZXZfaW5mbyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvLCBkZXYpOworCWkgPSAwOworCWJ1ZlswXSA9ICdcMCc7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJc3RyY3B5KCZidWZbaV0sIGVudHJ5LT5zZWdtZW50X25hbWUpOworCQlpICs9IHN0cmxlbihlbnRyeS0+c2VnbWVudF9uYW1lKTsKKwkJYnVmW2ldID0gJ1xuJzsKKwkJaSsrOworCX0KKwl1cF9yZWFkKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKKwlyZXR1cm4gaTsKK30KKworLyoKICAqIGRldmljZSBhdHRyaWJ1dGUgZm9yIGFkZGluZyBkZXZpY2VzCiAgKi8KIHN0YXRpYyBzc2l6ZV90CiBkY3NzYmxrX2FkZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgcmMsIGk7CisJaW50IHJjLCBpLCBqLCBudW1fb2Zfc2VnbWVudHM7CiAJc3RydWN0IGRjc3NibGtfZGV2X2luZm8gKmRldl9pbmZvOworCXN0cnVjdCBzZWdtZW50X2luZm8gKnNlZ19pbmZvLCAqdGVtcDsKIAljaGFyICpsb2NhbF9idWY7CiAJdW5zaWduZWQgbG9uZyBzZWdfYnl0ZV9zaXplOwogCiAJZGV2X2luZm8gPSBOVUxMOworCXNlZ19pbmZvID0gTlVMTDsKIAlpZiAoZGV2ICE9IGRjc3NibGtfcm9vdF9kZXYpIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9ub2J1ZjsKIAl9CisJaWYgKChjb3VudCA8IDEpIHx8IChidWZbMF0gPT0gJ1wwJykgfHwgKGJ1ZlswXSA9PSAnXG4nKSkgeworCQlyYyA9IC1FTkFNRVRPT0xPTkc7CisJCWdvdG8gb3V0X25vYnVmOworCX0KKwogCWxvY2FsX2J1ZiA9IGttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAobG9jYWxfYnVmID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9ub2J1ZjsKIAl9CisKIAkvKgogCSAqIHBhcnNlIGlucHV0CiAJICovCisJbnVtX29mX3NlZ21lbnRzID0gMDsKIAlmb3IgKGkgPSAwOyAoKGJ1ZltpXSAhPSAnXDAnKSAmJiAoYnVmW2ldICE9ICdcbicpICYmIGkgPCBjb3VudCk7IGkrKykgewotCQlsb2NhbF9idWZbaV0gPSB0b3VwcGVyKGJ1ZltpXSk7Ci0JfQotCWxvY2FsX2J1ZltpXSA9ICdcMCc7Ci0JaWYgKChpID09IDApIHx8IChpID4gOCkpIHsKLQkJcmMgPSAtRU5BTUVUT09MT05HOwotCQlnb3RvIG91dDsKLQl9Ci0JLyoKLQkgKiBhbHJlYWR5IGxvYWRlZD8KLQkgKi8KLQlkb3duX3JlYWQoJmRjc3NibGtfZGV2aWNlc19zZW0pOwotCWRldl9pbmZvID0gZGNzc2Jsa19nZXRfZGV2aWNlX2J5X25hbWUobG9jYWxfYnVmKTsKLQl1cF9yZWFkKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKLQlpZiAoZGV2X2luZm8gIT0gTlVMTCkgewotCQlQUklOVF9XQVJOKCJTZWdtZW50ICVzIGFscmVhZHkgbG9hZGVkIVxuIiwgbG9jYWxfYnVmKTsKLQkJcmMgPSAtRUVYSVNUOwotCQlnb3RvIG91dDsKLQl9Ci0JLyoKLQkgKiBnZXQgYSBzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbwotCSAqLwotCWRldl9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjc3NibGtfZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2X2luZm8gPT0gTlVMTCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCQlmb3IgKGogPSBpOyAoYnVmW2pdICE9ICc6JykgJiYKKwkJCShidWZbal0gIT0gJ1wwJykgJiYKKwkJCShidWZbal0gIT0gJ1xuJykgJiYKKwkJCWogPCBjb3VudDsgaisrKSB7CisJCQlsb2NhbF9idWZbai1pXSA9IHRvdXBwZXIoYnVmW2pdKTsKKwkJfQorCQlsb2NhbF9idWZbai1pXSA9ICdcMCc7CisJCWlmICgoKGogLSBpKSA9PSAwKSB8fCAoKGogLSBpKSA+IDgpKSB7CisJCQlyYyA9IC1FTkFNRVRPT0xPTkc7CisJCQlnb3RvIHNlZ19saXN0X2RlbDsKKwkJfQorCisJCXJjID0gZGNzc2Jsa19sb2FkX3NlZ21lbnQobG9jYWxfYnVmLCAmc2VnX2luZm8pOworCQlpZiAocmMgPCAwKQorCQkJZ290byBzZWdfbGlzdF9kZWw7CisJCS8qCisJCSAqIGdldCBhIHN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvCisJCSAqLworCQlpZiAobnVtX29mX3NlZ21lbnRzID09IDApIHsKKwkJCWRldl9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjc3NibGtfZGV2X2luZm8pLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmIChkZXZfaW5mbyA9PSBOVUxMKSB7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc3RyY3B5KGRldl9pbmZvLT5zZWdtZW50X25hbWUsIGxvY2FsX2J1Zik7CisJCQlkZXZfaW5mby0+c2VnbWVudF90eXBlID0gc2VnX2luZm8tPnNlZ21lbnRfdHlwZTsKKwkJCUlOSVRfTElTVF9IRUFEKCZkZXZfaW5mby0+c2VnX2xpc3QpOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnNlZ19pbmZvLT5saCwgJmRldl9pbmZvLT5zZWdfbGlzdCk7CisJCW51bV9vZl9zZWdtZW50cysrOworCQlpID0gajsKKworCQlpZiAoKGJ1ZltqXSA9PSAnXDAnKSB8fCAoYnVmW2pdID09ICdcbicpKQorCQkJYnJlYWs7CiAJfQogCi0Jc3RyY3B5KGRldl9pbmZvLT5zZWdtZW50X25hbWUsIGxvY2FsX2J1Zik7Ci0Jc3RybGNweShkZXZfaW5mby0+ZGV2LmJ1c19pZCwgbG9jYWxfYnVmLCBCVVNfSURfU0laRSk7CisJLyogbm8gdHJhaWxpbmcgY29sb24gYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KKwlpZiAoKGkgPiAwKSAmJiAoYnVmW2ktMV0gPT0gJzonKSkgeworCQlyYyA9IC1FTkFNRVRPT0xPTkc7CisJCWdvdG8gc2VnX2xpc3RfZGVsOworCX0KKwlzdHJsY3B5KGxvY2FsX2J1ZiwgYnVmLCBpICsgMSk7CisJZGV2X2luZm8tPm51bV9vZl9zZWdtZW50cyA9IG51bV9vZl9zZWdtZW50czsKKwlyYyA9IGRjc3NibGtfaXNfY29udGludW91cyhkZXZfaW5mbyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBzZWdfbGlzdF9kZWw7CisKKwlkZXZfaW5mby0+c3RhcnQgPSBkY3NzYmxrX2ZpbmRfbG93ZXN0X2FkZHIoZGV2X2luZm8pOworCWRldl9pbmZvLT5lbmQgPSBkY3NzYmxrX2ZpbmRfaGlnaGVzdF9hZGRyKGRldl9pbmZvKTsKKworCWRldl9zZXRfbmFtZSgmZGV2X2luZm8tPmRldiwgZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7CiAJZGV2X2luZm8tPmRldi5yZWxlYXNlID0gZGNzc2Jsa19yZWxlYXNlX3NlZ21lbnQ7CiAJSU5JVF9MSVNUX0hFQUQoJmRldl9pbmZvLT5saCk7Ci0KIAlkZXZfaW5mby0+Z2QgPSBhbGxvY19kaXNrKERDU1NCTEtfTUlOT1JTX1BFUl9ESVNLKTsKIAlpZiAoZGV2X2luZm8tPmdkID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfZGV2X2luZm87CisJCWdvdG8gc2VnX2xpc3RfZGVsOwogCX0KIAlkZXZfaW5mby0+Z2QtPm1ham9yID0gZGNzc2Jsa19tYWpvcjsKIAlkZXZfaW5mby0+Z2QtPmZvcHMgPSAmZGNzc2Jsa19kZXZvcHM7CkBAIC0zNjAsNTkgKzYxMSw0MyBAQAogCWRldl9pbmZvLT5nZC0+ZHJpdmVyZnNfZGV2ID0gJmRldl9pbmZvLT5kZXY7CiAJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChkZXZfaW5mby0+ZGNzc2Jsa19xdWV1ZSwgZGNzc2Jsa19tYWtlX3JlcXVlc3QpOwogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGRldl9pbmZvLT5kY3NzYmxrX3F1ZXVlLCA0MDk2KTsKLQkvKgotCSAqIGxvYWQgdGhlIHNlZ21lbnQKLQkgKi8KLQlyYyA9IHNlZ21lbnRfbG9hZChsb2NhbF9idWYsIFNFR01FTlRfU0hBUkVELAotCQkJCSZkZXZfaW5mby0+c3RhcnQsICZkZXZfaW5mby0+ZW5kKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXNlZ21lbnRfd2FybmluZyhyYywgZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7Ci0JCWdvdG8gZGVhbGxvY19nZW5kaXNrOwotCX0KKwogCXNlZ19ieXRlX3NpemUgPSAoZGV2X2luZm8tPmVuZCAtIGRldl9pbmZvLT5zdGFydCArIDEpOwogCXNldF9jYXBhY2l0eShkZXZfaW5mby0+Z2QsIHNlZ19ieXRlX3NpemUgPj4gOSk7IC8vIHNpemUgaW4gc2VjdG9ycwotCVBSSU5UX0lORk8oIkxvYWRlZCBzZWdtZW50ICVzLCBzaXplID0gJWx1IEJ5dGUsICIKKwlQUklOVF9JTkZPKCJMb2FkZWQgc2VnbWVudChzKSAlcywgc2l6ZSA9ICVsdSBCeXRlLCAiCiAJCSAgICJjYXBhY2l0eSA9ICVsdSAoNTEyIEJ5dGUpIHNlY3RvcnNcbiIsIGxvY2FsX2J1ZiwKIAkJICAgc2VnX2J5dGVfc2l6ZSwgc2VnX2J5dGVfc2l6ZSA+PiA5KTsKIAotCWRldl9pbmZvLT5zZWdtZW50X3R5cGUgPSByYzsKIAlkZXZfaW5mby0+c2F2ZV9wZW5kaW5nID0gMDsKIAlkZXZfaW5mby0+aXNfc2hhcmVkID0gMTsKIAlkZXZfaW5mby0+ZGV2LnBhcmVudCA9IGRjc3NibGtfcm9vdF9kZXY7CiAKIAkvKgotCSAqIGdldCBtaW5vciwgYWRkIHRvIGxpc3QKKwkgKmdldCBtaW5vciwgYWRkIHRvIGxpc3QKIAkgKi8KIAlkb3duX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKLQlpZiAoZGNzc2Jsa19nZXRfZGV2aWNlX2J5X25hbWUobG9jYWxfYnVmKSkgewotCQl1cF93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CisJaWYgKGRjc3NibGtfZ2V0X3NlZ21lbnRfYnlfbmFtZShsb2NhbF9idWYpKSB7CiAJCXJjID0gLUVFWElTVDsKLQkJZ290byB1bmxvYWRfc2VnOworCQlnb3RvIHJlbGVhc2VfZ2Q7CiAJfQogCXJjID0gZGNzc2Jsa19hc3NpZ25fZnJlZV9taW5vcihkZXZfaW5mbyk7Ci0JaWYgKHJjKSB7Ci0JCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKLQkJUFJJTlRfRVJSKCJObyBmcmVlIG1pbm9yIG51bWJlciBhdmFpbGFibGUhICIKLQkJCSAgIlVubG9hZGluZyBzZWdtZW50Li4uXG4iKTsKLQkJZ290byB1bmxvYWRfc2VnOwotCX0KKwlpZiAocmMpCisJCWdvdG8gcmVsZWFzZV9nZDsKIAlzcHJpbnRmKGRldl9pbmZvLT5nZC0+ZGlza19uYW1lLCAiZGNzc2JsayVkIiwKLQkJZGV2X2luZm8tPmdkLT5maXJzdF9taW5vcik7CisJCU1JTk9SKGRpc2tfZGV2dChkZXZfaW5mby0+Z2QpKSk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2X2luZm8tPmxoLCAmZGNzc2Jsa19kZXZpY2VzKTsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CiAJCXJjID0gLUVOT0RFVjsKLQkJZ290byBsaXN0X2RlbDsKKwkJZ290byBkZXZfbGlzdF9kZWw7CiAJfQogCS8qCiAJICogcmVnaXN0ZXIgdGhlIGRldmljZQogCSAqLwogCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXZfaW5mby0+ZGV2KTsKIAlpZiAocmMpIHsKLQkJUFJJTlRfRVJSKCJTZWdtZW50ICVzIGNvdWxkIG5vdCBiZSByZWdpc3RlcmVkIFJDPSVkXG4iLAotCQkJCWxvY2FsX2J1ZiwgcmMpOwogCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQkJZ290byBsaXN0X2RlbDsKKwkJZ290byBkZXZfbGlzdF9kZWw7CiAJfQogCWdldF9kZXZpY2UoJmRldl9pbmZvLT5kZXYpOwogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZfaW5mby0+ZGV2LCAmZGV2X2F0dHJfc2hhcmVkKTsKQEAgLTQyMSw2ICs2NTYsOSBAQAogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZfaW5mby0+ZGV2LCAmZGV2X2F0dHJfc2F2ZSk7CiAJaWYgKHJjKQogCQlnb3RvIHVucmVnaXN0ZXJfZGV2OworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZfaW5mby0+ZGV2LCAmZGV2X2F0dHJfc2VnbGlzdCk7CisJaWYgKHJjKQorCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCiAJYWRkX2Rpc2soZGV2X2luZm8tPmdkKTsKIApAQCAtNDM0LDcgKzY3Miw2IEBACiAJCQlzZXRfZGlza19ybyhkZXZfaW5mby0+Z2QsMCk7CiAJCQlicmVhazsKIAl9Ci0JUFJJTlRfREVCVUcoIlNlZ21lbnQgJXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuIiwgbG9jYWxfYnVmKTsKIAl1cF93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CiAJcmMgPSBjb3VudDsKIAlnb3RvIG91dDsKQEAgLTQ0NSwyMCArNjgyLDI3IEBACiAJZGV2X2luZm8tPmdkLT5xdWV1ZSA9IE5VTEw7CiAJcHV0X2Rpc2soZGV2X2luZm8tPmdkKTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmZGV2X2luZm8tPmRldik7Ci0Jc2VnbWVudF91bmxvYWQoZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdfaW5mbywgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJc2VnbWVudF91bmxvYWQoc2VnX2luZm8tPnNlZ21lbnRfbmFtZSk7CisJfQogCXB1dF9kZXZpY2UoJmRldl9pbmZvLT5kZXYpOwogCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKIAlnb3RvIG91dDsKLWxpc3RfZGVsOgorZGV2X2xpc3RfZGVsOgogCWxpc3RfZGVsKCZkZXZfaW5mby0+bGgpOwotCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKLXVubG9hZF9zZWc6Ci0Jc2VnbWVudF91bmxvYWQobG9jYWxfYnVmKTsKLWRlYWxsb2NfZ2VuZGlzazoKK3JlbGVhc2VfZ2Q6CiAJYmxrX2NsZWFudXBfcXVldWUoZGV2X2luZm8tPmRjc3NibGtfcXVldWUpOwogCWRldl9pbmZvLT5nZC0+cXVldWUgPSBOVUxMOwogCXB1dF9kaXNrKGRldl9pbmZvLT5nZCk7Ci1mcmVlX2Rldl9pbmZvOgorCXVwX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKK3NlZ19saXN0X2RlbDoKKwlpZiAoZGV2X2luZm8gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlZ19pbmZvLCB0ZW1wLCAmZGV2X2luZm8tPnNlZ19saXN0LCBsaCkgeworCQlsaXN0X2RlbCgmc2VnX2luZm8tPmxoKTsKKwkJc2VnbWVudF91bmxvYWQoc2VnX2luZm8tPnNlZ21lbnRfbmFtZSk7CisJCWtmcmVlKHNlZ19pbmZvKTsKKwl9CiAJa2ZyZWUoZGV2X2luZm8pOwogb3V0OgogCWtmcmVlKGxvY2FsX2J1Zik7CkBAIC00NzMsNiArNzE3LDcgQEAKIGRjc3NibGtfcmVtb3ZlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKKwlzdHJ1Y3Qgc2VnbWVudF9pbmZvICplbnRyeTsKIAlpbnQgcmMsIGk7CiAJY2hhciAqbG9jYWxfYnVmOwogCkBAIC00OTksMjYgKzc0NCwyOCBAQAogCWRldl9pbmZvID0gZGNzc2Jsa19nZXRfZGV2aWNlX2J5X25hbWUobG9jYWxfYnVmKTsKIAlpZiAoZGV2X2luZm8gPT0gTlVMTCkgewogCQl1cF93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7Ci0JCVBSSU5UX1dBUk4oIlNlZ21lbnQgJXMgaXMgbm90IGxvYWRlZCFcbiIsIGxvY2FsX2J1Zik7CisJCVBSSU5UX1dBUk4oIkRldmljZSAlcyBpcyBub3QgbG9hZGVkIVxuIiwgbG9jYWxfYnVmKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9idWY7CiAJfQogCWlmIChhdG9taWNfcmVhZCgmZGV2X2luZm8tPnVzZV9jb3VudCkgIT0gMCkgewogCQl1cF93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7Ci0JCVBSSU5UX1dBUk4oIlNlZ21lbnQgJXMgaXMgaW4gdXNlIVxuIiwgbG9jYWxfYnVmKTsKKwkJUFJJTlRfV0FSTigiRGV2aWNlICVzIGlzIGluIHVzZSFcbiIsIGxvY2FsX2J1Zik7CiAJCXJjID0gLUVCVVNZOwogCQlnb3RvIG91dF9idWY7CiAJfQotCWxpc3RfZGVsKCZkZXZfaW5mby0+bGgpOwogCisJbGlzdF9kZWwoJmRldl9pbmZvLT5saCk7CiAJZGVsX2dlbmRpc2soZGV2X2luZm8tPmdkKTsKIAlibGtfY2xlYW51cF9xdWV1ZShkZXZfaW5mby0+ZGNzc2Jsa19xdWV1ZSk7CiAJZGV2X2luZm8tPmdkLT5xdWV1ZSA9IE5VTEw7CiAJcHV0X2Rpc2soZGV2X2luZm8tPmdkKTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmZGV2X2luZm8tPmRldik7Ci0Jc2VnbWVudF91bmxvYWQoZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7Ci0JUFJJTlRfREVCVUcoIlNlZ21lbnQgJXMgdW5sb2FkZWQgc3VjY2Vzc2Z1bGx5XG4iLAotCQkJZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7CisKKwkvKiB1bmxvYWQgYWxsIHJlbGF0ZWQgc2VnbWVudHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2X2luZm8tPnNlZ19saXN0LCBsaCkKKwkJc2VnbWVudF91bmxvYWQoZW50cnktPnNlZ21lbnRfbmFtZSk7CisKIAlwdXRfZGV2aWNlKCZkZXZfaW5mby0+ZGV2KTsKIAl1cF93cml0ZSgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CiAKQEAgLTU1MCw2ICs3OTcsNyBAQAogZGNzc2Jsa19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKKwlzdHJ1Y3Qgc2VnbWVudF9pbmZvICplbnRyeTsKIAlpbnQgcmM7CiAKIAlkZXZfaW5mbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKQEAgLTU2MCw5ICs4MDgsMTEgQEAKIAlkb3duX3dyaXRlKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGV2X2luZm8tPnVzZV9jb3VudCkKIAkgICAgJiYgKGRldl9pbmZvLT5zYXZlX3BlbmRpbmcpKSB7Ci0JCVBSSU5UX0lORk8oIlNlZ21lbnQgJXMgYmVjYW1lIGlkbGUgYW5kIGlzIGJlaW5nIHNhdmVkIG5vd1xuIiwKKwkJUFJJTlRfSU5GTygiRGV2aWNlICVzIGJlY2FtZSBpZGxlIGFuZCBpcyBiZWluZyBzYXZlZCBub3dcbiIsCiAJCQkgICAgZGV2X2luZm8tPnNlZ21lbnRfbmFtZSk7Ci0JCXNlZ21lbnRfc2F2ZShkZXZfaW5mby0+c2VnbWVudF9uYW1lKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldl9pbmZvLT5zZWdfbGlzdCwgbGgpIHsKKwkJCXNlZ21lbnRfc2F2ZShlbnRyeS0+c2VnbWVudF9uYW1lKTsKKwkJfQogCQlkZXZfaW5mby0+c2F2ZV9wZW5kaW5nID0gMDsKIAl9CiAJdXBfd3JpdGUoJmRjc3NibGtfZGV2aWNlc19zZW0pOwpAQCAtNjAyLDcgKzg1Miw4IEBACiAJCWNhc2UgU0VHX1RZUEVfU0M6CiAJCQkvKiBjYW5ub3Qgd3JpdGUgdG8gdGhlc2Ugc2VnbWVudHMgKi8KIAkJCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgewotCQkJCVBSSU5UX1dBUk4oInJlamVjdGluZyB3cml0ZSB0byBybyBzZWdtZW50ICVzXG4iLCBkZXZfaW5mby0+ZGV2LmJ1c19pZCk7CisJCQkJUFJJTlRfV0FSTigicmVqZWN0aW5nIHdyaXRlIHRvIHJvIGRldmljZSAlc1xuIiwKKwkJCQkJICAgZGV2X25hbWUoJmRldl9pbmZvLT5kZXYpKTsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CiAJCX0KQEAgLTY1Nyw3ICs5MDgsNyBAQAogZGNzc2Jsa19jaGVja19wYXJhbXModm9pZCkKIHsKIAlpbnQgcmMsIGksIGosIGs7Ci0JY2hhciBidWZbOV07CisJY2hhciBidWZbRENTU0JMS19QQVJNX0xFTiArIDFdOwogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsKIAogCWZvciAoaSA9IDA7IChpIDwgRENTU0JMS19QQVJNX0xFTikgJiYgKGRjc3NibGtfc2VnbWVudHNbaV0gIT0gJ1wwJyk7CkBAIC02NjUsMTUgKzkxNiwxNiBAQAogCQlmb3IgKGogPSBpOyAoZGNzc2Jsa19zZWdtZW50c1tqXSAhPSAnLCcpICAmJgogCQkJICAgIChkY3NzYmxrX3NlZ21lbnRzW2pdICE9ICdcMCcpICYmCiAJCQkgICAgKGRjc3NibGtfc2VnbWVudHNbal0gIT0gJygnKSAgJiYKLQkJCSAgICAoaiAtIGkpIDwgODsgaisrKQorCQkJICAgIChqIDwgRENTU0JMS19QQVJNX0xFTik7IGorKykKIAkJewogCQkJYnVmW2otaV0gPSBkY3NzYmxrX3NlZ21lbnRzW2pdOwogCQl9CiAJCWJ1ZltqLWldID0gJ1wwJzsKIAkJcmMgPSBkY3NzYmxrX2FkZF9zdG9yZShkY3NzYmxrX3Jvb3RfZGV2LCBOVUxMLCBidWYsIGotaSk7CiAJCWlmICgocmMgPj0gMCkgJiYgKGRjc3NibGtfc2VnbWVudHNbal0gPT0gJygnKSkgewotCQkJZm9yIChrID0gMDsgYnVmW2tdICE9ICdcMCc7IGsrKykKKwkJCWZvciAoayA9IDA7IChidWZba10gIT0gJzonKSAmJiAoYnVmW2tdICE9ICdcMCcpOyBrKyspCiAJCQkJYnVmW2tdID0gdG91cHBlcihidWZba10pOworCQkJYnVmW2tdID0gJ1wwJzsKIAkJCWlmICghc3RybmNtcCgmZGNzc2Jsa19zZWdtZW50c1tqXSwgIihsb2NhbCkiLCA3KSkgewogCQkJCWRvd25fcmVhZCgmZGNzc2Jsa19kZXZpY2VzX3NlbSk7CiAJCQkJZGV2X2luZm8gPSBkY3NzYmxrX2dldF9kZXZpY2VfYnlfbmFtZShidWYpOwpAQCAtNzQwLDEwICs5OTIsMTIgQEAKIAogbW9kdWxlX3BhcmFtX3N0cmluZyhzZWdtZW50cywgZGNzc2Jsa19zZWdtZW50cywgRENTU0JMS19QQVJNX0xFTiwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlZ21lbnRzLCAiTmFtZSBvZiBEQ1NTIHNlZ21lbnQocykgdG8gYmUgbG9hZGVkLCAiCi0JCSAiY29tbWEtc2VwYXJhdGVkIGxpc3QsIGVhY2ggbmFtZSBtYXguIDggY2hhcnMuXG4iCi0JCSAiQWRkaW5nIFwiKGxvY2FsKVwiIHRvIHNlZ21lbnQgbmFtZSBlcXVhbHMgZWNob2luZyAwIHRvICIKLQkJICIvc3lzL2RldmljZXMvZGNzc2Jsay88c2VnbWVudCBuYW1lPi9zaGFyZWQgYWZ0ZXIgbG9hZGluZyAiCi0JCSAidGhlIHNlZ21lbnQgLSBcbiIKLQkJICJlLmcuIHNlZ21lbnRzPVwibXlkY3NzMSxteWRjc3MyLG15ZGNzczMobG9jYWwpXCIiKTsKKwkJICJjb21tYS1zZXBhcmF0ZWQgbGlzdCwgbmFtZXMgaW4gZWFjaCBzZXQgc2VwYXJhdGVkICIKKwkJICJieSBjb21tYXMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMsIGVhY2ggc2V0IGNvbnRhaW5zICIKKwkJICJuYW1lcyBvZiBjb250aWd1b3VzIHNlZ21lbnRzIGFuZCBlYWNoIG5hbWUgbWF4LiA4IGNoYXJzLlxuIgorCQkgIkFkZGluZyBcIihsb2NhbClcIiB0byB0aGUgZW5kIG9mIGVhY2ggc2V0IGVxdWFscyBlY2hvaW5nIDAgIgorCQkgInRvIC9zeXMvZGV2aWNlcy9kY3NzYmxrLzxkZXZpY2UgbmFtZT4vc2hhcmVkIGFmdGVyIGxvYWRpbmcgIgorCQkgInRoZSBjb250aWd1b3VzIHNlZ21lbnRzIC0gXG4iCisJCSAiZS5nLiBzZWdtZW50cz1cIm15ZGNzczEsbXlkY3NzMjpteWRjc3MzLG15ZGNzczQobG9jYWwpXCIiKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL3hwcmFtLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYwppbmRleCBkZDliOTg2Li4wMzkxNjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYwpAQCAtNTYsNiArNTYsNyBAQAogc3RhdGljIHhwcmFtX2RldmljZV90IHhwcmFtX2RldmljZXNbWFBSQU1fTUFYX0RFVlNdOwogc3RhdGljIHVuc2lnbmVkIGludCB4cHJhbV9zaXplc1tYUFJBTV9NQVhfREVWU107CiBzdGF0aWMgc3RydWN0IGdlbmRpc2sgKnhwcmFtX2Rpc2tzW1hQUkFNX01BWF9ERVZTXTsKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqeHByYW1fcXVldWVzW1hQUkFNX01BWF9ERVZTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeHByYW1fcGFnZXM7CiBzdGF0aWMgaW50IHhwcmFtX2RldnM7CiAKQEAgLTMzMCwxOCArMzMxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqeHByYW1fcXVldWU7Ci0KIHN0YXRpYyBpbnQgX19pbml0IHhwcmFtX3NldHVwX2Jsa2Rldih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCWludCBpLCByYyA9IC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgeHByYW1fZGV2czsgaSsrKSB7Ci0JCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzaygxKTsKLQkJaWYgKCFkaXNrKQorCQl4cHJhbV9kaXNrc1tpXSA9IGFsbG9jX2Rpc2soMSk7CisJCWlmICgheHByYW1fZGlza3NbaV0pCiAJCQlnb3RvIG91dDsKLQkJeHByYW1fZGlza3NbaV0gPSBkaXNrOworCQl4cHJhbV9xdWV1ZXNbaV0gPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CisJCWlmICgheHByYW1fcXVldWVzW2ldKSB7CisJCQlwdXRfZGlzayh4cHJhbV9kaXNrc1tpXSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHhwcmFtX3F1ZXVlc1tpXSwgeHByYW1fbWFrZV9yZXF1ZXN0KTsKKwkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoeHByYW1fcXVldWVzW2ldLCA0MDk2KTsKIAl9CiAKIAkvKgpAQCAtMzUyLDE4ICszNTcsNiBAQAogCQlnb3RvIG91dDsKIAogCS8qCi0JICogQXNzaWduIHRoZSBvdGhlciBuZWVkZWQgdmFsdWVzOiBtYWtlIHJlcXVlc3QgZnVuY3Rpb24sIHNpemVzIGFuZAotCSAqIGhhcmRzZWN0IHNpemUuIEFsbCB0aGUgbWlub3IgZGV2aWNlcyBmZWF0dXJlIHRoZSBzYW1lIHZhbHVlLgotCSAqLwotCXhwcmFtX3F1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwotCWlmICgheHByYW1fcXVldWUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dF91bnJlZzsKLQl9Ci0JYmxrX3F1ZXVlX21ha2VfcmVxdWVzdCh4cHJhbV9xdWV1ZSwgeHByYW1fbWFrZV9yZXF1ZXN0KTsKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZSh4cHJhbV9xdWV1ZSwgNDA5Nik7Ci0KLQkvKgogCSAqIFNldHVwIGRldmljZSBzdHJ1Y3R1cmVzLgogCSAqLwogCW9mZnNldCA9IDA7CkBAIC0zNzcsMTggKzM3MCwxOCBAQAogCQlkaXNrLT5maXJzdF9taW5vciA9IGk7CiAJCWRpc2stPmZvcHMgPSAmeHByYW1fZGV2b3BzOwogCQlkaXNrLT5wcml2YXRlX2RhdGEgPSAmeHByYW1fZGV2aWNlc1tpXTsKLQkJZGlzay0+cXVldWUgPSB4cHJhbV9xdWV1ZTsKKwkJZGlzay0+cXVldWUgPSB4cHJhbV9xdWV1ZXNbaV07CiAJCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAic2xyYW0lZCIsIGkpOwogCQlzZXRfY2FwYWNpdHkoZGlzaywgeHByYW1fc2l6ZXNbaV0gPDwgMSk7CiAJCWFkZF9kaXNrKGRpc2spOwogCX0KIAogCXJldHVybiAwOwotb3V0X3VucmVnOgotCXVucmVnaXN0ZXJfYmxrZGV2KFhQUkFNX01BSk9SLCBYUFJBTV9OQU1FKTsKIG91dDoKLQl3aGlsZSAoaS0tKQorCXdoaWxlIChpLS0pIHsKKwkJYmxrX2NsZWFudXBfcXVldWUoeHByYW1fcXVldWVzW2ldKTsKIAkJcHV0X2Rpc2soeHByYW1fZGlza3NbaV0pOworCX0KIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQwMCwxMCArMzkzLDEwIEBACiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IHhwcmFtX2RldnM7IGkrKykgewogCQlkZWxfZ2VuZGlzayh4cHJhbV9kaXNrc1tpXSk7CisJCWJsa19jbGVhbnVwX3F1ZXVlKHhwcmFtX3F1ZXVlc1tpXSk7CiAJCXB1dF9kaXNrKHhwcmFtX2Rpc2tzW2ldKTsKIAl9CiAJdW5yZWdpc3Rlcl9ibGtkZXYoWFBSQU1fTUFKT1IsIFhQUkFNX05BTUUpOwotCWJsa19jbGVhbnVwX3F1ZXVlKHhwcmFtX3F1ZXVlKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgeHByYW1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCmluZGV4IGQzZWM5YjUuLjlhYjA2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgpAQCAtODgsNyArODksNiBAQAogCWludCBjb3VudDsJCSAgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCiAJaW50IHdyaXR0ZW47CQkgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gd3JpdGUgcmVxdWVzdHMgKi8KIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkgICAgICAvKiBwb2ludGVyIHRvIHR0eSBzdHJ1Y3R1cmUgaWYgcHJlc2VudCAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogCXN0cnVjdCByYXczMjE1X3JlcSAqcXVldWVkX3JlYWQ7IC8qIHBvaW50ZXIgdG8gcXVldWVkIHJlYWQgcmVxdWVzdHMgKi8KIAlzdHJ1Y3QgcmF3MzIxNV9yZXEgKnF1ZXVlZF93cml0ZTsvKiBwb2ludGVyIHRvIHF1ZXVlZCB3cml0ZSByZXF1ZXN0cyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGVtcHR5X3dhaXQ7IC8qIHdhaXQgcXVldWUgZm9yIGZsdXNoaW5nICovCkBAIC0zNDEsMjEgKzM0MSwxNCBAQAogfQogCiAvKgotICogVGhlIGJvdHRvbSBoYWxmIGhhbmRsZXIgcm91dGluZSBmb3IgMzIxNSBkZXZpY2VzLiBJdCB0cmllcyB0byBzdGFydAotICogdGhlIG5leHQgSU8gYW5kIHdha2VzIHVwIHByb2Nlc3NlcyB3YWl0aW5nIG9uIHRoZSB0dHkuCisgKiBUcnkgdG8gc3RhcnQgdGhlIG5leHQgSU8gYW5kIHdha2UgdXAgcHJvY2Vzc2VzIHdhaXRpbmcgb24gdGhlIHR0eS4KICAqLwotc3RhdGljIHZvaWQKLXJhdzMyMTVfdGFza2xldCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcmF3MzIxNV9uZXh0X2lvKHN0cnVjdCByYXczMjE1X2luZm8gKnJhdykKIHsKLQlzdHJ1Y3QgcmF3MzIxNV9pbmZvICpyYXc7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgZGF0YTsKLQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCXJhdzMyMTVfbWtfd3JpdGVfcmVxKHJhdyk7CiAJcmF3MzIxNV90cnlfaW8ocmF3KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJdHR5ID0gcmF3LT50dHk7CiAJaWYgKHR0eSAhPSBOVUxMICYmCiAJICAgIFJBVzMyMTVfQlVGRkVSX1NJWkUgLSByYXctPmNvdW50ID49IFJBVzMyMTVfTUlOX1NQQUNFKSB7CkBAIC0zODAsNyArMzczLDcgQEAKIAljc3RhdCA9IGlyYi0+c2Nzdy5jbWQuY3N0YXQ7CiAJZHN0YXQgPSBpcmItPnNjc3cuY21kLmRzdGF0OwogCWlmIChjc3RhdCAhPSAwKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZyYXctPnRhc2tsZXQpOworCQlyYXczMjE1X25leHRfaW8ocmF3KTsKIAlpZiAoZHN0YXQgJiAweDAxKSB7IC8qIHdlIGdvdCBhIHVuaXQgZXhjZXB0aW9uICovCiAJCWRzdGF0ICY9IH4weDAxOwkgLyogd2UgY2FuIGlnbm9yZSBpdCAqLwogCX0KQEAgLTM5MCw3ICszODMsNyBAQAogCQkJYnJlYWs7CiAJCS8qIEF0dGVudGlvbiBpbnRlcnJ1cHQsIHNvbWVvbmUgaGl0IHRoZSBlbnRlciBrZXkgKi8KIAkJcmF3MzIxNV9ta19yZWFkX3JlcShyYXcpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZyYXctPnRhc2tsZXQpOworCQlyYXczMjE1X25leHRfaW8ocmF3KTsKIAkJYnJlYWs7CiAJY2FzZSAweDA4OgogCWNhc2UgMHgwQzoKQEAgLTQ0OCw3ICs0NDEsNyBAQAogCQkgICAgcmF3LT5xdWV1ZWRfcmVhZCA9PSBOVUxMKSB7CiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJhdy0+ZW1wdHlfd2FpdCk7CiAJCX0KLQkJdGFza2xldF9zY2hlZHVsZSgmcmF3LT50YXNrbGV0KTsKKwkJcmF3MzIxNV9uZXh0X2lvKHJhdyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFN0cmFuZ2UgaW50ZXJydXB0LCBJJ2xsIGRvIG15IGJlc3QgdG8gY2xlYW4gdXAgKi8KQEAgLTQ2MCw3ICs0NTMsNyBAQAogCQkJcmF3LT5mbGFncyAmPSB+UkFXMzIxNV9XT1JLSU5HOwogCQkJcmF3MzIxNV9mcmVlX3JlcShyZXEpOwogCQl9Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnJhdy0+dGFza2xldCk7CisJCXJhdzMyMTVfbmV4dF9pbyhyYXcpOwogCX0KIAlyZXR1cm47CiB9CkBAIC02NzQsOSArNjY3LDYgQEAKIAkJa2ZyZWUocmF3KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXRhc2tsZXRfaW5pdCgmcmF3LT50YXNrbGV0LAotCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgcmF3MzIxNV90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKSByYXcpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJhdy0+ZW1wdHlfd2FpdCk7CiAKIAljZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSByYXc7CkBAIC03NzUsMTEgKzc2NSwxMSBAQAogfQogCiAvKgotICogcGFuaWMoKSBjYWxscyBjb25zb2xlX3VuYmxhbmsgYmVmb3JlIHRoZSBzeXN0ZW0gZW50ZXJzIGEKLSAqIGRpc2FibGVkLCBlbmRsZXNzIGxvb3AuCisgKiBwYW5pYygpIGNhbGxzIGNvbjMyMTVfZmx1c2ggdGhyb3VnaCBhIHBhbmljX25vdGlmaWVyCisgKiBiZWZvcmUgdGhlIHN5c3RlbSBlbnRlcnMgYSBkaXNhYmxlZCwgZW5kbGVzcyBsb29wLgogICovCiBzdGF0aWMgdm9pZAotY29uMzIxNV91bmJsYW5rKHZvaWQpCitjb24zMjE1X2ZsdXNoKHZvaWQpCiB7CiAJc3RydWN0IHJhdzMyMTVfaW5mbyAqcmF3OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03OTAsNiArNzgwLDIzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGNvbjMyMTVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwljb24zMjE1X2ZsdXNoKCk7CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBvbl9wYW5pY19uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNvbjMyMTVfbm90aWZ5LAorCS5wcmlvcml0eSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG9uX3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNvbjMyMTVfbm90aWZ5LAorCS5wcmlvcml0eSA9IDAsCit9OworCiAvKgogICogIFRoZSBjb25zb2xlIHN0cnVjdHVyZSBmb3IgdGhlIDMyMTUgY29uc29sZQogICovCkBAIC03OTcsNyArODA0LDYgQEAKIAkubmFtZQkgPSAidHR5UyIsCiAJLndyaXRlCSA9IGNvbjMyMTVfd3JpdGUsCiAJLmRldmljZQkgPSBjb24zMjE1X2RldmljZSwKLQkudW5ibGFuayA9IGNvbjMyMTVfdW5ibGFuaywKIAkuZmxhZ3MJID0gQ09OX1BSSU5UQlVGRkVSLAogfTsKIApAQCAtODQ2LDkgKzg1Miw2IEBACiAJY2Rldi0+aGFuZGxlciA9IHJhdzMyMTVfaXJxOwogCiAJcmF3LT5mbGFncyB8PSBSQVczMjE1X0ZJWEVEOwotCXRhc2tsZXRfaW5pdCgmcmF3LT50YXNrbGV0LAotCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgcmF3MzIxNV90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKSByYXcpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJhdy0+ZW1wdHlfd2FpdCk7CiAKIAkvKiBSZXF1ZXN0IHRoZSBjb25zb2xlIGlycSAqLwpAQCAtODU5LDYgKzg2Miw4IEBACiAJCXJhdzMyMTVbMF0gPSBOVUxMOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmb25fcGFuaWNfbmIpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmb25fcmVib290X25iKTsKIAlyZWdpc3Rlcl9jb25zb2xlKCZjb24zMjE1KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYwppbmRleCAzYzA3OTc0Li5kMDI4ZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgpAQCAtNTI4LDExICs1MjksMTEgQEAKIH0KIAogLyoKLSAqIHBhbmljKCkgY2FsbHMgY29uc29sZV91bmJsYW5rIGJlZm9yZSB0aGUgc3lzdGVtIGVudGVycyBhCi0gKiBkaXNhYmxlZCwgZW5kbGVzcyBsb29wLgorICogcGFuaWMoKSBjYWxscyBjb24zMjcwX2ZsdXNoIHRocm91Z2ggYSBwYW5pY19ub3RpZmllcgorICogYmVmb3JlIHRoZSBzeXN0ZW0gZW50ZXJzIGEgZGlzYWJsZWQsIGVuZGxlc3MgbG9vcC4KICAqLwogc3RhdGljIHZvaWQKLWNvbjMyNzBfdW5ibGFuayh2b2lkKQorY29uMzI3MF9mbHVzaCh2b2lkKQogewogCXN0cnVjdCBjb24zMjcwICpjcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTU0LDYgKzU1NSwyMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT52aWV3LmxvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBjb24zMjcwX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJY29uMzI3MF9mbHVzaCgpOworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb25fcGFuaWNfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjb24zMjcwX25vdGlmeSwKKwkucHJpb3JpdHkgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBvbl9yZWJvb3RfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjb24zMjcwX25vdGlmeSwKKwkucHJpb3JpdHkgPSAwLAorfTsKKwogLyoKICAqICBUaGUgY29uc29sZSBzdHJ1Y3R1cmUgZm9yIHRoZSAzMjcwIGNvbnNvbGUKICAqLwpAQCAtNTYxLDcgKzU3OSw2IEBACiAJLm5hbWUJID0gInR0eTMyNzAiLAogCS53cml0ZQkgPSBjb24zMjcwX3dyaXRlLAogCS5kZXZpY2UJID0gY29uMzI3MF9kZXZpY2UsCi0JLnVuYmxhbmsgPSBjb24zMjcwX3VuYmxhbmssCiAJLmZsYWdzCSA9IENPTl9QUklOVEJVRkZFUiwKIH07CiAKQEAgLTYyMyw2ICs2NDAsOCBAQAogCWNvbmRldi0+Y2xpbmUtPmxlbiA9IDA7CiAJY29uMzI3MF9jcmVhdGVfc3RhdHVzKGNvbmRldik7CiAJY29uZGV2LT5pbnB1dCA9IGFsbG9jX3N0cmluZygmY29uZGV2LT5mcmVlbWVtLCA4MCk7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmb25fcGFuaWNfbmIpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmb25fcmVib290X25iKTsKIAlyZWdpc3Rlcl9jb25zb2xlKCZjb24zMjcwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKaW5kZXggZDE4ZTZkMi4uNDA3NTljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKQEAgLTQxOCwyNSArNDE4LDIyIEBACiB7CiAJc3RydWN0IGZzMzI3MCAqZnA7CiAJc3RydWN0IGlkYWxfYnVmZmVyICppYjsKLQlpbnQgbWlub3IsIHJjOworCWludCBtaW5vciwgcmMgPSAwOwogCiAJaWYgKGltYWpvcihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSAhPSBJQk1fRlMzMjcwX01BSk9SKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlsb2NrX2tlcm5lbCgpOwogCW1pbm9yID0gaW1pbm9yKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCS8qIENoZWNrIGZvciBtaW5vciAwIG11bHRpcGxleGVyLiAqLwogCWlmIChtaW5vciA9PSAwKSB7Ci0JCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOworCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CiAJCWlmICghdHR5IHx8IHR0eS0+ZHJpdmVyLT5tYWpvciAhPSBJQk1fVFRZMzI3MF9NQUpPUikgewotCQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBvdXQ7CisJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCW1pbm9yID0gdHR5LT5pbmRleCArIFJBVzMyNzBfRklSU1RNSU5PUjsKLQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CisJbG9ja19rZXJuZWwoKTsKIAkvKiBDaGVjayBpZiBzb21lIG90aGVyIHByb2dyYW0gaXMgYWxyZWFkeSB1c2luZyBmdWxsc2NyZWVuIG1vZGUuICovCiAJZnAgPSAoc3RydWN0IGZzMzI3MCAqKSByYXczMjcwX2ZpbmRfdmlldygmZnMzMjcwX2ZuLCBtaW5vcik7CiAJaWYgKCFJU19FUlIoZnApKSB7CkBAIC00NzgsNyArNDc1LDcgQEAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBmcDsKIG91dDoKIAl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCmluZGV4IGMzZGVlOTAuLjBiMTVjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKQEAgLTExNjgsMTkgKzExNjgsMTcgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0JcnAtPmNsdHR5ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKGNsYXNzMzI3MCwgJnJwLT5jZGV2LT5kZXYsCi0JCQkJCSAgICAgTUtERVYoSUJNX1RUWTMyNzBfTUFKT1IsIHJwLT5taW5vciksCi0JCQkJCSAgICAgTlVMTCwKLQkJCQkJICAgICAidHR5JXMiLCBycC0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJcnAtPmNsdHR5ZGV2ID0gZGV2aWNlX2NyZWF0ZShjbGFzczMyNzAsICZycC0+Y2Rldi0+ZGV2LAorCQkJCSAgICAgTUtERVYoSUJNX1RUWTMyNzBfTUFKT1IsIHJwLT5taW5vciksIE5VTEwsCisJCQkJICAgICAidHR5JXMiLCBkZXZfbmFtZSgmcnAtPmNkZXYtPmRldikpOwogCWlmIChJU19FUlIocnAtPmNsdHR5ZGV2KSkgewogCQlyYyA9IFBUUl9FUlIocnAtPmNsdHR5ZGV2KTsKIAkJZ290byBvdXRfdHR5ZGV2OwogCX0KIAotCXJwLT5jbHR1YmRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShjbGFzczMyNzAsICZycC0+Y2Rldi0+ZGV2LAotCQkJCQkgICAgIE1LREVWKElCTV9GUzMyNzBfTUFKT1IsIHJwLT5taW5vciksCi0JCQkJCSAgICAgTlVMTCwKLQkJCQkJICAgICAidHViJXMiLCBycC0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJcnAtPmNsdHViZGV2ID0gZGV2aWNlX2NyZWF0ZShjbGFzczMyNzAsICZycC0+Y2Rldi0+ZGV2LAorCQkJCSAgICAgTUtERVYoSUJNX0ZTMzI3MF9NQUpPUiwgcnAtPm1pbm9yKSwgTlVMTCwKKwkJCQkgICAgICJ0dWIlcyIsIGRldl9uYW1lKCZycC0+Y2Rldi0+ZGV2KSk7CiAJaWYgKCFJU19FUlIocnAtPmNsdHViZGV2KSkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY29uLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2Nvbi5jCmluZGV4IDdlNjE5YzUuLjlhMjVjNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY29uLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jb24uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlICJzY2xwLmgiCiAjaW5jbHVkZSAic2NscF9ydy5oIgpAQCAtMTcyLDcgKzE3Myw3IEBACiAgKiB3aWxsIGJlIGZsdXNoZWQgdG8gdGhlIFNDTFAuCiAgKi8KIHN0YXRpYyB2b2lkCi1zY2xwX2NvbnNvbGVfdW5ibGFuayh2b2lkKQorc2NscF9jb25zb2xlX2ZsdXNoKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTg4LDYgKzE4OSwyNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjbHBfY29uX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludAorc2NscF9jb25zb2xlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc2NscF9jb25zb2xlX2ZsdXNoKCk7CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBvbl9wYW5pY19uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNjbHBfY29uc29sZV9ub3RpZnksCisJLnByaW9yaXR5ID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb25fcmVib290X25iID0geworCS5ub3RpZmllcl9jYWxsID0gc2NscF9jb25zb2xlX25vdGlmeSwKKwkucHJpb3JpdHkgPSAxLAorfTsKKwogLyoKICAqIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIFNDTFAgY29uc29sZSB0byB0aGUga2VybmVsIGFuZCB0bwogICogZ2l2ZSBwcmludGsgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCkBAIC0xOTcsNyArMjE2LDYgQEAKIAkubmFtZSA9IHNjbHBfY29uc29sZV9uYW1lLAogCS53cml0ZSA9IHNjbHBfY29uc29sZV93cml0ZSwKIAkuZGV2aWNlID0gc2NscF9jb25zb2xlX2RldmljZSwKLQkudW5ibGFuayA9IHNjbHBfY29uc29sZV91bmJsYW5rLAogCS5mbGFncyA9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXggPSAwIC8qIHR0eVMwICovCiB9OwpAQCAtMjQxLDYgKzI1OSw4IEBACiAJc2NscF9jb25fd2lkdGhfaHRhYiA9IDg7CiAKIAkvKiBlbmFibGUgcHJpbnRrLWFjY2VzcyB0byB0aGlzIGRyaXZlciAqLworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJm9uX3BhbmljX25iKTsKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm9uX3JlYm9vdF9uYik7CiAJcmVnaXN0ZXJfY29uc29sZSgmc2NscF9jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYwppbmRleCBhZDUxNzM4Li45ODU0ZjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAic2NscC5oIgogCkBAIC03NDMsMjQgKzc0NSwzMCBAQAogCXJldHVybiBzY2xwX3Z0MjIwX2RyaXZlcjsKIH0KIAotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBwYW5pYyB3aGVuIHRoZSBrZXJuZWwgaXMgZ29pbmcgdG8gZ2l2ZSB1cC4KLSAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGJ1ZmZlcnMgd2lsbCBiZSBmbHVzaGVkIHRvIHRoZSBTQ0xQLgotICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqLwotc3RhdGljIHZvaWQKLXNjbHBfdnQyMjBfY29uX3VuYmxhbmsodm9pZCkKK3N0YXRpYyBpbnQKK3NjbHBfdnQyMjBfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKIHsKIAlfX3NjbHBfdnQyMjBfZmx1c2hfYnVmZmVyKCk7CisJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBvbl9wYW5pY19uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNjbHBfdnQyMjBfbm90aWZ5LAorCS5wcmlvcml0eSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG9uX3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNjbHBfdnQyMjBfbm90aWZ5LAorCS5wcmlvcml0eSA9IDEsCit9OworCiAvKiBTdHJ1Y3R1cmUgbmVlZGVkIHRvIHJlZ2lzdGVyIHdpdGggcHJpbnRrICovCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2NscF92dDIyMF9jb25zb2xlID0KIHsKIAkubmFtZSA9IFNDTFBfVlQyMjBfQ09OU09MRV9OQU1FLAogCS53cml0ZSA9IHNjbHBfdnQyMjBfY29uX3dyaXRlLAogCS5kZXZpY2UgPSBzY2xwX3Z0MjIwX2Nvbl9kZXZpY2UsCi0JLnVuYmxhbmsgPSBzY2xwX3Z0MjIwX2Nvbl91bmJsYW5rLAogCS5mbGFncyA9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXggPSBTQ0xQX1ZUMjIwX0NPTlNPTEVfSU5ERVgKIH07CkBAIC03NzYsNiArNzg0LDggQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAkvKiBBdHRhY2ggbGludXggY29uc29sZSAqLworCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJm9uX3BhbmljX25iKTsKKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm9uX3JlYm9vdF9uYik7CiAJcmVnaXN0ZXJfY29uc29sZSgmc2NscF92dDIyMF9jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggODM5OTg3Ni4uNDAwNWM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTkxMCw3ICs5MTAsNyBAQAogCSAqIHNob3VsZCBwcm9jZWVkIHdpdGggdGhlIG5ldyB0YXBlLi4uIHRoaXMKIAkgKiBzaG91bGQgcHJvYmFibHkgYmUgZG9uZSBpbiB1c2VyIHNwYWNlIQogCSAqLwotCVBSSU5UX1dBUk4oIiglcyk6IFN3YXAgVGFwZSBEZXZpY2UhXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCVBSSU5UX1dBUk4oIiglcyk6IFN3YXAgVGFwZSBEZXZpY2UhXG4iLCBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAlyZXR1cm4gdGFwZV8zNTkwX2VycF9iYXNpYyhkZXZpY2UsIHJlcXVlc3QsIGlyYiwgLUVJTyk7CiB9CiAKQEAgLTEwMDMsNDAgKzEwMDMsNDMgQEAKIAkvKiBFeGNlcHRpb24gTWVzc2FnZSAqLwogCXN3aXRjaCAoc2Vuc2UtPmZtdC5mNzAuZW1jKSB7CiAJY2FzZSAweDAyOgotCQlQUklOVF9XQVJOKCIoJXMpOiBEYXRhIGRlZ3JhZGVkXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQlQUklOVF9XQVJOKCIoJXMpOiBEYXRhIGRlZ3JhZGVkXG4iLAorCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWJyZWFrOwogCWNhc2UgMHgwMzoKIAkJUFJJTlRfV0FSTigiKCVzKTogRGF0YSBkZWdyYWRlZCBpbiBwYXJ0aW9uICVpXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MC5tcCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MC5tcCk7CiAJCWJyZWFrOwogCWNhc2UgMHgwNDoKLQkJUFJJTlRfV0FSTigiKCVzKTogTWVkaXVtIGRlZ3JhZGVkXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQlQUklOVF9XQVJOKCIoJXMpOiBNZWRpdW0gZGVncmFkZWRcbiIsCisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA1OgogCQlQUklOVF9XQVJOKCIoJXMpOiBNZWRpdW0gZGVncmFkZWQgaW4gcGFydGl0aW9uICVpXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MC5tcCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MC5tcCk7CiAJCWJyZWFrOwogCWNhc2UgMHgwNjoKLQkJUFJJTlRfV0FSTigiKCVzKTogQmxvY2sgMCBFcnJvclxuIiwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJUFJJTlRfV0FSTigiKCVzKTogQmxvY2sgMCBFcnJvclxuIiwKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAljYXNlIDB4MDc6CiAJCVBSSU5UX1dBUk4oIiglcyk6IE1lZGl1bSBFeGNlcHRpb24gMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MC5tZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MC5tZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBSSU5UX1dBUk4oIiglcyk6IE1JTSBFeE1zZzogMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MC5lbWMpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzAuZW1jKTsKIAkJYnJlYWs7CiAJfQogCS8qIFNlcnZpY2UgTWVzc2FnZSAqLwogCXN3aXRjaCAoc2Vuc2UtPmZtdC5mNzAuc21jKSB7CiAJY2FzZSAweDAyOgogCQlQUklOVF9XQVJOKCIoJXMpOiBSZWZlcmVuY2UgTWVkaWEgbWFpbnRlbmFuY2UgcHJvY2VkdXJlICVpXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MC5tZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MC5tZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBSSU5UX1dBUk4oIiglcyk6IE1JTSBTZXJ2aWNlTXNnOiAweCUwMnhcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIHNlbnNlLT5mbXQuZjcwLnNtYyk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MC5zbWMpOwogCQlicmVhazsKIAl9CiB9CkBAIC0xMDU0LDEwMSArMTA1NywxMDEgQEAKIAlzd2l0Y2ggKHNlbnNlLT5mbXQuZjcxLmVtYykgewogCWNhc2UgMHgwMToKIAkJUFJJTlRfV0FSTigiKCVzKTogRWZmZWN0IG9mIGZhaWx1cmUgaXMgdW5rbm93blxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDAyOgogCQlQUklOVF9XQVJOKCIoJXMpOiBDVSBFeGNlcHRpb24gLSBubyBwZXJmb3JtYW5jZSBpbXBhY3RcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWJyZWFrOwogCWNhc2UgMHgwMzoKIAkJUFJJTlRfV0FSTigiKCVzKTogQ1UgRXhjZXB0aW9uIG9uIGNoYW5uZWwgaW50ZXJmYWNlIDB4JTAyeFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOwogCQlicmVhazsKIAljYXNlIDB4MDQ6CiAJCVBSSU5UX1dBUk4oIiglcyk6IENVIEV4Y2VwdGlvbiBvbiBkZXZpY2UgcGF0aCAweCUwMnhcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIHNlbnNlLT5mbXQuZjcxLm1kWzBdKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksIHNlbnNlLT5mbXQuZjcxLm1kWzBdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA1OgogCQlQUklOVF9XQVJOKCIoJXMpOiBDVSBFeGNlcHRpb24gb24gbGlicmFyeSBwYXRoIDB4JTAyeFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOwogCQlicmVhazsKIAljYXNlIDB4MDY6CiAJCVBSSU5UX1dBUk4oIiglcyk6IENVIEV4Y2VwdGlvbiBvbiBub2RlIDB4JTAyeFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOwogCQlicmVhazsKIAljYXNlIDB4MDc6CiAJCVBSSU5UX1dBUk4oIiglcyk6IENVIEV4Y2VwdGlvbiBvbiBwYXJ0aXRpb24gMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MS5tZFswXSk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MS5tZFswXSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBSSU5UX1dBUk4oIiglcyk6IFNJTSBFeE1zZzogMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MS5lbWMpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEuZW1jKTsKIAl9CiAJLyogU2VydmljZSBNZXNzYWdlICovCiAJc3dpdGNoIChzZW5zZS0+Zm10LmY3MS5zbWMpIHsKIAljYXNlIDB4MDE6CiAJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciBpbXBhY3QgaXMgdW5rbm93blxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDAyOgogCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBub3QgaW1wYWN0IGN1IHBlcmZvcm1hbmNlXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAljYXNlIDB4MDM6CiAJCWlmIChzZW5zZS0+Zm10LmY3MS5tZGYgPT0gMCkKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgbm9kZSAiCiAJCQkJICAgIjB4JXggb24gQ1VcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0pOwogCQllbHNlCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIG5vZGVzICIKIAkJCQkgICAiKDB4JXgtMHgleCkgb24gQ1VcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0sIHNlbnNlLT5mbXQuZjcxLm1kWzJdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA0OgogCQlpZiAoc2Vuc2UtPmZtdC5mNzEubWRmID09IDApCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGNhbm5lbCBwYXRoICIKIAkJCQkgICAiMHgleCBvbiBDVVxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSk7CiAJCWVsc2UKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgY2FubmVsIHBhdGhzICIKIAkJCQkgICAiKDB4JXgtMHgleCkgb24gQ1VcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0sIHNlbnNlLT5mbXQuZjcxLm1kWzJdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA1OgogCQlpZiAoc2Vuc2UtPmZtdC5mNzEubWRmID09IDApCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGRldmljZSBwYXRoICIKIAkJCQkgICAiMHgleCBvbiBDVVxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSk7CiAJCWVsc2UKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgZGV2aWNlIHBhdGhzICIKIAkJCQkgICAiKDB4JXgtMHgleCkgb24gQ1VcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0sIHNlbnNlLT5mbXQuZjcxLm1kWzJdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA2OgogCQlpZiAoc2Vuc2UtPmZtdC5mNzEubWRmID09IDApCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGxpYnJhcnkgcGF0aCAiCiAJCQkJICAgIjB4JXggb24gQ1VcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0pOwogCQllbHNlCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGxpYnJhcnkgcGF0aHMgIgogCQkJCSAgICIoMHgleC0weCV4KSBvbiBDVVxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSwgc2Vuc2UtPmZtdC5mNzEubWRbMl0pOwogCQlicmVhazsKIAljYXNlIDB4MDc6CiAJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgYWNjZXNzIHRvIENVXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlQUklOVF9XQVJOKCIoJXMpOiBTSU0gU2VydmljZU1zZzogMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MS5zbWMpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEuc21jKTsKIAl9CiB9CiAKQEAgLTExNjUsMTA0ICsxMTY4LDEwNCBAQAogCXN3aXRjaCAoc2Vuc2UtPmZtdC5mNzEuZW1jKSB7CiAJY2FzZSAweDAxOgogCQlQUklOVF9XQVJOKCIoJXMpOiBFZmZlY3Qgb2YgZmFpbHVyZSBpcyB1bmtub3duXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAljYXNlIDB4MDI6CiAJCVBSSU5UX1dBUk4oIiglcyk6IERWIEV4Y2VwdGlvbiAtIG5vIHBlcmZvcm1hbmNlIGltcGFjdFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDAzOgogCQlQUklOVF9XQVJOKCIoJXMpOiBEViBFeGNlcHRpb24gb24gY2hhbm5lbCBpbnRlcmZhY2UgMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MS5tZFswXSk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MS5tZFswXSk7CiAJCWJyZWFrOwogCWNhc2UgMHgwNDoKIAkJUFJJTlRfV0FSTigiKCVzKTogRFYgRXhjZXB0aW9uIG9uIGxvYWRlciAweCUwMnhcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIHNlbnNlLT5mbXQuZjcxLm1kWzBdKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksIHNlbnNlLT5mbXQuZjcxLm1kWzBdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA1OgogCQlQUklOVF9XQVJOKCIoJXMpOiBEViBFeGNlcHRpb24gb24gbWVzc2FnZSBkaXNwbGF5IDB4JTAyeFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEubWRbMF0pOwogCQlicmVhazsKIAljYXNlIDB4MDY6CiAJCVBSSU5UX1dBUk4oIiglcyk6IERWIEV4Y2VwdGlvbiBpbiB0YXBlIHBhdGhcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWJyZWFrOwogCWNhc2UgMHgwNzoKIAkJUFJJTlRfV0FSTigiKCVzKTogRFYgRXhjZXB0aW9uIGluIGRyaXZlXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlQUklOVF9XQVJOKCIoJXMpOiBEU0lNIEV4TXNnOiAweCUwMnhcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIHNlbnNlLT5mbXQuZjcxLmVtYyk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+Zm10LmY3MS5lbWMpOwogCX0KIAkvKiBTZXJ2aWNlIE1lc3NhZ2UgKi8KIAlzd2l0Y2ggKHNlbnNlLT5mbXQuZjcxLnNtYykgewogCWNhc2UgMHgwMToKIAkJUFJJTlRfV0FSTigiKCVzKTogUmVwYWlyIGltcGFjdCBpcyB1bmtub3duXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAljYXNlIDB4MDI6CiAJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIG5vdCBpbXBhY3QgZGV2aWNlIHBlcmZvcm1hbmNlXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlicmVhazsKIAljYXNlIDB4MDM6CiAJCWlmIChzZW5zZS0+Zm10LmY3MS5tZGYgPT0gMCkKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgY2hhbm5lbCBwYXRoICIKIAkJCQkgICAiMHgleCBvbiBEVlxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSk7CiAJCWVsc2UKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgY2hhbm5lbCBwYXRoICIKIAkJCQkgICAiKDB4JXgtMHgleCkgb24gRFZcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0sIHNlbnNlLT5mbXQuZjcxLm1kWzJdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA0OgogCQlpZiAoc2Vuc2UtPmZtdC5mNzEubWRmID09IDApCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGludGVyZmFjZSAweCV4ICIKIAkJCQkgICAib24gRFZcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0pOwogCQllbHNlCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGludGVyZmFjZXMgIgogCQkJCSAgICIoMHgleC0weCV4KSBvbiBEVlxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSwgc2Vuc2UtPmZtdC5mNzEubWRbMl0pOwogCQlicmVhazsKIAljYXNlIDB4MDU6CiAJCWlmIChzZW5zZS0+Zm10LmY3MS5tZGYgPT0gMCkKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgbG9hZGVyIDB4JXggIgogCQkJCSAgICJvbiBEVlxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSk7CiAJCWVsc2UKIAkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcGFpciB3aWxsIGRpc2FibGUgbG9hZGVyICIKIAkJCQkgICAiKDB4JXgtMHgleCkgb24gRFZcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0sIHNlbnNlLT5mbXQuZjcxLm1kWzJdKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA3OgogCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIGFjY2VzcyB0byBEVlxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA4OgogCQlpZiAoc2Vuc2UtPmZtdC5mNzEubWRmID09IDApCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIG1lc3NhZ2UgIgogCQkJCSAgICJkaXNwbGF5IDB4JXggb24gRFZcbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgc2Vuc2UtPmZtdC5mNzEubWRbMV0pOwogCQllbHNlCiAJCQlQUklOVF9XQVJOKCIoJXMpOiBSZXBhaXIgd2lsbCBkaXNhYmxlIG1lc3NhZ2UgIgogCQkJCSAgICJkaXNwbGF5cyAoMHgleC0weCV4KSBvbiBEVlxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsCisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCQkgICBzZW5zZS0+Zm10LmY3MS5tZFsxXSwgc2Vuc2UtPmZtdC5mNzEubWRbMl0pOwogCQlicmVhazsKIAljYXNlIDB4MDk6Ci0JCVBSSU5UX1dBUk4oIiglcyk6IENsZWFuIERWXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQlQUklOVF9XQVJOKCIoJXMpOiBDbGVhbiBEVlxuIiwgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBSSU5UX1dBUk4oIiglcyk6IERTSU0gU2VydmljZU1zZzogMHglMDJ4XG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+Zm10LmY3MS5zbWMpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEuc21jKTsKIAl9CiB9CiAKQEAgLTEyNzksMTggKzEyODIsMTggQEAKIAkJcmV0dXJuOwogCWlmICgoc2Vuc2UtPm1jID4gMCkgJiYgKHNlbnNlLT5tYyA8IFRBUEVfMzU5MF9NQVhfTVNHKSkgewogCQlpZiAodGFwZV8zNTkwX21zZ1tzZW5zZS0+bWNdICE9IE5VTEwpCi0JCQlQUklOVF9XQVJOKCIoJXMpOiAlc1xuIiwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLAorCQkJUFJJTlRfV0FSTigiKCVzKTogJXNcbiIsIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldiksCiAJCQkJICAgdGFwZV8zNTkwX21zZ1tzZW5zZS0+bWNdKTsKIAkJZWxzZSB7CiAJCQlQUklOVF9XQVJOKCIoJXMpOiBNZXNzYWdlIENvZGUgMHgleFxuIiwKLQkJCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIHNlbnNlLT5tYyk7CisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPm1jKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCWlmIChzZW5zZS0+bWMgPT0gMHhmMCkgewogCQkvKiBTdGFuZGFyZCBNZWRpYSBJbmZvcm1hdGlvbiBNZXNzYWdlICovCiAJCVBSSU5UX1dBUk4oIiglcyk6IE1JTSBTRVY9JWksIE1DPSUwMngsIEVTPSV4LyV4LCAiCi0JCQkgICAiUkM9JTAyeC0lMDR4LSUwMnhcbiIsIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwKKwkJCSAgICJSQz0lMDJ4LSUwNHgtJTAyeFxuIiwgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwKIAkJCSAgIHNlbnNlLT5mbXQuZjcwLnNldiwgc2Vuc2UtPm1jLAogCQkJICAgc2Vuc2UtPmZtdC5mNzAuZW1jLCBzZW5zZS0+Zm10LmY3MC5zbWMsCiAJCQkgICBzZW5zZS0+Zm10LmY3MC5yZWZjb2RlLCBzZW5zZS0+Zm10LmY3MC5taWQsCkBAIC0xMzAyLDcgKzEzMDUsNyBAQAogCQkvKiBTdGFuZGFyZCBJL08gU3Vic3lzdGVtIFNlcnZpY2UgSW5mb3JtYXRpb24gTWVzc2FnZSAqLwogCQlQUklOVF9XQVJOKCIoJXMpOiBJT1NJTSBTRVY9JWksIERFVlRZUEU9MzU5MC8lMDJ4LCAiCiAJCQkgICAiTUM9JTAyeCwgRVM9JXgvJXgsIFJFRj0weCUwNHgtMHglMDR4LTB4JTA0eFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEuc2V2LAorCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEuc2V2LAogCQkJICAgZGV2aWNlLT5jZGV2LT5pZC5kZXZfbW9kZWwsCiAJCQkgICBzZW5zZS0+bWMsIHNlbnNlLT5mbXQuZjcxLmVtYywKIAkJCSAgIHNlbnNlLT5mbXQuZjcxLnNtYywgc2Vuc2UtPmZtdC5mNzEucmVmY29kZTEsCkBAIC0xMzE0LDcgKzEzMTcsNyBAQAogCQkvKiBTdGFuZGFyZCBEZXZpY2UgU2VydmljZSBJbmZvcm1hdGlvbiBNZXNzYWdlICovCiAJCVBSSU5UX1dBUk4oIiglcyk6IERFVlNJTSBTRVY9JWksIERFVlRZUEU9MzU5MC8lMDJ4LCAiCiAJCQkgICAiTUM9JTAyeCwgRVM9JXgvJXgsIFJFRj0weCUwNHgtMHglMDR4LTB4JTA0eFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCwgc2Vuc2UtPmZtdC5mNzEuc2V2LAorCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSwgc2Vuc2UtPmZtdC5mNzEuc2V2LAogCQkJICAgZGV2aWNlLT5jZGV2LT5pZC5kZXZfbW9kZWwsCiAJCQkgICBzZW5zZS0+bWMsIHNlbnNlLT5mbXQuZjcxLmVtYywKIAkJCSAgIHNlbnNlLT5mbXQuZjcxLnNtYywgc2Vuc2UtPmZtdC5mNzEucmVmY29kZTEsCkBAIC0xMzI3LDcgKzEzMzAsNyBAQAogCQlyZXR1cm47CiAJfQogCVBSSU5UX1dBUk4oIiglcyk6IERldmljZSBNZXNzYWdlKCV4KVxuIiwKLQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCBzZW5zZS0+bWMpOworCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCBzZW5zZS0+bWMpOwogfQogCiBzdGF0aWMgaW50IHRhcGVfMzU5MF9jcnlwdF9lcnJvcihzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSwKQEAgLTEzMzYsMTAgKzEzMzksMTEgQEAKIAl1OCBjdV9yYywgZWttX3JjMTsKIAl1MTYgZWttX3JjMjsKIAl1MzIgZHJ2X3JjOwotCWNoYXIgKmJ1c19pZCwgKnNlbnNlOworCWNvbnN0IGNoYXIgKmJ1c19pZDsKKwljaGFyICpzZW5zZTsKIAogCXNlbnNlID0gKChzdHJ1Y3QgdGFwZV8zNTkwX3NlbnNlICopIGlyYi0+ZWN3KS0+Zm10LmRhdGE7Ci0JYnVzX2lkID0gZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkOworCWJ1c19pZCA9IGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldik7CiAJY3VfcmMgPSBzZW5zZVswXTsKIAlkcnZfcmMgPSAqKCh1MzIqKSAmc2Vuc2VbNV0pICYgMHhmZmZmZmY7CiAJZWttX3JjMSA9IHNlbnNlWzldOwpAQCAtMTQ0MCw3ICsxNDQ0LDcgQEAKIAkJICogImRldmljZSBpbnRlcnZlbnRpb24iIGlzIG5vdCB2ZXJ5IG1lYW5pbmdmdWxsCiAJCSAqLwogCQlQUklOVF9XQVJOKCIoJXMpOiBUYXBlIG9wZXJhdGlvbiB3aGVuIG1lZGl1bSBub3QgbG9hZGVkXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQl0YXBlX21lZF9zdGF0ZV9zZXQoZGV2aWNlLCBNU19VTkxPQURFRCk7CiAJCXRhcGVfMzU5MF9zY2hlZHVsZV93b3JrKGRldmljZSwgVE9fQ1JZUFRfT0ZGKTsKIAkJcmV0dXJuIHRhcGVfMzU5MF9lcnBfYmFzaWMoZGV2aWNlLCByZXF1ZXN0LCBpcmIsIC1FTk9NRURJVU0pOwpAQCAtMTQ4NywxOCArMTQ5MSwxOCBAQAogCiAJY2FzZSAweDYwMjA6CiAJCVBSSU5UX1dBUk4oIiglcyk6IENhcnRyaWRnZSBvZiB3cm9uZyB0eXBlID9cbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCXJldHVybiB0YXBlXzM1OTBfZXJwX2Jhc2ljKGRldmljZSwgcmVxdWVzdCwgaXJiLCAtRU1FRElVTVRZUEUpOwogCiAJY2FzZSAweDgwMTE6CiAJCVBSSU5UX1dBUk4oIiglcyk6IEFub3RoZXIgaG9zdCBoYXMgcmVzZXJ2ZWQgdGhlIHRhcGUgZGV2aWNlXG4iLAotCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlyZXR1cm4gdGFwZV8zNTkwX2VycF9iYXNpYyhkZXZpY2UsIHJlcXVlc3QsIGlyYiwgLUVQRVJNKTsKIAljYXNlIDB4ODAxMzoKIAkJUFJJTlRfV0FSTigiKCVzKTogQW5vdGhlciBob3N0IGhhcyBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgIgotCQkJICAgInRhcGUgZGV2aWNlXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgInRhcGUgZGV2aWNlXG4iLCBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJUFJJTlRfV0FSTigiKCVzKTogVG8gc29sdmUgdGhlIHByb2JsZW0gdW5sb2FkIHRoZSBjdXJyZW50ICIKLQkJCSAgICJjYXJ0cmlkZ2UhXG4iLCBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgImNhcnRyaWRnZSFcbiIsIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlyZXR1cm4gdGFwZV8zNTkwX2VycF9iYXNpYyhkZXZpY2UsIHJlcXVlc3QsIGlyYiwgLUVQRVJNKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gdGFwZV8zNTkwX2VycF9iYXNpYyhkZXZpY2UsIHJlcXVlc3QsIGlyYiwgLUVJTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKaW5kZXggOTVkYTcyYi4uYTI1YjhiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAKIAlpZiAoIWRldmljZS0+YmxrX2RhdGEuZGlzaykgewogCQlQUklOVF9FUlIoIiglcyk6IE5vIGdlbmRpc2sgdG8gY2xlYW4gdXAhXG4iLAotCQkJZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlnb3RvIGNsZWFudXBfcXVldWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmMKaW5kZXggMTJjMmE1YS4uZGRjOTE0Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2xhc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmMKQEAgLTY5LDkgKzY5LDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gZmFpbF93aXRoX2NkZXY7CiAKLQl0Y2QtPmNsYXNzX2RldmljZSA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YSh0YXBlX2NsYXNzLCBkZXZpY2UsCi0JCQkJCQkgIHRjZC0+Y2hhcl9kZXZpY2UtPmRldiwKLQkJCQkJCSAgTlVMTCwgIiVzIiwgdGNkLT5kZXZpY2VfbmFtZSk7CisJdGNkLT5jbGFzc19kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKHRhcGVfY2xhc3MsIGRldmljZSwKKwkJCQkJICB0Y2QtPmNoYXJfZGV2aWNlLT5kZXYsIE5VTEwsCisJCQkJCSAgIiVzIiwgdGNkLT5kZXZpY2VfbmFtZSk7CiAJcmMgPSBJU19FUlIodGNkLT5jbGFzc19kZXZpY2UpID8gUFRSX0VSUih0Y2QtPmNsYXNzX2RldmljZSkgOiAwOwogCWlmIChyYykKIAkJZ290byBmYWlsX3dpdGhfY2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKaW5kZXggMTgxYTU0NC4uZDcwNzNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKQEAgLTIxNSwxMiArMjE1LDEyIEBACiAJY2FzZSBNU19VTkxPQURFRDoKIAkJZGV2aWNlLT50YXBlX2dlbmVyaWNfc3RhdHVzIHw9IEdNVF9EUl9PUEVOKH4wKTsKIAkJUFJJTlRfSU5GTygiKCVzKTogVGFwZSBpcyB1bmxvYWRlZFxuIiwKLQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSBNU19MT0FERUQ6CiAJCWRldmljZS0+dGFwZV9nZW5lcmljX3N0YXR1cyAmPSB+R01UX0RSX09QRU4ofjApOwogCQlQUklOVF9JTkZPKCIoJXMpOiBUYXBlIGhhcyBiZWVuIG1vdW50ZWRcbiIsCi0JCQkgICBkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQpOworCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8vIHByaW50IG5vdGhpbmcKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQkJCWRldmljZS0+Y2Rldl9pZCk7CiAJCQlQUklOVF9XQVJOKCIoJXMpOiBTZXQgb2ZmbGluZSBmYWlsZWQgIgogCQkJCSItIGRyaXZlIGluIHVzZS5cbiIsCi0JCQkJZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJCXNwaW5fdW5sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soZGV2aWNlLT5jZGV2KSk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTUzOCw3ICs1MzgsOCBAQAogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2Rldi0+ZGV2LmtvYmosICZ0YXBlX2F0dHJfZ3JvdXApOwogCWlmIChyZXQpIHsKIAkJdGFwZV9wdXRfZGV2aWNlKGRldmljZSk7Ci0JCVBSSU5UX0VSUigicHJvYmUgZmFpbGVkIGZvciB0YXBlIGRldmljZSAlc1xuIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCVBSSU5UX0VSUigicHJvYmUgZmFpbGVkIGZvciB0YXBlIGRldmljZSAlc1xuIiwKKwkJCSAgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlyZXR1cm4gcmV0OwogCX0KIAljZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBkZXZpY2U7CkBAIC01NDYsNyArNTQ3LDcgQEAKIAlkZXZpY2UtPmNkZXYgPSBjZGV2OwogCWNjd19kZXZpY2VfZ2V0X2lkKGNkZXYsICZkZXZfaWQpOwogCWRldmljZS0+Y2Rldl9pZCA9IGRldmlkX3RvX2ludCgmZGV2X2lkKTsKLQlQUklOVF9JTkZPKCJ0YXBlIGRldmljZSAlcyBmb3VuZFxuIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJUFJJTlRfSU5GTygidGFwZSBkZXZpY2UgJXMgZm91bmRcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MTYsNyArNjE3LDcgQEAKIAkJCQlkZXZpY2UtPmNkZXZfaWQpOwogCQkJUFJJTlRfV0FSTigiKCVzKTogRHJpdmUgaW4gdXNlIHZhbmlzaGVkIC0gIgogCQkJCSJleHBlY3QgdHJvdWJsZSFcbiIsCi0JCQkJZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJCVBSSU5UX1dBUk4oIlN0YXRlIHdhcyAlaVxuIiwgZGV2aWNlLT50YXBlX3N0YXRlKTsKIAkJCXRhcGVfc3RhdGVfc2V0KGRldmljZSwgVFNfTk9UX09QRVIpOwogCQkJX190YXBlX2Rpc2NhcmRfcmVxdWVzdHMoZGV2aWNlKTsKQEAgLTg0MCw3ICs4NDEsNyBAQAogCVBSSU5UX0lORk8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCVBSSU5UX0lORk8oIkRTVEFUIDogJTAyeCAgQ1NUQVQ6ICUwMngJQ1BBOiAlMDR4XG4iLAogCQkgICBpcmItPnNjc3cuY21kLmRzdGF0LCBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmNwYSk7Ci0JUFJJTlRfSU5GTygiREVWSUNFOiAlc1xuIiwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwlQUklOVF9JTkZPKCJERVZJQ0U6ICVzXG4iLCBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAlpZiAocmVxdWVzdCAhPSBOVUxMKQogCQlQUklOVF9JTkZPKCJPUAkgIDogJXNcbiIsIHRhcGVfb3BfdmVyYm9zZVtyZXF1ZXN0LT5vcF0pOwogCkBAIC0xMDUxLDcgKzEwNTIsNyBAQAogCWRldmljZSA9IChzdHJ1Y3QgdGFwZV9kZXZpY2UgKikgY2Rldi0+ZGV2LmRyaXZlcl9kYXRhOwogCWlmIChkZXZpY2UgPT0gTlVMTCkgewogCQlQUklOVF9FUlIoImNvdWxkIG5vdCBnZXQgZGV2aWNlIHN0cnVjdHVyZSBmb3IgJXMgIgotCQkJICAiaW4gaW50ZXJydXB0XG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgImluIGludGVycnVwdFxuIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlyZXR1cm47CiAJfQogCXJlcXVlc3QgPSAoc3RydWN0IHRhcGVfcmVxdWVzdCAqKSBpbnRwYXJtOwpAQCAtMTA2NCwxMyArMTA2NSwxMyBAQAogCQlzd2l0Y2ggKFBUUl9FUlIoaXJiKSkgewogCQkJY2FzZSAtRVRJTUVET1VUOgogCQkJCVBSSU5UX1dBUk4oIiglcyk6IFJlcXVlc3QgdGltZWQgb3V0XG4iLAotCQkJCQljZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQkJZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQkJY2FzZSAtRUlPOgogCQkJCV9fdGFwZV9lbmRfcmVxdWVzdChkZXZpY2UsIHJlcXVlc3QsIC1FSU8pOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlQUklOVF9FUlIoIiglcyk6IFVuZXhwZWN0ZWQgaS9vIGVycm9yICVsaVxuIiwKLQkJCQkJY2Rldi0+ZGV2LmJ1c19pZCwKKwkJCQkJZGV2X25hbWUoJmNkZXYtPmRldiksCiAJCQkJCVBUUl9FUlIoaXJiKSk7CiAJCX0KIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3Byb2MuYwppbmRleCBlN2M4ODhjLi44YTM3NmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3Byb2MuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3Byb2MuYwpAQCAtNTIsNyArNTIsNyBAQAogCQlyZXR1cm4gMDsKIAlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpKTsKIAlzZXFfcHJpbnRmKG0sICIlZFx0IiwgKGludCkgbik7Ci0Jc2VxX3ByaW50ZihtLCAiJS0xMC4xMHMgIiwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwlzZXFfcHJpbnRmKG0sICIlLTEwLjEwcyAiLCBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAlzZXFfcHJpbnRmKG0sICIlMDRYLyIsIGRldmljZS0+Y2Rldi0+aWQuY3VfdHlwZSk7CiAJc2VxX3ByaW50ZihtLCAiJTAyWFx0IiwgZGV2aWNlLT5jZGV2LT5pZC5jdV9tb2RlbCk7CiAJc2VxX3ByaW50ZihtLCAiJTA0WC8iLCBkZXZpY2UtPmNkZXYtPmlkLmRldl90eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfc3RkLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3N0ZC5jCmluZGV4IGNjOGZkNzgxLi41YmQ1NzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3N0ZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfc3RkLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlyYyA9IHRhcGVfY2FuY2VsX2lvKGRldmljZSwgcmVxdWVzdCk7CiAJaWYocmMpCiAJCVBSSU5UX0VSUigiKCVzKTogQXNzaWduIHRpbWVvdXQ6IENhbmNlbCBmYWlsZWQgd2l0aCByYyA9ICVpXG4iLAotCQkJZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCByYyk7CisJCQlkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpLCByYyk7CiAKIH0KIApAQCAtODMsNyArODMsNyBAQAogCiAJaWYgKHJjICE9IDApIHsKIAkJUFJJTlRfV0FSTigiJXM6IGFzc2lnbiBmYWlsZWQgLSBkZXZpY2UgbWlnaHQgYmUgYnVzeVxuIiwKLQkJCWRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQlkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJREJGX0VWRU5UKDMsICIlMDh4OiBhc3NpZ24gZmFpbGVkIC0gZGV2aWNlIG1pZ2h0IGJlIGJ1c3lcbiIsCiAJCQlkZXZpY2UtPmNkZXZfaWQpOwogCX0gZWxzZSB7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAkJREJGX0VWRU5UKDMsICIoJTA4eCk6IENhbid0IHVuYXNzaWduIGRldmljZVxuIiwKIAkJCWRldmljZS0+Y2Rldl9pZCk7CiAJCVBSSU5UX1dBUk4oIiglcyk6IENhbid0IHVuYXNzaWduIGRldmljZSAtIGRldmljZSBnb25lXG4iLAotCQkJZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTEyMCw3ICsxMjAsOCBAQAogCiAJaWYgKChyYyA9IHRhcGVfZG9faW8oZGV2aWNlLCByZXF1ZXN0KSkgIT0gMCkgewogCQlEQkZfRVZFTlQoMywgIiUwOHg6IFVuYXNzaWduIGZhaWxlZFxuIiwgZGV2aWNlLT5jZGV2X2lkKTsKLQkJUFJJTlRfV0FSTigiJXM6IFVuYXNzaWduIGZhaWxlZFxuIiwgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJUFJJTlRfV0FSTigiJXM6IFVuYXNzaWduIGZhaWxlZFxuIiwKKwkJCSAgIGRldl9uYW1lKCZkZXZpY2UtPmNkZXYtPmRldikpOwogCX0gZWxzZSB7CiAJCURCRl9FVkVOVCgzLCAiJTA4eDogVGFwZSB1bmFzc2lnbmVkXG4iLCBkZXZpY2UtPmNkZXZfaWQpOwogCX0KQEAgLTYzNCwxMCArNjM1LDEwIEBACiAJCURCRl9FWENFUFRJT04oNiwgInhjb20gcGFybVxuIik7CiAJCWlmICgqZGV2aWNlLT5tb2Rlc2V0X2J5dGUgJiAweDA4KQogCQkJUFJJTlRfSU5GTygiKCVzKSBDb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgb25cbiIsCi0JCQkJICAgZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQkgICBkZXZfbmFtZSgmZGV2aWNlLT5jZGV2LT5kZXYpKTsKIAkJZWxzZQogCQkJUFJJTlRfSU5GTygiKCVzKSBDb21wcmVzc2lvbiBpcyBjdXJyZW50bHkgb2ZmXG4iLAotCQkJCSAgIGRldmljZS0+Y2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkJICAgZGV2X25hbWUoJmRldmljZS0+Y2Rldi0+ZGV2KSk7CiAJCVBSSU5UX0lORk8oIlVzZSAxIHRvIHN3aXRjaCBjb21wcmVzc2lvbiBvbiwgMCB0byAiCiAJCQkgICAic3dpdGNoIGl0IG9mZlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKaW5kZXggYzMxZmFlZi4uMjQ3NjI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCkBAIC03MjQsOCArNzI0LDcgQEAKIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2KSB7Ci0JCXNucHJpbnRmKGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwKLQkJCSBwcml2LT5pbnRlcm5hbF9uYW1lKTsKKwkJZGV2X3NldF9uYW1lKGRldiwgcHJpdi0+aW50ZXJuYWxfbmFtZSk7CiAJCWRldi0+YnVzID0gJml1Y3ZfYnVzOwogCQlkZXYtPnBhcmVudCA9IGl1Y3Zfcm9vdDsKIAkJZGV2LT5kcml2ZXIgPSAmdm1sb2dyZHJfZHJpdmVyOwpAQCAtNzQ4LDEwICs3NDcsMTAgQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JcHJpdi0+Y2xhc3NfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHZtbG9ncmRyX2NsYXNzLCBkZXYsCi0JCQkJCQkgICBNS0RFVih2bWxvZ3Jkcl9tYWpvciwKLQkJCQkJCQkgcHJpdi0+bWlub3JfbnVtKSwKLQkJCQkJCSAgIHByaXYsICIlcyIsIGRldi0+YnVzX2lkKTsKKwlwcml2LT5jbGFzc19kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKHZtbG9ncmRyX2NsYXNzLCBkZXYsCisJCQkJCSAgIE1LREVWKHZtbG9ncmRyX21ham9yLAorCQkJCQkJIHByaXYtPm1pbm9yX251bSksCisJCQkJCSAgIHByaXYsICIlcyIsIGRldl9uYW1lKGRldikpOwogCWlmIChJU19FUlIocHJpdi0+Y2xhc3NfZGV2aWNlKSkgewogCQlyZXQgPSBQVFJfRVJSKHByaXYtPmNsYXNzX2RldmljZSk7CiAJCXByaXYtPmNsYXNzX2RldmljZT1OVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCmluZGV4IGMxZjM1MmIuLjkwMjBlYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKQEAgLTg4NiwxOSArODg2LDE4IEBACiAJCWdvdG8gZmFpbF9mcmVlX2NkZXY7CiAJaWYgKHVyZC0+Y2Rldi0+aWQuY3VfdHlwZSA9PSBSRUFERVJfUFVOQ0hfREVWVFlQRSkgewogCQlpZiAodXJkLT5jbGFzcyA9PSBERVZfQ0xBU1NfVVJfSSkKLQkJCXNwcmludGYobm9kZV9pZCwgInZtcmRyLSVzIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQlzcHJpbnRmKG5vZGVfaWQsICJ2bXJkci0lcyIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJaWYgKHVyZC0+Y2xhc3MgPT0gREVWX0NMQVNTX1VSX08pCi0JCQlzcHJpbnRmKG5vZGVfaWQsICJ2bXB1bi0lcyIsIGNkZXYtPmRldi5idXNfaWQpOworCQkJc3ByaW50Zihub2RlX2lkLCAidm1wdW4tJXMiLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJfSBlbHNlIGlmICh1cmQtPmNkZXYtPmlkLmN1X3R5cGUgPT0gUFJJTlRFUl9ERVZUWVBFKSB7Ci0JCXNwcmludGYobm9kZV9pZCwgInZtcHJ0LSVzIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCXNwcmludGYobm9kZV9pZCwgInZtcHJ0LSVzIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCX0gZWxzZSB7CiAJCXJjID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZmFpbF9mcmVlX2NkZXY7CiAJfQogCi0JdXJkLT5kZXZpY2UgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodm11cl9jbGFzcywgTlVMTCwKLQkJCQkJICAgIHVyZC0+Y2hhcl9kZXZpY2UtPmRldiwgTlVMTCwKLQkJCQkJICAgICIlcyIsIG5vZGVfaWQpOworCXVyZC0+ZGV2aWNlID0gZGV2aWNlX2NyZWF0ZSh2bXVyX2NsYXNzLCBOVUxMLCB1cmQtPmNoYXJfZGV2aWNlLT5kZXYsCisJCQkJICAgIE5VTEwsICIlcyIsIG5vZGVfaWQpOwogCWlmIChJU19FUlIodXJkLT5kZXZpY2UpKSB7CiAJCXJjID0gUFRSX0VSUih1cmQtPmRldmljZSk7CiAJCVRSQUNFKCJ1cl9zZXRfb25saW5lOiBkZXZpY2VfY3JlYXRlIHJjPSVkXG4iLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYwppbmRleCAwYmZjYmJlLi4yZjU0N2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJjaW8uaCIKICNpbmNsdWRlICJjaW9fZGVidWcuaCIKICNpbmNsdWRlICJjc3MuaCIKKyNpbmNsdWRlICJkZXZpY2UuaCIKIAogLyoKICAqICJCbGFja2xpc3RpbmciIG9mIGNlcnRhaW4gZGV2aWNlczoKQEAgLTE5MSw5ICsxOTIsOSBAQAogCQkJcmMgPSBibGFja2xpc3RfcmFuZ2UocmEsIGZyb21fc3NpZCwgdG9fc3NpZCwgZnJvbSwgdG8sCiAJCQkJCSAgICAgbXNndHJpZ2dlcik7CiAJCQlpZiAocmMpCi0JCQkJdG90YWxyYyA9IDE7CisJCQkJdG90YWxyYyA9IC1FSU5WQUw7CiAJCX0gZWxzZQotCQkJdG90YWxyYyA9IDE7CisJCQl0b3RhbHJjID0gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gdG90YWxyYzsKQEAgLTI0MCw4ICsyNDEsMTAgQEAKIAkJcmMgPSBibGFja2xpc3RfcGFyc2VfcGFyYW1ldGVycyhidWYsIGZyZWUsIDApOwogCWVsc2UgaWYgKHN0cmNtcCgiYWRkIiwgcGFybSkgPT0gMCkKIAkJcmMgPSBibGFja2xpc3RfcGFyc2VfcGFyYW1ldGVycyhidWYsIGFkZCwgMCk7CisJZWxzZSBpZiAoc3RyY21wKCJwdXJnZSIsIHBhcm0pID09IDApCisJCXJldHVybiBjY3dfcHVyZ2VfYmxhY2tsaXN0ZWQoKTsKIAllbHNlCi0JCXJldHVybiAxOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNzc19zY2hlZHVsZV9yZXByb2JlKCk7CiAKQEAgLTM1Myw3ICszNTYsNyBAQAogCX0KIAlyZXQgPSBibGFja2xpc3RfcGFyc2VfcHJvY19wYXJhbWV0ZXJzKGJ1Zik7CiAJaWYgKHJldCkKLQkJcmMgPSAtRUlOVkFMOworCQlyYyA9IHJldDsKIAllbHNlCiAJCXJjID0gdXNlcl9sZW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCBlMGNlNjVmLi4zYWMyYzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCkBAIC0xMTMsNyArMTEzLDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBnZGV2LT5jb3VudDsgaSsrKSB7CiAJCWlmIChnZGV2LT5jZGV2W2ldKSB7Ci0JCQlkZXZfc2V0X2RydmRhdGEoJmdkZXYtPmNkZXZbaV0tPmRldiwgTlVMTCk7CisJCQlpZiAoZGV2X2dldF9kcnZkYXRhKCZnZGV2LT5jZGV2W2ldLT5kZXYpID09IGdkZXYpCisJCQkJZGV2X3NldF9kcnZkYXRhKCZnZGV2LT5jZGV2W2ldLT5kZXYsIE5VTEwpOwogCQkJcHV0X2RldmljZSgmZ2Rldi0+Y2RldltpXS0+ZGV2KTsKIAkJfQogCX0KQEAgLTI2OCw4ICsyNjksNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXNucHJpbnRmIChnZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwKLQkJCWdkZXYtPmNkZXZbMF0tPmRldi5idXNfaWQpOworCWRldl9zZXRfbmFtZSgmZ2Rldi0+ZGV2LCAiJXMiLCBkZXZfbmFtZSgmZ2Rldi0+Y2RldlswXS0+ZGV2KSk7CiAKIAlyYyA9IGRldmljZV9hZGQoJmdkZXYtPmRldik7CiAJaWYgKHJjKQpAQCAtMjk2LDYgKzI5Niw3IEBACiAJCQlpZiAoZGV2X2dldF9kcnZkYXRhKCZnZGV2LT5jZGV2W2ldLT5kZXYpID09IGdkZXYpCiAJCQkJZGV2X3NldF9kcnZkYXRhKCZnZGV2LT5jZGV2W2ldLT5kZXYsIE5VTEwpOwogCQkJcHV0X2RldmljZSgmZ2Rldi0+Y2RldltpXS0+ZGV2KTsKKwkJCWdkZXYtPmNkZXZbaV0gPSBOVUxMOwogCQl9CiAJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwppbmRleCBkYjAwYjA1Li4xMjQ2ZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKQEAgLTM5Myw4ICszOTMsNyBAQAogCWNocC0+c3RhdGUgPSAxOwogCWNocC0+ZGV2LnBhcmVudCA9ICZjaGFubmVsX3N1YnN5c3RlbXNbY2hwaWQuY3NzaWRdLT5kZXZpY2U7CiAJY2hwLT5kZXYucmVsZWFzZSA9IGNocF9yZWxlYXNlOwotCXNucHJpbnRmKGNocC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjaHAleC4lMDJ4IiwgY2hwaWQuY3NzaWQsCi0JCSBjaHBpZC5pZCk7CisJZGV2X3NldF9uYW1lKCZjaHAtPmRldiwgImNocCV4LiUwMngiLCBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOwogCiAJLyogT2J0YWluIGNoYW5uZWwgcGF0aCBkZXNjcmlwdGlvbiBhbmQgZmlsbCBpdCBpbi4gKi8KIAlyZXQgPSBjaHNjX2RldGVybWluZV9iYXNlX2NoYW5uZWxfcGF0aF9kZXNjKGNocGlkLCAmY2hwLT5kZXNjKTsKQEAgLTQyMyw3ICs0MjIsNyBAQAogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2hwLT5kZXYua29iaiwgJmNocF9hdHRyX2dyb3VwKTsKIAlpZiAocmV0KSB7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZjaHAtPmRldik7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0OwogCX0KIAltdXRleF9sb2NrKCZjaGFubmVsX3N1YnN5c3RlbXNbY2hwaWQuY3NzaWRdLT5tdXRleCk7CiAJaWYgKGNoYW5uZWxfc3Vic3lzdGVtc1tjaHBpZC5jc3NpZF0tPmNtX2VuYWJsZWQpIHsKQEAgLTQzMiwxNCArNDMxLDE1IEBACiAJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNocC0+ZGV2LmtvYmosICZjaHBfYXR0cl9ncm91cCk7CiAJCQlkZXZpY2VfdW5yZWdpc3RlcigmY2hwLT5kZXYpOwogCQkJbXV0ZXhfdW5sb2NrKCZjaGFubmVsX3N1YnN5c3RlbXNbY2hwaWQuY3NzaWRdLT5tdXRleCk7Ci0JCQlnb3RvIG91dF9mcmVlOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAJY2hhbm5lbF9zdWJzeXN0ZW1zW2NocGlkLmNzc2lkXS0+Y2hwc1tjaHBpZC5pZF0gPSBjaHA7CiAJbXV0ZXhfdW5sb2NrKCZjaGFubmVsX3N1YnN5c3RlbXNbY2hwaWQuY3NzaWRdLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKKwlnb3RvIG91dDsKIG91dF9mcmVlOgogCWtmcmVlKGNocCk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jCmluZGV4IDkxY2E4N2EuLmY0OWYwZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogewogCWludCBiYWNrZWRfdXA7CiAKLQlpZiAoIXNjc3dfc3RjdGwoJnJlcXVlc3QtPmlyYi5zY3N3KSAmIFNDU1dfU1RDVExfU1RBVFVTX1BFTkQpCisJaWYgKCEoc2Nzd19zdGN0bCgmcmVxdWVzdC0+aXJiLnNjc3cpICYgU0NTV19TVENUTF9TVEFUVVNfUEVORCkpCiAJCXJldHVybiAtRUlPOwogCWJhY2tlZF91cCA9IHNjc3dfY3N0YXQoJnJlcXVlc3QtPmlyYi5zY3N3KSAmIFNDSE5fU1RBVF9DSEFJTl9DSEVDSzsKIAlyZXF1ZXN0LT5pcmIuc2Nzdy5jbWQuY3N0YXQgJj0gflNDSE5fU1RBVF9DSEFJTl9DSEVDSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDMzYmZmOGYuLjNkYjJjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMTE0LDYgKzExNCw3IEBACiAJc3RydWN0IHRwaV9pbmZvICp0cGlfaW5mbzsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCXN0cnVjdCBpcmIgKmlyYjsKKwlpbnQgaXJxX2NvbnRleHQ7CiAKIAl0cGlfaW5mbyA9IChzdHJ1Y3QgdHBpX2luZm8gKikgX19MQ19TVUJDSEFOTkVMX0lEOwogCWlmICh0cGkgKE5VTEwpICE9IDEpCkBAIC0xMjYsNyArMTI3LDkgQEAKIAlzY2ggPSAoc3RydWN0IHN1YmNoYW5uZWwgKikodW5zaWduZWQgbG9uZyl0cGlfaW5mby0+aW50cGFybTsKIAlpZiAoIXNjaCkKIAkJcmV0dXJuIDE7Ci0JbG9jYWxfYmhfZGlzYWJsZSgpOworCWlycV9jb250ZXh0ID0gaW5faW50ZXJydXB0KCk7CisJaWYgKCFpcnFfY29udGV4dCkKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWlycV9lbnRlciAoKTsKIAlzcGluX2xvY2soc2NoLT5sb2NrKTsKIAltZW1jcHkoJnNjaC0+c2NoaWIuc2NzdywgJmlyYi0+c2Nzdywgc2l6ZW9mKHVuaW9uIHNjc3cpKTsKQEAgLTEzNCw3ICsxMzcsOCBAQAogCQlzY2gtPmRyaXZlci0+aXJxKHNjaCk7CiAJc3Bpbl91bmxvY2soc2NoLT5sb2NrKTsKIAlpcnFfZXhpdCAoKTsKLQlfbG9jYWxfYmhfZW5hYmxlKCk7CisJaWYgKCFpcnFfY29udGV4dCkKKwkJX2xvY2FsX2JoX2VuYWJsZSgpOwogCXJldHVybiAxOwogfQogCkBAIC0xNTMsNyArMTU3LDcgQEAKIAlDSU9fTVNHX0VWRU5UKDIsICJjaW9fc3RhcnQ6ICdub3Qgb3Blcicgc3RhdHVzIGZvciAiCiAJCSAgICAgICJzdWJjaGFubmVsIDAuJXguJTA0eCFcbiIsIHNjaC0+c2NoaWQuc3NpZCwKIAkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8pOwotCXNwcmludGYoZGJmX3RleHQsICJubyVzIiwgc2NoLT5kZXYuYnVzX2lkKTsKKwlzcHJpbnRmKGRiZl90ZXh0LCAibm8lcyIsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCUNJT19UUkFDRV9FVkVOVCgwLCBkYmZfdGV4dCk7CiAJQ0lPX0hFWF9FVkVOVCgwLCAmc2NoLT5zY2hpYiwgc2l6ZW9mIChzdHJ1Y3Qgc2NoaWIpKTsKIApAQCAtMTcxLDkgKzE3NSwxMCBAQAogCXVuaW9uIG9yYiAqb3JiOwogCiAJQ0lPX1RSQUNFX0VWRU5UKDQsICJzdElPIik7Ci0JQ0lPX1RSQUNFX0VWRU5UKDQsIHNjaC0+ZGV2LmJ1c19pZCk7CisJQ0lPX1RSQUNFX0VWRU5UKDQsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCiAJb3JiID0gJnRvX2lvX3ByaXZhdGUoc2NoKS0+b3JiOworCW1lbXNldChvcmIsIDAsIHNpemVvZih1bmlvbiBvcmIpKTsKIAkvKiBzY2ggaXMgYWx3YXlzIHVuZGVyIDJHLiAqLwogCW9yYi0+Y21kLmludHBhcm0gPSAodTMyKShhZGRyX3Qpc2NoOwogCW9yYi0+Y21kLmZtdCA9IDE7CkBAIC0yMDgsOCArMjEzLDEwIEBACiAJY2FzZSAxOgkJLyogc3RhdHVzIHBlbmRpbmcgKi8KIAljYXNlIDI6CQkvKiBidXN5ICovCiAJCXJldHVybiAtRUJVU1k7Ci0JZGVmYXVsdDoJCS8qIGRldmljZS9wYXRoIG5vdCBvcGVyYXRpb25hbCAqLworCWNhc2UgMzoJCS8qIGRldmljZS9wYXRoIG5vdCBvcGVyYXRpb25hbCAqLwogCQlyZXR1cm4gY2lvX3N0YXJ0X2hhbmRsZV9ub3RvcGVyKHNjaCwgbHBtKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gY2NvZGU7CiAJfQogfQogCkBAIC0yMjksNyArMjM2LDcgQEAKIAlpbnQgY2NvZGU7CiAKIAlDSU9fVFJBQ0VfRVZFTlQgKDQsICJyZXNJTyIpOwotCUNJT19UUkFDRV9FVkVOVCAoNCwgc2NoLT5kZXYuYnVzX2lkKTsKKwlDSU9fVFJBQ0VfRVZFTlQoNCwgZGV2X25hbWUoJnNjaC0+ZGV2KSk7CiAKIAljY29kZSA9IHJzY2ggKHNjaC0+c2NoaWQpOwogCkBAIC0yNjYsNyArMjczLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlDSU9fVFJBQ0VfRVZFTlQgKDIsICJoYWx0SU8iKTsKLQlDSU9fVFJBQ0VfRVZFTlQgKDIsIHNjaC0+ZGV2LmJ1c19pZCk7CisJQ0lPX1RSQUNFX0VWRU5UKDIsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCiAJLyoKIAkgKiBJc3N1ZSAiSGFsdCBzdWJjaGFubmVsIiBhbmQgcHJvY2VzcyBjb25kaXRpb24gY29kZQpAQCAtMzAxLDcgKzMwOCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJQ0lPX1RSQUNFX0VWRU5UICgyLCAiY2xlYXJJTyIpOwotCUNJT19UUkFDRV9FVkVOVCAoMiwgc2NoLT5kZXYuYnVzX2lkKTsKKwlDSU9fVFJBQ0VfRVZFTlQoMiwgZGV2X25hbWUoJnNjaC0+ZGV2KSk7CiAKIAkvKgogCSAqIElzc3VlICJDbGVhciBzdWJjaGFubmVsIiBhbmQgcHJvY2VzcyBjb25kaXRpb24gY29kZQpAQCAtMzM3LDcgKzM0NCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJQ0lPX1RSQUNFX0VWRU5UICgyLCAiY2FuY2VsSU8iKTsKLQlDSU9fVFJBQ0VfRVZFTlQgKDIsIHNjaC0+ZGV2LmJ1c19pZCk7CisJQ0lPX1RSQUNFX0VWRU5UKDIsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCiAJY2NvZGUgPSB4c2NoIChzY2gtPnNjaGlkKTsKIApAQCAtNDAxLDcgKzQwOCw3IEBACiAJaW50IHJldDsKIAogCUNJT19UUkFDRV9FVkVOVCAoMiwgImVuc2NoIik7Ci0JQ0lPX1RSQUNFX0VWRU5UICgyLCBzY2gtPmRldi5idXNfaWQpOworCUNJT19UUkFDRV9FVkVOVCgyLCBkZXZfbmFtZSgmc2NoLT5kZXYpKTsKIAogCWlmIChzY2hfaXNfcHNldWRvX3NjaChzY2gpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ1MSw3ICs0NTgsNyBAQAogCWludCByZXQ7CiAKIAlDSU9fVFJBQ0VfRVZFTlQgKDIsICJkaXNzY2giKTsKLQlDSU9fVFJBQ0VfRVZFTlQgKDIsIHNjaC0+ZGV2LmJ1c19pZCk7CisJQ0lPX1RSQUNFX0VWRU5UKDIsIGRldl9uYW1lKCZzY2gtPmRldikpOwogCiAJaWYgKHNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCiAJCXJldHVybiAwOwpAQCAtNTY4LDggKzU3NSwxMCBAQAogCX0KIAltdXRleF9pbml0KCZzY2gtPnJlZ19tdXRleCk7CiAJLyogU2V0IGEgbmFtZSBmb3IgdGhlIHN1YmNoYW5uZWwgKi8KLQlzbnByaW50ZiAoc2NoLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIjAuJXguJTA0eCIsIHNjaGlkLnNzaWQsCi0JCSAgc2NoaWQuc2NoX25vKTsKKwlpZiAoY2lvX2lzX2NvbnNvbGUoc2NoaWQpKQorCQlzY2gtPmRldi5pbml0X25hbWUgPSBjaW9fZ2V0X2NvbnNvbGVfc2NoX25hbWUoc2NoaWQpOworCWVsc2UKKwkJZGV2X3NldF9uYW1lKCZzY2gtPmRldiwgIjAuJXguJTA0eCIsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7CiAKIAkvKgogCSAqIFRoZSBmaXJzdCBzdWJjaGFubmVsIHRoYXQgaXMgbm90LW9wZXJhdGlvbmFsIChjY29kZT09MykKQEAgLTY3NCw2ICs2ODMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NDV19DT05TT0xFCiBzdGF0aWMgc3RydWN0IHN1YmNoYW5uZWwgY29uc29sZV9zdWJjaGFubmVsOworc3RhdGljIGNoYXIgY29uc29sZV9zY2hfbmFtZVsxMF0gPSAiMC54Lnh4eHgiOwogc3RhdGljIHN0cnVjdCBpb19zdWJjaGFubmVsX3ByaXZhdGUgY29uc29sZV9wcml2Owogc3RhdGljIGludCBjb25zb2xlX3N1YmNoYW5uZWxfaW5fdXNlOwogCkBAIC04MjQsNiArODM0LDEyIEBACiAJcmV0dXJuICZjb25zb2xlX3N1YmNoYW5uZWw7CiB9CiAKK2NvbnN0IGNoYXIgKmNpb19nZXRfY29uc29sZV9zY2hfbmFtZShzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKK3sKKwlzbnByaW50Zihjb25zb2xlX3NjaF9uYW1lLCAxMCwgIjAuJXguJTA0eCIsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7CisJcmV0dXJuIChjb25zdCBjaGFyICopY29uc29sZV9zY2hfbmFtZTsKK30KKwogI2VuZGlmCiBzdGF0aWMgaW50CiBfX2Rpc2FibGVfc3ViY2hhbm5lbF9lYXN5KHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3Qgc2NoaWIgKnNjaGliKQpAQCAtODQzLDE5ICs4NTksNiBAQAogCXJldHVybiAtRUJVU1k7IC8qIHVobS4uLiAqLwogfQogCi0vKiB3ZSBjYW4ndCB1c2UgdGhlIG5vcm1hbCB1ZGVsYXkgaGVyZSwgc2luY2UgaXQgZW5hYmxlcyBleHRlcm5hbCBpbnRlcnJ1cHRzICovCi0KLXN0YXRpYyB2b2lkIHVkZWxheV9yZXNldCh1bnNpZ25lZCBsb25nIHVzZWNzKQotewotCXVpbnQ2NF90IHN0YXJ0X2NjLCBlbmRfY2M7Ci0KLQlhc20gdm9sYXRpbGUgKCJTVENLICUwIiA6ICI9bSIgKHN0YXJ0X2NjKSk7Ci0JZG8gewotCQljcHVfcmVsYXgoKTsKLQkJYXNtIHZvbGF0aWxlICgiU1RDSyAlMCIgOiAiPW0iIChlbmRfY2MpKTsKLQl9IHdoaWxlICgoKGVuZF9jYyAtIHN0YXJ0X2NjKS80MDk2KSA8IHVzZWNzKTsKLX0KLQogc3RhdGljIGludAogX19jbGVhcl9pb19zdWJjaGFubmVsX2Vhc3koc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQpCiB7CkBAIC04NzEsNyArODc0LDcgQEAKIAkJCWlmIChzY2hpZF9lcXVhbCgmdGkuc2NoaWQsICZzY2hpZCkpCiAJCQkJcmV0dXJuIDA7CiAJCX0KLQkJdWRlbGF5X3Jlc2V0KDEwMCk7CisJCXVkZWxheV9zaW1wbGUoMTAwKTsKIAl9CiAJcmV0dXJuIC1FQlVTWTsKIH0KQEAgLTg3OSw3ICs4ODIsNyBAQAogc3RhdGljIHZvaWQgX19jbGVhcl9jaHNjX3N1YmNoYW5uZWxfZWFzeSh2b2lkKQogewogCS8qIEl0IHNlZW1zIHdlIGNhbiBvbmx5IHdhaXQgZm9yIGEgYml0IGhlcmUgOi8gKi8KLQl1ZGVsYXlfcmVzZXQoMTAwKTsKKwl1ZGVsYXlfc2ltcGxlKDEwMCk7CiB9CiAKIHN0YXRpYyBpbnQgcGdtX2NoZWNrX29jY3VyZWQ7CkBAIC04ODksNyArODkyLDcgQEAKIAlwZ21fY2hlY2tfb2NjdXJlZCA9IDE7CiB9CiAKLXN0YXRpYyBpbnQgc3RzY2hfcmVzZXQoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvbGF0aWxlIHN0cnVjdCBzY2hpYiAqYWRkcikKK3N0YXRpYyBpbnQgc3RzY2hfcmVzZXQoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHN0cnVjdCBzY2hpYiAqYWRkcikKIHsKIAlpbnQgcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCmluZGV4IDNiMjM2ZDIuLjBmYjI0NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uaApAQCAtMTE3LDExICsxMTcsMTUgQEAKIGV4dGVybiBzdHJ1Y3Qgc3ViY2hhbm5lbCAqY2lvX2dldF9jb25zb2xlX3N1YmNoYW5uZWwodm9pZCk7CiBleHRlcm4gc3BpbmxvY2tfdCAqIGNpb19nZXRfY29uc29sZV9sb2NrKHZvaWQpOwogZXh0ZXJuIHZvaWQgKmNpb19nZXRfY29uc29sZV9wcml2KHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNpb19nZXRfY29uc29sZV9zY2hfbmFtZShzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCk7CitleHRlcm4gY29uc3QgY2hhciAqY2lvX2dldF9jb25zb2xlX2NkZXZfbmFtZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKICNlbHNlCiAjZGVmaW5lIGNpb19pc19jb25zb2xlKHNjaGlkKSAwCiAjZGVmaW5lIGNpb19nZXRfY29uc29sZV9zdWJjaGFubmVsKCkgTlVMTAogI2RlZmluZSBjaW9fZ2V0X2NvbnNvbGVfbG9jaygpIE5VTEwKICNkZWZpbmUgY2lvX2dldF9jb25zb2xlX3ByaXYoKSBOVUxMCisjZGVmaW5lIGNpb19nZXRfY29uc29sZV9zY2hfbmFtZShzY2hpZCkgTlVMTAorI2RlZmluZSBjaW9fZ2V0X2NvbnNvbGVfY2Rldl9uYW1lKHNjaCkgTlVMTAogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggNTE0ODllZi4uNzZiYmIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC02MzMsNiArNjMzLDExIEBACiAKIAljc3MgPSB0b19jc3MoZGV2KTsKIAltdXRleF9kZXN0cm95KCZjc3MtPm11dGV4KTsKKwlpZiAoY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbCkgeworCQkvKiBJbXBsaWVzIHRoYXQgaXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ1dCBuZXZlciByZWdpc3RlcmVkLiAqLworCQljc3Nfc3ViY2hhbm5lbF9yZWxlYXNlKCZjc3MtPnBzZXVkb19zdWJjaGFubmVsLT5kZXYpOworCQljc3MtPnBzZXVkb19zdWJjaGFubmVsID0gTlVMTDsKKwl9CiAJa2ZyZWUoY3NzKTsKIH0KIApAQCAtNjkzLDcgKzY5OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCWNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPmRldi5wYXJlbnQgPSAmY3NzLT5kZXZpY2U7CiAJY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LnJlbGVhc2UgPSBjc3Nfc3ViY2hhbm5lbF9yZWxlYXNlOwotCXNwcmludGYoY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LmJ1c19pZCwgImRlZnVuY3QiKTsKKwlkZXZfc2V0X25hbWUoJmNzcy0+cHNldWRvX3N1YmNoYW5uZWwtPmRldiwgImRlZnVuY3QiKTsKIAlyZXQgPSBjaW9fY3JlYXRlX3NjaF9sb2NrKGNzcy0+cHNldWRvX3N1YmNoYW5uZWwpOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUoY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbCk7CkBAIC03MDIsNyArNzA3LDcgQEAKIAltdXRleF9pbml0KCZjc3MtPm11dGV4KTsKIAljc3MtPnZhbGlkID0gMTsKIAljc3MtPmNzc2lkID0gbnI7Ci0Jc3ByaW50Zihjc3MtPmRldmljZS5idXNfaWQsICJjc3MleCIsIG5yKTsKKwlkZXZfc2V0X25hbWUoJmNzcy0+ZGV2aWNlLCAiY3NzJXgiLCBucik7CiAJY3NzLT5kZXZpY2UucmVsZWFzZSA9IGNoYW5uZWxfc3Vic3lzdGVtX3JlbGVhc2U7CiAJdG9kX2hpZ2ggPSAodTMyKSAoZ2V0X2Nsb2NrKCkgPj4gMzIpOwogCWNzc19nZW5lcmF0ZV9wZ2lkKGNzcywgdG9kX2hpZ2gpOwpAQCAtNzg1LDExICs3OTAsMTUgQEAKIAkJfQogCQljaGFubmVsX3N1YnN5c3RlbXNbaV0gPSBjc3M7CiAJCXJldCA9IHNldHVwX2NzcyhpKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZyZWU7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKGNoYW5uZWxfc3Vic3lzdGVtc1tpXSk7CisJCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCQl9CiAJCXJldCA9IGRldmljZV9yZWdpc3RlcigmY3NzLT5kZXZpY2UpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfZnJlZV9hbGw7CisJCWlmIChyZXQpIHsKKwkJCXB1dF9kZXZpY2UoJmNzcy0+ZGV2aWNlKTsKKwkJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJCX0KIAkJaWYgKGNzc19jaHNjX2NoYXJhY3RlcmlzdGljcy5zZWNtKSB7CiAJCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNzcy0+ZGV2aWNlLAogCQkJCQkJICZkZXZfYXR0cl9jbV9lbmFibGUpOwpAQCAtODAyLDcgKzgxMSw3IEBACiAJfQogCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmY3NzX3JlYm9vdF9ub3RpZmllcik7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfcHNldWRvOworCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCWNzc19pbml0X2RvbmUgPSAxOwogCiAJLyogRW5hYmxlIGRlZmF1bHQgaXNjIGZvciBJL08gc3ViY2hhbm5lbHMuICovCkBAIC04MTAsMTggKzgxOSwxMiBAQAogCiAJZm9yX2VhY2hfc3ViY2hhbm5lbChfX2luaXRfY2hhbm5lbF9zdWJzeXN0ZW0sIE5VTEwpOwogCXJldHVybiAwOwotb3V0X3BzZXVkbzoKLQlkZXZpY2VfdW5yZWdpc3RlcigmY2hhbm5lbF9zdWJzeXN0ZW1zW2ldLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2KTsKIG91dF9maWxlOgotCWRldmljZV9yZW1vdmVfZmlsZSgmY2hhbm5lbF9zdWJzeXN0ZW1zW2ldLT5kZXZpY2UsCi0JCQkgICAmZGV2X2F0dHJfY21fZW5hYmxlKTsKKwlpZiAoY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNlY20pCisJCWRldmljZV9yZW1vdmVfZmlsZSgmY2hhbm5lbF9zdWJzeXN0ZW1zW2ldLT5kZXZpY2UsCisJCQkJICAgJmRldl9hdHRyX2NtX2VuYWJsZSk7CiBvdXRfZGV2aWNlOgogCWRldmljZV91bnJlZ2lzdGVyKCZjaGFubmVsX3N1YnN5c3RlbXNbaV0tPmRldmljZSk7Ci1vdXRfZnJlZV9hbGw6Ci0Ja2ZyZWUoY2hhbm5lbF9zdWJzeXN0ZW1zW2ldLT5wc2V1ZG9fc3ViY2hhbm5lbC0+bG9jayk7Ci0Ja2ZyZWUoY2hhbm5lbF9zdWJzeXN0ZW1zW2ldLT5wc2V1ZG9fc3ViY2hhbm5lbCk7Ci1vdXRfZnJlZToKLQlrZnJlZShjaGFubmVsX3N1YnN5c3RlbXNbaV0pOwogb3V0X3VucmVnaXN0ZXI6CiAJd2hpbGUgKGkgPiAwKSB7CiAJCXN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzOwpAQCAtODI5LDYgKzgzMiw3IEBACiAJCWktLTsKIAkJY3NzID0gY2hhbm5lbF9zdWJzeXN0ZW1zW2ldOwogCQlkZXZpY2VfdW5yZWdpc3RlcigmY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2KTsKKwkJY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbCA9IE5VTEw7CiAJCWlmIChjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2VjbSkKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmY3NzLT5kZXZpY2UsCiAJCQkJCSAgICZkZXZfYXR0cl9jbV9lbmFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggMjgyMjEwMy4uNGU3OGM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiZGV2aWNlLmgiCiAjaW5jbHVkZSAiaW9hc20uaCIKICNpbmNsdWRlICJpb19zY2guaCIKKyNpbmNsdWRlICJibGFja2xpc3QuaCIKIAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHJlY292ZXJ5X3RpbWVyOwogc3RhdGljIERFRklORV9TUElOTE9DSyhyZWNvdmVyeV9sb2NrKTsKQEAgLTI5NiwzNiArMjk3LDMzIEBACiAJCWRldmljZV9kZWwoJmNkZXYtPmRldik7CiB9CiAKLXN0YXRpYyB2b2lkIGNjd19kZXZpY2VfcmVtb3ZlX29ycGhhbl9jYihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3JlbW92ZV9vcnBoYW5fY2Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAorCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKKwljZGV2ID0gcHJpdi0+Y2RldjsKIAljY3dfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7CiAJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKKwkvKiBSZWxlYXNlIGNkZXYgcmVmZXJlbmNlIGZvciB3b3JrcXVldWUgcHJvY2Vzc2luZy4gKi8KKwlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogfQogCi1zdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3JlbW92ZV9zY2hfY2Ioc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0KLQlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7Ci0JY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOwotCS8qIFJlc2V0IGludHBhcm0gdG8gemVyb2VzLiAqLwotCXNjaC0+c2NoaWIucG1jdy5pbnRwYXJtID0gMDsKLQljaW9fbW9kaWZ5KHNjaCk7Ci0JcHV0X2RldmljZSgmc2NoLT5kZXYpOwotfQorc3RhdGljIHZvaWQgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0YXRpYyB2b2lkCiBjY3dfZGV2aWNlX3JlbW92ZV9kaXNjb25uZWN0ZWQoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmM7CiAKIAkvKgogCSAqIEZvcmNlZCBvZmZsaW5lIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSBtZWFucwogCSAqICd0aHJvdyBhd2F5IGRldmljZScuCiAJICovCisJLyogR2V0IGNkZXYgcmVmZXJlbmNlIGZvciB3b3JrcXVldWUgcHJvY2Vzc2luZy4gKi8KKwlpZiAoIWdldF9kZXZpY2UoJmNkZXYtPmRldikpCisJCXJldHVybjsKIAlpZiAoY2N3X2RldmljZV9pc19vcnBoYW4oY2RldikpIHsKIAkJLyoKIAkJICogRGVyZWdpc3RlciBjY3cgZGV2aWNlLgpAQCAtMzM1LDIzICszMzMsMTMgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwogCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZGV2LT5jY3dsb2NrLCBmbGFncyk7Ci0JCXJjID0gZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKCZjZGV2LT5kZXYsCi0JCQkJCSAgICAgIGNjd19kZXZpY2VfcmVtb3ZlX29ycGhhbl9jYik7Ci0JCWlmIChyYykKLQkJCUNJT19NU0dfRVZFTlQoMCwgIkNvdWxkbid0IHVucmVnaXN0ZXIgb3JwaGFuICIKLQkJCQkgICAgICAiMC4leC4lMDR4XG4iLAotCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAotCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7Ci0JCXJldHVybjsKLQl9Ci0JLyogRGVyZWdpc3RlciBzdWJjaGFubmVsLCB3aGljaCB3aWxsIGtpbGwgdGhlIGNjdyBkZXZpY2UuICovCi0JcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soY2Rldi0+ZGV2LnBhcmVudCwKLQkJCQkgICAgICBjY3dfZGV2aWNlX3JlbW92ZV9zY2hfY2IpOwotCWlmIChyYykKLQkJQ0lPX01TR19FVkVOVCgwLCAiQ291bGRuJ3QgdW5yZWdpc3RlciBkaXNjb25uZWN0ZWQgZGV2aWNlICIKLQkJCSAgICAgICIwLiV4LiUwNHhcbiIsCi0JCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKLQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CisJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAorCQkJCWNjd19kZXZpY2VfcmVtb3ZlX29ycGhhbl9jYik7CisJfSBlbHNlCisJCS8qIERlcmVnaXN0ZXIgc3ViY2hhbm5lbCwgd2hpY2ggd2lsbCBraWxsIHRoZSBjY3cgZGV2aWNlLiAqLworCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKKwkJCQljY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIpOworCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIH0KIAogLyoqCkBAIC05NzAsMTIgKzk1OCwxNyBAQAogCiAJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCBraWNrX3dvcmspOwogCWNkZXYgPSBwcml2LT5jZGV2OworCS8qIEdldCBzdWJjaGFubmVsIHJlZmVyZW5jZSBmb3IgbG9jYWwgcHJvY2Vzc2luZy4gKi8KKwlpZiAoIWdldF9kZXZpY2UoY2Rldi0+ZGV2LnBhcmVudCkpCisJCXJldHVybjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIoc2NoKTsKIAkvKiBSZXNldCBpbnRwYXJtIHRvIHplcm9lcy4gKi8KIAlzY2gtPnNjaGliLnBtY3cuaW50cGFybSA9IDA7CiAJY2lvX21vZGlmeShzY2gpOworCS8qIFJlbGVhc2UgY2RldiByZWZlcmVuY2UgZm9yIHdvcmtxdWV1ZSBwcm9jZXNzaW5nLiovCiAJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKKwkvKiBSZWxlYXNlIHN1YmNoYW5uZWwgcmVmZXJlbmNlIGZvciBsb2NhbCBwcm9jZXNzaW5nLiAqLwogCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKIH0KIApAQCAtMTAwMSw2ICs5OTQsOCBAQAogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKIAkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKTsKIAkJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOworCQkvKiBSZWxlYXNlIHN1YmNoYW5uZWwgcmVmZXJlbmNlIGZvciBhc3luY2hyb25vdXMgcmVjb2duaXRpb24uICovCisJCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNjd19kZXZpY2VfaW5pdF9jb3VudCkpCiAJCQl3YWtlX3VwKCZjY3dfZGV2aWNlX2luaXRfd3EpOwogCQlicmVhazsKQEAgLTEwNDAsOCArMTAzNSwxMSBAQAogCWluaXRfdGltZXIoJnByaXYtPnRpbWVyKTsKIAogCS8qIFNldCBhbiBpbml0aWFsIG5hbWUgZm9yIHRoZSBkZXZpY2UuICovCi0Jc25wcmludGYgKGNkZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiMC4leC4lMDR4IiwKLQkJICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWIucG1jdy5kZXYpOworCWlmIChjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkKKwkJY2Rldi0+ZGV2LmluaXRfbmFtZSA9IGNpb19nZXRfY29uc29sZV9jZGV2X25hbWUoc2NoKTsKKwllbHNlCisJCWRldl9zZXRfbmFtZSgmY2Rldi0+ZGV2LCAiMC4leC4lMDR4IiwKKwkJCSAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGliLnBtY3cuZGV2KTsKIAogCS8qIEluY3JlYXNlIGNvdW50ZXIgb2YgZGV2aWNlcyBjdXJyZW50bHkgaW4gcmVjb2duaXRpb24uICovCiAJYXRvbWljX2luYygmY2N3X2RldmljZV9pbml0X2NvdW50KTsKQEAgLTExMDYsNyArMTEwNCw3IEBACiAJY2RldiA9IHNjaF9nZXRfY2RldihzY2gpOwogCiAJQ0lPX1RSQUNFX0VWRU5UKDMsICJJUlEiKTsKLQlDSU9fVFJBQ0VfRVZFTlQoMywgc2NoLT5kZXYuYnVzX2lkKTsKKwlDSU9fVFJBQ0VfRVZFTlQoMywgZGV2X25hbWUoJnNjaC0+ZGV2KSk7CiAJaWYgKGNkZXYpCiAJCWRldl9mc21fZXZlbnQoY2RldiwgREVWX0VWRU5UX0lOVEVSUlVQVCk7CiB9CkBAIC0xNDc2LDYgKzE0NzQsNDUgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWNvdmVyeV9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgcHVyZ2VfZm4oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdiA9IGNkZXYtPnByaXZhdGU7CisJaW50IHVucmVnOworCisJc3Bpbl9sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKKwl1bnJlZyA9IGlzX2JsYWNrbGlzdGVkKHByaXYtPmRldl9pZC5zc2lkLCBwcml2LT5kZXZfaWQuZGV2bm8pICYmCisJCShwcml2LT5zdGF0ZSA9PSBERVZfU1RBVEVfT0ZGTElORSk7CisJc3Bpbl91bmxvY2tfaXJxKGNkZXYtPmNjd2xvY2spOworCWlmICghdW5yZWcpCisJCWdvdG8gb3V0OworCWlmICghZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkKKwkJZ290byBvdXQ7CisJQ0lPX01TR19FVkVOVCgzLCAiY2N3OiBwdXJnaW5nIDAuJXguJTA0eFxuIiwgcHJpdi0+ZGV2X2lkLnNzaWQsCisJCSAgICAgIHByaXYtPmRldl9pZC5kZXZubyk7CisJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3Rlcik7CisJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOworCitvdXQ6CisJLyogQWJvcnQgbG9vcCBpbiBjYXNlIG9mIHBlbmRpbmcgc2lnbmFsLiAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNjd19wdXJnZV9ibGFja2xpc3RlZCAtIHB1cmdlIHVudXNlZCwgYmxhY2tsaXN0ZWQgZGV2aWNlcworICoKKyAqIFVucmVnaXN0ZXIgYWxsIGNjdyBkZXZpY2VzIHRoYXQgYXJlIG9mZmxpbmUgYW5kIG9uIHRoZSBibGFja2xpc3QuCisgKi8KK2ludCBjY3dfcHVyZ2VfYmxhY2tsaXN0ZWQodm9pZCkKK3sKKwlDSU9fTVNHX0VWRU5UKDIsICJjY3c6IHB1cmdpbmcgYmxhY2tsaXN0ZWQgZGV2aWNlc1xuIik7CisJYnVzX2Zvcl9lYWNoX2RldigmY2N3X2J1c190eXBlLCBOVUxMLCBOVUxMLCBwdXJnZV9mbik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGRldmljZV9zZXRfZGlzY29ubmVjdGVkKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewogCWlmICghY2RldikKQEAgLTE0OTIsNyArMTUyOSw3IEBACiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAKIAlDSU9fVFJBQ0VfRVZFTlQoMiwgIm5vdG9wZXIiKTsKLQlDSU9fVFJBQ0VfRVZFTlQoMiwgc2NoLT5kZXYuYnVzX2lkKTsKKwlDSU9fVFJBQ0VfRVZFTlQoMiwgZGV2X25hbWUoJnNjaC0+ZGV2KSk7CiAJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKIAljaW9fZGlzYWJsZV9zdWJjaGFubmVsKHNjaCk7CiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CkBAIC0xNTkxLDYgKzE2MjgsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NDV19DT05TT0xFCiBzdGF0aWMgc3RydWN0IGNjd19kZXZpY2UgY29uc29sZV9jZGV2Oworc3RhdGljIGNoYXIgY29uc29sZV9jZGV2X25hbWVbMTBdID0gIjAueC54eHh4IjsKIHN0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlIGNvbnNvbGVfcHJpdmF0ZTsKIHN0YXRpYyBpbnQgY29uc29sZV9jZGV2X2luX3VzZTsKIApAQCAtMTY2MSw2ICsxNjk5LDE0IEBACiAJY29uc29sZV9jZGV2Lm9ubGluZSA9IDE7CiAJcmV0dXJuICZjb25zb2xlX2NkZXY7CiB9CisKKworY29uc3QgY2hhciAqY2lvX2dldF9jb25zb2xlX2NkZXZfbmFtZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXNucHJpbnRmKGNvbnNvbGVfY2Rldl9uYW1lLCAxMCwgIjAuJXguJTA0eCIsCisJCSBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWIucG1jdy5kZXYpOworCXJldHVybiAoY29uc3QgY2hhciAqKWNvbnNvbGVfY2Rldl9uYW1lOworfQogI2VuZGlmCiAKIC8qCkBAIC0xNjczLDcgKzE3MTksNyBAQAogCiAJYnVzX2lkID0gaWQ7CiAKLQlyZXR1cm4gKHN0cm5jbXAoYnVzX2lkLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpID09IDApOworCXJldHVybiAoc3RybmNtcChidXNfaWQsIGRldl9uYW1lKGRldiksIEJVU19JRF9TSVpFKSA9PSAwKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaAppbmRleCA2ZjVjM2YyLi4xMDRlZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKQEAgLTg2LDYgKzg2LDcgQEAKIGludCBjY3dfZGV2aWNlX3JlY29nbml0aW9uKHN0cnVjdCBjY3dfZGV2aWNlICopOwogaW50IGNjd19kZXZpY2Vfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICopOwogaW50IGNjd19kZXZpY2Vfb2ZmbGluZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKK2ludCBjY3dfcHVyZ2VfYmxhY2tsaXN0ZWQodm9pZCk7CiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGRldmljZSBzdGF0dXMgYW5kIGJhc2ljIHNlbnNlIHN0dWZmLiAqLwogdm9pZCBjY3dfZGV2aWNlX2FjY3VtdWxhdGVfaXJiKHN0cnVjdCBjY3dfZGV2aWNlICosIHN0cnVjdCBpcmIgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCmluZGV4IDU1MDUwOGQuLjEwYmMwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCkBAIC01Miw4ICs1MiwxMCBAQAogCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogb3JiOlxuIik7CiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9XQVJOSU5HLCAiY2lvOiAgIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCiAJCSAgICAgICBvcmIsIHNpemVvZigqb3JiKSwgMCk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBjY3cgZGV2aWNlIGJ1cyBpZDogJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogc3ViY2hhbm5lbCBidXMgaWQ6ICVzXG4iLCBzY2gtPmRldi5idXNfaWQpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogY2N3IGRldmljZSBidXMgaWQ6ICVzXG4iLAorCSAgICAgICBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBzdWJjaGFubmVsIGJ1cyBpZDogJXNcbiIsCisJICAgICAgIGRldl9uYW1lKCZzY2gtPmRldikpOwogCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogc3ViY2hhbm5lbCBscG06ICUwMngsIG9wbTogJTAyeCwgIgogCSAgICAgICAidnBtOiAlMDJ4XG4iLCBzY2gtPmxwbSwgc2NoLT5vcG0sIHNjaC0+dnBtKTsKIApAQCAtNjU4LDYgKzY2MCwxMyBAQAogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKKwkvKiBBbGxvdyBjY3dfZGV2aWNlX29mZmxpbmUgd2hpbGUgZGlzY29ubmVjdGVkLiAqLworCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfRElTQ09OTkVDVEVEIHx8CisJICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9OT1RfT1BFUikgeworCQljZGV2LT5wcml2YXRlLT5mbGFncy5kb25vdGlmeSA9IDA7CisJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOworCQlyZXR1cm4gMDsKKwl9CiAJaWYgKGNjd19kZXZpY2VfaXNfb3JwaGFuKGNkZXYpKSB7CiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfT0ZGTElORSk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwppbmRleCBlZTFhMjgzLi5lYWJjYzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAkKIAlDSU9fVFJBQ0VfRVZFTlQoMiwgInN0bCBsb2NrIik7Ci0JQ0lPX1RSQUNFX0VWRU5UKDIsIGNkZXYtPmRldi5idXNfaWQpOworCUNJT19UUkFDRV9FVkVOVCgyLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAKIAlidWYgPSBrbWFsbG9jKDMyKnNpemVvZihjaGFyKSwgR0ZQX0RNQXxHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmggYi9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCmluZGV4IDNmOGYxY2YuLmM0ZjNlN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaApAQCAtMTIzLDcgKzEyMyw3IEBACiAJdm9pZCAqY21iX3dhaXQ7CQkJLyogZGVmZXJyZWQgY21iIGVuYWJsZS9kaXNhYmxlICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBzc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCB2b2xhdGlsZSB1bmlvbiBvcmIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBzc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCB1bmlvbiBvcmIgKmFkZHIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHN1YmNoYW5uZWxfaWQgcmVnMSBhc20oIjEiKSA9IHNjaGlkOwogCWludCBjY29kZSA9IC1FSU87CkBAIC0xMzQsNyArMTM0LDkgQEAKIAkJIglzcmwJJTAsMjhcbiIKIAkJIjE6XG4iCiAJCUVYX1RBQkxFKDBiLCAxYikKLQkJOiAiK2QiIChjY29kZSkgOiAiZCIgKHJlZzEpLCAiYSIgKGFkZHIpLCAibSIgKCphZGRyKSA6ICJjYyIpOworCQk6ICIrZCIgKGNjb2RlKQorCQk6ICJkIiAocmVnMSksICJhIiAoYWRkciksICJtIiAoKmFkZHIpCisJCTogImNjIiwgIm1lbW9yeSIpOwogCXJldHVybiBjY29kZTsKIH0KIApAQCAtMTQ3LDcgKzE0OSw5IEBACiAJCSIJcnNjaFxuIgogCQkiCWlwbQklMFxuIgogCQkiCXNybAklMCwyOCIKLQkJOiAiPWQiIChjY29kZSkgOiAiZCIgKHJlZzEpIDogImNjIik7CisJCTogIj1kIiAoY2NvZGUpCisJCTogImQiIChyZWcxKQorCQk6ICJjYyIsICJtZW1vcnkiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKQEAgLTE2MCw3ICsxNjQsOSBAQAogCQkiCWNzY2hcbiIKIAkJIglpcG0JJTBcbiIKIAkJIglzcmwJJTAsMjgiCi0JCTogIj1kIiAoY2NvZGUpIDogImQiIChyZWcxKSA6ICJjYyIpOworCQk6ICI9ZCIgKGNjb2RlKQorCQk6ICJkIiAocmVnMSkKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKQEAgLTE3Myw3ICsxNzksOSBAQAogCQkiCWhzY2hcbiIKIAkJIglpcG0JJTBcbiIKIAkJIglzcmwJJTAsMjgiCi0JCTogIj1kIiAoY2NvZGUpIDogImQiIChyZWcxKSA6ICJjYyIpOworCQk6ICI9ZCIgKGNjb2RlKQorCQk6ICJkIiAocmVnMSkKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKQEAgLTE4Niw3ICsxOTQsOSBAQAogCQkiCS5pbnNuCXJyZSwweGIyNzYwMDAwLCUxLDBcbiIKIAkJIglpcG0JJTBcbiIKIAkJIglzcmwJJTAsMjgiCi0JCTogIj1kIiAoY2NvZGUpIDogImQiIChyZWcxKSA6ICJjYyIpOworCQk6ICI9ZCIgKGNjb2RlKQorCQk6ICJkIiAocmVnMSkKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaCBiL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaAppbmRleCA5ZmEyYWMxLi43NTkyNjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2lvYXNtLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oCkBAIC0yMywzOCArMjMsMzkgQEAKICAqIFNvbWUgUzM5MCBzcGVjaWZpYyBJTyBpbnN0cnVjdGlvbnMgYXMgaW5saW5lCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgc3RzY2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsCi0JCQkgICAgdm9sYXRpbGUgc3RydWN0IHNjaGliICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgc3RzY2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHN0cnVjdCBzY2hpYiAqYWRkcikKIHsKIAlyZWdpc3RlciBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCByZWcxIGFzbSAoIjEiKSA9IHNjaGlkOwogCWludCBjY29kZTsKIAogCWFzbSB2b2xhdGlsZSgKLQkJIglzdHNjaAkwKCUyKVxuIgorCQkiCXN0c2NoCTAoJTMpXG4iCiAJCSIJaXBtCSUwXG4iCiAJCSIJc3JsCSUwLDI4IgotCQk6ICI9ZCIgKGNjb2RlKSA6ICJkIiAocmVnMSksICJhIiAoYWRkciksICJtIiAoKmFkZHIpIDogImNjIik7CisJCTogIj1kIiAoY2NvZGUpLCAiPW0iICgqYWRkcikKKwkJOiAiZCIgKHJlZzEpLCAiYSIgKGFkZHIpCisJCTogImNjIik7CiAJcmV0dXJuIGNjb2RlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzdHNjaF9lcnIoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsCi0JCQkJdm9sYXRpbGUgc3RydWN0IHNjaGliICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgc3RzY2hfZXJyKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHN1YmNoYW5uZWxfaWQgcmVnMSBhc20gKCIxIikgPSBzY2hpZDsKIAlpbnQgY2NvZGUgPSAtRUlPOwogCiAJYXNtIHZvbGF0aWxlKAotCQkiCXN0c2NoCTAoJTIpXG4iCisJCSIJc3RzY2gJMCglMylcbiIKIAkJIjA6CWlwbQklMFxuIgogCQkiCXNybAklMCwyOFxuIgogCQkiMTpcbiIKIAkJRVhfVEFCTEUoMGIsMWIpCi0JCTogIitkIiAoY2NvZGUpIDogImQiIChyZWcxKSwgImEiIChhZGRyKSwgIm0iICgqYWRkcikgOiAiY2MiKTsKKwkJOiAiK2QiIChjY29kZSksICI9bSIgKCphZGRyKQorCQk6ICJkIiAocmVnMSksICJhIiAoYWRkcikKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1zY2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsCi0JCQkgICB2b2xhdGlsZSBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBtc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHN1YmNoYW5uZWxfaWQgcmVnMSBhc20gKCIxIikgPSBzY2hpZDsKIAlpbnQgY2NvZGU7CkBAIC02MywxMiArNjQsMTMgQEAKIAkJIgltc2NoCTAoJTIpXG4iCiAJCSIJaXBtCSUwXG4iCiAJCSIJc3JsCSUwLDI4IgotCQk6ICI9ZCIgKGNjb2RlKSA6ICJkIiAocmVnMSksICJhIiAoYWRkciksICJtIiAoKmFkZHIpIDogImNjIik7CisJCTogIj1kIiAoY2NvZGUpCisJCTogImQiIChyZWcxKSwgImEiIChhZGRyKSwgIm0iICgqYWRkcikKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1zY2hfZXJyKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLAotCQkJICAgICAgIHZvbGF0aWxlIHN0cnVjdCBzY2hpYiAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IG1zY2hfZXJyKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3Qgc2NoaWIgKmFkZHIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHN1YmNoYW5uZWxfaWQgcmVnMSBhc20gKCIxIikgPSBzY2hpZDsKIAlpbnQgY2NvZGUgPSAtRUlPOwpAQCAtNzksMzMgKzgxLDM4IEBACiAJCSIJc3JsCSUwLDI4XG4iCiAJCSIxOlxuIgogCQlFWF9UQUJMRSgwYiwxYikKLQkJOiAiK2QiIChjY29kZSkgOiAiZCIgKHJlZzEpLCAiYSIgKGFkZHIpLCAibSIgKCphZGRyKSA6ICJjYyIpOworCQk6ICIrZCIgKGNjb2RlKQorCQk6ICJkIiAocmVnMSksICJhIiAoYWRkciksICJtIiAoKmFkZHIpCisJCTogImNjIik7CiAJcmV0dXJuIGNjb2RlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0c2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLAotCQkJICAgdm9sYXRpbGUgc3RydWN0IGlyYiAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IHRzY2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHN0cnVjdCBpcmIgKmFkZHIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHN1YmNoYW5uZWxfaWQgcmVnMSBhc20gKCIxIikgPSBzY2hpZDsKIAlpbnQgY2NvZGU7CiAKIAlhc20gdm9sYXRpbGUoCi0JCSIJdHNjaAkwKCUyKVxuIgorCQkiCXRzY2gJMCglMylcbiIKIAkJIglpcG0JJTBcbiIKIAkJIglzcmwJJTAsMjgiCi0JCTogIj1kIiAoY2NvZGUpIDogImQiIChyZWcxKSwgImEiIChhZGRyKSwgIm0iICgqYWRkcikgOiAiY2MiKTsKKwkJOiAiPWQiIChjY29kZSksICI9bSIgKCphZGRyKQorCQk6ICJkIiAocmVnMSksICJhIiAoYWRkcikKKwkJOiAiY2MiKTsKIAlyZXR1cm4gY2NvZGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRwaSggdm9sYXRpbGUgc3RydWN0IHRwaV9pbmZvICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgdHBpKHN0cnVjdCB0cGlfaW5mbyAqYWRkcikKIHsKIAlpbnQgY2NvZGU7CiAKIAlhc20gdm9sYXRpbGUoCi0JCSIJdHBpCTAoJTEpXG4iCisJCSIJdHBpCTAoJTIpXG4iCiAJCSIJaXBtCSUwXG4iCiAJCSIJc3JsCSUwLDI4IgotCQk6ICI9ZCIgKGNjb2RlKSA6ICJhIiAoYWRkciksICJtIiAoKmFkZHIpIDogImNjIik7CisJCTogIj1kIiAoY2NvZGUpLCAiPW0iICgqYWRkcikKKwkJOiAiYSIgKGFkZHIpCisJCTogImNjIik7CiAJcmV0dXJuIGNjb2RlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCmluZGV4IGMxYTcwOTguLmUzZWExZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCkBAIC0xNiw2ICsxNiwxNCBAQAogI2RlZmluZSBRRElPX0JVU1lfQklUX0dJVkVfVVAJCTIwMDAwMDAJLyogMiBzZWNvbmRzID0gZXRlcm5pdHkgKi8KICNkZWZpbmUgUURJT19JTlBVVF9USFJFU0hPTEQJCTUwMAkvKiA1MDAgbWljcm9zZWNvbmRzICovCiAKKy8qCisgKiBpZiBhbiBhc3luY2hyb25vdXMgSGlwZXJTb2NrZXRzIHF1ZXVlIHJ1bnMgZnVsbCwgdGhlIDEwIHNlY29uZHMgdGltZXIgd2FpdAorICogdGlsbCBuZXh0IGluaXRpYXRpdmUgdG8gZ2l2ZSB0cmFuc21pdHRlZCBza2JzIGJhY2sgdG8gdGhlIHN0YWNrIGlzIHRvbyBsb25nLgorICogVGhlcmVmb3JlIHBvbGxpbmcgaXMgc3RhcnRlZCBpbiBjYXNlIG9mIG11bHRpY2FzdCBxdWV1ZSBpcyBmaWxsZWQgbW9yZQorICogdGhhbiA1MCBwZXJjZW50LgorICovCisjZGVmaW5lIFFESU9fSVFESU9fUE9MTF9MVkwJCTY1CS8qIEhTIG11bHRpY2FzdCBxdWV1ZSAqLworCiBlbnVtIHFkaW9faXJxX3N0YXRlcyB7CiAJUURJT19JUlFfU1RBVEVfSU5BQ1RJVkUsCiAJUURJT19JUlFfU1RBVEVfRVNUQUJMSVNIRUQsCkBAIC0xOTUsNiArMjAzLDkgQEAKIAkvKiBQQ0lzIGFyZSBlbmFibGVkIGZvciB0aGUgcXVldWUgKi8KIAlpbnQgcGNpX291dF9lbmFibGVkOwogCisJLyogSVFESU86IG91dHB1dCBtdWx0aXBsZSBidWZmZXJzIChlbmhhbmNlZCBTSUdBKSAqLworCWludCB1c2VfZW5oX3NpZ2E7CisKIAkvKiB0aW1lciB0byBjaGVjayBmb3IgbW9yZSBvdXRib3VuZCB3b3JrICovCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwppbmRleCAzMzdhYTMwLi5iNTM5MDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiBzdGF0aWMgdm9pZCBnZXRfcXVldWVfbmFtZShzdHJ1Y3QgcWRpb19xICpxLCBzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgY2hhciAqbmFtZSkKIHsKIAltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKLQlzcHJpbnRmKG5hbWUsICIlcyIsIGNkZXYtPmRldi5idXNfaWQpOworCXNwcmludGYobmFtZSwgIiVzIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCWlmIChxLT5pc19pbnB1dF9xKQogCQlzcHJpbnRmKG5hbWUgKyBzdHJsZW4obmFtZSksICJfaW5wdXQiKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwppbmRleCBlNmVhYmM4Li5hNTA2ODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTMxNiw2ICszMTYsOSBAQAogCXVuc2lnbmVkIGludCBmYyA9IDA7CiAJdW5zaWduZWQgbG9uZyBzY2hpZDsKIAorCWlmIChxLT51Lm91dC51c2VfZW5oX3NpZ2EpIHsKKwkJZmMgPSAzOworCX0KIAlpZiAoIWlzX3FlYnNtKHEpKQogCQlzY2hpZCA9ICooKHUzMiAqKSZxLT5pcnFfcHRyLT5zY2hpZCk7CiAJZWxzZSB7CkBAIC04NTEsNiArODU0LDEyIEBACiAJaWYgKHF1ZXVlX3R5cGUocSkgPT0gUURJT19JUURJT19RRk1UICYmICFtdWx0aWNhc3Rfb3V0Ym91bmQocSkpCiAJCXJldHVybjsKIAorCWlmICgocXVldWVfdHlwZShxKSA9PSBRRElPX0lRRElPX1FGTVQpICYmCisJICAgIChhdG9taWNfcmVhZCgmcS0+bnJfYnVmX3VzZWQpKSA+IFFESU9fSVFESU9fUE9MTF9MVkwpIHsKKwkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCXJldHVybjsKKwl9CisKIAlpZiAocS0+dS5vdXQucGNpX291dF9lbmFibGVkKQogCQlyZXR1cm47CiAKQEAgLTk1Niw3ICs5NjUsNyBAQAogCWNoYXIgZGJmX3RleHRbMTVdOwogCiAJUURJT19EQkZfVEVYVDIoMSwgdHJhY2UsICJpY2syIik7Ci0Jc3ByaW50ZihkYmZfdGV4dCwgIiVzIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJc3ByaW50ZihkYmZfdGV4dCwgIiVzIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCVFESU9fREJGX1RFWFQyKDEsIHRyYWNlLCBkYmZfdGV4dCk7CiAJUURJT19EQkZfSEVYMigwLCB0cmFjZSwgJmludHBhcm0sIHNpemVvZihpbnQpKTsKIAlRRElPX0RCRl9IRVgyKDAsIHRyYWNlLCAmZHN0YXQsIHNpemVvZihpbnQpKTsKQEAgLTE0NDMsNiArMTQ1Miw4IEBACiAJfQogCiAJcWRpb19zZXR1cF9zc3FkX2luZm8oaXJxX3B0cik7CisJc3ByaW50ZihkYmZfdGV4dCwgInFEbW13YyUyeCIsIGlycV9wdHItPnNzcWRfZGVzYy5tbXdjKTsKKwlRRElPX0RCRl9URVhUMigwLCBzZXR1cCwgZGJmX3RleHQpOwogCXNwcmludGYoZGJmX3RleHQsICJxaWIgYWMlMngiLCBpcnFfcHRyLT5xaWIuYWMpOwogCVFESU9fREJGX1RFWFQyKDAsIHNldHVwLCBkYmZfdGV4dCk7CiAKQEAgLTE2MTUsMTIgKzE2MjYsMjEgQEAKIAkJaWYgKG11bHRpY2FzdF9vdXRib3VuZChxKSkKIAkJCXFkaW9fa2lja19vdXRib3VuZF9xKHEpOwogCQllbHNlCi0JCQkvKgotCQkJICogT25lIHNpZ2EtdyBwZXIgYnVmZmVyIHJlcXVpcmVkIGZvciB1bmljYXN0Ci0JCQkgKiBIaXBlclNvY2tldHMuCi0JCQkgKi8KLQkJCXdoaWxlIChjb3VudC0tKQorCQkJaWYgKChxLT5pcnFfcHRyLT5zc3FkX2Rlc2MubW13YyA+IDEpICYmCisJCQkgICAgKGNvdW50ID4gMSkgJiYKKwkJCSAgICAoY291bnQgPD0gcS0+aXJxX3B0ci0+c3NxZF9kZXNjLm1td2MpKSB7CisJCQkJLyogZXhwbG9pdCBlbmhhbmNlZCBTSUdBICovCisJCQkJcS0+dS5vdXQudXNlX2VuaF9zaWdhID0gMTsKIAkJCQlxZGlvX2tpY2tfb3V0Ym91bmRfcShxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkqIE9uZSBzaWdhLXcgcGVyIGJ1ZmZlciByZXF1aXJlZCBmb3IgdW5pY2FzdAorCQkJCSogSGlwZXJTb2NrZXRzLgorCQkJCSovCisJCQkJcS0+dS5vdXQudXNlX2VuaF9zaWdhID0gMDsKKwkJCQl3aGlsZSAoY291bnQtLSkKKwkJCQkJcWRpb19raWNrX291dGJvdW5kX3EocSk7CisJCQl9CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwppbmRleCAxNjc5ZTJmLi5hMGI2YjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwpAQCAtNDQ3LDUxICs0NDcsMzYgQEAKIHsKIAljaGFyIHNbODBdOwogCi0Jc3ByaW50ZihzLCAiJXMgc2M6JXggIiwgY2Rldi0+ZGV2LmJ1c19pZCwgaXJxX3B0ci0+c2NoaWQuc2NoX25vKTsKLQorCXNwcmludGYocywgInFkaW86ICVzICIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAlzd2l0Y2ggKGlycV9wdHItPnFpYi5xZm10KSB7CiAJY2FzZSBRRElPX1FFVEhfUUZNVDoKLQkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiT1NBREUgIik7CisJCXNwcmludGYocyArIHN0cmxlbihzKSwgIk9TQSAiKTsKIAkJYnJlYWs7CiAJY2FzZSBRRElPX1pGQ1BfUUZNVDoKIAkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiWkZDUCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBRRElPX0lRRElPX1FGTVQ6Ci0JCXNwcmludGYocyArIHN0cmxlbihzKSwgIkhpcGVyU29ja2V0cyAiKTsKKwkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiSFMgIik7CiAJCWJyZWFrOwogCX0KLQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJ1c2luZzogIik7Ci0KLQlpZiAoIWlzX3RoaW5pbnRfaXJxKGlycV9wdHIpKQotCQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJubyIpOwotCXNwcmludGYocyArIHN0cmxlbihzKSwgIkFkYXB0ZXJJbnRlcnJ1cHRzICIpOwotCWlmICghKGlycV9wdHItPnNjaF90b2tlbiAhPSAwKSkKLQkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAibm8iKTsKLQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJRRUJTTSAiKTsKLQlpZiAoIShpcnFfcHRyLT5xaWIuYWMgJiBRSUJfQUNfT1VUQk9VTkRfUENJX1NVUFBPUlRFRCkpCi0JCXNwcmludGYocyArIHN0cmxlbihzKSwgIm5vIik7Ci0Jc3ByaW50ZihzICsgc3RybGVuKHMpLCAiT3V0Ym91bmRQQ0kgIik7Ci0JaWYgKCFjc3NfZ2VuZXJhbF9jaGFyYWN0ZXJpc3RpY3MuYWlmX3RkZCkKLQkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAibm8iKTsKLQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJURERcbiIpOwotCXByaW50ayhLRVJOX0lORk8gInFkaW86ICVzIiwgcyk7Ci0KLQltZW1zZXQocywgMCwgc2l6ZW9mKHMpKTsKLQlzcHJpbnRmKHMsICIlcyBTSUdBIHJlcXVpcmVkOiAiLCBjZGV2LT5kZXYuYnVzX2lkKTsKLQlpZiAoaXJxX3B0ci0+c2lnYV9mbGFnLmlucHV0KQotCQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJSZWFkICIpOwotCWlmIChpcnFfcHRyLT5zaWdhX2ZsYWcub3V0cHV0KQotCQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJXcml0ZSAiKTsKLQlpZiAoaXJxX3B0ci0+c2lnYV9mbGFnLnN5bmMpCi0JCXNwcmludGYocyArIHN0cmxlbihzKSwgIlN5bmMgIik7Ci0JaWYgKCFpcnFfcHRyLT5zaWdhX2ZsYWcubm9fc3luY190aSkKLQkJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiU3luY0FJICIpOwotCWlmICghaXJxX3B0ci0+c2lnYV9mbGFnLm5vX3N5bmNfb3V0X3RpKQotCQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJTeW5jT3V0QUkgIik7Ci0JaWYgKCFpcnFfcHRyLT5zaWdhX2ZsYWcubm9fc3luY19vdXRfcGNpKQotCQlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJTeW5jT3V0UENJIik7CisJc3ByaW50ZihzICsgc3RybGVuKHMpLCAib24gU0MgJXggdXNpbmcgIiwgaXJxX3B0ci0+c2NoaWQuc2NoX25vKTsKKwlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJBSTolZCAiLCBpc190aGluaW50X2lycShpcnFfcHRyKSk7CisJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiUUVCU006JWQgIiwgKGlycV9wdHItPnNjaF90b2tlbikgPyAxIDogMCk7CisJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiUENJOiVkICIsCisJCShpcnFfcHRyLT5xaWIuYWMgJiBRSUJfQUNfT1VUQk9VTkRfUENJX1NVUFBPUlRFRCkgPyAxIDogMCk7CisJc3ByaW50ZihzICsgc3RybGVuKHMpLCAiVEREOiVkICIsIGNzc19nZW5lcmFsX2NoYXJhY3RlcmlzdGljcy5haWZfdGRkKTsKKwlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICJTSUdBOiIpOworCXNwcmludGYocyArIHN0cmxlbihzKSwgIiVzIiwgKGlycV9wdHItPnNpZ2FfZmxhZy5pbnB1dCkgPyAiUiIgOiAiICIpOworCXNwcmludGYocyArIHN0cmxlbihzKSwgIiVzIiwgKGlycV9wdHItPnNpZ2FfZmxhZy5vdXRwdXQpID8gIlciIDogIiAiKTsKKwlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICIlcyIsIChpcnFfcHRyLT5zaWdhX2ZsYWcuc3luYykgPyAiUyIgOiAiICIpOworCXNwcmludGYocyArIHN0cmxlbihzKSwgIiVzIiwKKwkJKCFpcnFfcHRyLT5zaWdhX2ZsYWcubm9fc3luY190aSkgPyAiQSIgOiAiICIpOworCXNwcmludGYocyArIHN0cmxlbihzKSwgIiVzIiwKKwkJKCFpcnFfcHRyLT5zaWdhX2ZsYWcubm9fc3luY19vdXRfdGkpID8gIk8iIDogIiAiKTsKKwlzcHJpbnRmKHMgKyBzdHJsZW4ocyksICIlcyIsCisJCSghaXJxX3B0ci0+c2lnYV9mbGFnLm5vX3N5bmNfb3V0X3BjaSkgPyAiUCIgOiAiICIpOwogCXNwcmludGYocyArIHN0cmxlbihzKSwgIlxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicWRpbzogJXMiLCBzKTsKKwlwcmludGsoS0VSTl9JTkZPICIlcyIsIHMpOwogfQogCiBpbnQgX19pbml0IHFkaW9fc2V0dXBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggNmYwMmYxZS4uZTNmZTY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC04OTIsOCArODkyLDggQEAKIAogCQlhcF9kZXYtPmRldmljZS5idXMgPSAmYXBfYnVzX3R5cGU7CiAJCWFwX2Rldi0+ZGV2aWNlLnBhcmVudCA9IGFwX3Jvb3RfZGV2aWNlOwotCQlzbnByaW50ZihhcF9kZXYtPmRldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiY2FyZCUwMngiLAotCQkJIEFQX1FJRF9ERVZJQ0UoYXBfZGV2LT5xaWQpKTsKKwkJZGV2X3NldF9uYW1lKCZhcF9kZXYtPmRldmljZSwgImNhcmQlMDJ4IiwKKwkJCSAgICAgQVBfUUlEX0RFVklDRShhcF9kZXYtPnFpZCkpOwogCQlhcF9kZXYtPmRldmljZS5yZWxlYXNlID0gYXBfZGV2aWNlX3JlbGVhc2U7CiAJCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZhcF9kZXYtPmRldmljZSk7CiAJCWlmIChyYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwppbmRleCAyOTJiNjBkLi5mZjRhNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYworKysgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGFzbS9rdm1fdmlydGlvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjZGVmaW5lIFZJUlRJT19TVUJDT0RFXzY0IDB4MEQwMAogCkBAIC0yNDEsMTAgKzI0Miw3IEBACiAgKiBUaGUgcm9vdCBkZXZpY2UgZm9yIHRoZSBrdm0gdmlydGlvIGRldmljZXMuCiAgKiBUaGlzIG1ha2VzIHRoZW0gYXBwZWFyIGFzIC9zeXMvZGV2aWNlcy9rdm1fczM5MC8wLDEsMiBub3QgL3N5cy9kZXZpY2VzLzAsMSwyLgogICovCi1zdGF0aWMgc3RydWN0IGRldmljZSBrdm1fcm9vdCA9IHsKLQkucGFyZW50ID0gTlVMTCwKLQkuYnVzX2lkID0gImt2bV9zMzkwIiwKLX07CitzdGF0aWMgc3RydWN0IGRldmljZSAqa3ZtX3Jvb3Q7CiAKIC8qCiAgKiBhZGRzIGEgbmV3IGRldmljZSBhbmQgcmVnaXN0ZXIgaXQgd2l0aCB2aXJ0aW8KQEAgLTI2MSw3ICsyNTksNyBAQAogCQlyZXR1cm47CiAJfQogCi0Ja2Rldi0+dmRldi5kZXYucGFyZW50ID0gJmt2bV9yb290OworCWtkZXYtPnZkZXYuZGV2LnBhcmVudCA9IGt2bV9yb290OwogCWtkZXYtPnZkZXYuaWQuZGV2aWNlID0gZC0+dHlwZTsKIAlrZGV2LT52ZGV2LmNvbmZpZyA9ICZrdm1fdnFfY29uZmlnc3BhY2Vfb3BzOwogCWtkZXYtPmRlc2MgPSBkOwpAQCAtMzE3LDE1ICszMTUsMTYgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfS1ZNKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZrdm1fcm9vdCk7Ci0JaWYgKHJjKSB7CisJa3ZtX3Jvb3QgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJrdm1fczM5MCIpOworCWlmIChJU19FUlIoa3ZtX3Jvb3QpKSB7CisJCXJjID0gUFRSX0VSUihrdm1fcm9vdCk7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGt2bV9zMzkwIHJvb3QgZGV2aWNlIik7CiAJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IHZtZW1fYWRkX21hcHBpbmcoUEZOX1BIWVMobWF4X3BmbiksIFBBR0VfU0laRSk7CiAJaWYgKHJjKSB7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZrdm1fcm9vdCk7CisJCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3Rlcihrdm1fcm9vdCk7CiAJCXJldHVybiByYzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggZTEwYWM5YS4uZjVlNjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKQEAgLTI5OSw3ICsyOTksNyBAQAogCQlwcm9iZV9lcnJvcihjZ2Rldik7CiAJCXB1dF9kZXZpY2UoJmNnZGV2LT5kZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZGRfZmlsZXMgZmFpbGVkICVzICVzIEV4aXQgTGluZSAlZCBcbiIsCi0JCQljZ2Rldi0+Y2RldlswXS0+ZGV2LmJ1c19pZCxfX2Z1bmNfXyxfX0xJTkVfXyk7CisJCQlkZXZfbmFtZSgmY2dkZXYtPmNkZXZbMF0tPmRldiksIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAicHJvYmV4JWQiLCByYyk7CiAJCXJldHVybiByYzsKIAl9CkBAIC01ODQsNyArNTg0LDcgQEAKIAlpZiAoIWNkZXYtPmRldi5kcml2ZXJfZGF0YSkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNsYXc6IHVuc29saWNpdGVkIGludGVycnVwdCBmb3IgZGV2aWNlOiIKIAkJIAkiJXMgcmVjZWl2ZWQgYy0lMDJ4IGQtJTAyeFxuIiwKLQkJICAgICAgIGNkZXYtPmRldi5idXNfaWQsIGlyYi0+c2Nzdy5jbWQuY3N0YXQsCisJCSAgICAgICBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgaXJiLT5zY3N3LmNtZC5jc3RhdCwKIAkJICAgICAgIGlyYi0+c2Nzdy5jbWQuZHN0YXQpOwogCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAiYmFkaXJxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtXUklURV07CiAJZWxzZSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNsYXc6IENhbid0IGRldGVybWluZSBjaGFubmVsIGZvciAiCi0JCQkiaW50ZXJydXB0LCBkZXZpY2UgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQkJImludGVycnVwdCwgZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCUNMQVdfREJGX1RFWFQoMiwgdHJhY2UsICJiYWRjaGFuIik7CiAJCXJldHVybjsKIAl9CkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNsYXc6IHVuc29saWNpdGVkICIKIAkJCQkiaW50ZXJydXB0IGZvciBkZXZpY2U6IgogCQkJCSIlcyByZWNlaXZlZCBjLSUwMnggZC0lMDJ4XG4iLAotCQkJCWNkZXYtPmRldi5idXNfaWQsCisJCQkJZGV2X25hbWUoJmNkZXYtPmRldiksCiAJCQkJaXJiLT5zY3N3LmNtZC5jc3RhdCwKIAkJCQlpcmItPnNjc3cuY21kLmRzdGF0KTsKIAkJCXJldHVybjsKQEAgLTExMzYsMTkgKzExMzYsMjAgQEAKIAkJCWJyZWFrOwogCQljYXNlIC1FTk9ERVY6CiAJCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IE1pc3NpbmcgZGV2aWNlIGNhbGxlZCAiCi0JCQkJImZvciBJTyBFTk9ERVZcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQkJCSJmb3IgSU8gRU5PREVWXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCQlicmVhazsKIAkJY2FzZSAtRUlPOgogCQkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBTdGF0dXMgcGVuZGluZy4uLiBFSU8gXG4iLAotCQkJCWNkZXYtPmRldi5idXNfaWQpOworCQkJCWRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FSU5WQUw6CiAJCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IEludmFsaWQgRGV2IFN0YXRlIEVJTlZBTCBcbiIsCi0JCQkJY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IFVua25vd24gZXJyb3IgaW4gIgotCQkJCSAiRG9fSU8gJWRcbiIsY2Rldi0+ZGV2LmJ1c19pZCwgcmV0dXJuX2NvZGUpOworCQkJCSAiRG9fSU8gJWRcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpLAorCQkJICAgICAgIHJldHVybl9jb2RlKTsKIAkJfQogCX0KIAlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiY2N3cmV0Iik7CkBAIC0yODQ4LDExICsyODQ5LDExIEBACiAJc3RydWN0IGNoYmsgKnBfY2g7CiAJc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwogCi0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIGNkZXYtPmRldi5idXNfaWQpOworCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAiJXMiLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJcHJpdnB0ci0+Y2hhbm5lbFtpXS5mbGFnICA9IGkrMTsgICAvKiBSZWFkIGlzIDEgV3JpdGUgaXMgMiAqLwogCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtpXTsKIAlwX2NoLT5jZGV2ID0gY2RldjsKLQlzbnByaW50ZihwX2NoLT5pZCwgQ0xBV19JRF9TSVpFLCAiY2wtJXMiLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwlzbnByaW50ZihwX2NoLT5pZCwgQ0xBV19JRF9TSVpFLCAiY2wtJXMiLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJY2N3X2RldmljZV9nZXRfaWQoY2RldiwgJmRldl9pZCk7CiAJcF9jaC0+ZGV2bm8gPSBkZXZfaWQuZGV2bm87CiAJaWYgKChwX2NoLT5pcmIgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGlyYiksR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKQEAgLTI4NzksNyArMjg4MCw4IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJjbGF3OiBhZGQgZm9yICVzXG4iLGNnZGV2LT5jZGV2W1JFQURdLT5kZXYuYnVzX2lkKTsKKwlwcmludGsoS0VSTl9JTkZPICJjbGF3OiBhZGQgZm9yICVzXG4iLAorCSAgICAgICBkZXZfbmFtZSgmY2dkZXYtPmNkZXZbUkVBRF0tPmRldikpOwogCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJuZXdfZGV2Iik7CiAJcHJpdnB0ciA9IGNnZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJY2dkZXYtPmNkZXZbUkVBRF0tPmRldi5kcml2ZXJfZGF0YSA9IHByaXZwdHI7CkBAIC0yOTAzLDE0ICsyOTA1LDE2IEBACiAJaWYgKHJldCAhPSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSJjbGF3OiBjY3dfZGV2aWNlX3NldF9vbmxpbmUgJXMgUkVBRCBmYWlsZWQgIgotCQkJIndpdGggcmV0ID0gJWRcbiIsY2dkZXYtPmNkZXZbUkVBRF0tPmRldi5idXNfaWQscmV0KTsKKwkJICAgICAgICJ3aXRoIHJldCA9ICVkXG4iLCBkZXZfbmFtZSgmY2dkZXYtPmNkZXZbUkVBRF0tPmRldiksCisJCSAgICAgICByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAJcmV0ID0gY2N3X2RldmljZV9zZXRfb25saW5lKGNnZGV2LT5jZGV2W1dSSVRFXSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSJjbGF3OiBjY3dfZGV2aWNlX3NldF9vbmxpbmUgJXMgV1JJVEUgZmFpbGVkICIKLQkJCSJ3aXRoIHJldCA9ICVkXG4iLGNnZGV2LT5jZGV2W1dSSVRFXS0+ZGV2LmJ1c19pZCwgcmV0KTsKKwkJICAgICAgICJ3aXRoIHJldCA9ICVkXG4iLCBkZXZfbmFtZSgmY2dkZXYtPmNkZXZbV1JJVEVdLT5kZXYpLAorCQkgICAgICAgcmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCWRldiA9IGFsbG9jX25ldGRldigwLCJjbGF3JWQiLGNsYXdfaW5pdF9uZXRkZXZpY2UpOwpAQCAtMjk4Niw3ICsyOTkwLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlpbnQJcmV0OwogCi0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIGNnZGV2LT5kZXYuYnVzX2lkKTsKKwlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgZGV2X25hbWUoJmNnZGV2LT5kZXYpKTsKIAlwcml2ID0gY2dkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzAxNiwxMSArMzAyMCwxMSBAQAogCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdjsKIAogCUJVR19PTighY2dkZXYpOwotCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAiJXMiLCBjZ2Rldi0+ZGV2LmJ1c19pZCk7CisJQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIGRldl9uYW1lKCZjZ2Rldi0+ZGV2KSk7CiAJcHJpdiA9IGNnZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJQlVHX09OKCFwcml2KTsKIAlwcmludGsoS0VSTl9JTkZPICJjbGF3OiAlcygpIGNhbGxlZCAlcyB3aWxsIGJlIHJlbW92ZWQuXG4iLAotCQkJX19mdW5jX18sY2dkZXYtPmNkZXZbMF0tPmRldi5idXNfaWQpOworCQkJX19mdW5jX18sIGRldl9uYW1lKCZjZ2Rldi0+Y2RldlswXS0+ZGV2KSk7CiAJaWYgKGNnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpCiAJCWNsYXdfc2h1dGRvd25fZGV2aWNlKGNnZGV2KTsKIAljbGF3X3JlbW92ZV9maWxlcygmY2dkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuaCBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oCmluZGV4IDFhODlkOTguLjAwNTA3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oCkBAIC04NSw3ICs4NSw3IEBACiAjZGVmaW5lIENMQVdfTUFYX0RFViAgICAgICAgICAgIDI1NiAgICAgICAgLyogICAgICBtYXggY2xhdyBkZXZpY2VzICAgICAgICAgICovCiAjZGVmaW5lIE1BWF9OQU1FX0xFTiAgICAgICAgICAgIDggICAgICAgICAgLyogaG9zdCBuYW1lLCBhZGFwdGVyIG5hbWUgbGVuZ3RoICovCiAjZGVmaW5lIENMQVdfRlJBTUVfU0laRSAgICAgICAgIDQwOTYKLSNkZWZpbmUgQ0xBV19JRF9TSVpFICAgICAgICAgICAgQlVTX0lEX1NJWkUrMworI2RlZmluZSBDTEFXX0lEX1NJWkUJCTIwKzMKIAogLyogc3RhdGUgbWFjaGluZSBjb2RlcyB1c2VkIGluIGNsYXdfaXJxX2hhbmRsZXIgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMKaW5kZXggYjExZmVjMi4uYTRlMjk4MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uYwpAQCAtMjc3LDE4ICsyNzcsMTggQEAKIAogCUNUQ01fREJGX1RFWFRfKEVSUk9SLCBDVENfREJGX1dBUk4sCiAJCQkiaXJiIGVycm9yICVsZCBvbiBkZXZpY2UgJXNcbiIsCi0JCQkJUFRSX0VSUihpcmIpLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQlQVFJfRVJSKGlyYiksIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAogCXN3aXRjaCAoUFRSX0VSUihpcmIpKSB7CiAJY2FzZSAtRUlPOgotCQljdGNtX3ByX3dhcm4oImkvby1lcnJvciBvbiBkZXZpY2UgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQljdGNtX3ByX3dhcm4oImkvby1lcnJvciBvbiBkZXZpY2UgJXNcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSAtRVRJTUVET1VUOgotCQljdGNtX3ByX3dhcm4oInRpbWVvdXQgb24gZGV2aWNlICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJY3RjbV9wcl93YXJuKCJ0aW1lb3V0IG9uIGRldmljZSAlc1xuIiwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQljdGNtX3ByX3dhcm4oInVua25vd24gZXJyb3IgJWxkIG9uIGRldmljZSAlc1xuIiwKLQkJCQlQVFJfRVJSKGlyYiksIGNkZXYtPmRldi5idXNfaWQpOworCQkJCVBUUl9FUlIoaXJiKSwgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCX0KIAlyZXR1cm4gUFRSX0VSUihpcmIpOwogfQpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKIAlpbnQgZHN0YXQ7CiAKIAlDVENNX0RCRl9URVhUXyhUUkFDRSwgQ1RDX0RCRl9ERUJVRywKLQkJIkVudGVyICVzKCVzKSIsIENUQ01fRlVOVEFJTCwgJmNkZXYtPmRldi5idXNfaWQpOworCQkiRW50ZXIgJXMoJXMpIiwgQ1RDTV9GVU5UQUlMLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAKIAlpZiAoY3RjbV9jaGVja19pcmJfZXJyb3IoY2RldiwgaXJiKSkKIAkJcmV0dXJuOwpAQCAtMTIwOCwxNCArMTIwOCwxNCBAQAogCQljaCA9IHByaXYtPmNoYW5uZWxbV1JJVEVdOwogCWVsc2UgewogCQljdGNtX3ByX2VycigiY3RjbTogQ2FuJ3QgZGV0ZXJtaW5lIGNoYW5uZWwgZm9yIGludGVycnVwdCwgIgotCQkJICAgImRldmljZSAlc1xuIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQkgICAiZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCXJldHVybjsKIAl9CiAKIAlkZXYgPSBjaC0+bmV0ZGV2OwogCWlmIChkZXYgPT0gTlVMTCkgewogCQljdGNtX3ByX2NyaXQoImN0Y206ICVzIGRldj1OVUxMIGJ1c19pZD0lcywgY2g9MHglcFxuIiwKLQkJCQlfX2Z1bmNfXywgY2Rldi0+ZGV2LmJ1c19pZCwgY2gpOworCQkJCV9fZnVuY19fLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgY2gpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCiAJQ1RDTV9EQkZfVEVYVF8oU0VUVVAsIENUQ19EQkZfSU5GTywKIAkJIiVzKCVzKSwgdHlwZSAlZCwgcHJvdG8gJWQiLAotCQkJX19mdW5jX18sIGNkZXYtPmRldi5idXNfaWQsCXR5cGUsIHByaXYtPnByb3RvY29sKTsKKwkJCV9fZnVuY19fLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwJdHlwZSwgcHJpdi0+cHJvdG9jb2wpOwogCiAJY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbCksIEdGUF9LRVJORUwpOwogCWlmIChjaCA9PSBOVUxMKQpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIAkJCQkJZ290byBub21lbV9yZXR1cm47CiAKIAljaC0+Y2RldiA9IGNkZXY7Ci0Jc25wcmludGYoY2gtPmlkLCBDVENNX0lEX1NJWkUsICJjaC0lcyIsIGNkZXYtPmRldi5idXNfaWQpOworCXNucHJpbnRmKGNoLT5pZCwgQ1RDTV9JRF9TSVpFLCAiY2gtJXMiLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJY2gtPnR5cGUgPSB0eXBlOwogCiAJLyoqCkBAIC0xNTE4LDggKzE1MTgsOCBAQAogCiAJdHlwZSA9IGdldF9jaGFubmVsX3R5cGUoJmNkZXYwLT5pZCk7CiAKLQlzbnByaW50ZihyZWFkX2lkLCBDVENNX0lEX1NJWkUsICJjaC0lcyIsIGNkZXYwLT5kZXYuYnVzX2lkKTsKLQlzbnByaW50Zih3cml0ZV9pZCwgQ1RDTV9JRF9TSVpFLCAiY2gtJXMiLCBjZGV2MS0+ZGV2LmJ1c19pZCk7CisJc25wcmludGYocmVhZF9pZCwgQ1RDTV9JRF9TSVpFLCAiY2gtJXMiLCBkZXZfbmFtZSgmY2RldjAtPmRldikpOworCXNucHJpbnRmKHdyaXRlX2lkLCBDVENNX0lEX1NJWkUsICJjaC0lcyIsIGRldl9uYW1lKCZjZGV2MS0+ZGV2KSk7CiAKIAlyZXQgPSBhZGRfY2hhbm5lbChjZGV2MCwgdHlwZSwgcHJpdik7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmggYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbWFpbi5oCmluZGV4IDhlMTBlZTguLmQ3N2NjZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uaApAQCAtMTA0LDcgKzEwNCw3IEBACiAjZGVmaW5lIFJFQUQJCQkwCiAjZGVmaW5lIFdSSVRFCQkJMQogCi0jZGVmaW5lIENUQ01fSURfU0laRQkJQlVTX0lEX1NJWkUrMworI2RlZmluZSBDVENNX0lEX1NJWkUJCTIwKzMKIAogc3RydWN0IGN0Y21fcHJvZmlsZSB7CiAJdW5zaWduZWQgbG9uZyBtYXhtdWx0aTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tcGMuYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tcGMuYwppbmRleCBjYmU0NzA0Li4xOWY1ZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbXBjLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21wYy5jCkBAIC0xNjczLDcgKzE2NzMsNyBAQAogCiBkb25lOgogCWlmIChyYykgewotCQljdGNtX3ByX2luZm8oImN0Y21wYwkgICA6ICAlcygpIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJY3RjbV9wcl9pbmZvKCJjdGNtcGMJICAgOiAgJXMoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJcHJpdi0+eGlkLT54aWQyX2ZsYWcyID0gMHg0MDsKIAkJZ3JwLT5zYXZlZF94aWQyLT54aWQyX2ZsYWcyID0gMHg0MDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwppbmRleCA5YmNmYTA0Li4wODI1YmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjOwogCi0JTENTX0RCRl9URVhUXyg0LHRyYWNlLCJzc2NoJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCUxDU19EQkZfVEVYVF8oNCwgdHJhY2UsInNzY2glcyIsIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiAJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoYW5uZWwtPmNjd2RldiwKIAkJCSAgICAgIGNoYW5uZWwtPmNjd3MgKyBjaGFubmVsLT5pb19pZHgsIDAsIDAsCkBAIC01MDEsNyArNTAxLDggQEAKIAkJY2hhbm5lbC0+c3RhdGUgPSBMQ1NfQ0hfU1RBVEVfUlVOTklORzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiAJaWYgKHJjKSB7Ci0JCUxDU19EQkZfVEVYVF8oNCx0cmFjZSwiZXNzaCVzIiwgY2hhbm5lbC0+Y2N3ZGV2LT5kZXYuYnVzX2lkKTsKKwkJTENTX0RCRl9URVhUXyg0LHRyYWNlLCJlc3NoJXMiLAorCQkJICAgICAgZGV2X25hbWUoJmNoYW5uZWwtPmNjd2Rldi0+ZGV2KSk7CiAJCVBSSU5UX0VSUigiRXJyb3IgaW4gc3RhcnRpbmcgY2hhbm5lbCwgcmM9JWQhXG4iLCByYyk7CiAJfQogCXJldHVybiByYzsKQEAgLTUxNCwxMiArNTE1LDEzIEBACiAJaW50IHJjOwogCiAJTENTX0RCRl9URVhUKDQsdHJhY2UsImNsZWFyY2giKTsKLQlMQ1NfREJGX1RFWFRfKDQsdHJhY2UsIiVzIiwgY2hhbm5lbC0+Y2N3ZGV2LT5kZXYuYnVzX2lkKTsKKwlMQ1NfREJGX1RFWFRfKDQsIHRyYWNlLCAiJXMiLCBkZXZfbmFtZSgmY2hhbm5lbC0+Y2N3ZGV2LT5kZXYpKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwogCXJjID0gY2N3X2RldmljZV9jbGVhcihjaGFubmVsLT5jY3dkZXYsIChhZGRyX3QpIGNoYW5uZWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKIAlpZiAocmMpIHsKLQkJTENTX0RCRl9URVhUXyg0LHRyYWNlLCJlY3NjJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCQlMQ1NfREJGX1RFWFRfKDQsIHRyYWNlLCAiZWNzYyVzIiwKKwkJCSAgICAgIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCQlyZXR1cm4gcmM7CiAJfQogCXdhaXRfZXZlbnQoY2hhbm5lbC0+d2FpdF9xLCAoY2hhbm5lbC0+c3RhdGUgPT0gTENTX0NIX1NUQVRFX0NMRUFSRUQpKTsKQEAgLTU0MCwxMyArNTQyLDE0IEBACiAJaWYgKGNoYW5uZWwtPnN0YXRlID09IExDU19DSF9TVEFURV9TVE9QUEVEKQogCQlyZXR1cm4gMDsKIAlMQ1NfREJGX1RFWFQoNCx0cmFjZSwiaGFsdHNjaCIpOwotCUxDU19EQkZfVEVYVF8oNCx0cmFjZSwiJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCUxDU19EQkZfVEVYVF8oNCwgdHJhY2UsICIlcyIsIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX0lOSVQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKIAlyYyA9IGNjd19kZXZpY2VfaGFsdChjaGFubmVsLT5jY3dkZXYsIChhZGRyX3QpIGNoYW5uZWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKIAlpZiAocmMpIHsKLQkJTENTX0RCRl9URVhUXyg0LHRyYWNlLCJlaHNjJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCQlMQ1NfREJGX1RFWFRfKDQsIHRyYWNlLCAiZWhzYyVzIiwKKwkJCSAgICAgIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCQlyZXR1cm4gcmM7CiAJfQogCS8qIEFzeW5jaHJvbm91cyBoYWx0IGluaXRpYWx0ZWQuIFdhaXQgZm9yIGl0cyBjb21wbGV0aW9uLiAqLwpAQCAtNjMyLDEwICs2MzUsMTEgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGNoYW5uZWwtPmNjd3NbY2hhbm5lbC0+aW9faWR4XS5mbGFncyAmIENDV19GTEFHX1NVU1BFTkQpCiAJCXJldHVybiAwOwotCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICJyc2NoJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICJyc2NoJXMiLCBkZXZfbmFtZSgmY2hhbm5lbC0+Y2N3ZGV2LT5kZXYpKTsKIAlyYyA9IGNjd19kZXZpY2VfcmVzdW1lKGNoYW5uZWwtPmNjd2Rldik7CiAJaWYgKHJjKSB7Ci0JCUxDU19EQkZfVEVYVF8oNCwgdHJhY2UsICJlcnNjJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOworCQlMQ1NfREJGX1RFWFRfKDQsIHRyYWNlLCAiZXJzYyVzIiwKKwkJCSAgICAgIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCQlQUklOVF9FUlIoIkVycm9yIGluIGxjc19yZXN1bWVfY2hhbm5lbDogcmM9JWRcbiIscmMpOwogCX0gZWxzZQogCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9SVU5OSU5HOwpAQCAtMTMwMiwxOCArMTMwNiwxOCBAQAogCiAJc3dpdGNoIChQVFJfRVJSKGlyYikpIHsKIAljYXNlIC1FSU86Ci0JCVBSSU5UX1dBUk4oImkvby1lcnJvciBvbiBkZXZpY2UgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQlQUklOVF9XQVJOKCJpL28tZXJyb3Igb24gZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCUxDU19EQkZfVEVYVCgyLCB0cmFjZSwgImNraXJiZXJyIik7CiAJCUxDU19EQkZfVEVYVF8oMiwgdHJhY2UsICIgIHJjJWQiLCAtRUlPKTsKIAkJYnJlYWs7CiAJY2FzZSAtRVRJTUVET1VUOgotCQlQUklOVF9XQVJOKCJ0aW1lb3V0IG9uIGRldmljZSAlc1xuIiwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCVBSSU5UX1dBUk4oInRpbWVvdXQgb24gZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCUxDU19EQkZfVEVYVCgyLCB0cmFjZSwgImNraXJiZXJyIik7CiAJCUxDU19EQkZfVEVYVF8oMiwgdHJhY2UsICIgIHJjJWQiLCAtRVRJTUVET1VUKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUFJJTlRfV0FSTigidW5rbm93biBlcnJvciAlbGQgb24gZGV2aWNlICVzXG4iLCBQVFJfRVJSKGlyYiksCi0JCQkgICBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJCSAgIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJTENTX0RCRl9URVhUKDIsIHRyYWNlLCAiY2tpcmJlcnIiKTsKIAkJTENTX0RCRl9URVhUKDIsIHRyYWNlLCAiICByYz8/PyIpOwogCX0KQEAgLTEzOTAsNyArMTM5NCw3IEBACiAKIAljc3RhdCA9IGlyYi0+c2Nzdy5jbWQuY3N0YXQ7CiAJZHN0YXQgPSBpcmItPnNjc3cuY21kLmRzdGF0OwotCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICJSaW50JXMiLGNkZXYtPmRldi5idXNfaWQpOworCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICJSaW50JXMiLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJTENTX0RCRl9URVhUXyg1LCB0cmFjZSwgIiU0eCU0eCIsIGlyYi0+c2Nzdy5jbWQuY3N0YXQsCiAJCSAgICAgIGlyYi0+c2Nzdy5jbWQuZHN0YXQpOwogCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICIlNHglNHgiLCBpcmItPnNjc3cuY21kLmZjdGwsCkBAIC0xNDAwLDcgKzE0MDQsNyBAQAogCXJjID0gbGNzX2dldF9wcm9ibGVtKGNkZXYsIGlyYik7CiAJaWYgKHJjIHx8IChkc3RhdCAmIERFVl9TVEFUX1VOSVRfRVhDRVApKSB7CiAJCVBSSU5UX1dBUk4oImNoZWNrIG9uIGRldmljZSAlcywgZHN0YXQ9MHglWCwgY3N0YXQ9MHglWCBcbiIsCi0JCQkgICAgY2Rldi0+ZGV2LmJ1c19pZCwgZHN0YXQsIGNzdGF0KTsKKwkJCSAgICBkZXZfbmFtZSgmY2Rldi0+ZGV2KSwgZHN0YXQsIGNzdGF0KTsKIAkJaWYgKHJjKSB7CiAJCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9FUlJPUjsKIAkJfQpAQCAtMTQ2Myw3ICsxNDY3LDcgQEAKIAlpbnQgcmM7CiAKIAljaGFubmVsID0gKHN0cnVjdCBsY3NfY2hhbm5lbCAqKSBkYXRhOwotCUxDU19EQkZfVEVYVF8oNSwgdHJhY2UsICJ0bGV0JXMiLGNoYW5uZWwtPmNjd2Rldi0+ZGV2LmJ1c19pZCk7CisJTENTX0RCRl9URVhUXyg1LCB0cmFjZSwgInRsZXQlcyIsIGRldl9uYW1lKCZjaGFubmVsLT5jY3dkZXYtPmRldikpOwogCiAJLyogQ2hlY2sgZm9yIHByb2Nlc3NlZCBidWZmZXJzLiAqLwogCWlvYiA9IGNoYW5uZWwtPmlvYjsKQEAgLTIyNDQsNyArMjI0OCw3IEBACiAJCXJldHVybiAwOwogCUxDU19EQkZfVEVYVCg0LCB0cmFjZSwgInJlY292ZXIyIik7CiAJZ2RldiA9IGNhcmQtPmdkZXY7Ci0JUFJJTlRfV0FSTigiUmVjb3Zlcnkgb2YgZGV2aWNlICVzIHN0YXJ0ZWQuLi5cbiIsIGdkZXYtPmRldi5idXNfaWQpOworCVBSSU5UX1dBUk4oIlJlY292ZXJ5IG9mIGRldmljZSAlcyBzdGFydGVkLi4uXG4iLCBkZXZfbmFtZSgmZ2Rldi0+ZGV2KSk7CiAJcmMgPSBfX2xjc19zaHV0ZG93bl9kZXZpY2UoZ2RldiwgMSk7CiAJcmMgPSBsY3NfbmV3X2RldmljZShnZGV2KTsKIAlpZiAoIXJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCA5MjQyYjVhLi4wZmVhNTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtMTcyNCw3ICsxNzI0LDcgQEAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX2Z1bmNfXyk7CiAKIAlpZiAoZGV2KSB7Ci0JCXNucHJpbnRmKGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIm5ldCVzIiwgbmRldi0+bmFtZSk7CisJCWRldl9zZXRfbmFtZShkZXYsICJuZXQlcyIsIG5kZXYtPm5hbWUpOwogCQlkZXYtPmJ1cyA9ICZpdWN2X2J1czsKIAkJZGV2LT5wYXJlbnQgPSBpdWN2X3Jvb3Q7CiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaAppbmRleCBiZjhhNzVjLi5hZjZkNjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKQEAgLTkwLDExICs5MCwxMSBAQAogI2RlZmluZSBDQVJEX1JERVYoY2FyZCkgY2FyZC0+cmVhZC5jY3dkZXYKICNkZWZpbmUgQ0FSRF9XREVWKGNhcmQpIGNhcmQtPndyaXRlLmNjd2RldgogI2RlZmluZSBDQVJEX0RERVYoY2FyZCkgY2FyZC0+ZGF0YS5jY3dkZXYKLSNkZWZpbmUgQ0FSRF9CVVNfSUQoY2FyZCkgY2FyZC0+Z2Rldi0+ZGV2LmJ1c19pZAotI2RlZmluZSBDQVJEX1JERVZfSUQoY2FyZCkgY2FyZC0+cmVhZC5jY3dkZXYtPmRldi5idXNfaWQKLSNkZWZpbmUgQ0FSRF9XREVWX0lEKGNhcmQpIGNhcmQtPndyaXRlLmNjd2Rldi0+ZGV2LmJ1c19pZAotI2RlZmluZSBDQVJEX0RERVZfSUQoY2FyZCkgY2FyZC0+ZGF0YS5jY3dkZXYtPmRldi5idXNfaWQKLSNkZWZpbmUgQ0hBTk5FTF9JRChjaGFubmVsKSBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQKKyNkZWZpbmUgQ0FSRF9CVVNfSUQoY2FyZCkgZGV2X25hbWUoJmNhcmQtPmdkZXYtPmRldikKKyNkZWZpbmUgQ0FSRF9SREVWX0lEKGNhcmQpIGRldl9uYW1lKCZjYXJkLT5yZWFkLmNjd2Rldi0+ZGV2KQorI2RlZmluZSBDQVJEX1dERVZfSUQoY2FyZCkgZGV2X25hbWUoJmNhcmQtPndyaXRlLmNjd2Rldi0+ZGV2KQorI2RlZmluZSBDQVJEX0RERVZfSUQoY2FyZCkgZGV2X25hbWUoJmNhcmQtPmRhdGEuY2N3ZGV2LT5kZXYpCisjZGVmaW5lIENIQU5ORUxfSUQoY2hhbm5lbCkgZGV2X25hbWUoJmNoYW5uZWwtPmNjd2Rldi0+ZGV2KQogCiAvKioKICAqIGNhcmQgc3R1ZmYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCBjN2FiMWI4Li43ZGU0MTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC03NDUsNyArNzQ1LDcgQEAKIAkJICAgICBTQ0hOX1NUQVRfUFJPVF9DSEVDSyB8IFNDSE5fU1RBVF9QUk9HX0NIRUNLKSkgewogCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiQ0dFTkNISyIpOwogCQlQUklOVF9XQVJOKCJjaGVjayBvbiBkZXZpY2UgJXMsIGRzdGF0PXgleCwgY3N0YXQ9eCV4ICIsCi0JCQkgICBjZGV2LT5kZXYuYnVzX2lkLCBkc3RhdCwgY3N0YXQpOworCQkJICAgZGV2X25hbWUoJmNkZXYtPmRldiksIGRzdGF0LCBjc3RhdCk7CiAJCXByaW50X2hleF9kdW1wKEtFUk5fV0FSTklORywgInFldGg6IGlyYiAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCiAJCQkJMTYsIDEsIGlyYiwgNjQsIDEpOwogCQlyZXR1cm4gMTsKQEAgLTc2MCw3ICs3NjAsNyBAQAogCQlpZiAoc2Vuc2VbU0VOU0VfQ09NTUFORF9SRUpFQ1RfQllURV0gJgogCQkgICAgU0VOU0VfQ09NTUFORF9SRUpFQ1RfRkxBRykgewogCQkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIkNNRFJFSmkiKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIDE7CiAJCX0KIAkJaWYgKChzZW5zZVsyXSA9PSAweGFmKSAmJiAoc2Vuc2VbM10gPT0gMHhmZSkpIHsKIAkJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJBRkZFIik7CkBAIC03ODQsMTIgKzc4NCwxMiBAQAogCiAJc3dpdGNoIChQVFJfRVJSKGlyYikpIHsKIAljYXNlIC1FSU86Ci0JCVBSSU5UX1dBUk4oImkvby1lcnJvciBvbiBkZXZpY2UgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOworCQlQUklOVF9XQVJOKCJpL28tZXJyb3Igb24gZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAJCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDIsICJja2lyYmVyciIpOwogCQlRRVRIX0RCRl9URVhUXyhUUkFDRSwgMiwgIiAgcmMlZCIsIC1FSU8pOwogCQlicmVhazsKIAljYXNlIC1FVElNRURPVVQ6Ci0JCVBSSU5UX1dBUk4oInRpbWVvdXQgb24gZGV2aWNlICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJUFJJTlRfV0FSTigidGltZW91dCBvbiBkZXZpY2UgJXNcbiIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKIAkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgImNraXJiZXJyIik7CiAJCVFFVEhfREJGX1RFWFRfKFRSQUNFLCAyLCAiICByYyVkIiwgLUVUSU1FRE9VVCk7CiAJCWlmIChpbnRwYXJtID09IFFFVEhfUkNEX1BBUk0pIHsKQEAgLTgwMyw3ICs4MDMsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlQUklOVF9XQVJOKCJ1bmtub3duIGVycm9yICVsZCBvbiBkZXZpY2UgJXNcbiIsIFBUUl9FUlIoaXJiKSwKLQkJCSAgIGNkZXYtPmRldi5idXNfaWQpOworCQkJICAgZGV2X25hbWUoJmNkZXYtPmRldikpOwogCQlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAiY2tpcmJlcnIiKTsKIAkJUUVUSF9EQkZfVEVYVChUUkFDRSwgMiwgIiAgcmM/Pz8iKTsKIAl9CkBAIC04ODQsNiArODg0LDcgQEAKIAkJfQogCQlyYyA9IHFldGhfZ2V0X3Byb2JsZW0oY2RldiwgaXJiKTsKIAkJaWYgKHJjKSB7CisJCQlxZXRoX2NsZWFyX2lwYWNtZF9saXN0KGNhcmQpOwogCQkJcWV0aF9zY2hlZHVsZV9yZWNvdmVyeShjYXJkKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC00MDgxLDcgKzQwODIsNyBAQAogCWlmICghZ2V0X2RldmljZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCVFFVEhfREJGX1RFWFRfKFNFVFVQLCAyLCAiJXMiLCBnZGV2LT5kZXYuYnVzX2lkKTsKKwlRRVRIX0RCRl9URVhUXyhTRVRVUCwgMiwgIiVzIiwgZGV2X25hbWUoJmdkZXYtPmRldikpOwogCiAJY2FyZCA9IHFldGhfYWxsb2NfY2FyZCgpOwogCWlmICghY2FyZCkgewpAQCAtNDE0Nyw2ICs0MTQ4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmdkZXYtPmRldik7CiAKKwlRRVRIX0RCRl9URVhUKFNFVFVQLCAyLCAicmVtb3ZlZHYiKTsKIAlpZiAoY2FyZC0+ZGlzY2lwbGluZS5jY3dnZHJpdmVyKSB7CiAJCWNhcmQtPmRpc2NpcGxpbmUuY2N3Z2RyaXZlci0+cmVtb3ZlKGdkZXYpOwogCQlxZXRoX2NvcmVfZnJlZV9kaXNjaXBsaW5lKGNhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKaW5kZXggM2FjM2NjMS4uOTU1YmE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCkBAIC0zOTUsNyArMzk1LDggQEAKIAl9CiAJaWYgKGNhcmQtPnN0YXRlID09IENBUkRfU1RBVEVfU09GVFNFVFVQKSB7CiAJCXFldGhfbDJfcHJvY2Vzc192bGFucyhjYXJkLCAxKTsKLQkJcWV0aF9sMl9kZWxfYWxsX21jKGNhcmQpOworCQlpZiAoIWNhcmQtPnVzZV9oYXJkX3N0b3ApCisJCQlxZXRoX2wyX2RlbF9hbGxfbWMoY2FyZCk7CiAJCXFldGhfY2xlYXJfaXBhY21kX2xpc3QoY2FyZCk7CiAJCWNhcmQtPnN0YXRlID0gQ0FSRF9TVEFURV9IQVJEU0VUVVA7CiAJfQpAQCAtNTU5LDcgKzU2MCw4IEBACiAJCQkiZGV2aWNlICVzOiB4JXhcbiIsIENBUkRfQlVTX0lEKGNhcmQpLCByYyk7CiAJfQogCi0JaWYgKGNhcmQtPmluZm8uZ3Vlc3RsYW4pIHsKKwlpZiAoKGNhcmQtPmluZm8udHlwZSA9PSBRRVRIX0NBUkRfVFlQRV9JUUQpIHx8IAorCSAgICAoY2FyZC0+aW5mby5ndWVzdGxhbikpIHsKIAkJcmMgPSBxZXRoX3NldGFkcHBhcm1zX2NoYW5nZV9tYWNhZGRyKGNhcmQpOwogCQlpZiAocmMpIHsKIAkJCVFFVEhfREJGX01FU1NBR0UoMiwgImNvdWxkbid0IGdldCBNQUMgYWRkcmVzcyBvbiAiCkBAIC04MjUsNyArODI3LDYgQEAKIAl9CiAJY2FyZC0+ZGF0YS5zdGF0ZSA9IENIX1NUQVRFX1VQOwogCWNhcmQtPnN0YXRlID0gQ0FSRF9TVEFURV9VUDsKLQljYXJkLT5kZXYtPmZsYWdzIHw9IElGRl9VUDsKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCiAJaWYgKCFjYXJkLT5sYW5fb25saW5lICYmIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKQEAgLTg0MCw3ICs4NDEsNiBAQAogCiAJUUVUSF9EQkZfVEVYVChUUkFDRSwgNCwgInFldGhzdG9wIik7CiAJbmV0aWZfdHhfZGlzYWJsZShkZXYpOwotCWNhcmQtPmRldi0+ZmxhZ3MgJj0gfklGRl9VUDsKIAlpZiAoY2FyZC0+c3RhdGUgPT0gQ0FSRF9TVEFURV9VUCkKIAkJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX1NPRlRTRVRVUDsKIAlyZXR1cm4gMDsKQEAgLTExMzcsOSArMTEzNywxMyBAQAogCWlmICghcmMpCiAJCVBSSU5UX0lORk8oIkRldmljZSAlcyBzdWNjZXNzZnVsbHkgcmVjb3ZlcmVkIVxuIiwKIAkJCSAgIENBUkRfQlVTX0lEKGNhcmQpKTsKLQllbHNlCisJZWxzZSB7CisJCXJ0bmxfbG9jaygpOworCQlkZXZfY2xvc2UoY2FyZC0+ZGV2KTsKKwkJcnRubF91bmxvY2soKTsKIAkJUFJJTlRfSU5GTygiRGV2aWNlICVzIGNvdWxkIG5vdCBiZSByZWNvdmVyZWQhXG4iLAogCQkJICAgQ0FSRF9CVVNfSUQoY2FyZCkpOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKaW5kZXggZGQ3MmMzYy4uOTk1NDdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCkBAIC0yNzk1LDcgKzI3OTUsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAljYXJkLT5kYXRhLnN0YXRlID0gQ0hfU1RBVEVfVVA7CiAJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX1VQOwotCWNhcmQtPmRldi0+ZmxhZ3MgfD0gSUZGX1VQOwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKIAlpZiAoIWNhcmQtPmxhbl9vbmxpbmUgJiYgbmV0aWZfY2Fycmllcl9vayhkZXYpKQpAQCAtMjgwOSw3ICsyODA4LDYgQEAKIAogCVFFVEhfREJGX1RFWFQoVFJBQ0UsIDQsICJxZXRoc3RvcCIpOwogCW5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKLQljYXJkLT5kZXYtPmZsYWdzICY9IH5JRkZfVVA7CiAJaWYgKGNhcmQtPnN0YXRlID09IENBUkRfU1RBVEVfVVApCiAJCWNhcmQtPnN0YXRlID0gQ0FSRF9TVEFURV9TT0ZUU0VUVVA7CiAJcmV0dXJuIDA7CkBAIC0zMjE4LDkgKzMyMTYsMTMgQEAKIAlpZiAoIXJjKQogCQlQUklOVF9JTkZPKCJEZXZpY2UgJXMgc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCFcbiIsCiAJCQkgICBDQVJEX0JVU19JRChjYXJkKSk7Ci0JZWxzZQorCWVsc2UgeworCQlydG5sX2xvY2soKTsKKwkJZGV2X2Nsb3NlKGNhcmQtPmRldik7CisJCXJ0bmxfdW5sb2NrKCk7CiAJCVBSSU5UX0lORk8oIkRldmljZSAlcyBjb3VsZCBub3QgYmUgcmVjb3ZlcmVkIVxuIiwKIAkJCSAgIENBUkRfQlVTX0lEKGNhcmQpKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYyBiL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYwppbmRleCAzYzcxNDVkLi42NDM3MWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKKysrIGIvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCkBAIC0zMCw3ICszMCw3IEBACiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlzdHJuY3B5KGRldi0+YnVzX2lkLCBuYW1lLCBtaW4oc3RybGVuKG5hbWUpLCAoc2l6ZV90KUJVU19JRF9TSVpFKSk7CisJZGV2X3NldF9uYW1lKGRldiwgbmFtZSk7CiAJZGV2LT5yZWxlYXNlID0gczM5MF9yb290X2Rldl9yZWxlYXNlOwogCXJldCA9IGRldmljZV9yZWdpc3RlcihkZXYpOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCmluZGV4IDkwYWJmZDAuLjNiNTYyMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYwpAQCAtODgsMTEgKzg4LDEzIEBACiAJc3RybmNweSh6ZmNwX2RhdGEuaW5pdF9idXNpZCwgdG9rZW4sIEJVU19JRF9TSVpFKTsKIAogCXRva2VuID0gc3Ryc2VwKCZzdHIsICIsIik7Ci0JaWYgKCF0b2tlbiB8fCBzdHJpY3Rfc3RydG91bGwodG9rZW4sIDAsICZ6ZmNwX2RhdGEuaW5pdF93d3BuKSkKKwlpZiAoIXRva2VuIHx8IHN0cmljdF9zdHJ0b3VsbCh0b2tlbiwgMCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nICopICZ6ZmNwX2RhdGEuaW5pdF93d3BuKSkKIAkJZ290byBlcnJfb3V0OwogCiAJdG9rZW4gPSBzdHJzZXAoJnN0ciwgIiwiKTsKLQlpZiAoIXRva2VuIHx8IHN0cmljdF9zdHJ0b3VsbCh0b2tlbiwgMCwgJnpmY3BfZGF0YS5pbml0X2ZjcF9sdW4pKQorCWlmICghdG9rZW4gfHwgc3RyaWN0X3N0cnRvdWxsKHRva2VuLCAwLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcgKikgJnpmY3BfZGF0YS5pbml0X2ZjcF9sdW4pKQogCQlnb3RvIGVycl9vdXQ7CiAKIAlrZnJlZShzdHIpOwpAQCAtMTAwLDI0ICsxMDIsMTAgQEAKIAogIGVycl9vdXQ6CiAJa2ZyZWUoc3RyKTsKLQlwcl9lcnIoInpmY3A6IFBhcnNlIGVycm9yIGZvciBkZXZpY2UgcGFyYW1ldGVyIHN0cmluZyAlcywgIgotCSAgICAgICAiZGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIsIGRldnN0cik7CisJcHJfZXJyKCJ6ZmNwOiAlcyBpcyBub3QgYSB2YWxpZCBTQ1NJIGRldmljZVxuIiwgZGV2c3RyKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKnpmY3BfZ2V0X2FkYXB0ZXJfYnlfYnVzaWQoY2hhciAqYnVzX2lkKQotewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXB0ZXIsICZ6ZmNwX2RhdGEuYWRhcHRlcl9saXN0X2hlYWQsIGxpc3QpCi0JCWlmICgoc3RybmNtcChidXNfaWQsIGFkYXB0ZXItPmNjd19kZXZpY2UtPmRldi5idXNfaWQsCi0JCQkgICAgIEJVU19JRF9TSVpFKSA9PSAwKSAmJgotCQkgICAgIShhdG9taWNfcmVhZCgmYWRhcHRlci0+c3RhdHVzKSAmCi0JCSAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpKQotCQkgICAgcmV0dXJuIGFkYXB0ZXI7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB6ZmNwX2luaXRfZGV2aWNlX2NvbmZpZ3VyZSh2b2lkKQogewogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXI7CkBAIC0xNDEsNyArMTI5LDEyIEBACiAJCWdvdG8gb3V0X3VuaXQ7CiAJdXAoJnpmY3BfZGF0YS5jb25maWdfc2VtYSk7CiAJY2N3X2RldmljZV9zZXRfb25saW5lKGFkYXB0ZXItPmNjd19kZXZpY2UpOworCiAJemZjcF9lcnBfd2FpdChhZGFwdGVyKTsKKwl3YWl0X2V2ZW50KGFkYXB0ZXItPmVycF9kb25lX3dxaCwKKwkJICAgIShhdG9taWNfcmVhZCgmdW5pdC0+c3RhdHVzKSAmCisJCQkJWkZDUF9TVEFUVVNfVU5JVF9TQ1NJX1dPUktfUEVORElORykpOworCiAJZG93bigmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKIAl6ZmNwX3VuaXRfcHV0KHVuaXQpOwogb3V0X3VuaXQ6CkBAIC0xODAsOSArMTczLDkgQEAKIAlpZiAoIXpmY3BfZGF0YS5naWRfcG5fY2FjaGUpCiAJCWdvdG8gb3V0X2dpZF9jYWNoZTsKIAotCUlOSVRfTElTVF9IRUFEKCZ6ZmNwX2RhdGEuYWRhcHRlcl9saXN0X2hlYWQpOwotCUlOSVRfTElTVF9IRUFEKCZ6ZmNwX2RhdGEuYWRhcHRlcl9yZW1vdmVfbGgpOworCXpmY3BfZGF0YS53b3JrX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInpmY3Bfd3EiKTsKIAorCUlOSVRfTElTVF9IRUFEKCZ6ZmNwX2RhdGEuYWRhcHRlcl9saXN0X2hlYWQpOwogCXNlbWFfaW5pdCgmemZjcF9kYXRhLmNvbmZpZ19zZW1hLCAxKTsKIAlyd2xvY2tfaW5pdCgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIApAQCAtMTkzLDEzICsxODYsMTQgQEAKIAogCXJldHZhbCA9IG1pc2NfcmVnaXN0ZXIoJnpmY3BfY2ZkY19taXNjKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2VycigiemZjcDogcmVnaXN0cmF0aW9uIG9mIG1pc2MgZGV2aWNlIHpmY3BfY2ZkYyBmYWlsZWRcbiIpOworCQlwcl9lcnIoInpmY3A6IFJlZ2lzdGVyaW5nIHRoZSBtaXNjIGRldmljZSB6ZmNwX2NmZGMgZmFpbGVkXG4iKTsKIAkJZ290byBvdXRfbWlzYzsKIAl9CiAKIAlyZXR2YWwgPSB6ZmNwX2Njd19yZWdpc3RlcigpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJfZXJyKCJ6ZmNwOiBSZWdpc3RyYXRpb24gd2l0aCBjb21tb24gSS9PIGxheWVyIGZhaWxlZC5cbiIpOworCQlwcl9lcnIoInpmY3A6IFRoZSB6ZmNwIGRldmljZSBkcml2ZXIgY291bGQgbm90IHJlZ2lzdGVyIHdpdGggIgorCQkgICAgICAgInRoZSBjb21tb24gSS9PIGxheWVyXG4iKTsKIAkJZ290byBvdXRfY2N3X3JlZ2lzdGVyOwogCX0KIApAQCAtMjMxLDggKzIyNSw3IEBACiAgKgogICogUmV0dXJuczogcG9pbnRlciB0byB6ZmNwX3VuaXQgb3IgTlVMTAogICovCi1zdHJ1Y3QgemZjcF91bml0ICp6ZmNwX2dldF91bml0X2J5X2x1bihzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LAotCQkJCSAgICAgICBmY3BfbHVuX3QgZmNwX2x1bikKK3N0cnVjdCB6ZmNwX3VuaXQgKnpmY3BfZ2V0X3VuaXRfYnlfbHVuKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIHU2NCBmY3BfbHVuKQogewogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CiAKQEAgLTI1MSw3ICsyNDQsNyBAQAogICogUmV0dXJuczogcG9pbnRlciB0byB6ZmNwX3BvcnQgb3IgTlVMTAogICovCiBzdHJ1Y3QgemZjcF9wb3J0ICp6ZmNwX2dldF9wb3J0X2J5X3d3cG4oc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJd3duX3Qgd3dwbikKKwkJCQkJdTY0IHd3cG4pCiB7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIApAQCAtMjc2LDcgKzI2OSw3IEBACiAgKgogICogU2V0cyB1cCBzb21lIHVuaXQgaW50ZXJuYWwgc3RydWN0dXJlcyBhbmQgY3JlYXRlcyBzeXNmcyBlbnRyeS4KICAqLwotc3RydWN0IHpmY3BfdW5pdCAqemZjcF91bml0X2VucXVldWUoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCwgZmNwX2x1bl90IGZjcF9sdW4pCitzdHJ1Y3QgemZjcF91bml0ICp6ZmNwX3VuaXRfZW5xdWV1ZShzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCB1NjQgZmNwX2x1bikKIHsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwogCkBAIC0yOTAsNyArMjgzLDggQEAKIAl1bml0LT5wb3J0ID0gcG9ydDsKIAl1bml0LT5mY3BfbHVuID0gZmNwX2x1bjsKIAotCXNucHJpbnRmKHVuaXQtPnN5c2ZzX2RldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiMHglMDE2bGx4IiwgZmNwX2x1bik7CisJZGV2X3NldF9uYW1lKCZ1bml0LT5zeXNmc19kZXZpY2UsICIweCUwMTZsbHgiLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGZjcF9sdW4pOwogCXVuaXQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmcG9ydC0+c3lzZnNfZGV2aWNlOwogCXVuaXQtPnN5c2ZzX2RldmljZS5yZWxlYXNlID0gemZjcF9zeXNmc191bml0X3JlbGVhc2U7CiAJZGV2X3NldF9kcnZkYXRhKCZ1bml0LT5zeXNmc19kZXZpY2UsIHVuaXQpOwpAQCAtMzIzLDcgKzMxNyw2IEBACiAJfQogCiAJemZjcF91bml0X2dldCh1bml0KTsKLQl1bml0LT5zY3NpX2x1biA9IHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmdW5pdC0+ZmNwX2x1bik7CiAKIAl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ1bml0LT5saXN0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQpOwpAQCAtMzMyLDcgKzMyNSw2IEBACiAKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCi0JcG9ydC0+dW5pdHMrKzsKIAl6ZmNwX3BvcnRfZ2V0KHBvcnQpOwogCiAJcmV0dXJuIHVuaXQ7CkBAIC0zNTEsMTEgKzM0MywxMCBAQAogICovCiB2b2lkIHpmY3BfdW5pdF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQpCiB7Ci0JemZjcF91bml0X3dhaXQodW5pdCk7CisJd2FpdF9ldmVudCh1bml0LT5yZW1vdmVfd3EsIGF0b21pY19yZWFkKCZ1bml0LT5yZWZjb3VudCkgPT0gMCk7CiAJd3JpdGVfbG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CiAJbGlzdF9kZWwoJnVuaXQtPmxpc3QpOwogCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7Ci0JdW5pdC0+cG9ydC0+dW5pdHMtLTsKIAl6ZmNwX3BvcnRfcHV0KHVuaXQtPnBvcnQpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmdW5pdC0+c3lzZnNfZGV2aWNlLmtvYmosICZ6ZmNwX3N5c2ZzX3VuaXRfYXR0cnMpOwogCWRldmljZV91bnJlZ2lzdGVyKCZ1bml0LT5zeXNmc19kZXZpY2UpOwpAQCAtNDE2LDExICs0MDcsNiBAQAogCQltZW1wb29sX2Rlc3Ryb3koYWRhcHRlci0+cG9vbC5kYXRhX2dpZF9wbik7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZHVtbXlfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuOwotfQotCiAvKioKICAqIHpmY3Bfc3RhdHVzX3JlYWRfcmVmaWxsIC0gcmVmaWxsIHRoZSBsb25nIHJ1bm5pbmcgc3RhdHVzX3JlYWRfcmVxdWVzdHMKICAqIEBhZGFwdGVyOiBwdHIgdG8gc3RydWN0IHpmY3BfYWRhcHRlciBmb3Igd2hpY2ggdGhlIGJ1ZmZlcnMgc2hvdWxkIGJlIHJlZmlsbGVkCkBAIC00NTAsMTkgKzQzNiw2IEBACiAJCQkJCSAgICAgc3RhdF93b3JrKSk7CiB9CiAKLXN0YXRpYyBpbnQgemZjcF9uYW1lc2VydmVyX2VucXVldWUoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwotCi0JcG9ydCA9IHpmY3BfcG9ydF9lbnF1ZXVlKGFkYXB0ZXIsIDAsIFpGQ1BfU1RBVFVTX1BPUlRfV0tBLAotCQkJCSBaRkNQX0RJRF9ESVJFQ1RPUllfU0VSVklDRSk7Ci0JaWYgKElTX0VSUihwb3J0KSkKLQkJcmV0dXJuIFBUUl9FUlIocG9ydCk7Ci0JemZjcF9wb3J0X3B1dChwb3J0KTsKLQotCXJldHVybiAwOwotfQotCiAvKioKICAqIHpmY3BfYWRhcHRlcl9lbnF1ZXVlIC0gZW5xdWV1ZSBhIG5ldyBhZGFwdGVyIHRvIHRoZSBsaXN0CiAgKiBAY2N3X2RldmljZTogcG9pbnRlciB0byB0aGUgc3RydWN0IGNjX2RldmljZQpAQCAtNTA4LDcgKzQ4MSw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+ZXJwX2RvbmVfd3FoKTsKIAogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnBvcnRfcmVtb3ZlX2xoKTsKIAlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+ZXJwX3JlYWR5X2hlYWQpOwogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5lcnBfcnVubmluZ19oZWFkKTsKIApAQCAtNTE4LDcgKzQ5MCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnNhbl9kYmZfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnNjc2lfZGJmX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5yZWNfZGJmX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAKIAlyd2xvY2tfaW5pdCgmYWRhcHRlci0+ZXJwX2xvY2spOwogCXJ3bG9ja19pbml0KCZhZGFwdGVyLT5hYm9ydF9sb2NrKTsKQEAgLTUzNywyOCArNTA5LDE1IEBACiAJCQkgICAgICAgJnpmY3Bfc3lzZnNfYWRhcHRlcl9hdHRycykpCiAJCWdvdG8gc3lzZnNfZmFpbGVkOwogCi0JYWRhcHRlci0+Z2VuZXJpY19zZXJ2aWNlcy5wYXJlbnQgPSAmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2OwotCWFkYXB0ZXItPmdlbmVyaWNfc2VydmljZXMucmVsZWFzZSA9IHpmY3BfZHVtbXlfcmVsZWFzZTsKLQlzbnByaW50ZihhZGFwdGVyLT5nZW5lcmljX3NlcnZpY2VzLmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCSAiZ2VuZXJpY19zZXJ2aWNlcyIpOwotCi0JaWYgKGRldmljZV9yZWdpc3RlcigmYWRhcHRlci0+Z2VuZXJpY19zZXJ2aWNlcykpCi0JCWdvdG8gZ2VuZXJpY19zZXJ2aWNlc19mYWlsZWQ7Ci0KIAl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLCAmYWRhcHRlci0+c3RhdHVzKTsKIAlsaXN0X2FkZF90YWlsKCZhZGFwdGVyLT5saXN0LCAmemZjcF9kYXRhLmFkYXB0ZXJfbGlzdF9oZWFkKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCi0JemZjcF9kYXRhLmFkYXB0ZXJzKys7Ci0KLQl6ZmNwX25hbWVzZXJ2ZXJfZW5xdWV1ZShhZGFwdGVyKTsKKwl6ZmNwX2ZjX25hbWVzZXJ2ZXJfaW5pdChhZGFwdGVyKTsKIAogCXJldHVybiAwOwogCi1nZW5lcmljX3NlcnZpY2VzX2ZhaWxlZDoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNjd19kZXZpY2UtPmRldi5rb2JqLAotCQkJICAgJnpmY3Bfc3lzZnNfYWRhcHRlcl9hdHRycyk7CiBzeXNmc19mYWlsZWQ6CiAJemZjcF9hZGFwdGVyX2RlYnVnX3VucmVnaXN0ZXIoYWRhcHRlcik7CiBkZWJ1Z19yZWdpc3Rlcl9mYWlsZWQ6CkBAIC01ODUsNyArNTQ0LDYgQEAKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zY2FuX3dvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnN0YXRfd29yayk7CiAJemZjcF9hZGFwdGVyX3Njc2lfdW5yZWdpc3RlcihhZGFwdGVyKTsKLQlkZXZpY2VfdW5yZWdpc3RlcigmYWRhcHRlci0+Z2VuZXJpY19zZXJ2aWNlcyk7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYua29iaiwKIAkJCSAgICZ6ZmNwX3N5c2ZzX2FkYXB0ZXJfYXR0cnMpOwogCWRldl9zZXRfZHJ2ZGF0YSgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCBOVUxMKTsKQEAgLTYwMyw5ICs1NjEsNiBAQAogCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCi0JLyogZGVjcmVhc2UgbnVtYmVyIG9mIGFkYXB0ZXJzIGluIGxpc3QgKi8KLQl6ZmNwX2RhdGEuYWRhcHRlcnMtLTsKLQogCXpmY3BfcWRpb19mcmVlKGFkYXB0ZXIpOwogCiAJemZjcF9mcmVlX2xvd19tZW1fYnVmZmVycyhhZGFwdGVyKTsKQEAgLTYzMywyMSArNTg4LDE5IEBACiAgKiBkX2lkIGlzIHVzZWQgdG8gZW5xdWV1ZSBwb3J0cyB3aXRoIGEgd2VsbCBrbm93biBhZGRyZXNzIGxpa2UgdGhlIERpcmVjdG9yeQogICogU2VydmljZSBmb3IgbmFtZXNlcnZlciBsb29rdXAuCiAgKi8KLXN0cnVjdCB6ZmNwX3BvcnQgKnpmY3BfcG9ydF9lbnF1ZXVlKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsIHd3bl90IHd3cG4sCitzdHJ1Y3QgemZjcF9wb3J0ICp6ZmNwX3BvcnRfZW5xdWV1ZShzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCB1NjQgd3dwbiwKIAkJCQkgICAgIHUzMiBzdGF0dXMsIHUzMiBkX2lkKQogewogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CiAJaW50IHJldHZhbDsKLQljaGFyICpidXNfaWQ7CiAKIAlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHpmY3BfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5yZW1vdmVfd3EpOwotCiAJSU5JVF9MSVNUX0hFQUQoJnBvcnQtPnVuaXRfbGlzdF9oZWFkKTsKLQlJTklUX0xJU1RfSEVBRCgmcG9ydC0+dW5pdF9yZW1vdmVfbGgpOworCUlOSVRfV09SSygmcG9ydC0+Z2lkX3BuX3dvcmssIHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9sb29rdXApOwogCiAJcG9ydC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJcG9ydC0+ZF9pZCA9IGRfaWQ7CkBAIC02NTcsMzQgKzYxMCw4IEBACiAJYXRvbWljX3NldF9tYXNrKHN0YXR1cyB8IFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZwb3J0LT5zdGF0dXMpOwogCWF0b21pY19zZXQoJnBvcnQtPnJlZmNvdW50LCAwKTsKIAotCWlmIChzdGF0dXMgJiBaRkNQX1NUQVRVU19QT1JUX1dLQSkgewotCQlzd2l0Y2ggKGRfaWQpIHsKLQkJY2FzZSBaRkNQX0RJRF9ESVJFQ1RPUllfU0VSVklDRToKLQkJCWJ1c19pZCA9ICJkaXJlY3RvcnkiOwotCQkJYnJlYWs7Ci0JCWNhc2UgWkZDUF9ESURfTUFOQUdFTUVOVF9TRVJWSUNFOgotCQkJYnVzX2lkID0gIm1hbmFnZW1lbnQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgWkZDUF9ESURfS0VZX0RJU1RSSUJVVElPTl9TRVJWSUNFOgotCQkJYnVzX2lkID0gImtleV9kaXN0cmlidXRpb24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgWkZDUF9ESURfQUxJQVNfU0VSVklDRToKLQkJCWJ1c19pZCA9ICJhbGlhcyI7Ci0JCQlicmVhazsKLQkJY2FzZSBaRkNQX0RJRF9USU1FX1NFUlZJQ0U6Ci0JCQlidXNfaWQgPSAidGltZSI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWtmcmVlKHBvcnQpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JCX0KLQkJc25wcmludGYocG9ydC0+c3lzZnNfZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyIsIGJ1c19pZCk7Ci0JCXBvcnQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmYWRhcHRlci0+Z2VuZXJpY19zZXJ2aWNlczsKLQl9IGVsc2UgewotCQlzbnByaW50Zihwb3J0LT5zeXNmc19kZXZpY2UuYnVzX2lkLAotCQkJIEJVU19JRF9TSVpFLCAiMHglMDE2bGx4Iiwgd3dwbik7Ci0JCXBvcnQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2OwotCX0KKwlkZXZfc2V0X25hbWUoJnBvcnQtPnN5c2ZzX2RldmljZSwgIjB4JTAxNmxseCIsIHd3cG4pOworCXBvcnQtPnN5c2ZzX2RldmljZS5wYXJlbnQgPSAmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2OwogCiAJcG9ydC0+c3lzZnNfZGV2aWNlLnJlbGVhc2UgPSB6ZmNwX3N5c2ZzX3BvcnRfcmVsZWFzZTsKIAlkZXZfc2V0X2RydmRhdGEoJnBvcnQtPnN5c2ZzX2RldmljZSwgcG9ydCk7CkBAIC03MDAsMTIgKzYyNyw4IEBACiAJaWYgKGRldmljZV9yZWdpc3RlcigmcG9ydC0+c3lzZnNfZGV2aWNlKSkKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKLQlpZiAoc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9XS0EpCi0JCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9ydC0+c3lzZnNfZGV2aWNlLmtvYmosCi0JCQkJCSAgICAmemZjcF9zeXNmc19uc19wb3J0X2F0dHJzKTsKLQllbHNlCi0JCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9ydC0+c3lzZnNfZGV2aWNlLmtvYmosCi0JCQkJCSAgICAmemZjcF9zeXNmc19wb3J0X2F0dHJzKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBvcnQtPnN5c2ZzX2RldmljZS5rb2JqLAorCQkJCSAgICAmemZjcF9zeXNmc19wb3J0X2F0dHJzKTsKIAogCWlmIChyZXR2YWwpIHsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJnBvcnQtPnN5c2ZzX2RldmljZSk7CkBAIC03MTgsMTAgKzY0MSw2IEBACiAJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bGlzdCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkKTsKIAlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLCAmcG9ydC0+c3RhdHVzKTsKIAlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JVTk5JTkcsICZwb3J0LT5zdGF0dXMpOwotCWlmIChkX2lkID09IFpGQ1BfRElEX0RJUkVDVE9SWV9TRVJWSUNFKQotCQlpZiAoIWFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydCkKLQkJCWFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydCA9IHBvcnQ7Ci0JYWRhcHRlci0+cG9ydHMrKzsKIAogCXdyaXRlX3VubG9ja19pcnEoJnpmY3BfZGF0YS5jb25maWdfbG9jayk7CiAKQEAgLTc0MCwyMSArNjU5LDE1IEBACiAgKi8KIHZvaWQgemZjcF9wb3J0X2RlcXVldWUoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKIHsKLQl6ZmNwX3BvcnRfd2FpdChwb3J0KTsKKwl3YWl0X2V2ZW50KHBvcnQtPnJlbW92ZV93cSwgYXRvbWljX3JlYWQoJnBvcnQtPnJlZmNvdW50KSA9PSAwKTsKIAl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7Ci0JcG9ydC0+YWRhcHRlci0+cG9ydHMtLTsKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwogCWlmIChwb3J0LT5ycG9ydCkKIAkJZmNfcmVtb3RlX3BvcnRfZGVsZXRlKHBvcnQtPnJwb3J0KTsKIAlwb3J0LT5ycG9ydCA9IE5VTEw7CiAJemZjcF9hZGFwdGVyX3B1dChwb3J0LT5hZGFwdGVyKTsKLQlpZiAoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19QT1JUX1dLQSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb3J0LT5zeXNmc19kZXZpY2Uua29iaiwKLQkJCQkgICAmemZjcF9zeXNmc19uc19wb3J0X2F0dHJzKTsKLQllbHNlCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcG9ydC0+c3lzZnNfZGV2aWNlLmtvYmosCi0JCQkJICAgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycyk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb3J0LT5zeXNmc19kZXZpY2Uua29iaiwgJnpmY3Bfc3lzZnNfcG9ydF9hdHRycyk7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJnBvcnQtPnN5c2ZzX2RldmljZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2Njdy5jCmluZGV4IDM5MWRkMjkuLmIwNDAzOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYwpAQCAtMjUsNyArMjUsOCBAQAogCWRvd24oJnpmY3BfZGF0YS5jb25maWdfc2VtYSk7CiAJaWYgKHpmY3BfYWRhcHRlcl9lbnF1ZXVlKGNjd19kZXZpY2UpKSB7CiAJCWRldl9lcnIoJmNjd19kZXZpY2UtPmRldiwKLQkJCSJTZXR1cCBvZiBkYXRhIHN0cnVjdHVyZXMgZmFpbGVkLlxuIik7CisJCQkiU2V0dGluZyB1cCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSAiCisJCQkiRkNQIGFkYXB0ZXIgZmFpbGVkXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAl9CiAJdXAoJnpmY3BfZGF0YS5jb25maWdfc2VtYSk7CkBAIC00Niw2ICs0Nyw4IEBACiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LCAqcDsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0LCAqdTsKKwlMSVNUX0hFQUQodW5pdF9yZW1vdmVfbGgpOworCUxJU1RfSEVBRChwb3J0X3JlbW92ZV9saCk7CiAKIAljY3dfZGV2aWNlX3NldF9vZmZsaW5lKGNjd19kZXZpY2UpOwogCWRvd24oJnpmY3BfZGF0YS5jb25maWdfc2VtYSk7CkBAIC01NCwyNiArNTcsMjYgQEAKIAl3cml0ZV9sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgcCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1bml0LCB1LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQsIGxpc3QpIHsKLQkJCWxpc3RfbW92ZSgmdW5pdC0+bGlzdCwgJnBvcnQtPnVuaXRfcmVtb3ZlX2xoKTsKKwkJCWxpc3RfbW92ZSgmdW5pdC0+bGlzdCwgJnVuaXRfcmVtb3ZlX2xoKTsKIAkJCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLAogCQkJCQkmdW5pdC0+c3RhdHVzKTsKIAkJfQotCQlsaXN0X21vdmUoJnBvcnQtPmxpc3QsICZhZGFwdGVyLT5wb3J0X3JlbW92ZV9saCk7CisJCWxpc3RfbW92ZSgmcG9ydC0+bGlzdCwgJnBvcnRfcmVtb3ZlX2xoKTsKIAkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZwb3J0LT5zdGF0dXMpOwogCX0KIAlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJmFkYXB0ZXItPnN0YXR1cyk7CiAJd3JpdGVfdW5sb2NrX2lycSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCBwLCAmYWRhcHRlci0+cG9ydF9yZW1vdmVfbGgsIGxpc3QpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVuaXQsIHUsICZwb3J0LT51bml0X3JlbW92ZV9saCwgbGlzdCkgewotCQkJaWYgKGF0b21pY190ZXN0X21hc2soWkZDUF9TVEFUVVNfVU5JVF9SRUdJU1RFUkVELAotCQkJCSZ1bml0LT5zdGF0dXMpKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCBwLCAmcG9ydF9yZW1vdmVfbGgsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVuaXQsIHUsICZ1bml0X3JlbW92ZV9saCwgbGlzdCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZ1bml0LT5zdGF0dXMpICYKKwkJCSAgICBaRkNQX1NUQVRVU19VTklUX1JFR0lTVEVSRUQpCiAJCQkJc2NzaV9yZW1vdmVfZGV2aWNlKHVuaXQtPmRldmljZSk7CiAJCQl6ZmNwX3VuaXRfZGVxdWV1ZSh1bml0KTsKIAkJfQogCQl6ZmNwX3BvcnRfZGVxdWV1ZShwb3J0KTsKIAl9Ci0JemZjcF9hZGFwdGVyX3dhaXQoYWRhcHRlcik7CisJd2FpdF9ldmVudChhZGFwdGVyLT5yZW1vdmVfd3EsIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZWZjb3VudCkgPT0gMCk7CiAJemZjcF9hZGFwdGVyX2RlcXVldWUoYWRhcHRlcik7CiAKIAl1cCgmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKQEAgLTE1MiwyMSArMTU1LDIyIEBACiAgKi8KIHN0YXRpYyBpbnQgemZjcF9jY3dfbm90aWZ5KHN0cnVjdCBjY3dfZGV2aWNlICpjY3dfZGV2aWNlLCBpbnQgZXZlbnQpCiB7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOwogCi0JZG93bigmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKLQlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOwogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIENJT19HT05FOgotCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAiZGV2aWNlIGdvbmVcbiIpOworCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQkJICJUaGUgRkNQIGRldmljZSBoYXMgYmVlbiBkZXRhY2hlZFxuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgODcsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIENJT19OT19QQVRIOgotCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAibm8gcGF0aFxuIik7CisJCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCisJCQkgIlRoZSBDSFBJRCBmb3IgdGhlIEZDUCBkZXZpY2UgaXMgb2ZmbGluZVxuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgODgsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIENJT19PUEVSOgotCQlkZXZfaW5mbygmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAib3BlcmF0aW9uYWwgYWdhaW5cbiIpOworCQlkZXZfaW5mbygmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQkJICJUaGUgRkNQIGRldmljZSBpcyBvcGVyYXRpb25hbCBhZ2FpblxuIik7CiAJCXpmY3BfZXJwX21vZGlmeV9hZGFwdGVyX3N0YXR1cyhhZGFwdGVyLCAxMSwgTlVMTCwKIAkJCQkJICAgICAgIFpGQ1BfU1RBVFVTX0NPTU1PTl9SVU5OSU5HLAogCQkJCQkgICAgICAgWkZDUF9TRVQpOwpAQCAtMTc0LDggKzE3OCw2IEBACiAJCQkJCTg5LCBOVUxMKTsKIAkJYnJlYWs7CiAJfQotCXpmY3BfZXJwX3dhaXQoYWRhcHRlcik7Ci0JdXAoJnpmY3BfZGF0YS5jb25maWdfc2VtYSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIyNCwzICsyMjYsMjAgQEAKIHsKIAlyZXR1cm4gY2N3X2RyaXZlcl9yZWdpc3RlcigmemZjcF9jY3dfZHJpdmVyKTsKIH0KKworLyoqCisgKiB6ZmNwX2dldF9hZGFwdGVyX2J5X2J1c2lkIC0gZmluZCB6ZmNwX2FkYXB0ZXIgc3RydWN0CisgKiBAYnVzaWQ6IGJ1cyBpZCBzdHJpbmcgb2YgemZjcCBhZGFwdGVyIHRvIGZpbmQKKyAqLworc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9nZXRfYWRhcHRlcl9ieV9idXNpZChjaGFyICpidXNpZCkKK3sKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2N3X2RldmljZTsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKworCWNjd19kZXZpY2UgPSBnZXRfY2N3ZGV2X2J5X2J1c2lkKCZ6ZmNwX2Njd19kcml2ZXIsIGJ1c2lkKTsKKwlpZiAoY2N3X2RldmljZSkgeworCQlhZGFwdGVyID0gZGV2X2dldF9kcnZkYXRhKCZjY3dfZGV2aWNlLT5kZXYpOworCQlwdXRfZGV2aWNlKCZjY3dfZGV2aWNlLT5kZXYpOworCX0KKwlyZXR1cm4gYWRhcHRlcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCmluZGV4IGZjYTQ4YjguLjA2MGY1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwpAQCAtMzE4LDYgKzMxOCwyNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmhiYV9kYmZfbG9jaywgZmxhZ3MpOwogfQogCisvKioKKyAqIHpmY3BfaGJhX2RiZl9ldmVudF9iZXJyIC0gdHJhY2UgZXZlbnQgZm9yIGJpdCBlcnJvciB0aHJlc2hvbGQKKyAqIEBhZGFwdGVyOiBhZGFwdGVyIGFmZmVjdGVkIGJ5IHRoaXMgUURJTyByZWxhdGVkIGV2ZW50CisgKiBAcmVxOiBmc2YgcmVxdWVzdAorICovCit2b2lkIHpmY3BfaGJhX2RiZl9ldmVudF9iZXJyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgemZjcF9oYmFfZGJmX3JlY29yZCAqciA9ICZhZGFwdGVyLT5oYmFfZGJmX2J1ZjsKKwlzdHJ1Y3QgZnNmX3N0YXR1c19yZWFkX2J1ZmZlciAqc3JfYnVmID0gcmVxLT5kYXRhOworCXN0cnVjdCBmc2ZfYml0X2Vycm9yX3BheWxvYWQgKmVyciA9ICZzcl9idWYtPnBheWxvYWQuYml0X2Vycm9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aGJhX2RiZl9sb2NrLCBmbGFncyk7CisJbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOworCXN0cm5jcHkoci0+dGFnLCAiYmVyciIsIFpGQ1BfREJGX1RBR19TSVpFKTsKKwltZW1jcHkoJnItPnUuYmVyciwgZXJyLCBzaXplb2Yoc3RydWN0IGZzZl9iaXRfZXJyb3JfcGF5bG9hZCkpOworCWRlYnVnX2V2ZW50KGFkYXB0ZXItPmhiYV9kYmYsIDAsIHIsIHNpemVvZigqcikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmhiYV9kYmZfbG9jaywgZmxhZ3MpOworfQogc3RhdGljIHZvaWQgemZjcF9oYmFfZGJmX3ZpZXdfcmVzcG9uc2UoY2hhciAqKnAsCiAJCQkJICAgICAgIHN0cnVjdCB6ZmNwX2hiYV9kYmZfcmVjb3JkX3Jlc3BvbnNlICpyKQogewpAQCAtMzk5LDYgKzQxOSwzMCBAQAogCXpmY3BfZGJmX291dChwLCAic2JhbF9jb3VudCIsICIweCUwMngiLCByLT5zYmFsX2NvdW50KTsKIH0KIAorc3RhdGljIHZvaWQgemZjcF9oYmFfZGJmX3ZpZXdfYmVycihjaGFyICoqcCwgc3RydWN0IGZzZl9iaXRfZXJyb3JfcGF5bG9hZCAqcikKK3sKKwl6ZmNwX2RiZl9vdXQocCwgImxpbmtfZmFpbHVyZXMiLCAiJWQiLCByLT5saW5rX2ZhaWx1cmVfZXJyb3JfY291bnQpOworCXpmY3BfZGJmX291dChwLCAibG9zc19vZl9zeW5jX2VyciIsICIlZCIsIHItPmxvc3Nfb2Zfc3luY19lcnJvcl9jb3VudCk7CisJemZjcF9kYmZfb3V0KHAsICJsb3NzX29mX3NpZ19lcnIiLCAiJWQiLCByLT5sb3NzX29mX3NpZ25hbF9lcnJvcl9jb3VudCk7CisJemZjcF9kYmZfb3V0KHAsICJwcmltX3NlcV9lcnIiLCAiJWQiLAorCQkgICAgIHItPnByaW1pdGl2ZV9zZXF1ZW5jZV9lcnJvcl9jb3VudCk7CisJemZjcF9kYmZfb3V0KHAsICJpbnZhbF90cmFuc193b3JkX2VyciIsICIlZCIsCisJCSAgICAgci0+aW52YWxpZF90cmFuc21pc3Npb25fd29yZF9lcnJvcl9jb3VudCk7CisJemZjcF9kYmZfb3V0KHAsICJDUkNfZXJyb3JzIiwgIiVkIiwgci0+Y3JjX2Vycm9yX2NvdW50KTsKKwl6ZmNwX2RiZl9vdXQocCwgInByaW1fc2VxX2V2ZW50X3RvIiwgIiVkIiwKKwkJICAgICByLT5wcmltaXRpdmVfc2VxdWVuY2VfZXZlbnRfdGltZW91dF9jb3VudCk7CisJemZjcF9kYmZfb3V0KHAsICJlbGFzdF9idWZfb3ZlcnJ1bl9lcnIiLCAiJWQiLAorCQkgICAgIHItPmVsYXN0aWNfYnVmZmVyX292ZXJydW5fZXJyb3JfY291bnQpOworCXpmY3BfZGJmX291dChwLCAiYWR2X3JlY19idWYyYnVmX2NyZWQiLCAiJWQiLAorCQkgICAgIHItPmFkdmVydGlzZWRfcmVjZWl2ZV9iMmJfY3JlZGl0KTsKKwl6ZmNwX2RiZl9vdXQocCwgImN1cnJfcmVjX2J1ZjJidWZfY3JlZCIsICIlZCIsCisJCSAgICAgci0+Y3VycmVudF9yZWNlaXZlX2IyYl9jcmVkaXQpOworCXpmY3BfZGJmX291dChwLCAiYWR2X3RyYW5zX2J1ZjJidWZfY3JlZCIsICIlZCIsCisJCSAgICAgci0+YWR2ZXJ0aXNlZF90cmFuc21pdF9iMmJfY3JlZGl0KTsKKwl6ZmNwX2RiZl9vdXQocCwgImN1cnJfdHJhbnNfYnVmMmJ1Zl9jcmVkIiwgIiVkIiwKKwkJICAgICByLT5jdXJyZW50X3RyYW5zbWl0X2IyYl9jcmVkaXQpOworfQorCiBzdGF0aWMgaW50IHpmY3BfaGJhX2RiZl92aWV3X2Zvcm1hdChkZWJ1Z19pbmZvX3QgKmlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKIAkJCQkgICAgY2hhciAqb3V0X2J1ZiwgY29uc3QgY2hhciAqaW5fYnVmKQogewpAQCAtNDE4LDYgKzQ2Miw4IEBACiAJCXpmY3BfaGJhX2RiZl92aWV3X3N0YXR1cygmcCwgJnItPnUuc3RhdHVzKTsKIAllbHNlIGlmIChzdHJuY21wKHItPnRhZywgInFkaW8iLCBaRkNQX0RCRl9UQUdfU0laRSkgPT0gMCkKIAkJemZjcF9oYmFfZGJmX3ZpZXdfcWRpbygmcCwgJnItPnUucWRpbyk7CisJZWxzZSBpZiAoc3RybmNtcChyLT50YWcsICJiZXJyIiwgWkZDUF9EQkZfVEFHX1NJWkUpID09IDApCisJCXpmY3BfaGJhX2RiZl92aWV3X2JlcnIoJnAsICZyLT51LmJlcnIpOwogCiAJcCArPSBzcHJpbnRmKHAsICJcbiIpOwogCXJldHVybiBwIC0gb3V0X2J1ZjsKQEAgLTUxOSwxNCArNTY1LDE0IEBACiAJWzc1XQk9ICJwaHlzaWNhbCBwb3J0IHJlY292ZXJ5IGVzY2FsYXRpb24gYWZ0ZXIgZmFpbGVkIHBvcnQgIgogCQkgICJyZWNvdmVyeSIsCiAJWzc2XQk9ICJwb3J0IHJlY292ZXJ5IGVzY2FsYXRpb24gYWZ0ZXIgZmFpbGVkIHVuaXQgcmVjb3ZlcnkiLAotCVs3N10JPSAicmVjb3Zlcnkgb3BlbmluZyBuYW1lc2VydmVyIHBvcnQiLAorCVs3N10JPSAiIiwKIAlbNzhdCT0gImR1cGxpY2F0ZSByZXF1ZXN0IGlkIiwKIAlbNzldCT0gImxpbmsgZG93biIsCiAJWzgwXQk9ICJleGNsdXNpdmUgcmVhZC1vbmx5IHVuaXQgYWNjZXNzIHVuc3VwcG9ydGVkIiwKIAlbODFdCT0gInNoYXJlZCByZWFkLXdyaXRlIHVuaXQgYWNjZXNzIHVuc3VwcG9ydGVkIiwKIAlbODJdCT0gImluY29taW5nIHJzY24iLAogCVs4M10JPSAiaW5jb21pbmcgd3dwbiIsCi0JWzg0XQk9ICIiLAorCVs4NF0JPSAid2thIHBvcnQgaGFuZGxlIG5vdCB2YWxpZCBjbG9zZSBwb3J0IiwKIAlbODVdCT0gIm9ubGluZSIsCiAJWzg2XQk9ICJvZmZsaW5lIiwKIAlbODddCT0gImNjdyBkZXZpY2UgZ29uZSIsCkBAIC01NzAsNyArNjE2LDcgQEAKIAlbMTI1XQk9ICJuZWVkIG5ld2VyIHpmY3AiLAogCVsxMjZdCT0gIm5lZWQgbmV3ZXIgbWljcm9jb2RlIiwKIAlbMTI3XQk9ICJhcmJpdHJhdGVkIGxvb3Agbm90IHN1cHBvcnRlZCIsCi0JWzEyOF0JPSAidW5rbm93biB0b3BvbG9neSIsCisJWzEyOF0JPSAiIiwKIAlbMTI5XQk9ICJxdGNiIHNpemUgbWlzbWF0Y2giLAogCVsxMzBdCT0gInVua25vd24gZnNmIHN0YXR1cyBlY2QiLAogCVsxMzFdCT0gImZjcCByZXF1ZXN0IHRvbyBiaWciLApAQCAtODI5LDkgKzg3NSw5IEBACiB2b2lkIHpmY3Bfc2FuX2RiZl9ldmVudF9jdF9yZXF1ZXN0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEpCiB7CiAJc3RydWN0IHpmY3Bfc2VuZF9jdCAqY3QgPSAoc3RydWN0IHpmY3Bfc2VuZF9jdCAqKWZzZl9yZXEtPmRhdGE7Ci0Jc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGN0LT5wb3J0OwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwotCXN0cnVjdCBjdF9oZHIgKmhkciA9IHpmY3Bfc2dfdG9fYWRkcmVzcyhjdC0+cmVxKTsKKwlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQgPSBjdC0+d2thX3BvcnQ7CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHdrYV9wb3J0LT5hZGFwdGVyOworCXN0cnVjdCBjdF9oZHIgKmhkciA9IHNnX3ZpcnQoY3QtPnJlcSk7CiAJc3RydWN0IHpmY3Bfc2FuX2RiZl9yZWNvcmQgKnIgPSAmYWRhcHRlci0+c2FuX2RiZl9idWY7CiAJc3RydWN0IHpmY3Bfc2FuX2RiZl9yZWNvcmRfY3RfcmVxdWVzdCAqb2N0ID0gJnItPnUuY3RfcmVxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04NDIsNyArODg4LDcgQEAKIAlyLT5mc2ZfcmVxaWQgPSAodW5zaWduZWQgbG9uZylmc2ZfcmVxOwogCXItPmZzZl9zZXFubyA9IGZzZl9yZXEtPnNlcV9ubzsKIAlyLT5zX2lkID0gZmNfaG9zdF9wb3J0X2lkKGFkYXB0ZXItPnNjc2lfaG9zdCk7Ci0Jci0+ZF9pZCA9IHBvcnQtPmRfaWQ7CisJci0+ZF9pZCA9IHdrYV9wb3J0LT5kX2lkOwogCW9jdC0+Y21kX3JlcV9jb2RlID0gaGRyLT5jbWRfcnNwX2NvZGU7CiAJb2N0LT5yZXZpc2lvbiA9IGhkci0+cmV2aXNpb247CiAJb2N0LT5nc190eXBlID0gaGRyLT5nc190eXBlOwpAQCAtODYzLDkgKzkwOSw5IEBACiB2b2lkIHpmY3Bfc2FuX2RiZl9ldmVudF9jdF9yZXNwb25zZShzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxKQogewogCXN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0ID0gKHN0cnVjdCB6ZmNwX3NlbmRfY3QgKilmc2ZfcmVxLT5kYXRhOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBjdC0+cG9ydDsKLQlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKLQlzdHJ1Y3QgY3RfaGRyICpoZHIgPSB6ZmNwX3NnX3RvX2FkZHJlc3MoY3QtPnJlc3ApOworCXN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCA9IGN0LT53a2FfcG9ydDsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gd2thX3BvcnQtPmFkYXB0ZXI7CisJc3RydWN0IGN0X2hkciAqaGRyID0gc2dfdmlydChjdC0+cmVzcCk7CiAJc3RydWN0IHpmY3Bfc2FuX2RiZl9yZWNvcmQgKnIgPSAmYWRhcHRlci0+c2FuX2RiZl9idWY7CiAJc3RydWN0IHpmY3Bfc2FuX2RiZl9yZWNvcmRfY3RfcmVzcG9uc2UgKnJjdCA9ICZyLT51LmN0X3Jlc3A7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTg3NSw3ICs5MjEsNyBAQAogCXN0cm5jcHkoci0+dGFnLCAicmN0YyIsIFpGQ1BfREJGX1RBR19TSVpFKTsKIAlyLT5mc2ZfcmVxaWQgPSAodW5zaWduZWQgbG9uZylmc2ZfcmVxOwogCXItPmZzZl9zZXFubyA9IGZzZl9yZXEtPnNlcV9ubzsKLQlyLT5zX2lkID0gcG9ydC0+ZF9pZDsKKwlyLT5zX2lkID0gd2thX3BvcnQtPmRfaWQ7CiAJci0+ZF9pZCA9IGZjX2hvc3RfcG9ydF9pZChhZGFwdGVyLT5zY3NpX2hvc3QpOwogCXJjdC0+Y21kX3JzcF9jb2RlID0gaGRyLT5jbWRfcnNwX2NvZGU7CiAJcmN0LT5yZXZpc2lvbiA9IGhkci0+cmV2aXNpb247CkBAIC05MjIsOCArOTY4LDggQEAKIAogCXpmY3Bfc2FuX2RiZl9ldmVudF9lbHMoIm9lbHMiLCAyLCBmc2ZfcmVxLAogCQkJICAgICAgIGZjX2hvc3RfcG9ydF9pZChlbHMtPmFkYXB0ZXItPnNjc2lfaG9zdCksCi0JCQkgICAgICAgZWxzLT5kX2lkLCAqKHU4ICopIHpmY3Bfc2dfdG9fYWRkcmVzcyhlbHMtPnJlcSksCi0JCQkgICAgICAgemZjcF9zZ190b19hZGRyZXNzKGVscy0+cmVxKSwgZWxzLT5yZXEtPmxlbmd0aCk7CisJCQkgICAgICAgZWxzLT5kX2lkLCAqKHU4ICopIHNnX3ZpcnQoZWxzLT5yZXEpLAorCQkJICAgICAgIHNnX3ZpcnQoZWxzLT5yZXEpLCBlbHMtPnJlcS0+bGVuZ3RoKTsKIH0KIAogLyoqCkBAIC05MzYsOCArOTgyLDcgQEAKIAogCXpmY3Bfc2FuX2RiZl9ldmVudF9lbHMoInJlbHMiLCAyLCBmc2ZfcmVxLCBlbHMtPmRfaWQsCiAJCQkgICAgICAgZmNfaG9zdF9wb3J0X2lkKGVscy0+YWRhcHRlci0+c2NzaV9ob3N0KSwKLQkJCSAgICAgICAqKHU4ICopemZjcF9zZ190b19hZGRyZXNzKGVscy0+cmVxKSwKLQkJCSAgICAgICB6ZmNwX3NnX3RvX2FkZHJlc3MoZWxzLT5yZXNwKSwKKwkJCSAgICAgICAqKHU4ICopc2dfdmlydChlbHMtPnJlcSksIHNnX3ZpcnQoZWxzLT5yZXNwKSwKIAkJCSAgICAgICBlbHMtPnJlc3AtPmxlbmd0aCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oCmluZGV4IDBkZGIxODQuLmU4ZjQ1MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaApAQCAtMTUxLDYgKzE1MSw3IEBACiAJCXN0cnVjdCB6ZmNwX2hiYV9kYmZfcmVjb3JkX3Jlc3BvbnNlIHJlc3BvbnNlOwogCQlzdHJ1Y3QgemZjcF9oYmFfZGJmX3JlY29yZF9zdGF0dXMgc3RhdHVzOwogCQlzdHJ1Y3QgemZjcF9oYmFfZGJmX3JlY29yZF9xZGlvIHFkaW87CisJCXN0cnVjdCBmc2ZfYml0X2Vycm9yX3BheWxvYWQgYmVycjsKIAl9IHU7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKaW5kZXggNjdmNDVmYy4uOGExMzA3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCkBAIC0zOSwyOSArMzksNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqIEdFTkVSQUwgREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qKgotICogemZjcF9zZ190b19hZGRyZXNzIC0gZGV0ZXJtaW5lIGtlcm5lbCBhZGRyZXNzIGZyb20gc3RydWN0IHNjYXR0ZXJsaXN0Ci0gKiBAbGlzdDogc3RydWN0IHNjYXR0ZXJsaXN0Ci0gKiBSZXR1cm46IGtlcm5lbCBhZGRyZXNzCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqCi16ZmNwX3NnX3RvX2FkZHJlc3Moc3RydWN0IHNjYXR0ZXJsaXN0ICpsaXN0KQotewotCXJldHVybiBzZ192aXJ0KGxpc3QpOwotfQotCi0vKioKLSAqIHpmY3BfYWRkcmVzc190b19zZyAtIHNldCB1cCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgZnJvbSBrZXJuZWwgYWRkcmVzcwotICogQGFkZHJlc3M6IGtlcm5lbCBhZGRyZXNzCi0gKiBAbGlzdDogc3RydWN0IHNjYXR0ZXJsaXN0Ci0gKiBAc2l6ZTogYnVmZmVyIHNpemUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi16ZmNwX2FkZHJlc3NfdG9fc2codm9pZCAqYWRkcmVzcywgc3RydWN0IHNjYXR0ZXJsaXN0ICpsaXN0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzZ19zZXRfYnVmKGxpc3QsIGFkZHJlc3MsIHNpemUpOwotfQotCiAjZGVmaW5lIFJFUVVFU1RfTElTVF9TSVpFIDEyOAogCiAvKioqKioqKioqKioqKioqKioqKioqIFNDU0kgU1BFQ0lGSUMgREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDEsMTEgKzc4LDYgQEAKIAogLyoqKioqKioqKioqKioqKiBGSUJSRSBDSEFOTkVMIFBST1RPQ09MIFNQRUNJRklDIERFRklORVMgKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHd3bl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZmNwX2x1bl90OwotLyogZGF0YSBsZW5ndGggZmllbGQgbWF5IGJlIGF0IHZhcmlhYmxlIHBvc2l0aW9uIGluIEZDUC0yIEZDUF9DTU5EIElVICovCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBmY3BfZGxfdDsKLQogLyogdGltZW91dCBmb3IgbmFtZS1zZXJ2ZXIgbG9va3VwIChpbiBzZWNvbmRzKSAqLwogI2RlZmluZSBaRkNQX05TX0dJRF9QTl9USU1FT1VUCQkxMAogCkBAIC0xMjksNyArMTAxLDcgQEAKIAogLyogRkNQKC0yKSBGQ1BfQ01ORCBJVSAqLwogc3RydWN0IGZjcF9jbW5kX2l1IHsKLQlmY3BfbHVuX3QgZmNwX2x1bjsJICAgLyogRkNQIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KKwl1NjQgZmNwX2x1bjsJICAgLyogRkNQIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KIAl1OCAgY3JuOwkgICAgICAgICAgIC8qIGNvbW1hbmQgcmVmZXJlbmNlIG51bWJlciAqLwogCXU4ICByZXNlcnZlZDA6NTsJICAgLyogcmVzZXJ2ZWQgKi8KIAl1OCAgdGFza19hdHRyaWJ1dGU6MzsJICAgLyogdGFzayBhdHRyaWJ1dGUgKi8KQEAgLTIwNCw3ICsxNzYsNyBAQAogc3RydWN0IGZjcF9sb2dvIHsKICAgICAgICAgdTMyIGNvbW1hbmQ7CiAgICAgICAgIHUzMiBucG9ydF9kaWQ7Ci0gICAgICAgIHd3bl90IG5wb3J0X3d3cG47CisJdTY0IG5wb3J0X3d3cG47CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjE4LDEzICsxOTAsNiBAQAogI2RlZmluZSBaRkNQX0xTX1JTQ04JCQkweDYxCiAjZGVmaW5lIFpGQ1BfTFNfUk5JRAkJCTB4NzgKIAotc3RydWN0IHpmY3BfbHNfcmp0X3BhciB7Ci0JdTggYWN0aW9uOwotIAl1OCByZWFzb25fY29kZTsKLSAJdTggcmVhc29uX2V4cGw7Ci0gCXU4IHZlbmRvcl91bmlxdWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQogc3RydWN0IHpmY3BfbHNfYWRpc2MgewogCXU4CQljb2RlOwogCXU4CQlmaWVsZFszXTsKQEAgLTIzNCwyMCArMTk5LDYgQEAKIAl1MzIJCW5wb3J0X2lkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXN0cnVjdCB6ZmNwX2xzX2FkaXNjX2FjYyB7Ci0JdTgJCWNvZGU7Ci0JdTgJCWZpZWxkWzNdOwotCXUzMgkJaGFyZF9ucG9ydF9pZDsKLQl1NjQJCXd3cG47Ci0JdTY0CQl3d25uOwotCXUzMgkJbnBvcnRfaWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IHpmY3BfcmNfZW50cnkgewotCXU4IGNvZGU7Ci0JY29uc3QgY2hhciAqZGVzY3JpcHRpb247Ci19OwotCiAvKgogICogRkMtR1MtMiBzdHVmZgogICovCkBAIC0yODEsOSArMjMyLDcgQEAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX1JVTk5JTkcJCTB4NDAwMDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQJCTB4MjAwMDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX1VOQkxPQ0tFRAkJMHgxMDAwMDAwMAotI2RlZmluZSBaRkNQX1NUQVRVU19DT01NT05fT1BFTklORyAgICAgICAgICAgICAgMHgwODAwMDAwMAogI2RlZmluZSBaRkNQX1NUQVRVU19DT01NT05fT1BFTiAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBaRkNQX1NUQVRVU19DT01NT05fQ0xPU0lORyAgICAgICAgICAgICAgMHgwMjAwMDAwMAogI2RlZmluZSBaRkNQX1NUQVRVU19DT01NT05fRVJQX0lOVVNFCQkweDAxMDAwMDAwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfREVOSUVECTB4MDA4MDAwMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQ09NTU9OX0FDQ0VTU19CT1hFRAkJMHgwMDQwMDAwMApAQCAtMjkxLDE2ICsyNDAsMTUgQEAKIAogLyogYWRhcHRlciBzdGF0dXMgKi8KICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAJCTB4MDAwMDAwMDIKLSNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9SRUdJU1RFUkVECQkweDAwMDAwMDA0CiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0FEQVBURVJfWENPTkZJR19PSwkJMHgwMDAwMDAwOAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX0hPU1RfQ09OX0lOSVQJMHgwMDAwMDAxMAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX0VSUF9USFJFQURfVVAJMHgwMDAwMDAyMAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX0VSUF9USFJFQURfS0lMTAkweDAwMDAwMDgwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0FEQVBURVJfRVJQX1BFTkRJTkcJCTB4MDAwMDAxMDAKICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9MSU5LX1VOUExVR0dFRAkweDAwMDAwMjAwCi0jZGVmaW5lIFpGQ1BfU1RBVFVTX0FEQVBURVJfWFBPUlRfT0sJCTB4MDAwMDA4MDAKIAogLyogRkMtUEgvRkMtR1Mgd2VsbC1rbm93biBhZGRyZXNzIGlkZW50aWZpZXJzIGZvciBnZW5lcmljIHNlcnZpY2VzICovCisjZGVmaW5lIFpGQ1BfRElEX1dLQQkJCQkweEZGRkZGMAogI2RlZmluZSBaRkNQX0RJRF9NQU5BR0VNRU5UX1NFUlZJQ0UJCTB4RkZGRkZBCiAjZGVmaW5lIFpGQ1BfRElEX1RJTUVfU0VSVklDRQkJCTB4RkZGRkZCCiAjZGVmaW5lIFpGQ1BfRElEX0RJUkVDVE9SWV9TRVJWSUNFCQkweEZGRkZGQwpAQCAtMzEyLDI5ICsyNjAsMjcgQEAKICNkZWZpbmUgWkZDUF9TVEFUVVNfUE9SVF9ESURfRElECQkweDAwMDAwMDAyCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1BPUlRfUEhZU19DTE9TSU5HCQkweDAwMDAwMDA0CiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1BPUlRfTk9fV1dQTgkJMHgwMDAwMDAwOAotI2RlZmluZSBaRkNQX1NUQVRVU19QT1JUX05PX1NDU0lfSUQJCTB4MDAwMDAwMTAKICNkZWZpbmUgWkZDUF9TVEFUVVNfUE9SVF9JTlZBTElEX1dXUE4JCTB4MDAwMDAwMjAKIAotLyogZm9yIHBvcnRzIHdpdGggd2VsbCBrbm93biBhZGRyZXNzZXMgKi8KLSNkZWZpbmUgWkZDUF9TVEFUVVNfUE9SVF9XS0EgXAotCQkoWkZDUF9TVEFUVVNfUE9SVF9OT19XV1BOIHwgXAotCQkgWkZDUF9TVEFUVVNfUE9SVF9OT19TQ1NJX0lEKQorLyogd2VsbCBrbm93biBhZGRyZXNzIChXS0EpIHBvcnQgc3RhdHVzKi8KK2VudW0gemZjcF93a2Ffc3RhdHVzIHsKKwlaRkNQX1dLQV9QT1JUX09GRkxJTkUsCisJWkZDUF9XS0FfUE9SVF9DTE9TSU5HLAorCVpGQ1BfV0tBX1BPUlRfT1BFTklORywKKwlaRkNQX1dLQV9QT1JUX09OTElORSwKK307CiAKIC8qIGxvZ2ljYWwgdW5pdCBzdGF0dXMgKi8KLSNkZWZpbmUgWkZDUF9TVEFUVVNfVU5JVF9URU1QT1JBUlkJCTB4MDAwMDAwMDIKICNkZWZpbmUgWkZDUF9TVEFUVVNfVU5JVF9TSEFSRUQJCQkweDAwMDAwMDA0CiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1VOSVRfUkVBRE9OTFkJCTB4MDAwMDAwMDgKICNkZWZpbmUgWkZDUF9TVEFUVVNfVU5JVF9SRUdJU1RFUkVECQkweDAwMDAwMDEwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX1VOSVRfU0NTSV9XT1JLX1BFTkRJTkcJMHgwMDAwMDAyMAogCiAvKiBGU0YgcmVxdWVzdCBzdGF0dXMgKHRoaXMgZG9lcyBub3QgaGF2ZSBhIGNvbW1vbiBwYXJ0KSAqLwotI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfTk9UX0lOSVQJCTB4MDAwMDAwMDAKLSNkZWZpbmUgWkZDUF9TVEFUVVNfRlNGUkVRX1BPT0wgIAkJMHgwMDAwMDAwMQogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfVEFTS19NQU5BR0VNRU5UCTB4MDAwMDAwMDIKICNkZWZpbmUgWkZDUF9TVEFUVVNfRlNGUkVRX0NPTVBMRVRFRAkJMHgwMDAwMDAwNAogI2RlZmluZSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IJCTB4MDAwMDAwMDgKICNkZWZpbmUgWkZDUF9TVEFUVVNfRlNGUkVRX0NMRUFOVVAJCTB4MDAwMDAwMTAKLSNkZWZpbmUgWkZDUF9TVEFUVVNfRlNGUkVRX0FCT1JUSU5HCQkweDAwMDAwMDIwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0ZTRlJFUV9BQk9SVFNVQ0NFRURFRAkweDAwMDAwMDQwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0ZTRlJFUV9BQk9SVE5PVE5FRURFRCAgICAgICAweDAwMDAwMDgwCiAjZGVmaW5lIFpGQ1BfU1RBVFVTX0ZTRlJFUV9BQk9SVEVEICAgICAgICAgICAgICAweDAwMDAwMTAwCkBAIC0zNzksNyArMzI1LDcgQEAKICAqIGEgcG9ydCBuYW1lIGlzIHJlcXVpcmVkICovCiBzdHJ1Y3QgY3RfaXVfZ2lkX3BuX3JlcSB7CiAJc3RydWN0IGN0X2hkciBoZWFkZXI7Ci0Jd3duX3Qgd3dwbjsKKwl1NjQgd3dwbjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBGU19BQ0MgSVUgYW5kIGRhdGEgdW5pdCBmb3IgR0lEX1BOIG5hbWVzZXJ2ZXIgcmVxdWVzdCAqLwpAQCAtMzg4LDExICszMzQsOSBAQAogCXUzMiBkX2lkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgdm9pZCAoKnpmY3Bfc2VuZF9jdF9oYW5kbGVyX3QpKHVuc2lnbmVkIGxvbmcpOwotCiAvKioKICAqIHN0cnVjdCB6ZmNwX3NlbmRfY3QgLSB1c2VkIHRvIHBhc3MgcGFyYW1ldGVycyB0byBmdW5jdGlvbiB6ZmNwX2ZzZl9zZW5kX2N0Ci0gKiBAcG9ydDogcG9ydCB3aGVyZSB0aGUgcmVxdWVzdCBpcyBzZW50IHRvCisgKiBAd2thX3BvcnQ6IHBvcnQgd2hlcmUgdGhlIHJlcXVlc3QgaXMgc2VudCB0bwogICogQHJlcTogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgcmVxdWVzdAogICogQHJlc3A6IHNjYXR0ZXItZ2F0aGVyIGxpc3QgZm9yIHJlc3BvbnNlCiAgKiBAcmVxX2NvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gcmVxdWVzdCBzY2F0dGVyLWdhdGhlciBsaXN0CkBAIC00MDQsMTIgKzM0OCwxMiBAQAogICogQHN0YXR1czogdXNlZCB0byBwYXNzIGVycm9yIHN0YXR1cyB0byBjYWxsaW5nIGZ1bmN0aW9uCiAgKi8KIHN0cnVjdCB6ZmNwX3NlbmRfY3QgewotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CisJc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVxOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVzcDsKIAl1bnNpZ25lZCBpbnQgcmVxX2NvdW50OwogCXVuc2lnbmVkIGludCByZXNwX2NvdW50OwotCXpmY3Bfc2VuZF9jdF9oYW5kbGVyX3QgaGFuZGxlcjsKKwl2b2lkICgqaGFuZGxlcikodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGVyX2RhdGE7CiAJaW50IHRpbWVvdXQ7CiAJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb247CkBAIC00MjYsOCArMzcwLDYgQEAKICAgICAgICAgc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKIH07CiAKLXR5cGVkZWYgdm9pZCAoKnpmY3Bfc2VuZF9lbHNfaGFuZGxlcl90KSh1bnNpZ25lZCBsb25nKTsKLQogLyoqCiAgKiBzdHJ1Y3QgemZjcF9zZW5kX2VscyAtIHVzZWQgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uIHpmY3BfZnNmX3NlbmRfZWxzCiAgKiBAYWRhcHRlcjogYWRhcHRlciB3aGVyZSByZXF1ZXN0IGlzIHNlbnQgZnJvbQpAQCAtNDUxLDIyICszOTMsMjggQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJlc3A7CiAJdW5zaWduZWQgaW50IHJlcV9jb3VudDsKIAl1bnNpZ25lZCBpbnQgcmVzcF9jb3VudDsKLQl6ZmNwX3NlbmRfZWxzX2hhbmRsZXJfdCBoYW5kbGVyOworCXZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBsb25nKTsKIAl1bnNpZ25lZCBsb25nIGhhbmRsZXJfZGF0YTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbjsKIAlpbnQgbHNfY29kZTsKIAlpbnQgc3RhdHVzOwogfTsKIAorc3RydWN0IHpmY3Bfd2thX3BvcnQgeworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIJKmFkYXB0ZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QJY29tcGxldGlvbl93cTsKKwllbnVtIHpmY3Bfd2thX3N0YXR1cwlzdGF0dXM7CisJYXRvbWljX3QJCXJlZmNvdW50OworCXUzMgkJCWRfaWQ7CisJdTMyCQkJaGFuZGxlOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CisJc3RydWN0IGRlbGF5ZWRfd29yawl3b3JrOworfTsKKwogc3RydWN0IHpmY3BfcWRpb19xdWV1ZSB7Ci0Jc3RydWN0IHFkaW9fYnVmZmVyICpzYmFsW1FESU9fTUFYX0JVRkZFUlNfUEVSX1FdOyAvKiBTQkFMcyAqLwotCXU4CQkgICBmaXJzdDsJICAgICAgLyogaW5kZXggb2YgbmV4dCBmcmVlIGJmcgotCQkJCQkJIGluIHF1ZXVlIChmcmVlX2NvdW50PjApICovCi0JYXRvbWljX3QgICAgICAgICAgIGNvdW50OwkgICAgICAvKiBudW1iZXIgb2YgZnJlZSBidWZmZXJzCi0JCQkJCQkgaW4gcXVldWUgKi8KLQlzcGlubG9ja190CSAgIGxvY2s7CSAgICAgIC8qIGxvY2sgZm9yIG9wZXJhdGlvbnMgb24gcXVldWUgKi8KLQlpbnQgICAgICAgICAgICAgICAgcGNpX2JhdGNoOwkgICAgICAvKiBTQkFMcyBzaW5jZSBQQ0kgaW5kaWNhdGlvbgotCQkJCQkJIHdhcyBsYXN0IHNldCAqLworCXN0cnVjdCBxZGlvX2J1ZmZlciAqc2JhbFtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKKwl1OAkJICAgZmlyc3Q7CS8qIGluZGV4IG9mIG5leHQgZnJlZSBiZnIgaW4gcXVldWUgKi8KKwlhdG9taWNfdCAgICAgICAgICAgY291bnQ7CS8qIG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgaW4gcXVldWUgKi8KIH07CiAKIHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gewpAQCAtNDc1LDcgKzQyMyw3IEBACiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcjsgLyogZGV2aWNlIHdoaWNoIHNob3VsZCBiZSByZWNvdmVyZWQgKi8KIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7Ci0Jdm9sYXRpbGUgdTMyIHN0YXR1czsJICAgICAgLyogcmVjb3Zlcnkgc3RhdHVzICovCisJdTMyCQlzdGF0dXM7CSAgICAgIC8qIHJlY292ZXJ5IHN0YXR1cyAqLwogCXUzMiBzdGVwOwkgICAgICAgICAgICAgIC8qIGFjdGl2ZSBzdGVwIG9mIHRoaXMgZXJwIGFjdGlvbiAqLwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXE7IC8qIGZzZiByZXF1ZXN0IGN1cnJlbnRseSBwZW5kaW5nCiAJCQkJCSBmb3IgdGhpcyBhY3Rpb24gKi8KQEAgLTUwNiw4ICs0NTQsOCBAQAogCWF0b21pY190ICAgICAgICAgICAgICAgIHJlZmNvdW50OyAgICAgICAgICAvKiByZWZlcmVuY2UgY291bnQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZW1vdmVfd3E7ICAgICAgICAgLyogY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IKIAkJCQkJCSAgICAgIHJlZmNvdW50IGRyb3AgdG8gemVybyAqLwotCXd3bl90CQkJcGVlcl93d25uOwkgICAvKiBQMlAgcGVlciBXV05OICovCi0Jd3duX3QJCQlwZWVyX3d3cG47CSAgIC8qIFAyUCBwZWVyIFdXUE4gKi8KKwl1NjQJCQlwZWVyX3d3bm47CSAgIC8qIFAyUCBwZWVyIFdXTk4gKi8KKwl1NjQJCQlwZWVyX3d3cG47CSAgIC8qIFAyUCBwZWVyIFdXUE4gKi8KIAl1MzIJCQlwZWVyX2RfaWQ7CSAgIC8qIFAyUCBwZWVyIERfSUQgKi8KIAlzdHJ1Y3QgY2N3X2RldmljZSAgICAgICAqY2N3X2RldmljZTsJICAgLyogUy8zOTAgY2N3IGRldmljZSAqLwogCXUzMgkJCWh5ZHJhX3ZlcnNpb247CSAgIC8qIEh5ZHJhIHZlcnNpb24gKi8KQEAgLTUxOCwxMyArNDY2LDEzIEBACiAJdTE2CQkJdGltZXJfdGlja3M7ICAgICAgIC8qIHRpbWUgaW50IGZvciBhIHRpY2sgKi8KIAlzdHJ1Y3QgU2NzaV9Ib3N0CSpzY3NpX2hvc3Q7CSAgIC8qIFBvaW50ZXIgdG8gbWlkLWxheWVyICovCiAJc3RydWN0IGxpc3RfaGVhZAlwb3J0X2xpc3RfaGVhZDsJICAgLyogcmVtb3RlIHBvcnQgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHBvcnRfcmVtb3ZlX2xoOyAgICAvKiBoZWFkIG9mIHBvcnRzIHRvIGJlCi0JCQkJCQkgICAgICByZW1vdmVkICovCi0JdTMyCQkJcG9ydHM7CSAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlbW90ZSBwb3J0cyAqLwogCXVuc2lnbmVkIGxvbmcJCXJlcV9ubzsJCSAgIC8qIHVuaXF1ZSBGU0YgcmVxIG51bWJlciAqLwogCXN0cnVjdCBsaXN0X2hlYWQJKnJlcV9saXN0OwkgICAvKiBsaXN0IG9mIHBlbmRpbmcgcmVxcyAqLwogCXNwaW5sb2NrX3QJCXJlcV9saXN0X2xvY2s7CSAgIC8qIHJlcXVlc3QgbGlzdCBsb2NrICovCiAJc3RydWN0IHpmY3BfcWRpb19xdWV1ZQlyZXFfcTsJCSAgIC8qIHJlcXVlc3QgcXVldWUgKi8KKwlzcGlubG9ja190CQlyZXFfcV9sb2NrOwkgICAvKiBmb3Igb3BlcmF0aW9ucyBvbiBxdWV1ZSAqLworCWludAkJCXJlcV9xX3BjaV9iYXRjaDsgICAvKiBTQkFMcyBzaW5jZSBQQ0kgaW5kaWNhdGlvbgorCQkJCQkJICAgICAgd2FzIGxhc3Qgc2V0ICovCiAJdTMyCQkJZnNmX3JlcV9zZXFfbm87CSAgIC8qIEZTRiBjbW5kIHNlcSBudW1iZXIgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZXF1ZXN0X3dxOwkgICAvKiBjYW4gYmUgdXNlZCB0byB3YWl0IGZvcgogCQkJCQkJICAgICAgbW9yZSBhdmFsaWFibGUgU0JBTHMgKi8KQEAgLTU0OCw3ICs0OTYsNyBAQAogCQkJCQkJICAgICAgYWN0aW9ucyAqLwogCXUzMgkJCWVycF9sb3dfbWVtX2NvdW50OyAvKiBuciBvZiBlcnAgYWN0aW9ucyB3YWl0aW5nCiAJCQkJCQkgICAgICBmb3IgbWVtb3J5ICovCi0Jc3RydWN0IHpmY3BfcG9ydAkqbmFtZXNlcnZlcl9wb3J0OyAgLyogYWRhcHRlcidzIG5hbWVzZXJ2ZXIgKi8KKwlzdHJ1Y3QgemZjcF93a2FfcG9ydAluc3A7CQkgICAvKiBhZGFwdGVyJ3MgbmFtZXNlcnZlciAqLwogCWRlYnVnX2luZm9fdAkJKnJlY19kYmY7CiAJZGVidWdfaW5mb190CQkqaGJhX2RiZjsKIAlkZWJ1Z19pbmZvX3QJCSpzYW5fZGJmOyAgICAgICAgICAvKiBkZWJ1ZyBmZWF0dXJlIGFyZWFzICovCkBAIC01NjMsMTEgKzUxMSwxMSBAQAogCXN0cnVjdCB6ZmNwX3Njc2lfZGJmX3JlY29yZAlzY3NpX2RiZl9idWY7CiAJc3RydWN0IHpmY3BfYWRhcHRlcl9tZW1wb29sCXBvb2w7ICAgICAgLyogQWRhcHRlciBtZW1vcnkgcG9vbHMgKi8KIAlzdHJ1Y3QgcWRpb19pbml0aWFsaXplICBxZGlvX2luaXRfZGF0YTsgICAgLyogZm9yIHFkaW9fZXN0YWJsaXNoICovCi0Jc3RydWN0IGRldmljZSAgICAgICAgICAgZ2VuZXJpY19zZXJ2aWNlczsgIC8qIGRpcmVjdG9yeSBmb3IgV0tBIHBvcnRzICovCiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqZmNfc3RhdHM7CiAJc3RydWN0IGZzZl9xdGNiX2JvdHRvbV9wb3J0ICpzdGF0c19yZXNldF9kYXRhOwogCXVuc2lnbmVkIGxvbmcJCXN0YXRzX3Jlc2V0OwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzY2FuX3dvcms7CisJYXRvbWljX3QJCXFkaW9fb3V0Yl9mdWxsOwkgICAvKiBxdWV1ZSBmdWxsIGluY2lkZW50cyAqLwogfTsKIAogc3RydWN0IHpmY3BfcG9ydCB7CkBAIC01NzksMTggKzUyNywxNiBAQAogCQkJCQkJICByZWZjb3VudCBkcm9wIHRvIHplcm8gKi8KIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICAgICphZGFwdGVyOyAgICAgICAvKiBhZGFwdGVyIHVzZWQgdG8gYWNjZXNzIHBvcnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHVuaXRfbGlzdF9oZWFkOyAvKiBoZWFkIG9mIGxvZ2ljYWwgdW5pdCBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICB1bml0X3JlbW92ZV9saDsgLyogaGVhZCBvZiBsdW5zIHRvIGJlIHJlbW92ZWQKLQkJCQkJCSAgbGlzdCAqLwotCXUzMgkJICAgICAgIHVuaXRzOwkgICAgICAgLyogIyBvZiBsb2dpY2FsIHVuaXRzIGluIGxpc3QgKi8KIAlhdG9taWNfdAkgICAgICAgc3RhdHVzOwkgICAgICAgLyogc3RhdHVzIG9mIHRoaXMgcmVtb3RlIHBvcnQgKi8KLQl3d25fdAkJICAgICAgIHd3bm47CSAgICAgICAvKiBXV05OIGlmIGtub3duICovCi0Jd3duX3QJCSAgICAgICB3d3BuOwkgICAgICAgLyogV1dQTiAqLworCXU2NAkJICAgICAgIHd3bm47CSAgICAgICAvKiBXV05OIGlmIGtub3duICovCisJdTY0CQkgICAgICAgd3dwbjsJICAgICAgIC8qIFdXUE4gKi8KIAl1MzIJCSAgICAgICBkX2lkOwkgICAgICAgLyogRF9JRCAqLwogCXUzMgkJICAgICAgIGhhbmRsZTsJICAgICAgIC8qIGhhbmRsZSBhc3NpZ25lZCBieSBGU0YgKi8KIAlzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uIGVycF9hY3Rpb247ICAgICAvKiBwZW5kaW5nIGVycm9yIHJlY292ZXJ5ICovCiAgICAgICAgIGF0b21pY190ICAgICAgICAgICAgICAgZXJwX2NvdW50ZXI7CiAJdTMyICAgICAgICAgICAgICAgICAgICBtYXhmcmFtZV9zaXplOwogCXUzMiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2NsYXNzZXM7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICBnaWRfcG5fd29yazsKIH07CiAKIHN0cnVjdCB6ZmNwX3VuaXQgewpAQCAtNjAxLDggKzU0Nyw3IEBACiAJCQkJCQkgIHJlZmNvdW50IGRyb3AgdG8gemVybyAqLwogCXN0cnVjdCB6ZmNwX3BvcnQgICAgICAgKnBvcnQ7CSAgICAgICAvKiByZW1vdGUgcG9ydCBvZiB1bml0ICovCiAJYXRvbWljX3QJICAgICAgIHN0YXR1czsJICAgICAgIC8qIHN0YXR1cyBvZiB0aGlzIGxvZ2ljYWwgdW5pdCAqLwotCXVuc2lnbmVkIGludAkgICAgICAgc2NzaV9sdW47ICAgICAgIC8qIG93biBTQ1NJIExVTiAqLwotCWZjcF9sdW5fdAkgICAgICAgZmNwX2x1bjsJICAgICAgIC8qIG93biBGQ1BfTFVOICovCisJdTY0CQkgICAgICAgZmNwX2x1bjsJICAgICAgIC8qIG93biBGQ1BfTFVOICovCiAJdTMyCQkgICAgICAgaGFuZGxlOwkgICAgICAgLyogaGFuZGxlIGFzc2lnbmVkIGJ5IEZTRiAqLwogICAgICAgICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgICAgICpkZXZpY2U7ICAgICAgICAvKiBzY3NpIGRldmljZSBzdHJ1Y3QgcG9pbnRlciAqLwogCXN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gZXJwX2FjdGlvbjsgICAgIC8qIHBlbmRpbmcgZXJyb3IgcmVjb3ZlcnkgKi8KQEAgLTYyNSw3ICs1NzAsNyBAQAogCXU4CQkJc2JhbF9yZXNwb25zZTsJLyogU0JBTCB1c2VkIGluIGludGVycnVwdCAqLwogCXdhaXRfcXVldWVfaGVhZF90ICAgICAgY29tcGxldGlvbl93cTsgIC8qIGNhbiBiZSB1c2VkIGJ5IGEgcm91dGluZQogCQkJCQkJICB0byB3YWl0IGZvciBjb21wbGV0aW9uICovCi0Jdm9sYXRpbGUgdTMyCSAgICAgICBzdGF0dXM7CSAgICAgICAvKiBzdGF0dXMgb2YgdGhpcyByZXF1ZXN0ICovCisJdTMyCQkJc3RhdHVzOwkgICAgICAgLyogc3RhdHVzIG9mIHRoaXMgcmVxdWVzdCAqLwogCXUzMgkJICAgICAgIGZzZl9jb21tYW5kOyAgICAvKiBGU0YgQ29tbWFuZCBjb3B5ICovCiAJc3RydWN0IGZzZl9xdGNiCSAgICAgICAqcXRjYjsJICAgICAgIC8qIGFkZHJlc3Mgb2YgYXNzb2NpYXRlZCBRVENCICovCiAJdTMyCQkgICAgICAgc2VxX25vOyAgICAgICAgIC8qIFNlcXVlbmNlIG51bWJlciBvZiByZXF1ZXN0ICovCkBAIC02NDQsMjMgKzU4OSwyMCBAQAogc3RydWN0IHpmY3BfZGF0YSB7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzY3NpX2hvc3RfdGVtcGxhdGU7CiAJc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKLSAgICAgICAgYXRvbWljX3QgICAgICAgICAgICAgICAgc3RhdHVzOyAgICAgICAgICAgICAvKiBNb2R1bGUgc3RhdHVzIGZsYWdzICovCiAJc3RydWN0IGxpc3RfaGVhZAlhZGFwdGVyX2xpc3RfaGVhZDsgIC8qIGhlYWQgb2YgYWRhcHRlciBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhZGFwdGVyX3JlbW92ZV9saDsgIC8qIGhlYWQgb2YgYWRhcHRlcnMgdG8gYmUKLQkJCQkJCSAgICAgICByZW1vdmVkICovCi0JdTMyCQkJYWRhcHRlcnM7CSAgICAvKiAjIG9mIGFkYXB0ZXJzIGluIGxpc3QgKi8KIAlyd2xvY2tfdCAgICAgICAgICAgICAgICBjb25maWdfbG9jazsgICAgICAgIC8qIHNlcmlhbGlzZXMgY2hhbmdlcwogCQkJCQkJICAgICAgIHRvIGFkYXB0ZXIvcG9ydC91bml0CiAJCQkJCQkgICAgICAgbGlzdHMgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICBjb25maWdfc2VtYTsgICAgICAgIC8qIHNlcmlhbGlzZXMgY29uZmlndXJhdGlvbgogCQkJCQkJICAgICAgIGNoYW5nZXMgKi8KIAlhdG9taWNfdAkJbG9nbGV2ZWw7ICAgICAgICAgICAgLyogY3VycmVudCBsb2dsZXZlbCAqLwotCWNoYXIgICAgICAgICAgICAgICAgICAgIGluaXRfYnVzaWRbQlVTX0lEX1NJWkVdOwotCXd3bl90ICAgICAgICAgICAgICAgICAgIGluaXRfd3dwbjsKLQlmY3BfbHVuX3QgICAgICAgICAgICAgICBpbml0X2ZjcF9sdW47Ci0Jc3RydWN0IGttZW1fY2FjaGUJCSpmc2ZfcmVxX3F0Y2JfY2FjaGU7Ci0Jc3RydWN0IGttZW1fY2FjaGUJCSpzcl9idWZmZXJfY2FjaGU7Ci0Jc3RydWN0IGttZW1fY2FjaGUJCSpnaWRfcG5fY2FjaGU7CisJY2hhcgkJCWluaXRfYnVzaWRbMjBdOworCXU2NAkJCWluaXRfd3dwbjsKKwl1NjQJCQlpbml0X2ZjcF9sdW47CisJc3RydWN0IGttZW1fY2FjaGUJKmZzZl9yZXFfcXRjYl9jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkqc3JfYnVmZmVyX2NhY2hlOworCXN0cnVjdCBrbWVtX2NhY2hlCSpnaWRfcG5fY2FjaGU7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndvcmtfcXVldWU7CiB9OwogCiAvKiBzdHJ1Y3QgdXNlZCBieSBtZW1vcnkgcG9vbHMgZm9yIGZzZl9yZXF1ZXN0cyAqLwpAQCAtNjc3LDE0ICs2MTksNyBAQAogI2RlZmluZSBaRkNQX1NFVCAgICAgICAgICAgICAgICAweDAwMDAwMTAwCiAjZGVmaW5lIFpGQ1BfQ0xFQVIgICAgICAgICAgICAgIDB4MDAwMDAyMDAKIAotI2lmbmRlZiBhdG9taWNfdGVzdF9tYXNrCi0jZGVmaW5lIGF0b21pY190ZXN0X21hc2sobWFzaywgdGFyZ2V0KSBcCi0gICAgICAgICAgICgoYXRvbWljX3JlYWQodGFyZ2V0KSAmIG1hc2spID09IG1hc2spCi0jZW5kaWYKLQotI2RlZmluZSB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpIChhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYuYnVzX2lkKQotI2RlZmluZSB6ZmNwX2dldF9idXNpZF9ieV9wb3J0KHBvcnQpICh6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKHBvcnQtPmFkYXB0ZXIpKQotI2RlZmluZSB6ZmNwX2dldF9idXNpZF9ieV91bml0KHVuaXQpICh6ZmNwX2dldF9idXNpZF9ieV9wb3J0KHVuaXQtPnBvcnQpKQorI2RlZmluZSB6ZmNwX2dldF9idXNpZF9ieV9hZGFwdGVyKGFkYXB0ZXIpIChkZXZfbmFtZSgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2KSkKIAogLyoKICAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlcXVlc3QgSUQgbWFuYWdlbWVudC4KQEAgLTc0NSwxMiArNjgwLDYgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi16ZmNwX3VuaXRfd2FpdChzdHJ1Y3QgemZjcF91bml0ICp1bml0KQotewotCXdhaXRfZXZlbnQodW5pdC0+cmVtb3ZlX3dxLCBhdG9taWNfcmVhZCgmdW5pdC0+cmVmY291bnQpID09IDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKIHpmY3BfcG9ydF9nZXQoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKIHsKIAlhdG9taWNfaW5jKCZwb3J0LT5yZWZjb3VudCk7CkBAIC03NjQsMTIgKzY5Myw2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotemZjcF9wb3J0X3dhaXQoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKLXsKLQl3YWl0X2V2ZW50KHBvcnQtPnJlbW92ZV93cSwgYXRvbWljX3JlYWQoJnBvcnQtPnJlZmNvdW50KSA9PSAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCiB6ZmNwX2FkYXB0ZXJfZ2V0KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJYXRvbWljX2luYygmYWRhcHRlci0+cmVmY291bnQpOwpAQCAtNzgyLDEwICs3MDUsNCBAQAogCQl3YWtlX3VwKCZhZGFwdGVyLT5yZW1vdmVfd3EpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXpmY3BfYWRhcHRlcl93YWl0KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jd2FpdF9ldmVudChhZGFwdGVyLT5yZW1vdmVfd3EsIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZWZjb3VudCkgPT0gMCk7Ci19Ci0KICNlbmRpZiAvKiBaRkNQX0RFRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwppbmRleCA2NDNhYzRiLi45MDQwZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAlaRkNQX0VSUF9TVEVQX0ZTRl9YQ09ORklHCT0gMHgwMDAxLAogCVpGQ1BfRVJQX1NURVBfUEhZU19QT1JUX0NMT1NJTkcJPSAweDAwMTAsCiAJWkZDUF9FUlBfU1RFUF9QT1JUX0NMT1NJTkcJPSAweDAxMDAsCi0JWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX09QRU4JPSAweDAyMDAsCiAJWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX0xPT0tVUAk9IDB4MDQwMCwKIAlaRkNQX0VSUF9TVEVQX1BPUlRfT1BFTklORwk9IDB4MDgwMCwKIAlaRkNQX0VSUF9TVEVQX1VOSVRfQ0xPU0lORwk9IDB4MTAwMCwKQEAgLTUzMiw4ICs1MzEsNyBAQAogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKLQkJaWYgKCEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19QT1JUX1dLQSkpCi0JCQlfemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgY2xlYXIsIGlkLCByZWYpOworCQlfemZjcF9lcnBfcG9ydF9yZW9wZW4ocG9ydCwgY2xlYXIsIGlkLCByZWYpOwogfQogCiBzdGF0aWMgdm9pZCBfemZjcF9lcnBfdW5pdF9yZW9wZW5fYWxsKHN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsIGludCBjbGVhciwgdTggaWQsCkBAIC02NjksOCArNjY3LDYgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBhY3QtPmFkYXB0ZXI7CiAKLQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19BREFQVEVSX1hQT1JUX09LLCAmYWRhcHRlci0+c3RhdHVzKTsKLQogCXdyaXRlX2xvY2tfaXJxKCZhZGFwdGVyLT5lcnBfbG9jayk7CiAJemZjcF9lcnBfYWN0aW9uX3RvX3J1bm5pbmcoYWN0KTsKIAl3cml0ZV91bmxvY2tfaXJxKCZhZGFwdGVyLT5lcnBfbG9jayk7CkBAIC03NDEsOCArNzM3LDcgQEAKIAkJCQkgICAgICAgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4sIFpGQ1BfQ0xFQVIpOwogIGZhaWxlZF9xZGlvOgogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfWENPTkZJR19PSyB8Ci0JCQkgIFpGQ1BfU1RBVFVTX0FEQVBURVJfTElOS19VTlBMVUdHRUQgfAotCQkJICBaRkNQX1NUQVRVU19BREFQVEVSX1hQT1JUX09LLAorCQkJICBaRkNQX1NUQVRVU19BREFQVEVSX0xJTktfVU5QTFVHR0VELAogCQkJICAmYWN0LT5hZGFwdGVyLT5zdGF0dXMpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC03NTEsMTUgKzc0NiwxMSBAQAogewogCWludCByZXR2YWw7CiAKLQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX0NMT1NJTkcsICZhY3QtPmFkYXB0ZXItPnN0YXR1cyk7CiAJemZjcF9lcnBfYWRhcHRlcl9zdHJhdGVneV9nZW5lcmljKGFjdCwgMSk7IC8qIGNsb3NlICovCi0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX0NMT1NJTkcsICZhY3QtPmFkYXB0ZXItPnN0YXR1cyk7CiAJaWYgKGFjdC0+c3RhdHVzICYgWkZDUF9TVEFUVVNfRVJQX0NMT1NFX09OTFkpCiAJCXJldHVybiBaRkNQX0VSUF9FWElUOwogCi0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOSU5HLCAmYWN0LT5hZGFwdGVyLT5zdGF0dXMpOwogCXJldHZhbCA9IHpmY3BfZXJwX2FkYXB0ZXJfc3RyYXRlZ3lfZ2VuZXJpYyhhY3QsIDApOyAvKiBvcGVuICovCi0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU5JTkcsICZhY3QtPmFkYXB0ZXItPnN0YXR1cyk7CiAKIAlpZiAocmV0dmFsID09IFpGQ1BfRVJQX0ZBSUxFRCkKIAkJc3NsZWVwKDgpOwpAQCAtNzgzLDEwICs3NzQsNyBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX2VycF9wb3J0X3N0cmF0ZWd5X2NsZWFyc3RhdGkoc3RydWN0IHpmY3BfcG9ydCAqcG9ydCkKIHsKLQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fT1BFTklORyB8Ci0JCQkgIFpGQ1BfU1RBVFVTX0NPTU1PTl9DTE9TSU5HIHwKLQkJCSAgWkZDUF9TVEFUVVNfQ09NTU9OX0FDQ0VTU19ERU5JRUQgfAotCQkJICBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQgfAorCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfREVOSUVEIHwKIAkJCSAgWkZDUF9TVEFUVVNfUE9SVF9QSFlTX0NMT1NJTkcgfAogCQkJICBaRkNQX1NUQVRVU19QT1JUX0lOVkFMSURfV1dQTiwKIAkJCSAgJnBvcnQtPnN0YXR1cyk7CkBAIC04MzksNzMgKzgyNywxMiBAQAogCXJldHVybiBaRkNQX0VSUF9DT05USU5VRVM7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9uc193YWtlKHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKm5zX2FjdCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuc19hY3QtPmFkYXB0ZXI7Ci0Jc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqYWN0LCAqdG1wOwotCWludCBzdGF0dXM7Ci0KLQlyZWFkX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZXJwX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0LCB0bXAsICZhZGFwdGVyLT5lcnBfcnVubmluZ19oZWFkLCBsaXN0KSB7Ci0JCWlmIChhY3QtPnN0ZXAgPT0gWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX09QRU4pIHsKLQkJCXN0YXR1cyA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQtPnN0YXR1cyk7Ci0JCQlpZiAoc3RhdHVzICYgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQpCi0JCQkJemZjcF9lcnBfcG9ydF9mYWlsZWQoYWN0LT5wb3J0LCAyNywgTlVMTCk7Ci0JCQl6ZmNwX2VycF9hY3Rpb25fcmVhZHkoYWN0KTsKLQkJfQotCX0KLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5lcnBfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9uYW1lc2VydmVyKHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmFjdCkKLXsKLQlpbnQgcmV0dmFsOwotCi0Jc3dpdGNoIChhY3QtPnN0ZXApIHsKLQljYXNlIFpGQ1BfRVJQX1NURVBfVU5JTklUSUFMSVpFRDoKLQljYXNlIFpGQ1BfRVJQX1NURVBfUEhZU19QT1JUX0NMT1NJTkc6Ci0JY2FzZSBaRkNQX0VSUF9TVEVQX1BPUlRfQ0xPU0lORzoKLQkJcmV0dXJuIHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9wb3J0KGFjdCk7Ci0KLQljYXNlIFpGQ1BfRVJQX1NURVBfUE9SVF9PUEVOSU5HOgotCQlpZiAoYXRvbWljX3JlYWQoJmFjdC0+cG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOKQotCQkJcmV0dmFsID0gWkZDUF9FUlBfU1VDQ0VFREVEOwotCQllbHNlCi0JCQlyZXR2YWwgPSBaRkNQX0VSUF9GQUlMRUQ7Ci0JCS8qIHRoaXMgaXMgbmVlZGVkIGFueXdheSAgKi8KLQkJemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX25zX3dha2UoYWN0KTsKLQkJcmV0dXJuIHJldHZhbDsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7Ci0JfQotfQotCi1zdGF0aWMgaW50IHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9sb29rdXAoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqYWN0KQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSB6ZmNwX2ZjX25zX2dpZF9wbl9yZXF1ZXN0KGFjdCk7Ci0JaWYgKHJldHZhbCA9PSAtRU5PTUVNKQotCQlyZXR1cm4gWkZDUF9FUlBfTk9NRU07Ci0JYWN0LT5zdGVwID0gWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX0xPT0tVUDsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOwotCXJldHVybiBaRkNQX0VSUF9DT05USU5VRVM7Ci19Ci0KIHN0YXRpYyBpbnQgemZjcF9lcnBfb3Blbl9wdHBfcG9ydChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICphY3QpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGFjdC0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gYWN0LT5wb3J0OwogCiAJaWYgKHBvcnQtPnd3cG4gIT0gYWRhcHRlci0+cGVlcl93d3BuKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJGYWlsZWQgdG8gb3BlbiBwb3J0IDB4JTAxNkx4LCAiCi0JCQkiUGVlciBXV1BOIDB4JTAxNkx4IGRvZXMgbm90ICIKLQkJCSJtYXRjaC5cbiIsIHBvcnQtPnd3cG4sCi0JCQlhZGFwdGVyLT5wZWVyX3d3cG4pOwogCQl6ZmNwX2VycF9wb3J0X2ZhaWxlZChwb3J0LCAyNSwgTlVMTCk7CiAJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CiAJfQpAQCAtOTE0LDExICs4NDEsMjUgQEAKIAlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX3BvcnQoYWN0KTsKIH0KIAordm9pZCB6ZmNwX2VycF9wb3J0X3N0cmF0ZWd5X29wZW5fbG9va3VwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHpmY3BfcG9ydCwKKwkJCQkJICAgICAgZ2lkX3BuX3dvcmspOworCisJcmV0dmFsID0gemZjcF9mY19uc19naWRfcG4oJnBvcnQtPmVycF9hY3Rpb24pOworCWlmIChyZXR2YWwgPT0gLUVOT01FTSkKKwkJemZjcF9lcnBfbm90aWZ5KCZwb3J0LT5lcnBfYWN0aW9uLCBaRkNQX0VSUF9OT01FTSk7CisJcG9ydC0+ZXJwX2FjdGlvbi5zdGVwID0gWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX0xPT0tVUDsKKwlpZiAocmV0dmFsKQorCQl6ZmNwX2VycF9ub3RpZnkoJnBvcnQtPmVycF9hY3Rpb24sIFpGQ1BfRVJQX0ZBSUxFRCk7CisKK30KKwogc3RhdGljIGludCB6ZmNwX2VycF9wb3J0X3N0cmF0ZWd5X29wZW5fY29tbW9uKHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmFjdCkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gYWN0LT5hZGFwdGVyOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBhY3QtPnBvcnQ7Ci0Jc3RydWN0IHpmY3BfcG9ydCAqbnNfcG9ydCA9IGFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydDsKIAlpbnQgcF9zdGF0dXMgPSBhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKTsKIAogCXN3aXRjaCAoYWN0LT5zdGVwKSB7CkBAIC05MjcsMjggKzg2OCwxMCBAQAogCWNhc2UgWkZDUF9FUlBfU1RFUF9QT1JUX0NMT1NJTkc6CiAJCWlmIChmY19ob3N0X3BvcnRfdHlwZShhZGFwdGVyLT5zY3NpX2hvc3QpID09IEZDX1BPUlRUWVBFX1BUUCkKIAkJCXJldHVybiB6ZmNwX2VycF9vcGVuX3B0cF9wb3J0KGFjdCk7Ci0JCWlmICghbnNfcG9ydCkgewotCQkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCSJOYW1lc2VydmVyIHBvcnQgdW5hdmFpbGFibGUuXG4iKTsKLQkJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CisJCWlmICghKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9ESURfRElEKSkgeworCQkJcXVldWVfd29yayh6ZmNwX2RhdGEud29ya19xdWV1ZSwgJnBvcnQtPmdpZF9wbl93b3JrKTsKKwkJCXJldHVybiBaRkNQX0VSUF9DT05USU5VRVM7CiAJCX0KLQkJaWYgKCEoYXRvbWljX3JlYWQoJm5zX3BvcnQtPnN0YXR1cykgJgotCQkgICAgICBaRkNQX1NUQVRVU19DT01NT05fVU5CTE9DS0VEKSkgewotCQkJLyogbmFtZXNlcnZlciBwb3J0IG1heSBsaXZlIGFnYWluICovCi0JCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JVTk5JTkcsCi0JCQkJCSZuc19wb3J0LT5zdGF0dXMpOwotCQkJaWYgKHpmY3BfZXJwX3BvcnRfcmVvcGVuKG5zX3BvcnQsIDAsIDc3LCBhY3QpID49IDApIHsKLQkJCQlhY3QtPnN0ZXAgPSBaRkNQX0VSUF9TVEVQX05BTUVTRVJWRVJfT1BFTjsKLQkJCQlyZXR1cm4gWkZDUF9FUlBfQ09OVElOVUVTOwotCQkJfQotCQkJcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKLQkJfQotCQkvKiBlbHNlIG5hbWVzZXJ2ZXIgcG9ydCBpcyBhbHJlYWR5IG9wZW4sIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX09QRU46Ci0JCWlmICghKGF0b21pY19yZWFkKCZuc19wb3J0LT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4pKQotCQkJcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKLQkJcmV0dXJuIHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3Blbl9sb29rdXAoYWN0KTsKLQogCWNhc2UgWkZDUF9FUlBfU1RFUF9OQU1FU0VSVkVSX0xPT0tVUDoKIAkJaWYgKCEocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQpKSB7CiAJCQlpZiAocF9zdGF0dXMgJiAoWkZDUF9TVEFUVVNfUE9SVF9JTlZBTElEX1dXUE4pKSB7CkBAIC05NjEsMjUgKzg4NCwyNiBAQAogCiAJY2FzZSBaRkNQX0VSUF9TVEVQX1BPUlRfT1BFTklORzoKIAkJLyogRF9JRCBtaWdodCBoYXZlIGNoYW5nZWQgZHVyaW5nIG9wZW4gKi8KLQkJaWYgKChwX3N0YXR1cyAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOKSAmJgotCQkgICAgKHBfc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9ESURfRElEKSkKLQkJCXJldHVybiBaRkNQX0VSUF9TVUNDRUVERUQ7CisJCWlmIChwX3N0YXR1cyAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9PUEVOKSB7CisJCQlpZiAocF9zdGF0dXMgJiBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQpCisJCQkJcmV0dXJuIFpGQ1BfRVJQX1NVQ0NFRURFRDsKKwkJCWVsc2UgeworCQkJCWFjdC0+c3RlcCA9IFpGQ1BfRVJQX1NURVBfUE9SVF9DTE9TSU5HOworCQkJCXJldHVybiBaRkNQX0VSUF9DT05USU5VRVM7CisJCQl9CiAJCS8qIGZhbGwgdGhyb3VnaCBvdGhlcndpc2UgKi8KKwkJfQogCX0KIAlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOwogfQogCi1zdGF0aWMgaW50IHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3lfb3BlbihzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICphY3QpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZhY3QtPnBvcnQtPnN0YXR1cykgJiAoWkZDUF9TVEFUVVNfUE9SVF9XS0EpKQotCQlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX25hbWVzZXJ2ZXIoYWN0KTsKLQlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX2NvbW1vbihhY3QpOwotfQotCiBzdGF0aWMgaW50IHpmY3BfZXJwX3BvcnRfc3RyYXRlZ3koc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqZXJwX2FjdGlvbikKIHsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gZXJwX2FjdGlvbi0+cG9ydDsKIAorCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9OT0VTQykKKwkJZ290byBjbG9zZV9pbml0X2RvbmU7CisKIAlzd2l0Y2ggKGVycF9hY3Rpb24tPnN0ZXApIHsKIAljYXNlIFpGQ1BfRVJQX1NURVBfVU5JTklUSUFMSVpFRDoKIAkJemZjcF9lcnBfcG9ydF9zdHJhdGVneV9jbGVhcnN0YXRpKHBvcnQpOwpAQCAtOTkyLDE5ICs5MTYsMTcgQEAKIAkJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CiAJCWJyZWFrOwogCX0KKworY2xvc2VfaW5pdF9kb25lOgogCWlmIChlcnBfYWN0aW9uLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19FUlBfQ0xPU0VfT05MWSkKIAkJcmV0dXJuIFpGQ1BfRVJQX0VYSVQ7Ci0JZWxzZQotCQlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuKGVycF9hY3Rpb24pOwogCi0JcmV0dXJuIFpGQ1BfRVJQX0ZBSUxFRDsKKwlyZXR1cm4gemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX2NvbW1vbihlcnBfYWN0aW9uKTsKIH0KIAogc3RhdGljIHZvaWQgemZjcF9lcnBfdW5pdF9zdHJhdGVneV9jbGVhcnN0YXRpKHN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQpCiB7Ci0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU5JTkcgfAotCQkJICBaRkNQX1NUQVRVU19DT01NT05fQ0xPU0lORyB8Ci0JCQkgIFpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfREVOSUVEIHwKKwlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fQUNDRVNTX0RFTklFRCB8CiAJCQkgIFpGQ1BfU1RBVFVTX1VOSVRfU0hBUkVEIHwKIAkJCSAgWkZDUF9TVEFUVVNfVU5JVF9SRUFET05MWSwKIAkJCSAgJnVuaXQtPnN0YXR1cyk7CkBAIC0xMDY1LDggKzk4NywxNCBAQAogCQlicmVhazsKIAljYXNlIFpGQ1BfRVJQX0ZBSUxFRCA6CiAJCWF0b21pY19pbmMoJnVuaXQtPmVycF9jb3VudGVyKTsKLQkJaWYgKGF0b21pY19yZWFkKCZ1bml0LT5lcnBfY291bnRlcikgPiBaRkNQX01BWF9FUlBTKQorCQlpZiAoYXRvbWljX3JlYWQoJnVuaXQtPmVycF9jb3VudGVyKSA+IFpGQ1BfTUFYX0VSUFMpIHsKKwkJCWRldl9lcnIoJnVuaXQtPnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKKwkJCQkiRVJQIGZhaWxlZCBmb3IgdW5pdCAweCUwMTZMeCBvbiAiCisJCQkJInBvcnQgMHglMDE2THhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5mY3BfbHVuLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+cG9ydC0+d3dwbik7CiAJCQl6ZmNwX2VycF91bml0X2ZhaWxlZCh1bml0LCAyMSwgTlVMTCk7CisJCX0KIAkJYnJlYWs7CiAJfQogCkBAIC0xMDkxLDggKzEwMTksMTIgQEAKIAkJCXJlc3VsdCA9IFpGQ1BfRVJQX0VYSVQ7CiAJCX0KIAkJYXRvbWljX2luYygmcG9ydC0+ZXJwX2NvdW50ZXIpOwotCQlpZiAoYXRvbWljX3JlYWQoJnBvcnQtPmVycF9jb3VudGVyKSA+IFpGQ1BfTUFYX0VSUFMpCisJCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+ZXJwX2NvdW50ZXIpID4gWkZDUF9NQVhfRVJQUykgeworCQkJZGV2X2VycigmcG9ydC0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQkJCSJFUlAgZmFpbGVkIGZvciByZW1vdGUgcG9ydCAweCUwMTZMeFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwogCQkJemZjcF9lcnBfcG9ydF9mYWlsZWQocG9ydCwgMjIsIE5VTEwpOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtMTExNCw4ICsxMDQ2LDEyIEBACiAKIAljYXNlIFpGQ1BfRVJQX0ZBSUxFRCA6CiAJCWF0b21pY19pbmMoJmFkYXB0ZXItPmVycF9jb3VudGVyKTsKLQkJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT5lcnBfY291bnRlcikgPiBaRkNQX01BWF9FUlBTKQorCQlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPmVycF9jb3VudGVyKSA+IFpGQ1BfTUFYX0VSUFMpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKKwkJCQkiRVJQIGNhbm5vdCByZWNvdmVyIGFuIGVycm9yICIKKwkJCQkib24gdGhlIEZDUCBkZXZpY2VcbiIpOwogCQkJemZjcF9lcnBfYWRhcHRlcl9mYWlsZWQoYWRhcHRlciwgMjMsIE5VTEwpOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtMTI1MCw5ICsxMTg2LDEwIEBACiAJc3RydWN0IHpmY3BfdW5pdCAqdW5pdCA9IHAtPnVuaXQ7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHVuaXQtPnBvcnQtPnJwb3J0OwogCXNjc2lfc2Nhbl90YXJnZXQoJnJwb3J0LT5kZXYsIDAsIHJwb3J0LT5zY3NpX3RhcmdldF9pZCwKLQkJCSB1bml0LT5zY3NpX2x1biwgMCk7CisJCQkgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZ1bml0LT5mY3BfbHVuKSwgMCk7CiAJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfVU5JVF9TQ1NJX1dPUktfUEVORElORywgJnVuaXQtPnN0YXR1cyk7CiAJemZjcF91bml0X3B1dCh1bml0KTsKKwl3YWtlX3VwKCZ1bml0LT5wb3J0LT5hZGFwdGVyLT5lcnBfZG9uZV93cWgpOwogCWtmcmVlKHApOwogfQogCkBAIC0xMjYzLDkgKzEyMDAsOSBAQAogCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOwogCWlmICghcCkgewogCQlkZXZfZXJyKCZ1bml0LT5wb3J0LT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkiT3V0IG9mIHJlc291cmNlcy4gQ291bGQgbm90IHJlZ2lzdGVyIHVuaXQgIgotCQkJIjB4JTAxNkx4IG9uIHBvcnQgMHglMDE2THggd2l0aCBTQ1NJIHN0YWNrLlxuIiwKLQkJCXVuaXQtPmZjcF9sdW4sIHVuaXQtPnBvcnQtPnd3cG4pOworCQkJIlJlZ2lzdGVyaW5nIHVuaXQgMHglMDE2THggb24gcG9ydCAweCUwMTZMeCBmYWlsZWRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPnBvcnQtPnd3cG4pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjczLDcgKzEyMTAsNyBAQAogCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19VTklUX1NDU0lfV09SS19QRU5ESU5HLCAmdW5pdC0+c3RhdHVzKTsKIAlJTklUX1dPUksoJnAtPndvcmssIHpmY3BfZXJwX3Njc2lfc2Nhbik7CiAJcC0+dW5pdCA9IHVuaXQ7Ci0Jc2NoZWR1bGVfd29yaygmcC0+d29yayk7CisJcXVldWVfd29yayh6ZmNwX2RhdGEud29ya19xdWV1ZSwgJnAtPndvcmspOwogfQogCiBzdGF0aWMgdm9pZCB6ZmNwX2VycF9ycG9ydF9yZWdpc3RlcihzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0KQpAQCAtMTI4Niw4ICsxMjIzLDggQEAKIAlwb3J0LT5ycG9ydCA9IGZjX3JlbW90ZV9wb3J0X2FkZChwb3J0LT5hZGFwdGVyLT5zY3NpX2hvc3QsIDAsICZpZHMpOwogCWlmICghcG9ydC0+cnBvcnQpIHsKIAkJZGV2X2VycigmcG9ydC0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJIkZhaWxlZCByZWdpc3RyYXRpb24gb2YgcnBvcnQgIgotCQkJIjB4JTAxNkx4LlxuIiwgcG9ydC0+d3dwbik7CisJCQkiUmVnaXN0ZXJpbmcgcG9ydCAweCUwMTZMeCBmYWlsZWRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjk5LDEyICsxMjM2LDEyIEBACiBzdGF0aWMgdm9pZCB6ZmNwX2VycF9ycG9ydHNfZGVsKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkKLQkJaWYgKHBvcnQtPnJwb3J0ICYmICEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJgotCQkJCQlaRkNQX1NUQVRVU19QT1JUX1dLQSkpIHsKLQkJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShwb3J0LT5ycG9ydCk7Ci0JCQlwb3J0LT5ycG9ydCA9IE5VTEw7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZhZGFwdGVyLT5wb3J0X2xpc3RfaGVhZCwgbGlzdCkgeworCQlpZiAoIXBvcnQtPnJwb3J0KQorCQkJY29udGludWU7CisJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShwb3J0LT5ycG9ydCk7CisJCXBvcnQtPnJwb3J0ID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3BfZXJwX2FjdGlvbl9jbGVhbnVwKHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmFjdCwgaW50IHJlc3VsdCkKQEAgLTE0MzksNyArMTM3Niw3IEBACiAJc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqYWN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkYWVtb25pemUoInpmY3BlcnAlcyIsIGFkYXB0ZXItPmNjd19kZXZpY2UtPmRldi5idXNfaWQpOworCWRhZW1vbml6ZSgiemZjcGVycCVzIiwgZGV2X25hbWUoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldikpOwogCS8qIEJsb2NrIGFsbCBzaWduYWxzICovCiAJc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgMCk7CiAJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfRVJQX1RIUkVBRF9VUCwgJmFkYXB0ZXItPnN0YXR1cyk7CkBAIC0xNDU5LDkgKzEzOTYsOSBAQAogCQkJCXpmY3BfZXJwX3dha2V1cChhZGFwdGVyKTsKIAkJfQogCi0JCXpmY3BfcmVjX2RiZl9ldmVudF90aHJlYWQoNCwgYWRhcHRlcik7CisJCXpmY3BfcmVjX2RiZl9ldmVudF90aHJlYWRfbG9jayg0LCBhZGFwdGVyKTsKIAkJZG93bl9pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5lcnBfcmVhZHlfc2VtKTsKLQkJemZjcF9yZWNfZGJmX2V2ZW50X3RocmVhZCg1LCBhZGFwdGVyKTsKKwkJemZjcF9yZWNfZGJmX2V2ZW50X3RocmVhZF9sb2NrKDUsIGFkYXB0ZXIpOwogCX0KIAogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfRVJQX1RIUkVBRF9VUCwgJmFkYXB0ZXItPnN0YXR1cyk7CkBAIC0xNDg0LDcgKzE0MjEsNyBAQAogCXJldHZhbCA9IGtlcm5lbF90aHJlYWQoemZjcF9lcnBfdGhyZWFkLCBhZGFwdGVyLCBTSUdDSExEKTsKIAlpZiAocmV0dmFsIDwgMCkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkiQ3JlYXRpb24gb2YgRVJQIHRocmVhZCBmYWlsZWQuXG4iKTsKKwkJCSJDcmVhdGluZyBhbiBFUlAgdGhyZWFkIGZvciB0aGUgRkNQIGRldmljZSBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJd2FpdF9ldmVudChhZGFwdGVyLT5lcnBfdGhyZWFkX3dxaCwKQEAgLTE1MDYsNyArMTQ0Myw3IEBACiB7CiAJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfRVJQX1RIUkVBRF9LSUxMLCAmYWRhcHRlci0+c3RhdHVzKTsKIAl1cCgmYWRhcHRlci0+ZXJwX3JlYWR5X3NlbSk7Ci0JemZjcF9yZWNfZGJmX2V2ZW50X3RocmVhZF9sb2NrKDIsIGFkYXB0ZXIpOworCXpmY3BfcmVjX2RiZl9ldmVudF90aHJlYWRfbG9jaygzLCBhZGFwdGVyKTsKIAogCXdhaXRfZXZlbnQoYWRhcHRlci0+ZXJwX3RocmVhZF93cWgsCiAJCSAgICEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJgpAQCAtMTUyNiw3ICsxNDYzLDYgQEAKIHsKIAl6ZmNwX2VycF9tb2RpZnlfYWRhcHRlcl9zdGF0dXMoYWRhcHRlciwgaWQsIHJlZiwKIAkJCQkgICAgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsIFpGQ1BfU0VUKTsKLQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsICJBZGFwdGVyIEVSUCBmYWlsZWQuXG4iKTsKIH0KIAogLyoqCkBAIC0xNTM5LDE1ICsxNDc1LDYgQEAKIHsKIAl6ZmNwX2VycF9tb2RpZnlfcG9ydF9zdGF0dXMocG9ydCwgaWQsIHJlZiwKIAkJCQkgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsIFpGQ1BfU0VUKTsKLQotCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX1BPUlRfV0tBKQotCQlkZXZfZXJyKCZwb3J0LT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkiUG9ydCBFUlAgZmFpbGVkIGZvciBXS0EgcG9ydCBkX2lkPTB4JTA2eC5cbiIsCi0JCQlwb3J0LT5kX2lkKTsKLQllbHNlCi0JCWRldl9lcnIoJnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJQb3J0IEVSUCBmYWlsZWQgZm9yIHBvcnQgd3dwbj0weCUwMTZMeC5cbiIsCi0JCQlwb3J0LT53d3BuKTsKIH0KIAogLyoqCkBAIC0xNTYwLDEwICsxNDg3LDYgQEAKIHsKIAl6ZmNwX2VycF9tb2RpZnlfdW5pdF9zdGF0dXModW5pdCwgaWQsIHJlZiwKIAkJCQkgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsIFpGQ1BfU0VUKTsKLQotCWRldl9lcnIoJnVuaXQtPnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJIlVuaXQgRVJQIGZhaWxlZCBmb3IgdW5pdCAweCUwMTZMeCBvbiBwb3J0IDB4JTAxNkx4LlxuIiwKLQkJdW5pdC0+ZmNwX2x1biwgdW5pdC0+cG9ydC0+d3dwbik7CiB9CiAKIC8qKgpAQCAtMTc1NCw5ICsxNjc3LDggQEAKIAogCWlmICghKHN0YXR1cyAmIChaRkNQX1NUQVRVU19DT01NT05fQUNDRVNTX0RFTklFRCB8CiAJCQlaRkNQX1NUQVRVU19DT01NT05fQUNDRVNTX0JPWEVEKSkpIHsKLQkJaWYgKCEoc3RhdHVzICYgWkZDUF9TVEFUVVNfUE9SVF9XS0EpKQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQsIGxpc3QpCi0JCQkJemZjcF9lcnBfdW5pdF9hY2Nlc3NfY2hhbmdlZCh1bml0LCBpZCwgcmVmKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh1bml0LCAmcG9ydC0+dW5pdF9saXN0X2hlYWQsIGxpc3QpCisJCQkJICAgIHpmY3BfZXJwX3VuaXRfYWNjZXNzX2NoYW5nZWQodW5pdCwgaWQsIHJlZik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3NzksMTAgKzE3MDEsNyBAQAogCQlyZXR1cm47CiAKIAlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7Ci0JaWYgKGFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydCkKLQkJemZjcF9lcnBfcG9ydF9hY2Nlc3NfY2hhbmdlZChhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQsIGlkLCByZWYpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQotCQlpZiAocG9ydCAhPSBhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQpCi0JCQl6ZmNwX2VycF9wb3J0X2FjY2Vzc19jaGFuZ2VkKHBvcnQsIGlkLCByZWYpOworCQl6ZmNwX2VycF9wb3J0X2FjY2Vzc19jaGFuZ2VkKHBvcnQsIGlkLCByZWYpOwogCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnpmY3BfZGF0YS5jb25maWdfbG9jaywgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKaW5kZXggZWRmZGIyMS4uYjVhZGVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCkBAIC0xMiwxNiArMTIsMTQgQEAKICNpbmNsdWRlICJ6ZmNwX2RlZi5oIgogCiAvKiB6ZmNwX2F1eC5jICovCi1leHRlcm4gc3RydWN0IHpmY3BfdW5pdCAqemZjcF9nZXRfdW5pdF9ieV9sdW4oc3RydWN0IHpmY3BfcG9ydCAqLAotCQkJCQkgICAgICBmY3BfbHVuX3QpOwotZXh0ZXJuIHN0cnVjdCB6ZmNwX3BvcnQgKnpmY3BfZ2V0X3BvcnRfYnlfd3dwbihzdHJ1Y3QgemZjcF9hZGFwdGVyICosCi0JCQkJCSAgICAgICB3d25fdCk7CitleHRlcm4gc3RydWN0IHpmY3BfdW5pdCAqemZjcF9nZXRfdW5pdF9ieV9sdW4oc3RydWN0IHpmY3BfcG9ydCAqLCB1NjQpOworZXh0ZXJuIHN0cnVjdCB6ZmNwX3BvcnQgKnpmY3BfZ2V0X3BvcnRfYnlfd3dwbihzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHU2NCk7CiBleHRlcm4gaW50IHpmY3BfYWRhcHRlcl9lbnF1ZXVlKHN0cnVjdCBjY3dfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgemZjcF9hZGFwdGVyX2RlcXVldWUoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKLWV4dGVybiBzdHJ1Y3QgemZjcF9wb3J0ICp6ZmNwX3BvcnRfZW5xdWV1ZShzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHd3bl90LCB1MzIsCitleHRlcm4gc3RydWN0IHpmY3BfcG9ydCAqemZjcF9wb3J0X2VucXVldWUoc3RydWN0IHpmY3BfYWRhcHRlciAqLCB1NjQsIHUzMiwKIAkJCQkJICAgdTMyKTsKIGV4dGVybiB2b2lkIHpmY3BfcG9ydF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3BvcnQgKik7Ci1leHRlcm4gc3RydWN0IHpmY3BfdW5pdCAqemZjcF91bml0X2VucXVldWUoc3RydWN0IHpmY3BfcG9ydCAqLCBmY3BfbHVuX3QpOworZXh0ZXJuIHN0cnVjdCB6ZmNwX3VuaXQgKnpmY3BfdW5pdF9lbnF1ZXVlKHN0cnVjdCB6ZmNwX3BvcnQgKiwgdTY0KTsKIGV4dGVybiB2b2lkIHpmY3BfdW5pdF9kZXF1ZXVlKHN0cnVjdCB6ZmNwX3VuaXQgKik7CiBleHRlcm4gaW50IHpmY3BfcmVxbGlzdF9pc2VtcHR5KHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiBleHRlcm4gdm9pZCB6ZmNwX3NnX2ZyZWVfdGFibGUoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCk7CkBAIC0yOSw2ICsyNyw3IEBACiAKIC8qIHpmY3BfY2N3LmMgKi8KIGV4dGVybiBpbnQgemZjcF9jY3dfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gc3RydWN0IHpmY3BfYWRhcHRlciAqemZjcF9nZXRfYWRhcHRlcl9ieV9idXNpZChjaGFyICopOwogCiAvKiB6ZmNwX2NmZGMuYyAqLwogZXh0ZXJuIHN0cnVjdCBtaXNjZGV2aWNlIHpmY3BfY2ZkY19taXNjOwpAQCAtNTAsNiArNDksOCBAQAogCQkJCQkgc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2hiYV9kYmZfZXZlbnRfcWRpbyhzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHVuc2lnbmVkIGludCwgaW50LAogCQkJCSAgICBpbnQpOworZXh0ZXJuIHZvaWQgemZjcF9oYmFfZGJmX2V2ZW50X2JlcnIoc3RydWN0IHpmY3BfYWRhcHRlciAqLAorCQkJCSAgICBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9zYW5fZGJmX2V2ZW50X2N0X3JlcXVlc3Qoc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIGV4dGVybiB2b2lkIHpmY3Bfc2FuX2RiZl9ldmVudF9jdF9yZXNwb25zZShzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9zYW5fZGJmX2V2ZW50X2Vsc19yZXF1ZXN0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CkBAIC05MSwxNyArOTIsMjEgQEAKIGV4dGVybiB2b2lkIHpmY3BfZXJwX3VuaXRfYWNjZXNzX2RlbmllZChzdHJ1Y3QgemZjcF91bml0ICosIHU4LCB2b2lkICopOwogZXh0ZXJuIHZvaWQgemZjcF9lcnBfYWRhcHRlcl9hY2Nlc3NfY2hhbmdlZChzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHU4LCB2b2lkICopOwogZXh0ZXJuIHZvaWQgemZjcF9lcnBfdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgemZjcF9lcnBfcG9ydF9zdHJhdGVneV9vcGVuX2xvb2t1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKIC8qIHpmY3BfZmMuYyAqLwogZXh0ZXJuIGludCB6ZmNwX3NjYW5fcG9ydHMoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKIGV4dGVybiB2b2lkIF96ZmNwX3NjYW5fcG9ydHNfbGF0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgemZjcF9mY19pbmNvbWluZ19lbHMoc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKLWV4dGVybiBpbnQgemZjcF9mY19uc19naWRfcG5fcmVxdWVzdChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICopOworZXh0ZXJuIGludCB6ZmNwX2ZjX25zX2dpZF9wbihzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICopOwogZXh0ZXJuIHZvaWQgemZjcF9mY19wbG9naV9ldmFsdWF0ZShzdHJ1Y3QgemZjcF9wb3J0ICosIHN0cnVjdCBmc2ZfcGxvZ2kgKik7CiBleHRlcm4gdm9pZCB6ZmNwX3Rlc3RfbGluayhzdHJ1Y3QgemZjcF9wb3J0ICopOworZXh0ZXJuIHZvaWQgemZjcF9mY19uYW1lc2VydmVyX2luaXQoc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKIAogLyogemZjcF9mc2YuYyAqLwogZXh0ZXJuIGludCB6ZmNwX2ZzZl9vcGVuX3BvcnQoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqKTsKK2V4dGVybiBpbnQgemZjcF9mc2Zfb3Blbl93a2FfcG9ydChzdHJ1Y3QgemZjcF93a2FfcG9ydCAqKTsKK2V4dGVybiBpbnQgemZjcF9mc2ZfY2xvc2Vfd2thX3BvcnQoc3RydWN0IHpmY3Bfd2thX3BvcnQgKik7CiBleHRlcm4gaW50IHpmY3BfZnNmX2Nsb3NlX3BvcnQoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqKTsKIGV4dGVybiBpbnQgemZjcF9mc2ZfY2xvc2VfcGh5c2ljYWxfcG9ydChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICopOwogZXh0ZXJuIGludCB6ZmNwX2ZzZl9vcGVuX3VuaXQoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqKTsKQEAgLTEzNSwxMCArMTQwLDggQEAKIGV4dGVybiBpbnQgemZjcF9xZGlvX2FsbG9jYXRlKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiBleHRlcm4gdm9pZCB6ZmNwX3FkaW9fZnJlZShzdHJ1Y3QgemZjcF9hZGFwdGVyICopOwogZXh0ZXJuIGludCB6ZmNwX3FkaW9fc2VuZChzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwotZXh0ZXJuIHZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICp6ZmNwX3FkaW9fc2JhbGVfcmVxKAotCQkJCQkJc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKLWV4dGVybiB2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqemZjcF9xZGlvX3NiYWxlX2N1cnIoCi0JCQkJCQlzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOworZXh0ZXJuIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICp6ZmNwX3FkaW9fc2JhbGVfcmVxKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CitleHRlcm4gc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnpmY3BfcWRpb19zYmFsZV9jdXJyKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gaW50IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKiwgdW5zaWduZWQgbG9uZywKIAkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50KTsKIGV4dGVybiBpbnQgemZjcF9xZGlvX29wZW4oc3RydWN0IHpmY3BfYWRhcHRlciAqKTsKQEAgLTE0OCwxNCArMTUxLDEyIEBACiBleHRlcm4gc3RydWN0IHpmY3BfZGF0YSB6ZmNwX2RhdGE7CiBleHRlcm4gaW50IHpmY3BfYWRhcHRlcl9zY3NpX3JlZ2lzdGVyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2FkYXB0ZXJfc2NzaV91bnJlZ2lzdGVyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKik7Ci1leHRlcm4gdm9pZCB6ZmNwX3NldF9mY3BfZGwoc3RydWN0IGZjcF9jbW5kX2l1ICosIGZjcF9kbF90KTsKIGV4dGVybiBjaGFyICp6ZmNwX2dldF9mY3Bfc25zX2luZm9fcHRyKHN0cnVjdCBmY3BfcnNwX2l1ICopOwogZXh0ZXJuIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSB6ZmNwX3RyYW5zcG9ydF9mdW5jdGlvbnM7CiAKIC8qIHpmY3Bfc3lzZnMuYyAqLwogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc191bml0X2F0dHJzOwogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc19hZGFwdGVyX2F0dHJzOwotZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc19uc19wb3J0X2F0dHJzOwogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc19wb3J0X2F0dHJzOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICp6ZmNwX3N5c2ZzX3NkZXZfYXR0cnNbXTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqemZjcF9zeXNmc19zaG9zdF9hdHRyc1tdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mYy5jCmluZGV4IGU5ODQ0NjkuLjFhN2M4MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZmMuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZjLmMKQEAgLTM5LDE2ICszOSw4MiBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19yZXNwW1pGQ1BfR1BOX0ZUX0JVRkZFUlNdOwogfTsKIAotc3RhdGljIHN0cnVjdCB6ZmNwX3BvcnQgKnpmY3BfZ2V0X3BvcnRfYnlfZGlkKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgICAgIHUzMiBkX2lkKQotewotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CitzdHJ1Y3QgemZjcF9mY19uc19oYW5kbGVyX2RhdGEgeworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisJdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlcl9kYXRhOworfTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmFkYXB0ZXItPnBvcnRfbGlzdF9oZWFkLCBsaXN0KQotCQlpZiAoKHBvcnQtPmRfaWQgPT0gZF9pZCkgJiYKLQkJICAgICFhdG9taWNfdGVzdF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUsICZwb3J0LT5zdGF0dXMpKQotCQkJcmV0dXJuIHBvcnQ7Ci0JcmV0dXJuIE5VTEw7CitzdGF0aWMgaW50IHpmY3Bfd2thX3BvcnRfZ2V0KHN0cnVjdCB6ZmNwX3drYV9wb3J0ICp3a2FfcG9ydCkKK3sKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ3a2FfcG9ydC0+bXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHdrYV9wb3J0LT5zdGF0dXMgIT0gWkZDUF9XS0FfUE9SVF9PTkxJTkUpIHsKKwkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT1BFTklORzsKKwkJaWYgKHpmY3BfZnNmX29wZW5fd2thX3BvcnQod2thX3BvcnQpKQorCQkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT0ZGTElORTsKKwl9CisKKwltdXRleF91bmxvY2soJndrYV9wb3J0LT5tdXRleCk7CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoCisJCXdrYV9wb3J0LT5jb21wbGV0aW9uX3dxLAorCQl3a2FfcG9ydC0+c3RhdHVzID09IFpGQ1BfV0tBX1BPUlRfT05MSU5FIHx8CisJCXdrYV9wb3J0LT5zdGF0dXMgPT0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FLAorCQlIWiA+PiAxKTsKKworCWlmICh3a2FfcG9ydC0+c3RhdHVzID09IFpGQ1BfV0tBX1BPUlRfT05MSU5FKSB7CisJCWF0b21pY19pbmMoJndrYV9wb3J0LT5yZWZjb3VudCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgemZjcF93a2FfcG9ydF9vZmZsaW5lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkdyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQgPQorCQkJY29udGFpbmVyX29mKGR3LCBzdHJ1Y3QgemZjcF93a2FfcG9ydCwgd29yayk7CisKKwl3YWl0X2V2ZW50KHdrYV9wb3J0LT5jb21wbGV0aW9uX3dxLAorCQkJYXRvbWljX3JlYWQoJndrYV9wb3J0LT5yZWZjb3VudCkgPT0gMCk7CisKKwltdXRleF9sb2NrKCZ3a2FfcG9ydC0+bXV0ZXgpOworCWlmICgoYXRvbWljX3JlYWQoJndrYV9wb3J0LT5yZWZjb3VudCkgIT0gMCkgfHwKKwkgICAgKHdrYV9wb3J0LT5zdGF0dXMgIT0gWkZDUF9XS0FfUE9SVF9PTkxJTkUpKQorCQlnb3RvIG91dDsKKworCXdrYV9wb3J0LT5zdGF0dXMgPSBaRkNQX1dLQV9QT1JUX0NMT1NJTkc7CisJaWYgKHpmY3BfZnNmX2Nsb3NlX3drYV9wb3J0KHdrYV9wb3J0KSkgeworCQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCQl3YWtlX3VwKCZ3a2FfcG9ydC0+Y29tcGxldGlvbl93cSk7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmd2thX3BvcnQtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgemZjcF93a2FfcG9ydF9wdXQoc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0KQoreworCWlmIChhdG9taWNfZGVjX3JldHVybigmd2thX3BvcnQtPnJlZmNvdW50KSAhPSAwKQorCQlyZXR1cm47CisJLyogd2FpdCAxMCBtaWxpc2Vjb25kcywgb3RoZXIgcmVxcyBtaWdodCBwb3AgaW4gKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndrYV9wb3J0LT53b3JrLCBIWiAvIDEwMCk7Cit9CisKK3ZvaWQgemZjcF9mY19uYW1lc2VydmVyX2luaXQoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgemZjcF93a2FfcG9ydCAqd2thX3BvcnQgPSAmYWRhcHRlci0+bnNwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmd2thX3BvcnQtPmNvbXBsZXRpb25fd3EpOworCisJd2thX3BvcnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCXdrYV9wb3J0LT5kX2lkID0gWkZDUF9ESURfRElSRUNUT1JZX1NFUlZJQ0U7CisKKwl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCWF0b21pY19zZXQoJndrYV9wb3J0LT5yZWZjb3VudCwgMCk7CisJbXV0ZXhfaW5pdCgmd2thX3BvcnQtPm11dGV4KTsKKwlJTklUX0RFTEFZRURfV09SSygmd2thX3BvcnQtPndvcmssIHpmY3Bfd2thX3BvcnRfb2ZmbGluZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF96ZmNwX2ZjX2luY29taW5nX3JzY24oc3RydWN0IHpmY3BfZnNmX3JlcSAqZnNmX3JlcSwgdTMyIHJhbmdlLApAQCAtNTksMTAgKzEyNSw4IEBACiAKIAlyZWFkX2xvY2tfaXJxc2F2ZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmZnNmX3JlcS0+YWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKLQkJaWYgKGF0b21pY190ZXN0X21hc2soWkZDUF9TVEFUVVNfUE9SVF9XS0EsICZwb3J0LT5zdGF0dXMpKQotCQkJY29udGludWU7CiAJCS8qIEZJWE1FOiBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQgY2hlY2sgaXMgcmFjeSAqLwotCQlpZiAoIWF0b21pY190ZXN0X21hc2soWkZDUF9TVEFUVVNfUE9SVF9ESURfRElELCAmcG9ydC0+c3RhdHVzKSkKKwkJaWYgKCEoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19QT1JUX0RJRF9ESUQpKQogCQkJLyogVHJ5IHRvIGNvbm5lY3QgdG8gdW51c2VkIHBvcnRzIGFueXdheS4gKi8KIAkJCXpmY3BfZXJwX3BvcnRfcmVvcGVuKHBvcnQsCiAJCQkJCSAgICAgWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsCkBAIC0xMTQsNyArMTc4LDcgQEAKIAlzY2hlZHVsZV93b3JrKCZmc2ZfcmVxLT5hZGFwdGVyLT5zY2FuX3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCB6ZmNwX2ZjX2luY29taW5nX3d3cG4oc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxLCB3d25fdCB3d3BuKQorc3RhdGljIHZvaWQgemZjcF9mY19pbmNvbWluZ193d3BuKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSwgdTY0IHd3cG4pCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwpAQCAtMTY5LDcgKzIzMywxOCBAQAogCQl6ZmNwX2ZjX2luY29taW5nX3JzY24oZnNmX3JlcSk7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfbnNfZ2lkX3BuX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgemZjcF9mY19uc19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgemZjcF9mY19uc19oYW5kbGVyX2RhdGEgKmNvbXBsX3JlYyA9CisJCQkoc3RydWN0IHpmY3BfZmNfbnNfaGFuZGxlcl9kYXRhICopIGRhdGE7CisKKwlpZiAoY29tcGxfcmVjLT5oYW5kbGVyKQorCQljb21wbF9yZWMtPmhhbmRsZXIoY29tcGxfcmVjLT5oYW5kbGVyX2RhdGEpOworCisJY29tcGxldGUoJmNvbXBsX3JlYy0+ZG9uZSk7Cit9CisKK3N0YXRpYyB2b2lkIHpmY3BfZmNfbnNfZ2lkX3BuX2V2YWwodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB6ZmNwX2dpZF9wbl9kYXRhICpnaWRfcG4gPSAoc3RydWN0IHpmY3BfZ2lkX3BuX2RhdGEgKikgZGF0YTsKIAlzdHJ1Y3QgemZjcF9zZW5kX2N0ICpjdCA9ICZnaWRfcG4tPmN0OwpAQCAtMTc4LDQzICsyNTMsMzEgQEAKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gZ2lkX3BuLT5wb3J0OwogCiAJaWYgKGN0LT5zdGF0dXMpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJaWYgKGN0X2l1X3Jlc3AtPmhlYWRlci5jbWRfcnNwX2NvZGUgIT0gWkZDUF9DVF9BQ0NFUFQpIHsKIAkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX1BPUlRfSU5WQUxJRF9XV1BOLCAmcG9ydC0+c3RhdHVzKTsKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAl9CiAJLyogcGFyYW5vaWEgKi8KIAlpZiAoY3RfaXVfcmVxLT53d3BuICE9IHBvcnQtPnd3cG4pCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJLyogbG9va3MgbGlrZSBhIHZhbGlkIGRfaWQgKi8KIAlwb3J0LT5kX2lkID0gY3RfaXVfcmVzcC0+ZF9pZCAmIFpGQ1BfRElEX01BU0s7CiAJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX1BPUlRfRElEX0RJRCwgJnBvcnQtPnN0YXR1cyk7Ci1vdXQ6Ci0JbWVtcG9vbF9mcmVlKGdpZF9wbiwgcG9ydC0+YWRhcHRlci0+cG9vbC5kYXRhX2dpZF9wbik7CiB9CiAKLS8qKgotICogemZjcF9mY19uc19naWRfcG5fcmVxdWVzdCAtIGluaXRpYXRlIEdJRF9QTiBuYW1lc2VydmVyIHJlcXVlc3QKLSAqIEBlcnBfYWN0aW9uOiBwb2ludGVyIHRvIHpmY3BfZXJwX2FjdGlvbiB3aGVyZSBHSURfUE4gcmVxdWVzdCBpcyBuZWVkZWQKLSAqIHJldHVybjogLUVOT01FTSBvbiBlcnJvciwgMCBvdGhlcndpc2UKLSAqLwotaW50IHpmY3BfZmNfbnNfZ2lkX3BuX3JlcXVlc3Qoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqZXJwX2FjdGlvbikKK2ludCBzdGF0aWMgemZjcF9mY19uc19naWRfcG5fcmVxdWVzdChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uLAorCQkJCSAgICAgc3RydWN0IHpmY3BfZ2lkX3BuX2RhdGEgKmdpZF9wbikKIHsKLQlpbnQgcmV0OwotCXN0cnVjdCB6ZmNwX2dpZF9wbl9kYXRhICpnaWRfcG47CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGVycF9hY3Rpb24tPmFkYXB0ZXI7Ci0KLQlnaWRfcG4gPSBtZW1wb29sX2FsbG9jKGFkYXB0ZXItPnBvb2wuZGF0YV9naWRfcG4sIEdGUF9BVE9NSUMpOwotCWlmICghZ2lkX3BuKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldChnaWRfcG4sIDAsIHNpemVvZigqZ2lkX3BuKSk7CisJc3RydWN0IHpmY3BfZmNfbnNfaGFuZGxlcl9kYXRhIGNvbXBsX3JlYzsKKwlpbnQgcmV0OwogCiAJLyogc2V0dXAgcGFyYW1ldGVycyBmb3Igc2VuZCBnZW5lcmljIGNvbW1hbmQgKi8KIAlnaWRfcG4tPnBvcnQgPSBlcnBfYWN0aW9uLT5wb3J0OwotCWdpZF9wbi0+Y3QucG9ydCA9IGFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydDsKLQlnaWRfcG4tPmN0LmhhbmRsZXIgPSB6ZmNwX25zX2dpZF9wbl9oYW5kbGVyOwotCWdpZF9wbi0+Y3QuaGFuZGxlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGdpZF9wbjsKKwlnaWRfcG4tPmN0LndrYV9wb3J0ID0gJmFkYXB0ZXItPm5zcDsKKwlnaWRfcG4tPmN0LmhhbmRsZXIgPSB6ZmNwX2ZjX25zX2hhbmRsZXI7CisJZ2lkX3BuLT5jdC5oYW5kbGVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJmNvbXBsX3JlYzsKIAlnaWRfcG4tPmN0LnRpbWVvdXQgPSBaRkNQX05TX0dJRF9QTl9USU1FT1VUOwogCWdpZF9wbi0+Y3QucmVxID0gJmdpZF9wbi0+cmVxOwogCWdpZF9wbi0+Y3QucmVzcCA9ICZnaWRfcG4tPnJlc3A7CkBAIC0yMzQsMTAgKzI5Nyw0MiBAQAogCWdpZF9wbi0+Y3RfaXVfcmVxLmhlYWRlci5tYXhfcmVzX3NpemUgPSBaRkNQX0NUX01BWF9TSVpFOwogCWdpZF9wbi0+Y3RfaXVfcmVxLnd3cG4gPSBlcnBfYWN0aW9uLT5wb3J0LT53d3BuOwogCisJaW5pdF9jb21wbGV0aW9uKCZjb21wbF9yZWMuZG9uZSk7CisJY29tcGxfcmVjLmhhbmRsZXIgPSB6ZmNwX2ZjX25zX2dpZF9wbl9ldmFsOworCWNvbXBsX3JlYy5oYW5kbGVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgZ2lkX3BuOwogCXJldCA9IHpmY3BfZnNmX3NlbmRfY3QoJmdpZF9wbi0+Y3QsIGFkYXB0ZXItPnBvb2wuZnNmX3JlcV9lcnAsCiAJCQkgICAgICAgZXJwX2FjdGlvbik7CisJaWYgKCFyZXQpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsX3JlYy5kb25lKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHpmY3BfZmNfbnNfZ2lkX3BuX3JlcXVlc3QgLSBpbml0aWF0ZSBHSURfUE4gbmFtZXNlcnZlciByZXF1ZXN0CisgKiBAZXJwX2FjdGlvbjogcG9pbnRlciB0byB6ZmNwX2VycF9hY3Rpb24gd2hlcmUgR0lEX1BOIHJlcXVlc3QgaXMgbmVlZGVkCisgKiByZXR1cm46IC1FTk9NRU0gb24gZXJyb3IsIDAgb3RoZXJ3aXNlCisgKi8KK2ludCB6ZmNwX2ZjX25zX2dpZF9wbihzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uKQoreworCWludCByZXQ7CisJc3RydWN0IHpmY3BfZ2lkX3BuX2RhdGEgKmdpZF9wbjsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKKworCWdpZF9wbiA9IG1lbXBvb2xfYWxsb2MoYWRhcHRlci0+cG9vbC5kYXRhX2dpZF9wbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFnaWRfcG4pCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGdpZF9wbiwgMCwgc2l6ZW9mKCpnaWRfcG4pKTsKKworCXJldCA9IHpmY3Bfd2thX3BvcnRfZ2V0KCZhZGFwdGVyLT5uc3ApOwogCWlmIChyZXQpCi0JCW1lbXBvb2xfZnJlZShnaWRfcG4sIGFkYXB0ZXItPnBvb2wuZGF0YV9naWRfcG4pOworCQlnb3RvIG91dDsKKworCXJldCA9IHpmY3BfZmNfbnNfZ2lkX3BuX3JlcXVlc3QoZXJwX2FjdGlvbiwgZ2lkX3BuKTsKKworCXpmY3Bfd2thX3BvcnRfcHV0KCZhZGFwdGVyLT5uc3ApOworb3V0OgorCW1lbXBvb2xfZnJlZShnaWRfcG4sIGFkYXB0ZXItPnBvb2wuZGF0YV9naWRfcG4pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2NywxNCArMzYyLDE0IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0IHJlcTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgcmVzcDsKIAlzdHJ1Y3QgemZjcF9sc19hZGlzYyBsc19hZGlzYzsKLQlzdHJ1Y3QgemZjcF9sc19hZGlzY19hY2MgbHNfYWRpc2NfYWNjOworCXN0cnVjdCB6ZmNwX2xzX2FkaXNjIGxzX2FkaXNjX2FjYzsKIH07CiAKIHN0YXRpYyB2b2lkIHpmY3BfZmNfYWRpc2NfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHpmY3BfZWxzX2FkaXNjICphZGlzYyA9IChzdHJ1Y3QgemZjcF9lbHNfYWRpc2MgKikgZGF0YTsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gYWRpc2MtPmVscy5wb3J0OwotCXN0cnVjdCB6ZmNwX2xzX2FkaXNjX2FjYyAqbHNfYWRpc2MgPSAmYWRpc2MtPmxzX2FkaXNjX2FjYzsKKwlzdHJ1Y3QgemZjcF9sc19hZGlzYyAqbHNfYWRpc2MgPSAmYWRpc2MtPmxzX2FkaXNjX2FjYzsKIAogCWlmIChhZGlzYy0+ZWxzLnN0YXR1cykgewogCQkvKiByZXF1ZXN0IHJlamVjdGVkIG9yIHRpbWVkIG91dCAqLwpAQCAtMzA3LDcgKzQwMiw3IEBACiAJc2dfaW5pdF9vbmUoYWRpc2MtPmVscy5yZXEsICZhZGlzYy0+bHNfYWRpc2MsCiAJCSAgICBzaXplb2Yoc3RydWN0IHpmY3BfbHNfYWRpc2MpKTsKIAlzZ19pbml0X29uZShhZGlzYy0+ZWxzLnJlc3AsICZhZGlzYy0+bHNfYWRpc2NfYWNjLAotCQkgICAgc2l6ZW9mKHN0cnVjdCB6ZmNwX2xzX2FkaXNjX2FjYykpOworCQkgICAgc2l6ZW9mKHN0cnVjdCB6ZmNwX2xzX2FkaXNjKSk7CiAKIAlhZGlzYy0+ZWxzLnJlcV9jb3VudCA9IDE7CiAJYWRpc2MtPmVscy5yZXNwX2NvdW50ID0gMTsKQEAgLTM0MSwzNyArNDM2LDEzIEBACiAKIAl6ZmNwX3BvcnRfZ2V0KHBvcnQpOwogCXJldHZhbCA9IHpmY3BfZmNfYWRpc2MocG9ydCk7Ci0JaWYgKHJldHZhbCA9PSAwIHx8IHJldHZhbCA9PSAtRUJVU1kpCisJaWYgKHJldHZhbCA9PSAwKQogCQlyZXR1cm47CiAKIAkvKiBzZW5kIG9mIEFESVNDIHdhcyBub3QgcG9zc2libGUgKi8KIAl6ZmNwX3BvcnRfcHV0KHBvcnQpOwotCXpmY3BfZXJwX3BvcnRfZm9yY2VkX3Jlb3Blbihwb3J0LCAwLCA2NSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgemZjcF9zY2FuX2dldF9uYW1lc2VydmVyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IHJldDsKLQotCWlmICghYWRhcHRlci0+bmFtZXNlcnZlcl9wb3J0KQotCQlyZXR1cm4gLUVJTlRSOwotCi0JaWYgKCFhdG9taWNfdGVzdF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9VTkJMT0NLRUQsCi0JCQkgICAgICAgJmFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydC0+c3RhdHVzKSkgewotCQlyZXQgPSB6ZmNwX2VycF9wb3J0X3Jlb3BlbihhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQsIDAsIDE0OCwKLQkJCQkJICAgTlVMTCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwotCQl6ZmNwX3BvcnRfcHV0KGFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydCk7Ci0JfQotCXJldHVybiAhYXRvbWljX3Rlc3RfbWFzayhaRkNQX1NUQVRVU19DT01NT05fVU5CTE9DS0VELAotCQkJCSAgJmFkYXB0ZXItPm5hbWVzZXJ2ZXJfcG9ydC0+c3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgemZjcF9ncG5fZnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIF9kb25lKQotewotCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKV9kb25lKTsKKwlpZiAocmV0dmFsICE9IC1FQlVTWSkKKwkJemZjcF9lcnBfcG9ydF9mb3JjZWRfcmVvcGVuKHBvcnQsIDAsIDY1LCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgemZjcF9mcmVlX3NnX2VudihzdHJ1Y3QgemZjcF9ncG5fZnQgKmdwbl9mdCkKQEAgLTQxNSw3ICs0ODYsNyBAQAogewogCXN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0ID0gJmdwbl9mdC0+Y3Q7CiAJc3RydWN0IGN0X2l1X2dwbl9mdF9yZXEgKnJlcSA9IHNnX3ZpcnQoJmdwbl9mdC0+c2dfcmVxKTsKLQlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCXN0cnVjdCB6ZmNwX2ZjX25zX2hhbmRsZXJfZGF0YSBjb21wbF9yZWM7CiAJaW50IHJldDsKIAogCS8qIHByZXBhcmUgQ1QgSVUgZm9yIEdQTl9GVCAqLwpAQCAtNDMyLDE5ICs1MDMsMjAgQEAKIAlyZXEtPmZjNF90eXBlID0gWkZDUF9DVF9TQ1NJX0ZDUDsKIAogCS8qIHByZXBhcmUgemZjcF9zZW5kX2N0ICovCi0JY3QtPnBvcnQgPSBhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQ7Ci0JY3QtPmhhbmRsZXIgPSB6ZmNwX2dwbl9mdF9oYW5kbGVyOwotCWN0LT5oYW5kbGVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmZG9uZTsKKwljdC0+d2thX3BvcnQgPSAmYWRhcHRlci0+bnNwOworCWN0LT5oYW5kbGVyID0gemZjcF9mY19uc19oYW5kbGVyOworCWN0LT5oYW5kbGVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmY29tcGxfcmVjOwogCWN0LT50aW1lb3V0ID0gMTA7CiAJY3QtPnJlcSA9ICZncG5fZnQtPnNnX3JlcTsKIAljdC0+cmVzcCA9IGdwbl9mdC0+c2dfcmVzcDsKIAljdC0+cmVxX2NvdW50ID0gMTsKIAljdC0+cmVzcF9jb3VudCA9IFpGQ1BfR1BOX0ZUX0JVRkZFUlM7CiAKLQlpbml0X2NvbXBsZXRpb24oJmRvbmUpOworCWluaXRfY29tcGxldGlvbigmY29tcGxfcmVjLmRvbmUpOworCWNvbXBsX3JlYy5oYW5kbGVyID0gTlVMTDsKIAlyZXQgPSB6ZmNwX2ZzZl9zZW5kX2N0KGN0LCBOVUxMLCBOVUxMKTsKIAlpZiAoIXJldCkKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsX3JlYy5kb25lKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NTQsOSArNTI2LDggQEAKIAogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9OT0VTQywgJnBvcnQtPnN0YXR1cyk7CiAKLQlpZiAocG9ydCA9PSBhZGFwdGVyLT5uYW1lc2VydmVyX3BvcnQpCi0JCXJldHVybjsKLQlpZiAoKHBvcnQtPnN1cHBvcnRlZF9jbGFzc2VzICE9IDApIHx8IChwb3J0LT51bml0cyAhPSAwKSkgeworCWlmICgocG9ydC0+c3VwcG9ydGVkX2NsYXNzZXMgIT0gMCkgfHwKKwkgICAgIWxpc3RfZW1wdHkoJnBvcnQtPnVuaXRfbGlzdF9oZWFkKSkgewogCQl6ZmNwX3BvcnRfcHV0KHBvcnQpOwogCQlyZXR1cm47CiAJfQpAQCAtNDcyLDEwICs1NDMsMTAgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gZ3BuX2Z0LT5zZ19yZXNwOwogCXN0cnVjdCBjdF9oZHIgKmhkciA9IHNnX3ZpcnQoc2cpOwogCXN0cnVjdCBncG5fZnRfcmVzcF9hY2MgKmFjYyA9IHNnX3ZpcnQoc2cpOwotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjdC0+cG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gY3QtPndrYV9wb3J0LT5hZGFwdGVyOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQsICp0bXA7CiAJdTMyIGRfaWQ7Ci0JaW50IHJldCA9IDAsIHg7CisJaW50IHJldCA9IDAsIHgsIGxhc3QgPSAwOwogCiAJaWYgKGN0LT5zdGF0dXMpCiAJCXJldHVybiAtRUlPOwpAQCAtNDkyLDE5ICs1NjMsMjcgQEAKIAlkb3duKCZ6ZmNwX2RhdGEuY29uZmlnX3NlbWEpOwogCiAJLyogZmlyc3QgZW50cnkgaXMgdGhlIGhlYWRlciAqLwotCWZvciAoeCA9IDE7IHggPCBaRkNQX0dQTl9GVF9NQVhfRU5UUklFUzsgeCsrKSB7CisJZm9yICh4ID0gMTsgeCA8IFpGQ1BfR1BOX0ZUX01BWF9FTlRSSUVTICYmICFsYXN0OyB4KyspIHsKIAkJaWYgKHggJSAoWkZDUF9HUE5fRlRfRU5UUklFUyArIDEpKQogCQkJYWNjKys7CiAJCWVsc2UKIAkJCWFjYyA9IHNnX3ZpcnQoKytzZyk7CiAKKwkJbGFzdCA9IGFjYy0+Y29udHJvbCAmIDB4ODA7CiAJCWRfaWQgPSBhY2MtPnBvcnRfaWRbMF0gPDwgMTYgfCBhY2MtPnBvcnRfaWRbMV0gPDwgOCB8CiAJCSAgICAgICBhY2MtPnBvcnRfaWRbMl07CiAKLQkJLyogc2tpcCB0aGUgYWRhcHRlcidzIHBvcnQgYW5kIGtub3duIHJlbW90ZSBwb3J0cyAqLwotCQlpZiAoYWNjLT53d3BuID09IGZjX2hvc3RfcG9ydF9uYW1lKGFkYXB0ZXItPnNjc2lfaG9zdCkgfHwKLQkJICAgICB6ZmNwX2dldF9wb3J0X2J5X2RpZChhZGFwdGVyLCBkX2lkKSkKKwkJLyogZG9uJ3QgYXR0YWNoIHBvcnRzIHdpdGggYSB3ZWxsIGtub3duIGFkZHJlc3MgKi8KKwkJaWYgKChkX2lkICYgWkZDUF9ESURfV0tBKSA9PSBaRkNQX0RJRF9XS0EpCiAJCQljb250aW51ZTsKKwkJLyogc2tpcCB0aGUgYWRhcHRlcidzIHBvcnQgYW5kIGtub3duIHJlbW90ZSBwb3J0cyAqLworCQlpZiAoYWNjLT53d3BuID09IGZjX2hvc3RfcG9ydF9uYW1lKGFkYXB0ZXItPnNjc2lfaG9zdCkpCisJCQljb250aW51ZTsKKwkJcG9ydCA9IHpmY3BfZ2V0X3BvcnRfYnlfd3dwbihhZGFwdGVyLCBhY2MtPnd3cG4pOworCQlpZiAocG9ydCkgeworCQkJemZjcF9wb3J0X2dldChwb3J0KTsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJcG9ydCA9IHpmY3BfcG9ydF9lbnF1ZXVlKGFkYXB0ZXIsIGFjYy0+d3dwbiwKIAkJCQkJIFpGQ1BfU1RBVFVTX1BPUlRfRElEX0RJRCB8CkBAIC01MTMsOCArNTkyLDYgQEAKIAkJCXJldCA9IFBUUl9FUlIocG9ydCk7CiAJCWVsc2UKIAkJCXpmY3BfZXJwX3BvcnRfcmVvcGVuKHBvcnQsIDAsIDE0OSwgTlVMTCk7Ci0JCWlmIChhY2MtPmNvbnRyb2wgJiAweDgwKSAvKiBsYXN0IGVudHJ5ICovCi0JCQlicmVhazsKIAl9CiAKIAl6ZmNwX2VycF93YWl0KGFkYXB0ZXIpOwpAQCAtNTM3LDEzICs2MTQsMTUgQEAKIAlpZiAoZmNfaG9zdF9wb3J0X3R5cGUoYWRhcHRlci0+c2NzaV9ob3N0KSAhPSBGQ19QT1JUVFlQRV9OUE9SVCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSB6ZmNwX3NjYW5fZ2V0X25hbWVzZXJ2ZXIoYWRhcHRlcik7CisJcmV0ID0gemZjcF93a2FfcG9ydF9nZXQoJmFkYXB0ZXItPm5zcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCWdwbl9mdCA9IHpmY3BfYWxsb2Nfc2dfZW52KCk7Ci0JaWYgKCFncG5fZnQpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghZ3BuX2Z0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0ID0gemZjcF9zY2FuX2lzc3VlX2dwbl9mdChncG5fZnQsIGFkYXB0ZXIpOwpAQCAtNTU2LDcgKzYzNSw4IEBACiAJCX0KIAl9CiAJemZjcF9mcmVlX3NnX2VudihncG5fZnQpOwotCitvdXQ6CisJemZjcF93a2FfcG9ydF9wdXQoJmFkYXB0ZXItPm5zcCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggMTljMWNhOS4uNzM5MzU2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC01MCwxOSArNTAsMTYgQEAKIAlbRlNGX1FUQ0JfVVBMT0FEX0NPTlRST0xfRklMRV0gPSAgRlNGX1NVUFBPUlRfQ09NTUFORAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnpmY3BfYWN0X3N1YnRhYmxlX3R5cGVbXSA9IHsKLQkidW5rbm93biIsICJPUyIsICJXV1BOIiwgIkRJRCIsICJMVU4iCi19OwotCiBzdGF0aWMgdm9pZCB6ZmNwX2FjdF9ldmFsX2VycihzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCB1MzIgdGFibGUpCiB7CiAJdTE2IHN1YnRhYmxlID0gdGFibGUgPj4gMTY7CiAJdTE2IHJ1bGUgPSB0YWJsZSAmIDB4ZmZmZjsKKwljb25zdCBjaGFyICphY3RfdHlwZVtdID0geyAidW5rbm93biIsICJPUyIsICJXV1BOIiwgIkRJRCIsICJMVU4iIH07CiAKLQlpZiAoc3VidGFibGUgJiYgc3VidGFibGUgPCBBUlJBWV9TSVpFKHpmY3BfYWN0X3N1YnRhYmxlX3R5cGUpKQorCWlmIChzdWJ0YWJsZSAmJiBzdWJ0YWJsZSA8IEFSUkFZX1NJWkUoYWN0X3R5cGUpKQogCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJBY2Nlc3MgZGVuaWVkIGluIHN1YnRhYmxlICVzLCBydWxlICVkLlxuIiwKLQkJCSB6ZmNwX2FjdF9zdWJ0YWJsZV90eXBlW3N1YnRhYmxlXSwgcnVsZSk7CisJCQkgIkFjY2VzcyBkZW5pZWQgYWNjb3JkaW5nIHRvIEFDVCBydWxlIHR5cGUgJXMsICIKKwkJCSAicnVsZSAlZFxuIiwgYWN0X3R5cGVbc3VidGFibGVdLCBydWxlKTsKIH0KIAogc3RhdGljIHZvaWQgemZjcF9mc2ZfYWNjZXNzX2RlbmllZF9wb3J0KHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSwKQEAgLTcwLDggKzY3LDggQEAKIHsKIAlzdHJ1Y3QgZnNmX3F0Y2JfaGVhZGVyICpoZWFkZXIgPSAmcmVxLT5xdGNiLT5oZWFkZXI7CiAJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkgIkFjY2VzcyBkZW5pZWQsIGNhbm5vdCBzZW5kIGNvbW1hbmQgdG8gcG9ydCAweCUwMTZMeC5cbiIsCi0JCSBwb3J0LT53d3BuKTsKKwkJICJBY2Nlc3MgZGVuaWVkIHRvIHBvcnQgMHglMDE2THhcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwogCXpmY3BfYWN0X2V2YWxfZXJyKHJlcS0+YWRhcHRlciwgaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwuaGFsZndvcmRbMF0pOwogCXpmY3BfYWN0X2V2YWxfZXJyKHJlcS0+YWRhcHRlciwgaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwuaGFsZndvcmRbMV0pOwogCXpmY3BfZXJwX3BvcnRfYWNjZXNzX2RlbmllZChwb3J0LCA1NSwgcmVxKTsKQEAgLTgzLDggKzgwLDkgQEAKIHsKIAlzdHJ1Y3QgZnNmX3F0Y2JfaGVhZGVyICpoZWFkZXIgPSAmcmVxLT5xdGNiLT5oZWFkZXI7CiAJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkgIkFjY2VzcyBkZW5pZWQgZm9yIHVuaXQgMHglMDE2THggb24gcG9ydCAweCUwMTZMeC5cbiIsCi0JCSB1bml0LT5mY3BfbHVuLCB1bml0LT5wb3J0LT53d3BuKTsKKwkJICJBY2Nlc3MgZGVuaWVkIHRvIHVuaXQgMHglMDE2THggb24gcG9ydCAweCUwMTZMeFxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+ZmNwX2x1biwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+cG9ydC0+d3dwbik7CiAJemZjcF9hY3RfZXZhbF9lcnIocmVxLT5hZGFwdGVyLCBoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC5oYWxmd29yZFswXSk7CiAJemZjcF9hY3RfZXZhbF9lcnIocmVxLT5hZGFwdGVyLCBoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC5oYWxmd29yZFsxXSk7CiAJemZjcF9lcnBfdW5pdF9hY2Nlc3NfZGVuaWVkKHVuaXQsIDU5LCByZXEpOwpAQCAtOTMsOSArOTEsOCBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9jbGFzc19ub3Rfc3VwcChzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEpCiB7Ci0JZGV2X2VycigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCSJSZXF1aXJlZCBGQyBjbGFzcyBub3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIsICIKLQkJInNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIpOworCWRldl9lcnIoJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAiRkNQIGRldmljZSBub3QgIgorCQkib3BlcmF0aW9uYWwgYmVjYXVzZSBvZiBhbiB1bnN1cHBvcnRlZCBGQyBjbGFzc1xuIik7CiAJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihyZXEtPmFkYXB0ZXIsIDAsIDEyMywgcmVxKTsKIAlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiB9CkBAIC0xNzEsNDIgKzE2OCw2IEBACiAJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmemZjcF9kYXRhLmNvbmZpZ19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHpmY3BfZnNmX2JpdF9lcnJvcl90aHJlc2hvbGQoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQotewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7Ci0Jc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKnNyX2J1ZiA9IHJlcS0+ZGF0YTsKLQlzdHJ1Y3QgZnNmX2JpdF9lcnJvcl9wYXlsb2FkICplcnIgPSAmc3JfYnVmLT5wYXlsb2FkLmJpdF9lcnJvcjsKLQotCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCSAiV2FybmluZzogYml0IGVycm9yIHRocmVzaG9sZCBkYXRhICIKLQkJICJyZWNlaXZlZCBmb3IgdGhlIGFkYXB0ZXI6ICIKLQkJICJsaW5rIGZhaWx1cmVzID0gJWksIGxvc3Mgb2Ygc3luYyBlcnJvcnMgPSAlaSwgIgotCQkgImxvc3Mgb2Ygc2lnbmFsIGVycm9ycyA9ICVpLCAiCi0JCSAicHJpbWl0aXZlIHNlcXVlbmNlIGVycm9ycyA9ICVpLCAiCi0JCSAiaW52YWxpZCB0cmFuc21pc3Npb24gd29yZCBlcnJvcnMgPSAlaSwgIgotCQkgIkNSQyBlcnJvcnMgPSAlaSkuXG4iLAotCQkgZXJyLT5saW5rX2ZhaWx1cmVfZXJyb3JfY291bnQsCi0JCSBlcnItPmxvc3Nfb2Zfc3luY19lcnJvcl9jb3VudCwKLQkJIGVyci0+bG9zc19vZl9zaWduYWxfZXJyb3JfY291bnQsCi0JCSBlcnItPnByaW1pdGl2ZV9zZXF1ZW5jZV9lcnJvcl9jb3VudCwKLQkJIGVyci0+aW52YWxpZF90cmFuc21pc3Npb25fd29yZF9lcnJvcl9jb3VudCwKLQkJIGVyci0+Y3JjX2Vycm9yX2NvdW50KTsKLQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkgIkFkZGl0aW9uYWwgYml0IGVycm9yIHRocmVzaG9sZCBkYXRhIG9mIHRoZSBhZGFwdGVyOiAiCi0JCSAicHJpbWl0aXZlIHNlcXVlbmNlIGV2ZW50IHRpbWUtb3V0cyA9ICVpLCAiCi0JCSAiZWxhc3RpYyBidWZmZXIgb3ZlcnJ1biBlcnJvcnMgPSAlaSwgIgotCQkgImFkdmVydGlzZWQgcmVjZWl2ZSBidWZmZXItdG8tYnVmZmVyIGNyZWRpdCA9ICVpLCAiCi0JCSAiY3VycmVudCByZWNlaWNlIGJ1ZmZlci10by1idWZmZXIgY3JlZGl0ID0gJWksICIKLQkJICJhZHZlcnRpc2VkIHRyYW5zbWl0IGJ1ZmZlci10by1idWZmZXIgY3JlZGl0ID0gJWksICIKLQkJICJjdXJyZW50IHRyYW5zbWl0IGJ1ZmZlci10by1idWZmZXIgY3JlZGl0ID0gJWkpLlxuIiwKLQkJIGVyci0+cHJpbWl0aXZlX3NlcXVlbmNlX2V2ZW50X3RpbWVvdXRfY291bnQsCi0JCSBlcnItPmVsYXN0aWNfYnVmZmVyX292ZXJydW5fZXJyb3JfY291bnQsCi0JCSBlcnItPmFkdmVydGlzZWRfcmVjZWl2ZV9iMmJfY3JlZGl0LAotCQkgZXJyLT5jdXJyZW50X3JlY2VpdmVfYjJiX2NyZWRpdCwKLQkJIGVyci0+YWR2ZXJ0aXNlZF90cmFuc21pdF9iMmJfY3JlZGl0LAotCQkgZXJyLT5jdXJyZW50X3RyYW5zbWl0X2IyYl9jcmVkaXQpOwotfQotCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9saW5rX2Rvd25faW5mb19ldmFsKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSwgdTggaWQsCiAJCQkJCSBzdHJ1Y3QgZnNmX2xpbmtfZG93bl9pbmZvICpsaW5rX2Rvd24pCiB7CkBAIC0yMjMsNjIgKzE4NCw2NiBAQAogCXN3aXRjaCAobGlua19kb3duLT5lcnJvcl9jb2RlKSB7CiAJY2FzZSBGU0ZfUFNRX0xJTktfTk9fTElHSFQ6CiAJCWRldl93YXJuKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSAiVGhlIGxvY2FsIGxpbmsgaXMgZG93bjogbm8gbGlnaHQgZGV0ZWN0ZWQuXG4iKTsKKwkJCSAiVGhlcmUgaXMgbm8gbGlnaHQgc2lnbmFsIGZyb20gdGhlIGxvY2FsICIKKwkJCSAiZmlicmUgY2hhbm5lbCBjYWJsZVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX1dSQVBfUExVRzoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgbG9jYWwgbGluayBpcyBkb3duOiB3cmFwIHBsdWcgZGV0ZWN0ZWQuXG4iKTsKKwkJCSAiVGhlcmUgaXMgYSB3cmFwIHBsdWcgaW5zdGVhZCBvZiBhIGZpYnJlICIKKwkJCSAiY2hhbm5lbCBjYWJsZVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX05PX0ZDUDoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgbG9jYWwgbGluayBpcyBkb3duOiAiCi0JCQkgImFkamFjZW50IG5vZGUgb24gbGluayBkb2VzIG5vdCBzdXBwb3J0IEZDUC5cbiIpOworCQkJICJUaGUgYWRqYWNlbnQgZmlicmUgY2hhbm5lbCBub2RlIGRvZXMgbm90ICIKKwkJCSAic3VwcG9ydCBGQ1BcbiIpOwogCQlicmVhazsKIAljYXNlIEZTRl9QU1FfTElOS19GSVJNV0FSRV9VUERBVEU6CiAJCWRldl93YXJuKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSAiVGhlIGxvY2FsIGxpbmsgaXMgZG93bjogIgotCQkJICJmaXJtd2FyZSB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4iKTsKKwkJCSAiVGhlIEZDUCBkZXZpY2UgaXMgc3VzcGVuZGVkIGJlY2F1c2Ugb2YgYSAiCisJCQkgImZpcm13YXJlIHVwZGF0ZVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX0lOVkFMSURfV1dQTjoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgbG9jYWwgbGluayBpcyBkb3duOiAiCi0JCQkgImR1cGxpY2F0ZSBvciBpbnZhbGlkIFdXUE4gZGV0ZWN0ZWQuXG4iKTsKKwkJCSAiVGhlIEZDUCBkZXZpY2UgZGV0ZWN0ZWQgYSBXV1BOIHRoYXQgaXMgIgorCQkJICJkdXBsaWNhdGUgb3Igbm90IHZhbGlkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUFNRX0xJTktfTk9fTlBJVl9TVVBQT1JUOgogCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIlRoZSBsb2NhbCBsaW5rIGlzIGRvd246ICIKLQkJCSAibm8gc3VwcG9ydCBmb3IgTlBJViBieSBGYWJyaWMuXG4iKTsKKwkJCSAiVGhlIGZpYnJlIGNoYW5uZWwgZmFicmljIGRvZXMgbm90IHN1cHBvcnQgTlBJVlxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX05PX0ZDUF9SRVNPVVJDRVM6CiAJCWRldl93YXJuKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSAiVGhlIGxvY2FsIGxpbmsgaXMgZG93bjogIgotCQkJICJvdXQgb2YgcmVzb3VyY2UgaW4gRkNQIGRhdWdodGVyY2FyZC5cbiIpOworCQkJICJUaGUgRkNQIGFkYXB0ZXIgY2Fubm90IHN1cHBvcnQgbW9yZSBOUElWIHBvcnRzXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUFNRX0xJTktfTk9fRkFCUklDX1JFU09VUkNFUzoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgbG9jYWwgbGluayBpcyBkb3duOiAiCi0JCQkgIm91dCBvZiByZXNvdXJjZSBpbiBGYWJyaWMuXG4iKTsKKwkJCSAiVGhlIGFkamFjZW50IHN3aXRjaCBjYW5ub3Qgc3VwcG9ydCAiCisJCQkgIm1vcmUgTlBJViBwb3J0c1xuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX0ZBQlJJQ19MT0dJTl9VTkFCTEU6CiAJCWRldl93YXJuKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSAiVGhlIGxvY2FsIGxpbmsgaXMgZG93bjogIgotCQkJICJ1bmFibGUgdG8gbG9naW4gdG8gRmFicmljLlxuIik7CisJCQkgIlRoZSBGQ1AgYWRhcHRlciBjb3VsZCBub3QgbG9nIGluIHRvIHRoZSAiCisJCQkgImZpYnJlIGNoYW5uZWwgZmFicmljXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUFNRX0xJTktfV1dQTl9BU1NJR05NRU5UX0NPUlJVUFRFRDoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJXV1BOIGFzc2lnbm1lbnQgZmlsZSBjb3JydXB0ZWQgb24gYWRhcHRlci5cbiIpOworCQkJICJUaGUgV1dQTiBhc3NpZ25tZW50IGZpbGUgb24gdGhlIEZDUCBhZGFwdGVyICIKKwkJCSAiaGFzIGJlZW4gZGFtYWdlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX01PREVfVEFCTEVfQ1VSUlVQVEVEOgogCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIk1vZGUgdGFibGUgY29ycnVwdGVkIG9uIGFkYXB0ZXIuXG4iKTsKKwkJCSAiVGhlIG1vZGUgdGFibGUgb24gdGhlIEZDUCBhZGFwdGVyICIKKwkJCSAiaGFzIGJlZW4gZGFtYWdlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1BTUV9MSU5LX05PX1dXUE5fQVNTSUdOTUVOVDoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJObyBXV1BOIGZvciBhc3NpZ25tZW50IHRhYmxlIG9uIGFkYXB0ZXIuXG4iKTsKKwkJCSAiQWxsIE5QSVYgcG9ydHMgb24gdGhlIEZDUCBhZGFwdGVyIGhhdmUgIgorCQkJICJiZWVuIGFzc2lnbmVkXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X3dhcm4oJnJlcS0+YWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgbG9jYWwgbGluayB0byBhZGFwdGVyIGlzIGRvd24uXG4iKTsKKwkJCSAiVGhlIGxpbmsgYmV0d2VlbiB0aGUgRkNQIGFkYXB0ZXIgYW5kICIKKwkJCSAidGhlIEZDIGZhYnJpYyBpcyBkb3duXG4iKTsKIAl9CiBvdXQ6CiAJemZjcF9lcnBfYWRhcHRlcl9mYWlsZWQoYWRhcHRlciwgaWQsIHJlcSk7CkBAIC0yODYsMjcgKzI1MSwxOCBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX2ZzZl9zdGF0dXNfcmVhZF9saW5rX2Rvd24oc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7CiAJc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKnNyX2J1ZiA9IHJlcS0+ZGF0YTsKIAlzdHJ1Y3QgZnNmX2xpbmtfZG93bl9pbmZvICpsZGkgPQogCQkoc3RydWN0IGZzZl9saW5rX2Rvd25faW5mbyAqKSAmc3JfYnVmLT5wYXlsb2FkOwogCiAJc3dpdGNoIChzcl9idWYtPnN0YXR1c19zdWJ0eXBlKSB7CiAJY2FzZSBGU0ZfU1RBVFVTX1JFQURfU1VCX05PX1BIWVNJQ0FMX0xJTks6Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIlBoeXNpY2FsIGxpbmsgaXMgZG93bi5cbiIpOwogCQl6ZmNwX2ZzZl9saW5rX2Rvd25faW5mb19ldmFsKHJlcSwgMzgsIGxkaSk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX1NVQl9GRElTQ19GQUlMRUQ6Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIkxvY2FsIGxpbmsgaXMgZG93biAiCi0JCQkgImR1ZSB0byBmYWlsZWQgRkRJU0MgbG9naW4uXG4iKTsKIAkJemZjcF9mc2ZfbGlua19kb3duX2luZm9fZXZhbChyZXEsIDM5LCBsZGkpOwogCQlicmVhazsKIAljYXNlIEZTRl9TVEFUVVNfUkVBRF9TVUJfRklSTVdBUkVfVVBEQVRFOgotCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJMb2NhbCBsaW5rIGlzIGRvd24gIgotCQkJICJkdWUgdG8gZmlybXdhcmUgdXBkYXRlIG9uIGFkYXB0ZXIuXG4iKTsKIAkJemZjcF9mc2ZfbGlua19kb3duX2luZm9fZXZhbChyZXEsIDQwLCBOVUxMKTsKIAl9OwogfQpAQCAtMzM1LDE0ICsyOTEsMTcgQEAKIAljYXNlIEZTRl9TVEFUVVNfUkVBRF9TRU5TRV9EQVRBX0FWQUlMOgogCQlicmVhazsKIAljYXNlIEZTRl9TVEFUVVNfUkVBRF9CSVRfRVJST1JfVEhSRVNIT0xEOgotCQl6ZmNwX2ZzZl9iaXRfZXJyb3JfdGhyZXNob2xkKHJlcSk7CisJCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCisJCQkgIlRoZSBlcnJvciB0aHJlc2hvbGQgZm9yIGNoZWNrc3VtIHN0YXRpc3RpY3MgIgorCQkJICJoYXMgYmVlbiBleGNlZWRlZFxuIik7CisJCXpmY3BfaGJhX2RiZl9ldmVudF9iZXJyKGFkYXB0ZXIsIHJlcSk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX0xJTktfRE9XTjoKIAkJemZjcF9mc2Zfc3RhdHVzX3JlYWRfbGlua19kb3duKHJlcSk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX1NUQVRVU19SRUFEX0xJTktfVVA6CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIkxvY2FsIGxpbmsgd2FzIHJlcGx1Z2dlZC5cbiIpOworCQkJICJUaGUgbG9jYWwgbGluayBoYXMgYmVlbiByZXN0b3JlZFxuIik7CiAJCS8qIEFsbCBwb3J0cyBzaG91bGQgYmUgbWFya2VkIGFzIHJlYWR5IHRvIHJ1biBhZ2FpbiAqLwogCQl6ZmNwX2VycF9tb2RpZnlfYWRhcHRlcl9zdGF0dXMoYWRhcHRlciwgMzAsIE5VTEwsCiAJCQkJCSAgICAgICBaRkNQX1NUQVRVU19DT01NT05fUlVOTklORywKQEAgLTM3MCw3ICszMjksNyBAQAogCXpmY3BfZnNmX3JlcV9mcmVlKHJlcSk7CiAKIAlhdG9taWNfaW5jKCZhZGFwdGVyLT5zdGF0X21pc3MpOwotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnN0YXRfd29yayk7CisJcXVldWVfd29yayh6ZmNwX2RhdGEud29ya19xdWV1ZSwgJmFkYXB0ZXItPnN0YXRfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIHpmY3BfZnNmX2ZzZnN0YXR1c19xdWFsX2V2YWwoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQpAQCAtMzg2LDggKzM0NSw4IEBACiAJCWJyZWFrOwogCWNhc2UgRlNGX1NRX05PX1JFQ09NOgogCQlkZXZfZXJyKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJObyByZWNvbW1lbmRhdGlvbiBjb3VsZCBiZSBnaXZlbiBmb3IgYSAiCi0JCQkicHJvYmxlbSBvbiB0aGUgYWRhcHRlci5cbiIpOworCQkJIlRoZSBGQ1AgYWRhcHRlciByZXBvcnRlZCBhIHByb2JsZW0gIgorCQkJInRoYXQgY2Fubm90IGJlIHJlY292ZXJlZFxuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24ocmVxLT5hZGFwdGVyLCAwLCAxMjEsIHJlcSk7CiAJCWJyZWFrOwogCX0KQEAgLTQwMyw4ICszNjIsNyBAQAogCXN3aXRjaCAocmVxLT5xdGNiLT5oZWFkZXIuZnNmX3N0YXR1cykgewogCWNhc2UgRlNGX1VOS05PV05fQ09NTUFORDoKIAkJZGV2X2VycigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkiQ29tbWFuZCBpc3N1ZWQgYnkgdGhlIGRldmljZSBkcml2ZXIgKDB4JXgpIGlzICIKLQkJCSJub3Qga25vd24gYnkgdGhlIGFkYXB0ZXIuXG4iLAorCQkJIlRoZSBGQ1AgYWRhcHRlciBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGNvbW1hbmQgMHgleFxuIiwKIAkJCXJlcS0+cXRjYi0+aGVhZGVyLmZzZl9jb21tYW5kKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihyZXEtPmFkYXB0ZXIsIDAsIDEyMCwgcmVxKTsKIAkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwpAQCAtNDM1LDExICszOTMsOSBAQAogCQlyZXR1cm47CiAJY2FzZSBGU0ZfUFJPVF9RVENCX1ZFUlNJT05fRVJST1I6CiAJCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJUaGUgUVRDQiB2ZXJzaW9uIHJlcXVlc3RlZCBieSB6ZmNwICgweCV4KSBpcyBub3QgIgotCQkJInN1cHBvcnRlZCBieSB0aGUgRkNQIGFkYXB0ZXIgKGxvd2VzdCBzdXBwb3J0ZWQgIgotCQkJIjB4JXgsIGhpZ2hlc3Qgc3VwcG9ydGVkIDB4JXgpLlxuIiwKLQkJCUZTRl9RVENCX0NVUlJFTlRfVkVSU0lPTiwgcHNxLT53b3JkWzBdLAotCQkJcHNxLT53b3JkWzFdKTsKKwkJCSJRVENCIHZlcnNpb24gMHgleCBub3Qgc3VwcG9ydGVkIGJ5IEZDUCBhZGFwdGVyICIKKwkJCSIoMHgleCB0byAweCV4KVxuIiwgRlNGX1FUQ0JfQ1VSUkVOVF9WRVJTSU9OLAorCQkJcHNxLT53b3JkWzBdLCBwc3EtPndvcmRbMV0pOwogCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsIDExNywgcmVxKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUFJPVF9FUlJPUl9TVEFURToKQEAgLTQ0OSw4ICs0MDUsNyBAQAogCQlicmVhazsKIAljYXNlIEZTRl9QUk9UX1VOU1VQUF9RVENCX1RZUEU6CiAJCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJQYWNrZXQgaGVhZGVyIHR5cGUgdXNlZCBieSB0aGUgZGV2aWNlIGRyaXZlciBpcyAiCi0JCQkiaW5jb21wYXRpYmxlIHdpdGggdGhhdCB1c2VkIG9uIHRoZSBhZGFwdGVyLlxuIik7CisJCQkiVGhlIFFUQ0IgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBGQ1AgYWRhcHRlclxuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgMTE4LCByZXEpOwogCQlicmVhazsKIAljYXNlIEZTRl9QUk9UX0hPU1RfQ09OTkVDVElPTl9JTklUSUFMSVpJTkc6CkBAIC00NTksNyArNDE0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfUFJPVF9EVVBMSUNBVEVfUkVRVUVTVF9JRDoKIAkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJIlRoZSByZXF1ZXN0IGlkZW50aWZpZXIgMHglTHggaXMgYW1iaWd1b3VzLlxuIiwKKwkJCSIweCVMeCBpcyBhbiBhbWJpZ3VvdXMgcmVxdWVzdCBpZGVudGlmaWVyXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylxdGNiLT5ib3R0b20uc3VwcG9ydC5yZXFfaGFuZGxlKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCA3OCwgcmVxKTsKIAkJYnJlYWs7CkBAIC00NzksOSArNDM0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJIlRyYW5zZmVyIHByb3RvY29sIHN0YXR1cyBpbmZvcm1hdGlvbiIKLQkJCSJwcm92aWRlZCBieSB0aGUgYWRhcHRlciAoMHgleCkgIgotCQkJImlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGRldmljZSBkcml2ZXIuXG4iLAorCQkJIjB4JXggaXMgbm90IGEgdmFsaWQgdHJhbnNmZXIgcHJvdG9jb2wgc3RhdHVzXG4iLAogCQkJcXRjYi0+cHJlZml4LnByb3Rfc3RhdHVzKTsKIAkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAxMTksIHJlcSk7CiAJfQpAQCAtNTU5LDMzICs1MTIsMTcgQEAKIAkJYWRhcHRlci0+cGVlcl93d3BuID0gYm90dG9tLT5wbG9naV9wYXlsb2FkLnd3cG47CiAJCWFkYXB0ZXItPnBlZXJfd3dubiA9IGJvdHRvbS0+cGxvZ2lfcGF5bG9hZC53d25uOwogCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9QVFA7Ci0JCWlmIChyZXEtPmVycF9hY3Rpb24pCi0JCQlkZXZfaW5mbygmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCSAiUG9pbnQtdG8tUG9pbnQgZmlicmVjaGFubmVsICIKLQkJCQkgImNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWQuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfVE9QT19GQUJSSUM6CiAJCWZjX2hvc3RfcG9ydF90eXBlKHNob3N0KSA9IEZDX1BPUlRUWVBFX05QT1JUOwotCQlpZiAocmVxLT5lcnBfYWN0aW9uKQotCQkJZGV2X2luZm8oJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCQkgIlN3aXRjaGVkIGZhYnJpYyBmaWJyZWNoYW5uZWwgIgotCQkJCSAibmV0d29yayBkZXRlY3RlZC5cbiIpOwogCQlicmVhazsKIAljYXNlIEZTRl9UT1BPX0FMOgogCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OTFBPUlQ7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJVbnN1cHBvcnRlZCBhcmJpdHJhdGVkIGxvb3AgZmlicmVjaGFubmVsICIKLQkJCSJ0b3BvbG9neSBkZXRlY3RlZCwgc2h1dHRpbmcgZG93biAiCi0JCQkiYWRhcHRlci5cbiIpOwotCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsIDEyNywgcmVxKTsKLQkJcmV0dXJuIC1FSU87CiAJZGVmYXVsdDoKLQkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKIAkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJIlRoZSBmaWJyZWNoYW5uZWwgdG9wb2xvZ3kgcmVwb3J0ZWQgYnkgdGhlIgotCQkJIiBhZGFwdGVyIGlzIG5vdCBrbm93biBieSB0aGUgemZjcCBkcml2ZXIsIgotCQkJIiBzaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iKTsKLQkJemZjcF9lcnBfYWRhcHRlcl9zaHV0ZG93bihhZGFwdGVyLCAwLCAxMjgsIHJlcSk7CisJCQkiVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmJpdHJhdGVkIGxvb3AgIgorCQkJImZpYnJlIGNoYW5uZWwgdG9wb2xvZ3kgZGV0ZWN0ZWRcbiIpOworCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsIDEyNywgcmVxKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC02MTYsMTEgKzU1Myw5IEBACiAKIAkJaWYgKGJvdHRvbS0+bWF4X3F0Y2Jfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgZnNmX3F0Y2IpKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJIk1heGltdW0gUVRDQiBzaXplICglZCBieXRlcykgYWxsb3dlZCBieSAiCi0JCQkJInRoZSBhZGFwdGVyIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltdW0gIgotCQkJCSJyZXF1aXJlZCBieSB0aGUgZHJpdmVyICglbGQgYnl0ZXMpLlxuIiwKLQkJCQlib3R0b20tPm1heF9xdGNiX3NpemUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBmc2ZfcXRjYikpOworCQkJCSJGQ1AgYWRhcHRlciBtYXhpbXVtIFFUQ0Igc2l6ZSAoJWQgYnl0ZXMpICIKKwkJCQkiaXMgdG9vIHNtYWxsXG4iLAorCQkJCWJvdHRvbS0+bWF4X3F0Y2Jfc2l6ZSk7CiAJCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsIDEyOSwgcmVxKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNjU2LDE1ICs1OTEsMTUgQEAKIAogCWlmIChGU0ZfUVRDQl9DVVJSRU5UX1ZFUlNJT04gPCBib3R0b20tPmxvd19xdGNiX3ZlcnNpb24pIHsKIAkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJIlRoZSBhZGFwdGVyIG9ubHkgc3VwcG9ydHMgbmV3ZXIgY29udHJvbCBibG9jayAiCi0JCQkidmVyc2lvbnMsIHRyeSB1cGRhdGVkIGRldmljZSBkcml2ZXIuXG4iKTsKKwkJCSJUaGUgRkNQIGFkYXB0ZXIgb25seSBzdXBwb3J0cyBuZXdlciAiCisJCQkiY29udHJvbCBibG9jayB2ZXJzaW9uc1xuIik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgMTI1LCByZXEpOwogCQlyZXR1cm47CiAJfQogCWlmIChGU0ZfUVRDQl9DVVJSRU5UX1ZFUlNJT04gPiBib3R0b20tPmhpZ2hfcXRjYl92ZXJzaW9uKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJUaGUgYWRhcHRlciBvbmx5IHN1cHBvcnRzIG9sZGVyIGNvbnRyb2wgYmxvY2sgIgotCQkJInZlcnNpb25zLCBjb25zaWRlciBhIG1pY3JvY29kZSB1cGdyYWRlLlxuIik7CisJCQkiVGhlIEZDUCBhZGFwdGVyIG9ubHkgc3VwcG9ydHMgb2xkZXIgIgorCQkJImNvbnRyb2wgYmxvY2sgdmVyc2lvbnNcbiIpOwogCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKGFkYXB0ZXIsIDAsIDEyNiwgcmVxKTsKIAl9CiB9CkBAIC02ODgsNyArNjIzLDYgQEAKIAogc3RhdGljIHZvaWQgemZjcF9mc2ZfZXhjaGFuZ2VfcG9ydF9kYXRhX2hhbmRsZXIoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewotCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSByZXEtPmFkYXB0ZXI7CiAJc3RydWN0IGZzZl9xdGNiICpxdGNiID0gcmVxLT5xdGNiOwogCiAJaWYgKHJlcS0+c3RhdHVzICYgWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SKQpAQCAtNjk3LDM4ICs2MzEsNDcgQEAKIAlzd2l0Y2ggKHF0Y2ItPmhlYWRlci5mc2Zfc3RhdHVzKSB7CiAJY2FzZSBGU0ZfR09PRDoKIAkJemZjcF9mc2ZfZXhjaGFuZ2VfcG9ydF9ldmFsdWF0ZShyZXEpOwotCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9YUE9SVF9PSywgJmFkYXB0ZXItPnN0YXR1cyk7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0VYQ0hBTkdFX0NPTkZJR19EQVRBX0lOQ09NUExFVEU6CiAJCXpmY3BfZnNmX2V4Y2hhbmdlX3BvcnRfZXZhbHVhdGUocmVxKTsKLQkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfWFBPUlRfT0ssICZhZGFwdGVyLT5zdGF0dXMpOwogCQl6ZmNwX2ZzZl9saW5rX2Rvd25faW5mb19ldmFsKHJlcSwgNDMsCiAJCQkmcXRjYi0+aGVhZGVyLmZzZl9zdGF0dXNfcXVhbC5saW5rX2Rvd25faW5mbyk7CiAJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIGludCB6ZmNwX2ZzZl9zYmFsX2NoZWNrKHN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgKnF1ZXVlKQorc3RhdGljIGludCB6ZmNwX2ZzZl9zYmFsX2NoZWNrKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZxdWV1ZS0+Y291bnQpKQorCXN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgKnJlcV9xID0gJmFkYXB0ZXItPnJlcV9xOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJnJlcV9xLT5jb3VudCkpCiAJCXJldHVybiAxOwotCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHpmY3BfZnNmX3NiYWxfYXZhaWxhYmxlKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJlcV9xLmNvdW50KTsKKwlpZiAoIWNvdW50KQorCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5xZGlvX291dGJfZnVsbCk7CisJcmV0dXJuIGNvdW50ID4gMDsKK30KKwogc3RhdGljIGludCB6ZmNwX2ZzZl9yZXFfc2JhbF9nZXQoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlsb25nIHJldDsKLQlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpyZXFfcSA9ICZhZGFwdGVyLT5yZXFfcTsKIAotCXNwaW5fdW5sb2NrKCZyZXFfcS0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFkYXB0ZXItPnJlcXVlc3Rfd3EsCi0JCQkJCXpmY3BfZnNmX3NiYWxfY2hlY2socmVxX3EpLCA1ICogSFopOworCQkJCQl6ZmNwX2ZzZl9zYmFsX2NoZWNrKGFkYXB0ZXIpLCA1ICogSFopOwogCWlmIChyZXQgPiAwKQogCQlyZXR1cm4gMDsKKwlpZiAoIXJldCkKKwkJYXRvbWljX2luYygmYWRhcHRlci0+cWRpb19vdXRiX2Z1bGwpOwogCi0Jc3Bpbl9sb2NrKCZyZXFfcS0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtNzY1LDcgKzcwOCw3IEBACiAJCQkJCQl1MzIgZnNmX2NtZCwgaW50IHJlcV9mbGFncywKIAkJCQkJCW1lbXBvb2xfdCAqcG9vbCkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCXN0cnVjdCB6ZmNwX3FkaW9fcXVldWUgKnJlcV9xID0gJmFkYXB0ZXItPnJlcV9xOwpAQCAtODY3LDE3ICs4MTAsMTcgQEAKIHsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKnNyX2J1ZjsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCWludCByZXR2YWwgPSAtRUlPOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCWlmICh6ZmNwX2ZzZl9yZXFfc2JhbF9nZXQoYWRhcHRlcikpCiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLCBGU0ZfUVRDQl9VTlNPTElDSVRFRF9TVEFUVVMsCiAJCQkJICBaRkNQX1JFUV9OT19RVENCLAogCQkJCSAgYWRhcHRlci0+cG9vbC5mc2ZfcmVxX3N0YXR1c19yZWFkKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJlcSkpKSB7CisJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTEwLDcgKzg1Myw3IEBACiAJemZjcF9mc2ZfcmVxX2ZyZWUocmVxKTsKIAl6ZmNwX2hiYV9kYmZfZXZlbnRfZnNmX3Vuc29sKCJmYWlsIiwgYWRhcHRlciwgTlVMTCk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC05ODAsMTUgKzkyMywxNSBAQAogCQkJCQkJc3RydWN0IHpmY3BfdW5pdCAqdW5pdCwKIAkJCQkJCWludCByZXFfZmxhZ3MpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKLQlpZiAoIWF0b21pY19yZWFkKCZhZGFwdGVyLT5yZXFfcS5jb3VudCkpCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKKwlpZiAoIXpmY3BfZnNmX3NiYWxfYXZhaWxhYmxlKGFkYXB0ZXIpKQogCQlnb3RvIG91dDsKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX0FCT1JUX0ZDUF9DTU5ELAogCQkJCSAgcmVxX2ZsYWdzLCBhZGFwdGVyLT5wb29sLmZzZl9yZXFfYWJvcnQpOwotCWlmICh1bmxpa2VseShJU19FUlIocmVxKSkpCisJaWYgKElTX0VSUihyZXEpKQogCQlnb3RvIG91dDsKIAogCWlmICh1bmxpa2VseSghKGF0b21pY19yZWFkKCZ1bml0LT5zdGF0dXMpICYKQEAgLTEwMTMsNyArOTU2LDcgQEAKIAl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwogCXJlcSA9IE5VTEw7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmVxOwogfQogCkBAIC0xMDIxLDcgKzk2NCw2IEBACiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHJlcS0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9zZW5kX2N0ICpzZW5kX2N0ID0gcmVxLT5kYXRhOwotCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBzZW5kX2N0LT5wb3J0OwogCXN0cnVjdCBmc2ZfcXRjYl9oZWFkZXIgKmhlYWRlciA9ICZyZXEtPnF0Y2ItPmhlYWRlcjsKIAogCXNlbmRfY3QtPnN0YXR1cyA9IC1FSU5WQUw7CkBAIC0xMDQwLDE3ICs5ODIsMTQgQEAKICAgICAgICAgY2FzZSBGU0ZfQURBUFRFUl9TVEFUVVNfQVZBSUxBQkxFOgogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwud29yZFswXSl7CiAgICAgICAgICAgICAgICAgY2FzZSBGU0ZfU1FfSU5WT0tFX0xJTktfVEVTVF9QUk9DRURVUkU6Ci0JCQl6ZmNwX3Rlc3RfbGluayhwb3J0KTsKICAgICAgICAgICAgICAgICBjYXNlIEZTRl9TUV9VTFBfREVQRU5ERU5UX0VSUF9SRVFVSVJFRDoKIAkJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJCWJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAljYXNlIEZTRl9BQ0NFU1NfREVOSUVEOgotCQl6ZmNwX2ZzZl9hY2Nlc3NfZGVuaWVkX3BvcnQocmVxLCBwb3J0KTsKIAkJYnJlYWs7CiAgICAgICAgIGNhc2UgRlNGX1BPUlRfQk9YRUQ6Ci0JCXpmY3BfZXJwX3BvcnRfYm94ZWQocG9ydCwgNDksIHJlcSk7CiAJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUiB8CiAJCQkgICAgICAgWkZDUF9TVEFUVVNfRlNGUkVRX1JFVFJZOwogCQlicmVhazsKQEAgLTExMDEsMTggKzEwNDAsMTggQEAKIGludCB6ZmNwX2ZzZl9zZW5kX2N0KHN0cnVjdCB6ZmNwX3NlbmRfY3QgKmN0LCBtZW1wb29sX3QgKnBvb2wsCiAJCSAgICAgc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqZXJwX2FjdGlvbikKIHsKLQlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0ID0gY3QtPnBvcnQ7Ci0Jc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0ID0gY3QtPndrYV9wb3J0OworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSB3a2FfcG9ydC0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJaW50IHJldCA9IC1FSU87CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJaWYgKHpmY3BfZnNmX3JlcV9zYmFsX2dldChhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX1NFTkRfR0VORVJJQywKIAkJCQkgIFpGQ1BfUkVRX0FVVE9fQ0xFQU5VUCwgcG9vbCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXQgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTExMjMsNyArMTA2Miw3IEBACiAJCWdvdG8gZmFpbGVkX3NlbmQ7CiAKIAlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9zZW5kX2N0X2hhbmRsZXI7Ci0JcmVxLT5xdGNiLT5oZWFkZXIucG9ydF9oYW5kbGUgPSBwb3J0LT5oYW5kbGU7CisJcmVxLT5xdGNiLT5oZWFkZXIucG9ydF9oYW5kbGUgPSB3a2FfcG9ydC0+aGFuZGxlOwogCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuc2VydmljZV9jbGFzcyA9IEZTRl9DTEFTU18zOwogCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQudGltZW91dCA9IGN0LT50aW1lb3V0OwogCXJlcS0+ZGF0YSA9IGN0OwpAQCAtMTE0OCw3ICsxMDg3LDcgQEAKIAlpZiAoZXJwX2FjdGlvbikKIAkJZXJwX2FjdGlvbi0+ZnNmX3JlcSA9IE5VTEw7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjE4LDE4ICsxMTU3LDE4IEBACiAJCSAgICAgICBaRkNQX1NUQVRVU19DT01NT05fVU5CTE9DS0VEKSkpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOwotCWlmICghYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJlcV9xLmNvdW50KSkKKwlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xX2xvY2spOworCWlmICghemZjcF9mc2Zfc2JhbF9hdmFpbGFibGUoYWRhcHRlcikpCiAJCWdvdG8gb3V0OwogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUoYWRhcHRlciwgRlNGX1FUQ0JfU0VORF9FTFMsCiAJCQkJICBaRkNQX1JFUV9BVVRPX0NMRUFOVVAsIE5VTEwpOwotCWlmICh1bmxpa2VseShJU19FUlIocmVxKSkpIHsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJcmV0ID0gUFRSX0VSUihyZXEpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9zYmFscyhyZXEsIGVscy0+cmVxLCBlbHMtPnJlc3AsCi0JCQkJICAgRlNGX01BWF9TQkFMU19QRVJfRUxTX1JFUSk7CisJcmV0ID0gemZjcF9mc2Zfc2V0dXBfc2JhbHMocmVxLCBlbHMtPnJlcSwgZWxzLT5yZXNwLCAyKTsKKwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkX3NlbmQ7CiAKQEAgLTEyNTIsMjUgKzExOTEsMjUgQEAKIGZhaWxlZF9zZW5kOgogCXpmY3BfZnNmX3JlcV9mcmVlKHJlcSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgemZjcF9mc2ZfZXhjaGFuZ2VfY29uZmlnX2RhdGEoc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqZXJwX2FjdGlvbikKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcTsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKIAlpbnQgcmV0dmFsID0gLUVJTzsKIAotCXNwaW5fbG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7Ci0JaWYgKCFhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVxX3EuY291bnQpKQorCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CisJaWYgKCF6ZmNwX2ZzZl9zYmFsX2F2YWlsYWJsZShhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLAogCQkJCSAgRlNGX1FUQ0JfRVhDSEFOR0VfQ09ORklHX0RBVEEsCiAJCQkJICBaRkNQX1JFUV9BVVRPX0NMRUFOVVAsCiAJCQkJICBhZGFwdGVyLT5wb29sLmZzZl9yZXFfZXJwKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJlcSkpKSB7CisJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTI5NSwyNCArMTIzNCwyNCBAQAogCQllcnBfYWN0aW9uLT5mc2ZfcmVxID0gTlVMTDsKIAl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBpbnQgemZjcF9mc2ZfZXhjaGFuZ2VfY29uZmlnX2RhdGFfc3luYyhzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgICBzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX2NvbmZpZyAqZGF0YSkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSA9IE5VTEw7CiAJaW50IHJldHZhbCA9IC1FSU87CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJaWYgKHpmY3BfZnNmX3JlcV9zYmFsX2dldChhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX0VYQ0hBTkdFX0NPTkZJR19EQVRBLAogCQkJCSAgMCwgTlVMTCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzMzQsNyArMTI3Myw3IEBACiAJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlpZiAoIXJldHZhbCkKIAkJd2FpdF9ldmVudChyZXEtPmNvbXBsZXRpb25fd3EsCiAJCQkgICByZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9DT01QTEVURUQpOwpAQCAtMTM1MSw3ICsxMjkwLDcgQEAKICAqLwogaW50IHpmY3BfZnNmX2V4Y2hhbmdlX3BvcnRfZGF0YShzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBlcnBfYWN0aW9uLT5hZGFwdGVyOwogCWludCByZXR2YWwgPSAtRUlPOwpAQCAtMTM1OSwxMyArMTI5OCwxMyBAQAogCWlmICghKGFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9IQkFBUElfTUFOQUdFTUVOVCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXNwaW5fbG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7Ci0JaWYgKCFhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVxX3EuY291bnQpKQorCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CisJaWYgKCF6ZmNwX2ZzZl9zYmFsX2F2YWlsYWJsZShhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLCBGU0ZfUVRDQl9FWENIQU5HRV9QT1JUX0RBVEEsCiAJCQkJICBaRkNQX1JFUV9BVVRPX0NMRUFOVVAsCiAJCQkJICBhZGFwdGVyLT5wb29sLmZzZl9yZXFfZXJwKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJlcSkpKSB7CisJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTM4NSw3ICsxMzI0LDcgQEAKIAkJZXJwX2FjdGlvbi0+ZnNmX3JlcSA9IE5VTEw7CiAJfQogb3V0OgotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTM5OCwyMCArMTMzNywyMCBAQAogaW50IHpmY3BfZnNmX2V4Y2hhbmdlX3BvcnRfZGF0YV9zeW5jKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICAgICBzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3BvcnQgKmRhdGEpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEgPSBOVUxMOwogCWludCByZXR2YWwgPSAtRUlPOwogCiAJaWYgKCEoYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0hCQUFQSV9NQU5BR0VNRU5UKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKLQlpZiAoIWF0b21pY19yZWFkKCZhZGFwdGVyLT5yZXFfcS5jb3VudCkpCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKKwlpZiAoIXpmY3BfZnNmX3NiYWxfYXZhaWxhYmxlKGFkYXB0ZXIpKQogCQlnb3RvIG91dDsKIAogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUoYWRhcHRlciwgRlNGX1FUQ0JfRVhDSEFOR0VfUE9SVF9EQVRBLCAwLAogCQkJCSAgTlVMTCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE0MjcsNyArMTM2Niw3IEBACiAJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlpZiAoIXJldHZhbCkKIAkJd2FpdF9ldmVudChyZXEtPmNvbXBsZXRpb25fd3EsCiAJCQkgICByZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9DT01QTEVURUQpOwpAQCAtMTQ0Myw3ICsxMzgyLDcgQEAKIAlzdHJ1Y3QgZnNmX3Bsb2dpICpwbG9naTsKIAogCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikKLQkJZ290byBza2lwX2ZzZnN0YXR1czsKKwkJcmV0dXJuOwogCiAJc3dpdGNoIChoZWFkZXItPmZzZl9zdGF0dXMpIHsKIAljYXNlIEZTRl9QT1JUX0FMUkVBRFlfT1BFTjoKQEAgLTE0NTMsOSArMTM5Miw5IEBACiAJCWJyZWFrOwogCWNhc2UgRlNGX01BWElNVU1fTlVNQkVSX09GX1BPUlRTX0VYQ0VFREVEOgogCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIlRoZSBhZGFwdGVyIGlzIG91dCBvZiByZXNvdXJjZXMuIFRoZSByZW1vdGUgcG9ydCAiCi0JCQkgIjB4JTAxNkx4IGNvdWxkIG5vdCBiZSBvcGVuZWQsIGRpc2FibGluZyBpdC5cbiIsCi0JCQkgcG9ydC0+d3dwbik7CisJCQkgIk5vdCBlbm91Z2ggRkNQIGFkYXB0ZXIgcmVzb3VyY2VzIHRvIG9wZW4gIgorCQkJICJyZW1vdGUgcG9ydCAweCUwMTZMeFxuIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwogCQl6ZmNwX2VycF9wb3J0X2ZhaWxlZChwb3J0LCAzMSwgcmVxKTsKIAkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwogCQlicmVhazsKQEAgLTE0NjcsOCArMTQwNiw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBGU0ZfU1FfTk9fUkVUUllfUE9TU0lCTEU6CiAJCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJICJUaGUgcmVtb3RlIHBvcnQgMHglMDE2THggY291bGQgbm90IGJlICIKLQkJCQkgIm9wZW5lZC4gRGlzYWJsaW5nIGl0LlxuIiwgcG9ydC0+d3dwbik7CisJCQkJICJSZW1vdGUgcG9ydCAweCUwMTZMeCBjb3VsZCBub3QgYmUgb3BlbmVkXG4iLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPnd3cG4pOwogCQkJemZjcF9lcnBfcG9ydF9mYWlsZWQocG9ydCwgMzIsIHJlcSk7CiAJCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCQlicmVhazsKQEAgLTE0OTYsOSArMTQzNSw2IEBACiAJCSAqIGFub3RoZXIgR0lEX1BOIHN0cmFpZ2h0IGFmdGVyIGEgcG9ydCBoYXMgYmVlbiBvcGVuZWQuCiAJCSAqIEFsdGVybmF0ZWx5LCBhbiBBRElTQy9QRElTQyBFTFMgc2hvdWxkIHN1ZmZpY2UsIGFzIHdlbGwuCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJnBvcnQtPnN0YXR1cykgJiBaRkNQX1NUQVRVU19QT1JUX05PX1dXUE4pCi0JCQlicmVhazsKLQogCQlwbG9naSA9IChzdHJ1Y3QgZnNmX3Bsb2dpICopIHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZWxzOwogCQlpZiAocmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5lbHMxX2xlbmd0aCA+PSBzaXplb2YoKnBsb2dpKSkgewogCQkJaWYgKHBsb2dpLT5zZXJ2X3BhcmFtLnd3cG4gIT0gcG9ydC0+d3dwbikKQEAgLTE1MTQsOSArMTQ1MCw2IEBACiAJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJYnJlYWs7CiAJfQotCi1za2lwX2ZzZnN0YXR1czoKLQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fT1BFTklORywgJnBvcnQtPnN0YXR1cyk7CiB9CiAKIC8qKgpAQCAtMTUyNiwxMiArMTQ1OSwxMiBAQAogICovCiBpbnQgemZjcF9mc2Zfb3Blbl9wb3J0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmVycF9hY3Rpb24pCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJaW50IHJldHZhbCA9IC1FSU87CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJaWYgKHpmY3BfZnNmX3JlcV9zYmFsX2dldChhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAKQEAgLTE1MzksNyArMTQ3Miw3IEBACiAJCQkJICBGU0ZfUVRDQl9PUEVOX1BPUlRfV0lUSF9ESUQsCiAJCQkJICBaRkNQX1JFUV9BVVRPX0NMRUFOVVAsCiAJCQkJICBhZGFwdGVyLT5wb29sLmZzZl9yZXFfZXJwKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJlcSkpKSB7CisJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTU1Myw3ICsxNDg2LDYgQEAKIAlyZXEtPmRhdGEgPSBlcnBfYWN0aW9uLT5wb3J0OwogCXJlcS0+ZXJwX2FjdGlvbiA9IGVycF9hY3Rpb247CiAJZXJwX2FjdGlvbi0+ZnNmX3JlcSA9IHJlcTsKLQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU5JTkcsICZlcnBfYWN0aW9uLT5wb3J0LT5zdGF0dXMpOwogCiAJemZjcF9mc2Zfc3RhcnRfZXJwX3RpbWVyKHJlcSk7CiAJcmV0dmFsID0gemZjcF9mc2ZfcmVxX3NlbmQocmVxKTsKQEAgLTE1NjIsNyArMTQ5NCw3IEBACiAJCWVycF9hY3Rpb24tPmZzZl9yZXEgPSBOVUxMOwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE1NzEsNyArMTUwMyw3IEBACiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IHJlcS0+ZGF0YTsKIAogCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikKLQkJZ290byBza2lwX2ZzZnN0YXR1czsKKwkJcmV0dXJuOwogCiAJc3dpdGNoIChyZXEtPnF0Y2ItPmhlYWRlci5mc2Zfc3RhdHVzKSB7CiAJY2FzZSBGU0ZfUE9SVF9IQU5ETEVfTk9UX1ZBTElEOgpAQCAtMTU4Niw5ICsxNTE4LDYgQEAKIAkJCQkJICAgIFpGQ1BfQ0xFQVIpOwogCQlicmVhazsKIAl9Ci0KLXNraXBfZnNmc3RhdHVzOgotCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9DTE9TSU5HLCAmcG9ydC0+c3RhdHVzKTsKIH0KIAogLyoqCkBAIC0xNTk4LDEyICsxNTI3LDE0MCBAQAogICovCiBpbnQgemZjcF9mc2ZfY2xvc2VfcG9ydChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGVycF9hY3Rpb24tPmFkYXB0ZXI7CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCWludCByZXR2YWwgPSAtRUlPOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOworCWlmICh6ZmNwX2ZzZl9yZXFfc2JhbF9nZXQoYWRhcHRlcikpCisJCWdvdG8gb3V0OworCisJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLCBGU0ZfUVRDQl9DTE9TRV9QT1JULAorCQkJCSAgWkZDUF9SRVFfQVVUT19DTEVBTlVQLAorCQkJCSAgYWRhcHRlci0+cG9vbC5mc2ZfcmVxX2VycCk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHJlcSk7CisJc2JhbGVbMF0uZmxhZ3MgfD0gU0JBTF9GTEFHUzBfVFlQRV9SRUFEOworCXNiYWxlWzFdLmZsYWdzIHw9IFNCQUxfRkxBR1NfTEFTVF9FTlRSWTsKKworCXJlcS0+aGFuZGxlciA9IHpmY3BfZnNmX2Nsb3NlX3BvcnRfaGFuZGxlcjsKKwlyZXEtPmRhdGEgPSBlcnBfYWN0aW9uLT5wb3J0OworCXJlcS0+ZXJwX2FjdGlvbiA9IGVycF9hY3Rpb247CisJcmVxLT5xdGNiLT5oZWFkZXIucG9ydF9oYW5kbGUgPSBlcnBfYWN0aW9uLT5wb3J0LT5oYW5kbGU7CisJZXJwX2FjdGlvbi0+ZnNmX3JlcSA9IHJlcTsKKworCXpmY3BfZnNmX3N0YXJ0X2VycF90aW1lcihyZXEpOworCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CisJaWYgKHJldHZhbCkgeworCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOworCQllcnBfYWN0aW9uLT5mc2ZfcmVxID0gTlVMTDsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHpmY3BfZnNmX29wZW5fd2thX3BvcnRfaGFuZGxlcihzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEpCit7CisJc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0ID0gcmVxLT5kYXRhOworCXN0cnVjdCBmc2ZfcXRjYl9oZWFkZXIgKmhlYWRlciA9ICZyZXEtPnF0Y2ItPmhlYWRlcjsKKworCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikgeworCQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGhlYWRlci0+ZnNmX3N0YXR1cykgeworCWNhc2UgRlNGX01BWElNVU1fTlVNQkVSX09GX1BPUlRTX0VYQ0VFREVEOgorCQlkZXZfd2FybigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCisJCQkgIk9wZW5pbmcgV0tBIHBvcnQgMHgleCBmYWlsZWRcbiIsIHdrYV9wb3J0LT5kX2lkKTsKKwljYXNlIEZTRl9BREFQVEVSX1NUQVRVU19BVkFJTEFCTEU6CisJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKKwljYXNlIEZTRl9BQ0NFU1NfREVOSUVEOgorCQl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCQlicmVhazsKKwljYXNlIEZTRl9QT1JUX0FMUkVBRFlfT1BFTjoKKwljYXNlIEZTRl9HT09EOgorCQl3a2FfcG9ydC0+aGFuZGxlID0gaGVhZGVyLT5wb3J0X2hhbmRsZTsKKwkJd2thX3BvcnQtPnN0YXR1cyA9IFpGQ1BfV0tBX1BPUlRfT05MSU5FOworCX0KK291dDoKKwl3YWtlX3VwKCZ3a2FfcG9ydC0+Y29tcGxldGlvbl93cSk7Cit9CisKKy8qKgorICogemZjcF9mc2Zfb3Blbl93a2FfcG9ydCAtIGNyZWF0ZSBhbmQgc2VuZCBvcGVuIHdrYS1wb3J0IHJlcXVlc3QKKyAqIEB3a2FfcG9ydDogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF93a2FfcG9ydAorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBlcnJvciBvdGhlcndpc2UKKyAqLworaW50IHpmY3BfZnNmX29wZW5fd2thX3BvcnQoc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0KQoreworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gd2thX3BvcnQtPmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOworCWludCByZXR2YWwgPSAtRUlPOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKKwlpZiAoemZjcF9mc2ZfcmVxX3NiYWxfZ2V0KGFkYXB0ZXIpKQorCQlnb3RvIG91dDsKKworCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUoYWRhcHRlciwKKwkJCQkgIEZTRl9RVENCX09QRU5fUE9SVF9XSVRIX0RJRCwKKwkJCQkgIFpGQ1BfUkVRX0FVVE9fQ0xFQU5VUCwKKwkJCQkgIGFkYXB0ZXItPnBvb2wuZnNmX3JlcV9lcnApOworCWlmICh1bmxpa2VseShJU19FUlIocmVxKSkpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihyZXEpOworCQlnb3RvIG91dDsKKwl9CisKKwlzYmFsZSA9IHpmY3BfcWRpb19zYmFsZV9yZXEocmVxKTsKKwlzYmFsZVswXS5mbGFncyB8PSBTQkFMX0ZMQUdTMF9UWVBFX1JFQUQ7CisJc2JhbGVbMV0uZmxhZ3MgfD0gU0JBTF9GTEFHU19MQVNUX0VOVFJZOworCisJcmVxLT5oYW5kbGVyID0gemZjcF9mc2Zfb3Blbl93a2FfcG9ydF9oYW5kbGVyOworCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZF9pZCA9IHdrYV9wb3J0LT5kX2lkOworCXJlcS0+ZGF0YSA9IHdrYV9wb3J0OworCisJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOworCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CisJaWYgKHJldHZhbCkKKwkJemZjcF9mc2ZfcmVxX2ZyZWUocmVxKTsKK291dDoKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgemZjcF9mc2ZfY2xvc2Vfd2thX3BvcnRfaGFuZGxlcihzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEpCit7CisJc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0ID0gcmVxLT5kYXRhOworCisJaWYgKHJlcS0+cXRjYi0+aGVhZGVyLmZzZl9zdGF0dXMgPT0gRlNGX1BPUlRfSEFORExFX05PVF9WQUxJRCkgeworCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CisJCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKHdrYV9wb3J0LT5hZGFwdGVyLCAwLCA4NCwgcmVxKTsKKwl9CisKKwl3a2FfcG9ydC0+c3RhdHVzID0gWkZDUF9XS0FfUE9SVF9PRkZMSU5FOworCXdha2VfdXAoJndrYV9wb3J0LT5jb21wbGV0aW9uX3dxKTsKK30KKworLyoqCisgKiB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydCAtIGNyZWF0ZSBhbmQgc2VuZCBjbG9zZSB3a2EgcG9ydCByZXF1ZXN0CisgKiBAZXJwX2FjdGlvbjogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZQorICovCitpbnQgemZjcF9mc2ZfY2xvc2Vfd2thX3BvcnQoc3RydWN0IHpmY3Bfd2thX3BvcnQgKndrYV9wb3J0KQoreworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gd2thX3BvcnQtPmFkYXB0ZXI7CisJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOworCWludCByZXR2YWwgPSAtRUlPOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlpZiAoemZjcF9mc2ZfcmVxX3NiYWxfZ2V0KGFkYXB0ZXIpKQogCQlnb3RvIG91dDsKIApAQCAtMTYxOSwyMSArMTY3NiwxNiBAQAogCXNiYWxlWzBdLmZsYWdzIHw9IFNCQUxfRkxBR1MwX1RZUEVfUkVBRDsKIAlzYmFsZVsxXS5mbGFncyB8PSBTQkFMX0ZMQUdTX0xBU1RfRU5UUlk7CiAKLQlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9jbG9zZV9wb3J0X2hhbmRsZXI7Ci0JcmVxLT5kYXRhID0gZXJwX2FjdGlvbi0+cG9ydDsKLQlyZXEtPmVycF9hY3Rpb24gPSBlcnBfYWN0aW9uOwotCXJlcS0+cXRjYi0+aGVhZGVyLnBvcnRfaGFuZGxlID0gZXJwX2FjdGlvbi0+cG9ydC0+aGFuZGxlOwotCWVycF9hY3Rpb24tPmZzZl9yZXEgPSByZXE7Ci0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9DTE9TSU5HLCAmZXJwX2FjdGlvbi0+cG9ydC0+c3RhdHVzKTsKKwlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9jbG9zZV93a2FfcG9ydF9oYW5kbGVyOworCXJlcS0+ZGF0YSA9IHdrYV9wb3J0OworCXJlcS0+cXRjYi0+aGVhZGVyLnBvcnRfaGFuZGxlID0gd2thX3BvcnQtPmhhbmRsZTsKIAotCXpmY3BfZnNmX3N0YXJ0X2VycF90aW1lcihyZXEpOworCXpmY3BfZnNmX3N0YXJ0X3RpbWVyKHJlcSwgWkZDUF9GU0ZfUkVRVUVTVF9USU1FT1VUKTsKIAlyZXR2YWwgPSB6ZmNwX2ZzZl9yZXFfc2VuZChyZXEpOwotCWlmIChyZXR2YWwpIHsKKwlpZiAocmV0dmFsKQogCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwotCQllcnBfYWN0aW9uLT5mc2ZfcmVxID0gTlVMTDsKLQl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xNjk1LDE5ICsxNzQ3LDE5IEBACiAgKi8KIGludCB6ZmNwX2ZzZl9jbG9zZV9waHlzaWNhbF9wb3J0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmVycF9hY3Rpb24pCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJaW50IHJldHZhbCA9IC1FSU87CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJaWYgKHpmY3BfZnNmX3JlcV9zYmFsX2dldChhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX0NMT1NFX1BIWVNJQ0FMX1BPUlQsCiAJCQkJICBaRkNQX1JFUV9BVVRPX0NMRUFOVVAsCiAJCQkJICBhZGFwdGVyLT5wb29sLmZzZl9yZXFfZXJwKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJlcSkpKSB7CisJaWYgKElTX0VSUihyZXEpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIocmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTczMSw3ICsxNzgzLDcgQEAKIAkJZXJwX2FjdGlvbi0+ZnNmX3JlcSA9IE5VTEw7CiAJfQogb3V0OgotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTc0Niw3ICsxNzk4LDcgQEAKIAlpbnQgZXhjbHVzaXZlLCByZWFkd3JpdGU7CiAKIAlpZiAocmVxLT5zdGF0dXMgJiBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1IpCi0JCWdvdG8gc2tpcF9mc2ZzdGF0dXM7CisJCXJldHVybjsKIAogCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9BQ0NFU1NfREVOSUVEIHwKIAkJCSAgWkZDUF9TVEFUVVNfQ09NTU9OX0FDQ0VTU19CT1hFRCB8CkBAIC0xNzc0LDE0ICsxODI2LDEyIEBACiAJY2FzZSBGU0ZfTFVOX1NIQVJJTkdfVklPTEFUSU9OOgogCQlpZiAoaGVhZGVyLT5mc2Zfc3RhdHVzX3F1YWwud29yZFswXSkKIAkJCWRldl93YXJuKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJICJGQ1AtTFVOIDB4JUx4IGF0IHRoZSByZW1vdGUgcG9ydCAiCi0JCQkJICJ3aXRoIFdXUE4gMHglTHggIgotCQkJCSAiY29ubmVjdGVkIHRvIHRoZSBhZGFwdGVyICIKLQkJCQkgImlzIGFscmVhZHkgaW4gdXNlIGluIExQQVIlZCwgQ1NTJWQuXG4iLAotCQkJCSB1bml0LT5mY3BfbHVuLAotCQkJCSB1bml0LT5wb3J0LT53d3BuLAotCQkJCSBxdWV1ZV9kZXNpZ25hdG9yLT5obGEsCi0JCQkJIHF1ZXVlX2Rlc2lnbmF0b3ItPmNzc2lkKTsKKwkJCQkgIkxVTiAweCVMeCBvbiBwb3J0IDB4JUx4IGlzIGFscmVhZHkgaW4gIgorCQkJCSAidXNlIGJ5IENTUyVkLCBNSUYgSW1hZ2UgSUQgJXhcbiIsCisJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+ZmNwX2x1biwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5wb3J0LT53d3BuLAorCQkJCSBxdWV1ZV9kZXNpZ25hdG9yLT5jc3NpZCwKKwkJCQkgcXVldWVfZGVzaWduYXRvci0+aGxhKTsKIAkJZWxzZQogCQkJemZjcF9hY3RfZXZhbF9lcnIoYWRhcHRlciwKIAkJCQkJICBoZWFkZXItPmZzZl9zdGF0dXNfcXVhbC53b3JkWzJdKTsKQEAgLTE3OTIsOSArMTg0MiwxMCBAQAogCQlicmVhazsKIAljYXNlIEZTRl9NQVhJTVVNX05VTUJFUl9PRl9MVU5TX0VYQ0VFREVEOgogCQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJICJUaGUgYWRhcHRlciByYW4gb3V0IG9mIHJlc291cmNlcy4gVGhlcmUgaXMgbm8gIgotCQkJICJoYW5kbGUgYXZhaWxhYmxlIGZvciB1bml0IDB4JTAxNkx4IG9uIHBvcnQgMHglMDE2THguIiwKLQkJCSB1bml0LT5mY3BfbHVuLCB1bml0LT5wb3J0LT53d3BuKTsKKwkJCSAiTm8gaGFuZGxlIGlzIGF2YWlsYWJsZSBmb3IgTFVOICIKKwkJCSAiMHglMDE2THggb24gcG9ydCAweCUwMTZMeFxuIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5wb3J0LT53d3BuKTsKIAkJemZjcF9lcnBfdW5pdF9mYWlsZWQodW5pdCwgMzQsIHJlcSk7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRlNGX0lOVkFMSURfQ09NTUFORF9PUFRJT046CkBAIC0xODMxLDI2ICsxODgyLDI5IEBACiAgICAgICAgICAgICAgICAgCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfVU5JVF9SRUFET05MWSwKIAkJCQkJCSZ1bml0LT5zdGF0dXMpOwogCQkJCWRldl9pbmZvKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJCSAiUmVhZC1vbmx5IGFjY2VzcyBmb3IgdW5pdCAweCUwMTZMeCAiCi0JCQkJCSAib24gcG9ydCAweCUwMTZMeC5cbiIsCi0JCQkJCSB1bml0LT5mY3BfbHVuLCB1bml0LT5wb3J0LT53d3BuKTsKKwkJCQkJICJTQ1NJIGRldmljZSBhdCBMVU4gMHglMDE2THggb24gcG9ydCAiCisJCQkJCSAiMHglMDE2THggb3BlbmVkIHJlYWQtb25seVxuIiwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+ZmNwX2x1biwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+cG9ydC0+d3dwbik7CiAgICAgICAgIAkJfQogCiAgICAgICAgIAkJaWYgKGV4Y2x1c2l2ZSAmJiAhcmVhZHdyaXRlKSB7CiAJCQkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCQkiRXhjbHVzaXZlIGFjY2VzcyBvZiByZWFkLW9ubHkgdW5pdCAiCi0JCQkJCSIweCUwMTZMeCBvbiBwb3J0IDB4JTAxNkx4IG5vdCAiCi0JCQkJCSJzdXBwb3J0ZWQsIGRpc2FibGluZyB1bml0LlxuIiwKLQkJCQkJdW5pdC0+ZmNwX2x1biwgdW5pdC0+cG9ydC0+d3dwbik7CisJCQkJCSJFeGNsdXNpdmUgcmVhZC1vbmx5IGFjY2VzcyBub3QgIgorCQkJCQkic3VwcG9ydGVkICh1bml0IDB4JTAxNkx4LCAiCisJCQkJCSJwb3J0IDB4JTAxNkx4KVxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5mY3BfbHVuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPnBvcnQtPnd3cG4pOwogCQkJCXpmY3BfZXJwX3VuaXRfZmFpbGVkKHVuaXQsIDM1LCByZXEpOwogCQkJCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUjsKIAkJCQl6ZmNwX2VycF91bml0X3NodXRkb3duKHVuaXQsIDAsIDgwLCByZXEpOwogICAgICAgICAJCX0gZWxzZSBpZiAoIWV4Y2x1c2l2ZSAmJiByZWFkd3JpdGUpIHsKIAkJCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkJCSJTaGFyZWQgYWNjZXNzIG9mIHJlYWQtd3JpdGUgdW5pdCAiCi0JCQkJCSIweCUwMTZMeCBvbiBwb3J0IDB4JTAxNkx4IG5vdCAiCi0JCQkJCSJzdXBwb3J0ZWQsIGRpc2FibGluZyB1bml0LlxuIiwKLQkJCQkJdW5pdC0+ZmNwX2x1biwgdW5pdC0+cG9ydC0+d3dwbik7CisJCQkJCSJTaGFyZWQgcmVhZC13cml0ZSBhY2Nlc3Mgbm90ICIKKwkJCQkJInN1cHBvcnRlZCAodW5pdCAweCUwMTZMeCwgcG9ydCAiCisJCQkJCSIweCUwMTZMeFxuKSIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+ZmNwX2x1biwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5wb3J0LT53d3BuKTsKIAkJCQl6ZmNwX2VycF91bml0X2ZhaWxlZCh1bml0LCAzNiwgcmVxKTsKIAkJCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCQkJemZjcF9lcnBfdW5pdF9zaHV0ZG93bih1bml0LCAwLCA4MSwgcmVxKTsKQEAgLTE4NTgsOSArMTkxMiw2IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCi1za2lwX2ZzZnN0YXR1czoKLQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fT1BFTklORywgJnVuaXQtPnN0YXR1cyk7CiB9CiAKIC8qKgpAQCAtMTg3MCwxOSArMTkyMSwxOSBAQAogICovCiBpbnQgemZjcF9mc2Zfb3Blbl91bml0KHN0cnVjdCB6ZmNwX2VycF9hY3Rpb24gKmVycF9hY3Rpb24pCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gZXJwX2FjdGlvbi0+YWRhcHRlcjsKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJaW50IHJldHZhbCA9IC1FSU87CiAKLQlzcGluX2xvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJaWYgKHpmY3BfZnNmX3JlcV9zYmFsX2dldChhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX09QRU5fTFVOLAogCQkJCSAgWkZDUF9SRVFfQVVUT19DTEVBTlVQLAogCQkJCSAgYWRhcHRlci0+cG9vbC5mc2ZfcmVxX2VycCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE5MDEsOCArMTk1Miw2IEBACiAJaWYgKCEoYWRhcHRlci0+Y29ubmVjdGlvbl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX05QSVZfTU9ERSkpCiAJCXJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQub3B0aW9uID0gRlNGX09QRU5fTFVOX1NVUFBSRVNTX0JPWElORzsKIAotCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fT1BFTklORywgJmVycF9hY3Rpb24tPnVuaXQtPnN0YXR1cyk7Ci0KIAl6ZmNwX2ZzZl9zdGFydF9lcnBfdGltZXIocmVxKTsKIAlyZXR2YWwgPSB6ZmNwX2ZzZl9yZXFfc2VuZChyZXEpOwogCWlmIChyZXR2YWwpIHsKQEAgLTE5MTAsNyArMTk1OSw3IEBACiAJCWVycF9hY3Rpb24tPmZzZl9yZXEgPSBOVUxMOwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE5MTksNyArMTk2OCw3IEBACiAJc3RydWN0IHpmY3BfdW5pdCAqdW5pdCA9IHJlcS0+ZGF0YTsKIAogCWlmIChyZXEtPnN0YXR1cyAmIFpGQ1BfU1RBVFVTX0ZTRlJFUV9FUlJPUikKLQkJZ290byBza2lwX2ZzZnN0YXR1czsKKwkJcmV0dXJuOwogCiAJc3dpdGNoIChyZXEtPnF0Y2ItPmhlYWRlci5mc2Zfc3RhdHVzKSB7CiAJY2FzZSBGU0ZfUE9SVF9IQU5ETEVfTk9UX1ZBTElEOgpAQCAtMTk0OSw4ICsxOTk4LDYgQEAKIAkJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX09QRU4sICZ1bml0LT5zdGF0dXMpOwogCQlicmVhazsKIAl9Ci1za2lwX2ZzZnN0YXR1czoKLQlhdG9taWNfY2xlYXJfbWFzayhaRkNQX1NUQVRVU19DT01NT05fQ0xPU0lORywgJnVuaXQtPnN0YXR1cyk7CiB9CiAKIC8qKgpAQCAtMTk2MCwxOCArMjAwNywxOCBAQAogICovCiBpbnQgemZjcF9mc2ZfY2xvc2VfdW5pdChzdHJ1Y3QgemZjcF9lcnBfYWN0aW9uICplcnBfYWN0aW9uKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGVycF9hY3Rpb24tPmFkYXB0ZXI7CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOwogCWludCByZXR2YWwgPSAtRUlPOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCWlmICh6ZmNwX2ZzZl9yZXFfc2JhbF9nZXQoYWRhcHRlcikpCiAJCWdvdG8gb3V0OwogCXJlcSA9IHpmY3BfZnNmX3JlcV9jcmVhdGUoYWRhcHRlciwgRlNGX1FUQ0JfQ0xPU0VfTFVOLAogCQkJCSAgWkZDUF9SRVFfQVVUT19DTEVBTlVQLAogCQkJCSAgYWRhcHRlci0+cG9vbC5mc2ZfcmVxX2VycCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE5ODYsNyArMjAzMyw2IEBACiAJcmVxLT5kYXRhID0gZXJwX2FjdGlvbi0+dW5pdDsKIAlyZXEtPmVycF9hY3Rpb24gPSBlcnBfYWN0aW9uOwogCWVycF9hY3Rpb24tPmZzZl9yZXEgPSByZXE7Ci0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0NPTU1PTl9DTE9TSU5HLCAmZXJwX2FjdGlvbi0+dW5pdC0+c3RhdHVzKTsKIAogCXpmY3BfZnNmX3N0YXJ0X2VycF90aW1lcihyZXEpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CkBAIC0xOTk1LDcgKzIwNDEsNyBAQAogCQllcnBfYWN0aW9uLT5mc2ZfcmVxID0gTlVMTDsKIAl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMTU2LDIxICsyMjAyLDIxIEBACiAJCWJyZWFrOwogCWNhc2UgRlNGX0RJUkVDVElPTl9JTkRJQ0FUT1JfTk9UX1ZBTElEOgogCQlkZXZfZXJyKCZyZXEtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSJJbnZhbGlkIGRhdGEgZGlyZWN0aW9uICglZCkgZ2l2ZW4gZm9yIHVuaXQgIgotCQkJIjB4JTAxNkx4IG9uIHBvcnQgMHglMDE2THgsIHNodXR0aW5nIGRvd24gIgotCQkJImFkYXB0ZXIuXG4iLAorCQkJIkluY29ycmVjdCBkaXJlY3Rpb24gJWQsIHVuaXQgMHglMDE2THggb24gcG9ydCAiCisJCQkiMHglMDE2THggY2xvc2VkXG4iLAogCQkJcmVxLT5xdGNiLT5ib3R0b20uaW8uZGF0YV9kaXJlY3Rpb24sCi0JCQl1bml0LT5mY3BfbHVuLCB1bml0LT5wb3J0LT53d3BuKTsKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+ZmNwX2x1biwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdW5pdC0+cG9ydC0+d3dwbik7CiAJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24odW5pdC0+cG9ydC0+YWRhcHRlciwgMCwgMTMzLCByZXEpOwogCQlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfRVJST1I7CiAJCWJyZWFrOwogCWNhc2UgRlNGX0NNTkRfTEVOR1RIX05PVF9WQUxJRDoKIAkJZGV2X2VycigmcmVxLT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkiQW4gaW52YWxpZCBjb250cm9sLWRhdGEtYmxvY2sgbGVuZ3RoIGZpZWxkICglZCkgIgotCQkJIndhcyBmb3VuZCBpbiBhIGNvbW1hbmQgZm9yIHVuaXQgMHglMDE2THggb24gcG9ydCAiCi0JCQkiMHglMDE2THguIFNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIsCisJCQkiSW5jb3JyZWN0IENEQiBsZW5ndGggJWQsIHVuaXQgMHglMDE2THggb24gIgorCQkJInBvcnQgMHglMDE2THggY2xvc2VkXG4iLAogCQkJcmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX2NtbmRfbGVuZ3RoLAotCQkJdW5pdC0+ZmNwX2x1biwgdW5pdC0+cG9ydC0+d3dwbik7CisJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPnBvcnQtPnd3cG4pOwogCQl6ZmNwX2VycF9hZGFwdGVyX3NodXRkb3duKHVuaXQtPnBvcnQtPmFkYXB0ZXIsIDAsIDEzNCwgcmVxKTsKIAkJcmVxLT5zdGF0dXMgfD0gWkZDUF9TVEFUVVNfRlNGUkVRX0VSUk9SOwogCQlicmVhazsKQEAgLTIyMDEsNiArMjI0NywyMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgemZjcF9zZXRfZmNwX2RsKHN0cnVjdCBmY3BfY21uZF9pdSAqZmNwX2NtZCwgdTMyIGZjcF9kbCkKK3sKKwl1MzIgKmZjcF9kbF9wdHI7CisKKwkvKgorCSAqIGZjcF9kbF9hZGRyID0gc3RhcnQgYWRkcmVzcyBvZiBmY3BfY21uZCBzdHJ1Y3R1cmUgKworCSAqIHNpemUgb2YgZml4ZWQgcGFydCArIHNpemUgb2YgZHluYW1pY2FsbHkgc2l6ZWQgYWRkX2RjcF9jZGIgZmllbGQKKwkgKiBTRUUgRkNQLTIgZG9jdW1lbnRhdGlvbgorCSAqLworCWZjcF9kbF9wdHIgPSAodTMyICopICgodW5zaWduZWQgY2hhciAqKSAmZmNwX2NtZFsxXSArCisJCQkoZmNwX2NtZC0+YWRkX2ZjcF9jZGJfbGVuZ3RoIDw8IDIpKTsKKwkqZmNwX2RsX3B0ciA9IGZjcF9kbDsKK30KKwogLyoqCiAgKiB6ZmNwX2ZzZl9zZW5kX2ZjcF9jb21tYW5kX3Rhc2sgLSBpbml0aWF0ZSBhbiBGQ1AgY29tbWFuZCAoZm9yIGEgU0NTSSBjb21tYW5kKQogICogQGFkYXB0ZXI6IGFkYXB0ZXIgd2hlcmUgc2NzaSBjb21tYW5kIGlzIGlzc3VlZApAQCAtMjIyMywxMiArMjI4MywxMiBAQAogCQkgICAgICAgWkZDUF9TVEFUVVNfQ09NTU9OX1VOQkxPQ0tFRCkpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKLQlpZiAoIWF0b21pY19yZWFkKCZhZGFwdGVyLT5yZXFfcS5jb3VudCkpCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKKwlpZiAoIXpmY3BfZnNmX3NiYWxfYXZhaWxhYmxlKGFkYXB0ZXIpKQogCQlnb3RvIG91dDsKIAlyZXEgPSB6ZmNwX2ZzZl9yZXFfY3JlYXRlKGFkYXB0ZXIsIEZTRl9RVENCX0ZDUF9DTU5ELCByZXFfZmxhZ3MsCiAJCQkJICBhZGFwdGVyLT5wb29sLmZzZl9yZXFfc2NzaSk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHJlcSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyODYsNyArMjM0Niw3IEBACiAJbWVtY3B5KGZjcF9jbW5kX2l1LT5mY3BfY2RiLCBzY3NpX2NtbmQtPmNtbmQsIHNjc2lfY21uZC0+Y21kX2xlbik7CiAKIAlyZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfY21uZF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGZjcF9jbW5kX2l1KSArCi0JCWZjcF9jbW5kX2l1LT5hZGRfZmNwX2NkYl9sZW5ndGggKyBzaXplb2YoZmNwX2RsX3QpOworCQlmY3BfY21uZF9pdS0+YWRkX2ZjcF9jZGJfbGVuZ3RoICsgc2l6ZW9mKHUzMik7CiAKIAlyZWFsX2J5dGVzID0gemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocmVxLCBzYnR5cGUsCiAJCQkJCSAgICAgc2NzaV9zZ2xpc3Qoc2NzaV9jbW5kKSwKQEAgLTIyOTYsMTAgKzIzNTYsMTAgQEAKIAkJCXJldHZhbCA9IC1FSU87CiAJCWVsc2UgewogCQkJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAotCQkJCSJTQ1NJIHJlcXVlc3QgdG9vIGxhcmdlLiAiCi0JCQkJIlNodXR0aW5nIGRvd24gdW5pdCAweCUwMTZMeCBvbiBwb3J0ICIKLQkJCQkiMHglMDE2THguXG4iLCB1bml0LT5mY3BfbHVuLAotCQkJCXVuaXQtPnBvcnQtPnd3cG4pOworCQkJCSJPdmVyc2l6ZSBkYXRhIHBhY2thZ2UsIHVuaXQgMHglMDE2THggIgorCQkJCSJvbiBwb3J0IDB4JTAxNkx4IGNsb3NlZFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXVuaXQtPmZjcF9sdW4sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1bml0LT5wb3J0LT53d3BuKTsKIAkJCXpmY3BfZXJwX3VuaXRfc2h1dGRvd24odW5pdCwgMCwgMTMxLCByZXEpOwogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJfQpAQCAtMjMyMiw3ICsyMzgyLDcgQEAKIAl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOwogCXNjc2lfY21uZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMzM4LDcgKzIzOTgsNyBAQAogCQkJCQkgICBzdHJ1Y3QgemZjcF91bml0ICp1bml0LAogCQkJCQkgICB1OCB0bV9mbGFncywgaW50IHJlcV9mbGFncykKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSA9IE5VTEw7CiAJc3RydWN0IGZjcF9jbW5kX2l1ICpmY3BfY21uZF9pdTsKIApAQCAtMjM0NiwxMiArMjQwNiwxMiBAQAogCQkgICAgICAgWkZDUF9TVEFUVVNfQ09NTU9OX1VOQkxPQ0tFRCkpKQogCQlyZXR1cm4gTlVMTDsKIAotCXNwaW5fbG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7Ci0JaWYgKCFhdG9taWNfcmVhZCgmYWRhcHRlci0+cmVxX3EuY291bnQpKQorCXNwaW5fbG9jaygmYWRhcHRlci0+cmVxX3FfbG9jayk7CisJaWYgKCF6ZmNwX2ZzZl9zYmFsX2F2YWlsYWJsZShhZGFwdGVyKSkKIAkJZ290byBvdXQ7CiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLCBGU0ZfUVRDQl9GQ1BfQ01ORCwgcmVxX2ZsYWdzLAogCQkJCSAgYWRhcHRlci0+cG9vbC5mc2ZfcmVxX3Njc2kpOwotCWlmICh1bmxpa2VseShJU19FUlIocmVxKSkpCisJaWYgKElTX0VSUihyZXEpKQogCQlnb3RvIG91dDsKIAogCXJlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9UQVNLX01BTkFHRU1FTlQ7CkBAIC0yMzYyLDcgKzI0MjIsNyBAQAogCXJlcS0+cXRjYi0+Ym90dG9tLmlvLmRhdGFfZGlyZWN0aW9uID0gRlNGX0RBVEFESVJfQ01ORDsKIAlyZXEtPnF0Y2ItPmJvdHRvbS5pby5zZXJ2aWNlX2NsYXNzID0gRlNGX0NMQVNTXzM7CiAJcmVxLT5xdGNiLT5ib3R0b20uaW8uZmNwX2NtbmRfbGVuZ3RoID0gCXNpemVvZihzdHJ1Y3QgZmNwX2NtbmRfaXUpICsKLQkJCQkJCXNpemVvZihmY3BfZGxfdCk7CisJCQkJCQlzaXplb2YodTMyKTsKIAogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX3JlcShyZXEpOwogCXNiYWxlWzBdLmZsYWdzIHw9IFNCQUxfRkxBR1MwX1RZUEVfV1JJVEU7CkBAIC0yMzc5LDcgKzI0MzksNyBAQAogCXpmY3BfZnNmX3JlcV9mcmVlKHJlcSk7CiAJcmVxID0gTlVMTDsKIG91dDoKLQlzcGluX3VubG9jaygmYWRhcHRlci0+cmVxX3EubG9jayk7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCXJldHVybiByZXE7CiB9CiAKQEAgLTIzOTgsNyArMjQ1OCw3IEBACiBzdHJ1Y3QgemZjcF9mc2ZfcmVxICp6ZmNwX2ZzZl9jb250cm9sX2ZpbGUoc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkJICAgc3RydWN0IHpmY3BfZnNmX2NmZGMgKmZzZl9jZmRjKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3N1cHBvcnQgKmJvdHRvbTsKIAlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAtRUlPLCBieXRlczsKQEAgLTI0MTcsMTIgKzI0NzcsMTIgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCi0Jc3Bpbl9sb2NrKCZhZGFwdGVyLT5yZXFfcS5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCWlmICh6ZmNwX2ZzZl9yZXFfc2JhbF9nZXQoYWRhcHRlcikpCiAJCWdvdG8gb3V0OwogCiAJcmVxID0gemZjcF9mc2ZfcmVxX2NyZWF0ZShhZGFwdGVyLCBmc2ZfY2ZkYy0+Y29tbWFuZCwgMCwgTlVMTCk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihyZXEpKSkgeworCWlmIChJU19FUlIocmVxKSkgewogCQlyZXR2YWwgPSAtRVBFUk07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI0NDcsNyArMjUwNyw3IEBACiAJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPnJlcV9xLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5yZXFfcV9sb2NrKTsKIAogCWlmICghcmV0dmFsKSB7CiAJCXdhaXRfZXZlbnQocmVxLT5jb21wbGV0aW9uX3dxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKaW5kZXggYmY5NGI0ZC4uZmQzYTg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCkBAIC03MSwxMyArNzEsNiBAQAogI2RlZmluZSBGU0ZfTUFYSU1VTV9OVU1CRVJfT0ZfTFVOU19FWENFRURFRAkweDAwMDAwMDQxCiAjZGVmaW5lIEZTRl9FTFNfQ09NTUFORF9SRUpFQ1RFRAkJMHgwMDAwMDA1MAogI2RlZmluZSBGU0ZfR0VORVJJQ19DT01NQU5EX1JFSkVDVEVECQkweDAwMDAwMDUxCi0jZGVmaW5lIEZTRl9PUEVSQVRJT05fUEFSVElBTExZX1NVQ0NFU1NGVUwJMHgwMDAwMDA1MgotI2RlZmluZSBGU0ZfQVVUSE9SSVpBVElPTl9GQUlMVVJFCQkweDAwMDAwMDUzCi0jZGVmaW5lIEZTRl9DRkRDX0VSUk9SX0RFVEVDVEVECQkJMHgwMDAwMDA1NAotI2RlZmluZSBGU0ZfQ09OVFJPTF9GSUxFX1VQREFURV9FUlJPUgkJMHgwMDAwMDA1NQotI2RlZmluZSBGU0ZfQ09OVFJPTF9GSUxFX1RPT19MQVJHRQkJMHgwMDAwMDA1NgotI2RlZmluZSBGU0ZfQUNDRVNTX0NPTkZMSUNUX0RFVEVDVEVECQkweDAwMDAwMDU3Ci0jZGVmaW5lIEZTRl9DT05GTElDVFNfT1ZFUlJVTEVECQkJMHgwMDAwMDA1OAogI2RlZmluZSBGU0ZfUE9SVF9CT1hFRAkJCQkweDAwMDAwMDU5CiAjZGVmaW5lIEZTRl9MVU5fQk9YRUQJCQkJMHgwMDAwMDA1QQogI2RlZmluZSBGU0ZfRVhDSEFOR0VfQ09ORklHX0RBVEFfSU5DT01QTEVURQkweDAwMDAwMDVCCkBAIC04NSw5ICs3OCw3IEBACiAjZGVmaW5lIEZTRl9SRVFVRVNUX1NJWkVfVE9PX0xBUkdFCQkweDAwMDAwMDYxCiAjZGVmaW5lIEZTRl9SRVNQT05TRV9TSVpFX1RPT19MQVJHRQkJMHgwMDAwMDA2MgogI2RlZmluZSBGU0ZfU0JBTF9NSVNNQVRDSAkJCTB4MDAwMDAwNjMKLSNkZWZpbmUgRlNGX09QRU5fUE9SVF9XSVRIT1VUX1BSTEkJCTB4MDAwMDAwNjQKICNkZWZpbmUgRlNGX0FEQVBURVJfU1RBVFVTX0FWQUlMQUJMRQkJMHgwMDAwMDBBRAotI2RlZmluZSBGU0ZfRkNQX1JTUF9BVkFJTEFCTEUJCQkweDAwMDAwMEFGCiAjZGVmaW5lIEZTRl9VTktOT1dOX0NPTU1BTkQJCQkweDAwMDAwMEUyCiAjZGVmaW5lIEZTRl9VTktOT1dOX09QX1NVQlRZUEUgICAgICAgICAgICAgICAgICAweDAwMDAwMEUzCiAjZGVmaW5lIEZTRl9JTlZBTElEX0NPTU1BTkRfT1BUSU9OICAgICAgICAgICAgICAweDAwMDAwMEU1CkBAIC0xMDIsMjAgKzkzLDkgQEAKICNkZWZpbmUgRlNGX1NRX1JFVFJZX0lGX1BPU1NJQkxFCQkweDAyCiAjZGVmaW5lIEZTRl9TUV9VTFBfREVQRU5ERU5UX0VSUF9SRVFVSVJFRAkweDAzCiAjZGVmaW5lIEZTRl9TUV9JTlZPS0VfTElOS19URVNUX1BST0NFRFVSRQkweDA0Ci0jZGVmaW5lIEZTRl9TUV9VTFBfUFJPR1JBTU1JTkdfRVJST1IJCTB4MDUKICNkZWZpbmUgRlNGX1NRX0NPTU1BTkRfQUJPUlRFRAkJCTB4MDYKICNkZWZpbmUgRlNGX1NRX05PX1JFVFJZX1BPU1NJQkxFCQkweDA3CiAKLS8qIEZTRiBzdGF0dXMgcXVhbGlmaWVyIGZvciBDRkRDIGNvbW1hbmRzICovCi0jZGVmaW5lIEZTRl9TUV9DRkRDX0hBUkRFTkVEX09OX1NFCQkweDAwMDAwMDAwCi0jZGVmaW5lIEZTRl9TUV9DRkRDX0NPVUxEX05PVF9IQVJERU5fT05fU0UJMHgwMDAwMDAwMQotI2RlZmluZSBGU0ZfU1FfQ0ZEQ19DT1VMRF9OT1RfSEFSREVOX09OX1NFMgkweDAwMDAwMDAyCi0vKiBDRkRDIHN1YnRhYmxlIGNvZGVzICovCi0jZGVmaW5lIEZTRl9TUV9DRkRDX1NVQlRBQkxFX09TCQkJMHgwMDAxCi0jZGVmaW5lIEZTRl9TUV9DRkRDX1NVQlRBQkxFX1BPUlRfV1dQTgkJMHgwMDAyCi0jZGVmaW5lIEZTRl9TUV9DRkRDX1NVQlRBQkxFX1BPUlRfRElECQkweDAwMDMKLSNkZWZpbmUgRlNGX1NRX0NGRENfU1VCVEFCTEVfTFVOCQkweDAwMDQKLQogLyogRlNGIHN0YXR1cyBxdWFsaWZpZXIgKG1vc3Qgc2lnbmlmaWNhbnQgNCBieXRlcyksIGxvY2FsIGxpbmsgZG93biAqLwogI2RlZmluZSBGU0ZfUFNRX0xJTktfTk9fTElHSFQJCQkweDAwMDAwMDA0CiAjZGVmaW5lIEZTRl9QU1FfTElOS19XUkFQX1BMVUcJCQkweDAwMDAwMDA4CkBAIC0xNDUsNyArMTI1LDYgQEAKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX0xJTktfVVAgICAgICAgICAgCTB4MDAwMDAwMDYKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX05PVElGSUNBVElPTl9MT1NUCTB4MDAwMDAwMDkKICNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX0NGRENfVVBEQVRFRAkJMHgwMDAwMDAwQQotI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfQ0ZEQ19IQVJERU5FRAkJMHgwMDAwMDAwQgogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfRkVBVFVSRV9VUERBVEVfQUxFUlQJMHgwMDAwMDAwQwogCiAvKiBzdGF0dXMgc3VidHlwZXMgaW4gc3RhdHVzIHJlYWQgYnVmZmVyICovCkBAIC0xNTksMjAgKzEzOCw5IEBACiAKIC8qIHN0YXR1cyBzdWJ0eXBlcyBmb3IgdW5zb2xpY2l0ZWQgc3RhdHVzIG5vdGlmaWNhdGlvbiBsb3N0ICovCiAjZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfSU5DT01JTkdfRUxTCTB4MDAwMDAwMDEKLSNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9TRU5TRV9EQVRBCQkweDAwMDAwMDAyCi0jZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfTElOS19TVEFUVVMJCTB4MDAwMDAwMDQKLSNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9QT1JUX0NMT1NFRAkJMHgwMDAwMDAwOAotI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0JJVF9FUlJPUl9USFJFU0hPTEQJMHgwMDAwMDAxMAogI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0FDVF9VUERBVEVECQkweDAwMDAwMDIwCi0jZGVmaW5lIEZTRl9TVEFUVVNfUkVBRF9TVUJfQUNUX0hBUkRFTkVECTB4MDAwMDAwNDAKLSNkZWZpbmUgRlNGX1NUQVRVU19SRUFEX1NVQl9GRUFUVVJFX1VQREFURV9BTEVSVCAweDAwMDAwMDgwCi0KLS8qIHN0YXR1cyBzdWJ0eXBlcyBmb3IgQ0ZEQyAqLwotI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0NGRENfSEFSREVORURfT05fU0UJMHgwMDAwMDAwMgotI2RlZmluZSBGU0ZfU1RBVFVTX1JFQURfU1VCX0NGRENfSEFSREVORURfT05fU0UyIDB4MDAwMDAwMEYKIAogLyogdG9wb2xvZ2llIHRoYXQgaXMgZGV0ZWN0ZWQgYnkgdGhlIGFkYXB0ZXIgKi8KLSNkZWZpbmUgRlNGX1RPUE9fRVJST1IJCQkJMHgwMDAwMDAwMAogI2RlZmluZSBGU0ZfVE9QT19QMlAJCQkJMHgwMDAwMDAwMQogI2RlZmluZSBGU0ZfVE9QT19GQUJSSUMJCQkJMHgwMDAwMDAwMgogI2RlZmluZSBGU0ZfVE9QT19BTAkJCQkweDAwMDAwMDAzCkBAIC0xODAsMTcgKzE0OCwxMyBAQAogLyogZGF0YSBkaXJlY3Rpb24gZm9yIEZDUCBjb21tYW5kcyAqLwogI2RlZmluZSBGU0ZfREFUQURJUl9XUklURQkJCTB4MDAwMDAwMDEKICNkZWZpbmUgRlNGX0RBVEFESVJfUkVBRAkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgRlNGX0RBVEFESVJfUkVBRF9XUklURQkJCTB4MDAwMDAwMDMKICNkZWZpbmUgRlNGX0RBVEFESVJfQ01ORAkJCTB4MDAwMDAwMDQKIAogLyogZmMgc2VydmljZSBjbGFzcyAqLwotI2RlZmluZSBGU0ZfQ0xBU1NfMQkJCQkweDAwMDAwMDAxCi0jZGVmaW5lIEZTRl9DTEFTU18yCQkJCTB4MDAwMDAwMDIKICNkZWZpbmUgRlNGX0NMQVNTXzMJCQkJMHgwMDAwMDAwMwogCiAvKiBTQkFMIGNoYWluaW5nICovCiAjZGVmaW5lIEZTRl9NQVhfU0JBTFNfUEVSX1JFUQkJCTM2Ci0jZGVmaW5lIEZTRl9NQVhfU0JBTFNfUEVSX0VMU19SRVEJCTIKIAogLyogbG9nZ2luZyBzcGFjZSBiZWhpbmQgUVRDQiAqLwogI2RlZmluZSBGU0ZfUVRDQl9MT0dfU0laRQkJCTEwMjQKQEAgLTIwMCw1MCArMTY0LDE2IEBACiAjZGVmaW5lIEZTRl9GRUFUVVJFX0xVTl9TSEFSSU5HCQkJMHgwMDAwMDAwNAogI2RlZmluZSBGU0ZfRkVBVFVSRV9OT1RJRklDQVRJT05fTE9TVAkJMHgwMDAwMDAwOAogI2RlZmluZSBGU0ZfRkVBVFVSRV9IQkFBUElfTUFOQUdFTUVOVCAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBGU0ZfRkVBVFVSRV9FTFNfQ1RfQ0hBSU5FRF9TQkFMUyAgICAgICAgMHgwMDAwMDAyMAogI2RlZmluZSBGU0ZfRkVBVFVSRV9VUERBVEVfQUxFUlQJCTB4MDAwMDAxMDAKICNkZWZpbmUgRlNGX0ZFQVRVUkVfTUVBU1VSRU1FTlRfREFUQQkJMHgwMDAwMDIwMAogCiAvKiBob3N0IGNvbm5lY3Rpb24gZmVhdHVyZXMgKi8KICNkZWZpbmUgRlNGX0ZFQVRVUkVfTlBJVl9NT0RFCQkJMHgwMDAwMDAwMQotI2RlZmluZSBGU0ZfRkVBVFVSRV9WTV9BU1NJR05FRF9XV1BOCQkweDAwMDAwMDAyCiAKIC8qIG9wdGlvbiAqLwogI2RlZmluZSBGU0ZfT1BFTl9MVU5fU1VQUFJFU1NfQk9YSU5HCQkweDAwMDAwMDAxCi0jZGVmaW5lIEZTRl9PUEVOX0xVTl9SRVBMSUNBVEVfU0VOU0UJCTB4MDAwMDAwMDIKLQotLyogYWRhcHRlciB0eXBlcyAqLwotI2RlZmluZSBGU0ZfQURBUFRFUl9UWVBFX0ZJQ09OICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBGU0ZfQURBUFRFUl9UWVBFX0ZJQ09OX0VYUFJFU1MgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKiBwb3J0IHR5cGVzICovCi0jZGVmaW5lIEZTRl9IQkFfUE9SVFRZUEVfVU5LTk9XTgkJMHgwMDAwMDAwMQotI2RlZmluZSBGU0ZfSEJBX1BPUlRUWVBFX05PVFBSRVNFTlQJCTB4MDAwMDAwMDMKLSNkZWZpbmUgRlNGX0hCQV9QT1JUVFlQRV9OUE9SVAkJCTB4MDAwMDAwMDUKLSNkZWZpbmUgRlNGX0hCQV9QT1JUVFlQRV9QVFAJCQkweDAwMDAwMDIxCi0vKiBmb2xsb3dpbmcgYXJlIG5vdCBkZWZpbmVkIGFuZCB1c2VkIGJ5IEZTRiBTcGVjCi0gICBidXQgYXJlIGFkZGl0aW9uYWxseSBkZWZpbmVkIGJ5IEZDLUhCQSAqLwotI2RlZmluZSBGU0ZfSEJBX1BPUlRUWVBFX09USEVSCQkJMHgwMDAwMDAwMgotI2RlZmluZSBGU0ZfSEJBX1BPUlRUWVBFX05PVFBSRVNFTlQJCTB4MDAwMDAwMDMKLSNkZWZpbmUgRlNGX0hCQV9QT1JUVFlQRV9OTFBPUlQJCQkweDAwMDAwMDA2Ci0jZGVmaW5lIEZTRl9IQkFfUE9SVFRZUEVfRkxQT1JUCQkJMHgwMDAwMDAwNwotI2RlZmluZSBGU0ZfSEJBX1BPUlRUWVBFX0ZQT1JUCQkJMHgwMDAwMDAwOAotI2RlZmluZSBGU0ZfSEJBX1BPUlRUWVBFX0xQT1JUCQkJMHgwMDAwMDAyMAotCi0vKiBwb3J0IHN0YXRlcyAqLwotI2RlZmluZSBGU0ZfSEJBX1BPUlRTVEFURV9VTktOT1dOCQkweDAwMDAwMDAxCi0jZGVmaW5lIEZTRl9IQkFfUE9SVFNUQVRFX09OTElORQkJMHgwMDAwMDAwMgotI2RlZmluZSBGU0ZfSEJBX1BPUlRTVEFURV9PRkZMSU5FCQkweDAwMDAwMDAzCi0jZGVmaW5lIEZTRl9IQkFfUE9SVFNUQVRFX0xJTktET1dOCQkweDAwMDAwMDA2Ci0jZGVmaW5lIEZTRl9IQkFfUE9SVFNUQVRFX0VSUk9SCQkJMHgwMDAwMDAwNwotCi0vKiBJTyBzdGF0ZXMgb2YgYWRhcHRlciAqLwotI2RlZmluZSBGU0ZfSU9TVEFUX05QT1JUX1JKVAkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgRlNGX0lPU1RBVF9GQUJSSUNfUkpUCQkJMHgwMDAwMDAwNQotI2RlZmluZSBGU0ZfSU9TVEFUX0xTX1JKVAkJCTB4MDAwMDAwMDkKIAogLyogb3BlbiBMVU4gYWNjZXNzIGZsYWdzKi8KLSNkZWZpbmUgRlNGX1VOSVRfQUNDRVNTX09QRU5fTFVOX0FMTE9XRUQJMHgwMTAwMDAwMAogI2RlZmluZSBGU0ZfVU5JVF9BQ0NFU1NfRVhDTFVTSVZFCQkweDAyMDAwMDAwCiAjZGVmaW5lIEZTRl9VTklUX0FDQ0VTU19PVVRCT1VORF9UUkFOU0ZFUgkweDEwMDAwMDAwCiAKQEAgLTI2NSwxMSArMTk1LDYgQEAKIAl1MzIgcmVzMTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgZnNmX3BvcnRfY2xvc2VkX3BheWxvYWQgewotCXN0cnVjdCBmc2ZfcXVldWVfZGVzaWduYXRvciBxdWV1ZV9kZXNpZ25hdG9yOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2hhbmRsZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCiBzdHJ1Y3QgZnNmX2JpdF9lcnJvcl9wYXlsb2FkIHsKIAl1MzIgcmVzMTsKIAl1MzIgbGlua19mYWlsdXJlX2Vycm9yX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYwppbmRleCBkNmRiZDY1Li4zZTA1MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYwpAQCAtMjgsNyArMjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgorc3RhdGljIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICoKIHpmY3BfcWRpb19zYmFsZShzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpxLCBpbnQgc2JhbF9pZHgsIGludCBzYmFsZV9pZHgpCiB7CiAJcmV0dXJuICZxLT5zYmFsW3NiYWxfaWR4XS0+ZWxlbWVudFtzYmFsZV9pZHhdOwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdGF0aWMgdm9pZCB6ZmNwX3FkaW9faGFuZGxlcl9lcnJvcihzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCB1OCBpZCkKIHsKLQlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAiUURJTyBwcm9ibGVtIG9jY3VycmVkLlxuIik7CisJZGV2X3dhcm4oJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwgIkEgUURJTyBwcm9ibGVtIG9jY3VycmVkXG4iKTsKIAogCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsCiAJCQkJWkZDUF9TVEFUVVNfQURBUFRFUl9MSU5LX1VOUExVR0dFRCB8CkBAIC0xNDUsNyArMTQ1LDcgQEAKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKikgcGFybTsKIAlzdHJ1Y3QgemZjcF9xZGlvX3F1ZXVlICpxdWV1ZSA9ICZhZGFwdGVyLT5yZXNwX3E7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAlpbnQgc2JhbF9pZHgsIHNiYWxlX2lkeCwgc2JhbF9ubzsKIAogCWlmICh1bmxpa2VseShxZGlvX2VycikpIHsKQEAgLTE3NCw4ICsxNzQsOCBAQAogCiAJCWlmICh1bmxpa2VseSghKHNiYWxlLT5mbGFncyAmIFNCQUxfRkxBR1NfTEFTVF9FTlRSWSkpKQogCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCQkgIlByb3RvY29sIHZpb2xhdGlvbiBieSBhZGFwdGVyLiAiCi0JCQkJICJDb250aW51aW5nIG9wZXJhdGlvbnMuXG4iKTsKKwkJCQkgIkEgUURJTyBwcm90b2NvbCBlcnJvciBvY2N1cnJlZCwgIgorCQkJCSAib3BlcmF0aW9ucyBjb250aW51ZVxuIik7CiAJfQogCiAJLyoKQEAgLTE5MCw4ICsxOTAsNyBAQAogICogQGZzZl9yZXE6IHBvaW50ZXIgdG8gc3RydWN0IGZzZl9yZXEKICAqIFJldHVybnM6IHBvaW50ZXIgdG8gcWRpb19idWZmZXJfZWxlbWVudCAoU0JBTEUpIHN0cnVjdHVyZQogICovCi12b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqCi16ZmNwX3FkaW9fc2JhbGVfcmVxKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKK3N0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICp6ZmNwX3FkaW9fc2JhbGVfcmVxKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKIAlyZXR1cm4gemZjcF9xZGlvX3NiYWxlKCZyZXEtPmFkYXB0ZXItPnJlcV9xLCByZXEtPnNiYWxfbGFzdCwgMCk7CiB9CkBAIC0yMDEsOCArMjAwLDcgQEAKICAqIEBmc2ZfcmVxOiBwb2ludGVyIHRvIHN0cnVjdCBmc2ZfcmVxCiAgKiBSZXR1cm5zOiBwb2ludGVyIHRvIHFkaW9fYnVmZmVyX2VsZW1lbnQgKFNCQUxFKSBzdHJ1Y3R1cmUKICAqLwotdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgotemZjcF9xZGlvX3NiYWxlX2N1cnIoc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQorc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnpmY3BfcWRpb19zYmFsZV9jdXJyKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSkKIHsKIAlyZXR1cm4gemZjcF9xZGlvX3NiYWxlKCZyZXEtPmFkYXB0ZXItPnJlcV9xLCByZXEtPnNiYWxfbGFzdCwKIAkJCSAgICAgICByZXEtPnNiYWxlX2N1cnIpOwpAQCAtMjE2LDEwICsyMTQsMTAgQEAKIAkJCQkJJSBRRElPX01BWF9CVUZGRVJTX1BFUl9ROwogfQogCi1zdGF0aWMgdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKgorc3RhdGljIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICoKIHpmY3BfcWRpb19zYmFsX2NoYWluKHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKmZzZl9yZXEsIHVuc2lnbmVkIGxvbmcgc2J0eXBlKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAKIAkvKiBzZXQgbGFzdCBlbnRyeSBmbGFnIGluIGN1cnJlbnQgU0JBTEUgb2YgY3VycmVudCBTQkFMICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfY3Vycihmc2ZfcmVxKTsKQEAgLTI1MCw3ICsyNDgsNyBAQAogCXJldHVybiBzYmFsZTsKIH0KIAotc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICoKK3N0YXRpYyBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqCiB6ZmNwX3FkaW9fc2JhbGVfbmV4dChzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxLCB1bnNpZ25lZCBsb25nIHNidHlwZSkKIHsKIAlpZiAoZnNmX3JlcS0+c2JhbGVfY3VyciA9PSBaRkNQX0xBU1RfU0JBTEVfUEVSX1NCQUwpCkBAIC0yNzMsNyArMjcxLDcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgc2J0eXBlLCB2b2lkICpzdGFydF9hZGRyLAogCQkJCXVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGgpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAl1bnNpZ25lZCBsb25nIHJlbWFpbmluZywgbGVuZ3RoOwogCXZvaWQgKmFkZHI7CiAKQEAgLTI4Miw2ICsyODAsNyBAQAogCSAgICAgYWRkciArPSBsZW5ndGgsIHJlbWFpbmluZyAtPSBsZW5ndGgpIHsKIAkJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfbmV4dChmc2ZfcmVxLCBzYnR5cGUpOwogCQlpZiAoIXNiYWxlKSB7CisJCQlhdG9taWNfaW5jKCZmc2ZfcmVxLT5hZGFwdGVyLT5xZGlvX291dGJfZnVsbCk7CiAJCQl6ZmNwX3FkaW9fdW5kb19zYmFscyhmc2ZfcmVxKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0zMDcsNyArMzA2LDcgQEAKIGludCB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2ZfcmVxLCB1bnNpZ25lZCBsb25nIHNidHlwZSwKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbWF4X3NiYWxzKQogewotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAJaW50IHJldHZhbCwgYnl0ZXMgPSAwOwogCiAJLyogZmlndXJlIG91dCBsYXN0IGFsbG93ZWQgU0JBTCAqLwpAQCAtMzQ0LDEwICszNDMsMTAgQEAKIAlpbnQgZmlyc3QgPSBmc2ZfcmVxLT5zYmFsX2ZpcnN0OwogCWludCBjb3VudCA9IGZzZl9yZXEtPnNiYWxfbnVtYmVyOwogCWludCByZXR2YWwsIHBjaSwgcGNpX2JhdGNoOwotCXZvbGF0aWxlIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKKwlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAKIAkvKiBhY2tub3dsZWRnZW1lbnRzIGZvciB0cmFuc2ZlcnJlZCBidWZmZXJzICovCi0JcGNpX2JhdGNoID0gcmVxX3EtPnBjaV9iYXRjaCArIGNvdW50OworCXBjaV9iYXRjaCA9IGFkYXB0ZXItPnJlcV9xX3BjaV9iYXRjaCArIGNvdW50OwogCWlmICh1bmxpa2VseShwY2lfYmF0Y2ggPj0gWkZDUF9RRElPX1BDSV9JTlRFUlZBTCkpIHsKIAkJcGNpX2JhdGNoICU9IFpGQ1BfUURJT19QQ0lfSU5URVJWQUw7CiAJCXBjaSA9IGZpcnN0ICsgY291bnQgLSAocGNpX2JhdGNoICsgMSk7CkBAIC0zNjcsNyArMzY2LDcgQEAKIAlhdG9taWNfc3ViKGNvdW50LCAmcmVxX3EtPmNvdW50KTsKIAlyZXFfcS0+Zmlyc3QgKz0gY291bnQ7CiAJcmVxX3EtPmZpcnN0ICU9IFFESU9fTUFYX0JVRkZFUlNfUEVSX1E7Ci0JcmVxX3EtPnBjaV9iYXRjaCA9IHBjaV9iYXRjaDsKKwlhZGFwdGVyLT5yZXFfcV9wY2lfYmF0Y2ggPSBwY2lfYmF0Y2g7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxOCwxNCArNDE3LDE0IEBACiAJc3RydWN0IHpmY3BfcWRpb19xdWV1ZSAqcmVxX3E7CiAJaW50IGZpcnN0LCBjb3VudDsKIAotCWlmICghYXRvbWljX3Rlc3RfbWFzayhaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCwgJmFkYXB0ZXItPnN0YXR1cykpCisJaWYgKCEoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCkpCiAJCXJldHVybjsKIAogCS8qIGNsZWFyIFFESU9VUCBmbGFnLCB0aHVzIGRvX1FESU8gaXMgbm90IGNhbGxlZCBkdXJpbmcgcWRpb19zaHV0ZG93biAqLwogCXJlcV9xID0gJmFkYXB0ZXItPnJlcV9xOwotCXNwaW5fbG9jaygmcmVxX3EtPmxvY2spOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+cmVxX3FfbG9jayk7CiAJYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAsICZhZGFwdGVyLT5zdGF0dXMpOwotCXNwaW5fdW5sb2NrKCZyZXFfcS0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnJlcV9xX2xvY2spOwogCiAJcWRpb19zaHV0ZG93bihhZGFwdGVyLT5jY3dfZGV2aWNlLCBRRElPX0ZMQUdfQ0xFQU5VUF9VU0lOR19DTEVBUik7CiAKQEAgLTQzOCw3ICs0MzcsNyBAQAogCX0KIAlyZXFfcS0+Zmlyc3QgPSAwOwogCWF0b21pY19zZXQoJnJlcV9xLT5jb3VudCwgMCk7Ci0JcmVxX3EtPnBjaV9iYXRjaCA9IDA7CisJYWRhcHRlci0+cmVxX3FfcGNpX2JhdGNoID0gMDsKIAlhZGFwdGVyLT5yZXNwX3EuZmlyc3QgPSAwOwogCWF0b21pY19zZXQoJmFkYXB0ZXItPnJlc3BfcS5jb3VudCwgMCk7CiB9CkBAIC00NTAsMjMgKzQ0OSwxNyBAQAogICovCiBpbnQgemZjcF9xZGlvX29wZW4oc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlcikKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOwogCWludCBjYzsKIAotCWlmIChhdG9taWNfdGVzdF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQLCAmYWRhcHRlci0+c3RhdHVzKSkKKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19BREFQVEVSX1FESU9VUCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAocWRpb19lc3RhYmxpc2goJmFkYXB0ZXItPnFkaW9faW5pdF9kYXRhKSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIkVzdGFibGlzaCBvZiBRRElPIHF1ZXVlcyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChxZGlvX2VzdGFibGlzaCgmYWRhcHRlci0+cWRpb19pbml0X2RhdGEpKQorCQlnb3RvIGZhaWxlZF9lc3RhYmxpc2g7CiAKLQlpZiAocWRpb19hY3RpdmF0ZShhZGFwdGVyLT5jY3dfZGV2aWNlKSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkgIkFjdGl2YXRlIG9mIFFESU8gcXVldWVzIGZhaWxlZC5cbiIpOworCWlmIChxZGlvX2FjdGl2YXRlKGFkYXB0ZXItPmNjd19kZXZpY2UpKQogCQlnb3RvIGZhaWxlZF9xZGlvOwotCX0KIAogCWZvciAoY2MgPSAwOyBjYyA8IFFESU9fTUFYX0JVRkZFUlNfUEVSX1E7IGNjKyspIHsKIAkJc2JhbGUgPSAmKGFkYXB0ZXItPnJlc3BfcS5zYmFsW2NjXS0+ZWxlbWVudFswXSk7CkBAIC00NzYsMjAgKzQ2OSwyMCBAQAogCX0KIAogCWlmIChkb19RRElPKGFkYXB0ZXItPmNjd19kZXZpY2UsIFFESU9fRkxBR19TWU5DX0lOUFVULCAwLCAwLAotCQkgICAgIFFESU9fTUFYX0JVRkZFUlNfUEVSX1EpKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldiwKLQkJCSAiSW5pdCBvZiBRRElPIHJlc3BvbnNlIHF1ZXVlIGZhaWxlZC5cbiIpOworCQkgICAgIFFESU9fTUFYX0JVRkZFUlNfUEVSX1EpKQogCQlnb3RvIGZhaWxlZF9xZGlvOwotCX0KIAogCS8qIHNldCBpbmRleCBvZiBmaXJzdCBhdmFsYWJsZSBTQkFMUyAvIG51bWJlciBvZiBhdmFpbGFibGUgU0JBTFMgKi8KIAlhZGFwdGVyLT5yZXFfcS5maXJzdCA9IDA7CiAJYXRvbWljX3NldCgmYWRhcHRlci0+cmVxX3EuY291bnQsIFFESU9fTUFYX0JVRkZFUlNfUEVSX1EpOwotCWFkYXB0ZXItPnJlcV9xLnBjaV9iYXRjaCA9IDA7CisJYWRhcHRlci0+cmVxX3FfcGNpX2JhdGNoID0gMDsKIAogCXJldHVybiAwOwogCiBmYWlsZWRfcWRpbzoKIAlxZGlvX3NodXRkb3duKGFkYXB0ZXItPmNjd19kZXZpY2UsIFFESU9fRkxBR19DTEVBTlVQX1VTSU5HX0NMRUFSKTsKK2ZhaWxlZF9lc3RhYmxpc2g6CisJZGV2X2VycigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LAorCQkiU2V0dGluZyB1cCB0aGUgUURJTyBjb25uZWN0aW9uIHRvIHRoZSBGQ1AgYWRhcHRlciBmYWlsZWRcbiIpOwogCXJldHVybiAtRUlPOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwppbmRleCBhZWFlNTZiLi5jYThmODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwpAQCAtMjEsMjAgKzIxLDYgQEAKIAlyZXR1cm4gZmNwX3Nuc19pbmZvX3B0cjsKIH0KIAotdm9pZCB6ZmNwX3NldF9mY3BfZGwoc3RydWN0IGZjcF9jbW5kX2l1ICpmY3BfY21kLCBmY3BfZGxfdCBmY3BfZGwpCi17Ci0JZmNwX2RsX3QgKmZjcF9kbF9wdHI7Ci0KLQkvKgotCSAqIGZjcF9kbF9hZGRyID0gc3RhcnQgYWRkcmVzcyBvZiBmY3BfY21uZCBzdHJ1Y3R1cmUgKwotCSAqIHNpemUgb2YgZml4ZWQgcGFydCArIHNpemUgb2YgZHluYW1pY2FsbHkgc2l6ZWQgYWRkX2RjcF9jZGIgZmllbGQKLQkgKiBTRUUgRkNQLTIgZG9jdW1lbnRhdGlvbgotCSAqLwotCWZjcF9kbF9wdHIgPSAoZmNwX2RsX3QgKikgKCh1bnNpZ25lZCBjaGFyICopICZmY3BfY21kWzFdICsKLQkJCQkgICAoZmNwX2NtZC0+YWRkX2ZjcF9jZGJfbGVuZ3RoIDw8IDIpKTsKLQkqZmNwX2RsX3B0ciA9IGZjcF9kbDsKLX0KLQogc3RhdGljIHZvaWQgemZjcF9zY3NpX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzZHBudCkKIHsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0ID0gKHN0cnVjdCB6ZmNwX3VuaXQgKikgc2RwbnQtPmhvc3RkYXRhOwpAQCAtMTE5LDEzICsxMDUsMTcgQEAKIHsKIAlzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0OwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7CisJaW50IHNjc2lfbHVuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmYWRhcHRlci0+cG9ydF9saXN0X2hlYWQsIGxpc3QpIHsKIAkJaWYgKCFwb3J0LT5ycG9ydCB8fCAoaWQgIT0gcG9ydC0+cnBvcnQtPnNjc2lfdGFyZ2V0X2lkKSkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVuaXQsICZwb3J0LT51bml0X2xpc3RfaGVhZCwgbGlzdCkKLQkJCWlmIChsdW4gPT0gdW5pdC0+c2NzaV9sdW4pCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodW5pdCwgJnBvcnQtPnVuaXRfbGlzdF9oZWFkLCBsaXN0KSB7CisJCQlzY3NpX2x1biA9IHNjc2lsdW5fdG9faW50KAorCQkJCShzdHJ1Y3Qgc2NzaV9sdW4gKikmdW5pdC0+ZmNwX2x1bik7CisJCQlpZiAobHVuID09IHNjc2lfbHVuKQogCQkJCXJldHVybiB1bml0OworCQl9CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0xODMsNyArMTczLDYgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJZnNmX3JlcS0+ZGF0YSA9IE5VTEw7Ci0JZnNmX3JlcS0+c3RhdHVzIHw9IFpGQ1BfU1RBVFVTX0ZTRlJFUV9BQk9SVElORzsKIAogCS8qIGRvbid0IGFjY2VzcyBvbGQgZnNmX3JlcSBhZnRlciByZWxlYXNpbmcgdGhlIGFib3J0X2xvY2sgKi8KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+YWJvcnRfbG9jaywgZmxhZ3MpOwpAQCAtMjk0LDcgKzI4Myw4IEBACiAJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgemZjcF9hZGFwdGVyICopKTsKIAlpZiAoIWFkYXB0ZXItPnNjc2lfaG9zdCkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCi0JCQkicmVnaXN0cmF0aW9uIHdpdGggU0NTSSBzdGFjayBmYWlsZWQuIik7CisJCQkiUmVnaXN0ZXJpbmcgdGhlIEZDUCBkZXZpY2Ugd2l0aCB0aGUgIgorCQkJIlNDU0kgc3RhY2sgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zMTIsNyArMzAyLDYgQEAKIAkJc2NzaV9ob3N0X3B1dChhZGFwdGVyLT5zY3NpX2hvc3QpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfUkVHSVNURVJFRCwgJmFkYXB0ZXItPnN0YXR1cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNiw3ICszMjUsNiBAQAogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwogCWFkYXB0ZXItPnNjc2lfaG9zdCA9IE5VTEw7Ci0JYXRvbWljX2NsZWFyX21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9SRUdJU1RFUkVELCAmYWRhcHRlci0+c3RhdHVzKTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc3lzZnMuYwppbmRleCAyZTg1YzZjLi5jYTkyOTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zeXNmcy5jCkBAIC0yNiw5ICsyNiw5IEBACiBaRkNQX0RFRklORV9BVFRSKHpmY3BfYWRhcHRlciwgYWRhcHRlciwgc3RhdHVzLCAiMHglMDh4XG4iLAogCQkgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykpOwogWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIHBlZXJfd3dubiwgIjB4JTAxNmxseFxuIiwKLQkJIGFkYXB0ZXItPnBlZXJfd3dubik7CisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBhZGFwdGVyLT5wZWVyX3d3bm4pOwogWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIHBlZXJfd3dwbiwgIjB4JTAxNmxseFxuIiwKLQkJIGFkYXB0ZXItPnBlZXJfd3dwbik7CisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBhZGFwdGVyLT5wZWVyX3d3cG4pOwogWkZDUF9ERUZJTkVfQVRUUih6ZmNwX2FkYXB0ZXIsIGFkYXB0ZXIsIHBlZXJfZF9pZCwgIjB4JTA2eFxuIiwKIAkJIGFkYXB0ZXItPnBlZXJfZF9pZCk7CiBaRkNQX0RFRklORV9BVFRSKHpmY3BfYWRhcHRlciwgYWRhcHRlciwgY2FyZF92ZXJzaW9uLCAiMHglMDR4XG4iLApAQCAtMTM1LDggKzEzNSw5IEBACiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7Ci0Jd3duX3Qgd3dwbjsKKwl1NjQgd3dwbjsKIAlpbnQgcmV0dmFsID0gMDsKKwlMSVNUX0hFQUQocG9ydF9yZW1vdmVfbGgpOwogCiAJZG93bigmemZjcF9kYXRhLmNvbmZpZ19zZW1hKTsKIAlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnN0YXR1cykgJiBaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFKSB7CkBAIC0xNDQsNyArMTQ1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHN0cmljdF9zdHJ0b3VsbChidWYsIDAsICZ3d3BuKSkgeworCWlmIChzdHJpY3Rfc3RydG91bGwoYnVmLCAwLCAodW5zaWduZWQgbG9uZyBsb25nICopICZ3d3BuKSkgewogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNTQsNyArMTU1LDcgQEAKIAlpZiAocG9ydCAmJiAoYXRvbWljX3JlYWQoJnBvcnQtPnJlZmNvdW50KSA9PSAwKSkgewogCQl6ZmNwX3BvcnRfZ2V0KHBvcnQpOwogCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQ09NTU9OX1JFTU9WRSwgJnBvcnQtPnN0YXR1cyk7Ci0JCWxpc3RfbW92ZSgmcG9ydC0+bGlzdCwgJmFkYXB0ZXItPnBvcnRfcmVtb3ZlX2xoKTsKKwkJbGlzdF9tb3ZlKCZwb3J0LT5saXN0LCAmcG9ydF9yZW1vdmVfbGgpOwogCX0gZWxzZQogCQlwb3J0ID0gTlVMTDsKIAl3cml0ZV91bmxvY2tfaXJxKCZ6ZmNwX2RhdGEuY29uZmlnX2xvY2spOwpAQCAtMjAwLDcgKzIwMSw3IEBACiB7CiAJc3RydWN0IHpmY3BfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB6ZmNwX3VuaXQgKnVuaXQ7Ci0JZmNwX2x1bl90IGZjcF9sdW47CisJdTY0IGZjcF9sdW47CiAJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKIAlkb3duKCZ6ZmNwX2RhdGEuY29uZmlnX3NlbWEpOwpAQCAtMjA5LDcgKzIxMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzdHJpY3Rfc3RydG91bGwoYnVmLCAwLCAmZmNwX2x1bikpCisJaWYgKHN0cmljdF9zdHJ0b3VsbChidWYsIDAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikgJmZjcF9sdW4pKQogCQlnb3RvIG91dDsKIAogCXVuaXQgPSB6ZmNwX3VuaXRfZW5xdWV1ZShwb3J0LCBmY3BfbHVuKTsKQEAgLTIzMyw4ICsyMzQsOSBAQAogewogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgemZjcF91bml0ICp1bml0OwotCWZjcF9sdW5fdCBmY3BfbHVuOworCXU2NCBmY3BfbHVuOwogCWludCByZXR2YWwgPSAwOworCUxJU1RfSEVBRCh1bml0X3JlbW92ZV9saCk7CiAKIAlkb3duKCZ6ZmNwX2RhdGEuY29uZmlnX3NlbWEpOwogCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+c3RhdHVzKSAmIFpGQ1BfU1RBVFVTX0NPTU1PTl9SRU1PVkUpIHsKQEAgLTI0Miw3ICsyNDQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoc3RyaWN0X3N0cnRvdWxsKGJ1ZiwgMCwgJmZjcF9sdW4pKSB7CisJaWYgKHN0cmljdF9zdHJ0b3VsbChidWYsIDAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikgJmZjcF9sdW4pKSB7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI1Miw3ICsyNTQsNyBAQAogCWlmICh1bml0ICYmIChhdG9taWNfcmVhZCgmdW5pdC0+cmVmY291bnQpID09IDApKSB7CiAJCXpmY3BfdW5pdF9nZXQodW5pdCk7CiAJCWF0b21pY19zZXRfbWFzayhaRkNQX1NUQVRVU19DT01NT05fUkVNT1ZFLCAmdW5pdC0+c3RhdHVzKTsKLQkJbGlzdF9tb3ZlKCZ1bml0LT5saXN0LCAmcG9ydC0+dW5pdF9yZW1vdmVfbGgpOworCQlsaXN0X21vdmUoJnVuaXQtPmxpc3QsICZ1bml0X3JlbW92ZV9saCk7CiAJfSBlbHNlCiAJCXVuaXQgPSBOVUxMOwogCkBAIC0yNzMsMjIgKzI3NSw3IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIodW5pdF9yZW1vdmUsIFNfSVdVU1IsIE5VTEwsIHpmY3Bfc3lzZnNfdW5pdF9yZW1vdmVfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqemZjcF9wb3J0X25zX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3BvcnRfZmFpbGVkLmF0dHIsCi0JJmRldl9hdHRyX3BvcnRfaW5fcmVjb3ZlcnkuYXR0ciwKLQkmZGV2X2F0dHJfcG9ydF9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfcG9ydF9hY2Nlc3NfZGVuaWVkLmF0dHIsCi0JTlVMTAotfTsKLQotLyoqCi0gKiB6ZmNwX3N5c2ZzX25zX3BvcnRfYXR0cnMgLSBzeXNmcyBhdHRyaWJ1dGVzIGZvciBuYW1lc2VydmVyCi0gKi8KLXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc19uc19wb3J0X2F0dHJzID0gewotCS5hdHRycyA9IHpmY3BfcG9ydF9uc19hdHRycywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp6ZmNwX3BvcnRfbm9fbnNfYXR0cnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp6ZmNwX3BvcnRfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfdW5pdF9hZGQuYXR0ciwKIAkmZGV2X2F0dHJfdW5pdF9yZW1vdmUuYXR0ciwKIAkmZGV2X2F0dHJfcG9ydF9mYWlsZWQuYXR0ciwKQEAgLTMwMiw3ICsyODksNyBAQAogICogemZjcF9zeXNmc19wb3J0X2F0dHJzIC0gc3lzZnMgYXR0cmlidXRlcyBmb3IgYWxsIG90aGVyIHBvcnRzCiAgKi8KIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgemZjcF9zeXNmc19wb3J0X2F0dHJzID0gewotCS5hdHRycyA9IHpmY3BfcG9ydF9ub19uc19hdHRycywKKwkuYXR0cnMgPSB6ZmNwX3BvcnRfYXR0cnMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqemZjcF91bml0X2F0dHJzW10gPSB7CkBAIC0zOTQsOSArMzgxLDExIEBACiBzdGF0aWMgREVWSUNFX0FUVFIoX25hbWUsIFNfSVJVR08sIHpmY3Bfc3lzZnNfc2NzaV8jI19uYW1lIyNfc2hvdywgTlVMTCk7CiAKIFpGQ1BfREVGSU5FX1NDU0lfQVRUUihoYmFfaWQsICIlc1xuIiwKLQl1bml0LT5wb3J0LT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYuYnVzX2lkKTsKLVpGQ1BfREVGSU5FX1NDU0lfQVRUUih3d3BuLCAiMHglMDE2bGx4XG4iLCB1bml0LT5wb3J0LT53d3BuKTsKLVpGQ1BfREVGSU5FX1NDU0lfQVRUUihmY3BfbHVuLCAiMHglMDE2bGx4XG4iLCB1bml0LT5mY3BfbHVuKTsKKwkJICAgICAgZGV2X25hbWUoJnVuaXQtPnBvcnQtPmFkYXB0ZXItPmNjd19kZXZpY2UtPmRldikpOworWkZDUF9ERUZJTkVfU0NTSV9BVFRSKHd3cG4sICIweCUwMTZsbHhcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHVuaXQtPnBvcnQtPnd3cG4pOworWkZDUF9ERUZJTkVfU0NTSV9BVFRSKGZjcF9sdW4sICIweCUwMTZsbHhcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHVuaXQtPmZjcF9sdW4pOwogCiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqemZjcF9zeXNmc19zZGV2X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX2ZjcF9sdW4sCkBAIC00ODcsMTAgKzQ3NiwyMyBAQAogWkZDUF9TSE9TVF9BVFRSKHNlY29uZHNfYWN0aXZlLCAiJWxsdVxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdF9pbmZvLnNlY29uZHNfYWN0KTsKIAorc3RhdGljIHNzaXplX3QgemZjcF9zeXNmc19hZGFwdGVyX3FfZnVsbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOworCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQkoc3RydWN0IHpmY3BfYWRhcHRlciAqKSBzY3NpX2hvc3QtPmhvc3RkYXRhWzBdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGF0b21pY19yZWFkKCZhZGFwdGVyLT5xZGlvX291dGJfZnVsbCkpOworfQorc3RhdGljIERFVklDRV9BVFRSKHF1ZXVlX2Z1bGwsIFNfSVJVR08sIHpmY3Bfc3lzZnNfYWRhcHRlcl9xX2Z1bGxfc2hvdywgTlVMTCk7CisKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICp6ZmNwX3N5c2ZzX3Nob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3V0aWxpemF0aW9uLAogCSZkZXZfYXR0cl9yZXF1ZXN0cywKIAkmZGV2X2F0dHJfbWVnYWJ5dGVzLAogCSZkZXZfYXR0cl9zZWNvbmRzX2FjdGl2ZSwKKwkmZGV2X2F0dHJfcXVldWVfZnVsbCwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL01ha2VmaWxlIGIvZHJpdmVycy9zYnVzL01ha2VmaWxlCmluZGV4IDdiMWQyNGQ5Li5lOTRkYzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zYnVzL01ha2VmaWxlCkBAIC0yLDggKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KICMKIAotaWZuZXEgKCQoQVJDSCksbTY4aykKLW9iai15ICAgIDo9IHNidXMubyBkdm1hLm8KLWVuZGlmCi0KIG9iai0kKENPTkZJR19TQlVTQ0hBUikgKz0gY2hhci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnCmluZGV4IDQwMGM2NWIuLjczY2RlODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZwpAQCAtMTMsMTYgKzEzLDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotY29uZmlnIFNVTl9NT1NURUtfUlRDCi0JdHJpc3RhdGUgIk1vc3RlayByZWFsIHRpbWUgY2xvY2sgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNQQVJDMzIKLQloZWxwCi0JICBUaGUgTW9zdGVrIFJUQyBjaGlwIGlzIHVzZWQgb24gYWxsIGtub3duIFN1biBjb21wdXRlcnMgZXhjZXB0Ci0JICBzb21lIEphdmFTdGF0aW9ucy4gRm9yIGEgSmF2YVN0YXRpb24geW91IG5lZWQgdG8gc2F5IFkgYm90aCBoZXJlCi0JICBhbmQgdG8gIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0Ii4KLQotCSAgU2F5IFkgaGVyZSB1bmxlc3MgeW91IGFyZSBidWlsZGluZyBhIHNwZWNpYWwgcHVycG9zZSBrZXJuZWwuCi0KIGNvbmZpZyBPQlBfRkxBU0gKIAl0cmlzdGF0ZSAiT0JQIEZsYXNoIERldmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gU1BBUkM2NApAQCAtMzAsMjYgKzIwLDkgQEAKIAkgIFRoZSBPcGVuQm9vdCBQUk9NIG9uIFVsdHJhIHN5c3RlbXMgaXMgZmxhc2hhYmxlLiBJZiB5b3Ugd2FudCB0byBiZQogCSAgYWJsZSB0byB1cGdyYWRlIHRoZSBPQlAgZmlybXdhcmUsIHNheSBZIGhlcmUuCiAKLWNvbmZpZyBTVU5fQlBQCi0JdHJpc3RhdGUgIkJpZGlyZWN0aW9uYWwgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IChPQlNPTEVURSkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgU3VuJ3Mgb2Jzb2xldGUgdmFyaWFudCBvZiBJRUVFMTI4NAotCSAgYmlkaXJlY3Rpb25hbCBwYXJhbGxlbCBwb3J0IHByb3RvY29sIGFzIC9kZXYvYnBwWC4gIENhbiBiZSBidWlsdCBvbgotCSAgeDg2IG1hY2hpbmVzLgotCi1jb25maWcgU1VOX1ZJREVPUElYCi0JdHJpc3RhdGUgIlZpZGVvcGl4IEZyYW1lIEdyYWJiZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgKEJST0tFTiB8fCAhNjRCSVQpCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBWaWRlb3BpeCBGcmFtZSBHcmFiYmVyIGZyb20gU3VuCi0JICBNaWNyb3N5c3RlbXMsIGNvbW1vbmx5IGZvdW5kIG9uIFNQQVJDc3RhdGlvbnMuICBUaGlzIGNhcmQsIHdoaWNoIGlzCi0JICBiYXNlZCBvbiB0aGUgUGhpbGxpcHMgU0FBOTA1MSwgY2FuIGhhbmRsZSBOVFNDIGFuZCBQQUwvU0VDQU0gYW5kCi0JICBTVklERU8gc2lnbmFscy4KLQogY29uZmlnIFRBRFBPTEVfVFMxMDJfVUNUUkwKIAl0cmlzdGF0ZSAiVGFkcG9sZSBUUzEwMiBNaWNyb2NvbnRyb2xsZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTUEFSQzMyCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpcmVjdGx5IHN1cHBvcnQgdGhlIFRTMTAyIE1pY3JvY29udHJvbGxlciBpbnRlcmZhY2UKIAkgIG9uIHRoZSBUYWRwb2xlIFNwYXJjYm9vayAzLiAgVGhpcyBkZXZpY2UgaGFuZGxlcyBwb3dlci1tYW5hZ2VtZW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvc2J1cy9jaGFyL01ha2VmaWxlCmluZGV4IDdhYjA2MGUuLjc4YjYxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL01ha2VmaWxlCkBAIC03LDE4ICs3LDEyIEBACiAjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgogIwogCi12ZmMtb2JqcyA6PSB2ZmNfZGV2Lm8gdmZjX2kyYy5vCiBiYmMtb2JqcyA6PSBiYmNfaTJjLm8gYmJjX2VudmN0cmwubwogCiBvYmotJChDT05GSUdfRU5WQ1RSTCkJCQkrPSBlbnZjdHJsLm8KIG9iai0kKENPTkZJR19ESVNQTEFZN1NFRykJCSs9IGRpc3BsYXk3c2VnLm8KLW9iai0kKENPTkZJR19XQVRDSERPR19DUDFYWFgpCQkrPSBjcHdhdGNoZG9nLm8KLW9iai0kKENPTkZJR19XQVRDSERPR19SSU8pCQkrPSByaW93YXRjaGRvZy5vCiBvYmotJChDT05GSUdfT0JQX0ZMQVNIKQkJCSs9IGZsYXNoLm8KIG9iai0kKENPTkZJR19TVU5fT1BFTlBST01JTykJCSs9IG9wZW5wcm9tLm8KLW9iai0kKENPTkZJR19TVU5fTU9TVEVLX1JUQykJCSs9IHJ0Yy5vCi1vYmotJChDT05GSUdfU1VOX0JQUCkJCQkrPSBicHAubwotb2JqLSQoQ09ORklHX1NVTl9WSURFT1BJWCkJCSs9IHZmYy5vCiBvYmotJChDT05GSUdfVEFEUE9MRV9UUzEwMl9VQ1RSTCkJKz0gdWN0cmwubwogb2JqLSQoQ09ORklHX1NVTl9KU0ZMQVNIKQkJKz0ganNmbGFzaC5vCiBvYmotJChDT05GSUdfQkJDX0kyQykJCQkrPSBiYmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKaW5kZXggMGJkZTI2OS4uMTVkYWI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCkBAIC0xLDE1ICsxLDE1IEBACi0vKiAkSWQ6IGJiY19lbnZjdHJsLmMsdiAxLjQgMjAwMS8wNC8wNiAxNjo0ODowOCBkYXZlbSBFeHAgJAotICogYmJjX2VudmN0cmwuYzogVWx0cmFTUEFSQy1JSUkgZW52aXJvbm1lbnQgY29udHJvbCBkcml2ZXIuCisvKiBiYmNfZW52Y3RybC5jOiBVbHRyYVNQQVJDLUlJSSBlbnZpcm9ubWVudCBjb250cm9sIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2VidXMuaD4KIAogI2luY2x1ZGUgImJiY19pMmMuaCIKICNpbmNsdWRlICJtYXgxNjE3LmgiCkBAIC03NSw0MyArNzUsOCBAQAogCXsgNjUsIDU1LCA0MCwgNSwgLTUsIC0xMCB9LAogfTsKIAotZW51bSBmYW5fYWN0aW9uIHsgRkFOX1NMT1dFUiwgRkFOX1NBTUUsIEZBTl9GQVNURVIsIEZBTl9GVUxMQkxBU1QsIEZBTl9TVEFURV9NQVggfTsKLQotc3RydWN0IGJiY19jcHVfdGVtcGVyYXR1cmUgewotCXN0cnVjdCBiYmNfY3B1X3RlbXBlcmF0dXJlCSpuZXh0OwotCi0Jc3RydWN0IGJiY19pMmNfY2xpZW50CQkqY2xpZW50OwotCWludAkJCQlpbmRleDsKLQotCS8qIEN1cnJlbnQgcmVhZGluZ3MsIGFuZCBoaXN0b3J5LiAqLwotCXM4CQkJCWN1cnJfY3B1X3RlbXA7Ci0JczgJCQkJY3Vycl9hbWJfdGVtcDsKLQlzOAkJCQlwcmV2X2NwdV90ZW1wOwotCXM4CQkJCXByZXZfYW1iX3RlbXA7Ci0JczgJCQkJYXZnX2NwdV90ZW1wOwotCXM4CQkJCWF2Z19hbWJfdGVtcDsKLQotCWludAkJCQlzYW1wbGVfdGljazsKLQotCWVudW0gZmFuX2FjdGlvbgkJCWZhbl90b2RvWzJdOwotI2RlZmluZSBGQU5fQU1CSUVOVAkwCi0jZGVmaW5lIEZBTl9DUFUJCTEKLX07Ci0KLXN0cnVjdCBiYmNfY3B1X3RlbXBlcmF0dXJlICphbGxfYmJjX3RlbXBzOwotCi1zdHJ1Y3QgYmJjX2Zhbl9jb250cm9sIHsKLQlzdHJ1Y3QgYmJjX2Zhbl9jb250cm9sIAkqbmV4dDsKLQotCXN0cnVjdCBiYmNfaTJjX2NsaWVudCAJKmNsaWVudDsKLQlpbnQgCQkJaW5kZXg7Ci0KLQlpbnQJCQlwc3VwcGx5X2Zhbl9vbjsKLQlpbnQJCQljcHVfZmFuX3NwZWVkOwotCWludAkJCXN5c3RlbV9mYW5fc3BlZWQ7Ci19OwotCi1zdHJ1Y3QgYmJjX2Zhbl9jb250cm9sICphbGxfYmJjX2ZhbnM7CitzdGF0aWMgTElTVF9IRUFEKGFsbF90ZW1wcyk7CitzdGF0aWMgTElTVF9IRUFEKGFsbF9mYW5zKTsKIAogI2RlZmluZSBDUFVfRkFOX1JFRwkweGYwCiAjZGVmaW5lIFNZU19GQU5fUkVHCTB4ZjIKQEAgLTMzMCw3ICsyOTUsNyBAQAogCSAqIHJlY29tbWVuZCB3ZSBkbywgYW5kIHBlcmZvcm0gdGhhdCBhY3Rpb24gb24gYWxsIHRoZQogCSAqIGZhbnMuCiAJICovCi0JZm9yICh0cCA9IGFsbF9iYmNfdGVtcHM7IHRwOyB0cCA9IHRwLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cCwgJmFsbF90ZW1wcywgZ2xvYl9saXN0KSB7CiAJCWlmICh0cC0+ZmFuX3RvZG9bd2hpY2hfZmFuXSA9PSBGQU5fRlVMTEJMQVNUKSB7CiAJCQlkZWNpc2lvbiA9IEZBTl9GVUxMQkxBU1Q7CiAJCQlicmVhazsKQEAgLTQzOSw3ICs0MDQsNyBAQAogCS8qIFNpbmNlIHdlIHdpbGwgbm90IGJlIG1vbml0b3JpbmcgdGhpbmdzIGFueW1vcmUsIHB1dAogCSAqIHRoZSBmYW5zIG9uIGZ1bGwgYmxhc3QuCiAJICovCi0JZm9yIChmcCA9IGFsbF9iYmNfZmFuczsgZnA7IGZwID0gZnAtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmYWxsX2ZhbnMsIGdsb2JfbGlzdCkgewogCQlmcC0+Y3B1X2Zhbl9zcGVlZCA9IEZBTl9TUEVFRF9NQVg7CiAJCWZwLT5zeXN0ZW1fZmFuX3NwZWVkID0gRkFOX1NQRUVEX01BWDsKIAkJZnAtPnBzdXBwbHlfZmFuX29uID0gMTsKQEAgLTQ2MywxMSArNDI4LDExIEBACiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAotCQlmb3IgKHRwID0gYWxsX2JiY190ZW1wczsgdHA7IHRwID0gdHAtPm5leHQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cCwgJmFsbF90ZW1wcywgZ2xvYl9saXN0KSB7CiAJCQlnZXRfY3VycmVudF90ZW1wcyh0cCk7CiAJCQlhbmFseXplX3RlbXBzKHRwLCAmbGFzdF93YXJuaW5nX2ppZmZpZXMpOwogCQl9Ci0JCWZvciAoZnAgPSBhbGxfYmJjX2ZhbnM7IGZwOyBmcCA9IGZwLT5uZXh0KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmYWxsX2ZhbnMsIGdsb2JfbGlzdCkKIAkJCW1heWJlX25ld19mYW5fc3BlZWRzKGZwKTsKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyAiYmJjX2VudmN0cmw6IGtlbnZjdHJsZCBleGl0aW5nLi4uXG4iKTsKQEAgLTQ3Nyw3ICs0NDIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdHRhY2hfb25lX3RlbXAoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmVjaGlsZCwgaW50IHRlbXBfaWR4KQorc3RhdGljIHZvaWQgYXR0YWNoX29uZV90ZW1wKHN0cnVjdCBiYmNfaTJjX2J1cyAqYnAsIHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJICAgIGludCB0ZW1wX2lkeCkKIHsKIAlzdHJ1Y3QgYmJjX2NwdV90ZW1wZXJhdHVyZSAqdHA7CiAKQEAgLTQ4NSwyMCArNDUxLDE3IEBACiAJaWYgKCF0cCkKIAkJcmV0dXJuOwogCi0JdHAtPmNsaWVudCA9IGJiY19pMmNfYXR0YWNoKGVjaGlsZCk7CisJdHAtPmNsaWVudCA9IGJiY19pMmNfYXR0YWNoKGJwLCBvcCk7CiAJaWYgKCF0cC0+Y2xpZW50KSB7CiAJCWtmcmVlKHRwKTsKIAkJcmV0dXJuOwogCX0KIAorCiAJdHAtPmluZGV4ID0gdGVtcF9pZHg7Ci0JewotCQlzdHJ1Y3QgYmJjX2NwdV90ZW1wZXJhdHVyZSAqKnRwcCA9ICZhbGxfYmJjX3RlbXBzOwotCQl3aGlsZSAoKnRwcCkKLQkJCXRwcCA9ICYoKCp0cHApLT5uZXh0KTsKLQkJdHAtPm5leHQgPSBOVUxMOwotCQkqdHBwID0gdHA7Ci0JfQorCisJbGlzdF9hZGQoJnRwLT5nbG9iX2xpc3QsICZhbGxfdGVtcHMpOworCWxpc3RfYWRkKCZ0cC0+YnBfbGlzdCwgJmJwLT50ZW1wcyk7CiAKIAkvKiBUZWxsIGl0IHRvIGNvbnZlcnQgb25jZSBldmVyeSA1IHNlY29uZHMsIGNsZWFyIGFsbCBjZmcKIAkgKiBiaXRzLgpAQCAtNTI0LDcgKzQ4Nyw4IEBACiAJdHAtPmZhbl90b2RvW0ZBTl9DUFVdID0gRkFOX1NBTUU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0dGFjaF9vbmVfZmFuKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplY2hpbGQsIGludCBmYW5faWR4KQorc3RhdGljIHZvaWQgYXR0YWNoX29uZV9mYW4oc3RydWN0IGJiY19pMmNfYnVzICpicCwgc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkgICBpbnQgZmFuX2lkeCkKIHsKIAlzdHJ1Y3QgYmJjX2Zhbl9jb250cm9sICpmcDsKIApAQCAtNTMyLDcgKzQ5Niw3IEBACiAJaWYgKCFmcCkKIAkJcmV0dXJuOwogCi0JZnAtPmNsaWVudCA9IGJiY19pMmNfYXR0YWNoKGVjaGlsZCk7CisJZnAtPmNsaWVudCA9IGJiY19pMmNfYXR0YWNoKGJwLCBvcCk7CiAJaWYgKCFmcC0+Y2xpZW50KSB7CiAJCWtmcmVlKGZwKTsKIAkJcmV0dXJuOwpAQCAtNTQwLDEzICs1MDQsOCBAQAogCiAJZnAtPmluZGV4ID0gZmFuX2lkeDsKIAotCXsKLQkJc3RydWN0IGJiY19mYW5fY29udHJvbCAqKmZwcCA9ICZhbGxfYmJjX2ZhbnM7Ci0JCXdoaWxlICgqZnBwKQotCQkJZnBwID0gJigoKmZwcCktPm5leHQpOwotCQlmcC0+bmV4dCA9IE5VTEw7Ci0JCSpmcHAgPSBmcDsKLQl9CisJbGlzdF9hZGQoJmZwLT5nbG9iX2xpc3QsICZhbGxfZmFucyk7CisJbGlzdF9hZGQoJmZwLT5icF9saXN0LCAmYnAtPmZhbnMpOwogCiAJLyogVGhlIGkyYyBkZXZpY2UgY29udHJvbGxpbmcgdGhlIGZhbnMgaXMgd3JpdGUtb25seS4KIAkgKiBTbyB0aGUgb25seSB3YXkgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBwb3dlcgpAQCAtNTYzLDE4ICs1MjIsMTggQEAKIAlzZXRfZmFuX3NwZWVkcyhmcCk7CiB9CiAKLWludCBiYmNfZW52Y3RybF9pbml0KHZvaWQpCitpbnQgYmJjX2VudmN0cmxfaW5pdChzdHJ1Y3QgYmJjX2kyY19idXMgKmJwKQogewotCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplY2hpbGQ7CisJc3RydWN0IG9mX2RldmljZSAqb3A7CiAJaW50IHRlbXBfaW5kZXggPSAwOwogCWludCBmYW5faW5kZXggPSAwOwogCWludCBkZXZpZHggPSAwOwogCi0Jd2hpbGUgKChlY2hpbGQgPSBiYmNfaTJjX2dldGRldihkZXZpZHgrKykpICE9IE5VTEwpIHsKLQkJaWYgKCFzdHJjbXAoZWNoaWxkLT5wcm9tX25vZGUtPm5hbWUsICJ0ZW1wZXJhdHVyZSIpKQotCQkJYXR0YWNoX29uZV90ZW1wKGVjaGlsZCwgdGVtcF9pbmRleCsrKTsKLQkJaWYgKCFzdHJjbXAoZWNoaWxkLT5wcm9tX25vZGUtPm5hbWUsICJmYW4tY29udHJvbCIpKQotCQkJYXR0YWNoX29uZV9mYW4oZWNoaWxkLCBmYW5faW5kZXgrKyk7CisJd2hpbGUgKChvcCA9IGJiY19pMmNfZ2V0ZGV2KGJwLCBkZXZpZHgrKykpICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJjbXAob3AtPm5vZGUtPm5hbWUsICJ0ZW1wZXJhdHVyZSIpKQorCQkJYXR0YWNoX29uZV90ZW1wKGJwLCBvcCwgdGVtcF9pbmRleCsrKTsKKwkJaWYgKCFzdHJjbXAob3AtPm5vZGUtPm5hbWUsICJmYW4tY29udHJvbCIpKQorCQkJYXR0YWNoX29uZV9mYW4oYnAsIG9wLCBmYW5faW5kZXgrKyk7CiAJfQogCWlmICh0ZW1wX2luZGV4ICE9IDAgJiYgZmFuX2luZGV4ICE9IDApIHsKIAkJa2VudmN0cmxkX3Rhc2sgPSBrdGhyZWFkX3J1bihrZW52Y3RybGQsIE5VTEwsICJrZW52Y3RybGQiKTsKQEAgLTU5NywyNiArNTU2LDIyIEBACiAJa2ZyZWUoZnApOwogfQogCi12b2lkIGJiY19lbnZjdHJsX2NsZWFudXAodm9pZCkKK3ZvaWQgYmJjX2VudmN0cmxfY2xlYW51cChzdHJ1Y3QgYmJjX2kyY19idXMgKmJwKQogewotCXN0cnVjdCBiYmNfY3B1X3RlbXBlcmF0dXJlICp0cDsKLQlzdHJ1Y3QgYmJjX2Zhbl9jb250cm9sICpmcDsKKwlzdHJ1Y3QgYmJjX2NwdV90ZW1wZXJhdHVyZSAqdHAsICp0cG9zOworCXN0cnVjdCBiYmNfZmFuX2NvbnRyb2wgKmZwLCAqZnBvczsKIAogCWt0aHJlYWRfc3RvcChrZW52Y3RybGRfdGFzayk7CiAKLQl0cCA9IGFsbF9iYmNfdGVtcHM7Ci0Jd2hpbGUgKHRwICE9IE5VTEwpIHsKLQkJc3RydWN0IGJiY19jcHVfdGVtcGVyYXR1cmUgKm5leHQgPSB0cC0+bmV4dDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHAsIHRwb3MsICZicC0+dGVtcHMsIGJwX2xpc3QpIHsKKwkJbGlzdF9kZWwoJnRwLT5icF9saXN0KTsKKwkJbGlzdF9kZWwoJnRwLT5nbG9iX2xpc3QpOwogCQlkZXN0cm95X29uZV90ZW1wKHRwKTsKLQkJdHAgPSBuZXh0OwogCX0KLQlhbGxfYmJjX3RlbXBzID0gTlVMTDsKIAotCWZwID0gYWxsX2JiY19mYW5zOwotCXdoaWxlIChmcCAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBiYmNfZmFuX2NvbnRyb2wgKm5leHQgPSBmcC0+bmV4dDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZnAsIGZwb3MsICZicC0+ZmFucywgYnBfbGlzdCkgeworCQlsaXN0X2RlbCgmZnAtPmJwX2xpc3QpOworCQlsaXN0X2RlbCgmZnAtPmdsb2JfbGlzdCk7CiAJCWRlc3Ryb3lfb25lX2ZhbihmcCk7Ci0JCWZwID0gbmV4dDsKIAl9Ci0JYWxsX2JiY19mYW5zID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYwppbmRleCBhYzhlZjJjLi5mMDhlMTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jCkBAIC0xLDggKzEsNyBAQAotLyogJElkOiBiYmNfaTJjLmMsdiAxLjIgMjAwMS8wNC8wMiAwOTo1OTowOCBkYXZlbSBFeHAgJAotICogYmJjX2kyYy5jOiBJMkMgbG93LWxldmVsIGRyaXZlciBmb3IgQkJDIGRldmljZSBvbiBVbHRyYVNQQVJDLUlJSQorLyogYmJjX2kyYy5jOiBJMkMgbG93LWxldmVsIGRyaXZlciBmb3IgQkJDIGRldmljZSBvbiBVbHRyYVNQQVJDLUlJSQogICogICAgICAgICAgICBwbGF0Zm9ybXMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwOCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTQsOSArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9lYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vYmJjLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTUzLDU0ICs1MSwxMiBAQAogICogVGhlIHNlY29uZCBjb250cm9sbGVyIGFsc28gY29ubmVjdHMgdG8gdGhlIHNtYXJ0Y2FyZCByZWFkZXIsIGlmIHByZXNlbnQuCiAgKi8KIAotI2RlZmluZSBOVU1fQ0hJTERSRU4JOAotc3RydWN0IGJiY19pMmNfYnVzIHsKLQlzdHJ1Y3QgYmJjX2kyY19idXMJCSpuZXh0OwotCWludAkJCQlpbmRleDsKLQlzcGlubG9ja190CQkJbG9jazsKLQl2b2lkCQkJCV9faW9tZW0gKmkyY19idXNzZWxfcmVnOwotCXZvaWQJCQkJX19pb21lbSAqaTJjX2NvbnRyb2xfcmVnczsKLQl1bnNpZ25lZCBjaGFyCQkJb3duLCBjbG9jazsKLQotCXdhaXRfcXVldWVfaGVhZF90CQl3cTsKLQl2b2xhdGlsZSBpbnQJCQl3YWl0aW5nOwotCi0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpidXNfZWRldjsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZAkqZGV2aWNlOwotCQlpbnQJCQljbGllbnRfY2xhaW1lZDsKLQl9IGRldnNbTlVNX0NISUxEUkVOXTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmJjX2kyY19idXMgKmFsbF9iYmNfaTJjOwotCi1zdHJ1Y3QgYmJjX2kyY19jbGllbnQgewotCXN0cnVjdCBiYmNfaTJjX2J1cwkqYnA7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQJKmVjaGlsZDsKLQlpbnQJCQlidXM7Ci0JaW50CQkJYWRkcmVzczsKLX07Ci0KLXN0YXRpYyBpbnQgZmluZF9kZXZpY2Uoc3RydWN0IGJiY19pMmNfYnVzICpicCwgc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmVjaGlsZCkKK3N0YXRpYyB2b2lkIHNldF9kZXZpY2VfY2xhaW1hZ2Uoc3RydWN0IGJiY19pMmNfYnVzICpicCwgc3RydWN0IG9mX2RldmljZSAqb3AsIGludCB2YWwpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0NISUxEUkVOOyBpKyspIHsKLQkJaWYgKGJwLT5kZXZzW2ldLmRldmljZSA9PSBlY2hpbGQpIHsKLQkJCWlmIChicC0+ZGV2c1tpXS5jbGllbnRfY2xhaW1lZCkKLQkJCQlyZXR1cm4gMDsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZGV2aWNlX2NsYWltYWdlKHN0cnVjdCBiYmNfaTJjX2J1cyAqYnAsIHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplY2hpbGQsIGludCB2YWwpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NISUxEUkVOOyBpKyspIHsKLQkJaWYgKGJwLT5kZXZzW2ldLmRldmljZSA9PSBlY2hpbGQpIHsKKwkJaWYgKGJwLT5kZXZzW2ldLmRldmljZSA9PSBvcCkgewogCQkJYnAtPmRldnNbaV0uY2xpZW50X2NsYWltZWQgPSB2YWw7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTExMCw2MSArNjYsNDcgQEAKICNkZWZpbmUgY2xhaW1fZGV2aWNlKEJQLEVDSElMRCkJCXNldF9kZXZpY2VfY2xhaW1hZ2UoQlAsRUNISUxELDEpCiAjZGVmaW5lIHJlbGVhc2VfZGV2aWNlKEJQLEVDSElMRCkJc2V0X2RldmljZV9jbGFpbWFnZShCUCxFQ0hJTEQsMCkKIAotc3RhdGljIHN0cnVjdCBiYmNfaTJjX2J1cyAqZmluZF9idXNfZm9yX2RldmljZShzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqZWNoaWxkKQorc3RydWN0IG9mX2RldmljZSAqYmJjX2kyY19nZXRkZXYoc3RydWN0IGJiY19pMmNfYnVzICpicCwgaW50IGluZGV4KQogewotCXN0cnVjdCBiYmNfaTJjX2J1cyAqYnAgPSBhbGxfYmJjX2kyYzsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IE5VTEw7CisJaW50IGN1cmlkeCA9IDAsIGk7CiAKLQl3aGlsZSAoYnAgIT0gTlVMTCkgewotCQlpZiAoZmluZF9kZXZpY2UoYnAsIGVjaGlsZCkgIT0gMCkKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NISUxEUkVOOyBpKyspIHsKKwkJaWYgKCEob3AgPSBicC0+ZGV2c1tpXS5kZXZpY2UpKQogCQkJYnJlYWs7Ci0JCWJwID0gYnAtPm5leHQ7CisJCWlmIChjdXJpZHggPT0gaW5kZXgpCisJCQlnb3RvIG91dDsKKwkJb3AgPSBOVUxMOworCQljdXJpZHgrKzsKIAl9CiAKLQlyZXR1cm4gYnA7Ci19Ci0KLXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICpiYmNfaTJjX2dldGRldihpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGJiY19pMmNfYnVzICpicCA9IGFsbF9iYmNfaTJjOwotCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplY2hpbGQgPSBOVUxMOwotCWludCBjdXJpZHggPSAwOwotCi0Jd2hpbGUgKGJwICE9IE5VTEwpIHsKLQkJc3RydWN0IGJiY19pMmNfYnVzICpuZXh0ID0gYnAtPm5leHQ7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hJTERSRU47IGkrKykgewotCQkJaWYgKCEoZWNoaWxkID0gYnAtPmRldnNbaV0uZGV2aWNlKSkKLQkJCQlicmVhazsKLQkJCWlmIChjdXJpZHggPT0gaW5kZXgpCi0JCQkJZ290byBvdXQ7Ci0JCQllY2hpbGQgPSBOVUxMOwotCQkJY3VyaWR4Kys7Ci0JCX0KLQkJYnAgPSBuZXh0OwotCX0KIG91dDoKIAlpZiAoY3VyaWR4ID09IGluZGV4KQotCQlyZXR1cm4gZWNoaWxkOworCQlyZXR1cm4gb3A7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBiYmNfaTJjX2NsaWVudCAqYmJjX2kyY19hdHRhY2goc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmVjaGlsZCkKK3N0cnVjdCBiYmNfaTJjX2NsaWVudCAqYmJjX2kyY19hdHRhY2goc3RydWN0IGJiY19pMmNfYnVzICpicCwgc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGJiY19pMmNfYnVzICpicCA9IGZpbmRfYnVzX2Zvcl9kZXZpY2UoZWNoaWxkKTsKIAlzdHJ1Y3QgYmJjX2kyY19jbGllbnQgKmNsaWVudDsKKwljb25zdCB1MzIgKnJlZzsKIAotCWlmICghYnApCi0JCXJldHVybiBOVUxMOwogCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsaWVudCkKIAkJcmV0dXJuIE5VTEw7CiAJY2xpZW50LT5icCA9IGJwOwotCWNsaWVudC0+ZWNoaWxkID0gZWNoaWxkOwotCWNsaWVudC0+YnVzID0gZWNoaWxkLT5yZXNvdXJjZVswXS5zdGFydDsKLQljbGllbnQtPmFkZHJlc3MgPSBlY2hpbGQtPnJlc291cmNlWzFdLnN0YXJ0OworCWNsaWVudC0+b3AgPSBvcDsKIAotCWNsYWltX2RldmljZShicCwgZWNoaWxkKTsKKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZykgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljbGllbnQtPmJ1cyA9IHJlZ1swXTsKKwljbGllbnQtPmFkZHJlc3MgPSByZWdbMV07CisKKwljbGFpbV9kZXZpY2UoYnAsIG9wKTsKIAogCXJldHVybiBjbGllbnQ7CiB9CkBAIC0xNzIsOSArMTE0LDkgQEAKIHZvaWQgYmJjX2kyY19kZXRhY2goc3RydWN0IGJiY19pMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGJiY19pMmNfYnVzICpicCA9IGNsaWVudC0+YnA7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmVjaGlsZCA9IGNsaWVudC0+ZWNoaWxkOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gY2xpZW50LT5vcDsKIAotCXJlbGVhc2VfZGV2aWNlKGJwLCBlY2hpbGQpOworCXJlbGVhc2VfZGV2aWNlKGJwLCBvcCk7CiAJa2ZyZWUoY2xpZW50KTsKIH0KIApAQCAtMzU1LDQ0ICsyOTcsNDMgQEAKIAl3cml0ZWIoSTJDX1BDRl9JRExFLCBicC0+aTJjX2NvbnRyb2xfcmVncyArIDB4MCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9vbmVfaTJjKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiwgaW50IGluZGV4KQorc3RhdGljIHN0cnVjdCBiYmNfaTJjX2J1cyAqIF9faW5pdCBhdHRhY2hfb25lX2kyYyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgaW50IGluZGV4KQogewogCXN0cnVjdCBiYmNfaTJjX2J1cyAqYnA7Ci0Jc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmVjaGlsZDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCWludCBlbnRyeTsKIAogCWJwID0ga3phbGxvYyhzaXplb2YoKmJwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFicCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBOVUxMOwogCi0JYnAtPmkyY19jb250cm9sX3JlZ3MgPSBpb3JlbWFwKGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAweDIpOworCWJwLT5pMmNfY29udHJvbF9yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLCAweDIsICJiYmNfaTJjX3JlZ3MiKTsKIAlpZiAoIWJwLT5pMmNfY29udHJvbF9yZWdzKQogCQlnb3RvIGZhaWw7CiAKLQlpZiAoZWRldi0+bnVtX2FkZHJzID09IDIpIHsKLQkJYnAtPmkyY19idXNzZWxfcmVnID0gaW9yZW1hcChlZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgMHgxKTsKLQkJaWYgKCFicC0+aTJjX2J1c3NlbF9yZWcpCi0JCQlnb3RvIGZhaWw7Ci0JfQorCWJwLT5pMmNfYnVzc2VsX3JlZyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsxXSwgMCwgMHgxLCAiYmJjX2kyY19idXNzZWwiKTsKKwlpZiAoIWJwLT5pMmNfYnVzc2VsX3JlZykKKwkJZ290byBmYWlsOwogCiAJYnAtPndhaXRpbmcgPSAwOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJwLT53cSk7Ci0JaWYgKHJlcXVlc3RfaXJxKGVkZXYtPmlycXNbMF0sIGJiY19pMmNfaW50ZXJydXB0LAorCWlmIChyZXF1ZXN0X2lycShvcC0+aXJxc1swXSwgYmJjX2kyY19pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgImJiY19pMmMiLCBicCkpCiAJCWdvdG8gZmFpbDsKIAogCWJwLT5pbmRleCA9IGluZGV4OwotCWJwLT5idXNfZWRldiA9IGVkZXY7CisJYnAtPm9wID0gb3A7CiAKIAlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOwotCWJwLT5uZXh0ID0gYWxsX2JiY19pMmM7Ci0JYWxsX2JiY19pMmMgPSBicDsKIAogCWVudHJ5ID0gMDsKLQlmb3IgKGVjaGlsZCA9IGVkZXYtPmNoaWxkcmVuOwotCSAgICAgZWNoaWxkICYmIGVudHJ5IDwgODsKLQkgICAgIGVjaGlsZCA9IGVjaGlsZC0+bmV4dCwgZW50cnkrKykgewotCQlicC0+ZGV2c1tlbnRyeV0uZGV2aWNlID0gZWNoaWxkOworCWZvciAoZHAgPSBvcC0+bm9kZS0+Y2hpbGQ7CisJICAgICBkcCAmJiBlbnRyeSA8IDg7CisJICAgICBkcCA9IGRwLT5zaWJsaW5nLCBlbnRyeSsrKSB7CisJCXN0cnVjdCBvZl9kZXZpY2UgKmNoaWxkX29wOworCisJCWNoaWxkX29wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkcCk7CisJCWJwLT5kZXZzW2VudHJ5XS5kZXZpY2UgPSBjaGlsZF9vcDsKIAkJYnAtPmRldnNbZW50cnldLmNsaWVudF9jbGFpbWVkID0gMDsKIAl9CiAKQEAgLTQwNiw4NiArMzQ3LDkwIEBACiAKIAlyZXNldF9vbmVfaTJjKGJwKTsKIAotCXJldHVybiAwOworCXJldHVybiBicDsKIAogZmFpbDoKIAlpZiAoYnAtPmkyY19idXNzZWxfcmVnKQotCQlpb3VubWFwKGJwLT5pMmNfYnVzc2VsX3JlZyk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgYnAtPmkyY19idXNzZWxfcmVnLCAxKTsKIAlpZiAoYnAtPmkyY19jb250cm9sX3JlZ3MpCi0JCWlvdW5tYXAoYnAtPmkyY19jb250cm9sX3JlZ3MpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGJwLT5pMmNfY29udHJvbF9yZWdzLCAyKTsKIAlrZnJlZShicCk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGJiY19wcmVzZW50KHZvaWQpCitleHRlcm4gaW50IGJiY19lbnZjdHJsX2luaXQoc3RydWN0IGJiY19pMmNfYnVzICpicCk7CitleHRlcm4gdm9pZCBiYmNfZW52Y3RybF9jbGVhbnVwKHN0cnVjdCBiYmNfaTJjX2J1cyAqYnApOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiYmNfaTJjX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBsaW51eF9lYnVzICplYnVzID0gTlVMTDsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSBOVUxMOwotCi0JZm9yX2VhY2hfZWJ1cyhlYnVzKSB7Ci0JCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiYmJjIikpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbnQgYmJjX2VudmN0cmxfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJiY19lbnZjdHJsX2NsZWFudXAodm9pZCk7Ci1zdGF0aWMgdm9pZCBiYmNfaTJjX2NsZWFudXAodm9pZCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJiY19pMmNfaW5pdCh2b2lkKQotewotCXN0cnVjdCBsaW51eF9lYnVzICplYnVzID0gTlVMTDsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSBOVUxMOworCXN0cnVjdCBiYmNfaTJjX2J1cyAqYnA7CiAJaW50IGVyciwgaW5kZXggPSAwOwogCi0JaWYgKCh0bGJfdHlwZSAhPSBjaGVldGFoICYmIHRsYl90eXBlICE9IGNoZWV0YWhfcGx1cykgfHwKLQkgICAgIWJiY19wcmVzZW50KCkpCi0JCXJldHVybiAtRU5PREVWOworCWJwID0gYXR0YWNoX29uZV9pMmMob3AsIGluZGV4KTsKKwlpZiAoIWJwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImkyYyIpKSB7Ci0JCQkJaWYgKCFhdHRhY2hfb25lX2kyYyhlZGV2LCBpbmRleCkpCi0JCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KKwllcnIgPSBiYmNfZW52Y3RybF9pbml0KGJwKTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfaXJxKG9wLT5pcnFzWzBdLCBicCk7CisJCWlmIChicC0+aTJjX2J1c3NlbF9yZWcpCisJCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGJwLT5pMmNfYnVzc2VsX3JlZywgMSk7CisJCWlmIChicC0+aTJjX2NvbnRyb2xfcmVncykKKwkJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgYnAtPmkyY19jb250cm9sX3JlZ3MsIDIpOworCQlrZnJlZShicCk7CisJfSBlbHNlIHsKKwkJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBicCk7CiAJfQogCi0JaWYgKCFpbmRleCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllcnIgPSBiYmNfZW52Y3RybF9pbml0KCk7Ci0JaWYgKGVycikKLQkJYmJjX2kyY19jbGVhbnVwKCk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgYmJjX2kyY19jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiYmNfaTJjX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3QgYmJjX2kyY19idXMgKmJwID0gYWxsX2JiY19pMmM7CisJc3RydWN0IGJiY19pMmNfYnVzICpicCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CiAKLQliYmNfZW52Y3RybF9jbGVhbnVwKCk7CisJYmJjX2VudmN0cmxfY2xlYW51cChicCk7CiAKLQl3aGlsZSAoYnAgIT0gTlVMTCkgewotCQlzdHJ1Y3QgYmJjX2kyY19idXMgKm5leHQgPSBicC0+bmV4dDsKKwlmcmVlX2lycShvcC0+aXJxc1swXSwgYnApOwogCi0JCWZyZWVfaXJxKGJwLT5idXNfZWRldi0+aXJxc1swXSwgYnApOworCWlmIChicC0+aTJjX2J1c3NlbF9yZWcpCisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYnAtPmkyY19idXNzZWxfcmVnLCAxKTsKKwlpZiAoYnAtPmkyY19jb250cm9sX3JlZ3MpCisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgYnAtPmkyY19jb250cm9sX3JlZ3MsIDIpOwogCi0JCWlmIChicC0+aTJjX2J1c3NlbF9yZWcpCi0JCQlpb3VubWFwKGJwLT5pMmNfYnVzc2VsX3JlZyk7Ci0JCWlmIChicC0+aTJjX2NvbnRyb2xfcmVncykKLQkJCWlvdW5tYXAoYnAtPmkyY19jb250cm9sX3JlZ3MpOworCWtmcmVlKGJwKTsKIAotCQlrZnJlZShicCk7CisJcmV0dXJuIDA7Cit9CiAKLQkJYnAgPSBuZXh0OwotCX0KLQlhbGxfYmJjX2kyYyA9IE5VTEw7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiYmNfaTJjX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJpMmMiLAorCQkuY29tcGF0aWJsZSA9ICJTVU5XLGJiYy1pMmMiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYmJjX2kyY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGJiY19pMmNfZHJpdmVyID0geworCS5uYW1lCQk9ICJiYmNfaTJjIiwKKwkubWF0Y2hfdGFibGUJPSBiYmNfaTJjX21hdGNoLAorCS5wcm9iZQkJPSBiYmNfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmJjX2kyY19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmJjX2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYmJjX2kyY19kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiYmNfaTJjX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmYmJjX2kyY19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChiYmNfaTJjX2luaXQpOwotbW9kdWxlX2V4aXQoYmJjX2kyY19jbGVhbnVwKTsKK21vZHVsZV9leGl0KGJiY19pMmNfZXhpdCk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuaCBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuaAppbmRleCBmYjAxYmQxLi44M2M0ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmgKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5oCkBAIC0xLDE0ICsxLDc5IEBACi0vKiAkSWQ6IGJiY19pMmMuaCx2IDEuMiAyMDAxLzA0LzAyIDA5OjU5OjI1IGRhdmVtIEV4cCAkICovCiAjaWZuZGVmIF9CQkNfSTJDX0gKICNkZWZpbmUgX0JCQ19JMkNfSAogCi0jaW5jbHVkZSA8YXNtL2VidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotc3RydWN0IGJiY19pMmNfY2xpZW50Oworc3RydWN0IGJiY19pMmNfY2xpZW50IHsKKwlzdHJ1Y3QgYmJjX2kyY19idXMJCSpicDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCQkqb3A7CisJaW50CQkJCWJ1czsKKwlpbnQJCQkJYWRkcmVzczsKK307CisKK2VudW0gZmFuX2FjdGlvbiB7IEZBTl9TTE9XRVIsIEZBTl9TQU1FLCBGQU5fRkFTVEVSLCBGQU5fRlVMTEJMQVNULCBGQU5fU1RBVEVfTUFYIH07CisKK3N0cnVjdCBiYmNfY3B1X3RlbXBlcmF0dXJlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlicF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCWdsb2JfbGlzdDsKKworCXN0cnVjdCBiYmNfaTJjX2NsaWVudAkJKmNsaWVudDsKKwlpbnQJCQkJaW5kZXg7CisKKwkvKiBDdXJyZW50IHJlYWRpbmdzLCBhbmQgaGlzdG9yeS4gKi8KKwlzOAkJCQljdXJyX2NwdV90ZW1wOworCXM4CQkJCWN1cnJfYW1iX3RlbXA7CisJczgJCQkJcHJldl9jcHVfdGVtcDsKKwlzOAkJCQlwcmV2X2FtYl90ZW1wOworCXM4CQkJCWF2Z19jcHVfdGVtcDsKKwlzOAkJCQlhdmdfYW1iX3RlbXA7CisKKwlpbnQJCQkJc2FtcGxlX3RpY2s7CisKKwllbnVtIGZhbl9hY3Rpb24JCQlmYW5fdG9kb1syXTsKKyNkZWZpbmUgRkFOX0FNQklFTlQJMAorI2RlZmluZSBGQU5fQ1BVCQkxCit9OworCitzdHJ1Y3QgYmJjX2Zhbl9jb250cm9sIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlicF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCWdsb2JfbGlzdDsKKworCXN0cnVjdCBiYmNfaTJjX2NsaWVudCAJCSpjbGllbnQ7CisJaW50IAkJCQlpbmRleDsKKworCWludAkJCQlwc3VwcGx5X2Zhbl9vbjsKKwlpbnQJCQkJY3B1X2Zhbl9zcGVlZDsKKwlpbnQJCQkJc3lzdGVtX2Zhbl9zcGVlZDsKK307CisKKyNkZWZpbmUgTlVNX0NISUxEUkVOCTgKKworc3RydWN0IGJiY19pMmNfYnVzIHsKKwlzdHJ1Y3QgYmJjX2kyY19idXMJCSpuZXh0OworCWludAkJCQlpbmRleDsKKwlzcGlubG9ja190CQkJbG9jazsKKwl2b2lkCQkJCV9faW9tZW0gKmkyY19idXNzZWxfcmVnOworCXZvaWQJCQkJX19pb21lbSAqaTJjX2NvbnRyb2xfcmVnczsKKwl1bnNpZ25lZCBjaGFyCQkJb3duLCBjbG9jazsKKworCXdhaXRfcXVldWVfaGVhZF90CQl3cTsKKwl2b2xhdGlsZSBpbnQJCQl3YWl0aW5nOworCisJc3RydWN0IGxpc3RfaGVhZAkJdGVtcHM7CisJc3RydWN0IGxpc3RfaGVhZAkJZmFuczsKKworCXN0cnVjdCBvZl9kZXZpY2UJCSpvcDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgb2ZfZGV2aWNlCSpkZXZpY2U7CisJCWludAkJCWNsaWVudF9jbGFpbWVkOworCX0gZGV2c1tOVU1fQ0hJTERSRU5dOworfTsKIAogLyogUHJvYmluZyBhbmQgYXR0YWNobWVudC4gKi8KLWV4dGVybiBzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqYmJjX2kyY19nZXRkZXYoaW50KTsKLWV4dGVybiBzdHJ1Y3QgYmJjX2kyY19jbGllbnQgKmJiY19pMmNfYXR0YWNoKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICopOworZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKmJiY19pMmNfZ2V0ZGV2KHN0cnVjdCBiYmNfaTJjX2J1cyAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBiYmNfaTJjX2NsaWVudCAqYmJjX2kyY19hdHRhY2goc3RydWN0IGJiY19pMmNfYnVzICpicCwgc3RydWN0IG9mX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGJiY19pMmNfZGV0YWNoKHN0cnVjdCBiYmNfaTJjX2NsaWVudCAqKTsKIAogLyogUmVnaXN0ZXIgcmVhZC93cml0ZS4gIE5PVEU6IEJsb2NraW5nISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMgYi9kcml2ZXJzL3NidXMvY2hhci9icHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhMjFlMDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU1ICswLDAgQEAKLS8qCi0gKiBkcml2ZXJzL3NidXMvY2hhci9icHAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NSBQaWN0dXJlIEVsZW1lbnRzCi0gKiAgICAgIFN0ZXBoZW4gV2lsbGlhbXMgKHN0ZXZlQGljYXJ1cy5jb20pCi0gKiAgICAgIEd1cyBCYWxkYXVmIChnYmFsZGF1ZkBpeC5uZXRjb20uY29tKQotICoKLSAqIExpbnV4L1NQQVJDIHBvcnQgYnkgUGV0ZXIgWmFpdGNldi4KLSAqIEludGVncmF0aW9uIGludG8gU1BBUkMgdHJlZSBieSBUb20gRHlhcy4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmIGRlZmluZWQoX19pMzg2X18pCi0jIGluY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX3NwYXJjX18pCi0jIGluY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSMgaW5jbHVkZSA8bGludXgvZGVsYXkuaD4gICAgICAgICAvKiB1ZGVsYXkoKSAqLwotCi0jIGluY2x1ZGUgPGFzbS9vcGxpYi5oPiAgICAgICAgICAgLyogT3BlblByb20gTGlicmFyeSAqLwotIyBpbmNsdWRlIDxhc20vc2J1cy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20vYnBwLmg+Ci0KLSNkZWZpbmUgQlBQX1BST0JFX0NPREUgMHg1NQotI2RlZmluZSBCUFBfREVMQVkgMTAwCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCAgQlBQX01BSk9SID0gTFBfTUFKT1I7Ci1zdGF0aWMgY29uc3QgY2hhciAqYnBwX2Rldl9uYW1lID0gImJwcCI7Ci0KLS8qIFdoZW4gc3dpdGNoaW5nIGZyb20gY29tcGF0aWJpbGl0eSB0byBhIG1vZGUgd2hlcmUgSSBjYW4gcmVhZCwgdHJ5Ci0gICB0aGUgZm9sbG93aW5nIG1vZGUgZmlyc3QuICovCi0KLS8qIGNvbnN0IHVuc2lnbmVkIGNoYXIgREVGQVVMVF9FQ1AgPSAweDEwOyAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgREVGQVVMVF9FQ1AgPSAweDMwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgREVGQVVMVF9OSUJCTEUgPSAweDAwOwotCi0vKgotICogVGhlc2UgYXJlIDEyODQgdGltZSBjb25zdHJhaW50cywgaW4gdW5pdHMgb2YgamlmZmllcy4KLSAqLwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBUSU1FX1BTZXR1cCA9IDE7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBUSU1FX1BSZXNwb25zZSA9IDY7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBUSU1FX0lETEVfTElNSVQgPSAyMDAwOwotCi0vKgotICogT25lIGluc3RhbmNlIHBlciBzdXBwb3J0ZWQgc3ViZGV2aWNlLi4uCi0gKi8KLSMgZGVmaW5lIEJQUF9OTyAzCi0KLWVudW0gSUVFRV9Nb2RlIHsgQ09NUEFUSUJJTElUWSwgTklCQkxFLCBFQ1AsIEVDUF9STEUsIEVQUCB9OwotCi1zdHJ1Y3QgaW5zdCB7Ci0gICAgICB1bnNpZ25lZCBwcmVzZW50ICA6IDE7IC8qIFRydWUgaWYgdGhlIGhhcmR3YXJlIGV4aXN0cyAqLwotICAgICAgdW5zaWduZWQgZW5oYW5jZWQgOiAxOyAvKiBUcnVlIGlmIHRoZSBoYXJkd2FyZSBpbiAiZW5oYW5jZWQiICovCi0gICAgICB1bnNpZ25lZCBvcGVuZWQgICA6IDE7IC8qIFRydWUgaWYgdGhlIGRldmljZSBpcyBvcGVuZWQgYWxyZWFkeSAqLwotICAgICAgdW5zaWduZWQgcnVuX2ZsYWcgOiAxOyAvKiBUcnVlIGlmIHdhaXRpbmcgZm9yIGEgcmVwZWF0ZSBieXRlICovCi0KLSAgICAgIHVuc2lnbmVkIGNoYXIgZGlyZWN0aW9uOyAvKiAwIC0tPiBvdXQsIDB4MjAgLS0+IElOICovCi0gICAgICB1bnNpZ25lZCBjaGFyIHBwX3N0YXRlOyAvKiBTdGF0ZSBvZiBob3N0IGNvbnRyb2xsZWQgcGlucy4gKi8KLSAgICAgIGVudW0gSUVFRV9Nb2RlIG1vZGU7Ci0KLSAgICAgIHVuc2lnbmVkIGNoYXIgcnVuX2xlbmd0aDsKLSAgICAgIHVuc2lnbmVkIGNoYXIgcmVwZWF0X2J5dGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGluc3QgaW5zdGFuY2VzW0JQUF9OT107Ci0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmFzZV9hZGRyc1tCUFBfTk9dID0geyAweDI3OCwgMHgzNzgsIDB4M2JjIH07Ci0KLS8qCi0gKiBUaGVzZSBhcmUgZm9yIGRhdGEgYWNjZXNzLgotICogQ29udHJvbCBsaW5lcyBhY2Nlc3NlcyBhcmUgaGlkZGVuIGluIHNldF9iaXRzKCkgYW5kIGdldF9iaXRzKCkuCi0gKiBUaGUgZXhjZXB0aW9uIGlzIHRoZSBwcm9iZSBwcm9jZWR1cmUsIHdoaWNoIGlzIHN5c3RlbS1kZXBlbmRlbnQuCi0gKi8KLSNkZWZpbmUgYnBwX291dGJfcChkYXRhLCBiYXNlKSAgb3V0Yl9wKChkYXRhKSwgKGJhc2UpKQotI2RlZmluZSBicHBfaW5iKGJhc2UpICBpbmIoYmFzZSkKLSNkZWZpbmUgYnBwX2luYl9wKGJhc2UpICBpbmJfcChiYXNlKQotCi0vKgotICogVGhpcyBtZXRob2QgdGFrZXMgdGhlIHBpbiB2YWx1ZXMgbWFzayBhbmQgc2V0cyB0aGUgaGFyZHdhcmUgcGlucyB0bwotICogdGhlIHJlcXVlc3RlZCB2YWx1ZTogMSA9PSBoaWdoIHZvbHRhZ2UsIDAgPT0gbG93IHZvbHRhZ2UuIFRoaXMKLSAqIGJ1cnJpZXMgdGhlIGFubm95aW5nIFBDIGJpdCBpbnZlcnNpb24gYW5kIHByZXNlcnZlcyB0aGUgZGlyZWN0aW9uCi0gKiBmbGFnLgotICovCi1zdGF0aWMgdm9pZCBzZXRfcGlucyh1bnNpZ25lZCBzaG9ydCBwaW5zLCB1bnNpZ25lZCBtaW5vcikKLXsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYml0cyA9IGluc3RhbmNlc1ttaW5vcl0uZGlyZWN0aW9uOyAgLyogPT0gMHgyMCAqLwotCi0gICAgICBpZiAoISAocGlucyAmIEJQUF9QUF9uU3Ryb2JlKSkgICBiaXRzIHw9IDE7Ci0gICAgICBpZiAoISAocGlucyAmIEJQUF9QUF9uQXV0b0ZkKSkgICBiaXRzIHw9IDI7Ci0gICAgICBpZiAoICAgcGlucyAmIEJQUF9QUF9uSW5pdCkgICAgICBiaXRzIHw9IDQ7Ci0gICAgICBpZiAoISAocGlucyAmIEJQUF9QUF9uU2VsZWN0SW4pKSBiaXRzIHw9IDg7Ci0KLSAgICAgIGluc3RhbmNlc1ttaW5vcl0ucHBfc3RhdGUgPSBiaXRzOwotCi0gICAgICBvdXRiX3AoYml0cywgYmFzZV9hZGRyc1ttaW5vcl0rMik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBnZXRfcGlucyh1bnNpZ25lZCBtaW5vcikKLXsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGJpdHMgPSAwOwotCi0gICAgICB1bnNpZ25lZCB2YWx1ZSA9IGluc3RhbmNlc1ttaW5vcl0ucHBfc3RhdGU7Ci0gICAgICBpZiAoISAodmFsdWUgJiAweDAxKSkgYml0cyB8PSBCUFBfUFBfblN0cm9iZTsKLSAgICAgIGlmICghICh2YWx1ZSAmIDB4MDIpKSBiaXRzIHw9IEJQUF9QUF9uQXV0b0ZkOwotICAgICAgaWYgKHZhbHVlICYgMHgwNCkgICAgIGJpdHMgfD0gQlBQX1BQX25Jbml0OwotICAgICAgaWYgKCEgKHZhbHVlICYgMHgwOCkpIGJpdHMgfD0gQlBQX1BQX25TZWxlY3RJbjsKLQotICAgICAgdmFsdWUgPSBpbmJfcChiYXNlX2FkZHJzW21pbm9yXSsxKTsKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDgpICAgICBiaXRzIHw9IEJQUF9HUF9uRmF1bHQ7Ci0gICAgICBpZiAodmFsdWUgJiAweDEwKSAgICAgYml0cyB8PSBCUFBfR1BfU2VsZWN0OwotICAgICAgaWYgKHZhbHVlICYgMHgyMCkgICAgIGJpdHMgfD0gQlBQX0dQX1BFcnJvcjsKLSAgICAgIGlmICh2YWx1ZSAmIDB4NDApICAgICBiaXRzIHw9IEJQUF9HUF9uQWNrOwotICAgICAgaWYgKCEgKHZhbHVlICYgMHg4MCkpIGJpdHMgfD0gQlBQX0dQX0J1c3k7Ci0KLSAgICAgIHJldHVybiBiaXRzOwotfQotCi0jZW5kaWYgLyogX19pMzg2X18gKi8KLQotI2lmIGRlZmluZWQoX19zcGFyY19fKQotCi0vKgotICogUmVnaXN0ZXIgYmxvY2sKLSAqLwotICAgICAgLyogRE1BIHJlZ2lzdGVycyAqLwotI2RlZmluZSBCUFBfQ1NSICAgICAgMHgwMAotI2RlZmluZSBCUFBfQUREUiAgICAgMHgwNAotI2RlZmluZSBCUFBfQkNOVCAgICAgMHgwOAotI2RlZmluZSBCUFBfVFNUX0NTUiAgMHgwQwotICAgICAgLyogUGFyYWxsZWwgUG9ydCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQlBQX0hDUiAgICAgIDB4MTAKLSNkZWZpbmUgQlBQX09DUiAgICAgIDB4MTIKLSNkZWZpbmUgQlBQX0RSICAgICAgIDB4MTQKLSNkZWZpbmUgQlBQX1RDUiAgICAgIDB4MTUKLSNkZWZpbmUgQlBQX09SICAgICAgIDB4MTYKLSNkZWZpbmUgQlBQX0lSICAgICAgIDB4MTcKLSNkZWZpbmUgQlBQX0lDUiAgICAgIDB4MTgKLSNkZWZpbmUgQlBQX1NJWkUgICAgIDB4MUEKLQotLyogQlBQX0NTUi4gIEJpdHMgb2YgdHlwZSBSVzEgYXJlIGNsZWFyZWQgd2l0aCB3cml0aW5nICcxJy4gKi8KLSNkZWZpbmUgUF9ERVZfSURfTUFTSyAgIDB4ZjAwMDAwMDAgICAgICAvKiBSICAgKi8KLSNkZWZpbmUgUF9ERVZfSURfWkVCUkEgIDB4NDAwMDAwMDAKLSNkZWZpbmUgUF9ERVZfSURfTDY0ODU0IDB4YTAwMDAwMDAgICAgICAvKiAgICAgID09IE5DUiA4OUMxMDArODlDMTA1LiBQaXR5LiAqLwotI2RlZmluZSBQX05BX0xPQURFRCAgICAgMHgwODAwMDAwMCAgICAgIC8qIFIgICAgTkEgd2lydHRlbiBidXQgd2FzIG5vdCB1c2VkICovCi0jZGVmaW5lIFBfQV9MT0FERUQgICAgICAweDA0MDAwMDAwICAgICAgLyogUiAgICAqLwotI2RlZmluZSBQX0RNQV9PTiAgICAgICAgMHgwMjAwMDAwMCAgICAgIC8qIFIgICAgRE1BIGlzIG5vdCBkaXNhYmxlZCAqLwotI2RlZmluZSBQX0VOX05FWFQgICAgICAgMHgwMTAwMDAwMCAgICAgIC8qIFJXICAgKi8KLSNkZWZpbmUgUF9UQ0lfRElTICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBSVyAgIFRDSSBmb3JiaWRkZW4gZnJvbSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIFBfRElBRyAgICAgICAgICAweDAwMTAwMDAwICAgICAgLyogUlcgICBEaXNhYmxlcyBkcmFpbmluZyBhbmQgcmVzZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBQLUZJRk8gb24gbG9hZGluZyBvZiBQX0FERFIqLwotI2RlZmluZSBQX0JVUlNUX1NJWkUgICAgMHgwMDBjMDAwMCAgICAgIC8qIFJXICAgU0J1cyBidXJzdCBzaXplICovCi0jZGVmaW5lIFBfQlVSU1RfOCAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBfQlVSU1RfNCAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFBfQlVSU1RfMSAgICAgICAweDAwMDgwMDAwICAgICAgLyogICAgICAiTm8gYnVyc3QiIHdyaXRlICovCi0jZGVmaW5lIFBfVEMgICAgICAgICAgICAweDAwMDA0MDAwICAgICAgLyogUlcxICBUZXJtIENvdW50LCBjYW4gYmUgY2xlYXJlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9FTl9ORVhUPTEgKi8KLSNkZWZpbmUgUF9FTl9DTlQgICAgICAgIDB4MDAwMDIwMDAgICAgICAvKiBSVyAgICovCi0jZGVmaW5lIFBfRU5fRE1BICAgICAgICAweDAwMDAwMjAwICAgICAgLyogUlcgICAqLwotI2RlZmluZSBQX1dSSVRFICAgICAgICAgMHgwMDAwMDEwMCAgICAgIC8qIFIgICAgRE1BIGRpciwgMT10byByYW0sIDA9dG8gcG9ydCAqLwotI2RlZmluZSBQX1JFU0VUICAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8qIFJXICAgKi8KLSNkZWZpbmUgUF9TTEFWRV9FUlIgICAgIDB4MDAwMDAwNDAgICAgICAvKiBSVzEgIEFjY2VzcyBzaXplIGVycm9yICovCi0jZGVmaW5lIFBfSU5WQUxJREFURSAgICAweDAwMDAwMDIwICAgICAgLyogVyAgICBEcm9wIFAtRklGTyAqLwotI2RlZmluZSBQX0lOVF9FTiAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIFJXICAgT0sgdG8gUF9JTlRfUEVORHx8UF9FUlJfUEVORCAqLwotI2RlZmluZSBQX0RSQUlOSU5HICAgICAgMHgwMDAwMDAwYyAgICAgIC8qIFIgICAgUC1GSUZPIGlzIGRyYWluaW5nIHRvIG1lbW9yeSAqLwotI2RlZmluZSBQX0VSUl9QRU5EICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIFIgICAgKi8KLSNkZWZpbmUgUF9JTlRfUEVORCAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBSICAgICovCi0KLS8qIEJQUF9IQ1IuIFRpbWUgaXMgaW4gaW5jcmVtZW50cyBvZiBTQnVzIGNsb2NrLiAqLwotI2RlZmluZSBQX0hDUl9URVNUICAgICAgMHg4MDAwICAgICAgLyogQWxsb3dzIGJ1cmllZCBjb3VudGVycyB0byBiZSByZWFkICovCi0jZGVmaW5lIFBfSENSX0RTVyAgICAgICAweDdmMDAgICAgICAvKiBEYXRhIHN0cm9iZSB3aWR0aCAoaW4gdGlja3MpICovCi0jZGVmaW5lIFBfSENSX0REUyAgICAgICAweDAwN2YgICAgICAvKiBEYXRhIHNldHVwIGJlZm9yZSBzdHJvYmUgKGluIHRpY2tzKSAqLwotCi0vKiBCUFBfT0NSLiAqLwotI2RlZmluZSBQX09DUl9NRU1fQ0xSICAgMHg4MDAwCi0jZGVmaW5lIFBfT0NSX0RBVEFfU1JDICAweDQwMDAgICAgICAvKiApICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUF9PQ1JfRFNfRFNFTCAgIDB4MjAwMCAgICAgIC8qICkgIEJpZGlyZWN0aW9uYWwgICAgICAqLwotI2RlZmluZSBQX09DUl9CVVNZX0RTRUwgMHgxMDAwICAgICAgLyogKSAgICBzZWxlY3RzICAgICAgICAgICAgKi8KLSNkZWZpbmUgUF9PQ1JfQUNLX0RTRUwgIDB4MDgwMCAgICAgIC8qICkgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQX09DUl9FTl9ESUFHICAgMHgwNDAwCi0jZGVmaW5lIFBfT0NSX0JVU1lfT1AgICAweDAyMDAgICAgICAvKiBCdXN5IG9wZXJhdGlvbiAqLwotI2RlZmluZSBQX09DUl9BQ0tfT1AgICAgMHgwMTAwICAgICAgLyogQWNrIG9wZXJhdGlvbiAqLwotI2RlZmluZSBQX09DUl9TUlNUICAgICAgMHgwMDgwICAgICAgLyogUmVzZXQgc3RhdGUgbWFjaGluZXMuIE5vdCBzZWxmY2xlYW5pbmcuICovCi0jZGVmaW5lIFBfT0NSX0lETEUgICAgICAweDAwMDggICAgICAvKiBQUCBkYXRhIHRyYW5zZmVyIHN0YXRlIG1hY2hpbmUgaXMgaWRsZSAqLwotI2RlZmluZSBQX09DUl9WX0lMQ0sgICAgMHgwMDAyICAgICAgLyogVmVyc2F0ZWMgZmFkZWQuIFplYnJhIG9ubHkuICovCi0jZGVmaW5lIFBfT0NSX0VOX1ZFUiAgICAweDAwMDEgICAgICAvKiBFbmFibGUgVmVyc2F0ZWMgKDAgLSBlbmFibGUpLiBaZWJyYSBvbmx5LiAqLwotCi0vKiBCUFBfVENSICovCi0jZGVmaW5lIFBfVENSX0RJUiAgICAgICAweDA4Ci0jZGVmaW5lIFBfVENSX0JVU1kgICAgICAweDA0Ci0jZGVmaW5lIFBfVENSX0FDSyAgICAgICAweDAyCi0jZGVmaW5lIFBfVENSX0RTICAgICAgICAweDAxICAgICAgICAvKiBTdHJvYmUgKi8KLQotLyogQlBQX09SICovCi0jZGVmaW5lIFBfT1JfVjMgICAgICAgICAweDIwICAgICAgICAvKiApICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQX09SX1YyICAgICAgICAgMHgxMCAgICAgICAgLyogKSBvbiBaZWJyYSBvbmx5ICAgKi8KLSNkZWZpbmUgUF9PUl9WMSAgICAgICAgIDB4MDggICAgICAgIC8qICkgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBfT1JfSU5JVCAgICAgICAweDA0Ci0jZGVmaW5lIFBfT1JfQUZYTiAgICAgICAweDAyICAgICAgICAvKiBBdXRvIEZlZWQgKi8KLSNkZWZpbmUgUF9PUl9TTENUX0lOICAgIDB4MDEKLQotLyogQlBQX0lSICovCi0jZGVmaW5lIFBfSVJfUEUgICAgICAgICAweDA0Ci0jZGVmaW5lIFBfSVJfU0xDVCAgICAgICAweDAyCi0jZGVmaW5lIFBfSVJfRVJSICAgICAgICAweDAxCi0KLS8qIEJQUF9JQ1IgKi8KLSNkZWZpbmUgUF9EU19JUlEgICAgICAgIDB4ODAwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9BQ0tfSVJRICAgICAgIDB4NDAwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9CVVNZX0lSUSAgICAgIDB4MjAwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9QRV9JUlEgICAgICAgIDB4MTAwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9TTENUX0lSUSAgICAgIDB4MDgwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9FUlJfSVJRICAgICAgIDB4MDQwMCAgICAgIC8qIFJXMSAgKi8KLSNkZWZpbmUgUF9EU19JUlFfRU4gICAgIDB4MDIwMCAgICAgIC8qIFJXICAgQWx3YXlzIG9uIHJpc2luZyBlZGdlICovCi0jZGVmaW5lIFBfQUNLX0lSUV9FTiAgICAweDAxMDAgICAgICAvKiBSVyAgIEFsd2F5cyBvbiByaXNpbmcgZWRnZSAqLwotI2RlZmluZSBQX0JVU1lfSVJQICAgICAgMHgwMDgwICAgICAgLyogUlcgICAxPSByaXNpbmcgZWRnZSAqLwotI2RlZmluZSBQX0JVU1lfSVJRX0VOICAgMHgwMDQwICAgICAgLyogUlcgICAqLwotI2RlZmluZSBQX1BFX0lSUCAgICAgICAgMHgwMDIwICAgICAgLyogUlcgICAxPSByaXNpbmcgZWRnZSAqLwotI2RlZmluZSBQX1BFX0lSUV9FTiAgICAgMHgwMDEwICAgICAgLyogUlcgICAqLwotI2RlZmluZSBQX1NMQ1RfSVJQICAgICAgMHgwMDA4ICAgICAgLyogUlcgICAxPSByaXNpbmcgZWRnZSAqLwotI2RlZmluZSBQX1NMQ1RfSVJRX0VOICAgMHgwMDA0ICAgICAgLyogUlcgICAqLwotI2RlZmluZSBQX0VSUl9JUlAgICAgICAgMHgwMDAyICAgICAgLyogUlcxICAxPSByaXNpbmcgZWRnZSAqLwotI2RlZmluZSBQX0VSUl9JUlFfRU4gICAgMHgwMDAxICAgICAgLyogUlcgICAqLwotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJzW0JQUF9OT107Ci0KLSNkZWZpbmUgYnBwX291dGJfcChkYXRhLCBiYXNlKQlzYnVzX3dyaXRlYihkYXRhLCAoYmFzZSkgKyBCUFBfRFIpCi0jZGVmaW5lIGJwcF9pbmJfcChiYXNlKQkJc2J1c19yZWFkYigoYmFzZSkgKyBCUFBfRFIpCi0jZGVmaW5lIGJwcF9pbmIoYmFzZSkJCXNidXNfcmVhZGIoKGJhc2UpICsgQlBQX0RSKQotCi1zdGF0aWMgdm9pZCBzZXRfcGlucyh1bnNpZ25lZCBzaG9ydCBwaW5zLCB1bnNpZ25lZCBtaW5vcikKLXsKLSAgICAgIHZvaWQgX19pb21lbSAqYmFzZSA9IGJhc2VfYWRkcnNbbWlub3JdOwotICAgICAgdW5zaWduZWQgY2hhciBiaXRzX3RjciA9IDAsIGJpdHNfb3IgPSAwOwotCi0gICAgICBpZiAoaW5zdGFuY2VzW21pbm9yXS5kaXJlY3Rpb24gJiAweDIwKSBiaXRzX3RjciB8PSBQX1RDUl9ESVI7Ci0gICAgICBpZiAoICAgcGlucyAmIEJQUF9QUF9uU3Ryb2JlKSAgICAgICAgICBiaXRzX3RjciB8PSBQX1RDUl9EUzsKLQotICAgICAgaWYgKCAgIHBpbnMgJiBCUFBfUFBfbkF1dG9GZCkgICAgICAgICAgYml0c19vciB8PSBQX09SX0FGWE47Ci0gICAgICBpZiAoISAocGlucyAmIEJQUF9QUF9uSW5pdCkpICAgICAgICAgICBiaXRzX29yIHw9IFBfT1JfSU5JVDsKLSAgICAgIGlmICghIChwaW5zICYgQlBQX1BQX25TZWxlY3RJbikpICAgICAgIGJpdHNfb3IgfD0gUF9PUl9TTENUX0lOOwotCi0gICAgICBzYnVzX3dyaXRlYihiaXRzX29yLCBiYXNlICsgQlBQX09SKTsKLSAgICAgIHNidXNfd3JpdGViKGJpdHNfdGNyLCBiYXNlICsgQlBQX1RDUik7Ci19Ci0KLS8qCi0gKiBpMzg2IHBlb3BsZSByZWFkIG91dHB1dCBwaW5zIGZyb20gYSBzb2Z0d2FyZSBpbWFnZS4KLSAqIFdlIG1heSBnZXQgdGhlbSBiYWNrIGZyb20gaGFyZHdhcmUuCi0gKiBBZ2FpbiwgaW52ZXJzaW9uIG9mIHBpbnMgbXVzdCBoZSBidXJpZWQgaGVyZS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdldF9waW5zKHVuc2lnbmVkIG1pbm9yKQotewotICAgICAgdm9pZCBfX2lvbWVtICpiYXNlID0gYmFzZV9hZGRyc1ttaW5vcl07Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBiaXRzID0gMDsKLSAgICAgIHVuc2lnbmVkIHZhbHVlX3RjciA9IHNidXNfcmVhZGIoYmFzZSArIEJQUF9UQ1IpOwotICAgICAgdW5zaWduZWQgdmFsdWVfaXIgPSBzYnVzX3JlYWRiKGJhc2UgKyBCUFBfSVIpOwotICAgICAgdW5zaWduZWQgdmFsdWVfb3IgPSBzYnVzX3JlYWRiKGJhc2UgKyBCUFBfT1IpOwotCi0gICAgICBpZiAodmFsdWVfdGNyICYgUF9UQ1JfRFMpICAgICAgICAgYml0cyB8PSBCUFBfUFBfblN0cm9iZTsKLSAgICAgIGlmICh2YWx1ZV9vciAmIFBfT1JfQUZYTikgICAgICAgICBiaXRzIHw9IEJQUF9QUF9uQXV0b0ZkOwotICAgICAgaWYgKCEgKHZhbHVlX29yICYgUF9PUl9JTklUKSkgICAgIGJpdHMgfD0gQlBQX1BQX25Jbml0OwotICAgICAgaWYgKCEgKHZhbHVlX29yICYgUF9PUl9TTENUX0lOKSkgIGJpdHMgfD0gQlBQX1BQX25TZWxlY3RJbjsKLQotICAgICAgaWYgKHZhbHVlX2lyICYgUF9JUl9FUlIpICAgICAgICAgIGJpdHMgfD0gQlBQX0dQX25GYXVsdDsKLSAgICAgIGlmICghICh2YWx1ZV9pciAmIFBfSVJfU0xDVCkpICAgICBiaXRzIHw9IEJQUF9HUF9TZWxlY3Q7Ci0gICAgICBpZiAoISAodmFsdWVfaXIgJiBQX0lSX1BFKSkgICAgICAgYml0cyB8PSBCUFBfR1BfUEVycm9yOwotICAgICAgaWYgKCEgKHZhbHVlX3RjciAmIFBfVENSX0FDSykpICAgIGJpdHMgfD0gQlBQX0dQX25BY2s7Ci0gICAgICBpZiAodmFsdWVfdGNyICYgUF9UQ1JfQlVTWSkgICAgICAgYml0cyB8PSBCUFBfR1BfQnVzeTsKLQotICAgICAgcmV0dXJuIGJpdHM7Ci19Ci0KLSNlbmRpZiAvKiBfX3NwYXJjX18gKi8KLQotc3RhdGljIHZvaWQgc25vb3plKHVuc2lnbmVkIGxvbmcgc25vb3plX3RpbWUsIHVuc2lnbmVkIG1pbm9yKQotewotCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKHNub296ZV90aW1lICsgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2FpdF9mb3IodW5zaWduZWQgc2hvcnQgc2V0LCB1bnNpZ25lZCBzaG9ydCBjbHIsCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRlbGF5LCB1bnNpZ25lZCBtaW5vcikKLXsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHBpbnMgPSBnZXRfcGlucyhtaW5vcik7Ci0KLSAgICAgIHVuc2lnbmVkIGxvbmcgZXh0aW1lID0gMDsKLQotICAgICAgLyoKLSAgICAgICAqIFRyeSBhIHJlYWwgZmFzdCBzY2FuIGZvciB0aGUgZmlyc3QgamlmZnksIGluIGNhc2UgdGhlIGRldmljZQotICAgICAgICogcmVzcG9uZHMgcmVhbCBnb29kLiBUaGUgZmlyc3Qgd2hpbGUgbG9vcCBndWVzc2VzIGFuIGV4cGlyZQotICAgICAgICogdGltZSBhY2NvdW50aW5nIGZvciBwb3NzaWJsZSB3cmFwYXJvdW5kIG9mIGppZmZpZXMuCi0gICAgICAgKi8KLSAgICAgIHdoaWxlICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGV4dGltZSkpIGV4dGltZSA9IGppZmZpZXMgKyAxOwotICAgICAgd2hpbGUgKCAodGltZV9iZWZvcmUoamlmZmllcywgZXh0aW1lKSkKLSAgICAgICAgICAgICAgJiYgKCgocGlucyAmIHNldCkgIT0gc2V0KSB8fCAoKHBpbnMgJiBjbHIpICE9IDApKSApIHsKLSAgICAgICAgICAgIHBpbnMgPSBnZXRfcGlucyhtaW5vcik7Ci0gICAgICB9Ci0KLSAgICAgIGRlbGF5IC09IDE7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiBteSBkZWxheSBleHBpcmVkIG9yIHRoZSBwaW5zIGFyZSBzdGlsbCBub3Qgd2hlcmUgSSB3YW50Ci0gICAgICAgKiB0aGVtLCB0aGVuIHJlc29ydCB0byB1c2luZyB0aGUgdGltZXIgYW5kIGdyZWF0bHkgcmVkdWNlIG15Ci0gICAgICAgKiBzYW1wbGUgcmF0ZS4gSWYgdGhlIHBlcmlwaGVyYWwgaXMgZ29pbmcgdG8gYmUgc2xvdywgdGhpcyB3aWxsCi0gICAgICAgKiBnaXZlIHRoZSBDUFUgdXAgdG8gc29tZSBtb3JlIHdvcnRoeSBwcm9jZXNzLgotICAgICAgICovCi0gICAgICB3aGlsZSAoIGRlbGF5ICYmICgoKHBpbnMgJiBzZXQpICE9IHNldCkgfHwgKChwaW5zICYgY2xyKSAhPSAwKSkgKSB7Ci0KLSAgICAgICAgICAgIHNub296ZSgxLCBtaW5vcik7Ci0gICAgICAgICAgICBwaW5zID0gZ2V0X3BpbnMobWlub3IpOwotICAgICAgICAgICAgZGVsYXkgLT0gMTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbGF5ID09IDApIHJldHVybiAtMTsKLSAgICAgIGVsc2UgcmV0dXJuIHBpbnM7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gWkVSTygwKSBJZiB0aGUgbmVnb3RpYXRpb24gc3VjY2VlZHMsIGFuIGVycm5vIG90aGVyd2lzZS4gQW4KLSAqIGVycm5vIG1lYW5zIHNvbWV0aGluZyBicm9rZSwgYW5kIEkgZG8gbm90IHlldCBrbm93IGhvdyB0byBmaXggaXQuCi0gKi8KLXN0YXRpYyBpbnQgbmVnb3RpYXRlKHVuc2lnbmVkIGNoYXIgbW9kZSwgdW5zaWduZWQgbWlub3IpCi17Ci0gICAgICBpbnQgcmM7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBwaW5zID0gZ2V0X3BpbnMobWlub3IpOwotICAgICAgaWYgKHBpbnMgJiBCUFBfUFBfblNlbGVjdEluKSByZXR1cm4gLUVJTzsKLQotCi0gICAgICAgIC8qIEV2ZW50IDA6IFdyaXRlIHRoZSBtb2RlIHRvIHRoZSBkYXRhIGxpbmVzICovCi0gICAgICBicHBfb3V0Yl9wKG1vZGUsIGJhc2VfYWRkcnNbbWlub3JdKTsKLQotICAgICAgc25vb3plKFRJTUVfUFNldHVwLCBtaW5vcik7Ci0KLSAgICAgICAgLyogRXZlbnQgMTogU3Ryb2JlIHRoZSBtb2RlIGNvZGUgaW50byB0aGUgcGVyaXBoZXJhbCAqLwotICAgICAgc2V0X3BpbnMoQlBQX1BQX25TZWxlY3RJbnxCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkluaXQsIG1pbm9yKTsKLQotICAgICAgICAvKiBXYWl0IGZvciBFdmVudCAyOiBQZXJpcGhlcmFsIHJlc3BvbmRzIGFzIGEgMTI4NCBkZXZpY2UuICovCi0gICAgICByYyA9IHdhaXRfZm9yKEJQUF9HUF9QRXJyb3J8QlBQX0dQX1NlbGVjdHxCUFBfR1BfbkZhdWx0LAotICAgICAgICAgICAgICAgIEJQUF9HUF9uQWNrLAotICAgICAgICAgICAgICAgIFRJTUVfUFJlc3BvbnNlLAotICAgICAgICAgICAgICAgIG1pbm9yKTsKLQotICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVUSU1FRE9VVDsKLQotICAgICAgICAvKiBFdmVudCAzOiBsYXRjaCBleHRlbnNpYmlsaXR5IHJlcXVlc3QgKi8KLSAgICAgIHNldF9waW5zKEJQUF9QUF9uU2VsZWN0SW58QlBQX1BQX25Jbml0LCBtaW5vcik7Ci0KLSAgICAgICAgLyogLi4uIHF1aWNrIG5hcCB3aGlsZSBwZXJpcGhlcmFsIHBvbmRlcnMgdGhlIGJ5dGUgaSdtIHNlbmRpbmcuLi4qLwotICAgICAgc25vb3plKDEsIG1pbm9yKTsKLQotICAgICAgICAvKiBFdmVudCA0OiByZXN0b3JlIHN0cm9iZSwgdG8gQUNLIHBlcmlwaGVyYWwncyByZXNwb25zZS4gKi8KLSAgICAgIHNldF9waW5zKEJQUF9QUF9uU2VsZWN0SW58QlBQX1BQX25BdXRvRmR8QlBQX1BQX25TdHJvYmV8QlBQX1BQX25Jbml0LCBtaW5vcik7Ci0KLSAgICAgICAgLyogV2FpdCBmb3IgRXZlbnQgNjogUGVyaXBoZXJhbCBsYXRjaGVzIHJlc3BvbnNlIGJpdHMgKi8KLSAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX25BY2ssIDAsIFRJTUVfUFNldHVwK1RJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICBpZiAocmMgPT0gLTEpIHJldHVybiAtRUlPOwotCi0gICAgICAgIC8qIEEgMTI4NCBkZXZpY2UgY2Fubm90IHJlZnVzZSBuaWJibGUgbW9kZSAqLwotICAgICAgaWYgKG1vZGUgPT0gREVGQVVMVF9OSUJCTEUpIHJldHVybiAwOwotCi0gICAgICBpZiAocGlucyAmIEJQUF9HUF9TZWxlY3QpIHJldHVybiAwOwotCi0gICAgICByZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKLX0KLQotc3RhdGljIGludCB0ZXJtaW5hdGUodW5zaWduZWQgbWlub3IpCi17Ci0gICAgICBpbnQgcmM7Ci0KLSAgICAgICAgLyogRXZlbnQgMjI6IFJlcXVlc3QgdGVybWluYXRpb24gb2YgMTI4NCBtb2RlICovCi0gICAgICBzZXRfcGlucyhCUFBfUFBfbkF1dG9GZHxCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkluaXQsIG1pbm9yKTsKLQotICAgICAgICAvKiBXYWl0IGZvciBFdmVudHMgMjMgYW5kIDI0OiBBQ0sgdGVybWluYXRpb24gcmVxdWVzdC4gKi8KLSAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX0J1c3l8QlBQX0dQX25GYXVsdCwKLSAgICAgICAgICAgICAgICBCUFBfR1BfbkFjaywKLSAgICAgICAgICAgICAgICBUSU1FX1BTZXR1cCtUSU1FX1BSZXNwb25zZSwKLSAgICAgICAgICAgICAgICBtaW5vcik7Ci0KLSAgICAgIGluc3RhbmNlc1ttaW5vcl0uZGlyZWN0aW9uID0gMDsKLSAgICAgIGluc3RhbmNlc1ttaW5vcl0ubW9kZSA9IENPTVBBVElCSUxJVFk7Ci0KLSAgICAgIGlmIChyYyA9PSAtMSkgewotICAgICAgICAgIHJldHVybiAtRUlPOwotICAgICAgfQotCi0gICAgICAgIC8qIEV2ZW50IDI1OiBIYW5kc2hha2UgYnkgbG93ZXJpbmcgbkF1dG9GZCAqLwotICAgICAgc2V0X3BpbnMoQlBQX1BQX25TdHJvYmV8QlBQX1BQX25Jbml0LCBtaW5vcik7Ci0KLSAgICAgICAgLyogRXZlbnQgMjY6IFBlcmlwaGVyYWwgd2lnZ2xlcyBsaW5lcy4uLiAqLwotCi0gICAgICAgIC8qIEV2ZW50IDI3OiBQZXJpcGhlcmFsIHNldHMgbkFjayBISUdIIHRvIGFjayBoYW5kc2hha2UgKi8KLSAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX25BY2ssIDAsIFRJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICBpZiAocmMgPT0gLTEpIHsKLSAgICAgICAgICBzZXRfcGlucyhCUFBfUFBfbkF1dG9GZHxCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkluaXQsIG1pbm9yKTsKLSAgICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAgIH0KLQotICAgICAgICAvKiBFdmVudCAyODogRmluaXNoIHBoYXNlIGJ5IHJhaXNpbmcgbkF1dG9GZCAqLwotICAgICAgc2V0X3BpbnMoQlBQX1BQX25BdXRvRmR8QlBQX1BQX25TdHJvYmV8QlBQX1BQX25Jbml0LCBtaW5vcik7Ci0KLSAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJwcF9vcGVuX2xvY2spOwotCi0vKgotICogQWxsb3cgb25seSBvbmUgcHJvY2VzcyB0byBvcGVuIHRoZSBkZXZpY2UgYXQgYSB0aW1lLgotICovCi1zdGF0aWMgaW50IGJwcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQotewotICAgICAgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotICAgICAgaW50IHJldDsKLQotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgICAgIHNwaW5fbG9jaygmYnBwX29wZW5fbG9jayk7Ci0gICAgICByZXQgPSAwOwotICAgICAgaWYgKG1pbm9yID49IEJQUF9OTykgewotCSAgICAgIHJldCA9IC1FTk9ERVY7Ci0gICAgICB9IGVsc2UgewotCSAgICAgIGlmICghIGluc3RhbmNlc1ttaW5vcl0ucHJlc2VudCkgewotCQkgICAgICByZXQgPSAtRU5PREVWOwotCSAgICAgIH0gZWxzZSB7Ci0JCSAgICAgIGlmIChpbnN0YW5jZXNbbWlub3JdLm9wZW5lZCkgCi0JCQkgICAgICByZXQgPSAtRUJVU1k7Ci0JCSAgICAgIGVsc2UKLQkJCSAgICAgIGluc3RhbmNlc1ttaW5vcl0ub3BlbmVkID0gMTsKLQkgICAgICB9Ci0gICAgICB9Ci0gICAgICBzcGluX3VubG9jaygmYnBwX29wZW5fbG9jayk7Ci0gICAgICB1bmxvY2tfa2VybmVsKCk7Ci0KLSAgICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBXaGVuIHRoZSBwcm9jZXNzIGNsb3NlcyB0aGUgZGV2aWNlLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gY2xlYW4KLSAqIHVwIGFuZCByZXNldCB0aGUgaGFyZHdhcmUuIEFsd2F5cyBsZWF2ZSB0aGUgZGV2aWNlIGluIGNvbXBhdGliaWxpdHkKLSAqIG1vZGUgYXMgdGhpcyBpcyBhIHJlYXNvbmFibGUgcGxhY2UgdG8gY2xlYW4gdXAgZnJvbSBtZXNzZXMgbWFkZSBieQotICogaW9jdGxzLCBvciBvdGhlciBtYXloZW0uCi0gKi8KLXN0YXRpYyBpbnQgYnBwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCi17Ci0gICAgICB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0KLSAgICAgIHNwaW5fbG9jaygmYnBwX29wZW5fbG9jayk7Ci0gICAgICBpbnN0YW5jZXNbbWlub3JdLm9wZW5lZCA9IDA7Ci0KLSAgICAgIGlmIChpbnN0YW5jZXNbbWlub3JdLm1vZGUgIT0gQ09NUEFUSUJJTElUWSkKLQkgICAgICB0ZXJtaW5hdGUobWlub3IpOwotCi0gICAgICBzcGluX3VubG9jaygmYnBwX29wZW5fbG9jayk7Ci0KLSAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyByZWFkX25pYmJsZSh1bnNpZ25lZCBtaW5vciwgY2hhciBfX3VzZXIgKmMsIHVuc2lnbmVkIGxvbmcgY250KQotewotICAgICAgdW5zaWduZWQgbG9uZyByZW1haW5pbmcgPSBjbnQ7Ci0gICAgICBsb25nIHJjOwotCi0gICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgewotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSA9IDA7Ci0gICAgICAgICAgaW50IHBpbnM7Ci0KLSAgICAgICAgICAvKiBFdmVudCA3OiByZXF1ZXN0IG5pYmJsZSAqLwotICAgICAgICAgIHNldF9waW5zKEJQUF9QUF9uU2VsZWN0SW58QlBQX1BQX25TdHJvYmUsIG1pbm9yKTsKLQotICAgICAgICAgIC8qIFdhaXQgZm9yIGV2ZW50IDk6IFBlcmlwaGVyIHN0cm9iZXMgZmlyc3QgbmliYmxlICovCi0gICAgICAgICAgcGlucyA9IHdhaXRfZm9yKDAsIEJQUF9HUF9uQWNrLCBUSU1FX0lETEVfTElNSVQsIG1pbm9yKTsKLSAgICAgICAgICBpZiAocGlucyA9PSAtMSkgcmV0dXJuIC1FVElNRURPVVQ7Ci0KLSAgICAgICAgICAvKiBFdmVudCAxMDogSSBoYW5kc2hha2UgbmliYmxlICovCi0gICAgICAgICAgc2V0X3BpbnMoQlBQX1BQX25TZWxlY3RJbnxCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkF1dG9GZCwgbWlub3IpOwotICAgICAgICAgIGlmIChwaW5zICYgQlBQX0dQX25GYXVsdCkgYnl0ZSB8PSAweDAxOwotICAgICAgICAgIGlmIChwaW5zICYgQlBQX0dQX1NlbGVjdCkgYnl0ZSB8PSAweDAyOwotICAgICAgICAgIGlmIChwaW5zICYgQlBQX0dQX1BFcnJvcikgYnl0ZSB8PSAweDA0OwotICAgICAgICAgIGlmIChwaW5zICYgQlBQX0dQX0J1c3kpICAgYnl0ZSB8PSAweDA4OwotCi0gICAgICAgICAgLyogV2FpdCBmb3IgZXZlbnQgMTE6IFBlcmlwaGVyYWwgaGFuZHNoYWtlcyBuaWJibGUgKi8KLSAgICAgICAgICByYyA9IHdhaXRfZm9yKEJQUF9HUF9uQWNrLCAwLCBUSU1FX1BSZXNwb25zZSwgbWlub3IpOwotCi0gICAgICAgICAgLyogRXZlbnQgNzogcmVxdWVzdCBuaWJibGUgKi8KLSAgICAgICAgICBzZXRfcGlucyhCUFBfUFBfblNlbGVjdElufEJQUF9QUF9uU3Ryb2JlLCBtaW5vcik7Ci0KLSAgICAgICAgICAvKiBXYWl0IGZvciBldmVudCA5OiBQZXJpcGhlciBzdHJvYmVzIGZpcnN0IG5pYmJsZSAqLwotICAgICAgICAgIHBpbnMgPSB3YWl0X2ZvcigwLCBCUFBfR1BfbkFjaywgVElNRV9QUmVzcG9uc2UsIG1pbm9yKTsKLSAgICAgICAgICBpZiAocmMgPT0gLTEpIHJldHVybiAtRVRJTUVET1VUOwotCi0gICAgICAgICAgLyogRXZlbnQgMTA6IEkgaGFuZHNoYWtlIG5pYmJsZSAqLwotICAgICAgICAgIHNldF9waW5zKEJQUF9QUF9uU2VsZWN0SW58QlBQX1BQX25TdHJvYmV8QlBQX1BQX25BdXRvRmQsIG1pbm9yKTsKLSAgICAgICAgICBpZiAocGlucyAmIEJQUF9HUF9uRmF1bHQpIGJ5dGUgfD0gMHgxMDsKLSAgICAgICAgICBpZiAocGlucyAmIEJQUF9HUF9TZWxlY3QpIGJ5dGUgfD0gMHgyMDsKLSAgICAgICAgICBpZiAocGlucyAmIEJQUF9HUF9QRXJyb3IpIGJ5dGUgfD0gMHg0MDsKLSAgICAgICAgICBpZiAocGlucyAmIEJQUF9HUF9CdXN5KSAgIGJ5dGUgfD0gMHg4MDsKLQotICAgICAgICAgIGlmIChwdXRfdXNlcihieXRlLCBjKSkKLQkJICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICBjICs9IDE7Ci0gICAgICAgICAgcmVtYWluaW5nIC09IDE7Ci0KLSAgICAgICAgICAvKiBXYWl0IGZvciBldmVudCAxMTogUGVyaXBoZXJhbCBoYW5kc2hha2VzIG5pYmJsZSAqLwotICAgICAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX25BY2ssIDAsIFRJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVJTzsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGNudCAtIHJlbWFpbmluZzsKLX0KLQotc3RhdGljIGxvbmcgcmVhZF9lY3AodW5zaWduZWQgbWlub3IsIGNoYXIgX191c2VyICpjLCB1bnNpZ25lZCBsb25nIGNudCkKLXsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nOwotICAgICAgbG9uZyByYzsKLQotICAgICAgICAvKiBUdXJuIEVDUCBtb2RlIGZyb20gZm9yd2FyZCB0byByZXZlcnNlIGlmIG5lZWRlZC4gKi8KLSAgICAgIGlmICghIGluc3RhbmNlc1ttaW5vcl0uZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgdW5zaWduZWQgc2hvcnQgcGlucyA9IGdldF9waW5zKG1pbm9yKTsKLQotICAgICAgICAgICAgLyogRXZlbnQgMzg6IFR1cm4gdGhlIGJ1cyBhcm91bmQgKi8KLSAgICAgICAgICBpbnN0YW5jZXNbbWlub3JdLmRpcmVjdGlvbiA9IDB4MjA7Ci0gICAgICAgICAgcGlucyAmPSB+QlBQX1BQX25BdXRvRmQ7Ci0gICAgICAgICAgc2V0X3BpbnMocGlucywgbWlub3IpOwotCi0gICAgICAgICAgICAvKiBFdmVudCAzOTogU2V0IHBpbnMgZm9yIHJldmVyc2UgbW9kZS4gKi8KLSAgICAgICAgICBzbm9vemUoVElNRV9QU2V0dXAsIG1pbm9yKTsKLSAgICAgICAgICBzZXRfcGlucyhCUFBfUFBfblN0cm9iZXxCUFBfUFBfblNlbGVjdEluLCBtaW5vcik7Ci0KLSAgICAgICAgICAgIC8qIFdhaXQgZm9yIGV2ZW50IDQwOiBQZXJpcGhlcmFsIHJlYWR5IHRvIGJlIHN0cm9iZWQgKi8KLSAgICAgICAgICByYyA9IHdhaXRfZm9yKDAsIEJQUF9HUF9QRXJyb3IsIFRJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVUSU1FRE9VVDsKLSAgICAgIH0KLQotICAgICAgcmVtYWluaW5nID0gY250OwotCi0gICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgewotCi0gICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIHJ1biBsZW5ndGggZm9yIGEgcmVwZWF0ZWQgYnl0ZSwgcmVwZWF0ICovCi0gICAgICAgICAgICAvKiB0aGF0IGJ5dGUgYSBmZXcgdGltZXMuICovCi0gICAgICAgICAgaWYgKGluc3RhbmNlc1ttaW5vcl0ucnVuX2xlbmd0aCAmJiAhaW5zdGFuY2VzW21pbm9yXS5ydW5fZmxhZykgewotCi0gICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGlkeDsKLSAgICAgICAgICAgICAgdW5zaWduZWQgcmVwZWF0ID0gcmVtYWluaW5nIDwgaW5zdGFuY2VzW21pbm9yXS5ydW5fbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZW1haW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGluc3RhbmNlc1ttaW5vcl0ucnVuX2xlbmd0aDsKLQotICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAgOyAgaWR4IDwgcmVwZWF0IDsgIGlkeCArPSAxKQotICAgICAgICAgICAgICAgIGJ1ZmZlcltpZHhdID0gaW5zdGFuY2VzW21pbm9yXS5yZXBlYXRfYnl0ZTsKLQotICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGMsIGJ1ZmZlciwgcmVwZWF0KSkKLQkJICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgIHJlbWFpbmluZyAtPSByZXBlYXQ7Ci0gICAgICAgICAgICAgIGMgKz0gcmVwZWF0OwotICAgICAgICAgICAgICBpbnN0YW5jZXNbbWlub3JdLnJ1bl9sZW5ndGggLT0gcmVwZWF0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgYnJlYWs7Ci0KLQotICAgICAgICAgICAgLyogV2FpdCBmb3IgRXZlbnQgNDM6IERhdGEgYWN0aXZlIG9uIHRoZSBidXMuICovCi0gICAgICAgICAgcmMgPSB3YWl0X2ZvcigwLCBCUFBfR1BfbkFjaywgVElNRV9JRExFX0xJTUlULCBtaW5vcik7Ci0gICAgICAgICAgaWYgKHJjID09IC0xKSBicmVhazsKLQotICAgICAgICAgIGlmIChyYyAmIEJQUF9HUF9CdXN5KSB7Ci0gICAgICAgICAgICAgICAgLyogT0ssIHRoaXMgaXMgZGF0YS4gcmVhZCBpdCBpbi4gKi8KLSAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBieXRlID0gYnBwX2luYihiYXNlX2FkZHJzW21pbm9yXSk7Ci0gICAgICAgICAgICAgIGlmIChwdXRfdXNlcihieXRlLCBjKSkKLQkJICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgIGMgKz0gMTsKLSAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE7Ci0KLSAgICAgICAgICAgICAgaWYgKGluc3RhbmNlc1ttaW5vcl0ucnVuX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICAgIGluc3RhbmNlc1ttaW5vcl0ucmVwZWF0X2J5dGUgPSBieXRlOwotICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5ydW5fZmxhZyA9IDA7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSA9IGJwcF9pbmIoYmFzZV9hZGRyc1ttaW5vcl0pOwotICAgICAgICAgICAgICBpZiAoYnl0ZSAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAgIHByaW50aygiYnBwJWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgRUNQIGNoYW5uZWwgJXUgZnJvbSBkZXZpY2UuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yLCBieXRlICYgMHg3Zik7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbbWlub3JdLnJ1bl9sZW5ndGggPSBieXRlOwotICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5ydW5fZmxhZyA9IDE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEV2ZW50IDQ0OiBJIGdvdCBpdC4gKi8KLSAgICAgICAgICBzZXRfcGlucyhCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkF1dG9GZHxCUFBfUFBfblNlbGVjdEluLCBtaW5vcik7Ci0KLSAgICAgICAgICAgIC8qIFdhaXQgZm9yIGV2ZW50IDQ1OiBwZXJpcGhlcmFsIGhhbmRzaGFrZSAqLwotICAgICAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX25BY2ssIDAsIFRJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVUSU1FRE9VVDsKLQotICAgICAgICAgICAgIC8qIEV2ZW50IDQ2OiBGaW5pc2ggaGFuZHNoYWtlICovCi0gICAgICAgICAgc2V0X3BpbnMoQlBQX1BQX25TdHJvYmV8QlBQX1BQX25TZWxlY3RJbiwgbWlub3IpOwotCi0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIGNudCAtIHJlbWFpbmluZzsKLX0KLQotc3RhdGljIHNzaXplX3QgYnBwX3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgX191c2VyICpjLCBzaXplX3QgY250LCBsb2ZmX3QgKiBwcG9zKQotewotICAgICAgbG9uZyByYzsKLSAgICAgIHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotICAgICAgaWYgKG1pbm9yID49IEJQUF9OTykgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICBpZiAoIWluc3RhbmNlc1ttaW5vcl0ucHJlc2VudCkgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICAgIHN3aXRjaCAoaW5zdGFuY2VzW21pbm9yXS5tb2RlKSB7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBpZiAoaW5zdGFuY2VzW21pbm9yXS5tb2RlICE9IENPTVBBVElCSUxJVFkpCi0gICAgICAgICAgICB0ZXJtaW5hdGUobWlub3IpOwotCi0gICAgICAgICAgaWYgKGluc3RhbmNlc1ttaW5vcl0uZW5oYW5jZWQpIHsKLSAgICAgICAgICAgICAgLyogRm9yIG5vdywgZG8gYWxsIHJlYWRzIHdpdGggRUNQLVJMRSBtb2RlICovCi0gICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHBpbnM7Ci0KLSAgICAgICAgICAgICAgcmMgPSBuZWdvdGlhdGUoREVGQVVMVF9FQ1AsIG1pbm9yKTsKLSAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5tb2RlID0gRUNQX1JMRTsKLQotICAgICAgICAgICAgICAvKiBFdmVudCAzMDogc2V0IG5BdXRvRmQgbG93IHRvIHNldHVwIGZvciBFQ1AgbW9kZSAqLwotICAgICAgICAgICAgICBwaW5zID0gZ2V0X3BpbnMobWlub3IpOwotICAgICAgICAgICAgICBwaW5zICY9IH5CUFBfUFBfbkF1dG9GZDsKLSAgICAgICAgICAgICAgc2V0X3BpbnMocGlucywgbWlub3IpOwotCi0gICAgICAgICAgICAgIC8qIFdhaXQgZm9yIEV2ZW50IDMxOiBwZXJpcGhlcmFsIHJlYWR5ICovCi0gICAgICAgICAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX1BFcnJvciwgMCwgVElNRV9QUmVzcG9uc2UsIG1pbm9yKTsKLSAgICAgICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVUSU1FRE9VVDsKLQotICAgICAgICAgICAgICByYyA9IHJlYWRfZWNwKG1pbm9yLCBjLCBjbnQpOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmMgPSBuZWdvdGlhdGUoREVGQVVMVF9OSUJCTEUsIG1pbm9yKTsKLSAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5tb2RlID0gTklCQkxFOwotCi0gICAgICAgICAgICAgIHJjID0gcmVhZF9uaWJibGUobWlub3IsIGMsIGNudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTklCQkxFOgotICAgICAgICAgIHJjID0gcmVhZF9uaWJibGUobWlub3IsIGMsIGNudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBFQ1A6Ci0gICAgICAgIGNhc2UgRUNQX1JMRToKLSAgICAgICAgICByYyA9IHJlYWRfZWNwKG1pbm9yLCBjLCBjbnQpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIHJjOwotfQotCi0vKgotICogQ29tcGF0aWJpbGl0eSBtb2RlIGhhbmRzaGFraW5nIGlzIGEgbWF0dGVyIG9mIHdyaXRpbmcgZGF0YSwKLSAqIHN0cm9iaW5nIGl0LCBhbmQgd2FpdGluZyBmb3IgdGhlIHByaW50ZXIgdG8gc3RvcCBiZWluZyBidXN5LgotICovCi1zdGF0aWMgbG9uZyB3cml0ZV9jb21wYXQodW5zaWduZWQgbWlub3IsIGNvbnN0IGNoYXIgX191c2VyICpjLCB1bnNpZ25lZCBsb25nIGNudCkKLXsKLSAgICAgIGxvbmcgcmM7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBwaW5zID0gZ2V0X3BpbnMobWlub3IpOwotCi0gICAgICB1bnNpZ25lZCBsb25nIHJlbWFpbmluZyA9IGNudDsKLQotCi0gICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciBieXRlOwotCi0gICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYnl0ZSwgYykpCi0JCSAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgIGMgKz0gMTsKLQotICAgICAgICAgICAgcmMgPSB3YWl0X2ZvcihCUFBfR1BfbkFjaywgQlBQX0dQX0J1c3ksIFRJTUVfSURMRV9MSU1JVCwgbWlub3IpOwotICAgICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVUSU1FRE9VVDsKLQotICAgICAgICAgICAgYnBwX291dGJfcChieXRlLCBiYXNlX2FkZHJzW21pbm9yXSk7Ci0gICAgICAgICAgICByZW1haW5pbmcgLT0gMTsKLSAgICAgICAgICAvKiBzbm9vemUoMSwgbWlub3IpOyAqLwotCi0gICAgICAgICAgcGlucyAmPSB+QlBQX1BQX25TdHJvYmU7Ci0gICAgICAgICAgc2V0X3BpbnMocGlucywgbWlub3IpOwotCi0gICAgICAgICAgcmMgPSB3YWl0X2ZvcihCUFBfR1BfQnVzeSwgMCwgVElNRV9QUmVzcG9uc2UsIG1pbm9yKTsKLQotICAgICAgICAgIHBpbnMgfD0gQlBQX1BQX25TdHJvYmU7Ci0gICAgICAgICAgc2V0X3BpbnMocGlucywgbWlub3IpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gY250IC0gcmVtYWluaW5nOwotfQotCi0vKgotICogV3JpdGUgZGF0YSB1c2luZyBFQ1AgbW9kZS4gV2F0Y2ggb3V0IHRoYXQgdGhlIHBvcnQgbWF5IGJlIHNldCB1cAotICogZm9yIHJlYWRpbmcuIElmIHNvLCB0dXJuIHRoZSBwb3J0IGFyb3VuZC4KLSAqLwotc3RhdGljIGxvbmcgd3JpdGVfZWNwKHVuc2lnbmVkIG1pbm9yLCBjb25zdCBjaGFyIF9fdXNlciAqYywgdW5zaWduZWQgbG9uZyBjbnQpCi17Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBwaW5zID0gZ2V0X3BpbnMobWlub3IpOwotICAgICAgdW5zaWduZWQgbG9uZyByZW1haW5pbmcgPSBjbnQ7Ci0KLSAgICAgIGlmIChpbnN0YW5jZXNbbWlub3JdLmRpcmVjdGlvbikgewotICAgICAgICAgIGludCByYzsKLQotICAgICAgICAgICAgLyogRXZlbnQgNDcgUmVxdWVzdCBidXMgYmUgdHVybmVkIGFyb3VuZCAqLwotICAgICAgICAgIHBpbnMgfD0gQlBQX1BQX25Jbml0OwotICAgICAgICAgIHNldF9waW5zKHBpbnMsIG1pbm9yKTsKLQotICAgICAgICAgICAgLyogV2FpdCBmb3IgRXZlbnQgNDk6IFBlcmlwaGVyYWwgcmVsaW5xdWlzaGVkIGJ1cyAqLwotICAgICAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX1BFcnJvciwgMCwgVElNRV9QUmVzcG9uc2UsIG1pbm9yKTsKLQotICAgICAgICAgIHBpbnMgfD0gQlBQX1BQX25BdXRvRmQ7Ci0gICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5kaXJlY3Rpb24gPSAwOwotICAgICAgICAgIHNldF9waW5zKHBpbnMsIG1pbm9yKTsKLSAgICAgIH0KLQotICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0gICAgICAgICAgaW50IHJjOwotCi0gICAgICAgICAgaWYgKGdldF91c2VyKGJ5dGUsIGMpKQotCQkgIHJldHVybiAtRUZBVUxUOwotCi0gICAgICAgICAgcmMgPSB3YWl0X2ZvcigwLCBCUFBfR1BfQnVzeSwgVElNRV9QUmVzcG9uc2UsIG1pbm9yKTsKLSAgICAgICAgICBpZiAocmMgPT0gLTEpIHJldHVybiAtRVRJTUVET1VUOwotCi0gICAgICAgICAgYyArPSAxOwotCi0gICAgICAgICAgYnBwX291dGJfcChieXRlLCBiYXNlX2FkZHJzW21pbm9yXSk7Ci0KLSAgICAgICAgICBwaW5zICY9IH5CUFBfUFBfblN0cm9iZTsKLSAgICAgICAgICBzZXRfcGlucyhwaW5zLCBtaW5vcik7Ci0KLSAgICAgICAgICBwaW5zIHw9IEJQUF9QUF9uU3Ryb2JlOwotICAgICAgICAgIHJjID0gd2FpdF9mb3IoQlBQX0dQX0J1c3ksIDAsIFRJTUVfUFJlc3BvbnNlLCBtaW5vcik7Ci0gICAgICAgICAgaWYgKHJjID09IC0xKSByZXR1cm4gLUVJTzsKLQotICAgICAgICAgIHNldF9waW5zKHBpbnMsIG1pbm9yKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGNudCAtIHJlbWFpbmluZzsKLX0KLQotLyoKLSAqIFdyaXRlIHRvIHRoZSBwZXJpcGhlcmFsLiBCZSBzZW5zaXRpdmUgb2YgdGhlIGN1cnJlbnQgbW9kZS4gSWYgSSdtCi0gKiBpbiBhIG1vZGUgdGhhdCBjYW4gYmUgdHVybmVkIGFyb3VuZCAoRUNQKSB0aGVuIGp1c3QgZG8KLSAqIHRoYXQuIE90aGVyd2lzZSwgdGVybWluYXRlIGFuZCBkbyBteSB3cml0aW5nIGluIGNvbXBhdCBtb2RlLiBUaGlzCi0gKiBpcyB0aGUgc2FmZXN0IGNvdXJzZSBhcyBhbnkgZGV2aWNlIGNhbiBoYW5kbGUgaXQuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGJwcF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmMsIHNpemVfdCBjbnQsIGxvZmZfdCAqIHBwb3MpCi17Ci0gICAgICBsb25nIGVycm5vID0gMDsKLSAgICAgIHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotICAgICAgaWYgKG1pbm9yID49IEJQUF9OTykgcmV0dXJuIC1FTk9ERVY7Ci0gICAgICBpZiAoIWluc3RhbmNlc1ttaW5vcl0ucHJlc2VudCkgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICAgIHN3aXRjaCAoaW5zdGFuY2VzW21pbm9yXS5tb2RlKSB7Ci0KLSAgICAgICAgY2FzZSBFQ1A6Ci0gICAgICAgIGNhc2UgRUNQX1JMRToKLSAgICAgICAgICBlcnJubyA9IHdyaXRlX2VjcChtaW5vciwgYywgY250KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDT01QQVRJQklMSVRZOgotICAgICAgICAgIGVycm5vID0gd3JpdGVfY29tcGF0KG1pbm9yLCBjLCBjbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRlcm1pbmF0ZShtaW5vcik7Ci0gICAgICAgICAgZXJybm8gPSB3cml0ZV9jb21wYXQobWlub3IsIGMsIGNudCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBlcnJubzsKLX0KLQotc3RhdGljIGludCBicHBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGludCBjbWQsCi0JCSB1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICAgIGludCBlcnJubyA9IDA7Ci0KLSAgICAgIHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLSAgICAgIGlmIChtaW5vciA+PSBCUFBfTk8pIHJldHVybiAtRU5PREVWOwotICAgICAgaWYgKCFpbnN0YW5jZXNbbWlub3JdLnByZXNlbnQpIHJldHVybiAtRU5PREVWOwotCi0KLSAgICAgIHN3aXRjaCAoY21kKSB7Ci0KLSAgICAgICAgY2FzZSBCUFBfUFVUX1BJTlM6Ci0gICAgICAgICAgc2V0X3BpbnMoYXJnLCBtaW5vcik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCUFBfR0VUX1BJTlM6Ci0gICAgICAgICAgZXJybm8gPSBnZXRfcGlucyhtaW5vcik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCUFBfUFVUX0RBVEE6Ci0gICAgICAgICAgYnBwX291dGJfcChhcmcsIGJhc2VfYWRkcnNbbWlub3JdKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJQUF9HRVRfREFUQToKLSAgICAgICAgICBlcnJubyA9IGJwcF9pbmJfcChiYXNlX2FkZHJzW21pbm9yXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCUFBfU0VUX0lOUFVUOgotICAgICAgICAgIGlmIChhcmcpCi0gICAgICAgICAgICBpZiAoaW5zdGFuY2VzW21pbm9yXS5lbmhhbmNlZCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGJpdHMgPSBnZXRfcGlucyhtaW5vcik7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2VzW21pbm9yXS5kaXJlY3Rpb24gPSAweDIwOwotICAgICAgICAgICAgICAgIHNldF9waW5zKGJpdHMsIG1pbm9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAtRU5PVFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBiaXRzID0gZ2V0X3BpbnMobWlub3IpOwotICAgICAgICAgICAgICBpbnN0YW5jZXNbbWlub3JdLmRpcmVjdGlvbiA9IDB4MDA7Ci0gICAgICAgICAgICAgIHNldF9waW5zKGJpdHMsIG1pbm9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVycm5vID0gLUVJTlZBTDsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGVycm5vOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBicHBfZm9wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkucmVhZCA9CQlicHBfcmVhZCwKLQkud3JpdGUgPQlicHBfd3JpdGUsCi0JLmlvY3RsID0JYnBwX2lvY3RsLAotCS5vcGVuID0JCWJwcF9vcGVuLAotCS5yZWxlYXNlID0JYnBwX3JlbGVhc2UsCi19OwotCi0jaWYgZGVmaW5lZChfX2kzODZfXykKLQotI2RlZmluZSBjb2xsZWN0THB0UG9ydHMoKSAge30KLQotc3RhdGljIHZvaWQgcHJvYmVMcHRQb3J0KHVuc2lnbmVkIGlkeCkKLXsKLSAgICAgIHVuc2lnbmVkIGludCB0ZXN0dmFsdWU7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBscEFkZHIgPSBiYXNlX2FkZHJzW2lkeF07Ci0KLSAgICAgIGluc3RhbmNlc1tpZHhdLnByZXNlbnQgPSAwOwotICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQgPSAwOwotICAgICAgaW5zdGFuY2VzW2lkeF0uZGlyZWN0aW9uID0gMDsKLSAgICAgIGluc3RhbmNlc1tpZHhdLm1vZGUgPSBDT01QQVRJQklMSVRZOwotICAgICAgaW5zdGFuY2VzW2lkeF0ucnVuX2xlbmd0aCA9IDA7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fZmxhZyA9IDA7Ci0gICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGxwQWRkciwzLCBicHBfZGV2X25hbWUpKSByZXR1cm47Ci0KLSAgICAgIC8qCi0gICAgICAgKiBGaXJzdCwgbWFrZSBzdXJlIHRoZSBpbnN0YW5jZSBleGlzdHMuIERvIHRoaXMgYnkgd3JpdGluZyB0bwotICAgICAgICogdGhlIGRhdGEgbGF0Y2ggYW5kIHJlYWRpbmcgdGhlIHZhbHVlIGJhY2suIElmIHRoZSBwb3J0ICppcyoKLSAgICAgICAqIHByZXNlbnQsIHRlc3QgdG8gc2VlIGlmIGl0IHN1cHBvcnRzIGV4dGVuZGVkLW1vZGUKLSAgICAgICAqIG9wZXJhdGlvbi4gVGhpcyB3aWxsIGJlIHJlcXVpcmVkIGZvciBJRUVFMTI4NCByZXZlcnNlCi0gICAgICAgKiB0cmFuc2ZlcnMuCi0gICAgICAgKi8KLQotICAgICAgb3V0Yl9wKEJQUF9QUk9CRV9DT0RFLCBscEFkZHIpOwotICAgICAgZm9yICh0ZXN0dmFsdWU9MDsgdGVzdHZhbHVlPEJQUF9ERUxBWTsgdGVzdHZhbHVlKyspCi0gICAgICAgICAgICA7Ci0gICAgICB0ZXN0dmFsdWUgPSBpbmJfcChscEFkZHIpOwotICAgICAgaWYgKHRlc3R2YWx1ZSA9PSBCUFBfUFJPQkVfQ09ERSkgewotICAgICAgICAgICAgdW5zaWduZWQgc2F2ZTsKLSAgICAgICAgICAgIGluc3RhbmNlc1tpZHhdLnByZXNlbnQgPSAxOwotCi0gICAgICAgICAgICBzYXZlID0gaW5iX3AobHBBZGRyKzIpOwotICAgICAgICAgICAgZm9yICh0ZXN0dmFsdWU9MDsgdGVzdHZhbHVlPEJQUF9ERUxBWTsgdGVzdHZhbHVlKyspCi0gICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBvdXRiX3Aoc2F2ZXwweDIwLCBscEFkZHIrMik7Ci0gICAgICAgICAgICBmb3IgKHRlc3R2YWx1ZT0wOyB0ZXN0dmFsdWU8QlBQX0RFTEFZOyB0ZXN0dmFsdWUrKykKLSAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIG91dGJfcCh+QlBQX1BST0JFX0NPREUsIGxwQWRkcik7Ci0gICAgICAgICAgICBmb3IgKHRlc3R2YWx1ZT0wOyB0ZXN0dmFsdWU8QlBQX0RFTEFZOyB0ZXN0dmFsdWUrKykKLSAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIHRlc3R2YWx1ZSA9IGluYl9wKGxwQWRkcik7Ci0gICAgICAgICAgICBpZiAoKHRlc3R2YWx1ZSYweGZmKSA9PSAoMHhmZiZ+QlBQX1BST0JFX0NPREUpKQotICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQgPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQgPSAxOwotICAgICAgICAgICAgb3V0Yl9wKHNhdmUsIGxwQWRkcisyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24obHBBZGRyLDMpOwotICAgICAgfQotICAgICAgLyoKLSAgICAgICAqIExlYXZlIHRoZSBwb3J0IGluIGNvbXBhdCBpZGxlIG1vZGUuCi0gICAgICAgKi8KLSAgICAgIHNldF9waW5zKEJQUF9QUF9uQXV0b0ZkfEJQUF9QUF9uU3Ryb2JlfEJQUF9QUF9uSW5pdCwgaWR4KTsKLQotICAgICAgcHJpbnRrKCJicHAlZDogUG9ydCBhdCAweCUwM3g6IEVuaGFuY2VkIG1vZGUgJXNcbiIsIGlkeCwgYmFzZV9hZGRyc1tpZHhdLAotICAgICAgICAgICAgaW5zdGFuY2VzW2lkeF0uZW5oYW5jZWQ/ICJTVVBQT1JURUQiIDogIlVOQVZBSUxBQkxFIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlTHB0UG9ydChpbnQgaWR4KQotewotICAgICAgcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyc1tpZHhdLCAzKTsKLX0KLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykKLQotc3RhdGljIHZvaWQgX19pb21lbSAqbWFwX2JwcChzdHJ1Y3Qgc2J1c19kZXYgKmRldiwgaW50IGlkeCkKLXsKLSAgICAgIHJldHVybiBzYnVzX2lvcmVtYXAoJmRldi0+cmVzb3VyY2VbMF0sIDAsIEJQUF9TSVpFLCAiYnBwIik7Ci19Ci0KLXN0YXRpYyBpbnQgY29sbGVjdExwdFBvcnRzKHZvaWQpCi17Ci0Jc3RydWN0IHNidXNfYnVzICpidXM7Ci0Jc3RydWN0IHNidXNfZGV2ICpkZXY7Ci0JaW50IGNvdW50OwotCi0JY291bnQgPSAwOwotCWZvcl9hbGxfc2J1c2RldihkZXYsIGJ1cykgewotCQlpZiAoc3RyY21wKGRldi0+cHJvbV9uYW1lLCAiU1VOVyxicHAiKSA9PSAwKSB7Ci0JCQlpZiAoY291bnQgPj0gQlBQX05PKSB7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkJICAgICAgICJicHA6IE1vcmUgdGhhbiAlZCBicHAgcG9ydHMsIgotCQkJCSAgICAgICAiIHJlc3QgaXMgaWdub3JlZFxuIiwgQlBQX05PKTsKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQl9Ci0JCQliYXNlX2FkZHJzW2NvdW50XSA9IG1hcF9icHAoZGV2LCBjb3VudCk7Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHZvaWQgcHJvYmVMcHRQb3J0KHVuc2lnbmVkIGlkeCkKLXsKLSAgICAgIHZvaWQgX19pb21lbSAqcnAgPSBiYXNlX2FkZHJzW2lkeF07Ci0gICAgICBfX3UzMiBjc3I7Ci0gICAgICBjaGFyICpicmFuZDsKLQotICAgICAgaW5zdGFuY2VzW2lkeF0ucHJlc2VudCA9IDA7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS5lbmhhbmNlZCA9IDA7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS5kaXJlY3Rpb24gPSAwOwotICAgICAgaW5zdGFuY2VzW2lkeF0ubW9kZSA9IENPTVBBVElCSUxJVFk7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fbGVuZ3RoID0gMDsKLSAgICAgIGluc3RhbmNlc1tpZHhdLnJ1bl9mbGFnID0gMDsKLQotICAgICAgaWYgKCFycCkgcmV0dXJuOwotCi0gICAgICBpbnN0YW5jZXNbaWR4XS5wcmVzZW50ID0gMTsKLSAgICAgIGluc3RhbmNlc1tpZHhdLmVuaGFuY2VkID0gMTsgICAvKiBTdXJlICovCi0KLSAgICAgIGNzciA9IHNidXNfcmVhZGwocnAgKyBCUFBfQ1NSKTsKLSAgICAgIGlmICgoY3NyICYgUF9EUkFJTklORykgIT0gMCAmJiAoY3NyICYgUF9FUlJfUEVORCkgPT0gMCkgewotICAgICAgICAgICAgdWRlbGF5KDIwKTsKLSAgICAgICAgICAgIGNzciA9IHNidXNfcmVhZGwocnAgKyBCUFBfQ1NSKTsKLSAgICAgICAgICAgIGlmICgoY3NyICYgUF9EUkFJTklORykgIT0gMCAmJiAoY3NyICYgUF9FUlJfUEVORCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgcHJpbnRrKCJicHAlZDogRFJBSU5JTkcgc3RpbGwgYWN0aXZlICgweCUwOHgpXG4iLCBpZHgsIGNzcik7Ci0gICAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcmludGsoImJwcCVkOiByZXNldCB3aXRoIDB4JTA4eCAuLiIsIGlkeCwgY3NyKTsKLSAgICAgIHNidXNfd3JpdGVsKChjc3IgfCBQX1JFU0VUKSAmIH5QX0lOVF9FTiwgcnAgKyBCUFBfQ1NSKTsKLSAgICAgIHVkZWxheSg1MDApOwotICAgICAgc2J1c193cml0ZWwoc2J1c19yZWFkbChycCArIEJQUF9DU1IpICYgflBfUkVTRVQsIHJwICsgQlBQX0NTUik7Ci0gICAgICBjc3IgPSBzYnVzX3JlYWRsKHJwICsgQlBQX0NTUik7Ci0gICAgICBwcmludGsoIiBkb25lIHdpdGggY3NyPTB4JTA4eCBvY3I9MHglMDR4XG4iLAotICAgICAgICAgY3NyLCBzYnVzX3JlYWR3KHJwICsgQlBQX09DUikpOwotCi0gICAgICBzd2l0Y2ggKGNzciAmIFBfREVWX0lEX01BU0spIHsKLSAgICAgIGNhc2UgUF9ERVZfSURfWkVCUkE6Ci0gICAgICAgICAgICBicmFuZCA9ICJaZWJyYSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUF9ERVZfSURfTDY0ODU0OgotICAgICAgICAgICAgYnJhbmQgPSAiRE1BMiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmFuZCA9ICJVbmtub3duIjsKLSAgICAgIH0KLSAgICAgIHByaW50aygiYnBwJWQ6ICVzIGF0ICVwXG4iLCBpZHgsIGJyYW5kLCBycCk7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBMZWF2ZSB0aGUgcG9ydCBpbiBjb21wYXQgaWRsZSBtb2RlLgotICAgICAgICovCi0gICAgICBzZXRfcGlucyhCUFBfUFBfbkF1dG9GZHxCUFBfUFBfblN0cm9iZXxCUFBfUFBfbkluaXQsIGlkeCk7Ci0KLSAgICAgIHJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVMcHRQb3J0KGludCBpZHgpCi17Ci0gICAgICBzYnVzX2lvdW5tYXAoYmFzZV9hZGRyc1tpZHhdLCBCUFBfU0laRSk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBicHBfaW5pdCh2b2lkKQotewotCWludCByYzsKLQl1bnNpZ25lZCBpZHg7Ci0KLQlyYyA9IGNvbGxlY3RMcHRQb3J0cygpOwotCWlmIChyYyA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJjID0gcmVnaXN0ZXJfY2hyZGV2KEJQUF9NQUpPUiwgYnBwX2Rldl9uYW1lLCAmYnBwX2ZvcHMpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgQlBQX05POyBpZHgrKykgewotCQlpbnN0YW5jZXNbaWR4XS5vcGVuZWQgPSAwOwotCQlwcm9iZUxwdFBvcnQoaWR4KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGJwcF9jbGVhbnVwKHZvaWQpCi17Ci0JdW5zaWduZWQgaWR4OwotCi0JdW5yZWdpc3Rlcl9jaHJkZXYoQlBQX01BSk9SLCBicHBfZGV2X25hbWUpOwotCi0JZm9yIChpZHggPSAwOyAgaWR4IDwgQlBQX05POyBpZHgrKykgewotCQlpZiAoaW5zdGFuY2VzW2lkeF0ucHJlc2VudCkKLQkJCWZyZWVMcHRQb3J0KGlkeCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChicHBfaW5pdCk7Ci1tb2R1bGVfZXhpdChicHBfY2xlYW51cCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FiZmRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDg1OCArMCwwIEBACi0vKiBjcHdhdGNoZG9nLmMgLSBkcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIGhhcmR3YXJlIHdhdGNoZG9nCi0gKiB0aW1lcnMgZm91bmQgb24gU3VuIE1pY3Jvc3lzdGVtcyBDUDE0MDAgYW5kIENQMTUwMCBib2FyZHMuCi0gKgotICogVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCB0aGUgZ2VuZXJpYyBMaW51eCB3YXRjaGRvZyAKLSAqIGludGVyZmFjZSBhbmQgU29sYXJpcy1jb21wYXRpYmxlIGlvY3RscyBhcyBiZXN0IGl0IGlzCi0gKiBhYmxlLgotICoKLSAqIE5PVEU6IAlDUDE0MDAgc3lzdGVtcyBhcHBlYXIgdG8gaGF2ZSBhIGRlZmVjdGl2ZSBpbnRyX21hc2sKLSAqIAkJCXJlZ2lzdGVyIG9uIHRoZSBQTEQsIHByZXZlbnRpbmcgdGhlIGRpc2FibGluZyBvZgotICogCQkJdGltZXIgaW50ZXJydXB0cy4gIFdlIHVzZSBhIHRpbWVyIHRvIHBlcmlvZGljYWxseSAKLSAqIAkJCXJlc2V0ICdzdG9wcGVkJyB3YXRjaGRvZ3Mgb24gYWZmZWN0ZWQgcGxhdGZvcm1zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBFcmljIEJyb3dlciAoZWJyb3dlckB1c2EubmV0KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vd2F0Y2hkb2cuaD4KLQotI2RlZmluZSBXRF9PQlBOQU1FCSJ3YXRjaGRvZyIKLSNkZWZpbmUgV0RfQkFETU9ERUwgIlNVTlcsNTAxLTUzMzYiCi0jZGVmaW5lIFdEX0JUSU1FT1VUCShqaWZmaWVzICsgKEhaICogMTAwMCkpCi0jZGVmaW5lIFdEX0JMSU1JVAkweEZGRkYKLQotI2RlZmluZSBXRDBfREVWTkFNRSAid2F0Y2hkb2cwIgotI2RlZmluZSBXRDFfREVWTkFNRSAid2F0Y2hkb2cxIgotI2RlZmluZSBXRDJfREVWTkFNRSAid2F0Y2hkb2cyIgotCi0jZGVmaW5lIFdEMF9NSU5PUgkyMTIKLSNkZWZpbmUgV0QxX01JTk9SCTIxMwkKLSNkZWZpbmUgV0QyX01JTk9SCTIxNAkKLQotCi0vKiBJbnRlcm5hbCBkcml2ZXIgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBXRDBfSUQJCQkwCQkvKiBXYXRjaGRvZzAJCQkJCQkqLwotI2RlZmluZSBXRDFfSUQJCQkxCQkvKiBXYXRjaGRvZzEJCQkJCQkqLwotI2RlZmluZSBXRDJfSUQJCQkyCQkvKiBXYXRjaGRvZzIJCQkJCQkqLwotI2RlZmluZSBXRF9OVU1ERVZTCQkzCQkvKiBEZXZpY2UgY29udGFpbnMgMyB0aW1lcnMJCQkqLwotCi0jZGVmaW5lIFdEX0lOVFJfT0ZGCQkwCQkvKiBJbnRlcnJ1cHQgZGlzYWJsZSB2YWx1ZQkJCSovCi0jZGVmaW5lIFdEX0lOVFJfT04JCTEJCS8qIEludGVycnVwdCBlbmFibGUgdmFsdWUJCQkqLwotCi0jZGVmaW5lIFdEX1NUQVRfSU5JVAkweDAxCS8qIFdhdGNoZG9nIHRpbWVyIGlzIGluaXRpYWxpemVkCSovCi0jZGVmaW5lIFdEX1NUQVRfQlNUT1AJMHgwMgkvKiBXYXRjaGRvZyB0aW1lciBpcyBicm9rZW5zdG9wcGVkCSovCi0jZGVmaW5lIFdEX1NUQVRfU1ZDRAkweDA0CS8qIFdhdGNoZG9nIGludGVycnVwdCBvY2N1cnJlZAkJKi8KLQotLyogUmVnaXN0ZXIgdmFsdWUgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBXRDBfSU5UUl9NQVNLCTB4MDEJLyogV2F0Y2hkb2cgZGV2aWNlIGludGVycnVwdCBtYXNrcwkqLwotI2RlZmluZSBXRDFfSU5UUl9NQVNLCTB4MDIKLSNkZWZpbmUgV0QyX0lOVFJfTUFTSwkweDA0Ci0KLSNkZWZpbmUgV0RfU19SVU5OSU5HCTB4MDEJLyogV2F0Y2hkb2cgZGV2aWNlIHN0YXR1cyBydW5uaW5nCSovCi0jZGVmaW5lIFdEX1NfRVhQSVJFRAkweDAyCS8qIFdhdGNoZG9nIGRldmljZSBzdGF0dXMgZXhwaXJlZAkqLwotCi0vKiBTdW4gdXNlcyBBbHRlcmEgUExEIEVQRjg4MjBBVEMxNDQtNCAKLSAqIHByb3ZpZGluZyB0aHJlZSBoYXJkd2FyZSB3YXRjaGRvZ3M6Ci0gKgotICogCTEpIFJJQyAtIHNlbmRzIGFuIGludGVycnVwdCB3aGVuIHRyaWdnZXJlZAotICogCTIpIFhJUiAtIGFzc2VydHMgWElSX0JfUkVTRVQgd2hlbiB0cmlnZ2VyZWQsIHJlc2V0cyBDUFUKLSAqIAkzKSBQT1IgLSBhc3NlcnRzIFBPUl9CX1JFU0VUIHdoZW4gdHJpZ2dlcmVkLCByZXNldHMgQ1BVLCBiYWNrcGxhbmUsIGJvYXJkCi0gKgotICoqKiBUaW1lciByZWdpc3RlciBibG9jayBkZWZpbml0aW9uIChzdHJ1Y3Qgd2RfdGltZXJfcmVnYmxrKQotICoKLSAqIGRjbnRyIGFuZCBsaW1pdCByZWdpc3RlcnMgKGhhbGZ3b3JkIGFjY2Vzcyk6ICAgICAgCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IDE1IHwgLi4ufCAxIHwgMCB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8LSAgY291bnRlciB2YWwgIC18Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBkY250ciAtIAlDdXJyZW50IDE2LWJpdCBkb3duY291bnRlciB2YWx1ZS4KLSAqIAkJCVdoZW4gZG93bmNvdW50ZXIgcmVhY2hlcyAnMCcgd2F0Y2hkb2cgZXhwaXJlcy4KLSAqIAkJCVJlYWRpbmcgdGhpcyByZWdpc3RlciByZXNldHMgZG93bmNvdW50ZXIgd2l0aCAnbGltaXQnIHZhbHVlLgotICogbGltaXQgLSAJMTYtYml0IGNvdW50ZG93biB2YWx1ZSBpbiAxLzEwdGggc2Vjb25kIGluY3JlbWVudHMuCi0gKiAJCQlXcml0aW5nIHRoaXMgcmVnaXN0ZXIgYmVnaW5zIGNvdW50ZG93biB3aXRoIGlucHV0IHZhbHVlLgotICogCQkJUmVhZGluZyBmcm9tIHRoaXMgcmVnaXN0ZXIgZG9lcyBub3QgYWZmZWN0IGNvdW50ZXIuCi0gKiBOT1RFUzoJQWZ0ZXIgd2F0Y2hkb2cgcmVzZXQsIGRjbnRyIGFuZCBsaW1pdCBjb250YWluICcxJwotICoKLSAqIHN0YXR1cyByZWdpc3RlciAoYnl0ZSBhY2Nlc3MpOgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IDcgfCAuLi4gfCAyIHwgIDEgIHwgIDAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQotICogfC0gICBVTlVTRUQgIC18IEVYUCB8IFJVTiB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHN0YXR1cy0JQml0IDAgLSBXYXRjaGRvZyBpcyBydW5uaW5nCi0gKiAJCQlCaXQgMSAtIFdhdGNoZG9nIGhhcyBleHBpcmVkCi0gKgotICoqKiBQTEQgcmVnaXN0ZXIgYmxvY2sgZGVmaW5pdGlvbiAoc3RydWN0IHdkX3BsZF9yZWdibGspCi0gKgotICogaW50cl9tYXNrIHJlZ2lzdGVyIChieXRlIGFjY2Vzcyk6Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgNyB8IC4uLiB8IDMgfCAgMiAgfCAgMSAgfCAgMCAgfAotICogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8LSAgIFVOVVNFRCAgLXwgV0QzIHwgV0QyIHwgV0QxIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogV0QzIC0gIDEgPT0gSW50ZXJydXB0IGRpc2FibGVkIGZvciB3YXRjaGRvZyAzCi0gKiBXRDIgLSAgMSA9PSBJbnRlcnJ1cHQgZGlzYWJsZWQgZm9yIHdhdGNoZG9nIDIKLSAqIFdEMSAtICAxID09IEludGVycnVwdCBkaXNhYmxlZCBmb3Igd2F0Y2hkb2cgMQotICoKLSAqIHBsZF9zdGF0dXMgcmVnaXN0ZXIgKGJ5dGUgYWNjZXNzKToKLSAqIFVOS05PV04sIE1BR0lDQUwgTVlTVEVSWSBSRUdJU1RFUgotICoKLSAqLwotI2RlZmluZSBXRF9USU1FUl9SRUdTWgkxNgotI2RlZmluZSBXRDBfT0ZGCQkwCi0jZGVmaW5lIFdEMV9PRkYJCShXRF9USU1FUl9SRUdTWiAqIDEpCi0jZGVmaW5lIFdEMl9PRkYJCShXRF9USU1FUl9SRUdTWiAqIDIpCi0jZGVmaW5lIFBMRF9PRkYJCShXRF9USU1FUl9SRUdTWiAqIDMpCi0KLSNkZWZpbmUgV0RfRENOVFIJMHgwMAotI2RlZmluZSBXRF9MSU1JVAkweDA0Ci0jZGVmaW5lIFdEX1NUQVRVUwkweDA4Ci0KLSNkZWZpbmUgUExEX0lNQVNLCShQTERfT0ZGICsgMHgwMCkKLSNkZWZpbmUgUExEX1NUQVRVUwkoUExEX09GRiArIDB4MDQpCi0KLS8qIEluZGl2aWR1YWwgdGltZXIgc3RydWN0dXJlIAotICovCi1zdHJ1Y3Qgd2RfdGltZXIgewotCV9fdTE2CQkJdGltZW91dDsKLQlfX3U4CQkJaW50cl9tYXNrOwotCXVuc2lnbmVkIGNoYXIJCXJ1bnN0YXR1czsKLQl2b2lkIF9faW9tZW0JCSpyZWdzOwotfTsKLQotLyogRGV2aWNlIHN0cnVjdHVyZQotICovCi1zdHJ1Y3Qgd2RfZGV2aWNlIHsKLQlpbnQJCQkJaXJxOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JdW5zaWduZWQgY2hhcglpc2JhZGRvZ2dpZTsJLyogZGVmZWN0aXZlIFBMRCAqLwotCXVuc2lnbmVkIGNoYXIJb3B0X2VuYWJsZTsKLQl1bnNpZ25lZCBjaGFyCW9wdF9yZWJvb3Q7Ci0JdW5zaWduZWQgc2hvcnQJb3B0X3RpbWVvdXQ7Ci0JdW5zaWduZWQgY2hhcglpbml0aWFsaXplZDsKLQlzdHJ1Y3Qgd2RfdGltZXIJd2F0Y2hkb2dbV0RfTlVNREVWU107Ci0Jdm9pZCBfX2lvbWVtCSpyZWdzOwotfTsKLQotc3RhdGljIHN0cnVjdCB3ZF9kZXZpY2Ugd2RfZGV2ID0geyAKLQkJMCwgX19TUElOX0xPQ0tfVU5MT0NLRUQod2RfZGV2LmxvY2spLCAwLCAwLCAwLCAwLAotfTsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdkX3RpbWVyOwotCi1zdGF0aWMgaW50IHdkMF90aW1lb3V0ID0gMDsKLXN0YXRpYyBpbnQgd2QxX3RpbWVvdXQgPSAwOwotc3RhdGljIGludCB3ZDJfdGltZW91dCA9IDA7Ci0KLSNpZmRlZiBNT0RVTEUKLW1vZHVsZV9wYXJhbQkod2QwX3RpbWVvdXQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkMF90aW1lb3V0LCAiRGVmYXVsdCB3YXRjaGRvZzAgdGltZW91dCBpbiAxLzEwc2VjcyIpOwotbW9kdWxlX3BhcmFtIAkod2QxX3RpbWVvdXQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkMV90aW1lb3V0LCAiRGVmYXVsdCB3YXRjaGRvZzEgdGltZW91dCBpbiAxLzEwc2VjcyIpOwotbW9kdWxlX3BhcmFtIAkod2QyX3RpbWVvdXQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkMl90aW1lb3V0LCAiRGVmYXVsdCB3YXRjaGRvZzIgdGltZW91dCBpbiAxLzEwc2VjcyIpOwotCi1NT0RVTEVfQVVUSE9SCi0JKCJFcmljIEJyb3dlciA8ZWJyb3dlckB1c2EubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OCi0JKCJIYXJkd2FyZSB3YXRjaGRvZyBkcml2ZXIgZm9yIFN1biBNaWNyb3N5c3RlbXMgQ1AxNDAwLzE1MDAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFCi0JKCJ3YXRjaGRvZyIpOwotI2VuZGlmIC8qIGlmZGVmIE1PRFVMRSAqLwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBtZXRob2RzCi0gKi8KLSNpZmRlZiBXRF9ERUJVRwotc3RhdGljIHZvaWQgd2RfZHVtcHJlZ3Modm9pZCk7Ci0jZW5kaWYKLXN0YXRpYyBpcnFyZXR1cm5fdCB3ZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyB2b2lkIHdkX3RvZ2dsZWludHIoc3RydWN0IHdkX3RpbWVyKiBwVGltZXIsIGludCBlbmFibGUpOwotc3RhdGljIHZvaWQgd2RfcGluZ3RpbWVyKHN0cnVjdCB3ZF90aW1lciogcFRpbWVyKTsKLXN0YXRpYyB2b2lkIHdkX3N0YXJ0dGltZXIoc3RydWN0IHdkX3RpbWVyKiBwVGltZXIpOwotc3RhdGljIHZvaWQgd2RfcmVzZXRicm9rZW50aW1lcihzdHJ1Y3Qgd2RfdGltZXIqIHBUaW1lcik7Ci1zdGF0aWMgdm9pZCB3ZF9zdG9wdGltZXIoc3RydWN0IHdkX3RpbWVyKiBwVGltZXIpOwotc3RhdGljIHZvaWQgd2RfYnJva2VudGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyBpbnQgIHdkX2dldHN0YXR1cyhzdHJ1Y3Qgd2RfdGltZXIqIHBUaW1lcik7Ci0KLS8qIFBMRCBleHBlY3RzIHdvcmRzIHRvIGJlIHdyaXR0ZW4gaW4gTFNCIGZvcm1hdCwKLSAqIHNvIHdlIG11c3QgZmxpcCBhbGwgd29yZHMgcHJpb3IgdG8gd3JpdGluZyB0aGVtIHRvIHJlZ3MKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBmbGlwX3dvcmQodW5zaWduZWQgc2hvcnQgd29yZCkKLXsKLQlyZXR1cm4gKCh3b3JkICYgMHhmZikgPDwgOCkgfCAoKHdvcmQgPj4gOCkgJiAweGZmKTsKLX0KLQotI2RlZmluZSB3ZF93cml0ZXcodmFsLCBhZGRyKSAJKHdyaXRldyhmbGlwX3dvcmQodmFsKSwgYWRkcikpCi0jZGVmaW5lIHdkX3JlYWR3KGFkZHIpIAkJCShmbGlwX3dvcmQocmVhZHcoYWRkcikpKQotI2RlZmluZSB3ZF93cml0ZWIodmFsLCBhZGRyKSAJKHdyaXRlYih2YWwsIGFkZHIpKQotI2RlZmluZSB3ZF9yZWFkYihhZGRyKSAJCQkocmVhZGIoYWRkcikpCi0KLQotLyogQ1AxNDAwcyBzZWVtIHRvIGhhdmUgYnJva2VuIFBMRCBpbXBsZW1lbnRhdGlvbnMtLQotICogdGhlIGludGVycnVwdF9tYXNrIHJlZ2lzdGVyIGNhbm5vdCBiZSB3cml0dGVuLCBzbwotICogbm8gdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgbWFza2VkIHdpdGhpbiB0aGUgUExELgotICovCi1zdGF0aWMgaW5saW5lIGludCB3ZF9pc2Jyb2tlbih2b2lkKQotewotCS8qIHdlIGNvdWxkIHRlc3QgdGhpcyBieSByZWFkL3dyaXRlL3JlYWQvcmVzdG9yZQotCSAqIG9uIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciBvbmx5IGlmIE9CUAotCSAqICd3YXRjaGRvZy1lbmFibGU/JyA9PSBGQUxTRSwgYnV0IGl0IHNlZW1zIAotCSAqIHViaXF1aXRvdXMgb24gQ1AxNDAwcwotCSAqLwotCWNoYXIgdmFsWzMyXTsKLQlwcm9tX2dldHByb3BlcnR5KHByb21fcm9vdF9ub2RlLCAibW9kZWwiLCB2YWwsIHNpemVvZih2YWwpKTsKLQlyZXR1cm4oKCFzdHJjbXAodmFsLCBXRF9CQURNT0RFTCkpID8gMSA6IDApOwotfQotCQkKLS8qIFJldHJpZXZlIHdhdGNoZG9nLWVuYWJsZT8gb3B0aW9uIGZyb20gT0JQCi0gKiBSZXR1cm5zIDAgaWYgZmFsc2UsIDEgaWYgdHJ1ZQotICovCi1zdGF0aWMgaW5saW5lIGludCB3ZF9vcHRfZW5hYmxlKHZvaWQpCi17Ci0JaW50IG9wdF9ub2RlOwotCi0Jb3B0X25vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQlvcHRfbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mob3B0X25vZGUsICJvcHRpb25zIik7Ci0JcmV0dXJuKCgtMSA9PSBwcm9tX2dldGludChvcHRfbm9kZSwgIndhdGNoZG9nLWVuYWJsZT8iKSkgPyAwIDogMSk7Ci19Ci0KLS8qIFJldHJpZXZlIHdhdGNoZG9nLXJlYm9vdD8gb3B0aW9uIGZyb20gT0JQCi0gKiBSZXR1cm5zIDAgaWYgZmFsc2UsIDEgaWYgdHJ1ZQotICovCi1zdGF0aWMgaW5saW5lIGludCB3ZF9vcHRfcmVib290KHZvaWQpCi17Ci0JaW50IG9wdF9ub2RlOwotCi0Jb3B0X25vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQlvcHRfbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mob3B0X25vZGUsICJvcHRpb25zIik7Ci0JcmV0dXJuKCgtMSA9PSBwcm9tX2dldGludChvcHRfbm9kZSwgIndhdGNoZG9nLXJlYm9vdD8iKSkgPyAwIDogMSk7Ci19Ci0KLS8qIFJldHJpZXZlIHdhdGNoZG9nLXRpbWVvdXQgb3B0aW9uIGZyb20gT0JQCi0gKiBSZXR1cm5zIE9CUCB2YWx1ZSwgb3IgMCBpZiBub3QgbG9jYXRlZAotICovCi1zdGF0aWMgaW5saW5lIGludCB3ZF9vcHRfdGltZW91dCh2b2lkKQotewotCWludCBvcHRfbm9kZTsKLQljaGFyIHZhbHVlWzMyXTsKLQljaGFyICpwID0gdmFsdWU7Ci0KLQlvcHRfbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwotCW9wdF9ub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhvcHRfbm9kZSwgIm9wdGlvbnMiKTsKLQlvcHRfbm9kZSA9IHByb21fZ2V0cHJvcGVydHkob3B0X25vZGUsIAotCQkJCQkJCQkid2F0Y2hkb2ctdGltZW91dCIsIAotCQkJCQkJCQl2YWx1ZSwgCi0JCQkJCQkJCXNpemVvZih2YWx1ZSkpOwotCWlmKC0xICE9IG9wdF9ub2RlKSB7Ci0JCS8qIGF0b2kgaW1wbGVtZW50YXRpb24gKi8KLQkJZm9yKG9wdF9ub2RlID0gMDsgLyogbm9wICovOyBwKyspIHsKLQkJCWlmKCpwID49ICcwJyAmJiAqcCA8PSAnOScpIHsKLQkJCQlvcHRfbm9kZSA9ICgxMCpvcHRfbm9kZSkrKCpwLScwJyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4oKC0xID09IG9wdF9ub2RlKSA/ICgwKSA6IChvcHRfbm9kZSkpOyAKLX0KLQotc3RhdGljIGludCB3ZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQotewotCWxvY2tfa2VybmVsKCk7Ci0Jc3dpdGNoKGltaW5vcihpbm9kZSkpCi0JewotCQljYXNlIFdEMF9NSU5PUjoKLQkJCWYtPnByaXZhdGVfZGF0YSA9ICZ3ZF9kZXYud2F0Y2hkb2dbV0QwX0lEXTsKLQkJCWJyZWFrOwotCQljYXNlIFdEMV9NSU5PUjoKLQkJCWYtPnByaXZhdGVfZGF0YSA9ICZ3ZF9kZXYud2F0Y2hkb2dbV0QxX0lEXTsKLQkJCWJyZWFrOwotCQljYXNlIFdEMl9NSU5PUjoKLQkJCWYtPnByaXZhdGVfZGF0YSA9ICZ3ZF9kZXYud2F0Y2hkb2dbV0QyX0lEXTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJcmV0dXJuKC1FTk9ERVYpOwotCX0KLQotCS8qIFJlZ2lzdGVyIElSUSBvbiBmaXJzdCBvcGVuIG9mIGRldmljZSAqLwotCWlmKDAgPT0gd2RfZGV2LmluaXRpYWxpemVkKQotCXsJCi0JCWlmIChyZXF1ZXN0X2lycSh3ZF9kZXYuaXJxLCAKLQkJCQkJCSZ3ZF9pbnRlcnJ1cHQsIAotCQkJCQkJSVJRRl9TSEFSRUQsCi0JCQkJCQlXRF9PQlBOQU1FLAotCQkJCQkJKHZvaWQgKil3ZF9kZXYucmVncykpIHsKLQkJCXByaW50aygiJXM6IENhbm5vdCByZWdpc3RlciBJUlEgJWRcbiIsIAotCQkJCVdEX09CUE5BTUUsIHdkX2Rldi5pcnEpOwotCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJcmV0dXJuKC1FQlVTWSk7Ci0JCX0KLQkJd2RfZGV2LmluaXRpYWxpemVkID0gMTsKLQl9Ci0KLQl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuKG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGYpKTsKLX0KLQotc3RhdGljIGludCB3ZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKLQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgCXNldG9wdCAJCQkJPSAwOwotCXN0cnVjdCAJd2RfdGltZXIqIHBUaW1lciAJPSAoc3RydWN0IHdkX3RpbWVyKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0Jc3RydWN0IAl3YXRjaGRvZ19pbmZvIGluZm8gCT0gewotCQkwLAotCQkwLAotCQkiQWx0ZXJhIEVQRjg4MjBBVEMxNDQtNCIKLQl9OwotCi0JaWYoTlVMTCA9PSBwVGltZXIpIHsKLQkJcmV0dXJuKC1FSU5WQUwpOwotCX0KLQotCXN3aXRjaChjbWQpCi0JewotCQkvKiBHZW5lcmljIExpbnV4IElPQ1RMcyAqLwotCQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbykpKSB7Ci0JCQkJcmV0dXJuKC1FRkFVTFQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6Ci0JCQlpZiAocHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKilhcmdwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJCXdkX3Bpbmd0aW1lcihwVGltZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzZXRvcHQsIGFyZ3AsIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJaWYoc2V0b3B0ICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKLQkJCQlpZih3ZF9kZXYub3B0X2VuYWJsZSkgewotCQkJCQlwcmludGsoCi0JCQkJCQkiJXM6IGNhbm5vdCBkaXNhYmxlIHdhdGNoZG9nIGluIEVOQUJMRUQgbW9kZVxuIiwKLQkJCQkJCVdEX09CUE5BTUUpOwotCQkJCQlyZXR1cm4oLUVJTlZBTCk7Ci0JCQkJfQotCQkJCXdkX3N0b3B0aW1lcihwVGltZXIpOwotCQkJfQotCQkJZWxzZSBpZihzZXRvcHQgJiBXRElPU19FTkFCTEVDQVJEKSB7Ci0JCQkJd2Rfc3RhcnR0aW1lcihwVGltZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuKC1FSU5WQUwpOwotCQkJfQkKLQkJCWJyZWFrOwotCQkvKiBTb2xhcmlzLWNvbXBhdGlibGUgSU9DVExzICovCi0JCWNhc2UgV0lPQ0dTVEFUOgotCQkJc2V0b3B0ID0gd2RfZ2V0c3RhdHVzKHBUaW1lcik7Ci0JCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJnNldG9wdCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7Ci0JCQkJcmV0dXJuKC1FRkFVTFQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0lPQ1NUQVJUOgotCQkJd2Rfc3RhcnR0aW1lcihwVGltZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0lPQ1NUT1A6Ci0JCQlpZih3ZF9kZXYub3B0X2VuYWJsZSkgewotCQkJCXByaW50aygiJXM6IGNhbm5vdCBkaXNhYmxlIHdhdGNoZG9nIGluIEVOQUJMRUQgbW9kZVxuIiwKLQkJCQkJV0RfT0JQTkFNRSk7Ci0JCQkJcmV0dXJuKC1FSU5WQUwpOwotCQkJfQotCQkJd2Rfc3RvcHRpbWVyKHBUaW1lcik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybigtRUlOVkFMKTsKLQl9Ci0JcmV0dXJuKDApOwotfQotCi1zdGF0aWMgbG9uZyB3ZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCBydmFsID0gLUVOT0lPQ1RMQ01EOwotCi0Jc3dpdGNoIChjbWQpIHsKLQkvKiBzb2xhcmlzIGlvY3RscyBhcmUgc3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIgKi8KLQljYXNlIFdJT0NTVEFSVDoKLQljYXNlIFdJT0NTVE9QOgotCWNhc2UgV0lPQ0dTVEFUOgotCQlsb2NrX2tlcm5lbCgpOwotCQlydmFsID0gd2RfaW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwgY21kLCBhcmcpOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCWJyZWFrOwotCS8qIGV2ZXJ5dGhpbmcgZWxzZSBpcyBoYW5kbGVkIGJ5IHRoZSBnZW5lcmljIGNvbXBhdCBsYXllciAqLwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBydmFsOwotfQotCi1zdGF0aWMgc3NpemVfdCB3ZF93cml0ZShzdHJ1Y3QgZmlsZSAJKmZpbGUsIAotCQkJY29uc3QgY2hhcglfX3VzZXIgKmJ1ZiwgCi0JCQlzaXplX3QgCQljb3VudCwgCi0JCQlsb2ZmX3QgCQkqcHBvcykKLXsKLQlzdHJ1Y3Qgd2RfdGltZXIqIHBUaW1lciA9IChzdHJ1Y3Qgd2RfdGltZXIqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmKE5VTEwgPT0gcFRpbWVyKSB7Ci0JCXJldHVybigtRUlOVkFMKTsKLQl9Ci0KLQlpZiAoY291bnQpIHsKLQkJd2RfcGluZ3RpbWVyKHBUaW1lcik7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3Qgd2RfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCi0JCSAgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0jaWZkZWYgV0RfREVCVUcKLQl3ZF9kdW1wcmVncygpOwotCXJldHVybigwKTsKLSNlbHNlCi0JcmV0dXJuKC1FSU5WQUwpOwotI2VuZGlmIC8qIGlmZGVmIFdEX0RFQlVHICovCi19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3ZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCS8qIE9ubHkgV0QwIHdpbGwgaW50ZXJydXB0LS0gb3RoZXJzIGFyZSBOTUkgYW5kIHdlIHdvbid0Ci0JICogc2VlIHRoZW0gaGVyZS4uLi4KLQkgKi8KLQlzcGluX2xvY2tfaXJxKCZ3ZF9kZXYubG9jayk7Ci0JaWYoKHVuc2lnbmVkIGxvbmcpd2RfZGV2LnJlZ3MgPT0gKHVuc2lnbmVkIGxvbmcpZGV2X2lkKQotCXsKLQkJd2Rfc3RvcHRpbWVyKCZ3ZF9kZXYud2F0Y2hkb2dbV0QwX0lEXSk7Ci0JCXdkX2Rldi53YXRjaGRvZ1tXRDBfSURdLnJ1bnN0YXR1cyB8PSAgV0RfU1RBVF9TVkNEOwotCX0KLQlzcGluX3VubG9ja19pcnEoJndkX2Rldi5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmlvY3RsID0Jd2RfaW9jdGwsCi0JLmNvbXBhdF9pb2N0bCA9CXdkX2NvbXBhdF9pb2N0bCwKLQkub3BlbiA9CQl3ZF9vcGVuLAotCS53cml0ZSA9CXdkX3dyaXRlLAotCS5yZWFkID0JCXdkX3JlYWQsCi0JLnJlbGVhc2UgPQl3ZF9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkMF9taXNjZGV2ID0geyBXRDBfTUlOT1IsIFdEMF9ERVZOQU1FLCAmd2RfZm9wcyB9Owotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkMV9taXNjZGV2ID0geyBXRDFfTUlOT1IsIFdEMV9ERVZOQU1FLCAmd2RfZm9wcyB9Owotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkMl9taXNjZGV2ID0geyBXRDJfTUlOT1IsIFdEMl9ERVZOQU1FLCAmd2RfZm9wcyB9OwotCi0jaWZkZWYgV0RfREVCVUcKLXN0YXRpYyB2b2lkIHdkX2R1bXByZWdzKHZvaWQpCi17Ci0JLyogUmVhZGluZyBmcm9tIGRvd25jb3VudGVycyBpbml0aWF0ZXMgd2F0Y2hkb2cgY291bnRkb3duLS0KLQkgKiBFeGFtcGxlIGlzIGluY2x1ZGVkIGJlbG93IGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMuCi0JICovCi0JaW50IGk7Ci0JcHJpbnRrKCIlczogZHVtcGluZyByZWdpc3RlciB2YWx1ZXNcbiIsIFdEX09CUE5BTUUpOwotCWZvcihpID0gV0QwX0lEOyBpIDwgV0RfTlVNREVWUzsgKytpKSB7Ci0JCQkvKiBwcmludGsoIlx0JXMlaTogZGNudHIgIGF0IDB4JWx4OiAweCV4XG4iLCAKLQkJCSAqIAlXRF9PQlBOQU1FLAotCQkgCSAqCWksCi0JCQkgKgkodW5zaWduZWQgbG9uZykoJndkX2Rldi53YXRjaGRvZ1tpXS5yZWdzLT5kY250ciksIAotCQkJICoJcmVhZHcoJndkX2Rldi53YXRjaGRvZ1tpXS5yZWdzLT5kY250cikpOwotCQkJICovCi0JCQlwcmludGsoIlx0JXMlaTogbGltaXQgIGF0IDB4JWx4OiAweCV4XG4iLCAKLQkJCQlXRF9PQlBOQU1FLAotCQkJCWksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZ3ZF9kZXYud2F0Y2hkb2dbaV0ucmVncy0+bGltaXQpLCAKLQkJCQlyZWFkdygmd2RfZGV2LndhdGNoZG9nW2ldLnJlZ3MtPmxpbWl0KSk7Ci0JCQlwcmludGsoIlx0JXMlaTogc3RhdHVzIGF0IDB4JWx4OiAweCV4XG4iLCAKLQkJCQlXRF9PQlBOQU1FLAotCQkJCWksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZ3ZF9kZXYud2F0Y2hkb2dbaV0ucmVncy0+c3RhdHVzKSwgCi0JCQkJcmVhZGIoJndkX2Rldi53YXRjaGRvZ1tpXS5yZWdzLT5zdGF0dXMpKTsKLQkJCXByaW50aygiXHQlcyVpOiBkcml2ZXIgc3RhdHVzOiAweCV4XG4iLAotCQkJCVdEX09CUE5BTUUsCi0JCQkJaSwKLQkJCQl3ZF9nZXRzdGF0dXMoJndkX2Rldi53YXRjaGRvZ1tpXSkpOwotCX0KLQlwcmludGsoIlx0aW50cl9tYXNrICBhdCAlcDogMHgleFxuIiwgCi0JCXdkX2Rldi5yZWdzICsgUExEX0lNQVNLLAotCQlyZWFkYih3ZF9kZXYucmVncyArIFBMRF9JTUFTSykpOwotCXByaW50aygiXHRwbGRfc3RhdHVzIGF0ICVwOiAweCV4XG4iLCAKLQkJd2RfZGV2LnJlZ3MgKyBQTERfU1RBVFVTLCAKLQkJcmVhZGIod2RfZGV2LnJlZ3MgKyBQTERfU1RBVFVTKSk7Ci19Ci0jZW5kaWYKLQotLyogRW5hYmxlIG9yIGRpc2FibGUgd2F0Y2hkb2cgaW50ZXJydXB0cwotICogQmVjYXVzZSBvZiB0aGUgQ1AxNDAwIGRlZmVjdCB0aGlzIHNob3VsZCBvbmx5IGJlCi0gKiBjYWxsZWQgZHVyaW5nIGluaXRpYWx6YXRpb24gb3IgYnkgd2RfW3N0YXJ0fHN0b3BddGltZXIoKQotICoKLSAqIHBUaW1lciAJLSBwb2ludGVyIHRvIHRpbWVyIGRldmljZSwgb3IgTlVMTCB0byBpbmRpY2F0ZSBhbGwgdGltZXJzIAotICogZW5hYmxlCS0gbm9uLXplcm8gdG8gZW5hYmxlIGludGVycnVwdHMsIHplcm8gdG8gZGlzYWJsZQotICovCi1zdGF0aWMgdm9pZCB3ZF90b2dnbGVpbnRyKHN0cnVjdCB3ZF90aW1lciogcFRpbWVyLCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGNoYXIgY3VycmVncyA9IHdkX3JlYWRiKHdkX2Rldi5yZWdzICsgUExEX0lNQVNLKTsKLQl1bnNpZ25lZCBjaGFyIHNldHJlZ3MgPSAKLQkJKE5VTEwgPT0gcFRpbWVyKSA/IAotCQkJKFdEMF9JTlRSX01BU0sgfCBXRDFfSU5UUl9NQVNLIHwgV0QyX0lOVFJfTUFTSykgOiAKLQkJCShwVGltZXItPmludHJfbWFzayk7Ci0KLQkoV0RfSU5UUl9PTiA9PSBlbmFibGUpID8KLQkJKGN1cnJlZ3MgJj0gfnNldHJlZ3MpOgotCQkoY3VycmVncyB8PSAgc2V0cmVncyk7Ci0KLQl3ZF93cml0ZWIoY3VycmVncywgd2RfZGV2LnJlZ3MgKyBQTERfSU1BU0spOwotCXJldHVybjsKLX0KLQotLyogUmVzZXQgY291bnRkb3duIHRpbWVyIHdpdGggJ2xpbWl0JyB2YWx1ZSBhbmQgY29udGludWUgY291bnRkb3duLgotICogVGhpcyB3aWxsIG5vdCBzdGFydCBhIHN0b3BwZWQgdGltZXIuCi0gKgotICogcFRpbWVyCS0gcG9pbnRlciB0byB0aW1lciBkZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgd2RfcGluZ3RpbWVyKHN0cnVjdCB3ZF90aW1lciogcFRpbWVyKQotewotCWlmICh3ZF9yZWFkYihwVGltZXItPnJlZ3MgKyBXRF9TVEFUVVMpICYgV0RfU19SVU5OSU5HKSB7Ci0JCXdkX3JlYWR3KHBUaW1lci0+cmVncyArIFdEX0RDTlRSKTsKLQl9Ci19Ci0KLS8qIFN0b3AgYSBydW5uaW5nIHdhdGNoZG9nIHRpbWVyLS0gdGhlIHRpbWVyIGFjdHVhbGx5IGtlZXBzCi0gKiBydW5uaW5nLCBidXQgdGhlIGludGVycnVwdCBpcyBtYXNrZWQgc28gdGhhdCBubyBhY3Rpb24gaXMKLSAqIHRha2VuIHVwb24gZXhwaXJhdGlvbi4KLSAqCi0gKiBwVGltZXIJLSBwb2ludGVyIHRvIHRpbWVyIGRldmljZQotICovCi1zdGF0aWMgdm9pZCB3ZF9zdG9wdGltZXIoc3RydWN0IHdkX3RpbWVyKiBwVGltZXIpCi17Ci0JaWYod2RfcmVhZGIocFRpbWVyLT5yZWdzICsgV0RfU1RBVFVTKSAmIFdEX1NfUlVOTklORykgewotCQl3ZF90b2dnbGVpbnRyKHBUaW1lciwgV0RfSU5UUl9PRkYpOwotCi0JCWlmKHdkX2Rldi5pc2JhZGRvZ2dpZSkgewotCQkJcFRpbWVyLT5ydW5zdGF0dXMgfD0gV0RfU1RBVF9CU1RPUDsKLQkJCXdkX2Jyb2tlbnRpbWVyKCh1bnNpZ25lZCBsb25nKSZ3ZF9kZXYpOwotCQl9Ci0JfQotfQotCi0vKiBTdGFydCBhIHdhdGNoZG9nIHRpbWVyIHdpdGggdGhlIHNwZWNpZmllZCBsaW1pdCB2YWx1ZQotICogSWYgdGhlIHdhdGNoZG9nIGlzIHJ1bm5pbmcsIGl0IHdpbGwgYmUgcmVzdGFydGVkIHdpdGgKLSAqIHRoZSBwcm92aWRlZCBsaW1pdCB2YWx1ZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIGludGVycnVwdHMgb24gdGhlIHNwZWNpZmllZAotICogd2F0Y2hkb2cuCi0gKgotICogcFRpbWVyCS0gcG9pbnRlciB0byB0aW1lciBkZXZpY2UKLSAqIGxpbWl0CS0gbGltaXQgKGNvdW50ZG93bikgdmFsdWUgaW4gMS8xMHRoIHNlY29uZHMKLSAqLwotc3RhdGljIHZvaWQgd2Rfc3RhcnR0aW1lcihzdHJ1Y3Qgd2RfdGltZXIqIHBUaW1lcikKLXsKLQlpZih3ZF9kZXYuaXNiYWRkb2dnaWUpIHsKLQkJcFRpbWVyLT5ydW5zdGF0dXMgJj0gfldEX1NUQVRfQlNUT1A7Ci0JfQotCXBUaW1lci0+cnVuc3RhdHVzICY9IH5XRF9TVEFUX1NWQ0Q7Ci0KLQl3ZF93cml0ZXcocFRpbWVyLT50aW1lb3V0LCBwVGltZXItPnJlZ3MgKyBXRF9MSU1JVCk7Ci0Jd2RfdG9nZ2xlaW50cihwVGltZXIsIFdEX0lOVFJfT04pOwotfQotCi0vKiBSZXN0YXJ0cyB0aW1lciB3aXRoIG1heGltdW0gbGltaXQgdmFsdWUgYW5kCi0gKiBkb2VzIG5vdCB1bnNldCAnYnJva2Vuc3RvcCcgdmFsdWUuCi0gKi8KLXN0YXRpYyB2b2lkIHdkX3Jlc2V0YnJva2VudGltZXIoc3RydWN0IHdkX3RpbWVyKiBwVGltZXIpCi17Ci0Jd2RfdG9nZ2xlaW50cihwVGltZXIsIFdEX0lOVFJfT04pOwotCXdkX3dyaXRldyhXRF9CTElNSVQsIHBUaW1lci0+cmVncyArIFdEX0xJTUlUKTsKLX0KLQotLyogVGltZXIgZGV2aWNlIGluaXRpYWxpemF0aW9uIGhlbHBlci4KLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvdGhlciBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgd2RfaW5pdHRpbWVyKGludCB3aGljaGRvZykKLXsKLQlzdHJ1Y3QgbWlzY2RldmljZSAJCQkJKndoaWNobWlzYzsKLQl2b2lkIF9faW9tZW0gKndoaWNocmVnczsKLQljaGFyIAkJCQkJCQl3aGljaGlkZW50WzhdOwotCWludAkJCQkJCQkJd2hpY2htYXNrOwotCV9fdTE2CQkJCQkJCXdoaWNobGltaXQ7Ci0KLQlzd2l0Y2god2hpY2hkb2cpCi0JewotCQljYXNlIFdEMF9JRDoKLQkJCXdoaWNobWlzYyA9ICZ3ZDBfbWlzY2RldjsKLQkJCXN0cmNweSh3aGljaGlkZW50LCAiUklDIik7Ci0JCQl3aGljaHJlZ3MgPSB3ZF9kZXYucmVncyArIFdEMF9PRkY7Ci0JCQl3aGljaG1hc2sgPSBXRDBfSU5UUl9NQVNLOwotCQkJd2hpY2hsaW1pdD0gKDAgPT0gd2QwX3RpbWVvdXQpIAk/IAotCQkJCQkJKHdkX2Rldi5vcHRfdGltZW91dCk6IAotCQkJCQkJKHdkMF90aW1lb3V0KTsKLQkJCWJyZWFrOwotCQljYXNlIFdEMV9JRDoKLQkJCXdoaWNobWlzYyA9ICZ3ZDFfbWlzY2RldjsKLQkJCXN0cmNweSh3aGljaGlkZW50LCAiWElSIik7Ci0JCQl3aGljaHJlZ3MgPSB3ZF9kZXYucmVncyArIFdEMV9PRkY7Ci0JCQl3aGljaG1hc2sgPSBXRDFfSU5UUl9NQVNLOwotCQkJd2hpY2hsaW1pdD0gKDAgPT0gd2QxX3RpbWVvdXQpIAk/IAotCQkJCQkJKHdkX2Rldi5vcHRfdGltZW91dCk6IAotCQkJCQkJKHdkMV90aW1lb3V0KTsKLQkJCWJyZWFrOwotCQljYXNlIFdEMl9JRDoKLQkJCXdoaWNobWlzYyA9ICZ3ZDJfbWlzY2RldjsKLQkJCXN0cmNweSh3aGljaGlkZW50LCAiUE9SIik7Ci0JCQl3aGljaHJlZ3MgPSB3ZF9kZXYucmVncyArIFdEMl9PRkY7Ci0JCQl3aGljaG1hc2sgPSBXRDJfSU5UUl9NQVNLOwotCQkJd2hpY2hsaW1pdD0gKDAgPT0gd2QyX3RpbWVvdXQpIAk/IAotCQkJCQkJKHdkX2Rldi5vcHRfdGltZW91dCk6IAotCQkJCQkJKHdkMl90aW1lb3V0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIlczogJXM6IGludmFsaWQgd2F0Y2hkb2cgaWQ6ICVpXG4iLAotCQkJCVdEX09CUE5BTUUsIF9fZnVuY19fLCB3aGljaGRvZyk7Ci0JCQlyZXR1cm4oMSk7Ci0JfQotCWlmKDAgIT0gbWlzY19yZWdpc3Rlcih3aGljaG1pc2MpKQotCXsKLQkJcmV0dXJuKDEpOwotCX0KLQl3ZF9kZXYud2F0Y2hkb2dbd2hpY2hkb2ddLnJlZ3MJCQk9IHdoaWNocmVnczsKLQl3ZF9kZXYud2F0Y2hkb2dbd2hpY2hkb2ddLnRpbWVvdXQgCQk9IHdoaWNobGltaXQ7Ci0Jd2RfZGV2LndhdGNoZG9nW3doaWNoZG9nXS5pbnRyX21hc2sJCT0gd2hpY2htYXNrOwotCXdkX2Rldi53YXRjaGRvZ1t3aGljaGRvZ10ucnVuc3RhdHVzIAkmPSB+V0RfU1RBVF9CU1RPUDsKLQl3ZF9kZXYud2F0Y2hkb2dbd2hpY2hkb2ddLnJ1bnN0YXR1cyAJfD0gV0RfU1RBVF9JTklUOwotCi0JcHJpbnRrKCIlcyVpOiAlcyBoYXJkd2FyZSB3YXRjaGRvZyBbJTAxaS4laSBzZWNdICVzXG4iLCAKLQkJV0RfT0JQTkFNRSwgCi0JCXdoaWNoZG9nLCAKLQkJd2hpY2hpZGVudCwgCi0JCXdkX2Rldi53YXRjaGRvZ1t3aGljaGRvZ10udGltZW91dCAvIDEwLAotCQl3ZF9kZXYud2F0Y2hkb2dbd2hpY2hkb2ddLnRpbWVvdXQgJSAxMCwKLQkJKDAgIT0gd2RfZGV2Lm9wdF9lbmFibGUpID8gImluIEVOQUJMRUQgbW9kZSIgOiAiIik7Ci0JcmV0dXJuKDApOwotfQotCi0vKiBUaW1lciBtZXRob2QgY2FsbGVkIHRvIHJlc2V0IHN0b3BwZWQgd2F0Y2hkb2dzLS0KLSAqIGJlY2F1c2Ugb2YgdGhlIFBMRCBidWcgb24gQ1AxNDAwLCB3ZSBjYW5ub3QgbWFzawotICogaW50ZXJydXB0cyB3aXRoaW4gdGhlIFBMRCBzbyBtZSBtdXN0IGNvbnRpbnVhbGx5Ci0gKiByZXNldCB0aGUgdGltZXJzIGFkIGluZmluaXR1bS4KLSAqLwotc3RhdGljIHZvaWQgd2RfYnJva2VudGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB3ZF9kZXZpY2UqIHBEZXYgPSAoc3RydWN0IHdkX2RldmljZSopZGF0YTsKLQlpbnQgaWQsIHRyaXBwZWQgPSAwOwotCi0JLyoga2lsbCBhIHJ1bm5pbmcgdGltZXIgaW5zdGFuY2UsIGluIGNhc2Ugd2UKLQkgKiB3ZXJlIGNhbGxlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGJ5IGtlcm5lbCB0aW1lcgotCSAqLwotCWlmKHRpbWVyX3BlbmRpbmcoJndkX3RpbWVyKSkgewotCQlkZWxfdGltZXIoJndkX3RpbWVyKTsKLQl9Ci0KLQlmb3IoaWQgPSBXRDBfSUQ7IGlkIDwgV0RfTlVNREVWUzsgKytpZCkgewotCQlpZihwRGV2LT53YXRjaGRvZ1tpZF0ucnVuc3RhdHVzICYgV0RfU1RBVF9CU1RPUCkgewotCQkJKyt0cmlwcGVkOwotCQkJd2RfcmVzZXRicm9rZW50aW1lcigmcERldi0+d2F0Y2hkb2dbaWRdKTsKLQkJfQotCX0KLQotCWlmKHRyaXBwZWQpIHsKLQkJLyogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRpbWVyIGJyb2tlbnN0b3BwZWQtLSByZXNjaGVkdWxlICovCi0JCWluaXRfdGltZXIoJndkX3RpbWVyKTsKLQkJd2RfdGltZXIuZXhwaXJlcyA9IFdEX0JUSU1FT1VUOwotCQlhZGRfdGltZXIoJndkX3RpbWVyKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgd2RfZ2V0c3RhdHVzKHN0cnVjdCB3ZF90aW1lciogcFRpbWVyKQotewotCXVuc2lnbmVkIGNoYXIgc3RhdCA9IHdkX3JlYWRiKHBUaW1lci0+cmVncyArIFdEX1NUQVRVUyk7Ci0JdW5zaWduZWQgY2hhciBpbnRyID0gd2RfcmVhZGIod2RfZGV2LnJlZ3MgKyBQTERfSU1BU0spOwotCXVuc2lnbmVkIGNoYXIgcmV0ICA9IFdEX1NUT1BQRUQ7Ci0KLQkvKiBkZXRlcm1pbmUgU1RPUFBFRCAqLwotCWlmKDAgPT0gc3RhdCApIHsgCi0JCXJldHVybihyZXQpOwotCX0KLQkvKiBkZXRlcm1pbmUgRVhQSVJFRCB2cyBGUkVFUlVOIHZzIFJVTk5JTkcgKi8KLQllbHNlIGlmKFdEX1NfRVhQSVJFRCAmIHN0YXQpIHsKLQkJcmV0ID0gV0RfRVhQSVJFRDsKLQl9Ci0JZWxzZSBpZihXRF9TX1JVTk5JTkcgJiBzdGF0KSB7Ci0JCWlmKGludHIgJiBwVGltZXItPmludHJfbWFzaykgewotCQkJcmV0ID0gV0RfRlJFRVJVTjsKLQkJfQotCQllbHNlIHsKLQkJCS8qIEZ1ZGdlIFdEX0VYUElSRUQgc3RhdHVzIGZvciBkZWZlY3RpdmUgQ1AxNDAwLS0KLQkJCSAqIElGIHRpbWVyIGlzIHJ1bm5pbmcgCi0JCQkgKiAJQU5EIGJyb2tlbnN0b3AgaXMgc2V0IAotCQkJICogCUFORCBhbiBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQKLQkJCSAqIHdlIGFyZSBXRF9FWFBJUkVELgotCQkJICoKLQkJCSAqIElGIHRpbWVyIGlzIHJ1bm5pbmcgCi0JCQkgKiAJQU5EIGJyb2tlbnN0b3AgaXMgc2V0IAotCQkJICogCUFORCBubyBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQKLQkJCSAqIHdlIGFyZSBXRF9GUkVFUlVOLgotCQkJICovCi0JCQlpZih3ZF9kZXYuaXNiYWRkb2dnaWUgJiYgKHBUaW1lci0+cnVuc3RhdHVzICYgV0RfU1RBVF9CU1RPUCkpIHsKLQkJCQlpZihwVGltZXItPnJ1bnN0YXR1cyAmIFdEX1NUQVRfU1ZDRCkgewotCQkJCQlyZXQgPSBXRF9FWFBJUkVEOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyogd2UgY291bGQgYXMgd2VsbCBwcmV0ZW5kIHdlIGFyZSBleHBpcmVkICovCi0JCQkJCXJldCA9IFdEX0ZSRUVSVU47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0ID0gV0RfUlVOTklORzsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGRldGVybWluZSBTRVJWSUNFRCAqLwotCWlmKHBUaW1lci0+cnVuc3RhdHVzICYgV0RfU1RBVF9TVkNEKSB7Ci0JCXJldCB8PSBXRF9TRVJWSUNFRDsKLQl9Ci0KLQlyZXR1cm4ocmV0KTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgd2RfaW5pdCh2b2lkKQotewotCWludCAJaWQ7Ci0Jc3RydWN0IAlsaW51eF9lYnVzICplYnVzID0gTlVMTDsKLQlzdHJ1Y3QgCWxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKLQotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmICghc3RyY21wKGVkZXYtPm9mZGV2Lm5vZGUtPm5hbWUsIFdEX09CUE5BTUUpKQotCQkJCWdvdG8gZWJ1c19kb25lOwotCQl9Ci0JfQotCi1lYnVzX2RvbmU6Ci0JaWYoIWVkZXYpIHsKLQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGxvY2F0ZSBkZXZpY2VcbiIsIFdEX09CUE5BTUUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl3ZF9kZXYucmVncyA9IAotCQlpb3JlbWFwKGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCA0ICogV0RfVElNRVJfUkVHU1opOyAvKiA/ICovCi0KLQlpZihOVUxMID09IHdkX2Rldi5yZWdzKSB7Ci0JCXByaW50aygiJXM6IHVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzXG4iLCBXRF9PQlBOQU1FKTsKLQkJcmV0dXJuKC1FTk9ERVYpOwotCX0KLQotCS8qIGluaXRpYWxpemUgZGV2aWNlIHN0cnVjdHVyZSBmcm9tIE9CUCBwYXJhbWV0ZXJzICovCi0Jd2RfZGV2LmlycSAJCQk9IGVkZXYtPmlycXNbMF07Ci0Jd2RfZGV2Lm9wdF9lbmFibGUJPSB3ZF9vcHRfZW5hYmxlKCk7Ci0Jd2RfZGV2Lm9wdF9yZWJvb3QJPSB3ZF9vcHRfcmVib290KCk7Ci0Jd2RfZGV2Lm9wdF90aW1lb3V0CT0gd2Rfb3B0X3RpbWVvdXQoKTsKLQl3ZF9kZXYuaXNiYWRkb2dnaWUJPSB3ZF9pc2Jyb2tlbigpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyB1bmxlc3Mgd2F0Y2hkb2ctZW5hYmxlZD8gPT0gdHJ1ZSAqLwotCWlmKCEgd2RfZGV2Lm9wdF9lbmFibGUpIHsKLQkJd2RfdG9nZ2xlaW50cihOVUxMLCBXRF9JTlRSX09GRik7Ci0JfQotCi0JLyogcmVnaXN0ZXIgbWlzY2VsbGFuZW91cyBkZXZpY2VzICovCi0JZm9yKGlkID0gV0QwX0lEOyBpZCA8IFdEX05VTURFVlM7ICsraWQpIHsKLQkJaWYoMCAhPSB3ZF9pbml0dGltZXIoaWQpKSB7Ci0JCQlwcmludGsoIiVzJWk6IHVuYWJsZSB0byBpbml0aWFsaXplXG4iLCBXRF9PQlBOQU1FLCBpZCk7Ci0JCX0KLQl9Ci0KLQkvKiB3YXJuIGFib3V0IHBvc3NpYmxlIGRlZmVjdGl2ZSBQTEQgKi8KLQlpZih3ZF9kZXYuaXNiYWRkb2dnaWUpIHsKLQkJaW5pdF90aW1lcigmd2RfdGltZXIpOwotCQl3ZF90aW1lci5mdW5jdGlvbiAJPSB3ZF9icm9rZW50aW1lcjsKLQkJd2RfdGltZXIuZGF0YQkJPSAodW5zaWduZWQgbG9uZykmd2RfZGV2OwotCQl3ZF90aW1lci5leHBpcmVzCT0gV0RfQlRJTUVPVVQ7Ci0KLQkJcHJpbnRrKCIlczogUExEIGRlZmVjdCB3b3JrYXJvdW5kIGVuYWJsZWQgZm9yIG1vZGVsICVzXG4iLAotCQkJV0RfT0JQTkFNRSwgV0RfQkFETU9ERUwpOwotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3ZF9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGlkOwotCi0JLyogaWYgJ3dhdGNoZG9nLWVuYWJsZT8nID09IFRSVUUsIHRpbWVycyBhcmUgbm90IHN0b3BwZWQgCi0JICogd2hlbiBtb2R1bGUgaXMgdW5sb2FkZWQuICBBbGwgYnJva2Vuc3RvcHBlZCB0aW1lcnMgd2lsbAotCSAqIGFsc28gbm93IGV2ZW50dWFsbHkgdHJpcC4gCi0JICovCi0JZm9yKGlkID0gV0QwX0lEOyBpZCA8IFdEX05VTURFVlM7ICsraWQpIHsKLQkJaWYoV0RfU19SVU5OSU5HID09IHdkX3JlYWRiKHdkX2Rldi53YXRjaGRvZ1tpZF0ucmVncyArIFdEX1NUQVRVUykpIHsKLQkJCWlmKHdkX2Rldi5vcHRfZW5hYmxlKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMlaTogdGltZXIgbm90IHN0b3BwZWQgYXQgcmVsZWFzZVxuIiwKLQkJCQkJV0RfT0JQTkFNRSwgaWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJd2Rfc3RvcHRpbWVyKCZ3ZF9kZXYud2F0Y2hkb2dbaWRdKTsKLQkJCQlpZih3ZF9kZXYud2F0Y2hkb2dbaWRdLnJ1bnN0YXR1cyAmIFdEX1NUQVRfQlNUT1ApIHsKLQkJCQkJd2RfcmVzZXRicm9rZW50aW1lcigmd2RfZGV2LndhdGNoZG9nW2lkXSk7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCQkJIiVzJWk6IGRlZmVjdCB3b3JrYXJvdW5kIGRpc2FibGVkIGF0IHJlbGVhc2UsICJcCi0JCQkJCQkJInRpbWVyIGV4cGlyZXMgaW4gfiUwMWkgc2VjXG4iLAotCQkJCQkJCVdEX09CUE5BTUUsIGlkLCAKLQkJCQkJCQl3ZF9yZWFkdyh3ZF9kZXYud2F0Y2hkb2dbaWRdLnJlZ3MgKyBXRF9MSU1JVCkgLyAxMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYod2RfZGV2LmlzYmFkZG9nZ2llICYmIHRpbWVyX3BlbmRpbmcoJndkX3RpbWVyKSkgewotCQlkZWxfdGltZXIoJndkX3RpbWVyKTsKLQl9Ci0JaWYoMCAhPSAod2RfZGV2LndhdGNoZG9nW1dEMF9JRF0ucnVuc3RhdHVzICYgV0RfU1RBVF9JTklUKSkgewotCQltaXNjX2RlcmVnaXN0ZXIoJndkMF9taXNjZGV2KTsKLQl9Ci0JaWYoMCAhPSAod2RfZGV2LndhdGNoZG9nW1dEMV9JRF0ucnVuc3RhdHVzICYgV0RfU1RBVF9JTklUKSkgewotCQltaXNjX2RlcmVnaXN0ZXIoJndkMV9taXNjZGV2KTsKLQl9Ci0JaWYoMCAhPSAod2RfZGV2LndhdGNoZG9nW1dEMl9JRF0ucnVuc3RhdHVzICYgV0RfU1RBVF9JTklUKSkgewotCQltaXNjX2RlcmVnaXN0ZXIoJndkMl9taXNjZGV2KTsKLQl9Ci0JaWYoMCAhPSB3ZF9kZXYuaW5pdGlhbGl6ZWQpIHsKLQkJZnJlZV9pcnEod2RfZGV2LmlycSwgKHZvaWQgKil3ZF9kZXYucmVncyk7Ci0JfQotCWlvdW5tYXAod2RfZGV2LnJlZ3MpOwotfQotCi1tb2R1bGVfaW5pdCh3ZF9pbml0KTsKLW1vZHVsZV9leGl0KHdkX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKaW5kZXggZDhmNWMwYy4uMjU1MGFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCkBAIC0xLDEwICsxLDcgQEAKLS8qICRJZDogZGlzcGxheTdzZWcuYyx2IDEuNiAyMDAyLzAxLzA4IDE2OjAwOjE2IGRhdmVtIEV4cCAkCi0gKgotICogZGlzcGxheTdzZWcgLSBEcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSA3LXNlZ21lbnQgZGlzcGxheQotICogcHJlc2VudCBvbiBTdW4gTWljcm9zeXN0ZW1zIENQMTQwMCBhbmQgQ1AxNTAwCisvKiBkaXNwbGF5N3NlZy5jIC0gRHJpdmVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgNy1zZWdtZW50IGRpc3BsYXkKKyAqICAgICAgICAgICAgICAgICBwcmVzZW50IG9uIFN1biBNaWNyb3N5c3RlbXMgQ1AxNDAwIGFuZCBDUDE1MDAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRXJpYyBCcm93ZXIgKGVicm93ZXJAdXNhLm5ldCkKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTYsMjIgKzEzLDIwIEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkJLyogcmVxdWVzdF9yZWdpb24gKi8KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9lYnVzLmg+CQkJLyogRUJ1cyBkZXZpY2UJCQkJCSovCi0jaW5jbHVkZSA8YXNtL29wbGliLmg+CQkJLyogT3BlblByb20gTGlicmFyeSAJCQkqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CQkvKiBwdXRfL2dldF91c2VyCQkJKi8KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9kaXNwbGF5N3NlZy5oPgogCiAjZGVmaW5lIEQ3U19NSU5PUgkxOTMKLSNkZWZpbmUgRDdTX09CUE5BTUUJImRpc3BsYXk3c2VnIgotI2RlZmluZSBEN1NfREVWTkFNRSAiZDdzIgorI2RlZmluZSBEUklWRVJfTkFNRQkiZDdzIgorI2RlZmluZSBQRlgJCURSSVZFUl9OQU1FICI6ICIKIAogc3RhdGljIGludCBzb2xfY29tcGF0ID0gMDsJCS8qIFNvbGFyaXMgY29tcGF0aWJpbGl0eSBtb2RlCSovCiAKLSNpZmRlZiBNT0RVTEUKLQogLyogU29sYXJpcyBjb21wYXRpYmlsaXR5IGZsYWcgLQogICogVGhlIFNvbGFyaXMgaW1wbGVtZW50YXRpb24gb21pdHMgc3VwcG9ydCBmb3Igc2V2ZXJhbAogICogZG9jdW1lbnRlZCBkcml2ZXIgZmVhdHVyZXMgKHJlZiBTdW4gZG9jIDgwNi0wMTgwLTAzKS4gIApAQCAtNDYsMjAgKzQxLDIwIEBACiAgKiBJZiB5b3Ugd2lzaCB0aGUgZGV2aWNlIHRvIG9wZXJhdGUgYXMgdW5kZXIgU29sYXJpcywKICAqIG9taXR0aW5nIGFib3ZlIGZlYXR1cmVzLCBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gbm9uLXplcm8uCiAgKi8KLW1vZHVsZV9wYXJhbQotCShzb2xfY29tcGF0LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQwotCShzb2xfY29tcGF0LCAKLQkgIkRpc2FibGVzIGRvY3VtZW50ZWQgZnVuY3Rpb25hbGl0eSBvbWl0dGVkIGZyb20gU29sYXJpcyBkcml2ZXIiKTsKK21vZHVsZV9wYXJhbShzb2xfY29tcGF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzb2xfY29tcGF0LCAKKwkJICJEaXNhYmxlcyBkb2N1bWVudGVkIGZ1bmN0aW9uYWxpdHkgb21pdHRlZCBmcm9tIFNvbGFyaXMgZHJpdmVyIik7CiAKLU1PRFVMRV9BVVRIT1IKLQkoIkVyaWMgQnJvd2VyIDxlYnJvd2VyQHVzYS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04KLQkoIjctU2VnbWVudCBEaXNwbGF5IGRyaXZlciBmb3IgU3VuIE1pY3Jvc3lzdGVtcyBDUDE0MDAvMTUwMCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBCcm93ZXIgPGVicm93ZXJAdXNhLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiNy1TZWdtZW50IERpc3BsYXkgZHJpdmVyIGZvciBTdW4gTWljcm9zeXN0ZW1zIENQMTQwMC8xNTAwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRQotCSgiZDdzIik7Ci0jZW5kaWYgLyogaWZkZWYgTU9EVUxFICovCitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiZDdzIik7CisKK3N0cnVjdCBkN3MgeworCXZvaWQgX19pb21lbQkqcmVnczsKKwlib29sCQlmbGlwcGVkOworfTsKK3N0cnVjdCBkN3MgKmQ3c19kZXZpY2U7CiAKIC8qCiAgKiBSZWdpc3RlciBibG9jayBhZGRyZXNzLSBzZWUgaGVhZGVyIGZvciBkZXRhaWxzCkBAIC03MiwyMiArNjcsNiBAQAogICogRkxJUAkJLSBJbnZlcnRzIGRpc3BsYXkgZm9yIHVwc2lkZS1kb3duIG1vdW50ZWQgYm9hcmQKICAqIGJpdHMgMC00CS0gNy1zZWdtZW50IGRpc3BsYXkgY29udGVudHMKICAqLwotc3RhdGljIHZvaWQgX19pb21lbSogZDdzX3JlZ3M7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkN3NfZnJlZSh2b2lkKQotewotCWlvdW5tYXAoZDdzX3JlZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkN3Nfb2JwZmxpcHBlZCh2b2lkKQotewotCWludCBvcHRfbm9kZTsKLQotCW9wdF9ub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7Ci0Jb3B0X25vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG9wdF9ub2RlLCAib3B0aW9ucyIpOwotCXJldHVybiAoKC0xICE9IHByb21fZ2V0aW50ZGVmYXVsdChvcHRfbm9kZSwgImQ3cy1mbGlwcGVkPyIsIC0xKSkgPyAwIDogMSk7Ci19Ci0KIHN0YXRpYyBhdG9taWNfdCBkN3NfdXNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKIAogc3RhdGljIGludCBkN3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKQEAgLTEwNiwxMiArODUsMTUgQEAKIAkgKiBhcmUgbm90IG9wZXJhdGluZyBpbiBzb2xhcmlzLWNvbXBhdCBtb2RlCiAJICovCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmQ3c191c2VycykgJiYgIXNvbF9jb21wYXQpIHsKLQkJaW50IHJlZ3ZhbCA9IDA7CisJCXN0cnVjdCBkN3MgKnAgPSBkN3NfZGV2aWNlOworCQl1OCByZWd2YWwgPSAwOwogCi0JCXJlZ3ZhbCA9IHJlYWRiKGQ3c19yZWdzKTsKLQkJKDAgPT0gZDdzX29icGZsaXBwZWQoKSkJPyAKLQkJCXdyaXRlYihyZWd2YWwgfD0gRDdTX0ZMSVAsICBkN3NfcmVncyk6IAotCQkJd3JpdGViKHJlZ3ZhbCAmPSB+RDdTX0ZMSVAsIGQ3c19yZWdzKTsKKwkJcmVndmFsID0gcmVhZGIocC0+cmVncyk7CisJCWlmIChwLT5mbGlwcGVkKQorCQkJcmVndmFsIHw9IEQ3U19GTElQOworCQllbHNlCisJCQlyZWd2YWwgJj0gfkQ3U19GTElQOworCQl3cml0ZWIocmVndmFsLCBwLT5yZWdzKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExOSw5ICsxMDEsMTAgQEAKIAogc3RhdGljIGxvbmcgZDdzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlfX3U4IHJlZ3MgPSByZWFkYihkN3NfcmVncyk7Ci0JX191OCBpcmVnID0gMDsKKwlzdHJ1Y3QgZDdzICpwID0gZDdzX2RldmljZTsKKwl1OCByZWdzID0gcmVhZGIocC0+cmVncyk7CiAJaW50IGVycm9yID0gMDsKKwl1OCBpcmVnID0gMDsKIAogCWlmIChEN1NfTUlOT1IgIT0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEyOSwxOCArMTEyLDIwIEBACiAJbG9ja19rZXJuZWwoKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRDdTSU9DV1I6Ci0JCS8qIGFzc2lnbiBkZXZpY2UgcmVnaXN0ZXIgdmFsdWVzCi0JCSAqIHdlIG1hc2stb3V0IEQ3U19GTElQIGlmIGluIHNvbF9jb21wYXQgbW9kZQorCQkvKiBhc3NpZ24gZGV2aWNlIHJlZ2lzdGVyIHZhbHVlcyB3ZSBtYXNrLW91dCBEN1NfRkxJUAorCQkgKiBpZiBpbiBzb2xfY29tcGF0IG1vZGUKIAkJICovCiAJCWlmIChnZXRfdXNlcihpcmVnLCAoaW50IF9fdXNlciAqKSBhcmcpKSB7CiAJCQllcnJvciA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoMCAhPSBzb2xfY29tcGF0KSB7Ci0JCQkocmVncyAmIEQ3U19GTElQKSA/IAotCQkJCShpcmVnIHw9IEQ3U19GTElQKSA6IChpcmVnICY9IH5EN1NfRkxJUCk7CisJCWlmIChzb2xfY29tcGF0KSB7CisJCQlpZiAocmVncyAmIEQ3U19GTElQKQorCQkJCWlyZWcgfD0gRDdTX0ZMSVA7CisJCQllbHNlCisJCQkJaXJlZyAmPSB+RDdTX0ZMSVA7CiAJCX0KLQkJd3JpdGViKGlyZWcsIGQ3c19yZWdzKTsKKwkJd3JpdGViKGlyZWcsIHAtPnJlZ3MpOwogCQlicmVhazsKIAogCWNhc2UgRDdTSU9DUkQ6CkBAIC0xNTgsOSArMTQzLDExIEBACiAKIAljYXNlIEQ3U0lPQ1RNOgogCQkvKiB0b2dnbGUgZGV2aWNlIG1vZGUtLSBmbGlwIGRpc3BsYXkgb3JpZW50YXRpb24gKi8KLQkJKHJlZ3MgJiBEN1NfRkxJUCkgPyAKLQkJCShyZWdzICY9IH5EN1NfRkxJUCkgOiAocmVncyB8PSBEN1NfRkxJUCk7Ci0JCXdyaXRlYihyZWdzLCBkN3NfcmVncyk7CisJCWlmIChyZWdzICYgRDdTX0ZMSVApCisJCQlyZWdzICY9IH5EN1NfRkxJUDsKKwkJZWxzZQorCQkJcmVncyB8PSBEN1NfRkxJUDsKKwkJd3JpdGViKHJlZ3MsIHAtPnJlZ3MpOwogCQlicmVhazsKIAl9OwogCXVubG9ja19rZXJuZWwoKTsKQEAgLTE3Niw2OSArMTYzLDEyMyBAQAogCS5yZWxlYXNlID0JCWQ3c19yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGQ3c19taXNjZGV2ID0geyBEN1NfTUlOT1IsIEQ3U19ERVZOQU1FLCAmZDdzX2ZvcHMgfTsKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkN3NfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gRDdTX01JTk9SLAorCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5mb3BzCQk9ICZkN3NfZm9wcworfTsKIAotc3RhdGljIGludCBfX2luaXQgZDdzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGQ3c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1cyA9IE5VTEw7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKLQlpbnQgaVRtcCA9IDAsIHJlZ3MgPSAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb3B0czsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZDdzICpwOworCXU4IHJlZ3M7CiAKLQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsIEQ3U19PQlBOQU1FKSkKLQkJCQlnb3RvIGVidXNfZG9uZTsKLQkJfQorCWlmIChkN3NfZGV2aWNlKQorCQlnb3RvIG91dDsKKworCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFwKQorCQlnb3RvIG91dDsKKworCXAtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIHNpemVvZih1OCksICJkN3MiKTsKKwlpZiAoIXAtPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBjaGlwIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi1lYnVzX2RvbmU6Ci0JaWYoIWVkZXYpIHsKLQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGxvY2F0ZSBkZXZpY2VcbiIsIEQ3U19ERVZOQU1FKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJZXJyID0gbWlzY19yZWdpc3RlcigmZDdzX21pc2NkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFjcXVpcmUgbWlzY2RldmljZSBtaW5vciAlaVxuIiwKKwkJICAgICAgIEQ3U19NSU5PUik7CisJCWdvdG8gb3V0X2lvdW5tYXA7CiAJfQogCi0JZDdzX3JlZ3MgPSBpb3JlbWFwKGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBzaXplb2YoX191OCkpOwotCi0JaVRtcCA9IG1pc2NfcmVnaXN0ZXIoJmQ3c19taXNjZGV2KTsKLQlpZiAoMCAhPSBpVG1wKSB7Ci0JCXByaW50aygiJXM6IHVuYWJsZSB0byBhY3F1aXJlIG1pc2NkZXZpY2UgbWlub3IgJWlcbiIsCi0JCSAgICAgICBEN1NfREVWTkFNRSwgRDdTX01JTk9SKTsKLQkJaW91bm1hcChkN3NfcmVncyk7Ci0JCXJldHVybiBpVG1wOwotCX0KLQotCS8qIE9CUCBvcHRpb24gImQ3cy1mbGlwcGVkPyIgaXMgaG9ub3JlZCBhcyBkZWZhdWx0Ci0JICogZm9yIHRoZSBkZXZpY2UsIGFuZCByZXNldCBkZWZhdWx0IHdoZW4gZGV0YWNoZWQKKwkvKiBPQlAgb3B0aW9uICJkN3MtZmxpcHBlZD8iIGlzIGhvbm9yZWQgYXMgZGVmYXVsdCBmb3IgdGhlCisJICogZGV2aWNlLCBhbmQgcmVzZXQgZGVmYXVsdCB3aGVuIGRldGFjaGVkCiAJICovCi0JcmVncyA9IHJlYWRiKGQ3c19yZWdzKTsKLQlpVG1wID0gZDdzX29icGZsaXBwZWQoKTsKLQkoMCA9PSBpVG1wKSA/IAotCQl3cml0ZWIocmVncyB8PSBEN1NfRkxJUCwgIGQ3c19yZWdzKTogCi0JCXdyaXRlYihyZWdzICY9IH5EN1NfRkxJUCwgZDdzX3JlZ3MpOworCXJlZ3MgPSByZWFkYihwLT5yZWdzKTsKKwlvcHRzID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9vcHRpb25zIik7CisJaWYgKG9wdHMgJiYKKwkgICAgb2ZfZ2V0X3Byb3BlcnR5KG9wdHMsICJkN3MtZmxpcHBlZD8iLCBOVUxMKSkKKwkJcC0+ZmxpcHBlZCA9IHRydWU7CiAKLQlwcmludGsoIiVzOiA3LVNlZ21lbnQgRGlzcGxheSVzIGF0IDB4JWx4ICVzXG4iLCAKLQkgICAgICAgRDdTX0RFVk5BTUUsCi0JICAgICAgICgwID09IGlUbXApID8gKCIgKEZMSVBQRUQpIikgOiAoIiIpLAotCSAgICAgICBlZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKLQkgICAgICAgKDAgIT0gc29sX2NvbXBhdCkgPyAoImluIHNvbF9jb21wYXQgbW9kZSIpIDogKCIiKSk7CisJaWYgKHAtPmZsaXBwZWQpCisJCXJlZ3MgfD0gRDdTX0ZMSVA7CisJZWxzZQorCQlyZWdzICY9IH5EN1NfRkxJUDsKKworCXdyaXRlYihyZWdzLCAgcC0+cmVncyk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiNy1TZWdtZW50IERpc3BsYXklcyBhdCBbJXM6MHglbHhdICVzXG4iLCAKKwkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwKKwkgICAgICAgKHJlZ3MgJiBEN1NfRkxJUCkgPyAiIChGTElQUEVEKSIgOiAiIiwKKwkgICAgICAgb3AtPnJlc291cmNlWzBdLnN0YXJ0LAorCSAgICAgICBzb2xfY29tcGF0ID8gImluIHNvbF9jb21wYXQgbW9kZSIgOiAiIik7CisKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHApOworCWQ3c19kZXZpY2UgPSBwOworCWVyciA9IDA7CisKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfaW91bm1hcDoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIHNpemVvZih1OCkpOworCitvdXRfZnJlZToKKwlrZnJlZShwKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZDdzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgZDdzICpwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwl1OCByZWdzID0gcmVhZGIocC0+cmVncyk7CisKKwkvKiBIb25vciBPQlAgZDdzLWZsaXBwZWQ/IHVubGVzcyBvcGVyYXRpbmcgaW4gc29sYXJpcy1jb21wYXQgbW9kZSAqLworCWlmIChzb2xfY29tcGF0KSB7CisJCWlmIChwLT5mbGlwcGVkKQorCQkJcmVncyB8PSBEN1NfRkxJUDsKKwkJZWxzZQorCQkJcmVncyAmPSB+RDdTX0ZMSVA7CisJCXdyaXRlYihyZWdzLCBwLT5yZWdzKTsKKwl9CisKKwltaXNjX2RlcmVnaXN0ZXIoJmQ3c19taXNjZGV2KTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIHNpemVvZih1OCkpOworCWtmcmVlKHApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkN3NfY2xlYW51cCh2b2lkKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZDdzX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJkaXNwbGF5N3NlZyIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBkN3NfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBkN3NfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IGQ3c19tYXRjaCwKKwkucHJvYmUJCT0gZDdzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZDdzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkN3NfaW5pdCh2b2lkKQogewotCWludCByZWdzID0gcmVhZGIoZDdzX3JlZ3MpOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmQ3c19kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CiAKLQkvKiBIb25vciBPQlAgZDdzLWZsaXBwZWQ/IHVubGVzcyBvcGVyYXRpbmcgaW4gc29sYXJpcy1jb21wYXQgbW9kZSAqLwotCWlmICgwID09IHNvbF9jb21wYXQpIHsKLQkJKDAgPT0gZDdzX29icGZsaXBwZWQoKSkJPyAKLQkJCXdyaXRlYihyZWdzIHw9IEQ3U19GTElQLCAgZDdzX3JlZ3MpOgotCQkJd3JpdGViKHJlZ3MgJj0gfkQ3U19GTElQLCBkN3NfcmVncyk7Ci0JfQotCi0JbWlzY19kZXJlZ2lzdGVyKCZkN3NfbWlzY2Rldik7Ci0JZDdzX2ZyZWUoKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBkN3NfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZkN3NfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoZDdzX2luaXQpOwotbW9kdWxlX2V4aXQoZDdzX2NsZWFudXApOworbW9kdWxlX2V4aXQoZDdzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IGE0MDg0MDIuLjU4ZTU4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IGVudmN0cmwuYyx2IDEuMjUgMjAwMi8wMS8xNSAwOTowMToyNiBkYXZlbSBFeHAgJAotICogZW52Y3RybC5jOiBUZW1wZXJhdHVyZSBhbmQgRmFuIG1vbml0b3Jpbmcgb24gTWFjaGluZXMgcHJvdmlkaW5nIGl0LgorLyogZW52Y3RybC5jOiBUZW1wZXJhdHVyZSBhbmQgRmFuIG1vbml0b3Jpbmcgb24gTWFjaGluZXMgcHJvdmlkaW5nIGl0LgogICoKICAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIFZpbmggVHJ1b25nICAgICh2aW5oLnRydW9uZ0Blbmcuc3VuLmNvbSkKQEAgLTI4LDEyICsyNywxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2VudmN0cmwuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorI2RlZmluZSBEUklWRVJfTkFNRQkiZW52Y3RybCIKKyNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCisKICNkZWZpbmUgRU5WQ1RSTF9NSU5PUgkxNjIKIAogI2RlZmluZSBQQ0Y4NTg0X0FERFJFU1MJMHg1NQpAQCAtMTkzLDcgKzE5Niw3IEBACiAJfSAKIAogCWlmIChsaW1pdCA8PSAwKQotCQlwcmludGsoS0VSTl9JTkZPICJlbnZjdHJsOiBQaW4gc3RhdHVzIHdpbGwgbm90IGNsZWFyLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQaW4gc3RhdHVzIHdpbGwgbm90IGNsZWFyLlxuIik7CiB9CiAKIC8qIEZ1bmN0aW9uIERlc2NyaXB0aW9uOiBUZXN0IGJ1c3kgYml0LgpAQCAtMjExLDcgKzIxNCw3IEBACiAJfSAKIAogCWlmIChsaW1pdCA8PSAwKQotCQlwcmludGsoS0VSTl9JTkZPICJlbnZjdHJsOiBCdXN5IGJpdCB3aWxsIG5vdCBjbGVhci5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQnVzeSBiaXQgd2lsbCBub3QgY2xlYXIuXG4iKTsKIH0KIAogLyogRnVuY3Rpb24gRGVzY3JpcHRpb246IFNlbmQgdGhlIGFkZHJlc3MgZm9yIGEgcmVhZCBhY2Nlc3MuCkBAIC04NTgsMTEgKzg2MSwxMCBAQAogLyogRnVuY3Rpb24gRGVzY3JpcHRpb246IEluaXRpYWxpemUgaTJjIGNoaWxkIGRldmljZS4KICAqIFJldHVybjogTm9uZS4KICAqLwotc3RhdGljIHZvaWQgZW52Y3RybF9pbml0X2kyY19jaGlsZChzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqZWRldl9jaGlsZCwKK3N0YXRpYyB2b2lkIGVudmN0cmxfaW5pdF9pMmNfY2hpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKIAkJCQkgICBzdHJ1Y3QgaTJjX2NoaWxkX3QgKnBjaGlsZCkKIHsKIAlpbnQgbGVuLCBpLCB0YmxzX3NpemUgPSAwOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBlZGV2X2NoaWxkLT5wcm9tX25vZGU7CiAJY29uc3Qgdm9pZCAqcHZhbDsKIAogCS8qIEdldCBkZXZpY2UgYWRkcmVzcy4gKi8KQEAgLTg4MiwxMiArODg0LDEyIEBACiAKICAgICAgICAgICAgICAgICBwY2hpbGQtPnRhYmxlcyA9IGttYWxsb2ModGJsc19zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHBjaGlsZC0+dGFibGVzID09IE5VTEwpewotCQkJcHJpbnRrKCJlbnZjdHJsOiBGYWlsZWQgdG8gYWxsb2NhdGUgdGFibGUuXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byBhbGxvY2F0ZSB0YWJsZS5cbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJ0YWJsZXMiLCAmbGVuKTsKICAgICAgICAgICAgICAgICBpZiAoIXB2YWwgfHwgbGVuIDw9IDApIHsKLQkJCXByaW50aygiZW52Y3RybDogRmFpbGVkIHRvIGdldCB0YWJsZS5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGdldCB0YWJsZS5cbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCW1lbWNweShwY2hpbGQtPnRhYmxlcywgcHZhbCwgbGVuKTsKQEAgLTk5MywxNCArOTk1LDE0IEBACiAJc3RydWN0IGkyY19jaGlsZF90ICpjcHV0ZW1wOwogCiAJaWYgKE5VTEwgPT0gKGNwdXRlbXAgPSBlbnZjdHJsX2dldF9pMmNfY2hpbGQoRU5WQ1RSTF9DUFVURU1QX01PTikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAKLQkJICAgICAgICJlbnZjdHJsOiBrZW52Y3RybGQgdW5hYmxlIHRvIG1vbml0b3IgQ1BVIHRlbXAtLSBleGl0aW5nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICBQRlgKKwkJICAgICAgICJrZW52Y3RybGQgdW5hYmxlIHRvIG1vbml0b3IgQ1BVIHRlbXAtLSBleGl0aW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcG9sbF9pbnRlcnZhbCA9IDUwMDA7IC8qIFRPRE8gZW52X21vbl9pbnRlcnZhbCAqLwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiZW52Y3RybDogJXMgc3RhcnRpbmcuLi5cbiIsIGN1cnJlbnQtPmNvbW0pOworCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBzdGFydGluZy4uLlxuIiwgY3VycmVudC0+Y29tbSk7CiAJZm9yICg7OykgewogCQltc2xlZXBfaW50ZXJydXB0aWJsZShwb2xsX2ludGVydmFsKTsKIApAQCAtMTAyMiw1NCArMTAyNCwzNSBAQAogCQkJfQogCQl9CiAJfQotCXByaW50ayhLRVJOX0lORk8gImVudmN0cmw6ICVzIGV4aXRpbmcuLi5cbiIsIGN1cnJlbnQtPmNvbW0pOworCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBleGl0aW5nLi4uXG4iLCBjdXJyZW50LT5jb21tKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZW52Y3RybF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbnZjdHJsX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBsaW51eF9lYnVzICplYnVzID0gTlVMTDsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSBOVUxMOwotCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplZGV2X2NoaWxkID0gTlVMTDsKLQlpbnQgZXJyLCBpID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCWludCBpbmRleCwgZXJyOwogCi0JZm9yX2VhY2hfZWJ1cyhlYnVzKSB7Ci0JCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiYmJjIikpIHsKLQkJCQkvKiBJZiB3ZSBmaW5kIGEgYm9vdC1idXMgY29udHJvbGxlciBub2RlLAotCQkJCSAqIHRoZW4gdGhpcyBlbnZjdHJsIGRyaXZlciBpcyBub3QgZm9yIHVzLgotCQkJCSAqLwotCQkJCXJldHVybiAtRU5PREVWOwotCQkJfQorCWlmIChpMmMpCisJCXJldHVybiAtRUlOVkFMOworCisJaTJjID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLCAweDIsIERSSVZFUl9OQU1FKTsKKwlpZiAoIWkyYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmRleCA9IDA7CisJZHAgPSBvcC0+bm9kZS0+Y2hpbGQ7CisJd2hpbGUgKGRwKSB7CisJCWlmICghc3RyY21wKGRwLT5uYW1lLCAiZ3BpbyIpKSB7CisJCQlpMmNfY2hpbGRsaXN0W2luZGV4XS5pMmN0eXBlID0gSTJDX0dQSU87CisJCQllbnZjdHJsX2luaXRfaTJjX2NoaWxkKGRwLCAmKGkyY19jaGlsZGxpc3RbaW5kZXgrK10pKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGRwLT5uYW1lLCAiYWRjIikpIHsKKwkJCWkyY19jaGlsZGxpc3RbaW5kZXhdLmkyY3R5cGUgPSBJMkNfQURDOworCQkJZW52Y3RybF9pbml0X2kyY19jaGlsZChkcCwgJihpMmNfY2hpbGRsaXN0W2luZGV4KytdKSk7CiAJCX0KLQl9CiAKLQkvKiBUcmF2ZXJzZSB0aHJvdWdoIGVidXMgYW5kIGVidXMgZGV2aWNlIGxpc3QgZm9yIGkyYyBkZXZpY2UgYW5kCi0JICogYWRjIGFuZCBncGlvIG5vZGVzLgotCSAqLwotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImkyYyIpKSB7Ci0JCQkJaTJjID0gaW9yZW1hcChlZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMHgyKTsKLQkJCQlmb3JfZWFjaF9lZGV2Y2hpbGQoZWRldiwgZWRldl9jaGlsZCkgewotCQkJCQlpZiAoIXN0cmNtcCgiZ3BpbyIsIGVkZXZfY2hpbGQtPnByb21fbm9kZS0+bmFtZSkpIHsKLQkJCQkJCWkyY19jaGlsZGxpc3RbaV0uaTJjdHlwZSA9IEkyQ19HUElPOwotCQkJCQkJZW52Y3RybF9pbml0X2kyY19jaGlsZChlZGV2X2NoaWxkLCAmKGkyY19jaGlsZGxpc3RbaSsrXSkpOwotCQkJCQl9Ci0JCQkJCWlmICghc3RyY21wKCJhZGMiLCBlZGV2X2NoaWxkLT5wcm9tX25vZGUtPm5hbWUpKSB7Ci0JCQkJCQlpMmNfY2hpbGRsaXN0W2ldLmkyY3R5cGUgPSBJMkNfQURDOwotCQkJCQkJZW52Y3RybF9pbml0X2kyY19jaGlsZChlZGV2X2NoaWxkLCAmKGkyY19jaGlsZGxpc3RbaSsrXSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJfQotCX0KLQotZG9uZToKLQlpZiAoIWVkZXYpIHsKLQkJcHJpbnRrKCJlbnZjdHJsOiBJMkMgZGV2aWNlIG5vdCBmb3VuZC5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZHAgPSBkcC0+c2libGluZzsKIAl9CiAKIAkvKiBTZXQgZGV2aWNlIGFkZHJlc3MuICovCkBAIC0xMDg3LDcgKzEwNzAsNyBAQAogCS8qIFJlZ2lzdGVyIHRoZSBkZXZpY2UgYXMgYSBtaW5vciBtaXNjZWxsYW5lb3VzIGRldmljZS4gKi8KIAllcnIgPSBtaXNjX3JlZ2lzdGVyKCZlbnZjdHJsX2Rldik7CiAJaWYgKGVycikgewotCQlwcmludGsoImVudmN0cmw6IFVuYWJsZSB0byBnZXQgbWlzYyBtaW5vciAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGdldCBtaXNjIG1pbm9yICVkXG4iLAogCQkgICAgICAgZW52Y3RybF9kZXYubWlub3IpOwogCQlnb3RvIG91dF9pb3VubWFwOwogCX0KQEAgLTEwOTYsMTIgKzEwNzksMTIgQEAKIAkgKiBhIG5leHQgY2hpbGQgZGV2aWNlLCBzbyB3ZSBkZWNyZW1lbnQgYmVmb3JlIHJldmVyc2UtdHJhdmVyc2FsIG9mCiAJICogY2hpbGQgZGV2aWNlcy4KIAkgKi8KLQlwcmludGsoImVudmN0cmw6IGluaXRpYWxpemVkICIpOwotCWZvciAoLS1pOyBpID49IDA7IC0taSkgeworCXByaW50ayhLRVJOX0lORk8gUEZYICJJbml0aWFsaXplZCAiKTsKKwlmb3IgKC0taW5kZXg7IGluZGV4ID49IDA7IC0taW5kZXgpIHsKIAkJcHJpbnRrKCJbJXMgMHglbHhdJXMiLCAKLQkJCShJMkNfQURDID09IGkyY19jaGlsZGxpc3RbaV0uaTJjdHlwZSkgPyAoImFkYyIpIDogCi0JCQkoKEkyQ19HUElPID09IGkyY19jaGlsZGxpc3RbaV0uaTJjdHlwZSkgPyAoImdwaW8iKSA6ICgidW5rbm93biIpKSwgCi0JCQlpMmNfY2hpbGRsaXN0W2ldLmFkZHIsICgwID09IGkpID8gKCJcbiIpIDogKCIgIikpOworCQkJKEkyQ19BREMgPT0gaTJjX2NoaWxkbGlzdFtpbmRleF0uaTJjdHlwZSkgPyAiYWRjIiA6IAorCQkJKChJMkNfR1BJTyA9PSBpMmNfY2hpbGRsaXN0W2luZGV4XS5pMmN0eXBlKSA/ICJncGlvIiA6ICJ1bmtub3duIiksIAorCQkJaTJjX2NoaWxkbGlzdFtpbmRleF0uYWRkciwgKDAgPT0gaW5kZXgpID8gIlxuIiA6ICIgIik7CiAJfQogCiAJa2VudmN0cmxkX3Rhc2sgPSBrdGhyZWFkX3J1bihrZW52Y3RybGQsIE5VTEwsICJrZW52Y3RybGQiKTsKQEAgLTExMTUsMjYgKzEwOTgsNTQgQEAKIG91dF9kZXJlZ2lzdGVyOgogCW1pc2NfZGVyZWdpc3RlcigmZW52Y3RybF9kZXYpOwogb3V0X2lvdW5tYXA6Ci0JaW91bm1hcChpMmMpOwotCWZvciAoaSA9IDA7IGkgPCBFTlZDVFJMX01BWF9DUFUgKiAyOyBpKyspCi0JCWtmcmVlKGkyY19jaGlsZGxpc3RbaV0udGFibGVzKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGkyYywgMHgyKTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBFTlZDVFJMX01BWF9DUFUgKiAyOyBpbmRleCsrKQorCQlrZnJlZShpMmNfY2hpbGRsaXN0W2luZGV4XS50YWJsZXMpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGVudmN0cmxfY2xlYW51cCh2b2lkKQorc3RhdGljIGludCBfX2RldmV4aXQgZW52Y3RybF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0JaW50IGk7CisJaW50IGluZGV4OwogCiAJa3RocmVhZF9zdG9wKGtlbnZjdHJsZF90YXNrKTsKIAotCWlvdW5tYXAoaTJjKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGkyYywgMHgyKTsKIAltaXNjX2RlcmVnaXN0ZXIoJmVudmN0cmxfZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCBFTlZDVFJMX01BWF9DUFUgKiAyOyBpKyspCi0JCWtmcmVlKGkyY19jaGlsZGxpc3RbaV0udGFibGVzKTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBFTlZDVFJMX01BWF9DUFUgKiAyOyBpbmRleCsrKQorCQlrZnJlZShpMmNfY2hpbGRsaXN0W2luZGV4XS50YWJsZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVudmN0cmxfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gImkyYyIsCisJCS5jb21wYXRpYmxlID0gImkyY3BjZiw4NTg0IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGVudmN0cmxfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBlbnZjdHJsX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSBlbnZjdHJsX21hdGNoLAorCS5wcm9iZQkJPSBlbnZjdHJsX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZW52Y3RybF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW52Y3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZW52Y3RybF9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbnZjdHJsX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZW52Y3RybF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChlbnZjdHJsX2luaXQpOwotbW9kdWxlX2V4aXQoZW52Y3RybF9jbGVhbnVwKTsKK21vZHVsZV9leGl0KGVudmN0cmxfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCA3ZDk1ZTE1Li40MTA4MzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IGZsYXNoLmMsdiAxLjI1IDIwMDEvMTIvMjEgMDQ6NTY6MTYgZGF2ZW0gRXhwICQKLSAqIGZsYXNoLmM6IEFsbG93IG1tYXAgYWNjZXNzIHRvIHRoZSBPQlAgRmxhc2gsIGZvciBPQlAgdXBkYXRlcy4KKy8qIGZsYXNoLmM6IEFsbG93IG1tYXAgYWNjZXNzIHRvIHRoZSBPQlAgRmxhc2gsIGZvciBPQlAgdXBkYXRlcy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcgIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogICovCkBAIC0xNSwxMyArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgotI2luY2x1ZGUgPGFzbS9lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3VwYS5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZsYXNoX2xvY2spOwpAQCAtMTYxLDk3ICsxNjAsNjggQEAKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGZsYXNoX2RldiA9IHsgRkxBU0hfTUlOT1IsICJmbGFzaCIsICZmbGFzaF9mb3BzIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGZsYXNoX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZsYXNoX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfUENJCi0Jc3RydWN0IGxpbnV4X2VidXMgKmVidXM7Ci0Jc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnc1syXTsKLQlpbnQgbGVuLCBucmVnczsKLSNlbmRpZgotCWludCBlcnI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwogCi0JZm9yX2FsbF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJaWYgKCFzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiZmxhc2hwcm9tIikpIHsKLQkJCWlmIChzZGV2LT5yZWdfYWRkcnNbMF0ucGh5c19hZGRyID09IHNkZXYtPnJlZ19hZGRyc1sxXS5waHlzX2FkZHIpIHsKLQkJCQlmbGFzaC5yZWFkX2Jhc2UgPSAoKHVuc2lnbmVkIGxvbmcpc2Rldi0+cmVnX2FkZHJzWzBdLnBoeXNfYWRkcikgfAotCQkJCQkoKCh1bnNpZ25lZCBsb25nKXNkZXYtPnJlZ19hZGRyc1swXS53aGljaF9pbyk8PDMyVUwpOwotCQkJCWZsYXNoLnJlYWRfc2l6ZSA9IHNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZTsKLQkJCQlmbGFzaC53cml0ZV9iYXNlID0gZmxhc2gucmVhZF9iYXNlOwotCQkJCWZsYXNoLndyaXRlX3NpemUgPSBmbGFzaC5yZWFkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCWZsYXNoLnJlYWRfYmFzZSA9ICgodW5zaWduZWQgbG9uZylzZGV2LT5yZWdfYWRkcnNbMF0ucGh5c19hZGRyKSB8Ci0JCQkJCSgoKHVuc2lnbmVkIGxvbmcpc2Rldi0+cmVnX2FkZHJzWzBdLndoaWNoX2lvKTw8MzJVTCk7Ci0JCQkJZmxhc2gucmVhZF9zaXplID0gc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplOwotCQkJCWZsYXNoLndyaXRlX2Jhc2UgPSAoKHVuc2lnbmVkIGxvbmcpc2Rldi0+cmVnX2FkZHJzWzFdLnBoeXNfYWRkcikgfAotCQkJCQkoKCh1bnNpZ25lZCBsb25nKXNkZXYtPnJlZ19hZGRyc1sxXS53aGljaF9pbyk8PDMyVUwpOwotCQkJCWZsYXNoLndyaXRlX3NpemUgPSBzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemU7Ci0JCQl9Ci0JCQlmbGFzaC5idXN5ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghc2RldikgewotI2lmZGVmIENPTkZJR19QQ0kKLQkJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICplYnVzX3JlZ3M7CisJcGFyZW50ID0gZHAtPnBhcmVudDsKIAotCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImZsYXNocHJvbSIpKQotCQkJCQlnb3RvIGVidXNfZG9uZTsKLQkJCX0KLQkJfQotCWVidXNfZG9uZToKLQkJaWYgKCFlZGV2KQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJZWJ1c19yZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGVkZXYtPnByb21fbm9kZSwgInJlZyIsICZsZW4pOwotCQlpZiAoIWVidXNfcmVncyB8fCAobGVuICUgc2l6ZW9mKHJlZ3NbMF0pKSAhPSAwKSB7Ci0JCQlwcmludGsoImZsYXNoOiBTdHJhbmdlIHJlZyBwcm9wZXJ0eSBzaXplICVkXG4iLCBsZW4pOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlucmVncyA9IGxlbiAvIHNpemVvZihlYnVzX3JlZ3NbMF0pOwotCi0JCWZsYXNoLnJlYWRfYmFzZSA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCQlmbGFzaC5yZWFkX3NpemUgPSBlYnVzX3JlZ3NbMF0ucmVnX3NpemU7Ci0KLQkJaWYgKG5yZWdzID09IDEpIHsKLQkJCWZsYXNoLndyaXRlX2Jhc2UgPSBlZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKLQkJCWZsYXNoLndyaXRlX3NpemUgPSBlYnVzX3JlZ3NbMF0ucmVnX3NpemU7Ci0JCX0gZWxzZSBpZiAobnJlZ3MgPT0gMikgewotCQkJZmxhc2gud3JpdGVfYmFzZSA9IGVkZXYtPnJlc291cmNlWzFdLnN0YXJ0OwotCQkJZmxhc2gud3JpdGVfc2l6ZSA9IGVidXNfcmVnc1sxXS5yZWdfc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCXByaW50aygiZmxhc2g6IFN0cmFuZ2UgbnVtYmVyIG9mIHJlZ3MgJWRcbiIsIG5yZWdzKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJZmxhc2guYnVzeSA9IDA7Ci0KLSNlbHNlCisJaWYgKHN0cmNtcChwYXJlbnQtPm5hbWUsICJzYnVzIikgJiYKKwkgICAgc3RyY21wKHBhcmVudC0+bmFtZSwgInNiaSIpICYmCisJICAgIHN0cmNtcChwYXJlbnQtPm5hbWUsICJlYnVzIikpCiAJCXJldHVybiAtRU5PREVWOwotI2VuZGlmCi0JfQogCi0JcHJpbnRrKCJPQlAgRmxhc2g6IFJEICVseFslbHhdIFdSICVseFslbHhdXG4iLAorCWZsYXNoLnJlYWRfYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKKwlmbGFzaC5yZWFkX3NpemUgPSByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pOworCWlmIChvcC0+cmVzb3VyY2VbMV0uZmxhZ3MpIHsKKwkJZmxhc2gud3JpdGVfYmFzZSA9IG9wLT5yZXNvdXJjZVsxXS5zdGFydDsKKwkJZmxhc2gud3JpdGVfc2l6ZSA9IHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVsxXSk7CisJfSBlbHNlIHsKKwkJZmxhc2gud3JpdGVfYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKKwkJZmxhc2gud3JpdGVfc2l6ZSA9IHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSk7CisJfQorCWZsYXNoLmJ1c3kgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9CUCBGbGFzaCwgUkQgJWx4WyVseF0gV1IgJWx4WyVseF1cbiIsCisJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsCiAJICAgICAgIGZsYXNoLnJlYWRfYmFzZSwgZmxhc2gucmVhZF9zaXplLAogCSAgICAgICBmbGFzaC53cml0ZV9iYXNlLCBmbGFzaC53cml0ZV9zaXplKTsKIAotCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmZsYXNoX2Rldik7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImZsYXNoOiB1bmFibGUgdG8gZ2V0IG1pc2MgbWlub3JcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlyZXR1cm4gbWlzY19yZWdpc3RlcigmZmxhc2hfZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZmxhc2hfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCW1pc2NfZGVyZWdpc3RlcigmZmxhc2hfZGV2KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmbGFzaF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiZmxhc2hwcm9tIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZsYXNoX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZmxhc2hfZHJpdmVyID0geworCS5uYW1lCQk9ICJmbGFzaCIsCisJLm1hdGNoX3RhYmxlCT0gZmxhc2hfbWF0Y2gsCisJLnByb2JlCQk9IGZsYXNoX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZmxhc2hfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZsYXNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZmbGFzaF9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBmbGFzaF9jbGVhbnVwKHZvaWQpCiB7Ci0JbWlzY19kZXJlZ2lzdGVyKCZmbGFzaF9kZXYpOworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZmbGFzaF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChmbGFzaF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL3Jpb3dhdGNoZG9nLmMgYi9kcml2ZXJzL3NidXMvY2hhci9yaW93YXRjaGRvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMwZmM2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3Jpb3dhdGNoZG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyogJElkOiByaW93YXRjaGRvZy5jLHYgMS4zLjIuMiAyMDAyLzAxLzIzIDE4OjQ4OjAyIGRhdmVtIEV4cCAkCi0gKiByaW93YXRjaGRvZy5jIC0gZHJpdmVyIGZvciBodyB3YXRjaGRvZyBpbnNpZGUgU3VwZXIgSS9PIG9mIFJJTwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9lYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL2JiYy5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vd2F0Y2hkb2cuaD4KLQotLyogUklPIHVzZXMgdGhlIE5hdFNlbWkgU3VwZXIgSS9PIHBvd2VyIG1hbmFnZW1lbnQgbG9naWNhbCBkZXZpY2UKLSAqIGFzIGl0cycgd2F0Y2hkb2cuCi0gKgotICogV2hlbiB0aGUgd2F0Y2hkb2cgdHJpZ2dlcnMsIGl0IGFzc2VydHMgYSBsaW5lIHRvIHRoZSBCQkMgKEJvb3QgQnVzCi0gKiBDb250cm9sbGVyKSBvZiB0aGUgbWFjaGluZS4gIFRoZSBCQkMgY2FuIG9ubHkgYmUgY29uZmlndXJlZCB0bwotICogdHJpZ2dlciBhIHBvd2VyLW9uIHJlc2V0IHdoZW4gdGhlIHNpZ25hbCBpcyBhc3NlcnRlZC4gIFRoZSBCQkMKLSAqIGNhbiBiZSBjb25maWd1cmVkIHRvIGlnbm9yZSB0aGUgc2lnbmFsIGVudGlyZWx5IGFzIHdlbGwuCi0gKgotICogVGhlIG9ubHkgU3VwZXIgSS9PIGRldmljZSByZWdpc3RlciB3ZSBjYXJlIGFib3V0IGlzIGF0IGluZGV4Ci0gKiAweDA1IChXRFRPX0lOREVYKSB3aGljaCBpcyB0aGUgd2F0Y2hkb2cgdGltZS1vdXQgaW4gbWludXRlcyAoMS0yNTUpLgotICogSWYgc2V0IHRvIHplcm8sIHRoaXMgZGlzYWJsZXMgdGhlIHdhdGNoZG9nLiAgV2hlbiBzZXQsIHRoZSBzeXN0ZW0KLSAqIG11c3QgcGVyaW9kaWNhbGx5IChiZWZvcmUgd2F0Y2hkb2cgZXhwaXJlcykgY2xlYXIgKHNldCB0byB6ZXJvKSBhbmQKLSAqIHJlLXNldCB0aGUgd2F0Y2hkb2cgZWxzZSBpdCB3aWxsIHRyaWdnZXIuCi0gKgotICogVGhlcmUgYXJlIHR3byBvdGhlciBpbmRleGVkIHdhdGNoZG9nIHJlZ2lzdGVycyBpbnNpZGUgdGhpcyBTdXBlciBJL08KLSAqIGxvZ2ljYWwgZGV2aWNlLCBidXQgdGhleSBhcmUgdW51c2VkLiAgVGhlIGZpcnN0LCBhdCBpbmRleCAweDA2IGlzCi0gKiB0aGUgd2F0Y2hkb2cgY29udHJvbCBhbmQgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGUgd2F0Y2hkb2cgdGltZXIgcmUtc2V0Ci0gKiB3aGVuIHRoZSBQUy8yIG1vdXNlIG9yIHNlcmlhbCBsaW5lcyBzaG93IGFjdGl2aXR5LiAgVGhlIHNlY29uZCwgYXQKLSAqIGluZGV4IDB4MDcgaXMgbWVyZWx5IGEgc2FtcGxpbmcgb2YgdGhlIGxpbmUgZnJvbSB0aGUgd2F0Y2hkb2cgdG8gdGhlCi0gKiBCQkMuCi0gKgotICogVGhlIHdhdGNoZG9nIGRldmljZSBnZW5lcmF0ZXMgbm8gaW50ZXJydXB0cy4KLSAqLwotCi1NT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIHdhdGNoZG9nIGRyaXZlciBmb3IgU3VuIFJJTyIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIndhdGNoZG9nIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgUklPV0RfTkFNRQkicG1jIgotI2RlZmluZSBSSU9XRF9NSU5PUgkyMTUKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhyaW93ZF9sb2NrKTsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqYmJjX3JlZ3M7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICpyaW93ZF9yZWdzOwotI2RlZmluZSBXRFRPX0lOREVYCTB4MDUKLQotc3RhdGljIGludCByaW93ZF90aW1lb3V0ID0gMTsJCS8qIGluIG1pbnV0ZXMgKi8KLW1vZHVsZV9wYXJhbShyaW93ZF90aW1lb3V0LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhyaW93ZF90aW1lb3V0LCAiV2F0Y2hkb2cgdGltZW91dCBpbiBtaW51dGVzIik7Ci0KLSNpZiAwIC8qIEN1cnJlbnRseSB1bnVzZWQuICovCi1zdGF0aWMgdTggcmlvd2RfcmVhZHJlZyhpbnQgaW5kZXgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmlvd2RfbG9jaywgZmxhZ3MpOwotCXdyaXRlYihpbmRleCwgcmlvd2RfcmVncyArIDApOwotCXJldCA9IHJlYWRiKHJpb3dkX3JlZ3MgKyAxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW93ZF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJpb3dkX3dyaXRlcmVnKHU4IHZhbCwgaW50IGluZGV4KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmlvd2RfbG9jaywgZmxhZ3MpOwotCXdyaXRlYihpbmRleCwgcmlvd2RfcmVncyArIDApOwotCXdyaXRlYih2YWwsIHJpb3dkX3JlZ3MgKyAxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW93ZF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJpb3dkX3Bpbmd0aW1lcih2b2lkKQotewotCXJpb3dkX3dyaXRlcmVnKHJpb3dkX3RpbWVvdXQsIFdEVE9fSU5ERVgpOwotfQotCi1zdGF0aWMgdm9pZCByaW93ZF9zdG9wdGltZXIodm9pZCkKLXsKLQl1OCB2YWw7Ci0KLQlyaW93ZF93cml0ZXJlZygwLCBXRFRPX0lOREVYKTsKLQotCXZhbCA9IHJlYWRiKGJiY19yZWdzICsgQkJDX1dEQUNUSU9OKTsKLQl2YWwgJj0gfkJCQ19XREFDVElPTl9SU1Q7Ci0Jd3JpdGViKHZhbCwgYmJjX3JlZ3MgKyBCQkNfV0RBQ1RJT04pOwotfQotCi1zdGF0aWMgdm9pZCByaW93ZF9zdGFydHRpbWVyKHZvaWQpCi17Ci0JdTggdmFsOwotCi0Jcmlvd2Rfd3JpdGVyZWcocmlvd2RfdGltZW91dCwgV0RUT19JTkRFWCk7Ci0KLQl2YWwgPSByZWFkYihiYmNfcmVncyArIEJCQ19XREFDVElPTik7Ci0JdmFsIHw9IEJCQ19XREFDVElPTl9SU1Q7Ci0Jd3JpdGViKHZhbCwgYmJjX3JlZ3MgKyBCQkNfV0RBQ1RJT04pOwotfQotCi1zdGF0aWMgaW50IHJpb3dkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JY3ljbGVfa2VybmVsX2xvY2soKTsKLQlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByaW93ZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJpb3dkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGluZm8gPSB7Ci0JICAgICAgIAlXRElPRl9TRVRUSU1FT1VULCAwLCAiTmF0bC4gU2VtaWNvbmR1Y3RvciBQQzk3MzE3IgotCX07Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JdW5zaWduZWQgaW50IG9wdGlvbnM7Ci0JaW50IG5ld19tYXJnaW47Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJaWYgKHB1dF91c2VyKDAsIChpbnQgX191c2VyICopYXJncCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJcmlvd2RfcGluZ3RpbWVyKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRElPQ19TRVRPUFRJT05TOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJm9wdGlvbnMsIGFyZ3AsIHNpemVvZihvcHRpb25zKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKQotCQkJcmlvd2Rfc3RvcHRpbWVyKCk7Ci0JCWVsc2UgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKQotCQkJcmlvd2Rfc3RhcnR0aW1lcigpOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlicmVhazsKLQotCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJaWYgKGdldF91c2VyKG5ld19tYXJnaW4sIChpbnQgX191c2VyICopYXJncCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKChuZXdfbWFyZ2luIDwgNjApIHx8IChuZXdfbWFyZ2luID4gKDI1NSAqIDYwKSkpCi0JCSAgICByZXR1cm4gLUVJTlZBTDsKLQkJcmlvd2RfdGltZW91dCA9IChuZXdfbWFyZ2luICsgNTkpIC8gNjA7Ci0JCXJpb3dkX3Bpbmd0aW1lcigpOwotCQkvKiBGYWxsICovCi0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJldHVybiBwdXRfdXNlcihyaW93ZF90aW1lb3V0ICogNjAsIChpbnQgX191c2VyICopYXJncCk7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJpb3dkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAoY291bnQpIHsKLQkJcmlvd2RfcGluZ3RpbWVyKCk7Ci0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByaW93ZF9mb3BzID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5pb2N0bCA9CXJpb3dkX2lvY3RsLAotCS5vcGVuID0JCXJpb3dkX29wZW4sCi0JLndyaXRlID0Jcmlvd2Rfd3JpdGUsCi0JLnJlbGVhc2UgPQlyaW93ZF9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHJpb3dkX21pc2NkZXYgPSB7IFJJT1dEX01JTk9SLCBSSU9XRF9OQU1FLCAmcmlvd2RfZm9wcyB9OwotCi1zdGF0aWMgaW50IF9faW5pdCByaW93ZF9iYmNfaW5pdCh2b2lkKQotewotCXN0cnVjdCAJbGludXhfZWJ1cyAqZWJ1cyA9IE5VTEw7Ci0Jc3RydWN0IAlsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IE5VTEw7Ci0JdTggdmFsOwotCi0JZm9yX2VhY2hfZWJ1cyhlYnVzKSB7Ci0JCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+b2ZkZXYubm9kZS0+bmFtZSwgImJiYyIpKQotCQkJCWdvdG8gZm91bmRfYmJjOwotCQl9Ci0JfQotCi1mb3VuZF9iYmM6Ci0JaWYgKCFlZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQliYmNfcmVncyA9IGlvcmVtYXAoZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIEJCQ19SRUdTX1NJWkUpOwotCWlmICghYmJjX3JlZ3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogVHVybiBpdCBvZmYuICovCi0JdmFsID0gcmVhZGIoYmJjX3JlZ3MgKyBCQkNfV0RBQ1RJT04pOwotCXZhbCAmPSB+QkJDX1dEQUNUSU9OX1JTVDsKLQl3cml0ZWIodmFsLCBiYmNfcmVncyArIEJCQ19XREFDVElPTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcmlvd2RfaW5pdCh2b2lkKQotewotCXN0cnVjdCAJbGludXhfZWJ1cyAqZWJ1cyA9IE5VTEw7Ci0Jc3RydWN0IAlsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5vZmRldi5ub2RlLT5uYW1lLCBSSU9XRF9OQU1FKSkKLQkJCQlnb3RvIGVidXNfZG9uZTsKLQkJfQotCX0KLQotZWJ1c19kb25lOgotCWlmICghZWRldikKLQkJZ290byBmYWlsOwotCi0Jcmlvd2RfcmVncyA9IGlvcmVtYXAoZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDIpOwotCWlmIChyaW93ZF9yZWdzID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwbWM6IENhbm5vdCBtYXAgcmVnaXN0ZXJzLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChyaW93ZF9iYmNfaW5pdCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicG1jOiBGYWlsdXJlIGluaXRpYWxpemluZyBCQkMgY29uZmlnLlxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAobWlzY19yZWdpc3Rlcigmcmlvd2RfbWlzY2RldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwbWM6IENhbm5vdCByZWdpc3RlciB3YXRjaGRvZyBtaXNjIGRldmljZS5cbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAicG1jOiBIYXJkd2FyZSB3YXRjaGRvZyBbJWkgbWludXRlc10sICIKLQkgICAgICAgInJlZ3MgYXQgJXBcbiIsIHJpb3dkX3RpbWVvdXQsIHJpb3dkX3JlZ3MpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JaWYgKHJpb3dkX3JlZ3MpIHsKLQkJaW91bm1hcChyaW93ZF9yZWdzKTsKLQkJcmlvd2RfcmVncyA9IE5VTEw7Ci0JfQotCWlmIChiYmNfcmVncykgewotCQlpb3VubWFwKGJiY19yZWdzKTsKLQkJYmJjX3JlZ3MgPSBOVUxMOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHJpb3dkX2NsZWFudXAodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnJpb3dkX21pc2NkZXYpOwotCWlvdW5tYXAocmlvd2RfcmVncyk7Ci0Jcmlvd2RfcmVncyA9IE5VTEw7Ci0JaW91bm1hcChiYmNfcmVncyk7Ci0JYmJjX3JlZ3MgPSBOVUxMOwotfQotCi1tb2R1bGVfaW5pdChyaW93ZF9pbml0KTsKLW1vZHVsZV9leGl0KHJpb3dkX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL3NidXMvY2hhci9ydGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0Mjk5MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9ydGMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKiAkSWQ6IHJ0Yy5jLHYgMS4yOCAyMDAxLzEwLzA4IDIyOjE5OjUxIGRhdmVtIEV4cCAkCi0gKgotICogTGludXgvU1BBUkMgUmVhbCBUaW1lIENsb2NrIERyaXZlcgotICogQ29weXJpZ2h0IChDKSAxOTk2IFRob21hcyBLLiBEeWFzICh0ZHlhc0BlZGVuLnJ1dGdlcnMuZWR1KQotICoKLSAqIFRoaXMgaXMgYSBsaXR0bGUgZHJpdmVyIHRoYXQgbGV0cyBhIHVzZXItbGV2ZWwgcHJvZ3JhbSBhY2Nlc3MKLSAqIHRoZSBTUEFSQyBNb3N0ZWsgcmVhbCB0aW1lIGNsb2NrIGNoaXAuIEl0IGlzIG5vIHVzZSB1bmxlc3MgeW91Ci0gKiB1c2UgdGhlIG1vZGlmaWVkIGNsb2NrIHV0aWxpdHkuCi0gKgotICogR2V0IHRoZSBtb2RpZmllZCBjbG9jayB1dGlsaXR5IGZyb206Ci0gKiAgIGZ0cDovL3ZnZXIua2VybmVsLm9yZy9wdWIvbGludXgvU3BhcmMvdXNlcmxhbmQvY2xvY2suYwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbW9zdGVrLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotCi1zdGF0aWMgaW50IHJ0Y19idXN5ID0gMDsKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGxheW91dCB1c2VkIGJ5IGRyaXZlcnMvY2hhci9ydGMuYywgd2UKLSAqIHN1cHBvcnQgdGhhdCBkcml2ZXIncyBpb2N0bHMgc28gdGhhdCB0aGluZ3MgYXJlIGxlc3MgbWVzc3kgaW4KLSAqIHVzZXJzcGFjZS4KLSAqLwotc3RydWN0IHJ0Y190aW1lX2dlbmVyaWMgewotCWludCB0bV9zZWM7Ci0JaW50IHRtX21pbjsKLQlpbnQgdG1faG91cjsKLQlpbnQgdG1fbWRheTsKLQlpbnQgdG1fbW9uOwotCWludCB0bV95ZWFyOwotCWludCB0bV93ZGF5OwotCWludCB0bV95ZGF5OwotCWludCB0bV9pc2RzdDsKLX07Ci0jZGVmaW5lIFJUQ19BSUVfT04JX0lPKCdwJywgMHgwMSkJLyogQWxhcm0gaW50LiBlbmFibGUgb24JCSovCi0jZGVmaW5lIFJUQ19BSUVfT0ZGCV9JTygncCcsIDB4MDIpCS8qIC4uLiBvZmYJCQkqLwotI2RlZmluZSBSVENfVUlFX09OCV9JTygncCcsIDB4MDMpCS8qIFVwZGF0ZSBpbnQuIGVuYWJsZSBvbgkqLwotI2RlZmluZSBSVENfVUlFX09GRglfSU8oJ3AnLCAweDA0KQkvKiAuLi4gb2ZmCQkJKi8KLSNkZWZpbmUgUlRDX1BJRV9PTglfSU8oJ3AnLCAweDA1KQkvKiBQZXJpb2RpYyBpbnQuIGVuYWJsZSBvbgkqLwotI2RlZmluZSBSVENfUElFX09GRglfSU8oJ3AnLCAweDA2KQkvKiAuLi4gb2ZmCQkJKi8KLSNkZWZpbmUgUlRDX1dJRV9PTglfSU8oJ3AnLCAweDBmKSAgLyogV2F0Y2hkb2cgaW50LiBlbmFibGUgb24JKi8KLSNkZWZpbmUgUlRDX1dJRV9PRkYJX0lPKCdwJywgMHgxMCkgIC8qIC4uLiBvZmYJCQkqLwotI2RlZmluZSBSVENfUkRfVElNRQlfSU9SKCdwJywgMHgwOSwgc3RydWN0IHJ0Y190aW1lX2dlbmVyaWMpIC8qIFJlYWQgUlRDIHRpbWUgICAqLwotI2RlZmluZSBSVENfU0VUX1RJTUUJX0lPVygncCcsIDB4MGEsIHN0cnVjdCBydGNfdGltZV9nZW5lcmljKSAvKiBTZXQgUlRDIHRpbWUgICAgKi8KLSNkZWZpbmUgUlRDX0FMTV9TRVQJX0lPVygncCcsIDB4MDcsIHN0cnVjdCBydGNfdGltZSkgLyogU2V0IGFsYXJtIHRpbWUgICovCi0jZGVmaW5lIFJUQ19BTE1fUkVBRAlfSU9SKCdwJywgMHgwOCwgc3RydWN0IHJ0Y190aW1lKSAvKiBSZWFkIGFsYXJtIHRpbWUgKi8KLSNkZWZpbmUgUlRDX0lSUVBfUkVBRAlfSU9SKCdwJywgMHgwYiwgdW5zaWduZWQgbG9uZykJIC8qIFJlYWQgSVJRIHJhdGUgICAqLwotI2RlZmluZSBSVENfSVJRUF9TRVQJX0lPVygncCcsIDB4MGMsIHVuc2lnbmVkIGxvbmcpCSAvKiBTZXQgSVJRIHJhdGUgICAgKi8KLSNkZWZpbmUgUlRDX0VQT0NIX1JFQUQJX0lPUigncCcsIDB4MGQsIHVuc2lnbmVkIGxvbmcpCSAvKiBSZWFkIGVwb2NoICAgICAgKi8KLSNkZWZpbmUgUlRDX0VQT0NIX1NFVAlfSU9XKCdwJywgMHgwZSwgdW5zaWduZWQgbG9uZykJIC8qIFNldCBlcG9jaCAgICAgICAqLwotI2RlZmluZSBSVENfV0tBTE1fU0VUCV9JT1coJ3AnLCAweDBmLCBzdHJ1Y3QgcnRjX3drYWxybSkvKiBTZXQgd2FrZXVwIGFsYXJtKi8KLSNkZWZpbmUgUlRDX1dLQUxNX1JECV9JT1IoJ3AnLCAweDEwLCBzdHJ1Y3QgcnRjX3drYWxybSkvKiBHZXQgd2FrZXVwIGFsYXJtKi8KLSNkZWZpbmUgUlRDX1BMTF9HRVQJX0lPUigncCcsIDB4MTEsIHN0cnVjdCBydGNfcGxsX2luZm8pICAvKiBHZXQgUExMIGNvcnJlY3Rpb24gKi8KLSNkZWZpbmUgUlRDX1BMTF9TRVQJX0lPVygncCcsIDB4MTIsIHN0cnVjdCBydGNfcGxsX2luZm8pICAvKiBTZXQgUExMIGNvcnJlY3Rpb24gKi8KLQotLyogUmV0cmlldmUgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBmcm9tIHRoZSByZWFsIHRpbWUgY2xvY2suICovCi1zdGF0aWMgdm9pZCBnZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0KQotewotCXZvaWQgX19pb21lbSAqcmVncyA9IG1zdGs0OHQwMl9yZWdzOwotCXU4IHRtcDsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JdG1wIHw9IE1TVEtfQ1JFR19SRUFEOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7Ci0KLQl0LT5zZWMgPSBNU1RLX1JFR19TRUMocmVncyk7Ci0JdC0+bWluID0gTVNUS19SRUdfTUlOKHJlZ3MpOwotCXQtPmhvdXIgPSBNU1RLX1JFR19IT1VSKHJlZ3MpOwotCXQtPmRvdyA9IE1TVEtfUkVHX0RPVyhyZWdzKTsKLQl0LT5kb20gPSBNU1RLX1JFR19ET00ocmVncyk7Ci0JdC0+bW9udGggPSBNU1RLX1JFR19NT05USChyZWdzKTsKLQl0LT55ZWFyID0gTVNUS19DVlRfWUVBUiggTVNUS19SRUdfWUVBUihyZWdzKSApOwotCi0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgJj0gfk1TVEtfQ1JFR19SRUFEOwotCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7Ci0KLQlzcGluX3VubG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLX0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW50aGUgcmVhbCB0aW1lIGNsb2NrLiAqLwotdm9pZCBzZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0KQotewotCXZvaWQgX19pb21lbSAqcmVncyA9IG1zdGs0OHQwMl9yZWdzOwotCXU4IHRtcDsKLQotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQotCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7Ci0JdG1wIHw9IE1TVEtfQ1JFR19XUklURTsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0JTVNUS19TRVRfUkVHX1NFQyhyZWdzLHQtPnNlYyk7Ci0JTVNUS19TRVRfUkVHX01JTihyZWdzLHQtPm1pbik7Ci0JTVNUS19TRVRfUkVHX0hPVVIocmVncyx0LT5ob3VyKTsKLQlNU1RLX1NFVF9SRUdfRE9XKHJlZ3MsdC0+ZG93KTsKLQlNU1RLX1NFVF9SRUdfRE9NKHJlZ3MsdC0+ZG9tKTsKLQlNU1RLX1NFVF9SRUdfTU9OVEgocmVncyx0LT5tb250aCk7Ci0JTVNUS19TRVRfUkVHX1lFQVIocmVncyx0LT55ZWFyIC0gTVNUS19ZRUFSX1pFUk8pOwotCi0JdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKLQl0bXAgJj0gfk1TVEtfQ1JFR19XUklURTsKLQltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgcHV0X3J0Y190aW1lX2dlbmVyaWModm9pZCBfX3VzZXIgKmFyZ3AsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0Jc3RydWN0IHJ0Y190aW1lX2dlbmVyaWMgX191c2VyICp1dG0gPSBhcmdwOwotCi0JaWYgKF9fcHV0X3VzZXIodG0tPnNlYywgJnV0bS0+dG1fc2VjKSB8fAotCSAgICBfX3B1dF91c2VyKHRtLT5taW4sICZ1dG0tPnRtX21pbikgfHwKLQkgICAgX19wdXRfdXNlcih0bS0+aG91ciwgJnV0bS0+dG1faG91cikgfHwKLQkgICAgX19wdXRfdXNlcih0bS0+ZG9tLCAmdXRtLT50bV9tZGF5KSB8fAotCSAgICBfX3B1dF91c2VyKHRtLT5tb250aCwgJnV0bS0+dG1fbW9uKSB8fAotCSAgICBfX3B1dF91c2VyKHRtLT55ZWFyLCAmdXRtLT50bV95ZWFyKSB8fAotCSAgICBfX3B1dF91c2VyKHRtLT5kb3csICZ1dG0tPnRtX3dkYXkpIHx8Ci0JICAgIF9fcHV0X3VzZXIoMCwgJnV0bS0+dG1feWRheSkgfHwKLQkgICAgX19wdXRfdXNlcigwLCAmdXRtLT50bV9pc2RzdCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3J0Y190aW1lX2dlbmVyaWMoc3RydWN0IHJ0Y190aW1lICp0bSwgdm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHJ0Y190aW1lX2dlbmVyaWMgX191c2VyICp1dG0gPSBhcmdwOwotCi0JaWYgKF9fZ2V0X3VzZXIodG0tPnNlYywgJnV0bS0+dG1fc2VjKSB8fAotCSAgICBfX2dldF91c2VyKHRtLT5taW4sICZ1dG0tPnRtX21pbikgfHwKLQkgICAgX19nZXRfdXNlcih0bS0+aG91ciwgJnV0bS0+dG1faG91cikgfHwKLQkgICAgX19nZXRfdXNlcih0bS0+ZG9tLCAmdXRtLT50bV9tZGF5KSB8fAotCSAgICBfX2dldF91c2VyKHRtLT5tb250aCwgJnV0bS0+dG1fbW9uKSB8fAotCSAgICBfX2dldF91c2VyKHRtLT55ZWFyLCAmdXRtLT50bV95ZWFyKSB8fAotCSAgICBfX2dldF91c2VyKHRtLT5kb3csICZ1dG0tPnRtX3dkYXkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0Y19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQkvKiBObyBpbnRlcnJ1cHQgc3VwcG9ydCwgcmV0dXJuIGFuIGVycm9yCi0JICogY29tcGF0aWJsZSB3aXRoIGRyaXZlcnMvY2hhci9ydGMuYwotCSAqLwotCWNhc2UgUlRDX0FJRV9PRkY6Ci0JY2FzZSBSVENfQUlFX09OOgotCWNhc2UgUlRDX1BJRV9PRkY6Ci0JY2FzZSBSVENfUElFX09OOgotCWNhc2UgUlRDX1VJRV9PRkY6Ci0JY2FzZSBSVENfVUlFX09OOgotCWNhc2UgUlRDX0lSUVBfUkVBRDoKLQljYXNlIFJUQ19JUlFQX1NFVDoKLQljYXNlIFJUQ19FUE9DSF9TRVQ6Ci0JY2FzZSBSVENfRVBPQ0hfUkVBRDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXNlIFJUQ0dFVDoKLQljYXNlIFJUQ19SRF9USU1FOgotCQltZW1zZXQoJnJ0Y190bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOwotCQlnZXRfcnRjX3RpbWUoJnJ0Y190bSk7Ci0KLQkJaWYgKGNtZCA9PSBSVENHRVQpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnJ0Y190bSwKLQkJCQkJIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfSBlbHNlIGlmIChwdXRfcnRjX3RpbWVfZ2VuZXJpYyhhcmdwLCAmcnRjX3RtKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldHVybiAwOwotCi0KLQljYXNlIFJUQ1NFVDoKLQljYXNlIFJUQ19TRVRfVElNRToKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCi0JCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmIChjbWQgPT0gUlRDU0VUKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ0Y190bSwgYXJncCwKLQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9IGVsc2UgaWYgKGdldF9ydGNfdGltZV9nZW5lcmljKCZydGNfdG0sIGFyZ3ApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJc2V0X3J0Y190aW1lKCZydGNfdG0pOwotCi0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotfQotCi1zdGF0aWMgaW50IHJ0Y19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByZXQ7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKLQlpZiAocnRjX2J1c3kpIHsKLQkJcmV0ID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCXJ0Y19idXN5ID0gMTsKLQkJcmV0ID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtb3N0ZWtfbG9jayk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBydGNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlydGNfYnVzeSA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9CW5vX2xsc2VlaywKLQkuaW9jdGwgPQlydGNfaW9jdGwsCi0JLm9wZW4gPQkJcnRjX29wZW4sCi0JLnJlbGVhc2UgPQlydGNfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBydGNfZGV2ID0geyBSVENfTUlOT1IsICJydGMiLCAmcnRjX2ZvcHMgfTsKLQotc3RhdGljIGludCBfX2luaXQgcnRjX3N1bl9pbml0KHZvaWQpCi17Ci0JaW50IGVycm9yOwotCi0JLyogSXQgaXMgcG9zc2libGUgd2UgYXJlIGJlaW5nIGRyaXZlbiBieSBzb21lIG90aGVyIFJUQyBjaGlwCi0JICogYW5kIHRodXMgYW5vdGhlciBSVEMgZHJpdmVyIGlzIGhhbmRsaW5nIHRoaW5ncy4KLQkgKi8KLQlpZiAoIW1zdGs0OHQwMl9yZWdzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWVycm9yID0gbWlzY19yZWdpc3RlcigmcnRjX2Rldik7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicnRjOiB1bmFibGUgdG8gZ2V0IG1pc2MgbWlub3IgZm9yIE1vc3Rla1xuIik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JcHJpbnRrKCJydGNfc3VuX2luaXQ6IFJlZ2lzdGVyZWQgTW9zdGVrIFJUQyBkcml2ZXIuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcnRjX3N1bl9jbGVhbnVwKHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZydGNfZGV2KTsKLX0KLQotbW9kdWxlX2luaXQocnRjX3N1bl9pbml0KTsKLW1vZHVsZV9leGl0KHJ0Y19zdW5fY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdWN0cmwuYwppbmRleCA3Nzc2Mzc1Li4yNzk5M2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL3VjdHJsLmMKQEAgLTEsNyArMSw3IEBACi0vKiAkSWQ6IHVjdHJsLmMsdiAxLjEyIDIwMDEvMTAvMDggMjI6MTk6NTEgZGF2ZW0gRXhwICQKLSAqIHVjdHJsLmM6IFRTMTAyIE1pY3JvY29udHJvbGxlciBpbnRlcmZhY2Ugb24gVGFkcG9sZSBTcGFyY2Jvb2sgMworLyogdWN0cmwuYzogVFMxMDIgTWljcm9jb250cm9sbGVyIGludGVyZmFjZSBvbiBUYWRwb2xlIFNwYXJjYm9vayAzCiAgKgogICogQ29weXJpZ2h0IDE5OTkgRGVycmljayBKIEJyYXNoZWFyIChzaGFkb3dAZGVtZW50aWEub3JnKQorICogQ29weXJpZ2h0IDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpAQCAtMjEsNyArMjMsNiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+CiAKICNkZWZpbmUgVUNUUkxfTUlOT1IJMTc0CiAKQEAgLTMzLDI2ICszNCwyNiBAQAogI2VuZGlmCiAKIHN0cnVjdCB1Y3RybF9yZWdzIHsKLQl2b2xhdGlsZSB1MzIgdWN0cmxfaW50cjsKLQl2b2xhdGlsZSB1MzIgdWN0cmxfZGF0YTsKLQl2b2xhdGlsZSB1MzIgdWN0cmxfc3RhdDsKLQl2b2xhdGlsZSB1MzIgdWN0cmxfeHh4WzVdOworCXUzMiB1Y3RybF9pbnRyOworCXUzMiB1Y3RybF9kYXRhOworCXUzMiB1Y3RybF9zdGF0OworCXUzMiB1Y3RybF94eHhbNV07CiB9OwogCiBzdHJ1Y3QgdHMxMDJfcmVncyB7Ci0Jdm9sYXRpbGUgdTMyIGNhcmRfYV9pbnRyOwotCXZvbGF0aWxlIHUzMiBjYXJkX2Ffc3RhdDsKLQl2b2xhdGlsZSB1MzIgY2FyZF9hX2N0cmw7Ci0Jdm9sYXRpbGUgdTMyIGNhcmRfYV94eHg7Ci0Jdm9sYXRpbGUgdTMyIGNhcmRfYl9pbnRyOwotCXZvbGF0aWxlIHUzMiBjYXJkX2Jfc3RhdDsKLQl2b2xhdGlsZSB1MzIgY2FyZF9iX2N0cmw7Ci0Jdm9sYXRpbGUgdTMyIGNhcmRfYl94eHg7Ci0Jdm9sYXRpbGUgdTMyIHVjdHJsX2ludHI7Ci0Jdm9sYXRpbGUgdTMyIHVjdHJsX2RhdGE7Ci0Jdm9sYXRpbGUgdTMyIHVjdHJsX3N0YXQ7Ci0Jdm9sYXRpbGUgdTMyIHVjdHJsX3h4eDsKLQl2b2xhdGlsZSB1MzIgdHMxMDJfeHh4WzRdOworCXUzMiBjYXJkX2FfaW50cjsKKwl1MzIgY2FyZF9hX3N0YXQ7CisJdTMyIGNhcmRfYV9jdHJsOworCXUzMiBjYXJkX2FfeHh4OworCXUzMiBjYXJkX2JfaW50cjsKKwl1MzIgY2FyZF9iX3N0YXQ7CisJdTMyIGNhcmRfYl9jdHJsOworCXUzMiBjYXJkX2JfeHh4OworCXUzMiB1Y3RybF9pbnRyOworCXUzMiB1Y3RybF9kYXRhOworCXUzMiB1Y3RybF9zdGF0OworCXUzMiB1Y3RybF94eHg7CisJdTMyIHRzMTAyX3h4eFs0XTsKIH07CiAKIC8qIEJpdHMgZm9yIHVjdHJsX2ludHIgcmVnaXN0ZXIgKi8KQEAgLTE4NiwxNyArMTg3LDE1IEBACiAgIFBPV0VSX1JFU1RBUlQ9MHg4MywKIH07CiAKLXN0cnVjdCB1Y3RybF9kcml2ZXIgewotCXN0cnVjdCB1Y3RybF9yZWdzICpyZWdzOworc3RhdGljIHN0cnVjdCB1Y3RybF9kcml2ZXIgeworCXN0cnVjdCB1Y3RybF9yZWdzIF9faW9tZW0gKnJlZ3M7CiAJaW50IGlycTsKIAlpbnQgcGVuZGluZzsKIAlzdHJ1Y3QgdWN0cmxfc3RhdHVzIHN0YXR1czsKLX07Cit9ICpnbG9iYWxfZHJpdmVyOwogCi1zdGF0aWMgc3RydWN0IHVjdHJsX2RyaXZlciBkcnY7Ci0KLXN0YXRpYyB2b2lkIHVjdHJsX2dldF9ldmVudF9zdGF0dXModm9pZCk7Ci1zdGF0aWMgdm9pZCB1Y3RybF9nZXRfZXh0ZXJuYWxfc3RhdHVzKHZvaWQpOworc3RhdGljIHZvaWQgdWN0cmxfZ2V0X2V2ZW50X3N0YXR1cyhzdHJ1Y3QgdWN0cmxfZHJpdmVyICopOworc3RhdGljIHZvaWQgdWN0cmxfZ2V0X2V4dGVybmFsX3N0YXR1cyhzdHJ1Y3QgdWN0cmxfZHJpdmVyICopOwogCiBzdGF0aWMgaW50CiB1Y3RybF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTIxMywxNiArMjEyLDE0IEBACiB1Y3RybF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWxvY2tfa2VybmVsKCk7Ci0JdWN0cmxfZ2V0X2V2ZW50X3N0YXR1cygpOwotCXVjdHJsX2dldF9leHRlcm5hbF9zdGF0dXMoKTsKKwl1Y3RybF9nZXRfZXZlbnRfc3RhdHVzKGdsb2JhbF9kcml2ZXIpOworCXVjdHJsX2dldF9leHRlcm5hbF9zdGF0dXMoZ2xvYmFsX2RyaXZlcik7CiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdWN0cmxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgdWN0cmxfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHVjdHJsX2RyaXZlciAqKWRldl9pZDsKLQlwcmludGsoImluIHVjdHJsX2ludGVycnVwdFxuIik7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0yNDQsMTEgKzI0MSwxMSBAQAogeyBcCiAgIHVuc2lnbmVkIGludCBpOyBcCiAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7IFwKLSAgICBpZiAoVUNUUkxfU1RBVF9UWE5GX1NUQSAmIGRyaXZlci0+cmVncy0+dWN0cmxfc3RhdCkgXAorICAgICAgaWYgKFVDVFJMX1NUQVRfVFhORl9TVEEgJiBzYnVzX3JlYWRsKCZkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQpKSBcCiAgICAgICBicmVhazsgXAogICB9IFwKICAgZHByaW50aygoIndyaXRlIGRhdGEgMHglMDJ4XG4iLCB2YWx1ZSkpOyBcCi0gIGRyaXZlci0+cmVncy0+dWN0cmxfZGF0YSA9IHZhbHVlOyBcCisgIHNidXNfd3JpdGVsKHZhbHVlLCAmZHJpdmVyLT5yZWdzLT51Y3RybF9kYXRhKTsgXAogfQogCiAvKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gcmVhZCwgcmVhZCBpdCwgdGhlbiBjbGVhciB0aGUgYml0ICovCkBAIC0yNTcsMjQgKzI1NCwyMyBAQAogICB1bnNpZ25lZCBpbnQgaTsgXAogICB2YWx1ZSA9IDA7IFwKICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsgXAotICAgIGlmICgoVUNUUkxfU1RBVF9SWE5FX1NUQSAmIGRyaXZlci0+cmVncy0+dWN0cmxfc3RhdCkgPT0gMCkgXAorICAgICAgaWYgKChVQ1RSTF9TVEFUX1JYTkVfU1RBICYgc2J1c19yZWFkbCgmZHJpdmVyLT5yZWdzLT51Y3RybF9zdGF0KSkgPT0gMCkgXAogICAgICAgYnJlYWs7IFwKICAgICB1ZGVsYXkoMSk7IFwKICAgfSBcCi0gIHZhbHVlID0gZHJpdmVyLT5yZWdzLT51Y3RybF9kYXRhOyBcCisgIHZhbHVlID0gc2J1c19yZWFkbCgmZHJpdmVyLT5yZWdzLT51Y3RybF9kYXRhKTsgXAogICBkcHJpbnRrKCgicmVhZCBkYXRhIDB4JTAyeFxuIiwgdmFsdWUpKTsgXAotICBkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQgPSBVQ1RSTF9TVEFUX1JYTkVfU1RBOyBcCisgIHNidXNfd3JpdGVsKFVDVFJMX1NUQVRfUlhORV9TVEEsICZkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQpOyBcCiB9CiAKLXN0YXRpYyB2b2lkIHVjdHJsX2RvX3R4bihzdHJ1Y3QgdWN0cmxfdHhuICp0eG4pCitzdGF0aWMgdm9pZCB1Y3RybF9kb190eG4oc3RydWN0IHVjdHJsX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgdWN0cmxfdHhuICp0eG4pCiB7Ci0Jc3RydWN0IHVjdHJsX2RyaXZlciAqZHJpdmVyID0gJmRydjsKIAlpbnQgc3RhdCwgaW5jbnQsIG91dGNudCwgYnl0ZWNudCwgaW50cjsKIAl1MzIgYnl0ZTsKIAotCXN0YXQgPSBkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQ7Ci0JaW50ciA9IGRyaXZlci0+cmVncy0+dWN0cmxfaW50cjsKLQlkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQgPSBzdGF0OworCXN0YXQgPSBzYnVzX3JlYWRsKCZkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQpOworCWludHIgPSBzYnVzX3JlYWRsKCZkcml2ZXItPnJlZ3MtPnVjdHJsX2ludHIpOworCXNidXNfd3JpdGVsKHN0YXQsICZkcml2ZXItPnJlZ3MtPnVjdHJsX3N0YXQpOwogCiAJZHByaW50aygoImludGVycnVwdCBzdGF0IDB4JXggaW50IDB4JXhcbiIsIHN0YXQsIGludHIpKTsKIApAQCAtMzA1LDkgKzMwMSw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB1Y3RybF9nZXRfZXZlbnRfc3RhdHVzKHZvaWQpCitzdGF0aWMgdm9pZCB1Y3RybF9nZXRfZXZlbnRfc3RhdHVzKHN0cnVjdCB1Y3RybF9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3QgdWN0cmxfZHJpdmVyICpkcml2ZXIgPSAmZHJ2OwogCXN0cnVjdCB1Y3RybF90eG4gdHhuOwogCXU4IG91dGJpdHNbMl07CiAKQEAgLTMxNyw3ICszMTIsNyBAQAogCXR4bi5pbmJ1ZiA9IE5VTEw7CiAJdHhuLm91dGJ1ZiA9IG91dGJpdHM7CiAKLQl1Y3RybF9kb190eG4oJnR4bik7CisJdWN0cmxfZG9fdHhuKGRyaXZlciwgJnR4bik7CiAKIAlkcHJpbnRrKCgiYnl0ZXMgJXggJXhcbiIsIChvdXRiaXRzWzBdICYgMHhmZiksIChvdXRiaXRzWzFdICYgMHhmZikpKTsKIAlkcml2ZXItPnN0YXR1cy5ldmVudF9zdGF0dXMgPSAKQEAgLTMyNSw5ICszMjAsOCBAQAogCWRwcmludGsoKCJldiBpcyAleFxuIiwgZHJpdmVyLT5zdGF0dXMuZXZlbnRfc3RhdHVzKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHVjdHJsX2dldF9leHRlcm5hbF9zdGF0dXModm9pZCkKK3N0YXRpYyB2b2lkIHVjdHJsX2dldF9leHRlcm5hbF9zdGF0dXMoc3RydWN0IHVjdHJsX2RyaXZlciAqZHJpdmVyKQogewotCXN0cnVjdCB1Y3RybF9kcml2ZXIgKmRyaXZlciA9ICZkcnY7CiAJc3RydWN0IHVjdHJsX3R4biB0eG47CiAJdTggb3V0Yml0c1syXTsKIAlpbnQgaSwgdjsKQEAgLTMzOCw3ICszMzIsNyBAQAogCXR4bi5pbmJ1ZiA9IE5VTEw7CiAJdHhuLm91dGJ1ZiA9IG91dGJpdHM7CiAKLQl1Y3RybF9kb190eG4oJnR4bik7CisJdWN0cmxfZG9fdHhuKGRyaXZlciwgJnR4bik7CiAKIAlkcHJpbnRrKCgiYnl0ZXMgJXggJXhcbiIsIChvdXRiaXRzWzBdICYgMHhmZiksIChvdXRiaXRzWzFdICYgMHhmZikpKTsKIAlkcml2ZXItPnN0YXR1cy5leHRlcm5hbF9zdGF0dXMgPSAKQEAgLTM1NCw3MSArMzQ4LDEwMSBAQAogCQogfQogCi1zdGF0aWMgaW50IF9faW5pdCB0czEwMl91Y3RybF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1Y3RybF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RydWN0IHVjdHJsX2RyaXZlciAqZHJpdmVyID0gJmRydjsKLQlpbnQgbGVuOwotCXN0cnVjdCBsaW51eF9wcm9tX2lycXMgdG1wX2lycVsyXTsKLSAgICAgICAgdW5zaWduZWQgaW50IHZhZGRyWzJdID0geyAwLCAwIH07Ci0JaW50IHRtcG5vZGUsIHVjdHJsbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwotCWludCBlcnI7CisJc3RydWN0IHVjdHJsX2RyaXZlciAqcDsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAotCXRtcG5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKHVjdHJsbm9kZSwgIm9iaW8iKTsKKwlwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1Y3RybDogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBzdHJ1Y3QuXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCi0JaWYgKHRtcG5vZGUpCi0JICB1Y3RybG5vZGUgPSBwcm9tX2dldGNoaWxkKHRtcG5vZGUpOworCXAtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkgICAgIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSksCisJCQkgICAgICJ1Y3RybCIpOworCWlmICghcC0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgInVjdHJsOiBVbmFibGUgdG8gbWFwIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAotCXVjdHJsbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3ModWN0cmxub2RlLCAidWN0cmwiKTsKLQotCWlmICghdWN0cmxub2RlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIHRoZSBwcm9tIG1hcHBlZCBpdCBmb3IgdXMgKi8KLQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHVjdHJsbm9kZSwgImFkZHJlc3MiLCAodm9pZCAqKSB2YWRkciwKLQkJCSAgICAgICBzaXplb2YodmFkZHIpKTsKLQlkcml2ZXItPnJlZ3MgPSAoc3RydWN0IHVjdHJsX3JlZ3MgKil2YWRkclswXTsKLQotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkodWN0cmxub2RlLCAiaW50ciIsIChjaGFyICopIHRtcF9pcnEsCi0JCQkgICAgICAgc2l6ZW9mKHRtcF9pcnEpKTsKLQotCS8qIEZsdXNoIGRldmljZSAqLwotCVJFQURVQ1RMREFUQShsZW4pOwotCi0JaWYoIWRyaXZlci0+aXJxKSAKLQkJZHJpdmVyLT5pcnEgPSB0bXBfaXJxWzBdLnByaTsKLQotCWVyciA9IHJlcXVlc3RfaXJxKGRyaXZlci0+aXJxLCB1Y3RybF9pbnRlcnJ1cHQsIDAsICJ1Y3RybCIsIGRyaXZlcik7CisJcC0+aXJxID0gb3AtPmlycXNbMF07CisJZXJyID0gcmVxdWVzdF9pcnEocC0+aXJxLCB1Y3RybF9pbnRlcnJ1cHQsIDAsICJ1Y3RybCIsIHApOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIHJlZ2lzdGVyIGlycSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBkcml2ZXItPmlycSk7Ci0JCXJldHVybiBlcnI7CisJCXByaW50ayhLRVJOX0VSUiAidWN0cmw6IFVuYWJsZSB0byByZWdpc3RlciBpcnEuXG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKIAl9CiAKLQlpZiAobWlzY19yZWdpc3RlcigmdWN0cmxfZGV2KSkgewotCQlwcmludGsoIiVzOiB1bmFibGUgdG8gZ2V0IG1pc2MgbWlub3IgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdWN0cmxfZGV2Lm1pbm9yKTsKLQkJZnJlZV9pcnEoZHJpdmVyLT5pcnEsIGRyaXZlcik7Ci0JCXJldHVybiAtRU5PREVWOworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJnVjdHJsX2Rldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInVjdHJsOiBVbmFibGUgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2UuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CiAJfQogCi0JZHJpdmVyLT5yZWdzLT51Y3RybF9pbnRyID0gVUNUUkxfSU5UUl9SWE5FX1JFUXxVQ1RSTF9JTlRSX1JYTkVfTVNLOwotCXByaW50aygidWN0cmw6IDB4JXAgKGlycSAlZClcbiIsIGRyaXZlci0+cmVncywgZHJpdmVyLT5pcnEpOwotCXVjdHJsX2dldF9ldmVudF9zdGF0dXMoKTsKLQl1Y3RybF9nZXRfZXh0ZXJuYWxfc3RhdHVzKCk7Ci0gICAgICAgIHJldHVybiAwOworCXNidXNfd3JpdGVsKFVDVFJMX0lOVFJfUlhORV9SRVF8VUNUUkxfSU5UUl9SWE5FX01TSywgJnAtPnJlZ3MtPnVjdHJsX2ludHIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB1Y3RybCByZWdzWzB4JXBdIChpcnEgJWQpXG4iLAorCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lLCBwLT5yZWdzLCBwLT5pcnEpOworCXVjdHJsX2dldF9ldmVudF9zdGF0dXMocCk7CisJdWN0cmxfZ2V0X2V4dGVybmFsX3N0YXR1cyhwKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcCk7CisJZ2xvYmFsX2RyaXZlciA9IHA7CisKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEocC0+aXJxLCBwKTsKKworb3V0X2lvdW5tYXA6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pKTsKKworb3V0X2ZyZWU6CisJa2ZyZWUocCk7CisJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB0czEwMl91Y3RybF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB1Y3RybF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IHVjdHJsX2RyaXZlciAqZHJpdmVyID0gJmRydjsKKwlzdHJ1Y3QgdWN0cmxfZHJpdmVyICpwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAotCW1pc2NfZGVyZWdpc3RlcigmdWN0cmxfZGV2KTsKLQlpZiAoZHJpdmVyLT5pcnEpCi0JCWZyZWVfaXJxKGRyaXZlci0+aXJxLCBkcml2ZXIpOwotCWlmIChkcml2ZXItPnJlZ3MpCi0JCWRyaXZlci0+cmVncyA9IE5VTEw7CisJaWYgKHApIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZ1Y3RybF9kZXYpOworCQlmcmVlX2lycShwLT5pcnEsIHApOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSkpOworCQlrZnJlZShwKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLW1vZHVsZV9pbml0KHRzMTAyX3VjdHJsX2luaXQpOwotbW9kdWxlX2V4aXQodHMxMDJfdWN0cmxfY2xlYW51cCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB1Y3RybF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAidWN0cmwiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdWN0cmxfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciB1Y3RybF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInVjdHJsIiwKKwkubWF0Y2hfdGFibGUJPSB1Y3RybF9tYXRjaCwKKwkucHJvYmUJCT0gdWN0cmxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh1Y3RybF9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB1Y3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmdWN0cmxfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdWN0cmxfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZ1Y3RybF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1Y3RybF9pbml0KTsKK21vZHVsZV9leGl0KHVjdHJsX2V4aXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjLmggYi9kcml2ZXJzL3NidXMvY2hhci92ZmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyNDBjNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci92ZmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jaWZuZGVmIF9MSU5VWF9WRkNfSF8KLSNkZWZpbmUgX0xJTlVYX1ZGQ19IXwotCi0vKgotICogVGhlIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSB2ZmMgaXMgYXQgb2Zmc2V0IDB4NDAwMAotICogVGhlIGZpcnN0IGZpZWxkIHJhbSBiYW5rIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IDB4NTAwMAotICogVGhlIHNlY29uZCBmaWVsZCByYW0gYmFuayBpcyBhdCBvZmZzZXQgMHg3MDAwCi0gKiBpMmNfcmVnIGFkZHJlc3MgdGhlIFBoaWxsaXBzIFBDRjg1ODQoc2VlIG5vdGVzIGluIHZmY19pMmMuYykgCi0gKiAgICBkYXRhIGFuZCB0cmFuc21pdCByZWdpc3Rlci4KLSAqIGkyY19zMSBjb250cm9scyByZWdpc3RlciBzMSBvZiB0aGUgUENGODU4NAotICogaTJjX3dyaXRlIHNlZW1zIHRvIGJlIHNpbWlsYXIgdG8gaTJjX3dyaXRlIGJ1dCBJIGFtIG5vdCAKLSAqICAgIHF1aXRlIHN1cmUgd2h5IHN1biB1c2VzIGl0Ci0gKiAKLSAqIEkgYW0gYWxzbyBub3Qgc3VyZSB3aGV0aGVyIG9yIG5vdCB5b3UgY2FuIHJlYWQgdGhlIGZyYW0gYmFuayBhcyBhCi0gKiB3aG9sZSBvciB3aGV0aGVyIHlvdSBtdXN0IHJlYWQgZWFjaCB3b3JkIGluZGl2aWR1YWxseSBmcm9tIG9mZnNldAotICogMHg1MDAwIGFzIHNvb24gYXMgSSBmaWd1cmUgaXQgb3V0IEkgd2lsbCB1cGRhdGUgdGhpcyBmaWxlICovCi0KLXN0cnVjdCB2ZmNfcmVncyB7Ci0JY2hhciBwYWQxWzB4NDAwMF07Ci0JdW5zaWduZWQgaW50IGNvbnRyb2w7ICAvKiBPZmZzZXQgMHg0MDAwICovCi0JY2hhciBwYWQyWzB4ZmZiXTsgICAgICAvKiBmcm9tIG9mZnNldCAweDQwMDQgdG8gMHg1MDAwICovCi0JdW5zaWduZWQgaW50IGZyYW1fYmFuazE7IC8qIE9mZnNldCAweDUwMDAgKi8KLQljaGFyIHBhZDNbMHhmZmJdOyAgICAgICAgLyogZnJvbSBvZmZzZXQgMHg1MDA0IHRvIDB4NjAwMCAqLwotCXVuc2lnbmVkIGludCBpMmNfcmVnOyAvKiBPZmZzZXQgMHg2MDAwICovCi0JdW5zaWduZWQgaW50IGkyY19tYWdpYzI7IC8qIE9mZnNldCAweDYwMDQgKi8KLQl1bnNpZ25lZCBpbnQgaTJjX3MxOyAgLyogT2Zmc2V0IDB4NjAwOCAqLwotCXVuc2lnbmVkIGludCBpMmNfd3JpdGU7IC8qIE9mZnNldCAweDYwMGMgKi8KLQljaGFyIHBhZDRbMHhmZjBdOyAgICAgLyogZnJvbSBvZmZzZXQgMHg2MDEwIHRvIDB4NzAwMCAqLwotCXVuc2lnbmVkIGludCBmcmFtX2JhbmsyOyAvKiBPZmZzZXQgMHg3MDAwICovCi0JY2hhciBwYWQ1WzB4MTAwMF07Ci19OwotCi0jZGVmaW5lIFZGQ19TQUE5MDUxX05SICgxMykKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQUREUiAoMHg4YSkKLQkvKiBUaGUgc2FhOTA1MSByZXR1cm5zIHRoZSBmb2xsb3dpbmcgZm9yIGl0cyBzdGF0dXMgCi0JICogYml0IDAgLSAwCi0JICogYml0IDEgLSBTRUNBTSBjb2xvciBkZXRlY3RlZCAoMT1mb3VuZCwwPW5vdCBmb3VuZCkKLQkgKiBiaXQgMiAtIENPTE9SIGRldGVjdGVkICgxPWZvdW5kLDA9bm90IGZvdW5kKQotCSAqIGJpdCAzIC0gMAotCSAqIGJpdCA0IC0gRmllbGQgZnJlcXVlbmN5IGJpdCAoMT02MEh6IChOVFNDKSwgMD01MEh6IChQQUwpKQotCSAqIGJpdCA1IC0gMQotCSAqIGJpdCA2IC0gaG9yaXpvbnRhbCBmcmVxdWVuY3kgbG9jayAoMT10cmFuc21pdHRlciBmb3VuZCwKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bm8gdHJhbnNtaXR0ZXIpCi0JICogYml0IDcgLSBQb3dlciBvbiByZXNldCBiaXQgKDE9cmVzZXQsMD1hdCBsZWFzdCBvbmUgc3VjY2Vzc2Z1bCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb2YgdGhlIHN0YXR1cyBieXRlKQotCSAqLwotCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1BPTlJFUyAoMHg4MCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfSExPQ0sgKDB4NDApCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0ZEICgweDEwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9DRCAoMHgwNCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQ1MgKDB4MDIpCi0KLQotLyogVGhlIHZhcmlvdXMgc2FhOTA1MSBzdWIgYWRkcmVzc2VzICovCi0KLSNkZWZpbmUgVkZDX1NBQTkwNTFfSURFTCAoMCkgCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0hTWV9TVEFSVCAoMSkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfSFNZX1NUT1AgKDIpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0hDX1NUQVJUICgzKQotI2RlZmluZSBWRkNfU0FBOTA1MV9IQ19TVE9QICg0KQotI2RlZmluZSBWRkNfU0FBOTA1MV9IU19TVEFSVCAoNSkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfSE9SSVpfUEVBSyAoNikKLSNkZWZpbmUgVkZDX1NBQTkwNTFfSFVFICg3KQotI2RlZmluZSBWRkNfU0FBOTA1MV9DMSAoOCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQzIgKDkpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0MzICgweGEpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1NFQ0FNX0RFTEFZICgweGIpCi0KLQotLyogQml0IHNldHRpbmdzIGZvciBzYWE5MDUxIHN1YiBhZGRyZXNzIDB4MDYgKi8KLQotI2RlZmluZSBWRkNfU0FBOTA1MV9BUDEgKDB4MDEpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0FQMiAoMHgwMikKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQ09SMSAoMHgwNCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQ09SMiAoMHgwOCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQlAxICgweDEwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9CUDIgKDB4MjApCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1BGICgweDQwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9CWSAoMHg4MCkKLQotCi0vKiBCaXQgc2V0dGluZ3MgZm9yIHNhYTkwNTEgc3ViIGFkZHJlc3MgMHgwOCAqLwotCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0NDRlIwICgweDAxKQotI2RlZmluZSBWRkNfU0FBOTA1MV9DQ0ZSMSAoMHgwMikKLSNkZWZpbmUgVkZDX1NBQTkwNTFfWVBOICgweDA0KQotI2RlZmluZSBWRkNfU0FBOTA1MV9BTFQgKDB4MDgpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0NPICgweDEwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9WVFIgKDB4MjApCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0ZTICgweDQwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9IUExMICgweDgwKQotCi0KLS8qIEJpdCBzZXR0aW5ncyBmb3Igc2FhOTA1MSBzdWIgYWRkcmVzcyA5ICovCi0KLSNkZWZpbmUgVkZDX1NBQTkwNTFfU1MwICgweDAxKQotI2RlZmluZSBWRkNfU0FBOTA1MV9TUzEgKDB4MDIpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0FGQ0MgKDB4MDQpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX0NJICgweDA4KQotI2RlZmluZSBWRkNfU0FBOTA1MV9TQTlENCAoMHgxMCkgLyogRG9uJ3QgY2FyZSBiaXQgKi8KLSNkZWZpbmUgVkZDX1NBQTkwNTFfT0VDICgweDIwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9PRVkgKDB4NDApCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1ZOTCAoMHg4MCkKLQotCi0vKiBCaXQgc2V0dGluZ3MgZm9yIHNhYTkwNTEgc3ViIGFkZHJlc3MgMHgwQSAqLwotCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1lETDAgKDB4MDEpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1lETDEgKDB4MDIpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1lETDIgKDB4MDQpCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1NTMiAoMHgwOCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfU1MzICgweDEwKQotI2RlZmluZSBWRkNfU0FBOTA1MV9ZQyAoMHgyMCkKLSNkZWZpbmUgVkZDX1NBQTkwNTFfQ1QgKDB4NDApCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1NZQyAoMHg4MCkKLQotCi0jZGVmaW5lIFZGQ19TQUE5MDUxX1NBKGEsYikgKChhKS0+c2FhOTA1MV9zdGF0ZV9hcnJheVsoYikrMV0pCi0jZGVmaW5lIHZmY191cGRhdGVfc2FhOTA1MShhKSAodmZjX2kyY19zZW5kYnVmKChhKSxWRkNfU0FBOTA1MV9BRERSLFwKLQkJCQkJICAgIChhKS0+c2FhOTA1MV9zdGF0ZV9hcnJheSxcCi0JCQkJCSAgICBWRkNfU0FBOTA1MV9OUikpCi0KLQotc3RydWN0IHZmY19kZXYgewotCXZvbGF0aWxlIHN0cnVjdCB2ZmNfcmVncyBfX2lvbWVtICpyZWdzOwotCXN0cnVjdCB2ZmNfcmVncyAqcGh5c19yZWdzOwotCXVuc2lnbmVkIGludCBjb250cm9sX3JlZzsKLQlzdHJ1Y3QgbXV0ZXggZGV2aWNlX2xvY2tfbXR4OwotCWludCBpbnN0YW5jZTsKLQlpbnQgYnVzeTsKLQl1bnNpZ25lZCBsb25nIHdoaWNoX2lvOwotCXVuc2lnbmVkIGNoYXIgc2FhOTA1MV9zdGF0ZV9hcnJheVtWRkNfU0FBOTA1MV9OUl07Ci19OwotCi12b2lkIGNhcHRzdGF0X3Jlc2V0KHN0cnVjdCB2ZmNfZGV2ICopOwotdm9pZCBtZW1wdHJfcmVzZXQoc3RydWN0IHZmY19kZXYgKik7Ci0KLWludCB2ZmNfcGNmODU4NF9pbml0KHN0cnVjdCB2ZmNfZGV2ICopOwotdm9pZCB2ZmNfaTJjX2RlbGF5X25vX2J1c3koc3RydWN0IHZmY19kZXYgKiwgdW5zaWduZWQgbG9uZyk7Ci12b2lkIHZmY19pMmNfZGVsYXkoc3RydWN0IHZmY19kZXYgKik7Ci1pbnQgdmZjX2kyY19zZW5kYnVmKHN0cnVjdCB2ZmNfZGV2ICosIHVuc2lnbmVkIGNoYXIsIGNoYXIgKiwgaW50KSA7Ci1pbnQgdmZjX2kyY19yZWN2YnVmKHN0cnVjdCB2ZmNfZGV2ICosIHVuc2lnbmVkIGNoYXIsIGNoYXIgKiwgaW50KSA7Ci1pbnQgdmZjX2kyY19yZXNldF9idXMoc3RydWN0IHZmY19kZXYgKik7Ci1pbnQgdmZjX2luaXRfaTJjX2J1cyhzdHJ1Y3QgdmZjX2RldiAqKTsKLQotI2RlZmluZSBWRkNfQ09OVFJPTF9ESUFHTU9ERSAgMHgxMDAwMDAwMAotI2RlZmluZSBWRkNfQ09OVFJPTF9NRU1QVFIgICAgMHgyMDAwMDAwMAotI2RlZmluZSBWRkNfQ09OVFJPTF9DQVBUVVJFICAgMHgwMjAwMDAwMAotI2RlZmluZSBWRkNfQ09OVFJPTF9DQVBUUkVTRVQgMHgwNDAwMDAwMAotCi0jZGVmaW5lIFZGQ19TVEFUVVNfQ0FQVFVSRSAgICAweDA4MDAwMDAwCi0KLSNpZmRlZiBWRkNfSU9DVExfREVCVUcKLSNkZWZpbmUgVkZDX0lPQ1RMX0RFQlVHX1BSSU5USyhhKSBwcmludGsgYQotI2Vsc2UKLSNkZWZpbmUgVkZDX0lPQ1RMX0RFQlVHX1BSSU5USyhhKQotI2VuZGlmCi0KLSNpZmRlZiBWRkNfSTJDX0RFQlVHCi0jZGVmaW5lIFZGQ19JMkNfREVCVUdfUFJJTlRLKGEpIHByaW50ayBhCi0jZWxzZQotI2RlZmluZSBWRkNfSTJDX0RFQlVHX1BSSU5USyhhKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTElOVVhfVkZDX0hfICovCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTE4MWJiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19kZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDczNiArMCwwIEBACi0vKgotICogZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jCi0gKgotICogRHJpdmVyIGZvciB0aGUgVmlkZW9waXggRnJhbWUgR3JhYmJlci4KLSAqIAotICogSW4gb3JkZXIgdG8gdXNlIHRoZSBWRkMgeW91IG5lZWQgdG8gcHJvZ3JhbSB0aGUgdmlkZW8gY29udHJvbGxlcgotICogY2hpcC4gVGhpcyBjaGlwIGlzIHRoZSBQaGlsbGlwcyBTQUE5MDUxLiAgWW91IG5lZWQgdG8gY2FsbCB0aGVpcgotICogZG9jdW1lbnRhdGlvbiBvcmRlcmluZyBsaW5lIHRvIGdldCB0aGUgZG9jcy4KLSAqCi0gKiBUaGVyZSBpcyB2ZXJ5IGxpdHRsZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBWRkMgaXRzZWxmLiAgVGhlcmUgaXMKLSAqIHNvbWUgdXNlZnVsIGluZm8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIG1hbnVhbHMgdGhhdCBjb21lIHdpdGgKLSAqIHRoZSBjYXJkLiAgSSB3aWxsIGhvcGVmdWxseSB3cml0ZSBzb21lIGJldHRlciBkb2NzIGF0IGEgbGF0ZXIgZGF0ZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgTWFuaXNoIFZhY2hoYXJhamFuaSAobXZhY2hoYXJAbm9jLnJ1dGdlcnMuZWR1KQotICogKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotCi0jaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNkZWZpbmUgVkZDX01BSk9SICg2MCkKLQotI2lmIDAKLSNkZWZpbmUgVkZDX0lPQ1RMX0RFQlVHCi0jZW5kaWYKLQotI2luY2x1ZGUgInZmYy5oIgotI2luY2x1ZGUgPGFzbS92ZmNfaW9jdGxzLmg+Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZmY19mb3BzOwotc3RhdGljIHN0cnVjdCB2ZmNfZGV2ICoqdmZjX2Rldl9sc3Q7Ci1zdGF0aWMgY2hhciB2ZmNzdHJbXT0idmZjIjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNhYTkwNTFfaW5pdF9hcnJheVtWRkNfU0FBOTA1MV9OUl0gPSB7Ci0JMHgwMCwgMHg2NCwgMHg3MiwgMHg1MiwKLQkweDM2LCAweDE4LCAweGZmLCAweDIwLAotCTB4ZmMsIDB4NzcsIDB4ZTMsIDB4NTAsCi0JMHgzZQotfTsKLQotc3RhdGljIHZvaWQgdmZjX2xvY2tfZGV2aWNlKHN0cnVjdCB2ZmNfZGV2ICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9ja19tdHgpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmNfdW5sb2NrX2RldmljZShzdHJ1Y3QgdmZjX2RldiAqZGV2KQotewotCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9ja19tdHgpOwotfQotCi0KLXN0YXRpYyB2b2lkIHZmY19jYXB0c3RhdF9yZXNldChzdHJ1Y3QgdmZjX2RldiAqZGV2KQotewotCWRldi0+Y29udHJvbF9yZWcgfD0gVkZDX0NPTlRST0xfQ0FQVFJFU0VUOwotCXNidXNfd3JpdGVsKGRldi0+Y29udHJvbF9yZWcsICZkZXYtPnJlZ3MtPmNvbnRyb2wpOwotCWRldi0+Y29udHJvbF9yZWcgJj0gflZGQ19DT05UUk9MX0NBUFRSRVNFVDsKLQlzYnVzX3dyaXRlbChkZXYtPmNvbnRyb2xfcmVnLCAmZGV2LT5yZWdzLT5jb250cm9sKTsKLQlkZXYtPmNvbnRyb2xfcmVnIHw9IFZGQ19DT05UUk9MX0NBUFRSRVNFVDsKLQlzYnVzX3dyaXRlbChkZXYtPmNvbnRyb2xfcmVnLCAmZGV2LT5yZWdzLT5jb250cm9sKTsKLX0KLQotc3RhdGljIHZvaWQgdmZjX21lbXB0cl9yZXNldChzdHJ1Y3QgdmZjX2RldiAqZGV2KQotewotCWRldi0+Y29udHJvbF9yZWcgfD0gVkZDX0NPTlRST0xfTUVNUFRSOwotCXNidXNfd3JpdGVsKGRldi0+Y29udHJvbF9yZWcsICZkZXYtPnJlZ3MtPmNvbnRyb2wpOwotCWRldi0+Y29udHJvbF9yZWcgJj0gflZGQ19DT05UUk9MX01FTVBUUjsKLQlzYnVzX3dyaXRlbChkZXYtPmNvbnRyb2xfcmVnLCAmZGV2LT5yZWdzLT5jb250cm9sKTsKLQlkZXYtPmNvbnRyb2xfcmVnIHw9IFZGQ19DT05UUk9MX01FTVBUUjsgCi0Jc2J1c193cml0ZWwoZGV2LT5jb250cm9sX3JlZywgJmRldi0+cmVncy0+Y29udHJvbCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZjX2Nzcl9pbml0KHN0cnVjdCB2ZmNfZGV2ICpkZXYpCi17Ci0JZGV2LT5jb250cm9sX3JlZyA9IDB4ODAwMDAwMDA7Ci0Jc2J1c193cml0ZWwoZGV2LT5jb250cm9sX3JlZywgJmRldi0+cmVncy0+Y29udHJvbCk7Ci0JdWRlbGF5KDIwMCk7IAotCWRldi0+Y29udHJvbF9yZWcgJj0gfjB4ODAwMDAwMDA7Ci0Jc2J1c193cml0ZWwoZGV2LT5jb250cm9sX3JlZywgJmRldi0+cmVncy0+Y29udHJvbCk7Ci0JdWRlbGF5KDEwMCk7IAotCXNidXNfd3JpdGVsKDB4MGYwMDAwMDAsICZkZXYtPnJlZ3MtPmkyY19tYWdpYzIpOwotCi0JdmZjX21lbXB0cl9yZXNldChkZXYpOwotCi0JZGV2LT5jb250cm9sX3JlZyAmPSB+VkZDX0NPTlRST0xfRElBR01PREU7Ci0JZGV2LT5jb250cm9sX3JlZyAmPSB+VkZDX0NPTlRST0xfQ0FQVFVSRTsKLQlkZXYtPmNvbnRyb2xfcmVnIHw9IDB4NDAwMDAwMDA7Ci0Jc2J1c193cml0ZWwoZGV2LT5jb250cm9sX3JlZywgJmRldi0+cmVncy0+Y29udHJvbCk7Ci0KLQl2ZmNfY2FwdHN0YXRfcmVzZXQoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmY19zYWE5MDUxX2luaXQoc3RydWN0IHZmY19kZXYgKmRldikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBWRkNfU0FBOTA1MV9OUjsgaSsrKQotCQlkZXYtPnNhYTkwNTFfc3RhdGVfYXJyYXlbaV0gPSBzYWE5MDUxX2luaXRfYXJyYXlbaV07Ci0KLQl2ZmNfaTJjX3NlbmRidWYoZGV2LFZGQ19TQUE5MDUxX0FERFIsCi0JCQlkZXYtPnNhYTkwNTFfc3RhdGVfYXJyYXksIFZGQ19TQUE5MDUxX05SKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbml0X3ZmY19odyhzdHJ1Y3QgdmZjX2RldiAqZGV2KQotewotCXZmY19sb2NrX2RldmljZShkZXYpOwotCXZmY19jc3JfaW5pdChkZXYpOwotCi0JdmZjX3BjZjg1ODRfaW5pdChkZXYpOwotCXZmY19pbml0X2kyY19idXMoZGV2KTsgLyogaG9wZWZ1bGx5IHRoaXMgZG9lc24ndCB1bmRvIHRoZSBtYWdpYwotCQkJCSAgc3VuIGNvZGUgYWJvdmUqLwotCXZmY19zYWE5MDUxX2luaXQoZGV2KTsKLQl2ZmNfdW5sb2NrX2RldmljZShkZXYpOwotCXJldHVybiAwOyAKLX0KLQotc3RhdGljIGludCBpbml0X3ZmY19kZXZzdHJ1Y3Qoc3RydWN0IHZmY19kZXYgKmRldiwgaW50IGluc3RhbmNlKQotewotCWRldi0+aW5zdGFuY2U9aW5zdGFuY2U7Ci0JbXV0ZXhfaW5pdCgmZGV2LT5kZXZpY2VfbG9ja19tdHgpOwotCWRldi0+Y29udHJvbF9yZWc9MDsKLQlkZXYtPmJ1c3k9MDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbml0X3ZmY19kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICpzZGV2LHN0cnVjdCB2ZmNfZGV2ICpkZXYsCi0JCQkgICBpbnQgaW5zdGFuY2UpCi17Ci0JaWYoZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRkM6IEJvZ3VzIHBvaW50ZXIgcGFzc2VkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXByaW50aygiSW5pdGlhbGl6aW5nIHZmYyVkXG4iLGluc3RhbmNlKTsKLQlkZXYtPnJlZ3MgPSBOVUxMOwotCWRldi0+cmVncyA9ICh2b2xhdGlsZSBzdHJ1Y3QgdmZjX3JlZ3MgX19pb21lbSAqKQotCQlzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJICAgICBzaXplb2Yoc3RydWN0IHZmY19yZWdzKSwgdmZjc3RyKTsKLQlkZXYtPndoaWNoX2lvID0gc2Rldi0+cmVnX2FkZHJzWzBdLndoaWNoX2lvOwotCWRldi0+cGh5c19yZWdzID0gKHN0cnVjdCB2ZmNfcmVncyAqKSBzZGV2LT5yZWdfYWRkcnNbMF0ucGh5c19hZGRyOwotCWlmIChkZXYtPnJlZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlwcmludGsoInZmYyVkOiByZWdpc3RlcnMgbWFwcGVkIGF0IHBoeXNfYWRkcjogMHglbHhcbiAgICB2aXJ0X2FkZHI6IDB4JWx4XG4iLAotCSAgICAgICBpbnN0YW5jZSwodW5zaWduZWQgbG9uZylzZGV2LT5yZWdfYWRkcnNbMF0ucGh5c19hZGRyLCh1bnNpZ25lZCBsb25nKWRldi0+cmVncyk7Ci0KLQlpZiAoaW5pdF92ZmNfZGV2c3RydWN0KGRldiwgaW5zdGFuY2UpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaW5pdF92ZmNfaHcoZGV2KSkKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCB2ZmNfZGV2ICp2ZmNfZ2V0X2Rldl9wdHIoaW50IGluc3RhbmNlKQotewotCXJldHVybiB2ZmNfZGV2X2xzdFtpbnN0YW5jZV07Ci19Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmZjX2Rldl9sb2NrKTsKLQotc3RhdGljIGludCB2ZmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkgCi17Ci0Jc3RydWN0IHZmY19kZXYgKmRldjsKLQotCWxvY2tfa2VybmVsKCk7Ci0Jc3Bpbl9sb2NrKCZ2ZmNfZGV2X2xvY2spOwotCWRldiA9IHZmY19nZXRfZGV2X3B0cihpbWlub3IoaW5vZGUpKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJc3Bpbl91bmxvY2soJnZmY19kZXZfbG9jayk7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChkZXYtPmJ1c3kpIHsKLQkJc3Bpbl91bmxvY2soJnZmY19kZXZfbG9jayk7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlkZXYtPmJ1c3kgPSAxOwotCXNwaW5fdW5sb2NrKCZ2ZmNfZGV2X2xvY2spOwotCi0JdmZjX2xvY2tfZGV2aWNlKGRldik7Ci0JCi0JdmZjX2Nzcl9pbml0KGRldik7Ci0JdmZjX3BjZjg1ODRfaW5pdChkZXYpOwotCXZmY19pbml0X2kyY19idXMoZGV2KTsKLQl2ZmNfc2FhOTA1MV9pbml0KGRldik7Ci0JdmZjX21lbXB0cl9yZXNldChkZXYpOwotCXZmY19jYXB0c3RhdF9yZXNldChkZXYpOwotCQotCXZmY191bmxvY2tfZGV2aWNlKGRldik7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsc3RydWN0IGZpbGUgKmZpbGUpIAotewotCXN0cnVjdCB2ZmNfZGV2ICpkZXY7Ci0KLQlzcGluX2xvY2soJnZmY19kZXZfbG9jayk7Ci0JZGV2ID0gdmZjX2dldF9kZXZfcHRyKGltaW5vcihpbm9kZSkpOwotCWlmICghZGV2IHx8ICFkZXYtPmJ1c3kpIHsKLQkJc3Bpbl91bmxvY2soJnZmY19kZXZfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkZXYtPmJ1c3kgPSAwOwotCXNwaW5fdW5sb2NrKCZ2ZmNfZGV2X2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmY19kZWJ1ZyhzdHJ1Y3QgdmZjX2RldiAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3QgdmZjX2RlYnVnX2lub3V0IGlub3V0OwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXN3aXRjaChjbWQpIHsKLQljYXNlIFZGQ19JMkNfU0VORDoKLQkJaWYoY29weV9mcm9tX3VzZXIoJmlub3V0LCBhcmdwLCBzaXplb2YoaW5vdXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJ1ZmZlciA9IGttYWxsb2MoaW5vdXQubGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBpbm91dC5idWZmZXIsIGlub3V0LmxlbikpIHsKLQkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQkKLQotCQl2ZmNfbG9ja19kZXZpY2UoZGV2KTsKLQkJaW5vdXQucmV0PQotCQkJdmZjX2kyY19zZW5kYnVmKGRldixpbm91dC5hZGRyICYgMHhmZiwKLQkJCQkJYnVmZmVyLGlub3V0Lmxlbik7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCZpbm91dCxzaXplb2YoaW5vdXQpKSkgewotCQkJdmZjX3VubG9ja19kZXZpY2UoZGV2KTsKLQkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl2ZmNfdW5sb2NrX2RldmljZShkZXYpOwotCi0JCWJyZWFrOwotCWNhc2UgVkZDX0kyQ19SRUNWOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmlub3V0LCBhcmdwLCBzaXplb2YoaW5vdXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJ1ZmZlciA9IGt6YWxsb2MoaW5vdXQubGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJdmZjX2xvY2tfZGV2aWNlKGRldik7Ci0JCWlub3V0LnJldD0KLQkJCXZmY19pMmNfcmVjdmJ1ZihkZXYsaW5vdXQuYWRkciAmIDB4ZmYKLQkJCQkJLGJ1ZmZlcixpbm91dC5sZW4pOwotCQl2ZmNfdW5sb2NrX2RldmljZShkZXYpOwotCQkKLQkJaWYgKGNvcHlfdG9fdXNlcihpbm91dC5idWZmZXIsIGJ1ZmZlciwgaW5vdXQubGVuKSkgewotCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwmaW5vdXQsc2l6ZW9mKGlub3V0KSkpIHsKLQkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlrZnJlZShidWZmZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZjX2NhcHR1cmVfc3RhcnQoc3RydWN0IHZmY19kZXYgKmRldikKLXsKLQl2ZmNfY2FwdHN0YXRfcmVzZXQoZGV2KTsKLQlkZXYtPmNvbnRyb2xfcmVnID0gc2J1c19yZWFkbCgmZGV2LT5yZWdzLT5jb250cm9sKTsKLQlpZigoZGV2LT5jb250cm9sX3JlZyAmIFZGQ19TVEFUVVNfQ0FQVFVSRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2ZmMlZDogdmZjIGNhcHR1cmUgc3RhdHVzIG5vdCByZXNldFxuIiwKLQkJICAgICAgIGRldi0+aW5zdGFuY2UpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQl2ZmNfbG9ja19kZXZpY2UoZGV2KTsKLQlkZXYtPmNvbnRyb2xfcmVnICY9IH5WRkNfQ09OVFJPTF9DQVBUVVJFOwotCXNidXNfd3JpdGVsKGRldi0+Y29udHJvbF9yZWcsICZkZXYtPnJlZ3MtPmNvbnRyb2wpOwotCWRldi0+Y29udHJvbF9yZWcgfD0gVkZDX0NPTlRST0xfQ0FQVFVSRTsKLQlzYnVzX3dyaXRlbChkZXYtPmNvbnRyb2xfcmVnLCAmZGV2LT5yZWdzLT5jb250cm9sKTsKLQlkZXYtPmNvbnRyb2xfcmVnICY9IH5WRkNfQ09OVFJPTF9DQVBUVVJFOwotCXNidXNfd3JpdGVsKGRldi0+Y29udHJvbF9yZWcsICZkZXYtPnJlZ3MtPmNvbnRyb2wpOwotCXZmY191bmxvY2tfZGV2aWNlKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmNfY2FwdHVyZV9wb2xsKHN0cnVjdCB2ZmNfZGV2ICpkZXYpCi17Ci0JaW50IHRpbWVvdXQgPSAxMDAwOwotCi0Jd2hpbGUgKCF0aW1lb3V0LS0pIHsKLQkJaWYgKHNidXNfcmVhZGwoJmRldi0+cmVncy0+Y29udHJvbCkgJiBWRkNfU1RBVFVTX0NBUFRVUkUpCi0JCQlicmVhazsKLQkJdmZjX2kyY19kZWxheV9ub19idXN5KGRldiwgMTAwKTsKLQl9Ci0JaWYoIXRpbWVvdXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidmZjJWQ6IGNhcHR1cmUgdGltZWQgb3V0XG4iLAotCQkgICAgICAgZGV2LT5pbnN0YW5jZSk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgdmZjX3NldF9jb250cm9sX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKLQkJCSAgc3RydWN0IHZmY19kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBhcmcpIAotewotCWludCBzZXRjbWQsIHJldCA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNldGNtZCwodm9pZCBfX3VzZXIgKilhcmcsc2l6ZW9mKHVuc2lnbmVkIGludCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCVZGQ19JT0NUTF9ERUJVR19QUklOVEsoKCJ2ZmMlZDogSU9DVEwoVkZDU0NUUkwpIGFyZz0weCV4XG4iLAotCQkJCWRldi0+aW5zdGFuY2Usc2V0Y21kKSk7Ci0KLQlzd2l0Y2goc2V0Y21kKSB7Ci0JY2FzZSBNRU1QUlNUOgotCQl2ZmNfbG9ja19kZXZpY2UoZGV2KTsKLQkJdmZjX21lbXB0cl9yZXNldChkZXYpOwotCQl2ZmNfdW5sb2NrX2RldmljZShkZXYpOwotCQlyZXQ9MDsKLQkJYnJlYWs7Ci0JY2FzZSBDQVBUUkNNRDoKLQkJdmZjX2NhcHR1cmVfc3RhcnQoZGV2KTsKLQkJdmZjX2NhcHR1cmVfcG9sbChkZXYpOwotCQlicmVhazsKLQljYXNlIERJQUdNT0RFOgotCQlpZihjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCQl2ZmNfbG9ja19kZXZpY2UoZGV2KTsKLQkJCWRldi0+Y29udHJvbF9yZWcgfD0gVkZDX0NPTlRST0xfRElBR01PREU7Ci0JCQlzYnVzX3dyaXRlbChkZXYtPmNvbnRyb2xfcmVnLCAmZGV2LT5yZWdzLT5jb250cm9sKTsKLQkJCXZmY191bmxvY2tfZGV2aWNlKGRldik7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UgewotCQkJcmV0ID0gLUVQRVJNOyAKLQkJfQotCQlicmVhazsKLQljYXNlIE5PUk1NT0RFOgotCQl2ZmNfbG9ja19kZXZpY2UoZGV2KTsKLQkJZGV2LT5jb250cm9sX3JlZyAmPSB+VkZDX0NPTlRST0xfRElBR01PREU7Ci0JCXNidXNfd3JpdGVsKGRldi0+Y29udHJvbF9yZWcsICZkZXYtPnJlZ3MtPmNvbnRyb2wpOwotCQl2ZmNfdW5sb2NrX2RldmljZShkZXYpOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIENBUFRSU1RSOgotCQl2ZmNfY2FwdHVyZV9zdGFydChkZXYpOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIENBUFRSV0FJVDoKLQkJdmZjX2NhcHR1cmVfcG9sbChkZXYpOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHZmY19wb3J0X2NoYW5nZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgc3RydWN0IHZmY19kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNtZDsKLQotCWlmKGNvcHlfZnJvbV91c2VyKCZjbWQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB7Ci0JCVZGQ19JT0NUTF9ERUJVR19QUklOVEsoKCJ2ZmMlZDogVXNlciBwYXNzZWQgYm9ndXMgcG9pbnRlciB0byAiCi0JCQkJCSJ2ZmNfcG9ydF9jaGFuZ2VfaW9jdGxcbiIsCi0JCQkJCWRldi0+aW5zdGFuY2UpKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCQotCVZGQ19JT0NUTF9ERUJVR19QUklOVEsoKCJ2ZmMlZDogSU9DVEwoVkZDUE9SVENIRykgYXJnPTB4JXhcbiIsCi0JCQkJZGV2LT5pbnN0YW5jZSwgY21kKSk7Ci0KLQlzd2l0Y2goY21kKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0hTWV9TVEFSVCkgPSAweDcyOyAKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0hTWV9TVE9QKSA9IDB4NTI7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9IQ19TVEFSVCkgPSAweDM2OwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfSENfU1RPUCkgPSAweDE4OwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfSE9SSVpfUEVBSykgPSBWRkNfU0FBOTA1MV9CUDI7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMykgPSBWRkNfU0FBOTA1MV9DVCB8IFZGQ19TQUE5MDUxX1NTMzsKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX1NFQ0FNX0RFTEFZKSA9IDB4M2U7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0hTWV9TVEFSVCkgPSAweDNhOwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfSFNZX1NUT1ApID0gMHgxNzsKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0hDX1NUQVJUKSA9IDB4ZmE7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9IQ19TVE9QKSA9IDB4ZGU7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9IT1JJWl9QRUFLKSA9Ci0JCQlWRkNfU0FBOTA1MV9CWSB8IFZGQ19TQUE5MDUxX1BGIHwgVkZDX1NBQTkwNTFfQlAyOwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfQzMpID0gVkZDX1NBQTkwNTFfWUM7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9TRUNBTV9ERUxBWSkgPSAwOwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfQzIpICY9Ci0JCQl+KFZGQ19TQUE5MDUxX1NTMCB8IFZGQ19TQUE5MDUxX1NTMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaChjbWQpIHsKLQljYXNlIDE6Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMikgfD0KLQkJCShWRkNfU0FBOTA1MV9TUzAgfCBWRkNfU0FBOTA1MV9TUzEpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMikgJj0KLQkJCX4oVkZDX1NBQTkwNTFfU1MwIHwgVkZDX1NBQTkwNTFfU1MxKTsKLQkJVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0MyKSB8PSBWRkNfU0FBOTA1MV9TUzA7IAotCQlicmVhazsKLQljYXNlIDM6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCX0KLQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfQzMpICY9IH4oVkZDX1NBQTkwNTFfU1MyKTsKLQlyZXQ9dmZjX3VwZGF0ZV9zYWE5MDUxKGRldik7Ci0JdWRlbGF5KDUwMCk7Ci0JVkZDX1NBQTkwNTFfU0EoZGV2LFZGQ19TQUE5MDUxX0MzKSB8PSAoVkZDX1NBQTkwNTFfU1MyKTsKLQlyZXQ9dmZjX3VwZGF0ZV9zYWE5MDUxKGRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZmNfc2V0X3ZpZGVvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHN0cnVjdCB2ZmNfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAwOwotCWludCBjbWQ7Ci0KLQlpZihjb3B5X2Zyb21fdXNlcigmY21kLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgewotCQlWRkNfSU9DVExfREVCVUdfUFJJTlRLKCgidmZjJWQ6IFVzZXIgcGFzc2VkIGJvZ3VzIHBvaW50ZXIgdG8gIgotCQkJCQkidmZjX3NldF92aWRlb19pb2N0bFxuIiwKLQkJCQkJZGV2LT5pbnN0YW5jZSkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlWRkNfSU9DVExfREVCVUdfUFJJTlRLKCgidmZjJWQ6IElPQ1RMKFZGQ1NWSUQpIGFyZz0weCV4XG4iLAotCQkJCWRldi0+aW5zdGFuY2UsIGNtZCkpOwotCXN3aXRjaChjbWQpIHsKLQljYXNlIFNURF9OVFNDOgotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfQzEpICY9IH5WRkNfU0FBOTA1MV9BTFQ7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMSkgfD0gVkZDX1NBQTkwNTFfWVBOIHwgCi0JCQlWRkNfU0FBOTA1MV9DQ0ZSMCB8IFZGQ19TQUE5MDUxX0NDRlIxIHwgVkZDX1NBQTkwNTFfRlM7Ci0JCXJldCA9IHZmY191cGRhdGVfc2FhOTA1MShkZXYpOwotCQlicmVhazsKLQljYXNlIFNURF9QQUw6Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMSkgJj0gfihWRkNfU0FBOTA1MV9ZUE4gfCAKLQkJCQkJCQlWRkNfU0FBOTA1MV9DQ0ZSMSB8IAotCQkJCQkJCVZGQ19TQUE5MDUxX0NDRlIwIHwKLQkJCQkJCQlWRkNfU0FBOTA1MV9GUyk7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMSkgfD0gVkZDX1NBQTkwNTFfQUxUOwotCQlyZXQgPSB2ZmNfdXBkYXRlX3NhYTkwNTEoZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIENPTE9SX09OOgotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfQzEpIHw9IFZGQ19TQUE5MDUxX0NPOwotCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfSE9SSVpfUEVBSykgJj0KLQkJCX4oVkZDX1NBQTkwNTFfQlkgfCBWRkNfU0FBOTA1MV9QRik7Ci0JCXJldCA9IHZmY191cGRhdGVfc2FhOTA1MShkZXYpOwotCQlicmVhazsKLQljYXNlIE1PTk86Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9DMSkgJj0gfihWRkNfU0FBOTA1MV9DTyk7Ci0JCVZGQ19TQUE5MDUxX1NBKGRldixWRkNfU0FBOTA1MV9IT1JJWl9QRUFLKSB8PQotCQkJKFZGQ19TQUE5MDUxX0JZIHwgVkZDX1NBQTkwNTFfUEYpOwotCQlyZXQgPSB2ZmNfdXBkYXRlX3NhYTkwNTEoZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmZjX2dldF92aWRlb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBzdHJ1Y3QgdmZjX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gTk9fTE9DSzsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKLQotCWlmKHZmY19pMmNfcmVjdmJ1ZihkZXYsIFZGQ19TQUE5MDUxX0FERFIsIGJ1ZiwgMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2ZmMlZDogVW5hYmxlIHRvIGdldCBzdGF0dXNcbiIsCi0JCSAgICAgICBkZXYtPmluc3RhbmNlKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYoYnVmWzBdICYgVkZDX1NBQTkwNTFfSExPQ0spIHsKLQkJc3RhdHVzID0gTk9fTE9DSzsKLQl9IGVsc2UgaWYoYnVmWzBdICYgVkZDX1NBQTkwNTFfRkQpIHsKLQkJaWYoYnVmWzBdICYgVkZDX1NBQTkwNTFfQ0QpCi0JCQlzdGF0dXMgPSBOVFNDX0NPTE9SOwotCQllbHNlCi0JCQlzdGF0dXMgPSBOVFNDX05PQ09MT1I7Ci0JfSBlbHNlIHsKLQkJaWYoYnVmWzBdICYgVkZDX1NBQTkwNTFfQ0QpCi0JCQlzdGF0dXMgPSBQQUxfQ09MT1I7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IFBBTF9OT0NPTE9SOwotCX0KLQlWRkNfSU9DVExfREVCVUdfUFJJTlRLKCgidmZjJWQ6IElPQ1RMKFZGQ0dWSUQpIHJldHVybmluZyBzdGF0dXMgMHgleDsgIgotCQkJCSJidWZbMF09JXhcbiIsIGRldi0+aW5zdGFuY2UsIHN0YXR1cywgYnVmWzBdKSk7Ci0KLQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywmc3RhdHVzLHNpemVvZih1bnNpZ25lZCBpbnQpKSkgewotCQlWRkNfSU9DVExfREVCVUdfUFJJTlRLKCgidmZjJWQ6IFVzZXIgcGFzc2VkIGJvZ3VzIHBvaW50ZXIgdG8gIgotCQkJCQkidmZjX2dldF92aWRlb19pb2N0bFxuIiwKLQkJCQkJZGV2LT5pbnN0YW5jZSkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZmY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykgCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlzdHJ1Y3QgdmZjX2RldiAqZGV2OwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCi0JZGV2ID0gdmZjX2dldF9kZXZfcHRyKGltaW5vcihpbm9kZSkpOwotCWlmKGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQkKLQlzd2l0Y2goY21kICYgMHgwMDAwZmZmZikgewotCWNhc2UgVkZDR0NUUkw6Ci0jaWYgMAotCQlWRkNfSU9DVExfREVCVUdfUFJJTlRLKCgidmZjJWQ6IElPQ1RMKFZGQ0dDVFJMKVxuIiwgZGV2LT5pbnN0YW5jZSkpOwotI2VuZGlmCi0JCXRtcCA9IHNidXNfcmVhZGwoJmRldi0+cmVncy0+Y29udHJvbCk7Ci0JCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmdG1wLCBzaXplb2YodW5zaWduZWQgaW50KSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIFZGQ1NDVFJMOgotCQlyZXQgPSB2ZmNfc2V0X2NvbnRyb2xfaW9jdGwoaW5vZGUsIGZpbGUsIGRldiwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkNHVklEOgotCQlyZXQgPSB2ZmNfZ2V0X3ZpZGVvX2lvY3RsKGlub2RlLCBmaWxlLCBkZXYsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVkZDU1ZJRDoKLQkJcmV0ID0gdmZjX3NldF92aWRlb19pb2N0bChpbm9kZSwgZmlsZSwgZGV2LCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZGQ0hVRToKLQkJVkZDX0lPQ1RMX0RFQlVHX1BSSU5USygoInZmYyVkOiBJT0NUTChWRkNIVUUpXG4iLCBkZXYtPmluc3RhbmNlKSk7Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZ0bXAsYXJncCxzaXplb2YodW5zaWduZWQgaW50KSkpIHsKLQkJCVZGQ19JT0NUTF9ERUJVR19QUklOVEsoKCJ2ZmMlZDogVXNlciBwYXNzZWQgYm9ndXMgcG9pbnRlciAiCi0JCQkJCQkidG8gSU9DVEwoVkZDSFVFKSIsIGRldi0+aW5zdGFuY2UpKTsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlWRkNfU0FBOTA1MV9TQShkZXYsVkZDX1NBQTkwNTFfSFVFKSA9IHRtcDsKLQkJCXZmY191cGRhdGVfc2FhOTA1MShkZXYpOwotCQkJcmV0ID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGQ1BPUlRDSEc6Ci0JCXJldCA9IHZmY19wb3J0X2NoYW5nZV9pb2N0bChpbm9kZSwgZmlsZSwgZGV2LCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZGQ1JESU5GTzoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJVkZDX0lPQ1RMX0RFQlVHX1BSSU5USygoInZmYyVkOiBJT0NUTChWRkNSRElORk8pXG4iLCBkZXYtPmluc3RhbmNlKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IHZmY19kZWJ1Zyh2ZmNfZ2V0X2Rldl9wdHIoaW1pbm9yKGlub2RlKSksIGNtZCwgYXJncCk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZmY19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkgCi17Ci0JdW5zaWduZWQgaW50IG1hcF9zaXplLCByZXQsIG1hcF9vZmZzZXQ7Ci0Jc3RydWN0IHZmY19kZXYgKmRldjsKLQkKLQlkZXYgPSB2ZmNfZ2V0X2Rldl9wdHIoaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKLQlpZihkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltYXBfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQlpZihtYXBfc2l6ZSA+IHNpemVvZihzdHJ1Y3QgdmZjX3JlZ3MpKSAKLQkJbWFwX3NpemUgPSBzaXplb2Yoc3RydWN0IHZmY19yZWdzKTsKLQotCXZtYS0+dm1fZmxhZ3MgfD0KLQkJKFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWVNIQVJFKTsKLQltYXBfb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgKGxvbmcpZGV2LT5waHlzX3JlZ3M7Ci0JcmV0ID0gaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCQkgIE1LX0lPU1BBQ0VfUEZOKGRldi0+d2hpY2hfaW8sCi0JCQkJCW1hcF9vZmZzZXQgPj4gUEFHRV9TSElGVCksCi0JCQkJICBtYXBfc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpOwotCi0JaWYocmV0KQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZmY19mb3BzID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5sbHNlZWsgPQlub19sbHNlZWssCi0JLmlvY3RsID0JdmZjX2lvY3RsLAotCS5tbWFwID0JCXZmY19tbWFwLAotCS5vcGVuID0JCXZmY19vcGVuLAotCS5yZWxlYXNlID0JdmZjX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZmY19wcm9iZSh2b2lkKQotewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOwotCWludCByZXQ7Ci0JaW50IGluc3RhbmNlID0gMCwgY2FyZHMgPSAwOwotCi0JZm9yX2FsbF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJ2ZmMiKSA9PSAwKSB7Ci0JCQljYXJkcysrOwotCQkJY29udGludWU7Ci0JCX0KLQl9Ci0KLQlpZiAoIWNhcmRzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXZmY19kZXZfbHN0ID0ga2NhbGxvYyhjYXJkcyArIDEsIHNpemVvZihzdHJ1Y3QgdmZjX2RldiopLCBHRlBfS0VSTkVMKTsKLQlpZiAodmZjX2Rldl9sc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JdmZjX2Rldl9sc3RbY2FyZHNdID0gTlVMTDsKLQotCXJldCA9IHJlZ2lzdGVyX2NocmRldihWRkNfTUFKT1IsIHZmY3N0ciwgJnZmY19mb3BzKTsKLQlpZihyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZFxuIiwgVkZDX01BSk9SKTsKLQkJa2ZyZWUodmZjX2Rldl9sc3QpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JaW5zdGFuY2UgPSAwOwotCWZvcl9hbGxfc2J1c2RldihzZGV2LCBzYnVzKSB7Ci0JCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAidmZjIikgPT0gMCkgewotCQkJdmZjX2Rldl9sc3RbaW5zdGFuY2VdPShzdHJ1Y3QgdmZjX2RldiAqKQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmNfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAodmZjX2Rldl9sc3RbaW5zdGFuY2VdID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQlyZXQgPSBpbml0X3ZmY19kZXZpY2Uoc2RldiwKLQkJCQkJICAgICAgdmZjX2Rldl9sc3RbaW5zdGFuY2VdLAotCQkJCQkgICAgICBpbnN0YW5jZSk7Ci0JCQlpZihyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpbml0aWFsaXplIgotCQkJCSAgICAgICAiIHZmYyVkIGRldmljZVxuIiwKLQkJCQkgICAgICAgaW5zdGFuY2UpOwotCQkJfSBlbHNlIHsKLQkJCX0KLQkJCi0JCQlpbnN0YW5jZSsrOwotCQkJY29udGludWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIE1PRFVMRQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi0jZWxzZSAKLWludCB2ZmNfaW5pdCh2b2lkKQotI2VuZGlmCi17Ci0JcmV0dXJuIHZmY19wcm9iZSgpOwotfQotCi0jaWZkZWYgTU9EVUxFCi1zdGF0aWMgdm9pZCBkZWluaXRfdmZjX2RldmljZShzdHJ1Y3QgdmZjX2RldiAqZGV2KQotewotCWlmKGRldiA9PSBOVUxMKQotCQlyZXR1cm47Ci0Jc2J1c19pb3VubWFwKGRldi0+cmVncywgc2l6ZW9mKHN0cnVjdCB2ZmNfcmVncykpOwotCWtmcmVlKGRldik7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlzdHJ1Y3QgdmZjX2RldiAqKmRldnA7Ci0KLQl1bnJlZ2lzdGVyX2NocmRldihWRkNfTUFKT1IsdmZjc3RyKTsKLQotCWZvciAoZGV2cCA9IHZmY19kZXZfbHN0OyAqZGV2cDsgZGV2cCsrKQotCQlkZWluaXRfdmZjX2RldmljZSgqZGV2cCk7Ci0KLQlrZnJlZSh2ZmNfZGV2X2xzdCk7Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI5ODZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19pMmMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5jCi0gKgotICogRHJpdmVyIGZvciB0aGUgVmlkZW9waXggRnJhbWUgR3JhYmJlci4KLSAqIAotICogRnVuY3Rpb25zIHRoYXQgc3VwcG9ydCB0aGUgUGhpbGxpcHMgaTJjKEkgc3F1YXJlZCBDKSBidXMgb24gdGhlIHZmYwotICogIERvY3VtZW50YXRpb24gZm9yIHRoZSBQaGlsbGlwcyBJMkMgYnVzIGNhbiBiZSBmb3VuZCBvbiB0aGUgCi0gKiAgcGhpbGxpcHMgaG9tZSBwYWdlCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IE1hbmlzaCBWYWNoaGFyYWphbmkgKG12YWNoaGFyQG5vYy5ydXRnZXJzLmVkdSkKLSAqCi0gKi8KLQotLyogTk9URTogSXQgc2VlbXMgdG8gbWUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgdGhlCi1wY2Q4NTg0dC9wY2Y4NTg0IGRvZXMgbm90IHNob3cgdGhlIGNvcnJlY3Qgd2F5IHRvIGFkZHJlc3MgdGhlIGkyYyBidXMuCi1CYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gb24gdGhlIEkyQyBidXMgaXRzZWxmIGFuZCB0aGUgcmVtYWluZGVyIG9mCi10aGUgUGhpbGxpcHMgZG9jcyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobXMgYXBwZWFyIHRvIGJlIGNvcnJlY3QuICBJIGFtCi1mYWlybHkgY2VydGFpbiB0aGF0IHRoZSBmbG93Y2hhcnRzIGluIHRoZSBwaGlsbGlwcyBkb2NzIGFyZSB3cm9uZy4gKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KLQotI2lmIDAgCi0jZGVmaW5lIFZGQ19JMkNfREVCVUcKLSNlbmRpZgotCi0jaW5jbHVkZSAidmZjLmgiCi0jaW5jbHVkZSAidmZjX2kyYy5oIgotCi0jZGVmaW5lIFdSSVRFX1MxKF9fdmFsKSBcCi0Jc2J1c193cml0ZWwoX192YWwsICZkZXYtPnJlZ3MtPmkyY19zMSkKLSNkZWZpbmUgV1JJVEVfUkVHKF9fdmFsKSBcCi0Jc2J1c193cml0ZWwoX192YWwsICZkZXYtPnJlZ3MtPmkyY19yZWcpCi0KLSNkZWZpbmUgVkZDX0kyQ19SRUFEICgweDEpCi0jZGVmaW5lIFZGQ19JMkNfV1JJVEUgKDB4MCkKLSAgICAgCi0vKioqKioqIAotICBUaGUgaTJjIGJ1cyBjb250cm9sbGVyIGNoaXAgb24gdGhlIFZGQyBpcyBhIHBjZDg1ODR0LCBidXQKLSAgcGhpbGxpcHMgY2xhaW1zIGl0IGRvZXNuJ3QgZXhpc3QuICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBpdCBpcwotICBpZGVudGljYWwgdG8gdGhlIFBDRjg1ODQgc28gSSB0cmVhdCBpdCBsaWtlIGl0IGlzIHRoZSBwY2Y4NTg0LgotICAKLSAgTk9URTogVGhlIHBjZjg1ODQgb25seSBjYXJlcwotICBhYm91dCB0aGUgbXNiIG9mIHRoZSB3b3JkIHlvdSBmZWVkIGl0IAotKioqKiovCi0KLWludCB2ZmNfcGNmODU4NF9pbml0KHN0cnVjdCB2ZmNfZGV2ICpkZXYpIAotewotCS8qIFRoaXMgd2lsbCBhbHNvIGNob29zZSByZWdpc3RlciBTMF9PV04gc28gd2UgY2FuIHNldCBpdC4gKi8KLQlXUklURV9TMShSRVNFVCk7Ci0KLQkvKiBUaGUgcGNmODU4NCBzaGlmdHMgdGhpcyB2YWx1ZSBsZWZ0IG9uZSBiaXQgYW5kIHVzZXMKLQkgKiBpdCBhcyBpdHMgaTJjIGJ1cyBhZGRyZXNzLgotCSAqLwotCVdSSVRFX1JFRygweDU1MDAwMDAwKTsKLQotCS8qIFRoaXMgd2lsbCBzZXQgdGhlIGkyYyBidXMgYXQgdGhlIHNhbWUgc3BlZWQgc3VuIHVzZXMsCi0JICogYW5kIHNldCBhbm90aGVyIG1hZ2ljIGJpdC4KLQkgKi8KLQlXUklURV9TMShTRUxFQ1QoUzIpKTsKLQlXUklURV9SRUcoMHgxNDAwMDAwMCk7Ci0JCi0JLyogRW5hYmxlIHRoZSBzZXJpYWwgcG9ydCwgaWRsZSB0aGUgaTJjIGJ1cyBhbmQgc2V0Ci0JICogdGhlIGRhdGEgcmVnIHRvIHMwLgotCSAqLwotCVdSSVRFX1MxKENMRUFSX0kyQ19CVVMpOwotCXVkZWxheSgxMDApOwotCXJldHVybiAwOwotfQotCi12b2lkIHZmY19pMmNfZGVsYXlfbm9fYnVzeShzdHJ1Y3QgdmZjX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIHVzZWNzKSAKLXsKLQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSh1c2Vjc190b19qaWZmaWVzKHVzZWNzKSk7Ci19Ci0KLXZvaWQgaW5saW5lIHZmY19pMmNfZGVsYXkoc3RydWN0IHZmY19kZXYgKmRldikgCi17IAotCXZmY19pMmNfZGVsYXlfbm9fYnVzeShkZXYsIDEwMCk7Ci19Ci0KLWludCB2ZmNfaW5pdF9pMmNfYnVzKHN0cnVjdCB2ZmNfZGV2ICpkZXYpCi17Ci0JV1JJVEVfUzEoRU5BQkxFX1NFUklBTCB8IFNFTEVDVChTMCkgfCBBQ0spOwotCXZmY19pMmNfcmVzZXRfYnVzKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCB2ZmNfaTJjX3Jlc2V0X2J1cyhzdHJ1Y3QgdmZjX2RldiAqZGV2KSAKLXsKLQlWRkNfSTJDX0RFQlVHX1BSSU5USygoS0VSTl9ERUJVRyAidmZjJWQ6IFJlc2V0dGluZyB0aGUgaTJjIGJ1c1xuIiwKLQkJCSAgICAgIGRldi0+aW5zdGFuY2UpKTsKLQlpZihkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYoZGV2LT5yZWdzID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCVdSSVRFX1MxKFNFTkRfSTJDX1NUT1ApOwotCVdSSVRFX1MxKFNFTkRfSTJDX1NUT1AgfCBBQ0spOwotCXZmY19pMmNfZGVsYXkoZGV2KTsKLQlXUklURV9TMShDTEVBUl9JMkNfQlVTKTsKLQlWRkNfSTJDX0RFQlVHX1BSSU5USygoS0VSTl9ERUJVRyAidmZjJWQ6IEkyQyBzdGF0dXMgJXhcbiIsCi0JCQkgICAgICBkZXYtPmluc3RhbmNlLAotCQkJICAgICAgc2J1c19yZWFkbCgmZGV2LT5yZWdzLT5pMmNfczEpKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZjX2kyY193YWl0X2Zvcl9idXMoc3RydWN0IHZmY19kZXYgKmRldikKLXsKLQlpbnQgdGltZW91dCA9IDEwMDA7IAotCi0Jd2hpbGUoIShzYnVzX3JlYWRsKCZkZXYtPnJlZ3MtPmkyY19zMSkgJiBCQikpIHsKLQkJaWYoISh0aW1lb3V0LS0pKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCXZmY19pMmNfZGVsYXkoZGV2KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZjX2kyY193YWl0X2Zvcl9waW4oc3RydWN0IHZmY19kZXYgKmRldiwgaW50IGFjaykKLXsKLQlpbnQgdGltZW91dCA9IDEwMDA7IAotCWludCBzMTsKLQotCXdoaWxlICgoczEgPSBzYnVzX3JlYWRsKCZkZXYtPnJlZ3MtPmkyY19zMSkpICYgUElOKSB7Ci0JCWlmICghKHRpbWVvdXQtLSkpCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJdmZjX2kyY19kZWxheShkZXYpOwotCX0KLQlpZiAoYWNrID09IFZGQ19JMkNfQUNLX0NIRUNLKSB7Ci0JCWlmKHMxICYgTFJCKQotCQkJcmV0dXJuIC1FSU87IAotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBTSElGVChhKSAoKGEpIDw8IDI0KQotc3RhdGljIGludCB2ZmNfaTJjX3htaXRfYWRkcihzdHJ1Y3QgdmZjX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCi0JCQkgICAgIGNoYXIgbW9kZSkKLXsgCi0JaW50IHJldCwgcmFkZHI7Ci0jaWYgMQotCVdSSVRFX1MxKFNFTkRfSTJDX1NUT1AgfCBBQ0spOwotCVdSSVRFX1MxKFNFTEVDVChTMCkgfCBFTkFCTEVfU0VSSUFMKTsKLQl2ZmNfaTJjX2RlbGF5KGRldik7Ci0jZW5kaWYKLQotCXN3aXRjaChtb2RlKSB7Ci0JY2FzZSBWRkNfSTJDX1JFQUQ6Ci0JCXJhZGRyID0gU0hJRlQoKCh1bnNpZ25lZCBpbnQpYWRkciB8IDB4MSkpOwotCQlXUklURV9SRUcocmFkZHIpOwotCQlWRkNfSTJDX0RFQlVHX1BSSU5USygoInZmYyVkOiByZWNlaXZpbmcgZnJvbSBpMmMgYWRkciAweCV4XG4iLAotCQkJCSAgICAgIGRldi0+aW5zdGFuY2UsIGFkZHIgfCAweDEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkNfSTJDX1dSSVRFOgotCQlyYWRkciA9IFNISUZUKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4weDEpOwotCQlXUklURV9SRUcocmFkZHIpOwotCQlWRkNfSTJDX0RFQlVHX1BSSU5USygoInZmYyVkOiBzZW5kaW5nIHRvIGkyYyBhZGRyIDB4JXhcbiIsCi0JCQkJICAgICAgZGV2LT5pbnN0YW5jZSwgYWRkciAmIH4weDEpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLQotCVdSSVRFX1MxKFNFTkRfSTJDX1NUQVJUKTsKLQl2ZmNfaTJjX2RlbGF5KGRldik7Ci0JcmV0ID0gdmZjX2kyY193YWl0X2Zvcl9waW4oZGV2LFZGQ19JMkNfQUNLX0NIRUNLKTsgLyogV2Ugd2FpdAotCQkJCQkJCSAgICAgIGZvciB0aGUKLQkJCQkJCQkgICAgICBpMmMgc2VuZAotCQkJCQkJCSAgICAgIHRvIGZpbmlzaAotCQkJCQkJCSAgICAgIGhlcmUgYnV0Ci0JCQkJCQkJICAgICAgU3VuCi0JCQkJCQkJICAgICAgZG9lc24ndCwKLQkJCQkJCQkgICAgICBobW0gKi8KLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmZjJWQ6IFZGQyB4bWl0IGFkZHIgdGltZWQgb3V0IG9yIG5vIGFja1xuIiwKLQkJICAgICAgIGRldi0+aW5zdGFuY2UpOwotCQlyZXR1cm4gcmV0OwotCX0gZWxzZSBpZiAobW9kZSA9PSBWRkNfSTJDX1JFQUQpIHsKLQkJaWYgKChyZXQgPSBzYnVzX3JlYWRsKCZkZXYtPnJlZ3MtPmkyY19yZWcpICYgMHhmZjAwMDAwMCkgIT0gcmFkZHIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkgICAgICAgInZmYyVkOiByZXR1cm5lZCBzbGF2ZSBhZGRyZXNzICIKLQkJCSAgICAgICAibWlzbWF0Y2goJXgsJXgpXG4iLAotCQkJICAgICAgIGRldi0+aW5zdGFuY2UsIHJhZGRyLCByZXQpOwotCQl9Ci0JfQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmNfaTJjX3htaXRfYnl0ZShzdHJ1Y3QgdmZjX2RldiAqZGV2LHVuc2lnbmVkIGNoYXIgKmJ5dGUpCi17Ci0JaW50IHJldDsKLQl1MzIgdmFsID0gU0hJRlQoKHVuc2lnbmVkIGludCkqYnl0ZSk7Ci0KLQlXUklURV9SRUcodmFsKTsKLQotCXJldCA9IHZmY19pMmNfd2FpdF9mb3JfcGluKGRldiwgVkZDX0kyQ19BQ0tfQ0hFQ0spOyAKLQlzd2l0Y2gocmV0KSB7Ci0JY2FzZSAtRVRJTUVET1VUOiAKLQkJcHJpbnRrKEtFUk5fRVJSICJ2ZmMlZDogVkZDIHhtaXQgYnl0ZSB0aW1lZCBvdXQgb3Igbm8gYWNrXG4iLAotCQkgICAgICAgZGV2LT5pbnN0YW5jZSk7Ci0JCWJyZWFrOwotCWNhc2UgLUVJTzoKLQkJcmV0ID0gWE1JVF9MQVNUX0JZVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZmY19pMmNfcmVjdl9ieXRlKHN0cnVjdCB2ZmNfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJ5dGUsCi0JCQkgICAgIGludCBsYXN0KQotewotCWludCByZXQ7Ci0KLQlpZiAobGFzdCkgewotCQlXUklURV9SRUcoTkVHQVRJVkVfQUNLKTsKLQkJVkZDX0kyQ19ERUJVR19QUklOVEsoKCJ2ZmMlZDogc2VuZGluZyBuZWdhdGl2ZSBhY2tcbiIsCi0JCQkJICAgICAgZGV2LT5pbnN0YW5jZSkpOwotCX0gZWxzZSB7Ci0JCVdSSVRFX1MxKEFDSyk7Ci0JfQotCi0JcmV0ID0gdmZjX2kyY193YWl0X2Zvcl9waW4oZGV2LCBWRkNfSTJDX05PX0FDS19DSEVDSyk7Ci0JaWYocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmZjJWQ6ICIKLQkJICAgICAgICJWRkMgcmVjdiBieXRlIHRpbWVkIG91dFxuIiwKLQkJICAgICAgIGRldi0+aW5zdGFuY2UpOwotCX0KLQkqYnl0ZSA9IChzYnVzX3JlYWRsKCZkZXYtPnJlZ3MtPmkyY19yZWcpKSA+PiAyNDsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdmZjX2kyY19yZWN2YnVmKHN0cnVjdCB2ZmNfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkciwKLQkJICAgIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCWludCByZXQsIGxhc3Q7Ci0KLQlpZighKGNvdW50ICYmIGJ1ZiAmJiBkZXYgJiYgZGV2LT5yZWdzKSApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChyZXQgPSB2ZmNfaTJjX3dhaXRfZm9yX2J1cyhkZXYpKSkgewotCQlwcmludGsoS0VSTl9FUlIgInZmYyVkOiBWRkMgSTJDIGJ1cyBidXN5XG4iLCBkZXYtPmluc3RhbmNlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoKHJldCA9IHZmY19pMmNfeG1pdF9hZGRyKGRldiwgYWRkciwgVkZDX0kyQ19SRUFEKSkpIHsKLQkJV1JJVEVfUzEoU0VORF9JMkNfU1RPUCk7Ci0JCXZmY19pMmNfZGVsYXkoZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JbGFzdCA9IDA7Ci0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJaWYgKCFjb3VudCkKLQkJCWxhc3QgPSAxOwotCQlpZiAoKHJldCA9IHZmY19pMmNfcmVjdl9ieXRlKGRldiwgYnVmLCBsYXN0KSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidmZjJWQ6ICIKLQkJCSAgICAgICAiVkZDIGVycm9yIHdoaWxlIHJlY2VpdmluZyBieXRlXG4iLAotCQkJICAgICAgIGRldi0+aW5zdGFuY2UpOwotCQkJV1JJVEVfUzEoU0VORF9JMkNfU1RPUCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQl9Ci0JCWJ1ZisrOwotCX0KLQlXUklURV9TMShTRU5EX0kyQ19TVE9QIHwgQUNLKTsKLQl2ZmNfaTJjX2RlbGF5KGRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZmY19pMmNfc2VuZGJ1ZihzdHJ1Y3QgdmZjX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsIAotCQkgICAgY2hhciAqYnVmLCBpbnQgY291bnQpIAotewotCWludCByZXQ7Ci0JCi0JaWYgKCEoYnVmICYmIGRldiAmJiBkZXYtPnJlZ3MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkKLQlpZiAoKHJldCA9IHZmY19pMmNfd2FpdF9mb3JfYnVzKGRldikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidmZjJWQ6IFZGQyBJMkMgYnVzIGJ1c3lcbiIsIGRldi0+aW5zdGFuY2UpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlpZiAoKHJldCA9IHZmY19pMmNfeG1pdF9hZGRyKGRldiwgYWRkciwgVkZDX0kyQ19XUklURSkpKSB7Ci0JCVdSSVRFX1MxKFNFTkRfSTJDX1NUT1ApOwotCQl2ZmNfaTJjX2RlbGF5KGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXdoaWxlKGNvdW50LS0pIHsKLQkJcmV0ID0gdmZjX2kyY194bWl0X2J5dGUoZGV2LCBidWYpOwotCQlzd2l0Y2gocmV0KSB7Ci0JCWNhc2UgWE1JVF9MQVNUX0JZVEU6Ci0JCQlWRkNfSTJDX0RFQlVHX1BSSU5USygoInZmYyVkOiAiCi0JCQkJCSAgICAgICJSZWNlaXZlciBlbmRlZCB0cmFuc21pc3Npb24gd2l0aCAiCi0JCQkJCSAgICAgICIgJWQgYnl0ZXMgcmVtYWluaW5nXG4iLAotCQkJCQkgICAgICBkZXYtPmluc3RhbmNlLCBjb3VudCkpOwotCQkJcmV0ID0gMDsKLQkJCWdvdG8gZG9uZTsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAidmZjJWQ6ICIKLQkJCSAgICAgICAiVkZDIGVycm9yIHdoaWxlIHNlbmRpbmcgYnl0ZVxuIiwgZGV2LT5pbnN0YW5jZSk7Ci0JCQlicmVhazsKLQkJfTsKLQotCQlidWYrKzsKLQl9Ci1kb25lOgotCVdSSVRFX1MxKFNFTkRfSTJDX1NUT1AgfCBBQ0spOwotCXZmY19pMmNfZGVsYXkoZGV2KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5oIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2kyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmU2OTczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19pMmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX1ZGQ19JMkNfSF8KLSNkZWZpbmUgX0xJTlVYX1ZGQ19JMkNfSF8KLQotLyogY29udHJvbCBiaXRzICovCi0jZGVmaW5lIFBJTiAgKDB4ODAwMDAwMDApCi0jZGVmaW5lIEVTTyAgKDB4NDAwMDAwMDApCi0jZGVmaW5lIEVTMSAgKDB4MjAwMDAwMDApCi0jZGVmaW5lIEVTMiAgKDB4MTAwMDAwMDApCi0jZGVmaW5lIEVOSSAgKDB4MDgwMDAwMDApCi0jZGVmaW5lIFNUQSAgKDB4MDQwMDAwMDApCi0jZGVmaW5lIFNUTyAgKDB4MDIwMDAwMDApCi0jZGVmaW5lIEFDSyAgKDB4MDEwMDAwMDApCi0KLS8qIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lIFNUUyAgKDB4MjAwMDAwMDApCi0jZGVmaW5lIEJFUiAgKDB4MTAwMDAwMDApCi0jZGVmaW5lIExSQiAgKDB4MDgwMDAwMDApCi0jZGVmaW5lIEFBUyAgKDB4MDQwMDAwMDApCi0jZGVmaW5lIExBQiAgKDB4MDIwMDAwMDApCi0jZGVmaW5lIEJCICAgKDB4MDEwMDAwMDApCi0KLSNkZWZpbmUgU0VORF9JMkNfU1RBUlQgKFBJTiB8IEVTTyB8IFNUQSkKLSNkZWZpbmUgU0VORF9JMkNfU1RPUCAoUElOIHwgRVNPIHwgU1RPKQotI2RlZmluZSBDTEVBUl9JMkNfQlVTIChQSU4gfCBFU08gfCBBQ0spCi0jZGVmaW5lIE5FR0FUSVZFX0FDSyAoKEVTTykgJiB+QUNLKQotCi0jZGVmaW5lIFNFTEVDVChhKSAoYSkKLSNkZWZpbmUgUzAgKFBJTiB8IEVTTyB8IEVTMSkKLSNkZWZpbmUgUzBfT1dOIChQSU4pCi0jZGVmaW5lIFMyIChQSU4gfCBFUzEpCi0jZGVmaW5lIFMzIChQSU4gfCBFUzIpCi0KLSNkZWZpbmUgRU5BQkxFX1NFUklBTCAoUElOIHwgRVNPKQotI2RlZmluZSBESVNBQkxFX1NFUklBTCAoUElOKQotI2RlZmluZSBSRVNFVCAoUElOKQotCi0jZGVmaW5lIFhNSVRfTEFTVF9CWVRFICgxKQotI2RlZmluZSBWRkNfSTJDX0FDS19DSEVDSyAoMSkKLSNkZWZpbmUgVkZDX0kyQ19OT19BQ0tfQ0hFQ0sgKDApCi0KLSNlbmRpZiAvKiBfTElOVVhfVkZDX0kyQ19IXyAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2R2bWEuYyBiL2RyaXZlcnMvc2J1cy9kdm1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGQyZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zYnVzL2R2bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKiBkdm1hLmM6ICBSb3V0aW5lcyB0aGF0IGFyZSB1c2VkIHRvIGFjY2VzcyBETUEgb24gdGhlIFNwYXJjIFNCdXMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+Ci0KLXN0cnVjdCBzYnVzX2RtYSAqZG1hX2NoYWluOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9vbmVfZHZtYShzdHJ1Y3Qgc2J1c19kbWEgKmRtYSwgaW50IG51bV9kbWEpCi17Ci0JcHJpbnRrKCJkbWElZDogIiwgbnVtX2RtYSk7Ci0JCi0JZG1hLT5uZXh0ID0gTlVMTDsKLQlkbWEtPnJ1bm5pbmcgPSAwOyAgICAgIC8qIE5vIHRyYW5zZmVycyBnb2luZyBvbiBhcyBvZiB5ZXQgKi8KLQlkbWEtPmFsbG9jYXRlZCA9IDA7ICAgIC8qIE5vIG9uZSBoYXMgYWxsb2NhdGVkIHVzIHlldCAqLwotCXN3aXRjaChzYnVzX3JlYWRsKGRtYS0+cmVncyArIERNQV9DU1IpJkRNQV9ERVZJQ0VfSUQpIHsKLQljYXNlIERNQV9WRVJTMDoKLQkJZG1hLT5yZXZpc2lvbiA9IGR2bWFyZXYwOwotCQlwcmludGsoIlJldmlzaW9uIDAgIik7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX0VTQ1YxOgotCQlkbWEtPnJldmlzaW9uID0gZHZtYWVzYzE7Ci0JCXByaW50aygiRVNDIFJldmlzaW9uIDEgIik7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1ZFUlMxOgotCQlkbWEtPnJldmlzaW9uID0gZHZtYXJldjE7Ci0JCXByaW50aygiUmV2aXNpb24gMSAiKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfVkVSUzI6Ci0JCWRtYS0+cmV2aXNpb24gPSBkdm1hcmV2MjsKLQkJcHJpbnRrKCJSZXZpc2lvbiAyICIpOwotCQlicmVhazsKLQljYXNlIERNQV9WRVJITUU6Ci0JCWRtYS0+cmV2aXNpb24gPSBkdm1haG1lOwotCQlwcmludGsoIkhNRSBEVk1BIGdhdGUgYXJyYXkgIik7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1ZFUlNQTFVTOgotCQlkbWEtPnJldmlzaW9uID0gZHZtYXJldnBsdXM7Ci0JCXByaW50aygiUmV2aXNpb24gMSBQTFVTICIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoInVua25vd24gZG1hIHZlcnNpb24gJTA4eCIsCi0JCSAgICAgICBzYnVzX3JlYWRsKGRtYS0+cmVncyArIERNQV9DU1IpICYgRE1BX0RFVklDRV9JRCk7Ci0JCWRtYS0+YWxsb2NhdGVkID0gMTsKLQkJYnJlYWs7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotLyogUHJvYmUgdGhpcyBTQnVzIERNQSBtb2R1bGUocykgKi8KLXZvaWQgX19pbml0IGR2bWFfaW5pdChzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCi17Ci0Jc3RydWN0IHNidXNfZGV2ICp0aGlzX2RldjsKLQlzdHJ1Y3Qgc2J1c19kbWEgKmRtYTsKLQlzdHJ1Y3Qgc2J1c19kbWEgKmRjaGFpbjsKLQlzdGF0aWMgaW50IG51bV9kbWEgPSAwOwotCi0JZm9yX2VhY2hfc2J1c2Rldih0aGlzX2Rldiwgc2J1cykgewotCQljaGFyICpuYW1lID0gdGhpc19kZXYtPnByb21fbmFtZTsKLQkJaW50IGhtZSA9IDA7Ci0KLQkJaWYoIXN0cmNtcChuYW1lLCAiU1VOVyxmYXMiKSkKLQkJCWhtZSA9IDE7Ci0JCWVsc2UgaWYoc3RyY21wKG5hbWUsICJkbWEiKSAmJgotCQkJc3RyY21wKG5hbWUsICJsZWRtYSIpICYmCi0JCQlzdHJjbXAobmFtZSwgImVzcGRtYSIpKQotCQkJY29udGludWU7Ci0KLQkJLyogRm91bmQgb25lLi4uICovCi0JCWRtYSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYnVzX2RtYSksIEdGUF9BVE9NSUMpOwotCi0JCWRtYS0+c2RldiA9IHRoaXNfZGV2OwotCi0JCS8qIFB1dCBhdCBlbmQgb2YgZG1hIGNoYWluICovCi0JCWRjaGFpbiA9IGRtYV9jaGFpbjsKLQkJaWYoZGNoYWluKSB7Ci0JCQl3aGlsZShkY2hhaW4tPm5leHQpCi0JCQkJZGNoYWluID0gZGNoYWluLT5uZXh0OwotCQkJZGNoYWluLT5uZXh0ID0gZG1hOwotCQl9IGVsc2UgewotCQkJLyogV2UncmUgdGhlIGZpcnN0IGluIGxpbmUgKi8KLQkJCWRtYV9jaGFpbiA9IGRtYTsKLQkJfQotCi0JCWRtYS0+cmVncyA9IHNidXNfaW9yZW1hcCgmZG1hLT5zZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJIGRtYS0+c2Rldi0+cmVzb3VyY2VbMF0uZW5kIC0gZG1hLT5zZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEsCi0JCQkJCSAiZG1hIik7Ci0KLQkJZG1hLT5ub2RlID0gZG1hLT5zZGV2LT5wcm9tX25vZGU7Ci0JCQotCQlpbml0X29uZV9kdm1hKGRtYSwgbnVtX2RtYSsrKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1VONAotCi0jaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgotCi12b2lkIF9faW5pdCBzdW40X2R2bWFfaW5pdCh2b2lkKQotewotCXN0cnVjdCBzYnVzX2RtYSAqZG1hOwotCXN0cnVjdCByZXNvdXJjZSByOwotCi0JaWYoc3VuNF9kbWFfcGh5c2FkZHIpIHsKLQkJZG1hID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfZG1hKSwgR0ZQX0FUT01JQyk7Ci0KLQkJLyogTm8gU0JVUyAqLwotCQlkbWEtPnNkZXYgPSBOVUxMOwotCi0JCS8qIE9ubHkgb25lIERNQSBkZXZpY2UgKi8KLQkJZG1hX2NoYWluID0gZG1hOwotCi0JCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKLQkJci5zdGFydCA9IHN1bjRfZG1hX3BoeXNhZGRyOwotCQlkbWEtPnJlZ3MgPSBzYnVzX2lvcmVtYXAoJnIsIDAsIFBBR0VfU0laRSwgImRtYSIpOwotCi0JCS8qIE5vIHByb20gbm9kZSAqLwotCQlkbWEtPm5vZGUgPSAweDA7Ci0KLQkJaW5pdF9vbmVfZHZtYShkbWEsIDApOwotCX0gZWxzZSB7Ci0JICAJZG1hX2NoYWluID0gTlVMTDsKLQl9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL3NidXMuYyBiL2RyaXZlcnMvc2J1cy9zYnVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTI5MjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zYnVzL3NidXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiBzYnVzLmM6IFNCdXMgc3VwcG9ydCByb3V0aW5lcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2JwcC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotc3RhdGljIHNzaXplX3QKLXNob3dfc2J1c29icHBhdGhfYXR0cihzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCi17Ci0Jc3RydWN0IHNidXNfZGV2ICpzYnVzOwotCi0Jc2J1cyA9IHRvX3NidXNfZGV2aWNlKGRldik7Ci0KLQlyZXR1cm4gc25wcmludGYgKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIHNidXMtPm9mZGV2Lm5vZGUtPmZ1bGxfbmFtZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihvYnBwYXRoLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIHNob3dfc2J1c29icHBhdGhfYXR0ciwgTlVMTCk7Ci0KLXN0cnVjdCBzYnVzX2J1cyAqc2J1c19yb290OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZmlsbF9zYnVzX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCi17Ci0Jc3RydWN0IGRldl9hcmNoZGF0YSAqc2Q7Ci0JdW5zaWduZWQgbG9uZyBiYXNlOwotCWNvbnN0IHZvaWQgKnB2YWw7Ci0JaW50IGxlbiwgZXJyOwotCi0Jc2Rldi0+cHJvbV9ub2RlID0gZHAtPm5vZGU7Ci0Jc3RyY3B5KHNkZXYtPnByb21fbmFtZSwgZHAtPm5hbWUpOwotCi0JcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOwotCXNkZXYtPm51bV9yZWdpc3RlcnMgPSAwOwotCWlmIChwdmFsKSB7Ci0JCW1lbWNweShzZGV2LT5yZWdfYWRkcnMsIHB2YWwsIGxlbik7Ci0KLQkJc2Rldi0+bnVtX3JlZ2lzdGVycyA9Ci0JCQlsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKTsKLQotCQliYXNlID0gKHVuc2lnbmVkIGxvbmcpIHNkZXYtPnJlZ19hZGRyc1swXS5waHlzX2FkZHI7Ci0KLQkJLyogQ29tcHV0ZSB0aGUgc2xvdCBudW1iZXIuICovCi0JCWlmIChiYXNlID49IFNVTl9TQlVTX0JWQUREUiAmJiBzcGFyY19jcHVfbW9kZWwgPT0gc3VuNG0pCi0JCQlzZGV2LT5zbG90ID0gc2J1c19kZXZfc2xvdChiYXNlKTsKLQkJZWxzZQotCQkJc2Rldi0+c2xvdCA9IHNkZXYtPnJlZ19hZGRyc1swXS53aGljaF9pbzsKLQl9Ci0KLQlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7Ci0Jc2Rldi0+bnVtX2RldmljZV9yYW5nZXMgPSAwOwotCWlmIChwdmFsKSB7Ci0JCW1lbWNweShzZGV2LT5kZXZpY2VfcmFuZ2VzLCBwdmFsLCBsZW4pOwotCQlzZGV2LT5udW1fZGV2aWNlX3JhbmdlcyA9Ci0JCQlsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKTsKLQl9Ci0KLQlzYnVzX2ZpbGxfZGV2aWNlX2lycShzZGV2KTsKLQotCXNkID0gJnNkZXYtPm9mZGV2LmRldi5hcmNoZGF0YTsKLQlzZC0+cHJvbV9ub2RlID0gZHA7Ci0Jc2QtPm9wID0gJnNkZXYtPm9mZGV2OwotCi0Jc2Rldi0+b2ZkZXYubm9kZSA9IGRwOwotCWlmIChzZGV2LT5wYXJlbnQpCi0JCXNkZXYtPm9mZGV2LmRldi5wYXJlbnQgPSAmc2Rldi0+cGFyZW50LT5vZmRldi5kZXY7Ci0JZWxzZQotCQlzZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJnNkZXYtPmJ1cy0+b2ZkZXYuZGV2OwotCXNkZXYtPm9mZGV2LmRldi5idXMgPSAmc2J1c19idXNfdHlwZTsKLQlkZXZfc2V0X25hbWUoJnNkZXYtPm9mZGV2LmRldiwgInNidXNbJTA4eF0iLCBkcC0+bm9kZSk7Ci0KLQlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZzZGV2LT5vZmRldikgIT0gMCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgInNidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKLQotCS8qIFdFIEhBVkUgQkVFTiBJTlZBREVEIEJZIEFMSUVOUyEgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2Rldi0+b2ZkZXYuZGV2LmtvYmosICZkZXZfYXR0cl9vYnBwYXRoLmF0dHIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19idXNfcmFuZ2VzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IHNidXNfYnVzICpzYnVzKQotewotCWNvbnN0IHZvaWQgKnB2YWw7Ci0JaW50IGxlbjsKLQotCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyYW5nZXMiLCAmbGVuKTsKLQlzYnVzLT5udW1fc2J1c19yYW5nZXMgPSAwOwotCWlmIChwdmFsKSB7Ci0JCW1lbWNweShzYnVzLT5zYnVzX3JhbmdlcywgcHZhbCwgbGVuKTsKLQkJc2J1cy0+bnVtX3NidXNfcmFuZ2VzID0KLQkJCWxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpOwotCi0JCXNidXNfYXJjaF9idXNfcmFuZ2VzX2luaXQoZHAtPnBhcmVudCwgc2J1cyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgX19hcHBseV9yYW5nZXNfdG9fcmVncyhzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlcywKLQkJCQkJICBpbnQgbnVtX3JhbmdlcywKLQkJCQkJICBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsCi0JCQkJCSAgaW50IG51bV9yZWdzKQotewotCWlmIChudW1fcmFuZ2VzKSB7Ci0JCWludCByZWdudW07Ci0KLQkJZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBudW1fcmVnczsgcmVnbnVtKyspIHsKLQkJCWludCBybmdudW07Ci0KLQkJCWZvciAocm5nbnVtID0gMDsgcm5nbnVtIDwgbnVtX3Jhbmdlczsgcm5nbnVtKyspIHsKLQkJCQlpZiAocmVnc1tyZWdudW1dLndoaWNoX2lvID09IHJhbmdlc1tybmdudW1dLm90X2NoaWxkX3NwYWNlKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChybmdudW0gPT0gbnVtX3JhbmdlcykgewotCQkJCS8qIFdlIHVzZWQgdG8gZmxhZyB0aGlzIGFzIGFuIGVycm9yLiAgQWN0dWFsbHkKLQkJCQkgKiBzb21lIGRldmljZXMgZG8gbm90IHJlcG9ydCB0aGUgcmVncyBhcyB3ZSBleHBlY3QuCi0JCQkJICogRm9yIGV4YW1wbGUsIHNlZSBTVU5XLHBsbiBkZXZpY2UuICBJbiB0aGF0IGNhc2UKLQkJCQkgKiB0aGUgcmVnIHByb3BlcnR5IGlzIGluIGEgZm9ybWF0IGludGVybmFsIHRvIHRoYXQKLQkJCQkgKiBub2RlLCBpZS4gaXQgaXMgbm90IGluIHRoZSBTQlVTIHJlZ2lzdGVyIHNwYWNlCi0JCQkJICogcGVyIHNlLiAtRGF2ZU0KLQkJCQkgKi8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlyZWdzW3JlZ251bV0ud2hpY2hfaW8gPSByYW5nZXNbcm5nbnVtXS5vdF9wYXJlbnRfc3BhY2U7Ci0JCQlyZWdzW3JlZ251bV0ucGh5c19hZGRyIC09IHJhbmdlc1tybmdudW1dLm90X2NoaWxkX2Jhc2U7Ci0JCQlyZWdzW3JlZ251bV0ucGh5c19hZGRyICs9IHJhbmdlc1tybmdudW1dLm90X3BhcmVudF9iYXNlOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgX19maXh1cF9yZWdzX3NkZXYoc3RydWN0IHNidXNfZGV2ICpzZGV2KQotewotCWlmIChzZGV2LT5udW1fcmVnaXN0ZXJzICE9IDApIHsKLQkJc3RydWN0IHNidXNfZGV2ICpwYXJlbnQgPSBzZGV2LT5wYXJlbnQ7Ci0JCWludCBpOwotCi0JCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewotCQkJX19hcHBseV9yYW5nZXNfdG9fcmVncyhwYXJlbnQtPmRldmljZV9yYW5nZXMsCi0JCQkJCSAgICAgICBwYXJlbnQtPm51bV9kZXZpY2VfcmFuZ2VzLAotCQkJCQkgICAgICAgc2Rldi0+cmVnX2FkZHJzLAotCQkJCQkgICAgICAgc2Rldi0+bnVtX3JlZ2lzdGVycyk7Ci0KLQkJCXBhcmVudCA9IHBhcmVudC0+cGFyZW50OwotCQl9Ci0KLQkJX19hcHBseV9yYW5nZXNfdG9fcmVncyhzZGV2LT5idXMtPnNidXNfcmFuZ2VzLAotCQkJCSAgICAgICBzZGV2LT5idXMtPm51bV9zYnVzX3JhbmdlcywKLQkJCQkgICAgICAgc2Rldi0+cmVnX2FkZHJzLAotCQkJCSAgICAgICBzZGV2LT5udW1fcmVnaXN0ZXJzKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2Rldi0+bnVtX3JlZ2lzdGVyczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZzZGV2LT5yZXNvdXJjZVtpXTsKLQotCQkJcmVzLT5zdGFydCA9IHNkZXYtPnJlZ19hZGRyc1tpXS5waHlzX2FkZHI7Ci0JCQlyZXMtPmVuZCA9IChyZXMtPnN0YXJ0ICsKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpc2Rldi0+cmVnX2FkZHJzW2ldLnJlZ19zaXplIC0gMVVMKTsKLQkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPIHwKLQkJCQkoc2Rldi0+cmVnX2FkZHJzW2ldLndoaWNoX2lvICYgMHhmZik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2ZpeHVwX2FsbF9yZWdzKHN0cnVjdCBzYnVzX2RldiAqZmlyc3Rfc2RldikKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7Ci0KLQlmb3IgKHNkZXYgPSBmaXJzdF9zZGV2OyBzZGV2OyBzZGV2ID0gc2Rldi0+bmV4dCkgewotCQlpZiAoc2Rldi0+Y2hpbGQpCi0JCQlzYnVzX2ZpeHVwX2FsbF9yZWdzKHNkZXYtPmNoaWxkKTsKLQkJX19maXh1cF9yZWdzX3NkZXYoc2Rldik7Ci0JfQotfQotCi0vKiBXZSBwcmVzZXJ2ZSB0aGUgInByb2JlIG9yZGVyIiBvZiB0aGVzZSBidXMgYW5kIGRldmljZSBsaXN0cyB0byBnaXZlCi0gKiB0aGUgc2FtZSBvcmRlcmluZyBhcyB0aGUgb2xkIGNvZGUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2luc2VydChzdHJ1Y3Qgc2J1c19idXMgKnNidXMsIHN0cnVjdCBzYnVzX2J1cyAqKnJvb3QpCi17Ci0Jd2hpbGUgKCpyb290KQotCQlyb290ID0gJigqcm9vdCktPm5leHQ7Ci0JKnJvb3QgPSBzYnVzOwotCXNidXMtPm5leHQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2Rldl9pbnNlcnQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBzdHJ1Y3Qgc2J1c19kZXYgKipyb290KQotewotCXdoaWxlICgqcm9vdCkKLQkJcm9vdCA9ICYoKnJvb3QpLT5uZXh0OwotCSpyb290ID0gc2RldjsKLQlzZGV2LT5uZXh0ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHdhbGtfY2hpbGRyZW4oc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IHNidXNfZGV2ICpwYXJlbnQsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKLXsKLQlkcCA9IGRwLT5jaGlsZDsKLQl3aGlsZSAoZHApIHsKLQkJc3RydWN0IHNidXNfZGV2ICpzZGV2OwotCi0JCXNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2J1c19kZXYpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNkZXYpIHsKLQkJCXNkZXZfaW5zZXJ0KHNkZXYsICZwYXJlbnQtPmNoaWxkKTsKLQotCQkJc2Rldi0+YnVzID0gc2J1czsKLQkJCXNkZXYtPnBhcmVudCA9IHBhcmVudDsKLQkJCXNkZXYtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdSA9Ci0JCQkJc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwotCQkJc2Rldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLnN0YyA9Ci0JCQkJc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLnN0YzsKLQotCQkJZmlsbF9zYnVzX2RldmljZShkcCwgc2Rldik7Ci0KLQkJCXdhbGtfY2hpbGRyZW4oZHAsIHNkZXYsIHNidXMpOwotCQl9Ci0JCWRwID0gZHAtPnNpYmxpbmc7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfb25lX3NidXMoc3RydWN0IGRldmljZV9ub2RlICpkcCwgaW50IG51bV9zYnVzKQotewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQl1bnNpZ25lZCBpbnQgc2J1c19jbG9jazsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9kcDsKLQotCXNidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2J1c19idXMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNidXMpCi0JCXJldHVybjsKLQotCXNidXNfaW5zZXJ0KHNidXMsICZzYnVzX3Jvb3QpOwotCXNidXMtPnByb21fbm9kZSA9IGRwLT5ub2RlOwotCi0Jc2J1c19zZXR1cF9pb21tdShzYnVzLCBkcCk7Ci0KLQlwcmludGsoInNidXMlZDogIiwgbnVtX3NidXMpOwotCi0Jc2J1c19jbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImNsb2NrLWZyZXF1ZW5jeSIsCi0JCQkJCSAgICgyNSoxMDAwKjEwMDApKTsKLQlzYnVzLT5jbG9ja19mcmVxID0gc2J1c19jbG9jazsKLQotCXByaW50aygiQ2xvY2sgJWQuJWQgTUh6XG4iLCAoaW50KSAoKHNidXNfY2xvY2svMTAwMCkvMTAwMCksCi0JICAgICAgIChpbnQpICgoKHNidXNfY2xvY2svMTAwMCklMTAwMCAhPSAwKSA/IAotCQkgICAgICAoKChzYnVzX2Nsb2NrLzEwMDApJTEwMDApICsgMTAwMCkgOiAwKSk7Ci0KLQlzdHJjcHkoc2J1cy0+cHJvbV9uYW1lLCBkcC0+bmFtZSk7Ci0KLQlzYnVzX3NldHVwX2FyY2hfcHJvcHMoc2J1cywgZHApOwotCi0Jc2J1c19idXNfcmFuZ2VzX2luaXQoZHAsIHNidXMpOwotCi0Jc2J1cy0+b2ZkZXYubm9kZSA9IGRwOwotCXNidXMtPm9mZGV2LmRldi5wYXJlbnQgPSBOVUxMOwotCXNidXMtPm9mZGV2LmRldi5idXMgPSAmc2J1c19idXNfdHlwZTsKLQlkZXZfc2V0X25hbWUoJnNidXMtPm9mZGV2LmRldiwgInNidXMlZCIsIG51bV9zYnVzKTsKLQotCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJnNidXMtPm9mZGV2KSAhPSAwKQotCQlwcmludGsoS0VSTl9ERUJVRyAic2J1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkgICAgICAgZGV2X25hbWUoJnNidXMtPm9mZGV2LmRldikpOwotCi0JZGV2X2RwID0gZHAtPmNoaWxkOwotCXdoaWxlIChkZXZfZHApIHsKLQkJc3RydWN0IHNidXNfZGV2ICpzZGV2OwotCi0JCXNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2J1c19kZXYpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNkZXYpIHsKLQkJCXNkZXZfaW5zZXJ0KHNkZXYsICZzYnVzLT5kZXZpY2VzKTsKLQotCQkJc2Rldi0+YnVzID0gc2J1czsKLQkJCXNkZXYtPnBhcmVudCA9IE5VTEw7Ci0JCQlzZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXUgPQotCQkJCXNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKLQkJCXNkZXYtPm9mZGV2LmRldi5hcmNoZGF0YS5zdGMgPQotCQkJCXNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5zdGM7Ci0KLQkJCWZpbGxfc2J1c19kZXZpY2UoZGV2X2RwLCBzZGV2KTsKLQotCQkJd2Fsa19jaGlsZHJlbihkZXZfZHAsIHNkZXYsIHNidXMpOwotCQl9Ci0JCWRldl9kcCA9IGRldl9kcC0+c2libGluZzsKLQl9Ci0KLQlzYnVzX2ZpeHVwX2FsbF9yZWdzKHNidXMtPmRldmljZXMpOwotCi0JZHZtYV9pbml0KHNidXMpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzYnVzX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCWNvbnN0IGNoYXIgKnNidXNfbmFtZSA9ICJzYnVzIjsKLQlpbnQgbnVtX3NidXMgPSAwOwotCi0JaWYgKHNidXNfYXJjaF9wcmVpbml0KCkpCi0JCXJldHVybiAwOwotCi0JaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkKLQkJc2J1c19uYW1lID0gInNiaSI7Ci0KLQlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsIHNidXNfbmFtZSkgewotCQlidWlsZF9vbmVfc2J1cyhkcCwgbnVtX3NidXMpOwotCQludW1fc2J1cysrOwotCi0JfQotCi0Jc2J1c19hcmNoX3Bvc3Rpbml0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKHNidXNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IGM3ZjA2MjkuLjQwM2VjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC02Myw3ICs2Myw3IEBACiBjb25maWcgQkxLX0RFVl9TRAogCXRyaXN0YXRlICJTQ1NJIGRpc2sgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNDU0kKLQlzZWxlY3QgQ1JDX1QxMERJRgorCXNlbGVjdCBDUkNfVDEwRElGIGlmIEJMS19ERVZfSU5URUdSSVRZCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHdhbnQgdG8gdXNlIFNDU0kgaGFyZCBkaXNrcywgRmlicmUgQ2hhbm5lbCBkaXNrcywKIAkgIFNlcmlhbCBBVEEgKFNBVEEpIG9yIFBhcmFsbGVsIEFUQSAoUEFUQSkgaGFyZCBkaXNrcywKQEAgLTEzMjUsMTQgKzEzMjUsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcWxvZ2ljZmFzLgogCi1jb25maWcgU0NTSV9RTE9HSUNfRkNfRklSTVdBUkUKLQlib29sICJJbmNsdWRlIGxvYWRhYmxlIGZpcm13YXJlIGluIGRyaXZlciIKLQlkZXBlbmRzIG9uIFNDU0lfUUxPR0lDX0ZDCi0gIAloZWxwCi0JICBTYXkgWSB0byBpbmNsdWRlIElTUDJYMDAgRmFicmljIEluaXRpYXRvci9UYXJnZXQgRmlybXdhcmUsIHdpdGgKLQkgIGV4cGFuZGVkIExVTiBhZGRyZXNzaW5nIGFuZCBGY1RhcGUgKEZDUC0yKSBzdXBwb3J0LCBpbiB0aGUKLQkgIHFsb2dpY2ZjIGRyaXZlci4gVGhpcyBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3Jtcy4KLQogY29uZmlnIFNDU0lfUUxPR0lDXzEyODAKIAl0cmlzdGF0ZSAiUWxvZ2ljIFFMQSAxMjQwLzF4ODAvMXgxNjAgU0NTSSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKQEAgLTE2NDgsNiArMTY0MCw3IEBACiAJdHJpc3RhdGUgIkF0YXJpIG5hdGl2ZSBTQ1NJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEFSSSAmJiBTQ1NJCiAJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCisJc2VsZWN0IE5WUkFNCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYW4gQXRhcmkgd2l0aCBidWlsdC1pbiBOQ1I1MzgwIFNDU0kgY29udHJvbGxlciAoVFQsCiAJICBGYWxjb24sIC4uLikgc2F5IFkgdG8gZ2V0IGl0IHN1cHBvcnRlZC4gT2YgY291cnNlIGFsc28sIGlmIHlvdSBoYXZlCkBAIC0xNjc4LDE0ICsxNjcxLDYgQEAKIAkgIGJvb3QgcHJvY2VzcyBmcmFjdGlvbmFsbHkgbG9uZ2VyIGJ1dCBtYXkgYXNzaXN0IHJlY292ZXJ5IGZyb20gZXJyb3JzCiAJICB0aGF0IGxlYXZlIHRoZSBkZXZpY2VzIHdpdGggU0NTSSBvcGVyYXRpb25zIHBhcnR3YXkgY29tcGxldGVkLgogCi1jb25maWcgVFRfRE1BX0VNVUwKLQlib29sICJIYWRlcyBTQ1NJIERNQSBlbXVsYXRvciIKLQlkZXBlbmRzIG9uIEFUQVJJX1NDU0kgJiYgSEFERVMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIGNvZGUgd2hpY2ggZW11bGF0ZXMgdGhlIFRUIFNDU0kgRE1BIGNoaXAgb24gdGhlCi0JICBIYWRlcy4gVGhpcyBpbmNyZWFzZXMgdGhlIFNDU0kgdHJhbnNmZXIgcmF0ZXMgYXQgbGVhc3QgdGVuIHRpbWVzCi0JICBjb21wYXJlZCB0byBQSU8gdHJhbnNmZXJzLgotCiBjb25maWcgTUFDX1NDU0kKIAlib29sICJNYWNpbnRvc2ggTkNSNTM4MCBTQ1NJIgogCWRlcGVuZHMgb24gTUFDICYmIFNDU0k9eQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwppbmRleCBhYTRlNzdjLi44YWJmZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwpAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAlzcmJjbWQtPmlkICAgICAgID0gY3B1X3RvX2xlMzIoc2NtZF9pZChjbWQpKTsKIAlzcmJjbWQtPmx1biAgICAgID0gY3B1X3RvX2xlMzIoY21kLT5kZXZpY2UtPmx1bik7CiAJc3JiY21kLT5mbGFncyAgICA9IGNwdV90b19sZTMyKGZsYWcpOwotCXRpbWVvdXQgPSBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQvSFo7CisJdGltZW91dCA9IGNtZC0+cmVxdWVzdC0+dGltZW91dC9IWjsKIAlpZiAodGltZW91dCA9PSAwKQogCQl0aW1lb3V0ID0gMTsKIAlzcmJjbWQtPnRpbWVvdXQgID0gY3B1X3RvX2xlMzIodGltZW91dCk7ICAvLyB0aW1lb3V0IGluIHNlY29uZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hdGFyaV9kbWFfZW11bC5jIGIvZHJpdmVycy9zY3NpL2F0YXJpX2RtYV9lbXVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzcxMGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2F0YXJpX2RtYV9lbXVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoKLSAqIGF0YXJpX2RtYV9lbXVsLmMgLS0gVFQgU0NTSSBETUEgZW11bGF0b3IgZm9yIHRoZSBIYWRlcy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5NyBXb3V0IEtsYXJlbiA8Vy5LbGFyZW5AaW50ZXIubmwubmV0PgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGNvZGUgd2FzIHdyaXR0ZW4gdXNpbmcgdGhlIEhhZGVzIFRPUyBzb3VyY2UgY29kZSBhcyBhCi0gKiByZWZlcmVuY2UuIFRoaXMgc291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIG9uIHRoZSBob21lIHBhZ2UKLSAqIG9mIE1lZHVzYSBDb21wdXRlciBTeXN0ZW1zLgotICoKLSAqIFZlcnNpb24gMC4xLCAxOTk3LTA5LTI0LgotICogCi0gKiBUaGlzIGNvZGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBJdCBoYXMgb25seSBiZWVuCi0gKiB0ZXN0ZWQgb24gYSBIYWRlcyB3aXRoIGEgNjgwNjAuIEl0IG1pZ2h0IG5vdCB3b3JrIG9uIGEgSGFkZXMKLSAqIHdpdGggYSA2ODA0MC4gTWFrZSBiYWNrdXBzIG9mIHlvdXIgaGFyZCBkcml2ZXMgYmVmb3JlIHVzaW5nCi0gKiB0aGlzIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2RlZmluZSBoYWRlc19kbWFfY3RybAkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzE3KQotI2RlZmluZSBoYWRlc19wc2RtX3JlZwkJKCoodW5zaWduZWQgY2hhciAqKSAweGZmZmY4NzQxKQotCi0jZGVmaW5lIFRSQU5TRkVSX1NJWkUJCTE2Ci0KLXN0cnVjdCBtNjgwNDBfZnJhbWUgewotCXVuc2lnbmVkIGxvbmcgIGVmZmFkZHI7ICAvKiBlZmZlY3RpdmUgYWRkcmVzcyAqLwotCXVuc2lnbmVkIHNob3J0IHNzdzsgICAgICAvKiBzcGVjaWFsIHN0YXR1cyB3b3JkICovCi0JdW5zaWduZWQgc2hvcnQgd2IzczsgICAgIC8qIHdyaXRlIGJhY2sgMyBzdGF0dXMgKi8KLQl1bnNpZ25lZCBzaG9ydCB3YjJzOyAgICAgLyogd3JpdGUgYmFjayAyIHN0YXR1cyAqLwotCXVuc2lnbmVkIHNob3J0IHdiMXM7ICAgICAvKiB3cml0ZSBiYWNrIDEgc3RhdHVzICovCi0JdW5zaWduZWQgbG9uZyAgZmFkZHI7ICAgIC8qIGZhdWx0IGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICB3YjNhOyAgICAgLyogd3JpdGUgYmFjayAzIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICB3YjNkOyAgICAgLyogd3JpdGUgYmFjayAzIGRhdGEgKi8KLQl1bnNpZ25lZCBsb25nICB3YjJhOyAgICAgLyogd3JpdGUgYmFjayAyIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICB3YjJkOyAgICAgLyogd3JpdGUgYmFjayAyIGRhdGEgKi8KLQl1bnNpZ25lZCBsb25nICB3YjFhOyAgICAgLyogd3JpdGUgYmFjayAxIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICB3YjFkcGQwOyAgLyogd3JpdGUgYmFjayAxIGRhdGEvcHVzaCBkYXRhIDAqLwotCXVuc2lnbmVkIGxvbmcgIHBkMTsgICAgICAvKiBwdXNoIGRhdGEgMSovCi0JdW5zaWduZWQgbG9uZyAgcGQyOyAgICAgIC8qIHB1c2ggZGF0YSAyKi8KLQl1bnNpZ25lZCBsb25nICBwZDM7ICAgICAgLyogcHVzaCBkYXRhIDMqLwotfTsKLQotc3RhdGljIHZvaWQgd3JpdGViYWNrICh1bnNpZ25lZCBzaG9ydCB3YnMsIHVuc2lnbmVkIGxvbmcgd2JhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyB3YmQsIHZvaWQgKm9sZF9idXNlcnIpCi17Ci0JbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7Ci0Jc3RhdGljIHZvaWQgKnNhdmVfYnVzZXJyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgotCQkJICAgICAgIm1vdmUubAklMCw4KCUlYTApXG5cdCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogInIiICgmJmJ1c19lcnJvcikKLQkJCSAgICAgIDogImEwIiApOwotCi0Jc2F2ZV9idXNlcnIgPSBvbGRfYnVzZXJyOwotCi0Jc2V0X2ZzIChNQUtFX01NX1NFRyh3YnMgJiBXQlRNXzA0MCkpOwotCi0Jc3dpdGNoICh3YnMgJiBXQlNJWl8wNDApIHsKLQkgICAgY2FzZSBCQV9TSVpFX0JZVEU6Ci0JCXB1dF91c2VyICh3YmQgJiAweGZmLCAoY2hhciAqKXdiYSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIEJBX1NJWkVfV09SRDoKLQkJcHV0X3VzZXIgKHdiZCAmIDB4ZmZmZiwgKHNob3J0ICopd2JhKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQkFfU0laRV9MT05HOgotCQlwdXRfdXNlciAod2JkLCAoaW50ICopd2JhKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc2V0X2ZzIChmcyk7Ci0JcmV0dXJuOwotCi1idXNfZXJyb3I6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbXAubAklMCwyKCUlc3ApXG5cdCIKLQkJCSAgICAgICJiY3MucwkuanVtcF9vbGRcblx0IgotCQkJICAgICAgImNtcC5sCSUxLDIoJSVzcClcblx0IgotCQkJICAgICAgImJscy5zCS5yZXN0b3JlX29sZFxuIgotCQkJIi5qdW1wX29sZDpcblx0IgotCQkJICAgICAgIm1vdmUubAklMiwtKCUlc3ApXG5cdCIKLQkJCSAgICAgICJydHNcbiIKLQkJCSIucmVzdG9yZV9vbGQ6XG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJSVhMCwtKCUlc3ApXG5cdCIKLQkJCSAgICAgICJtb3ZlYy5sCSUldmJyLCUlYTBcblx0IgotCQkJICAgICAgIm1vdmUubAklMiw4KCUlYTApXG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJKCUlc3ApKywlJWEwXG5cdCIKLQkJCSAgICAgICJydGVcblx0IgotCQkJICAgICAgOgotCQkJICAgICAgOiAiaSIgKHdyaXRlYmFjayksICJpIiAoJiZidXNfZXJyb3IpLAotCQkJICAgICAgICAibSIgKHNhdmVfYnVzZXJyKSApOwotfQotCi0vKgotICogc3RhdGljIGlubGluZSB2b2lkIHNldF9yZXN0ZGF0YV9yZWcodW5zaWduZWQgY2hhciAqY3VyX2FkZHIpCi0gKgotICogU2V0IHRoZSByZXN0IGRhdGEgcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmVzdGRhdGFfcmVnKHVuc2lnbmVkIGNoYXIgKmN1cl9hZGRyKQotewotCWlmICgoKGxvbmcpIGN1cl9hZGRyICYgfjMpICE9IDApCi0JCXR0X3Njc2lfZG1hLmRtYV9yZXN0ZGF0YSA9Ci0JCQkqKCh1bnNpZ25lZCBsb25nICopICgobG9uZykgY3VyX2FkZHIgJiB+MykpOwotfQotCi0vKgotICogdm9pZCBoYWRlc19kbWFfZW11bGF0b3IoaW50IGlycSwgdm9pZCAqZHVtbXkpCi0gKiAKLSAqIFRoaXMgY29kZSBlbXVsYXRlcyBUVCBTQ1NJIERNQSBvbiB0aGUgSGFkZXMuCi0gKiAKLSAqIE5vdGUgdGhlIGZvbGxvd2luZzoKLSAqIAotICogMS4gV2hlbiB0aGVyZSBpcyBubyBieXRlIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIFNDU0kgYnVzLCBvcgotICogICAgd2hlbiBhIGJ5dGUgY2Fubm90IHlldCBiZXQgd3JpdHRlbiB0byB0aGUgU0NTSSBidXMsIGEgYnVzCi0gKiAgICBlcnJvciBvY2N1cnMgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIHBzZXVkbyBETUEgZGF0YQotICogICAgcmVnaXN0ZXIgKGhhZGVzX3BzZG1fcmVnKS4gV2UgaGF2ZSB0byBjYXRjaCB0aGlzIGJ1cyBlcnJvcgotICogICAgYW5kIHRyeSBhZ2FpbiB0byByZWFkIG9yIHdyaXRlIHRoZSBieXRlLiBJZiBhZnRlciBzZXZlcmFsIHRyaWVzCi0gKiAgICB3ZSBzdGlsbCBnZXQgYSBidXMgZXJyb3IsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBsZWZ0LiBXaGVuCi0gKiAgICB0aGUgYnl0ZSBjYW4gYmUgcmVhZCBvciB3cml0dGVuLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMKLSAqICAgIGNhbGxlZCBhZ2Fpbi4KLSAqIAotICogMi4gVGhlIFNDU0kgaW50ZXJydXB0IG11c3QgYmUgZGlzYWJsZWQgaW4gdGhpcyBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqIAotICogMy4gSWYgd2Ugc2V0IHRoZSBFT1Agc2lnbmFsLCB0aGUgU0NTSSBjb250cm9sbGVyIHN0aWxsIGV4cGVjdHMgb25lCi0gKiAgICBieXRlIHRvIGJlIHJlYWQgb3Igd3JpdHRlbi4gVGhlcmVmb3JlIHRoZSBsYXN0IGJ5dGUgaXMgdHJhbnNmZXJyZWQKLSAqICAgIHNlcGFyYXRlbHksIGFmdGVyIHNldHRpbmcgdGhlIEVPUCBzaWduYWwuCi0gKiAKLSAqIDQuIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBsZWZ0LCB0aGUgYWRkcmVzcyBwb2ludGVyIChzdGFydF9hZGRyKSBpcwotICogICAgY29udmVydGVkIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4gQmVjYXVzZSBpdCBwb2ludHMgb25lIGJ5dGUKLSAqICAgIGZ1cnRoZXIgdGhhbiB0aGUgbGFzdCB0cmFuc2ZlcnJlZCBieXRlLCBpdCBjYW4gcG9pbnQgb3V0c2lkZSB0aGUKLSAqICAgIGN1cnJlbnQgcGFnZS4gSWYgdmlydF90b19waHlzKCkgaXMgY2FsbGVkIHdpdGggdGhpcyBhZGRyZXNzIHdlCi0gKiAgICBtaWdodCBnZXQgYW4gYWNjZXNzIGVycm9yLiBUaGVyZWZvcmUgdmlydF90b19waHlzKCkgaXMgY2FsbGVkIHdpdGgKLSAqICAgIHN0YXJ0X2FkZHIgLSAxIGlmIHRoZSBjb3VudCBoYXMgcmVhY2hlZCB6ZXJvLiBUaGUgcmVzdWx0IGlzCi0gKiAgICBpbmNyZWFzZWQgd2l0aCBvbmUuCi0gKi8KLQotc3RhdGljIGlycXJldHVybl90IGhhZGVzX2RtYV9lbXVsYXRvcihpbnQgaXJxLCB2b2lkICpkdW1teSkKLXsKLQl1bnNpZ25lZCBsb25nIGRtYV9iYXNlOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZG1hX2NudCBhc20gKCJkMyIpOwotCXN0YXRpYyBsb25nIHNhdmVfYnVzZXJyOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc2F2ZV9zcCBhc20gKCJkNCIpOwotCXJlZ2lzdGVyIGludCB0cmllcyBhc20gKCJkNSIpOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnN0YXJ0X2FkZHIgYXNtICgiYTMiKSwgKmVuZF9hZGRyIGFzbSAoImE0Iik7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZWZmX2FkZHI7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcHNkbV9yZWc7Ci0JdW5zaWduZWQgbG9uZyByZW07Ci0KLQlhdGFyaV9kaXNhYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOwotCi0JLyoKLQkgKiBSZWFkIHRoZSBkbWEgYWRkcmVzcyBhbmQgY291bnQgcmVnaXN0ZXJzLgotCSAqLwotCi0JZG1hX2Jhc2UgPSBTQ1NJX0RNQV9SRUFEX1AoZG1hX2FkZHIpOwotCWRtYV9jbnQgPSBTQ1NJX0RNQV9SRUFEX1AoZG1hX2NudCk7Ci0KLQkvKgotCSAqIENoZWNrIGlmIERNQSBpcyBzdGlsbCBlbmFibGVkLgotCSAqLwotCi0JaWYgKCh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDIpID09IDApCi0JewotCQlhdGFyaV9lbmFibGVfaXJxKElSUV9UVF9NRlBfU0NTSSk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoZG1hX2NudCA9PSAwKQotCXsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJETUEgZW11bGF0aW9uOiBjb3VudCBpcyB6ZXJvLlxuIik7Ci0JCXR0X3Njc2lfZG1hLmRtYV9jdHJsICY9IDB4ZmQ7CS8qIERNQSByZWFkeS4gKi8KLQkJYXRhcmlfZW5hYmxlX2lycShJUlFfVFRfTUZQX1NDU0kpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JLyoKLQkgKiBJbnN0YWxsIG5ldyBidXMgZXJyb3Igcm91dGluZS4KLQkgKi8KLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWMubAklJXZiciwlJWEwXG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJOCglJWEwKSwlMFxuXHQiCi0JCQkgICAgICAibW92ZS5sCSUxLDgoJSVhMClcblx0IgotCQkJICAgICAgOiAiPSZyIiAoc2F2ZV9idXNlcnIpCi0JCQkgICAgICA6ICJyIiAoJiZzY3NpX2J1c19lcnJvcikKLQkJCSAgICAgIDogImEwIiApOwotCi0JaGFkZXNfZG1hX2N0cmwgJj0gMHhmYzsJCS8qIEJ1cyBlcnJvciBhbmQgRU9QIG9mZi4gKi8KLQotCS8qCi0JICogU2F2ZSB0aGUgc3RhY2sgcG9pbnRlci4KLQkgKi8KLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZS5sCSUlc3AsJTBcblx0IgotCQkJICAgICAgOiAiPSZyIiAoc2F2ZV9zcCkgKTsKLQotCXRyaWVzID0gMTAwOwkJCS8qIE1heGltdW0gbnVtYmVyIG9mIGJ1cyBlcnJvcnMuICovCi0Jc3RhcnRfYWRkciA9IHBoeXNfdG9fdmlydChkbWFfYmFzZSk7Ci0JZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgZG1hX2NudDsKLQotc2NzaV9sb29wOgotCWRtYV9jbnQtLTsKLQlyZW0gPSBkbWFfY250ICYgKFRSQU5TRkVSX1NJWkUgLSAxKTsKLQlkbWFfY250ICY9IH4oVFJBTlNGRVJfU0laRSAtIDEpOwotCXBzZG1fcmVnID0gJmhhZGVzX3BzZG1fcmVnOwotCi0JaWYgKHR0X3Njc2lfZG1hLmRtYV9jdHJsICYgMSkJLyogUmVhZCBvciB3cml0ZT8gKi8KLQl7Ci0JCS8qCi0JCSAqIFNDU0kgd3JpdGUuIEFib3J0IHdoZW4gY291bnQgaXMgemVyby4KLQkJICovCi0KLQkJc3dpdGNoIChyZW0pCi0JCXsKLQkJY2FzZSAwOgotCQkJd2hpbGUgKGRtYV9jbnQgPiAwKQotCQkJewotCQkJCWRtYV9jbnQgLT0gVFJBTlNGRVJfU0laRTsKLQotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMTU6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAxNDoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDEzOgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMTI6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAxMToKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDEwOgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgOToKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDg6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSA3OgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgNjoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDU6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSA0OgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCWNhc2UgMzoKLQkJCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwotCQljYXNlIDI6Ci0JCQkJKnBzZG1fcmVnID0gKnN0YXJ0X2FkZHIrKzsKLQkJY2FzZSAxOgotCQkJCSpwc2RtX3JlZyA9ICpzdGFydF9hZGRyKys7Ci0JCQl9Ci0JCX0KLQotCQloYWRlc19kbWFfY3RybCB8PSAxOwkvKiBTZXQgRU9QLiAqLwotCQl1ZGVsYXkoMTApOwotCQkqcHNkbV9yZWcgPSAqc3RhcnRfYWRkcisrOwkvKiBEdW1teSBieXRlLiAqLwotCQl0dF9zY3NpX2RtYS5kbWFfY3RybCAmPSAweGZkOwkvKiBETUEgcmVhZHkuICovCi0JfQotCWVsc2UKLQl7Ci0JCS8qCi0JCSAqIFNDU0kgcmVhZC4gQWJvcnQgd2hlbiBjb3VudCBpcyB6ZXJvLgotCQkgKi8KLQotCQlzd2l0Y2ggKHJlbSkKLQkJewotCQljYXNlIDA6Ci0JCQl3aGlsZSAoZG1hX2NudCA+IDApCi0JCQl7Ci0JCQkJZG1hX2NudCAtPSBUUkFOU0ZFUl9TSVpFOwotCi0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAxNToKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDE0OgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMTM6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAxMjoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDExOgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMTA6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSA5OgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgODoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDc6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSA2OgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgNToKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDQ6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJY2FzZSAzOgotCQkJCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCWNhc2UgMjoKLQkJCQkqc3RhcnRfYWRkcisrID0gKnBzZG1fcmVnOwotCQljYXNlIDE6Ci0JCQkJKnN0YXJ0X2FkZHIrKyA9ICpwc2RtX3JlZzsKLQkJCX0KLQkJfQotCi0JCWhhZGVzX2RtYV9jdHJsIHw9IDE7CS8qIFNldCBFT1AuICovCi0JCXVkZWxheSgxMCk7Ci0JCSpzdGFydF9hZGRyKysgPSAqcHNkbV9yZWc7Ci0JCXR0X3Njc2lfZG1hLmRtYV9jdHJsICY9IDB4ZmQ7CS8qIERNQSByZWFkeS4gKi8KLQotCQlzZXRfcmVzdGRhdGFfcmVnKHN0YXJ0X2FkZHIpOwotCX0KLQotCWlmIChzdGFydF9hZGRyICE9IGVuZF9hZGRyKQotCQlwcmludGsoS0VSTl9DUklUICJETUEgZW11bGF0aW9uOiBGQVRBTDogQ291bnQgaXMgbm90IHplcm8gYXQgZW5kIG9mIHRyYW5zZmVyLlxuIik7Ci0KLQlkbWFfY250ID0gZW5kX2FkZHIgLSBzdGFydF9hZGRyOwotCi1zY3NpX2VuZDoKLQlkbWFfYmFzZSA9IChkbWFfY250ID09IDApID8gdmlydF90b19waHlzKHN0YXJ0X2FkZHIgLSAxKSArIDEgOiAgCi0JCQkJICAgIHZpcnRfdG9fcGh5cyhzdGFydF9hZGRyKTsKLQotCVNDU0lfRE1BX1dSSVRFX1AoZG1hX2FkZHIsIGRtYV9iYXNlKTsKLQlTQ1NJX0RNQV9XUklURV9QKGRtYV9jbnQsIGRtYV9jbnQpOwotCi0JLyoKLQkgKiBSZXN0b3JlIG9sZCBidXMgZXJyb3Igcm91dGluZS4KLQkgKi8KLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWMubAklJXZiciwlJWEwXG5cdCIKLQkJCSAgICAgICJtb3ZlLmwJJTAsOCglJWEwKVxuXHQiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJyIiAoc2F2ZV9idXNlcnIpCi0JCQkgICAgICA6ICJhMCIgKTsKLQotCWF0YXJpX2VuYWJsZV9pcnEoSVJRX1RUX01GUF9TQ1NJKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLQotc2NzaV9idXNfZXJyb3I6Ci0JLyoKLQkgKiBGaXJzdCBjaGVjayBpZiB0aGUgYnVzIGVycm9yIGlzIGNhdXNlZCBieSBvdXIgY29kZS4KLQkgKiBJZiBub3QsIGNhbGwgdGhlIG9yaWdpbmFsIGhhbmRsZXIuCi0JICovCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNtcC5sCSUwLDIoJSVzcClcblx0IgotCQkJICAgICAgImJjcy5zCS5vbGRfdmVjdG9yXG5cdCIKLQkJCSAgICAgICJjbXAubAklMSwyKCUlc3ApXG5cdCIKLQkJCSAgICAgICJibHMucwkuc2NzaV9idXNlcnJcbiIKLQkJCSIub2xkX3ZlY3Rvcjpcblx0IgotCQkJICAgICAgIm1vdmUubAklMiwtKCUlc3ApXG5cdCIKLQkJCSAgICAgICJydHNcbiIKLQkJCSIuc2NzaV9idXNlcnI6XG5cdCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogImkiICgmJnNjc2lfbG9vcCksICJpIiAoJiZzY3NpX2VuZCksCi0JCQkgICAgICAgICJtIiAoc2F2ZV9idXNlcnIpICk7Ci0KLQlpZiAoQ1BVX0lTXzA2MCkKLQl7Ci0JCS8qCi0JCSAqIEdldCBlZmZlY3RpdmUgYWRkcmVzcyBhbmQgcmVzdG9yZSB0aGUgc3RhY2suCi0JCSAqLwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZS5sCTgoJSVzcCksJTBcblx0IgotCQkJCSAgICAgICJtb3ZlLmwJJTEsJSVzcFxuXHQiCi0JCQkJICAgICAgOiAiPWEmIiAoZWZmX2FkZHIpCi0JCQkJICAgICAgOiAiciIgKHNhdmVfc3ApICk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJlZ2lzdGVyIHN0cnVjdCBtNjgwNDBfZnJhbWUgKmZyYW1lOwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgibGVhCTgoJSVzcCksJTBcblx0IgotCQkJCSAgICAgIDogIj1hJiIgKGZyYW1lKSApOwotCi0JCWlmICh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpCi0JCXsKLQkJCS8qCi0JCQkgKiBCdXMgZXJyb3Igd2hpbGUgd3JpdGluZy4KLQkJCSAqLwotCi0JCQlpZiAoZnJhbWUtPndiM3MgJiBXQlZfMDQwKQotCQkJewotCQkJCWlmIChmcmFtZS0+d2IzYSA9PSAobG9uZykgJmhhZGVzX3BzZG1fcmVnKQotCQkJCQlzdGFydF9hZGRyLS07Ci0JCQkJZWxzZQotCQkJCQl3cml0ZWJhY2soZnJhbWUtPndiM3MsIGZyYW1lLT53YjNhLAotCQkJCQkJICBmcmFtZS0+d2IzZCwgJiZzY3NpX2J1c19lcnJvcik7Ci0JCQl9Ci0KLQkJCWlmIChmcmFtZS0+d2IycyAmIFdCVl8wNDApCi0JCQl7Ci0JCQkJaWYgKGZyYW1lLT53YjJhID09IChsb25nKSAmaGFkZXNfcHNkbV9yZWcpCi0JCQkJCXN0YXJ0X2FkZHItLTsKLQkJCQllbHNlCi0JCQkJCXdyaXRlYmFjayhmcmFtZS0+d2IycywgZnJhbWUtPndiMmEsCi0JCQkJCQkgIGZyYW1lLT53YjJkLCAmJnNjc2lfYnVzX2Vycm9yKTsKLQkJCX0KLQotCQkJaWYgKGZyYW1lLT53YjFzICYgV0JWXzA0MCkKLQkJCXsKLQkJCQlpZiAoZnJhbWUtPndiMWEgPT0gKGxvbmcpICZoYWRlc19wc2RtX3JlZykKLQkJCQkJc3RhcnRfYWRkci0tOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyoKLQkJCSAqIEJ1cyBlcnJvciB3aGlsZSByZWFkaW5nLgotCQkJICovCi0KLQkJCWlmIChmcmFtZS0+d2IzcyAmIFdCVl8wNDApCi0JCQkJd3JpdGViYWNrKGZyYW1lLT53YjNzLCBmcmFtZS0+d2IzYSwKLQkJCQkJICBmcmFtZS0+d2IzZCwgJiZzY3NpX2J1c19lcnJvcik7Ci0JCX0KLQotCQllZmZfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGZyYW1lLT5mYWRkcjsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmUubAklMCwlJXNwXG5cdCIKLQkJCQkgICAgICA6Ci0JCQkJICAgICAgOiAiciIgKHNhdmVfc3ApICk7Ci0JfQotCi0JZG1hX2NudCA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkcjsKLQotCWlmIChlZmZfYWRkciA9PSAmaGFkZXNfcHNkbV9yZWcpCi0JewotCQkvKgotCQkgKiBCdXMgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgcHNldWRvCi0JCSAqIERNQSByZWdpc3Rlci4gVGltZSBvdXQuCi0JCSAqLwotCi0JCXRyaWVzLS07Ci0KLQkJaWYgKHRyaWVzIDw9IDApCi0JCXsKLQkJCWlmICgodHRfc2NzaV9kbWEuZG1hX2N0cmwgJiAxKSA9PSAwKQkvKiBSZWFkIG9yIHdyaXRlPyAqLwotCQkJCXNldF9yZXN0ZGF0YV9yZWcoc3RhcnRfYWRkcik7Ci0KLQkJCWlmIChkbWFfY250IDw9IDEpCi0JCQkJcHJpbnRrKEtFUk5fQ1JJVCAiRE1BIGVtdWxhdGlvbjogRmF0YWwgIgotCQkJCSAgICAgICAiZXJyb3Igd2hpbGUgJXMgdGhlIGxhc3QgYnl0ZS5cbiIsCi0JCQkJICAgICAgICh0dF9zY3NpX2RtYS5kbWFfY3RybCAmIDEpCi0JCQkJICAgICAgID8gIndyaXRpbmciIDogInJlYWRpbmciKTsKLQotCQkJZ290byBzY3NpX2VuZDsKLQkJfQotCQllbHNlCi0JCQlnb3RvIHNjc2lfbG9vcDsKLQl9Ci0JZWxzZQotCXsKLQkJLyoKLQkJICogQnVzIGVycm9yIGR1cmluZyBwc2V1ZG8gRE1BIHRyYW5zZmVyLgotCQkgKiBUZXJtaW5hdGUgdGhlIERNQSB0cmFuc2Zlci4KLQkJICovCi0KLQkJaGFkZXNfZG1hX2N0cmwgfD0gMzsJLyogU2V0IEVPUCBhbmQgYnVzIGVycm9yLiAqLwotCQlpZiAoKHR0X3Njc2lfZG1hLmRtYV9jdHJsICYgMSkgPT0gMCkJLyogUmVhZCBvciB3cml0ZT8gKi8KLQkJCXNldF9yZXN0ZGF0YV9yZWcoc3RhcnRfYWRkcik7Ci0JCWdvdG8gc2NzaV9lbmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLmMKaW5kZXggZjU3MzJkOC4uMjFmZTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5jCkBAIC0yNDksMTAgKzI0OSw2IEBACiBtb2R1bGVfcGFyYW0oc2V0dXBfaG9zdGlkLCBpbnQsIDApOwogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19UVF9ETUFfRU1VTCkKLSNpbmNsdWRlICJhdGFyaV9kbWFfZW11bC5jIgotI2VuZGlmCi0KICNpZiBkZWZpbmVkKFJFQUxfRE1BKQogCiBzdGF0aWMgaW50IHNjc2lfZG1hX2lzX2lnbm9yZWRfYnVzZXJyKHVuc2lnbmVkIGNoYXIgZG1hX3N0YXQpCkBAIC02OTUsMjEgKzY5MSw4IEBACiAjaWZkZWYgUkVBTF9ETUEKIAkJdHRfc2NzaV9kbWEuZG1hX2N0cmwgPSAwOwogCQlhdGFyaV9kbWFfcmVzaWR1YWwgPSAwOwotI2lmZGVmIENPTkZJR19UVF9ETUFfRU1VTAotCQlpZiAoTUFDSF9JU19IQURFUykgewotCQkJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzIsIGhhZGVzX2RtYV9lbXVsYXRvciwKLQkJCQkJIElSUV9UWVBFX1BSSU8sICJIYWRlcyBETUEgZW11bGF0b3IiLAotCQkJCQkgaGFkZXNfZG1hX2VtdWxhdG9yKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYXRhcmlfc2NzaV9kZXRlY3Q6IGNhbm5vdCBhbGxvY2F0ZSBpcnEgJWQsIGFib3J0aW5nIChNQUNIX0lTX0hBREVTKSIsSVJRX0FVVE9fMik7Ci0JCQkJZnJlZV9pcnEoSVJRX1RUX01GUF9TQ1NJLCBpbnN0YW5jZSk7Ci0JCQkJc2NzaV91bnJlZ2lzdGVyKGF0YXJpX3Njc2lfaG9zdCk7Ci0JCQkJYXRhcmlfc3RyYW1fZnJlZShhdGFyaV9kbWFfYnVmZmVyKTsKLQkJCQlhdGFyaV9kbWFfYnVmZmVyID0gMDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCWlmIChNQUNIX0lTX01FRFVTQSB8fCBNQUNIX0lTX0hBREVTKSB7CisKKwkJaWYgKE1BQ0hfSVNfTUVEVVNBKSB7CiAJCQkvKiBXaGlsZSB0aGUgcmVhZCBvdmVycnVucyAoZGVzY3JpYmVkIGJ5IERyZXcgRWNraGFyZHQgaW4KIAkJCSAqIE5DUjUzODAuYykgbmV2ZXIgaGFwcGVuZWQgb24gVFRzLCB0aGV5IGRvIGluIGZhY3Qgb24gdGhlIE1lZHVzYQogCQkJICogKFRoaXMgd2FzIHRoZSBjYXVzZSB3aHkgU0NTSSBkaWRuJ3Qgd29yayByaWdodCBmb3Igc28gbG9uZwpAQCAtMTAwNywxMSArOTkwLDcgQEAKIAkJCQkJU2NzaV9DbW5kICpjbWQsIGludCB3cml0ZV9mbGFnKQogewogCXVuc2lnbmVkIGxvbmcJcG9zc2libGVfbGVuLCBsaW1pdDsKLSNpZm5kZWYgQ09ORklHX1RUX0RNQV9FTVVMCi0JaWYgKE1BQ0hfSVNfSEFERVMpCi0JCS8qIEhhZGVzIGhhcyBubyBTQ1NJIERNQSBhdCBhbGwgOi0oIEFsd2F5cyBmb3JjZSB1c2Ugb2YgUElPICovCi0JCXJldHVybiAwOwotI2VuZGlmCisKIAlpZiAoSVNfQV9UVCgpKQogCQkvKiBUVCBTQ1NJIERNQSBjYW4gdHJhbnNmZXIgYXJiaXRyYXJ5ICNieXRlcyAqLwogCQlyZXR1cm4gd2FudGVkX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jaC5jIGIvZHJpdmVycy9zY3NpL2NoLmMKaW5kZXggM2MyNTdmZS4uODhlY2Y5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NoLmMKKysrIGIvZHJpdmVycy9zY3NpL2NoLmMKQEAgLTkxNCw5ICs5MTQsOSBAQAogCWNoLT5taW5vciA9IG1pbm9yOwogCXNwcmludGYoY2gtPm5hbWUsImNoJWQiLGNoLT5taW5vcik7CiAKLQljbGFzc19kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoY2hfc3lzZnNfY2xhc3MsIGRldiwKLQkJCQkJICBNS0RFVihTQ1NJX0NIQU5HRVJfTUFKT1IsIGNoLT5taW5vciksCi0JCQkJCSAgY2gsICJzJXMiLCBjaC0+bmFtZSk7CisJY2xhc3NfZGV2ID0gZGV2aWNlX2NyZWF0ZShjaF9zeXNmc19jbGFzcywgZGV2LAorCQkJCSAgTUtERVYoU0NTSV9DSEFOR0VSX01BSk9SLCBjaC0+bWlub3IpLCBjaCwKKwkJCQkgICJzJXMiLCBjaC0+bmFtZSk7CiAJaWYgKElTX0VSUihjbGFzc19kZXYpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNoJWQ6IGRldmljZV9jcmVhdGUgZmFpbGVkXG4iLAogCQkgICAgICAgY2gtPm1pbm9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYwppbmRleCA5OTRkYTU2Li43MDhlNDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJCS8qCiAJCQkgKiBMVU4gTm90IEFjY2Vzc2libGUgLSBBTFVBIHN0YXRlIHRyYW5zaXRpb24KIAkJCSAqLwotCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwogCQlpZiAoc2Vuc2VfaGRyLT5hc2MgPT0gMHgwNCAmJiBzZW5zZV9oZHItPmFzY3EgPT0gMHgwYikKIAkJCS8qCiAJCQkgKiBMVU4gTm90IEFjY2Vzc2libGUgLS0gVGFyZ2V0IHBvcnQgaW4gc3RhbmRieSBzdGF0ZQpAQCAtNDQ3LDE4ICs0NDcsMTggQEAKIAkJCS8qCiAJCQkgKiBQb3dlciBPbiwgUmVzZXQsIG9yIEJ1cyBEZXZpY2UgUmVzZXQsIGp1c3QgcmV0cnkuCiAJCQkgKi8KLQkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJCXJldHVybiBBRERfVE9fTUxRVUVVRTsKIAkJaWYgKHNlbnNlX2hkci0+YXNjID09IDB4MmEgJiYgc2Vuc2VfaGRyLT5hc2NxID09IDB4MDYpIHsKIAkJCS8qCiAJCQkgKiBBTFVBIHN0YXRlIGNoYW5nZWQKIAkJCSAqLwotCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwogCQl9CiAJCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDJhICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDA3KSB7CiAJCQkvKgogCQkJICogSW1wbGljaXQgQUxVQSBzdGF0ZSB0cmFuc2l0aW9uIGZhaWxlZAogCQkJICovCi0JCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCWlmICghZXJyKQogCQkJcmV0dXJuIFNDU0lfREhfSU87CiAJCWVyciA9IGFsdWFfY2hlY2tfc2Vuc2Uoc2RldiwgJnNlbnNlX2hkcik7Ci0JCWlmIChyZXRyeSA+IDAgJiYgZXJyID09IE5FRURTX1JFVFJZKSB7CisJCWlmIChyZXRyeSA+IDAgJiYgZXJyID09IEFERF9UT19NTFFVRVVFKSB7CiAJCQlyZXRyeS0tOwogCQkJZ290byByZXRyeTsKIAkJfQpAQCAtNTM1LDcgKzUzNSw3IEBACiAJCQlyZXR1cm4gU0NTSV9ESF9JTzsKIAogCQllcnIgPSBhbHVhX2NoZWNrX3NlbnNlKHNkZXYsICZzZW5zZV9oZHIpOwotCQlpZiAoZXJyID09IE5FRURTX1JFVFJZKQorCQlpZiAoZXJyID09IEFERF9UT19NTFFVRVVFKQogCQkJZ290byByZXRyeTsKIAkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LAogCQkJICAgICIlczogcnRwZyBzZW5zZSBjb2RlICUwMngvJTAyeC8lMDJ4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfZW1jLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwppbmRleCBiOWQyM2U5Li44ZjQ1NTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwpAQCAtODQsNyArODQsNyBAQAogCS8qCiAJICogSS9PIGJ1ZmZlciBmb3IgYm90aCBNT0RFX1NFTEVDVCBhbmQgSU5RVUlSWSBjb21tYW5kcy4KIAkgKi8KLQljaGFyIGJ1ZmZlcltDTEFSSUlPTl9CVUZGRVJfU0laRV07CisJdW5zaWduZWQgY2hhciBidWZmZXJbQ0xBUklJT05fQlVGRkVSX1NJWkVdOwogCS8qCiAJICogU0NTSSBzZW5zZSBidWZmZXIgZm9yIGNvbW1hbmRzIC0tIGFzc3VtZXMgc2VyaWFsIGlzc3VhbmNlCiAJICogYW5kIGNvbXBsZXRpb24gc2VxdWVuY2Ugb2YgYWxsIGNvbW1hbmRzIGZvciBzYW1lIG11bHRpcGF0aC4KQEAgLTE3Niw3ICsxNzYsNyBAQAogCQllcnIgPSBTQ1NJX0RIX0RFVl9URU1QX0JVU1k7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoY3NkZXYtPmJ1ZmZlcls0XSA8IDAgfHwgY3NkZXYtPmJ1ZmZlcls0XSA+IDIpIHsKKwlpZiAoY3NkZXYtPmJ1ZmZlcls0XSA+IDIpIHsKIAkJLyogSW52YWxpZCBidWZmZXIgZm9ybWF0ICovCiAJCXNkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGV2LAogCQkJICAgICIlczogaW52YWxpZCBWUEQgcGFnZSAweEMwIGZvcm1hdFxuIiwKQEAgLTI3OCw3ICsyNzgsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOwogCXJxLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKGNtZCk7CiAJcnEtPmNtZFswXSA9IGNtZDsKIApAQCAtNDM5LDcgKzQzOCw3IEBACiAJCQkgKiBVbml0IEF0dGVudGlvbiBDb2RlLiBUaGlzIGlzIHRoZSBmaXJzdCBJTwogCQkJICogdG8gdGhlIG5ldyBwYXRoLCBzbyBqdXN0IHJldHJ5LgogCQkJICovCi0JCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CiAJCWJyZWFrOwogCX0KIApAQCAtNTE0LDcgKzUxMyw3IEBACiAJCQlyZXR1cm4gU0NTSV9ESF9JTzsKIAogCQllcnIgPSBjbGFyaWlvbl9jaGVja19zZW5zZShzZGV2LCAmc3NoZHIpOwotCQlpZiAocmV0cnkgPiAwICYmIGVyciA9PSBORUVEU19SRVRSWSkgeworCQlpZiAocmV0cnkgPiAwICYmIGVyciA9PSBBRERfVE9fTUxRVUVVRSkgewogCQkJcmV0cnktLTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9ocF9zdy5jCmluZGV4IGE2YTRlZjMuLjVlOTNjODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfaHBfc3cuYwpAQCAtMTE0LDcgKzExNCw2IEBACiAJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwogCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9GQUlMRkFTVDsKIAlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoVEVTVF9VTklUX1JFQURZKTsKLQltZW1zZXQocmVxLT5jbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCXJlcS0+Y21kWzBdID0gVEVTVF9VTklUX1JFQURZOwogCXJlcS0+dGltZW91dCA9IEhQX1NXX1RJTUVPVVQ7CiAJcmVxLT5zZW5zZSA9IGgtPnNlbnNlOwpAQCAtMjA3LDcgKzIwNiw2IEBACiAJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwogCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9GQUlMRkFTVDsKIAlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoU1RBUlRfU1RPUCk7Ci0JbWVtc2V0KHJlcS0+Y21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAlyZXEtPmNtZFswXSA9IFNUQVJUX1NUT1A7CiAJcmVxLT5jbWRbNF0gPSAxOwkvKiBTdGFydCBzcGluIGN5Y2xlICovCiAJcmVxLT50aW1lb3V0ID0gSFBfU1dfVElNRU9VVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwppbmRleCAyZGVlNjlkLi41MGJmOTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCkBAIC0yMjUsOCArMjI1LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JbWVtc2V0KHJxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsKLQogCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwogCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX0ZBSUxGQVNUIHwgUkVRX05PTUVSR0U7CiAJcnEtPnJldHJpZXMgPSBSREFDX1JFVFJJRVM7CkBAIC01NTEsNyArNTQ5LDcgQEAKIAkJCSAqCiAJCQkgKiBKdXN0IHJldHJ5IGFuZCB3YWl0LgogCQkJICovCi0JCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CiAJCWJyZWFrOwogCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgogCQlpZiAoc2Vuc2VfaGRyLT5hc2MgPT0gMHg5NCAmJiBzZW5zZV9oZHItPmFzY3EgPT0gMHgwMSkgewpAQCAtNTY4LDcgKzU2Niw3IEBACiAJCQkvKgogCQkJICogUG93ZXIgT24sIFJlc2V0LCBvciBCdXMgRGV2aWNlIFJlc2V0LCBqdXN0IHJldHJ5LgogCQkJICovCi0JCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CiAJCWJyZWFrOwogCX0KIAkvKiBzdWNjZXNzIGp1c3QgbWVhbnMgd2UgZG8gbm90IGNhcmUgd2hhdCBzY3NpLW1sIGRvZXMgKi8KQEAgLTU5MCw2ICs1ODgsOCBAQAogCXsiU1RLIiwgIk9QRU5zdG9yYWdlIEQyODAifSwKIAl7IlNVTiIsICJDU00yMDBfUiJ9LAogCXsiU1VOIiwgIkxDU00xMDBfRiJ9LAorCXsiREVMTCIsICJNRDMwMDAifSwKKwl7IkRFTEwiLCAiTUQzMDAwaSJ9LAogCXtOVUxMLCBOVUxMfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMgYi9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCmluZGV4IDFmZTA5MDEuLjhhYmE0ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKKysrIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJCXBIYmEtPmluaXRpYWxpemVkID0gVFJVRTsKIAkJcEhiYS0+c3RhdGUgJj0gfkRQVElfU1RBVEVfUkVTRVQ7CiAJCWlmIChhZHB0X3N5c2ZzX2NsYXNzKSB7Ci0JCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoYWRwdF9zeXNmc19jbGFzcywKKwkJCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRldmljZV9jcmVhdGUoYWRwdF9zeXNmc19jbGFzcywKIAkJCQlOVUxMLCBNS0RFVihEUFRJX0kyT19NQUpPUiwgcEhiYS0+dW5pdCksIE5VTEwsCiAJCQkJImRwdGklZCIsIHBIYmEtPnVuaXQpOwogCQkJaWYgKElTX0VSUihkZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNwX3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5oCmluZGV4IGJiNDNhMTMuLjI4ZTIyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5oCkBAIC01MjEsNyArNTIxLDggQEAKIAogCXN0cnVjdCBjb21wbGV0aW9uCSplaF9yZXNldDsKIAotCXN0cnVjdCBzYnVzX2RtYQkJKmRtYTsKKwl2b2lkCQkJKmRtYTsKKwlpbnQJCQlkbWFyZXY7CiB9OwogCiAvKiBBIGZyb250LWVuZCBkcml2ZXIgZm9yIHRoZSBFU1AgY2hpcCBzaG91bGQgZG8gdGhlIGZvbGxvd2luZyBpbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGguYyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKaW5kZXggODIyZDUyMS4uYzM4N2MxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dkdGguYworKysgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCkBAIC00NjQsNyArNDY0LDYgQEAKIAogICAgIC8qIHVzZSByZXF1ZXN0IGZpZWxkIHRvIHNhdmUgdGhlIHB0ci4gdG8gY29tcGxldGlvbiBzdHJ1Y3QuICovCiAgICAgc2NwLT5yZXF1ZXN0ID0gKHN0cnVjdCByZXF1ZXN0ICopJndhaXQ7Ci0gICAgc2NwLT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dCpIWjsKICAgICBzY3AtPmNtZF9sZW4gPSAxMjsKICAgICBzY3AtPmNtbmQgPSBjbW5kOwogICAgIGNtbmRpbmZvLnByaW9yaXR5ID0gSU9DVExfUFJJOwpAQCAtMTk5NSwyMyArMTk5NCwxMiBAQAogICAgIHJlZ2lzdGVyIFNjc2lfQ21uZCAqcHNjcDsKICAgICByZWdpc3RlciBTY3NpX0NtbmQgKm5zY3A7CiAgICAgdWxvbmcgZmxhZ3M7Ci0gICAgdW5jaGFyIGIsIHQ7CiAKICAgICBUUkFDRSgoImdkdGhfcHV0cSgpIHByaW9yaXR5ICVkXG4iLHByaW9yaXR5KSk7CiAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOwogCi0gICAgaWYgKCFjbW5kaW5mby0+aW50ZXJuYWxfY29tbWFuZCkgeworICAgIGlmICghY21uZGluZm8tPmludGVybmFsX2NvbW1hbmQpCiAgICAgICAgIGNtbmRpbmZvLT5wcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICBiID0gc2NwLT5kZXZpY2UtPmNoYW5uZWw7Ci0gICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7Ci0gICAgICAgIGlmIChwcmlvcml0eSA+PSBERUZBVUxUX1BSSSkgewotICAgICAgICAgICAgaWYgKChiICE9IGhhLT52aXJ0X2J1cyAmJiBoYS0+cmF3W0JVU19MMlAoaGEsYildLmxvY2spIHx8Ci0gICAgICAgICAgICAgICAgKGI9PWhhLT52aXJ0X2J1cyAmJiB0PE1BWF9IRFJJVkVTICYmIGhhLT5oZHJbdF0ubG9jaykpIHsKLSAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3B1dHEoKTogbG9ja2VkIElPIC0+dXBkYXRlX3RpbWVvdXQoKVxuIikpOwotICAgICAgICAgICAgICAgIGNtbmRpbmZvLT50aW1lb3V0ID0gZ2R0aF91cGRhdGVfdGltZW91dChzY3AsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCiAgICAgaWYgKGhhLT5yZXFfZmlyc3Q9PU5VTEwpIHsKICAgICAgICAgaGEtPnJlcV9maXJzdCA9IHNjcDsgICAgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIHdhcyBlbXB0eSAqLwpAQCAtMzg5OSw2ICszODg3LDM5IEBACiAgICAgcmV0dXJuICgoY29uc3QgY2hhciAqKWhhLT5iaW5mby50eXBlX3N0cmluZyk7CiB9CiAKK3N0YXRpYyBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gZ2R0aF90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqc2NwKQoreworCWdkdGhfaGFfc3RyICpoYSA9IHNob3N0X3ByaXYoc2NwLT5kZXZpY2UtPmhvc3QpOworCXN0cnVjdCBnZHRoX2NtbmRpbmZvICpjbW5kaW5mbyA9IGdkdGhfY21uZF9wcml2KHNjcCk7CisJdW5jaGFyIGIsIHQ7CisJdWxvbmcgZmxhZ3M7CisJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHJldHZhbCA9IEJMS19FSF9OT1RfSEFORExFRDsKKworCVRSQUNFKCgiJXMoKSBjbWQgMHgleFxuIiwgc2NwLT5jbW5kWzBdLCBfX2Z1bmNfXykpOworCWIgPSBzY3AtPmRldmljZS0+Y2hhbm5lbDsKKwl0ID0gc2NwLT5kZXZpY2UtPmlkOworCisJLyoKKwkgKiBXZSBkb24ndCByZWFsbHkgaG9ub3IgdGhlIGNvbW1hbmQgdGltZW91dCwgYnV0IHdlIHRyeSB0bworCSAqIGhvbm9yIDYgdGltZXMgb2YgdGhlIGFjdHVhbCBjb21tYW5kIHRpbWVvdXQhIFNvIHJlc2V0IHRoZQorCSAqIHRpbWVyIGlmIHRoaXMgaXMgbGVzcyB0aGFuIDZ0aCB0aW1lb3V0IG9uIHRoaXMgY29tbWFuZCEKKwkgKi8KKwlpZiAoKytjbW5kaW5mby0+dGltZW91dF9jb3VudCA8IDYpCisJCXJldHZhbCA9IEJMS19FSF9SRVNFVF9USU1FUjsKKworCS8qIFJlc2V0IHRoZSB0aW1lb3V0IGlmIGl0IGlzIGxvY2tlZCBJTyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKKwlpZiAoKGIgIT0gaGEtPnZpcnRfYnVzICYmIGhhLT5yYXdbQlVTX0wyUChoYSwgYildLmxvY2spIHx8CisJICAgIChiID09IGhhLT52aXJ0X2J1cyAmJiB0IDwgTUFYX0hEUklWRVMgJiYgaGEtPmhkclt0XS5sb2NrKSkgeworCQlUUkFDRTIoKCIlcygpOiBsb2NrZWQgSU8sIHJlc2V0IHRpbWVvdXRcbiIsIF9fZnVuY19fKSk7CisJCXJldHZhbCA9IEJMS19FSF9SRVNFVF9USU1FUjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKIHN0YXRpYyBpbnQgZ2R0aF9laF9idXNfcmVzZXQoU2NzaV9DbW5kICpzY3ApCiB7CiAgICAgZ2R0aF9oYV9zdHIgKmhhID0gc2hvc3RfcHJpdihzY3AtPmRldmljZS0+aG9zdCk7CkBAIC0zOTkyLDcgKzQwMTMsNyBAQAogICAgIEJVR19PTighY21uZGluZm8pOwogCiAgICAgc2NwLT5zY3NpX2RvbmUgPSBkb25lOwotICAgIGdkdGhfdXBkYXRlX3RpbWVvdXQoc2NwLCBzY3AtPnRpbWVvdXRfcGVyX2NvbW1hbmQgKiA2KTsKKyAgICBjbW5kaW5mby0+dGltZW91dF9jb3VudCA9IDA7CiAgICAgY21uZGluZm8tPnByaW9yaXR5ID0gREVGQVVMVF9QUkk7CiAKICAgICByZXR1cm4gX19nZHRoX3F1ZXVlY29tbWFuZChoYSwgc2NwLCBjbW5kaW5mbyk7CkBAIC00MDk2LDEyICs0MTE3LDEwIEBACiAgICAgICAgICAgICBoYS0+aGRyW2pdLmxvY2sgPSAxOwogICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7CiAgICAgICAgICAgICBnZHRoX3dhaXRfY29tcGxldGlvbihoYSwgaGEtPmJ1c19jbnQsIGopOwotICAgICAgICAgICAgZ2R0aF9zdG9wX3RpbWVvdXQoaGEsIGhhLT5idXNfY250LCBqKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKICAgICAgICAgICAgIGhhLT5oZHJbal0ubG9jayA9IDA7CiAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIGdkdGhfc3RhcnRfdGltZW91dChoYSwgaGEtPmJ1c19jbnQsIGopOwogICAgICAgICAgICAgZ2R0aF9uZXh0KGhhKTsKICAgICAgICAgfQogICAgIH0gCkBAIC00NTM5LDE4ICs0NTU4LDE0IEBACiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOwogICAgICAgICAgICAgICAgIGhhLT5yYXdbaV0ubG9jayA9IDE7CiAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhLT50aWRfY250OyArK2opIHsKKwkJZm9yIChqID0gMDsgaiA8IGhhLT50aWRfY250OyArK2opCiAgICAgICAgICAgICAgICAgICAgIGdkdGhfd2FpdF9jb21wbGV0aW9uKGhhLCBpLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgZ2R0aF9zdG9wX3RpbWVvdXQoaGEsIGksIGopOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOwogICAgICAgICAgICAgICAgIGhhLT5yYXdbaV0ubG9jayA9IDA7CiAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhLT50aWRfY250OyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgZ2R0aF9zdGFydF90aW1lb3V0KGhhLCBpLCBqKTsKKwkJZm9yIChqID0gMDsgaiA8IGhhLT50aWRfY250OyArK2opCiAgICAgICAgICAgICAgICAgICAgIGdkdGhfbmV4dChoYSk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IAogICAgICAgICBicmVhazsKQEAgLTQ2NDQsNiArNDY1OSw3IEBACiAgICAgICAgIC5zbGF2ZV9jb25maWd1cmUgICAgICAgID0gZ2R0aF9zbGF2ZV9jb25maWd1cmUsCiAgICAgICAgIC5iaW9zX3BhcmFtICAgICAgICAgICAgID0gZ2R0aF9iaW9zX3BhcmFtLAogICAgICAgICAucHJvY19pbmZvICAgICAgICAgICAgICA9IGdkdGhfcHJvY19pbmZvLAorCS5laF90aW1lZF9vdXQJCT0gZ2R0aF90aW1lZF9vdXQsCiAgICAgICAgIC5wcm9jX25hbWUgICAgICAgICAgICAgID0gImdkdGgiLAogICAgICAgICAuY2FuX3F1ZXVlICAgICAgICAgICAgICA9IEdEVEhfTUFYQ01EUywKICAgICAgICAgLnRoaXNfaWQgICAgICAgICAgICAgICAgPSAtMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoLmggYi9kcml2ZXJzL3Njc2kvZ2R0aC5oCmluZGV4IGNhOTI0NzYuLjE2NDY0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9nZHRoLmgKKysrIGIvZHJpdmVycy9zY3NpL2dkdGguaApAQCAtOTE2LDcgKzkxNiw3IEBACiAgICAgICAgIGdkdGhfY21kX3N0ciAqaW50ZXJuYWxfY21kX3N0cjsgICAgICAgICAvKiBjcmllciBmb3IgaW50ZXJuYWwgbWVzc2FnZXMqLwogICAgICAgICBkbWFfYWRkcl90IHNlbnNlX3BhZGRyOyAgICAgICAgICAgICAgICAgLyogc2Vuc2UgZG1hLWFkZHIgKi8KICAgICAgICAgdW5jaGFyIHByaW9yaXR5OwotICAgICAgICBpbnQgdGltZW91dDsKKwlpbnQgdGltZW91dF9jb3VudDsJCQkvKiAjIG9mIHRpbWVvdXQgY2FsbHMgKi8KICAgICAgICAgdm9sYXRpbGUgaW50IHdhaXRfZm9yX2NvbXBsZXRpb247CiAgICAgICAgIHVzaG9ydCBzdGF0dXM7CiAgICAgICAgIHVsb25nMzIgaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuYyBiL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuYwppbmRleCBjZTAyMjhlLi41OTM0OWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5jCkBAIC03NDgsNjkgKzc0OCwzIEBACiAgICAgfQogICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5zbXBfbG9jaywgZmxhZ3MpOwogfQotCi1zdGF0aWMgdm9pZCBnZHRoX3N0b3BfdGltZW91dChnZHRoX2hhX3N0ciAqaGEsIGludCBidXNudW0sIGludCBpZCkKLXsKLSAgICB1bG9uZyBmbGFnczsKLSAgICBTY3NpX0NtbmQgKnNjcDsKLSAgICB1bmNoYXIgYiwgdDsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKLQotICAgIGZvciAoc2NwID0gaGEtPnJlcV9maXJzdDsgc2NwOyBzY3AgPSAoU2NzaV9DbW5kICopc2NwLT5TQ3AucHRyKSB7Ci0gICAgICAgIHN0cnVjdCBnZHRoX2NtbmRpbmZvICpjbW5kaW5mbyA9IGdkdGhfY21uZF9wcml2KHNjcCk7Ci0gICAgICAgIGlmICghY21uZGluZm8tPmludGVybmFsX2NvbW1hbmQpIHsKLSAgICAgICAgICAgIGIgPSBzY3AtPmRldmljZS0+Y2hhbm5lbDsKLSAgICAgICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7Ci0gICAgICAgICAgICBpZiAodCA9PSAodW5jaGFyKWlkICYmIGIgPT0gKHVuY2hhcilidXNudW0pIHsKLSAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3N0b3BfdGltZW91dCgpOiB1cGRhdGVfdGltZW91dCgpXG4iKSk7Ci0gICAgICAgICAgICAgICAgY21uZGluZm8tPnRpbWVvdXQgPSBnZHRoX3VwZGF0ZV90aW1lb3V0KHNjcCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdkdGhfc3RhcnRfdGltZW91dChnZHRoX2hhX3N0ciAqaGEsIGludCBidXNudW0sIGludCBpZCkKLXsKLSAgICB1bG9uZyBmbGFnczsKLSAgICBTY3NpX0NtbmQgKnNjcDsKLSAgICB1bmNoYXIgYiwgdDsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZoYS0+c21wX2xvY2ssIGZsYWdzKTsKLQotICAgIGZvciAoc2NwID0gaGEtPnJlcV9maXJzdDsgc2NwOyBzY3AgPSAoU2NzaV9DbW5kICopc2NwLT5TQ3AucHRyKSB7Ci0gICAgICAgIHN0cnVjdCBnZHRoX2NtbmRpbmZvICpjbW5kaW5mbyA9IGdkdGhfY21uZF9wcml2KHNjcCk7Ci0gICAgICAgIGlmICghY21uZGluZm8tPmludGVybmFsX2NvbW1hbmQpIHsKLSAgICAgICAgICAgIGIgPSBzY3AtPmRldmljZS0+Y2hhbm5lbDsKLSAgICAgICAgICAgIHQgPSBzY3AtPmRldmljZS0+aWQ7Ci0gICAgICAgICAgICBpZiAodCA9PSAodW5jaGFyKWlkICYmIGIgPT0gKHVuY2hhcilidXNudW0pIHsKLSAgICAgICAgICAgICAgICBUUkFDRTIoKCJnZHRoX3N0YXJ0X3RpbWVvdXQoKTogdXBkYXRlX3RpbWVvdXQoKVxuIikpOwotICAgICAgICAgICAgICAgIGdkdGhfdXBkYXRlX3RpbWVvdXQoc2NwLCBjbW5kaW5mby0+dGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnNtcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2R0aF91cGRhdGVfdGltZW91dChTY3NpX0NtbmQgKnNjcCwgaW50IHRpbWVvdXQpCi17Ci0gICAgaW50IG9sZHRvOwotCi0gICAgb2xkdG8gPSBzY3AtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7Ci0gICAgc2NwLT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKLQotICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgICAgZGVsX3RpbWVyKCZzY3AtPmVoX3RpbWVvdXQpOwotICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBOVUxMOwotICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZXhwaXJlcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHNjcC0+ZWhfdGltZW91dC5kYXRhICE9ICh1bnNpZ25lZCBsb25nKSBOVUxMKSAKLSAgICAgICAgICAgIGRlbF90aW1lcigmc2NwLT5laF90aW1lb3V0KTsKLSAgICAgICAgc2NwLT5laF90aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2NwOwotICAgICAgICBzY3AtPmVoX3RpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwotICAgICAgICBhZGRfdGltZXIoJnNjcC0+ZWhfdGltZW91dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9sZHRvOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5oIGIvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5oCmluZGV4IDQ1ZTZmZGEuLjliOTAwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2MuaAorKysgYi9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmgKQEAgLTIwLDkgKzIwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nNjQgKnBhZGRyKTsKIHN0YXRpYyB2b2lkIGdkdGhfaW9jdGxfZnJlZShnZHRoX2hhX3N0ciAqaGEsIGludCBzaXplLCBjaGFyICpidWYsIHVsb25nNjQgcGFkZHIpOwogc3RhdGljIHZvaWQgZ2R0aF93YWl0X2NvbXBsZXRpb24oZ2R0aF9oYV9zdHIgKmhhLCBpbnQgYnVzbnVtLCBpbnQgaWQpOwotc3RhdGljIHZvaWQgZ2R0aF9zdG9wX3RpbWVvdXQoZ2R0aF9oYV9zdHIgKmhhLCBpbnQgYnVzbnVtLCBpbnQgaWQpOwotc3RhdGljIHZvaWQgZ2R0aF9zdGFydF90aW1lb3V0KGdkdGhfaGFfc3RyICpoYSwgaW50IGJ1c251bSwgaW50IGlkKTsKLXN0YXRpYyBpbnQgZ2R0aF91cGRhdGVfdGltZW91dChTY3NpX0NtbmQgKnNjcCwgaW50IHRpbWVvdXQpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCBmZWQwYjAyLi4zZmRiYjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiBzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3RfbG9va3VwKHVuc2lnbmVkIHNob3J0IGhvc3RudW0pCiB7CiAJc3RydWN0IGRldmljZSAqY2RldjsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IEVSUl9QVFIoLUVOWElPKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IE5VTEw7CiAKIAljZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UoJnNob3N0X2NsYXNzLCBOVUxMLCAmaG9zdG51bSwKIAkJCQkgX19zY3NpX2hvc3RfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwppbmRleCA3YjE1MDJjLi44N2UwOWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwpAQCAtNzU2LDcgKzc1Niw3IEBACiAJaW5pdF9ldmVudF9zdHJ1Y3QoZXZ0X3N0cnVjdCwKIAkJCSAgaGFuZGxlX2NtZF9yc3AsCiAJCQkgIFZJT1NSUF9TUlBfRk9STUFULAotCQkJICBjbW5kLT50aW1lb3V0X3Blcl9jb21tYW5kL0haKTsKKwkJCSAgY21uZC0+cmVxdWVzdC0+dGltZW91dC9IWik7CiAKIAlldnRfc3RydWN0LT5jbW5kID0gY21uZDsKIAlldnRfc3RydWN0LT5jbW5kX2RvbmUgPSBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lkZS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwppbmRleCA0NjEzMzFkLi43NDBiYWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KQEAgLTgzLDcgKzgyLDYgQEAKIAlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CiAJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKIAotCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjOwkJLyogQ3VycmVudCBwYWNrZXQgY29tbWFuZCAqLwogCXVuc2lnbmVkIGxvbmcgdHJhbnNmb3JtOwkJLyogU0NTSSBjbWQgdHJhbnNsYXRpb24gbGF5ZXIgKi8KIAl1bnNpZ25lZCBsb25nIGxvZzsJCQkvKiBsb2cgZmxhZ3MgKi8KIH0gaWRlc2NzaV9zY3NpX3Q7CkBAIC0xMzEsNTAgKzEyOSw2IEBACiAJcmV0dXJuIHNjc2lob3N0X3RvX2lkZXNjc2koaWRlX2RyaXZlLT5kcml2ZXJfZGF0YSk7CiB9CiAKLS8qCi0gKglQSU8gZGF0YSB0cmFuc2ZlciByb3V0aW5lIHVzaW5nIHRoZSBzY2F0dGVyIGdhdGhlciB0YWJsZS4KLSAqLwotc3RhdGljIHZvaWQgaWRlX3Njc2lfaW9fYnVmZmVycyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjLAotCQkJCXVuc2lnbmVkIGludCBiY291bnQsIGludCB3cml0ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKLQl4ZmVyX2Z1bmNfdCAqeGYgPSB3cml0ZSA/IHRwX29wcy0+b3V0cHV0X2RhdGEgOiB0cF9vcHMtPmlucHV0X2RhdGE7Ci0JY2hhciAqYnVmOwotCWludCBjb3VudDsKLQotCXdoaWxlIChiY291bnQpIHsKLQkJY291bnQgPSBtaW4ocGMtPnNnLT5sZW5ndGggLSBwYy0+Yl9jb3VudCwgYmNvdW50KTsKLQkJaWYgKFBhZ2VIaWdoTWVtKHNnX3BhZ2UocGMtPnNnKSkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCWJ1ZiA9IGttYXBfYXRvbWljKHNnX3BhZ2UocGMtPnNnKSwgS01fSVJRMCkgKwotCQkJCQkgIHBjLT5zZy0+b2Zmc2V0OwotCQkJeGYoZHJpdmUsIE5VTEwsIGJ1ZiArIHBjLT5iX2NvdW50LCBjb3VudCk7Ci0JCQlrdW5tYXBfYXRvbWljKGJ1ZiAtIHBjLT5zZy0+b2Zmc2V0LCBLTV9JUlEwKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZiA9IHNnX3ZpcnQocGMtPnNnKTsKLQkJCXhmKGRyaXZlLCBOVUxMLCBidWYgKyBwYy0+Yl9jb3VudCwgY291bnQpOwotCQl9Ci0JCWJjb3VudCAtPSBjb3VudDsgcGMtPmJfY291bnQgKz0gY291bnQ7Ci0JCWlmIChwYy0+Yl9jb3VudCA9PSBwYy0+c2ctPmxlbmd0aCkgewotCQkJaWYgKCEtLXBjLT5zZ19jbnQpCi0JCQkJYnJlYWs7Ci0JCQlwYy0+c2cgPSBzZ19uZXh0KHBjLT5zZyk7Ci0JCQlwYy0+Yl9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAoYmNvdW50KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNjYXR0ZXIgZ2F0aGVyIHRhYmxlIHRvbyBzbWFsbCwgJXNcbiIsCi0JCQkJZHJpdmUtPm5hbWUsIHdyaXRlID8gInBhZGRpbmcgd2l0aCB6ZXJvcyIKLQkJCQkJCSAgIDogImRpc2NhcmRpbmcgZGF0YSIpOwotCQlpZGVfcGFkX3RyYW5zZmVyKGRyaXZlLCB3cml0ZSwgYmNvdW50KTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGlkZV9zY3NpX2hleF9kdW1wKHU4ICpkYXRhLCBpbnQgbGVuKQogewogCXByaW50X2hleF9kdW1wKEtFUk5fQ09OVCwgIiIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBkYXRhLCBsZW4sIDApOwpAQCAtMTgyLDEwICsxMzYsMTAgQEAKIAogc3RhdGljIGludCBpZGVzY3NpX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICosIGludCwgaW50KTsKIAotc3RhdGljIHZvaWQgaWRlX3Njc2lfY2FsbGJhY2soaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIHZvaWQgaWRlX3Njc2lfY2FsbGJhY2soaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZHNjKQogewogCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7Ci0Jc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMgPSBzY3NpLT5wYzsKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IGRyaXZlLT5wYzsKIAogCWlmIChwYy0+ZmxhZ3MgJiBQQ19GTEFHX1RJTUVET1VUKQogCQlkZWJ1Z19sb2coIiVzOiBnb3QgdGltZWQgb3V0IHBhY2tldCAlbHUgYXQgJWx1XG4iLCBfX2Z1bmNfXywKQEAgLTI0NCw5ICsxOTgsOSBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAotCWlmIChod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpICYgKEJVU1lfU1RBVCB8IERSUV9TVEFUKSkKKwlpZiAoaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKQogCQkvKiBmb3JjZSBhbiBhYm9ydCAqLwotCQlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBXSU5fSURMRUlNTUVESUFURSk7CisJCWh3aWYtPnRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfSURMRUlNTUVESUFURSk7CiAKIAlycS0+ZXJyb3JzKys7CiAKQEAgLTMxMiw0OSArMjY2LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlrZnJlZShwYyk7CiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKLQlzY3NpLT5wYyA9IE5VTEw7CisJZHJpdmUtPnBjID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90aW1lb3V0KHN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQotewotCXJldHVybiBtYXhfdCh1bnNpZ25lZCBsb25nLCBXQUlUX0NNRCwgcGMtPnRpbWVvdXQgLSBqaWZmaWVzKTsKLX0KLQotc3RhdGljIGludCBpZGVzY3NpX2V4cGlyeShpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICAgKnBjICAgPSBzY3NpLT5wYzsKLQotCWRlYnVnX2xvZygiJXMgY2FsbGVkIGZvciAlbHUgYXQgJWx1XG4iLCBfX2Z1bmNfXywKLQkJICBwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIsIGppZmZpZXMpOwotCi0JcGMtPmZsYWdzIHw9IFBDX0ZMQUdfVElNRURPVVQ7Ci0KLQlyZXR1cm4gMDsJCQkJCS8qIHdlIGRvIG5vdCB3YW50IHRoZSBpZGUgc3Vic3lzdGVtIHRvIHJldHJ5ICovCi19Ci0KLS8qCi0gKglPdXIgaW50ZXJydXB0IGhhbmRsZXIuCi0gKi8KLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlc2NzaV9wY19pbnRyIChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlc2NzaV9zY3NpX3QgKnNjc2kgPSBkcml2ZV90b19pZGVzY3NpKGRyaXZlKTsKLQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IHNjc2ktPnBjOwotCi0JcmV0dXJuIGlkZV9wY19pbnRyKGRyaXZlLCBwYywgaWRlc2NzaV9wY19pbnRyLCBnZXRfdGltZW91dChwYyksCi0JCQkgICBpZGVzY3NpX2V4cGlyeSwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCSAgIGlkZV9zY3NpX2lvX2J1ZmZlcnMpOwotfQotCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZXNjc2lfdHJhbnNmZXJfcGMoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7Ci0KLQlyZXR1cm4gaWRlX3RyYW5zZmVyX3BjKGRyaXZlLCBzY3NpLT5wYywgaWRlc2NzaV9wY19pbnRyLAotCQkJICAgICAgIGdldF90aW1lb3V0KHNjc2ktPnBjKSwgaWRlc2NzaV9leHBpcnkpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpZGVzY3NpX3NldF9kaXJlY3Rpb24oc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCiB7CiAJc3dpdGNoIChwYy0+Y1swXSkgewpAQCAtMzk3LDEzICszMTIsMTAgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlc2NzaV9pc3N1ZV9wYyhpZGVfZHJpdmVfdCAqZHJpdmUsCiAJCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjKQogewotCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7Ci0KIAkvKiBTZXQgdGhlIGN1cnJlbnQgcGFja2V0IGNvbW1hbmQgKi8KLQlzY3NpLT5wYyA9IHBjOworCWRyaXZlLT5wYyA9IHBjOwogCi0JcmV0dXJuIGlkZV9pc3N1ZV9wYyhkcml2ZSwgcGMsIGlkZXNjc2lfdHJhbnNmZXJfcGMsCi0JCQkgICAgZ2V0X3RpbWVvdXQocGMpLCBpZGVzY3NpX2V4cGlyeSk7CisJcmV0dXJuIGlkZV9pc3N1ZV9wYyhkcml2ZSwgaWRlX3Njc2lfZ2V0X3RpbWVvdXQocGMpLCBpZGVfc2NzaV9leHBpcnkpOwogfQogCiAvKgpAQCAtNDE5LDcgKzMzMSw4IEBACiAJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHJxKSB8fCBibGtfc3BlY2lhbF9yZXF1ZXN0KHJxKSkgewogCQlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9IChzdHJ1Y3QgaWRlX2F0YXBpX3BjICopcnEtPnNwZWNpYWw7CiAKLQkJaWYgKGRyaXZlLT51c2luZ19kbWEgJiYgIWlkZXNjc2lfbWFwX3NnKGRyaXZlLCBwYykpCisJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpICYmCisJCSAgICBpZGVzY3NpX21hcF9zZyhkcml2ZSwgcGMpID09IDApCiAJCQlwYy0+ZmxhZ3MgfD0gUENfRkxBR19ETUFfT0s7CiAKIAkJcmV0dXJuIGlkZXNjc2lfaXNzdWVfcGMoZHJpdmUsIHBjKTsKQEAgLTQzMCwyMSArMzQzLDQxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKLXN0YXRpYyB2b2lkIGlkZXNjc2lfYWRkX3NldHRpbmdzKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVzY3NpX3Njc2lfdCAqc2NzaSA9IGRyaXZlX3RvX2lkZXNjc2koZHJpdmUpOwotCi0vKgotICoJCQlkcml2ZQlzZXR0aW5nIG5hbWUJcmVhZC93cml0ZQlkYXRhIHR5cGUJbWluCW1heAltdWxfZmFjdG9yCWRpdl9mYWN0b3IJZGF0YSBwb2ludGVyCQlzZXQgZnVuY3Rpb24KLSAqLwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3NfY3lsIiwJU0VUVElOR19SVywJVFlQRV9JTlQsCTAsCTEwMjMsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX2N5bCwJTlVMTCk7Ci0JaWRlX2FkZF9zZXR0aW5nKGRyaXZlLAkiYmlvc19oZWFkIiwJU0VUVElOR19SVywJVFlQRV9CWVRFLAkwLAkyNTUsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX2hlYWQsCU5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImJpb3Nfc2VjdCIsCVNFVFRJTkdfUlcsCVRZUEVfQllURSwJMCwJNjMsCTEsCQkxLAkJJmRyaXZlLT5iaW9zX3NlY3QsCU5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJInRyYW5zZm9ybSIsCVNFVFRJTkdfUlcsCVRZUEVfSU5ULAkwLAkzLAkxLAkJMSwJCSZzY3NpLT50cmFuc2Zvcm0sCU5VTEwpOwotCWlkZV9hZGRfc2V0dGluZyhkcml2ZSwJImxvZyIsCQlTRVRUSU5HX1JXLAlUWVBFX0lOVCwJMCwJMSwJMSwJCTEsCQkmc2NzaS0+bG9nLAkJTlVMTCk7CisjZGVmaW5lIGlkZV9zY3NpX2RldnNldF9nZXQobmFtZSwgZmllbGQpIFwKK3N0YXRpYyBpbnQgZ2V0XyMjbmFtZShpZGVfZHJpdmVfdCAqZHJpdmUpIFwKK3sgXAorCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7IFwKKwlyZXR1cm4gc2NzaS0+ZmllbGQ7IFwKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRlc2NzaV9hZGRfc2V0dGluZ3MoaWRlX2RyaXZlX3QgKmRyaXZlKSB7IDsgfQorCisjZGVmaW5lIGlkZV9zY3NpX2RldnNldF9zZXQobmFtZSwgZmllbGQpIFwKK3N0YXRpYyBpbnQgc2V0XyMjbmFtZShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpIFwKK3sgXAorCWlkZXNjc2lfc2NzaV90ICpzY3NpID0gZHJpdmVfdG9faWRlc2NzaShkcml2ZSk7IFwKKwlzY3NpLT5maWVsZCA9IGFyZzsgXAorCXJldHVybiAwOyBcCit9CisKKyNkZWZpbmUgaWRlX3Njc2lfZGV2c2V0X3J3X2ZpZWxkKF9uYW1lLCBfZmllbGQpIFwKK2lkZV9zY3NpX2RldnNldF9nZXQoX25hbWUsIF9maWVsZCk7IFwKK2lkZV9zY3NpX2RldnNldF9zZXQoX25hbWUsIF9maWVsZCk7IFwKK0lERV9ERVZTRVQoX25hbWUsIERTX1NZTkMsIGdldF8jI19uYW1lLCBzZXRfIyNfbmFtZSk7CisKK2lkZV9kZXZzZXRfcndfZmllbGQoYmlvc19jeWwsIGJpb3NfY3lsKTsKK2lkZV9kZXZzZXRfcndfZmllbGQoYmlvc19oZWFkLCBiaW9zX2hlYWQpOworaWRlX2RldnNldF9yd19maWVsZChiaW9zX3NlY3QsIGJpb3Nfc2VjdCk7CisKK2lkZV9zY3NpX2RldnNldF9yd19maWVsZCh0cmFuc2Zvcm0sIHRyYW5zZm9ybSk7CitpZGVfc2NzaV9kZXZzZXRfcndfZmllbGQobG9nLCBsb2cpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wcm9jX2RldnNldCBpZGVzY3NpX3NldHRpbmdzW10gPSB7CisJSURFX1BST0NfREVWU0VUKGJpb3NfY3lsLCAgMCwgMTAyMyksCisJSURFX1BST0NfREVWU0VUKGJpb3NfaGVhZCwgMCwgIDI1NSksCisJSURFX1BST0NfREVWU0VUKGJpb3Nfc2VjdCwgMCwJNjMpLAorCUlERV9QUk9DX0RFVlNFVChsb2csCSAgIDAsCSAxKSwKKwlJREVfUFJPQ19ERVZTRVQodHJhbnNmb3JtLCAwLAkgMyksCisJeyAwIH0sCit9OwogI2VuZGlmCiAKIC8qCkBAIC00NTIsMTYgKzM4NSwxNiBAQAogICovCiBzdGF0aWMgdm9pZCBpZGVzY3NpX3NldHVwIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZXNjc2lfc2NzaV90ICpzY3NpKQogewotCWlmIChkcml2ZS0+aWQgJiYgKGRyaXZlLT5pZC0+Y29uZmlnICYgMHgwMDYwKSA9PSAweDIwKQotCQlzZXRfYml0KElERV9BRkxBR19EUlFfSU5URVJSVVBULCAmZHJpdmUtPmF0YXBpX2ZsYWdzKTsKIAljbGVhcl9iaXQoSURFU0NTSV9TR19UUkFOU0ZPUk0sICZzY3NpLT50cmFuc2Zvcm0pOwogI2lmIElERVNDU0lfREVCVUdfTE9HCiAJc2V0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpOwogI2VuZGlmIC8qIElERVNDU0lfREVCVUdfTE9HICovCiAKLQlkcml2ZS0+cGNfY2FsbGJhY2sgPSBpZGVfc2NzaV9jYWxsYmFjazsKKwlkcml2ZS0+cGNfY2FsbGJhY2sJID0gaWRlX3Njc2lfY2FsbGJhY2s7CisJZHJpdmUtPnBjX3VwZGF0ZV9idWZmZXJzID0gTlVMTDsKKwlkcml2ZS0+cGNfaW9fYnVmZmVycwkgPSBpZGVfaW9fYnVmZmVyczsKIAotCWlkZXNjc2lfYWRkX3NldHRpbmdzKGRyaXZlKTsKKwlpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsIHNjc2ktPmRyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGlkZV9zY3NpX3JlbW92ZShpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC00ODEsNyArNDE0LDcgQEAKIAogCWlkZV9zY3NpX3B1dChzY3NpKTsKIAotCWRyaXZlLT5zY3NpID0gMDsKKwlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfU0NTSTsKIH0KIAogc3RhdGljIGludCBpZGVfc2NzaV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKQEAgLTUwMiwxMyArNDM1LDEyIEBACiAJLnByb2JlCQkJPSBpZGVfc2NzaV9wcm9iZSwKIAkucmVtb3ZlCQkJPSBpZGVfc2NzaV9yZW1vdmUsCiAJLnZlcnNpb24JCT0gSURFU0NTSV9WRVJTSU9OLAotCS5tZWRpYQkJCT0gaWRlX3Njc2ksCi0JLnN1cHBvcnRzX2RzY19vdmVybGFwCT0gMCwKIAkuZG9fcmVxdWVzdAkJPSBpZGVzY3NpX2RvX3JlcXVlc3QsCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZXNjc2lfZW5kX3JlcXVlc3QsCiAJLmVycm9yICAgICAgICAgICAgICAgICAgPSBpZGVzY3NpX2F0YXBpX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwogCS5wcm9jCQkJPSBpZGVzY3NpX3Byb2MsCisJLnNldHRpbmdzCQk9IGlkZXNjc2lfc2V0dGluZ3MsCiAjZW5kaWYKIH07CiAKQEAgLTYxMiw3ICs1NDQsNyBAQAogCXBjLT5yZXFfeGZlciA9IHBjLT5idWZfc2l6ZSA9IHNjc2lfYnVmZmxlbihjbWQpOwogCXBjLT5zY3NpX2NtZCA9IGNtZDsKIAlwYy0+ZG9uZSA9IGRvbmU7Ci0JcGMtPnRpbWVvdXQgPSBqaWZmaWVzICsgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOworCXBjLT50aW1lb3V0ID0gamlmZmllcyArIGNtZC0+cmVxdWVzdC0+dGltZW91dDsKIAogCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKSB7CiAJCXByaW50ayAoImlkZS1zY3NpOiAlczogcXVlICVsdSwgY21kID0gIiwgZHJpdmUtPm5hbWUsIGNtZC0+c2VyaWFsX251bWJlcik7CkBAIC02NDcsNiArNTc5LDggQEAKIAlpbnQJCWJ1c3k7CiAJaW50ICAgICAgICAgICAgIHJldCAgID0gRkFJTEVEOwogCisJc3RydWN0IGlkZV9hdGFwaV9wYyAqcGM7CisKIAkvKiBJbiBpZGVzY3NpX2VoX2Fib3J0IHdlIHRyeSB0byBnZW50bHkgcHJ5IG91ciBjb21tYW5kIGZyb20gdGhlIGlkZSBzdWJzeXN0ZW0gKi8KIAogCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQpAQCAtNjY3LDI2ICs2MDEsMjcgQEAKIAlzcGluX2xvY2tfaXJxKCZpZGVfbG9jayk7CiAKIAkvKiBJZiB0aGVyZSBpcyBubyBwYyBydW5uaW5nIHdlJ3JlIGRvbmUgKG91ciBpbnRlcnJ1cHQgdG9vayBjYXJlIG9mIGl0KSAqLwotCWlmICghc2NzaS0+cGMpIHsKKwlwYyA9IGRyaXZlLT5wYzsKKwlpZiAocGMgPT0gTlVMTCkgewogCQlyZXQgPSBTVUNDRVNTOwogCQlnb3RvIGlkZV91bmxvY2s7CiAJfQogCiAJLyogSXQncyBzb21ld2hlcmUgaW4gZmxpZ2h0LiBEb2VzIGlkZSBzdWJzeXN0ZW0gYWdyZWU/ICovCi0JaWYgKHNjc2ktPnBjLT5zY3NpX2NtZC0+c2VyaWFsX251bWJlciA9PSBjbWQtPnNlcmlhbF9udW1iZXIgJiYgIWJ1c3kgJiYKLQkgICAgZWx2X3F1ZXVlX2VtcHR5KGRyaXZlLT5xdWV1ZSkgJiYgSFdHUk9VUChkcml2ZSktPnJxICE9IHNjc2ktPnBjLT5ycSkgeworCWlmIChwYy0+c2NzaV9jbWQtPnNlcmlhbF9udW1iZXIgPT0gY21kLT5zZXJpYWxfbnVtYmVyICYmICFidXN5ICYmCisJICAgIGVsdl9xdWV1ZV9lbXB0eShkcml2ZS0+cXVldWUpICYmIEhXR1JPVVAoZHJpdmUpLT5ycSAhPSBwYy0+cnEpIHsKIAkJLyoKIAkJICogRklYTUUgLSBub3Qgc3VyZSB0aGlzIGNvbmRpdGlvbiBjYW4gZXZlciBvY2N1cgogCQkgKi8KIAkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLXNjc2k6IGNtZCBhYm9ydGVkIVxuIik7CiAKLQkJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHNjc2ktPnBjLT5ycSkpCi0JCQlrZnJlZShzY3NpLT5wYy0+YnVmKTsKKwkJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHBjLT5ycSkpCisJCQlrZnJlZShwYy0+YnVmKTsKIAkJLyogd2UgbmVlZCB0byBjYWxsIGJsa19wdXRfcmVxdWVzdCB0d2ljZS4gKi8KLQkJYmxrX3B1dF9yZXF1ZXN0KHNjc2ktPnBjLT5ycSk7Ci0JCWJsa19wdXRfcmVxdWVzdChzY3NpLT5wYy0+cnEpOwotCQlrZnJlZShzY3NpLT5wYyk7Ci0JCXNjc2ktPnBjID0gTlVMTDsKKwkJYmxrX3B1dF9yZXF1ZXN0KHBjLT5ycSk7CisJCWJsa19wdXRfcmVxdWVzdChwYy0+cnEpOworCQlrZnJlZShwYyk7CisJCWRyaXZlLT5wYyA9IE5VTEw7CiAKIAkJcmV0ID0gU1VDQ0VTUzsKIAl9CkBAIC03MDgsNiArNjQzLDggQEAKIAlpbnQgICAgICAgICAgICAgcmVhZHkgPSAwOwogCWludCAgICAgICAgICAgICByZXQgICA9IFNVQ0NFU1M7CiAKKwlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYzsKKwogCS8qIEluIGlkZXNjc2lfZWhfcmVzZXQgd2UgZm9yY2VmdWxseSByZW1vdmUgdGhlIGNvbW1hbmQgZnJvbSB0aGUgaWRlIHN1YnN5c3RlbSBhbmQgcmVzZXQgdGhlIGRldmljZS4gKi8KIAogCWlmICh0ZXN0X2JpdChJREVTQ1NJX0xPR19DTUQsICZzY3NpLT5sb2cpKQpAQCAtNzIyLDcgKzY1OSw5IEBACiAJc3Bpbl9sb2NrX2lycShjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKIAlzcGluX2xvY2soJmlkZV9sb2NrKTsKIAotCWlmICghc2NzaS0+cGMgfHwgKHJlcSA9IHNjc2ktPnBjLT5ycSkgIT0gSFdHUk9VUChkcml2ZSktPnJxIHx8ICFIV0dST1VQKGRyaXZlKS0+aGFuZGxlcikgeworCXBjID0gZHJpdmUtPnBjOworCisJaWYgKHBjID09IE5VTEwgfHwgKHJlcSA9IHBjLT5ycSkgIT0gSFdHUk9VUChkcml2ZSktPnJxIHx8ICFIV0dST1VQKGRyaXZlKS0+aGFuZGxlcikgewogCQlwcmludGsgKEtFUk5fV0FSTklORyAiaWRlLXNjc2k6IE5vIGFjdGl2ZSByZXF1ZXN0IGluIGlkZXNjc2lfZWhfcmVzZXRcbiIpOwogCQlzcGluX3VubG9jaygmaWRlX2xvY2spOwogCQlzcGluX3VubG9ja19pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7CkBAIC03MzMsOSArNjcyLDkgQEAKIAlpZiAoX19ibGtfZW5kX3JlcXVlc3QocmVxLCAtRUlPLCAwKSkKIAkJQlVHKCk7CiAJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHJlcSkpCi0JCWtmcmVlKHNjc2ktPnBjLT5idWYpOwotCWtmcmVlKHNjc2ktPnBjKTsKLQlzY3NpLT5wYyA9IE5VTEw7CisJCWtmcmVlKHBjLT5idWYpOworCWtmcmVlKHBjKTsKKwlkcml2ZS0+cGMgPSBOVUxMOwogCWJsa19wdXRfcmVxdWVzdChyZXEpOwogCiAJLyogbm93IG51a2UgdGhlIGRyaXZlIHF1ZXVlICovCkBAIC04MTEsNiArNzUwLDcgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZzsKIAlzdGF0aWMgaW50IHdhcm5lZDsKIAlpbnQgZXJyID0gLUVOT01FTTsKKwl1MTYgbGFzdF9sdW47CiAKIAlpZiAoIXdhcm5lZCAmJiBkcml2ZS0+bWVkaWEgPT0gaWRlX2Nkcm9tKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlkZS1zY3NpIGlzIGRlcHJlY2F0ZWQgZm9yIGNkIGJ1cm5pbmchIFVzZSBpZGUtY2QgYW5kIGdpdmUgZGV2PS9kZXYvaGRYIGFzIGRldmljZVxuIik7CkBAIC04MjEsMTIgKzc2MSwxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghc3Ryc3RyKCJpZGUtc2NzaSIsIGRyaXZlLT5kcml2ZXJfcmVxKSB8fAotCSAgICAhZHJpdmUtPnByZXNlbnQgfHwKIAkgICAgZHJpdmUtPm1lZGlhID09IGlkZV9kaXNrIHx8CiAJICAgICEoaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmaWRlc2NzaV90ZW1wbGF0ZSxzaXplb2YoaWRlc2NzaV9zY3NpX3QpKSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZHJpdmUtPnNjc2kgPSAxOworCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX1NDU0k7CiAKIAlnID0gYWxsb2NfZGlzaygxIDw8IFBBUlROX0JJVFMpOwogCWlmICghZykKQEAgLTgzNiwxMiArNzc1LDEyIEBACiAKIAlob3N0LT5tYXhfaWQgPSAxOwogCi0JaWYgKGRyaXZlLT5pZC0+bGFzdF9sdW4pCi0JCWRlYnVnX2xvZygiJXM6IGlkLT5sYXN0X2x1bj0ldVxuIiwgZHJpdmUtPm5hbWUsCi0JCQkgIGRyaXZlLT5pZC0+bGFzdF9sdW4pOworCWxhc3RfbHVuID0gZHJpdmUtPmlkW0FUQV9JRF9MQVNUX0xVTl07CisJaWYgKGxhc3RfbHVuKQorCQlkZWJ1Z19sb2coIiVzOiBsYXN0X2x1bj0ldVxuIiwgZHJpdmUtPm5hbWUsIGxhc3RfbHVuKTsKIAotCWlmICgoZHJpdmUtPmlkLT5sYXN0X2x1biAmIDB4NykgIT0gNykKLQkJaG9zdC0+bWF4X2x1biA9IChkcml2ZS0+aWQtPmxhc3RfbHVuICYgMHg3KSArIDE7CisJaWYgKChsYXN0X2x1biAmIDcpICE9IDcpCisJCWhvc3QtPm1heF9sdW4gPSAobGFzdF9sdW4gJiA3KSArIDE7CiAJZWxzZQogCQlob3N0LT5tYXhfbHVuID0gMTsKIApAQCAtODUyLDcgKzc5MSw2IEBACiAJaWRlc2NzaS0+aG9zdCA9IGhvc3Q7CiAJaWRlc2NzaS0+ZGlzayA9IGc7CiAJZy0+cHJpdmF0ZV9kYXRhID0gJmlkZXNjc2ktPmRyaXZlcjsKLQlpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoZHJpdmUsICZpZGVzY3NpX2RyaXZlcik7CiAJZXJyID0gMDsKIAlpZGVzY3NpX3NldHVwKGRyaXZlLCBpZGVzY3NpKTsKIAlnLT5mb3BzID0gJmlkZXNjc2lfb3BzOwpAQCAtODY4LDcgKzgwNiw3IEBACiAKIAlwdXRfZGlzayhnKTsKIG91dF9ob3N0X3B1dDoKLQlkcml2ZS0+c2NzaSA9IDA7CisJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1NDU0k7CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IGU3YTNhNjUuLmQzMGViN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTM2NzAsNyArMzY3MCw4IEBACiAJCQlzZGV2LT5ub191bGRfYXR0YWNoID0gMTsKIAkJfQogCQlpZiAoaXByX2lzX3ZzZXRfZGV2aWNlKHJlcykpIHsKLQkJCXNkZXYtPnRpbWVvdXQgPSBJUFJfVlNFVF9SV19USU1FT1VUOworCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwKKwkJCQkJICAgICBJUFJfVlNFVF9SV19USU1FT1VUKTsKIAkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlLCBJUFJfVlNFVF9NQVhfU0VDVE9SUyk7CiAJCX0KIAkJaWYgKGlwcl9pc192c2V0X2RldmljZShyZXMpIHx8IGlwcl9pc19zY3NpX2Rpc2socmVzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHMuYyBiL2RyaXZlcnMvc2NzaS9pcHMuYwppbmRleCBiYzllNmRkLi5lZjY4M2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXBzLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwcy5jCkBAIC0zODE4LDcgKzM4MTgsNyBAQAogCQlzY2ItPmNtZC5kY2RiLnNlZ21lbnRfNEcgPSAwOwogCQlzY2ItPmNtZC5kY2RiLmVuaGFuY2VkX3NnID0gMDsKIAotCQlUaW1lT3V0ID0gc2NiLT5zY3NpX2NtZC0+dGltZW91dF9wZXJfY29tbWFuZDsKKwkJVGltZU91dCA9IHNjYi0+c2NzaV9jbWQtPnJlcXVlc3QtPnRpbWVvdXQ7CiAKIAkJaWYgKGhhLT5zdWJzeXMtPnBhcmFtWzRdICYgMHgwMDEwMDAwMCkgewkvKiBJZiBORVcgVGFwZSBEQ0RCIGlzIFN1cHBvcnRlZCAqLwogCQkJaWYgKCFzY2ItPnNnX2xlbikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCAyOTllMDc1Li5kYTdiNjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAkJaWYgKGx1biA9PSB0YXNrLT5zYy0+ZGV2aWNlLT5sdW4gfHwgbHVuID09IC0xKSB7CiAJCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIGluIHByb2dyZXNzIHNjICVwIGl0dCAweCV4XG4iLAogCQkJCSAgIHRhc2stPnNjLCB0YXNrLT5pdHQpOwotCQkJZmFpbF9jb21tYW5kKGNvbm4sIHRhc2ssIERJRF9CVVNfQlVTWSA8PCAxNik7CisJCQlmYWlsX2NvbW1hbmQoY29ubiwgdGFzaywgZXJyb3IgPDwgMTYpOwogCQl9CiAJfQogfQpAQCAtMTQ3NiwxMiArMTQ3NiwxMiBAQAogCQlzY3NpX3F1ZXVlX3dvcmsoY29ubi0+c2Vzc2lvbi0+aG9zdCwgJmNvbm4tPnhtaXR3b3JrKTsKIH0KIAotc3RhdGljIGVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gaXNjc2lfZWhfY21kX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQorc3RhdGljIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBpc2NzaV9laF9jbWRfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CiAJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKLQllbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuIHJjID0gRUhfTk9UX0hBTkRMRUQ7CisJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHJjID0gQkxLX0VIX05PVF9IQU5ETEVEOwogCiAJY2xzX3Nlc3Npb24gPSBzdGFyZ2V0X3RvX3Nlc3Npb24oc2NzaV90YXJnZXQoc2NtZC0+ZGV2aWNlKSk7CiAJc2Vzc2lvbiA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOwpAQCAtMTQ5NCwxNCArMTQ5NCwxNCBAQAogCQkgKiBXZSBhcmUgcHJvYmFibHkgaW4gdGhlIG1pZGRsZSBvZiBpc2NzaSByZWNvdmVyeSBzbyBsZXQKIAkJICogdGhhdCBjb21wbGV0ZSBhbmQgaGFuZGxlIHRoZSBlcnJvci4KIAkJICovCi0JCXJjID0gRUhfUkVTRVRfVElNRVI7CisJCXJjID0gQkxLX0VIX1JFU0VUX1RJTUVSOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJY29ubiA9IHNlc3Npb24tPmxlYWRjb25uOwogCWlmICghY29ubikgewogCQkvKiBJbiB0aGUgbWlkZGxlIG9mIHNodXRpbmcgZG93biAqLwotCQlyYyA9IEVIX1JFU0VUX1RJTUVSOworCQlyYyA9IEJMS19FSF9SRVNFVF9USU1FUjsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMTUxMywyMCArMTUxMywyMSBAQAogCSAqLwogCWlmICh0aW1lX2JlZm9yZV9lcShjb25uLT5sYXN0X3JlY3YgKyAoY29ubi0+cmVjdl90aW1lb3V0ICogSFopICsKIAkJCSAgICAoY29ubi0+cGluZ190aW1lb3V0ICogSFopLCBqaWZmaWVzKSkKLQkJcmMgPSBFSF9SRVNFVF9USU1FUjsKKwkJcmMgPSBCTEtfRUhfUkVTRVRfVElNRVI7CiAJLyoKIAkgKiBpZiB3ZSBhcmUgYWJvdXQgdG8gY2hlY2sgdGhlIHRyYW5zcG9ydCB0aGVuIGdpdmUgdGhlIGNvbW1hbmQKIAkgKiBtb3JlIHRpbWUKIAkgKi8KIAlpZiAodGltZV9iZWZvcmVfZXEoY29ubi0+bGFzdF9yZWN2ICsgKGNvbm4tPnJlY3ZfdGltZW91dCAqIEhaKSwKIAkJCSAgIGppZmZpZXMpKQotCQlyYyA9IEVIX1JFU0VUX1RJTUVSOworCQlyYyA9IEJMS19FSF9SRVNFVF9USU1FUjsKIAkvKiBpZiBpbiB0aGUgbWlkZGxlIG9mIGNoZWNraW5nIHRoZSB0cmFuc3BvcnQgdGhlbiBnaXZlIHVzIG1vcmUgdGltZSAqLwogCWlmIChjb25uLT5waW5nX3Rhc2spCi0JCXJjID0gRUhfUkVTRVRfVElNRVI7CisJCXJjID0gQkxLX0VIX1JFU0VUX1RJTUVSOwogZG9uZToKIAlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7Ci0JZGVidWdfc2NzaSgicmV0dXJuICVzXG4iLCByYyA9PSBFSF9SRVNFVF9USU1FUiA/ICJ0aW1lciByZXNldCIgOiAibmgiKTsKKwlkZWJ1Z19zY3NpKCJyZXR1cm4gJXNcbiIsIHJjID09IEJMS19FSF9SRVNFVF9USU1FUiA/CisJCQkJCSJ0aW1lciByZXNldCIgOiAibmgiKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKaW5kZXggNDhlZThjNy4uZTE1NTAxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMKQEAgLTI5NCwxMCArMjk0LDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNhc19hdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4sCitzdGF0aWMgaW50IHNhc19hdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwKIAkJCSAgICAgIHUzMiB2YWwpCiB7Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGxpbmstPmFwLT5wcml2YXRlX2RhdGE7CiAKIAlTQVNfRFBSSU5USygiU1RVQiAlc1xuIiwgX19mdW5jX18pOwogCXN3aXRjaCAoc2NfcmVnX2luKSB7CkBAIC0zMTksMTAgKzMxOSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhc19hdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwKK3N0YXRpYyBpbnQgc2FzX2F0YV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWdfaW4sCiAJCQkgICAgdTMyICp2YWwpCiB7Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGxpbmstPmFwLT5wcml2YXRlX2RhdGE7CiAKIAlTQVNfRFBSSU5USygiU1RVQiAlc1xuIiwgX19mdW5jX18pOwogCXN3aXRjaCAoc2NfcmVnX2luKSB7CkBAIC0zOTgsNyArMzk4LDcgQEAKIAogCS8qIEJvdW5jZSBTQ1NJLWluaXRpYXRlZCBjb21tYW5kcyB0byB0aGUgU0NTSSBFSCAqLwogCWlmIChxYy0+c2NzaWNtZCkgewotCQlzY3NpX3JlcV9hYm9ydF9jbWQocWMtPnNjc2ljbWQpOworCQlibGtfYWJvcnRfcmVxdWVzdChxYy0+c2NzaWNtZC0+cmVxdWVzdCk7CiAJCXNjc2lfc2NoZWR1bGVfZWgocWMtPnNjc2ljbWQtPmRldmljZS0+aG9zdCk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbnRlcm5hbC5oIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW50ZXJuYWwuaAppbmRleCBiNGY5MzY4Li4wMDAxMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2ludGVybmFsLmgKQEAgLTU1LDcgKzU1LDcgQEAKIGludCAgc2FzX3JlZ2lzdGVyX3BvcnRzKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEpOwogdm9pZCBzYXNfdW5yZWdpc3Rlcl9wb3J0cyhzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhKTsKIAotZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBzYXNfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK2VudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzYXNfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqKTsKIAogaW50ICBzYXNfaW5pdF9xdWV1ZShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhKTsKIGludCAgc2FzX2luaXRfZXZlbnRzKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwppbmRleCBhOGUzZWYzLi43NDQ4Mzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwpAQCAtNjczLDQzICs2NzMsNDMgQEAKIAlyZXR1cm47CiB9CiAKLWVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gc2FzX3Njc2lfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK2VudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzYXNfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IFRPX1NBU19UQVNLKGNtZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghdGFzaykgewotCQljbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLz0gMjsKKwkJY21kLT5yZXF1ZXN0LT50aW1lb3V0IC89IDI7CiAJCVNBU19EUFJJTlRLKCJjb21tYW5kIDB4JXAsIHRhc2sgMHglcCwgZ29uZTogJXNcbiIsCi0JCQkgICAgY21kLCB0YXNrLCAoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kID8KLQkJCSAgICAiRUhfUkVTRVRfVElNRVIiIDogIkVIX05PVF9IQU5ETEVEIikpOwotCQlpZiAoIWNtZC0+dGltZW91dF9wZXJfY29tbWFuZCkKLQkJCXJldHVybiBFSF9OT1RfSEFORExFRDsKLQkJcmV0dXJuIEVIX1JFU0VUX1RJTUVSOworCQkJICAgIGNtZCwgdGFzaywgKGNtZC0+cmVxdWVzdC0+dGltZW91dCA/CisJCQkgICAgIkJMS19FSF9SRVNFVF9USU1FUiIgOiAiQkxLX0VIX05PVF9IQU5ETEVEIikpOworCQlpZiAoIWNtZC0+cmVxdWVzdC0+dGltZW91dCkKKwkJCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7CisJCXJldHVybiBCTEtfRUhfUkVTRVRfVElNRVI7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwogCUJVR19PTih0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCk7CiAJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlTQVNfRFBSSU5USygiY29tbWFuZCAweCVwLCB0YXNrIDB4JXAsIHRpbWVkIG91dDogRUhfSEFORExFRFxuIiwKLQkJCSAgICBjbWQsIHRhc2spOwotCQlyZXR1cm4gRUhfSEFORExFRDsKKwkJU0FTX0RQUklOVEsoImNvbW1hbmQgMHglcCwgdGFzayAweCVwLCB0aW1lZCBvdXQ6ICIKKwkJCSAgICAiQkxLX0VIX0hBTkRMRURcbiIsIGNtZCwgdGFzayk7CisJCXJldHVybiBCTEtfRUhfSEFORExFRDsKIAl9CiAJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX0FUX0lOSVRJQVRPUikpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCVNBU19EUFJJTlRLKCJjb21tYW5kIDB4JXAsIHRhc2sgMHglcCwgbm90IGF0IGluaXRpYXRvcjogIgotCQkJICAgICJFSF9SRVNFVF9USU1FUlxuIiwKKwkJCSAgICAiQkxLX0VIX1JFU0VUX1RJTUVSXG4iLAogCQkJICAgIGNtZCwgdGFzayk7Ci0JCXJldHVybiBFSF9SRVNFVF9USU1FUjsKKwkJcmV0dXJuIEJMS19FSF9SRVNFVF9USU1FUjsKIAl9CiAJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9BQk9SVEVEOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwogCi0JU0FTX0RQUklOVEsoImNvbW1hbmQgMHglcCwgdGFzayAweCVwLCB0aW1lZCBvdXQ6IEVIX05PVF9IQU5ETEVEXG4iLAorCVNBU19EUFJJTlRLKCJjb21tYW5kIDB4JXAsIHRhc2sgMHglcCwgdGltZWQgb3V0OiBCTEtfRUhfTk9UX0hBTkRMRURcbiIsCiAJCSAgICBjbWQsIHRhc2spOwogCi0JcmV0dXJuIEVIX05PVF9IQU5ETEVEOworCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7CiB9CiAKIGludCBzYXNfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNjc2lfcmVxX2Fib3J0X2NtZChzYyk7CisJYmxrX2Fib3J0X3JlcXVlc3Qoc2MtPnJlcXVlc3QpOwogCXNjc2lfc2NoZWR1bGVfZWgoc2MtPmRldmljZS0+aG9zdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYwppbmRleCA5N2I3NjMzLi5hZmUxZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jCkBAIC0xMTY3LDcgKzExNjcsNyBAQAogICogY21kIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZC4KICAqLwogc3RhdGljIGVudW0KLXNjc2lfZWhfdGltZXJfcmV0dXJuIG1lZ2FzYXNfcmVzZXRfdGltZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK2Jsa19laF90aW1lcl9yZXR1cm4gbWVnYXNhc19yZXNldF90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewogCXN0cnVjdCBtZWdhc2FzX2NtZCAqY21kID0gKHN0cnVjdCBtZWdhc2FzX2NtZCAqKXNjbWQtPlNDcC5wdHI7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHNjbWQtPmppZmZpZXNfYXRfYWxsb2MgKwogCQkJCShNRUdBU0FTX0RFRkFVTFRfQ01EX1RJTUVPVVQgKiAyKSAqIEhaKSkgewotCQlyZXR1cm4gRUhfTk9UX0hBTkRMRUQ7CisJCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7CiAJfQogCiAJaW5zdGFuY2UgPSBjbWQtPmluc3RhbmNlOwpAQCAtMTE4OSw3ICsxMTg5LDcgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl9Ci0JcmV0dXJuIEVIX1JFU0VUX1RJTUVSOworCXJldHVybiBCTEtfRUhfUkVTRVRfVElNRVI7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCmluZGV4IGM1N2M5NGMuLjNiNzI0MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYworKysgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKQEAgLTQxNzAsOCArNDE3MCw4IEBACiAJKioKIAkqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkqLwotCWlmIChucC0+c2V0dGxlX3RpbWUgJiYgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kID49IEhaKSB7Ci0JCXVfbG9uZyB0bGltaXQgPSBqaWZmaWVzICsgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC0gSFo7CisJaWYgKG5wLT5zZXR0bGVfdGltZSAmJiBjbWQtPnJlcXVlc3QtPnRpbWVvdXQgPj0gSFopIHsKKwkJdV9sb25nIHRsaW1pdCA9IGppZmZpZXMgKyBjbWQtPnJlcXVlc3QtPnRpbWVvdXQgLSBIWjsKIAkJaWYgKHRpbWVfYWZ0ZXIobnAtPnNldHRsZV90aW1lLCB0bGltaXQpKQogCQkJbnAtPnNldHRsZV90aW1lID0gdGxpbWl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9vc3N0LmMgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCmluZGV4IDFjNzlmOTcuLjBlYTc4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9vc3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL29zc3QuYwpAQCAtNTcwOCw3ICs1NzA4LDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpvc3N0X21lbWJlcjsKIAlpbnQgZXJyOwogCi0Jb3NzdF9tZW1iZXIgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEob3NzdF9zeXNmc19jbGFzcywgZGV2aWNlLCBkZXYsIFNUcCwgIiVzIiwgbmFtZSk7CisJb3NzdF9tZW1iZXIgPSBkZXZpY2VfY3JlYXRlKG9zc3Rfc3lzZnNfY2xhc3MsIGRldmljZSwgZGV2LCBTVHAsCisJCQkJICAgICIlcyIsIG5hbWUpOwogCWlmIChJU19FUlIob3NzdF9tZW1iZXIpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9zc3QgOlc6IFVuYWJsZSB0byBhZGQgc3lzZnMgY2xhc3MgbWVtYmVyICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIFBUUl9FUlIob3NzdF9tZW1iZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKaW5kZXggMmRkMGRjOS4uMTY1ZmY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCkBAIC0xNDAsNDQgKzE0MCw0MSBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IGFoYTE1MnhfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQl1bnNpZ25lZCBpbnQgdmNjLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwkvKiBGb3IgTmV3IE1lZGlhIFQmSiwgbG9vayBmb3IgYSBTQ1NJIHdpbmRvdyAqLworCWlmIChjZmctPmlvLndpblswXS5sZW4gPj0gMHgyMCkKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmZy0+aW8ud2luWzBdLmJhc2U7CisJZWxzZSBpZiAoKGNmZy0+aW8ubndpbiA+IDEpICYmCisJCSAoY2ZnLT5pby53aW5bMV0ubGVuID49IDB4MjApKQorCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMV0uYmFzZTsKKwlpZiAoKGNmZy0+aW8ubndpbiA+IDApICYmCisJICAgIChwX2Rldi0+aW8uQmFzZVBvcnQxIDwgMHhmZmZmKSkgeworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBhaGExNTJ4X2NvbmZpZ19jcyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKICAgICBzY3NpX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IGFoYTE1Mnhfc2V0dXAgczsKLSAgICB0dXBsZV90IHR1cGxlOwotICAgIGNpc3BhcnNlX3QgcGFyc2U7Ci0gICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOwotICAgIHVfY2hhciB0dXBsZV9kYXRhWzY0XTsKKyAgICBpbnQgbGFzdF9yZXQsIGxhc3RfZm47CiAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKLSAgICAKKwogICAgIERFQlVHKDAsICJhaGExNTJ4X2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICB0dXBsZS5UdXBsZURhdGEgPSB0dXBsZV9kYXRhOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpICE9IDAgfHwKLQkJcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQotCSAgICBnb3RvIG5leHRfZW50cnk7Ci0JLyogRm9yIE5ldyBNZWRpYSBUJkosIGxvb2sgZm9yIGEgU0NTSSB3aW5kb3cgKi8KLQlpZiAocGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuID49IDB4MjApCi0JICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmJhc2U7Ci0JZWxzZSBpZiAoKHBhcnNlLmNmdGFibGVfZW50cnkuaW8ubndpbiA+IDEpICYmCi0JCSAocGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMV0ubGVuID49IDB4MjApKQotCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblsxXS5iYXNlOwotCWlmICgocGFyc2UuY2Z0YWJsZV9lbnRyeS5pby5ud2luID4gMCkgJiYKLQkgICAgKGxpbmstPmlvLkJhc2VQb3J0MSA8IDB4ZmZmZikpIHsKLQkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7Ci0JICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKLQl9Ci0gICAgbmV4dF9lbnRyeToKLQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKTsKKyAgICBsYXN0X3JldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBhaGExNTJ4X2NvbmZpZ19jaGVjaywgTlVMTCk7CisgICAgaWYgKGxhc3RfcmV0KSB7CisJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBsYXN0X3JldCk7CisJZ290byBmYWlsZWQ7CiAgICAgfQotICAgIAorCiAgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKICAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpOwogICAgIApAQCAtMjA4LDYgKzIwNSw3IEBACiAKIGNzX2ZhaWxlZDoKICAgICBjc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CiAgICAgYWhhMTUyeF9yZWxlYXNlX2NzKGxpbmspOwogICAgIHJldHVybiAtRU5PREVWOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKaW5kZXggZDhiOTkzNS4uMDYyNTRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCkBAIC0xMjMsMzQgKzEyMywzMCBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IGZkb21haW5fY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQl1bnNpZ25lZCBpbnQgdmNjLAorCQkJCXZvaWQgKnByaXZfZGF0YSkKK3sKKwlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2ZnLT5pby53aW5bMF0uYmFzZTsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pOworfQorCisKIHN0YXRpYyBpbnQgZmRvbWFpbl9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAgICAgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47Ci0gICAgdV9jaGFyIHR1cGxlX2RhdGFbNjRdOworICAgIGludCBsYXN0X3JldCwgbGFzdF9mbjsKICAgICBjaGFyIHN0clsyMl07CiAgICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAogICAgIERFQlVHKDAsICJmZG9tYWluX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICB0dXBsZS5UdXBsZURhdGEgPSB0dXBsZV9kYXRhOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCi0JICAgIGdvdG8gbmV4dF9lbnRyeTsKLQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKLQlsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5iYXNlOwotCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOwotICAgIG5leHRfZW50cnk6Ci0JQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKSk7CisgICAgbGFzdF9yZXQgPSBwY21jaWFfbG9vcF9jb25maWcobGluaywgZmRvbWFpbl9jb25maWdfY2hlY2ssIE5VTEwpOworICAgIGlmIChsYXN0X3JldCkgeworCSAgICBjc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGxhc3RfcmV0KTsKKwkgICAgZ290byBmYWlsZWQ7CiAgICAgfQogCiAgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKQEAgLTE4MSw2ICsxNzcsNyBAQAogCiBjc19mYWlsZWQ6CiAgICAgY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgogICAgIGZkb21haW5fcmVsZWFzZShsaW5rKTsKICAgICByZXR1cm4gLUVOT0RFVjsKIH0gLyogZmRvbWFpbl9jb25maWcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCmluZGV4IDI0ZTZjYjgzLi4xMWE2MWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKQEAgLTE2MDYsMTMzICsxNjA2LDEyOSBAQAogICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQogICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCi1kbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0cnVjdCBuc3BfY3NfY29uZmlnZGF0YSB7CisJbnNwX2h3X2RhdGEJCSpkYXRhOworCXdpbl9yZXFfdAkJcmVxOworfTsKKworc3RhdGljIGludCBuc3BfY3NfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdHJ1Y3QgbnNwX2NzX2NvbmZpZ2RhdGEgKmNmZ19tZW0gPSBwcml2X2RhdGE7CisKKwlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLworCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQlwX2Rldi0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwl9CisKKwkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KKwlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJaWYgKHZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZWxzZSBpZiAoZGZsdC0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAodmNjICE9IGRmbHQtPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCXBfZGV2LT5jb25mLlZwcCA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQl9IGVsc2UgaWYgKGRmbHQtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgeworCQkJcF9kZXYtPmNvbmYuVnBwID0KKwkJCQlkZmx0LT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCQl9CisKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LT5pcnEuSVJRSW5mbzEpCisJCQlwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKworCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOworCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJCQlwX2Rldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJCXBfZGV2LT5pby5BdHRyaWJ1dGVzMiA9IHBfZGV2LT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlwX2Rldi0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKwkJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQl9CisKKwkJaWYgKChjZmctPm1lbS5ud2luID4gMCkgfHwgKGRmbHQtPm1lbS5ud2luID4gMCkpIHsKKwkJCW1lbXJlcV90CW1hcDsKKwkJCWNpc3RwbF9tZW1fdAkqbWVtID0KKwkJCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC0+bWVtOworCQkJY2ZnX21lbS0+cmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ007CisJCQljZmdfbWVtLT5yZXEuQXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOworCQkJY2ZnX21lbS0+cmVxLkJhc2UgPSBtZW0tPndpblswXS5ob3N0X2FkZHI7CisJCQljZmdfbWVtLT5yZXEuU2l6ZSA9IG1lbS0+d2luWzBdLmxlbjsKKwkJCWlmIChjZmdfbWVtLT5yZXEuU2l6ZSA8IDB4MTAwMCkKKwkJCQljZmdfbWVtLT5yZXEuU2l6ZSA9IDB4MTAwMDsKKwkJCWNmZ19tZW0tPnJlcS5BY2Nlc3NTcGVlZCA9IDA7CisJCQlpZiAocGNtY2lhX3JlcXVlc3Rfd2luZG93KCZwX2RldiwgJmNmZ19tZW0tPnJlcSwgJnBfZGV2LT53aW4pICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQkJbWFwLlBhZ2UgPSAwOyBtYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKKwkJCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKHBfZGV2LT53aW4sICZtYXApICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCisJCQljZmdfbWVtLT5kYXRhLT5NbWlvQWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwX25vY2FjaGUoY2ZnX21lbS0+cmVxLkJhc2UsIGNmZ19tZW0tPnJlcS5TaXplKTsKKwkJCWNmZ19tZW0tPmRhdGEtPk1taW9MZW5ndGggID0gY2ZnX21lbS0+cmVxLlNpemU7CisJCX0KKwkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCQlyZXR1cm4gMDsKKwl9CisKK25leHRfZW50cnk6CisJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgIm5leHQiKTsKKwlwY21jaWFfZGlzYWJsZV9kZXZpY2UocF9kZXYpOworCXJldHVybiAtRU5PREVWOworfQorCiBzdGF0aWMgaW50IG5zcF9jc19jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCiB7CiAJaW50CQkgIHJldDsKIAlzY3NpX2luZm9fdAkgKmluZm8JID0gbGluay0+cHJpdjsKLQl0dXBsZV90CQkgIHR1cGxlOwotCWNpc3BhcnNlX3QJICBwYXJzZTsKLQlpbnQJCSAgbGFzdF9yZXQsIGxhc3RfZm47Ci0JdW5zaWduZWQgY2hhcgkgIHR1cGxlX2RhdGFbNjRdOwotCWNvbmZpZ19pbmZvX3QJICBjb25mOwotCXdpbl9yZXFfdCAgICAgICAgIHJlcTsKLQltZW1yZXFfdCAgICAgICAgICBtYXA7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJc3RydWN0IG5zcF9jc19jb25maWdkYXRhICpjZmdfbWVtOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJbnNwX2h3X2RhdGEgICAgICAqZGF0YSA9ICZuc3BfZGF0YV9iYXNlOwogCiAJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluIik7CiAKLQl0dXBsZS5BdHRyaWJ1dGVzICAgICAgPSAwOwotCXR1cGxlLlR1cGxlRGF0YQkgICAgICA9IHR1cGxlX2RhdGE7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ICAgID0gc2l6ZW9mKHR1cGxlX2RhdGEpOwotCXR1cGxlLlR1cGxlT2Zmc2V0ICAgICA9IDA7CisJY2ZnX21lbSA9IGt6YWxsb2Moc2l6ZW9mKGNmZ19tZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmZ19tZW0pCisJCXJldHVybiAtRU5PTUVNOworCWNmZ19tZW0tPmRhdGEgPSBkYXRhOwogCi0JLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KLQlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKLQotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQotCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQkJCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIHsgZGZsdCA9ICpjZmc7IH0KLQkJaWYgKGNmZy0+aW5kZXggPT0gMCkgeyBnb3RvIG5leHRfZW50cnk7IH0KLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0KLQkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCi0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwotCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKLQkJfQotCi0JCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLwotCQkvKiAgTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KLQkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlpZiAoY29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwKSB7Ci0JCQkJZ290byBuZXh0X2VudHJ5OwotCQkJfQotCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlpZiAoY29uZi5WY2MgIT0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwKSB7Ci0JCQkJZ290byBuZXh0X2VudHJ5OwotCQkJfQotCQl9Ci0KLQkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQl9IGVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkJZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQl9Ci0KLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkgewotCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQkJfQotCi0JCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgewotCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOwotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSAhPSAwKQotCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJfQotCi0JCWlmICgoY2ZnLT5tZW0ubndpbiA+IDApIHx8IChkZmx0Lm1lbS5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9tZW1fdCAqbWVtID0KLQkJCQkoY2ZnLT5tZW0ubndpbikgPyAmY2ZnLT5tZW0gOiAmZGZsdC5tZW07Ci0JCQlyZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTTsKLQkJCXJlcS5BdHRyaWJ1dGVzIHw9IFdJTl9FTkFCTEU7Ci0JCQlyZXEuQmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKLQkJCXJlcS5TaXplID0gbWVtLT53aW5bMF0ubGVuOwotCQkJaWYgKHJlcS5TaXplIDwgMHgxMDAwKSB7Ci0JCQkJcmVxLlNpemUgPSAweDEwMDA7Ci0JCQl9Ci0JCQlyZXEuQWNjZXNzU3BlZWQgPSAwOwotCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluaywgJnJlcSwgJmxpbmstPndpbikgIT0gMCkKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQltYXAuUGFnZSA9IDA7IG1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOwotCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQotCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQotCQkJZGF0YS0+TW1pb0FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocmVxLkJhc2UsIHJlcS5TaXplKTsKLQkJCWRhdGEtPk1taW9MZW5ndGggID0gcmVxLlNpemU7Ci0JCX0KLQkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLwotCQlicmVhazsKLQotCW5leHRfZW50cnk6Ci0JCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJuZXh0Iik7Ci0JCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKLQkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JfQorCXJldCA9IHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBuc3BfY3NfY29uZmlnX2NoZWNrLCBjZmdfbWVtKTsKKwkJZ290byBjc19mYWlsZWQ7CiAKIAlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7Ci0JCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CisJCWlmIChwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpCisJCQlnb3RvIGNzX2ZhaWxlZDsKIAl9Ci0JQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKKworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOworCWlmIChyZXQpCisJCWdvdG8gY3NfZmFpbGVkOwogCiAJaWYgKGZyZWVfcG9ydHMpIHsKIAkJaWYgKGxpbmstPmlvLkJhc2VQb3J0MSkgewpAQCAtMTc5MCwyMCArMTc4NiwyMCBAQAogCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCiAJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwogCWlmIChsaW5rLT53aW4pCi0JCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLkJhc2UsCi0JCSAgICAgICByZXEuQmFzZStyZXEuU2l6ZS0xKTsKKwkJcHJpbnRrKCIsIG1lbSAweCUwNmx4LTB4JTA2bHgiLCBjZmdfbWVtLT5yZXEuQmFzZSwKKwkJICAgICAgIGNmZ19tZW0tPnJlcS5CYXNlK2NmZ19tZW0tPnJlcS5TaXplLTEpOwogCXByaW50aygiXG4iKTsKIAorCWtmcmVlKGNmZ19tZW0pOwogCXJldHVybiAwOwogCiAgY3NfZmFpbGVkOgogCW5zcF9kYmcoTlNQX0RFQlVHX0lOSVQsICJjb25maWcgZmFpbCIpOwotCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIAluc3BfY3NfcmVsZWFzZShsaW5rKTsKKwlrZnJlZShjZmdfbWVtKTsKIAogCXJldHVybiAtRU5PREVWOwogfSAvKiBuc3BfY3NfY29uZmlnICovCi0jdW5kZWYgQ1NfQ0hFQ0sKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwppbmRleCA2N2M1YTU4Li4yMGMzZTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCkBAIC0xOTUsMzkgKzE5NSwzMyBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IHFsb2dpY19jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZywKKwkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICAgICAgdm9pZCAqcHJpdl9kYXRhKQoreworCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZmctPmlvLndpblswXS5iYXNlOworCXBfZGV2LT5pby5OdW1Qb3J0czEgPSBjZmctPmlvLndpblswXS5sZW47CisKKwlpZiAocF9kZXYtPmlvLkJhc2VQb3J0MSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhwX2RldiwgJnBfZGV2LT5pbyk7Cit9CisKIHN0YXRpYyBpbnQgcWxvZ2ljX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIGxpbmspCiB7CiAJc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OwotCXR1cGxlX3QgdHVwbGU7Ci0JY2lzcGFyc2VfdCBwYXJzZTsKLQlpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47Ci0JdW5zaWduZWQgc2hvcnQgdHVwbGVfZGF0YVszMl07CisJaW50IGxhc3RfcmV0LCBsYXN0X2ZuOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAKIAlERUJVRygwLCAicWxvZ2ljX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLQlpbmZvLT5tYW5mX2lkID0gbGluay0+bWFuZl9pZDsKLQotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgdHVwbGVfZGF0YTsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXdoaWxlICgxKSB7Ci0JCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSAhPSAwIHx8Ci0JCQkJcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSAhPSAwKQotCQkJZ290byBuZXh0X2VudHJ5OwotCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKLQkJbGluay0+aW8uQmFzZVBvcnQxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0uYmFzZTsKLQkJbGluay0+aW8uTnVtUG9ydHMxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuOwotCQlpZiAobGluay0+aW8uQmFzZVBvcnQxICE9IDApIHsKLQkJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKLQkJCQlicmVhazsKLQkJfQotCSAgICAgIG5leHRfZW50cnk6Ci0JCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOworCWxhc3RfcmV0ID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHFsb2dpY19jb25maWdfY2hlY2ssIE5VTEwpOworCWlmIChsYXN0X3JldCkgeworCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGxhc3RfcmV0KTsKKwkJZ290byBmYWlsZWQ7CiAJfQogCiAJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKQEAgLTI2Miw2ICsyNTYsNyBAQAogY3NfZmFpbGVkOgogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CitmYWlsZWQ6CiAJcmV0dXJuIC1FTk9ERVY7CiAKIH0JCQkJLyogcWxvZ2ljX2NvbmZpZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKaW5kZXggMGJlMjMyYi4uYjMzMGMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCkBAIC03MDAsMTUgKzcwMCwyNyBAQAogI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCiBkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQogCitzdGF0aWMgaW50IFNZTTUzQzUwMF9jb25maWdfY2hlY2soc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnLAorCQkJCSAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkJICB2b2lkICpwcml2X2RhdGEpCit7CisJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmZy0+aW8ud2luWzBdLmJhc2U7CisJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGNmZy0+aW8ud2luWzBdLmxlbjsKKworCWlmIChwX2Rldi0+aW8uQmFzZVBvcnQxID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKK30KKwogc3RhdGljIGludAogU1lNNTNDNTAwX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgc2NzaV9pbmZvX3QgKmluZm8gPSBsaW5rLT5wcml2OwotCXR1cGxlX3QgdHVwbGU7Ci0JY2lzcGFyc2VfdCBwYXJzZTsKLQlpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisJaW50IGxhc3RfcmV0LCBsYXN0X2ZuOwogCWludCBpcnFfbGV2ZWwsIHBvcnRfYmFzZTsKLQl1bnNpZ25lZCBzaG9ydCB0dXBsZV9kYXRhWzMyXTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgPSAmc3ltNTNjNTAwX2RyaXZlcl90ZW1wbGF0ZTsKIAlzdHJ1Y3Qgc3ltNTNjNTAwX2RhdGEgKmRhdGE7CkBAIC03MTcsMjcgKzcyOSwxMCBAQAogCiAJaW5mby0+bWFuZl9pZCA9IGxpbmstPm1hbmZfaWQ7CiAKLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopdHVwbGVfZGF0YTsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXdoaWxlICgxKSB7Ci0JCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSAhPSAwIHx8Ci0JCSAgICBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0JCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OwotCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5iYXNlOwotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlvLndpblswXS5sZW47Ci0KLQkJaWYgKGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwKSB7Ci0JCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKTsKLQkJCWlmIChpID09IENTX1NVQ0NFU1MpCi0JCQkJYnJlYWs7Ci0JCX0KLW5leHRfZW50cnk6Ci0JCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOworCWxhc3RfcmV0ID0gcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIFNZTTUzQzUwMF9jb25maWdfY2hlY2ssIE5VTEwpOworCWlmIChsYXN0X3JldCkgeworCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGxhc3RfcmV0KTsKKwkJZ290byBmYWlsZWQ7CiAJfQogCiAJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKQEAgLTgzMSw2ICs4MjYsNyBAQAogCiBjc19mYWlsZWQ6CiAJY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgogCVNZTTUzQzUwMF9yZWxlYXNlKGxpbmspOwogCXJldHVybiAtRU5PREVWOwogfSAvKiBTWU01M0M1MDBfY29uZmlnICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwppbmRleCAzN2Y5YmEwLi5iNmNkMTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKQEAgLTI4NDUsNyArMjg0NSw3IEBACiAJbWVtc2V0KCgoY2hhciAqKXBrdCArIDgpLCAwLCAoUkVRVUVTVF9FTlRSWV9TSVpFIC0gOCkpOwogCiAJLyogU2V0IElTUCBjb21tYW5kIHRpbWVvdXQuICovCi0JcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kL0haKTsKKwlwa3QtPnRpbWVvdXQgPSBjcHVfdG9fbGUxNihjbWQtPnJlcXVlc3QtPnRpbWVvdXQvSFopOwogCiAJLyogU2V0IGRldmljZSB0YXJnZXQgSUQgYW5kIExVTiAqLwogCXBrdC0+bHVuID0gU0NTSV9MVU5fMzIoY21kKTsKQEAgLTMxMTQsNyArMzExNCw3IEBACiAJbWVtc2V0KCgoY2hhciAqKXBrdCArIDgpLCAwLCAoUkVRVUVTVF9FTlRSWV9TSVpFIC0gOCkpOwogCiAJLyogU2V0IElTUCBjb21tYW5kIHRpbWVvdXQuICovCi0JcGt0LT50aW1lb3V0ID0gY3B1X3RvX2xlMTYoY21kLT50aW1lb3V0X3Blcl9jb21tYW5kL0haKTsKKwlwa3QtPnRpbWVvdXQgPSBjcHVfdG9fbGUxNihjbWQtPnJlcXVlc3QtPnRpbWVvdXQvSFopOwogCiAJLyogU2V0IGRldmljZSB0YXJnZXQgSUQgYW5kIExVTiAqLwogCXBrdC0+bHVuID0gU0NTSV9MVU5fMzIoY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDQ1ZTdkY2IuLjBkZGZlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMjkyLDEwICsyOTIsMTEgQEAKIAkJdmFsaWQgPSAwOwogCQlpZiAoaGEtPm9wdHJvbV9zaXplID09IE9QVFJPTV9TSVpFXzIzMDAgJiYgc3RhcnQgPT0gMCkKIAkJCXZhbGlkID0gMTsKLQkJZWxzZSBpZiAoc3RhcnQgPT0gKEZBX0JPT1RfQ09ERV9BRERSKjQpIHx8Ci0JCSAgICBzdGFydCA9PSAoRkFfUklTQ19DT0RFX0FERFIqNCkpCisJCWVsc2UgaWYgKHN0YXJ0ID09IChoYS0+Zmx0X3JlZ2lvbl9ib290ICogNCkgfHwKKwkJICAgIHN0YXJ0ID09IChoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKQogCQkJdmFsaWQgPSAxOwotCQllbHNlIGlmIChJU19RTEEyNVhYKGhhKSAmJiBzdGFydCA9PSAoRkFfVlBEX05WUkFNX0FERFIqNCkpCisJCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpICYmCisJCSAgICBzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fdnBkX252cmFtICogNCkpCiAJCSAgICB2YWxpZCA9IDE7CiAJCWlmICghdmFsaWQpIHsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKQEAgLTEwNjUsNiArMTA2Niw4IEBACiAJCXBmY19ob3N0X3N0YXQtPmR1bXBlZF9mcmFtZXMgPSBzdGF0cy0+ZHVtcGVkX2ZyYW1lczsKIAkJcGZjX2hvc3Rfc3RhdC0+bm9zX2NvdW50ID0gc3RhdHMtPm5vc19yY3ZkOwogCX0KKwlwZmNfaG9zdF9zdGF0LT5mY3BfaW5wdXRfbWVnYWJ5dGVzID0gaGEtPnFsYV9zdGF0cy5pbnB1dF9ieXRlcyA+PiAyMDsKKwlwZmNfaG9zdF9zdGF0LT5mY3Bfb3V0cHV0X21lZ2FieXRlcyA9IGhhLT5xbGFfc3RhdHMub3V0cHV0X2J5dGVzID4+IDIwOwogCiBkb25lX2ZyZWU6CiAgICAgICAgIGRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHN0YXRzLCBzdGF0c19kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IDk0YTcyMGUuLjgzYzgxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Flci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgpAQCAtMjE1Nyw2ICsyMTU2LDggQEAKIAogc3RydWN0IHFsYV9zdGF0aXN0aWNzIHsKIAl1aW50MzJfdCB0b3RhbF9pc3BfYWJvcnRzOworCXVpbnQ2NF90IGlucHV0X2J5dGVzOworCXVpbnQ2NF90IG91dHB1dF9ieXRlczsKIH07CiAKIC8qCkBAIC0yMjM4LDYgKzIyMzksNyBAQAogI2RlZmluZSBGQ1BPUlRfVVBEQVRFX05FRURFRAkyNwogI2RlZmluZSBWUF9EUENfTkVFREVECQkyOAkvKiB3YWtlIHVwIGZvciBWUCBkcGMgaGFuZGxpbmcgKi8KICNkZWZpbmUgVU5MT0FESU5HCQkyOQorI2RlZmluZSBOUElWX0NPTkZJR19ORUVERUQJMzAKIAogCXVpbnQzMl90CWRldmljZV9mbGFnczsKICNkZWZpbmUgREZMR19MT0NBTF9ERVZJQ0VTCQlCSVRfMApAQCAtMjUwNyw3ICsyNTA5LDYgQEAKIAl1aW50NjRfdAlmY2Vfd3IsIGZjZV9yZDsKIAlzdHJ1Y3QgbXV0ZXgJZmNlX211dGV4OwogCi0JdWludDMyX3QJaHdfZXZlbnRfc3RhcnQ7CiAJdWludDMyX3QJaHdfZXZlbnRfcHRyOwogCXVpbnQzMl90CWh3X2V2ZW50X3BhdXNlX2Vycm9yczsKIApAQCAtMjU1Myw2ICsyNTU0LDE0IEBACiAJdWludDMyX3QJZmR0X3VucHJvdGVjdF9zZWNfY21kOwogCXVpbnQzMl90CWZkdF9wcm90ZWN0X3NlY19jbWQ7CiAKKwl1aW50MzJfdAlmbHRfcmVnaW9uX2ZsdDsKKwl1aW50MzJfdAlmbHRfcmVnaW9uX2ZkdDsKKwl1aW50MzJfdAlmbHRfcmVnaW9uX2Jvb3Q7CisJdWludDMyX3QJZmx0X3JlZ2lvbl9mdzsKKwl1aW50MzJfdAlmbHRfcmVnaW9uX3ZwZF9udnJhbTsKKwl1aW50MzJfdAlmbHRfcmVnaW9uX2h3X2V2ZW50OworCXVpbnQzMl90CWZsdF9yZWdpb25fbnBpdl9jb25mOworCiAJLyogTmVlZGVkIGZvciBCRUFDT04gKi8KIAl1aW50MTZfdAliZWFjb25fYmxpbmtfbGVkOwogCXVpbnQ4X3QJCWJlYWNvbl9jb2xvcl9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKaW5kZXggY2YxOTQ1MS4uZDFkMTQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKQEAgLTc4OSwxNCArNzg5LDIzIEBACiAjZGVmaW5lIEZBX1JJU0NfQ09ERV9BRERSCTB4MjAwMDAKICNkZWZpbmUgRkFfUklTQ19DT0RFX1NFR01FTlRTCTIKIAorI2RlZmluZSBGQV9GTEFTSF9ERVNDUl9BRERSXzI0CTB4MTEwMDAKKyNkZWZpbmUgRkFfRkxBU0hfTEFZT1VUX0FERFJfMjQJMHgxMTQwMAorI2RlZmluZSBGQV9OUElWX0NPTkYwX0FERFJfMjQJMHgxNjAwMAorI2RlZmluZSBGQV9OUElWX0NPTkYxX0FERFJfMjQJMHgxNzAwMAorCiAjZGVmaW5lIEZBX0ZXX0FSRUFfQUREUgkJMHg0MDAwMAogI2RlZmluZSBGQV9WUERfTlZSQU1fQUREUgkweDQ4MDAwCiAjZGVmaW5lIEZBX0ZFQVRVUkVfQUREUgkJMHg0QzAwMAogI2RlZmluZSBGQV9GTEFTSF9ERVNDUl9BRERSCTB4NTAwMDAKKyNkZWZpbmUgRkFfRkxBU0hfTEFZT1VUX0FERFIJMHg1MDQwMAogI2RlZmluZSBGQV9IV19FVkVOVDBfQUREUgkweDU0MDAwCi0jZGVmaW5lIEZBX0hXX0VWRU5UMV9BRERSCTB4NTQyMDAKKyNkZWZpbmUgRkFfSFdfRVZFTlQxX0FERFIJMHg1NDQwMAogI2RlZmluZSBGQV9IV19FVkVOVF9TSVpFCTB4MjAwCiAjZGVmaW5lIEZBX0hXX0VWRU5UX0VOVFJZX1NJWkUJNAorI2RlZmluZSBGQV9OUElWX0NPTkYwX0FERFIJMHg1QzAwMAorI2RlZmluZSBGQV9OUElWX0NPTkYxX0FERFIJMHg1RDAwMAorCiAvKgogICogRmxhc2ggRXJyb3IgTG9nIEV2ZW50IENvZGVzLgogICovCkBAIC04MDYsMTAgKzgxNSw2IEBACiAjZGVmaW5lIEhXX0VWRU5UX05WUkFNX0NIS1NVTV9FUlIJMHhGMDIzCiAjZGVmaW5lIEhXX0VWRU5UX0ZMQVNIX0ZXX0VSUgkweEYwMjQKIAotI2RlZmluZSBGQV9CT09UX0xPR19BRERSCTB4NTgwMDAKLSNkZWZpbmUgRkFfRldfRFVNUDBfQUREUgkweDYwMDAwCi0jZGVmaW5lIEZBX0ZXX0RVTVAxX0FERFIJMHg3MDAwMAotCiAJdWludDMyX3QgZmxhc2hfZGF0YTsJCS8qIEZsYXNoL05WUkFNIEJJT1MgZGF0YS4gKi8KIAogCXVpbnQzMl90IGN0cmxfc3RhdHVzOwkJLyogQ29udHJvbC9TdGF0dXMuICovCkBAIC0xMjAzLDYgKzEyMDgsNjIgQEAKIAl1aW50OF90IHVudXNlZDJbNjVdOwogfTsKIAorLyogRmxhc2ggTGF5b3V0IFRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbiB7CisJdWludDhfdCBzaWdbNF07CisJdWludDMyX3Qgc3RhcnRfbG87CisJdWludDMyX3Qgc3RhcnRfaGk7CisJdWludDE2X3QgdW51c2VkOworCXVpbnQxNl90IGNoZWNrc3VtOworfTsKKworc3RydWN0IHFsYV9mbHRfaGVhZGVyIHsKKwl1aW50MTZfdCB2ZXJzaW9uOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCBjaGVja3N1bTsKKwl1aW50MTZfdCB1bnVzZWQ7Cit9OworCisjZGVmaW5lIEZMVF9SRUdfRlcJCTB4MDEKKyNkZWZpbmUgRkxUX1JFR19CT09UX0NPREUJMHgwNworI2RlZmluZSBGTFRfUkVHX1ZQRF8wCQkweDE0CisjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMAkJMHgxNQorI2RlZmluZSBGTFRfUkVHX1ZQRF8xCQkweDE2CisjZGVmaW5lIEZMVF9SRUdfTlZSQU1fMQkJMHgxNworI2RlZmluZSBGTFRfUkVHX0ZEVAkJMHgxYQorI2RlZmluZSBGTFRfUkVHX0ZMVAkJMHgxYworI2RlZmluZSBGTFRfUkVHX0hXX0VWRU5UXzAJMHgxZAorI2RlZmluZSBGTFRfUkVHX0hXX0VWRU5UXzEJMHgxZgorI2RlZmluZSBGTFRfUkVHX05QSVZfQ09ORl8wCTB4MjkKKyNkZWZpbmUgRkxUX1JFR19OUElWX0NPTkZfMQkweDJhCisKK3N0cnVjdCBxbGFfZmx0X3JlZ2lvbiB7CisJdWludDMyX3QgY29kZTsKKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IHN0YXJ0OworCXVpbnQzMl90IGVuZDsKK307CisKKy8qIEZsYXNoIE5QSVYgQ29uZmlndXJhdGlvbiBUYWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHFsYV9ucGl2X2hlYWRlciB7CisJdWludDhfdCBzaWdbMl07CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCBlbnRyaWVzOworCXVpbnQxNl90IHVudXNlZFs0XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK307CisKK3N0cnVjdCBxbGFfbnBpdl9lbnRyeSB7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3QgdmZfaWQ7CisJdWludDE2X3QgcW9zOworCXVpbnQxNl90IHVudXNlZDE7CisJdWludDhfdCBwb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsKK307CisKIC8qIDg0WFggU3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBNQkFfSVNQODRYWF9BTEVSVAkweDgwMGYgIC8qIEFsZXJ0IE5vdGlmaWNhdGlvbi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAppbmRleCAwYjE1NjczLi43NTNkYmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC0zMTMsOSArMzEzLDExIEBACiBleHRlcm4gaW50IHFsYTJ4eHhfaHdfZXZlbnRfbG9nKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAsIHVpbnQxNl90LAogICAgIHVpbnQxNl90LCB1aW50MTZfdCk7CiAKLWV4dGVybiB2b2lkIHFsYTJ4eHhfZ2V0X2ZsYXNoX2luZm8oc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGEyeHh4X2dldF9mbGFzaF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiBpbnQgcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKHNjc2lfcWxhX2hvc3RfdCAqLCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKIAorZXh0ZXJuIHZvaWQgcWxhMnh4eF9mbGFzaF9ucGl2X2NvbmYoc2NzaV9xbGFfaG9zdF90ICopOworCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2RiZy5jIHNvdXJjZSBmaWxlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBlZTg5ZGRkLi5hNDcwZjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTgzLDYgKzgzLDEzIEBACiAKIAloYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSk7CiAKKwlydmFsID0gcWxhMnh4eF9nZXRfZmxhc2hfaW5mbyhoYSk7CisJaWYgKHJ2YWwpIHsKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gdmFsaWRhdGUgRkxBU0ggZGF0YS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubykpOworCQlyZXR1cm4gKHJ2YWwpOworCX0KKwogCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbihoYSwgaGEtPnJlcXVlc3RfcmluZyk7CiAKIAlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJDb25maWd1cmUgTlZSQU0gcGFyYW1ldGVycy4uLlxuIik7CkBAIC0xMDksNyArMTE2LDYgQEAKIAkJcnZhbCA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CiAJCWlmIChydmFsKQogCQkJcmV0dXJuIChydmFsKTsKLQkJcWxhMnh4eF9nZXRfZmxhc2hfaW5mbyhoYSk7CiAJfQogCWlmIChJU19RTEE4NFhYKGhhKSkgewogCQloYS0+Y3M4NHh4ID0gcWxhODR4eF9nZXRfY2hpcChoYSk7CkBAIC0yMDE2LDcgKzIwMjIsNyBAQAogCQlERUJVRzMocHJpbnRrKCIlczogZXhpdGluZyBub3JtYWxseVxuIiwgX19mdW5jX18pKTsKIAl9CiAKLQkvKiBSZXN0b3JlIHN0YXRlIGlmIGEgcmVzeW5jIGV2ZW50IG9jY3VyZWQgZHVyaW5nIHByb2Nlc3NpbmcgKi8KKwkvKiBSZXN0b3JlIHN0YXRlIGlmIGEgcmVzeW5jIGV2ZW50IG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nICovCiAJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CiAJCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnNhdmVfZmxhZ3MpKQogCQkJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOwpAQCAtMjU2MSw3ICsyNTY3LDcgQEAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKIAkvKiBUcnkgR0lEX1BUIHRvIGdldCBkZXZpY2UgbGlzdCwgZWxzZSBHQU4uICovCi0Jc3dsID0ga2NhbGxvYyhNQVhfRklCUkVfREVWSUNFUywgc2l6ZW9mKHN3X2luZm9fdCksIEdGUF9BVE9NSUMpOworCXN3bCA9IGtjYWxsb2MoTUFYX0ZJQlJFX0RFVklDRVMsIHNpemVvZihzd19pbmZvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN3bCkgewogCQkvKkVNUFRZKi8KIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgYWxsb2NhdGlvbnMgZmFpbGVkLCBmYWxsYmFjayAiCkBAIC0zNzUxLDcgKzM3NTcsNyBAQAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAogCXNlZ21lbnRzID0gRkFfUklTQ19DT0RFX1NFR01FTlRTOwotCWZhZGRyID0gRkFfUklTQ19DT0RFX0FERFI7CisJZmFkZHIgPSBoYS0+Zmx0X3JlZ2lvbl9mdzsKIAlkY29kZSA9ICh1aW50MzJfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CiAJKnNyaXNjX2FkZHIgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKaW5kZXggOTJmYWZiZC4uZTkwYWZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaApAQCAtNTIsNyArNTIsNyBAQAogICogQGhhOiBIQSBjb250ZXh0CiAgKiBAaGFfbG9ja2VkOiBpcyBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgaGFyZHdhcmUgbG9jawogICoKLSAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VyZWQsIGVsc2UgemVyby4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VycmVkLCBlbHNlIHplcm8uCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBxbGEyeDAwX2lzc3VlX21hcmtlcihzY3NpX3FsYV9ob3N0X3QgKmhhLCBpbnQgaGFfbG9ja2VkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKaW5kZXggZDU3NjY5YS4uODViYzBhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCkBAIC0yMSwxNyArMjEsMjIgQEAKICAqIFJldHVybnMgdGhlIHByb3BlciBDRl8qIGRpcmVjdGlvbiBiYXNlZCBvbiBDREIuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdWludDE2X3QKLXFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oc3RydWN0IHNjc2lfY21uZCAqY21kKQorcWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzcmJfdCAqc3ApCiB7CiAJdWludDE2X3QgY2ZsYWdzOwogCiAJY2ZsYWdzID0gMDsKIAogCS8qIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KLQlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCWlmIChzcC0+Y21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCWNmbGFncyA9IENGX1dSSVRFOwotCWVsc2UgaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQlzcC0+ZmNwb3J0LT5oYS0+cWxhX3N0YXRzLm91dHB1dF9ieXRlcyArPQorCQkgICAgc2NzaV9idWZmbGVuKHNwLT5jbWQpOworCX0gZWxzZSBpZiAoc3AtPmNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCWNmbGFncyA9IENGX1JFQUQ7CisJCXNwLT5mY3BvcnQtPmhhLT5xbGFfc3RhdHMuaW5wdXRfYnl0ZXMgKz0KKwkJICAgIHNjc2lfYnVmZmxlbihzcC0+Y21kKTsKKwl9CiAJcmV0dXJuIChjZmxhZ3MpOwogfQogCkBAIC0xNjksNyArMTc0LDcgQEAKIAogCWhhID0gc3AtPmhhOwogCi0JY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKGNtZCkpOworCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzcCkpOwogCiAJLyogVGhyZWUgRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb21tYW5kIFR5cGUgMiBJT0NCICovCiAJYXZhaWxfZHNkcyA9IDM7CkBAIC0yMjgsNyArMjMzLDcgQEAKIAogCWhhID0gc3AtPmhhOwogCi0JY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKGNtZCkpOworCWNtZF9wa3QtPmNvbnRyb2xfZmxhZ3MgfD0gY3B1X3RvX2xlMTYocWxhMngwMF9nZXRfY21kX2RpcmVjdGlvbihzcCkpOwogCiAJLyogVHdvIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29tbWFuZCBUeXBlIDMgSU9DQiAqLwogCWF2YWlsX2RzZHMgPSAyOwpAQCAtMjYyLDcgKzI2Nyw3IEBACiAgKiBxbGEyeDAwX3N0YXJ0X3Njc2koKSAtIFNlbmQgYSBTQ1NJIGNvbW1hbmQgdG8gdGhlIElTUAogICogQHNwOiBjb21tYW5kIHRvIHNlbmQgdG8gdGhlIElTUAogICoKLSAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VyZWQsIGVsc2UgemVyby4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgYSBmYWlsdXJlIG9jY3VycmVkLCBlbHNlIHplcm8uCiAgKi8KIGludAogcWxhMngwMF9zdGFydF9zY3NpKHNyYl90ICpzcCkKQEAgLTQwNyw3ICs0MTIsNyBAQAogICoKICAqIENhbiBiZSBjYWxsZWQgZnJvbSBib3RoIG5vcm1hbCBhbmQgaW50ZXJydXB0IGNvbnRleHQuCiAgKgotICogUmV0dXJucyBub24temVybyBpZiBhIGZhaWx1cmUgb2NjdXJlZCwgZWxzZSB6ZXJvLgorICogUmV0dXJucyBub24temVybyBpZiBhIGZhaWx1cmUgb2NjdXJyZWQsIGVsc2UgemVyby4KICAqLwogaW50CiBfX3FsYTJ4MDBfbWFya2VyKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGxvb3BfaWQsIHVpbnQxNl90IGx1biwKQEAgLTYyNSwxMiArNjMwLDE3IEBACiAJaGEgPSBzcC0+aGE7CiAKIAkvKiBTZXQgdHJhbnNmZXIgZGlyZWN0aW9uICovCi0JaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCWNtZF9wa3QtPnRhc2tfbWdtdF9mbGFncyA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KFRNRl9XUklURV9EQVRBKTsKLQllbHNlIGlmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJc3AtPmZjcG9ydC0+aGEtPnFsYV9zdGF0cy5vdXRwdXRfYnl0ZXMgKz0KKwkJICAgIHNjc2lfYnVmZmxlbihzcC0+Y21kKTsKKwl9IGVsc2UgaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCWNtZF9wa3QtPnRhc2tfbWdtdF9mbGFncyA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KFRNRl9SRUFEX0RBVEEpOworCQlzcC0+ZmNwb3J0LT5oYS0+cWxhX3N0YXRzLmlucHV0X2J5dGVzICs9CisJCSAgICBzY3NpX2J1ZmZsZW4oc3AtPmNtZCk7CisJfQogCiAJLyogT25lIERTRCBpcyBhdmFpbGFibGUgaW4gdGhlIENvbW1hbmQgVHlwZSAzIElPQ0IgKi8KIAlhdmFpbF9kc2RzID0gMTsKQEAgLTY2Niw3ICs2NzYsNyBAQAogICogcWxhMjR4eF9zdGFydF9zY3NpKCkgLSBTZW5kIGEgU0NTSSBjb21tYW5kIHRvIHRoZSBJU1AKICAqIEBzcDogY29tbWFuZCB0byBzZW5kIHRvIHRoZSBJU1AKICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cmVkLCBlbHNlIHplcm8uCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cnJlZCwgZWxzZSB6ZXJvLgogICovCiBpbnQKIHFsYTI0eHhfc3RhcnRfc2NzaShzcmJfdCAqc3ApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggNDVhM2I5My4uZmM0YmZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMzkxLDkgKzM5MSw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTElQX09DQ1VSUkVEOgkJLyogTG9vcCBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBMSVAgb2NjdXJlZCAoJXgpLlxuIiwgaGEtPmhvc3Rfbm8sCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTElQIG9jY3VycmVkICgleCkuXG4iLCBoYS0+aG9zdF9ubywKIAkJICAgIG1iWzFdKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxJUCBvY2N1cmVkICgleCkuXG4iLCBtYlsxXSk7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxJUCBvY2N1cnJlZCAoJXgpLlxuIiwgbWJbMV0pOwogCiAJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CkBAIC00NjAsNyArNDYwLDcgQEAKIAkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTElQIFJFU0VUICgleCkuXG4iLAogCQkgICAgaGEtPmhvc3Rfbm8sIG1iWzFdKSk7CiAJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJMSVAgcmVzZXQgb2NjdXJlZCAoJXgpLlxuIiwgbWJbMV0pOworCQkgICAgIkxJUCByZXNldCBvY2N1cnJlZCAoJXgpLlxuIiwgbWJbMV0pOwogCiAJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCQkJYXRvbWljX3NldCgmaGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CkBAIC01NDMsNyArNTQzLDcgQEAKIAogCWNhc2UgTUJBX1BPUlRfVVBEQVRFOgkJLyogUG9ydCBkYXRhYmFzZSB1cGRhdGUgKi8KIAkJLyoKLQkJICogSWYgUE9SVCBVUERBVEUgaXMgZ2xvYmFsIChyZWNpZXZlZCBMSVBfT0NDVVJFRC9MSVBfUkVTRVQKKwkJICogSWYgUE9SVCBVUERBVEUgaXMgZ2xvYmFsIChyZWNlaXZlZCBMSVBfT0NDVVJSRUQvTElQX1JFU0VUCiAJCSAqIGV2ZW50IGV0Yy4gZWFybGllciBpbmRpY2F0aW5nIGxvb3AgaXMgZG93bikgdGhlbiBwcm9jZXNzCiAJCSAqIGl0LiAgT3RoZXJ3aXNlIGlnbm9yZSBpdCBhbmQgV2FpdCBmb3IgUlNDTiB0byBjb21lIGluLgogCQkgKi8KQEAgLTU4OSw3ICs1ODksNyBAQAogCQkgICAgInNjc2koJWxkKTogUlNDTiBkYXRhYmFzZSBjaGFuZ2VkIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKIAkJICAgIGhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CiAKLQkJcnNjbl9lbnRyeSA9IChtYlsxXSA8PCAxNikgfCBtYlsyXTsKKwkJcnNjbl9lbnRyeSA9ICgobWJbMV0gJiAweGZmKSA8PCAxNikgfCBtYlsyXTsKIAkJaG9zdF9waWQgPSAoaGEtPmRfaWQuYi5kb21haW4gPDwgMTYpIHwgKGhhLT5kX2lkLmIuYXJlYSA8PCA4KSB8CiAJCSAgICBoYS0+ZF9pZC5iLmFsX3BhOwogCQlpZiAocnNjbl9lbnRyeSA9PSBob3N0X3BpZCkgewpAQCAtNjAwLDYgKzYwMCw4IEBACiAJCQlicmVhazsKIAkJfQogCisJCS8qIElnbm9yZSByZXNlcnZlZCBiaXRzIGZyb20gUlNDTi1wYXlsb2FkLiAqLworCQlyc2NuX2VudHJ5ID0gKChtYlsxXSAmIDB4M2ZmKSA8PCAxNikgfCBtYlsyXTsKIAkJcnNjbl9xdWV1ZV9pbmRleCA9IGhhLT5yc2NuX2luX3B0ciArIDE7CiAJCWlmIChyc2NuX3F1ZXVlX2luZGV4ID09IE1BWF9SU0NOX0NPVU5UKQogCQkJcnNjbl9xdWV1ZV9pbmRleCA9IDA7CkBAIC0xMDYwLDggKzEwNjIsOSBAQAogCQlyZXNpZCA9IHJlc2lkX2xlbjsKIAkJLyogVXNlIEYvVyBjYWxjdWxhdGVkIHJlc2lkdWFsIGxlbmd0aC4gKi8KIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKLQkJCWlmIChzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSICYmCi0JCQkgICAgcmVzaWQgIT0gZndfcmVzaWRfbGVuKSB7CisJCQlpZiAoIShzY3NpX3N0YXR1cyAmIFNTX1JFU0lEVUFMX1VOREVSKSkgeworCQkJCWxzY3NpX3N0YXR1cyA9IDA7CisJCQl9IGVsc2UgaWYgKHJlc2lkICE9IGZ3X3Jlc2lkX2xlbikgewogCQkJCXNjc2lfc3RhdHVzICY9IH5TU19SRVNJRFVBTF9VTkRFUjsKIAkJCQlsc2NzaV9zdGF0dXMgPSAwOwogCQkJfQpAQCAtMTgzNCw3ICsxODM3LDYgQEAKIAkJV1JUX1JFR19XT1JEKCZyZWctPmlzcC5oY2NyLCBIQ0NSX0NMUl9IT1NUX0lOVCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOwotCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOwogCiBmYWlsOgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggODEzYmM3Ny4uMzZiYzY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgc2NoZWR1bGUgIgogCQkJICAgICJpc3BfYWJvcnRfbmVlZGVkLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CiAJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VyZWQuIFNjaGVkdWxpbmcgSVNQICIKKwkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJyZWQuIFNjaGVkdWxpbmcgSVNQICIKIAkJCSAgICAiYWJvcnQuXG4iKTsKIAkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCQkJcWxhMnh4eF93YWtlX2RwYyhoYSk7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBjYWxsaW5nICIKIAkJCSAgICAiYWJvcnRfaXNwXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJlZC4gSXNzdWluZyBJU1AgIgorCQkJICAgICJNYWlsYm94IGNvbW1hbmQgdGltZW91dCBvY2N1cnJlZC4gSXNzdWluZyBJU1AgIgogCQkJICAgICJhYm9ydC5cbiIpOwogCiAJCQlzZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTE5OTUsNyArMTk5NSw3IEBACiAJY2hhciAqcG1hcDsKIAlkbWFfYWRkcl90IHBtYXBfZG1hOwogCi0JcG1hcCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfQVRPTUlDLCAmcG1hcF9kbWEpOworCXBtYXAgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnBtYXBfZG1hKTsKIAlpZiAocG1hcCAgPT0gTlVMTCkgewogCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6ICoqKiogTWVtIEFsbG9jIEZhaWxlZCAqKioqIiwKIAkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCAyNmFmZTQ0Li4zNDMzNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMTUxNyw2ICsxNTE3LDcgQEAKIAlzZXRfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCXNldF9iaXQoTE9DQUxfTE9PUF9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKIAlzZXRfYml0KFJTQ05fVVBEQVRFLCAmaGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChOUElWX0NPTkZJR19ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKIH0KIAogc3RhdGljIGludApAQCAtMTY2Myw4ICsxNjY0LDYgQEAKIAkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDg7CiAJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzI1WFg7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTI1eHhfaXNwX29wczsKLQkJaGEtPmh3X2V2ZW50X3N0YXJ0ID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pID8KLQkJICAgIEZBX0hXX0VWRU5UMV9BRERSOiBGQV9IV19FVkVOVDBfQUREUjsKIAl9CiAJaG9zdC0+Y2FuX3F1ZXVlID0gaGEtPnJlcXVlc3RfcV9sZW5ndGggKyAxMjg7CiAKQEAgLTE3NDAsNiArMTczOSw4IEBACiAJaWYgKHJldCkKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAKKwloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKKwogCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwogCiAJcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKGhhKTsKQEAgLTI0MzEsNiArMjQzMiwxMiBAQAogCQkJICAgIGhhLT5ob3N0X25vKSk7CiAJCX0KIAorCQlpZiAodGVzdF9iaXQoTlBJVl9DT05GSUdfTkVFREVELCAmaGEtPmRwY19mbGFncykgJiYKKwkJICAgIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9SRUFEWSkgeworCQkJY2xlYXJfYml0KE5QSVZfQ09ORklHX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOworCQkJcWxhMnh4eF9mbGFzaF9ucGl2X2NvbmYoaGEpOworCQl9CisKIAkJaWYgKCFoYS0+aW50ZXJydXB0c19vbikKIAkJCWhhLT5pc3Bfb3BzLT5lbmFibGVfaW50cnMoaGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggMWJjYTc0NC4uOTBhMTMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtNTQzLDIzICs1NDMsMTk4IEBACiAJfQogfQogCi12b2lkCi1xbGEyeHh4X2dldF9mbGFzaF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqaGEpCitzdGF0aWMgaW50CitxbGEyeHh4X2ZpbmRfZmx0X3N0YXJ0KHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQzMl90ICpzdGFydCkKK3sKKwljb25zdCBjaGFyICpsb2MsICpsb2NhdGlvbnNbXSA9IHsgIkRFRiIsICJQQ0kiIH07CisJdWludDMyX3QgcGNpaGRyLCBwY2lkczsKKwl1aW50MzJfdCAqZGNvZGU7CisJdWludDhfdCAqYnVmLCAqYmNvZGUsIGxhc3RfaW1hZ2U7CisJdWludDE2X3QgY250LCBjaGtzdW0sICp3cHRyOworCXN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uICpmbHRsOworCisJLyoKKwkgKiBGTFQtbG9jYXRpb24gc3RydWN0dXJlIHJlc2lkZXMgYWZ0ZXIgdGhlIGxhc3QgUENJIHJlZ2lvbi4KKwkgKi8KKworCS8qIEJlZ2luIHdpdGggc2FuZSBkZWZhdWx0cy4gKi8KKwlsb2MgPSBsb2NhdGlvbnNbMF07CisJKnN0YXJ0ID0gSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX0ZMQVNIX0xBWU9VVF9BRERSXzI0OgorCSAgICBGQV9GTEFTSF9MQVlPVVRfQUREUjsKKworCS8qIEJlZ2luIHdpdGggZmlyc3QgUENJIGV4cGFuc2lvbiBST00gaGVhZGVyLiAqLworCWJ1ZiA9ICh1aW50OF90ICopaGEtPnJlcXVlc3RfcmluZzsKKwlkY29kZSA9ICh1aW50MzJfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJcGNpaGRyID0gMDsKKwlsYXN0X2ltYWdlID0gMTsKKwlkbyB7CisJCS8qIFZlcmlmeSBQQ0kgZXhwYW5zaW9uIFJPTSBoZWFkZXIuICovCisJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgcGNpaGRyID4+IDIsIDB4MjApOworCQliY29kZSA9IGJ1ZiArIChwY2loZHIgJSA0KTsKKwkJaWYgKGJjb2RlWzB4MF0gIT0gMHg1NSB8fCBiY29kZVsweDFdICE9IDB4YWEpCisJCQlnb3RvIGVuZDsKKworCQkvKiBMb2NhdGUgUENJIGRhdGEgc3RydWN0dXJlLiAqLworCQlwY2lkcyA9IHBjaWhkciArICgoYmNvZGVbMHgxOV0gPDwgOCkgfCBiY29kZVsweDE4XSk7CisJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgcGNpZHMgPj4gMiwgMHgyMCk7CisJCWJjb2RlID0gYnVmICsgKHBjaWhkciAlIDQpOworCisJCS8qIFZhbGlkYXRlIHNpZ25hdHVyZSBvZiBQQ0kgZGF0YSBzdHJ1Y3R1cmUuICovCisJCWlmIChiY29kZVsweDBdICE9ICdQJyB8fCBiY29kZVsweDFdICE9ICdDJyB8fAorCQkgICAgYmNvZGVbMHgyXSAhPSAnSScgfHwgYmNvZGVbMHgzXSAhPSAnUicpCisJCQlnb3RvIGVuZDsKKworCQlsYXN0X2ltYWdlID0gYmNvZGVbMHgxNV0gJiBCSVRfNzsKKworCQkvKiBMb2NhdGUgbmV4dCBQQ0kgZXhwYW5zaW9uIFJPTS4gKi8KKwkJcGNpaGRyICs9ICgoYmNvZGVbMHgxMV0gPDwgOCkgfCBiY29kZVsweDEwXSkgKiA1MTI7CisJfSB3aGlsZSAoIWxhc3RfaW1hZ2UpOworCisJLyogTm93IHZlcmlmeSBGTFQtbG9jYXRpb24gc3RydWN0dXJlLiAqLworCWZsdGwgPSAoc3RydWN0IHFsYV9mbHRfbG9jYXRpb24gKiloYS0+cmVxdWVzdF9yaW5nOworCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgcGNpaGRyID4+IDIsCisJICAgIHNpemVvZihzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbikgPj4gMik7CisJaWYgKGZsdGwtPnNpZ1swXSAhPSAnUScgfHwgZmx0bC0+c2lnWzFdICE9ICdGJyB8fAorCSAgICBmbHRsLT5zaWdbMl0gIT0gJ0wnIHx8IGZsdGwtPnNpZ1szXSAhPSAnVCcpCisJCWdvdG8gZW5kOworCisJd3B0ciA9ICh1aW50MTZfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJY250ID0gc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uKSA+PiAxOworCWZvciAoY2hrc3VtID0gMDsgY250OyBjbnQtLSkKKwkJY2hrc3VtICs9IGxlMTZfdG9fY3B1KCp3cHRyKyspOworCWlmIChjaGtzdW0pIHsKKwkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCSAgICAiSW5jb25zaXN0ZW50IEZMVEwgZGV0ZWN0ZWQ6IGNoZWNrc3VtPTB4JXguXG4iLCBjaGtzdW0pOworCQlxbGEyeDAwX2R1bXBfYnVmZmVyKGJ1Ziwgc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uKSk7CisJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0KKworCS8qIEdvb2QgZGF0YS4gIFVzZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJbG9jID0gbG9jYXRpb25zWzFdOworCSpzdGFydCA9IGxlMTZfdG9fY3B1KGZsdGwtPnN0YXJ0X2hpKSA8PCAxNiB8CisJICAgIGxlMTZfdG9fY3B1KGZsdGwtPnN0YXJ0X2xvKTsKK2VuZDoKKwlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZMVExbJXNdID0gMHgleC5cbiIsIGxvYywgKnN0YXJ0KSk7CisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZAorcWxhMnh4eF9nZXRfZmx0X2luZm8oc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgZmx0X2FkZHIpCit7CisJY29uc3QgY2hhciAqbG9jLCAqbG9jYXRpb25zW10gPSB7ICJERUYiLCAiRkxUIiB9OworCXVpbnQxNl90ICp3cHRyOworCXVpbnQxNl90IGNudCwgY2hrc3VtOworCXVpbnQzMl90IHN0YXJ0OworCXN0cnVjdCBxbGFfZmx0X2hlYWRlciAqZmx0OworCXN0cnVjdCBxbGFfZmx0X3JlZ2lvbiAqcmVnaW9uOworCisJaGEtPmZsdF9yZWdpb25fZmx0ID0gZmx0X2FkZHI7CisJd3B0ciA9ICh1aW50MTZfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJZmx0ID0gKHN0cnVjdCBxbGFfZmx0X2hlYWRlciAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJcmVnaW9uID0gKHN0cnVjdCBxbGFfZmx0X3JlZ2lvbiAqKSZmbHRbMV07CisJaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKGhhLCAodWludDhfdCAqKWhhLT5yZXF1ZXN0X3JpbmcsCisJICAgIGZsdF9hZGRyIDw8IDIsIE9QVFJPTV9CVVJTVF9TSVpFKTsKKwlpZiAoKndwdHIgPT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweGZmZmYpKQorCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CisJaWYgKGZsdC0+dmVyc2lvbiAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEpKSB7CisJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnN1cHBvcnRlZCBGTFQgZGV0ZWN0ZWQ6ICIKKwkJICAgICJ2ZXJzaW9uPTB4JXggbGVuZ3RoPTB4JXggY2hlY2tzdW09MHgleC5cbiIsCisJCSAgICBsZTE2X3RvX2NwdShmbHQtPnZlcnNpb24pLCBsZTE2X3RvX2NwdShmbHQtPmxlbmd0aCksCisJCSAgICBsZTE2X3RvX2NwdShmbHQtPmNoZWNrc3VtKSkpOworCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CisJfQorCisJY250ID0gKHNpemVvZihzdHJ1Y3QgcWxhX2ZsdF9oZWFkZXIpICsgbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpKSA+PiAxOworCWZvciAoY2hrc3VtID0gMDsgY250OyBjbnQtLSkKKwkJY2hrc3VtICs9IGxlMTZfdG9fY3B1KCp3cHRyKyspOworCWlmIChjaGtzdW0pIHsKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkluY29uc2lzdGVudCBGTFQgZGV0ZWN0ZWQ6ICIKKwkJICAgICJ2ZXJzaW9uPTB4JXggbGVuZ3RoPTB4JXggY2hlY2tzdW09MHgleC5cbiIsCisJCSAgICBsZTE2X3RvX2NwdShmbHQtPnZlcnNpb24pLCBsZTE2X3RvX2NwdShmbHQtPmxlbmd0aCksCisJCSAgICBjaGtzdW0pKTsKKwkJZ290byBub19mbGFzaF9kYXRhOworCX0KKworCWxvYyA9IGxvY2F0aW9uc1sxXTsKKwljbnQgPSBsZTE2X3RvX2NwdShmbHQtPmxlbmd0aCkgLyBzaXplb2Yoc3RydWN0IHFsYV9mbHRfcmVnaW9uKTsKKwlmb3IgKCA7IGNudDsgY250LS0sIHJlZ2lvbisrKSB7CisJCS8qIFN0b3JlIGFkZHJlc3NlcyBhcyBEV09SRCBvZmZzZXRzLiAqLworCQlzdGFydCA9IGxlMzJfdG9fY3B1KHJlZ2lvbi0+c3RhcnQpID4+IDI7CisKKwkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRbJTAyeF06IHN0YXJ0PTB4JXggIgorCQkgICAgImVuZD0weCV4IHNpemU9MHgleC5cbiIsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+Y29kZSksIHN0YXJ0LAorCQkgICAgbGUzMl90b19jcHUocmVnaW9uLT5lbmQpID4+IDIsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+c2l6ZSkpKTsKKworCQlzd2l0Y2ggKGxlMzJfdG9fY3B1KHJlZ2lvbi0+Y29kZSkpIHsKKwkJY2FzZSBGTFRfUkVHX0ZXOgorCQkJaGEtPmZsdF9yZWdpb25fZncgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfQk9PVF9DT0RFOgorCQkJaGEtPmZsdF9yZWdpb25fYm9vdCA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19WUERfMDoKKwkJCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19GRFQ6CisJCQloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfSFdfRVZFTlRfMDoKKwkJCWlmICghUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSkKKwkJCQloYS0+Zmx0X3JlZ2lvbl9od19ldmVudCA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRkxUX1JFR19IV19FVkVOVF8xOgorCQkJaWYgKFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikpCisJCQkJaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgPSBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfTlBJVl9DT05GXzA6CisJCQlpZiAoIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikpCisJCQkJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX05QSVZfQ09ORl8xOgorCQkJaWYgKFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikpCisJCQkJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gc3RhcnQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlnb3RvIGRvbmU7CisKK25vX2ZsYXNoX2RhdGE6CisJLyogVXNlIGhhcmRjb2RlZCBkZWZhdWx0cy4gKi8KKwlsb2MgPSBsb2NhdGlvbnNbMF07CisJaGEtPmZsdF9yZWdpb25fZncgPSBGQV9SSVNDX0NPREVfQUREUjsKKwloYS0+Zmx0X3JlZ2lvbl9ib290ID0gRkFfQk9PVF9DT0RFX0FERFI7CisJaGEtPmZsdF9yZWdpb25fdnBkX252cmFtID0gRkFfVlBEX05WUkFNX0FERFI7CisJaGEtPmZsdF9yZWdpb25fZmR0ID0gSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX0ZMQVNIX0RFU0NSX0FERFJfMjQ6CisJICAgIEZBX0ZMQVNIX0RFU0NSX0FERFI7CisJaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgPSAhUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSA/CisJICAgIEZBX0hXX0VWRU5UMF9BRERSOiBGQV9IV19FVkVOVDFfQUREUjsKKwloYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPSAhUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSA/CisJICAgIChJU19RTEEyNFhYX1RZUEUoaGEpID8gRkFfTlBJVl9DT05GMF9BRERSXzI0OiBGQV9OUElWX0NPTkYwX0FERFIpOgorCSAgICAoSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX05QSVZfQ09ORjFfQUREUl8yNDogRkFfTlBJVl9DT05GMV9BRERSKTsKK2RvbmU6CisJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRbJXNdOiBib290PTB4JXggZnc9MHgleCAiCisJICAgICJ2cGRfbnZyYW09MHgleCBmZHQ9MHgleCBmbHQ9MHgleCBod2U9MHgleCBucGl2PTB4JXguXG4iLCBsb2MsCisJICAgIGhhLT5mbHRfcmVnaW9uX2Jvb3QsIGhhLT5mbHRfcmVnaW9uX2Z3LCBoYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0sCisJICAgIGhhLT5mbHRfcmVnaW9uX2ZkdCwgaGEtPmZsdF9yZWdpb25fZmx0LCBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCwKKwkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mKSk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeHh4X2dldF9mZHRfaW5mbyhzY3NpX3FsYV9ob3N0X3QgKmhhKQogewogI2RlZmluZSBGTEFTSF9CTEtfU0laRV8zMksJMHg4MDAwCiAjZGVmaW5lIEZMQVNIX0JMS19TSVpFXzY0SwkweDEwMDAwCisJY29uc3QgY2hhciAqbG9jLCAqbG9jYXRpb25zW10gPSB7ICJNSUQiLCAiRkRUIiB9OwogCXVpbnQxNl90IGNudCwgY2hrc3VtOwogCXVpbnQxNl90ICp3cHRyOwogCXN0cnVjdCBxbGFfZmR0X2xheW91dCAqZmR0OwogCXVpbnQ4X3QJbWFuX2lkLCBmbGFzaF9pZDsKLQotCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCi0JCXJldHVybjsKKwl1aW50MTZfdCBtaWQsIGZpZDsKIAogCXdwdHIgPSAodWludDE2X3QgKiloYS0+cmVxdWVzdF9yaW5nOwogCWZkdCA9IChzdHJ1Y3QgcWxhX2ZkdF9sYXlvdXQgKiloYS0+cmVxdWVzdF9yaW5nOwogCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbShoYSwgKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAotCSAgICBGQV9GTEFTSF9ERVNDUl9BRERSIDw8IDIsIE9QVFJPTV9CVVJTVF9TSVpFKTsKKwkgICAgaGEtPmZsdF9yZWdpb25fZmR0IDw8IDIsIE9QVFJPTV9CVVJTVF9TSVpFKTsKIAlpZiAoKndwdHIgPT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweGZmZmYpKQogCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CiAJaWYgKGZkdC0+c2lnWzBdICE9ICdRJyB8fCBmZHQtPnNpZ1sxXSAhPSAnTCcgfHwgZmR0LT5zaWdbMl0gIT0gJ0knIHx8CkBAIC01NzcsNyArNzUyLDEwIEBACiAJCWdvdG8gbm9fZmxhc2hfZGF0YTsKIAl9CiAKLQloYS0+ZmR0X29kZF9pbmRleCA9IGxlMTZfdG9fY3B1KGZkdC0+bWFuX2lkKSA9PSAweDFmOworCWxvYyA9IGxvY2F0aW9uc1sxXTsKKwltaWQgPSBsZTE2X3RvX2NwdShmZHQtPm1hbl9pZCk7CisJZmlkID0gbGUxNl90b19jcHUoZmR0LT5pZCk7CisJaGEtPmZkdF9vZGRfaW5kZXggPSBtaWQgPT0gMHgxZjsKIAloYS0+ZmR0X3dydF9kaXNhYmxlID0gZmR0LT53cnRfZGlzYWJsZV9iaXRzOwogCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMDAgfCBmZHQtPmVyYXNlX2NtZCk7CiAJaGEtPmZkdF9ibG9ja19zaXplID0gbGUzMl90b19jcHUoZmR0LT5ibG9ja19zaXplKTsKQEAgLTU4OCwxNiArNzY2LDEyIEBACiAJCSAgICBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMwMCB8IGZkdC0+cHJvdGVjdF9zZWNfY21kKToKIAkJICAgIGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzM2KTsKIAl9Ci0KLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZsYXNoW0ZEVF06ICgweCV4LzB4JXgpIGVyYXNlPTB4JXggIgotCSAgICAicHJvPSV4IHVwcm89JXggaWR4PSVkIHdydGQ9MHgleCBibGs9MHgleC5cbiIsCi0JICAgIGxlMTZfdG9fY3B1KGZkdC0+bWFuX2lkKSwgbGUxNl90b19jcHUoZmR0LT5pZCksIGhhLT5mZHRfZXJhc2VfY21kLAotCSAgICBoYS0+ZmR0X3Byb3RlY3Rfc2VjX2NtZCwgaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCwKLQkgICAgaGEtPmZkdF9vZGRfaW5kZXgsIGhhLT5mZHRfd3J0X2Rpc2FibGUsIGhhLT5mZHRfYmxvY2tfc2l6ZSkpOwotCXJldHVybjsKLQorCWdvdG8gZG9uZTsKIG5vX2ZsYXNoX2RhdGE6CisJbG9jID0gbG9jYXRpb25zWzBdOwogCXFsYTI0eHhfZ2V0X2ZsYXNoX21hbnVmYWN0dXJlcihoYSwgJm1hbl9pZCwgJmZsYXNoX2lkKTsKKwltaWQgPSBtYW5faWQ7CisJZmlkID0gZmxhc2hfaWQ7CiAJaGEtPmZkdF93cnRfZGlzYWJsZSA9IDB4OWM7CiAJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDNkOCk7CiAJc3dpdGNoIChtYW5faWQpIHsKQEAgLTYyNSwxNCArNzk5LDExNyBAQAogCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBGTEFTSF9CTEtfU0laRV82NEs7CiAJCWJyZWFrOwogCX0KLQotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiRmxhc2hbTUlEXTogKDB4JXgvMHgleCkgZXJhc2U9MHgleCAiCi0JICAgICJwcm89JXggdXBybz0leCBpZHg9JWQgd3J0ZD0weCV4IGJsaz0weCV4LlxuIiwgbWFuX2lkLCBmbGFzaF9pZCwKK2RvbmU6CisJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGRFRbJXNdOiAoMHgleC8weCV4KSBlcmFzZT0weCV4ICIKKwkgICAgInBybz0leCB1cHJvPSV4IGlkeD0lZCB3cnRkPTB4JXggYmxrPTB4JXguXG4iLCBsb2MsIG1pZCwgZmlkLAogCSAgICBoYS0+ZmR0X2VyYXNlX2NtZCwgaGEtPmZkdF9wcm90ZWN0X3NlY19jbWQsCiAJICAgIGhhLT5mZHRfdW5wcm90ZWN0X3NlY19jbWQsIGhhLT5mZHRfb2RkX2luZGV4LCBoYS0+ZmR0X3dydF9kaXNhYmxlLAogCSAgICBoYS0+ZmR0X2Jsb2NrX3NpemUpKTsKIH0KIAoraW50CitxbGEyeHh4X2dldF9mbGFzaF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqaGEpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCBmbHRfYWRkcjsKKworCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJCXJldHVybiBRTEFfU1VDQ0VTUzsKKworCXJldCA9IHFsYTJ4eHhfZmluZF9mbHRfc3RhcnQoaGEsICZmbHRfYWRkcik7CisJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIHJldDsKKworCXFsYTJ4eHhfZ2V0X2ZsdF9pbmZvKGhhLCBmbHRfYWRkcik7CisJcWxhMnh4eF9nZXRfZmR0X2luZm8oaGEpOworCisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCit2b2lkCitxbGEyeHh4X2ZsYXNoX25waXZfY29uZihzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworI2RlZmluZSBOUElWX0NPTkZJR19TSVpFCSgxNioxMDI0KQorCXZvaWQgKmRhdGE7CisJdWludDE2X3QgKndwdHI7CisJdWludDE2X3QgY250LCBjaGtzdW07CisJc3RydWN0IHFsYV9ucGl2X2hlYWRlciBoZHI7CisJc3RydWN0IHFsYV9ucGl2X2VudHJ5ICplbnRyeTsKKworCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJCXJldHVybjsKKworCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbShoYSwgKHVpbnQ4X3QgKikmaGRyLAorCSAgICBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYgPDwgMiwgc2l6ZW9mKHN0cnVjdCBxbGFfbnBpdl9oZWFkZXIpKTsKKwlpZiAoaGRyLnZlcnNpb24gPT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweGZmZmYpKQorCQlyZXR1cm47CisJaWYgKGhkci52ZXJzaW9uICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSkpIHsKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVuc3VwcG9ydGVkIE5QSVYtQ29uZmlnICIKKwkJICAgICJkZXRlY3RlZDogdmVyc2lvbj0weCV4IGVudHJpZXM9MHgleCBjaGVja3N1bT0weCV4LlxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KGhkci52ZXJzaW9uKSwgbGUxNl90b19jcHUoaGRyLmVudHJpZXMpLAorCQkgICAgbGUxNl90b19jcHUoaGRyLmNoZWNrc3VtKSkpOworCQlyZXR1cm47CisJfQorCisJZGF0YSA9IGttYWxsb2MoTlBJVl9DT05GSUdfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJOUElWLUNvbmZpZzogVW5hYmxlIHRvICIKKwkJICAgICJhbGxvY2F0ZSBtZW1vcnkuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20oaGEsICh1aW50OF90ICopZGF0YSwKKwkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mIDw8IDIsIE5QSVZfQ09ORklHX1NJWkUpOworCisJY250ID0gKHNpemVvZihzdHJ1Y3QgcWxhX25waXZfaGVhZGVyKSArIGxlMTZfdG9fY3B1KGhkci5lbnRyaWVzKSAqCisJICAgIHNpemVvZihzdHJ1Y3QgcWxhX25waXZfZW50cnkpKSA+PiAxOworCWZvciAod3B0ciA9IGRhdGEsIGNoa3N1bSA9IDA7IGNudDsgY250LS0pCisJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKKwlpZiAoY2hrc3VtKSB7CisJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbmNvbnNpc3RlbnQgTlBJVi1Db25maWcgIgorCQkgICAgImRldGVjdGVkOiB2ZXJzaW9uPTB4JXggZW50cmllcz0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAorCQkgICAgbGUxNl90b19jcHUoaGRyLnZlcnNpb24pLCBsZTE2X3RvX2NwdShoZHIuZW50cmllcyksCisJCSAgICBjaGtzdW0pKTsKKwkJZ290byBkb25lOworCX0KKworCWVudHJ5ID0gZGF0YSArIHNpemVvZihzdHJ1Y3QgcWxhX25waXZfaGVhZGVyKTsKKwljbnQgPSBsZTE2X3RvX2NwdShoZHIuZW50cmllcyk7CisJZm9yICggOyBjbnQ7IGNudC0tLCBlbnRyeSsrKSB7CisJCXVpbnQxNl90IGZsYWdzOworCQlzdHJ1Y3QgZmNfdnBvcnRfaWRlbnRpZmllcnMgdmlkOworCQlzdHJ1Y3QgZmNfdnBvcnQgKnZwb3J0OworCisJCWZsYWdzID0gbGUxNl90b19jcHUoZW50cnktPmZsYWdzKTsKKwkJaWYgKGZsYWdzID09IDB4ZmZmZikKKwkJCWNvbnRpbnVlOworCQlpZiAoKGZsYWdzICYgQklUXzApID09IDApCisJCQljb250aW51ZTsKKworCQltZW1zZXQoJnZpZCwgMCwgc2l6ZW9mKHZpZCkpOworCQl2aWQucm9sZXMgPSBGQ19QT1JUX1JPTEVfRkNQX0lOSVRJQVRPUjsKKwkJdmlkLnZwb3J0X3R5cGUgPSBGQ19QT1JUVFlQRV9OUElWOworCQl2aWQuZGlzYWJsZSA9IGZhbHNlOworCQl2aWQucG9ydF9uYW1lID0gd3duX3RvX3U2NChlbnRyeS0+cG9ydF9uYW1lKTsKKwkJdmlkLm5vZGVfbmFtZSA9IHd3bl90b191NjQoZW50cnktPm5vZGVfbmFtZSk7CisKKwkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJOUElWWyUwMnhdOiB3d3BuPSVsbHggIgorCQkgICAgInd3bm49JWxseCB2Zl9pZD0weCV4IHFvcz0weCV4LlxuIiwgY250LAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQucG9ydF9uYW1lLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lLAorCQkgICAgbGUxNl90b19jcHUoZW50cnktPnZmX2lkKSwgbGUxNl90b19jcHUoZW50cnktPnFvcykpKTsKKworCQl2cG9ydCA9IGZjX3Zwb3J0X2NyZWF0ZShoYS0+aG9zdCwgMCwgJnZpZCk7CisJCWlmICghdnBvcnQpCisJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJOUElWLUNvbmZpZzogRmFpbGVkIHRvICIKKwkJCSAgICAiY3JlYXRlIHZwb3J0IFslMDJ4XTogd3dwbj0lbGx4IHd3bm49JWxseC5cbiIsIGNudCwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXZpZC5wb3J0X25hbWUsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lKTsKKwl9Citkb25lOgorCWtmcmVlKGRhdGEpOworfQorCiBzdGF0aWMgdm9pZAogcWxhMjR4eF91bnByb3RlY3RfZmxhc2goc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKQEAgLTkyMCw3ICsxMTk3LDggQEAKIAlkd3B0ciA9ICh1aW50MzJfdCAqKWJ1ZjsKIAlmb3IgKGkgPSAwOyBpIDwgYnl0ZXMgPj4gMjsgaSsrLCBuYWRkcisrKQogCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoRkFfVlBEX05WUkFNX0FERFIgfCBuYWRkcikpKTsKKwkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIHwKKwkJICAgIG5hZGRyKSkpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KQEAgLTkzNSwxMCArMTIxMywxMCBAQAogCWRidWYgPSB2bWFsbG9jKFJNV19CVUZGRVJfU0laRSk7CiAJaWYgKCFkYnVmKQogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7Ci0JaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKGhhLCBkYnVmLCBGQV9WUERfTlZSQU1fQUREUiA8PCAyLAorCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbShoYSwgZGJ1ZiwgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIDw8IDIsCiAJICAgIFJNV19CVUZGRVJfU0laRSk7CiAJbWVtY3B5KGRidWYgKyAobmFkZHIgPDwgMiksIGJ1ZiwgYnl0ZXMpOwotCWhhLT5pc3Bfb3BzLT53cml0ZV9vcHRyb20oaGEsIGRidWYsIEZBX1ZQRF9OVlJBTV9BRERSIDw8IDIsCisJaGEtPmlzcF9vcHMtPndyaXRlX29wdHJvbShoYSwgZGJ1ZiwgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIDw8IDIsCiAJICAgIFJNV19CVUZGRVJfU0laRSk7CiAJdmZyZWUoZGJ1Zik7CiAKQEAgLTIxNjYsNyArMjQ0NCw3IEBACiAJCW1lbXNldChkYnl0ZSwgMCwgOCk7CiAJCWRjb2RlID0gKHVpbnQxNl90ICopZGJ5dGU7CiAKLQkJcWxhMngwMF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRieXRlLCBGQV9SSVNDX0NPREVfQUREUiAqIDQgKyAxMCwKKwkJcWxhMngwMF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRieXRlLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQgKyAxMCwKIAkJICAgIDgpOwogCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkdW1waW5nIGZ3IHZlciBmcm9tIGZsYXNoOlxuIiwKIAkJICAgIF9fZnVuY19fLCBoYS0+aG9zdF9ubykpOwpAQCAtMjE3Nyw3ICsyNDU1LDcgQEAKIAkJICAgIChkY29kZVswXSA9PSAwICYmIGRjb2RlWzFdID09IDAgJiYgZGNvZGVbMl0gPT0gMCAmJgogCQkgICAgZGNvZGVbM10gPT0gMCkpIHsKIAkJCURFQlVHMihwcmludGsoIiVzKCk6IFVucmVjb2duaXplZCBmdyByZXZpc2lvbiBhdCAiCi0JCQkgICAgIiV4LlxuIiwgX19mdW5jX18sIEZBX1JJU0NfQ09ERV9BRERSICogNCkpOworCQkJICAgICIleC5cbiIsIF9fZnVuY19fLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHZhbHVlcyBhcmUgaW4gYmlnIGVuZGlhbiAqLwogCQkJaGEtPmZ3X3JldmlzaW9uWzBdID0gZGJ5dGVbMF0gPDwgMTYgfCBkYnl0ZVsxXTsKQEAgLTIyMTIsNyArMjQ5MCw3IEBACiAJZGNvZGUgPSBtYnVmOwogCiAJLyogQmVnaW4gd2l0aCBmaXJzdCBQQ0kgZXhwYW5zaW9uIFJPTSBoZWFkZXIuICovCi0JcGNpaGRyID0gMDsKKwlwY2loZHIgPSBoYS0+Zmx0X3JlZ2lvbl9ib290OwogCWxhc3RfaW1hZ2UgPSAxOwogCWRvIHsKIAkJLyogVmVyaWZ5IFBDSSBleHBhbnNpb24gUk9NIGhlYWRlci4gKi8KQEAgLTIyODIsNyArMjU2MCw3IEBACiAJbWVtc2V0KGhhLT5md19yZXZpc2lvbiwgMCwgc2l6ZW9mKGhhLT5md19yZXZpc2lvbikpOwogCWRjb2RlID0gbWJ1ZjsKIAotCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKGhhLCBkY29kZSwgRkFfUklTQ19DT0RFX0FERFIgKyA0LCA0KTsKKwlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YShoYSwgZGNvZGUsIGhhLT5mbHRfcmVnaW9uX2Z3ICsgNCwgNCk7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJZGNvZGVbaV0gPSBiZTMyX3RvX2NwdShkY29kZVtpXSk7CiAKQEAgLTIyOTEsNyArMjU2OSw3IEBACiAJICAgIChkY29kZVswXSA9PSAwICYmIGRjb2RlWzFdID09IDAgJiYgZGNvZGVbMl0gPT0gMCAmJgogCSAgICBkY29kZVszXSA9PSAwKSkgewogCQlERUJVRzIocHJpbnRrKCIlcygpOiBVbnJlY29nbml6ZWQgZncgdmVyc2lvbiBhdCAleC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgRkFfUklTQ19DT0RFX0FERFIpKTsKKwkJICAgIF9fZnVuY19fLCBoYS0+Zmx0X3JlZ2lvbl9mdykpOwogCX0gZWxzZSB7CiAJCWhhLT5md19yZXZpc2lvblswXSA9IGRjb2RlWzBdOwogCQloYS0+ZndfcmV2aXNpb25bMV0gPSBkY29kZVsxXTsKQEAgLTIzNTUsNyArMjYzMyw3IEBACiAJLyogTG9jYXRlIGZpcnN0IGVtcHR5IGVudHJ5LiAqLwogCWZvciAoOzspIHsKIAkJaWYgKGhhLT5od19ldmVudF9wdHIgPj0KLQkJICAgIGhhLT5od19ldmVudF9zdGFydCArIEZBX0hXX0VWRU5UX1NJWkUpIHsKKwkJICAgIGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ICsgRkFfSFdfRVZFTlRfU0laRSkgewogCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCSAgICAiSFcgZXZlbnQgLS0gTG9nIEZ1bGwhXG4iKSk7CiAJCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CkBAIC0yMzkxLDcgKzI2NjksNyBAQAogCWludCBydmFsOwogCXVpbnQzMl90IG1hcmtlclsyXSwgZmRhdGFbNF07CiAKLQlpZiAoaGEtPmh3X2V2ZW50X3N0YXJ0ID09IDApCisJaWYgKGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID09IDApCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKQEAgLTI0MDYsNyArMjY4NCw3IEBACiAJCSAgICBRTEFfRFJJVkVSX1BBVENIX1ZFUiwgUUxBX0RSSVZFUl9CRVRBX1ZFUik7CiAKIAkJLyogTG9jYXRlIG1hcmtlci4gKi8KLQkJaGEtPmh3X2V2ZW50X3B0ciA9IGhhLT5od19ldmVudF9zdGFydDsKKwkJaGEtPmh3X2V2ZW50X3B0ciA9IGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50OwogCQlmb3IgKDs7KSB7CiAJCQlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YShoYSwgZmRhdGEsIGhhLT5od19ldmVudF9wdHIsCiAJCQkgICAgNCk7CkBAIC0yNDE1LDcgKzI2OTMsNyBAQAogCQkJCWJyZWFrOwogCQkJaGEtPmh3X2V2ZW50X3B0ciArPSBGQV9IV19FVkVOVF9FTlRSWV9TSVpFOwogCQkJaWYgKGhhLT5od19ldmVudF9wdHIgPj0KLQkJCSAgICBoYS0+aHdfZXZlbnRfc3RhcnQgKyBGQV9IV19FVkVOVF9TSVpFKSB7CisJCQkgICAgaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgKyBGQV9IV19FVkVOVF9TSVpFKSB7CiAJCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIkhXIGV2ZW50IC0tIExvZyBGdWxsIVxuIikpOwogCQkJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCmluZGV4IDQxNjBlNGMuLmJlNWUyOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaApAQCAtNyw3ICs3LDcgQEAKIC8qCiAgKiBEcml2ZXIgdmVyc2lvbgogICovCi0jZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAyLjAxLWs3IgorI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMi4wMS1rOCIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKaW5kZXggODhiZWJiMS4uZGU4Mjc5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMKQEAgLTE1NDIsNyArMTU0Miw3IEBACiAJREVCVUcyKHByaW50ayhLRVJOX0lORk8KIAkJICAgICAgInNjc2klbGQ6IERFVklDRV9SRVNFVCBjbWQ9JXAgamlmZmllcyA9IDB4JWx4LCB0bz0leCwiCiAJCSAgICAgICJkcGNfZmxhZ3M9JWx4LCBzdGF0dXM9JXggYWxsb3dlZD0lZFxuIiwgaGEtPmhvc3Rfbm8sCi0JCSAgICAgIGNtZCwgamlmZmllcywgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kIC8gSFosCisJCSAgICAgIGNtZCwgamlmZmllcywgY21kLT5yZXF1ZXN0LT50aW1lb3V0IC8gSFosCiAJCSAgICAgIGhhLT5kcGNfZmxhZ3MsIGNtZC0+cmVzdWx0LCBjbWQtPmFsbG93ZWQpKTsKIAogCS8qIEZJWE1FOiB3YWl0IGZvciBoYmEgdG8gZ28gb25saW5lICovCkBAIC0xNTk4LDcgKzE1OTgsNyBAQAogCURFQlVHMihwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICJzY3NpJWxkOiBUQVJHRVRfREVWSUNFX1JFU0VUIGNtZD0lcCBqaWZmaWVzID0gMHglbHgsICIKIAkJICAgICAgInRvPSV4LGRwY19mbGFncz0lbHgsIHN0YXR1cz0leCBhbGxvd2VkPSVkXG4iLAotCQkgICAgICBoYS0+aG9zdF9ubywgY21kLCBqaWZmaWVzLCBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgLyBIWiwKKwkJICAgICAgaGEtPmhvc3Rfbm8sIGNtZCwgamlmZmllcywgY21kLT5yZXF1ZXN0LT50aW1lb3V0IC8gSFosCiAJCSAgICAgIGhhLT5kcGNfZmxhZ3MsIGNtZC0+cmVzdWx0LCBjbWQtPmFsbG93ZWQpKTsKIAogCXN0YXQgPSBxbGE0eHh4X3Jlc2V0X3RhcmdldChoYSwgZGRiX2VudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwppbmRleCA0YTFjZjYzLi42OWQ2YWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCkBAIC0xLDYgKzEsNiBAQAogLyogcWxvZ2ljcHRpLmM6IFBlcmZvcm1hbmNlIFRlY2hub2xvZ2llcyBRbG9naWNJU1Agc2J1cyBjYXJkIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA2LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqCiAgKiBBIGxvdCBvZiB0aGlzIGRyaXZlciB3YXMgZGlyZWN0bHkgc3RvbGVuIGZyb20gRXJpayBILiBNb2UncyBQQ0kKICAqIFFsb2dpYyBJU1AgZHJpdmVyLiAgTXVjaG8ga3Vkb3MgdG8gaGltIGZvciB0aGlzIGNvZGUuCkBAIC0yNSwxMiArMjUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAjaW5jbHVkZSAicWxvZ2ljcHRpLmgiCiAKLSNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtMTU3LDcgKzE1OSw3IEBACiAJICogaXMgYSBub3AgYW5kIHRoZSBjaGlwIGVuZHMgdXAgdXNpbmcgdGhlIHNtYWxsZXN0IGJ1cnN0CiAJICogc2l6ZS4gLURhdmVNCiAJICovCi0JaWYgKHNidXNfY2FuX2J1cnN0NjQocXB0aS0+c2RldikgJiYgKGJ1cnN0cyAmIERNQV9CVVJTVDY0KSkgeworCWlmIChzYnVzX2Nhbl9idXJzdDY0KCkgJiYgKGJ1cnN0cyAmIERNQV9CVVJTVDY0KSkgewogCQl2YWwgPSAoU0JVU19DRkcxX0JFTkFCIHwgU0JVU19DRkcxX0I2NCk7CiAJfSBlbHNlCiAjZW5kaWYKQEAgLTY4NCwxOSArNjg2LDE5IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHFwdGlfbWFwX3JlZ3Moc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBxcHRpLT5zZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gcXB0aS0+b3A7CiAKLQlxcHRpLT5xcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJICAgc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplLAotCQkJCSAgICJQVEkgUWxvZ2ljL0lTUCIpOworCXFwdGktPnFyZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJCSByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pLAorCQkJCSAiUFRJIFFsb2dpYy9JU1AiKTsKIAlpZiAoIXFwdGktPnFyZWdzKSB7CiAJCXByaW50aygiUFRJOiBRbG9naWMvSVNQIHJlZ2lzdGVycyBhcmUgdW5tYXBwYWJsZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKHFwdGktPmlzX3B0aSkgewotCQlxcHRpLT5zcmVnID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgKDE2ICogNDA5NiksCi0JCQkJCSAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLAotCQkJCQkgICJQVEkgUWxvZ2ljL0lTUCBzdGF0cmVnIik7CisJCXFwdGktPnNyZWcgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sICgxNiAqIDQwOTYpLAorCQkJCQlzaXplb2YodW5zaWduZWQgY2hhciksCisJCQkJCSJQVEkgUWxvZ2ljL0lTUCBzdGF0cmVnIik7CiAJCWlmICghcXB0aS0+c3JlZykgewogCQkJcHJpbnRrKCJQVEk6IFFsb2dpYy9JU1Agc3RhdHVzIHJlZ2lzdGVyIGlzIHVubWFwcGFibGVcbiIpOwogCQkJcmV0dXJuIC0xOwpAQCAtNzA3LDkgKzcwOSw5IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHFwdGlfcmVnaXN0ZXJfaXJxKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHFwdGktPm9wOwogCi0JcXB0aS0+cWhvc3QtPmlycSA9IHFwdGktPmlycSA9IHNkZXYtPmlycXNbMF07CisJcXB0aS0+cWhvc3QtPmlycSA9IHFwdGktPmlycSA9IG9wLT5pcnFzWzBdOwogCiAJLyogV2UgdXNlZCB0byB0cnkgdmFyaW91cyBvdmVybHktY2xldmVyIHRoaW5ncyB0bwogCSAqIHJlZHVjZSB0aGUgaW50ZXJydXB0IHByb2Nlc3Npbmcgb3ZlcmhlYWQgb24KQEAgLTczMiwxNyArNzM0LDE5IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxcHRpX2dldF9zY3NpX2lkKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCiB7Ci0JcXB0aS0+c2NzaV9pZCA9IHByb21fZ2V0aW50ZGVmYXVsdChxcHRpLT5wcm9tX25vZGUsCi0JCQkJCSAgICJpbml0aWF0b3ItaWQiLAotCQkJCQkgICAtMSk7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBxcHRpLT5vcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJZHAgPSBvcC0+bm9kZTsKKworCXFwdGktPnNjc2lfaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJpbml0aWF0b3ItaWQiLCAtMSk7CiAJaWYgKHFwdGktPnNjc2lfaWQgPT0gLTEpCi0JCXFwdGktPnNjc2lfaWQgPSBwcm9tX2dldGludGRlZmF1bHQocXB0aS0+cHJvbV9ub2RlLAotCQkJCQkJICAgInNjc2ktaW5pdGlhdG9yLWlkIiwKLQkJCQkJCSAgIC0xKTsKKwkJcXB0aS0+c2NzaV9pZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInNjc2ktaW5pdGlhdG9yLWlkIiwKKwkJCQkJCSAgICAgIC0xKTsKIAlpZiAocXB0aS0+c2NzaV9pZCA9PSAtMSkKIAkJcXB0aS0+c2NzaV9pZCA9Ci0JCQlwcm9tX2dldGludGRlZmF1bHQocXB0aS0+c2Rldi0+YnVzLT5wcm9tX25vZGUsCi0JCQkJCSAgICJzY3NpLWluaXRpYXRvci1pZCIsIDcpOworCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLT5wYXJlbnQsCisJCQkJCSAgICAgICJzY3NpLWluaXRpYXRvci1pZCIsIDcpOwogCXFwdGktPnFob3N0LT50aGlzX2lkID0gcXB0aS0+c2NzaV9pZDsKIAlxcHRpLT5xaG9zdC0+bWF4X3NlY3RvcnMgPSA2NDsKIApAQCAtNzUxLDEyICs3NTUsMTEgQEAKIAogc3RhdGljIHZvaWQgcXB0aV9nZXRfYnVyc3RzKHN0cnVjdCBxbG9naWNwdGkgKnFwdGkpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXB0aS0+c2RldjsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHFwdGktPm9wOwogCXU4IGJ1cnN0cywgYm1hc2s7CiAKLQlidXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQocXB0aS0+cHJvbV9ub2RlLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKLQlibWFzayA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwKLQkJCQkgICAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKKwlidXJzdHMgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQob3AtPm5vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOworCWJtYXNrID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KG9wLT5ub2RlLT5wYXJlbnQsICJidXJzdC1zaXplcyIsIDB4ZmYpOwogCWlmIChibWFzayAhPSAweGZmKQogCQlidXJzdHMgJj0gYm1hc2s7CiAJaWYgKGJ1cnN0cyA9PSAweGZmIHx8CkBAIC03ODUsMjUgKzc4OCwyNSBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBxcHRpX21hcF9xdWV1ZXMoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBxcHRpLT5zZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gcXB0aS0+b3A7CiAKICNkZWZpbmUgUVNJWkUoZW50cmllcykJKCgoZW50cmllcykgKyAxKSAqIFFVRVVFX0VOVFJZX0xFTikKLQlxcHRpLT5yZXNfY3B1ID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsCi0JCQkJCSAgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAotCQkJCQkgICAgICAmcXB0aS0+cmVzX2R2bWEpOworCXFwdGktPnJlc19jcHUgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkJCSAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJCQkgICAmcXB0aS0+cmVzX2R2bWEsIEdGUF9BVE9NSUMpOwogCWlmIChxcHRpLT5yZXNfY3B1ID09IE5VTEwgfHwKIAkgICAgcXB0aS0+cmVzX2R2bWEgPT0gMCkgewogCQlwcmludGsoIlFQVEk6IENhbm5vdCBtYXAgcmVzcG9uc2UgcXVldWUuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXFwdGktPnJlcV9jcHUgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2RldiwKLQkJCQkJICAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAotCQkJCQkgICAgICAmcXB0aS0+cmVxX2R2bWEpOworCXFwdGktPnJlcV9jcHUgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkJCSAgIFFTSVpFKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSwKKwkJCQkJICAgJnFwdGktPnJlcV9kdm1hLCBHRlBfQVRPTUlDKTsKIAlpZiAocXB0aS0+cmVxX2NwdSA9PSBOVUxMIHx8CiAJICAgIHFwdGktPnJlcV9kdm1hID09IDApIHsKLQkJc2J1c19mcmVlX2NvbnNpc3RlbnQoc2RldiwgUVNJWkUoUkVTX1FVRVVFX0xFTiksCi0JCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LCBRU0laRShSRVNfUVVFVUVfTEVOKSwKKwkJCQkgIHFwdGktPnJlc19jcHUsIHFwdGktPnJlc19kdm1hKTsKIAkJcHJpbnRrKCJRUFRJOiBDYW5ub3QgbWFwIHJlcXVlc3QgcXVldWUuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTg3NSw4ICs4NzgsOSBAQAogCQlpbnQgc2dfY291bnQ7CiAKIAkJc2cgPSBzY3NpX3NnbGlzdChDbW5kKTsKLQkJc2dfY291bnQgPSBzYnVzX21hcF9zZyhxcHRpLT5zZGV2LCBzZywgc2NzaV9zZ19jb3VudChDbW5kKSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCXNnX2NvdW50ID0gZG1hX21hcF9zZygmcXB0aS0+b3AtPmRldiwgc2csCisJCQkJICAgICAgc2NzaV9zZ19jb3VudChDbW5kKSwKKwkJCQkgICAgICBDbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CiAKIAkJZHMgPSBjbWQtPmRhdGFzZWc7CiAJCWNtZC0+c2VnbWVudF9jbnQgPSBzZ19jb3VudDsKQEAgLTkxNCw2ICs5MTgsNyBAQAogCQkJCWRzW2ldLmRfY291bnQgPSBzZ19kbWFfbGVuKHMpOwogCQkJfQogCQkJc2dfY291bnQgLT0gbjsKKwkJCXNnID0gczsKIAkJfQogCX0gZWxzZSB7CiAJCWNtZC0+ZGF0YXNlZ1swXS5kX2Jhc2UgPSAwOwpAQCAtMTE1MSw5ICsxMTU2LDkgQEAKIAkJCUNtbmQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAogCQlpZiAoc2NzaV9idWZmbGVuKENtbmQpKQotCQkJc2J1c191bm1hcF9zZyhxcHRpLT5zZGV2LAotCQkJCSAgICAgIHNjc2lfc2dsaXN0KENtbmQpLCBzY3NpX3NnX2NvdW50KENtbmQpLAotCQkJCSAgICAgIENtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCWRtYV91bm1hcF9zZygmcXB0aS0+b3AtPmRldiwKKwkJCQkgICAgIHNjc2lfc2dsaXN0KENtbmQpLCBzY3NpX3NnX2NvdW50KENtbmQpLAorCQkJCSAgICAgQ21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOwogCiAJCXFwdGktPmNtZF9jb3VudFtDbW5kLT5kZXZpY2UtPmlkXS0tOwogCQlzYnVzX3dyaXRldyhvdXRfcHRyLCBxcHRpLT5xcmVncyArIE1CT1g1KTsKQEAgLTEyNjcsMzQgKzEyNzIsMzIgQEAKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBxcHRpX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHFwdGlfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RhdGljIGludCBucXB0aXM7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGV2LT5ub2RlOwogCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgPSBtYXRjaC0+ZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpOworCXN0YXRpYyBpbnQgbnFwdGlzOwogCWNvbnN0IGNoYXIgKmZjb2RlOwogCiAJLyogU29tZXRpbWVzIEFudGFyZXMgY2FyZHMgY29tZSB1cCBub3QgY29tcGxldGVseQogCSAqIHNldHVwLCBhbmQgd2UgZ2V0IGEgcmVwb3J0IG9mIGEgemVybyBJUlEuCiAJICovCi0JaWYgKHNkZXYtPmlycXNbMF0gPT0gMCkKKwlpZiAob3AtPmlycXNbMF0gPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3QgcWxvZ2ljcHRpKSk7CiAJaWYgKCFob3N0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKKwlxcHRpID0gc2hvc3RfcHJpdihob3N0KTsKIAogCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOwogCXFwdGktPnFob3N0ID0gaG9zdDsKLQlxcHRpLT5zZGV2ID0gc2RldjsKKwlxcHRpLT5vcCA9IG9wOwogCXFwdGktPnFwdGlfaWQgPSBucXB0aXM7Ci0JcXB0aS0+cHJvbV9ub2RlID0gc2Rldi0+cHJvbV9ub2RlOwotCXN0cmNweShxcHRpLT5wcm9tX25hbWUsIHNkZXYtPm9mZGV2Lm5vZGUtPm5hbWUpOworCXN0cmNweShxcHRpLT5wcm9tX25hbWUsIG9wLT5ub2RlLT5uYW1lKTsKIAlxcHRpLT5pc19wdGkgPSBzdHJjbXAocXB0aS0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKTsKIAogCWlmIChxcHRpX21hcF9yZWdzKHFwdGkpIDwgMCkKQEAgLTEzNDAsMTIgKzEzNDMsMTIgQEAKIAkJKHFwdGktPnVsdHJhID8gIlVsdHJhIiA6ICJGYXN0IiksCiAJCShxcHRpLT5kaWZmZXJlbnRpYWwgPyAiZGlmZmVyZW50aWFsIiA6ICJzaW5nbGUgZW5kZWQiKSk7CiAKLQlpZiAoc2NzaV9hZGRfaG9zdChob3N0LCAmZGV2LT5kZXYpKSB7CisJaWYgKHNjc2lfYWRkX2hvc3QoaG9zdCwgJm9wLT5kZXYpKSB7CiAJCXByaW50aygicWxvZ2ljcHRpJWQ6IEZhaWxlZCBzY3NpX2FkZF9ob3N0XG4iLCBxcHRpLT5xcHRpX2lkKTsKIAkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKIAl9CiAKLQlkZXZfc2V0X2RydmRhdGEoJnNkZXYtPm9mZGV2LmRldiwgcXB0aSk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBxcHRpKTsKIAogCXFwdGlfY2hhaW5fYWRkKHFwdGkpOwogCkBAIC0xMzU2LDE5ICsxMzU5LDIwIEBACiAKIGZhaWxfdW5tYXBfcXVldWVzOgogI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQotCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCi0JCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKLQkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXFfY3B1LCBxcHRpLT5yZXFfZHZtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkgIFFTSVpFKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSwKKwkJCSAgcXB0aS0+cmVxX2NwdSwgcXB0aS0+cmVxX2R2bWEpOwogI3VuZGVmIFFTSVpFCiAKIGZhaWxfdW5tYXBfcmVnczoKLQlzYnVzX2lvdW5tYXAocXB0aS0+cXJlZ3MsCi0JCSAgICAgcXB0aS0+c2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHFwdGktPnFyZWdzLAorCQkgICByZXNvdXJjZV9zaXplKCZvcC0+cmVzb3VyY2VbMF0pKTsKIAlpZiAocXB0aS0+aXNfcHRpKQotCQlzYnVzX2lvdW5tYXAocXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBxcHRpLT5zcmVnLAorCQkJICAgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKIAogZmFpbF9mcmVlX2lycToKIAlmcmVlX2lycShxcHRpLT5pcnEsIHFwdGkpOwpAQCAtMTM3OSw5ICsxMzgzLDkgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgcXB0aV9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBxcHRpX3NidXNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKIAogCXFwdGlfY2hhaW5fZGVsKHFwdGkpOwogCkBAIC0xMzk0LDI0ICsxMzk4LDI1IEBACiAJZnJlZV9pcnEocXB0aS0+aXJxLCBxcHRpKTsKIAogI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQotCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCi0JCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKLQkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXFfY3B1LCBxcHRpLT5yZXFfZHZtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkgIFFTSVpFKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSwKKwkJCSAgcXB0aS0+cmVxX2NwdSwgcXB0aS0+cmVxX2R2bWEpOwogI3VuZGVmIFFTSVpFCiAKLQlzYnVzX2lvdW5tYXAocXB0aS0+cXJlZ3MsIHFwdGktPnNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBxcHRpLT5xcmVncywKKwkJICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSk7CiAJaWYgKHFwdGktPmlzX3B0aSkKLQkJc2J1c19pb3VubWFwKHFwdGktPnNyZWcsIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKIAogCXNjc2lfaG9zdF9wdXQocXB0aS0+cWhvc3QpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFwdGlfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFwdGlfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gInB0aXNwIiwKIAkJLmRhdGEgPSAmcXB0aV90ZW1wbGF0ZSwKQEAgLTE0NDEsNyArMTQ0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHFwdGlfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnFwdGlfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZxcHRpX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcXB0aV9leGl0KHZvaWQpCkBAIC0xNDUyLDcgKzE0NTcsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJRbG9naWNJU1AgU0JVUyBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKCIyLjAiKTsKK01PRFVMRV9WRVJTSU9OKCIyLjEiKTsKIAogbW9kdWxlX2luaXQocXB0aV9pbml0KTsKIG1vZHVsZV9leGl0KHFwdGlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmggYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmgKaW5kZXggZWY2ZGEyZC4uOWMwNTNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuaApAQCAtMzQyLDcgKzM0Miw3IEBACiAJdV9pbnQJICAgICAgICAgICAgICAgICAgcmVxX2luX3B0cjsJCS8qIGluZGV4IG9mIG5leHQgcmVxdWVzdCBzbG90ICovCiAJdV9pbnQJICAgICAgICAgICAgICAgICAgcmVzX291dF9wdHI7CQkvKiBpbmRleCBvZiBuZXh0IHJlc3VsdCBzbG90ICAqLwogCWxvbmcJICAgICAgICAgICAgICAgICAgc2VuZF9tYXJrZXI7CQkvKiBtdXN0IHdlIHNlbmQgYSBtYXJrZXI/ICAgICAqLwotCXN0cnVjdCBzYnVzX2RldgkJICpzZGV2OworCXN0cnVjdCBvZl9kZXZpY2UJICpvcDsKIAl1bnNpZ25lZCBsb25nCQkgIF9fcGFkOwogCiAJaW50ICAgICAgICAgICAgICAgICAgICAgICBjbWRfY291bnRbTUFYX1RBUkdFVFNdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggZWU2YmU1OS4uMmFjM2NiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC0yOTEsNyArMjkxLDYgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQljbWQtPmRldmljZSA9IGRldjsKLQkJaW5pdF90aW1lcigmY21kLT5laF90aW1lb3V0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmNtZC0+bGlzdCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2FkZF90YWlsKCZjbWQtPmxpc3QsICZkZXYtPmNtZF9saXN0KTsKQEAgLTY1MiwyNiArNjUxLDMzIEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCBydG4gPSAwOwogCisJLyoKKwkgKiBXZSB3aWxsIHVzZSBhIHF1ZXVlZCBjb21tYW5kIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugd2Ugd2lsbAorCSAqIGVtdWxhdGUgdGhlIHF1ZXVpbmcgYW5kIGNhbGxpbmcgb2YgY29tcGxldGlvbiBmdW5jdGlvbiBvdXJzZWx2ZXMuCisJICovCisJYXRvbWljX2luYygmY21kLT5kZXZpY2UtPmlvcmVxdWVzdF9jbnQpOworCiAJLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB1c2FibGUgKi8KIAlpZiAodW5saWtlbHkoY21kLT5kZXZpY2UtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpKSB7CiAJCS8qIGluIFNERVZfREVMIHdlIGVycm9yIGFsbCBjb21tYW5kcy4gRElEX05PX0NPTk5FQ1QKIAkJICogcmV0dXJucyBhbiBpbW1lZGlhdGUgZXJyb3IgdXB3YXJkcywgYW5kIHNpZ25hbHMKIAkJICogdGhhdCB0aGUgZGV2aWNlIGlzIG5vIGxvbmdlciBwcmVzZW50ICovCiAJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7Ci0JCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb3JlcXVlc3RfY250KTsKLQkJX19zY3NpX2RvbmUoY21kKTsKKwkJc2NzaV9kb25lKGNtZCk7CiAJCS8qIHJldHVybiAwIChiZWNhdXNlIHRoZSBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZCkgKi8KIAkJZ290byBvdXQ7CiAJfQogCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzY3NpIGxsZCBwdXQgdGhpcyBkZXZpY2UgaW50byBzdGF0ZSBTREVWX0JMT0NLLiAqLwotCWlmICh1bmxpa2VseShjbWQtPmRldmljZS0+c2Rldl9zdGF0ZSA9PSBTREVWX0JMT0NLKSkgeworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgc2NzaSBsbGQgbWFkZSB0aGlzIGRldmljZSBibG9ja2VkLiAqLworCWlmICh1bmxpa2VseShzY3NpX2RldmljZV9ibG9ja2VkKGNtZC0+ZGV2aWNlKSkpIHsKIAkJLyogCi0JCSAqIGluIFNERVZfQkxPQ0ssIHRoZSBjb21tYW5kIGlzIGp1c3QgcHV0IGJhY2sgb24gdGhlIGRldmljZQotCQkgKiBxdWV1ZS4gIFRoZSBzdXNwZW5kIHN0YXRlIGhhcyBhbHJlYWR5IGJsb2NrZWQgdGhlIHF1ZXVlIHNvCi0JCSAqIGZ1dHVyZSByZXF1ZXN0cyBzaG91bGQgbm90IG9jY3VyIHVudGlsIHRoZSBkZXZpY2UgCi0JCSAqIHRyYW5zaXRpb25zIG91dCBvZiB0aGUgc3VzcGVuZCBzdGF0ZS4KKwkJICogaW4gYmxvY2tlZCBzdGF0ZSwgdGhlIGNvbW1hbmQgaXMganVzdCBwdXQgYmFjayBvbgorCQkgKiB0aGUgZGV2aWNlIHF1ZXVlLiAgVGhlIHN1c3BlbmQgc3RhdGUgaGFzIGFscmVhZHkKKwkJICogYmxvY2tlZCB0aGUgcXVldWUgc28gZnV0dXJlIHJlcXVlc3RzIHNob3VsZCBub3QKKwkJICogb2NjdXIgdW50aWwgdGhlIGRldmljZSB0cmFuc2l0aW9ucyBvdXQgb2YgdGhlCisJCSAqIHN1c3BlbmQgc3RhdGUuCiAJCSAqLworCiAJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZKTsKIAogCQlTQ1NJX0xPR19NTFFVRVVFKDMsIHByaW50aygicXVldWVjb21tYW5kIDogZGV2aWNlIGJsb2NrZWQgXG4iKSk7CkBAIC03MTQsMjEgKzcyMCw5IEBACiAJCWhvc3QtPnJlc2V0dGluZyA9IDA7CiAJfQogCi0JLyogCi0JICogQUs6IHVubGlrZWx5IHJhY2UgaGVyZTogZm9yIHNvbWUgcmVhc29uIHRoZSB0aW1lciBjb3VsZAotCSAqIGV4cGlyZSBiZWZvcmUgdGhlIHNlcmlhbCBudW1iZXIgaXMgc2V0IHVwIGJlbG93LgotCSAqLwotCXNjc2lfYWRkX3RpbWVyKGNtZCwgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kLCBzY3NpX3RpbWVzX291dCk7Ci0KIAlzY3NpX2xvZ19zZW5kKGNtZCk7CiAKIAkvKgotCSAqIFdlIHdpbGwgdXNlIGEgcXVldWVkIGNvbW1hbmQgaWYgcG9zc2libGUsIG90aGVyd2lzZSB3ZSB3aWxsCi0JICogZW11bGF0ZSB0aGUgcXVldWluZyBhbmQgY2FsbGluZyBvZiBjb21wbGV0aW9uIGZ1bmN0aW9uIG91cnNlbHZlcy4KLQkgKi8KLQlhdG9taWNfaW5jKCZjbWQtPmRldmljZS0+aW9yZXF1ZXN0X2NudCk7Ci0KLQkvKgogCSAqIEJlZm9yZSB3ZSBxdWV1ZSB0aGlzIGNvbW1hbmQsIGNoZWNrIGlmIHRoZSBjb21tYW5kCiAJICogbGVuZ3RoIGV4Y2VlZHMgd2hhdCB0aGUgaG9zdCBhZGFwdGVyIGNhbiBoYW5kbGUuCiAJICovCkBAIC03NDQsNiArNzM4LDEyIEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBBSzogdW5saWtlbHkgcmFjZSBoZXJlOiBmb3Igc29tZSByZWFzb24gdGhlIHRpbWVyIGNvdWxkCisJICogZXhwaXJlIGJlZm9yZSB0aGUgc2VyaWFsIG51bWJlciBpcyBzZXQgdXAgYmVsb3cuCisJICoKKwkgKiBUT0RPOiBraWxsIHNlcmlhbCBvciBtb3ZlIHRvIGJsayBsYXllcgorCSAqLwogCXNjc2lfY21kX2dldF9zZXJpYWwoaG9zdCwgY21kKTsgCiAKIAlpZiAodW5saWtlbHkoaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfREVMKSkgewpAQCAtNzU0LDEyICs3NTQsOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCWlmIChydG4pIHsKLQkJaWYgKHNjc2lfZGVsZXRlX3RpbWVyKGNtZCkpIHsKLQkJCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb2RvbmVfY250KTsKLQkJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwKLQkJCQkJICAocnRuID09IFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSkgPwotCQkJCQkgIHJ0biA6IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1kpOwotCQl9CisJCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwgKHJ0biA9PSBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpID8KKwkJCQkJCXJ0biA6IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1kpOwogCQlTQ1NJX0xPR19NTFFVRVVFKDMsCiAJCSAgICBwcmludGsoInF1ZXVlY29tbWFuZCA6IHJlcXVlc3QgcmVqZWN0ZWRcbiIpKTsKIAl9CkBAIC03NzAsMjQgKzc2Niw2IEBACiB9CiAKIC8qKgotICogc2NzaV9yZXFfYWJvcnRfY21kIC0tIFJlcXVlc3QgY29tbWFuZCByZWNvdmVyeSBmb3IgdGhlIHNwZWNpZmllZCBjb21tYW5kCi0gKiBAY21kOiBwb2ludGVyIHRvIHRoZSBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIHRoYXQgU0NTSSBDb3JlIHN0YXJ0IHJlY292ZXJ5IGZvciB0aGUKLSAqIGNvbW1hbmQgYnkgZGVsZXRpbmcgdGhlIHRpbWVyIGFuZCBhZGRpbmcgdGhlIGNvbW1hbmQgdG8gdGhlIGVoCi0gKiBxdWV1ZS4gIEl0IGNhbiBiZSBjYWxsZWQgYnkgZWl0aGVyIExMRERzIG9yIFNDU0kgQ29yZS4gIExMRERzIHdobwotICogaW1wbGVtZW50IHRoZWlyIG93biBlcnJvciByZWNvdmVyeSBNQVkgaWdub3JlIHRoZSB0aW1lb3V0IGV2ZW50IGlmCi0gKiB0aGV5IGdlbmVyYXRlZCBzY3NpX3JlcV9hYm9ydF9jbWQuCi0gKi8KLXZvaWQgc2NzaV9yZXFfYWJvcnRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlpZiAoIXNjc2lfZGVsZXRlX3RpbWVyKGNtZCkpCi0JCXJldHVybjsKLQlzY3NpX3RpbWVzX291dChjbWQpOwotfQotRVhQT1JUX1NZTUJPTChzY3NpX3JlcV9hYm9ydF9jbWQpOwotCi0vKioKICAqIHNjc2lfZG9uZSAtIEVucXVldWUgdGhlIGZpbmlzaGVkIFNDU0kgY29tbWFuZCBpbnRvIHRoZSBkb25lIHF1ZXVlLgogICogQGNtZDogVGhlIFNDU0kgQ29tbWFuZCBmb3Igd2hpY2ggYSBsb3ctbGV2ZWwgZGV2aWNlIGRyaXZlciAoTExERCkgZ2l2ZXMKICAqIG93bmVyc2hpcCBiYWNrIHRvIFNDU0kgQ29yZSAtLSBpLmUuIHRoZSBMTEREIGhhcyBmaW5pc2hlZCB3aXRoIGl0LgpAQCAtODAyLDQyICs3ODAsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCS8qCi0JICogV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGlzIG9uZSB0aW1pbmcgb3V0IGFueW1vcmUuCi0JICogSWYgd2UgYXJlIHVuYWJsZSB0byByZW1vdmUgdGhlIHRpbWVyLCB0aGVuIHRoZSBjb21tYW5kCi0JICogaGFzIGFscmVhZHkgdGltZWQgb3V0LiAgSW4gd2hpY2ggY2FzZSwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvCi0JICogbGV0IHRoZSB0aW1lb3V0IGZ1bmN0aW9uIHJ1biwgYXMgd2UgaGF2ZSBubyBpZGVhIHdoZXJlIGluIGZhY3QKLQkgKiB0aGF0IGZ1bmN0aW9uIGNvdWxkIHJlYWxseSBiZS4gIEl0IG1pZ2h0IGJlIG9uIGFub3RoZXIgcHJvY2Vzc29yLAotCSAqIGV0YywgZXRjLgotCSAqLwotCWlmICghc2NzaV9kZWxldGVfdGltZXIoY21kKSkKLQkJcmV0dXJuOwotCV9fc2NzaV9kb25lKGNtZCk7Ci19Ci0KLS8qIFByaXZhdGUgZW50cnkgdG8gc2NzaV9kb25lKCkgdG8gY29tcGxldGUgYSBjb21tYW5kIHdoZW4gdGhlIHRpbWVyCi0gKiBpc24ndCBydW5uaW5nIC0tLSB1c2VkIGJ5IHNjc2lfdGltZXNfb3V0ICovCi12b2lkIF9fc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBjbWQtPnJlcXVlc3Q7Ci0KLQkvKgotCSAqIFNldCB0aGUgc2VyaWFsIG51bWJlcnMgYmFjayB0byB6ZXJvCi0JICovCi0JY21kLT5zZXJpYWxfbnVtYmVyID0gMDsKLQotCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb2RvbmVfY250KTsKLQlpZiAoY21kLT5yZXN1bHQpCi0JCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb2Vycl9jbnQpOwotCi0JQlVHX09OKCFycSk7Ci0KLQkvKgotCSAqIFRoZSB1cHRvZGF0ZS9uYnl0ZXMgdmFsdWVzIGRvbid0IG1hdHRlciwgYXMgd2UgYWxsb3cgcGFydGlhbAotCSAqIGNvbXBsZXRlcyBhbmQgdGh1cyB3aWxsIGNoZWNrIHRoaXMgaW4gdGhlIHNvZnRpcnEgY2FsbGJhY2sKLQkgKi8KLQlycS0+Y29tcGxldGlvbl9kYXRhID0gY21kOwotCWJsa19jb21wbGV0ZV9yZXF1ZXN0KHJxKTsKKwlibGtfY29tcGxldGVfcmVxdWVzdChjbWQtPnJlcXVlc3QpOwogfQogCiAvKiBNb3ZlIHRoaXMgdG8gYSBoZWFkZXIgaWYgaXQgYmVjb21lcyBtb3JlIGdlbmVyYWxseSB1c2VmdWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDg4MDA1MWMuLmZlY2VmYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTEyLDY5ICsxMTIsOCBAQAogfQogCiAvKioKLSAqIHNjc2lfYWRkX3RpbWVyIC0gU3RhcnQgdGltZW91dCB0aW1lciBmb3IgYSBzaW5nbGUgc2NzaSBjb21tYW5kLgotICogQHNjbWQ6CXNjc2kgY29tbWFuZCB0aGF0IGlzIGFib3V0IHRvIHN0YXJ0IHJ1bm5pbmcuCi0gKiBAdGltZW91dDoJYW1vdW50IG9mIHRpbWUgdG8gYWxsb3cgdGhpcyBjb21tYW5kIHRvIHJ1bi4KLSAqIEBjb21wbGV0ZToJdGltZW91dCBmdW5jdGlvbiB0byBjYWxsIGlmIHRpbWVyIGlzbid0IGNhbmNlbGVkLgotICoKLSAqIE5vdGVzOgotICogICAgVGhpcyBzaG91bGQgYmUgdHVybmVkIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uLiAgRWFjaCBzY3NpIGNvbW1hbmQKLSAqICAgIGhhcyBpdHMgb3duIHRpbWVyLCBhbmQgYXMgaXQgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB3ZSBzZXQgdXAgdGhlCi0gKiAgICB0aW1lci4gIFdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLCB3ZSBjYW5jZWwgdGhlIHRpbWVyLgotICovCi12b2lkIHNjc2lfYWRkX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIGludCB0aW1lb3V0LAotCQkgICAgdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQotewotCi0JLyoKLQkgKiBJZiB0aGUgY2xvY2sgd2FzIGFscmVhZHkgcnVubmluZyBmb3IgdGhpcyBjb21tYW5kLCB0aGVuCi0JICogZmlyc3QgZGVsZXRlIHRoZSB0aW1lci4gIFRoZSB0aW1lciBoYW5kbGluZyBjb2RlIGdldHMgcmF0aGVyCi0JICogY29uZnVzZWQgaWYgd2UgZG9uJ3QgZG8gdGhpcy4KLQkgKi8KLQlpZiAoc2NtZC0+ZWhfdGltZW91dC5mdW5jdGlvbikKLQkJZGVsX3RpbWVyKCZzY21kLT5laF90aW1lb3V0KTsKLQotCXNjbWQtPmVoX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjbWQ7Ci0Jc2NtZC0+ZWhfdGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7Ci0Jc2NtZC0+ZWhfdGltZW91dC5mdW5jdGlvbiA9ICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgY29tcGxldGU7Ci0KLQlTQ1NJX0xPR19FUlJPUl9SRUNPVkVSWSg1LCBwcmludGsoIiVzOiBzY21kOiAlcCwgdGltZToiCi0JCQkJCSAgIiAlZCwgKCVwKVxuIiwgX19mdW5jX18sCi0JCQkJCSAgc2NtZCwgdGltZW91dCwgY29tcGxldGUpKTsKLQotCWFkZF90aW1lcigmc2NtZC0+ZWhfdGltZW91dCk7Ci19Ci0KLS8qKgotICogc2NzaV9kZWxldGVfdGltZXIgLSBEZWxldGUvY2FuY2VsIHRpbWVyIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICogQHNjbWQ6CUNtZCB0aGF0IHdlIGFyZSBjYW5jZWxpbmcgdGltZXIgZm9yCi0gKgotICogTm90ZXM6Ci0gKiAgICAgVGhpcyBzaG91bGQgYmUgdHVybmVkIGludG8gYW4gaW5saW5lIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybiB2YWx1ZToKLSAqICAgICAxIGlmIHdlIHdlcmUgYWJsZSB0byBkZXRhY2ggdGhlIHRpbWVyLiAgMCBpZiB3ZSBibGV3IGl0LCBhbmQgdGhlCi0gKiAgICAgdGltZXIgZnVuY3Rpb24gaGFzIGFscmVhZHkgc3RhcnRlZCB0byBydW4uCi0gKi8KLWludCBzY3NpX2RlbGV0ZV90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQotewotCWludCBydG47Ci0KLQlydG4gPSBkZWxfdGltZXIoJnNjbWQtPmVoX3RpbWVvdXQpOwotCi0JU0NTSV9MT0dfRVJST1JfUkVDT1ZFUlkoNSwgcHJpbnRrKCIlczogc2NtZDogJXAsIgotCQkJCQkgIiBydG46ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJIHNjbWQsIHJ0bikpOwotCi0Jc2NtZC0+ZWhfdGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpTlVMTDsKLQlzY21kLT5laF90aW1lb3V0LmZ1bmN0aW9uID0gTlVMTDsKLQotCXJldHVybiBydG47Ci19Ci0KLS8qKgogICogc2NzaV90aW1lc19vdXQgLSBUaW1lb3V0IGZ1bmN0aW9uIGZvciBub3JtYWwgc2NzaSBjb21tYW5kcy4KLSAqIEBzY21kOglDbWQgdGhhdCBpcyB0aW1pbmcgb3V0LgorICogQHJlcToJcmVxdWVzdCB0aGF0IGlzIHRpbWluZyBvdXQuCiAgKgogICogTm90ZXM6CiAgKiAgICAgV2UgZG8gbm90IG5lZWQgdG8gbG9jayB0aGlzLiAgVGhlcmUgaXMgdGhlIHBvdGVudGlhbCBmb3IgYSByYWNlCkBAIC0xODIsOSArMTIxLDExIEBACiAgKiAgICAgbm9ybWFsIGNvbXBsZXRpb24gZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGF0IHRoZSB0aW1lciBoYXMgYWxyZWFkeQogICogICAgIGZpcmVkLCB0aGVuIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcuCiAgKi8KLXZvaWQgc2NzaV90aW1lc19vdXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK2VudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzY3NpX3RpbWVzX291dChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewotCWVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gKCogZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSByZXEtPnNwZWNpYWw7CisJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuICgqZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOworCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBydG4gPSBCTEtfRUhfTk9UX0hBTkRMRUQ7CiAKIAlzY3NpX2xvZ19jb21wbGV0aW9uKHNjbWQsIFRJTUVPVVRfRVJST1IpOwogCkBAIC0xOTYsMjIgKzEzNywyMCBAQAogCQllaF90aW1lZF9vdXQgPSBOVUxMOwogCiAJaWYgKGVoX3RpbWVkX291dCkKLQkJc3dpdGNoIChlaF90aW1lZF9vdXQoc2NtZCkpIHsKLQkJY2FzZSBFSF9IQU5ETEVEOgotCQkJX19zY3NpX2RvbmUoc2NtZCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgRUhfUkVTRVRfVElNRVI6Ci0JCQlzY3NpX2FkZF90aW1lcihzY21kLCBzY21kLT50aW1lb3V0X3Blcl9jb21tYW5kLAotCQkJCSAgICAgICBzY3NpX3RpbWVzX291dCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgRUhfTk9UX0hBTkRMRUQ6CisJCXJ0biA9IGVoX3RpbWVkX291dChzY21kKTsKKwkJc3dpdGNoIChydG4pIHsKKwkJY2FzZSBCTEtfRUhfTk9UX0hBTkRMRUQ6CiAJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBydG47CiAJCX0KIAogCWlmICh1bmxpa2VseSghc2NzaV9laF9zY21kX2FkZChzY21kLCBTQ1NJX0VIX0NBTkNFTF9DTUQpKSkgewogCQlzY21kLT5yZXN1bHQgfD0gRElEX1RJTUVfT1VUIDw8IDE2OwotCQlfX3Njc2lfZG9uZShzY21kKTsKKwkJcmV0dXJuIEJMS19FSF9IQU5ETEVEOwogCX0KKworCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7CiB9CiAKIC8qKgpAQCAtMzkxLDcgKzMzMCw3IEBACiAKIAljYXNlIEhBUkRXQVJFX0VSUk9SOgogCQlpZiAoc2NtZC0+ZGV2aWNlLT5yZXRyeV9od2Vycm9yKQotCQkJcmV0dXJuIE5FRURTX1JFVFJZOworCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwogCQllbHNlCiAJCQlyZXR1cm4gU1VDQ0VTUzsKIApAQCAtMTc5Myw3ICsxNzMyLDYgQEAKIAogCWJsa19ycV9pbml0KE5VTEwsICZyZXEpOwogCXNjbWQtPnJlcXVlc3QgPSAmcmVxOwotCW1lbXNldCgmc2NtZC0+ZWhfdGltZW91dCwgMCwgc2l6ZW9mKHNjbWQtPmVoX3RpbWVvdXQpKTsKIAogCXNjbWQtPmNtbmQgPSByZXEuY21kOwogCkBAIC0xODA0LDggKzE3NDIsNiBAQAogCiAJc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24JCT0gRE1BX0JJRElSRUNUSU9OQUw7CiAKLQlpbml0X3RpbWVyKCZzY21kLT5laF90aW1lb3V0KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAlzaG9zdC0+dG1mX2luX3Byb2dyZXNzID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggZmY1ZDU2Yi4uOThlZTU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTg1Miw3ICs4NTIsNyBAQAogdm9pZCBzY3NpX2lvX2NvbXBsZXRpb24oc3RydWN0IHNjc2lfY21uZCAqY21kLCB1bnNpZ25lZCBpbnQgZ29vZF9ieXRlcykKIHsKIAlpbnQgcmVzdWx0ID0gY21kLT5yZXN1bHQ7Ci0JaW50IHRoaXNfY291bnQgPSBzY3NpX2J1ZmZsZW4oY21kKTsKKwlpbnQgdGhpc19jb3VudDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNtZC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOwogCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7CiAJaW50IGVycm9yID0gMDsKQEAgLTkwOCw2ICs5MDgsNyBAQAogCSAqLwogCWlmIChzY3NpX2VuZF9yZXF1ZXN0KGNtZCwgZXJyb3IsIGdvb2RfYnl0ZXMsIHJlc3VsdCA9PSAwKSA9PSBOVUxMKQogCQlyZXR1cm47CisJdGhpc19jb3VudCA9IGJsa19ycV9ieXRlcyhyZXEpOwogCiAJLyogZ29vZF9ieXRlcyA9IDAsIG9yIChpbmNsdXNpdmUpIHRoZXJlIHdlcmUgbGVmdG92ZXJzIGFuZAogCSAqIHJlc3VsdCA9IDAsIHNvIHNjc2lfZW5kX3JlcXVlc3QgY291bGRuJ3QgcmV0cnkuCkBAIC0xMTgwLDcgKzExODEsNiBAQAogCQogCWNtZC0+dHJhbnNmZXJzaXplID0gcmVxLT5kYXRhX2xlbjsKIAljbWQtPmFsbG93ZWQgPSByZXEtPnJldHJpZXM7Ci0JY21kLT50aW1lb3V0X3Blcl9jb21tYW5kID0gcmVxLT50aW1lb3V0OwogCXJldHVybiBCTEtQUkVQX09LOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3NldHVwX2Jsa19wY19jbW5kKTsKQEAgLTEyNTAsNiArMTI1MCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBTREVWX1FVSUVTQ0U6CiAJCWNhc2UgU0RFVl9CTE9DSzoKKwkJY2FzZSBTREVWX0NSRUFURURfQkxPQ0s6CiAJCQkvKgogCQkJICogSWYgdGhlIGRldmljZXMgaXMgYmxvY2tlZCB3ZSBkZWZlciBub3JtYWwgY29tbWFuZHMuCiAJCQkgKi8KQEAgLTE0MTUsMTcgKzE0MTYsMjYgQEAKIAlzcGluX3VubG9jayhzaG9zdC0+aG9zdF9sb2NrKTsKIAlzcGluX2xvY2soc2Rldi0+cmVxdWVzdF9xdWV1ZS0+cXVldWVfbG9jayk7CiAKLQlfX3Njc2lfZG9uZShjbWQpOworCWJsa19jb21wbGV0ZV9yZXF1ZXN0KHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNjc2lfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBycS0+Y29tcGxldGlvbl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgd2FpdF9mb3IgPSAoY21kLT5hbGxvd2VkICsgMSkgKiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcnEtPnNwZWNpYWw7CisJdW5zaWduZWQgbG9uZyB3YWl0X2ZvciA9IChjbWQtPmFsbG93ZWQgKyAxKSAqIHJxLT50aW1lb3V0OwogCWludCBkaXNwb3NpdGlvbjsKIAogCUlOSVRfTElTVF9IRUFEKCZjbWQtPmVoX2VudHJ5KTsKIAorCS8qCisJICogU2V0IHRoZSBzZXJpYWwgbnVtYmVycyBiYWNrIHRvIHplcm8KKwkgKi8KKwljbWQtPnNlcmlhbF9udW1iZXIgPSAwOworCisJYXRvbWljX2luYygmY21kLT5kZXZpY2UtPmlvZG9uZV9jbnQpOworCWlmIChjbWQtPnJlc3VsdCkKKwkJYXRvbWljX2luYygmY21kLT5kZXZpY2UtPmlvZXJyX2NudCk7CisKIAlkaXNwb3NpdGlvbiA9IHNjc2lfZGVjaWRlX2Rpc3Bvc2l0aW9uKGNtZCk7CiAJaWYgKGRpc3Bvc2l0aW9uICE9IFNVQ0NFU1MgJiYKIAkgICAgdGltZV9iZWZvcmUoY21kLT5qaWZmaWVzX2F0X2FsbG9jICsgd2FpdF9mb3IsIGppZmZpZXMpKSB7CkBAIC0xNjc0LDYgKzE2ODQsNyBAQAogCiAJYmxrX3F1ZXVlX3ByZXBfcnEocSwgc2NzaV9wcmVwX2ZuKTsKIAlibGtfcXVldWVfc29mdGlycV9kb25lKHEsIHNjc2lfc29mdGlycV9kb25lKTsKKwlibGtfcXVldWVfcnFfdGltZWRfb3V0KHEsIHNjc2lfdGltZXNfb3V0KTsKIAlyZXR1cm4gcTsKIH0KIApAQCAtMjA2MywxMCArMjA3NCwxMyBAQAogCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgU0RFVl9DUkVBVEVEOgotCQkvKiBUaGVyZSBhcmUgbm8gbGVnYWwgc3RhdGVzIHRoYXQgY29tZSBiYWNrIHRvCi0JCSAqIGNyZWF0ZWQuICBUaGlzIGlzIHRoZSBtYW51YWxseSBpbml0aWFsaXNlZCBzdGFydAotCQkgKiBzdGF0ZSAqLwotCQlnb3RvIGlsbGVnYWw7CisJCXN3aXRjaCAob2xkc3RhdGUpIHsKKwkJY2FzZSBTREVWX0NSRUFURURfQkxPQ0s6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaWxsZWdhbDsKKwkJfQorCQlicmVhazsKIAkJCQogCWNhc2UgU0RFVl9SVU5OSU5HOgogCQlzd2l0Y2ggKG9sZHN0YXRlKSB7CkBAIC0yMTA0LDggKzIxMTgsMTcgQEAKIAogCWNhc2UgU0RFVl9CTE9DSzoKIAkJc3dpdGNoIChvbGRzdGF0ZSkgewotCQljYXNlIFNERVZfQ1JFQVRFRDoKIAkJY2FzZSBTREVWX1JVTk5JTkc6CisJCWNhc2UgU0RFVl9DUkVBVEVEX0JMT0NLOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGlsbGVnYWw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNERVZfQ1JFQVRFRF9CTE9DSzoKKwkJc3dpdGNoIChvbGRzdGF0ZSkgeworCQljYXNlIFNERVZfQ1JFQVRFRDoKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ290byBpbGxlZ2FsOwpAQCAtMjM5Myw4ICsyNDE2LDEyIEBACiAJaW50IGVyciA9IDA7CiAKIAllcnIgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9CTE9DSyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX0NSRUFURURfQkxPQ0spOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KIAogCS8qIAogCSAqIFRoZSBkZXZpY2UgaGFzIHRyYW5zaXRpb25lZCB0byBTREVWX0JMT0NLLiAgU3RvcCB0aGUKQEAgLTI0MzcsOCArMjQ2NCwxMiBAQAogCSAqIGFuZCBnb29zZSB0aGUgZGV2aWNlIHF1ZXVlIGlmIHN1Y2Nlc3NmdWwuICAKIAkgKi8KIAllcnIgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9SVU5OSU5HKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCWlmIChlcnIpIHsKKwkJZXJyID0gc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfQ1JFQVRFRCk7CisKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCWJsa19zdGFydF9xdWV1ZShxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYwppbmRleCBhZTdlZDlhLi5iMzdlMTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCkBAIC0zMCw2ICszMSwzOSBAQAogc3RydWN0IHNvY2sgKnNjc2lfbmxfc29jayA9IE5VTEw7CiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX25sX3NvY2spOwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNjc2lfbmxfbG9jayk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzY3NpX25sX2RyaXZlcnM7CisKK3N0YXRpYyB1MzIJc2NzaV9ubF9zdGF0ZTsKKyNkZWZpbmUgU1RBVEVfRUhBTkRMRVJfQlNZCQkweDAwMDAwMDAxCisKK3N0cnVjdCBzY3NpX25sX3RyYW5zcG9ydCB7CisJaW50ICgqbXNnX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICopOworCXZvaWQgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKKwl1bnNpZ25lZCBpbnQgcmVmY250OworCWludCBmbGFnczsKK307CisKKy8qIGZsYWdzIHZhbHVlcyAoYml0IGZsYWdzKSAqLworI2RlZmluZSBIQU5ETEVSX0RFTEVUSU5HCQkweDEKKworc3RhdGljIHN0cnVjdCBzY3NpX25sX3RyYW5zcG9ydCB0cmFuc3BvcnRzW1NDU0lfTkxfTUFYX1RSQU5TUE9SVFNdID0KKwl7IHtOVUxMLCB9LCB9OworCisKK3N0cnVjdCBzY3NpX25sX2RydnIgeworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKKwlpbnQgKCpkbXNnX2hhbmRsZXIpKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpwYXlsb2FkLAorCQkJCSB1MzIgbGVuLCB1MzIgcGlkKTsKKwl2b2lkICgqZGV2dF9oYW5kbGVyKShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpub3RpZnlfcHRyKTsKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dDsKKwl1NjQgdmVuZG9yX2lkOworCXVuc2lnbmVkIGludCByZWZjbnQ7CisJaW50IGZsYWdzOworfTsKKworCiAKIC8qKgogICogc2NzaV9ubF9yY3ZfbXNnIC0gUmVjZWl2ZSBtZXNzYWdlIGhhbmRsZXIuCkBAIC00NSw4ICs3OSw5IEBACiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHNjc2lfbmxfaGRyICpoZHI7Ci0JdWludDMyX3QgcmxlbjsKLQlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJsZW47CisJaW50IGVyciwgdHBvcnQ7CiAKIAl3aGlsZSAoc2tiLT5sZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKIAkJZXJyID0gMDsKQEAgLTY1LDcgKzEwMCw3IEBACiAKIAkJaWYgKG5saC0+bmxtc2dfdHlwZSAhPSBTQ1NJX1RSQU5TUE9SVF9NU0cpIHsKIAkJCWVyciA9IC1FQkFETVNHOwotCQkJcmV0dXJuOworCQkJZ290byBuZXh0X21zZzsKIAkJfQogCiAJCWhkciA9IE5MTVNHX0RBVEEobmxoKTsKQEAgLTgzLDEyICsxMTgsMjcgQEAKIAkJaWYgKG5saC0+bmxtc2dfbGVuIDwgKHNpemVvZigqbmxoKSArIGhkci0+bXNnbGVuKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRpc2NhcmRpbmcgcGFydGlhbCBtZXNzYWdlXG4iLAogCQkJCSBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG5leHRfbXNnOwogCQl9CiAKIAkJLyoKLQkJICogV2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgYW55b25lIHNlbmRpbmcgdXMgYSBtZXNzYWdlCisJCSAqIERlbGl2ZXIgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgdHJhbnNwb3J0CiAJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisKKwkJdHBvcnQgPSBoZHItPnRyYW5zcG9ydDsKKwkJaWYgKCh0cG9ydCA8IFNDU0lfTkxfTUFYX1RSQU5TUE9SVFMpICYmCisJCSAgICAhKHRyYW5zcG9ydHNbdHBvcnRdLmZsYWdzICYgSEFORExFUl9ERUxFVElORykgJiYKKwkJICAgICh0cmFuc3BvcnRzW3Rwb3J0XS5tc2dfaGFuZGxlcikpIHsKKwkJCXRyYW5zcG9ydHNbdHBvcnRdLnJlZmNudCsrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQllcnIgPSB0cmFuc3BvcnRzW3Rwb3J0XS5tc2dfaGFuZGxlcihza2IpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCQkJdHJhbnNwb3J0c1t0cG9ydF0ucmVmY250LS07CisJCX0gZWxzZQorCQkJZXJyID0gLUVOT0VOVDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKIAogbmV4dF9tc2c6CiAJCWlmICgoZXJyKSB8fCAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0FDSykpCkBAIC0xMTAsMTQgKzE2MCw0MiBAQAogc2NzaV9ubF9yY3ZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IG5ldGxpbmtfbm90aWZ5ICpuID0gcHRyOworCXN0cnVjdCBzY3NpX25sX2RydnIgKmRyaXZlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0cG9ydDsKIAogCWlmIChuLT5wcm90b2NvbCAhPSBORVRMSU5LX1NDU0lUUkFOU1BPUlQpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwlzY3NpX25sX3N0YXRlIHw9IFNUQVRFX0VIQU5ETEVSX0JTWTsKKwogCS8qCi0JICogQ3VycmVudGx5LCB3ZSBhcmUgbm90IHRyYWNraW5nIFBJRCdzLCBldGMuIFRoZXJlIGlzIG5vdGhpbmcKLQkgKiB0byBoYW5kbGUuCisJICogUGFzcyBldmVudCBvbiB0byBhbnkgdHJhbnNwb3J0cyB0aGF0IG1heSBiZSBsaXN0ZW5pbmcKIAkgKi8KKwlmb3IgKHRwb3J0ID0gMDsgdHBvcnQgPCBTQ1NJX05MX01BWF9UUkFOU1BPUlRTOyB0cG9ydCsrKSB7CisJCWlmICghKHRyYW5zcG9ydHNbdHBvcnRdLmZsYWdzICYgSEFORExFUl9ERUxFVElORykgJiYKKwkJICAgICh0cmFuc3BvcnRzW3Rwb3J0XS5ldmVudF9oYW5kbGVyKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQl0cmFuc3BvcnRzW3Rwb3J0XS5ldmVudF9oYW5kbGVyKHRoaXMsIGV2ZW50LCBwdHIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJLyoKKwkgKiBQYXNzIGV2ZW50IG9uIHRvIGFueSBkcml2ZXJzIHRoYXQgbWF5IGJlIGxpc3RlbmluZworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJpdmVyLCAmc2NzaV9ubF9kcml2ZXJzLCBuZXh0KSB7CisJCWlmICghKGRyaXZlci0+ZmxhZ3MgJiBIQU5ETEVSX0RFTEVUSU5HKSAmJgorCQkgICAgKGRyaXZlci0+ZGV2dF9oYW5kbGVyKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQlkcml2ZXItPmRldnRfaGFuZGxlcih0aGlzLCBldmVudCwgcHRyKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXNjc2lfbmxfc3RhdGUgJj0gflNUQVRFX0VIQU5ETEVSX0JTWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTEyOCw3ICsyMDYsMjgxIEBACiAKIAogLyoqCi0gKiBzY3NpX25ldGxpbmtfaW5pdCAtIENhbGxlZCBieSBTQ1NJIHN1YnN5c3RlbSB0byBpbnRpYWxpemUgdGhlIFNDU0kgdHJhbnNwb3J0IG5ldGxpbmsgaW50ZXJmYWNlCisgKiBHRU5FUklDIFNDU0kgdHJhbnNwb3J0IHJlY2VpdmUgYW5kIGV2ZW50IGhhbmRsZXJzCisgKiovCisKKy8qKgorICogc2NzaV9nZW5lcmljX21zZ19oYW5kbGVyIC0gcmVjZWl2ZSBtZXNzYWdlIGhhbmRsZXIgZm9yIEdFTkVSSUMgdHJhbnNwb3J0CisgKiAJCQkgbWVzc2FnZXMKKyAqCisgKiBAc2tiOgkJc29ja2V0IHJlY2VpdmUgYnVmZmVyCisgKgorICoqLworc3RhdGljIGludAorc2NzaV9nZW5lcmljX21zZ19oYW5kbGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBubG1zZ19oZHIoc2tiKTsKKwlzdHJ1Y3Qgc2NzaV9ubF9oZHIgKnNubGggPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IHNjc2lfbmxfZHJ2ciAqZHJpdmVyOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDAsIG1hdGNoLCBwaWQ7CisKKwlwaWQgPSBORVRMSU5LX0NSRURTKHNrYiktPnBpZDsKKworCXN3aXRjaCAoc25saC0+bXNndHlwZSkgeworCWNhc2UgU0NTSV9OTF9TSE9TVF9WRU5ET1I6CisJCXsKKwkJc3RydWN0IHNjc2lfbmxfaG9zdF92ZW5kb3JfbXNnICptc2cgPSBOTE1TR19EQVRBKG5saCk7CisKKwkJLyogTG9jYXRlIHRoZSBkcml2ZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWVzc2FnZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCW1hdGNoID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkcml2ZXIsICZzY3NpX25sX2RyaXZlcnMsIG5leHQpIHsKKwkJCWlmIChkcml2ZXItPnZlbmRvcl9pZCA9PSBtc2ctPnZlbmRvcl9pZCkgeworCQkJCW1hdGNoID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICgoIW1hdGNoKSB8fCAoIWRyaXZlci0+ZG1zZ19oYW5kbGVyKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQllcnIgPSAtRVNSQ0g7CisJCQlnb3RvIHJjdl9leGl0OworCQl9CisKKwkJaWYgKGRyaXZlci0+ZmxhZ3MgJiBIQU5ETEVSX0RFTEVUSU5HKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJCWVyciA9IC1FU0hVVERPV047CisJCQlnb3RvIHJjdl9leGl0OworCQl9CisKKwkJZHJpdmVyLT5yZWZjbnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisKKworCQkvKiBpZiBzdWNjZXNzZnVsLCBzY3NpX2hvc3RfbG9va3VwIHRha2VzIGEgc2hvc3QgcmVmZXJlbmNlICovCisJCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChtc2ctPmhvc3Rfbm8pOworCQlpZiAoIXNob3N0KSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBkcml2ZXJfZXhpdDsKKwkJfQorCisJCS8qIGlzIHRoaXMgaG9zdCBvd25lZCBieSB0aGUgdmVuZG9yID8gKi8KKwkJaWYgKHNob3N0LT5ob3N0dCAhPSBkcml2ZXItPmhvc3R0KSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byB2ZW5kb3Jtc2dfcHV0OworCQl9CisKKwkJLyogcGFzcyBtZXNzYWdlIG9uIHRvIHRoZSBkcml2ZXIgKi8KKwkJZXJyID0gZHJpdmVyLT5kbXNnX2hhbmRsZXIoc2hvc3QsICh2b2lkICopJm1zZ1sxXSwKKwkJCQkJIG1zZy0+dm1zZ19kYXRhbGVuLCBwaWQpOworCit2ZW5kb3Jtc2dfcHV0OgorCQkvKiByZWxlYXNlIHJlZmVyZW5jZSBieSBzY3NpX2hvc3RfbG9va3VwICovCisJCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCitkcml2ZXJfZXhpdDoKKwkJLyogcmVsZWFzZSBvdXIgb3duIHJlZmVyZW5jZSBvbiB0aGUgcmVnaXN0cmF0aW9uIG9iamVjdCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCWRyaXZlci0+cmVmY250LS07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZXJyID0gLUVCQURSOworCQlicmVhazsKKwl9CisKK3Jjdl9leGl0OgorCWlmIChlcnIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNc2d0eXBlICVkIGZhaWxlZCAtIGVyciAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc25saC0+bXNndHlwZSwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKgorICogc2NzaV9ubF9hZGRfdHJhbnNwb3J0IC0KKyAqICAgIFJlZ2lzdGVycyBtZXNzYWdlIGFuZCBldmVudCBoYW5kbGVycyBmb3IgYSB0cmFuc3BvcnQuIEVuYWJsZXMKKyAqICAgIHJlY2VpcHQgb2YgbmV0bGluayBtZXNzYWdlcyBhbmQgZXZlbnRzIHRvIGEgdHJhbnNwb3J0LgorICoKKyAqIEB0cG9ydDoJCXRyYW5zcG9ydCByZWdpc3RlcmluZyBoYW5kbGVycworICogQG1zZ19oYW5kbGVyOglyZWNlaXZlIG1lc3NhZ2UgaGFuZGxlciBjYWxsYmFjaworICogQGV2ZW50X2hhbmRsZXI6CXJlY2VpdmUgZXZlbnQgaGFuZGxlciBjYWxsYmFjaworICoqLworaW50CitzY3NpX25sX2FkZF90cmFuc3BvcnQodTggdHBvcnQsCisJaW50ICgqbXNnX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICopLAorCXZvaWQgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKHRwb3J0ID49IFNDU0lfTkxfTUFYX1RSQU5TUE9SVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCisJaWYgKHNjc2lfbmxfc3RhdGUgJiBTVEFURV9FSEFORExFUl9CU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCW1zbGVlcCgxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCX0KKworCWlmICh0cmFuc3BvcnRzW3Rwb3J0XS5tc2dfaGFuZGxlciB8fCB0cmFuc3BvcnRzW3Rwb3J0XS5ldmVudF9oYW5kbGVyKSB7CisJCWVyciA9IC1FQUxSRUFEWTsKKwkJZ290byByZWdpc3Rlcl9vdXQ7CisJfQorCisJdHJhbnNwb3J0c1t0cG9ydF0ubXNnX2hhbmRsZXIgPSBtc2dfaGFuZGxlcjsKKwl0cmFuc3BvcnRzW3Rwb3J0XS5ldmVudF9oYW5kbGVyID0gZXZlbnRfaGFuZGxlcjsKKwl0cmFuc3BvcnRzW3Rwb3J0XS5mbGFncyA9IDA7CisJdHJhbnNwb3J0c1t0cG9ydF0ucmVmY250ID0gMDsKKworcmVnaXN0ZXJfb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNjc2lfbmxfYWRkX3RyYW5zcG9ydCk7CisKKworLyoqCisgKiBzY3NpX25sX3JlbW92ZV90cmFuc3BvcnQgLQorICogICAgRGlzYWJsZSB0cmFuc3BvcnQgcmVjZWlwdGlvbiBvZiBtZXNzYWdlcyBhbmQgZXZlbnRzCisgKgorICogQHRwb3J0OgkJdHJhbnNwb3J0IGRlcmVnaXN0ZXJpbmcgaGFuZGxlcnMKKyAqCisgKiovCit2b2lkCitzY3NpX25sX3JlbW92ZV90cmFuc3BvcnQodTggdHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwlpZiAoc2NzaV9ubF9zdGF0ZSAmIFNUQVRFX0VIQU5ETEVSX0JTWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKHRwb3J0IDwgU0NTSV9OTF9NQVhfVFJBTlNQT1JUUykgeworCQl0cmFuc3BvcnRzW3Rwb3J0XS5mbGFncyB8PSBIQU5ETEVSX0RFTEVUSU5HOworCisJCXdoaWxlICh0cmFuc3BvcnRzW3Rwb3J0XS5yZWZjbnQgIT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWi80KTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJfQorCQl0cmFuc3BvcnRzW3Rwb3J0XS5tc2dfaGFuZGxlciA9IE5VTEw7CisJCXRyYW5zcG9ydHNbdHBvcnRdLmV2ZW50X2hhbmRsZXIgPSBOVUxMOworCQl0cmFuc3BvcnRzW3Rwb3J0XS5mbGFncyA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX25sX3JlbW92ZV90cmFuc3BvcnQpOworCisKKy8qKgorICogc2NzaV9ubF9hZGRfZHJpdmVyIC0KKyAqICAgIEEgZHJpdmVyIGlzIHJlZ2lzdGVyaW5nIGl0cyBpbnRlcmZhY2VzIGZvciBTQ1NJIG5ldGxpbmsgbWVzc2FnZXMKKyAqCisgKiBAdmVuZG9yX2lkOiAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWNhdGlvbiB2YWx1ZSBmb3IgdGhlIGRyaXZlci4KKyAqIEBob3N0dDoJCWFkZHJlc3Mgb2YgdGhlIGRyaXZlcidzIGhvc3QgdGVtcGxhdGUuIFVzZWQKKyAqCQkJdG8gdmVyaWZ5IGFuIHNob3N0IGlzIGJvdW5kIHRvIHRoZSBkcml2ZXIKKyAqIEBubG1zZ19oYW5kbGVyOglyZWNlaXZlIG1lc3NhZ2UgaGFuZGxlciBjYWxsYmFjaworICogQG5sZXZ0X2hhbmRsZXI6CXJlY2VpdmUgZXZlbnQgaGFuZGxlciBjYWxsYmFjaworICoKKyAqIFJldHVybnM6CisgKiAgIDAgb24gU3VjY2VzcworICogICBlcnJvciByZXN1bHQgb3RoZXJ3aXNlCisgKiovCitpbnQKK3Njc2lfbmxfYWRkX2RyaXZlcih1NjQgdmVuZG9yX2lkLCBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dCwKKwlpbnQgKCpubG1zZ19oYW5kbGVyKShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdm9pZCAqcGF5bG9hZCwKKwkJCQkgdTMyIGxlbiwgdTMyIHBpZCksCisJdm9pZCAoKm5sZXZ0X2hhbmRsZXIpKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKm5vdGlmeV9wdHIpKQoreworCXN0cnVjdCBzY3NpX25sX2RydnIgKmRyaXZlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHJpdmVyID0ga3phbGxvYyhzaXplb2YoKmRyaXZlciksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJpdmVyLT5kbXNnX2hhbmRsZXIgPSBubG1zZ19oYW5kbGVyOworCWRyaXZlci0+ZGV2dF9oYW5kbGVyID0gbmxldnRfaGFuZGxlcjsKKwlkcml2ZXItPmhvc3R0ID0gaG9zdHQ7CisJZHJpdmVyLT52ZW5kb3JfaWQgPSB2ZW5kb3JfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJaWYgKHNjc2lfbmxfc3RhdGUgJiBTVEFURV9FSEFORExFUl9CU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCW1zbGVlcCgxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCX0KKwlsaXN0X2FkZF90YWlsKCZkcml2ZXItPm5leHQsICZzY3NpX25sX2RyaXZlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX25sX2FkZF9kcml2ZXIpOworCisKKy8qKgorICogc2NzaV9ubF9yZW1vdmVfZHJpdmVyIC0KKyAqICAgIEFuIGRyaXZlciBpcyB1bnJlZ2lzdGVyaW5nIHdpdGggdGhlIFNDU0kgbmV0bGluayBtZXNzYWdlcworICoKKyAqIEB2ZW5kb3JfaWQ6ICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmljYXRpb24gdmFsdWUgZm9yIHRoZSBkcml2ZXIuCisgKiovCit2b2lkCitzY3NpX25sX3JlbW92ZV9kcml2ZXIodTY0IHZlbmRvcl9pZCkKK3sKKwlzdHJ1Y3Qgc2NzaV9ubF9kcnZyICpkcml2ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwlpZiAoc2NzaV9ubF9zdGF0ZSAmIFNUQVRFX0VIQU5ETEVSX0JTWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkcml2ZXIsICZzY3NpX25sX2RyaXZlcnMsIG5leHQpIHsKKwkJaWYgKGRyaXZlci0+dmVuZG9yX2lkID09IHZlbmRvcl9pZCkgeworCQkJZHJpdmVyLT5mbGFncyB8PSBIQU5ETEVSX0RFTEVUSU5HOworCQkJd2hpbGUgKGRyaXZlci0+cmVmY250ICE9IDApIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWi80KTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9ubF9sb2NrLCBmbGFncyk7CisJCQl9CisJCQlsaXN0X2RlbCgmZHJpdmVyLT5uZXh0KTsKKwkJCWtmcmVlKGRyaXZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX25sX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfbmxfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogcmVtb3ZhbCBvZiBkcml2ZXIgZmFpbGVkIC0gdmVuZG9yX2lkIDB4JWxseFxuIiwKKwkgICAgICAgX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpdmVuZG9yX2lkKTsKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX25sX3JlbW92ZV9kcml2ZXIpOworCisKKy8qKgorICogc2NzaV9uZXRsaW5rX2luaXQgLSBDYWxsZWQgYnkgU0NTSSBzdWJzeXN0ZW0gdG8gaW50aWFsaXplCisgKiAJdGhlIFNDU0kgdHJhbnNwb3J0IG5ldGxpbmsgaW50ZXJmYWNlCiAgKgogICoqLwogdm9pZApAQCAtMTM2LDYgKzQ4OCw4IEBACiB7CiAJaW50IGVycm9yOwogCisJSU5JVF9MSVNUX0hFQUQoJnNjc2lfbmxfZHJpdmVycyk7CisKIAllcnJvciA9IG5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJnNjc2lfbmV0bGlua19ub3RpZmllcik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lzdGVyIG9mIGV2ZW50IGhhbmRsZXIgZmFpbGVkIC0gJWRcbiIsCkBAIC0xNTAsOCArNTA0LDE1IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lzdGVyIG9mIHJlY2lldmUgaGFuZGxlciBmYWlsZWRcbiIsCiAJCQkJX19mdW5jX18pOwogCQluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJnNjc2lfbmV0bGlua19ub3RpZmllcik7CisJCXJldHVybjsKIAl9CiAKKwkvKiBSZWdpc3RlciB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgZ2VuZXJpYyBTQ1NJIHRyYW5zcG9ydCAqLworCWVycm9yID0gc2NzaV9ubF9hZGRfdHJhbnNwb3J0KFNDU0lfTkxfVFJBTlNQT1JULAorCQkJCXNjc2lfZ2VuZXJpY19tc2dfaGFuZGxlciwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3RlciBvZiBHRU5FUklDIHRyYW5zcG9ydCBoYW5kbGVyIgorCQkJCSIgIGZhaWxlZCAtICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOwogCXJldHVybjsKIH0KIApAQCAtMTYzLDYgKzUyNCw4IEBACiB2b2lkCiBzY3NpX25ldGxpbmtfZXhpdCh2b2lkKQogeworCXNjc2lfbmxfcmVtb3ZlX3RyYW5zcG9ydChTQ1NJX05MX1RSQU5TUE9SVCk7CisKIAlpZiAoc2NzaV9ubF9zb2NrKSB7CiAJCW5ldGxpbmtfa2VybmVsX3JlbGVhc2Uoc2NzaV9ubF9zb2NrKTsKIAkJbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKCZzY3NpX25ldGxpbmtfbm90aWZpZXIpOwpAQCAtMTcyLDMgKzUzNSwxNDcgQEAKIH0KIAogCisvKgorICogRXhwb3J0ZWQgSW50ZXJmYWNlcworICovCisKKy8qKgorICogc2NzaV9ubF9zZW5kX3RyYW5zcG9ydF9tc2cgLQorICogICAgR2VuZXJpYyBmdW5jdGlvbiB0byBzZW5kIGEgc2luZ2xlIG1lc3NhZ2UgZnJvbSBhIFNDU0kgdHJhbnNwb3J0IHRvCisgKiAgICBhIHNpbmdsZSBwcm9jZXNzCisgKgorICogQHBpZDoJCXJlY2VpdmluZyBwaWQKKyAqIEBoZHI6CQltZXNzYWdlIHBheWxvYWQKKyAqCisgKiovCit2b2lkCitzY3NpX25sX3NlbmRfdHJhbnNwb3J0X21zZyh1MzIgcGlkLCBzdHJ1Y3Qgc2NzaV9ubF9oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkcgkqbmxoOworCWNvbnN0IGNoYXIgKmZuOworCWNoYXIgKmRhdGFiOworCXUzMiBsZW4sIHNrYmxlbjsKKwlpbnQgZXJyOworCisJaWYgKCFzY3NpX25sX3NvY2spIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZm4gPSAibmV0bGluayBzb2NrZXQiOworCQlnb3RvIG1zZ19mYWlsOworCX0KKworCWxlbiA9IE5MTVNHX1NQQUNFKGhkci0+bXNnbGVuKTsKKwlza2JsZW4gPSBOTE1TR19TUEFDRShsZW4pOworCisJc2tiID0gYWxsb2Nfc2tiKHNrYmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWZuID0gImFsbG9jX3NrYiI7CisJCWdvdG8gbXNnX2ZhaWw7CisJfQorCisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCAwLCBTQ1NJX1RSQU5TUE9SVF9NU0csIGxlbiAtIHNpemVvZigqbmxoKSwgMCk7CisJaWYgKCFubGgpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWZuID0gIm5sbXNnX3B1dCI7CisJCWdvdG8gbXNnX2ZhaWxfc2tiOworCX0KKwlkYXRhYiA9IE5MTVNHX0RBVEEobmxoKTsKKwltZW1jcHkoZGF0YWIsIGhkciwgaGRyLT5tc2dsZW4pOworCisJZXJyID0gbmxtc2dfdW5pY2FzdChzY3NpX25sX3NvY2ssIHNrYiwgcGlkKTsKKwlpZiAoZXJyIDwgMCkgeworCQlmbiA9ICJubG1zZ191bmljYXN0IjsKKwkJLyogbmxtc2dfdW5pY2FzdCBhbHJlYWR5IGtmcmVlX3NrYidkICovCisJCWdvdG8gbXNnX2ZhaWw7CisJfQorCisJcmV0dXJuOworCittc2dfZmFpbF9za2I6CisJa2ZyZWVfc2tiKHNrYik7Cittc2dfZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJCSIlczogRHJvcHBlZCBNZXNzYWdlIDogcGlkICVkIFRyYW5zcG9ydCAlZCwgbXNndHlwZSB4JXgsICIKKwkJIm1zZ2xlbiAlZDogJXMgOiBlcnIgJWRcbiIsCisJCV9fZnVuY19fLCBwaWQsIGhkci0+dHJhbnNwb3J0LCBoZHItPm1zZ3R5cGUsIGhkci0+bXNnbGVuLAorCQlmbiwgZXJyKTsKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX25sX3NlbmRfdHJhbnNwb3J0X21zZyk7CisKKworLyoqCisgKiBzY3NpX25sX3NlbmRfdmVuZG9yX21zZyAtIGNhbGxlZCB0byBzZW5kIGEgc2hvc3QgdmVuZG9yIHVuaXF1ZSBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBhIHNwZWNpZmljIHByb2Nlc3MgaWQuCisgKgorICogQHBpZDoJCXByb2Nlc3MgaWQgb2YgdGhlIHJlY2VpdmVyCisgKiBAaG9zdF9ubzoJCWhvc3QgIyBzZW5kaW5nIHRoZSBtZXNzYWdlCisgKiBAdmVuZG9yX2lkOgkJdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkcml2ZXIncyB2ZW5kb3IKKyAqIEBkYXRhX2xlbjoJCWFtb3VudCwgaW4gYnl0ZXMsIG9mIHZlbmRvciB1bmlxdWUgcGF5bG9hZCBkYXRhCisgKiBAZGF0YV9idWY6CQlwb2ludGVyIHRvIHZlbmRvciB1bmlxdWUgZGF0YSBidWZmZXIKKyAqCisgKiBSZXR1cm5zOgorICogICAwIG9uIHN1Y2Nlc2Z1bCByZXR1cm4KKyAqICAgb3RoZXJ3aXNlLCBmYWlsaW5nIGVycm9yIGNvZGUKKyAqCisgKiBOb3RlczoKKyAqCVRoaXMgcm91dGluZSBhc3N1bWVzIG5vIGxvY2tzIGFyZSBoZWxkIG9uIGVudHJ5LgorICovCitpbnQKK3Njc2lfbmxfc2VuZF92ZW5kb3JfbXNnKHUzMiBwaWQsIHVuc2lnbmVkIHNob3J0IGhvc3Rfbm8sIHU2NCB2ZW5kb3JfaWQsCisJCQkgY2hhciAqZGF0YV9idWYsIHUzMiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2hkcgkqbmxoOworCXN0cnVjdCBzY3NpX25sX2hvc3RfdmVuZG9yX21zZyAqbXNnOworCXUzMiBsZW4sIHNrYmxlbjsKKwlpbnQgZXJyOworCisJaWYgKCFzY3NpX25sX3NvY2spIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBzZW5kX3ZlbmRvcl9mYWlsOworCX0KKworCWxlbiA9IFNDU0lfTkxfTVNHQUxJR04oc2l6ZW9mKCptc2cpICsgZGF0YV9sZW4pOworCXNrYmxlbiA9IE5MTVNHX1NQQUNFKGxlbik7CisKKwlza2IgPSBhbGxvY19za2Ioc2tibGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikgeworCQllcnIgPSAtRU5PQlVGUzsKKwkJZ290byBzZW5kX3ZlbmRvcl9mYWlsOworCX0KKworCW5saCA9IG5sbXNnX3B1dChza2IsIDAsIDAsIFNDU0lfVFJBTlNQT1JUX01TRywKKwkJCQlza2JsZW4gLSBzaXplb2YoKm5saCksIDApOworCWlmICghbmxoKSB7CisJCWVyciA9IC1FTk9CVUZTOworCQlnb3RvIHNlbmRfdmVuZG9yX2ZhaWxfc2tiOworCX0KKwltc2cgPSBOTE1TR19EQVRBKG5saCk7CisKKwlJTklUX1NDU0lfTkxfSERSKCZtc2ctPnNubGgsIFNDU0lfTkxfVFJBTlNQT1JULAorCQkJCVNDU0lfTkxfU0hPU1RfVkVORE9SLCBsZW4pOworCW1zZy0+dmVuZG9yX2lkID0gdmVuZG9yX2lkOworCW1zZy0+aG9zdF9ubyA9IGhvc3Rfbm87CisJbXNnLT52bXNnX2RhdGFsZW4gPSBkYXRhX2xlbjsJLyogYnl0ZXMgKi8KKwltZW1jcHkoJm1zZ1sxXSwgZGF0YV9idWYsIGRhdGFfbGVuKTsKKworCWVyciA9IG5sbXNnX3VuaWNhc3Qoc2NzaV9ubF9zb2NrLCBza2IsIHBpZCk7CisJaWYgKGVycikKKwkJLyogbmxtc2dfbXVsdGljYXN0IGFscmVhZHkga2ZyZWVfc2tiJ2QgKi8KKwkJZ290byBzZW5kX3ZlbmRvcl9mYWlsOworCisJcmV0dXJuIDA7CisKK3NlbmRfdmVuZG9yX2ZhaWxfc2tiOgorCWtmcmVlX3NrYihza2IpOworc2VuZF92ZW5kb3JfZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJCSIlczogRHJvcHBlZCBTQ1NJIE1zZyA6IGhvc3QgJWQgdmVuZG9yX3VuaXF1ZSAtIGVyciAlZFxuIiwKKwkJX19mdW5jX18sIGhvc3Rfbm8sIGVycik7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woc2NzaV9ubF9zZW5kX3ZlbmRvcl9tc2cpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaCBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAppbmRleCA3OWYwZjc1Li42Y2RkZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZTsKK3N0cnVjdCByZXF1ZXN0Owogc3RydWN0IHNjc2lfY21uZDsKIHN0cnVjdCBzY3NpX2RldmljZTsKIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGU7CkBAIC0yNyw3ICsyOCw2IEBACiBleHRlcm4gaW50IHNjc2lfZGlzcGF0Y2hfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBleHRlcm4gdm9pZCBzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7Ci1leHRlcm4gdm9pZCBfX3Njc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogI2lmZGVmIENPTkZJR19TQ1NJX0xPR0dJTkcKIHZvaWQgc2NzaV9sb2dfc2VuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogdm9pZCBzY3NpX2xvZ19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGRpc3Bvc2l0aW9uKTsKQEAgLTQ5LDEwICs0OSw3IEBACiBleHRlcm4gdm9pZCBzY3NpX2V4aXRfZGV2aW5mbyh2b2lkKTsKIAogLyogc2NzaV9lcnJvci5jICovCi1leHRlcm4gdm9pZCBzY3NpX2FkZF90aW1lcihzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCwKLQkJdm9pZCAoKikoc3RydWN0IHNjc2lfY21uZCAqKSk7Ci1leHRlcm4gaW50IHNjc2lfZGVsZXRlX3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1leHRlcm4gdm9pZCBzY3NpX3RpbWVzX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworZXh0ZXJuIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzY3NpX3RpbWVzX291dChzdHJ1Y3QgcmVxdWVzdCAqcmVxKTsKIGV4dGVybiBpbnQgc2NzaV9lcnJvcl9oYW5kbGVyKHZvaWQgKmhvc3QpOwogZXh0ZXJuIGludCBzY3NpX2RlY2lkZV9kaXNwb3NpdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOwogZXh0ZXJuIHZvaWQgc2NzaV9laF93YWtldXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJvYy5jCmluZGV4IGM2YTkwNGEuLjgyZjdiMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3Byb2MuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcm9jLmMKQEAgLTI1OSw4ICsyNTksOCBAQAogCWludCBlcnJvciA9IC1FTlhJTzsKIAogCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChob3N0KTsKLQlpZiAoSVNfRVJSKHNob3N0KSkKLQkJcmV0dXJuIFBUUl9FUlIoc2hvc3QpOworCWlmICghc2hvc3QpCisJCXJldHVybiBlcnJvcjsKIAogCWlmIChzaG9zdC0+dHJhbnNwb3J0dC0+dXNlcl9zY2FuKQogCQllcnJvciA9IHNob3N0LT50cmFuc3BvcnR0LT51c2VyX3NjYW4oc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4pOwpAQCAtMjg3LDggKzI4Nyw4IEBACiAJaW50IGVycm9yID0gLUVOWElPOwogCiAJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGhvc3QpOwotCWlmIChJU19FUlIoc2hvc3QpKQotCQlyZXR1cm4gUFRSX0VSUihzaG9zdCk7CisJaWYgKCFzaG9zdCkKKwkJcmV0dXJuIGVycm9yOwogCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoc2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4pOwogCWlmIChzZGV2KSB7CiAJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwppbmRleCA4NGI0ODc5Li4zMzQ4NjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCkBAIC03MzAsNiArNzMwLDggQEAKIHN0YXRpYyBpbnQgc2NzaV9hZGRfbHVuKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgdW5zaWduZWQgY2hhciAqaW5xX3Jlc3VsdCwKIAkJaW50ICpiZmxhZ3MsIGludCBhc3luYykKIHsKKwlpbnQgcmV0OworCiAJLyoKIAkgKiBYWFggZG8gbm90IHNhdmUgdGhlIGlucXVpcnksIHNpbmNlIGl0IGNhbiBjaGFuZ2UgdW5kZXJuZWF0aCB1cywKIAkgKiBzYXZlIGp1c3QgdmVuZG9yL21vZGVsL3Jldi4KQEAgLTg4NSw3ICs4ODcsMTcgQEAKIAogCS8qIHNldCB0aGUgZGV2aWNlIHJ1bm5pbmcgaGVyZSBzbyB0aGF0IHNsYXZlIGNvbmZpZ3VyZQogCSAqIG1heSBkbyBJL08gKi8KLQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9SVU5OSU5HKTsKKwlyZXQgPSBzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9SVU5OSU5HKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IHNjc2lfZGV2aWNlX3NldF9zdGF0ZShzZGV2LCBTREVWX0JMT0NLKTsKKworCQlpZiAocmV0KSB7CisJCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwKKwkJCQkgICAgImluIHdyb25nIHN0YXRlICVzIHRvIGNvbXBsZXRlIHNjYW5cbiIsCisJCQkJICAgIHNjc2lfZGV2aWNlX3N0YXRlX25hbWUoc2Rldi0+c2Rldl9zdGF0ZSkpOworCQkJcmV0dXJuIFNDU0lfU0NBTl9OT19SRVNQT05TRTsKKwkJfQorCX0KIAogCWlmICgqYmZsYWdzICYgQkxJU1RfTVNfMTkyX0JZVEVTX0ZPUl8zRikKIAkJc2Rldi0+dXNlXzE5Ml9ieXRlc19mb3JfM2YgPSAxOwpAQCAtODk5LDcgKzkxMSw3IEBACiAJdHJhbnNwb3J0X2NvbmZpZ3VyZV9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAogCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfY29uZmlndXJlKSB7Ci0JCWludCByZXQgPSBzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfY29uZmlndXJlKHNkZXYpOworCQlyZXQgPSBzZGV2LT5ob3N0LT5ob3N0dC0+c2xhdmVfY29uZmlndXJlKHNkZXYpOwogCQlpZiAocmV0KSB7CiAJCQkvKgogCQkJICogaWYgTExERCByZXBvcnRzIHNsYXZlIG5vdCBwcmVzZW50LCBkb24ndCBjbHV0dGVyCkBAIC05OTQsNyArMTAwNiw3IEBACiAJICovCiAJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cF9ieV90YXJnZXQoc3RhcmdldCwgbHVuKTsKIAlpZiAoc2RldikgewotCQlpZiAocmVzY2FuIHx8IHNkZXYtPnNkZXZfc3RhdGUgIT0gU0RFVl9DUkVBVEVEKSB7CisJCWlmIChyZXNjYW4gfHwgIXNjc2lfZGV2aWNlX2NyZWF0ZWQoc2RldikpIHsKIAkJCVNDU0lfTE9HX1NDQU5fQlVTKDMsIHByaW50ayhLRVJOX0lORk8KIAkJCQkic2NzaSBzY2FuOiBkZXZpY2UgZXhpc3RzIG9uICVzXG4iLAogCQkJCXNkZXYtPnNkZXZfZ2VuZGV2LmJ1c19pZCkpOwpAQCAtMTA4MCw3ICsxMDkyLDggQEAKIAkgKiBQRFQ9MUZoIG5vbmUgKG5vIEZERCBjb25uZWN0ZWQgdG8gdGhlIHJlcXVlc3RlZCBsb2dpY2FsIHVuaXQpCiAJICovCiAJaWYgKCgocmVzdWx0WzBdID4+IDUpID09IDEgfHwgc3RhcmdldC0+cGR0XzFmX2Zvcl9ub19sdW4pICYmCi0JICAgICAocmVzdWx0WzBdICYgMHgxZikgPT0gMHgxZikgeworCSAgICAocmVzdWx0WzBdICYgMHgxZikgPT0gMHgxZiAmJgorCSAgICAhc2NzaV9pc193bHVuKGx1bikpIHsKIAkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkic2NzaSBzY2FuOiBwZXJpcGhlcmFsIGRldmljZSB0eXBlIgogCQkJCQkiIG9mIDMxLCBubyBkZXZpY2UgYWRkZWRcbiIpKTsKQEAgLTE0NjYsNyArMTQ3OSw3IEBACiAJa2ZyZWUobHVuX2RhdGEpOwogIG91dDoKIAlzY3NpX2RldmljZV9wdXQoc2Rldik7Ci0JaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9DUkVBVEVEKQorCWlmIChzY3NpX2RldmljZV9jcmVhdGVkKHNkZXYpKQogCQkvKgogCQkgKiB0aGUgc2RldiB3ZSB1c2VkIGRpZG4ndCBhcHBlYXIgaW4gdGhlIHJlcG9ydCBsdW5zIHNjYW4KIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwppbmRleCBhYjNjNzE4Li45M2MyOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAl7IFNERVZfUVVJRVNDRSwgInF1aWVzY2UiIH0sCiAJeyBTREVWX09GRkxJTkUsCSJvZmZsaW5lIiB9LAogCXsgU0RFVl9CTE9DSywJImJsb2NrZWQiIH0sCisJeyBTREVWX0NSRUFURURfQkxPQ0ssICJjcmVhdGVkLWJsb2NrZWQiIH0sCiB9OwogCiBjb25zdCBjaGFyICpzY3NpX2RldmljZV9zdGF0ZV9uYW1lKGVudW0gc2NzaV9kZXZpY2Vfc3RhdGUgc3RhdGUpCkBAIC01NjAsMTIgKzU2MSwxNSBAQAogc2Rldl9yZF9hdHRyIChtb2RlbCwgIiUuMTZzXG4iKTsKIHNkZXZfcmRfYXR0ciAocmV2LCAiJS40c1xuIik7CiAKKy8qCisgKiBUT0RPOiBjYW4gd2UgbWFrZSB0aGVzZSBzeW1saW5rcyB0byB0aGUgYmxvY2sgbGF5ZXIgb25lcz8KKyAqLwogc3RhdGljIHNzaXplX3QKIHNkZXZfc2hvd190aW1lb3V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwotCXJldHVybiBzbnByaW50ZiAoYnVmLCAyMCwgIiVkXG4iLCBzZGV2LT50aW1lb3V0IC8gSFopOworCXJldHVybiBzbnByaW50ZihidWYsIDIwLCAiJWRcbiIsIHNkZXYtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQgLyBIWik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC01NzYsNyArNTgwLDcgQEAKIAlpbnQgdGltZW91dDsKIAlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKIAlzc2NhbmYgKGJ1ZiwgIiVkXG4iLCAmdGltZW91dCk7Ci0Jc2Rldi0+dGltZW91dCA9IHRpbWVvdXQgKiBIWjsKKwlibGtfcXVldWVfcnFfdGltZW91dChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCB0aW1lb3V0ICogSFopOwogCXJldHVybiBjb3VudDsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUih0aW1lb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2Rldl9zaG93X3RpbWVvdXQsIHNkZXZfc3RvcmVfdGltZW91dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKaW5kZXggMjU3ZTA5Ny4uNDhiYTQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJaW50IGVycjsKIAogCWRwcmludGsoIiVseCAldVxuIiwgdWFkZHIsIGxlbik7Ci0JZXJyID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCAodm9pZCAqKXVhZGRyLCBsZW4pOworCWVyciA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgTlVMTCwgKHZvaWQgKil1YWRkciwgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyKSB7CiAJCS8qCiAJCSAqIFRPRE86IG5lZWQgdG8gZml4dXAgc2dfdGFibGVzaXplLCBtYXhfc2VnbWVudF9zaXplLApAQCAtNDYwLDcgKzQ2MCw3IEBACiAKIAkvKiBUT0RPOiByZXBsYWNlIHdpdGggYSBPKDEpIGFsZyAqLwogCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChob3N0X25vKTsKLQlpZiAoSVNfRVJSKHNob3N0KSkgeworCWlmICghc2hvc3QpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBob3N0IG5vICVkXG4iLCBob3N0X25vKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAJZHByaW50aygiJWQgJWQgJWxseFxuIiwgaG9zdF9ubywgcmVzdWx0LCAodW5zaWduZWQgbG9uZyBsb25nKSBtaWQpOwogCiAJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGhvc3Rfbm8pOwotCWlmIChJU19FUlIoc2hvc3QpKSB7CisJaWYgKCFzaG9zdCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIGhvc3Qgbm8gJWRcbiIsIGhvc3Rfbm8pOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTYwMyw3ICs2MDMsNyBAQAogCWRwcmludGsoIiVkICVkJWxseFxuIiwgaG9zdF9ubywgcmVzdWx0LCAodW5zaWduZWQgbG9uZyBsb25nKWl0bl9pZCk7CiAKIAlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoaG9zdF9ubyk7Ci0JaWYgKElTX0VSUihzaG9zdCkpIHsKKwlpZiAoIXNob3N0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgaG9zdCBubyAlZFxuIiwgaG9zdF9ubyk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCA1NjgyM2ZkLi5kNWY3NjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtNDAsMzEgKzQwLDcgQEAKIAogc3RhdGljIGludCBmY19xdWV1ZV93b3JrKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHdvcmtfc3RydWN0ICopOwogc3RhdGljIHZvaWQgZmNfdnBvcnRfc2NoZWRfZGVsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLS8qCi0gKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGNhcnJpZXIgZm9yIGNyZWF0aW5nIGEgdnBvcnQuIEl0IHdpbGwgZXZlbnR1YWxseQotICogYmUgcmVwbGFjZWQgIGJ5IGEgcmVhbCBtZXNzYWdlIGRlZmluaXRpb24gZm9yIHNnaW8gb3IgbmV0bGluay4KLSAqCi0gKiBmY192cG9ydF9pZGVudGlmaWVyczogVGhpcyBzZXQgb2YgZGF0YSBjb250YWlucyBhbGwgZWxlbWVudHMKLSAqIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuZCBpbnN0YW50aWF0ZSBhIEZDIHZpcnR1YWwgcG9ydC4KLSAqCi0gKiBOb3RlczoKLSAqICAgc3ltYm9saWNfbmFtZTogVGhlIGRyaXZlciBpcyB0byBhcHBlbmQgdGhlIHN5bWJvbGljX25hbWUgc3RyaW5nIGRhdGEKLSAqICAgICAgdG8gdGhlIHN5bWJvbGljX25vZGVfbmFtZSBkYXRhIHRoYXQgaXQgZ2VuZXJhdGVzIGJ5IGRlZmF1bHQuCi0gKiAgICAgIHRoZSByZXN1bHRpbmcgY29tYmluYXRpb24gc2hvdWxkIHRoZW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzd2l0Y2guCi0gKiAgICAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhpbmdzIGxpa2UgWGVuIG1heSBzdHVmZiBhIFZNIHRpdGxlIGludG8KLSAqICAgICAgdGhpcyBmaWVsZC4KLSAqLwotc3RydWN0IGZjX3Zwb3J0X2lkZW50aWZpZXJzIHsKLQl1NjQgbm9kZV9uYW1lOwotCXU2NCBwb3J0X25hbWU7Ci0JdTMyIHJvbGVzOwotCWJvb2wgZGlzYWJsZTsKLQllbnVtIGZjX3BvcnRfdHlwZSB2cG9ydF90eXBlOwkvKiBvbmx5IEZDX1BPUlRUWVBFX05QSVYgYWxsb3dlZCAqLwotCWNoYXIgc3ltYm9saWNfbmFtZVtGQ19WUE9SVF9TWU1CT0xJQ19OQU1FTEVOXTsKLX07Ci0KLXN0YXRpYyBpbnQgZmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwKK3N0YXRpYyBpbnQgZmNfdnBvcnRfc2V0dXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLAogCXN0cnVjdCBkZXZpY2UgKnBkZXYsIHN0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyAgKmlkcywKIAlzdHJ1Y3QgZmNfdnBvcnQgKip2cG9ydCk7CiAKQEAgLTE3NjAsNyArMTczNiw3IEBACiAJdmlkLmRpc2FibGUgPSBmYWxzZTsJCS8qIGFsd2F5cyBlbmFibGVkICovCiAKIAkvKiB3ZSBvbmx5IGFsbG93IHN1cHBvcnQgb24gQ2hhbm5lbCAwICEhISAqLwotCXN0YXQgPSBmY192cG9ydF9jcmVhdGUoc2hvc3QsIDAsICZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAmdmlkLCAmdnBvcnQpOworCXN0YXQgPSBmY192cG9ydF9zZXR1cChzaG9zdCwgMCwgJnNob3N0LT5zaG9zdF9nZW5kZXYsICZ2aWQsICZ2cG9ydCk7CiAJcmV0dXJuIHN0YXQgPyBzdGF0IDogY291bnQ7CiB9CiBzdGF0aWMgRkNfREVWSUNFX0FUVFIoaG9zdCwgdnBvcnRfY3JlYXRlLCBTX0lXVVNSLCBOVUxMLApAQCAtMTk1MCwxNSArMTkyNiwxNSBAQAogICogTm90ZXM6CiAgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KICAqLwotc3RhdGljIGVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4KK3N0YXRpYyBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4KIGZjX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjbWQtPmRldmljZSkpOwogCiAJaWYgKHJwb3J0LT5wb3J0X3N0YXRlID09IEZDX1BPUlRTVEFURV9CTE9DS0VEKQotCQlyZXR1cm4gRUhfUkVTRVRfVElNRVI7CisJCXJldHVybiBCTEtfRUhfUkVTRVRfVElNRVI7CiAKLQlyZXR1cm4gRUhfTk9UX0hBTkRMRUQ7CisJcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKIH0KIAogLyoKQEAgLTMxMDMsNyArMzA3OSw3IEBACiAKIAogLyoqCi0gKiBmY192cG9ydF9jcmVhdGUgLSBhbGxvY2F0ZXMgYW5kIGNyZWF0ZXMgYSBGQyB2aXJ0dWFsIHBvcnQuCisgKiBmY192cG9ydF9zZXR1cCAtIGFsbG9jYXRlcyBhbmQgY3JlYXRlcyBhIEZDIHZpcnR1YWwgcG9ydC4KICAqIEBzaG9zdDoJc2NzaSBob3N0IHRoZSB2aXJ0dWFsIHBvcnQgaXMgY29ubmVjdGVkIHRvLgogICogQGNoYW5uZWw6CUNoYW5uZWwgb24gc2hvc3QgcG9ydCBjb25uZWN0ZWQgdG8uCiAgKiBAcGRldjoJcGFyZW50IGRldmljZSBmb3IgdnBvcnQKQEAgLTMxMTgsNyArMzA5NCw3IEBACiAgKglUaGlzIHJvdXRpbmUgYXNzdW1lcyBubyBsb2NrcyBhcmUgaGVsZCBvbiBlbnRyeS4KICAqLwogc3RhdGljIGludAotZmNfdnBvcnRfY3JlYXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwgc3RydWN0IGRldmljZSAqcGRldiwKK2ZjX3Zwb3J0X3NldHVwKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgY2hhbm5lbCwgc3RydWN0IGRldmljZSAqcGRldiwKIAlzdHJ1Y3QgZmNfdnBvcnRfaWRlbnRpZmllcnMgICppZHMsIHN0cnVjdCBmY192cG9ydCAqKnJldF92cG9ydCkKIHsKIAlzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqZmNfaG9zdCA9IHNob3N0X3RvX2ZjX2hvc3Qoc2hvc3QpOwpAQCAtMzIzMSw2ICszMjA3LDI4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisvKioKKyAqIGZjX3Zwb3J0X2NyZWF0ZSAtIEFkbWluIEFwcCBvciBMTEREIHJlcXVlc3RzIGNyZWF0aW9uIG9mIGEgdnBvcnQKKyAqIEBzaG9zdDoJc2NzaSBob3N0IHRoZSB2aXJ0dWFsIHBvcnQgaXMgY29ubmVjdGVkIHRvLgorICogQGNoYW5uZWw6CWNoYW5uZWwgb24gc2hvc3QgcG9ydCBjb25uZWN0ZWQgdG8uCisgKiBAaWRzOglUaGUgd29ybGQgd2lkZSBuYW1lcywgRkM0IHBvcnQgcm9sZXMsIGV0YyBmb3IKKyAqICAgICAgICAgICAgICB0aGUgdmlydHVhbCBwb3J0LgorICoKKyAqIE5vdGVzOgorICoJVGhpcyByb3V0aW5lIGFzc3VtZXMgbm8gbG9ja3MgYXJlIGhlbGQgb24gZW50cnkuCisgKi8KK3N0cnVjdCBmY192cG9ydCAqCitmY192cG9ydF9jcmVhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLAorCXN0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyAqaWRzKQoreworCWludCBzdGF0OworCXN0cnVjdCBmY192cG9ydCAqdnBvcnQ7CisKKwlzdGF0ID0gZmNfdnBvcnRfc2V0dXAoc2hvc3QsIGNoYW5uZWwsICZzaG9zdC0+c2hvc3RfZ2VuZGV2LAorCQkgaWRzLCAmdnBvcnQpOworCXJldHVybiBzdGF0ID8gTlVMTCA6IHZwb3J0OworfQorRVhQT1JUX1NZTUJPTChmY192cG9ydF9jcmVhdGUpOwogCiAvKioKICAqIGZjX3Zwb3J0X3Rlcm1pbmF0ZSAtIEFkbWluIEFwcCBvciBMTEREIHJlcXVlc3RzIHRlcm1pbmF0aW9uIG9mIGEgdnBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggMDQzYzM5Mi4uMGNlNWY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTEzNjEsNyArMTM2MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2hvc3QgPSBzY3NpX2hvc3RfbG9va3VwKGV2LT51LnRndF9kc2N2ci5ob3N0X25vKTsKLQlpZiAoSVNfRVJSKHNob3N0KSkgeworCWlmICghc2hvc3QpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0YXJnZXQgZGlzY292ZXJ5IGNvdWxkIG5vdCBmaW5kIGhvc3Qgbm8gJXVcbiIsCiAJCSAgICAgICBldi0+dS50Z3RfZHNjdnIuaG9zdF9ubyk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTM4Nyw3ICsxMzg3LDcgQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiAKIAlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoZXYtPnUuc2V0X2hvc3RfcGFyYW0uaG9zdF9ubyk7Ci0JaWYgKElTX0VSUihzaG9zdCkpIHsKKwlpZiAoIXNob3N0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2V0X2hvc3RfcGFyYW0gY291bGQgbm90IGZpbmQgaG9zdCBubyAldVxuIiwKIAkJICAgICAgIGV2LT51LnNldF9ob3N0X3BhcmFtLmhvc3Rfbm8pOwogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggMmEyYmM4OS4uYTdiNTNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTg2LDYgKzg3LDEyIEBACiBNT0RVTEVfQUxJQVNfU0NTSV9ERVZJQ0UoVFlQRV9NT0QpOwogTU9EVUxFX0FMSUFTX1NDU0lfREVWSUNFKFRZUEVfUkJDKTsKIAorI2lmICFkZWZpbmVkKENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCkKKyNkZWZpbmUgU0RfTUlOT1JTCTE2CisjZWxzZQorI2RlZmluZSBTRF9NSU5PUlMJMAorI2VuZGlmCisKIHN0YXRpYyBpbnQgIHNkX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqKTsKIHN0YXRpYyBpbnQgIHNkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CiBzdGF0aWMgaW50ICBzZF9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKQEAgLTE1OSw3ICsxNjYsNyBAQAogCQkJc2RfcHJpbnRfc2Vuc2VfaGRyKHNka3AsICZzc2hkcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzZF9yZXZhbGlkYXRlX2Rpc2soc2RrcC0+ZGlzayk7CisJcmV2YWxpZGF0ZV9kaXNrKHNka3AtPmRpc2spOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzc3LDcgKzM4NCw2IEBACiAJc2VjdG9yX3QgYmxvY2sgPSBycS0+c2VjdG9yOwogCXNlY3Rvcl90IHRocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgdGhpc19jb3VudCA9IHJxLT5ucl9zZWN0b3JzOwotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gc2RwLT50aW1lb3V0OwogCWludCByZXQ7CiAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKSB7CkBAIC01NzgsNyArNTg0LDYgQEAKIAlTQ3BudC0+dHJhbnNmZXJzaXplID0gc2RwLT5zZWN0b3Jfc2l6ZTsKIAlTQ3BudC0+dW5kZXJmbG93ID0gdGhpc19jb3VudCA8PCA5OwogCVNDcG50LT5hbGxvd2VkID0gU0RfTUFYX1JFVFJJRVM7Ci0JU0NwbnQtPnRpbWVvdXRfcGVyX2NvbW1hbmQgPSB0aW1lb3V0OwogCiAJLyoKIAkgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGlzIHJlYWR5IGZyb20gb3VyIGVuZCB0byBiZQpAQCAtOTEwLDcgKzkxNSw3IEBACiAJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlza19nZXRfZnJvbV9kZXYoZGV2KTsKIAogCWlmIChzZGtwKSB7Ci0JCXNkX3JldmFsaWRhdGVfZGlzayhzZGtwLT5kaXNrKTsKKwkJcmV2YWxpZGF0ZV9kaXNrKHNka3AtPmRpc2spOwogCQlzY3NpX2Rpc2tfcHV0KHNka3ApOwogCX0KIH0KQEAgLTE0MjksMjcgKzE0MzQsMjEgQEAKIAkJICovCiAJCXNlY3Rvcl9zaXplID0gNTEyOwogCX0KLQl7Ci0JCS8qCi0JCSAqIFRoZSBtc2RvcyBmcyBuZWVkcyB0byBrbm93IHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZQotCQkgKiBTbyBJIGhhdmUgY3JlYXRlZCB0aGlzIHRhYmxlLiBTZWUgbGxfcndfYmxrLmMKLQkJICogSmFjcXVlcyBHZWxpbmFzIChKYWNxdWVzQHNvbHVjb3JwLnFjLmNhKQotCQkgKi8KLQkJaW50IGhhcmRfc2VjdG9yID0gc2VjdG9yX3NpemU7Ci0JCXNlY3Rvcl90IHN6ID0gKHNka3AtPmNhcGFjaXR5LzIpICogKGhhcmRfc2VjdG9yLzI1Nik7Ci0JCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKLQkJc2VjdG9yX3QgbWIgPSBzejsKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShzZHAtPnJlcXVlc3RfcXVldWUsIHNlY3Rvcl9zaXplKTsKIAotCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxdWV1ZSwgaGFyZF9zZWN0b3IpOwotCQkvKiBhdm9pZCA2NC1iaXQgZGl2aXNpb24gb24gMzItYml0IHBsYXRmb3JtcyAqLwotCQlzZWN0b3JfZGl2KHN6LCA2MjUpOwotCQltYiAtPSBzeiAtIDk3NDsKLQkJc2VjdG9yX2RpdihtYiwgMTk1MCk7CisJeworCQljaGFyIGNhcF9zdHJfMlsxMF0sIGNhcF9zdHJfMTBbMTBdOworCQl1NjQgc3ogPSBzZGtwLT5jYXBhY2l0eSA8PCBmZnoofnNlY3Rvcl9zaXplKTsKKworCQlzdHJpbmdfZ2V0X3NpemUoc3osIFNUUklOR19VTklUU18yLCBjYXBfc3RyXzIsCisJCQkJc2l6ZW9mKGNhcF9zdHJfMikpOworCQlzdHJpbmdfZ2V0X3NpemUoc3osIFNUUklOR19VTklUU18xMCwgY2FwX3N0cl8xMCwKKwkJCQlzaXplb2YoY2FwX3N0cl8xMCkpOwogCiAJCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwKLQkJCSAgIiVsbHUgJWQtYnl0ZSBoYXJkd2FyZSBzZWN0b3JzICglbGx1IE1CKVxuIiwKKwkJCSAgIiVsbHUgJWQtYnl0ZSBoYXJkd2FyZSBzZWN0b3JzOiAoJXMvJXMpXG4iLAogCQkJICAodW5zaWduZWQgbG9uZyBsb25nKXNka3AtPmNhcGFjaXR5LAotCQkJICBoYXJkX3NlY3RvciwgKHVuc2lnbmVkIGxvbmcgbG9uZyltYik7CisJCQkgIHNlY3Rvcl9zaXplLCBjYXBfc3RyXzEwLCBjYXBfc3RyXzIpOwogCX0KIAogCS8qIFJlc2NhbGUgY2FwYWNpdHkgdG8gNTEyLWJ5dGUgdW5pdHMgKi8KQEAgLTE3NjQsNiArMTc2Myw1MiBAQAogfQogCiAvKioKKyAqCXNkX2Zvcm1hdF9kaXNrX25hbWUgLSBmb3JtYXQgZGlzayBuYW1lCisgKglAcHJlZml4OiBuYW1lIHByZWZpeCAtIGllLiAic2QiIGZvciBTQ1NJIGRpc2tzCisgKglAaW5kZXg6IGluZGV4IG9mIHRoZSBkaXNrIHRvIGZvcm1hdCBuYW1lIGZvcgorICoJQGJ1Zjogb3V0cHV0IGJ1ZmZlcgorICoJQGJ1ZmxlbjogbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYnVmZmVyCisgKgorICoJU0NTSSBkaXNrIG5hbWVzIHN0YXJ0cyBhdCBzZGEuICBUaGUgMjZ0aCBkZXZpY2UgaXMgc2R6IGFuZCB0aGUKKyAqCTI3dGggaXMgc2RhYS4gIFRoZSBsYXN0IG9uZSBmb3IgdHdvIGxldHRlcmVkIHN1ZmZpeCBpcyBzZHp6CisgKgl3aGljaCBpcyBmb2xsb3dlZCBieSBzZGFhYS4KKyAqCisgKglUaGlzIGlzIGJhc2ljYWxseSAyNiBiYXNlIGNvdW50aW5nIHdpdGggb25lIGV4dHJhICduaWwnIGVudHJ5CisgKglhdCB0aGUgYmVnZ2luaW5nIGZyb20gdGhlIHNlY29uZCBkaWdpdCBvbiBhbmQgY2FuIGJlCisgKglkZXRlcm1pbmVkIHVzaW5nIHNpbWlsYXIgbWV0aG9kIGFzIDI2IGJhc2UgY29udmVyc2lvbiB3aXRoIHRoZQorICoJaW5kZXggc2hpZnRlZCAtMSBhZnRlciBlYWNoIGRpZ2l0IGlzIGNvbXB1dGVkLgorICoKKyAqCUNPTlRFWFQ6CisgKglEb24ndCBjYXJlLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHNkX2Zvcm1hdF9kaXNrX25hbWUoY2hhciAqcHJlZml4LCBpbnQgaW5kZXgsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwljb25zdCBpbnQgYmFzZSA9ICd6JyAtICdhJyArIDE7CisJY2hhciAqYmVnaW4gPSBidWYgKyBzdHJsZW4ocHJlZml4KTsKKwljaGFyICplbmQgPSBidWYgKyBidWZsZW47CisJY2hhciAqcDsKKwlpbnQgdW5pdDsKKworCXAgPSBlbmQgLSAxOworCSpwID0gJ1wwJzsKKwl1bml0ID0gYmFzZTsKKwlkbyB7CisJCWlmIChwID09IGJlZ2luKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSotLXAgPSAnYScgKyAoaW5kZXggJSB1bml0KTsKKwkJaW5kZXggPSAoaW5kZXggLyB1bml0KSAtIDE7CisJfSB3aGlsZSAoaW5kZXggPj0gMCk7CisKKwltZW1tb3ZlKGJlZ2luLCBwLCBlbmQgLSBwKTsKKwltZW1jcHkoYnVmLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsKKworCXJldHVybiAwOworfQorCisvKioKICAqCXNkX3Byb2JlIC0gY2FsbGVkIGR1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHdoZW5ldmVyIGEKICAqCW5ldyBzY3NpIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiBJdCBpcyBjYWxsZWQgb25jZQogICoJZm9yIGVhY2ggc2NzaSBkZXZpY2UgKG5vdCBqdXN0IGRpc2tzKSBwcmVzZW50LgpAQCAtMTgwMSw3ICsxODQ2LDcgQEAKIAlpZiAoIXNka3ApCiAJCWdvdG8gb3V0OwogCi0JZ2QgPSBhbGxvY19kaXNrKDE2KTsKKwlnZCA9IGFsbG9jX2Rpc2soU0RfTUlOT1JTKTsKIAlpZiAoIWdkKQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC0xODE1LDggKzE4NjAsOCBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfcHV0OwogCi0JZXJyb3IgPSAtRUJVU1k7Ci0JaWYgKGluZGV4ID49IFNEX01BWF9ESVNLUykKKwllcnJvciA9IHNkX2Zvcm1hdF9kaXNrX25hbWUoInNkIiwgaW5kZXgsIGdkLT5kaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOworCWlmIChlcnJvcikKIAkJZ290byBvdXRfZnJlZV9pbmRleDsKIAogCXNka3AtPmRldmljZSA9IHNkcDsKQEAgLTE4MjYsMTEgKzE4NzEsMTIgQEAKIAlzZGtwLT5vcGVuZXJzID0gMDsKIAlzZGtwLT5wcmV2aW91c19zdGF0ZSA9IDE7CiAKLQlpZiAoIXNkcC0+dGltZW91dCkgeworCWlmICghc2RwLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0KSB7CiAJCWlmIChzZHAtPnR5cGUgIT0gVFlQRV9NT0QpCi0JCQlzZHAtPnRpbWVvdXQgPSBTRF9USU1FT1VUOworCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBTRF9USU1FT1VUKTsKIAkJZWxzZQotCQkJc2RwLT50aW1lb3V0ID0gU0RfTU9EX1RJTUVPVVQ7CisJCQlibGtfcXVldWVfcnFfdGltZW91dChzZHAtPnJlcXVlc3RfcXVldWUsCisJCQkJCSAgICAgU0RfTU9EX1RJTUVPVVQpOwogCX0KIAogCWRldmljZV9pbml0aWFsaXplKCZzZGtwLT5kZXYpOwpAQCAtMTg0MywyNCArMTg4OSwxMiBAQAogCiAJZ2V0X2RldmljZSgmc2RwLT5zZGV2X2dlbmRldik7CiAKLQlnZC0+bWFqb3IgPSBzZF9tYWpvcigoaW5kZXggJiAweGYwKSA+PiA0KTsKLQlnZC0+Zmlyc3RfbWlub3IgPSAoKGluZGV4ICYgMHhmKSA8PCA0KSB8IChpbmRleCAmIDB4ZmZmMDApOwotCWdkLT5taW5vcnMgPSAxNjsKLQlnZC0+Zm9wcyA9ICZzZF9mb3BzOwotCi0JaWYgKGluZGV4IDwgMjYpIHsKLQkJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAic2QlYyIsICdhJyArIGluZGV4ICUgMjYpOwotCX0gZWxzZSBpZiAoaW5kZXggPCAoMjYgKyAxKSAqIDI2KSB7Ci0JCXNwcmludGYoZ2QtPmRpc2tfbmFtZSwgInNkJWMlYyIsCi0JCQknYScgKyBpbmRleCAvIDI2IC0gMSwnYScgKyBpbmRleCAlIDI2KTsKLQl9IGVsc2UgewotCQljb25zdCB1bnNpZ25lZCBpbnQgbTEgPSAoaW5kZXggLyAyNiAtIDEpIC8gMjYgLSAxOwotCQljb25zdCB1bnNpZ25lZCBpbnQgbTIgPSAoaW5kZXggLyAyNiAtIDEpICUgMjY7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCBtMyA9ICBpbmRleCAlIDI2OwotCQlzcHJpbnRmKGdkLT5kaXNrX25hbWUsICJzZCVjJWMlYyIsCi0JCQknYScgKyBtMSwgJ2EnICsgbTIsICdhJyArIG0zKTsKKwlpZiAoaW5kZXggPCBTRF9NQVhfRElTS1MpIHsKKwkJZ2QtPm1ham9yID0gc2RfbWFqb3IoKGluZGV4ICYgMHhmMCkgPj4gNCk7CisJCWdkLT5maXJzdF9taW5vciA9ICgoaW5kZXggJiAweGYpIDw8IDQpIHwgKGluZGV4ICYgMHhmZmYwMCk7CisJCWdkLT5taW5vcnMgPSBTRF9NSU5PUlM7CiAJfQotCisJZ2QtPmZvcHMgPSAmc2RfZm9wczsKIAlnZC0+cHJpdmF0ZV9kYXRhID0gJnNka3AtPmRyaXZlcjsKIAlnZC0+cXVldWUgPSBzZGtwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CiAKQEAgLTE4NjksMTMgKzE5MDMsMTIgQEAKIAlibGtfcXVldWVfcHJlcF9ycShzZHAtPnJlcXVlc3RfcXVldWUsIHNkX3ByZXBfZm4pOwogCiAJZ2QtPmRyaXZlcmZzX2RldiA9ICZzZHAtPnNkZXZfZ2VuZGV2OwotCWdkLT5mbGFncyA9IEdFTkhEX0ZMX0RSSVZFUkZTOworCWdkLT5mbGFncyA9IEdFTkhEX0ZMX0VYVF9ERVZUIHwgR0VOSERfRkxfRFJJVkVSRlM7CiAJaWYgKHNkcC0+cmVtb3ZhYmxlKQogCQlnZC0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOwogCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgc2RrcCk7CiAJYWRkX2Rpc2soZ2QpOwotCWJsa19yZWdpc3Rlcl9maWx0ZXIoZ2QpOwogCXNkX2RpZl9jb25maWdfaG9zdChzZGtwKTsKIAogCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkF0dGFjaGVkIFNDU0kgJXNkaXNrXG4iLApAQCAtMTkwOSw3ICsxOTQyLDYgQEAKIAlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlkZXZpY2VfZGVsKCZzZGtwLT5kZXYpOwotCWJsa191bnJlZ2lzdGVyX2ZpbHRlcihzZGtwLT5kaXNrKTsKIAlkZWxfZ2VuZGlzayhzZGtwLT5kaXNrKTsKIAlzZF9zaHV0ZG93bihkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2cuYyBiL2RyaXZlcnMvc2NzaS9zZy5jCmluZGV4IDY2MWY5ZjIuLjkzYmQ1OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZy5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIApAQCAtNjksNyArNjgsNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgU0dfQUxMT1dfRElPX0RFRiAwCi0jZGVmaW5lIFNHX0FMTE9XX0RJT19DT0RFIC8qIGNvbXBpbGUgb3V0IGJ5IGNvbW1lbnRpbmcgdGhpcyBkZWZpbmUgKi8KIAogI2RlZmluZSBTR19NQVhfREVWUyAzMjc2OAogCkBAIC0xMTgsOCArMTE2LDggQEAKIAl1bnNpZ25lZCBzaG9ydCBrX3VzZV9zZzsgLyogQ291bnQgb2Yga2VybmVsIHNjYXR0ZXItZ2F0aGVyIHBpZWNlcyAqLwogCXVuc2lnbmVkIHNnbGlzdF9sZW47IC8qIHNpemUgb2YgbWFsbG9jJ2Qgc2NhdHRlci1nYXRoZXIgbGlzdCArKyAqLwogCXVuc2lnbmVkIGJ1ZmZsZW47CS8qIFNpemUgb2YgKGFnZ3JlZ2F0ZSkgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBiX21hbGxvY19sZW47CS8qIGFjdHVhbCBsZW4gbWFsbG9jJ2VkIGluIGJ1ZmZlciAqLwotCXN0cnVjdCBzY2F0dGVybGlzdCAqYnVmZmVyOy8qIHNjYXR0ZXIgbGlzdCAqLworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJaW50IHBhZ2Vfb3JkZXI7CiAJY2hhciBkaW9faW5fdXNlOwkvKiAwLT5pbmRpcmVjdCBJTyAob3IgbW1hcCksIDEtPmRpbyAqLwogCXVuc2lnbmVkIGNoYXIgY21kX29wY29kZTsgLyogZmlyc3QgYnl0ZSBvZiBjb21tYW5kICovCiB9IFNnX3NjYXR0ZXJfaG9sZDsKQEAgLTEzNyw2ICsxMzUsOCBAQAogCWNoYXIgb3JwaGFuOwkJLyogMSAtPiBkcm9wIG9uIHNpZ2h0LCAwIC0+IG5vcm1hbCAqLwogCWNoYXIgc2dfaW9fb3duZWQ7CS8qIDEgLT4gcGFja2V0IGJlbG9uZ3MgdG8gU0dfSU8gKi8KIAl2b2xhdGlsZSBjaGFyIGRvbmU7CS8qIDAtPmJlZm9yZSBiaCwgMS0+YmVmb3JlIHJlYWQsIDItPnJlYWQgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJc3RydWN0IGJpbyAqYmlvOwogfSBTZ19yZXF1ZXN0OwogCiB0eXBlZGVmIHN0cnVjdCBzZ19mZCB7CQkvKiBob2xkcyB0aGUgc3RhdGUgb2YgYSBmaWxlIGRlc2NyaXB0b3IgKi8KQEAgLTE3NSw4ICsxNzUsOCBAQAogCiBzdGF0aWMgaW50IHNnX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgbW9kZSk7CiAvKiB0YXNrbGV0IG9yIHNvZnQgaXJxIGNhbGxiYWNrICovCi1zdGF0aWMgdm9pZCBzZ19jbWRfZG9uZSh2b2lkICpkYXRhLCBjaGFyICpzZW5zZSwgaW50IHJlc3VsdCwgaW50IHJlc2lkKTsKLXN0YXRpYyBpbnQgc2dfc3RhcnRfcmVxKFNnX3JlcXVlc3QgKiBzcnApOworc3RhdGljIHZvaWQgc2dfcnFfZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKTsKK3N0YXRpYyBpbnQgc2dfc3RhcnRfcmVxKFNnX3JlcXVlc3QgKnNycCwgdW5zaWduZWQgY2hhciAqY21kKTsKIHN0YXRpYyB2b2lkIHNnX2ZpbmlzaF9yZW1fcmVxKFNnX3JlcXVlc3QgKiBzcnApOwogc3RhdGljIGludCBzZ19idWlsZF9pbmRpcmVjdChTZ19zY2F0dGVyX2hvbGQgKiBzY2hwLCBTZ19mZCAqIHNmcCwgaW50IGJ1ZmZfc2l6ZSk7CiBzdGF0aWMgaW50IHNnX2J1aWxkX3NnYXQoU2dfc2NhdHRlcl9ob2xkICogc2NocCwgY29uc3QgU2dfZmQgKiBzZnAsCkBAIC0xODgsMTcgKzE4OCwxMSBAQAogCQkJaW50IHJlYWRfb25seSwgU2dfcmVxdWVzdCAqKm9fc3JwKTsKIHN0YXRpYyBpbnQgc2dfY29tbW9uX3dyaXRlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwLAogCQkJICAgdW5zaWduZWQgY2hhciAqY21uZCwgaW50IHRpbWVvdXQsIGludCBibG9ja2luZyk7Ci1zdGF0aWMgaW50IHNnX3VfaW92ZWMoc2dfaW9faGRyX3QgKiBocCwgaW50IHNnX251bSwgaW50IGluZCwKLQkJICAgICAgaW50IHdyX3hmLCBpbnQgKmNvdW50cCwgdW5zaWduZWQgY2hhciBfX3VzZXIgKip1cCk7Ci1zdGF0aWMgaW50IHNnX3dyaXRlX3hmZXIoU2dfcmVxdWVzdCAqIHNycCk7Ci1zdGF0aWMgaW50IHNnX3JlYWRfeGZlcihTZ19yZXF1ZXN0ICogc3JwKTsKIHN0YXRpYyBpbnQgc2dfcmVhZF9veGZlcihTZ19yZXF1ZXN0ICogc3JwLCBjaGFyIF9fdXNlciAqb3V0cCwgaW50IG51bV9yZWFkX3hmZXIpOwogc3RhdGljIHZvaWQgc2dfcmVtb3ZlX3NjYXQoU2dfc2NhdHRlcl9ob2xkICogc2NocCk7CiBzdGF0aWMgdm9pZCBzZ19idWlsZF9yZXNlcnZlKFNnX2ZkICogc2ZwLCBpbnQgcmVxX3NpemUpOwogc3RhdGljIHZvaWQgc2dfbGlua19yZXNlcnZlKFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwLCBpbnQgc2l6ZSk7CiBzdGF0aWMgdm9pZCBzZ191bmxpbmtfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCk7Ci1zdGF0aWMgc3RydWN0IHBhZ2UgKnNnX3BhZ2VfbWFsbG9jKGludCBycVN6LCBpbnQgbG93RG1hLCBpbnQgKnJldFN6cCk7Ci1zdGF0aWMgdm9pZCBzZ19wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBzaXplKTsKIHN0YXRpYyBTZ19mZCAqc2dfYWRkX3NmcChTZ19kZXZpY2UgKiBzZHAsIGludCBkZXYpOwogc3RhdGljIGludCBzZ19yZW1vdmVfc2ZwKFNnX2RldmljZSAqIHNkcCwgU2dfZmQgKiBzZnApOwogc3RhdGljIHZvaWQgX19zZ19yZW1vdmVfc2ZwKFNnX2RldmljZSAqIHNkcCwgU2dfZmQgKiBzZnApOwpAQCAtMjA2LDcgKzIwMCw2IEBACiBzdGF0aWMgU2dfcmVxdWVzdCAqc2dfYWRkX3JlcXVlc3QoU2dfZmQgKiBzZnApOwogc3RhdGljIGludCBzZ19yZW1vdmVfcmVxdWVzdChTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCk7CiBzdGF0aWMgaW50IHNnX3Jlc19pbl91c2UoU2dfZmQgKiBzZnApOwotc3RhdGljIGludCBzZ19idWlsZF9kaXJlY3QoU2dfcmVxdWVzdCAqIHNycCwgU2dfZmQgKiBzZnAsIGludCBkeGZlcl9sZW4pOwogc3RhdGljIFNnX2RldmljZSAqc2dfZ2V0X2RldihpbnQgZGV2KTsKICNpZmRlZiBDT05GSUdfU0NTSV9QUk9DX0ZTCiBzdGF0aWMgaW50IHNnX2xhc3RfZGV2KHZvaWQpOwpAQCAtNTI5LDggKzUyMiw3IEBACiAJCWVyciA9IC1FRkFVTFQ7CiAJCWdvdG8gZXJyX291dDsKIAl9Ci0JZXJyID0gc2dfcmVhZF94ZmVyKHNycCk7Ci0gICAgICBlcnJfb3V0OgorZXJyX291dDoKIAlzZ19maW5pc2hfcmVtX3JlcShzcnApOwogCXJldHVybiAoMCA9PSBlcnIpID8gY291bnQgOiBlcnI7CiB9CkBAIC02MTIsNyArNjA0LDEwIEBACiAJZWxzZQogCQlocC0+ZHhmZXJfZGlyZWN0aW9uID0gKG14c2l6ZSA+IDApID8gU0dfRFhGRVJfRlJPTV9ERVYgOiBTR19EWEZFUl9OT05FOwogCWhwLT5keGZlcl9sZW4gPSBteHNpemU7Ci0JaHAtPmR4ZmVycCA9IChjaGFyIF9fdXNlciAqKWJ1ZiArIGNtZF9zaXplOworCWlmIChocC0+ZHhmZXJfZGlyZWN0aW9uID09IFNHX0RYRkVSX1RPX0RFVikKKwkJaHAtPmR4ZmVycCA9IChjaGFyIF9fdXNlciAqKWJ1ZiArIGNtZF9zaXplOworCWVsc2UKKwkJaHAtPmR4ZmVycCA9IE5VTEw7CiAJaHAtPnNicCA9IE5VTEw7CiAJaHAtPnRpbWVvdXQgPSBvbGRfaGRyLnJlcGx5X2xlbjsJLyogc3RydWN0dXJlIGFidXNlIC4uLiAqLwogCWhwLT5mbGFncyA9IGlucHV0X3NpemU7CS8qIHN0cnVjdHVyZSBhYnVzZSAuLi4gKi8KQEAgLTczMiwxNiArNzI3LDEyIEBACiAJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogIHNjc2kgb3Bjb2RlPTB4JTAyeCwgY21kX3NpemU9JWRcbiIsCiAJCQkgIChpbnQpIGNtbmRbMF0sIChpbnQpIGhwLT5jbWRfbGVuKSk7CiAKLQlpZiAoKGsgPSBzZ19zdGFydF9yZXEoc3JwKSkpIHsKKwlrID0gc2dfc3RhcnRfcmVxKHNycCwgY21uZCk7CisJaWYgKGspIHsKIAkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogc3RhcnRfcmVxIGVycj0lZFxuIiwgaykpOwogCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOwogCQlyZXR1cm4gazsJLyogcHJvYmFibHkgb3V0IG9mIHNwYWNlIC0tPiBFTk9NRU0gKi8KIAl9Ci0JaWYgKChrID0gc2dfd3JpdGVfeGZlcihzcnApKSkgewotCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfY29tbW9uX3dyaXRlOiB3cml0ZV94ZmVyLCBiYWQgYWRkcmVzc1xuIikpOwotCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOwotCQlyZXR1cm4gazsKLQl9CiAJaWYgKHNkcC0+ZGV0YWNoZWQpIHsKIAkJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03NjMsMjAgKzc1NCwxMSBAQAogCQlicmVhazsKIAl9CiAJaHAtPmR1cmF0aW9uID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKLS8qIE5vdyBzZW5kIGV2ZXJ5dGhpbmcgb2YgdG8gbWlkLWxldmVsLiBUaGUgbmV4dCB0aW1lIHdlIGhlYXIgYWJvdXQgdGhpcwotICAgcGFja2V0IGlzIHdoZW4gc2dfY21kX2RvbmUoKSBpcyBjYWxsZWQgKGkuZS4gYSBjYWxsYmFjaykuICovCi0JaWYgKHNjc2lfZXhlY3V0ZV9hc3luYyhzZHAtPmRldmljZSwgY21uZCwgaHAtPmNtZF9sZW4sIGRhdGFfZGlyLCBzcnAtPmRhdGEuYnVmZmVyLAotCQkJCWhwLT5keGZlcl9sZW4sIHNycC0+ZGF0YS5rX3VzZV9zZywgdGltZW91dCwKLQkJCQlTR19ERUZBVUxUX1JFVFJJRVMsIHNycCwgc2dfY21kX2RvbmUsCi0JCQkJR0ZQX0FUT01JQykpIHsKLQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogc2NzaV9leGVjdXRlX2FzeW5jIGZhaWxlZFxuIikpOwotCQkvKgotCQkgKiBtb3N0IGxpa2VseSBvdXQgb2YgbWVtLCBidXQgY291bGQgYWxzbyBiZSBhIGJhZCBtYXAKLQkJICovCi0JCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZQotCQlyZXR1cm4gMDsKKworCXNycC0+cnEtPnRpbWVvdXQgPSB0aW1lb3V0OworCWJsa19leGVjdXRlX3JxX25vd2FpdChzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSwgc2RwLT5kaXNrLAorCQkJICAgICAgc3JwLT5ycSwgMSwgc2dfcnFfZW5kX2lvKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtMTE5Miw4ICsxMTc0LDcgQEAKIAlTZ19mZCAqc2ZwOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsZW4sIHNhOwogCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHA7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlpbnQgazsKKwlpbnQgaywgbGVuZ3RoOwogCiAJaWYgKChOVUxMID09IHZtYSkgfHwgKCEoc2ZwID0gKFNnX2ZkICopIHZtYS0+dm1fcHJpdmF0ZV9kYXRhKSkpCiAJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CkBAIC0xMjAzLDE1ICsxMTg0LDE0IEBACiAJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CiAJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3ZtYV9mYXVsdDogb2Zmc2V0PSVsdSwgc2NhdGc9JWRcbiIsCiAJCQkJICAgb2Zmc2V0LCByc3Zfc2NocC0+a191c2Vfc2cpKTsKLQlzZyA9IHJzdl9zY2hwLT5idWZmZXI7CiAJc2EgPSB2bWEtPnZtX3N0YXJ0OwotCWZvciAoayA9IDA7IChrIDwgcnN2X3NjaHAtPmtfdXNlX3NnKSAmJiAoc2EgPCB2bWEtPnZtX2VuZCk7Ci0JICAgICArK2ssIHNnID0gc2dfbmV4dChzZykpIHsKKwlsZW5ndGggPSAxIDw8IChQQUdFX1NISUZUICsgcnN2X3NjaHAtPnBhZ2Vfb3JkZXIpOworCWZvciAoayA9IDA7IGsgPCByc3Zfc2NocC0+a191c2Vfc2cgJiYgc2EgPCB2bWEtPnZtX2VuZDsgaysrKSB7CiAJCWxlbiA9IHZtYS0+dm1fZW5kIC0gc2E7Ci0JCWxlbiA9IChsZW4gPCBzZy0+bGVuZ3RoKSA/IGxlbiA6IHNnLT5sZW5ndGg7CisJCWxlbiA9IChsZW4gPCBsZW5ndGgpID8gbGVuIDogbGVuZ3RoOwogCQlpZiAob2Zmc2V0IDwgbGVuKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSArIG9mZnNldCk7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IG50aF9wYWdlKHJzdl9zY2hwLT5wYWdlc1trXSwKKwkJCQkJCSAgICAgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogCQkJZ2V0X3BhZ2UocGFnZSk7CS8qIGluY3JlbWVudCBwYWdlIGNvdW50ICovCiAJCQl2bWYtPnBhZ2UgPSBwYWdlOwogCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KQEAgLTEyMzMsOCArMTIxMyw3IEBACiAJU2dfZmQgKnNmcDsKIAl1bnNpZ25lZCBsb25nIHJlcV9zeiwgbGVuLCBzYTsKIAlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwOwotCWludCBrOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGssIGxlbmd0aDsKIAogCWlmICgoIWZpbHApIHx8ICghdm1hKSB8fCAoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMjQ4LDExICsxMjI3LDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwkvKiBjYW5ub3QgbWFwIG1vcmUgdGhhbiByZXNlcnZlZCBidWZmZXIgKi8KIAogCXNhID0gdm1hLT52bV9zdGFydDsKLQlzZyA9IHJzdl9zY2hwLT5idWZmZXI7Ci0JZm9yIChrID0gMDsgKGsgPCByc3Zfc2NocC0+a191c2Vfc2cpICYmIChzYSA8IHZtYS0+dm1fZW5kKTsKLQkgICAgICsraywgc2cgPSBzZ19uZXh0KHNnKSkgeworCWxlbmd0aCA9IDEgPDwgKFBBR0VfU0hJRlQgKyByc3Zfc2NocC0+cGFnZV9vcmRlcik7CisJZm9yIChrID0gMDsgayA8IHJzdl9zY2hwLT5rX3VzZV9zZyAmJiBzYSA8IHZtYS0+dm1fZW5kOyBrKyspIHsKIAkJbGVuID0gdm1hLT52bV9lbmQgLSBzYTsKLQkJbGVuID0gKGxlbiA8IHNnLT5sZW5ndGgpID8gbGVuIDogc2ctPmxlbmd0aDsKKwkJbGVuID0gKGxlbiA8IGxlbmd0aCkgPyBsZW4gOiBsZW5ndGg7CiAJCXNhICs9IGxlbjsKIAl9CiAKQEAgLTEyNjMsMTYgKzEyNDEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBhICJib3R0b20gaGFsZiIgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCBieSB0aGUKLSAqIG1pZCBsZXZlbCB3aGVuIGEgY29tbWFuZCBpcyBjb21wbGV0ZWQgKG9yIGhhcyBmYWlsZWQpLiAqLwotc3RhdGljIHZvaWQKLXNnX2NtZF9kb25lKHZvaWQgKmRhdGEsIGNoYXIgKnNlbnNlLCBpbnQgcmVzdWx0LCBpbnQgcmVzaWQpCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBhICJib3R0b20gaGFsZiIgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCBieSB0aGUgbWlkCisgKiBsZXZlbCB3aGVuIGEgY29tbWFuZCBpcyBjb21wbGV0ZWQgKG9yIGhhcyBmYWlsZWQpLgorICovCitzdGF0aWMgdm9pZCBzZ19ycV9lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUpCiB7Ci0JU2dfcmVxdWVzdCAqc3JwID0gZGF0YTsKKwlzdHJ1Y3Qgc2dfcmVxdWVzdCAqc3JwID0gcnEtPmVuZF9pb19kYXRhOwogCVNnX2RldmljZSAqc2RwID0gTlVMTDsKIAlTZ19mZCAqc2ZwOwogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCXVuc2lnbmVkIGludCBtczsKKwljaGFyICpzZW5zZTsKKwlpbnQgcmVzdWx0LCByZXNpZDsKIAogCWlmIChOVUxMID09IHNycCkgewogCQlwcmludGsoS0VSTl9FUlIgInNnX2NtZF9kb25lOiBOVUxMIHJlcXVlc3RcbiIpOwpAQCAtMTI4Niw2ICsxMjY3LDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCXNlbnNlID0gcnEtPnNlbnNlOworCXJlc3VsdCA9IHJxLT5lcnJvcnM7CisJcmVzaWQgPSBycS0+ZGF0YV9sZW47CiAKIAlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfY21kX2RvbmU6ICVzLCBwYWNrX2lkPSVkLCByZXM9MHgleFxuIiwKIAkJc2RwLT5kaXNrLT5kaXNrX25hbWUsIHNycC0+aGVhZGVyLnBhY2tfaWQsIHJlc3VsdCkpOwpAQCAtMTI5Niw3ICsxMjgwLDYgQEAKIAlpZiAoMCAhPSByZXN1bHQpIHsKIAkJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOwogCi0JCW1lbWNweShzcnAtPnNlbnNlX2IsIHNlbnNlLCBzaXplb2YgKHNycC0+c2Vuc2VfYikpOwogCQlzcnAtPmhlYWRlci5zdGF0dXMgPSAweGZmICYgcmVzdWx0OwogCQlzcnAtPmhlYWRlci5tYXNrZWRfc3RhdHVzID0gc3RhdHVzX2J5dGUocmVzdWx0KTsKIAkJc3JwLT5oZWFkZXIubXNnX3N0YXR1cyA9IG1zZ19ieXRlKHJlc3VsdCk7CkBAIC0xNDY3LDEyICsxNDUwLDEwIEBACiAJaWYgKHNnX3N5c2ZzX3ZhbGlkKSB7CiAJCXN0cnVjdCBkZXZpY2UgKnNnX2NsYXNzX21lbWJlcjsKIAotCQlzZ19jbGFzc19tZW1iZXIgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoc2dfc3lzZnNfY2xhc3MsCi0JCQkJCQkJY2xfZGV2LT5wYXJlbnQsCi0JCQkJCQkJTUtERVYoU0NTSV9HRU5FUklDX01BSk9SLAotCQkJCQkJCSAgICAgIHNkcC0+aW5kZXgpLAotCQkJCQkJCXNkcCwKLQkJCQkJCQkiJXMiLCBkaXNrLT5kaXNrX25hbWUpOworCQlzZ19jbGFzc19tZW1iZXIgPSBkZXZpY2VfY3JlYXRlKHNnX3N5c2ZzX2NsYXNzLCBjbF9kZXYtPnBhcmVudCwKKwkJCQkJCU1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwKKwkJCQkJCSAgICAgIHNkcC0+aW5kZXgpLAorCQkJCQkJc2RwLCAiJXMiLCBkaXNrLT5kaXNrX25hbWUpOwogCQlpZiAoSVNfRVJSKHNnX2NsYXNzX21lbWJlcikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAic2dfYWRkOiAiCiAJCQkgICAgICAgImRldmljZV9jcmVhdGUgZmFpbGVkXG4iKTsKQEAgLTE2MzQsMzcgKzE2MTUsNzkgQEAKIAlpZHJfZGVzdHJveSgmc2dfaW5kZXhfaWRyKTsKIH0KIAotc3RhdGljIGludAotc2dfc3RhcnRfcmVxKFNnX3JlcXVlc3QgKiBzcnApCitzdGF0aWMgaW50IHNnX3N0YXJ0X3JlcShTZ19yZXF1ZXN0ICpzcnAsIHVuc2lnbmVkIGNoYXIgKmNtZCkKIHsKIAlpbnQgcmVzOworCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlTZ19mZCAqc2ZwID0gc3JwLT5wYXJlbnRmcDsKIAlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7CiAJaW50IGR4ZmVyX2xlbiA9IChpbnQpIGhwLT5keGZlcl9sZW47CiAJaW50IGR4ZmVyX2RpciA9IGhwLT5keGZlcl9kaXJlY3Rpb247CisJdW5zaWduZWQgaW50IGlvdl9jb3VudCA9IGhwLT5pb3ZlY19jb3VudDsKIAlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKIAlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwID0gJnNmcC0+cmVzZXJ2ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHNmcC0+cGFyZW50ZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKwlzdHJ1Y3QgcnFfbWFwX2RhdGEgKm1kLCBtYXBfZGF0YTsKKwlpbnQgcncgPSBocC0+ZHhmZXJfZGlyZWN0aW9uID09IFNHX0RYRkVSX1RPX0RFViA/IFdSSVRFIDogUkVBRDsKIAotCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ19zdGFydF9yZXE6IGR4ZmVyX2xlbj0lZFxuIiwgZHhmZXJfbGVuKSk7CisJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoS0VSTl9JTkZPICJzZ19zdGFydF9yZXE6IGR4ZmVyX2xlbj0lZFxuIiwKKwkJCQkgICBkeGZlcl9sZW4pKTsKKworCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIHJ3LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShycS0+Y21kLCBjbWQsIGhwLT5jbWRfbGVuKTsKKworCXJxLT5jbWRfbGVuID0gaHAtPmNtZF9sZW47CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CisKKwlzcnAtPnJxID0gcnE7CisJcnEtPmVuZF9pb19kYXRhID0gc3JwOworCXJxLT5zZW5zZSA9IHNycC0+c2Vuc2VfYjsKKwlycS0+cmV0cmllcyA9IFNHX0RFRkFVTFRfUkVUUklFUzsKKwogCWlmICgoZHhmZXJfbGVuIDw9IDApIHx8IChkeGZlcl9kaXIgPT0gU0dfRFhGRVJfTk9ORSkpCiAJCXJldHVybiAwOwotCWlmIChzZ19hbGxvd19kaW8gJiYgKGhwLT5mbGFncyAmIFNHX0ZMQUdfRElSRUNUX0lPKSAmJgotCSAgICAoZHhmZXJfZGlyICE9IFNHX0RYRkVSX1VOS05PV04pICYmICgwID09IGhwLT5pb3ZlY19jb3VudCkgJiYKLQkgICAgKCFzZnAtPnBhcmVudGRwLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hKSkgewotCQlyZXMgPSBzZ19idWlsZF9kaXJlY3Qoc3JwLCBzZnAsIGR4ZmVyX2xlbik7Ci0JCWlmIChyZXMgPD0gMCkJLyogLXZlIC0+IGVycm9yLCAwIC0+IGRvbmUsIDEgLT4gdHJ5IGluZGlyZWN0ICovCi0JCQlyZXR1cm4gcmVzOworCisJaWYgKHNnX2FsbG93X2RpbyAmJiBocC0+ZmxhZ3MgJiBTR19GTEFHX0RJUkVDVF9JTyAmJgorCSAgICBkeGZlcl9kaXIgIT0gU0dfRFhGRVJfVU5LTk9XTiAmJiAhaW92X2NvdW50ICYmCisJICAgICFzZnAtPnBhcmVudGRwLT5kZXZpY2UtPmhvc3QtPnVuY2hlY2tlZF9pc2FfZG1hICYmCisJICAgIGJsa19ycV9hbGlnbmVkKHEsIGhwLT5keGZlcnAsIGR4ZmVyX2xlbikpCisJCW1kID0gTlVMTDsKKwllbHNlCisJCW1kID0gJm1hcF9kYXRhOworCisJaWYgKG1kKSB7CisJCWlmICghc2dfcmVzX2luX3VzZShzZnApICYmIGR4ZmVyX2xlbiA8PSByc3Zfc2NocC0+YnVmZmxlbikKKwkJCXNnX2xpbmtfcmVzZXJ2ZShzZnAsIHNycCwgZHhmZXJfbGVuKTsKKwkJZWxzZSB7CisJCQlyZXMgPSBzZ19idWlsZF9pbmRpcmVjdChyZXFfc2NocCwgc2ZwLCBkeGZlcl9sZW4pOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9CisKKwkJbWQtPnBhZ2VzID0gcmVxX3NjaHAtPnBhZ2VzOworCQltZC0+cGFnZV9vcmRlciA9IHJlcV9zY2hwLT5wYWdlX29yZGVyOworCQltZC0+bnJfZW50cmllcyA9IHJlcV9zY2hwLT5rX3VzZV9zZzsKIAl9Ci0JaWYgKCghc2dfcmVzX2luX3VzZShzZnApKSAmJiAoZHhmZXJfbGVuIDw9IHJzdl9zY2hwLT5idWZmbGVuKSkKLQkJc2dfbGlua19yZXNlcnZlKHNmcCwgc3JwLCBkeGZlcl9sZW4pOwotCWVsc2UgewotCQlyZXMgPSBzZ19idWlsZF9pbmRpcmVjdChyZXFfc2NocCwgc2ZwLCBkeGZlcl9sZW4pOwotCQlpZiAocmVzKSB7Ci0JCQlzZ19yZW1vdmVfc2NhdChyZXFfc2NocCk7Ci0JCQlyZXR1cm4gcmVzOworCisJaWYgKGlvdl9jb3VudCkKKwkJcmVzID0gYmxrX3JxX21hcF91c2VyX2lvdihxLCBycSwgbWQsIGhwLT5keGZlcnAsIGlvdl9jb3VudCwKKwkJCQkJICBocC0+ZHhmZXJfbGVuLCBHRlBfQVRPTUlDKTsKKwllbHNlCisJCXJlcyA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgbWQsIGhwLT5keGZlcnAsCisJCQkJICAgICAgaHAtPmR4ZmVyX2xlbiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXJlcykgeworCQlzcnAtPmJpbyA9IHJxLT5iaW87CisKKwkJaWYgKCFtZCkgeworCQkJcmVxX3NjaHAtPmRpb19pbl91c2UgPSAxOworCQkJaHAtPmluZm8gfD0gU0dfSU5GT19ESVJFQ1RfSU87CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NzgsMTg2ICsxNzAxLDM3IEBACiAJCXNnX3VubGlua19yZXNlcnZlKHNmcCwgc3JwKTsKIAllbHNlCiAJCXNnX3JlbW92ZV9zY2F0KHJlcV9zY2hwKTsKKworCWlmIChzcnAtPnJxKSB7CisJCWlmIChzcnAtPmJpbykKKwkJCWJsa19ycV91bm1hcF91c2VyKHNycC0+YmlvKTsKKworCQlibGtfcHV0X3JlcXVlc3Qoc3JwLT5ycSk7CisJfQorCiAJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOwogfQogCiBzdGF0aWMgaW50CiBzZ19idWlsZF9zZ2F0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHAsIGNvbnN0IFNnX2ZkICogc2ZwLCBpbnQgdGFibGVzaXplKQogewotCWludCBzZ19idWZmbGVuID0gdGFibGVzaXplICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCk7CisJaW50IHNnX2J1ZmZsZW4gPSB0YWJsZXNpemUgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKik7CiAJZ2ZwX3QgZ2ZwX2ZsYWdzID0gR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTjsKIAotCS8qCi0JICogVE9ETzogdGVzdCB3aXRob3V0IGxvd19kbWEsIHdlIHNob3VsZCBub3QgbmVlZCBpdCBzaW5jZQotCSAqIHRoZSBibG9jayBsYXllciB3aWxsIGJvdW5jZSB0aGUgYnVmZmVyIGZvciB1cwotCSAqCi0JICogWFhYKGhjaCk6IHdlIHNob3VsZG4ndCBuZWVkIEdGUF9ETUEgZm9yIHRoZSBhY3R1YWwgUy9HIGxpc3QuCi0JICovCi0JaWYgKHNmcC0+bG93X2RtYSkKLQkJIGdmcF9mbGFncyB8PSBHRlBfRE1BOwotCXNjaHAtPmJ1ZmZlciA9IGt6YWxsb2Moc2dfYnVmZmxlbiwgZ2ZwX2ZsYWdzKTsKLQlpZiAoIXNjaHAtPmJ1ZmZlcikKKwlzY2hwLT5wYWdlcyA9IGt6YWxsb2Moc2dfYnVmZmxlbiwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXNjaHAtPnBhZ2VzKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzZ19pbml0X3RhYmxlKHNjaHAtPmJ1ZmZlciwgdGFibGVzaXplKTsKIAlzY2hwLT5zZ2xpc3RfbGVuID0gc2dfYnVmZmxlbjsKIAlyZXR1cm4gdGFibGVzaXplOwkvKiBudW1iZXIgb2Ygc2NhdF9nYXRoIGVsZW1lbnRzIGFsbG9jYXRlZCAqLwogfQogCi0jaWZkZWYgU0dfQUxMT1dfRElPX0NPREUKLS8qIHZ2dnZ2dnZ2ICBmb2xsb3dpbmcgY29kZSBib3Jyb3dlZCBmcm9tIHN0IGRyaXZlcidzIGRpcmVjdCBJTyB2dnZ2dnZ2dnYgKi8KLQkvKiBUT0RPOiBob3BlZnVsbHkgd2UgY2FuIHVzZSB0aGUgZ2VuZXJpYyBibG9jayBsYXllciBjb2RlICovCi0KLS8qIFBpbiBkb3duIHVzZXIgcGFnZXMgYW5kIHB1dCB0aGVtIGludG8gYSBzY2F0dGVyIGdhdGhlciBsaXN0LiBSZXR1cm5zIDw9IDAgaWYKLSAgIC0gbWFwcGluZyBvZiBhbGwgcGFnZXMgbm90IHN1Y2Nlc3NmdWwKLSAgIChpLmUuLCBlaXRoZXIgY29tcGxldGVseSBzdWNjZXNzZnVsIG9yIGZhaWxzKQotKi8KLXN0YXRpYyBpbnQgCi1zdF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCi0JICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHNpemVfdCBjb3VudCwgaW50IHJ3KQotewotCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgY291bnQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB1YWRkciA+PiBQQUdFX1NISUZUOwotCWNvbnN0IGludCBucl9wYWdlcyA9IGVuZCAtIHN0YXJ0OwotCWludCByZXMsIGksIGo7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQotCS8qIFVzZXIgYXR0ZW1wdGVkIE92ZXJmbG93ISAqLwotCWlmICgodWFkZHIgKyBjb3VudCkgPCB1YWRkcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUb28gYmlnICovCi0gICAgICAgIGlmIChucl9wYWdlcyA+IG1heF9wYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBIbW0/ICovCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKChwYWdlcyA9IGttYWxsb2MobWF4X3BhZ2VzICogc2l6ZW9mKCpwYWdlcyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotICAgICAgICAvKiBUcnkgdG8gZmF1bHQgaW4gYWxsIG9mIHRoZSBuZWNlc3NhcnkgcGFnZXMgKi8KLQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0gICAgICAgIC8qIHJ3PT1SRUFEIG1lYW5zIHJlYWQgZnJvbSBkcml2ZSwgd3JpdGUgaW50byBtZW1vcnkgYXJlYSAqLwotCXJlcyA9IGdldF91c2VyX3BhZ2VzKAotCQljdXJyZW50LAotCQljdXJyZW50LT5tbSwKLQkJdWFkZHIsCi0JCW5yX3BhZ2VzLAotCQlydyA9PSBSRUFELAotCQkwLCAvKiBkb24ndCBmb3JjZSAqLwotCQlwYWdlcywKLQkJTlVMTCk7Ci0JdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCS8qIEVycm9ycyBhbmQgbm8gcGFnZSBtYXBwZWQgc2hvdWxkIHJldHVybiBoZXJlICovCi0JaWYgKHJlcyA8IG5yX3BhZ2VzKQotCQlnb3RvIG91dF91bm1hcDsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvKiBGSVhNRTogZmx1c2ggc3VwZXJmbG91cyBmb3Igcnc9PVJFQUQsCi0gICAgICAgICAgICAgICAgICogcHJvYmFibHkgd3JvbmcgZnVuY3Rpb24gZm9yIHJ3PT1XUklURQotICAgICAgICAgICAgICAgICAqLwotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tpXSk7Ci0JCS8qID8/IElzIGxvY2tpbmcgbmVlZGVkPyBJIGRvbid0IHRoaW5rIHNvICovCi0JCS8qIGlmICghdHJ5bG9ja19wYWdlKHBhZ2VzW2ldKSkKLQkJICAgZ290byBvdXRfdW5sb2NrOyAqLwotICAgICAgICB9Ci0KLQlzZ19zZXRfcGFnZShzZ2wsIHBhZ2VzWzBdLCAwLCB1YWRkciAmIH5QQUdFX01BU0spOwotCWlmIChucl9wYWdlcyA+IDEpIHsKLQkJc2dsWzBdLmxlbmd0aCA9IFBBR0VfU0laRSAtIHNnbFswXS5vZmZzZXQ7Ci0JCWNvdW50IC09IHNnbFswXS5sZW5ndGg7Ci0JCWZvciAoaT0xOyBpIDwgbnJfcGFnZXMgOyBpKyspCi0JCQlzZ19zZXRfcGFnZSgmc2dsW2ldLCBwYWdlc1tpXSwgY291bnQgPCBQQUdFX1NJWkUgPyBjb3VudCA6IFBBR0VfU0laRSwgMCk7Ci0JfQotCWVsc2UgewotCQlzZ2xbMF0ubGVuZ3RoID0gY291bnQ7Ci0JfQotCi0Ja2ZyZWUocGFnZXMpOwotCXJldHVybiBucl9wYWdlczsKLQotIG91dF91bm1hcDoKLQlpZiAocmVzID4gMCkgewotCQlmb3IgKGo9MDsgaiA8IHJlczsgaisrKQotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2pdKTsKLQkJcmVzID0gMDsKLQl9Ci0Ja2ZyZWUocGFnZXMpOwotCXJldHVybiByZXM7Ci19Ci0KLQotLyogQW5kIHVubWFwIHRoZW0uLi4gKi8KLXN0YXRpYyBpbnQgCi1zdF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCi0JCSAgICBpbnQgZGlydGllZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UoJnNnbFtpXSk7Ci0KLQkJaWYgKGRpcnRpZWQpCi0JCQlTZXRQYWdlRGlydHkocGFnZSk7Ci0JCS8qIHVubG9ja19wYWdlKHBhZ2UpOyAqLwotCQkvKiBGSVhNRTogY2FjaGUgZmx1c2ggbWlzc2luZyBmb3Igcnc9PVJFQUQKLQkJICogRklYTUU6IGNhbGwgdGhlIGNvcnJlY3QgcmVmZXJlbmNlIGNvdW50aW5nIGZ1bmN0aW9uCi0JCSAqLwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIF5eXl5eXl5eICBhYm92ZSBjb2RlIGJvcnJvd2VkIGZyb20gc3QgZHJpdmVyJ3MgZGlyZWN0IElPIF5eXl5eXl5eXiAqLwotI2VuZGlmCi0KLQotLyogUmV0dXJuczogLXZlIC0+IGVycm9yLCAwIC0+IGRvbmUsIDEgLT4gdHJ5IGluZGlyZWN0ICovCi1zdGF0aWMgaW50Ci1zZ19idWlsZF9kaXJlY3QoU2dfcmVxdWVzdCAqIHNycCwgU2dfZmQgKiBzZnAsIGludCBkeGZlcl9sZW4pCi17Ci0jaWZkZWYgU0dfQUxMT1dfRElPX0NPREUKLQlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7Ci0JU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKLQlpbnQgc2dfdGFibGVzaXplID0gc2ZwLT5wYXJlbnRkcC0+c2dfdGFibGVzaXplOwotCWludCBteF9zY19lbGVtcywgcmVzOwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNmcC0+cGFyZW50ZHAtPmRldmljZTsKLQotCWlmICgoKHVuc2lnbmVkIGxvbmcpaHAtPmR4ZmVycCAmCi0JCQlxdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUpKSAhPSAwKQotCQlyZXR1cm4gMTsKLQotCW14X3NjX2VsZW1zID0gc2dfYnVpbGRfc2dhdChzY2hwLCBzZnAsIHNnX3RhYmxlc2l6ZSk7Ci0gICAgICAgIGlmIChteF9zY19lbGVtcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQlyZXMgPSBzdF9tYXBfdXNlcl9wYWdlcyhzY2hwLT5idWZmZXIsIG14X3NjX2VsZW1zLAotCQkJCSh1bnNpZ25lZCBsb25nKWhwLT5keGZlcnAsIGR4ZmVyX2xlbiwgCi0JCQkJKFNHX0RYRkVSX1RPX0RFViA9PSBocC0+ZHhmZXJfZGlyZWN0aW9uKSA/IDEgOiAwKTsKLQlpZiAocmVzIDw9IDApIHsKLQkJc2dfcmVtb3ZlX3NjYXQoc2NocCk7Ci0JCXJldHVybiAxOwotCX0KLQlzY2hwLT5rX3VzZV9zZyA9IHJlczsKLQlzY2hwLT5kaW9faW5fdXNlID0gMTsKLQlocC0+aW5mbyB8PSBTR19JTkZPX0RJUkVDVF9JTzsKLQlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGludAogc2dfYnVpbGRfaW5kaXJlY3QoU2dfc2NhdHRlcl9ob2xkICogc2NocCwgU2dfZmQgKiBzZnAsIGludCBidWZmX3NpemUpCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlpbnQgcmV0X3N6ID0gMCwgaywgcmVtX3N6LCBudW0sIG14X3NjX2VsZW1zOworCWludCByZXRfc3ogPSAwLCBpLCBrLCByZW1fc3osIG51bSwgbXhfc2NfZWxlbXM7CiAJaW50IHNnX3RhYmxlc2l6ZSA9IHNmcC0+cGFyZW50ZHAtPnNnX3RhYmxlc2l6ZTsKLQlpbnQgYmxrX3NpemUgPSBidWZmX3NpemU7Ci0Jc3RydWN0IHBhZ2UgKnAgPSBOVUxMOworCWludCBibGtfc2l6ZSA9IGJ1ZmZfc2l6ZSwgb3JkZXI7CisJZ2ZwX3QgZ2ZwX21hc2sgPSBHRlBfQVRPTUlDIHwgX19HRlBfQ09NUCB8IF9fR0ZQX05PV0FSTjsKIAogCWlmIChibGtfc2l6ZSA8IDApCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTg4MSwxNSArMTc1NSwyNiBAQAogCQl9IGVsc2UKIAkJCXNjYXR0ZXJfZWxlbV9zel9wcmV2ID0gbnVtOwogCX0KLQlmb3IgKGsgPSAwLCBzZyA9IHNjaHAtPmJ1ZmZlciwgcmVtX3N6ID0gYmxrX3NpemU7Ci0JICAgICAocmVtX3N6ID4gMCkgJiYgKGsgPCBteF9zY19lbGVtcyk7Ci0JICAgICArK2ssIHJlbV9zeiAtPSByZXRfc3osIHNnID0gc2dfbmV4dChzZykpIHsKLQkJCisKKwlpZiAoc2ZwLT5sb3dfZG1hKQorCQlnZnBfbWFzayB8PSBHRlBfRE1BOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8ICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlnZnBfbWFzayB8PSBfX0dGUF9aRVJPOworCisJb3JkZXIgPSBnZXRfb3JkZXIobnVtKTsKK3JldHJ5OgorCXJldF9zeiA9IDEgPDwgKFBBR0VfU0hJRlQgKyBvcmRlcik7CisKKwlmb3IgKGsgPSAwLCByZW1fc3ogPSBibGtfc2l6ZTsgcmVtX3N6ID4gMCAmJiBrIDwgbXhfc2NfZWxlbXM7CisJICAgICBrKyssIHJlbV9zeiAtPSByZXRfc3opIHsKKwogCQludW0gPSAocmVtX3N6ID4gc2NhdHRlcl9lbGVtX3N6X3ByZXYpID8KLQkJICAgICAgc2NhdHRlcl9lbGVtX3N6X3ByZXYgOiByZW1fc3o7Ci0JCXAgPSBzZ19wYWdlX21hbGxvYyhudW0sIHNmcC0+bG93X2RtYSwgJnJldF9zeik7Ci0JCWlmICghcCkKLQkJCXJldHVybiAtRU5PTUVNOworCQkJc2NhdHRlcl9lbGVtX3N6X3ByZXYgOiByZW1fc3o7CisKKwkJc2NocC0+cGFnZXNba10gPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgb3JkZXIpOworCQlpZiAoIXNjaHAtPnBhZ2VzW2tdKQorCQkJZ290byBvdXQ7CiAKIAkJaWYgKG51bSA9PSBzY2F0dGVyX2VsZW1fc3pfcHJldikgewogCQkJaWYgKHVubGlrZWx5KHJldF9zeiA+IHNjYXR0ZXJfZWxlbV9zel9wcmV2KSkgewpAQCAtMTg5NywxMiArMTc4MiwxMiBAQAogCQkJCXNjYXR0ZXJfZWxlbV9zel9wcmV2ID0gcmV0X3N6OwogCQkJfQogCQl9Ci0JCXNnX3NldF9wYWdlKHNnLCBwLCAocmV0X3N6ID4gbnVtKSA/IG51bSA6IHJldF9zeiwgMCk7CiAKIAkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2luZGlyZWN0OiBrPSVkLCBudW09JWQsICIKIAkJCQkgInJldF9zej0lZFxuIiwgaywgbnVtLCByZXRfc3opKTsKIAl9CQkvKiBlbmQgb2YgZm9yIGxvb3AgKi8KIAorCXNjaHAtPnBhZ2Vfb3JkZXIgPSBvcmRlcjsKIAlzY2hwLT5rX3VzZV9zZyA9IGs7CiAJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2luZGlyZWN0OiBrX3VzZV9zZz0lZCwgIgogCQkJICJyZW1fc3o9JWRcbiIsIGssIHJlbV9zeikpOwpAQCAtMTkxMCwyMjMgKzE3OTUsNDIgQEAKIAlzY2hwLT5idWZmbGVuID0gYmxrX3NpemU7CiAJaWYgKHJlbV9zeiA+IDApCS8qIG11c3QgaGF2ZSBmYWlsZWQgKi8KIAkJcmV0dXJuIC1FTk9NRU07Ci0KIAlyZXR1cm4gMDsKLX0KK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorCQlfX2ZyZWVfcGFnZXMoc2NocC0+cGFnZXNba10sIG9yZGVyKTsKIAotc3RhdGljIGludAotc2dfd3JpdGVfeGZlcihTZ19yZXF1ZXN0ICogc3JwKQotewotCXNnX2lvX2hkcl90ICpocCA9ICZzcnAtPmhlYWRlcjsKLQlTZ19zY2F0dGVyX2hvbGQgKnNjaHAgPSAmc3JwLT5kYXRhOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY2hwLT5idWZmZXI7Ci0JaW50IG51bV94ZmVyID0gMDsKLQlpbnQgaiwgaywgb251bSwgdXNnbGVuLCBrc2dsZW4sIHJlczsKLQlpbnQgaW92ZWNfY291bnQgPSAoaW50KSBocC0+aW92ZWNfY291bnQ7Ci0JaW50IGR4ZmVyX2RpciA9IGhwLT5keGZlcl9kaXJlY3Rpb247Ci0JdW5zaWduZWQgY2hhciAqcDsKLQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqdXA7Ci0JaW50IG5ld19pbnRlcmZhY2UgPSAoJ1wwJyA9PSBocC0+aW50ZXJmYWNlX2lkKSA/IDAgOiAxOworCWlmICgtLW9yZGVyID49IDApCisJCWdvdG8gcmV0cnk7CiAKLQlpZiAoKFNHX0RYRkVSX1VOS05PV04gPT0gZHhmZXJfZGlyKSB8fCAoU0dfRFhGRVJfVE9fREVWID09IGR4ZmVyX2RpcikgfHwKLQkgICAgKFNHX0RYRkVSX1RPX0ZST01fREVWID09IGR4ZmVyX2RpcikpIHsKLQkJbnVtX3hmZXIgPSAoaW50KSAobmV3X2ludGVyZmFjZSA/IGhwLT5keGZlcl9sZW4gOiBocC0+ZmxhZ3MpOwotCQlpZiAoc2NocC0+YnVmZmxlbiA8IG51bV94ZmVyKQotCQkJbnVtX3hmZXIgPSBzY2hwLT5idWZmbGVuOwotCX0KLQlpZiAoKG51bV94ZmVyIDw9IDApIHx8IChzY2hwLT5kaW9faW5fdXNlKSB8fAotCSAgICAobmV3X2ludGVyZmFjZQotCSAgICAgJiYgKChTR19GTEFHX05PX0RYRkVSIHwgU0dfRkxBR19NTUFQX0lPKSAmIGhwLT5mbGFncykpKQotCQlyZXR1cm4gMDsKLQotCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ193cml0ZV94ZmVyOiBudW1feGZlcj0lZCwgaW92ZWNfY291bnQ9JWQsIGtfdXNlX3NnPSVkXG4iLAotCQkJICBudW1feGZlciwgaW92ZWNfY291bnQsIHNjaHAtPmtfdXNlX3NnKSk7Ci0JaWYgKGlvdmVjX2NvdW50KSB7Ci0JCW9udW0gPSBpb3ZlY19jb3VudDsKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGhwLT5keGZlcnAsIFNaX1NHX0lPVkVDICogb251bSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UKLQkJb251bSA9IDE7Ci0KLQlrc2dsZW4gPSBzZy0+bGVuZ3RoOwotCXAgPSBwYWdlX2FkZHJlc3Moc2dfcGFnZShzZykpOwotCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgb251bTsgKytqKSB7Ci0JCXJlcyA9IHNnX3VfaW92ZWMoaHAsIGlvdmVjX2NvdW50LCBqLCAxLCAmdXNnbGVuLCAmdXApOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQotCQlmb3IgKDsgcDsgc2cgPSBzZ19uZXh0KHNnKSwga3NnbGVuID0gc2ctPmxlbmd0aCwKLQkJICAgICBwID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSkgewotCQkJaWYgKHVzZ2xlbiA8PSAwKQotCQkJCWJyZWFrOwotCQkJaWYgKGtzZ2xlbiA+IHVzZ2xlbikgewotCQkJCWlmICh1c2dsZW4gPj0gbnVtX3hmZXIpIHsKLQkJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIG51bV94ZmVyKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIHVzZ2xlbikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXAgKz0gdXNnbGVuOwotCQkJCWtzZ2xlbiAtPSB1c2dsZW47Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChrc2dsZW4gPj0gbnVtX3hmZXIpIHsKLQkJCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIG51bV94ZmVyKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKF9fY29weV9mcm9tX3VzZXIocCwgdXAsIGtzZ2xlbikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXVwICs9IGtzZ2xlbjsKLQkJCQl1c2dsZW4gLT0ga3NnbGVuOwotCQkJfQotCQkJKytrOwotCQkJaWYgKGsgPj0gc2NocC0+a191c2Vfc2cpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc2dfdV9pb3ZlYyhzZ19pb19oZHJfdCAqIGhwLCBpbnQgc2dfbnVtLCBpbnQgaW5kLAotCSAgIGludCB3cl94ZiwgaW50ICpjb3VudHAsIHVuc2lnbmVkIGNoYXIgX191c2VyICoqdXApCi17Ci0JaW50IG51bV94ZmVyID0gKGludCkgaHAtPmR4ZmVyX2xlbjsKLQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqcCA9IGhwLT5keGZlcnA7Ci0JaW50IGNvdW50OwotCi0JaWYgKDAgPT0gc2dfbnVtKSB7Ci0JCWlmICh3cl94ZiAmJiAoJ1wwJyA9PSBocC0+aW50ZXJmYWNlX2lkKSkKLQkJCWNvdW50ID0gKGludCkgaHAtPmZsYWdzOwkvKiBob2xkcyAib2xkIiBpbnB1dF9zaXplICovCi0JCWVsc2UKLQkJCWNvdW50ID0gbnVtX3hmZXI7Ci0JfSBlbHNlIHsKLQkJc2dfaW92ZWNfdCBpb3ZlYzsKLQkJaWYgKF9fY29weV9mcm9tX3VzZXIoJmlvdmVjLCBwICsgaW5kKlNaX1NHX0lPVkVDLCBTWl9TR19JT1ZFQykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcCA9IGlvdmVjLmlvdl9iYXNlOwotCQljb3VudCA9IChpbnQpIGlvdmVjLmlvdl9sZW47Ci0JfQotCWlmICghYWNjZXNzX29rKHdyX3hmID8gVkVSSUZZX1JFQUQgOiBWRVJJRllfV1JJVEUsIHAsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHVwKQotCQkqdXAgPSBwOwotCWlmIChjb3VudHApCi0JCSpjb3VudHAgPSBjb3VudDsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQKIHNnX3JlbW92ZV9zY2F0KFNnX3NjYXR0ZXJfaG9sZCAqIHNjaHApCiB7CiAJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX3JlbW92ZV9zY2F0OiBrX3VzZV9zZz0lZFxuIiwgc2NocC0+a191c2Vfc2cpKTsKLQlpZiAoc2NocC0+YnVmZmVyICYmIChzY2hwLT5zZ2xpc3RfbGVuID4gMCkpIHsKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjaHAtPmJ1ZmZlcjsKLQotCQlpZiAoc2NocC0+ZGlvX2luX3VzZSkgewotI2lmZGVmIFNHX0FMTE9XX0RJT19DT0RFCi0JCQlzdF91bm1hcF91c2VyX3BhZ2VzKHNnLCBzY2hwLT5rX3VzZV9zZywgVFJVRSk7Ci0jZW5kaWYKLQkJfSBlbHNlIHsKKwlpZiAoc2NocC0+cGFnZXMgJiYgc2NocC0+c2dsaXN0X2xlbiA+IDApIHsKKwkJaWYgKCFzY2hwLT5kaW9faW5fdXNlKSB7CiAJCQlpbnQgazsKIAotCQkJZm9yIChrID0gMDsgKGsgPCBzY2hwLT5rX3VzZV9zZykgJiYgc2dfcGFnZShzZyk7Ci0JCQkgICAgICsraywgc2cgPSBzZ19uZXh0KHNnKSkgeworCQkJZm9yIChrID0gMDsgayA8IHNjaHAtPmtfdXNlX3NnICYmIHNjaHAtPnBhZ2VzW2tdOyBrKyspIHsKIAkJCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygKLQkJCQkgICAgInNnX3JlbW92ZV9zY2F0OiBrPSVkLCBwZz0weCVwLCBsZW49JWRcbiIsCi0JCQkJICAgIGssIHNnX3BhZ2Uoc2cpLCBzZy0+bGVuZ3RoKSk7Ci0JCQkJc2dfcGFnZV9mcmVlKHNnX3BhZ2Uoc2cpLCBzZy0+bGVuZ3RoKTsKKwkJCQkgICAgInNnX3JlbW92ZV9zY2F0OiBrPSVkLCBwZz0weCVwXG4iLAorCQkJCSAgICBrLCBzY2hwLT5wYWdlc1trXSkpOworCQkJCV9fZnJlZV9wYWdlcyhzY2hwLT5wYWdlc1trXSwgc2NocC0+cGFnZV9vcmRlcik7CiAJCQl9CisKKwkJCWtmcmVlKHNjaHAtPnBhZ2VzKTsKIAkJfQotCQlrZnJlZShzY2hwLT5idWZmZXIpOwogCX0KIAltZW1zZXQoc2NocCwgMCwgc2l6ZW9mICgqc2NocCkpOwogfQogCiBzdGF0aWMgaW50Ci1zZ19yZWFkX3hmZXIoU2dfcmVxdWVzdCAqIHNycCkKLXsKLQlzZ19pb19oZHJfdCAqaHAgPSAmc3JwLT5oZWFkZXI7Ci0JU2dfc2NhdHRlcl9ob2xkICpzY2hwID0gJnNycC0+ZGF0YTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NocC0+YnVmZmVyOwotCWludCBudW1feGZlciA9IDA7Ci0JaW50IGosIGssIG9udW0sIHVzZ2xlbiwga3NnbGVuLCByZXM7Ci0JaW50IGlvdmVjX2NvdW50ID0gKGludCkgaHAtPmlvdmVjX2NvdW50OwotCWludCBkeGZlcl9kaXIgPSBocC0+ZHhmZXJfZGlyZWN0aW9uOwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JdW5zaWduZWQgY2hhciBfX3VzZXIgKnVwOwotCWludCBuZXdfaW50ZXJmYWNlID0gKCdcMCcgPT0gaHAtPmludGVyZmFjZV9pZCkgPyAwIDogMTsKLQotCWlmICgoU0dfRFhGRVJfVU5LTk9XTiA9PSBkeGZlcl9kaXIpIHx8IChTR19EWEZFUl9GUk9NX0RFViA9PSBkeGZlcl9kaXIpCi0JICAgIHx8IChTR19EWEZFUl9UT19GUk9NX0RFViA9PSBkeGZlcl9kaXIpKSB7Ci0JCW51bV94ZmVyID0gaHAtPmR4ZmVyX2xlbjsKLQkJaWYgKHNjaHAtPmJ1ZmZsZW4gPCBudW1feGZlcikKLQkJCW51bV94ZmVyID0gc2NocC0+YnVmZmxlbjsKLQl9Ci0JaWYgKChudW1feGZlciA8PSAwKSB8fCAoc2NocC0+ZGlvX2luX3VzZSkgfHwKLQkgICAgKG5ld19pbnRlcmZhY2UKLQkgICAgICYmICgoU0dfRkxBR19OT19EWEZFUiB8IFNHX0ZMQUdfTU1BUF9JTykgJiBocC0+ZmxhZ3MpKSkKLQkJcmV0dXJuIDA7Ci0KLQlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfcmVhZF94ZmVyOiBudW1feGZlcj0lZCwgaW92ZWNfY291bnQ9JWQsIGtfdXNlX3NnPSVkXG4iLAotCQkJICBudW1feGZlciwgaW92ZWNfY291bnQsIHNjaHAtPmtfdXNlX3NnKSk7Ci0JaWYgKGlvdmVjX2NvdW50KSB7Ci0JCW9udW0gPSBpb3ZlY19jb3VudDsKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGhwLT5keGZlcnAsIFNaX1NHX0lPVkVDICogb251bSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UKLQkJb251bSA9IDE7Ci0KLQlwID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKTsKLQlrc2dsZW4gPSBzZy0+bGVuZ3RoOwotCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgb251bTsgKytqKSB7Ci0JCXJlcyA9IHNnX3VfaW92ZWMoaHAsIGlvdmVjX2NvdW50LCBqLCAwLCAmdXNnbGVuLCAmdXApOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQotCQlmb3IgKDsgcDsgc2cgPSBzZ19uZXh0KHNnKSwga3NnbGVuID0gc2ctPmxlbmd0aCwKLQkJICAgICBwID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSkgewotCQkJaWYgKHVzZ2xlbiA8PSAwKQotCQkJCWJyZWFrOwotCQkJaWYgKGtzZ2xlbiA+IHVzZ2xlbikgewotCQkJCWlmICh1c2dsZW4gPj0gbnVtX3hmZXIpIHsKLQkJCQkJaWYgKF9fY29weV90b191c2VyKHVwLCBwLCBudW1feGZlcikpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWlmIChfX2NvcHlfdG9fdXNlcih1cCwgcCwgdXNnbGVuKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcCArPSB1c2dsZW47Ci0JCQkJa3NnbGVuIC09IHVzZ2xlbjsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGtzZ2xlbiA+PSBudW1feGZlcikgewotCQkJCQlpZiAoX19jb3B5X3RvX3VzZXIodXAsIHAsIG51bV94ZmVyKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJaWYgKF9fY29weV90b191c2VyKHVwLCBwLCBrc2dsZW4pKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl1cCArPSBrc2dsZW47Ci0JCQkJdXNnbGVuIC09IGtzZ2xlbjsKLQkJCX0KLQkJCSsrazsKLQkJCWlmIChrID49IHNjaHAtPmtfdXNlX3NnKQotCQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKIHNnX3JlYWRfb3hmZXIoU2dfcmVxdWVzdCAqIHNycCwgY2hhciBfX3VzZXIgKm91dHAsIGludCBudW1fcmVhZF94ZmVyKQogewogCVNnX3NjYXR0ZXJfaG9sZCAqc2NocCA9ICZzcnAtPmRhdGE7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjaHAtPmJ1ZmZlcjsKIAlpbnQgaywgbnVtOwogCiAJU0NTSV9MT0dfVElNRU9VVCg0LCBwcmludGsoInNnX3JlYWRfb3hmZXI6IG51bV9yZWFkX3hmZXI9JWRcbiIsCkBAIC0yMTM0LDE1ICsxODM4LDE1IEBACiAJaWYgKCghb3V0cCkgfHwgKG51bV9yZWFkX3hmZXIgPD0gMCkpCiAJCXJldHVybiAwOwogCi0JZm9yIChrID0gMDsgKGsgPCBzY2hwLT5rX3VzZV9zZykgJiYgc2dfcGFnZShzZyk7ICsraywgc2cgPSBzZ19uZXh0KHNnKSkgewotCQludW0gPSBzZy0+bGVuZ3RoOworCW51bSA9IDEgPDwgKFBBR0VfU0hJRlQgKyBzY2hwLT5wYWdlX29yZGVyKTsKKwlmb3IgKGsgPSAwOyBrIDwgc2NocC0+a191c2Vfc2cgJiYgc2NocC0+cGFnZXNba107IGsrKykgewogCQlpZiAobnVtID4gbnVtX3JlYWRfeGZlcikgewotCQkJaWYgKF9fY29weV90b191c2VyKG91dHAsIHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNnKSksCisJCQlpZiAoX19jb3B5X3RvX3VzZXIob3V0cCwgcGFnZV9hZGRyZXNzKHNjaHAtPnBhZ2VzW2tdKSwKIAkJCQkJICAgbnVtX3JlYWRfeGZlcikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfSBlbHNlIHsKLQkJCWlmIChfX2NvcHlfdG9fdXNlcihvdXRwLCBwYWdlX2FkZHJlc3Moc2dfcGFnZShzZykpLAorCQkJaWYgKF9fY29weV90b191c2VyKG91dHAsIHBhZ2VfYWRkcmVzcyhzY2hwLT5wYWdlc1trXSksCiAJCQkJCSAgIG51bSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQludW1fcmVhZF94ZmVyIC09IG51bTsKQEAgLTIxNzcsMjQgKzE4ODEsMjEgQEAKIHsKIAlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKIAlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwID0gJnNmcC0+cmVzZXJ2ZTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcnN2X3NjaHAtPmJ1ZmZlcjsKIAlpbnQgaywgbnVtLCByZW07CiAKIAlzcnAtPnJlc191c2VkID0gMTsKIAlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfbGlua19yZXNlcnZlOiBzaXplPSVkXG4iLCBzaXplKSk7CiAJcmVtID0gc2l6ZTsKIAotCWZvciAoayA9IDA7IGsgPCByc3Zfc2NocC0+a191c2Vfc2c7ICsraywgc2cgPSBzZ19uZXh0KHNnKSkgewotCQludW0gPSBzZy0+bGVuZ3RoOworCW51bSA9IDEgPDwgKFBBR0VfU0hJRlQgKyByc3Zfc2NocC0+cGFnZV9vcmRlcik7CisJZm9yIChrID0gMDsgayA8IHJzdl9zY2hwLT5rX3VzZV9zZzsgaysrKSB7CiAJCWlmIChyZW0gPD0gbnVtKSB7Ci0JCQlzZnAtPnNhdmVfc2NhdF9sZW4gPSBudW07Ci0JCQlzZy0+bGVuZ3RoID0gcmVtOwogCQkJcmVxX3NjaHAtPmtfdXNlX3NnID0gayArIDE7CiAJCQlyZXFfc2NocC0+c2dsaXN0X2xlbiA9IHJzdl9zY2hwLT5zZ2xpc3RfbGVuOwotCQkJcmVxX3NjaHAtPmJ1ZmZlciA9IHJzdl9zY2hwLT5idWZmZXI7CisJCQlyZXFfc2NocC0+cGFnZXMgPSByc3Zfc2NocC0+cGFnZXM7CiAKIAkJCXJlcV9zY2hwLT5idWZmbGVuID0gc2l6ZTsKLQkJCXJlcV9zY2hwLT5iX21hbGxvY19sZW4gPSByc3Zfc2NocC0+Yl9tYWxsb2NfbGVuOworCQkJcmVxX3NjaHAtPnBhZ2Vfb3JkZXIgPSByc3Zfc2NocC0+cGFnZV9vcmRlcjsKIAkJCWJyZWFrOwogCQl9IGVsc2UKIAkJCXJlbSAtPSBudW07CkBAIC0yMjA4LDIyICsxOTA5LDEzIEBACiBzZ191bmxpbmtfcmVzZXJ2ZShTZ19mZCAqIHNmcCwgU2dfcmVxdWVzdCAqIHNycCkKIHsKIAlTZ19zY2F0dGVyX2hvbGQgKnJlcV9zY2hwID0gJnNycC0+ZGF0YTsKLQlTZ19zY2F0dGVyX2hvbGQgKnJzdl9zY2hwID0gJnNmcC0+cmVzZXJ2ZTsKIAogCVNDU0lfTE9HX1RJTUVPVVQoNCwgcHJpbnRrKCJzZ191bmxpbmtfcmVzZXJ2ZTogcmVxLT5rX3VzZV9zZz0lZFxuIiwKIAkJCQkgICAoaW50KSByZXFfc2NocC0+a191c2Vfc2cpKTsKLQlpZiAoKHJzdl9zY2hwLT5rX3VzZV9zZyA+IDApICYmIChyZXFfc2NocC0+a191c2Vfc2cgPiAwKSkgewotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcnN2X3NjaHAtPmJ1ZmZlcjsKLQotCQlpZiAoc2ZwLT5zYXZlX3NjYXRfbGVuID4gMCkKLQkJCShzZyArIChyZXFfc2NocC0+a191c2Vfc2cgLSAxKSktPmxlbmd0aCA9Ci0JCQkgICAgKHVuc2lnbmVkKSBzZnAtPnNhdmVfc2NhdF9sZW47Ci0JCWVsc2UKLQkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrICgic2dfdW5saW5rX3Jlc2VydmU6IEJBRCBzYXZlX3NjYXRfbGVuXG4iKSk7Ci0JfQogCXJlcV9zY2hwLT5rX3VzZV9zZyA9IDA7CiAJcmVxX3NjaHAtPmJ1ZmZsZW4gPSAwOwotCXJlcV9zY2hwLT5idWZmZXIgPSBOVUxMOworCXJlcV9zY2hwLT5wYWdlcyA9IE5VTEw7CisJcmVxX3NjaHAtPnBhZ2Vfb3JkZXIgPSAwOwogCXJlcV9zY2hwLT5zZ2xpc3RfbGVuID0gMDsKIAlzZnAtPnNhdmVfc2NhdF9sZW4gPSAwOwogCXNycC0+cmVzX3VzZWQgPSAwOwpAQCAtMjQ4MSw1MyArMjE3Myw2IEBACiAJcmV0dXJuIHNycCA/IDEgOiAwOwogfQogCi0vKiBUaGUgc2l6ZSBmZXRjaGVkICh2YWx1ZSBvdXRwdXQgdmlhIHJldFN6cCkgc2V0IHdoZW4gbm9uLU5VTEwgcmV0dXJuICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKgotc2dfcGFnZV9tYWxsb2MoaW50IHJxU3osIGludCBsb3dEbWEsIGludCAqcmV0U3pwKQotewotCXN0cnVjdCBwYWdlICpyZXNwID0gTlVMTDsKLQlnZnBfdCBwYWdlX21hc2s7Ci0JaW50IG9yZGVyLCBhX3NpemU7Ci0JaW50IHJlc1N6OwotCi0JaWYgKChycVN6IDw9IDApIHx8IChOVUxMID09IHJldFN6cCkpCi0JCXJldHVybiByZXNwOwotCi0JaWYgKGxvd0RtYSkKLQkJcGFnZV9tYXNrID0gR0ZQX0FUT01JQyB8IEdGUF9ETUEgfCBfX0dGUF9DT01QIHwgX19HRlBfTk9XQVJOOwotCWVsc2UKLQkJcGFnZV9tYXNrID0gR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTVAgfCBfX0dGUF9OT1dBUk47Ci0KLQlmb3IgKG9yZGVyID0gMCwgYV9zaXplID0gUEFHRV9TSVpFOyBhX3NpemUgPCBycVN6OwotCSAgICAgb3JkZXIrKywgYV9zaXplIDw8PSAxKSA7Ci0JcmVzU3ogPSBhX3NpemU7CQkvKiByb3VuZGVkIHVwIGlmIG5lY2Vzc2FyeSAqLwotCXJlc3AgPSBhbGxvY19wYWdlcyhwYWdlX21hc2ssIG9yZGVyKTsKLQl3aGlsZSAoKCFyZXNwKSAmJiBvcmRlcikgewotCQktLW9yZGVyOwotCQlhX3NpemUgPj49IDE7CS8qIGRpdmlkZSBieSAyLCB1bnRpbCBQQUdFX1NJWkUgKi8KLQkJcmVzcCA9ICBhbGxvY19wYWdlcyhwYWdlX21hc2ssIG9yZGVyKTsJLyogdHJ5IGhhbGYgKi8KLQkJcmVzU3ogPSBhX3NpemU7Ci0JfQotCWlmIChyZXNwKSB7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJCW1lbXNldChwYWdlX2FkZHJlc3MocmVzcCksIDAsIHJlc1N6KTsKLQkJKnJldFN6cCA9IHJlc1N6OwotCX0KLQlyZXR1cm4gcmVzcDsKLX0KLQotc3RhdGljIHZvaWQKLXNnX3BhZ2VfZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHNpemUpCi17Ci0JaW50IG9yZGVyLCBhX3NpemU7Ci0KLQlpZiAoIXBhZ2UpCi0JCXJldHVybjsKLQlmb3IgKG9yZGVyID0gMCwgYV9zaXplID0gUEFHRV9TSVpFOyBhX3NpemUgPCBzaXplOwotCSAgICAgb3JkZXIrKywgYV9zaXplIDw8PSAxKSA7Ci0JX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKLX0KLQogI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKIHN0YXRpYyBpbnQKIHNnX2lkcl9tYXhfaWQoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCAzMjkyOTY1Li4wZjE3MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAKIHN0YXRpYyBpbnQgc3JfcHJlcF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWludCBibG9jaz0wLCB0aGlzX2NvdW50LCBzX3NpemUsIHRpbWVvdXQgPSBTUl9USU1FT1VUOworCWludCBibG9jayA9IDAsIHRoaXNfY291bnQsIHNfc2l6ZTsKIAlzdHJ1Y3Qgc2NzaV9jZCAqY2Q7CiAJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBxLT5xdWV1ZWRhdGE7CkBAIC00NjEsNyArNDYxLDYgQEAKIAlTQ3BudC0+dHJhbnNmZXJzaXplID0gY2QtPmRldmljZS0+c2VjdG9yX3NpemU7CiAJU0NwbnQtPnVuZGVyZmxvdyA9IHRoaXNfY291bnQgPDwgOTsKIAlTQ3BudC0+YWxsb3dlZCA9IE1BWF9SRVRSSUVTOwotCVNDcG50LT50aW1lb3V0X3Blcl9jb21tYW5kID0gdGltZW91dDsKIAogCS8qCiAJICogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBpcyByZWFkeSBmcm9tIG91ciBlbmQgdG8gYmUKQEAgLTYyMCw2ICs2MTksOCBAQAogCWRpc2stPmZvcHMgPSAmc3JfYmRvcHM7CiAJZGlzay0+ZmxhZ3MgPSBHRU5IRF9GTF9DRDsKIAorCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkZXYtPnJlcXVlc3RfcXVldWUsIFNSX1RJTUVPVVQpOworCiAJY2QtPmRldmljZSA9IHNkZXY7CiAJY2QtPmRpc2sgPSBkaXNrOwogCWNkLT5kcml2ZXIgPSAmc3JfdGVtcGxhdGU7CkBAIC02NTYsNyArNjU3LDYgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBjZCk7CiAJZGlzay0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOwogCWFkZF9kaXNrKGRpc2spOwotCWJsa19yZWdpc3Rlcl9maWx0ZXIoZGlzayk7CiAKIAlzZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBzZGV2LAogCQkgICAgIkF0dGFjaGVkIHNjc2kgQ0QtUk9NICVzXG4iLCBjZC0+Y2RpLm5hbWUpOwpAQCAtODc5LDcgKzg3OSw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBjZC0+ZGlzazsKIAogCXNwaW5fbG9jaygmc3JfaW5kZXhfbG9jayk7Ci0JY2xlYXJfYml0KGRpc2stPmZpcnN0X21pbm9yLCBzcl9pbmRleF9iaXRzKTsKKwljbGVhcl9iaXQoTUlOT1IoZGlza19kZXZ0KGRpc2spKSwgc3JfaW5kZXhfYml0cyk7CiAJc3Bpbl91bmxvY2soJnNyX2luZGV4X2xvY2spOwogCiAJdW5yZWdpc3Rlcl9jZHJvbSgmY2QtPmNkaSk7CkBAIC04OTUsNyArODk1LDYgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWJsa191bnJlZ2lzdGVyX2ZpbHRlcihjZC0+ZGlzayk7CiAJZGVsX2dlbmRpc2soY2QtPmRpc2spOwogCiAJbXV0ZXhfbG9jaygmc3JfcmVmX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggYzJiYjUzZTMuLjVjMjhkMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC00NDI4LDEzICs0NDI4LDEwIEBACiAJCXNucHJpbnRmKG5hbWUsIDEwLCAiJXMlcyVzIiwgcmV3ID8gIm4iIDogIiIsCiAJCQkgU1RwLT5kaXNrLT5kaXNrX25hbWUsIHN0X2Zvcm1hdHNbaV0pOwogCQlzdF9jbGFzc19tZW1iZXIgPQotCQkJZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHN0X3N5c2ZzX2NsYXNzLAotCQkJCQkgICAgICAmU1RwLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAotCQkJCQkgICAgICBNS0RFVihTQ1NJX1RBUEVfTUFKT1IsCi0JCQkJCQkgICAgVEFQRV9NSU5PUihkZXZfbnVtLAotCQkJCQkJCSAgICAgIG1vZGUsIHJldykpLAotCQkJCQkgICAgICAmU1RwLT5tb2Rlc1ttb2RlXSwKLQkJCQkJICAgICAgIiVzIiwgbmFtZSk7CisJCQlkZXZpY2VfY3JlYXRlKHN0X3N5c2ZzX2NsYXNzLCAmU1RwLT5kZXZpY2UtPnNkZXZfZ2VuZGV2LAorCQkJCSAgICAgIE1LREVWKFNDU0lfVEFQRV9NQUpPUiwKKwkJCQkJICAgIFRBUEVfTUlOT1IoZGV2X251bSwgbW9kZSwgcmV3KSksCisJCQkJICAgICAgJlNUcC0+bW9kZXNbbW9kZV0sICIlcyIsIG5hbWUpOwogCQlpZiAoSVNfRVJSKHN0X2NsYXNzX21lbWJlcikpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0JWQ6IGRldmljZV9jcmVhdGUgZmFpbGVkXG4iLAogCQkJICAgICAgIGRldl9udW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bl9lc3AuYyBiL2RyaXZlcnMvc2NzaS9zdW5fZXNwLmMKaW5kZXggZjljZjcwMS4uM2Q3M2FhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bl9lc3AuYworKysgYi9kcml2ZXJzL3Njc2kvc3VuX2VzcC5jCkBAIC0xLDYgKzEsNiBAQAogLyogc3VuX2VzcC5jOiBFU1AgZnJvbnQtZW5kIGZvciBTcGFyYyBTQlVTIHN5c3RlbXMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtOSw3OSArOSw4OSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLSNpbmNsdWRlIDxhc20vc2J1cy5oPgotCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIAogI2luY2x1ZGUgImVzcF9zY3NpLmgiCiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkic3VuX2VzcCIKICNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4wMDAiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXByaWwgMTksIDIwMDciCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4xMDAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXVndXN0IDI3LCAyMDA4IgogCiAjZGVmaW5lIGRtYV9yZWFkMzIoUkVHKSBcCiAJc2J1c19yZWFkbChlc3AtPmRtYV9yZWdzICsgKFJFRykpCiAjZGVmaW5lIGRtYV93cml0ZTMyKFZBTCwgUkVHKSBcCiAJc2J1c193cml0ZWwoKFZBTCksIGVzcC0+ZG1hX3JlZ3MgKyAoUkVHKSkKIAotc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfZmluZF9kbWEoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2J1c19kZXYgKmRtYV9zZGV2KQorLyogRFZNQSBjaGlwIHJldmlzaW9ucyAqLworZW51bSBkdm1hX3JldiB7CisJZHZtYXJldjAsCisJZHZtYWVzYzEsCisJZHZtYXJldjEsCisJZHZtYXJldjIsCisJZHZtYXJldjMsCisJZHZtYXJldnBsdXMsCisJZHZtYWhtZQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfc2V0dXBfZG1hKHN0cnVjdCBlc3AgKmVzcCwKKwkJCQkJc3RydWN0IG9mX2RldmljZSAqZG1hX29mKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OwotCXN0cnVjdCBzYnVzX2RtYSAqZG1hOworCWVzcC0+ZG1hID0gZG1hX29mOwogCi0JaWYgKGRtYV9zZGV2ICE9IE5VTEwpIHsKLQkJZm9yX2VhY2hfZHZtYShkbWEpIHsKLQkJCWlmIChkbWEtPnNkZXYgPT0gZG1hX3NkZXYpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3JfZWFjaF9kdm1hKGRtYSkgewotCQkJaWYgKGRtYS0+c2RldiA9PSBOVUxMKQotCQkJCWJyZWFrOworCWVzcC0+ZG1hX3JlZ3MgPSBvZl9pb3JlbWFwKCZkbWFfb2YtPnJlc291cmNlWzBdLCAwLAorCQkJCSAgIHJlc291cmNlX3NpemUoJmRtYV9vZi0+cmVzb3VyY2VbMF0pLAorCQkJCSAgICJlc3BkbWEiKTsKKwlpZiAoIWVzcC0+ZG1hX3JlZ3MpCisJCXJldHVybiAtRU5PTUVNOwogCi0JCQkvKiBJZiBidXMgKyBzbG90IGFyZSB0aGUgc2FtZSBhbmQgaXQgaGFzIHRoZQotCQkJICogY29ycmVjdCBPQlAgbmFtZSwgaXQncyBvdXJzLgotCQkJICovCi0JCQlpZiAoc2Rldi0+YnVzID09IGRtYS0+c2Rldi0+YnVzICYmCi0JCQkgICAgc2Rldi0+c2xvdCA9PSBkbWEtPnNkZXYtPnNsb3QgJiYKLQkJCSAgICAoIXN0cmNtcChkbWEtPnNkZXYtPnByb21fbmFtZSwgImRtYSIpIHx8Ci0JCQkgICAgICFzdHJjbXAoZG1hLT5zZGV2LT5wcm9tX25hbWUsICJlc3BkbWEiKSkpCi0JCQkJYnJlYWs7Ci0JCX0KKwlzd2l0Y2ggKGRtYV9yZWFkMzIoRE1BX0NTUikgJiBETUFfREVWSUNFX0lEKSB7CisJY2FzZSBETUFfVkVSUzA6CisJCWVzcC0+ZG1hcmV2ID0gZHZtYXJldjA7CisJCWJyZWFrOworCWNhc2UgRE1BX0VTQ1YxOgorCQllc3AtPmRtYXJldiA9IGR2bWFlc2MxOworCQlicmVhazsKKwljYXNlIERNQV9WRVJTMToKKwkJZXNwLT5kbWFyZXYgPSBkdm1hcmV2MTsKKwkJYnJlYWs7CisJY2FzZSBETUFfVkVSUzI6CisJCWVzcC0+ZG1hcmV2ID0gZHZtYXJldjI7CisJCWJyZWFrOworCWNhc2UgRE1BX1ZFUkhNRToKKwkJZXNwLT5kbWFyZXYgPSBkdm1haG1lOworCQlicmVhazsKKwljYXNlIERNQV9WRVJTUExVUzoKKwkJZXNwLT5kbWFyZXYgPSBkdm1hcmV2cGx1czsKKwkJYnJlYWs7CiAJfQogCi0JaWYgKGRtYSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlslc10gQ2Fubm90IGZpbmQgZG1hLlxuIiwKLQkJICAgICAgIHNkZXYtPm9mZGV2Lm5vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQllc3AtPmRtYSA9IGRtYTsKLQllc3AtPmRtYV9yZWdzID0gZG1hLT5yZWdzOwotCiAJcmV0dXJuIDA7CiAKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfbWFwX3JlZ3Moc3RydWN0IGVzcCAqZXNwLCBpbnQgaG1lKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAkvKiBPbiBITUUsIHR3byByZWcgc2V0cyBleGlzdCwgZmlyc3QgaXMgRFZNQSwKIAkgKiBzZWNvbmQgaXMgRVNQIHJlZ2lzdGVycy4KIAkgKi8KIAlpZiAoaG1lKQotCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMV07CisJCXJlcyA9ICZvcC0+cmVzb3VyY2VbMV07CiAJZWxzZQotCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMF07CisJCXJlcyA9ICZvcC0+cmVzb3VyY2VbMF07CiAKLQllc3AtPnJlZ3MgPSBzYnVzX2lvcmVtYXAocmVzLCAwLCBTQlVTX0VTUF9SRUdfU0laRSwgIkVTUCIpOworCWVzcC0+cmVncyA9IG9mX2lvcmVtYXAocmVzLCAwLCBTQlVTX0VTUF9SRUdfU0laRSwgIkVTUCIpOwogCWlmICghZXNwLT5yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtOTAsMTAgKzEwMCwxMSBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBlc3Bfc2J1c19tYXBfY29tbWFuZF9ibG9jayhzdHJ1Y3QgZXNwICplc3ApCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5kZXY7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBlc3AtPmRldjsKIAotCWVzcC0+Y29tbWFuZF9ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChzZGV2LCAxNiwKLQkJCQkJCSAgICZlc3AtPmNvbW1hbmRfYmxvY2tfZG1hKTsKKwllc3AtPmNvbW1hbmRfYmxvY2sgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsIDE2LAorCQkJCQkJJmVzcC0+Y29tbWFuZF9ibG9ja19kbWEsCisJCQkJCQlHRlBfQVRPTUlDKTsKIAlpZiAoIWVzcC0+Y29tbWFuZF9ibG9jaykKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC0xMDIsMTcgKzExMywxOCBAQAogc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfcmVnaXN0ZXJfaXJxKHN0cnVjdCBlc3AgKmVzcCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZXNwLT5ob3N0OwotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CiAKLQlob3N0LT5pcnEgPSBzZGV2LT5pcnFzWzBdOworCWhvc3QtPmlycSA9IG9wLT5pcnFzWzBdOwogCXJldHVybiByZXF1ZXN0X2lycShob3N0LT5pcnEsIHNjc2lfZXNwX2ludHIsIElSUUZfU0hBUkVELCAiRVNQIiwgZXNwKTsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9nZXRfc2NzaV9pZChzdHJ1Y3QgZXNwICplc3ApCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2dldF9zY3NpX2lkKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IG9mX2RldmljZSAqZXNwZG1hKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAorCWRwID0gb3AtPm5vZGU7CiAJZXNwLT5zY3NpX2lkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiaW5pdGlhdG9yLWlkIiwgMHhmZik7CiAJaWYgKGVzcC0+c2NzaV9pZCAhPSAweGZmKQogCQlnb3RvIGRvbmU7CkBAIC0xMjEsMTMgKzEzMyw3IEBACiAJaWYgKGVzcC0+c2NzaV9pZCAhPSAweGZmKQogCQlnb3RvIGRvbmU7CiAKLQlpZiAoIXNkZXYtPmJ1cykgewotCQkvKiBTVU40ICovCi0JCWVzcC0+c2NzaV9pZCA9IDc7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQllc3AtPnNjc2lfaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc2Rldi0+YnVzLT5vZmRldi5ub2RlLAorCWVzcC0+c2NzaV9pZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChlc3BkbWEtPm5vZGUsCiAJCQkJCSAgICAgInNjc2ktaW5pdGlhdG9yLWlkIiwgNyk7CiAKIGRvbmU6CkBAIC0xMzcsOSArMTQzLDEwIEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBlc3BfZ2V0X2RpZmZlcmVudGlhbChzdHJ1Y3QgZXNwICplc3ApCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IHNkZXYtPm9mZGV2Lm5vZGU7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBlc3AtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCisJZHAgPSBvcC0+bm9kZTsKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShkcCwgImRpZmZlcmVudGlhbCIsIE5VTEwpKQogCQllc3AtPmZsYWdzIHw9IEVTUF9GTEFHX0RJRkZFUkVOVElBTDsKIAllbHNlCkBAIC0xNDgsNDMgKzE1NSwzNiBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2dldF9jbG9ja19wYXJhbXMoc3RydWN0IGVzcCAqZXNwKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzX2RwOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpidXNfZHAsICpkcDsKIAlpbnQgZm1oejsKIAotCWJ1c19kcCA9IE5VTEw7Ci0JaWYgKHNkZXYgIT0gTlVMTCAmJiBzZGV2LT5idXMgIT0gTlVMTCkKLQkJYnVzX2RwID0gc2Rldi0+YnVzLT5vZmRldi5ub2RlOworCWRwID0gb3AtPm5vZGU7CisJYnVzX2RwID0gZHAtPnBhcmVudDsKIAogCWZtaHogPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLCAwKTsKIAlpZiAoZm1oeiA9PSAwKQotCQlmbWh6ID0gKCFidXNfZHApID8gMCA6Ci0JCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoYnVzX2RwLCAiY2xvY2stZnJlcXVlbmN5IiwgMCk7CisJCWZtaHogPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoYnVzX2RwLCAiY2xvY2stZnJlcXVlbmN5IiwgMCk7CiAKIAllc3AtPmNmcmVxID0gZm1oejsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9nZXRfYnVyc3RzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNidXNfZGV2ICpkbWEpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2dldF9idXJzdHMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkbWFfb2YpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IHNkZXYtPm9mZGV2Lm5vZGU7Ci0JdTggYnVyc3RzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG1hX2RwID0gZG1hX29mLT5ub2RlOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwl1OCBidXJzdHMsIHZhbDsKIAorCWRwID0gb3AtPm5vZGU7CiAJYnVyc3RzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKLQlpZiAoZG1hKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG1hX2RwID0gZG1hLT5vZmRldi5ub2RlOwotCQl1OCB2YWwgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZG1hX2RwLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKLQkJaWYgKHZhbCAhPSAweGZmKQotCQkJYnVyc3RzICY9IHZhbDsKLQl9CisJdmFsID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRtYV9kcCwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJaWYgKHZhbCAhPSAweGZmKQorCQlidXJzdHMgJj0gdmFsOwogCi0JaWYgKHNkZXYtPmJ1cykgewotCQl1OCB2YWwgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc2Rldi0+YnVzLT5vZmRldi5ub2RlLAotCQkJCQkgICAgICAgImJ1cnN0LXNpemVzIiwgMHhmZik7Ci0JCWlmICh2YWwgIT0gMHhmZikKLQkJCWJ1cnN0cyAmPSB2YWw7Ci0JfQorCXZhbCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkbWFfZHAtPnBhcmVudCwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJaWYgKHZhbCAhPSAweGZmKQorCQlidXJzdHMgJj0gdmFsOwogCiAJaWYgKGJ1cnN0cyA9PSAweGZmIHx8CiAJICAgIChidXJzdHMgJiBETUFfQlVSU1QxNikgPT0gMCB8fApAQCAtMTk0LDkgKzE5NCw5IEBACiAJZXNwLT5idXJzdHMgPSBidXJzdHM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBlc3Bfc2J1c19nZXRfcHJvcHMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlc3Bfc2J1c19nZXRfcHJvcHMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgb2ZfZGV2aWNlICplc3BkbWEpCiB7Ci0JZXNwX2dldF9zY3NpX2lkKGVzcCk7CisJZXNwX2dldF9zY3NpX2lkKGVzcCwgZXNwZG1hKTsKIAllc3BfZ2V0X2RpZmZlcmVudGlhbChlc3ApOwogCWVzcF9nZXRfY2xvY2tfcGFyYW1zKGVzcCk7CiAJZXNwX2dldF9idXJzdHMoZXNwLCBlc3BkbWEpOwpAQCAtMjE1LDI1ICsyMTUsMzMgQEAKIHN0YXRpYyBkbWFfYWRkcl90IHNidXNfZXNwX21hcF9zaW5nbGUoc3RydWN0IGVzcCAqZXNwLCB2b2lkICpidWYsCiAJCQkJICAgICAgc2l6ZV90IHN6LCBpbnQgZGlyKQogewotCXJldHVybiBzYnVzX21hcF9zaW5nbGUoZXNwLT5kZXYsIGJ1Ziwgc3osIGRpcik7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBlc3AtPmRldjsKKworCXJldHVybiBkbWFfbWFwX3NpbmdsZSgmb3AtPmRldiwgYnVmLCBzeiwgZGlyKTsKIH0KIAogc3RhdGljIGludCBzYnVzX2VzcF9tYXBfc2coc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQkJCSAgaW50IG51bV9zZywgaW50IGRpcikKIHsKLQlyZXR1cm4gc2J1c19tYXBfc2coZXNwLT5kZXYsIHNnLCBudW1fc2csIGRpcik7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBlc3AtPmRldjsKKworCXJldHVybiBkbWFfbWFwX3NnKCZvcC0+ZGV2LCBzZywgbnVtX3NnLCBkaXIpOwogfQogCiBzdGF0aWMgdm9pZCBzYnVzX2VzcF91bm1hcF9zaW5nbGUoc3RydWN0IGVzcCAqZXNwLCBkbWFfYWRkcl90IGFkZHIsCiAJCQkJICBzaXplX3Qgc3osIGludCBkaXIpCiB7Ci0Jc2J1c191bm1hcF9zaW5nbGUoZXNwLT5kZXYsIGFkZHIsIHN6LCBkaXIpOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZvcC0+ZGV2LCBhZGRyLCBzeiwgZGlyKTsKIH0KIAogc3RhdGljIHZvaWQgc2J1c19lc3BfdW5tYXBfc2coc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQkJICAgICAgaW50IG51bV9zZywgaW50IGRpcikKIHsKLQlzYnVzX3VubWFwX3NnKGVzcC0+ZGV2LCBzZywgbnVtX3NnLCBkaXIpOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gZXNwLT5kZXY7CisKKwlkbWFfdW5tYXBfc2coJm9wLT5kZXYsIHNnLCBudW1fc2csIGRpcik7CiB9CiAKIHN0YXRpYyBpbnQgc2J1c19lc3BfaXJxX3BlbmRpbmcoc3RydWN0IGVzcCAqZXNwKQpAQCAtMjQ3LDI0ICsyNTUsMjYgQEAKIHsKIAlpbnQgY2FuX2RvX2J1cnN0MTYsIGNhbl9kb19idXJzdDMyLCBjYW5fZG9fYnVyc3Q2NDsKIAlpbnQgY2FuX2RvX3NidXM2NCwgbGltOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wOwogCXUzMiB2YWw7CiAKIAljYW5fZG9fYnVyc3QxNiA9IChlc3AtPmJ1cnN0cyAmIERNQV9CVVJTVDE2KSAhPSAwOwogCWNhbl9kb19idXJzdDMyID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUMzIpICE9IDA7CiAJY2FuX2RvX2J1cnN0NjQgPSAwOwogCWNhbl9kb19zYnVzNjQgPSAwOwotCWlmIChzYnVzX2Nhbl9kbWFfNjRiaXQoZXNwLT5kZXYpKQorCW9wID0gZXNwLT5kZXY7CisJaWYgKHNidXNfY2FuX2RtYV82NGJpdCgpKQogCQljYW5fZG9fc2J1czY0ID0gMTsKLQlpZiAoc2J1c19jYW5fYnVyc3Q2NChlc3AtPnNkZXYpKQorCWlmIChzYnVzX2Nhbl9idXJzdDY0KCkpCiAJCWNhbl9kb19idXJzdDY0ID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUNjQpICE9IDA7CiAKIAkvKiBQdXQgdGhlIERWTUEgaW50byBhIGtub3duIHN0YXRlLiAqLwotCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gIT0gZHZtYWhtZSkgeworCWlmIChlc3AtPmRtYXJldiAhPSBkdm1haG1lKSB7CiAJCXZhbCA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CiAJCWRtYV93cml0ZTMyKHZhbCB8IERNQV9SU1RfU0NTSSwgRE1BX0NTUik7CiAJCWRtYV93cml0ZTMyKHZhbCAmIH5ETUFfUlNUX1NDU0ksIERNQV9DU1IpOwogCX0KLQlzd2l0Y2ggKGVzcC0+ZG1hLT5yZXZpc2lvbikgeworCXN3aXRjaCAoZXNwLT5kbWFyZXYpIHsKIAljYXNlIGR2bWFobWU6CiAJCWRtYV93cml0ZTMyKERNQV9SRVNFVF9GQVMzNjYsIERNQV9DU1IpOwogCQlkbWFfd3JpdGUzMihETUFfUlNUX1NDU0ksIERNQV9DU1IpOwpAQCAtMjgyLDcgKzI5Miw3IEBACiAKIAkJaWYgKGNhbl9kb19zYnVzNjQpIHsKIAkJCWVzcC0+cHJldl9obWVfZG1hY3NyIHw9IERNQV9TQ1NJX1NCVVM2NDsKLQkJCXNidXNfc2V0X3NidXM2NChlc3AtPmRldiwgZXNwLT5idXJzdHMpOworCQkJc2J1c19zZXRfc2J1czY0KCZvcC0+ZGV2LCBlc3AtPmJ1cnN0cyk7CiAJCX0KIAogCQlsaW0gPSAxMDAwOwpAQCAtMzQ2LDE0ICszNTYsMTQgQEAKIAl1MzIgY3NyOwogCWludCBsaW07CiAKLQlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFobWUpCisJaWYgKGVzcC0+ZG1hcmV2ID09IGR2bWFobWUpCiAJCXJldHVybjsKIAogCWNzciA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CiAJaWYgKCEoY3NyICYgRE1BX0ZJRk9fSVNEUkFJTikpCiAJCXJldHVybjsKIAotCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gIT0gZHZtYXJldjMgJiYgZXNwLT5kbWEtPnJldmlzaW9uICE9IGR2bWFlc2MxKQorCWlmIChlc3AtPmRtYXJldiAhPSBkdm1hcmV2MyAmJiBlc3AtPmRtYXJldiAhPSBkdm1hZXNjMSkKIAkJZG1hX3dyaXRlMzIoY3NyIHwgRE1BX0ZJRk9fU1REUkFJTiwgRE1BX0NTUik7CiAKIAlsaW0gPSAxMDAwOwpAQCAtMzY5LDcgKzM3OSw3IEBACiAKIHN0YXRpYyB2b2lkIHNidXNfZXNwX2RtYV9pbnZhbGlkYXRlKHN0cnVjdCBlc3AgKmVzcCkKIHsKLQlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFobWUpIHsKKwlpZiAoZXNwLT5kbWFyZXYgPT0gZHZtYWhtZSkgewogCQlkbWFfd3JpdGUzMihETUFfUlNUX1NDU0ksIERNQV9DU1IpOwogCiAJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKChlc3AtPnByZXZfaG1lX2RtYWNzciB8CkBAIC00NDAsNyArNDUwLDcgQEAKIAkJZWxzZQogCQkJY3NyICY9IH5ETUFfU1RfV1JJVEU7CiAJCWRtYV93cml0ZTMyKGNzciwgRE1BX0NTUik7Ci0JCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWVzYzEpIHsKKwkJaWYgKGVzcC0+ZG1hcmV2ID09IGR2bWFlc2MxKSB7CiAJCQl1MzIgZW5kID0gUEFHRV9BTElHTihhZGRyICsgZG1hX2NvdW50ICsgMTZVKTsKIAkJCWRtYV93cml0ZTMyKGVuZCAtIGFkZHIsIERNQV9DT1VOVCk7CiAJCX0KQEAgLTQ3NiwxMCArNDg2LDggQEAKIAkuZG1hX2Vycm9yCT0Jc2J1c19lc3BfZG1hX2Vycm9yLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfcHJvYmVfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IHNidXNfZGV2ICplc3BfZGV2LAotCQkJCQlzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSwKLQkJCQkJc3RydWN0IHNidXNfYnVzICpzYnVzLAorc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfcHJvYmVfb25lKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCQlzdHJ1Y3Qgb2ZfZGV2aWNlICplc3BkbWEsCiAJCQkJCWludCBobWUpCiB7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCA9ICZzY3NpX2VzcF90ZW1wbGF0ZTsKQEAgLTQ5NywxMyArNTA1LDEzIEBACiAJZXNwID0gc2hvc3RfcHJpdihob3N0KTsKIAogCWVzcC0+aG9zdCA9IGhvc3Q7Ci0JZXNwLT5kZXYgPSBlc3BfZGV2OworCWVzcC0+ZGV2ID0gb3A7CiAJZXNwLT5vcHMgPSAmc2J1c19lc3Bfb3BzOwogCiAJaWYgKGhtZSkKIAkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19XSURFX0NBUEFCTEU7CiAKLQllcnIgPSBlc3Bfc2J1c19maW5kX2RtYShlc3AsIGVzcGRtYSk7CisJZXJyID0gZXNwX3NidXNfc2V0dXBfZG1hKGVzcCwgZXNwZG1hKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsX3VubGluazsKIApAQCAtNTI1LDE1ICs1MzMsMTUgQEAKIAkgKiBjb21lIHVwIHdpdGggdGhlIHJlc2V0IGJpdCBzZXQsIHNvIG1ha2Ugc3VyZSB0aGF0CiAJICogaXMgY2xlYXIgZmlyc3QuCiAJICovCi0JaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgeworCWlmIChlc3AtPmRtYXJldiA9PSBkdm1hZXNjMSkgewogCQl1MzIgdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKIAogCQlkbWFfd3JpdGUzMih2YWwgJiB+RE1BX1JTVF9TQ1NJLCBETUFfQ1NSKTsKIAl9CiAKLQlkZXZfc2V0X2RydmRhdGEoJmVzcF9kZXYtPm9mZGV2LmRldiwgZXNwKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGVzcCk7CiAKLQllcnIgPSBzY3NpX2VzcF9yZWdpc3Rlcihlc3AsIGRldik7CisJZXJyID0gc2NzaV9lc3BfcmVnaXN0ZXIoZXNwLCAmb3AtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsX2ZyZWVfaXJxOwogCkBAIC01NDIsNDEgKzU1MCw0NiBAQAogZmFpbF9mcmVlX2lycToKIAlmcmVlX2lycShob3N0LT5pcnEsIGVzcCk7CiBmYWlsX3VubWFwX2NvbW1hbmRfYmxvY2s6Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQoZXNwLT5kZXYsIDE2LAotCQkJICAgICBlc3AtPmNvbW1hbmRfYmxvY2ssCi0JCQkgICAgIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEpOworCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LCAxNiwKKwkJCSAgZXNwLT5jb21tYW5kX2Jsb2NrLAorCQkJICBlc3AtPmNvbW1hbmRfYmxvY2tfZG1hKTsKIGZhaWxfdW5tYXBfcmVnczoKLQlzYnVzX2lvdW5tYXAoZXNwLT5yZWdzLCBTQlVTX0VTUF9SRUdfU0laRSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWyhobWUgPyAxIDogMCldLCBlc3AtPnJlZ3MsIFNCVVNfRVNQX1JFR19TSVpFKTsKIGZhaWxfdW5saW5rOgogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CiBmYWlsOgogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVzcF9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlc3Bfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGV2LT5ub2RlOwotCXN0cnVjdCBzYnVzX2RldiAqZG1hX3NkZXYgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG1hX25vZGUgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkbWFfb2YgPSBOVUxMOwogCWludCBobWUgPSAwOwogCiAJaWYgKGRwLT5wYXJlbnQgJiYKIAkgICAgKCFzdHJjbXAoZHAtPnBhcmVudC0+bmFtZSwgImVzcGRtYSIpIHx8CiAJICAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJkbWEiKSkpCi0JCWRtYV9zZGV2ID0gc2Rldi0+cGFyZW50OworCQlkbWFfbm9kZSA9IGRwLT5wYXJlbnQ7CiAJZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgIlNVTlcsZmFzIikpIHsKLQkJZG1hX3NkZXYgPSBzZGV2OworCQlkbWFfbm9kZSA9IG9wLT5ub2RlOwogCQlobWUgPSAxOwogCX0KKwlpZiAoZG1hX25vZGUpCisJCWRtYV9vZiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoZG1hX25vZGUpOworCWlmICghZG1hX29mKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBlc3Bfc2J1c19wcm9iZV9vbmUoJmRldi0+ZGV2LCBzZGV2LCBkbWFfc2RldiwKLQkJCQkgIHNkZXYtPmJ1cywgaG1lKTsKKwlyZXR1cm4gZXNwX3NidXNfcHJvYmVfb25lKG9wLCBkbWFfb2YsIGhtZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGVzcF9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBlc3Bfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGVzcCAqZXNwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGVzcCAqZXNwID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkbWFfb2YgPSBlc3AtPmRtYTsKIAl1bnNpZ25lZCBpbnQgaXJxID0gZXNwLT5ob3N0LT5pcnE7CisJYm9vbCBpc19obWU7CiAJdTMyIHZhbDsKIAogCXNjc2lfZXNwX3VucmVnaXN0ZXIoZXNwKTsKQEAgLTU4NiwxNyArNTk5LDI1IEBACiAJZG1hX3dyaXRlMzIodmFsICYgfkRNQV9JTlRfRU5BQiwgRE1BX0NTUik7CiAKIAlmcmVlX2lycShpcnEsIGVzcCk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQoZXNwLT5kZXYsIDE2LAotCQkJICAgICBlc3AtPmNvbW1hbmRfYmxvY2ssCi0JCQkgICAgIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEpOwotCXNidXNfaW91bm1hcChlc3AtPnJlZ3MsIFNCVVNfRVNQX1JFR19TSVpFKTsKKworCWlzX2htZSA9IChlc3AtPmRtYXJldiA9PSBkdm1haG1lKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LCAxNiwKKwkJCSAgZXNwLT5jb21tYW5kX2Jsb2NrLAorCQkJICBlc3AtPmNvbW1hbmRfYmxvY2tfZG1hKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbKGlzX2htZSA/IDEgOiAwKV0sIGVzcC0+cmVncywKKwkJICAgU0JVU19FU1BfUkVHX1NJWkUpOworCW9mX2lvdW5tYXAoJmRtYV9vZi0+cmVzb3VyY2VbMF0sIGVzcC0+ZG1hX3JlZ3MsCisJCSAgIHJlc291cmNlX3NpemUoJmRtYV9vZi0+cmVzb3VyY2VbMF0pKTsKIAogCXNjc2lfaG9zdF9wdXQoZXNwLT5ob3N0KTsKIAorCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZXNwX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlc3BfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gIlNVTlcsZXNwIiwKIAl9LApAQCAtNjE5LDcgKzY0MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHN1bmVzcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3VuZXNwX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMKaW5kZXggZDM5MTA3Yi4uZjRlNmNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMKQEAgLTUxOSw4ICs1MTksOCBAQAogCSAqICBTaG9ydGVuIG91ciBzZXR0bGVfdGltZSBpZiBuZWVkZWQgZm9yIAogCSAqICB0aGlzIGNvbW1hbmQgbm90IHRvIHRpbWUgb3V0LgogCSAqLwotCWlmIChucC0+cy5zZXR0bGVfdGltZV92YWxpZCAmJiBjbWQtPnRpbWVvdXRfcGVyX2NvbW1hbmQpIHsKLQkJdW5zaWduZWQgbG9uZyB0bGltaXQgPSBqaWZmaWVzICsgY21kLT50aW1lb3V0X3Blcl9jb21tYW5kOworCWlmIChucC0+cy5zZXR0bGVfdGltZV92YWxpZCAmJiBjbWQtPnJlcXVlc3QtPnRpbWVvdXQpIHsKKwkJdW5zaWduZWQgbG9uZyB0bGltaXQgPSBqaWZmaWVzICsgY21kLT5yZXF1ZXN0LT50aW1lb3V0OwogCQl0bGltaXQgLT0gU1lNX0NPTkZfVElNRVJfSU5URVJWQUwqMjsKIAkJaWYgKHRpbWVfYWZ0ZXIobnAtPnMuc2V0dGxlX3RpbWUsIHRsaW1pdCkpIHsKIAkJCW5wLT5zLnNldHRsZV90aW1lID0gdGxpbWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYyBiL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMKaW5kZXggMTcyM2Q3MS4uNjlhYzZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYworKysgYi9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCkBAIC0yNTczLDggKzI1NzMsOCBAQAogc3RhdGljIGludCBfX2luaXQgZGMzOTBfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpZiAoIWRpc2FibGVfY2x1c3RlcmluZykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IGNsdXN0ZXJpbmcgbm93IGVuYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IGdldCBwcm9ibGVtcyBsb2FkXG4iCi0JCSAgICAgICAiXHR3aXRoIFwiZGlzYWJsZV9jbHVzdGVyaW5nPTFcIiBhbmQgcmVwb3J0IHRvIG1haW50YWluZXJzXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiREMzOTA6IGNsdXN0ZXJpbmcgbm93IGVuYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IGdldCBwcm9ibGVtcyBsb2FkXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgIHdpdGggXCJkaXNhYmxlX2NsdXN0ZXJpbmc9MVwiIGFuZCByZXBvcnQgdG8gbWFpbnRhaW5lcnNcbiIpOwogCiAJaWYgKHRtc2NzaW1bMF0gPT0gLTEgfHwgdG1zY3NpbVswXSA+IDE1KSB7CiAJCXRtc2NzaW1bMF0gPSA3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IDljY2M1NjMuLjE1MjhkZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTQ0LDYgKzQ0LDEwIEBACiAKICNpbmNsdWRlICI4MjUwLmgiCiAKKyNpZmRlZiBDT05GSUdfU1BBUkMKKyNpbmNsdWRlICJzdW5jb3JlLmgiCisjZW5kaWYKKwogLyoKICAqIENvbmZpZ3VyYXRpb246CiAgKiAgIHNoYXJlX2lycXMgLSB3aGV0aGVyIHdlIHBhc3MgSVJRRl9TSEFSRUQgdG8gcmVxdWVzdF9pcnEoKS4gIFRoaXMgb3B0aW9uCkBAIC01Myw2ICs1NywxMyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX3VhcnRzID0gQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM7CiAKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2VyaWFsODI1MF9yZWc7CisKK3N0YXRpYyBpbnQgc2VyaWFsX2luZGV4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIChzZXJpYWw4MjUwX3JlZy5taW5vciAtIDY0KSArIHBvcnQtPmxpbmU7Cit9CisKIC8qCiAgKiBEZWJ1Z2dpbmcuCiAgKi8KQEAgLTUzNiw3ICs1NDcsNyBAQAogLyoKICAqIEZJRk8gc3VwcG9ydC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNlcmlhbDgyNTBfY2xlYXJfZmlmb3Moc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQorc3RhdGljIHZvaWQgc2VyaWFsODI1MF9jbGVhcl9maWZvcyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7CiAJaWYgKHAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0ZJRk8pIHsKIAkJc2VyaWFsX291dHAocCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0VOQUJMRV9GSUZPKTsKQEAgLTU1MSw3ICs1NjIsNyBAQAogICogY2FwYWJpbGl0eSIgYml0IGVuYWJsZWQuICBOb3RlIHRoYXQgb24gWFIxNkM4NTBzLCB3ZSBuZWVkIHRvCiAgKiByZXNldCBMQ1IgdG8gd3JpdGUgdG8gSUVSLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VyaWFsODI1MF9zZXRfc2xlZXAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwLCBpbnQgc2xlZXApCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3NldF9zbGVlcChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnAsIGludCBzbGVlcCkKIHsKIAlpZiAocC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9DQVBfU0xFRVApIHsKIAkJaWYgKHAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0VGUikgewpAQCAtOTkzLDcgKzEwMDQsNyBAQAogCQlyZXR1cm47CiAKIAlERUJVR19BVVRPQ09ORigidHR5UyVkOiBhdXRvY29uZiAoMHglMDR4LCAweCVwKTogIiwKLQkJCXVwLT5wb3J0LmxpbmUsIHVwLT5wb3J0LmlvYmFzZSwgdXAtPnBvcnQubWVtYmFzZSk7CisJCSAgICAgICBzZXJpYWxfaW5kZXgoJnVwLT5wb3J0KSwgdXAtPnBvcnQuaW9iYXNlLCB1cC0+cG9ydC5tZW1iYXNlKTsKIAogCS8qCiAJICogV2UgcmVhbGx5IGRvIG5lZWQgZ2xvYmFsIElSUXMgZGlzYWJsZWQgaGVyZSAtIHdlJ3JlIGdvaW5nIHRvCkBAIC0xMTI4LDggKzExMzksOCBAQAogCWlmICh1cC0+Y2FwYWJpbGl0aWVzICE9IHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5cGVdLmZsYWdzKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ0dHlTJWQ6IGRldGVjdGVkIGNhcHMgJTA4eCBzaG91bGQgYmUgJTA4eFxuIiwKLQkJCXVwLT5wb3J0LmxpbmUsIHVwLT5jYXBhYmlsaXRpZXMsCi0JCQl1YXJ0X2NvbmZpZ1t1cC0+cG9ydC50eXBlXS5mbGFncyk7CisJCSAgICAgICBzZXJpYWxfaW5kZXgoJnVwLT5wb3J0KSwgdXAtPmNhcGFiaWxpdGllcywKKwkJICAgICAgIHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5cGVdLmZsYWdzKTsKIAl9CiAKIAl1cC0+cG9ydC5maWZvc2l6ZSA9IHVhcnRfY29uZmlnW3VwLT5wb3J0LnR5cGVdLmZpZm9fc2l6ZTsKQEAgLTE0MjQsOCArMTQzNSw3IEBACiAvKgogICogVGhpcyBoYW5kbGVzIHRoZSBpbnRlcnJ1cHQgZnJvbSBvbmUgcG9ydC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1zZXJpYWw4MjUwX2hhbmRsZV9wb3J0KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCitzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX2hhbmRsZV9wb3J0KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTcxOSw3ICsxNzI5LDcgQEAKIC8qCiAgKglXYWl0IGZvciB0cmFuc21pdHRlciAmIGhvbGRpbmcgcmVnaXN0ZXIgdG8gZW1wdHkKICAqLwotc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX3htaXRyKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAsIGludCBiaXRzKQorc3RhdGljIHZvaWQgd2FpdF9mb3JfeG1pdHIoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCwgaW50IGJpdHMpCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1cywgdG1vdXQgPSAxMDAwMDsKIApAQCAtMTg1NCw3ICsxODY0LDggQEAKIAkgKi8KIAlpZiAoISh1cC0+cG9ydC5mbGFncyAmIFVQRl9CVUdHWV9VQVJUKSAmJgogCSAgICAoc2VyaWFsX2lucCh1cCwgVUFSVF9MU1IpID09IDB4ZmYpKSB7Ci0JCXByaW50aygidHR5UyVkOiBMU1Igc2FmZXR5IGNoZWNrIGVuZ2FnZWQhXG4iLCB1cC0+cG9ydC5saW5lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHR5UyVkOiBMU1Igc2FmZXR5IGNoZWNrIGVuZ2FnZWQhXG4iLAorCQkgICAgICAgc2VyaWFsX2luZGV4KCZ1cC0+cG9ydCkpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE5MDksNyArMTkyMCw4IEBACiAJCSAqLwogCQlpZiAoIShpaXIxICYgVUFSVF9JSVJfTk9fSU5UKSAmJiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKSkgewogCQkJdXAtPmJ1Z3MgfD0gVUFSVF9CVUdfVEhSRTsKLQkJCXByX2RlYnVnKCJ0dHlTJWQgLSB1c2luZyBiYWNrdXAgdGltZXJcbiIsIHBvcnQtPmxpbmUpOworCQkJcHJfZGVidWcoInR0eVMlZCAtIHVzaW5nIGJhY2t1cCB0aW1lclxuIiwKKwkJCQkgc2VyaWFsX2luZGV4KHBvcnQpKTsKIAkJfQogCX0KIApAQCAtMTk2OSw3ICsxOTgxLDcgQEAKIAkJaWYgKCEodXAtPmJ1Z3MgJiBVQVJUX0JVR19UWEVOKSkgewogCQkJdXAtPmJ1Z3MgfD0gVUFSVF9CVUdfVFhFTjsKIAkJCXByX2RlYnVnKCJ0dHlTJWQgLSBlbmFibGluZyBiYWQgdHggc3RhdHVzIHdvcmthcm91bmRzXG4iLAotCQkJCSBwb3J0LT5saW5lKTsKKwkJCQkgc2VyaWFsX2luZGV4KHBvcnQpKTsKIAkJfQogCX0gZWxzZSB7CiAJCXVwLT5idWdzICY9IH5VQVJUX0JVR19UWEVOOwpAQCAtMjIxMSw5ICsyMjIzLDkgQEAKIAkJc2VyaWFsX291dHAodXAsIFVBUlRfRUZSLCBlZnIpOwogCX0KIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUAogCS8qIFdvcmthcm91bmQgdG8gZW5hYmxlIDExNTIwMCBiYXVkIG9uIE9NQVAxNTEwIGludGVybmFsIHBvcnRzICovCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpICYmIGlzX29tYXBfcG9ydCgodW5zaWduZWQgaW50KXVwLT5wb3J0Lm1lbWJhc2UpKSB7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpICYmIGlzX29tYXBfcG9ydCh1cCkpIHsKIAkJaWYgKGJhdWQgPT0gMTE1MjAwKSB7CiAJCQlxdW90ID0gMTsKIAkJCXNlcmlhbF9vdXQodXAsIFVBUlRfT01BUF9PU0NfMTJNX1NFTCwgMSk7CkBAIC0yMjY2LDE4ICsyMjc4LDI3IEBACiAJCXAtPnBtKHBvcnQsIHN0YXRlLCBvbGRzdGF0ZSk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF9wb3J0X3NpemUoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwdCkKK3sKKwlpZiAocHQtPnBvcnQuaW90eXBlID09IFVQSU9fQVUpCisJCXJldHVybiAweDEwMDAwMDsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQCisJaWYgKGlzX29tYXBfcG9ydChwdCkpCisJCXJldHVybiAweDE2IDw8IHB0LT5wb3J0LnJlZ3NoaWZ0OworI2VuZGlmCisJcmV0dXJuIDggPDwgcHQtPnBvcnQucmVnc2hpZnQ7Cit9CisKIC8qCiAgKiBSZXNvdXJjZSBoYW5kbGluZy4KICAqLwogc3RhdGljIGludCBzZXJpYWw4MjUwX3JlcXVlc3Rfc3RkX3Jlc291cmNlKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCiB7Ci0JdW5zaWduZWQgaW50IHNpemUgPSA4IDw8IHVwLT5wb3J0LnJlZ3NoaWZ0OworCXVuc2lnbmVkIGludCBzaXplID0gc2VyaWFsODI1MF9wb3J0X3NpemUodXApOwogCWludCByZXQgPSAwOwogCiAJc3dpdGNoICh1cC0+cG9ydC5pb3R5cGUpIHsKIAljYXNlIFVQSU9fQVU6Ci0JCXNpemUgPSAweDEwMDAwMDsKLQkJLyogZmFsbCB0aHJ1ICovCiAJY2FzZSBVUElPX1RTSToKIAljYXNlIFVQSU9fTUVNMzI6CiAJY2FzZSBVUElPX01FTToKQEAgLTIzMTEsMTIgKzIzMzIsMTAgQEAKIAogc3RhdGljIHZvaWQgc2VyaWFsODI1MF9yZWxlYXNlX3N0ZF9yZXNvdXJjZShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewotCXVuc2lnbmVkIGludCBzaXplID0gOCA8PCB1cC0+cG9ydC5yZWdzaGlmdDsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNlcmlhbDgyNTBfcG9ydF9zaXplKHVwKTsKIAogCXN3aXRjaCAodXAtPnBvcnQuaW90eXBlKSB7CiAJY2FzZSBVUElPX0FVOgotCQlzaXplID0gMHgxMDAwMDA7Ci0JCS8qIGZhbGwgdGhydSAqLwogCWNhc2UgVVBJT19UU0k6CiAJY2FzZSBVUElPX01FTTMyOgogCWNhc2UgVVBJT19NRU06CkBAIC0yNjMwLDcgKzI2NDksNiBAQAogCXJldHVybiBzZXJpYWw4MjUwX2ZpbmRfcG9ydF9mb3JfZWFybHljb24oKTsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzZXJpYWw4MjUwX3JlZzsKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJpYWw4MjUwX2NvbnNvbGUgPSB7CiAJLm5hbWUJCT0gInR0eVMiLAogCS53cml0ZQkJPSBzZXJpYWw4MjUwX2NvbnNvbGVfd3JpdGUsCkBAIC0yNjc3LDcgKzI2OTUsNiBAQAogCS5kZXZfbmFtZQkJPSAidHR5UyIsCiAJLm1ham9yCQkJPSBUVFlfTUFKT1IsCiAJLm1pbm9yCQkJPSA2NCwKLQkubnIJCQk9IFVBUlRfTlIsCiAJLmNvbnMJCQk9IFNFUklBTDgyNTBfQ09OU09MRSwKIH07CiAKQEAgLTI5NjIsNyArMjk3OSwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspCiAJCXNwaW5fbG9ja19pbml0KCZpcnFfbGlzdHNbaV0ubG9jayk7CiAKKyNpZmRlZiBDT05GSUdfU1BBUkMKKwlyZXQgPSBzdW5zZXJpYWxfcmVnaXN0ZXJfbWlub3JzKCZzZXJpYWw4MjUwX3JlZywgVUFSVF9OUik7CisjZWxzZQorCXNlcmlhbDgyNTBfcmVnLm5yID0gVUFSVF9OUjsKIAlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2VyaWFsODI1MF9yZWcpOworI2VuZGlmCiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTI5ODcsNyArMzAwOSwxMSBAQAogIHB1dF9kZXY6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChzZXJpYWw4MjUwX2lzYV9kZXZzKTsKICB1bnJlZ191YXJ0X2RydjoKKyNpZmRlZiBDT05GSUdfU1BBUkMKKwlzdW5zZXJpYWxfdW5yZWdpc3Rlcl9taW5vcnMoJnNlcmlhbDgyNTBfcmVnLCBVQVJUX05SKTsKKyNlbHNlCiAJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmc2VyaWFsODI1MF9yZWcpOworI2VuZGlmCiAgb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0zMDA2LDcgKzMwMzIsMTEgQEAKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2VyaWFsODI1MF9pc2FfZHJpdmVyKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihpc2FfZGV2KTsKIAorI2lmZGVmIENPTkZJR19TUEFSQworCXN1bnNlcmlhbF91bnJlZ2lzdGVyX21pbm9ycygmc2VyaWFsODI1MF9yZWcsIFVBUlRfTlIpOworI2Vsc2UKIAl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWw4MjUwX3JlZyk7CisjZW5kaWYKIH0KIAogbW9kdWxlX2luaXQoc2VyaWFsODI1MF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCmluZGV4IGMyZjIzOTMuLmMwMTRmZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKQEAgLTIwNDEsOSArMjA0MSw5IEBACiAJCSAqIFRoZSBkZXZpY2UgbWF5IGhhdmUgYmVlbiBkaXNhYmxlZC4gIFJlLWVuYWJsZSBpdC4KIAkJICovCiAJCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJCS8qIEZJWE1FOiBXZSBjYW5ub3Qgc2ltcGx5IGVycm9yIG91dCBoZXJlICovCiAJCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCisJCQlwcmludGsoS0VSTl9FUlIgInBjaXNlcmlhbDogVW5hYmxlIHRvIHJlLWVuYWJsZSBwb3J0cywgdHJ5aW5nIHRvIGNvbnRpbnVlLlxuIik7CiAJCXBjaXNlcmlhbF9yZXN1bWVfcG9ydHMocHJpdik7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggNzdjYjM0Mi4uZGI3ODNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC05LDcgKzksNiBAQAogIyBUaGUgbmV3IDgyNTAvMTY1NTAgc2VyaWFsIGRyaXZlcnMKIGNvbmZpZyBTRVJJQUxfODI1MAogCXRyaXN0YXRlICI4MjUwLzE2NTUwIGFuZCBjb21wYXRpYmxlIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gKEJST0tFTiB8fCAhU1BBUkMpCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAJLS0taGVscC0tLQogCSAgVGhpcyBzZWxlY3RzIHdoZXRoZXIgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQKQEAgLTk5NCwyNCArOTkzLDEyIEBACiAJYm9vbCAiU3VwcG9ydCBSVFMvQ1RTIG9uIDY4MzI4IHNlcmlhbCBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMXzY4MzI4CiAKLWNvbmZpZyBTRVJJQUxfQ09MREZJUkUKLQlib29sICJDb2xkRmlyZSBzZXJpYWwgc3VwcG9ydCAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBDT0xERklSRQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBidWlsdC1pbiBzZXJpYWwgcG9ydHMgb2YgdGhlIE1vdG9yb2xhIENvbGRGaXJlCi0JICBmYW1pbHkgb2YgQ1BVcy4KLQkgIFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdCBzdXBwb3J0cyBvbmx5IHRoZSBvbGQgaW50ZXJmYWNlCi0JICBmb3Igc2VyaWFsIGRyaXZlcnMgYW5kIGZlYXR1cmVzIGxpa2UgbWFnaWMga2V5cyBhcmUgbm90IHdvcmtpbmcuCi0JICBQbGVhc2Ugc3dpdGNoIHRvIHRoZSBuZXcgc3R5bGUgZHJpdmVyIGJlY2F1c2UgdGhpcyBkcml2ZXIgd2lsbCBiZQotCSAgcmVtb3ZlZCBzb29uLgotCiBjb25maWcgU0VSSUFMX01DRgotCWJvb2wgIkNvbGRmaXJlIHNlcmlhbCBzdXBwb3J0IChuZXcgc3R5bGUgZHJpdmVyKSIKKwlib29sICJDb2xkZmlyZSBzZXJpYWwgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENPTERGSVJFCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAJaGVscAotCSAgVGhpcyBuZXcgc2VyaWFsIGRyaXZlciBzdXBwb3J0cyB0aGUgRnJlZXNjYWxlIENvbGRmaXJlIHNlcmlhbCBwb3J0cwotCSAgdXNpbmcgdGhlIG5ldyBzZXJpYWwgZHJpdmVyIHN1YnN5c3RlbS4KKwkgIFRoaXMgc2VyaWFsIGRyaXZlciBzdXBwb3J0cyB0aGUgRnJlZXNjYWxlIENvbGRmaXJlIHNlcmlhbCBwb3J0cy4KIAogY29uZmlnIFNFUklBTF9NQ0ZfQkFVRFJBVEUKIAlpbnQgIkRlZmF1bHQgYmF1ZHJhdGUgZm9yIENvbGRmaXJlIHNlcmlhbCBwb3J0cyIKQEAgLTExMzYsNDIgKzExMjMsNiBAQAogCSAgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZQogCSAga2VybmVsIGF0IGJvb3QgdGltZS4pCiAKLWNvbmZpZyBTRVJJQUxfQ1BNX1NDQzEKLQlib29sICJTdXBwb3J0IGZvciBTQ0MxIHNlcmlhbCBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTQ0MxIGFzIGEgc2VyaWFsIHBvcnQKLQotY29uZmlnIFNFUklBTF9DUE1fU0NDMgotCWJvb2wgIlN1cHBvcnQgZm9yIFNDQzIgc2VyaWFsIHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNDQzIgYXMgYSBzZXJpYWwgcG9ydAotCi1jb25maWcgU0VSSUFMX0NQTV9TQ0MzCi0JYm9vbCAiU3VwcG9ydCBmb3IgU0NDMyBzZXJpYWwgcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU0NDMyBhcyBhIHNlcmlhbCBwb3J0Ci0KLWNvbmZpZyBTRVJJQUxfQ1BNX1NDQzQKLQlib29sICJTdXBwb3J0IGZvciBTQ0M0IHNlcmlhbCBwb3J0IgotCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTQ0M0IGFzIGEgc2VyaWFsIHBvcnQKLQotY29uZmlnIFNFUklBTF9DUE1fU01DMQotCWJvb2wgIlN1cHBvcnQgZm9yIFNNQzEgc2VyaWFsIHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNNQzEgYXMgYSBzZXJpYWwgcG9ydAotCi1jb25maWcgU0VSSUFMX0NQTV9TTUMyCi0JYm9vbCAiU3VwcG9ydCBmb3IgU01DMiBzZXJpYWwgcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU01DMiBhcyBhIHNlcmlhbCBwb3J0Ci0KIGNvbmZpZyBTRVJJQUxfU0dJX0wxX0NPTlNPTEUKIAlib29sICJTR0kgQWx0aXggTDEgc2VyaWFsIGNvbnNvbGUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElBNjRfR0VORVJJQyB8fCBJQTY0X1NHSV9TTjIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggN2U3MzgzZS4uMGMxN2M4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTQsNiArNCwxNiBAQAogCiBvYmotJChDT05GSUdfU0VSSUFMX0NPUkUpICs9IHNlcmlhbF9jb3JlLm8KIG9iai0kKENPTkZJR19TRVJJQUxfMjEyODUpICs9IDIxMjg1Lm8KKworIyBUaGVzZSBTcGFyYyBkcml2ZXJzIGhhdmUgdG8gYXBwZWFyIGJlZm9yZSBvdGhlcnMgc3VjaCBhcyA4MjUwCisjIHdoaWNoIHNoYXJlIHR0eVN4IG1pbm9yIG5vZGUgc3BhY2UuICBPdGhlcndpc2UgY29uc29sZSBkZXZpY2UKKyMgbmFtZXMgY2hhbmdlIGFuZCBvdGhlciB1bnBsZXNhbnRyaWVzLgorb2JqLSQoQ09ORklHX1NFUklBTF9TVU5DT1JFKSArPSBzdW5jb3JlLm8KK29iai0kKENPTkZJR19TRVJJQUxfU1VOSFYpICs9IHN1bmh2Lm8KK29iai0kKENPTkZJR19TRVJJQUxfU1VOWklMT0cpICs9IHN1bnppbG9nLm8KK29iai0kKENPTkZJR19TRVJJQUxfU1VOU1UpICs9IHN1bnN1Lm8KK29iai0kKENPTkZJR19TRVJJQUxfU1VOU0FCKSArPSBzdW5zYWIubworCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTApICs9IDgyNTAubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX1BOUCkgKz0gODI1MF9wbnAubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0dTQykgKz0gODI1MF9nc2MubwpAQCAtMzEsMTYgKzQxLDEwIEBACiBvYmotJChDT05GSUdfU0VSSUFMX1MzQzI0MTApICs9IHMzYzI0MTAubwogb2JqLSQoQ09ORklHX1NFUklBTF9TM0MyNDEyKSArPSBzM2MyNDEyLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUzNDMjQ0MCkgKz0gczNjMjQ0MC5vCi1vYmotJChDT05GSUdfU0VSSUFMX1NVTkNPUkUpICs9IHN1bmNvcmUubwotb2JqLSQoQ09ORklHX1NFUklBTF9TVU5IVikgKz0gc3VuaHYubwotb2JqLSQoQ09ORklHX1NFUklBTF9TVU5aSUxPRykgKz0gc3Vuemlsb2cubwogb2JqLSQoQ09ORklHX1NFUklBTF9JUDIyX1pJTE9HKSArPSBpcDIyemlsb2cubwotb2JqLSQoQ09ORklHX1NFUklBTF9TVU5TVSkgKz0gc3Vuc3Uubwotb2JqLSQoQ09ORklHX1NFUklBTF9TVU5TQUIpICs9IHN1bnNhYi5vCiBvYmotJChDT05GSUdfU0VSSUFMX01VWCkgKz0gbXV4Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfNjgzMjgpICs9IDY4MzI4c2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfNjgzNjApICs9IDY4MzYwc2VyaWFsLm8KLW9iai0kKENPTkZJR19TRVJJQUxfQ09MREZJUkUpICs9IG1jZnNlcmlhbC5vCiBvYmotJChDT05GSUdfU0VSSUFMX01DRikgKz0gbWNmLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUE1BQ1pJTE9HKSArPSBwbWFjX3ppbG9nLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTEg3QTQwWCkgKz0gc2VyaWFsX2xoN2E0MHgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwppbmRleCAzYTZkYTgwLi42MWZiOGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTMxLDcgKzEzMSw4IEBACiBzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0IHsKIAlzdHJ1Y3QgdWFydF9wb3J0CXVhcnQ7CQkvKiB1YXJ0ICovCiAJc3RydWN0IGNsawkJKmNsazsJCS8qIHVhcnQgY2xvY2sgKi8KLQl1bnNpZ25lZCBzaG9ydAkJc3VzcGVuZGVkOwkvKiBpcyBwb3J0IHN1c3BlbmRlZD8gKi8KKwlpbnQJCQltYXlfd2FrZXVwOwkvKiBjYWNoZWQgdmFsdWUgb2YgZGV2aWNlX21heV93YWtldXAgZm9yIHRpbWVzIHdlIG5lZWQgdG8gZGlzYWJsZSBpdCAqLworCXUzMgkJCWJhY2t1cF9pbXI7CS8qIElNUiBzYXZlZCBkdXJpbmcgc3VzcGVuZCAqLwogCWludAkJCWJyZWFrX2FjdGl2ZTsJLyogYnJlYWsgYmVpbmcgcmVjZWl2ZWQgKi8KIAogCXNob3J0CQkJdXNlX2RtYV9yeDsJLyogZW5hYmxlIFBEQyByZWNlaXZlciAqLwpAQCAtOTg0LDggKzk4NSwxNSBAQAogCQkgKiBUaGlzIGlzIGNhbGxlZCBvbiB1YXJ0X29wZW4oKSBvciBhIHJlc3VtZSBldmVudC4KIAkJICovCiAJCWNsa19lbmFibGUoYXRtZWxfcG9ydC0+Y2xrKTsKKworCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiB3ZSBkaXNhYmxlZCBzb21lIG9uIHN1c3BlbmQgKi8KKwkJVUFSVF9QVVRfSUVSKHBvcnQsIGF0bWVsX3BvcnQtPmJhY2t1cF9pbXIpOwogCQlicmVhazsKIAljYXNlIDM6CisJCS8qIEJhY2sgdXAgdGhlIGludGVycnVwdCBtYXNrIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCWF0bWVsX3BvcnQtPmJhY2t1cF9pbXIgPSBVQVJUX0dFVF9JTVIocG9ydCk7CisJCVVBUlRfUFVUX0lEUihwb3J0LCAtMSk7CisKIAkJLyoKIAkJICogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayBmb3IgdGhpcyBzZXJpYWwgcG9ydC4KIAkJICogVGhpcyBpcyBjYWxsZWQgb24gdWFydF9jbG9zZSgpIG9yIGEgc3VzcGVuZCBldmVudC4KQEAgLTE0NzUsMTMgKzE0ODMsMTIgQEAKIAkJCWNwdV9yZWxheCgpOwogCX0KIAotCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KQotCSAgICAmJiAhYXRtZWxfc2VyaWFsX2Nsa193aWxsX3N0b3AoKSkKLQkJZW5hYmxlX2lycV93YWtlKHBvcnQtPmlycSk7Ci0JZWxzZSB7Ci0JCXVhcnRfc3VzcGVuZF9wb3J0KCZhdG1lbF91YXJ0LCBwb3J0KTsKLQkJYXRtZWxfcG9ydC0+c3VzcGVuZGVkID0gMTsKLQl9CisJLyogd2UgY2FuIG5vdCB3YWtlIHVwIGlmIHdlJ3JlIHJ1bm5pbmcgb24gc2xvdyBjbG9jayAqLworCWF0bWVsX3BvcnQtPm1heV93YWtldXAgPSBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KTsKKwlpZiAoYXRtZWxfc2VyaWFsX2Nsa193aWxsX3N0b3AoKSkKKwkJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZwZGV2LT5kZXYsIDApOworCisJdWFydF9zdXNwZW5kX3BvcnQoJmF0bWVsX3VhcnQsIHBvcnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDkxLDExICsxNDk4LDggQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKIAotCWlmIChhdG1lbF9wb3J0LT5zdXNwZW5kZWQpIHsKLQkJdWFydF9yZXN1bWVfcG9ydCgmYXRtZWxfdWFydCwgcG9ydCk7Ci0JCWF0bWVsX3BvcnQtPnN1c3BlbmRlZCA9IDA7Ci0JfSBlbHNlCi0JCWRpc2FibGVfaXJxX3dha2UocG9ydC0+aXJxKTsKKwl1YXJ0X3Jlc3VtZV9wb3J0KCZhdG1lbF91YXJ0LCBwb3J0KTsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJnBkZXYtPmRldiwgYXRtZWxfcG9ydC0+bWF5X3dha2V1cCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MTMsNiArMTUxNyw4IEBACiAJQlVJTERfQlVHX09OKCFpc19wb3dlcl9vZl8yKEFUTUVMX1NFUklBTF9SSU5HU0laRSkpOwogCiAJcG9ydCA9ICZhdG1lbF9wb3J0c1twZGV2LT5pZF07CisJcG9ydC0+YmFja3VwX2ltciA9IDA7CisKIAlhdG1lbF9pbml0X3BvcnQocG9ydCwgcGRldik7CiAKIAlpZiAoIWF0bWVsX3VzZV9kbWFfcngoJnBvcnQtPnVhcnQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jIGIvZHJpdmVycy9zZXJpYWwvYmZpbl81eHguYwppbmRleCA0YTBkMzBiLi41NjlmMGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogQmxhY2tmaW4gT24tQ2hpcCBTZXJpYWwgRHJpdmVyCiAgKgotICogQ29weXJpZ2h0IDIwMDYtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KICAqCkBAIC00Miw2ICs0Miw5IEBACiAjZGVmaW5lIEJGSU5fU0VSSUFMX01BSk9SCTIwNAogI2RlZmluZSBCRklOX1NFUklBTF9NSU5PUgk2NAogCitzdGF0aWMgc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgYmZpbl9zZXJpYWxfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKK3N0YXRpYyBpbnQgbnJfYWN0aXZlX3BvcnRzID0gQVJSQVlfU0laRShiZmluX3NlcmlhbF9yZXNvdXJjZSk7CisKIC8qCiAgKiBTZXR1cCBmb3IgY29uc29sZS4gQXJndW1lbnQgY29tZXMgZnJvbSB0aGUgbWVudWNvbmZpZwogICovCkBAIC0xMjYsMTMgKzEyOSwxMyBAQAogdm9pZCBrZ2RiX3B1dF9kZWJ1Z19jaGFyKGludCBjaHIpCiB7CiAJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQ7Ci0JCisKIAlpZiAoQ09ORklHX0tHREJfVUFSVF9QT1JUIDwgMAogCQl8fCBDT05GSUdfS0dEQl9VQVJUX1BPUlQgPj0gQkZJTl9VQVJUX05SX1BPUlRTKQogCQl1YXJ0ID0gJmJmaW5fc2VyaWFsX3BvcnRzWzBdOwogCWVsc2UKIAkJdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1tDT05GSUdfS0dEQl9VQVJUX1BPUlRdOwotCQorCiAJd2hpbGUgKCEoVUFSVF9HRVRfTFNSKHVhcnQpICYgVEhSRSkpIHsKIAkJU1NZTkMoKTsKIAl9CkBAIC0xNTIsNyArMTU1LDcgQEAKIAkJdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1swXTsKIAllbHNlCiAJCXVhcnQgPSAmYmZpbl9zZXJpYWxfcG9ydHNbQ09ORklHX0tHREJfVUFSVF9QT1JUXTsKLQkKKwogCXdoaWxlKCEoVUFSVF9HRVRfTFNSKHVhcnQpICYgRFIpKSB7CiAJCVNTWU5DKCk7CiAJfQpAQCAtMjk4LDcgKzMwMSwxMSBAQAogCWJmaW5fc2VyaWFsX21jdHJsX2NoZWNrKHVhcnQpOwogCiAJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQoJnVhcnQtPnBvcnQpKSB7Ci0JCWJmaW5fc2VyaWFsX3N0b3BfdHgoJnVhcnQtPnBvcnQpOworI2lmZGVmIENPTkZJR19CRjU0eAorCQkvKiBDbGVhciBURkkgYml0ICovCisJCVVBUlRfUFVUX0xTUih1YXJ0LCBURkkpOworI2VuZGlmCisJCVVBUlRfQ0xFQVJfSUVSKHVhcnQsIEVUQkVJKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzE3LDkgKzMyNCw2IEBACiAKIAlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCiAJCXVhcnRfd3JpdGVfd2FrZXVwKCZ1YXJ0LT5wb3J0KTsKLQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCWJmaW5fc2VyaWFsX3N0b3BfdHgoJnVhcnQtPnBvcnQpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYmZpbl9zZXJpYWxfcnhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTY0NSw2ICs2NDksNDIgQEAKIAkJZnJlZV9pcnEodWFydC0+cG9ydC5pcnEsIHVhcnQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKworIyBpZmRlZiBDT05GSUdfQkY1NHgKKwl7CisJCXVuc2lnbmVkIHVhcnRfZG1hX2NoX3J4LCB1YXJ0X2RtYV9jaF90eDsKKworCQlzd2l0Y2ggKHVhcnQtPnBvcnQuaXJxKSB7CisJCWNhc2UgSVJRX1VBUlQzX1JYOgorCQkJdWFydF9kbWFfY2hfcnggPSBDSF9VQVJUM19SWDsKKwkJCXVhcnRfZG1hX2NoX3R4ID0gQ0hfVUFSVDNfVFg7CisJCQlicmVhazsKKwkJY2FzZSBJUlFfVUFSVDJfUlg6CisJCQl1YXJ0X2RtYV9jaF9yeCA9IENIX1VBUlQyX1JYOworCQkJdWFydF9kbWFfY2hfdHggPSBDSF9VQVJUMl9UWDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdWFydF9kbWFfY2hfcnggPSB1YXJ0X2RtYV9jaF90eCA9IDA7CisJCQlicmVhazsKKwkJfTsKKworCQlpZiAodWFydF9kbWFfY2hfcnggJiYKKwkJCXJlcXVlc3RfZG1hKHVhcnRfZG1hX2NoX3J4LCAiQkZJTl9VQVJUX1JYIikgPCAwKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UiRmFpbCB0byBhdHRhY2ggVUFSVCBpbnRlcnJ1cHRcbiIpOworCQkJZnJlZV9pcnEodWFydC0+cG9ydC5pcnEsIHVhcnQpOworCQkJZnJlZV9pcnEodWFydC0+cG9ydC5pcnEgKyAxLCB1YXJ0KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaWYgKHVhcnRfZG1hX2NoX3R4ICYmCisJCQlyZXF1ZXN0X2RtYSh1YXJ0X2RtYV9jaF90eCwgIkJGSU5fVUFSVF9UWCIpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJGYWlsIHRvIGF0dGFjaCBVQVJUIGludGVycnVwdFxuIik7CisJCQlmcmVlX2RtYSh1YXJ0X2RtYV9jaF9yeCk7CisJCQlmcmVlX2lycSh1YXJ0LT5wb3J0LmlycSwgdWFydCk7CisJCQlmcmVlX2lycSh1YXJ0LT5wb3J0LmlycSArIDEsIHVhcnQpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKyMgZW5kaWYKICNlbmRpZgogCVVBUlRfU0VUX0lFUih1YXJ0LCBFUkJGSSk7CiAJcmV0dXJuIDA7CkBAIC02NjIsNiArNzAyLDIwIEBACiAJZGVsX3RpbWVyKCYodWFydC0+cnhfZG1hX3RpbWVyKSk7CiAJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgUEFHRV9TSVpFLCB1YXJ0LT5yeF9kbWFfYnVmLmJ1ZiwgMCk7CiAjZWxzZQorI2lmZGVmIENPTkZJR19CRjU0eAorCXN3aXRjaCAodWFydC0+cG9ydC5pcnEpIHsKKwljYXNlIElSUV9VQVJUM19SWDoKKwkJZnJlZV9kbWEoQ0hfVUFSVDNfUlgpOworCQlmcmVlX2RtYShDSF9VQVJUM19UWCk7CisJCWJyZWFrOworCWNhc2UgSVJRX1VBUlQyX1JYOgorCQlmcmVlX2RtYShDSF9VQVJUMl9SWCk7CisJCWZyZWVfZG1hKENIX1VBUlQyX1RYKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKyNlbmRpZgogI2lmZGVmCUNPTkZJR19LR0RCX1VBUlQKIAlpZiAodWFydC0+cG9ydC5saW5lICE9IENPTkZJR19LR0RCX1VBUlRfUE9SVCkKICNlbmRpZgpAQCAtNzU3LDYgKzgxMSw5IEBACiAJdmFsIHw9IFVDRU47CiAJVUFSVF9QVVRfR0NUTCh1YXJ0LCB2YWwpOwogCisJLyogUG9ydCBzcGVlZCBjaGFuZ2VkLCB1cGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQuICovCisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCkBAIC04NTksOCArOTE2LDkgQEAKIAkJcmV0dXJuOwogCWZpcnN0ID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBucl9wb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5yX2FjdGl2ZV9wb3J0czsgaSsrKSB7CiAJCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQudWFydGNsayAgID0gZ2V0X3NjbGsoKTsKKwkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5maWZvc2l6ZSAgPSBCRklOX1VBUlRfVFhfRklGT19TSVpFOwogCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0Lm9wcyAgICAgICA9ICZiZmluX3NlcmlhbF9wb3BzOwogCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmxpbmUgICAgICA9IGk7CiAJCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuaW90eXBlICAgID0gVVBJT19NRU07CkBAIC05NjEsNyArMTAxOSw3IEBACiAJICogaWYgc28sIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwb3J0IHRoYXQgZG9lcyBoYXZlCiAJICogY29uc29sZSBzdXBwb3J0LgogCSAqLwotCWlmIChjby0+aW5kZXggPT0gLTEgfHwgY28tPmluZGV4ID49IG5yX3BvcnRzKQorCWlmIChjby0+aW5kZXggPT0gLTEgfHwgY28tPmluZGV4ID49IG5yX2FjdGl2ZV9wb3J0cykKIAkJY28tPmluZGV4ID0gMDsKIAl1YXJ0ID0gJmJmaW5fc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CiAKQEAgLTEwNTYsNyArMTExNCw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IF9faW5pdCBjb25zb2xlIGJmaW5fZWFybHlfc2VyaWFsX2NvbnNvbGUgPSB7CitzdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgY29uc29sZSBiZmluX2Vhcmx5X3NlcmlhbF9jb25zb2xlID0gewogCS5uYW1lID0gImVhcmx5X0JGdWFydCIsCiAJLndyaXRlID0gZWFybHlfc2VyaWFsX3dyaXRlLAogCS5kZXZpY2UgPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLApAQCAtMTA3Miw3ICsxMTMwLDcgQEAKIAlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydDsKIAlzdHJ1Y3Qga3Rlcm1pb3MgdDsKIAotCWlmIChwb3J0ID09IC0xIHx8IHBvcnQgPj0gbnJfcG9ydHMpCisJaWYgKHBvcnQgPT0gLTEgfHwgcG9ydCA+PSBucl9hY3RpdmVfcG9ydHMpCiAJCXBvcnQgPSAwOwogCWJmaW5fc2VyaWFsX2luaXRfcG9ydHMoKTsKIAliZmluX2Vhcmx5X3NlcmlhbF9jb25zb2xlLmluZGV4ID0gcG9ydDsKQEAgLTExMDAsMjAgKzExNTgsMjYgQEAKIAogc3RhdGljIGludCBiZmluX3NlcmlhbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKIAotCWlmICh1YXJ0KQotCQl1YXJ0X3N1c3BlbmRfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmdWFydC0+cG9ydCk7CisJZm9yIChpID0gMDsgaSA8IG5yX2FjdGl2ZV9wb3J0czsgaSsrKSB7CisJCWlmIChiZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmRldiAhPSAmZGV2LT5kZXYpCisJCQljb250aW51ZTsKKwkJdWFydF9zdXNwZW5kX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJmJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQpOworCX0KIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJmaW5fc2VyaWFsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOwogCi0JaWYgKHVhcnQpCi0JCXVhcnRfcmVzdW1lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJnVhcnQtPnBvcnQpOworCWZvciAoaSA9IDA7IGkgPCBucl9hY3RpdmVfcG9ydHM7IGkrKykgeworCQlpZiAoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5kZXYgIT0gJmRldi0+ZGV2KQorCQkJY29udGludWU7CisJCXVhcnRfcmVzdW1lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJmJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTEyOCwzMiArMTE5MiwzMSBAQAogCQkJYnJlYWs7CiAKIAlpZiAoaSA8IGRldi0+bnVtX3Jlc291cmNlcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcG9ydHM7IGkrKywgcmVzKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yX2FjdGl2ZV9wb3J0czsgaSsrLCByZXMrKykgewogCQkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQubWFwYmFzZSAhPSByZXMtPnN0YXJ0KQogCQkJCWNvbnRpbnVlOwogCQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5kZXYgPSAmZGV2LT5kZXY7CiAJCQl1YXJ0X2FkZF9vbmVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7Ci0JCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsICZiZmluX3NlcmlhbF9wb3J0c1tpXSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZmluX3NlcmlhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgYmZpbl9zZXJpYWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpOwogCi0KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyspIHsKKwkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ICE9ICZkZXYtPmRldikKKwkJCWNvbnRpbnVlOworCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7CisJCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ID0gTlVMTDsKICNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCi0JZ3Bpb19mcmVlKHVhcnQtPmN0c19waW4pOwotCWdwaW9fZnJlZSh1YXJ0LT5ydHNfcGluKTsKKwkJZ3Bpb19mcmVlKGJmaW5fc2VyaWFsX3BvcnRzW2ldLmN0c19waW4pOworCQlncGlvX2ZyZWUoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucnRzX3Bpbik7CiAjZW5kaWYKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0JaWYgKHVhcnQpCi0JCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZiZmluX3NlcmlhbF9yZWcsICZ1YXJ0LT5wb3J0KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwppbmRleCAyNWVmY2E1Li5hNmM0ZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCkBAIC0xMzMzLDYgKzEzMzMsOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBpbml0aWFsaXplIHRoZSBkZXZpY2UgcG9pbnRlciBmb3IgdGhlIHBvcnQgKi8KKwlwaW5mby0+cG9ydC5kZXYgPSAmb2ZkZXYtPmRldjsKKwogCXJldHVybiB1YXJ0X2FkZF9vbmVfcG9ydCgmY3BtX3JlZywgJnBpbmZvLT5wb3J0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCmluZGV4IDBmMGFmZjAuLjFiOTRjNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQltZW1fYWRkciA9ICh1OCAqKSBjcG1fZHByYW1fYWRkcihjcG1fZHBhbGxvYyhtZW1zeiwgOCkpOwogCQlkbWFfYWRkciA9ICh1MzIpY3BtX2RwcmFtX3BoeXMobWVtX2FkZHIpOwogCX0gZWxzZQotCQltZW1fYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBtZW1zeiwgJmRtYV9hZGRyLAorCQltZW1fYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChwaW5mby0+cG9ydC5kZXYsIG1lbXN6LCAmZG1hX2FkZHIsCiAJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCiAJaWYgKG1lbV9hZGRyID09IE5VTEwpIHsKQEAgLTEyNyw4ICsxMjcsOCBAQAogCiB2b2lkIGNwbV91YXJ0X2ZyZWVidWYoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKQogewotCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIEwxX0NBQ0hFX0FMSUdOKHBpbmZvLT5yeF9ucmZpZm9zICoKLQkJCQkJICAgICAgIHBpbmZvLT5yeF9maWZvc2l6ZSkgKworCWRtYV9mcmVlX2NvaGVyZW50KHBpbmZvLT5wb3J0LmRldiwgTDFfQ0FDSEVfQUxJR04ocGluZm8tPnJ4X25yZmlmb3MgKgorCQkJCQkJCSAgcGluZm8tPnJ4X2ZpZm9zaXplKSArCiAJCQkgIEwxX0NBQ0hFX0FMSUdOKHBpbmZvLT50eF9ucmZpZm9zICoKIAkJCQkJIHBpbmZvLT50eF9maWZvc2l6ZSksIHBpbmZvLT5tZW1fYWRkciwKIAkJCSAgcGluZm8tPmRtYV9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYwppbmRleCBiOGRiNGQzLi4xNDFjMGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0yLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMi5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJZG1hX2FkZHIgPSB2aXJ0X3RvX2J1cyhtZW1fYWRkcik7CiAJfQogCWVsc2UKLQkJbWVtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgbWVtc3osICZkbWFfYWRkciwKKwkJbWVtX2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQocGluZm8tPnBvcnQuZGV2LCBtZW1zeiwgJmRtYV9hZGRyLAogCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAogCWlmIChtZW1fYWRkciA9PSBOVUxMKSB7CkBAIC0xNjMsOCArMTYzLDggQEAKIAogdm9pZCBjcG1fdWFydF9mcmVlYnVmKHN0cnVjdCB1YXJ0X2NwbV9wb3J0ICpwaW5mbykKIHsKLQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBMMV9DQUNIRV9BTElHTihwaW5mby0+cnhfbnJmaWZvcyAqCi0JCQkJCSAgICAgICBwaW5mby0+cnhfZmlmb3NpemUpICsKKwlkbWFfZnJlZV9jb2hlcmVudChwaW5mby0+cG9ydC5kZXYsIEwxX0NBQ0hFX0FMSUdOKHBpbmZvLT5yeF9ucmZpZm9zICoKKwkJCQkJCQkgIHBpbmZvLT5yeF9maWZvc2l6ZSkgKwogCQkJICBMMV9DQUNIRV9BTElHTihwaW5mby0+dHhfbnJmaWZvcyAqCiAJCQkJCSBwaW5mby0+dHhfZmlmb3NpemUpLCAodm9pZCBfX2ZvcmNlICopcGluZm8tPm1lbV9hZGRyLAogCQkJICBwaW5mby0+ZG1hX2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCmluZGV4IGJmOTRhNzcuLjIxMWMyMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKQEAgLTQ1Nyw3ICs0NTcsNiBAQAogI2RlZmluZSBOUl9QT1JUUyAoc2l6ZW9mKHJzX3RhYmxlKS9zaXplb2Yoc3RydWN0IGUxMDBfc2VyaWFsKSkKIAogc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqc2VyaWFsX3Rlcm1pb3NbTlJfUE9SVFNdOwotc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqc2VyaWFsX3Rlcm1pb3NfbG9ja2VkW05SX1BPUlRTXTsKICNpZmRlZiBDT05GSUdfRVRSQVhfU0VSSUFMX0ZBU1RfVElNRVIKIHN0YXRpYyBzdHJ1Y3QgZmFzdF90aW1lciBmYXN0X3RpbWVyc1tOUl9QT1JUU107CiAjZW5kaWYKQEAgLTQ0MTksNiArNDQxOCw3IEBACiAJCQlyczQ4NV9wYV9iaXQpKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkVUUkFYMTAwTFggc2VyaWFsOiBDb3VsZCBub3QgYWxsb2NhdGUgIgogCQkJIlJTNDg1IHBpblxuIik7CisJCXB1dF90dHlfZHJpdmVyKGRyaXZlcik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogI2VuZGlmCkBAIC00NDI3LDYgKzQ0MjcsNyBAQAogCQkJcnM0ODVfcG9ydF9nX2JpdCkpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiRVRSQVgxMDBMWCBzZXJpYWw6IENvdWxkIG5vdCBhbGxvY2F0ZSAiCiAJCQkiUlM0ODUgcGluXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIoZHJpdmVyKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAjZW5kaWYKQEAgLTQ0NDYsOCArNDQ0Nyw2IEBACiAJZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSAxMTUyMDA7CiAJZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSAxMTUyMDA7CiAJZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWOwotCWRyaXZlci0+dGVybWlvcyA9IHNlcmlhbF90ZXJtaW9zOwotCWRyaXZlci0+dGVybWlvc19sb2NrZWQgPSBzZXJpYWxfdGVybWlvc19sb2NrZWQ7CiAKIAl0dHlfc2V0X29wZXJhdGlvbnMoZHJpdmVyLCAmcnNfb3BzKTsKICAgICAgICAgc2VyaWFsX2RyaXZlciA9IGRyaXZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2lteC5jIGIvZHJpdmVycy9zZXJpYWwvaW14LmMKaW5kZXggNmEyOWY5My4uM2Y5MGYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvaW14LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaW14LmMKQEAgLTEyNyw4ICsxMjcsMTMgQEAKICNkZWZpbmUgIFVDUjNfUlhEU0VOCSAoMTw8NikgIC8qIFJlY2VpdmUgc3RhdHVzIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgIFVDUjNfQUlSSU5URU4gICAoMTw8NSkgIC8qIEFzeW5jIElSIHdha2UgaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSAgVUNSM19BV0FLRU4JICgxPDw0KSAgLyogQXN5bmMgd2FrZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lICBVQ1IzX1JFRjI1IAkgKDE8PDMpICAvKiBSZWYgZnJlcSAyNSBNSHogKi8KLSNkZWZpbmUgIFVDUjNfUkVGMzAgCSAoMTw8MikgIC8qIFJlZiBGcmVxIDMwIE1IeiAqLworI2lmZGVmIENPTkZJR19BUkNIX0lNWAorI2RlZmluZSAgVUNSM19SRUYyNSAJICgxPDwzKSAgLyogUmVmIGZyZXEgMjUgTUh6LCBvbmx5IG9uIG14MSAqLworI2RlZmluZSAgVUNSM19SRUYzMCAJICgxPDwyKSAgLyogUmVmIEZyZXEgMzAgTUh6LCBvbmx5IG9uIG14MSAqLworI2VuZGlmCisjaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIgfHwgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKKyNkZWZpbmUgIFVDUjNfUlhETVVYU0VMCSAoMTw8MikgIC8qIFJYRCBNdXhlZCBJbnB1dCBTZWxlY3QsIG9uIG14Mi9teDMgKi8KKyNlbmRpZgogI2RlZmluZSAgVUNSM19JTlZUICAJICgxPDwxKSAgLyogSW52ZXJ0ZWQgSW5mcmFyZWQgdHJhbnNtaXNzaW9uICovCiAjZGVmaW5lICBVQ1IzX0JQRU4gIAkgKDE8PDApICAvKiBQcmVzZXQgcmVnaXN0ZXJzIGVuYWJsZSAqLwogI2RlZmluZSAgVUNSNF9DVFNUTF8zMiAgICgzMjw8MTApIC8qIENUUyB0cmlnZ2VyIGxldmVsICgzMiBjaGFycykgKi8KQEAgLTQ0NSw3ICs0NTAsNyBAQAogCQkJcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpICYgVUNSMV9UWE1QVFlFTikKIAkJaW14X3R4aW50KGlycSwgZGV2X2lkKTsKIAotCWlmIChzdHMgJiBVU1IxX1JUU1MpCisJaWYgKHN0cyAmIFVTUjFfUlRTRCkKIAkJaW14X3J0c2ludChpcnEsIGRldl9pZCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC01OTgsNiArNjAzLDEyIEBACiAJdGVtcCB8PSAoVUNSMl9SWEVOIHwgVUNSMl9UWEVOKTsKIAl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOwogCisjaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDIgfHwgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKKwl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjMpOworCXRlbXAgfD0gVUNSM19SWERNVVhTRUw7CisJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IzKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBFbmFibGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMKIAkgKi8KQEAgLTExMzMsMTMgKzExNDQsMTkgQEAKIAlpZihwZGF0YSAmJiAocGRhdGEtPmZsYWdzICYgSU1YVUFSVF9IQVZFX1JUU0NUUykpCiAJCXNwb3J0LT5oYXZlX3J0c2N0cyA9IDE7CiAKLQlpZiAocGRhdGEtPmluaXQpCi0JCXBkYXRhLT5pbml0KHBkZXYpOworCWlmIChwZGF0YS0+aW5pdCkgeworCQlyZXQgPSBwZGF0YS0+aW5pdChwZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2xrcHV0OworCX0KIAogCXVhcnRfYWRkX29uZV9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZzcG9ydC0+cG9ydCk7CiAKIAlyZXR1cm4gMDsKK2Nsa3B1dDoKKwljbGtfcHV0KHNwb3J0LT5jbGspOworCWNsa19kaXNhYmxlKHNwb3J0LT5jbGspOwogdW5tYXA6CiAJaW91bm1hcChzcG9ydC0+cG9ydC5tZW1iYXNlKTsKIGZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tY2ZzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUzODM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk2NSArMCwwIEBACi0jd2FybmluZyBUaGlzIGRyaXZlciBpcyBkZXByZWNhdGVkLiBDaGVjayBLY29uZmlnIGZvciBkZXRhaWxzLgotLyoKLSAqIG1jZnNlcmlhbC5jIC0tIHNlcmlhbCBkcml2ZXIgZm9yIENvbGRGaXJlIGludGVybmFsIFVBUlRTLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBMaW5lbywgSW5jLiA8d3d3LmxpbmVvLmNvbT4gCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBTbmFwR2VhciBJbmMuIDx3d3cuc25hcGdlYXIuY29tPiAKLSAqCi0gKiBCYXNlZCBvbiBjb2RlIGZyb20gNjgzMzJzZXJpYWwuYyB3aGljaCB3YXM6Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqIENvcHlyaWdodCAoQykgMTk5OCBUU0hHCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgUnQtQ29udHJvbCBJbmMuIDxqZWZmQHVjbGludXgub3JnPgotICoKLSAqIENoYW5nZXM6Ci0gKiAwOC8wNy8yMDAzICAgIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+Ci0gKiAgICAgICAgICAgICAgIHNvbWUgY2xlYW51cHMgaW4gbWNmcnNfd3JpdGUuCi0gKgotICovCi0gCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgotI2luY2x1ZGUgPGFzbS9tY2ZzaW0uaD4KLSNpbmNsdWRlIDxhc20vbWNmdWFydC5oPgotI2luY2x1ZGUgPGFzbS9uZXR0ZWwuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgIm1jZnNlcmlhbC5oIgotCi1zdHJ1Y3QgdGltZXJfbGlzdCBtY2Zyc190aW1lcl9zdHJ1Y3Q7Ci0KLS8qCi0gKglEZWZhdWx0IGNvbnNvbGUgYmF1ZCByYXRlLCAgd2UgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQKLSAqCWZvciBhbGwgcG9ydHMgc28gaW5pdCBjYW4ganVzdCBvcGVuIC9kZXYvY29uc29sZSBhbmQKLSAqCWtlZXAgZ29pbmcuICBQZXJoYXBzIG9uZSBkYXkgdGhlIGNmbGFnIHNldHRpbmdzIGZvciB0aGUKLSAqCWNvbnNvbGUgY2FuIGJlIHVzZWQgaW5zdGVhZC4KLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0hXX0ZFSVRIKQotI2RlZmluZQlDT05TT0xFX0JBVURfUkFURQkzODQwMAotI2RlZmluZQlERUZBVUxUX0NCQVVECQlCMzg0MDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX01PRDUyNzIpIHx8IGRlZmluZWQoQ09ORklHX001MjA4RVZCKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19NNTMyOUVWQikgfHwgZGVmaW5lZChDT05GSUdfR0lMQkFSQ08pCi0jZGVmaW5lIENPTlNPTEVfQkFVRF9SQVRFIAkxMTUyMDAKLSNkZWZpbmUgREVGQVVMVF9DQkFVRAkJQjExNTIwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJORVdTSCkgfHwgZGVmaW5lZChDT05GSUdfRlJFRVNDQUxFKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19zZW5UZWMpIHx8IGRlZmluZWQoQ09ORklHX1NORUhBKSB8fCBkZWZpbmVkKENPTkZJR19BVk5FVCkKLSNkZWZpbmUJQ09OU09MRV9CQVVEX1JBVEUJMTkyMDAKLSNkZWZpbmUJREVGQVVMVF9DQkFVRAkJQjE5MjAwCi0jZW5kaWYKLQotI2lmbmRlZiBDT05TT0xFX0JBVURfUkFURQotI2RlZmluZQlDT05TT0xFX0JBVURfUkFURQk5NjAwCi0jZGVmaW5lCURFRkFVTFRfQ0JBVUQJCUI5NjAwCi0jZW5kaWYKLQotaW50IG1jZnJzX2NvbnNvbGVfaW5pdGVkID0gMDsKLWludCBtY2Zyc19jb25zb2xlX3BvcnQgPSAtMTsKLWludCBtY2Zyc19jb25zb2xlX2JhdWQgPSBDT05TT0xFX0JBVURfUkFURTsKLWludCBtY2Zyc19jb25zb2xlX2NiYXVkID0gREVGQVVMVF9DQkFVRDsKLQotLyoKLSAqCURyaXZlciBkYXRhIHN0cnVjdHVyZXMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbWNmcnNfc2VyaWFsX2RyaXZlcjsKLQotLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCi0jZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKLQotLyogRGVidWdnaW5nLi4uCi0gKi8KLSN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgotI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NNTIzeCkgfHwgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTTUyMHgpIHx8IGRlZmluZWQoQ09ORklHX001MzJ4KQotI2RlZmluZQlJUlFCQVNFCShNQ0ZJTlRfVkVDQkFTRStNQ0ZJTlRfVUFSVDApCi0jZWxzZQotI2RlZmluZQlJUlFCQVNFCTczCi0jZW5kaWYKLQotLyoKLSAqCUNvbmZpZ3VyYXRpb24gdGFibGUsIFVBUlRzIHRvIGxvb2sgZm9yIGF0IHN0YXJ0dXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWNmX3NlcmlhbCBtY2Zyc190YWJsZVtdID0gewotCXsgIC8qIHR0eVMwICovCi0JCS5tYWdpYyA9IDAsCi0JCS5hZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSK01DRlVBUlRfQkFTRTEpLAotCQkuaXJxID0gSVJRQkFTRSwKLQkJLmZsYWdzID0gQVNZTkNfQk9PVF9BVVRPQ09ORiwKLQl9LAotI2lmZGVmIE1DRlVBUlRfQkFTRTIKLQl7ICAvKiB0dHlTMSAqLwotCQkubWFnaWMgPSAwLAotCQkuYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfTUJBUitNQ0ZVQVJUX0JBU0UyKSwKLQkJLmlycSA9IElSUUJBU0UrMSwKLQkJLmZsYWdzID0gQVNZTkNfQk9PVF9BVVRPQ09ORiwKLQl9LAotI2VuZGlmCi0jaWZkZWYgTUNGVUFSVF9CQVNFMwotCXsgIC8qIHR0eVMyICovCi0JCS5tYWdpYyA9IDAsCi0JCS5hZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSK01DRlVBUlRfQkFTRTMpLAotCQkuaXJxID0gSVJRQkFTRSsyLAotCQkuZmxhZ3MgPSBBU1lOQ19CT09UX0FVVE9DT05GLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBNQ0ZVQVJUX0JBU0U0Ci0JeyAgLyogdHR5UzMgKi8KLQkJLm1hZ2ljID0gMCwKLQkJLmFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoTUNGX01CQVIrTUNGVUFSVF9CQVNFNCksCi0JCS5pcnEgPSBJUlFCQVNFKzMsCi0JCS5mbGFncyA9IEFTWU5DX0JPT1RfQVVUT0NPTkYsCi0JfSwKLSNlbmRpZgotfTsKLQotCi0jZGVmaW5lCU5SX1BPUlRTCShzaXplb2YobWNmcnNfdGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBtY2Zfc2VyaWFsKSkKLQotLyoKLSAqIFRoaXMgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzLgotICovCi1zdGF0aWMgaW50IG1jZnJzX2JhdWRfdGFibGVbXSA9IHsKLQkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCi0JOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgMAotfTsKLSNkZWZpbmUgTUNGUlNfQkFVRF9UQUJMRV9TSVpFIFwKLQkJCShzaXplb2YobWNmcnNfYmF1ZF90YWJsZSkvc2l6ZW9mKG1jZnJzX2JhdWRfdGFibGVbMF0pKQotCi0KLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLS8qCi0gKglNYWdpYyBzeXN0ZW0gcmVxdWVzdCBrZXlzLiBVc2VkIGZvciBkZWJ1Z2dpbmcuLi4KLSAqLwotZXh0ZXJuIGludAltYWdpY19zeXNycV9rZXkoaW50IGNoKTsKLSNlbmRpZgotCi0KLS8qCi0gKglGb3J3YXJlIGRlY2xhcmF0aW9ucy4uLgotICovCi1zdGF0aWMgdm9pZAltY2Zyc19jaGFuZ2Vfc3BlZWQoc3RydWN0IG1jZl9zZXJpYWwgKmluZm8pOwotc3RhdGljIHZvaWQJbWNmcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKLQotCi1zdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IG1jZl9zZXJpYWwgKmluZm8sCi0JCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCi17Ci0jaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCi0Jc3RhdGljIGNvbnN0IGNoYXIgYmFkbWFnaWNbXSA9Ci0JCSJNQ0ZSUyh3YXJuaW5nKTogYmFkIG1hZ2ljIG51bWJlciBmb3Igc2VyaWFsIHN0cnVjdCAlcyBpbiAlc1xuIjsKLQlzdGF0aWMgY29uc3QgY2hhciBiYWRpbmZvW10gPQotCQkiTUNGUlMod2FybmluZyk6IG51bGwgbWNmX3NlcmlhbCBmb3IgJXMgaW4gJXNcbiI7Ci0KLQlpZiAoIWluZm8pIHsKLQkJcHJpbnRrKGJhZGluZm8sIG5hbWUsIHJvdXRpbmUpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGluZm8tPm1hZ2ljICE9IFNFUklBTF9NQUdJQykgewotCQlwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCVNldHMgb3IgY2xlYXJzIERUUiBhbmQgUlRTIG9uIHRoZSByZXF1ZXN0ZWQgbGluZS4KLSAqLwotc3RhdGljIHZvaWQgbWNmcnNfc2V0c2lnbmFscyhzdHJ1Y3QgbWNmX3NlcmlhbCAqaW5mbywgaW50IGR0ciwgaW50IHJ0cykKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQkKLSNpZiAwCi0JcHJpbnRrKCIlcyglZCk6IG1jZnJzX3NldHNpZ25hbHMoaW5mbz0leCxkdHI9JWQscnRzPSVkKVxuIiwKLQkJX19GSUxFX18sIF9fTElORV9fLCBpbmZvLCBkdHIsIHJ0cyk7Ci0jZW5kaWYKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoZHRyID49IDApIHsKLSNpZmRlZiBNQ0ZQUF9EVFIwCi0JCWlmIChpbmZvLT5saW5lKQotCQkJbWNmX3NldHBwZGF0YShNQ0ZQUF9EVFIxLCAoZHRyID8gMCA6IE1DRlBQX0RUUjEpKTsKLQkJZWxzZQotCQkJbWNmX3NldHBwZGF0YShNQ0ZQUF9EVFIwLCAoZHRyID8gMCA6IE1DRlBQX0RUUjApKTsKLSNlbmRpZgotCX0KLQlpZiAocnRzID49IDApIHsKLQkJdWFydHAgPSBpbmZvLT5hZGRyOwotCQlpZiAocnRzKSB7Ci0JCQlpbmZvLT5zaWdzIHw9IFRJT0NNX1JUUzsKLQkJCXVhcnRwW01DRlVBUlRfVU9QMV0gPSBNQ0ZVQVJUX1VPUF9SVFM7Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT5zaWdzICY9IH5USU9DTV9SVFM7Ci0JCQl1YXJ0cFtNQ0ZVQVJUX1VPUDBdID0gTUNGVUFSVF9VT1BfUlRTOwotCQl9Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gKglHZXRzIHZhbHVlcyBvZiBzZXJpYWwgc2lnbmFscy4KLSAqLwotc3RhdGljIGludCBtY2Zyc19nZXRzaWduYWxzKHN0cnVjdCBtY2Zfc2VyaWFsICppbmZvKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCXNpZ3M7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkVUdGVsKSAmJiBkZWZpbmVkKENPTkZJR19NNTMwNykKLQl1bnNpZ25lZCBzaG9ydAkJcHBkYXRhOwotI2VuZGlmCi0KLSNpZiAwCi0JcHJpbnRrKCIlcyglZCk6IG1jZnJzX2dldHNpZ25hbHMoaW5mbz0leClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0jZW5kaWYKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl1YXJ0cCA9IGluZm8tPmFkZHI7Ci0Jc2lncyA9ICh1YXJ0cFtNQ0ZVQVJUX1VJUFJdICYgTUNGVUFSVF9VSVBSX0NUUykgPyAwIDogVElPQ01fQ1RTOwotCXNpZ3MgfD0gKGluZm8tPnNpZ3MgJiBUSU9DTV9SVFMpOwotCi0jaWZkZWYgTUNGUFBfRENEMAotewotCXVuc2lnbmVkIGludCBwcGRhdGE7Ci0JcHBkYXRhID0gbWNmX2dldHBwZGF0YSgpOwotCWlmIChpbmZvLT5saW5lID09IDApIHsKLQkJc2lncyB8PSAocHBkYXRhICYgTUNGUFBfRENEMCkgPyAwIDogVElPQ01fQ0Q7Ci0JCXNpZ3MgfD0gKHBwZGF0YSAmIE1DRlBQX0RUUjApID8gMCA6IFRJT0NNX0RUUjsKLQl9IGVsc2UgaWYgKGluZm8tPmxpbmUgPT0gMSkgewotCQlzaWdzIHw9IChwcGRhdGEgJiBNQ0ZQUF9EQ0QxKSA/IDAgOiBUSU9DTV9DRDsKLQkJc2lncyB8PSAocHBkYXRhICYgTUNGUFBfRFRSMSkgPyAwIDogVElPQ01fRFRSOwotCX0KLX0KLSNlbmRpZgotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybihzaWdzKTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogbWNmcnNfc3RvcCgpIGFuZCBtY2Zyc19zdGFydCgpCi0gKgotICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCi0gKiBUaGV5IGVuYWJsZSBvciBkaXNhYmxlIHRyYW5zbWl0dGVyIGludGVycnVwdHMsIGFzIG5lY2Vzc2FyeS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCBtY2Zyc19zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqdWFydHA7Ci0Jc3RydWN0IG1jZl9zZXJpYWwJKmluZm8gPSAoc3RydWN0IG1jZl9zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19zdG9wIikpCi0JCXJldHVybjsKLQkKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdWFydHAgPSBpbmZvLT5hZGRyOwotCWluZm8tPmltciAmPSB+TUNGVUFSVF9VSVJfVFhSRUFEWTsKLQl1YXJ0cFtNQ0ZVQVJUX1VJTVJdID0gaW5mby0+aW1yOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbWNmcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19zdGFydCIpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKGluZm8tPnhtaXRfY250ICYmIGluZm8tPnhtaXRfYnVmKSB7Ci0JCXVhcnRwID0gaW5mby0+YWRkcjsKLQkJaW5mby0+aW1yIHw9IE1DRlVBUlRfVUlSX1RYUkVBRFk7Ci0JCXVhcnRwW01DRlVBUlRfVUlNUl0gPSBpbmZvLT5pbXI7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBIZXJlIHN0YXJ0cyB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzLiAgQWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAqIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQgaW50bwotICogbWNmcnNfaW50ZXJydXB0KCkuICBUaGV5IHdlcmUgc2VwYXJhdGVkIG91dCBmb3IgcmVhZGFiaWxpdHkncyBzYWtlLgotICoKLSAqIE5vdGU6IG1jZnJzX2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAotICogcnVucyB3aXRoIGludGVycnVwdHMgdHVybmVkIG9mZi4gIFBlb3BsZSB3aG8gbWF5IHdhbnQgdG8gbW9kaWZ5Ci0gKiBtY2Zyc19pbnRlcnJ1cHQoKSBzaG91bGQgdHJ5IHRvIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIGZhc3QgYXMKLSAqIHBvc3NpYmxlLiAgQWZ0ZXIgeW91IGFyZSBkb25lIG1ha2luZyBtb2RpZmljYXRpb25zLCBpdCBpcyBub3QgYSBiYWQKLSAqIGlkZWEgdG8gZG86Ci0gKiAKLSAqIGdjYyAtUyAtREtFUk5FTCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciBzZXJpYWwuYwotICoKLSAqIGFuZCBsb29rIGF0IHRoZSByZXN1bHRpbmcgYXNzZW1ibGUgY29kZSBpbiBzZXJpYWwucy4KLSAqCi0gKiAJCQkJLSBUZWQgVHMnbyAodHl0c29AbWl0LmVkdSksIDctTWFyLTkzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBtY2Zfc2VyaWFsICppbmZvKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCXN0cnVjdCB0dHlfc3RydWN0CSp0dHkgPSBpbmZvLT5wb3J0LnR0eTsKLQl1bnNpZ25lZCBjaGFyCQlzdGF0dXMsIGNoLCBmbGFnOwotCi0JaWYgKCF0dHkpCi0JCXJldHVybjsKLQotCXVhcnRwID0gaW5mby0+YWRkcjsKLQotCXdoaWxlICgoc3RhdHVzID0gdWFydHBbTUNGVUFSVF9VU1JdKSAmIE1DRlVBUlRfVVNSX1JYUkVBRFkpIHsKLQkJY2ggPSB1YXJ0cFtNQ0ZVQVJUX1VSQl07Ci0JCWluZm8tPnN0YXRzLnJ4Kys7Ci0KLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkJaWYgKG1jZnJzX2NvbnNvbGVfaW5pdGVkICYmIChpbmZvLT5saW5lID09IG1jZnJzX2NvbnNvbGVfcG9ydCkpIHsKLQkJCWlmIChtYWdpY19zeXNycV9rZXkoY2gpKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYKLQotCQlmbGFnID0gVFRZX05PUk1BTDsKLQkJaWYgKHN0YXR1cyAmIE1DRlVBUlRfVVNSX1JYRVJSKSB7Ci0JCQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVEVSUjsKLQkJCWlmIChzdGF0dXMgJiBNQ0ZVQVJUX1VTUl9SWEJSRUFLKSB7Ci0JCQkJaW5mby0+c3RhdHMucnhicmVhaysrOwotCQkJCWZsYWcgPSBUVFlfQlJFQUs7Ci0JCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DRlVBUlRfVVNSX1JYUEFSSVRZKSB7Ci0JCQkJaW5mby0+c3RhdHMucnhwYXJpdHkrKzsKLQkJCQlmbGFnID0gVFRZX1BBUklUWTsKLQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTUNGVUFSVF9VU1JfUlhPVkVSUlVOKSB7Ci0JCQkJaW5mby0+c3RhdHMucnhvdmVycnVuKys7Ci0JCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwotCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNQ0ZVQVJUX1VTUl9SWEZSQU1JTkcpIHsKLQkJCQlpbmZvLT5zdGF0cy5yeGZyYW1pbmcrKzsKLQkJCQlmbGFnID0gVFRZX0ZSQU1FOwotCQkJfQotCQl9Ci0JCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwotCX0KLQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBtY2Zfc2VyaWFsICppbmZvKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCi0JdWFydHAgPSBpbmZvLT5hZGRyOwotCi0JaWYgKGluZm8tPnhfY2hhcikgewotCQkvKiBTZW5kIHNwZWNpYWwgY2hhciAtIHByb2JhYmx5IGZsb3cgY29udHJvbCAqLwotCQl1YXJ0cFtNQ0ZVQVJUX1VUQl0gPSBpbmZvLT54X2NoYXI7Ci0JCWluZm8tPnhfY2hhciA9IDA7Ci0JCWluZm8tPnN0YXRzLnR4Kys7Ci0JfQotCi0JaWYgKChpbmZvLT54bWl0X2NudCA8PSAwKSB8fCBpbmZvLT5wb3J0LnR0eS0+c3RvcHBlZCkgewotCQlpbmZvLT5pbXIgJj0gfk1DRlVBUlRfVUlSX1RYUkVBRFk7Ci0JCXVhcnRwW01DRlVBUlRfVUlNUl0gPSBpbmZvLT5pbXI7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAodWFydHBbTUNGVUFSVF9VU1JdICYgTUNGVUFSVF9VU1JfVFhSRUFEWSkgewotCQl1YXJ0cFtNQ0ZVQVJUX1VUQl0gPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK107Ci0JCWluZm8tPnhtaXRfdGFpbCA9IGluZm8tPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFLTEpOwotCQlpbmZvLT5zdGF0cy50eCsrOwotCQlpZiAoLS1pbmZvLT54bWl0X2NudCA8PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKQotCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwotCXJldHVybjsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBnZW5lcmljIGludGVycnVwdCByb3V0aW5lCi0gKi8KLWlycXJldHVybl90IG1jZnJzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwJKmluZm87Ci0JdW5zaWduZWQgY2hhcgkJaXNyOwotCi0JaW5mbyA9ICZtY2Zyc190YWJsZVsoaXJxIC0gSVJRQkFTRSldOwotCWlzciA9IGluZm8tPmFkZHJbTUNGVUFSVF9VSVNSXSAmIGluZm8tPmltcjsKLQotCWlmIChpc3IgJiBNQ0ZVQVJUX1VJUl9SWFJFQURZKQotCQlyZWNlaXZlX2NoYXJzKGluZm8pOwotCWlmIChpc3IgJiBNQ0ZVQVJUX1VJUl9UWFJFQURZKQotCQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBIZXJlIGVuZHMgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZXMuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RhdGljIHZvaWQgbWNmcnNfb2ZmaW50cihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1jZl9zZXJpYWwsIHRxdWV1ZSk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnBvcnQudHR5OwotCQotCWlmICh0dHkpCi0JCXR0eV93YWtldXAodHR5KTsKLX0KLQotCi0vKgotICoJQ2hhbmdlIG9mIHN0YXRlIG9uIGEgRENEIGxpbmUuCi0gKi8KLXZvaWQgbWNmcnNfbW9kZW1fY2hhbmdlKHN0cnVjdCBtY2Zfc2VyaWFsICppbmZvLCBpbnQgZGNkKQotewotCWlmIChpbmZvLT5jb3VudCA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkgewotCQlpZiAoZGNkKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCQllbHNlIAotCQkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlX2hhbmd1cCk7Ci0JfQotfQotCi0KLSNpZmRlZiBNQ0ZQUF9EQ0QwCi0KLXVuc2lnbmVkIHNob3J0CW1jZnJzX3Bwc3RhdHVzOwotCi0vKgotICogVGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBSU19USU1FUiBnb2VzIG9mZi4gSXQgaXMgdXNlZAotICogdG8gbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlIERDRCBsaW5lcyAtIHNpbmNlIHRoZXkgaGF2ZSBubyBlZGdlCi0gKiBzZW5zb3JzIGFuZCBpbnRlcnJ1cHQgZ2VuZXJhdG9ycy4KLSAqLwotc3RhdGljIHZvaWQgbWNmcnNfdGltZXIodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQJcHBzdGF0dXMsIGRjZHZhbCwgaTsKLQotCXBwc3RhdHVzID0gbWNmX2dldHBwZGF0YSgpICYgKE1DRlBQX0RDRDAgfCBNQ0ZQUF9EQ0QxKTsKLQotCWlmIChwcHN0YXR1cyAhPSBtY2Zyc19wcHN0YXR1cykgewotCQlmb3IgKGkgPSAwOyAoaSA8IDIpOyBpKyspIHsKLQkJCWRjZHZhbCA9IChpID8gTUNGUFBfRENEMSA6IE1DRlBQX0RDRDApOwotCQkJaWYgKChwcHN0YXR1cyAmIGRjZHZhbCkgIT0gKG1jZnJzX3Bwc3RhdHVzICYgZGNkdmFsKSkgewotCQkJCW1jZnJzX21vZGVtX2NoYW5nZSgmbWNmcnNfdGFibGVbaV0sCi0JCQkJCSgocHBzdGF0dXMgJiBkY2R2YWwpID8gMCA6IDEpKTsKLQkJCX0KLQkJfQotCX0KLQltY2Zyc19wcHN0YXR1cyA9IHBwc3RhdHVzOwotCi0JLyogUmUtYXJtIHRpbWVyICovCi0JbWNmcnNfdGltZXJfc3RydWN0LmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMjU7Ci0JYWRkX3RpbWVyKCZtY2Zyc190aW1lcl9zdHJ1Y3QpOwotfQotCi0jZW5kaWYJLyogTUNGUFBfRENEMCAqLwotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIHNjaGVkdWxlciB0cXVldWUgd2hlbiB0aGUgaW50ZXJydXB0Ci0gKiByb3V0aW5lIGhhcyBzaWduYWxsZWQgdGhhdCBhIGhhbmd1cCBoYXMgb2NjdXJyZWQuIFRoZSBwYXRoIG9mCi0gKiBoYW5ndXAgcHJvY2Vzc2luZyBpczoKLSAqCi0gKiAJc2VyaWFsIGludGVycnVwdCByb3V0aW5lIC0+IChzY2hlZHVsZXIgdHF1ZXVlKSAtPgotICogCWRvX3NlcmlhbF9oYW5ndXAoKSAtPiB0dHktPmhhbmd1cCgpIC0+IG1jZnJzX2hhbmd1cCgpCi0gKiAKLSAqLwotc3RhdGljIHZvaWQgZG9fc2VyaWFsX2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1jZl9zZXJpYWwsIHRxdWV1ZV9oYW5ndXApOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT5wb3J0LnR0eTsKLQkKLQlpZiAodHR5KQotCQl0dHlfaGFuZ3VwKHR0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgbWNmX3NlcmlhbCAqIGluZm8pCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqdWFydHA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JCi0JaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpbmZvLT54bWl0X2J1ZikgewotCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFpbmZvLT54bWl0X2J1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKCJzdGFydGluZyB1cCB0dHlTJWQgKGlycSAlZCkuLi5cbiIsIGluZm8tPmxpbmUsIGluZm8tPmlycSk7Ci0jZW5kaWYKLQotCS8qCi0JICoJUmVzZXQgVUFSVCwgZ2V0IGl0IGludG8ga25vd24gc3RhdGUuLi4KLQkgKi8KLQl1YXJ0cCA9IGluZm8tPmFkZHI7Ci0JdWFydHBbTUNGVUFSVF9VQ1JdID0gTUNGVUFSVF9VQ1JfQ01EUkVTRVRSWDsgIC8qIHJlc2V0IFJYICovCi0JdWFydHBbTUNGVUFSVF9VQ1JdID0gTUNGVUFSVF9VQ1JfQ01EUkVTRVRUWDsgIC8qIHJlc2V0IFRYICovCi0JbWNmcnNfc2V0c2lnbmFscyhpbmZvLCAxLCAxKTsKLQotCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnBvcnQudHR5LT5mbGFncyk7Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCi0JLyoKLQkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKLQkgKi8KLQltY2Zyc19jaGFuZ2Vfc3BlZWQoaW5mbyk7Ci0KLQkvKgotCSAqIExhc3RseSBlbmFibGUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLCBhbmQKLQkgKiBpbnRlcnJ1cHQgZW5hYmxlcy4KLQkgKi8KLQlpbmZvLT5pbXIgPSBNQ0ZVQVJUX1VJUl9SWFJFQURZOwotCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX1JYRU5BQkxFIHwgTUNGVUFSVF9VQ1JfVFhFTkFCTEU7Ci0JdWFydHBbTUNGVUFSVF9VSU1SXSA9IGluZm8tPmltcjsKLQotCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBhbmQKLSAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCi0gKi8KLXN0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbykKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50aygiU2h1dHRpbmcgZG93biBzZXJpYWwgcG9ydCAlZCAoaXJxICVkKS4uLi5cbiIsIGluZm8tPmxpbmUsCi0JICAgICAgIGluZm8tPmlycSk7Ci0jZW5kaWYKLQkKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQl1YXJ0cCA9IGluZm8tPmFkZHI7Ci0JdWFydHBbTUNGVUFSVF9VSU1SXSA9IDA7ICAvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCi0JdWFydHBbTUNGVUFSVF9VQ1JdID0gTUNGVUFSVF9VQ1JfQ01EUkVTRVRSWDsgIC8qIHJlc2V0IFJYICovCi0JdWFydHBbTUNGVUFSVF9VQ1JdID0gTUNGVUFSVF9VQ1JfQ01EUkVTRVRUWDsgIC8qIHJlc2V0IFRYICovCi0KLQlpZiAoIWluZm8tPnBvcnQudHR5IHx8IChpbmZvLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKLQkJbWNmcnNfc2V0c2lnbmFscyhpbmZvLCAwLCAwKTsKLQotCWlmIChpbmZvLT54bWl0X2J1ZikgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKLQkJaW5mby0+eG1pdF9idWYgPSAwOwotCX0KLQotCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOwotCQotCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCi0gKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgbWNmcnNfY2hhbmdlX3NwZWVkKHN0cnVjdCBtY2Zfc2VyaWFsICppbmZvKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCXVuc2lnbmVkIGludAkJYmF1ZGNsaywgY2ZsYWc7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JdW5zaWduZWQgY2hhcgkJbXIxLCBtcjI7Ci0JaW50CQkJaTsKLSNpZmRlZglDT05GSUdfTTUyNzIKLQl1bnNpZ25lZCBpbnQJCWZyYWN0aW9uOwotI2VuZGlmCi0KLQlpZiAoIWluZm8tPnBvcnQudHR5IHx8ICFpbmZvLT5wb3J0LnR0eS0+dGVybWlvcykKLQkJcmV0dXJuOwotCWNmbGFnID0gaW5mby0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JaWYgKGluZm8tPmFkZHIgPT0gMCkKLQkJcmV0dXJuOwotCi0jaWYgMAotCXByaW50aygiJXMoJWQpOiBtY2Zyc19jaGFuZ2Vfc3BlZWQoKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKLSNlbmRpZgotCi0JaSA9IGNmbGFnICYgQ0JBVUQ7Ci0JaWYgKGkgJiBDQkFVREVYKSB7Ci0JCWkgJj0gfkNCQVVERVg7Ci0JCWlmIChpIDwgMSB8fCBpID4gNCkKLQkJCWluZm8tPnBvcnQudHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOwotCQllbHNlCi0JCQlpICs9IDE1OwotCX0KLQlpZiAoaSA9PSAwKSB7Ci0JCW1jZnJzX3NldHNpZ25hbHMoaW5mbywgMCwgLTEpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogY29tcHV0ZSB0aGUgYmF1ZHJhdGUgY2xvY2sgKi8KLSNpZmRlZglDT05GSUdfTTUyNzIKLQkvKgotCSAqIEZvciB0aGUgTUNGNTI3MiwgYWxzbyBjb21wdXRlIHRoZSBiYXVkcmF0ZSBmcmFjdGlvbi4KLQkgKi8KLQliYXVkY2xrID0gKE1DRl9CVVNDTEsgLyBtY2Zyc19iYXVkX3RhYmxlW2ldKSAvIDMyOwotCWZyYWN0aW9uID0gTUNGX0JVU0NMSyAtIChiYXVkY2xrICogMzIgKiBtY2Zyc19iYXVkX3RhYmxlW2ldKTsKLQlmcmFjdGlvbiAqPSAxNjsKLQlmcmFjdGlvbiAvPSAoMzIgKiBtY2Zyc19iYXVkX3RhYmxlW2ldKTsKLSNlbHNlCi0JYmF1ZGNsayA9ICgoTUNGX0JVU0NMSyAvIG1jZnJzX2JhdWRfdGFibGVbaV0pICsgMTYpIC8gMzI7Ci0jZW5kaWYKLQotCWluZm8tPmJhdWQgPSBtY2Zyc19iYXVkX3RhYmxlW2ldOwotCi0JbXIxID0gTUNGVUFSVF9NUjFfUlhJUlFSRFkgfCBNQ0ZVQVJUX01SMV9SWEVSUkNIQVI7Ci0JbXIyID0gMDsKLQotCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewotCWNhc2UgQ1M1OgltcjEgfD0gTUNGVUFSVF9NUjFfQ1M1OyBicmVhazsKLQljYXNlIENTNjoJbXIxIHw9IE1DRlVBUlRfTVIxX0NTNjsgYnJlYWs7Ci0JY2FzZSBDUzc6CW1yMSB8PSBNQ0ZVQVJUX01SMV9DUzc7IGJyZWFrOwotCWNhc2UgQ1M4OgotCWRlZmF1bHQ6CW1yMSB8PSBNQ0ZVQVJUX01SMV9DUzg7IGJyZWFrOwotCX0KLQotCWlmIChjZmxhZyAmIFBBUkVOQikgewotCQlpZiAoY2ZsYWcgJiBDTVNQQVIpIHsKLQkJCWlmIChjZmxhZyAmIFBBUk9ERCkKLQkJCQltcjEgfD0gTUNGVUFSVF9NUjFfUEFSSVRZTUFSSzsKLQkJCWVsc2UKLQkJCQltcjEgfD0gTUNGVUFSVF9NUjFfUEFSSVRZU1BBQ0U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2ZsYWcgJiBQQVJPREQpCi0JCQkJbXIxIHw9IE1DRlVBUlRfTVIxX1BBUklUWU9ERDsKLQkJCWVsc2UKLQkJCQltcjEgfD0gTUNGVUFSVF9NUjFfUEFSSVRZRVZFTjsKLQkJfQotCX0gZWxzZSB7Ci0JCW1yMSB8PSBNQ0ZVQVJUX01SMV9QQVJJVFlOT05FOwotCX0KLQotCWlmIChjZmxhZyAmIENTVE9QQikKLQkJbXIyIHw9IE1DRlVBUlRfTVIyX1NUT1AyOwotCWVsc2UKLQkJbXIyIHw9IE1DRlVBUlRfTVIyX1NUT1AxOwotCi0JaWYgKGNmbGFnICYgQ1JUU0NUUykgewotCQltcjEgfD0gTUNGVUFSVF9NUjFfUlhSVFM7Ci0JCW1yMiB8PSBNQ0ZVQVJUX01SMl9UWENUUzsKLQl9Ci0KLQlpZiAoY2ZsYWcgJiBDTE9DQUwpCi0JCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKLQllbHNlCi0JCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwotCi0JdWFydHAgPSBpbmZvLT5hZGRyOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotI2lmIDAKLQlwcmludGsoIiVzKCVkKTogbXIxPSV4IG1yMj0leCBiYXVkY2xrPSV4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sCi0JCW1yMSwgbXIyLCBiYXVkY2xrKTsKLSNlbmRpZgotCS8qCi0JICBOb3RlOiBwZyAxMi0xNiBvZiBNQ0Y1MjA2ZSBVc2VyJ3MgTWFudWFsIHN0YXRlcyB0aGF0IGEKLQkgIHNvZnR3YXJlIHJlc2V0IHNob3VsZCBiZSBwZXJmb3JtZWQgcHJpb3IgdG8gY2hhbmdpbmcKLQkgIFVNUjEsMiwgVUNTUiwgVUFDUiwgYml0IDcKLQkqLwotCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX0NNRFJFU0VUUlg7ICAgIC8qIHJlc2V0IFJYICovCi0JdWFydHBbTUNGVUFSVF9VQ1JdID0gTUNGVUFSVF9VQ1JfQ01EUkVTRVRUWDsgICAgLyogcmVzZXQgVFggKi8KLQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVE1SUFRSOwkvKiByZXNldCBNUiBwb2ludGVyICovCi0JdWFydHBbTUNGVUFSVF9VTVJdID0gbXIxOwotCXVhcnRwW01DRlVBUlRfVU1SXSA9IG1yMjsKLQl1YXJ0cFtNQ0ZVQVJUX1VCRzFdID0gKGJhdWRjbGsgJiAweGZmMDApID4+IDg7CS8qIHNldCBtc2IgYnl0ZSAqLwotCXVhcnRwW01DRlVBUlRfVUJHMl0gPSAoYmF1ZGNsayAmIDB4ZmYpOwkJLyogc2V0IGxzYiBieXRlICovCi0jaWZkZWYJQ09ORklHX001MjcyCi0JdWFydHBbTUNGVUFSVF9VRlBEXSA9IChmcmFjdGlvbiAmIDB4Zik7CQkvKiBzZXQgZnJhY3Rpb24gKi8KLSNlbmRpZgotCXVhcnRwW01DRlVBUlRfVUNTUl0gPSBNQ0ZVQVJUX1VDU1JfUlhDTEtUSU1FUiB8IE1DRlVBUlRfVUNTUl9UWENMS1RJTUVSOwotCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX1JYRU5BQkxFIHwgTUNGVUFSVF9VQ1JfVFhFTkFCTEU7Ci0JbWNmcnNfc2V0c2lnbmFscyhpbmZvLCAxLCAtMSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbWNmcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1jZnJzX2ZsdXNoX2NoYXJzIikpCi0JCXJldHVybjsKLQotCXVhcnRwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaW5mby0+YWRkcjsKLQotCS8qCi0JICogcmUtZW5hYmxlIHJlY2VpdmVyIGludGVycnVwdAotCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoKCEoaW5mby0+aW1yICYgTUNGVUFSVF9VSVJfUlhSRUFEWSkpICYmCi0JICAgIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSApIHsKLQkJaW5mby0+aW1yIHw9IE1DRlVBUlRfVUlSX1JYUkVBRFk7Ci0JCXVhcnRwW01DRlVBUlRfVUlNUl0gPSBpbmZvLT5pbXI7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWlmIChpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwKLQkgICAgIWluZm8tPnhtaXRfYnVmKQotCQlyZXR1cm47Ci0KLQkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaW5mby0+aW1yIHw9IE1DRlVBUlRfVUlSX1RYUkVBRFk7Ci0JdWFydHBbTUNGVUFSVF9VSU1SXSA9IGluZm8tPmltcjsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWNmcnNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCi0JCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JaW50CQkJYywgdG90YWwgPSAwOwotCi0jaWYgMAotCXByaW50aygiJXMoJWQpOiBtY2Zyc193cml0ZSh0dHk9JXgsYnVmPSV4LGNvdW50PSVkKVxuIiwKLQkJX19GSUxFX18sIF9fTElORV9fLCAoaW50KXR0eSwgKGludClidWYsIGNvdW50KTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc193cml0ZSIpKQotCQlyZXR1cm4gMDsKLQotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZikKLQkJcmV0dXJuIDA7Ci0JCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0Jd2hpbGUgKDEpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsJCQotCQljID0gbWluKGNvdW50LCAoaW50KSBtaW4oKChpbnQpU0VSSUFMX1hNSVRfU0laRSkgLSBpbmZvLT54bWl0X2NudCAtIDEsCi0JCQkoKGludClTRVJJQUxfWE1JVF9TSVpFKSAtIGluZm8tPnhtaXRfaGVhZCkpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQkJaWYgKGMgPD0gMCkKLQkJCWJyZWFrOwotCi0JCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKLQotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKLQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JCWJ1ZiArPSBjOwotCQljb3VudCAtPSBjOwotCQl0b3RhbCArPSBjOwotCX0KLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JdWFydHAgPSBpbmZvLT5hZGRyOwotCWluZm8tPmltciB8PSBNQ0ZVQVJUX1VJUl9UWFJFQURZOwotCXVhcnRwW01DRlVBUlRfVUlNUl0gPSBpbmZvLT5pbXI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHRvdGFsOwotfQotCi1zdGF0aWMgaW50IG1jZnJzX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWNmX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JaW50CXJldDsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWNmcnNfd3JpdGVfcm9vbSIpKQotCQlyZXR1cm4gMDsKLQlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOwotCWlmIChyZXQgPCAwKQotCQlyZXQgPSAwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWNmcnNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1jZl9zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19jaGFyc19pbl9idWZmZXIiKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGluZm8tPnhtaXRfY250OwotfQotCi1zdGF0aWMgdm9pZCBtY2Zyc19mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1jZnJzX2ZsdXNoX2J1ZmZlciIpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXR0eV93YWtldXAodHR5KTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogbWNmcnNfdGhyb3R0bGUoKQotICogCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB1cHBlci1sYXllciB0dHkgbGF5ZXIgdG8gc2lnbmFsIHRoYXQKLSAqIGluY29taW5nIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHRocm90dGxlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCBtY2Zyc190aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKLXsKLQlzdHJ1Y3QgbWNmX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCi0JY2hhcglidWZbNjRdOwotCQotCXByaW50aygidGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc190aHJvdHRsZSIpKQotCQlyZXR1cm47Ci0JCi0JaWYgKElfSVhPRkYodHR5KSkKLQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7Ci0KLQkvKiBUdXJuIG9mZiBSVFMgbGluZSAoZG8gdGhpcyBhdG9taWMpICovCi19Ci0KLXN0YXRpYyB2b2lkIG1jZnJzX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1jZl9zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotCWNoYXIJYnVmWzY0XTsKLQkKLQlwcmludGsoInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc191bnRocm90dGxlIikpCi0JCXJldHVybjsKLQkKLQlpZiAoSV9JWE9GRih0dHkpKSB7Ci0JCWlmIChpbmZvLT54X2NoYXIpCi0JCQlpbmZvLT54X2NoYXIgPSAwOwotCQllbHNlCi0JCQlpbmZvLT54X2NoYXIgPSBTVEFSVF9DSEFSKHR0eSk7Ci0JfQotCi0JLyogQXNzZXJ0IFJUUyBsaW5lIChkbyB0aGlzIGF0b21pYykgKi8KLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogbWNmcnNfaW9jdGwoKSBhbmQgZnJpZW5kcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IG1jZl9zZXJpYWwgKiBpbmZvLAotCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKiByZXRpbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKLSAgCi0JaWYgKCFyZXRpbmZvKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOwotCXRtcC50eXBlID0gaW5mby0+dHlwZTsKLQl0bXAubGluZSA9IGluZm8tPmxpbmU7Ci0JdG1wLnBvcnQgPSAodW5zaWduZWQgaW50KSBpbmZvLT5hZGRyOwotCXRtcC5pcnEgPSBpbmZvLT5pcnE7Ci0JdG1wLmZsYWdzID0gaW5mby0+ZmxhZ3M7Ci0JdG1wLmJhdWRfYmFzZSA9IGluZm8tPmJhdWRfYmFzZTsKLQl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKLQl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OwotCXRtcC5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yOwotCXJldHVybiBjb3B5X3RvX3VzZXIocmV0aW5mbywmdG1wLHNpemVvZigqcmV0aW5mbykpID8gLUVGQVVMVCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICogbmV3X2luZm8pCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKLQlzdHJ1Y3QgbWNmX3NlcmlhbCBvbGRfaW5mbzsKLQlpbnQgCXJldHZhbCA9IDA7Ci0KLQlpZiAoIW5ld19pbmZvKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jb2xkX2luZm8gPSAqaW5mbzsKLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlpZiAoKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWRfYmFzZSkgfHwKLQkJICAgIChuZXdfc2VyaWFsLnR5cGUgIT0gaW5mby0+dHlwZSkgfHwKLQkJICAgIChuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IGluZm8tPmNsb3NlX2RlbGF5KSB8fAotCQkgICAgKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPQotCQkgICAgIChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQotCQkJcmV0dXJuIC1FUEVSTTsKLQkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8Ci0JCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOwotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7Ci0JCWdvdG8gY2hlY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaWYgKGluZm8tPmNvdW50ID4gMSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCS8qCi0JICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgotCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KLQkgKi8KLQotCWluZm8tPmJhdWRfYmFzZSA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlOwotCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAotCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwotCWluZm8tPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7Ci0JaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5OwotCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0OwotCi1jaGVja19hbmRfZXhpdDoKLQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbwotICoKLSAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKLSAqIAkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAotICogCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCi0gKiAJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKLSAqIAkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQotICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4gCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbywgdW5zaWduZWQgaW50ICp2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSp1YXJ0cDsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQl1bnNpZ25lZCBjaGFyCQlzdGF0dXM7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdWFydHAgPSBpbmZvLT5hZGRyOwotCXN0YXR1cyA9ICh1YXJ0cFtNQ0ZVQVJUX1VTUl0gJiBNQ0ZVQVJUX1VTUl9UWEVNUFRZKSA/IFRJT0NTRVJfVEVNVCA6IDA7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHB1dF91c2VyKHN0YXR1cyx2YWx1ZSk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgc2VuZHMgYSBicmVhayBjaGFyYWN0ZXIgb3V0IHRoZSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgc2VuZF9icmVhaygJc3RydWN0IG1jZl9zZXJpYWwgKiBpbmZvLCBpbnQgZHVyYXRpb24pCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqdWFydHA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlpZiAoIWluZm8tPmFkZHIpCi0JCXJldHVybjsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCXVhcnRwID0gaW5mby0+YWRkcjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURCUkVBS1NUQVJUOwotCXNjaGVkdWxlX3RpbWVvdXQoZHVyYXRpb24pOwotCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX0NNREJSRUFLU1RPUDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWNmcnNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtY2Zfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWNmcnNfaW9jdGwiKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiBtY2Zyc19nZXRzaWduYWxzKGluZm8pOwotfQotCi1zdGF0aWMgaW50IG1jZnJzX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtY2Zfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQgcnRzID0gLTEsIGR0ciA9IC0xOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19pb2N0bCIpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKHNldCAmIFRJT0NNX1JUUykKLQkJcnRzID0gMTsKLQlpZiAoc2V0ICYgVElPQ01fRFRSKQotCQlkdHIgPSAxOwotCWlmIChjbGVhciAmIFRJT0NNX1JUUykKLQkJcnRzID0gMDsKLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCi0JCWR0ciA9IDA7Ci0KLQltY2Zyc19zZXRzaWduYWxzKGluZm8sIGR0ciwgcnRzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1jZnJzX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JaW50IHJldHZhbCwgZXJyb3I7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1jZnJzX2lvY3RsIikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCi0JICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1dJTEQpICAmJgotCSAgICAoY21kICE9IFRJT0NTRVJTV0lMRCkgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkpIHsKLQkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkgICAgcmV0dXJuIC1FSU87Ci0JfQotCQotCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgVENTQlJLOgkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KLQkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKLQkJCWlmIChyZXR2YWwpCi0JCQkJcmV0dXJuIHJldHZhbDsKLQkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKLQkJCWlmICghYXJnKQotCQkJCXNlbmRfYnJlYWsoaW5mbywgSFovNCk7CS8qIDEvNCBzZWNvbmQgKi8KLQkJCXJldHVybiAwOwotCQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KLQkJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKLQkJCWlmIChyZXR2YWwpCi0JCQkJcmV0dXJuIHJldHZhbDsKLQkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKLQkJCXNlbmRfYnJlYWsoaW5mbywgYXJnID8gYXJnKihIWi8xMCkgOiBIWi80KTsKLQkJCXJldHVybiAwOwotCQljYXNlIFRJT0NHU0VSSUFMOgotCQkJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpKQotCQkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywKLQkJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCQlyZXR1cm4gc2V0X3NlcmlhbF9pbmZvKGluZm8sCi0JCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKikgYXJnKTsKLQkJY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgaW50KSkpCi0JCQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCAodW5zaWduZWQgaW50ICopIGFyZyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJY2FzZSBUSU9DU0VSR1NUUlVDVDoKLQkJCWVycm9yID0gY29weV90b191c2VyKChzdHJ1Y3QgbWNmX3NlcmlhbCAqKSBhcmcsCi0JCQkJICAgIGluZm8sIHNpemVvZihzdHJ1Y3QgbWNmX3NlcmlhbCkpOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCQkKLSNpZmRlZiBUSU9DU0VUNDIyCi0JCWNhc2UgVElPQ1NFVDQyMjogewotCQkJdW5zaWduZWQgaW50IHZhbDsKLQkJCWdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOwotCQkJbWNmX3NldHBhKE1DRlBQX1BBMTEsICh2YWwgPyAwIDogTUNGUFBfUEExMSkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBUSU9DR0VUNDIyOiB7Ci0JCQl1bnNpZ25lZCBpbnQgdmFsOwotCQkJdmFsID0gKG1jZl9nZXRwYSgpICYgTUNGUFBfUEExMSkgPyAwIDogMTsKLQkJCXB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCAqKSBhcmcpOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1jZnJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IG1jZl9zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1jZl9zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkJcmV0dXJuOwotCi0JbWNmcnNfY2hhbmdlX3NwZWVkKGluZm8pOwotCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJbWNmcnNfc2V0c2lnbmFscyhpbmZvLCAtMSwgMSk7Ci0jaWYgMAotCQltY2Zyc19zdGFydCh0dHkpOwotI2VuZGlmCi0JfQotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBtY2Zyc19jbG9zZSgpCi0gKiAKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQgZ2V0cyBjbG9zZWQuICBGaXJzdCwgd2UKLSAqIHdhaXQgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQuICBUaGVuLCB3ZSB1bmxpbmsgaXRzCi0gKiBTIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQotICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCBtY2Zyc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqdWFydHA7Ci0Jc3RydWN0IG1jZl9zZXJpYWwJKmluZm8gPSAoc3RydWN0IG1jZl9zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19jbG9zZSIpKQotCQlyZXR1cm47Ci0JCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQkKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50aygibWNmcnNfY2xvc2UgdHR5UyVkLCBjb3VudCA9ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0jZW5kaWYKLQlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7Ci0JCS8qCi0JCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5Ci0JCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCXByaW50aygiTUNGUlM6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCBpcyAxLCAiCi0JCSAgICAgICAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKLQkJaW5mby0+Y291bnQgPSAxOwotCX0KLQlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKLQkJcHJpbnRrKCJNQ0ZSUzogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciB0dHlTJWQ6ICVkXG4iLAotCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotCQlpbmZvLT5jb3VudCA9IDA7Ci0JfQotCWlmIChpbmZvLT5jb3VudCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0xPU0lORzsKLQotCS8qCi0JICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCi0JICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KLQkgKi8KLQl0dHktPmNsb3NpbmcgPSAxOwotCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKLQkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQotCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCi0JICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCi0JICovCi0JaW5mby0+aW1yICY9IH5NQ0ZVQVJUX1VJUl9SWFJFQURZOwotCXVhcnRwID0gaW5mby0+YWRkcjsKLQl1YXJ0cFtNQ0ZVQVJUX1VJTVJdID0gaW5mby0+aW1yOwotCi0jaWYgMAotCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGtlZXAgdGhpcyBlbmFibGVkIGZvciBjb25zb2xlPz8gKi8KLQlpZiAobWNmcnNfY29uc29sZV9pbml0ZWQgJiYgKG1jZnJzX2NvbnNvbGVfcG9ydCA9PSBpbmZvLT5saW5lKSkgewotCQkvKiBEbyBub3QgZGlzYWJsZSB0aGUgVUFSVCAqLyA7Ci0JfSBlbHNlCi0jZW5kaWYKLQlzaHV0ZG93bihpbmZvKTsKLQltY2Zyc19mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQkKLQl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT5wb3J0LnR0eSA9IE5VTEw7Ci0jaWYgMAkKLQlpZiAodHR5LT5sZGlzYy5udW0gIT0gbGRpc2NzW05fVFRZXS5udW0pIHsKLQkJaWYgKHR0eS0+bGRpc2MuY2xvc2UpCi0JCQkodHR5LT5sZGlzYy5jbG9zZSkodHR5KTsKLQkJdHR5LT5sZGlzYyA9IGxkaXNjc1tOX1RUWV07Ci0JCXR0eS0+dGVybWlvcy0+Y19saW5lID0gTl9UVFk7Ci0JCWlmICh0dHktPmxkaXNjLm9wZW4pCi0JCQkodHR5LT5sZGlzYy5vcGVuKSh0dHkpOwotCX0KLSNlbmRpZgkKLQlpZiAoaW5mby0+YmxvY2tlZF9vcGVuKSB7Ci0JCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgewotCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhpbmZvLT5jbG9zZV9kZWxheSkpOwotCQl9Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLQl9Ci0JaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFfEFTWU5DX0NMT1NJTkcpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogbWNmcnNfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5Ci0gKi8KLXN0YXRpYyB2b2lkCi1tY2Zyc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCi17Ci0jaWZkZWYJQ09ORklHX001MjcyCi0jZGVmaW5lCU1DRjUyNzJfRklGT19TSVpFCTI1CQkvKiBmaWZvIHNpemUgKyBzaGlmdCByZWcgKi8KLQotCXN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdWFydHA7Ci0JdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGZpZm9fdGltZSwgY2hhcl90aW1lLCBmaWZvX2NudDsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWNmcnNfd2FpdF91bnRpbF9zZW50IikpCi0JCXJldHVybjsKLQotCW9yaWdfamlmZmllcyA9IGppZmZpZXM7Ci0KLQkvKgotCSAqIFNldCB0aGUgY2hlY2sgaW50ZXJ2YWwgdG8gYmUgMS81IG9mIHRoZSBhcHByb3hpbWF0ZSB0aW1lCi0JICogdG8gc2VuZCB0aGUgZW50aXJlIGZpZm8sIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKLQkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCi0JICoKLQkgKiBOb3RlOiB3ZSBoYXZlIHRvIHVzZSBwcmV0dHkgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkKLQkgKiB0aGUgTklTVC1QQ1RTLgotCSAqLwotCWxvY2tfa2VybmVsKCk7Ci0KLQlmaWZvX3RpbWUgPSAoTUNGNTI3Ml9GSUZPX1NJWkUgKiBIWiAqIDEwKSAvIGluZm8tPmJhdWQ7Ci0JY2hhcl90aW1lID0gZmlmb190aW1lIC8gNTsKLQlpZiAoY2hhcl90aW1lID09IDApCi0JCWNoYXJfdGltZSA9IDE7Ci0JaWYgKHRpbWVvdXQgJiYgdGltZW91dCA8IGNoYXJfdGltZSkKLQkJY2hhcl90aW1lID0gdGltZW91dDsKLQotCS8qCi0JICogQ2xhbXAgdGhlIHRpbWVvdXQgcGVyaW9kIGF0IDIgKiB0aGUgdGltZSB0byBlbXB0eSB0aGUKLQkgKiBmaWZvLiAgSnVzdCB0byBiZSBzYWZlLCBzZXQgdGhlIG1pbmltdW0gYXQgLjUgc2Vjb25kcy4KLQkgKi8KLQlmaWZvX3RpbWUgKj0gMjsKLQlpZiAoZmlmb190aW1lIDwgKEhaLzIpKQotCQlmaWZvX3RpbWUgPSBIWi8yOwotCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gZmlmb190aW1lKQotCQl0aW1lb3V0ID0gZmlmb190aW1lOwotCi0JLyoKLQkgKiBBY2NvdW50IGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBVQVJUCi0JICogdHJhbnNtaXR0ZXIgRklGTyBwbHVzIGFueSBieXRlIGJlaW5nIHNoaWZ0ZWQgb3V0LgotCSAqLwotCXVhcnRwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaW5mby0+YWRkcjsKLQlmb3IgKDs7KSB7Ci0JCWZpZm9fY250ID0gKHVhcnRwW01DRlVBUlRfVVRGXSAmIE1DRlVBUlRfVVRGX1RYQik7Ci0JCWlmICgodWFydHBbTUNGVUFSVF9VU1JdICYgKE1DRlVBUlRfVVNSX1RYUkVBRFl8Ci0JCQkJTUNGVUFSVF9VU1JfVFhFTVBUWSkpID09Ci0JCQlNQ0ZVQVJUX1VTUl9UWFJFQURZKQotCQkJZmlmb19jbnQrKzsKLQkJaWYgKGZpZm9fY250ID09IDApCi0JCQlicmVhazsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0JCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCi0JCQlicmVhazsKLQl9Ci0JdW5sb2NrX2tlcm5lbCgpOwotI2Vsc2UKLQkvKgotCSAqIEZvciB0aGUgb3RoZXIgY29sZGZpcmUgbW9kZWxzLCBhc3N1bWUgYWxsIGRhdGEgaGFzIGJlZW4gc2VudAotCSAqLwotI2VuZGlmCi19Ci0KLS8qCi0gKiBtY2Zyc19oYW5ndXAoKSAtLS0gY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgotICovCi12b2lkIG1jZnJzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtY2Zfc2VyaWFsICogaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJtY2Zyc19oYW5ndXAiKSkKLQkJcmV0dXJuOwotCQotCW1jZnJzX2ZsdXNoX2J1ZmZlcih0dHkpOwotCXNodXRkb3duKGluZm8pOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT5jb3VudCA9IDA7Ci0JaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JaW5mby0+cG9ydC50dHkgPSBOVUxMOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogbWNmcnNfb3BlbigpIGFuZCBmcmllbmRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIGludCBibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAotCQkJICAgc3RydWN0IG1jZl9zZXJpYWwgKmluZm8pCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JaW50CXJldHZhbDsKLQlpbnQJZG9fY2xvY2FsID0gMDsKLQotCS8qCi0JICogSWYgdGhlIGRldmljZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNsb3NlZCwgdGhlbiBibG9jawotCSAqIHVudGlsIGl0J3MgZG9uZSwgYW5kIHRoZW4gdHJ5IGFnYWluLgotCSAqLwotCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0jaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKLQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKLQkJCXJldHVybiAtRUFHQUlOOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotI2Vsc2UKLQkJcmV0dXJuIC1FQUdBSU47Ci0jZW5kaWYKLQl9Ci0JCi0JLyoKLQkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAotCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KLQkgKi8KLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAotCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCWRvX2Nsb2NhbCA9IDE7Ci0KLQkvKgotCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCi0JICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KLQkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0Ci0JICogbWNmcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCi0JICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KLQkgKi8KLQlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50aygiYmxvY2tfdGlsX3JlYWR5IGJlZm9yZSBibG9jazogdHR5UyVkLCBjb3VudCA9ICVkXG4iLAotCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0jZW5kaWYKLQlpbmZvLT5jb3VudC0tOwotCWluZm8tPmJsb2NrZWRfb3BlbisrOwotCXdoaWxlICgxKSB7Ci0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCW1jZnJzX3NldHNpZ25hbHMoaW5mbywgMSwgMSk7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8Ci0JCSAgICAhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7Ci0jaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKLQkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCi0JCQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJCWVsc2UKLQkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CQotI2Vsc2UKLQkJCXJldHZhbCA9IC1FQUdBSU47Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKLQkJICAgIChkb19jbG9jYWwgfHwgKG1jZnJzX2dldHNpZ25hbHMoaW5mbykgJiBUSU9DTV9DRCkpKQotCQkJYnJlYWs7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCQlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBibG9ja2luZzogdHR5UyVkLCBjb3VudCA9ICVkXG4iLAotCQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotI2VuZGlmCi0JCXNjaGVkdWxlKCk7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCWluZm8tPmNvdW50Kys7Ci0JaW5mby0+YmxvY2tlZF9vcGVuLS07Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQlwcmludGsoImJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5UyVkLCBjb3VudCA9ICVkXG4iLAotCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0jZW5kaWYKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JcmV0dXJuIDA7Ci19CQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gSXQKLSAqIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBzZXJpYWwgcG9ydCwgbGlua2luZyBpbiBpdHMgc3RydWN0dXJlIGludG8KLSAqIHRoZSBJUlEgY2hhaW4uICAgSXQgYWxzbyBwZXJmb3JtcyB0aGUgc2VyaWFsLXNwZWNpZmljCi0gKiBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCi0gKi8KLWludCBtY2Zyc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKLXsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbzsKLQlpbnQgCQkJcmV0dmFsLCBsaW5lOwotCi0JbGluZSA9IHR0eS0+aW5kZXg7Ci0JaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTlJfUE9SVFMpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpbmZvID0gbWNmcnNfdGFibGUgKyBsaW5lOwotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWNmcnNfb3BlbiIpKQotCQlyZXR1cm4gLUVOT0RFVjsKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCXByaW50aygibWNmcnNfb3BlbiAlcywgY291bnQgPSAlZFxuIiwgdHR5LT5uYW1lLCBpbmZvLT5jb3VudCk7Ci0jZW5kaWYKLQlpbmZvLT5jb3VudCsrOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotCWluZm8tPnBvcnQudHR5ID0gdHR5OwotCi0JLyoKLQkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAotCSAqLwotCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOwotCWlmIChyZXR2YWwpIHsKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCQlwcmludGsoIm1jZnJzX29wZW4gcmV0dXJuaW5nIGFmdGVyIGJsb2NrX3RpbF9yZWFkeSB3aXRoICVkXG4iLAotCQkgICAgICAgcmV0dmFsKTsKLSNlbmRpZgotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKCJtY2Zyc19vcGVuICVzIHN1Y2Nlc3NmdWwuLi5cbiIsIHR0eS0+bmFtZSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCUJhc2VkIG9uIHRoZSBsaW5lIG51bWJlciBzZXQgdXAgdGhlIGludGVybmFsIGludGVycnVwdCBzdHVmZi4KLSAqLwotc3RhdGljIHZvaWQgbWNmcnNfaXJxaW5pdChzdHJ1Y3QgbWNmX3NlcmlhbCAqaW5mbykKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19NNTI3MikKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSppY3JwOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJKnBvcnRwOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCi0JdWFydHAgPSBpbmZvLT5hZGRyOwotCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMik7Ci0KLQlzd2l0Y2ggKGluZm8tPmxpbmUpIHsKLQljYXNlIDA6Ci0JCSppY3JwID0gMHhlMDAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQkqaWNycCA9IDB4MGUwMDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50aygiTUNGUlM6IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBVQVJUICVkIGludGVycnVwdD9cbiIsCi0JCQlpbmZvLT5saW5lKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEVuYWJsZSB0aGUgb3V0cHV0IGxpbmVzIGZvciB0aGUgc2VyaWFsIHBvcnRzICovCi0JcG9ydHAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fUEJDTlQpOwotCSpwb3J0cCA9ICgqcG9ydHAgJiB+MHgwMDAwMDBmZikgfCAweDAwMDAwMDU1OwotCXBvcnRwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX1BEQ05UKTsKLQkqcG9ydHAgPSAoKnBvcnRwICYgfjB4MDAwMDAzZmMpIHwgMHgwMDAwMDJhODsKLSNlbGlmIGRlZmluZWQoQ09ORklHX001MjN4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3eCkgfHwgZGVmaW5lZChDT05GSUdfTTUyOHgpCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaWNycCwgKnVhcnRwOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmltcnA7Ci0KLQl1YXJ0cCA9IGluZm8tPmFkZHI7Ci0KLQlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGSUNNX0lOVEMwICsKLQkJTUNGSU5UQ19JQ1IwICsgTUNGSU5UX1VBUlQwICsgaW5mby0+bGluZSk7Ci0JKmljcnAgPSAweDMwICsgaW5mby0+bGluZTsgLyogbGV2ZWwgNiwgbGluZSBiYXNlZCBwcmlvcml0eSAqLwotCi0JaW1ycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRklDTV9JTlRDMCArCi0JCU1DRklOVENfSU1STCk7Ci0JKmltcnAgJj0gfigoMSA8PCAoaW5mby0+aXJxIC0gTUNGSU5UX1ZFQ0JBU0UpKSB8IDEpOwotI2lmIGRlZmluZWQoQ09ORklHX001Mjd4KQotCXsKLQkJLyoKLQkJICogRXh0ZXJuYWwgUGluIE1hc2sgU2V0dGluZyAmIEVuYWJsZSBFeHRlcm5hbCBQaW4gZm9yIEludGVyZmFjZQotCQkgKiBtcmNiaXNAYWxpY2Vwb3N0YS5pdAotICAgICAgICAJICovCi0JCXUxNiAqc2VycGluX2VuYWJsZV9tYXNrOwotCQlzZXJwaW5fZW5hYmxlX21hc2sgPSAodTE2ICopIChNQ0ZfSVBTQkFSICsgTUNGX0dQSU9fUEFSX1VBUlQpOwotCQlpZiAoaW5mby0+bGluZSA9PSAwKQotCQkJKnNlcnBpbl9lbmFibGVfbWFzayB8PSBVQVJUMF9FTkFCTEVfTUFTSzsKLQkJZWxzZSBpZiAoaW5mby0+bGluZSA9PSAxKQotCQkJKnNlcnBpbl9lbmFibGVfbWFzayB8PSBVQVJUMV9FTkFCTEVfTUFTSzsKLQkJZWxzZSBpZiAoaW5mby0+bGluZSA9PSAyKQotCQkJKnNlcnBpbl9lbmFibGVfbWFzayB8PSBVQVJUMl9FTkFCTEVfTUFTSzsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NNTI4eCkKLQkvKiBtYWtlIHN1cmUgUFVBUEFSIGlzIHNldCBmb3IgVUFSVDAgYW5kIFVBUlQxICovCi0JaWYgKGluZm8tPmxpbmUgPCAyKSB7Ci0JCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBvcnRwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGNTI4Ml9HUElPX1BVQVBBUik7Ci0JCSpwb3J0cCB8PSAoMHgwMyA8PCAoaW5mby0+bGluZSAqIDIpKTsKLQl9Ci0jZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX001MjB4KQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmljcnAsICp1YXJ0cDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICppbXJwOwotCi0JdWFydHAgPSBpbmZvLT5hZGRyOwotCi0JaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfTUJBUiArIE1DRklDTV9JTlRDMCArCi0JCU1DRklOVENfSUNSMCArIE1DRklOVF9VQVJUMCArIGluZm8tPmxpbmUpOwotCSppY3JwID0gMHgwMzsKLQotCWltcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZJQ01fSU5UQzAgKwotCQlNQ0ZJTlRDX0lNUkwpOwotCSppbXJwICY9IH4oKDEgPDwgKGluZm8tPmlycSAtIE1DRklOVF9WRUNCQVNFKSkgfCAxKTsKLQlpZiAoaW5mby0+bGluZSA8IDIpIHsKLQkJdW5zaWduZWQgc2hvcnQgKnVhcnRfcGFyOwotCQl1YXJ0X3BhciA9ICh1bnNpZ25lZCBzaG9ydCAqKShNQ0ZfSVBTQkFSICsgTUNGX0dQSU9fUEFSX1VBUlQpOwotCQlpZiAoaW5mby0+bGluZSA9PSAwKQotCQkJKnVhcnRfcGFyIHw9ICBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVRYRDAKLQkJCQkgIHwgTUNGX0dQSU9fUEFSX1VBUlRfUEFSX1VSWEQwOwotCQllbHNlIGlmIChpbmZvLT5saW5lID09IDEpCi0JCQkqdWFydF9wYXIgfD0gIE1DRl9HUElPX1BBUl9VQVJUX1BBUl9VVFhEMQotCQkJCSAgfCBNQ0ZfR1BJT19QQVJfVUFSVF9QQVJfVVJYRDE7Ci0JCX0gZWxzZSBpZiAoaW5mby0+bGluZSA9PSAyKSB7Ci0JCQl1bnNpZ25lZCBjaGFyICpmZWNpMmNfcGFyOwotCQkJZmVjaTJjX3BhciA9ICh1bnNpZ25lZCBjaGFyICopKE1DRl9JUFNCQVIgKyAgTUNGX0dQSU9fUEFSX0ZFQ0kyQyk7Ci0JCQkqZmVjaTJjX3BhciAmPSB+MHgwRjsKLQkJCSpmZWNpMmNfcGFyIHw9ICBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TQ0xfVVRYRDIKLQkJCQkgICAgfCBNQ0ZfR1BJT19QQVJfRkVDSTJDX1BBUl9TREFfVVJYRDI7Ci0JCX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX001MzJ4KQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnVhcnRwOwotCXVhcnRwID0gaW5mby0+YWRkcjsKLQlzd2l0Y2ggKGluZm8tPmxpbmUpIHsKLQljYXNlIDA6Ci0JCU1DRl9JTlRDMF9JQ1IyNiA9IDB4MzsKLQkJTUNGX0lOVEMwX0NJTVIgPSAyNjsKLQkJLyogR1BJTyBpbml0aWFsaXphdGlvbiAqLwotCQlNQ0ZfR1BJT19QQVJfVUFSVCB8PSAweDAwMEY7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJTUNGX0lOVEMwX0lDUjI3ID0gMHgzOwotCQlNQ0ZfSU5UQzBfQ0lNUiA9IDI3OwotCQkvKiBHUElPIGluaXRpYWxpemF0aW9uICovCi0JCU1DRl9HUElPX1BBUl9VQVJUIHw9IDB4MEZGMDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlNQ0ZfSU5UQzBfSUNSMjggPSAweDM7Ci0JCU1DRl9JTlRDMF9DSU1SID0gMjg7Ci0JCS8qIEdQSU9zIGFsc28gbXVzdCBiZSBpbml0YWxpemVkLCBkZXBlbmRzIG9uIGJvYXJkICovCi0JCWJyZWFrOwotCX0KLSNlbHNlCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqaWNycCwgKnVhcnRwOwotCi0Jc3dpdGNoIChpbmZvLT5saW5lKSB7Ci0JY2FzZSAwOgotCQlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGU0lNX1VBUlQxSUNSKTsKLQkJKmljcnAgPSAvKk1DRlNJTV9JQ1JfQVVUT1ZFQyB8Ki8gTUNGU0lNX0lDUl9MRVZFTDYgfAotCQkJTUNGU0lNX0lDUl9QUkkxOwotCQltY2Zfc2V0aW1yKG1jZl9nZXRpbXIoKSAmIH5NQ0ZTSU1fSU1SX1VBUlQxKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsgTUNGU0lNX1VBUlQySUNSKTsKLQkJKmljcnAgPSAvKk1DRlNJTV9JQ1JfQVVUT1ZFQyB8Ki8gTUNGU0lNX0lDUl9MRVZFTDYgfAotCQkJTUNGU0lNX0lDUl9QUkkyOwotCQltY2Zfc2V0aW1yKG1jZl9nZXRpbXIoKSAmIH5NQ0ZTSU1fSU1SX1VBUlQyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCJNQ0ZSUzogZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIFVBUlQgJWQgaW50ZXJydXB0P1xuIiwKLQkJCWluZm8tPmxpbmUpOwotCQlyZXR1cm47Ci0JfQotCi0JdWFydHAgPSBpbmZvLT5hZGRyOwotCXVhcnRwW01DRlVBUlRfVUlWUl0gPSBpbmZvLT5pcnE7Ci0jZW5kaWYKLQotCS8qIENsZWFyIG1hc2ssIHNvIG5vIHN1cnByaXNlIGludGVycnVwdHMuICovCi0JdWFydHBbTUNGVUFSVF9VSU1SXSA9IDA7Ci0KLQlpZiAocmVxdWVzdF9pcnEoaW5mby0+aXJxLCBtY2Zyc19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JICAgICJDb2xkRmlyZSBVQVJUIiwgTlVMTCkpIHsKLQkJcHJpbnRrKCJNQ0ZSUzogVW5hYmxlIHRvIGF0dGFjaCBDb2xkRmlyZSBVQVJUICVkIGludGVycnVwdCAiCi0JCQkidmVjdG9yPSVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotCX0KLQotCXJldHVybjsKLX0KLQotCi1jaGFyICptY2Zyc19kcml2ZXJuYW1lID0gIkNvbGRGaXJlIGludGVybmFsIFVBUlQgc2VyaWFsIGRyaXZlciB2ZXJzaW9uIDEuMDBcbiI7Ci0KLQotLyoKLSAqIFNlcmlhbCBzdGF0cyByZXBvcnRpbmcuLi4KLSAqLwotaW50IG1jZnJzX3JlYWRwcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JCSAgICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtY2Zfc2VyaWFsCSppbmZvOwotCWNoYXIJCQlzdHJbMjBdOwotCWludAkJCWxlbiwgc2lncywgaTsKLQotCWxlbiA9IHNwcmludGYocGFnZSwgbWNmcnNfZHJpdmVybmFtZSk7Ci0JZm9yIChpID0gMDsgKGkgPCBOUl9QT1JUUyk7IGkrKykgewotCQlpbmZvID0gJm1jZnJzX3RhYmxlW2ldOwotCQlsZW4gKz0gc3ByaW50ZigocGFnZSArIGxlbiksICIlZDogcG9ydDoleCBpcnE9JWQgYmF1ZDolZCAiLAotCQkJaSwgKHVuc2lnbmVkIGludCkgaW5mby0+YWRkciwgaW5mby0+aXJxLCBpbmZvLT5iYXVkKTsKLQkJaWYgKGluZm8tPnN0YXRzLnJ4IHx8IGluZm8tPnN0YXRzLnR4KQotCQkJbGVuICs9IHNwcmludGYoKHBhZ2UgKyBsZW4pLCAidHg6JWQgcng6JWQgIiwKLQkJCWluZm8tPnN0YXRzLnR4LCBpbmZvLT5zdGF0cy5yeCk7Ci0JCWlmIChpbmZvLT5zdGF0cy5yeGZyYW1pbmcpCi0JCQlsZW4gKz0gc3ByaW50ZigocGFnZSArIGxlbiksICJmZTolZCAiLAotCQkJaW5mby0+c3RhdHMucnhmcmFtaW5nKTsKLQkJaWYgKGluZm8tPnN0YXRzLnJ4cGFyaXR5KQotCQkJbGVuICs9IHNwcmludGYoKHBhZ2UgKyBsZW4pLCAicGU6JWQgIiwKLQkJCWluZm8tPnN0YXRzLnJ4cGFyaXR5KTsKLQkJaWYgKGluZm8tPnN0YXRzLnJ4YnJlYWspCi0JCQlsZW4gKz0gc3ByaW50ZigocGFnZSArIGxlbiksICJicms6JWQgIiwKLQkJCWluZm8tPnN0YXRzLnJ4YnJlYWspOwotCQlpZiAoaW5mby0+c3RhdHMucnhvdmVycnVuKQotCQkJbGVuICs9IHNwcmludGYoKHBhZ2UgKyBsZW4pLCAib2U6JWQgIiwKLQkJCWluZm8tPnN0YXRzLnJ4b3ZlcnJ1bik7Ci0KLQkJc3RyWzBdID0gc3RyWzFdID0gMDsKLQkJaWYgKChzaWdzID0gbWNmcnNfZ2V0c2lnbmFscyhpbmZvKSkpIHsKLQkJCWlmIChzaWdzICYgVElPQ01fUlRTKQotCQkJCXN0cmNhdChzdHIsICJ8UlRTIik7Ci0JCQlpZiAoc2lncyAmIFRJT0NNX0NUUykKLQkJCQlzdHJjYXQoc3RyLCAifENUUyIpOwotCQkJaWYgKHNpZ3MgJiBUSU9DTV9EVFIpCi0JCQkJc3RyY2F0KHN0ciwgInxEVFIiKTsKLQkJCWlmIChzaWdzICYgVElPQ01fQ0QpCi0JCQkJc3RyY2F0KHN0ciwgInxDRCIpOwotCQl9Ci0KLQkJbGVuICs9IHNwcmludGYoKHBhZ2UgKyBsZW4pLCAiJXNcbiIsICZzdHJbMV0pOwotCX0KLQotCXJldHVybihsZW4pOwotfQotCi0KLS8qIEZpbmFsbHksIHJvdXRpbmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRyaXZlci4gKi8KLQotc3RhdGljIHZvaWQgc2hvd19zZXJpYWxfdmVyc2lvbih2b2lkKQotewotCXByaW50ayhtY2Zyc19kcml2ZXJuYW1lKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBtY2Zyc19vcHMgPSB7Ci0JLm9wZW4gPSBtY2Zyc19vcGVuLAotCS5jbG9zZSA9IG1jZnJzX2Nsb3NlLAotCS53cml0ZSA9IG1jZnJzX3dyaXRlLAotCS5mbHVzaF9jaGFycyA9IG1jZnJzX2ZsdXNoX2NoYXJzLAotCS53cml0ZV9yb29tID0gbWNmcnNfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0gbWNmcnNfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9idWZmZXIgPSBtY2Zyc19mbHVzaF9idWZmZXIsCi0JLmlvY3RsID0gbWNmcnNfaW9jdGwsCi0JLnRocm90dGxlID0gbWNmcnNfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPSBtY2Zyc191bnRocm90dGxlLAotCS5zZXRfdGVybWlvcyA9IG1jZnJzX3NldF90ZXJtaW9zLAotCS5zdG9wID0gbWNmcnNfc3RvcCwKLQkuc3RhcnQgPSBtY2Zyc19zdGFydCwKLQkuaGFuZ3VwID0gbWNmcnNfaGFuZ3VwLAotCS5yZWFkX3Byb2MgPSBtY2Zyc19yZWFkcHJvYywKLQkud2FpdF91bnRpbF9zZW50ID0gbWNmcnNfd2FpdF91bnRpbF9zZW50LAotIAkudGlvY21nZXQgPSBtY2Zyc190aW9jbWdldCwKLQkudGlvY21zZXQgPSBtY2Zyc190aW9jbXNldCwKLX07Ci0KLS8qIG1jZnJzX2luaXQgaW5pdHMgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBfX2luaXQKLW1jZnJzX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbWNmX3NlcmlhbAkqaW5mbzsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlpbnQJCQlpOwotCi0JLyogU2V0dXAgYmFzZSBoYW5kbGVyLCBhbmQgdGltZXIgdGFibGUuICovCi0jaWZkZWYgTUNGUFBfRENEMAotCWluaXRfdGltZXIoJm1jZnJzX3RpbWVyX3N0cnVjdCk7Ci0JbWNmcnNfdGltZXJfc3RydWN0LmZ1bmN0aW9uID0gbWNmcnNfdGltZXI7Ci0JbWNmcnNfdGltZXJfc3RydWN0LmRhdGEgPSAwOwotCW1jZnJzX3RpbWVyX3N0cnVjdC5leHBpcmVzID0gamlmZmllcyArIEhaLzI1OwotCWFkZF90aW1lcigmbWNmcnNfdGltZXJfc3RydWN0KTsKLQltY2Zyc19wcHN0YXR1cyA9IG1jZl9nZXRwcGRhdGEoKSAmIChNQ0ZQUF9EQ0QwIHwgTUNGUFBfRENEMSk7Ci0jZW5kaWYKLQltY2Zyc19zZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7Ci0JaWYgKCFtY2Zyc19zZXJpYWxfZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCi0JbWNmcnNfc2VyaWFsX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQltY2Zyc19zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eVMiOwotCW1jZnJzX3NlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gIm1jZnNlcmlhbCI7Ci0JbWNmcnNfc2VyaWFsX2RyaXZlci0+bWFqb3IgPSBUVFlfTUFKT1I7Ci0JbWNmcnNfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSA2NDsKLQltY2Zyc19zZXJpYWxfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQltY2Zyc19zZXJpYWxfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOwotCW1jZnJzX3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKLQotCW1jZnJzX3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KLQkJbWNmcnNfY29uc29sZV9jYmF1ZCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7Ci0JbWNmcnNfc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwotCi0JdHR5X3NldF9vcGVyYXRpb25zKG1jZnJzX3NlcmlhbF9kcml2ZXIsICZtY2Zyc19vcHMpOwotCi0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIobWNmcnNfc2VyaWFsX2RyaXZlcikpIHsKLQkJcHJpbnRrKCJNQ0ZSUzogQ291bGRuJ3QgcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7Ci0JCXB1dF90dHlfZHJpdmVyKG1jZnJzX3NlcmlhbF9kcml2ZXIpOwotCQlyZXR1cm4oLUVCVVNZKTsKLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKgotCSAqCUNvbmZpZ3VyZSBhbGwgdGhlIGF0dGFjaGVkIHNlcmlhbCBwb3J0cy4KLQkgKi8KLQlmb3IgKGkgPSAwLCBpbmZvID0gbWNmcnNfdGFibGU7IChpIDwgTlJfUE9SVFMpOyBpKyssIGluZm8rKykgewotCQlpbmZvLT5tYWdpYyA9IFNFUklBTF9NQUdJQzsKLQkJaW5mby0+bGluZSA9IGk7Ci0JCWluZm8tPnBvcnQudHR5ID0gTlVMTDsKLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSAxNjsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1MDsKLQkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAwMDsKLQkJaW5mby0+eF9jaGFyID0gMDsKLQkJaW5mby0+ZXZlbnQgPSAwOwotCQlpbmZvLT5jb3VudCA9IDA7Ci0JCWluZm8tPmJsb2NrZWRfb3BlbiA9IDA7Ci0JCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBtY2Zyc19vZmZpbnRyKTsKLQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWVfaGFuZ3VwLCBkb19zZXJpYWxfaGFuZ3VwKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0KLQkJaW5mby0+aW1yID0gMDsKLQkJbWNmcnNfc2V0c2lnbmFscyhpbmZvLCAwLCAwKTsKLQkJbWNmcnNfaXJxaW5pdChpbmZvKTsKLQotCQlwcmludGsoInR0eVMlZCBhdCAweCUwNHggKGlycSA9ICVkKSIsIGluZm8tPmxpbmUsCi0JCQkodW5zaWduZWQgaW50KSBpbmZvLT5hZGRyLCBpbmZvLT5pcnEpOwotCQlwcmludGsoIiBpcyBhIGJ1aWx0aW4gQ29sZEZpcmUgVUFSVFxuIik7Ci0JfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChtY2Zyc19pbml0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsIENvbnNvbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICoJUXVpY2sgYW5kIGRpcnR5IFVBUlQgaW5pdGlhbGl6YXRpb24sIGZvciBjb25zb2xlIG91dHB1dC4KLSAqLwotCi12b2lkIG1jZnJzX2luaXRfY29uc29sZSh2b2lkKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCXVuc2lnbmVkIGludAkJY2xrOwotCi0JLyoKLQkgKglSZXNldCBVQVJULCBnZXQgaXQgaW50byBrbm93biBzdGF0ZS4uLgotCSAqLwotCXVhcnRwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSICsKLQkJKG1jZnJzX2NvbnNvbGVfcG9ydCA/IE1DRlVBUlRfQkFTRTIgOiBNQ0ZVQVJUX0JBU0UxKSk7Ci0KLQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVFJYOyAgLyogcmVzZXQgUlggKi8KLQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVFRYOyAgLyogcmVzZXQgVFggKi8KLQl1YXJ0cFtNQ0ZVQVJUX1VDUl0gPSBNQ0ZVQVJUX1VDUl9DTURSRVNFVE1SUFRSOyAgLyogcmVzZXQgTVIgcG9pbnRlciAqLwotCi0JLyoKLQkgKiBTZXQgcG9ydCBmb3IgZGVmaW5lZCBiYXVkICwgOCBkYXRhIGJpdHMsIDEgc3RvcCBiaXQsIG5vIHBhcml0eS4KLQkgKi8KLQl1YXJ0cFtNQ0ZVQVJUX1VNUl0gPSBNQ0ZVQVJUX01SMV9QQVJJVFlOT05FIHwgTUNGVUFSVF9NUjFfQ1M4OwotCXVhcnRwW01DRlVBUlRfVU1SXSA9IE1DRlVBUlRfTVIyX1NUT1AxOwotCi0jaWZkZWYJQ09ORklHX001MjcyCi17Ci0JLyoKLQkgKiBGb3IgdGhlIE1DRjUyNzIsIGFsc28gY29tcHV0ZSB0aGUgYmF1ZHJhdGUgZnJhY3Rpb24uCi0JICovCi0JaW50IGZyYWN0aW9uID0gTUNGX0JVU0NMSyAtIChjbGsgKiAzMiAqIG1jZnJzX2NvbnNvbGVfYmF1ZCk7Ci0JZnJhY3Rpb24gKj0gMTY7Ci0JZnJhY3Rpb24gLz0gKDMyICogbWNmcnNfY29uc29sZV9iYXVkKTsKLQl1YXJ0cFtNQ0ZVQVJUX1VGUERdID0gKGZyYWN0aW9uICYgMHhmKTsJCS8qIHNldCBmcmFjdGlvbiAqLwotCWNsayA9IChNQ0ZfQlVTQ0xLIC8gbWNmcnNfY29uc29sZV9iYXVkKSAvIDMyOwotfQotI2Vsc2UKLQljbGsgPSAoKE1DRl9CVVNDTEsgLyBtY2Zyc19jb25zb2xlX2JhdWQpICsgMTYpIC8gMzI7IC8qIHNldCBiYXVkICovCi0jZW5kaWYKLQotCXVhcnRwW01DRlVBUlRfVUJHMV0gPSAoY2xrICYgMHhmZjAwKSA+PiA4OyAgLyogc2V0IG1zYiBiYXVkICovCi0JdWFydHBbTUNGVUFSVF9VQkcyXSA9IChjbGsgJiAweGZmKTsgIC8qIHNldCBsc2IgYmF1ZCAqLwotCXVhcnRwW01DRlVBUlRfVUNTUl0gPSBNQ0ZVQVJUX1VDU1JfUlhDTEtUSU1FUiB8IE1DRlVBUlRfVUNTUl9UWENMS1RJTUVSOwotCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX1JYRU5BQkxFIHwgTUNGVUFSVF9VQ1JfVFhFTkFCTEU7Ci0KLQltY2Zyc19jb25zb2xlX2luaXRlZCsrOwotCXJldHVybjsKLX0KLQotCi0vKgotICoJU2V0dXAgZm9yIGNvbnNvbGUuIEFyZ3VtZW50IGNvbWVzIGZyb20gdGhlIGJvb3QgY29tbWFuZCBsaW5lLgotICovCi0KLWludCBtY2Zyc19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjcCwgY2hhciAqYXJnKQotewotCWludAkJaSwgbiA9IENPTlNPTEVfQkFVRF9SQVRFOwotCi0JaWYgKCFjcCkKLQkJcmV0dXJuKC0xKTsKLQotCWlmICghc3RybmNtcChjcC0+bmFtZSwgInR0eVMiLCA0KSkKLQkJbWNmcnNfY29uc29sZV9wb3J0ID0gY3AtPmluZGV4OwotCWVsc2UgaWYgKCFzdHJuY21wKGNwLT5uYW1lLCAiY3VhIiwgMykpCi0JCW1jZnJzX2NvbnNvbGVfcG9ydCA9IGNwLT5pbmRleDsKLQllbHNlCi0JCXJldHVybigtMSk7Ci0KLQlpZiAoYXJnKQotCQluID0gc2ltcGxlX3N0cnRvdWwoYXJnLE5VTEwsMCk7Ci0JZm9yIChpID0gMDsgaSA8IE1DRlJTX0JBVURfVEFCTEVfU0laRTsgaSsrKQotCQlpZiAobWNmcnNfYmF1ZF90YWJsZVtpXSA9PSBuKQotCQkJYnJlYWs7Ci0JaWYgKGkgPCBNQ0ZSU19CQVVEX1RBQkxFX1NJWkUpIHsKLQkJbWNmcnNfY29uc29sZV9iYXVkID0gbjsKLQkJbWNmcnNfY29uc29sZV9jYmF1ZCA9IDA7Ci0JCWlmIChpID4gMTUpIHsKLQkJCW1jZnJzX2NvbnNvbGVfY2JhdWQgfD0gQ0JBVURFWDsKLQkJCWkgLT0gMTU7Ci0JCX0KLQkJbWNmcnNfY29uc29sZV9jYmF1ZCB8PSBpOwotCX0KLQltY2Zyc19pbml0X2NvbnNvbGUoKTsgLyogbWFrZSBzdXJlIGJhdWQgcmF0ZSBjaGFuZ2VzICovCi0JcmV0dXJuKDApOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbWNmcnNfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCi17Ci0JKmluZGV4ID0gYy0+aW5kZXg7Ci0JcmV0dXJuIG1jZnJzX3NlcmlhbF9kcml2ZXI7Ci19Ci0KLQotLyoKLSAqCU91dHB1dCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHVzaW5nIFVBUlQgcG9sbGVkIG1vZGUuCi0gKglUaGlzIGlzIHVzZWQgZm9yIGNvbnNvbGUgb3V0cHV0LgotICovCi0KLWludCBtY2Zyc19wdXRfY2hhcihjaGFyIGNoKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKnVhcnRwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCWk7Ci0KLQl1YXJ0cCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfTUJBUiArCi0JCShtY2Zyc19jb25zb2xlX3BvcnQgPyBNQ0ZVQVJUX0JBU0UyIDogTUNGVUFSVF9CQVNFMSkpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWZvciAoaSA9IDA7IChpIDwgMHgxMDAwMCk7IGkrKykgewotCQlpZiAodWFydHBbTUNGVUFSVF9VU1JdICYgTUNGVUFSVF9VU1JfVFhSRUFEWSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA8IDB4MTAwMDApIHsKLQkJdWFydHBbTUNGVUFSVF9VVEJdID0gY2g7Ci0JCWZvciAoaSA9IDA7IChpIDwgMHgxMDAwMCk7IGkrKykKLQkJCWlmICh1YXJ0cFtNQ0ZVQVJUX1VTUl0gJiBNQ0ZVQVJUX1VTUl9UWEVNUFRZKQotCQkJCWJyZWFrOwotCX0KLQlpZiAoaSA+PSAweDEwMDAwKQotCQltY2Zyc19pbml0X2NvbnNvbGUoKTsgLyogdHJ5IGFuZCBnZXQgaXQgYmFjayAqLwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKiByc19jb25zb2xlX3dyaXRlIGlzIHJlZ2lzdGVyZWQgZm9yIHByaW50ayBvdXRwdXQuCi0gKi8KLQotdm9pZCBtY2Zyc19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjcCwgY29uc3QgY2hhciAqcCwgdW5zaWduZWQgbGVuKQotewotCWlmICghbWNmcnNfY29uc29sZV9pbml0ZWQpCi0JCW1jZnJzX2luaXRfY29uc29sZSgpOwotCXdoaWxlIChsZW4tLSA+IDApIHsKLQkJaWYgKCpwID09ICdcbicpCi0JCQltY2Zyc19wdXRfY2hhcignXHInKTsKLQkJbWNmcnNfcHV0X2NoYXIoKnArKyk7Ci0JfQotfQotCi0vKgotICogZGVjbGFyZSBvdXIgY29uc29sZXMKLSAqLwotCi1zdHJ1Y3QgY29uc29sZSBtY2Zyc19jb25zb2xlID0gewotCS5uYW1lCQk9ICJ0dHlTIiwKLQkud3JpdGUJCT0gbWNmcnNfY29uc29sZV93cml0ZSwKLQkuZGV2aWNlCQk9IG1jZnJzX2NvbnNvbGVfZGV2aWNlLAotCS5zZXR1cAkJPSBtY2Zyc19jb25zb2xlX3NldHVwLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CQk9IC0xLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWNmcnNfY29uc29sZV9pbml0KHZvaWQpCi17Ci0JcmVnaXN0ZXJfY29uc29sZSgmbWNmcnNfY29uc29sZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNvbnNvbGVfaW5pdGNhbGwobWNmcnNfY29uc29sZV9pbml0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tY2ZzZXJpYWwuaCBiL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQyMGUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIG1jZnNlcmlhbC5jIC0tIHNlcmlhbCBkcml2ZXIgZm9yIENvbGRGaXJlIGludGVybmFsIFVBUlRTLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgTGluZW8sIEluYy4gPHd3dy5saW5lby5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgU25hcEdlYXIgSW5jLiwgPHd3dy5zbmFwZ2Vhci5jb20+Ci0gKgotICogQmFzZWQgb24gY29kZSBmcm9tIDY4MzMyc2VyaWFsLmMgd2hpY2ggd2FzOgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggVFNIRwotICogQ29weXJpZ2h0IChjKSAxOTk5IFJ0LUNvbnRyb2wgSW5jLiA8amVmZkB1Y2xpbnV4Lm9yZz4KLSAqLyAKLSNpZm5kZWYgX01DRl9TRVJJQUxfSAotI2RlZmluZSBfTUNGX1NFUklBTF9ICi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotLyoKLSAqCURlZmluZSBhIGxvY2FsIHNlcmlhbCBzdGF0cyBzdHJ1Y3R1cmUuCi0gKi8KLQotc3RydWN0IG1jZl9zdGF0cyB7Ci0JdW5zaWduZWQgaW50CXJ4OwotCXVuc2lnbmVkIGludAl0eDsKLQl1bnNpZ25lZCBpbnQJcnhicmVhazsKLQl1bnNpZ25lZCBpbnQJcnhmcmFtaW5nOwotCXVuc2lnbmVkIGludAlyeHBhcml0eTsKLQl1bnNpZ25lZCBpbnQJcnhvdmVycnVuOwotfTsKLQotCi0vKgotICogVGhpcyBpcyBvdXIgaW50ZXJuYWwgc3RydWN0dXJlIGZvciBlYWNoIHNlcmlhbCBwb3J0J3Mgc3RhdGUuCi0gKiBFYWNoIHNlcmlhbCBwb3J0IGhhcyBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gKi8KLQotc3RydWN0IG1jZl9zZXJpYWwgewotCWludAkJCW1hZ2ljOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmFkZHI7CQkvKiBVQVJUIG1lbW9yeSBhZGRyZXNzICovCi0JaW50CQkJaXJxOwotCWludAkJCWZsYWdzOyAJCS8qIGRlZmluZWQgaW4gdHR5LmggKi8KLQlpbnQJCQl0eXBlOyAJCS8qIFVBUlQgdHlwZSAqLwotCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OwotCXVuc2lnbmVkIGNoYXIJCWltcjsJCS8qIFNvZnR3YXJlIGltciByZWdpc3RlciAqLwotCXVuc2lnbmVkIGludAkJYmF1ZDsKLQlpbnQJCQlzaWdzOwotCWludAkJCWN1c3RvbV9kaXZpc29yOwotCWludAkJCXhfY2hhcjsJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCi0JaW50CQkJYmF1ZF9iYXNlOwotCWludAkJCWNsb3NlX2RlbGF5OwotCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7Ci0JdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDI7Ci0JdW5zaWduZWQgbG9uZwkJZXZlbnQ7Ci0JaW50CQkJbGluZTsKLQlpbnQJCQljb3VudDsJICAgIC8qICMgb2YgZmQgb24gZGV2aWNlICovCi0JaW50CQkJYmxvY2tlZF9vcGVuOyAvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KLQl1bnNpZ25lZCBjaGFyIAkJKnhtaXRfYnVmOwotCWludAkJCXhtaXRfaGVhZDsKLQlpbnQJCQl4bWl0X3RhaWw7Ci0JaW50CQkJeG1pdF9jbnQ7Ci0Jc3RydWN0IG1jZl9zdGF0cwlzdGF0czsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOwotCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwotCi19OwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX01DRl9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwppbmRleCAzNjEyNjA3Li42MTE3ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9tcGM1Mnh4X3VhcnQuYwpAQCAtNzIsMTMgKzcyLDggQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CiAjaW5jbHVkZSA8YXNtL21wYzUxMnguaD4KQEAgLTEwNywxMiArMTAyLDExIEBACiAJICogICAgICAgIGl0J3MgY2xlYXJlZCwgdGhlbiBhIG1lbXNldCguLi4sMCwuLi4pIHNob3VsZCBiZSBhZGRlZCB0bwogCSAqICAgICAgICB0aGUgY29uc29sZV9pbml0CiAJICovCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQorCiAvKiBsb29rdXAgdGFibGUgZm9yIG1hdGNoaW5nIGRldmljZSBub2RlcyB0byBpbmRleCBudW1iZXJzICovCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICptcGM1Mnh4X3VhcnRfbm9kZXNbTVBDNTJ4eF9QU0NfTUFYTlVNXTsKIAogc3RhdGljIHZvaWQgbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSh2b2lkKTsKLSNlbmRpZgogCiAKICNkZWZpbmUgUFNDKHBvcnQpICgoc3RydWN0IG1wYzUyeHhfcHNjIF9faW9tZW0gKikoKHBvcnQpLT5tZW1iYXNlKSkKQEAgLTI1NSwxNyArMjQ5LDEyIEBACiAvKiBTZWFyY2ggZm9yIGJ1cy1mcmVxdWVuY3kgcHJvcGVydHkgaW4gdGhpcyBub2RlIG9yIGEgcGFyZW50ICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtcGM1Mnh4X2dldHVhcnRjbGsodm9pZCAqcCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCiAJLyoKIAkgKiA1MjAwIFVBUlRzIGhhdmUgYSAvIDMyIHByZXNjYWxlcgogCSAqIGJ1dCB0aGUgZ2VuZXJpYyBzZXJpYWwgY29kZSBhc3N1bWVzIDE2CiAJICogc28gcmV0dXJuIGlwYiBmcmVxIC8gMgogCSAqLwogCXJldHVybiBtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEocCkgLyAyOwotI2Vsc2UKLQlwcl9kZWJ1ZygidW5leHBlY3RlZCBjYWxsIHRvIG1wYzUyeHhfZ2V0dWFydGNsayB3aXRoIGFyY2gvcHBjXG4iKTsKLQlyZXR1cm4gTlVMTDsKLSNlbmRpZgogfQogCiBzdGF0aWMgc3RydWN0IHBzY19vcHMgbXBjNTJ4eF9wc2Nfb3BzID0gewpAQCAtODg2LDEwICs4NzUsNiBAQAogCiAJLyogQ1R7VSxMfVIgYXJlIHdyaXRlLW9ubHkgISAqLwogCSpiYXVkID0gQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEVfQkFVRDsKLSNpZiAhZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQotCWlmIChfX3Jlcy5iaV9iYXVkcmF0ZSkKLQkJKmJhdWQgPSBfX3Jlcy5iaV9iYXVkcmF0ZTsKLSNlbmRpZgogCiAJLyogUGFyc2UgdGhlbSAqLwogCXN3aXRjaCAobXIxICYgTVBDNTJ4eF9QU0NfTU9ERV9CSVRTX01BU0spIHsKQEAgLTk0Niw0MiArOTMxLDYgQEAKIAlwc2Nfb3BzLT5jd19yZXN0b3JlX2ludHMocG9ydCk7CiB9CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQotc3RhdGljIGludCBfX2luaXQKLW1wYzUyeHhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCi17Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZtcGM1Mnh4X3VhcnRfcG9ydHNbY28tPmluZGV4XTsKLQotCWludCBiYXVkID0gQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEVfQkFVRDsKLQlpbnQgYml0cyA9IDg7Ci0JaW50IHBhcml0eSA9ICduJzsKLQlpbnQgZmxvdyA9ICduJzsKLQotCWlmIChjby0+aW5kZXggPCAwIHx8IGNvLT5pbmRleCA+PSBNUEM1Mnh4X1BTQ19NQVhOVU0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQmFzaWMgcG9ydCBpbml0LiBOZWVkZWQgc2luY2Ugd2UgdXNlIHNvbWUgdWFydF8/Pz8gZnVuYyBiZWZvcmUKLQkgKiByZWFsIGluaXQgZm9yIGVhcmx5IGFjY2VzcyAqLwotCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKLQlwb3J0LT51YXJ0Y2xrCT0gX19yZXMuYmlfaXBiZnJlcSAvIDI7IC8qIExvb2sgYXQgQ1RMUiBkb2MgKi8KLQlwb3J0LT5vcHMJPSAmbXBjNTJ4eF91YXJ0X29wczsKLQlwb3J0LT5tYXBiYXNlCT0gTVBDNTJ4eF9QQShNUEM1Mnh4X1BTQ3hfT0ZGU0VUKGNvLT5pbmRleCsxKSk7Ci0KLQkvKiBXZSBpb3JlbWFwIG91cnNlbGYgKi8KLQlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChwb3J0LT5tYXBiYXNlLCBNUEM1Mnh4X1BTQ19TSVpFKTsKLQlpZiAocG9ydC0+bWVtYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNldHVwIHRoZSBwb3J0IHBhcmFtZXRlcnMgYWNjb2RpbmcgdG8gb3B0aW9ucyAqLwotCWlmIChvcHRpb25zKQotCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7Ci0JZWxzZQotCQltcGM1Mnh4X2NvbnNvbGVfZ2V0X29wdGlvbnMocG9ydCwgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7Ci0KLQlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKLX0KLQotI2Vsc2UKIAogc3RhdGljIGludCBfX2luaXQKIG1wYzUyeHhfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCkBAIC0xMDUzLDcgKzEwMDIsNiBAQAogCiAJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKSAqLwogCiAKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbXBjNTJ4eF91YXJ0X2RyaXZlcjsKQEAgLTEwNzIsOSArMTAyMCw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogbXBjNTJ4eF9jb25zb2xlX2luaXQodm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCiAJbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSgpOwotI2VuZGlmCiAJcmVnaXN0ZXJfY29uc29sZSgmbXBjNTJ4eF9jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExMDAsMTE1ICsxMDQ2LDYgQEAKIAkuY29ucwkJPSBNUEM1Mnh4X1BTQ19DT05TT0xFLAogfTsKIAotCi0jaWYgIWRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogUGxhdGZvcm0gRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGludCBfX2RldmluaXQKLW1wYzUyeHhfdWFydF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlOwotCi0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IE5VTEw7Ci0JaW50IGksIGlkeCwgcmV0OwotCi0JLyogQ2hlY2sgdmFsaWRpdHkgJiBwcmVzZW5jZSAqLwotCWlkeCA9IGRldi0+aWQ7Ci0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IE1QQzUyeHhfUFNDX01BWE5VTSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIW1wYzUyeHhfbWF0Y2hfcHNjX2Z1bmN0aW9uKGlkeCwgInVhcnQiKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBJbml0IHRoZSBwb3J0IHN0cnVjdHVyZSAqLwotCXBvcnQgPSAmbXBjNTJ4eF91YXJ0X3BvcnRzW2lkeF07Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7Ci0JcG9ydC0+dWFydGNsawk9IF9fcmVzLmJpX2lwYmZyZXEgLyAyOyAvKiBMb29rIGF0IENUTFIgZG9jICovCi0JcG9ydC0+Zmlmb3NpemUJPSA1MTI7Ci0JcG9ydC0+aW90eXBlCT0gVVBJT19NRU07Ci0JcG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORiB8Ci0JCQkgICh1YXJ0X2NvbnNvbGUocG9ydCkgPyAwIDogVVBGX0lPUkVNQVApOwotCXBvcnQtPmxpbmUJPSBpZHg7Ci0JcG9ydC0+b3BzCT0gJm1wYzUyeHhfdWFydF9vcHM7Ci0JcG9ydC0+ZGV2CT0gJmRldi0+ZGV2OwotCi0JLyogU2VhcmNoIGZvciBJUlEgYW5kIG1hcGJhc2UgKi8KLQlmb3IgKGkgPSAwIDsgaSA8IGRldi0+bnVtX3Jlc291cmNlcyA7IGkrKywgcmVzKyspIHsKLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKLQkJCXBvcnQtPm1hcGJhc2UgPSByZXMtPnN0YXJ0OwotCQllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JUlEpCi0JCQlwb3J0LT5pcnEgPSByZXMtPnN0YXJ0OwotCX0KLQlpZiAoIXBvcnQtPmlycSB8fCAhcG9ydC0+bWFwYmFzZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBBZGQgdGhlIHBvcnQgdG8gdGhlIHVhcnQgc3ViLXN5c3RlbSAqLwotCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZtcGM1Mnh4X3VhcnRfZHJpdmVyLCBwb3J0KTsKLQlpZiAoIXJldCkKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKXBvcnQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotbXBjNTJ4eF91YXJ0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopIHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotCi0JaWYgKHBvcnQpCi0JCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZtcGM1Mnh4X3VhcnRfZHJpdmVyLCBwb3J0KTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50Ci1tcGM1Mnh4X3VhcnRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKikgcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChwb3J0KQotCQl1YXJ0X3N1c3BlbmRfcG9ydCgmbXBjNTJ4eF91YXJ0X2RyaXZlciwgcG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXBjNTJ4eF91YXJ0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopIHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAocG9ydCkKLQkJdWFydF9yZXN1bWVfcG9ydCgmbXBjNTJ4eF91YXJ0X2RyaXZlciwgcG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KLU1PRFVMRV9BTElBUygicGxhdGZvcm06bXBjNTJ4eC1wc2MiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjNTJ4eF91YXJ0X3BsYXRmb3JtX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gbXBjNTJ4eF91YXJ0X3Byb2JlLAotCS5yZW1vdmUJCT0gbXBjNTJ4eF91YXJ0X3JlbW92ZSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IG1wYzUyeHhfdWFydF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gbXBjNTJ4eF91YXJ0X3Jlc3VtZSwKLSNlbmRpZgotCS5kcml2ZXIJCT0gewotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLm5hbWUJPSAibXBjNTJ4eC1wc2MiLAotCX0sCi19OwotI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpICovCi0KLQotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogT0YgUGxhdGZvcm0gRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTE0MDIsNyArMTIzOSw2IEBACiAJCS5uYW1lCT0gIm1wYzUyeHgtcHNjLXVhcnQiLAogCX0sCiB9OwotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkgKi8KIAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTE0MjMsNyArMTI1OSw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQogCW1wYzUyeHhfdWFydF9vZl9lbnVtZXJhdGUoKTsKIAogCXJldCA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF91YXJ0X29mX2RyaXZlcik7CkBAIC0xNDMzLDE2ICsxMjY4LDYgQEAKIAkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbXBjNTJ4eF91YXJ0X2RyaXZlcik7CiAJCXJldHVybiByZXQ7CiAJfQotI2Vsc2UKLQlwc2Nfb3BzID0gJm1wYzUyeHhfcHNjX29wczsKLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzUyeHhfdWFydF9wbGF0Zm9ybV9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyIGZhaWxlZCAoJWkpXG4iLAotCQkgICAgICAgX19GSUxFX18sIHJldCk7Ci0JCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpOwotCQlyZXR1cm4gcmV0OwotCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDUwLDExICsxMjc1LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogbXBjNTJ4eF91YXJ0X2V4aXQodm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCiAJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm1wYzUyeHhfdWFydF9vZl9kcml2ZXIpOwotI2Vsc2UKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjNTJ4eF91YXJ0X3BsYXRmb3JtX2RyaXZlcik7Ci0jZW5kaWYKIAl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZtcGM1Mnh4X3VhcnRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvcHhhLmMgYi9kcml2ZXJzL3NlcmlhbC9weGEuYwppbmRleCBmN2EwZDM3Li5hYmMwMGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9weGEuYworKysgYi9kcml2ZXJzL3NlcmlhbC9weGEuYwpAQCAtNTM0LDYgKzUzNCwxMSBAQAogCiAJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQl1cC0+bWNyIHw9IFVBUlRfTUNSX0FGRTsKKwllbHNlCisJCXVwLT5tY3IgJj0gflVBUlRfTUNSX0FGRTsKKwogCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7Lyogc2V0IERMQUIgKi8KIAlzZXJpYWxfb3V0KHVwLCBVQVJUX0RMTCwgcXVvdCAmIDB4ZmYpOwkJLyogTFMgb2YgZGl2aXNvciAqLwogCXNlcmlhbF9vdXQodXAsIFVBUlRfRExNLCBxdW90ID4+IDgpOwkJLyogTVMgb2YgZGl2aXNvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvczNjMjQwMC5jIGIvZHJpdmVycy9zZXJpYWwvczNjMjQwMC5jCmluZGV4IGM4YjQyNjYuLjQ4NzNmMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDAwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjMjQwMC5jCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAogI2luY2x1ZGUgInNhbXN1bmcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYwppbmRleCA0MGEyNTMxLi44N2MxODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCiAjaW5jbHVkZSAic2Ftc3VuZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMi5jIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMi5jCmluZGV4IGQwMTcwMzEuLmZkMDE3YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEyLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKICNpbmNsdWRlICJzYW1zdW5nLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDQwLmMgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDQwLmMKaW5kZXggZDRhMmIxNy4uMzE3ZDIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvczNjMjQ0MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0NDAuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLSNpbmNsdWRlIDxhc20vcGxhdC1zM2MvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KIAogI2luY2x1ZGUgInNhbXN1bmcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuYyBiL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuYwppbmRleCA1YTg4YjNmOS4uMWUyMTlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NhbXN1bmcuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKICNpbmNsdWRlICJzYW1zdW5nLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCBmOTc3Yzk4Li42YmRmMzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTIwNTEsNyArMjA1MSw4IEBACiAJCQkJCSJ0cmFuc21pdHRlclxuIiwKIAkJCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAogCQkJICAgICAgIHBvcnQtPmRldiA/ICI6ICIgOiAiIiwKLQkJCSAgICAgICBkcnYtPmRldl9uYW1lLCBwb3J0LT5saW5lKTsKKwkJCSAgICAgICBkcnYtPmRldl9uYW1lLAorCQkJICAgICAgIGRydi0+dHR5X2RyaXZlci0+bmFtZV9iYXNlICsgcG9ydC0+bGluZSk7CiAKIAkJb3BzLT5zaHV0ZG93bihwb3J0KTsKIAl9CkBAIC0yMTU0LDEyICsyMTU1LDExIEBACiAKIAlzd2l0Y2ggKHBvcnQtPmlvdHlwZSkgewogCWNhc2UgVVBJT19QT1JUOgotCQlzbnByaW50ZihhZGRyZXNzLCBzaXplb2YoYWRkcmVzcyksCi0JCQkgIkkvTyAweCV4IiwgcG9ydC0+aW9iYXNlKTsKKwkJc25wcmludGYoYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpLCAiSS9PIDB4JWx4IiwgcG9ydC0+aW9iYXNlKTsKIAkJYnJlYWs7CiAJY2FzZSBVUElPX0hVQjY6CiAJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwKLQkJCSAiSS9PIDB4JXggb2Zmc2V0IDB4JXgiLCBwb3J0LT5pb2Jhc2UsIHBvcnQtPmh1YjYpOworCQkJICJJL08gMHglbHggb2Zmc2V0IDB4JXgiLCBwb3J0LT5pb2Jhc2UsIHBvcnQtPmh1YjYpOwogCQlicmVhazsKIAljYXNlIFVQSU9fTUVNOgogCWNhc2UgVVBJT19NRU0zMjoKQEAgLTIxNzcsNyArMjE3Nyw5IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyVzJWQgYXQgJXMgKGlycSA9ICVkKSBpcyBhICVzXG4iLAogCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAogCSAgICAgICBwb3J0LT5kZXYgPyAiOiAiIDogIiIsCi0JICAgICAgIGRydi0+ZGV2X25hbWUsIHBvcnQtPmxpbmUsIGFkZHJlc3MsIHBvcnQtPmlycSwgdWFydF90eXBlKHBvcnQpKTsKKwkgICAgICAgZHJ2LT5kZXZfbmFtZSwKKwkgICAgICAgZHJ2LT50dHlfZHJpdmVyLT5uYW1lX2Jhc2UgKyBwb3J0LT5saW5lLAorCSAgICAgICBhZGRyZXNzLCBwb3J0LT5pcnEsIHVhcnRfdHlwZShwb3J0KSk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCmluZGV4IDE2NGQyYTQuLjc1NDZhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCkBAIC00MzEsMTMxICs0MzEsMTAzIEBACiB7CiAJaW50IGk7CiAJaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7Ci0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKQorCWlmIChpICE9IDApCiAJCXJldHVybiBpOwotCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwotfQotCi1zdGF0aWMgaW50Ci1uZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIHR1cGxlX3QgKiB0dXBsZSwgY2lzcGFyc2VfdCAqIHBhcnNlKQotewotCWludCBpOwotCWkgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7CiAJaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKQorCWlmIChpICE9IDApCiAJCXJldHVybiBpOwotCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUodHVwbGUsIHBhcnNlKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXN0YXRpYyBpbnQgc2ltcGxlX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKK3N0YXRpYyBpbnQgc2ltcGxlX2NvbmZpZ19jaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YsCisJCQkgICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlzdGF0aWMgY29uc3QgaW50IHNpemVfdGFibGVbMl0gPSB7IDgsIDE2IH07CisJaW50ICp0cnkgPSBwcml2X2RhdGE7CisKKwlpZiAoY2YtPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJcF9kZXYtPmNvbmYuVnBwID0KKwkJCWNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOworCisJaWYgKChjZi0+aW8ubndpbiA+IDApICYmIChjZi0+aW8ud2luWzBdLmxlbiA9PSBzaXplX3RhYmxlWygqdHJ5ID4+IDEpXSkKKwkgICAgJiYgKGNmLT5pby53aW5bMF0uYmFzZSAhPSAwKSkgeworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uSU9BZGRyTGluZXMgPSAoKCp0cnkgJiAweDEpID09IDApID8KKwkJCTE2IDogY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNpbXBsZV9jb25maWdfY2hlY2tfbm90cGlja3koc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJCQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkJdW5zaWduZWQgaW50IHZjYywKKwkJCQkJdm9pZCAqcHJpdl9kYXRhKQogewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYmFzZVs1XSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgsIDB4MCB9OwotCXN0YXRpYyBjb25zdCBpbnQgc2l6ZV90YWJsZVsyXSA9IHsgOCwgMTYgfTsKKwlpbnQgajsKKworCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoKGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLKSA8PSAzKSkgeworCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gYmFzZVtqXTsKKwkJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGJhc2Vbal0gPyAxNiA6IDM7CisJCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBzaW1wbGVfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQorewogCXN0cnVjdCBzZXJpYWxfaW5mbyAqaW5mbyA9IGxpbmstPnByaXY7Ci0Jc3RydWN0IHNlcmlhbF9jZmdfbWVtICpjZmdfbWVtOwotCXR1cGxlX3QgKnR1cGxlOwotCXVfY2hhciAqYnVmOwotCWNpc3BhcnNlX3QgKnBhcnNlOwotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmOwotCWNvbmZpZ19pbmZvX3QgY29uZmlnOwotCWludCBpLCBqLCB0cnk7Ci0JaW50IHM7Ci0KLQljZmdfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlhbF9jZmdfbWVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZmdfbWVtKQotCQlyZXR1cm4gLTE7Ci0KLQl0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKLQlwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKLQljZiA9ICZwYXJzZS0+Y2Z0YWJsZV9lbnRyeTsKLQlidWYgPSBjZmdfbWVtLT5idWY7CisJaW50IGkgPSAtRU5PREVWLCB0cnk7CiAKIAkvKiBJZiB0aGUgY2FyZCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQsIGxvb2sgdXAgdGhlIHBvcnQgYW5kIGlycSAqLwotCWkgPSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZmlnKTsKLQlpZiAoKGkgPT0gQ1NfU1VDQ0VTUykgJiYgKGNvbmZpZy5BdHRyaWJ1dGVzICYgQ09ORl9WQUxJRF9DTElFTlQpKSB7CisJaWYgKGxpbmstPmZ1bmN0aW9uX2NvbmZpZykgewogCQl1bnNpZ25lZCBpbnQgcG9ydCA9IDA7Ci0JCWlmICgoY29uZmlnLkJhc2VQb3J0MiAhPSAwKSAmJiAoY29uZmlnLk51bVBvcnRzMiA9PSA4KSkgewotCQkJcG9ydCA9IGNvbmZpZy5CYXNlUG9ydDI7CisJCWlmICgobGluay0+aW8uQmFzZVBvcnQyICE9IDApICYmCisJCSAgICAobGluay0+aW8uTnVtUG9ydHMyID09IDgpKSB7CisJCQlwb3J0ID0gbGluay0+aW8uQmFzZVBvcnQyOwogCQkJaW5mby0+c2xhdmUgPSAxOwogCQl9IGVsc2UgaWYgKChpbmZvLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCi0JCQkgICAoY29uZmlnLk51bVBvcnRzMSA9PSAweDQwKSkgewotCQkJcG9ydCA9IGNvbmZpZy5CYXNlUG9ydDEgKyAweDI4OworCQkJICAgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAweDQwKSkgeworCQkJcG9ydCA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDB4Mjg7CiAJCQlpbmZvLT5zbGF2ZSA9IDE7CiAJCX0KIAkJaWYgKGluZm8tPnNsYXZlKSB7Ci0JCQlrZnJlZShjZmdfbWVtKTsKLQkJCXJldHVybiBzZXR1cF9zZXJpYWwobGluaywgaW5mbywgcG9ydCwgY29uZmlnLkFzc2lnbmVkSVJRKTsKKwkJCXJldHVybiBzZXR1cF9zZXJpYWwobGluaywgaW5mbywgcG9ydCwKKwkJCQkJICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CiAJCX0KIAl9CiAKLQkvKiBGaXJzdCBwYXNzOiBsb29rIGZvciBhIGNvbmZpZyBlbnRyeSB0aGF0IGxvb2tzIG5vcm1hbC4gKi8KLQl0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7Ci0JdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLT5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JLyogVHdvIHRyaWVzOiB3aXRob3V0IElPIGFsaWFzZXMsIHRoZW4gd2l0aCBhbGlhc2VzICovCi0JZm9yIChzID0gMDsgcyA8IDI7IHMrKykgewotCQlmb3IgKHRyeSA9IDA7IHRyeSA8IDI7IHRyeSsrKSB7Ci0JCQlpID0gZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLQkJCXdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKLQkJCQlpZiAoaSAhPSBDU19TVUNDRVNTKQotCQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQkJaWYgKGNmLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQkJCWxpbmstPmNvbmYuVnBwID0KLQkJCQkJICAgIGNmLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotCQkJCWlmICgoY2YtPmlvLm53aW4gPiAwKSAmJiAoY2YtPmlvLndpblswXS5sZW4gPT0gc2l6ZV90YWJsZVtzXSkgJiYKLQkJCQkJICAgIChjZi0+aW8ud2luWzBdLmJhc2UgIT0gMCkpIHsKLQkJCQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKLQkJCQkJbGluay0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQkJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9ICh0cnkgPT0gMCkgPwotCQkJCQkgICAgMTYgOiBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKLQkJCQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JCQkJCWlmIChpID09IENTX1NVQ0NFU1MpCi0JCQkJCQlnb3RvIGZvdW5kX3BvcnQ7Ci0JCQkJfQotbmV4dF9lbnRyeToKLQkJCQlpID0gbmV4dF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwotCQkJfQotCQl9Ci0JfQorCS8qIEZpcnN0IHBhc3M6IGxvb2sgZm9yIGEgY29uZmlnIGVudHJ5IHRoYXQgbG9va3Mgbm9ybWFsLgorCSAqIFR3byB0cmllczogd2l0aG91dCBJTyBhbGlhc2VzLCB0aGVuIHdpdGggYWxpYXNlcyAqLworCWZvciAodHJ5ID0gMDsgdHJ5IDwgNDsgdHJ5KyspCisJCWlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHNpbXBsZV9jb25maWdfY2hlY2ssICZ0cnkpKQorCQkJZ290byBmb3VuZF9wb3J0OworCiAJLyogU2Vjb25kIHBhc3M6IHRyeSB0byBmaW5kIGFuIGVudHJ5IHRoYXQgaXNuJ3QgcGlja3kgYWJvdXQKIAkgICBpdHMgYmFzZSBhZGRyZXNzLCB0aGVuIHRyeSB0byBncmFiIGFueSBzdGFuZGFyZCBzZXJpYWwgcG9ydAogCSAgIGFkZHJlc3MsIGFuZCBmaW5hbGx5IHRyeSB0byBnZXQgYW55IGZyZWUgcG9ydC4gKi8KLQlpID0gZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLQl3aGlsZSAoaSAhPSBDU19OT19NT1JFX0lURU1TKSB7Ci0JCWlmICgoaSA9PSBDU19TVUNDRVNTKSAmJiAoY2YtPmlvLm53aW4gPiAwKSAmJgotCQkgICAgKChjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSykgPD0gMykpIHsKLQkJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7Ci0JCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQxID0gYmFzZVtqXTsKLQkJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGJhc2Vbal0gPyAxNiA6IDM7Ci0JCQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JCQkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKLQkJCQkJZ290byBmb3VuZF9wb3J0OwotCQkJfQotCQl9Ci0JCWkgPSBuZXh0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0JfQorCWlmICghcGNtY2lhX2xvb3BfY29uZmlnKGxpbmssIHNpbXBsZV9jb25maWdfY2hlY2tfbm90cGlja3ksIE5VTEwpKQorCQlnb3RvIGZvdW5kX3BvcnQ7CiAKLSAgICAgIGZvdW5kX3BvcnQ6Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJICAgICAgICJzZXJpYWxfY3M6IG5vIHVzYWJsZSBwb3J0IHJhbmdlIGZvdW5kLCBnaXZpbmcgdXBcbiIpOwotCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SU8sIGkpOwotCQlrZnJlZShjZmdfbWVtKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkgICAgICAgInNlcmlhbF9jczogbm8gdXNhYmxlIHBvcnQgcmFuZ2UgZm91bmQsIGdpdmluZyB1cFxuIik7CisJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKKwlyZXR1cm4gLTE7CiAKK2ZvdW5kX3BvcnQ6CiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SVJRLCBpKTsKIAkJbGluay0+aXJxLkFzc2lnbmVkSVJRID0gMDsKIAl9CkBAIC01NjksODggKzU0MSw3NiBAQAogCQlpbmZvLT5xdWlyay0+Y29uZmlnKGxpbmspOwogCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwlpZiAoaSAhPSAwKSB7CiAJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKLQkJa2ZyZWUoY2ZnX21lbSk7CiAJCXJldHVybiAtMTsKIAl9Ci0Ja2ZyZWUoY2ZnX21lbSk7CiAJcmV0dXJuIHNldHVwX3NlcmlhbChsaW5rLCBpbmZvLCBsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CiB9CiAKLXN0YXRpYyBpbnQgbXVsdGlfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICogbGluaykKK3N0YXRpYyBpbnQgbXVsdGlfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJICAgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB2Y2MsCisJCQkgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJaW50ICpiYXNlMiA9IHByaXZfZGF0YTsKKworCS8qIFRoZSBxdWFkIHBvcnQgY2FyZHMgaGF2ZSBiYWQgQ0lTJ3MsIHNvIGp1c3QgbG9vayBmb3IgYQorCSAgIHdpbmRvdyBsYXJnZXIgdGhhbiA4IHBvcnRzIGFuZCBhc3N1bWUgaXQgd2lsbCBiZSByaWdodCAqLworCWlmICgoY2YtPmlvLm53aW4gPT0gMSkgJiYgKGNmLT5pby53aW5bMF0ubGVuID4gOCkpIHsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPmlvLklPQWRkckxpbmVzID0gY2YtPmlvLmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJCWlmICghcGNtY2lhX3JlcXVlc3RfaW8ocF9kZXYsICZwX2Rldi0+aW8pKSB7CisJCQkqYmFzZTIgPSBwX2Rldi0+aW8uQmFzZVBvcnQxICsgODsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IG11bHRpX2NvbmZpZ19jaGVja19ub3RwaWNreShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmLAorCQkJCSAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJCSAgICAgICB2b2lkICpwcml2X2RhdGEpCit7CisJaW50ICpiYXNlMiA9IHByaXZfZGF0YTsKKworCWlmIChjZi0+aW8ubndpbiA9PSAyKSB7CisJCXBfZGV2LT5pby5CYXNlUG9ydDEgPSBjZi0+aW8ud2luWzBdLmJhc2U7CisJCXBfZGV2LT5pby5CYXNlUG9ydDIgPSBjZi0+aW8ud2luWzFdLmJhc2U7CisJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkgeworCQkJKmJhc2UyID0gcF9kZXYtPmlvLkJhc2VQb3J0MjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IG11bHRpX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgc2VyaWFsX2luZm8gKmluZm8gPSBsaW5rLT5wcml2OwotCXN0cnVjdCBzZXJpYWxfY2ZnX21lbSAqY2ZnX21lbTsKLQl0dXBsZV90ICp0dXBsZTsKLQl1X2NoYXIgKmJ1ZjsKLQljaXNwYXJzZV90ICpwYXJzZTsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZjsKLQlpbnQgaSwgcmMsIGJhc2UyID0gMDsKLQotCWNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaWFsX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNmZ19tZW0pCi0JCXJldHVybiAtMTsKLQl0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKLQlwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKLQljZiA9ICZwYXJzZS0+Y2Z0YWJsZV9lbnRyeTsKLQlidWYgPSBjZmdfbWVtLT5idWY7Ci0KLQl0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7Ci0JdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLT5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJaW50IGksIGJhc2UyID0gMDsKIAogCS8qIEZpcnN0LCBsb29rIGZvciBhIGdlbmVyaWMgZnVsbC1zaXplZCB3aW5kb3cgKi8KIAlsaW5rLT5pby5OdW1Qb3J0czEgPSBpbmZvLT5tdWx0aSAqIDg7Ci0JaSA9IGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0Jd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewotCQkvKiBUaGUgcXVhZCBwb3J0IGNhcmRzIGhhdmUgYmFkIENJUydzLCBzbyBqdXN0IGxvb2sgZm9yIGEKLQkJICAgd2luZG93IGxhcmdlciB0aGFuIDggcG9ydHMgYW5kIGFzc3VtZSBpdCB3aWxsIGJlIHJpZ2h0ICovCi0JCWlmICgoaSA9PSBDU19TVUNDRVNTKSAmJiAoY2YtPmlvLm53aW4gPT0gMSkgJiYKLQkJICAgIChjZi0+aW8ud2luWzBdLmxlbiA+IDgpKSB7Ci0JCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPQotCQkJICAgIGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7Ci0JCQliYXNlMiA9IGxpbmstPmlvLkJhc2VQb3J0MSArIDg7Ci0JCQlpZiAoaSA9PSBDU19TVUNDRVNTKQotCQkJCWJyZWFrOwotCQl9Ci0JCWkgPSBuZXh0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0JfQotCi0JLyogSWYgdGhhdCBkaWRuJ3Qgd29yaywgbG9vayBmb3IgdHdvIHdpbmRvd3MgKi8KLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBtdWx0aV9jb25maWdfY2hlY2ssICZiYXNlMikpIHsKKwkJLyogSWYgdGhhdCBkaWRuJ3Qgd29yaywgbG9vayBmb3IgdHdvIHdpbmRvd3MgKi8KIAkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gODsKIAkJaW5mby0+bXVsdGkgPSAyOwotCQlpID0gZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKLQkJd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewotCQkJaWYgKChpID09IENTX1NVQ0NFU1MpICYmIChjZi0+aW8ubndpbiA9PSAyKSkgewotCQkJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQxID0gY2YtPmlvLndpblswXS5iYXNlOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5JT0FkZHJMaW5lcyA9Ci0JCQkJICAgIGNmLT5pby5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOwotCQkJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pOwotCQkJCWJhc2UyID0gbGluay0+aW8uQmFzZVBvcnQyOwotCQkJCWlmIChpID09IENTX1NVQ0NFU1MpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaSA9IG5leHRfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKTsKKwkJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBtdWx0aV9jb25maWdfY2hlY2tfbm90cGlja3ksCisJCQkJICAgICAgICZiYXNlMikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAic2VyaWFsX2NzOiBubyB1c2FibGUgcG9ydCByYW5nZSIKKwkJCSAgICAgICAiZm91bmQsIGdpdmluZyB1cFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KIAotCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKLQkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCBpKTsKLQkJcmMgPSAtMTsKLQkJZ290byBmcmVlX2NmZ19tZW07Ci0JfQotCiAJaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgeworCQkvKiBGSVhNRTogY29tbWVudCBkb2VzIG5vdCBmaXQsIGVycm9yIGhhbmRsaW5nIGRvZXMgbm90IGZpdCAqLwogCQlwcmludGsoS0VSTl9OT1RJQ0UKIAkJICAgICAgICJzZXJpYWxfY3M6IG5vIHVzYWJsZSBwb3J0IHJhbmdlIGZvdW5kLCBnaXZpbmcgdXBcbiIpOwogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0SVJRLCBpKTsKQEAgLTY2NCwxMCArNjI0LDkgQEAKIAkJaW5mby0+cXVpcmstPmNvbmZpZyhsaW5rKTsKIAogCWkgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKLQlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJaWYgKGkgIT0gMCkgewogCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaSk7Ci0JCXJjID0gLTE7Ci0JCWdvdG8gZnJlZV9jZmdfbWVtOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBUaGUgT3hmb3JkIFNlbWljb25kdWN0b3IgT1hDRjk1MCBjYXJkcyBhcmUgaW4gZmFjdCBzaW5nbGUtcG9ydDoKQEAgLTY3OCw3ICs2MzcsOCBAQAogCQkJCWluZm8tPnByb2RpZCA9PSBQUk9ESURfUE9TU0lPX0dDQykpIHsKIAkJaW50IGVycjsKIAotCQlpZiAoY2YtPmluZGV4ID09IDEgfHwgY2YtPmluZGV4ID09IDMpIHsKKwkJaWYgKGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPT0gMSB8fAorCQkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9PSAzKSB7CiAJCQllcnIgPSBzZXR1cF9zZXJpYWwobGluaywgaW5mbywgYmFzZTIsCiAJCQkJCWxpbmstPmlycS5Bc3NpZ25lZElSUSk7CiAJCQliYXNlMiA9IGxpbmstPmlvLkJhc2VQb3J0MTsKQEAgLTY5NSwxOCArNjU1LDE0IEBACiAJCWlmIChpbmZvLT5xdWlyayAmJiBpbmZvLT5xdWlyay0+d2FrZXVwKQogCQkJaW5mby0+cXVpcmstPndha2V1cChsaW5rKTsKIAotCQlyYyA9IDA7Ci0JCWdvdG8gZnJlZV9jZmdfbWVtOworCQlyZXR1cm4gMDsKIAl9CiAKIAlzZXR1cF9zZXJpYWwobGluaywgaW5mbywgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOwogCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5tdWx0aSAtIDE7IGkrKykKIAkJc2V0dXBfc2VyaWFsKGxpbmssIGluZm8sIGJhc2UyICsgKDggKiBpKSwKIAkJCQlsaW5rLT5pcnEuQXNzaWduZWRJUlEpOwotCXJjID0gMDsKLWZyZWVfY2ZnX21lbToKLQlrZnJlZShjZmdfbWVtKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzQ2LDcgKzcwMiw3IEBACiAJLyogSXMgdGhpcyBhIGNvbXBsaWFudCBtdWx0aWZ1bmN0aW9uIGNhcmQ/ICovCiAJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9MT05HTElOS19NRkM7CiAJdHVwbGUtPkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OIHwgVFVQTEVfUkVUVVJOX0xJTks7Ci0JaW5mby0+bXVsdGkgPSAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSA9PSBDU19TVUNDRVNTKTsKKwlpbmZvLT5tdWx0aSA9IChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpID09IDApOwogCiAJLyogSXMgdGhpcyBhIG11bHRpcG9ydCBjYXJkPyAqLwogCXR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwpAQCAtNzcwLDcgKzcyNiw3IEBACiAJICAgICgobGluay0+ZnVuY19pZCA9PSBDSVNUUExfRlVOQ0lEX01VTFRJKSB8fAogCSAgICAgKGxpbmstPmZ1bmNfaWQgPT0gQ0lTVFBMX0ZVTkNJRF9TRVJJQUwpKSkgewogCQl0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JCWlmIChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpID09IENTX1NVQ0NFU1MpIHsKKwkJaWYgKGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSkgPT0gMCkgewogCQkJaWYgKChjZi0+aW8ubndpbiA9PSAxKSAmJiAoY2YtPmlvLndpblswXS5sZW4gJSA4ID09IDApKQogCQkJCWluZm8tPm11bHRpID0gY2YtPmlvLndpblswXS5sZW4gPj4gMzsKIAkJCWlmICgoY2YtPmlvLm53aW4gPT0gMikgJiYgKGNmLT5pby53aW5bMF0ubGVuID09IDgpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfa3M4Njk1LmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfa3M4Njk1LmMKaW5kZXggYjljYmZjOC4uOTk4ZTg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2tzODY5NS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9rczg2OTUuYwpAQCAtNjMsOCArNjMsNDQgQEAKICNkZWZpbmUgVUFSVF9EVU1NWV9MU1JfUlgJMHgxMDAKICNkZWZpbmUgVUFSVF9QT1JUX1NJWkUJCShLUzg2OTVfVVNSIC0gS1M4Njk1X1VSUkIgKyA0KQogCi0jZGVmaW5lIHR4X2VuYWJsZWQocG9ydCkgKChwb3J0KS0+dW51c2VkWzBdKQotI2RlZmluZSByeF9lbmFibGVkKHBvcnQpICgocG9ydCktPnVudXNlZFsxXSkKK3N0YXRpYyBpbmxpbmUgaW50IHR4X2VuYWJsZWQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gcG9ydC0+dW51c2VkWzBdICYgMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnhfZW5hYmxlZChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBwb3J0LT51bnVzZWRbMF0gJiAyOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc19lbmFibGVkKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPnVudXNlZFswXSAmIDQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc19lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGVuYWJsZWQpCit7CisJaWYoZW5hYmxlZCkKKwkJcG9ydC0+dW51c2VkWzBdIHw9IDQ7CisJZWxzZQorCQlwb3J0LT51bnVzZWRbMF0gJj0gfjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGVuYWJsZWQpCit7CisJaWYoZW5hYmxlZCkKKwkJcG9ydC0+dW51c2VkWzBdIHw9IDI7CisJZWxzZQorCQlwb3J0LT51bnVzZWRbMF0gJj0gfjI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eF9lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGVuYWJsZWQpCit7CisJaWYoZW5hYmxlZCkKKwkJcG9ydC0+dW51c2VkWzBdIHw9IDE7CisJZWxzZQorCQlwb3J0LT51bnVzZWRbMF0gJj0gfjE7Cit9CiAKIAogI2lmZGVmIFNVUFBPUlRfU1lTUlEKQEAgLTc1LDcgKzExMSw3IEBACiB7CiAJaWYgKHR4X2VuYWJsZWQocG9ydCkpIHsKIAkJZGlzYWJsZV9pcnEoS1M4Njk1X0lSUV9VQVJUX1RYKTsKLQkJdHhfZW5hYmxlZChwb3J0KSA9IDA7CisJCXR4X2VuYWJsZShwb3J0LCAwKTsKIAl9CiB9CiAKQEAgLTgzLDcgKzExOSw3IEBACiB7CiAJaWYgKCF0eF9lbmFibGVkKHBvcnQpKSB7CiAJCWVuYWJsZV9pcnEoS1M4Njk1X0lSUV9VQVJUX1RYKTsKLQkJdHhfZW5hYmxlZChwb3J0KSA9IDE7CisJCXR4X2VuYWJsZShwb3J0LCAxKTsKIAl9CiB9CiAKQEAgLTkxLDE4ICsxMjcsMjQgQEAKIHsKIAlpZiAocnhfZW5hYmxlZChwb3J0KSkgewogCQlkaXNhYmxlX2lycShLUzg2OTVfSVJRX1VBUlRfUlgpOwotCQlyeF9lbmFibGVkKHBvcnQpID0gMDsKKwkJcnhfZW5hYmxlKHBvcnQsIDApOwogCX0KIH0KIAogc3RhdGljIHZvaWQga3M4Njk1dWFydF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQllbmFibGVfaXJxKEtTODY5NV9JUlFfVUFSVF9NT0RFTV9TVEFUVVMpOworCWlmICghbXNfZW5hYmxlZChwb3J0KSkgeworCQllbmFibGVfaXJxKEtTODY5NV9JUlFfVUFSVF9NT0RFTV9TVEFUVVMpOworCQltc19lbmFibGUocG9ydCwxKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGtzODY5NXVhcnRfZGlzYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCWRpc2FibGVfaXJxKEtTODY5NV9JUlFfVUFSVF9NT0RFTV9TVEFUVVMpOworCWlmIChtc19lbmFibGVkKHBvcnQpKSB7CisJCWRpc2FibGVfaXJxKEtTODY5NV9JUlFfVUFSVF9NT0RFTV9TVEFUVVMpOworCQltc19lbmFibGUocG9ydCwwKTsKKwl9CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBrczg2OTV1YXJ0X3J4X2NoYXJzKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTI4NSw4ICszMjcsOSBAQAogCWludCByZXR2YWw7CiAKIAlzZXRfaXJxX2ZsYWdzKEtTODY5NV9JUlFfVUFSVF9UWCwgSVJRRl9WQUxJRCB8IElSUUZfTk9BVVRPRU4pOwotCXR4X2VuYWJsZWQocG9ydCkgPSAwOwotCXJ4X2VuYWJsZWQocG9ydCkgPSAxOworCXR4X2VuYWJsZShwb3J0LCAwKTsKKwlyeF9lbmFibGUocG9ydCwgMSk7CisJbXNfZW5hYmxlKHBvcnQsIDEpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgSVJRCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5odi5jIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwppbmRleCBlNDE3NjZkLi5hOTRhMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKQEAgLTYxNiw3ICs2MTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBodl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaHZfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gImNvbnNvbGUiLAogCQkuY29tcGF0aWJsZSA9ICJxY24iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwppbmRleCAyOWI0NDU4Li4wMzU1ZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwpAQCAtMTA3OCw3ICsxMDc4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc2FiX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzYWJfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gInNlIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKaW5kZXggYTM3ODQ2NC4uYTRkYzc5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1X21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJzdSIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IDNjYjRjOGEuLjQ1YTI5OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtMTQ4MCw3ICsxNDgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgenNfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHpzX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJ6cyIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC91Y2NfdWFydC5jCmluZGV4IDVjNWQxOGQuLjUzOWM5MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdWNjX3VhcnQuYwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIAlyeF9zaXplID0gTDFfQ0FDSEVfQUxJR04ocWVfcG9ydC0+cnhfbnJmaWZvcyAqIHFlX3BvcnQtPnJ4X2ZpZm9zaXplKTsKIAl0eF9zaXplID0gTDFfQ0FDSEVfQUxJR04ocWVfcG9ydC0+dHhfbnJmaWZvcyAqIHFlX3BvcnQtPnR4X2ZpZm9zaXplKTsKIAotCWJkX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgcnhfc2l6ZSArIHR4X3NpemUsICZiZF9kbWFfYWRkciwKKwliZF92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KHBvcnQtPmRldiwgcnhfc2l6ZSArIHR4X3NpemUsICZiZF9kbWFfYWRkciwKIAkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFiZF92aXJ0KSB7CiAJCWRldl9lcnIocG9ydC0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBkZXNjcmlwdG9yc1xuIik7CkBAIC0xMDUxLDcgKzEwNTEsNyBAQAogCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVhcnRfcWVfcG9ydCwgcG9ydCk7CiAJc3RydWN0IHVjY19zbG93X3ByaXZhdGUgKnVjY3MgPSBxZV9wb3J0LT51c19wcml2YXRlOwogCi0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgcWVfcG9ydC0+YmRfc2l6ZSwgcWVfcG9ydC0+YmRfdmlydCwKKwlkbWFfZnJlZV9jb2hlcmVudChwb3J0LT5kZXYsIHFlX3BvcnQtPmJkX3NpemUsIHFlX3BvcnQtPmJkX3ZpcnQsCiAJCQkgIHFlX3BvcnQtPmJkX2RtYV9hZGRyKTsKIAogCXVjY19zbG93X2ZyZWUodWNjcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCmluZGV4IDI1ZWRhNzEuLjBkZWJlMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCkBAIC0xNSwxMyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTEwOCwxMyArMTAyLDEzIEBACiAJICogQmVjYXVzZSBwc2MtPmNjciBpcyBkZWZpbmVkIGFzIDE2Yml0IHJlZ2lzdGVyIGluc3RlYWQgb2YgMzJiaXQKIAkgKiBqdXN0IHNldCB0aGUgbG93ZXIgYnl0ZSBvZiBCaXRDbGtEaXYKIAkgKi8KLQljY3IgPSBpbl9iZTE2KCZwc2MtPmNjcik7CisJY2NyID0gaW5fYmUxNigodTE2IF9faW9tZW0gKikmcHNjLT5jY3IpOwogCWNjciAmPSAweEZGMDA7CiAJaWYgKGNzLT5zcGVlZF9oeikKIAkJY2NyIHw9IChNQ0xLIC8gY3MtPnNwZWVkX2h6IC0gMSkgJiAweEZGOwogCWVsc2UgLyogYnkgZGVmYXVsdCBTUEkgQ2xrIDFNSHogKi8KIAkJY2NyIHw9IChNQ0xLIC8gMTAwMDAwMCAtIDEpICYgMHhGRjsKLQlvdXRfYmUxNigmcHNjLT5jY3IsIGNjcik7CisJb3V0X2JlMTYoKHUxNiBfX2lvbWVtICopJnBzYy0+Y2NyLCBjY3IpOwogCW1wcy0+Yml0c19wZXJfd29yZCA9IGNzLT5iaXRzX3Blcl93b3JkOwogCiAJaWYgKG1wcy0+YWN0aXZhdGVfY3MpCkBAIC0zNDcsNyArMzQxLDcgQEAKIAkvKiBDb25maWd1cmUgOGJpdCBjb2RlYyBtb2RlIGFzIGEgU1BJIG1hc3RlciBhbmQgdXNlIEVPRiBmbGFncyAqLwogCS8qIFNJQ1JfU0lNX0NPREVDOHxTSUNSX0dFTkNMS3xTSUNSX1NQSXxTSUNSX01TVFJ8U0lDUl9VU0VFT0YgKi8KIAlvdXRfYmUzMigmcHNjLT5zaWNyLCAweDAxODBDODAwKTsKLQlvdXRfYmUxNigmcHNjLT5jY3IsIDB4MDcwRik7IC8qIGJ5IGRlZmF1bHQgU1BJIENsayAxTUh6ICovCisJb3V0X2JlMTYoKHUxNiBfX2lvbWVtICopJnBzYy0+Y2NyLCAweDA3MEYpOyAvKiBkZWZhdWx0IFNQSSBDbGsgMU1IeiAqLwogCiAJLyogU2V0IDJtcyBEVEwgZGVsYXkgKi8KIAlvdXRfOCgmcHNjLT5jdHVyLCAweDAwKTsKQEAgLTQ3MSw1MyArNDY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmICFkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCi1zdGF0aWMgaW50IF9faW5pdCBtcGM1Mnh4X3BzY19zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN3aXRjaChkZXYtPmlkKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQljYXNlIDM6Ci0JY2FzZSA2OgotCQlyZXR1cm4gbXBjNTJ4eF9wc2Nfc3BpX2RvX3Byb2JlKCZkZXYtPmRldiwKLQkJCU1QQzUyeHhfUEEoTVBDNTJ4eF9QU0N4X09GRlNFVChkZXYtPmlkKSksCi0JCQlNUEM1Mnh4X1BTQ19TSVpFLCBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCksIGRldi0+aWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotc3RhdGljIGludCBfX2V4aXQgbXBjNTJ4eF9wc2Nfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIG1wYzUyeHhfcHNjX3NwaV9kb19yZW1vdmUoJmRldi0+ZGV2KTsKLX0KLQotLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1wYzUyeHgtcHNjLXNwaSIpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X3BzY19zcGlfcGxhdGZvcm1fZHJpdmVyID0gewotCS5yZW1vdmUgPSBfX2V4aXRfcChtcGM1Mnh4X3BzY19zcGlfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtcGM1Mnh4LXBzYy1zcGkiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXBjNTJ4eF9wc2Nfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtcGM1Mnh4X3BzY19zcGlfcGxhdGZvcm1fZHJpdmVyLAotCQkJbXBjNTJ4eF9wc2Nfc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KG1wYzUyeHhfcHNjX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1wYzUyeHhfcHNjX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1wYzUyeHhfcHNjX3NwaV9wbGF0Zm9ybV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXBjNTJ4eF9wc2Nfc3BpX2V4aXQpOwotCi0jZWxzZQkvKiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpICovCi0KIHN0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfcHNjX3NwaV9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKQEAgLTU4Niw4ICs1MzMsNiBAQAogfQogbW9kdWxlX2V4aXQobXBjNTJ4eF9wc2Nfc3BpX2V4aXQpOwogCi0jZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKSAqLwotCiBNT0RVTEVfQVVUSE9SKCJEcmFnb3MgQ2FycCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNUEM1Mnh4IFBTQyBTUEkgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jIGIvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYwppbmRleCA5ZDIxODZmLi40NTRhMjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKQEAgLTExOSwxMiArMTE5LDE0IEBACiAJc3RydWN0IGNsawkJKmZjazsKIAkvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciAqLwogCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdW5zaWduZWQgbG9uZwkJcGh5czsKIAkvKiBTUEkxIGhhcyA0IGNoYW5uZWxzLCB3aGlsZSBTUEkyIGhhcyAyICovCiAJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOwogfTsKIAogc3RydWN0IG9tYXAyX21jc3BpX2NzIHsKIAl2b2lkIF9faW9tZW0JCSpiYXNlOworCXVuc2lnbmVkIGxvbmcJCXBoeXM7CiAJaW50CQkJd29yZF9sZW47CiB9OwogCkBAIC0yMzMsNyArMjM1LDcgQEAKIAljID0gY291bnQ7CiAJd29yZF9sZW4gPSBjcy0+d29yZF9sZW47CiAKLQliYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvX3YycChjcy0+YmFzZSk7CisJYmFzZSA9IGNzLT5waHlzOwogCXR4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7CiAJcnhfcmVnID0gYmFzZSArIE9NQVAyX01DU1BJX1JYMDsKIAlyeCA9IHhmZXItPnJ4X2J1ZjsKQEAgLTYzMyw2ICs2MzUsNyBAQAogCQlpZiAoIWNzKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWNzLT5iYXNlID0gbWNzcGktPmJhc2UgKyBzcGktPmNoaXBfc2VsZWN0ICogMHgxNDsKKwkJY3MtPnBoeXMgPSBtY3NwaS0+cGh5cyArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OwogCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKIAl9CiAKQEAgLTEwMDUsNyArMTAwOCwxMyBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JbWNzcGktPmJhc2UgPSAodm9pZCBfX2lvbWVtICopIGlvX3AydihyLT5zdGFydCk7CisJbWNzcGktPnBoeXMgPSByLT5zdGFydDsKKwltY3NwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFtY3NwaS0+YmFzZSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBpb3JlbWFwIE1DU1BJXG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnIxYWE7CisJfQogCiAJSU5JVF9XT1JLKCZtY3NwaS0+d29yaywgb21hcDJfbWNzcGlfd29yayk7CiAKQEAgLTEwNTUsNiArMTA2NCw4IEBACiBlcnIyOgogCWNsa19wdXQobWNzcGktPmljayk7CiBlcnIxYToKKwlpb3VubWFwKG1jc3BpLT5iYXNlKTsKK2VycjFhYToKIAlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKIGVycjE6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKQEAgLTEwNjcsNiArMTA3OCw3IEBACiAJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKIAlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSpkbWFfY2hhbm5lbHM7CiAJc3RydWN0IHJlc291cmNlCQkqcjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAKIAltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CkBAIC0xMDc4LDcgKzEwOTAsOSBAQAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEpOwogCisJYmFzZSA9IG1jc3BpLT5iYXNlOwogCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlvdW5tYXAoYmFzZSk7CiAJa2ZyZWUoZG1hX2NoYW5uZWxzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jIGIvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jCmluZGV4IDU1MTVlYjkuLmJhYjZmZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYworKysgYi9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKQEAgLTU5LDcgKzU5LDYgQEAKICAqIGFuZCBpcnFzIHNob3VsZCBzaG93IHRoZXJlIHRvby4uLgogICovCiAjZGVmaW5lIFVXSVJFX0JBU0VfUEhZUwkJMHhGRkZCMzAwMAotI2RlZmluZSBVV0lSRV9CQVNFCQkoKHZvaWQgKl9faW9tZW0pSU9fQUREUkVTUyhVV0lSRV9CQVNFX1BIWVMpKQogCiAvKiB1V2lyZSBSZWdpc3RlcnM6ICovCiAjZGVmaW5lIFVXSVJFX0lPX1NJWkUgMHgyMApAQCAtMTAzLDE2ICsxMDIsMjEgQEAKIH07CiAKIC8qIFJFVklTSVQgY29tcGlsZSB0aW1lIGNvbnN0YW50IGZvciBpZHhfc2hpZnQ/ICovCisvKgorICogT3IsIHB1dCBpdCBpbiBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGRyaXZlcjsKKyAqIHRoYXQgYXZvaWRzIGhhdmluZyB0byBpc3N1ZSB0d28gbG9hZHMgZm9yIGVhY2ggYml0IG9mIHN0YXRpYyBkYXRhLgorICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHV3aXJlX2lkeF9zaGlmdDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnV3aXJlX2Jhc2U7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1d2lyZV93cml0ZV9yZWcoaW50IGlkeCwgdTE2IHZhbCkKIHsKLQlfX3Jhd193cml0ZXcodmFsLCBVV0lSRV9CQVNFICsgKGlkeCA8PCB1d2lyZV9pZHhfc2hpZnQpKTsKKwlfX3Jhd193cml0ZXcodmFsLCB1d2lyZV9iYXNlICsgKGlkeCA8PCB1d2lyZV9pZHhfc2hpZnQpKTsKIH0KIAogc3RhdGljIGlubGluZSB1MTYgdXdpcmVfcmVhZF9yZWcoaW50IGlkeCkKIHsKLQlyZXR1cm4gX19yYXdfcmVhZHcoVVdJUkVfQkFTRSArIChpZHggPDwgdXdpcmVfaWR4X3NoaWZ0KSk7CisJcmV0dXJuIF9fcmF3X3JlYWR3KHV3aXJlX2Jhc2UgKyAoaWR4IDw8IHV3aXJlX2lkeF9zaGlmdCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF91d2lyZV9jb25maWd1cmVfbW9kZSh1OCBjcywgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTQ5Miw2ICs0OTYsMTQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAl1d2lyZSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXV3aXJlX2Jhc2UgPSBpb3JlbWFwKFVXSVJFX0JBU0VfUEhZUywgVVdJUkVfSU9fU0laRSk7CisJaWYgKCF1d2lyZV9iYXNlKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgVVdJUkVcbiIpOworCQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgdXdpcmUpOwogCiAJdXdpcmUtPmNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiYXJteG9yX2NrIik7CkBAIC01MjAsOCArNTMyLDEwIEBACiAJdXdpcmUtPmJpdGJhbmcudHhyeF9idWZzID0gdXdpcmVfdHhyeDsKIAogCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ1d2lyZS0+Yml0YmFuZyk7Ci0JaWYgKHN0YXR1cyA8IDApCisJaWYgKHN0YXR1cyA8IDApIHsKIAkJdXdpcmVfb2ZmKHV3aXJlKTsKKwkJaW91bm1hcCh1d2lyZV9iYXNlKTsKKwl9CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNTM0LDYgKzU0OCw3IEBACiAKIAlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZ1d2lyZS0+Yml0YmFuZyk7CiAJdXdpcmVfb2ZmKHV3aXJlKTsKKwlpb3VubWFwKHV3aXJlX2Jhc2UpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29yaW9uX3NwaS5jIGIvZHJpdmVycy9zcGkvb3Jpb25fc3BpLmMKaW5kZXggYzRlYWFjZC4uMDE0YmVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvb3Jpb25fc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvb3Jpb25fc3BpLmMKQEAgLTM2NCw2ICszNjQsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogRml4IGFjIHRpbWluZyBpZiByZXF1aXJlZC4gICAqLworCWlmIChvcmlvbl9zcGktPnNwaV9pbmZvLT5lbmFibGVfY2xvY2tfZml4KQorCQlvcmlvbl9zcGlfc2V0Yml0cyhvcmlvbl9zcGksIE9SSU9OX1NQSV9JRl9DT05GSUdfUkVHLAorCQkJCSAgKDEgPDwgMTQpKTsKKwogCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPT0gMCkKIAkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKIApAQCAtNDI3LDcgKzQzMiw3IEBACiAJCQlnb3RvIG1zZ19yZWplY3RlZDsKIAkJfQogCi0JCWlmICh0LT5zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7CisJCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IG9yaW9uX3NwaS0+bWluX3NwZWVkKSB7CiAJCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCQkibWVzc2FnZSByZWplY3RlZCA6ICIKIAkJCQkiZGV2aWNlIG1pbiBzcGVlZCAoJWQgSHopIGV4Y2VlZHMgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDM0YzdjOTguLmRhZTg3YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTQ3LDkgKzQ3LDE0IEBACiAKICNkZWZpbmUgTUFYX0JVU0VTIDMKIAotI2RlZmluZSBETUFfSU5UX01BU0sgKERDU1JfRU5ESU5UUiB8IERDU1JfU1RBUlRJTlRSIHwgRENTUl9CVVNFUlIpCi0jZGVmaW5lIFJFU0VUX0RNQV9DSEFOTkVMIChEQ1NSX05PREVTQyB8IERNQV9JTlRfTUFTSykKLSNkZWZpbmUgSVNfRE1BX0FMSUdORUQoeCkgKCgodTMyKSh4KSYweDA3KT09MCkKKyNkZWZpbmUgUlhfVEhSRVNIX0RGTFQgCTgKKyNkZWZpbmUgVFhfVEhSRVNIX0RGTFQgCTgKKyNkZWZpbmUgVElNT1VUX0RGTFQJCTEwMDAKKworI2RlZmluZSBETUFfSU5UX01BU0sJCShEQ1NSX0VORElOVFIgfCBEQ1NSX1NUQVJUSU5UUiB8IERDU1JfQlVTRVJSKQorI2RlZmluZSBSRVNFVF9ETUFfQ0hBTk5FTAkoRENTUl9OT0RFU0MgfCBETUFfSU5UX01BU0spCisjZGVmaW5lIElTX0RNQV9BTElHTkVEKHgpCSgoKCh1MzIpKHgpKSAmIDB4MDcpID09IDApCisjZGVmaW5lIE1BWF9ETUFfTEVOCQk4MTkxCiAKIC8qCiAgKiBmb3IgdGVzdGluZyBTU0NSMSBjaGFuZ2VzIHRoYXQgcmVxdWlyZSBTU1AgcmVzdGFydCwgYmFzaWNhbGx5CkBAIC0xNDQsNyArMTQ5LDYgQEAKIAlzaXplX3QgdHhfbWFwX2xlbjsKIAl1OCBuX2J5dGVzOwogCXUzMiBkbWFfd2lkdGg7Ci0JaW50IGNzX2NoYW5nZTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSk7CiAJaW50ICgqcmVhZCkoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSk7CiAJaXJxcmV0dXJuX3QgKCp0cmFuc2Zlcl9oYW5kbGVyKShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKTsKQEAgLTQwNiw4ICs0MTAsNDUgQEAKIAkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciwKIAkJCQkJdHJhbnNmZXJfbGlzdCk7CiAKKwkvKiBEZWxheSBpZiByZXF1ZXN0ZWQgYmVmb3JlIGFueSBjaGFuZ2UgaW4gY2hpcCBzZWxlY3QgKi8KKwlpZiAobGFzdF90cmFuc2Zlci0+ZGVsYXlfdXNlY3MpCisJCXVkZWxheShsYXN0X3RyYW5zZmVyLT5kZWxheV91c2Vjcyk7CisKKwkvKiBEcm9wIGNoaXAgc2VsZWN0IFVOTEVTUyBjc19jaGFuZ2UgaXMgdHJ1ZSBvciB3ZSBhcmUgcmV0dXJuaW5nCisJICogYSBtZXNzYWdlIHdpdGggYW4gZXJyb3IsIG9yIG5leHQgbWVzc2FnZSBpcyBmb3IgYW5vdGhlciBjaGlwCisJICovCiAJaWYgKCFsYXN0X3RyYW5zZmVyLT5jc19jaGFuZ2UpCiAJCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19ERUFTU0VSVCk7CisJZWxzZSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbmV4dF9tc2c7CisKKwkJLyogSG9sZGluZyBvZiBjcyB3YXMgaGludGVkLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJICogdGhlIG5leHQgbWVzc2FnZSBpcyBmb3IgdGhlIHNhbWUgY2hpcC4gIERvbid0IHdhc3RlCisJCSAqIHRpbWUgd2l0aCB0aGUgZm9sbG93aW5nIHRlc3RzIHVubGVzcyB0aGlzIHdhcyBoaW50ZWQuCisJCSAqCisJCSAqIFdlIGNhbm5vdCBwb3N0cG9uZSB0aGlzIHVudGlsIHB1bXBfbWVzc2FnZXMsIGJlY2F1c2UKKwkJICogYWZ0ZXIgY2FsbGluZyBtc2ctPmNvbXBsZXRlIChiZWxvdykgdGhlIGRyaXZlciB0aGF0CisJCSAqIHNlbnQgdGhlIGN1cnJlbnQgbWVzc2FnZSBjb3VsZCBiZSB1bmxvYWRlZCwgd2hpY2gKKwkJICogY291bGQgaW52YWxpZGF0ZSB0aGUgY3NfY29udHJvbCgpIGNhbGxiYWNrLi4uCisJCSAqLworCisJCS8qIGdldCBhIHBvaW50ZXIgdG8gdGhlIG5leHQgbWVzc2FnZSwgaWYgYW55ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZfZGF0YS0+bG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmZHJ2X2RhdGEtPnF1ZXVlKSkKKwkJCW5leHRfbXNnID0gTlVMTDsKKwkJZWxzZQorCQkJbmV4dF9tc2cgPSBsaXN0X2VudHJ5KGRydl9kYXRhLT5xdWV1ZS5uZXh0LAorCQkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBzZWUgaWYgdGhlIG5leHQgYW5kIGN1cnJlbnQgbWVzc2FnZXMgcG9pbnQKKwkJICogdG8gdGhlIHNhbWUgY2hpcAorCQkgKi8KKwkJaWYgKG5leHRfbXNnICYmIG5leHRfbXNnLT5zcGkgIT0gbXNnLT5zcGkpCisJCQluZXh0X21zZyA9IE5VTEw7CisJCWlmICghbmV4dF9tc2cgfHwgbXNnLT5zdGF0ZSA9PSBFUlJPUl9TVEFURSkKKwkJCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19ERUFTU0VSVCk7CisJfQogCiAJbXNnLT5zdGF0ZSA9IE5VTEw7CiAJaWYgKG1zZy0+Y29tcGxldGUpCkBAIC00OTAsMTAgKzUzMSw5IEBACiAJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW4gLQogCQkJCShkcnZfZGF0YS0+cnhfZW5kIC0gZHJ2X2RhdGEtPnJ4KTsKIAotCS8qIFJlbGVhc2UgY2hpcCBzZWxlY3QgaWYgcmVxdWVzdGVkLCB0cmFuc2ZlciBkZWxheXMgYXJlCi0JICogaGFuZGxlZCBpbiBwdW1wX3RyYW5zZmVycyAqLwotCWlmIChkcnZfZGF0YS0+Y3NfY2hhbmdlKQotCQlkcnZfZGF0YS0+Y3NfY29udHJvbChQWEEyWFhfQ1NfREVBU1NFUlQpOworCS8qIFRyYW5zZmVyIGRlbGF5cyBhbmQgY2hpcCBzZWxlY3QgcmVsZWFzZSBhcmUKKwkgKiBoYW5kbGVkIGluIHB1bXBfdHJhbnNmZXJzIG9yIGdpdmViYWNrCisJICovCiAKIAkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KIAltc2ctPnN0YXRlID0gbmV4dF90cmFuc2ZlcihkcnZfZGF0YSk7CkBAIC02MDIsMTAgKzY0Miw5IEBACiAJZHJ2X2RhdGEtPmN1cl9tc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbiAtCiAJCQkJKGRydl9kYXRhLT5yeF9lbmQgLSBkcnZfZGF0YS0+cngpOwogCi0JLyogUmVsZWFzZSBjaGlwIHNlbGVjdCBpZiByZXF1ZXN0ZWQsIHRyYW5zZmVyIGRlbGF5cyBhcmUKLQkgKiBoYW5kbGVkIGluIHB1bXBfdHJhbnNmZXJzICovCi0JaWYgKGRydl9kYXRhLT5jc19jaGFuZ2UpCi0JCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19ERUFTU0VSVCk7CisJLyogVHJhbnNmZXIgZGVsYXlzIGFuZCBjaGlwIHNlbGVjdCByZWxlYXNlIGFyZQorCSAqIGhhbmRsZWQgaW4gcHVtcF90cmFuc2ZlcnMgb3IgZ2l2ZWJhY2sKKwkgKi8KIAogCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwogCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwpAQCAtODQwLDIzICs4NzksNDAgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBhdCBlbmQgb2YgdHJhbnNmZXIqLworCS8qIERlbGF5IGlmIHJlcXVlc3RlZCBhdCBlbmQgb2YgdHJhbnNmZXIgYmVmb3JlIENTIGNoYW5nZSAqLwogCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBSVU5OSU5HX1NUQVRFKSB7CiAJCXByZXZpb3VzID0gbGlzdF9lbnRyeSh0cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5wcmV2LAogCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAogCQkJCQl0cmFuc2Zlcl9saXN0KTsKIAkJaWYgKHByZXZpb3VzLT5kZWxheV91c2VjcykKIAkJCXVkZWxheShwcmV2aW91cy0+ZGVsYXlfdXNlY3MpOworCisJCS8qIERyb3AgY2hpcCBzZWxlY3Qgb25seSBpZiBjc19jaGFuZ2UgaXMgcmVxdWVzdGVkICovCisJCWlmIChwcmV2aW91cy0+Y3NfY2hhbmdlKQorCQkJZHJ2X2RhdGEtPmNzX2NvbnRyb2woUFhBMlhYX0NTX0RFQVNTRVJUKTsKIAl9CiAKLQkvKiBDaGVjayB0cmFuc2ZlciBsZW5ndGggKi8KLQlpZiAodHJhbnNmZXItPmxlbiA+IDgxOTEpCi0JewotCQlkZXZfd2FybigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInB1bXBfdHJhbnNmZXJzOiB0cmFuc2ZlciAiCi0JCQkJImxlbmd0aCBncmVhdGVyIHRoYW4gODE5MVxuIik7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU5WQUw7Ci0JCWdpdmViYWNrKGRydl9kYXRhKTsKLQkJcmV0dXJuOworCS8qIENoZWNrIGZvciB0cmFuc2ZlcnMgdGhhdCBuZWVkIG11bHRpcGxlIERNQSBzZWdtZW50cyAqLworCWlmICh0cmFuc2Zlci0+bGVuID4gTUFYX0RNQV9MRU4gJiYgY2hpcC0+ZW5hYmxlX2RtYSkgeworCisJCS8qIHJlamVjdCBhbHJlYWR5LW1hcHBlZCB0cmFuc2ZlcnM7IFBJTyB3b24ndCBhbHdheXMgd29yayAqLworCQlpZiAobWVzc2FnZS0+aXNfZG1hX21hcHBlZAorCQkJCXx8IHRyYW5zZmVyLT5yeF9kbWEgfHwgdHJhbnNmZXItPnR4X2RtYSkgeworCQkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwKKwkJCQkicHVtcF90cmFuc2ZlcnM6IG1hcHBlZCB0cmFuc2ZlciBsZW5ndGggIgorCQkJCSJvZiAldSBpcyBncmVhdGVyIHRoYW4gJWRcbiIsCisJCQkJdHJhbnNmZXItPmxlbiwgTUFYX0RNQV9MRU4pOworCQkJbWVzc2FnZS0+c3RhdHVzID0gLUVJTlZBTDsKKwkJCWdpdmViYWNrKGRydl9kYXRhKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHdhcm4gLi4uIHdlIGZvcmNlIHRoaXMgdG8gUElPIG1vZGUgKi8KKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCWRldl93YXJuKCZtZXNzYWdlLT5zcGktPmRldiwgInB1bXBfdHJhbnNmZXJzOiAiCisJCQkJIkRNQSBkaXNhYmxlZCBmb3IgdHJhbnNmZXIgbGVuZ3RoICVsZCAiCisJCQkJImdyZWF0ZXIgdGhhbiAlZFxuIiwKKwkJCQkobG9uZylkcnZfZGF0YS0+bGVuLCBNQVhfRE1BX0xFTik7CiAJfQogCiAJLyogU2V0dXAgdGhlIHRyYW5zZmVyIHN0YXRlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRyYW5zZmVyICovCkBAIC04NzgsNyArOTM0LDYgQEAKIAlkcnZfZGF0YS0+bGVuID0gdHJhbnNmZXItPmxlbiAmIERDTURfTEVOR1RIOwogCWRydl9kYXRhLT53cml0ZSA9IGRydl9kYXRhLT50eCA/IGNoaXAtPndyaXRlIDogbnVsbF93cml0ZXI7CiAJZHJ2X2RhdGEtPnJlYWQgPSBkcnZfZGF0YS0+cnggPyBjaGlwLT5yZWFkIDogbnVsbF9yZWFkZXI7Ci0JZHJ2X2RhdGEtPmNzX2NoYW5nZSA9IHRyYW5zZmVyLT5jc19jaGFuZ2U7CiAKIAkvKiBDaGFuZ2Ugc3BlZWQgYW5kIGJpdCBwZXIgd29yZCBvbiBhIHBlciB0cmFuc2ZlciAqLwogCWNyMCA9IGNoaXAtPmNyMDsKQEAgLTkyNSw3ICs5ODAsNyBAQAogCQkJCQkJCSZkbWFfdGhyZXNoKSkKIAkJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCQlkZXZfd2FybigmbWVzc2FnZS0+c3BpLT5kZXYsCi0JCQkJCQkicHVtcF90cmFuc2ZlcjogIgorCQkJCQkJInB1bXBfdHJhbnNmZXJzOiAiCiAJCQkJCQkiRE1BIGJ1cnN0IHNpemUgcmVkdWNlZCB0byAiCiAJCQkJCQkibWF0Y2ggYml0c19wZXJfd29yZFxuIik7CiAJCX0KQEAgLTkzOSw4ICs5OTQsMjMgQEAKIAogCW1lc3NhZ2UtPnN0YXRlID0gUlVOTklOR19TVEFURTsKIAotCS8qIFRyeSB0byBtYXAgZG1hIGJ1ZmZlciBhbmQgZG8gYSBkbWEgdHJhbnNmZXIgaWYgc3VjY2Vzc2Z1bCAqLwotCWlmICgoZHJ2X2RhdGEtPmRtYV9tYXBwZWQgPSBtYXBfZG1hX2J1ZmZlcnMoZHJ2X2RhdGEpKSkgeworCS8qIFRyeSB0byBtYXAgZG1hIGJ1ZmZlciBhbmQgZG8gYSBkbWEgdHJhbnNmZXIgaWYgc3VjY2Vzc2Z1bCwgYnV0CisJICogb25seSBpZiB0aGUgbGVuZ3RoIGlzIG5vbi16ZXJvIGFuZCBsZXNzIHRoYW4gTUFYX0RNQV9MRU4uCisJICoKKwkgKiBaZXJvLWxlbmd0aCBub24tZGVzY3JpcHRvciBETUEgaXMgaWxsZWdhbCBvbiBQWEEyeHg7IGZvcmNlIHVzZQorCSAqIG9mIFBJTyBpbnN0ZWFkLiAgQ2FyZSBpcyBuZWVkZWQgYWJvdmUgYmVjYXVzZSB0aGUgdHJhbnNmZXIgbWF5CisJICogaGF2ZSBoYXZlIGJlZW4gcGFzc2VkIHdpdGggYnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IGRtYSBtYXBwZWQuCisJICogQSB6ZXJvLWxlbmd0aCB0cmFuc2ZlciBpbiBQSU8gbW9kZSB3aWxsIG5vdCB0cnkgdG8gd3JpdGUvcmVhZAorCSAqIHRvL2Zyb20gdGhlIGJ1ZmZlcnMKKwkgKgorCSAqIFJFVklTSVQgbGFyZ2UgdHJhbnNmZXJzIGFyZSBleGFjdGx5IHdoZXJlIHdlIG1vc3Qgd2FudCB0byBiZQorCSAqIHVzaW5nIERNQS4gIElmIHRoaXMgaGFwcGVucyBtdWNoLCBzcGxpdCB0aG9zZSB0cmFuc2ZlcnMgaW50bworCSAqIG11bHRpcGxlIERNQSBzZWdtZW50cyByYXRoZXIgdGhhbiBmb3JjaW5nIFBJTy4KKwkgKi8KKwlkcnZfZGF0YS0+ZG1hX21hcHBlZCA9IDA7CisJaWYgKGRydl9kYXRhLT5sZW4gPiAwICYmIGRydl9kYXRhLT5sZW4gPD0gTUFYX0RNQV9MRU4pCisJCWRydl9kYXRhLT5kbWFfbWFwcGVkID0gbWFwX2RtYV9idWZmZXJzKGRydl9kYXRhKTsKKwlpZiAoZHJ2X2RhdGEtPmRtYV9tYXBwZWQpIHsKIAogCQkvKiBFbnN1cmUgd2UgaGF2ZSB0aGUgY29ycmVjdCBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCQlkcnZfZGF0YS0+dHJhbnNmZXJfaGFuZGxlciA9IGRtYV90cmFuc2ZlcjsKQEAgLTExMDUsNiArMTE3NSw4IEBACiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOwogCXVuc2lnbmVkIGludCBjbGtfZGl2OworCXVpbnQgdHhfdGhyZXMgPSBUWF9USFJFU0hfREZMVDsKKwl1aW50IHJ4X3RocmVzID0gUlhfVEhSRVNIX0RGTFQ7CiAKIAlpZiAoIXNwaS0+Yml0c19wZXJfd29yZCkKIAkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKQEAgLTExNDMsOCArMTIxNSw3IEBACiAKIAkJY2hpcC0+Y3NfY29udHJvbCA9IG51bGxfY3NfY29udHJvbDsKIAkJY2hpcC0+ZW5hYmxlX2RtYSA9IDA7Ci0JCWNoaXAtPnRpbWVvdXQgPSAxMDAwOwotCQljaGlwLT50aHJlc2hvbGQgPSBTU0NSMV9SeFRyZXNoKDEpIHwgU1NDUjFfVHhUcmVzaCgxKTsKKwkJY2hpcC0+dGltZW91dCA9IFRJTU9VVF9ERkxUOwogCQljaGlwLT5kbWFfYnVyc3Rfc2l6ZSA9IGRydl9kYXRhLT5tYXN0ZXJfaW5mby0+ZW5hYmxlX2RtYSA/CiAJCQkJCURDTURfQlVSU1Q4IDogMDsKIAl9CkBAIC0xMTU4LDIyICsxMjI5LDIxIEBACiAJaWYgKGNoaXBfaW5mbykgewogCQlpZiAoY2hpcF9pbmZvLT5jc19jb250cm9sKQogCQkJY2hpcC0+Y3NfY29udHJvbCA9IGNoaXBfaW5mby0+Y3NfY29udHJvbDsKLQotCQljaGlwLT50aW1lb3V0ID0gY2hpcF9pbmZvLT50aW1lb3V0OwotCi0JCWNoaXAtPnRocmVzaG9sZCA9IChTU0NSMV9SeFRyZXNoKGNoaXBfaW5mby0+cnhfdGhyZXNob2xkKSAmCi0JCQkJCQkJCVNTQ1IxX1JGVCkgfAotCQkJCShTU0NSMV9UeFRyZXNoKGNoaXBfaW5mby0+dHhfdGhyZXNob2xkKSAmCi0JCQkJCQkJCVNTQ1IxX1RGVCk7Ci0KLQkJY2hpcC0+ZW5hYmxlX2RtYSA9IGNoaXBfaW5mby0+ZG1hX2J1cnN0X3NpemUgIT0gMAotCQkJCQkmJiBkcnZfZGF0YS0+bWFzdGVyX2luZm8tPmVuYWJsZV9kbWE7CisJCWlmIChjaGlwX2luZm8tPnRpbWVvdXQpCisJCQljaGlwLT50aW1lb3V0ID0gY2hpcF9pbmZvLT50aW1lb3V0OworCQlpZiAoY2hpcF9pbmZvLT50eF90aHJlc2hvbGQpCisJCQl0eF90aHJlcyA9IGNoaXBfaW5mby0+dHhfdGhyZXNob2xkOworCQlpZiAoY2hpcF9pbmZvLT5yeF90aHJlc2hvbGQpCisJCQlyeF90aHJlcyA9IGNoaXBfaW5mby0+cnhfdGhyZXNob2xkOworCQljaGlwLT5lbmFibGVfZG1hID0gZHJ2X2RhdGEtPm1hc3Rlcl9pbmZvLT5lbmFibGVfZG1hOwogCQljaGlwLT5kbWFfdGhyZXNob2xkID0gMDsKLQogCQlpZiAoY2hpcF9pbmZvLT5lbmFibGVfbG9vcGJhY2spCiAJCQljaGlwLT5jcjEgPSBTU0NSMV9MQk07CiAJfQogCisJY2hpcC0+dGhyZXNob2xkID0gKFNTQ1IxX1J4VHJlc2gocnhfdGhyZXMpICYgU1NDUjFfUkZUKSB8CisJCQkoU1NDUjFfVHhUcmVzaCh0eF90aHJlcykgJiBTU0NSMV9URlQpOworCiAJLyogc2V0IGRtYSBidXJzdCBhbmQgdGhyZXNob2xkIG91dHNpZGUgb2YgY2hpcF9pbmZvIHBhdGggc28gdGhhdCBpZgogCSAqIGNoaXBfaW5mbyBnb2VzIGF3YXkgYWZ0ZXIgc2V0dGluZyBjaGlwLT5lbmFibGVfZG1hLCB0aGUKIAkgKiBidXJzdCBhbmQgdGhyZXNob2xkIGNhbiBzdGlsbCByZXNwb25kIHRvIGNoYW5nZXMgaW4gYml0c19wZXJfd29yZCAqLwpAQCAtMTIwMiwxNyArMTI3MiwxOSBAQAogCiAJLyogTk9URTogIFBYQTI1eF9TU1AgX2NvdWxkXyB1c2UgZXh0ZXJuYWwgY2xvY2tpbmcgLi4uICovCiAJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQotCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGJpdHMvd29yZCwgJWxkIEh6LCBtb2RlICVkXG4iLAorCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGJpdHMvd29yZCwgJWxkIEh6LCBtb2RlICVkLCAlc1xuIiwKIAkJCQlzcGktPmJpdHNfcGVyX3dvcmQsCiAJCQkJY2xrX2dldF9yYXRlKHNzcC0+Y2xrKQogCQkJCQkvICgxICsgKChjaGlwLT5jcjAgJiBTU0NSMF9TQ1IpID4+IDgpKSwKLQkJCQlzcGktPm1vZGUgJiAweDMpOworCQkJCXNwaS0+bW9kZSAmIDB4MywKKwkJCQljaGlwLT5lbmFibGVfZG1hID8gIkRNQSIgOiAiUElPIik7CiAJZWxzZQotCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGJpdHMvd29yZCwgJWxkIEh6LCBtb2RlICVkXG4iLAorCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGJpdHMvd29yZCwgJWxkIEh6LCBtb2RlICVkLCAlc1xuIiwKIAkJCQlzcGktPmJpdHNfcGVyX3dvcmQsCi0JCQkJY2xrX2dldF9yYXRlKHNzcC0+Y2xrKQorCQkJCWNsa19nZXRfcmF0ZShzc3AtPmNsaykgLyAyCiAJCQkJCS8gKDEgKyAoKGNoaXAtPmNyMCAmIFNTQ1IwX1NDUikgPj4gOCkpLAotCQkJCXNwaS0+bW9kZSAmIDB4Myk7CisJCQkJc3BpLT5tb2RlICYgMHgzLAorCQkJCWNoaXAtPmVuYWJsZV9kbWEgPyAiRE1BIiA6ICJQSU8iKTsKIAogCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPD0gOCkgewogCQljaGlwLT5uX2J5dGVzID0gMTsKQEAgLTEzNDEsOSArMTQxMyw5IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgcHhhMnh4X3NwaV9tYXN0ZXIgKnBsYXRmb3JtX2luZm87CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKLQlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3A7Ci0JaW50IHN0YXR1cyA9IDA7CisJaW50IHN0YXR1czsKIAogCXBsYXRmb3JtX2luZm8gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAKQEAgLTEzNTYsNyArMTQyOCw3IEBACiAJLyogQWxsb2NhdGUgbWFzdGVyIHdpdGggc3BhY2UgZm9yIGRydl9kYXRhIGFuZCBudWxsIGRtYSBidWZmZXIgKi8KIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBkcml2ZXJfZGF0YSkgKyAxNik7CiAJaWYgKCFtYXN0ZXIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBhbGxvYyBzcGlfbWFzdGVyXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jIHNwaV9tYXN0ZXJcbiIpOwogCQlzc3BfZnJlZShzc3ApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzkyLDcgKzE0NjQsNyBAQAogCiAJc3RhdHVzID0gcmVxdWVzdF9pcnEoc3NwLT5pcnEsIHNzcF9pbnQsIDAsIGRldi0+YnVzX2lkLCBkcnZfZGF0YSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuIG5vdCBnZXQgSVJRXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBJUlEgJWRcbiIsIHNzcC0+aXJxKTsKIAkJZ290byBvdXRfZXJyb3JfbWFzdGVyX2FsbG9jOwogCX0KIApAQCAtMTQzMiw3ICsxNTA0LDkgQEAKIAogCS8qIExvYWQgZGVmYXVsdCBTU1AgY29uZmlndXJhdGlvbiAqLwogCXdyaXRlX1NTQ1IwKDAsIGRydl9kYXRhLT5pb2FkZHIpOwotCXdyaXRlX1NTQ1IxKFNTQ1IxX1J4VHJlc2goNCkgfCBTU0NSMV9UeFRyZXNoKDEyKSwgZHJ2X2RhdGEtPmlvYWRkcik7CisJd3JpdGVfU1NDUjEoU1NDUjFfUnhUcmVzaChSWF9USFJFU0hfREZMVCkgfAorCQkJCVNTQ1IxX1R4VHJlc2goVFhfVEhSRVNIX0RGTFQpLAorCQkJCWRydl9kYXRhLT5pb2FkZHIpOwogCXdyaXRlX1NTQ1IwKFNTQ1IwX1NlckNsa0RpdigyKQogCQkJfCBTU0NSMF9Nb3Rvcm9sYQogCQkJfCBTU0NSMF9EYXRhU2l6ZSg4KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggNzVlODY4Ni4uMzczNGRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTY2MCw3ICs2NjAsNyBAQAogCiAJaW50CQkJc3RhdHVzOwogCXN0cnVjdCBzcGlfbWVzc2FnZQltZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIJeFsyXTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXg7CiAJdTgJCQkqbG9jYWxfYnVmOwogCiAJLyogVXNlIHByZWFsbG9jYXRlZCBETUEtc2FmZSBidWZmZXIuICBXZSBjYW4ndCBhdm9pZCBjb3B5aW5nIGhlcmUsCkBAIC02NzEsMTUgKzY3MSw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KHgsIDAsIHNpemVvZiB4KTsKLQlpZiAobl90eCkgewotCQl4WzBdLmxlbiA9IG5fdHg7Ci0JCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4WzBdLCAmbWVzc2FnZSk7Ci0JfQotCWlmIChuX3J4KSB7Ci0JCXhbMV0ubGVuID0gbl9yeDsKLQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMV0sICZtZXNzYWdlKTsKLQl9CisJbWVtc2V0KCZ4LCAwLCBzaXplb2YgeCk7CisJeC5sZW4gPSBuX3R4ICsgbl9yeDsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeCwgJm1lc3NhZ2UpOwogCiAJLyogLi4uIHVubGVzcyBzb21lb25lIGVsc2UgaXMgdXNpbmcgdGhlIHByZS1hbGxvY2F0ZWQgYnVmZmVyICovCiAJaWYgKCFtdXRleF90cnlsb2NrKCZsb2NrKSkgewpAQCAtNjkwLDE1ICs2ODQsMTUgQEAKIAkJbG9jYWxfYnVmID0gYnVmOwogCiAJbWVtY3B5KGxvY2FsX2J1ZiwgdHhidWYsIG5fdHgpOwotCXhbMF0udHhfYnVmID0gbG9jYWxfYnVmOwotCXhbMV0ucnhfYnVmID0gbG9jYWxfYnVmICsgbl90eDsKKwl4LnR4X2J1ZiA9IGxvY2FsX2J1ZjsKKwl4LnJ4X2J1ZiA9IGxvY2FsX2J1ZjsKIAogCS8qIGRvIHRoZSBpL28gKi8KIAlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKIAlpZiAoc3RhdHVzID09IDApCi0JCW1lbWNweShyeGJ1ZiwgeFsxXS5yeF9idWYsIG5fcngpOworCQltZW1jcHkocnhidWYsIHgucnhfYnVmICsgbl90eCwgbl9yeCk7CiAKLQlpZiAoeFswXS50eF9idWYgPT0gYnVmKQorCWlmICh4LnR4X2J1ZiA9PSBidWYpCiAJCW11dGV4X3VubG9jaygmbG9jayk7CiAJZWxzZQogCQlrZnJlZShsb2NhbF9idWYpOwpAQCAtNzQ0LDUgKzczOCw1IEBACiAgKiBkcml2ZXIgcmVnaXN0cmF0aW9uKSBfY291bGRfIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCAobW9kdWxhcikgLi4uIGNvc3RzCiAgKiBpbmNsdWRlIG5lZWRpbmcgdG8gaGF2ZSBib2FyZGluZm8gZGF0YSBzdHJ1Y3R1cmVzIGJlIG11Y2ggbW9yZSBwdWJsaWMuCiAgKi8KLXN1YnN5c19pbml0Y2FsbChzcGlfaW5pdCk7Citwb3N0Y29yZV9pbml0Y2FsbChzcGlfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jCmluZGV4IDA3MGM2MjEuLmFjMGUzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYwpAQCAtMjY3LDE2ICsyNjcsMTMgQEAKIAljcy0+aHdfbW9kZSB8PSBTUE1PREVfTEVOKGJpdHNfcGVyX3dvcmQpOwogCiAJaWYgKChtcGM4M3h4X3NwaS0+c3BpYnJnIC8gaHopID4gNjQpIHsKKwkJY3MtPmh3X21vZGUgfD0gU1BNT0RFX0RJVjE2OwogCQlwbSA9IG1wYzgzeHhfc3BpLT5zcGlicmcgLyAoaHogKiA2NCk7CiAJCWlmIChwbSA+IDE2KSB7Ci0JCQljcy0+aHdfbW9kZSB8PSBTUE1PREVfRElWMTY7Ci0JCQlwbSAvPSAxNjsKLQkJCWlmIChwbSA+IDE2KSB7Ci0JCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSZXF1ZXN0ZWQgc3BlZWQgaXMgdG9vICIKLQkJCQkJImxvdzogJWQgSHouIFdpbGwgdXNlICVkIEh6IGluc3RlYWQuXG4iLAotCQkJCQloeiwgbXBjODN4eF9zcGktPnNwaWJyZyAvIDEwMjQpOwotCQkJCXBtID0gMTY7Ci0JCQl9CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIlJlcXVlc3RlZCBzcGVlZCBpcyB0b28gIgorCQkJCSJsb3c6ICVkIEh6LiBXaWxsIHVzZSAlZCBIeiBpbnN0ZWFkLlxuIiwKKwkJCQloeiwgbXBjODN4eF9zcGktPnNwaWJyZyAvIDEwMjQpOworCQkJcG0gPSAxNjsKIAkJfQogCX0gZWxzZQogCQlwbSA9IG1wYzgzeHhfc3BpLT5zcGlicmcgLyAoaHogKiA0KTsKQEAgLTMxNSwxMSArMzEyLDIwIEBACiAJaWYgKHQtPmJpdHNfcGVyX3dvcmQpCiAJCWJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOwogCWxlbiA9IHQtPmxlbjsKLQlpZiAoYml0c19wZXJfd29yZCA+IDgpCisJaWYgKGJpdHNfcGVyX3dvcmQgPiA4KSB7CisJCS8qIGludmFsaWQgbGVuZ3RoPyAqLworCQlpZiAobGVuICYgMSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlsZW4gLz0gMjsKLQlpZiAoYml0c19wZXJfd29yZCA+IDE2KQorCX0KKwlpZiAoYml0c19wZXJfd29yZCA+IDE2KSB7CisJCS8qIGludmFsaWQgbGVuZ3RoPyAqLworCQlpZiAobGVuICYgMSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlsZW4gLz0gMjsKKwl9CiAJbXBjODN4eF9zcGktPmNvdW50ID0gbGVuOworCiAJSU5JVF9DT01QTEVUSU9OKG1wYzgzeHhfc3BpLT5kb25lKTsKIAogCS8qIGVuYWJsZSByeCBpbnRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCA5OGFiYzczLi5jMjUyY2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTI0Nyw2ICsyNDcsOSBAQAogCXdyaXRlYigweGZmLCBody0+cmVncyArIFMzQzI0MTBfU1BQUkUpOwogCXdyaXRlYihTUFBJTl9ERUZBVUxULCBody0+cmVncyArIFMzQzI0MTBfU1BQSU4pOwogCXdyaXRlYihTUENPTl9ERUZBVUxULCBody0+cmVncyArIFMzQzI0MTBfU1BDT04pOworCisJaWYgKGh3LT5wZGF0YSAmJiBody0+cGRhdGEtPmdwaW9fc2V0dXApCisJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNDEyLDYgKzQxNSw5IEBACiB7CiAJc3RydWN0IHMzYzI0eHhfc3BpICpodyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJaWYgKGh3LT5wZGF0YSAmJiBody0+cGRhdGEtPmdwaW9fc2V0dXApCisJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDApOworCiAJY2xrX2Rpc2FibGUoaHctPmNsayk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzAsNyArNDM2LDcgQEAKICNlbmRpZgogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYzI0MTAtc3BpIik7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNHh4X3NwaWRydiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0eHhfc3BpX2RyaXZlciA9IHsKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKHMzYzI0eHhfc3BpX3JlbW92ZSksCiAJLnN1c3BlbmQJPSBzM2MyNHh4X3NwaV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gczNjMjR4eF9zcGlfcmVzdW1lLApAQCAtNDQyLDEyICs0NDgsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfaW5pdCh2b2lkKQogewotICAgICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzM2MyNHh4X3NwaWRydiwgczNjMjR4eF9zcGlfcHJvYmUpOworICAgICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzM2MyNHh4X3NwaV9kcml2ZXIsIHMzYzI0eHhfc3BpX3Byb2JlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHMzYzI0eHhfc3BpX2V4aXQodm9pZCkKIHsKLSAgICAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0eHhfc3BpZHJ2KTsKKyAgICAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0eHhfc3BpX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHMzYzI0eHhfc3BpX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpZGV2LmMgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwppbmRleCBlNWUwY2ZlLi44OWE0Mzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlkZXYuYworKysgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwpAQCAtNTgzLDEwICs1ODMsOSBAQAogCQlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAkJc3BpZGV2LT5kZXZ0ID0gTUtERVYoU1BJREVWX01BSk9SLCBtaW5vcik7Ci0JCWRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShzcGlkZXZfY2xhc3MsICZzcGktPmRldiwKLQkJCQlzcGlkZXYtPmRldnQsIHNwaWRldiwKLQkJCQkic3BpZGV2JWQuJWQiLAotCQkJCXNwaS0+bWFzdGVyLT5idXNfbnVtLCBzcGktPmNoaXBfc2VsZWN0KTsKKwkJZGV2ID0gZGV2aWNlX2NyZWF0ZShzcGlkZXZfY2xhc3MsICZzcGktPmRldiwgc3BpZGV2LT5kZXZ0LAorCQkJCSAgICBzcGlkZXYsICJzcGlkZXYlZC4lZCIsCisJCQkJICAgIHNwaS0+bWFzdGVyLT5idXNfbnVtLCBzcGktPmNoaXBfc2VsZWN0KTsKIAkJc3RhdHVzID0gSVNfRVJSKGRldikgPyBQVFJfRVJSKGRldikgOiAwOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gbWlub3IgbnVtYmVyIGF2YWlsYWJsZSFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvbWFpbi5jIGIvZHJpdmVycy9zc2IvbWFpbi5jCmluZGV4IDg3YWIyNDQuLjBmZmFiZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL21haW4uYworKysgYi9kcml2ZXJzL3NzYi9tYWluLmMKQEAgLTQ3MSw2ICs0NzEsNyBAQAogI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBTU0JfQlVTVFlQRV9TU0I6CisJCQlkZXYtPmRtYV9tYXNrID0gJmRldi0+Y29oZXJlbnRfZG1hX21hc2s7CiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9wY2kuYyBiL2RyaXZlcnMvc3NiL3BjaS5jCmluZGV4IGY4ODNkY2YuLmQ1Y2RlMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL3BjaS5jCisrKyBiL2RyaXZlcnMvc3NiL3BjaS5jCkBAIC0zMjcsMTEgKzMyNyw5IEBACiAJczggZ2FpbjsKIAl1MTYgbG9jWzNdOwogCi0JaWYgKG91dC0+cmV2aXNpb24gPT0gMykgewkJCS8qIHJldiAzIG1vdmVkIE1BQyAqLworCWlmIChvdXQtPnJldmlzaW9uID09IDMpCQkJLyogcmV2IDMgbW92ZWQgTUFDICovCiAJCWxvY1swXSA9IFNTQl9TUFJPTTNfSUwwTUFDOwotCQlsb2NbMV0gPSBTU0JfU1BST00zX0VUME1BQzsKLQkJbG9jWzJdID0gU1NCX1NQUk9NM19FVDFNQUM7Ci0JfSBlbHNlIHsKKwllbHNlIHsKIAkJbG9jWzBdID0gU1NCX1NQUk9NMV9JTDBNQUM7CiAJCWxvY1sxXSA9IFNTQl9TUFJPTTFfRVQwTUFDOwogCQlsb2NbMl0gPSBTU0JfU1BST00xX0VUMU1BQzsKQEAgLTM0MCwxMyArMzM4LDE1IEBACiAJCXYgPSBpbltTUE9GRihsb2NbMF0pICsgaV07CiAJCSooKChfX2JlMTYgKilvdXQtPmlsMG1hYykgKyBpKSA9IGNwdV90b19iZTE2KHYpOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXYgPSBpbltTUE9GRihsb2NbMV0pICsgaV07Ci0JCSooKChfX2JlMTYgKilvdXQtPmV0MG1hYykgKyBpKSA9IGNwdV90b19iZTE2KHYpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXYgPSBpbltTUE9GRihsb2NbMl0pICsgaV07Ci0JCSooKChfX2JlMTYgKilvdXQtPmV0MW1hYykgKyBpKSA9IGNwdV90b19iZTE2KHYpOworCWlmIChvdXQtPnJldmlzaW9uIDwgMykgeyAJLyogb25seSByZXYgMS0yIGhhdmUgZXQwLCBldDEgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJdiA9IGluW1NQT0ZGKGxvY1sxXSkgKyBpXTsKKwkJCSooKChfX2JlMTYgKilvdXQtPmV0MG1hYykgKyBpKSA9IGNwdV90b19iZTE2KHYpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXYgPSBpbltTUE9GRihsb2NbMl0pICsgaV07CisJCQkqKCgoX19iZTE2ICopb3V0LT5ldDFtYWMpICsgaSkgPSBjcHVfdG9fYmUxNih2KTsKKwkJfQogCX0KIAlTUEVYKGV0MHBoeWFkZHIsIFNTQl9TUFJPTTFfRVRIUEhZLCBTU0JfU1BST00xX0VUSFBIWV9FVDBBLCAwKTsKIAlTUEVYKGV0MXBoeWFkZHIsIFNTQl9TUFJPTTFfRVRIUEhZLCBTU0JfU1BST00xX0VUSFBIWV9FVDFBLApAQCAtMzk5LDMwICszOTksMzMgQEAKIAlvdXQtPmFudGVubmFfZ2Fpbi5naHo1LmEzID0gZ2FpbjsKIH0KIAotc3RhdGljIHZvaWQgc3Byb21fZXh0cmFjdF9yNChzdHJ1Y3Qgc3NiX3Nwcm9tICpvdXQsIGNvbnN0IHUxNiAqaW4pCitzdGF0aWMgdm9pZCBzcHJvbV9leHRyYWN0X3I0NShzdHJ1Y3Qgc3NiX3Nwcm9tICpvdXQsIGNvbnN0IHUxNiAqaW4pCiB7CiAJaW50IGk7CiAJdTE2IHY7CisJdTE2IGlsMG1hY19vZmZzZXQ7CiAKLQkvKiBleHRyYWN0IHRoZSBlcXVpdmFsZW50IG9mIHRoZSByMSB2YXJpYWJsZXMgKi8KKwlpZiAob3V0LT5yZXZpc2lvbiA9PSA0KQorCQlpbDBtYWNfb2Zmc2V0ID0gU1NCX1NQUk9NNF9JTDBNQUM7CisJZWxzZQorCQlpbDBtYWNfb2Zmc2V0ID0gU1NCX1NQUk9NNV9JTDBNQUM7CisJLyogZXh0cmFjdCB0aGUgTUFDIGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXYgPSBpbltTUE9GRihTU0JfU1BST000X0lMME1BQykgKyBpXTsKKwkJdiA9IGluW1NQT0ZGKGlsMG1hY19vZmZzZXQpICsgaV07CiAJCSooKChfX2JlMTYgKilvdXQtPmlsMG1hYykgKyBpKSA9IGNwdV90b19iZTE2KHYpOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXYgPSBpbltTUE9GRihTU0JfU1BST000X0VUME1BQykgKyBpXTsKLQkJKigoKF9fYmUxNiAqKW91dC0+ZXQwbWFjKSArIGkpID0gY3B1X3RvX2JlMTYodik7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdiA9IGluW1NQT0ZGKFNTQl9TUFJPTTRfRVQxTUFDKSArIGldOwotCQkqKCgoX19iZTE2ICopb3V0LT5ldDFtYWMpICsgaSkgPSBjcHVfdG9fYmUxNih2KTsKLQl9CiAJU1BFWChldDBwaHlhZGRyLCBTU0JfU1BST000X0VUSFBIWSwgU1NCX1NQUk9NNF9FVEhQSFlfRVQwQSwgMCk7CiAJU1BFWChldDFwaHlhZGRyLCBTU0JfU1BST000X0VUSFBIWSwgU1NCX1NQUk9NNF9FVEhQSFlfRVQxQSwKIAkgICAgIFNTQl9TUFJPTTRfRVRIUEhZX0VUMUFfU0hJRlQpOwotCVNQRVgoY291bnRyeV9jb2RlLCBTU0JfU1BST000X0NDT0RFLCAweEZGRkYsIDApOwotCVNQRVgoYm9hcmRmbGFnc19sbywgU1NCX1NQUk9NNF9CRkxMTywgMHhGRkZGLCAwKTsKLQlTUEVYKGJvYXJkZmxhZ3NfaGksIFNTQl9TUFJPTTRfQkZMSEksIDB4RkZGRiwgMCk7CisJaWYgKG91dC0+cmV2aXNpb24gPT0gNCkgeworCQlTUEVYKGNvdW50cnlfY29kZSwgU1NCX1NQUk9NNF9DQ09ERSwgMHhGRkZGLCAwKTsKKwkJU1BFWChib2FyZGZsYWdzX2xvLCBTU0JfU1BST000X0JGTExPLCAweEZGRkYsIDApOworCQlTUEVYKGJvYXJkZmxhZ3NfaGksIFNTQl9TUFJPTTRfQkZMSEksIDB4RkZGRiwgMCk7CisJfSBlbHNlIHsKKwkJU1BFWChjb3VudHJ5X2NvZGUsIFNTQl9TUFJPTTVfQ0NPREUsIDB4RkZGRiwgMCk7CisJCVNQRVgoYm9hcmRmbGFnc19sbywgU1NCX1NQUk9NNV9CRkxMTywgMHhGRkZGLCAwKTsKKwkJU1BFWChib2FyZGZsYWdzX2hpLCBTU0JfU1BST001X0JGTEhJLCAweEZGRkYsIDApOworCX0KIAlTUEVYKGFudF9hdmFpbGFibGVfYSwgU1NCX1NQUk9NNF9BTlRBVkFJTCwgU1NCX1NQUk9NNF9BTlRBVkFJTF9BLAogCSAgICAgU1NCX1NQUk9NNF9BTlRBVkFJTF9BX1NISUZUKTsKIAlTUEVYKGFudF9hdmFpbGFibGVfYmcsIFNTQl9TUFJPTTRfQU5UQVZBSUwsIFNTQl9TUFJPTTRfQU5UQVZBSUxfQkcsCkBAIC00MzMsMTIgKzQzNiwyMSBAQAogCVNQRVgobWF4cHdyX2EsIFNTQl9TUFJPTTRfTUFYUF9BLCBTU0JfU1BST000X01BWFBfQV9NQVNLLCAwKTsKIAlTUEVYKGl0c3NpX2EsIFNTQl9TUFJPTTRfTUFYUF9BLCBTU0JfU1BST000X0lUU1NJX0EsCiAJICAgICBTU0JfU1BST000X0lUU1NJX0FfU0hJRlQpOwotCVNQRVgoZ3BpbzAsIFNTQl9TUFJPTTRfR1BJT0EsIFNTQl9TUFJPTTRfR1BJT0FfUDAsIDApOwotCVNQRVgoZ3BpbzEsIFNTQl9TUFJPTTRfR1BJT0EsIFNTQl9TUFJPTTRfR1BJT0FfUDEsCi0JICAgICBTU0JfU1BST000X0dQSU9BX1AxX1NISUZUKTsKLQlTUEVYKGdwaW8yLCBTU0JfU1BST000X0dQSU9CLCBTU0JfU1BST000X0dQSU9CX1AyLCAwKTsKLQlTUEVYKGdwaW8zLCBTU0JfU1BST000X0dQSU9CLCBTU0JfU1BST000X0dQSU9CX1AzLAotCSAgICAgU1NCX1NQUk9NNF9HUElPQl9QM19TSElGVCk7CisJaWYgKG91dC0+cmV2aXNpb24gPT0gNCkgeworCQlTUEVYKGdwaW8wLCBTU0JfU1BST000X0dQSU9BLCBTU0JfU1BST000X0dQSU9BX1AwLCAwKTsKKwkJU1BFWChncGlvMSwgU1NCX1NQUk9NNF9HUElPQSwgU1NCX1NQUk9NNF9HUElPQV9QMSwKKwkJICAgICBTU0JfU1BST000X0dQSU9BX1AxX1NISUZUKTsKKwkJU1BFWChncGlvMiwgU1NCX1NQUk9NNF9HUElPQiwgU1NCX1NQUk9NNF9HUElPQl9QMiwgMCk7CisJCVNQRVgoZ3BpbzMsIFNTQl9TUFJPTTRfR1BJT0IsIFNTQl9TUFJPTTRfR1BJT0JfUDMsCisJCSAgICAgU1NCX1NQUk9NNF9HUElPQl9QM19TSElGVCk7CisJfSBlbHNlIHsKKwkJU1BFWChncGlvMCwgU1NCX1NQUk9NNV9HUElPQSwgU1NCX1NQUk9NNV9HUElPQV9QMCwgMCk7CisJCVNQRVgoZ3BpbzEsIFNTQl9TUFJPTTVfR1BJT0EsIFNTQl9TUFJPTTVfR1BJT0FfUDEsCisJCSAgICAgU1NCX1NQUk9NNV9HUElPQV9QMV9TSElGVCk7CisJCVNQRVgoZ3BpbzIsIFNTQl9TUFJPTTVfR1BJT0IsIFNTQl9TUFJPTTVfR1BJT0JfUDIsIDApOworCQlTUEVYKGdwaW8zLCBTU0JfU1BST001X0dQSU9CLCBTU0JfU1BST001X0dQSU9CX1AzLAorCQkgICAgIFNTQl9TUFJPTTVfR1BJT0JfUDNfU0hJRlQpOworCX0KIAogCS8qIEV4dHJhY3QgdGhlIGFudGVubmEgZ2FpbiB2YWx1ZXMuICovCiAJU1BFWChhbnRlbm5hX2dhaW4uZ2h6MjQuYTAsIFNTQl9TUFJPTTRfQUdBSU4wMSwKQEAgLTQ2Miw2ICs0NzQsOCBAQAogCiAJb3V0LT5yZXZpc2lvbiA9IGluW3NpemUgLSAxXSAmIDB4MDBGRjsKIAlzc2JfZHByaW50ayhLRVJOX0RFQlVHIFBGWCAiU1BST00gcmV2aXNpb24gJWQgZGV0ZWN0ZWQuXG4iLCBvdXQtPnJldmlzaW9uKTsKKwltZW1zZXQob3V0LT5ldDBtYWMsIDB4RkYsIDYpOwkJLyogcHJlc2V0IGV0MCBhbmQgZXQxIG1hYyAqLworCW1lbXNldChvdXQtPmV0MW1hYywgMHhGRiwgNik7CiAJaWYgKChidXMtPmNoaXBfaWQgJiAweEZGMDApID09IDB4NDQwMCkgewogCQkvKiBXb3JrYXJvdW5kOiBUaGUgQkNNNDRYWCBjaGlwIGhhcyBhIHN0dXBpZCByZXZpc2lvbgogCQkgKiBudW1iZXIgc3RvcmVkIGluIHRoZSBTUFJPTS4KQEAgLTQ3MSwxNiArNDg1LDE2IEBACiAJfSBlbHNlIGlmIChidXMtPmNoaXBfaWQgPT0gMHg0MzIxKSB7CiAJCS8qIHRoZSBCQ000MzI4IGhhcyBhIGNoaXBpZCA9PSAweDQzMjEgYW5kIGEgcmV2IDQgU1BST00gKi8KIAkJb3V0LT5yZXZpc2lvbiA9IDQ7Ci0JCXNwcm9tX2V4dHJhY3RfcjQob3V0LCBpbik7CisJCXNwcm9tX2V4dHJhY3RfcjQ1KG91dCwgaW4pOwogCX0gZWxzZSB7CiAJCWlmIChvdXQtPnJldmlzaW9uID09IDApCiAJCQlnb3RvIHVuc3VwcG9ydGVkOwogCQlpZiAob3V0LT5yZXZpc2lvbiA+PSAxICYmIG91dC0+cmV2aXNpb24gPD0gMykgewogCQkJc3Byb21fZXh0cmFjdF9yMTIzKG91dCwgaW4pOwogCQl9Ci0JCWlmIChvdXQtPnJldmlzaW9uID09IDQpCi0JCQlzcHJvbV9leHRyYWN0X3I0KG91dCwgaW4pOwotCQlpZiAob3V0LT5yZXZpc2lvbiA+PSA1KQorCQlpZiAob3V0LT5yZXZpc2lvbiA9PSA0IHx8IG91dC0+cmV2aXNpb24gPT0gNSkKKwkJCXNwcm9tX2V4dHJhY3RfcjQ1KG91dCwgaW4pOworCQlpZiAob3V0LT5yZXZpc2lvbiA+IDUpCiAJCQlnb3RvIHVuc3VwcG9ydGVkOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvcGNtY2lhLmMgYi9kcml2ZXJzL3NzYi9wY21jaWEuYwppbmRleCAyNGMyYTQ2Li5mYmZhZGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9wY21jaWEuYworKysgYi9kcml2ZXJzL3NzYi9wY21jaWEuYwpAQCAtODAsNyArODAsNyBAQAogCXJlZy5BY3Rpb24gPSBDU19XUklURTsKIAlyZWcuVmFsdWUgPSB2YWx1ZTsKIAlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoYnVzLT5ob3N0X3BjbWNpYSwgJnJlZyk7Ci0JaWYgKHVubGlrZWx5KHJlcyAhPSBDU19TVUNDRVNTKSkKKwlpZiAodW5saWtlbHkocmVzICE9IDApKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJcmV0dXJuIDA7CkBAIC05Niw3ICs5Niw3IEBACiAJcmVnLk9mZnNldCA9IG9mZnNldDsKIAlyZWcuQWN0aW9uID0gQ1NfUkVBRDsKIAlyZXMgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoYnVzLT5ob3N0X3BjbWNpYSwgJnJlZyk7Ci0JaWYgKHVubGlrZWx5KHJlcyAhPSBDU19TVUNDRVNTKSkKKwlpZiAodW5saWtlbHkocmVzICE9IDApKQogCQlyZXR1cm4gLUVCVVNZOwogCSp2YWx1ZSA9IHJlZy5WYWx1ZTsKIApAQCAtNjM4LDE3ICs2MzgsMTcgQEAKIAl0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAJcmVzID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShidXMtPmhvc3RfcGNtY2lhLCAmdHVwbGUpOwotCUdPVE9fRVJST1JfT04ocmVzICE9IENTX1NVQ0NFU1MsICJNQUMgZmlyc3QgdHBsIik7CisJR09UT19FUlJPUl9PTihyZXMgIT0gMCwgIk1BQyBmaXJzdCB0cGwiKTsKIAlyZXMgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoYnVzLT5ob3N0X3BjbWNpYSwgJnR1cGxlKTsKLQlHT1RPX0VSUk9SX09OKHJlcyAhPSBDU19TVUNDRVNTLCAiTUFDIGZpcnN0IHRwbCBkYXRhIik7CisJR09UT19FUlJPUl9PTihyZXMgIT0gMCwgIk1BQyBmaXJzdCB0cGwgZGF0YSIpOwogCXdoaWxlICgxKSB7CiAJCUdPVE9fRVJST1JfT04odHVwbGUuVHVwbGVEYXRhTGVuIDwgMSwgIk1BQyB0cGwgPCAxIik7CiAJCWlmICh0dXBsZS5UdXBsZURhdGFbMF0gPT0gQ0lTVFBMX0ZVTkNFX0xBTl9OT0RFX0lEKQogCQkJYnJlYWs7CiAJCXJlcyA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShidXMtPmhvc3RfcGNtY2lhLCAmdHVwbGUpOwotCQlHT1RPX0VSUk9SX09OKHJlcyAhPSBDU19TVUNDRVNTLCAiTUFDIG5leHQgdHBsIik7CisJCUdPVE9fRVJST1JfT04ocmVzICE9IDAsICJNQUMgbmV4dCB0cGwiKTsKIAkJcmVzID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGJ1cy0+aG9zdF9wY21jaWEsICZ0dXBsZSk7Ci0JCUdPVE9fRVJST1JfT04ocmVzICE9IENTX1NVQ0NFU1MsICJNQUMgbmV4dCB0cGwgZGF0YSIpOworCQlHT1RPX0VSUk9SX09OKHJlcyAhPSAwLCAiTUFDIG5leHQgdHBsIGRhdGEiKTsKIAl9CiAJR09UT19FUlJPUl9PTih0dXBsZS5UdXBsZURhdGFMZW4gIT0gRVRIX0FMRU4gKyAyLCAiTUFDIHRwbCBzaXplIik7CiAJbWVtY3B5KHNwcm9tLT5pbDBtYWMsICZ0dXBsZS5UdXBsZURhdGFbMl0sIEVUSF9BTEVOKTsKQEAgLTY1OSw5ICs2NTksOSBAQAogCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKIAl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKIAlyZXMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGJ1cy0+aG9zdF9wY21jaWEsICZ0dXBsZSk7Ci0JR09UT19FUlJPUl9PTihyZXMgIT0gQ1NfU1VDQ0VTUywgIlZFTiBmaXJzdCB0cGwiKTsKKwlHT1RPX0VSUk9SX09OKHJlcyAhPSAwLCAiVkVOIGZpcnN0IHRwbCIpOwogCXJlcyA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShidXMtPmhvc3RfcGNtY2lhLCAmdHVwbGUpOwotCUdPVE9fRVJST1JfT04ocmVzICE9IENTX1NVQ0NFU1MsICJWRU4gZmlyc3QgdHBsIGRhdGEiKTsKKwlHT1RPX0VSUk9SX09OKHJlcyAhPSAwLCAiVkVOIGZpcnN0IHRwbCBkYXRhIik7CiAJd2hpbGUgKDEpIHsKIAkJR09UT19FUlJPUl9PTih0dXBsZS5UdXBsZURhdGFMZW4gPCAxLCAiVkVOIHRwbCA8IDEiKTsKIAkJc3dpdGNoICh0dXBsZS5UdXBsZURhdGFbMF0pIHsKQEAgLTczMywxMSArNzMzLDExIEBACiAJCQlicmVhazsKIAkJfQogCQlyZXMgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoYnVzLT5ob3N0X3BjbWNpYSwgJnR1cGxlKTsKLQkJaWYgKHJlcyA9PSBDU19OT19NT1JFX0lURU1TKQorCQlpZiAocmVzID09IC1FTk9TUEMpCiAJCQlicmVhazsKLQkJR09UT19FUlJPUl9PTihyZXMgIT0gQ1NfU1VDQ0VTUywgIlZFTiBuZXh0IHRwbCIpOworCQlHT1RPX0VSUk9SX09OKHJlcyAhPSAwLCAiVkVOIG5leHQgdHBsIik7CiAJCXJlcyA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShidXMtPmhvc3RfcGNtY2lhLCAmdHVwbGUpOwotCQlHT1RPX0VSUk9SX09OKHJlcyAhPSBDU19TVUNDRVNTLCAiVkVOIG5leHQgdHBsIGRhdGEiKTsKKwkJR09UT19FUlJPUl9PTihyZXMgIT0gMCwgIlZFTiBuZXh0IHRwbCBkYXRhIik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouYyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCmluZGV4IGVjN2FlYjUuLjQxYjY1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCisrKyBiL2RyaXZlcnMvdGVsZXBob255L2l4ai5jCkBAIC00Miw4ICs0Miw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogJExvZzogaXhqLmMsdiAkCi0gKgogICogUmV2aXNpb24gNC44ICAyMDAzLzA3LzA5IDE5OjM5OjAwICBEYW5pZWxlIEJlbGx1Y2NpCiAgKiBBdWRpdCBzb21lIGNvcHlfKl91c2VyIGFuZCBtaW5vciBjbGVhbnVwLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCBmZjlhMjliLi4zNDdjM2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC0xMjQsNjUgKzEyNCw1MyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBpeGpfY29uZmlnX2NoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcsCisJCQkgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdmNjLAorCQkJICAgIHZvaWQgKnByaXZfZGF0YSkKK3sKKwlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LT5pby5ud2luID4gMCkpIHsKKwkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LT5pbzsKKwkJcF9kZXYtPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJcF9kZXYtPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQlpZiAoaW8tPm53aW4gPT0gMikgeworCQkJcF9kZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCXBfZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJfQorCQlpZiAoIXBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKwogc3RhdGljIGludCBpeGpfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICogbGluaykKIHsKIAlJWEogKmo7CiAJaXhqX2luZm9fdCAqaW5mbzsKLQl0dXBsZV90IHR1cGxlOwotCXVfc2hvcnQgYnVmWzEyOF07Ci0JY2lzcGFyc2VfdCBwYXJzZTsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKLQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPQotCXsKLQkJMAotCX07Ci0JaW50IGxhc3RfcmV0LCBsYXN0X2ZuOworCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OworCiAJaW5mbyA9IGxpbmstPnByaXY7CiAJREVCVUcoMCwgIml4al9jb25maWcoMHglcClcbiIsIGxpbmspOwotCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgYnVmOwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl3aGlsZSAoMSkgewotCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fAotCQkJCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPT0gMikgewotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pICE9IDApCi0JCQkJZ290byBuZXh0X2VudHJ5OwotCQkJLyogSWYgd2UndmUgZ290IHRoaXMgZmFyLCB3ZSdyZSBkb25lICovCi0JCQlicmVhazsKLQkJfQotCSAgICAgIG5leHRfZW50cnk6Ci0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCWRmbHQgPSAqY2ZnOwotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl9CiAKLQlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpOworCWlmIChwY21jaWFfbG9vcF9jb25maWcobGluaywgaXhqX2NvbmZpZ19jaGVjaywgJmRmbHQpKQorCQlnb3RvIGNzX2ZhaWxlZDsKKworCWlmIChwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSkKKwkJZ290byBjc19mYWlsZWQ7CiAKIAkvKgogIAkgKglSZWdpc3RlciB0aGUgY2FyZCB3aXRoIHRoZSBjb3JlLgotIAkgKi8JCi0Jaj1peGpfcGNtY2lhX3Byb2JlKGxpbmstPmlvLkJhc2VQb3J0MSxsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwKTsKKwkgKi8KKwlqID0gaXhqX3BjbWNpYV9wcm9iZShsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLkJhc2VQb3J0MSArIDB4MTApOwogCiAJaW5mby0+bmRldiA9IDE7CiAJaW5mby0+bm9kZS5tYWpvciA9IFBIT05FX01BSk9SOwogCWxpbmstPmRldl9ub2RlID0gJmluZm8tPm5vZGU7CiAJaXhqX2dldF9zZXJpYWwobGluaywgaik7CiAJcmV0dXJuIDA7CisKICAgICAgIGNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CiAJaXhqX2NzX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby9LY29uZmlnIGIvZHJpdmVycy91aW8vS2NvbmZpZwppbmRleCA0MTkwYmU2Li4wNGI5NTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdWlvL0tjb25maWcKQEAgLTU4LDQgKzU4LDE3IEBACiAKIAkgIElmIHlvdSBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHVpb19zbXguCiAKK2NvbmZpZyBVSU9fU0VSQ09TMworCXRyaXN0YXRlICJBdXRvbWF0YSBTZXJjb3MgSUlJIFBDSSBjYXJkIGRyaXZlciIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBVc2Vyc3BhY2UgSS9PIGludGVyZmFjZSBmb3IgdGhlIFNlcmNvcyBJSUkgUENJIGNhcmQgZnJvbQorCSAgQXV0b21hdGEgR21iSC4gVGhlIHVzZXJzcGFjZSBwYXJ0IG9mIHRoaXMgZHJpdmVyIHdpbGwgYmUKKwkgIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgQXV0b21hdGEgR21iSCB3ZWIgc2l0ZS4KKworCSAgQXV0b21hdGEgR21iSDogICAgICAgIGh0dHA6Ly93d3cuYXV0b21hdGF3ZWIuY29tCisJICBTZXJjb3MgSUlJIGludGVyZmFjZTogaHR0cDovL3d3dy5zZXJjb3MuY29tCisKKwkgIElmIHlvdSBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHVpb19zZXJjb3MzLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vTWFrZWZpbGUgYi9kcml2ZXJzL3Vpby9NYWtlZmlsZQppbmRleCA4NjY3YmJkLi5lNjk1NTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Vpby9NYWtlZmlsZQpAQCAtMywzICszLDQgQEAKIG9iai0kKENPTkZJR19VSU9fUERSVikJKz0gdWlvX3BkcnYubwogb2JqLSQoQ09ORklHX1VJT19QRFJWX0dFTklSUSkJKz0gdWlvX3BkcnZfZ2VuaXJxLm8KIG9iai0kKENPTkZJR19VSU9fU01YKQkrPSB1aW9fc214Lm8KK29iai0kKENPTkZJR19VSU9fU0VSQ09TMykJKz0gdWlvX3NlcmNvczMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvLmMgYi9kcml2ZXJzL3Vpby91aW8uYwppbmRleCAzYTY5MzRiLi41ZGNjZjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW8uYworKysgYi9kcml2ZXJzL3Vpby91aW8uYwpAQCAtNjcsNiArNjcsMTEgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgbWVtLT5zaXplKTsKIH0KIAorc3RhdGljIHNzaXplX3QgbWFwX29mZnNldF9zaG93KHN0cnVjdCB1aW9fbWVtICptZW0sIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgbWVtLT5hZGRyICYgflBBR0VfTUFTSyk7Cit9CisKIHN0cnVjdCB1aW9fc3lzZnNfZW50cnkgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHVpb19tZW0gKiwgY2hhciAqKTsKQEAgLTc3LDEwICs4MiwxMyBAQAogCV9fQVRUUihhZGRyLCBTX0lSVUdPLCBtYXBfYWRkcl9zaG93LCBOVUxMKTsKIHN0YXRpYyBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IHNpemVfYXR0cmlidXRlID0KIAlfX0FUVFIoc2l6ZSwgU19JUlVHTywgbWFwX3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IHVpb19zeXNmc19lbnRyeSBvZmZzZXRfYXR0cmlidXRlID0KKwlfX0FUVFIob2Zmc2V0LCBTX0lSVUdPLCBtYXBfb2Zmc2V0X3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbXSA9IHsKIAkmYWRkcl9hdHRyaWJ1dGUuYXR0ciwKIAkmc2l6ZV9hdHRyaWJ1dGUuYXR0ciwKKwkmb2Zmc2V0X2F0dHJpYnV0ZS5hdHRyLAogCU5VTEwsCS8qIG5lZWQgdG8gTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyAqLwogfTsKIApAQCAtNDgyLDE1ICs0OTAsMjMgQEAKIHsKIAlzdHJ1Y3QgdWlvX2RldmljZSAqaWRldiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaW50IG1pID0gdWlvX2ZpbmRfbWVtX2luZGV4KHZtYSk7CiAJaWYgKG1pIDwgMCkKIAkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIAorCS8qCisJICogV2UgbmVlZCB0byBzdWJ0cmFjdCBtaSBiZWNhdXNlIHVzZXJzcGFjZSB1c2VzIG9mZnNldCA9IE4qUEFHRV9TSVpFCisJICogdG8gdXNlIG1lbVtOXS4KKwkgKi8KKwlvZmZzZXQgPSAodm1mLT5wZ29mZiAtIG1pKSA8PCBQQUdFX1NISUZUOworCiAJaWYgKGlkZXYtPmluZm8tPm1lbVttaV0ubWVtdHlwZSA9PSBVSU9fTUVNX0xPR0lDQUwpCi0JCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaWRldi0+aW5mby0+bWVtW21pXS5hZGRyKTsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShpZGV2LT5pbmZvLT5tZW1bbWldLmFkZHIgKyBvZmZzZXQpOwogCWVsc2UKLQkJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCopaWRldi0+aW5mby0+bWVtW21pXS5hZGRyKTsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWlkZXYtPmluZm8tPm1lbVttaV0uYWRkcgorCQkJCQkJCSsgb2Zmc2V0KTsKIAlnZXRfcGFnZShwYWdlKTsKIAl2bWYtPnBhZ2UgPSBwYWdlOwogCXJldHVybiAwOwpAQCAtNjgyLDkgKzY5OCw5IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfZ2V0X21pbm9yOwogCi0JaWRldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHVpb19jbGFzcy0+Y2xhc3MsIHBhcmVudCwKLQkJCQkJICBNS0RFVih1aW9fbWFqb3IsIGlkZXYtPm1pbm9yKSwgaWRldiwKLQkJCQkJICAidWlvJWQiLCBpZGV2LT5taW5vcik7CisJaWRldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh1aW9fY2xhc3MtPmNsYXNzLCBwYXJlbnQsCisJCQkJICBNS0RFVih1aW9fbWFqb3IsIGlkZXYtPm1pbm9yKSwgaWRldiwKKwkJCQkgICJ1aW8lZCIsIGlkZXYtPm1pbm9yKTsKIAlpZiAoSVNfRVJSKGlkZXYtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVSU86IGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOwogCQlyZXQgPSBQVFJfRVJSKGlkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fcGRydi5jIGIvZHJpdmVycy91aW8vdWlvX3BkcnYuYwppbmRleCAwYjRlZjM5Li5kNDk0Y2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fcGRydi5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2LmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKLSNkZWZpbmUgRFJJVkVSX05BTUUgInVpbyIKKyNkZWZpbmUgRFJJVkVSX05BTUUgInVpb19wZHJ2IgogCiBzdHJ1Y3QgdWlvX3BsYXRkYXRhIHsKIAlzdHJ1Y3QgdWlvX2luZm8gKnVpb2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fc2VyY29zMy5jIGIvZHJpdmVycy91aW8vdWlvX3NlcmNvczMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQxYjJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91aW8vdWlvX3NlcmNvczMuYwpAQCAtMCwwICsxLDI0MyBAQAorLyogc2VyY29zMzogVUlPIGRyaXZlciBmb3IgdGhlIEF1dG9tYXRhIFNlcmNvcyBJSUkgUENJIGNhcmQKKworICAgQ29weXJpZ2h0IChDKSAyMDA4IExpbnV0cm9uaXggR21iSAorICAgICBBdXRob3I6IEpvaG4gT2duZXNzIDxqb2huLm9nbmVzc0BsaW51dHJvbml4LmRlPgorCisgICBUaGlzIGlzIGEgc3RyYWlnaHQtZm9yd2FyZCBVSU8gZHJpdmVyLCB3aGVyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorICAgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCByZS1lbmFibGVkIHZpYSBhIHdyaXRlIHRvIHRoZSBVSU8gZGV2aWNlCisgICBieSB0aGUgdXNlcnNwYWNlLXBhcnQuCisKKyAgIFRoZSBvbmx5IHBhcnQgdGhhdCBtYXkgc2VlbSBvZGQgaXMgdGhlIHVzZSBvZiBhIGxvZ2ljYWwgT1Igd2hlbgorICAgc3RvcmluZyBhbmQgcmVzdG9yaW5nIGVuYWJsZWQgaW50ZXJydXB0cy4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlCisgICB1c2Vyc3BhY2UtcGFydCBjb3VsZCBkaXJlY3RseSBtb2RpZnkgdGhlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIKKyAgIGF0IGFueSB0aW1lLiBUbyByZWR1Y2UgcG9zc2libGUgY29uZmxpY3RzLCB0aGUga2VybmVsIGRyaXZlciB1c2VzCisgICBhIGxvZ2ljYWwgT1IgdG8gbWFrZSBtb3JlIGNvbnRyb2xsZWQgY2hhbmdlcyAocmF0aGVyIHRoYW4gYmxpbmRseQorICAgb3ZlcndyaXRpbmcgcHJldmlvdXMgdmFsdWVzKS4KKworICAgUmFjZSBjb25kaXRpb25zIGV4aXN0IGlmIHRoZSB1c2Vyc3BhY2UtcGFydCBkaXJlY3RseSBtb2RpZmllcyB0aGUKKyAgIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgd2hpbGUgaW4gb3BlcmF0aW9uLiBUaGUgY29uc2VxdWVuY2VzIGFyZQorICAgdGhhdCBjZXJ0YWluIGludGVycnVwdHMgd291bGQgZmFpbCB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBGb3IKKyAgIHRoaXMgcmVhc29uLCB0aGUgdXNlcnNwYWNlLXBhcnQgc2hvdWxkIG9ubHkgZGlyZWN0bHkgbW9kaWZ5IHRoZQorICAgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciBhdCB0aGUgYmVnaW5uaW5nICh0byBnZXQgdGhpbmdzIGdvaW5nKS4KKyAgIFRoZSB1c2Vyc3BhY2UtcGFydCBjYW4gc2FmZWx5IGRpc2FibGUgaW50ZXJydXB0cyBhdCBhbnkgdGltZSB1c2luZworICAgYSB3cml0ZSB0byB0aGUgVUlPIGRldmljZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyogSUQncyBmb3IgU0VSQ09TIElJSSBQQ0kgY2FyZCAoUExYIDkwMzApICovCisjZGVmaW5lIFNFUkNPU19TVUJfVkVORE9SX0lEICAweDE5NzEKKyNkZWZpbmUgU0VSQ09TX1NVQl9TWVNJRF8zNTMwIDB4MzUzMAorI2RlZmluZSBTRVJDT1NfU1VCX1NZU0lEXzM1MzUgMHgzNTM1CisjZGVmaW5lIFNFUkNPU19TVUJfU1lTSURfMzc4MCAweDM3ODAKKworLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBJRVIwX09GRlNFVCAweDA4CisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVNSMF9PRkZTRVQgMHgxOAorCitzdHJ1Y3Qgc2VyY29zM19wcml2IHsKKwl1MzIgaWVyMF9jYWNoZTsKKwlzcGlubG9ja190IGllcjBfY2FjaGVfbG9jazsKK307CisKKy8qIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyBpZXIwX2NhY2hlX2xvY2sgaXMgbG9ja2VkISAqLworc3RhdGljIHZvaWQgc2VyY29zM19kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IHVpb19pbmZvICppbmZvLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2VyY29zM19wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqaWVyMCA9IGluZm8tPm1lbVszXS5pbnRlcm5hbF9hZGRyICsgSUVSMF9PRkZTRVQ7CisKKwkvKiBhZGQgZW5hYmxlZCBpbnRlcnJ1cHRzIHRvIGNhY2hlICovCisJcHJpdi0+aWVyMF9jYWNoZSB8PSBpb3JlYWQzMihpZXIwKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBpZXIwKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBhc3N1bWVzIGllcjBfY2FjaGVfbG9jayBpcyBsb2NrZWQhICovCitzdGF0aWMgdm9pZCBzZXJjb3MzX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB1aW9faW5mbyAqaW5mbywKKwkJCQkgICAgICBzdHJ1Y3Qgc2VyY29zM19wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqaWVyMCA9IGluZm8tPm1lbVszXS5pbnRlcm5hbF9hZGRyICsgSUVSMF9PRkZTRVQ7CisKKwkvKiByZXN0b3JlIHByZXZpb3VzbHkgZW5hYmxlZCBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKGlvcmVhZDMyKGllcjApIHwgcHJpdi0+aWVyMF9jYWNoZSwgaWVyMCk7CisJcHJpdi0+aWVyMF9jYWNoZSA9IDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXJjb3MzX2hhbmRsZXIoaW50IGlycSwgc3RydWN0IHVpb19pbmZvICppbmZvKQoreworCXN0cnVjdCBzZXJjb3MzX3ByaXYgKnByaXYgPSBpbmZvLT5wcml2OworCXZvaWQgX19pb21lbSAqaXNyMCA9IGluZm8tPm1lbVszXS5pbnRlcm5hbF9hZGRyICsgSVNSMF9PRkZTRVQ7CisJdm9pZCBfX2lvbWVtICppZXIwID0gaW5mby0+bWVtWzNdLmludGVybmFsX2FkZHIgKyBJRVIwX09GRlNFVDsKKworCWlmICghKGlvcmVhZDMyKGlzcjApICYgaW9yZWFkMzIoaWVyMCkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnByaXYtPmllcjBfY2FjaGVfbG9jayk7CisJc2VyY29zM19kaXNhYmxlX2ludGVycnVwdHMoaW5mbywgcHJpdik7CisJc3Bpbl91bmxvY2soJnByaXYtPmllcjBfY2FjaGVfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2VyY29zM19pcnFjb250cm9sKHN0cnVjdCB1aW9faW5mbyAqaW5mbywgczMyIGlycV9vbikKK3sKKwlzdHJ1Y3Qgc2VyY29zM19wcml2ICpwcml2ID0gaW5mby0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmllcjBfY2FjaGVfbG9jayk7CisJaWYgKGlycV9vbikKKwkJc2VyY29zM19lbmFibGVfaW50ZXJydXB0cyhpbmZvLCBwcml2KTsKKwllbHNlCisJCXNlcmNvczNfZGlzYWJsZV9pbnRlcnJ1cHRzKGluZm8sIHByaXYpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+aWVyMF9jYWNoZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcmNvczNfc2V0dXBfaW9tZW0oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHVpb19pbmZvICppbmZvLAorCQkJICAgICAgIGludCBuLCBpbnQgcGNpX2JhcikKK3sKKwlpbmZvLT5tZW1bbl0uYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIHBjaV9iYXIpOworCWlmICghaW5mby0+bWVtW25dLmFkZHIpCisJCXJldHVybiAtMTsKKwlpbmZvLT5tZW1bbl0uaW50ZXJuYWxfYWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgcGNpX2JhciksCisJCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIHBjaV9iYXIpKTsKKwlpZiAoIWluZm8tPm1lbVtuXS5pbnRlcm5hbF9hZGRyKQorCQlyZXR1cm4gLTE7CisJaW5mby0+bWVtW25dLnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgcGNpX2Jhcik7CisJaW5mby0+bWVtW25dLm1lbXR5cGUgPSBVSU9fTUVNX1BIWVM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNlcmNvczNfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdWlvX2luZm8gKmluZm87CisJc3RydWN0IHNlcmNvczNfcHJpdiAqcHJpdjsKKwlpbnQgaTsKKworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWlvX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJjb3MzX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJZ290byBvdXRfZnJlZV9wcml2OworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCAic2VyY29zMyIpKQorCQlnb3RvIG91dF9kaXNhYmxlOworCisJLyogd2Ugb25seSBuZWVkIFBDSSBCQVIncyAwLCAyLCAzLCA0LCA1ICovCisJaWYgKHNlcmNvczNfc2V0dXBfaW9tZW0oZGV2LCBpbmZvLCAwLCAwKSkKKwkJZ290byBvdXRfdW5tYXA7CisJaWYgKHNlcmNvczNfc2V0dXBfaW9tZW0oZGV2LCBpbmZvLCAxLCAyKSkKKwkJZ290byBvdXRfdW5tYXA7CisJaWYgKHNlcmNvczNfc2V0dXBfaW9tZW0oZGV2LCBpbmZvLCAyLCAzKSkKKwkJZ290byBvdXRfdW5tYXA7CisJaWYgKHNlcmNvczNfc2V0dXBfaW9tZW0oZGV2LCBpbmZvLCAzLCA0KSkKKwkJZ290byBvdXRfdW5tYXA7CisJaWYgKHNlcmNvczNfc2V0dXBfaW9tZW0oZGV2LCBpbmZvLCA0LCA1KSkKKwkJZ290byBvdXRfdW5tYXA7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aWVyMF9jYWNoZV9sb2NrKTsKKwlpbmZvLT5wcml2ID0gcHJpdjsKKwlpbmZvLT5uYW1lID0gIlNlcmNvc19JSUlfUENJIjsKKwlpbmZvLT52ZXJzaW9uID0gIjAuMC4xIjsKKwlpbmZvLT5pcnEgPSBkZXYtPmlycTsKKwlpbmZvLT5pcnFfZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQ7CisJaW5mby0+aGFuZGxlciA9IHNlcmNvczNfaGFuZGxlcjsKKwlpbmZvLT5pcnFjb250cm9sID0gc2VyY29zM19pcnFjb250cm9sOworCisJcGNpX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CisKKwlpZiAodWlvX3JlZ2lzdGVyX2RldmljZSgmZGV2LT5kZXYsIGluZm8pKQorCQlnb3RvIG91dF91bm1hcDsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoaW5mby0+bWVtW2ldLmludGVybmFsX2FkZHIpCisJCQlpb3VubWFwKGluZm8tPm1lbVtpXS5pbnRlcm5hbF9hZGRyKTsKKwl9CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CitvdXRfZnJlZV9wcml2OgorCWtmcmVlKHByaXYpOworb3V0X2ZyZWU6CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmNvczNfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB1aW9faW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOworCisJdWlvX3VucmVnaXN0ZXJfZGV2aWNlKGluZm8pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChpbmZvLT5tZW1baV0uaW50ZXJuYWxfYWRkcikKKwkJCWlvdW5tYXAoaW5mby0+bWVtW2ldLmludGVybmFsX2FkZHIpOworCX0KKwlrZnJlZShpbmZvLT5wcml2KTsKKwlrZnJlZShpbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNlcmNvczNfcGNpX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudmVuZG9yID0gICAgICAgUENJX1ZFTkRPUl9JRF9QTFgsCisJCS5kZXZpY2UgPSAgICAgICBQQ0lfREVWSUNFX0lEX1BMWF85MDMwLAorCQkuc3VidmVuZG9yID0gICAgU0VSQ09TX1NVQl9WRU5ET1JfSUQsCisJCS5zdWJkZXZpY2UgPSAgICBTRVJDT1NfU1VCX1NZU0lEXzM1MzAsCisJfSwKKwl7CisJCS52ZW5kb3IgPSAgICAgICBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLmRldmljZSA9ICAgICAgIFBDSV9ERVZJQ0VfSURfUExYXzkwMzAsCisJCS5zdWJ2ZW5kb3IgPSAgICBTRVJDT1NfU1VCX1ZFTkRPUl9JRCwKKwkJLnN1YmRldmljZSA9ICAgIFNFUkNPU19TVUJfU1lTSURfMzUzNSwKKwl9LAorCXsKKwkJLnZlbmRvciA9ICAgICAgIFBDSV9WRU5ET1JfSURfUExYLAorCQkuZGV2aWNlID0gICAgICAgUENJX0RFVklDRV9JRF9QTFhfOTAzMCwKKwkJLnN1YnZlbmRvciA9ICAgIFNFUkNPU19TVUJfVkVORE9SX0lELAorCQkuc3ViZGV2aWNlID0gICAgU0VSQ09TX1NVQl9TWVNJRF8zNzgwLAorCX0sCisJeyAwLCB9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2VyY29zM19wY2lfZHJpdmVyID0geworCS5uYW1lID0gInNlcmNvczMiLAorCS5pZF90YWJsZSA9IHNlcmNvczNfcGNpX2lkcywKKwkucHJvYmUgPSBzZXJjb3MzX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gc2VyY29zM19wY2lfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2VyY29zM19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzZXJjb3MzX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2VyY29zM19leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2VyY29zM19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2VyY29zM19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzZXJjb3MzX2V4aXRfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJVSU8gZHJpdmVyIGZvciB0aGUgQXV0b21hdGEgU2VyY29zIElJSSBQQ0kgY2FyZCIpOworTU9EVUxFX0FVVEhPUigiSm9obiBPZ25lc3MgPGpvaG4ub2duZXNzQGxpbnV0cm9uaXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKaW5kZXggMDcyMjg3Mi4uMGRhMmMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpAQCAtNjQwLDE0ICs2NDAsMTMgQEAKIAogCWF0bV9kYmcoaW5zdGFuY2UsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAJc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNuZHF1ZXVlLmxvY2spOwotCWZvciAoc2tiID0gaW5zdGFuY2UtPnNuZHF1ZXVlLm5leHQsIG4gPSBza2ItPm5leHQ7Ci0JICAgICBza2IgIT0gKHN0cnVjdCBza19idWZmICopJmluc3RhbmNlLT5zbmRxdWV1ZTsKLQkgICAgIHNrYiA9IG4sIG4gPSBza2ItPm5leHQpCisJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmaW5zdGFuY2UtPnNuZHF1ZXVlLCBza2IsIG4pIHsKIAkJaWYgKFVEU0xfU0tCKHNrYiktPmF0bS52Y2MgPT0gdmNjKSB7CiAJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHBvcHBpbmcgc2tiIDB4JXBcbiIsIF9fZnVuY19fLCBza2IpOwogCQkJX19za2JfdW5saW5rKHNrYiwgJmluc3RhbmNlLT5zbmRxdWV1ZSk7CiAJCQl1c2JhdG1fcG9wKHZjYywgc2tiKTsKIAkJfQorCX0KIAlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zbmRxdWV1ZS5sb2NrKTsKIAogCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnR4X2NoYW5uZWwudGFza2xldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggMjAyOTBjNS4uN2E0ZmE3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtMTcyOSw5ICsxNzI5LDkgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpjbGRldjsKIAotCWNsZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHVzYl9jbGFzc2Rldl9jbGFzcywgJmRldi0+ZGV2LAotCQkJCSAgICAgIGRldi0+ZGV2LmRldnQsIE5VTEwsICJ1c2JkZXYlZC4lZCIsCi0JCQkJICAgICAgZGV2LT5idXMtPmJ1c251bSwgZGV2LT5kZXZudW0pOworCWNsZGV2ID0gZGV2aWNlX2NyZWF0ZSh1c2JfY2xhc3NkZXZfY2xhc3MsICZkZXYtPmRldiwgZGV2LT5kZXYuZGV2dCwKKwkJCSAgICAgIE5VTEwsICJ1c2JkZXYlZC4lZCIsIGRldi0+YnVzLT5idXNudW0sCisJCQkgICAgICBkZXYtPmRldm51bSk7CiAJaWYgKElTX0VSUihjbGRldikpCiAJCXJldHVybiBQVFJfRVJSKGNsZGV2KTsKIAlkZXYtPnVzYl9jbGFzc2RldiA9IGNsZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9maWxlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYwppbmRleCA2YjFiMjI5Li41NWY3ZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYwpAQCAtMTk2LDkgKzE5Niw5IEBACiAJCSsrdGVtcDsKIAllbHNlCiAJCXRlbXAgPSBuYW1lOwotCWludGYtPnVzYl9kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodXNiX2NsYXNzLT5jbGFzcywgJmludGYtPmRldiwKLQkJCQkJICAgICAgTUtERVYoVVNCX01BSk9SLCBtaW5vciksIE5VTEwsCi0JCQkJCSAgICAgICIlcyIsIHRlbXApOworCWludGYtPnVzYl9kZXYgPSBkZXZpY2VfY3JlYXRlKHVzYl9jbGFzcy0+Y2xhc3MsICZpbnRmLT5kZXYsCisJCQkJICAgICAgTUtERVYoVVNCX01BSk9SLCBtaW5vciksIE5VTEwsCisJCQkJICAgICAgIiVzIiwgdGVtcCk7CiAJaWYgKElTX0VSUihpbnRmLT51c2JfZGV2KSkgewogCQlkb3duX3dyaXRlKCZtaW5vcl9yd3NlbSk7CiAJCXVzYl9taW5vcnNbaW50Zi0+bWlub3JdID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IDhhYmQ0ZTUuLmM4MDM1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtODE4LDkgKzgxOCw4IEBACiAJc2V0X2JpdCAoYnVzbnVtLCBidXNtYXAuYnVzbWFwKTsKIAlidXMtPmJ1c251bSA9IGJ1c251bTsKIAotCWJ1cy0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHVzYl9ob3N0X2NsYXNzLCBidXMtPmNvbnRyb2xsZXIsCi0JCQkJCSBNS0RFVigwLCAwKSwgYnVzLAotCQkJCQkgInVzYl9ob3N0JWQiLCBidXNudW0pOworCWJ1cy0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh1c2JfaG9zdF9jbGFzcywgYnVzLT5jb250cm9sbGVyLCBNS0RFVigwLCAwKSwKKwkJCQkgYnVzLCAidXNiX2hvc3QlZCIsIGJ1c251bSk7CiAJcmVzdWx0ID0gUFRSX0VSUihidXMtPmRldik7CiAJaWYgKElTX0VSUihidXMtPmRldikpCiAJCWdvdG8gZXJyb3JfY3JlYXRlX2NsYXNzX2RldjsKQEAgLTE4NzYsNyArMTg3NSw4IEBACiAJCSAqIHdpdGggSVJRRl9TSEFSRUQuIEFzIHVzYl9oY2RfaXJxKCkgd2lsbCBhbHdheXMgZGlzYWJsZQogCQkgKiBpbnRlcnJ1cHRzIHdlIGNhbiByZW1vdmUgaXQgaGVyZS4KIAkJICovCi0JCWlycWZsYWdzICY9IH5JUlFGX0RJU0FCTEVEOworCQlpZiAoaXJxZmxhZ3MgJiBJUlFGX1NIQVJFRCkKKwkJCWlycWZsYWdzICY9IH5JUlFGX0RJU0FCTEVEOwogCiAJCXNucHJpbnRmKGhjZC0+aXJxX2Rlc2NyLCBzaXplb2YoaGNkLT5pcnFfZGVzY3IpLCAiJXM6dXNiJWQiLAogCQkJCWhjZC0+ZHJpdmVyLT5kZXNjcmlwdGlvbiwgaGNkLT5zZWxmLmJ1c251bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA2YTVjYjAxLi5kOTk5NjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTI2ODMsMzUgKzI2ODMsMTcgQEAKIAkJCQlVU0JfUE9SVF9TVEFUX0NfRU5BQkxFKTsKICNlbmRpZgogCi0JLyogVHJ5IHRvIHVzZSB0aGUgZGVib3VuY2UgZGVsYXkgZm9yIHByb3RlY3Rpb24gYWdhaW5zdAotCSAqIHBvcnQtZW5hYmxlIGNoYW5nZXMgY2F1c2VkLCBmb3IgZXhhbXBsZSwgYnkgRU1JLgotCSAqLwotCWlmIChwb3J0Y2hhbmdlICYgKFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIHwKLQkJCQlVU0JfUE9SVF9TVEFUX0NfRU5BQkxFKSkgewotCQlzdGF0dXMgPSBodWJfcG9ydF9kZWJvdW5jZShodWIsIHBvcnQxKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQkJZGV2X2VyciAoaHViX2RldiwgImNvbm5lY3QtZGVib3VuY2UgZmFpbGVkLCAiCi0JCQkJCQkicG9ydCAlZCBkaXNhYmxlZFxuIiwgcG9ydDEpOwotCQkJcG9ydHN0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OOwotCQl9IGVsc2UgewotCQkJcG9ydHN0YXR1cyA9IHN0YXR1czsKLQkJfQotCX0KLQogCS8qIFRyeSB0byByZXN1c2NpdGF0ZSBhbiBleGlzdGluZyBkZXZpY2UgKi8KIAl1ZGV2ID0gaGRldi0+Y2hpbGRyZW5bcG9ydDEtMV07CiAJaWYgKChwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSAmJiB1ZGV2ICYmCiAJCQl1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKLQogCQl1c2JfbG9ja19kZXZpY2UodWRldik7CiAJCWlmIChwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpIHsKIAkJCXN0YXR1cyA9IDA7CQkvKiBOb3RoaW5nIHRvIGRvICovCi0JCX0gZWxzZSBpZiAoIXVkZXYtPnBlcnNpc3RfZW5hYmxlZCkgewotCQkJc3RhdHVzID0gLUVOT0RFVjsJLyogTXVzdG4ndCByZXN1c2NpdGF0ZSAqLwogCiAjaWZkZWYgQ09ORklHX1VTQl9TVVNQRU5ECi0JCX0gZWxzZSBpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgeworCQl9IGVsc2UgaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQgJiYKKwkJCQl1ZGV2LT5wZXJzaXN0X2VuYWJsZWQpIHsKIAkJCS8qIEZvciBhIHN1c3BlbmRlZCBkZXZpY2UsIHRyZWF0IHRoaXMgYXMgYQogCQkJICogcmVtb3RlIHdha2V1cCBldmVudC4KIAkJCSAqLwpAQCAtMjcyNiw3ICsyNzA4LDcgQEAKICNlbmRpZgogCiAJCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSB1c2JfcmVzZXRfZGV2aWNlKHVkZXYpOworCQkJc3RhdHVzID0gLUVOT0RFVjsJLyogRG9uJ3QgcmVzdXNjaXRhdGUgKi8KIAkJfQogCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKIApAQCAtMjc0MSw2ICsyNzIzLDE5IEBACiAJCXVzYl9kaXNjb25uZWN0KCZoZGV2LT5jaGlsZHJlbltwb3J0MS0xXSk7CiAJY2xlYXJfYml0KHBvcnQxLCBodWItPmNoYW5nZV9iaXRzKTsKIAorCWlmIChwb3J0Y2hhbmdlICYgKFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIHwKKwkJCQlVU0JfUE9SVF9TVEFUX0NfRU5BQkxFKSkgeworCQlzdGF0dXMgPSBodWJfcG9ydF9kZWJvdW5jZShodWIsIHBvcnQxKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihodWJfZGV2LCAiY29ubmVjdC1kZWJvdW5jZSBmYWlsZWQsICIKKwkJCQkJCSJwb3J0ICVkIGRpc2FibGVkXG4iLCBwb3J0MSk7CisJCQlwb3J0c3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCX0gZWxzZSB7CisJCQlwb3J0c3RhdHVzID0gc3RhdHVzOworCQl9CisJfQorCiAJLyogUmV0dXJuIG5vdyBpZiBkZWJvdW5jaW5nIGZhaWxlZCBvciBub3RoaW5nIGlzIGNvbm5lY3RlZCAqLwogCWlmICghKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pKSB7CiAKQEAgLTI3NDgsNyArMjc0Myw3IEBACiAJCWlmICgod0h1YkNoYXJhY3RlcmlzdGljcyAmIEhVQl9DSEFSX0xQU00pIDwgMgogCQkJCSYmICEocG9ydHN0YXR1cyAmICgxIDw8IFVTQl9QT1JUX0ZFQVRfUE9XRVIpKSkKIAkJCXNldF9wb3J0X2ZlYXR1cmUoaGRldiwgcG9ydDEsIFVTQl9QT1JUX0ZFQVRfUE9XRVIpOwotIAorCiAJCWlmIChwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpCiAgIAkJCWdvdG8gZG9uZTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCmluZGV4IGRiNDEwZTkuLjc3ZmE3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAlPcHRfZXJyLAogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfZGV2dWlkLCAiZGV2dWlkPSV1In0sCiAJe09wdF9kZXZnaWQsICJkZXZnaWQ9JXUifSwKIAl7T3B0X2Rldm1vZGUsICJkZXZtb2RlPSVvIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKaW5kZXggZmNiNWNiOS4uMjI2N2ZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQpAQCAtMjIsMjQgKzIyLDE1IEBACiAjCiAjIFVTQiBnYWRnZXQgZHJpdmVycwogIwotQ19VVElMUyA9CWNvbXBvc2l0ZS5vIHVzYnN0cmluZy5vIGNvbmZpZy5vIGVwYXV0b2NvbmYubwotCi1nX3plcm8tb2JqcwkJCTo9IHplcm8ubyBmX3NvdXJjZXNpbmsubyBmX2xvb3BiYWNrLm8gJChDX1VUSUxTKQotZ19ldGhlci1vYmpzCQkJOj0gZXRoZXIubyB1X2V0aGVyLm8gZl9zdWJzZXQubyBmX2VjbS5vICQoQ19VVElMUykKLWdfc2VyaWFsLW9ianMJCQk6PSBzZXJpYWwubyB1X3NlcmlhbC5vIGZfYWNtLm8gZl9zZXJpYWwubyAkKENfVVRJTFMpCi1nX21pZGktb2JqcwkJCTo9IGdtaWRpLm8gdXNic3RyaW5nLm8gY29uZmlnLm8gZXBhdXRvY29uZi5vCitnX3plcm8tb2JqcwkJCTo9IHplcm8ubworZ19ldGhlci1vYmpzCQkJOj0gZXRoZXIubworZ19zZXJpYWwtb2JqcwkJCTo9IHNlcmlhbC5vCitnX21pZGktb2JqcwkJCTo9IGdtaWRpLm8KIGdhZGdldGZzLW9ianMJCQk6PSBpbm9kZS5vCi1nX2ZpbGVfc3RvcmFnZS1vYmpzCQk6PSBmaWxlX3N0b3JhZ2UubyB1c2JzdHJpbmcubyBjb25maWcubyBcCi0JCQkJCWVwYXV0b2NvbmYubwotZ19wcmludGVyLW9ianMJCQk6PSBwcmludGVyLm8gdXNic3RyaW5nLm8gY29uZmlnLm8gXAotCQkJCQllcGF1dG9jb25mLm8KLWdfY2RjLW9ianMJCQk6PSBjZGMyLm8gdV9ldGhlci5vIGZfZWNtLm8gXAotCQkJCQl1X3NlcmlhbC5vIGZfYWNtLm8gJChDX1VUSUxTKQorZ19maWxlX3N0b3JhZ2Utb2JqcwkJOj0gZmlsZV9zdG9yYWdlLm8KK2dfcHJpbnRlci1vYmpzCQkJOj0gcHJpbnRlci5vCitnX2NkYy1vYmpzCQkJOj0gY2RjMi5vCiAKLWlmZXEgKCQoQ09ORklHX1VTQl9FVEhfUk5ESVMpLHkpCi0JZ19ldGhlci1vYmpzCQkrPSBmX3JuZGlzLm8gcm5kaXMubwotZW5kaWYKLSAKIG9iai0kKENPTkZJR19VU0JfWkVSTykJCSs9IGdfemVyby5vCiBvYmotJChDT05GSUdfVVNCX0VUSCkJCSs9IGdfZXRoZXIubwogb2JqLSQoQ09ORklHX1VTQl9HQURHRVRGUykJKz0gZ2FkZ2V0ZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jZGMyLmMKaW5kZXggYTM5YTRiOS4uYTcyNGZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jCkBAIC00Myw2ICs0MywyNSBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKgorICogS2J1aWxkIGlzIG5vdCB2ZXJ5IGNvb3BlcmF0aXZlIHdpdGggcmVzcGVjdCB0byBsaW5raW5nIHNlcGFyYXRlbHkKKyAqIGNvbXBpbGVkIGxpYnJhcnkgb2JqZWN0cyBpbnRvIG9uZSBtb2R1bGUuICBTbyBmb3Igbm93IHdlIHdvbid0IHVzZQorICogc2VwYXJhdGUgY29tcGlsYXRpb24gLi4uIGVuc3VyaW5nIGluaXQvZXhpdCBzZWN0aW9ucyB3b3JrIHRvIHNocmluaworICogdGhlIHJ1bnRpbWUgZm9vdHByaW50LCBhbmQgZ2l2aW5nIHVzIGF0IGxlYXN0IHNvbWUgcGFydHMgb2Ygd2hhdAorICogYSAiZ2NjIC0tY29tYmluZSAuLi4gcGFydDEuYyBwYXJ0Mi5jIHBhcnQzLmMgLi4uICIgYnVpbGQgd291bGQuCisgKi8KKworI2luY2x1ZGUgImNvbXBvc2l0ZS5jIgorI2luY2x1ZGUgInVzYnN0cmluZy5jIgorI2luY2x1ZGUgImNvbmZpZy5jIgorI2luY2x1ZGUgImVwYXV0b2NvbmYuYyIKKyNpbmNsdWRlICJ1X3NlcmlhbC5jIgorI2luY2x1ZGUgImZfYWNtLmMiCisjaW5jbHVkZSAiZl9lY20uYyIKKyNpbmNsdWRlICJ1X2V0aGVyLmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRldmljZV9kZXNjID0gewogCS5iTGVuZ3RoID0JCXNpemVvZiBkZXZpY2VfZGVzYywKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKQEAgLTE0OCw3ICsxNjcsOCBAQAogCWludAkJCXN0YXR1czsKIAogCWlmICghY2FuX3N1cHBvcnRfZWNtKGNkZXYtPmdhZGdldCkpIHsKLQkJRVJST1IoY2RldiwgImNvbnRyb2xsZXIgJyVzJyBub3QgdXNhYmxlXG4iLCBnYWRnZXQtPm5hbWUpOworCQlkZXZfZXJyKCZnYWRnZXQtPmRldiwgImNvbnRyb2xsZXIgJyVzJyBub3QgdXNhYmxlXG4iLAorCQkJCWdhZGdldC0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjAzLDcgKzIyMyw4IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDE7CiAKLQlJTkZPKGNkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBEUklWRVJfREVTQyk7CisJZGV2X2luZm8oJmdhZGdldC0+ZGV2LCAiJXMsIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIiwKKwkJCURSSVZFUl9ERVNDKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IGJjYWMyZTYuLjk0NGM4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC05Niw2ICs5NiwyOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKgorICogS2J1aWxkIGlzIG5vdCB2ZXJ5IGNvb3BlcmF0aXZlIHdpdGggcmVzcGVjdCB0byBsaW5raW5nIHNlcGFyYXRlbHkKKyAqIGNvbXBpbGVkIGxpYnJhcnkgb2JqZWN0cyBpbnRvIG9uZSBtb2R1bGUuICBTbyBmb3Igbm93IHdlIHdvbid0IHVzZQorICogc2VwYXJhdGUgY29tcGlsYXRpb24gLi4uIGVuc3VyaW5nIGluaXQvZXhpdCBzZWN0aW9ucyB3b3JrIHRvIHNocmluaworICogdGhlIHJ1bnRpbWUgZm9vdHByaW50LCBhbmQgZ2l2aW5nIHVzIGF0IGxlYXN0IHNvbWUgcGFydHMgb2Ygd2hhdAorICogYSAiZ2NjIC0tY29tYmluZSAuLi4gcGFydDEuYyBwYXJ0Mi5jIHBhcnQzLmMgLi4uICIgYnVpbGQgd291bGQuCisgKi8KKyNpbmNsdWRlICJjb21wb3NpdGUuYyIKKyNpbmNsdWRlICJ1c2JzdHJpbmcuYyIKKyNpbmNsdWRlICJjb25maWcuYyIKKyNpbmNsdWRlICJlcGF1dG9jb25mLmMiCisKKyNpbmNsdWRlICJmX2VjbS5jIgorI2luY2x1ZGUgImZfc3Vic2V0LmMiCisjaWZkZWYJQ09ORklHX1VTQl9FVEhfUk5ESVMKKyNpbmNsdWRlICJmX3JuZGlzLmMiCisjaW5jbHVkZSAicm5kaXMuYyIKKyNlbmRpZgorI2luY2x1ZGUgInVfZXRoZXIuYyIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogLyogRE8gTk9UIFJFVVNFIFRIRVNFIElEcyB3aXRoIGEgcHJvdG9jb2wtaW5jb21wYXRpYmxlIGRyaXZlciEhICBFdmVyISEKICAqIEluc3RlYWQ6ICBhbGxvY2F0ZSB5b3VyIG93biwgdXNpbmcgbm9ybWFsIFVTQi1JRiBwcm9jZWR1cmVzLgogICovCkBAIC0yOTMsNyArMzE1LDggQEAKIAkJICogYnV0IGlmIHRoZSBjb250cm9sbGVyIGlzbid0IHJlY29nbml6ZWQgYXQgYWxsIHRoZW4KIAkJICogdGhhdCBhc3N1bXB0aW9uIGlzIGEgYml0IG1vcmUgbGlrZWx5IHRvIGJlIHdyb25nLgogCQkgKi8KLQkJV0FSTklORyhjZGV2LCAiY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkOyB0cnlpbmcgJXNcbiIsCisJCWRldl93YXJuKCZnYWRnZXQtPmRldiwKKwkJCQkiY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkOyB0cnlpbmcgJXNcbiIsCiAJCQkJZ2FkZ2V0LT5uYW1lLAogCQkJCWV0aF9jb25maWdfZHJpdmVyLmxhYmVsKTsKIAkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0KQEAgLTMzMiw3ICszNTUsOCBAQAogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIGZhaWw7CiAKLQlJTkZPKGNkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBEUklWRVJfREVTQyk7CisJZGV2X2luZm8oJmdhZGdldC0+ZGV2LCAiJXMsIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIiwKKwkJCURSSVZFUl9ERVNDKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9lY20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCmluZGV4IGEyYjVjMDkuLjRhZTU3OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2VjbS5jCkBAIC04Myw3ICs4Myw3IEBACiB9CiAKIC8qIHBlYWsgKHRoZW9yZXRpY2FsKSBidWxrIHRyYW5zZmVyIHJhdGUgaW4gYml0cy1wZXItc2Vjb25kICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGJpdHJhdGUoc3RydWN0IHVzYl9nYWRnZXQgKmcpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGVjbV9iaXRyYXRlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQogewogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQogCQlyZXR1cm4gMTMgKiA1MTIgKiA4ICogMTAwMCAqIDg7CkBAIC0xMDcsNyArMTA3LDcgQEAKICAqLwogCiAjZGVmaW5lIExPRzJfU1RBVFVTX0lOVEVSVkFMX01TRUMJNQkvKiAxIDw8IDUgPT0gMzIgbXNlYyAqLwotI2RlZmluZSBTVEFUVVNfQllURUNPVU5UCQkxNgkvKiA4IGJ5dGUgaGVhZGVyICsgZGF0YSAqLworI2RlZmluZSBFQ01fU1RBVFVTX0JZVEVDT1VOVAkJMTYJLyogOCBieXRlIGhlYWRlciArIGRhdGEgKi8KIAogCiAvKiBpbnRlcmZhY2UgZGVzY3JpcHRvcjogKi8KQEAgLTEyNSw4ICsxMjUsOCBAQAogCS8qIC5pSW50ZXJmYWNlID0gRFlOQU1JQyAqLwogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfY2RjX2hlYWRlcl9kZXNjIGhlYWRlcl9kZXNjIF9faW5pdGRhdGEgPSB7Ci0JLmJMZW5ndGggPQkJc2l6ZW9mIGhlYWRlcl9kZXNjLAorc3RhdGljIHN0cnVjdCB1c2JfY2RjX2hlYWRlcl9kZXNjIGVjbV9oZWFkZXJfZGVzYyBfX2luaXRkYXRhID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBlY21faGVhZGVyX2Rlc2MsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19JTlRFUkZBQ0UsCiAJLmJEZXNjcmlwdG9yU3ViVHlwZSA9CVVTQl9DRENfSEVBREVSX1RZUEUsCiAKQEAgLTE0MSw4ICsxNDEsOCBAQAogCS8qIC5iU2xhdmVJbnRlcmZhY2UwID0JRFlOQU1JQyAqLwogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MgZXRoZXJfZGVzYyBfX2luaXRkYXRhID0gewotCS5iTGVuZ3RoID0JCXNpemVvZiBldGhlcl9kZXNjLAorc3RhdGljIHN0cnVjdCB1c2JfY2RjX2V0aGVyX2Rlc2MgZWNtX2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2YgZWNtX2Rlc2MsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19JTlRFUkZBQ0UsCiAJLmJEZXNjcmlwdG9yU3ViVHlwZSA9CVVTQl9DRENfRVRIRVJORVRfVFlQRSwKIApAQCAtMTg2LDE3ICsxODYsMTcgQEAKIAogLyogZnVsbCBzcGVlZCBzdXBwb3J0OiAqLwogCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX25vdGlmeV9kZXNjIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX2VjbV9ub3RpZnlfZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKIAkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCiAJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0JLndNYXhQYWNrZXRTaXplID0JX19jb25zdGFudF9jcHVfdG9fbGUxNihTVEFUVVNfQllURUNPVU5UKSwKKwkud01heFBhY2tldFNpemUgPQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEVDTV9TVEFUVVNfQllURUNPVU5UKSwKIAkuYkludGVydmFsID0JCTEgPDwgTE9HMl9TVEFUVVNfSU5URVJWQUxfTVNFQywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfaW5fZGVzYyBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19lY21faW5fZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKQEAgLTIwNCw3ICsyMDQsNyBAQAogCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfb3V0X2Rlc2MgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfZWNtX291dF9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtMjEyLDM0ICsyMTIsMzQgQEAKIAkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZXRoX2ZzX2Z1bmN0aW9uW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICplY21fZnNfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0gewogCS8qIENEQyBFQ00gY29udHJvbCBkZXNjcmlwdG9ycyAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fY29udHJvbF9pbnRmLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoZWFkZXJfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fdW5pb25fZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZXRoZXJfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2Rlc2MsCiAJLyogTk9URTogc3RhdHVzIGVuZHBvaW50IG1pZ2h0IG5lZWQgdG8gYmUgcmVtb3ZlZCAqLwotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19ub3RpZnlfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfZWNtX25vdGlmeV9kZXNjLAogCS8qIGRhdGEgaW50ZXJmYWNlLCBhbHRzZXR0aW5ncyAwIGFuZCAxICovCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV9kYXRhX25vcF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGF0YV9pbnRmLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19pbl9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfZWNtX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2VjbV9vdXRfZGVzYywKIAlOVUxMLAogfTsKIAogLyogaGlnaCBzcGVlZCBzdXBwb3J0OiAqLwogCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX25vdGlmeV9kZXNjIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2VjbV9ub3RpZnlfZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKIAkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCiAJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0JLndNYXhQYWNrZXRTaXplID0JX19jb25zdGFudF9jcHVfdG9fbGUxNihTVEFUVVNfQllURUNPVU5UKSwKKwkud01heFBhY2tldFNpemUgPQlfX2NvbnN0YW50X2NwdV90b19sZTE2KEVDTV9TVEFUVVNfQllURUNPVU5UKSwKIAkuYkludGVydmFsID0JCUxPRzJfU1RBVFVTX0lOVEVSVkFMX01TRUMgKyA0LAogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfaW5fZGVzYyBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19lY21faW5fZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCS53TWF4UGFja2V0U2l6ZSA9CV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNTEyKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfb3V0X2Rlc2MgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfZWNtX291dF9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtMjU3LDE5ICsyNTcsMTkgQEAKIAkud01heFBhY2tldFNpemUgPQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDUxMiksCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZXRoX2hzX2Z1bmN0aW9uW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICplY21faHNfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0gewogCS8qIENEQyBFQ00gY29udHJvbCBkZXNjcmlwdG9ycyAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fY29udHJvbF9pbnRmLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoZWFkZXJfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fdW5pb25fZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZXRoZXJfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2Rlc2MsCiAJLyogTk9URTogc3RhdHVzIGVuZHBvaW50IG1pZ2h0IG5lZWQgdG8gYmUgcmVtb3ZlZCAqLwotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19ub3RpZnlfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfZWNtX25vdGlmeV9kZXNjLAogCS8qIGRhdGEgaW50ZXJmYWNlLCBhbHRzZXR0aW5ncyAwIGFuZCAxICovCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmVjbV9kYXRhX25vcF9pbnRmLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGF0YV9pbnRmLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19pbl9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfZWNtX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2VjbV9vdXRfZGVzYywKIAlOVUxMLAogfTsKIApAQCAtMzI5LDE0ICszMjksMTQgQEAKIAkJZXZlbnQtPmJOb3RpZmljYXRpb25UeXBlID0gVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFOwogCQlldmVudC0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMCk7CiAJCWV2ZW50LT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoOCk7Ci0JCXJlcS0+bGVuZ3RoID0gU1RBVFVTX0JZVEVDT1VOVDsKKwkJcmVxLT5sZW5ndGggPSBFQ01fU1RBVFVTX0JZVEVDT1VOVDsKIAogCQkvKiBTUEVFRF9DSEFOR0UgZGF0YSBpcyB1cC9kb3duIHNwZWVkcyBpbiBiaXRzL3NlYyAqLwogCQlkYXRhID0gcmVxLT5idWYgKyBzaXplb2YgKmV2ZW50OwotCQlkYXRhWzBdID0gY3B1X3RvX2xlMzIoYml0cmF0ZShjZGV2LT5nYWRnZXQpKTsKKwkJZGF0YVswXSA9IGNwdV90b19sZTMyKGVjbV9iaXRyYXRlKGNkZXYtPmdhZGdldCkpOwogCQlkYXRhWzFdID0gZGF0YVswXTsKIAotCQlEQkcoY2RldiwgIm5vdGlmeSBzcGVlZCAlZFxuIiwgYml0cmF0ZShjZGV2LT5nYWRnZXQpKTsKKwkJREJHKGNkZXYsICJub3RpZnkgc3BlZWQgJWRcbiIsIGVjbV9iaXRyYXRlKGNkZXYtPmdhZGdldCkpOwogCQllY20tPm5vdGlmeV9zdGF0ZSA9IEVDTV9OT1RJRllfTk9ORTsKIAkJYnJlYWs7CiAJfQpAQCAtNjI4LDEzICs2MjgsMTMgQEAKIAlzdGF0dXMgPSAtRU5PREVWOwogCiAJLyogYWxsb2NhdGUgaW5zdGFuY2Utc3BlY2lmaWMgZW5kcG9pbnRzICovCi0JZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhjZGV2LT5nYWRnZXQsICZmc19pbl9kZXNjKTsKKwllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX2VjbV9pbl9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGZhaWw7CiAJZWNtLT5wb3J0LmluX2VwID0gZXA7CiAJZXAtPmRyaXZlcl9kYXRhID0gY2RldjsJLyogY2xhaW0gKi8KIAotCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfb3V0X2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZWNtX291dF9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGZhaWw7CiAJZWNtLT5wb3J0Lm91dF9lcCA9IGVwOwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJICogZG9uJ3QgdHJlYXQgaXQgdGhhdCB3YXkuICBJdCdzIHNpbXBsZXIsIGFuZCBzb21lIG5ld2VyIENEQwogCSAqIHByb2ZpbGVzICh3aXJlbGVzcyBoYW5kc2V0cykgbm8gbG9uZ2VyIHRyZWF0IGl0IGFzIG9wdGlvbmFsLgogCSAqLwotCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfbm90aWZ5X2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZWNtX25vdGlmeV9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGZhaWw7CiAJZWNtLT5ub3RpZnkgPSBlcDsKQEAgLTY1Niw0NyArNjU2LDQ3IEBACiAJZWNtLT5ub3RpZnlfcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWNtLT5ub3RpZnlfcmVxKQogCQlnb3RvIGZhaWw7Ci0JZWNtLT5ub3RpZnlfcmVxLT5idWYgPSBrbWFsbG9jKFNUQVRVU19CWVRFQ09VTlQsIEdGUF9LRVJORUwpOworCWVjbS0+bm90aWZ5X3JlcS0+YnVmID0ga21hbGxvYyhFQ01fU1RBVFVTX0JZVEVDT1VOVCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlY20tPm5vdGlmeV9yZXEtPmJ1ZikKIAkJZ290byBmYWlsOwogCWVjbS0+bm90aWZ5X3JlcS0+Y29udGV4dCA9IGVjbTsKIAllY20tPm5vdGlmeV9yZXEtPmNvbXBsZXRlID0gZWNtX25vdGlmeV9jb21wbGV0ZTsKIAogCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KLQlmLT5kZXNjcmlwdG9ycyA9IHVzYl9jb3B5X2Rlc2NyaXB0b3JzKGV0aF9mc19mdW5jdGlvbik7CisJZi0+ZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhlY21fZnNfZnVuY3Rpb24pOwogCWlmICghZi0+ZGVzY3JpcHRvcnMpCiAJCWdvdG8gZmFpbDsKIAotCWVjbS0+ZnMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChldGhfZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmZzX2luX2Rlc2MpOwotCWVjbS0+ZnMub3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZXRoX2ZzX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19vdXRfZGVzYyk7Ci0JZWNtLT5mcy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChldGhfZnNfZnVuY3Rpb24sCi0JCQlmLT5kZXNjcmlwdG9ycywgJmZzX25vdGlmeV9kZXNjKTsKKwllY20tPmZzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoZWNtX2ZzX2Z1bmN0aW9uLAorCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19lY21faW5fZGVzYyk7CisJZWNtLT5mcy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChlY21fZnNfZnVuY3Rpb24sCisJCQlmLT5kZXNjcmlwdG9ycywgJmZzX2VjbV9vdXRfZGVzYyk7CisJZWNtLT5mcy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChlY21fZnNfZnVuY3Rpb24sCisJCQlmLT5kZXNjcmlwdG9ycywgJmZzX2VjbV9ub3RpZnlfZGVzYyk7CiAKIAkvKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgogCSAqIGhhcmR3YXJlIGlzIGR1YWwgc3BlZWQsIGFsbCBidWxrLWNhcGFibGUgZW5kcG9pbnRzIHdvcmsgYXQKIAkgKiBib3RoIHNwZWVkcwogCSAqLwogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKLQkJaHNfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCWhzX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQotCQkJCWZzX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCWhzX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQotCQkJCWZzX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWhzX2VjbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX2VjbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWhzX2VjbV9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCQlmc19lY21fb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJaHNfZWNtX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX2VjbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCiAJCS8qIGNvcHkgZGVzY3JpcHRvcnMsIGFuZCB0cmFjayBlbmRwb2ludCBjb3BpZXMgKi8KLQkJZi0+aHNfZGVzY3JpcHRvcnMgPSB1c2JfY29weV9kZXNjcmlwdG9ycyhldGhfaHNfZnVuY3Rpb24pOworCQlmLT5oc19kZXNjcmlwdG9ycyA9IHVzYl9jb3B5X2Rlc2NyaXB0b3JzKGVjbV9oc19mdW5jdGlvbik7CiAJCWlmICghZi0+aHNfZGVzY3JpcHRvcnMpCiAJCQlnb3RvIGZhaWw7CiAKLQkJZWNtLT5ocy5pbiA9IHVzYl9maW5kX2VuZHBvaW50KGV0aF9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX2luX2Rlc2MpOwotCQllY20tPmhzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGV0aF9oc19mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX291dF9kZXNjKTsKLQkJZWNtLT5ocy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChldGhfaHNfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19ub3RpZnlfZGVzYyk7CisJCWVjbS0+aHMuaW4gPSB1c2JfZmluZF9lbmRwb2ludChlY21faHNfZnVuY3Rpb24sCisJCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19lY21faW5fZGVzYyk7CisJCWVjbS0+aHMub3V0ID0gdXNiX2ZpbmRfZW5kcG9pbnQoZWNtX2hzX2Z1bmN0aW9uLAorCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmaHNfZWNtX291dF9kZXNjKTsKKwkJZWNtLT5ocy5ub3RpZnkgPSB1c2JfZmluZF9lbmRwb2ludChlY21faHNfZnVuY3Rpb24sCisJCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19lY21fbm90aWZ5X2Rlc2MpOwogCX0KIAogCS8qIE5PVEU6ICBhbGwgdGhhdCBpcyBkb25lIHdpdGhvdXQga25vd2luZyBvciBjYXJpbmcgYWJvdXQKQEAgLTc5NSw3ICs3OTUsNyBAQAogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCXJldHVybiBzdGF0dXM7CiAJCWVjbV9zdHJpbmdfZGVmc1sxXS5pZCA9IHN0YXR1czsKLQkJZXRoZXJfZGVzYy5pTUFDQWRkcmVzcyA9IHN0YXR1czsKKwkJZWNtX2Rlc2MuaU1BQ0FkZHJlc3MgPSBzdGF0dXM7CiAJfQogCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIG5ldyBpbnN0YW5jZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2xvb3BiYWNrLmMKaW5kZXggZWRhNGNkZTcuLjg3ZGRlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2xvb3BiYWNrLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbG9vcGJhY2suYwpAQCAtNzAsNyArNzAsNyBAQAogCiAvKiBmdWxsIHNwZWVkIHN1cHBvcnQ6ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfc291cmNlX2Rlc2MgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX2xvb3Bfc291cmNlX2Rlc2MgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtNzgsNyArNzgsNyBAQAogCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfc2lua19kZXNjID0geworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19sb29wX3NpbmtfZGVzYyA9IHsKIAkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAogCkBAIC04OCwxNCArODgsMTQgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmZzX2xvb3BiYWNrX2Rlc2NzW10gPSB7CiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmxvb3BiYWNrX2ludGYsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX3NpbmtfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfc291cmNlX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2xvb3Bfc2lua19kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19sb29wX3NvdXJjZV9kZXNjLAogCU5VTEwsCiB9OwogCiAvKiBoaWdoIHNwZWVkIHN1cHBvcnQ6ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfc291cmNlX2Rlc2MgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2xvb3Bfc291cmNlX2Rlc2MgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtMTAzLDcgKzEwMyw3IEBACiAJLndNYXhQYWNrZXRTaXplID0JX19jb25zdGFudF9jcHVfdG9fbGUxNig1MTIpLAogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19zaW5rX2Rlc2MgPSB7CitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2xvb3Bfc2lua19kZXNjID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKQEAgLTExMyw4ICsxMTMsOCBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqaHNfbG9vcGJhY2tfZGVzY3NbXSA9IHsKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbG9vcGJhY2tfaW50ZiwKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfc291cmNlX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX3NpbmtfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfbG9vcF9zb3VyY2VfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfbG9vcF9zaW5rX2Rlc2MsCiAJTlVMTCwKIH07CiAKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJLyogYWxsb2NhdGUgZW5kcG9pbnRzICovCiAKLQlsb29wLT5pbl9lcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX3NvdXJjZV9kZXNjKTsKKwlsb29wLT5pbl9lcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX2xvb3Bfc291cmNlX2Rlc2MpOwogCWlmICghbG9vcC0+aW5fZXApIHsKIGF1dG9jb25mX2ZhaWw6CiAJCUVSUk9SKGNkZXYsICIlczogY2FuJ3QgYXV0b2NvbmZpZ3VyZSBvbiAlc1xuIiwKQEAgLTE2MSwxNyArMTYxLDE3IEBACiAJfQogCWxvb3AtPmluX2VwLT5kcml2ZXJfZGF0YSA9IGNkZXY7CS8qIGNsYWltICovCiAKLQlsb29wLT5vdXRfZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhjZGV2LT5nYWRnZXQsICZmc19zaW5rX2Rlc2MpOworCWxvb3AtPm91dF9lcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX2xvb3Bfc2lua19kZXNjKTsKIAlpZiAoIWxvb3AtPm91dF9lcCkKIAkJZ290byBhdXRvY29uZl9mYWlsOwogCWxvb3AtPm91dF9lcC0+ZHJpdmVyX2RhdGEgPSBjZGV2OwkvKiBjbGFpbSAqLwogCiAJLyogc3VwcG9ydCBoaWdoIHNwZWVkIGhhcmR3YXJlICovCiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSkgewotCQloc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCQloc19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9Ci0JCQkJZnNfc2lua19kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWhzX2xvb3Bfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQkJZnNfbG9vcF9zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQloc19sb29wX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCQlmc19sb29wX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCQlmLT5oc19kZXNjcmlwdG9ycyA9IGhzX2xvb3BiYWNrX2Rlc2NzOwogCX0KIApAQCAtMjU1LDggKzI1NSwxMCBAQAogCXN0cnVjdCB1c2JfcmVxdWVzdAkJCSpyZXE7CiAJdW5zaWduZWQJCQkJaTsKIAotCXNyYyA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsICZoc19zb3VyY2VfZGVzYywgJmZzX3NvdXJjZV9kZXNjKTsKLQlzaW5rID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwgJmhzX3NpbmtfZGVzYywgJmZzX3NpbmtfZGVzYyk7CisJc3JjID0gZXBfY2hvb3NlKGNkZXYtPmdhZGdldCwKKwkJCSZoc19sb29wX3NvdXJjZV9kZXNjLCAmZnNfbG9vcF9zb3VyY2VfZGVzYyk7CisJc2luayA9IGVwX2Nob29zZShjZGV2LT5nYWRnZXQsCisJCQkmaHNfbG9vcF9zaW5rX2Rlc2MsICZmc19sb29wX3NpbmtfZGVzYyk7CiAKIAkvKiBvbmUgZW5kcG9pbnQgd3JpdGVzIGRhdGEgYmFjayBJTiB0byB0aGUgaG9zdCAqLwogCWVwID0gbG9vcC0+aW5fZXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zdWJzZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jCmluZGV4IGFjYjhkMjMuLmZlMTgzMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3N1YnNldC5jCkBAIC0xMDMsOCArMTAzLDggQEAKIAkvKiAuaUludGVyZmFjZSA9IERZTkFNSUMgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2NkY19oZWFkZXJfZGVzYyBoZWFkZXJfZGVzYyBfX2luaXRkYXRhID0gewotCS5iTGVuZ3RoID0JCXNpemVvZiBoZWFkZXJfZGVzYywKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NkY19oZWFkZXJfZGVzYyBtZGxtX2hlYWRlcl9kZXNjIF9faW5pdGRhdGEgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIG1kbG1faGVhZGVyX2Rlc2MsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19JTlRFUkZBQ0UsCiAJLmJEZXNjcmlwdG9yU3ViVHlwZSA9CVVTQl9DRENfSEVBREVSX1RZUEUsCiAKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAvKiBmdWxsIHNwZWVkIHN1cHBvcnQ6ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfaW5fZGVzYyBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19zdWJzZXRfaW5fZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfb3V0X2Rlc2MgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfc3Vic2V0X291dF9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtMTcwLDE4ICsxNzAsMTggQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmZzX2V0aF9mdW5jdGlvbltdIF9faW5pdGRhdGEgPSB7CiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnN1YnNldF9kYXRhX2ludGYsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhlYWRlcl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm1kbG1fZGV0YWlsX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmV0aGVyX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2luX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX291dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19zdWJzZXRfaW5fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfc3Vic2V0X291dF9kZXNjLAogCU5VTEwsCiB9OwogCiAvKiBoaWdoIHNwZWVkIHN1cHBvcnQ6ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfaW5fZGVzYyBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19zdWJzZXRfaW5fZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAogCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCiAKQEAgLTE4OSw3ICsxODksNyBAQAogCS53TWF4UGFja2V0U2l6ZSA9CV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNTEyKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfb3V0X2Rlc2MgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfc3Vic2V0X291dF9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKIApAQCAtMTk5LDEyICsxOTksMTIgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmhzX2V0aF9mdW5jdGlvbltdIF9faW5pdGRhdGEgPSB7CiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnN1YnNldF9kYXRhX2ludGYsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhlYWRlcl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZtZGxtX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm1kbG1fZGV0YWlsX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmV0aGVyX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2luX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX291dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19zdWJzZXRfaW5fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfc3Vic2V0X291dF9kZXNjLAogCU5VTEwsCiB9OwogCkBAIC0yODEsMTMgKzI4MSwxMyBAQAogCXN0YXR1cyA9IC1FTk9ERVY7CiAKIAkvKiBhbGxvY2F0ZSBpbnN0YW5jZS1zcGVjaWZpYyBlbmRwb2ludHMgKi8KLQllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX2luX2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfc3Vic2V0X2luX2Rlc2MpOwogCWlmICghZXApCiAJCWdvdG8gZmFpbDsKIAlnZXRoLT5wb3J0LmluX2VwID0gZXA7CiAJZXAtPmRyaXZlcl9kYXRhID0gY2RldjsJLyogY2xhaW0gKi8KIAotCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfb3V0X2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfc3Vic2V0X291dF9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGZhaWw7CiAJZ2V0aC0+cG9ydC5vdXRfZXAgPSBlcDsKQEAgLTI5Nyw5ICsyOTcsOSBAQAogCWYtPmRlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoZnNfZXRoX2Z1bmN0aW9uKTsKIAogCWdldGgtPmZzLmluID0gdXNiX2ZpbmRfZW5kcG9pbnQoZnNfZXRoX2Z1bmN0aW9uLAotCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19pbl9kZXNjKTsKKwkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfc3Vic2V0X2luX2Rlc2MpOwogCWdldGgtPmZzLm91dCA9IHVzYl9maW5kX2VuZHBvaW50KGZzX2V0aF9mdW5jdGlvbiwKLQkJCWYtPmRlc2NyaXB0b3JzLCAmZnNfb3V0X2Rlc2MpOworCQkJZi0+ZGVzY3JpcHRvcnMsICZmc19zdWJzZXRfb3V0X2Rlc2MpOwogCiAKIAkvKiBzdXBwb3J0IGFsbCByZWxldmFudCBoYXJkd2FyZSBzcGVlZHMuLi4gd2UgZXhwZWN0IHRoYXQgd2hlbgpAQCAtMzA3LDE4ICszMDcsMTggQEAKIAkgKiBib3RoIHNwZWVkcwogCSAqLwogCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGMtPmNkZXYtPmdhZGdldCkpIHsKLQkJaHNfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCWhzX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQotCQkJCWZzX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWhzX3N1YnNldF9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJCWZzX3N1YnNldF9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWhzX3N1YnNldF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCQlmc19zdWJzZXRfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAogCQkvKiBjb3B5IGRlc2NyaXB0b3JzLCBhbmQgdHJhY2sgZW5kcG9pbnQgY29waWVzICovCiAJCWYtPmhzX2Rlc2NyaXB0b3JzID0gdXNiX2NvcHlfZGVzY3JpcHRvcnMoaHNfZXRoX2Z1bmN0aW9uKTsKIAogCQlnZXRoLT5ocy5pbiA9IHVzYl9maW5kX2VuZHBvaW50KGhzX2V0aF9mdW5jdGlvbiwKLQkJCQlmLT5oc19kZXNjcmlwdG9ycywgJmhzX2luX2Rlc2MpOworCQkJCWYtPmhzX2Rlc2NyaXB0b3JzLCAmaHNfc3Vic2V0X2luX2Rlc2MpOwogCQlnZXRoLT5ocy5vdXQgPSB1c2JfZmluZF9lbmRwb2ludChoc19ldGhfZnVuY3Rpb24sCi0JCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19vdXRfZGVzYyk7CisJCQkJZi0+aHNfZGVzY3JpcHRvcnMsICZoc19zdWJzZXRfb3V0X2Rlc2MpOwogCX0KIAogCS8qIE5PVEU6ICBhbGwgdGhhdCBpcyBkb25lIHdpdGhvdXQga25vd2luZyBvciBjYXJpbmcgYWJvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCBlYTJjMzFkLi4wYzYzMmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC0yNDUsNiArMjQ1LDE4IEBACiAjaW5jbHVkZSAiZ2FkZ2V0X2NoaXBzLmgiCiAKIAorCisvKgorICogS2J1aWxkIGlzIG5vdCB2ZXJ5IGNvb3BlcmF0aXZlIHdpdGggcmVzcGVjdCB0byBsaW5raW5nIHNlcGFyYXRlbHkKKyAqIGNvbXBpbGVkIGxpYnJhcnkgb2JqZWN0cyBpbnRvIG9uZSBtb2R1bGUuICBTbyBmb3Igbm93IHdlIHdvbid0IHVzZQorICogc2VwYXJhdGUgY29tcGlsYXRpb24gLi4uIGVuc3VyaW5nIGluaXQvZXhpdCBzZWN0aW9ucyB3b3JrIHRvIHNocmluaworICogdGhlIHJ1bnRpbWUgZm9vdHByaW50LCBhbmQgZ2l2aW5nIHVzIGF0IGxlYXN0IHNvbWUgcGFydHMgb2Ygd2hhdAorICogYSAiZ2NjIC0tY29tYmluZSAuLi4gcGFydDEuYyBwYXJ0Mi5jIHBhcnQzLmMgLi4uICIgYnVpbGQgd291bGQuCisgKi8KKyNpbmNsdWRlICJ1c2JzdHJpbmcuYyIKKyNpbmNsdWRlICJjb25maWcuYyIKKyNpbmNsdWRlICJlcGF1dG9jb25mLmMiCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MJCSJGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuYwppbmRleCAxY2ZjY2YxLi40NWFkNTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAlmc2xfd3JpdGVsKHRtcCwgJmRyX3JlZ3MtPmVuZHBvaW50bGlzdGFkZHIpOwogCiAJVkRCRygidmlyW3FoX2Jhc2VdIGlzICVwIHBoeVtxaF9iYXNlXSBpcyAweCU4eCByZWcgaXMgMHglOHgiLAotCQkoaW50KXVkYy0+ZXBfcWgsIChpbnQpdG1wLAorCQl1ZGMtPmVwX3FoLCAoaW50KXRtcCwKIAkJZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwb2ludGxpc3RhZGRyKSk7CiAKIAkvKiBDb25maWcgUEhZIGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwppbmRleCBlYTg2NTFlLi42ZWVlNzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwpAQCAtMzUsNiArMzUsMjEgQEAKIAogI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgogCisKKy8qCisgKiBLYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworI2luY2x1ZGUgInVzYnN0cmluZy5jIgorI2luY2x1ZGUgImNvbmZpZy5jIgorI2luY2x1ZGUgImVwYXV0b2NvbmYuYyIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCiBNT0RVTEVfQVVUSE9SKCJCZW4gV2lsbGlhbXNvbiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCmluZGV4IDU3NGM1MzguLmJiNTRjY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCkBAIC03ODcsNyArNzg3LDcgQEAKIAkJCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhlcC0+bGNoLAogCQkJCU9NQVBfRE1BX1BPUlRfVElQQiwKIAkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKLQkJCQkodW5zaWduZWQgbG9uZykgaW9fdjJwKFVEQ19EQVRBX0RNQSksCisJCQkJVURDX0RBVEFfRE1BLAogCQkJCTAsIDApOwogCQl9CiAJfSBlbHNlIHsKQEAgLTgwNCw3ICs4MDQsNyBAQAogCQkJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMoZXAtPmxjaCwKIAkJCQlPTUFQX0RNQV9QT1JUX1RJUEIsCiAJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGlvX3YycChVRENfREFUQV9ETUEpLAorCQkJCVVEQ19EQVRBX0RNQSwKIAkJCQkwLCAwKTsKIAkJCS8qIEVNSUZGIG9yIFNEUkMgKi8KIAkJCW9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUoZXAtPmxjaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHJpbnRlci5jCmluZGV4IGUwMDkwMDguLjJiM2I5ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9wcmludGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3ByaW50ZXIuYwpAQCAtNTMsNiArNTMsMjAgQEAKIAogI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgogCisKKy8qCisgKiBLYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworI2luY2x1ZGUgInVzYnN0cmluZy5jIgorI2luY2x1ZGUgImNvbmZpZy5jIgorI2luY2x1ZGUgImVwYXV0b2NvbmYuYyIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogI2RlZmluZSBEUklWRVJfREVTQwkJIlByaW50ZXIgR2FkZ2V0IgogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjIwMDcgT0NUIDA2IgogCkBAIC0xMzYwLDggKzEzNzQsOCBAQAogCiAKIAkvKiBTZXR1cCB0aGUgc3lzZnMgZmlsZXMgZm9yIHRoZSBwcmludGVyIGdhZGdldC4gKi8KLQlkZXYtPnBkZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEodXNiX2dhZGdldF9jbGFzcywgTlVMTCwKLQkJCQkJICBnX3ByaW50ZXJfZGV2bm8sIE5VTEwsICJnX3ByaW50ZXIiKTsKKwlkZXYtPnBkZXYgPSBkZXZpY2VfY3JlYXRlKHVzYl9nYWRnZXRfY2xhc3MsIE5VTEwsIGdfcHJpbnRlcl9kZXZubywKKwkJCQkgIE5VTEwsICJnX3ByaW50ZXIiKTsKIAlpZiAoSVNfRVJSKGRldi0+cGRldikpIHsKIAkJRVJST1IoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2U6IGdfcHJpbnRlclxuIik7CiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKaW5kZXggNzIyOGU4NS4uOGMyNmY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMKQEAgLTU3LDExICs1Nyw2IEBACiAjZGVmaW5lIHJuZGlzX2RlYnVnCQkwCiAjZW5kaWYKIAotI2RlZmluZSBEQkcoc3RyLGFyZ3MuLi4pIGRvIHsgXAotCWlmIChybmRpc19kZWJ1ZykgXAotCQlwcl9kZWJ1ZyhzdHIgLCAjIyBhcmdzKTsgXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgUk5ESVNfTUFYX0NPTkZJR1MJMQogCiAKQEAgLTE4Myw5ICsxNzgsOSBAQAogCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoYnVmX2xlbiAmJiBybmRpc19kZWJ1ZyA+IDEpIHsKLQkJREJHKCJxdWVyeSBPSUQgJTA4eCB2YWx1ZSwgbGVuICVkOlxuIiwgT0lELCBidWZfbGVuKTsKKwkJcHJfZGVidWcoInF1ZXJ5IE9JRCAlMDh4IHZhbHVlLCBsZW4gJWQ6XG4iLCBPSUQsIGJ1Zl9sZW4pOwogCQlmb3IgKGkgPSAwOyBpIDwgYnVmX2xlbjsgaSArPSAxNikgewotCQkJREJHKCIlMDNkOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBpLAorCQkJcHJfZGVidWcoIiUwM2Q6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGksCiAJCQkJZ2V0X3VuYWxpZ25lZF9sZTMyKCZidWZbaV0pLAogCQkJCWdldF91bmFsaWduZWRfbGUzMigmYnVmW2kgKyA0XSksCiAJCQkJZ2V0X3VuYWxpZ25lZF9sZTMyKCZidWZbaSArIDhdKSwKQEAgLTIwOSw3ICsyMDQsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1NVUFBPUlRFRF9MSVNUOgotCQlEQkcoIiVzOiBPSURfR0VOX1NVUFBPUlRFRF9MSVNUXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9TVVBQT1JURURfTElTVFxuIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSBzaXplb2YgKG9pZF9zdXBwb3J0ZWRfbGlzdCk7CiAJCWNvdW50ICA9IGxlbmd0aCAvIHNpemVvZiAodTMyKTsKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCkBAIC0yMTksNyArMjE0LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9IQVJEV0FSRV9TVEFUVVM6Ci0JCURCRygiJXM6IE9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9IQVJEV0FSRV9TVEFUVVNcbiIsIF9fZnVuY19fKTsKIAkJLyogQm9ndXMgcXVlc3Rpb24hCiAJCSAqIEhhcmR3YXJlIG11c3QgYmUgcmVhZHkgdG8gcmVjZWl2ZSBoaWdoIGxldmVsIHByb3RvY29scy4KIAkJICogQlRXOgpAQCAtMjMyLDE0ICsyMjcsMTQgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9NRURJQV9TVVBQT1JURUQ6Ci0JCURCRygiJXM6IE9JRF9HRU5fTUVESUFfU1VQUE9SVEVEXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9NRURJQV9TVVBQT1JURURcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX0lOX1VTRToKLQkJREJHKCIlczogT0lEX0dFTl9NRURJQV9JTl9VU0VcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfR0VOX01FRElBX0lOX1VTRVxuIiwgX19mdW5jX18pOwogCQkvKiBvbmUgbWVkaXVtLCBvbmUgdHJhbnNwb3J0Li4uIChtYXliZSB5b3UgZG8gaXQgYmV0dGVyKSAqLwogCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtKTsKIAkJcmV0dmFsID0gMDsKQEAgLTI0Nyw3ICsyNDIsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRToKLQkJREJHKCIlczogT0lEX0dFTl9NQVhJTVVNX0ZSQU1FX1NJWkVcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRVxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CkBAIC0yNTgsNyArMjUzLDcgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTElOS19TUEVFRDoKIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKLQkJCURCRygiJXM6IE9JRF9HRU5fTElOS19TUEVFRFxuIiwgX19mdW5jX18pOworCQkJcHJfZGVidWcoIiVzOiBPSURfR0VOX0xJTktfU1BFRURcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaWFfc3RhdGUKIAkJCQk9PSBORElTX01FRElBX1NUQVRFX0RJU0NPTk5FQ1RFRCkKIAkJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKQEAgLTI3MCw3ICsyNjUsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1RSQU5TTUlUX0JMT0NLX1NJWkU6Ci0JCURCRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRVxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRVxuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CkBAIC0yODAsNyArMjc1LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SRUNFSVZFX0JMT0NLX1NJWkU6Ci0JCURCRygiJXM6IE9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9SRUNFSVZFX0JMT0NLX1NJWkVcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2LT5tdHUpOwpAQCAtMjkwLDcgKzI4NSw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fVkVORE9SX0lEOgotCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9JRFxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fVkVORE9SX0lEXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnZlbmRvcklEKTsKIAkJcmV0dmFsID0gMDsKQEAgLTI5OCw3ICsyOTMsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1ZFTkRPUl9ERVNDUklQVElPTjoKLQkJREJHKCIlczogT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT05cbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfR0VOX1ZFTkRPUl9ERVNDUklQVElPTlxuIiwgX19mdW5jX18pOwogCQlsZW5ndGggPSBzdHJsZW4gKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IpOwogCQltZW1jcHkgKG91dGJ1ZiwKIAkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0udmVuZG9yRGVzY3IsIGxlbmd0aCk7CkBAIC0zMDYsNyArMzAxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OOgotCQlEQkcoIiVzOiBPSURfR0VOX1ZFTkRPUl9EUklWRVJfVkVSU0lPTlxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIENyZWF0ZWQgYXMgTEUgKi8KIAkJKm91dGJ1ZiA9IHJuZGlzX2RyaXZlcl92ZXJzaW9uOwogCQlyZXR2YWwgPSAwOwpAQCAtMzE0LDE0ICszMDksMTQgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVI6Ci0JCURCRygiJXM6IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVJcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgqcm5kaXNfcGVyX2Rldl9wYXJhbXNbY29uZmlnTnJdLmZpbHRlcik7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRToKLQkJREJHKCIlczogT0lEX0dFTl9NQVhJTVVNX1RPVEFMX1NJWkVcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfR0VOX01BWElNVU1fVE9UQUxfU0laRVxuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihSTkRJU19NQVhfVE9UQUxfU0laRSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwpAQCAtMzI5LDE0ICszMjQsMTQgQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVNcbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCQkubWVkaWFfc3RhdGUpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9QSFlTSUNBTF9NRURJVU06Ci0JCURCRygiJXM6IE9JRF9HRU5fUEhZU0lDQUxfTUVESVVNXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9QSFlTSUNBTF9NRURJVU1cbiIsIF9fZnVuY19fKTsKIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKQEAgLTM0Niw3ICszNDEsNyBAQAogCSAqIHZlcnNpb25zIGVtaXQgdW5kZWZpbmVkIFJORElTIG1lc3NhZ2VzLiBET0NVTUVOVCBBTEwgVEhFU0UhCiAJICovCiAJY2FzZSBPSURfR0VOX01BQ19PUFRJT05TOgkJLyogZnJvbSBXaW5NRSAqLwotCQlEQkcoIiVzOiBPSURfR0VOX01BQ19PUFRJT05TXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEX0dFTl9NQUNfT1BUSU9OU1xuIiwgX19mdW5jX18pOwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKIAkJCSAgTkRJU19NQUNfT1BUSU9OX1JFQ0VJVkVfU0VSSUFMSVpFRAogCQkJfCBORElTX01BQ19PUFRJT05fRlVMTF9EVVBMRVgpOwpAQCAtMzU4LDcgKzM1Myw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1hNSVRfT0s6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfT0tcbiIsIF9fZnVuY19fKTsKKwkJCXByX2RlYnVnKCIlczogT0lEX0dFTl9YTUlUX09LXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChzdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyKHN0YXRzLT50eF9wYWNrZXRzCiAJCQkJLSBzdGF0cy0+dHhfZXJyb3JzIC0gc3RhdHMtPnR4X2Ryb3BwZWQpOwpAQCAtMzY5LDcgKzM2NCw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JDVl9PSzoKIAkJaWYgKHJuZGlzX2RlYnVnID4gMSkKLQkJCURCRygiJXM6IE9JRF9HRU5fUkNWX09LXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fUkNWX09LXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChzdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyKHN0YXRzLT5yeF9wYWNrZXRzCiAJCQkJLSBzdGF0cy0+cnhfZXJyb3JzIC0gc3RhdHMtPnJ4X2Ryb3BwZWQpOwpAQCAtMzgwLDcgKzM3NSw3IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1hNSVRfRVJST1JcbiIsIF9fZnVuY19fKTsKKwkJCXByX2RlYnVnKCIlczogT0lEX0dFTl9YTUlUX0VSUk9SXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChzdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyKHN0YXRzLT50eF9lcnJvcnMpOwogCQkJcmV0dmFsID0gMDsKQEAgLTM5MCw3ICszODUsNyBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SQ1ZfRVJST1I6CiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9FUlJPUlxuIiwgX19mdW5jX18pOworCQkJcHJfZGVidWcoIiVzOiBPSURfR0VOX1JDVl9FUlJPUlxuIiwgX19mdW5jX18pOwogCQlpZiAoc3RhdHMpIHsKIAkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMihzdGF0cy0+cnhfZXJyb3JzKTsKIAkJCXJldHZhbCA9IDA7CkBAIC0zOTksNyArMzk0LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgotCQlEQkcoIiVzOiBPSURfR0VOX1JDVl9OT19CVUZGRVJcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfR0VOX1JDVl9OT19CVUZGRVJcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHN0YXRzKSB7CiAJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIoc3RhdHMtPnJ4X2Ryb3BwZWQpOwogCQkJcmV0dmFsID0gMDsKQEAgLTQxMCw3ICs0MDUsNyBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1M6Ci0JCURCRygiJXM6IE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTU1xuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTU1xuIiwgX19mdW5jX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCWxlbmd0aCA9IEVUSF9BTEVOOwogCQkJbWVtY3B5IChvdXRidWYsCkBAIC00MjIsNyArNDE3LDcgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTU1xuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1NcbiIsIF9fZnVuY19fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7CiAJCQlsZW5ndGggPSBFVEhfQUxFTjsKIAkJCW1lbWNweSAob3V0YnVmLApAQCAtNDM0LDcgKzQyOSw3IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19NVUxUSUNBU1RfTElTVDoKLQkJREJHKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX2Z1bmNfXyk7CiAJCS8qIE11bHRpY2FzdCBiYXNlIGFkZHJlc3Mgb25seSAqLwogCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMHhFMDAwMDAwMCk7CiAJCXJldHZhbCA9IDA7CkBAIC00NDIsMjEgKzQzNywyMSBAQAogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkU6Ci0JCURCRygiJXM6IE9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRVxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRVxuIiwgX19mdW5jX18pOwogCQkvKiBNdWx0aWNhc3QgYmFzZSBhZGRyZXNzIG9ubHkgKi8KIAkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDEpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCWNhc2UgT0lEXzgwMl8zX01BQ19PUFRJT05TOgotCQlEQkcoIiVzOiBPSURfODAyXzNfTUFDX09QVElPTlNcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfODAyXzNfTUFDX09QVElPTlNcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAKIAkvKiBpZWVlODAyLjMgc3RhdGlzdGljcyBPSURzICh0YWJsZSA0LTQpICovCiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UOgotCQlEQkcoIiVzOiBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVFxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChzdGF0cykgewogCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyKHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMpOwogCQkJcmV0dmFsID0gMDsKQEAgLTQ2NSwxNCArNDYwLDE0IEBACiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT046Ci0JCURCRygiJXM6IE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT05cbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OUzoKLQkJREJHKCIlczogT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TXG4iLCBfX2Z1bmNfXyk7CiAJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC01MDQsOSArNDk5LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoYnVmX2xlbiAmJiBybmRpc19kZWJ1ZyA+IDEpIHsKLQkJREJHKCJzZXQgT0lEICUwOHggdmFsdWUsIGxlbiAlZDpcbiIsIE9JRCwgYnVmX2xlbik7CisJCXByX2RlYnVnKCJzZXQgT0lEICUwOHggdmFsdWUsIGxlbiAlZDpcbiIsIE9JRCwgYnVmX2xlbik7CiAJCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpICs9IDE2KSB7Ci0JCQlEQkcoIiUwM2Q6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGksCisJCQlwcl9kZWJ1ZygiJTAzZDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgaSwKIAkJCQlnZXRfdW5hbGlnbmVkX2xlMzIoJmJ1ZltpXSksCiAJCQkJZ2V0X3VuYWxpZ25lZF9sZTMyKCZidWZbaSArIDRdKSwKIAkJCQlnZXRfdW5hbGlnbmVkX2xlMzIoJmJ1ZltpICsgOF0pLApAQCAtNTI1LDcgKzUyMCw3IEBACiAJCSAqCU1VTFRJQ0FTVCwgQUxMX01VTFRJQ0FTVCwgQlJPQURDQVNUCiAJCSAqLwogCQkqcGFyYW1zLT5maWx0ZXIgPSAodTE2KWdldF91bmFsaWduZWRfbGUzMihidWYpOwotCQlEQkcoIiVzOiBPSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUiAlMDh4XG4iLAorCQlwcl9kZWJ1ZygiJXM6IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSICUwOHhcbiIsCiAJCQlfX2Z1bmNfXywgKnBhcmFtcy0+ZmlsdGVyKTsKIAogCQkvKiB0aGlzIGNhbGwgaGFzIGEgc2lnbmlmaWNhbnQgc2lkZSBlZmZlY3Q6ICBpdCdzCkBAIC01NDcsNyArNTQyLDcgQEAKIAogCWNhc2UgT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUOgogCQkvKiBJIHRoaW5rIHdlIGNhbiBpZ25vcmUgdGhpcyAqLwotCQlEQkcoIiVzOiBPSURfODAyXzNfTVVMVElDQVNUX0xJU1RcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBPSURfODAyXzNfTVVMVElDQVNUX0xJU1RcbiIsIF9fZnVuY19fKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKQEAgLTYwNiw3ICs2MDEsNyBAQAogCXJuZGlzX3Jlc3BfdCAgICAgICAgICAgICpyOwogCXN0cnVjdCBybmRpc19wYXJhbXMJKnBhcmFtcyA9IHJuZGlzX3Blcl9kZXZfcGFyYW1zICsgY29uZmlnTnI7CiAKLQkvLyBEQkcoIiVzOiBPSUQgPSAlMDhYXG4iLCBfX2Z1bmNfXywgY3B1X3RvX2xlMzIoYnVmLT5PSUQpKTsKKwkvKiBwcl9kZWJ1ZygiJXM6IE9JRCA9ICUwOFhcbiIsIF9fZnVuY19fLCBjcHVfdG9fbGUzMihidWYtPk9JRCkpOyAqLwogCWlmICghcGFyYW1zLT5kZXYpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKQEAgLTY1OSwxNSArNjU0LDE1IEBACiAJQnVmT2Zmc2V0ID0gbGUzMl90b19jcHUgKGJ1Zi0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpOwogCiAjaWZkZWYJVkVSQk9TRV9ERUJVRwotCURCRygiJXM6IExlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBCdWZMZW5ndGgpOwotCURCRygiJXM6IE9mZnNldDogJWRcbiIsIF9fZnVuY19fLCBCdWZPZmZzZXQpOwotCURCRygiJXM6IEluZm9CdWZmZXI6ICIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiJXM6IExlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBCdWZMZW5ndGgpOworCXByX2RlYnVnKCIlczogT2Zmc2V0OiAlZFxuIiwgX19mdW5jX18sIEJ1Zk9mZnNldCk7CisJcHJfZGVidWcoIiVzOiBJbmZvQnVmZmVyOiAiLCBfX2Z1bmNfXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQnVmTGVuZ3RoOyBpKyspIHsKLQkJREJHKCIlMDJ4ICIsICooKCh1OCAqKSBidWYpICsgaSArIDggKyBCdWZPZmZzZXQpKTsKKwkJcHJfZGVidWcoIiUwMnggIiwgKigoKHU4ICopIGJ1ZikgKyBpICsgOCArIEJ1Zk9mZnNldCkpOwogCX0KIAotCURCRygiXG4iKTsKKwlwcl9kZWJ1ZygiXG4iKTsKICNlbmRpZgogCiAJcmVzcC0+TWVzc2FnZVR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChSRU1PVEVfTkRJU19TRVRfQ01QTFQpOwpAQCAtODIxLDE0ICs4MTYsMTQgQEAKIAkvKiBGb3IgVVNCOiByZXNwb25zZXMgbWF5IHRha2UgdXAgdG8gMTAgc2Vjb25kcyAqLwogCXN3aXRjaCAoTXNnVHlwZSkgewogCWNhc2UgUkVNT1RFX05ESVNfSU5JVElBTElaRV9NU0c6Ci0JCURCRygiJXM6IFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHXG4iLAorCQlwcl9kZWJ1ZygiJXM6IFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHXG4iLAogCQkJX19mdW5jX18gKTsKIAkJcGFyYW1zLT5zdGF0ZSA9IFJORElTX0lOSVRJQUxJWkVEOwogCQlyZXR1cm4gIHJuZGlzX2luaXRfcmVzcG9uc2UgKGNvbmZpZ05yLAogCQkJCQkocm5kaXNfaW5pdF9tc2dfdHlwZSAqKSBidWYpOwogCiAJY2FzZSBSRU1PVEVfTkRJU19IQUxUX01TRzoKLQkJREJHKCIlczogUkVNT1RFX05ESVNfSEFMVF9NU0dcbiIsCisJCXByX2RlYnVnKCIlczogUkVNT1RFX05ESVNfSEFMVF9NU0dcbiIsCiAJCQlfX2Z1bmNfXyApOwogCQlwYXJhbXMtPnN0YXRlID0gUk5ESVNfVU5JTklUSUFMSVpFRDsKIAkJaWYgKHBhcmFtcy0+ZGV2KSB7CkBAIC04NDYsNyArODQxLDcgQEAKIAkJCQkJKHJuZGlzX3NldF9tc2dfdHlwZSAqKSBidWYpOwogCiAJY2FzZSBSRU1PVEVfTkRJU19SRVNFVF9NU0c6Ci0JCURCRygiJXM6IFJFTU9URV9ORElTX1JFU0VUX01TR1xuIiwKKwkJcHJfZGVidWcoIiVzOiBSRU1PVEVfTkRJU19SRVNFVF9NU0dcbiIsCiAJCQlfX2Z1bmNfXyApOwogCQlyZXR1cm4gcm5kaXNfcmVzZXRfcmVzcG9uc2UgKGNvbmZpZ05yLAogCQkJCQkocm5kaXNfcmVzZXRfbXNnX3R5cGUgKikgYnVmKTsKQEAgLTg1NCw3ICs4NDksNyBAQAogCWNhc2UgUkVNT1RFX05ESVNfS0VFUEFMSVZFX01TRzoKIAkJLyogRm9yIFVTQjogaG9zdCBkb2VzIHRoaXMgZXZlcnkgNSBzZWNvbmRzICovCiAJCWlmIChybmRpc19kZWJ1ZyA+IDEpCi0JCQlEQkcoIiVzOiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHXG4iLAorCQkJcHJfZGVidWcoIiVzOiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHXG4iLAogCQkJCV9fZnVuY19fICk7CiAJCXJldHVybiBybmRpc19rZWVwYWxpdmVfcmVzcG9uc2UgKGNvbmZpZ05yLAogCQkJCQkJIChybmRpc19rZWVwYWxpdmVfbXNnX3R5cGUgKikKQEAgLTg3MCw3ICs4NjUsNyBAQAogCQl7CiAJCQl1bnNpZ25lZCBpOwogCQkJZm9yIChpID0gMDsgaSA8IE1zZ0xlbmd0aDsgaSArPSAxNikgewotCQkJCURCRygiJTAzZDogIgorCQkJCXByX2RlYnVnKCIlMDNkOiAiCiAJCQkJCSIgJTAyeCAlMDJ4ICUwMnggJTAyeCIKIAkJCQkJIiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgogCQkJCQkiICUwMnggJTAyeCAlMDJ4ICUwMngiCkBAIC05MDUsMTggKzkwMCwxOCBAQAogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2ldLnVzZWQgPSAxOwogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2ldLnJlc3BfYXZhaWwgPSByZXNwX2F2YWlsOwogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2ldLnYgPSB2OwotCQkJREJHKCIlczogY29uZmlnTnIgPSAlZFxuIiwgX19mdW5jX18sIGkpOworCQkJcHJfZGVidWcoIiVzOiBjb25maWdOciA9ICVkXG4iLCBfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gaTsKIAkJfQogCX0KLQlEQkcoImZhaWxlZFxuIik7CisJcHJfZGVidWcoImZhaWxlZFxuIik7CiAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAogdm9pZCBybmRpc19kZXJlZ2lzdGVyIChpbnQgY29uZmlnTnIpCiB7Ci0JREJHKCIlczogXG4iLCBfX2Z1bmNfXyApOworCXByX2RlYnVnKCIlczogXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybjsKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnVzZWQgPSAwOwpAQCAtOTI2LDcgKzkyMSw3IEBACiAKIGludCBybmRpc19zZXRfcGFyYW1fZGV2KHU4IGNvbmZpZ05yLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKmNkY19maWx0ZXIpCiB7Ci0JREJHKCIlczpcbiIsIF9fZnVuY19fICk7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKQEAgLTkzOSw3ICs5MzQsNyBAQAogCiBpbnQgcm5kaXNfc2V0X3BhcmFtX3ZlbmRvciAodTggY29uZmlnTnIsIHUzMiB2ZW5kb3JJRCwgY29uc3QgY2hhciAqdmVuZG9yRGVzY3IpCiB7Ci0JREJHKCIlczpcbiIsIF9fZnVuY19fICk7CisJcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwogCWlmICghdmVuZG9yRGVzY3IpIHJldHVybiAtMTsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKIApAQCAtOTUxLDcgKzk0Niw3IEBACiAKIGludCBybmRpc19zZXRfcGFyYW1fbWVkaXVtICh1OCBjb25maWdOciwgdTMyIG1lZGl1bSwgdTMyIHNwZWVkKQogewotCURCRygiJXM6ICV1ICV1XG4iLCBfX2Z1bmNfXywgbWVkaXVtLCBzcGVlZCk7CisJcHJfZGVidWcoIiVzOiAldSAldVxuIiwgX19mdW5jX18sIG1lZGl1bSwgc3BlZWQpOwogCWlmIChjb25maWdOciA+PSBSTkRJU19NQVhfQ09ORklHUykgcmV0dXJuIC0xOwogCiAJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0gPSBtZWRpdW07CkBAIC0xMTE0LDcgKzExMDksNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpZiAoZmxfc3BlZWQpIHAtPnNwZWVkID0gc3BlZWQ7Ci0JCQllbHNlIERCRygiJWMgaXMgbm90IHZhbGlkXG4iLCBjKTsKKwkJCWVsc2UgcHJfZGVidWcoIiVjIGlzIG5vdCB2YWxpZFxuIiwgYyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMTU5LDEyICsxMTU0LDEyIEBACiAJCQkJCSZybmRpc19wcm9jX2ZvcHMsCiAJCQkJCSh2b2lkICopKHJuZGlzX3Blcl9kZXZfcGFyYW1zICsgaSkpKSkKIAkJewotCQkJREJHKCIlcyA6cmVtb3ZlIGVudHJpZXMiLCBfX2Z1bmNfXyk7CisJCQlwcl9kZWJ1ZygiJXMgOnJlbW92ZSBlbnRyaWVzIiwgX19mdW5jX18pOwogCQkJd2hpbGUgKGkpIHsKIAkJCQlzcHJpbnRmIChuYW1lLCBOQU1FX1RFTVBMQVRFLCAtLWkpOwogCQkJCXJlbW92ZV9wcm9jX2VudHJ5IChuYW1lLCBOVUxMKTsKIAkJCX0KLQkJCURCRygiXG4iKTsKKwkJCXByX2RlYnVnKCJcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IGIzNjk5YWYuLjNmYWE3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTMwLDYgKzMwLDI0IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8qCisgKiBLYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworI2luY2x1ZGUgImNvbXBvc2l0ZS5jIgorI2luY2x1ZGUgInVzYnN0cmluZy5jIgorI2luY2x1ZGUgImNvbmZpZy5jIgorI2luY2x1ZGUgImVwYXV0b2NvbmYuYyIKKworI2luY2x1ZGUgImZfYWNtLmMiCisjaW5jbHVkZSAiZl9zZXJpYWwuYyIKKyNpbmNsdWRlICJ1X3NlcmlhbC5jIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAvKiBUaGFua3MgdG8gTmV0Q2hpcCBUZWNobm9sb2dpZXMgZm9yIGRvbmF0aW5nIHRoaXMgcHJvZHVjdCBJRC4KICoKICogRE8gTk9UIFJFVVNFIFRIRVNFIElEcyB3aXRoIGEgcHJvdG9jb2wtaW5jb21wYXRpYmxlIGRyaXZlciEhICBFdmVyISEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCmluZGV4IDM3OTFlNjIuLmRiZDU3NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwpAQCAtNTIsNyArNTIsNyBAQAogICogdGhpcyBzaW5nbGUgInBoeXNpY2FsIiBsaW5rIHRvIGJlIHVzZWQgYnkgbXVsdGlwbGUgdmlydHVhbCBsaW5rcy4pCiAgKi8KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMjktTWF5LTIwMDgiCisjZGVmaW5lIFVFVEhfX1ZFUlNJT04JIjI5LU1heS0yMDA4IgogCiBzdHJ1Y3QgZXRoX2RldiB7CiAJLyogbG9jayBpcyBoZWxkIHdoaWxlIGFjY2Vzc2luZyBwb3J0X3VzYgpAQCAtMTcwLDcgKzE3MCw3IEBACiAJc3RydWN0IGV0aF9kZXYJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKIAlzdHJsY3B5KHAtPmRyaXZlciwgImdfZXRoZXIiLCBzaXplb2YgcC0+ZHJpdmVyKTsKLQlzdHJsY3B5KHAtPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YgcC0+dmVyc2lvbik7CisJc3RybGNweShwLT52ZXJzaW9uLCBVRVRIX19WRVJTSU9OLCBzaXplb2YgcC0+dmVyc2lvbik7CiAJc3RybGNweShwLT5md192ZXJzaW9uLCBkZXYtPmdhZGdldC0+bmFtZSwgc2l6ZW9mIHAtPmZ3X3ZlcnNpb24pOwogCXN0cmxjcHkocC0+YnVzX2luZm8sIGRldl9uYW1lKCZkZXYtPmdhZGdldC0+ZGV2KSwgc2l6ZW9mIHAtPmJ1c19pbmZvKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCmluZGV4IGFhMGJkNGYuLjM2MWQ5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwpAQCAtNTksNiArNTksMjMgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorLyoKKyAqIEtidWlsZCBpcyBub3QgdmVyeSBjb29wZXJhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gbGlua2luZyBzZXBhcmF0ZWx5CisgKiBjb21waWxlZCBsaWJyYXJ5IG9iamVjdHMgaW50byBvbmUgbW9kdWxlLiAgU28gZm9yIG5vdyB3ZSB3b24ndCB1c2UKKyAqIHNlcGFyYXRlIGNvbXBpbGF0aW9uIC4uLiBlbnN1cmluZyBpbml0L2V4aXQgc2VjdGlvbnMgd29yayB0byBzaHJpbmsKKyAqIHRoZSBydW50aW1lIGZvb3RwcmludCwgYW5kIGdpdmluZyB1cyBhdCBsZWFzdCBzb21lIHBhcnRzIG9mIHdoYXQKKyAqIGEgImdjYyAtLWNvbWJpbmUgLi4uIHBhcnQxLmMgcGFydDIuYyBwYXJ0My5jIC4uLiAiIGJ1aWxkIHdvdWxkLgorICovCisjaW5jbHVkZSAiY29tcG9zaXRlLmMiCisjaW5jbHVkZSAidXNic3RyaW5nLmMiCisjaW5jbHVkZSAiY29uZmlnLmMiCisjaW5jbHVkZSAiZXBhdXRvY29uZi5jIgorCisjaW5jbHVkZSAiZl9zb3VyY2VzaW5rLmMiCisjaW5jbHVkZSAiZl9sb29wYmFjay5jIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiQ2luY28gZGUgTWF5byAyMDA4IgogCiBzdGF0aWMgY29uc3QgY2hhciBsb25nbmFtZVtdID0gIkdhZGdldCBaZXJvIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCBkOWQ1M2YyLi44NDA5ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0xNDUsMTYgKzE0NSw2IEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgdm9pZCBfX2lvbWVtICpwdHIsCi0JCQkJICAgICAgIHUzMiBtYXNrLCB1MzIgZG9uZSwgaW50IHVzZWMpCi17Ci0JaW50IGVycm9yID0gaGFuZHNoYWtlKGVoY2ksIHB0ciwgbWFzaywgZG9uZSwgdXNlYyk7Ci0JaWYgKGVycm9yKQotCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOwotCi0JcmV0dXJuIGVycm9yOwotfQotCiAvKiBmb3JjZSBIQyB0byBoYWx0IHN0YXRlIGZyb20gdW5rbm93biAoRUhDSSBzcGVjIHNlY3Rpb24gMi4zKSAqLwogc3RhdGljIGludCBlaGNpX2hhbHQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKIHsKQEAgLTE3Myw2ICsxNjMsMjIgQEAKIAkJCSAgU1RTX0hBTFQsIFNUU19IQUxULCAxNiAqIDEyNSk7CiB9CiAKK3N0YXRpYyBpbnQgaGFuZHNoYWtlX29uX2Vycm9yX3NldF9oYWx0KHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgdm9pZCBfX2lvbWVtICpwdHIsCisJCQkJICAgICAgIHUzMiBtYXNrLCB1MzIgZG9uZSwgaW50IHVzZWMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBoYW5kc2hha2UoZWhjaSwgcHRyLCBtYXNrLCBkb25lLCB1c2VjKTsKKwlpZiAoZXJyb3IpIHsKKwkJZWhjaV9oYWx0KGVoY2kpOworCQllaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCQllaGNpX2VycihlaGNpLCAiZm9yY2UgaGFsdDsgaGFuZGhha2UgJXAgJTA4eCAlMDh4IC0+ICVkXG4iLAorCQkJcHRyLCBtYXNrLCBkb25lLCBlcnJvcik7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCiAvKiBwdXQgVERJL0FSQyBzaWxpY29uIGludG8gRUhDSSBtb2RlICovCiBzdGF0aWMgdm9pZCB0ZGlfcmVzZXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1peHA0eHguYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1peHA0eHguYwppbmRleCBmOTU3NWM0Li45YzMyMDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaXhwNHh4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWl4cDR4eC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIElYUDRYWCBFSENJIEhvc3QgQ29udHJvbGxlciBEcml2ZXIKICAqCi0gKiBBdXRob3I6IFZsYWRpbWlyIEJhcmlub3YgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKiBBdXRob3I6IFZsYWRpbWlyIEJhcmlub3YgPHZiYXJpbm92QGVtYmVkZGVkYWxsZXkuY29tPgogICoKICAqIEJhc2VkIG9uICJlaGNpLWZzbC5jIiBieSBSYW5keSBWaW5zb24gPHJ2aW5zb25AbXZpc3RhLmNvbT4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IGI3ODUzYzguLjRhMGM1YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC00MzcsNiArNDM3LDkgQEAKIAl1MzIJY21kOwogCWludAlzdGF0dXM7CiAKKwlpZiAoZWhjaS0+cGVyaW9kaWNfc2NoZWQrKykKKwkJcmV0dXJuIDA7CisKIAkvKiBkaWQgY2xlYXJpbmcgUFNFIGRpZCB0YWtlIGVmZmVjdCB5ZXQ/CiAJICogdGFrZXMgZWZmZWN0IG9ubHkgYXQgZnJhbWUgYm91bmRhcmllcy4uLgogCSAqLwpAQCAtNDYxLDYgKzQ2NCw5IEBACiAJdTMyCWNtZDsKIAlpbnQJc3RhdHVzOwogCisJaWYgKC0tZWhjaS0+cGVyaW9kaWNfc2NoZWQpCisJCXJldHVybiAwOworCiAJLyogZGlkIHNldHRpbmcgUFNFIG5vdCB0YWtlIGVmZmVjdCB5ZXQ/CiAJICogdGFrZXMgZWZmZWN0IG9ubHkgYXQgZnJhbWUgYm91bmRhcmllcy4uLgogCSAqLwpAQCAtNTQ0LDEzICs1NTAsMTAgQEAKIAkJOiAocWgtPnVzZWNzICogOCk7CiAKIAkvKiBtYXliZSBlbmFibGUgcGVyaW9kaWMgc2NoZWR1bGUgcHJvY2Vzc2luZyAqLwotCWlmICghZWhjaS0+cGVyaW9kaWNfc2NoZWQrKykKLQkJcmV0dXJuIGVuYWJsZV9wZXJpb2RpYyAoZWhjaSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZW5hYmxlX3BlcmlvZGljKGVoY2kpOwogfQogCi1zdGF0aWMgdm9pZCBxaF91bmxpbmtfcGVyaW9kaWMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfcWggKnFoKQorc3RhdGljIGludCBxaF91bmxpbmtfcGVyaW9kaWMoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCiB7CiAJdW5zaWduZWQJaTsKIAl1bnNpZ25lZAlwZXJpb2Q7CkBAIC01ODYsOSArNTg5LDcgQEAKIAlxaF9wdXQgKHFoKTsKIAogCS8qIG1heWJlIHR1cm4gb2ZmIHBlcmlvZGljIHNjaGVkdWxlICovCi0JZWhjaS0+cGVyaW9kaWNfc2NoZWQtLTsKLQlpZiAoIWVoY2ktPnBlcmlvZGljX3NjaGVkKQotCQkodm9pZCkgZGlzYWJsZV9wZXJpb2RpYyAoZWhjaSk7CisJcmV0dXJuIGRpc2FibGVfcGVyaW9kaWMoZWhjaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGludHJfZGVzY2hlZHVsZSAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCkBAIC0xNTYyLDkgKzE1NjMsNyBAQAogCXVyYi0+aGNwcml2ID0gTlVMTDsKIAogCXRpbWVyX2FjdGlvbiAoZWhjaSwgVElNRVJfSU9fV0FUQ0hET0cpOwotCWlmICh1bmxpa2VseSAoIWVoY2ktPnBlcmlvZGljX3NjaGVkKyspKQotCQlyZXR1cm4gZW5hYmxlX3BlcmlvZGljIChlaGNpKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZW5hYmxlX3BlcmlvZGljKGVoY2kpOwogfQogCiAjZGVmaW5lCUlTT19FUlJTIChFSENJX0lTT0NfQlVGX0VSUiB8IEVIQ0lfSVNPQ19CQUJCTEUgfCBFSENJX0lTT0NfWEFDVEVSUikKQEAgLTE2NDIsNyArMTY0MSw3IEBACiAJZWhjaV91cmJfZG9uZShlaGNpLCB1cmIsIDApOwogCXJldHZhbCA9IHRydWU7CiAJdXJiID0gTlVMTDsKLQllaGNpLT5wZXJpb2RpY19zY2hlZC0tOworCSh2b2lkKSBkaXNhYmxlX3BlcmlvZGljKGVoY2kpOwogCWVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmJhbmR3aWR0aF9pc29jX3JlcXMtLTsKIAogCWlmICh1bmxpa2VseSAobGlzdF9lbXB0eSAoJnN0cmVhbS0+dGRfbGlzdCkpKSB7CkBAIC0xOTUxLDkgKzE5NTAsNyBAQAogCXVyYi0+aGNwcml2ID0gTlVMTDsKIAogCXRpbWVyX2FjdGlvbiAoZWhjaSwgVElNRVJfSU9fV0FUQ0hET0cpOwotCWlmICghZWhjaS0+cGVyaW9kaWNfc2NoZWQrKykKLQkJcmV0dXJuIGVuYWJsZV9wZXJpb2RpYyAoZWhjaSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVuYWJsZV9wZXJpb2RpYyhlaGNpKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIwMTksNyArMjAxNiw3IEBACiAJZWhjaV91cmJfZG9uZShlaGNpLCB1cmIsIDApOwogCXJldHZhbCA9IHRydWU7CiAJdXJiID0gTlVMTDsKLQllaGNpLT5wZXJpb2RpY19zY2hlZC0tOworCSh2b2lkKSBkaXNhYmxlX3BlcmlvZGljKGVoY2kpOwogCWVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmJhbmR3aWR0aF9pc29jX3JlcXMtLTsKIAogCWlmIChsaXN0X2VtcHR5ICgmc3RyZWFtLT50ZF9saXN0KSkgewpAQCAtMjI0Myw4ICsyMjQwLDcgQEAKIAkJCWlmICh1bmxpa2VseSAobW9kaWZpZWQpKSB7CiAJCQkJaWYgKGxpa2VseShlaGNpLT5wZXJpb2RpY19zY2hlZCA+IDApKQogCQkJCQlnb3RvIHJlc3RhcnQ7Ci0JCQkJLyogbWF5YmUgd2UgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyBzY2FuISAqLwotCQkJCWRpc2FibGVfcGVyaW9kaWMoZWhjaSk7CisJCQkJLyogc2hvcnQtY2lyY3VpdCB0aGlzIHNjYW4gKi8KIAkJCQlub3dfdWZyYW1lID0gY2xvY2s7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCmluZGV4IDU3OTkyOTguLmI2OTdhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCkBAIC0yMTAsMTQzICsyMTAsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBFSENJIHJlZ2lzdGVyIGludGVyZmFjZSwgY29ycmVzcG9uZHMgdG8gRUhDSSBSZXZpc2lvbiAwLjk1IHNwZWNpZmljYXRpb24gKi8KLQotLyogU2VjdGlvbiAyLjIgSG9zdCBDb250cm9sbGVyIENhcGFiaWxpdHkgUmVnaXN0ZXJzICovCi1zdHJ1Y3QgZWhjaV9jYXBzIHsKLQkvKiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCBhcyA4IGFuZCAxNiBiaXQgcmVnaXN0ZXJzLAotCSAqIGJ1dCBzb21lIGhvc3RzIGNhbid0IHBlcmZvcm0gOCBvciAxNiBiaXQgUENJIGFjY2Vzc2VzLgotCSAqLwotCXUzMgkJaGNfY2FwYmFzZTsKLSNkZWZpbmUgSENfTEVOR1RIKHApCQkoKChwKT4+MDApJjB4MDBmZikJLyogYml0cyA3OjAgKi8KLSNkZWZpbmUgSENfVkVSU0lPTihwKQkJKCgocCk+PjE2KSYweGZmZmYpCS8qIGJpdHMgMzE6MTYgKi8KLQl1MzIJCWhjc19wYXJhbXM7ICAgICAvKiBIQ1NQQVJBTVMgLSBvZmZzZXQgMHg0ICovCi0jZGVmaW5lIEhDU19ERUJVR19QT1JUKHApCSgoKHApPj4yMCkmMHhmKQkvKiBiaXRzIDIzOjIwLCBkZWJ1ZyBwb3J0PyAqLwotI2RlZmluZSBIQ1NfSU5ESUNBVE9SKHApCSgocCkmKDEgPDwgMTYpKQkvKiB0cnVlOiBoYXMgcG9ydCBpbmRpY2F0b3JzICovCi0jZGVmaW5lIEhDU19OX0NDKHApCQkoKChwKT4+MTIpJjB4ZikJLyogYml0cyAxNToxMiwgI2NvbXBhbmlvbiBIQ3MgKi8KLSNkZWZpbmUgSENTX05fUENDKHApCQkoKChwKT4+OCkmMHhmKQkvKiBiaXRzIDExOjgsIHBvcnRzIHBlciBDQyAqLwotI2RlZmluZSBIQ1NfUE9SVFJPVVRFRChwKQkoKHApJigxIDw8IDcpKQkvKiB0cnVlOiBwb3J0IHJvdXRpbmcgKi8KLSNkZWZpbmUgSENTX1BQQyhwKQkJKChwKSYoMSA8PCA0KSkJLyogdHJ1ZTogcG9ydCBwb3dlciBjb250cm9sICovCi0jZGVmaW5lIEhDU19OX1BPUlRTKHApCQkoKChwKT4+MCkmMHhmKQkvKiBiaXRzIDM6MCwgcG9ydHMgb24gSEMgKi8KLQotCXUzMgkJaGNjX3BhcmFtczsgICAgICAvKiBIQ0NQQVJBTVMgLSBvZmZzZXQgMHg4ICovCi0jZGVmaW5lIEhDQ19FWFRfQ0FQUyhwKQkJKCgocCk+PjgpJjB4ZmYpCS8qIGZvciBwY2kgZXh0ZW5kZWQgY2FwcyAqLwotI2RlZmluZSBIQ0NfSVNPQ19DQUNIRShwKSAgICAgICAoKHApJigxIDw8IDcpKSAgLyogdHJ1ZTogY2FuIGNhY2hlIGlzb2MgZnJhbWUgKi8KLSNkZWZpbmUgSENDX0lTT0NfVEhSRVMocCkgICAgICAgKCgocCk+PjQpJjB4NykgIC8qIGJpdHMgNjo0LCB1ZnJhbWVzIGNhY2hlZCAqLwotI2RlZmluZSBIQ0NfQ0FOUEFSSyhwKQkJKChwKSYoMSA8PCAyKSkgIC8qIHRydWU6IGNhbiBwYXJrIG9uIGFzeW5jIHFoICovCi0jZGVmaW5lIEhDQ19QR01fRlJBTUVMSVNUTEVOKHApICgocCkmKDEgPDwgMSkpICAvKiB0cnVlOiBwZXJpb2RpY19zaXplIGNoYW5nZXMqLwotI2RlZmluZSBIQ0NfNjRCSVRfQUREUihwKSAgICAgICAoKHApJigxKSkgICAgICAgLyogdHJ1ZTogY2FuIHVzZSA2NC1iaXQgYWRkciAqLwotCXU4CQlwb3J0cm91dGUgWzhdOwkgLyogbmliYmxlcyBmb3Igcm91dGluZyAtIG9mZnNldCAweEMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIFNlY3Rpb24gMi4zIEhvc3QgQ29udHJvbGxlciBPcGVyYXRpb25hbCBSZWdpc3RlcnMgKi8KLXN0cnVjdCBlaGNpX3JlZ3MgewotCi0JLyogVVNCQ01EOiBvZmZzZXQgMHgwMCAqLwotCXUzMgkJY29tbWFuZDsKLS8qIDIzOjE2IGlzIHIvdyBpbnRyIHJhdGUsIGluIG1pY3JvZnJhbWVzOyBkZWZhdWx0ICI4IiA9PSAxL21zZWMgKi8KLSNkZWZpbmUgQ01EX1BBUksJKDE8PDExKQkJLyogZW5hYmxlICJwYXJrIiBvbiBhc3luYyBxaCAqLwotI2RlZmluZSBDTURfUEFSS19DTlQoYykJKCgoYyk+PjgpJjMpCS8qIGhvdyBtYW55IHRyYW5zZmVycyB0byBwYXJrIGZvciAqLwotI2RlZmluZSBDTURfTFJFU0VUCSgxPDw3KQkJLyogcGFydGlhbCByZXNldCAobm8gcG9ydHMsIGV0YykgKi8KLSNkZWZpbmUgQ01EX0lBQUQJKDE8PDYpCQkvKiAiZG9vcmJlbGwiIGludGVycnVwdCBhc3luYyBhZHZhbmNlICovCi0jZGVmaW5lIENNRF9BU0UJCSgxPDw1KQkJLyogYXN5bmMgc2NoZWR1bGUgZW5hYmxlICovCi0jZGVmaW5lIENNRF9QU0UJCSgxPDw0KQkJLyogcGVyaW9kaWMgc2NoZWR1bGUgZW5hYmxlICovCi0vKiAzOjIgaXMgcGVyaW9kaWMgZnJhbWUgbGlzdCBzaXplICovCi0jZGVmaW5lIENNRF9SRVNFVAkoMTw8MSkJCS8qIHJlc2V0IEhDIG5vdCBidXMgKi8KLSNkZWZpbmUgQ01EX1JVTgkJKDE8PDApCQkvKiBzdGFydC9zdG9wIEhDICovCi0KLQkvKiBVU0JTVFM6IG9mZnNldCAweDA0ICovCi0JdTMyCQlzdGF0dXM7Ci0jZGVmaW5lIFNUU19BU1MJCSgxPDwxNSkJCS8qIEFzeW5jIFNjaGVkdWxlIFN0YXR1cyAqLwotI2RlZmluZSBTVFNfUFNTCQkoMTw8MTQpCQkvKiBQZXJpb2RpYyBTY2hlZHVsZSBTdGF0dXMgKi8KLSNkZWZpbmUgU1RTX1JFQ0wJKDE8PDEzKQkJLyogUmVjbGFtYXRpb24gKi8KLSNkZWZpbmUgU1RTX0hBTFQJKDE8PDEyKQkJLyogTm90IHJ1bm5pbmcgKGFueSByZWFzb24pICovCi0vKiBzb21lIGJpdHMgcmVzZXJ2ZWQgKi8KLQkvKiB0aGVzZSBTVFNfKiBmbGFncyBhcmUgYWxzbyBpbnRyX2VuYWJsZSBiaXRzIChVU0JJTlRSKSAqLwotI2RlZmluZSBTVFNfSUFBCQkoMTw8NSkJCS8qIEludGVycnVwdGVkIG9uIGFzeW5jIGFkdmFuY2UgKi8KLSNkZWZpbmUgU1RTX0ZBVEFMCSgxPDw0KQkJLyogc3VjaCBhcyBzb21lIFBDSSBhY2Nlc3MgZXJyb3JzICovCi0jZGVmaW5lIFNUU19GTFIJCSgxPDwzKQkJLyogZnJhbWUgbGlzdCByb2xsZWQgb3ZlciAqLwotI2RlZmluZSBTVFNfUENECQkoMTw8MikJCS8qIHBvcnQgY2hhbmdlIGRldGVjdCAqLwotI2RlZmluZSBTVFNfRVJSCQkoMTw8MSkJCS8qICJlcnJvciIgY29tcGxldGlvbiAob3ZlcmZsb3csIC4uLikgKi8KLSNkZWZpbmUgU1RTX0lOVAkJKDE8PDApCQkvKiAibm9ybWFsIiBjb21wbGV0aW9uIChzaG9ydCwgLi4uKSAqLwotCi0JLyogVVNCSU5UUjogb2Zmc2V0IDB4MDggKi8KLQl1MzIJCWludHJfZW5hYmxlOwotCi0JLyogRlJJTkRFWDogb2Zmc2V0IDB4MEMgKi8KLQl1MzIJCWZyYW1lX2luZGV4OwkvKiBjdXJyZW50IG1pY3JvZnJhbWUgbnVtYmVyICovCi0JLyogQ1RSTERTU0VHTUVOVDogb2Zmc2V0IDB4MTAgKi8KLQl1MzIJCXNlZ21lbnQ7CS8qIGFkZHJlc3MgYml0cyA2MzozMiBpZiBuZWVkZWQgKi8KLQkvKiBQRVJJT0RJQ0xJU1RCQVNFOiBvZmZzZXQgMHgxNCAqLwotCXUzMgkJZnJhbWVfbGlzdDsJLyogcG9pbnRzIHRvIHBlcmlvZGljIGxpc3QgKi8KLQkvKiBBU1lOQ0xJU1RBRERSOiBvZmZzZXQgMHgxOCAqLwotCXUzMgkJYXN5bmNfbmV4dDsJLyogYWRkcmVzcyBvZiBuZXh0IGFzeW5jIHF1ZXVlIGhlYWQgKi8KLQotCXUzMgkJcmVzZXJ2ZWQgWzldOwotCi0JLyogQ09ORklHRkxBRzogb2Zmc2V0IDB4NDAgKi8KLQl1MzIJCWNvbmZpZ3VyZWRfZmxhZzsKLSNkZWZpbmUgRkxBR19DRgkJKDE8PDApCQkvKiB0cnVlOiB3ZSdsbCBzdXBwb3J0ICJoaWdoIHNwZWVkIiAqLwotCi0JLyogUE9SVFNDOiBvZmZzZXQgMHg0NCAqLwotCXUzMgkJcG9ydF9zdGF0dXMgWzBdOwkvKiB1cCB0byBOX1BPUlRTICovCi0vKiAzMToyMyByZXNlcnZlZCAqLwotI2RlZmluZSBQT1JUX1dLT0NfRQkoMTw8MjIpCQkvKiB3YWtlIG9uIG92ZXJjdXJyZW50IChlbmFibGUpICovCi0jZGVmaW5lIFBPUlRfV0tESVNDX0UJKDE8PDIxKQkJLyogd2FrZSBvbiBkaXNjb25uZWN0IChlbmFibGUpICovCi0jZGVmaW5lIFBPUlRfV0tDT05OX0UJKDE8PDIwKQkJLyogd2FrZSBvbiBjb25uZWN0IChlbmFibGUpICovCi0vKiAxOToxNiBmb3IgcG9ydCB0ZXN0aW5nICovCi0jZGVmaW5lIFBPUlRfTEVEX09GRgkoMDw8MTQpCi0jZGVmaW5lIFBPUlRfTEVEX0FNQkVSCSgxPDwxNCkKLSNkZWZpbmUgUE9SVF9MRURfR1JFRU4JKDI8PDE0KQotI2RlZmluZSBQT1JUX0xFRF9NQVNLCSgzPDwxNCkKLSNkZWZpbmUgUE9SVF9PV05FUgkoMTw8MTMpCQkvKiB0cnVlOiBjb21wYW5pb24gaGMgb3ducyB0aGlzIHBvcnQgKi8KLSNkZWZpbmUgUE9SVF9QT1dFUgkoMTw8MTIpCQkvKiB0cnVlOiBoYXMgcG93ZXIgKHNlZSBQUEMpICovCi0jZGVmaW5lIFBPUlRfVVNCMTEoeCkgKCgoeCkmKDM8PDEwKSk9PSgxPDwxMCkpCS8qIFVTQiAxLjEgZGV2aWNlICovCi0vKiAxMToxMCBmb3IgZGV0ZWN0aW5nIGxvd3NwZWVkIGRldmljZXMgKHJlc2V0IHZzIHJlbGVhc2Ugb3duZXJzaGlwKSAqLwotLyogOSByZXNlcnZlZCAqLwotI2RlZmluZSBQT1JUX1JFU0VUCSgxPDw4KQkJLyogcmVzZXQgcG9ydCAqLwotI2RlZmluZSBQT1JUX1NVU1BFTkQJKDE8PDcpCQkvKiBzdXNwZW5kIHBvcnQgKi8KLSNkZWZpbmUgUE9SVF9SRVNVTUUJKDE8PDYpCQkvKiByZXN1bWUgaXQgKi8KLSNkZWZpbmUgUE9SVF9PQ0MJKDE8PDUpCQkvKiBvdmVyIGN1cnJlbnQgY2hhbmdlICovCi0jZGVmaW5lIFBPUlRfT0MJCSgxPDw0KQkJLyogb3ZlciBjdXJyZW50IGFjdGl2ZSAqLwotI2RlZmluZSBQT1JUX1BFQwkoMTw8MykJCS8qIHBvcnQgZW5hYmxlIGNoYW5nZSAqLwotI2RlZmluZSBQT1JUX1BFCQkoMTw8MikJCS8qIHBvcnQgZW5hYmxlICovCi0jZGVmaW5lIFBPUlRfQ1NDCSgxPDwxKQkJLyogY29ubmVjdCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFBPUlRfQ09OTkVDVAkoMTw8MCkJCS8qIGRldmljZSBjb25uZWN0ZWQgKi8KLSNkZWZpbmUgUE9SVF9SV0NfQklUUyAgIChQT1JUX0NTQyB8IFBPUlRfUEVDIHwgUE9SVF9PQ0MpCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBVU0JNT0RFCQkweDY4CQkvKiBVU0IgRGV2aWNlIG1vZGUgKi8KLSNkZWZpbmUgVVNCTU9ERV9TRElTCSgxPDwzKQkJLyogU3RyZWFtIGRpc2FibGUgKi8KLSNkZWZpbmUgVVNCTU9ERV9CRQkoMTw8MikJCS8qIEJFL0xFIGVuZGlhbm5lc3Mgc2VsZWN0ICovCi0jZGVmaW5lIFVTQk1PREVfQ01fSEMJKDM8PDApCQkvKiBob3N0IGNvbnRyb2xsZXIgbW9kZSAqLwotI2RlZmluZSBVU0JNT0RFX0NNX0lETEUJKDA8PDApCQkvKiBpZGxlIHN0YXRlICovCi0KLS8qIEFwcGVuZGl4IEMsIERlYnVnIHBvcnQgLi4uIGludGVuZGVkIGZvciB1c2Ugd2l0aCBzcGVjaWFsICJkZWJ1ZyBkZXZpY2VzIgotICogdGhhdCBjYW4gaGVscCBpZiB0aGVyZSdzIG5vIHNlcmlhbCBjb25zb2xlLiAgKG5vbnN0YW5kYXJkIGVudW1lcmF0aW9uLikKLSAqLwotc3RydWN0IGVoY2lfZGJnX3BvcnQgewotCXUzMgljb250cm9sOwotI2RlZmluZSBEQkdQX09XTkVSCSgxPDwzMCkKLSNkZWZpbmUgREJHUF9FTkFCTEVECSgxPDwyOCkKLSNkZWZpbmUgREJHUF9ET05FCSgxPDwxNikKLSNkZWZpbmUgREJHUF9JTlVTRQkoMTw8MTApCi0jZGVmaW5lIERCR1BfRVJSQ09ERSh4KQkoKCh4KT4+NykmMHgwNykKLSMJZGVmaW5lIERCR1BfRVJSX0JBRAkxCi0jCWRlZmluZSBEQkdQX0VSUl9TSUdOQUwJMgotI2RlZmluZSBEQkdQX0VSUk9SCSgxPDw2KQotI2RlZmluZSBEQkdQX0dPCQkoMTw8NSkKLSNkZWZpbmUgREJHUF9PVVQJKDE8PDQpCi0jZGVmaW5lIERCR1BfTEVOKHgpCSgoKHgpPj4wKSYweDBmKQotCXUzMglwaWRzOwotI2RlZmluZSBEQkdQX1BJRF9HRVQoeCkJCSgoKHgpPj4xNikmMHhmZikKLSNkZWZpbmUgREJHUF9QSURfU0VUKGRhdGEsdG9rKQkoKChkYXRhKTw8OCl8KHRvaykpCi0JdTMyCWRhdGEwMzsKLQl1MzIJZGF0YTQ3OwotCXUzMglhZGRyZXNzOwotI2RlZmluZSBEQkdQX0VQQUREUihkZXYsZXApCSgoKGRldik8PDgpfChlcCkpCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNpbmNsdWRlIDxsaW51eC91c2IvZWhjaV9kZWYuaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKaW5kZXggMWViNjRkMC4uNTIyMTg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCiAJCW9jcGlfZW5hYmxlKCk7CiAKLSNpZmRlZglDT05GSUdfQVJDSF9PTUFQX09URworI2lmZGVmCUNPTkZJR19VU0JfT1RHCiAJaWYgKG5lZWRfdHJhbnNjZWl2ZXIpIHsKIAkJb2hjaS0+dHJhbnNjZWl2ZXIgPSBvdGdfZ2V0X3RyYW5zY2VpdmVyKCk7CiAJCWlmIChvaGNpLT50cmFuc2NlaXZlcikgewpAQCAtMzQ0LDcgKzM0NCwxMiBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JaGNkLT5yZWdzID0gKHZvaWQgX19pb21lbSAqKSAoaW50KSBJT19BRERSRVNTKGhjZC0+cnNyY19zdGFydCk7CisJaGNkLT5yZWdzID0gaW9yZW1hcChoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCWlmICghaGNkLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgT0hDSSBIQ0RcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjI7CisJfQogCiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJb2hjaV9oY2RfaW5pdChvaGNpKTsKQEAgLTM1NSwxMSArMzYwLDExIEBACiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewogCQlyZXR2YWwgPSAtRU5YSU87Ci0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnIzOwogCX0KIAlyZXR2YWwgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9ESVNBQkxFRCk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBlcnIyOworCQlnb3RvIGVycjM7CiAKIAlob3N0X2luaXRpYWxpemVkID0gMTsKIApAQCAtMzY3LDYgKzM3Miw4IEBACiAJCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKIAogCXJldHVybiAwOworZXJyMzoKKwlpb3VubWFwKGhjZC0+cmVncyk7CiBlcnIyOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwogZXJyMToKQEAgLTQwMSw2ICs0MDgsNyBAQAogCX0KIAlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKQogCQlvbWFwX2ZyZWVfZ3Bpbyg5KTsKKwlpb3VubWFwKGhjZC0+cmVncyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAJdXNiX3B1dF9oY2QoaGNkKTsKIAljbGtfcHV0KHVzYl9kY19jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKaW5kZXggN2YwZjM1Yy4uZTI5NGQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYwpAQCAtMjMsMTcgKzIzLDkwIEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4gLyogRklYTUU6IGZvciBQU1NSICovCiAjaW5jbHVkZSA8bWFjaC9vaGNpLmg+CiAKKy8qCisgKiBVSEM6IFVTQiBIb3N0IENvbnRyb2xsZXIgKE9IQ0ktbGlrZSkgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBVSENSRVYJCSgweDAwMDApIC8qIFVIQyBIQ0kgU3BlYyBSZXZpc2lvbiAqLworI2RlZmluZSBVSENIQ09OCQkoMHgwMDA0KSAvKiBVSEMgSG9zdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVIQ0NPTVMJCSgweDAwMDgpIC8qIFVIQyBDb21tYW5kIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBVSENJTlRTCQkoMHgwMDBDKSAvKiBVSEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBVSENJTlRFCQkoMHgwMDEwKSAvKiBVSEMgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBVSENJTlRECQkoMHgwMDE0KSAvKiBVSEMgSW50ZXJydXB0IERpc2FibGUgKi8KKyNkZWZpbmUgVUhDSENDQQkJKDB4MDAxOCkgLyogVUhDIEhvc3QgQ29udHJvbGxlciBDb21tLiBBcmVhICovCisjZGVmaW5lIFVIQ1BDRUQJCSgweDAwMUMpIC8qIFVIQyBQZXJpb2QgQ3VycmVudCBFbmRwdCBEZXNjciAqLworI2RlZmluZSBVSENDSEVECQkoMHgwMDIwKSAvKiBVSEMgQ29udHJvbCBIZWFkIEVuZHB0IERlc2NyICovCisjZGVmaW5lIFVIQ0NDRUQJCSgweDAwMjQpIC8qIFVIQyBDb250cm9sIEN1cnJlbnQgRW5kcHQgRGVzY3IgKi8KKyNkZWZpbmUgVUhDQkhFRAkJKDB4MDAyOCkgLyogVUhDIEJ1bGsgSGVhZCBFbmRwdCBEZXNjciAqLworI2RlZmluZSBVSENCQ0VECQkoMHgwMDJDKSAvKiBVSEMgQnVsayBDdXJyZW50IEVuZHB0IERlc2NyICovCisjZGVmaW5lIFVIQ0RIRUFECSgweDAwMzApIC8qIFVIQyBEb25lIEhlYWQgKi8KKyNkZWZpbmUgVUhDRk1JCQkoMHgwMDM0KSAvKiBVSEMgRnJhbWUgSW50ZXJ2YWwgKi8KKyNkZWZpbmUgVUhDRk1SCQkoMHgwMDM4KSAvKiBVSEMgRnJhbWUgUmVtYWluaW5nICovCisjZGVmaW5lIFVIQ0ZNTgkJKDB4MDAzQykgLyogVUhDIEZyYW1lIE51bWJlciAqLworI2RlZmluZSBVSENQRVJTCQkoMHgwMDQwKSAvKiBVSEMgUGVyaW9kaWMgU3RhcnQgKi8KKyNkZWZpbmUgVUhDTFMJCSgweDAwNDQpIC8qIFVIQyBMb3cgU3BlZWQgVGhyZXNob2xkICovCisKKyNkZWZpbmUgVUhDUkhEQQkJKDB4MDA0OCkgLyogVUhDIFJvb3QgSHViIERlc2NyaXB0b3IgQSAqLworI2RlZmluZSBVSENSSERBX05PQ1AJKDEgPDwgMTIpCS8qIE5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lIFVIQ1JIREFfT0NQTQkoMSA8PCAxMSkJLyogT3ZlciBDdXJyZW50IFByb3RlY3Rpb24gTW9kZSAqLworI2RlZmluZSBVSENSSERBX1BPVFBHVCh4KSBcCisJCQkoKCh4KSAmIDB4ZmYpIDw8IDI0KSAvKiBQb3dlciBPbiBUbyBQb3dlciBHb29kIFRpbWUgKi8KKworI2RlZmluZSBVSENSSERCCQkoMHgwMDRDKSAvKiBVSEMgUm9vdCBIdWIgRGVzY3JpcHRvciBCICovCisjZGVmaW5lIFVIQ1JIUwkJKDB4MDA1MCkgLyogVUhDIFJvb3QgSHViIFN0YXR1cyAqLworI2RlZmluZSBVSENSSFBTMQkoMHgwMDU0KSAvKiBVSEMgUm9vdCBIdWIgUG9ydCAxIFN0YXR1cyAqLworI2RlZmluZSBVSENSSFBTMgkoMHgwMDU4KSAvKiBVSEMgUm9vdCBIdWIgUG9ydCAyIFN0YXR1cyAqLworI2RlZmluZSBVSENSSFBTMwkoMHgwMDVDKSAvKiBVSEMgUm9vdCBIdWIgUG9ydCAzIFN0YXR1cyAqLworCisjZGVmaW5lIFVIQ1NUQVQJCSgweDAwNjApIC8qIFVIQyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUhDU1RBVF9VUFMzCSgxIDw8IDE2KQkvKiBVU0IgUG93ZXIgU2Vuc2UgUG9ydDMgKi8KKyNkZWZpbmUgVUhDU1RBVF9TQk1BSQkoMSA8PCAxNSkJLyogU3lzdGVtIEJ1cyBNYXN0ZXIgQWJvcnQgSW50ZXJydXB0Ki8KKyNkZWZpbmUgVUhDU1RBVF9TQlRBSQkoMSA8PCAxNCkJLyogU3lzdGVtIEJ1cyBUYXJnZXQgQWJvcnQgSW50ZXJydXB0Ki8KKyNkZWZpbmUgVUhDU1RBVF9VUFJJCSgxIDw8IDEzKQkvKiBVU0IgUG9ydCBSZXN1bWUgSW50ZXJydXB0ICovCisjZGVmaW5lIFVIQ1NUQVRfVVBTMgkoMSA8PCAxMikJLyogVVNCIFBvd2VyIFNlbnNlIFBvcnQgMiAqLworI2RlZmluZSBVSENTVEFUX1VQUzEJKDEgPDwgMTEpCS8qIFVTQiBQb3dlciBTZW5zZSBQb3J0IDEgKi8KKyNkZWZpbmUgVUhDU1RBVF9IVEEJKDEgPDwgMTApCS8qIEhDSSBUYXJnZXQgQWJvcnQgKi8KKyNkZWZpbmUgVUhDU1RBVF9IQkEJKDEgPDwgOCkJLyogSENJIEJ1ZmZlciBBY3RpdmUgKi8KKyNkZWZpbmUgVUhDU1RBVF9SV1VFCSgxIDw8IDcpCS8qIEhDSSBSZW1vdGUgV2FrZSBVcCBFdmVudCAqLworCisjZGVmaW5lIFVIQ0hSICAgICAgICAgICAoMHgwMDY0KSAvKiBVSEMgUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUhDSFJfU1NFUDMJKDEgPDwgMTEpCS8qIFNsZWVwIFN0YW5kYnkgRW5hYmxlIGZvciBQb3J0MyAqLworI2RlZmluZSBVSENIUl9TU0VQMgkoMSA8PCAxMCkJLyogU2xlZXAgU3RhbmRieSBFbmFibGUgZm9yIFBvcnQyICovCisjZGVmaW5lIFVIQ0hSX1NTRVAxCSgxIDw8IDkpCS8qIFNsZWVwIFN0YW5kYnkgRW5hYmxlIGZvciBQb3J0MSAqLworI2RlZmluZSBVSENIUl9QQ1BMCSgxIDw8IDcpCS8qIFBvd2VyIGNvbnRyb2wgcG9sYXJpdHkgbG93ICovCisjZGVmaW5lIFVIQ0hSX1BTUEwJKDEgPDwgNikJLyogUG93ZXIgc2Vuc2UgcG9sYXJpdHkgbG93ICovCisjZGVmaW5lIFVIQ0hSX1NTRQkoMSA8PCA1KQkvKiBTbGVlcCBTdGFuZGJ5IEVuYWJsZSAqLworI2RlZmluZSBVSENIUl9VSVQJKDEgPDwgNCkJLyogVVNCIEludGVycnVwdCBUZXN0ICovCisjZGVmaW5lIFVIQ0hSX1NTREMJKDEgPDwgMykJLyogU2ltdWxhdGlvbiBTY2FsZSBEb3duIENsb2NrICovCisjZGVmaW5lIFVIQ0hSX0NHUgkoMSA8PCAyKQkvKiBDbG9jayBHZW5lcmF0aW9uIFJlc2V0ICovCisjZGVmaW5lIFVIQ0hSX0ZIUgkoMSA8PCAxKQkvKiBGb3JjZSBIb3N0IENvbnRyb2xsZXIgUmVzZXQgKi8KKyNkZWZpbmUgVUhDSFJfRlNCSVIJKDEgPDwgMCkJLyogRm9yY2UgU3lzdGVtIEJ1cyBJZmFjZSBSZXNldCAqLworCisjZGVmaW5lIFVIQ0hJRSAgICAgICAgICAoMHgwMDY4KSAvKiBVSEMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciovCisjZGVmaW5lIFVIQ0hJRV9VUFMzSUUJKDEgPDwgMTQpCS8qIFBvd2VyIFNlbnNlIFBvcnQzIEludEVuICovCisjZGVmaW5lIFVIQ0hJRV9VUFJJRQkoMSA8PCAxMykJLyogUG9ydCBSZXN1bWUgSW50RW4gKi8KKyNkZWZpbmUgVUhDSElFX1VQUzJJRQkoMSA8PCAxMikJLyogUG93ZXIgU2Vuc2UgUG9ydDIgSW50RW4gKi8KKyNkZWZpbmUgVUhDSElFX1VQUzFJRQkoMSA8PCAxMSkJLyogUG93ZXIgU2Vuc2UgUG9ydDEgSW50RW4gKi8KKyNkZWZpbmUgVUhDSElFX1RBSUUJKDEgPDwgMTApCS8qIEhDSSBJbnRlcmZhY2UgVHJhbnNmZXIgQWJvcnQKKwkJCQkJICAgSW50ZXJydXB0IEVuYWJsZSovCisjZGVmaW5lIFVIQ0hJRV9IQkFJRQkoMSA8PCA4KQkvKiBIQ0kgQnVmZmVyIEFjdGl2ZSBJbnRFbiAqLworI2RlZmluZSBVSENISUVfUldJRQkoMSA8PCA3KQkvKiBSZW1vdGUgV2FrZS11cCBJbnRFbiAqLworCisjZGVmaW5lIFVIQ0hJVCAgICAgICAgICAoMHgwMDZDKSAvKiBVSEMgSW50ZXJydXB0IFRlc3QgcmVnaXN0ZXIgKi8KKwogI2RlZmluZSBQWEFfVUhDX01BWF9QT1JUTlVNICAgIDMKIAotI2RlZmluZSBVSENSSFBTKHgpICAgICAgICAgICAgICBfX1JFRzIoIDB4NEMwMDAwNTAsICh4KTw8MiApCitzdHJ1Y3QgcHhhMjd4X29oY2kgeworCS8qIG11c3QgYmUgMXN0IG1lbWJlciBoZXJlIGZvciBoY2RfdG9fb2hjaSgpIHRvIHdvcmsgKi8KKwlzdHJ1Y3Qgb2hjaV9oY2Qgb2hjaTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKnVzYl9jbGs7CisJc3RydWN0IGRldmljZQkqZGV2OworCXN0cnVjdCBjbGsJKmNsazsKKwl2b2lkIF9faW9tZW0JKm1taW9fYmFzZTsKK307CisKKyNkZWZpbmUgdG9fcHhhMjd4X29oY2koaGNkKQkoc3RydWN0IHB4YTI3eF9vaGNpICopaGNkX3RvX29oY2koaGNkKQogCiAvKgogICBQTU1fTlBTX01PREUgLS0gUE1NIE5vbi1wb3dlciBzd2l0Y2hpbmcgbW9kZQpAQCAtNDUsMzAgKzExOCwzNSBAQAogICBQTU1fUEVSUE9SVF9NT0RFIC0tIFBNTSBwZXIgcG9ydCBzd2l0Y2hpbmcgbW9kZQogICAgICAgUG9ydHMgYXJlIHBvd2VyZWQgaW5kaXZpZHVhbGx5LgogICovCi1zdGF0aWMgaW50IHB4YTI3eF9vaGNpX3NlbGVjdF9wbW0oIGludCBtb2RlICkKK3N0YXRpYyBpbnQgcHhhMjd4X29oY2lfc2VsZWN0X3BtbShzdHJ1Y3QgcHhhMjd4X29oY2kgKm9oY2ksIGludCBtb2RlKQogewotCXN3aXRjaCAoIG1vZGUgKSB7CisJdWludDMyX3QgdWhjcmhkYSA9IF9fcmF3X3JlYWRsKG9oY2ktPm1taW9fYmFzZSArIFVIQ1JIREEpOworCXVpbnQzMl90IHVoY3JoZGIgPSBfX3Jhd19yZWFkbChvaGNpLT5tbWlvX2Jhc2UgKyBVSENSSERCKTsKKworCXN3aXRjaCAobW9kZSkgewogCWNhc2UgUE1NX05QU19NT0RFOgotCQlVSENSSERBIHw9IFJIX0FfTlBTOworCQl1aGNyaGRhIHw9IFJIX0FfTlBTOwogCQlicmVhazsKIAljYXNlIFBNTV9HTE9CQUxfTU9ERToKLQkJVUhDUkhEQSAmPSB+KFJIX0FfTlBTICYgUkhfQV9QU00pOworCQl1aGNyaGRhICY9IH4oUkhfQV9OUFMgJiBSSF9BX1BTTSk7CiAJCWJyZWFrOwogCWNhc2UgUE1NX1BFUlBPUlRfTU9ERToKLQkJVUhDUkhEQSAmPSB+KFJIX0FfTlBTKTsKLQkJVUhDUkhEQSB8PSBSSF9BX1BTTTsKKwkJdWhjcmhkYSAmPSB+KFJIX0FfTlBTKTsKKwkJdWhjcmhkYSB8PSBSSF9BX1BTTTsKIAogCQkvKiBTZXQgcG9ydCBwb3dlciBjb250cm9sIG1hc2sgYml0cywgb25seSAzIHBvcnRzLiAqLwotCQlVSENSSERCIHw9ICgweDc8PDE3KTsKKwkJdWhjcmhkYiB8PSAoMHg3PDwxNyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayggS0VSTl9FUlIKIAkJCSJJbnZhbGlkIG1vZGUgJWQsIHNldCB0byBub24tcG93ZXIgc3dpdGNoIG1vZGUuXG4iLAogCQkJbW9kZSApOwogCi0JCVVIQ1JIREEgfD0gUkhfQV9OUFM7CisJCXVoY3JoZGEgfD0gUkhfQV9OUFM7CiAJfQogCisJX19yYXdfd3JpdGVsKHVoY3JoZGEsIG9oY2ktPm1taW9fYmFzZSArIFVIQ1JIREEpOworCV9fcmF3X3dyaXRlbCh1aGNyaGRiLCBvaGNpLT5tbWlvX2Jhc2UgKyBVSENSSERCKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYsNTcgKzE1NCwxMTAgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBweGEyN3hfc3RhcnRfaGMoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHB4YTI3eF9zZXR1cF9oYyhzdHJ1Y3QgcHhhMjd4X29oY2kgKm9oY2ksCisJCQkJICAgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSAqaW5mKQoreworCXVpbnQzMl90IHVoY2hyID0gX19yYXdfcmVhZGwob2hjaS0+bW1pb19iYXNlICsgVUhDSFIpOworCXVpbnQzMl90IHVoY3JoZGEgPSBfX3Jhd19yZWFkbChvaGNpLT5tbWlvX2Jhc2UgKyBVSENSSERBKTsKKworCWlmIChpbmYtPmZsYWdzICYgRU5BQkxFX1BPUlQxKQorCQl1aGNociAmPSB+VUhDSFJfU1NFUDE7CisKKwlpZiAoaW5mLT5mbGFncyAmIEVOQUJMRV9QT1JUMikKKwkJdWhjaHIgJj0gflVIQ0hSX1NTRVAyOworCisJaWYgKGluZi0+ZmxhZ3MgJiBFTkFCTEVfUE9SVDMpCisJCXVoY2hyICY9IH5VSENIUl9TU0VQMzsKKworCWlmIChpbmYtPmZsYWdzICYgUE9XRVJfQ09OVFJPTF9MT1cpCisJCXVoY2hyIHw9IFVIQ0hSX1BDUEw7CisKKwlpZiAoaW5mLT5mbGFncyAmIFBPV0VSX1NFTlNFX0xPVykKKwkJdWhjaHIgfD0gVUhDSFJfUFNQTDsKKworCWlmIChpbmYtPmZsYWdzICYgTk9fT0NfUFJPVEVDVElPTikKKwkJdWhjcmhkYSB8PSBVSENSSERBX05PQ1A7CisKKwlpZiAoaW5mLT5mbGFncyAmIE9DX01PREVfUEVSUE9SVCkKKwkJdWhjcmhkYSB8PSBVSENSSERBX09DUE07CisKKwlpZiAoaW5mLT5wb3dlcl9vbl9kZWxheSkgeworCQl1aGNyaGRhICY9IH5VSENSSERBX1BPVFBHVCgweGZmKTsKKwkJdWhjcmhkYSB8PSBVSENSSERBX1BPVFBHVChpbmYtPnBvd2VyX29uX2RlbGF5IC8gMik7CisJfQorCisJX19yYXdfd3JpdGVsKHVoY2hyLCBvaGNpLT5tbWlvX2Jhc2UgKyBVSENIUik7CisJX19yYXdfd3JpdGVsKHVoY3JoZGEsIG9oY2ktPm1taW9fYmFzZSArIFVIQ1JIREEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHhhMjd4X3Jlc2V0X2hjKHN0cnVjdCBweGEyN3hfb2hjaSAqb2hjaSkKK3sKKwl1aW50MzJfdCB1aGNociA9IF9fcmF3X3JlYWRsKG9oY2ktPm1taW9fYmFzZSArIFVIQ0hSKTsKKworCV9fcmF3X3dyaXRlbCh1aGNociB8IFVIQ0hSX0ZIUiwgb2hjaS0+bW1pb19iYXNlICsgVUhDSFIpOworCXVkZWxheSgxMSk7CisJX19yYXdfd3JpdGVsKHVoY2hyICYgflVIQ0hSX0ZIUiwgb2hjaS0+bW1pb19iYXNlICsgVUhDSFIpOworfQorCisjaWZkZWYgQ09ORklHX0NQVV9QWEEyN3gKK2V4dGVybiB2b2lkIHB4YTI3eF9jbGVhcl9vdGdwaCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHB4YTI3eF9jbGVhcl9vdGdwaCgpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHhhMjd4X3N0YXJ0X2hjKHN0cnVjdCBweGEyN3hfb2hjaSAqb2hjaSwgc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXR2YWwgPSAwOwogCXN0cnVjdCBweGFvaGNpX3BsYXRmb3JtX2RhdGEgKmluZjsKKwl1aW50MzJfdCB1aGNocjsKIAogCWluZiA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAotCWNsa19lbmFibGUodXNiX2Nsayk7CisJY2xrX2VuYWJsZShvaGNpLT5jbGspOwogCi0JVUhDSFIgfD0gVUhDSFJfRkhSOwotCXVkZWxheSgxMSk7Ci0JVUhDSFIgJj0gflVIQ0hSX0ZIUjsKKwlweGEyN3hfcmVzZXRfaGMob2hjaSk7CiAKLQlVSENIUiB8PSBVSENIUl9GU0JJUjsKLQl3aGlsZSAoVUhDSFIgJiBVSENIUl9GU0JJUikKKwl1aGNociA9IF9fcmF3X3JlYWRsKG9oY2ktPm1taW9fYmFzZSArIFVIQ0hSKSB8IFVIQ0hSX0ZTQklSOworCV9fcmF3X3dyaXRlbCh1aGNociwgb2hjaS0+bW1pb19iYXNlICsgVUhDSFIpOworCisJd2hpbGUgKF9fcmF3X3JlYWRsKG9oY2ktPm1taW9fYmFzZSArIFVIQ0hSKSAmIFVIQ0hSX0ZTQklSKQogCQljcHVfcmVsYXgoKTsKIAorCXB4YTI3eF9zZXR1cF9oYyhvaGNpLCBpbmYpOworCiAJaWYgKGluZi0+aW5pdCkKIAkJcmV0dmFsID0gaW5mLT5pbml0KGRldik7CiAKIAlpZiAocmV0dmFsIDwgMCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCVVIQ0hSICY9IH5VSENIUl9TU0U7Ci0KLQlVSENISUUgPSAoVUhDSElFX1VQUklFIHwgVUhDSElFX1JXSUUpOworCXVoY2hyID0gX19yYXdfcmVhZGwob2hjaS0+bW1pb19iYXNlICsgVUhDSFIpICYgflVIQ0hSX1NTRTsKKwlfX3Jhd193cml0ZWwodWhjaHIsIG9oY2ktPm1taW9fYmFzZSArIFVIQ0hSKTsKKwlfX3Jhd193cml0ZWwoVUhDSElFX1VQUklFIHwgVUhDSElFX1JXSUUsIG9oY2ktPm1taW9fYmFzZSArIFVIQ0hJRSk7CiAKIAkvKiBDbGVhciBhbnkgT1RHIFBpbiBIb2xkICovCi0JaWYgKGNwdV9pc19weGEyN3goKSAmJiAoUFNTUiAmIFBTU1JfT1RHUEgpKQotCQlQU1NSIHw9IFBTU1JfT1RHUEg7Ci0KKwlweGEyN3hfY2xlYXJfb3RncGgoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHhhMjd4X3N0b3BfaGMoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcHhhMjd4X3N0b3BfaGMoc3RydWN0IHB4YTI3eF9vaGNpICpvaGNpLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSAqaW5mOworCXVpbnQzMl90IHVoY2NvbXM7CiAKIAlpbmYgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAKIAlpZiAoaW5mLT5leGl0KQogCQlpbmYtPmV4aXQoZGV2KTsKIAotCVVIQ0hSIHw9IFVIQ0hSX0ZIUjsKLQl1ZGVsYXkoMTEpOwotCVVIQ0hSICY9IH5VSENIUl9GSFI7CisJcHhhMjd4X3Jlc2V0X2hjKG9oY2kpOwogCi0JVUhDQ09NUyB8PSAxOworCS8qIEhvc3QgQ29udHJvbGxlciBSZXNldCAqLworCXVoY2NvbXMgPSBfX3Jhd19yZWFkbChvaGNpLT5tbWlvX2Jhc2UgKyBVSENDT01TKSB8IDB4MDE7CisJX19yYXdfd3JpdGVsKHVoY2NvbXMsIG9oY2ktPm1taW9fYmFzZSArIFVIQ0NPTVMpOwogCXVkZWxheSgxMCk7CiAKLQljbGtfZGlzYWJsZSh1c2JfY2xrKTsKKwljbGtfZGlzYWJsZShvaGNpLT5jbGspOwogfQogCiAKQEAgLTE0NywxOCArMjc4LDIyIEBACiAgKi8KIGludCB1c2JfaGNkX3B4YTI3eF9wcm9iZSAoY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCByZXR2YWw7CisJaW50IHJldHZhbCwgaXJxOwogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSAqaW5mOworCXN0cnVjdCBweGEyN3hfb2hjaSAqb2hjaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJc3RydWN0IGNsayAqdXNiX2NsazsKIAogCWluZiA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJaWYgKCFpbmYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBkZXYtPnJlc291cmNlWzFdLmZsYWdzICE9IElPUkVTT1VSQ0VfSVJRKSB7Ci0JCXByX2RlYnVnICgicmVzb3VyY2VbMV0gaXMgbm90IElPUkVTT1VSQ0VfSVJRIik7Ci0JCXJldHVybiAtRU5PTUVNOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJcHJfZXJyKCJubyByZXNvdXJjZSBvZiBJT1JFU09VUkNFX0lSUSIpOworCQlyZXR1cm4gLUVOWElPOwogCX0KIAogCXVzYl9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJVU0JDTEsiKTsKQEAgLTE2OCw4ICszMDMsMTYgQEAKIAloY2QgPSB1c2JfY3JlYXRlX2hjZCAoZHJpdmVyLCAmcGRldi0+ZGV2LCAicHhhMjd4Iik7CiAJaWYgKCFoY2QpCiAJCXJldHVybiAtRU5PTUVNOwotCWhjZC0+cnNyY19zdGFydCA9IHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCWhjZC0+cnNyY19sZW4gPSBwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDE7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpIHsKKwkJcHJfZXJyKCJubyByZXNvdXJjZSBvZiBJT1JFU09VUkNFX01FTSIpOworCQlyZXR2YWwgPSAtRU5YSU87CisJCWdvdG8gZXJyMTsKKwl9CisKKwloY2QtPnJzcmNfc3RhcnQgPSByLT5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyKTsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbiwgaGNkX25hbWUpKSB7CiAJCXByX2RlYnVnKCJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkIik7CkBAIC0xODQsMjQgKzMyNywzMCBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JaWYgKChyZXR2YWwgPSBweGEyN3hfc3RhcnRfaGMoJnBkZXYtPmRldikpIDwgMCkgeworCS8qIGluaXRpYWxpemUgInN0cnVjdCBweGEyN3hfb2hjaSIgKi8KKwlvaGNpID0gKHN0cnVjdCBweGEyN3hfb2hjaSAqKWhjZF90b19vaGNpKGhjZCk7CisJb2hjaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlvaGNpLT5jbGsgPSB1c2JfY2xrOworCW9oY2ktPm1taW9fYmFzZSA9ICh2b2lkIF9faW9tZW0gKiloY2QtPnJlZ3M7CisKKwlpZiAoKHJldHZhbCA9IHB4YTI3eF9zdGFydF9oYyhvaGNpLCAmcGRldi0+ZGV2KSkgPCAwKSB7CiAJCXByX2RlYnVnKCJweGEyN3hfc3RhcnRfaGMgZmFpbGVkIik7CiAJCWdvdG8gZXJyMzsKIAl9CiAKIAkvKiBTZWxlY3QgUG93ZXIgTWFuYWdlbWVudCBNb2RlICovCi0JcHhhMjd4X29oY2lfc2VsZWN0X3BtbShpbmYtPnBvcnRfbW9kZSk7CisJcHhhMjd4X29oY2lfc2VsZWN0X3BtbShvaGNpLCBpbmYtPnBvcnRfbW9kZSk7CiAKIAlpZiAoaW5mLT5wb3dlcl9idWRnZXQpCiAJCWhjZC0+cG93ZXJfYnVkZ2V0ID0gaW5mLT5wb3dlcl9idWRnZXQ7CiAKIAlvaGNpX2hjZF9pbml0KGhjZF90b19vaGNpKGhjZCkpOwogCi0JcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCBwZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgSVJRRl9ESVNBQkxFRCk7CisJcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfRElTQUJMRUQpOwogCWlmIChyZXR2YWwgPT0gMCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXB4YTI3eF9zdG9wX2hjKCZwZGV2LT5kZXYpOworCXB4YTI3eF9zdG9wX2hjKG9oY2ksICZwZGV2LT5kZXYpOwogIGVycjM6CiAJaW91bm1hcChoY2QtPnJlZ3MpOwogIGVycjI6CkBAIC0yMjgsMTIgKzM3NywxNCBAQAogICovCiB2b2lkIHVzYl9oY2RfcHhhMjd4X3JlbW92ZSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcHhhMjd4X29oY2kgKm9oY2kgPSB0b19weGEyN3hfb2hjaShoY2QpOworCiAJdXNiX3JlbW92ZV9oY2QoaGNkKTsKLQlweGEyN3hfc3RvcF9oYygmcGRldi0+ZGV2KTsKKwlweGEyN3hfc3RvcF9oYyhvaGNpLCAmcGRldi0+ZGV2KTsKIAlpb3VubWFwKGhjZC0+cmVncyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAJdXNiX3B1dF9oY2QoaGNkKTsKLQljbGtfcHV0KHVzYl9jbGspOworCWNsa19wdXQob2hjaS0+Y2xrKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI2Niw3ICs0MTcsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgb2hjaV9weGEyN3hfaGNfZHJpdmVyID0gewogCS5kZXNjcmlwdGlvbiA9CQloY2RfbmFtZSwKIAkucHJvZHVjdF9kZXNjID0JCSJQWEEyN3ggT0hDSSIsCi0JLmhjZF9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IG9oY2lfaGNkKSwKKwkuaGNkX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgcHhhMjd4X29oY2kpLAogCiAJLyoKIAkgKiBnZW5lcmljIGhhcmR3YXJlIGxpbmthZ2UKQEAgLTMzMCwxMyArNDgxLDEzIEBACiBzdGF0aWMgaW50IG9oY2lfaGNkX3B4YTI3eF9kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBvaGNpX2hjZCAqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CisJc3RydWN0IHB4YTI3eF9vaGNpICpvaGNpID0gdG9fcHhhMjd4X29oY2koaGNkKTsKIAotCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgb2hjaS0+b2hjaS5uZXh0X3N0YXRlY2hhbmdlKSkKIAkJbXNsZWVwKDUpOwotCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOworCW9oY2ktPm9oY2kubmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKLQlweGEyN3hfc3RvcF9oYygmcGRldi0+ZGV2KTsKKwlweGEyN3hfc3RvcF9oYyhvaGNpLCAmcGRldi0+ZGV2KTsKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOwogCiAJcmV0dXJuIDA7CkBAIC0zNDUsMTQgKzQ5NiwxNCBAQAogc3RhdGljIGludCBvaGNpX2hjZF9weGEyN3hfZHJ2X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOworCXN0cnVjdCBweGEyN3hfb2hjaSAqb2hjaSA9IHRvX3B4YTI3eF9vaGNpKGhjZCk7CiAJaW50IHN0YXR1czsKIAotCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgb2hjaS0+b2hjaS5uZXh0X3N0YXRlY2hhbmdlKSkKIAkJbXNsZWVwKDUpOwotCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOworCW9oY2ktPm9oY2kubmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CiAKLQlpZiAoKHN0YXR1cyA9IHB4YTI3eF9zdGFydF9oYygmcGRldi0+ZGV2KSkgPCAwKQorCWlmICgoc3RhdHVzID0gcHhhMjd4X3N0YXJ0X2hjKG9oY2ksICZwZGV2LT5kZXYpKSA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAKIAlvaGNpX2ZpbmlzaF9jb250cm9sbGVyX3Jlc3VtZShoY2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCmluZGV4IDVkYTYzZjUuLjUxNjg0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKQEAgLTExMiw3ICsxMTIsOCBAQAogCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUocmVzb3VyY2VzKSwKIH07CiAKLXN0YXRpYyBpbnQgc2w4MTFfaGNfaW5pdChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGlvYWRkcl90IGJhc2VfYWRkciwgaW50IGlycSkKK3N0YXRpYyBpbnQgc2w4MTFfaGNfaW5pdChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHJlc291cmNlX3NpemVfdCBiYXNlX2FkZHIsCisJCQkgaW50IGlycSkKIHsKIAlpZiAocGxhdGZvcm1fZGV2LmRldi5wYXJlbnQpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0xNTUsOTcgKzE1Niw3MiBAQAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZwbGF0Zm9ybV9kZXYpOwogfQogCitzdGF0aWMgaW50IHNsODExX2NzX2NvbmZpZ19jaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZywKKwkJCQkgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqZGZsdCwKKwkJCQkgdW5zaWduZWQgaW50IHZjYywKKwkJCQkgdm9pZCAqcHJpdl9kYXRhKQoreworCWlmIChjZmctPmluZGV4ID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCWlmIChjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDAgIT0gdmNjKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIGlmIChkZmx0LT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJaWYgKGRmbHQtPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDAgIT0gdmNjKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9CisJCQljZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCWVsc2UgaWYgKGRmbHQtPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCXBfZGV2LT5jb25mLlZwcCA9CisJCQlkZmx0LT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKworCS8qIHdlIG5lZWQgYW4gaW50ZXJydXB0ICovCisJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQtPmlycS5JUlFJbmZvMSkKKwkJcF9kZXYtPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisKKwkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwlwX2Rldi0+aW8uTnVtUG9ydHMxID0gcF9kZXYtPmlvLk51bVBvcnRzMiA9IDA7CisJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC0+aW8ubndpbiA+IDApKSB7CisJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC0+aW87CisKKwkJcF9kZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCXBfZGV2LT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQlwX2Rldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQlwX2Rldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisKKwkJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKHBfZGV2LCAmcF9kZXYtPmlvKTsKKwl9CisJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBfZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCiBzdGF0aWMgaW50IHNsODExX2NzX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50ID0gJmhhbmRsZV90b19kZXYobGluayk7CiAJbG9jYWxfaW5mb190CQkqZGV2ID0gbGluay0+cHJpdjsKLQl0dXBsZV90CQkJdHVwbGU7Ci0JY2lzcGFyc2VfdAkJcGFyc2U7CiAJaW50CQkJbGFzdF9mbiwgbGFzdF9yZXQ7Ci0JdV9jaGFyCQkJYnVmWzY0XTsKLQljb25maWdfaW5mb190CQljb25mOwotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QJZGZsdCA9IHsgMCB9OwogCiAJREJHKDAsICJzbDgxMV9jc19jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0JLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KLQlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKLQkJCXBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7Ci0KLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdAkqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQotCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMAotCQkJCXx8IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkKLQkJCQkJCSE9IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0KLQkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKSB7Ci0JCQlkZmx0ID0gKmNmZzsKLQkJfQotCi0JCWlmIChjZmctPmluZGV4ID09IDApCi0JCQlnb3RvIG5leHRfZW50cnk7Ci0KLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0KLQkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCi0JCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkJCWlmIChjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDAKLQkJCQkJIT0gY29uZi5WY2MpCi0JCQkJZ290byBuZXh0X2VudHJ5OwotCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlpZiAoZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwCi0JCQkJCSE9IGNvbmYuVmNjKQotCQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJfQotCi0JCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCi0JCQlsaW5rLT5jb25mLlZwcCA9Ci0JCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKLQkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQotCQkJbGluay0+Y29uZi5WcHAgPQotCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0KLQkJLyogd2UgbmVlZCBhbiBpbnRlcnJ1cHQgKi8KLQkJaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKQotCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQotCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykgIT0gMCkKLQkJCQlnb3RvIG5leHRfZW50cnk7Ci0JCX0KLQkJYnJlYWs7Ci0KLW5leHRfZW50cnk6Ci0JCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKLQkJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUobGluaywgJnR1cGxlKTsKLQl9CisJaWYgKHBjbWNpYV9sb29wX2NvbmZpZyhsaW5rLCBzbDgxMV9jc19jb25maWdfY2hlY2ssIE5VTEwpKQorCQlnb3RvIGZhaWxlZDsKIAogCS8qIHJlcXVpcmUgYW4gSVJRIGFuZCB0d28gcmVnaXN0ZXJzICovCiAJaWYgKCFsaW5rLT5pby5OdW1Qb3J0czEgfHwgbGluay0+aW8uTnVtUG9ydHMxIDwgMikKLQkJZ290byBjc19mYWlsZWQ7CisJCWdvdG8gZmFpbGVkOwogCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCiAJCUNTX0NIRUNLKFJlcXVlc3RJUlEsCiAJCQlwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwogCWVsc2UKLQkJZ290byBjc19mYWlsZWQ7CisJCWdvdG8gZmFpbGVkOwogCiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sCiAJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKQEAgLTI2Niw4ICsyNDIsOSBAQAogCWlmIChzbDgxMV9oY19pbml0KHBhcmVudCwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpCiAJCQk8IDApIHsKIGNzX2ZhaWxlZDoKLQkJcHJpbnRrKCJzbDgxMV9jc19jb25maWcgZmFpbGVkXG4iKTsKIAkJY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbDgxMV9jc19jb25maWcgZmFpbGVkXG4iKTsKIAkJc2w4MTFfY3NfcmVsZWFzZShsaW5rKTsKIAkJcmV0dXJuICAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCmluZGV4IGRiNjQ1OTMuLjFmMGMyY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwpAQCAtMTIzLDE0ICsxMjMsMTAgQEAKIAogc3RhdGljIHZvaWQgdWhjaV9mcmVlX3RkKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgc3RydWN0IHVoY2lfdGQgKnRkKQogewotCWlmICghbGlzdF9lbXB0eSgmdGQtPmxpc3QpKSB7Ci0JCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAidGQgJXAgc3RpbGwgaW4gbGlzdCFcbiIsIHRkKTsKLQkJV0FSTl9PTigxKTsKLQl9Ci0JaWYgKCFsaXN0X2VtcHR5KCZ0ZC0+ZmxfbGlzdCkpIHsKLQkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJ0ZCAlcCBzdGlsbCBpbiBmbF9saXN0IVxuIiwgdGQpOwotCQlXQVJOX09OKDEpOwotCX0KKwlpZiAoIWxpc3RfZW1wdHkoJnRkLT5saXN0KSkKKwkJZGV2X1dBUk4odWhjaV9kZXYodWhjaSksICJ0ZCAlcCBzdGlsbCBpbiBsaXN0IVxuIiwgdGQpOworCWlmICghbGlzdF9lbXB0eSgmdGQtPmZsX2xpc3QpKQorCQlkZXZfV0FSTih1aGNpX2Rldih1aGNpKSwgInRkICVwIHN0aWxsIGluIGZsX2xpc3QhXG4iLCB0ZCk7CiAKIAlkbWFfcG9vbF9mcmVlKHVoY2ktPnRkX3Bvb2wsIHRkLCB0ZC0+ZG1hX2hhbmRsZSk7CiB9CkBAIC0yOTUsMTAgKzI5MSw4IEBACiBzdGF0aWMgdm9pZCB1aGNpX2ZyZWVfcWgoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBzdHJ1Y3QgdWhjaV9xaCAqcWgpCiB7CiAJV0FSTl9PTihxaC0+c3RhdGUgIT0gUUhfU1RBVEVfSURMRSAmJiBxaC0+dWRldik7Ci0JaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXVldWUpKSB7Ci0JCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAicWggJXAgbGlzdCBub3QgZW1wdHkhXG4iLCBxaCk7Ci0JCVdBUk5fT04oMSk7Ci0JfQorCWlmICghbGlzdF9lbXB0eSgmcWgtPnF1ZXVlKSkKKwkJZGV2X1dBUk4odWhjaV9kZXYodWhjaSksICJxaCAlcCBsaXN0IG5vdCBlbXB0eSFcbiIsIHFoKTsKIAogCWxpc3RfZGVsKCZxaC0+bm9kZSk7CiAJaWYgKHFoLT51ZGV2KSB7CkBAIC03NDYsMTEgKzc0MCw5IEBACiB7CiAJc3RydWN0IHVoY2lfdGQgKnRkLCAqdG1wOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZ1cmJwLT5ub2RlKSkgewotCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgInVyYiAlcCBzdGlsbCBvbiBRSCdzIGxpc3QhXG4iLAorCWlmICghbGlzdF9lbXB0eSgmdXJicC0+bm9kZSkpCisJCWRldl9XQVJOKHVoY2lfZGV2KHVoY2kpLCAidXJiICVwIHN0aWxsIG9uIFFIJ3MgbGlzdCFcbiIsCiAJCQkJdXJicC0+dXJiKTsKLQkJV0FSTl9PTigxKTsKLQl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGQsIHRtcCwgJnVyYnAtPnRkX2xpc3QsIGxpc3QpIHsKIAkJdWhjaV9yZW1vdmVfdGRfZnJvbV91cmJwKHRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKaW5kZXggNGNmYTI1Yi4uY2M4ZTBhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKQEAgLTU5NSw5ICs1OTUsOCBAQAogICAgICAgICB9IHdoaWxlKHZhbHVlKTsKICAgICAgICAga2l0LT5kZXZfbm8gPSBiaXQ7CiAKLQlraXQtPmRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShwaGlkZ2V0X2NsYXNzLCAma2l0LT51ZGV2LT5kZXYsCi0JCQkJCU1LREVWKDAsIDApLCBraXQsCi0JCQkJCSJpbnRlcmZhY2VraXQlZCIsIGtpdC0+ZGV2X25vKTsKKwlraXQtPmRldiA9IGRldmljZV9jcmVhdGUocGhpZGdldF9jbGFzcywgJmtpdC0+dWRldi0+ZGV2LCBNS0RFVigwLCAwKSwKKwkJCQkga2l0LCAiaW50ZXJmYWNla2l0JWQiLCBraXQtPmRldl9ubyk7CiAgICAgICAgIGlmIChJU19FUlIoa2l0LT5kZXYpKSB7CiAgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJSKGtpdC0+ZGV2KTsKICAgICAgICAgICAgICAgICBraXQtPmRldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRtb3RvcmNvbnRyb2wuYyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCmluZGV4IDliNDY5NmYuLjM4MDg4YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCkBAIC0zNjUsOSArMzY1LDggQEAKIAl9IHdoaWxlKHZhbHVlKTsKIAltYy0+ZGV2X25vID0gYml0OwogCi0JbWMtPmRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShwaGlkZ2V0X2NsYXNzLCAmbWMtPnVkZXYtPmRldiwKLQkJCQkJTUtERVYoMCwgMCksIG1jLAotCQkJCQkibW90b3Jjb250cm9sJWQiLCBtYy0+ZGV2X25vKTsKKwltYy0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShwaGlkZ2V0X2NsYXNzLCAmbWMtPnVkZXYtPmRldiwgTUtERVYoMCwgMCksIG1jLAorCQkJCSJtb3RvcmNvbnRyb2wlZCIsIG1jLT5kZXZfbm8pOwogCWlmIChJU19FUlIobWMtPmRldikpIHsKIAkJcmMgPSBQVFJfRVJSKG1jLT5kZXYpOwogCQltYy0+ZGV2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRzZXJ2by5jCmluZGV4IDFjYTdkZGIuLmJlZjZmZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0c2Vydm8uYwpAQCAtMjc1LDkgKzI3NSw4IEBACiAgICAgICAgIH0gd2hpbGUgKHZhbHVlKTsKIAlkZXYtPmRldl9ubyA9IGJpdDsKIAotCWRldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZV9kcnZkYXRhKHBoaWRnZXRfY2xhc3MsICZkZXYtPnVkZXYtPmRldiwKLQkJCQkJIE1LREVWKDAsIDApLCBkZXYsCi0JCQkJCSAic2Vydm8lZCIsIGRldi0+ZGV2X25vKTsKKwlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUocGhpZGdldF9jbGFzcywgJmRldi0+dWRldi0+ZGV2LCBNS0RFVigwLCAwKSwKKwkJCQkgZGV2LCAic2Vydm8lZCIsIGRldi0+ZGV2X25vKTsKIAlpZiAoSVNfRVJSKGRldi0+ZGV2KSkgewogCQlyYyA9IFBUUl9FUlIoZGV2LT5kZXYpOwogCQlkZXYtPmRldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCA2NTY2ZmMwLi5jOWRlM2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTExNjIsOSArMTE2Miw5IEBACiAJaWYgKG1pbm9yID49IE1PTl9CSU5fTUFYX01JTk9SKQogCQlyZXR1cm4gMDsKIAotCWRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShtb25fYmluX2NsYXNzLCB1YnVzPyB1YnVzLT5jb250cm9sbGVyOiBOVUxMLAotCQkJCSAgICBNS0RFVihNQUpPUihtb25fYmluX2RldjApLCBtaW5vciksIE5VTEwsCi0JCQkJICAgICJ1c2Jtb24lZCIsIG1pbm9yKTsKKwlkZXYgPSBkZXZpY2VfY3JlYXRlKG1vbl9iaW5fY2xhc3MsIHVidXMgPyB1YnVzLT5jb250cm9sbGVyIDogTlVMTCwKKwkJCSAgICBNS0RFVihNQUpPUihtb25fYmluX2RldjApLCBtaW5vciksIE5VTEwsCisJCQkgICAgInVzYm1vbiVkIiwgbWlub3IpOwogCWlmIChJU19FUlIoZGV2KSkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwppbmRleCBhMDAxNzQ4Li41OGIyYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyAoTSlIRFJDID0gKE11bHRpcG9pbnQpIEhpZ2hzcGVlZCBEdWFsLVJvbGUgQ29udHJvbGxlcgogY29uZmlnIFVTQl9NVVNCX0hEUkMKIAlkZXBlbmRzIG9uIChVU0IgfHwgVVNCX0dBREdFVCkgJiYgSEFWRV9DTEsKKwlkZXBlbmRzIG9uICFTVVBFUkgKIAlzZWxlY3QgVFdMNDAzMF9VU0IgaWYgTUFDSF9PTUFQXzM0MzBTRFAKIAl0cmlzdGF0ZSAnSW52ZW50cmEgSGlnaHNwZWVkIER1YWwgUm9sZSBDb250cm9sbGVyIChUSSwgLi4uKScKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCBjNWI4ZjAyLi4xMjhlOTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKQEAgLTEwMCw4ICsxMDAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpZmRlZglDT05GSUdfQVJNCi0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwppbmRleCAyOThiMjJlLi45ZDJkY2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCkBAIC0zNSw4ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tdXguaD4KIAogI2luY2x1ZGUgIm11c2JfY29yZS5oIgogI2luY2x1ZGUgIm9tYXAyNDMwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmggYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmgKaW5kZXggNzg2YTYyMC4uZGM3NjcwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5oCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuaApAQCAtMTEsOCArMTEsOCBAQAogI2RlZmluZSBfX01VU0JfT01BUDI0M1hfSF9fCiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNDMwKQotI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKIC8qCiAgKiBPTUFQMjQzMC1zcGVjaWZpYyBkZWZpbml0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCA3OWVhOThjLi45OWZiN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJICogNjQgYnl0ZXMsIHRvIGVuc3VyZSBJIGRvIG5vdCBnZXQgdGhyb3R0bGVkLgogCSAqIEFzayBVU0IgbWFpbGluZyBsaXN0IGZvciBiZXR0ZXIgYXByb2FjaC4KIAkgKi8KLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAogCWlmICghdHR5KSB7CiAJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOwpAQCAtMjgzLDEyICsyODMsMTMgQEAKIAljb3VudCA9IG1pbig2NCwgc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnJ4X2J1ZikpOwogCiAJaWYgKGNvdW50IDw9IDApCi0JCXJldHVybjsgLyogV2UgaGF2ZSBmaW5pc2hlZCBzZW5kaW5nIGV2ZXJ5dGhpbmcuICovCisJCWdvdG8gb3V0OyAvKiBXZSBoYXZlIGZpbmlzaGVkIHNlbmRpbmcgZXZlcnl0aGluZy4gKi8KIAogCXR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHR0eSwgJmRhdGEsIGNvdW50KTsKIAlpZiAoIWRhdGEpIHsKLQkJZXJyKCIlcy0ga3phbGxvYyglZCkgZmFpbGVkLiIsIF9fZnVuY19fLCBjb3VudCk7Ci0JCXJldHVybjsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMtIGt6YWxsb2MoJWQpIGZhaWxlZC4iLAorCQkJCQkJCV9fZnVuY19fLCBjb3VudCk7CisJCWdvdG8gb3V0OwogCX0KIAogCXNlcmlhbF9idWZfZ2V0KHByaXYtPnJ4X2J1ZiwgZGF0YSwgY291bnQpOwpAQCAtMjk3LDcgKzI5OCw4IEBACiAKIAlpZiAoc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnJ4X2J1ZikpCiAJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOwotCitvdXQ6CQkKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAlyZXR1cm47CiB9CiAvKiBFbmQgb2YgcHJpdmF0ZSBtZXRob2RzICovCkBAIC00OTUsNyArNDk3LDcgQEAKIAl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8PSAyKSB7CiAJCQkvKiBUaGlzIGlzIGFuIGluY29tcGxldGUgcGFja2FnZSAqLwpAQCAtNTI3LDYgKzUyOSw3IEBACiAJCX0KIAkJYWlyY2FibGVfcmVhZCgmcHJpdi0+cnhfd29yayk7CiAJfQorCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJLyogU2NoZWR1bGUgdGhlIG5leHQgcmVhZCBfaWZfIHdlIGFyZSBzdGlsbCBvcGVuICovCiAJaWYgKHBvcnQtPnBvcnQuY291bnQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYwppbmRleCAyZWJlMDZjLi4xOTEzYmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkgKiB0byBsb29rIGluIHRvIHRoaXMgYmVmb3JlIGNvbW1pdHRpbmcgYW55IGNvZGUuCiAJICovCiAJaWYgKHByaXYtPmxhc3RfbHNyICYgQkVMS0lOX1NBX0xTUl9FUlIpIHsKLQkJdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCQkvKiBPdmVycnVuIEVycm9yICovCiAJCWlmIChwcml2LT5sYXN0X2xzciAmIEJFTEtJTl9TQV9MU1JfT0UpIHsKIAkJfQpAQCAtMzM1LDYgKzMzNSw3IEBACiAJCS8qIEJyZWFrIEluZGljYXRvciAqLwogCQlpZiAocHJpdi0+bGFzdF9sc3IgJiBCRUxLSU5fU0FfTFNSX0JJKSB7CiAJCX0KKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKaW5kZXggN2I3NDIzOC4uNWIyMGRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAl9CiAKIAlwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwotCXBvcnQtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIAogCWluZm8tPnBvcnQgPSBwb3J0OwogCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCX0KIAkJCW1lbXNldCgmZHVtbXksIDAsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAkJCXR0eS0+dGVybWlvcyA9IHRlcm1pb3M7Ci0JCQlwb3J0LT5wb3J0LnR0eSA9IHR0eTsKKwkJCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIHR0eSk7CiAJCX0KIAogCQkvKiBvbmx5IGNhbGwgdGhlIGRldmljZSBzcGVjaWZpYyBvcGVuIGlmIHRoaXMKQEAgLTE2MSw5ICsxNjEsOSBAQAogCQlpZiAoc2VyaWFsLT50eXBlLT5zZXRfdGVybWlvcykgewogCQkJdGVybWlvcy0+Y19jZmxhZyA9IGNmbGFnOwogCQkJdHR5X3Rlcm1pb3NfZW5jb2RlX2JhdWRfcmF0ZSh0ZXJtaW9zLCBiYXVkLCBiYXVkKTsKLQkJCXNlcmlhbC0+dHlwZS0+c2V0X3Rlcm1pb3MoTlVMTCwgcG9ydCwgJmR1bW15KTsKKwkJCXNlcmlhbC0+dHlwZS0+c2V0X3Rlcm1pb3ModHR5LCBwb3J0LCAmZHVtbXkpOwogCi0JCQlwb3J0LT5wb3J0LnR0eSA9IE5VTEw7CisJCQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIAkJCWtmcmVlKHRlcm1pb3MpOwogCQkJa2ZyZWUodHR5KTsKIAkJfQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJcmV0dXJuIHJldHZhbDsKIGZyZWVfdGVybWlvczoKIAlrZnJlZSh0ZXJtaW9zKTsKLQlwb3J0LT5wb3J0LnR0eSA9IE5VTEw7CisJdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgTlVMTCk7CiBmcmVlX3R0eToKIAlrZnJlZSh0dHkpOwogcmVzZXRfb3Blbl9jb3VudDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYwppbmRleCA0NDJjYmE2Li4xMjc5NTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCkBAIC03Miw2ICs3Miw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MENBKSB9LCAvKiBEZWdyZWUgQ29udHJvbHMgSW5jICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MEREKSB9LCAvKiBUcmFjaWVudCBSRklEICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MEY2KSB9LCAvKiBTdXVudG8gc3BvcnRzIGluc3RydW1lbnQgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxMTUpIH0sIC8qIEFyeWdvbiBORkMvTWlmYXJlIFJlYWRlciAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODEzRCkgfSwgLyogQnVybnNpZGUgVGVsZWNvbSBEZXNrbW9iaWxlICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRBKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR2JsYXN0ZXIgUCZQICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTRCKSB9LCAvKiBXZXN0IE1vdW50YWluIFJhZGlvIFJJR3RhbGsgKi8KQEAgLTgzLDYgKzg0LDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxRTcpIH0sIC8qIEFlcm9jb21tIFJhZGlvICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MjE4KSB9LCAvKiBMaXBvd3NreSBJbmR1c3RyaWUgRWxla3Ryb25payBHbWJILCBIQVJQLTEgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMGM0LCAweDgyOTMpIH0sIC8qIFRlbGVnZXN5cyBFVFJYMlVTQiAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODM0MSkgfSwgLyogU2llbWVucyBNQzM1UFUgR1BSUyBNb2RlbSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MCkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MSkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RjAwMSkgfSwgLyogRWxhbiBEaWdpdGFsIFN5c3RlbXMgVVNCc2NvcGU1MCAqLwpAQCAtOTMsNiArOTUsNyBAQAogCXsgVVNCX0RFVklDRSgweDEzQUQsIDB4OTk5OSkgfSwgLyogQmFsdGVjaCBjYXJkIHJlYWRlciAqLwogCXsgVVNCX0RFVklDRSgweDE2NkEsIDB4MDMwMykgfSwgLyogQ2xpcHNhbCA1NTAwUENVIEMtQnVzIFVTQiBpbnRlcmZhY2UgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxNkQ2LCAweDAwMDEpIH0sIC8qIEphYmxvdHJvbiBzZXJpYWwgaW50ZXJmYWNlICovCisJeyBVU0JfREVWSUNFKDB4MThFRiwgMHhFMDBGKSB9LCAvKiBFTFYgVVNCLUkyQy1JbnRlcmZhY2UgKi8KIAl7IH0gLyogVGVybWluYXRpbmcgRW50cnkgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYwppbmRleCBiNGQ3MjM1Li45NGVmMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCkBAIC0zODQsNyArMzg0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXR0eSA9IHBvcnQtPnBvcnQudHR5OworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCWlmICghdHR5KSB7CiAJCWRiZygiJXMgLSBpZ25vcmluZyBzaW5jZSBkZXZpY2Ugbm90IG9wZW5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwpAQCAtMzk0LDYgKzM5NCw3IEBACiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IDIyODM3YTMuLmYzNTE0YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMTI4Niw3ICsxMjg2LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKCF0dHkpIHsKIAkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKQEAgLTEzNjIsNyArMTM2Miw3IEBACiAJCQkJCWRhdGFbaV0pOwogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7CiAJCX0KLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydC0+cG9ydC50dHkpOworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMzcxLDYgKzEzNzEsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogY29udGludWVfcmVhZDoKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZC4uLiB1bmxlc3MgdGhlIHBvcnQgaGFzIGNsb3NlZC4gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCmluZGV4IDI0MGFhZDEuLjU3NTZhYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKQEAgLTYwNCw3ICs2MDQsOSBAQAogCiBzdGF0aWMgdm9pZCBkaWdpX3dha2V1cF93cml0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCXR0eV93YWtldXAocG9ydC0+cG9ydC50dHkpOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwl0dHlfd2FrZXVwKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIApAQCAtMTY2OCw3ICsxNjcwLDcgQEAKIHsKIAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnBvcnQudHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgb3Bjb2RlID0gKCh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIpWzBdOwogCWludCBsZW4gPSAoKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlcilbMV07CkBAIC0xNjkyLDYgKzE2OTQsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJc3Bpbl9sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCiAJLyogY2hlY2sgZm9yIHRocm90dGxlOyBpZiBzZXQsIGRvIG5vdCByZXN1Ym1pdCByZWFkIHVyYiAqLwpAQCAtMTczNSw2ICsxNzM4LDcgQEAKIAkJfQogCX0KIAlzcGluX3VubG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCWlmIChvcGNvZGUgPT0gRElHSV9DTURfUkVDRUlWRV9ESVNBQkxFKQogCQlkYmcoIiVzOiBnb3QgUkVDRUlWRV9ESVNBQkxFIiwgX19mdW5jX18pOwpAQCAtMTc2MCw2ICsxNzY0LDcgQEAKIAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IG9wY29kZSwgbGluZSwgc3RhdHVzLCB2YWw7CiAJaW50IGk7CkBAIC0xNzg3LDEwICsxNzkyLDExIEBACiAJCWlmIChwcml2ID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJCXJ0cyA9IDA7CiAJCWlmIChwb3J0LT5wb3J0LmNvdW50KQotCQkJcnRzID0gcG9ydC0+cG9ydC50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTOwotCisJCQlydHMgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTOworCQkKIAkJaWYgKG9wY29kZSA9PSBESUdJX0NNRF9SRUFEX0lOUFVUX1NJR05BTFMpIHsKIAkJCXNwaW5fbG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAkJCS8qIGNvbnZlcnQgZnJvbSBkaWdpIGZsYWdzIHRvIHRlcm1pb3ggZmxhZ3MgKi8KQEAgLTE3OTgsMTQgKzE4MDQsMTQgQEAKIAkJCQlwcml2LT5kcF9tb2RlbV9zaWduYWxzIHw9IFRJT0NNX0NUUzsKIAkJCQkvKiBwb3J0IG11c3QgYmUgb3BlbiB0byB1c2UgdHR5IHN0cnVjdCAqLwogCQkJCWlmIChydHMpIHsKLQkJCQkJcG9ydC0+cG9ydC50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCQkJCQlkaWdpX3dha2V1cF93cml0ZShwb3J0KTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXByaXYtPmRwX21vZGVtX3NpZ25hbHMgJj0gflRJT0NNX0NUUzsKIAkJCQkvKiBwb3J0IG11c3QgYmUgb3BlbiB0byB1c2UgdHR5IHN0cnVjdCAqLwogCQkJCWlmIChydHMpCi0JCQkJCXBvcnQtPnBvcnQudHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQkJdHR5LT5od19zdG9wcGVkID0gMTsKIAkJCX0KIAkJCWlmICh2YWwgJiBESUdJX1JFQURfSU5QVVRfU0lHTkFMU19EU1IpCiAJCQkJcHJpdi0+ZHBfbW9kZW1fc2lnbmFscyB8PSBUSU9DTV9EU1I7CkBAIC0xODMwLDYgKzE4MzYsNyBAQAogCQl9IGVsc2UgaWYgKG9wY29kZSA9PSBESUdJX0NNRF9JRkxVU0hfRklGTykgewogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kcF9mbHVzaF93YWl0KTsKIAkJfQorCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggYTZhYjViNS4uMTA3MmU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTMzLDkgKzMzLDggQEAKICAqCU1vdmVkIE1PRF9ERUNfVVNFX0NPVU5UIHRvIGVuZCBvZiBlbXBlZ19jbG9zZSgpLgogICoKICAqICgxMi8wMy8yMDAwKSBnYgotICoJQWRkZWQgcG9ydC0+cG9ydC50dHktPmxkaXNjLnNldF90ZXJtaW9zKHBvcnQtPnBvcnQudHR5LCBOVUxMKSB0bwotICoJZW1wZWdfb3BlbigpLiBUaGlzIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgdGhlIHRlcm1pb3MgaGF2ZQotICoJY2hhbmdlZC4KKyAqCUFkZGVkIHR0eS0+bGRpc2Muc2V0X3Rlcm1pb3MocG9ydCwgdHR5LCBOVUxMKSB0byBlbXBlZ19vcGVuKCkuCisgKglUaGlzIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgdGhlIHRlcm1pb3MgaGF2ZSBjaGFuZ2VkLgogICoKICAqICgxMS8xMy8yMDAwKSBnYgogICoJTW92ZWQgdHR5LT5sb3dfbGF0ZW5jeSA9IDEgZnJvbSBlbXBlZ19yZWFkX2J1bGtfY2FsbGJhY2soKSB0bwpAQCAtMzU0LDcgKzM1Myw3IEBACiAKIAl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLAogCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAogCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOwpAQCAtMzYyLDYgKzM2MSw3IEBACiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCWJ5dGVzX2luICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAl9CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIAkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQgICovCiAJdXNiX2ZpbGxfYnVsa191cmIoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IDk4NGY2ZWYuLmMyYWMxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC02NTQsNiArNjU0LDkgQEAKIAkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX2p0YWdfcXVpcmsgfSwKIAl7IFVTQl9ERVZJQ0UoUkFUT0NfVkVORE9SX0lELCBSQVRPQ19QUk9EVUNUX0lEX1VTQjYwRikgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUkVVX1RJTllfUElEKSB9LAorCXsgVVNCX0RFVklDRShQQVBPVUNIX1ZJRCwgUEFQT1VDSF9RVUlETzR4NF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0RPTUlOVEVMTF9ER1FHX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfRE9NSU5URUxMX0RVU0JfUElEKSB9LAogCXsgfSwJCQkJCS8qIE9wdGlvbmFsIHBhcmFtZXRlciBlbnRyeSAqLwogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CkBAIC04NTcsNyArODYwLDcgQEAKIAogCWtmcmVlKGJ1Zik7CiAJaWYgKHJ2IDwgMCkgewotCQllcnIoIiVzIEVycm9yIGZyb20gTU9ERU1fQ1RSTCB1cmI6IERUUiAlcywgUlRTICVzIiwKKwkJZGJnKCIlcyBFcnJvciBmcm9tIE1PREVNX0NUUkwgdXJiOiBEVFIgJXMsIFJUUyAlcyIsCiAJCQkJX19mdW5jX18sCiAJCQkJKHNldCAmIFRJT0NNX0RUUikgPyAiSElHSCIgOgogCQkJCShjbGVhciAmIFRJT0NNX0RUUikgPyAiTE9XIiA6ICJ1bmNoYW5nZWQiLApAQCAtMTgwNSw3ICsxODA4LDcgQEAKIAlpZiAocG9ydC0+cG9ydC5jb3VudCA8PSAwKQogCQlyZXR1cm47CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAoIXR0eSkgewogCQlkYmcoIiVzIC0gYmFkIHR0eSBwb2ludGVyIC0gZXhpdGluZyIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwpAQCAtMTgxNCw3ICsxODE3LDcgQEAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewogCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWlmICh1cmIgIT0gcG9ydC0+cmVhZF91cmIpCkBAIC0xODI0LDcgKzE4MjcsNyBAQAogCQkvKiBUaGlzIHdpbGwgaGFwcGVuIGF0IGNsb3NlIGV2ZXJ5IHRpbWUgc28gaXQgaXMgYSBkYmcgbm90IGFuCiAJCSAgIGVyciAqLwogCQlkYmcoIih0aGlzIGlzIG9rIG9uIGNsb3NlKSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBjb3VudCBkYXRhIGJ5dGVzLCBidXQgbm90IHN0YXR1cyBieXRlcyAqLwpAQCAtMTgzNSw3ICsxODM4LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAKIAlmdGRpX3Byb2Nlc3NfcmVhZCgmcHJpdi0+cnhfd29yay53b3JrKTsKLQorb3V0OgorCXR0eV9rcmVmX3B1dCh0dHkpOwogfSAvKiBmdGRpX3JlYWRfYnVsa19jYWxsYmFjayAqLwogCiAKQEAgLTE4NjAsNyArMTg2NCw3IEBACiAJaWYgKHBvcnQtPnBvcnQuY291bnQgPD0gMCkKIAkJcmV0dXJuOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKCF0dHkpIHsKIAkJZGJnKCIlcyAtIGJhZCB0dHkgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKQEAgLTE4NjksMTMgKzE4NzMsMTMgQEAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWlmICghcHJpdikgewogCQlkYmcoIiVzIC0gYmFkIHBvcnQgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgLSBleGl0aW5nIiwgX19mdW5jX18pOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCXVyYiA9IHBvcnQtPnJlYWRfdXJiOwogCWlmICghdXJiKSB7CiAJCWRiZygiJXMgLSBiYWQgcmVhZF91cmIgcG9pbnRlciAtIGV4aXRpbmciLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwpAQCAtMjAxNyw3ICsyMDIxLDcgQEAKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yaywgMSk7CiAJCWVsc2UKIAkJCWRiZygiJXMgLSBwb3J0IGlzIGNsb3NlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiB1cmIgaXMgY29tcGxldGVseSBwcm9jZXNzZWQgKi8KQEAgLTIwMzgsNiArMjA0Miw4IEBACiAJCQllcnIoIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLAogCQkJCQkJCV9fZnVuY19fLCByZXN1bHQpOwogCX0KK291dDoKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0gLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KIAogCkBAIC0yMjUzLDcgKzIyNTksNyBAQAogCQkJICAgMCwgMCwKIAkJCSAgIGJ1ZiwgMSwgV0RSX1RJTUVPVVQpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZXJyKCIlcyBDb3VsZCBub3QgZ2V0IG1vZGVtIHN0YXR1cyBvZiBkZXZpY2UgLSBlcnI6ICVkIiwgX19mdW5jX18sCisJCQlkYmcoIiVzIENvdWxkIG5vdCBnZXQgbW9kZW0gc3RhdHVzIG9mIGRldmljZSAtIGVycjogJWQiLCBfX2Z1bmNfXywKIAkJCSAgICByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMjI3Miw3ICsyMjc4LDcgQEAKIAkJCQkgICAwLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkJICAgYnVmLCAyLCBXRFJfVElNRU9VVCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQllcnIoIiVzIENvdWxkIG5vdCBnZXQgbW9kZW0gc3RhdHVzIG9mIGRldmljZSAtIGVycjogJWQiLCBfX2Z1bmNfXywKKwkJCWRiZygiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fZnVuY19fLAogCQkJICAgIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCmluZGV4IDM4MjI2NWIuLjhhNWI2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oCkBAIC03NTAsNiArNzUwLDcgQEAKIAogI2RlZmluZSBQQVBPVUNIX1ZJRAkJCTB4NTA1MAkvKiBWZW5kb3IgSUQgKi8KICNkZWZpbmUgUEFQT1VDSF9UTVVfUElECQkJMHgwNDAwCS8qIFRNVSBVU0IgVGhlcm1vbWV0ZXIgKi8KKyNkZWZpbmUgUEFQT1VDSF9RVUlETzR4NF9QSUQJCTB4MDkwMAkvKiBRdWlkbyA0LzQgTW9kdWxlICovCiAKIC8qCiAgKiBBQ0cgSWRlbnRpZmljYXRpb24gVGVjaG5vbG9naWVzIEdtYkggcHJvZHVjdHMgKGh0dHA6Ly93d3cuYWNnLmRlLykuCkBAIC04MzgsNiArODM5LDEwIEBACiAvKiBSaWcgRXhwZXJ0IFVrcmFpbmUgZGV2aWNlcyAqLwogI2RlZmluZSBGVERJX1JFVV9USU5ZX1BJRAkJMHhFRDIyCS8qIFJpZ0V4cGVydCBUaW55ICovCiAKKy8qIERvbWludGVsbCBwcm9kdWN0cyAgaHR0cDovL3d3dy5kb21pbnRlbGwuY29tICovCisjZGVmaW5lIEZURElfRE9NSU5URUxMX0RHUUdfUElECTB4RUY1MAkvKiBNYXN0ZXIgKi8KKyNkZWZpbmUgRlRESV9ET01JTlRFTExfRFVTQl9QSUQJMHhFRjUxCS8qIERVU0IwMSBtb2R1bGUgKi8KKwogLyogQ29tbWFuZHMgKi8KICNkZWZpbmUgRlRESV9TSU9fUkVTRVQgCQkwIC8qIFJlc2V0IHRoZSBwb3J0ICovCiAjZGVmaW5lIEZURElfU0lPX01PREVNX0NUUkwgCTEgLyogU2V0IHRoZSBtb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwppbmRleCBkOTUzODIwLi4yYWQwNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogc3RhdGljIHZvaWQgc2VuZF90b190dHkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCWNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBhY3R1YWxfbGVuZ3RoKQogewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAKIAlpZiAodHR5ICYmIGFjdHVhbF9sZW5ndGgpIHsKIApAQCAtMjg3LDYgKzI4Nyw3IEBACiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBhY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKaW5kZXggZmU4NGM4OC4uODE0OTA5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIHN0YXRpYyB2b2lkIGZsdXNoX2FuZF9yZXN1Ym1pdF9yZWFkX3VyYihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1cmIgKnVyYiA9IHBvcnQtPnJlYWRfdXJiOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaW50IHJvb207CiAKIAkvKiBQdXNoIGRhdGEgdG8gdHR5ICovCkBAIC0zNDEsNiArMzQxLDcgQEAKIAkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJCX0KIAl9CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIAlyZXN1Ym1pdF9yZWFkX3VyYihwb3J0LCBHRlBfQVRPTUlDKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggYmZhNTA4ZC4uNjExZjk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTYwMCw2ICs2MDAsNyBAQAogCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwJKmVkZ2Vfc2VyaWFsID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpbnQgbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCWludCBieXRlc19hdmFpbDsKQEAgLTY3NSw5ICs2NzYsMTIgQEAKIAogCQkJCQkvKiB0ZWxsIHRoZSB0dHkgZHJpdmVyIHRoYXQgc29tZXRoaW5nCiAJCQkJCSAgIGhhcyBjaGFuZ2VkICovCi0JCQkJCWlmIChlZGdlX3BvcnQtPnBvcnQtPnBvcnQudHR5KQotCQkJCQkJdHR5X3dha2V1cChlZGdlX3BvcnQtPnBvcnQtPnBvcnQudHR5KTsKLQorCQkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KAorCQkJCQkJJmVkZ2VfcG9ydC0+cG9ydC0+cG9ydCk7CisJCQkJCWlmICh0dHkpIHsKKwkJCQkJCXR0eV93YWtldXAodHR5KTsKKwkJCQkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQkJCQl9CiAJCQkJCS8qIFNpbmNlIHdlIGhhdmUgbW9yZSBjcmVkaXQsIGNoZWNrCiAJCQkJCSAgIGlmIG1vcmUgZGF0YSBjYW4gYmUgc2VudCAqLwogCQkJCQlzZW5kX21vcmVfcG9ydF9kYXRhKGVkZ2Vfc2VyaWFsLApAQCAtNzc4LDEzICs3ODIsMTQgQEAKIAkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCX0KIAotCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmZWRnZV9wb3J0LT5wb3J0LT5wb3J0KTsKIAogCWlmICh0dHkgJiYgZWRnZV9wb3J0LT5vcGVuKSB7CiAJCS8qIGxldCB0aGUgdHR5IGRyaXZlciB3YWtldXAgaWYgaXQgaGFzIGEgc3BlY2lhbAogCQkgICB3cml0ZV93YWtldXAgZnVuY3Rpb24gKi8KIAkJdHR5X3dha2V1cCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIFJlbGVhc2UgdGhlIFdyaXRlIFVSQiAqLwogCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTgyNiwxMSArODMxLDEyIEBACiAJfQogCiAJLyogR2V0IHBvaW50ZXIgdG8gdHR5ICovCi0JdHR5ID0gZWRnZV9wb3J0LT5wb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZlZGdlX3BvcnQtPnBvcnQtPnBvcnQpOwogCiAJLyogdGVsbCB0aGUgdHR5IGRyaXZlciB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLwogCWlmICh0dHkgJiYgZWRnZV9wb3J0LT5vcGVuKQogCQl0dHlfd2FrZXVwKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIAkvKiB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgY29tbWFuZCAqLwogCWVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcgPSBmYWxzZTsKQEAgLTE5MzIsMTEgKzE5MzgsMTMgQEAKIAkJCQkJCQllZGdlX3NlcmlhbC0+cnhQb3J0XTsKIAkJCQllZGdlX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJCQkJaWYgKGVkZ2VfcG9ydC0+b3BlbikgewotCQkJCQl0dHkgPSBlZGdlX3BvcnQtPnBvcnQtPnBvcnQudHR5OworCQkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KAorCQkJCQkJJmVkZ2VfcG9ydC0+cG9ydC0+cG9ydCk7CiAJCQkJCWlmICh0dHkpIHsKIAkJCQkJCWRiZygiJXMgLSBTZW5kaW5nICVkIGJ5dGVzIHRvIFRUWSBmb3IgcG9ydCAlZCIsCiAJCQkJCQkJX19mdW5jX18sIHJ4TGVuLCBlZGdlX3NlcmlhbC0+cnhQb3J0KTsKIAkJCQkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldi0+ZGV2LCB0dHksIGJ1ZmZlciwgcnhMZW4pOworCQkJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCQkJCX0KIAkJCQkJZWRnZV9wb3J0LT5pY291bnQucnggKz0gcnhMZW47CiAJCQkJfQpAQCAtMTk3MSw2ICsxOTc5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlfX3U4IGNvZGUgPSBlZGdlX3NlcmlhbC0+cnhTdGF0dXNDb2RlOwogCiAJLyogc3dpdGNoIHRoZSBwb3J0IHBvaW50ZXIgdG8gdGhlIG9uZSBiZWluZyBjdXJyZW50bHkgdGFsa2VkIGFib3V0ICovCkBAIC0yMDIwLDEwICsyMDI5LDEyIEBACiAKIAkJLyogc2VuZCB0aGUgY3VycmVudCBsaW5lIHNldHRpbmdzIHRvIHRoZSBwb3J0IHNvIHdlIGFyZQogCQkgICBpbiBzeW5jIHdpdGggYW55IGZ1cnRoZXIgdGVybWlvcyBjYWxscyAqLwotCQkvKiBGSVhNRTogbG9ja2luZyBvbiB0dHkgKi8KLQkJaWYgKGVkZ2VfcG9ydC0+cG9ydC0+cG9ydC50dHkpCi0JCQljaGFuZ2VfcG9ydF9zZXR0aW5ncyhlZGdlX3BvcnQtPnBvcnQtPnBvcnQudHR5LAotCQkJCWVkZ2VfcG9ydCwgZWRnZV9wb3J0LT5wb3J0LT5wb3J0LnR0eS0+dGVybWlvcyk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmVkZ2VfcG9ydC0+cG9ydC0+cG9ydCk7CisJCWlmICh0dHkpIHsKKwkJCWNoYW5nZV9wb3J0X3NldHRpbmdzKHR0eSwKKwkJCQllZGdlX3BvcnQsIHR0eS0+dGVybWlvcyk7CisJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJfQogCiAJCS8qIHdlIGhhdmUgY29tcGxldGVkIHRoZSBvcGVuICovCiAJCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBmYWxzZTsKQEAgLTIxNjMsMTAgKzIxNzQsMTQgQEAKIAl9CiAKIAkvKiBQbGFjZSBMU1IgZGF0YSBieXRlIGludG8gUnggYnVmZmVyICovCi0JaWYgKGxzckRhdGEgJiYgZWRnZV9wb3J0LT5wb3J0LT5wb3J0LnR0eSkKLQkJZWRnZV90dHlfcmVjdigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsCi0JCQkJCWVkZ2VfcG9ydC0+cG9ydC0+cG9ydC50dHksICZkYXRhLCAxKTsKLQorCWlmIChsc3JEYXRhKSB7CisJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPQorCQkJCXR0eV9wb3J0X3R0eV9nZXQoJmVkZ2VfcG9ydC0+cG9ydC0+cG9ydCk7CisJCWlmICh0dHkpIHsKKwkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCB0dHksICZkYXRhLCAxKTsKKwkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQl9CisJfQogCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCiAJaWNvdW50ID0gJmVkZ2VfcG9ydC0+aWNvdW50OwogCWlmIChuZXdMc3IgJiBMU1JfQlJFQUspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCmluZGV4IGNiNGM1NDMuLjU0MWRkOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAkJCQkJCQkJaW50IGZsdXNoKQogewogCWludCBiYXVkX3JhdGU7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnBvcnQtPnBvcnQudHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0LT5wb3J0KTsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC01OTksNiArNTk5LDcgQEAKIAlpZiAoZmx1c2gpCiAJCWVkZ2VfYnVmX2NsZWFyKHBvcnQtPmVwX291dF9idWYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmVwX2xvY2ssIGZsYWdzKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gZnJvbSB0aGUgZGV2aWNlICovCiAJdGltZW91dCArPSBqaWZmaWVzOwpAQCAtMTU1NCw3ICsxNTU1LDcgQEAKIAkvKiBTYXZlIHRoZSBuZXcgbW9kZW0gc3RhdHVzICovCiAJZWRnZV9wb3J0LT5zaGFkb3dfbXNyID0gbXNyICYgMHhmMDsKIAotCXR0eSA9IGVkZ2VfcG9ydC0+cG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmZWRnZV9wb3J0LT5wb3J0LT5wb3J0KTsKIAkvKiBoYW5kbGUgQ1RTIGZsb3cgY29udHJvbCAqLwogCWlmICh0dHkgJiYgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJaWYgKG1zciAmIEVER0VQT1JUX01TUl9DVFMpIHsKQEAgLTE1NjQsNiArMTU2NSw3IEBACiAJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwogCQl9CiAJfQorCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJcmV0dXJuOwogfQpAQCAtMTU3NCw2ICsxNTc2LDcgQEAKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50ICppY291bnQ7CiAJX191OCBuZXdfbHNyID0gKF9fdTgpKGxzciAmIChfX3U4KShMU1JfT1ZFUl9FUlIgfCBMU1JfUEFSX0VSUiB8CiAJCQkJCQlMU1JfRlJNX0VSUiB8IExTUl9CUkVBSykpOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlkYmcoIiVzIC0gJTAyeCIsIF9fZnVuY19fLCBuZXdfbHNyKTsKIApAQCAtMTU4Nyw4ICsxNTkwLDEzIEBACiAJCW5ld19sc3IgJj0gKF9fdTgpKExTUl9PVkVSX0VSUiB8IExTUl9CUkVBSyk7CiAKIAkvKiBQbGFjZSBMU1IgZGF0YSBieXRlIGludG8gUnggYnVmZmVyICovCi0JaWYgKGxzcl9kYXRhICYmIGVkZ2VfcG9ydC0+cG9ydC0+cG9ydC50dHkpCi0JCWVkZ2VfdHR5X3JlY3YoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCBlZGdlX3BvcnQtPnBvcnQtPnBvcnQudHR5LCAmZGF0YSwgMSk7CisJaWYgKGxzcl9kYXRhKSB7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmVkZ2VfcG9ydC0+cG9ydC0+cG9ydCk7CisJCWlmICh0dHkpIHsKKwkJCWVkZ2VfdHR5X3JlY3YoJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LCB0dHksICZkYXRhLCAxKTsKKwkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQl9CisJfQogCiAJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KIAlpY291bnQgPSAmZWRnZV9wb3J0LT5pY291bnQ7CkBAIC0xNzQ5LDcgKzE3NTcsNyBAQAogCQkrK2RhdGE7CiAJfQogCi0JdHR5ID0gZWRnZV9wb3J0LT5wb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZlZGdlX3BvcnQtPnBvcnQtPnBvcnQpOwogCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJmVkZ2VfcG9ydC0+cG9ydC0+ZGV2LAogCQkJCQlfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKQEAgLTE3NjEsNiArMTc2OSw3IEBACiAJCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJZWRnZV9wb3J0LT5pY291bnQucnggKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogZXhpdDoKIAkvKiBjb250aW51ZSByZWFkIHVubGVzcyBzdG9wcGVkICovCkBAIC0xNzk2LDYgKzE4MDUsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTE4MTgsNyArMTgyOCw5IEBACiAJfQogCiAJLyogc2VuZCBhbnkgYnVmZmVyZWQgZGF0YSAqLwotCWVkZ2Vfc2VuZChwb3J0LT5wb3J0LnR0eSk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJZWRnZV9zZW5kKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIHN0YXRpYyBpbnQgZWRnZV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCkBAIC0xODc2LDcgKzE4ODgsNyBAQAogCiAJLyogc2V0IHVwIHRoZSBwb3J0IHNldHRpbmdzICovCiAJaWYgKHR0eSkKLQkJZWRnZV9zZXRfdGVybWlvcyh0dHksIHBvcnQsIHBvcnQtPnBvcnQudHR5LT50ZXJtaW9zKTsKKwkJZWRnZV9zZXRfdGVybWlvcyh0dHksIHBvcnQsIHR0eS0+dGVybWlvcyk7CiAKIAkvKiBvcGVuIHVwIHRoZSBwb3J0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCmluZGV4IGNkOWEyZTEzLi4yYWZmYTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTc2NCwxMyArNzY0LDE0IEBACiAJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQlieXRlc19pbiArPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJfQorCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkICAqLwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwppbmRleCBhODQyMDI1Li40ODBjYWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCkBAIC0xNzAsMTIgKzE3MCwxMyBAQAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCAgKi8KIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgcG9ydC0+c2VyaWFsLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKaW5kZXggZTU5MTU1Yy4uNDVkNDA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwpAQCAtNDY1LDExICs0NjUsMTIgQEAKIAkJCWlyX2JhdWQgPSAqZGF0YSAmIDB4MGY7CiAJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwotIAkJdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCQlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGggLSAxKSkgewogCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGErMSwgdXJiLT5hY3R1YWxfbGVuZ3RoIC0gMSk7CiAJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQl9CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJCS8qCiAJCSAqIE5vIGJyZWFrIGhlcmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jCmluZGV4IGRkZmYzN2YuLjUzNzEwYWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYwpAQCAtNjI5LDEzICs2MjksMTQgQEAKIAl9CiAKIAlkYmcoIiVzIC0gJWkgY2hhcnMgdG8gd3JpdGUiLCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlkYmcoIiVzIC0gZGF0YSBpcyBOVUxMICEhISIsIF9fZnVuY19fKTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCAmJiBkYXRhKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAlpdXVfbGVkX2FjdGl2aXR5X29uKHVyYik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCmluZGV4IDcwNDcxNmYuLjE1NDQ3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJfQogCiAJcG9ydCA9ICB1cmItPmNvbnRleHQ7Ci0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJLyogMHg4MCBiaXQgaXMgZXJyb3IgZmxhZyAqLwogCQlpZiAoKGRhdGFbMF0gJiAweDgwKSA9PSAwKSB7CkBAIC00NTksNiArNDU5LDcgQEAKIAkJfQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwpAQCAtNTEzLDYgKzUxNCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWwJCQkqc2VyaWFsOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJCQkqcG9ydDsKIAlzdHJ1Y3Qga2V5c3Bhbl9wb3J0X3ByaXZhdGUJIAkqcF9wcml2OworCXN0cnVjdCB0dHlfc3RydWN0CQkJKnR0eTsKIAlpbnQgb2xkX2RjZF9zdGF0ZSwgZXJyOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIApAQCAtNTUzLDEyICs1NTUsMTEgQEAKIAlwX3ByaXYtPmRjZF9zdGF0ZSA9ICgobXNnLT5ncGlhX2RjZCkgPyAxIDogMCk7CiAJcF9wcml2LT5yaV9zdGF0ZSA9ICgobXNnLT5yaSkgPyAxIDogMCk7CiAKLQlpZiAocG9ydC0+cG9ydC50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnBvcnQudHR5KQotCSAgICAmJiBvbGRfZGNkX3N0YXRlICE9IHBfcHJpdi0+ZGNkX3N0YXRlKSB7Ci0JCWlmIChvbGRfZGNkX3N0YXRlKQotCQkJdHR5X2hhbmd1cChwb3J0LT5wb3J0LnR0eSk7Ci0JCS8qICBlbHNlICovCi0JCS8qCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcF9wcml2LT5vcGVuX3dhaXQpOyAqLworCWlmIChvbGRfZGNkX3N0YXRlICE9IHBfcHJpdi0+ZGNkX3N0YXRlKSB7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5ICYmICFDX0NMT0NBTCh0dHkpKQorCQkJdHR5X2hhbmd1cCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CiAKIAkvKiBSZXN1Ym1pdCB1cmIgc28gd2UgY29udGludWUgcmVjZWl2aW5nICovCkBAIC02MDQsMTEgKzYwNSwxMiBAQAogCQlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAotCQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKLQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQl0dHkgPXR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQl9CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKQEAgLTY1Miw2ICs2NTQsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsCQkJKnNlcmlhbDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CQkJKnBvcnQ7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlCSAJKnBfcHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdAkJCSp0dHk7CiAJaW50IG9sZF9kY2Rfc3RhdGU7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCkBAIC02ODksMTIgKzY5MiwxMSBAQAogCXBfcHJpdi0+ZGNkX3N0YXRlID0gKChtc2ctPmRjZCkgPyAxIDogMCk7CiAJcF9wcml2LT5yaV9zdGF0ZSA9ICgobXNnLT5yaSkgPyAxIDogMCk7CiAKLQlpZiAocG9ydC0+cG9ydC50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnBvcnQudHR5KQotCSAgICAmJiBvbGRfZGNkX3N0YXRlICE9IHBfcHJpdi0+ZGNkX3N0YXRlKSB7Ci0JCWlmIChvbGRfZGNkX3N0YXRlKQotCQkJdHR5X2hhbmd1cChwb3J0LT5wb3J0LnR0eSk7Ci0JCS8qICBlbHNlICovCi0JCS8qCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcF9wcml2LT5vcGVuX3dhaXQpOyAqLworCWlmKCBvbGRfZGNkX3N0YXRlICE9IHBfcHJpdi0+ZGNkX3N0YXRlICYmIG9sZF9kY2Rfc3RhdGUpIHsKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCWlmICh0dHkgJiYgIUNfQ0xPQ0FMKHR0eSkpIAorCQkJdHR5X2hhbmd1cCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CiAKIAkJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtNzg1LDEyICs3ODcsMTEgQEAKIAlwX3ByaXYtPmRjZF9zdGF0ZSA9ICgobXNnLT5kY2QpID8gMSA6IDApOwogCXBfcHJpdi0+cmlfc3RhdGUgPSAoKG1zZy0+cmkpID8gMSA6IDApOwogCi0JaWYgKHBvcnQtPnBvcnQudHR5ICYmICFDX0NMT0NBTChwb3J0LT5wb3J0LnR0eSkKLQkgICAgJiYgb2xkX2RjZF9zdGF0ZSAhPSBwX3ByaXYtPmRjZF9zdGF0ZSkgewotCQlpZiAob2xkX2RjZF9zdGF0ZSkKLQkJCXR0eV9oYW5ndXAocG9ydC0+cG9ydC50dHkpOwotCQkvKiAgZWxzZSAqLwotCQkvKgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBfcHJpdi0+b3Blbl93YWl0KTsgKi8KKwlpZiAob2xkX2RjZF9zdGF0ZSAhPSBwX3ByaXYtPmRjZF9zdGF0ZSAmJiBvbGRfZGNkX3N0YXRlKSB7CisJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSAmJiAhQ19DTE9DQUwodHR5KSkKKwkJCXR0eV9oYW5ndXAodHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtODI3LDcgKzgyOCw3IEBACiAJfQogCiAJcG9ydCA9ICB1cmItPmNvbnRleHQ7Ci0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJLyogMHg4MCBiaXQgaXMgZXJyb3IgZmxhZyAqLwogCQlpZiAoKGRhdGFbMF0gJiAweDgwKSA9PSAwKSB7CkBAIC04NTAsNiArODUxLDcgQEAKIAkJfQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KIAl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwpAQCAtODkzLDcgKzg5NSw3IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCQkJcG9ydCA9IHNlcmlhbC0+cG9ydFtkYXRhW2krK11dOwotCQkJdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAkJCWxlbiA9IGRhdGFbaSsrXTsKIAogCQkJLyogMHg4MCBiaXQgaXMgZXJyb3IgZmxhZyAqLwpAQCAtOTI3LDYgKzkyOSw3IEBACiAJCQl9CiAJCQlpZiAocG9ydC0+cG9ydC5jb3VudCkKIAkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCX0KIAl9CiAKQEAgLTk2Nyw4ICs5NzAsOCBAQAogCXBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXBfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCXR0eSA9IHBvcnQtPnBvcnQudHR5OwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJCS8qIGlmIGN1cnJlbnQgbW9kZSBpcyBETUEsIGxvb2tzIGxpa2UgdXNhMjggZm9ybWF0CiAJCSAgIG90aGVyd2lzZSBsb29rcyBsaWtlIHVzYTI2IGRhdGEgZm9ybWF0ICovCiAKQEAgLTEwMDQsNiArMTAwNyw3IEBACiAJCQl9CiAJCX0KIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtMTAyNSw2ICsxMDI5LDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbAkJCSpzZXJpYWw7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkJCSpwb3J0OwogCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZQkgCSpwX3ByaXY7CisJc3RydWN0IHR0eV9zdHJ1Y3QJCQkqdHR5OwogCWludCBvbGRfZGNkX3N0YXRlLCBlcnI7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCkBAIC0xMDUzLDEyICsxMDU4LDExIEBACiAJcF9wcml2LT5kY2Rfc3RhdGUgPSAoKG1zZy0+ZGNkKSA/IDEgOiAwKTsKIAlwX3ByaXYtPnJpX3N0YXRlID0gKChtc2ctPnJpKSA/IDEgOiAwKTsKIAotCWlmIChwb3J0LT5wb3J0LnR0eSAmJiAhQ19DTE9DQUwocG9ydC0+cG9ydC50dHkpCi0JICAgICYmIG9sZF9kY2Rfc3RhdGUgIT0gcF9wcml2LT5kY2Rfc3RhdGUpIHsKLQkJaWYgKG9sZF9kY2Rfc3RhdGUpCi0JCQl0dHlfaGFuZ3VwKHBvcnQtPnBvcnQudHR5KTsKLQkJLyogIGVsc2UgKi8KLQkJLyoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwX3ByaXYtPm9wZW5fd2FpdCk7ICovCisJaWYgKG9sZF9kY2Rfc3RhdGUgIT0gcF9wcml2LT5kY2Rfc3RhdGUgJiYgb2xkX2RjZF9zdGF0ZSkgeworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSAmJiAhQ19DTE9DQUwodHR5KSkKKwkJCXR0eV9oYW5ndXAodHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtMTEzMCwxMiArMTEzNCwxMSBAQAogCXBfcHJpdi0+Y3RzX3N0YXRlID0gKChtc2ctPmhza2lhX2N0cykgPyAxIDogMCk7CiAJcF9wcml2LT5kY2Rfc3RhdGUgPSAoKG1zZy0+Z3BpYV9kY2QpID8gMSA6IDApOwogCi0JaWYgKHBvcnQtPnBvcnQudHR5ICYmICFDX0NMT0NBTChwb3J0LT5wb3J0LnR0eSkKLQkgICAgJiYgb2xkX2RjZF9zdGF0ZSAhPSBwX3ByaXYtPmRjZF9zdGF0ZSkgewotCQlpZiAob2xkX2RjZF9zdGF0ZSkKLQkJCXR0eV9oYW5ndXAocG9ydC0+cG9ydC50dHkpOwotCQkvKiAgZWxzZSAqLwotCQkvKgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBfcHJpdi0+b3Blbl93YWl0KTsgKi8KKwlpZiAob2xkX2RjZF9zdGF0ZSAhPSBwX3ByaXYtPmRjZF9zdGF0ZSAmJiBvbGRfZGNkX3N0YXRlKSB7CisJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSAmJiAhQ19DTE9DQUwodHR5KSkKKwkJCXR0eV9oYW5ndXAodHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogCiAJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwpAQCAtMTMzMiw3ICsxMzM1LDcgQEAKIAkJCXN0b3BfdXJiKHBfcHJpdi0+b3V0X3VyYnNbaV0pOwogCQl9CiAJfQotCXBvcnQtPnBvcnQudHR5ID0gTlVMTDsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIH0KIAogLyogZG93bmxvYWQgdGhlIGZpcm13YXJlIHRvIGEgcHJlLXJlbnVtZXJhdGlvbiBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggMDQwMDQwYS4uOTllOWExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTE3Miw4ICsxNzIsOSBAQAogCXN0cnVjdCBrZXlzcGFuX3BkYV9wcml2YXRlICpwcml2ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBrZXlzcGFuX3BkYV9wcml2YXRlLCB3YWtldXBfd29yayk7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHByaXYtPnBvcnQ7Ci0KLQl0dHlfd2FrZXVwKHBvcnQtPnBvcnQudHR5KTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJdHR5X3dha2V1cCh0dHkpOworCXR0eV9rcmVmX3B1dCh0dHkpOwogfQogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9yZXF1ZXN0X3VudGhyb3R0bGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMjA1LDcgKzIwNiw3IEBACiBzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9yeF9pbnRlcnJ1cHQoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnBvcnQudHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJaW50IHJldHZhbDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CkBAIC0yMjIsNyArMjIzLDcgQEAKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KIAkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCiAJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCiAJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKQEAgLTI2MSw4ICsyNjIsMTEgQEAKIGV4aXQ6CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQotCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworb3V0OgorCXR0eV9rcmVmX3B1dCh0dHkpOwkJICAgICAKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBiODRkZGRjLi5mZjNhMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTY1OCw3ICs2NTgsNyBAQAogCX0gZWxzZSB7CiAJCWludCBieXRlc19zZW50ID0gKChfX3U4ICopIGRhdGEpWzBdICsKIAkJCQkgKCh1bnNpZ25lZCBpbnQpICgoX191OCAqKSBkYXRhKVsxXSA8PCA4KTsKLQkJdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCQkvKiB3ZSBzaG91bGQgaW1tZWRpYXRlbHkgcmVzdWJtaXQgdGhlIFVSQiwgYmVmb3JlIGF0dGVtcHRpbmcKIAkJICogdG8gcGFzcyB0aGUgZGF0YSBvbiB0byB0aGUgdHR5IGxheWVyLiBCdXQgdGhhdCBuZWVkcyBsb2NraW5nCiAJCSAqIGFnYWluc3QgcmUtZW50cnkgYW4gdGhlbiBtaXhlZC11cCBkYXRhIGJlY2F1c2Ugb2YKQEAgLTY3OSw2ICs2NzksNyBAQAogCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGJ5dGVzX3NlbnQpOwogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSArIDIsIGJ5dGVzX3NlbnQpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAogCQkvKiBhZ2FpbiBsb2NrbGVzcywgYnV0IGRlYnVnIGluZm8gb25seSAqLwogCQlwcml2LT5ieXRlc19pbiArPSBieXRlc19zZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCmluZGV4IGRlYmEyOGVjLi5jZmNmMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC0zODMsNyArMzgzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXR0eSA9IHBvcnQtPnBvcnQudHR5OworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAogCQkvKiBCRUdJTiBERUJVRyAqLwpAQCAtNDA1LDYgKzQwNSw3IEBACiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAkvKiBzb21lb25lIHNldHMgdGhlIGRldiB0byAwIGlmIHRoZSBjbG9zZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkICovCiAJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKaW5kZXggMGRlZDhiZC4uOWIyY2VmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKQEAgLTU2MywxMCArNTYzLDExIEBACiAJICogV29yay1hLXJvdW5kOiBoYW5kbGUgdGhlICd1c3VhbCcgYnVsay1pbiBwaXBlIGhlcmUKIAkgKi8KIAlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gMikgewotCQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCXR0eV9rcmVmX3B1dCh0dHkpOwogCQl9CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC01OTEsNyArNTkyLDcgQEAKIAkgKiB0byBsb29rIGluIHRvIHRoaXMgYmVmb3JlIGNvbW1pdHRpbmcgYW55IGNvZGUuCiAJICovCiAJaWYgKHByaXYtPmxhc3RfbHNyICYgTUNUX1UyMzJfTFNSX0VSUikgewotCQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJCS8qIE92ZXJydW4gRXJyb3IgKi8KIAkJaWYgKHByaXYtPmxhc3RfbHNyICYgTUNUX1UyMzJfTFNSX09FKSB7CiAJCX0KQEAgLTYwNCw2ICs2MDUsNyBAQAogCQkvKiBCcmVhayBJbmRpY2F0b3IgKi8KIAkJaWYgKHByaXYtPmxhc3RfbHNyICYgTUNUX1UyMzJfTFNSX0JJKSB7CiAJCX0KKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQogI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKaW5kZXggN2M0OTE3ZC4uN2I1MzhjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC0yMTYsMTIgKzIxNiwxMyBAQAogCiAJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIAlpZiAoIXBvcnQtPnJlYWRfdXJiKSB7CiAJCWRiZygiVVJCIEtJTExFRCAhISEiKTsKQEAgLTI2MiwxMCArMjYzLDExIEBACiAKIAlkYmcoIkVudGVyaW5nIC4uLi4uLi4uLiIpOwogCi0JdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZtb3M3NzIwX3BvcnQtPnBvcnQtPnBvcnQpOwogCiAJaWYgKHR0eSAmJiBtb3M3NzIwX3BvcnQtPm9wZW4pCiAJCXR0eV93YWtldXAodHR5KTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogLyoKQEAgLTEyNjcsMjkgKzEyNjksNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogZ2V0X251bWJlcl9ieXRlc19hdmFpbCAtIGdldCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlCi0gKgotICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCB0byBnZXQgdGhlIGNvdW50IG9mIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X251bWJlcl9ieXRlc19hdmFpbChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCi0JCQkJICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT5wb3J0LnR0eTsKLQotCWlmICghdHR5KQotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCi0JcmVzdWx0ID0gdHR5LT5yZWFkX2NudDsKLQotCWRiZygiJXMoJWQpID0gJWQiLCBfX2Z1bmNfXywgIG1vczc3MjBfcG9ydC0+cG9ydC0+bnVtYmVyLCByZXN1bHQpOwotCWlmIChjb3B5X3RvX3VzZXIodmFsdWUsICZyZXN1bHQsIHNpemVvZihpbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotfQotCiBzdGF0aWMgaW50IHNldF9tb2RlbV9pbmZvKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCiB7CkBAIC0xNDA5LDEzICsxMzg4LDYgQEAKIAlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVElPQ0lOUToKLQkJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KLQkJZGJnKCIlcyAoJWQpIFRJT0NJTlEiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7Ci0JCXJldHVybiBnZXRfbnVtYmVyX2J5dGVzX2F2YWlsKG1vczc3MjBfcG9ydCwKLQkJCQkJICAgICAgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwotCQlicmVhazsKLQogCWNhc2UgVElPQ1NFUkdFVExTUjoKIAkJZGJnKCIlcyAoJWQpIFRJT0NTRVJHRVRMU1IiLCBfX2Z1bmNfXywgIHBvcnQtPm51bWJlcik7CiAJCXJldHVybiBnZXRfbHNyX2luZm8odHR5LCBtb3M3NzIwX3BvcnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCAwOWQ4MjA2Li42MDU0M2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTcwOSwxMiArNzA5LDEzIEBACiAJZGJnKCIlcyIsICJFbnRlcmluZyAuLi4uLi4uLi4uLiBcbiIpOwogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQl0dHkgPSBtb3M3ODQwX3BvcnQtPnBvcnQtPnBvcnQudHR5OworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZtb3M3ODQwX3BvcnQtPnBvcnQtPnBvcnQpOwogCQlpZiAodHR5KSB7CiAJCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCWRiZygiICVzIFxuIiwgZGF0YSk7CiAJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCX0KIAkJbW9zNzg0MF9wb3J0LT5pY291bnQucnggKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlzbXBfd21iKCk7CkBAIC03NzMsMTAgKzc3NCwxMCBAQAogCiAJZGJnKCIlcyBcbiIsICJFbnRlcmluZyAuLi4uLi4uLi4iKTsKIAotCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+cG9ydC50dHk7Ci0KKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZtb3M3ODQwX3BvcnQtPnBvcnQtPnBvcnQpOwogCWlmICh0dHkgJiYgbW9zNzg0MF9wb3J0LT5vcGVuKQogCQl0dHlfd2FrZXVwKHR0eSk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCmluZGV4IGQ2NzM2NTMuLmJjZGNiYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbmF2bWFuLmMKQEAgLTY0LDEyICs2NCwxMyBAQAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19mdW5jX18sCiAJCQkgICAgICB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAl9CisJdHR5X2tyZWZfcHV0KHR0eSk7CiAKIGV4aXQ6CiAJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCmluZGV4IGFlOGUyMjcuLmM0ZDcwYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCXdwb3J0ID0gc2VyaWFsLT5wb3J0WzFdOwotCXdwb3J0LT5wb3J0LnR0eSA9IHR0eTsJCS8qIEZJWE1FICovCisJdHR5X3BvcnRfdHR5X3NldCgmd3BvcnQtPnBvcnQsIHR0eSk7CiAKIAkvKiBTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZSAqLwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBzZXJpYWwtPmRldiwKQEAgLTIyOSw5ICsyMjksMTEgQEAKIAl9CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICYmIGhlYWRlci0+b2hfbGVuKSB7Ci0JCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcocG9ydC0+cG9ydC50dHksCi0JCQlkYXRhICsgT01OSU5FVF9EQVRBT0ZGU0VULCBoZWFkZXItPm9oX2xlbik7Ci0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQtPnBvcnQudHR5KTsKKwkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSArIE9NTklORVRfREFUQU9GRlNFVCwKKwkJCQkJCQloZWFkZXItPm9oX2xlbik7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCX0KIAogCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCA5ZjljZDM2Li42YjE3MjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0yMTgsNiArMjE4LDcgQEAKIC8qIFpURSBQUk9EVUNUUyAqLwogI2RlZmluZSBaVEVfVkVORE9SX0lECQkJCTB4MTlkMgogI2RlZmluZSBaVEVfUFJPRFVDVF9NRjYyOAkJCTB4MDAxNQorI2RlZmluZSBaVEVfUFJPRFVDVF9DRE1BX1RFQ0gJCQkweGZmZmUKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG9wdGlvbl9pZHNbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoT1BUSU9OX1ZFTkRPUl9JRCwgT1BUSU9OX1BST0RVQ1RfQ09MVCkgfSwKQEAgLTM0Nyw2ICszNDgsNyBAQAogCXsgVVNCX0RFVklDRShNQVhPTl9WRU5ET1JfSUQsIDB4NjI4MCkgfSwgLyogQlAzLVVTQiAmIEJQMy1FWFQgSFNEUEEgKi8KIAl7IFVTQl9ERVZJQ0UoVEVMSVRfVkVORE9SX0lELCBURUxJVF9QUk9EVUNUX1VDODY0RSkgfSwKIAl7IFVTQl9ERVZJQ0UoWlRFX1ZFTkRPUl9JRCwgWlRFX1BST0RVQ1RfTUY2MjgpIH0sCisJeyBVU0JfREVWSUNFKFpURV9WRU5ET1JfSUQsIFpURV9QUk9EVUNUX0NETUFfVEVDSCkgfSwKIAl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgb3B0aW9uX2lkcyk7CkBAIC01NjksMTQgKzU3MSwxNCBAQAogCQlkYmcoIiVzOiBub256ZXJvIHN0YXR1czogJWQgb24gZW5kcG9pbnQgJTAyeC4iLAogCQkgICAgX19mdW5jX18sIHN0YXR1cywgZW5kcG9pbnQpOwogCX0gZWxzZSB7Ci0JCXR0eSA9IHBvcnQtPnBvcnQudHR5OworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQl9IGVsc2UgeworCQl9IGVsc2UgCiAJCQlkYmcoIiVzOiBlbXB0eSByZWFkIHVyYiByZWNlaXZlZCIsIF9fZnVuY19fKTsKLQkJfQorCQl0dHlfa3JlZl9wdXQodHR5KTsKIAogCQkvKiBSZXN1Ym1pdCB1cmIgc28gd2UgY29udGludWUgcmVjZWl2aW5nICovCiAJCWlmIChwb3J0LT5wb3J0LmNvdW50ICYmIHN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CkBAIC02NDUsOSArNjQ3LDEzIEBACiAJCQlwb3J0ZGF0YS0+ZHNyX3N0YXRlID0gKChzaWduYWxzICYgMHgwMikgPyAxIDogMCk7CiAJCQlwb3J0ZGF0YS0+cmlfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDA4KSA/IDEgOiAwKTsKIAotCQkJaWYgKHBvcnQtPnBvcnQudHR5ICYmICFDX0NMT0NBTChwb3J0LT5wb3J0LnR0eSkgJiYKLQkJCQkJb2xkX2RjZF9zdGF0ZSAmJiAhcG9ydGRhdGEtPmRjZF9zdGF0ZSkKLQkJCQl0dHlfaGFuZ3VwKHBvcnQtPnBvcnQudHR5KTsKKwkJCWlmIChvbGRfZGNkX3N0YXRlICYmICFwb3J0ZGF0YS0+ZGNkX3N0YXRlKSB7CisJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9CisJCQkJCQl0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJCQlpZiAodHR5ICYmICFDX0NMT0NBTCh0dHkpKQorCQkJCQl0dHlfaGFuZ3VwKHR0eSk7CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fZnVuY19fLAogCQkJCXJlcV9wa3QtPmJSZXF1ZXN0VHlwZSwgcmVxX3BrdC0+YlJlcXVlc3QpOwpAQCAtNzkxLDcgKzc5Nyw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBOX09VVF9VUkI7IGkrKykKIAkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbaV0pOwogCX0KLQlwb3J0LT5wb3J0LnR0eSA9IE5VTEw7CS8qIEZJWE1FICovCisJdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgTlVMTCk7CiB9CiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSBvcHRpb25fc2V0dXBfdXJicyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMKaW5kZXggODFkYjU3MS4uYmE1NTFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCkBAIC0yMjQsMTAgKzIyNCw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsgICAvKiBVU0IgcG9ydCB3aXRoIHdoaWNoIGFzc29jaWF0ZWQgKi8KIH07CiAKLSN1bmRlZiBkYmcKLS8qICNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19GSUxFX18sICMjIGFyZykgKi8KLSNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICIiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0KIHN0YXRpYyB2b2lkIHNldHVwX2xpbmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBvdGk2ODU4X3ByaXZhdGUgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywKQEAgLTEwMDIsMTEgKzk5OCwxMiBAQAogCQlyZXR1cm47CiAJfQogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKHR0eSAhPSBOVUxMICYmIHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKIAkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQorCXR0eV9rcmVmX3B1dCh0dHkpOwogCiAJLyogc2NoZWR1bGUgdGhlIGludGVycnVwdCB1cmIgaWYgd2UgYXJlIHN0aWxsIG9wZW4gKi8KIAlpZiAocG9ydC0+cG9ydC5jb3VudCAhPSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKaW5kZXggMWVkZTE0NC4uOTA4NDM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwpAQCAtMTU0LDcgKzE1NCw2IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7CiAJdTggbGluZV9jb250cm9sOwogCXU4IGxpbmVfc3RhdHVzOwotCXU4IHRlcm1pb3NfaW5pdGlhbGl6ZWQ7CiAJZW51bSBwbDIzMDNfdHlwZSB0eXBlOwogfTsKIApAQCAtNTI2LDE2ICs1MjUsNiBAQAogCiAJZGJnKCIlcyAtICBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmICghcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCkgewotCQkqKHR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLQkJdHR5LT50ZXJtaW9zLT5jX2lzcGVlZCA9IDk2MDA7Ci0JCXR0eS0+dGVybWlvcy0+Y19vc3BlZWQgPSA5NjAwOwotCQlwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkID0gMTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCiAJLyogVGhlIFBMMjMwMyBpcyByZXBvcnRlZCB0byBsb3NlIGJ5dGVzIGlmIHlvdSBjaGFuZ2UKIAkgICBzZXJpYWwgc2V0dGluZ3MgZXZlbiB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgYmVmb3JlLiBUaHVzCiAJICAgd2UgYWN0dWFsbHkgbmVlZCB0byBmaWx0ZXIgaW4gdGhpcyBzcGVjaWZpYyBjYXNlICovCkBAIC0xMDU3LDcgKzEwNDYsNyBAQAogCQl0dHlfZmxhZyA9IFRUWV9GUkFNRTsKIAlkYmcoIiVzIC0gdHR5X2ZsYWcgPSAlZCIsIF9fZnVuY19fLCB0dHlfZmxhZyk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCArIDEpOwogCQkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCkBAIC0xMDY3LDcgKzEwNTYsNyBAQAogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQotCisJdHR5X2tyZWZfcHV0KHR0eSk7CiAJLyogU2NoZWR1bGUgdGhlIG5leHQgcmVhZCBfaWZfIHdlIGFyZSBzdGlsbCBvcGVuICovCiAJaWYgKHBvcnQtPnBvcnQuY291bnQpIHsKIAkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zYWZlX3NlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKaW5kZXggZGVmNTJkMC4uNzI5MDNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKQEAgLTIxNyw2ICsyMTcsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBjaGFyIGxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXN1bHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCkBAIC0yNDIsNiArMjQzLDcgQEAKIAkJcHJpbnRrKCJcbiIpOwogCX0KICNlbmRpZgorCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCWlmIChzYWZlKSB7CiAJCV9fdTE2IGZjczsKIAkJZmNzID0gZmNzX2NvbXB1dGUxMChkYXRhLCBsZW5ndGgsIENSQzEwX0lOSVRGQ1MpOwpAQCAtMjUwLDkgKzI1Miw5IEBACiAJCQlpZiAoYWN0dWFsX2xlbmd0aCA8PSAobGVuZ3RoIC0gMikpIHsKIAkJCQlpbmZvKCIlcyAtIGFjdHVhbDogJWQiLCBfX2Z1bmNfXywKIAkJCQkJCQlhY3R1YWxfbGVuZ3RoKTsKLQkJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQtPnBvcnQudHR5LAorCQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LAogCQkJCQkJCWRhdGEsIGFjdHVhbF9sZW5ndGgpOwotCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQtPnBvcnQudHR5KTsKKwkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQkJfSBlbHNlIHsKIAkJCQllcnIoIiVzIC0gaW5jb25zaXN0ZW50IGxlbmd0aHMgJWQ6JWQiLAogCQkJCQlfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCwgbGVuZ3RoKTsKQEAgLTI2MSw5ICsyNjMsMTAgQEAKIAkJCWVycigiJXMgLSBiYWQgQ1JDICV4IiwgX19mdW5jX18sIGZjcyk7CiAJCX0KIAl9IGVsc2UgewotCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQtPnBvcnQudHR5LCBkYXRhLCBsZW5ndGgpOwotCQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0LT5wb3J0LnR0eSk7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBsZW5ndGgpOworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCAgKi8KIAl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCmluZGV4IDcwNjAzMzcuLjhiOWVhZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAgV2hvbSBiYXNlZCBoaXMgb24gdGhlIEtleXNwYW4gZHJpdmVyIGJ5IEh1Z2ggQmxlbWluZ3MgPGh1Z2hAYmxlbWluZ3Mub3JnPgogKi8KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjIuMTNhIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjMuMiIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiS2V2aW4gTGxveWQgPGtsbG95ZEBzaWVycmF3aXJlbGVzcy5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIERyaXZlciBmb3IgU2llcnJhIFdpcmVsZXNzIFVTQiBtb2RlbXMiCiAKQEAgLTMwLDkgKzMwLDYgQEAKIAogI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9TZXRQb3dlcgkweDAwCiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldE5tZWEJMHgwNwotI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9TZXRNb2RlCTB4MEIKLSNkZWZpbmUgU1dJTVNfVVNCX1JFUVVFU1RfR2V0U3dvY0luZm8JMHgwQQotI2RlZmluZSBTV0lNU19TRVRfTU9ERV9Nb2RlbQkJMHgwMDAxCiAKIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogI2RlZmluZSBOX0lOX1VSQgk0CkBAIC0xNjMsNyArMTYwLDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTcpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBFTTU2MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTgpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAyMTgpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwZjMwLCAweDFiMWQpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwM2YwLCAweDFiMWQpIH0sIC8qIEhQIGV2MjIwMCBhLmsuYSBNQzU3MjAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjQpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjcgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAyMjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjUgKi8KQEAgLTE3NSw2ICsxNzIsOCBAQAogCSAvKiBTaWVycmEgV2lyZWxlc3MgRGV2aWNlICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDExOTksIDB4MDAyNSwgMHhGRiwgMHhGRiwgMHhGRikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjYpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBEZXZpY2UgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjcpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBEZXZpY2UgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjgpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBEZXZpY2UgKi8KIAogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwMikgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwNCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSAqLwpAQCAtMTg3LDYgKzE4Niw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODIxKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4NzVVICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODMyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzgwICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODMzKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzgxICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNBKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzg1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNCKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzg1IENvbXBvc2l0ZSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzQykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc5MCAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzRCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc5MCAqLwpAQCAtMjA0LDYgKzIwNCw4IEBACiAJLyogU2llcnJhIFdpcmVsZXNzIERldmljZSAqLwogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxMTk5LCAweDY4OTAsIDB4RkYsIDB4RkYsIDB4RkYpfSwKIAkvKiBTaWVycmEgV2lyZWxlc3MgRGV2aWNlICovCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDExOTksIDB4Njg5MSwgMHhGRiwgMHhGRiwgMHhGRil9LAorCS8qIFNpZXJyYSBXaXJlbGVzcyBEZXZpY2UgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MTE5OSwgMHg2ODkyLCAweEZGLCAweEZGLCAweEZGKX0sCiAKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAxMTIpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDU4MCAqLwpAQCAtNDM4LDE0ICs0NDAsMTQgQEAKIAkJZGJnKCIlczogbm9uemVybyBzdGF0dXM6ICVkIG9uIGVuZHBvaW50ICUwMnguIiwKIAkJICAgIF9fZnVuY19fLCBzdGF0dXMsIGVuZHBvaW50KTsKIAl9IGVsc2UgewotCQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKIAkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAkJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQkJfSBlbHNlIHsKKwkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQl9IGVsc2UKIAkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19mdW5jX18pOwotCQl9CiAKIAkJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyAqLwogCQlpZiAocG9ydC0+cG9ydC5jb3VudCAmJiBzdGF0dXMgIT0gLUVTSFVURE9XTikgewpAQCAtNDgzLDYgKzQ4NSw3IEBACiAJCQl1bnNpZ25lZCBjaGFyIHNpZ25hbHMgPSAqKCh1bnNpZ25lZCBjaGFyICopCiAJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKKwkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAkJCWRiZygiJXM6IHNpZ25hbCB4JXgiLCBfX2Z1bmNfXywgc2lnbmFscyk7CiAKQEAgLTQ5Miw5ICs0OTUsMTEgQEAKIAkJCXBvcnRkYXRhLT5kc3Jfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDAyKSA/IDEgOiAwKTsKIAkJCXBvcnRkYXRhLT5yaV9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDgpID8gMSA6IDApOwogCi0JCQlpZiAocG9ydC0+cG9ydC50dHkgJiYgIUNfQ0xPQ0FMKHBvcnQtPnBvcnQudHR5KSAmJgorCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCQlpZiAodHR5ICYmICFDX0NMT0NBTCh0dHkpICYmCiAJCQkJCW9sZF9kY2Rfc3RhdGUgJiYgIXBvcnRkYXRhLT5kY2Rfc3RhdGUpCi0JCQkJdHR5X2hhbmd1cChwb3J0LT5wb3J0LnR0eSk7CisJCQkJdHR5X2hhbmd1cCh0dHkpOworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCX0gZWxzZSB7CiAJCQlkYmcoIiVzOiB0eXBlICV4IHJlcSAleCIsIF9fZnVuY19fLAogCQkJCXJlcV9wa3QtPmJSZXF1ZXN0VHlwZSwgcmVxX3BrdC0+YlJlcXVlc3QpOwpAQCAtNjE0LDggKzYxOSw3IEBACiAJfQogCiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwotCi0JcG9ydC0+cG9ydC50dHkgPSBOVUxMOwkvKiBGSVhNRSAqLworCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IHNpZXJyYV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwppbmRleCAyODNjZjZiLi4xNTMzZDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKQEAgLTc1NSw3ICs3NTUsNyBAQAogCQl0dHlfZmxhZyA9IFRUWV9GUkFNRTsKIAlkZXZfZGJnKCZwb3J0LT5kZXYsICJ0dHlfZmxhZyA9ICVkXG4iLCB0dHlfZmxhZyk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCArIDEpOwogCQkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCkBAIC03NjUsNiArNzY1LDcgQEAKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YVtpXSwgdHR5X2ZsYWcpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIAogCS8qIFNjaGVkdWxlIHRoZSBuZXh0IHJlYWQgX2lmXyB3ZSBhcmUgc3RpbGwgb3BlbiAqLwogCWlmIChwb3J0LT5wb3J0LmNvdW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCBlMzljNzc5Li5jOTAyMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogc3RhdGljIGludCB0aV9nZXRfbHNyKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCk7CiBzdGF0aWMgaW50IHRpX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsCiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRfYXJnKTsKLXN0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKK3N0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19hcmcpOwogc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBfX3U4IG1zcik7CiAKQEAgLTg1Nyw4ICs4NTcsOCBAQAogCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCWNhc2UgVElPQ1NTRVJJQUw6CiAJCWRiZygiJXMgLSAoJWQpIFRJT0NTU0VSSUFMIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7Ci0JCXJldHVybiB0aV9zZXRfc2VyaWFsX2luZm8odHBvcnQsCi0JCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOworCQlyZXR1cm4gdGlfc2V0X3NlcmlhbF9pbmZvKHR0eSwgdHBvcnQsCisJCQkJKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKWFyZyk7CiAJY2FzZSBUSU9DTUlXQUlUOgogCQlkYmcoIiVzIC0gKCVkKSBUSU9DTUlXQUlUIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCWNwcmV2ID0gdHBvcnQtPnRwX2ljb3VudDsKQEAgLTEyMTEsNiArMTIxMSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVyYi0+ZGV2LT5kZXY7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAlkYmcoIiVzIiwgX19mdW5jX18pOwogCkBAIC0xMjM5LDIwICsxMjQwLDIyIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAocG9ydC0+cG9ydC50dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKIAkJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCBkZXYsIF9fZnVuY19fLAogCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAkJaWYgKCF0cG9ydC0+dHBfaXNfb3BlbikKIAkJCWRiZygiJXMgLSBwb3J0IGNsb3NlZCwgZHJvcHBpbmcgZGF0YSIsIF9fZnVuY19fKTsKIAkJZWxzZQotCQkJdGlfcmVjdigmdXJiLT5kZXYtPmRldiwgcG9ydC0+cG9ydC50dHksCisJCQl0aV9yZWN2KCZ1cmItPmRldi0+ZGV2LCB0dHksCiAJCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwKIAkJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkJc3Bpbl9sb2NrKCZ0cG9ydC0+dHBfbG9jayk7CiAJCXRwb3J0LT50cF9pY291bnQucnggKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCQlzcGluX3VubG9jaygmdHBvcnQtPnRwX2xvY2spOworCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CiAKIGV4aXQ6CkBAIC0xMzMwLDcgKzEzMzMsNyBAQAogewogCWludCBjb3VudCwgcmVzdWx0OwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0cG9ydC0+dHBfcG9ydDsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+cG9ydC50dHk7CS8qIEZJWE1FICovCisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwkvKiBGSVhNRSAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIApAQCAtMTMzOCwxOSArMTM0MSwxNSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CiAKLQlpZiAodHBvcnQtPnRwX3dyaXRlX3VyYl9pbl91c2UpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAodHBvcnQtPnRwX3dyaXRlX3VyYl9pbl91c2UpCisJCWdvdG8gdW5sb2NrOwogCiAJY291bnQgPSB0aV9idWZfZ2V0KHRwb3J0LT50cF93cml0ZV9idWYsCiAJCQkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsCiAJCQkJcG9ydC0+YnVsa19vdXRfc2l6ZSk7CiAKLQlpZiAoY291bnQgPT0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIHVubG9jazsKIAogCXRwb3J0LT50cF93cml0ZV91cmJfaW5fdXNlID0gMTsKIApAQCAtMTM4MCw3ICsxMzc5LDEzIEBACiAJLyogbW9yZSByb29tIGluIHRoZSBidWZmZXIgZm9yIG5ldyB3cml0ZXMsIHdha2V1cCAqLwogCWlmICh0dHkpCiAJCXR0eV93YWtldXAodHR5KTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRwb3J0LT50cF93cml0ZV93YWl0KTsKKwlyZXR1cm47Cit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKKwlyZXR1cm47CiB9CiAKIApAQCAtMTQ2NCwyMCArMTQ2OSwxNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKK3N0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19hcmcpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRwb3J0LT50cF9wb3J0OwogCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19hcmcsIHNpemVvZihuZXdfc2VyaWFsKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJdHBvcnQtPnRwX2ZsYWdzID0gbmV3X3NlcmlhbC5mbGFncyAmIFRJX1NFVF9TRVJJQUxfRkxBR1M7Ci0JLyogRklYTUUgKi8KLQlpZiAocG9ydC0+cG9ydC50dHkpCi0JCXBvcnQtPnBvcnQudHR5LT5sb3dfbGF0ZW5jeSA9Ci0JCQkodHBvcnQtPnRwX2ZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJdHR5LT5sb3dfbGF0ZW5jeSA9ICh0cG9ydC0+dHBfZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKIAl0cG9ydC0+dHBfY2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQ7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTAsNyArMTUxMSw3IEBACiAJdHBvcnQtPnRwX21zciA9IG1zciAmIFRJX01TUl9NQVNLOwogCiAJLyogaGFuZGxlIENUUyBmbG93IGNvbnRyb2wgKi8KLQl0dHkgPSB0cG9ydC0+dHBfcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmdHBvcnQtPnRwX3BvcnQtPnBvcnQpOwogCWlmICh0dHkgJiYgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJaWYgKG1zciAmIFRJX01TUl9DVFMpIHsKIAkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CkBAIC0xNTE5LDYgKzE1MjAsNyBAQAogCQkJdHR5LT5od19zdG9wcGVkID0gMTsKIAkJfQogCX0KKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogCkBAIC0xNzQ0LDcgKzE3NDYsNyBAQAogCWlmIChidWZmZXIpIHsKIAkJbWVtY3B5KGJ1ZmZlciwgZndfcC0+ZGF0YSwgZndfcC0+c2l6ZSk7CiAJCW1lbXNldChidWZmZXIgKyBmd19wLT5zaXplLCAweGZmLCBidWZmZXJfc2l6ZSAtIGZ3X3AtPnNpemUpOwotCQl0aV9kb19kb3dubG9hZChkZXYsIHBpcGUsIGJ1ZmZlciwgZndfcC0+c2l6ZSk7CisJCXN0YXR1cyA9IHRpX2RvX2Rvd25sb2FkKGRldiwgcGlwZSwgYnVmZmVyLCBmd19wLT5zaXplKTsKIAkJa2ZyZWUoYnVmZmVyKTsKIAl9CiAJcmVsZWFzZV9maXJtd2FyZShmd19wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IGIxNTdjNDguLmU3ZDQyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJLyogc2V0IHVwIG91ciBwb3J0IHN0cnVjdHVyZSBtYWtpbmcgdGhlIHR0eSBkcml2ZXIKIAkgKiByZW1lbWJlciBvdXIgcG9ydCBvYmplY3QsIGFuZCB1cyBpdCAqLwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OwotCXBvcnQtPnBvcnQudHR5ID0gdHR5OworCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIHR0eSk7CiAKIAlpZiAocG9ydC0+cG9ydC5jb3VudCA9PSAxKSB7CiAKQEAgLTI0Niw3ICsyNDYsNyBAQAogYmFpbG91dF9tdXRleF91bmxvY2s6CiAJcG9ydC0+cG9ydC5jb3VudCA9IDA7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JcG9ydC0+cG9ydC50dHkgPSBOVUxMOworCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwogCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogYmFpbG91dF9rcmVmX3B1dDoKIAl1c2Jfc2VyaWFsX3B1dChzZXJpYWwpOwpAQCAtMjc2LDEwICsyNzYsMTEgQEAKIAkJcG9ydC0+c2VyaWFsLT50eXBlLT5jbG9zZSh0dHksIHBvcnQsIGZpbHApOwogCiAJaWYgKHBvcnQtPnBvcnQuY291bnQgPT0gKHBvcnQtPmNvbnNvbGU/IDEgOiAwKSkgewotCQlpZiAocG9ydC0+cG9ydC50dHkpIHsKLQkJCWlmIChwb3J0LT5wb3J0LnR0eS0+ZHJpdmVyX2RhdGEpCi0JCQkJcG9ydC0+cG9ydC50dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJCXBvcnQtPnBvcnQudHR5ID0gTlVMTDsKKwkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5KSB7CisJCQlpZiAodHR5LT5kcml2ZXJfZGF0YSkKKwkJCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwogCQl9CiAJfQogCkBAIC01MDgsMTEgKzUwOSwxMiBAQAogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCi0JdHR5ID0gcG9ydC0+cG9ydC50dHk7CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJaWYgKCF0dHkpCiAJCXJldHVybjsKIAogCXR0eV93YWtldXAodHR5KTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogc3RhdGljIHZvaWQgcG9ydF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTczMyw3ICs3MzUsOSBAQAogCSAgICAoKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gQVRFTl9WRU5ET1JfSUQpICYmCiAJICAgICAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gQVRFTl9QUk9EVUNUX0lEKSkgfHwKIAkgICAgKChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IEFMQ09SX1ZFTkRPUl9JRCkgJiYKLQkgICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBBTENPUl9QUk9EVUNUX0lEKSkpIHsKKwkgICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBBTENPUl9QUk9EVUNUX0lEKSkgfHwKKwkgICAgKChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IFNJRU1FTlNfVkVORE9SX0lEKSAmJgorCSAgICAgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFNJRU1FTlNfUFJPRFVDVF9JRF9FRjgxKSkpIHsKIAkJaWYgKGludGVyZmFjZSAhPSBkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdKSB7CiAJCQkvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyBvZiB0aGUgb3RoZXIgaW50ZXJmYWNlKi8KIAkJCWlmYWNlX2Rlc2MgPSBkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlWzBdLT5jdXJfYWx0c2V0dGluZzsKQEAgLTgxNyw2ICs4MjEsNyBAQAogCQlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnQpCiAJCQlnb3RvIHByb2JlX2Vycm9yOworCQl0dHlfcG9ydF9pbml0KCZwb3J0LT5wb3J0KTsKIAkJcG9ydC0+c2VyaWFsID0gc2VyaWFsOwogCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKQEAgLTEwMzgsOCArMTA0MywxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCWlmIChwb3J0KSB7Ci0JCQlpZiAocG9ydC0+cG9ydC50dHkpCi0JCQkJdHR5X2hhbmd1cChwb3J0LT5wb3J0LnR0eSk7CisJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCQlpZiAodHR5KSB7CisJCQkJdHR5X2hhbmd1cCh0dHkpOworCQkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQkJfQogCQkJa2lsbF90cmFmZmljKHBvcnQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwppbmRleCBjZjg5MjRmLi5hNmQxYzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJlc3VsdDsKLQlpbnQgYXZhaWxhYmxlX3Jvb207CisJaW50IGF2YWlsYWJsZV9yb29tID0gMDsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTUxMiwxMyArNTEyLDE3IEBACiAJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywKIAkJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwgZGF0YSk7CiAKLQl0dHkgPSBwb3J0LT5wb3J0LnR0eTsKLQlpZiAodHR5ICYmIHVyYi0+YWN0dWFsX2xlbmd0aCkgewotCQlhdmFpbGFibGVfcm9vbSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5KSB7CisJCQlhdmFpbGFibGVfcm9vbSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwKIAkJCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOwotCQlpZiAoYXZhaWxhYmxlX3Jvb20pIHsKLQkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCBhdmFpbGFibGVfcm9vbSk7Ci0JCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJaWYgKGF2YWlsYWJsZV9yb29tKSB7CisJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsCisJCQkJCQkJYXZhaWxhYmxlX3Jvb20pOworCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCQl9CisJCQl0dHlfa3JlZl9wdXQodHR5KTsKIAkJfQogCQlzcGluX2xvY2soJnByaXYtPmxvY2spOwogCQlwcml2LT5ieXRlc19pbiArPSBhdmFpbGFibGVfcm9vbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwppbmRleCAzYTlkMTQzLi4xMWM4Yjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogCXN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSAqaW5mbyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUsIHJ4X3dvcmspOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBpbmZvLT5wb3J0OwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5wb3J0LnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CiAJc3RydWN0IHdoaXRlaGVhdF91cmJfd3JhcCAqd3JhcDsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0OTMsNyArMTQ5Myw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKIAlpZiAoaW5mby0+ZmxhZ3MgJiBUSFJPVFRMRUQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDIsICZpbmZvLT5yeF91cmJfcSkgewpAQCAtMTUxMyw3ICsxNTEzLDcgQEAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7CiAJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT5yeF93b3JrKTsKLQkJCQlyZXR1cm47CisJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbik7CiAJCQlzZW50ICs9IGxlbjsKQEAgLTE1MzYsNiArMTUzNiw4IEBACiAKIAlpZiAoc2VudCkKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK291dDoKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKaW5kZXggYzc2MDM0Ni4uM2Q5MjQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwpAQCAtMTQ2LDE4ICsxNDYsNiBAQAogCSAgb24gdGhlIHJlc3VsdGluZyBzY3NpIGRldmljZSBub2RlIHJldHVybnMgdGhlIEthcm1hIHRvIG5vcm1hbAogCSAgb3BlcmF0aW9uLgogCi1jb25maWcgVVNCX1NUT1JBR0VfU0lFUlJBCi0JYm9vbCAiU2llcnJhIFdpcmVsZXNzIFRSVS1JbnN0YWxsIEZlYXR1cmUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29kZSB0byBzdXBwb3J0IFNpZXJyYSBXaXJlbGVzcwotCSAgcHJvZHVjdHMgd2l0aCB0aGUgVFJVLUluc3RhbGwgZmVhdHVyZSAoZS5nLiwgQUM1OTdFLCBBQzg4MVUpLgotCi0JICBUaGlzIGNvZGUgc3dpdGNoZXMgdGhlIFNpZXJyYSBXaXJlbGVzcyBkZXZpY2UgZnJvbSBiZWluZyBpbgotCSAgTWFzcyBTdG9yYWdlIG1vZGUgdG8gTW9kZW0gbW9kZS4gSXQgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8KLQkgIHN1cHBvcnQgaG9zdCBzb2Z0d2FyZSB1cGdyYWRlcyBzaG91bGQgZnVsbCBMaW51eCBzdXBwb3J0IGJlIGFkZGVkCi0JICB0byBUUlUtSW5zdGFsbC4KLQogY29uZmlnIFVTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKIAlib29sICJTQVQgZW11bGF0aW9uIG9uIEN5cHJlc3MgVVNCL0FUQSBCcmlkZ2Ugd2l0aCBBVEFDQiIKIAlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQppbmRleCBiYzM0MTViLi43ZjhiZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTIxLDExICsyMSwxMCBAQAogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSkJKz0gYWxhdWRhLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCkJKz0gb25ldG91Y2gubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BKQkrPSBrYXJtYS5vCi11c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfU0lFUlJBKQkrPSBzaWVycmFfbXMubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IpICs9IGN5cHJlc3NfYXRhY2IubwogCiB1c2Itc3RvcmFnZS1vYmpzIDo9CXNjc2lnbHVlLm8gcHJvdG9jb2wubyB0cmFuc3BvcnQubyB1c2IubyBcCi0JCQlpbml0aWFsaXplcnMubyAkKHVzYi1zdG9yYWdlLW9iai15KQorCQkJaW5pdGlhbGl6ZXJzLm8gc2llcnJhX21zLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKIAogaWZuZXEgKCQoQ09ORklHX1VTQl9MSUJVU1VBTCksKQogCW9iai0kKENPTkZJR19VU0IpCSs9IGxpYnVzdWFsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGJhNDEyZTYuLmNkMTU1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMTYwLDYgKzE2MCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAorLyogUmVwb3J0ZWQgYnkgRmlsaXAgSm9lbHNzb24gPGZpbGlwQGJsdWV0dXJ0bGUubnU+ICovCitVTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDVkLCAweDAwMDEsIDB4MDYwMCwKKwkJIk5va2lhIiwKKwkJIk5va2lhIDMxMTBjIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAorCiAvKiBSZXBvcnRlZCBieSBNYXJpbyBSZXR0aWcgPG1hcmlvcmV0dGlnQHdlYi5kZT4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0MmUsIDB4MDEwMCwgMHgwMTAwLAogCQkiTm9raWEiLApAQCAtMjMyLDYgKzIzOSwyMCBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0NBUEFDSVRZICksCiAKKy8qIFJlcG9ydGVkIGJ5IFJpY2hhcmQgTmF1YmVyIDxSaWNoYXJkTmF1YmVyQHdlYi5kZT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0ZmEsIDB4MDYwMSwgMHgwNjAxLAorCQkiTm9raWEiLAorCQkiNjMwMCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKKworLyogUGF0Y2ggZm9yIE5va2lhIDUzMTAgY2FwYWNpdHkgKi8KK1VOVVNVQUxfREVWKCAgMHgwNDIxLCAweDAwNmEsIDB4MDAwMCwgMHgwNTkxLAorCSJOb2tpYSIsCisJIjUzMTAiLAorCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAorCiAvKiBSZXBvcnRlZCBieSBPbGFmIEhlcmluZyA8b2xoQHN1c2UuZGU+IGZyb20gbm92ZWxsIGJ1ZyAjMTA1ODc4ICovCiBVTlVTVUFMX0RFViggIDB4MDQyNCwgMHgwZmRjLCAweDAyMTAsIDB4MDIxMCwKIAkJIlNNU0MiLApAQCAtOTg3LDYgKzEwMDgsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAogCisvKiBSZXBvcnRlZCBieSBBZHJpYW4gUGlsY2hvd2llYyA8YWRpMTk4MUBlcGYucGw+ICovCitVTlVTVUFMX0RFViggIDB4MDcxYiwgMHgzMjAzLCAweDAwMDAsIDB4MDAwMCwKKwkJIlJvY2tDaGlwIiwKKwkJIk1QMyIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9OT19XUF9ERVRFQ1QgfCBVU19GTF9NQVhfU0VDVE9SU182NCksCisKIC8qIFJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBHaGlsYXJkaSA8bWFzc2ltaWxpYW5vLmdoaWxhcmRpQGdtYWlsLmNvbT4KICAqIFRoaXMgVVNCIE1QMy9BVkkgcGxheWVyIGRldmljZSBmYWlscyBhbmQgZGlzY29ubmVjdHMgaWYgbW9yZSB0aGFuIDEyOAogICogc2VjdG9ycyAoNjRrQikgYXJlIHJlYWQvd3JpdHRlbiBpbiBhIHNpbmdsZSBjb21tYW5kLCBhbmQgbWF5IGJlIHByZXNlbnQKQEAgLTE1NzYsNyArMTYwNCw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQkwKSwKIAotI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TSUVSUkEKIC8qIFJlcG9ydGVkIGJ5IEtldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+CiAgKiBFbnRyeSBpcyBuZWVkZWQgZm9yIHRoZSBpbml0aWFsaXplciBmdW5jdGlvbiBvdmVycmlkZSwKICAqIHdoaWNoIGluc3RydWN0cyB0aGUgZGV2aWNlIHRvIGxvYWQgYXMgYSBtb2RlbQpAQCAtMTU4Nyw3ICsxNjE0LDYgQEAKIAkJIlVTQiBNTUMgU3RvcmFnZSIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBzaWVycmFfbXNfaW5pdCwKIAkJMCksCi0jZW5kaWYKIAogLyogUmVwb3J0ZWQgYnkgSmFjbyBLcm9vbiA8amFjb0Brcm9vbi5jby56YT4KICAqIFRoZSB1c2Itc3RvcmFnZSBtb2R1bGUgZm91bmQgb24gdGhlIERpZ2l0ZWNoIEdOWDQgKGFuZCBzdXBwb3NlZGx5IG90aGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCA3MzY3OWFhLi4yNzAxNmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTEwMiw5ICsxMDIsNyBAQAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCCiAjaW5jbHVkZSAiY3lwcmVzc19hdGFjYi5oIgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX1NJRVJSQQogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgotI2VuZGlmCiAKIC8qIFNvbWUgaW5mb3JtYXRpb25hbCBkYXRhICovCiBNT0RVTEVfQVVUSE9SKCJNYXR0aGV3IERoYXJtIDxtZGhhcm0tdXNiQG9uZS1leWVkLWFsaWVuLm5ldD4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA3MGQxMzVlLi4wZjEzNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC03Niw2ICs3NiwxNCBAQAogICAgICAgIHNlbGVjdCBJMkMKICAgICAgICBkZWZhdWx0IG4KIAorY29uZmlnIEZCX0JPT1RfVkVTQV9TVVBQT1JUCisJYm9vbAorCWRlcGVuZHMgb24gRkIKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBJZiB0cnVlLCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgZnJhbWVidWZmZXIgZHJpdmVyIGNhbiB0YWtlIGFkdmFudGFnZQorCSAgb2YgVkVTQSB2aWRlbyBtb2RlcyBzZXQgYXQgYW4gZWFybHkgYm9vdCBzdGFnZSB2aWEgdGhlIHZnYT0gcGFyYW1ldGVyLgorCiBjb25maWcgRkJfQ0ZCX0ZJTExSRUNUCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIEZCCkBAIC0xNzIsMTEgKzE4MCw2IEBACiAJYm9vbAogCWRlcGVuZHMgb24gRkIKIAotY29uZmlnIEZCX01FVFJPTk9NRQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBGQgotCWRlcGVuZHMgb24gRkJfREVGRVJSRURfSU8KLQogY29uZmlnIEZCX0hFQ1VCQQogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBGQgpAQCAtMjU5LDE2ICsyNjIsMjQgQEAKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAloZWxwCi0JICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFBlcm1lZGlhMiBBR1AgZnJhbWUKLQkgIGJ1ZmZlciBjYXJkIGZyb20gQVNLLCBha2EgYEdyYXBoaWMgQmxhc3RlciBFeHh0cmVtZScuICBUaGVyZSBpcyBhCi0JICBwcm9kdWN0IHBhZ2UgYXQKLQkgIDxodHRwOi8vd3d3LmFzay5jb20uaGsvcHJvZHVjdC9QZXJtZWRpYSUyMDIvcGVybWVkaWEyLmh0bT4uCisJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgY2FyZHMgYmFzZWQgb24KKwkgIHRoZSAzRCBMYWJzIFBlcm1lZGlhLCBQZXJtZWRpYSAyIGFuZCBQZXJtZWRpYSAyViBjaGlwcy4KKwkgIFRoZSBkcml2ZXIgd2FzIHRlc3RlZCBvbiB0aGUgZm9sbG93aW5nIGNhcmRzOgorCQlEaWFtb25kIEZpcmVHTCAxMDAwIFBSTyBBR1AKKwkJRUxTQSBHbG9yaWEgU3luZXJneSBQQ0kKKwkJQXBwaWFuIEplcm9uaW1vIFBSTyAoYm90aCBoZWFkcykgUENJCisJCTNETGFicyBPeHlnZW4gQUNYIGFrYSBFT050cm9uaWNzIFBpY2Fzc28gUDIgUENJCisJCVRlY2hzb3VyY2UgUmFwdG9yIEdGWC04UCAoYWthIFN1biBQR1gtMzIpIG9uIFNQQVJDCisJCUFTSyBHcmFwaGljIEJsYXN0ZXIgRXh4dHJlbWUgQUdQCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBtMmZiLgogCiBjb25maWcgRkJfUE0yX0ZJRk9fRElTQ09OTkVDVAogCWJvb2wgImVuYWJsZSBGSUZPIGRpc2Nvbm5lY3QgZmVhdHVyZSIKIAlkZXBlbmRzIG9uIEZCX1BNMiAmJiBQQ0kKIAloZWxwCi0JICBTdXBwb3J0IHRoZSBQZXJtZWRpYTIgRklGTyBkaXNjb25uZWN0IGZlYXR1cmUgKHNlZSBDT05GSUdfRkJfUE0yKS4KKwkgIFN1cHBvcnQgdGhlIFBlcm1lZGlhMiBGSUZPIGRpc2Nvbm5lY3QgZmVhdHVyZS4KIAogY29uZmlnIEZCX0FSTUNMQ0QKIAl0cmlzdGF0ZSAiQVJNIFByaW1lQ2VsbCBQTDExMCBzdXBwb3J0IgpAQCAtNjc4LDcgKzY4OSw3IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAotCXNlbGVjdCBWSURFT19TRUxFQ1QKKwlzZWxlY3QgRkJfQk9PVF9WRVNBX1NVUFBPUlQKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgZ2VuZXJpYyBWRVNBIDIuMAogCSAgY29tcGxpYW50IGdyYXBoaWMgY2FyZHMuIFRoZSBvbGRlciBWRVNBIDEuMiBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZC4KQEAgLTY4NywyMyArNjk4LDE0IEBACiAKIGNvbmZpZyBGQl9FRkkKIAlib29sICJFRkktYmFzZWQgRnJhbWVidWZmZXIgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFg4NgotCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKLQlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCi0Jc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKLQloZWxwCi0JICBUaGlzIGlzIHRoZSBFRkkgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIuIElmIHRoZSBmaXJtd2FyZSBvbgotCSAgeW91ciBwbGF0Zm9ybSBpcyBVRUZJMi4wLCBzZWxlY3QgWSB0byBhZGQgc3VwcG9ydCBmb3IKLQkgIEdyYXBoaWNzIE91dHB1dCBQcm90b2NvbCBmb3IgZWFybHkgY29uc29sZSBtZXNzYWdlcyB0byBhcHBlYXIuCi0KLWNvbmZpZyBGQl9JTUFDCi0JYm9vbCAiSW50ZWwtYmFzZWQgTWFjaW50b3NoIEZyYW1lYnVmZmVyIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBYODYgJiYgRUZJCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAogCWhlbHAKLQkgIFRoaXMgaXMgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZHJpdmVyIGZvciB0aGUgSW50ZWwtYmFzZWQgTWFjaW50b3NoCisJICBUaGlzIGlzIHRoZSBFRkkgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIuIElmIHRoZSBmaXJtd2FyZSBvbgorCSAgeW91ciBwbGF0Zm9ybSBpcyBFRkkgMS4xMCBvciBVRUZJIDIuMCwgc2VsZWN0IFkgdG8gYWRkIHN1cHBvcnQgZm9yCisJICB1c2luZyB0aGUgRUZJIGZyYW1lYnVmZmVyIGFzIHlvdXIgY29uc29sZS4KIAogY29uZmlnIEZCX040MTEKICAgICAgICB0cmlzdGF0ZSAiTjQxMSBBcG9sbG8vSGVjdWJhIGRldmtpdCBzdXBwb3J0IgpAQCAtMTEyNCw2ICsxMTI2LDcgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEZCX0JPT1RfVkVTQV9TVVBQT1JUCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9uLWJvYXJkIGdyYXBoaWNzIGJ1aWx0IGluIHRvIHRoZSBJbnRlbAogICAgICAgICAgIDgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHLzkxNUcvOTE1R00vOTQ1Ry85NDVHTS85NjVHLzk2NUdNIGNoaXBzZXRzLgpAQCAtMTQ3Niw2ICsxNDc5LDcgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEZCX0JPT1RfVkVTQV9TVVBQT1JUCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTaVMgMzAwLCAzMTUsIDMzMAogCSAgYW5kIDM0MCBzZXJpZXMgYXMgd2VsbCBhcyBYR0kgVjNYVCwgVjUsIFY4LCBaNyBncmFwaGljcyBjaGlwc2V0cy4KQEAgLTE0OTgsNiArMTUwMiwyNCBAQAogCSAgKDMxNS9IL1BSTywgNTV4LCA2NTAsIDY1MSwgNzQwLCAzMzAsIDY2MSwgNzQxLCA3NjAsIDc2MSkgYXMgd2VsbAogCSAgYXMgWEdJIFYzWFQsIFY1LCBWOCBhbmQgWjcuCiAKK2NvbmZpZyBGQl9WSUEKKyAgICAgICB0cmlzdGF0ZSAiVklBIFVuaUNocm9tZSAoUHJvKSBhbmQgQ2hyb21lOSBkaXNwbGF5IHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBGQiAmJiBQQ0kKKyAgICAgICBzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisgICAgICAgc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorICAgICAgIHNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisgICAgICAgc2VsZWN0IEZCX1NPRlRfQ1VSU09SCisgICAgICAgc2VsZWN0IEkyQ19BTEdPQklUCisgICAgICAgc2VsZWN0IEkyQworICAgICAgIGhlbHAKKwkgIFRoaXMgaXMgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZHJpdmVyIGZvciBHcmFwaGljcyBjaGlwcyBvZiBWSUEKKwkgIFVuaUNocm9tZSAoUHJvKSBGYW1pbHkgKENMRTI2NixQTTgwMC9DTjQwMCxQNE04MDBDRS9QNE04MDBQcm8vCisJICBDTjcwMC9WTjgwMCxDWDcwMC9WWDcwMCxQNE04OTApIGFuZCBDaHJvbWU5IEZhbWlseSAoSzhNODkwLENOODk2CisgCSAgL1A0TTkwMCxWWDgwMCkKKwkgIFNheSBZIGlmIHlvdSBoYXZlIGEgVklBIFVuaUNocm9tZSBncmFwaGljcyBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdmlhZmIuCiBjb25maWcgRkJfTkVPTUFHSUMKIAl0cmlzdGF0ZSAiTmVvTWFnaWMgZGlzcGxheSBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgUENJCkBAIC0xNTI3LDI1ICsxNTQ5LDI1IEBACiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga3lyb2ZiLgogCiBjb25maWcgRkJfM0RGWAotCXRyaXN0YXRlICIzRGZ4IEJhbnNoZWUvVm9vZG9vMyBkaXNwbGF5IHN1cHBvcnQiCisJdHJpc3RhdGUgIjNEZnggQmFuc2hlZS9Wb29kb28zL1Zvb2RvbzUgZGlzcGxheSBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgUENJCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZSAzRGZ4IEJhbnNoZWUvVm9vZG9vMwotCSAgY2hpcHMuIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBncmFwaGljcyBib2FyZC4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZSAzRGZ4IEJhbnNoZWUsCisJICBWb29kb28zIG9yIFZTQS0xMDAgKGFrYSBWb29kb280LzUpIGNoaXBzLiBTYXkgWSBpZiB5b3UgaGF2ZQorCSAgc3VjaCBhIGdyYXBoaWNzIGJvYXJkLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0ZGZ4ZmIuCiAKIGNvbmZpZyBGQl8zREZYX0FDQ0VMCi0JYm9vbCAiM0RmeCBCYW5zaGVlL1Zvb2RvbzMgQWNjZWxlcmF0aW9uIGZ1bmN0aW9ucyAoRVhQRVJJTUVOVEFMKSIKKwlib29sICIzRGZ4IEFjY2VsZXJhdGlvbiBmdW5jdGlvbnMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBGQl8zREZYICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KLQlUaGlzIHdpbGwgY29tcGlsZSB0aGUgM0RmeCBCYW5zaGVlL1Zvb2RvbzMgZnJhbWUgYnVmZmVyIGRldmljZQotCXdpdGggYWNjZWxlcmF0aW9uIGZ1bmN0aW9ucy4KLQorCVRoaXMgd2lsbCBjb21waWxlIHRoZSAzRGZ4IEJhbnNoZWUvVm9vZG9vMy9WU0EtMTAwIGZyYW1lIGJ1ZmZlcgorCWRldmljZSBkcml2ZXIgd2l0aCBhY2NlbGVyYXRpb24gZnVuY3Rpb25zLgogCiBjb25maWcgRkJfVk9PRE9PMQogCXRyaXN0YXRlICIzRGZ4IFZvb2RvbyBHcmFwaGljcyAoc3N0MSkgc3VwcG9ydCIKQEAgLTE1ODMsNyArMTYwNSw2IEBACiAJdHJpc3RhdGUgIkN5YmVyYmxhZGUvaTEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIFBDSSAmJiBYODZfMzIgJiYgITY0QklUCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKLQlzZWxlY3QgVklERU9fU0VMRUNUCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgaXMgc3VwcG9zZWQgdG8gc3VwcG9ydCB0aGUgVHJpZGVudCBDeWJlcmJsYWRlL2kxCiAJICBncmFwaGljcyBjb3JlIGludGVncmF0ZWQgaW4gdGhlIFZJQSBWVDg2MDFBIE5vcnRoIEJyaWRnZSwKQEAgLTE2MTEsMTcgKzE2MzIsMTYgQEAKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBpcyBzdXBwb3NlZCB0byBzdXBwb3J0IGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZQotCSAgVHJpZGVudCBDeWJlclhYWFgvSW1hZ2UvQ3liZXJCbGFkZSBjaGlwcyBtb3N0bHkgZm91bmQgaW4gbGFwdG9wcworCSAgVGhpcyBpcyB0aGUgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXIgZm9yIFRyaWRlbnQgUENJL0FHUCBjaGlwc2V0cy4KKwkgIFN1cHBvcnRlZCBjaGlwc2V0IGZhbWlsaWVzIGFyZSBUR1VJIDk0NDAvOTZYWCwgM0RJbWFnZSwgQmxhZGUzRAorCSAgYW5kIEJsYWRlIFhQLgorCSAgVGhlcmUgYXJlIGFsc28gaW50ZWdyYXRlZCB2ZXJzaW9ucyBvZiB0aGVzZSBjaGlwcyBjYWxsZWQgQ3liZXJYWFhYLAorCSAgQ3liZXJJbWFnZSBvciBDeWJlckJsYWRlLiBUaGVzZSBjaGlwcyBhcmUgbW9zdGx5IGZvdW5kIGluIGxhcHRvcHMKIAkgIGJ1dCBhbHNvIG9uIHNvbWUgbW90aGVyYm9hcmRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9mYi90cmlkZW50ZmIudHh0PgogCi0JICBDeWJlcmJsYWRlL2kxIHN1cHBvcnQgd2lsbCBiZSByZW1vdmVkIHNvb24sIHVzZSB0aGUgY3libGFmYiBkcml2ZXIKLQkgIGluc3RlYWQuCi0KIAkgIFNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggYSBncmFwaGljcyBib2FyZC4KIAotCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0cmlkZW50ZmIuCiAKQEAgLTE4NzYsNiArMTg5NiwyOCBAQAogCS0tLWhlbHAtLS0KIAkgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBvbi1jaGlwIFNILU1vYmlsZSBMQ0QgY29udHJvbGxlci4KIAorY29uZmlnIEZCX1RNSU8KKwl0cmlzdGF0ZSAiVG9zaGliYSBNb2JpbGUgSU8gRnJhbWVCdWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIE1GRF9DT1JFCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCS0tLWhlbHAtLS0KKwkgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBUb3NoaWJhIE1vYmlsZSBJTyBpbnRlZ3JhdGVkIGFzIGZvdW5kCisJICBvbiB0aGUgU2hhcnAgU0wtNjAwMCBzZXJpZXMKKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuIFRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRtaW9mYi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwKKwkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRkJfVE1JT19BQ0NFTEwKKwlib29sICJ0bWlvZmIgYWNjZWxlcmF0aW9uIgorCWRlcGVuZHMgb24gRkJfVE1JTworCWRlZmF1bHQgeQorCiBjb25maWcgRkJfUzNDMjQxMAogCXRyaXN0YXRlICJTM0MyNDEwIExDRCBmcmFtZWJ1ZmZlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgQVJDSF9TM0MyNDEwCkBAIC0xOTc0LDE5ICsyMDE2LDYgQEAKIAkgIGZyYW1lYnVmZmVyLiBNTDMwMCBjYXJyaWVzIGEgNjQwKjQ4MCBMQ0QgZGlzcGxheSBvbiB0aGUgYm9hcmQsCiAJICBNTDQwMyB1c2VzIGEgc3RhbmRhcmQgREIxNSBWR0EgY29ubmVjdG9yLgogCi1jb25maWcgRkJfQU0yMDBFUEQKLSAgICAgICB0cmlzdGF0ZSAiQU0tMjAwIEUtSW5rIEVQRCBkZXZraXQgc3VwcG9ydCIKLSAgICAgICBkZXBlbmRzIG9uIEZCICYmIEFSQ0hfUFhBICYmIE1NVQotICAgICAgIHNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKLSAgICAgICBzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCi0gICAgICAgc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKLSAgICAgICBzZWxlY3QgRkJfU1lTX0ZPUFMKLSAgICAgICBzZWxlY3QgRkJfREVGRVJSRURfSU8KLSAgICAgICBzZWxlY3QgRkJfTUVUUk9OT01FCi0gICAgICAgaGVscAotICAgICAgICAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNZXRyb25vbWUgZGlzcGxheSBjb250cm9sbGVyIHVzZWQgb24KLSAgICAgICAgIHRoZSBFLUluayBBTS0yMDAgRVBEIGRldmtpdC4KLQogY29uZmlnIEZCX0NPQkFMVAogCXRyaXN0YXRlICJDb2JhbHQgc2VydmVyIExDRCBmcmFtZSBidWZmZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIE1JUFNfQ09CQUxUCkBAIC0yMDQxLDYgKzIwNzAsMTkgQEAKIAkgIGZyYW1lIGJ1ZmZlciBkcml2ZXIuICBJdCBjb21tdW5pY2F0ZXMgd2l0aCBhIGJhY2stZW5kCiAJICBpbiBhbm90aGVyIGRvbWFpbi4KIAorY29uZmlnIEZCX01FVFJPTk9NRQorCXRyaXN0YXRlICJFLUluayBNZXRyb25vbWUvOHRyYWNrIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCCisJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAorCXNlbGVjdCBGQl9TWVNfQ09QWUFSRUEKKwlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVAorCXNlbGVjdCBGQl9TWVNfRk9QUworCXNlbGVjdCBGQl9ERUZFUlJFRF9JTworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIEUtSW5rIE1ldHJvbm9tZQorCSAgY29udHJvbGxlci4gVGhlIHByZS1yZWxlYXNlIG5hbWUgZm9yIHRoaXMgZGV2aWNlIHdhcyA4dHJhY2sKKwkgIGFuZCBjb3VsZCBhbHNvIGhhdmUgYmVlbiBjYWxsZWQgYnkgc29tZSB2ZW5kb3JzIGFzIFBWSS1ubm5uLgorCiBzb3VyY2UgImRyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCBhNmI1NTI5Li4yNDhiZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDYgQEAKIAogIyBIYXJkd2FyZSBzcGVjaWZpYyBkcml2ZXJzIGdvIGZpcnN0CiBvYmotJChDT05GSUdfRkJfQU1JR0EpICAgICAgICAgICAgKz0gYW1pZmIubyBjMnAubwotb2JqLSQoQ09ORklHX0ZCX0FNMjAwRVBEKSAgICAgICAgICs9IGFtMjAwZXBkLm8KIG9iai0kKENPTkZJR19GQl9BUkMpICAgICAgICAgICAgICArPSBhcmNmYi5vCiBvYmotJChDT05GSUdfRkJfQ0xQUzcxMVgpICAgICAgICAgKz0gY2xwczcxMXhmYi5vCiBvYmotJChDT05GSUdfRkJfQ1lCRVIyMDAwKSAgICAgICAgKz0gY3liZXIyMDAwZmIubwpAQCAtNDMsNiArNDIsNyBAQAogb2JqLSQoQ09ORklHX0ZCX0FUWTEyOCkJCSAgKz0gYXR5LyBtYWNtb2Rlcy5vCiBvYmotJChDT05GSUdfRkJfUkFERU9OKQkJICArPSBhdHkvCiBvYmotJChDT05GSUdfRkJfU0lTKQkJICArPSBzaXMvCitvYmotJChDT05GSUdfRkJfVklBKQkJICArPSB2aWEvCiBvYmotJChDT05GSUdfRkJfS1lSTykgICAgICAgICAgICAgKz0ga3lyby8KIG9iai0kKENPTkZJR19GQl9TQVZBR0UpCQkgICs9IHNhdmFnZS8KIG9iai0kKENPTkZJR19GQl9HRU9ERSkJCSAgKz0gZ2VvZGUvCkBAIC05OCw2ICs5OCw3IEBACiBvYmotJChDT05GSUdfRkJfQVNJTElBTlQpCSAgKz0gYXNpbGlhbnRmYi5vCiBvYmotJChDT05GSUdfRkJfUFhBKQkJICArPSBweGFmYi5vCiBvYmotJChDT05GSUdfRkJfVzEwMCkJCSAgKz0gdzEwMGZiLm8KK29iai0kKENPTkZJR19GQl9UTUlPKQkJICArPSB0bWlvZmIubwogb2JqLSQoQ09ORklHX0ZCX0FVMTEwMCkJCSAgKz0gYXUxMTAwZmIubwogb2JqLSQoQ09ORklHX0ZCX0FVMTIwMCkJCSAgKz0gYXUxMjAwZmIubwogb2JqLSQoQ09ORklHX0ZCX1BNQUdfQUEpCSAgKz0gcG1hZy1hYS1mYi5vCkBAIC0xMjUsNyArMTI2LDYgQEAKICMgUGxhdGZvcm0gb3IgZmFsbGJhY2sgZHJpdmVycyBnbyBoZXJlCiBvYmotJChDT05GSUdfRkJfVVZFU0EpICAgICAgICAgICAgKz0gdXZlc2FmYi5vCiBvYmotJChDT05GSUdfRkJfVkVTQSkgICAgICAgICAgICAgKz0gdmVzYWZiLm8KLW9iai0kKENPTkZJR19GQl9JTUFDKSAgICAgICAgICAgICArPSBpbWFjZmIubwogb2JqLSQoQ09ORklHX0ZCX0VGSSkgICAgICAgICAgICAgICs9IGVmaWZiLm8KIG9iai0kKENPTkZJR19GQl9WR0ExNikgICAgICAgICAgICArPSB2Z2ExNmZiLm8KIG9iai0kKENPTkZJR19GQl9PRikgICAgICAgICAgICAgICArPSBvZmZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW0yMDBlcGQuYyBiL2RyaXZlcnMvdmlkZW8vYW0yMDBlcGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNWI4Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtMjAwZXBkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vYW0yMDBlcGQuYyAtLSBQbGF0Zm9ybSBkZXZpY2UgZm9yIEFNMjAwIEVQRCBraXQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEpheWEgS3VtYXIKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBMYXlvdXQgaXMgYmFzZWQgb24gc2tlbGV0b25mYi5jIGJ5IEphbWVzIFNpbW1vbnMgYW5kIEdlZXJ0IFV5dHRlcmhvZXZlbi4KLSAqCi0gKiBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgYnkgaGVscCBhbmQgZXF1aXBtZW50IHN1cHBvcnQgZnJvbSBFLUluawotICogQ29ycG9yYXRpb24uIGh0dHA6Ly9zdXBwb3J0LmVpbmsuY29tL2NvbW11bml0eQotICoKLSAqIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gdG8gYmUgdXNlZCB3aXRoIHRoZSBNZXRyb25vbWUgZGlzcGxheSBjb250cm9sbGVyLgotICogb24gdGhlIEFNMjAwIEVQRCBwcm90b3R5cGUga2l0L2RldmVsb3BtZW50IGtpdCB3aXRoIGFuIEUtSW5rIDgwMHg2MDAKLSAqIFZpenBsZXggRVBEIG9uIGEgR3Vtc3RpeCBib2FyZCB1c2luZyB0aGUgTHlyZSBpbnRlcmZhY2UgYm9hcmQuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPHZpZGVvL21ldHJvbm9tZWZiLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0KLS8qIHJlZ2lzdGVyIG9mZnNldHMgZm9yIGdwaW8gY29udHJvbCAqLwotI2RlZmluZSBMRURfR1BJT19QSU4gNTEKLSNkZWZpbmUgU1REQllfR1BJT19QSU4gNDgKLSNkZWZpbmUgUlNUX0dQSU9fUElOIDQ5Ci0jZGVmaW5lIFJEWV9HUElPX1BJTiAzMgotI2RlZmluZSBFUlJfR1BJT19QSU4gMTcKLSNkZWZpbmUgUENCUFdSX0dQSU9fUElOIDE2Ci0KLSNkZWZpbmUgQUZfU0VMX0dQSU9fTiAweDMKLSNkZWZpbmUgR0FGUjBfVV9PRkZTRVQocGluKSAoKHBpbiAtIDE2KSAqIDIpCi0jZGVmaW5lIEdBRlIxX0xfT0ZGU0VUKHBpbikgKChwaW4gLSAzMikgKiAyKQotI2RlZmluZSBHQUZSMV9VX09GRlNFVChwaW4pICgocGluIC0gNDgpICogMikKLSNkZWZpbmUgR1BEUjFfT0ZGU0VUKHBpbikgKHBpbiAtIDMyKQotI2RlZmluZSBHUENSMV9PRkZTRVQocGluKSAocGluIC0gMzIpCi0jZGVmaW5lIEdQU1IxX09GRlNFVChwaW4pIChwaW4gLSAzMikKLSNkZWZpbmUgR1BDUjBfT0ZGU0VUKHBpbikgKHBpbikKLSNkZWZpbmUgR1BTUjBfT0ZGU0VUKHBpbikgKHBpbikKLQotc3RhdGljIHZvaWQgYW0yMDBfc2V0X2dwaW9fb3V0cHV0KGludCBwaW4sIGludCB2YWwpCi17Ci0JdTggaW5kZXg7Ci0KLQlpbmRleCA9IHBpbiA+PiA0OwotCi0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgMToKLQkJaWYgKHZhbCkKLQkJCUdQU1IwIHw9ICgxIDw8IEdQU1IwX09GRlNFVChwaW4pKTsKLQkJZWxzZQotCQkJR1BDUjAgfD0gKDEgPDwgR1BDUjBfT0ZGU0VUKHBpbikpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJaWYgKHZhbCkKLQkJCUdQU1IxIHw9ICgxIDw8IEdQU1IxX09GRlNFVChwaW4pKTsKLQkJZWxzZQotCQkJR1BDUjEgfD0gKDEgPDwgR1BDUjFfT0ZGU0VUKHBpbikpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgInVuaW1wbGVtZW50ZWRcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGFtMjAwX2luaXRfZ3Bpb19waW4oaW50IHBpbiwgaW50IGRpcikKLXsKLQl1OCBpbmRleDsKLQkvKiBkaXIgMCBpcyBvdXRwdXQsIDEgaXMgaW5wdXQKLQktIGRvIDIgdGhpbmdzIGhlcmU6Ci0JLSBzZXQgZ3BpbyBhbHRlcm5hdGUgZnVuY3Rpb24gdG8gc3RhbmRhcmQgZ3BpbwotCS0gc2V0IGdwaW8gZGlyZWN0aW9uIHRvIGlucHV0IG9yIG91dHB1dCAgKi8KLQotCWluZGV4ID0gcGluID4+IDQ7Ci0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgMToKLQkJR0FGUjBfVSAmPSB+KEFGX1NFTF9HUElPX04gPDwgR0FGUjBfVV9PRkZTRVQocGluKSk7Ci0KLQkJaWYgKGRpcikKLQkJCUdQRFIwICY9IH4oMSA8PCBwaW4pOwotCQllbHNlCi0JCQlHUERSMCB8PSAoMSA8PCBwaW4pOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCUdBRlIxX0wgJj0gfihBRl9TRUxfR1BJT19OIDw8IEdBRlIxX0xfT0ZGU0VUKHBpbikpOwotCi0JCWlmIChkaXIpCi0JCQlHUERSMSAmPSB+KDEgPDwgR1BEUjFfT0ZGU0VUKHBpbikpOwotCQllbHNlCi0JCQlHUERSMSB8PSAoMSA8PCBHUERSMV9PRkZTRVQocGluKSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJR0FGUjFfVSAmPSB+KEFGX1NFTF9HUElPX04gPDwgR0FGUjFfVV9PRkZTRVQocGluKSk7Ci0KLQkJaWYgKGRpcikKLQkJCUdQRFIxICY9IH4oMSA8PCBHUERSMV9PRkZTRVQocGluKSk7Ci0JCWVsc2UKLQkJCUdQRFIxIHw9ICgxIDw8IEdQRFIxX09GRlNFVChwaW4pKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJ1bmltcGxlbWVudGVkXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFtMjAwX2luaXRfZ3Bpb19yZWdzKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcikKLXsKLQlhbTIwMF9pbml0X2dwaW9fcGluKExFRF9HUElPX1BJTiwgMCk7Ci0JYW0yMDBfc2V0X2dwaW9fb3V0cHV0KExFRF9HUElPX1BJTiwgMCk7Ci0KLQlhbTIwMF9pbml0X2dwaW9fcGluKFNUREJZX0dQSU9fUElOLCAwKTsKLQlhbTIwMF9zZXRfZ3Bpb19vdXRwdXQoU1REQllfR1BJT19QSU4sIDApOwotCi0JYW0yMDBfaW5pdF9ncGlvX3BpbihSU1RfR1BJT19QSU4sIDApOwotCWFtMjAwX3NldF9ncGlvX291dHB1dChSU1RfR1BJT19QSU4sIDApOwotCi0JYW0yMDBfaW5pdF9ncGlvX3BpbihSRFlfR1BJT19QSU4sIDEpOwotCi0JYW0yMDBfaW5pdF9ncGlvX3BpbihFUlJfR1BJT19QSU4sIDEpOwotCi0JYW0yMDBfaW5pdF9ncGlvX3BpbihQQ0JQV1JfR1BJT19QSU4sIDApOwotCWFtMjAwX3NldF9ncGlvX291dHB1dChQQ0JQV1JfR1BJT19QSU4sIDApOwotfQotCi1zdGF0aWMgdm9pZCBhbTIwMF9kaXNhYmxlX2xjZF9jb250cm9sbGVyKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcikKLXsKLQlMQ1NSID0gMHhmZmZmZmZmZjsJLyogQ2xlYXIgTENEIFN0YXR1cyBSZWdpc3RlciAqLwotCUxDQ1IwIHw9IExDQ1IwX0RJUzsJLyogRGlzYWJsZSBMQ0QgQ29udHJvbGxlciAqLwotCi0JLyogd2UgcmVzZXQgYW5kIGp1c3Qgd2FpdCBmb3IgdGhpbmdzIHRvIHNldHRsZSAqLwotCW1zbGVlcCgyMDApOwotfQotCi1zdGF0aWMgdm9pZCBhbTIwMF9lbmFibGVfbGNkX2NvbnRyb2xsZXIoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqcGFyKQotewotCUxDU1IgPSAweGZmZmZmZmZmOwotCUZEQURSMCA9IHBhci0+bWV0cm9tZW1fZGVzY19kbWE7Ci0JTENDUjAgfD0gTENDUjBfRU5COwotfQotCi1zdGF0aWMgdm9pZCBhbTIwMF9pbml0X2xjZGNfcmVncyhzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIpCi17Ci0JLyogaGVyZSB3ZSBkbzoKLQktIGRpc2FibGUgdGhlIGxjZCBjb250cm9sbGVyCi0JLSBzZXR1cCBsY2QgY29udHJvbCByZWdpc3RlcnMKLQktIHNldHVwIGRtYSBkZXNjcmlwdG9yCi0JLSByZWVuYWJsZSBsY2QgY29udHJvbGxlcgotCSovCi0KLQkvKiBkaXNhYmxlIHRoZSBsY2QgY29udHJvbGxlciAqLwotCWFtMjAwX2Rpc2FibGVfbGNkX2NvbnRyb2xsZXIocGFyKTsKLQotCS8qIHNldHVwIGxjZCBjb250cm9sIHJlZ2lzdGVycyAqLwotCUxDQ1IwID0gTENDUjBfTERNIHwgTENDUjBfU0ZNIHwgTENDUjBfSVVNIHwgTENDUjBfRUZNIHwgTENDUjBfUEFTCi0JCXwgTENDUjBfUURNIHwgTENDUjBfQk0gfCBMQ0NSMF9PVU07Ci0KLQlMQ0NSMSA9IChwYXItPmluZm8tPnZhci54cmVzLzIgLSAxKSAvKiBwaXhlbHMgcGVyIGxpbmUgKi8KLQkJfCAoMjcgPDwgMTApIC8qIGhzeW5jIHB1bHNlIHdpZHRoIC0gMSAqLwotCQl8ICgzMyA8PCAxNikgLyogZW9sIHBpeGVsIGNvdW50ICovCi0JCXwgKDMzIDw8IDI0KTsgLyogYm9sIHBpeGVsIGNvdW50ICovCi0KLQlMQ0NSMiA9IChwYXItPmluZm8tPnZhci55cmVzIC0gMSkgLyogbGluZXMgcGVyIHBhbmVsICovCi0JCXwgKDI0IDw8IDEwKSAvKiB2c3luYyBwdWxzZSB3aWR0aCAtIDEgKi8KLQkJfCAoMiA8PCAxNikgLyogZW9mIHBpeGVsIGNvdW50ICovCi0JCXwgKDAgPDwgMjQpOyAvKiBib2YgcGl4ZWwgY291bnQgKi8KLQotCUxDQ1IzID0gMiAvKiBwaXhlbCBjbG9jayBkaXZpc29yICovCi0JCXwgKDI0IDw8IDgpIC8qIEFDIEJpYXMgcGluIGZyZXEgKi8KLQkJfCBMQ0NSM18xNkJQUCAvKiBCUFAgKi8KLQkJfCBMQ0NSM19QQ1A7ICAvKiBQQ1AgZmFsbGluZyBlZGdlICovCi0KLX0KLQotc3RhdGljIHZvaWQgYW0yMDBfcG9zdF9kbWFfc2V0dXAoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqcGFyKQotewotCXBhci0+bWV0cm9tZW1fZGVzYy0+bUZEQURSMCA9IHBhci0+bWV0cm9tZW1fZGVzY19kbWE7Ci0JcGFyLT5tZXRyb21lbV9kZXNjLT5tRlNBRFIwID0gcGFyLT5tZXRyb21lbV9kbWE7Ci0JcGFyLT5tZXRyb21lbV9kZXNjLT5tRklEUjAgPSAwOwotCXBhci0+bWV0cm9tZW1fZGVzYy0+bUxEQ01EMCA9IHBhci0+aW5mby0+dmFyLnhyZXMKLQkJCQkJKiBwYXItPmluZm8tPnZhci55cmVzOwotCWFtMjAwX2VuYWJsZV9sY2RfY29udHJvbGxlcihwYXIpOwotfQotCi1zdGF0aWMgdm9pZCBhbTIwMF9mcmVlX2lycShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlmcmVlX2lycShJUlFfR1BJTyhSRFlfR1BJT19QSU4pLCBpbmZvKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGFtMjAwX2hhbmRsZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2lkOwotCXN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGFyLT53YWl0cSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IGFtMjAwX3NldHVwX2lycShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoSVJRX0dQSU8oUkRZX0dQSU9fUElOKSwgYW0yMDBfaGFuZGxlX2lycSwKLQkJCQlJUlFGX0RJU0FCTEVELCAiQU0yMDAiLCBpbmZvKTsKLQlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW0yMDBlcGQ6IHJlcXVlc3RfaXJxIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcmV0dXJuIHNldF9pcnFfdHlwZShJUlFfR1BJTyhSRFlfR1BJT19QSU4pLCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOwotfQotCi1zdGF0aWMgdm9pZCBhbTIwMF9zZXRfcnN0KHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciwgaW50IHN0YXRlKQotewotCWFtMjAwX3NldF9ncGlvX291dHB1dChSU1RfR1BJT19QSU4sIHN0YXRlKTsKLX0KLQotc3RhdGljIHZvaWQgYW0yMDBfc2V0X3N0ZGJ5KHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciwgaW50IHN0YXRlKQotewotCWFtMjAwX3NldF9ncGlvX291dHB1dChTVERCWV9HUElPX1BJTiwgc3RhdGUpOwotfQotCi1zdGF0aWMgaW50IGFtMjAwX3dhaXRfZXZlbnQoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqcGFyKQotewotCXJldHVybiB3YWl0X2V2ZW50X3RpbWVvdXQocGFyLT53YWl0cSwgKEdQTFIxICYgMHgwMSksIEhaKTsKLX0KLQotc3RhdGljIGludCBhbTIwMF93YWl0X2V2ZW50X2ludHIoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqcGFyKQotewotCXJldHVybiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwYXItPndhaXRxLCAoR1BMUjEgJiAweDAxKSwgSFopOwotfQotCi1zdGF0aWMgc3RydWN0IG1ldHJvbm9tZV9ib2FyZCBhbTIwMF9ib2FyZCA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5mcmVlX2lycQkJPSBhbTIwMF9mcmVlX2lycSwKLQkuc2V0dXBfaXJxCQk9IGFtMjAwX3NldHVwX2lycSwKLQkuaW5pdF9ncGlvX3JlZ3MJCT0gYW0yMDBfaW5pdF9ncGlvX3JlZ3MsCi0JLmluaXRfbGNkY19yZWdzCQk9IGFtMjAwX2luaXRfbGNkY19yZWdzLAotCS5wb3N0X2RtYV9zZXR1cAkJPSBhbTIwMF9wb3N0X2RtYV9zZXR1cCwKLQkuc2V0X3JzdAkJPSBhbTIwMF9zZXRfcnN0LAotCS5zZXRfc3RkYnkJCT0gYW0yMDBfc2V0X3N0ZGJ5LAotCS5tZXRfd2FpdF9ldmVudAkJPSBhbTIwMF93YWl0X2V2ZW50LAotCS5tZXRfd2FpdF9ldmVudF9pbnRyCT0gYW0yMDBfd2FpdF9ldmVudF9pbnRyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFtMjAwX2RldmljZTsKLQotc3RhdGljIGludCBfX2luaXQgYW0yMDBfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQkvKiByZXF1ZXN0IG91ciBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkcml2ZXIgKi8KLQlyZXF1ZXN0X21vZHVsZSgibWV0cm9ub21lZmIiKTsKLQotCWFtMjAwX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygibWV0cm9ub21lZmIiLCAtMSk7Ci0JaWYgKCFhbTIwMF9kZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGFtMjAwX2RldmljZSwgJmFtMjAwX2JvYXJkLAotCQkJCQlzaXplb2YoYW0yMDBfYm9hcmQpKTsKLQotCS8qIHRoaXMgX2FkZCBiaW5kcyBtZXRyb25vbWVmYiB0byBhbTIwMC4gbWV0cm9ub21lZmIgcmVmY291bnRzIGFtMjAwICovCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhbTIwMF9kZXZpY2UpOwotCi0JaWYgKHJldCkKLQkJcGxhdGZvcm1fZGV2aWNlX3B1dChhbTIwMF9kZXZpY2UpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFtMjAwX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhbTIwMF9kZXZpY2UpOwotfQotCi1tb2R1bGVfaW5pdChhbTIwMF9pbml0KTsKLW1vZHVsZV9leGl0KGFtMjAwX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oImJvYXJkIGRyaXZlciBmb3IgYW0yMDAgbWV0cm9ub21lIGVwZCBraXQiKTsKLU1PRFVMRV9BVVRIT1IoIkpheWEgS3VtYXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYwppbmRleCA1YTI0YzY0Li5mOGQwYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCkBAIC0yMDgsNiArMjA4LDM2IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitzdGF0aWMgdm9pZCBhdG1lbF9sY2RmYl9zdG9wX25vd2FpdChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8pCit7CisJLyogVHVybiBvZmYgdGhlIExDRCBjb250cm9sbGVyIGFuZCB0aGUgRE1BIGNvbnRyb2xsZXIgKi8KKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19QV1JDT04sCisJCQlzaW5mby0+Z3VhcmRfdGltZSA8PCBBVE1FTF9MQ0RDX0dVQVJEVF9PRkZTRVQpOworCisJLyogV2FpdCBmb3IgdGhlIExDREMgY29yZSB0byBiZWNvbWUgaWRsZSAqLworCXdoaWxlIChsY2RjX3JlYWRsKHNpbmZvLCBBVE1FTF9MQ0RDX1BXUkNPTikgJiBBVE1FTF9MQ0RDX0JVU1kpCisJCW1zbGVlcCgxMCk7CisKKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19ETUFDT04sIDApOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9sY2RmYl9zdG9wKHN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbykKK3sKKwlhdG1lbF9sY2RmYl9zdG9wX25vd2FpdChzaW5mbyk7CisKKwkvKiBXYWl0IGZvciBETUEgZW5naW5lIHRvIGJlY29tZSBpZGxlLi4uICovCisJd2hpbGUgKGxjZGNfcmVhZGwoc2luZm8sIEFUTUVMX0xDRENfRE1BQ09OKSAmIEFUTUVMX0xDRENfRE1BQlVTWSkKKwkJbXNsZWVwKDEwKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfbGNkZmJfc3RhcnQoc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvKQoreworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTiwgc2luZm8tPmRlZmF1bHRfZG1hY29uKTsKKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19QV1JDT04sCisJCShzaW5mby0+Z3VhcmRfdGltZSA8PCBBVE1FTF9MQ0RDX0dVQVJEVF9PRkZTRVQpCisJCXwgQVRNRUxfTENEQ19QV1IpOworfQorCiBzdGF0aWMgdm9pZCBhdG1lbF9sY2RmYl91cGRhdGVfZG1hKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJICAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewpAQCAtMzQyLDYgKzM3MiwxMyBAQAogCXZhci0+dHJhbnNwLm9mZnNldCA9IHZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAJdmFyLT54b2Zmc2V0ID0gdmFyLT55b2Zmc2V0ID0gMDsKIAorCWlmIChpbmZvLT5maXguc21lbV9sZW4pIHsKKwkJdW5zaWduZWQgaW50IHNtZW1fbGVuID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwKKwkJCQkJICogKCh2YXItPmJpdHNfcGVyX3BpeGVsICsgNykgLyA4KSk7CisJCWlmIChzbWVtX2xlbiA+IGluZm8tPmZpeC5zbWVtX2xlbikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIFNhdHVyYXRlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHRpbWluZ3MgYXQgbWF4aW11bSB2YWx1ZXMgKi8KIAl2YXItPnZzeW5jX2xlbiA9IG1pbl90KHUzMiwgdmFyLT52c3luY19sZW4sCiAJCQkoQVRNRUxfTENEQ19WUFcgPj4gQVRNRUxfTENEQ19WUFdfT0ZGU0VUKSArIDEpOwpAQCAtMzc4LDYgKzQxNSwxMCBAQAogCQkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7CiAJCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKIAkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJfSBlbHNlIGlmIChzaW5mby0+bGNkX3dpcmluZ19tb2RlID09IEFUTUVMX0xDRENfV0lSSU5HX1JHQjU1NSkgeworCQkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7CisJCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNTsKIAkJfSBlbHNlIHsKIAkJCS8qIEJHUjo1NTUgbW9kZSAqLwogCQkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKQEAgLTQyMCwyNiArNDYxLDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JLyogTENEIHBvd2VyIG9mZiAqLwotCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX1BXUkNPTiwgc2luZm8tPmd1YXJkX3RpbWUgPDwgQVRNRUxfTENEQ19HVUFSRFRfT0ZGU0VUKTsKLQotCS8qIHdhaXQgZm9yIHRoZSBMQ0RDIGNvcmUgdG8gYmVjb21lIGlkbGUgKi8KLQl3aGlsZSAobGNkY19yZWFkbChzaW5mbywgQVRNRUxfTENEQ19QV1JDT04pICYgQVRNRUxfTENEQ19CVVNZKQotCQltc2xlZXAoMTApOwotCi0JLyogRE1BIGRpc2FibGUgKi8KLQlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19ETUFDT04sIDApOwotCi0JLyogd2FpdCBmb3IgRE1BIGVuZ2luZSB0byBiZWNvbWUgaWRsZSAqLwotCXdoaWxlIChsY2RjX3JlYWRsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTikgJiBBVE1FTF9MQ0RDX0RNQUJVU1kpCi0JCW1zbGVlcCgxMCk7Ci0KLQkvKiBMQ0QgcG93ZXIgb24gKi8KLQlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19QV1JDT04sCi0JCShzaW5mby0+Z3VhcmRfdGltZSA8PCBBVE1FTF9MQ0RDX0dVQVJEVF9PRkZTRVQpIHwgQVRNRUxfTENEQ19QV1IpOwotCi0JLyogRE1BIGVuYWJsZSAqLwotCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTiwgc2luZm8tPmRlZmF1bHRfZG1hY29uKTsKKwlhdG1lbF9sY2RmYl9zdG9wKHNpbmZvKTsKKwlhdG1lbF9sY2RmYl9zdGFydChzaW5mbyk7CiB9CiAKIC8qKgpAQCAtNDcxLDE0ICs0OTQsNyBAQAogCQkgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAogCQkgaW5mby0+dmFyLnhyZXNfdmlydHVhbCwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7CiAKLQkvKiBUdXJuIG9mZiB0aGUgTENEIGNvbnRyb2xsZXIgYW5kIHRoZSBETUEgY29udHJvbGxlciAqLwotCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX1BXUkNPTiwgc2luZm8tPmd1YXJkX3RpbWUgPDwgQVRNRUxfTENEQ19HVUFSRFRfT0ZGU0VUKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBMQ0RDIGNvcmUgdG8gYmVjb21lIGlkbGUgKi8KLQl3aGlsZSAobGNkY19yZWFkbChzaW5mbywgQVRNRUxfTENEQ19QV1JDT04pICYgQVRNRUxfTENEQ19CVVNZKQotCQltc2xlZXAoMTApOwotCi0JbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRE1BQ09OLCAwKTsKKwlhdG1lbF9sY2RmYl9zdG9wX25vd2FpdChzaW5mbyk7CiAKIAlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDEpCiAJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfTU9OTzAxOwpAQCAtNTgzLDEzICs1OTksNyBAQAogCXdoaWxlIChsY2RjX3JlYWRsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTikgJiBBVE1FTF9MQ0RDX0RNQUJVU1kpCiAJCW1zbGVlcCgxMCk7CiAKLQlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiByZS1lbmFibGUgRE1BIGVuZ2luZVxuIik7Ci0JLyogLi4uYW5kIGVuYWJsZSBpdCB3aXRoIHVwZGF0ZWQgY29uZmlndXJhdGlvbiAqLwotCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTiwgc2luZm8tPmRlZmF1bHRfZG1hY29uKTsKLQotCWRldl9kYmcoaW5mby0+ZGV2aWNlLCAiICAqIHJlLWVuYWJsZSBMQ0RDIGNvcmVcbiIpOwotCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX1BXUkNPTiwKLQkJKHNpbmZvLT5ndWFyZF90aW1lIDw8IEFUTUVMX0xDRENfR1VBUkRUX09GRlNFVCkgfCBBVE1FTF9MQ0RDX1BXUik7CisJYXRtZWxfbGNkZmJfc3RhcnQoc2luZm8pOwogCiAJZGV2X2RiZyhpbmZvLT5kZXZpY2UsICIgICogRE9ORVxuIik7CiAKQEAgLTEwMzIsMTEgKzEwNDIsMjAgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbyA9IGluZm8tPnBhcjsKIAorCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUgaW50ZXJydXB0cyB3aGlsZSB0aGUgY2xvY2sgaXMKKwkgKiBzdG9wcGVkLiBJdCBtYXkgdGFrZSBmb3JldmVyLgorCSAqLworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0lEUiwgfjBVTCk7CisKIAlzaW5mby0+c2F2ZWRfbGNkY29uID0gbGNkY19yZWFkbChzaW5mbywgQVRNRUxfTENEQ19DT05UUkFTVF9WQUwpOwogCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0NPTlRSQVNUX0NUUiwgMCk7CiAJaWYgKHNpbmZvLT5hdG1lbF9sY2RmYl9wb3dlcl9jb250cm9sKQogCQlzaW5mby0+YXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCgwKTsKKworCWF0bWVsX2xjZGZiX3N0b3Aoc2luZm8pOwogCWF0bWVsX2xjZGZiX3N0b3BfY2xvY2soc2luZm8pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNDYsOSArMTA2NSwxNSBAQAogCXN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbyA9IGluZm8tPnBhcjsKIAogCWF0bWVsX2xjZGZiX3N0YXJ0X2Nsb2NrKHNpbmZvKTsKKwlhdG1lbF9sY2RmYl9zdGFydChzaW5mbyk7CiAJaWYgKHNpbmZvLT5hdG1lbF9sY2RmYl9wb3dlcl9jb250cm9sKQogCQlzaW5mby0+YXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCgxKTsKIAlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19DT05UUkFTVF9DVFIsIHNpbmZvLT5zYXZlZF9sY2Rjb24pOworCisJLyogRW5hYmxlIEZJRk8gJiBETUEgZXJyb3JzICovCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfSUVSLCBBVE1FTF9MQ0RDX1VGTFdJCisJCQl8IEFUTUVMX0xDRENfT1dSSSB8IEFUTUVMX0xDRENfTUVSSSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2FjY2VsLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYWNjZWwuYwppbmRleCBhYTk1ZjgzLi44NzE4ZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYWNjZWwuYwpAQCAtNSw2MSArNSw2MSBAQAogICogLS1kdGUKICAqLwogCi1zdGF0aWMgdm9pZCByYWRlb25fZml4dXBfb2Zmc2V0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKKyNkZWZpbmUgRkxVU0hfQ0FDSEVfV09SS0FST1VORAkxCisKK3ZvaWQgcmFkZW9uX2ZpZm9fdXBkYXRlX2FuZF93YWl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGVudHJpZXMpCiB7Ci0JdTMyIGxvY2FsX2Jhc2U7CisJaW50IGk7CiAKLQkvKiAqKiogVWdseSB3b3JrYXJvdW5kICoqKiAqLwotCS8qCi0JICogT24gc29tZSBwbGF0Zm9ybXMsIHRoZSB2aWRlbyBtZW1vcnkgaXMgbWFwcGVkIGF0IDAgaW4gcmFkZW9uIGNoaXAgc3BhY2UKLQkgKiAobGlrZSBQUENzKSBieSB0aGUgZmlybXdhcmUuIFggd2lsbCBhbHdheXMgbW92ZSBpdCB1cCBzbyB0aGF0IGl0J3Mgc2VlbgotCSAqIGJ5IHRoZSBjaGlwIHRvIGJlIGF0IHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIFBDSSBCQVIuCi0JICogVGhhdCBtZWFucyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgZnJvbSBYLCB0aGVyZSBpcyBhIG1pc21hdGNoIGJldHdlZW4KLQkgKiB0aGUgb2Zmc2V0cyBwcm9ncmFtbWVkIGludG8gdGhlIGVuZ2luZS4gVGhpcyBtZWFucyB0aGF0IHBvdGVudGlhbGx5LAotCSAqIGFjY2VsIG9wZXJhdGlvbnMgZG9uZSBiZWZvcmUgcmFkZW9uZmIgaGFzIGEgY2hhbmNlIHRvIHJlLWluaXQgdGhlIGVuZ2luZQotCSAqIHdpbGwgaGF2ZSBpbmNvcnJlY3Qgb2Zmc2V0cywgYW5kIHBvdGVudGlhbGx5IHRyYXNoIHN5c3RlbSBtZW1vcnkgIQotCSAqCi0JICogVGhlIGNvcnJlY3QgZml4IGlzIGZvciBmYmNvbiB0byBuZXZlciBjYWxsIGFueSBhY2NlbCBvcCBiZWZvcmUgdGhlIGVuZ2luZQotCSAqIGhhcyBwcm9wZXJseSBiZWVuIHJlLWluaXRpYWxpemVkIChieSBhIGNhbGwgdG8gc2V0X3ZhciksIGJ1dCB0aGlzIGlzIGEKLQkgKiBjb21wbGV4IGZpeC4gVGhpcyB3b3JrYXJvdW5kIGluIHRoZSBtZWFudGltZSwgY2FsbGVkIGJlZm9yZSBldmVyeSBhY2NlbAotCSAqIG9wZXJhdGlvbiwgbWFrZXMgc3VyZSB0aGUgb2Zmc2V0cyBhcmUgaW4gc3luYy4KLQkgKi8KKwlmb3IgKGk9MDsgaTwyMDAwMDAwOyBpKyspIHsKKwkJcmluZm8tPmZpZm9fZnJlZSA9IElOUkVHKFJCQk1fU1RBVFVTKSAmIDB4N2Y7CisJCWlmIChyaW5mby0+Zmlmb19mcmVlID49IGVudHJpZXMpCisJCQlyZXR1cm47CisJCXVkZWxheSgxMCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAicmFkZW9uZmI6IEZJRk8gVGltZW91dCAhXG4iKTsKKwkvKiBYWFggVG9kbzogYXR0ZW1wdCB0byByZXNldCB0aGUgZW5naW5lICovCit9CiAKLQlyYWRlb25fZmlmb193YWl0ICgxKTsKLQlsb2NhbF9iYXNlID0gSU5SRUcoTUNfRkJfTE9DQVRJT04pIDw8IDE2OwotCWlmIChsb2NhbF9iYXNlID09IHJpbmZvLT5mYl9sb2NhbF9iYXNlKQorc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9maWZvX3dhaXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCBpbnQgZW50cmllcykKK3sKKwlpZiAoZW50cmllcyA8PSByaW5mby0+Zmlmb19mcmVlKQorCQlyaW5mby0+Zmlmb19mcmVlIC09IGVudHJpZXM7CisJZWxzZQorCQlyYWRlb25fZmlmb191cGRhdGVfYW5kX3dhaXQocmluZm8sIGVudHJpZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uZmJfc2V0X2NyZWcoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1MzIgcmVnLAorCQkJCSAgICAgdTMyICpjYWNoZSwgdTMyIG5ld192YWwpCit7CisJaWYgKG5ld192YWwgPT0gKmNhY2hlKQogCQlyZXR1cm47Ci0KLQlyaW5mby0+ZmJfbG9jYWxfYmFzZSA9IGxvY2FsX2Jhc2U7Ci0KLQlyYWRlb25fZmlmb193YWl0ICgzKTsKLQlPVVRSRUcoREVGQVVMVF9QSVRDSF9PRkZTRVQsIChyaW5mby0+cGl0Y2ggPDwgMHgxNikgfAotCQkJCSAgICAgKHJpbmZvLT5mYl9sb2NhbF9iYXNlID4+IDEwKSk7Ci0JT1VUUkVHKERTVF9QSVRDSF9PRkZTRVQsIChyaW5mby0+cGl0Y2ggPDwgMHgxNikgfCAocmluZm8tPmZiX2xvY2FsX2Jhc2UgPj4gMTApKTsKLQlPVVRSRUcoU1JDX1BJVENIX09GRlNFVCwgKHJpbmZvLT5waXRjaCA8PCAweDE2KSB8IChyaW5mby0+ZmJfbG9jYWxfYmFzZSA+PiAxMCkpOworCSpjYWNoZSA9IG5ld192YWw7CisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgMSk7CisJT1VUUkVHKHJlZywgbmV3X3ZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJhZGVvbmZiX3ByaW1fZmlsbHJlY3Qoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCAKIAkJCQkgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlZ2lvbikKIHsKLQlyYWRlb25fZmlmb193YWl0KDQpOyAgCi0gIAotCU9VVFJFRyhEUF9HVUlfTUFTVEVSX0NOVEwsICAKLQkJcmluZm8tPmRwX2d1aV9tYXN0ZXJfY250bCAgLyogY29udGFpbnMsIGxpa2UgR01DX0RTVF8zMkJQUCAqLwotICAgICAgICAgICAgICAgIHwgR01DX0JSVVNIX1NPTElEX0NPTE9SCi0gICAgICAgICAgICAgICAgfCBST1AzX1ApOwotCWlmIChyYWRlb25fZ2V0X2RzdGJwcChyaW5mby0+ZGVwdGgpICE9IERTVF84QlBQKQotCQlPVVRSRUcoRFBfQlJVU0hfRlJHRF9DTFIsIHJpbmZvLT5wc2V1ZG9fcGFsZXR0ZVtyZWdpb24tPmNvbG9yXSk7Ci0JZWxzZQotCQlPVVRSRUcoRFBfQlJVU0hfRlJHRF9DTFIsIHJlZ2lvbi0+Y29sb3IpOwotCU9VVFJFRyhEUF9XUklURV9NU0ssIDB4ZmZmZmZmZmYpOwotCU9VVFJFRyhEUF9DTlRMLCAoRFNUX1hfTEVGVF9UT19SSUdIVCB8IERTVF9ZX1RPUF9UT19CT1RUT00pKTsKKwlyYWRlb25mYl9zZXRfY3JlZyhyaW5mbywgRFBfR1VJX01BU1RFUl9DTlRMLCAmcmluZm8tPmRwX2d1aV9tY19jYWNoZSwKKwkJCSAgcmluZm8tPmRwX2d1aV9tY19iYXNlIHwgR01DX0JSVVNIX1NPTElEX0NPTE9SIHwgUk9QM19QKTsKKwlyYWRlb25mYl9zZXRfY3JlZyhyaW5mbywgRFBfQ05UTCwgJnJpbmZvLT5kcF9jbnRsX2NhY2hlLAorCQkJICBEU1RfWF9MRUZUX1RPX1JJR0hUIHwgRFNUX1lfVE9QX1RPX0JPVFRPTSk7CisJcmFkZW9uZmJfc2V0X2NyZWcocmluZm8sIERQX0JSVVNIX0ZSR0RfQ0xSLCAmcmluZm8tPmRwX2JydXNoX2ZnX2NhY2hlLAorCQkJICByZWdpb24tPmNvbG9yKTsKIAotCXJhZGVvbl9maWZvX3dhaXQoMik7CisJLyogRW5zdXJlIHRoZSBkc3QgY2FjaGUgaXMgZmx1c2hlZCBhbmQgdGhlIGVuZ2luZSBpZGxlIGJlZm9yZQorCSAqIGlzc3VpbmcgdGhlIG9wZXJhdGlvbi4KKwkgKgorCSAqIFRoaXMgd29ya3MgYXJvdW5kIGVuZ2luZSBsb2NrdXBzIG9uIHNvbWUgY2FyZHMKKwkgKi8KKyNpZiBGTFVTSF9DQUNIRV9XT1JLQVJPVU5ECisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgMik7CiAJT1VUUkVHKERTVENBQ0hFX0NUTFNUQVQsIFJCMkRfRENfRkxVU0hfQUxMKTsKIAlPVVRSRUcoV0FJVF9VTlRJTCwgKFdBSVRfMkRfSURMRUNMRUFOIHwgV0FJVF9ETUFfR1VJX0lETEUpKTsKLQotCXJhZGVvbl9maWZvX3dhaXQoMik7ICAKKyNlbmRpZgorCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDIpOwogCU9VVFJFRyhEU1RfWV9YLCAocmVnaW9uLT5keSA8PCAxNikgfCByZWdpb24tPmR4KTsKIAlPVVRSRUcoRFNUX1dJRFRIX0hFSUdIVCwgKHJlZ2lvbi0+d2lkdGggPDwgMTYpIHwgcmVnaW9uLT5oZWlnaHQpOwogfQpAQCAtNzAsMTUgKzcwLDE0IEBACiAJc3RydWN0IGZiX2ZpbGxyZWN0IG1vZGRlZDsKIAlpbnQgdnhyZXMsIHZ5cmVzOwogICAKLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJV0FSTl9PTihyaW5mby0+Z2Z4X21vZGUpOworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORyB8fCByaW5mby0+Z2Z4X21vZGUpCiAJCXJldHVybjsKIAlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgewogCQljZmJfZmlsbHJlY3QoaW5mbywgcmVnaW9uKTsKIAkJcmV0dXJuOwogCX0KIAotCXJhZGVvbl9maXh1cF9vZmZzZXQocmluZm8pOwotCiAJdnhyZXMgPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOwogCXZ5cmVzID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKIApAQCAtOTEsNiArOTAsMTAgQEAKIAlpZihtb2RkZWQuZHggKyBtb2RkZWQud2lkdGggID4gdnhyZXMpIG1vZGRlZC53aWR0aCAgPSB2eHJlcyAtIG1vZGRlZC5keDsKIAlpZihtb2RkZWQuZHkgKyBtb2RkZWQuaGVpZ2h0ID4gdnlyZXMpIG1vZGRlZC5oZWlnaHQgPSB2eXJlcyAtIG1vZGRlZC5keTsKIAorCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgfHwKKwkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IgKQorCQltb2RkZWQuY29sb3IgPSAoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdpb24tPmNvbG9yXTsKKwogCXJhZGVvbmZiX3ByaW1fZmlsbHJlY3QocmluZm8sICZtb2RkZWQpOwogfQogCkBAIC0xMDksMjIgKzExMiwyMiBAQAogCWlmICggeGRpciA8IDAgKSB7IHN4ICs9IHctMTsgZHggKz0gdy0xOyB9CiAJaWYgKCB5ZGlyIDwgMCApIHsgc3kgKz0gaC0xOyBkeSArPSBoLTE7IH0KIAotCXJhZGVvbl9maWZvX3dhaXQoMyk7Ci0JT1VUUkVHKERQX0dVSV9NQVNURVJfQ05UTCwKLQkJcmluZm8tPmRwX2d1aV9tYXN0ZXJfY250bCAvKiBpLmUuIEdNQ19EU1RfMzJCUFAgKi8KLQkJfCBHTUNfQlJVU0hfTk9ORQotCQl8IEdNQ19TUkNfRFNUQ09MT1IKLQkJfCBST1AzX1MgCi0JCXwgRFBfU1JDX1NPVVJDRV9NRU1PUlkgKTsKLQlPVVRSRUcoRFBfV1JJVEVfTVNLLCAweGZmZmZmZmZmKTsKLQlPVVRSRUcoRFBfQ05UTCwgKHhkaXI+PTAgPyBEU1RfWF9MRUZUX1RPX1JJR0hUIDogMCkKLQkJCXwgKHlkaXI+PTAgPyBEU1RfWV9UT1BfVE9fQk9UVE9NIDogMCkpOworCXJhZGVvbmZiX3NldF9jcmVnKHJpbmZvLCBEUF9HVUlfTUFTVEVSX0NOVEwsICZyaW5mby0+ZHBfZ3VpX21jX2NhY2hlLAorCQkJICByaW5mby0+ZHBfZ3VpX21jX2Jhc2UgfAorCQkJICBHTUNfQlJVU0hfTk9ORSB8CisJCQkgIEdNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICBST1AzX1MgfAorCQkJICBEUF9TUkNfU09VUkNFX01FTU9SWSk7CisJcmFkZW9uZmJfc2V0X2NyZWcocmluZm8sIERQX0NOVEwsICZyaW5mby0+ZHBfY250bF9jYWNoZSwKKwkJCSAgKHhkaXI+PTAgPyBEU1RfWF9MRUZUX1RPX1JJR0hUIDogMCkgfAorCQkJICAoeWRpcj49MCA/IERTVF9ZX1RPUF9UT19CT1RUT00gOiAwKSk7CiAKLQlyYWRlb25fZmlmb193YWl0KDIpOworI2lmIEZMVVNIX0NBQ0hFX1dPUktBUk9VTkQKKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAyKTsKIAlPVVRSRUcoRFNUQ0FDSEVfQ1RMU1RBVCwgUkIyRF9EQ19GTFVTSF9BTEwpOwogCU9VVFJFRyhXQUlUX1VOVElMLCAoV0FJVF8yRF9JRExFQ0xFQU4gfCBXQUlUX0RNQV9HVUlfSURMRSkpOwotCi0JcmFkZW9uX2ZpZm9fd2FpdCgzKTsKKyNlbmRpZgorCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDMpOwogCU9VVFJFRyhTUkNfWV9YLCAoc3kgPDwgMTYpIHwgc3gpOwogCU9VVFJFRyhEU1RfWV9YLCAoZHkgPDwgMTYpIHwgZHgpOwogCU9VVFJFRyhEU1RfSEVJR0hUX1dJRFRILCAoaCA8PCAxNikgfCB3KTsKQEAgLTE0MywxNSArMTQ2LDE0IEBACiAJbW9kZGVkLndpZHRoICA9IGFyZWEtPndpZHRoOwogCW1vZGRlZC5oZWlnaHQgPSBhcmVhLT5oZWlnaHQ7CiAgIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwlXQVJOX09OKHJpbmZvLT5nZnhfbW9kZSk7CisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8IHJpbmZvLT5nZnhfbW9kZSkKIAkJcmV0dXJuOwogCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7CiAJCWNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKIAkJcmV0dXJuOwogCX0KIAotCXJhZGVvbl9maXh1cF9vZmZzZXQocmluZm8pOwotCiAJdnhyZXMgPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOwogCXZ5cmVzID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKIApAQCAtMTY4LDEzICsxNzAsMTEyIEBACiAJcmFkZW9uZmJfcHJpbV9jb3B5YXJlYShyaW5mbywgJm1vZGRlZCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJhZGVvbmZiX3ByaW1faW1hZ2VibGl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywKKwkJCQkgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSwKKwkJCQkgICAgdTMyIGZnLCB1MzIgYmcpCit7CisJdW5zaWduZWQgaW50IHNyY19ieXRlcywgZHdvcmRzOworCXUzMiAqYml0czsKKworCXJhZGVvbmZiX3NldF9jcmVnKHJpbmZvLCBEUF9HVUlfTUFTVEVSX0NOVEwsICZyaW5mby0+ZHBfZ3VpX21jX2NhY2hlLAorCQkJICByaW5mby0+ZHBfZ3VpX21jX2Jhc2UgfAorCQkJICBHTUNfQlJVU0hfTk9ORSB8CisJCQkgIEdNQ19TUkNfREFUQVRZUEVfTU9OT19GR19CRyB8CisJCQkgIFJPUDNfUyB8CisJCQkgIEdNQ19CWVRFX09SREVSX01TQl9UT19MU0IgfAorCQkJICBEUF9TUkNfU09VUkNFX0hPU1RfREFUQSk7CisJcmFkZW9uZmJfc2V0X2NyZWcocmluZm8sIERQX0NOVEwsICZyaW5mby0+ZHBfY250bF9jYWNoZSwKKwkJCSAgRFNUX1hfTEVGVF9UT19SSUdIVCB8IERTVF9ZX1RPUF9UT19CT1RUT00pOworCXJhZGVvbmZiX3NldF9jcmVnKHJpbmZvLCBEUF9TUkNfRlJHRF9DTFIsICZyaW5mby0+ZHBfc3JjX2ZnX2NhY2hlLCBmZyk7CisJcmFkZW9uZmJfc2V0X2NyZWcocmluZm8sIERQX1NSQ19CS0dEX0NMUiwgJnJpbmZvLT5kcF9zcmNfYmdfY2FjaGUsIGJnKTsKKworCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDEpOworCU9VVFJFRyhEU1RfWV9YLCAoaW1hZ2UtPmR5IDw8IDE2KSB8IGltYWdlLT5keCk7CisKKwkvKiBFbnN1cmUgdGhlIGRzdCBjYWNoZSBpcyBmbHVzaGVkIGFuZCB0aGUgZW5naW5lIGlkbGUgYmVmb3JlCisJICogaXNzdWluZyB0aGUgb3BlcmF0aW9uLgorCSAqCisJICogVGhpcyB3b3JrcyBhcm91bmQgZW5naW5lIGxvY2t1cHMgb24gc29tZSBjYXJkcworCSAqLworI2lmIEZMVVNIX0NBQ0hFX1dPUktBUk9VTkQKKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAyKTsKKwlPVVRSRUcoRFNUQ0FDSEVfQ1RMU1RBVCwgUkIyRF9EQ19GTFVTSF9BTEwpOworCU9VVFJFRyhXQUlUX1VOVElMLCAoV0FJVF8yRF9JRExFQ0xFQU4gfCBXQUlUX0RNQV9HVUlfSURMRSkpOworI2VuZGlmCisKKwkvKiBYIGhlcmUgcGFkcyB3aWR0aCB0byBhIG11bHRpcGxlIG9mIDMyIGFuZCB1c2VzIHRoZSBjbGlwcGVyIHRvCisJICogYWRqdXN0IHRoZSByZXN1bHQuIElzIHRoYXQgcmVhbGx5IG5lY2Vzc2FyeSA/IFRoaW5ncyBzZWVtIHRvCisJICogd29yayBvayBmb3IgbWUgd2l0aG91dCB0aGF0IGFuZCB0aGUgZG9jbyBkb2Vzbid0IHNlZW0gdG8gaW1wbHkKKwkgKiB0aGVyZSBpcyBzdWNoIGEgcmVzdHJpY3Rpb24uCisJICovCisJT1VUUkVHKERTVF9XSURUSF9IRUlHSFQsIChpbWFnZS0+d2lkdGggPDwgMTYpIHwgaW1hZ2UtPmhlaWdodCk7CisKKwlzcmNfYnl0ZXMgPSAoKChpbWFnZS0+d2lkdGggKiBpbWFnZS0+ZGVwdGgpICsgNykgLyA4KSAqIGltYWdlLT5oZWlnaHQ7CisJZHdvcmRzID0gKHNyY19ieXRlcyArIDMpIC8gNDsKKwliaXRzID0gKHUzMiopKGltYWdlLT5kYXRhKTsKKworCXdoaWxlKGR3b3JkcyA+PSA4KSB7CisJCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDgpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwkJX19yYXdfd3JpdGVxKCooKHU2NCAqKShiaXRzKSksIHJpbmZvLT5tbWlvX2Jhc2UgKyBIT1NUX0RBVEEwKTsKKwkJX19yYXdfd3JpdGVxKCooKHU2NCAqKShiaXRzKzIpKSwgcmluZm8tPm1taW9fYmFzZSArIEhPU1RfREFUQTIpOworCQlfX3Jhd193cml0ZXEoKigodTY0ICopKGJpdHMrNCkpLCByaW5mby0+bW1pb19iYXNlICsgSE9TVF9EQVRBNCk7CisJCV9fcmF3X3dyaXRlcSgqKCh1NjQgKikoYml0cys2KSksIHJpbmZvLT5tbWlvX2Jhc2UgKyBIT1NUX0RBVEE2KTsKKwkJYml0cyArPSA4OworI2Vsc2UKKwkJX19yYXdfd3JpdGVsKCooYml0cysrKSwgcmluZm8tPm1taW9fYmFzZSArIEhPU1RfREFUQTApOworCQlfX3Jhd193cml0ZWwoKihiaXRzKyspLCByaW5mby0+bW1pb19iYXNlICsgSE9TVF9EQVRBMSk7CisJCV9fcmF3X3dyaXRlbCgqKGJpdHMrKyksIHJpbmZvLT5tbWlvX2Jhc2UgKyBIT1NUX0RBVEEyKTsKKwkJX19yYXdfd3JpdGVsKCooYml0cysrKSwgcmluZm8tPm1taW9fYmFzZSArIEhPU1RfREFUQTMpOworCQlfX3Jhd193cml0ZWwoKihiaXRzKyspLCByaW5mby0+bW1pb19iYXNlICsgSE9TVF9EQVRBNCk7CisJCV9fcmF3X3dyaXRlbCgqKGJpdHMrKyksIHJpbmZvLT5tbWlvX2Jhc2UgKyBIT1NUX0RBVEE1KTsKKwkJX19yYXdfd3JpdGVsKCooYml0cysrKSwgcmluZm8tPm1taW9fYmFzZSArIEhPU1RfREFUQTYpOworCQlfX3Jhd193cml0ZWwoKihiaXRzKyspLCByaW5mby0+bW1pb19iYXNlICsgSE9TVF9EQVRBNyk7CisjZW5kaWYKKwkJZHdvcmRzIC09IDg7CisJfQorCXdoaWxlKGR3b3Jkcy0tKSB7CisJCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDEpOworCQlfX3Jhd193cml0ZWwoKihiaXRzKyspLCByaW5mby0+bW1pb19iYXNlICsgSE9TVF9EQVRBMCk7CisJfQorfQorCiB2b2lkIHJhZGVvbmZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKIAlzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBpbmZvLT5wYXI7CisJdTMyIGZnLCBiZzsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwlXQVJOX09OKHJpbmZvLT5nZnhfbW9kZSk7CisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8IHJpbmZvLT5nZnhfbW9kZSkKIAkJcmV0dXJuOwotCXJhZGVvbl9lbmdpbmVfaWRsZSgpOworCisJaWYgKCFpbWFnZS0+d2lkdGggfHwgIWltYWdlLT5oZWlnaHQpCisJCXJldHVybjsKKworCS8qIFdlIG9ubHkgZG8gMSBicHAgY29sb3IgZXhwYW5zaW9uIGZvciBub3cgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCB8fCBpbWFnZS0+ZGVwdGggIT0gMSkKKwkJZ290byBmYWxsYmFjazsKKworCS8qIEZhbGxiYWNrIGlmIHJ1bm5pbmcgb3V0IG9mIHRoZSBzY3JlZW4uIFdlIG1heSBkbyBjbGlwcGluZworCSAqIGluIHRoZSBmdXR1cmUgKi8KKwlpZiAoKGltYWdlLT5keCArIGltYWdlLT53aWR0aCkgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8CisJICAgIChpbWFnZS0+ZHkgKyBpbWFnZS0+aGVpZ2h0KSA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCWdvdG8gZmFsbGJhY2s7CisKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKSB7CisJCWZnID0gKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJnID0gKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl07CisJfSBlbHNlIHsKKwkJZmcgPSBpbWFnZS0+ZmdfY29sb3I7CisJCWJnID0gaW1hZ2UtPmJnX2NvbG9yOworCX0KKworCXJhZGVvbmZiX3ByaW1faW1hZ2VibGl0KHJpbmZvLCBpbWFnZSwgZmcsIGJnKTsKKwlyZXR1cm47CisKKyBmYWxsYmFjazoKKwlyYWRlb25fZW5naW5lX2lkbGUocmluZm8pOwogCiAJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CiB9CkBAIC0xODUsNyArMjg2LDggQEAKIAogCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKIAkJcmV0dXJuIDA7Ci0JcmFkZW9uX2VuZ2luZV9pZGxlKCk7CisKKwlyYWRlb25fZW5naW5lX2lkbGUocmluZm8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTEsOSArMzEzLDcgQEAKIAlob3N0X3BhdGhfY250bCA9IElOUkVHKEhPU1RfUEFUSF9DTlRMKTsKIAlyYmJtX3NvZnRfcmVzZXQgPSBJTlJFRyhSQkJNX1NPRlRfUkVTRVQpOwogCi0JaWYgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjMwMCB8fAotCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzNTAgfHwKLQkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjM1MCkgeworCWlmIChJU19SMzAwX1ZBUklBTlQocmluZm8pKSB7CiAJCXUzMiB0bXA7CiAKIAkJT1VUUkVHKFJCQk1fU09GVF9SRVNFVCwgKHJiYm1fc29mdF9yZXNldCB8CkBAIC0yNDksOSArMzQ5LDcgQEAKIAlJTlJFRyhIT1NUX1BBVEhfQ05UTCk7CiAJT1VUUkVHKEhPU1RfUEFUSF9DTlRMLCBob3N0X3BhdGhfY250bCk7CiAKLQlpZiAocmluZm8tPmZhbWlseSAhPSBDSElQX0ZBTUlMWV9SMzAwICYmCi0JICAgIHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUjM1MCAmJgotCSAgICByaW5mby0+ZmFtaWx5ICE9IENISVBfRkFNSUxZX1JWMzUwKQorCWlmICghSVNfUjMwMF9WQVJJQU5UKHJpbmZvKSkKIAkJT1VUUkVHKFJCQk1fU09GVF9SRVNFVCwgcmJibV9zb2Z0X3Jlc2V0KTsKIAogCU9VVFJFRyhDTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4KTsKQEAgLTI2NSwxNSArMzYzLDI0IEBACiAJLyogZGlzYWJsZSAzRCBlbmdpbmUgKi8KIAlPVVRSRUcoUkIzRF9DTlRMLCAwKTsKIAorCXJpbmZvLT5maWZvX2ZyZWUgPSAwOwogCXJhZGVvbmZiX2VuZ2luZV9yZXNldChyaW5mbyk7CiAKLQlyYWRlb25fZmlmb193YWl0ICgxKTsKLQlpZiAoKHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUjMwMCkgJiYKLQkgICAgKHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUjM1MCkgJiYKLQkgICAgKHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUlYzNTApKQorCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDEpOworCWlmIChJU19SMzAwX1ZBUklBTlQocmluZm8pKSB7CisJCU9VVFJFRyhSQjJEX0RTVENBQ0hFX01PREUsIElOUkVHKFJCMkRfRFNUQ0FDSEVfTU9ERSkgfAorCQkgICAgICAgUkIyRF9EQ19BVVRPRkxVU0hfRU5BQkxFIHwKKwkJICAgICAgIFJCMkRfRENfRENfRElTQUJMRV9JR05PUkVfUEUpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgbmVlZHMgdG8gYmUgZG91YmxlIGNoZWNrZWQgd2l0aCBBVEkuIExhdGVzdCBYIGRyaXZlcgorCQkgKiBjb21wbGV0ZWx5ICJmb3JnZXRzIiB0byBzZXQgdGhpcyByZWdpc3RlciBvbiA8IHIzeHgsIGFuZAorCQkgKiB3ZSB1c2VkIHRvIGp1c3Qgd3JpdGUgMCB0aGVyZS4uLiBJJ2xsIGtlZXAgdGhlIDAgYW5kIHVwZGF0ZQorCQkgKiB0aGF0IHdoZW4gd2UgaGF2ZSBzb3J0ZWQgdGhpbmdzIG91dCBvbiBYIHNpZGUuCisJCSAqLwogCQlPVVRSRUcoUkIyRF9EU1RDQUNIRV9NT0RFLCAwKTsKKwl9CiAKLQlyYWRlb25fZmlmb193YWl0ICgzKTsKKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAzKTsKIAkvKiBXZSByZS1yZWFkIE1DX0ZCX0xPQ0FUSU9OIGZyb20gY2FyZCBhcyBpdCBjYW4gaGF2ZSBiZWVuCiAJICogbW9kaWZpZWQgYnkgWEZyZWUgZHJpdmVycyAob3VjaCAhKQogCSAqLwpAQCAtMjg0LDQxICszOTEsNTcgQEAKIAlPVVRSRUcoRFNUX1BJVENIX09GRlNFVCwgKHJpbmZvLT5waXRjaCA8PCAweDE2KSB8IChyaW5mby0+ZmJfbG9jYWxfYmFzZSA+PiAxMCkpOwogCU9VVFJFRyhTUkNfUElUQ0hfT0ZGU0VULCAocmluZm8tPnBpdGNoIDw8IDB4MTYpIHwgKHJpbmZvLT5mYl9sb2NhbF9iYXNlID4+IDEwKSk7CiAKLQlyYWRlb25fZmlmb193YWl0ICgxKTsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAxKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KIAlPVVRSRUdQKERQX0RBVEFUWVBFLCBIT1NUX0JJR19FTkRJQU5fRU4sIH5IT1NUX0JJR19FTkRJQU5fRU4pOwogI2Vsc2UKIAlPVVRSRUdQKERQX0RBVEFUWVBFLCAwLCB+SE9TVF9CSUdfRU5ESUFOX0VOKTsKICNlbmRpZgotCXJhZGVvbl9maWZvX3dhaXQgKDIpOworCXJhZGVvbl9maWZvX3dhaXQocmluZm8sIDIpOwogCU9VVFJFRyhERUZBVUxUX1NDX1RPUF9MRUZULCAwKTsKIAlPVVRSRUcoREVGQVVMVF9TQ19CT1RUT01fUklHSFQsIChERUZBVUxUX1NDX1JJR0hUX01BWCB8CiAJCQkJCSBERUZBVUxUX1NDX0JPVFRPTV9NQVgpKTsKIAorCS8qIHNldCBkZWZhdWx0IERQX0dVSV9NQVNURVJfQ05UTCAqLwogCXRlbXAgPSByYWRlb25fZ2V0X2RzdGJwcChyaW5mby0+ZGVwdGgpOwotCXJpbmZvLT5kcF9ndWlfbWFzdGVyX2NudGwgPSAoKHRlbXAgPDwgOCkgfCBHTUNfQ0xSX0NNUF9DTlRMX0RJUyk7CisJcmluZm8tPmRwX2d1aV9tY19iYXNlID0gKCh0ZW1wIDw8IDgpIHwgR01DX0NMUl9DTVBfQ05UTF9ESVMpOwogCi0JcmFkZW9uX2ZpZm9fd2FpdCAoMSk7Ci0JT1VUUkVHKERQX0dVSV9NQVNURVJfQ05UTCwgKHJpbmZvLT5kcF9ndWlfbWFzdGVyX2NudGwgfAotCQkJCSAgICBHTUNfQlJVU0hfU09MSURfQ09MT1IgfAotCQkJCSAgICBHTUNfU1JDX0RBVEFUWVBFX0NPTE9SKSk7CisJcmluZm8tPmRwX2d1aV9tY19jYWNoZSA9IHJpbmZvLT5kcF9ndWlfbWNfYmFzZSB8CisJCUdNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCUdNQ19TUkNfREFUQVRZUEVfQ09MT1I7CisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgMSk7CisJT1VUUkVHKERQX0dVSV9NQVNURVJfQ05UTCwgcmluZm8tPmRwX2d1aV9tY19jYWNoZSk7CiAKLQlyYWRlb25fZmlmb193YWl0ICg3KTsKIAogCS8qIGNsZWFyIGxpbmUgZHJhd2luZyByZWdzICovCisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgMik7CiAJT1VUUkVHKERTVF9MSU5FX1NUQVJULCAwKTsKIAlPVVRSRUcoRFNUX0xJTkVfRU5ELCAwKTsKIAotCS8qIHNldCBicnVzaCBjb2xvciByZWdzICovCi0JT1VUUkVHKERQX0JSVVNIX0ZSR0RfQ0xSLCAweGZmZmZmZmZmKTsKLQlPVVRSRUcoRFBfQlJVU0hfQktHRF9DTFIsIDB4MDAwMDAwMDApOworCS8qIHNldCBicnVzaCBhbmQgc291cmNlIGNvbG9yIHJlZ3MgKi8KKwlyaW5mby0+ZHBfYnJ1c2hfZmdfY2FjaGUgPSAweGZmZmZmZmZmOworCXJpbmZvLT5kcF9icnVzaF9iZ19jYWNoZSA9IDB4MDAwMDAwMDA7CisJcmluZm8tPmRwX3NyY19mZ19jYWNoZSA9IDB4ZmZmZmZmZmY7CisJcmluZm8tPmRwX3NyY19iZ19jYWNoZSA9IDB4MDAwMDAwMDA7CisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgNCk7CisJT1VUUkVHKERQX0JSVVNIX0ZSR0RfQ0xSLCByaW5mby0+ZHBfYnJ1c2hfZmdfY2FjaGUpOworCU9VVFJFRyhEUF9CUlVTSF9CS0dEX0NMUiwgcmluZm8tPmRwX2JydXNoX2JnX2NhY2hlKTsKKwlPVVRSRUcoRFBfU1JDX0ZSR0RfQ0xSLCByaW5mby0+ZHBfc3JjX2ZnX2NhY2hlKTsKKwlPVVRSRUcoRFBfU1JDX0JLR0RfQ0xSLCByaW5mby0+ZHBfc3JjX2JnX2NhY2hlKTsKIAotCS8qIHNldCBzb3VyY2UgY29sb3IgcmVncyAqLwotCU9VVFJFRyhEUF9TUkNfRlJHRF9DTFIsIDB4ZmZmZmZmZmYpOwotCU9VVFJFRyhEUF9TUkNfQktHRF9DTFIsIDB4MDAwMDAwMDApOworCS8qIERlZmF1bHQgZGlyZWN0aW9uICovCisJcmluZm8tPmRwX2NudGxfY2FjaGUgPSBEU1RfWF9MRUZUX1RPX1JJR0hUIHwgRFNUX1lfVE9QX1RPX0JPVFRPTTsKKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAxKTsKKwlPVVRSRUcoRFBfQ05UTCwgcmluZm8tPmRwX2NudGxfY2FjaGUpOwogCiAJLyogZGVmYXVsdCB3cml0ZSBtYXNrICovCisJcmFkZW9uX2ZpZm9fd2FpdChyaW5mbywgMSk7CiAJT1VUUkVHKERQX1dSSVRFX01TSywgMHhmZmZmZmZmZik7CiAKLQlyYWRlb25fZW5naW5lX2lkbGUgKCk7CisJLyogRGVmYXVsdCB0byBubyBzd2FwcGluZyBvZiBob3N0IGRhdGEgKi8KKwlyYWRlb25fZmlmb193YWl0KHJpbmZvLCAxKTsKKwlPVVRSRUcoUkJCTV9HVUlDTlRMLCBSQkJNX0dVSUNOVExfSE9TVF9EQVRBX1NXQVBfTk9ORSk7CisKKwkvKiBNYWtlIHN1cmUgaXQncyBzZXR0bGVkICovCisJcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYWNrbGlnaHQuYwppbmRleCAxYTA1NmFkLi5mMzQzYmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2JhY2tsaWdodC5jCkBAIC02Niw3ICs2Niw3IEBACiAJCWxldmVsID0gYmQtPnByb3BzLmJyaWdodG5lc3M7CiAKIAlkZWxfdGltZXJfc3luYygmcmluZm8tPmx2ZHNfdGltZXIpOwotCXJhZGVvbl9lbmdpbmVfaWRsZSgpOworCXJhZGVvbl9lbmdpbmVfaWRsZShyaW5mbyk7CiAKIAlsdmRzX2dlbl9jbnRsID0gSU5SRUcoTFZEU19HRU5fQ05UTCk7CiAJaWYgKGxldmVsID4gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggNjUyMjczZS4uOWE1ODIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC04NTIsNyArODUyLDYgQEAKICAgICAgICAgaWYgKHJpbmZvLT5hc2xlZXApCiAgICAgICAgIAlyZXR1cm4gMDsKIAotCXJhZGVvbl9maWZvX3dhaXQoMik7CiAgICAgICAgIE9VVFJFRyhDUlRDX09GRlNFVCwgKCh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldCkKIAkJCSAgICAgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCkgJiB+Nyk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtODgyLDcgKzg4MSw2IEBACiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuIHJjOwogCi0JCQlyYWRlb25fZmlmb193YWl0KDIpOwogCQkJaWYgKHZhbHVlICYgMHgwMSkgewogCQkJCXRtcCA9IElOUkVHKExWRFNfR0VOX0NOVEwpOwogCkBAIC05NDAsNyArOTM4LDcgQEAKIAlpZiAocmluZm8tPmxvY2tfYmxhbmspCiAJCXJldHVybiAwOwogCi0JcmFkZW9uX2VuZ2luZV9pZGxlKCk7CisJcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKTsKIAogCXZhbCA9IElOUkVHKENSVENfRVhUX0NOVEwpOwogICAgICAgICB2YWwgJj0gfihDUlRDX0RJU1BMQVlfRElTIHwgQ1JUQ19IU1lOQ19ESVMgfApAQCAtMTA0OCw3ICsxMDQ2LDcgQEAKIAogCWlmIChyaW5mby0+YXNsZWVwKQogCQlyZXR1cm4gMDsKLQkJCisKIAlyZXR1cm4gcmFkZW9uX3NjcmVlbl9ibGFuayhyaW5mbywgYmxhbmssIDApOwogfQogCkBAIC0xMDc0LDggKzEwNzIsNiBAQAogICAgICAgICBwaW5kZXggPSByZWdubzsKIAogICAgICAgICBpZiAoIXJpbmZvLT5hc2xlZXApIHsKLQkJcmFkZW9uX2ZpZm9fd2FpdCg5KTsKLQogCQlpZiAocmluZm8tPmJwcCA9PSAxNikgewogCQkJcGluZGV4ID0gcmVnbm8gKiA4OwogCkBAIC0xMjQ0LDggKzEyNDAsNiBAQAogewogCWludCBpOwogCi0JcmFkZW9uX2ZpZm9fd2FpdCgyMCk7Ci0KIAkvKiBXb3JrYXJvdW5kIGZyb20gWEZyZWUgKi8KIAlpZiAocmluZm8tPmlzX21vYmlsaXR5KSB7CiAJICAgICAgICAvKiBBIHRlbXBvcmFsIHdvcmthcm91bmQgZm9yIHRoZSBvY2NhdGlvbmFsIGJsYW5raW5nIG9uIGNlcnRhaW4gbGFwdG9wCkBAIC0xMjg2LDExICsxMjgwLDEwIEBACiAJcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfZGF0YShyaW5mbyk7CiAKIAkvKiBTZXQgUFBMTCByZWYuIGRpdiAqLwotCWlmIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzMDAgfHwKKwlpZiAoSVNfUjMwMF9WQVJJQU5UKHJpbmZvKSB8fAogCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMzAwIHx8Ci0JICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjM1MCB8fAotCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMzUwIHx8Ci0JICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzODAgKSB7CisJICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlM0MDAgfHwKKwkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzQ4MCkgewogCQlpZiAobW9kZS0+cHBsbF9yZWZfZGl2ICYgUjMwMF9QUExMX1JFRl9ESVZfQUNDX01BU0spIHsKIAkJCS8qIFdoZW4gcmVzdG9yaW5nIGNvbnNvbGUgbW9kZSwgdXNlIHNhdmVkIFBQTExfUkVGX0RJVgogCQkJICogc2V0dGluZy4KQEAgLTEzNDIsNyArMTMzNSw3IEBACiB7CiAJc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvID0gKHN0cnVjdCByYWRlb25mYl9pbmZvICopZGF0YTsKIAotCXJhZGVvbl9lbmdpbmVfaWRsZSgpOworCXJhZGVvbl9lbmdpbmVfaWRsZShyaW5mbyk7CiAKIAlPVVRSRUcoTFZEU19HRU5fQ05UTCwgcmluZm8tPnBlbmRpbmdfbHZkc19nZW5fY250bCk7CiB9CkBAIC0xMzYwLDEwICsxMzUzLDExIEBACiAJaWYgKG5vbW9kZXNldCkKIAkJcmV0dXJuOwogCisJcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKTsKKwogCWlmICghcmVnc19vbmx5KQogCQlyYWRlb25fc2NyZWVuX2JsYW5rKHJpbmZvLCBGQl9CTEFOS19OT1JNQUwsIDApOwogCi0JcmFkZW9uX2ZpZm9fd2FpdCgzMSk7CiAJZm9yIChpPTA7IGk8MTA7IGkrKykKIAkJT1VUUkVHKGNvbW1vbl9yZWdzW2ldLnJlZywgY29tbW9uX3JlZ3NbaV0udmFsKTsKIApAQCAtMTM5MSw3ICsxMzg1LDYgQEAKIAlyYWRlb25fd3JpdGVfcGxsX3JlZ3MocmluZm8sIG1vZGUpOwogCiAJaWYgKChwcmltYXJ5X21vbiA9PSBNVF9ERlApIHx8IChwcmltYXJ5X21vbiA9PSBNVF9MQ0QpKSB7Ci0JCXJhZGVvbl9maWZvX3dhaXQoMTApOwogCQlPVVRSRUcoRlBfQ1JUQ19IX1RPVEFMX0RJU1AsIG1vZGUtPmZwX2NydGNfaF90b3RhbF9kaXNwKTsKIAkJT1VUUkVHKEZQX0NSVENfVl9UT1RBTF9ESVNQLCBtb2RlLT5mcF9jcnRjX3ZfdG90YWxfZGlzcCk7CiAJCU9VVFJFRyhGUF9IX1NZTkNfU1RSVF9XSUQsIG1vZGUtPmZwX2hfc3luY19zdHJ0X3dpZCk7CkBAIC0xNDA2LDcgKzEzOTksNiBAQAogCWlmICghcmVnc19vbmx5KQogCQlyYWRlb25fc2NyZWVuX2JsYW5rKHJpbmZvLCBGQl9CTEFOS19VTkJMQU5LLCAwKTsKIAotCXJhZGVvbl9maWZvX3dhaXQoMik7CiAJT1VUUExMKFZDTEtfRUNQX0NOVEwsIG1vZGUtPnZjbGtfZWNwX2NudGwpOwogCQogCXJldHVybjsKQEAgLTE0NjEsMTAgKzE0NTMsNyBAQAogCQkvKiBOb3QgYWxsIGNoaXAgcmV2cyBoYXZlIHRoZSBzYW1lIGZvcm1hdCBmb3IgdGhpcyByZWdpc3RlciwKIAkJICogZXh0cmFjdCB0aGUgc291cmNlIHNlbGVjdGlvbgogCQkgKi8KLQkJaWYgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjIwMCB8fAotCQkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SMzAwIHx8Ci0JCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzNTAgfHwKLQkJICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzNTApIHsKKwkJaWYgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjIwMCB8fCBJU19SMzAwX1ZBUklBTlQocmluZm8pKSB7CiAJCQlzb3VyY2UgPSAoZnAyX2dlbl9jbnRsID4+IDEwKSAmIDB4MzsKIAkJCS8qIHNvdXJjZWQgZnJvbSB0cmFuc2Zvcm0gdW5pdCwgY2hlY2sgZm9yIHRyYW5zZm9ybSB1bml0CiAJCQkgKiBvd24gc291cmNlCkBAIC0xNTYwLDcgKzE1NDksNyBAQAogCS8qIFdlIGFsd2F5cyB3YW50IGVuZ2luZSB0byBiZSBpZGxlIG9uIGEgbW9kZSBzd2l0Y2gsIGV2ZW4KIAkgKiBpZiB3ZSB3b24ndCBhY3R1YWxseSBjaGFuZ2UgdGhlIG1vZGUKIAkgKi8KLQlyYWRlb25fZW5naW5lX2lkbGUoKTsKKwlyYWRlb25fZW5naW5lX2lkbGUocmluZm8pOwogCiAJaFN5bmNTdGFydCA9IG1vZGUtPnhyZXMgKyBtb2RlLT5yaWdodF9tYXJnaW47CiAJaFN5bmNFbmQgPSBoU3luY1N0YXJ0ICsgbW9kZS0+aHN5bmNfbGVuOwpAQCAtMTg1NSw3ICsxODQ0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGZiX29wcyByYWRlb25mYl9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyCQk9IHJhZGVvbmZiX2NoZWNrX3ZhciwKQEAgLTE4NzksNiArMTg2Nyw3IEBACiAJaW5mby0+cGFyID0gcmluZm87CiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSByaW5mby0+cHNldWRvX3BhbGV0dGU7CiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVAorCQkgICAgfCBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQKIAkJICAgIHwgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEKIAkJICAgIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QKIAkJICAgIHwgRkJJTkZPX0hXQUNDRUxfWFBBTgpAQCAtMjAwNSwxMSArMTk5NCwxMSBAQAogICAgICAgICAgICAgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMyMDApIHx8CiAgICAgICAgICAgICAocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzMwMCkgfHwKICAgICAgICAgICAgIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JDNDEwKSB8fAorICAgICAgICAgICAgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlM0MDApIHx8CiAJICAgIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTNDgwKSApIHsKICAgICAgICAgICB1MzIgdG9tID0gSU5SRUcoTkJfVE9NKTsKICAgICAgICAgICB0bXAgPSAoKCgodG9tID4+IDE2KSAtICh0b20gJiAweGZmZmYpICsgMSkgPDwgNikgKiAxMDI0KTsKIAotIAkJcmFkZW9uX2ZpZm9fd2FpdCg2KTsKICAgICAgICAgICBPVVRSRUcoTUNfRkJfTE9DQVRJT04sIHRvbSk7CiAgICAgICAgICAgT1VUUkVHKERJU1BMQVlfQkFTRV9BRERSLCAodG9tICYgMHhmZmZmKSA8PCAxNik7CiAgICAgICAgICAgT1VUUkVHKENSVEMyX0RJU1BMQVlfQkFTRV9BRERSLCAodG9tICYgMHhmZmZmKSA8PCAxNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMKaW5kZXggOGM4ZmEzNS4uMmM1NTY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2kyYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYwpAQCAtMTM5LDEyICsxMzksOCBAQAogaW50IHJhZGVvbl9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGNvbm4sCiAJCQkgICAgICAgdTggKipvdXRfZWRpZCkKIHsKLQl1MzIgcmVnID0gcmluZm8tPmkyY1tjb25uLTFdLmRkY19yZWc7CiAJdTggKmVkaWQ7CiAKLQlPVVRSRUcocmVnLCBJTlJFRyhyZWcpICYKLQkJCX4oVkdBX0REQ19EQVRBX09VVFBVVCB8IFZHQV9ERENfQ0xLX09VVFBVVCkpOwotCiAJZWRpZCA9IGZiX2RkY19yZWFkKCZyaW5mby0+aTJjW2Nvbm4tMV0uYWRhcHRlcik7CiAKIAlpZiAob3V0X2VkaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCmluZGV4IDY3NWFiZGEuLjNkZjUwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCkBAIC0yNjUzLDkgKzI2NTMsOSBAQAogCiAJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkpIHsKIAkJLyogTWFrZSBzdXJlIGVuZ2luZSBpcyByZXNldCAqLwotCQlyYWRlb25fZW5naW5lX2lkbGUoKTsKKwkJcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKTsKIAkJcmFkZW9uZmJfZW5naW5lX3Jlc2V0KHJpbmZvKTsKLQkJcmFkZW9uX2VuZ2luZV9pZGxlKCk7CisJCXJhZGVvbl9lbmdpbmVfaWRsZShyaW5mbyk7CiAJfQogCiAJLyogQmxhbmsgZGlzcGxheSBhbmQgTENEICovCkBAIC0yNzY3LDcgKzI3NjcsNyBAQAogCiAJCXJpbmZvLT5hc2xlZXAgPSAwOwogCX0gZWxzZQotCQlyYWRlb25fZW5naW5lX2lkbGUoKTsKKwkJcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKTsKIAogCS8qIFJlc3RvcmUgZGlzcGxheSAmIGVuZ2luZSAqLwogCXJhZGVvbl93cml0ZV9tb2RlIChyaW5mbywgJnJpbmZvLT5zdGF0ZSwgMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaAppbmRleCBjY2JmZmZkLi5lYTBiNWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKQEAgLTUzLDYgKzUzLDcgQEAKIAlDSElQX0ZBTUlMWV9SVjM4MCwgICAgLyogUlYzNzAvUlYzODAvTTIyL00yNCAqLwogCUNISVBfRkFNSUxZX1I0MjAsICAgICAvKiBSNDIwL1I0MjMvTTE4ICovCiAJQ0hJUF9GQU1JTFlfUkM0MTAsCisJQ0hJUF9GQU1JTFlfUlM0MDAsCiAJQ0hJUF9GQU1JTFlfUlM0ODAsCiAJQ0hJUF9GQU1JTFlfTEFTVCwKIH07CkBAIC0zMzUsNyArMzM2LDE1IEBACiAJaW50CQkJbW9uMl90eXBlOwogCXU4CQkgICAgICAgICptb24yX0VESUQ7CiAKLQl1MzIJCQlkcF9ndWlfbWFzdGVyX2NudGw7CisJLyogYWNjZWwgYml0cyAqLworCXUzMgkJCWRwX2d1aV9tY19iYXNlOworCXUzMgkJCWRwX2d1aV9tY19jYWNoZTsKKwl1MzIJCQlkcF9jbnRsX2NhY2hlOworCXUzMgkJCWRwX2JydXNoX2ZnX2NhY2hlOworCXUzMgkJCWRwX2JydXNoX2JnX2NhY2hlOworCXUzMgkJCWRwX3NyY19mZ19jYWNoZTsKKwl1MzIJCQlkcF9zcmNfYmdfY2FjaGU7CisJdTMyCQkJZmlmb19mcmVlOwogCiAJc3RydWN0IHBsbF9pbmZvCQlwbGw7CiAKQEAgLTM0Nyw2ICszNTYsNyBAQAogCWludAkJCWxvY2tfYmxhbms7CiAJaW50CQkJZHluY2xrOwogCWludAkJCW5vX3NjaGVkdWxlOworCWludCAJCQlnZnhfbW9kZTsKIAllbnVtIHJhZGVvbl9wbV9tb2RlCXBtX21vZGU7CiAJcmVpbml0X2Z1bmN0aW9uX3B0ciAgICAgcmVpbml0X2Z1bmM7CiAKQEAgLTM5MSw4ICs0MDEsMTQgQEAKICNkZWZpbmUgT1VUUkVHOChhZGRyLHZhbCkJd3JpdGViKHZhbCwgKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCiAjZGVmaW5lIElOUkVHMTYoYWRkcikJCXJlYWR3KChyaW5mby0+bW1pb19iYXNlKSthZGRyKQogI2RlZmluZSBPVVRSRUcxNihhZGRyLHZhbCkJd3JpdGV3KHZhbCwgKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisKKyNpZmRlZiBDT05GSUdfUFBDCisjZGVmaW5lIElOUkVHKGFkZHIpCSAgICAgCSh7IGVpZWlvKCk7IGxkX2xlMzIocmluZm8tPm1taW9fYmFzZSsoYWRkcikpOyB9KQorI2RlZmluZSBPVVRSRUcoYWRkcix2YWwpCWRvIHsgZWllaW8oKTsgc3RfbGUzMihyaW5mby0+bW1pb19iYXNlKyhhZGRyKSwodmFsKSk7IH0gd2hpbGUoMCkKKyNlbHNlCiAjZGVmaW5lIElOUkVHKGFkZHIpCQlyZWFkbCgocmluZm8tPm1taW9fYmFzZSkrYWRkcikKICNkZWZpbmUgT1VUUkVHKGFkZHIsdmFsKQl3cml0ZWwodmFsLCAocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgX09VVFJFR1Aoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCB1MzIgYWRkciwKIAkJICAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQpAQCAtNTMzLDE2ICs1NDksMjUgQEAKIC8qCiAgKiAyRCBFbmdpbmUgaGVscGVyIHJvdXRpbmVzCiAgKi8KKworZXh0ZXJuIHZvaWQgcmFkZW9uX2ZpZm9fdXBkYXRlX2FuZF93YWl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGVudHJpZXMpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX2VuZ2luZV9mbHVzaCAoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQogewogCWludCBpOwogCi0JLyogaW5pdGlhdGUgZmx1c2ggKi8KLQlPVVRSRUdQKFJCMkRfRFNUQ0FDSEVfQ1RMU1RBVCwgUkIyRF9EQ19GTFVTSF9BTEwsCisJLyogSW5pdGlhdGUgZmx1c2ggKi8KKwlPVVRSRUdQKERTVENBQ0hFX0NUTFNUQVQsIFJCMkRfRENfRkxVU0hfQUxMLAogCSAgICAgICAgflJCMkRfRENfRkxVU0hfQUxMKTsKIAorCS8qIEVuc3VyZSBGSUZPIGlzIGVtcHR5LCBpZSwgbWFrZSBzdXJlIHRoZSBmbHVzaCBjb21tYW5kcworCSAqIGhhcyByZWFjaGVkIHRoZSBjYWNoZQorCSAqLworCXJhZGVvbl9maWZvX3VwZGF0ZV9hbmRfd2FpdChyaW5mbywgNjQpOworCisJLyogV2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlICovCiAJZm9yIChpPTA7IGkgPCAyMDAwMDAwOyBpKyspIHsKLQkJaWYgKCEoSU5SRUcoUkIyRF9EU1RDQUNIRV9DVExTVEFUKSAmIFJCMkRfRENfQlVTWSkpCisJCWlmICghKElOUkVHKERTVENBQ0hFX0NUTFNUQVQpICYgUkIyRF9EQ19CVVNZKSkKIAkJCXJldHVybjsKIAkJdWRlbGF5KDEpOwogCX0KQEAgLTU1MCwyNSArNTc1LDEyIEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkIF9yYWRlb25fZmlmb193YWl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGVudHJpZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDsgaTwyMDAwMDAwOyBpKyspIHsKLQkJaWYgKChJTlJFRyhSQkJNX1NUQVRVUykgJiAweDdmKSA+PSBlbnRyaWVzKQotCQkJcmV0dXJuOwotCQl1ZGVsYXkoMSk7Ci0JfQotCXByaW50ayhLRVJOX0VSUiAicmFkZW9uZmI6IEZJRk8gVGltZW91dCAhXG4iKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3JhZGVvbl9lbmdpbmVfaWRsZShzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX2VuZ2luZV9pZGxlKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKIHsKIAlpbnQgaTsKIAogCS8qIGVuc3VyZSBGSUZPIGlzIGVtcHR5IGJlZm9yZSB3YWl0aW5nIGZvciBpZGxlICovCi0JX3JhZGVvbl9maWZvX3dhaXQgKHJpbmZvLCA2NCk7CisJcmFkZW9uX2ZpZm9fdXBkYXRlX2FuZF93YWl0IChyaW5mbywgNjQpOwogCiAJZm9yIChpPTA7IGk8MjAwMDAwMDsgaSsrKSB7CiAJCWlmICgoKElOUkVHKFJCQk1fU1RBVFVTKSAmIEdVSV9BQ1RJVkUpKSA9PSAwKSB7CkBAIC01ODEsOCArNTkzLDYgQEAKIH0KIAogCi0jZGVmaW5lIHJhZGVvbl9lbmdpbmVfaWRsZSgpCQlfcmFkZW9uX2VuZ2luZV9pZGxlKHJpbmZvKQotI2RlZmluZSByYWRlb25fZmlmb193YWl0KGVudHJpZXMpCV9yYWRlb25fZmlmb193YWl0KHJpbmZvLGVudHJpZXMpCiAjZGVmaW5lIHJhZGVvbl9tc2xlZXAobXMpCQlfcmFkZW9uX21zbGVlcChyaW5mbyxtcykKIAogCkBAIC02MTIsNiArNjIyLDcgQEAKIGV4dGVybiBpbnQgcmFkZW9uZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCByYWRlb25mYl9lbmdpbmVfaW5pdCAoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKTsKIGV4dGVybiB2b2lkIHJhZGVvbmZiX2VuZ2luZV9yZXNldChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pOworZXh0ZXJuIHZvaWQgcmFkZW9uX2ZpeHVwX21lbV9vZmZzZXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKTsKIAogLyogT3RoZXIgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IHJhZGVvbl9zY3JlZW5fYmxhbmsoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCBpbnQgYmxhbmssIGludCBtb2RlX3N3aXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwppbmRleCA0NTJiNzcwLi5jNzJhMTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKQEAgLTI0LDYgKzI0LDEzIEBACiAJICBUbyBoYXZlIHN1cHBvcnQgZm9yIHlvdXIgc3BlY2lmaWMgTENEIHBhbmVsIHlvdSB3aWxsIGhhdmUgdG8KIAkgIHNlbGVjdCB0aGUgcHJvcGVyIGRyaXZlcnMgd2hpY2ggZGVwZW5kIG9uIHRoaXMgb3B0aW9uLgogCitjb25maWcgTENEX0NPUkdJCisJdHJpc3RhdGUgIkxDRCBQYW5lbCBzdXBwb3J0IGZvciBTSEFSUCBjb3JnaS9zcGl0eiBtb2RlbCIKKwlkZXBlbmRzIG9uIExDRF9DTEFTU19ERVZJQ0UgJiYgU1BJX01BU1RFUiAmJiBQWEFfU0hBUlBTTAorCWhlbHAKKwkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgTENEIHBhbmVscyB1c3VhbGx5IGZvdW5kIG9uIFNIQVJQCisJICBjb3JnaSAoQzd4MCkgYW5kIHNwaXR6IChDeHgwMCkgbW9kZWxzLgorCiBjb25maWcgTENEX0xUVjM1MFFWCiAJdHJpc3RhdGUgIlNhbXN1bmcgTFRWMzUwUVYgTENEIFBhbmVsIgogCWRlcGVuZHMgb24gTENEX0NMQVNTX0RFVklDRSAmJiBTUElfTUFTVEVSCkBAIC00NCw2ICs1MSwxNCBAQAogCSAgSWYgeW91IGhhdmUgYSBwYW5lbCBiYXNlZCBvbiB0aGUgSUxJOTMyMCBjb250cm9sbGVyIGNoaXAKIAkgIHRoZW4gc2F5IHkgdG8gaW5jbHVkZSBhIHBvd2VyIGRyaXZlciBmb3IgaXQuCiAKK2NvbmZpZyBMQ0RfVERPMjRNCisJdHJpc3RhdGUgIlRvcHBvbHkgVERPMjRNIExDRCBQYW5lbHMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIExDRF9DTEFTU19ERVZJQ0UgJiYgU1BJX01BU1RFUgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgVG9wcG9seSBURE8yNE0gc2VyaWVzIExDRCBwYW5lbCwgc2F5IHkgaGVyZSB0bworCSAgaW5jbHVkZSB0aGUgc3VwcG9ydCBmb3IgaXQuCisKIGNvbmZpZyBMQ0RfVkdHMjQzMkE0CiAJdHJpc3RhdGUgIlZHRzI0MzJBNCBMQ00gZGV2aWNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfTENEX1NVUFBPUlQgJiYgTENEX0NMQVNTX0RFVklDRSAmJiBTUElfTUFTVEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmluZGV4IGI0MDVhYWMuLjNlYzU1MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC0xLDEwICsxLDEyIEBACiAjIEJhY2tsaWdodCAmIExDRCBkcml2ZXJzCiAKIG9iai0kKENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFKSAgICAgKz0gbGNkLm8KK29iai0kKENPTkZJR19MQ0RfQ09SR0kpCQkgICArPSBjb3JnaV9sY2Qubwogb2JqLSQoQ09ORklHX0xDRF9MVFYzNTBRVikJICAgKz0gbHR2MzUwcXYubwogb2JqLSQoQ09ORklHX0xDRF9JTEk5MzIwKQkgICArPSBpbGk5MzIwLm8KIG9iai0kKENPTkZJR19MQ0RfUExBVEZPUk0pCSAgICs9IHBsYXRmb3JtX2xjZC5vCiBvYmotJChDT05GSUdfTENEX1ZHRzI0MzJBNCkJICAgKz0gdmdnMjQzMmE0Lm8KK29iai0kKENPTkZJR19MQ0RfVERPMjRNKQkgICArPSB0ZG8yNG0ubwogCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRSkgKz0gYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQVRNRUxfUFdNKSAgICArPSBhdG1lbC1wd20tYmwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZkNDdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfbGNkLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8qCisgKiAgTENEL0JhY2tsaWdodCBEcml2ZXIgZm9yIFNoYXJwIFphdXJ1cyBIYW5kaGVsZHMgKHZhcmlvdXMgbW9kZWxzKQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBSaWNoYXJkIFB1cmRpZQorICoKKyAqICBCYXNlZCBvbiBTaGFycCdzIDIuNCBCYWNrbGlnaHQgRHJpdmVyCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogIAlDb252ZXJ0ZWQgdG8gU1BJIGRldmljZSBiYXNlZCBMQ0QvQmFja2xpZ2h0IGRldmljZSBkcml2ZXIKKyAqICAJYnkgRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvY29yZ2lfbGNkLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvc2hhcnBzbF9wYXJhbS5oPgorCisjZGVmaW5lIFBPV0VSX0lTX09OKHB3cikJKChwd3IpIDw9IEZCX0JMQU5LX05PUk1BTCkKKworLyogUmVnaXN0ZXIgQWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0NUTF9BRFJTICAgICAweDAwCisjZGVmaW5lIFBIQUNUUkxfQURSUyAgICAweDAxCisjZGVmaW5lIERVVFlDVFJMX0FEUlMgICAweDAyCisjZGVmaW5lIFBPV0VSUkVHMF9BRFJTICAweDAzCisjZGVmaW5lIFBPV0VSUkVHMV9BRFJTICAweDA0CisjZGVmaW5lIEdQT1IzX0FEUlMgICAgICAweDA1CisjZGVmaW5lIFBJQ1RSTF9BRFJTICAgICAweDA2CisjZGVmaW5lIFBPTENUUkxfQURSUyAgICAweDA3CisKKy8qIFJlZ2lzdGVyIEJpdCBEZWZpbml0aW9ucyAqLworI2RlZmluZSBSRVNDVExfUVZHQSAgICAgMHgwMQorI2RlZmluZSBSRVNDVExfVkdBICAgICAgMHgwMAorCisjZGVmaW5lIFBPV0VSMV9WV19PTiAgICAweDAxICAvKiBWVyBTdXBwbHkgRkVUIE9OICovCisjZGVmaW5lIFBPV0VSMV9HVlNTX09OICAweDAyICAvKiBHVlNTKC04VikgUG93ZXIgU3VwcGx5IE9OICovCisjZGVmaW5lIFBPV0VSMV9WRERfT04gICAweDA0ICAvKiBWREQoOFYpLFNWU1MoLTRWKSBQb3dlciBTdXBwbHkgT04gKi8KKworI2RlZmluZSBQT1dFUjFfVldfT0ZGICAgMHgwMCAgLyogVlcgU3VwcGx5IEZFVCBPRkYgKi8KKyNkZWZpbmUgUE9XRVIxX0dWU1NfT0ZGIDB4MDAgIC8qIEdWU1MoLThWKSBQb3dlciBTdXBwbHkgT0ZGICovCisjZGVmaW5lIFBPV0VSMV9WRERfT0ZGICAweDAwICAvKiBWREQoOFYpLFNWU1MoLTRWKSBQb3dlciBTdXBwbHkgT0ZGICovCisKKyNkZWZpbmUgUE9XRVIwX0NPTV9EQ0xLIDB4MDEgIC8qIENPTSBWb2x0YWdlIERDIEJpYXMgREFDIFNlcmlhbCBEYXRhIENsb2NrICovCisjZGVmaW5lIFBPV0VSMF9DT01fRE9VVCAweDAyICAvKiBDT00gVm9sdGFnZSBEQyBCaWFzIERBQyBTZXJpYWwgRGF0YSBPdXQgKi8KKyNkZWZpbmUgUE9XRVIwX0RBQ19PTiAgIDB4MDQgIC8qIERBQyBQb3dlciBTdXBwbHkgT04gKi8KKyNkZWZpbmUgUE9XRVIwX0NPTV9PTiAgIDB4MDggIC8qIENPTSBQb3dlciBTdXBwbHkgT04gKi8KKyNkZWZpbmUgUE9XRVIwX1ZDQzVfT04gIDB4MTAgIC8qIFZDQzUgUG93ZXIgU3VwcGx5IE9OICovCisKKyNkZWZpbmUgUE9XRVIwX0RBQ19PRkYgIDB4MDAgIC8qIERBQyBQb3dlciBTdXBwbHkgT0ZGICovCisjZGVmaW5lIFBPV0VSMF9DT01fT0ZGICAweDAwICAvKiBDT00gUG93ZXIgU3VwcGx5IE9GRiAqLworI2RlZmluZSBQT1dFUjBfVkNDNV9PRkYgMHgwMCAgLyogVkNDNSBQb3dlciBTdXBwbHkgT0ZGICovCisKKyNkZWZpbmUgUElDVFJMX0lOSVRfU1RBVEUgICAgICAweDAxCisjZGVmaW5lIFBJQ1RSTF9JTklPRkYgICAgICAgICAgMHgwMgorI2RlZmluZSBQSUNUUkxfUE9XRVJfRE9XTiAgICAgIDB4MDQKKyNkZWZpbmUgUElDVFJMX0NPTV9TSUdOQUxfT0ZGICAweDA4CisjZGVmaW5lIFBJQ1RSTF9EQUNfU0lHTkFMX09GRiAgMHgxMAorCisjZGVmaW5lIFBPTENUUkxfU1lOQ19QT0xfRkFMTCAgMHgwMQorI2RlZmluZSBQT0xDVFJMX0VOX1BPTF9GQUxMICAgIDB4MDIKKyNkZWZpbmUgUE9MQ1RSTF9EQVRBX1BPTF9GQUxMICAweDA0CisjZGVmaW5lIFBPTENUUkxfU1lOQ19BQ1RfSCAgICAgMHgwOAorI2RlZmluZSBQT0xDVFJMX0VOX0FDVF9MICAgICAgIDB4MTAKKworI2RlZmluZSBQT0xDVFJMX1NZTkNfUE9MX1JJU0UgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9QT0xfUklTRSAgICAweDAwCisjZGVmaW5lIFBPTENUUkxfREFUQV9QT0xfUklTRSAgMHgwMAorI2RlZmluZSBQT0xDVFJMX1NZTkNfQUNUX0wgICAgIDB4MDAKKyNkZWZpbmUgUE9MQ1RSTF9FTl9BQ1RfSCAgICAgICAweDAwCisKKyNkZWZpbmUgUEhBQ1RSTF9QSEFTRV9NQU5VQUwgICAweDAxCisjZGVmaW5lIERFRkFVTFRfUEhBRF9RVkdBICAgICAoOSkKKyNkZWZpbmUgREVGQVVMVF9DT01BREogICAgICAgICgxMjUpCisKK3N0cnVjdCBjb3JnaV9sY2QgeworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGlfZGV2OworCXN0cnVjdCBsY2RfZGV2aWNlCSpsY2RfZGV2OworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlCSpibF9kZXY7CisKKwlpbnQJbGltaXRfbWFzazsKKwlpbnQJaW50ZW5zaXR5OworCWludAlwb3dlcjsKKwlpbnQJbW9kZTsKKwljaGFyCWJ1ZlsyXTsKKworCWludAlncGlvX2JhY2tsaWdodF9vbjsKKwlpbnQJZ3Bpb19iYWNrbGlnaHRfY29udDsKKwlpbnQJZ3Bpb19iYWNrbGlnaHRfY29udF9pbnZlcnRlZDsKKworCXZvaWQgKCpraWNrX2JhdHRlcnkpKHZvaWQpOworfTsKKworc3RhdGljIGludCBjb3JnaV9zc3BfbGNkdGdfc2VuZChzdHJ1Y3QgY29yZ2lfbGNkICpsY2QsIGludCByZWcsIHVpbnQ4X3QgdmFsKTsKKworc3RhdGljIHN0cnVjdCBjb3JnaV9sY2QgKnRoZV9jb3JnaV9sY2Q7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3JnaWJsX2ZsYWdzOworI2RlZmluZSBDT1JHSUJMX1NVU1BFTkRFRCAgICAgMHgwMQorI2RlZmluZSBDT1JHSUJMX0JBVFRMT1cgICAgICAgMHgwMgorCisvKgorICogVGhpcyBpcyBvbmx5IGEgcHN1ZWRvIEkyQyBpbnRlcmZhY2UuIFdlIGNhbid0IHVzZSB0aGUgc3RhbmRhcmQga2VybmVsCisgKiByb3V0aW5lcyBhcyB0aGUgaW50ZXJmYWNlIGlzIHdyaXRlIG9ubHkuIFdlIGp1c3QgYXNzdW1lIHRoZSBkYXRhIGlzIGFja2VkLi4uCisgKi8KK3N0YXRpYyB2b2lkIGxjZHRnX3NzcF9pMmNfc2VuZChzdHJ1Y3QgY29yZ2lfbGNkICpsY2QsIHVpbnQ4X3QgZGF0YSkKK3sKKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBPV0VSUkVHMF9BRFJTLCBkYXRhKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9iaXQoc3RydWN0IGNvcmdpX2xjZCAqbGNkLCB1aW50OF90IGRhdGEpCit7CisJbGNkdGdfc3NwX2kyY19zZW5kKGxjZCwgZGF0YSk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGxjZCwgZGF0YSB8IFBPV0VSMF9DT01fRENMSyk7CisJbGNkdGdfc3NwX2kyY19zZW5kKGxjZCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY19zZW5kX3N0YXJ0KHN0cnVjdCBjb3JnaV9sY2QgKmxjZCwgdWludDhfdCBiYXNlKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UgfCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQpOworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UgfCBQT1dFUjBfQ09NX0RDTEspOworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9zdG9wKHN0cnVjdCBjb3JnaV9sY2QgKmxjZCwgdWludDhfdCBiYXNlKQoreworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UpOworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UgfCBQT1dFUjBfQ09NX0RDTEspOworCWxjZHRnX3NzcF9pMmNfc2VuZChsY2QsIGJhc2UgfCBQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQpOworfQorCitzdGF0aWMgdm9pZCBsY2R0Z19pMmNfc2VuZF9ieXRlKHN0cnVjdCBjb3JnaV9sY2QgKmxjZCwKKwkJCQl1aW50OF90IGJhc2UsIHVpbnQ4X3QgZGF0YSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChkYXRhICYgMHg4MCkKKwkJCWxjZHRnX2kyY19zZW5kX2JpdChsY2QsIGJhc2UgfCBQT1dFUjBfQ09NX0RPVVQpOworCQllbHNlCisJCQlsY2R0Z19pMmNfc2VuZF9iaXQobGNkLCBiYXNlKTsKKwkJZGF0YSA8PD0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxjZHRnX2kyY193YWl0X2FjayhzdHJ1Y3QgY29yZ2lfbGNkICpsY2QsIHVpbnQ4X3QgYmFzZSkKK3sKKwlsY2R0Z19pMmNfc2VuZF9iaXQobGNkLCBiYXNlKTsKK30KKworc3RhdGljIHZvaWQgbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKHN0cnVjdCBjb3JnaV9sY2QgKmxjZCwKKwkJCQkgICAgIHVpbnQ4X3QgYmFzZV9kYXRhLCB1aW50OF90IGRhdGEpCit7CisJLyogU2V0IENvbW1vbiBWb2x0YWdlIHRvIE02MjMzMkZQIHZpYSBJMkMgKi8KKwlsY2R0Z19pMmNfc2VuZF9zdGFydChsY2QsIGJhc2VfZGF0YSk7CisJbGNkdGdfaTJjX3NlbmRfYnl0ZShsY2QsIGJhc2VfZGF0YSwgMHg5Yyk7CisJbGNkdGdfaTJjX3dhaXRfYWNrKGxjZCwgYmFzZV9kYXRhKTsKKwlsY2R0Z19pMmNfc2VuZF9ieXRlKGxjZCwgYmFzZV9kYXRhLCAweDAwKTsKKwlsY2R0Z19pMmNfd2FpdF9hY2sobGNkLCBiYXNlX2RhdGEpOworCWxjZHRnX2kyY19zZW5kX2J5dGUobGNkLCBiYXNlX2RhdGEsIGRhdGEpOworCWxjZHRnX2kyY193YWl0X2FjayhsY2QsIGJhc2VfZGF0YSk7CisJbGNkdGdfaTJjX3NlbmRfc3RvcChsY2QsIGJhc2VfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfc3NwX2xjZHRnX3NlbmQoc3RydWN0IGNvcmdpX2xjZCAqbGNkLCBpbnQgYWRycywgdWludDhfdCBkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkubGVuCQk9IDEsCisJCS5jc19jaGFuZ2UJPSAxLAorCQkudHhfYnVmCQk9IGxjZC0+YnVmLAorCX07CisKKwlsY2QtPmJ1ZlswXSA9ICgoYWRycyAmIDB4MDcpIDw8IDUpIHwgKGRhdGEgJiAweDFmKTsKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldHVybiBzcGlfc3luYyhsY2QtPnNwaV9kZXYsICZtc2cpOworfQorCisvKiBTZXQgUGhhc2UgQWRqdXN0ICovCitzdGF0aWMgdm9pZCBsY2R0Z19zZXRfcGhhZGFkaihzdHJ1Y3QgY29yZ2lfbGNkICpsY2QsIGludCBtb2RlKQoreworCWludCBhZGo7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQ09SR0lfTENEX01PREVfVkdBOgorCQkvKiBTZXR0aW5nIGZvciBWR0EgKi8KKwkJYWRqID0gc2hhcnBzbF9wYXJhbS5waGFkYWRqOworCQlhZGogPSAoYWRqIDwgMCkgPyBQSEFDVFJMX1BIQVNFX01BTlVBTCA6CisJCQkJICBQSEFDVFJMX1BIQVNFX01BTlVBTCB8ICgoYWRqICYgMHhmKSA8PCAxKTsKKwkJYnJlYWs7CisJY2FzZSBDT1JHSV9MQ0RfTU9ERV9RVkdBOgorCWRlZmF1bHQ6CisJCS8qIFNldHRpbmcgZm9yIFFWR0EgKi8KKwkJYWRqID0gKERFRkFVTFRfUEhBRF9RVkdBIDw8IDEpIHwgUEhBQ1RSTF9QSEFTRV9NQU5VQUw7CisJCWJyZWFrOworCX0KKworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUEhBQ1RSTF9BRFJTLCBhZGopOworfQorCitzdGF0aWMgdm9pZCBjb3JnaV9sY2RfcG93ZXJfb24oc3RydWN0IGNvcmdpX2xjZCAqbGNkKQoreworCWludCBjb21hZGo7CisKKwkvKiBJbml0aWFsaXplIEludGVybmFsIExvZ2ljICYgUG9ydCAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUElDVFJMX0FEUlMsCisJCQlQSUNUUkxfUE9XRVJfRE9XTiB8IFBJQ1RSTF9JTklPRkYgfAorCQkJUElDVFJMX0lOSVRfU1RBVEUgfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYgfAorCQkJUElDVFJMX0RBQ19TSUdOQUxfT0ZGKTsKKworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9XRVJSRUcwX0FEUlMsCisJCQlQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09GRiB8CisJCQlQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRik7CisKKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBPV0VSUkVHMV9BRFJTLAorCQkJUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT0ZGKTsKKworCS8qIFZERCgrOFYpLCBTVlNTKC00VikgT04gKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBPV0VSUkVHMV9BRFJTLAorCQkJUE9XRVIxX1ZXX09GRiB8IFBPV0VSMV9HVlNTX09GRiB8IFBPV0VSMV9WRERfT04pOworCW1kZWxheSgzKTsKKworCS8qIERBQyBPTiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9XRVJSRUcwX0FEUlMsCisJCQlQT1dFUjBfQ09NX0RDTEsgfCBQT1dFUjBfQ09NX0RPVVQgfCBQT1dFUjBfREFDX09OIHwKKwkJCVBPV0VSMF9DT01fT0ZGIHwgUE9XRVIwX1ZDQzVfT0ZGKTsKKworCS8qIElOSUIgPSBILCBJTkkgPSBMICAqLworCS8qIFBJQ1RMWzBdID0gSCAsIFBJQ1RMWzFdID0gUElDVExbMl0gPSBQSUNUTFs0XSA9IEwgKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBJQ1RSTF9BRFJTLAorCQkJUElDVFJMX0lOSVRfU1RBVEUgfCBQSUNUUkxfQ09NX1NJR05BTF9PRkYpOworCisJLyogU2V0IENvbW1vbiBWb2x0YWdlICovCisJY29tYWRqID0gc2hhcnBzbF9wYXJhbS5jb21hZGo7CisJaWYgKGNvbWFkaiA8IDApCisJCWNvbWFkaiA9IERFRkFVTFRfQ09NQURKOworCisJbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKGxjZCwgUE9XRVIwX0RBQ19PTiB8IFBPV0VSMF9DT01fT0ZGIHwKKwkJCQkgUE9XRVIwX1ZDQzVfT0ZGLCBjb21hZGopOworCisJLyogVkNDNSBPTiwgREFDIE9OICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzBfQURSUywKKwkJCVBPV0VSMF9DT01fRENMSyB8IFBPV0VSMF9DT01fRE9VVCB8IFBPV0VSMF9EQUNfT04gfAorCQkJUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PTik7CisKKwkvKiBHVlNTKC04VikgT04sIFZERCBPTiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9XRVJSRUcxX0FEUlMsCisJCQlQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT04gfCBQT1dFUjFfVkREX09OKTsKKwltZGVsYXkoMik7CisKKwkvKiBDT00gU0lHTkFMIE9OIChQSUNUTFszXSA9IEwpICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQSUNUUkxfQURSUywgUElDVFJMX0lOSVRfU1RBVEUpOworCisJLyogQ09NIE9OLCBEQUMgT04sIFZDQzVfT04gKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBPV0VSUkVHMF9BRFJTLAorCQkJUE9XRVIwX0NPTV9EQ0xLIHwgUE9XRVIwX0NPTV9ET1VUIHwgUE9XRVIwX0RBQ19PTiB8CisJCQlQT1dFUjBfQ09NX09OIHwgUE9XRVIwX1ZDQzVfT04pOworCisJLyogVlcgT04sIEdWU1MgT04sIFZERCBPTiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9XRVJSRUcxX0FEUlMsCisJCQlQT1dFUjFfVldfT04gfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCisJLyogU2lnbmFscyBvdXRwdXQgZW5hYmxlICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQSUNUUkxfQURSUywgMCk7CisKKwkvKiBTZXQgUGhhc2UgQWRqdXN0ICovCisJbGNkdGdfc2V0X3BoYWRhZGoobGNkLCBsY2QtPm1vZGUpOworCisJLyogSW5pdGlhbGl6ZSBmb3IgSW5wdXQgU2lnbmFscyBmcm9tIEFUSSAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9MQ1RSTF9BRFJTLAorCQkJUE9MQ1RSTF9TWU5DX1BPTF9SSVNFIHwgUE9MQ1RSTF9FTl9QT0xfUklTRSB8CisJCQlQT0xDVFJMX0RBVEFfUE9MX1JJU0UgfCBQT0xDVFJMX1NZTkNfQUNUX0wgfAorCQkJUE9MQ1RSTF9FTl9BQ1RfSCk7CisJdWRlbGF5KDEwMDApOworCisJc3dpdGNoIChsY2QtPm1vZGUpIHsKKwljYXNlIENPUkdJX0xDRF9NT0RFX1ZHQToKKwkJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBSRVNDVExfQURSUywgUkVTQ1RMX1ZHQSk7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfTENEX01PREVfUVZHQToKKwlkZWZhdWx0OgorCQljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFJFU0NUTF9BRFJTLCBSRVNDVExfUVZHQSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY29yZ2lfbGNkX3Bvd2VyX29mZihzdHJ1Y3QgY29yZ2lfbGNkICpsY2QpCit7CisJLyogNjBIeiB4IDIgZnJhbWUgPSAxNi43bXNlYyB4IDIgPSAzMy40IG1zZWMgKi8KKwltc2xlZXAoMzQpOworCisJLyogKDEpVlcgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzFfQURSUywKKwkJCVBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PTiB8IFBPV0VSMV9WRERfT04pOworCisJLyogKDIpQ09NIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUElDVFJMX0FEUlMsIFBJQ1RSTF9DT01fU0lHTkFMX09GRik7CisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzBfQURSUywKKwkJCVBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09OKTsKKworCS8qICgzKVNldCBDb21tb24gVm9sdGFnZSBCaWFzIDBWICovCisJbGNkdGdfc2V0X2NvbW1vbl92b2x0YWdlKGxjZCwgUE9XRVIwX0RBQ19PTiB8IFBPV0VSMF9DT01fT0ZGIHwKKwkJCVBPV0VSMF9WQ0M1X09OLCAwKTsKKworCS8qICg0KUdWU1MgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzFfQURSUywKKwkJCVBPV0VSMV9WV19PRkYgfCBQT1dFUjFfR1ZTU19PRkYgfCBQT1dFUjFfVkREX09OKTsKKworCS8qICg1KVZDQzUgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzBfQURSUywKKwkJCVBPV0VSMF9EQUNfT04gfCBQT1dFUjBfQ09NX09GRiB8IFBPV0VSMF9WQ0M1X09GRik7CisKKwkvKiAoNilTZXQgUERXTiwgSU5JT0ZGLCBEQUNPRkYgKi8KKwljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFBJQ1RSTF9BRFJTLAorCQkJUElDVFJMX0lOSU9GRiB8IFBJQ1RSTF9EQUNfU0lHTkFMX09GRiB8CisJCQlQSUNUUkxfUE9XRVJfRE9XTiB8IFBJQ1RSTF9DT01fU0lHTkFMX09GRik7CisKKwkvKiAoNylEQUMgT0ZGICovCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBQT1dFUlJFRzBfQURSUywKKwkJCVBPV0VSMF9EQUNfT0ZGIHwgUE9XRVIwX0NPTV9PRkYgfCBQT1dFUjBfVkNDNV9PRkYpOworCisJLyogKDgpVkREIE9GRiAqLworCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUE9XRVJSRUcxX0FEUlMsCisJCQlQT1dFUjFfVldfT0ZGIHwgUE9XRVIxX0dWU1NfT0ZGIHwgUE9XRVIxX1ZERF9PRkYpOworfQorCitzdGF0aWMgaW50IGNvcmdpX2xjZF9zZXRfbW9kZShzdHJ1Y3QgbGNkX2RldmljZSAqbGQsIHN0cnVjdCBmYl92aWRlb21vZGUgKm0pCit7CisJc3RydWN0IGNvcmdpX2xjZCAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZsZC0+ZGV2KTsKKwlpbnQgbW9kZSA9IENPUkdJX0xDRF9NT0RFX1FWR0E7CisKKwlpZiAobS0+eHJlcyA9PSA2NDAgfHwgbS0+eHJlcyA9PSA0ODApCisJCW1vZGUgPSBDT1JHSV9MQ0RfTU9ERV9WR0E7CisKKwlpZiAobGNkLT5tb2RlID09IG1vZGUpCisJCXJldHVybiAwOworCisJbGNkdGdfc2V0X3BoYWRhZGoobGNkLCBtb2RlKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ09SR0lfTENEX01PREVfVkdBOgorCQljb3JnaV9zc3BfbGNkdGdfc2VuZChsY2QsIFJFU0NUTF9BRFJTLCBSRVNDVExfVkdBKTsKKwkJYnJlYWs7CisJY2FzZSBDT1JHSV9MQ0RfTU9ERV9RVkdBOgorCWRlZmF1bHQ6CisJCWNvcmdpX3NzcF9sY2R0Z19zZW5kKGxjZCwgUkVTQ1RMX0FEUlMsIFJFU0NUTF9RVkdBKTsKKwkJYnJlYWs7CisJfQorCisJbGNkLT5tb2RlID0gbW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3JnaV9sY2Rfc2V0X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsZCwgaW50IHBvd2VyKQoreworCXN0cnVjdCBjb3JnaV9sY2QgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmbGQtPmRldik7CisKKwlpZiAoUE9XRVJfSVNfT04ocG93ZXIpICYmICFQT1dFUl9JU19PTihsY2QtPnBvd2VyKSkKKwkJY29yZ2lfbGNkX3Bvd2VyX29uKGxjZCk7CisKKwlpZiAoIVBPV0VSX0lTX09OKHBvd2VyKSAmJiBQT1dFUl9JU19PTihsY2QtPnBvd2VyKSkKKwkJY29yZ2lfbGNkX3Bvd2VyX29mZihsY2QpOworCisJbGNkLT5wb3dlciA9IHBvd2VyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX2xjZF9nZXRfcG93ZXIoc3RydWN0IGxjZF9kZXZpY2UgKmxkKQoreworCXN0cnVjdCBjb3JnaV9sY2QgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmbGQtPmRldik7CisKKwlyZXR1cm4gbGNkLT5wb3dlcjsKK30KKworc3RhdGljIHN0cnVjdCBsY2Rfb3BzIGNvcmdpX2xjZF9vcHMgPSB7CisJLmdldF9wb3dlcgk9IGNvcmdpX2xjZF9nZXRfcG93ZXIsCisJLnNldF9wb3dlcgk9IGNvcmdpX2xjZF9zZXRfcG93ZXIsCisJLnNldF9tb2RlCT0gY29yZ2lfbGNkX3NldF9tb2RlLAorfTsKKworc3RhdGljIGludCBjb3JnaV9ibF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgY29yZ2lfbGNkICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoJmJkLT5kZXYpOworCisJcmV0dXJuIGxjZC0+aW50ZW5zaXR5OworfQorCitzdGF0aWMgaW50IGNvcmdpX2JsX3NldF9pbnRlbnNpdHkoc3RydWN0IGNvcmdpX2xjZCAqbGNkLCBpbnQgaW50ZW5zaXR5KQoreworCWludCBjb250OworCisJaWYgKGludGVuc2l0eSA+IDB4MTApCisJCWludGVuc2l0eSArPSAweDEwOworCisJY29yZ2lfc3NwX2xjZHRnX3NlbmQobGNkLCBEVVRZQ1RSTF9BRFJTLCBpbnRlbnNpdHkpOworCisJLyogQml0IDUgdmlhIEdQSU9fQkFDS0xJR0hUX0NPTlQgKi8KKwljb250ID0gISEoaW50ZW5zaXR5ICYgMHgyMCkgXiBsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnRfaW52ZXJ0ZWQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnQpKQorCQlncGlvX3NldF92YWx1ZShsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnQsIGNvbnQpOworCisJaWYgKGdwaW9faXNfdmFsaWQobGNkLT5ncGlvX2JhY2tsaWdodF9vbikpCisJCWdwaW9fc2V0X3ZhbHVlKGxjZC0+Z3Bpb19iYWNrbGlnaHRfb24sIGludGVuc2l0eSk7CisKKwlpZiAobGNkLT5raWNrX2JhdHRlcnkpCisJCWxjZC0+a2lja19iYXR0ZXJ5KCk7CisKKwlsY2QtPmludGVuc2l0eSA9IGludGVuc2l0eTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3JnaV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgY29yZ2lfbGNkICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoJmJkLT5kZXYpOworCWludCBpbnRlbnNpdHkgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKworCWlmIChiZC0+cHJvcHMucG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJaW50ZW5zaXR5ID0gMDsKKworCWlmIChiZC0+cHJvcHMuZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJaW50ZW5zaXR5ID0gMDsKKworCWlmIChjb3JnaWJsX2ZsYWdzICYgQ09SR0lCTF9TVVNQRU5ERUQpCisJCWludGVuc2l0eSA9IDA7CisJaWYgKGNvcmdpYmxfZmxhZ3MgJiBDT1JHSUJMX0JBVFRMT1cpCisJCWludGVuc2l0eSAmPSBsY2QtPmxpbWl0X21hc2s7CisKKwlyZXR1cm4gY29yZ2lfYmxfc2V0X2ludGVuc2l0eShsY2QsIGludGVuc2l0eSk7Cit9CisKK3ZvaWQgY29yZ2libF9saW1pdF9pbnRlbnNpdHkoaW50IGxpbWl0KQoreworCWlmIChsaW1pdCkKKwkJY29yZ2libF9mbGFncyB8PSBDT1JHSUJMX0JBVFRMT1c7CisJZWxzZQorCQljb3JnaWJsX2ZsYWdzICY9IH5DT1JHSUJMX0JBVFRMT1c7CisKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyh0aGVfY29yZ2lfbGNkLT5ibF9kZXYpOworfQorRVhQT1JUX1NZTUJPTChjb3JnaWJsX2xpbWl0X2ludGVuc2l0eSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBjb3JnaV9ibF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzCT0gY29yZ2lfYmxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBjb3JnaV9ibF91cGRhdGVfc3RhdHVzLAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjb3JnaV9sY2Rfc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGNvcmdpX2xjZCAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwljb3JnaWJsX2ZsYWdzIHw9IENPUkdJQkxfU1VTUEVOREVEOworCWNvcmdpX2JsX3NldF9pbnRlbnNpdHkobGNkLCAwKTsKKwljb3JnaV9sY2Rfc2V0X3Bvd2VyKGxjZC0+bGNkX2RldiwgRkJfQkxBTktfUE9XRVJET1dOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3JnaV9sY2RfcmVzdW1lKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGNvcmdpX2xjZCAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwljb3JnaWJsX2ZsYWdzICY9IH5DT1JHSUJMX1NVU1BFTkRFRDsKKwljb3JnaV9sY2Rfc2V0X3Bvd2VyKGxjZC0+bGNkX2RldiwgRkJfQkxBTktfVU5CTEFOSyk7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMobGNkLT5ibF9kZXYpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgY29yZ2lfbGNkX3N1c3BlbmQJTlVMTAorI2RlZmluZSBjb3JnaV9sY2RfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHNldHVwX2dwaW9fYmFja2xpZ2h0KHN0cnVjdCBjb3JnaV9sY2QgKmxjZCwKKwkJCQlzdHJ1Y3QgY29yZ2lfbGNkX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBsY2QtPnNwaV9kZXY7CisJaW50IGVycjsKKworCWxjZC0+Z3Bpb19iYWNrbGlnaHRfb24gPSAtMTsKKwlsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnQgPSAtMTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2JhY2tsaWdodF9vbikpIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ncGlvX2JhY2tsaWdodF9vbiwgIkJMX09OIik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyVkIGZvciAiCisJCQkJImJhY2tsaWdodF9vblxuIiwgcGRhdGEtPmdwaW9fYmFja2xpZ2h0X29uKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlsY2QtPmdwaW9fYmFja2xpZ2h0X29uID0gcGRhdGEtPmdwaW9fYmFja2xpZ2h0X29uOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobGNkLT5ncGlvX2JhY2tsaWdodF9vbiwgMCk7CisJfQorCisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fYmFja2xpZ2h0X2NvbnQpKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdChwZGF0YS0+Z3Bpb19iYWNrbGlnaHRfY29udCwgIkJMX0NPTlQiKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBHUElPJWQgZm9yICIKKwkJCQkiYmFja2xpZ2h0X2NvbnRcbiIsIHBkYXRhLT5ncGlvX2JhY2tsaWdodF9jb250KTsKKwkJCWdvdG8gZXJyX2ZyZWVfYmFja2xpZ2h0X29uOworCQl9CisKKwkJbGNkLT5ncGlvX2JhY2tsaWdodF9jb250ID0gcGRhdGEtPmdwaW9fYmFja2xpZ2h0X2NvbnQ7CisKKwkJLyogc3BpdHogYW5kIGFraXRhIHVzZSBib3RoIEdQSU9zIGZvciBiYWNrbGlnaHQsIGFuZAorCQkgKiBoYXZlIGludmVydGVkIHBvbGFyaXR5IG9mIEdQSU9fQkFDS0xJR0hUX0NPTlQKKwkJICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGxjZC0+Z3Bpb19iYWNrbGlnaHRfb24pKSB7CisJCQlsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnRfaW52ZXJ0ZWQgPSAxOworCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxjZC0+Z3Bpb19iYWNrbGlnaHRfY29udCwgMSk7CisJCX0gZWxzZSB7CisJCQlsY2QtPmdwaW9fYmFja2xpZ2h0X2NvbnRfaW52ZXJ0ZWQgPSAwOworCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxjZC0+Z3Bpb19iYWNrbGlnaHRfY29udCwgMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2JhY2tsaWdodF9vbjoKKwlpZiAoZ3Bpb19pc192YWxpZChsY2QtPmdwaW9fYmFja2xpZ2h0X29uKSkKKwkJZ3Bpb19mcmVlKGxjZC0+Z3Bpb19iYWNrbGlnaHRfb24pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNvcmdpX2xjZF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBjb3JnaV9sY2RfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBjb3JnaV9sY2QgKmxjZDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAicGxhdGZvcm0gZGF0YSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvcmdpX2xjZCksIEdGUF9LRVJORUwpOworCWlmICghbGNkKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxjZC0+c3BpX2RldiA9IHNwaTsKKworCWxjZC0+bGNkX2RldiA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoImNvcmdpX2xjZCIsICZzcGktPmRldiwKKwkJCQkJbGNkLCAmY29yZ2lfbGNkX29wcyk7CisJaWYgKElTX0VSUihsY2QtPmxjZF9kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIobGNkLT5sY2RfZGV2KTsKKwkJZ290byBlcnJfZnJlZV9sY2Q7CisJfQorCWxjZC0+cG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJbGNkLT5tb2RlID0gKHBkYXRhKSA/IHBkYXRhLT5pbml0X21vZGUgOiBDT1JHSV9MQ0RfTU9ERV9WR0E7CisKKwlsY2QtPmJsX2RldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImNvcmdpX2JsIiwgJnNwaS0+ZGV2LAorCQkJCQlsY2QsICZjb3JnaV9ibF9vcHMpOworCWlmIChJU19FUlIobGNkLT5ibF9kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIobGNkLT5ibF9kZXYpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2xjZDsKKwl9CisJbGNkLT5ibF9kZXYtPnByb3BzLm1heF9icmlnaHRuZXNzID0gcGRhdGEtPm1heF9pbnRlbnNpdHk7CisJbGNkLT5ibF9kZXYtPnByb3BzLmJyaWdodG5lc3MgPSBwZGF0YS0+ZGVmYXVsdF9pbnRlbnNpdHk7CisJbGNkLT5ibF9kZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKworCXJldCA9IHNldHVwX2dwaW9fYmFja2xpZ2h0KGxjZCwgcGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfYmw7CisKKwlsY2QtPmtpY2tfYmF0dGVyeSA9IHBkYXRhLT5raWNrX2JhdHRlcnk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBsY2QpOworCWNvcmdpX2xjZF9zZXRfcG93ZXIobGNkLT5sY2RfZGV2LCBGQl9CTEFOS19VTkJMQU5LKTsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhsY2QtPmJsX2Rldik7CisKKwlsY2QtPmxpbWl0X21hc2sgPSBwZGF0YS0+bGltaXRfbWFzazsKKwl0aGVfY29yZ2lfbGNkID0gbGNkOworCXJldHVybiAwOworCitlcnJfdW5yZWdpc3Rlcl9ibDoKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIobGNkLT5ibF9kZXYpOworZXJyX3VucmVnaXN0ZXJfbGNkOgorCWxjZF9kZXZpY2VfdW5yZWdpc3RlcihsY2QtPmxjZF9kZXYpOworZXJyX2ZyZWVfbGNkOgorCWtmcmVlKGxjZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY29yZ2lfbGNkX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBjb3JnaV9sY2QgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJbGNkLT5ibF9kZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwlsY2QtPmJsX2Rldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDA7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMobGNkLT5ibF9kZXYpOworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihsY2QtPmJsX2Rldik7CisKKwlpZiAoZ3Bpb19pc192YWxpZChsY2QtPmdwaW9fYmFja2xpZ2h0X29uKSkKKwkJZ3Bpb19mcmVlKGxjZC0+Z3Bpb19iYWNrbGlnaHRfb24pOworCisJaWYgKGdwaW9faXNfdmFsaWQobGNkLT5ncGlvX2JhY2tsaWdodF9jb250KSkKKwkJZ3Bpb19mcmVlKGxjZC0+Z3Bpb19iYWNrbGlnaHRfY29udCk7CisKKwljb3JnaV9sY2Rfc2V0X3Bvd2VyKGxjZC0+bGNkX2RldiwgRkJfQkxBTktfUE9XRVJET1dOKTsKKwlsY2RfZGV2aWNlX3VucmVnaXN0ZXIobGNkLT5sY2RfZGV2KTsKKwlrZnJlZShsY2QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBjb3JnaV9sY2RfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJjb3JnaS1sY2QiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBjb3JnaV9sY2RfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChjb3JnaV9sY2RfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGNvcmdpX2xjZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gY29yZ2lfbGNkX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcmdpX2xjZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmNvcmdpX2xjZF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoY29yZ2lfbGNkX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY29yZ2lfbGNkX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvcmdpX2xjZF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoY29yZ2lfbGNkX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxDRCBhbmQgYmFja2xpZ2h0IGRyaXZlciBmb3IgU0hBUlAgQzd4MC9DeHgwMCIpOworTU9EVUxFX0FVVEhPUigiRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCmluZGV4IGIxNWIyYjguLjhlMTczMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jCkBAIC0yNywxNCArMjcsMjYgQEAKIAlzdHJ1Y3QgZmJfZXZlbnQgKmV2ZGF0YSA9IGRhdGE7CiAKIAkvKiBJZiB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50LCBza2lwIGl0IGltbWVkaWF0ZWx5IC4uLiAqLwotCWlmIChldmVudCAhPSBGQl9FVkVOVF9CTEFOSykKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGQl9FVkVOVF9CTEFOSzoKKwljYXNlIEZCX0VWRU5UX01PREVfQ0hBTkdFOgorCWNhc2UgRkJfRVZFTlRfTU9ERV9DSEFOR0VfQUxMOgorCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gMDsKKwl9CiAKIAlsZCA9IGNvbnRhaW5lcl9vZihzZWxmLCBzdHJ1Y3QgbGNkX2RldmljZSwgZmJfbm90aWYpOworCWlmICghbGQtPm9wcykKKwkJcmV0dXJuIDA7CisKIAltdXRleF9sb2NrKCZsZC0+b3BzX2xvY2spOwotCWlmIChsZC0+b3BzKQotCQlpZiAoIWxkLT5vcHMtPmNoZWNrX2ZiIHx8IGxkLT5vcHMtPmNoZWNrX2ZiKGxkLCBldmRhdGEtPmluZm8pKQorCWlmICghbGQtPm9wcy0+Y2hlY2tfZmIgfHwgbGQtPm9wcy0+Y2hlY2tfZmIobGQsIGV2ZGF0YS0+aW5mbykpIHsKKwkJaWYgKGV2ZW50ID09IEZCX0VWRU5UX0JMQU5LKQogCQkJbGQtPm9wcy0+c2V0X3Bvd2VyKGxkLCAqKGludCAqKWV2ZGF0YS0+ZGF0YSk7CisJCWVsc2UKKwkJCWxkLT5vcHMtPnNldF9tb2RlKGxkLCBldmRhdGEtPmRhdGEpOworCX0KIAltdXRleF91bmxvY2soJmxkLT5vcHNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMKaW5kZXggMzg1Y2JhNC4uMDY5NjRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWJwX252aWRpYV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L21icF9udmlkaWFfYmwuYwpAQCAtMTExLDYgKzExMSw0IEBACiBNT0RVTEVfQVVUSE9SKCJNYXR0aGV3IEdhcnJldHQgPG1qZ0ByZWRoYXQuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJOdmlkaWEtYmFzZWQgTWFjYm9vayBQcm8gQmFja2xpZ2h0IERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJzdm5BcHBsZUluYy46cG5NYWNCb29rUHJvMywxIik7Ci1NT0RVTEVfQUxJQVMoInN2bkFwcGxlSW5jLjpwbk1hY0Jvb2tQcm8zLDIiKTsKLU1PRFVMRV9BTElBUygic3ZuQXBwbGVJbmMuOnBuTWFjQm9va1BybzQsMSIpOworTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIG1icF9kZXZpY2VfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdGRvMjRtLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90ZG8yNG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDI3NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdGRvMjRtLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiB0ZG8yNG0gLSBTUEktYmFzZWQgZHJpdmVycyBmb3IgVG9wcG9seSBURE8yNE0gc2VyaWVzIExDRCBwYW5lbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqIAlFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgorCisjZGVmaW5lIFBPV0VSX0lTX09OKHB3cikJKChwd3IpIDw9IEZCX0JMQU5LX05PUk1BTCkKKworI2RlZmluZSBURE8yNE1fU1BJX0JVRkZfU0laRQkoNCkKKyNkZWZpbmUgTU9ERV9RVkdBCTAKKyNkZWZpbmUgTU9ERV9WR0EJMQorCitzdHJ1Y3QgdGRvMjRtIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpX2RldjsKKwlzdHJ1Y3QgbGNkX2RldmljZQkqbGNkX2RldjsKKworCXN0cnVjdCBzcGlfbWVzc2FnZQltc2c7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl4ZmVyOworCXVpbnQ4X3QJCQkqYnVmOworCisJaW50CQkJcG93ZXI7CisJaW50CQkJbW9kZTsKK307CisKKy8qIHVzZSBiaXQgMzAsIDMxIGFzIHRoZSBpbmRpY2F0b3Igb2YgY29tbWFuZCBwYXJhbWV0ZXIgbnVtYmVyICovCisjZGVmaW5lIENNRDAoeCkJCSgoMCA8PCAzMCkgfCAoeCkpCisjZGVmaW5lIENNRDEoeCwgeDEpCSgoMSA8PCAzMCkgfCAoKHgpIDw8IDkpIHwgMHgxMDAgfCAoeDEpKQorI2RlZmluZSBDTUQyKHgsIHgxLCB4MikJKCgyIDw8IDMwKSB8ICgoeCkgPDwgMTgpIHwgMHgyMDAwMCB8XAorCQkJKCh4MSkgPDwgOSkgfCAweDEwMCB8ICh4MikpCisjZGVmaW5lIENNRF9OVUxMCSgtMSkKKworc3RhdGljIHVpbnQzMl90IGxjZF9wYW5lbF9yZXNldFtdID0geworCUNNRDAoMHgxKSwgLyogcmVzZXQgKi8KKwlDTUQwKDB4MCksIC8qIG5vcCAqLworCUNNRDAoMHgwKSwgLyogbm9wICovCisJQ01EMCgweDApLCAvKiBub3AgKi8KKwlDTURfTlVMTCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBsY2RfcGFuZWxfb25bXSA9IHsKKwlDTUQwKDB4MjkpLAkJLyogRGlzcGxheSBPTiAqLworCUNNRDIoMHhCOCwgMHhGRiwgMHhGOSksCS8qIE91dHB1dCBDb250cm9sICovCisJQ01EMCgweDExKSwJCS8qIFNsZWVwIG91dCAqLworCUNNRDEoMHhCMCwgMHgxNiksCS8qIFdha2UgKi8KKwlDTURfTlVMTCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBsY2RfcGFuZWxfb2ZmW10gPSB7CisJQ01EMCgweDI4KSwJCS8qIERpc3BsYXkgT0ZGICovCisJQ01EMigweEI4LCAweDgwLCAweDAyKSwJLyogT3V0cHV0IENvbnRyb2wgKi8KKwlDTUQwKDB4MTApLAkJLyogU2xlZXAgaW4gKi8KKwlDTUQxKDB4QjAsIDB4MDApLAkvKiBEZWVwIHN0YW5kIGJ5IGluICovCisJQ01EX05VTEwsCit9OworCitzdGF0aWMgdWludDMyX3QgbGNkX3ZnYV9wYXNzX3Rocm91Z2hbXSA9IHsKKwlDTUQxKDB4QjAsIDB4MTYpLAorCUNNRDEoMHhCQywgMHg4MCksCisJQ01EMSgweEUxLCAweDAwKSwKKwlDTUQxKDB4MzYsIDB4NTApLAorCUNNRDEoMHgzQiwgMHgwMCksCisJQ01EX05VTEwsCit9OworCitzdGF0aWMgdWludDMyX3QgbGNkX3F2Z2FfcGFzc190aHJvdWdoW10gPSB7CisJQ01EMSgweEIwLCAweDE2KSwKKwlDTUQxKDB4QkMsIDB4ODEpLAorCUNNRDEoMHhFMSwgMHgwMCksCisJQ01EMSgweDM2LCAweDUwKSwKKwlDTUQxKDB4M0IsIDB4MjIpLAorCUNNRF9OVUxMLAorfTsKKworc3RhdGljIHVpbnQzMl90IGxjZF92Z2FfdHJhbnNmZXJbXSA9IHsKKwlDTUQxKDB4Y2YsIDB4MDIpLCAJLyogQmxhbmtpbmcgcGVyaW9kIGNvbnRyb2wgKDEpICovCisJQ01EMigweGQwLCAweDA4LCAweDA0KSwJLyogQmxhbmtpbmcgcGVyaW9kIGNvbnRyb2wgKDIpICovCisJQ01EMSgweGQxLCAweDAxKSwJLyogQ0tWIHRpbWluZyBjb250cm9sIG9uL29mZiAqLworCUNNRDIoMHhkMiwgMHgxNCwgMHgwMCksCS8qIENLViAxLDIgdGltaW5nIGNvbnRyb2wgKi8KKwlDTUQyKDB4ZDMsIDB4MWEsIDB4MGYpLAkvKiBPRVYgdGltaW5nIGNvbnRyb2wgKi8KKwlDTUQyKDB4ZDQsIDB4MWYsIDB4YWYpLAkvKiBBU1cgdGltaW5nIGNvbnRyb2wgKDEpICovCisJQ01EMSgweGQ1LCAweDE0KSwJLyogQVNXIHRpbWluZyBjb250cm9sICgyKSAqLworCUNNRDAoMHgyMSksCQkvKiBJbnZlcnQgZm9yIG5vcm1hbGx5IGJsYWNrIGRpc3BsYXkgKi8KKwlDTUQwKDB4MjkpLAkJLyogRGlzcGxheSBvbiAqLworCUNNRF9OVUxMLAorfTsKKworc3RhdGljIHVpbnQzMl90IGxjZF9xdmdhX3RyYW5zZmVyW10gPSB7CisJQ01EMSgweGQ2LCAweDAyKSwJLyogQmxhbmtpbmcgcGVyaW9kIGNvbnRyb2wgKDEpICovCisJQ01EMigweGQ3LCAweDA4LCAweDA0KSwJLyogQmxhbmtpbmcgcGVyaW9kIGNvbnRyb2wgKDIpICovCisJQ01EMSgweGQ4LCAweDAxKSwJLyogQ0tWIHRpbWluZyBjb250cm9sIG9uL29mZiAqLworCUNNRDIoMHhkOSwgMHgwMCwgMHgwOCksCS8qIENLViAxLDIgdGltaW5nIGNvbnRyb2wgKi8KKwlDTUQyKDB4ZGUsIDB4MDUsIDB4MGEpLAkvKiBPRVYgdGltaW5nIGNvbnRyb2wgKi8KKwlDTUQyKDB4ZGYsIDB4MGEsIDB4MTkpLAkvKiBBU1cgdGltaW5nIGNvbnRyb2wgKDEpICovCisJQ01EMSgweGUwLCAweDBhKSwJLyogQVNXIHRpbWluZyBjb250cm9sICgyKSAqLworCUNNRDAoMHgyMSksCQkvKiBJbnZlcnQgZm9yIG5vcm1hbGx5IGJsYWNrIGRpc3BsYXkgKi8KKwlDTUQwKDB4MjkpLAkJLyogRGlzcGxheSBvbiAqLworCUNNRF9OVUxMLAorfTsKKworc3RhdGljIHVpbnQzMl90IGxjZF9wYW5lbF9jb25maWdbXSA9IHsKKwlDTUQyKDB4YjgsIDB4ZmYsIDB4ZjkpLAkvKiBPdXRwdXQgY29udHJvbCAqLworCUNNRDAoMHgxMSksCQkvKiBzbGVlcCBvdXQgKi8KKwlDTUQxKDB4YmEsIDB4MDEpLAkvKiBEaXNwbGF5IG1vZGUgKDEpICovCisJQ01EMSgweGJiLCAweDAwKSwJLyogRGlzcGxheSBtb2RlICgyKSAqLworCUNNRDEoMHgzYSwgMHg2MCksCS8qIERpc3BsYXkgbW9kZSAxOC1iaXQgUkdCICovCisJQ01EMSgweGJmLCAweDEwKSwJLyogRHJpdmUgc3lzdGVtIGNoYW5nZSBjb250cm9sICovCisJQ01EMSgweGIxLCAweDU2KSwJLyogQm9vc3RlciBvcGVyYXRpb24gc2V0dXAgKi8KKwlDTUQxKDB4YjIsIDB4MzMpLAkvKiBCb29zdGVyIG1vZGUgc2V0dXAgKi8KKwlDTUQxKDB4YjMsIDB4MTEpLAkvKiBCb29zdGVyIGZyZXF1ZW5jeSBzZXR1cCAqLworCUNNRDEoMHhiNCwgMHgwMiksCS8qIE9wIGFtcC9zeXN0ZW0gY2xvY2sgKi8KKwlDTUQxKDB4YjUsIDB4MzUpLAkvKiBWQ1Mgdm9sdGFnZSAqLworCUNNRDEoMHhiNiwgMHg0MCksCS8qIFZDT00gdm9sdGFnZSAqLworCUNNRDEoMHhiNywgMHgwMyksCS8qIEV4dGVybmFsIGRpc3BsYXkgc2lnbmFsICovCisJQ01EMSgweGJkLCAweDAwKSwJLyogQVNXIHNsZXcgcmF0ZSAqLworCUNNRDEoMHhiZSwgMHgwMCksCS8qIER1bW15IGRhdGEgZm9yIFF1YWREYXRhIG9wZXJhdGlvbiAqLworCUNNRDEoMHhjMCwgMHgxMSksCS8qIFNsZWVwIG91dCBGUiBjb3VudCAoQSkgKi8KKwlDTUQxKDB4YzEsIDB4MTEpLAkvKiBTbGVlcCBvdXQgRlIgY291bnQgKEIpICovCisJQ01EMSgweGMyLCAweDExKSwJLyogU2xlZXAgb3V0IEZSIGNvdW50IChDKSAqLworCUNNRDIoMHhjMywgMHgyMCwgMHg0MCksCS8qIFNsZWVwIG91dCBGUiBjb3VudCAoRCkgKi8KKwlDTUQyKDB4YzQsIDB4NjAsIDB4YzApLAkvKiBTbGVlcCBvdXQgRlIgY291bnQgKEUpICovCisJQ01EMigweGM1LCAweDEwLCAweDIwKSwJLyogU2xlZXAgb3V0IEZSIGNvdW50IChGKSAqLworCUNNRDEoMHhjNiwgMHhjMCksCS8qIFNsZWVwIG91dCBGUiBjb3VudCAoRykgKi8KKwlDTUQyKDB4YzcsIDB4MzMsIDB4NDMpLAkvKiBHYW1tYSAxIGZpbmUgdHVuaW5nICgxKSAqLworCUNNRDEoMHhjOCwgMHg0NCksCS8qIEdhbW1hIDEgZmluZSB0dW5pbmcgKDIpICovCisJQ01EMSgweGM5LCAweDMzKSwJLyogR2FtbWEgMSBpbmNsaW5hdGlvbiBhZGp1c3RtZW50ICovCisJQ01EMSgweGNhLCAweDAwKSwJLyogR2FtbWEgMSBibHVlIG9mZnNldCBhZGp1c3RtZW50ICovCisJQ01EMigweGVjLCAweDAxLCAweGYwKSwJLyogSG9yaXpvbnRhbCBjbG9jayBjeWNsZXMgKi8KKwlDTURfTlVMTCwKK307CisKK3N0YXRpYyBpbnQgdGRvMjRtX3dyaXRlcyhzdHJ1Y3QgdGRvMjRtICpsY2QsIHVpbnQzMl90ICphcnJheSkKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ID0gJmxjZC0+eGZlcjsKKwl1aW50MzJfdCBkYXRhLCAqcCA9IGFycmF5OworCWludCBucGFyYW1zLCBlcnIgPSAwOworCisJZm9yICg7ICpwICE9IENNRF9OVUxMOyBwKyspIHsKKworCQlucGFyYW1zID0gKCpwID4+IDMwKSAmIDB4MzsKKworCQlkYXRhID0gKnAgPDwgKDcgLSBucGFyYW1zKTsKKwkJc3dpdGNoIChucGFyYW1zKSB7CisJCWNhc2UgMDoKKwkJCWxjZC0+YnVmWzBdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCQkJbGNkLT5idWZbMV0gPSBkYXRhICYgMHhmZjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlsY2QtPmJ1ZlswXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisJCQlsY2QtPmJ1ZlsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwkJCWxjZC0+YnVmWzJdID0gZGF0YSAmIDB4ZmY7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbGNkLT5idWZbMF0gPSAoZGF0YSA+PiAyNCkgJiAweGZmOworCQkJbGNkLT5idWZbMV0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworCQkJbGNkLT5idWZbMl0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJCQlsY2QtPmJ1ZlszXSA9IGRhdGEgJiAweGZmOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCQl4LT5sZW4gPSBucGFyYW1zICsgMjsKKwkJZXJyID0gc3BpX3N5bmMobGNkLT5zcGlfZGV2LCAmbGNkLT5tc2cpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZG8yNG1fYWRqX21vZGUoc3RydWN0IHRkbzI0bSAqbGNkLCBpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1PREVfVkdBOgorCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3ZnYV9wYXNzX3Rocm91Z2gpOworCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3BhbmVsX2NvbmZpZyk7CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfdmdhX3RyYW5zZmVyKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RFX1FWR0E6CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfcXZnYV9wYXNzX3Rocm91Z2gpOworCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3BhbmVsX2NvbmZpZyk7CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfcXZnYV90cmFuc2Zlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjZC0+bW9kZSA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRvMjRtX3Bvd2VyX29uKHN0cnVjdCB0ZG8yNG0gKmxjZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF9wYW5lbF9vbik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSB0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3BhbmVsX3Jlc2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHRkbzI0bV9hZGpfbW9kZShsY2QsIGxjZC0+bW9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZG8yNG1fcG93ZXJfb2ZmKHN0cnVjdCB0ZG8yNG0gKmxjZCkKK3sKKwlyZXR1cm4gdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF9wYW5lbF9vZmYpOworfQorCitzdGF0aWMgaW50IHRkbzI0bV9wb3dlcihzdHJ1Y3QgdGRvMjRtICpsY2QsIGludCBwb3dlcikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChQT1dFUl9JU19PTihwb3dlcikgJiYgIVBPV0VSX0lTX09OKGxjZC0+cG93ZXIpKQorCQlyZXQgPSB0ZG8yNG1fcG93ZXJfb24obGNkKTsKKwllbHNlIGlmICghUE9XRVJfSVNfT04ocG93ZXIpICYmIFBPV0VSX0lTX09OKGxjZC0+cG93ZXIpKQorCQlyZXQgPSB0ZG8yNG1fcG93ZXJfb2ZmKGxjZCk7CisKKwlpZiAoIXJldCkKKwkJbGNkLT5wb3dlciA9IHBvd2VyOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHRkbzI0bV9zZXRfcG93ZXIoc3RydWN0IGxjZF9kZXZpY2UgKmxkLCBpbnQgcG93ZXIpCit7CisJc3RydWN0IHRkbzI0bSAqbGNkID0gbGNkX2dldF9kYXRhKGxkKTsKKwlyZXR1cm4gdGRvMjRtX3Bvd2VyKGxjZCwgcG93ZXIpOworfQorCitzdGF0aWMgaW50IHRkbzI0bV9nZXRfcG93ZXIoc3RydWN0IGxjZF9kZXZpY2UgKmxkKQoreworCXN0cnVjdCB0ZG8yNG0gKmxjZCA9IGxjZF9nZXRfZGF0YShsZCk7CisJcmV0dXJuIGxjZC0+cG93ZXI7Cit9CisKK3N0YXRpYyBpbnQgdGRvMjRtX3NldF9tb2RlKHN0cnVjdCBsY2RfZGV2aWNlICpsZCwgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbSkKK3sKKwlzdHJ1Y3QgdGRvMjRtICpsY2QgPSBsY2RfZ2V0X2RhdGEobGQpOworCWludCBtb2RlID0gTU9ERV9RVkdBOworCisJaWYgKG0tPnhyZXMgPT0gNjQwIHx8IG0tPnhyZXMgPT0gNDgwKQorCQltb2RlID0gTU9ERV9WR0E7CisKKwlpZiAobGNkLT5tb2RlID09IG1vZGUpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRkbzI0bV9hZGpfbW9kZShsY2QsIG1vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGxjZF9vcHMgdGRvMjRtX29wcyA9IHsKKwkuZ2V0X3Bvd2VyCT0gdGRvMjRtX2dldF9wb3dlciwKKwkuc2V0X3Bvd2VyCT0gdGRvMjRtX3NldF9wb3dlciwKKwkuc2V0X21vZGUJPSB0ZG8yNG1fc2V0X21vZGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZG8yNG1fcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGRvMjRtICpsY2Q7CisJc3RydWN0IHNwaV9tZXNzYWdlICptOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKng7CisJaW50IGVycjsKKworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwllcnIgPSBzcGlfc2V0dXAoc3BpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbGNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRkbzI0bSksIEdGUF9LRVJORUwpOworCWlmICghbGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxjZC0+c3BpX2RldiA9IHNwaTsKKwlsY2QtPnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCWxjZC0+bW9kZSA9IE1PREVfVkdBOwkvKiBkZWZhdWx0IHRvIFZHQSAqLworCisJbGNkLT5idWYgPSBrbWFsbG9jKFRETzI0TV9TUElfQlVGRl9TSVpFLCBzaXplb2YoR0ZQX0tFUk5FTCkpOworCWlmIChsY2QtPmJ1ZiA9PSBOVUxMKSB7CisJCWtmcmVlKGxjZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW0gPSAmbGNkLT5tc2c7CisJeCA9ICZsY2QtPnhmZXI7CisKKwlzcGlfbWVzc2FnZV9pbml0KG0pOworCisJeC0+dHhfYnVmID0gJmxjZC0+YnVmWzBdOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHgsIG0pOworCisJbGNkLT5sY2RfZGV2ID0gbGNkX2RldmljZV9yZWdpc3RlcigidGRvMjRtIiwgJnNwaS0+ZGV2LAorCQkJCQlsY2QsICZ0ZG8yNG1fb3BzKTsKKwlpZiAoSVNfRVJSKGxjZC0+bGNkX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihsY2QtPmxjZF9kZXYpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGxjZCk7CisJZXJyID0gdGRvMjRtX3Bvd2VyKGxjZCwgRkJfQkxBTktfVU5CTEFOSyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKworCXJldHVybiAwOworCitvdXRfdW5yZWdpc3RlcjoKKwlsY2RfZGV2aWNlX3VucmVnaXN0ZXIobGNkLT5sY2RfZGV2KTsKK291dF9mcmVlOgorCWtmcmVlKGxjZC0+YnVmKTsKKwlrZnJlZShsY2QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRkbzI0bV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGRvMjRtICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCXRkbzI0bV9wb3dlcihsY2QsIEZCX0JMQU5LX1BPV0VSRE9XTik7CisJbGNkX2RldmljZV91bnJlZ2lzdGVyKGxjZC0+bGNkX2Rldik7CisJa2ZyZWUobGNkLT5idWYpOworCWtmcmVlKGxjZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0ZG8yNG1fc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHRkbzI0bSAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwlyZXR1cm4gdGRvMjRtX3Bvd2VyKGxjZCwgRkJfQkxBTktfUE9XRVJET1dOKTsKK30KKworc3RhdGljIGludCB0ZG8yNG1fcmVzdW1lKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHRkbzI0bSAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwlyZXR1cm4gdGRvMjRtX3Bvd2VyKGxjZCwgRkJfQkxBTktfVU5CTEFOSyk7Cit9CisjZWxzZQorI2RlZmluZSB0ZG8yNG1fc3VzcGVuZAlOVUxMCisjZGVmaW5lIHRkbzI0bV9yZXN1bWUJTlVMTAorI2VuZGlmCisKKy8qIFBvd2VyIGRvd24gYWxsIGRpc3BsYXlzIG9uIHJlYm9vdCwgcG93ZXJvZmYgb3IgaGFsdCAqLworc3RhdGljIHZvaWQgdGRvMjRtX3NodXRkb3duKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHRkbzI0bSAqbGNkID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CisKKwl0ZG8yNG1fcG93ZXIobGNkLCBGQl9CTEFOS19QT1dFUkRPV04pOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgdGRvMjRtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAidGRvMjRtIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHRkbzI0bV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRkbzI0bV9yZW1vdmUpLAorCS5zaHV0ZG93bgk9IHRkbzI0bV9zaHV0ZG93biwKKwkuc3VzcGVuZAk9IHRkbzI0bV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdGRvMjRtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRkbzI0bV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnRkbzI0bV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQodGRvMjRtX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdGRvMjRtX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnRkbzI0bV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodGRvMjRtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBUb3Bwb2x5IFRETzI0TSBMQ0QgUGFuZWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYncyLmMgYi9kcml2ZXJzL3ZpZGVvL2J3Mi5jCmluZGV4IGU3MjE2NDQuLjFlMzViYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYncyLmMKKysrIGIvZHJpdmVycy92aWRlby9idzIuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJ3Ml9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYncyX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJid3R3byIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCmluZGV4IGUxNWJiNDQuLmM5YjE5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJLmZiX3NldGNvbHJlZwk9IGNhcm1pbmVfc2V0Y29scmVnLAogfTsKIAotc3RhdGljIGludCBhbGxvY19jYXJtaW5lX2ZiKHZvaWQgX19pb21lbSAqcmVncywgdm9pZCBfX2lvbWVtICpzbWVtX2Jhc2UsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGxvY19jYXJtaW5lX2ZiKHZvaWQgX19pb21lbSAqcmVncywgdm9pZCBfX2lvbWVtICpzbWVtX2Jhc2UsCiAJCWludCBzbWVtX29mZnNldCwgc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZmJfaW5mbyAqKnJpbmZvKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NnMTQuYyBiL2RyaXZlcnMvdmlkZW8vY2cxNC5jCmluZGV4IGIxN2U3NDYuLmEyZDE4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2cxNC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2cxNC5jCkBAIC01ODksNyArNTg5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgY2cxNF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2cxNF9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiY2dmb3VydGVlbiIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2czLmMgYi9kcml2ZXJzL3ZpZGVvL2NnMy5jCmluZGV4IDNhYTdiNmMuLjk5Zjg3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2czLmMKKysrIGIvZHJpdmVycy92aWRlby9jZzMuYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNnM19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2czX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJjZ3RocmVlIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzYuYyBiL2RyaXZlcnMvdmlkZW8vY2c2LmMKaW5kZXggMmY2NGJiMy4uOTQwZWMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NnNi5jCkBAIC0zNCwxMCArMzQsMTEgQEAKIAogc3RhdGljIHZvaWQgY2c2X2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKik7CiBzdGF0aWMgdm9pZCBjZzZfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKiwgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICopOworc3RhdGljIHZvaWQgY2c2X2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwogc3RhdGljIGludCBjZzZfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqKTsKIHN0YXRpYyBpbnQgY2c2X21tYXAoc3RydWN0IGZiX2luZm8gKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogc3RhdGljIGludCBjZzZfaW9jdGwoc3RydWN0IGZiX2luZm8gKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyB2b2lkIGNnNl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKTsKK3N0YXRpYyBpbnQgY2c2X3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKIAogLyoKICAqICBGcmFtZSBidWZmZXIgb3BlcmF0aW9ucwpAQCAtNDcsNiArNDgsNyBAQAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmZiX3NldGNvbHJlZwkJPSBjZzZfc2V0Y29scmVnLAogCS5mYl9ibGFuawkJPSBjZzZfYmxhbmssCisJLmZiX3Bhbl9kaXNwbGF5CQk9IGNnNl9wYW5fZGlzcGxheSwKIAkuZmJfZmlsbHJlY3QJCT0gY2c2X2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQkJPSBjZzZfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAkJPSBjZzZfaW1hZ2VibGl0LApAQCAtMTYxLDYgKzE2Myw3IEBACiAjZGVmaW5lIENHNl9USENfTUlTQ19JTlRfRU5BQgkJKDEgPDwgNSkKICNkZWZpbmUgQ0c2X1RIQ19NSVNDX0lOVAkJKDEgPDwgNCkKICNkZWZpbmUgQ0c2X1RIQ19NSVNDX0lOSVQJCTB4OWYKKyNkZWZpbmUgQ0c2X1RIQ19DVVJTT0ZGCQkJKCg2NTUzNi0zMikgfCAoKDY1NTM2LTMyKSA8PCAxNikpCiAKIC8qIFRoZSBjb250ZW50cyBhcmUgdW5rbm93biAqLwogc3RydWN0IGNnNl90ZWMgewpAQCAtMjgwLDYgKzI4MywzMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjZzZfc3dpdGNoX2Zyb21fZ3JhcGgoc3RydWN0IGNnNl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgY2c2X3RoYyBfX2lvbWVtICp0aGMgPSBwYXItPnRoYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhci0+bG9jaywgZmxhZ3MpOworCisJLyogSGlkZSB0aGUgY3Vyc29yLiAqLworCXNidXNfd3JpdGVsKENHNl9USENfQ1VSU09GRiwgJnRoYy0+dGhjX2N1cnN4eSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXItPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBjZzZfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZzZfcGFyICpwYXIgPSAoc3RydWN0IGNnNl9wYXIgKilpbmZvLT5wYXI7CisKKwkvKiBXZSBqdXN0IHVzZSB0aGlzIHRvIGNhdGNoIHN3aXRjaGVzIG91dCBvZgorCSAqIGdyYXBoaWNzIG1vZGUuCisJICovCisJY2c2X3N3aXRjaF9mcm9tX2dyYXBoKHBhcik7CisKKwlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCB8fCB2YXItPnZtb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKgljZzZfZmlsbHJlY3QgLQlEcmF3cyBhIHJlY3RhbmdsZSBvbiB0aGUgc2NyZWVuLgogICoKQEAgLTY0Myw5ICs2NzMsMTMgQEAKIAlzdHJ1Y3QgY2c2X3BhciAqcGFyID0gKHN0cnVjdCBjZzZfcGFyICopaW5mby0+cGFyOwogCXN0cnVjdCBjZzZfdGVjIF9faW9tZW0gKnRlYyA9IHBhci0+dGVjOwogCXN0cnVjdCBjZzZfZmJjIF9faW9tZW0gKmZiYyA9IHBhci0+ZmJjOworCXN0cnVjdCBjZzZfdGhjIF9faW9tZW0gKnRoYyA9IHBhci0+dGhjOwogCXUzMiByZXYsIGNvbmYsIG1vZGU7CiAJaW50IGk7CiAKKwkvKiBIaWRlIHRoZSBjdXJzb3IuICovCisJc2J1c193cml0ZWwoQ0c2X1RIQ19DVVJTT0ZGLCAmdGhjLT50aGNfY3Vyc3h5KTsKKwogCS8qIFR1cm4gb2ZmIHN0dWZmIGluIHRoZSBUcmFuc2Zvcm0gRW5naW5lLiAqLwogCXNidXNfd3JpdGVsKDAsICZ0ZWMtPnRlY19tYXRyaXgpOwogCXNidXNfd3JpdGVsKDAsICZ0ZWMtPnRlY19jbGlwKTsKQEAgLTgxNCw3ICs4NDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBjZzZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNnNl9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiY2dzaXgiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NpcnJ1c2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NpcnJ1c2ZiLmMKaW5kZXggZTcyOWZiMi4uMDQ4YjEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jaXJydXNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2lycnVzZmIuYwpAQCAtMzI3LDI5ICszMjcsNyBAQAogI2VuZGlmIC8qIENPTkZJR19aT1JSTyAqLwogCiBzdHJ1Y3QgY2lycnVzZmJfcmVncyB7Ci0JbG9uZyBmcmVxOwotCWxvbmcgbm9tOwotCWxvbmcgZGVuOwotCWxvbmcgZGl2OwotCWxvbmcgbXVsdGlwbGV4aW5nOwotCWxvbmcgbWNsazsKLQlsb25nIGRpdk1DTEs7Ci0KLQlsb25nIEhvcml6UmVzOwkJLyogVGhlIHggcmVzb2x1dGlvbiBpbiBwaXhlbCAqLwotCWxvbmcgSG9yaXpUb3RhbDsKLQlsb25nIEhvcml6RGlzcEVuZDsKLQlsb25nIEhvcml6QmxhbmtTdGFydDsKLQlsb25nIEhvcml6QmxhbmtFbmQ7Ci0JbG9uZyBIb3JpelN5bmNTdGFydDsKLQlsb25nIEhvcml6U3luY0VuZDsKLQotCWxvbmcgVmVydFJlczsJCS8qIHRoZSBwaHlzaWNhbCB5IHJlc29sdXRpb24gaW4gc2NhbmxpbmVzICovCi0JbG9uZyBWZXJ0VG90YWw7Ci0JbG9uZyBWZXJ0RGlzcEVuZDsKLQlsb25nIFZlcnRTeW5jU3RhcnQ7Ci0JbG9uZyBWZXJ0U3luY0VuZDsKLQlsb25nIFZlcnRCbGFua1N0YXJ0OwotCWxvbmcgVmVydEJsYW5rRW5kOworCWludCBtdWx0aXBsZXhpbmc7CiB9OwogCiAjaWZkZWYgQ0lSUlVTRkJfREVCVUcKQEAgLTM2NywxMTAgKzM0NSwxMyBAQAogCiAJc3RydWN0IGNpcnJ1c2ZiX3JlZ3MgY3VycmVudG1vZGU7CiAJaW50IGJsYW5rX21vZGU7CisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIAotCXUzMglwc2V1ZG9fcGFsZXR0ZVsxNl07Ci0KLSNpZmRlZiBDT05GSUdfWk9SUk8KLQlzdHJ1Y3Qgem9ycm9fZGV2ICp6ZGV2OwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BDSQotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotI2VuZGlmCiAJdm9pZCAoKnVubWFwKShzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgY2lycnVzZmJfZGVmX21vZGUgPSAxOwotc3RhdGljIGludCBub2FjY2VsOwotCi0vKgotICogICAgUHJlZGVmaW5lZCBWaWRlbyBNb2RlcwotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKLX0gY2lycnVzZmJfcHJlZGVmaW5lZFtdID0gewotCXsKLQkJLyogYXV0b2RldGVjdCBtb2RlICovCi0JCS5uYW1lCT0gIkF1dG9kZXRlY3QiLAotCX0sIHsKLQkJLyogNjQweDQ4MCwgMzEuMjUga0h6LCA2MCBIeiwgMjUgTUh6IFBpeENsb2NrICovCi0JCS5uYW1lCT0gIjY0MHg0ODAiLAotCQkudmFyCT0gewotCQkJLnhyZXMJCT0gNjQwLAotCQkJLnlyZXMJCT0gNDgwLAotCQkJLnhyZXNfdmlydHVhbAk9IDY0MCwKLQkJCS55cmVzX3ZpcnR1YWwJPSA0ODAsCi0JCQkuYml0c19wZXJfcGl4ZWwJPSA4LAotCQkJLnJlZAkJPSB7IC5sZW5ndGggPSA4IH0sCi0JCQkuZ3JlZW4JCT0geyAubGVuZ3RoID0gOCB9LAotCQkJLmJsdWUJCT0geyAubGVuZ3RoID0gOCB9LAotCQkJLndpZHRoCQk9IC0xLAotCQkJLmhlaWdodAkJPSAtMSwKLQkJCS5waXhjbG9jawk9IDQwMDAwLAotCQkJLmxlZnRfbWFyZ2luCT0gNDgsCi0JCQkucmlnaHRfbWFyZ2luCT0gMTYsCi0JCQkudXBwZXJfbWFyZ2luCT0gMzIsCi0JCQkubG93ZXJfbWFyZ2luCT0gOCwKLQkJCS5oc3luY19sZW4JPSA5NiwKLQkJCS52c3luY19sZW4JPSA0LAotCQkJLnN5bmMJPSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKLQkJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0JCSB9Ci0JfSwgewotCQkvKiA4MDB4NjAwLCA0OCBrSHosIDc2IEh6LCA1MCBNSHogUGl4Q2xvY2sgKi8KLQkJLm5hbWUJPSAiODAweDYwMCIsCi0JCS52YXIJPSB7Ci0JCQkueHJlcwkJPSA4MDAsCi0JCQkueXJlcwkJPSA2MDAsCi0JCQkueHJlc192aXJ0dWFsCT0gODAwLAotCQkJLnlyZXNfdmlydHVhbAk9IDYwMCwKLQkJCS5iaXRzX3Blcl9waXhlbAk9IDgsCi0JCQkucmVkCQk9IHsgLmxlbmd0aCA9IDggfSwKLQkJCS5ncmVlbgkJPSB7IC5sZW5ndGggPSA4IH0sCi0JCQkuYmx1ZQkJPSB7IC5sZW5ndGggPSA4IH0sCi0JCQkud2lkdGgJCT0gLTEsCi0JCQkuaGVpZ2h0CQk9IC0xLAotCQkJLnBpeGNsb2NrCT0gMjAwMDAsCi0JCQkubGVmdF9tYXJnaW4JPSAxMjgsCi0JCQkucmlnaHRfbWFyZ2luCT0gMTYsCi0JCQkudXBwZXJfbWFyZ2luCT0gMjQsCi0JCQkubG93ZXJfbWFyZ2luCT0gMiwKLQkJCS5oc3luY19sZW4JPSA5NiwKLQkJCS52c3luY19sZW4JPSA2LAotCQkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLQkJIH0KLQl9LCB7Ci0JCS8qCi0JCSAqIE1vZGVsaW5lIGZyb20gWEY4NkNvbmZpZzoKLQkJICogTW9kZSAiMTAyNHg3NjgiIDgwICAxMDI0IDExMzYgMTM0MCAxNDMyICA3NjggNzcwIDc3NCA4MDUKLQkJICovCi0JCS8qIDEwMjR4NzY4LCA1NS44IGtIeiwgNzAgSHosIDgwIE1IeiBQaXhDbG9jayAqLwotCQkubmFtZQk9ICIxMDI0eDc2OCIsCi0JCS52YXIJPSB7Ci0JCQkueHJlcwkJPSAxMDI0LAotCQkJLnlyZXMJCT0gNzY4LAotCQkJLnhyZXNfdmlydHVhbAk9IDEwMjQsCi0JCQkueXJlc192aXJ0dWFsCT0gNzY4LAotCQkJLmJpdHNfcGVyX3BpeGVsCT0gOCwKLQkJCS5yZWQJCT0geyAubGVuZ3RoID0gOCB9LAotCQkJLmdyZWVuCQk9IHsgLmxlbmd0aCA9IDggfSwKLQkJCS5ibHVlCQk9IHsgLmxlbmd0aCA9IDggfSwKLQkJCS53aWR0aAkJPSAtMSwKLQkJCS5oZWlnaHQJCT0gLTEsCi0JCQkucGl4Y2xvY2sJPSAxMjUwMCwKLQkJCS5sZWZ0X21hcmdpbgk9IDE0NCwKLQkJCS5yaWdodF9tYXJnaW4JPSAzMiwKLQkJCS51cHBlcl9tYXJnaW4JPSAzMCwKLQkJCS5sb3dlcl9tYXJnaW4JPSAyLAotCQkJLmhzeW5jX2xlbgk9IDE5MiwKLQkJCS52c3luY19sZW4JPSA2LAotCQkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLQkJfQotCX0KLX07Ci0KLSNkZWZpbmUgTlVNX1RPVEFMX01PREVTICAgIEFSUkFZX1NJWkUoY2lycnVzZmJfcHJlZGVmaW5lZCkKK3N0YXRpYyBpbnQgbm9hY2NlbCBfX2RldmluaXRkYXRhOworc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9fZGV2aW5pdGRhdGEgPSAiNjQweDQ4MEA2MCI7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKiogQkVHSU4gUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MTQsMTAgKzM5NSw2IEBACiAJLmZiX2ltYWdlYmxpdAk9IGNpcnJ1c2ZiX2ltYWdlYmxpdCwKIH07CiAKLS8qLS0tIEhhcmR3YXJlIFNwZWNpZmljIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBjaXJydXNmYl9kZWNvZGVfdmFyKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJCXN0cnVjdCBjaXJydXNmYl9yZWdzICpyZWdzLAotCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKTsKIC8qLS0tIEludGVybmFsIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaW5pdF92Z2FjaGlwKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyB2b2lkIHN3aXRjaF9tb25pdG9yKHN0cnVjdCBjaXJydXNmYl9pbmZvICpjaW5mbywgaW50IG9uKTsKQEAgLTU0Niw5ICs0MjMsNyBAQAogCQkJICAgICAgdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsCiAJCQkgICAgICB1X2NoYXIgY29sb3IsIHVfc2hvcnQgbGluZV9sZW5ndGgpOwogCi1zdGF0aWMgdm9pZCBiZXN0Y2xvY2sobG9uZyBmcmVxLCBsb25nICpiZXN0LAotCQkgICAgICBsb25nICpub20sIGxvbmcgKmRlbiwKLQkJICAgICAgbG9uZyAqZGl2LCBsb25nIG1heGZyZXEpOworc3RhdGljIHZvaWQgYmVzdGNsb2NrKGxvbmcgZnJlcSwgaW50ICpub20sIGludCAqZGVuLCBpbnQgKmRpdik7CiAKICNpZmRlZiBDSVJSVVNGQl9ERUJVRwogc3RhdGljIHZvaWQgY2lycnVzZmJfZHVtcCh2b2lkKTsKQEAgLTU4NCw0NSArNDU5LDI4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqIEJFR0lOIEhhcmR3YXJlIHNwZWNpZmljIFJvdXRpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBHZXQgYSBnb29kIE1DTEsgdmFsdWUgKi8KLXN0YXRpYyBsb25nIGNpcnJ1c2ZiX2dldF9tY2xrKGxvbmcgZnJlcSwgaW50IGJwcCwgbG9uZyAqZGl2KQorLyogQ2hlY2sgaWYgdGhlIE1DTEsgaXMgbm90IGEgYmV0dGVyIGNsb2NrIHNvdXJjZSAqLworc3RhdGljIGludCBjaXJydXNmYl9jaGVja19tY2xrKHN0cnVjdCBjaXJydXNmYl9pbmZvICpjaW5mbywgbG9uZyBmcmVxKQogewotCWxvbmcgbWNsazsKKwlsb25nIG1jbGsgPSB2Z2FfcnNlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFGKSAmIDB4M2Y7CiAKLQlhc3NlcnQoZGl2ICE9IE5VTEwpOwotCi0JLyogQ2FsY3VsYXRlIE1DTEssIGluIGNhc2UgVkNMSyBpcyBoaWdoIGVub3VnaCB0byByZXF1aXJlID4gNTBNSHouCi0JICogQXNzdW1lIGEgNjQtYml0IGRhdGEgcGF0aCBmb3Igbm93LiAgVGhlIGZvcm11bGEgaXM6Ci0JICogKChCICogUENMSyAqIDIpL1cpICogMS4yCi0JICogQiA9IGJ5dGVzIHBlciBwaXhlbCwgUENMSyA9IHBpeGNsb2NrLCBXID0gZGF0YSB3aWR0aCBpbiBieXRlcyAqLwotCW1jbGsgPSAoKGJwcCAvIDgpICogZnJlcSAqIDIpIC8gNDsKLQltY2xrID0gKG1jbGsgKiAxMikgLyAxMDsKLQlpZiAobWNsayA8IDUwMDAwKQotCQltY2xrID0gNTAwMDA7Ci0JRFBSSU5USygiVXNlIE1DTEsgb2YgJWxkIGtIelxuIiwgbWNsayk7Ci0KLQkvKiBDYWxjdWxhdGUgdmFsdWUgZm9yIFNSMUYuICBNdWx0aXBseSBieSAyIHNvIHdlIGNhbiByb3VuZCB1cC4gKi8KLQltY2xrID0gKChtY2xrICogMTYpIC8gMTQzMTgpOwotCW1jbGsgPSAobWNsayArIDEpIC8gMjsKLQlEUFJJTlRLKCJTZXQgU1IxRls1OjBdIHRvIDB4JWx4XG4iLCBtY2xrKTsKKwkvKiBSZWFkIE1DTEsgdmFsdWUgKi8KKwltY2xrID0gKDE0MzE4ICogbWNsaykgPj4gMzsKKwlEUFJJTlRLKCJSZWFkIE1DTEsgb2YgJWxkIGtIelxuIiwgbWNsayk7CiAKIAkvKiBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHVzZSBNQ0xLIGluc3RlYWQgb2YgVkNMSywgYW5kIGlmIHNvLCB3aGF0IHdlCi0JICAgKiBzaG91bGQgZGl2aWRlIGl0IGJ5IHRvIGdldCBWQ0xLICovCi0Jc3dpdGNoIChmcmVxKSB7Ci0JY2FzZSAyNDc1MSAuLi4gMjUyNDk6Ci0JCSpkaXYgPSAyOwotCQlEUFJJTlRLKCJVc2luZyBWQ0xLID0gTUNMSy8yXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OTUwMSAuLi4gNTA0OTk6Ci0JCSpkaXYgPSAxOworCSAqIHNob3VsZCBkaXZpZGUgaXQgYnkgdG8gZ2V0IFZDTEsKKwkgKi8KKworCWlmIChhYnMoZnJlcSAtIG1jbGspIDwgMjUwKSB7CiAJCURQUklOVEsoIlVzaW5nIFZDTEsgPSBNQ0xLXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKmRpdiA9IDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGFicyhmcmVxIC0gKG1jbGsgLyAyKSkgPCAyNTApIHsKKwkJRFBSSU5USygiVXNpbmcgVkNMSyA9IE1DTEsvMlxuIik7CisJCXJldHVybiAyOwogCX0KIAotCXJldHVybiBtY2xrOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNpcnJ1c2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKQEAgLTYzOCw3ICs0OTYsNiBAQAogCQlicmVhazsJCS8qIDggcGl4ZWwgcGVyIGJ5dGUsIG9ubHkgMS80dGggb2YgbWVtIHVzYWJsZSAqLwogCWNhc2UgODoKIAljYXNlIDE2OgotCWNhc2UgMjQ6CiAJY2FzZSAzMjoKIAkJYnJlYWs7CQkvKiAxIHBpeGVsID09IDEgYnl0ZSAqLwogCWRlZmF1bHQ6CkBAIC03MTMsNyArNTcwLDYgQEAKIAkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CiAJCWJyZWFrOwogCi0JY2FzZSAyNDoKIAljYXNlIDMyOgogCQlpZiAoaXNQUmVQKSB7CiAJCQl2YXItPnJlZC5vZmZzZXQgPSA4OwpAQCAtNzY3LDggKzYyMyw2IEBACiAJbG9uZyBtYXhjbG9jazsKIAlpbnQgbWF4Y2xvY2tpZHggPSB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDM7CiAJc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvID0gaW5mby0+cGFyOwotCWludCB4cmVzLCBoZnJvbnQsIGhzeW5jLCBoYmFjazsKLQlpbnQgeXJlcywgdmZyb250LCB2c3luYywgdmJhY2s7CiAKIAlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDE6CkBAIC03ODIsMTAgKzYzNiw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSAxNjoKLQljYXNlIDI0OgogCWNhc2UgMzI6CiAJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogbWF4Y2xvY2tpZHg7Ci0JCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfRElSRUNUQ09MT1I7CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC04MjcsOTAgKzY4MCwzMyBAQAogCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgMTY6CiAJY2FzZSAzMjoKLQkJaWYgKHJlZ3MtPkhvcml6UmVzIDw9IDgwMCkKKwkJaWYgKHZhci0+eHJlcyA8PSA4MDApCiAJCQkvKiBYYmggaGFzIHRoaXMgdHlwZSBvZiBjbG9jayBmb3IgMzItYml0ICovCiAJCQlmcmVxIC89IDI7CiAJCWJyZWFrOwogCX0KICNlbmRpZgotCi0JYmVzdGNsb2NrKGZyZXEsICZyZWdzLT5mcmVxLCAmcmVncy0+bm9tLCAmcmVncy0+ZGVuLCAmcmVncy0+ZGl2LAotCQkgIG1heGNsb2NrKTsKLQlyZWdzLT5tY2xrID0gY2lycnVzZmJfZ2V0X21jbGsoZnJlcSwgdmFyLT5iaXRzX3Blcl9waXhlbCwKLQkJCQkJJnJlZ3MtPmRpdk1DTEspOwotCi0JeHJlcyA9IHZhci0+eHJlczsKLQloZnJvbnQgPSB2YXItPnJpZ2h0X21hcmdpbjsKLQloc3luYyA9IHZhci0+aHN5bmNfbGVuOwotCWhiYWNrID0gdmFyLT5sZWZ0X21hcmdpbjsKLQotCXlyZXMgPSB2YXItPnlyZXM7Ci0JdmZyb250ID0gdmFyLT5sb3dlcl9tYXJnaW47Ci0JdnN5bmMgPSB2YXItPnZzeW5jX2xlbjsKLQl2YmFjayA9IHZhci0+dXBwZXJfbWFyZ2luOwotCi0JaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpIHsKLQkJeXJlcyAqPSAyOwotCQl2ZnJvbnQgKj0gMjsKLQkJdnN5bmMgKj0gMjsKLQkJdmJhY2sgKj0gMjsKLQl9IGVsc2UgaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7Ci0JCXlyZXMgPSAoeXJlcyArIDEpIC8gMjsKLQkJdmZyb250ID0gKHZmcm9udCArIDEpIC8gMjsKLQkJdnN5bmMgPSAodnN5bmMgKyAxKSAvIDI7Ci0JCXZiYWNrID0gKHZiYWNrICsgMSkgLyAyOwotCX0KLQlyZWdzLT5Ib3JpelJlcyA9IHhyZXM7Ci0JcmVncy0+SG9yaXpUb3RhbCA9ICh4cmVzICsgaGZyb250ICsgaHN5bmMgKyBoYmFjaykgLyA4IC0gNTsKLQlyZWdzLT5Ib3JpekRpc3BFbmQgPSB4cmVzIC8gOCAtIDE7Ci0JcmVncy0+SG9yaXpCbGFua1N0YXJ0ID0geHJlcyAvIDg7Ci0JLyogZG9lcyBub3QgY291bnQgd2l0aCAiLTUiICovCi0JcmVncy0+SG9yaXpCbGFua0VuZCA9IHJlZ3MtPkhvcml6VG90YWwgKyA1OwotCXJlZ3MtPkhvcml6U3luY1N0YXJ0ID0gKHhyZXMgKyBoZnJvbnQpIC8gOCArIDE7Ci0JcmVncy0+SG9yaXpTeW5jRW5kID0gKHhyZXMgKyBoZnJvbnQgKyBoc3luYykgLyA4ICsgMTsKLQotCXJlZ3MtPlZlcnRSZXMgPSB5cmVzOwotCXJlZ3MtPlZlcnRUb3RhbCA9IHlyZXMgKyB2ZnJvbnQgKyB2c3luYyArIHZiYWNrIC0gMjsKLQlyZWdzLT5WZXJ0RGlzcEVuZCA9IHlyZXMgLSAxOwotCXJlZ3MtPlZlcnRCbGFua1N0YXJ0ID0geXJlczsKLQlyZWdzLT5WZXJ0QmxhbmtFbmQgPSByZWdzLT5WZXJ0VG90YWw7Ci0JcmVncy0+VmVydFN5bmNTdGFydCA9IHlyZXMgKyB2ZnJvbnQgLSAxOwotCXJlZ3MtPlZlcnRTeW5jRW5kID0geXJlcyArIHZmcm9udCArIHZzeW5jIC0gMTsKLQotCWlmIChyZWdzLT5WZXJ0UmVzID49IDEwMjQpIHsKLQkJcmVncy0+VmVydFRvdGFsIC89IDI7Ci0JCXJlZ3MtPlZlcnRTeW5jU3RhcnQgLz0gMjsKLQkJcmVncy0+VmVydFN5bmNFbmQgLz0gMjsKLQkJcmVncy0+VmVydERpc3BFbmQgLz0gMjsKLQl9Ci0JaWYgKHJlZ3MtPm11bHRpcGxleGluZykgewotCQlyZWdzLT5Ib3JpelRvdGFsIC89IDI7Ci0JCXJlZ3MtPkhvcml6U3luY1N0YXJ0IC89IDI7Ci0JCXJlZ3MtPkhvcml6U3luY0VuZCAvPSAyOwotCQlyZWdzLT5Ib3JpekRpc3BFbmQgLz0gMjsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2lycnVzZmJfc2V0X21jbGsoY29uc3Qgc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvLCBpbnQgdmFsLAotCQkJCWludCBkaXYpCitzdGF0aWMgdm9pZCBjaXJydXNmYl9zZXRfbWNsa19hc19zb3VyY2UoY29uc3Qgc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvLAorCQkJCQlpbnQgZGl2KQogeworCXVuc2lnbmVkIGNoYXIgb2xkMWYsIG9sZDFlOwogCWFzc2VydChjaW5mbyAhPSBOVUxMKTsKKwlvbGQxZiA9IHZnYV9yc2VxKGNpbmZvLT5yZWdiYXNlLCBDTF9TRVFSMUYpICYgfjB4NDA7CiAKLQlpZiAoZGl2ID09IDIpIHsKLQkJLyogVkNMSyA9IE1DTEsvMiAqLwotCQl1bnNpZ25lZCBjaGFyIG9sZCA9IHZnYV9yc2VxKGNpbmZvLT5yZWdiYXNlLCBDTF9TRVFSMUUpOwotCQl2Z2Ffd3NlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFFLCBvbGQgfCAweDEpOwotCQl2Z2Ffd3NlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFGLCAweDQwIHwgKHZhbCAmIDB4M2YpKTsKLQl9IGVsc2UgaWYgKGRpdiA9PSAxKSB7Ci0JCS8qIFZDTEsgPSBNQ0xLICovCi0JCXVuc2lnbmVkIGNoYXIgb2xkID0gdmdhX3JzZXEoY2luZm8tPnJlZ2Jhc2UsIENMX1NFUVIxRSk7Ci0JCXZnYV93c2VxKGNpbmZvLT5yZWdiYXNlLCBDTF9TRVFSMUUsIG9sZCAmIH4weDEpOwotCQl2Z2Ffd3NlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFGLCAweDQwIHwgKHZhbCAmIDB4M2YpKTsKLQl9IGVsc2UgewotCQl2Z2Ffd3NlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFGLCB2YWwgJiAweDNmKTsKKwlpZiAoZGl2KSB7CisJCURQUklOVEsoIlNldCAlcyBhcyBwaXhjbG9jayBzb3VyY2UuXG4iLAorCQkJCQkoZGl2ID09IDIpID8gIk1DTEsvMiIgOiAiTUNMSyIpOworCQlvbGQxZiB8PSAweDQwOworCQlvbGQxZSA9IHZnYV9yc2VxKGNpbmZvLT5yZWdiYXNlLCBDTF9TRVFSMUUpICYgfjB4MTsKKwkJaWYgKGRpdiA9PSAyKQorCQkJb2xkMWUgfD0gMTsKKworCQl2Z2Ffd3NlcShjaW5mby0+cmVnYmFzZSwgQ0xfU0VRUjFFLCBvbGQxZSk7CiAJfQorCXZnYV93c2VxKGNpbmZvLT5yZWdiYXNlLCBDTF9TRVFSMUYsIG9sZDFmKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTkyNyw2ICs3MjMsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIHRtcDsKIAlpbnQgb2Zmc2V0ID0gMCwgZXJyOwogCWNvbnN0IHN0cnVjdCBjaXJydXNmYl9ib2FyZF9pbmZvX3JlYyAqYmk7CisJaW50IGhkaXNwZW5kLCBoc3luY3N0YXJ0LCBoc3luY2VuZCwgaHRvdGFsOworCWludCB5cmVzLCB2ZGlzcGVuZCwgdnN5bmNzdGFydCwgdnN5bmNlbmQsIHZ0b3RhbDsKKwlsb25nIGZyZXE7CisJaW50IG5vbSwgZGVuLCBkaXY7CiAKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAJRFBSSU5USygiUmVxdWVzdGVkIG1vZGU6ICVkeCVkeCVkXG4iLApAQCAtOTQ0LDc2ICs3NDQsMTE3IEBACiAKIAliaSA9ICZjaXJydXNmYl9ib2FyZF9pbmZvW2NpbmZvLT5idHlwZV07CiAKKwloc3luY3N0YXJ0ID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW47CisJaHN5bmNlbmQgPSBoc3luY3N0YXJ0ICsgdmFyLT5oc3luY19sZW47CisJaHRvdGFsID0gKGhzeW5jZW5kICsgdmFyLT5sZWZ0X21hcmdpbikgLyA4IC0gNTsKKwloZGlzcGVuZCA9IHZhci0+eHJlcyAvIDggLSAxOworCWhzeW5jc3RhcnQgPSBoc3luY3N0YXJ0IC8gOCArIDE7CisJaHN5bmNlbmQgPSBoc3luY2VuZCAvIDggKyAxOworCisJeXJlcyA9IHZhci0+eXJlczsKKwl2c3luY3N0YXJ0ID0geXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOworCXZzeW5jZW5kID0gdnN5bmNzdGFydCArIHZhci0+dnN5bmNfbGVuOworCXZ0b3RhbCA9IHZzeW5jZW5kICsgdmFyLT51cHBlcl9tYXJnaW47CisJdmRpc3BlbmQgPSB5cmVzIC0gMTsKKworCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSB7CisJCXlyZXMgKj0gMjsKKwkJdnN5bmNzdGFydCAqPSAyOworCQl2c3luY2VuZCAqPSAyOworCQl2dG90YWwgKj0gMjsKKwl9IGVsc2UgaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CisJCXlyZXMgPSAoeXJlcyArIDEpIC8gMjsKKwkJdnN5bmNzdGFydCA9ICh2c3luY3N0YXJ0ICsgMSkgLyAyOworCQl2c3luY2VuZCA9ICh2c3luY2VuZCArIDEpIC8gMjsKKwkJdnRvdGFsID0gKHZ0b3RhbCArIDEpIC8gMjsKKwl9CisKKwl2dG90YWwgLT0gMjsKKwl2c3luY3N0YXJ0IC09IDE7CisJdnN5bmNlbmQgLT0gMTsKKworCWlmICh5cmVzID49IDEwMjQpIHsKKwkJdnRvdGFsIC89IDI7CisJCXZzeW5jc3RhcnQgLz0gMjsKKwkJdnN5bmNlbmQgLz0gMjsKKwkJdmRpc3BlbmQgLz0gMjsKKwl9CisJaWYgKHJlZ3MubXVsdGlwbGV4aW5nKSB7CisJCWh0b3RhbCAvPSAyOworCQloc3luY3N0YXJ0IC89IDI7CisJCWhzeW5jZW5kIC89IDI7CisJCWhkaXNwZW5kIC89IDI7CisJfQogCS8qIHVubG9jayByZWdpc3RlciBWR0FfQ1JUQ19IX1RPVEFMLi5DUlQ3ICovCiAJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfVl9TWU5DX0VORCwgMHgyMCk7CS8qIHByZXZpb3VzbHk6IDB4MDApICovCiAKIAkvKiBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCwgYWxsIHBhcmFtZXRlcnMgZ2V0IG91dHB1dCBiZWZvcmUgd3JpdGluZyAqLwotCURQUklOVEsoIkNSVDA6ICVsZFxuIiwgcmVncy5Ib3JpelRvdGFsKTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19IX1RPVEFMLCByZWdzLkhvcml6VG90YWwpOworCURQUklOVEsoIkNSVDA6ICVkXG4iLCBodG90YWwpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX0hfVE9UQUwsIGh0b3RhbCk7CiAKLQlEUFJJTlRLKCJDUlQxOiAlbGRcbiIsIHJlZ3MuSG9yaXpEaXNwRW5kKTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19IX0RJU1AsIHJlZ3MuSG9yaXpEaXNwRW5kKTsKKwlEUFJJTlRLKCJDUlQxOiAlZFxuIiwgaGRpc3BlbmQpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX0hfRElTUCwgaGRpc3BlbmQpOwogCi0JRFBSSU5USygiQ1JUMjogJWxkXG4iLCByZWdzLkhvcml6QmxhbmtTdGFydCk7Ci0JdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfSF9CTEFOS19TVEFSVCwgcmVncy5Ib3JpekJsYW5rU3RhcnQpOworCURQUklOVEsoIkNSVDI6ICVkXG4iLCB2YXItPnhyZXMgLyA4KTsKKwl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19IX0JMQU5LX1NUQVJULCB2YXItPnhyZXMgLyA4KTsKIAogCS8qICArIDEyODogQ29tcGF0aWJsZSByZWFkICovCi0JRFBSSU5USygiQ1JUMzogMTI4KyVsZFxuIiwgcmVncy5Ib3JpekJsYW5rRW5kICUgMzIpOworCURQUklOVEsoIkNSVDM6IDEyOCslZFxuIiwgKGh0b3RhbCArIDUpICUgMzIpOwogCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX0hfQkxBTktfRU5ELAotCQkgMTI4ICsgKHJlZ3MuSG9yaXpCbGFua0VuZCAlIDMyKSk7CisJCSAxMjggKyAoKGh0b3RhbCArIDUpICUgMzIpKTsKIAotCURQUklOVEsoIkNSVDQ6ICVsZFxuIiwgcmVncy5Ib3JpelN5bmNTdGFydCk7Ci0JdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfSF9TWU5DX1NUQVJULCByZWdzLkhvcml6U3luY1N0YXJ0KTsKKwlEUFJJTlRLKCJDUlQ0OiAlZFxuIiwgaHN5bmNzdGFydCk7CisJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfSF9TWU5DX1NUQVJULCBoc3luY3N0YXJ0KTsKIAotCXRtcCA9IHJlZ3MuSG9yaXpTeW5jRW5kICUgMzI7Ci0JaWYgKHJlZ3MuSG9yaXpCbGFua0VuZCAmIDMyKQorCXRtcCA9IGhzeW5jZW5kICUgMzI7CisJaWYgKChodG90YWwgKyA1KSAmIDMyKQogCQl0bXAgKz0gMTI4OwogCURQUklOVEsoIkNSVDU6ICVkXG4iLCB0bXApOwogCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX0hfU1lOQ19FTkQsIHRtcCk7CiAKLQlEUFJJTlRLKCJDUlQ2OiAlbGRcbiIsIHJlZ3MuVmVydFRvdGFsICYgMHhmZik7Ci0JdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfVl9UT1RBTCwgKHJlZ3MuVmVydFRvdGFsICYgMHhmZikpOworCURQUklOVEsoIkNSVDY6ICVkXG4iLCB2dG90YWwgJiAweGZmKTsKKwl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX1RPVEFMLCB2dG90YWwgJiAweGZmKTsKIAogCXRtcCA9IDE2OwkJLyogTGluZUNvbXBhcmUgYml0ICM5ICovCi0JaWYgKHJlZ3MuVmVydFRvdGFsICYgMjU2KQorCWlmICh2dG90YWwgJiAyNTYpCiAJCXRtcCB8PSAxOwotCWlmIChyZWdzLlZlcnREaXNwRW5kICYgMjU2KQorCWlmICh2ZGlzcGVuZCAmIDI1NikKIAkJdG1wIHw9IDI7Ci0JaWYgKHJlZ3MuVmVydFN5bmNTdGFydCAmIDI1NikKKwlpZiAodnN5bmNzdGFydCAmIDI1NikKIAkJdG1wIHw9IDQ7Ci0JaWYgKHJlZ3MuVmVydEJsYW5rU3RhcnQgJiAyNTYpCisJaWYgKCh2ZGlzcGVuZCArIDEpICYgMjU2KQogCQl0bXAgfD0gODsKLQlpZiAocmVncy5WZXJ0VG90YWwgJiA1MTIpCisJaWYgKHZ0b3RhbCAmIDUxMikKIAkJdG1wIHw9IDMyOwotCWlmIChyZWdzLlZlcnREaXNwRW5kICYgNTEyKQorCWlmICh2ZGlzcGVuZCAmIDUxMikKIAkJdG1wIHw9IDY0OwotCWlmIChyZWdzLlZlcnRTeW5jU3RhcnQgJiA1MTIpCisJaWYgKHZzeW5jc3RhcnQgJiA1MTIpCiAJCXRtcCB8PSAxMjg7CiAJRFBSSU5USygiQ1JUNzogJWRcbiIsIHRtcCk7CiAJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfT1ZFUkZMT1csIHRtcCk7CiAKIAl0bXAgPSAweDQwOwkJLyogTGluZUNvbXBhcmUgYml0ICM4ICovCi0JaWYgKHJlZ3MuVmVydEJsYW5rU3RhcnQgJiA1MTIpCisJaWYgKCh2ZGlzcGVuZCArIDEpICYgNTEyKQogCQl0bXAgfD0gMHgyMDsKIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkKIAkJdG1wIHw9IDB4ODA7CiAJRFBSSU5USygiQ1JUOTogJWRcbiIsIHRtcCk7CiAJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfTUFYX1NDQU4sIHRtcCk7CiAKLQlEUFJJTlRLKCJDUlQxMDogJWxkXG4iLCByZWdzLlZlcnRTeW5jU3RhcnQgJiAweGZmKTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX1NZTkNfU1RBUlQsIHJlZ3MuVmVydFN5bmNTdGFydCAmIDB4ZmYpOworCURQUklOVEsoIkNSVDEwOiAlZFxuIiwgdnN5bmNzdGFydCAmIDB4ZmYpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX1ZfU1lOQ19TVEFSVCwgdnN5bmNzdGFydCAmIDB4ZmYpOwogCi0JRFBSSU5USygiQ1JUMTE6IDY0KzMyKyVsZFxuIiwgcmVncy5WZXJ0U3luY0VuZCAlIDE2KTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX1NZTkNfRU5ELCByZWdzLlZlcnRTeW5jRW5kICUgMTYgKyA2NCArIDMyKTsKKwlEUFJJTlRLKCJDUlQxMTogNjQrMzIrJWRcbiIsIHZzeW5jZW5kICUgMTYpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX1ZfU1lOQ19FTkQsIHZzeW5jZW5kICUgMTYgKyA2NCArIDMyKTsKIAotCURQUklOVEsoIkNSVDEyOiAlbGRcbiIsIHJlZ3MuVmVydERpc3BFbmQgJiAweGZmKTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX0RJU1BfRU5ELCByZWdzLlZlcnREaXNwRW5kICYgMHhmZik7CisJRFBSSU5USygiQ1JUMTI6ICVkXG4iLCB2ZGlzcGVuZCAmIDB4ZmYpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX1ZfRElTUF9FTkQsIHZkaXNwZW5kICYgMHhmZik7CiAKLQlEUFJJTlRLKCJDUlQxNTogJWxkXG4iLCByZWdzLlZlcnRCbGFua1N0YXJ0ICYgMHhmZik7Ci0JdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfVl9CTEFOS19TVEFSVCwgcmVncy5WZXJ0QmxhbmtTdGFydCAmIDB4ZmYpOworCURQUklOVEsoIkNSVDE1OiAlZFxuIiwgKHZkaXNwZW5kICsgMSkgJiAweGZmKTsKKwl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX0JMQU5LX1NUQVJULCAodmRpc3BlbmQgKyAxKSAmIDB4ZmYpOwogCi0JRFBSSU5USygiQ1JUMTY6ICVsZFxuIiwgcmVncy5WZXJ0QmxhbmtFbmQgJiAweGZmKTsKLQl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19WX0JMQU5LX0VORCwgcmVncy5WZXJ0QmxhbmtFbmQgJiAweGZmKTsKKwlEUFJJTlRLKCJDUlQxNjogJWRcbiIsIHZ0b3RhbCAmIDB4ZmYpOworCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX1ZfQkxBTktfRU5ELCB2dG90YWwgJiAweGZmKTsKIAogCURQUklOVEsoIkNSVDE4OiAweGZmXG4iKTsKIAl2Z2Ffd2NydChyZWdiYXNlLCBWR0FfQ1JUQ19MSU5FX0NPTVBBUkUsIDB4ZmYpOwpAQCAtMTAyMSwzOCArODYyLDUzIEBACiAJdG1wID0gMDsKIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQpCiAJCXRtcCB8PSAxOwotCWlmIChyZWdzLkhvcml6QmxhbmtFbmQgJiA2NCkKKwlpZiAoKGh0b3RhbCArIDUpICYgNjQpCiAJCXRtcCB8PSAxNjsKLQlpZiAocmVncy5Ib3JpekJsYW5rRW5kICYgMTI4KQorCWlmICgoaHRvdGFsICsgNSkgJiAxMjgpCiAJCXRtcCB8PSAzMjsKLQlpZiAocmVncy5WZXJ0QmxhbmtFbmQgJiAyNTYpCisJaWYgKHZ0b3RhbCAmIDI1NikKIAkJdG1wIHw9IDY0OwotCWlmIChyZWdzLlZlcnRCbGFua0VuZCAmIDUxMikKKwlpZiAodnRvdGFsICYgNTEyKQogCQl0bXAgfD0gMTI4OwogCiAJRFBSSU5USygiQ1JUMWE6ICVkXG4iLCB0bXApOwogCXZnYV93Y3J0KHJlZ2Jhc2UsIENMX0NSVDFBLCB0bXApOwogCisJZnJlcSA9IFBJQ09TMktIWih2YXItPnBpeGNsb2NrKTsKKwliZXN0Y2xvY2soZnJlcSwgJm5vbSwgJmRlbiwgJmRpdik7CisKIAkvKiBzZXQgVkNMSzAgKi8KIAkvKiBoYXJkd2FyZSBSZWZDbG9jazogMTQuMzE4MTggTUh6ICovCiAJLyogZm9ybXVsYTogVkNsayA9IChPU0MgKiBOKSAvIChEICogKDErUCkpICovCiAJLyogRXhhbXBsZTogVkNsayA9ICgxNC4zMTgxOCAqIDkxKSAvICgyMyAqICgxKzEpKSA9IDI4LjMyNSBNSHogKi8KIAotCXZnYV93c2VxKHJlZ2Jhc2UsIENMX1NFUVJCLCByZWdzLm5vbSk7Ci0JdG1wID0gcmVncy5kZW4gPDwgMTsKLQlpZiAocmVncy5kaXYgIT0gMCkKLQkJdG1wIHw9IDE7CisJaWYgKGNpbmZvLT5idHlwZSA9PSBCVF9BTFBJTkUpIHsKKwkJLyogaWYgZnJlcSBpcyBjbG9zZSB0byBtY2xrIG9yIG1jbGsvMiBzZWxlY3QgbWNsaworCQkgKiBhcyBjbG9jayBzb3VyY2UKKwkJICovCisJCWludCBkaXZNQ0xLID0gY2lycnVzZmJfY2hlY2tfbWNsayhjaW5mbywgZnJlcSk7CisJCWlmIChkaXZNQ0xLKSAgeworCQkJbm9tID0gMDsKKwkJCWNpcnJ1c2ZiX3NldF9tY2xrX2FzX3NvdXJjZShjaW5mbywgZGl2TUNMSyk7CisJCX0KKwl9CisJaWYgKG5vbSkgeworCQl2Z2Ffd3NlcShyZWdiYXNlLCBDTF9TRVFSQiwgbm9tKTsKKwkJdG1wID0gZGVuIDw8IDE7CisJCWlmIChkaXYgIT0gMCkKKwkJCXRtcCB8PSAxOwogCi0JLyogNiBiaXQgZGVub207IE9OTFkgNTQzNCEhISAoYnVnZ2VkIG1lIDEwIGRheXMpICovCi0JaWYgKChjaW5mby0+YnR5cGUgPT0gQlRfU0Q2NCkgfHwKLQkgICAgKGNpbmZvLT5idHlwZSA9PSBCVF9BTFBJTkUpIHx8Ci0JICAgIChjaW5mby0+YnR5cGUgPT0gQlRfR0Q1NDgwKSkKLQkJdG1wIHw9IDB4ODA7CisJCS8qIDYgYml0IGRlbm9tOyBPTkxZIDU0MzQhISEgKGJ1Z2dlZCBtZSAxMCBkYXlzKSAqLworCQlpZiAoKGNpbmZvLT5idHlwZSA9PSBCVF9TRDY0KSB8fAorCQkgICAgKGNpbmZvLT5idHlwZSA9PSBCVF9BTFBJTkUpIHx8CisJCSAgICAoY2luZm8tPmJ0eXBlID09IEJUX0dENTQ4MCkpCisJCQl0bXAgfD0gMHg4MDsKIAotCURQUklOVEsoIkNMX1NFUVIxQjogJWxkXG4iLCAobG9uZykgdG1wKTsKLQl2Z2Ffd3NlcShyZWdiYXNlLCBDTF9TRVFSMUIsIHRtcCk7CisJCURQUklOVEsoIkNMX1NFUVIxQjogJWxkXG4iLCAobG9uZykgdG1wKTsKKwkJdmdhX3dzZXEocmVnYmFzZSwgQ0xfU0VRUjFCLCB0bXApOworCX0KIAotCWlmIChyZWdzLlZlcnRSZXMgPj0gMTAyNCkKKwlpZiAoeXJlcyA+PSAxMDI0KQogCQkvKiAxMjgweDEwMjQgKi8KIAkJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfTU9ERSwgMHhjNyk7CiAJZWxzZQpAQCAtMTA2Niw3ICs5MjIsNyBAQAogCS8qIGRvbid0IGtub3cgaWYgaXQgd291bGQgaHVydCB0byBhbHNvIHByb2dyYW0gdGhpcyBpZiBubyBpbnRlcmxhY2VkICovCiAJLyogbW9kZSBpcyB1c2VkLCBidXQgSSBmZWVsIGJldHRlciB0aGlzIHdheS4uIDotKSAqLwogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkKLQkJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfUkVHUywgcmVncy5Ib3JpelRvdGFsIC8gMik7CisJCXZnYV93Y3J0KHJlZ2Jhc2UsIFZHQV9DUlRDX1JFR1MsIGh0b3RhbCAvIDIpOwogCWVsc2UKIAkJdmdhX3djcnQocmVnYmFzZSwgVkdBX0NSVENfUkVHUywgMHgwMCk7CS8qIGludGVybGFjZSBjb250cm9sICovCiAKQEAgLTEyNDAsNyArMTA5Niw2IEBACiAKIAkJY2FzZSBCVF9BTFBJTkU6CiAJCQlEUFJJTlRLKCIgKGZvciBHRDU0M3gpXG4iKTsKLQkJCWNpcnJ1c2ZiX3NldF9tY2xrKGNpbmZvLCByZWdzLm1jbGssIHJlZ3MuZGl2TUNMSyk7CiAJCQkvKiBXZSBhbHJlYWR5IHNldCBTUkYgYW5kIFNSMUYgKi8KIAkJCWJyZWFrOwogCkBAIC0xMzEyLDExICsxMTY3LDcgQEAKIAogCQljYXNlIEJUX0FMUElORToKIAkJCURQUklOVEsoIiAoZm9yIEdENTQzeClcbiIpOwotCQkJaWYgKHJlZ3MuSG9yaXpSZXMgPj0gMTAyNCkKLQkJCQl2Z2Ffd3NlcShyZWdiYXNlLCBDTF9TRVFSNywgMHhhNyk7Ci0JCQllbHNlCi0JCQkJdmdhX3dzZXEocmVnYmFzZSwgQ0xfU0VRUjcsIDB4YTMpOwotCQkJY2lycnVzZmJfc2V0X21jbGsoY2luZm8sIHJlZ3MubWNsaywgcmVncy5kaXZNQ0xLKTsKKwkJCXZnYV93c2VxKHJlZ2Jhc2UsIENMX1NFUVI3LCAweGE3KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQlRfR0Q1NDgwOgpAQCAtMTM2MCw3ICsxMjExLDcgQEAKIAkgKi8KIAogCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMzIpIHsKLQkJRFBSSU5USygiY2lycnVzZmI6IHByZXBhcmluZyBmb3IgMjQvMzIgYml0IGRlZXAgZGlzcGxheVxuIik7CisJCURQUklOVEsoImNpcnJ1c2ZiOiBwcmVwYXJpbmcgZm9yIDMyIGJpdCBkZWVwIGRpc3BsYXlcbiIpOwogCQlzd2l0Y2ggKGNpbmZvLT5idHlwZSkgewogCQljYXNlIEJUX1NENjQ6CiAJCQkvKiBFeHRlbmRlZCBTZXF1ZW5jZXIgTW9kZTogMjU2YyBjb2wuIG1vZGUgKi8KQEAgLTEzOTQsNyArMTI0NSw2IEBACiAJCWNhc2UgQlRfQUxQSU5FOgogCQkJRFBSSU5USygiIChmb3IgR0Q1NDN4KVxuIik7CiAJCQl2Z2Ffd3NlcShyZWdiYXNlLCBDTF9TRVFSNywgMHhhOSk7Ci0JCQljaXJydXNmYl9zZXRfbWNsayhjaW5mbywgcmVncy5tY2xrLCByZWdzLmRpdk1DTEspOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBCVF9HRDU0ODA6CkBAIC0xOTQ5LDggKzE3OTksNiBAQAogCS8qIG1pc2MuLi4gKi8KIAlXSERSKGNpbmZvLCAwKTsJLyogSGlkZGVuIERBQyByZWdpc3RlcjogLSAqLwogCi0JcHJpbnRrKEtFUk5fREVCVUcgImNpcnJ1c2ZiOiBUaGlzIGJvYXJkIGhhcyAlbGQgYnl0ZXMgb2YgRFJBTSBtZW1vcnlcbiIsCi0JCWluZm8tPnNjcmVlbl9zaXplKTsKIAlEUFJJTlRLKCJFWElUXG4iKTsKIAlyZXR1cm47CiB9CkBAIC0yMTIyLDcgKzE5NzAsNyBAQAogICogYmFzZWQgb24gdGhlIERSQU0gYmFuZHdpZHRoIGJpdCBhbmQgRFJBTSBiYW5rIHN3aXRjaGluZyBiaXQuICBUaGlzCiAgKiB3b3JrcyB3aXRoIDFNQiwgMk1CIGFuZCA0TUIgY29uZmlndXJhdGlvbnMgKHdoaWNoIHRoZSBNb3Rvcm9sYSBib2FyZHMKICAqIHNlZW0gdG8gaGF2ZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2lycnVzZmJfZ2V0X21lbXNpemUodTggX19pb21lbSAqcmVnYmFzZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGNpcnJ1c2ZiX2dldF9tZW1zaXplKHU4IF9faW9tZW0gKnJlZ2Jhc2UpCiB7CiAJdW5zaWduZWQgbG9uZyBtZW07CiAJdW5zaWduZWQgY2hhciBTUkY7CkBAIC0yMTg4LDggKzIwMzYsNyBAQAogCiBzdGF0aWMgdm9pZCBjaXJydXNmYl9wY2lfdW5tYXAoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvID0gaW5mby0+cGFyOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY2luZm8tPnBkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGluZm8tPmRldmljZSk7CiAKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKICNpZiAwIC8qIGlmIHN5c3RlbSBkaWRuJ3QgY2xhaW0gdGhpcyByZWdpb24sIHdlIHdvdWxkLi4uICovCkBAIC0yMjA1LDIwICsyMDUyLDIyIEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2lycnVzZmJfem9ycm9fdW5tYXAoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvID0gaW5mby0+cGFyOwotCXpvcnJvX3JlbGVhc2VfZGV2aWNlKGNpbmZvLT56ZGV2KTsKKwlzdHJ1Y3Qgem9ycm9fZGV2ICp6ZGV2ID0gdG9fem9ycm9fZGV2KGluZm8tPmRldmljZSk7CisKKwl6b3Jyb19yZWxlYXNlX2RldmljZSh6ZGV2KTsKIAogCWlmIChjaW5mby0+YnR5cGUgPT0gQlRfUElDQVNTTzQpIHsKIAkJY2luZm8tPnJlZ2Jhc2UgLT0gMHg2MDAwMDA7CiAJCWlvdW5tYXAoKHZvaWQgKiljaW5mby0+cmVnYmFzZSk7CiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCX0gZWxzZSB7Ci0JCWlmICh6b3Jyb19yZXNvdXJjZV9zdGFydChjaW5mby0+emRldikgPiAweDAxMDAwMDAwKQorCQlpZiAoem9ycm9fcmVzb3VyY2Vfc3RhcnQoemRldikgPiAweDAxMDAwMDAwKQogCQkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJfQogfQogI2VuZGlmIC8qIENPTkZJR19aT1JSTyAqLwogCi1zdGF0aWMgaW50IGNpcnJ1c2ZiX3NldF9mYmluZm8oc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaXJydXNmYl9zZXRfZmJpbmZvKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBjaXJydXNmYl9pbmZvICpjaW5mbyA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CkBAIC0yMjM1LDcgKzIwODQsNyBAQAogCWlmIChjaW5mby0+YnR5cGUgPT0gQlRfR0Q1NDgwKSB7CiAJCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDE2KQogCQkJaW5mby0+c2NyZWVuX2Jhc2UgKz0gMSAqIE1CXzsKLQkJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMjQgfHwgdmFyLT5iaXRzX3Blcl9waXhlbCA9PSAzMikKKwkJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMzIpCiAJCQlpbmZvLT5zY3JlZW5fYmFzZSArPSAyICogTUJfOwogCX0KIApAQCAtMjI2Miw3ICsyMTExLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaXJydXNmYl9yZWdpc3RlcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNpcnJ1c2ZiX3JlZ2lzdGVyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBjaXJydXNmYl9pbmZvICpjaW5mbyA9IGluZm8tPnBhcjsKIAlpbnQgZXJyOwpAQCAtMjI3OCwyMyArMjEyNywyNyBAQAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlhc3NlcnQoYnR5cGUgIT0gQlRfTk9ORSk7CiAKKwkvKiBzZXQgYWxsIHRoZSB2aXRhbCBzdHVmZiAqLworCWNpcnJ1c2ZiX3NldF9mYmluZm8oaW5mbyk7CisKIAlEUFJJTlRLKCJjaXJydXNmYjogKFJBTSBzdGFydCBzZXQgdG86IDB4JXApXG4iLCBpbmZvLT5zY3JlZW5fYmFzZSk7CiAKLQkvKiBNYWtlIHByZXRlbmQgd2UndmUgc2V0IHRoZSB2YXIgc28gb3VyIHN0cnVjdHVyZXMgYXJlIGluIGEgImdvb2QiICovCi0JLyogc3RhdGUsIGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgbW9kZSB0byB0aGUgaHcgeWV0Li4uICAqLwotCWluZm8tPnZhciA9IGNpcnJ1c2ZiX3ByZWRlZmluZWRbY2lycnVzZmJfZGVmX21vZGVdLnZhcjsKKwllcnIgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sIE5VTEwsIDAsIE5VTEwsIDgpOworCWlmICghZXJyKSB7CisJCURQUklOVEsoIndyb25nIGluaXRpYWwgdmlkZW8gbW9kZVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2RlYWxsb2NfY21hcDsKKwl9CisKIAlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CiAKIAllcnIgPSBjaXJydXNmYl9kZWNvZGVfdmFyKCZpbmZvLT52YXIsICZjaW5mby0+Y3VycmVudG1vZGUsIGluZm8pOwogCWlmIChlcnIgPCAwKSB7CiAJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJRFBSSU5USygiY2hva2luZyBvbiBkZWZhdWx0IHZhci4uLiB1bW0sIG5vIGdvb2QuXG4iKTsKLQkJZ290byBlcnJfdW5tYXBfY2lycnVzZmI7CisJCWdvdG8gZXJyX2RlYWxsb2NfY21hcDsKIAl9CiAKLQkvKiBzZXQgYWxsIHRoZSB2aXRhbCBzdHVmZiAqLwotCWNpcnJ1c2ZiX3NldF9mYmluZm8oaW5mbyk7Ci0KIAllcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImNpcnJ1c2ZiOiBjb3VsZCBub3QgcmVnaXN0ZXIgIgpAQCAtMjMwNyw3ICsyMTYwLDYgQEAKIAogZXJyX2RlYWxsb2NfY21hcDoKIAlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwotZXJyX3VubWFwX2NpcnJ1c2ZiOgogCWNpbmZvLT51bm1hcChpbmZvKTsKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCXJldHVybiBlcnI7CkBAIC0yMzMwLDggKzIxODIsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBjaXJydXNmYl9wY2lfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorc3RhdGljIGludCBfX2RldmluaXQgY2lycnVzZmJfcGNpX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0cnVjdCBjaXJydXNmYl9pbmZvICpjaW5mbzsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKQEAgLTIzNTMsNyArMjIwNSw2IEBACiAJfQogCiAJY2luZm8gPSBpbmZvLT5wYXI7Ci0JY2luZm8tPnBkZXYgPSBwZGV2OwogCWNpbmZvLT5idHlwZSA9IGJ0eXBlID0gKGVudW0gY2lycnVzX2JvYXJkKSBlbnQtPmRyaXZlcl9kYXRhOwogCiAJRFBSSU5USygiIEZvdW5kIFBDSSBkZXZpY2UsIGJhc2UgYWRkcmVzcyAwIGlzIDB4JXgsIGJ0eXBlIHNldCB0byAlZFxuIiwKQEAgLTI0NTksOCArMjMxMCw4IEBACiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiAjaWZkZWYgQ09ORklHX1pPUlJPCi1zdGF0aWMgaW50IGNpcnJ1c2ZiX3pvcnJvX3JlZ2lzdGVyKHN0cnVjdCB6b3Jyb19kZXYgKnosCi0JCQkJICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KQorc3RhdGljIGludCBfX2RldmluaXQgY2lycnVzZmJfem9ycm9fcmVnaXN0ZXIoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCiB7CiAJc3RydWN0IGNpcnJ1c2ZiX2luZm8gKmNpbmZvOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwpAQCAtMjQ4OSw3ICsyMzQwLDYgQEAKIAlhc3NlcnQoeik7CiAJYXNzZXJ0KGJ0eXBlICE9IEJUX05PTkUpOwogCi0JY2luZm8tPnpkZXYgPSB6OwogCWJvYXJkX2FkZHIgPSB6b3Jyb19yZXNvdXJjZV9zdGFydCh6KTsKIAlib2FyZF9zaXplID0gem9ycm9fcmVzb3VyY2VfbGVuKHopOwogCWluZm8tPnNjcmVlbl9zaXplID0gc2l6ZTsKQEAgLTI2MjEsMTcgKzI0NzEsMTcgQEAKIAkJcmV0dXJuIDA7CiAKIAl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghKnRoaXNfb3B0KSBjb250aW51ZTsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKIAogCQlEUFJJTlRLKCJjaXJydXNmYl9zZXR1cDogb3B0aW9uICclcydcbiIsIHRoaXNfb3B0KTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RPVEFMX01PREVTOyBpKyspIHsKLQkJCXNwcmludGYocywgIm1vZGU6JXMiLCBjaXJydXNmYl9wcmVkZWZpbmVkW2ldLm5hbWUpOwotCQkJaWYgKHN0cmNtcCh0aGlzX29wdCwgcykgPT0gMCkKLQkJCQljaXJydXNmYl9kZWZfbW9kZSA9IGk7Ci0JCX0KIAkJaWYgKCFzdHJjbXAodGhpc19vcHQsICJub2FjY2VsIikpCiAJCQlub2FjY2VsID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKQorCQkJbW9kZV9vcHRpb24gPSB0aGlzX29wdCArIDU7CisJCWVsc2UKKwkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjY1Nyw2ICsyNTA3LDExIEBACiAKIG1vZHVsZV9pbml0KGNpcnJ1c2ZiX2luaXQpOwogCittb2R1bGVfcGFyYW0obW9kZV9vcHRpb24sIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZV9vcHRpb24sICJJbml0aWFsIHZpZGVvIG1vZGUgZS5nLiAnNjQ4eDQ4MC04QDYwJyIpOworbW9kdWxlX3BhcmFtKG5vYWNjZWwsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhub2FjY2VsLCAiRGlzYWJsZSBhY2NlbGVyYXRpb24iKTsKKwogI2lmZGVmIE1PRFVMRQogbW9kdWxlX2V4aXQoY2lycnVzZmJfZXhpdCk7CiAjZW5kaWYKQEAgLTMwNTAsMTYgKzI5MDUsMTQgQEAKICAqIGJlc3RjbG9jaygpIC0gZGV0ZXJtaW5lIGNsb3Nlc3QgcG9zc2libGUgY2xvY2sgbG93ZXIoPykgdGhhbiB0aGUKICAqIGRlc2lyZWQgcGl4ZWwgY2xvY2sKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGJlc3RjbG9jayhsb25nIGZyZXEsIGxvbmcgKmJlc3QsIGxvbmcgKm5vbSwKLQkJICAgICAgIGxvbmcgKmRlbiwgbG9uZyAqZGl2LCBsb25nIG1heGZyZXEpCitzdGF0aWMgdm9pZCBiZXN0Y2xvY2sobG9uZyBmcmVxLCBpbnQgKm5vbSwgaW50ICpkZW4sIGludCAqZGl2KQogewotCWxvbmcgbiwgaCwgZCwgZjsKKwlpbnQgbiwgZDsKKwlsb25nIGgsIGRpZmY7CiAKLQlhc3NlcnQoYmVzdCAhPSBOVUxMKTsKIAlhc3NlcnQobm9tICE9IE5VTEwpOwogCWFzc2VydChkZW4gIT0gTlVMTCk7CiAJYXNzZXJ0KGRpdiAhPSBOVUxMKTsKLQlhc3NlcnQobWF4ZnJlcSA+IDApOwogCiAJKm5vbSA9IDA7CiAJKmRlbiA9IDA7CkBAIC0zMDcwLDUxICsyOTIzLDQ3IEBACiAJaWYgKGZyZXEgPCA4MDAwKQogCQlmcmVxID0gODAwMDsKIAotCWlmIChmcmVxID4gbWF4ZnJlcSkKLQkJZnJlcSA9IG1heGZyZXE7Ci0KLQkqYmVzdCA9IDA7Ci0JZiA9IGZyZXEgKiAxMDsKKwlkaWZmID0gZnJlcTsKIAogCWZvciAobiA9IDMyOyBuIDwgMTI4OyBuKyspIHsKLQkJZCA9ICgxNDMxODEgKiBuKSAvIGY7CisJCWludCBzID0gMDsKKworCQlkID0gKDE0MzE4ICogbikgLyBmcmVxOwogCQlpZiAoKGQgPj0gNykgJiYgKGQgPD0gNjMpKSB7Ci0JCQlpZiAoZCA+IDMxKQotCQkJCWQgPSAoZCAvIDIpICogMjsKLQkJCWggPSAoMTQzMTggKiBuKSAvIGQ7Ci0JCQlpZiAoYWJzKGggLSBmcmVxKSA8IGFicygqYmVzdCAtIGZyZXEpKSB7Ci0JCQkJKmJlc3QgPSBoOworCQkJaW50IHRlbXAgPSBkOworCisJCQlpZiAodGVtcCA+IDMxKSB7CisJCQkJcyA9IDE7CisJCQkJdGVtcCA+Pj0gMTsKKwkJCX0KKwkJCWggPSAoKDE0MzE4ICogbikgLyB0ZW1wKSA+PiBzOworCQkJaCA9IGggPiBmcmVxID8gaCAtIGZyZXEgOiBmcmVxIC0gaDsKKwkJCWlmIChoIDwgZGlmZikgeworCQkJCWRpZmYgPSBoOwogCQkJCSpub20gPSBuOwotCQkJCWlmIChkIDwgMzIpIHsKLQkJCQkJKmRlbiA9IGQ7Ci0JCQkJCSpkaXYgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSpkZW4gPSBkIC8gMjsKLQkJCQkJKmRpdiA9IDE7Ci0JCQkJfQorCQkJCSpkZW4gPSB0ZW1wOworCQkJCSpkaXYgPSBzOwogCQkJfQogCQl9Ci0JCWQgPSBESVZfUk9VTkRfVVAoMTQzMTgxICogbiwgZik7CisJCWQrKzsKIAkJaWYgKChkID49IDcpICYmIChkIDw9IDYzKSkgewotCQkJaWYgKGQgPiAzMSkKLQkJCQlkID0gKGQgLyAyKSAqIDI7Ci0JCQloID0gKDE0MzE4ICogbikgLyBkOwotCQkJaWYgKGFicyhoIC0gZnJlcSkgPCBhYnMoKmJlc3QgLSBmcmVxKSkgewotCQkJCSpiZXN0ID0gaDsKKwkJCWlmIChkID4gMzEpIHsKKwkJCQlzID0gMTsKKwkJCQlkID4+PSAxOworCQkJfQorCQkJaCA9ICgoMTQzMTggKiBuKSAvIGQpID4+IHM7CisJCQloID0gaCA+IGZyZXEgPyBoIC0gZnJlcSA6IGZyZXEgLSBoOworCQkJaWYgKGggPCBkaWZmKSB7CisJCQkJZGlmZiA9IGg7CiAJCQkJKm5vbSA9IG47Ci0JCQkJaWYgKGQgPCAzMikgewotCQkJCQkqZGVuID0gZDsKLQkJCQkJKmRpdiA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKmRlbiA9IGQgLyAyOwotCQkJCQkqZGl2ID0gMTsKLQkJCQl9CisJCQkJKmRlbiA9IGQ7CisJCQkJKmRpdiA9IHM7CiAJCQl9CiAJCX0KIAl9CiAKIAlEUFJJTlRLKCJCZXN0IHBvc3NpYmxlIHZhbHVlcyBmb3IgZ2l2ZW4gZnJlcXVlbmN5OlxuIik7Ci0JRFBSSU5USygiCWJlc3Q6ICVsZCBrSHogIG5vbTogJWxkICBkZW46ICVsZCAgZGl2OiAlbGRcbiIsCisJRFBSSU5USygiCWZyZXE6ICVsZCBrSHogIG5vbTogJWQgIGRlbjogJWQgIGRpdjogJWRcbiIsCiAJCWZyZXEsICpub20sICpkZW4sICpkaXYpOwogCiAJRFBSSU5USygiRVhJVFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCmluZGV4IDA2Zjg3YjAuLjJmNTBhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnCkBAIC00MywyMiArNDMsNiBAQAogCSBidWZmZXIuICBFYWNoIDY0S0Igd2lsbCBnaXZlIHlvdSBhcHByb3hpbWF0ZWx5IDE2IDgweDI1CiAJIHNjcmVlbmZ1bHMgb2Ygc2Nyb2xsYmFjayBidWZmZXIKIAotY29uZmlnIFZJREVPX1NFTEVDVAotCWJvb2wgIlZpZGVvIG1vZGUgc2VsZWN0aW9uIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAgWDg2ICYmIFZHQV9DT05TT0xFCi0JLS0taGVscC0tLQotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRleHQgbW9kZSBzZWxlY3Rpb24gb24ga2VybmVsIHN0YXJ0dXAuIElmCi0JICB5b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiBzb21lIGhpZ2gtcmVzb2x1dGlvbiB0ZXh0IG1vZGUgeW91cgotCSAgY2FyZCdzIEJJT1Mgb2ZmZXJzLCBidXQgdGhlIHRyYWRpdGlvbmFsIExpbnV4IHV0aWxpdGllcyBsaWtlCi0JICBTVkdBVGV4dE1vZGUgZG9uJ3QsIHlvdSBjYW4gc2F5IFkgaGVyZSBhbmQgc2V0IHRoZSBtb2RlIHVzaW5nIHRoZQotCSAgInZnYT0iIG9wdGlvbiBmcm9tIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgb3Igc2V0Ci0JICAidmdhPWFzayIgd2hpY2ggYnJpbmdzIHVwIGEgdmlkZW8gbW9kZSBtZW51IG9uIGtlcm5lbCBzdGFydHVwLiAoVHJ5Ci0JICAibWFuIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgYWJvdXQKLQkgIGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlIGtlcm5lbC4pCi0KLQkgIFJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zdmdhLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24KLQkgIGFib3V0IHRoZSBWaWRlbyBtb2RlIHNlbGVjdGlvbiBzdXBwb3J0LiBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgTURBX0NPTlNPTEUKIAlkZXBlbmRzIG9uICFNNjhLICYmICFQQVJJU0MgJiYgSVNBCiAJdHJpc3RhdGUgIk1EQSB0ZXh0IGNvbnNvbGUgKGR1YWwtaGVhZGVkKSAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKaW5kZXggYzYyOTllOC4uNjRiM2QzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKQEAgLTE4NTUsOCArMTg1NSw2IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2NvbjJmYl9tYXBbdmMtPnZjX251bV1dOwogCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV07CiAJaW50IHNjcm9sbF9wYXJ0aWFsID0gaW5mby0+ZmxhZ3MgJiBGQklORk9fUEFSVElBTF9QQU5fT0s7Ci0JdW5zaWduZWQgc2hvcnQgc2F2ZWRfZWM7Ci0JaW50IHJldDsKIAogCWlmIChmYmNvbl9pc19pbmFjdGl2ZSh2YywgaW5mbykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg2OSwxMSArMTg2Nyw2IEBACiAJICogICAgICAgICAgIHdob2xlIHNjcmVlbiAocHJldmVudHMgZmxpY2tlcikuCiAJICovCiAKLQlzYXZlZF9lYyA9IHZjLT52Y192aWRlb19lcmFzZV9jaGFyOwotCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0gdmMtPnZjX3NjcmxfZXJhc2VfY2hhcjsKLQotCXJldCA9IDA7Ci0KIAlzd2l0Y2ggKGRpcikgewogCWNhc2UgU01fVVA6CiAJCWlmIChjb3VudCA+IHZjLT52Y19yb3dzKQkvKiBNYXhpbXVtIHJlYWxpc3RpYyBzaXplICovCkBAIC0xODkwLDkgKzE4ODMsOSBAQAogCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKIAkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgogCQkJCQkJCShiIC0gY291bnQpKSwKLQkJCQkgICAgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKLQkJCXJldCA9IDE7CisJCQlyZXR1cm4gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NST0xMX1dSQVBfTU9WRToKQEAgLTE5NjIsMTAgKzE5NTUsOSBAQAogCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKIAkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgogCQkJCQkJCShiIC0gY291bnQpKSwKLQkJCQkgICAgdmMtPnZjX3NjcmxfZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKwkJCXJldHVybiAxOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xOTgyLDkgKzE5NzQsOSBAQAogCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKIAkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgogCQkJCQkJCXQpLAotCQkJCSAgICB2Yy0+dmNfc2NybF9lcmFzZV9jaGFyLAorCQkJCSAgICB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKIAkJCQkgICAgdmMtPnZjX3NpemVfcm93ICogY291bnQpOwotCQkJcmV0ID0gMTsKKwkJCXJldHVybiAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1JPTExfV1JBUF9NT1ZFOgpAQCAtMjA1MiwxNSArMjA0NCwxMiBAQAogCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKIAkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgogCQkJCQkJCXQpLAotCQkJCSAgICB2Yy0+dmNfc2NybF9lcmFzZV9jaGFyLAorCQkJCSAgICB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKIAkJCQkgICAgdmMtPnZjX3NpemVfcm93ICogY291bnQpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIDE7CiAJCX0KLQkJYnJlYWs7CiAJfQotCXZjLT52Y192aWRlb19lcmFzZV9jaGFyID0gc2F2ZWRfZWM7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yNDAwLDExICsyMzg5LDE1IEBACiAKICAJaWYgKCFmYmNvbl9pc19pbmFjdGl2ZSh2YywgaW5mbykpIHsKIAkJaWYgKG9wcy0+Ymxhbmtfc3RhdGUgIT0gYmxhbmspIHsKKwkJCWludCByZXQgPSAxOworCiAJCQlvcHMtPmJsYW5rX3N0YXRlID0gYmxhbms7CiAJCQlmYmNvbl9jdXJzb3IodmMsIGJsYW5rID8gQ01fRVJBU0UgOiBDTV9EUkFXKTsKIAkJCW9wcy0+Y3Vyc29yX2ZsYXNoID0gKCFibGFuayk7CiAKLQkJCWlmIChmYl9ibGFuayhpbmZvLCBibGFuaykpCisJCQlpZiAoaW5mby0+ZmJvcHMtPmZiX2JsYW5rKQorCQkJCXJldCA9IGluZm8tPmZib3BzLT5mYl9ibGFuayhibGFuaywgaW5mbyk7CisJCQlpZiAocmV0KQogCQkJCWZiY29uX2dlbmVyaWNfYmxhbmsodmMsIGluZm8sIGJsYW5rKTsKIAkJfQogCkBAIC0yNTE4LDkgKzI1MTEsNiBAQAogCQkJYyA9IHZjLT52Y192aWRlb19lcmFzZV9jaGFyOwogCQkJdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPQogCQkJICAgICgoYyAmIDB4ZmUwMCkgPj4gMSkgfCAoYyAmIDB4ZmYpOwotCQkJYyA9IHZjLT52Y19zY3JsX2VyYXNlX2NoYXI7Ci0JCQl2Yy0+dmNfc2NybF9lcmFzZV9jaGFyID0KLQkJCSAgICAoKGMgJiAweEZFMDApID4+IDEpIHwgKGMgJiAweEZGKTsKIAkJCXZjLT52Y19hdHRyID4+PSAxOwogCQl9CiAJfSBlbHNlIGlmICghdmMtPnZjX2hpX2ZvbnRfbWFzayAmJiBjbnQgPT0gNTEyKSB7CkBAIC0yNTUxLDE0ICsyNTQxLDkgQEAKIAkJCWlmICh2Yy0+dmNfY2FuX2RvX2NvbG9yKSB7CiAJCQkJdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPQogCQkJCSAgICAoKGMgJiAweGZmMDApIDw8IDEpIHwgKGMgJiAweGZmKTsKLQkJCQljID0gdmMtPnZjX3NjcmxfZXJhc2VfY2hhcjsKLQkJCQl2Yy0+dmNfc2NybF9lcmFzZV9jaGFyID0KLQkJCQkgICAgKChjICYgMHhGRjAwKSA8PCAxKSB8IChjICYgMHhGRik7CiAJCQkJdmMtPnZjX2F0dHIgPDw9IDE7Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlCiAJCQkJdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIgPSBjICYgfjB4MTAwOwotCQkJCXZjLT52Y19zY3JsX2VyYXNlX2NoYXIgPSBjICYgfjB4MTAwOwotCQkJfQogCQl9CiAKIAl9CkBAIC0yOTkyLDggKzI5NzcsOCBAQAogCQlwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV07CiAJCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKIAkJdmFyX3RvX2Rpc3BsYXkocCwgJmluZm8tPnZhciwgaW5mbyk7Ci0JCWNvbHMgPSBGQkNPTl9TV0FQKHAtPnJvdGF0ZSwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKLQkJcm93cyA9IEZCQ09OX1NXQVAocC0+cm90YXRlLCBpbmZvLT52YXIueXJlcywgaW5mby0+dmFyLnhyZXMpOworCQljb2xzID0gRkJDT05fU1dBUChvcHMtPnJvdGF0ZSwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKKwkJcm93cyA9IEZCQ09OX1NXQVAob3BzLT5yb3RhdGUsIGluZm8tPnZhci55cmVzLCBpbmZvLT52YXIueHJlcyk7CiAJCWNvbHMgLz0gdmMtPnZjX2ZvbnQud2lkdGg7CiAJCXJvd3MgLz0gdmMtPnZjX2ZvbnQuaGVpZ2h0OwogCQl2Y19yZXNpemUodmMsIGNvbHMsIHJvd3MpOwpAQCAtMzU4OCw4ICszNTczLDggQEAKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAlmYl9yZWdpc3Rlcl9jbGllbnQoJmZiY29uX2V2ZW50X25vdGlmaWVyKTsKLQlmYmNvbl9kZXZpY2UgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoZmJfY2xhc3MsIE5VTEwsIE1LREVWKDAsIDApLAotCQkJCQkgICAgIE5VTEwsICJmYmNvbiIpOworCWZiY29uX2RldmljZSA9IGRldmljZV9jcmVhdGUoZmJfY2xhc3MsIE5VTEwsIE1LREVWKDAsIDApLCBOVUxMLAorCQkJCSAgICAgImZiY29uIik7CiAKIAlpZiAoSVNfRVJSKGZiY29uX2RldmljZSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBkZXZpY2UgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmggYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uaAppbmRleCBhNmUzOGU5Li44OWEzNDY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmgKQEAgLTExMCw3ICsxMTAsNyBAQAogCV9fdTMyIG1heF9sZW47CiAJbWF4X2xlbiA9IG1heChpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoLCBpbmZvLT52YXIucmVkLmxlbmd0aCk7CiAJbWF4X2xlbiA9IG1heChpbmZvLT52YXIuYmx1ZS5sZW5ndGgsIG1heF9sZW4pOwotCXJldHVybiB+KDB4ZmZmIDw8IChtYXhfbGVuICYgMHhmZikpOworCXJldHVybiAofigweGZmZiA8PCBtYXhfbGVuKSkgJiAweGZmOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdHRyX2NvbF9lYyhpbnQgc2hpZnQsIHN0cnVjdCB2Y19kYXRhICp2YywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYwppbmRleCA5OTAxMDY0Li5kZDNlYWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbWRhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL21kYWNvbi5jCkBAIC01MzMsNyArNTMzLDcgQEAKIAogc3RhdGljIGludCBtZGFjb25fc2Nyb2xsKHN0cnVjdCB2Y19kYXRhICpjLCBpbnQgdCwgaW50IGIsIGludCBkaXIsIGludCBsaW5lcykKIHsKLQl1MTYgZWF0dHIgPSBtZGFfY29udmVydF9hdHRyKGMtPnZjX3NjcmxfZXJhc2VfY2hhcik7CisJdTE2IGVhdHRyID0gbWRhX2NvbnZlcnRfYXR0cihjLT52Y192aWRlb19lcmFzZV9jaGFyKTsKIAogCWlmICghbGluZXMpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvbi5jCmluZGV4IDQwNTVkYmQuLjQ5MWMxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMKQEAgLTE3MCwxMiArMTcwLDEyIEBACiAgICAgc3dpdGNoIChkaXIpIHsKICAgICBjYXNlIFNNX1VQOgogCXN0aV9ibW92ZShzdGksIHQgKyBjb3VudCwgMCwgdCwgMCwgYiAtIHQgLSBjb3VudCwgY29ucC0+dmNfY29scyk7Ci0Jc3RpX2NsZWFyKHN0aSwgYiAtIGNvdW50LCAwLCBjb3VudCwgY29ucC0+dmNfY29scywgY29ucC0+dmNfc2NybF9lcmFzZV9jaGFyKTsKKwlzdGlfY2xlYXIoc3RpLCBiIC0gY291bnQsIDAsIGNvdW50LCBjb25wLT52Y19jb2xzLCBjb25wLT52Y192aWRlb19lcmFzZV9jaGFyKTsKIAlicmVhazsKIAogICAgIGNhc2UgU01fRE9XTjoKIAlzdGlfYm1vdmUoc3RpLCB0LCAwLCB0ICsgY291bnQsIDAsIGIgLSB0IC0gY291bnQsIGNvbnAtPnZjX2NvbHMpOwotCXN0aV9jbGVhcihzdGksIHQsIDAsIGNvdW50LCBjb25wLT52Y19jb2xzLCBjb25wLT52Y19zY3JsX2VyYXNlX2NoYXIpOworCXN0aV9jbGVhcihzdGksIHQsIDAsIGNvdW50LCBjb25wLT52Y19jb2xzLCBjb25wLT52Y192aWRlb19lcmFzZV9jaGFyKTsKIAlicmVhazsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwppbmRleCBiZDFmNTdiLi40NDhkMjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCkBAIC0yMzksOCArMjM5LDcgQEAKIAogc3RhdGljIGludCB2Z2Fjb25fc2Nyb2xsZGVsdGEoc3RydWN0IHZjX2RhdGEgKmMsIGludCBsaW5lcykKIHsKLQlpbnQgc3RhcnQsIGVuZCwgY291bnQsIHNvZmYsIGRpZmY7Ci0Jdm9pZCAqZCwgKnM7CisJaW50IHN0YXJ0LCBlbmQsIGNvdW50LCBzb2ZmOwogCiAJaWYgKCFsaW5lcykgewogCQljLT52Y192aXNpYmxlX29yaWdpbiA9IGMtPnZjX29yaWdpbjsKQEAgLTI4NywyOSArMjg2LDI5IEBACiAJaWYgKGNvdW50ID4gYy0+dmNfcm93cykKIAkJY291bnQgPSBjLT52Y19yb3dzOwogCi0JZGlmZiA9IGMtPnZjX3Jvd3MgLSBjb3VudDsKKwlpZiAoY291bnQpIHsKKwkJaW50IGNvcHlzaXplOwogCi0JZCA9ICh2b2lkICopIGMtPnZjX29yaWdpbjsKLQlzID0gKHZvaWQgKikgYy0+dmNfc2NyZWVuYnVmOworCQlpbnQgZGlmZiA9IGMtPnZjX3Jvd3MgLSBjb3VudDsKKwkJdm9pZCAqZCA9ICh2b2lkICopIGMtPnZjX29yaWdpbjsKKwkJdm9pZCAqcyA9ICh2b2lkICopIGMtPnZjX3NjcmVlbmJ1ZjsKIAotCXdoaWxlIChjb3VudC0tKSB7Ci0JCXNjcl9tZW1jcHl3KGQsIHZnYWNvbl9zY3JvbGxiYWNrICsgc29mZiwgYy0+dmNfc2l6ZV9yb3cpOwotCQlkICs9IGMtPnZjX3NpemVfcm93OwotCQlzb2ZmICs9IGMtPnZjX3NpemVfcm93OworCQljb3VudCAqPSBjLT52Y19zaXplX3JvdzsKKwkJLyogaG93IG11Y2ggbWVtb3J5IHRvIGVuZCBvZiBidWZmZXIgbGVmdD8gKi8KKwkJY29weXNpemUgPSBtaW4oY291bnQsIHZnYWNvbl9zY3JvbGxiYWNrX3NpemUgLSBzb2ZmKTsKKwkJc2NyX21lbWNweXcoZCwgdmdhY29uX3Njcm9sbGJhY2sgKyBzb2ZmLCBjb3B5c2l6ZSk7CisJCWQgKz0gY29weXNpemU7CisJCWNvdW50IC09IGNvcHlzaXplOwogCi0JCWlmIChzb2ZmID49IHZnYWNvbl9zY3JvbGxiYWNrX3NpemUpCi0JCQlzb2ZmID0gMDsKLQl9Ci0KLQlpZiAoZGlmZiA9PSBjLT52Y19yb3dzKSB7Ci0JCXZnYWNvbl9jdXJzb3IoYywgQ01fTU9WRSk7Ci0JfSBlbHNlIHsKLQkJd2hpbGUgKGRpZmYtLSkgewotCQkJc2NyX21lbWNweXcoZCwgcywgYy0+dmNfc2l6ZV9yb3cpOwotCQkJZCArPSBjLT52Y19zaXplX3JvdzsKLQkJCXMgKz0gYy0+dmNfc2l6ZV9yb3c7CisJCWlmIChjb3VudCkgeworCQkJc2NyX21lbWNweXcoZCwgdmdhY29uX3Njcm9sbGJhY2ssIGNvdW50KTsKKwkJCWQgKz0gY291bnQ7CiAJCX0KLQl9CisKKwkJaWYgKGRpZmYpCisJCQlzY3JfbWVtY3B5dyhkLCBzLCBkaWZmICogYy0+dmNfc2l6ZV9yb3cpOworCX0gZWxzZQorCQl2Z2Fjb25fY3Vyc29yKGMsIENNX01PVkUpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xMzUwLDcgKzEzNDksNyBAQAogCQl9IGVsc2UKIAkJCWMtPnZjX29yaWdpbiArPSBkZWx0YTsKIAkJc2NyX21lbXNldHcoKHUxNiAqKSAoYy0+dmNfb3JpZ2luICsgYy0+dmNfc2NyZWVuYnVmX3NpemUgLQotCQkJCSAgICAgZGVsdGEpLCBjLT52Y19zY3JsX2VyYXNlX2NoYXIsCisJCQkJICAgICBkZWx0YSksIGMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkgICAgZGVsdGEpOwogCX0gZWxzZSB7CiAJCWlmIChvbGRvIC0gZGVsdGEgPCB2Z2FfdnJhbV9iYXNlKSB7CkBAIC0xMzYzLDcgKzEzNjIsNyBAQAogCQl9IGVsc2UKIAkJCWMtPnZjX29yaWdpbiAtPSBkZWx0YTsKIAkJYy0+dmNfc2NyX2VuZCA9IGMtPnZjX29yaWdpbiArIGMtPnZjX3NjcmVlbmJ1Zl9zaXplOwotCQlzY3JfbWVtc2V0dygodTE2ICopIChjLT52Y19vcmlnaW4pLCBjLT52Y19zY3JsX2VyYXNlX2NoYXIsCisJCXNjcl9tZW1zZXR3KCh1MTYgKikgKGMtPnZjX29yaWdpbiksIGMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCiAJCQkgICAgZGVsdGEpOwogCX0KIAljLT52Y19zY3JfZW5kID0gYy0+dmNfb3JpZ2luICsgYy0+dmNfc2NyZWVuYnVmX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Rpc3BsYXkvZGlzcGxheS1zeXNmcy5jIGIvZHJpdmVycy92aWRlby9kaXNwbGF5L2Rpc3BsYXktc3lzZnMuYwppbmRleCA2ZWY4MDBiLi40ODMwYjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Rpc3BsYXkvZGlzcGxheS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZGlzcGxheS9kaXNwbGF5LXN5c2ZzLmMKQEAgLTE1MywxMiArMTUzLDkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZhbGxvY2F0ZWRfZHNwX2xvY2spOwogCiAJCWlmICghcmV0KSB7Ci0JCQluZXdfZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoZGlzcGxheV9jbGFzcywKLQkJCQkJCQkgICAgIHBhcmVudCwKLQkJCQkJCQkgICAgIE1LREVWKDAsMCksCi0JCQkJCQkJICAgICBuZXdfZGV2LAotCQkJCQkJCSAgICAgImRpc3BsYXklZCIsCi0JCQkJCQkJICAgICBuZXdfZGV2LT5pZHgpOworCQkJbmV3X2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShkaXNwbGF5X2NsYXNzLCBwYXJlbnQsCisJCQkJCQkgICAgIE1LREVWKDAsIDApLCBuZXdfZGV2LAorCQkJCQkJICAgICAiZGlzcGxheSVkIiwgbmV3X2Rldi0+aWR4KTsKIAkJCWlmICghSVNfRVJSKG5ld19kZXYtPmRldikpIHsKIAkJCQluZXdfZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CiAJCQkJbmV3X2Rldi0+ZHJpdmVyID0gZHJpdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lZmlmYi5jIGIvZHJpdmVycy92aWRlby9lZmlmYi5jCmluZGV4IGJkNzc5YWUuLmRhZjliODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZWZpZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2VmaWZiLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNpbmNsdWRlIDx2aWRlby92Z2EuaD4KIApAQCAtMzMsNiArMzQsMTA1IEBACiAJLnZpc3VhbAkJCT0gRkJfVklTVUFMX1RSVUVDT0xPUiwKIH07CiAKK2VudW0geworCU1fSTE3LAkJLyogMTctSW5jaCBpTWFjICovCisJTV9JMjAsCQkvKiAyMC1JbmNoIGlNYWMgKi8KKwlNX0kyMF9TUiwJLyogMjAtSW5jaCBpTWFjIChTYW50YSBSb3NhKSAqLworCU1fSTI0LAkJLyogMjQtSW5jaCBpTWFjICovCisJTV9NSU5JLAkJLyogTWFjIE1pbmkgKi8KKwlNX01CLAkJLyogTWFjQm9vayAqLworCU1fTUJfMiwJCS8qIE1hY0Jvb2ssIDJuZCByZXYuICovCisJTV9NQl8zLAkJLyogTWFjQm9vaywgM3JkIHJldi4gKi8KKwlNX01CX1NSLAkvKiBNYWNCb29rLCAybmQgZ2VuLCAoU2FudGEgUm9zYSkgKi8KKwlNX01CQSwJCS8qIE1hY0Jvb2sgQWlyICovCisJTV9NQlAsCQkvKiBNYWNCb29rIFBybyAqLworCU1fTUJQXzIsCS8qIE1hY0Jvb2sgUHJvIDJuZCBnZW4gKi8KKwlNX01CUF9TUiwJLyogTWFjQm9vayBQcm8gKFNhbnRhIFJvc2EpICovCisJTV9NQlBfNCwJLyogTWFjQm9vayBQcm8sIDR0aCBnZW4gKi8KKwlNX1VOS05PV04JLyogcGxhY2Vob2xkZXIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZWZpZmJfZG1pX2luZm8geworCWNoYXIgKm9wdG5hbWU7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCWludCBzdHJpZGU7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7Cit9IGRtaV9saXN0W10gPSB7CisJW01fSTE3XSA9IHsgImkxNyIsIDB4ODAwMTAwMDAsIDE0NzIgKiA0LCAxNDQwLCA5MDAgfSwKKwlbTV9JMjBdID0geyAiaTIwIiwgMHg4MDAxMDAwMCwgMTcyOCAqIDQsIDE2ODAsIDEwNTAgfSwgLyogZ3Vlc3MgKi8KKwlbTV9JMjBfU1JdID0geyAiaW1hYzciLCAweDQwMDEwMDAwLCAxNzI4ICogNCwgMTY4MCwgMTA1MCB9LAorCVtNX0kyNF0gPSB7ICJpMjQiLCAweDgwMDEwMDAwLCAyMDQ4ICogNCwgMTkyMCwgMTIwMCB9LCAvKiBndWVzcyAqLworCVtNX01JTkldPSB7ICJtaW5pIiwgMHg4MDAwMDAwMCwgMjA0OCAqIDQsIDEwMjQsIDc2OCB9LAorCVtNX01CXSA9IHsgIm1hY2Jvb2siLCAweDgwMDAwMDAwLCAyMDQ4ICogNCwgMTI4MCwgODAwIH0sCisJW01fTUJBXSA9IHsgIm1iYSIsIDB4ODAwMDAwMDAsIDIwNDggKiA0LCAxMjgwLCA4MDAgfSwKKwlbTV9NQlBdID0geyAibWJwIiwgMHg4MDAxMDAwMCwgMTQ3MiAqIDQsIDE0NDAsIDkwMCB9LAorCVtNX01CUF8yXSA9IHsgIm1icDIiLCAwLCAwLCAwLCAwIH0sIC8qIHBsYWNlaG9sZGVyICovCisJW01fTUJQX1NSXSA9IHsgIm1icDMiLCAweDgwMDMwMDAwLCAyMDQ4ICogNCwgMTQ0MCwgOTAwIH0sCisJW01fTUJQXzRdID0geyAibWJwNCIsIDB4YzAwNjAwMDAsIDIwNDggKiA0LCAxOTIwLCAxMjAwIH0sCisJW01fVU5LTk9XTl0gPSB7IE5VTEwsIDAsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGludCBzZXRfc3lzdGVtKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCk7CisKKyNkZWZpbmUgRUZJRkJfRE1JX1NZU1RFTV9JRCh2ZW5kb3IsIG5hbWUsIGVudW1pZCkJCVwKKwl7IHNldF9zeXN0ZW0sIG5hbWUsIHsJCQkJCVwKKwkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgdmVuZG9yKSwJCVwKKwkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIG5hbWUpIH0sCQlcCisJICAmZG1pX2xpc3RbZW51bWlkXSB9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGRtaV9zeXN0ZW1fdGFibGVbXSA9IHsKKwlFRklGQl9ETUlfU1lTVEVNX0lEKCJBcHBsZSBDb21wdXRlciwgSW5jLiIsICJpTWFjNCwxIiwgTV9JMTcpLAorCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0d28gd2lsbCBiZSByaWdodDsgbWF5YmUgYm90aD8gKi8KKwlFRklGQl9ETUlfU1lTVEVNX0lEKCJBcHBsZSBDb21wdXRlciwgSW5jLiIsICJpTWFjNSwxIiwgTV9JMjApLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIEluYy4iLCAiaU1hYzUsMSIsIE1fSTIwKSwKKwkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIHdpbGwgYmUgcmlnaHQ7IG1heWJlIGJvdGg/ICovCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgQ29tcHV0ZXIsIEluYy4iLCAiaU1hYzYsMSIsIE1fSTI0KSwKKwlFRklGQl9ETUlfU1lTVEVNX0lEKCJBcHBsZSBJbmMuIiwgImlNYWM2LDEiLCBNX0kyNCksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgSW5jLiIsICJpTWFjNywxIiwgTV9JMjBfU1IpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIENvbXB1dGVyLCBJbmMuIiwgIk1hY21pbmkxLDEiLCBNX01JTkkpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIENvbXB1dGVyLCBJbmMuIiwgIk1hY0Jvb2sxLDEiLCBNX01CKSwKKwkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHdvIHdpbGwgYmUgcmlnaHQ7IG1heWJlIGJvdGg/ICovCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgQ29tcHV0ZXIsIEluYy4iLCAiTWFjQm9vazIsMSIsIE1fTUIpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIEluYy4iLCAiTWFjQm9vazIsMSIsIE1fTUIpLAorCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGVzZSB0d28gd2lsbCBiZSByaWdodDsgbWF5YmUgYm90aD8gKi8KKwlFRklGQl9ETUlfU1lTVEVNX0lEKCJBcHBsZSBDb21wdXRlciwgSW5jLiIsICJNYWNCb29rMywxIiwgTV9NQiksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgSW5jLiIsICJNYWNCb29rMywxIiwgTV9NQiksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgSW5jLiIsICJNYWNCb29rNCwxIiwgTV9NQiksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgSW5jLiIsICJNYWNCb29rQWlyMSwxIiwgTV9NQkEpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIENvbXB1dGVyLCBJbmMuIiwgIk1hY0Jvb2tQcm8xLDEiLCBNX01CUCksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgQ29tcHV0ZXIsIEluYy4iLCAiTWFjQm9va1BybzIsMSIsIE1fTUJQXzIpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIEluYy4iLCAiTWFjQm9va1BybzIsMSIsIE1fTUJQXzIpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIENvbXB1dGVyLCBJbmMuIiwgIk1hY0Jvb2tQcm8zLDEiLCBNX01CUF9TUiksCisJRUZJRkJfRE1JX1NZU1RFTV9JRCgiQXBwbGUgSW5jLiIsICJNYWNCb29rUHJvMywxIiwgTV9NQlBfU1IpLAorCUVGSUZCX0RNSV9TWVNURU1fSUQoIkFwcGxlIEluYy4iLCAiTWFjQm9va1BybzQsMSIsIE1fTUJQXzQpLAorCXt9LAorfTsKKworc3RhdGljIGludCBzZXRfc3lzdGVtKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlzdHJ1Y3QgZWZpZmJfZG1pX2luZm8gKmluZm8gPSBpZC0+ZHJpdmVyX2RhdGE7CisJaWYgKGluZm8tPmJhc2UgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9JTkZPICJlZmlmYjogZG1pIGRldGVjdGVkICVzIC0gZnJhbWVidWZmZXIgYXQgJXAgIgorCQkJICIoJWR4JWQsIHN0cmlkZSAlZClcbiIsIGlkLT5pZGVudCwKKwkJCSAodm9pZCAqKWluZm8tPmJhc2UsIGluZm8tPndpZHRoLCBpbmZvLT5oZWlnaHQsCisJCQkgaW5mby0+c3RyaWRlKTsKKworCS8qIFRydXN0IHRoZSBib290bG9hZGVyIG92ZXIgdGhlIERNSSB0YWJsZXMgKi8KKwlpZiAoc2NyZWVuX2luZm8ubGZiX2Jhc2UgPT0gMCkKKwkJc2NyZWVuX2luZm8ubGZiX2Jhc2UgPSBpbmZvLT5iYXNlOworCWlmIChzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9PSAwKQorCQlzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9IGluZm8tPnN0cmlkZTsKKwlpZiAoc2NyZWVuX2luZm8ubGZiX3dpZHRoID09IDApCisJCXNjcmVlbl9pbmZvLmxmYl93aWR0aCA9IGluZm8tPndpZHRoOworCWlmIChzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID09IDApCisJCXNjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPSBpbmZvLT5oZWlnaHQ7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBlZmlmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCiAJCQkgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCiAJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKQEAgLTY3LDYgKzE2NywzOCBAQAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogfTsKIAorc3RhdGljIGludCBfX2luaXQgZWZpZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdDsKKwlpbnQgaTsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoISp0aGlzX29wdCkgY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IE1fVU5LTk9XTjsgaSsrKSB7CisJCQlpZiAoIXN0cmNtcCh0aGlzX29wdCwgZG1pX2xpc3RbaV0ub3B0bmFtZSkgJiYKKwkJCQkJZG1pX2xpc3RbaV0uYmFzZSAhPSAwKSB7CisJCQkJc2NyZWVuX2luZm8ubGZiX2Jhc2UgPSBkbWlfbGlzdFtpXS5iYXNlOworCQkJCXNjcmVlbl9pbmZvLmxmYl9saW5lbGVuZ3RoID0gZG1pX2xpc3RbaV0uc3RyaWRlOworCQkJCXNjcmVlbl9pbmZvLmxmYl93aWR0aCA9IGRtaV9saXN0W2ldLndpZHRoOworCQkJCXNjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPSBkbWlfbGlzdFtpXS5oZWlnaHQ7CisJCQl9CisJCX0KKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiYmFzZToiLCA1KSkKKwkJCXNjcmVlbl9pbmZvLmxmYl9iYXNlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNSwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAic3RyaWRlOiIsIDcpKQorCQkJc2NyZWVuX2luZm8ubGZiX2xpbmVsZW5ndGggPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs3LCBOVUxMLCAwKSAqIDQ7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiaGVpZ2h0OiIsIDcpKQorCQkJc2NyZWVuX2luZm8ubGZiX2hlaWdodCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzcsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIndpZHRoOiIsIDYpKQorCQkJc2NyZWVuX2luZm8ubGZiX3dpZHRoID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwgMCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBlZmlmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CkBAIC03NCw2ICsyMDYsMjYgQEAKIAl1bnNpZ25lZCBpbnQgc2l6ZV92bW9kZTsKIAl1bnNpZ25lZCBpbnQgc2l6ZV9yZW1hcDsKIAl1bnNpZ25lZCBpbnQgc2l6ZV90b3RhbDsKKwlpbnQgcmVxdWVzdF9zdWNjZWVkZWQgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZWZpZmI6IHByb2JpbmcgZm9yIGVmaWZiXG4iKTsKKworCWlmICghc2NyZWVuX2luZm8ubGZiX2RlcHRoKQorCQlzY3JlZW5faW5mby5sZmJfZGVwdGggPSAzMjsKKwlpZiAoIXNjcmVlbl9pbmZvLnBhZ2VzKQorCQlzY3JlZW5faW5mby5wYWdlcyA9IDE7CisKKwkvKiBqdXN0IGFzc3VtZSB0aGV5J3JlIGFsbCB1bnNldCBpZiBhbnkgYXJlICovCisJaWYgKCFzY3JlZW5faW5mby5ibHVlX3NpemUpIHsKKwkJc2NyZWVuX2luZm8uYmx1ZV9zaXplID0gODsKKwkJc2NyZWVuX2luZm8uYmx1ZV9wb3MgPSAwOworCQlzY3JlZW5faW5mby5ncmVlbl9zaXplID0gODsKKwkJc2NyZWVuX2luZm8uZ3JlZW5fcG9zID0gODsKKwkJc2NyZWVuX2luZm8ucmVkX3NpemUgPSA4OworCQlzY3JlZW5faW5mby5yZWRfcG9zID0gMTY7CisJCXNjcmVlbl9pbmZvLnJzdmRfc2l6ZSA9IDg7CisJCXNjcmVlbl9pbmZvLnJzdmRfcG9zID0gMjQ7CisJfQogCiAJZWZpZmJfZml4LnNtZW1fc3RhcnQgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKIAllZmlmYl9kZWZpbmVkLmJpdHNfcGVyX3BpeGVsID0gc2NyZWVuX2luZm8ubGZiX2RlcHRoOwpAQCAtOTgsMjEgKzI1MCwyNSBAQAogCSAqICAgICAgICAgICAgICAgICBvcHRpb24gdG8gc2ltcGx5IHVzZSBzaXplX3RvdGFsIGFzIHRoYXQKIAkgKiAgICAgICAgICAgICAgICAgd2FzdGVzIHBsZW50eSBvZiBrZXJuZWwgYWRkcmVzcyBzcGFjZS4gKi8KIAlzaXplX3JlbWFwICA9IHNpemVfdm1vZGUgKiAyOwotCWlmIChzaXplX3JlbWFwIDwgc2l6ZV92bW9kZSkKLQkJc2l6ZV9yZW1hcCA9IHNpemVfdm1vZGU7CiAJaWYgKHNpemVfcmVtYXAgPiBzaXplX3RvdGFsKQogCQlzaXplX3JlbWFwID0gc2l6ZV90b3RhbDsKKwlpZiAoc2l6ZV9yZW1hcCAlIFBBR0VfU0laRSkKKwkJc2l6ZV9yZW1hcCArPSBQQUdFX1NJWkUgLSAoc2l6ZV9yZW1hcCAlIFBBR0VfU0laRSk7CiAJZWZpZmJfZml4LnNtZW1fbGVuID0gc2l6ZV9yZW1hcDsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGVmaWZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3RvdGFsLCAiZWZpZmIiKSkKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGVmaWZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3JlbWFwLCAiZWZpZmIiKSkgeworCQlyZXF1ZXN0X3N1Y2NlZWRlZCA9IDE7CisJfSBlbHNlIHsKIAkJLyogV2UgY2Fubm90IG1ha2UgdGhpcyBmYXRhbC4gU29tZXRpbWVzIHRoaXMgY29tZXMgZnJvbSBtYWdpYwogCQkgICBzcGFjZXMgb3VyIHJlc291cmNlIGhhbmRsZXJzIHNpbXBseSBkb24ndCBrbm93IGFib3V0ICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJlZmlmYjogY2Fubm90IHJlc2VydmUgdmlkZW8gbWVtb3J5IGF0IDB4JWx4XG4iLAogCQkJZWZpZmJfZml4LnNtZW1fc3RhcnQpOworCX0KIAogCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YodTMyKSAqIDE2LCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgImVmaWZiOiBjYW5ub3QgYWxsb2NhdGUgZnJhbWVidWZmZXJcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKIAl9CkBAIC0xMjUsNyArMjgxLDcgQEAKIAkJCQkiMHgleCBAIDB4JWx4XG4iLAogCQkJZWZpZmJfZml4LnNtZW1fbGVuLCBlZmlmYl9maXguc21lbV9zdGFydCk7CiAJCWVyciA9IC1FSU87Ci0JCWdvdG8gZXJyX3VubWFwOworCQlnb3RvIGVycl9yZWxlYXNlX2ZiOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gImVmaWZiOiBmcmFtZWJ1ZmZlciBhdCAweCVseCwgbWFwcGVkIHRvIDB4JXAsICIKQEAgLTE3OCwyNSArMzM0LDI3IEBACiAJaW5mby0+Zml4ID0gZWZpZmJfZml4OwogCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKIAotCWlmIChmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApIDwgMCkgewotCQllcnIgPSAtRU5PTUVNOworCWlmICgoZXJyID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpZmI6IGNhbm5vdCBhbGxvY2F0ZSBjb2xvcm1hcFxuIik7CiAJCWdvdG8gZXJyX3VubWFwOwogCX0KLQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJaWYgKChlcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWZpZmI6IGNhbm5vdCByZWdpc3RlciBmcmFtZWJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX2ZiX2RlYWxvYzsKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwKLQkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKKwkJaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKIAlyZXR1cm4gMDsKIAogZXJyX2ZiX2RlYWxvYzoKIAlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogZXJyX3VubWFwOgogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworZXJyX3JlbGVhc2VfZmI6CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIGVycl9yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oZWZpZmJfZml4LnNtZW1fc3RhcnQsIHNpemVfdG90YWwpOworCWlmIChyZXF1ZXN0X3N1Y2NlZWRlZCkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGVmaWZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3RvdGFsKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMTQsOSArMzcyLDIyIEBACiBzdGF0aWMgaW50IF9faW5pdCBlZmlmYl9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKKwljaGFyICpvcHRpb24gPSBOVUxMOwogCiAJaWYgKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgIT0gVklERU9fVFlQRV9FRkkpCiAJCXJldHVybiAtRU5PREVWOworCWRtaV9jaGVja19zeXN0ZW0oZG1pX3N5c3RlbV90YWJsZSk7CisKKwlpZiAoZmJfZ2V0X29wdGlvbnMoImVmaWZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworCWVmaWZiX3NldHVwKG9wdGlvbik7CisKKwkvKiBXZSBkb24ndCBnZXQgbGluZWxlbmd0aCBmcm9tIFVHQSBEcmF3IFByb3RvY29sLCBvbmx5IGZyb20KKwkgKiBFRkkgR3JhcGhpY3MgUHJvdG9jb2wuICBTbyBpZiBpdCdzIG5vdCBpbiBETUksIGFuZCBpdCdzIG5vdAorCSAqIHBhc3NlZCBpbiBmcm9tIHRoZSB1c2VyLCB3ZSByZWFsbHkgY2FuJ3QgdXNlIHRoZSBmcmFtZWJ1ZmZlci4KKwkgKi8KKwlpZiAoIXNjcmVlbl9pbmZvLmxmYl9saW5lbGVuZ3RoKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWZpZmJfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDk4ODQzYzIuLjIxN2M1MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTI4LDkgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaWZkZWYgQ09ORklHX0tNT0QKICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KQEAgLTgzNywxMyArODM1LDYgQEAKIAlyZXR1cm4gKGNudCkgPyBjbnQgOiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfS01PRAotc3RhdGljIHZvaWQgdHJ5X3RvX2xvYWQoaW50IGZiKQotewotCXJlcXVlc3RfbW9kdWxlKCJmYiVkIiwgZmIpOwotfQotI2VuZGlmIC8qIENPTkZJR19LTU9EICovCi0KIGludAogZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewpAQCAtOTc5LDYgKzk3MCw3IEBACiAKIAkJCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX01JU0NfVVNFUkVWRU5UOwogCQkJCWV2ZW50LmluZm8gPSBpbmZvOworCQkJCWV2ZW50LmRhdGEgPSAmbW9kZTsKIAkJCQlmYl9ub3RpZmllcl9jYWxsX2NoYWluKGV2bnQsICZldmVudCk7CiAJCQl9CiAJCX0KQEAgLTEwODUsMTAgKzEwNzcsOCBAQAogCQkgICAgcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChjb24yZmIuZnJhbWVidWZmZXIgPCAwIHx8IGNvbjJmYi5mcmFtZWJ1ZmZlciA+PSBGQl9NQVgpCiAJCSAgICByZXR1cm4gLUVJTlZBTDsKLSNpZmRlZiBDT05GSUdfS01PRAogCQlpZiAoIXJlZ2lzdGVyZWRfZmJbY29uMmZiLmZyYW1lYnVmZmVyXSkKLQkJICAgIHRyeV90b19sb2FkKGNvbjJmYi5mcmFtZWJ1ZmZlcik7Ci0jZW5kaWYgLyogQ09ORklHX0tNT0QgKi8KKwkJICAgIHJlcXVlc3RfbW9kdWxlKCJmYiVkIiwgY29uMmZiLmZyYW1lYnVmZmVyKTsKIAkJaWYgKCFyZWdpc3RlcmVkX2ZiW2NvbjJmYi5mcmFtZWJ1ZmZlcl0pCiAJCSAgICByZXR1cm4gLUVJTlZBTDsKIAkJZXZlbnQuaW5mbyA9IGluZm87CkBAIC0xMzI2LDEwICsxMzE2LDggQEAKIAlpZiAoZmJpZHggPj0gRkJfTUFYKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlsb2NrX2tlcm5lbCgpOwotI2lmZGVmIENPTkZJR19LTU9ECiAJaWYgKCEoaW5mbyA9IHJlZ2lzdGVyZWRfZmJbZmJpZHhdKSkKLQkJdHJ5X3RvX2xvYWQoZmJpZHgpOwotI2VuZGlmIC8qIENPTkZJR19LTU9EICovCisJCXJlcXVlc3RfbW9kdWxlKCJmYiVkIiwgZmJpZHgpOwogCWlmICghKGluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XSkpIHsKIAkJcmVzID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CkBAIC0xNDQyLDkgKzE0MzAsOCBAQAogCQkJYnJlYWs7CiAJZmJfaW5mby0+bm9kZSA9IGk7CiAKLQlmYl9pbmZvLT5kZXYgPSBkZXZpY2VfY3JlYXRlX2RydmRhdGEoZmJfY2xhc3MsIGZiX2luZm8tPmRldmljZSwKLQkJCQkJICAgICBNS0RFVihGQl9NQUpPUiwgaSksIE5VTEwsCi0JCQkJCSAgICAgImZiJWQiLCBpKTsKKwlmYl9pbmZvLT5kZXYgPSBkZXZpY2VfY3JlYXRlKGZiX2NsYXNzLCBmYl9pbmZvLT5kZXZpY2UsCisJCQkJICAgICBNS0RFVihGQl9NQUpPUiwgaSksIE5VTEwsICJmYiVkIiwgaSk7CiAJaWYgKElTX0VSUihmYl9pbmZvLT5kZXYpKSB7CiAJCS8qIE5vdCBmYXRhbCAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY3JlYXRlIGRldmljZSBmb3IgZnJhbWVidWZmZXIgJWQ7IGVycm5vID0gJWxkXG4iLCBpLCBQVFJfRVJSKGZiX2luZm8tPmRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IDZhMGFhMTguLjVjMWEyYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTU2NCw3ICs1NjQsMTMgQEAKIAkJbW9kZS0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CiAJbW9kZS0+cmVmcmVzaCA9IFBJWEVMX0NMT0NLLygoSF9BQ1RJVkUgKyBIX0JMQU5LSU5HKSAqCiAJCQkJICAgICAoVl9BQ1RJVkUgKyBWX0JMQU5LSU5HKSk7Ci0JbW9kZS0+dm1vZGUgPSAwOworCWlmIChJTlRFUkxBQ0VEKSB7CisJCW1vZGUtPnlyZXMgKj0gMjsKKwkJbW9kZS0+dXBwZXJfbWFyZ2luICo9IDI7CisJCW1vZGUtPmxvd2VyX21hcmdpbiAqPSAyOworCQltb2RlLT52c3luY19sZW4gKj0gMjsKKwkJbW9kZS0+dm1vZGUgfD0gRkJfVk1PREVfSU5URVJMQUNFRDsKKwl9CiAJbW9kZS0+ZmxhZyA9IEZCX01PREVfSVNfREVUQUlMRUQ7CiAKIAlEUFJJTlRLKCIgICAgICAlZCBNSHogIiwgIFBJWEVMX0NMT0NLLzEwMDAwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mZmIuYyBiL2RyaXZlcnMvdmlkZW8vZmZiLmMKaW5kZXggNzk5MmIxMy4uOWRiYjk2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZmYi5jCkBAIC0xMDQyLDcgKzEwNDIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmZmJfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZmYl9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiU1VOVyxmZmIiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ltYWNmYi5jIGIvZHJpdmVycy92aWRlby9pbWFjZmIuYwppbmRleCA5MzY2ZWYyLi5lNjlkZTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ltYWNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW1hY2ZiLmMKQEAgLTEsMzc2ICswLDAgQEAKLS8qCi0gKiBmcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIEludGVsIEJhc2VkIE1hYydzCi0gKgotICogKGMpIDIwMDYgRWRnYXIgSHVjZWsgPGdpbWxpQGRhcmstZ3JlZW4uY29tPgotICogT3JpZ2luYWwgaW1hYyBkcml2ZXIgd3JpdHRlbiBieSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvZWZpLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPHZpZGVvL3ZnYS5oPgotCi10eXBlZGVmIGVudW0gX01BQ19UWVBFIHsKLQlNX0kxNywKLQlNX0kyMCwKLQlNX01JTkksCi0JTV9NQUNCT09LLAotCU1fVU5LTk9XTgotfSBNQUNfVFlQRTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gaW1hY2ZiX2RlZmluZWQgX19pbml0ZGF0YSA9IHsKLQkuYWN0aXZhdGUJCT0gRkJfQUNUSVZBVEVfTk9XLAotCS5oZWlnaHQJCQk9IC0xLAotCS53aWR0aAkJCT0gLTEsCi0JLnJpZ2h0X21hcmdpbgkJPSAzMiwKLQkudXBwZXJfbWFyZ2luCQk9IDE2LAotCS5sb3dlcl9tYXJnaW4JCT0gNCwKLQkudnN5bmNfbGVuCQk9IDQsCi0JLnZtb2RlCQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAotfTsKLQotc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBpbWFjZmJfZml4IF9faW5pdGRhdGEgPSB7Ci0JLmlkCQkJPSAiSU1BQyBWR0EiLAotCS50eXBlCQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCi0JLmFjY2VsCQkJPSBGQl9BQ0NFTF9OT05FLAotCS52aXN1YWwJCQk9IEZCX1ZJU1VBTF9UUlVFQ09MT1IsCi19OwotCi1zdGF0aWMgaW50IGludmVyc2U7Ci1zdGF0aWMgaW50IG1vZGVsCQk9IE1fVU5LTk9XTjsKLXN0YXRpYyBpbnQgbWFudWFsX2hlaWdodDsKLXN0YXRpYyBpbnQgbWFudWFsX3dpZHRoOwotCi1zdGF0aWMgaW50IHNldF9zeXN0ZW0oY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQotewotCXByaW50ayhLRVJOX0lORk8gImltYWNmYjogJXMgZGV0ZWN0ZWQgLSBzZXQgc3lzdGVtIHRvICVsZFxuIiwKLQkJaWQtPmlkZW50LCAobG9uZylpZC0+ZHJpdmVyX2RhdGEpOwotCi0JbW9kZWwgPSAobG9uZylpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgZG1pX3N5c3RlbV90YWJsZVtdID0gewotCXsgc2V0X3N5c3RlbSwgImlNYWM0LDEiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCJBcHBsZSBDb21wdXRlciwgSW5jLiIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsImlNYWM0LDEiKSB9LCAodm9pZCopTV9JMTd9LAotCXsgc2V0X3N5c3RlbSwgIk1hY0Jvb2tQcm8xLDEiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCJBcHBsZSBDb21wdXRlciwgSW5jLiIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2tQcm8xLDEiKSB9LCAodm9pZCopTV9JMTd9LAotCXsgc2V0X3N5c3RlbSwgIk1hY0Jvb2sxLDEiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCJBcHBsZSBDb21wdXRlciwgSW5jLiIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2sxLDEiKX0sICh2b2lkICopTV9NQUNCT09LfSwKLQl7IHNldF9zeXN0ZW0sICJNYWNtaW5pMSwxIiwgewotCSAgRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiQXBwbGUgQ29tcHV0ZXIsIEluYy4iKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCJNYWNtaW5pMSwxIil9LCAodm9pZCAqKU1fTUlOSX0sCi0Je30sCi19OwotCi0jZGVmaW5lCURFRkFVTFRfRkJfTUVNCTEwMjQqMTAyNCoxNgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBpbWFjZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKLQkJCSAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQkvKgotCSAqICBTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlCi0JICogIGFscmVhZHkgcm91bmRlZCBkb3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcwotCSAqICAoYWNjb3JkaW5nIHRvIHRoZSBlbnRyaWVzIGluIHRoZSBgdmFyJyBzdHJ1Y3R1cmUpLiBSZXR1cm4KLQkgKiAgIT0gMCBmb3IgaW52YWxpZCByZWduby4KLQkgKi8KLQotCWlmIChyZWdubyA+PSBpbmZvLT5jbWFwLmxlbikKLQkJcmV0dXJuIDE7Ci0KLQlpZiAocmVnbm8gPCAxNikgewotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9Ci0JCQkocmVkICAgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAotCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlICA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBmYl9vcHMgaW1hY2ZiX29wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmZiX3NldGNvbHJlZwk9IGltYWNmYl9zZXRjb2xyZWcsCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGltYWNmYl9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWNoYXIgKnRoaXNfb3B0OwotCi0JaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghKnRoaXNfb3B0KSBjb250aW51ZTsKLQotCQlpZiAoIXN0cmNtcCh0aGlzX29wdCwgImludmVyc2UiKSkKLQkJCWludmVyc2UgPSAxOwotCQllbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAiaTE3IikpCi0JCQltb2RlbCA9IE1fSTE3OwotCQllbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAiaTIwIikpCi0JCQltb2RlbCA9IE1fSTIwOwotCQllbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAibWluaSIpKQotCQkJbW9kZWwgPSBNX01JTkk7Ci0JCWVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJtYWNib29rIikpCi0JCQltb2RlbCA9IE1fTUFDQk9PSzsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJoZWlnaHQ6IiwgNykpCi0JCQltYW51YWxfaGVpZ2h0ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNywgTlVMTCwgMCk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAid2lkdGg6IiwgNikpCi0JCQltYW51YWxfd2lkdGggPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs2LCBOVUxMLCAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGltYWNmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZiX2luZm8gKmluZm87Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgc2l6ZV92bW9kZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9yZW1hcDsKLQl1bnNpZ25lZCBpbnQgc2l6ZV90b3RhbDsKLQotCXNjcmVlbl9pbmZvLmxmYl9kZXB0aCA9IDMyOwotCXNjcmVlbl9pbmZvLmxmYl9zaXplID0gREVGQVVMVF9GQl9NRU0gLyAweDEwMDAwOwotCXNjcmVlbl9pbmZvLnBhZ2VzPTE7Ci0Jc2NyZWVuX2luZm8uYmx1ZV9zaXplID0gODsKLQlzY3JlZW5faW5mby5ibHVlX3BvcyA9IDA7Ci0Jc2NyZWVuX2luZm8uZ3JlZW5fc2l6ZSA9IDg7Ci0Jc2NyZWVuX2luZm8uZ3JlZW5fcG9zID0gODsKLQlzY3JlZW5faW5mby5yZWRfc2l6ZSA9IDg7Ci0Jc2NyZWVuX2luZm8ucmVkX3BvcyA9IDE2OwotCXNjcmVlbl9pbmZvLnJzdmRfc2l6ZSA9IDg7Ci0Jc2NyZWVuX2luZm8ucnN2ZF9wb3MgPSAyNDsKLQotCXN3aXRjaCAobW9kZWwpIHsKLQljYXNlIE1fSTE3OgotCQlzY3JlZW5faW5mby5sZmJfd2lkdGggPSAxNDQwOwotCQlzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gOTAwOwotCQlzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9IDE0NzIgKiA0OwotCQlzY3JlZW5faW5mby5sZmJfYmFzZSA9IDB4ODAwMTAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgTV9JMjA6Ci0JCXNjcmVlbl9pbmZvLmxmYl93aWR0aCA9IDE2ODA7Ci0JCXNjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPSAxMDUwOwotCQlzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9IDE3MjggKiA0OwotCQlzY3JlZW5faW5mby5sZmJfYmFzZSA9IDB4ODAwMTAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgTV9NSU5JOgotCQlzY3JlZW5faW5mby5sZmJfd2lkdGggPSAxMDI0OwotCQlzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gNzY4OwotCQlzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9IDIwNDggKiA0OwotCQlzY3JlZW5faW5mby5sZmJfYmFzZSA9IDB4ODAwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgTV9NQUNCT09LOgotCQlzY3JlZW5faW5mby5sZmJfd2lkdGggPSAxMjgwOwotCQlzY3JlZW5faW5mby5sZmJfaGVpZ2h0ID0gODAwOwotCQlzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aCA9IDIwNDggKiA0OwotCQlzY3JlZW5faW5mby5sZmJfYmFzZSA9IDB4ODAwMDAwMDA7Ci0JCWJyZWFrOwotIAl9Ci0KLQkvKiBpZiB0aGUgdXNlciB3YW50cyB0byBtYW51YWxseSBzcGVjaWZ5IGhlaWdodC93aWR0aCwKLQkgICB3ZSB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLwotCS8qIFRPRE86IGV2ZW50dWFsbHkgZ2V0IGF1dG8tZGV0ZWN0aW9uIHdvcmtpbmcgKi8KLQlpZiAobWFudWFsX2hlaWdodCA+IDApCi0JCXNjcmVlbl9pbmZvLmxmYl9oZWlnaHQgPSBtYW51YWxfaGVpZ2h0OwotCWlmIChtYW51YWxfd2lkdGggPiAwKQotCQlzY3JlZW5faW5mby5sZmJfd2lkdGggPSBtYW51YWxfd2lkdGg7Ci0KLQlpbWFjZmJfZml4LnNtZW1fc3RhcnQgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKLQlpbWFjZmJfZGVmaW5lZC5iaXRzX3Blcl9waXhlbCA9IHNjcmVlbl9pbmZvLmxmYl9kZXB0aDsKLQlpbWFjZmJfZGVmaW5lZC54cmVzID0gc2NyZWVuX2luZm8ubGZiX3dpZHRoOwotCWltYWNmYl9kZWZpbmVkLnlyZXMgPSBzY3JlZW5faW5mby5sZmJfaGVpZ2h0OwotCWltYWNmYl9maXgubGluZV9sZW5ndGggPSBzY3JlZW5faW5mby5sZmJfbGluZWxlbmd0aDsKLQotCS8qICAgc2l6ZV92bW9kZSAtLSB0aGF0IGlzIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCBmb3IgdGhlCi0JICogICAgICAgICAgICAgICAgIHVzZWQgdmlkZW8gbW9kZSwgaS5lLiB0aGUgbWluaW11bSBhbW91bnQgb2YKLQkgKiAgICAgICAgICAgICAgICAgbWVtb3J5IHdlIG5lZWQuICovCi0Jc2l6ZV92bW9kZSA9IGltYWNmYl9kZWZpbmVkLnlyZXMgKiBpbWFjZmJfZml4LmxpbmVfbGVuZ3RoOwotCi0JLyogICBzaXplX3RvdGFsIC0tIGFsbCB2aWRlbyBtZW1vcnkgd2UgaGF2ZS4gVXNlZCBmb3IKLQkgKiAgICAgICAgICAgICAgICAgZW50cmllcywgcmVzc291cmNlIGFsbG9jYXRpb24gYW5kIGJvdW5kcwotCSAqICAgICAgICAgICAgICAgICBjaGVja2luZy4gKi8KLQlzaXplX3RvdGFsID0gc2NyZWVuX2luZm8ubGZiX3NpemUgKiA2NTUzNjsKLQlpZiAoc2l6ZV90b3RhbCA8IHNpemVfdm1vZGUpCi0JCXNpemVfdG90YWwgPSBzaXplX3Ztb2RlOwotCi0JLyogICBzaXplX3JlbWFwIC0tIHRoZSBhbW91bnQgb2YgdmlkZW8gbWVtb3J5IHdlIGFyZSBnb2luZyB0bwotCSAqICAgICAgICAgICAgICAgICB1c2UgZm9yIGltYWNmYi4gIFdpdGggbW9kZXJuIGNhcmRzIGl0IGlzIG5vCi0JICogICAgICAgICAgICAgICAgIG9wdGlvbiB0byBzaW1wbHkgdXNlIHNpemVfdG90YWwgYXMgdGhhdAotCSAqICAgICAgICAgICAgICAgICB3YXN0ZXMgcGxlbnR5IG9mIGtlcm5lbCBhZGRyZXNzIHNwYWNlLiAqLwotCXNpemVfcmVtYXAgID0gc2l6ZV92bW9kZSAqIDI7Ci0JaWYgKHNpemVfcmVtYXAgPCBzaXplX3Ztb2RlKQotCQlzaXplX3JlbWFwID0gc2l6ZV92bW9kZTsKLQlpZiAoc2l6ZV9yZW1hcCA+IHNpemVfdG90YWwpCi0JCXNpemVfcmVtYXAgPSBzaXplX3RvdGFsOwotCWltYWNmYl9maXguc21lbV9sZW4gPSBzaXplX3JlbWFwOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3RvdGFsLCAiaW1hY2ZiIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImltYWNmYjogY2Fubm90IHJlc2VydmUgdmlkZW8gbWVtb3J5IGF0IDB4JWx4XG4iLAotCQkJaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0KTsKLQkJLyogV2UgY2Fubm90IG1ha2UgdGhpcyBmYXRhbC4gU29tZXRpbWVzIHRoaXMgY29tZXMgZnJvbSBtYWdpYwotCQkgICBzcGFjZXMgb3VyIHJlc291cmNlIGhhbmRsZXJzIHNpbXBseSBkb24ndCBrbm93IGFib3V0ICovCi0JfQotCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7Ci0JaWYgKCFpbmZvKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3JlbGVhc2VfbWVtOwotCX0KLQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGluZm8tPnBhcjsKLQlpbmZvLT5wYXIgPSBOVUxMOwotCi0JaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGltYWNmYl9maXguc21lbV9zdGFydCwgaW1hY2ZiX2ZpeC5zbWVtX2xlbik7Ci0JaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgImltYWNmYjogYWJvcnQsIGNhbm5vdCBpb3JlbWFwIHZpZGVvIG1lbW9yeSAiCi0JCQkJIjB4JXggQCAweCVseFxuIiwKLQkJCWltYWNmYl9maXguc21lbV9sZW4sIGltYWNmYl9maXguc21lbV9zdGFydCk7Ci0JCWVyciA9IC1FSU87Ci0JCWdvdG8gZXJyX3VubWFwOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gImltYWNmYjogZnJhbWVidWZmZXIgYXQgMHglbHgsIG1hcHBlZCB0byAweCVwLCAiCi0JICAgICAgICJ1c2luZyAlZGssIHRvdGFsICVka1xuIiwKLQkgICAgICAgaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5zY3JlZW5fYmFzZSwKLQkgICAgICAgc2l6ZV9yZW1hcC8xMDI0LCBzaXplX3RvdGFsLzEwMjQpOwotCXByaW50ayhLRVJOX0lORk8gImltYWNmYjogbW9kZSBpcyAlZHglZHglZCwgbGluZWxlbmd0aD0lZCwgcGFnZXM9JWRcbiIsCi0JICAgICAgIGltYWNmYl9kZWZpbmVkLnhyZXMsIGltYWNmYl9kZWZpbmVkLnlyZXMsCi0JICAgICAgIGltYWNmYl9kZWZpbmVkLmJpdHNfcGVyX3BpeGVsLCBpbWFjZmJfZml4LmxpbmVfbGVuZ3RoLAotCSAgICAgICBzY3JlZW5faW5mby5wYWdlcyk7Ci0KLQlpbWFjZmJfZGVmaW5lZC54cmVzX3ZpcnR1YWwgPSBpbWFjZmJfZGVmaW5lZC54cmVzOwotCWltYWNmYl9kZWZpbmVkLnlyZXNfdmlydHVhbCA9IGltYWNmYl9maXguc21lbV9sZW4gLwotCQkJCQlpbWFjZmJfZml4LmxpbmVfbGVuZ3RoOwotCXByaW50ayhLRVJOX0lORk8gImltYWNmYjogc2Nyb2xsaW5nOiByZWRyYXdcbiIpOwotCWltYWNmYl9kZWZpbmVkLnlyZXNfdmlydHVhbCA9IGltYWNmYl9kZWZpbmVkLnlyZXM7Ci0KLQkvKiBzb21lIGR1bW15IHZhbHVlcyBmb3IgdGltaW5nIHRvIG1ha2UgZmJzZXQgaGFwcHkgKi8KLQlpbWFjZmJfZGVmaW5lZC5waXhjbG9jayAgICAgPSAxMDAwMDAwMCAvIGltYWNmYl9kZWZpbmVkLnhyZXMgKgotCQkJCQkxMDAwIC8gaW1hY2ZiX2RlZmluZWQueXJlczsKLQlpbWFjZmJfZGVmaW5lZC5sZWZ0X21hcmdpbiAgPSAoaW1hY2ZiX2RlZmluZWQueHJlcyAvIDgpICYgMHhmODsKLQlpbWFjZmJfZGVmaW5lZC5oc3luY19sZW4gICAgPSAoaW1hY2ZiX2RlZmluZWQueHJlcyAvIDgpICYgMHhmODsKLQotCWltYWNmYl9kZWZpbmVkLnJlZC5vZmZzZXQgICAgPSBzY3JlZW5faW5mby5yZWRfcG9zOwotCWltYWNmYl9kZWZpbmVkLnJlZC5sZW5ndGggICAgPSBzY3JlZW5faW5mby5yZWRfc2l6ZTsKLQlpbWFjZmJfZGVmaW5lZC5ncmVlbi5vZmZzZXQgID0gc2NyZWVuX2luZm8uZ3JlZW5fcG9zOwotCWltYWNmYl9kZWZpbmVkLmdyZWVuLmxlbmd0aCAgPSBzY3JlZW5faW5mby5ncmVlbl9zaXplOwotCWltYWNmYl9kZWZpbmVkLmJsdWUub2Zmc2V0ICAgPSBzY3JlZW5faW5mby5ibHVlX3BvczsKLQlpbWFjZmJfZGVmaW5lZC5ibHVlLmxlbmd0aCAgID0gc2NyZWVuX2luZm8uYmx1ZV9zaXplOwotCWltYWNmYl9kZWZpbmVkLnRyYW5zcC5vZmZzZXQgPSBzY3JlZW5faW5mby5yc3ZkX3BvczsKLQlpbWFjZmJfZGVmaW5lZC50cmFuc3AubGVuZ3RoID0gc2NyZWVuX2luZm8ucnN2ZF9zaXplOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiaW1hY2ZiOiAlczogIgotCSAgICAgICAic2l6ZT0lZDolZDolZDolZCwgc2hpZnQ9JWQ6JWQ6JWQ6JWRcbiIsCi0JICAgICAgICJUcnVlY29sb3IiLAotCSAgICAgICBzY3JlZW5faW5mby5yc3ZkX3NpemUsCi0JICAgICAgIHNjcmVlbl9pbmZvLnJlZF9zaXplLAotCSAgICAgICBzY3JlZW5faW5mby5ncmVlbl9zaXplLAotCSAgICAgICBzY3JlZW5faW5mby5ibHVlX3NpemUsCi0JICAgICAgIHNjcmVlbl9pbmZvLnJzdmRfcG9zLAotCSAgICAgICBzY3JlZW5faW5mby5yZWRfcG9zLAotCSAgICAgICBzY3JlZW5faW5mby5ncmVlbl9wb3MsCi0JICAgICAgIHNjcmVlbl9pbmZvLmJsdWVfcG9zKTsKLQotCWltYWNmYl9maXgueXBhbnN0ZXAgID0gMDsKLQlpbWFjZmJfZml4Lnl3cmFwc3RlcCA9IDA7Ci0KLQkvKiByZXF1ZXN0IGZhaWx1cmUgZG9lcyBub3QgZmF6ZSB1cywgYXMgdmdhY29uIHByb2JhYmx5IGhhcyB0aGlzCi0JICogcmVnaW9uIGFscmVhZHkgKEZJWE1FKSAqLwotCXJlcXVlc3RfcmVnaW9uKDB4M2MwLCAzMiwgImltYWNmYiIpOwotCi0JaW5mby0+ZmJvcHMgPSAmaW1hY2ZiX29wczsKLQlpbmZvLT52YXIgPSBpbWFjZmJfZGVmaW5lZDsKLQlpbmZvLT5maXggPSBpbWFjZmJfZml4OwotCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKLQotCWlmIChmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApIDwgMCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl91bm1hcDsKLQl9Ci0JaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pPDApIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfZmJfZGVhbG9jOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLAotCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOwotCXJldHVybiAwOwotCi1lcnJfZmJfZGVhbG9jOgotCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci1lcnJfdW5tYXA6Ci0JaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKLWVycl9yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oaW1hY2ZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3RvdGFsKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbWFjZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IGltYWNmYl9wcm9iZSwKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJpbWFjZmIiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbWFjZmJfZGV2aWNlID0gewotCS5uYW1lCT0gImltYWNmYiIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbWFjZmJfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0JY2hhciAqb3B0aW9uID0gTlVMTDsKLQotCWlmICghZWZpX2VuYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghZG1pX2NoZWNrX3N5c3RlbShkbWlfc3lzdGVtX3RhYmxlKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKG1vZGVsID09IE1fVU5LTk9XTikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoZmJfZ2V0X29wdGlvbnMoImltYWNmYiIsICZvcHRpb24pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWltYWNmYl9zZXR1cChvcHRpb24pOwotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW1hY2ZiX2RyaXZlcik7Ci0KLQlpZiAoIXJldCkgewotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmltYWNmYl9kZXZpY2UpOwotCQlpZiAocmV0KQotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmltYWNmYl9kcml2ZXIpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQoaW1hY2ZiX2luaXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaAppbmRleCAzMzI1ZmJkLi5hNTBiZWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKQEAgLTEyLDkgKzEyLDkgQEAKICNlbmRpZgogCiAvKioqIFZlcnNpb24vbmFtZSAqKiovCi0jZGVmaW5lIElOVEVMRkJfVkVSU0lPTgkJCSIwLjkuNSIKKyNkZWZpbmUgSU5URUxGQl9WRVJTSU9OCQkJIjAuOS42IgogI2RlZmluZSBJTlRFTEZCX01PRFVMRV9OQU1FCQkiaW50ZWxmYiIKLSNkZWZpbmUgU1VQUE9SVEVEX0NISVBTRVRTCQkiODMwTS84NDVHLzg1MkdNLzg1NUdNLzg2NUcvOTE1Ry85MTVHTS85NDVHLzk0NUdNLzk2NUcvOTY1R00iCisjZGVmaW5lIFNVUFBPUlRFRF9DSElQU0VUUwkJIjgzME0vODQ1Ry84NTJHTS84NTVHTS84NjVHLzkxNUcvOTE1R00vOTQ1Ry85NDVHTS85NDVHTUUvOTY1Ry85NjVHTSIKIAogCiAvKioqIERlYnVnL2ZlYXR1cmUgZGVmaW5lcyAqKiovCkBAIC01OCw2ICs1OCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R00JMHgyNTkyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfOTQ1RwkweDI3NzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF85NDVHTQkweDI3QTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF85NDVHTUUJMHgyN0FFCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfOTY1RwkweDI5QTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF85NjVHTQkweDJBMDIKIApAQCAtMTYwLDYgKzE2MSw3IEBACiAJSU5URUxfOTE1R00sCiAJSU5URUxfOTQ1RywKIAlJTlRFTF85NDVHTSwKKwlJTlRFTF85NDVHTUUsCiAJSU5URUxfOTY1RywKIAlJTlRFTF85NjVHTSwKIH07CkBAIC0zNjMsNiArMzY1LDcgQEAKIAkJCSgoZGluZm8pLT5jaGlwc2V0ID09IElOVEVMXzkxNUdNKSB8fAlcCiAJCQkoKGRpbmZvKS0+Y2hpcHNldCA9PSBJTlRFTF85NDVHKSB8fAlcCiAJCQkoKGRpbmZvKS0+Y2hpcHNldCA9PSBJTlRFTF85NDVHTSkgfHwJXAorCQkJKChkaW5mbyktPmNoaXBzZXQgPT0gSU5URUxfOTQ1R01FKSB8fAlcCiAJCQkoKGRpbmZvKS0+Y2hpcHNldCA9PSBJTlRFTF85NjVHKSB8fAlcCiAJCQkoKGRpbmZvKS0+Y2hpcHNldCA9PSBJTlRFTF85NjVHTSkpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiX2kyYy5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJfaTJjLmMKaW5kZXggZmNmOWZhZC4uNWQ4OTZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJfaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJfaTJjLmMKQEAgLTE3MSw2ICsxNzEsNyBAQAogCQkvKiBoYXMgc29tZSBMVkRTICsgdHYtb3V0ICovCiAJY2FzZSBJTlRFTF85NDVHOgogCWNhc2UgSU5URUxfOTQ1R006CisJY2FzZSBJTlRFTF85NDVHTUU6CiAJY2FzZSBJTlRFTF85NjVHOgogCWNhc2UgSU5URUxfOTY1R006CiAJCS8qIFNEVk8gcG9ydHMgaGF2ZSBhIHNpbmdsZSBjb250cm9sIGJ1cyAtIDIgZGV2aWNlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKaW5kZXggZTQ0MzAzZi4uYTA5ZTIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCkBAIC0yLDcgKzIsNyBAQAogICogaW50ZWxmYgogICoKICAqIExpbnV4IGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgSW50ZWwoUikgODMwTS84NDVHLzg1MkdNLzg1NUdNLzg2NUcvOTE1Ry85MTVHTS8KLSAqIDk0NUcvOTQ1R00vOTY1Ry85NjVHTSBpbnRlZ3JhdGVkIGdyYXBoaWNzIGNoaXBzLgorICogOTQ1Ry85NDVHTS85NDVHTUUvOTY1Ry85NjVHTSBpbnRlZ3JhdGVkIGdyYXBoaWNzIGNoaXBzLgogICoKICAqIENvcHlyaWdodCDCqSAyMDAyLCAyMDAzIERhdmlkIERhd2VzIDxkYXdlc0B4ZnJlZTg2Lm9yZz4KICAqICAgICAgICAgICAgICAgICAgIDIwMDQgU3lsdmFpbiBNZXllcgpAQCAtMTAyLDYgKzEwMiw5IEBACiAgKgogICogICAgMDQvMjAwOCAtIFZlcnNpb24gMC45LjUKICAqICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgOTY1Ry85NjVHTS4gKE1haWsgQnJvZW1tZSA8bWJyb2VtbWVAcGx1c3NlcnZlci5kZT4pCisgKgorICogICAgMDgvMjAwOCAtIFZlcnNpb24gMC45LjYKKyAqICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgOTQ1R01FLiAoUGhpbCBFbmRlY290dCA8c3BhbV9mcm9tX2ludGVsZmJAY2hlenBoaWwub3JnPikKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xODMsNiArMTg2LDcgQEAKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R00sIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzkxNUdNIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzk0NUcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzk0NUcgfSwKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfOTQ1R00sIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzk0NUdNIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzk0NUdNRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX0RJU1BMQVlfVkdBIDw8IDgsIElOVEVMRkJfQ0xBU1NfTUFTSywgSU5URUxfOTQ1R01FIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzk2NUcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzk2NUcgfSwKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfOTY1R00sIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCBJTlRFTEZCX0NMQVNTX01BU0ssIElOVEVMXzk2NUdNIH0sCiAJeyAwLCB9CkBAIC01NTUsNiArNTU5LDcgQEAKIAkgICAgKGVudC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R00pIHx8CiAJICAgIChlbnQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk0NUcpICB8fAogCSAgICAoZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF85NDVHTSkgfHwKKwkgICAgKGVudC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfOTQ1R01FKSB8fAogCSAgICAoZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF85NjVHKSB8fAogCSAgICAoZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF85NjVHTSkpIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCmluZGV4IDhlNmQ2YTQuLjhiMjZiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTE0Myw2ICsxNDMsMTIgQEAKIAkJZGluZm8tPm1vYmlsZSA9IDE7CiAJCWRpbmZvLT5wbGxfaW5kZXggPSBQTExTX0k5eHg7CiAJCXJldHVybiAwOworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF85NDVHTUU6CisJCWRpbmZvLT5uYW1lID0gIkludGVsKFIpIDk0NUdNRSI7CisJCWRpbmZvLT5jaGlwc2V0ID0gSU5URUxfOTQ1R01FOworCQlkaW5mby0+bW9iaWxlID0gMTsKKwkJZGluZm8tPnBsbF9pbmRleCA9IFBMTFNfSTl4eDsKKwkJcmV0dXJuIDA7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk2NUc6CiAJCWRpbmZvLT5uYW1lID0gIkludGVsKFIpIDk2NUciOwogCQlkaW5mby0+Y2hpcHNldCA9IElOVEVMXzk2NUc7CkBAIC0xODYsNiArMTkyLDcgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1R006CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk0NUc6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk0NUdNOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF85NDVHTUU6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk2NUc6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzk2NUdNOgogCQkvKiA5MTUsIDk0NSBhbmQgOTY1IGNoaXBzZXRzIHN1cHBvcnQgYSAyNTZNQiBhcGVydHVyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbGVvLmMgYi9kcml2ZXJzL3ZpZGVvL2xlby5jCmluZGV4IDEzZmVhNjEuLjdjN2U4YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbGVvLmMKKysrIGIvZHJpdmVycy92aWRlby9sZW8uYwpAQCAtMzMsNiArMzMsNyBAQAogCiBzdGF0aWMgaW50IGxlb19tbWFwKHN0cnVjdCBmYl9pbmZvICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIHN0YXRpYyBpbnQgbGVvX2lvY3RsKHN0cnVjdCBmYl9pbmZvICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IGxlb19wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwgc3RydWN0IGZiX2luZm8gKik7CiAKIC8qCiAgKiAgRnJhbWUgYnVmZmVyIG9wZXJhdGlvbnMKQEAgLTQyLDYgKzQzLDcgQEAKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5mYl9zZXRjb2xyZWcJCT0gbGVvX3NldGNvbHJlZywKIAkuZmJfYmxhbmsJCT0gbGVvX2JsYW5rLAorCS5mYl9wYW5fZGlzcGxheQkJPSBsZW9fcGFuX2Rpc3BsYXksCiAJLmZiX2ZpbGxyZWN0CQk9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJCT0gY2ZiX2ltYWdlYmxpdCwKQEAgLTIwNiw2ICsyMDgsNjAgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIGxlb19zd2l0Y2hfZnJvbV9ncmFwaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbGVvX3BhciAqcGFyID0gKHN0cnVjdCBsZW9fcGFyICopIGluZm8tPnBhcjsKKwlzdHJ1Y3QgbGVvX2xkX3NzMCBfX2lvbWVtICpzcyA9IHBhci0+bGRfc3MwOworCXN0cnVjdCBsZW9fY3Vyc29yIF9faW9tZW0gKmN1cnNvciA9IHBhci0+Y3Vyc29yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXItPmxvY2ssIGZsYWdzKTsKKworCXBhci0+ZXh0ZW50ID0gKChpbmZvLT52YXIueHJlcyAtIDEpIHwKKwkJICAgICAgICgoaW5mby0+dmFyLnlyZXMgLSAxKSA8PCAxNikpOworCisJc2J1c193cml0ZWwoMHhmZmZmZmZmZiwgJnNzLT53aWQpOworCXNidXNfd3JpdGVsKDB4ZmZmZiwgJnNzLT53bWFzayk7CisJc2J1c193cml0ZWwoMCwgJnNzLT52Y2xpcG1pbik7CisJc2J1c193cml0ZWwocGFyLT5leHRlbnQsICZzcy0+dmNsaXBtYXgpOworCXNidXNfd3JpdGVsKDAsICZzcy0+ZmcpOworCXNidXNfd3JpdGVsKDB4ZmYwMDAwMDAsICZzcy0+cGxhbmVtYXNrKTsKKwlzYnVzX3dyaXRlbCgweDMxMDg1MCwgJnNzLT5yb3ApOworCXNidXNfd3JpdGVsKDAsICZzcy0+d2lkY2xpcCk7CisJc2J1c193cml0ZWwoKGluZm8tPnZhci54cmVzLTEpIHwgKChpbmZvLT52YXIueXJlcy0xKSA8PCAxMSksCisJCSAgICAmcGFyLT5sY19zczBfdXNyLT5leHRlbnQpOworCXNidXNfd3JpdGVsKDQsICZwYXItPmxjX3NzMF91c3ItPmFkZHJzcGFjZSk7CisJc2J1c193cml0ZWwoMHg4MDAwMDAwMCwgJnBhci0+bGNfc3MwX3Vzci0+ZmlsbCk7CisJc2J1c193cml0ZWwoMCwgJnBhci0+bGNfc3MwX3Vzci0+Zm9udHQpOworCWRvIHsKKwkJdmFsID0gc2J1c19yZWFkbCgmcGFyLT5sY19zczBfdXNyLT5jc3IpOworCX0gd2hpbGUgKHZhbCAmIDB4MjAwMDAwMDApOworCisJLyogc2V0dXAgc2NyZWVuIGJ1ZmZlciBmb3IgY2ZiXyogZnVuY3Rpb25zICovCisJc2J1c193cml0ZWwoMSwgJnNzLT53aWQpOworCXNidXNfd3JpdGVsKDB4MDBmZmZmZmYsICZzcy0+cGxhbmVtYXNrKTsKKwlzYnVzX3dyaXRlbCgweDMxMGI5MCwgJnNzLT5yb3ApOworCXNidXNfd3JpdGVsKDAsICZwYXItPmxjX3NzMF91c3ItPmFkZHJzcGFjZSk7CisKKwkvKiBoaWRlIGN1cnNvciAqLworCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoJmN1cnNvci0+Y3VyX21pc2MpICYgfkxFT19DVVJfRU5BQkxFLCAmY3Vyc29yLT5jdXJfbWlzYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXItPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBsZW9fcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCS8qIFdlIGp1c3QgdXNlIHRoaXMgdG8gY2F0Y2ggc3dpdGNoZXMgb3V0IG9mCisJICogZ3JhcGhpY3MgbW9kZS4KKwkgKi8KKwlsZW9fc3dpdGNoX2Zyb21fZ3JhcGgoaW5mbyk7CisKKwlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCB8fCB2YXItPnZtb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiAgICAgIGxlb19zZXRjb2xyZWcgLSBPcHRpb25hbCBmdW5jdGlvbi4gU2V0cyBhIGNvbG9yIHJlZ2lzdGVyLgogICogICAgICBAcmVnbm86IGJvb2xlYW4sIDAgY29weSBsb2NhbCwgMSBnZXRfdXNlcigpIGZ1bmN0aW9uCkBAIC00NTQsNDQgKzUxMCw2IEBACiAJbGVvX3dpZF9wdXQoaW5mbywgJndsKTsKIH0KIAotc3RhdGljIHZvaWQgbGVvX3N3aXRjaF9mcm9tX2dyYXBoKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBsZW9fcGFyICpwYXIgPSAoc3RydWN0IGxlb19wYXIgKikgaW5mby0+cGFyOwotCXN0cnVjdCBsZW9fbGRfc3MwIF9faW9tZW0gKnNzID0gcGFyLT5sZF9zczA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBhci0+bG9jaywgZmxhZ3MpOwotCi0JcGFyLT5leHRlbnQgPSAoKGluZm8tPnZhci54cmVzIC0gMSkgfAotCQkgICAgICAgKChpbmZvLT52YXIueXJlcyAtIDEpIDw8IDE2KSk7Ci0KLQlzYnVzX3dyaXRlbCgweGZmZmZmZmZmLCAmc3MtPndpZCk7Ci0Jc2J1c193cml0ZWwoMHhmZmZmLCAmc3MtPndtYXNrKTsKLQlzYnVzX3dyaXRlbCgwLCAmc3MtPnZjbGlwbWluKTsKLQlzYnVzX3dyaXRlbChwYXItPmV4dGVudCwgJnNzLT52Y2xpcG1heCk7Ci0Jc2J1c193cml0ZWwoMCwgJnNzLT5mZyk7Ci0Jc2J1c193cml0ZWwoMHhmZjAwMDAwMCwgJnNzLT5wbGFuZW1hc2spOwotCXNidXNfd3JpdGVsKDB4MzEwODUwLCAmc3MtPnJvcCk7Ci0Jc2J1c193cml0ZWwoMCwgJnNzLT53aWRjbGlwKTsKLQlzYnVzX3dyaXRlbCgoaW5mby0+dmFyLnhyZXMtMSkgfCAoKGluZm8tPnZhci55cmVzLTEpIDw8IDExKSwKLQkJICAgICZwYXItPmxjX3NzMF91c3ItPmV4dGVudCk7Ci0Jc2J1c193cml0ZWwoNCwgJnBhci0+bGNfc3MwX3Vzci0+YWRkcnNwYWNlKTsKLQlzYnVzX3dyaXRlbCgweDgwMDAwMDAwLCAmcGFyLT5sY19zczBfdXNyLT5maWxsKTsKLQlzYnVzX3dyaXRlbCgwLCAmcGFyLT5sY19zczBfdXNyLT5mb250dCk7Ci0JZG8gewotCQl2YWwgPSBzYnVzX3JlYWRsKCZwYXItPmxjX3NzMF91c3ItPmNzcik7Ci0JfSB3aGlsZSAodmFsICYgMHgyMDAwMDAwMCk7Ci0KLQkvKiBzZXR1cCBzY3JlZW4gYnVmZmVyIGZvciBjZmJfKiBmdW5jdGlvbnMgKi8KLQlzYnVzX3dyaXRlbCgxLCAmc3MtPndpZCk7Ci0Jc2J1c193cml0ZWwoMHgwMGZmZmZmZiwgJnNzLT5wbGFuZW1hc2spOwotCXNidXNfd3JpdGVsKDB4MzEwYjkwLCAmc3MtPnJvcCk7Ci0Jc2J1c193cml0ZWwoMCwgJnBhci0+bGNfc3MwX3Vzci0+YWRkcnNwYWNlKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhci0+bG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBsZW9faW5pdF9odyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbGVvX3BhciAqcGFyID0gKHN0cnVjdCBsZW9fcGFyICopIGluZm8tPnBhcjsKQEAgLTY0MSw3ICs2NTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBsZW9fbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGxlb19tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiU1VOVyxsZW8iLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKaW5kZXggYzAyMTM2Mi4uOGU3YTI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwpAQCAtMTQ1Myw2ICsxNDUzLDEzIEBACiAJCU1HQV9HMTAwLAogCQkmdmJHMTAwLAogCQkiTUdBLUcxMDAgKEFHUCkifSwKKwl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBFVl9QQ0ksCTB4RkYsCisJCTAsCQkJMCwKKwkJREVWRl9HMjAwLAorCQkyMzAwMDAsCisJCU1HQV9HMjAwLAorCQkmdmJHMjAwLAorCQkiTUdBLUcyMDBlViAoUENJKSJ9LAogCXtQQ0lfVkVORE9SX0lEX01BVFJPWCwJUENJX0RFVklDRV9JRF9NQVRST1hfRzIwMF9QQ0ksCTB4RkYsCiAJCTAsCQkJMCwKIAkJREVWRl9HMjAwLApAQCAtMjExOCw2ICsyMTI1LDggQEAKIAkJUENJX0FOWV9JRCwJUENJX0FOWV9JRCwJMCwgMCwgMH0sCiAJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMTAwX0FHUCwKIAkJUENJX0FOWV9JRCwJUENJX0FOWV9JRCwJMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUFUUk9YLAlQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwRVZfUENJLAorCQlQQ0lfQU5ZX0lELAlQQ0lfQU5ZX0lELAkwLCAwLCAwfSwKIAl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfUENJLAogCQlQQ0lfQU5ZX0lELAlQQ0lfQU5ZX0lELAkwLCAwLCAwfSwKIAl7UENJX1ZFTkRPUl9JRF9NQVRST1gsCVBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfQUdQLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jIGIvZHJpdmVycy92aWRlby9tZXRyb25vbWVmYi5jCmluZGV4IGNjNGMwMzguLmRmMWY3NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWV0cm9ub21lZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21ldHJvbm9tZWZiLmMKQEAgLTQwLDI5ICs0MCw2MyBAQAogCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCi0KLSNkZWZpbmUgREVCVUcgMQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERQUklOVEsoZiwgYS4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGYsIF9fZnVuY19fICwgIyMgYSkKLSNlbHNlCi0jZGVmaW5lIERQUklOVEsoZiwgYS4uLikKLSNlbmRpZgotCi0KIC8qIERpc3BsYXkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgRFBZX1cgODMyCiAjZGVmaW5lIERQWV9IIDYyMgogCitzdGF0aWMgaW50IHVzZXJfd2ZtX3NpemU7CisKIC8qIGZyYW1lIGRpZmZlcnMgZnJvbSBpbWFnZS4gZnJhbWUgaW5jbHVkZXMgbm9uLXZpc2libGUgcGl4ZWxzICovCiBzdHJ1Y3QgZXBkX2ZyYW1lIHsKIAlpbnQgZnc7IC8qIGZyYW1lIHdpZHRoICovCiAJaW50IGZoOyAvKiBmcmFtZSBoZWlnaHQgKi8KKwl1MTYgY29uZmlnWzRdOworCWludCB3Zm1fc2l6ZTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXBkX2ZyYW1lIGVwZF9mcmFtZV90YWJsZVtdID0gewogCXsKLQkuZncgPSA4MzIsCi0JLmZoID0gNjIyCisJCS5mdyA9IDgzMiwKKwkJLmZoID0gNjIyLAorCQkuY29uZmlnID0geworCQkJMTUgLyogc2RsZXcgKi8KKwkJCXwgMiA8PCA4IC8qIHNkb3N6ICovCisJCQl8IDAgPDwgMTEgLyogc2RvciAqLworCQkJfCAwIDw8IDEyIC8qIHNkY2VzICovCisJCQl8IDAgPDwgMTUsIC8qIHNkY2VyICovCisJCQk0MiAvKiBnZHNwbCAqLworCQkJfCAxIDw8IDggLyogZ2RyMSAqLworCQkJfCAxIDw8IDkgLyogc2RzaHIgKi8KKwkJCXwgMCA8PCAxNSwgLyogZ2RzcHAgKi8KKwkJCTE4IC8qIGdkc3B3ICovCisJCQl8IDAgPDwgMTUsIC8qIGRpc3BjICovCisJCQk1OTkgLyogdmRsYyAqLworCQkJfCAwIDw8IDExIC8qIGRzaSAqLworCQkJfCAwIDw8IDEyLCAvKiBkc2ljICovCisJCX0sCisJCS53Zm1fc2l6ZSA9IDQ3MDAxLAorCX0sCisJeworCQkuZncgPSAxMDg4LAorCQkuZmggPSA3OTEsCisJCS5jb25maWcgPSB7CisJCQkweDAxMDQsCisJCQkweDAzMWYsCisJCQkweDAwODgsCisJCQkweDAyZmYsCisJCX0sCisJCS53Zm1fc2l6ZSA9IDQ2NzcwLAorCX0sCisJeworCQkuZncgPSAxMjAwLAorCQkuZmggPSA4NDIsCisJCS5jb25maWcgPSB7CisJCQkweDAxMDEsCisJCQkweDAzMGUsCisJCQkweDAwMTIsCisJCQkweDAyODAsCisJCX0sCisJCS53Zm1fc2l6ZSA9IDQ2NzcwLAogCX0sCiB9OwogCkBAIC0xMzQsOSArMTY4LDggQEAKIH0KIAogLyogaGVyZSB3ZSBkZWNvZGUgdGhlIGluY29taW5nIHdhdmVmb3JtIGZpbGUgYW5kIHBvcHVsYXRlIG1ldHJvbWVtICovCi0jZGVmaW5lIEVYUF9XRk9STV9TSVpFIDQ3MDAxCi1zdGF0aWMgaW50IGxvYWRfd2F2ZWZvcm0odTggKm1lbSwgc2l6ZV90IHNpemUsIHU4ICptZXRyb21lbSwgaW50IG0sIGludCB0LAotCQkJCXU4ICpmcmFtZV9jb3VudCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxvYWRfd2F2ZWZvcm0odTggKm1lbSwgc2l6ZV90IHNpemUsIGludCBtLCBpbnQgdCwKKwkJCQlzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIpCiB7CiAJaW50IHR0YTsKIAlpbnQgd210YTsKQEAgLTE0OCwyNiArMTgxLDMxIEBACiAJaW50IHdmbV9pZHgsIG93Zm1faWR4OwogCWludCBtZW1faWR4ID0gMDsKIAlzdHJ1Y3Qgd2F2ZWZvcm1faGRyICp3Zm1faGRyOworCXU4ICptZXRyb21lbSA9IHBhci0+bWV0cm9tZW1fd2ZtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBhci0+aW5mby0+ZGV2OwogCi0JaWYgKHNpemUgIT0gRVhQX1dGT1JNX1NJWkUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogdW5leHBlY3RlZCBzaXplICVkICE9ICVkXG4iLCBzaXplLAotCQkJCQlFWFBfV0ZPUk1fU0laRSk7CisJaWYgKHVzZXJfd2ZtX3NpemUpCisJCWVwZF9mcmFtZV90YWJsZVtwYXItPmR0XS53Zm1fc2l6ZSA9IHVzZXJfd2ZtX3NpemU7CisKKwlpZiAoc2l6ZSAhPSBlcGRfZnJhbWVfdGFibGVbcGFyLT5kdF0ud2ZtX3NpemUpIHsKKwkJZGV2X2VycihkZXYsICJFcnJvcjogdW5leHBlY3RlZCBzaXplICVaZCAhPSAlZFxuIiwgc2l6ZSwKKwkJCQkJZXBkX2ZyYW1lX3RhYmxlW3Bhci0+ZHRdLndmbV9zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJd2ZtX2hkciA9IChzdHJ1Y3Qgd2F2ZWZvcm1faGRyICopIG1lbTsKIAogCWlmICh3Zm1faGRyLT5mdnNuICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogYmFkIGZ2c24gJXhcbiIsIHdmbV9oZHItPmZ2c24pOworCQlkZXZfZXJyKGRldiwgIkVycm9yOiBiYWQgZnZzbiAleFxuIiwgd2ZtX2hkci0+ZnZzbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAod2ZtX2hkci0+bHV0cyAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGJhZCBsdXRzICV4XG4iLCB3Zm1faGRyLT5sdXRzKTsKKwkJZGV2X2VycihkZXYsICJFcnJvcjogYmFkIGx1dHMgJXhcbiIsIHdmbV9oZHItPmx1dHMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJY2tzdW0gPSBjYWxjX2Nrc3VtKDMyLCA0NywgbWVtKTsKIAlpZiAoY2tzdW0gIT0gd2ZtX2hkci0+d2ZtX2NzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGJhZCBja3N1bSAleCAhPSAleFxuIiwgY2tzdW0sCisJCWRldl9lcnIoZGV2LCAiRXJyb3I6IGJhZCBja3N1bSAleCAhPSAleFxuIiwgY2tzdW0sCiAJCQkJCXdmbV9oZHItPndmbV9jcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3NSw3ICsyMTMsNyBAQAogCXdmbV9oZHItPnRyYyArPSAxOwogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJaWYgKCood2ZtX2hkci0+c3R1ZmYyYSArIGkpICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IHVuZXhwZWN0ZWQgdmFsdWUgaW4gcGFkZGluZ1xuIik7CisJCQlkZXZfZXJyKGRldiwgIkVycm9yOiB1bmV4cGVjdGVkIHZhbHVlIGluIHBhZGRpbmdcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDAsNyArMjM4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJY2tzdW0gPSBjYWxjX2Nrc3VtKHNpemVvZigqd2ZtX2hkciksIGNrc3VtX2lkeCwgbWVtKTsKIAlpZiAoY2tzdW0gIT0gbWVtW2Nrc3VtX2lkeF0pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogYmFkIHRlbXBlcmF0dXJlIHJhbmdlIHRhYmxlIGNrc3VtIgorCQlkZXZfZXJyKGRldiwgIkVycm9yOiBiYWQgdGVtcGVyYXR1cmUgcmFuZ2UgdGFibGUgY2tzdW0iCiAJCQkJIiAleCAhPSAleFxuIiwgY2tzdW0sIG1lbVtja3N1bV9pZHhdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjEyLDcgKzI1MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWNrc3VtID0gY2FsY19ja3N1bShja3N1bV9pZHggLSAzLCBja3N1bV9pZHgsIG1lbSk7CiAJaWYgKGNrc3VtICE9IG1lbVtja3N1bV9pZHhdKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGJhZCBtb2RlIHRhYmxlIGFkZHJlc3MgY2tzdW0iCisJCWRldl9lcnIoZGV2LCAiRXJyb3I6IGJhZCBtb2RlIHRhYmxlIGFkZHJlc3MgY2tzdW0iCiAJCQkJIiAleCAhPSAleFxuIiwgY2tzdW0sIG1lbVtja3N1bV9pZHhdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjI0LDcgKzI2Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWNrc3VtID0gY2FsY19ja3N1bShja3N1bV9pZHggLSAzLCBja3N1bV9pZHgsIG1lbSk7CiAJaWYgKGNrc3VtICE9IG1lbVtja3N1bV9pZHhdKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGJhZCB0ZW1wZXJhdHVyZSB0YWJsZSBhZGRyZXNzIGNrc3VtIgorCQlkZXZfZXJyKGRldiwgIkVycm9yOiBiYWQgdGVtcGVyYXR1cmUgdGFibGUgYWRkcmVzcyBja3N1bSIKIAkJCSIgJXggIT0gJXhcbiIsIGNrc3VtLCBtZW1bY2tzdW1faWR4XSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI1OSwxMSArMjk3LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCWNrc3VtID0gY2FsY19ja3N1bShvd2ZtX2lkeCwgY2tzdW1faWR4LCBtZW0pOwogCWlmIChja3N1bSAhPSBtZW1bY2tzdW1faWR4XSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBiYWQgd2F2ZWZvcm0gZGF0YSBja3N1bSIKKwkJZGV2X2VycihkZXYsICJFcnJvcjogYmFkIHdhdmVmb3JtIGRhdGEgY2tzdW0iCiAJCQkJIiAleCAhPSAleFxuIiwgY2tzdW0sIG1lbVtja3N1bV9pZHhdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCSpmcmFtZV9jb3VudCA9IChtZW1faWR4LzY0KTsKKwlwYXItPmZyYW1lX2NvdW50ID0gKG1lbV9pZHgvNjQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzQsMTUgKzMxMiwxMiBAQAogCXUxNiBjczsKIAl1MTYgb3Bjb2RlOwogCXN0YXRpYyB1OCBib3JkZXJ2YWw7Ci0JdTggKnB0cjsKIAogCS8qIHNldHVwIGRpc3BsYXkgY29tbWFuZAogCXdlIGNhbid0IGltbWVkaWF0ZWx5IHNldCB0aGUgb3Bjb2RlIHNpbmNlIHRoZSBjb250cm9sbGVyCiAJd2lsbCB0cnkgcGFyc2UgdGhlIGNvbW1hbmQgYmVmb3JlIHdlJ3ZlIHNldCBpdCBhbGwgdXAKIAlzbyB3ZSBqdXN0IHNldCBjcyBoZXJlIGFuZCBzZXQgdGhlIG9wY29kZSBhdCB0aGUgZW5kICovCiAKLQlwdHIgPSBwYXItPm1ldHJvbWVtOwotCiAJaWYgKHBhci0+bWV0cm9tZW1fY21kLT5vcGNvZGUgPT0gMHhDQzQwKQogCQlvcGNvZGUgPSBjcyA9IDB4Q0M0MTsKIAllbHNlCkBAIC0zMzUsNDQgKzM3MCwxNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtZXRyb25vbWVfY29uZmlnX2NtZChzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICpwYXIpCiB7Ci0JaW50IGk7Ci0JdTE2IGNzOwotCiAJLyogc2V0dXAgY29uZmlnIGNvbW1hbmQKIAl3ZSBjYW4ndCBpbW1lZGlhdGVseSBzZXQgdGhlIG9wY29kZSBzaW5jZSB0aGUgY29udHJvbGxlcgotCXdpbGwgdHJ5IHBhcnNlIHRoZSBjb21tYW5kIGJlZm9yZSB3ZSd2ZSBzZXQgaXQgYWxsIHVwCi0Jc28gd2UganVzdCBzZXQgY3MgaGVyZSBhbmQgc2V0IHRoZSBvcGNvZGUgYXQgdGhlIGVuZCAqLworCXdpbGwgdHJ5IHBhcnNlIHRoZSBjb21tYW5kIGJlZm9yZSB3ZSd2ZSBzZXQgaXQgYWxsIHVwICovCiAKLQljcyA9IDB4Q0MxMDsKLQotCS8qIHNldCB0aGUgMTIgYXJncyAoIDggYnl0ZXMgKSBmb3IgY29uZmlnLiBzZWUgc3BlYyBmb3IgbWVhbmluZ3MgKi8KLQlpID0gMDsKLQlwYXItPm1ldHJvbWVtX2NtZC0+YXJnc1tpXSA9IAkxNSAvKiBzZGxldyAqLwotCQkJCQl8IDIgPDwgOCAvKiBzZG9zeiAqLwotCQkJCQl8IDAgPDwgMTEgLyogc2RvciAqLwotCQkJCQl8IDAgPDwgMTIgLyogc2RjZXMgKi8KLQkJCQkJfCAwIDw8IDE1OyAvKiBzZGNlciAqLwotCWNzICs9IHBhci0+bWV0cm9tZW1fY21kLT5hcmdzW2krK107Ci0KLQlwYXItPm1ldHJvbWVtX2NtZC0+YXJnc1tpXSA9IAk0MiAvKiBnZHNwbCAqLwotCQkJCQl8IDEgPDwgOCAvKiBnZHIxICovCi0JCQkJCXwgMSA8PCA5IC8qIHNkc2hyICovCi0JCQkJCXwgMCA8PCAxNTsgLyogZ2RzcHAgKi8KLQljcyArPSBwYXItPm1ldHJvbWVtX2NtZC0+YXJnc1tpKytdOwotCi0JcGFyLT5tZXRyb21lbV9jbWQtPmFyZ3NbaV0gPSAJMTggLyogZ2RzcHcgKi8KLQkJCQkJfCAwIDw8IDE1OyAvKiBkaXNwYyAqLwotCWNzICs9IHBhci0+bWV0cm9tZW1fY21kLT5hcmdzW2krK107Ci0KLQlwYXItPm1ldHJvbWVtX2NtZC0+YXJnc1tpXSA9IAk1OTkgLyogdmRsYyAqLwotCQkJCQl8IDAgPDwgMTEgLyogZHNpICovCi0JCQkJCXwgMCA8PCAxMjsgLyogZHNpYyAqLwotCWNzICs9IHBhci0+bWV0cm9tZW1fY21kLT5hcmdzW2krK107Ci0KKwltZW1jcHkocGFyLT5tZXRyb21lbV9jbWQtPmFyZ3MsIGVwZF9mcmFtZV90YWJsZVtwYXItPmR0XS5jb25maWcsCisJCXNpemVvZihlcGRfZnJhbWVfdGFibGVbcGFyLT5kdF0uY29uZmlnKSk7CiAJLyogdGhlIHJlc3QgYXJlIDAgKi8KLQltZW1zZXQoKHU4ICopIChwYXItPm1ldHJvbWVtX2NtZC0+YXJncyArIGkpLCAwLCAoMzItaSkqMik7CisJbWVtc2V0KCh1OCAqKSAocGFyLT5tZXRyb21lbV9jbWQtPmFyZ3MgKyA0KSwgMCwgKDMyLTQpKjIpOwogCi0JcGFyLT5tZXRyb21lbV9jbWQtPmNzdW0gPSBjczsKKwlwYXItPm1ldHJvbWVtX2NtZC0+Y3N1bSA9IDB4Q0MxMDsKKwlwYXItPm1ldHJvbWVtX2NtZC0+Y3N1bSArPSBjYWxjX2ltZ19ja3N1bShwYXItPm1ldHJvbWVtX2NtZC0+YXJncywgNCk7CiAJcGFyLT5tZXRyb21lbV9jbWQtPm9wY29kZSA9IDB4Q0MxMDsgLyogY29uZmlnIGNtZCAqLwogCiAJcmV0dXJuIHBhci0+Ym9hcmQtPm1ldF93YWl0X2V2ZW50KHBhcik7CkBAIC00MDgsMTIgKzQxNiw5IEBACiB7CiAJaW50IHJlczsKIAotCXBhci0+Ym9hcmQtPmluaXRfZ3Bpb19yZWdzKHBhcik7Ci0KLQlwYXItPmJvYXJkLT5pbml0X2xjZGNfcmVncyhwYXIpOwotCi0JLyogbm93IHRoYXQgbGNkIGlzIHNldHVwLCBzZXR1cCBkbWEgZGVzY3JpcHRvciAqLwotCXBhci0+Ym9hcmQtPnBvc3RfZG1hX3NldHVwKHBhcik7CisJcmVzID0gcGFyLT5ib2FyZC0+c2V0dXBfaW8ocGFyKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOwogCiAJcmVzID0gbWV0cm9ub21lX3Bvd2VydXBfY21kKHBhcik7CiAJaWYgKHJlcykKQEAgLTQzMCwxNiArNDM1LDE2IEBACiAKIHN0YXRpYyB2b2lkIG1ldHJvbm9tZWZiX2RweV91cGRhdGUoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqcGFyKQogeworCWludCBmYnNpemU7CiAJdTE2IGNrc3VtOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9ICh1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilwYXItPmluZm8tPnNjcmVlbl9iYXNlOwogCisJZmJzaXplID0gcGFyLT5pbmZvLT5maXguc21lbV9sZW47CiAJLyogY29weSBmcm9tIHZtIHRvIG1ldHJvbWVtICovCi0JbWVtY3B5KHBhci0+bWV0cm9tZW1faW1nLCBidWYsIERQWV9XKkRQWV9IKTsKKwltZW1jcHkocGFyLT5tZXRyb21lbV9pbWcsIGJ1ZiwgZmJzaXplKTsKIAotCWNrc3VtID0gY2FsY19pbWdfY2tzdW0oKHUxNiAqKSBwYXItPm1ldHJvbWVtX2ltZywKLQkJCQkoZXBkX2ZyYW1lX3RhYmxlWzBdLmZ3ICogRFBZX0gpLzIpOwotCSooKHUxNiAqKShwYXItPm1ldHJvbWVtX2ltZykgKwotCQkJKGVwZF9mcmFtZV90YWJsZVswXS5mdyAqIERQWV9IKS8yKSA9IGNrc3VtOworCWNrc3VtID0gY2FsY19pbWdfY2tzdW0oKHUxNiAqKSBwYXItPm1ldHJvbWVtX2ltZywgZmJzaXplLzIpOworCSooKHUxNiAqKShwYXItPm1ldHJvbWVtX2ltZykgKyBmYnNpemUvMikgPSBja3N1bTsKIAltZXRyb25vbWVfZGlzcGxheV9jbWQocGFyKTsKIH0KIApAQCAtNTc0LDggKzU3OSwxMCBAQAogCXVuc2lnbmVkIGNoYXIgKnZpZGVvbWVtb3J5OwogCXN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhcjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OwotCWludCBjbWRfc2l6ZSwgd2ZtX3NpemUsIGltZ19zaXplLCBwYWRkaW5nX3NpemUsIHRvdGFsc2l6ZTsKIAlpbnQgaTsKKwlpbnQgcGFuZWxfdHlwZTsKKwlpbnQgZncsIGZoOworCWludCBlcGRfZHRfaW5kZXg7CiAKIAkvKiBwaWNrIHVwIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzICovCiAJYm9hcmQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtNTg2LDk2ICs1OTMsMTA4IEBACiAJaWYgKCF0cnlfbW9kdWxlX2dldChib2FyZC0+b3duZXIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG1ldHJvbm9tZWZiX3BhciksICZkZXYtPmRldik7CisJaWYgKCFpbmZvKQorCQlnb3RvIGVycjsKKwogCS8qIHdlIGhhdmUgdHdvIGJsb2NrcyBvZiBtZW1vcnkuCiAJaW5mby0+c2NyZWVuX2Jhc2Ugd2hpY2ggaXMgdm0sIGFuZCBpcyB0aGUgZmIgdXNlZCBieSBhcHBzLgogCXBhci0+bWV0cm9tZW0gd2hpY2ggaXMgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSBhbmQKIAljb250YWlucyB0aGUgZGlzcGxheSBjb250cm9sbGVyIGNvbW1hbmRzLCB3YXZlZm9ybSwKIAlwcm9jZXNzZWQgaW1hZ2UgZGF0YSBhbmQgcGFkZGluZy4gdGhpcyBpcyB0aGUgZGF0YSBwdWxsZWQKLQlieSB0aGUgZGV2aWNlJ3MgTENEIGNvbnRyb2xsZXIgYW5kIHB1c2hlZCB0byBNZXRyb25vbWUgKi8KKwlieSB0aGUgZGV2aWNlJ3MgTENEIGNvbnRyb2xsZXIgYW5kIHB1c2hlZCB0byBNZXRyb25vbWUuCisJdGhlIG1ldHJvbWVtIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnkgdGhlIGJvYXJkIGRyaXZlciBhbmQKKwlpcyBwcm92aWRlZCB0byB1cyAqLwogCi0JdmlkZW9tZW1vcnlzaXplID0gKERQWV9XKkRQWV9IKTsKKwlwYW5lbF90eXBlID0gYm9hcmQtPmdldF9wYW5lbF90eXBlKCk7CisJc3dpdGNoIChwYW5lbF90eXBlKSB7CisJY2FzZSA2OgorCQllcGRfZHRfaW5kZXggPSAwOworCQlicmVhazsKKwljYXNlIDg6CisJCWVwZF9kdF9pbmRleCA9IDE7CisJCWJyZWFrOworCWNhc2UgOTc6CisJCWVwZF9kdF9pbmRleCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiVW5leHBlY3RlZCBwYW5lbCB0eXBlLiBEZWZhdWx0aW5nIHRvIDZcbiIpOworCQllcGRfZHRfaW5kZXggPSAwOworCQlicmVhazsKKwl9CisKKwlmdyA9IGVwZF9mcmFtZV90YWJsZVtlcGRfZHRfaW5kZXhdLmZ3OworCWZoID0gZXBkX2ZyYW1lX3RhYmxlW2VwZF9kdF9pbmRleF0uZmg7CisKKwkvKiB3ZSBuZWVkIHRvIGFkZCBhIHNwYXJlIHBhZ2UgYmVjYXVzZSBvdXIgY3N1bSBjYWNoaW5nIHNjaGVtZSB3YWxrcworCSAqIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UgKi8KKwl2aWRlb21lbW9yeXNpemUgPSBQQUdFX1NJWkUgKyAoZncgKiBmaCk7CiAJdmlkZW9tZW1vcnkgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZSk7CiAJaWYgKCF2aWRlb21lbW9yeSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyX2ZiX3JlbDsKIAogCW1lbXNldCh2aWRlb21lbW9yeSwgMCwgdmlkZW9tZW1vcnlzaXplKTsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG1ldHJvbm9tZWZiX3BhciksICZkZXYtPmRldik7Ci0JaWYgKCFpbmZvKQotCQlnb3RvIGVycl92ZnJlZTsKLQogCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIgX19mb3JjZSBfX2lvbWVtICopdmlkZW9tZW1vcnk7CiAJaW5mby0+ZmJvcHMgPSAmbWV0cm9ub21lZmJfb3BzOwogCisJbWV0cm9ub21lZmJfZml4LmxpbmVfbGVuZ3RoID0gZnc7CisJbWV0cm9ub21lZmJfdmFyLnhyZXMgPSBmdzsKKwltZXRyb25vbWVmYl92YXIueXJlcyA9IGZoOworCW1ldHJvbm9tZWZiX3Zhci54cmVzX3ZpcnR1YWwgPSBmdzsKKwltZXRyb25vbWVmYl92YXIueXJlc192aXJ0dWFsID0gZmg7CiAJaW5mby0+dmFyID0gbWV0cm9ub21lZmJfdmFyOwogCWluZm8tPmZpeCA9IG1ldHJvbm9tZWZiX2ZpeDsKIAlpbmZvLT5maXguc21lbV9sZW4gPSB2aWRlb21lbW9yeXNpemU7CiAJcGFyID0gaW5mby0+cGFyOwogCXBhci0+aW5mbyA9IGluZm87CiAJcGFyLT5ib2FyZCA9IGJvYXJkOworCXBhci0+ZHQgPSBlcGRfZHRfaW5kZXg7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcGFyLT53YWl0cSk7CiAKIAkvKiB0aGlzIHRhYmxlIGNhY2hlcyBwZXIgcGFnZSBjc3VtIHZhbHVlcy4gKi8KIAlwYXItPmNzdW1fdGFibGUgPSB2bWFsbG9jKHZpZGVvbWVtb3J5c2l6ZS9QQUdFX1NJWkUpOwogCWlmICghcGFyLT5jc3VtX3RhYmxlKQotCQlnb3RvIGVycl9jc3VtX3RhYmxlOwotCi0JLyogdGhlIG1ldHJvbWVtIGJ1ZmZlciBpcyBkaXZpZGVkIGFzIGZvbGxvd3M6Ci0JY29tbWFuZCB8IENSQyB8IHBhZGRpbmcKLQkxNmtiIHdhdmVmb3JtIGRhdGEgfCBDUkMgfCBwYWRkaW5nCi0JaW1hZ2UgZGF0YSB8IENSQwotCWFuZCBhbiBleHRyYSAyNTYgYnl0ZXMgZm9yIGRtYSBkZXNjcmlwdG9ycwotCWVnOiBJVz04MzIgSUg9NjIyIFdTPTEyOAotCSovCi0KLQljbWRfc2l6ZSA9IDEgKiBlcGRfZnJhbWVfdGFibGVbMF0uZnc7Ci0Jd2ZtX3NpemUgPSAoKDE2KjEwMjQgKyAyICsgZXBkX2ZyYW1lX3RhYmxlWzBdLmZ3IC0gMSkKLQkJCS8gZXBkX2ZyYW1lX3RhYmxlWzBdLmZ3KSAqIGVwZF9mcmFtZV90YWJsZVswXS5mdzsKLQlpbWdfc2l6ZSA9IGVwZF9mcmFtZV90YWJsZVswXS5maCAqIGVwZF9mcmFtZV90YWJsZVswXS5mdzsKLQlwYWRkaW5nX3NpemUgPSA0ICogZXBkX2ZyYW1lX3RhYmxlWzBdLmZ3OwotCXRvdGFsc2l6ZSA9IGNtZF9zaXplICsgd2ZtX3NpemUgKyBpbWdfc2l6ZSArIHBhZGRpbmdfc2l6ZTsKLQlwYXItPm1ldHJvbWVtc2l6ZSA9IFBBR0VfQUxJR04odG90YWxzaXplICsgMjU2KTsKLQlEUFJJTlRLKCJkZXNpcmVkIG1lbW9yeSBzaXplID0gJWRcbiIsIHBhci0+bWV0cm9tZW1zaXplKTsKLQlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZ1bGw7Ci0JcGFyLT5tZXRyb21lbSA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoJmRldi0+ZGV2LCBwYXItPm1ldHJvbWVtc2l6ZSwKLQkJCQkJCSZwYXItPm1ldHJvbWVtX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXItPm1ldHJvbWVtKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIm1ldHJvbm9tZWZiOiB1bmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyX3ZmcmVlOworCisJLyogdGhlIHBoeXNpY2FsIGZyYW1lYnVmZmVyIHRoYXQgd2UgdXNlIGlzIHNldHVwIGJ5CisJICogdGhlIHBsYXRmb3JtIGRldmljZSBkcml2ZXIuIEl0IHdpbGwgcHJvdmlkZSB1cworCSAqIHdpdGggY21kLCB3Zm0gYW5kIGltYWdlIG1lbW9yeSBpbiBhIGNvbnRpZ3VvdXMgYXJlYS4gKi8KKwlyZXR2YWwgPSBib2FyZC0+c2V0dXBfZmIocGFyKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldHVwIGZiXG4iKTsKKwkJZ290byBlcnJfY3N1bV90YWJsZTsKKwl9CisKKwkvKiBhZnRlciB0aGlzIHBvaW50IHdlIHNob3VsZCBoYXZlIGEgZnJhbWVidWZmZXIgKi8KKwlpZiAoKCFwYXItPm1ldHJvbWVtX3dmbSkgfHwgICghcGFyLT5tZXRyb21lbV9pbWcpIHx8CisJCSghcGFyLT5tZXRyb21lbV9kbWEpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmIgYWNjZXNzIGZhaWx1cmVcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9jc3VtX3RhYmxlOwogCX0KIAogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGFyLT5tZXRyb21lbV9kbWE7Ci0JcGFyLT5tZXRyb21lbV9jbWQgPSAoc3RydWN0IG1ldHJvbWVtX2NtZCAqKSBwYXItPm1ldHJvbWVtOwotCXBhci0+bWV0cm9tZW1fd2ZtID0gcGFyLT5tZXRyb21lbSArIGNtZF9zaXplOwotCXBhci0+bWV0cm9tZW1faW1nID0gcGFyLT5tZXRyb21lbSArIGNtZF9zaXplICsgd2ZtX3NpemU7Ci0JcGFyLT5tZXRyb21lbV9pbWdfY3N1bSA9ICh1MTYgKikgKHBhci0+bWV0cm9tZW1faW1nICsKLQkJCQkJKGVwZF9mcmFtZV90YWJsZVswXS5mdyAqIERQWV9IKSk7Ci0JRFBSSU5USygiaW1nIG9mZnNldD0weCV4XG4iLCBjbWRfc2l6ZSArIHdmbV9zaXplKTsKLQlwYXItPm1ldHJvbWVtX2Rlc2MgPSAoc3RydWN0IG1ldHJvbWVtX2Rlc2MgKikgKHBhci0+bWV0cm9tZW0gKyBjbWRfc2l6ZQotCQkJCQkrIHdmbV9zaXplICsgaW1nX3NpemUgKyBwYWRkaW5nX3NpemUpOwotCXBhci0+bWV0cm9tZW1fZGVzY19kbWEgPSBwYXItPm1ldHJvbWVtX2RtYSArIGNtZF9zaXplICsgd2ZtX3NpemUKLQkJCQkgKyBpbWdfc2l6ZSArIHBhZGRpbmdfc2l6ZTsKIAogCS8qIGxvYWQgdGhlIHdhdmVmb3JtIGluLiBhc3N1bWUgbW9kZSAzLCB0ZW1wIDMxIGZvciBub3cKIAkJYSkgcmVxdWVzdCB0aGUgd2F2ZWZvcm0gZmlsZSBmcm9tIHVzZXJzcGFjZQogCQliKSBwcm9jZXNzIHdhdmVmb3JtIGFuZCBkZWNvZGUgaW50byBtZXRyb21lbSAqLwogCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAibWV0cm9ub21lLndiZiIsICZkZXYtPmRldik7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtZXRyb25vbWVmYjogY291bGRuJ3QgZ2V0IHdhdmVmb3JtXG4iKTsKLQkJZ290byBlcnJfZG1hX2ZyZWU7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCB3YXZlZm9ybVxuIik7CisJCWdvdG8gZXJyX2NzdW1fdGFibGU7CiAJfQogCi0JcmV0dmFsID0gbG9hZF93YXZlZm9ybSgodTggKikgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplLAotCQkJCXBhci0+bWV0cm9tZW1fd2ZtLCAzLCAzMSwgJnBhci0+ZnJhbWVfY291bnQpOworCXJldHZhbCA9IGxvYWRfd2F2ZWZvcm0oKHU4ICopIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSwgMywgMzEsCisJCQkJcGFyKTsKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm1ldHJvbm9tZWZiOiBjb3VsZG4ndCBwcm9jZXNzIHdhdmVmb3JtXG4iKTsKLQkJZ290byBlcnJfZG1hX2ZyZWU7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHByb2Nlc3Npbmcgd2F2ZWZvcm1cbiIpOworCQlnb3RvIGVycl9jc3VtX3RhYmxlOwogCX0KIAogCWlmIChib2FyZC0+c2V0dXBfaXJxKGluZm8pKQotCQlnb3RvIGVycl9kbWFfZnJlZTsKKwkJZ290byBlcnJfY3N1bV90YWJsZTsKIAogCXJldHZhbCA9IG1ldHJvbm9tZV9pbml0X3JlZ3MocGFyKTsKIAlpZiAocmV0dmFsIDwgMCkKQEAgLTY4OCw4ICs3MDcsOCBAQAogCiAJcmV0dmFsID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgOCwgMCk7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgY29sb3JtYXBcbiIpOwotCQlnb3RvIGVycl9mYl9yZWw7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbG9ybWFwXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCiAJLyogc2V0IGNtYXAgKi8KQEAgLTcwNCw3ICs3MjMsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKIAotCXByaW50ayhLRVJOX0lORk8KKwlkZXZfZGJnKCZkZXYtPmRldiwKIAkJImZiJWQ6IE1ldHJvbm9tZSBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlZEsgb2YgdmlkZW8iCiAJCSIgbWVtb3J5XG4iLCBpbmZvLT5ub2RlLCB2aWRlb21lbW9yeXNpemUgPj4gMTApOwogCkBAIC03MTIsMTcgKzczMSwxNSBAQAogCiBlcnJfY21hcDoKIAlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwotZXJyX2ZiX3JlbDoKLQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2ZyZWVfaXJxOgotCWJvYXJkLT5mcmVlX2lycShpbmZvKTsKLWVycl9kbWFfZnJlZToKLQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJmRldi0+ZGV2LCBwYXItPm1ldHJvbWVtc2l6ZSwgcGFyLT5tZXRyb21lbSwKLQkJCQlwYXItPm1ldHJvbWVtX2RtYSk7CisJYm9hcmQtPmNsZWFudXAocGFyKTsKIGVycl9jc3VtX3RhYmxlOgogCXZmcmVlKHBhci0+Y3N1bV90YWJsZSk7CiBlcnJfdmZyZWU6CiAJdmZyZWUodmlkZW9tZW1vcnkpOworZXJyX2ZiX3JlbDoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworZXJyOgogCW1vZHVsZV9wdXQoYm9hcmQtPm93bmVyKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNzMzLDE1ICs3NTAsMTUgQEAKIAogCWlmIChpbmZvKSB7CiAJCXN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKLQkJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKLQkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKCZkZXYtPmRldiwgcGFyLT5tZXRyb21lbXNpemUsCi0JCQkJCXBhci0+bWV0cm9tZW0sIHBhci0+bWV0cm9tZW1fZG1hKTsKLQkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKLQkJdmZyZWUocGFyLT5jc3VtX3RhYmxlKTsKKwogCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlmYl9kZWZlcnJlZF9pb19jbGVhbnVwKGluZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCQlwYXItPmJvYXJkLT5jbGVhbnVwKHBhcik7CisJCXZmcmVlKHBhci0+Y3N1bV90YWJsZSk7CiAJCXZmcmVlKCh2b2lkIF9fZm9yY2UgKilpbmZvLT5zY3JlZW5fYmFzZSk7Ci0JCXBhci0+Ym9hcmQtPmZyZWVfaXJxKGluZm8pOwogCQltb2R1bGVfcHV0KHBhci0+Ym9hcmQtPm93bmVyKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJjYWxsaW5nIHJlbGVhc2VcbiIpOwogCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCX0KIAlyZXR1cm4gMDsKQEAgLTc2Niw2ICs3ODMsOSBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtZXRyb25vbWVmYl9kcml2ZXIpOwogfQogCittb2R1bGVfcGFyYW0odXNlcl93Zm1fc2l6ZSwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZXJfd2ZtX3NpemUsICJTZXQgY3VzdG9tIHdhdmVmb3JtIHNpemUiKTsKKwogbW9kdWxlX2luaXQobWV0cm9ub21lZmJfaW5pdCk7CiBtb2R1bGVfZXhpdChtZXRyb25vbWVmYl9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9uZW9mYi5jIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCmluZGV4IDI1MTcyYjIuLmJmYjgwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKQEAgLTQyNiwxMSArNDI2LDExIEBACiB7CiAJdW5zaWduZWQgY2hhciB0bXA7CiAKKwl0bXAgPSB2Z2FfcnNlcShOVUxMLCAweDAxKTsKIAlpZiAob24pIHsKIAkJLyoKIAkJICogVHVybiBvZmYgc2NyZWVuIGFuZCBkaXNhYmxlIHNlcXVlbmNlci4KIAkJICovCi0JCXRtcCA9IHZnYV9yc2VxKE5VTEwsIDB4MDEpOwogCQl2Z2Ffd3NlcShOVUxMLCAweDAwLCAweDAxKTsJCS8qIFN5bmNocm9ub3VzIFJlc2V0ICovCiAJCXZnYV93c2VxKE5VTEwsIDB4MDEsIHRtcCB8IDB4MjApOwkvKiBkaXNhYmxlIHRoZSBkaXNwbGF5ICovCiAKQEAgLTQzOSw3ICs0MzksNiBAQAogCQkvKgogCQkgKiBSZWVuYWJsZSBzZXF1ZW5jZXIsIHRoZW4gdHVybiBvbiBzY3JlZW4uCiAJCSAqLwotCQl0bXAgPSB2Z2FfcnNlcShOVUxMLCAweDAxKTsKIAkJdmdhX3dzZXEoTlVMTCwgMHgwMSwgdG1wICYgfjB4MjApOwkvKiByZWVuYWJsZSBkaXNwbGF5ICovCiAJCXZnYV93c2VxKE5VTEwsIDB4MDAsIDB4MDMpOwkJLyogY2xlYXIgc3luY2hyb25vdXNyZXNldCAqLwogCkBAIC01NTgsMTQgKzU1NywxMiBAQAogewogCXN0cnVjdCBuZW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCW11dGV4X2xvY2soJnBhci0+b3Blbl9sb2NrKTsKIAlpZiAoIXBhci0+cmVmX2NvdW50KSB7CiAJCW1lbXNldCgmcGFyLT5zdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB2Z2FzdGF0ZSkpOwogCQlwYXItPnN0YXRlLmZsYWdzID0gVkdBX1NBVkVfTU9ERSB8IFZHQV9TQVZFX0ZPTlRTOwogCQlzYXZlX3ZnYSgmcGFyLT5zdGF0ZSk7CiAJfQogCXBhci0+cmVmX2NvdW50Kys7Ci0JbXV0ZXhfdW5sb2NrKCZwYXItPm9wZW5fbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU3NSwxNiArNTcyLDEzIEBACiB7CiAJc3RydWN0IG5lb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCi0JbXV0ZXhfbG9jaygmcGFyLT5vcGVuX2xvY2spOwotCWlmICghcGFyLT5yZWZfY291bnQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwYXItPm9wZW5fbG9jayk7CisJaWYgKCFwYXItPnJlZl9jb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCiAJaWYgKHBhci0+cmVmX2NvdW50ID09IDEpIHsKIAkJcmVzdG9yZV92Z2EoJnBhci0+c3RhdGUpOwogCX0KIAlwYXItPnJlZl9jb3VudC0tOwotCW11dGV4X3VubG9jaygmcGFyLT5vcGVuX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDgsMTAgKzY0MiwxMCBAQAogCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOwogCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7CiAKKwl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgkJLyogUFNFVURPQ09MT1VSLCAyNTYgKi8KLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKIAkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKIAkJdmFyLT5yZWQubGVuZ3RoID0gODsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwpAQCAtNjYxLDggKzY1NSw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSAxNjoJCS8qIERJUkVDVENPTE9VUiwgNjRrICovCi0JCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAJCXZhci0+cmVkLm9mZnNldCA9IDExOwogCQl2YXItPnJlZC5sZW5ndGggPSA1OwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CkBAIC02NzIsOCArNjY0LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIDI0OgkJLyogVFJVRUNPTE9VUiwgMTZtICovCi0JCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAJCXZhci0+cmVkLm9mZnNldCA9IDE2OwogCQl2YXItPnJlZC5sZW5ndGggPSA4OwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CkBAIC03MDQsOCArNjk0LDYgQEAKIAlpZiAodnJhbWxlbiA+IDQgKiAxMDI0ICogMTAyNCkKIAkJdnJhbWxlbiA9IDQgKiAxMDI0ICogMTAyNDsKIAotCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKLQkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CiAJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKQogCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKIApAQCAtNzIyLDggKzcxMCw2IEBACiAJICAgaWYgaXQgd2FzIHBvc3NpYmxlLiBXZSBzaG91bGQgcmV0dXJuIC1FSU5WQUwsIGJ1dCBJIGRpc2FncmVlICovCiAJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQogCQl2YXItPnlyZXMgPSB2YXItPnlyZXNfdmlydHVhbDsKLQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCi0JCXZhci0+eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsOwogCWlmICh2YXItPnhvZmZzZXQgKyB2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkKIAkJdmFyLT54b2Zmc2V0ID0gdmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXM7CiAJaWYgKHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKQpAQCAtMTE4Niw4ICsxMTcyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG5lb2ZiX3VwZGF0ZV9zdGFydChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKKy8qCisgKiAgICBQYW4gb3IgV3JhcCB0aGUgRGlzcGxheQorICovCitzdGF0aWMgaW50IG5lb2ZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbmVvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHZnYXN0YXRlICpzdGF0ZSA9ICZwYXItPnN0YXRlOwpAQCAtMTIxNiwzNSArMTIwNSw3IEBACiAJdmdhX3dnZngoc3RhdGUtPnZnYWJhc2UsIDB4MEUsICgoKEJhc2UgPj4gMTYpICYgMHgwZikgfCAob2xkRXh0Q1JURGlzcEFkZHIgJiAweGYwKSkpOwogCiAJbmVvTG9jayhzdGF0ZSk7Ci19CiAKLS8qCi0gKiAgICBQYW4gb3IgV3JhcCB0aGUgRGlzcGxheQotICovCi1zdGF0aWMgaW50IG5lb2ZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQl1X2ludCB5X2JvdHRvbTsKLQotCXlfYm90dG9tID0gdmFyLT55b2Zmc2V0OwotCi0JaWYgKCEodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSkKLQkJeV9ib3R0b20gKz0gdmFyLT55cmVzOwotCi0JaWYgKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh5X2JvdHRvbSA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbmVvZmJfdXBkYXRlX3N0YXJ0KGluZm8sIHZhcik7Ci0KLQlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKLQlpbmZvLT52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKLQotCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCi0JCWluZm8tPnZhci52bW9kZSB8PSBGQl9WTU9ERV9ZV1JBUDsKLQllbHNlCi0JCWluZm8tPnZhci52bW9kZSAmPSB+RkJfVk1PREVfWVdSQVA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTIsNyArMTk1Myw2IEBACiAKIAlpbmZvLT5maXguYWNjZWwgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKLQltdXRleF9pbml0KCZwYXItPm9wZW5fbG9jayk7CiAJcGFyLT5wY2lfYnVyc3QgPSAhbm9wY2lidXJzdDsKIAlwYXItPmxjZF9zdHJldGNoID0gIW5vc3RyZXRjaDsKIAlwYXItPmxpYnJldHRvID0gbGlicmV0dG87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCmluZGV4IDZlZmNmODkuLmRmYjcyZjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHsKLQl1MzIJCWJhc2U7CisJdm9pZCBfX2lvbWVtCSpiYXNlOwogCiAJc3RydWN0IG9tYXBmYl9tZW1fZGVzYwltZW1fZGVzYzsKIAlzdHJ1Y3QgcmVzbWFwCQkqcmVzX21hcFtESVNQQ19NRU1UWVBFX05VTV07CkBAIC0yMTIsOSArMjEyLDkgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7CiAKIAkvKiBTZXQgYnlwYXNzIG1vZGUgaW4gUkZCSSBtb2R1bGUgKi8KLQlsID0gX19yYXdfcmVhZGwoaW9fcDJ2KFJGQklfQ09OVFJPTCkpOworCWwgPSBfX3Jhd19yZWFkbChJT19BRERSRVNTKFJGQklfQ09OVFJPTCkpOwogCWwgfD0gZW5hYmxlID8gMCA6ICgxIDw8IDEpOwotCV9fcmF3X3dyaXRlbChsLCBpb19wMnYoUkZCSV9DT05UUk9MKSk7CisJX19yYXdfd3JpdGVsKGwsIElPX0FERFJFU1MoUkZCSV9DT05UUk9MKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9sY2RfZGF0YV9saW5lcyhpbnQgZGF0YV9saW5lcykKQEAgLTEzNDksMTQgKzEzNDksMTkgQEAKIAogCW1lbXNldCgmZGlzcGMsIDAsIHNpemVvZihkaXNwYykpOwogCi0JZGlzcGMuYmFzZSA9IGlvX3AydihESVNQQ19CQVNFKTsKKwlkaXNwYy5iYXNlID0gaW9yZW1hcChESVNQQ19CQVNFLCBTWl8xSyk7CisJaWYgKCFkaXNwYy5iYXNlKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgRElTUENcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlkaXNwYy5mYmRldiA9IGZiZGV2OwogCWRpc3BjLmV4dF9tb2RlID0gZXh0X21vZGU7CiAKIAlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOwogCiAJaWYgKChyID0gZ2V0X2Rzc19jbG9ja3MoKSkgPCAwKQotCQlyZXR1cm4gcjsKKwkJZ290byBmYWlsMDsKIAogCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDEpOwogCWVuYWJsZV9sY2RfY2xvY2tzKDEpOwpAQCAtMTQxNCw3ICsxNDE5LDcgQEAKIAl9CiAKIAkvKiBMMyBmaXJld2FsbCBzZXR0aW5nOiBlbmFibGUgYWNjZXNzIHRvIE9DTSBSQU0gKi8KLQlfX3Jhd193cml0ZWwoMHg0MDIwMDBiMCwgaW9fcDJ2KDB4NjgwMDUwYTApKTsKKwlfX3Jhd193cml0ZWwoMHg0MDIwMDBiMCwgSU9fQUREUkVTUygweDY4MDA1MGEwKSk7CiAKIAlpZiAoKHIgPSBhbGxvY19wYWxldHRlX3JhbSgpKSA8IDApCiAJCWdvdG8gZmFpbDI7CkBAIC0xNDY0LDcgKzE0NjksOCBAQAogCWVuYWJsZV9sY2RfY2xvY2tzKDApOwogCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDApOwogCXB1dF9kc3NfY2xvY2tzKCk7Ci0KK2ZhaWwwOgorCWlvdW5tYXAoZGlzcGMuYmFzZSk7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTE0ODEsNiArMTQ4Nyw3IEBACiAJZnJlZV9pcnEoSU5UXzI0WFhfRFNTX0lSUSwgZGlzcGMuZmJkZXYpOwogCWVuYWJsZV9pbnRlcmZhY2VfY2xvY2tzKDApOwogCXB1dF9kc3NfY2xvY2tzKCk7CisJaW91bm1hcChkaXNwYy5iYXNlKTsKIH0KIAogY29uc3Qgc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaAppbmRleCBlYjE1MTJiLi5lZjcyMGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvZGlzcGMuaApAQCAtNDAsNCArNDAsNiBAQAogZXh0ZXJuIGludCAgb21hcF9kaXNwY19yZXF1ZXN0X2lycSh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkIG9tYXBfZGlzcGNfZnJlZV9pcnEodm9pZCk7CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfaW50X2N0cmw7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jCmluZGV4IDg4YzE5ZDQuLjZmZjU2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGxjZF9wYW5lbCBoNF9wYW5lbCA9IHsKK3N0YXRpYyBzdHJ1Y3QgbGNkX3BhbmVsIGg0X3BhbmVsID0gewogCS5uYW1lCQk9ICJoNCIsCiAJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAogCkBAIC05MSw3ICs5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaDRfcGFuZWxfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaDRfcGFuZWxfZHJpdmVyID0gewogCS5wcm9iZQkJPSBoNF9wYW5lbF9wcm9iZSwKIAkucmVtb3ZlCQk9IGg0X3BhbmVsX3JlbW92ZSwKIAkuc3VzcGVuZAk9IGg0X3BhbmVsX3N1c3BlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCmluZGV4IDZhNDJjNmEuLjRjNGY3ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCkBAIC0zMiw0MyArMzIsNDMgQEAKIHsKIAlpbnQgciA9IDA7CiAKLQlpZiAob21hcF9yZXF1ZXN0X2dwaW8oMTQpKSB7CisJaWYgKGdwaW9fcmVxdWVzdCgxNCwgImxjZF9lbjAiKSkgewogCQlwcl9lcnIoTU9EVUxFX05BTUUgIjogY2FuJ3QgcmVxdWVzdCBHUElPIDE0XG4iKTsKIAkJciA9IC0xOwogCQlnb3RvIGV4aXQ7CiAJfQotCWlmIChvbWFwX3JlcXVlc3RfZ3BpbygxNSkpIHsKKwlpZiAoZ3Bpb19yZXF1ZXN0KDE1LCAibGNkX2VuMSIpKSB7CiAJCXByX2VycihNT0RVTEVfTkFNRSAiOiBjYW4ndCByZXF1ZXN0IEdQSU8gMTVcbiIpOwotCQlvbWFwX2ZyZWVfZ3BpbygxNCk7CisJCWdwaW9fZnJlZSgxNCk7CiAJCXIgPSAtMTsKIAkJZ290byBleGl0OwogCX0KIAkvKiBjb25maWd1cmUgR1BJTygxNCwgMTUpIGFzIG91dHB1dHMgKi8KLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigxNCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTUsIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dCgxNCwgMCk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDE1LCAwKTsKIGV4aXQ6CiAJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKIHsKLQlvbWFwX2ZyZWVfZ3BpbygxNSk7Ci0Jb21hcF9mcmVlX2dwaW8oMTQpOworCWdwaW9fZnJlZSgxNSk7CisJZ3Bpb19mcmVlKDE0KTsKIH0KIAogc3RhdGljIGludCBpbm5vdmF0b3IxNjEwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKIHsKIAkvKiBzZXQgR1BJTzE0IGFuZCBHUElPMTUgaGlnaCAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgxNCwgMSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE1LCAxKTsKKwlncGlvX3NldF92YWx1ZSgxNCwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoMTUsIDEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCiB7CiAJLyogc2V0IEdQSU8xMywgR1BJTzE0IGFuZCBHUElPMTUgbG93ICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE0LCAwKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTUsIDApOworCWdwaW9fc2V0X3ZhbHVlKDE0LCAwKTsKKwlncGlvX3NldF92YWx1ZSgxNSwgMCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlubm92YXRvcjE2MTBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwppbmRleCBhNGE3MjVmLi4zNzljOTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogc3RhdGljIGludCBvc2tfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQogeworCS8qIGdwaW8yIHdhcyBhbGxvY2F0ZWQgaW4gYm9hcmQgaW5pdCAqLwogCXJldHVybiAwOwogfQogCkBAIC00NywxMSArNDgsOCBAQAogCS8qIFNldCBQV0wgbGV2ZWwgKi8KIAlvbWFwX3dyaXRlYigweEZGLCBPTUFQX1BXTF9FTkFCTEUpOwogCi0JLyogY29uZmlndXJlIEdQSU8yIGFzIG91dHB1dCAqLwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDIsIDApOwotCi0JLyogc2V0IEdQSU8yIGhpZ2ggKi8KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMiwgMSk7CisJLyogc2V0IEdQSU8yIGhpZ2ggKGxjZCBwb3dlciBlbmFibGVkKSAqLworCWdwaW9fc2V0X3ZhbHVlKDIsIDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NSw3ICs2Myw3IEBACiAJb21hcF93cml0ZWIoMHgwMCwgT01BUF9QV0xfQ0xLX0VOQUJMRSk7CiAKIAkvKiBzZXQgR1BJTzIgbG93ICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDIsIDApOworCWdwaW9fc2V0X3ZhbHVlKDIsIDApOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvc2tfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9zeDEuYwppbmRleCBjYWE2YTg5Li5lNTVkZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfc3gxLmMKQEAgLTgxLDIxICs4MSwyMSBAQAogCWludCBpLCBzaGlmdGVyID0gMHg4MDsKIAogCWlmICghZmxhZykKLQkJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDApOworCQlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0EwLCAwKTsKIAltZGVsYXkoMik7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19SRCwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoQV9MQ0RfU1NDX1JELCAxKTsKIAotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIGZsYWcpOworCWdwaW9fc2V0X3ZhbHVlKEFfTENEX1NTQ19TRCwgZmxhZyk7CiAKIAlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOwogCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMik7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOwotCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCBzaGlmdGVyICYgYnl0ZSk7CisJCWdwaW9fc2V0X3ZhbHVlKEFfTENEX1NTQ19TRCwgc2hpZnRlciAmIGJ5dGUpOwogCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDIpOwogCQlzaGlmdGVyID4+PSAxOwogCX0KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19BMCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfc3lzdGVtKHZvaWQpCkBAIC0xMDcsMjUgKzEwNywxOCBAQAogc3RhdGljIHZvaWQgc2V0dXBfR1BJTyh2b2lkKQogewogCS8qIG5ldyB3YXZlICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oQV9MQ0RfU1NDX1JEKTsKLQlvbWFwX3JlcXVlc3RfZ3BpbyhBX0xDRF9TU0NfU0QpOwotCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9SRVNFVCk7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1NTQ19DUyk7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oX0FfTENEX1NTQ19BMCk7CisJZ3Bpb19yZXF1ZXN0KEFfTENEX1NTQ19SRCwgImxjZF9zc2NfcmQiKTsKKwlncGlvX3JlcXVlc3QoQV9MQ0RfU1NDX1NELCAibGNkX3NzY19zZCIpOworCWdwaW9fcmVxdWVzdChfQV9MQ0RfUkVTRVQsICJsY2RfcmVzZXQiKTsKKwlncGlvX3JlcXVlc3QoX0FfTENEX1NTQ19DUywgImxjZF9zc2NfY3MiKTsKKwlncGlvX3JlcXVlc3QoX0FfTENEX1NTQ19BMCwgImxjZF9zc2NfYTAiKTsKIAotCS8qIHNldCBhbGwgR1BJT3MgdG8gb3V0cHV0ICovCi0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oQV9MQ0RfU1NDX1JELCAwKTsKLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihBX0xDRF9TU0NfU0QsIDApOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKF9BX0xDRF9SRVNFVCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19DUywgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1NTQ19BMCwgMCk7Ci0KLQkvKiBzZXQgR1BJTyBkYXRhICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19SRCwgMSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAxKTsKKwkvKiBzZXQgR1BJT3MgdG8gb3V0cHV0LCB3aXRoIGluaXRpYWwgZGF0YSAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChBX0xDRF9TU0NfUkQsIDEpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChBX0xDRF9TU0NfU0QsIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChfQV9MQ0RfUkVTRVQsIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoX0FfTENEX1NTQ19BMCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc3BsYXlfaW5pdCh2b2lkKQpAQCAtMTM5LDYxICsxMzIsNjEgQEAKIAltZGVsYXkoMik7CiAKIAkvKiByZXNldCBMQ0QgKi8KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCAxKTsKKwlncGlvX3NldF92YWx1ZShBX0xDRF9TU0NfU0QsIDEpOwogCWVwc29uX3NlbmRieXRlKDAsIDB4MjUpOwogCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1JFU0VULCAwKTsKIAltZGVsYXkoMTApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfUkVTRVQsIDEpOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9SRVNFVCwgMSk7CiAKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CiAJbWRlbGF5KDIpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENELCBwaGFzZSAxICovCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQSk7CiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMVtpXSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAxKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENEIHBoYXNlIDIgKi8KIAllcHNvbl9zZW5kYnl0ZSgwLCAweENCKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTI1OyBpKyspCiAJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfMltpXSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAxKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENEIHBoYXNlIDJhICovCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHhDQyk7CiAJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCiAJCWVwc29uX3NlbmRieXRlKDEsIElOSVRfM1tpXSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAxKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENEIHBoYXNlIDMgKi8KIAllcHNvbl9zZW5kYnl0ZSgwLCAweEJDKTsKIAllcHNvbl9zZW5kYnl0ZSgxLCAweDA4KTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9TU0NfQ1MsIDEpOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9TU0NfQ1MsIDApOwogCiAJLyogaW5pdCBMQ0QgcGhhc2UgNCAqLwogCWVwc29uX3NlbmRieXRlKDAsIDB4MDcpOwogCWVwc29uX3NlbmRieXRlKDEsIDB4MDUpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMCk7CiAKIAkvKiBpbml0IExDRCBwaGFzZSA1ICovCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAxKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENEIHBoYXNlIDYgKi8KIAllcHNvbl9zZW5kYnl0ZSgwLCAweEM2KTsKIAllcHNvbl9zZW5kYnl0ZSgxLCAweDgwKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CiAJbWRlbGF5KDEwMCk7IC8qIHVzZWQgdG8gYmUgMTAwMCAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKwlncGlvX3NldF92YWx1ZShfQV9MQ0RfU1NDX0NTLCAwKTsKIAogCS8qIGluaXQgTENEIHBoYXNlIDcgKi8KIAllcHNvbl9zZW5kYnl0ZSgwLCAweDE2KTsKQEAgLTIwMSw4ICsxOTQsOCBAQAogCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOwogCWVwc29uX3NlbmRieXRlKDEsIDB4QjEpOwogCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMCk7CiAKIAkvKiBpbml0IExDRCBwaGFzZSA4ICovCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHg3Nik7CkBAIC0yMTAsMTIgKzIwMywxMiBAQAogCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOwogCWVwc29uX3NlbmRieXRlKDEsIDB4REIpOwogCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMCk7CiAKIAkvKiBpbml0IExDRCBwaGFzZSA5ICovCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHhBRik7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9TU0NfQ1MsIDEpOwogfQogCiBzdGF0aWMgaW50IHN4MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCkBAIC0yMzEsMTggKzIyNCwxOCBAQAogewogCXByaW50ayhLRVJOX0lORk8gIlNYMTogTENEIHBhbmVsIGRpc2FibGVcbiIpOwogCXN4MV9zZXRtbWlwb3dlcigwKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CiAKIAllcHNvbl9zZW5kYnl0ZSgwLCAweDI1KTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMCk7CiAKIAllcHNvbl9zZW5kYnl0ZSgwLCAweEFFKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJZ3Bpb19zZXRfdmFsdWUoX0FfTENEX1NTQ19DUywgMSk7CiAJbWRlbGF5KDEwMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9TU0NfQ1MsIDApOwogCiAJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCWdwaW9fc2V0X3ZhbHVlKF9BX0xDRF9TU0NfQ1MsIDEpOwogfQogCiBzdGF0aWMgaW50IHN4MV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwppbmRleCA4MzUxNGYwLi42ZTJlYTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKQEAgLTM0LDYgKzM0LDggQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlICJsY2RjLmgiCisKICNkZWZpbmUgTU9EVUxFX05BTUUJCQkibGNkYyIKIAogI2RlZmluZSBPTUFQX0xDRENfQkFTRQkJCTB4ZmZmZWMwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oCmluZGV4IGFkYjczMWU1Li44NDUyMjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKQEAgLTQsNCArNCw2IEBACiBpbnQgb21hcF9sY2RjX3NldF9kbWFfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CiB2b2lkIG9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjayh2b2lkKTsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBsY2RfY3RybCBvbWFwMV9pbnRfY3RybDsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCmluZGV4IDUxYTEzOGIuLjVhNWU0MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0zMSwxMSArMzEsMTQgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvb21hcGZiLmg+CiAKKyNpbmNsdWRlICJsY2RjLmgiCisjaW5jbHVkZSAiZGlzcGMuaCIKKwogI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiIgogCiBzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9hY2NlbDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nCWRlZl92cmFtW09NQVBGQl9QTEFORV9OVU1dOwotc3RhdGljIGludAkJZGVmX3ZyYW1fY250Oworc3RhdGljIHVuc2lnbmVkIGludAlkZWZfdnJhbV9jbnQ7CiBzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnhyZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnlyZXM7CiBzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9yb3RhdGU7CkBAIC04NCwxMiArODcsMTAgQEAKICAqIExDRCBwYW5lbAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWV4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDFfaW50X2N0cmw7Ci1leHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsOwogZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBod2E3NDJfY3RybDsKIGV4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgYmxpenphcmRfY3RybDsKIAotc3RhdGljIHN0cnVjdCBsY2RfY3RybCAqY3RybHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgKmN0cmxzW10gPSB7CiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKIAkmb21hcDFfaW50X2N0cmwsCiAjZWxzZQpAQCAtNzQwLDcgKzc0MSw3IEBACiAJaW50IHJldDsKIAogCW9tYXBmYl9ycXVldWVfbG9jayhwbGFuZS0+ZmJkZXYpOwotCXJldCA9IG9tYXBmYl91cGRhdGVfd2luZG93X2FzeW5jKGZiaSwgd2luLCBOVUxMLCAwKTsKKwlyZXQgPSBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhmYmksIHdpbiwgTlVMTCwgTlVMTCk7CiAJb21hcGZiX3JxdWV1ZV91bmxvY2socGxhbmUtPmZiZGV2KTsKIAogCXJldHVybiByZXQ7CkBAIC03NjgsNyArNzY5LDcgQEAKIAl3aW4uZm9ybWF0ID0gMDsKIAogCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7Ci0JciA9IGZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiaSwgJndpbiwgTlVMTCwgMCk7CisJciA9IGZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiaSwgJndpbiwgTlVMTCwgTlVMTCk7CiAJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOwogCiAJcmV0dXJuIHI7CkBAIC0xMDQ3LDcgKzEwNDgsNyBAQAogCQl3aW4uaGVpZ2h0ID0gMjsKIAkJd2luLm91dF93aWR0aCA9IDI7CiAJCXdpbi5vdXRfaGVpZ2h0ID0gMjsKLQkJZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJkZXYtPmZiX2luZm9bMF0sICZ3aW4sIE5VTEwsIDApOworCQlmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmRldi0+ZmJfaW5mb1swXSwgJndpbiwgTlVMTCwgTlVMTCk7CiAJfQogCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jCmluZGV4IDRhNmYxM2QuLmExM2M4ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpAQCAtNTksNyArNTksNyBAQAogI2RlZmluZSBESVNQQ19DT05UUk9MCQkweDAwNDAKIAogc3RhdGljIHN0cnVjdCB7Ci0JdTMyCQliYXNlOworCXZvaWQgX19pb21lbQkqYmFzZTsKIAl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOwogCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CiAJdW5zaWduZWQgbG9uZwlsNF9raHo7CkBAIC01MTgsNyArNTE4LDExIEBACiAJaW50IHI7CiAKIAlyZmJpLmZiZGV2ID0gZmJkZXY7Ci0JcmZiaS5iYXNlID0gaW9fcDJ2KFJGQklfQkFTRSk7CisJcmZiaS5iYXNlID0gaW9yZW1hcChSRkJJX0JBU0UsIFNaXzFLKTsKKwlpZiAoIXJmYmkuYmFzZSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjYW4ndCBpb3JlbWFwIFJGQklcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpZiAoKHIgPSByZmJpX2dldF9jbG9ja3MoKSkgPCAwKQogCQlyZXR1cm4gcjsKQEAgLTU2Niw2ICs1NzAsNyBAQAogewogCW9tYXBfZGlzcGNfZnJlZV9pcnEoKTsKIAlyZmJpX3B1dF9jbG9ja3MoKTsKKwlpb3VubWFwKHJmYmkuYmFzZSk7CiB9CiAKIGNvbnN0IHN0cnVjdCBsY2RfY3RybF9leHRpZiBvbWFwMl9leHRfaWYgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCmluZGV4IDYzNTkzNTMuLmE3Njk0NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCkBAIC01NzQsNyArNTc0LDEyIEBACiAJc3RydWN0IGNsayAqZHBsbDFvdXRfY2s7CiAJaW50IHI7CiAKLQlzb3NzaS5iYXNlID0gKHZvaWQgX19pb21lbSAqKUlPX0FERFJFU1MoT01BUF9TT1NTSV9CQVNFKTsKKwlzb3NzaS5iYXNlID0gaW9yZW1hcChPTUFQX1NPU1NJX0JBU0UsIFNaXzFLKTsKKwlpZiAoIXNvc3NpLmJhc2UpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgaW9yZW1hcCBTb1NTSVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCXNvc3NpLmZiZGV2ID0gZmJkZXY7CiAJc3Bpbl9sb2NrX2luaXQoJnNvc3NpLmxvY2spOwogCkBAIC02NjUsNiArNjcwLDcgQEAKIHsKIAlvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2soKTsKIAljbGtfcHV0KHNvc3NpLmZjayk7CisJaW91bm1hcChzb3NzaS5iYXNlKTsKIH0KIAogc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAxX2V4dF9pZiA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcDkxMDAuYyBiL2RyaXZlcnMvdmlkZW8vcDkxMDAuYwppbmRleCA5ZTkwMzQ1Li43MDAwZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMKKysrIGIvZHJpdmVycy92aWRlby9wOTEwMC5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcDkxMDBfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHA5MTAwX21hdGNoW10gPSB7CiAJewogCQkubmFtZSA9ICJwOTEwMCIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczFkMTN4eHhmYi5jIGIvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKaW5kZXggYjgyOWRjNy4uYTdiMDFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMKQEAgLTUwLDYgKzUwLDExIEBACiAjZGVmaW5lIGRiZyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCitzdGF0aWMgY29uc3QgaW50IF9fZGV2aW5pdGNvbnN0IHMxZDEzeHh4ZmJfcmV2aXNpb25zW10gPSB7CisJUzFEMTM1MDZfQ0hJUF9SRVYsCS8qIFJldi40IG9uIEhQIEpvcm5hZGEgN3h4IFMxRDEzNTA2ICovCisJUzFEMTM4MDZfQ0hJUF9SRVYsCS8qIFJldi43IG9uIC4uICovCit9OworCiAvKgogICogSGVyZSB3ZSBkZWZpbmUgdGhlIGRlZmF1bHQgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvCiAgKi8KQEAgLTUzOCw2ICs1NDMsNyBAQAogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhICpwZGF0YSA9IE5VTEw7CiAJaW50IHJldCA9IDA7CisJaW50IGk7CiAJdTggcmV2aXNpb247CiAKIAlkYmcoInByb2JlIGNhbGxlZDogZGV2aWNlIGlzICVwXG4iLCBwZGV2KTsKQEAgLTYwNywxMCArNjEzLDE5IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlyZXZpc2lvbiA9IHMxZDEzeHh4ZmJfcmVhZHJlZyhkZWZhdWx0X3BhciwgUzFEUkVHX1JFVl9DT0RFKTsKLQlpZiAoKHJldmlzaW9uID4+IDIpICE9IFMxRF9DSElQX1JFVikgewotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiY2hpcCBub3QgZm91bmQ6ICVpXG4iLCAocmV2aXNpb24gPj4gMikpOwotCQlyZXQgPSAtRU5PREVWOworCXJldmlzaW9uID0gczFkMTN4eHhmYl9yZWFkcmVnKGRlZmF1bHRfcGFyLCBTMURSRUdfUkVWX0NPREUpID4+IDI7CisKKwlyZXQgPSAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9yZXZpc2lvbnMpOyBpKyspIHsKKwkJaWYgKHJldmlzaW9uID09IHMxZDEzeHh4ZmJfcmV2aXNpb25zW2ldKQorCQkJcmV0ID0gMDsKKwl9CisKKwlpZiAoIXJldCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNoaXAgcmV2aXNpb24gJWlcbiIsIHJldmlzaW9uKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInVua25vd24gY2hpcCByZXZpc2lvbiAlaVxuIiwgcmV2aXNpb24pOwogCQlnb3RvIGJhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RjeC5jIGIvZHJpdmVycy92aWRlby90Y3guYwppbmRleCAyYTAzZjc4Li42NDNhZmJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90Y3guYworKysgYi9kcml2ZXJzL3ZpZGVvL3RjeC5jCkBAIC01MDUsNyArNTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGN4X21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0Y3hfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gIlNVTlcsdGN4IiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90ZGZ4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdGRmeGZiLmMKaW5kZXggNDU5OWE0My4uMTRiZDNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90ZGZ4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RkZnhmYi5jCkBAIC0xMTk1LDU3ICsxMTk1LDU4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZGVmYXVsdF9wYXIgPSBpbmZvLT5wYXI7CisJaW5mby0+Zml4ID0gdGRmeF9maXg7CiAKIAkvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgZmJfZml4X3NjcmVlbmluZm8gZmlyc3QgKi8KIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF8zREZYX0JBTlNIRUU6Ci0JCXN0cmNweSh0ZGZ4X2ZpeC5pZCwgIjNEZnggQmFuc2hlZSIpOworCQlzdHJjcHkoaW5mby0+Zml4LmlkLCAiM0RmeCBCYW5zaGVlIik7CiAJCWRlZmF1bHRfcGFyLT5tYXhfcGl4Y2xvY2sgPSBCQU5TSEVFX01BWF9QSVhDTE9DSzsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEXzNERlhfVk9PRE9PMzoKLQkJc3RyY3B5KHRkZnhfZml4LmlkLCAiM0RmeCBWb29kb28zIik7CisJCXN0cmNweShpbmZvLT5maXguaWQsICIzRGZ4IFZvb2RvbzMiKTsKIAkJZGVmYXVsdF9wYXItPm1heF9waXhjbG9jayA9IFZPT0RPTzNfTUFYX1BJWENMT0NLOwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET081OgotCQlzdHJjcHkodGRmeF9maXguaWQsICIzRGZ4IFZvb2RvbzUiKTsKKwkJc3RyY3B5KGluZm8tPmZpeC5pZCwgIjNEZnggVm9vZG9vNSIpOwogCQlkZWZhdWx0X3Bhci0+bWF4X3BpeGNsb2NrID0gVk9PRE9PNV9NQVhfUElYQ0xPQ0s7CiAJCWJyZWFrOwogCX0KIAotCXRkZnhfZml4Lm1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JdGRmeF9maXgubW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHRkZnhfZml4Lm1taW9fc3RhcnQsIHRkZnhfZml4Lm1taW9fbGVuLAorCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWluZm8tPmZpeC5tbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbiwKIAkJCQkidGRmeCByZWdiYXNlIikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0ZGZ4ZmI6IENhbid0IHJlc2VydmUgcmVnYmFzZVxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlkZWZhdWx0X3Bhci0+cmVnYmFzZV92aXJ0ID0KLQkJaW9yZW1hcF9ub2NhY2hlKHRkZnhfZml4Lm1taW9fc3RhcnQsIHRkZnhfZml4Lm1taW9fbGVuKTsKKwkJaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5tbWlvX3N0YXJ0LCBpbmZvLT5maXgubW1pb19sZW4pOwogCWlmICghZGVmYXVsdF9wYXItPnJlZ2Jhc2VfdmlydCkgewogCQlwcmludGsoS0VSTl9FUlIgImZiOiBDYW4ndCByZW1hcCAlcyByZWdpc3RlciBhcmVhLlxuIiwKLQkJCQl0ZGZ4X2ZpeC5pZCk7CisJCQkJaW5mby0+Zml4LmlkKTsKIAkJZ290byBvdXRfZXJyX3JlZ2Jhc2U7CiAJfQogCi0JdGRmeF9maXguc21lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKLQl0ZGZ4X2ZpeC5zbWVtX2xlbiA9IGRvX2xmYl9zaXplKGRlZmF1bHRfcGFyLCBwZGV2LT5kZXZpY2UpOwotCWlmICghdGRmeF9maXguc21lbV9sZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYjogQ2FuJ3QgY291bnQgJXMgbWVtb3J5LlxuIiwgdGRmeF9maXguaWQpOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWluZm8tPmZpeC5zbWVtX2xlbiA9IGRvX2xmYl9zaXplKGRlZmF1bHRfcGFyLCBwZGV2LT5kZXZpY2UpOworCWlmICghaW5mby0+Zml4LnNtZW1fbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmI6IENhbid0IGNvdW50ICVzIG1lbW9yeS5cbiIsIGluZm8tPmZpeC5pZCk7CiAJCWdvdG8gb3V0X2Vycl9yZWdiYXNlOwogCX0KIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHRkZnhfZml4LnNtZW1fc3RhcnQsCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsCiAJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgInRkZnggc21lbSIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidGRmeGZiOiBDYW4ndCByZXNlcnZlIHNtZW1cbiIpOwogCQlnb3RvIG91dF9lcnJfcmVnYmFzZTsKIAl9CiAKLQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSh0ZGZ4X2ZpeC5zbWVtX3N0YXJ0LAotCQkJCQkgICAgdGRmeF9maXguc21lbV9sZW4pOworCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGluZm8tPmZpeC5zbWVtX3N0YXJ0LAorCQkJCQkgICAgaW5mby0+Zml4LnNtZW1fbGVuKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZmI6IENhbid0IHJlbWFwICVzIGZyYW1lYnVmZmVyLlxuIiwKLQkJCQl0ZGZ4X2ZpeC5pZCk7CisJCQkJaW5mby0+Zml4LmlkKTsKIAkJZ290byBvdXRfZXJyX3NjcmVlbmJhc2U7CiAJfQogCkBAIC0xMjU3LDIwICsxMjU4LDE5IEBACiAJCWdvdG8gb3V0X2Vycl9zY3JlZW5iYXNlOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gImZiOiAlcyBtZW1vcnkgPSAlZEtcbiIsIHRkZnhfZml4LmlkLAotCQkJdGRmeF9maXguc21lbV9sZW4gPj4gMTApOworCXByaW50ayhLRVJOX0lORk8gImZiOiAlcyBtZW1vcnkgPSAlZEtcbiIsIGluZm8tPmZpeC5pZCwKKwkJCWluZm8tPmZpeC5zbWVtX2xlbiA+PiAxMCk7CiAKIAlkZWZhdWx0X3Bhci0+bXRycl9oYW5kbGUgPSAtMTsKIAlpZiAoIW5vbXRycikKIAkJZGVmYXVsdF9wYXItPm10cnJfaGFuZGxlID0KLQkJCW10cnJfYWRkKHRkZnhfZml4LnNtZW1fc3RhcnQsIHRkZnhfZml4LnNtZW1fbGVuLAorCQkJbXRycl9hZGQoaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbiwKIAkJCQkgTVRSUl9UWVBFX1dSQ09NQiwgMSk7CiAKLQl0ZGZ4X2ZpeC55cGFuc3RlcAk9IG5vcGFuID8gMCA6IDE7Ci0JdGRmeF9maXgueXdyYXBzdGVwCT0gbm93cmFwID8gMCA6IDE7CisJaW5mby0+Zml4LnlwYW5zdGVwCT0gbm9wYW4gPyAwIDogMTsKKwlpbmZvLT5maXgueXdyYXBzdGVwCT0gbm93cmFwID8gMCA6IDE7CiAKIAlpbmZvLT5mYm9wcwkJPSAmdGRmeGZiX29wczsKLQlpbmZvLT5maXgJCT0gdGRmeF9maXg7CiAJaW5mby0+cHNldWRvX3BhbGV0dGUJPSBkZWZhdWx0X3Bhci0+cGFsZXR0ZTsKIAlpbmZvLT5mbGFncwkJPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU47CiAjaWZkZWYgQ09ORklHX0ZCXzNERlhfQUNDRUwKQEAgLTEzMjMsMTQgKzEzMjMsMTQgQEAKIG91dF9lcnJfc2NyZWVuYmFzZToKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbih0ZGZ4X2ZpeC5zbWVtX3N0YXJ0LCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOwogb3V0X2Vycl9yZWdiYXNlOgogCS8qCiAJICogQ2xlYW51cCBhZnRlciBhbnl0aGluZyB0aGF0IHdhcyByZW1hcHBlZC9hbGxvY2F0ZWQuCiAJICovCiAJaWYgKGRlZmF1bHRfcGFyLT5yZWdiYXNlX3ZpcnQpCiAJCWlvdW5tYXAoZGVmYXVsdF9wYXItPnJlZ2Jhc2VfdmlydCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHRkZnhfZml4Lm1taW9fc3RhcnQsIHRkZnhfZml4Lm1taW9fbGVuKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CiBvdXRfZXJyOgogCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAJcmV0dXJuIC1FTlhJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdG1pb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RtaW9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzgwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3RtaW9mYi5jCkBAIC0wLDAgKzEsMTA1MCBAQAorLyoKKyAqIEZyYW1lIEJ1ZmZlciBEZXZpY2UgZm9yIFRvc2hpYmEgTW9iaWxlIElPKFRNSU8pIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2IENocmlzIEh1bWJlcnQKKyAqIENvcHlyaWdodChDKSAyMDA1IERpcmsgT3BmZXIKKyAqIENvcHl0aWdodChDKSAyMDA3LDIwMDggRG1pdHJ5IEJhcnlzaGtvdgorICoKKyAqIEJhc2VkIG9uOgorICoJZHJpdmVycy92aWRlby93MTAwZmIuYworICoJY29kZSB3cml0dGVuIGJ5IFNoYXJwL0xpbmVvIGZvciAyLjQga2VybmVscworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorLyogV2h5IHNob3VsZCBmYiBkcml2ZXIgY2FsbCBjb25zb2xlIGZ1bmN0aW9ucz8gYmVjYXVzZSBhY3F1aXJlX2NvbnNvbGVfc2VtKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworLyoKKyAqIGFjY2VsZXJhdG9yIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgVE1JT0ZCX0FDQ19DU0FEUih4KQkoMHgwMDAwMDAwMCB8ICgoeCkgJiAweDAwMWZmZmZlKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19DSFBJWCh4KQkoMHgwMTAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19DVlBJWCh4KQkoMHgwMjAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QU0FEUih4KQkoMHgwMzAwMDAwMCB8ICgoeCkgJiAweDAwZmZmZmZlKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QSFBJWCh4KQkoMHgwNDAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QVlBJWCh4KQkoMHgwNTAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QSE9GUyh4KQkoMHgwNjAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QVk9GUyh4KQkoMHgwNzAwMDAwMCB8ICgoeCkgJiAweDAwMDAwM2ZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19QT0FEUih4KQkoMHgwODAwMDAwMCB8ICgoeCkgJiAweDAwZmZmZmZlKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19SU1RSKHgpCSgweDA5MDAwMDAwIHwgKCh4KSAmIDB4MDAwMDAwZmYpKQorI2RlZmluZSBUTUlPRkJfQUNDX1RDTE9SKHgpCSgweDBBMDAwMDAwIHwgKCh4KSAmIDB4MDAwMGZmZmYpKQorI2RlZmluZSBUTUlPRkJfQUNDX0ZJTEwoeCkJKDB4MEIwMDAwMDAgfCAoKHgpICYgMHgwMDAwZmZmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfRFNBRFIoeCkJKDB4MEMwMDAwMDAgfCAoKHgpICYgMHgwMGZmZmZmZSkpCisjZGVmaW5lIFRNSU9GQl9BQ0NfU1NBRFIoeCkJKDB4MEQwMDAwMDAgfCAoKHgpICYgMHgwMGZmZmZmZSkpCisjZGVmaW5lIFRNSU9GQl9BQ0NfREhQSVgoeCkJKDB4MEUwMDAwMDAgfCAoKHgpICYgMHgwMDAwMDNmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfRFZQSVgoeCkJKDB4MEYwMDAwMDAgfCAoKHgpICYgMHgwMDAwMDNmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0hQSVgoeCkJKDB4MTAwMDAwMDAgfCAoKHgpICYgMHgwMDAwMDNmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfU1ZQSVgoeCkJKDB4MTEwMDAwMDAgfCAoKHgpICYgMHgwMDAwMDNmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfTEJJTkkoeCkJKDB4MTIwMDAwMDAgfCAoKHgpICYgMHgwMDAwZmZmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfTEJLMih4KQkoMHgxMzAwMDAwMCB8ICgoeCkgJiAweDAwMDBmZmZmKSkKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TSEJJTkkoeCkJKDB4MTQwMDAwMDAgfCAoKHgpICYgMHgwMDAwZmZmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0hCSzIoeCkJKDB4MTUwMDAwMDAgfCAoKHgpICYgMHgwMDAwZmZmZikpCisjZGVmaW5lIFRNSU9GQl9BQ0NfU1ZCSU5JKHgpCSgweDE2MDAwMDAwIHwgKCh4KSAmIDB4MDAwMGZmZmYpKQorI2RlZmluZSBUTUlPRkJfQUNDX1NWQksyKHgpCSgweDE3MDAwMDAwIHwgKCh4KSAmIDB4MDAwMGZmZmYpKQorCisjZGVmaW5lIFRNSU9GQl9BQ0NfQ01HTwkJMHgyMDAwMDAwMAorI2RlZmluZSBUTUlPRkJfQUNDX0NNR09fQ0VORAkweDAwMDAwMDAxCisjZGVmaW5lIFRNSU9GQl9BQ0NfQ01HT19JTlQJMHgwMDAwMDAwMgorI2RlZmluZSBUTUlPRkJfQUNDX0NNR09fQ01PRAkweDAwMDAwMDEwCisjZGVmaW5lIFRNSU9GQl9BQ0NfQ01HT19DRFZSVgkweDAwMDAwMDIwCisjZGVmaW5lIFRNSU9GQl9BQ0NfQ01HT19DREhSVgkweDAwMDAwMDQwCisjZGVmaW5lIFRNSU9GQl9BQ0NfQ01HT19SVU5ECTB4MDAwMDgwMDAKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TQ0dPCQkweDIxMDAwMDAwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0NHT19DRU5ECTB4MDAwMDAwMDEKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TQ0dPX0lOVAkweDAwMDAwMDAyCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0NHT19ST1AzCTB4MDAwMDAwMDQKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TQ0dPX1RSTlMJMHgwMDAwMDAwOAorI2RlZmluZSBUTUlPRkJfQUNDX1NDR09fRFZSVgkweDAwMDAwMDEwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0NHT19ESFJWCTB4MDAwMDAwMjAKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TQ0dPX1NWUlYJMHgwMDAwMDA0MAorI2RlZmluZSBUTUlPRkJfQUNDX1NDR09fU0hSVgkweDAwMDAwMDgwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0NHT19EU1RYWQkweDAwMDA4MDAwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0JHTwkJMHgyMjAwMDAwMAorI2RlZmluZSBUTUlPRkJfQUNDX1NCR09fQ0VORAkweDAwMDAwMDAxCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0JHT19JTlQJMHgwMDAwMDAwMgorI2RlZmluZSBUTUlPRkJfQUNDX1NCR09fRFZSVgkweDAwMDAwMDEwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0JHT19ESFJWCTB4MDAwMDAwMjAKKyNkZWZpbmUgVE1JT0ZCX0FDQ19TQkdPX1NWUlYJMHgwMDAwMDA0MAorI2RlZmluZSBUTUlPRkJfQUNDX1NCR09fU0hSVgkweDAwMDAwMDgwCisjZGVmaW5lIFRNSU9GQl9BQ0NfU0JHT19TQk1ECTB4MDAwMDAxMDAKKyNkZWZpbmUgVE1JT0ZCX0FDQ19GTEdPCQkweDIzMDAwMDAwCisjZGVmaW5lIFRNSU9GQl9BQ0NfRkxHT19DRU5ECTB4MDAwMDAwMDEKKyNkZWZpbmUgVE1JT0ZCX0FDQ19GTEdPX0lOVAkweDAwMDAwMDAyCisjZGVmaW5lIFRNSU9GQl9BQ0NfRkxHT19ST1AzCTB4MDAwMDAwMDQKKyNkZWZpbmUgVE1JT0ZCX0FDQ19MREdPCQkweDI0MDAwMDAwCisjZGVmaW5lIFRNSU9GQl9BQ0NfTERHT19DRU5ECTB4MDAwMDAwMDEKKyNkZWZpbmUgVE1JT0ZCX0FDQ19MREdPX0lOVAkweDAwMDAwMDAyCisjZGVmaW5lIFRNSU9GQl9BQ0NfTERHT19ST1AzCTB4MDAwMDAwMDQKKyNkZWZpbmUgVE1JT0ZCX0FDQ19MREdPX0VORFBYCTB4MDAwMDAwMDgKKyNkZWZpbmUgVE1JT0ZCX0FDQ19MREdPX0xWUlYJMHgwMDAwMDAxMAorI2RlZmluZSBUTUlPRkJfQUNDX0xER09fTEhSVgkweDAwMDAwMDIwCisjZGVmaW5lIFRNSU9GQl9BQ0NfTERHT19MRE1PRAkweDAwMDAwMDQwCisKKy8qIGEgRklGTyBpcyBhbHdheXMgYWxsb2NhdGVkLCBldmVuIGlmIGFjY2VsZXJhdGlvbiBpcyBub3QgdXNlZCAqLworI2RlZmluZSBUTUlPRkJfRklGT19TSVpFCTUxMgorCisvKgorICogTENEIEhvc3QgQ29udHJvbGxlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgKgorICogVGhpcyBpb21lbSBhcmVhIHN1cHBvcnRzIG9ubHkgMTYtYml0IElPLgorICovCisjZGVmaW5lIENDUl9DTUQJCQkweDA0IC8qIENvbW1hbmQJCQkJKi8KKyNkZWZpbmUgQ0NSX1JFVklECQkweDA4IC8qIFJldmlzaW9uIElECQkJKi8KKyNkZWZpbmUgQ0NSX0JBU0VMCQkweDEwIC8qIExDRCBDb250cm9sIFJlZyBCYXNlIEFkZHIgTG93CSovCisjZGVmaW5lIENDUl9CQVNFSAkJMHgxMiAvKiBMQ0QgQ29udHJvbCBSZWcgQmFzZSBBZGRyIEhpZ2gJKi8KKyNkZWZpbmUgQ0NSX1VHQ0MJCTB4NDAgLyogVW5pZmllZCBHYXRlZCBDbG9jayBDb250cm9sCSovCisjZGVmaW5lIENDUl9HQ0MJCQkweDQyIC8qIEdhdGVkIENsb2NrIENvbnRyb2wJCSovCisjZGVmaW5lIENDUl9VU0MJCQkweDUwIC8qIFVuaWZpZWQgU29mdHdhcmUgQ2xlYXIJCSovCisjZGVmaW5lIENDUl9WUkFNUlRDCQkweDYwIC8qIFZSQU0gVGltaW5nIENvbnRyb2wJCSovCisJCQkJLyogMHg2MSBWUkFNIFJlZnJlc2ggQ29udHJvbAkJKi8KKyNkZWZpbmUgQ0NSX1ZSQU1TQUMJCTB4NjIgLyogVlJBTSBBY2Nlc3MgQ29udHJvbAkJKi8KKwkJCQkvKiAweDYzCVZSQU0gU3RhdHVzCQkJKi8KKyNkZWZpbmUgQ0NSX1ZSQU1CQwkJMHg2NCAvKiBWUkFNIEJsb2NrIENvbnRyb2wJCSovCisKKy8qCisgKiBMQ0QgQ29udHJvbCBSZWdpc3RlcgorICoKKyAqIFRoaXMgaW9tZW0gYXJlYSBzdXBwb3J0cyBvbmx5IDE2LWJpdCBJTy4KKyAqLworI2RlZmluZSBMQ1JfVUlTCQkJMHgwMDAgLyogVW5pZmllZCBJbnRlcnJ1cHQgU3RhdHVzCSovCisjZGVmaW5lIExDUl9WSFBOCQkweDAwOCAvKiBWUkFNIEhvcml6b250YWwgUGl4ZWwgTnVtYmVyCSovCisjZGVmaW5lIExDUl9DRlNBTAkJMHgwMGEgLyogQ29tbWFuZCBGSUZPIFN0YXJ0IEFkZHJlc3MgTG93CSovCisjZGVmaW5lIExDUl9DRlNBSAkJMHgwMGMgLyogQ29tbWFuZCBGSUZPIFN0YXJ0IEFkZHJlc3MgSGlnaCAqLworI2RlZmluZSBMQ1JfQ0ZTCQkJMHgwMGUgLyogQ29tbWFuZCBGSUZPIFNpemUJCSovCisjZGVmaW5lIExDUl9DRldTCQkweDAxMCAvKiBDb21tYW5kIEZJRk8gV3JpdGVhYmxlIFNpemUJKi8KKyNkZWZpbmUgTENSX0JCSUUJCTB4MDEyIC8qIEJpdEJMVCBJbnRlcnJ1cHQgRW5hYmxlCSovCisjZGVmaW5lIExDUl9CQklTQwkJMHgwMTQgLyogQml0QkxUIEludGVycnVwdCBTdGF0dXMgYW5kIENsZWFyICovCisjZGVmaW5lIExDUl9DQ1MJCQkweDAxNiAvKiBDb21tYW5kIENvdW50IFN0YXR1cwkJKi8KKyNkZWZpbmUgTENSX0JCRVMJCTB4MDE4IC8qIEJpdEJMVCBFeGVjdXRpb24gU3RhdHVzCSovCisjZGVmaW5lIExDUl9DTURMCQkweDAxYyAvKiBDb21tYW5kIExvdwkJCSovCisjZGVmaW5lIExDUl9DTURICQkweDAxZSAvKiBDb21tYW5kIEhpZ2gJCQkqLworI2RlZmluZSBMQ1JfQ0ZDCQkJMHgwMjIgLyogQ29tbWFuZCBGSUZPIENsZWFyCQkqLworI2RlZmluZSBMQ1JfQ0NJRkMJCTB4MDI0IC8qIENNT1MgQ2FtZXJhIElGIENvbnRyb2wJCSovCisjZGVmaW5lIExDUl9IV1QJCQkweDAyNiAvKiBIYXJkd2FyZSBUZXN0CQkJKi8KKyNkZWZpbmUgTENSX0xDRENDUkMJCTB4MTAwIC8qIExDREMgQ2xvY2sgYW5kIFJlc2V0IENvbnRyb2wJKi8KKyNkZWZpbmUgTENSX0xDRENDCQkweDEwMiAvKiBMQ0RDIENvbnRyb2wJCQkqLworI2RlZmluZSBMQ1JfTENEQ09QQwkJMHgxMDQgLyogTENEQyBPdXRwdXQgUGluIENvbnRyb2wJKi8KKyNkZWZpbmUgTENSX0xDRElTCQkweDEwOCAvKiBMQ0QgSW50ZXJydXB0IFN0YXR1cwkJKi8KKyNkZWZpbmUgTENSX0xDRElNCQkweDEwYSAvKiBMQ0QgSW50ZXJydXB0IE1hc2sJCSovCisjZGVmaW5lIExDUl9MQ0RJRQkJMHgxMGMgLyogTENEIEludGVycnVwdCBFbmFibGUJCSovCisjZGVmaW5lIExDUl9HRFNBTAkJMHgxMjIgLyogR3JhcGhpY3MgRGlzcGxheSBTdGFydCBBZGRyZXNzIExvdyAqLworI2RlZmluZSBMQ1JfR0RTQUgJCTB4MTI0IC8qIEdyYXBoaWNzIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBIaWdoICovCisjZGVmaW5lIExDUl9WSFBDTAkJMHgxMmEgLyogVlJBTSBIb3Jpem9udGFsIFBpeGVsIENvdW50IExvdyAqLworI2RlZmluZSBMQ1JfVkhQQ0gJCTB4MTJjIC8qIFZSQU0gSG9yaXpvbnRhbCBQaXhlbCBDb3VudCBIaWdoICovCisjZGVmaW5lIExDUl9HTQkJCTB4MTJlIC8qIEdyYXBoaWMgTW9kZShWUkFNIGFjY2VzcyBlbmFibGUpICovCisjZGVmaW5lIExDUl9IVAkJCTB4MTQwIC8qIEhvcml6b250YWwgVG90YWwJCSovCisjZGVmaW5lIExDUl9IRFMJCQkweDE0MiAvKiBIb3Jpem9udGFsIERpc3BsYXkgU3RhcnQJKi8KKyNkZWZpbmUgTENSX0hTUwkJCTB4MTQ0IC8qIEgtU3luYyBTdGFydAkJCSovCisjZGVmaW5lIExDUl9IU0UJCQkweDE0NiAvKiBILVN5bmMgRW5kCQkJKi8KKyNkZWZpbmUgTENSX0hOUAkJCTB4MTRjIC8qIEhvcml6b250YWwgTnVtYmVyIG9mIFBpeGVscwkqLworI2RlZmluZSBMQ1JfVlQJCQkweDE1MCAvKiBWZXJ0aWNhbCBUb3RhbAkJCSovCisjZGVmaW5lIExDUl9WRFMJCQkweDE1MiAvKiBWZXJ0aWNhbCBEaXNwbGF5IFN0YXJ0CQkqLworI2RlZmluZSBMQ1JfVlNTCQkJMHgxNTQgLyogVi1TeW5jIFN0YXJ0CQkJKi8KKyNkZWZpbmUgTENSX1ZTRQkJCTB4MTU2IC8qIFYtU3luYyBFbmQJCQkqLworI2RlZmluZSBMQ1JfQ0RMTgkJMHgxNjAgLyogQ3VycmVudCBEaXNwbGF5IExpbmUgTnVtYmVyCSovCisjZGVmaW5lIExDUl9JTE4JCQkweDE2MiAvKiBJbnRlcnJ1cHQgTGluZSBOdW1iZXIJCSovCisjZGVmaW5lIExDUl9TUAkJCTB4MTY0IC8qIFN5bmMgUG9sYXJpdHkJCQkqLworI2RlZmluZSBMQ1JfTUlTQwkJMHgxNjYgLyogTUlTQyhSR0I1NjUgbW9kZSkJCSovCisjZGVmaW5lIExDUl9WSUhTUwkJMHgxNmEgLyogVmlkZW8gSW50ZXJmYWNlIEgtU3luYyBTdGFydAkqLworI2RlZmluZSBMQ1JfVklWUwkJMHgxNmMgLyogVmlkZW8gSW50ZXJmYWNlIFZlcnRpY2FsIFN0YXJ0CSovCisjZGVmaW5lIExDUl9WSVZFCQkweDE2ZSAvKiBWaWRlbyBJbnRlcmZhY2UgVmVydGljYWwgRW5kCSovCisjZGVmaW5lIExDUl9WSVZTUwkJMHgxNzAgLyogVmlkZW8gSW50ZXJmYWNlIFYtU3luYyBTdGFydAkqLworI2RlZmluZSBMQ1JfVkNDSVMJCTB4MTdlIC8qIFZpZGVvIC8gQ01PUyBDYW1lcmEgSW50ZXJmYWNlIFNlbGVjdCAqLworI2RlZmluZSBMQ1JfVklEV1NBTAkJMHgxODAgLyogVkkgRGF0YSBXcml0ZSBTdGFydCBBZGRyZXNzIExvdyAqLworI2RlZmluZSBMQ1JfVklEV1NBSAkJMHgxODIgLyogVkkgRGF0YSBXcml0ZSBTdGFydCBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgTENSX1ZJRFJTQUwJCTB4MTg0IC8qIFZJIERhdGEgUmVhZCBTdGFydCBBZGRyZXNzIExvdwkqLworI2RlZmluZSBMQ1JfVklEUlNBSAkJMHgxODYgLyogVkkgRGF0YSBSZWFkIFN0YXJ0IEFkZHJlc3MgSGlnaCAqLworI2RlZmluZSBMQ1JfVklQRERTVAkJMHgxODggLyogVkkgUGljdHVyZSBEYXRhIERpc3BsYXkgU3RhcnQgVGltaW5nICovCisjZGVmaW5lIExDUl9WSVBEREVUCQkweDE4NiAvKiBWSSBQaWN0dXJlIERhdGEgRGlzcGxheSBFbmQgVGltaW5nICovCisjZGVmaW5lIExDUl9WSUUJCQkweDE4YyAvKiBWaWRlbyBJbnRlcmZhY2UgRW5hYmxlCQkqLworI2RlZmluZSBMQ1JfVkNTCQkJMHgxOGUgLyogVmlkZW8vQ2FtZXJhIFNlbGVjdAkJKi8KKyNkZWZpbmUgTENSX1ZQSFdDCQkweDE5NCAvKiBWaWRlbyBQaWN0dXJlIEhvcml6b250YWwgV2FpdCBDb3VudCAqLworI2RlZmluZSBMQ1JfVlBIUwkJMHgxOTYgLyogVmlkZW8gUGljdHVyZSBIb3Jpem9udGFsIFNpemUJKi8KKyNkZWZpbmUgTENSX1ZQVldDCQkweDE5OCAvKiBWaWRlbyBQaWN0dXJlIFZlcnRpY2FsIFdhaXQgQ291bnQgKi8KKyNkZWZpbmUgTENSX1ZQVlMJCTB4MTlhIC8qIFZpZGVvIFBpY3R1cmUgVmVydGljYWwgU2l6ZQkqLworI2RlZmluZSBMQ1JfUExIUElYCQkweDFhMCAvKiBQTEhQSVgJCQkJKi8KKyNkZWZpbmUgTENSX1hTCQkJMHgxYTIgLyogWFN0YXJ0CQkJCSovCisjZGVmaW5lIExDUl9YQ0tIVwkJMHgxYTQgLyogWENLIEhpZ2ggV2lkdGgJCQkqLworI2RlZmluZSBMQ1JfU1RIUwkJMHgxYTggLyogU1RIIFN0YXJ0CQkJKi8KKyNkZWZpbmUgTENSX1ZUMgkJCTB4MWFhIC8qIFZlcnRpY2FsIFRvdGFsCQkJKi8KKyNkZWZpbmUgTENSX1lDS1NXCQkweDFhYyAvKiBZQ0sgU3RhcnQgV2FpdAkJCSovCisjZGVmaW5lIExDUl9ZU1RTCQkweDFhZSAvKiBZU1QgU3RhcnQJCQkqLworI2RlZmluZSBMQ1JfUFBPTFMJCTB4MWIwIC8qICNQUE9MIFN0YXJ0CQkJKi8KKyNkZWZpbmUgTENSX1BSRUNXCQkweDFiMiAvKiBQUkVDIFdpZHRoCQkJKi8KKyNkZWZpbmUgTENSX1ZDTEtIVwkJMHgxYjQgLyogVkNMSyBIaWdoIFdpZHRoCQkqLworI2RlZmluZSBMQ1JfT0MJCQkweDFiNiAvKiBPdXRwdXQgQ29udHJvbAkJCSovCisKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhOworCitzdHJ1Y3QgdG1pb2ZiX3BhciB7CisJdTMyCQkJCXBzZXVkb19wYWxldHRlWzE2XTsKKworI2lmZGVmIENPTkZJR19GQl9UTUlPX0FDQ0VMTAorCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0X2FjYzsKKwlib29sCQkJCXVzZV9wb2xsaW5nOworI2VuZGlmCisKKwl2b2lkIF9faW9tZW0JCQkqY2NyOworCXZvaWQgX19pb21lbQkJCSpsY3I7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHJlYXNvbnMgZm9yIGFuIGludGVycnVwdDoKKyAqCXVpcwliYmlzYwlsY2RpcworICoJMDEwMAkwMDAxCWFjY2VsZXJhdG9yIGNvbW1hbmQgY29tcGxldGVkCisgKiAJMjAwMAkwMDAxCXZzeW5jIHN0YXJ0CisgKiAJMjAwMAkwMDAyCWRpc3BsYXkgc3RhcnQKKyAqIAkyMDAwCTAwMDQJbGluZSBudW1iZXIgbWF0Y2goMHgxZmYgbWFzaz8/PykKKyAqLworc3RhdGljIGlycXJldHVybl90IHRtaW9mYl9pcnEoaW50IGlycSwgdm9pZCAqX19pbmZvKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gX19pbmZvOworCXN0cnVjdCB0bWlvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJdW5zaWduZWQgaW50IGJiaXNjID0gdG1pb19pb3JlYWQxNihwYXItPmxjciArIExDUl9CQklTQyk7CisKKworCS8qCisJICogV2Ugd2VyZSBpbiBwb2xsaW5nIG1vZGUgYW5kIG5vdyB3ZSBnb3QgY29ycmVjdCBpcnEuCisJICogU3dpdGNoIGJhY2sgdG8gSVJRLWJhc2VkIHN5bmMgb2YgY29tbWFuZCBGSUZPCisJICovCisJaWYgKHVubGlrZWx5KHBhci0+dXNlX3BvbGxpbmcgJiYgaXJxICE9IC0xKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0bWlvZmI6IHN3aXRjaGluZyB0byB3YWl0cVxuIik7CisJCXBhci0+dXNlX3BvbGxpbmcgPSBmYWxzZTsKKwl9CisKKwl0bWlvX2lvd3JpdGUxNihiYmlzYywgcGFyLT5sY3IgKyBMQ1JfQkJJU0MpOworCisjaWZkZWYgQ09ORklHX0ZCX1RNSU9fQUNDRUxMCisJaWYgKGJiaXNjICYgMSkKKwkJd2FrZV91cCgmcGFyLT53YWl0X2FjYyk7CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKgorICogVHVybnMgb2ZmIHRoZSBMQ0QgY29udHJvbGxlciBhbmQgTENEIGhvc3QgY29udHJvbGxlci4KKyAqLworc3RhdGljIGludCB0bWlvZmJfaHdfc3RvcChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1mZF9jZWxsICpjZWxsID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19mYl9kYXRhICpkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0bWlvZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwl0bWlvX2lvd3JpdGUxNigwLCBwYXItPmNjciArIENDUl9VR0NDKTsKKwl0bWlvX2lvd3JpdGUxNigwLCBwYXItPmxjciArIExDUl9HTSk7CisJZGF0YS0+bGNkX3NldF9wb3dlcihkZXYsIDApOworCXRtaW9faW93cml0ZTE2KDB4MDAxMCwgcGFyLT5sY3IgKyBMQ1JfTENEQ0NSQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBMQ0QgaG9zdCBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50IHRtaW9mYl9od19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdG1pb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqbmxjciA9ICZjZWxsLT5yZXNvdXJjZXNbMF07CisJY29uc3Qgc3RydWN0IHJlc291cmNlICp2cmFtID0gJmNlbGwtPnJlc291cmNlc1syXTsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwlpZiAobmxjciA9PSBOVUxMIHx8IHZyYW0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYXNlID0gbmxjci0+c3RhcnQ7CisKKwl0bWlvX2lvd3JpdGUxNigweDAwM2EsIHBhci0+Y2NyICsgQ0NSX1VHQ0MpOworCXRtaW9faW93cml0ZTE2KDB4MDAzYSwgcGFyLT5jY3IgKyBDQ1JfR0NDKTsKKwl0bWlvX2lvd3JpdGUxNigweDNmMDAsIHBhci0+Y2NyICsgQ0NSX1VTQyk7CisKKwltc2xlZXAoMik7IC8qIHdhaXQgZm9yIGRldmljZSB0byBzZXR0bGUgKi8KKworCXRtaW9faW93cml0ZTE2KDB4MDAwMCwgcGFyLT5jY3IgKyBDQ1JfVVNDKTsKKwl0bWlvX2lvd3JpdGUxNihiYXNlID4+IDE2LCBwYXItPmNjciArIENDUl9CQVNFSCk7CisJdG1pb19pb3dyaXRlMTYoYmFzZSwgcGFyLT5jY3IgKyBDQ1JfQkFTRUwpOworCXRtaW9faW93cml0ZTE2KDB4MDAwMiwgcGFyLT5jY3IgKyBDQ1JfQ01EKTsgLyogYmFzZSBhZGRyZXNzIGVuYWJsZSAqLworCXRtaW9faW93cml0ZTE2KDB4NDBhOCwgcGFyLT5jY3IgKyBDQ1JfVlJBTVJUQyk7IC8qIFZSQU1SQywgVlJBTVRDICovCisJdG1pb19pb3dyaXRlMTYoMHgwMDE4LCBwYXItPmNjciArIENDUl9WUkFNU0FDKTsgLyogVlJBTVNUUywgVlJBTUFDICovCisJdG1pb19pb3dyaXRlMTYoMHgwMDAyLCBwYXItPmNjciArIENDUl9WUkFNQkMpOworCW1zbGVlcCgyKTsgLyogd2FpdCBmb3IgZGV2aWNlIHRvIHNldHRsZSAqLworCXRtaW9faW93cml0ZTE2KDB4MDAwYiwgcGFyLT5jY3IgKyBDQ1JfVlJBTUJDKTsKKworCWJhc2UgPSB2cmFtLT5zdGFydCArIGluZm8tPnNjcmVlbl9zaXplOworCXRtaW9faW93cml0ZTE2KGJhc2UgPj4gMTYsIHBhci0+bGNyICsgTENSX0NGU0FIKTsKKwl0bWlvX2lvd3JpdGUxNihiYXNlLCBwYXItPmxjciArIExDUl9DRlNBTCk7CisJdG1pb19pb3dyaXRlMTYoVE1JT0ZCX0ZJRk9fU0laRSAtIDEsIHBhci0+bGNyICsgTENSX0NGUyk7CisJdG1pb19pb3dyaXRlMTYoMSwgcGFyLT5sY3IgKyBMQ1JfQ0ZDKTsKKwl0bWlvX2lvd3JpdGUxNigxLCBwYXItPmxjciArIExDUl9CQklFKTsKKwl0bWlvX2lvd3JpdGUxNigwLCBwYXItPmxjciArIExDUl9DRldTKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0cyB0aGUgTENEIGNvbnRyb2xsZXIncyBvdXRwdXQgcmVzb2x1dGlvbiBhbmQgcGl4ZWwgY2xvY2sKKyAqLworc3RhdGljIHZvaWQgdG1pb2ZiX2h3X21vZGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZmRfY2VsbCAqY2VsbCA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fZmJfZGF0YSAqZGF0YSA9IGNlbGwtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlID0gaW5mby0+bW9kZTsKKwlzdHJ1Y3QgdG1pb2ZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGludCBpOworCisJdG1pb19pb3dyaXRlMTYoMCwgcGFyLT5sY3IgKyBMQ1JfR00pOworCWRhdGEtPmxjZF9zZXRfcG93ZXIoZGV2LCAwKTsKKwl0bWlvX2lvd3JpdGUxNigweDAwMTAsIHBhci0+bGNyICsgTENSX0xDRENDUkMpOworCWRhdGEtPmxjZF9tb2RlKGRldiwgbW9kZSk7CisJZGF0YS0+bGNkX3NldF9wb3dlcihkZXYsIDEpOworCisJdG1pb19pb3dyaXRlMTYoaW5mby0+Zml4LmxpbmVfbGVuZ3RoLCBwYXItPmxjciArIExDUl9WSFBOKTsKKwl0bWlvX2lvd3JpdGUxNigwLCBwYXItPmxjciArIExDUl9HRFNBSCk7CisJdG1pb19pb3dyaXRlMTYoMCwgcGFyLT5sY3IgKyBMQ1JfR0RTQUwpOworCXRtaW9faW93cml0ZTE2KGluZm8tPmZpeC5saW5lX2xlbmd0aCA+PiAxNiwgcGFyLT5sY3IgKyBMQ1JfVkhQQ0gpOworCXRtaW9faW93cml0ZTE2KGluZm8tPmZpeC5saW5lX2xlbmd0aCwgcGFyLT5sY3IgKyBMQ1JfVkhQQ0wpOworCXRtaW9faW93cml0ZTE2KGkgPSAwLCBwYXItPmxjciArIExDUl9IU1MpOworCXRtaW9faW93cml0ZTE2KGkgKz0gbW9kZS0+aHN5bmNfbGVuLCBwYXItPmxjciArIExDUl9IU0UpOworCXRtaW9faW93cml0ZTE2KGkgKz0gbW9kZS0+bGVmdF9tYXJnaW4sIHBhci0+bGNyICsgTENSX0hEUyk7CisJdG1pb19pb3dyaXRlMTYoaSArPSBtb2RlLT54cmVzICsgbW9kZS0+cmlnaHRfbWFyZ2luLCBwYXItPmxjciArIExDUl9IVCk7CisJdG1pb19pb3dyaXRlMTYobW9kZS0+eHJlcywgcGFyLT5sY3IgKyBMQ1JfSE5QKTsKKwl0bWlvX2lvd3JpdGUxNihpID0gMCwgcGFyLT5sY3IgKyBMQ1JfVlNTKTsKKwl0bWlvX2lvd3JpdGUxNihpICs9IG1vZGUtPnZzeW5jX2xlbiwgcGFyLT5sY3IgKyBMQ1JfVlNFKTsKKwl0bWlvX2lvd3JpdGUxNihpICs9IG1vZGUtPnVwcGVyX21hcmdpbiwgcGFyLT5sY3IgKyBMQ1JfVkRTKTsKKwl0bWlvX2lvd3JpdGUxNihpICs9IG1vZGUtPnlyZXMsIHBhci0+bGNyICsgTENSX0lMTik7CisJdG1pb19pb3dyaXRlMTYoaSArPSBtb2RlLT5sb3dlcl9tYXJnaW4sIHBhci0+bGNyICsgTENSX1ZUKTsKKwl0bWlvX2lvd3JpdGUxNigzLCBwYXItPmxjciArIExDUl9NSVNDKTsgLyogUkdCNTY1IG1vZGUgKi8KKwl0bWlvX2lvd3JpdGUxNigxLCBwYXItPmxjciArIExDUl9HTSk7IC8qIFZSQU0gZW5hYmxlICovCisJdG1pb19pb3dyaXRlMTYoMHg0MDA3LCBwYXItPmxjciArIExDUl9MQ0RDQyk7CisJdG1pb19pb3dyaXRlMTYoMywgcGFyLT5sY3IgKyBMQ1JfU1ApOyAgLyogc3luYyBwb2xhcml0eSAqLworCisJdG1pb19pb3dyaXRlMTYoMHgwMDEwLCBwYXItPmxjciArIExDUl9MQ0RDQ1JDKTsKKwltc2xlZXAoNSk7IC8qIHdhaXQgZm9yIGRldmljZSB0byBzZXR0bGUgKi8KKwl0bWlvX2lvd3JpdGUxNigweDAwMTQsIHBhci0+bGNyICsgTENSX0xDRENDUkMpOyAvKiBTVE9QX0NLUCAqLworCW1zbGVlcCg1KTsgLyogd2FpdCBmb3IgZGV2aWNlIHRvIHNldHRsZSAqLworCXRtaW9faW93cml0ZTE2KDB4MDAxNSwgcGFyLT5sY3IgKyBMQ1JfTENEQ0NSQyk7IC8qIFNUT1BfQ0tQfFNPRlRfUkVTRVQqLworCXRtaW9faW93cml0ZTE2KDB4ZmZmYSwgcGFyLT5sY3IgKyBMQ1JfVkNTKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBDT05GSUdfRkJfVE1JT19BQ0NFTEwKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrCit0bWlvZmJfYWNjX3dhaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjY3MpCit7CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwkvKgorCSAqIFRoaXMgY29kZSBjYW4gYmUgY2FsbGVkIHdoaXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisJICogU28gaW5zdGVhZCBvZiByZWxheWluZyBvbiBpcnEgdG8gdHJpZ2dlciB0aGUgZXZlbnQsCisJICogcG9sbCB0aGUgc3RhdGUgdGlsbCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmQgaXMgZXhlY3V0ZWQuCisJICovCisJaWYgKGlycXNfZGlzYWJsZWQoKSB8fCBwYXItPnVzZV9wb2xsaW5nKSB7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKHRtaW9faW9yZWFkMTYocGFyLT5sY3IgKyBMQ1JfQ0NTKSA+IGNjcykgeworCQkJdWRlbGF5KDEpOworCQkJaSsrOworCQkJaWYgKGkgPiAxMDAwMCkgeworCQkJCXByX2VycigidG1pb2ZiOiB0aW1lb3V0IHdhaXRpbmcgZm9yICVkXG4iLAorCQkJCQkJY2NzKTsKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCX0KKwkJCXRtaW9mYl9pcnEoLTEsIGluZm8pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCF3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwYXItPndhaXRfYWNjLAorCQkJCXRtaW9faW9yZWFkMTYocGFyLT5sY3IgKyBMQ1JfQ0NTKSA8PSBjY3MsCisJCQkJMTAwMCkpIHsKKwkJCXByX2VycigidG1pb2ZiOiB0aW1lb3V0IHdhaXRpbmcgZm9yICVkXG4iLCBjY3MpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlcyBhbiBhY2NlbGVyYXRvciBjb21tYW5kIHRvIHRoZSBhY2NlbGVyYXRvcidzIEZJRk8uCisgKi8KK3N0YXRpYyBpbnQKK3RtaW9mYl9hY2Nfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHUzMiAqY21kLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlpbnQgcmV0OworCisJcmV0ID0gdG1pb2ZiX2FjY193YWl0KGluZm8sIFRNSU9GQl9GSUZPX1NJWkUgLSBjb3VudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoOyBjb3VudDsgY291bnQtLSwgY21kKyspIHsKKwkJdG1pb19pb3dyaXRlMTYoKmNtZCA+PiAxNiwgcGFyLT5sY3IgKyBMQ1JfQ01ESCk7CisJCXRtaW9faW93cml0ZTE2KCpjbWQsIHBhci0+bGNyICsgTENSX0NNREwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciB0aGUgYWNjZWxlcmF0b3IgdG8gZmluaXNoIGl0cyBvcGVyYXRpb25zIGJlZm9yZSB3cml0aW5nCisgKiB0byB0aGUgZnJhbWVidWZmZXIgZm9yIGNvbnNpc3RlbnQgZGlzcGxheSBvdXRwdXQuCisgKi8KK3N0YXRpYyBpbnQgdG1pb2ZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgdG1pb2ZiX3BhciAqcGFyID0gZmJpLT5wYXI7CisKKwlpbnQgcmV0OworCWludCBpID0gMDsKKworCXJldCA9IHRtaW9mYl9hY2Nfd2FpdChmYmksIDApOworCisJd2hpbGUgKHRtaW9faW9yZWFkMTYocGFyLT5sY3IgKyBMQ1JfQkJFUykgJiAyKSB7IC8qIGJsaXQgYWN0aXZlICovCisJCXVkZWxheSgxKTsKKwkJaSsrIDsKKwkJaWYgKGkgPiAxMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGJsaXQgdG8gZW5kIVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCit0bWlvZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmZiaSwgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCWNvbnN0IHUzMiBjbWRbXSA9IHsKKwkJVE1JT0ZCX0FDQ19EU0FEUigocmVjdC0+ZHkgKiBmYmktPm1vZGUtPnhyZXMgKyByZWN0LT5keCkgKiAyKSwKKwkJVE1JT0ZCX0FDQ19ESFBJWChyZWN0LT53aWR0aCAtIDEpLAorCQlUTUlPRkJfQUNDX0RWUElYKHJlY3QtPmhlaWdodCAtIDEpLAorCQlUTUlPRkJfQUNDX0ZJTEwocmVjdC0+Y29sb3IpLAorCQlUTUlPRkJfQUNDX0ZMR08sCisJfTsKKworCWlmIChmYmktPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CisJICAgIGZiaS0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfZmlsbHJlY3QoZmJpLCByZWN0KTsKKwkJcmV0dXJuOworCX0KKworCXRtaW9mYl9hY2Nfd3JpdGUoZmJpLCBjbWQsIEFSUkFZX1NJWkUoY21kKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0bWlvZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmZiaSwgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQoreworCWNvbnN0IHUzMiBjbWRbXSA9IHsKKwkJVE1JT0ZCX0FDQ19EU0FEUigoYXJlYS0+ZHkgKiBmYmktPm1vZGUtPnhyZXMgKyBhcmVhLT5keCkgKiAyKSwKKwkJVE1JT0ZCX0FDQ19ESFBJWChhcmVhLT53aWR0aCAtIDEpLAorCQlUTUlPRkJfQUNDX0RWUElYKGFyZWEtPmhlaWdodCAtIDEpLAorCQlUTUlPRkJfQUNDX1NTQURSKChhcmVhLT5zeSAqIGZiaS0+bW9kZS0+eHJlcyArIGFyZWEtPnN4KSAqIDIpLAorCQlUTUlPRkJfQUNDX1NDR08sCisJfTsKKworCWlmIChmYmktPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CisJICAgIGZiaS0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfY29weWFyZWEoZmJpLCBhcmVhKTsKKwkJcmV0dXJuOworCX0KKworCXRtaW9mYl9hY2Nfd3JpdGUoZmJpLCBjbWQsIEFSUkFZX1NJWkUoY21kKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdG1pb2ZiX2NsZWFyc2NyZWVuKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCByZWN0ID0geworCQkuZHgJPSAwLAorCQkuZHkJPSAwLAorCQkud2lkdGgJPSBpbmZvLT5tb2RlLT54cmVzLAorCQkuaGVpZ2h0CT0gaW5mby0+bW9kZS0+eXJlcywKKwkJLmNvbG9yCT0gMCwKKwkJLnJvcAk9IFJPUF9DT1BZLAorCX07CisKKwlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QoaW5mbywgJnJlY3QpOworfQorCitzdGF0aWMgaW50IHRtaW9mYl92Ymxhbmsoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IGZiX3ZibGFuayAqdmJsYW5rKQoreworCXN0cnVjdCB0bWlvZmJfcGFyICpwYXIgPSBmYmktPnBhcjsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlID0gZmJpLT5tb2RlOworCXVuc2lnbmVkIGludCB2Y291bnQgPSB0bWlvX2lvcmVhZDE2KHBhci0+bGNyICsgTENSX0NETE4pOworCXVuc2lnbmVkIGludCB2ZHMgPSBtb2RlLT52c3luY19sZW4gKyBtb2RlLT51cHBlcl9tYXJnaW47CisKKwl2YmxhbmstPnZjb3VudCA9IHZjb3VudDsKKwl2YmxhbmstPmZsYWdzID0gRkJfVkJMQU5LX0hBVkVfVkJMQU5LIHwgRkJfVkJMQU5LX0hBVkVfVkNPVU5UCisJCQkJCQl8IEZCX1ZCTEFOS19IQVZFX1ZTWU5DOworCisJaWYgKHZjb3VudCA8IG1vZGUtPnZzeW5jX2xlbikKKwkJdmJsYW5rLT5mbGFncyB8PSBGQl9WQkxBTktfVlNZTkNJTkc7CisKKwlpZiAodmNvdW50IDwgdmRzIHx8IHZjb3VudCA+IHZkcyArIG1vZGUtPnlyZXMpCisJCXZibGFuay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX1ZCTEFOS0lORzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdG1pb2ZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGQklPR0VUX1ZCTEFOSzogeworCQlzdHJ1Y3QgZmJfdmJsYW5rIHZibGFuayA9IHswfTsKKwkJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCisJCXRtaW9mYl92YmxhbmsoZmJpLCAmdmJsYW5rKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmJsYW5rLCBzaXplb2YgdmJsYW5rKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfRkJfVE1JT19BQ0NFTEwKKwljYXNlIEZCSU9fVE1JT19BQ0NfU1lOQzoKKwkJdG1pb2ZiX3N5bmMoZmJpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZCSU9fVE1JT19BQ0NfV1JJVEU6IHsKKwkJdTMyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJCXUzMiBsZW47CisJCXUzMiBhY2NbMTZdOworCisJCWlmIChnZXRfdXNlcihsZW4sIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChsZW4gPiBBUlJBWV9TSVpFKGFjYykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjYywgYXJncCArIDEsIHNpemVvZih1MzIpICogbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB0bWlvZmJfYWNjX3dyaXRlKGZiaSwgYWNjLCBsZW4pOworCX0KKyNlbmRpZgorCX0KKworCXJldHVybiAtRU5PVFRZOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2VsZWN0IHRoZSBzbWFsbGVzdCBtb2RlIHRoYXQgYWxsb3dzIHRoZSBkZXNpcmVkIHJlc29sdXRpb24gdG8gYmUKKyAqIGRpc3BsYXllZC4gIElmIGRlc2lyZWQsIHRoZSB4IGFuZCB5IHBhcmFtZXRlcnMgY2FuIGJlIHJvdW5kZWQgdXAgdG8KKyAqIG1hdGNoIHRoZSBzZWxlY3RlZCBtb2RlLgorICovCitzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSAqCit0bWlvZmJfZmluZF9tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPQorCQlpbmZvLT5kZXZpY2UtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fZmJfZGF0YSAqZGF0YSA9IGNlbGwtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBmYl92aWRlb21vZGUgKmJlc3QgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9tb2RlczsgaSsrKSB7CisJCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUgPSBkYXRhLT5tb2RlcyArIGk7CisKKwkJaWYgKG1vZGUtPnhyZXMgPj0gdmFyLT54cmVzICYmIG1vZGUtPnlyZXMgPj0gdmFyLT55cmVzCisJCQkJJiYgKCFiZXN0IHx8IChtb2RlLT54cmVzIDwgYmVzdC0+eHJlcworCQkJCQkgICAmJiBtb2RlLT55cmVzIDwgYmVzdC0+eXJlcykpKQorCQkJYmVzdCA9IG1vZGU7CisJfQorCisJcmV0dXJuIGJlc3Q7Cit9CisKK3N0YXRpYyBpbnQgdG1pb2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlOworCXN0cnVjdCBtZmRfY2VsbCAqY2VsbCA9CisJCWluZm8tPmRldmljZS0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19mYl9kYXRhICpkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisKKwltb2RlID0gdG1pb2ZiX2ZpbmRfbW9kZShpbmZvLCB2YXIpOworCWlmICghbW9kZSB8fCB2YXItPmJpdHNfcGVyX3BpeGVsID4gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJZmJfdmlkZW9tb2RlX3RvX3Zhcih2YXIsIG1vZGUpOworCisJdmFyLT54cmVzX3ZpcnR1YWwgPSBtb2RlLT54cmVzOworCXZhci0+eXJlc192aXJ0dWFsID0gaW5mby0+c2NyZWVuX3NpemUgLyAobW9kZS0+eHJlcyAqIDIpOworCisJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhci0+eG9mZnNldCA9IDA7CisJdmFyLT55b2Zmc2V0ID0gMDsKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJdmFyLT5ncmF5c2NhbGUgPSAwOworCXZhci0+cmVkLm9mZnNldCA9IDExOworCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CisJdmFyLT5ub25zdGQgPSAwOworCXZhci0+aGVpZ2h0ID0gZGF0YS0+aGVpZ2h0OyAvKiBtbSAqLworCXZhci0+d2lkdGggPSBkYXRhLT53aWR0aDsgLyogbW0gKi8KKwl2YXItPnJvdGF0ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG1pb2ZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCXN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGU7CisKKwltb2RlID0gdG1pb2ZiX2ZpbmRfbW9kZShpbmZvLCB2YXIpOworCWlmICghbW9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmZvLT5tb2RlID0gbW9kZTsKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBpbmZvLT5tb2RlLT54cmVzICoKKwkJCXZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCisJdG1pb2ZiX2h3X21vZGUodG9fcGxhdGZvcm1fZGV2aWNlKGluZm8tPmRldmljZSkpOworCXRtaW9mYl9jbGVhcnNjcmVlbihpbmZvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bWlvZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAorCQkJICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLAorCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCWlmIChyZWdubyA8IEFSUkFZX1NJWkUocGFyLT5wc2V1ZG9fcGFsZXR0ZSkpIHsKKwkJcGFyLT5wc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQorCQkJKChyZWQgJiAweGY4MDApKSB8CisJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiAgNSkgfAorCQkJKChibHVlICYgMHhmODAwKSA+PiAxMSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHRtaW9mYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCS8qCisJICogZXZlcnl0aGluZyBpcyBkb25lIGluIGxjZC9ibCBkcml2ZXJzLgorCSAqIHRoaXMgaXMgcHVyZWx5IHRvIG1ha2Ugc3lzZnMgaGFwcHkgYW5kIHdvcmsuCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIHRtaW9mYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCisJLmZiX2lvY3RsCT0gdG1pb2ZiX2lvY3RsLAorCS5mYl9jaGVja192YXIJPSB0bWlvZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyCT0gdG1pb2ZiX3NldF9wYXIsCisJLmZiX3NldGNvbHJlZwk9IHRtaW9mYl9zZXRjb2xyZWcsCisJLmZiX2JsYW5rCT0gdG1pb2ZiX2JsYW5rLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAorI2lmZGVmIENPTkZJR19GQl9UTUlPX0FDQ0VMTAorCS5mYl9zeW5jCT0gdG1pb2ZiX3N5bmMsCisJLmZiX2ZpbGxyZWN0CT0gdG1pb2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IHRtaW9mYl9jb3B5YXJlYSwKKyNlbHNlCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKyNlbmRpZgorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRtaW9mYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1mZF9jZWxsICpjZWxsID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19mYl9kYXRhICpkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJlc291cmNlICpjY3IgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJc3RydWN0IHJlc291cmNlICpsY3IgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJc3RydWN0IHJlc291cmNlICp2cmFtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhcjsKKwlpbnQgcmV0dmFsOworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBvbmx5IHdheSBBVE0gdG8gZGlzYWJsZSB0aGUgZmIKKwkgKi8KKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiTlVMTCBwbGF0Zm9ybSBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHRtaW9mYl9wYXIpLCAmZGV2LT5kZXYpOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhciA9IGluZm8tPnBhcjsKKworI2lmZGVmIENPTkZJR19GQl9UTUlPX0FDQ0VMTAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBhci0+d2FpdF9hY2MpOworCisJcGFyLT51c2VfcG9sbGluZyA9IHRydWU7CisKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEKKwkJCXwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7CisjZWxzZQorCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CisjZW5kaWYKKworCWluZm8tPmZib3BzID0gJnRtaW9mYl9vcHM7CisKKwlzdHJjcHkoaW5mby0+Zml4LmlkLCAidG1pby1mYiIpOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gdnJhbS0+c3RhcnQ7CisJaW5mby0+Zml4LnNtZW1fbGVuID0gcmVzb3VyY2Vfc2l6ZSh2cmFtKTsKKwlpbmZvLT5maXgudHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IGxjci0+c3RhcnQ7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gcmVzb3VyY2Vfc2l6ZShsY3IpOworCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX05PTkU7CisJaW5mby0+c2NyZWVuX3NpemUgPSBpbmZvLT5maXguc21lbV9sZW4gLSAoNCAqIFRNSU9GQl9GSUZPX1NJWkUpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wc2V1ZG9fcGFsZXR0ZTsKKworCXBhci0+Y2NyID0gaW9yZW1hcChjY3ItPnN0YXJ0LCByZXNvdXJjZV9zaXplKGNjcikpOworCWlmICghcGFyLT5jY3IpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcF9jY3I7CisJfQorCisJcGFyLT5sY3IgPSBpb3JlbWFwKGluZm8tPmZpeC5tbWlvX3N0YXJ0LCBpbmZvLT5maXgubW1pb19sZW4pOworCWlmICghcGFyLT5sY3IpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcF9sY3I7CisJfQorCisJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOworCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcF92cmFtOworCX0KKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJnRtaW9mYl9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkJCWRldi0+ZGV2LmJ1c19pZCwgaW5mbyk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CisKKwlyZXR2YWwgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sCisJCQlkYXRhLT5tb2RlcywgZGF0YS0+bnVtX21vZGVzLAorCQkJZGF0YS0+bW9kZXMsIDE2KTsKKwlpZiAoIXJldHZhbCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9maW5kX21vZGU7CisJfQorCisJaWYgKGNlbGwtPmVuYWJsZSkgeworCQlyZXR2YWwgPSBjZWxsLT5lbmFibGUoZGV2KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwlyZXR2YWwgPSB0bWlvZmJfaHdfaW5pdChkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2h3X2luaXQ7CisKKwlmYl92aWRlb21vZGVfdG9fbW9kZWxpc3QoZGF0YS0+bW9kZXMsIGRhdGEtPm51bV9tb2RlcywKKwkJCQkgJmluZm8tPm1vZGVsaXN0KTsKKworCXJldHZhbCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl9mcmFtZWJ1ZmZlcjsKKworCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2VcbiIsCisJCQkJaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKKworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXJfZnJhbWVidWZmZXI6CisvKmVycl9zZXRfcGFyOiovCisJdG1pb2ZiX2h3X3N0b3AoZGV2KTsKK2Vycl9od19pbml0OgorCWlmIChjZWxsLT5kaXNhYmxlKQorCQljZWxsLT5kaXNhYmxlKGRldik7CitlcnJfZW5hYmxlOgorZXJyX2ZpbmRfbW9kZToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWZyZWVfaXJxKGlycSwgaW5mbyk7CitlcnJfcmVxdWVzdF9pcnE6CisJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CitlcnJfaW9yZW1hcF92cmFtOgorCWlvdW5tYXAocGFyLT5sY3IpOworZXJyX2lvcmVtYXBfbGNyOgorCWlvdW5tYXAocGFyLT5jY3IpOworZXJyX2lvcmVtYXBfY2NyOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdG1pb2ZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1mZF9jZWxsICpjZWxsID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKKwlzdHJ1Y3QgdG1pb2ZiX3BhciAqcGFyOworCisJaWYgKGluZm8pIHsKKwkJcGFyID0gaW5mby0+cGFyOworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCisJCXRtaW9mYl9od19zdG9wKGRldik7CisKKwkJaWYgKGNlbGwtPmRpc2FibGUpCisJCQljZWxsLT5kaXNhYmxlKGRldik7CisKKwkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCQlmcmVlX2lycShpcnEsIGluZm8pOworCisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCQlpb3VubWFwKHBhci0+bGNyKTsKKwkJaW91bm1hcChwYXItPmNjcik7CisKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB0bWlvZmJfZHVtcF9yZWdzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCXByaW50ayhLRVJOX0RFQlVHICJsaGNjcjpcbiIpOworI2RlZmluZSBDQ1JfUFIobikJcHJpbnRrKEtFUk5fREVCVUcgIlx0IiAjbiAiID0gXHQlMDR4XG4iLFwKKwkJdG1pb19pb3JlYWQxNihwYXItPmNjciArIENDUl8gIyMgbikpOworCUNDUl9QUihDTUQpOworCUNDUl9QUihSRVZJRCk7CisJQ0NSX1BSKEJBU0VMKTsKKwlDQ1JfUFIoQkFTRUgpOworCUNDUl9QUihVR0NDKTsKKwlDQ1JfUFIoR0NDKTsKKwlDQ1JfUFIoVVNDKTsKKwlDQ1JfUFIoVlJBTVJUQyk7CisJQ0NSX1BSKFZSQU1TQUMpOworCUNDUl9QUihWUkFNQkMpOworI3VuZGVmIENDUl9QUgorCisJcHJpbnRrKEtFUk5fREVCVUcgImxjcjogXG4iKTsKKyNkZWZpbmUgTENSX1BSKG4pCXByaW50ayhLRVJOX0RFQlVHICJcdCIgI24gIiA9IFx0JTA0eFxuIixcCisJCXRtaW9faW9yZWFkMTYocGFyLT5sY3IgKyBMQ1JfICMjIG4pKTsKKwlMQ1JfUFIoVUlTKTsKKwlMQ1JfUFIoVkhQTik7CisJTENSX1BSKENGU0FMKTsKKwlMQ1JfUFIoQ0ZTQUgpOworCUxDUl9QUihDRlMpOworCUxDUl9QUihDRldTKTsKKwlMQ1JfUFIoQkJJRSk7CisJTENSX1BSKEJCSVNDKTsKKwlMQ1JfUFIoQ0NTKTsKKwlMQ1JfUFIoQkJFUyk7CisJTENSX1BSKENNREwpOworCUxDUl9QUihDTURIKTsKKwlMQ1JfUFIoQ0ZDKTsKKwlMQ1JfUFIoQ0NJRkMpOworCUxDUl9QUihIV1QpOworCUxDUl9QUihMQ0RDQ1JDKTsKKwlMQ1JfUFIoTENEQ0MpOworCUxDUl9QUihMQ0RDT1BDKTsKKwlMQ1JfUFIoTENESVMpOworCUxDUl9QUihMQ0RJTSk7CisJTENSX1BSKExDRElFKTsKKwlMQ1JfUFIoR0RTQUwpOworCUxDUl9QUihHRFNBSCk7CisJTENSX1BSKFZIUENMKTsKKwlMQ1JfUFIoVkhQQ0gpOworCUxDUl9QUihHTSk7CisJTENSX1BSKEhUKTsKKwlMQ1JfUFIoSERTKTsKKwlMQ1JfUFIoSFNTKTsKKwlMQ1JfUFIoSFNFKTsKKwlMQ1JfUFIoSE5QKTsKKwlMQ1JfUFIoVlQpOworCUxDUl9QUihWRFMpOworCUxDUl9QUihWU1MpOworCUxDUl9QUihWU0UpOworCUxDUl9QUihDRExOKTsKKwlMQ1JfUFIoSUxOKTsKKwlMQ1JfUFIoU1ApOworCUxDUl9QUihNSVNDKTsKKwlMQ1JfUFIoVklIU1MpOworCUxDUl9QUihWSVZTKTsKKwlMQ1JfUFIoVklWRSk7CisJTENSX1BSKFZJVlNTKTsKKwlMQ1JfUFIoVkNDSVMpOworCUxDUl9QUihWSURXU0FMKTsKKwlMQ1JfUFIoVklEV1NBSCk7CisJTENSX1BSKFZJRFJTQUwpOworCUxDUl9QUihWSURSU0FIKTsKKwlMQ1JfUFIoVklQRERTVCk7CisJTENSX1BSKFZJUERERVQpOworCUxDUl9QUihWSUUpOworCUxDUl9QUihWQ1MpOworCUxDUl9QUihWUEhXQyk7CisJTENSX1BSKFZQSFMpOworCUxDUl9QUihWUFZXQyk7CisJTENSX1BSKFZQVlMpOworCUxDUl9QUihQTEhQSVgpOworCUxDUl9QUihYUyk7CisJTENSX1BSKFhDS0hXKTsKKwlMQ1JfUFIoU1RIUyk7CisJTENSX1BSKFZUMik7CisJTENSX1BSKFlDS1NXKTsKKwlMQ1JfUFIoWVNUUyk7CisJTENSX1BSKFBQT0xTKTsKKwlMQ1JfUFIoUFJFQ1cpOworCUxDUl9QUihWQ0xLSFcpOworCUxDUl9QUihPQyk7CisjdW5kZWYgTENSX1BSCit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0bWlvZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRtaW9mYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXR2YWwgPSAwOworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCisJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CisKKwlpZiAoaW5mby0+ZmJvcHMtPmZiX3N5bmMpCisJCWluZm8tPmZib3BzLT5mYl9zeW5jKGluZm8pOworCisKKwkvKgorCSAqIFRoZSBmYiBzaG91bGQgYmUgdXNhYmxlIGV2ZW4gaWYgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKGFuZCB0aGV5IGFyZQorCSAqIGR1cmluZyBzdXNwZW5kL3Jlc3VtZSkuIFN3aXRjaCB0ZW1wb3JhcnkgdG8gZm9yY2VkIHBvbGxpbmcuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAidG1pb2ZiOiBzd2l0Y2hpbmcgdG8gcG9sbGluZ1xuIik7CisJcGFyLT51c2VfcG9sbGluZyA9IHRydWU7CisJdG1pb2ZiX2h3X3N0b3AoZGV2KTsKKworCWlmIChjZWxsLT5zdXNwZW5kKQorCQlyZXR2YWwgPSBjZWxsLT5zdXNwZW5kKGRldik7CisKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHRtaW9mYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXR2YWw7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisKKwlpZiAoY2VsbC0+cmVzdW1lKSB7CisJCXJldHZhbCA9IGNlbGwtPnJlc3VtZShkZXYpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJfQorCisJdG1pb2ZiX2lycSgtMSwgaW5mbyk7CisKKwl0bWlvZmJfaHdfaW5pdChkZXYpOworCisJdG1pb2ZiX2h3X21vZGUoZGV2KTsKKworCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOworb3V0OgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2Vsc2UKKyNkZWZpbmUgdG1pb2ZiX3N1c3BlbmQJTlVMTAorI2RlZmluZSB0bWlvZmJfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0bWlvZmJfZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJ0bWlvLWZiIiwKKwkuZHJpdmVyLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IHRtaW9mYl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRtaW9mYl9yZW1vdmUpLAorCS5zdXNwZW5kCT0gdG1pb2ZiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0bWlvZmJfcmVzdW1lLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBfX2luaXQgdG1pb2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCS8qCisJCSAqIEZJWE1FCisJCSAqLworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB0bWlvZmJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwljaGFyICpvcHRpb24gPSBOVUxMOworCisJaWYgKGZiX2dldF9vcHRpb25zKCJ0bWlvZmIiLCAmb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJdG1pb2ZiX3NldHVwKG9wdGlvbik7CisjZW5kaWYKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0bWlvZmJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRtaW9mYl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRtaW9mYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bWlvZmJfaW5pdCk7Cittb2R1bGVfZXhpdCh0bWlvZmJfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVE1JTyBmcmFtZWJ1ZmZlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzIEh1bWJlcnQsIERpcmsgT3BmZXIsIERtaXRyeSBCYXJ5c2hrb3YiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdXZlc2FmYi5jIGIvZHJpdmVycy92aWRlby91dmVzYWZiLmMKaW5kZXggNTA3NDQyMi4uNmMyZDM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby91dmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby91dmVzYWZiLmMKQEAgLTUxNiwxMCArNTE2LDEyIEBACiAKIAkJZXJyID0gdXZlc2FmYl9leGVjKHRhc2spOwogCQlpZiAoZXJyIHx8ICh0YXNrLT50LnJlZ3MuZWF4ICYgMHhmZmZmKSAhPSAweDAwNGYpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidXZlc2FmYjogR2V0dGluZyBtb2RlIGluZm8gYmxvY2sgIgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidXZlc2FmYjogR2V0dGluZyBtb2RlIGluZm8gYmxvY2sgIgogCQkJCSJmb3IgbW9kZSAweCV4IGZhaWxlZCAoZWF4PTB4JXgsIGVycj0lZClcbiIsCiAJCQkJKm1vZGUsICh1MzIpdGFzay0+dC5yZWdzLmVheCwgZXJyKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJbW9kZSsrOworCQkJcGFyLT52YmVfbW9kZXNfY250LS07CisJCQljb250aW51ZTsKIAkJfQogCiAJCW1pYiA9IHRhc2stPmJ1ZjsKQEAgLTU0OCw3ICs1NTAsMTAgQEAKIAkJCW1pYi0+ZGVwdGggPSBtaWItPmJpdHNfcGVyX3BpeGVsOwogCX0KIAotCXJldHVybiAwOworCWlmIChwYXItPnZiZV9tb2Rlc19jbnQgPiAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwppbmRleCBlMzFiY2E4Li41YjI5Mzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwpAQCAtNTgsNyArNTgsNiBAQAogCQl1bnNpZ25lZCBjaGFyCUNsb2NraW5nTW9kZTsJICAvKiBTZXEtQ29udHJvbGxlcjowMWggKi8KIAl9IHZnYV9zdGF0ZTsKIAlzdHJ1Y3Qgdmdhc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IG11dGV4IG9wZW5fbG9jazsKIAl1bnNpZ25lZCBpbnQgcmVmX2NvdW50OwogCWludCBwYWxldHRlX2JsYW5rZWQsIHZlc2FfYmxhbmtlZCwgbW9kZSwgaXNWR0E7CiAJdTggbWlzYywgcGVsX21zaywgdnNzLCBjbGtkaXY7CkBAIC0yODYsNyArMjg1LDYgQEAKIHsKIAlzdHJ1Y3QgdmdhMTZmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCW11dGV4X2xvY2soJnBhci0+b3Blbl9sb2NrKTsKIAlpZiAoIXBhci0+cmVmX2NvdW50KSB7CiAJCW1lbXNldCgmcGFyLT5zdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB2Z2FzdGF0ZSkpOwogCQlwYXItPnN0YXRlLmZsYWdzID0gVkdBX1NBVkVfRk9OVFMgfCBWR0FfU0FWRV9NT0RFIHwKQEAgLTI5NCw3ICsyOTIsNiBAQAogCQlzYXZlX3ZnYSgmcGFyLT5zdGF0ZSk7CiAJfQogCXBhci0+cmVmX2NvdW50Kys7Ci0JbXV0ZXhfdW5sb2NrKCZwYXItPm9wZW5fbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMywxNSArMzAwLDEyIEBACiB7CiAJc3RydWN0IHZnYTE2ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQltdXRleF9sb2NrKCZwYXItPm9wZW5fbG9jayk7Ci0JaWYgKCFwYXItPnJlZl9jb3VudCkgewotCQltdXRleF91bmxvY2soJnBhci0+b3Blbl9sb2NrKTsKKwlpZiAoIXBhci0+cmVmX2NvdW50KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlpZiAocGFyLT5yZWZfY291bnQgPT0gMSkKIAkJcmVzdG9yZV92Z2EoJnBhci0+c3RhdGUpOwogCXBhci0+cmVmX2NvdW50LS07Ci0JbXV0ZXhfdW5sb2NrKCZwYXItPm9wZW5fbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMjYsNyArMTMyMCw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAidmdhMTZmYjogbWFwcGVkIHRvIDB4JXBcbiIsIGluZm8tPnNjcmVlbl9iYXNlKTsKIAlwYXIgPSBpbmZvLT5wYXI7CiAKLQltdXRleF9pbml0KCZwYXItPm9wZW5fbG9jayk7CiAJcGFyLT5pc1ZHQSA9IHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0E7CiAJcGFyLT5wYWxldHRlX2JsYW5rZWQgPSAwOwogCXBhci0+dmVzYV9ibGFua2VkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby92aWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzM2I0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFZJQSBmcmFtZWJ1ZmZlciBkcml2ZXIgKGZvciBMaW51eCBLZXJuZWwgMi42KQorIworCitvYmotJChDT05GSUdfRkJfVklBKSArPSB2aWFmYi5vCisKK3ZpYWZiLXkJOj12aWFmYmRldi5vIGh3Lm8gaWZhY2UubyAgdmlhX2kyYy5vIGR2aS5vIGxjZC5vIGlvY3RsLm8gYWNjZWwubyB2aWFfdXRpbGl0eS5vIHZ0MTYzNi5vIGdsb2JhbC5vIHRibERQQVNldHRpbmcubyB2aWFtb2RlLm8gdGJsMTYzNi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9hY2NlbC5jIGIvZHJpdmVycy92aWRlby92aWEvYWNjZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI1MjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvYWNjZWwuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlICJnbG9iYWwuaCIKKwordm9pZCB2aWFmYl9pbml0X2FjY2VsKHZvaWQpCit7CisJdmlhcGFyaW5mby0+ZmJtZW1fZnJlZSAtPSBDVVJTT1JfU0laRTsKKwl2aWFwYXJpbmZvLT5jdXJzb3Jfc3RhcnQgPSB2aWFwYXJpbmZvLT5mYm1lbV9mcmVlOworCXZpYXBhcmluZm8tPmZibWVtX3VzZWQgKz0gQ1VSU09SX1NJWkU7CisKKwkvKiBSZXZlcnNlIDgqMTAyNCBtZW1vcnkgc3BhY2UgZm9yIGN1cnNvciBpbWFnZSAqLworCXZpYXBhcmluZm8tPmZibWVtX2ZyZWUgLT0gKENVUlNPUl9TSVpFICsgVlFfU0laRSk7CisJdmlhcGFyaW5mby0+VlFfc3RhcnQgPSB2aWFwYXJpbmZvLT5mYm1lbV9mcmVlOworCXZpYXBhcmluZm8tPlZRX2VuZCA9IHZpYXBhcmluZm8tPlZRX3N0YXJ0ICsgVlFfU0laRSAtIDE7CisJdmlhcGFyaW5mby0+ZmJtZW1fdXNlZCArPSAoQ1VSU09SX1NJWkUgKyBWUV9TSVpFKTsgfQorCit2b2lkIHZpYWZiX2luaXRfMmRfZW5naW5lKHZvaWQpCit7CisJdTMyIGR3VlFTdGFydEFkZHIsIGR3VlFFbmRBZGRyOworCXUzMiBkd1ZRTGVuLCBkd1ZRU3RhcnRMLCBkd1ZRRW5kTCwgZHdWUVN0YXJ0RW5kSDsKKworCS8qIGluaXQgMkQgZW5naW5lIHJlZ3MgdG8gcmVzZXQgMkQgZW5naW5lICovCisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfR0VNT0RFKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TUkNQT1MpOworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RTVFBPUyk7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfRElNRU5TSU9OKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19QQVRBRERSKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19GR0NPTE9SKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19CR0NPTE9SKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DTElQVEwpOworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NMSVBCUik7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfT0ZGU0VUKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19LRVlDT05UUk9MKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TUkNCQVNFKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19EU1RCQVNFKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19QSVRDSCk7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfTU9OT1BBVDEpOworCisJLyogSW5pdCBBR1AgYW5kIFZRIHJlZ3MgKi8KKwlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCXdyaXRlbCgweDAwMTAwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU0VUKTsKKwkJd3JpdGVsKDB4NjgwQTAwMDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NSX1RSQU5TUEFDRSk7CisJCXdyaXRlbCgweDAyMDAwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU1BBQ0UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXdyaXRlbCgweDAwMTAwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU0VUKTsKKwkJd3JpdGVsKDB4MDAwMDAwMDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCXdyaXRlbCgweDAwMzMzMDA0LCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQl3cml0ZWwoMHg2MDAwMDAwMCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJd3JpdGVsKDB4NjEwMDAwMDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCXdyaXRlbCgweDYyMDAwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQl3cml0ZWwoMHg2MzAwMDAwMCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJd3JpdGVsKDB4NjQwMDAwMDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCXdyaXRlbCgweDdEMDAwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCisJCXdyaXRlbCgweEZFMDIwMDAwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU0VUKTsKKwkJd3JpdGVsKDB4MDAwMDAwMDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCWJyZWFrOworCX0KKwlpZiAodmlhcGFyaW5mby0+VlFfc3RhcnQgIT0gMCkgeworCQkvKiBFbmFibGUgVlEgKi8KKwkJZHdWUVN0YXJ0QWRkciA9IHZpYXBhcmluZm8tPlZRX3N0YXJ0OworCQlkd1ZRRW5kQWRkciA9IHZpYXBhcmluZm8tPlZRX2VuZDsKKworCQlkd1ZRU3RhcnRMID0gMHg1MDAwMDAwMCB8IChkd1ZRU3RhcnRBZGRyICYgMHhGRkZGRkYpOworCQlkd1ZRRW5kTCA9IDB4NTEwMDAwMDAgfCAoZHdWUUVuZEFkZHIgJiAweEZGRkZGRik7CisJCWR3VlFTdGFydEVuZEggPSAweDUyMDAwMDAwIHwKKwkJCSgoZHdWUVN0YXJ0QWRkciAmIDB4RkYwMDAwMDApID4+IDI0KSB8CisJCQkoKGR3VlFFbmRBZGRyICYgMHhGRjAwMDAwMCkgPj4gMTYpOworCQlkd1ZRTGVuID0gMHg1MzAwMDAwMCB8IChWUV9TSVpFID4+IDMpOworCQlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJCWR3VlFTdGFydEwgfD0gMHgyMDAwMDAwMDsKKwkJCWR3VlFFbmRMIHw9IDB4MjAwMDAwMDA7CisJCQlkd1ZRU3RhcnRFbmRIIHw9IDB4MjAwMDAwMDA7CisJCQlkd1ZRTGVuIHw9IDB4MjAwMDAwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfSzhNODkwOgorCQljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCQl3cml0ZWwoMHgwMDEwMDAwMCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU0VUKTsKKwkJCXdyaXRlbChkd1ZRU3RhcnRFbmRILAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NSX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoZHdWUVN0YXJ0TCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU1BBQ0UpOworCQkJd3JpdGVsKGR3VlFFbmRMLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NSX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoZHdWUUxlbiwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4NzQzMDEwMDEsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1JfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDAwMDAwMDAwLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NSX1RSQU5TUEFDRSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXdyaXRlbCgweDAwRkUwMDAwLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TRVQpOworCQkJd3JpdGVsKDB4MDgwMDAzRkUsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDBBMDAwMjdDLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHgwQjAwMDI2MCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4MEMwMDAyNzQsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDBEMDAwMjY0LAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHgwRTAwMDAwMCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4MEYwMDAwMjAsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDEwMDAwMjdFLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHgxMTAwMDJGRSwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4MjAwRjAwNjAsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKworCQkJd3JpdGVsKDB4MDAwMDAwMDYsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDQwMDA4QzBGLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHg0NDAwMDAwMCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4NDUwODBDMDQsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDQ2ODAwNDA4LAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisKKwkJCXdyaXRlbChkd1ZRU3RhcnRFbmRILAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoZHdWUVN0YXJ0TCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKGR3VlFFbmRMLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoZHdWUUxlbiwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIFZRICovCisJCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwkJY2FzZSBVTklDSFJPTUVfUDRNOTAwOgorCQkJd3JpdGVsKDB4MDAxMDAwMDAsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1JfVFJBTlNFVCk7CisJCQl3cml0ZWwoMHg3NDMwMTAwMCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DUl9UUkFOU1BBQ0UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3cml0ZWwoMHgwMEZFMDAwMCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU0VUKTsKKwkJCXdyaXRlbCgweDAwMDAwMDA0LAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHg0MDAwOEMwRiwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJd3JpdGVsKDB4NDQwMDAwMDAsCisJCQkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfVFJBTlNQQUNFKTsKKwkJCXdyaXRlbCgweDQ1MDgwQzA0LAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1RSQU5TUEFDRSk7CisJCQl3cml0ZWwoMHg0NjgwMDQwOCwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19UUkFOU1BBQ0UpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2aWFmYl9zZXRfMmRfY29sb3JfZGVwdGgodmlhcGFyaW5mby0+YnBwKTsKKworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1NSQ0JBU0UpOworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RTVEJBU0UpOworCisJd3JpdGVsKFZJQV9QSVRDSF9FTkFCTEUgfAorCQkgICAoKCh2aWFwYXJpbmZvLT5ocmVzICoKKwkJICAgICAgdmlhcGFyaW5mby0+YnBwID4+IDMpID4+IDMpIHwgKCgodmlhcGFyaW5mby0+aHJlcyAqCisJCQkJCQkgICB2aWFwYXJpbmZvLT4KKwkJCQkJCSAgIGJwcCA+PiAzKSA+PiAzKSA8PCAxNikpLAorCQkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19QSVRDSCk7Cit9CisKK3ZvaWQgdmlhZmJfc2V0XzJkX2NvbG9yX2RlcHRoKGludCBicHApCit7CisJdTMyIGR3R0VNb2RlOworCisJZHdHRU1vZGUgPSByZWFkbCh2aWFwYXJpbmZvLT5pb192aXJ0ICsgMHgwNCkgJiAweEZGRkZGQ0ZGOworCisJc3dpdGNoIChicHApIHsKKwljYXNlIDE2OgorCQlkd0dFTW9kZSB8PSBWSUFfR0VNXzE2YnBwOworCQlicmVhazsKKwljYXNlIDMyOgorCQlkd0dFTW9kZSB8PSBWSUFfR0VNXzMyYnBwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkd0dFTW9kZSB8PSBWSUFfR0VNXzhicHA7CisJCWJyZWFrOworCX0KKworCS8qIFNldCBCUFAgYW5kIFBpdGNoICovCisJd3JpdGVsKGR3R0VNb2RlLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19HRU1PREUpOworfQorCit2b2lkIHZpYWZiX2h3X2N1cnNvcl9pbml0KHZvaWQpCit7CisJLyogU2V0IEN1cnNvciBJbWFnZSBCYXNlIEFkZHJlc3MgKi8KKwl3cml0ZWwodmlhcGFyaW5mby0+Y3Vyc29yX3N0YXJ0LAorCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfTU9ERSk7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1VSU09SX1BPUyk7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1VSU09SX09SRyk7CisJd3JpdGVsKDB4MCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1VSU09SX0JHKTsKKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfRkcpOworfQorCit2b2lkIHZpYWZiX3Nob3dfaHdfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgU3RhdHVzKQoreworCXUzMiB0ZW1wOworCXUzMiBpZ2FfcGF0aCA9ICgoc3RydWN0IHZpYWZiX3BhciAqKShpbmZvLT5wYXIpKS0+aWdhX3BhdGg7CisKKwl0ZW1wID0gcmVhZGwodmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQ1VSU09SX01PREUpOworCXN3aXRjaCAoU3RhdHVzKSB7CisJY2FzZSBIV19DdXJzb3JfT046CisJCXRlbXAgfD0gMHgxOworCQlicmVhazsKKwljYXNlIEhXX0N1cnNvcl9PRkY6CisJCXRlbXAgJj0gMHhGRkZGRkZGRTsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAoaWdhX3BhdGgpIHsKKwljYXNlIElHQTI6CisJCXRlbXAgfD0gMHg4MDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBJR0ExOgorCWRlZmF1bHQ6CisJCXRlbXAgJj0gMHg3RkZGRkZGRjsKKwl9CisJd3JpdGVsKHRlbXAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NVUlNPUl9NT0RFKTsKK30KKworaW50IHZpYWZiX3dhaXRfZW5naW5lX2lkbGUodm9pZCkKK3sKKwlpbnQgbG9vcCA9IDA7CisKKwl3aGlsZSAoIShyZWFkbCh2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TVEFUVVMpICYKKwkJCVZJQV9WUl9RVUVVRV9CVVNZKSAmJiAobG9vcCsrIDwgTUFYTE9PUCkpCisJCWNwdV9yZWxheCgpOworCisJd2hpbGUgKChyZWFkbCh2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TVEFUVVMpICYKKwkJICAgIChWSUFfQ01EX1JHVFJfQlVTWSB8IFZJQV8yRF9FTkdfQlVTWSB8IFZJQV8zRF9FTkdfQlVTWSkpICYmCisJCSAgICAobG9vcCsrIDwgTUFYTE9PUCkpCisJCWNwdV9yZWxheCgpOworCisJcmV0dXJuIGxvb3AgPj0gTUFYTE9PUDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2FjY2VsLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS9hY2NlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmY4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9hY2NlbC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQUNDRUxfSF9fCisjZGVmaW5lIF9fQUNDRUxfSF9fCisKKyNkZWZpbmUgRkJfQUNDRUxfVklBX1VOSUNIUk9NRSAgNTAKKworLyogTU1JTyBCYXNlIEFkZHJlc3MgRGVmaW5pdGlvbiAqLworI2RlZmluZSBNTUlPX1ZHQUJBU0UgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIE1NSU9fQ1JfUkVBRCAgICAgICAgICAgICAgICAoTU1JT19WR0FCQVNFICsgMHgzRDQpCisjZGVmaW5lIE1NSU9fQ1JfV1JJVEUgICAgICAgICAgICAgICAoTU1JT19WR0FCQVNFICsgMHgzRDUpCisjZGVmaW5lIE1NSU9fU1JfUkVBRCAgICAgICAgICAgICAgICAoTU1JT19WR0FCQVNFICsgMHgzQzQpCisjZGVmaW5lIE1NSU9fU1JfV1JJVEUgICAgICAgICAgICAgICAoTU1JT19WR0FCQVNFICsgMHgzQzUpCisKKy8qIEhXIEN1cnNvciBTdGF0dXMgRGVmaW5lICovCisjZGVmaW5lIEhXX0N1cnNvcl9PTiAgICAwCisjZGVmaW5lIEhXX0N1cnNvcl9PRkYgICAxCisKKyNkZWZpbmUgQ1VSU09SX1NJWkUgICAgICg4ICogMTAyNCkKKyNkZWZpbmUgVlFfU0laRSAgICAgICAgICgyNTYgKiAxMDI0KQorCisjZGVmaW5lIFZJQV9NTUlPX0JMVEJBU0UgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFZJQV9NTUlPX0JMVFNJWkUgICAgICAgIDB4MjAwMDAwCisKKy8qIERlZmluZXMgZm9yIDJEIHJlZ2lzdGVycyAqLworI2RlZmluZSBWSUFfUkVHX0dFQ01EICAgICAgICAgICAweDAwMAorI2RlZmluZSBWSUFfUkVHX0dFTU9ERSAgICAgICAgICAweDAwNAorI2RlZmluZSBWSUFfUkVHX1NSQ1BPUyAgICAgICAgICAweDAwOAorI2RlZmluZSBWSUFfUkVHX0RTVFBPUyAgICAgICAgICAweDAwQworLyogd2lkdGggYW5kIGhlaWdodCAqLworI2RlZmluZSBWSUFfUkVHX0RJTUVOU0lPTiAgICAgICAweDAxMAorI2RlZmluZSBWSUFfUkVHX1BBVEFERFIgICAgICAgICAweDAxNAorI2RlZmluZSBWSUFfUkVHX0ZHQ09MT1IgICAgICAgICAweDAxOAorI2RlZmluZSBWSUFfUkVHX0JHQ09MT1IgICAgICAgICAweDAxQworLyogdG9wIGFuZCBsZWZ0IG9mIGNsaXBwaW5nICovCisjZGVmaW5lIFZJQV9SRUdfQ0xJUFRMICAgICAgICAgIDB4MDIwCisvKiBib3R0b20gYW5kIHJpZ2h0IG9mIGNsaXBwaW5nICovCisjZGVmaW5lIFZJQV9SRUdfQ0xJUEJSICAgICAgICAgIDB4MDI0CisjZGVmaW5lIFZJQV9SRUdfT0ZGU0VUICAgICAgICAgIDB4MDI4CisvKiBjb2xvciBrZXkgY29udHJvbCAqLworI2RlZmluZSBWSUFfUkVHX0tFWUNPTlRST0wgICAgICAweDAyQworI2RlZmluZSBWSUFfUkVHX1NSQ0JBU0UgICAgICAgICAweDAzMAorI2RlZmluZSBWSUFfUkVHX0RTVEJBU0UgICAgICAgICAweDAzNAorLyogcGl0Y2ggb2Ygc3JjIGFuZCBkc3QgKi8KKyNkZWZpbmUgVklBX1JFR19QSVRDSCAgICAgICAgICAgMHgwMzgKKyNkZWZpbmUgVklBX1JFR19NT05PUEFUMCAgICAgICAgMHgwM0MKKyNkZWZpbmUgVklBX1JFR19NT05PUEFUMSAgICAgICAgMHgwNDAKKy8qIGZyb20gMHgxMDAgdG8gMHgxZmYgKi8KKyNkZWZpbmUgVklBX1JFR19DT0xPUlBBVCAgICAgICAgMHgxMDAKKworLyogVklBX1JFR19QSVRDSCgweDM4KTogUGl0Y2ggU2V0dGluZyAqLworI2RlZmluZSBWSUFfUElUQ0hfRU5BQkxFICAgICAgICAweDgwMDAwMDAwCisKKy8qIGRlZmluZXMgZm9yIFZJQSBIVyBjdXJzb3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZJQV9SRUdfQ1VSU09SX01PREUgICAgIDB4MkQwCisjZGVmaW5lIFZJQV9SRUdfQ1VSU09SX1BPUyAgICAgIDB4MkQ0CisjZGVmaW5lIFZJQV9SRUdfQ1VSU09SX09SRyAgICAgIDB4MkQ4CisjZGVmaW5lIFZJQV9SRUdfQ1VSU09SX0JHICAgICAgIDB4MkRDCisjZGVmaW5lIFZJQV9SRUdfQ1VSU09SX0ZHICAgICAgIDB4MkUwCisKKy8qIFZJQV9SRUdfR0VNT0RFKDB4MDQpOiBHRSBtb2RlICovCisjZGVmaW5lIFZJQV9HRU1fOGJwcCAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFTV8xNmJwcCAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBWSUFfR0VNXzMyYnBwICAgICAgICAgICAweDAwMDAwMzAwCisKKy8qIFZJQV9SRUdfR0VDTUQoMHgwMCk6IDJEIEVuZ2luZSBDb21tYW5kICAqLworI2RlZmluZSBWSUFfR0VDX05PT1AgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFZJQV9HRUNfQkxUICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVklBX0dFQ19MSU5FICAgICAgICAgICAgMHgwMDAwMDAwNQorCisvKiBSb3RhdGUgQ29tbWFuZCAqLworI2RlZmluZSBWSUFfR0VDX1JPVCAgICAgICAgICAgICAweDAwMDAwMDA4CisKKyNkZWZpbmUgVklBX0dFQ19TUkNfWFkgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBWSUFfR0VDX1NSQ19MSU5FQVIgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFZJQV9HRUNfRFNUX1hZICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFQ19EU1RfTElOUkFUICAgICAgMHgwMDAwMDAyMAorCisjZGVmaW5lIFZJQV9HRUNfU1JDX0ZCICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFQ19TUkNfU1lTICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBWSUFfR0VDX0RTVF9GQiAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFZJQV9HRUNfRFNUX1NZUyAgICAgICAgIDB4MDAwMDAwODAKKworLyogc291cmNlIGlzIG1vbm8gKi8KKyNkZWZpbmUgVklBX0dFQ19TUkNfTU9OTyAgICAgICAgMHgwMDAwMDEwMAorLyogcGF0dGVybiBpcyBtb25vICovCisjZGVmaW5lIFZJQV9HRUNfUEFUX01PTk8gICAgICAgIDB4MDAwMDAyMDAKKy8qIG1vbm8gc3JjIGlzIG9wYXF1ZSAqLworI2RlZmluZSBWSUFfR0VDX01TUkNfT1BBUVVFICAgICAweDAwMDAwMDAwCisvKiBtb25vIHNyYyBpcyB0cmFuc3BhcmVudCAqLworI2RlZmluZSBWSUFfR0VDX01TUkNfVFJBTlMgICAgICAweDAwMDAwNDAwCisvKiBwYXR0ZXJuIGlzIGluIGZyYW1lIGJ1ZmZlciAqLworI2RlZmluZSBWSUFfR0VDX1BBVF9GQiAgICAgICAgICAweDAwMDAwMDAwCisvKiBwYXR0ZXJuIGlzIGZyb20gcmVnIHNldHRpbmcgKi8KKyNkZWZpbmUgVklBX0dFQ19QQVRfUkVHICAgICAgICAgMHgwMDAwMDgwMAorCisjZGVmaW5lIFZJQV9HRUNfQ0xJUF9ESVNBQkxFICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFQ19DTElQX0VOQUJMRSAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIFZJQV9HRUNfRklYQ09MT1JfUEFUICAgIDB4MDAwMDIwMDAKKworI2RlZmluZSBWSUFfR0VDX0lOQ1ggICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFZJQV9HRUNfREVDWSAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVklBX0dFQ19JTkNZICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBWSUFfR0VDX0RFQ1ggICAgICAgICAgICAweDAwMDA4MDAwCisvKiBtb25vIHBhdHRlcm4gaXMgb3BhcXVlICovCisjZGVmaW5lIFZJQV9HRUNfTVBBVF9PUEFRVUUgICAgIDB4MDAwMDAwMDAKKy8qIG1vbm8gcGF0dGVybiBpcyB0cmFuc3BhcmVudCAqLworI2RlZmluZSBWSUFfR0VDX01QQVRfVFJBTlMgICAgICAweDAwMDEwMDAwCisKKyNkZWZpbmUgVklBX0dFQ19NT05PX1VOUEFDSyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBWSUFfR0VDX01PTk9fUEFDSyAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFZJQV9HRUNfTU9OT19EV09SRCAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFQ19NT05PX1dPUkQgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBWSUFfR0VDX01PTk9fQllURSAgICAgICAweDAwMDgwMDAwCisKKyNkZWZpbmUgVklBX0dFQ19MQVNUUElYRUxfT04gICAgMHgwMDAwMDAwMAorI2RlZmluZSBWSUFfR0VDX0xBU1RQSVhFTF9PRkYgICAweDAwMTAwMDAwCisjZGVmaW5lIFZJQV9HRUNfWF9NQUpPUiAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVklBX0dFQ19ZX01BSk9SICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBWSUFfR0VDX1FVSUNLX1NUQVJUICAgICAweDAwODAwMDAwCisKKy8qIGRlZmluZXMgZm9yIFZJQSAzRCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVklBX1JFR19TVEFUVVMgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgVklBX1JFR19DUl9UUkFOU0VUICAgICAgMHg0MUMKKyNkZWZpbmUgVklBX1JFR19DUl9UUkFOU1BBQ0UJMHg0MjAKKyNkZWZpbmUgVklBX1JFR19UUkFOU0VUICAgICAgICAgMHg0M0MKKyNkZWZpbmUgVklBX1JFR19UUkFOU1BBQ0UgICAgICAgMHg0NDAKKworLyogVklBX1JFR19TVEFUVVMoMHg0MDApOiBFbmdpbmUgU3RhdHVzICovCisKKy8qIENvbW1hbmQgUmVndWxhdG9yIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBX0NNRF9SR1RSX0JVU1kgICAgICAgMHgwMDAwMDA4MAorLyogMkQgRW5naW5lIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBXzJEX0VOR19CVVNZICAgICAgICAgMHgwMDAwMDAwMgorLyogM0QgRW5naW5lIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBXzNEX0VOR19CVVNZICAgICAgICAgMHgwMDAwMDAwMQorLyogVmlydHVhbCBRdWV1ZSBpcyBidXN5ICovCisjZGVmaW5lIFZJQV9WUl9RVUVVRV9CVVNZICAgICAgIDB4MDAwMjAwMDAKKworI2RlZmluZSBNQVhMT09QICAgICAgICAgICAgICAgICAweEZGRkZGRgorCit2b2lkIHZpYWZiX2luaXRfYWNjZWwodm9pZCk7Cit2b2lkIHZpYWZiX2luaXRfMmRfZW5naW5lKHZvaWQpOwordm9pZCBzZXRfMmRfY29sb3JfZGVwdGgoaW50KTsKK3ZvaWQgdmlhZmJfaHdfY3Vyc29yX2luaXQodm9pZCk7Cit2b2lkIHZpYWZiX3Nob3dfaHdfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgU3RhdHVzKTsgaW50Cit2aWFmYl93YWl0X2VuZ2luZV9pZGxlKHZvaWQpOyB2b2lkIHZpYWZiX3NldF8yZF9jb2xvcl9kZXB0aChpbnQgYnBwKTsKKworI2VuZGlmIC8qIF9fQUNDRUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9jaGlwLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS9jaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlOTVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2NoaXAuaApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19DSElQX0hfXworI2RlZmluZSBfX0NISVBfSF9fCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlZmluaXRpb24gR3JhcGhpYyBDaGlwIEluZm9ybWF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lICAgICBQQ0lfVklBX1ZFTkRPUl9JRCAgICAgICAweDExMDYKKworLyogRGVmaW5lIFZJQSBHcmFwaGljIENoaXAgTmFtZSAqLworI2RlZmluZSAgICAgVU5JQ0hST01FX0NMRTI2NiAgICAgICAgMQorI2RlZmluZSAgICAgVU5JQ0hST01FX0NMRTI2Nl9ESUQgICAgMHgzMTIyCisjZGVmaW5lICAgICBDTEUyNjZfUkVWSVNJT05fQVggICAgICAweDBBCisjZGVmaW5lICAgICBDTEUyNjZfUkVWSVNJT05fQ1ggICAgICAweDBDCisKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9LNDAwICAgICAgICAgIDIKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9LNDAwX0RJRCAgICAgIDB4NzIwNQorCisjZGVmaW5lICAgICBVTklDSFJPTUVfSzgwMCAgICAgICAgICAzCisjZGVmaW5lICAgICBVTklDSFJPTUVfSzgwMF9ESUQgICAgICAweDMxMDgKKworI2RlZmluZSAgICAgVU5JQ0hST01FX1BNODAwICAgICAgICAgNAorI2RlZmluZSAgICAgVU5JQ0hST01FX1BNODAwX0RJRCAgICAgMHgzMTE4CisKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9DTjcwMCAgICAgICAgIDUKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9DTjcwMF9ESUQgICAgIDB4MzM0NAorCisjZGVmaW5lICAgICBVTklDSFJPTUVfQ1g3MDAgICAgICAgICA2CisjZGVmaW5lICAgICBVTklDSFJPTUVfQ1g3MDBfRElEICAgICAweDMxNTcKKyNkZWZpbmUgICAgIENYNzAwX1JFVklTSU9OXzcwMCAgICAgIDB4MAorI2RlZmluZSAgICAgQ1g3MDBfUkVWSVNJT05fNzAwTSAgICAgMHgxCisjZGVmaW5lICAgICBDWDcwMF9SRVZJU0lPTl83MDBNMiAgICAweDIKKworI2RlZmluZSAgICAgVU5JQ0hST01FX0NONzUwICAgICAgICAgNworI2RlZmluZSAgICAgVU5JQ0hST01FX0NONzUwX0RJRCAgICAgMHgzMjI1CisKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9LOE04OTAgICAgICAgIDgKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9LOE04OTBfRElEICAgIDB4MzIzMAorCisjZGVmaW5lICAgICBVTklDSFJPTUVfUDRNODkwICAgICAgICA5CisjZGVmaW5lICAgICBVTklDSFJPTUVfUDRNODkwX0RJRCAgICAweDMzNDMKKworI2RlZmluZSAgICAgVU5JQ0hST01FX1A0TTkwMCAgICAgICAgMTAKKyNkZWZpbmUgICAgIFVOSUNIUk9NRV9QNE05MDBfRElEICAgIDB4MzM3MQorCisjZGVmaW5lICAgICBVTklDSFJPTUVfVlg4MDAgICAgICAgICAxMQorI2RlZmluZSAgICAgVU5JQ0hST01FX1ZYODAwX0RJRCAgICAgMHgxMTIyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlZmluaXRpb24gVE1EUyBUcmFzbWl0dGVyIEluZm9ybWF0aW9uICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5pdGlvbiBUTURTIFRyYXNtaXR0ZXIgSW5kZXggKi8KKyNkZWZpbmUgICAgIE5PTl9UTURTX1RSQU5TTUlUVEVSICAgIDB4MDAKKyNkZWZpbmUgICAgIFZUMTYzMl9UTURTICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIElOVEVHUkFURURfVE1EUyAgICAgICAgIDB4NDIKKworLyogRGVmaW5pdGlvbiBUTURTIFRyYXNtaXR0ZXIgSTJDIFNsYXZlIEFkZHJlc3MgKi8KKyNkZWZpbmUgICAgIFZUMTYzMl9UTURTX0kyQ19BRERSICAgIDB4MTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVmaW5pdGlvbiBMVkRTIFRyYXNtaXR0ZXIgSW5mb3JtYXRpb24gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbml0aW9uIExWRFMgVHJhc21pdHRlciBJbmRleCAqLworI2RlZmluZSAgICAgTk9OX0xWRFNfVFJBTlNNSVRURVIgICAgMHgwMAorI2RlZmluZSAgICAgVlQxNjMxX0xWRFMgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgVlQxNjM2X0xWRFMgICAgICAgICAgICAgMHgwRQorI2RlZmluZSAgICAgSU5URUdSQVRFRF9MVkRTICAgICAgICAgMHg0MQorCisvKiBEZWZpbml0aW9uIERpZ2l0YWwgVHJhbnNtaXR0ZXIgTW9kZSAqLworI2RlZmluZSAgICAgVFhfREFUQV8xMl9CSVRTICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgVFhfREFUQV8yNF9CSVRTICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgVFhfREFUQV9ERFJfTU9ERSAgICAgICAgMHgwNAorI2RlZmluZSAgICAgVFhfREFUQV9TRFJfTU9ERSAgICAgICAgMHgwOAorCisvKiBEZWZpbml0aW9uIExWRFMgVHJhc21pdHRlciBJMkMgU2xhdmUgQWRkcmVzcyAqLworI2RlZmluZSAgICAgVlQxNjMxX0xWRFNfSTJDX0FERFIgICAgMHg3MAorI2RlZmluZSAgICAgVlQzMjcxX0xWRFNfSTJDX0FERFIgICAgMHg4MAorI2RlZmluZSAgICAgVlQxNjM2X0xWRFNfSTJDX0FERFIgICAgMHg4MAorCitzdHJ1Y3QgdG1kc19jaGlwX2luZm9ybWF0aW9uIHsKKwlpbnQgdG1kc19jaGlwX25hbWU7CisJaW50IHRtZHNfY2hpcF9zbGF2ZV9hZGRyOworCWludCBkdmlfcGFuZWxfaWQ7CisJaW50IGRhdGFfbW9kZTsKKwlpbnQgb3V0cHV0X2ludGVyZmFjZTsKKwlpbnQgaTJjX3BvcnQ7CisJaW50IGRldmljZV90eXBlOworfTsKKworc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiB7CisJaW50IGx2ZHNfY2hpcF9uYW1lOworCWludCBsdmRzX2NoaXBfc2xhdmVfYWRkcjsKKwlpbnQgZGF0YV9tb2RlOworCWludCBvdXRwdXRfaW50ZXJmYWNlOworCWludCBpMmNfcG9ydDsKK307CisKK3N0cnVjdCBjaGlwX2luZm9ybWF0aW9uIHsKKwlpbnQgZ2Z4X2NoaXBfbmFtZTsKKwlpbnQgZ2Z4X2NoaXBfcmV2aXNpb247CisJaW50IGNoaXBfb25fc2xvdDsKKwlzdHJ1Y3QgdG1kc19jaGlwX2luZm9ybWF0aW9uIHRtZHNfY2hpcF9pbmZvOworCXN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gbHZkc19jaGlwX2luZm87CisJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiBsdmRzX2NoaXBfaW5mbzI7Cit9OworCitzdHJ1Y3QgY3J0X3NldHRpbmdfaW5mb3JtYXRpb24geworCWludCBpZ2FfcGF0aDsKKwlpbnQgaF9hY3RpdmU7CisJaW50IHZfYWN0aXZlOworCWludCBicHA7CisJaW50IHJlZnJlc2hfcmF0ZTsKK307CisKK3N0cnVjdCB0bWRzX3NldHRpbmdfaW5mb3JtYXRpb24geworCWludCBpZ2FfcGF0aDsKKwlpbnQgaF9hY3RpdmU7CisJaW50IHZfYWN0aXZlOworCWludCBicHA7CisJaW50IHJlZnJlc2hfcmF0ZTsKKwlpbnQgZ2V0X2R2aV9zaXplX21ldGhvZDsKKwlpbnQgbWF4X3BpeGVsX2Nsb2NrOworCWludCBkdmlfcGFuZWxfc2l6ZTsKKwlpbnQgZHZpX3BhbmVsX2hyZXM7CisJaW50IGR2aV9wYW5lbF92cmVzOworCWludCBuYXRpdmVfc2l6ZTsKK307CisKK3N0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24geworCWludCBpZ2FfcGF0aDsKKwlpbnQgaF9hY3RpdmU7CisJaW50IHZfYWN0aXZlOworCWludCBicHA7CisJaW50IHJlZnJlc2hfcmF0ZTsKKwlpbnQgZ2V0X2xjZF9zaXplX21ldGhvZDsKKwlpbnQgbGNkX3BhbmVsX2lkOworCWludCBsY2RfcGFuZWxfc2l6ZTsKKwlpbnQgbGNkX3BhbmVsX2hyZXM7CisJaW50IGxjZF9wYW5lbF92cmVzOworCWludCBkaXNwbGF5X21ldGhvZDsKKwlpbnQgZGV2aWNlX2xjZF9kdWFsZWRnZTsKKwlpbnQgTENERGl0aGVyaW5nOworCWludCBsY2RfbW9kZTsKKwl1MzIgdmNsazsJCS8qcGFuZWwgbW9kZSBjbG9jayB2YWx1ZSAqLworfTsKKworc3RydWN0IEdGWF9EUEFfU0VUVElORyB7CisJaW50IENsa1JhbmdlSW5kZXg7CisJdTggRFZQMDsJCS8qIENSOTZbMzowXSAqLworCXU4IERWUDBEYXRhRHJpX1MxOwkvKiBTUjJBWzVdICAgKi8KKwl1OCBEVlAwRGF0YURyaV9TOwkvKiBTUjFCWzFdICAgKi8KKwl1OCBEVlAwQ2xvY2tEcmlfUzE7CS8qIFNSMkFbNF0gICAqLworCXU4IERWUDBDbG9ja0RyaV9TOwkvKiBTUjFFWzJdICAgKi8KKwl1OCBEVlAxOwkJLyogQ1I5QlszOjBdICovCisJdTggRFZQMURyaXZpbmc7CQkvKiBTUjY1WzM6MF0sIERhdGEgYW5kIENsb2NrIGRyaXZpbmcgKi8KKwl1OCBERlBIaWdoOwkJLyogQ1I5N1szOjBdICovCisJdTggREZQTG93OwkJLyogQ1I5OVszOjBdICovCisKK307CisKK3N0cnVjdCBWVDE2MzZfRFBBX1NFVFRJTkcgeworCWludCBQYW5lbFNpemVJRDsKKwl1OCBDTEtfU0VMX1NUMTsKKwl1OCBDTEtfU0VMX1NUMjsKK307CisjZW5kaWYgLyogX19DSElQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZGVidWcuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlYWNjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2RlYnVnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19ERUJVR19IX18KKyNkZWZpbmUgX19ERUJVR19IX18KKworI2lmbmRlZiBWSUFGQl9ERUJVRworI2RlZmluZSBWSUFGQl9ERUJVRyAwCisjZW5kaWYKKworI2lmIFZJQUZCX0RFQlVHCisjZGVmaW5lIERFQlVHX01TRyhmLCBhLi4uKSAgIHByaW50ayhmLCAjIyBhKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTVNHKGYsIGEuLi4pCisjZW5kaWYKKworI2RlZmluZSBWSUFGQl9XQVJOIDAKKyNpZiBWSUFGQl9XQVJOCisjZGVmaW5lIFdBUk5fTVNHKGYsIGEuLi4pICAgcHJpbnRrKGYsICMjIGEpCisjZWxzZQorI2RlZmluZSBXQVJOX01TRyhmLCBhLi4uKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZHZpLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk2NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmMKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKK3N0YXRpYyB2b2lkIHRtZHNfcmVnaXN0ZXJfd3JpdGUoaW50IGluZGV4LCB1OCBkYXRhKTsKK3N0YXRpYyBpbnQgdG1kc19yZWdpc3Rlcl9yZWFkKGludCBpbmRleCk7CitzdGF0aWMgaW50IHRtZHNfcmVnaXN0ZXJfcmVhZF9ieXRlcyhpbnQgaW5kZXgsIHU4ICpidWZmLCBpbnQgYnVmZl9sZW4pOworc3RhdGljIGludCBjaGVja19yZWR1Y2VfYmxhbmtpbmdfbW9kZShpbnQgbW9kZV9pbmRleCwKKwlpbnQgcmVmcmVzaF9yYXRlKTsKK3N0YXRpYyBpbnQgZHZpX2dldF9wYW5lbF9zaXplX2Zyb21fRERDdjEodm9pZCk7CitzdGF0aWMgaW50IGR2aV9nZXRfcGFuZWxfc2l6ZV9mcm9tX0REQ3YyKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHZpX2dldF9wYW5lbF9pbmZvKHZvaWQpOworc3RhdGljIGludCB2aWFmYl9kdmlfcXVlcnlfRURJRCh2b2lkKTsKKworc3RhdGljIGludCBjaGVja190bWRzX2NoaXAoaW50IGRldmljZV9pZF9zdWJhZGRyLCBpbnQgZGV2aWNlX2lkKQoreworCWlmICh0bWRzX3JlZ2lzdGVyX3JlYWQoZGV2aWNlX2lkX3N1YmFkZHIpID09IGRldmljZV9pZCkKKwkJcmV0dXJuIE9LOworCWVsc2UKKwkJcmV0dXJuIEZBSUw7Cit9CisKK3ZvaWQgdmlhZmJfaW5pdF9kdmlfc2l6ZSh2b2lkKQoreworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2luaXRfZHZpX3NpemUoKVxuIik7CisJREVCVUdfTVNHKEtFUk5fSU5GTworCQkidmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmdldF9kdmlfc2l6ZV9tZXRob2QgJWRcbiIsCisJCSAgdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmdldF9kdmlfc2l6ZV9tZXRob2QpOworCisJc3dpdGNoICh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+Z2V0X2R2aV9zaXplX21ldGhvZCkgeworCWNhc2UgR0VUX0RWSV9TSVpFX0JZX1NZU1RFTV9CSU9TOgorCQlicmVhazsKKwljYXNlIEdFVF9EVklfU1pJRV9CWV9IV19TVFJBUFBJTkc6CisJCWJyZWFrOworCWNhc2UgR0VUX0RWSV9TSVpFX0JZX1ZHQV9CSU9TOgorCWRlZmF1bHQ6CisJCWR2aV9nZXRfcGFuZWxfaW5mbygpOworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCitpbnQgdmlhZmJfdG1kc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBzcjJhID0gMCwgc3IxZSA9IDAsIHNyM2UgPSAwOworCisJLyogVHVybiBvbiBvdXB1dHRpbmcgcGFkICovCisJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJICAgIC8qPSogREZQIExvdyBQYWQgb24gKj0qLworCQlzcjJhID0gdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMkEpOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMHgwMywgQklUMCArIEJJVDEpOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwljYXNlIFVOSUNIUk9NRV9QNE04OTA6CisJCS8qIERGUCBMb3cgUGFkIG9uICovCisJCXNyMmEgPSB2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IyQSk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLCAweDAzLCBCSVQwICsgQklUMSk7CisJCS8qIERWUDAgUGFkIG9uICovCisJCXNyMWUgPSB2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IxRSk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUUsIFZJQVNSLCAweEMwLCBCSVQ2ICsgQklUNyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgLyogRFZQMC9EVlAxIFBhZCBvbiAqLworCQlzcjFlID0gdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMUUpOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFFLCBWSUFTUiwgMHhGMCwgQklUNCArCisJCQlCSVQ1ICsgQklUNiArIEJJVDcpOworCSAgICAvKiBTUjNFWzFdTXVsdGktZnVuY3Rpb24gc2VsZWN0aW9uOgorCSAgICAwID0gRW11bGF0ZSBJMkMgYW5kIEREQyBidXMgYnkgR1BJTzIvMy80LiAqLworCQlzcjNlID0gdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSM0UpOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjNFLCBWSUFTUiwgMHgwLCBCSVQ1KTsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgZm9yIFZUMTYzMjogKi8KKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lID0gVlQxNjMyX1RNRFM7CisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJdG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIgPSBWVDE2MzJfVE1EU19JMkNfQUREUjsKKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLmkyY19wb3J0ID0gSTJDUE9SVElOREVYOworCWlmIChjaGVja190bWRzX2NoaXAoVlQxNjMyX0RFVklDRV9JRF9SRUcsIFZUMTYzMl9ERVZJQ0VfSUQpICE9IEZBSUwpIHsKKwkJLyoKKwkJICogQ3VycmVudGx5IG9ubHkgc3VwcG9ydCAxMmJpdHMsZHVhbCBlZGdlLGFkZCAyNGJpdHMgbW9kZSBsYXRlcgorCQkgKi8KKwkJdG1kc19yZWdpc3Rlcl93cml0ZSgweDA4LCAweDNiKTsKKworCQlERUJVR19NU0coS0VSTl9JTkZPICJcbiBWVDE2MzIgVE1EUyAhIFxuIik7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuICUyZCIsCisJCQkgIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8udG1kc19jaGlwX25hbWUpOworCQlERUJVR19NU0coS0VSTl9JTkZPICJcbiAlMmQiLAorCQkJICB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLmkyY19wb3J0KTsKKwkJcmV0dXJuIE9LOworCX0gZWxzZSB7CisJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8uaTJjX3BvcnQgPSBHUElPUE9SVElOREVYOworCQlpZiAoY2hlY2tfdG1kc19jaGlwKFZUMTYzMl9ERVZJQ0VfSURfUkVHLCBWVDE2MzJfREVWSUNFX0lEKQorCQkgICAgIT0gRkFJTCkgeworCQkJdG1kc19yZWdpc3Rlcl93cml0ZSgweDA4LCAweDNiKTsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuIFZUMTYzMiBUTURTICEgXG4iKTsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuICUyZCIsCisJCQkJICB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQkJCSAgdG1kc19jaGlwX2luZm8udG1kc19jaGlwX25hbWUpOworCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG4gJTJkIiwKKwkJCQkgIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCQkJICB0bWRzX2NoaXBfaW5mby5pMmNfcG9ydCk7CisJCQlyZXR1cm4gT0s7CisJCX0KKwl9CisKKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lID0gSU5URUdSQVRFRF9UTURTOworCisJaWYgKCh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NYNzAwKSAmJgorCSAgICAoKHZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0ID09IEhXX0xBWU9VVF9EVklfT05MWSkgfHwKKwkgICAgICh2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCA9PSBIV19MQVlPVVRfTENEX0RWSSkpKSB7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuIEludGVncmF0ZWQgVE1EUyAhIFxuIik7CisJCXJldHVybiBPSzsKKwl9CisKKwlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwkJdmlhZmJfd3JpdGVfcmVnKFNSMkEsIFZJQVNSLCBzcjJhKTsKKwkJYnJlYWs7CisKKwljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQl2aWFmYl93cml0ZV9yZWcoU1IyQSwgVklBU1IsIHNyMmEpOworCQl2aWFmYl93cml0ZV9yZWcoU1IxRSwgVklBU1IsIHNyMWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXZpYWZiX3dyaXRlX3JlZyhTUjFFLCBWSUFTUiwgc3IxZSk7CisJCXZpYWZiX3dyaXRlX3JlZyhTUjNFLCBWSUFTUiwgc3IzZSk7CisJCWJyZWFrOworCX0KKworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCXRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lID0gTk9OX1RNRFNfVFJBTlNNSVRURVI7CisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby4KKwkJdG1kc19jaGlwX3NsYXZlX2FkZHIgPSBWVDE2MzJfVE1EU19JMkNfQUREUjsKKwlyZXR1cm4gRkFJTDsKK30KKworc3RhdGljIHZvaWQgdG1kc19yZWdpc3Rlcl93cml0ZShpbnQgaW5kZXgsIHU4IGRhdGEpCit7CisJdmlhcGFyaW5mby0+aTJjX3N0dWZmLmkyY19wb3J0ID0KKwkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby5pMmNfcG9ydDsKKworCXZpYWZiX2kyY193cml0ZWJ5dGUodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby4KKwkJdG1kc19jaGlwX3NsYXZlX2FkZHIsIGluZGV4LAorCQkgICAgIGRhdGEpOworfQorCitzdGF0aWMgaW50IHRtZHNfcmVnaXN0ZXJfcmVhZChpbnQgaW5kZXgpCit7CisJdTggZGF0YTsKKworCXZpYXBhcmluZm8tPmkyY19zdHVmZi5pMmNfcG9ydCA9CisJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8uaTJjX3BvcnQ7CisJdmlhZmJfaTJjX3JlYWRieXRlKCh1OCkgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkgICAgdG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIsCisJCQkodTgpIGluZGV4LCAmZGF0YSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgdG1kc19yZWdpc3Rlcl9yZWFkX2J5dGVzKGludCBpbmRleCwgdTggKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwl2aWFwYXJpbmZvLT5pMmNfc3R1ZmYuaTJjX3BvcnQgPQorCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLmkyY19wb3J0OworCXZpYWZiX2kyY19yZWFkYnl0ZXMoKHU4KSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLgorCQkJIHRtZHNfY2hpcF9zbGF2ZV9hZGRyLCAodTgpIGluZGV4LCBidWZmLCBidWZmX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcmVkdWNlX2JsYW5raW5nX21vZGUoaW50IG1vZGVfaW5kZXgsCisJaW50IHJlZnJlc2hfcmF0ZSkKK3sKKwlpZiAocmVmcmVzaF9yYXRlICE9IDYwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKG1vZGVfaW5kZXgpIHsKKwkJLyogRm9sbG93aW5nIG1vZGVzIGhhdmUgcmVkdWNlIGJsYW5raW5nIG1vZGUuICovCisJY2FzZSBWSUFfUkVTXzEzNjBYNzY4OgorCWNhc2UgVklBX1JFU18xNDAwWDEwNTA6CisJY2FzZSBWSUFfUkVTXzE0NDBYOTAwOgorCWNhc2UgVklBX1JFU18xNjAwWDkwMDoKKwljYXNlIFZJQV9SRVNfMTY4MFgxMDUwOgorCWNhc2UgVklBX1JFU18xOTIwWDEwODA6CisJY2FzZSBWSUFfUkVTXzE5MjBYMTIwMDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVR19NU0coS0VSTl9JTkZPCisJCQkgICJUaGlzIGR2aSBtb2RlICVkIGhhdmUgbm8gcmVkdWNlIGJsYW5raW5nIG1vZGUhXG4iLAorCQkJICBtb2RlX2luZGV4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBEVkkgU2V0IE1vZGUgKi8KK3ZvaWQgdmlhZmJfZHZpX3NldF9tb2RlKGludCB2aWRlb19pbmRleCwgaW50IG1vZGVfYnBwLCBpbnQgc2V0X2lnYSkKK3sKKwlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvTW9kZSA9IE5VTEw7CisJc3RydWN0IGNydF9tb2RlX3RhYmxlICpwRHZpVGltaW5nOworCXVuc2lnbmVkIGxvbmcgZGVzaXJlUGl4ZWxDbG9jaywgbWF4UGl4ZWxDbG9jazsKKwlpbnQgc3RhdHVzID0gMDsKKwl2aWRlb01vZGUgPSB2aWFmYl9nZXRfbW9kZXRibF9wb2ludGVyKHZpZGVvX2luZGV4KTsKKwlwRHZpVGltaW5nID0gdmlkZW9Nb2RlLT5jcnRjOworCWRlc2lyZVBpeGVsQ2xvY2sgPSBwRHZpVGltaW5nLT5jbGsgLyAxMDAwMDAwOworCW1heFBpeGVsQ2xvY2sgPSAodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvLT4KKwkJdG1kc19zZXR0aW5nX2luZm8tPm1heF9waXhlbF9jbG9jazsKKworCURFQlVHX01TRyhLRVJOX0lORk8gIlxuRFZJX3NldF9tb2RlISFcbiIpOworCisJaWYgKChtYXhQaXhlbENsb2NrICE9IDApICYmIChkZXNpcmVQaXhlbENsb2NrID4gbWF4UGl4ZWxDbG9jaykpIHsKKwkJLypDaGVjayBpZiByZWR1Y2UtYmxhbmtpbmcgbW9kZSBpcyBleGlzdCAqLworCQlzdGF0dXMgPQorCQkgICAgY2hlY2tfcmVkdWNlX2JsYW5raW5nX21vZGUodmlkZW9faW5kZXgsCisJCQkJCSAgICAgICBwRHZpVGltaW5nLT5yZWZyZXNoX3JhdGUpOworCQlpZiAoc3RhdHVzKSB7CisJCQl2aWRlb19pbmRleCArPSAxMDA7CS8qVXNlIHJlZHVjZS1ibGFua2luZyBtb2RlICovCisJCQl2aWRlb01vZGUgPSB2aWFmYl9nZXRfbW9kZXRibF9wb2ludGVyKHZpZGVvX2luZGV4KTsKKwkJCXBEdmlUaW1pbmcgPSB2aWRlb01vZGUtPmNydGM7CisJCQlERUJVR19NU0coS0VSTl9JTkZPCisJCQkJICAiRFZJIHVzZSByZWR1Y2UgYmxhbmtpbmcgbW9kZSAlZCEhXG4iLAorCQkJCSAgdmlkZW9faW5kZXgpOworCQl9CisJfQorCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcocER2aVRpbWluZywgdmlkZW9faW5kZXgsIG1vZGVfYnBwIC8gOCwgc2V0X2lnYSk7CisJdmlhZmJfc2V0X291dHB1dF9wYXRoKERFVklDRV9EVkksIHNldF9pZ2EsCisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLm91dHB1dF9pbnRlcmZhY2UpOworfQorCisvKiBTZW5zZSBEVkkgQ29ubmVjdG9yICovCitpbnQgdmlhZmJfZHZpX3NlbnNlKHZvaWQpCit7CisJdTggUmVnU1IxRSA9IDAsIFJlZ1NSM0UgPSAwLCBSZWdDUjZCID0gMCwgUmVnQ1I5MSA9IDAsCisJCVJlZ0NSOTMgPSAwLCBSZWdDUjlCID0gMCwgZGF0YTsKKwlpbnQgcmV0ID0gZmFsc2U7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9kdmlfc2Vuc2UhIVxuIik7CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpIHsKKwkJLyogREkxIFBhZCBvbiAqLworCQlSZWdTUjFFID0gdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMUUpOworCQl2aWFmYl93cml0ZV9yZWcoU1IxRSwgVklBU1IsIFJlZ1NSMUUgfCAweDMwKTsKKworCQkvKiBDUjZCWzBdVkNLIElucHV0IFNlbGVjdGlvbjogMSA9IEV4dGVybmFsIGNsb2NrLiAqLworCQlSZWdDUjZCID0gdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSNkIpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I2QiwgVklBQ1IsIFJlZ0NSNkIgfCAweDA4KTsKKworCQkvKiBDUjkxWzRdIFZERCBPbiBbM10gRGF0YSBPbiBbMl0gVkVFIE9uIFsxXSBCYWNrIExpZ2h0IE9mZgorCQkgICBbMF0gU29mdHdhcmUgQ29udHJvbCBQb3dlciBTZXF1ZW5jZSAqLworCQlSZWdDUjkxID0gdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOTEpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I5MSwgVklBQ1IsIDB4MUQpOworCisJCS8qIENSOTNbN10gREkxIERhdGEgU291cmNlIFNlbGVjdGlvbjogMSA9IERTUDIuCisJCSAgIENSOTNbNV0gREkxIENsb2NrIFNvdXJjZTogMSA9IGludGVybmFsLgorCQkgICBDUjkzWzRdIERJMSBDbG9jayBQb2xhcml0eS4KKwkJICAgQ1I5M1szOjFdIERJMSBDbG9jayBBZGp1c3QuIENSOTNbMF0gREkxIGVuYWJsZSAqLworCQlSZWdDUjkzID0gdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOTMpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I5MywgVklBQ1IsIDB4MDEpOworCX0gZWxzZSB7CisJCS8qIERWUDAvRFZQMSBQYWQgb24gKi8KKwkJUmVnU1IxRSA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjFFKTsKKwkJdmlhZmJfd3JpdGVfcmVnKFNSMUUsIFZJQVNSLCBSZWdTUjFFIHwgMHhGMCk7CisKKwkJLyogU1IzRVsxXU11bHRpLWZ1bmN0aW9uIHNlbGVjdGlvbjoKKwkJICAgMCA9IEVtdWxhdGUgSTJDIGFuZCBEREMgYnVzIGJ5IEdQSU8yLzMvNC4gKi8KKwkJUmVnU1IzRSA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjNFKTsKKwkJdmlhZmJfd3JpdGVfcmVnKFNSM0UsIFZJQVNSLCBSZWdTUjNFICYgKH4weDIwKSk7CisKKwkJLyogQ1I5MVs0XSBWREQgT24gWzNdIERhdGEgT24gWzJdIFZFRSBPbiBbMV0gQmFjayBMaWdodCBPZmYKKwkJICAgWzBdIFNvZnR3YXJlIENvbnRyb2wgUG93ZXIgU2VxdWVuY2UgKi8KKwkJUmVnQ1I5MSA9IHZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjkxKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLCAweDFEKTsKKworCQkvKkNSOUJbNF0gRFZQMSBEYXRhIFNvdXJjZSBTZWxlY3Rpb246IDEgPSBGcm9tIHNlY29uZGFyeQorCQlkaXNwbGF5LkNSOUJbMjowXSBEVlAxIENsb2NrIEFkanVzdCAqLworCQlSZWdDUjlCID0gdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOUIpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I5QiwgVklBQ1IsIDB4MDEpOworCX0KKworCWRhdGEgPSAodTgpIHRtZHNfcmVnaXN0ZXJfcmVhZCgweDA5KTsKKwlpZiAoZGF0YSAmIDB4MDQpCisJCXJldCA9IHRydWU7CisKKwlpZiAocmV0ID09IGZhbHNlKSB7CisJCWlmICh2aWFmYl9kdmlfcXVlcnlfRURJRCgpKQorCQkJcmV0ID0gdHJ1ZTsKKwl9CisKKwkvKiBSZXN0b3JlIHN0YXR1cyAqLworCXZpYWZiX3dyaXRlX3JlZyhTUjFFLCBWSUFTUiwgUmVnU1IxRSk7CisJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLCBSZWdDUjkxKTsKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpIHsKKwkJdmlhZmJfd3JpdGVfcmVnKENSNkIsIFZJQUNSLCBSZWdDUjZCKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSOTMsIFZJQUNSLCBSZWdDUjkzKTsKKwl9IGVsc2UgeworCQl2aWFmYl93cml0ZV9yZWcoU1IzRSwgVklBU1IsIFJlZ1NSM0UpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I5QiwgVklBQ1IsIFJlZ0NSOUIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFF1ZXJ5IEZsYXQgUGFuZWwncyBFRElEIFRhYmxlIFZlcnNpb24gVGhyb3VnaCBEVkkgQ29ubmVjdG9yICovCitzdGF0aWMgaW50IHZpYWZiX2R2aV9xdWVyeV9FRElEKHZvaWQpCit7CisJdTggZGF0YTAsIGRhdGExOworCWludCByZXN0b3JlOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfZHZpX3F1ZXJ5X0VESUQhIVxuIik7CisKKwlyZXN0b3JlID0gdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby50bWRzX2NoaXBfc2xhdmVfYWRkcjsKKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9zbGF2ZV9hZGRyID0gMHhBMDsKKworCWRhdGEwID0gKHU4KSB0bWRzX3JlZ2lzdGVyX3JlYWQoMHgwMCk7CisJZGF0YTEgPSAodTgpIHRtZHNfcmVnaXN0ZXJfcmVhZCgweDAxKTsKKwlpZiAoKGRhdGEwID09IDApICYmIChkYXRhMSA9PSAweEZGKSkgeworCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQkJdG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIgPSByZXN0b3JlOworCQlyZXR1cm4gRURJRF9WRVJTSU9OXzE7CS8qIEZvdW5kIEVESUQxIFRhYmxlICovCisJfQorCisJZGF0YTAgPSAodTgpIHRtZHNfcmVnaXN0ZXJfcmVhZCgweDAwKTsKKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9zbGF2ZV9hZGRyID0gcmVzdG9yZTsKKwlpZiAoZGF0YTAgPT0gMHgyMCkKKwkJcmV0dXJuIEVESURfVkVSU0lPTl8yOwkvKiBGb3VuZCBFRElEMiBUYWJsZSAqLworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCisvKgorICoKKyAqIGludCBkdmlfZ2V0X3BhbmVsX3NpemVfZnJvbV9EREN2MSh2b2lkKQorICoKKyAqICAgICAtIEdldCBQYW5lbCBTaXplIFVzaW5nIEVESUQxIFRhYmxlCisgKgorICogUmV0dXJuIFR5cGU6ICAgIGludAorICoKKyAqLworc3RhdGljIGludCBkdmlfZ2V0X3BhbmVsX3NpemVfZnJvbV9EREN2MSh2b2lkKQoreworCWludCBpLCBtYXhfaCA9IDAsIG1heF92ID0gMCwgdG1wLCByZXN0b3JlOworCXVuc2lnbmVkIGNoYXIgckRhdGE7CisJdW5zaWduZWQgY2hhciBFRElEX0RBVEFbMThdOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG4gZHZpX2dldF9wYW5lbF9zaXplX2Zyb21fRERDdjEgXG4iKTsKKworCXJlc3RvcmUgPSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9zbGF2ZV9hZGRyOworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIgPSAweEEwOworCisJckRhdGEgPSB0bWRzX3JlZ2lzdGVyX3JlYWQoMHgyMyk7CisJaWYgKHJEYXRhICYgMHgzQykKKwkJbWF4X2ggPSA2NDA7CisJaWYgKHJEYXRhICYgMHhDMCkKKwkJbWF4X2ggPSA3MjA7CisJaWYgKHJEYXRhICYgMHgwMykKKwkJbWF4X2ggPSA4MDA7CisKKwlyRGF0YSA9IHRtZHNfcmVnaXN0ZXJfcmVhZCgweDI0KTsKKwlpZiAockRhdGEgJiAweEMwKQorCQltYXhfaCA9IDgwMDsKKwlpZiAockRhdGEgJiAweDFFKQorCQltYXhfaCA9IDEwMjQ7CisJaWYgKHJEYXRhICYgMHgwMSkKKwkJbWF4X2ggPSAxMjgwOworCisJZm9yIChpID0gMHgyNTsgaSA8IDB4NkQ7IGkrKykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAweDI2OgorCQljYXNlIDB4Mjg6CisJCWNhc2UgMHgyQToKKwkJY2FzZSAweDJDOgorCQljYXNlIDB4MkU6CisJCWNhc2UgMHgzMDoKKwkJY2FzZSAweDMyOgorCQljYXNlIDB4MzQ6CisJCQlyRGF0YSA9IHRtZHNfcmVnaXN0ZXJfcmVhZChpKTsKKwkJCWlmIChyRGF0YSA9PSAxKQorCQkJCWJyZWFrOworCQkJLyogZGF0YSA9IChkYXRhICsgMzEpICogOCAqLworCQkJdG1wID0gKHJEYXRhICsgMzEpIDw8IDM7CisJCQlpZiAodG1wID4gbWF4X2gpCisJCQkJbWF4X2ggPSB0bXA7CisJCQlicmVhazsKKworCQljYXNlIDB4MzY6CisJCWNhc2UgMHg0ODoKKwkJY2FzZSAweDVBOgorCQljYXNlIDB4NkM6CisJCQl0bWRzX3JlZ2lzdGVyX3JlYWRfYnl0ZXMoaSwgRURJRF9EQVRBLCAxMCk7CisJCQlpZiAoIShFRElEX0RBVEFbMF0gfHwgRURJRF9EQVRBWzFdKSkgeworCQkJCS8qIFRoZSBmaXJzdCB0d28gYnl0ZSBtdXN0IGJlIHplcm8uICovCisJCQkJaWYgKEVESURfREFUQVszXSA9PSAweEZEKSB7CisJCQkJCS8qIFRvIGdldCBtYXggcGl4ZWwgY2xvY2suICovCisJCQkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT4KKwkJCQkJbWF4X3BpeGVsX2Nsb2NrID0gRURJRF9EQVRBWzldICogMTA7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3dpdGNoIChtYXhfaCkgeworCWNhc2UgNjQwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU182NDBYNDgwOworCQlicmVhazsKKwljYXNlIDgwMDoKKwkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KKwkJCVZJQV9SRVNfODAwWDYwMDsKKwkJYnJlYWs7CisJY2FzZSAxMDI0OgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xMDI0WDc2ODsKKwkJYnJlYWs7CisJY2FzZSAxMjgwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xMjgwWDEwMjQ7CisJCWJyZWFrOworCWNhc2UgMTQwMDoKKwkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KKwkJCVZJQV9SRVNfMTQwMFgxMDUwOworCQlicmVhazsKKwljYXNlIDE0NDA6CisJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSA9CisJCQlWSUFfUkVTXzE0NDBYMTA1MDsKKwkJYnJlYWs7CisJY2FzZSAxNjAwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xNjAwWDEyMDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDoKKwkJaWYgKG1heF92ID09IDEyMDApIHsKKwkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSA9CisJCQkJVklBX1JFU18xOTIwWDEyMDA7CisJCX0gZWxzZSB7CisJCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJCVZJQV9SRVNfMTkyMFgxMDgwOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KKwkJCVZJQV9SRVNfMTAyNFg3Njg7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIlVua25vdyBwYW5lbCBzaXplIG1heCByZXNvbHV0aW9uID0gJWQgIVwKKwkJCQkJIHNldCBkZWZhdWx0IHBhbmVsIHNpemUuXG4iLCBtYXhfaCk7CisJCWJyZWFrOworCX0KKworCURFQlVHX01TRyhLRVJOX0lORk8gIkRWSSBtYXggcGl4ZWxjbG9jayA9ICVkXG4iLAorCQkgIHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5tYXhfcGl4ZWxfY2xvY2spOworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIgPSByZXN0b3JlOworCXJldHVybiB2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemU7Cit9CisKKy8qCisgKgorICogaW50IGR2aV9nZXRfcGFuZWxfc2l6ZV9mcm9tX0REQ3YyKHZvaWQpCisgKgorICogICAgIC0gR2V0IFBhbmVsIFNpemUgVXNpbmcgRURJRDIgVGFibGUKKyAqCisgKiBSZXR1cm4gVHlwZTogICAgaW50CisgKgorICovCitzdGF0aWMgaW50IGR2aV9nZXRfcGFuZWxfc2l6ZV9mcm9tX0REQ3YyKHZvaWQpCit7CisJaW50IEhTaXplID0gMCwgcmVzdG9yZTsKKwl1bnNpZ25lZCBjaGFyIFJfQnVmZmVyWzJdOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG4gZHZpX2dldF9wYW5lbF9zaXplX2Zyb21fRERDdjIgXG4iKTsKKworCXJlc3RvcmUgPSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9zbGF2ZV9hZGRyOworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8udG1kc19jaGlwX3NsYXZlX2FkZHIgPSAweEEyOworCisJLyogSG9yaXpvbnRhbDogMHg3NiwgMHg3NyAqLworCXRtZHNfcmVnaXN0ZXJfcmVhZF9ieXRlcygweDc2LCBSX0J1ZmZlciwgMik7CisJSFNpemUgPSBSX0J1ZmZlclswXTsKKwlIU2l6ZSArPSBSX0J1ZmZlclsxXSA8PCA4OworCisJc3dpdGNoIChIU2l6ZSkgeworCWNhc2UgNjQwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU182NDBYNDgwOworCQlicmVhazsKKwljYXNlIDgwMDoKKwkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KKwkJCVZJQV9SRVNfODAwWDYwMDsKKwkJYnJlYWs7CisJY2FzZSAxMDI0OgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xMDI0WDc2ODsKKwkJYnJlYWs7CisJY2FzZSAxMjgwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xMjgwWDEwMjQ7CisJCWJyZWFrOworCWNhc2UgMTQwMDoKKwkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplID0KKwkJCVZJQV9SRVNfMTQwMFgxMDUwOworCQlicmVhazsKKwljYXNlIDE0NDA6CisJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSA9CisJCQlWSUFfUkVTXzE0NDBYMTA1MDsKKwkJYnJlYWs7CisJY2FzZSAxNjAwOgorCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+ZHZpX3BhbmVsX3NpemUgPQorCQkJVklBX1JFU18xNjAwWDEyMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSA9CisJCQlWSUFfUkVTXzEwMjRYNzY4OworCQlERUJVR19NU0coS0VSTl9JTkZPICJVbmtub3cgcGFuZWwgc2l6ZSBtYXggcmVzb2x1dGlvbiA9ICVkIVwKKwkJCQkJc2V0IGRlZmF1bHQgcGFuZWwgc2l6ZS5cbiIsIEhTaXplKTsKKwkJYnJlYWs7CisJfQorCisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby50bWRzX2NoaXBfc2xhdmVfYWRkciA9IHJlc3RvcmU7CisJcmV0dXJuIHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZTsKK30KKworLyoKKyAqCisgKiB1bnNpZ25lZCBjaGFyIGR2aV9nZXRfcGFuZWxfaW5mbyh2b2lkKQorICoKKyAqICAgICAtIEdldCBQYW5lbCBTaXplCisgKgorICogUmV0dXJuIFR5cGU6ICAgIHVuc2lnbmVkIGNoYXIKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHZpX2dldF9wYW5lbF9pbmZvKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBkdmlwYW5lbHNpemU7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiZHZpX2dldF9wYW5lbF9pbmZvISBcbiIpOworCisJdmlhZmJfZHZpX3NlbnNlKCk7CisJc3dpdGNoICh2aWFmYl9kdmlfcXVlcnlfRURJRCgpKSB7CisJY2FzZSAxOgorCQlkdmlfZ2V0X3BhbmVsX3NpemVfZnJvbV9EREN2MSgpOworCQlicmVhazsKKwljYXNlIDI6CisJCWR2aV9nZXRfcGFuZWxfc2l6ZV9mcm9tX0REQ3YyKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURFQlVHX01TRyhLRVJOX0lORk8gImR2aSBwYW5lbCBzaXplIGlzICUyZCBcbiIsCisJCSAgdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmR2aV9wYW5lbF9zaXplKTsKKwlkdmlwYW5lbHNpemUgPSAodW5zaWduZWQgY2hhcikodmlhcGFyaW5mby0+CisJCXRtZHNfc2V0dGluZ19pbmZvLT5kdmlfcGFuZWxfc2l6ZSk7CisJcmV0dXJuIGR2aXBhbmVsc2l6ZTsKK30KKworLyogSWYgRGlzYWJsZSBEVkksIHR1cm4gb2ZmIHBhZCAqLwordm9pZCB2aWFmYl9kdmlfZGlzYWJsZSh2b2lkKQoreworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQl0bWRzX2NoaXBfaW5mby5vdXRwdXRfaW50ZXJmYWNlID09IElOVEVSRkFDRV9EVlAwKQorCQl2aWFmYl93cml0ZV9yZWcoU1IxRSwgVklBU1IsCisJCXZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjFFKSAmICh+MHhDMCkpOworCisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCXRtZHNfY2hpcF9pbmZvLm91dHB1dF9pbnRlcmZhY2UgPT0gSU5URVJGQUNFX0RWUDEpCisJCXZpYWZiX3dyaXRlX3JlZyhTUjFFLCBWSUFTUiwKKwkJdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMUUpICYgKH4weDMwKSk7CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJdG1kc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSA9PSBJTlRFUkZBQ0VfREZQX0hJR0gpCisJCXZpYWZiX3dyaXRlX3JlZyhTUjJBLCBWSUFTUiwKKwkJdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMkEpICYgKH4weDBDKSk7CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJdG1kc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSA9PSBJTlRFUkZBQ0VfREZQX0xPVykKKwkJdmlhZmJfd3JpdGVfcmVnKFNSMkEsIFZJQVNSLAorCQl2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IyQSkgJiAofjB4MDMpKTsKKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQl0bWRzX2NoaXBfaW5mby5vdXRwdXRfaW50ZXJmYWNlID09IElOVEVSRkFDRV9UTURTKQorCQkvKiBUdXJuIG9mZiBUTURTIHBvd2VyLiAqLworCQl2aWFmYl93cml0ZV9yZWcoQ1JEMiwgVklBQ1IsCisJCXZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUkQyKSB8IDB4MDgpOworfQorCisvKiBJZiBFbmFibGUgRFZJLCB0dXJuIG9mZiBwYWQgKi8KK3ZvaWQgdmlhZmJfZHZpX2VuYWJsZSh2b2lkKQoreworCXU4IGRhdGE7CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJdG1kc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSA9PSBJTlRFUkZBQ0VfRFZQMCkgeworCQl2aWFmYl93cml0ZV9yZWcoU1IxRSwgVklBU1IsCisJCQl2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IxRSkgfCAweEMwKTsKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfQ0xFMjY2KQorCQkJdG1kc19yZWdpc3Rlcl93cml0ZSgweDg4LCAweDNiKTsKKwkJZWxzZQorCQkJLypjbGVhciBDUjkxWzVdIHRvIGRpcmVjdCBvbiBkaXNwbGF5IHBlcmlvZAorCQkJICAgaW4gdGhlIHNlY29uZGFyeSBkaXBsYXkgcGF0aCAqLworCQkJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLAorCQkJdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOTEpICYgMHhERik7CisJfQorCisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCXRtZHNfY2hpcF9pbmZvLm91dHB1dF9pbnRlcmZhY2UgPT0gSU5URVJGQUNFX0RWUDEpIHsKKwkJdmlhZmJfd3JpdGVfcmVnKFNSMUUsIFZJQVNSLAorCQkJdmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMUUpIHwgMHgzMCk7CisKKwkJLypmaXggZHZpIGNhbm4ndCBiZSBlbmFibGVkIHdpdGggTUIgVlQ1NzE4QzQgLSBBbCBaaGFuZyAqLworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpIHsKKwkJCXRtZHNfcmVnaXN0ZXJfd3JpdGUoMHg4OCwgMHgzYik7CisJCX0gZWxzZSB7CisJCQkvKmNsZWFyIENSOTFbNV0gdG8gZGlyZWN0IG9uIGRpc3BsYXkgcGVyaW9kCisJCQkgIGluIHRoZSBzZWNvbmRhcnkgZGlwbGF5IHBhdGggKi8KKwkJCXZpYWZiX3dyaXRlX3JlZyhDUjkxLCBWSUFDUiwKKwkJCXZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjkxKSAmIDB4REYpOworCQl9CisKKwkJLypmaXggRFZJIGNhbm5vdCBlbmFibGUgb24gRVBJQS1NIGJvYXJkICovCisJCWlmICh2aWFmYl9wbGF0Zm9ybV9lcGlhX2R2aSA9PSAxKSB7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjkxLCBWSUFDUiwgMHgxZiwgMHgxZik7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjg4LCBWSUFDUiwgMHgwMCwgQklUNiArIEJJVDApOworCQkJaWYgKHZpYWZiX2J1c193aWR0aCA9PSAyNCkgeworCQkJCWlmICh2aWFmYl9kZXZpY2VfbGNkX2R1YWxlZGdlID09IDEpCisJCQkJCWRhdGEgPSAweDNGOworCQkJCWVsc2UKKwkJCQkJZGF0YSA9IDB4Mzc7CisJCQkJdmlhZmJfaTJjX3dyaXRlYnl0ZSh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQkJCQkgICAgIHRtZHNfY2hpcF9pbmZvLgorCQkJCQkgICAgIHRtZHNfY2hpcF9zbGF2ZV9hZGRyLAorCQkJCQkgICAgIDB4MDgsIGRhdGEpOworCQkJfQorCQl9CisJfQorCisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCXRtZHNfY2hpcF9pbmZvLm91dHB1dF9pbnRlcmZhY2UgPT0gSU5URVJGQUNFX0RGUF9ISUdIKSB7CisJCXZpYWZiX3dyaXRlX3JlZyhTUjJBLCBWSUFTUiwKKwkJCXZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjJBKSB8IDB4MEMpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I5MSwgVklBQ1IsCisJCQl2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I5MSkgJiAweERGKTsKKwl9CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJdG1kc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSA9PSBJTlRFUkZBQ0VfREZQX0xPVykgeworCQl2aWFmYl93cml0ZV9yZWcoU1IyQSwgVklBU1IsCisJCQl2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IyQSkgfCAweDAzKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLAorCQkJdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOTEpICYgMHhERik7CisJfQorCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPgorCQl0bWRzX2NoaXBfaW5mby5vdXRwdXRfaW50ZXJmYWNlID09IElOVEVSRkFDRV9UTURTKSB7CisJCS8qIFR1cm4gb24gRGlzcGxheSBwZXJpb2QgaW4gdGhlIHBhbmVsIHBhdGguICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTEsIFZJQUNSLCAwLCBCSVQ3KTsKKworCQkvKiBUdXJuIG9uIFRNRFMgcG93ZXIuICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDIsIFZJQUNSLCAwLCBCSVQzKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5oIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlYzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19EVklfSF9fCisjZGVmaW5lIF9fRFZJX0hfXworCisvKkRlZmluaXRpb24gVE1EUyBEZXZpY2UgSUQgcmVnaXN0ZXIqLworI2RlZmluZSAgICAgVlQxNjMyX0RFVklDRV9JRF9SRUcgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIFZUMTYzMl9ERVZJQ0VfSUQgICAgICAgICAgICAweDkyCisKKyNkZWZpbmUgICAgIEdFVF9EVklfU0laRV9CWV9TWVNURU1fQklPUyAgICAgMHgwMQorI2RlZmluZSAgICAgR0VUX0RWSV9TSVpFX0JZX1ZHQV9CSU9TICAgICAgICAweDAyCisjZGVmaW5lICAgICBHRVRfRFZJX1NaSUVfQllfSFdfU1RSQVBQSU5HICAgIDB4MDMKKworLyogRGVmaW5pdGlvbiBEVkkgUGFuZWwgSUQqLworLyogUmVzb2x1dGlvbjogNjQweDQ4MCwgICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQwXzY0MFg0ODAgICAgICAgMHgwMAorLyogUmVzb2x1dGlvbjogODAweDYwMCwgICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzgwMHg2MDAgICAgICAgMHgwMQorLyogUmVzb2x1dGlvbjogMTAyNHg3NjgsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzEwMjR4NzY4ICAgICAgMHgwMgorLyogUmVzb2x1dGlvbjogMTI4MHg3NjgsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzEyODB4NzY4ICAgICAgMHgwMworLyogUmVzb2x1dGlvbjogMTI4MHgxMDI0LCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzEyODB4MTAyNCAgICAgMHgwNAorLyogUmVzb2x1dGlvbjogMTQwMHgxMDUwLCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzE0MDB4MTA1MCAgICAgMHgwNQorLyogUmVzb2x1dGlvbjogMTYwMHgxMjAwLCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBEVklfUEFORUxfSUQxXzE2MDB4MTIwMCAgICAgMHgwNgorCisvKiBEZWZpbmUgdGhlIHZlcnNpb24gb2YgRURJRCovCisjZGVmaW5lICAgICBFRElEX1ZFUlNJT05fMSAgICAgIDEKKyNkZWZpbmUgICAgIEVESURfVkVSU0lPTl8yICAgICAgMgorCisjZGVmaW5lICAgICBERVZfQ09OTkVDVF9EVkkgICAgIDB4MDEKKyNkZWZpbmUgICAgIERFVl9DT05ORUNUX0hETUkgICAgMHgwMgorCitzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpYWZiX2dldF9jZWFfbW9kZV90YmxfcG9pbnRlcihpbnQgSW5kZXgpOworaW50IHZpYWZiX2R2aV9zZW5zZSh2b2lkKTsKK3ZvaWQgdmlhZmJfZHZpX2Rpc2FibGUodm9pZCk7Cit2b2lkIHZpYWZiX2R2aV9lbmFibGUodm9pZCk7CitpbnQgdmlhZmJfdG1kc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpOwordm9pZCB2aWFmYl9pbml0X2R2aV9zaXplKHZvaWQpOwordm9pZCB2aWFmYl9kdmlfc2V0X21vZGUoaW50IHZpZGVvX2luZGV4LCBpbnQgbW9kZV9icHAsIGludCBzZXRfaWdhKTsKKworI2VuZGlmIC8qIF9fRFZJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhiZTI0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgImdsb2JhbC5oIgoraW50IHZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpID0gU1RBVEVfT0ZGOworaW50IHZpYWZiX2RldmljZV9sY2RfZHVhbGVkZ2UgPSBTVEFURV9PRkY7CitpbnQgdmlhZmJfYnVzX3dpZHRoID0gMTI7CitpbnQgdmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQgPSBIV19MQVlPVVRfTENEX0RWSTsKK2ludCB2aWFmYl9tZW1zaXplOworaW50IHZpYWZiX0RldmljZVN0YXR1cyA9IENSVF9EZXZpY2U7CitpbnQgdmlhZmJfaG90cGx1ZzsKK2ludCB2aWFmYl9yZWZyZXNoID0gNjA7CitpbnQgdmlhZmJfcmVmcmVzaDEgPSA2MDsKK2ludCB2aWFmYl9sY2RfZHNwX21ldGhvZCA9IExDRF9FWFBBTkRTSU9OOworaW50IHZpYWZiX2xjZF9tb2RlID0gTENEX09QRU5MREk7CitpbnQgdmlhZmJfYnBwID0gMzI7CitpbnQgdmlhZmJfYnBwMSA9IDMyOworaW50IHZpYWZiX2FjY2VsID0gMTsKK2ludCB2aWFmYl9DUlRfT04gPSAxOworaW50IHZpYWZiX0RWSV9PTjsKK2ludCB2aWFmYl9MQ0RfT04gOworaW50IHZpYWZiX0xDRDJfT047CitpbnQgdmlhZmJfU0FNTV9PTjsKK2ludCB2aWFmYl9kdWFsX2ZiOworaW50IHZpYWZiX2hvdHBsdWdfWHJlcyA9IDY0MDsKK2ludCB2aWFmYl9ob3RwbHVnX1lyZXMgPSA0ODA7CitpbnQgdmlhZmJfaG90cGx1Z19icHAgPSAzMjsKK2ludCB2aWFmYl9ob3RwbHVnX3JlZnJlc2ggPSA2MDsKK3Vuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfb2Zmc2V0OworaW50IHZpYWZiX3NlY29uZF9zaXplOworaW50IHZpYWZiX3ByaW1hcnlfZGV2ID0gTm9uZV9EZXZpY2U7Cit2b2lkIF9faW9tZW0gKnZpYWZiX0ZCX01NOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF94cmVzID0gNjQwOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF95cmVzID0gNDgwOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF92aXJ0dWFsX3hyZXM7Cit1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3ZpcnR1YWxfeXJlczsKK2ludCB2aWFmYl9sY2RfcGFuZWxfaWQgPSBMQ0RfUEFORUxfSURfTUFYSU1VTSArIDE7CitzdHJ1Y3QgZmJfY3Vyc29yIHZpYWN1cnNvcjsKK3N0cnVjdCBmYl9pbmZvICp2aWFmYmluZm87CitzdHJ1Y3QgZmJfaW5mbyAqdmlhZmJpbmZvMTsKK3N0cnVjdCB2aWFmYl9wYXIgKnZpYXBhcmluZm87CitzdHJ1Y3QgdmlhZmJfcGFyICp2aWFwYXJpbmZvMTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTUyNjNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0dMT0JBTF9IX18KKyNkZWZpbmUgX19HTE9CQUxfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpbmNsdWRlICJpZmFjZS5oIgorI2luY2x1ZGUgInZpYWZiZGV2LmgiCisjaW5jbHVkZSAiY2hpcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICJzaGFyZS5oIgorI2luY2x1ZGUgImR2aS5oIgorI2luY2x1ZGUgInZpYW1vZGUuaCIKKyNpbmNsdWRlICJ2aWFfaTJjLmgiCisjaW5jbHVkZSAiaHcuaCIKKworI2luY2x1ZGUgImxjZC5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAidmlhbW9kZS5oIgorI2luY2x1ZGUgInZpYV91dGlsaXR5LmgiCisjaW5jbHVkZSAidnQxNjM2LmgiCisjaW5jbHVkZSAidGJsRFBBU2V0dGluZy5oIgorI2luY2x1ZGUgInRibDE2MzYuaCIKKyNpbmNsdWRlICJ2aWFmYmRldi5oIgorCisvKiBFeHRlcm5hbCBzdHJ1Y3QqLworCitleHRlcm4gaW50IHZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpOworZXh0ZXJuIGludCB2aWFmYl9kZXZpY2VfbGNkX2R1YWxlZGdlOworZXh0ZXJuIGludCB2aWFmYl9idXNfd2lkdGg7CitleHRlcm4gaW50IHZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0OworZXh0ZXJuIHN0cnVjdCBvZmZzZXQgb2Zmc2V0X3JlZzsKK2V4dGVybiBzdHJ1Y3QgdmlhZmJfcGFyICp2aWFwYXJpbmZvOworZXh0ZXJuIHN0cnVjdCB2aWFmYl9wYXIgKnZpYXBhcmluZm8xOworZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICp2aWFmYmluZm87CitleHRlcm4gc3RydWN0IGZiX2luZm8gKnZpYWZiaW5mbzE7CitleHRlcm4gaW50IHZpYWZiX0RldmljZVN0YXR1czsKK2V4dGVybiBpbnQgdmlhZmJfcmVmcmVzaDsKK2V4dGVybiBpbnQgdmlhZmJfcmVmcmVzaDE7CitleHRlcm4gaW50IHZpYWZiX2xjZF9kc3BfbWV0aG9kOworZXh0ZXJuIGludCB2aWFmYl9sY2RfbW9kZTsKK2V4dGVybiBpbnQgdmlhZmJfYnBwOworZXh0ZXJuIGludCB2aWFmYl9icHAxOworCitleHRlcm4gaW50IHZpYWZiX0NSVF9PTjsKK2V4dGVybiBpbnQgdmlhZmJfaG90cGx1Z19YcmVzOworZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnX1lyZXM7CitleHRlcm4gaW50IHZpYWZiX2hvdHBsdWdfYnBwOworZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnX3JlZnJlc2g7CitleHRlcm4gaW50IHZpYWZiX3ByaW1hcnlfZGV2OworZXh0ZXJuIHZvaWQgX19pb21lbSAqdmlhZmJfRkJfTU07CitleHRlcm4gc3RydWN0IGZiX2N1cnNvciB2aWFjdXJzb3I7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3hyZXM7CitleHRlcm4gdW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF95cmVzOworZXh0ZXJuIGludCB2aWFmYl9sY2RfcGFuZWxfaWQ7CisKKyNlbmRpZiAvKiBfX0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDUzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5jCkBAIC0wLDAgKzEsMjg2NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWRfaW5mbyBwY2lpZGxpc3RbXSA9IHsKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9DTEUyNjZfRElELCBVTklDSFJPTUVfQ0xFMjY2fSwKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9QTTgwMF9ESUQsIFVOSUNIUk9NRV9QTTgwMH0sCisJe1BDSV9WSUFfVkVORE9SX0lELCBVTklDSFJPTUVfSzQwMF9ESUQsIFVOSUNIUk9NRV9LNDAwfSwKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9LODAwX0RJRCwgVU5JQ0hST01FX0s4MDB9LAorCXtQQ0lfVklBX1ZFTkRPUl9JRCwgVU5JQ0hST01FX0NONzAwX0RJRCwgVU5JQ0hST01FX0NONzAwfSwKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9QNE04OTBfRElELCBVTklDSFJPTUVfUDRNODkwfSwKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9LOE04OTBfRElELCBVTklDSFJPTUVfSzhNODkwfSwKKwl7UENJX1ZJQV9WRU5ET1JfSUQsIFVOSUNIUk9NRV9DWDcwMF9ESUQsIFVOSUNIUk9NRV9DWDcwMH0sCisJe1BDSV9WSUFfVkVORE9SX0lELCBVTklDSFJPTUVfUDRNOTAwX0RJRCwgVU5JQ0hST01FX1A0TTkwMH0sCisJe1BDSV9WSUFfVkVORE9SX0lELCBVTklDSFJPTUVfQ043NTBfRElELCBVTklDSFJPTUVfQ043NTB9LAorCXtQQ0lfVklBX1ZFTkRPUl9JRCwgVU5JQ0hST01FX1ZYODAwX0RJRCwgVU5JQ0hST01FX1ZYODAwfSwKKwl7MCwgMCwgMH0KK307CisKK3N0cnVjdCBvZmZzZXQgb2Zmc2V0X3JlZyA9IHsKKwkvKiBJR0ExIE9mZnNldCBSZWdpc3RlciAqLworCXtJR0ExX09GRlNFVF9SRUdfTlVNLCB7e0NSMTMsIDAsIDd9LCB7Q1IzNSwgNSwgN30gfSB9LAorCS8qIElHQTIgT2Zmc2V0IFJlZ2lzdGVyICovCisJe0lHQTJfT0ZGU0VUX1JFR19OVU0sIHt7Q1I2NiwgMCwgN30sIHtDUjY3LCAwLCAxfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxsX21hcCBwbGxfdmFsdWVbXSA9IHsKKwl7Q0xLXzI1XzE3NU0sIENMRTI2Nl9QTExfMjVfMTc1TSwgSzgwMF9QTExfMjVfMTc1TSwgQ1g3MDBfMjVfMTc1TX0sCisJe0NMS18yOV81ODFNLCBDTEUyNjZfUExMXzI5XzU4MU0sIEs4MDBfUExMXzI5XzU4MU0sIENYNzAwXzI5XzU4MU19LAorCXtDTEtfMjZfODgwTSwgQ0xFMjY2X1BMTF8yNl84ODBNLCBLODAwX1BMTF8yNl84ODBNLCBDWDcwMF8yNl84ODBNfSwKKwl7Q0xLXzMxXzQ5ME0sIENMRTI2Nl9QTExfMzFfNDkwTSwgSzgwMF9QTExfMzFfNDkwTSwgQ1g3MDBfMzFfNDkwTX0sCisJe0NMS18zMV81MDBNLCBDTEUyNjZfUExMXzMxXzUwME0sIEs4MDBfUExMXzMxXzUwME0sIENYNzAwXzMxXzUwME19LAorCXtDTEtfMzFfNzI4TSwgQ0xFMjY2X1BMTF8zMV83MjhNLCBLODAwX1BMTF8zMV83MjhNLCBDWDcwMF8zMV83MjhNfSwKKwl7Q0xLXzMyXzY2OE0sIENMRTI2Nl9QTExfMzJfNjY4TSwgSzgwMF9QTExfMzJfNjY4TSwgQ1g3MDBfMzJfNjY4TX0sCisJe0NMS18zNl8wMDBNLCBDTEUyNjZfUExMXzM2XzAwME0sIEs4MDBfUExMXzM2XzAwME0sIENYNzAwXzM2XzAwME19LAorCXtDTEtfNDBfMDAwTSwgQ0xFMjY2X1BMTF80MF8wMDBNLCBLODAwX1BMTF80MF8wMDBNLCBDWDcwMF80MF8wMDBNfSwKKwl7Q0xLXzQxXzI5MU0sIENMRTI2Nl9QTExfNDFfMjkxTSwgSzgwMF9QTExfNDFfMjkxTSwgQ1g3MDBfNDFfMjkxTX0sCisJe0NMS180M18xNjNNLCBDTEUyNjZfUExMXzQzXzE2M00sIEs4MDBfUExMXzQzXzE2M00sIENYNzAwXzQzXzE2M019LAorCXtDTEtfNDVfMjUwTSwgQ0xFMjY2X1BMTF80NV8yNTBNLCBLODAwX1BMTF80NV8yNTBNLCBDWDcwMF80NV8yNTBNfSwKKwl7Q0xLXzQ2XzAwME0sIENMRTI2Nl9QTExfNDZfMDAwTSwgSzgwMF9QTExfNDZfMDAwTSwgQ1g3MDBfNDZfMDAwTX0sCisJe0NMS180Nl85OTZNLCBDTEUyNjZfUExMXzQ2Xzk5Nk0sIEs4MDBfUExMXzQ2Xzk5Nk0sIENYNzAwXzQ2Xzk5Nk19LAorCXtDTEtfNDhfMDAwTSwgQ0xFMjY2X1BMTF80OF8wMDBNLCBLODAwX1BMTF80OF8wMDBNLCBDWDcwMF80OF8wMDBNfSwKKwl7Q0xLXzQ4Xzg3NU0sIENMRTI2Nl9QTExfNDhfODc1TSwgSzgwMF9QTExfNDhfODc1TSwgQ1g3MDBfNDhfODc1TX0sCisJe0NMS180OV81MDBNLCBDTEUyNjZfUExMXzQ5XzUwME0sIEs4MDBfUExMXzQ5XzUwME0sIENYNzAwXzQ5XzUwME19LAorCXtDTEtfNTJfNDA2TSwgQ0xFMjY2X1BMTF81Ml80MDZNLCBLODAwX1BMTF81Ml80MDZNLCBDWDcwMF81Ml80MDZNfSwKKwl7Q0xLXzUyXzk3N00sIENMRTI2Nl9QTExfNTJfOTc3TSwgSzgwMF9QTExfNTJfOTc3TSwgQ1g3MDBfNTJfOTc3TX0sCisJe0NMS181Nl8yNTBNLCBDTEUyNjZfUExMXzU2XzI1ME0sIEs4MDBfUExMXzU2XzI1ME0sIENYNzAwXzU2XzI1ME19LAorCXtDTEtfNjBfNDY2TSwgQ0xFMjY2X1BMTF82MF80NjZNLCBLODAwX1BMTF82MF80NjZNLCBDWDcwMF82MF80NjZNfSwKKwl7Q0xLXzYxXzUwME0sIENMRTI2Nl9QTExfNjFfNTAwTSwgSzgwMF9QTExfNjFfNTAwTSwgQ1g3MDBfNjFfNTAwTX0sCisJe0NMS182NV8wMDBNLCBDTEUyNjZfUExMXzY1XzAwME0sIEs4MDBfUExMXzY1XzAwME0sIENYNzAwXzY1XzAwME19LAorCXtDTEtfNjVfMTc4TSwgQ0xFMjY2X1BMTF82NV8xNzhNLCBLODAwX1BMTF82NV8xNzhNLCBDWDcwMF82NV8xNzhNfSwKKwl7Q0xLXzY2Xzc1ME0sIENMRTI2Nl9QTExfNjZfNzUwTSwgSzgwMF9QTExfNjZfNzUwTSwgQ1g3MDBfNjZfNzUwTX0sCisJe0NMS182OF8xNzlNLCBDTEUyNjZfUExMXzY4XzE3OU0sIEs4MDBfUExMXzY4XzE3OU0sIENYNzAwXzY4XzE3OU19LAorCXtDTEtfNjlfOTI0TSwgQ0xFMjY2X1BMTF82OV85MjRNLCBLODAwX1BMTF82OV85MjRNLCBDWDcwMF82OV85MjRNfSwKKwl7Q0xLXzcwXzE1OU0sIENMRTI2Nl9QTExfNzBfMTU5TSwgSzgwMF9QTExfNzBfMTU5TSwgQ1g3MDBfNzBfMTU5TX0sCisJe0NMS183Ml8wMDBNLCBDTEUyNjZfUExMXzcyXzAwME0sIEs4MDBfUExMXzcyXzAwME0sIENYNzAwXzcyXzAwME19LAorCXtDTEtfNzhfNzUwTSwgQ0xFMjY2X1BMTF83OF83NTBNLCBLODAwX1BMTF83OF83NTBNLCBDWDcwMF83OF83NTBNfSwKKwl7Q0xLXzgwXzEzNk0sIENMRTI2Nl9QTExfODBfMTM2TSwgSzgwMF9QTExfODBfMTM2TSwgQ1g3MDBfODBfMTM2TX0sCisJe0NMS184M18zNzVNLCBDTEUyNjZfUExMXzgzXzM3NU0sIEs4MDBfUExMXzgzXzM3NU0sIENYNzAwXzgzXzM3NU19LAorCXtDTEtfODNfOTUwTSwgQ0xFMjY2X1BMTF84M185NTBNLCBLODAwX1BMTF84M185NTBNLCBDWDcwMF84M185NTBNfSwKKwl7Q0xLXzg0Xzc1ME0sIENMRTI2Nl9QTExfODRfNzUwTSwgSzgwMF9QTExfODRfNzUwTSwgQ1g3MDBfODRfNzUwTX0sCisJe0NMS184NV84NjBNLCBDTEUyNjZfUExMXzg1Xzg2ME0sIEs4MDBfUExMXzg1Xzg2ME0sIENYNzAwXzg1Xzg2ME19LAorCXtDTEtfODhfNzUwTSwgQ0xFMjY2X1BMTF84OF83NTBNLCBLODAwX1BMTF84OF83NTBNLCBDWDcwMF84OF83NTBNfSwKKwl7Q0xLXzk0XzUwME0sIENMRTI2Nl9QTExfOTRfNTAwTSwgSzgwMF9QTExfOTRfNTAwTSwgQ1g3MDBfOTRfNTAwTX0sCisJe0NMS185N183NTBNLCBDTEUyNjZfUExMXzk3Xzc1ME0sIEs4MDBfUExMXzk3Xzc1ME0sIENYNzAwXzk3Xzc1ME19LAorCXtDTEtfMTAxXzAwME0sIENMRTI2Nl9QTExfMTAxXzAwME0sIEs4MDBfUExMXzEwMV8wMDBNLAorCSBDWDcwMF8xMDFfMDAwTX0sCisJe0NMS18xMDZfNTAwTSwgQ0xFMjY2X1BMTF8xMDZfNTAwTSwgSzgwMF9QTExfMTA2XzUwME0sCisJIENYNzAwXzEwNl81MDBNfSwKKwl7Q0xLXzEwOF8wMDBNLCBDTEUyNjZfUExMXzEwOF8wMDBNLCBLODAwX1BMTF8xMDhfMDAwTSwKKwkgQ1g3MDBfMTA4XzAwME19LAorCXtDTEtfMTEzXzMwOU0sIENMRTI2Nl9QTExfMTEzXzMwOU0sIEs4MDBfUExMXzExM18zMDlNLAorCSBDWDcwMF8xMTNfMzA5TX0sCisJe0NMS18xMThfODQwTSwgQ0xFMjY2X1BMTF8xMThfODQwTSwgSzgwMF9QTExfMTE4Xzg0ME0sCisJIENYNzAwXzExOF84NDBNfSwKKwl7Q0xLXzExOV8wMDBNLCBDTEUyNjZfUExMXzExOV8wMDBNLCBLODAwX1BMTF8xMTlfMDAwTSwKKwkgQ1g3MDBfMTE5XzAwME19LAorCXtDTEtfMTIxXzc1ME0sIENMRTI2Nl9QTExfMTIxXzc1ME0sIEs4MDBfUExMXzEyMV83NTBNLAorCSBDWDcwMF8xMjFfNzUwTX0sCisJe0NMS18xMjVfMTA0TSwgQ0xFMjY2X1BMTF8xMjVfMTA0TSwgSzgwMF9QTExfMTI1XzEwNE0sCisJIENYNzAwXzEyNV8xMDRNfSwKKwl7Q0xLXzEzM18zMDhNLCBDTEUyNjZfUExMXzEzM18zMDhNLCBLODAwX1BMTF8xMzNfMzA4TSwKKwkgQ1g3MDBfMTMzXzMwOE19LAorCXtDTEtfMTM1XzAwME0sIENMRTI2Nl9QTExfMTM1XzAwME0sIEs4MDBfUExMXzEzNV8wMDBNLAorCSBDWDcwMF8xMzVfMDAwTX0sCisJe0NMS18xMzZfNzAwTSwgQ0xFMjY2X1BMTF8xMzZfNzAwTSwgSzgwMF9QTExfMTM2XzcwME0sCisJIENYNzAwXzEzNl83MDBNfSwKKwl7Q0xLXzEzOF80MDBNLCBDTEUyNjZfUExMXzEzOF80MDBNLCBLODAwX1BMTF8xMzhfNDAwTSwKKwkgQ1g3MDBfMTM4XzQwME19LAorCXtDTEtfMTQ2Xzc2ME0sIENMRTI2Nl9QTExfMTQ2Xzc2ME0sIEs4MDBfUExMXzE0Nl83NjBNLAorCSBDWDcwMF8xNDZfNzYwTX0sCisJe0NMS18xNTNfOTIwTSwgQ0xFMjY2X1BMTF8xNTNfOTIwTSwgSzgwMF9QTExfMTUzXzkyME0sCisJIENYNzAwXzE1M185MjBNfSwKKwl7Q0xLXzE1Nl8wMDBNLCBDTEUyNjZfUExMXzE1Nl8wMDBNLCBLODAwX1BMTF8xNTZfMDAwTSwKKwkgQ1g3MDBfMTU2XzAwME19LAorCXtDTEtfMTU3XzUwME0sIENMRTI2Nl9QTExfMTU3XzUwME0sIEs4MDBfUExMXzE1N181MDBNLAorCSBDWDcwMF8xNTdfNTAwTX0sCisJe0NMS18xNjJfMDAwTSwgQ0xFMjY2X1BMTF8xNjJfMDAwTSwgSzgwMF9QTExfMTYyXzAwME0sCisJIENYNzAwXzE2Ml8wMDBNfSwKKwl7Q0xLXzE4N18wMDBNLCBDTEUyNjZfUExMXzE4N18wMDBNLCBLODAwX1BMTF8xODdfMDAwTSwKKwkgQ1g3MDBfMTg3XzAwME19LAorCXtDTEtfMTkzXzI5NU0sIENMRTI2Nl9QTExfMTkzXzI5NU0sIEs4MDBfUExMXzE5M18yOTVNLAorCSBDWDcwMF8xOTNfMjk1TX0sCisJe0NMS18yMDJfNTAwTSwgQ0xFMjY2X1BMTF8yMDJfNTAwTSwgSzgwMF9QTExfMjAyXzUwME0sCisJIENYNzAwXzIwMl81MDBNfSwKKwl7Q0xLXzIwNF8wMDBNLCBDTEUyNjZfUExMXzIwNF8wMDBNLCBLODAwX1BMTF8yMDRfMDAwTSwKKwkgQ1g3MDBfMjA0XzAwME19LAorCXtDTEtfMjE4XzUwME0sIENMRTI2Nl9QTExfMjE4XzUwME0sIEs4MDBfUExMXzIxOF81MDBNLAorCSBDWDcwMF8yMThfNTAwTX0sCisJe0NMS18yMzRfMDAwTSwgQ0xFMjY2X1BMTF8yMzRfMDAwTSwgSzgwMF9QTExfMjM0XzAwME0sCisJIENYNzAwXzIzNF8wMDBNfSwKKwl7Q0xLXzI2N18yNTBNLCBDTEUyNjZfUExMXzI2N18yNTBNLCBLODAwX1BMTF8yNjdfMjUwTSwKKwkgQ1g3MDBfMjY3XzI1ME19LAorCXtDTEtfMjk3XzUwME0sIENMRTI2Nl9QTExfMjk3XzUwME0sIEs4MDBfUExMXzI5N181MDBNLAorCSBDWDcwMF8yOTdfNTAwTX0sCisJe0NMS183NF80ODFNLCBDTEUyNjZfUExMXzc0XzQ4MU0sIEs4MDBfUExMXzc0XzQ4MU0sIENYNzAwXzc0XzQ4MU19LAorCXtDTEtfMTcyXzc5OE0sIENMRTI2Nl9QTExfMTcyXzc5OE0sIEs4MDBfUExMXzE3Ml83OThNLAorCSBDWDcwMF8xNzJfNzk4TX0sCisJe0NMS18xMjJfNjE0TSwgQ0xFMjY2X1BMTF8xMjJfNjE0TSwgSzgwMF9QTExfMTIyXzYxNE0sCisJIENYNzAwXzEyMl82MTRNfSwKKwl7Q0xLXzc0XzI3ME0sIENMRTI2Nl9QTExfNzRfMjcwTSwgSzgwMF9QTExfNzRfMjcwTSwgQ1g3MDBfNzRfMjcwTX0sCisJe0NMS18xNDhfNTAwTSwgQ0xFMjY2X1BMTF8xNDhfNTAwTSwgSzgwMF9QTExfMTQ4XzUwME0sCisJIENYNzAwXzE0OF81MDBNfQorfTsKKworc3RhdGljIHN0cnVjdCBmaWZvX2RlcHRoX3NlbGVjdCBkaXNwbGF5X2ZpZm9fZGVwdGhfcmVnID0geworCS8qIElHQTEgRklGTyBEZXB0aF9TZWxlY3QgKi8KKwl7SUdBMV9GSUZPX0RFUFRIX1NFTEVDVF9SRUdfTlVNLCB7e1NSMTcsIDAsIDd9IH0gfSwKKwkvKiBJR0EyIEZJRk8gRGVwdGhfU2VsZWN0ICovCisJe0lHQTJfRklGT19ERVBUSF9TRUxFQ1RfUkVHX05VTSwKKwkge3tDUjY4LCA0LCA3fSwge0NSOTQsIDcsIDd9LCB7Q1I5NSwgNywgN30gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IGZpZm9fdGhyZXNob2xkX3NlbGVjdCBmaWZvX3RocmVzaG9sZF9zZWxlY3RfcmVnID0geworCS8qIElHQTEgRklGTyBUaHJlc2hvbGQgU2VsZWN0ICovCisJe0lHQTFfRklGT19USFJFU0hPTERfUkVHX05VTSwge3tTUjE2LCAwLCA1fSwge1NSMTYsIDcsIDd9IH0gfSwKKwkvKiBJR0EyIEZJRk8gVGhyZXNob2xkIFNlbGVjdCAqLworCXtJR0EyX0ZJRk9fVEhSRVNIT0xEX1JFR19OVU0sIHt7Q1I2OCwgMCwgM30sIHtDUjk1LCA0LCA2fSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlmb19oaWdoX3RocmVzaG9sZF9zZWxlY3QgZmlmb19oaWdoX3RocmVzaG9sZF9zZWxlY3RfcmVnID0geworCS8qIElHQTEgRklGTyBIaWdoIFRocmVzaG9sZCBTZWxlY3QgKi8KKwl7SUdBMV9GSUZPX0hJR0hfVEhSRVNIT0xEX1JFR19OVU0sIHt7U1IxOCwgMCwgNX0sIHtTUjE4LCA3LCA3fSB9IH0sCisJLyogSUdBMiBGSUZPIEhpZ2ggVGhyZXNob2xkIFNlbGVjdCAqLworCXtJR0EyX0ZJRk9fSElHSF9USFJFU0hPTERfUkVHX05VTSwge3tDUjkyLCAwLCAzfSwge0NSOTUsIDAsIDJ9IH0gfQorfTsKKworc3RhdGljIHN0cnVjdCBkaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtX3JlZyA9IHsKKwkvKiBJR0ExIERpc3BsYXkgUXVldWUgRXhwaXJlIE51bSAqLworCXtJR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTV9SRUdfTlVNLCB7e1NSMjIsIDAsIDR9IH0gfSwKKwkvKiBJR0EyIERpc3BsYXkgUXVldWUgRXhwaXJlIE51bSAqLworCXtJR0EyX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTV9SRUdfTlVNLCB7e0NSOTQsIDAsIDZ9IH0gfQorfTsKKworLyogRGVmaW5pdGlvbiBGZXRjaCBDb3VudCBSZWdpc3RlcnMqLworc3RhdGljIHN0cnVjdCBmZXRjaF9jb3VudCBmZXRjaF9jb3VudF9yZWcgPSB7CisJLyogSUdBMSBGZXRjaCBDb3VudCBSZWdpc3RlciAqLworCXtJR0ExX0ZFVENIX0NPVU5UX1JFR19OVU0sIHt7U1IxQywgMCwgN30sIHtTUjFELCAwLCAxfSB9IH0sCisJLyogSUdBMiBGZXRjaCBDb3VudCBSZWdpc3RlciAqLworCXtJR0EyX0ZFVENIX0NPVU5UX1JFR19OVU0sIHt7Q1I2NSwgMCwgN30sIHtDUjY3LCAyLCAzfSB9IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaWdhMV9jcnRjX3RpbWluZyBpZ2ExX2NydGNfcmVnID0geworCS8qIElHQTEgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtJR0ExX0hPUl9UT1RBTF9SRUdfTlVNLCB7e0NSMDAsIDAsIDd9LCB7Q1IzNiwgMywgM30gfSB9LAorCS8qIElHQTEgSG9yaXpvbnRhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLworCXtJR0ExX0hPUl9BRERSX1JFR19OVU0sIHt7Q1IwMSwgMCwgN30gfSB9LAorCS8qIElHQTEgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLworCXtJR0ExX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSMDIsIDAsIDd9IH0gfSwKKwkvKiBJR0ExIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe0lHQTFfSE9SX0JMQU5LX0VORF9SRUdfTlVNLAorCSB7e0NSMDMsIDAsIDR9LCB7Q1IwNSwgNywgN30sIHtDUjMzLCA1LCA1fSB9IH0sCisJLyogSUdBMSBIb3Jpem9udGFsIFN5bmMgU3RhcnQgKi8KKwl7SUdBMV9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNLCB7e0NSMDQsIDAsIDd9LCB7Q1IzMywgNCwgNH0gfSB9LAorCS8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLworCXtJR0ExX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSMDUsIDAsIDR9IH0gfSwKKwkvKiBJR0ExIFZlcnRpY2FsIFRvdGFsICovCisJe0lHQTFfVkVSX1RPVEFMX1JFR19OVU0sCisJIHt7Q1IwNiwgMCwgN30sIHtDUjA3LCAwLCAwfSwge0NSMDcsIDUsIDV9LCB7Q1IzNSwgMCwgMH0gfSB9LAorCS8qIElHQTEgVmVydGljYWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KKwl7SUdBMV9WRVJfQUREUl9SRUdfTlVNLAorCSB7e0NSMTIsIDAsIDd9LCB7Q1IwNywgMSwgMX0sIHtDUjA3LCA2LCA2fSwge0NSMzUsIDIsIDJ9IH0gfSwKKwkvKiBJR0ExIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCisJe0lHQTFfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sCisJIHt7Q1IxNSwgMCwgN30sIHtDUjA3LCAzLCAzfSwge0NSMDksIDUsIDV9LCB7Q1IzNSwgMywgM30gfSB9LAorCS8qIElHQTEgVmVydGljYWwgQmxhbmsgRW5kICovCisJe0lHQTFfVkVSX0JMQU5LX0VORF9SRUdfTlVNLCB7e0NSMTYsIDAsIDd9IH0gfSwKKwkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgU3RhcnQgKi8KKwl7SUdBMV9WRVJfU1lOQ19TVEFSVF9SRUdfTlVNLAorCSB7e0NSMTAsIDAsIDd9LCB7Q1IwNywgMiwgMn0sIHtDUjA3LCA3LCA3fSwge0NSMzUsIDEsIDF9IH0gfSwKKwkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgRW5kICovCisJe0lHQTFfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1IxMSwgMCwgM30gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgaWdhMl9jcnRjX3JlZyA9IHsKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7SUdBMl9IT1JfVE9UQUxfUkVHX05VTSwge3tDUjUwLCAwLCA3fSwge0NSNTUsIDAsIDN9IH0gfSwKKwkvKiBJR0EyIEhvcml6b250YWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KKwl7SUdBMl9IT1JfQUREUl9SRUdfTlVNLCB7e0NSNTEsIDAsIDd9LCB7Q1I1NSwgNCwgNn0gfSB9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLworCXtJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSNTIsIDAsIDd9LCB7Q1I1NCwgMCwgMn0gfSB9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7SUdBMl9IT1JfQkxBTktfRU5EX1JFR19OVU0sCisJIHt7Q1I1MywgMCwgN30sIHtDUjU0LCAzLCA1fSwge0NSNUQsIDYsIDZ9IH0gfSwKKwkvKiBJR0EyIEhvcml6b250YWwgU3luYyBTdGFydCAqLworCXtJR0EyX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0sCisJIHt7Q1I1NiwgMCwgN30sIHtDUjU0LCA2LCA3fSwge0NSNUMsIDcsIDd9LCB7Q1I1RCwgNywgN30gfSB9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLworCXtJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSNTcsIDAsIDd9LCB7Q1I1QywgNiwgNn0gfSB9LAorCS8qIElHQTIgVmVydGljYWwgVG90YWwgKi8KKwl7SUdBMl9WRVJfVE9UQUxfUkVHX05VTSwge3tDUjU4LCAwLCA3fSwge0NSNUQsIDAsIDJ9IH0gfSwKKwkvKiBJR0EyIFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCisJe0lHQTJfVkVSX0FERFJfUkVHX05VTSwge3tDUjU5LCAwLCA3fSwge0NSNUQsIDMsIDV9IH0gfSwKKwkvKiBJR0EyIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCisJe0lHQTJfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sIHt7Q1I1QSwgMCwgN30sIHtDUjVDLCAwLCAyfSB9IH0sCisJLyogSUdBMiBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KKwl7SUdBMl9WRVJfQkxBTktfRU5EX1JFR19OVU0sIHt7Q1I1QiwgMCwgN30sIHtDUjVDLCAzLCA1fSB9IH0sCisJLyogSUdBMiBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCisJe0lHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSwge3tDUjVFLCAwLCA3fSwge0NSNUYsIDUsIDd9IH0gfSwKKwkvKiBJR0EyIFZlcnRpY2FsIFN5bmMgRW5kICovCisJe0lHQTJfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1I1RiwgMCwgNH0gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHJnYkxVVCBwYWxMVVRfdGFibGVbXSA9IHsKKwkvKiB7UixHLEJ9ICovCisJLyogSW5kZXggMHgwMH4weDAzICovCisJezB4MDAsIDB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMCwgMHgyQX0sIHsweDAwLCAweDJBLCAweDAwfSwgezB4MDAsCisJCQkJCQkJCSAgICAgMHgyQSwKKwkJCQkJCQkJICAgICAweDJBfSwKKwkvKiBJbmRleCAweDA0fjB4MDcgKi8KKwl7MHgyQSwgMHgwMCwgMHgwMH0sIHsweDJBLCAweDAwLCAweDJBfSwgezB4MkEsIDB4MTUsIDB4MDB9LCB7MHgyQSwKKwkJCQkJCQkJICAgICAweDJBLAorCQkJCQkJCQkgICAgIDB4MkF9LAorCS8qIEluZGV4IDB4MDh+MHgwQiAqLworCXsweDE1LCAweDE1LCAweDE1fSwgezB4MTUsIDB4MTUsIDB4M0Z9LCB7MHgxNSwgMHgzRiwgMHgxNX0sIHsweDE1LAorCQkJCQkJCQkgICAgIDB4M0YsCisJCQkJCQkJCSAgICAgMHgzRn0sCisJLyogSW5kZXggMHgwQ34weDBGICovCisJezB4M0YsIDB4MTUsIDB4MTV9LCB7MHgzRiwgMHgxNSwgMHgzRn0sIHsweDNGLCAweDNGLCAweDE1fSwgezB4M0YsCisJCQkJCQkJCSAgICAgMHgzRiwKKwkJCQkJCQkJICAgICAweDNGfSwKKwkvKiBJbmRleCAweDEwfjB4MTMgKi8KKwl7MHgwMCwgMHgwMCwgMHgwMH0sIHsweDA1LCAweDA1LCAweDA1fSwgezB4MDgsIDB4MDgsIDB4MDh9LCB7MHgwQiwKKwkJCQkJCQkJICAgICAweDBCLAorCQkJCQkJCQkgICAgIDB4MEJ9LAorCS8qIEluZGV4IDB4MTR+MHgxNyAqLworCXsweDBFLCAweDBFLCAweDBFfSwgezB4MTEsIDB4MTEsIDB4MTF9LCB7MHgxNCwgMHgxNCwgMHgxNH0sIHsweDE4LAorCQkJCQkJCQkgICAgIDB4MTgsCisJCQkJCQkJCSAgICAgMHgxOH0sCisJLyogSW5kZXggMHgxOH4weDFCICovCisJezB4MUMsIDB4MUMsIDB4MUN9LCB7MHgyMCwgMHgyMCwgMHgyMH0sIHsweDI0LCAweDI0LCAweDI0fSwgezB4MjgsCisJCQkJCQkJCSAgICAgMHgyOCwKKwkJCQkJCQkJICAgICAweDI4fSwKKwkvKiBJbmRleCAweDFDfjB4MUYgKi8KKwl7MHgyRCwgMHgyRCwgMHgyRH0sIHsweDMyLCAweDMyLCAweDMyfSwgezB4MzgsIDB4MzgsIDB4Mzh9LCB7MHgzRiwKKwkJCQkJCQkJICAgICAweDNGLAorCQkJCQkJCQkgICAgIDB4M0Z9LAorCS8qIEluZGV4IDB4MjB+MHgyMyAqLworCXsweDAwLCAweDAwLCAweDNGfSwgezB4MTAsIDB4MDAsIDB4M0Z9LCB7MHgxRiwgMHgwMCwgMHgzRn0sIHsweDJGLAorCQkJCQkJCQkgICAgIDB4MDAsCisJCQkJCQkJCSAgICAgMHgzRn0sCisJLyogSW5kZXggMHgyNH4weDI3ICovCisJezB4M0YsIDB4MDAsIDB4M0Z9LCB7MHgzRiwgMHgwMCwgMHgyRn0sIHsweDNGLCAweDAwLCAweDFGfSwgezB4M0YsCisJCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkJICAgICAweDEwfSwKKwkvKiBJbmRleCAweDI4fjB4MkIgKi8KKwl7MHgzRiwgMHgwMCwgMHgwMH0sIHsweDNGLCAweDEwLCAweDAwfSwgezB4M0YsIDB4MUYsIDB4MDB9LCB7MHgzRiwKKwkJCQkJCQkJICAgICAweDJGLAorCQkJCQkJCQkgICAgIDB4MDB9LAorCS8qIEluZGV4IDB4MkN+MHgyRiAqLworCXsweDNGLCAweDNGLCAweDAwfSwgezB4MkYsIDB4M0YsIDB4MDB9LCB7MHgxRiwgMHgzRiwgMHgwMH0sIHsweDEwLAorCQkJCQkJCQkgICAgIDB4M0YsCisJCQkJCQkJCSAgICAgMHgwMH0sCisJLyogSW5kZXggMHgzMH4weDMzICovCisJezB4MDAsIDB4M0YsIDB4MDB9LCB7MHgwMCwgMHgzRiwgMHgxMH0sIHsweDAwLCAweDNGLCAweDFGfSwgezB4MDAsCisJCQkJCQkJCSAgICAgMHgzRiwKKwkJCQkJCQkJICAgICAweDJGfSwKKwkvKiBJbmRleCAweDM0fjB4MzcgKi8KKwl7MHgwMCwgMHgzRiwgMHgzRn0sIHsweDAwLCAweDJGLCAweDNGfSwgezB4MDAsIDB4MUYsIDB4M0Z9LCB7MHgwMCwKKwkJCQkJCQkJICAgICAweDEwLAorCQkJCQkJCQkgICAgIDB4M0Z9LAorCS8qIEluZGV4IDB4Mzh+MHgzQiAqLworCXsweDFGLCAweDFGLCAweDNGfSwgezB4MjcsIDB4MUYsIDB4M0Z9LCB7MHgyRiwgMHgxRiwgMHgzRn0sIHsweDM3LAorCQkJCQkJCQkgICAgIDB4MUYsCisJCQkJCQkJCSAgICAgMHgzRn0sCisJLyogSW5kZXggMHgzQ34weDNGICovCisJezB4M0YsIDB4MUYsIDB4M0Z9LCB7MHgzRiwgMHgxRiwgMHgzN30sIHsweDNGLCAweDFGLCAweDJGfSwgezB4M0YsCisJCQkJCQkJCSAgICAgMHgxRiwKKwkJCQkJCQkJICAgICAweDI3fSwKKwkvKiBJbmRleCAweDQwfjB4NDMgKi8KKwl7MHgzRiwgMHgxRiwgMHgxRn0sIHsweDNGLCAweDI3LCAweDFGfSwgezB4M0YsIDB4MkYsIDB4MUZ9LCB7MHgzRiwKKwkJCQkJCQkJICAgICAweDNGLAorCQkJCQkJCQkgICAgIDB4MUZ9LAorCS8qIEluZGV4IDB4NDR+MHg0NyAqLworCXsweDNGLCAweDNGLCAweDFGfSwgezB4MzcsIDB4M0YsIDB4MUZ9LCB7MHgyRiwgMHgzRiwgMHgxRn0sIHsweDI3LAorCQkJCQkJCQkgICAgIDB4M0YsCisJCQkJCQkJCSAgICAgMHgxRn0sCisJLyogSW5kZXggMHg0OH4weDRCICovCisJezB4MUYsIDB4M0YsIDB4MUZ9LCB7MHgxRiwgMHgzRiwgMHgyN30sIHsweDFGLCAweDNGLCAweDJGfSwgezB4MUYsCisJCQkJCQkJCSAgICAgMHgzRiwKKwkJCQkJCQkJICAgICAweDM3fSwKKwkvKiBJbmRleCAweDRDfjB4NEYgKi8KKwl7MHgxRiwgMHgzRiwgMHgzRn0sIHsweDFGLCAweDM3LCAweDNGfSwgezB4MUYsIDB4MkYsIDB4M0Z9LCB7MHgxRiwKKwkJCQkJCQkJICAgICAweDI3LAorCQkJCQkJCQkgICAgIDB4M0Z9LAorCS8qIEluZGV4IDB4NTB+MHg1MyAqLworCXsweDJELCAweDJELCAweDNGfSwgezB4MzEsIDB4MkQsIDB4M0Z9LCB7MHgzNiwgMHgyRCwgMHgzRn0sIHsweDNBLAorCQkJCQkJCQkgICAgIDB4MkQsCisJCQkJCQkJCSAgICAgMHgzRn0sCisJLyogSW5kZXggMHg1NH4weDU3ICovCisJezB4M0YsIDB4MkQsIDB4M0Z9LCB7MHgzRiwgMHgyRCwgMHgzQX0sIHsweDNGLCAweDJELCAweDM2fSwgezB4M0YsCisJCQkJCQkJCSAgICAgMHgyRCwKKwkJCQkJCQkJICAgICAweDMxfSwKKwkvKiBJbmRleCAweDU4fjB4NUIgKi8KKwl7MHgzRiwgMHgyRCwgMHgyRH0sIHsweDNGLCAweDMxLCAweDJEfSwgezB4M0YsIDB4MzYsIDB4MkR9LCB7MHgzRiwKKwkJCQkJCQkJICAgICAweDNBLAorCQkJCQkJCQkgICAgIDB4MkR9LAorCS8qIEluZGV4IDB4NUN+MHg1RiAqLworCXsweDNGLCAweDNGLCAweDJEfSwgezB4M0EsIDB4M0YsIDB4MkR9LCB7MHgzNiwgMHgzRiwgMHgyRH0sIHsweDMxLAorCQkJCQkJCQkgICAgIDB4M0YsCisJCQkJCQkJCSAgICAgMHgyRH0sCisJLyogSW5kZXggMHg2MH4weDYzICovCisJezB4MkQsIDB4M0YsIDB4MkR9LCB7MHgyRCwgMHgzRiwgMHgzMX0sIHsweDJELCAweDNGLCAweDM2fSwgezB4MkQsCisJCQkJCQkJCSAgICAgMHgzRiwKKwkJCQkJCQkJICAgICAweDNBfSwKKwkvKiBJbmRleCAweDY0fjB4NjcgKi8KKwl7MHgyRCwgMHgzRiwgMHgzRn0sIHsweDJELCAweDNBLCAweDNGfSwgezB4MkQsIDB4MzYsIDB4M0Z9LCB7MHgyRCwKKwkJCQkJCQkJICAgICAweDMxLAorCQkJCQkJCQkgICAgIDB4M0Z9LAorCS8qIEluZGV4IDB4Njh+MHg2QiAqLworCXsweDAwLCAweDAwLCAweDFDfSwgezB4MDcsIDB4MDAsIDB4MUN9LCB7MHgwRSwgMHgwMCwgMHgxQ30sIHsweDE1LAorCQkJCQkJCQkgICAgIDB4MDAsCisJCQkJCQkJCSAgICAgMHgxQ30sCisJLyogSW5kZXggMHg2Q34weDZGICovCisJezB4MUMsIDB4MDAsIDB4MUN9LCB7MHgxQywgMHgwMCwgMHgxNX0sIHsweDFDLCAweDAwLCAweDBFfSwgezB4MUMsCisJCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkJICAgICAweDA3fSwKKwkvKiBJbmRleCAweDcwfjB4NzMgKi8KKwl7MHgxQywgMHgwMCwgMHgwMH0sIHsweDFDLCAweDA3LCAweDAwfSwgezB4MUMsIDB4MEUsIDB4MDB9LCB7MHgxQywKKwkJCQkJCQkJICAgICAweDE1LAorCQkJCQkJCQkgICAgIDB4MDB9LAorCS8qIEluZGV4IDB4NzR+MHg3NyAqLworCXsweDFDLCAweDFDLCAweDAwfSwgezB4MTUsIDB4MUMsIDB4MDB9LCB7MHgwRSwgMHgxQywgMHgwMH0sIHsweDA3LAorCQkJCQkJCQkgICAgIDB4MUMsCisJCQkJCQkJCSAgICAgMHgwMH0sCisJLyogSW5kZXggMHg3OH4weDdCICovCisJezB4MDAsIDB4MUMsIDB4MDB9LCB7MHgwMCwgMHgxQywgMHgwN30sIHsweDAwLCAweDFDLCAweDBFfSwgezB4MDAsCisJCQkJCQkJCSAgICAgMHgxQywKKwkJCQkJCQkJICAgICAweDE1fSwKKwkvKiBJbmRleCAweDdDfjB4N0YgKi8KKwl7MHgwMCwgMHgxQywgMHgxQ30sIHsweDAwLCAweDE1LCAweDFDfSwgezB4MDAsIDB4MEUsIDB4MUN9LCB7MHgwMCwKKwkJCQkJCQkJICAgICAweDA3LAorCQkJCQkJCQkgICAgIDB4MUN9LAorCS8qIEluZGV4IDB4ODB+MHg4MyAqLworCXsweDBFLCAweDBFLCAweDFDfSwgezB4MTEsIDB4MEUsIDB4MUN9LCB7MHgxNSwgMHgwRSwgMHgxQ30sIHsweDE4LAorCQkJCQkJCQkgICAgIDB4MEUsCisJCQkJCQkJCSAgICAgMHgxQ30sCisJLyogSW5kZXggMHg4NH4weDg3ICovCisJezB4MUMsIDB4MEUsIDB4MUN9LCB7MHgxQywgMHgwRSwgMHgxOH0sIHsweDFDLCAweDBFLCAweDE1fSwgezB4MUMsCisJCQkJCQkJCSAgICAgMHgwRSwKKwkJCQkJCQkJICAgICAweDExfSwKKwkvKiBJbmRleCAweDg4fjB4OEIgKi8KKwl7MHgxQywgMHgwRSwgMHgwRX0sIHsweDFDLCAweDExLCAweDBFfSwgezB4MUMsIDB4MTUsIDB4MEV9LCB7MHgxQywKKwkJCQkJCQkJICAgICAweDE4LAorCQkJCQkJCQkgICAgIDB4MEV9LAorCS8qIEluZGV4IDB4OEN+MHg4RiAqLworCXsweDFDLCAweDFDLCAweDBFfSwgezB4MTgsIDB4MUMsIDB4MEV9LCB7MHgxNSwgMHgxQywgMHgwRX0sIHsweDExLAorCQkJCQkJCQkgICAgIDB4MUMsCisJCQkJCQkJCSAgICAgMHgwRX0sCisJLyogSW5kZXggMHg5MH4weDkzICovCisJezB4MEUsIDB4MUMsIDB4MEV9LCB7MHgwRSwgMHgxQywgMHgxMX0sIHsweDBFLCAweDFDLCAweDE1fSwgezB4MEUsCisJCQkJCQkJCSAgICAgMHgxQywKKwkJCQkJCQkJICAgICAweDE4fSwKKwkvKiBJbmRleCAweDk0fjB4OTcgKi8KKwl7MHgwRSwgMHgxQywgMHgxQ30sIHsweDBFLCAweDE4LCAweDFDfSwgezB4MEUsIDB4MTUsIDB4MUN9LCB7MHgwRSwKKwkJCQkJCQkJICAgICAweDExLAorCQkJCQkJCQkgICAgIDB4MUN9LAorCS8qIEluZGV4IDB4OTh+MHg5QiAqLworCXsweDE0LCAweDE0LCAweDFDfSwgezB4MTYsIDB4MTQsIDB4MUN9LCB7MHgxOCwgMHgxNCwgMHgxQ30sIHsweDFBLAorCQkJCQkJCQkgICAgIDB4MTQsCisJCQkJCQkJCSAgICAgMHgxQ30sCisJLyogSW5kZXggMHg5Q34weDlGICovCisJezB4MUMsIDB4MTQsIDB4MUN9LCB7MHgxQywgMHgxNCwgMHgxQX0sIHsweDFDLCAweDE0LCAweDE4fSwgezB4MUMsCisJCQkJCQkJCSAgICAgMHgxNCwKKwkJCQkJCQkJICAgICAweDE2fSwKKwkvKiBJbmRleCAweEEwfjB4QTMgKi8KKwl7MHgxQywgMHgxNCwgMHgxNH0sIHsweDFDLCAweDE2LCAweDE0fSwgezB4MUMsIDB4MTgsIDB4MTR9LCB7MHgxQywKKwkJCQkJCQkJICAgICAweDFBLAorCQkJCQkJCQkgICAgIDB4MTR9LAorCS8qIEluZGV4IDB4QTR+MHhBNyAqLworCXsweDFDLCAweDFDLCAweDE0fSwgezB4MUEsIDB4MUMsIDB4MTR9LCB7MHgxOCwgMHgxQywgMHgxNH0sIHsweDE2LAorCQkJCQkJCQkgICAgIDB4MUMsCisJCQkJCQkJCSAgICAgMHgxNH0sCisJLyogSW5kZXggMHhBOH4weEFCICovCisJezB4MTQsIDB4MUMsIDB4MTR9LCB7MHgxNCwgMHgxQywgMHgxNn0sIHsweDE0LCAweDFDLCAweDE4fSwgezB4MTQsCisJCQkJCQkJCSAgICAgMHgxQywKKwkJCQkJCQkJICAgICAweDFBfSwKKwkvKiBJbmRleCAweEFDfjB4QUYgKi8KKwl7MHgxNCwgMHgxQywgMHgxQ30sIHsweDE0LCAweDFBLCAweDFDfSwgezB4MTQsIDB4MTgsIDB4MUN9LCB7MHgxNCwKKwkJCQkJCQkJICAgICAweDE2LAorCQkJCQkJCQkgICAgIDB4MUN9LAorCS8qIEluZGV4IDB4QjB+MHhCMyAqLworCXsweDAwLCAweDAwLCAweDEwfSwgezB4MDQsIDB4MDAsIDB4MTB9LCB7MHgwOCwgMHgwMCwgMHgxMH0sIHsweDBDLAorCQkJCQkJCQkgICAgIDB4MDAsCisJCQkJCQkJCSAgICAgMHgxMH0sCisJLyogSW5kZXggMHhCNH4weEI3ICovCisJezB4MTAsIDB4MDAsIDB4MTB9LCB7MHgxMCwgMHgwMCwgMHgwQ30sIHsweDEwLCAweDAwLCAweDA4fSwgezB4MTAsCisJCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkJICAgICAweDA0fSwKKwkvKiBJbmRleCAweEI4fjB4QkIgKi8KKwl7MHgxMCwgMHgwMCwgMHgwMH0sIHsweDEwLCAweDA0LCAweDAwfSwgezB4MTAsIDB4MDgsIDB4MDB9LCB7MHgxMCwKKwkJCQkJCQkJICAgICAweDBDLAorCQkJCQkJCQkgICAgIDB4MDB9LAorCS8qIEluZGV4IDB4QkN+MHhCRiAqLworCXsweDEwLCAweDEwLCAweDAwfSwgezB4MEMsIDB4MTAsIDB4MDB9LCB7MHgwOCwgMHgxMCwgMHgwMH0sIHsweDA0LAorCQkJCQkJCQkgICAgIDB4MTAsCisJCQkJCQkJCSAgICAgMHgwMH0sCisJLyogSW5kZXggMHhDMH4weEMzICovCisJezB4MDAsIDB4MTAsIDB4MDB9LCB7MHgwMCwgMHgxMCwgMHgwNH0sIHsweDAwLCAweDEwLCAweDA4fSwgezB4MDAsCisJCQkJCQkJCSAgICAgMHgxMCwKKwkJCQkJCQkJICAgICAweDBDfSwKKwkvKiBJbmRleCAweEM0fjB4QzcgKi8KKwl7MHgwMCwgMHgxMCwgMHgxMH0sIHsweDAwLCAweDBDLCAweDEwfSwgezB4MDAsIDB4MDgsIDB4MTB9LCB7MHgwMCwKKwkJCQkJCQkJICAgICAweDA0LAorCQkJCQkJCQkgICAgIDB4MTB9LAorCS8qIEluZGV4IDB4Qzh+MHhDQiAqLworCXsweDA4LCAweDA4LCAweDEwfSwgezB4MEEsIDB4MDgsIDB4MTB9LCB7MHgwQywgMHgwOCwgMHgxMH0sIHsweDBFLAorCQkJCQkJCQkgICAgIDB4MDgsCisJCQkJCQkJCSAgICAgMHgxMH0sCisJLyogSW5kZXggMHhDQ34weENGICovCisJezB4MTAsIDB4MDgsIDB4MTB9LCB7MHgxMCwgMHgwOCwgMHgwRX0sIHsweDEwLCAweDA4LCAweDBDfSwgezB4MTAsCisJCQkJCQkJCSAgICAgMHgwOCwKKwkJCQkJCQkJICAgICAweDBBfSwKKwkvKiBJbmRleCAweEQwfjB4RDMgKi8KKwl7MHgxMCwgMHgwOCwgMHgwOH0sIHsweDEwLCAweDBBLCAweDA4fSwgezB4MTAsIDB4MEMsIDB4MDh9LCB7MHgxMCwKKwkJCQkJCQkJICAgICAweDBFLAorCQkJCQkJCQkgICAgIDB4MDh9LAorCS8qIEluZGV4IDB4RDR+MHhENyAqLworCXsweDEwLCAweDEwLCAweDA4fSwgezB4MEUsIDB4MTAsIDB4MDh9LCB7MHgwQywgMHgxMCwgMHgwOH0sIHsweDBBLAorCQkJCQkJCQkgICAgIDB4MTAsCisJCQkJCQkJCSAgICAgMHgwOH0sCisJLyogSW5kZXggMHhEOH4weERCICovCisJezB4MDgsIDB4MTAsIDB4MDh9LCB7MHgwOCwgMHgxMCwgMHgwQX0sIHsweDA4LCAweDEwLCAweDBDfSwgezB4MDgsCisJCQkJCQkJCSAgICAgMHgxMCwKKwkJCQkJCQkJICAgICAweDBFfSwKKwkvKiBJbmRleCAweERDfjB4REYgKi8KKwl7MHgwOCwgMHgxMCwgMHgxMH0sIHsweDA4LCAweDBFLCAweDEwfSwgezB4MDgsIDB4MEMsIDB4MTB9LCB7MHgwOCwKKwkJCQkJCQkJICAgICAweDBBLAorCQkJCQkJCQkgICAgIDB4MTB9LAorCS8qIEluZGV4IDB4RTB+MHhFMyAqLworCXsweDBCLCAweDBCLCAweDEwfSwgezB4MEMsIDB4MEIsIDB4MTB9LCB7MHgwRCwgMHgwQiwgMHgxMH0sIHsweDBGLAorCQkJCQkJCQkgICAgIDB4MEIsCisJCQkJCQkJCSAgICAgMHgxMH0sCisJLyogSW5kZXggMHhFNH4weEU3ICovCisJezB4MTAsIDB4MEIsIDB4MTB9LCB7MHgxMCwgMHgwQiwgMHgwRn0sIHsweDEwLCAweDBCLCAweDBEfSwgezB4MTAsCisJCQkJCQkJCSAgICAgMHgwQiwKKwkJCQkJCQkJICAgICAweDBDfSwKKwkvKiBJbmRleCAweEU4fjB4RUIgKi8KKwl7MHgxMCwgMHgwQiwgMHgwQn0sIHsweDEwLCAweDBDLCAweDBCfSwgezB4MTAsIDB4MEQsIDB4MEJ9LCB7MHgxMCwKKwkJCQkJCQkJICAgICAweDBGLAorCQkJCQkJCQkgICAgIDB4MEJ9LAorCS8qIEluZGV4IDB4RUN+MHhFRiAqLworCXsweDEwLCAweDEwLCAweDBCfSwgezB4MEYsIDB4MTAsIDB4MEJ9LCB7MHgwRCwgMHgxMCwgMHgwQn0sIHsweDBDLAorCQkJCQkJCQkgICAgIDB4MTAsCisJCQkJCQkJCSAgICAgMHgwQn0sCisJLyogSW5kZXggMHhGMH4weEYzICovCisJezB4MEIsIDB4MTAsIDB4MEJ9LCB7MHgwQiwgMHgxMCwgMHgwQ30sIHsweDBCLCAweDEwLCAweDBEfSwgezB4MEIsCisJCQkJCQkJCSAgICAgMHgxMCwKKwkJCQkJCQkJICAgICAweDBGfSwKKwkvKiBJbmRleCAweEY0fjB4RjcgKi8KKwl7MHgwQiwgMHgxMCwgMHgxMH0sIHsweDBCLCAweDBGLCAweDEwfSwgezB4MEIsIDB4MEQsIDB4MTB9LCB7MHgwQiwKKwkJCQkJCQkJICAgICAweDBDLAorCQkJCQkJCQkgICAgIDB4MTB9LAorCS8qIEluZGV4IDB4Rjh+MHhGQiAqLworCXsweDAwLCAweDAwLCAweDAwfSwgezB4MDAsIDB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweDAwLAorCQkJCQkJCQkgICAgIDB4MDAsCisJCQkJCQkJCSAgICAgMHgwMH0sCisJLyogSW5kZXggMHhGQ34weEZGICovCisJezB4MDAsIDB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweDAwLCAweDAwLCAweDAwfSwgezB4MDAsCisJCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkJICAgICAweDAwfQorfTsKKworc3RhdGljIHZvaWQgc2V0X2NydF9vdXRwdXRfcGF0aChpbnQgc2V0X2lnYSk7CitzdGF0aWMgdm9pZCBkdmlfcGF0Y2hfc2tld19kdnAwKHZvaWQpOworc3RhdGljIHZvaWQgZHZpX3BhdGNoX3NrZXdfZHZwMSh2b2lkKTsKK3N0YXRpYyB2b2lkIGR2aV9wYXRjaF9za2V3X2R2cF9sb3codm9pZCk7CitzdGF0aWMgdm9pZCBzZXRfZHZpX291dHB1dF9wYXRoKGludCBzZXRfaWdhLCBpbnQgb3V0cHV0X2ludGVyZmFjZSk7CitzdGF0aWMgdm9pZCBzZXRfbGNkX291dHB1dF9wYXRoKGludCBzZXRfaWdhLCBpbnQgb3V0cHV0X2ludGVyZmFjZSk7CitzdGF0aWMgaW50IHNlYXJjaF9tb2RlX3NldHRpbmcoaW50IE1vZGVJbmZvSW5kZXgpOworc3RhdGljIHZvaWQgbG9hZF9maXhfYml0X2NydGNfcmVnKHZvaWQpOworc3RhdGljIHZvaWQgaW5pdF9nZnhfY2hpcF9pbmZvKHZvaWQpOworc3RhdGljIHZvaWQgaW5pdF90bWRzX2NoaXBfaW5mbyh2b2lkKTsKK3N0YXRpYyB2b2lkIGluaXRfbHZkc19jaGlwX2luZm8odm9pZCk7CitzdGF0aWMgdm9pZCBkZXZpY2Vfc2NyZWVuX29mZih2b2lkKTsKK3N0YXRpYyB2b2lkIGRldmljZV9zY3JlZW5fb24odm9pZCk7CitzdGF0aWMgdm9pZCBzZXRfZGlzcGxheV9jaGFubmVsKHZvaWQpOworc3RhdGljIHZvaWQgZGV2aWNlX29mZih2b2lkKTsKK3N0YXRpYyB2b2lkIGRldmljZV9vbih2b2lkKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9zZWNvbmRfZGlzcGxheV9jaGFubmVsKHZvaWQpOworc3RhdGljIHZvaWQgZGlzYWJsZV9zZWNvbmRfZGlzcGxheV9jaGFubmVsKHZvaWQpOworc3RhdGljIGludCBnZXRfZmJfc2l6ZV9mcm9tX3BjaSh2b2lkKTsKKwordm9pZCB2aWFmYl93cml0ZV9yZWcodTggaW5kZXgsIHUxNiBpb19wb3J0LCB1OCBkYXRhKQoreworCW91dGIoaW5kZXgsIGlvX3BvcnQpOworCW91dGIoZGF0YSwgaW9fcG9ydCArIDEpOworCS8qREVCVUdfTVNHKEtFUk5fSU5GTyAiXG5JbmRleD0lMmQgVmFsdWU9JTJkIiwgaW5kZXgsIGRhdGEpOyAqLworfQordTggdmlhZmJfcmVhZF9yZWcoaW50IGlvX3BvcnQsIHU4IGluZGV4KQoreworCW91dGIoaW5kZXgsIGlvX3BvcnQpOworCXJldHVybiBpbmIoaW9fcG9ydCArIDEpOworfQorCit2b2lkIHZpYWZiX2xvY2tfY3J0KHZvaWQpCit7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IxMSwgVklBQ1IsIEJJVDcsIEJJVDcpOworfQorCit2b2lkIHZpYWZiX3VubG9ja19jcnQodm9pZCkKK3sKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjExLCBWSUFDUiwgMCwgQklUNyk7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I0NywgVklBQ1IsIDAsIEJJVDApOworfQorCit2b2lkIHZpYWZiX3dyaXRlX3JlZ19tYXNrKHU4IGluZGV4LCBpbnQgaW9fcG9ydCwgdTggZGF0YSwgdTggbWFzaykKK3sKKwl1OCB0bXA7CisKKwlvdXRiKGluZGV4LCBpb19wb3J0KTsKKwl0bXAgPSBpbmIoaW9fcG9ydCArIDEpOworCW91dGIoKGRhdGEgJiBtYXNrKSB8ICh0bXAgJiAofm1hc2spKSwgaW9fcG9ydCArIDEpOworCS8qREVCVUdfTVNHKEtFUk5fSU5GTyAiXG5JbmRleD0lMmQgVmFsdWU9JTJkIiwgaW5kZXgsIHRtcCk7ICovCit9CisKK3ZvaWQgd3JpdGVfZGFjX3JlZyh1OCBpbmRleCwgdTggciwgdTggZywgdTggYikKK3sKKwlvdXRiKGluZGV4LCBMVVRfSU5ERVhfV1JJVEUpOworCW91dGIociwgTFVUX0RBVEEpOworCW91dGIoZywgTFVUX0RBVEEpOworCW91dGIoYiwgTFVUX0RBVEEpOworfQorCisvKlNldCBJR0EgcGF0aCBmb3IgZWFjaCBkZXZpY2UqLwordm9pZCB2aWFmYl9zZXRfaWdhX3BhdGgodm9pZCkKK3sKKworCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKKwkJaWYgKHZpYWZiX0NSVF9PTikgeworCQkJaWYgKHZpYWZiX3ByaW1hcnlfZGV2ID09IENSVF9EZXZpY2UpCisJCQkJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0ExOworCQkJZWxzZQorCQkJCXZpYXBhcmluZm8tPmNydF9zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMjsKKwkJfQorCisJCWlmICh2aWFmYl9EVklfT04pIHsKKwkJCWlmICh2aWFmYl9wcmltYXJ5X2RldiA9PSBEVklfRGV2aWNlKQorCQkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9IElHQTE7CisJCQllbHNlCisJCQkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMjsKKwkJfQorCisJCWlmICh2aWFmYl9MQ0RfT04pIHsKKwkJCWlmICh2aWFmYl9wcmltYXJ5X2RldiA9PSBMQ0RfRGV2aWNlKSB7CisJCQkJaWYgKHZpYWZiX2R1YWxfZmIgJiYKKwkJCQkJKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PQorCQkJCQlVTklDSFJPTUVfQ0xFMjY2KSkgeworCQkJCQl2aWFwYXJpbmZvLT4KKwkJCQkJbHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMjsKKwkJCQkJdmlhcGFyaW5mby0+CisJCQkJCWNydF9zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMTsKKwkJCQkJdmlhcGFyaW5mby0+CisJCQkJCXRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9IElHQTE7CisJCQkJfSBlbHNlCisJCQkJCXZpYXBhcmluZm8tPgorCQkJCQlsdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0ExOworCQkJfSBlbHNlIHsKKwkJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0EyOworCQkJfQorCQl9CisJCWlmICh2aWFmYl9MQ0QyX09OKSB7CisJCQlpZiAoTENEMl9EZXZpY2UgPT0gdmlhZmJfcHJpbWFyeV9kZXYpCisJCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9IElHQTE7CisJCQllbHNlCisJCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9IElHQTI7CisJCX0KKwl9IGVsc2UgeworCQl2aWFmYl9TQU1NX09OID0gMDsKKworCQlpZiAodmlhZmJfQ1JUX09OICYmIHZpYWZiX0xDRF9PTikgeworCQkJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0ExOworCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMjsKKwkJfSBlbHNlIGlmICh2aWFmYl9DUlRfT04gJiYgdmlhZmJfRFZJX09OKSB7CisJCQl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9IElHQTE7CisJCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0EyOworCQl9IGVsc2UgaWYgKHZpYWZiX0xDRF9PTiAmJiB2aWFmYl9EVklfT04pIHsKKwkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9IElHQTE7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0EyOworCQl9IGVsc2UgaWYgKHZpYWZiX0xDRF9PTiAmJiB2aWFmYl9MQ0QyX09OKSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0EyOworCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9IElHQTI7CisJCX0gZWxzZSBpZiAodmlhZmJfQ1JUX09OKSB7CisJCQl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9IElHQTE7CisJCX0gZWxzZSBpZiAodmlhZmJfTENEX09OKSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0EyOworCQl9IGVsc2UgaWYgKHZpYWZiX0RWSV9PTikgeworCQkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID0gSUdBMTsKKwkJfQorCX0KK30KKwordm9pZCB2aWFmYl9zZXRfc3RhcnRfYWRkcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMCwgdG1wID0gMCwgc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXRfc3RhcnRfYWRkciFcbiIpOworCXZpYWZiX3VubG9ja19jcnQoKTsKKwkvKiB1cGRhdGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBJR0ExICovCisJdmlhZmJfd3JpdGVfcmVnKENSMEMsIFZJQUNSLCAweDAwKTsJLyppbml0aWFsIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKwl2aWFmYl93cml0ZV9yZWcoQ1IwRCwgVklBQ1IsIDB4MDApOworCXZpYWZiX3dyaXRlX3JlZyhDUjM0LCBWSUFDUiwgMHgwMCk7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I0OCwgVklBQ1IsIDB4MDAsIDB4MUYpOworCisJaWYgKHZpYWZiX2R1YWxfZmIpIHsKKwkJdmlhcGFyaW5mby0+aWdhX3BhdGggPSBJR0ExOworCQl2aWFwYXJpbmZvMS0+aWdhX3BhdGggPSBJR0EyOworCX0KKworCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKKwkJaWYgKCF2aWFmYl9kdWFsX2ZiKSB7CisJCQlpZiAodmlhZmJfc2Vjb25kX3NpemUpCisJCQkJc2l6ZSA9IHZpYWZiX3NlY29uZF9zaXplICogMTAyNCAqIDEwMjQ7CisJCQllbHNlCisJCQkJc2l6ZSA9IDggKiAxMDI0ICogMTAyNDsKKwkJfSBlbHNlIHsKKworCQkJc2l6ZSA9IHZpYXBhcmluZm8xLT5tZW1zaXplOworCQl9CisJCW9mZnNldCA9IHZpYWZiX3NlY29uZF9vZmZzZXQ7CisJCURFQlVHX01TRyhLRVJOX0lORk8KKwkJCSAgInZpYWZiX3NlY29uZF9zaXplPSVseCwgc2Vjb25kIHN0YXJ0X2FkZGRyZXNzPSVseFxuIiwKKwkJCSAgc2l6ZSwgb2Zmc2V0KTsKKwl9CisJaWYgKHZpYWZiX1NBTU1fT04gPT0gMSkgeworCQlvZmZzZXQgPSBvZmZzZXQgPj4gMzsKKworCQl0bXAgPSB2aWFmYl9yZWFkX3JlZyhWSUFDUiwgMHg2MikgJiAweDAxOworCQl0bXAgfD0gKG9mZnNldCAmIDB4N0YpIDw8IDE7CisJCXZpYWZiX3dyaXRlX3JlZyhDUjYyLCBWSUFDUiwgdG1wKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSNjMsIFZJQUNSLCAoKG9mZnNldCAmIDB4N0Y4MCkgPj4gNykpOworCQl2aWFmYl93cml0ZV9yZWcoQ1I2NCwgVklBQ1IsICgob2Zmc2V0ICYgMHg3RjgwMDApID4+IDE1KSk7CisJCXZpYWZiX3dyaXRlX3JlZyhDUkEzLCBWSUFDUiwgKChvZmZzZXQgJiAweDM4MDAwMDApID4+IDIzKSk7CisJfSBlbHNlIHsKKwkJLyogdXBkYXRlIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKwkJdmlhZmJfd3JpdGVfcmVnKENSNjIsIFZJQUNSLCAweDAwKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSNjMsIFZJQUNSLCAweDAwKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSNjQsIFZJQUNSLCAweDAwKTsKKwkJdmlhZmJfd3JpdGVfcmVnKENSQTMsIFZJQUNSLCAweDAwKTsKKwl9CisKKwlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKSB7CisJCWlmICh2aWFmYl9hY2NlbCkgeworCQkJaWYgKCF2aWFmYl9kdWFsX2ZiKQorCQkJCWxlbmd0aCA9IHNpemUgLSB2aWFwYXJpbmZvLT5mYm1lbV91c2VkOworCQkJZWxzZQorCQkJCWxlbmd0aCA9IHNpemUgLSB2aWFwYXJpbmZvMS0+ZmJtZW1fdXNlZDsKKwkJfSBlbHNlCisJCQlsZW5ndGggPSBzaXplOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykodm9pZCAqKXZpYWZiX0ZCX01NICsKKwkJCXZpYWZiX3NlY29uZF9vZmZzZXQ7CisJCW1lbXNldCgodm9pZCAqKW9mZnNldCwgMCwgbGVuZ3RoKTsKKwl9CisKKwl2aWFmYl9sb2NrX2NydCgpOworfQorCit2b2lkIHZpYWZiX3NldF9vdXRwdXRfcGF0aChpbnQgZGV2aWNlLCBpbnQgc2V0X2lnYSwgaW50IG91dHB1dF9pbnRlcmZhY2UpCit7CisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIERFVklDRV9DUlQ6CisJCXNldF9jcnRfb3V0cHV0X3BhdGgoc2V0X2lnYSk7CisJCWJyZWFrOworCWNhc2UgREVWSUNFX0RWSToKKwkJc2V0X2R2aV9vdXRwdXRfcGF0aChzZXRfaWdhLCBvdXRwdXRfaW50ZXJmYWNlKTsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0VfTENEOgorCQlzZXRfbGNkX291dHB1dF9wYXRoKHNldF9pZ2EsIG91dHB1dF9pbnRlcmZhY2UpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jcnRfb3V0cHV0X3BhdGgoaW50IHNldF9pZ2EpCit7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzNiwgVklBQ1IsIDB4MDAsIEJJVDQgKyBCSVQ1KTsKKworCXN3aXRjaCAoc2V0X2lnYSkgeworCWNhc2UgSUdBMToKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxNiwgVklBU1IsIDB4MDAsIEJJVDYpOworCQlicmVhazsKKwljYXNlIElHQTI6CisJY2FzZSBJR0ExX0lHQTI6CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAweEMwLCBCSVQ2ICsgQklUNyk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMTYsIFZJQVNSLCAweDQwLCBCSVQ2KTsKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMV9JR0EyKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QiwgVklBQ1IsIDB4MDgsIEJJVDMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR2aV9wYXRjaF9za2V3X2R2cDAodm9pZCkKK3sKKwkvKiBSZXNldCBkYXRhIGRyaXZpbmcgZmlyc3Q6ICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQiwgVklBU1IsIDAsIEJJVDEpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLCAwLCBCSVQ0KTsKKworCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQl7CisJCQlpZiAoKHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5oX2FjdGl2ZSA9PSAxNjAwKSAmJgorCQkJCSh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+dl9hY3RpdmUgPT0KKwkJCQkxMjAwKSkKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk2LCBWSUFDUiwgMHgwMywKKwkJCQkJICAgICAgIEJJVDAgKyBCSVQxICsgQklUMik7CisJCQllbHNlCisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MDcsCisJCQkJCSAgICAgICBCSVQwICsgQklUMSArIEJJVDIpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MDcsCisJCQkJICAgICAgIEJJVDAgKyBCSVQxICsgQklUMiArIEJJVDMpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQiwgVklBU1IsIDB4MDIsIEJJVDEpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IyQSwgVklBU1IsIDB4MTAsIEJJVDQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkdmlfcGF0Y2hfc2tld19kdnAxKHZvaWQpCit7CisJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwljYXNlIFVOSUNIUk9NRV9DWDcwMDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkdmlfcGF0Y2hfc2tld19kdnBfbG93KHZvaWQpCit7CisJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCAweDAzLCBCSVQwICsgQklUMSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBVTklDSFJPTUVfUDRNOTAwOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgMHgwOCwKKwkJCQkgICAgICAgQklUMCArIEJJVDEgKyBCSVQyICsgQklUMyk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgMHgwRiwKKwkJCQkgICAgICAgQklUMCArIEJJVDEgKyBCSVQyICsgQklUMyk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kdmlfb3V0cHV0X3BhdGgoaW50IHNldF9pZ2EsIGludCBvdXRwdXRfaW50ZXJmYWNlKQoreworCXN3aXRjaCAob3V0cHV0X2ludGVyZmFjZSkgeworCWNhc2UgSU5URVJGQUNFX0RWUDA6CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkIsIFZJQUNSLCAweDAxLCBCSVQwKTsKKworCQlpZiAoc2V0X2lnYSA9PSBJR0ExKSB7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk2LCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZDLCBWSUFDUiwgMHgyMSwgQklUMCArCisJCQkJQklUNSArIEJJVDcpOworCQl9IGVsc2UgeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MTAsIEJJVDQpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QywgVklBQ1IsIDB4QTEsIEJJVDAgKworCQkJCUJJVDUgKyBCSVQ3KTsKKwkJfQorCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUUsIFZJQVNSLCAweEMwLCBCSVQ3ICsgQklUNik7CisKKwkJZHZpX3BhdGNoX3NrZXdfZHZwMCgpOworCQlicmVhazsKKworCWNhc2UgSU5URVJGQUNFX0RWUDE6CisJCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NMRTI2NikgeworCQkJaWYgKHNldF9pZ2EgPT0gSUdBMSkKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjkzLCBWSUFDUiwgMHgyMSwKKwkJCQkJICAgICAgIEJJVDAgKyBCSVQ1ICsgQklUNyk7CisJCQllbHNlCisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5MywgVklBQ1IsIDB4QTEsCisJCQkJCSAgICAgICBCSVQwICsgQklUNSArIEJJVDcpOworCQl9IGVsc2UgeworCQkJaWYgKHNldF9pZ2EgPT0gSUdBMSkKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjlCLCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCQllbHNlCisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5QiwgVklBQ1IsIDB4MTAsIEJJVDQpOworCQl9CisKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxRSwgVklBU1IsIDB4MzAsIEJJVDQgKyBCSVQ1KTsKKwkJZHZpX3BhdGNoX3NrZXdfZHZwMSgpOworCQlicmVhazsKKwljYXNlIElOVEVSRkFDRV9ERlBfSElHSDoKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSAhPSBVTklDSFJPTUVfQ0xFMjY2KSB7CisJCQlpZiAoc2V0X2lnYSA9PSBJR0ExKSB7CisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MDAsIEJJVDQpOworCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTcsIFZJQUNSLCAweDAzLAorCQkJCQkgICAgICAgQklUMCArIEJJVDEgKyBCSVQ0KTsKKwkJCX0gZWxzZSB7CisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MTAsIEJJVDQpOworCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTcsIFZJQUNSLCAweDEzLAorCQkJCQkgICAgICAgQklUMCArIEJJVDEgKyBCSVQ0KTsKKwkJCX0KKwkJfQorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMHgwQywgQklUMiArIEJJVDMpOworCQlicmVhazsKKworCWNhc2UgSU5URVJGQUNFX0RGUF9MT1c6CisJCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NMRTI2NikKKwkJCWJyZWFrOworCisJCWlmIChzZXRfaWdhID09IElHQTEpIHsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCAweDAwLCBCSVQ0KTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLCAweDAwLCBCSVQ0KTsKKwkJfSBlbHNlIHsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCAweDEwLCBCSVQ0KTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLCAweDEwLCBCSVQ0KTsKKwkJfQorCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLCAweDAzLCBCSVQwICsgQklUMSk7CisJCWR2aV9wYXRjaF9za2V3X2R2cF9sb3coKTsKKwkJYnJlYWs7CisKKwljYXNlIElOVEVSRkFDRV9UTURTOgorCQlpZiAoc2V0X2lnYSA9PSBJR0ExKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MDAsIEJJVDQpOworCQllbHNlCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgMHgxMCwgQklUNCk7CisJCWJyZWFrOworCX0KKworCWlmIChzZXRfaWdhID09IElHQTIpIHsKKwkJZW5hYmxlX3NlY29uZF9kaXNwbGF5X2NoYW5uZWwoKTsKKwkJLyogRGlzYWJsZSBMQ0QgU2NhbGluZyAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjc5LCBWSUFDUiwgMHgwMCwgQklUMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbGNkX291dHB1dF9wYXRoKGludCBzZXRfaWdhLCBpbnQgb3V0cHV0X2ludGVyZmFjZSkKK3sKKwlERUJVR19NU0coS0VSTl9JTkZPCisJCSAgInNldF9sY2Rfb3V0cHV0X3BhdGgsIGlnYTolZCxvdXRfaW50ZXJmYWNlOiVkXG4iLAorCQkgIHNldF9pZ2EsIG91dHB1dF9pbnRlcmZhY2UpOworCXN3aXRjaCAoc2V0X2lnYSkgeworCWNhc2UgSUdBMToKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QiwgVklBQ1IsIDB4MDAsIEJJVDMpOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwOCwgQklUMyk7CisKKwkJZGlzYWJsZV9zZWNvbmRfZGlzcGxheV9jaGFubmVsKCk7CisJCWJyZWFrOworCisJY2FzZSBJR0EyOgorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZCLCBWSUFDUiwgMHgwMCwgQklUMyk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAweDA4LCBCSVQzKTsKKworCQllbmFibGVfc2Vjb25kX2Rpc3BsYXlfY2hhbm5lbCgpOworCQlicmVhazsKKworCWNhc2UgSUdBMV9JR0EyOgorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZCLCBWSUFDUiwgMHgwOCwgQklUMyk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAweDA4LCBCSVQzKTsKKworCQlkaXNhYmxlX3NlY29uZF9kaXNwbGF5X2NoYW5uZWwoKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChvdXRwdXRfaW50ZXJmYWNlKSB7CisJY2FzZSBJTlRFUkZBQ0VfRFZQMDoKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NiwgVklBQ1IsIDB4MDAsIEJJVDQpOworCQl9IGVsc2UgeworCQkJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLCAweDAwKTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTYsIFZJQUNSLCAweDEwLCBCSVQ0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSU5URVJGQUNFX0RWUDE6CisJCWlmIChzZXRfaWdhID09IElHQTEpCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjlCLCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCWVsc2UgeworCQkJdmlhZmJfd3JpdGVfcmVnKENSOTEsIFZJQUNSLCAweDAwKTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLCAweDEwLCBCSVQ0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSU5URVJGQUNFX0RGUF9ISUdIOgorCQlpZiAoc2V0X2lnYSA9PSBJR0ExKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIDB4MDAsIEJJVDQpOworCQllbHNlIHsKKwkJCXZpYWZiX3dyaXRlX3JlZyhDUjkxLCBWSUFDUiwgMHgwMCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk3LCBWSUFDUiwgMHgxMCwgQklUNCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk2LCBWSUFDUiwgMHgxMCwgQklUNCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElOVEVSRkFDRV9ERlBfTE9XOgorCQlpZiAoc2V0X2lnYSA9PSBJR0ExKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MDAsIEJJVDQpOworCQllbHNlIHsKKwkJCXZpYWZiX3dyaXRlX3JlZyhDUjkxLCBWSUFDUiwgMHgwMCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgMHgxMCwgQklUNCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjlCLCBWSUFDUiwgMHgxMCwgQklUNCk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgSU5URVJGQUNFX0RGUDoKKwkJaWYgKChVTklDSFJPTUVfSzhNODkwID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkKKwkJICAgIHx8IChVTklDSFJPTUVfUDRNODkwID09CisJCSAgICB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIDB4ODQsCisJCQkJICAgICAgIEJJVDcgKyBCSVQyICsgQklUMSArIEJJVDApOworCQlpZiAoc2V0X2lnYSA9PSBJR0ExKSB7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk3LCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCX0gZWxzZSB7CisJCQl2aWFmYl93cml0ZV9yZWcoQ1I5MSwgVklBQ1IsIDB4MDApOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIDB4MTAsIEJJVDQpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MTAsIEJJVDQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJTlRFUkZBQ0VfTFZEUzA6CisJY2FzZSBJTlRFUkZBQ0VfTFZEUzBMVkRTMToKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMSkKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCAweDAwLCBCSVQ0KTsKKwkJZWxzZQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MTAsIEJJVDQpOworCisJCWJyZWFrOworCisJY2FzZSBJTlRFUkZBQ0VfTFZEUzE6CisJCWlmIChzZXRfaWdhID09IElHQTEpCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk3LCBWSUFDUiwgMHgwMCwgQklUNCk7CisJCWVsc2UKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTcsIFZJQUNSLCAweDEwLCBCSVQ0KTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBTZWFyY2ggTW9kZSBJbmRleCAqLworc3RhdGljIGludCBzZWFyY2hfbW9kZV9zZXR0aW5nKGludCBNb2RlSW5mb0luZGV4KQoreworCWludCBpID0gMDsKKworCXdoaWxlICgoaSA8IE5VTV9UT1RBTF9NT0RFVEFCTEUpICYmCisJCQkoTW9kZUluZm9JbmRleCAhPSBDTEUyNjZNb2Rlc1tpXS5Nb2RlSW5kZXgpKQorCQlpKys7CisJaWYgKGkgPj0gTlVNX1RPVEFMX01PREVUQUJMRSkKKwkJaSA9IDA7CisJcmV0dXJuIGk7CisKK30KKworc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2aWFmYl9nZXRfbW9kZXRibF9wb2ludGVyKGludCBJbmRleCkKK3sKKwlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKlRtcFRibCA9IE5VTEw7CisJVG1wVGJsID0gJkNMRTI2Nk1vZGVzW3NlYXJjaF9tb2RlX3NldHRpbmcoSW5kZXgpXTsKKwlyZXR1cm4gVG1wVGJsOworfQorCitzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpYWZiX2dldF9jZWFfbW9kZV90YmxfcG9pbnRlcihpbnQgSW5kZXgpCit7CisJc3RydWN0IFZpZGVvTW9kZVRhYmxlICpUbXBUYmwgPSBOVUxMOworCWludCBpID0gMDsKKwl3aGlsZSAoKGkgPCBOVU1fVE9UQUxfQ0VBX01PREVTKSAmJgorCQkJKEluZGV4ICE9IENFQV9IRE1JX01vZGVzW2ldLk1vZGVJbmRleCkpCisJCWkrKzsKKwlpZiAoKGkgPCBOVU1fVE9UQUxfQ0VBX01PREVTKSkKKwkJVG1wVGJsID0gJkNFQV9IRE1JX01vZGVzW2ldOworCSBlbHNlIHsKKwkJLypTdGlsbCB1c2UgZ2VuZXJhbCB0aW1pbmcgaWYgZG9uJ3QgZmluZCBDRUEgdGltaW5nICovCisJCWkgPSAwOworCQl3aGlsZSAoKGkgPCBOVU1fVE9UQUxfTU9ERVRBQkxFKSAmJgorCQkJCShJbmRleCAhPSBDTEUyNjZNb2Rlc1tpXS5Nb2RlSW5kZXgpKQorCQkgICAgICAgaSsrOworCQlpZiAoaSA+PSBOVU1fVE9UQUxfTU9ERVRBQkxFKQorCQkJaSA9IDA7CisJCVRtcFRibCA9ICZDTEUyNjZNb2Rlc1tpXTsKKwl9CisJcmV0dXJuIFRtcFRibDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9maXhfYml0X2NydGNfcmVnKHZvaWQpCit7CisJLyogYWx3YXlzIHNldCB0byAxICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IwMywgVklBQ1IsIDB4ODAsIEJJVDcpOworCS8qIGxpbmUgY29tcGFyZSBzaG91bGQgc2V0IGFsbCBiaXRzID0gMSAoZXh0ZW5kIG1vZGVzKSAqLworCXZpYWZiX3dyaXRlX3JlZyhDUjE4LCBWSUFDUiwgMHhmZik7CisJLyogbGluZSBjb21wYXJlIHNob3VsZCBzZXQgYWxsIGJpdHMgPSAxIChleHRlbmQgbW9kZXMpICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IwNywgVklBQ1IsIDB4MTAsIEJJVDQpOworCS8qIGxpbmUgY29tcGFyZSBzaG91bGQgc2V0IGFsbCBiaXRzID0gMSAoZXh0ZW5kIG1vZGVzKSAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMDksIFZJQUNSLCAweDQwLCBCSVQ2KTsKKwkvKiBsaW5lIGNvbXBhcmUgc2hvdWxkIHNldCBhbGwgYml0cyA9IDEgKGV4dGVuZCBtb2RlcykgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjM1LCBWSUFDUiwgMHgxMCwgQklUNCk7CisJLyogbGluZSBjb21wYXJlIHNob3VsZCBzZXQgYWxsIGJpdHMgPSAxIChleHRlbmQgbW9kZXMpICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzMywgVklBQ1IsIDB4MDYsIEJJVDAgKyBCSVQxICsgQklUMik7CisJLyp2aWFmYl93cml0ZV9yZWdfbWFzayhDUjMyLCBWSUFDUiwgMHgwMSwgQklUMCk7ICovCisJLyogZXh0ZW5kIG1vZGUgYWx3YXlzIHNldCB0byBlM2ggKi8KKwl2aWFmYl93cml0ZV9yZWcoQ1IxNywgVklBQ1IsIDB4ZTMpOworCS8qIGV4dGVuZCBtb2RlIGFsd2F5cyBzZXQgdG8gMGggKi8KKwl2aWFmYl93cml0ZV9yZWcoQ1IwOCwgVklBQ1IsIDB4MDApOworCS8qIGV4dGVuZCBtb2RlIGFsd2F5cyBzZXQgdG8gMGggKi8KKwl2aWFmYl93cml0ZV9yZWcoQ1IxNCwgVklBQ1IsIDB4MDApOworCisJLyogSWYgSzhNODAwLCBlbmFibGUgUHJlZmV0Y2ggTW9kZS4gKi8KKwlpZiAoKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfSzgwMCkKKwkJfHwgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfSzhNODkwKSkKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzMywgVklBQ1IsIDB4MDgsIEJJVDMpOworCWlmICgodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpCisJICAgICYmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX3JldmlzaW9uID09IENMRTI2Nl9SRVZJU0lPTl9BWCkpCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUEsIFZJQVNSLCAweDAyLCBCSVQxKTsKKworfQorCit2b2lkIHZpYWZiX2xvYWRfcmVnKGludCB0aW1pbmdfdmFsdWUsIGludCB2aWFmYl9sb2FkX3JlZ19udW0sCisJc3RydWN0IGlvX3JlZ2lzdGVyICpyZWcsCisJICAgICAgaW50IGlvX3R5cGUpCit7CisJaW50IHJlZ19tYXNrOworCWludCBiaXRfbnVtID0gMDsKKwlpbnQgZGF0YTsKKwlpbnQgaSwgajsKKwlpbnQgc2hpZnRfbmV4dF9yZWc7CisJaW50IHN0YXJ0X2luZGV4LCBlbmRfaW5kZXgsIGNyX2luZGV4OworCXUxNiBnZXRfYml0OworCisJZm9yIChpID0gMDsgaSA8IHZpYWZiX2xvYWRfcmVnX251bTsgaSsrKSB7CisJCXJlZ19tYXNrID0gMDsKKwkJZGF0YSA9IDA7CisJCXN0YXJ0X2luZGV4ID0gcmVnW2ldLnN0YXJ0X2JpdDsKKwkJZW5kX2luZGV4ID0gcmVnW2ldLmVuZF9iaXQ7CisJCWNyX2luZGV4ID0gcmVnW2ldLmlvX2FkZHI7CisKKwkJc2hpZnRfbmV4dF9yZWcgPSBiaXRfbnVtOworCQlmb3IgKGogPSBzdGFydF9pbmRleDsgaiA8PSBlbmRfaW5kZXg7IGorKykgeworCQkJLyppZiAoYml0X251bT09OCkgdGltaW5nX3ZhbHVlID0gdGltaW5nX3ZhbHVlID4+ODsgKi8KKwkJCXJlZ19tYXNrID0gcmVnX21hc2sgfCAoQklUMCA8PCBqKTsKKwkJCWdldF9iaXQgPSAodGltaW5nX3ZhbHVlICYgKEJJVDAgPDwgYml0X251bSkpOworCQkJZGF0YSA9CisJCQkgICAgZGF0YSB8ICgoZ2V0X2JpdCA+PiBzaGlmdF9uZXh0X3JlZykgPDwgc3RhcnRfaW5kZXgpOworCQkJYml0X251bSsrOworCQl9CisJCWlmIChpb190eXBlID09IFZJQUNSKQorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soY3JfaW5kZXgsIFZJQUNSLCBkYXRhLCByZWdfbWFzayk7CisJCWVsc2UKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKGNyX2luZGV4LCBWSUFTUiwgZGF0YSwgcmVnX21hc2spOworCX0KKworfQorCisvKiBXcml0ZSBSZWdpc3RlcnMgKi8KK3ZvaWQgdmlhZmJfd3JpdGVfcmVneChzdHJ1Y3QgaW9fcmVnIFJlZ1RhYmxlW10sIGludCBJdGVtTnVtKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgUmVnVGVtcDsKKworCS8qREVCVUdfTVNHKEtFUk5fSU5GTyAiVGFibGUgU2l6ZSA6ICV4ISFcbiIsSXRlbU51bSApOyAqLworCisJZm9yIChpID0gMDsgaSA8IEl0ZW1OdW07IGkrKykgeworCQlvdXRiKFJlZ1RhYmxlW2ldLmluZGV4LCBSZWdUYWJsZVtpXS5wb3J0KTsKKwkJUmVnVGVtcCA9IGluYihSZWdUYWJsZVtpXS5wb3J0ICsgMSk7CisJCVJlZ1RlbXAgPSAoUmVnVGVtcCAmICh+UmVnVGFibGVbaV0ubWFzaykpIHwgUmVnVGFibGVbaV0udmFsdWU7CisJCW91dGIoUmVnVGVtcCwgUmVnVGFibGVbaV0ucG9ydCArIDEpOworCX0KK30KKwordm9pZCB2aWFmYl9sb2FkX29mZnNldF9yZWcoaW50IGhfYWRkciwgaW50IGJwcF9ieXRlLCBpbnQgc2V0X2lnYSkKK3sKKwlpbnQgcmVnX3ZhbHVlOworCWludCB2aWFmYl9sb2FkX3JlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyICpyZWc7CisKKwlzd2l0Y2ggKHNldF9pZ2EpIHsKKwljYXNlIElHQTFfSUdBMjoKKwljYXNlIElHQTE6CisJCXJlZ192YWx1ZSA9IElHQTFfT0ZGU0VUX0ZPUk1VTEEoaF9hZGRyLCBicHBfYnl0ZSk7CisJCXZpYWZiX2xvYWRfcmVnX251bSA9IG9mZnNldF9yZWcuaWdhMV9vZmZzZXRfcmVnLnJlZ19udW07CisJCXJlZyA9IG9mZnNldF9yZWcuaWdhMV9vZmZzZXRfcmVnLnJlZzsKKwkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOworCQlpZiAoc2V0X2lnYSA9PSBJR0ExKQorCQkJYnJlYWs7CisJY2FzZSBJR0EyOgorCQlyZWdfdmFsdWUgPSBJR0EyX09GRlNFVF9GT1JNVUxBKGhfYWRkciwgYnBwX2J5dGUpOworCQl2aWFmYl9sb2FkX3JlZ19udW0gPSBvZmZzZXRfcmVnLmlnYTJfb2Zmc2V0X3JlZy5yZWdfbnVtOworCQlyZWcgPSBvZmZzZXRfcmVnLmlnYTJfb2Zmc2V0X3JlZy5yZWc7CisJCXZpYWZiX2xvYWRfcmVnKHJlZ192YWx1ZSwgdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQUNSKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIHZpYWZiX2xvYWRfZmV0Y2hfY291bnRfcmVnKGludCBoX2FkZHIsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpCit7CisJaW50IHJlZ192YWx1ZTsKKwlpbnQgdmlhZmJfbG9hZF9yZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKworCXN3aXRjaCAoc2V0X2lnYSkgeworCWNhc2UgSUdBMV9JR0EyOgorCWNhc2UgSUdBMToKKwkJcmVnX3ZhbHVlID0gSUdBMV9GRVRDSF9DT1VOVF9GT1JNVUxBKGhfYWRkciwgYnBwX2J5dGUpOworCQl2aWFmYl9sb2FkX3JlZ19udW0gPSBmZXRjaF9jb3VudF9yZWcuCisJCQlpZ2ExX2ZldGNoX2NvdW50X3JlZy5yZWdfbnVtOworCQlyZWcgPSBmZXRjaF9jb3VudF9yZWcuaWdhMV9mZXRjaF9jb3VudF9yZWcucmVnOworCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsIHZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFTUik7CisJCWlmIChzZXRfaWdhID09IElHQTEpCisJCQlicmVhazsKKwljYXNlIElHQTI6CisJCXJlZ192YWx1ZSA9IElHQTJfRkVUQ0hfQ09VTlRfRk9STVVMQShoX2FkZHIsIGJwcF9ieXRlKTsKKwkJdmlhZmJfbG9hZF9yZWdfbnVtID0gZmV0Y2hfY291bnRfcmVnLgorCQkJaWdhMl9mZXRjaF9jb3VudF9yZWcucmVnX251bTsKKwkJcmVnID0gZmV0Y2hfY291bnRfcmVnLmlnYTJfZmV0Y2hfY291bnRfcmVnLnJlZzsKKwkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOworCQlicmVhazsKKwl9CisKK30KKwordm9pZCB2aWFmYl9sb2FkX0ZJRk9fcmVnKGludCBzZXRfaWdhLCBpbnQgaG9yX2FjdGl2ZSwgaW50IHZlcl9hY3RpdmUpCit7CisJaW50IHJlZ192YWx1ZTsKKwlpbnQgdmlhZmJfbG9hZF9yZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKwlpbnQgaWdhMV9maWZvX21heF9kZXB0aCA9IDAsIGlnYTFfZmlmb190aHJlc2hvbGQgPQorCSAgICAwLCBpZ2ExX2ZpZm9faGlnaF90aHJlc2hvbGQgPSAwLCBpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9IDA7CisJaW50IGlnYTJfZmlmb19tYXhfZGVwdGggPSAwLCBpZ2EyX2ZpZm9fdGhyZXNob2xkID0KKwkgICAgMCwgaWdhMl9maWZvX2hpZ2hfdGhyZXNob2xkID0gMCwgaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPSAwOworCisJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LODAwKSB7CisJCQlpZ2ExX2ZpZm9fbWF4X2RlcHRoID0gSzgwMF9JR0ExX0ZJRk9fTUFYX0RFUFRIOworCQkJaWdhMV9maWZvX3RocmVzaG9sZCA9IEs4MDBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgSzgwMF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQ7CisJCQkvKiBJZiByZXNvbHV0aW9uID4gMTI4MHgxMDI0LCBleHBpcmUgbGVuZ3RoID0gNjQsIGVsc2UKKwkJCSAgIGV4cGlyZSBsZW5ndGggPSAxMjggKi8KKwkJCWlmICgoaG9yX2FjdGl2ZSA+IDEyODApICYmICh2ZXJfYWN0aXZlID4gMTAyNCkpCisJCQkJaWdhMV9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPSAxNjsKKwkJCWVsc2UKKwkJCQlpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9CisJCQkJICAgIEs4MDBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisKKwkJfQorCisJCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX1BNODAwKSB7CisJCQlpZ2ExX2ZpZm9fbWF4X2RlcHRoID0gUDg4MF9JR0ExX0ZJRk9fTUFYX0RFUFRIOworCQkJaWdhMV9maWZvX3RocmVzaG9sZCA9IFA4ODBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgUDg4MF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQ7CisJCQlpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9CisJCQkgICAgUDg4MF9JR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTTsKKworCQkJLyogSWYgcmVzb2x1dGlvbiA+IDEyODB4MTAyNCwgZXhwaXJlIGxlbmd0aCA9IDY0LCBlbHNlCisJCQkgICBleHBpcmUgbGVuZ3RoID0gMTI4ICovCisJCQlpZiAoKGhvcl9hY3RpdmUgPiAxMjgwKSAmJiAodmVyX2FjdGl2ZSA+IDEwMjQpKQorCQkJCWlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0gMTY7CisJCQllbHNlCisJCQkJaWdhMV9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJCSAgICBQODgwX0lHQTFfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNOworCQl9CisKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfQ043MDApIHsKKwkJCWlnYTFfZmlmb19tYXhfZGVwdGggPSBDTjcwMF9JR0ExX0ZJRk9fTUFYX0RFUFRIOworCQkJaWdhMV9maWZvX3RocmVzaG9sZCA9IENONzAwX0lHQTFfRklGT19USFJFU0hPTEQ7CisJCQlpZ2ExX2ZpZm9faGlnaF90aHJlc2hvbGQgPQorCQkJICAgIENONzAwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRDsKKworCQkJLyogSWYgcmVzb2x1dGlvbiA+IDEyODB4MTAyNCwgZXhwaXJlIGxlbmd0aCA9IDY0LAorCQkJICAgZWxzZSBleHBpcmUgbGVuZ3RoID0gMTI4ICovCisJCQlpZiAoKGhvcl9hY3RpdmUgPiAxMjgwKSAmJiAodmVyX2FjdGl2ZSA+IDEwMjQpKQorCQkJCWlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0gMTY7CisJCQllbHNlCisJCQkJaWdhMV9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJCSAgICBDTjcwMF9JR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTTsKKwkJfQorCisJCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NYNzAwKSB7CisJCQlpZ2ExX2ZpZm9fbWF4X2RlcHRoID0gQ1g3MDBfSUdBMV9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTFfZmlmb190aHJlc2hvbGQgPSBDWDcwMF9JR0ExX0ZJRk9fVEhSRVNIT0xEOworCQkJaWdhMV9maWZvX2hpZ2hfdGhyZXNob2xkID0KKwkJCSAgICBDWDcwMF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQ7CisJCQlpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9CisJCQkgICAgQ1g3MDBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LOE04OTApIHsKKwkJCWlnYTFfZmlmb19tYXhfZGVwdGggPSBLOE04OTBfSUdBMV9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTFfZmlmb190aHJlc2hvbGQgPSBLOE04OTBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgSzhNODkwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBLOE04OTBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9QNE04OTApIHsKKwkJCWlnYTFfZmlmb19tYXhfZGVwdGggPSBQNE04OTBfSUdBMV9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTFfZmlmb190aHJlc2hvbGQgPSBQNE04OTBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgUDRNODkwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBQNE04OTBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9QNE05MDApIHsKKwkJCWlnYTFfZmlmb19tYXhfZGVwdGggPSBQNE05MDBfSUdBMV9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTFfZmlmb190aHJlc2hvbGQgPSBQNE05MDBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgUDRNOTAwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBQNE05MDBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9WWDgwMCkgeworCQkJaWdhMV9maWZvX21heF9kZXB0aCA9IFZYODAwX0lHQTFfRklGT19NQVhfREVQVEg7CisJCQlpZ2ExX2ZpZm9fdGhyZXNob2xkID0gVlg4MDBfSUdBMV9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgVlg4MDBfSUdBMV9GSUZPX0hJR0hfVEhSRVNIT0xEOworCQkJaWdhMV9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJICAgIFZYODAwX0lHQTFfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNOworCQl9CisKKwkJLyogU2V0IERpc3BsYXkgRklGTyBEZXBhdGggU2VsZWN0ICovCisJCXJlZ192YWx1ZSA9IElHQTFfRklGT19ERVBUSF9TRUxFQ1RfRk9STVVMQShpZ2ExX2ZpZm9fbWF4X2RlcHRoKTsKKwkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJICAgIGRpc3BsYXlfZmlmb19kZXB0aF9yZWcuaWdhMV9maWZvX2RlcHRoX3NlbGVjdF9yZWcucmVnX251bTsKKwkJcmVnID0gZGlzcGxheV9maWZvX2RlcHRoX3JlZy5pZ2ExX2ZpZm9fZGVwdGhfc2VsZWN0X3JlZy5yZWc7CisJCXZpYWZiX2xvYWRfcmVnKHJlZ192YWx1ZSwgdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQVNSKTsKKworCQkvKiBTZXQgRGlzcGxheSBGSUZPIFRocmVzaG9sZCBTZWxlY3QgKi8KKwkJcmVnX3ZhbHVlID0gSUdBMV9GSUZPX1RIUkVTSE9MRF9GT1JNVUxBKGlnYTFfZmlmb190aHJlc2hvbGQpOworCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkgICAgZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy4KKwkJICAgIGlnYTFfZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWdfbnVtOworCQlyZWcgPQorCQkgICAgZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy4KKwkJICAgIGlnYTFfZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWc7CisJCXZpYWZiX2xvYWRfcmVnKHJlZ192YWx1ZSwgdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQVNSKTsKKworCQkvKiBTZXQgRklGTyBIaWdoIFRocmVzaG9sZCBTZWxlY3QgKi8KKwkJcmVnX3ZhbHVlID0KKwkJICAgIElHQTFfRklGT19ISUdIX1RIUkVTSE9MRF9GT1JNVUxBKGlnYTFfZmlmb19oaWdoX3RocmVzaG9sZCk7CisJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCSAgICBmaWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdF9yZWcuCisJCSAgICBpZ2ExX2ZpZm9faGlnaF90aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWdfbnVtOworCQlyZWcgPQorCQkgICAgZmlmb19oaWdoX3RocmVzaG9sZF9zZWxlY3RfcmVnLgorCQkgICAgaWdhMV9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdF9yZWcucmVnOworCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsIHZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFTUik7CisKKwkJLyogU2V0IERpc3BsYXkgUXVldWUgRXhwaXJlIE51bSAqLworCQlyZWdfdmFsdWUgPQorCQkgICAgSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fRk9STVVMQQorCQkgICAgKGlnYTFfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtKTsKKwkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJICAgIGRpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcuCisJCSAgICBpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcucmVnX251bTsKKwkJcmVnID0KKwkJICAgIGRpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcuCisJCSAgICBpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcucmVnOworCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsIHZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFTUik7CisKKwl9IGVsc2UgeworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LODAwKSB7CisJCQlpZ2EyX2ZpZm9fbWF4X2RlcHRoID0gSzgwMF9JR0EyX0ZJRk9fTUFYX0RFUFRIOworCQkJaWdhMl9maWZvX3RocmVzaG9sZCA9IEs4MDBfSUdBMl9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgSzgwMF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQ7CisKKwkJCS8qIElmIHJlc29sdXRpb24gPiAxMjgweDEwMjQsIGV4cGlyZSBsZW5ndGggPSA2NCwKKwkJCSAgIGVsc2UgIGV4cGlyZSBsZW5ndGggPSAxMjggKi8KKwkJCWlmICgoaG9yX2FjdGl2ZSA+IDEyODApICYmICh2ZXJfYWN0aXZlID4gMTAyNCkpCisJCQkJaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPSAxNjsKKwkJCWVsc2UKKwkJCQlpZ2EyX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9CisJCQkJICAgIEs4MDBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9QTTgwMCkgeworCQkJaWdhMl9maWZvX21heF9kZXB0aCA9IFA4ODBfSUdBMl9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTJfZmlmb190aHJlc2hvbGQgPSBQODgwX0lHQTJfRklGT19USFJFU0hPTEQ7CisJCQlpZ2EyX2ZpZm9faGlnaF90aHJlc2hvbGQgPQorCQkJICAgIFA4ODBfSUdBMl9GSUZPX0hJR0hfVEhSRVNIT0xEOworCisJCQkvKiBJZiByZXNvbHV0aW9uID4gMTI4MHgxMDI0LCBleHBpcmUgbGVuZ3RoID0gNjQsCisJCQkgICBlbHNlICBleHBpcmUgbGVuZ3RoID0gMTI4ICovCisJCQlpZiAoKGhvcl9hY3RpdmUgPiAxMjgwKSAmJiAodmVyX2FjdGl2ZSA+IDEwMjQpKQorCQkJCWlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0gMTY7CisJCQllbHNlCisJCQkJaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJCSAgICBQODgwX0lHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNOworCQl9CisKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfQ043MDApIHsKKwkJCWlnYTJfZmlmb19tYXhfZGVwdGggPSBDTjcwMF9JR0EyX0ZJRk9fTUFYX0RFUFRIOworCQkJaWdhMl9maWZvX3RocmVzaG9sZCA9IENONzAwX0lHQTJfRklGT19USFJFU0hPTEQ7CisJCQlpZ2EyX2ZpZm9faGlnaF90aHJlc2hvbGQgPQorCQkJICAgIENONzAwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRDsKKworCQkJLyogSWYgcmVzb2x1dGlvbiA+IDEyODB4MTAyNCwgZXhwaXJlIGxlbmd0aCA9IDY0LAorCQkJICAgZWxzZSBleHBpcmUgbGVuZ3RoID0gMTI4ICovCisJCQlpZiAoKGhvcl9hY3RpdmUgPiAxMjgwKSAmJiAodmVyX2FjdGl2ZSA+IDEwMjQpKQorCQkJCWlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0gMTY7CisJCQllbHNlCisJCQkJaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJCSAgICBDTjcwMF9JR0EyX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTTsKKwkJfQorCisJCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NYNzAwKSB7CisJCQlpZ2EyX2ZpZm9fbWF4X2RlcHRoID0gQ1g3MDBfSUdBMl9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTJfZmlmb190aHJlc2hvbGQgPSBDWDcwMF9JR0EyX0ZJRk9fVEhSRVNIT0xEOworCQkJaWdhMl9maWZvX2hpZ2hfdGhyZXNob2xkID0KKwkJCSAgICBDWDcwMF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQ7CisJCQlpZ2EyX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bSA9CisJCQkgICAgQ1g3MDBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LOE04OTApIHsKKwkJCWlnYTJfZmlmb19tYXhfZGVwdGggPSBLOE04OTBfSUdBMl9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTJfZmlmb190aHJlc2hvbGQgPSBLOE04OTBfSUdBMl9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgSzhNODkwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBLOE04OTBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9QNE04OTApIHsKKwkJCWlnYTJfZmlmb19tYXhfZGVwdGggPSBQNE04OTBfSUdBMl9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTJfZmlmb190aHJlc2hvbGQgPSBQNE04OTBfSUdBMl9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgUDRNODkwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBQNE04OTBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9QNE05MDApIHsKKwkJCWlnYTJfZmlmb19tYXhfZGVwdGggPSBQNE05MDBfSUdBMl9GSUZPX01BWF9ERVBUSDsKKwkJCWlnYTJfZmlmb190aHJlc2hvbGQgPSBQNE05MDBfSUdBMl9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgUDRNOTAwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRDsKKwkJCWlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtID0KKwkJCSAgICBQNE05MDBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU07CisJCX0KKworCQlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9WWDgwMCkgeworCQkJaWdhMl9maWZvX21heF9kZXB0aCA9IFZYODAwX0lHQTJfRklGT19NQVhfREVQVEg7CisJCQlpZ2EyX2ZpZm9fdGhyZXNob2xkID0gVlg4MDBfSUdBMl9GSUZPX1RIUkVTSE9MRDsKKwkJCWlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCA9CisJCQkgICAgVlg4MDBfSUdBMl9GSUZPX0hJR0hfVEhSRVNIT0xEOworCQkJaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0gPQorCQkJICAgIFZYODAwX0lHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNOworCQl9CisKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfSzgwMCkgeworCQkJLyogU2V0IERpc3BsYXkgRklGTyBEZXBhdGggU2VsZWN0ICovCisJCQlyZWdfdmFsdWUgPQorCQkJICAgIElHQTJfRklGT19ERVBUSF9TRUxFQ1RfRk9STVVMQShpZ2EyX2ZpZm9fbWF4X2RlcHRoKQorCQkJICAgIC0gMTsKKwkJCS8qIFBhdGNoIExDRCBpbiBJR0EyIGNhc2UgKi8KKwkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkgICAgZGlzcGxheV9maWZvX2RlcHRoX3JlZy4KKwkJCSAgICBpZ2EyX2ZpZm9fZGVwdGhfc2VsZWN0X3JlZy5yZWdfbnVtOworCQkJcmVnID0KKwkJCSAgICBkaXNwbGF5X2ZpZm9fZGVwdGhfcmVnLgorCQkJICAgIGlnYTJfZmlmb19kZXB0aF9zZWxlY3RfcmVnLnJlZzsKKwkJCXZpYWZiX2xvYWRfcmVnKHJlZ192YWx1ZSwKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOworCQl9IGVsc2UgeworCisJCQkvKiBTZXQgRGlzcGxheSBGSUZPIERlcGF0aCBTZWxlY3QgKi8KKwkJCXJlZ192YWx1ZSA9CisJCQkgICAgSUdBMl9GSUZPX0RFUFRIX1NFTEVDVF9GT1JNVUxBKGlnYTJfZmlmb19tYXhfZGVwdGgpOworCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCSAgICBkaXNwbGF5X2ZpZm9fZGVwdGhfcmVnLgorCQkJICAgIGlnYTJfZmlmb19kZXB0aF9zZWxlY3RfcmVnLnJlZ19udW07CisJCQlyZWcgPQorCQkJICAgIGRpc3BsYXlfZmlmb19kZXB0aF9yZWcuCisJCQkgICAgaWdhMl9maWZvX2RlcHRoX3NlbGVjdF9yZWcucmVnOworCQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLAorCQkJCXZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFDUik7CisJCX0KKworCQkvKiBTZXQgRGlzcGxheSBGSUZPIFRocmVzaG9sZCBTZWxlY3QgKi8KKwkJcmVnX3ZhbHVlID0gSUdBMl9GSUZPX1RIUkVTSE9MRF9GT1JNVUxBKGlnYTJfZmlmb190aHJlc2hvbGQpOworCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkgICAgZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy4KKwkJICAgIGlnYTJfZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWdfbnVtOworCQlyZWcgPQorCQkgICAgZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy4KKwkJICAgIGlnYTJfZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWc7CisJCXZpYWZiX2xvYWRfcmVnKHJlZ192YWx1ZSwgdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQUNSKTsKKworCQkvKiBTZXQgRklGTyBIaWdoIFRocmVzaG9sZCBTZWxlY3QgKi8KKwkJcmVnX3ZhbHVlID0KKwkJICAgIElHQTJfRklGT19ISUdIX1RIUkVTSE9MRF9GT1JNVUxBKGlnYTJfZmlmb19oaWdoX3RocmVzaG9sZCk7CisJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCSAgICBmaWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdF9yZWcuCisJCSAgICBpZ2EyX2ZpZm9faGlnaF90aHJlc2hvbGRfc2VsZWN0X3JlZy5yZWdfbnVtOworCQlyZWcgPQorCQkgICAgZmlmb19oaWdoX3RocmVzaG9sZF9zZWxlY3RfcmVnLgorCQkgICAgaWdhMl9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdF9yZWcucmVnOworCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsIHZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFDUik7CisKKwkJLyogU2V0IERpc3BsYXkgUXVldWUgRXhwaXJlIE51bSAqLworCQlyZWdfdmFsdWUgPQorCQkgICAgSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fRk9STVVMQQorCQkgICAgKGlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtKTsKKwkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJICAgIGRpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcuCisJCSAgICBpZ2EyX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcucmVnX251bTsKKwkJcmVnID0KKwkJICAgIGRpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcuCisJCSAgICBpZ2EyX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWcucmVnOworCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsIHZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFDUik7CisKKwl9CisKK30KKwordTMyIHZpYWZiX2dldF9jbGtfdmFsdWUoaW50IGNsaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVE9UQUxfUExMX1RBQkxFOyBpKyspIHsKKwkJaWYgKGNsayA9PSBwbGxfdmFsdWVbaV0uY2xrKSB7CisJCQlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQkJY2FzZSBVTklDSFJPTUVfQ0xFMjY2OgorCQkJY2FzZSBVTklDSFJPTUVfSzQwMDoKKwkJCQlyZXR1cm4gcGxsX3ZhbHVlW2ldLmNsZTI2Nl9wbGw7CisKKwkJCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJCQljYXNlIFVOSUNIUk9NRV9QTTgwMDoKKwkJCWNhc2UgVU5JQ0hST01FX0NONzAwOgorCQkJCXJldHVybiBwbGxfdmFsdWVbaV0uazgwMF9wbGw7CisKKwkJCWNhc2UgVU5JQ0hST01FX0NYNzAwOgorCQkJY2FzZSBVTklDSFJPTUVfSzhNODkwOgorCQkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQkJY2FzZSBVTklDSFJPTUVfUDRNOTAwOgorCQkJY2FzZSBVTklDSFJPTUVfVlg4MDA6CisJCQkJcmV0dXJuIHBsbF92YWx1ZVtpXS5jeDcwMF9wbGw7CisJCQl9CisJCX0KKwl9CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJDYW4ndCBmaW5kIG1hdGNoIFBMTCB2YWx1ZVxuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IFZDTEsqLwordm9pZCB2aWFmYl9zZXRfdmNsb2NrKHUzMiBDTEssIGludCBzZXRfaWdhKQoreworCXVuc2lnbmVkIGNoYXIgUmVnVGVtcDsKKworCS8qIEguVy4gUmVzZXQgOiBPTiAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTcsIFZJQUNSLCAweDAwLCBCSVQ3KTsKKworCWlmICgoc2V0X2lnYSA9PSBJR0ExKSB8fCAoc2V0X2lnYSA9PSBJR0ExX0lHQTIpKSB7CisJCS8qIENoYW5nZSBELE4gRk9SIFZDTEsgKi8KKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfQ0xFMjY2OgorCQljYXNlIFVOSUNIUk9NRV9LNDAwOgorCQkJdmlhZmJfd3JpdGVfcmVnKFNSNDYsIFZJQVNSLCBDTEsgLyAweDEwMCk7CisJCQl2aWFmYl93cml0ZV9yZWcoU1I0NywgVklBU1IsIENMSyAlIDB4MTAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJCWNhc2UgVU5JQ0hST01FX1BNODAwOgorCQljYXNlIFVOSUNIUk9NRV9DTjcwMDoKKwkJY2FzZSBVTklDSFJPTUVfQ1g3MDA6CisJCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCWNhc2UgVU5JQ0hST01FX1ZYODAwOgorCQkJdmlhZmJfd3JpdGVfcmVnKFNSNDQsIFZJQVNSLCBDTEsgLyAweDEwMDAwKTsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuU1I0ND0leCIsIENMSyAvIDB4MTAwMDApOworCQkJdmlhZmJfd3JpdGVfcmVnKFNSNDUsIFZJQVNSLCAoQ0xLICYgMHhGRkZGKSAvIDB4MTAwKTsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8gIlxuU1I0NT0leCIsCisJCQkJICAoQ0xLICYgMHhGRkZGKSAvIDB4MTAwKTsKKwkJCXZpYWZiX3dyaXRlX3JlZyhTUjQ2LCBWSUFTUiwgQ0xLICUgMHgxMDApOworCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG5TUjQ2PSV4IiwgQ0xLICUgMHgxMDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKHNldF9pZ2EgPT0gSUdBMikgfHwgKHNldF9pZ2EgPT0gSUdBMV9JR0EyKSkgeworCQkvKiBDaGFuZ2UgRCxOIEZPUiBMQ0sgKi8KKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfQ0xFMjY2OgorCQljYXNlIFVOSUNIUk9NRV9LNDAwOgorCQkJdmlhZmJfd3JpdGVfcmVnKFNSNDQsIFZJQVNSLCBDTEsgLyAweDEwMCk7CisJCQl2aWFmYl93cml0ZV9yZWcoU1I0NSwgVklBU1IsIENMSyAlIDB4MTAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJCWNhc2UgVU5JQ0hST01FX1BNODAwOgorCQljYXNlIFVOSUNIUk9NRV9DTjcwMDoKKwkJY2FzZSBVTklDSFJPTUVfQ1g3MDA6CisJCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCWNhc2UgVU5JQ0hST01FX1ZYODAwOgorCQkJdmlhZmJfd3JpdGVfcmVnKFNSNEEsIFZJQVNSLCBDTEsgLyAweDEwMDAwKTsKKwkJCXZpYWZiX3dyaXRlX3JlZyhTUjRCLCBWSUFTUiwgKENMSyAmIDB4RkZGRikgLyAweDEwMCk7CisJCQl2aWFmYl93cml0ZV9yZWcoU1I0QywgVklBU1IsIENMSyAlIDB4MTAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSC5XLiBSZXNldCA6IE9GRiAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTcsIFZJQUNSLCAweDgwLCBCSVQ3KTsKKworCS8qIFJlc2V0IFBMTCAqLworCWlmICgoc2V0X2lnYSA9PSBJR0ExKSB8fCAoc2V0X2lnYSA9PSBJR0ExX0lHQTIpKSB7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSNDAsIFZJQVNSLCAweDAyLCBCSVQxKTsKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I0MCwgVklBU1IsIDB4MDAsIEJJVDEpOworCX0KKworCWlmICgoc2V0X2lnYSA9PSBJR0EyKSB8fCAoc2V0X2lnYSA9PSBJR0ExX0lHQTIpKSB7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSNDAsIFZJQVNSLCAweDAxLCBCSVQwKTsKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I0MCwgVklBU1IsIDB4MDAsIEJJVDApOworCX0KKworCS8qIEZpcmUhICovCisJUmVnVGVtcCA9IGluYihWSUFSTWlzYyk7CisJb3V0YihSZWdUZW1wIHwgKEJJVDIgKyBCSVQzKSwgVklBV01pc2MpOworfQorCit2b2lkIHZpYWZiX2xvYWRfY3J0Y190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIGRldmljZV90aW1pbmcsCisJaW50IHNldF9pZ2EpCit7CisJaW50IGk7CisJaW50IHZpYWZiX2xvYWRfcmVnX251bSA9IDA7CisJaW50IHJlZ192YWx1ZSA9IDA7CisJc3RydWN0IGlvX3JlZ2lzdGVyICpyZWcgPSBOVUxMOworCisJdmlhZmJfdW5sb2NrX2NydCgpOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIEhfVE9UQUxfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgorCQkJCQkJCSAgIGhvcl90b3RhbCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCQkJaWdhMV9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKKwkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfQUREUl9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0ExX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KKwkJCQkJCQkgIGhvcl9hZGRyKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCQlpZ2ExX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07CisJCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYWRkci5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07CisJCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0ExX0hPUl9CTEFOS19FTkRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCisJCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0ExX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnX251bTsKKwkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl9zeW5jX3N0YXJ0LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSF9TWU5DX0VORF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0ExX0hPUl9TWU5DX0VORF9GT1JNVUxBCisJCQkJICAgIChkZXZpY2VfdGltaW5nLmhvcl9zeW5jX3N0YXJ0LAorCQkJCSAgICAgZGV2aWNlX3RpbWluZy5ob3Jfc3luY19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfZW5kLnJlZ19udW07CisJCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX1RPVEFMX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTFfVkVSX1RPVEFMX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KKwkJCQkJCQkgICB2ZXJfdG90YWwpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJCWlnYTFfY3J0Y19yZWcudmVyX3RvdGFsLnJlZ19udW07CisJCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfdG90YWwucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX0FERFJfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9WRVJfQUREUl9GT1JNVUxBKGRldmljZV90aW1pbmcuCisJCQkJCQkJICB2ZXJfYWRkcik7CisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCQkJaWdhMV9jcnRjX3JlZy52ZXJfYWRkci5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2FkZHIucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX0JMQU5LX1NUQVJUX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTFfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19zdGFydC5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9CTEFOS19FTkRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9WRVJfQkxBTktfRU5EX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0LAorCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfZW5kKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnX251bTsKKwkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX1NZTkNfU1RBUlRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9WRVJfU1lOQ19TVEFSVF9GT1JNVUxBCisJCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0KTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZ19udW07CisJCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfc3luY19zdGFydC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfU1lOQ19FTkRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMV9WRVJfU1lOQ19FTkRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfc3luY19zdGFydCwKKwkJCQkgICAgIGRldmljZV90aW1pbmcudmVyX3N5bmNfZW5kKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX2VuZC5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZzsKKwkJCQlicmVhazsKKworCQkJfQorCQl9CisKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMikgeworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIEhfVE9UQUxfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgorCQkJCQkJCSAgIGhvcl90b3RhbCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCQkJaWdhMl9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKKwkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfQUREUl9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KKwkJCQkJCQkgIGhvcl9hZGRyKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCQlpZ2EyX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07CisJCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYWRkci5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07CisJCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX0hPUl9CTEFOS19FTkRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCisJCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOworCQkJCWlmIChVTklDSFJPTUVfQ043MDAgPD0KKwkJCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKQorCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19zdGFydC4KKwkJCQkJICAgIHJlZ19udW07CisJCQkJZWxzZQorCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPSAzOworCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBIX1NZTkNfRU5EX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfSE9SX1NZTkNfRU5EX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQsCisJCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9zeW5jX2VuZCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnX251bTsKKwkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl9zeW5jX2VuZC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfVE9UQUxfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9WRVJfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgorCQkJCQkJCSAgIHZlcl90b3RhbCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCQkJaWdhMl9jcnRjX3JlZy52ZXJfdG90YWwucmVnX251bTsKKwkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl90b3RhbC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfQUREUl9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KKwkJCQkJCQkgIHZlcl9hZGRyKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQorCQkJCQlpZ2EyX2NydGNfcmVnLnZlcl9hZGRyLnJlZ19udW07CisJCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYWRkci5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfQkxBTktfU1RBUlRfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9WRVJfQkxBTktfU1RBUlRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZ19udW07CisJCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYmxhbmtfc3RhcnQucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX0JMQU5LX0VORF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9CTEFOS19FTkRfRk9STVVMQQorCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQsCisJCQkJICAgICBkZXZpY2VfdGltaW5nLnZlcl9ibGFua19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWdfbnVtOworCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfU1lOQ19TVEFSVF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEKKwkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX3N5bmNfc3RhcnQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfc3RhcnQucmVnX251bTsKKwkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9TWU5DX0VORF9JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9TWU5DX0VORF9GT1JNVUxBCisJCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0LAorCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfc3luY19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9CisJCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZ19udW07CisJCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfc3luY19lbmQucmVnOworCQkJCWJyZWFrOworCisJCQl9CisJCX0KKwkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOworCX0KKworCXZpYWZiX2xvY2tfY3J0KCk7Cit9CisKK3ZvaWQgdmlhZmJfc2V0X2NvbG9yX2RlcHRoKGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpCit7CisJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQlzd2l0Y2ggKGJwcF9ieXRlKSB7CisJCWNhc2UgTU9ERV84QlBQOgorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxNSwgVklBU1IsIDB4MjIsIDB4N0UpOworCQkJYnJlYWs7CisJCWNhc2UgTU9ERV8xNkJQUDoKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMTUsIFZJQVNSLCAweEI2LCAweEZFKTsKKwkJCWJyZWFrOworCQljYXNlIE1PREVfMzJCUFA6CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjE1LCBWSUFTUiwgMHhBRSwgMHhGRSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoYnBwX2J5dGUpIHsKKwkJY2FzZSBNT0RFXzhCUFA6CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjY3LCBWSUFDUiwgMHgwMCwgQklUNiArIEJJVDcpOworCQkJYnJlYWs7CisJCWNhc2UgTU9ERV8xNkJQUDoKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNjcsIFZJQUNSLCAweDQwLCBCSVQ2ICsgQklUNyk7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFXzMyQlBQOgorCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2NywgVklBQ1IsIDB4QzAsIEJJVDYgKyBCSVQ3KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoc3RydWN0IGNydF9tb2RlX3RhYmxlICpjcnRfdGFibGUsCisJaW50IG1vZGVfaW5kZXgsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpCit7CisJc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2aWRlb19tb2RlOworCXN0cnVjdCBkaXNwbGF5X3RpbWluZyBjcnRfcmVnOworCWludCBpOworCWludCBpbmRleCA9IDA7CisJaW50IGhfYWRkciwgdl9hZGRyOworCXUzMiBwbGxfRF9OOworCisJdmlkZW9fbW9kZSA9ICZDTEUyNjZNb2Rlc1tzZWFyY2hfbW9kZV9zZXR0aW5nKG1vZGVfaW5kZXgpXTsKKworCWZvciAoaSA9IDA7IGkgPCB2aWRlb19tb2RlLT5tb2RlX2FycmF5OyBpKyspIHsKKwkJaW5kZXggPSBpOworCisJCWlmIChjcnRfdGFibGVbaV0ucmVmcmVzaF9yYXRlID09IHZpYXBhcmluZm8tPgorCQkJY3J0X3NldHRpbmdfaW5mby0+cmVmcmVzaF9yYXRlKQorCQkJYnJlYWs7CisJfQorCisJY3J0X3JlZyA9IGNydF90YWJsZVtpbmRleF0uY3J0YzsKKworCS8qIE1vZGUgNjQweDQ4MCBoYXMgYm9yZGVyLCBidXQgTENEL0RGUCBkaWRuJ3QgaGF2ZSBib3JkZXIuICovCisJLyogU28gd2Ugd291bGQgZGVsZXRlIGJvcmRlci4gKi8KKwlpZiAoKHZpYWZiX0xDRF9PTiB8IHZpYWZiX0RWSV9PTikgJiYgKG1vZGVfaW5kZXggPT0gVklBX1JFU182NDBYNDgwKQorCSAgICAmJiAodmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+cmVmcmVzaF9yYXRlID09IDYwKSkgeworCQkvKiBUaGUgYm9yZGVyIGlzIDggcGl4ZWxzLiAqLworCQljcnRfcmVnLmhvcl9ibGFua19zdGFydCA9IGNydF9yZWcuaG9yX2JsYW5rX3N0YXJ0IC0gODsKKworCQkvKiBCbGFua2luZyB0aW1lIHNob3VsZCBhZGQgbGVmdCBhbmQgcmlnaHQgYm9yZGVycy4gKi8KKwkJY3J0X3JlZy5ob3JfYmxhbmtfZW5kID0gY3J0X3JlZy5ob3JfYmxhbmtfZW5kICsgMTY7CisJfQorCisJaF9hZGRyID0gY3J0X3JlZy5ob3JfYWRkcjsKKwl2X2FkZHIgPSBjcnRfcmVnLnZlcl9hZGRyOworCisJLyogdXBkYXRlIHBvbGFyaXR5IGZvciBDUlQgdGltaW5nICovCisJaWYgKGNydF90YWJsZVtpbmRleF0uaF9zeW5jX3BvbGFyaXR5ID09IE5FR0FUSVZFKSB7CisJCWlmIChjcnRfdGFibGVbaW5kZXhdLnZfc3luY19wb2xhcml0eSA9PSBORUdBVElWRSkKKwkJCW91dGIoKGluYihWSUFSTWlzYykgJiAofihCSVQ2ICsgQklUNykpKSB8CisJCQkgICAgIChCSVQ2ICsgQklUNyksIFZJQVdNaXNjKTsKKwkJZWxzZQorCQkJb3V0YigoaW5iKFZJQVJNaXNjKSAmICh+KEJJVDYgKyBCSVQ3KSkpIHwgKEJJVDYpLAorCQkJICAgICBWSUFXTWlzYyk7CisJfSBlbHNlIHsKKwkJaWYgKGNydF90YWJsZVtpbmRleF0udl9zeW5jX3BvbGFyaXR5ID09IE5FR0FUSVZFKQorCQkJb3V0YigoaW5iKFZJQVJNaXNjKSAmICh+KEJJVDYgKyBCSVQ3KSkpIHwgKEJJVDcpLAorCQkJICAgICBWSUFXTWlzYyk7CisJCWVsc2UKKwkJCW91dGIoKGluYihWSUFSTWlzYykgJiAofihCSVQ2ICsgQklUNykpKSwgVklBV01pc2MpOworCX0KKworCWlmIChzZXRfaWdhID09IElHQTEpIHsKKwkJdmlhZmJfdW5sb2NrX2NydCgpOworCQl2aWFmYl93cml0ZV9yZWcoQ1IwOSwgVklBQ1IsIDB4MDApOwkvKmluaXRpYWwgQ1IwOT0wICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTEsIFZJQUNSLCAweDAwLCBCSVQ0ICsgQklUNSArIEJJVDYpOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjE3LCBWSUFDUiwgMHgwMCwgQklUNyk7CisJfQorCisJc3dpdGNoIChzZXRfaWdhKSB7CisJY2FzZSBJR0ExOgorCQl2aWFmYl9sb2FkX2NydGNfdGltaW5nKGNydF9yZWcsIElHQTEpOworCQlicmVhazsKKwljYXNlIElHQTI6CisJCXZpYWZiX2xvYWRfY3J0Y190aW1pbmcoY3J0X3JlZywgSUdBMik7CisJCWJyZWFrOworCX0KKworCWxvYWRfZml4X2JpdF9jcnRjX3JlZygpOworCXZpYWZiX2xvY2tfY3J0KCk7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IxNywgVklBQ1IsIDB4ODAsIEJJVDcpOworCXZpYWZiX2xvYWRfb2Zmc2V0X3JlZyhoX2FkZHIsIGJwcF9ieXRlLCBzZXRfaWdhKTsKKwl2aWFmYl9sb2FkX2ZldGNoX2NvdW50X3JlZyhoX2FkZHIsIGJwcF9ieXRlLCBzZXRfaWdhKTsKKworCS8qIGxvYWQgRklGTyAqLworCWlmICgodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICE9IFVOSUNIUk9NRV9DTEUyNjYpCisJICAgICYmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0gVU5JQ0hST01FX0s0MDApKQorCQl2aWFmYl9sb2FkX0ZJRk9fcmVnKHNldF9pZ2EsIGhfYWRkciwgdl9hZGRyKTsKKworCS8qIGxvYWQgU1IgUmVnaXN0ZXIgQWJvdXQgTWVtb3J5IGFuZCBDb2xvciBwYXJ0ICovCisJdmlhZmJfc2V0X2NvbG9yX2RlcHRoKGJwcF9ieXRlLCBzZXRfaWdhKTsKKworCXBsbF9EX04gPSB2aWFmYl9nZXRfY2xrX3ZhbHVlKGNydF90YWJsZVtpbmRleF0uY2xrKTsKKwlERUJVR19NU0coS0VSTl9JTkZPICJQTEw9JXgiLCBwbGxfRF9OKTsKKwl2aWFmYl9zZXRfdmNsb2NrKHBsbF9EX04sIHNldF9pZ2EpOworCit9CisKK3ZvaWQgdmlhZmJfaW5pdF9jaGlwX2luZm8odm9pZCkKK3sKKwlpbml0X2dmeF9jaGlwX2luZm8oKTsKKwlpbml0X3RtZHNfY2hpcF9pbmZvKCk7CisJaW5pdF9sdmRzX2NoaXBfaW5mbygpOworCisJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+aWdhX3BhdGggPSBJR0ExOworCXZpYXBhcmluZm8tPmNydF9zZXR0aW5nX2luZm8tPnJlZnJlc2hfcmF0ZSA9IHZpYWZiX3JlZnJlc2g7CisKKwkvKlNldCBJR0EgcGF0aCBmb3IgZWFjaCBkZXZpY2UgKi8KKwl2aWFmYl9zZXRfaWdhX3BhdGgoKTsKKworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9IHZpYWZiX2xjZF9kc3BfbWV0aG9kOworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5nZXRfbGNkX3NpemVfbWV0aG9kID0KKwkJR0VUX0xDRF9TSVpFX0JZX1VTRVJfU0VUVElORzsKKwl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGUgPSB2aWFmYl9sY2RfbW9kZTsKKwl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmRpc3BsYXlfbWV0aG9kID0KKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRpc3BsYXlfbWV0aG9kOworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+bGNkX21vZGUgPQorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGU7Cit9CisKK3ZvaWQgdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKGludCBocmVzLCBpbnQgdnJlcywKKwlpbnQgYnBwLCBpbnQgdm1vZGVfcmVmcmVzaCwgaW50IGZsYWcpCit7CisJaWYgKGZsYWcgPT0gMCkgeworCQl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5oX2FjdGl2ZSA9IGhyZXM7CisJCXZpYXBhcmluZm8tPmNydF9zZXR0aW5nX2luZm8tPnZfYWN0aXZlID0gdnJlczsKKwkJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+YnBwID0gYnBwOworCQl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5yZWZyZXNoX3JhdGUgPQorCQkJdm1vZGVfcmVmcmVzaDsKKworCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUgPSBocmVzOworCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+dl9hY3RpdmUgPSB2cmVzOworCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+YnBwID0gYnBwOworCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+cmVmcmVzaF9yYXRlID0KKwkJCXZtb2RlX3JlZnJlc2g7CisKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmhfYWN0aXZlID0gaHJlczsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPnZfYWN0aXZlID0gdnJlczsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmJwcCA9IGJwcDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPnJlZnJlc2hfcmF0ZSA9CisJCQl2bW9kZV9yZWZyZXNoOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmhfYWN0aXZlID0gaHJlczsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT52X2FjdGl2ZSA9IHZyZXM7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+YnBwID0gYnBwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPnJlZnJlc2hfcmF0ZSA9CisJCQl2bW9kZV9yZWZyZXNoOworCX0gZWxzZSB7CisKKwkJaWYgKHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSB7CisJCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUgPSBocmVzOworCQkJdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPnZfYWN0aXZlID0gdnJlczsKKwkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5icHAgPSBicHA7CisJCQl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+cmVmcmVzaF9yYXRlID0KKwkJCQl2bW9kZV9yZWZyZXNoOworCQl9CisKKwkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUgPSBocmVzOworCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPnZfYWN0aXZlID0gdnJlczsKKwkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5icHAgPSBicHA7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+cmVmcmVzaF9yYXRlID0KKwkJCQl2bW9kZV9yZWZyZXNoOworCQl9CisJCWlmIChJR0EyID09IHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGgpIHsKKwkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aF9hY3RpdmUgPSBocmVzOworCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT52X2FjdGl2ZSA9IHZyZXM7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmJwcCA9IGJwcDsKKwkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+cmVmcmVzaF9yYXRlID0KKwkJCQl2bW9kZV9yZWZyZXNoOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2dmeF9jaGlwX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdTMyIGk7CisJdTggdG1wOworCisJLyogSW5kZW50aWZ5IEdGWCBDaGlwIE5hbWUgKi8KKwlmb3IgKGkgPSAwOyBwY2lpZGxpc3RbaV0udmVuZG9yICE9IDA7IGkrKykgeworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UocGNpaWRsaXN0W2ldLnZlbmRvciwKKwkJCXBjaWlkbGlzdFtpXS5kZXZpY2UsIDApOworCQlpZiAocGRldikKKwkJCWJyZWFrOworCX0KKworCWlmICghcGNpaWRsaXN0W2ldLnZlbmRvcikKKwkJcmV0dXJuIDsKKworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9IHBjaWlkbGlzdFtpXS5jaGlwX2luZGV4OworCisJLyogQ2hlY2sgcmV2aXNpb24gb2YgQ0xFMjY2IENoaXAgKi8KKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpIHsKKwkJLyogQ1I0RiBvbmx5IGRlZmluZSBpbiBDTEUyNjYuQ1ggY2hpcCAqLworCQl0bXAgPSB2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I0Rik7CisJCXZpYWZiX3dyaXRlX3JlZyhDUjRGLCBWSUFDUiwgMHg1NSk7CisJCWlmICh2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I0RikgIT0gMHg1NSkKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfcmV2aXNpb24gPQorCQkJQ0xFMjY2X1JFVklTSU9OX0FYOworCQllbHNlCisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX3JldmlzaW9uID0KKwkJCUNMRTI2Nl9SRVZJU0lPTl9DWDsKKwkJLyogcmVzdG9yZSBvcmlnbmFsIENSNEYgdmFsdWUgKi8KKwkJdmlhZmJfd3JpdGVfcmVnKENSNEYsIFZJQUNSLCB0bXApOworCX0KKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NYNzAwKSB7CisJCXRtcCA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjQzKTsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiU1I0MzolWFxuIiwgdG1wKTsKKwkJaWYgKHRtcCAmIDB4MDIpIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfcmV2aXNpb24gPQorCQkJCUNYNzAwX1JFVklTSU9OXzcwME0yOworCQl9IGVsc2UgaWYgKHRtcCAmIDB4NDApIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfcmV2aXNpb24gPQorCQkJCUNYNzAwX1JFVklTSU9OXzcwME07CisJCX0gZWxzZSB7CisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX3JldmlzaW9uID0KKwkJCQlDWDcwMF9SRVZJU0lPTl83MDA7CisJCX0KKwl9CisKKwlwY2lfZGV2X3B1dChwZGV2KTsKK30KKworc3RhdGljIHZvaWQgaW5pdF90bWRzX2NoaXBfaW5mbyh2b2lkKQoreworCXZpYWZiX3RtZHNfdHJhc21pdHRlcl9pZGVudGlmeSgpOworCisJaWYgKElOVEVSRkFDRV9OT05FID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8uCisJCW91dHB1dF9pbnRlcmZhY2UpIHsKKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfQ1g3MDA6CisJCQl7CisJCQkJLyogd2Ugc2hvdWxkIGNoZWNrIHN1cHBvcnQgYnkgaGFyZHdhcmUgbGF5b3V0LiovCisJCQkJaWYgKCh2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCA9PQorCQkJCSAgICAgSFdfTEFZT1VUX0RWSV9PTkxZKQorCQkJCSAgICB8fCAodmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQgPT0KKwkJCQkJSFdfTEFZT1VUX0xDRF9EVkkpKSB7CisJCQkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8uCisJCQkJCSAgICBvdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX1RNRFM7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mby4KKwkJCQkJCW91dHB1dF9pbnRlcmZhY2UgPQorCQkJCQkJSU5URVJGQUNFX05PTkU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQkJLyogVE1EUyBvbiBQQ0lFLCB3ZSBzZXQgREZQTE9XIGFzIGRlZmF1bHQuICovCisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLm91dHB1dF9pbnRlcmZhY2UgPQorCQkJICAgIElOVEVSRkFDRV9ERlBfTE9XOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl7CisJCQkJLyogc2V0IERWUDEgZGVmYXVsdCBmb3IgRFZJICovCisJCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT50bWRzX2NoaXBfaW5mbworCQkJCS5vdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX0RWUDE7CisJCQl9CisJCX0KKwl9CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJUTURTIENoaXAgPSAlZFxuIiwKKwkJICB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lKTsKKwl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+Z2V0X2R2aV9zaXplX21ldGhvZCA9CisJCUdFVF9EVklfU0laRV9CWV9WR0FfQklPUzsKKwl2aWFmYl9pbml0X2R2aV9zaXplKCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbHZkc19jaGlwX2luZm8odm9pZCkKK3sKKwlpZiAodmlhZmJfbGNkX3BhbmVsX2lkID4gTENEX1BBTkVMX0lEX01BWElNVU0pCisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5nZXRfbGNkX3NpemVfbWV0aG9kID0KKwkJICAgIEdFVF9MQ0RfU0laRV9CWV9WR0FfQklPUzsKKwllbHNlCisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5nZXRfbGNkX3NpemVfbWV0aG9kID0KKwkJICAgIEdFVF9MQ0RfU0laRV9CWV9VU0VSX1NFVFRJTkc7CisKKwl2aWFmYl9sdmRzX3RyYXNtaXR0ZXJfaWRlbnRpZnkoKTsKKwl2aWFmYl9pbml0X2xjZF9zaXplKCk7CisJdmlhZmJfaW5pdF9sdmRzX291dHB1dF9pbnRlcmZhY2UoJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8sCisJCQkJICAgdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8pOworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMi5sdmRzX2NoaXBfbmFtZSkgeworCQl2aWFmYl9pbml0X2x2ZHNfb3V0cHV0X2ludGVyZmFjZSgmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJCWx2ZHNfY2hpcF9pbmZvMiwgdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yKTsKKwl9CisJLypJZiBDWDcwMCx0d28gc2luZ2VsIExDRCwgd2UgbmVlZCB0byByZWFzc2lnbgorCSAgIExDRCBpbnRlcmZhY2UgdG8gZGlmZmVyZW50IExWRFMgcG9ydCAqLworCWlmICgoVU5JQ0hST01FX0NYNzAwID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkKKwkgICAgJiYgKEhXX0xBWU9VVF9MQ0QxX0xDRDIgPT0gdmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQpKSB7CisJCWlmICgoSU5URUdSQVRFRF9MVkRTID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uCisJCQlsdmRzX2NoaXBfbmFtZSkgJiYgKElOVEVHUkFURURfTFZEUyA9PQorCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJCWx2ZHNfY2hpcF9pbmZvMi5sdmRzX2NoaXBfbmFtZSkpIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSA9CisJCQkJSU5URVJGQUNFX0xWRFMwOworCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIuCisJCQkJb3V0cHV0X2ludGVyZmFjZSA9CisJCQkgICAgSU5URVJGQUNFX0xWRFMxOworCQl9CisJfQorCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiTFZEUyBDaGlwID0gJWRcbiIsCisJCSAgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSk7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiTFZEUzEgb3V0cHV0X2ludGVyZmFjZSA9ICVkXG4iLAorCQkgIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSk7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiTFZEUzIgb3V0cHV0X2ludGVyZmFjZSA9ICVkXG4iLAorCQkgIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ub3V0cHV0X2ludGVyZmFjZSk7Cit9CisKK3ZvaWQgdmlhZmJfaW5pdF9kYWMoaW50IHNldF9pZ2EpCit7CisJaW50IGk7CisJdTggdG1wOworCisJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQkvKiBhY2Nlc3MgUHJpbWFyeSBEaXNwbGF5J3MgTFVUICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUEsIFZJQVNSLCAweDAwLCBCSVQwKTsKKwkJLyogdHVybiBvZmYgTENLICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUIsIFZJQVNSLCAweDAwLCBCSVQ3ICsgQklUNik7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJd3JpdGVfZGFjX3JlZyhpLCBwYWxMVVRfdGFibGVbaV0ucmVkLAorCQkJCSAgICAgIHBhbExVVF90YWJsZVtpXS5ncmVlbiwKKwkJCQkgICAgICBwYWxMVVRfdGFibGVbaV0uYmx1ZSk7CisJCX0KKwkJLyogdHVybiBvbiBMQ0sgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQiwgVklBU1IsIDB4QzAsIEJJVDcgKyBCSVQ2KTsKKwl9IGVsc2UgeworCQl0bXAgPSB2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I2QSk7CisJCS8qIGFjY2VzcyBTZWNvbmRhcnkgRGlzcGxheSdzIExVVCAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHg0MCwgQklUNik7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUEsIFZJQVNSLCAweDAxLCBCSVQwKTsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQl3cml0ZV9kYWNfcmVnKGksIHBhbExVVF90YWJsZVtpXS5yZWQsCisJCQkJICAgICAgcGFsTFVUX3RhYmxlW2ldLmdyZWVuLAorCQkJCSAgICAgIHBhbExVVF90YWJsZVtpXS5ibHVlKTsKKwkJfQorCQkvKiBzZXQgSUdBMSBEQUMgZm9yIGRlZmF1bHQgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQSwgVklBU1IsIDB4MDAsIEJJVDApOworCQl2aWFmYl93cml0ZV9yZWcoQ1I2QSwgVklBQ1IsIHRtcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZXZpY2Vfc2NyZWVuX29mZih2b2lkKQoreworCS8qIHR1cm4gb2ZmIENSVCBzY3JlZW4gKElHQTEpICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IwMSwgVklBU1IsIDB4MjAsIEJJVDUpOworfQorCitzdGF0aWMgdm9pZCBkZXZpY2Vfc2NyZWVuX29uKHZvaWQpCit7CisJLyogdHVybiBvbiBDUlQgc2NyZWVuIChJR0ExKSAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMDEsIFZJQVNSLCAweDAwLCBCSVQ1KTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Rpc3BsYXlfY2hhbm5lbCh2b2lkKQoreworCS8qSWYgdmlhZmJfTENEMl9PTiwgb24gY3g3MDAsIGludGVybmFsIGx2ZHMncyBpbmZvcm1hdGlvbgorCWlzIGtlZXBlZCBvbiBsdmRzX3NldHRpbmdfaW5mbzIgKi8KKwlpZiAodmlhZmJfTENEMl9PTiAmJgorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmRldmljZV9sY2RfZHVhbGVkZ2UpIHsKKwkJLyogRm9yIGR1YWwgY2hhbm5lbCBMQ0Q6ICovCisJCS8qIFNldCB0byBEdWFsIExWRFMgY2hhbm5lbC4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4MjAsIEJJVDQgKyBCSVQ1KTsKKwl9IGVsc2UgaWYgKHZpYWZiX0xDRF9PTiAmJiB2aWFmYl9EVklfT04pIHsKKwkJLyogRm9yIExDRCtERlA6ICovCisJCS8qIFNldCB0byBMVkRTMSArIFRNRFMgY2hhbm5lbC4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4MTAsIEJJVDQgKyBCSVQ1KTsKKwl9IGVsc2UgaWYgKHZpYWZiX0RWSV9PTikgeworCQkvKiBTZXQgdG8gc2luZ2xlIFRNRFMgY2hhbm5lbC4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4MzAsIEJJVDQgKyBCSVQ1KTsKKwl9IGVsc2UgaWYgKHZpYWZiX0xDRF9PTikgeworCQlpZiAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UpIHsKKwkJCS8qIEZvciBkdWFsIGNoYW5uZWwgTENEOiAqLworCQkJLyogU2V0IHRvIER1YWwgTFZEUyBjaGFubmVsLiAqLworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4MjAsIEJJVDQgKyBCSVQ1KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNldCB0byBMVkRTMCArIExWRFMxIGNoYW5uZWwuICovCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQyLCBWSUFDUiwgMHgwMCwgQklUNCArIEJJVDUpOworCQl9CisJfQorfQorCitpbnQgdmlhZmJfc2V0bW9kZShpbnQgdm1vZGVfaW5kZXgsIGludCBob3JfcmVzLCBpbnQgdmVyX3JlcywgaW50IHZpZGVvX2JwcCwKKwlpbnQgdm1vZGVfaW5kZXgxLCBpbnQgaG9yX3JlczEsIGludCB2ZXJfcmVzMSwgaW50IHZpZGVvX2JwcDEpCit7CisJaW50IGksIGo7CisJaW50IHBvcnQ7CisJdTggdmFsdWUsIGluZGV4LCBtYXNrOworCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfdGJsOworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZzsKKwlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibDEgPSBOVUxMOworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZzEgPSBOVUxMOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiU2V0IE1vZGUhIVxuIik7CisJREVCVUdfTVNHKEtFUk5fSU5GTworCQkgICJ2bW9kZV9pbmRleD0lZCBob3JfcmVzPSVkIHZlcl9yZXM9JWQgdmlkZW9fYnBwPSVkXG4iLAorCQkgIHZtb2RlX2luZGV4LCBob3JfcmVzLCB2ZXJfcmVzLCB2aWRlb19icHApOworCisJZGV2aWNlX3NjcmVlbl9vZmYoKTsKKwl2bW9kZV90YmwgPSAmQ0xFMjY2TW9kZXNbc2VhcmNoX21vZGVfc2V0dGluZyh2bW9kZV9pbmRleCldOworCWNydF90aW1pbmcgPSB2bW9kZV90YmwtPmNydGM7CisKKwlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKSB7CisJCXZtb2RlX3RibDEgPSAmQ0xFMjY2TW9kZXNbc2VhcmNoX21vZGVfc2V0dGluZyh2bW9kZV9pbmRleDEpXTsKKwkJY3J0X3RpbWluZzEgPSB2bW9kZV90YmwxLT5jcnRjOworCX0KKworCWluYihWSUFTdGF0dXMpOworCW91dGIoMHgwMCwgVklBQVIpOworCisJLyogV3JpdGUgQ29tbW9uIFNldHRpbmcgZm9yIFZpZGVvIE1vZGUgKi8KKwlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCWNhc2UgVU5JQ0hST01FX0NMRTI2NjoKKwkJdmlhZmJfd3JpdGVfcmVneChDTEUyNjZfTW9kZVhyZWdzLCBOVU1fVE9UQUxfQ0xFMjY2X01vZGVYcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBVTklDSFJPTUVfSzQwMDoKKwkJdmlhZmJfd3JpdGVfcmVneChLTTQwMF9Nb2RlWHJlZ3MsIE5VTV9UT1RBTF9LTTQwMF9Nb2RlWHJlZ3MpOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJY2FzZSBVTklDSFJPTUVfUE04MDA6CisJCXZpYWZiX3dyaXRlX3JlZ3goQ040MDBfTW9kZVhyZWdzLCBOVU1fVE9UQUxfQ040MDBfTW9kZVhyZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFVOSUNIUk9NRV9DTjcwMDoKKwljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJdmlhZmJfd3JpdGVfcmVneChDTjcwMF9Nb2RlWHJlZ3MsIE5VTV9UT1RBTF9DTjcwMF9Nb2RlWHJlZ3MpOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0NYNzAwOgorCQl2aWFmYl93cml0ZV9yZWd4KENYNzAwX01vZGVYcmVncywgTlVNX1RPVEFMX0NYNzAwX01vZGVYcmVncyk7CisKKwljYXNlIFVOSUNIUk9NRV9WWDgwMDoKKwkJdmlhZmJfd3JpdGVfcmVneChWWDgwMF9Nb2RlWHJlZ3MsIE5VTV9UT1RBTF9WWDgwMF9Nb2RlWHJlZ3MpOworCisJCWJyZWFrOworCX0KKworCWRldmljZV9vZmYoKTsKKworCS8qIEZpbGwgVlBJVCBQYXJhbWV0ZXJzICovCisJLyogV3JpdGUgTWlzYyBSZWdpc3RlciAqLworCW91dGIoVlBJVC5NaXNjLCBWSUFXTWlzYyk7CisKKwkvKiBXcml0ZSBTZXF1ZW5jZXIgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IFN0ZFNSOyBpKyspIHsKKwkJb3V0YihpLCBWSUFTUik7CisJCW91dGIoVlBJVC5TUltpIC0gMV0sIFZJQVNSICsgMSk7CisJfQorCisJdmlhZmJfc2V0X3N0YXJ0X2FkZHIoKTsKKwl2aWFmYl9zZXRfaWdhX3BhdGgoKTsKKworCS8qIFdyaXRlIENSVEMgKi8KKwl2aWFmYl9maWxsX2NydGNfdGltaW5nKGNydF90aW1pbmcsIHZtb2RlX2luZGV4LCB2aWRlb19icHAgLyA4LCBJR0ExKTsKKworCS8qIFdyaXRlIEdyYXBoaWMgQ29udHJvbGxlciAqLworCWZvciAoaSA9IDA7IGkgPCBTdGRHUjsgaSsrKSB7CisJCW91dGIoaSwgVklBR1IpOworCQlvdXRiKFZQSVQuR1JbaV0sIFZJQUdSICsgMSk7CisJfQorCisJLyogV3JpdGUgQXR0cmlidXRlIENvbnRyb2xsZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU3RkQVI7IGkrKykgeworCQlpbmIoVklBU3RhdHVzKTsKKwkJb3V0YihpLCBWSUFBUik7CisJCW91dGIoVlBJVC5BUltpXSwgVklBQVIpOworCX0KKworCWluYihWSUFTdGF0dXMpOworCW91dGIoMHgyMCwgVklBQVIpOworCisJLyogVXBkYXRlIFBhdGNoIFJlZ2lzdGVyICovCisKKwlpZiAoKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfQ0xFMjY2KQorCSAgICB8fCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LNDAwKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RPVEFMX1BBVENIX01PREU7IGkrKykgeworCQkJaWYgKHJlc19wYXRjaF90YWJsZVtpXS5tb2RlX2luZGV4ID09IHZtb2RlX2luZGV4KSB7CisJCQkJZm9yIChqID0gMDsKKwkJCQkgICAgIGogPCByZXNfcGF0Y2hfdGFibGVbaV0udGFibGVfbGVuZ3RoOyBqKyspIHsKKwkJCQkJaW5kZXggPQorCQkJCQkgICAgcmVzX3BhdGNoX3RhYmxlW2ldLgorCQkJCQkgICAgaW9fcmVnX3RhYmxlW2pdLmluZGV4OworCQkJCQlwb3J0ID0KKwkJCQkJICAgIHJlc19wYXRjaF90YWJsZVtpXS4KKwkJCQkJICAgIGlvX3JlZ190YWJsZVtqXS5wb3J0OworCQkJCQl2YWx1ZSA9CisJCQkJCSAgICByZXNfcGF0Y2hfdGFibGVbaV0uCisJCQkJCSAgICBpb19yZWdfdGFibGVbal0udmFsdWU7CisJCQkJCW1hc2sgPQorCQkJCQkgICAgcmVzX3BhdGNoX3RhYmxlW2ldLgorCQkJCQkgICAgaW9fcmVnX3RhYmxlW2pdLm1hc2s7CisJCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKGluZGV4LCBwb3J0LCB2YWx1ZSwKKwkJCQkJCSAgICAgICBtYXNrKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKSB7CisJCWlmICgodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpCisJCSAgICB8fCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09CisJCSAgICBVTklDSFJPTUVfSzQwMCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fVE9UQUxfUEFUQ0hfTU9ERTsgaSsrKSB7CisJCQkJaWYgKHJlc19wYXRjaF90YWJsZVtpXS5tb2RlX2luZGV4ID09CisJCQkJICAgIHZtb2RlX2luZGV4MSkgeworCQkJCQlmb3IgKGogPSAwOworCQkJCQkgICAgIGogPAorCQkJCQkgICAgIHJlc19wYXRjaF90YWJsZVtpXS4KKwkJCQkJICAgICB0YWJsZV9sZW5ndGg7IGorKykgeworCQkJCQkJaW5kZXggPQorCQkJCQkJICAgIHJlc19wYXRjaF90YWJsZVtpXS4KKwkJCQkJCSAgICBpb19yZWdfdGFibGVbal0uaW5kZXg7CisJCQkJCQlwb3J0ID0KKwkJCQkJCSAgICByZXNfcGF0Y2hfdGFibGVbaV0uCisJCQkJCQkgICAgaW9fcmVnX3RhYmxlW2pdLnBvcnQ7CisJCQkJCQl2YWx1ZSA9CisJCQkJCQkgICAgcmVzX3BhdGNoX3RhYmxlW2ldLgorCQkJCQkJICAgIGlvX3JlZ190YWJsZVtqXS52YWx1ZTsKKwkJCQkJCW1hc2sgPQorCQkJCQkJICAgIHJlc19wYXRjaF90YWJsZVtpXS4KKwkJCQkJCSAgICBpb19yZWdfdGFibGVbal0ubWFzazsKKwkJCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKGluZGV4LAorCQkJCQkJCXBvcnQsIHZhbHVlLCBtYXNrKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIFVwZGF0ZSBSZWZyZXNoIFJhdGUgU2V0dGluZyAqLworCisJLyogQ2xlYXIgT24gU2NyZWVuICovCisKKwkvKiBDUlQgc2V0IG1vZGUgKi8KKwlpZiAodmlhZmJfQ1JUX09OKSB7CisJCWlmICh2aWFmYl9TQU1NX09OICYmICh2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PQorCQkJSUdBMikpIHsKKwkJCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoY3J0X3RpbWluZzEsIHZtb2RlX2luZGV4MSwKKwkJCQl2aWRlb19icHAxIC8gOCwKKwkJCQl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisJCX0gZWxzZSB7CisJCQl2aWFmYl9maWxsX2NydGNfdGltaW5nKGNydF90aW1pbmcsIHZtb2RlX2luZGV4LAorCQkJCXZpZGVvX2JwcCAvIDgsCisJCQkJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+aWdhX3BhdGgpOworCQl9CisKKwkJc2V0X2NydF9vdXRwdXRfcGF0aCh2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisKKwkJLyogUGF0Y2ggaWYgc2V0X2hyZXMgaXMgbm90IDggYWxpZ25tZW50ICgxMzY2KSB0byB2aWFmYl9zZXRtb2RlCisJCXRvIDggYWxpZ25tZW50ICgxMzY4KSx0aGVyZSBpcyBzZXZlcmFsIHBpeGVscyAoMiBwaXhlbHMpCisJCW9uIHJpZ2h0IHNpZGUgb2Ygc2NyZWVuLiAqLworCQlpZiAoaG9yX3JlcyAlIDgpIHsKKwkJCXZpYWZiX3VubG9ja19jcnQoKTsKKwkJCXZpYWZiX3dyaXRlX3JlZyhDUjAyLCBWSUFDUiwKKwkJCQl2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1IwMikgLSAxKTsKKwkJCXZpYWZiX2xvY2tfY3J0KCk7CisJCX0KKwl9CisKKwlpZiAodmlhZmJfRFZJX09OKSB7CisJCWlmICh2aWFmYl9TQU1NX09OICYmCisJCQkodmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID09IElHQTIpKSB7CisJCQl2aWFmYl9kdmlfc2V0X21vZGUodmlhZmJfZ2V0X21vZGVfaW5kZXgKKwkJCQkgICAgICh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUsCisJCQkJICAgICAgdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPgorCQkJCSAgICAgIHZfYWN0aXZlLCAxKSwKKwkJCQkgICAgIHZpZGVvX2JwcDEsIHZpYXBhcmluZm8tPgorCQkJCSAgICAgdG1kc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXZpYWZiX2R2aV9zZXRfbW9kZSh2aWFmYl9nZXRfbW9kZV9pbmRleAorCQkJCSAgICAgKHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5oX2FjdGl2ZSwKKwkJCQkgICAgICB2aWFwYXJpbmZvLT4KKwkJCQkgICAgICB0bWRzX3NldHRpbmdfaW5mby0+dl9hY3RpdmUsIDApLAorCQkJCSAgICAgdmlkZW9fYnBwLCB2aWFwYXJpbmZvLT4KKwkJCQkgICAgIHRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisJCX0KKwl9CisKKwlpZiAodmlhZmJfTENEX09OKSB7CisJCWlmICh2aWFmYl9TQU1NX09OICYmCisJCQkodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID09IElHQTIpKSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+YnBwID0gdmlkZW9fYnBwMTsKKwkJCXZpYWZiX2xjZF9zZXRfbW9kZShjcnRfdGltaW5nMSwgdmlhcGFyaW5mby0+CisJCQkJbHZkc19zZXR0aW5nX2luZm8sCisJCQkJICAgICAmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbyk7CisJCX0gZWxzZSB7CisJCQkvKiBJR0ExIGRvZXNuJ3QgaGF2ZSBMQ0Qgc2NhbGluZywgc28gc2V0IGl0IGNlbnRlci4gKi8KKwkJCWlmICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPT0gSUdBMSkgeworCQkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9CisJCQkJICAgIExDRF9DRU5URVJJTkc7CisJCQl9CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+YnBwID0gdmlkZW9fYnBwOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcsIHZpYXBhcmluZm8tPgorCQkJCWx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCQl9CisJfQorCWlmICh2aWFmYl9MQ0QyX09OKSB7CisJCWlmICh2aWFmYl9TQU1NX09OICYmCisJCQkodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9PSBJR0EyKSkgeworCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5icHAgPSB2aWRlb19icHAxOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcxLCB2aWFwYXJpbmZvLT4KKwkJCQlsdmRzX3NldHRpbmdfaW5mbzIsCisJCQkJICAgICAmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIpOworCQl9IGVsc2UgeworCQkJLyogSUdBMSBkb2Vzbid0IGhhdmUgTENEIHNjYWxpbmcsIHNvIHNldCBpdCBjZW50ZXIuICovCisJCQlpZiAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9PSBJR0ExKSB7CisJCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5kaXNwbGF5X21ldGhvZCA9CisJCQkJICAgIExDRF9DRU5URVJJTkc7CisJCQl9CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmJwcCA9IHZpZGVvX2JwcDsKKwkJCXZpYWZiX2xjZF9zZXRfbW9kZShjcnRfdGltaW5nLCB2aWFwYXJpbmZvLT4KKwkJCQlsdmRzX3NldHRpbmdfaW5mbzIsCisJCQkJICAgICAmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIpOworCQl9CisJfQorCisJaWYgKCh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NYNzAwKQorCSAgICAmJiAodmlhZmJfTENEX09OIHx8IHZpYWZiX0RWSV9PTikpCisJCXNldF9kaXNwbGF5X2NoYW5uZWwoKTsKKworCS8qIElmIHNldCBtb2RlIG5vcm1hbGx5LCBzYXZlIHJlc29sdXRpb24gaW5mb3JtYXRpb24gZm9yIGhvdC1wbHVnIC4gKi8KKwlpZiAoIXZpYWZiX2hvdHBsdWcpIHsKKwkJdmlhZmJfaG90cGx1Z19YcmVzID0gaG9yX3JlczsKKwkJdmlhZmJfaG90cGx1Z19ZcmVzID0gdmVyX3JlczsKKwkJdmlhZmJfaG90cGx1Z19icHAgPSB2aWRlb19icHA7CisJCXZpYWZiX2hvdHBsdWdfcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2g7CisKKwkJaWYgKHZpYWZiX0RWSV9PTikKKwkJCXZpYWZiX0RldmljZVN0YXR1cyA9IERWSV9EZXZpY2U7CisJCWVsc2UKKwkJCXZpYWZiX0RldmljZVN0YXR1cyA9IENSVF9EZXZpY2U7CisJfQorCWRldmljZV9vbigpOworCisJaWYgKHZpYWZiX1NBTU1fT04gPT0gMSkKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDB4QzAsIEJJVDYgKyBCSVQ3KTsKKworCWRldmljZV9zY3JlZW5fb24oKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9UT1RBTF9SRVNfTUFQX1JFRlJFU0g7IGkrKykgeworCQlpZiAoKGhyZXMgPT0gcmVzX21hcF9yZWZyZXNoX3RibFtpXS5ocmVzKQorCQkgICAgJiYgKHZyZXMgPT0gcmVzX21hcF9yZWZyZXNoX3RibFtpXS52cmVzKQorCQkgICAgJiYgKHZtb2RlX3JlZnJlc2ggPT0gcmVzX21hcF9yZWZyZXNoX3RibFtpXS52bW9kZV9yZWZyZXNoKSkKKwkJCXJldHVybiByZXNfbWFwX3JlZnJlc2hfdGJsW2ldLnBpeGNsb2NrOworCX0KKwlyZXR1cm4gUkVTXzY0MFg0ODBfNjBIWl9QSVhDTE9DSzsKKworfQorCitpbnQgdmlhZmJfZ2V0X3JlZnJlc2goaW50IGhyZXMsIGludCB2cmVzLCB1MzIgbG9uZ19yZWZyZXNoKQoreworI2RlZmluZSBSRUZSRVNIX1RPTEVSQU5DRSAzCisJaW50IGksIG5lYXJlc3QgPSAtMSwgZGlmZiA9IFJFRlJFU0hfVE9MRVJBTkNFOworCWZvciAoaSA9IDA7IGkgPCBOVU1fVE9UQUxfUkVTX01BUF9SRUZSRVNIOyBpKyspIHsKKwkJaWYgKChocmVzID09IHJlc19tYXBfcmVmcmVzaF90YmxbaV0uaHJlcykKKwkJICAgICYmICh2cmVzID09IHJlc19tYXBfcmVmcmVzaF90YmxbaV0udnJlcykKKwkJICAgICYmIChkaWZmID4gKGFicyhsb25nX3JlZnJlc2ggLQorCQkgICAgcmVzX21hcF9yZWZyZXNoX3RibFtpXS52bW9kZV9yZWZyZXNoKSkpKSB7CisJCQlkaWZmID0gYWJzKGxvbmdfcmVmcmVzaCAtIHJlc19tYXBfcmVmcmVzaF90YmxbaV0uCisJCQkJdm1vZGVfcmVmcmVzaCk7CisJCQluZWFyZXN0ID0gaTsKKwkJfQorCX0KKyN1bmRlZiBSRUZSRVNIX1RPTEVSQU5DRQorCWlmIChuZWFyZXN0ID4gMCkKKwkJcmV0dXJuIHJlc19tYXBfcmVmcmVzaF90YmxbbmVhcmVzdF0udm1vZGVfcmVmcmVzaDsKKwlyZXR1cm4gNjA7Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV9vZmYodm9pZCkKK3sKKwl2aWFmYl9jcnRfZGlzYWJsZSgpOworCXZpYWZiX2R2aV9kaXNhYmxlKCk7CisJdmlhZmJfbGNkX2Rpc2FibGUoKTsKK30KKworc3RhdGljIHZvaWQgZGV2aWNlX29uKHZvaWQpCit7CisJaWYgKHZpYWZiX0NSVF9PTiA9PSAxKQorCQl2aWFmYl9jcnRfZW5hYmxlKCk7CisJaWYgKHZpYWZiX0RWSV9PTiA9PSAxKQorCQl2aWFmYl9kdmlfZW5hYmxlKCk7CisJaWYgKHZpYWZiX0xDRF9PTiA9PSAxKQorCQl2aWFmYl9sY2RfZW5hYmxlKCk7Cit9CisKK3ZvaWQgdmlhZmJfY3J0X2Rpc2FibGUodm9pZCkKK3sKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjM2LCBWSUFDUiwgQklUNSArIEJJVDQsIEJJVDUgKyBCSVQ0KTsKK30KKwordm9pZCB2aWFmYl9jcnRfZW5hYmxlKHZvaWQpCit7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzNiwgVklBQ1IsIDB4MCwgQklUNSArIEJJVDQpOworfQorCit2b2lkIHZpYWZiX2dldF9tbWlvX2luZm8odW5zaWduZWQgbG9uZyAqbW1pb19iYXNlLAorCXVuc2lnbmVkIGxvbmcgKm1taW9fbGVuKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1MzIgdmVuZG9yLCBkZXZpY2U7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBwY2lpZGxpc3RbaV0udmVuZG9yICE9IDA7IGkrKykKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PQorCQkJcGNpaWRsaXN0W2ldLmNoaXBfaW5kZXgpCisJCQlicmVhazsKKworCWlmICghcGNpaWRsaXN0W2ldLnZlbmRvcikKKwkJcmV0dXJuIDsKKworCXZlbmRvciA9IHBjaWlkbGlzdFtpXS52ZW5kb3I7CisJZGV2aWNlID0gcGNpaWRsaXN0W2ldLmRldmljZTsKKworCXBkZXYgPSBwY2lfZ2V0X2RldmljZSh2ZW5kb3IsIGRldmljZSwgTlVMTCk7CisKKwlpZiAoIXBkZXYpIHsKKwkJKm1taW9fYmFzZSA9IDA7CisJCSptbWlvX2xlbiA9IDA7CisJCXJldHVybiA7CisJfQorCisJKm1taW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwkqbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCisJcGNpX2Rldl9wdXQocGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9zZWNvbmRfZGlzcGxheV9jaGFubmVsKHZvaWQpCit7CisJLyogdG8gZW5hYmxlIHNlY29uZCBkaXNwbGF5IGNoYW5uZWwuICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDB4MDAsIEJJVDYpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCBCSVQ3LCBCSVQ3KTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgQklUNiwgQklUNik7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfc2Vjb25kX2Rpc3BsYXlfY2hhbm5lbCh2b2lkKQoreworCS8qIHRvIGRpc2FibGUgc2Vjb25kIGRpc3BsYXkgY2hhbm5lbC4gKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwMCwgQklUNik7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDB4MDAsIEJJVDcpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCBCSVQ2LCBCSVQ2KTsKK30KKwordm9pZCB2aWFmYl9nZXRfZmJfaW5mbyh1bnNpZ25lZCBpbnQgKmZiX2Jhc2UsIHVuc2lnbmVkIGludCAqZmJfbGVuKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1MzIgdmVuZG9yLCBkZXZpY2U7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBwY2lpZGxpc3RbaV0udmVuZG9yICE9IDA7IGkrKykKKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PQorCQkJcGNpaWRsaXN0W2ldLmNoaXBfaW5kZXgpCisJCQlicmVhazsKKworCWlmICghcGNpaWRsaXN0W2ldLnZlbmRvcikKKwkJcmV0dXJuIDsKKworCXZlbmRvciA9IHBjaWlkbGlzdFtpXS52ZW5kb3I7CisJZGV2aWNlID0gcGNpaWRsaXN0W2ldLmRldmljZTsKKworCXBkZXYgPSBwY2lfZ2V0X2RldmljZSh2ZW5kb3IsIGRldmljZSwgTlVMTCk7CisKKwlpZiAoIXBkZXYpIHsKKwkJKmZiX2Jhc2UgPSB2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IzMCkgPDwgMjQ7CisJCSpmYl9sZW4gPSB2aWFmYl9nZXRfbWVtc2l6ZSgpOworCQlERUJVR19NU0coS0VSTl9JTkZPICJHZXQgRkIgaW5mbyBmcm9tIFNSMzAhXG4iKTsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiZmJfYmFzZSA9ICUwOHhcbiIsICpmYl9iYXNlKTsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiZmJfbGVuID0gJTA4eFxuIiwgKmZiX2xlbik7CisJCXJldHVybiA7CisJfQorCisJKmZiX2Jhc2UgPSAodW5zaWduZWQgaW50KXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkqZmJfbGVuID0gZ2V0X2ZiX3NpemVfZnJvbV9wY2koKTsKKwlERUJVR19NU0coS0VSTl9JTkZPICJHZXQgRkIgaW5mbyBmcm9tIFBDSSBzeXN0ZW0hXG4iKTsKKwlERUJVR19NU0coS0VSTl9JTkZPICJmYl9iYXNlID0gJTA4eFxuIiwgKmZiX2Jhc2UpOworCURFQlVHX01TRyhLRVJOX0lORk8gImZiX2xlbiA9ICUwOHhcbiIsICpmYl9sZW4pOworCisJcGNpX2Rldl9wdXQocGRldik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZiX3NpemVfZnJvbV9wY2kodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNvbmZpZ2lkLCBkZXZpY2VpZCwgRkJTaXplID0gMDsKKwlpbnQgVmlkZW9NZW1TaXplOworCWludCBEZXZpY2VGb3VuZCA9IGZhbHNlOworCisJZm9yIChjb25maWdpZCA9IDB4ODAwMDAwMDA7IGNvbmZpZ2lkIDwgMHg4MDAxMDgwMDsgY29uZmlnaWQgKz0gMHgxMDApIHsKKwkJb3V0bChjb25maWdpZCwgKHVuc2lnbmVkIGxvbmcpMHhDRjgpOworCQlkZXZpY2VpZCA9IChpbmwoKHVuc2lnbmVkIGxvbmcpMHhDRkMpID4+IDE2KSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGRldmljZWlkKSB7CisJCWNhc2UgQ0xFMjY2OgorCQljYXNlIEtNNDAwOgorCQkJb3V0bChjb25maWdpZCArIDB4RTAsICh1bnNpZ25lZCBsb25nKTB4Q0Y4KTsKKwkJCUZCU2l6ZSA9IGlubCgodW5zaWduZWQgbG9uZykweENGQyk7CisJCQlEZXZpY2VGb3VuZCA9IHRydWU7CS8qIEZvdW5kIGRldmljZSBpZCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBDTjQwMF9GVU5DVElPTjM6CisJCWNhc2UgQ043MDBfRlVOQ1RJT04zOgorCQljYXNlIENYNzAwX0ZVTkNUSU9OMzoKKwkJY2FzZSBLTTgwMF9GVU5DVElPTjM6CisJCWNhc2UgS004OTBfRlVOQ1RJT04zOgorCQljYXNlIFA0TTg5MF9GVU5DVElPTjM6CisJCWNhc2UgUDRNOTAwX0ZVTkNUSU9OMzoKKwkJY2FzZSBWWDgwMF9GVU5DVElPTjM6CisJCQkvKmNhc2UgQ043NTBfRlVOQ1RJT04zOiAqLworCQkJb3V0bChjb25maWdpZCArIDB4QTAsICh1bnNpZ25lZCBsb25nKTB4Q0Y4KTsKKwkJCUZCU2l6ZSA9IGlubCgodW5zaWduZWQgbG9uZykweENGQyk7CisJCQlEZXZpY2VGb3VuZCA9IHRydWU7CS8qIEZvdW5kIGRldmljZSBpZCAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERldmljZUZvdW5kKQorCQkJYnJlYWs7CisJfQorCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiRGV2aWNlIElEID0gJWx4XG4iLCBkZXZpY2VpZCk7CisKKwlGQlNpemUgPSBGQlNpemUgJiAweDAwMDA3MDAwOworCURFQlVHX01TRyhLRVJOX0lORk8gIkZCIFNpemUgPSAleFxuIiwgRkJTaXplKTsKKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPCBVTklDSFJPTUVfQ1g3MDApIHsKKwkJc3dpdGNoIChGQlNpemUpIHsKKwkJY2FzZSAweDAwMDA0MDAwOgorCQkJVmlkZW9NZW1TaXplID0gKDE2IDw8IDIwKTsJLyoxNk0gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwMDAwNTAwMDoKKwkJCVZpZGVvTWVtU2l6ZSA9ICgzMiA8PCAyMCk7CS8qMzJNICovCisJCQlicmVhazsKKworCQljYXNlIDB4MDAwMDYwMDA6CisJCQlWaWRlb01lbVNpemUgPSAoNjQgPDwgMjApOwkvKjY0TSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVZpZGVvTWVtU2l6ZSA9ICgzMiA8PCAyMCk7CS8qMzJNICovCisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoRkJTaXplKSB7CisJCWNhc2UgMHgwMDAwMTAwMDoKKwkJCVZpZGVvTWVtU2l6ZSA9ICg4IDw8IDIwKTsJLyo4TSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAwMDAyMDAwOgorCQkJVmlkZW9NZW1TaXplID0gKDE2IDw8IDIwKTsJLyoxNk0gKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwMDAwMzAwMDoKKwkJCVZpZGVvTWVtU2l6ZSA9ICgzMiA8PCAyMCk7CS8qMzJNICovCisJCQlicmVhazsKKworCQljYXNlIDB4MDAwMDQwMDA6CisJCQlWaWRlb01lbVNpemUgPSAoNjQgPDwgMjApOwkvKjY0TSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAwMDA1MDAwOgorCQkJVmlkZW9NZW1TaXplID0gKDEyOCA8PCAyMCk7CS8qMTI4TSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAweDAwMDA2MDAwOgorCQkJVmlkZW9NZW1TaXplID0gKDI1NiA8PCAyMCk7CS8qMjU2TSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVZpZGVvTWVtU2l6ZSA9ICgzMiA8PCAyMCk7CS8qMzJNICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBWaWRlb01lbVNpemU7Cit9CisKK3ZvaWQgdmlhZmJfc2V0X2RwYV9nZngoaW50IG91dHB1dF9pbnRlcmZhY2UsIHN0cnVjdCBHRlhfRFBBX1NFVFRJTkdcCisJCQkJCSpwX2dmeF9kcGFfc2V0dGluZykKK3sKKwlzd2l0Y2ggKG91dHB1dF9pbnRlcmZhY2UpIHsKKwljYXNlIElOVEVSRkFDRV9EVlAwOgorCQl7CisJCQkvKiBEVlAwIENsb2NrIFBvbGFyaXR5IGFuZCBBZGp1c3Q6ICovCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk2LCBWSUFDUiwKKwkJCQkgICAgICAgcF9nZnhfZHBhX3NldHRpbmctPkRWUDAsIDB4MEYpOworCisJCQkvKiBEVlAwIENsb2NrIGFuZCBEYXRhIFBhZHMgRHJpdmluZzogKi8KKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUUsIFZJQVNSLAorCQkJCSAgICAgICBwX2dmeF9kcGFfc2V0dGluZy0+RFZQMENsb2NrRHJpX1MsIEJJVDIpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IyQSwgVklBU1IsCisJCQkJICAgICAgIHBfZ2Z4X2RwYV9zZXR0aW5nLT5EVlAwQ2xvY2tEcmlfUzEsCisJCQkJICAgICAgIEJJVDQpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQiwgVklBU1IsCisJCQkJICAgICAgIHBfZ2Z4X2RwYV9zZXR0aW5nLT5EVlAwRGF0YURyaV9TLCBCSVQxKTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLAorCQkJCSAgICAgICBwX2dmeF9kcGFfc2V0dGluZy0+RFZQMERhdGFEcmlfUzEsIEJJVDUpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSU5URVJGQUNFX0RWUDE6CisJCXsKKwkJCS8qIERWUDEgQ2xvY2sgUG9sYXJpdHkgYW5kIEFkanVzdDogKi8KKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLAorCQkJCSAgICAgICBwX2dmeF9kcGFfc2V0dGluZy0+RFZQMSwgMHgwRik7CisKKwkJCS8qIERWUDEgQ2xvY2sgYW5kIERhdGEgUGFkcyBEcml2aW5nOiAqLworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I2NSwgVklBU1IsCisJCQkJICAgICAgIHBfZ2Z4X2RwYV9zZXR0aW5nLT5EVlAxRHJpdmluZywgMHgwRik7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJTlRFUkZBQ0VfREZQX0hJR0g6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTcsIFZJQUNSLAorCQkJCSAgICAgICBwX2dmeF9kcGFfc2V0dGluZy0+REZQSGlnaCwgMHgwRik7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJTlRFUkZBQ0VfREZQX0xPVzoKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsCisJCQkJICAgICAgIHBfZ2Z4X2RwYV9zZXR0aW5nLT5ERlBMb3csIDB4MEYpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSU5URVJGQUNFX0RGUDoKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsCisJCQkJICAgICAgIHBfZ2Z4X2RwYV9zZXR0aW5nLT5ERlBIaWdoLCAweDBGKTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLAorCQkJCSAgICAgICBwX2dmeF9kcGFfc2V0dGluZy0+REZQTG93LCAweDBGKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIHZpYWZiX21lbW9yeV9waXRjaF9wYXRjaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+dmFyLnhyZXMgIT0gaW5mby0+dmFyLnhyZXNfdmlydHVhbCkgeworCQl2aWFmYl9sb2FkX29mZnNldF9yZWcoaW5mby0+dmFyLnhyZXNfdmlydHVhbCwKKwkJCQlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPj4gMywgSUdBMSk7CisKKwkJaWYgKHZpYWZiX1NBTU1fT04pIHsKKwkJCXZpYWZiX2xvYWRfb2Zmc2V0X3JlZyh2aWFmYl9zZWNvbmRfdmlydHVhbF94cmVzLAorCQkJCXZpYWZiX2JwcDEgPj4gMywKKwkJCQkJSUdBMik7CisJCX0gZWxzZSB7CisJCQl2aWFmYl9sb2FkX29mZnNldF9yZWcoaW5mby0+dmFyLnhyZXNfdmlydHVhbCwKKwkJCQkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDMsIElHQTIpOworCQl9CisKKwl9Cit9CisKKy8qQWNjb3JkaW5nIHZhcidzIHhyZXMsIHlyZXMgZmlsbCB2YXIncyBvdGhlciB0aW1pbmcgaW5mb3JtYXRpb24qLwordm9pZCB2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbyhzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IHJlZnJlc2gsCisJCQkgIGludCBtb2RlX2luZGV4KQoreworCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfdGJsID0gTlVMTDsKKwlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90aW1pbmcgPSBOVUxMOworCXN0cnVjdCBkaXNwbGF5X3RpbWluZyBjcnRfcmVnOworCWludCBpID0gMCwgaW5kZXggPSAwOworCXZtb2RlX3RibCA9ICZDTEUyNjZNb2Rlc1tzZWFyY2hfbW9kZV9zZXR0aW5nKG1vZGVfaW5kZXgpXTsKKwljcnRfdGltaW5nID0gdm1vZGVfdGJsLT5jcnRjOworCWZvciAoaSA9IDA7IGkgPCB2bW9kZV90YmwtPm1vZGVfYXJyYXk7IGkrKykgeworCQlpbmRleCA9IGk7CisJCWlmIChjcnRfdGltaW5nW2ldLnJlZnJlc2hfcmF0ZSA9PSByZWZyZXNoKQorCQkJYnJlYWs7CisJfQorCisJY3J0X3JlZyA9IGNydF90aW1pbmdbaW5kZXhdLmNydGM7CisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQl2YXItPnJlZC5vZmZzZXQgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA2OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA2OworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA2OworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5ldmVyIGhhcHBlZCwgcHV0IGhlcmUgdG8ga2VlcCBjb25zaXN0ZW50ICovCisJCWJyZWFrOworCX0KKworCXZhci0+cGl4Y2xvY2sgPSB2aWFmYl9nZXRfcGl4Y2xvY2sodmFyLT54cmVzLCB2YXItPnlyZXMsIHJlZnJlc2gpOworCXZhci0+bGVmdF9tYXJnaW4gPQorCSAgICBjcnRfcmVnLmhvcl90b3RhbCAtIChjcnRfcmVnLmhvcl9zeW5jX3N0YXJ0ICsgY3J0X3JlZy5ob3Jfc3luY19lbmQpOworCXZhci0+cmlnaHRfbWFyZ2luID0gY3J0X3JlZy5ob3Jfc3luY19zdGFydCAtIGNydF9yZWcuaG9yX2FkZHI7CisJdmFyLT5oc3luY19sZW4gPSBjcnRfcmVnLmhvcl9zeW5jX2VuZDsKKwl2YXItPnVwcGVyX21hcmdpbiA9CisJICAgIGNydF9yZWcudmVyX3RvdGFsIC0gKGNydF9yZWcudmVyX3N5bmNfc3RhcnQgKyBjcnRfcmVnLnZlcl9zeW5jX2VuZCk7CisJdmFyLT5sb3dlcl9tYXJnaW4gPSBjcnRfcmVnLnZlcl9zeW5jX3N0YXJ0IC0gY3J0X3JlZy52ZXJfYWRkcjsKKwl2YXItPnZzeW5jX2xlbiA9IGNydF9yZWcudmVyX3N5bmNfZW5kOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvaHcuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmMzhmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmgKQEAgLTAsMCArMSw5MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19IV19IX18KKyNkZWZpbmUgX19IV19IX18KKworI2luY2x1ZGUgImdsb2JhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlZmluaXRpb24gSUdBMSBEZXNpZ24gTWV0aG9kIG9mIENSVEMgUmVnaXN0ZXJzICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElHQTFfSE9SX1RPVEFMX0ZPUk1VTEEoeCkgICAgICAgICAgICgoKHgpLzgpLTUpCisjZGVmaW5lIElHQTFfSE9SX0FERFJfRk9STVVMQSh4KSAgICAgICAgICAgICgoKHgpLzgpLTEpCisjZGVmaW5lIElHQTFfSE9SX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoKHgpLzgpLTEpCisjZGVmaW5lIElHQTFfSE9SX0JMQU5LX0VORF9GT1JNVUxBKHgsIHkpICAgICAoKCh4K3kpLzgpLTEpCisjZGVmaW5lIElHQTFfSE9SX1NZTkNfU1RBUlRfRk9STVVMQSh4KSAgICAgICgoeCkvOCkKKyNkZWZpbmUgSUdBMV9IT1JfU1lOQ19FTkRfRk9STVVMQSh4LCB5KSAgICAgICgoeCt5KS84KQorCisjZGVmaW5lIElHQTFfVkVSX1RPVEFMX0ZPUk1VTEEoeCkgICAgICAgICAgICgoeCktMikKKyNkZWZpbmUgSUdBMV9WRVJfQUREUl9GT1JNVUxBKHgpICAgICAgICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0ExX1ZFUl9CTEFOS19TVEFSVF9GT1JNVUxBKHgpICAgICAoKHgpLTEpCisjZGVmaW5lIElHQTFfVkVSX0JMQU5LX0VORF9GT1JNVUxBKHgsIHkpICAgICAoKHgreSktMSkKKyNkZWZpbmUgSUdBMV9WRVJfU1lOQ19TVEFSVF9GT1JNVUxBKHgpICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0ExX1ZFUl9TWU5DX0VORF9GT1JNVUxBKHgsIHkpICAgICAgKCh4K3kpLTEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluaXRpb24gSUdBMiBEZXNpZ24gTWV0aG9kIG9mIENSVEMgUmVnaXN0ZXJzICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElHQTJfSE9SX1RPVEFMX0ZPUk1VTEEoeCkgICAgICAgICAgICgoeCktMSkKKyNkZWZpbmUgSUdBMl9IT1JfQUREUl9GT1JNVUxBKHgpICAgICAgICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0EyX0hPUl9CTEFOS19TVEFSVF9GT1JNVUxBKHgpICAgICAoKHgpLTEpCisjZGVmaW5lIElHQTJfSE9SX0JMQU5LX0VORF9GT1JNVUxBKHgsIHkpICAgICAoKHgreSktMSkKKyNkZWZpbmUgSUdBMl9IT1JfU1lOQ19TVEFSVF9GT1JNVUxBKHgpICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0EyX0hPUl9TWU5DX0VORF9GT1JNVUxBKHgsIHkpICAgICAgKCh4K3kpLTEpCisKKyNkZWZpbmUgSUdBMl9WRVJfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9BRERSX0ZPUk1VTEEoeCkgICAgICAgICAgICAoKHgpLTEpCisjZGVmaW5lIElHQTJfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoeCktMSkKKyNkZWZpbmUgSUdBMl9WRVJfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEoeCkgICAgICAoKHgpLTEpCisjZGVmaW5lIElHQTJfVkVSX1NZTkNfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICAoKHgreSktMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWZpbml0aW9uIElHQTIgRGVzaWduIE1ldGhvZCBvZiBDUlRDIFNoYWRvdyBSZWdpc3RlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJR0EyX0hPUl9UT1RBTF9TSEFET1dfRk9STVVMQSh4KSAgICAgICAgICAgKCh4LzgpLTUpCisjZGVmaW5lIElHQTJfSE9SX0JMQU5LX0VORF9TSEFET1dfRk9STVVMQSh4LCB5KSAgICAgKCgoeCt5KS84KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9UT1RBTF9TSEFET1dfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0yKQorI2RlZmluZSBJR0EyX1ZFUl9BRERSX1NIQURPV19GT1JNVUxBKHgpICAgICAgICAgICAgKCh4KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19TVEFSVF9TSEFET1dfRk9STVVMQSh4KSAgICAgKCh4KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19FTkRfU0hBRE9XX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQorI2RlZmluZSBJR0EyX1ZFUl9TWU5DX1NUQVJUX1NIQURPV19GT1JNVUxBKHgpICAgICAgKHgpCisjZGVmaW5lIElHQTJfVkVSX1NZTkNfRU5EX1NIQURPV19GT1JNVUxBKHgsIHkpICAgICAgKHgreSkKKworLyogRGVmaW5lIFJlZ2lzdGVyIE51bWJlciBmb3IgSUdBMSBDUlRDIFRpbWluZyAqLworCisvKiBsb2NhdGlvbjoge0NSMDAsMCw3fSx7Q1IzNiwzLDN9ICovCisjZGVmaW5lIElHQTFfSE9SX1RPVEFMX1JFR19OVU0JCTIKKy8qIGxvY2F0aW9uOiB7Q1IwMSwwLDd9ICovCisjZGVmaW5lIElHQTFfSE9SX0FERFJfUkVHX05VTQkJMQorLyogbG9jYXRpb246IHtDUjAyLDAsN30gKi8KKyNkZWZpbmUgSUdBMV9IT1JfQkxBTktfU1RBUlRfUkVHX05VTSAgICAxCisvKiBsb2NhdGlvbjoge0NSMDMsMCw0fSx7Q1IwNSw3LDd9LHtDUjMzLDUsNX0gKi8KKyNkZWZpbmUgSUdBMV9IT1JfQkxBTktfRU5EX1JFR19OVU0JMworLyogbG9jYXRpb246IHtDUjA0LDAsN30se0NSMzMsNCw0fSAqLworI2RlZmluZSBJR0ExX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0JMgorLyogbG9jYXRpb246IHtDUjA1LDAsNH0gKi8KKyNkZWZpbmUgSUdBMV9IT1JfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCisvKiBsb2NhdGlvbjoge0NSMDYsMCw3fSx7Q1IwNywwLDB9LHtDUjA3LDUsNX0se0NSMzUsMCwwfSAqLworI2RlZmluZSBJR0ExX1ZFUl9UT1RBTF9SRUdfTlVNICAgICAgICAgIDQKKy8qIGxvY2F0aW9uOiB7Q1IxMiwwLDd9LHtDUjA3LDEsMX0se0NSMDcsNiw2fSx7Q1IzNSwyLDJ9ICovCisjZGVmaW5lIElHQTFfVkVSX0FERFJfUkVHX05VTSAgICAgICAgICAgNAorLyogbG9jYXRpb246IHtDUjE1LDAsN30se0NSMDcsMywzfSx7Q1IwOSw1LDV9LHtDUjM1LDMsM30gKi8KKyNkZWZpbmUgSUdBMV9WRVJfQkxBTktfU1RBUlRfUkVHX05VTSAgICA0CisvKiBsb2NhdGlvbjoge0NSMTYsMCw3fSAqLworI2RlZmluZSBJR0ExX1ZFUl9CTEFOS19FTkRfUkVHX05VTSAgICAgIDEKKy8qIGxvY2F0aW9uOiB7Q1IxMCwwLDd9LHtDUjA3LDIsMn0se0NSMDcsNyw3fSx7Q1IzNSwxLDF9ICovCisjZGVmaW5lIElHQTFfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSAgICAgNAorLyogbG9jYXRpb246IHtDUjExLDAsM30gKi8KKyNkZWZpbmUgSUdBMV9WRVJfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCisKKy8qIERlZmluZSBSZWdpc3RlciBOdW1iZXIgZm9yIElHQTIgU2hhZG93IENSVEMgVGltaW5nICovCisKKy8qIGxvY2F0aW9uOiB7Q1I2RCwwLDd9LHtDUjcxLDMsM30gKi8KKyNkZWZpbmUgSUdBMl9TSEFET1dfSE9SX1RPVEFMX1JFR19OVU0gICAgICAgMgorLyogbG9jYXRpb246IHtDUjZFLDAsN30gKi8KKyNkZWZpbmUgSUdBMl9TSEFET1dfSE9SX0JMQU5LX0VORF9SRUdfTlVNICAgMQorLyogbG9jYXRpb246IHtDUjZGLDAsN30se0NSNzEsMCwyfSAqLworI2RlZmluZSBJR0EyX1NIQURPV19WRVJfVE9UQUxfUkVHX05VTSAgICAgICAyCisvKiBsb2NhdGlvbjoge0NSNzAsMCw3fSx7Q1I3MSw0LDZ9ICovCisjZGVmaW5lIElHQTJfU0hBRE9XX1ZFUl9BRERSX1JFR19OVU0gICAgICAgIDIKKy8qIGxvY2F0aW9uOiB7Q1I3MiwwLDd9LHtDUjc0LDQsNn0gKi8KKyNkZWZpbmUgSUdBMl9TSEFET1dfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0gMgorLyogbG9jYXRpb246IHtDUjczLDAsN30se0NSNzQsMCwyfSAqLworI2RlZmluZSBJR0EyX1NIQURPV19WRVJfQkxBTktfRU5EX1JFR19OVU0gICAyCisvKiBsb2NhdGlvbjoge0NSNzUsMCw3fSx7Q1I3Niw0LDZ9ICovCisjZGVmaW5lIElHQTJfU0hBRE9XX1ZFUl9TWU5DX1NUQVJUX1JFR19OVU0gIDIKKy8qIGxvY2F0aW9uOiB7Q1I3NiwwLDN9ICovCisjZGVmaW5lIElHQTJfU0hBRE9XX1ZFUl9TWU5DX0VORF9SRUdfTlVNICAgIDEKKworLyogRGVmaW5lIFJlZ2lzdGVyIE51bWJlciBmb3IgSUdBMiBDUlRDIFRpbWluZyAqLworCisvKiBsb2NhdGlvbjoge0NSNTAsMCw3fSx7Q1I1NSwwLDN9ICovCisjZGVmaW5lIElHQTJfSE9SX1RPVEFMX1JFR19OVU0gICAgICAgICAgMgorLyogbG9jYXRpb246IHtDUjUxLDAsN30se0NSNTUsNCw2fSAqLworI2RlZmluZSBJR0EyX0hPUl9BRERSX1JFR19OVU0gICAgICAgICAgIDIKKy8qIGxvY2F0aW9uOiB7Q1I1MiwwLDd9LHtDUjU0LDAsMn0gKi8KKyNkZWZpbmUgSUdBMl9IT1JfQkxBTktfU1RBUlRfUkVHX05VTSAgICAyCisvKiBsb2NhdGlvbjogQ0xFMjY2OiB7Q1I1MywwLDd9LHtDUjU0LDMsNX0gPT4gQ0xFMjY2J3MgQ1I1RFs2XQoraXMgcmVzZXJ2ZWQsIHNvIGl0IG1heSBoYXZlIHByb2JsZW0gdG8gc2V0IDE2MDB4MTIwMCBvbiBJR0EyLiAqLworLyogICAgICAgICAJT3RoZXJzOiB7Q1I1MywwLDd9LHtDUjU0LDMsNX0se0NSNUQsNiw2fSAqLworI2RlZmluZSBJR0EyX0hPUl9CTEFOS19FTkRfUkVHX05VTSAgICAgIDMKKy8qIGxvY2F0aW9uOiB7Q1I1NiwwLDd9LHtDUjU0LDYsN30se0NSNUMsNyw3fSAqLworLyogVlQzMzE0IGFuZCBMYXRlcjoge0NSNTYsMCw3fSx7Q1I1NCw2LDd9LHtDUjVDLDcsN30sIHtDUjVELDcsN30gKi8KKyNkZWZpbmUgSUdBMl9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNICAgICA0CisKKy8qIGxvY2F0aW9uOiB7Q1I1NywwLDd9LHtDUjVDLDYsNn0gKi8KKyNkZWZpbmUgSUdBMl9IT1JfU1lOQ19FTkRfUkVHX05VTSAgICAgICAyCisvKiBsb2NhdGlvbjoge0NSNTgsMCw3fSx7Q1I1RCwwLDJ9ICovCisjZGVmaW5lIElHQTJfVkVSX1RPVEFMX1JFR19OVU0gICAgICAgICAgMgorLyogbG9jYXRpb246IHtDUjU5LDAsN30se0NSNUQsMyw1fSAqLworI2RlZmluZSBJR0EyX1ZFUl9BRERSX1JFR19OVU0gICAgICAgICAgIDIKKy8qIGxvY2F0aW9uOiB7Q1I1QSwwLDd9LHtDUjVDLDAsMn0gKi8KKyNkZWZpbmUgSUdBMl9WRVJfQkxBTktfU1RBUlRfUkVHX05VTSAgICAyCisvKiBsb2NhdGlvbjoge0NSNUUsMCw3fSx7Q1I1QywzLDV9ICovCisjZGVmaW5lIElHQTJfVkVSX0JMQU5LX0VORF9SRUdfTlVNICAgICAgMgorLyogbG9jYXRpb246IHtDUjVFLDAsN30se0NSNUYsNSw3fSAqLworI2RlZmluZSBJR0EyX1ZFUl9TWU5DX1NUQVJUX1JFR19OVU0gICAgIDIKKy8qIGxvY2F0aW9uOiB7Q1I1RiwwLDR9ICovCisjZGVmaW5lIElHQTJfVkVSX1NZTkNfRU5EX1JFR19OVU0gICAgICAgMQorCisvKiBEZWZpbmUgT2Zmc2V0IGFuZCBGZXRjaCBDb3VudCBSZWdpc3RlciovCisKKy8qIGxvY2F0aW9uOiB7Q1IxMywwLDd9LHtDUjM1LDUsN30gKi8KKyNkZWZpbmUgSUdBMV9PRkZTRVRfUkVHX05VTSAgICAgICAgICAgICAyCisvKiA4IGJ5dGVzIGFsaWdubWVudC4gKi8KKyNkZWZpbmUgSUdBMV9PRkZTRVJfQUxJR05fQllURSAgICAgICAgICA4CisvKiB4OiBIIHJlc29sdXRpb24sIHk6IGNvbG9yIGRlcHRoICovCisjZGVmaW5lIElHQTFfT0ZGU0VUX0ZPUk1VTEEoeCwgeSkgICAgICAgICgoeCp5KS9JR0ExX09GRlNFUl9BTElHTl9CWVRFKQorLyogbG9jYXRpb246IHtTUjFDLDAsN30se1NSMUQsMCwxfSAqLworI2RlZmluZSBJR0ExX0ZFVENIX0NPVU5UX1JFR19OVU0gICAgICAgIDIKKy8qIDE2IGJ5dGVzIGFsaWdubWVudC4gKi8KKyNkZWZpbmUgSUdBMV9GRVRDSF9DT1VOVF9BTElHTl9CWVRFICAgICAxNgorLyogeDogSCByZXNvbHV0aW9uLCB5OiBjb2xvciBkZXB0aCAqLworI2RlZmluZSBJR0ExX0ZFVENIX0NPVU5UX1BBVENIX1ZBTFVFICAgIDQKKyNkZWZpbmUgSUdBMV9GRVRDSF9DT1VOVF9GT1JNVUxBKHgsIHkpICAgXAorCSgoKHgqeSkvSUdBMV9GRVRDSF9DT1VOVF9BTElHTl9CWVRFKSArIElHQTFfRkVUQ0hfQ09VTlRfUEFUQ0hfVkFMVUUpCisKKy8qIGxvY2F0aW9uOiB7Q1I2NiwwLDd9LHtDUjY3LDAsMX0gKi8KKyNkZWZpbmUgSUdBMl9PRkZTRVRfUkVHX05VTSAgICAgICAgICAgICAyCisjZGVmaW5lIElHQTJfT0ZGU0VUX0FMSUdOX0JZVEUgICAgICAgICAgOAorLyogeDogSCByZXNvbHV0aW9uLCB5OiBjb2xvciBkZXB0aCAqLworI2RlZmluZSBJR0EyX09GRlNFVF9GT1JNVUxBKHgsIHkpICAgICAgICAoKHgqeSkvSUdBMl9PRkZTRVRfQUxJR05fQllURSkKKy8qIGxvY2F0aW9uOiB7Q1I2NSwwLDd9LHtDUjY3LDIsM30gKi8KKyNkZWZpbmUgSUdBMl9GRVRDSF9DT1VOVF9SRUdfTlVNICAgICAgICAyCisjZGVmaW5lIElHQTJfRkVUQ0hfQ09VTlRfQUxJR05fQllURSAgICAgMTYKKyNkZWZpbmUgSUdBMl9GRVRDSF9DT1VOVF9QQVRDSF9WQUxVRSAgICAwCisjZGVmaW5lIElHQTJfRkVUQ0hfQ09VTlRfRk9STVVMQSh4LCB5KSAgIFwKKwkoKCh4KnkpL0lHQTJfRkVUQ0hfQ09VTlRfQUxJR05fQllURSkgKyBJR0EyX0ZFVENIX0NPVU5UX1BBVENIX1ZBTFVFKQorCisvKiBTdGFyaW5nIEFkZHJlc3MqLworCisvKiBsb2NhdGlvbjoge0NSMEMsMCw3fSx7Q1IwRCwwLDd9LHtDUjM0LDAsN30se0NSNDgsMCwxfSAqLworI2RlZmluZSBJR0ExX1NUQVJUSU5HX0FERFJfUkVHX05VTSAgICAgIDQKKy8qIGxvY2F0aW9uOiB7Q1I2MiwxLDd9LHtDUjYzLDAsN30se0NSNjQsMCw3fSAqLworI2RlZmluZSBJR0EyX1NUQVJUSU5HX0FERFJfUkVHX05VTSAgICAgIDMKKworLyogRGVmaW5lIERpc3BsYXkgT0ZGU0VUKi8KKy8qIFRoZXNlIHZhbHVlIGFyZSBieSBIVyBzdWdnZXN0ZWQgdmFsdWUqLworLyogbG9jYXRpb246IHtTUjE3LDAsN30gKi8KKyNkZWZpbmUgSzgwMF9JR0ExX0ZJRk9fTUFYX0RFUFRIICAgICAgICAgICAgICAgIDM4NAorLyogbG9jYXRpb246IHtTUjE2LDAsNX0se1NSMTYsNyw3fSAqLworI2RlZmluZSBLODAwX0lHQTFfRklGT19USFJFU0hPTEQgICAgICAgICAgICAgICAgMzI4CisvKiBsb2NhdGlvbjoge1NSMTgsMCw1fSx7U1IxOCw3LDd9ICovCisjZGVmaW5lIEs4MDBfSUdBMV9GSUZPX0hJR0hfVEhSRVNIT0xEICAgICAgICAgICAyOTYKKy8qIGxvY2F0aW9uOiB7U1IyMiwwLDR9LiAoMTI4LzQpID02NCwgSzgwMCBtdXN0IGJlIHNldCB6ZXJvLCAqLworCQkJCS8qIGJlY2F1c2UgSFcgb25seSA1IGJpdHMgKi8KKyNkZWZpbmUgSzgwMF9JR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgIDAKKworLyogbG9jYXRpb246IHtDUjY4LDQsN30se0NSOTQsNyw3fSx7Q1I5NSw3LDd9ICovCisjZGVmaW5lIEs4MDBfSUdBMl9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgICAzODQKKy8qIGxvY2F0aW9uOiB7Q1I2OCwwLDN9LHtDUjk1LDQsNn0gKi8KKyNkZWZpbmUgSzgwMF9JR0EyX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgIDMyOAorLyogbG9jYXRpb246IHtDUjkyLDAsM30se0NSOTUsMCwyfSAqLworI2RlZmluZSBLODAwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgMjk2CisvKiBsb2NhdGlvbjoge0NSOTQsMCw2fSAqLworI2RlZmluZSBLODAwX0lHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNICAgICAgMTI4CisKKy8qIGxvY2F0aW9uOiB7U1IxNywwLDd9ICovCisjZGVmaW5lIFA4ODBfSUdBMV9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgICAxOTIKKy8qIGxvY2F0aW9uOiB7U1IxNiwwLDV9LHtTUjE2LDcsN30gKi8KKyNkZWZpbmUgUDg4MF9JR0ExX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgIDEyOAorLyogbG9jYXRpb246IHtTUjE4LDAsNX0se1NSMTgsNyw3fSAqLworI2RlZmluZSBQODgwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgNjQKKy8qIGxvY2F0aW9uOiB7U1IyMiwwLDR9LiAoMTI4LzQpID02NCwgSzgwMCBtdXN0IGJlIHNldCB6ZXJvLCAqLworCQkJCS8qIGJlY2F1c2UgSFcgb25seSA1IGJpdHMgKi8KKyNkZWZpbmUgUDg4MF9JR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgIDAKKworLyogbG9jYXRpb246IHtDUjY4LDQsN30se0NSOTQsNyw3fSx7Q1I5NSw3LDd9ICovCisjZGVmaW5lIFA4ODBfSUdBMl9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgICA5NgorLyogbG9jYXRpb246IHtDUjY4LDAsM30se0NSOTUsNCw2fSAqLworI2RlZmluZSBQODgwX0lHQTJfRklGT19USFJFU0hPTEQgICAgICAgICAgICAgICAgNjQKKy8qIGxvY2F0aW9uOiB7Q1I5MiwwLDN9LHtDUjk1LDAsMn0gKi8KKyNkZWZpbmUgUDg4MF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgIDMyCisvKiBsb2NhdGlvbjoge0NSOTQsMCw2fSAqLworI2RlZmluZSBQODgwX0lHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNICAgICAgMTI4CisKKy8qIFZUMzMxNCBjaGlwc2V0Ki8KKworLyogbG9jYXRpb246IHtTUjE3LDAsN30gKi8KKyNkZWZpbmUgQ043MDBfSUdBMV9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgIDk2CisvKiBsb2NhdGlvbjoge1NSMTYsMCw1fSx7U1IxNiw3LDd9ICovCisjZGVmaW5lIENONzAwX0lHQTFfRklGT19USFJFU0hPTEQgICAgICAgICAgICAgICA4MAorLyogbG9jYXRpb246IHtTUjE4LDAsNX0se1NSMTgsNyw3fSAqLworI2RlZmluZSBDTjcwMF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgNjQKKy8qIGxvY2F0aW9uOiB7U1IyMiwwLDR9LiAoMTI4LzQpID02NCwgUDgwMCBtdXN0IGJlIHNldCB6ZXJvLAorCQkJCWJlY2F1c2UgSFcgb25seSA1IGJpdHMgKi8KKyNkZWZpbmUgQ043MDBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU0gICAgIDAKKy8qIGxvY2F0aW9uOiB7Q1I2OCw0LDd9LHtDUjk0LDcsN30se0NSOTUsNyw3fSAqLworI2RlZmluZSBDTjcwMF9JR0EyX0ZJRk9fTUFYX0RFUFRIICAgICAgICAgICAgICAgOTYKKy8qIGxvY2F0aW9uOiB7Q1I2OCwwLDN9LHtDUjk1LDQsNn0gKi8KKyNkZWZpbmUgQ043MDBfSUdBMl9GSUZPX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDgwCisvKiBsb2NhdGlvbjoge0NSOTIsMCwzfSx7Q1I5NSwwLDJ9ICovCisjZGVmaW5lIENONzAwX0lHQTJfRklGT19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAzMgorLyogbG9jYXRpb246IHtDUjk0LDAsNn0gKi8KKyNkZWZpbmUgQ043MDBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU0gICAgIDEyOAorCisvKiBGb3IgVlQzMzI0LCB0aGVzZSB2YWx1ZXMgYXJlIHN1Z2dlc3RlZCBieSBIVyAqLworLyogbG9jYXRpb246IHtTUjE3LDAsN30gKi8KKyNkZWZpbmUgQ1g3MDBfSUdBMV9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgIDE5MgorLyogbG9jYXRpb246IHtTUjE2LDAsNX0se1NSMTYsNyw3fSAqLworI2RlZmluZSBDWDcwMF9JR0ExX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgMTI4CisvKiBsb2NhdGlvbjoge1NSMTgsMCw1fSx7U1IxOCw3LDd9ICovCisjZGVmaW5lIENYNzAwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAxMjgKKy8qIGxvY2F0aW9uOiB7U1IyMiwwLDR9ICovCisjZGVmaW5lIENYNzAwX0lHQTFfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNICAgICAxMjQKKworLyogbG9jYXRpb246IHtDUjY4LDQsN30se0NSOTQsNyw3fSx7Q1I5NSw3LDd9ICovCisjZGVmaW5lIENYNzAwX0lHQTJfRklGT19NQVhfREVQVEggICAgICAgICAgICAgICA5NgorLyogbG9jYXRpb246IHtDUjY4LDAsM30se0NSOTUsNCw2fSAqLworI2RlZmluZSBDWDcwMF9JR0EyX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgNjQKKy8qIGxvY2F0aW9uOiB7Q1I5MiwwLDN9LHtDUjk1LDAsMn0gKi8KKyNkZWZpbmUgQ1g3MDBfSUdBMl9GSUZPX0hJR0hfVEhSRVNIT0xEICAgICAgICAgIDMyCisvKiBsb2NhdGlvbjoge0NSOTQsMCw2fSAqLworI2RlZmluZSBDWDcwMF9JR0EyX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgMTI4CisKKy8qIFZUMzMzNiBjaGlwc2V0Ki8KKy8qIGxvY2F0aW9uOiB7U1IxNywwLDd9ICovCisjZGVmaW5lIEs4TTg5MF9JR0ExX0ZJRk9fTUFYX0RFUFRIICAgICAgICAgICAgICAgMzYwCisvKiBsb2NhdGlvbjoge1NSMTYsMCw1fSx7U1IxNiw3LDd9ICovCisjZGVmaW5lIEs4TTg5MF9JR0ExX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgMzI4CisvKiBsb2NhdGlvbjoge1NSMTgsMCw1fSx7U1IxOCw3LDd9ICovCisjZGVmaW5lIEs4TTg5MF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgMjk2CisvKiBsb2NhdGlvbjoge1NSMjIsMCw0fS4gKi8KKyNkZWZpbmUgSzhNODkwX0lHQTFfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNICAgICAxMjQKKworLyogbG9jYXRpb246IHtDUjY4LDQsN30se0NSOTQsNyw3fSx7Q1I5NSw3LDd9ICovCisjZGVmaW5lIEs4TTg5MF9JR0EyX0ZJRk9fTUFYX0RFUFRIICAgICAgICAgICAgICAgMzYwCisvKiBsb2NhdGlvbjoge0NSNjgsMCwzfSx7Q1I5NSw0LDZ9ICovCisjZGVmaW5lIEs4TTg5MF9JR0EyX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgMzI4CisvKiBsb2NhdGlvbjoge0NSOTIsMCwzfSx7Q1I5NSwwLDJ9ICovCisjZGVmaW5lIEs4TTg5MF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgMjk2CisvKiBsb2NhdGlvbjoge0NSOTQsMCw2fSAqLworI2RlZmluZSBLOE04OTBfSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU0gICAgIDEyNAorCisvKiBWVDMzMjcgY2hpcHNldCovCisvKiBsb2NhdGlvbjoge1NSMTcsMCw3fSAqLworI2RlZmluZSBQNE04OTBfSUdBMV9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgIDk2CisvKiBsb2NhdGlvbjoge1NSMTYsMCw1fSx7U1IxNiw3LDd9ICovCisjZGVmaW5lIFA0TTg5MF9JR0ExX0ZJRk9fVEhSRVNIT0xEICAgICAgICAgICAgICAgNzYKKy8qIGxvY2F0aW9uOiB7U1IxOCwwLDV9LHtTUjE4LDcsN30gKi8KKyNkZWZpbmUgUDRNODkwX0lHQTFfRklGT19ISUdIX1RIUkVTSE9MRCAgICAgICAgICA2NAorLyogbG9jYXRpb246IHtTUjIyLDAsNH0uICgzMi80KSA9OCAqLworI2RlZmluZSBQNE04OTBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU0gICAgIDMyCisvKiBsb2NhdGlvbjoge0NSNjgsNCw3fSx7Q1I5NCw3LDd9LHtDUjk1LDcsN30gKi8KKyNkZWZpbmUgUDRNODkwX0lHQTJfRklGT19NQVhfREVQVEggICAgICAgICAgICAgICA5NgorLyogbG9jYXRpb246IHtDUjY4LDAsM30se0NSOTUsNCw2fSAqLworI2RlZmluZSBQNE04OTBfSUdBMl9GSUZPX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDc2CisvKiBsb2NhdGlvbjoge0NSOTIsMCwzfSx7Q1I5NSwwLDJ9ICovCisjZGVmaW5lIFA0TTg5MF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgNjQKKy8qIGxvY2F0aW9uOiB7Q1I5NCwwLDZ9ICovCisjZGVmaW5lIFA0TTg5MF9JR0EyX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgMzIKKworLyogVlQzMzY0IGNoaXBzZXQqLworLyogbG9jYXRpb246IHtTUjE3LDAsN30gKi8KKyNkZWZpbmUgUDRNOTAwX0lHQTFfRklGT19NQVhfREVQVEggICAgICAgICAgICAgICA5NgorLyogbG9jYXRpb246IHtTUjE2LDAsNX0se1NSMTYsNyw3fSAqLworI2RlZmluZSBQNE05MDBfSUdBMV9GSUZPX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDc2CisvKiBsb2NhdGlvbjoge1NSMTgsMCw1fSx7U1IxOCw3LDd9ICovCisjZGVmaW5lIFA0TTkwMF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgNzYKKy8qIGxvY2F0aW9uOiB7U1IyMiwwLDR9LiAqLworI2RlZmluZSBQNE05MDBfSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU0gICAgIDMyCisvKiBsb2NhdGlvbjoge0NSNjgsNCw3fSx7Q1I5NCw3LDd9LHtDUjk1LDcsN30gKi8KKyNkZWZpbmUgUDRNOTAwX0lHQTJfRklGT19NQVhfREVQVEggICAgICAgICAgICAgICA5NgorLyogbG9jYXRpb246IHtDUjY4LDAsM30se0NSOTUsNCw2fSAqLworI2RlZmluZSBQNE05MDBfSUdBMl9GSUZPX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDc2CisvKiBsb2NhdGlvbjoge0NSOTIsMCwzfSx7Q1I5NSwwLDJ9ICovCisjZGVmaW5lIFA0TTkwMF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgNzYKKy8qIGxvY2F0aW9uOiB7Q1I5NCwwLDZ9ICovCisjZGVmaW5lIFA0TTkwMF9JR0EyX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgMzIKKworLyogRm9yIFZUMzM1MywgdGhlc2UgdmFsdWVzIGFyZSBzdWdnZXN0ZWQgYnkgSFcgKi8KKy8qIGxvY2F0aW9uOiB7U1IxNywwLDd9ICovCisjZGVmaW5lIFZYODAwX0lHQTFfRklGT19NQVhfREVQVEggICAgICAgICAgICAgICAxOTIKKy8qIGxvY2F0aW9uOiB7U1IxNiwwLDV9LHtTUjE2LDcsN30gKi8KKyNkZWZpbmUgVlg4MDBfSUdBMV9GSUZPX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDE1MgorLyogbG9jYXRpb246IHtTUjE4LDAsNX0se1NSMTgsNyw3fSAqLworI2RlZmluZSBWWDgwMF9JR0ExX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgMTUyCisvKiBsb2NhdGlvbjoge1NSMjIsMCw0fSAqLworI2RlZmluZSBWWDgwMF9JR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTSAgICAgIDY0CisvKiBsb2NhdGlvbjoge0NSNjgsNCw3fSx7Q1I5NCw3LDd9LHtDUjk1LDcsN30gKi8KKyNkZWZpbmUgVlg4MDBfSUdBMl9GSUZPX01BWF9ERVBUSCAgICAgICAgICAgICAgIDk2CisvKiBsb2NhdGlvbjoge0NSNjgsMCwzfSx7Q1I5NSw0LDZ9ICovCisjZGVmaW5lIFZYODAwX0lHQTJfRklGT19USFJFU0hPTEQgICAgICAgICAgICAgICA2NAorLyogbG9jYXRpb246IHtDUjkyLDAsM30se0NSOTUsMCwyfSAqLworI2RlZmluZSBWWDgwMF9JR0EyX0ZJRk9fSElHSF9USFJFU0hPTEQgICAgICAgICAgMzIKKy8qIGxvY2F0aW9uOiB7Q1I5NCwwLDZ9ICovCisjZGVmaW5lIFZYODAwX0lHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNICAgICAxMjgKKworI2RlZmluZSBJR0ExX0ZJRk9fREVQVEhfU0VMRUNUX1JFR19OVU0gICAgICAgICAgMQorI2RlZmluZSBJR0ExX0ZJRk9fVEhSRVNIT0xEX1JFR19OVU0gICAgICAgICAgICAgMgorI2RlZmluZSBJR0ExX0ZJRk9fSElHSF9USFJFU0hPTERfUkVHX05VTSAgICAgICAgMgorI2RlZmluZSBJR0ExX0RJU1BMQVlfUVVFVUVfRVhQSVJFX05VTV9SRUdfTlVNICAgMQorCisjZGVmaW5lIElHQTJfRklGT19ERVBUSF9TRUxFQ1RfUkVHX05VTSAgICAgICAgICAzCisjZGVmaW5lIElHQTJfRklGT19USFJFU0hPTERfUkVHX05VTSAgICAgICAgICAgICAyCisjZGVmaW5lIElHQTJfRklGT19ISUdIX1RIUkVTSE9MRF9SRUdfTlVNICAgICAgICAyCisjZGVmaW5lIElHQTJfRElTUExBWV9RVUVVRV9FWFBJUkVfTlVNX1JFR19OVU0gICAxCisKKyNkZWZpbmUgSUdBMV9GSUZPX0RFUFRIX1NFTEVDVF9GT1JNVUxBKHgpICAgICAgICAgICAgICAgICAgICgoeC8yKS0xKQorI2RlZmluZSBJR0ExX0ZJRk9fVEhSRVNIT0xEX0ZPUk1VTEEoeCkgICAgICAgICAgICAgICAgICAgICAgKHgvNCkKKyNkZWZpbmUgSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fRk9STVVMQSh4KSAgICAgICAgICAgICh4LzQpCisjZGVmaW5lIElHQTFfRklGT19ISUdIX1RIUkVTSE9MRF9GT1JNVUxBKHgpICAgICAgICAgICAgICAgICAoeC80KQorI2RlZmluZSBJR0EyX0ZJRk9fREVQVEhfU0VMRUNUX0ZPUk1VTEEoeCkgICAgICAgICAgICAgICAgICAgKCgoeC8yKS80KS0xKQorI2RlZmluZSBJR0EyX0ZJRk9fVEhSRVNIT0xEX0ZPUk1VTEEoeCkgICAgICAgICAgICAgICAgICAgICAgKHgvNCkKKyNkZWZpbmUgSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fRk9STVVMQSh4KSAgICAgICAgICAgICh4LzQpCisjZGVmaW5lIElHQTJfRklGT19ISUdIX1RIUkVTSE9MRF9GT1JNVUxBKHgpICAgICAgICAgICAgICAgICAoeC80KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIExDRCBUaW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDUwMCBtcyA9IDUwMDAwMCB1cyAqLworI2RlZmluZSBMQ0RfUE9XRVJfU0VRX1REMCAgICAgICAgICAgICAgIDUwMDAwMAorLyogNTAgbXMgPSA1MDAwMCB1cyAqLworI2RlZmluZSBMQ0RfUE9XRVJfU0VRX1REMSAgICAgICAgICAgICAgIDUwMDAwCisvKiAwIHVzICovCisjZGVmaW5lIExDRF9QT1dFUl9TRVFfVEQyICAgICAgICAgICAgICAgMAorLyogMjEwIG1zID0gMjEwMDAwIHVzICovCisjZGVmaW5lIExDRF9QT1dFUl9TRVFfVEQzICAgICAgICAgICAgICAgMjEwMDAwCisvKiAyXjEwICogKDEvMTQuMzE4MThNKSA9IDcxLjQ3NSB1cyAoSzQwMC5yZXZBKSAqLworI2RlZmluZSBDTEUyNjZfUE9XRVJfU0VRX1VOSVQgICAgICAgICAgIDcxCisvKiAyXjExICogKDEvMTQuMzE4MThNKSA9IDE0Mi45NSB1cyAoSzQwMC5yZXZCKSAqLworI2RlZmluZSBLODAwX1BPV0VSX1NFUV9VTklUICAgICAgICAgICAgIDE0MgorLyogMl4xMyAqICgxLzE0LjMxODE4TSkgPSA1NzIuMSB1cyAqLworI2RlZmluZSBQODgwX1BPV0VSX1NFUV9VTklUICAgICAgICAgICAgIDU3MgorCisjZGVmaW5lIENMRTI2Nl9QT1dFUl9TRVFfRk9STVVMQSh4KSAgICAgKCh4KS9DTEUyNjZfUE9XRVJfU0VRX1VOSVQpCisjZGVmaW5lIEs4MDBfUE9XRVJfU0VRX0ZPUk1VTEEoeCkgICAgICAgKCh4KS9LODAwX1BPV0VSX1NFUV9VTklUKQorI2RlZmluZSBQODgwX1BPV0VSX1NFUV9GT1JNVUxBKHgpICAgICAgICgoeCkvUDg4MF9QT1dFUl9TRVFfVU5JVCkKKworLyogbG9jYXRpb246IHtDUjhCLDAsN30se0NSOEYsMCwzfSAqLworI2RlZmluZSBMQ0RfUE9XRVJfU0VRX1REMF9SRUdfTlVNICAgICAgIDIKKy8qIGxvY2F0aW9uOiB7Q1I4QywwLDd9LHtDUjhGLDQsN30gKi8KKyNkZWZpbmUgTENEX1BPV0VSX1NFUV9URDFfUkVHX05VTSAgICAgICAyCisvKiBsb2NhdGlvbjoge0NSOEQsMCw3fSx7Q1I5MCwwLDN9ICovCisjZGVmaW5lIExDRF9QT1dFUl9TRVFfVEQyX1JFR19OVU0gICAgICAgMgorLyogbG9jYXRpb246IHtDUjhFLDAsN30se0NSOTAsNCw3fSAqLworI2RlZmluZSBMQ0RfUE9XRVJfU0VRX1REM19SRUdfTlVNICAgICAgIDIKKworLyogTENEIFNjYWxpbmcgZmFjdG9yKi8KKy8qIHg6IGluZGljYXRlIHNldHRpbmcgaG9yaXpvbnRhbCBzaXplKi8KKy8qIHk6IGluZGljYXRlIHBhbmVsIGhvcml6b250YWwgc2l6ZSovCisKKy8qIEhvcml6b250YWwgc2NhbGluZyBmYWN0b3IgMTAgYml0cyAoMl4xMCkgKi8KKyNkZWZpbmUgQ0xFMjY2X0xDRF9IT1JfU0NGX0ZPUk1VTEEoeCwgeSkgICAoKCh4LTEpKjEwMjQpLyh5LTEpKQorLyogVmVydGljYWwgc2NhbGluZyBmYWN0b3IgMTAgYml0cyAoMl4xMCkgKi8KKyNkZWZpbmUgQ0xFMjY2X0xDRF9WRVJfU0NGX0ZPUk1VTEEoeCwgeSkgICAoKCh4LTEpKjEwMjQpLyh5LTEpKQorLyogSG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvciAxMCBiaXRzICgyXjEyKSAqLworI2RlZmluZSBLODAwX0xDRF9IT1JfU0NGX0ZPUk1VTEEoeCwgeSkgICAgICgoKHgtMSkqNDA5NikvKHktMSkpCisvKiBWZXJ0aWNhbCBzY2FsaW5nIGZhY3RvciAxMCBiaXRzICgyXjExKSAqLworI2RlZmluZSBLODAwX0xDRF9WRVJfU0NGX0ZPUk1VTEEoeCwgeSkgICAgICgoKHgtMSkqMjA0OCkvKHktMSkpCisKKy8qIGxvY2F0aW9uOiB7Q1I5RiwwLDF9LHtDUjc3LDAsN30se0NSNzksNCw1fSAqLworI2RlZmluZSBMQ0RfSE9SX1NDQUxJTkdfRkFDVE9SX1JFR19OVU0gIDMKKy8qIGxvY2F0aW9uOiB7Q1I3OSwzLDN9LHtDUjc4LDAsN30se0NSNzksNiw3fSAqLworI2RlZmluZSBMQ0RfVkVSX1NDQUxJTkdfRkFDVE9SX1JFR19OVU0gIDMKKy8qIGxvY2F0aW9uOiB7Q1I3NywwLDd9LHtDUjc5LDQsNX0gKi8KKyNkZWZpbmUgTENEX0hPUl9TQ0FMSU5HX0ZBQ1RPUl9SRUdfTlVNX0NMRSAgMgorLyogbG9jYXRpb246IHtDUjc4LDAsN30se0NSNzksNiw3fSAqLworI2RlZmluZSBMQ0RfVkVSX1NDQUxJTkdfRkFDVE9SX1JFR19OVU1fQ0xFICAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKiAgICAgRGVmaW5lIElHQTEgRGlzcGxheSBUaW1pbmcgICAgICAgKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW9fcmVnaXN0ZXIgeworCXU4IGlvX2FkZHI7CisJdTggc3RhcnRfYml0OworCXU4IGVuZF9iaXQ7Cit9OworCisvKiBJR0ExIEhvcml6b250YWwgVG90YWwgKi8KK3N0cnVjdCBpZ2ExX2hvcl90b3RhbCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9UT1RBTF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgSG9yaXpvbnRhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLworc3RydWN0IGlnYTFfaG9yX2FkZHIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfQUREUl9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLworc3RydWN0IGlnYTFfaG9yX2JsYW5rX3N0YXJ0IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX0JMQU5LX1NUQVJUX1JFR19OVU1dOworfTsKKworLyogSUdBMSBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworc3RydWN0IGlnYTFfaG9yX2JsYW5rX2VuZCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9CTEFOS19FTkRfUkVHX05VTV07Cit9OworCisvKiBJR0ExIEhvcml6b250YWwgU3luYyBTdGFydCAqLworc3RydWN0IGlnYTFfaG9yX3N5bmNfc3RhcnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLworc3RydWN0IGlnYTFfaG9yX3N5bmNfZW5kIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX1NZTkNfRU5EX1JFR19OVU1dOworfTsKKworLyogSUdBMSBWZXJ0aWNhbCBUb3RhbCAqLworc3RydWN0IGlnYTFfdmVyX3RvdGFsIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX1RPVEFMX1JFR19OVU1dOworfTsKKworLyogSUdBMSBWZXJ0aWNhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLworc3RydWN0IGlnYTFfdmVyX2FkZHIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfQUREUl9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgVmVydGljYWwgQmxhbmsgU3RhcnQgKi8KK3N0cnVjdCBpZ2ExX3Zlcl9ibGFua19zdGFydCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9CTEFOS19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgVmVydGljYWwgQmxhbmsgRW5kICovCitzdHJ1Y3QgaWdhMV92ZXJfYmxhbmtfZW5kIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX0JMQU5LX0VORF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgVmVydGljYWwgU3luYyBTdGFydCAqLworc3RydWN0IGlnYTFfdmVyX3N5bmNfc3RhcnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfU1lOQ19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgVmVydGljYWwgU3luYyBFbmQgKi8KK3N0cnVjdCBpZ2ExX3Zlcl9zeW5jX2VuZCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9TWU5DX0VORF9SRUdfTlVNXTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogICAgICBEZWZpbmUgSUdBMiBTaGFkb3cgRGlzcGxheSBUaW1pbmcgICAgICAgICAqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSUdBMiBTaGFkb3cgSG9yaXpvbnRhbCBUb3RhbCAqLworc3RydWN0IGlnYTJfc2hhZG93X2hvcl90b3RhbCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1NIQURPV19IT1JfVE9UQUxfUkVHX05VTV07Cit9OworCisvKiBJR0EyIFNoYWRvdyBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworc3RydWN0IGlnYTJfc2hhZG93X2hvcl9ibGFua19lbmQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9TSEFET1dfSE9SX0JMQU5LX0VORF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgU2hhZG93IFZlcnRpY2FsIFRvdGFsICovCitzdHJ1Y3QgaWdhMl9zaGFkb3dfdmVyX3RvdGFsIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfU0hBRE9XX1ZFUl9UT1RBTF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgU2hhZG93IFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCitzdHJ1Y3QgaWdhMl9zaGFkb3dfdmVyX2FkZHIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9TSEFET1dfVkVSX0FERFJfUkVHX05VTV07Cit9OworCisvKiBJR0EyIFNoYWRvdyBWZXJ0aWNhbCBCbGFuayBTdGFydCAqLworc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9ibGFua19zdGFydCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1NIQURPV19WRVJfQkxBTktfU1RBUlRfUkVHX05VTV07Cit9OworCisvKiBJR0EyIFNoYWRvdyBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KK3N0cnVjdCBpZ2EyX3NoYWRvd192ZXJfYmxhbmtfZW5kIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfU0hBRE9XX1ZFUl9CTEFOS19FTkRfUkVHX05VTV07Cit9OworCisvKiBJR0EyIFNoYWRvdyBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCitzdHJ1Y3QgaWdhMl9zaGFkb3dfdmVyX3N5bmNfc3RhcnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9TSEFET1dfVkVSX1NZTkNfU1RBUlRfUkVHX05VTV07Cit9OworCisvKiBJR0EyIFNoYWRvdyBWZXJ0aWNhbCBTeW5jIEVuZCAqLworc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9zeW5jX2VuZCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1NIQURPV19WRVJfU1lOQ19FTkRfUkVHX05VTV07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICAgICAgRGVmaW5lIElHQTIgRGlzcGxheSBUaW1pbmcgICAgICAgICAgICAgICAgKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJR0EyIEhvcml6b250YWwgVG90YWwgKi8KK3N0cnVjdCBpZ2EyX2hvcl90b3RhbCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9UT1RBTF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgSG9yaXpvbnRhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLworc3RydWN0IGlnYTJfaG9yX2FkZHIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfQUREUl9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLworc3RydWN0IGlnYTJfaG9yX2JsYW5rX3N0YXJ0IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX0JMQU5LX1NUQVJUX1JFR19OVU1dOworfTsKKworLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworc3RydWN0IGlnYTJfaG9yX2JsYW5rX2VuZCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9CTEFOS19FTkRfUkVHX05VTV07Cit9OworCisvKiBJR0EyIEhvcml6b250YWwgU3luYyBTdGFydCAqLworc3RydWN0IGlnYTJfaG9yX3N5bmNfc3RhcnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLworc3RydWN0IGlnYTJfaG9yX3N5bmNfZW5kIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX1NZTkNfRU5EX1JFR19OVU1dOworfTsKKworLyogSUdBMiBWZXJ0aWNhbCBUb3RhbCAqLworc3RydWN0IGlnYTJfdmVyX3RvdGFsIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX1RPVEFMX1JFR19OVU1dOworfTsKKworLyogSUdBMiBWZXJ0aWNhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLworc3RydWN0IGlnYTJfdmVyX2FkZHIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfQUREUl9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgVmVydGljYWwgQmxhbmsgU3RhcnQgKi8KK3N0cnVjdCBpZ2EyX3Zlcl9ibGFua19zdGFydCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9CTEFOS19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgVmVydGljYWwgQmxhbmsgRW5kICovCitzdHJ1Y3QgaWdhMl92ZXJfYmxhbmtfZW5kIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX0JMQU5LX0VORF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgVmVydGljYWwgU3luYyBTdGFydCAqLworc3RydWN0IGlnYTJfdmVyX3N5bmNfc3RhcnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfU1lOQ19TVEFSVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgVmVydGljYWwgU3luYyBFbmQgKi8KK3N0cnVjdCBpZ2EyX3Zlcl9zeW5jX2VuZCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9TWU5DX0VORF9SRUdfTlVNXTsKK307CisKKy8qIElHQTEgT2Zmc2V0IFJlZ2lzdGVyICovCitzdHJ1Y3QgaWdhMV9vZmZzZXQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9PRkZTRVRfUkVHX05VTV07Cit9OworCisvKiBJR0EyIE9mZnNldCBSZWdpc3RlciAqLworc3RydWN0IGlnYTJfb2Zmc2V0IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfT0ZGU0VUX1JFR19OVU1dOworfTsKKworc3RydWN0IG9mZnNldCB7CisJc3RydWN0IGlnYTFfb2Zmc2V0IGlnYTFfb2Zmc2V0X3JlZzsKKwlzdHJ1Y3QgaWdhMl9vZmZzZXQgaWdhMl9vZmZzZXRfcmVnOworfTsKKworLyogSUdBMSBGZXRjaCBDb3VudCBSZWdpc3RlciAqLworc3RydWN0IGlnYTFfZmV0Y2hfY291bnQgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9GRVRDSF9DT1VOVF9SRUdfTlVNXTsKK307CisKKy8qIElHQTIgRmV0Y2ggQ291bnQgUmVnaXN0ZXIgKi8KK3N0cnVjdCBpZ2EyX2ZldGNoX2NvdW50IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfRkVUQ0hfQ09VTlRfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgZmV0Y2hfY291bnQgeworCXN0cnVjdCBpZ2ExX2ZldGNoX2NvdW50IGlnYTFfZmV0Y2hfY291bnRfcmVnOworCXN0cnVjdCBpZ2EyX2ZldGNoX2NvdW50IGlnYTJfZmV0Y2hfY291bnRfcmVnOworfTsKKworLyogU3RhcnRpbmcgQWRkcmVzcyBSZWdpc3RlciAqLworc3RydWN0IGlnYTFfc3RhcnRpbmdfYWRkciB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1NUQVJUSU5HX0FERFJfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMl9zdGFydGluZ19hZGRyIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfU1RBUlRJTkdfQUREUl9SRUdfTlVNXTsKK307CisKK3N0cnVjdCBzdGFydGluZ19hZGRyIHsKKwlzdHJ1Y3QgaWdhMV9zdGFydGluZ19hZGRyIGlnYTFfc3RhcnRpbmdfYWRkcl9yZWc7CisJc3RydWN0IGlnYTJfc3RhcnRpbmdfYWRkciBpZ2EyX3N0YXJ0aW5nX2FkZHJfcmVnOworfTsKKworLyogTENEIFBvd2VyIFNlcXVlbmNlIFRpbWVyICovCitzdHJ1Y3QgbGNkX3B3ZF9zZXFfdGQwIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0xDRF9QT1dFUl9TRVFfVEQwX1JFR19OVU1dOworfTsKKworc3RydWN0IGxjZF9wd2Rfc2VxX3RkMSB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tMQ0RfUE9XRVJfU0VRX1REMV9SRUdfTlVNXTsKK307CisKK3N0cnVjdCBsY2RfcHdkX3NlcV90ZDIgeworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbTENEX1BPV0VSX1NFUV9URDJfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgbGNkX3B3ZF9zZXFfdGQzIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0xDRF9QT1dFUl9TRVFfVEQzX1JFR19OVU1dOworfTsKKworc3RydWN0IF9sY2RfcHdkX3NlcV90aW1lciB7CisJc3RydWN0IGxjZF9wd2Rfc2VxX3RkMCB0ZDA7CisJc3RydWN0IGxjZF9wd2Rfc2VxX3RkMSB0ZDE7CisJc3RydWN0IGxjZF9wd2Rfc2VxX3RkMiB0ZDI7CisJc3RydWN0IGxjZF9wd2Rfc2VxX3RkMyB0ZDM7Cit9OworCisvKiBMQ0QgU2NhbGluZyBGYWN0b3IgKi8KK3N0cnVjdCBfbGNkX2hvcl9zY2FsaW5nX2ZhY3RvciB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tMQ0RfSE9SX1NDQUxJTkdfRkFDVE9SX1JFR19OVU1dOworfTsKKworc3RydWN0IF9sY2RfdmVyX3NjYWxpbmdfZmFjdG9yIHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0xDRF9WRVJfU0NBTElOR19GQUNUT1JfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgX2xjZF9zY2FsaW5nX2ZhY3RvciB7CisJc3RydWN0IF9sY2RfaG9yX3NjYWxpbmdfZmFjdG9yIGxjZF9ob3Jfc2NhbGluZ19mYWN0b3I7CisJc3RydWN0IF9sY2RfdmVyX3NjYWxpbmdfZmFjdG9yIGxjZF92ZXJfc2NhbGluZ19mYWN0b3I7Cit9OworCitzdHJ1Y3QgcGxsX21hcCB7CisJdTMyIGNsazsKKwl1MzIgY2xlMjY2X3BsbDsKKwl1MzIgazgwMF9wbGw7CisJdTMyIGN4NzAwX3BsbDsKK307CisKK3N0cnVjdCByZ2JMVVQgeworCXU4IHJlZDsKKwl1OCBncmVlbjsKKwl1OCBibHVlOworfTsKKworc3RydWN0IGxjZF9wd2Rfc2VxX3RpbWVyIHsKKwl1MTYgdGQwOworCXUxNiB0ZDE7CisJdTE2IHRkMjsKKwl1MTYgdGQzOworfTsKKworLyogRGlzcGxheSBGSUZPIFJlbGF0aW9uIFJlZ2lzdGVycyovCitzdHJ1Y3QgaWdhMV9maWZvX2RlcHRoX3NlbGVjdCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0ZJRk9fREVQVEhfU0VMRUNUX1JFR19OVU1dOworfTsKKworc3RydWN0IGlnYTFfZmlmb190aHJlc2hvbGRfc2VsZWN0IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfRklGT19USFJFU0hPTERfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMV9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0ZJRk9fSElHSF9USFJFU0hPTERfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMV9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0geworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMl9maWZvX2RlcHRoX3NlbGVjdCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0ZJRk9fREVQVEhfU0VMRUNUX1JFR19OVU1dOworfTsKKworc3RydWN0IGlnYTJfZmlmb190aHJlc2hvbGRfc2VsZWN0IHsKKwlpbnQgcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfRklGT19USFJFU0hPTERfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMl9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdCB7CisJaW50IHJlZ19udW07CisJc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0ZJRk9fSElHSF9USFJFU0hPTERfUkVHX05VTV07Cit9OworCitzdHJ1Y3QgaWdhMl9kaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0geworCWludCByZWdfbnVtOworCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9ESVNQTEFZX1FVRVVFX0VYUElSRV9OVU1fUkVHX05VTV07Cit9OworCitzdHJ1Y3QgZmlmb19kZXB0aF9zZWxlY3QgeworCXN0cnVjdCBpZ2ExX2ZpZm9fZGVwdGhfc2VsZWN0IGlnYTFfZmlmb19kZXB0aF9zZWxlY3RfcmVnOworCXN0cnVjdCBpZ2EyX2ZpZm9fZGVwdGhfc2VsZWN0IGlnYTJfZmlmb19kZXB0aF9zZWxlY3RfcmVnOworfTsKKworc3RydWN0IGZpZm9fdGhyZXNob2xkX3NlbGVjdCB7CisJc3RydWN0IGlnYTFfZmlmb190aHJlc2hvbGRfc2VsZWN0IGlnYTFfZmlmb190aHJlc2hvbGRfc2VsZWN0X3JlZzsKKwlzdHJ1Y3QgaWdhMl9maWZvX3RocmVzaG9sZF9zZWxlY3QgaWdhMl9maWZvX3RocmVzaG9sZF9zZWxlY3RfcmVnOworfTsKKworc3RydWN0IGZpZm9faGlnaF90aHJlc2hvbGRfc2VsZWN0IHsKKwlzdHJ1Y3QgaWdhMV9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdAorCSBpZ2ExX2ZpZm9faGlnaF90aHJlc2hvbGRfc2VsZWN0X3JlZzsKKwlzdHJ1Y3QgaWdhMl9maWZvX2hpZ2hfdGhyZXNob2xkX3NlbGVjdAorCSBpZ2EyX2ZpZm9faGlnaF90aHJlc2hvbGRfc2VsZWN0X3JlZzsKK307CisKK3N0cnVjdCBkaXNwbGF5X3F1ZXVlX2V4cGlyZV9udW0geworCXN0cnVjdCBpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bQorCSBpZ2ExX2Rpc3BsYXlfcXVldWVfZXhwaXJlX251bV9yZWc7CisJc3RydWN0IGlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtCisJIGlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtX3JlZzsKK307CisKK3N0cnVjdCBpZ2ExX2NydGNfdGltaW5nIHsKKwlzdHJ1Y3QgaWdhMV9ob3JfdG90YWwgaG9yX3RvdGFsOworCXN0cnVjdCBpZ2ExX2hvcl9hZGRyIGhvcl9hZGRyOworCXN0cnVjdCBpZ2ExX2hvcl9ibGFua19zdGFydCBob3JfYmxhbmtfc3RhcnQ7CisJc3RydWN0IGlnYTFfaG9yX2JsYW5rX2VuZCBob3JfYmxhbmtfZW5kOworCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX3N0YXJ0IGhvcl9zeW5jX3N0YXJ0OworCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX2VuZCBob3Jfc3luY19lbmQ7CisJc3RydWN0IGlnYTFfdmVyX3RvdGFsIHZlcl90b3RhbDsKKwlzdHJ1Y3QgaWdhMV92ZXJfYWRkciB2ZXJfYWRkcjsKKwlzdHJ1Y3QgaWdhMV92ZXJfYmxhbmtfc3RhcnQgdmVyX2JsYW5rX3N0YXJ0OworCXN0cnVjdCBpZ2ExX3Zlcl9ibGFua19lbmQgdmVyX2JsYW5rX2VuZDsKKwlzdHJ1Y3QgaWdhMV92ZXJfc3luY19zdGFydCB2ZXJfc3luY19zdGFydDsKKwlzdHJ1Y3QgaWdhMV92ZXJfc3luY19lbmQgdmVyX3N5bmNfZW5kOworfTsKKworc3RydWN0IGlnYTJfc2hhZG93X2NydGNfdGltaW5nIHsKKwlzdHJ1Y3QgaWdhMl9zaGFkb3dfaG9yX3RvdGFsIGhvcl90b3RhbF9zaGFkb3c7CisJc3RydWN0IGlnYTJfc2hhZG93X2hvcl9ibGFua19lbmQgaG9yX2JsYW5rX2VuZF9zaGFkb3c7CisJc3RydWN0IGlnYTJfc2hhZG93X3Zlcl90b3RhbCB2ZXJfdG90YWxfc2hhZG93OworCXN0cnVjdCBpZ2EyX3NoYWRvd192ZXJfYWRkciB2ZXJfYWRkcl9zaGFkb3c7CisJc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9ibGFua19zdGFydCB2ZXJfYmxhbmtfc3RhcnRfc2hhZG93OworCXN0cnVjdCBpZ2EyX3NoYWRvd192ZXJfYmxhbmtfZW5kIHZlcl9ibGFua19lbmRfc2hhZG93OworCXN0cnVjdCBpZ2EyX3NoYWRvd192ZXJfc3luY19zdGFydCB2ZXJfc3luY19zdGFydF9zaGFkb3c7CisJc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmRfc2hhZG93OworfTsKKworc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgeworCXN0cnVjdCBpZ2EyX2hvcl90b3RhbCBob3JfdG90YWw7CisJc3RydWN0IGlnYTJfaG9yX2FkZHIgaG9yX2FkZHI7CisJc3RydWN0IGlnYTJfaG9yX2JsYW5rX3N0YXJ0IGhvcl9ibGFua19zdGFydDsKKwlzdHJ1Y3QgaWdhMl9ob3JfYmxhbmtfZW5kIGhvcl9ibGFua19lbmQ7CisJc3RydWN0IGlnYTJfaG9yX3N5bmNfc3RhcnQgaG9yX3N5bmNfc3RhcnQ7CisJc3RydWN0IGlnYTJfaG9yX3N5bmNfZW5kIGhvcl9zeW5jX2VuZDsKKwlzdHJ1Y3QgaWdhMl92ZXJfdG90YWwgdmVyX3RvdGFsOworCXN0cnVjdCBpZ2EyX3Zlcl9hZGRyIHZlcl9hZGRyOworCXN0cnVjdCBpZ2EyX3Zlcl9ibGFua19zdGFydCB2ZXJfYmxhbmtfc3RhcnQ7CisJc3RydWN0IGlnYTJfdmVyX2JsYW5rX2VuZCB2ZXJfYmxhbmtfZW5kOworCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX3N0YXJ0IHZlcl9zeW5jX3N0YXJ0OworCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmQ7Cit9OworCisvKiBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgQ0xFMjY2ICAgICAgICAgICAgICAweDMxMjMKKyNkZWZpbmUgS000MDAgICAgICAgICAgICAgICAweDMyMDUKKyNkZWZpbmUgQ040MDBfRlVOQ1RJT04yICAgICAweDIyNTkKKyNkZWZpbmUgQ040MDBfRlVOQ1RJT04zICAgICAweDMyNTkKKy8qIHN1cHBvcnQgVlQzMzE0IGNoaXBzZXQgKi8KKyNkZWZpbmUgQ043MDBfRlVOQ1RJT04yICAgICAweDIzMTQKKyNkZWZpbmUgQ043MDBfRlVOQ1RJT04zICAgICAweDMyMDgKKy8qIFZUMzMyNCBjaGlwc2V0ICovCisjZGVmaW5lIENYNzAwX0ZVTkNUSU9OMiAgICAgMHgyMzI0CisjZGVmaW5lIENYNzAwX0ZVTkNUSU9OMyAgICAgMHgzMzI0CisvKiBWVDMyMDQgY2hpcHNldCovCisjZGVmaW5lIEtNODAwX0ZVTkNUSU9OMyAgICAgIDB4MzIwNAorLyogVlQzMzM2IGNoaXBzZXQqLworI2RlZmluZSBLTTg5MF9GVU5DVElPTjMgICAgICAweDMzMzYKKy8qIFZUMzMyNyBjaGlwc2V0Ki8KKyNkZWZpbmUgUDRNODkwX0ZVTkNUSU9OMyAgICAgMHgzMzI3CisvKiBWVDMyOTMgY2hpcHNldCovCisjZGVmaW5lIENONzUwX0ZVTkNUSU9OMyAgICAgMHgzMjA4CisvKiBWVDMzNjQgY2hpcHNldCovCisjZGVmaW5lIFA0TTkwMF9GVU5DVElPTjMgICAgMHgzMzY0CisvKiBWVDMzNTMgY2hpcHNldCovCisjZGVmaW5lIFZYODAwX0ZVTkNUSU9OMyAgICAgMHgzMzUzCisKKyNkZWZpbmUgTlVNX1RPVEFMX1BMTF9UQUJMRSBBUlJBWV9TSVpFKHBsbF92YWx1ZSkKKworc3RydWN0IElPREFUQSB7CisJdTggSW5kZXg7CisJdTggTWFzazsKKwl1OCBEYXRhOworfTsKKworc3RydWN0IHBjaV9kZXZpY2VfaWRfaW5mbyB7CisJdTMyIHZlbmRvcjsKKwl1MzIgZGV2aWNlOworCXUzMiBjaGlwX2luZGV4OworfTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfdmlydHVhbF94cmVzOworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfb2Zmc2V0OworZXh0ZXJuIGludCB2aWFmYl9zZWNvbmRfc2l6ZTsKK2V4dGVybiBpbnQgdmlhZmJfU0FNTV9PTjsKK2V4dGVybiBpbnQgdmlhZmJfZHVhbF9mYjsKK2V4dGVybiBpbnQgdmlhZmJfTENEMl9PTjsKK2V4dGVybiBpbnQgdmlhZmJfTENEX09OOworZXh0ZXJuIGludCB2aWFmYl9EVklfT047CitleHRlcm4gaW50IHZpYWZiX2FjY2VsOworZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnOworCit2b2lkIHZpYWZiX3dyaXRlX3JlZ19tYXNrKHU4IGluZGV4LCBpbnQgaW9fcG9ydCwgdTggZGF0YSwgdTggbWFzayk7Cit2b2lkIHZpYWZiX3NldF9vdXRwdXRfcGF0aChpbnQgZGV2aWNlLCBpbnQgc2V0X2lnYSwKKwlpbnQgb3V0cHV0X2ludGVyZmFjZSk7Cit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoc3RydWN0IGNydF9tb2RlX3RhYmxlICpjcnRfdGFibGUsCisJCSAgICAgIGludCBtb2RlX2luZGV4LCBpbnQgYnBwX2J5dGUsIGludCBzZXRfaWdhKTsKKwordm9pZCB2aWFmYl9zZXRfdmNsb2NrKHUzMiBDTEssIGludCBzZXRfaWdhKTsKK3ZvaWQgdmlhZmJfbG9hZF9yZWcoaW50IHRpbWluZ192YWx1ZSwgaW50IHZpYWZiX2xvYWRfcmVnX251bSwKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgKnJlZywKKwkgICAgICBpbnQgaW9fdHlwZSk7Cit2b2lkIHZpYWZiX2NydF9kaXNhYmxlKHZvaWQpOwordm9pZCB2aWFmYl9jcnRfZW5hYmxlKHZvaWQpOwordm9pZCBpbml0X2FkOTM4OSh2b2lkKTsKKy8qIEFjY2VzcyBJL08gRnVuY3Rpb24gKi8KK3ZvaWQgdmlhZmJfd3JpdGVfcmVnKHU4IGluZGV4LCB1MTYgaW9fcG9ydCwgdTggZGF0YSk7Cit1OCB2aWFmYl9yZWFkX3JlZyhpbnQgaW9fcG9ydCwgdTggaW5kZXgpOwordm9pZCB2aWFmYl9sb2NrX2NydCh2b2lkKTsKK3ZvaWQgdmlhZmJfdW5sb2NrX2NydCh2b2lkKTsKK3ZvaWQgdmlhZmJfbG9hZF9vZmZzZXRfcmVnKGludCBoX2FkZHIsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpOwordm9pZCB2aWFmYl9sb2FkX2ZldGNoX2NvdW50X3JlZyhpbnQgaF9hZGRyLCBpbnQgYnBwX2J5dGUsIGludCBzZXRfaWdhKTsKK3ZvaWQgdmlhZmJfd3JpdGVfcmVneChzdHJ1Y3QgaW9fcmVnIFJlZ1RhYmxlW10sIGludCBJdGVtTnVtKTsKK3N0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGV0YmxfcG9pbnRlcihpbnQgSW5kZXgpOwordTMyIHZpYWZiX2dldF9jbGtfdmFsdWUoaW50IGNsayk7Cit2b2lkIHZpYWZiX2xvYWRfRklGT19yZWcoaW50IHNldF9pZ2EsIGludCBob3JfYWN0aXZlLCBpbnQgdmVyX2FjdGl2ZSk7Cit2b2lkIHZpYWZiX3NldF9jb2xvcl9kZXB0aChpbnQgYnBwX2J5dGUsIGludCBzZXRfaWdhKTsKK3ZvaWQgdmlhZmJfc2V0X2RwYV9nZngoaW50IG91dHB1dF9pbnRlcmZhY2UsIHN0cnVjdCBHRlhfRFBBX1NFVFRJTkdcCisJCQkJCSpwX2dmeF9kcGFfc2V0dGluZyk7CisKK2ludCB2aWFmYl9zZXRtb2RlKGludCB2bW9kZV9pbmRleCwgaW50IGhvcl9yZXMsIGludCB2ZXJfcmVzLAorCSAgICBpbnQgdmlkZW9fYnBwLCBpbnQgdm1vZGVfaW5kZXgxLCBpbnQgaG9yX3JlczEsCisJICAgIGludCB2ZXJfcmVzMSwgaW50IHZpZGVvX2JwcDEpOwordm9pZCB2aWFmYl9pbml0X2NoaXBfaW5mbyh2b2lkKTsKK3ZvaWQgdmlhZmJfaW5pdF9kYWMoaW50IHNldF9pZ2EpOworaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKTsKK2ludCB2aWFmYl9nZXRfcmVmcmVzaChpbnQgaHJlcywgaW50IHZyZXMsIHUzMiBmbG9hdF9yZWZyZXNoKTsKK3ZvaWQgdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKGludCBocmVzLCBpbnQgdnJlcywgaW50IGJwcCwKKwkJCSAgIGludCB2bW9kZV9yZWZyZXNoLCBpbnQgZmxhZyk7Cit2b2lkIHZpYWZiX2dldF9tbWlvX2luZm8odW5zaWduZWQgbG9uZyAqbW1pb19iYXNlLAorCXVuc2lnbmVkIGxvbmcgKm1taW9fbGVuKTsKKwordm9pZCB2aWFmYl9zZXRfaWdhX3BhdGgodm9pZCk7Cit2b2lkIHZpYWZiX3NldF9zdGFydF9hZGRyKHZvaWQpOwordm9pZCB2aWFmYl9nZXRfZmJfaW5mbyh1bnNpZ25lZCBpbnQgKmZiX2Jhc2UsIHVuc2lnbmVkIGludCAqZmJfbGVuKTsKKworI2VuZGlmIC8qIF9fSFdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9pZmFjZS5jIGIvZHJpdmVycy92aWRlby92aWEvaWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcwNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvaWZhY2UuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKy8qIEdldCBmcmFtZSBidWZmZXIgc2l6ZSBmcm9tIFZHQSBCSU9TICovCisKK3Vuc2lnbmVkIGludCB2aWFmYl9nZXRfbWVtc2l6ZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBtOworCisJLyogSWYgbWVtb3J5IHNpemUgcHJvdmlkZWQgYnkgdXNlciAqLworCWlmICh2aWFmYl9tZW1zaXplKQorCQltID0gdmlhZmJfbWVtc2l6ZSAqIE1iOworCWVsc2UgeworCQltID0gKHVuc2lnbmVkIGludCl2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IzOSk7CisJCW0gPSBtICogKDQgKiBNYik7CisKKwkJaWYgKChtIDwgKDE2ICogTWIpKSB8fCAobSA+ICg2NCAqIE1iKSkpCisJCQltID0gMTYgKiBNYjsKKwl9CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiZnJhbWVidWZmZXIgc2l6ZSA9ICVkIE1iXG4iLCBtIC8gTWIpOworCXJldHVybiBtOworfQorCisvKiBHZXQgVmlkZW8gQnVmZmVyIFN0YXJ0aW5nIFBoeXNpY2FsIEFkZHJlc3MoYmFjayBkb29yKSovCisKK3Vuc2lnbmVkIGxvbmcgdmlhZmJfZ2V0X3ZpZGVvYnVmX2FkZHIodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzeXNfbWVtOworCXVuc2lnbmVkIGNoYXIgdmlkZW9fbWVtOworCXVuc2lnbmVkIGxvbmcgc3lzX21lbV9zaXplOworCXVuc2lnbmVkIGxvbmcgdmlkZW9fbWVtX3NpemU7CisJLypzeXN0ZW0gbWVtb3J5ID0gMjU2IE1CLCB2aWRlbyBtZW1vcnkgNjQgTUIgKi8KKwl1bnNpZ25lZCBsb25nIHZtZW1fc3RhcnRpbmdfYWRyID0gMHgwQzAwMDAwMDsKKworCXBkZXYgPQorCSAgICAoc3RydWN0IHBjaV9kZXYgKilwY2lfZ2V0X2RldmljZShWSUFfSzgwMF9CUklER0VfVklELAorCQkJCQkgICAgIFZJQV9LODAwX0JSSURHRV9ESUQsIE5VTEwpOworCWlmIChwZGV2ICE9IE5VTEwpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgVklBX0s4MDBfU1lTVEVNX01FTU9SWV9SRUcsCisJCQkJICAgICAmc3lzX21lbSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFZJQV9LODAwX1ZJREVPX01FTU9SWV9SRUcsCisJCQkJICAgICAmdmlkZW9fbWVtKTsKKwkJdmlkZW9fbWVtID0gKHZpZGVvX21lbSAmIDB4NzApID4+IDQ7CisJCXN5c19tZW1fc2l6ZSA9ICgodW5zaWduZWQgbG9uZylzeXNfbWVtKSA8PCAyNDsKKwkJaWYgKHZpZGVvX21lbSAhPSAwKQorCQkJdmlkZW9fbWVtX3NpemUgPSAoMSA8PCAodmlkZW9fbWVtKSkgKiAxMDI0ICogMTAyNDsKKwkJZWxzZQorCQkJdmlkZW9fbWVtX3NpemUgPSAwOworCisJCXZtZW1fc3RhcnRpbmdfYWRyID0gc3lzX21lbV9zaXplIC0gdmlkZW9fbWVtX3NpemU7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCX0KKworCURFQlVHX01TRyhLRVJOX0lORk8gIlZpZGVvIE1lbW9yeSBTdGFydGluZyBBZGRyZXNzID0gJWx4IFxuIiwKKwkJICB2bWVtX3N0YXJ0aW5nX2Fkcik7CisJcmV0dXJuIHZtZW1fc3RhcnRpbmdfYWRyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvaWZhY2UuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL2lmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwZWMzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2lmYWNlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0lGQUNFX0hfXworI2RlZmluZSBfX0lGQUNFX0hfXworCisjZGVmaW5lIEtiICAoMTAyNCkKKyNkZWZpbmUgTWIgIChLYipLYikKKworI2RlZmluZSBWSUFfSzgwMF9CUklER0VfVklEICAgICAgICAgMHgxMTA2CisjZGVmaW5lIFZJQV9LODAwX0JSSURHRV9ESUQgICAgICAgICAweDMyMDQKKworI2RlZmluZSBWSUFfSzgwMF9TWVNURU1fTUVNT1JZX1JFRyAgMHg0NworI2RlZmluZSBWSUFfSzgwMF9WSURFT19NRU1PUllfUkVHICAgMHhBMQorCitleHRlcm4gaW50IHZpYWZiX21lbXNpemU7Cit1bnNpZ25lZCBpbnQgdmlhZmJfZ2V0X21lbXNpemUodm9pZCk7Cit1bnNpZ25lZCBsb25nIHZpYWZiX2dldF92aWRlb2J1Zl9hZGRyKHZvaWQpOworCisjZW5kaWYgLyogX19JRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2lvY3RsLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDNjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9pb2N0bC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKK2ludCB2aWFmYl9pb2N0bF9nZXRfdmlhZmJfaW5mbyh1X2xvbmcgYXJnKQoreworCXN0cnVjdCB2aWFmYl9pb2N0bF9pbmZvIHZpYWluZm87CisKKwl2aWFpbmZvLnZpYWZiX2lkID0gVklBSUQ7CisJdmlhaW5mby52ZW5kb3JfaWQgPSBQQ0lfVklBX1ZFTkRPUl9JRDsKKworCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJY2FzZSBVTklDSFJPTUVfQ0xFMjY2OgorCQl2aWFpbmZvLmRldmljZV9pZCA9IFVOSUNIUk9NRV9DTEUyNjZfRElEOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0s0MDA6CisJCXZpYWluZm8uZGV2aWNlX2lkID0gVU5JQ0hST01FX0s0MDBfRElEOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJCXZpYWluZm8uZGV2aWNlX2lkID0gVU5JQ0hST01FX0s4MDBfRElEOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX1BNODAwOgorCQl2aWFpbmZvLmRldmljZV9pZCA9IFVOSUNIUk9NRV9QTTgwMF9ESUQ7CisJCWJyZWFrOworCisJY2FzZSBVTklDSFJPTUVfQ043MDA6CisJCXZpYWluZm8uZGV2aWNlX2lkID0gVU5JQ0hST01FX0NONzAwX0RJRDsKKwkJYnJlYWs7CisKKwljYXNlIFVOSUNIUk9NRV9DWDcwMDoKKwkJdmlhaW5mby5kZXZpY2VfaWQgPSBVTklDSFJPTUVfQ1g3MDBfRElEOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0s4TTg5MDoKKwkJdmlhaW5mby5kZXZpY2VfaWQgPSBVTklDSFJPTUVfSzhNODkwX0RJRDsKKwkJYnJlYWs7CisKKwljYXNlIFVOSUNIUk9NRV9QNE04OTA6CisJCXZpYWluZm8uZGV2aWNlX2lkID0gVU5JQ0hST01FX1A0TTg5MF9ESUQ7CisJCWJyZWFrOworCisJY2FzZSBVTklDSFJPTUVfUDRNOTAwOgorCQl2aWFpbmZvLmRldmljZV9pZCA9IFVOSUNIUk9NRV9QNE05MDBfRElEOworCQlicmVhazsKKwl9CisKKwl2aWFpbmZvLnZlcnNpb24gPSBWRVJTSU9OX01BSk9SOworCXZpYWluZm8ucmV2aXNpb24gPSBWRVJTSU9OX01JTk9SOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2aWFpbmZvLCBzaXplb2YodmlhaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKiBIb3QtUGx1ZyBQcmlvcml0eTogRFZJID4gQ1JUKi8KK2ludCB2aWFmYl9pb2N0bF9ob3RwbHVnKGludCBocmVzLCBpbnQgdnJlcywgaW50IGJwcCkKK3sKKwlpbnQgRFZJc2Vuc2UsIHN0YXR1cyA9IDA7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfaW9jdGxfaG90cGx1ZyEhXG4iKTsKKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lICE9CisJCU5PTl9UTURTX1RSQU5TTUlUVEVSKSB7CisJCURWSXNlbnNlID0gdmlhZmJfZHZpX3NlbnNlKCk7CisKKwkJaWYgKERWSXNlbnNlKSB7CisJCQlERUJVR19NU0coS0VSTl9JTkZPICJEVkkgQXR0YWNoZWQuLi5cbiIpOworCQkJaWYgKHZpYWZiX0RldmljZVN0YXR1cyAhPSBEVklfRGV2aWNlKSB7CisJCQkJdmlhZmJfRFZJX09OID0gMTsKKwkJCQl2aWFmYl9DUlRfT04gPSAwOworCQkJCXZpYWZiX0xDRF9PTiA9IDA7CisJCQkJdmlhZmJfRGV2aWNlU3RhdHVzID0gRFZJX0RldmljZTsKKwkJCQlyZXR1cm4gdmlhZmJfRGV2aWNlU3RhdHVzOworCQkJfQorCQkJc3RhdHVzID0gMTsKKwkJfSBlbHNlCisJCQlERUJVR19NU0coS0VSTl9JTkZPICJEVkkgRGUtYXR0YWNoZWQuLi5cbiIpOworCX0KKworCWlmICgodmlhZmJfRGV2aWNlU3RhdHVzICE9IENSVF9EZXZpY2UpICYmIChzdGF0dXMgPT0gMCkpIHsKKwkJdmlhZmJfQ1JUX09OID0gMTsKKwkJdmlhZmJfRFZJX09OID0gMDsKKwkJdmlhZmJfTENEX09OID0gMDsKKworCQl2aWFmYl9EZXZpY2VTdGF0dXMgPSBDUlRfRGV2aWNlOworCQlyZXR1cm4gdmlhZmJfRGV2aWNlU3RhdHVzOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvaW9jdGwuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyZmUzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2lvY3RsLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19JT0NUTF9IX18KKyNkZWZpbmUgX19JT0NUTF9IX18KKworI2lmbmRlZiBfX3VzZXIKKyNkZWZpbmUgX191c2VyCisjZW5kaWYKKworLyogVklBRkIgSU9DVEwgZGVmaW5pdGlvbiAqLworI2RlZmluZSBWSUFGQl9HRVRfSU5GT19TSVpFCQkweDU2NDk0MTAxCS8qICdWSUFcMDEnICovCisjZGVmaW5lIFZJQUZCX0dFVF9JTkZPCQkJMHg1NjQ5NDEwMgkvKiAnVklBXDAyJyAqLworI2RlZmluZSBWSUFGQl9IT1RQTFVHCQkJMHg1NjQ5NDEwMwkvKiAnVklBXDAzJyAqLworI2RlZmluZSBWSUFGQl9TRVRfSE9UUExVR19GTEFHCQkweDU2NDk0MTA0CS8qICdWSUFcMDQnICovCisjZGVmaW5lIFZJQUZCX0dFVF9SRVNPTFVUSU9OCQkweDU2NDk0MTA1CS8qICdWSUFcMDUnICovCisjZGVmaW5lIFZJQUZCX0dFVF9TQU1NX0lORk8JCTB4NTY0OTQxMDcJLyogJ1ZJQVwwNycgKi8KKyNkZWZpbmUgVklBRkJfVFVSTl9PTl9PVVRQVVRfREVWSUNFICAgICAweDU2NDk0MTA4CS8qICdWSUFcMDgnICovCisjZGVmaW5lIFZJQUZCX1RVUk5fT0ZGX09VVFBVVF9ERVZJQ0UgICAgMHg1NjQ5NDEwOQkvKiAnVklBXDA5JyAqLworI2RlZmluZSBWSUFGQl9TRVRfREVWSUNFCQkweDU2NDk0MTBBCisjZGVmaW5lIFZJQUZCX0dFVF9ERVZJQ0UJCTB4NTY0OTQxMEIKKyNkZWZpbmUgVklBRkJfR0VUX0RSSVZFUl9WRVJTSU9OCTB4NTY0OTQxMTIJLyogJ1ZJQVwxMicgKi8KKyNkZWZpbmUgVklBRkJfR0VUX0NISVBfSU5GTwkJMHg1NjQ5NDExMwkvKiAnVklBXDEzJyAqLworI2RlZmluZSBWSUFGQl9TRVRfREVWSUNFX0lORk8gICAgICAgICAgIDB4NTY0OTQxMTQKKyNkZWZpbmUgVklBRkJfR0VUX0RFVklDRV9JTkZPICAgICAgICAgICAweDU2NDk0MTE1CisKKyNkZWZpbmUgVklBRkJfR0VUX0RFVklDRV9TVVBQT1JUCTB4NTY0OTQxMTgKKyNkZWZpbmUgVklBRkJfR0VUX0RFVklDRV9DT05ORUNUCTB4NTY0OTQxMTkKKyNkZWZpbmUgVklBRkJfR0VUX1BBTkVMX1NVUFBPUlRfRVhQQU5ECTB4NTY0OTQxMUEKKyNkZWZpbmUgVklBRkJfR0VUX0RSSVZFUl9OQU1FCQkweDU2NDk0MTIyCisjZGVmaW5lIFZJQUZCX0dFVF9ERVZJQ0VfU1VQUE9SVF9TVEFURQkweDU2NDk0MTIzCisjZGVmaW5lIFZJQUZCX0dFVF9HQU1NQV9MVVQJCTB4NTY0OTQxMjQKKyNkZWZpbmUgVklBRkJfU0VUX0dBTU1BX0xVVAkJMHg1NjQ5NDEyNQorI2RlZmluZSBWSUFGQl9HRVRfR0FNTUFfU1VQUE9SVF9TVEFURQkweDU2NDk0MTI2CisjZGVmaW5lIFZJQUZCX1NFVF9WSURFT19ERVZJQ0UJCTB4NTY0OTQxMjcKKyNkZWZpbmUgVklBRkJfR0VUX1ZJREVPX0RFVklDRQkJMHg1NjQ5NDEyOAorI2RlZmluZSBWSUFGQl9TRVRfU0VDT05EX01PREUJCTB4NTY0OTQxMjkKKyNkZWZpbmUgVklBRkJfU1lOQ19TVVJGQUNFCQkweDU2NDk0MTMwCisjZGVmaW5lIFZJQUZCX0dFVF9EUklWRVJfQ0FQUwkJMHg1NjQ5NDEzMQorI2RlZmluZSBWSUFGQl9HRVRfSUdBX1NDQUxJTkdfSU5GTwkweDU2NDk0MTMyCisjZGVmaW5lIFZJQUZCX0dFVF9QQU5FTF9NQVhfU0laRQkweDU2NDk0MTMzCisjZGVmaW5lIFZJQUZCX0dFVF9QQU5FTF9NQVhfUE9TSVRJT04JMHg1NjQ5NDEzNAorI2RlZmluZSBWSUFGQl9TRVRfUEFORUxfU0laRQkJMHg1NjQ5NDEzNQorI2RlZmluZSBWSUFGQl9TRVRfUEFORUxfUE9TSVRJT04gICAgICAgIDB4NTY0OTQxMzYKKyNkZWZpbmUgVklBRkJfR0VUX1BBTkVMX1BPU0lUSU9OICAgICAgICAweDU2NDk0MTM3CisjZGVmaW5lIFZJQUZCX0dFVF9QQU5FTF9TSVpFCQkweDU2NDk0MTM4CisKKyNkZWZpbmUgTm9uZV9EZXZpY2UgMHgwMAorI2RlZmluZSBDUlRfRGV2aWNlICAweDAxCisjZGVmaW5lIExDRF9EZXZpY2UgIDB4MDIKKyNkZWZpbmUgRFZJX0RldmljZSAgMHgwOAorI2RlZmluZSBDUlQyX0RldmljZSAweDEwCisjZGVmaW5lIExDRDJfRGV2aWNlIDB4NDAKKworI2RlZmluZSBPUF9MQ0RfQ0VOVEVSSU5HICAgMHgwMQorI2RlZmluZSBPUF9MQ0RfUEFORUxfSUQgICAgMHgwMgorI2RlZmluZSBPUF9MQ0RfTU9ERSAgICAgICAgMHgwMworCisvKlNBTU0gb3BlcmF0aW9uIGZsYWcqLworI2RlZmluZSBPUF9TQU1NICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIExDRF9QQU5FTF9JRF9NQVhJTVVNCTIyCisKKyNkZWZpbmUgU1RBVEVfT04gICAgICAgICAgICAweDEKKyNkZWZpbmUgU1RBVEVfT0ZGICAgICAgICAgICAweDAKKyNkZWZpbmUgU1RBVEVfREVGQVVMVCAgICAgICAweEZGRkYKKworI2RlZmluZSBNQVhfQUNUSVZFX0RFVl9OVU0gIDIKKworc3RydWN0IGRldmljZV90IHsKKwl1bnNpZ25lZCBzaG9ydCBjcnQ6MTsKKwl1bnNpZ25lZCBzaG9ydCBkdmk6MTsKKwl1bnNpZ25lZCBzaG9ydCBsY2Q6MTsKKwl1bnNpZ25lZCBzaG9ydCBzYW1tOjE7CisJdW5zaWduZWQgc2hvcnQgbGNkX2RzcF9jZW50OjE7CisJdW5zaWduZWQgY2hhciBsY2RfbW9kZToxOworCXVuc2lnbmVkIHNob3J0IGVwaWFfZHZpOjE7CisJdW5zaWduZWQgc2hvcnQgbGNkX2R1YWxfZWRnZToxOworCXVuc2lnbmVkIHNob3J0IGxjZDI6MTsKKworCXVuc2lnbmVkIHNob3J0IHByaW1hcnlfZGV2OworCXVuc2lnbmVkIGNoYXIgbGNkX3BhbmVsX2lkOworCXVuc2lnbmVkIHNob3J0IHhyZXMsIHlyZXM7CisJdW5zaWduZWQgc2hvcnQgeHJlczEsIHlyZXMxOworCXVuc2lnbmVkIHNob3J0IHJlZnJlc2g7CisJdW5zaWduZWQgc2hvcnQgYnBwOworCXVuc2lnbmVkIHNob3J0IHJlZnJlc2gxOworCXVuc2lnbmVkIHNob3J0IGJwcDE7CisJdW5zaWduZWQgc2hvcnQgc2VxdWVuY2U7CisJdW5zaWduZWQgc2hvcnQgYnVzX3dpZHRoOworfTsKKworc3RydWN0IHZpYWZiX2lvY3RsX2luZm8geworCXUzMiB2aWFmYl9pZDsJCS8qIGZvciBpZGVudGlmeWluZyB2aWFmYiAqLworI2RlZmluZSBWSUFJRCAgICAgICAweDU2NDk0MTQ2CS8qIElkZW50aWZ5IG15c2VsZiB3aXRoICdWSUFGJyAqLworCXUxNiB2ZW5kb3JfaWQ7CisJdTE2IGRldmljZV9pZDsKKwl1OCB2ZXJzaW9uOworCXU4IHJldmlzaW9uOworCXU4IHJlc2VydmVkWzI0Nl07CS8qIGZvciBmdXR1cmUgdXNlICovCit9OworCitzdHJ1Y3QgdmlhZmJfaW9jdGxfbW9kZSB7CisJdTMyIHhyZXM7CisJdTMyIHlyZXM7CisJdTMyIHJlZnJlc2g7CisJdTMyIGJwcDsKKwl1MzIgeHJlc19zZWM7CisJdTMyIHlyZXNfc2VjOworCXUzMiB2aXJ0dWFsX3hyZXNfc2VjOworCXUzMiB2aXJ0dWFsX3lyZXNfc2VjOworCXUzMiByZWZyZXNoX3NlYzsKKwl1MzIgYnBwX3NlYzsKK307CitzdHJ1Y3QgdmlhZmJfaW9jdGxfc2FtbSB7CisJdTMyIHNhbW1fc3RhdHVzOworCXUzMiBzaXplX3ByaW07CisJdTMyIHNpemVfc2VjOworCXUzMiBtZW1fYmFzZTsKKwl1MzIgb2Zmc2V0X3NlYzsKK307CisKK3N0cnVjdCB2aWFmYl9kcml2ZXJfdmVyc2lvbiB7CisJaW50IGlNYWpvck51bTsKKwlpbnQgaUtlcm5lbE51bTsKKwlpbnQgaU9TTnVtOworCWludCBpTWlub3JOdW07Cit9OworCitzdHJ1Y3QgdmlhZmJfaW9jdGxfbGNkX2F0dHJpYnV0ZSB7CisJdW5zaWduZWQgaW50IHBhbmVsX2lkOworCXVuc2lnbmVkIGludCBkaXNwbGF5X2NlbnRlcjsKKwl1bnNpZ25lZCBpbnQgbGNkX21vZGU7Cit9OworCitzdHJ1Y3QgdmlhZmJfaW9jdGxfc2V0dGluZyB7CisJLyogRW5hYmxlIG9yIGRpc2FibGUgYWN0aXZlIGRldmljZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfZmxhZzsKKwkvKiBJbmRpY2F0ZSB3aGljaCBkZXZpY2Ugc2hvdWxkIGJlIHR1cm4gb24gb3IgdHVybiBvZmYuICovCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ7CisJLyogSW5kaWNhdGUgd2hpY2ggTENEJ3MgYXR0cmlidXRlIGNhbiBiZSBjaGFuZ2VkLiAqLworCXVuc2lnbmVkIHNob3J0IGxjZF9vcGVyYXRpb25fZmxhZzsKKwkvKiAxOiBTQU1NIE9OICAwOiBTQU1NIE9GRiAqLworCXVuc2lnbmVkIHNob3J0IHNhbW1fc3RhdHVzOworCS8qIGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiBmaXJzdCBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaXJzdF9kZXZfaG9yX3JlczsKKwkvKiB2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIGZpcnN0IGRldmljZSAqLworCXVuc2lnbmVkIHNob3J0IGZpcnN0X2Rldl92ZXJfcmVzOworCS8qIGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiBzZWNvbmQgZGV2aWNlICovCisJdW5zaWduZWQgc2hvcnQgc2Vjb25kX2Rldl9ob3JfcmVzOworCS8qIHZlcnRpY2FsIHJlc29sdXRpb24gb2Ygc2Vjb25kIGRldmljZSAqLworCXVuc2lnbmVkIHNob3J0IHNlY29uZF9kZXZfdmVyX3JlczsKKwkvKiByZWZyZXNoIHJhdGUgb2YgZmlyc3QgZGV2aWNlICovCisJdW5zaWduZWQgc2hvcnQgZmlyc3RfZGV2X3JlZnJlc2g7CisJLyogYnBwIG9mIGZpcnN0IGRldmljZSAqLworCXVuc2lnbmVkIHNob3J0IGZpcnN0X2Rldl9icHA7CisJLyogcmVmcmVzaCByYXRlIG9mIHNlY29uZCBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZWNvbmRfZGV2X3JlZnJlc2g7CisJLyogYnBwIG9mIHNlY29uZCBkZXZpY2UgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZWNvbmRfZGV2X2JwcDsKKwkvKiBJbmRpY2F0ZSB3aGljaCBkZXZpY2UgYXJlIHByaW1hcnkgZGlzcGxheSBkZXZpY2UuICovCisJdW5zaWduZWQgaW50IHByaW1hcnlfZGV2aWNlOworCS8qIEluZGljYXRlIHdoaWNoIGRldmljZSB3aWxsIHNob3cgdmlkZW8uIG9ubHkgdmFsaWQgaW4gZHVvdmlldyBtb2RlICovCisJdW5zaWduZWQgaW50IHZpZGVvX2RldmljZV9zdGF0dXM7CisJdW5zaWduZWQgaW50IHN0cnVjdF9yZXNlcnZlZFszNF07CisJc3RydWN0IHZpYWZiX2lvY3RsX2xjZF9hdHRyaWJ1dGUgbGNkX2F0dHJpYnV0ZXM7Cit9OworCitzdHJ1Y3QgX1VURnVuY3Rpb25DYXBzIHsKKwl1bnNpZ25lZCBpbnQgZHczRFNjYWxpbmdTdGF0ZTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRbMzFdOworfTsKKworc3RydWN0IF9QT1NJVElPTlZBTFVFIHsKKwl1bnNpZ25lZCBpbnQgZHdYOworCXVuc2lnbmVkIGludCBkd1k7Cit9OworCitzdHJ1Y3QgX3BhbmVsX3NpemVfcG9zX2luZm8geworCXVuc2lnbmVkIGludCBkZXZpY2VfdHlwZTsKKwlpbnQgeDsKKwlpbnQgeTsKK307CisKK2V4dGVybiBpbnQgdmlhZmJfTENEX09OOworZXh0ZXJuIGludCB2aWFmYl9EVklfT047CisKK2ludCB2aWFmYl9pb2N0bF9nZXRfdmlhZmJfaW5mbyh1X2xvbmcgYXJnKTsKK2ludCB2aWFmYl9pb2N0bF9ob3RwbHVnKGludCBocmVzLCBpbnQgdnJlcywgaW50IGJwcCk7CisKKyNlbmRpZiAvKiBfX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcyOTBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmMKQEAgLTAsMCArMSwxODIxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAibGNkdGJsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgaWdhMl9zaGFkb3dfY3J0Y190aW1pbmcgaWdhMl9zaGFkb3dfY3J0Y19yZWcgPSB7CisJLyogSUdBMiBTaGFkb3cgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtJR0EyX1NIQURPV19IT1JfVE9UQUxfUkVHX05VTSwge3tDUjZELCAwLCA3fSwge0NSNzEsIDMsIDN9IH0gfSwKKwkvKiBJR0EyIFNoYWRvdyBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtJR0EyX1NIQURPV19IT1JfQkxBTktfRU5EX1JFR19OVU0sIHt7Q1I2RSwgMCwgN30gfSB9LAorCS8qIElHQTIgU2hhZG93IFZlcnRpY2FsIFRvdGFsICovCisJe0lHQTJfU0hBRE9XX1ZFUl9UT1RBTF9SRUdfTlVNLCB7e0NSNkYsIDAsIDd9LCB7Q1I3MSwgMCwgMn0gfSB9LAorCS8qIElHQTIgU2hhZG93IFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCisJe0lHQTJfU0hBRE9XX1ZFUl9BRERSX1JFR19OVU0sIHt7Q1I3MCwgMCwgN30sIHtDUjcxLCA0LCA2fSB9IH0sCisJLyogSUdBMiBTaGFkb3cgVmVydGljYWwgQmxhbmsgU3RhcnQgKi8KKwl7SUdBMl9TSEFET1dfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sCisJIHt7Q1I3MiwgMCwgN30sIHtDUjc0LCA0LCA2fSB9IH0sCisJLyogSUdBMiBTaGFkb3cgVmVydGljYWwgQmxhbmsgRW5kICovCisJe0lHQTJfU0hBRE9XX1ZFUl9CTEFOS19FTkRfUkVHX05VTSwge3tDUjczLCAwLCA3fSwge0NSNzQsIDAsIDJ9IH0gfSwKKwkvKiBJR0EyIFNoYWRvdyBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCisJe0lHQTJfU0hBRE9XX1ZFUl9TWU5DX1NUQVJUX1JFR19OVU0sIHt7Q1I3NSwgMCwgN30sIHtDUjc2LCA0LCA2fSB9IH0sCisJLyogSUdBMiBTaGFkb3cgVmVydGljYWwgU3luYyBFbmQgKi8KKwl7SUdBMl9TSEFET1dfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1I3NiwgMCwgM30gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IF9sY2Rfc2NhbGluZ19mYWN0b3IgbGNkX3NjYWxpbmdfZmFjdG9yID0geworCS8qIExDRCBIb3Jpem9udGFsIFNjYWxpbmcgRmFjdG9yIFJlZ2lzdGVyICovCisJe0xDRF9IT1JfU0NBTElOR19GQUNUT1JfUkVHX05VTSwKKwkge3tDUjlGLCAwLCAxfSwge0NSNzcsIDAsIDd9LCB7Q1I3OSwgNCwgNX0gfSB9LAorCS8qIExDRCBWZXJ0aWNhbCBTY2FsaW5nIEZhY3RvciBSZWdpc3RlciAqLworCXtMQ0RfVkVSX1NDQUxJTkdfRkFDVE9SX1JFR19OVU0sCisJIHt7Q1I3OSwgMywgM30sIHtDUjc4LCAwLCA3fSwge0NSNzksIDYsIDd9IH0gfQorfTsKK3N0YXRpYyBzdHJ1Y3QgX2xjZF9zY2FsaW5nX2ZhY3RvciBsY2Rfc2NhbGluZ19mYWN0b3JfQ0xFID0geworCS8qIExDRCBIb3Jpem9udGFsIFNjYWxpbmcgRmFjdG9yIFJlZ2lzdGVyICovCisJe0xDRF9IT1JfU0NBTElOR19GQUNUT1JfUkVHX05VTV9DTEUsIHt7Q1I3NywgMCwgN30sIHtDUjc5LCA0LCA1fSB9IH0sCisJLyogTENEIFZlcnRpY2FsIFNjYWxpbmcgRmFjdG9yIFJlZ2lzdGVyICovCisJe0xDRF9WRVJfU0NBTElOR19GQUNUT1JfUkVHX05VTV9DTEUsIHt7Q1I3OCwgMCwgN30sIHtDUjc5LCA2LCA3fSB9IH0KK307CisKK3N0YXRpYyBpbnQgY2hlY2tfbHZkc19jaGlwKGludCBkZXZpY2VfaWRfc3ViYWRkciwgaW50IGRldmljZV9pZCk7CitzdGF0aWMgYm9vbCBsdmRzX2lkZW50aWZ5X2ludGVncmF0ZWRsdmRzKHZvaWQpOworc3RhdGljIGludCBmcF9pZF90b192aW5kZXgoaW50IHBhbmVsX2lkKTsKK3N0YXRpYyBpbnQgbHZkc19yZWdpc3Rlcl9yZWFkKGludCBpbmRleCk7CitzdGF0aWMgdm9pZCBsb2FkX2xjZF9zY2FsaW5nKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLCBpbnQgcGFuZWxfaHJlcywKKwkJICAgICAgaW50IHBhbmVsX3ZyZXMpOworc3RhdGljIHZvaWQgbG9hZF9sY2RfazQwMF9wYXRjaF90YmwoaW50IHNldF9ocmVzLCBpbnQgc2V0X3ZyZXMsCisJaW50IHBhbmVsX2lkKTsKK3N0YXRpYyB2b2lkIGxvYWRfbGNkX3A4ODBfcGF0Y2hfdGJsKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLAorCWludCBwYW5lbF9pZCk7CitzdGF0aWMgdm9pZCBsb2FkX2xjZF9wYXRjaF9yZWdzKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLAorCWludCBwYW5lbF9pZCwgaW50IHNldF9pZ2EpOworc3RhdGljIHZvaWQgdmlhX3BpdGNoX2FsaWdubWVudF9wYXRjaF9sY2QoCisJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSAgIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24KKwkJCQkgICAqcGx2ZHNfY2hpcF9pbmZvKTsKK3N0YXRpYyB2b2lkIGxjZF9wYXRjaF9za2V3X2R2cDAoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJICpwbHZkc19zZXR0aW5nX2luZm8sCisJCQkgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3N0YXRpYyB2b2lkIGxjZF9wYXRjaF9za2V3X2R2cDEoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJICpwbHZkc19zZXR0aW5nX2luZm8sCisJCQkgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3N0YXRpYyB2b2lkIGxjZF9wYXRjaF9za2V3KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkqcGx2ZHNfc2V0dGluZ19pbmZvLCBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pOworCitzdGF0aWMgdm9pZCBpbnRlZ3JhdGVkX2x2ZHNfZGlzYWJsZShzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkgICAgICpwbHZkc19zZXR0aW5nX2luZm8sCisJCQkgICAgIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7CitzdGF0aWMgdm9pZCBpbnRlZ3JhdGVkX2x2ZHNfZW5hYmxlKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSAgICAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJICAgIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7CitzdGF0aWMgdm9pZCBsY2RfcG93ZXJzZXF1ZW5jZV9vZmYodm9pZCk7CitzdGF0aWMgdm9pZCBsY2RfcG93ZXJzZXF1ZW5jZV9vbih2b2lkKTsKK3N0YXRpYyB2b2lkIGZpbGxfbGNkX2Zvcm1hdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2RpcG9ydF9vZl9pbnRlZ3JhdGVkX2x2ZHMoCisJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvLAorCQkJCSAgICAgc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJCSAgICAgKnBsdmRzX3NldHRpbmdfaW5mbyk7CitzdGF0aWMgc3RydWN0IGRpc3BsYXlfdGltaW5nIGxjZF9jZW50ZXJpbmdfdGltZ2luZyhzdHJ1Y3QgZGlzcGxheV90aW1pbmcKKwkJCQkJICAgIG1vZGVfY3J0X3JlZywKKwkJCQkJICAgc3RydWN0IGRpc3BsYXlfdGltaW5nIHBhbmVsX2NydF9yZWcpOworc3RhdGljIHZvaWQgbG9hZF9jcnRjX3NoYWRvd190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIG1vZGVfdGltaW5nLAorCQkJICAgICBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgcGFuZWxfdGltaW5nKTsKK3N0YXRpYyB2b2lkIHZpYWZiX2xvYWRfc2NhbGluZ19mYWN0b3JfZm9yX3A0bTkwMChpbnQgc2V0X2hyZXMsCisJaW50IHNldF92cmVzLCBpbnQgcGFuZWxfaHJlcywgaW50IHBhbmVsX3ZyZXMpOworCitzdGF0aWMgaW50IGNoZWNrX2x2ZHNfY2hpcChpbnQgZGV2aWNlX2lkX3N1YmFkZHIsIGludCBkZXZpY2VfaWQpCit7CisJaWYgKGx2ZHNfcmVnaXN0ZXJfcmVhZChkZXZpY2VfaWRfc3ViYWRkcikgPT0gZGV2aWNlX2lkKQorCQlyZXR1cm4gT0s7CisJZWxzZQorCQlyZXR1cm4gRkFJTDsKK30KKwordm9pZCB2aWFmYl9pbml0X2xjZF9zaXplKHZvaWQpCit7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfaW5pdF9sY2Rfc2l6ZSgpXG4iKTsKKwlERUJVR19NU0coS0VSTl9JTkZPCisJCSJ2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+Z2V0X2xjZF9zaXplX21ldGhvZCAlZFxuIiwKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmdldF9sY2Rfc2l6ZV9tZXRob2QpOworCisJc3dpdGNoICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+Z2V0X2xjZF9zaXplX21ldGhvZCkgeworCWNhc2UgR0VUX0xDRF9TSVpFX0JZX1NZU1RFTV9CSU9TOgorCQlicmVhazsKKwljYXNlIEdFVF9MQ0RfU1pJRV9CWV9IV19TVFJBUFBJTkc6CisJCWJyZWFrOworCWNhc2UgR0VUX0xDRF9TSVpFX0JZX1ZHQV9CSU9TOgorCQlERUJVR19NU0coS0VSTl9JTkZPICJHZXQgTENEIFNpemUgbWV0aG9kIGJ5IFZHQSBCSU9TICEhXG4iKTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9zaXplID0KKwkJICAgIGZwX2lkX3RvX3ZpbmRleCh2aWFmYl9sY2RfcGFuZWxfaWQpOworCQlERUJVR19NU0coS0VSTl9JTkZPICJMQ0QgUGFuZWxfSUQgPSAlZFxuIiwKKwkJCSAgdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCk7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIkxDRCBQYW5lbCBTaXplID0gJWRcbiIsCisJCQkgIHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgR0VUX0xDRF9TSVpFX0JZX1VTRVJfU0VUVElORzoKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiR2V0IExDRCBTaXplIG1ldGhvZCBieSB1c2VyIHNldHRpbmcgISFcbiIpOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3NpemUgPQorCQkgICAgZnBfaWRfdG9fdmluZGV4KHZpYWZiX2xjZF9wYW5lbF9pZCk7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIkxDRCBQYW5lbF9JRCA9ICVkXG4iLAorCQkJICB2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkKTsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiTENEIFBhbmVsIFNpemUgPSAlZFxuIiwKKwkJCSAgdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfaW5pdF9sY2Rfc2l6ZSBmYWlsXG4iKTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQxXzgwMFg2MDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfc2l6ZSA9CisJCSAgICBmcF9pZF90b192aW5kZXgoTENEX1BBTkVMX0lEMV84MDBYNjAwKTsKKwl9CisJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5sY2RfcGFuZWxfaWQgPQorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkOworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+bGNkX3BhbmVsX3NpemUgPQorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3NpemU7CisJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5sY2RfcGFuZWxfaHJlcyA9CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaHJlczsKKwl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzItPmxjZF9wYW5lbF92cmVzID0KKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzOworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9CisJICAgIHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlOworCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+TENERGl0aGVyaW5nID0KKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZzsKK30KKworc3RhdGljIGJvb2wgbHZkc19pZGVudGlmeV9pbnRlZ3JhdGVkbHZkcyh2b2lkKQoreworCWlmICh2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCA9PSBIV19MQVlPVVRfTENEX0VYVEVSTkFMX0xDRDIpIHsKKwkJLyogVHdvIGR1YWwgY2hhbm5lbCBMQ0QgKEludGVybmFsIExWRFMgKyBFeHRlcm5hbCBMVkRTKTogKi8KKwkJLyogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbCBMVkRTLCBzdWNoIGFzIFZUMTYzNiwgd2Ugc2hvdWxkCisJCSAgIGhhdmUgaXRzIGNoaXAgSUQgYWxyZWFkeS4gKi8KKwkJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUpIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yLmx2ZHNfY2hpcF9uYW1lID0KKwkJCSAgICBJTlRFR1JBVEVEX0xWRFM7CisJCQlERUJVR19NU0coS0VSTl9JTkZPICJTdXBwb3J0IHR3byBkdWFsIGNoYW5uZWwgTFZEUyFcCisJCQkJICAoSW50ZXJuYWwgTFZEUyArIEV4dGVybmFsIExWRFMpXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUgPQorCQkJICAgIElOVEVHUkFURURfTFZEUzsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8gIk5vdCBmb3VuZCBleHRlcm5hbCBMVkRTLFwKKwkJCQkgIHNvIGNhbid0IHN1cHBvcnQgdHdvIGR1YWwgY2hhbm5lbCBMVkRTIVxuIik7CisJCX0KKwl9IGVsc2UgaWYgKHZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0ID09IEhXX0xBWU9VVF9MQ0QxX0xDRDIpIHsKKwkJLyogVHdvIHNpbmdsZSBjaGFubmVsIExDRCAoSW50ZXJuYWwgTFZEUyArIEludGVybmFsIExWRFMpOiAqLworCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lID0KKwkJSU5URUdSQVRFRF9MVkRTOworCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMi5sdmRzX2NoaXBfbmFtZSA9CisJCQlJTlRFR1JBVEVEX0xWRFM7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIlN1cHBvcnQgdHdvIHNpbmdsZSBjaGFubmVsIExWRFMhXAorCQkJICAoSW50ZXJuYWwgTFZEUyArIEludGVybmFsIExWRFMpXG4iKTsKKwl9IGVsc2UgaWYgKHZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0ICE9IEhXX0xBWU9VVF9EVklfT05MWSkgeworCQkvKiBJZiB3ZSBoYXZlIGZvdW5kIGV4dGVybmFsIExWRFMsIGp1c3QgdXNlIGl0LAorCQkgICBvdGhlcndpc2UsIHdlIHdpbGwgdXNlIGludGVybmFsIExWRFMgYXMgZGVmYXVsdC4gKi8KKwkJaWYgKCF2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lKSB7CisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lID0KKwkJCSAgICBJTlRFR1JBVEVEX0xWRFM7CisJCQlERUJVR19NU0coS0VSTl9JTkZPICJGb3VuZCBJbnRlZ3JhdGVkIExWRFMhXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUgPQorCQkJTk9OX0xWRFNfVFJBTlNNSVRURVI7CisJCURFQlVHX01TRyhLRVJOX0lORk8gIkRvIG5vdCBzdXBwb3J0IExWRFMhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitpbnQgdmlhZmJfbHZkc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpCit7CisJdmlhcGFyaW5mby0+aTJjX3N0dWZmLmkyY19wb3J0ID0gSTJDUE9SVElOREVYOworCWlmICh2aWFmYl9sdmRzX2lkZW50aWZ5X3Z0MTYzNigpKSB7CisJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uaTJjX3BvcnQgPSBJMkNQT1JUSU5ERVg7CisJCURFQlVHX01TRyhLRVJOX0lORk8KKwkJCSAgIkZvdW5kIFZJQSBWVDE2MzYgTFZEUyBvbiBwb3J0IGkyYyAweDMxIFxuIik7CisJfSBlbHNlIHsKKwkJdmlhcGFyaW5mby0+aTJjX3N0dWZmLmkyY19wb3J0ID0gR1BJT1BPUlRJTkRFWDsKKwkJaWYgKHZpYWZiX2x2ZHNfaWRlbnRpZnlfdnQxNjM2KCkpIHsKKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uaTJjX3BvcnQgPQorCQkJCUdQSU9QT1JUSU5ERVg7CisJCQlERUJVR19NU0coS0VSTl9JTkZPCisJCQkJICAiRm91bmQgVklBIFZUMTYzNiBMVkRTIG9uIHBvcnQgZ3BpbyAweDJjIFxuIik7CisJCX0KKwl9CisKKwlpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DWDcwMCkKKwkJbHZkc19pZGVudGlmeV9pbnRlZ3JhdGVkbHZkcygpOworCisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUpCisJCXJldHVybiB0cnVlOworCS8qIENoZWNrIGZvciBWVDE2MzE6ICovCisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSA9IFZUMTYzMV9MVkRTOworCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX3NsYXZlX2FkZHIgPQorCQlWVDE2MzFfTFZEU19JMkNfQUREUjsKKworCWlmIChjaGVja19sdmRzX2NoaXAoVlQxNjMxX0RFVklDRV9JRF9SRUcsIFZUMTYzMV9ERVZJQ0VfSUQpICE9IEZBSUwpIHsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG4gVlQxNjMxIExWRFMgISBcbiIpOworCQlERUJVR19NU0coS0VSTl9JTkZPICJcbiAlMmQiLAorCQkJICB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lKTsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiXG4gJTJkIiwKKwkJCSAgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSk7CisJCXJldHVybiBPSzsKKwl9CisKKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lID0KKwkJTk9OX0xWRFNfVFJBTlNNSVRURVI7CisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfc2xhdmVfYWRkciA9CisJCVZUMTYzMV9MVkRTX0kyQ19BRERSOworCXJldHVybiBGQUlMOworfQorCitzdGF0aWMgaW50IGZwX2lkX3RvX3ZpbmRleChpbnQgcGFuZWxfaWQpCit7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiZnBfZ2V0X3BhbmVsX2lkKClcbiIpOworCisJaWYgKHBhbmVsX2lkID4gTENEX1BBTkVMX0lEX01BWElNVU0pCisJCXZpYWZiX2xjZF9wYW5lbF9pZCA9IHBhbmVsX2lkID0KKwkJdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSM0YpICYgMHgwRjsKKworCXN3aXRjaCAocGFuZWxfaWQpIHsKKwljYXNlIDB4MDoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gNjQwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA0ODA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEMF82NDBYNDgwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAxOworCQlyZXR1cm4gVklBX1JFU182NDBYNDgwOworCQlicmVhazsKKwljYXNlIDB4MToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gODAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA2MDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEMV84MDBYNjAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAxOworCQlyZXR1cm4gVklBX1JFU184MDBYNjAwOworCQlicmVhazsKKwljYXNlIDB4MjoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDJfMTAyNFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDE7CisJCXJldHVybiBWSUFfUkVTXzEwMjRYNzY4OworCQlicmVhazsKKwljYXNlIDB4MzoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDNfMTI4MFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDE7CisJCXJldHVybiBWSUFfUkVTXzEyODBYNzY4OworCQlicmVhazsKKwljYXNlIDB4NDoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ0XzEyODBYMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMTsKKwkJcmV0dXJuIFZJQV9SRVNfMTI4MFgxMDI0OworCQlicmVhazsKKwljYXNlIDB4NToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTQwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTA1MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ1XzE0MDBYMTA1MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMTsKKwkJcmV0dXJuIFZJQV9SRVNfMTQwMFgxMDUwOworCQlicmVhazsKKwljYXNlIDB4NjoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTYwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTIwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMTsKKwkJcmV0dXJuIFZJQV9SRVNfMTYwMFgxMjAwOworCQlicmVhazsKKwljYXNlIDB4ODoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gODAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA0ODA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEQV84MDBYNDgwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAxOworCQlyZXR1cm4gVklBX1JFU184MDBYNDgwOworCQlicmVhazsKKwljYXNlIDB4OToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDJfMTAyNFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDE7CisJCXJldHVybiBWSUFfUkVTXzEwMjRYNzY4OworCQlicmVhazsKKwljYXNlIDB4QToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDJfMTAyNFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDA7CisJCXJldHVybiBWSUFfUkVTXzEwMjRYNzY4OworCQlicmVhazsKKwljYXNlIDB4QjoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDJfMTAyNFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDA7CisJCXJldHVybiBWSUFfUkVTXzEwMjRYNzY4OworCQlicmVhazsKKwljYXNlIDB4QzoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDNfMTI4MFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDA7CisJCXJldHVybiBWSUFfUkVTXzEyODBYNzY4OworCQlicmVhazsKKwljYXNlIDB4RDoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ0XzEyODBYMTAyNDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMDsKKwkJcmV0dXJuIFZJQV9SRVNfMTI4MFgxMDI0OworCQlicmVhazsKKwljYXNlIDB4RToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTQwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTA1MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ1XzE0MDBYMTA1MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMDsKKwkJcmV0dXJuIFZJQV9SRVNfMTQwMFgxMDUwOworCQlicmVhazsKKwljYXNlIDB4RjoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTYwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gMTIwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAxOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMDsKKwkJcmV0dXJuIFZJQV9SRVNfMTYwMFgxMjAwOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaHJlcyA9IDEzNjY7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfdnJlcyA9IDc2ODsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ3XzEzNjZYNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAwOworCQlyZXR1cm4gVklBX1JFU18xMzY4WDc2ODsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2hyZXMgPSAxMDI0OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA2MDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEOF8xMDI0WDYwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMTsKKwkJcmV0dXJuIFZJQV9SRVNfMTAyNFg2MDA7CisJCWJyZWFrOworCWNhc2UgMHgxMjoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDNfMTI4MFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDE7CisJCXJldHVybiBWSUFfUkVTXzEyODBYNzY4OworCQlicmVhazsKKwljYXNlIDB4MTM6CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaHJlcyA9IDEyODA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfdnJlcyA9IDgwMDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCA9CisJCQlMQ0RfUEFORUxfSUQ5XzEyODBYODAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAxOworCQlyZXR1cm4gVklBX1JFU18xMjgwWDgwMDsKKwkJYnJlYWs7CisJY2FzZSAweDE0OgorCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2hyZXMgPSAxMzYwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEQl8xMzYwWDc2ODsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMDsKKwkJcmV0dXJuIFZJQV9SRVNfMTM2MFg3Njg7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gMTI4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNzY4OworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRDNfMTI4MFg3Njg7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlID0gMTsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPkxDRERpdGhlcmluZyA9IDA7CisJCXJldHVybiBWSUFfUkVTXzEyODBYNzY4OworCQlicmVhazsKKwljYXNlIDB4MTY6CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaHJlcyA9IDQ4MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF92cmVzID0gNjQwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkID0KKwkJCUxDRF9QQU5FTF9JRENfNDgwWDY0MDsKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmRldmljZV9sY2RfZHVhbGVkZ2UgPSAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nID0gMTsKKwkJcmV0dXJuIFZJQV9SRVNfNDgwWDY0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzID0gODAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX3ZyZXMgPSA2MDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaWQgPQorCQkJTENEX1BBTkVMX0lEMV84MDBYNjAwOworCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGV2aWNlX2xjZF9kdWFsZWRnZSA9IDA7CisJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcgPSAxOworCQlyZXR1cm4gVklBX1JFU184MDBYNjAwOworCX0KK30KKworc3RhdGljIGludCBsdmRzX3JlZ2lzdGVyX3JlYWQoaW50IGluZGV4KQoreworCXU4IGRhdGE7CisKKwl2aWFwYXJpbmZvLT5pMmNfc3R1ZmYuaTJjX3BvcnQgPSBHUElPUE9SVElOREVYOworCXZpYWZiX2kyY19yZWFkYnl0ZSgodTgpIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJICAgIGx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9zbGF2ZV9hZGRyLAorCQkJKHU4KSBpbmRleCwgJmRhdGEpOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2xjZF9zY2FsaW5nKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLCBpbnQgcGFuZWxfaHJlcywKKwkJICAgICAgaW50IHBhbmVsX3ZyZXMpCit7CisJaW50IHJlZ192YWx1ZSA9IDA7CisJaW50IHZpYWZiX2xvYWRfcmVnX251bTsKKwlzdHJ1Y3QgaW9fcmVnaXN0ZXIgKnJlZyA9IE5VTEw7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJsb2FkX2xjZF9zY2FsaW5nKCkhIVxuIik7CisKKwkvKiBMQ0QgU2NhbGluZyBFbmFibGUgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjc5LCBWSUFDUiwgMHgwNywgQklUMCArIEJJVDEgKyBCSVQyKTsKKwlpZiAoVU5JQ0hST01FX1A0TTkwMCA9PSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJdmlhZmJfbG9hZF9zY2FsaW5nX2ZhY3Rvcl9mb3JfcDRtOTAwKHNldF9ocmVzLCBzZXRfdnJlcywKKwkJCQkJICAgICAgIHBhbmVsX2hyZXMsIHBhbmVsX3ZyZXMpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgZXhwYW5zaW9uIGZvciBob3Jpem9udGFsICovCisJaWYgKHNldF9ocmVzICE9IHBhbmVsX2hyZXMpIHsKKwkJLyogTG9hZCBIb3Jpem9udGFsIFNjYWxpbmcgRmFjdG9yICovCisJCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJCWNhc2UgVU5JQ0hST01FX0NMRTI2NjoKKwkJY2FzZSBVTklDSFJPTUVfSzQwMDoKKwkJCXJlZ192YWx1ZSA9CisJCQkgICAgQ0xFMjY2X0xDRF9IT1JfU0NGX0ZPUk1VTEEoc2V0X2hyZXMsIHBhbmVsX2hyZXMpOworCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCSAgICBsY2Rfc2NhbGluZ19mYWN0b3JfQ0xFLmxjZF9ob3Jfc2NhbGluZ19mYWN0b3IuCisJCQkgICAgcmVnX251bTsKKwkJCXJlZyA9IGxjZF9zY2FsaW5nX2ZhY3Rvcl9DTEUubGNkX2hvcl9zY2FsaW5nX2ZhY3Rvci5yZWc7CisJCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsCisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQUNSKTsKKwkJCWJyZWFrOworCQljYXNlIFVOSUNIUk9NRV9LODAwOgorCQljYXNlIFVOSUNIUk9NRV9QTTgwMDoKKwkJY2FzZSBVTklDSFJPTUVfQ043MDA6CisJCWNhc2UgVU5JQ0hST01FX0NYNzAwOgorCQljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCWNhc2UgVU5JQ0hST01FX1A0TTg5MDoKKwkJCXJlZ192YWx1ZSA9CisJCQkgICAgSzgwMF9MQ0RfSE9SX1NDRl9GT1JNVUxBKHNldF9ocmVzLCBwYW5lbF9ocmVzKTsKKwkJCS8qIEhvcml6b250YWwgc2NhbGluZyBlbmFibGVkICovCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkEyLCBWSUFDUiwgMHhDMCwgQklUNyArIEJJVDYpOworCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCSAgICBsY2Rfc2NhbGluZ19mYWN0b3IubGNkX2hvcl9zY2FsaW5nX2ZhY3Rvci5yZWdfbnVtOworCQkJcmVnID0gbGNkX3NjYWxpbmdfZmFjdG9yLmxjZF9ob3Jfc2NhbGluZ19mYWN0b3IucmVnOworCQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLAorCQkJCXZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFDUik7CisJCQlicmVhazsKKwkJfQorCisJCURFQlVHX01TRyhLRVJOX0lORk8gIkhvcml6b250YWwgU2NhbGluZyB2YWx1ZSA9ICVkIiwgcmVnX3ZhbHVlKTsKKwl9IGVsc2UgeworCQkvKiBIb3Jpem9udGFsIHNjYWxpbmcgZGlzYWJsZWQgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JBMiwgVklBQ1IsIDB4MDAsIEJJVDcpOworCX0KKworCS8qIENoZWNrIGlmIGV4cGFuc2lvbiBmb3IgdmVydGljYWwgKi8KKwlpZiAoc2V0X3ZyZXMgIT0gcGFuZWxfdnJlcykgeworCQkvKiBMb2FkIFZlcnRpY2FsIFNjYWxpbmcgRmFjdG9yICovCisJCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJCWNhc2UgVU5JQ0hST01FX0NMRTI2NjoKKwkJY2FzZSBVTklDSFJPTUVfSzQwMDoKKwkJCXJlZ192YWx1ZSA9CisJCQkgICAgQ0xFMjY2X0xDRF9WRVJfU0NGX0ZPUk1VTEEoc2V0X3ZyZXMsIHBhbmVsX3ZyZXMpOworCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCSAgICBsY2Rfc2NhbGluZ19mYWN0b3JfQ0xFLmxjZF92ZXJfc2NhbGluZ19mYWN0b3IuCisJCQkgICAgcmVnX251bTsKKwkJCXJlZyA9IGxjZF9zY2FsaW5nX2ZhY3Rvcl9DTEUubGNkX3Zlcl9zY2FsaW5nX2ZhY3Rvci5yZWc7CisJCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsCisJCQkJdmlhZmJfbG9hZF9yZWdfbnVtLCByZWcsIFZJQUNSKTsKKwkJCWJyZWFrOworCQljYXNlIFVOSUNIUk9NRV9LODAwOgorCQljYXNlIFVOSUNIUk9NRV9QTTgwMDoKKwkJY2FzZSBVTklDSFJPTUVfQ043MDA6CisJCWNhc2UgVU5JQ0hST01FX0NYNzAwOgorCQljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCWNhc2UgVU5JQ0hST01FX1A0TTg5MDoKKwkJCXJlZ192YWx1ZSA9CisJCQkgICAgSzgwMF9MQ0RfVkVSX1NDRl9GT1JNVUxBKHNldF92cmVzLCBwYW5lbF92cmVzKTsKKwkJCS8qIFZlcnRpY2FsIHNjYWxpbmcgZW5hYmxlZCAqLworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JBMiwgVklBQ1IsIDB4MDgsIEJJVDMpOworCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KKwkJCSAgICBsY2Rfc2NhbGluZ19mYWN0b3IubGNkX3Zlcl9zY2FsaW5nX2ZhY3Rvci5yZWdfbnVtOworCQkJcmVnID0gbGNkX3NjYWxpbmdfZmFjdG9yLmxjZF92ZXJfc2NhbGluZ19mYWN0b3IucmVnOworCQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLAorCQkJCXZpYWZiX2xvYWRfcmVnX251bSwgcmVnLCBWSUFDUik7CisJCQlicmVhazsKKwkJfQorCisJCURFQlVHX01TRyhLRVJOX0lORk8gIlZlcnRpY2FsIFNjYWxpbmcgdmFsdWUgPSAlZCIsIHJlZ192YWx1ZSk7CisJfSBlbHNlIHsKKwkJLyogVmVydGljYWwgc2NhbGluZyBkaXNhYmxlZCAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkEyLCBWSUFDUiwgMHgwMCwgQklUMyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2FkX2xjZF9rNDAwX3BhdGNoX3RibChpbnQgc2V0X2hyZXMsIGludCBzZXRfdnJlcywKKwlpbnQgcGFuZWxfaWQpCit7CisJaW50IHZtb2RlX2luZGV4OworCWludCByZWdfbnVtID0gMDsKKwlzdHJ1Y3QgaW9fcmVnICpsY2RfcGF0Y2hfcmVnID0gTlVMTDsKKworCWlmICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPT0gSUdBMikKKwkJdm1vZGVfaW5kZXggPSB2aWFmYl9nZXRfbW9kZV9pbmRleChzZXRfaHJlcywgc2V0X3ZyZXMsIDEpOworCWVsc2UKKwkJdm1vZGVfaW5kZXggPSB2aWFmYl9nZXRfbW9kZV9pbmRleChzZXRfaHJlcywgc2V0X3ZyZXMsIDApOworCXN3aXRjaCAocGFuZWxfaWQpIHsKKwkJLyogTENEIDgwMHg2MDAgKi8KKwljYXNlIExDRF9QQU5FTF9JRDFfODAwWDYwMDoKKwkJc3dpdGNoICh2bW9kZV9pbmRleCkgeworCQljYXNlIFZJQV9SRVNfNjQwWDQwMDoKKwkJY2FzZSBWSUFfUkVTXzY0MFg0ODA6CisJCQlyZWdfbnVtID0gTlVNX1RPVEFMX0s0MDBfTENEX1JFU182WDRfOFg2OworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU182WDRfOFg2OworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU183MjBYNDgwOgorCQljYXNlIFZJQV9SRVNfNzIwWDU3NjoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzdYNF84WDY7CisJCQlsY2RfcGF0Y2hfcmVnID0gSzQwMF9MQ0RfUkVTXzdYNF84WDY7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCQkvKiBMQ0QgMTAyNHg3NjggKi8KKwljYXNlIExDRF9QQU5FTF9JRDJfMTAyNFg3Njg6CisJCXN3aXRjaCAodm1vZGVfaW5kZXgpIHsKKwkJY2FzZSBWSUFfUkVTXzY0MFg0MDA6CisJCWNhc2UgVklBX1JFU182NDBYNDgwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfNlg0XzEwWDc7CisJCQlsY2RfcGF0Y2hfcmVnID0gSzQwMF9MQ0RfUkVTXzZYNF8xMFg3OworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU183MjBYNDgwOgorCQljYXNlIFZJQV9SRVNfNzIwWDU3NjoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzdYNF8xMFg3OworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU183WDRfMTBYNzsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfODAwWDYwMDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzhYNl8xMFg3OworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU184WDZfMTBYNzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJCS8qIExDRCAxMjgweDEwMjQgKi8KKwljYXNlIExDRF9QQU5FTF9JRDRfMTI4MFgxMDI0OgorCQlzd2l0Y2ggKHZtb2RlX2luZGV4KSB7CisJCWNhc2UgVklBX1JFU182NDBYNDAwOgorCQljYXNlIFZJQV9SRVNfNjQwWDQ4MDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzZYNF8xMlgxMDsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfNlg0XzEyWDEwOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU183MjBYNDgwOgorCQljYXNlIFZJQV9SRVNfNzIwWDU3NjoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzdYNF8xMlgxMDsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfN1g0XzEyWDEwOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU184MDBYNjAwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzEyWDEwOworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU184WDZfMTJYMTA7CisJCQlicmVhazsKKwkJY2FzZSBWSUFfUkVTXzEwMjRYNzY4OgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfMTBYN18xMlgxMDsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfMTBYN18xMlgxMDsKKwkJCWJyZWFrOworCisJCX0KKwkJYnJlYWs7CisKKwkJLyogTENEIDE0MDB4MTA1MCAqLworCWNhc2UgTENEX1BBTkVMX0lENV8xNDAwWDEwNTA6CisJCXN3aXRjaCAodm1vZGVfaW5kZXgpIHsKKwkJY2FzZSBWSUFfUkVTXzY0MFg0ODA6CisJCQlyZWdfbnVtID0gTlVNX1RPVEFMX0s0MDBfTENEX1JFU182WDRfMTRYMTA7CisJCQlsY2RfcGF0Y2hfcmVnID0gSzQwMF9MQ0RfUkVTXzZYNF8xNFgxMDsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfODAwWDYwMDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzhYNl8xNFgxMDsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfOFg2XzE0WDEwOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU18xMDI0WDc2ODoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEwWDdfMTRYMTA7CisJCQlsY2RfcGF0Y2hfcmVnID0gSzQwMF9MQ0RfUkVTXzEwWDdfMTRYMTA7CisJCQlicmVhazsKKwkJY2FzZSBWSUFfUkVTXzEyODBYNzY4OgorCQljYXNlIFZJQV9SRVNfMTI4MFg4MDA6CisJCWNhc2UgVklBX1JFU18xMjgwWDk2MDoKKwkJY2FzZSBWSUFfUkVTXzEyODBYMTAyNDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEyWDEwXzE0WDEwOworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU18xMlgxMF8xNFgxMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJCS8qIExDRCAxNjAweDEyMDAgKi8KKwljYXNlIExDRF9QQU5FTF9JRDZfMTYwMFgxMjAwOgorCQlzd2l0Y2ggKHZtb2RlX2luZGV4KSB7CisJCWNhc2UgVklBX1JFU182NDBYNDAwOgorCQljYXNlIFZJQV9SRVNfNjQwWDQ4MDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzZYNF8xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfNlg0XzE2WDEyOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU183MjBYNDgwOgorCQljYXNlIFZJQV9SRVNfNzIwWDU3NjoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzdYNF8xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfN1g0XzE2WDEyOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU184MDBYNjAwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzE2WDEyOworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU184WDZfMTZYMTI7CisJCQlicmVhazsKKwkJY2FzZSBWSUFfUkVTXzEwMjRYNzY4OgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfMTBYN18xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfMTBYN18xNlgxMjsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfMTI4MFg3Njg6CisJCWNhc2UgVklBX1JFU18xMjgwWDgwMDoKKwkJY2FzZSBWSUFfUkVTXzEyODBYOTYwOgorCQljYXNlIFZJQV9SRVNfMTI4MFgxMDI0OgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfMTJYMTBfMTZYMTI7CisJCQlsY2RfcGF0Y2hfcmVnID0gSzQwMF9MQ0RfUkVTXzEyWDEwXzE2WDEyOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogTENEIDEzNjZ4NzY4ICovCisJY2FzZSBMQ0RfUEFORUxfSUQ3XzEzNjZYNzY4OgorCQlzd2l0Y2ggKHZtb2RlX2luZGV4KSB7CisJCWNhc2UgVklBX1JFU182NDBYNDgwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfNlg0XzEzNjZYNzsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfNlg0XzEzNjZYNzsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfNzIwWDQ4MDoKKwkJY2FzZSBWSUFfUkVTXzcyMFg1NzY6CisJCQlyZWdfbnVtID0gTlVNX1RPVEFMX0s0MDBfTENEX1JFU183WDRfMTM2Nlg3OworCQkJbGNkX3BhdGNoX3JlZyA9IEs0MDBfTENEX1JFU183WDRfMTM2Nlg3OworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU184MDBYNjAwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzEzNjZYNzsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfOFg2XzEzNjZYNzsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfMTAyNFg3Njg6CisJCQlyZWdfbnVtID0gTlVNX1RPVEFMX0s0MDBfTENEX1JFU18xMFg3XzEzNjZYNzsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfMTBYN18xMzY2WDc7CisJCQlicmVhazsKKwkJY2FzZSBWSUFfUkVTXzEyODBYNzY4OgorCQljYXNlIFZJQV9SRVNfMTI4MFg4MDA6CisJCWNhc2UgVklBX1JFU18xMjgwWDk2MDoKKwkJY2FzZSBWSUFfUkVTXzEyODBYMTAyNDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEyWDEwXzEzNjZYNzsKKwkJCWxjZF9wYXRjaF9yZWcgPSBLNDAwX0xDRF9SRVNfMTJYMTBfMTM2Nlg3OworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogTENEIDEzNjB4NzY4ICovCisJY2FzZSBMQ0RfUEFORUxfSURCXzEzNjBYNzY4OgorCQlicmVhazsKKwl9CisJaWYgKHJlZ19udW0gIT0gMCkgeworCQkvKiBILlcuIFJlc2V0IDogT04gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IxNywgVklBQ1IsIDB4MDAsIEJJVDcpOworCisJCXZpYWZiX3dyaXRlX3JlZ3gobGNkX3BhdGNoX3JlZywgcmVnX251bSk7CisKKwkJLyogSC5XLiBSZXNldCA6IE9GRiAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjE3LCBWSUFDUiwgMHg4MCwgQklUNyk7CisKKwkJLyogUmVzZXQgUExMICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSNDAsIFZJQVNSLCAweDAyLCBCSVQxKTsKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I0MCwgVklBU1IsIDB4MDAsIEJJVDEpOworCisJCS8qIEZpcmUhICovCisJCW91dGIoaW5iKFZJQVJNaXNjKSB8IChCSVQyICsgQklUMyksIFZJQVdNaXNjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfbGNkX3A4ODBfcGF0Y2hfdGJsKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLAorCWludCBwYW5lbF9pZCkKK3sKKwlpbnQgdm1vZGVfaW5kZXg7CisJaW50IHJlZ19udW0gPSAwOworCXN0cnVjdCBpb19yZWcgKmxjZF9wYXRjaF9yZWcgPSBOVUxMOworCisJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKQorCQl2bW9kZV9pbmRleCA9IHZpYWZiX2dldF9tb2RlX2luZGV4KHNldF9ocmVzLCBzZXRfdnJlcywgMSk7CisJZWxzZQorCQl2bW9kZV9pbmRleCA9IHZpYWZiX2dldF9tb2RlX2luZGV4KHNldF9ocmVzLCBzZXRfdnJlcywgMCk7CisKKwlzd2l0Y2ggKHBhbmVsX2lkKSB7CisJY2FzZSBMQ0RfUEFORUxfSUQ1XzE0MDBYMTA1MDoKKwkJc3dpdGNoICh2bW9kZV9pbmRleCkgeworCQljYXNlIFZJQV9SRVNfNjQwWDQ4MDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzZYNF8xNFgxMDsKKwkJCWxjZF9wYXRjaF9yZWcgPSBQODgwX0xDRF9SRVNfNlg0XzE0WDEwOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU184MDBYNjAwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9QODgwX0xDRF9SRVNfOFg2XzE0WDEwOworCQkJbGNkX3BhdGNoX3JlZyA9IFA4ODBfTENEX1JFU184WDZfMTRYMTA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIExDRF9QQU5FTF9JRDZfMTYwMFgxMjAwOgorCQlzd2l0Y2ggKHZtb2RlX2luZGV4KSB7CisJCWNhc2UgVklBX1JFU182NDBYNDAwOgorCQljYXNlIFZJQV9SRVNfNjQwWDQ4MDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzZYNF8xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBQODgwX0xDRF9SRVNfNlg0XzE2WDEyOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU183MjBYNDgwOgorCQljYXNlIFZJQV9SRVNfNzIwWDU3NjoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzdYNF8xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBQODgwX0xDRF9SRVNfN1g0XzE2WDEyOworCQkJYnJlYWs7CisJCWNhc2UgVklBX1JFU184MDBYNjAwOgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9QODgwX0xDRF9SRVNfOFg2XzE2WDEyOworCQkJbGNkX3BhdGNoX3JlZyA9IFA4ODBfTENEX1JFU184WDZfMTZYMTI7CisJCQlicmVhazsKKwkJY2FzZSBWSUFfUkVTXzEwMjRYNzY4OgorCQkJcmVnX251bSA9IE5VTV9UT1RBTF9QODgwX0xDRF9SRVNfMTBYN18xNlgxMjsKKwkJCWxjZF9wYXRjaF9yZWcgPSBQODgwX0xDRF9SRVNfMTBYN18xNlgxMjsKKwkJCWJyZWFrOworCQljYXNlIFZJQV9SRVNfMTI4MFg3Njg6CisJCWNhc2UgVklBX1JFU18xMjgwWDk2MDoKKwkJY2FzZSBWSUFfUkVTXzEyODBYMTAyNDoKKwkJCXJlZ19udW0gPSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzEyWDEwXzE2WDEyOworCQkJbGNkX3BhdGNoX3JlZyA9IFA4ODBfTENEX1JFU18xMlgxMF8xNlgxMjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJfQorCWlmIChyZWdfbnVtICE9IDApIHsKKwkJLyogSC5XLiBSZXNldCA6IE9OICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTcsIFZJQUNSLCAweDAwLCBCSVQ3KTsKKworCQl2aWFmYl93cml0ZV9yZWd4KGxjZF9wYXRjaF9yZWcsIHJlZ19udW0pOworCisJCS8qIEguVy4gUmVzZXQgOiBPRkYgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IxNywgVklBQ1IsIDB4ODAsIEJJVDcpOworCisJCS8qIFJlc2V0IFBMTCAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjQwLCBWSUFTUiwgMHgwMiwgQklUMSk7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSNDAsIFZJQVNSLCAweDAwLCBCSVQxKTsKKworCQkvKiBGaXJlISAqLworCQlvdXRiKGluYihWSUFSTWlzYykgfCAoQklUMiArIEJJVDMpLCBWSUFXTWlzYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2FkX2xjZF9wYXRjaF9yZWdzKGludCBzZXRfaHJlcywgaW50IHNldF92cmVzLAorCWludCBwYW5lbF9pZCwgaW50IHNldF9pZ2EpCit7CisJaW50IHZtb2RlX2luZGV4OworCisJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKQorCQl2bW9kZV9pbmRleCA9IHZpYWZiX2dldF9tb2RlX2luZGV4KHNldF9ocmVzLCBzZXRfdnJlcywgMSk7CisJZWxzZQorCQl2bW9kZV9pbmRleCA9IHZpYWZiX2dldF9tb2RlX2luZGV4KHNldF9ocmVzLCBzZXRfdnJlcywgMCk7CisKKwl2aWFmYl91bmxvY2tfY3J0KCk7CisKKwkvKiBQYXRjaCBmb3Igc2ltdWx0YW5lb3VzICYgRXhwYW5zaW9uICovCisJaWYgKChzZXRfaWdhID09IElHQTFfSUdBMikgJiYKKwkJKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9PQorCSAgICBMQ0RfRVhQQU5EU0lPTikpIHsKKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfQ0xFMjY2OgorCQljYXNlIFVOSUNIUk9NRV9LNDAwOgorCQkJbG9hZF9sY2RfazQwMF9wYXRjaF90Ymwoc2V0X2hyZXMsIHNldF92cmVzLCBwYW5lbF9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBVTklDSFJPTUVfSzgwMDoKKwkJCWJyZWFrOworCQljYXNlIFVOSUNIUk9NRV9QTTgwMDoKKwkJY2FzZSBVTklDSFJPTUVfQ043MDA6CisJCWNhc2UgVU5JQ0hST01FX0NYNzAwOgorCQkJbG9hZF9sY2RfcDg4MF9wYXRjaF90Ymwoc2V0X2hyZXMsIHNldF92cmVzLCBwYW5lbF9pZCk7CisJCX0KKwl9CisKKwl2aWFmYl9sb2NrX2NydCgpOworfQorCitzdGF0aWMgdm9pZCB2aWFfcGl0Y2hfYWxpZ25tZW50X3BhdGNoX2xjZCgKKwlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJICAgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbgorCQkJCSAgICpwbHZkc19jaGlwX2luZm8pCit7CisJdW5zaWduZWQgY2hhciBjcjEzLCBjcjM1LCBjcjY1LCBjcjY2LCBjcjY3OworCXVuc2lnbmVkIGxvbmcgZHdTY3JlZW5QaXRjaCA9IDA7CisJdW5zaWduZWQgbG9uZyBkd1BpdGNoOworCisJZHdQaXRjaCA9IHBsdmRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUgKiAocGx2ZHNfc2V0dGluZ19pbmZvLT5icHAgPj4gMyk7CisJaWYgKGR3UGl0Y2ggJiAweDFGKSB7CisJCWR3U2NyZWVuUGl0Y2ggPSAoKGR3UGl0Y2ggKyAzMSkgJiB+MzEpID4+IDM7CisJCWlmIChwbHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID09IElHQTIpIHsKKwkJCWlmIChwbHZkc19zZXR0aW5nX2luZm8tPmJwcCA+IDgpIHsKKwkJCQljcjY2ID0gKHVuc2lnbmVkIGNoYXIpKGR3U2NyZWVuUGl0Y2ggJiAweEZGKTsKKwkJCQl2aWFmYl93cml0ZV9yZWcoQ1I2NiwgVklBQ1IsIGNyNjYpOworCQkJCWNyNjcgPSB2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I2NykgJiAweEZDOworCQkJCWNyNjcgfD0KKwkJCQkgICAgKHVuc2lnbmVkCisJCQkJICAgICBjaGFyKSgoZHdTY3JlZW5QaXRjaCAmIDB4MzAwKSA+PiA4KTsKKwkJCQl2aWFmYl93cml0ZV9yZWcoQ1I2NywgVklBQ1IsIGNyNjcpOworCQkJfQorCisJCQkvKiBGZXRjaCBDb3VudCAqLworCQkJY3I2NyA9IHZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjY3KSAmIDB4RjM7CisJCQljcjY3IHw9ICh1bnNpZ25lZCBjaGFyKSgoZHdTY3JlZW5QaXRjaCAmIDB4NjAwKSA+PiA3KTsKKwkJCXZpYWZiX3dyaXRlX3JlZyhDUjY3LCBWSUFDUiwgY3I2Nyk7CisJCQljcjY1ID0gKHVuc2lnbmVkIGNoYXIpKChkd1NjcmVlblBpdGNoID4+IDEpICYgMHhGRik7CisJCQljcjY1ICs9IDI7CisJCQl2aWFmYl93cml0ZV9yZWcoQ1I2NSwgVklBQ1IsIGNyNjUpOworCQl9IGVsc2UgeworCQkJaWYgKHBsdmRzX3NldHRpbmdfaW5mby0+YnBwID4gOCkgeworCQkJCWNyMTMgPSAodW5zaWduZWQgY2hhcikoZHdTY3JlZW5QaXRjaCAmIDB4RkYpOworCQkJCXZpYWZiX3dyaXRlX3JlZyhDUjEzLCBWSUFDUiwgY3IxMyk7CisJCQkJY3IzNSA9IHZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjM1KSAmIDB4MUY7CisJCQkJY3IzNSB8PQorCQkJCSAgICAodW5zaWduZWQKKwkJCQkgICAgIGNoYXIpKChkd1NjcmVlblBpdGNoICYgMHg3MDApID4+IDMpOworCQkJCXZpYWZiX3dyaXRlX3JlZyhDUjM1LCBWSUFDUiwgY3IzNSk7CisJCQl9CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBsY2RfcGF0Y2hfc2tld19kdnAwKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpZiAoVlQxNjM2X0xWRFMgPT0gcGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfbmFtZSkgeworCQlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCQl2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzNjQocGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCQkJICAgIHBsdmRzX2NoaXBfaW5mbyk7CisJCQlicmVhazsKKwkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQkJdmlhZmJfdnQxNjM2X3BhdGNoX3NrZXdfb25fdnQzMzI3KHBsdmRzX3NldHRpbmdfaW5mbywKKwkJCQkJCSAgICBwbHZkc19jaGlwX2luZm8pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZCBsY2RfcGF0Y2hfc2tld19kdnAxKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpZiAoVlQxNjM2X0xWRFMgPT0gcGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfbmFtZSkgeworCQlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQljYXNlIFVOSUNIUk9NRV9DWDcwMDoKKwkJCXZpYWZiX3Z0MTYzNl9wYXRjaF9za2V3X29uX3Z0MzMyNChwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJCQkgICAgcGx2ZHNfY2hpcF9pbmZvKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgbGNkX3BhdGNoX3NrZXcoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCSpwbHZkc19zZXR0aW5nX2luZm8sIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlERUJVR19NU0coS0VSTl9JTkZPICJsY2RfcGF0Y2hfc2tld1xuIik7CisJc3dpdGNoIChwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpIHsKKwljYXNlIElOVEVSRkFDRV9EVlAwOgorCQlsY2RfcGF0Y2hfc2tld19kdnAwKHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBJTlRFUkZBQ0VfRFZQMToKKwkJbGNkX3BhdGNoX3NrZXdfZHZwMShwbHZkc19zZXR0aW5nX2luZm8sIHBsdmRzX2NoaXBfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgSU5URVJGQUNFX0RGUF9MT1c6CisJCWlmIChVTklDSFJPTUVfUDRNOTAwID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MDgsCisJCQkJICAgICAgIEJJVDAgKyBCSVQxICsgQklUMiArIEJJVDMpOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyogTENEIFNldCBNb2RlICovCit2b2lkIHZpYWZiX2xjZF9zZXRfbW9kZShzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKm1vZGVfY3J0X3RhYmxlLAorCQkgIHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKKwkJICBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit7CisJaW50IHZpZGVvX2luZGV4ID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfc2l6ZTsKKwlpbnQgc2V0X2lnYSA9IHBsdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGg7CisJaW50IG1vZGVfYnBwID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5icHA7CisJaW50IHZpYWZiX2xvYWRfcmVnX251bSA9IDA7CisJaW50IHJlZ192YWx1ZSA9IDA7CisJaW50IHNldF9ocmVzLCBzZXRfdnJlczsKKwlpbnQgcGFuZWxfaHJlcywgcGFuZWxfdnJlczsKKwl1MzIgcGxsX0RfTjsKKwlpbnQgb2Zmc2V0OworCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgbW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnOworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqcGFuZWxfY3J0X3RhYmxlID0gTlVMTDsKKwlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibCA9IE5VTEw7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9sY2Rfc2V0X21vZGUhIVxuIik7CisJLyogR2V0IG1vZGUgdGFibGUgKi8KKwltb2RlX2NydF9yZWcgPSBtb2RlX2NydF90YWJsZS0+Y3J0YzsKKwkvKiBHZXQgcGFuZWwgdGFibGUgUG9pbnRlciAqLworCXZtb2RlX3RibCA9IHZpYWZiX2dldF9tb2RldGJsX3BvaW50ZXIodmlkZW9faW5kZXgpOworCXBhbmVsX2NydF90YWJsZSA9IHZtb2RlX3RibC0+Y3J0YzsKKwlwYW5lbF9jcnRfcmVnID0gcGFuZWxfY3J0X3RhYmxlLT5jcnRjOworCURFQlVHX01TRyhLRVJOX0lORk8gImJlbGxvdyB2aWFmYl9sY2Rfc2V0X21vZGUhIVxuIik7CisJc2V0X2hyZXMgPSBwbHZkc19zZXR0aW5nX2luZm8tPmhfYWN0aXZlOworCXNldF92cmVzID0gcGx2ZHNfc2V0dGluZ19pbmZvLT52X2FjdGl2ZTsKKwlwYW5lbF9ocmVzID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfaHJlczsKKwlwYW5lbF92cmVzID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfdnJlczsKKwlpZiAoVlQxNjM2X0xWRFMgPT0gcGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfbmFtZSkKKwkJdmlhZmJfaW5pdF9sdmRzX3Z0MTYzNihwbHZkc19zZXR0aW5nX2luZm8sIHBsdmRzX2NoaXBfaW5mbyk7CisJcGx2ZHNfc2V0dGluZ19pbmZvLT52Y2xrID0gcGFuZWxfY3J0X3RhYmxlLT5jbGs7CisJaWYgKHNldF9pZ2EgPT0gSUdBMSkgeworCQkvKiBJR0ExIGRvZXNuJ3QgaGF2ZSBMQ0Qgc2NhbGluZywgc28gc2V0IGl0IGFzIGNlbnRlcmluZy4gKi8KKwkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhsY2RfY2VudGVyaW5nX3RpbWdpbmcKKwkJCQkgKG1vZGVfY3J0X3JlZywgcGFuZWxfY3J0X3JlZyksIElHQTEpOworCX0gZWxzZSB7CisJCS8qIEV4cGFuc2lvbiAqLworCQlpZiAoKHBsdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPT0KKwkJICAgICBMQ0RfRVhQQU5EU0lPTikgJiAoKHNldF9ocmVzICE9IHBhbmVsX2hyZXMpCisJCQkJCXx8IChzZXRfdnJlcyAhPSBwYW5lbF92cmVzKSkpIHsKKwkJCS8qIGV4cGFuc2lvbiB0aW1pbmcgSUdBMiBsb2FkZWQgcGFuZWwgc2V0IHRpbWluZyovCisJCQl2aWFmYl9sb2FkX2NydGNfdGltaW5nKHBhbmVsX2NydF9yZWcsIElHQTIpOworCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfbG9hZF9jcnRjX3RpbWluZyEhXG4iKTsKKwkJCWxvYWRfbGNkX3NjYWxpbmcoc2V0X2hyZXMsIHNldF92cmVzLCBwYW5lbF9ocmVzLAorCQkJCQkgcGFuZWxfdnJlcyk7CisJCQlERUJVR19NU0coS0VSTl9JTkZPICJsb2FkX2xjZF9zY2FsaW5nISFcbiIpOworCQl9IGVsc2UgewkvKiBDZW50ZXJpbmcgKi8KKwkJCS8qIGNlbnRlcmluZyB0aW1pbmcgSUdBMiBhbHdheXMgbG9hZGVkIHBhbmVsCisJCQkgICBhbmQgbW9kZSByZWxlYXRpdmUgdGltaW5nICovCisJCQl2aWFmYl9sb2FkX2NydGNfdGltaW5nKGxjZF9jZW50ZXJpbmdfdGltZ2luZworCQkJCQkgKG1vZGVfY3J0X3JlZywgcGFuZWxfY3J0X3JlZyksIElHQTIpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I3OSwgVklBQ1IsIDB4MDAsCisJCQkJQklUMCArIEJJVDEgKyBCSVQyKTsKKwkJCS8qIExDRCBzY2FsaW5nIGRpc2FibGVkICovCisJCX0KKwl9CisKKwlpZiAoc2V0X2lnYSA9PSBJR0ExX0lHQTIpIHsKKwkJbG9hZF9jcnRjX3NoYWRvd190aW1pbmcobW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnKTsKKwkJLyogRmlsbCBzaGFkb3cgcmVnaXN0ZXJzICovCisKKwkJc3dpdGNoIChwbHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCkgeworCQljYXNlIExDRF9QQU5FTF9JRDBfNjQwWDQ4MDoKKwkJCW9mZnNldCA9IDgwOworCQkJYnJlYWs7CisJCWNhc2UgTENEX1BBTkVMX0lEMV84MDBYNjAwOgorCQljYXNlIExDRF9QQU5FTF9JREFfODAwWDQ4MDoKKwkJCW9mZnNldCA9IDExMDsKKwkJCWJyZWFrOworCQljYXNlIExDRF9QQU5FTF9JRDJfMTAyNFg3Njg6CisJCQlvZmZzZXQgPSAxNTA7CisJCQlicmVhazsKKwkJY2FzZSBMQ0RfUEFORUxfSUQzXzEyODBYNzY4OgorCQljYXNlIExDRF9QQU5FTF9JRDRfMTI4MFgxMDI0OgorCQljYXNlIExDRF9QQU5FTF9JRDVfMTQwMFgxMDUwOgorCQljYXNlIExDRF9QQU5FTF9JRDlfMTI4MFg4MDA6CisJCQlvZmZzZXQgPSAxOTA7CisJCQlicmVhazsKKwkJY2FzZSBMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMDoKKwkJCW9mZnNldCA9IDI1MDsKKwkJCWJyZWFrOworCQljYXNlIExDRF9QQU5FTF9JRDdfMTM2Nlg3Njg6CisJCWNhc2UgTENEX1BBTkVMX0lEQl8xMzYwWDc2ODoKKwkJCW9mZnNldCA9IDIxMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb2Zmc2V0ID0gMTQwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPZmZzZXQgZm9yIHNpbXVsdGFuZW91cyAqLworCQlyZWdfdmFsdWUgPSBvZmZzZXQ7CisJCXZpYWZiX2xvYWRfcmVnX251bSA9IG9mZnNldF9yZWcuaWdhMl9vZmZzZXRfcmVnLnJlZ19udW07CisJCXJlZyA9IG9mZnNldF9yZWcuaWdhMl9vZmZzZXRfcmVnLnJlZzsKKwkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOworCQlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9sb2FkX3JlZyEhXG4iKTsKKwkJdmlhZmJfbG9hZF9mZXRjaF9jb3VudF9yZWcoc2V0X2hyZXMsIDQsIElHQTIpOworCQkvKiBGZXRjaCBjb3VudCBmb3Igc2ltdWx0YW5lb3VzICovCisJfSBlbHNlIHsJCS8qIFNBTU0gKi8KKwkJLyogT2Zmc2V0IGZvciBJR0EyIG9ubHkgKi8KKwkJdmlhZmJfbG9hZF9vZmZzZXRfcmVnKHNldF9ocmVzLCBtb2RlX2JwcCAvIDgsIHNldF9pZ2EpOworCQkvKiBGZXRjaCBjb3VudCBmb3IgSUdBMiBvbmx5ICovCisJCXZpYWZiX2xvYWRfZmV0Y2hfY291bnRfcmVnKHNldF9ocmVzLCBtb2RlX2JwcCAvIDgsIHNldF9pZ2EpOworCisJCWlmICgodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICE9IFVOSUNIUk9NRV9DTEUyNjYpCisJCSAgICAmJiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICE9IFVOSUNIUk9NRV9LNDAwKSkKKwkJCXZpYWZiX2xvYWRfRklGT19yZWcoc2V0X2lnYSwgc2V0X2hyZXMsIHNldF92cmVzKTsKKworCQl2aWFmYl9zZXRfY29sb3JfZGVwdGgobW9kZV9icHAgLyA4LCBzZXRfaWdhKTsKKwl9CisKKwlmaWxsX2xjZF9mb3JtYXQoKTsKKworCXBsbF9EX04gPSB2aWFmYl9nZXRfY2xrX3ZhbHVlKHBhbmVsX2NydF90YWJsZVswXS5jbGspOworCURFQlVHX01TRyhLRVJOX0lORk8gIlBMTD0weCV4IiwgcGxsX0RfTik7CisJdmlhZmJfc2V0X3ZjbG9jayhwbGxfRF9OLCBzZXRfaWdhKTsKKworCXZpYWZiX3NldF9vdXRwdXRfcGF0aChERVZJQ0VfTENELCBzZXRfaWdhLAorCQlwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpOworCWxjZF9wYXRjaF9za2V3KHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvKTsKKworCS8qIElmIEs4TTgwMCwgZW5hYmxlIExDRCBQcmVmZXRjaCBNb2RlLiAqLworCWlmICgodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9LODAwKQorCSAgICB8fCAoVU5JQ0hST01FX0s4TTg5MCA9PSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpKQorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwMSwgQklUMCk7CisKKwlsb2FkX2xjZF9wYXRjaF9yZWdzKHNldF9ocmVzLCBzZXRfdnJlcywKKwkJCSAgICBwbHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9pZCwgc2V0X2lnYSk7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJsb2FkX2xjZF9wYXRjaF9yZWdzISFcbiIpOworCisJLyogUGF0Y2ggZm9yIG5vbiAzMmJpdCBhbGlnbm1lbnQgbW9kZSAqLworCXZpYV9waXRjaF9hbGlnbm1lbnRfcGF0Y2hfbGNkKHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWdyYXRlZF9sdmRzX2Rpc2FibGUoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJICAgICAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJICAgICBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit7CisJYm9vbCB0dXJuX29mZl9maXJzdF9wb3dlcnNlcXVlbmNlID0gZmFsc2U7CisJYm9vbCB0dXJuX29mZl9zZWNvbmRfcG93ZXJzZXF1ZW5jZSA9IGZhbHNlOworCWlmIChJTlRFUkZBQ0VfTFZEUzBMVkRTMSA9PSBwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpCisJCXR1cm5fb2ZmX2ZpcnN0X3Bvd2Vyc2VxdWVuY2UgPSB0cnVlOworCWlmIChJTlRFUkZBQ0VfTFZEUzAgPT0gcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlKQorCQl0dXJuX29mZl9maXJzdF9wb3dlcnNlcXVlbmNlID0gdHJ1ZTsKKwlpZiAoSU5URVJGQUNFX0xWRFMxID09IHBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSkKKwkJdHVybl9vZmZfc2Vjb25kX3Bvd2Vyc2VxdWVuY2UgPSB0cnVlOworCWlmICh0dXJuX29mZl9zZWNvbmRfcG93ZXJzZXF1ZW5jZSkgeworCQkvKiBVc2Ugc2Vjb25kIHBvd2VyIHNlcXVlbmNlIGNvbnRyb2w6ICovCisKKwkJLyogVHVybiBvZmYgcG93ZXIgc2VxdWVuY2UuICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDQsIFZJQUNSLCAwLCBCSVQxKTsKKworCQkvKiBUdXJuIG9mZiBiYWNrIGxpZ2h0LiAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQzLCBWSUFDUiwgMHhDMCwgQklUNiArIEJJVDcpOworCX0KKwlpZiAodHVybl9vZmZfZmlyc3RfcG93ZXJzZXF1ZW5jZSkgeworCQkvKiBVc2UgZmlyc3QgcG93ZXIgc2VxdWVuY2UgY29udHJvbDogKi8KKworCQkvKiBUdXJuIG9mZiBwb3dlciBzZXF1ZW5jZS4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDAsIEJJVDMpOworCisJCS8qIFR1cm4gb2ZmIGJhY2sgbGlnaHQuICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTEsIFZJQUNSLCAweEMwLCBCSVQ2ICsgQklUNyk7CisJfQorCisJLyogVHVybiBERlAgSGlnaC9Mb3cgUGFkIG9mZi4gKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMCwgQklUMCArIEJJVDEgKyBCSVQyICsgQklUMyk7CisKKwkvKiBQb3dlciBvZmYgTFZEUyBjaGFubmVsLiAqLworCXN3aXRjaCAocGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlKSB7CisJY2FzZSBJTlRFUkZBQ0VfTFZEUzA6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDIsIFZJQUNSLCAweDgwLCBCSVQ3KTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIElOVEVSRkFDRV9MVkRTMToKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4NDAsIEJJVDYpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSU5URVJGQUNFX0xWRFMwTFZEUzE6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDIsIFZJQUNSLCAweEMwLCBCSVQ2ICsgQklUNyk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW50ZWdyYXRlZF9sdmRzX2VuYWJsZShzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkgICAgKnBsdmRzX3NldHRpbmdfaW5mbywKKwkJCSAgICBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit7CisJYm9vbCB0dXJuX29uX2ZpcnN0X3Bvd2Vyc2VxdWVuY2UgPSBmYWxzZTsKKwlib29sIHR1cm5fb25fc2Vjb25kX3Bvd2Vyc2VxdWVuY2UgPSBmYWxzZTsKKworCURFQlVHX01TRyhLRVJOX0lORk8gImludGVncmF0ZWRfbHZkc19lbmFibGUsIG91dF9pbnRlcmZhY2U6JWRcbiIsCisJCSAgcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlKTsKKwlpZiAocGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfbW9kZSA9PSBMQ0RfU1BXRykKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1JEMiwgVklBQ1IsIDB4MDAsIEJJVDAgKyBCSVQxKTsKKwkgZWxzZQorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQyLCBWSUFDUiwgMHgwMywgQklUMCArIEJJVDEpOworCWlmIChJTlRFUkZBQ0VfTFZEUzBMVkRTMSA9PSBwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpCisJCXR1cm5fb25fZmlyc3RfcG93ZXJzZXF1ZW5jZSA9IHRydWU7CisJaWYgKElOVEVSRkFDRV9MVkRTMCA9PSBwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpCisJCXR1cm5fb25fZmlyc3RfcG93ZXJzZXF1ZW5jZSA9IHRydWU7CisJaWYgKElOVEVSRkFDRV9MVkRTMSA9PSBwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UpCisJCXR1cm5fb25fc2Vjb25kX3Bvd2Vyc2VxdWVuY2UgPSB0cnVlOworCisJaWYgKHR1cm5fb25fc2Vjb25kX3Bvd2Vyc2VxdWVuY2UpIHsKKwkJLyogVXNlIHNlY29uZCBwb3dlciBzZXF1ZW5jZSBjb250cm9sOiAqLworCisJCS8qIFVzZSBoYXJkd2FyZSBjb250cm9sIHBvd2VyIHNlcXVlbmNlLiAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQzLCBWSUFDUiwgMCwgQklUMCk7CisKKwkJLyogVHVybiBvbiBiYWNrIGxpZ2h0LiAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQzLCBWSUFDUiwgMCwgQklUNiArIEJJVDcpOworCisJCS8qIFR1cm4gb24gaGFyZHdhcmUgcG93ZXIgc2VxdWVuY2UuICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDQsIFZJQUNSLCAweDAyLCBCSVQxKTsKKwl9CisJaWYgKHR1cm5fb25fZmlyc3RfcG93ZXJzZXF1ZW5jZSkgeworCQkvKiBVc2UgZmlyc3QgcG93ZXIgc2VxdWVuY2UgY29udHJvbDogKi8KKworCQkvKiBVc2UgaGFyZHdhcmUgY29udHJvbCBwb3dlciBzZXF1ZW5jZS4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5MSwgVklBQ1IsIDAsIEJJVDApOworCisJCS8qIFR1cm4gb24gYmFjayBsaWdodC4gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5MSwgVklBQ1IsIDAsIEJJVDYgKyBCSVQ3KTsKKworCQkvKiBUdXJuIG9uIGhhcmR3YXJlIHBvd2VyIHNlcXVlbmNlLiAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwOCwgQklUMyk7CisJfQorCisJLyogVHVybiBERlAgSGlnaC9Mb3cgcGFkIG9uLiAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLCAweDBGLCBCSVQwICsgQklUMSArIEJJVDIgKyBCSVQzKTsKKworCS8qIFBvd2VyIG9uIExWRFMgY2hhbm5lbC4gKi8KKwlzd2l0Y2ggKHBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSkgeworCWNhc2UgSU5URVJGQUNFX0xWRFMwOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQyLCBWSUFDUiwgMCwgQklUNyk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJTlRFUkZBQ0VfTFZEUzE6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSRDIsIFZJQUNSLCAwLCBCSVQ2KTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIElOVEVSRkFDRV9MVkRTMExWRFMxOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkQyLCBWSUFDUiwgMCwgQklUNiArIEJJVDcpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgdmlhZmJfbGNkX2Rpc2FibGUodm9pZCkKK3sKKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NMRTI2NikgeworCQlsY2RfcG93ZXJzZXF1ZW5jZV9vZmYoKTsKKwkJLyogREkxIHBhZCBvZmYgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxRSwgVklBU1IsIDB4MDAsIDB4MzApOworCX0gZWxzZSBpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DWDcwMCkgeworCQlpZiAodmlhZmJfTENEMl9PTgorCQkgICAgJiYgKElOVEVHUkFURURfTFZEUyA9PQorCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIubHZkc19jaGlwX25hbWUpKQorCQkJaW50ZWdyYXRlZF9sdmRzX2Rpc2FibGUodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCQkJJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yKTsKKwkJaWYgKElOVEVHUkFURURfTFZEUyA9PQorCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSkKKwkJCWludGVncmF0ZWRfbHZkc19kaXNhYmxlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKKwkJaWYgKFZUMTYzNl9MVkRTID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCQlsdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSkKKwkJCXZpYWZiX2Rpc2FibGVfbHZkc192dDE2MzYodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCQkJJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCX0gZWxzZSBpZiAoVlQxNjM2X0xWRFMgPT0KKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lKSB7CisJCXZpYWZiX2Rpc2FibGVfbHZkc192dDE2MzYodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCQkJICAgICZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKKwl9IGVsc2UgeworCQkvKiBERlAtSEwgcGFkIG9mZiAgICAgICAgICAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMHgwMCwgMHgwRik7CisJCS8qIEJhY2tsaWdodCBvZmYgICAgICAgICAgICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSM0QsIFZJQVNSLCAweDAwLCAweDIwKTsKKwkJLyogMjQgYml0IERJIGRhdGEgcGFodCBvZmYgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5MSwgVklBQ1IsIDB4ODAsIDB4ODApOworCQkvKiBTaW11bHRhbmVvdXQgZGlzYWJsZWQgICAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZCLCBWSUFDUiwgMHgwMCwgMHgwOCk7CisJfQorCisJLyogRGlzYWJsZSBleHBhbnNpb24gYml0ICAgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjc5LCBWSUFDUiwgMHgwMCwgMHgwMSk7CisJLyogQ1JUIHBhdGggc2V0IHRvIElHQTEgICAgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjE2LCBWSUFTUiwgMHgwMCwgMHg0MCk7CisJLyogU2ltdWx0YW5lb3V0IGRpc2FibGVkICAgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZCLCBWSUFDUiwgMHgwMCwgMHgwOCk7CisJLyogSUdBMiBwYXRoIGRpc2FibGVkICAgICAgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwMCwgMHg4MCk7CisKK30KKwordm9pZCB2aWFmYl9sY2RfZW5hYmxlKHZvaWQpCit7CisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfQ0xFMjY2KSB7CisJCS8qIERJMSBwYWQgb24gKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxRSwgVklBU1IsIDB4MzAsIDB4MzApOworCQlsY2RfcG93ZXJzZXF1ZW5jZV9vbigpOworCX0gZWxzZSBpZiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DWDcwMCkgeworCQlpZiAodmlhZmJfTENEMl9PTiAmJiAoSU5URUdSQVRFRF9MVkRTID09CisJCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMi5sdmRzX2NoaXBfbmFtZSkpCisJCQlpbnRlZ3JhdGVkX2x2ZHNfZW5hYmxlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMiwgXAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMik7CisJCWlmIChJTlRFR1JBVEVEX0xWRFMgPT0KKwkJCXZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUpCisJCQlpbnRlZ3JhdGVkX2x2ZHNfZW5hYmxlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKKwkJaWYgKFZUMTYzNl9MVkRTID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+CisJCQlsdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSkKKwkJCXZpYWZiX2VuYWJsZV9sdmRzX3Z0MTYzNih2aWFwYXJpbmZvLT4KKwkJCWx2ZHNfc2V0dGluZ19pbmZvLCAmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT4KKwkJCWx2ZHNfY2hpcF9pbmZvKTsKKwl9IGVsc2UgaWYgKFZUMTYzNl9MVkRTID09CisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSkgeworCQl2aWFmYl9lbmFibGVfbHZkc192dDE2MzYodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCQkJICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCX0gZWxzZSB7CisJCS8qIERGUC1ITCBwYWQgb24gICAgICAgICAgICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMkEsIFZJQVNSLCAweDBGLCAweDBGKTsKKwkJLyogQmFja2xpZ2h0IG9uICAgICAgICAgICAgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IzRCwgVklBU1IsIDB4MjAsIDB4MjApOworCQkvKiAyNCBiaXQgREkgZGF0YSBwYWh0IG9uICAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjkxLCBWSUFDUiwgMHgwMCwgMHg4MCk7CisKKwkJLyogU2V0IGRhdGEgc291cmNlIHNlbGVjdGlvbiBiaXQgYnkgaWdhIHBhdGggKi8KKwkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0ExKSB7CisJCQkvKiBERlAtSCBzZXQgdG8gSUdBMSAgICAgICAqLworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIDB4MDAsIDB4MTApOworCQkJLyogREZQLUwgc2V0IHRvIElHQTEgICAgICAgKi8KKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCAweDAwLCAweDEwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERGUC1IIHNldCB0byBJR0EyICAgICAgICovCisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk3LCBWSUFDUiwgMHgxMCwgMHgxMCk7CisJCQkvKiBERlAtTCBzZXQgdG8gSUdBMiAgICAgICAqLworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5OSwgVklBQ1IsIDB4MTAsIDB4MTApOworCQl9CisJCS8qIExDRCBlbmFibGVkICAgICAgICAgICAgICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAweDQ4LCAweDQ4KTsKKwl9CisKKwlpZiAoKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0ExKQorCSAgICB8fCAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoID09IElHQTFfSUdBMikpIHsKKwkJLyogQ1JUIHBhdGggc2V0IHRvIElHQTIgICAgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxNiwgVklBU1IsIDB4NDAsIDB4NDApOworCQkvKiBJR0EyIHBhdGggZGlzYWJsZWQgICAgICAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwMCwgMHg4MCk7CisJCS8qIElHQTIgcGF0aCBlbmFibGVkICAgICAgICovCisJfSBlbHNlIHsJCS8qIElHQTIgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDB4ODAsIDB4ODApOworCX0KKworfQorCitzdGF0aWMgdm9pZCBsY2RfcG93ZXJzZXF1ZW5jZV9vZmYodm9pZCkKK3sKKwlpbnQgaSwgbWFzaywgZGF0YTsKKworCS8qIFNvZnR3YXJlIGNvbnRyb2wgcG93ZXIgc2VxdWVuY2UgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjkxLCBWSUFDUiwgMHgxMSwgMHgxMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCW1hc2sgPSBQb3dlclNlcXVlbmNlT2ZmWzBdW2ldOworCQlkYXRhID0gUG93ZXJTZXF1ZW5jZU9mZlsxXVtpXSAmIG1hc2s7CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTEsIFZJQUNSLCAodTgpIGRhdGEsICh1OCkgbWFzayk7CisJCXVkZWxheShQb3dlclNlcXVlbmNlT2ZmWzJdW2ldKTsKKwl9CisKKwkvKiBEaXNhYmxlIExDRCAqLworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAweDAwLCAweDA4KTsKK30KKworc3RhdGljIHZvaWQgbGNkX3Bvd2Vyc2VxdWVuY2Vfb24odm9pZCkKK3sKKwlpbnQgaSwgbWFzaywgZGF0YTsKKworCS8qIFNvZnR3YXJlIGNvbnRyb2wgcG93ZXIgc2VxdWVuY2UgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjkxLCBWSUFDUiwgMHgxMSwgMHgxMSk7CisKKwkvKiBFbmFibGUgTENEICovCisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIDB4MDgsIDB4MDgpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQltYXNrID0gUG93ZXJTZXF1ZW5jZU9uWzBdW2ldOworCQlkYXRhID0gUG93ZXJTZXF1ZW5jZU9uWzFdW2ldICYgbWFzazsKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5MSwgVklBQ1IsICh1OCkgZGF0YSwgKHU4KSBtYXNrKTsKKwkJdWRlbGF5KFBvd2VyU2VxdWVuY2VPblsyXVtpXSk7CisJfQorCisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2xjZF9mb3JtYXQodm9pZCkKK3sKKwl1OCBiZGl0aGVyaW5nID0gMCwgYmR1YWwgPSAwOworCisJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlKQorCQliZHVhbCA9IEJJVDQ7CisJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5MQ0REaXRoZXJpbmcpCisJCWJkaXRoZXJpbmcgPSBCSVQwOworCS8qIER1YWwgJiBEaXRoZXJpbmcgKi8KKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjg4LCBWSUFDUiwgKGJkaXRoZXJpbmcgfCBiZHVhbCksIEJJVDQgKyBCSVQwKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZGlwb3J0X29mX2ludGVncmF0ZWRfbHZkcygKKwlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8sCisJCQkJICAgICBzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkJICAgICAqcGx2ZHNfc2V0dGluZ19pbmZvKQoreworCS8qIERldGVybWluZSBMQ0QgREkgUG9ydCBieSBoYXJkd2FyZSBsYXlvdXQuICovCisJc3dpdGNoICh2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCkgeworCWNhc2UgSFdfTEFZT1VUX0xDRF9PTkxZOgorCQl7CisJCQlpZiAocGx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlKSB7CisJCQkJcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlID0KKwkJCQkgICAgSU5URVJGQUNFX0xWRFMwTFZEUzE7CisJCQl9IGVsc2UgeworCQkJCXBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSA9CisJCQkJICAgIElOVEVSRkFDRV9MVkRTMDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSFdfTEFZT1VUX0RWSV9PTkxZOgorCQl7CisJCQlwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfTk9ORTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEhXX0xBWU9VVF9MQ0QxX0xDRDI6CisJY2FzZSBIV19MQVlPVVRfTENEX0VYVEVSTkFMX0xDRDI6CisJCXsKKwkJCXBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSA9CisJCQkgICAgSU5URVJGQUNFX0xWRFMwTFZEUzE7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBIV19MQVlPVVRfTENEX0RWSToKKwkJeworCQkJcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX0xWRFMxOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCXBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSA9IElOVEVSRkFDRV9MVkRTMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJREVCVUdfTVNHKEtFUk5fSU5GTworCQkgICJEaXNwbGF5IEhhcmR3YXJlIExheW91dDogMHgleCwgTENEIERJIFBvcnQ6IDB4JXhcbiIsCisJCSAgdmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQsCisJCSAgcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlKTsKK30KKwordm9pZCB2aWFmYl9pbml0X2x2ZHNfb3V0cHV0X2ludGVyZmFjZShzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCisJCQkJKnBsdmRzX2NoaXBfaW5mbywKKwkJCQlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkJKnBsdmRzX3NldHRpbmdfaW5mbykKK3sKKwlpZiAoSU5URVJGQUNFX05PTkUgIT0gcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlKSB7CisJCS8qRG8gbm90aGluZywgbGNkIHBvcnQgaXMgc3BlY2lmaWVkIGJ5IG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAocGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfbmFtZSkgeworCisJY2FzZSBWVDE2MzZfTFZEUzoKKwkJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJY2FzZSBVTklDSFJPTUVfQ1g3MDA6CisJCQlwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfRFZQMTsKKwkJCWJyZWFrOworCQljYXNlIFVOSUNIUk9NRV9DTjcwMDoKKwkJCXBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSA9IElOVEVSRkFDRV9ERlBfTE9XOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfRFZQMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJTlRFR1JBVEVEX0xWRFM6CisJCWNoZWNrX2RpcG9ydF9vZl9pbnRlZ3JhdGVkX2x2ZHMocGx2ZHNfY2hpcF9pbmZvLAorCQkJCQkJcGx2ZHNfc2V0dGluZ19pbmZvKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCQljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCQkJcGx2ZHNfY2hpcF9pbmZvLT5vdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX0RGUF9MT1c7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSA9IElOVEVSRkFDRV9ERlA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgbGNkX2NlbnRlcmluZ190aW1naW5nKHN0cnVjdCBkaXNwbGF5X3RpbWluZworCQkJCQkgICAgbW9kZV9jcnRfcmVnLAorCQkJCQkgICAgc3RydWN0IGRpc3BsYXlfdGltaW5nIHBhbmVsX2NydF9yZWcpCit7CisJc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydF9yZWc7CisKKwljcnRfcmVnLmhvcl90b3RhbCA9IHBhbmVsX2NydF9yZWcuaG9yX3RvdGFsOworCWNydF9yZWcuaG9yX2FkZHIgPSBtb2RlX2NydF9yZWcuaG9yX2FkZHI7CisJY3J0X3JlZy5ob3JfYmxhbmtfc3RhcnQgPQorCSAgICAocGFuZWxfY3J0X3JlZy5ob3JfYWRkciAtIG1vZGVfY3J0X3JlZy5ob3JfYWRkcikgLyAyICsKKwkgICAgY3J0X3JlZy5ob3JfYWRkcjsKKwljcnRfcmVnLmhvcl9ibGFua19lbmQgPSBwYW5lbF9jcnRfcmVnLmhvcl9ibGFua19lbmQ7CisJY3J0X3JlZy5ob3Jfc3luY19zdGFydCA9CisJICAgIChwYW5lbF9jcnRfcmVnLmhvcl9zeW5jX3N0YXJ0IC0KKwkgICAgIHBhbmVsX2NydF9yZWcuaG9yX2JsYW5rX3N0YXJ0KSArIGNydF9yZWcuaG9yX2JsYW5rX3N0YXJ0OworCWNydF9yZWcuaG9yX3N5bmNfZW5kID0gcGFuZWxfY3J0X3JlZy5ob3Jfc3luY19lbmQ7CisKKwljcnRfcmVnLnZlcl90b3RhbCA9IHBhbmVsX2NydF9yZWcudmVyX3RvdGFsOworCWNydF9yZWcudmVyX2FkZHIgPSBtb2RlX2NydF9yZWcudmVyX2FkZHI7CisJY3J0X3JlZy52ZXJfYmxhbmtfc3RhcnQgPQorCSAgICAocGFuZWxfY3J0X3JlZy52ZXJfYWRkciAtIG1vZGVfY3J0X3JlZy52ZXJfYWRkcikgLyAyICsKKwkgICAgY3J0X3JlZy52ZXJfYWRkcjsKKwljcnRfcmVnLnZlcl9ibGFua19lbmQgPSBwYW5lbF9jcnRfcmVnLnZlcl9ibGFua19lbmQ7CisJY3J0X3JlZy52ZXJfc3luY19zdGFydCA9CisJICAgIChwYW5lbF9jcnRfcmVnLnZlcl9zeW5jX3N0YXJ0IC0KKwkgICAgIHBhbmVsX2NydF9yZWcudmVyX2JsYW5rX3N0YXJ0KSArIGNydF9yZWcudmVyX2JsYW5rX3N0YXJ0OworCWNydF9yZWcudmVyX3N5bmNfZW5kID0gcGFuZWxfY3J0X3JlZy52ZXJfc3luY19lbmQ7CisKKwlyZXR1cm4gY3J0X3JlZzsKK30KKworc3RhdGljIHZvaWQgbG9hZF9jcnRjX3NoYWRvd190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIG1vZGVfdGltaW5nLAorCQkJICAgICBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgcGFuZWxfdGltaW5nKQoreworCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgdmlhZmJfbG9hZF9yZWdfTnVtID0gMDsKKwlpbnQgcmVnX3ZhbHVlID0gMDsKKworCWlmICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPT0gTENEX0VYUEFORFNJT04pIHsKKwkJLyogRXhwYW5zaW9uICovCisJCWZvciAoaSA9IDEyOyBpIDwgMjA7IGkrKykgeworCQkJc3dpdGNoIChpKSB7CisJCQljYXNlIEhfVE9UQUxfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfSE9SX1RPVEFMX1NIQURPV19GT1JNVUxBCisJCQkJICAgIChwYW5lbF90aW1pbmcuaG9yX3RvdGFsKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy5ob3JfdG90YWxfc2hhZG93LgorCQkJCSAgICByZWdfbnVtOworCQkJCXJlZyA9IGlnYTJfc2hhZG93X2NydGNfcmVnLmhvcl90b3RhbF9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBIX0JMQU5LX0VORF9TSEFET1dfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9IT1JfQkxBTktfRU5EX1NIQURPV19GT1JNVUxBCisJCQkJICAgIChwYW5lbF90aW1pbmcuaG9yX2JsYW5rX3N0YXJ0LAorCQkJCSAgICAgcGFuZWxfdGltaW5nLmhvcl9ibGFua19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLgorCQkJCSAgICBob3JfYmxhbmtfZW5kX3NoYWRvdy5yZWdfbnVtOworCQkJCXJlZyA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLgorCQkJCSAgICBob3JfYmxhbmtfZW5kX3NoYWRvdy5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfVE9UQUxfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX1RPVEFMX1NIQURPV19GT1JNVUxBCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX3RvdGFsKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy52ZXJfdG90YWxfc2hhZG93LgorCQkJCSAgICByZWdfbnVtOworCQkJCXJlZyA9IGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl90b3RhbF9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX0FERFJfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX0FERFJfU0hBRE9XX0ZPUk1VTEEKKwkJCQkgICAgKHBhbmVsX3RpbWluZy52ZXJfYWRkcik7CisJCQkJdmlhZmJfbG9hZF9yZWdfTnVtID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcudmVyX2FkZHJfc2hhZG93LgorCQkJCSAgICByZWdfbnVtOworCQkJCXJlZyA9IGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl9hZGRyX3NoYWRvdy5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfQkxBTktfU0FUUlRfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX0JMQU5LX1NUQVJUX1NIQURPV19GT1JNVUxBCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX3N0YXJ0X3NoYWRvdy5yZWdfbnVtOworCQkJCXJlZyA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLgorCQkJCSAgICB2ZXJfYmxhbmtfc3RhcnRfc2hhZG93LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9CTEFOS19FTkRfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX0JMQU5LX0VORF9TSEFET1dfRk9STVVMQQorCQkJCSAgICAocGFuZWxfdGltaW5nLnZlcl9ibGFua19zdGFydCwKKwkJCQkgICAgIHBhbmVsX3RpbWluZy52ZXJfYmxhbmtfZW5kKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX2VuZF9zaGFkb3cucmVnX251bTsKKwkJCQlyZWcgPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX2VuZF9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX1NZTkNfU0FUUlRfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX1NZTkNfU1RBUlRfU0hBRE9XX0ZPUk1VTEEKKwkJCQkgICAgKHBhbmVsX3RpbWluZy52ZXJfc3luY19zdGFydCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfTnVtID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcuCisJCQkJICAgIHZlcl9zeW5jX3N0YXJ0X3NoYWRvdy5yZWdfbnVtOworCQkJCXJlZyA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLgorCQkJCSAgICB2ZXJfc3luY19zdGFydF9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX1NZTkNfRU5EX1NIQURPV19JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9TWU5DX0VORF9TSEFET1dfRk9STVVMQQorCQkJCSAgICAocGFuZWxfdGltaW5nLnZlcl9zeW5jX3N0YXJ0LAorCQkJCSAgICAgcGFuZWxfdGltaW5nLnZlcl9zeW5jX2VuZCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfTnVtID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcuCisJCQkJICAgIHZlcl9zeW5jX2VuZF9zaGFkb3cucmVnX251bTsKKwkJCQlyZWcgPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX3N5bmNfZW5kX3NoYWRvdy5yZWc7CisJCQkJYnJlYWs7CisJCQl9CisJCQl2aWFmYl9sb2FkX3JlZyhyZWdfdmFsdWUsCisJCQkJdmlhZmJfbG9hZF9yZWdfTnVtLCByZWcsIFZJQUNSKTsKKwkJfQorCX0gZWxzZSB7CQkvKiBDZW50ZXJpbmcgKi8KKwkJZm9yIChpID0gMTI7IGkgPCAyMDsgaSsrKSB7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgSF9UT1RBTF9TSEFET1dfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9IT1JfVE9UQUxfU0hBRE9XX0ZPUk1VTEEKKwkJCQkgICAgKHBhbmVsX3RpbWluZy5ob3JfdG90YWwpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLmhvcl90b3RhbF9zaGFkb3cuCisJCQkJICAgIHJlZ19udW07CisJCQkJcmVnID0gaWdhMl9zaGFkb3dfY3J0Y19yZWcuaG9yX3RvdGFsX3NoYWRvdy5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhfQkxBTktfRU5EX1NIQURPV19JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX0hPUl9CTEFOS19FTkRfU0hBRE9XX0ZPUk1VTEEKKwkJCQkgICAgKHBhbmVsX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCisJCQkJICAgICBwYW5lbF90aW1pbmcuaG9yX2JsYW5rX2VuZCk7CisJCQkJdmlhZmJfbG9hZF9yZWdfTnVtID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcuCisJCQkJICAgIGhvcl9ibGFua19lbmRfc2hhZG93LnJlZ19udW07CisJCQkJcmVnID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcuCisJCQkJICAgIGhvcl9ibGFua19lbmRfc2hhZG93LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9UT1RBTF9TSEFET1dfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9WRVJfVE9UQUxfU0hBRE9XX0ZPUk1VTEEKKwkJCQkgICAgKHBhbmVsX3RpbWluZy52ZXJfdG90YWwpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl90b3RhbF9zaGFkb3cuCisJCQkJICAgIHJlZ19udW07CisJCQkJcmVnID0gaWdhMl9zaGFkb3dfY3J0Y19yZWcudmVyX3RvdGFsX3NoYWRvdy5yZWc7CisJCQkJYnJlYWs7CisJCQljYXNlIFZfQUREUl9TSEFET1dfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9WRVJfQUREUl9TSEFET1dfRk9STVVMQQorCQkJCSAgICAobW9kZV90aW1pbmcudmVyX2FkZHIpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl9hZGRyX3NoYWRvdy4KKwkJCQkgICAgcmVnX251bTsKKwkJCQlyZWcgPSBpZ2EyX3NoYWRvd19jcnRjX3JlZy52ZXJfYWRkcl9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX0JMQU5LX1NBVFJUX1NIQURPV19JTkRFWDoKKwkJCQlyZWdfdmFsdWUgPQorCQkJCSAgICBJR0EyX1ZFUl9CTEFOS19TVEFSVF9TSEFET1dfRk9STVVMQQorCQkJCSAgICAobW9kZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX3N0YXJ0X3NoYWRvdy5yZWdfbnVtOworCQkJCXJlZyA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLgorCQkJCSAgICB2ZXJfYmxhbmtfc3RhcnRfc2hhZG93LnJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9CTEFOS19FTkRfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX0JMQU5LX0VORF9TSEFET1dfRk9STVVMQQorCQkJCSAgICAocGFuZWxfdGltaW5nLnZlcl9ibGFua19zdGFydCwKKwkJCQkgICAgIHBhbmVsX3RpbWluZy52ZXJfYmxhbmtfZW5kKTsKKwkJCQl2aWFmYl9sb2FkX3JlZ19OdW0gPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX2VuZF9zaGFkb3cucmVnX251bTsKKwkJCQlyZWcgPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy4KKwkJCQkgICAgdmVyX2JsYW5rX2VuZF9zaGFkb3cucmVnOworCQkJCWJyZWFrOworCQkJY2FzZSBWX1NZTkNfU0FUUlRfU0hBRE9XX0lOREVYOgorCQkJCXJlZ192YWx1ZSA9CisJCQkJICAgIElHQTJfVkVSX1NZTkNfU1RBUlRfU0hBRE9XX0ZPUk1VTEEoCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX3N5bmNfc3RhcnQgLQorCQkJCSAgICBwYW5lbF90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KSArCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX2FkZHIgLQorCQkJCSAgICBtb2RlX3RpbWluZy52ZXJfYWRkcikgLyAyICsKKwkJCQkgICAgbW9kZV90aW1pbmcudmVyX2FkZHIpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0X3NoYWRvdy4KKwkJCQkgICAgcmVnX251bTsKKwkJCQlyZWcgPQorCQkJCSAgICBpZ2EyX3NoYWRvd19jcnRjX3JlZy52ZXJfc3luY19zdGFydF9zaGFkb3cuCisJCQkJICAgIHJlZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVl9TWU5DX0VORF9TSEFET1dfSU5ERVg6CisJCQkJcmVnX3ZhbHVlID0KKwkJCQkgICAgSUdBMl9WRVJfU1lOQ19FTkRfU0hBRE9XX0ZPUk1VTEEoCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX3N5bmNfc3RhcnQgLQorCQkJCSAgICBwYW5lbF90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KSArCisJCQkJICAgIChwYW5lbF90aW1pbmcudmVyX2FkZHIgLQorCQkJCSAgICBtb2RlX3RpbWluZy52ZXJfYWRkcikgLyAyICsKKwkJCQkgICAgbW9kZV90aW1pbmcudmVyX2FkZHIsCisJCQkJICAgIHBhbmVsX3RpbWluZy52ZXJfc3luY19lbmQpOworCQkJCXZpYWZiX2xvYWRfcmVnX051bSA9CisJCQkJICAgIGlnYTJfc2hhZG93X2NydGNfcmVnLnZlcl9zeW5jX2VuZF9zaGFkb3cuCisJCQkJICAgIHJlZ19udW07CisJCQkJcmVnID0KKwkJCQkgICAgaWdhMl9zaGFkb3dfY3J0Y19yZWcudmVyX3N5bmNfZW5kX3NoYWRvdy4KKwkJCQkgICAgcmVnOworCQkJCWJyZWFrOworCQkJfQorCQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLAorCQkJCXZpYWZiX2xvYWRfcmVnX051bSwgcmVnLCBWSUFDUik7CisJCX0KKwl9Cit9CisKK2Jvb2wgdmlhZmJfbGNkX2dldF9tb2JpbGVfc3RhdGUoYm9vbCAqbW9iaWxlKQoreworCXVuc2lnbmVkIGNoYXIgKnJvbXB0ciwgKnRhYmxlcHRyOworCXU4IGNvcmVfYmFzZTsKKwl1bnNpZ25lZCBjaGFyICpiaW9zcHRyOworCS8qIFJvbSBhZGRyZXNzICovCisJdTMyIHJvbWFkZHIgPSAweDAwMEMwMDAwOworCXUxNiBzdGFydF9wYXR0ZXJuID0gMDsKKworCWJpb3NwdHIgPSBpb3JlbWFwKHJvbWFkZHIsIDB4MTAwMDApOworCisJbWVtY3B5KCZzdGFydF9wYXR0ZXJuLCBiaW9zcHRyLCAyKTsKKwkvKiBDb21wYXJlIHBhdHRlcm4gKi8KKwlpZiAoc3RhcnRfcGF0dGVybiA9PSAweEFBNTUpIHsKKwkJLyogR2V0IHRoZSBzdGFydCBvZiBUYWJsZSAqLworCQkvKiAweDFCIG1lYW5zIEJJT1Mgb2Zmc2V0IHBvc2l0aW9uICovCisJCXJvbXB0ciA9IGJpb3NwdHIgKyAweDFCOworCQl0YWJsZXB0ciA9IGJpb3NwdHIgKyAqKCh1MTYgKikgcm9tcHRyKTsKKworCQkvKiBHZXQgdGhlIHN0YXJ0IG9mIGJpb3N2ZXIgc3RydWN0dXJlICovCisJCS8qIDE4IG1lYW5zIEJJT1MgdmVyc2lvbiBwb3NpdGlvbi4gKi8KKwkJcm9tcHRyID0gdGFibGVwdHIgKyAxODsKKwkJcm9tcHRyID0gYmlvc3B0ciArICooKHUxNiAqKSByb21wdHIpOworCisJCS8qIFRoZSBvZmZzZXQgc2hvdWxkIGJlIDQ0LCBidXQgdGhlCisJCSAgIGFjdHVhbCBpbWFnZSBpcyBsZXNzIHRocmVlIGNoYXIuICovCisJCS8qIHBSb20gKz0gNDQ7ICovCisJCXJvbXB0ciArPSA0MTsKKworCQljb3JlX2Jhc2UgPSAqcm9tcHRyKys7CisKKwkJaWYgKGNvcmVfYmFzZSAmIDB4OCkKKwkJCSptb2JpbGUgPSBmYWxzZTsKKwkJZWxzZQorCQkJKm1vYmlsZSA9IHRydWU7CisJCS8qIHJlbGVhc2UgbWVtb3J5ICovCisJCWlvdW5tYXAoYmlvc3B0cik7CisKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaW91bm1hcChiaW9zcHRyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgdmlhZmJfbG9hZF9zY2FsaW5nX2ZhY3Rvcl9mb3JfcDRtOTAwKGludCBzZXRfaHJlcywKKwlpbnQgc2V0X3ZyZXMsIGludCBwYW5lbF9ocmVzLCBpbnQgcGFuZWxfdnJlcykKK3sKKwlpbnQgaF9zY2FsaW5nX2ZhY3RvcjsKKwlpbnQgdl9zY2FsaW5nX2ZhY3RvcjsKKwl1OCBjcmEyID0gMDsKKwl1OCBjcjc3ID0gMDsKKwl1OCBjcjc4ID0gMDsKKwl1OCBjcjc5ID0gMDsKKwl1OCBjcjlmID0gMDsKKwkvKiBDaGVjayBpZiBleHBhbnNpb24gZm9yIGhvcml6b250YWwgKi8KKwlpZiAoc2V0X2hyZXMgPCBwYW5lbF9ocmVzKSB7CisJCS8qIExvYWQgSG9yaXpvbnRhbCBTY2FsaW5nIEZhY3RvciAqLworCisJCS8qIEZvciBWSUFfSzhNODAwIG9yIGxhdGVyIGNoaXBzZXRzLiAqLworCQloX3NjYWxpbmdfZmFjdG9yID0KKwkJICAgIEs4MDBfTENEX0hPUl9TQ0ZfRk9STVVMQShzZXRfaHJlcywgcGFuZWxfaHJlcyk7CisJCS8qIEhTQ2FsZUZhY3RvclsxOjBdIGF0IENSOUZbMTowXSAqLworCQljcjlmID0gaF9zY2FsaW5nX2ZhY3RvciAmIDB4MDAwMzsKKwkJLyogSFNDYWxlRmFjdG9yWzk6Ml0gYXQgQ1I3N1s3OjBdICovCisJCWNyNzcgPSAoaF9zY2FsaW5nX2ZhY3RvciAmIDB4MDNGQykgPj4gMjsKKwkJLyogSFNDYWxlRmFjdG9yWzExOjEwXSBhdCBDUjc5WzU6NF0gKi8KKwkJY3I3OSA9IChoX3NjYWxpbmdfZmFjdG9yICYgMHgwQzAwKSA+PiAxMDsKKwkJY3I3OSA8PD0gNDsKKworCQkvKiBIb3Jpem9udGFsIHNjYWxpbmcgZW5hYmxlZCAqLworCQljcmEyID0gMHhDMDsKKworCQlERUJVR19NU0coS0VSTl9JTkZPICJIb3Jpem9udGFsIFNjYWxpbmcgdmFsdWUgPSAlZFxuIiwKKwkJCSAgaF9zY2FsaW5nX2ZhY3Rvcik7CisJfSBlbHNlIHsKKwkJLyogSG9yaXpvbnRhbCBzY2FsaW5nIGRpc2FibGVkICovCisJCWNyYTIgPSAweDAwOworCX0KKworCS8qIENoZWNrIGlmIGV4cGFuc2lvbiBmb3IgdmVydGljYWwgKi8KKwlpZiAoc2V0X3ZyZXMgPCBwYW5lbF92cmVzKSB7CisJCS8qIExvYWQgVmVydGljYWwgU2NhbGluZyBGYWN0b3IgKi8KKworCQkvKiBGb3IgVklBX0s4TTgwMCBvciBsYXRlciBjaGlwc2V0cy4gKi8KKwkJdl9zY2FsaW5nX2ZhY3RvciA9CisJCSAgICBLODAwX0xDRF9WRVJfU0NGX0ZPUk1VTEEoc2V0X3ZyZXMsIHBhbmVsX3ZyZXMpOworCisJCS8qIFZlcnRpY2FsIHNjYWxpbmcgZW5hYmxlZCAqLworCQljcmEyIHw9IDB4MDg7CisJCS8qIFZTQ2FsZUZhY3RvclswXSBhdCBDUjc5WzNdICovCisJCWNyNzkgfD0gKCh2X3NjYWxpbmdfZmFjdG9yICYgMHgwMDAxKSA8PCAzKTsKKwkJLyogVlNDYWxlRmFjdG9yWzg6MV0gYXQgQ1I3OFs3OjBdICovCisJCWNyNzggfD0gKHZfc2NhbGluZ19mYWN0b3IgJiAweDAxRkUpID4+IDE7CisJCS8qIFZTQ2FsZUZhY3RvclsxMDo5XSBhdCBDUjc5Wzc6Nl0gKi8KKwkJY3I3OSB8PSAoKHZfc2NhbGluZ19mYWN0b3IgJiAweDA2MDApID4+IDkpIDw8IDY7CisKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAiVmVydGljYWwgU2NhbGluZyB2YWx1ZSA9ICVkXG4iLAorCQkJICB2X3NjYWxpbmdfZmFjdG9yKTsKKwl9IGVsc2UgeworCQkvKiBWZXJ0aWNhbCBzY2FsaW5nIGRpc2FibGVkICovCisJCWNyYTIgfD0gMHgwMDsKKwl9CisKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUkEyLCBWSUFDUiwgY3JhMiwgQklUMyArIEJJVDYgKyBCSVQ3KTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjc3LCBWSUFDUiwgY3I3NywgMHhGRik7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I3OCwgVklBQ1IsIGNyNzgsIDB4RkYpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNzksIFZJQUNSLCBjcjc5LCAweEY4KTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjlGLCBWSUFDUiwgY3I5ZiwgQklUMCArIEJJVDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvbGNkLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFmNDdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19MQ0RfSF9fCisjZGVmaW5lIF9fTENEX0hfXworCisvKkRlZmluaXRpb24gVE1EUyBEZXZpY2UgSUQgcmVnaXN0ZXIqLworI2RlZmluZSAgICAgVlQxNjMxX0RFVklDRV9JRF9SRUcgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgIFZUMTYzMV9ERVZJQ0VfSUQgICAgICAgICAgICAweDkyCisKKyNkZWZpbmUgICAgIFZUMzI3MV9ERVZJQ0VfSURfUkVHICAgICAgICAweDAyCisjZGVmaW5lICAgICBWVDMyNzFfREVWSUNFX0lEICAgICAgICAgICAgMHg3MQorCisjZGVmaW5lICAgICBHRVRfTENEX1NJWkVfQllfU1lTVEVNX0JJT1MgICAgIDB4MDEKKyNkZWZpbmUgICAgIEdFVF9MQ0RfU0laRV9CWV9WR0FfQklPUyAgICAgICAgMHgwMgorI2RlZmluZSAgICAgR0VUX0xDRF9TWklFX0JZX0hXX1NUUkFQUElORyAgICAweDAzCisjZGVmaW5lICAgICBHRVRfTENEX1NJWkVfQllfVVNFUl9TRVRUSU5HICAgIDB4MDQKKworLyogRGVmaW5pdGlvbiBEVkkgUGFuZWwgSUQqLworLyogUmVzb2x1dGlvbjogNjQweDQ4MCwgICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQwXzY0MFg0ODAgICAgICAgMHgwMAorLyogUmVzb2x1dGlvbjogODAweDYwMCwgICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQxXzgwMFg2MDAgICAgICAgMHgwMQorLyogUmVzb2x1dGlvbjogMTAyNHg3NjgsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQyXzEwMjRYNzY4ICAgICAgMHgwMgorLyogUmVzb2x1dGlvbjogMTI4MHg3NjgsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQzXzEyODBYNzY4ICAgICAgMHgwMworLyogUmVzb2x1dGlvbjogMTI4MHgxMDI0LCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQ0XzEyODBYMTAyNCAgICAgMHgwNAorLyogUmVzb2x1dGlvbjogMTQwMHgxMDUwLCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQ1XzE0MDBYMTA1MCAgICAgMHgwNQorLyogUmVzb2x1dGlvbjogMTYwMHgxMjAwLCBDaGFubmVsOiBkdWFsLCAgIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMCAgICAgMHgwNgorLyogUmVzb2x1dGlvbjogMTM2Nng3NjgsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRGlzYWJsZSAqLworI2RlZmluZSAgICAgTENEX1BBTkVMX0lEN18xMzY2WDc2OCAgICAgIDB4MDcKKy8qIFJlc29sdXRpb246IDEwMjR4NjAwLCAgQ2hhbm5lbDogc2luZ2xlLCBEaXRoZXJpbmc6IEVuYWJsZSovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSUQ4XzEwMjRYNjAwICAgICAgMHgwOAorLyogUmVzb2x1dGlvbjogMTI4MHg4MDAsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlKi8KKyNkZWZpbmUgICAgIExDRF9QQU5FTF9JRDlfMTI4MFg4MDAgICAgICAweDA5CisvKiBSZXNvbHV0aW9uOiA4MDB4NDgwLCAgIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBFbmFibGUqLworI2RlZmluZSAgICAgTENEX1BBTkVMX0lEQV84MDBYNDgwICAgICAgIDB4MEEKKy8qIFJlc29sdXRpb246IDEzNjB4NzY4LCAgIENoYW5uZWw6IHNpbmdsZSwgRGl0aGVyaW5nOiBEaXNhYmxlKi8KKyNkZWZpbmUgICAgIExDRF9QQU5FTF9JREJfMTM2MFg3NjggICAgIDB4MEIKKy8qIFJlc29sdXRpb246IDQ4MHg2NDAsICBDaGFubmVsOiBzaW5nbGUsIERpdGhlcmluZzogRW5hYmxlICovCisjZGVmaW5lICAgICBMQ0RfUEFORUxfSURDXzQ4MFg2NDAgICAgICAweDBDCisKKworZXh0ZXJuIGludCB2aWFmYl9MQ0QyX09OOworZXh0ZXJuIGludCB2aWFmYl9MQ0RfT047CitleHRlcm4gaW50IHZpYWZiX0RWSV9PTjsKKwordm9pZCB2aWFmYl9kaXNhYmxlX2x2ZHNfdnQxNjM2KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7Cit2b2lkIHZpYWZiX2VuYWJsZV9sdmRzX3Z0MTYzNihzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3ZvaWQgdmlhZmJfbGNkX2Rpc2FibGUodm9pZCk7Cit2b2lkIHZpYWZiX2xjZF9lbmFibGUodm9pZCk7Cit2b2lkIHZpYWZiX2luaXRfbGNkX3NpemUodm9pZCk7Cit2b2lkIHZpYWZiX2luaXRfbHZkc19vdXRwdXRfaW50ZXJmYWNlKHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24KKwkJCQkqcGx2ZHNfY2hpcF9pbmZvLAorCQkJCXN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCQkqcGx2ZHNfc2V0dGluZ19pbmZvKTsKK3ZvaWQgdmlhZmJfbGNkX3NldF9tb2RlKHN0cnVjdCBjcnRfbW9kZV90YWJsZSAqbW9kZV9jcnRfdGFibGUsCisJCSAgc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkgIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7CitpbnQgdmlhZmJfbHZkc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpOwordm9pZCB2aWFmYl9pbml0X2x2ZHNfb3V0cHV0X2ludGVyZmFjZShzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCisJCQkJKnBsdmRzX2NoaXBfaW5mbywKKwkJCQlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkJKnBsdmRzX3NldHRpbmdfaW5mbyk7Citib29sIHZpYWZiX2xjZF9nZXRfbW9iaWxlX3N0YXRlKGJvb2wgKm1vYmlsZSk7Cit2b2lkIHZpYWZiX2xvYWRfY3J0Y190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIGRldmljZV90aW1pbmcsCisJaW50IHNldF9pZ2EpOworCisjZW5kaWYgLyogX19MQ0RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2R0YmwuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL2xjZHRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmM2RkODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2R0YmwuaApAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19MQ0RUQkxfSF9fCisjZGVmaW5lIF9fTENEVEJMX0hfXworCisjaW5jbHVkZSAic2hhcmUuaCIKKworLyogQ0xFMjY2IFNvZnR3YXJlIFBvd2VyIFNlcXVlbmNlICovCisvKiB7TWFza30sIHtEYXRhfSwge0RlbGF5fSAqLworaW50IFBvd2VyU2VxdWVuY2VPblszXVszXSA9CisgICAgeyB7MHgxMCwgMHgwOCwgMHgwNn0sIHsweDEwLCAweDA4LCAweDA2fSwgezB4MTksIDB4MUZFLCAweDAxfSB9OworaW50IFBvd2VyU2VxdWVuY2VPZmZbM11bM10gPQorICAgIHsgezB4MDYsIDB4MDgsIDB4MTB9LCB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweEQyLCAweDE5LCAweDAxfSB9OworCisvKiArKysrKysgUDg4MCArKysrKysgKi8KKy8qICAgUGFuZWwgMTYwMHgxMjAwICAgKi8KK3N0cnVjdCBpb19yZWcgUDg4MF9MQ0RfUkVTXzZYNF8xNlgxMltdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDczfSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDA4fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4NzN9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MDB9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHg0MH0sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweDVBfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDAwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDVFfSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEQ2fSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ0LCAweEZGLCAweDdEfSwge1ZJQVNSLCBTUjQ1LCAweEZGLCAweDhDfSwKKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDJ9CisKK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX1A4ODBfTENEX1JFU182WDRfMTZYMTIgQVJSQVlfU0laRShQODgwX0xDRF9SRVNfNlg0XzE2WDEyKQorCitzdHJ1Y3QgaW9fcmVnIFA4ODBfTENEX1JFU183WDRfMTZYMTJbXSA9IHsKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg2N30sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgwOH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDY3fSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweDAwfSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4NDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHg3NH0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgwMH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHg3OH0sCisJLypJR0EyIE9mZnNldCAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhGNX0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJIC8qVkNMSyovIHtWSUFTUiwgU1I0NCwgMHhGRiwgMHg3OH0sIHtWSUFTUiwgU1I0NSwgMHhGRiwgMHg4Q30sCisJe1ZJQVNSLCBTUjQ2LCAweEZGLCAweDAxfQorCit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9QODgwX0xDRF9SRVNfN1g0XzE2WDEyIEFSUkFZX1NJWkUoUDg4MF9MQ0RfUkVTXzdYNF8xNlgxMikKKworc3RydWN0IGlvX3JlZyBQODgwX0xDRF9SRVNfOFg2XzE2WDEyW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4NjV9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4MDh9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg2NX0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHgwMH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDQwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4N0Z9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4ODN9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4RTF9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDQsIDB4RkYsIDB4NkR9LCB7VklBU1IsIFNSNDUsIDB4RkYsIDB4ODh9LAorCXtWSUFTUiwgU1I0NiwgMHhGRiwgMHgwM30KKworfTsKKworI2RlZmluZSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzhYNl8xNlgxMiBBUlJBWV9TSVpFKFA4ODBfTENEX1JFU184WDZfMTZYMTIpCisKK3N0cnVjdCBpb19yZWcgUDg4MF9MQ0RfUkVTXzEwWDdfMTZYMTJbXSA9IHsKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg2NX0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgwOH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDY1fSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweDAwfSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4NDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHhBQn0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgwMH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHhBRn0sCisJLypJR0EyIE9mZnNldCAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhGMH0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJIC8qVkNMSyovIHtWSUFTUiwgU1I0NCwgMHhGRiwgMHg5Mn0sIHtWSUFTUiwgU1I0NSwgMHhGRiwgMHg4OH0sCisJe1ZJQVNSLCBTUjQ2LCAweEZGLCAweDAzfQorCit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9QODgwX0xDRF9SRVNfMTBYN18xNlgxMiBBUlJBWV9TSVpFKFA4ODBfTENEX1JFU18xMFg3XzE2WDEyKQorCitzdHJ1Y3QgaW9fcmVnIFA4ODBfTENEX1JFU18xMlgxMF8xNlgxMltdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDdEfSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDA4fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4N0R9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MDB9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHg0MH0sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweEQwfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDAwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweEQ0fSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEZBfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ0LCAweEZGLCAweEY2fSwge1ZJQVNSLCBTUjQ1LCAweEZGLCAweDg4fSwKKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDV9CisKK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX1A4ODBfTENEX1JFU18xMlgxMF8xNlgxMiBBUlJBWV9TSVpFKFA4ODBfTENEX1JFU18xMlgxMF8xNlgxMikKKworLyogICBQYW5lbCAxNDAweDEwNTAgICAqLworc3RydWN0IGlvX3JlZyBQODgwX0xDRF9SRVNfNlg0XzE0WDEwW10gPSB7CisJLyogNjQweDQ4MCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHg1Nn0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAgICAgICAgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4NzV9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgyNH0sCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAgICAgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NUZ9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4NDR9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDYzfSwKKwkvKiBJR0EyIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhCNH0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJLyogVkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSNDQsIDB4RkYsIDB4QzZ9LCB7VklBU1IsIFNSNDUsIDB4RkYsIDB4OEN9LAorCXtWSUFTUiwgU1I0NiwgMHhGRiwgMHgwNX0KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX1A4ODBfTENEX1JFU182WDRfMTRYMTAgQVJSQVlfU0laRShQODgwX0xDRF9SRVNfNlg0XzE0WDEwKQorCitzdHJ1Y3QgaW9fcmVnIFA4ODBfTENEX1JFU184WDZfMTRYMTBbXSA9IHsKKwkvKiA4MDB4NjAwICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDlEfSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDU2fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICAgICAgICAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NX0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDI0fSwKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICAgICAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHg3Rn0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHg0NH0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4ODN9LAorCS8qIElHQTIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEJFfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkvKiBWQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1I0NCwgMHhGRiwgMHgwNn0sIHtWSUFTUiwgU1I0NSwgMHhGRiwgMHg4RH0sCisJe1ZJQVNSLCBTUjQ2LCAweEZGLCAweDA1fQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfUDg4MF9MQ0RfUkVTXzhYNl8xNFgxMCBBUlJBWV9TSVpFKFA4ODBfTENEX1JFU184WDZfMTRYMTApCisKKy8qICsrKysrKyBLNDAwICsrKysrKyAqLworLyogICBQYW5lbCAxNjAweDEyMDAgICAqLworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfNlg0XzE2WDEyW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4NzN9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4MDh9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg3M30sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHgwMH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDQwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NUF9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4NUV9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4REF9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4QzR9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4N0Z9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfNlg0XzE2WDEyIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF8xNlgxMikKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfN1g0XzE2WDEyW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4Njd9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4MDh9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg2N30sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHgwMH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDQwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NzR9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4Nzh9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4RjV9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4NDZ9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4M0R9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfN1g0XzE2WDEyIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzdYNF8xNlgxMikKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfOFg2XzE2WDEyW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4NjV9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4MDh9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg2NX0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHgwMH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDQwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4N0Z9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4ODN9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4RTF9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4ODV9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4NkZ9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzE2WDEyIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzhYNl8xNlgxMikKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfMTBYN18xNlgxMltdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDY1fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDA4fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4NjV9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MDB9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHg0MH0sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweEFCfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDAwfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweEFGfSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEYwfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ2LCAweEZGLCAweDQ1fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDRBfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEwWDdfMTZYMTIgQVJSQVlfU0laRShLNDAwX0xDRF9SRVNfMTBYN18xNlgxMikKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfMTJYMTBfMTZYMTJbXSA9IHsKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg3RH0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgwOH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDdEfSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweDAwfSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4NDB9LAorCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHhEMH0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgwMH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHhENH0sCisJLypJR0EyIE9mZnNldCAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhGQX0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJIC8qVkNMSyovIHtWSUFTUiwgU1I0NiwgMHhGRiwgMHg0N30sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHg3Q30KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU18xMlgxMF8xNlgxMiBBUlJBWV9TSVpFKEs0MDBfTENEX1JFU18xMlgxMF8xNlgxMikKKworLyogICBQYW5lbCAxNDAweDEwNTAgICAqLworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfNlg0XzE0WDEwW10gPSB7CisJLyogNjQweDQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHg1Nn0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAgICAgICAgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4NzV9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgyNH0sCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAgICAgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NUZ9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4NDR9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDYzfSwKKwkvKiBJR0EyIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhCNH0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJLyogVkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDd9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4MTl9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfNlg0XzE0WDEwIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF8xNFgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfOFg2XzE0WDEwW10gPSB7CisJLyogODAweDYwMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHg1Nn0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAgICAgICAgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4NzV9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgyNH0sCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAgICAgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4N0Z9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4NDR9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDgzfSwKKwkvKiBJR0EyIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHhCRX0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJLyogVkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDd9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4MjF9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzE0WDEwIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzhYNl8xNFgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfMTBYN18xNFgxMFtdID0geworCS8qIDEwMjR4NzY4ICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4NTZ9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgICAgICAgICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDlEfSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweDc1fSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4MjR9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgICAgICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweEEzfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDQ0fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHhBN30sCisJLyogSUdBMiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4QzN9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDR9LAorCS8qIFZDTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQVNSLCBTUjQ2LCAweEZGLCAweDA1fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDFFfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEwWDdfMTRYMTAgQVJSQVlfU0laRShLNDAwX0xDRF9SRVNfMTBYN18xNFgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfMTJYMTBfMTRYMTBbXSA9IHsKKwkvKiAxMjgweDc2OCwgMTI4MHg5NjAsIDEyODB4MTAyNCAgICAqLworCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDk3fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDU2fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICAgICAgICAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5N30sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NX0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDI0fSwKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICAgICAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHhDRX0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHg0NH0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4RDJ9LAorCS8qIElHQTIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEM5fSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDA0fSwKKwkvKiBWQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1I0NiwgMHhGRiwgMHg4NH0sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHg3OX0KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU18xMlgxMF8xNFgxMCBBUlJBWV9TSVpFKEs0MDBfTENEX1JFU18xMlgxMF8xNFgxMCkKKworLyogKysrKysrIEs0MDAgKysrKysrICovCisvKiAgIFBhbmVsIDEzNjZ4NzY4ICAgKi8KK3N0cnVjdCBpb19yZWcgSzQwMF9MQ0RfUkVTXzZYNF8xMzY2WDdbXSA9IHsKKwkvKiA2NDB4NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDQ3fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDM1fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICAgICAgICAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg0N30sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHgyQn0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDEzfSwKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICAgICAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHg2MH0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgyM30sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4NjR9LAorCS8qIElHQTIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweDhDfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkvKiBWQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1I0NiwgMHhGRiwgMHg4N30sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHg0Q30KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU182WDRfMTM2Nlg3IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF8xMzY2WDcpCisKK3N0cnVjdCBpb19yZWcgSzQwMF9MQ0RfUkVTXzdYNF8xMzY2WDdbXSA9IHsKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHgzQn0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgzNX0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAgICAgICAgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4M0J9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MkJ9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxM30sCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAgICAgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NzF9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MjN9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDc1fSwKKwkvKiBJR0EyIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHg5Nn0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJLyogVkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDV9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4MTB9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfN1g0XzEzNjZYNyBBUlJBWV9TSVpFKEs0MDBfTENEX1JFU183WDRfMTM2Nlg3KQorCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU184WDZfMTM2Nlg3W10gPSB7CisJLyogODAweDYwMCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHgzN30sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgzNX0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAgICAgICAgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4Mzd9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MkJ9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxM30sCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAgICAgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4N0V9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MjN9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDgyfSwKKwkvKiBJR0EyIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHg4Q30sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJLyogVkNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSNDYsIDB4RkYsIDB4ODR9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4Qjl9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzEzNjZYNyBBUlJBWV9TSVpFKEs0MDBfTENEX1JFU184WDZfMTM2Nlg3KQorCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU18xMFg3XzEzNjZYN1tdID0geworCS8qIDEwMjR4NzY4ICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4NTZ9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgICAgICAgICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDlEfSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweDc1fSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4MjR9LAorCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgICAgICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweEEzfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDQ0fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHhBN30sCisJLyogSUdBMiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4QzN9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDR9LAorCS8qIFZDTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQVNSLCBTUjQ2LCAweEZGLCAweDA1fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDFFfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEwWDdfMTM2Nlg3IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzEwWDdfMTM2Nlg3KQorCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU18xMlgxMF8xMzY2WDdbXSA9IHsKKwkvKiAxMjgweDc2OCwgMTI4MHg5NjAsIDEyODB4MTAyNCAgICAqLworCS8qIElHQTIgSG9yaXpvbnRhbCBUb3RhbCAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDk3fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDU2fSwKKwkvKiBJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICAgICAgICAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5N30sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NX0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDI0fSwKKwkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICAgICAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHhDRX0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHg0NH0sCisJLyogSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4RDJ9LAorCS8qIElHQTIgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEM5fSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDA0fSwKKwkvKiBWQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1I0NiwgMHhGRiwgMHg4NH0sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHg3OX0KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU18xMlgxMF8xMzY2WDdcCisJCQlBUlJBWV9TSVpFKEs0MDBfTENEX1JFU18xMlgxMF8xMzY2WDcpCisKKy8qICsrKysrKyBLNDAwICsrKysrKyAqLworLyogICBQYW5lbCAxMjgweDEwMjQgICAqLworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfNlg0XzEyWDEwW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4NDZ9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDFDfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4NUZ9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MzR9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4NjN9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4QUF9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDd9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4MTl9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfNlg0XzEyWDEwIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF8xMlgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfN1g0XzEyWDEwW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4NDZ9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDFDfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4Njh9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MzR9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4NkN9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4QTh9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4ODd9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4RUR9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfN1g0XzEyWDEwIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzdYNF8xMlgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfOFg2XzEyWDEwW10gPSB7CisJLypJR0EyIEhvcml6b250YWwgVG90YWwgKi8KKwl7VklBQ1IsIENSNTAsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTUsIDB4MEYsIDB4NDZ9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCAqLworCXtWSUFDUiwgQ1I1MywgMHhGRiwgMHg5RH0sIHtWSUFDUiwgQ1I1NCwgMHgzOCwgMHg3NH0sCisJe1ZJQUNSLCBDUjVELCAweDQwLCAweDFDfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkQsIDB4RkYsIDB4N0Z9LCB7VklBQ1IsIENSNzEsIDB4MDgsIDB4MzR9LAorCS8qSUdBMiBIb3Jpem9udGFsIEJsYW5rIEVuZCBTaGFkb3cgKi8KKwl7VklBQ1IsIENSNkUsIDB4RkYsIDB4ODN9LAorCS8qSUdBMiBPZmZzZXQgKi8KKwl7VklBQ1IsIENSNjYsIDB4RkYsIDB4QkV9LCB7VklBQ1IsIENSNjcsIDB4MDMsIDB4MDB9LAorCSAvKlZDTEsqLyB7VklBU1IsIFNSNDYsIDB4RkYsIDB4MDd9LCB7VklBU1IsIFNSNDcsIDB4RkYsIDB4MjF9Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9LNDAwX0xDRF9SRVNfOFg2XzEyWDEwIEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzhYNl8xMlgxMCkKKworc3RydWN0IGlvX3JlZyBLNDAwX0xDRF9SRVNfMTBYN18xMlgxMFtdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDlEfSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDQ2fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4OUR9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4NzR9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxQ30sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweEEzfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDM0fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweEE3fSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweEJFfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDA0fSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ2LCAweEZGLCAweDA1fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDFFfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzEwWDdfMTJYMTAgQVJSQVlfU0laRShLNDAwX0xDRF9SRVNfMTBYN18xMlgxMCkKKworLyogKysrKysrIEs0MDAgKysrKysrICovCisvKiAgIFBhbmVsIDEwMjR4NzY4ICAgICovCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU182WDRfMTBYN1tdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDQ3fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDM1fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4NDd9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MkJ9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxM30sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweDYwfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDIzfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDY0fSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweDhDfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ2LCAweEZGLCAweDg3fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDRDfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzZYNF8xMFg3IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF8xMFg3KQorCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU183WDRfMTBYN1tdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDNCfSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDM1fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4M0J9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MkJ9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxM30sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweDcxfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDIzfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDc1fSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweDk2fSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ2LCAweEZGLCAweDA1fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweDEwfQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzdYNF8xMFg3IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzdYNF8xMFg3KQorCitzdHJ1Y3QgaW9fcmVnIEs0MDBfTENEX1JFU184WDZfMTBYN1tdID0geworCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCisJe1ZJQUNSLCBDUjUwLCAweEZGLCAweDM3fSwge1ZJQUNSLCBDUjU1LCAweDBGLCAweDM1fSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KKwl7VklBQ1IsIENSNTMsIDB4RkYsIDB4Mzd9LCB7VklBQ1IsIENSNTQsIDB4MzgsIDB4MkJ9LAorCXtWSUFDUiwgQ1I1RCwgMHg0MCwgMHgxM30sCisJLypJR0EyIEhvcml6b250YWwgVG90YWwgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZELCAweEZGLCAweDdFfSwge1ZJQUNSLCBDUjcxLCAweDA4LCAweDIzfSwKKwkvKklHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgU2hhZG93ICovCisJe1ZJQUNSLCBDUjZFLCAweEZGLCAweDgyfSwKKwkvKklHQTIgT2Zmc2V0ICovCisJe1ZJQUNSLCBDUjY2LCAweEZGLCAweDhDfSwge1ZJQUNSLCBDUjY3LCAweDAzLCAweDAwfSwKKwkgLypWQ0xLKi8ge1ZJQVNSLCBTUjQ2LCAweEZGLCAweDg0fSwge1ZJQVNSLCBTUjQ3LCAweEZGLCAweEI5fQorfTsKKworI2RlZmluZSBOVU1fVE9UQUxfSzQwMF9MQ0RfUkVTXzhYNl8xMFg3IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzhYNl8xMFg3KQorCisvKiArKysrKysgSzQwMCArKysrKysgKi8KKy8qICAgUGFuZWwgODAweDYwMCAgICAgKi8KK3N0cnVjdCBpb19yZWcgSzQwMF9MQ0RfUkVTXzZYNF84WDZbXSA9IHsKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHgxQX0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgzNH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDFBfSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweEUzfSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4MTJ9LAorCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHg1Rn0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgyMn0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHg2M30sCisJLypJR0EyIE9mZnNldCAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHg2RX0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJIC8qVkNMSyovIHtWSUFTUiwgU1I0NiwgMHhGRiwgMHg4Nn0sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHhCM30KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU182WDRfOFg2IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzZYNF84WDYpCisKK3N0cnVjdCBpb19yZWcgSzQwMF9MQ0RfUkVTXzdYNF84WDZbXSA9IHsKKwkvKklHQTIgSG9yaXpvbnRhbCBUb3RhbCAqLworCXtWSUFDUiwgQ1I1MCwgMHhGRiwgMHgxRn0sIHtWSUFDUiwgQ1I1NSwgMHgwRiwgMHgzNH0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kICovCisJe1ZJQUNSLCBDUjUzLCAweEZGLCAweDFGfSwge1ZJQUNSLCBDUjU0LCAweDM4LCAweEUzfSwKKwl7VklBQ1IsIENSNUQsIDB4NDAsIDB4MTJ9LAorCS8qSUdBMiBIb3Jpem9udGFsIFRvdGFsIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RCwgMHhGRiwgMHg3Rn0sIHtWSUFDUiwgQ1I3MSwgMHgwOCwgMHgyMn0sCisJLypJR0EyIEhvcml6b250YWwgQmxhbmsgRW5kIFNoYWRvdyAqLworCXtWSUFDUiwgQ1I2RSwgMHhGRiwgMHg4M30sCisJLypJR0EyIE9mZnNldCAqLworCXtWSUFDUiwgQ1I2NiwgMHhGRiwgMHg3OH0sIHtWSUFDUiwgQ1I2NywgMHgwMywgMHgwMH0sCisJIC8qVkNMSyovIHtWSUFTUiwgU1I0NiwgMHhGRiwgMHhDNH0sIHtWSUFTUiwgU1I0NywgMHhGRiwgMHg1OX0KK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX0s0MDBfTENEX1JFU183WDRfOFg2IEFSUkFZX1NJWkUoSzQwMF9MQ0RfUkVTXzdYNF84WDYpCisKKyNlbmRpZiAvKiBfX0xDRFRCTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3NoYXJlLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTI1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oCkBAIC0wLDAgKzEsMTEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1NIQVJFX0hfXworI2RlZmluZSBfX1NIQVJFX0hfXworCisvKiBEZWZpbmUgUmV0dXJuIFZhbHVlICovCisjZGVmaW5lIEZBSUwgICAgICAgIC0xCisjZGVmaW5lIE9LICAgICAgICAgIDEKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKy8qIERlZmluZSBCaXQgRmllbGQgKi8KKyNkZWZpbmUgQklUMCAgICAweDAxCisjZGVmaW5lIEJJVDEgICAgMHgwMgorI2RlZmluZSBCSVQyICAgIDB4MDQKKyNkZWZpbmUgQklUMyAgICAweDA4CisjZGVmaW5lIEJJVDQgICAgMHgxMAorI2RlZmluZSBCSVQ1ICAgIDB4MjAKKyNkZWZpbmUgQklUNiAgICAweDQwCisjZGVmaW5lIEJJVDcgICAgMHg4MAorCisvKiBWaWRlbyBNZW1vcnkgU2l6ZSAqLworI2RlZmluZSBWSURFT19NRU1PUllfU0laRV8xNk0gICAgMHgxMDAwMDAwCisKKy8qIERlZmluaXRpb24gTW9kZSBJbmRleAorKi8KKyNkZWZpbmUgICAgIFZJQV9SRVNfNjQwWDQ4MCAgICAgICAgICAgICAgICAgCTAKKyNkZWZpbmUgICAgIFZJQV9SRVNfODAwWDYwMCAgICAgICAgICAgICAgICAgCTEKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTAyNFg3NjggICAgICAgICAgICAgICAgCTIKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTE1Mlg4NjQgICAgICAgICAgICAgICAgCTMKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTI4MFgxMDI0ICAgICAgICAgICAgICAgCTQKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTYwMFgxMjAwICAgICAgICAgICAgICAgCTUKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTQ0MFgxMDUwICAgICAgICAgICAgICAgCTYKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTI4MFg3NjggICAgICAgICAgICAgICAgCTcKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTI4MFg5NjAgICAgICAgICAgICAgICAgCTgKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTkyMFgxNDQwICAgICAgICAgICAgICAgCTkKKyNkZWZpbmUgICAgIFZJQV9SRVNfODQ4WDQ4MCAgICAgICAgICAgICAgICAgCTEwCisjZGVmaW5lICAgICBWSUFfUkVTXzE0MDBYMTA1MCAgICAgICAgICAgICAgIAkxMQorI2RlZmluZSAgICAgVklBX1JFU183MjBYNDgwICAgICAgICAgICAgICAgICAJMTIKKyNkZWZpbmUgICAgIFZJQV9SRVNfNzIwWDU3NiAgICAgICAgICAgICAgICAgCTEzCisjZGVmaW5lICAgICBWSUFfUkVTXzEwMjRYNTEyICAgICAgICAgICAgICAgIAkxNAorI2RlZmluZSAgICAgVklBX1JFU184NTZYNDgwICAgICAgICAgICAgICAgICAJMTUKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTAyNFg1NzYgICAgICAgICAgICAgICAgCTE2CisjZGVmaW5lICAgICBWSUFfUkVTXzY0MFg0MDAgICAgICAgICAgICAgICAgIAkxNworI2RlZmluZSAgICAgVklBX1JFU18xMjgwWDcyMCAgICAgICAgICAgICAgICAJMTgKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTkyMFgxMDgwICAgICAgICAgICAgICAgCTE5CisjZGVmaW5lICAgICBWSUFfUkVTXzgwMFg0ODAgICAgICAgICAgICAgICAgIAkyMAorI2RlZmluZSAgICAgVklBX1JFU18xMzY4WDc2OCAgICAgICAgICAgICAgICAJMjEKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTAyNFg2MDAgICAgICAgICAgICAgICAgCTIyCisjZGVmaW5lICAgICBWSUFfUkVTXzEyODBYODAwICAgICAgICAgICAgICAgIAkyMworI2RlZmluZSAgICAgVklBX1JFU18xNjgwWDEwNTAgICAgICAgICAgICAgICAJMjQKKyNkZWZpbmUgICAgIFZJQV9SRVNfOTYwWDYwMAkJCTI1CisjZGVmaW5lICAgICBWSUFfUkVTXzEwMDBYNjAwICAgICAgICAgICAgICAgCTI2CisjZGVmaW5lICAgICBWSUFfUkVTXzEwODhYNjEyICAgICAgICAgICAgICAgCTI3CisjZGVmaW5lICAgICBWSUFfUkVTXzExNTJYNzIwICAgICAgICAgICAgICAgCTI4CisjZGVmaW5lICAgICBWSUFfUkVTXzEyMDBYNzIwICAgICAgICAgICAgICAgCTI5CisjZGVmaW5lICAgICBWSUFfUkVTXzEyODBYNjAwICAgICAgICAgICAgICAgCTMwCisjZGVmaW5lICAgICBWSUFfUkVTXzEzNjBYNzY4ICAgICAgICAgICAgICAgCTMxCisjZGVmaW5lICAgICBWSUFfUkVTXzEzNjZYNzY4ICAgICAgICAgICAgICAgCTMyCisjZGVmaW5lICAgICBWSUFfUkVTXzE0NDBYOTAwICAgICAgICAgICAgICAgCTMzCisjZGVmaW5lICAgICBWSUFfUkVTXzE2MDBYOTAwICAgICAgICAgICAgICAgCTM0CisjZGVmaW5lICAgICBWSUFfUkVTXzE2MDBYMTAyNCAgICAgICAgICAgICAgCTM1CisjZGVmaW5lICAgICBWSUFfUkVTXzE3OTJYMTM0NCAgICAgICAgICAgICAgCTM2CisjZGVmaW5lICAgICBWSUFfUkVTXzE4NTZYMTM5MiAgICAgICAgICAgICAgCTM3CisjZGVmaW5lICAgICBWSUFfUkVTXzE5MjBYMTIwMCAgICAgICAgICAgICAgCTM4CisjZGVmaW5lICAgICBWSUFfUkVTXzIwNDhYMTUzNiAgICAgICAgICAgICAgCTM5CisjZGVmaW5lICAgICBWSUFfUkVTXzQ4MFg2NDAgICAgICAgICAgICAgICAgICAJNDAKKworLypSZWR1Y2UgQmxhbmtpbmcqLworI2RlZmluZSAgICAgVklBX1JFU18xMzYwWDc2OF9SQiAgICAgICAgICAJMTMxCisjZGVmaW5lICAgICBWSUFfUkVTXzE0NDBYOTAwX1JCICAgICAgICAgIAkxMzMKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTQwMFgxMDUwX1JCICAgICAgICAJMTExCisjZGVmaW5lICAgICBWSUFfUkVTXzE2MDBYOTAwX1JCICAgICAgICAgIAkxMzQKKyNkZWZpbmUgICAgIFZJQV9SRVNfMTY4MFgxMDUwX1JCICAgICAgICAJMTI0CisjZGVmaW5lICAgICBWSUFfUkVTXzE5MjBYMTA4MF9SQiAgICAgICAgCTExOQorI2RlZmluZSAgICAgVklBX1JFU18xOTIwWDEyMDBfUkIgICAgICAgIAkxMzgKKworI2RlZmluZSAgICAgVklBX1JFU19JTlZBTElEICAgICAgICAgICAgICAgICAJMjU1CisKKy8qIHN0YW5kYXJkIFZHQSBJTyBwb3J0CisqLworI2RlZmluZSBWSUFSTWlzYyAgICAweDNDQworI2RlZmluZSBWSUFXTWlzYyAgICAweDNDMgorI2RlZmluZSBWSUFTdGF0dXMgICAweDNEQQorI2RlZmluZSBWSUFDUiAgICAgICAweDNENAorI2RlZmluZSBWSUFTUiAgICAgICAweDNDNAorI2RlZmluZSBWSUFHUiAgICAgICAweDNDRQorI2RlZmluZSBWSUFBUiAgICAgICAweDNDMAorCisjZGVmaW5lIFN0ZENSICAgICAgIDB4MTkKKyNkZWZpbmUgU3RkU1IgICAgICAgMHgwNAorI2RlZmluZSBTdGRHUiAgICAgICAweDA5CisjZGVmaW5lIFN0ZEFSICAgICAgIDB4MTQKKworI2RlZmluZSBQYXRjaENSICAgICAxMQorCisvKiBEaXNwbGF5IHBhdGggKi8KKyNkZWZpbmUgSUdBMSAgICAgICAgMQorI2RlZmluZSBJR0EyICAgICAgICAyCisjZGVmaW5lIElHQTFfSUdBMiAgIDMKKworLyogRGVmaW5lIENvbG9yIERlcHRoICAqLworI2RlZmluZSBNT0RFXzhCUFAgICAgICAgMQorI2RlZmluZSBNT0RFXzE2QlBQICAgICAgMgorI2RlZmluZSBNT0RFXzMyQlBQICAgICAgNAorCisjZGVmaW5lIEdSMjAgICAgMHgyMAorI2RlZmluZSBHUjIxICAgIDB4MjEKKyNkZWZpbmUgR1IyMiAgICAweDIyCisKKy8qIFNlcXVlbmNlciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU1IwMSAgICAweDAxCisjZGVmaW5lIFNSMTAgICAgMHgxMAorI2RlZmluZSBTUjEyICAgIDB4MTIKKyNkZWZpbmUgU1IxNSAgICAweDE1CisjZGVmaW5lIFNSMTYgICAgMHgxNgorI2RlZmluZSBTUjE3ICAgIDB4MTcKKyNkZWZpbmUgU1IxOCAgICAweDE4CisjZGVmaW5lIFNSMUIgICAgMHgxQgorI2RlZmluZSBTUjFBICAgIDB4MUEKKyNkZWZpbmUgU1IxQyAgICAweDFDCisjZGVmaW5lIFNSMUQgICAgMHgxRAorI2RlZmluZSBTUjFFICAgIDB4MUUKKyNkZWZpbmUgU1IxRiAgICAweDFGCisjZGVmaW5lIFNSMjAgICAgMHgyMAorI2RlZmluZSBTUjIxICAgIDB4MjEKKyNkZWZpbmUgU1IyMiAgICAweDIyCisjZGVmaW5lIFNSMkEgICAgMHgyQQorI2RlZmluZSBTUjJEICAgIDB4MkQKKyNkZWZpbmUgU1IyRSAgICAweDJFCisKKyNkZWZpbmUgU1IzMCAgICAweDMwCisjZGVmaW5lIFNSMzkgICAgMHgzOQorI2RlZmluZSBTUjNEICAgIDB4M0QKKyNkZWZpbmUgU1IzRSAgICAweDNFCisjZGVmaW5lIFNSM0YgICAgMHgzRgorI2RlZmluZSBTUjQwICAgIDB4NDAKKyNkZWZpbmUgU1I0MyAgICAweDQzCisjZGVmaW5lIFNSNDQgICAgMHg0NAorI2RlZmluZSBTUjQ1ICAgIDB4NDUKKyNkZWZpbmUgU1I0NiAgICAweDQ2CisjZGVmaW5lIFNSNDcgICAgMHg0NworI2RlZmluZSBTUjQ4ICAgIDB4NDgKKyNkZWZpbmUgU1I0OSAgICAweDQ5CisjZGVmaW5lIFNSNEEgICAgMHg0QQorI2RlZmluZSBTUjRCICAgIDB4NEIKKyNkZWZpbmUgU1I0QyAgICAweDRDCisjZGVmaW5lIFNSNTIgICAgMHg1MgorI2RlZmluZSBTUjVFICAgIDB4NUUKKyNkZWZpbmUgU1I2NSAgICAweDY1CisKKy8qIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBDUjAwICAgIDB4MDAKKyNkZWZpbmUgQ1IwMSAgICAweDAxCisjZGVmaW5lIENSMDIgICAgMHgwMgorI2RlZmluZSBDUjAzICAgIDB4MDMKKyNkZWZpbmUgQ1IwNCAgICAweDA0CisjZGVmaW5lIENSMDUgICAgMHgwNQorI2RlZmluZSBDUjA2ICAgIDB4MDYKKyNkZWZpbmUgQ1IwNyAgICAweDA3CisjZGVmaW5lIENSMDggICAgMHgwOAorI2RlZmluZSBDUjA5ICAgIDB4MDkKKyNkZWZpbmUgQ1IwQSAgICAweDBBCisjZGVmaW5lIENSMEIgICAgMHgwQgorI2RlZmluZSBDUjBDICAgIDB4MEMKKyNkZWZpbmUgQ1IwRCAgICAweDBECisjZGVmaW5lIENSMEUgICAgMHgwRQorI2RlZmluZSBDUjBGICAgIDB4MEYKKyNkZWZpbmUgQ1IxMCAgICAweDEwCisjZGVmaW5lIENSMTEgICAgMHgxMQorI2RlZmluZSBDUjEyICAgIDB4MTIKKyNkZWZpbmUgQ1IxMyAgICAweDEzCisjZGVmaW5lIENSMTQgICAgMHgxNAorI2RlZmluZSBDUjE1ICAgIDB4MTUKKyNkZWZpbmUgQ1IxNiAgICAweDE2CisjZGVmaW5lIENSMTcgICAgMHgxNworI2RlZmluZSBDUjE4ICAgIDB4MTgKKworLyogRXh0ZW5kIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBDUjMwICAgIDB4MzAKKyNkZWZpbmUgQ1IzMSAgICAweDMxCisjZGVmaW5lIENSMzIgICAgMHgzMgorI2RlZmluZSBDUjMzICAgIDB4MzMKKyNkZWZpbmUgQ1IzNCAgICAweDM0CisjZGVmaW5lIENSMzUgICAgMHgzNQorI2RlZmluZSBDUjM2ICAgIDB4MzYKKyNkZWZpbmUgQ1IzNyAgICAweDM3CisjZGVmaW5lIENSMzggICAgMHgzOAorI2RlZmluZSBDUjM5ICAgIDB4MzkKKyNkZWZpbmUgQ1IzQSAgICAweDNBCisjZGVmaW5lIENSM0IgICAgMHgzQgorI2RlZmluZSBDUjNDICAgIDB4M0MKKyNkZWZpbmUgQ1IzRCAgICAweDNECisjZGVmaW5lIENSM0UgICAgMHgzRQorI2RlZmluZSBDUjNGICAgIDB4M0YKKyNkZWZpbmUgQ1I0MCAgICAweDQwCisjZGVmaW5lIENSNDEgICAgMHg0MQorI2RlZmluZSBDUjQyICAgIDB4NDIKKyNkZWZpbmUgQ1I0MyAgICAweDQzCisjZGVmaW5lIENSNDQgICAgMHg0NAorI2RlZmluZSBDUjQ1ICAgIDB4NDUKKyNkZWZpbmUgQ1I0NiAgICAweDQ2CisjZGVmaW5lIENSNDcgICAgMHg0NworI2RlZmluZSBDUjQ4ICAgIDB4NDgKKyNkZWZpbmUgQ1I0OSAgICAweDQ5CisjZGVmaW5lIENSNEEgICAgMHg0QQorI2RlZmluZSBDUjRCICAgIDB4NEIKKyNkZWZpbmUgQ1I0QyAgICAweDRDCisjZGVmaW5lIENSNEQgICAgMHg0RAorI2RlZmluZSBDUjRFICAgIDB4NEUKKyNkZWZpbmUgQ1I0RiAgICAweDRGCisjZGVmaW5lIENSNTAgICAgMHg1MAorI2RlZmluZSBDUjUxICAgIDB4NTEKKyNkZWZpbmUgQ1I1MiAgICAweDUyCisjZGVmaW5lIENSNTMgICAgMHg1MworI2RlZmluZSBDUjU0ICAgIDB4NTQKKyNkZWZpbmUgQ1I1NSAgICAweDU1CisjZGVmaW5lIENSNTYgICAgMHg1NgorI2RlZmluZSBDUjU3ICAgIDB4NTcKKyNkZWZpbmUgQ1I1OCAgICAweDU4CisjZGVmaW5lIENSNTkgICAgMHg1OQorI2RlZmluZSBDUjVBICAgIDB4NUEKKyNkZWZpbmUgQ1I1QiAgICAweDVCCisjZGVmaW5lIENSNUMgICAgMHg1QworI2RlZmluZSBDUjVEICAgIDB4NUQKKyNkZWZpbmUgQ1I1RSAgICAweDVFCisjZGVmaW5lIENSNUYgICAgMHg1RgorI2RlZmluZSBDUjYwICAgIDB4NjAKKyNkZWZpbmUgQ1I2MSAgICAweDYxCisjZGVmaW5lIENSNjIgICAgMHg2MgorI2RlZmluZSBDUjYzICAgIDB4NjMKKyNkZWZpbmUgQ1I2NCAgICAweDY0CisjZGVmaW5lIENSNjUgICAgMHg2NQorI2RlZmluZSBDUjY2ICAgIDB4NjYKKyNkZWZpbmUgQ1I2NyAgICAweDY3CisjZGVmaW5lIENSNjggICAgMHg2OAorI2RlZmluZSBDUjY5ICAgIDB4NjkKKyNkZWZpbmUgQ1I2QSAgICAweDZBCisjZGVmaW5lIENSNkIgICAgMHg2QgorI2RlZmluZSBDUjZDICAgIDB4NkMKKyNkZWZpbmUgQ1I2RCAgICAweDZECisjZGVmaW5lIENSNkUgICAgMHg2RQorI2RlZmluZSBDUjZGICAgIDB4NkYKKyNkZWZpbmUgQ1I3MCAgICAweDcwCisjZGVmaW5lIENSNzEgICAgMHg3MQorI2RlZmluZSBDUjcyICAgIDB4NzIKKyNkZWZpbmUgQ1I3MyAgICAweDczCisjZGVmaW5lIENSNzQgICAgMHg3NAorI2RlZmluZSBDUjc1ICAgIDB4NzUKKyNkZWZpbmUgQ1I3NiAgICAweDc2CisjZGVmaW5lIENSNzcgICAgMHg3NworI2RlZmluZSBDUjc4ICAgIDB4NzgKKyNkZWZpbmUgQ1I3OSAgICAweDc5CisjZGVmaW5lIENSN0EgICAgMHg3QQorI2RlZmluZSBDUjdCICAgIDB4N0IKKyNkZWZpbmUgQ1I3QyAgICAweDdDCisjZGVmaW5lIENSN0QgICAgMHg3RAorI2RlZmluZSBDUjdFICAgIDB4N0UKKyNkZWZpbmUgQ1I3RiAgICAweDdGCisjZGVmaW5lIENSODAgICAgMHg4MAorI2RlZmluZSBDUjgxICAgIDB4ODEKKyNkZWZpbmUgQ1I4MiAgICAweDgyCisjZGVmaW5lIENSODMgICAgMHg4MworI2RlZmluZSBDUjg0ICAgIDB4ODQKKyNkZWZpbmUgQ1I4NSAgICAweDg1CisjZGVmaW5lIENSODYgICAgMHg4NgorI2RlZmluZSBDUjg3ICAgIDB4ODcKKyNkZWZpbmUgQ1I4OCAgICAweDg4CisjZGVmaW5lIENSODkgICAgMHg4OQorI2RlZmluZSBDUjhBICAgIDB4OEEKKyNkZWZpbmUgQ1I4QiAgICAweDhCCisjZGVmaW5lIENSOEMgICAgMHg4QworI2RlZmluZSBDUjhEICAgIDB4OEQKKyNkZWZpbmUgQ1I4RSAgICAweDhFCisjZGVmaW5lIENSOEYgICAgMHg4RgorI2RlZmluZSBDUjkwICAgIDB4OTAKKyNkZWZpbmUgQ1I5MSAgICAweDkxCisjZGVmaW5lIENSOTIgICAgMHg5MgorI2RlZmluZSBDUjkzICAgIDB4OTMKKyNkZWZpbmUgQ1I5NCAgICAweDk0CisjZGVmaW5lIENSOTUgICAgMHg5NQorI2RlZmluZSBDUjk2ICAgIDB4OTYKKyNkZWZpbmUgQ1I5NyAgICAweDk3CisjZGVmaW5lIENSOTggICAgMHg5OAorI2RlZmluZSBDUjk5ICAgIDB4OTkKKyNkZWZpbmUgQ1I5QSAgICAweDlBCisjZGVmaW5lIENSOUIgICAgMHg5QgorI2RlZmluZSBDUjlDICAgIDB4OUMKKyNkZWZpbmUgQ1I5RCAgICAweDlECisjZGVmaW5lIENSOUUgICAgMHg5RQorI2RlZmluZSBDUjlGICAgIDB4OUYKKyNkZWZpbmUgQ1JBMCAgICAweEEwCisjZGVmaW5lIENSQTEgICAgMHhBMQorI2RlZmluZSBDUkEyICAgIDB4QTIKKyNkZWZpbmUgQ1JBMyAgICAweEEzCisjZGVmaW5lIENSRDIgICAgMHhEMgorI2RlZmluZSBDUkQzICAgIDB4RDMKKyNkZWZpbmUgQ1JENCAgICAweEQ0CisKKy8qIExVVCBUYWJsZSovCisjZGVmaW5lIExVVF9EQVRBICAgICAgICAgICAgIDB4M0M5CS8qIERBQ0RBVEEgKi8KKyNkZWZpbmUgTFVUX0lOREVYX1JFQUQgICAgICAgMHgzQzcJLyogREFDUlggKi8KKyNkZWZpbmUgTFVUX0lOREVYX1dSSVRFICAgICAgMHgzQzgJLyogREFDV1ggKi8KKyNkZWZpbmUgREFDTUFTSyAgICAgICAgICAgICAgMHgzQzYKKworLyogRGVmaW5pdGlvbiBEZXZpY2UgKi8KKyNkZWZpbmUgREVWSUNFX0NSVCAgMHgwMQorI2RlZmluZSBERVZJQ0VfRFZJICAweDAzCisjZGVmaW5lIERFVklDRV9MQ0QgIDB4MDQKKworLyogRGV2aWNlIG91dHB1dCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgSU5URVJGQUNFX05PTkUgICAgICAgICAgMHgwMAorI2RlZmluZSBJTlRFUkZBQ0VfQU5BTE9HX1JHQiAgICAweDAxCisjZGVmaW5lIElOVEVSRkFDRV9EVlAwICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSU5URVJGQUNFX0RWUDEgICAgICAgICAgMHgwMworI2RlZmluZSBJTlRFUkZBQ0VfREZQX0hJR0ggICAgICAweDA0CisjZGVmaW5lIElOVEVSRkFDRV9ERlBfTE9XICAgICAgIDB4MDUKKyNkZWZpbmUgSU5URVJGQUNFX0RGUCAgICAgICAgICAgMHgwNgorI2RlZmluZSBJTlRFUkZBQ0VfTFZEUzAgICAgICAgICAweDA3CisjZGVmaW5lIElOVEVSRkFDRV9MVkRTMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgSU5URVJGQUNFX0xWRFMwTFZEUzEgICAgMHgwOQorI2RlZmluZSBJTlRFUkZBQ0VfVE1EUyAgICAgICAgICAweDBBCisKKyNkZWZpbmUgSFdfTEFZT1VUX0xDRF9PTkxZICAgICAgMHgwMQorI2RlZmluZSBIV19MQVlPVVRfRFZJX09OTFkgICAgICAweDAyCisjZGVmaW5lIEhXX0xBWU9VVF9MQ0RfRFZJICAgICAgIDB4MDMKKyNkZWZpbmUgSFdfTEFZT1VUX0xDRDFfTENEMiAgICAgMHgwNAorI2RlZmluZSBIV19MQVlPVVRfTENEX0VYVEVSTkFMX0xDRDIgMHgxMAorCisvKiBEZWZpbml0aW9uIFJlZnJlc2ggUmF0ZSAqLworI2RlZmluZSBSRUZSRVNIXzUwICAgICAgNTAKKyNkZWZpbmUgUkVGUkVTSF82MCAgICAgIDYwCisjZGVmaW5lIFJFRlJFU0hfNzUgICAgICA3NQorI2RlZmluZSBSRUZSRVNIXzg1ICAgICAgODUKKyNkZWZpbmUgUkVGUkVTSF8xMDAgICAgIDEwMAorI2RlZmluZSBSRUZSRVNIXzEyMCAgICAgMTIwCisKKy8qIERlZmluaXRpb24gU3luYyBQb2xhcml0eSovCisjZGVmaW5lIE5FR0FUSVZFICAgICAgICAxCisjZGVmaW5lIFBPU0lUSVZFICAgICAgICAwCisKKy8qNDgweDY0MEA2MCBTeW5jIFBvbGFyaXR5IChHVEYpCisqLworI2RlZmluZSBNNDgwWDY0MF9SNjBfSFNQICAgICAgICBORUdBVElWRQorI2RlZmluZSBNNDgwWDY0MF9SNjBfVlNQICAgICAgICBQT1NJVElWRQorCisvKjY0MHg0ODBANjAgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTY0MFg0ODBfUjYwX0hTUCAgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTY0MFg0ODBfUjYwX1ZTUCAgICAgICAgTkVHQVRJVkUKKworLyo2NDB4NDgwQDc1IFN5bmMgUG9sYXJpdHkgKFZFU0EgTW9kZSkKKyovCisjZGVmaW5lIE02NDBYNDgwX1I3NV9IU1AgICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE02NDBYNDgwX1I3NV9WU1AgICAgICAgIE5FR0FUSVZFCisKKy8qNjQweDQ4MEA4NSBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNNjQwWDQ4MF9SODVfSFNQICAgICAgICBORUdBVElWRQorI2RlZmluZSBNNjQwWDQ4MF9SODVfVlNQICAgICAgICBORUdBVElWRQorCisvKjY0MHg0ODBAMTAwIFN5bmMgUG9sYXJpdHkgKEdURiBNb2RlKQorKi8KKyNkZWZpbmUgTTY0MFg0ODBfUjEwMF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTY0MFg0ODBfUjEwMF9WU1AgICAgICAgUE9TSVRJVkUKKworLyo2NDB4NDgwQDEyMCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkKKyovCisjZGVmaW5lIE02NDBYNDgwX1IxMjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE02NDBYNDgwX1IxMjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qNzIweDQ4MEA2MCBTeW5jIFBvbGFyaXR5ICAoR1RGIE1vZGUpCisqLworI2RlZmluZSBNNzIwWDQ4MF9SNjBfSFNQICAgICAgICBORUdBVElWRQorI2RlZmluZSBNNzIwWDQ4MF9SNjBfVlNQICAgICAgICBQT1NJVElWRQorCisvKjcyMHg1NzZANjAgU3luYyBQb2xhcml0eSAgKEdURiBNb2RlKQorKi8KKyNkZWZpbmUgTTcyMFg1NzZfUjYwX0hTUCAgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTcyMFg1NzZfUjYwX1ZTUCAgICAgICAgUE9TSVRJVkUKKworLyo4MDB4NjAwQDYwIFN5bmMgUG9sYXJpdHkgKFZFU0EgTW9kZSkKKyovCisjZGVmaW5lIE04MDBYNjAwX1I2MF9IU1AgICAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE04MDBYNjAwX1I2MF9WU1AgICAgICAgIFBPU0lUSVZFCisKKy8qODAweDYwMEA3NSBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNODAwWDYwMF9SNzVfSFNQICAgICAgICBQT1NJVElWRQorI2RlZmluZSBNODAwWDYwMF9SNzVfVlNQICAgICAgICBQT1NJVElWRQorCisvKjgwMHg2MDBAODUgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTgwMFg2MDBfUjg1X0hTUCAgICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTgwMFg2MDBfUjg1X1ZTUCAgICAgICAgUE9TSVRJVkUKKworLyo4MDB4NjAwQDEwMCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkKKyovCisjZGVmaW5lIE04MDBYNjAwX1IxMDBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE04MDBYNjAwX1IxMDBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qODAweDYwMEAxMjAgU3luYyBQb2xhcml0eSAoR1RGIE1vZGUpCisqLworI2RlZmluZSBNODAwWDYwMF9SMTIwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNODAwWDYwMF9SMTIwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKjgwMHg0ODBANjAgU3luYyBQb2xhcml0eSAgKENWVCBNb2RlKQorKi8KKyNkZWZpbmUgTTgwMFg0ODBfUjYwX0hTUCAgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTgwMFg0ODBfUjYwX1ZTUCAgICAgICAgUE9TSVRJVkUKKworLyo4NDh4NDgwQDYwIFN5bmMgUG9sYXJpdHkgIChDVlQgTW9kZSkKKyovCisjZGVmaW5lIE04NDhYNDgwX1I2MF9IU1AgICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE04NDhYNDgwX1I2MF9WU1AgICAgICAgIFBPU0lUSVZFCisKKy8qODUyeDQ4MEA2MCBTeW5jIFBvbGFyaXR5ICAoR1RGIE1vZGUpCisqLworI2RlZmluZSBNODUyWDQ4MF9SNjBfSFNQICAgICAgICBORUdBVElWRQorI2RlZmluZSBNODUyWDQ4MF9SNjBfVlNQICAgICAgICBQT1NJVElWRQorCisvKjEwMjR4NTEyQDYwIFN5bmMgUG9sYXJpdHkgKEdURiBNb2RlKQorKi8KKyNkZWZpbmUgTTEwMjRYNTEyX1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEwMjRYNTEyX1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyoxMDI0eDYwMEA2MCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkKKyovCisjZGVmaW5lIE0xMDI0WDYwMF9SNjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xMDI0WDYwMF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qMTAyNHg3NjhANjAgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTEwMjRYNzY4X1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEwMjRYNzY4X1I2MF9WU1AgICAgICAgTkVHQVRJVkUKKworLyoxMDI0eDc2OEA3NSBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNMTAyNFg3NjhfUjc1X0hTUCAgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTAyNFg3NjhfUjc1X1ZTUCAgICAgICBQT1NJVElWRQorCisvKjEwMjR4NzY4QDg1IFN5bmMgUG9sYXJpdHkgKFZFU0EgTW9kZSkKKyovCisjZGVmaW5lIE0xMDI0WDc2OF9SODVfSFNQICAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE0xMDI0WDc2OF9SODVfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qMTAyNHg3NjhAMTAwIFN5bmMgUG9sYXJpdHkgKEdURiBNb2RlKQorKi8KKyNkZWZpbmUgTTEwMjRYNzY4X1IxMDBfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEwMjRYNzY4X1IxMDBfVlNQICAgICAgUE9TSVRJVkUKKworLyoxMTUyeDg2NEA3NSBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNMTE1Mlg4NjRfUjc1X0hTUCAgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTE1Mlg4NjRfUjc1X1ZTUCAgICAgICBQT1NJVElWRQorCisvKjEyODB4NzIwQDYwIFN5bmMgUG9sYXJpdHkgIChHVEYgTW9kZSkKKyovCisjZGVmaW5lIE0xMjgwWDcyMF9SNjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xMjgwWDcyMF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qIDEyODB4NzY4QDUwIFN5bmMgUG9sYXJpdHkgIChHVEYgTW9kZSkgKi8KKyNkZWZpbmUgTTEyODBYNzY4X1I1MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEyODBYNzY4X1I1MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyoxMjgweDc2OEA2MCBTeW5jIFBvbGFyaXR5ICAoR1RGIE1vZGUpCisqLworI2RlZmluZSBNMTI4MFg3NjhfUjYwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTI4MFg3NjhfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKjEyODB4ODAwQDYwIFN5bmMgUG9sYXJpdHkgIChDVlQgTW9kZSkKKyovCisjZGVmaW5lIE0xMjgwWDgwMF9SNjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xMjgwWDgwMF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qMTI4MHg5NjBANjAgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTEyODBYOTYwX1I2MF9IU1AgICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTEyODBYOTYwX1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyoxMjgweDEwMjRANjAgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTEyODBYMTAyNF9SNjBfSFNQICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTEyODBYMTAyNF9SNjBfVlNQICAgICAgUE9TSVRJVkUKKworLyogMTM2MHg3NjhANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0xMzYwWDc2OF9SNjBfSFNQICAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE0xMzYwWDc2OF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qIDEzNjB4NzY4QDYwIFN5bmMgUG9sYXJpdHkgKENWVCBSZWR1Y2UgQmxhbmtpbmcgTW9kZSkgKi8KKyNkZWZpbmUgTTEzNjBYNzY4X1JCX1I2MF9IU1AgICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTEzNjBYNzY4X1JCX1I2MF9WU1AgICAgICAgTkVHQVRJVkUKKworLyogMTM2OHg3NjhANTAgU3luYyBQb2xhcml0eSAoR1RGIE1vZGUpICovCisjZGVmaW5lIE0xMzY4WDc2OF9SNTBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xMzY4WDc2OF9SNTBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qIDEzNjh4NzY4QDYwIFN5bmMgUG9sYXJpdHkgKFZFU0EgTW9kZSkgKi8KKyNkZWZpbmUgTTEzNjhYNzY4X1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEzNjhYNzY4X1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyoxMjgweDEwMjRANzUgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTEyODBYMTAyNF9SNzVfSFNQICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTEyODBYMTAyNF9SNzVfVlNQICAgICAgUE9TSVRJVkUKKworLyoxMjgweDEwMjRAODUgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTEyODBYMTAyNF9SODVfSFNQICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTEyODBYMTAyNF9SODVfVlNQICAgICAgUE9TSVRJVkUKKworLyoxNDQweDEwNTBANjAgU3luYyBQb2xhcml0eSAoR1RGIE1vZGUpCisqLworI2RlZmluZSBNMTQ0MFgxMDUwX1I2MF9IU1AgICAgICBORUdBVElWRQorI2RlZmluZSBNMTQ0MFgxMDUwX1I2MF9WU1AgICAgICBQT1NJVElWRQorCisvKjE2MDB4MTIwMEA2MCBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNMTYwMFgxMjAwX1I2MF9IU1AgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTYwMFgxMjAwX1I2MF9WU1AgICAgICBQT1NJVElWRQorCisvKjE2MDB4MTIwMEA3NSBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpCisqLworI2RlZmluZSBNMTYwMFgxMjAwX1I3NV9IU1AgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTYwMFgxMjAwX1I3NV9WU1AgICAgICBQT1NJVElWRQorCisvKiAxNjgweDEwNTBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0xNjgweDEwNTBfUjYwX0hTUCAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xNjgweDEwNTBfUjYwX1ZTUCAgICAgIE5FR0FUSVZFCisKKy8qIDE2ODB4MTA1MEA2MCBTeW5jIFBvbGFyaXR5IChDVlQgUmVkdWNlIEJsYW5raW5nIE1vZGUpICovCisjZGVmaW5lIE0xNjgweDEwNTBfUkJfUjYwX0hTUCAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE0xNjgweDEwNTBfUkJfUjYwX1ZTUCAgICAgIE5FR0FUSVZFCisKKy8qIDE2ODB4MTA1MEA3NSBTeW5jIFBvbGFyaXR5IChDVlQgTW9kZSkgKi8KKyNkZWZpbmUgTTE2ODB4MTA1MF9SNzVfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTE2ODB4MTA1MF9SNzVfVlNQICAgICAgUE9TSVRJVkUKKworLyoxOTIweDEwODBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpCisqLworI2RlZmluZSBNMTkyMFgxMDgwX1I2MF9IU1AgICAgICBORUdBVElWRQorI2RlZmluZSBNMTkyMFgxMDgwX1I2MF9WU1AgICAgICBQT1NJVElWRQorCisvKiAxOTIweDEwODBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIFJlZHVjZSBCbGFua2luZyBNb2RlKSAqLworI2RlZmluZSBNMTkyMFgxMDgwX1JCX1I2MF9IU1AgIFBPU0lUSVZFCisjZGVmaW5lIE0xOTIwWDEwODBfUkJfUjYwX1ZTUCAgTkVHQVRJVkUKKworLyoxOTIweDE0NDBANjAgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTE5MjBYMTQ0MF9SNjBfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTE5MjBYMTQ0MF9SNjBfVlNQICAgICAgUE9TSVRJVkUKKworLyoxOTIweDE0NDBANzUgU3luYyBQb2xhcml0eSAoVkVTQSBNb2RlKQorKi8KKyNkZWZpbmUgTTE5MjBYMTQ0MF9SNzVfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTE5MjBYMTQ0MF9SNzVfVlNQICAgICAgUE9TSVRJVkUKKworI2lmIDAKKy8qIDE0MDB4MTA1MEA2MCBTeW5jIFBvbGFyaXR5IChWRVNBIE1vZGUpICovCisjZGVmaW5lIE0xNDAwWDEwNTBfUjYwX0hTUCAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xNDAwWDEwNTBfUjYwX1ZTUCAgICAgIE5FR0FUSVZFCisjZW5kaWYKKworLyogMTQwMHgxMDUwQDYwIFN5bmMgUG9sYXJpdHkgKENWVCBNb2RlKSAqLworI2RlZmluZSBNMTQwMFgxMDUwX1I2MF9IU1AgICAgICBORUdBVElWRQorI2RlZmluZSBNMTQwMFgxMDUwX1I2MF9WU1AgICAgICBQT1NJVElWRQorCisvKiAxNDAweDEwNTBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIFJlZHVjZSBCbGFua2luZyBNb2RlKSAqLworI2RlZmluZSBNMTQwMFgxMDUwX1JCX1I2MF9IU1AgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTQwMFgxMDUwX1JCX1I2MF9WU1AgICAgICBORUdBVElWRQorCisvKiAxNDAweDEwNTBANzUgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0xNDAwWDEwNTBfUjc1X0hTUCAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xNDAwWDEwNTBfUjc1X1ZTUCAgICAgIFBPU0lUSVZFCisKKy8qIDk2MHg2MDBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE05NjBYNjAwX1I2MF9IU1AgICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE05NjBYNjAwX1I2MF9WU1AgICAgICAgIFBPU0lUSVZFCisKKy8qIDEwMDB4NjAwQDYwIFN5bmMgUG9sYXJpdHkgKEdURiBNb2RlKSAqLworI2RlZmluZSBNMTAwMFg2MDBfUjYwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTAwMFg2MDBfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxMDI0eDU3NkA2MCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkgKi8KKyNkZWZpbmUgTTEwMjRYNTc2X1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEwMjRYNTc2X1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyoxMDI0eDYwMEA2MCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkqLworI2RlZmluZSBNMTAyNFg2MDBfUjYwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTAyNFg2MDBfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxMDg4eDYxMkA2MCBTeW5jIFBvbGFyaXR5IChDVlQgTW9kZSkgKi8KKyNkZWZpbmUgTTEwODhYNjEyX1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEwODhYNjEyX1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyogMTE1Mng3MjBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0xMTUyWDcyMF9SNjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xMTUyWDcyMF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qIDEyMDB4NzIwQDYwIFN5bmMgUG9sYXJpdHkgKEdURiBNb2RlKSAqLworI2RlZmluZSBNMTIwMFg3MjBfUjYwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTIwMFg3MjBfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxMjgweDYwMEA2MCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkgKi8KKyNkZWZpbmUgTTEyODB4NjAwX1I2MF9IU1AgICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTEyODB4NjAwX1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyogMTI4MHg3MjBANTAgU3luYyBQb2xhcml0eSAgKEdURiBNb2RlKSAqLworI2RlZmluZSBNMTI4MFg3MjBfUjUwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTI4MFg3MjBfUjUwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxMjgweDcyMEA2MCBTeW5jIFBvbGFyaXR5ICAoQ0VBIE1vZGUpICovCisjZGVmaW5lIE0xMjgwWDcyMF9DRUFfUjYwX0hTUCAgICAgICBQT1NJVElWRQorI2RlZmluZSBNMTI4MFg3MjBfQ0VBX1I2MF9WU1AgICAgICAgUE9TSVRJVkUKKworLyogMTQ0MHg5MDBANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0xNDQwWDkwMF9SNjBfSFNQICAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xNDQwWDkwMF9SNjBfVlNQICAgICAgIFBPU0lUSVZFCisKKy8qIDE0NDB4OTAwQDc1IFN5bmMgUG9sYXJpdHkgKENWVCBNb2RlKSAqLworI2RlZmluZSBNMTQ0MFg5MDBfUjc1X0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTQ0MFg5MDBfUjc1X1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxNDQweDkwMEA2MCBTeW5jIFBvbGFyaXR5IChDVlQgUmVkdWNlIEJsYW5raW5nIE1vZGUpICovCisjZGVmaW5lIE0xNDQwWDkwMF9SQl9SNjBfSFNQICAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE0xNDQwWDkwMF9SQl9SNjBfVlNQICAgICAgIE5FR0FUSVZFCisKKy8qIDE2MDB4OTAwQDYwIFN5bmMgUG9sYXJpdHkgKENWVCBNb2RlKSAqLworI2RlZmluZSBNMTYwMFg5MDBfUjYwX0hTUCAgICAgICBORUdBVElWRQorI2RlZmluZSBNMTYwMFg5MDBfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAxNjAweDkwMEA2MCBTeW5jIFBvbGFyaXR5IChDVlQgUmVkdWNlIEJsYW5raW5nIE1vZGUpICovCisjZGVmaW5lIE0xNjAwWDkwMF9SQl9SNjBfSFNQICAgICAgIFBPU0lUSVZFCisjZGVmaW5lIE0xNjAwWDkwMF9SQl9SNjBfVlNQICAgICAgIE5FR0FUSVZFCisKKy8qIDE2MDB4MTAyNEA2MCBTeW5jIFBvbGFyaXR5IChHVEYgTW9kZSkgKi8KKyNkZWZpbmUgTTE2MDBYMTAyNF9SNjBfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTE2MDBYMTAyNF9SNjBfVlNQICAgICAgUE9TSVRJVkUKKworLyogMTc5MngxMzQ0QDYwIFN5bmMgUG9sYXJpdHkgKERNVCBNb2RlKSAqLworI2RlZmluZSBNMTc5MngxMzQ0X1I2MF9IU1AgICAgICBORUdBVElWRQorI2RlZmluZSBNMTc5MngxMzQ0X1I2MF9WU1AgICAgICBQT1NJVElWRQorCisvKiAxODU2eDEzOTJANjAgU3luYyBQb2xhcml0eSAoRE1UIE1vZGUpICovCisjZGVmaW5lIE0xODU2eDEzOTJfUjYwX0hTUCAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0xODU2eDEzOTJfUjYwX1ZTUCAgICAgIFBPU0lUSVZFCisKKy8qIDE5MjB4MTIwMEA2MCBTeW5jIFBvbGFyaXR5IChDVlQgTW9kZSkgKi8KKyNkZWZpbmUgTTE5MjBYMTIwMF9SNjBfSFNQICAgICAgTkVHQVRJVkUKKyNkZWZpbmUgTTE5MjBYMTIwMF9SNjBfVlNQICAgICAgUE9TSVRJVkUKKworLyogMTkyMHgxMjAwQDYwIFN5bmMgUG9sYXJpdHkgKENWVCBSZWR1Y2UgQmxhbmtpbmcgTW9kZSkgKi8KKyNkZWZpbmUgTTE5MjBYMTIwMF9SQl9SNjBfSFNQICBQT1NJVElWRQorI2RlZmluZSBNMTkyMFgxMjAwX1JCX1I2MF9WU1AgIE5FR0FUSVZFCisKKy8qIDE5MjB4MTA4MEA2MCBTeW5jIFBvbGFyaXR5ICAoQ0VBIE1vZGUpICovCisjZGVmaW5lIE0xOTIwWDEwODBfQ0VBX1I2MF9IU1AgICAgICAgUE9TSVRJVkUKKyNkZWZpbmUgTTE5MjBYMTA4MF9DRUFfUjYwX1ZTUCAgICAgICBQT1NJVElWRQorCisvKiAyMDQ4eDE1MzZANjAgU3luYyBQb2xhcml0eSAoQ1ZUIE1vZGUpICovCisjZGVmaW5lIE0yMDQ4eDE1MzZfUjYwX0hTUCAgICAgIE5FR0FUSVZFCisjZGVmaW5lIE0yMDQ4eDE1MzZfUjYwX1ZTUCAgICAgIFBPU0lUSVZFCisKKy8qIGRlZmluZSBQTEwgaW5kZXg6ICovCisjZGVmaW5lIENMS18yNV8xNzVNICAgICAyNTE3NTAwMAorI2RlZmluZSBDTEtfMjZfODgwTSAgICAgMjY4ODAwMDAKKyNkZWZpbmUgQ0xLXzI5XzU4MU0gICAgIDI5NTgxMDAwCisjZGVmaW5lIENMS18zMV80OTBNICAgICAzMTQ5MDAwMAorI2RlZmluZSBDTEtfMzFfNTAwTSAgICAgMzE1MDAwMDAKKyNkZWZpbmUgQ0xLXzMxXzcyOE0gICAgIDMxNzI4MDAwCisjZGVmaW5lIENMS18zMl82NjhNICAgICAzMjY4ODAwMAorI2RlZmluZSBDTEtfMzZfMDAwTSAgICAgMzYwMDAwMDAKKyNkZWZpbmUgQ0xLXzQwXzAwME0gICAgIDQwMDAwMDAwCisjZGVmaW5lIENMS180MV8yOTFNICAgICA0MTI5MTAwMAorI2RlZmluZSBDTEtfNDNfMTYzTSAgICAgNDMxNjMwMDAKKyNkZWZpbmUgQ0xLXzQ1XzI1ME0gICAgIDQ1MjUwMDAwCS8qIDQ1LjQ2TUh6ICovCisjZGVmaW5lIENMS180Nl8wMDBNICAgICA0NjAwMDAwMAorI2RlZmluZSBDTEtfNDZfOTk2TSAgICAgNDY5OTYwMDAKKyNkZWZpbmUgQ0xLXzQ4XzAwME0gICAgIDQ4MDAwMDAwCisjZGVmaW5lIENMS180OF84NzVNICAgICA0ODg3NTAwMAorI2RlZmluZSBDTEtfNDlfNTAwTSAgICAgNDk1MDAwMDAKKyNkZWZpbmUgQ0xLXzUyXzQwNk0gICAgIDUyNDA2MDAwCisjZGVmaW5lIENMS181Ml85NzdNICAgICA1Mjk3NzAwMAorI2RlZmluZSBDTEtfNTZfMjUwTSAgICAgNTYyNTAwMDAKKyNkZWZpbmUgQ0xLXzYwXzQ2Nk0gICAgIDYwNDY2MDAwCisjZGVmaW5lIENMS182MV81MDBNICAgICA2MTUwMDAwMAorI2RlZmluZSBDTEtfNjVfMDAwTSAgICAgNjUwMDAwMDAKKyNkZWZpbmUgQ0xLXzY1XzE3OE0gICAgIDY1MTc4MDAwCisjZGVmaW5lIENMS182Nl83NTBNICAgICA2Njc1MDAwMAkvKiA2Ny4xMTZNSHogKi8KKyNkZWZpbmUgQ0xLXzY4XzE3OU0gICAgIDY4MTc5MDAwCisjZGVmaW5lIENMS182OV85MjRNICAgICA2OTkyNDAwMAorI2RlZmluZSBDTEtfNzBfMTU5TSAgICAgNzAxNTkwMDAKKyNkZWZpbmUgQ0xLXzcyXzAwME0gICAgIDcyMDAwMDAwCisjZGVmaW5lIENMS183NF8yNzBNICAgICA3NDI3MDAwMAorI2RlZmluZSBDTEtfNzhfNzUwTSAgICAgNzg3NTAwMDAKKyNkZWZpbmUgQ0xLXzgwXzEzNk0gICAgIDgwMTM2MDAwCisjZGVmaW5lIENMS184M18zNzVNICAgICA4MzM3NTAwMAorI2RlZmluZSBDTEtfODNfOTUwTSAgICAgODM5NTAwMDAKKyNkZWZpbmUgQ0xLXzg0Xzc1ME0gICAgIDg0NzUwMDAwCS8qIDg0LjUzN01oeiAqLworI2RlZmluZSBDTEtfODVfODYwTSAgICAgODU4NjAwMDAKKyNkZWZpbmUgQ0xLXzg4Xzc1ME0gICAgIDg4NzUwMDAwCisjZGVmaW5lIENMS185NF81MDBNICAgICA5NDUwMDAwMAorI2RlZmluZSBDTEtfOTdfNzUwTSAgICAgOTc3NTAwMDAKKyNkZWZpbmUgQ0xLXzEwMV8wMDBNICAgIDEwMTAwMDAwMAorI2RlZmluZSBDTEtfMTA2XzUwME0gICAgMTA2NTAwMDAwCisjZGVmaW5lIENMS18xMDhfMDAwTSAgICAxMDgwMDAwMDAKKyNkZWZpbmUgQ0xLXzExM18zMDlNICAgIDExMzMwOTAwMAorI2RlZmluZSBDTEtfMTE4Xzg0ME0gICAgMTE4ODQwMDAwCisjZGVmaW5lIENMS18xMTlfMDAwTSAgICAxMTkwMDAwMDAKKyNkZWZpbmUgQ0xLXzEyMV83NTBNICAgIDEyMTc1MDAwMAkvKiAxMjEuNzA0TUh6ICovCisjZGVmaW5lIENMS18xMjVfMTA0TSAgICAxMjUxMDQwMDAKKyNkZWZpbmUgQ0xLXzEzM18zMDhNICAgIDEzMzMwODAwMAorI2RlZmluZSBDTEtfMTM1XzAwME0gICAgMTM1MDAwMDAwCisjZGVmaW5lIENMS18xMzZfNzAwTSAgICAxMzY3MDAwMDAKKyNkZWZpbmUgQ0xLXzEzOF80MDBNICAgIDEzODQwMDAwMAorI2RlZmluZSBDTEtfMTQ2Xzc2ME0gICAgMTQ2NzYwMDAwCisjZGVmaW5lIENMS18xNDhfNTAwTSAgICAxNDg1MDAwMDAKKworI2RlZmluZSBDTEtfMTUzXzkyME0gICAgMTUzOTIwMDAwCisjZGVmaW5lIENMS18xNTZfMDAwTSAgICAxNTYwMDAwMDAKKyNkZWZpbmUgQ0xLXzE1N181MDBNICAgIDE1NzUwMDAwMAorI2RlZmluZSBDTEtfMTYyXzAwME0gICAgMTYyMDAwMDAwCisjZGVmaW5lIENMS18xODdfMDAwTSAgICAxODcwMDAwMDAKKyNkZWZpbmUgQ0xLXzE5M18yOTVNICAgIDE5MzI5NTAwMAorI2RlZmluZSBDTEtfMjAyXzUwME0gICAgMjAyNTAwMDAwCisjZGVmaW5lIENMS18yMDRfMDAwTSAgICAyMDQwMDAwMDAKKyNkZWZpbmUgQ0xLXzIxOF81MDBNICAgIDIxODUwMDAwMAorI2RlZmluZSBDTEtfMjM0XzAwME0gICAgMjM0MDAwMDAwCisjZGVmaW5lIENMS18yNjdfMjUwTSAgICAyNjcyNTAwMDAKKyNkZWZpbmUgQ0xLXzI5N181MDBNICAgIDI5NzUwMDAwMAorI2RlZmluZSBDTEtfNzRfNDgxTSAgICAgNzQ0ODEwMDAKKyNkZWZpbmUgQ0xLXzE3Ml83OThNICAgIDE3Mjc5ODAwMAorI2RlZmluZSBDTEtfMTIyXzYxNE0gICAgMTIyNjE0MDAwCisKKy8qIENMRTI2NiBQTEwgdmFsdWUKKyovCisjZGVmaW5lIENMRTI2Nl9QTExfMjVfMTc1TSAgICAgMHgwMDAwQzc2MworI2RlZmluZSBDTEUyNjZfUExMXzI2Xzg4ME0gICAgIDB4MDAwMDQ0MEYKKyNkZWZpbmUgQ0xFMjY2X1BMTF8yOV81ODFNICAgICAweDAwMDA4NDIxCisjZGVmaW5lIENMRTI2Nl9QTExfMzFfNDkwTSAgICAgMHgwMDAwNDcyMQorI2RlZmluZSBDTEUyNjZfUExMXzMxXzUwME0gICAgIDB4MDAwMEMzQjUKKyNkZWZpbmUgQ0xFMjY2X1BMTF8zMV83MjhNICAgICAweDAwMDA0NzFGCisjZGVmaW5lIENMRTI2Nl9QTExfMzJfNjY4TSAgICAgMHgwMDAwQzQ0OQorI2RlZmluZSBDTEUyNjZfUExMXzM2XzAwME0gICAgIDB4MDAwMEM1RTUKKyNkZWZpbmUgQ0xFMjY2X1BMTF80MF8wMDBNICAgICAweDAwMDBDNDU5CisjZGVmaW5lIENMRTI2Nl9QTExfNDFfMjkxTSAgICAgMHgwMDAwNDQxNworI2RlZmluZSBDTEUyNjZfUExMXzQzXzE2M00gICAgIDB4MDAwMEM1NzkKKyNkZWZpbmUgQ0xFMjY2X1BMTF80NV8yNTBNICAgICAweDAwMDBDNTdGCS8qIDQ1LjQ2TUh6ICovCisjZGVmaW5lIENMRTI2Nl9QTExfNDZfMDAwTSAgICAgMHgwMDAwODc1QQorI2RlZmluZSBDTEUyNjZfUExMXzQ2Xzk5Nk0gICAgIDB4MDAwMEM0RTkKKyNkZWZpbmUgQ0xFMjY2X1BMTF80OF8wMDBNICAgICAweDAwMDAxNDQzCisjZGVmaW5lIENMRTI2Nl9QTExfNDhfODc1TSAgICAgMHgwMDAwMUQ2MworI2RlZmluZSBDTEUyNjZfUExMXzQ5XzUwME0gICAgIDB4MDAwMDg2NTMKKyNkZWZpbmUgQ0xFMjY2X1BMTF81Ml80MDZNICAgICAweDAwMDBDNDc1CisjZGVmaW5lIENMRTI2Nl9QTExfNTJfOTc3TSAgICAgMHgwMDAwNDUyNQorI2RlZmluZSBDTEUyNjZfUExMXzU2XzI1ME0gICAgIDB4MDAwMDQ3QjcKKyNkZWZpbmUgQ0xFMjY2X1BMTF82MF80NjZNICAgICAweDAwMDA0OTRDCisjZGVmaW5lIENMRTI2Nl9QTExfNjFfNTAwTSAgICAgMHgwMDAwMTQ1NgorI2RlZmluZSBDTEUyNjZfUExMXzY1XzAwME0gICAgIDB4MDAwMDg2RUQKKyNkZWZpbmUgQ0xFMjY2X1BMTF82NV8xNzhNICAgICAweDAwMDA4NTVCCisjZGVmaW5lIENMRTI2Nl9QTExfNjZfNzUwTSAgICAgMHgwMDAwODQ0QgkvKiA2Ny4xMTZNSHogKi8KKyNkZWZpbmUgQ0xFMjY2X1BMTF82OF8xNzlNICAgICAweDAwMDAwNDEzCisjZGVmaW5lIENMRTI2Nl9QTExfNjlfOTI0TSAgICAgMHgwMDAwMTE1MworI2RlZmluZSBDTEUyNjZfUExMXzcwXzE1OU0gICAgIDB4MDAwMDE0NjIKKyNkZWZpbmUgQ0xFMjY2X1BMTF83Ml8wMDBNICAgICAweDAwMDAxODc5CisjZGVmaW5lIENMRTI2Nl9QTExfNzRfMjcwTSAgICAgMHgwMDAwNDg1MworI2RlZmluZSBDTEUyNjZfUExMXzc4Xzc1ME0gICAgIDB4MDAwMDQzMjEKKyNkZWZpbmUgQ0xFMjY2X1BMTF84MF8xMzZNICAgICAweDAwMDAwNTFDCisjZGVmaW5lIENMRTI2Nl9QTExfODNfMzc1TSAgICAgMHgwMDAwQzI1RAorI2RlZmluZSBDTEUyNjZfUExMXzgzXzk1ME0gICAgIDB4MDAwMDA3MjkKKyNkZWZpbmUgQ0xFMjY2X1BMTF84NF83NTBNICAgICAweDAwMDA4NTc2CS8qIDg0LjUzN01IeiAqLworI2RlZmluZSBDTEUyNjZfUExMXzg1Xzg2ME0gICAgIDB4MDAwMDQ3NTQKKyNkZWZpbmUgQ0xFMjY2X1BMTF84OF83NTBNICAgICAweDAwMDAwNTFGCisjZGVmaW5lIENMRTI2Nl9QTExfOTRfNTAwTSAgICAgMHgwMDAwMDUyMQorI2RlZmluZSBDTEUyNjZfUExMXzk3Xzc1ME0gICAgIDB4MDAwMDQ2NTIKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMDFfMDAwTSAgICAweDAwMDA0OTdGCisjZGVmaW5lIENMRTI2Nl9QTExfMTA2XzUwME0gICAgMHgwMDAwODQ3NwkvKiAxMDYuNDkxNDYzIE1IeiAqLworI2RlZmluZSBDTEUyNjZfUExMXzEwOF8wMDBNICAgIDB4MDAwMDg0NzkKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMTNfMzA5TSAgICAweDAwMDAwQzVGCisjZGVmaW5lIENMRTI2Nl9QTExfMTE4Xzg0ME0gICAgMHgwMDAwNDU1MworI2RlZmluZSBDTEUyNjZfUExMXzExOV8wMDBNICAgIDB4MDAwMDBENkMKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMjFfNzUwTSAgICAweDAwMDA0NTU1CS8qIDEyMS43MDRNSHogKi8KKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMjVfMTA0TSAgICAweDAwMDAwNkI1CisjZGVmaW5lIENMRTI2Nl9QTExfMTMzXzMwOE0gICAgMHgwMDAwNDY1RgorI2RlZmluZSBDTEUyNjZfUExMXzEzNV8wMDBNICAgIDB4MDAwMDQ1NUUKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMzZfNzAwTSAgICAweDAwMDAwQzczCisjZGVmaW5lIENMRTI2Nl9QTExfMTM4XzQwME0gICAgMHgwMDAwMDk1NworI2RlZmluZSBDTEUyNjZfUExMXzE0Nl83NjBNICAgIDB4MDAwMDQ1NjcKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xNDhfNTAwTSAgICAweDAwMDAwODUzCisjZGVmaW5lIENMRTI2Nl9QTExfMTUzXzkyME0gICAgMHgwMDAwMDg1NgorI2RlZmluZSBDTEUyNjZfUExMXzE1Nl8wMDBNICAgIDB4MDAwMDQ1NkQKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xNTdfNTAwTSAgICAweDAwMDAwNUI3CisjZGVmaW5lIENMRTI2Nl9QTExfMTYyXzAwME0gICAgMHgwMDAwNDU3MQorI2RlZmluZSBDTEUyNjZfUExMXzE4N18wMDBNICAgIDB4MDAwMDA5NzYKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xOTNfMjk1TSAgICAweDAwMDAwODZDCisjZGVmaW5lIENMRTI2Nl9QTExfMjAyXzUwME0gICAgMHgwMDAwMDc2MworI2RlZmluZSBDTEUyNjZfUExMXzIwNF8wMDBNICAgIDB4MDAwMDA3NjQKKyNkZWZpbmUgQ0xFMjY2X1BMTF8yMThfNTAwTSAgICAweDAwMDAwNjVDCisjZGVmaW5lIENMRTI2Nl9QTExfMjM0XzAwME0gICAgMHgwMDAwMDY2MgorI2RlZmluZSBDTEUyNjZfUExMXzI2N18yNTBNICAgIDB4MDAwMDA2NzAKKyNkZWZpbmUgQ0xFMjY2X1BMTF8yOTdfNTAwTSAgICAweDAwMDAwNUU2CisjZGVmaW5lIENMRTI2Nl9QTExfNzRfNDgxTSAgICAgMHgwMDAwMDUxQQorI2RlZmluZSBDTEUyNjZfUExMXzE3Ml83OThNICAgIDB4MDAwMDQ1NzkKKyNkZWZpbmUgQ0xFMjY2X1BMTF8xMjJfNjE0TSAgICAweDAwMDAwNzNDCisKKy8qIEs4MDAgUExMIHZhbHVlCisqLworI2RlZmluZSBLODAwX1BMTF8yNV8xNzVNICAgICAweDAwNTM5MDAxCisjZGVmaW5lIEs4MDBfUExMXzI2Xzg4ME0gICAgIDB4MDAxQzhDODAKKyNkZWZpbmUgSzgwMF9QTExfMjlfNTgxTSAgICAgMHgwMDQwOTA4MAorI2RlZmluZSBLODAwX1BMTF8zMV80OTBNICAgICAweDAwNkY5MDAxCisjZGVmaW5lIEs4MDBfUExMXzMxXzUwME0gICAgIDB4MDA4QjkwMDIKKyNkZWZpbmUgSzgwMF9QTExfMzFfNzI4TSAgICAgMHgwMEFGOTAwMworI2RlZmluZSBLODAwX1BMTF8zMl82NjhNICAgICAweDAwOTA5MDAyCisjZGVmaW5lIEs4MDBfUExMXzM2XzAwME0gICAgIDB4MDA5RjkwMDIKKyNkZWZpbmUgSzgwMF9QTExfNDBfMDAwTSAgICAgMHgwMDU3OEMwMgorI2RlZmluZSBLODAwX1BMTF80MV8yOTFNICAgICAweDAwNDM4QzAxCisjZGVmaW5lIEs4MDBfUExMXzQzXzE2M00gICAgIDB4MDA3NzhDMDMKKyNkZWZpbmUgSzgwMF9QTExfNDVfMjUwTSAgICAgMHgwMDdEOEM4MwkvKiA0NS40Nk1IeiAqLworI2RlZmluZSBLODAwX1BMTF80Nl8wMDBNICAgICAweDAwNjU4QzAyCisjZGVmaW5lIEs4MDBfUExMXzQ2Xzk5Nk0gICAgIDB4MDA4MThDODMKKyNkZWZpbmUgSzgwMF9QTExfNDhfMDAwTSAgICAgMHgwMDg0OEM4MworI2RlZmluZSBLODAwX1BMTF80OF84NzVNICAgICAweDAwNTA4QzgxCisjZGVmaW5lIEs4MDBfUExMXzQ5XzUwME0gICAgIDB4MDA1MThDMDEKKyNkZWZpbmUgSzgwMF9QTExfNTJfNDA2TSAgICAgMHgwMDczOEMwMgorI2RlZmluZSBLODAwX1BMTF81Ml85NzdNICAgICAweDAwOTI4QzgzCisjZGVmaW5lIEs4MDBfUExMXzU2XzI1ME0gICAgIDB4MDA3QzhDMDIKKyNkZWZpbmUgSzgwMF9QTExfNjBfNDY2TSAgICAgMHgwMEE3OEM4MworI2RlZmluZSBLODAwX1BMTF82MV81MDBNICAgICAweDAwQUE4QzgzCisjZGVmaW5lIEs4MDBfUExMXzY1XzAwME0gICAgIDB4MDA2QjhDMDEKKyNkZWZpbmUgSzgwMF9QTExfNjVfMTc4TSAgICAgMHgwMEI0OEM4MworI2RlZmluZSBLODAwX1BMTF82Nl83NTBNICAgICAweDAwOTQ4QzgyCS8qIDY3LjExNk1IeiAqLworI2RlZmluZSBLODAwX1BMTF82OF8xNzlNICAgICAweDAwNzA4QzAxCisjZGVmaW5lIEs4MDBfUExMXzY5XzkyNE0gICAgIDB4MDBDMThDODMKKyNkZWZpbmUgSzgwMF9QTExfNzBfMTU5TSAgICAgMHgwMEMyOEM4MworI2RlZmluZSBLODAwX1BMTF83Ml8wMDBNICAgICAweDAwOUY4QzgyCisjZGVmaW5lIEs4MDBfUExMXzc0XzI3ME0gICAgIDB4MDBjZTBjMDMKKyNkZWZpbmUgSzgwMF9QTExfNzhfNzUwTSAgICAgMHgwMDQwODgwMQorI2RlZmluZSBLODAwX1BMTF84MF8xMzZNICAgICAweDAwNDI4ODAxCisjZGVmaW5lIEs4MDBfUExMXzgzXzM3NU0gICAgIDB4MDA1QjA4ODIKKyNkZWZpbmUgSzgwMF9QTExfODNfOTUwTSAgICAgMHgwMDczODgwMworI2RlZmluZSBLODAwX1BMTF84NF83NTBNICAgICAweDAwNzQ4ODgzCS8qIDg0LjQ3N01IeiAqLworI2RlZmluZSBLODAwX1BMTF84NV84NjBNICAgICAweDAwNzY4ODgzCisjZGVmaW5lIEs4MDBfUExMXzg4Xzc1ME0gICAgIDB4MDA3QTg4ODMKKyNkZWZpbmUgSzgwMF9QTExfOTRfNTAwTSAgICAgMHgwMDgyODgwMworI2RlZmluZSBLODAwX1BMTF85N183NTBNICAgICAweDAwODc4ODgzCisjZGVmaW5lIEs4MDBfUExMXzEwMV8wMDBNICAgIDB4MDA4Qjg4ODMKKyNkZWZpbmUgSzgwMF9QTExfMTA2XzUwME0gICAgMHgwMDc1ODg4MgkvKiAxMDYuNDkxNDYzIE1IeiAqLworI2RlZmluZSBLODAwX1BMTF8xMDhfMDAwTSAgICAweDAwNzc4ODgyCisjZGVmaW5lIEs4MDBfUExMXzExM18zMDlNICAgIDB4MDA1RDg4ODEKKyNkZWZpbmUgSzgwMF9QTExfMTE4Xzg0ME0gICAgMHgwMEE0ODg4MworI2RlZmluZSBLODAwX1BMTF8xMTlfMDAwTSAgICAweDAwODM4ODgyCisjZGVmaW5lIEs4MDBfUExMXzEyMV83NTBNICAgIDB4MDBBODg4ODMJLyogMTIxLjcwNE1IeiAqLworI2RlZmluZSBLODAwX1BMTF8xMjVfMTA0TSAgICAweDAwNjg4ODAxCisjZGVmaW5lIEs4MDBfUExMXzEzM18zMDhNICAgIDB4MDA1RDg4MDEKKyNkZWZpbmUgSzgwMF9QTExfMTM1XzAwME0gICAgMHgwMDFBNDA4MQorI2RlZmluZSBLODAwX1BMTF8xMzZfNzAwTSAgICAweDAwQkQ4ODgzCisjZGVmaW5lIEs4MDBfUExMXzEzOF80MDBNICAgIDB4MDA3Mjg4ODEKKyNkZWZpbmUgSzgwMF9QTExfMTQ2Xzc2ME0gICAgMHgwMENDODg4MworI2RlZmluZSBLODAwX1BMTF8xNDhfNTAwTSAgICAweDAwY2UwODAzCisjZGVmaW5lIEs4MDBfUExMXzE1M185MjBNICAgIDB4MDA1NDg0ODIKKyNkZWZpbmUgSzgwMF9QTExfMTU2XzAwME0gICAgMHgwMDZCODQ4MworI2RlZmluZSBLODAwX1BMTF8xNTdfNTAwTSAgICAweDAwMTQyMDgwCisjZGVmaW5lIEs4MDBfUExMXzE2Ml8wMDBNICAgIDB4MDA2Rjg0ODMKKyNkZWZpbmUgSzgwMF9QTExfMTg3XzAwME0gICAgMHgwMDgxODQ4MworI2RlZmluZSBLODAwX1BMTF8xOTNfMjk1TSAgICAweDAwNEY4NDgxCisjZGVmaW5lIEs4MDBfUExMXzIwMl81MDBNICAgIDB4MDA1Mzg0ODEKKyNkZWZpbmUgSzgwMF9QTExfMjA0XzAwME0gICAgMHgwMDhEODQ4MworI2RlZmluZSBLODAwX1BMTF8yMThfNTAwTSAgICAweDAwOTc4NDgzCisjZGVmaW5lIEs4MDBfUExMXzIzNF8wMDBNICAgIDB4MDA2MDg0MDEKKyNkZWZpbmUgSzgwMF9QTExfMjY3XzI1ME0gICAgMHgwMDZFODQ4MQorI2RlZmluZSBLODAwX1BMTF8yOTdfNTAwTSAgICAweDAwQTQ4NDAyCisjZGVmaW5lIEs4MDBfUExMXzc0XzQ4MU0gICAgIDB4MDA3QjhDODEKKyNkZWZpbmUgSzgwMF9QTExfMTcyXzc5OE0gICAgMHgwMDc3ODQ4MworI2RlZmluZSBLODAwX1BMTF8xMjJfNjE0TSAgICAweDAwODc4ODgyCisKKy8qIFBMTCBmb3IgVlQzMzI0ICovCisjZGVmaW5lIENYNzAwXzI1XzE3NU0gICAgIDB4MDA4QjEwMDMKKyNkZWZpbmUgQ1g3MDBfMjZfNzE5TSAgICAgMHgwMDkzMTAwMworI2RlZmluZSBDWDcwMF8yNl84ODBNICAgICAweDAwOTQxMDAzCisjZGVmaW5lIENYNzAwXzI5XzU4MU0gICAgIDB4MDBBNDkwMDMKKyNkZWZpbmUgQ1g3MDBfMzFfNDkwTSAgICAgMHgwMEFFMTAwMworI2RlZmluZSBDWDcwMF8zMV81MDBNICAgICAweDAwQUUxMDAzCisjZGVmaW5lIENYNzAwXzMxXzcyOE0gICAgIDB4MDBBRjEwMDMKKyNkZWZpbmUgQ1g3MDBfMzJfNjY4TSAgICAgMHgwMEI1MTAwMworI2RlZmluZSBDWDcwMF8zNl8wMDBNICAgICAweDAwQzgxMDAzCisjZGVmaW5lIENYNzAwXzQwXzAwME0gICAgIDB4MDA2RTBDMDMKKyNkZWZpbmUgQ1g3MDBfNDFfMjkxTSAgICAgMHgwMDcxMEMwMworI2RlZmluZSBDWDcwMF80M18xNjNNICAgICAweDAwNzcwQzAzCisjZGVmaW5lIENYNzAwXzQ1XzI1ME0gICAgIDB4MDA3RDBDMDMJLyogNDUuNDZNSHogKi8KKyNkZWZpbmUgQ1g3MDBfNDZfMDAwTSAgICAgMHgwMDdGMEMwMworI2RlZmluZSBDWDcwMF80Nl85OTZNICAgICAweDAwODE4QzgzCisjZGVmaW5lIENYNzAwXzQ4XzAwME0gICAgIDB4MDA4NDBDMDMKKyNkZWZpbmUgQ1g3MDBfNDhfODc1TSAgICAgMHgwMDUwOEM4MQorI2RlZmluZSBDWDcwMF80OV81MDBNICAgICAweDAwODgwQzAzCisjZGVmaW5lIENYNzAwXzUyXzQwNk0gICAgIDB4MDA3MzBDMDIKKyNkZWZpbmUgQ1g3MDBfNTJfOTc3TSAgICAgMHgwMDkyMEMwMworI2RlZmluZSBDWDcwMF81Nl8yNTBNICAgICAweDAwOUIwQzAzCisjZGVmaW5lIENYNzAwXzYwXzQ2Nk0gICAgIDB4MDA0NjBDMDAKKyNkZWZpbmUgQ1g3MDBfNjFfNTAwTSAgICAgMHgwMEFBMEMwMworI2RlZmluZSBDWDcwMF82NV8wMDBNICAgICAweDAwNkIwQzAxCisjZGVmaW5lIENYNzAwXzY1XzE3OE0gICAgIDB4MDA2QjBDMDEKKyNkZWZpbmUgQ1g3MDBfNjZfNzUwTSAgICAgMHgwMDk0MEMwMgkvKjY3LjExNk1IeiAqLworI2RlZmluZSBDWDcwMF82OF8xNzlNICAgICAweDAwQkMwQzAzCisjZGVmaW5lIENYNzAwXzY5XzkyNE0gICAgIDB4MDBDMTBDMDMKKyNkZWZpbmUgQ1g3MDBfNzBfMTU5TSAgICAgMHgwMEMyMEMwMworI2RlZmluZSBDWDcwMF83Ml8wMDBNICAgICAweDAwOUYwQzAyCisjZGVmaW5lIENYNzAwXzc0XzI3ME0gICAgIDB4MDBDRTBDMDMKKyNkZWZpbmUgQ1g3MDBfNzRfNDgxTSAgICAgMHgwMENFMEMwMworI2RlZmluZSBDWDcwMF83OF83NTBNICAgICAweDAwNkMwODAzCisjZGVmaW5lIENYNzAwXzgwXzEzNk0gICAgIDB4MDA2RTA4MDMKKyNkZWZpbmUgQ1g3MDBfODNfMzc1TSAgICAgMHgwMDVCMDg4MgorI2RlZmluZSBDWDcwMF84M185NTBNICAgICAweDAwNzMwODAzCisjZGVmaW5lIENYNzAwXzg0Xzc1ME0gICAgIDB4MDA3NDA4MDMJLyogODQuNTM3TWh6ICovCisjZGVmaW5lIENYNzAwXzg1Xzg2ME0gICAgIDB4MDA3NjA4MDMKKyNkZWZpbmUgQ1g3MDBfODhfNzUwTSAgICAgMHgwMEFDODg4NQorI2RlZmluZSBDWDcwMF85NF81MDBNICAgICAweDAwODIwODAzCisjZGVmaW5lIENYNzAwXzk3Xzc1ME0gICAgIDB4MDA4NzA4MDMKKyNkZWZpbmUgQ1g3MDBfMTAxXzAwME0gICAgMHgwMDhCMDgwMworI2RlZmluZSBDWDcwMF8xMDZfNTAwTSAgICAweDAwNzUwODAyCisjZGVmaW5lIENYNzAwXzEwOF8wMDBNICAgIDB4MDA5NTA4MDMKKyNkZWZpbmUgQ1g3MDBfMTEzXzMwOU0gICAgMHgwMDVEMDgwMQorI2RlZmluZSBDWDcwMF8xMThfODQwTSAgICAweDAwQTQwODAzCisjZGVmaW5lIENYNzAwXzExOV8wMDBNICAgIDB4MDA4MzA4MDIKKyNkZWZpbmUgQ1g3MDBfMTIxXzc1ME0gICAgMHgwMDQyMDgwMAkvKiAxMjEuNzA0TUh6ICovCisjZGVmaW5lIENYNzAwXzEyNV8xMDRNICAgIDB4MDBBRDA4MDMKKyNkZWZpbmUgQ1g3MDBfMTMzXzMwOE0gICAgMHgwMDkzMDgwMgorI2RlZmluZSBDWDcwMF8xMzVfMDAwTSAgICAweDAwOTUwODAyCisjZGVmaW5lIENYNzAwXzEzNl83MDBNICAgIDB4MDBCRDA4MDMKKyNkZWZpbmUgQ1g3MDBfMTM4XzQwME0gICAgMHgwMDcyMDgwMQorI2RlZmluZSBDWDcwMF8xNDZfNzYwTSAgICAweDAwQ0MwODAzCisjZGVmaW5lIENYNzAwXzE0OF81MDBNICAgIDB4MDBhNDA4MDIKKyNkZWZpbmUgQ1g3MDBfMTUzXzkyME0gICAgMHgwMDU0MDQwMgorI2RlZmluZSBDWDcwMF8xNTZfMDAwTSAgICAweDAwNkIwNDAzCisjZGVmaW5lIENYNzAwXzE1N181MDBNICAgIDB4MDA2QzA0MDMKKyNkZWZpbmUgQ1g3MDBfMTYyXzAwME0gICAgMHgwMDZGMDQwMworI2RlZmluZSBDWDcwMF8xNzJfNzk4TSAgICAweDAwNzcwNDAzCisjZGVmaW5lIENYNzAwXzE4N18wMDBNICAgIDB4MDA4MTA0MDMKKyNkZWZpbmUgQ1g3MDBfMTkzXzI5NU0gICAgMHgwMDg1MDQwMworI2RlZmluZSBDWDcwMF8yMDJfNTAwTSAgICAweDAwOEMwNDAzCisjZGVmaW5lIENYNzAwXzIwNF8wMDBNICAgIDB4MDA4RDA0MDMKKyNkZWZpbmUgQ1g3MDBfMjE4XzUwME0gICAgMHgwMDk3MDQwMworI2RlZmluZSBDWDcwMF8yMzRfMDAwTSAgICAweDAwNjAwNDAxCisjZGVmaW5lIENYNzAwXzI2N18yNTBNICAgIDB4MDBCOTA0MDMKKyNkZWZpbmUgQ1g3MDBfMjk3XzUwME0gICAgMHgwMENFMDQwMworI2RlZmluZSBDWDcwMF8xMjJfNjE0TSAgICAweDAwODcwODAyCisKKy8qIERlZmluaXRpb24gQ1JUQyBUaW1pbmcgSW5kZXggKi8KKyNkZWZpbmUgSF9UT1RBTF9JTkRFWCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSF9BRERSX0lOREVYICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSF9CTEFOS19TVEFSVF9JTkRFWCAgICAgICAgIDIKKyNkZWZpbmUgSF9CTEFOS19FTkRfSU5ERVggICAgICAgICAgIDMKKyNkZWZpbmUgSF9TWU5DX1NUQVJUX0lOREVYICAgICAgICAgIDQKKyNkZWZpbmUgSF9TWU5DX0VORF9JTkRFWCAgICAgICAgICAgIDUKKyNkZWZpbmUgVl9UT1RBTF9JTkRFWCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVl9BRERSX0lOREVYICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVl9CTEFOS19TVEFSVF9JTkRFWCAgICAgICAgIDgKKyNkZWZpbmUgVl9CTEFOS19FTkRfSU5ERVggICAgICAgICAgIDkKKyNkZWZpbmUgVl9TWU5DX1NUQVJUX0lOREVYICAgICAgICAgIDEwCisjZGVmaW5lIFZfU1lOQ19FTkRfSU5ERVggICAgICAgICAgICAxMQorI2RlZmluZSBIX1RPVEFMX1NIQURPV19JTkRFWCAgICAgICAgMTIKKyNkZWZpbmUgSF9CTEFOS19FTkRfU0hBRE9XX0lOREVYICAgIDEzCisjZGVmaW5lIFZfVE9UQUxfU0hBRE9XX0lOREVYICAgICAgICAxNAorI2RlZmluZSBWX0FERFJfU0hBRE9XX0lOREVYICAgICAgICAgMTUKKyNkZWZpbmUgVl9CTEFOS19TQVRSVF9TSEFET1dfSU5ERVggIDE2CisjZGVmaW5lIFZfQkxBTktfRU5EX1NIQURPV19JTkRFWCAgICAxNworI2RlZmluZSBWX1NZTkNfU0FUUlRfU0hBRE9XX0lOREVYICAgMTgKKyNkZWZpbmUgVl9TWU5DX0VORF9TSEFET1dfSU5ERVggICAgIDE5CisKKy8qIERlZmluaXRpb24gVmlkZW8gTW9kZSBQaXhlbCBDbG9jayAocGljb3NlY29uZHMpCisqLworI2RlZmluZSBSRVNfNDgwWDY0MF82MEhaX1BJWENMT0NLICAgIDM5NzIyCisjZGVmaW5lIFJFU182NDBYNDgwXzYwSFpfUElYQ0xPQ0sgICAgMzk3MjIKKyNkZWZpbmUgUkVTXzY0MFg0ODBfNzVIWl9QSVhDTE9DSyAgICAzMTc0NworI2RlZmluZSBSRVNfNjQwWDQ4MF84NUhaX1BJWENMT0NLICAgIDI3Nzc3CisjZGVmaW5lIFJFU182NDBYNDgwXzEwMEhaX1BJWENMT0NLICAgMjMxNjgKKyNkZWZpbmUgUkVTXzY0MFg0ODBfMTIwSFpfUElYQ0xPQ0sgICAxOTA4MQorI2RlZmluZSBSRVNfNzIwWDQ4MF82MEhaX1BJWENMT0NLICAgIDM3MDIwCisjZGVmaW5lIFJFU183MjBYNTc2XzYwSFpfUElYQ0xPQ0sgICAgMzA2MTEKKyNkZWZpbmUgUkVTXzgwMFg2MDBfNjBIWl9QSVhDTE9DSyAgICAyNTAwMAorI2RlZmluZSBSRVNfODAwWDYwMF83NUhaX1BJWENMT0NLICAgIDIwMjAzCisjZGVmaW5lIFJFU184MDBYNjAwXzg1SFpfUElYQ0xPQ0sgICAgMTc3NzcKKyNkZWZpbmUgUkVTXzgwMFg2MDBfMTAwSFpfUElYQ0xPQ0sgICAxNDY2NworI2RlZmluZSBSRVNfODAwWDYwMF8xMjBIWl9QSVhDTE9DSyAgIDExOTEyCisjZGVmaW5lIFJFU184MDBYNDgwXzYwSFpfUElYQ0xPQ0sgICAgMzM4MDUKKyNkZWZpbmUgUkVTXzg0OFg0ODBfNjBIWl9QSVhDTE9DSyAgICAzMTc1NgorI2RlZmluZSBSRVNfODU2WDQ4MF82MEhaX1BJWENMT0NLICAgIDMxNTE4CisjZGVmaW5lIFJFU18xMDI0WDUxMl82MEhaX1BJWENMT0NLICAgMjQyMTgKKyNkZWZpbmUgUkVTXzEwMjRYNjAwXzYwSFpfUElYQ0xPQ0sgICAyMDQ2MAorI2RlZmluZSBSRVNfMTAyNFg3NjhfNjBIWl9QSVhDTE9DSyAgIDE1Mzg1CisjZGVmaW5lIFJFU18xMDI0WDc2OF83NUhaX1BJWENMT0NLICAgMTI2OTkKKyNkZWZpbmUgUkVTXzEwMjRYNzY4Xzg1SFpfUElYQ0xPQ0sgICAxMDU4MgorI2RlZmluZSBSRVNfMTAyNFg3NjhfMTAwSFpfUElYQ0xPQ0sgIDg4MjUKKyNkZWZpbmUgUkVTXzExNTJYODY0Xzc1SFpfUElYQ0xPQ0sgICA5MjU5CisjZGVmaW5lIFJFU18xMjgwWDc2OF82MEhaX1BJWENMT0NLICAgMTI0ODAKKyNkZWZpbmUgUkVTXzEyODBYODAwXzYwSFpfUElYQ0xPQ0sgICAxMTk5NAorI2RlZmluZSBSRVNfMTI4MFg5NjBfNjBIWl9QSVhDTE9DSyAgIDkyNTkKKyNkZWZpbmUgUkVTXzEyODBYMTAyNF82MEhaX1BJWENMT0NLICA5MjYwCisjZGVmaW5lIFJFU18xMjgwWDEwMjRfNzVIWl9QSVhDTE9DSyAgNzQwOAorI2RlZmluZSBSRVNfMTI4MFg3NjhfODVIWl9QSVhDTE9DSyAgIDYzNDkKKyNkZWZpbmUgUkVTXzE0NDBYMTA1MF82MEhaX1BJWENMT0NLICA3OTkzCisjZGVmaW5lIFJFU18xNjAwWDEyMDBfNjBIWl9QSVhDTE9DSyAgNjE3MgorI2RlZmluZSBSRVNfMTYwMFgxMjAwXzc1SFpfUElYQ0xPQ0sgIDQ5MzgKKyNkZWZpbmUgUkVTXzEyODBYNzIwXzYwSFpfUElYQ0xPQ0sgICAxMzQyNgorI2RlZmluZSBSRVNfMTkyMFgxMDgwXzYwSFpfUElYQ0xPQ0sgIDU3ODcKKyNkZWZpbmUgUkVTXzE0MDBYMTA1MF82MEhaX1BJWENMT0NLICA4MjE0CisjZGVmaW5lIFJFU18xNDAwWDEwNTBfNzVIWl9QSVhDTE9DSyAgNjQxMAorI2RlZmluZSBSRVNfMTM2OFg3NjhfNjBIWl9QSVhDTE9DSyAgIDExNjQ3CisjZGVmaW5lIFJFU185NjBYNjAwXzYwSFpfUElYQ0xPQ0sgICAgICAyMjA5OQorI2RlZmluZSBSRVNfMTAwMFg2MDBfNjBIWl9QSVhDTE9DSyAgICAyMDgzNAorI2RlZmluZSBSRVNfMTAyNFg1NzZfNjBIWl9QSVhDTE9DSyAgICAyMTI3OAorI2RlZmluZSBSRVNfMTA4OFg2MTJfNjBIWl9QSVhDTE9DSyAgICAxODg3NworI2RlZmluZSBSRVNfMTE1Mlg3MjBfNjBIWl9QSVhDTE9DSyAgICAxNDk4MQorI2RlZmluZSBSRVNfMTIwMFg3MjBfNjBIWl9QSVhDTE9DSyAgICAxNDI1MworI2RlZmluZSBSRVNfMTI4MFg2MDBfNjBIWl9QSVhDTE9DSyAgICAxNjI2MAorI2RlZmluZSBSRVNfMTI4MFg3MjBfNTBIWl9QSVhDTE9DSyAgICAxNjUzOAorI2RlZmluZSBSRVNfMTI4MFg3NjhfNTBIWl9QSVhDTE9DSyAgICAxNTM0MgorI2RlZmluZSBSRVNfMTM2Nlg3NjhfNTBIWl9QSVhDTE9DSyAgICAxNDMwMQorI2RlZmluZSBSRVNfMTM2Nlg3NjhfNjBIWl9QSVhDTE9DSyAgICAxMTY0NgorI2RlZmluZSBSRVNfMTM2MFg3NjhfNjBIWl9QSVhDTE9DSyAgICAxMTc5OQorI2RlZmluZSBSRVNfMTQ0MFg5MDBfNjBIWl9QSVhDTE9DSyAgICA5MzkwCisjZGVmaW5lIFJFU18xNDQwWDkwMF83NUhaX1BJWENMT0NLICAgIDczMTUKKyNkZWZpbmUgUkVTXzE2MDBYOTAwXzYwSFpfUElYQ0xPQ0sgICAgODQxNQorI2RlZmluZSBSRVNfMTYwMFgxMDI0XzYwSFpfUElYQ0xPQ0sgICA3MzE1CisjZGVmaW5lIFJFU18xNjgwWDEwNTBfNjBIWl9QSVhDTE9DSyAgIDY4MTQKKyNkZWZpbmUgUkVTXzE2ODBYMTA1MF83NUhaX1BJWENMT0NLICAgNTM0OAorI2RlZmluZSBSRVNfMTc5MlgxMzQ0XzYwSFpfUElYQ0xPQ0sgICA0OTAyCisjZGVmaW5lIFJFU18xODU2WDEzOTJfNjBIWl9QSVhDTE9DSyAgIDQ1NzcKKyNkZWZpbmUgUkVTXzE5MjBYMTIwMF82MEhaX1BJWENMT0NLICAgNTE3MworI2RlZmluZSBSRVNfMTkyMFgxNDQwXzYwSFpfUElYQ0xPQ0sgICA0Mjc0CisjZGVmaW5lIFJFU18xOTIwWDE0NDBfNzVIWl9QSVhDTE9DSyAgIDMzNjcKKyNkZWZpbmUgUkVTXzIwNDhYMTUzNl82MEhaX1BJWENMT0NLICAgMzc0MgorCisjZGVmaW5lIFJFU18xMzYwWDc2OF9SQl82MEhaX1BJWENMT0NLIDEzODg5CisjZGVmaW5lIFJFU18xNDAwWDEwNTBfUkJfNjBIWl9QSVhDTE9DSyA5OTAxCisjZGVmaW5lIFJFU18xNDQwWDkwMF9SQl82MEhaX1BJWENMT0NLICAgMTEyNjgKKyNkZWZpbmUgUkVTXzE2MDBYOTAwX1JCXzYwSFpfUElYQ0xPQ0sgICAxMDIzMAorI2RlZmluZSBSRVNfMTY4MFgxMDUwX1JCXzYwSFpfUElYQ0xPQ0sgODQwMworI2RlZmluZSBSRVNfMTkyMFgxMDgwX1JCXzYwSFpfUElYQ0xPQ0sgNzIyNQorI2RlZmluZSBSRVNfMTkyMFgxMjAwX1JCXzYwSFpfUElYQ0xPQ0sgNjQ5NworCisvKiBMQ0QgZGlzcGxheSBtZXRob2QKKyovCisjZGVmaW5lICAgICBMQ0RfRVhQQU5EU0lPTiAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgTENEX0NFTlRFUklORyAgICAgICAgICAgICAgIDB4MDEKKworLyogTENEIG1vZGUKKyovCisjZGVmaW5lICAgICBMQ0RfT1BFTkxESSAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgIExDRF9TUFdHICAgICAgICAgICAgICAgICAgMHgwMQorCisvKiBEZWZpbmUgZGlzcGxheSB0aW1pbmcKKyovCitzdHJ1Y3QgZGlzcGxheV90aW1pbmcgeworCXUxNiBob3JfdG90YWw7CisJdTE2IGhvcl9hZGRyOworCXUxNiBob3JfYmxhbmtfc3RhcnQ7CisJdTE2IGhvcl9ibGFua19lbmQ7CisJdTE2IGhvcl9zeW5jX3N0YXJ0OworCXUxNiBob3Jfc3luY19lbmQ7CisJdTE2IHZlcl90b3RhbDsKKwl1MTYgdmVyX2FkZHI7CisJdTE2IHZlcl9ibGFua19zdGFydDsKKwl1MTYgdmVyX2JsYW5rX2VuZDsKKwl1MTYgdmVyX3N5bmNfc3RhcnQ7CisJdTE2IHZlcl9zeW5jX2VuZDsKK307CisKK3N0cnVjdCBjcnRfbW9kZV90YWJsZSB7CisJaW50IHJlZnJlc2hfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGNsazsKKwlpbnQgaF9zeW5jX3BvbGFyaXR5OworCWludCB2X3N5bmNfcG9sYXJpdHk7CisJc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydGM7Cit9OworCitzdHJ1Y3QgaW9fcmVnIHsKKwlpbnQgcG9ydDsKKwl1OCBpbmRleDsKKwl1OCBtYXNrOworCXU4IHZhbHVlOworfTsKKworI2VuZGlmIC8qIF9fU0hBUkVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS90YmwxNjM2LmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS90YmwxNjM2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4NDUzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3RibDE2MzYuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCitzdHJ1Y3QgSU9EQVRBIENPTU1PTl9JTklUX1RCTF9WVDE2MzZbXSA9IHsKKy8qICBJbmRleCwgTWFzaywgVmFsdWUgKi8KKwkvKiBTZXQgcGFuZWwgcG93ZXIgc2VxdWVuY2UgdGltaW5nICovCisJezB4MTAsIDB4QzAsIDB4MDB9LAorCS8qIFQxOiBWREQgb24gLSBEYXRhIG9uLiBFYWNoIGluY3JlbWVudCBpcyAxIG1zLiAoNTBtcyA9IDAzMWgpICovCisJezB4MEIsIDB4RkYsIDB4NDB9LAorCS8qIFQyOiBEYXRhIG9uIC0gQmFja2xpZ2h0IG9uLiBFYWNoIGluY3JlbWVudCBpcyAyIG1zLiAoMjEwbXMgPSAwNjhoKSAqLworCXsweDBDLCAweEZGLCAweDMxfSwKKwkvKiBUMzogQmFja2xpZ2h0IG9mZiAtRGF0YSBvZmYuIEVhY2ggaW5jcmVtZW50IGlzIDIgbXMuICgyMTBtcyA9IDA2OGgpKi8KKwl7MHgwRCwgMHhGRiwgMHgzMX0sCisJLyogVDQ6IERhdGEgb2ZmIC0gVkREIG9mZi4gRWFjaCBpbmNyZW1lbnQgaXMgMSBtcy4gKDUwbXMgPSAwMzFoKSAqLworCXsweDBFLCAweEZGLCAweDY4fSwKKwkvKiBUNTogVkREIG9mZiAtIFZERCBvbi4gRWFjaCBpbmNyZW1lbnQgaXMgMTAwIG1zLiAoNTAwbXMgPSAwNGgpICovCisJezB4MEYsIDB4RkYsIDB4Njh9LAorCS8qIExWRFMgb3V0cHV0IHBvd2VyIHVwICovCisJezB4MDksIDB4QTAsIDB4QTB9LAorCS8qIHR1cm4gb24gYmFjayBsaWdodCAqLworCXsweDEwLCAweDMzLCAweDEzfQorfTsKKworc3RydWN0IElPREFUQSBEVUFMX0NIQU5ORUxfRU5BQkxFX1RCTF9WVDE2MzZbXSA9IHsKKy8qICBJbmRleCwgTWFzaywgVmFsdWUgKi8KKwl7MHgwOCwgMHhGMCwgMHhFMH0JLyogSW5wdXQgRGF0YSBNb2RlIFNlbGVjdCAqLworfTsKKworc3RydWN0IElPREFUQSBTSU5HTEVfQ0hBTk5FTF9FTkFCTEVfVEJMX1ZUMTYzNltdID0geworLyogIEluZGV4LCBNYXNrLCBWYWx1ZSAqLworCXsweDA4LCAweEYwLCAweDAwfQkvKiBJbnB1dCBEYXRhIE1vZGUgU2VsZWN0ICovCit9OworCitzdHJ1Y3QgSU9EQVRBIERJVEhFUklOR19FTkFCTEVfVEJMX1ZUMTYzNltdID0geworLyogIEluZGV4LCBNYXNrLCBWYWx1ZSAqLworCXsweDBBLCAweDcwLCAweDUwfQorfTsKKworc3RydWN0IElPREFUQSBESVRIRVJJTkdfRElTQUJMRV9UQkxfVlQxNjM2W10gPSB7CisvKiAgSW5kZXgsIE1hc2ssIFZhbHVlICovCisJezB4MEEsIDB4NzAsIDB4MDB9Cit9OworCitzdHJ1Y3QgSU9EQVRBIFZERF9PTl9UQkxfVlQxNjM2W10gPSB7CisvKiAgSW5kZXgsIE1hc2ssIFZhbHVlICovCisJezB4MTAsIDB4MjAsIDB4MjB9Cit9OworCitzdHJ1Y3QgSU9EQVRBIFZERF9PRkZfVEJMX1ZUMTYzNltdID0geworLyogIEluZGV4LCBNYXNrLCBWYWx1ZSAqLworCXsweDEwLCAweDIwLCAweDAwfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3RibDE2MzYuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL3RibDE2MzYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA2MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvdGJsMTYzNi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1RCTDE2MzZfSF8KKyNkZWZpbmUgX1RCTDE2MzZfSF8KKyNpbmNsdWRlICJody5oIgorCitleHRlcm4gc3RydWN0IElPREFUQSBDT01NT05fSU5JVF9UQkxfVlQxNjM2WzhdOworZXh0ZXJuIHN0cnVjdCBJT0RBVEEgRFVBTF9DSEFOTkVMX0VOQUJMRV9UQkxfVlQxNjM2WzFdOworZXh0ZXJuIHN0cnVjdCBJT0RBVEEgU0lOR0xFX0NIQU5ORUxfRU5BQkxFX1RCTF9WVDE2MzZbMV07CitleHRlcm4gc3RydWN0IElPREFUQSBESVRIRVJJTkdfRU5BQkxFX1RCTF9WVDE2MzZbMV07CitleHRlcm4gc3RydWN0IElPREFUQSBESVRIRVJJTkdfRElTQUJMRV9UQkxfVlQxNjM2WzFdOworZXh0ZXJuIHN0cnVjdCBJT0RBVEEgVkREX09OX1RCTF9WVDE2MzZbMV07CitleHRlcm4gc3RydWN0IElPREFUQSBWRERfT0ZGX1RCTF9WVDE2MzZbMV07CisKKyNlbmRpZiAvKiBfVklBX1RCTDE2MzZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3RibERQQVNldHRpbmcuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3RibERQQVNldHRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRjOGNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvdGJsRFBBU2V0dGluZy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisvKiBGb3IgVlQzMzI0OiAqLworc3RydWN0IFZUMTYzNl9EUEFfU0VUVElORyBWVDE2MzZfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyNFtdID0geworCS8qIFBhbmVsIElELCAgICAgICBDTEtfU0VMX1NUMVswOV0sICAgIENMS19TRUxfU1QyWzA4XSAqLworCXtMQ0RfUEFORUxfSUQwXzY0MFg0ODAsIDB4MDAsIDB4MDB9LAkvKiBGb3IgNjQweDQ4MCAgICovCisJe0xDRF9QQU5FTF9JRDFfODAwWDYwMCwgMHgwMCwgMHgwMH0sCS8qIEZvciA4MDB4NjAwICAgKi8KKwl7TENEX1BBTkVMX0lEMl8xMDI0WDc2OCwgMHgwMCwgMHgwMH0sCS8qIEZvciAxMDI0eDc2OCAgKi8KKwl7TENEX1BBTkVMX0lEM18xMjgwWDc2OCwgMHgwMCwgMHgwMH0sCS8qIEZvciAxMjgweDc2OCAgKi8KKwl7TENEX1BBTkVMX0lENF8xMjgwWDEwMjQsIDB4MDAsIDB4MDB9LAkvKiBGb3IgMTI4MHgxMDI0ICovCisJe0xDRF9QQU5FTF9JRDVfMTQwMFgxMDUwLCAweDAwLCAweDAwfSwJLyogRm9yIDE0MDB4MTA1MCAqLworCXtMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMCwgMHgwQiwgMHgwM30JLyogRm9yIDE2MDB4MTIwMCAqLworfTsKKworc3RydWN0IEdGWF9EUEFfU0VUVElORyBHRlhfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyNFtdID0geworLyogIENsa1JhbmdlLCBEVlAwLCBEVlAwRGF0YURyaXZpbmcsICBEVlAwQ2xvY2tEcml2aW5nLCBEVlAxLAorCQkJCQlEVlAxRHJpdmluZywgREZQSGlnaCwgREZQTG93ICovCisvKiAgQ1I5NiwgU1IyQVs1XSwgU1IxQlsxXSwgU1IyQVs0XSwgU1IxRVsyXSwgQ1I5QiwKKwkJCQkJU1I2NSwgICAgICAgIENSOTcsICAgIENSOTkgICAqLworCS8qIExDSy9WQ0sgPCAzMDAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCisJe0RQQV9DTEtfUkFOR0VfMzBNLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAorCSAweDAwfSwKKwkvKiAzMDAwMDAwMCA8IExDSy9WQ0sgPCA1MDAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCisJe0RQQV9DTEtfUkFOR0VfMzBfNTBNLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAorCSAweDAwfSwKKwkvKiA1MDAwMDAwMCA8IExDSy9WQ0sgPCA3MDAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCisJe0RQQV9DTEtfUkFOR0VfNTBfNzBNLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLAorCSAweDAwfSwKKwkvKiA3MDAwMDAwMCA8IExDSy9WQ0sgPCAxMDAwMDAwMDAgd2lsbCB1c2UgdGhpcyB2YWx1ZSAqLworCXtEUEFfQ0xLX1JBTkdFXzcwXzEwME0sIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsCisJIDB4MDB9LAorCS8qIDEwMDAwMDAwMCA8IExDSy9WQ0sgPCAxNTAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCisJe0RQQV9DTEtfUkFOR0VfMTAwXzE1ME0sIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsCisJIDB4MDB9LAorCS8qIDE1MDAwMDAwIDwgTENLL1ZDSyB3aWxsIHVzZSB0aGlzIHZhbHVlICovCisJe0RQQV9DTEtfUkFOR0VfMTUwTSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwRSwgMHgwMCwKKwkgMHgwMH0sCit9OworCisvKiBGb3IgVlQzMzI3OiAqLworc3RydWN0IFZUMTYzNl9EUEFfU0VUVElORyBWVDE2MzZfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyN1tdID0geworCS8qIFBhbmVsIElELCAgICAgICBDTEtfU0VMX1NUMVswOV0sICAgIENMS19TRUxfU1QyWzA4XSAqLworCXtMQ0RfUEFORUxfSUQwXzY0MFg0ODAsIDB4MDAsIDB4MDB9LAkvKiBGb3IgNjQweDQ4MCAgICovCisJe0xDRF9QQU5FTF9JRDFfODAwWDYwMCwgMHgwMCwgMHgwMH0sCS8qIEZvciA4MDB4NjAwICAgKi8KKwl7TENEX1BBTkVMX0lEMl8xMDI0WDc2OCwgMHgwMCwgMHgwMH0sCS8qIEZvciAxMDI0eDc2OCAgKi8KKwl7TENEX1BBTkVMX0lEM18xMjgwWDc2OCwgMHgwMCwgMHgwMH0sCS8qIEZvciAxMjgweDc2OCAgKi8KKwl7TENEX1BBTkVMX0lENF8xMjgwWDEwMjQsIDB4MDAsIDB4MDB9LAkvKiBGb3IgMTI4MHgxMDI0ICovCisJe0xDRF9QQU5FTF9JRDVfMTQwMFgxMDUwLCAweDAwLCAweDAwfSwJLyogRm9yIDE0MDB4MTA1MCAqLworCXtMQ0RfUEFORUxfSUQ2XzE2MDBYMTIwMCwgMHgwMCwgMHgwMH0JLyogRm9yIDE2MDB4MTIwMCAqLworfTsKKworc3RydWN0IEdGWF9EUEFfU0VUVElORyBHRlhfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyN1tdID0geworLyogIENsa1JhbmdlLERWUDAsIERWUDBEYXRhRHJpdmluZywgIERWUDBDbG9ja0RyaXZpbmcsIERWUDEsCisJCQkJCURWUDFEcml2aW5nLCBERlBIaWdoLCAgIERGUExvdyAqLworLyogICBDUjk2LCBTUjJBWzVdLCBTUjFCWzFdLCBTUjJBWzRdLCBTUjFFWzJdLCBDUjlCLAorCQkJCQlTUjY1LCAgICAgICAgQ1I5NywgICAgICBDUjk5ICAgKi8KKy8qIExDSy9WQ0sgPCAzMDAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCit7RFBBX0NMS19SQU5HRV8zME0sIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDF9LAorLyogMzAwMDAwMDAgPCBMQ0svVkNLIDwgNTAwMDAwMDAgd2lsbCB1c2UgdGhpcyB2YWx1ZSAqLwore0RQQV9DTEtfUkFOR0VfMzBfNTBNLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDA4LCAweDAxfSwKKy8qIDUwMDAwMDAwIDwgTENLL1ZDSyA8IDcwMDAwMDAwIHdpbGwgdXNlIHRoaXMgdmFsdWUgKi8KK3tEUEFfQ0xLX1JBTkdFXzUwXzcwTSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMX0sCisvKiA3MDAwMDAwMCA8IExDSy9WQ0sgPCAxMDAwMDAwMDAgd2lsbCB1c2UgdGhpcyB2YWx1ZSAqLwore0RQQV9DTEtfUkFOR0VfNzBfMTAwTSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwOCwgMHgwM30sCisvKiAxMDAwMDAwMDAgPCBMQ0svVkNLIDwgMTUwMDAwMDAgd2lsbCB1c2UgdGhpcyB2YWx1ZSAqLwore0RQQV9DTEtfUkFOR0VfMTAwXzE1ME0sIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDJ9LAorLyogMTUwMDAwMDAgPCBMQ0svVkNLIHdpbGwgdXNlIHRoaXMgdmFsdWUgKi8KK3tEUEFfQ0xLX1JBTkdFXzE1ME0sIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEQsIDB4MDN9LAorfTsKKworLyogRm9yIFZUMzM2NDogKi8KK3N0cnVjdCBHRlhfRFBBX1NFVFRJTkcgR0ZYX0RQQV9TRVRUSU5HX1RCTF9WVDMzNjRbXSA9IHsKKy8qICBDbGtSYW5nZSxEVlAwLCBEVlAwRGF0YURyaXZpbmcsICBEVlAwQ2xvY2tEcml2aW5nLCBEVlAxLAorCQkJCQlEVlAxRHJpdmluZywgREZQSGlnaCwgICBERlBMb3cgKi8KKy8qICAgQ1I5NiwgU1IyQVs1XSwgU1IxQlsxXSwgU1IyQVs0XSwgU1IxRVsyXSwgQ1I5QiwKKwkJCQkJU1I2NSwgICAgICAgIENSOTcsICAgICAgQ1I5OSAgICovCisvKiBMQ0svVkNLIDwgMzAwMDAwMDAgd2lsbCB1c2UgdGhpcyB2YWx1ZSAqLwore0RQQV9DTEtfUkFOR0VfMzBNLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDA4fSwKKy8qIDMwMDAwMDAwIDwgTENLL1ZDSyA8IDUwMDAwMDAwIHdpbGwgdXNlIHRoaXMgdmFsdWUgKi8KK3tEUEFfQ0xLX1JBTkdFXzMwXzUwTSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOH0sCisvKiA1MDAwMDAwMCA8IExDSy9WQ0sgPCA3MDAwMDAwMCB3aWxsIHVzZSB0aGlzIHZhbHVlICovCit7RFBBX0NMS19SQU5HRV81MF83ME0sIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDh9LAorLyogNzAwMDAwMDAgPCBMQ0svVkNLIDwgMTAwMDAwMDAwIHdpbGwgdXNlIHRoaXMgdmFsdWUgKi8KK3tEUEFfQ0xLX1JBTkdFXzcwXzEwME0sIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDh9LAorLyogMTAwMDAwMDAwIDwgTENLL1ZDSyA8IDE1MDAwMDAwIHdpbGwgdXNlIHRoaXMgdmFsdWUgKi8KK3tEUEFfQ0xLX1JBTkdFXzEwMF8xNTBNLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDA4fSwKKy8qIDE1MDAwMDAwIDwgTENLL1ZDSyB3aWxsIHVzZSB0aGlzIHZhbHVlICovCit7RFBBX0NMS19SQU5HRV8xNTBNLCAweDAxLCAweDAwLCAweDAyLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDA4fSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS90YmxEUEFTZXR0aW5nLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS90YmxEUEFTZXR0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3RibERQQVNldHRpbmcuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9UQkxEUEFTRVRUSU5HX0hfCisjZGVmaW5lIF9UQkxEUEFTRVRUSU5HX0hfCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKyNkZWZpbmUgRFBBX0NMS18zME0gICAgICAgMzAwMDAwMDAKKyNkZWZpbmUgRFBBX0NMS181ME0gICAgICAgNTAwMDAwMDAKKyNkZWZpbmUgRFBBX0NMS183ME0gICAgICAgNzAwMDAwMDAKKyNkZWZpbmUgRFBBX0NMS18xMDBNICAgICAgMTAwMDAwMDAwCisjZGVmaW5lIERQQV9DTEtfMTUwTSAgICAgIDE1MDAwMDAwMAorCitlbnVtIERQQV9SQU5HRSB7CisJRFBBX0NMS19SQU5HRV8zME0sCisJRFBBX0NMS19SQU5HRV8zMF81ME0sCisJRFBBX0NMS19SQU5HRV81MF83ME0sCisJRFBBX0NMS19SQU5HRV83MF8xMDBNLAorCURQQV9DTEtfUkFOR0VfMTAwXzE1ME0sCisJRFBBX0NMS19SQU5HRV8xNTBNCit9OworCitleHRlcm4gc3RydWN0IFZUMTYzNl9EUEFfU0VUVElORyBWVDE2MzZfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyNFs3XTsKK2V4dGVybiBzdHJ1Y3QgR0ZYX0RQQV9TRVRUSU5HIEdGWF9EUEFfU0VUVElOR19UQkxfVlQzMzI0WzZdOworZXh0ZXJuIHN0cnVjdCBWVDE2MzZfRFBBX1NFVFRJTkcgVlQxNjM2X0RQQV9TRVRUSU5HX1RCTF9WVDMzMjdbN107CitleHRlcm4gc3RydWN0IEdGWF9EUEFfU0VUVElORyBHRlhfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyN1tdOworZXh0ZXJuIHN0cnVjdCBHRlhfRFBBX1NFVFRJTkcgR0ZYX0RQQV9TRVRUSU5HX1RCTF9WVDMzNjRbNl07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX2kyYy5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhX2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmM2VkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfaTJjLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworc3RhdGljIHZvaWQgdmlhX2kyY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXU4IHZhbDsKKwlzdHJ1Y3QgdmlhX2kyY19zdHVmZiAqdmlhX2kyY19jaGFuID0gKHN0cnVjdCB2aWFfaTJjX3N0dWZmICopZGF0YTsKKworCXZhbCA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCB2aWFfaTJjX2NoYW4tPmkyY19wb3J0KSAmIDB4RjA7CisJaWYgKHN0YXRlKQorCQl2YWwgfD0gMHgyMDsKKwllbHNlCisJCXZhbCAmPSB+MHgyMDsKKwlzd2l0Y2ggKHZpYV9pMmNfY2hhbi0+aTJjX3BvcnQpIHsKKwljYXNlIEkyQ1BPUlRJTkRFWDoKKwkJdmFsIHw9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgR1BJT1BPUlRJTkRFWDoKKwkJdmFsIHw9IDB4ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHX01TRygidmlhX2kyYzogc3BlY2lmeSB3cm9uZyBpMmMgcG9ydC5cbiIpOworCX0KKwl2aWFmYl93cml0ZV9yZWcodmlhX2kyY19jaGFuLT5pMmNfcG9ydCwgVklBU1IsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2kyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmlhX2kyY19zdHVmZiAqdmlhX2kyY19jaGFuID0gKHN0cnVjdCB2aWFfaTJjX3N0dWZmICopZGF0YTsKKworCWlmICh2aWFmYl9yZWFkX3JlZyhWSUFTUiwgdmlhX2kyY19jaGFuLT5pMmNfcG9ydCkgJiAweDA4KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfaTJjX2dldHNkYSh2b2lkICpkYXRhKQoreworCXN0cnVjdCB2aWFfaTJjX3N0dWZmICp2aWFfaTJjX2NoYW4gPSAoc3RydWN0IHZpYV9pMmNfc3R1ZmYgKilkYXRhOworCisJaWYgKHZpYWZiX3JlYWRfcmVnKFZJQVNSLCB2aWFfaTJjX2NoYW4tPmkyY19wb3J0KSAmIDB4MDQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aWFfaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJdTggdmFsOworCXN0cnVjdCB2aWFfaTJjX3N0dWZmICp2aWFfaTJjX2NoYW4gPSAoc3RydWN0IHZpYV9pMmNfc3R1ZmYgKilkYXRhOworCisJdmFsID0gdmlhZmJfcmVhZF9yZWcoVklBU1IsIHZpYV9pMmNfY2hhbi0+aTJjX3BvcnQpICYgMHhGMDsKKwlpZiAoc3RhdGUpCisJCXZhbCB8PSAweDEwOworCWVsc2UKKwkJdmFsICY9IH4weDEwOworCXN3aXRjaCAodmlhX2kyY19jaGFuLT5pMmNfcG9ydCkgeworCWNhc2UgSTJDUE9SVElOREVYOgorCQl2YWwgfD0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBHUElPUE9SVElOREVYOgorCQl2YWwgfD0gMHg0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdfTVNHKCJ2aWFfaTJjOiBzcGVjaWZ5IHdyb25nIGkyYyBwb3J0LlxuIik7CisJfQorCXZpYWZiX3dyaXRlX3JlZyh2aWFfaTJjX2NoYW4tPmkyY19wb3J0LCBWSUFTUiwgdmFsKTsKK30KKworaW50IHZpYWZiX2kyY19yZWFkYnl0ZSh1OCBzbGF2ZV9hZGRyLCB1OCBpbmRleCwgdTggKnBkYXRhKQoreworCXU4IG1tMVtdID0gezB4MDB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl07CisKKwkqcGRhdGEgPSAwOworCW1zZ3NbMF0uZmxhZ3MgPSAwOworCW1zZ3NbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2dzWzBdLmFkZHIgPSBtc2dzWzFdLmFkZHIgPSBzbGF2ZV9hZGRyIC8gMjsKKwltbTFbMF0gPSBpbmRleDsKKwltc2dzWzBdLmxlbiA9IDE7IG1zZ3NbMV0ubGVuID0gMTsKKwltc2dzWzBdLmJ1ZiA9IG1tMTsgbXNnc1sxXS5idWYgPSBwZGF0YTsKKwlpMmNfdHJhbnNmZXIoJnZpYXBhcmluZm8tPmkyY19zdHVmZi5hZGFwdGVyLCBtc2dzLCAyKTsKKworCXJldHVybiAwOworfQorCitpbnQgdmlhZmJfaTJjX3dyaXRlYnl0ZSh1OCBzbGF2ZV9hZGRyLCB1OCBpbmRleCwgdTggZGF0YSkKK3sKKwl1OCBtc2dbMl0gPSB7IGluZGV4LCBkYXRhIH07CisJc3RydWN0IGkyY19tc2cgbXNnczsKKworCW1zZ3MuZmxhZ3MgPSAwOworCW1zZ3MuYWRkciA9IHNsYXZlX2FkZHIgLyAyOworCW1zZ3MubGVuID0gMjsKKwltc2dzLmJ1ZiA9IG1zZzsKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKCZ2aWFwYXJpbmZvLT5pMmNfc3R1ZmYuYWRhcHRlciwgJm1zZ3MsIDEpOworfQorCitpbnQgdmlhZmJfaTJjX3JlYWRieXRlcyh1OCBzbGF2ZV9hZGRyLCB1OCBpbmRleCwgdTggKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwl1OCBtbTFbXSA9IHsweDAwfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdOworCisJbXNnc1swXS5mbGFncyA9IDA7CisJbXNnc1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ3NbMF0uYWRkciA9IG1zZ3NbMV0uYWRkciA9IHNsYXZlX2FkZHIgLyAyOworCW1tMVswXSA9IGluZGV4OworCW1zZ3NbMF0ubGVuID0gMTsgbXNnc1sxXS5sZW4gPSBidWZmX2xlbjsKKwltc2dzWzBdLmJ1ZiA9IG1tMTsgbXNnc1sxXS5idWYgPSBidWZmOworCWkyY190cmFuc2ZlcigmdmlhcGFyaW5mby0+aTJjX3N0dWZmLmFkYXB0ZXIsIG1zZ3MsIDIpOworCXJldHVybiAwOworfQorCitpbnQgdmlhZmJfY3JlYXRlX2kyY19idXModm9pZCAqdmlhcGFyKQoreworCWludCByZXQ7CisJc3RydWN0IHZpYWZiX3BhciAqcGFyID0gKHN0cnVjdCB2aWFmYl9wYXIgKil2aWFwYXI7CisKKwlzdHJjcHkocGFyLT5pMmNfc3R1ZmYuYWRhcHRlci5uYW1lLCAidmlhX2kyYyIpOworCXBhci0+aTJjX3N0dWZmLmkyY19wb3J0ID0gMHgwOworCXBhci0+aTJjX3N0dWZmLmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwlwYXItPmkyY19zdHVmZi5hZGFwdGVyLmlkID0gMHgwMUZGRkY7CisJcGFyLT5pMmNfc3R1ZmYuYWRhcHRlci5jbGFzcyA9IDA7CisJcGFyLT5pMmNfc3R1ZmYuYWRhcHRlci5hbGdvX2RhdGEgPSAmcGFyLT5pMmNfc3R1ZmYuYWxnbzsKKwlwYXItPmkyY19zdHVmZi5hZGFwdGVyLmRldi5wYXJlbnQgPSBOVUxMOworCXBhci0+aTJjX3N0dWZmLmFsZ28uc2V0c2RhID0gdmlhX2kyY19zZXRzZGE7CisJcGFyLT5pMmNfc3R1ZmYuYWxnby5zZXRzY2wgPSB2aWFfaTJjX3NldHNjbDsKKwlwYXItPmkyY19zdHVmZi5hbGdvLmdldHNkYSA9IHZpYV9pMmNfZ2V0c2RhOworCXBhci0+aTJjX3N0dWZmLmFsZ28uZ2V0c2NsID0gdmlhX2kyY19nZXRzY2w7CisJcGFyLT5pMmNfc3R1ZmYuYWxnby51ZGVsYXkgPSA0MDsKKwlwYXItPmkyY19zdHVmZi5hbGdvLnRpbWVvdXQgPSAyMDsKKwlwYXItPmkyY19zdHVmZi5hbGdvLmRhdGEgPSAmcGFyLT5pMmNfc3R1ZmY7CisKKwlpMmNfc2V0X2FkYXBkYXRhKCZwYXItPmkyY19zdHVmZi5hZGFwdGVyLCAmcGFyLT5pMmNfc3R1ZmYpOworCisJLyogUmFpc2UgU0NMIGFuZCBTREEgKi8KKwlwYXItPmkyY19zdHVmZi5pMmNfcG9ydCA9IEkyQ1BPUlRJTkRFWDsKKwl2aWFfaTJjX3NldHNkYSgmcGFyLT5pMmNfc3R1ZmYsIDEpOworCXZpYV9pMmNfc2V0c2NsKCZwYXItPmkyY19zdHVmZiwgMSk7CisKKwlwYXItPmkyY19zdHVmZi5pMmNfcG9ydCA9IEdQSU9QT1JUSU5ERVg7CisJdmlhX2kyY19zZXRzZGEoJnBhci0+aTJjX3N0dWZmLCAxKTsKKwl2aWFfaTJjX3NldHNjbCgmcGFyLT5pMmNfc3R1ZmYsIDEpOworCXVkZWxheSgyMCk7CisKKwlyZXQgPSBpMmNfYml0X2FkZF9idXMoJnBhci0+aTJjX3N0dWZmLmFkYXB0ZXIpOworCWlmIChyZXQgPT0gMCkKKwkJREVCVUdfTVNHKCJJMkMgYnVzICVzIHJlZ2lzdGVyZWQuXG4iLAorCQlwYXItPmkyY19zdHVmZi5hZGFwdGVyLm5hbWUpOworCWVsc2UKKwkJREVCVUdfTVNHKCJGYWlsZWQgdG8gcmVnaXN0ZXIgSTJDIGJ1cyAlcy5cbiIsCisJCQlwYXItPmkyY19zdHVmZi5hZGFwdGVyLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdmlhZmJfZGVsZXRlX2kyY19idXNzKHZvaWQgKnBhcikKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJigoc3RydWN0IHZpYWZiX3BhciAqKXBhciktPmkyY19zdHVmZi5hZGFwdGVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV9pMmMuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEzMjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhX2kyYy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaWZuZGVmIF9fVklBX0kyQ19IX18KKyNkZWZpbmUgX19WSUFfSTJDX0hfXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisKK3N0cnVjdCB2aWFfaTJjX3N0dWZmIHsKKwl1MTYgaTJjX3BvcnQ7CQkJLyogR1BJTyBvciBJMkMgcG9ydCAqLworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOworCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBhbGdvOworfTsKKworI2RlZmluZSBJMkNQT1JUICAgICAgICAgICAweDNjNAorI2RlZmluZSBJMkNQT1JUSU5ERVggICAgICAweDMxCisjZGVmaW5lIEdQSU9QT1JUICAgICAgICAgIDB4M0M0CisjZGVmaW5lIEdQSU9QT1JUSU5ERVggICAgIDB4MkMKKyNkZWZpbmUgSTJDX0JVUyAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fQlVTICAgICAgICAgICAgMgorI2RlZmluZSBERUxBWVBPUlQgICAgICAgICAgIDB4M0MzCisKK2ludCB2aWFmYl9pMmNfcmVhZGJ5dGUodTggc2xhdmVfYWRkciwgdTggaW5kZXgsIHU4ICpwZGF0YSk7CitpbnQgdmlhZmJfaTJjX3dyaXRlYnl0ZSh1OCBzbGF2ZV9hZGRyLCB1OCBpbmRleCwgdTggZGF0YSk7CitpbnQgdmlhZmJfaTJjX3JlYWRieXRlcyh1OCBzbGF2ZV9hZGRyLCB1OCBpbmRleCwgdTggKmJ1ZmYsIGludCBidWZmX2xlbik7CitpbnQgdmlhZmJfY3JlYXRlX2kyY19idXModm9pZCAqcGFyKTsKK3ZvaWQgdmlhZmJfZGVsZXRlX2kyY19idXNzKHZvaWQgKnBhcik7CisjZW5kaWYgLyogX19WSUFfSTJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX3V0aWxpdHkuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV91dGlsaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzYzNkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV91dGlsaXR5LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKwordm9pZCB2aWFmYl9nZXRfZGV2aWNlX3N1cHBvcnRfc3RhdGUodTMyICpzdXBwb3J0X3N0YXRlKQoreworCSpzdXBwb3J0X3N0YXRlID0gQ1JUX0RldmljZTsKKworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLnRtZHNfY2hpcF9uYW1lID09IFZUMTYzMl9UTURTKQorCQkqc3VwcG9ydF9zdGF0ZSB8PSBEVklfRGV2aWNlOworCisJaWYgKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUgPT0gVlQxNjMxX0xWRFMpCisJCSpzdXBwb3J0X3N0YXRlIHw9IExDRF9EZXZpY2U7Cit9CisKK3ZvaWQgdmlhZmJfZ2V0X2RldmljZV9jb25uZWN0X3N0YXRlKHUzMiAqY29ubmVjdF9zdGF0ZSkKK3sKKwlib29sIG1vYmlsZSA9IGZhbHNlOworCisJKmNvbm5lY3Rfc3RhdGUgPSBDUlRfRGV2aWNlOworCisJaWYgKHZpYWZiX2R2aV9zZW5zZSgpKQorCQkqY29ubmVjdF9zdGF0ZSB8PSBEVklfRGV2aWNlOworCisJdmlhZmJfbGNkX2dldF9tb2JpbGVfc3RhdGUoJm1vYmlsZSk7CisJaWYgKG1vYmlsZSkKKwkJKmNvbm5lY3Rfc3RhdGUgfD0gTENEX0RldmljZTsKK30KKworYm9vbCB2aWFmYl9sY2RfZ2V0X3N1cHBvcnRfZXhwYW5kX3N0YXRlKHUzMiB4cmVzLCB1MzIgeXJlcykKK3sKKwl1bnNpZ25lZCBpbnQgc3VwcG9ydF9zdGF0ZSA9IDA7CisKKwlzd2l0Y2ggKHZpYWZiX2xjZF9wYW5lbF9pZCkgeworCWNhc2UgTENEX1BBTkVMX0lEMF82NDBYNDgwOgorCQlpZiAoKHhyZXMgPCA2NDApICYmICh5cmVzIDwgNDgwKSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgTENEX1BBTkVMX0lEMV84MDBYNjAwOgorCQlpZiAoKHhyZXMgPCA4MDApICYmICh5cmVzIDwgNjAwKSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgTENEX1BBTkVMX0lEMl8xMDI0WDc2ODoKKwkJaWYgKCh4cmVzIDwgMTAyNCkgJiYgKHlyZXMgPCA3NjgpKQorCQkJc3VwcG9ydF9zdGF0ZSA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfUEFORUxfSUQzXzEyODBYNzY4OgorCQlpZiAoKHhyZXMgPCAxMjgwKSAmJiAoeXJlcyA8IDc2OCkpCisJCQlzdXBwb3J0X3N0YXRlID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9QQU5FTF9JRDRfMTI4MFgxMDI0OgorCQlpZiAoKHhyZXMgPCAxMjgwKSAmJiAoeXJlcyA8IDEwMjQpKQorCQkJc3VwcG9ydF9zdGF0ZSA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfUEFORUxfSUQ1XzE0MDBYMTA1MDoKKwkJaWYgKCh4cmVzIDwgMTQwMCkgJiYgKHlyZXMgPCAxMDUwKSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgTENEX1BBTkVMX0lENl8xNjAwWDEyMDA6CisJCWlmICgoeHJlcyA8IDE2MDApICYmICh5cmVzIDwgMTIwMCkpCisJCQlzdXBwb3J0X3N0YXRlID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9QQU5FTF9JRDdfMTM2Nlg3Njg6CisJCWlmICgoeHJlcyA8IDEzNjYpICYmICh5cmVzIDwgNzY4KSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgTENEX1BBTkVMX0lEOF8xMDI0WDYwMDoKKwkJaWYgKCh4cmVzIDwgMTAyNCkgJiYgKHlyZXMgPCA2MDApKQorCQkJc3VwcG9ydF9zdGF0ZSA9IHRydWU7CisJCWJyZWFrOworCisJY2FzZSBMQ0RfUEFORUxfSUQ5XzEyODBYODAwOgorCQlpZiAoKHhyZXMgPCAxMjgwKSAmJiAoeXJlcyA8IDgwMCkpCisJCQlzdXBwb3J0X3N0YXRlID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9QQU5FTF9JREFfODAwWDQ4MDoKKwkJaWYgKCh4cmVzIDwgODAwKSAmJiAoeXJlcyA8IDQ4MCkpCisJCQlzdXBwb3J0X3N0YXRlID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIExDRF9QQU5FTF9JREJfMTM2MFg3Njg6CisJCWlmICgoeHJlcyA8IDEzNjApICYmICh5cmVzIDwgNzY4KSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgTENEX1BBTkVMX0lEQ180ODBYNjQwOgorCQlpZiAoKHhyZXMgPCA0ODApICYmICh5cmVzIDwgNjQwKSkKKwkJCXN1cHBvcnRfc3RhdGUgPSB0cnVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN1cHBvcnRfc3RhdGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN1cHBvcnRfc3RhdGU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgR2FtbWEgRnVuY3Rpb24gSW1wbGVtZW50YXRpb24qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgdmlhZmJfc2V0X2dhbW1hX3RhYmxlKGludCBicHAsIHVuc2lnbmVkIGludCAqZ2FtbWFfdGFibGUpCit7CisJaW50IGksIHNyMWE7CisJaW50IGFjdGl2ZV9kZXZpY2VfYW1vdW50ID0gMDsKKwlpbnQgZGV2aWNlX3N0YXR1cyA9IHZpYWZiX0RldmljZVN0YXR1czsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodmlhZmJfRGV2aWNlU3RhdHVzKSAqIDg7IGkrKykgeworCQlpZiAoZGV2aWNlX3N0YXR1cyAmIDEpCisJCQlhY3RpdmVfZGV2aWNlX2Ftb3VudCsrOworCQlkZXZpY2Vfc3RhdHVzID4+PSAxOworCX0KKworCS8qIDggYnBwIG1vZGUgY2FuJ3QgYWRqdXN0IGdhbW1hICovCisJaWYgKGJwcCA9PSA4KQorCQlyZXR1cm4gOworCisJLyogRW5hYmxlIEdhbW1hICovCisJc3dpdGNoICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwljYXNlIFVOSUNIUk9NRV9DTEUyNjY6CisJY2FzZSBVTklDSFJPTUVfSzQwMDoKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxNiwgVklBU1IsIDB4ODAsIEJJVDcpOworCQlicmVhazsKKworCWNhc2UgVU5JQ0hST01FX0s4MDA6CisJY2FzZSBVTklDSFJPTUVfUE04MDA6CisJY2FzZSBVTklDSFJPTUVfQ043MDA6CisJY2FzZSBVTklDSFJPTUVfQ1g3MDA6CisJY2FzZSBVTklDSFJPTUVfSzhNODkwOgorCWNhc2UgVU5JQ0hST01FX1A0TTg5MDoKKwljYXNlIFVOSUNIUk9NRV9QNE05MDA6CisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMzMsIFZJQUNSLCAweDgwLCBCSVQ3KTsKKwkJYnJlYWs7CisJfQorCXNyMWEgPSAodW5zaWduZWQgaW50KXZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjFBKTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFBLCBWSUFTUiwgMHgwLCBCSVQwKTsKKworCS8qIEZpbGwgSUdBMSBHYW1tYSBUYWJsZSAqLworCW91dGIoMCwgTFVUX0lOREVYX1dSSVRFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJb3V0YihnYW1tYV90YWJsZVtpXSA+PiAxNiwgTFVUX0RBVEEpOworCQlvdXRiKGdhbW1hX3RhYmxlW2ldID4+IDggJiAweEZGLCBMVVRfREFUQSk7CisJCW91dGIoZ2FtbWFfdGFibGVbaV0gJiAweEZGLCBMVVRfREFUQSk7CisJfQorCisJLyogSWYgYWRqdXN0IEdhbW1hIHZhbHVlIGluIFNBTU0sIGZpbGwgSUdBMSwKKwkgICBJR0EyIEdhbW1hIHRhYmxlIHNpbXVsdGFub3VzLiAqLworCS8qIFN3aXRjaCB0byBJR0EyIEdhbW1hIFRhYmxlICovCisJaWYgKChhY3RpdmVfZGV2aWNlX2Ftb3VudCA+IDEpICYmCisJCSEoKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PQorCQlVTklDSFJPTUVfQ0xFMjY2KSAmJgorCQkodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9yZXZpc2lvbiA8IDE1KSkpIHsKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxQSwgVklBU1IsIDB4MDEsIEJJVDApOworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMHgwMiwgQklUMSk7CisKKwkJLyogRmlsbCBJR0EyIEdhbW1hIFRhYmxlICovCisJCW91dGIoMCwgTFVUX0lOREVYX1dSSVRFKTsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlvdXRiKGdhbW1hX3RhYmxlW2ldID4+IDE2LCBMVVRfREFUQSk7CisJCQlvdXRiKGdhbW1hX3RhYmxlW2ldID4+IDggJiAweEZGLCBMVVRfREFUQSk7CisJCQlvdXRiKGdhbW1hX3RhYmxlW2ldICYgMHhGRiwgTFVUX0RBVEEpOworCQl9CisJfQorCXZpYWZiX3dyaXRlX3JlZyhTUjFBLCBWSUFTUiwgc3IxYSk7Cit9CisKK3ZvaWQgdmlhZmJfZ2V0X2dhbW1hX3RhYmxlKHVuc2lnbmVkIGludCAqZ2FtbWFfdGFibGUpCit7CisJdW5zaWduZWQgY2hhciBjb2xvcl9yLCBjb2xvcl9nLCBjb2xvcl9iOworCXVuc2lnbmVkIGNoYXIgc3IxYSA9IDA7CisJaW50IGk7CisKKwkvKiBFbmFibGUgR2FtbWEgKi8KKwlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSkgeworCWNhc2UgVU5JQ0hST01FX0NMRTI2NjoKKwljYXNlIFVOSUNIUk9NRV9LNDAwOgorCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjE2LCBWSUFTUiwgMHg4MCwgQklUNyk7CisJCWJyZWFrOworCisJY2FzZSBVTklDSFJPTUVfSzgwMDoKKwljYXNlIFVOSUNIUk9NRV9QTTgwMDoKKwljYXNlIFVOSUNIUk9NRV9DTjcwMDoKKwljYXNlIFVOSUNIUk9NRV9DWDcwMDoKKwljYXNlIFVOSUNIUk9NRV9LOE04OTA6CisJY2FzZSBVTklDSFJPTUVfUDRNODkwOgorCWNhc2UgVU5JQ0hST01FX1A0TTkwMDoKKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzMywgVklBQ1IsIDB4ODAsIEJJVDcpOworCQlicmVhazsKKwl9CisJc3IxYSA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjFBKTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFBLCBWSUFTUiwgMHgwLCBCSVQwKTsKKworCS8qIFJlYWRpbmcgZ2FtbWEgdGFibGUgdG8gZ2V0IGNvbG9yIHZhbHVlICovCisJb3V0YigwLCBMVVRfSU5ERVhfUkVBRCk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWNvbG9yX3IgPSBpbmIoTFVUX0RBVEEpOworCQljb2xvcl9nID0gaW5iKExVVF9EQVRBKTsKKwkJY29sb3JfYiA9IGluYihMVVRfREFUQSk7CisJCWdhbW1hX3RhYmxlW2ldID0KKwkJICAgICgoKCh1MzIpIGNvbG9yX3IpIDw8IDE2KSB8CisJCSAgICAgKCgodTE2KSBjb2xvcl9nKSA8PCA4KSkgfCBjb2xvcl9iOworCX0KKwl2aWFmYl93cml0ZV9yZWcoU1IxQSwgVklBU1IsIHNyMWEpOworfQorCit2b2lkIHZpYWZiX2dldF9nYW1tYV9zdXBwb3J0X3N0YXRlKGludCBicHAsIHVuc2lnbmVkIGludCAqc3VwcG9ydF9zdGF0ZSkKK3sKKwlpZiAoYnBwID09IDgpCisJCSpzdXBwb3J0X3N0YXRlID0gTm9uZV9EZXZpY2U7CisJZWxzZQorCQkqc3VwcG9ydF9zdGF0ZSA9IENSVF9EZXZpY2UgfCBEVklfRGV2aWNlIHwgTENEX0RldmljZTsKK30KKworaW50IHZpYWZiX2lucHV0X3BhcmFtZXRlcl9jb252ZXJ0ZXIoaW50IHBhcmFtZXRlcl92YWx1ZSkKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKHBhcmFtZXRlcl92YWx1ZSA+PSAxICYmIHBhcmFtZXRlcl92YWx1ZSA8PSA5KQorCQlyZXN1bHQgPSAxIDw8IChwYXJhbWV0ZXJfdmFsdWUgLSAxKTsKKwllbHNlCisJCXJlc3VsdCA9IDE7CisKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX3V0aWxpdHkuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV91dGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNDU1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYV91dGlsaXR5LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19WSUFVVElMSVRZX0hfXworI2RlZmluZSBfX1ZJQVVUSUxJVFlfSF9fCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBnZXQgaW5mb21hdGlvbiBhYm91dCBkZXZpY2UncyBzdGF0ZSAqLwordm9pZCB2aWFmYl9nZXRfZGV2aWNlX3N1cHBvcnRfc3RhdGUodTMyICpzdXBwb3J0X3N0YXRlKTsKK3ZvaWQgdmlhZmJfZ2V0X2RldmljZV9jb25uZWN0X3N0YXRlKHUzMiAqY29ubmVjdF9zdGF0ZSk7Citib29sIHZpYWZiX2xjZF9nZXRfc3VwcG9ydF9leHBhbmRfc3RhdGUodTMyIHhyZXMsIHUzMiB5cmVzKTsKKworLyogVGhlc2UgZnVuY3Rpb24gYXJlIHVzZWQgdG8gYWNjZXNzIGdhbW1hIHRhYmxlICovCit2b2lkIHZpYWZiX3NldF9nYW1tYV90YWJsZShpbnQgYnBwLCB1bnNpZ25lZCBpbnQgKmdhbW1hX3RhYmxlKTsKK3ZvaWQgdmlhZmJfZ2V0X2dhbW1hX3RhYmxlKHVuc2lnbmVkIGludCAqZ2FtbWFfdGFibGUpOwordm9pZCB2aWFmYl9nZXRfZ2FtbWFfc3VwcG9ydF9zdGF0ZShpbnQgYnBwLCB1bnNpZ25lZCBpbnQgKnN1cHBvcnRfc3RhdGUpOworaW50IHZpYWZiX2lucHV0X3BhcmFtZXRlcl9jb252ZXJ0ZXIoaW50IHBhcmFtZXRlcl92YWx1ZSk7CisKKyNlbmRpZiAvKiBfX1ZJQVVUSUxJVFlfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMyZWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwpAQCAtMCwwICsxLDI1NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNkZWZpbmUgX01BU1RFUl9GSUxFCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworc3RhdGljIGludCBNQVhfQ1VSUyA9IDMyOworc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3ZhcjsKK3N0YXRpYyBjaGFyICp2aWFmYl9uYW1lID0gIlZpYSI7CitzdGF0aWMgdTMyIHBzZXVkb19wYWxbMTddOworCisvKiB2aWRlbyBtb2RlICovCitzdGF0aWMgY2hhciAqdmlhZmJfbW9kZSA9ICI2NDB4NDgwIjsKK3N0YXRpYyBjaGFyICp2aWFmYl9tb2RlMSA9ICI2NDB4NDgwIjsKK3N0YXRpYyBpbnQgdmlhZmJfcmVzTW9kZSA9IFZJQV9SRVNfNjQwWDQ4MDsKKworLyogQWRkZWQgZm9yIHNwZWNpZnlpbmcgYWN0aXZlIGRldmljZXMuKi8KK2NoYXIgKnZpYWZiX2FjdGl2ZV9kZXYgPSAiIjsKKworLyogQWRkZWQgZm9yIHNwZWNpZnlpbmcgdmlkZW8gb24gZGV2aWNlcy4qLworY2hhciAqdmlhZmJfdmlkZW9fZGV2ID0gIiI7CisKKy8qQWRkZWQgZm9yIHNwZWNpZnkgbGNkIG91dHB1dCBwb3J0Ki8KK2NoYXIgKnZpYWZiX2xjZF9wb3J0ID0gIiI7CitjaGFyICp2aWFmYl9kdmlfcG9ydCA9ICIiOworCitzdGF0aWMgdm9pZCB2aWFmYl9zZXRfZGV2aWNlKHN0cnVjdCBkZXZpY2VfdCBhY3RpdmVfZGV2KTsKK3N0YXRpYyBpbnQgYXBwbHlfZGV2aWNlX3NldHRpbmcoc3RydWN0IHZpYWZiX2lvY3RsX3NldHRpbmcgc2V0dGluZ19pbmZvLAorCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGFwcGx5X3NlY29uZF9tb2RlX3NldHRpbmcoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvCisJKnNlY192YXIpOworc3RhdGljIHZvaWQgcmV0cmlldmVfZGV2aWNlX3NldHRpbmcoc3RydWN0IHZpYWZiX2lvY3RsX3NldHRpbmcKKwkqc2V0dGluZ19pbmZvKTsKK3N0YXRpYyB2b2lkIHZpYWZiX3NldF92aWRlb19kZXZpY2UodTMyIHZpZGVvX2Rldl9pbmZvKTsKK3N0YXRpYyB2b2lkIHZpYWZiX2dldF92aWRlb19kZXZpY2UodTMyICp2aWRlb19kZXZfaW5mbyk7CisKKy8qIE1vZGUgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlhZmJfbW9kZWluZm8gdmlhZmJfbW9kZW50cnlbXSA9IHsKKwl7NDgwLCA2NDAsIFZJQV9SRVNfNDgwWDY0MCwgIjQ4MHg2NDAifSwKKwl7NjQwLCA0ODAsIFZJQV9SRVNfNjQwWDQ4MCwgIjY0MHg0ODAifSwKKwl7ODAwLCA0ODAsIFZJQV9SRVNfODAwWDQ4MCwgIjgwMHg0ODAifSwKKwl7ODAwLCA2MDAsIFZJQV9SRVNfODAwWDYwMCwgIjgwMHg2MDAifSwKKwl7MTAyNCwgNzY4LCBWSUFfUkVTXzEwMjRYNzY4LCAiMTAyNHg3NjgifSwKKwl7MTE1MiwgODY0LCBWSUFfUkVTXzExNTJYODY0LCAiMTE1Mng4NjQifSwKKwl7MTI4MCwgMTAyNCwgVklBX1JFU18xMjgwWDEwMjQsICIxMjgweDEwMjQifSwKKwl7MTYwMCwgMTIwMCwgVklBX1JFU18xNjAwWDEyMDAsICIxNjAweDEyMDAifSwKKwl7MTQ0MCwgMTA1MCwgVklBX1JFU18xNDQwWDEwNTAsICIxNDQweDEwNTAifSwKKwl7MTI4MCwgNzY4LCBWSUFfUkVTXzEyODBYNzY4LCAiMTI4MHg3NjgifSwKKwl7MTI4MCwgODAwLCBWSUFfUkVTXzEyODBYODAwLCAiMTI4MHg4MDAifSwKKwl7MTI4MCwgOTYwLCBWSUFfUkVTXzEyODBYOTYwLCAiMTI4MHg5NjAifSwKKwl7MTkyMCwgMTQ0MCwgVklBX1JFU18xOTIwWDE0NDAsICIxOTIweDE0NDAifSwKKwl7ODQ4LCA0ODAsIFZJQV9SRVNfODQ4WDQ4MCwgIjg0OHg0ODAifSwKKwl7MTQwMCwgMTA1MCwgVklBX1JFU18xNDAwWDEwNTAsICIxNDAweDEwNTAifSwKKwl7NzIwLCA0ODAsIFZJQV9SRVNfNzIwWDQ4MCwgIjcyMHg0ODAifSwKKwl7NzIwLCA1NzYsIFZJQV9SRVNfNzIwWDU3NiwgIjcyMHg1NzYifSwKKwl7MTAyNCwgNTEyLCBWSUFfUkVTXzEwMjRYNTEyLCAiMTAyNHg1MTIifSwKKwl7MTAyNCwgNTc2LCBWSUFfUkVTXzEwMjRYNTc2LCAiMTAyNHg1NzYifSwKKwl7MTAyNCwgNjAwLCBWSUFfUkVTXzEwMjRYNjAwLCAiMTAyNHg2MDAifSwKKwl7MTI4MCwgNzIwLCBWSUFfUkVTXzEyODBYNzIwLCAiMTI4MHg3MjAifSwKKwl7MTkyMCwgMTA4MCwgVklBX1JFU18xOTIwWDEwODAsICIxOTIweDEwODAifSwKKwl7MTM2NiwgNzY4LCBWSUFfUkVTXzEzNjhYNzY4LCAiMTM2OHg3NjgifSwKKwl7MTY4MCwgMTA1MCwgVklBX1JFU18xNjgwWDEwNTAsICIxNjgweDEwNTAifSwKKwl7OTYwLCA2MDAsIFZJQV9SRVNfOTYwWDYwMCwgIjk2MHg2MDAifSwKKwl7MTAwMCwgNjAwLCBWSUFfUkVTXzEwMDBYNjAwLCAiMTAwMHg2MDAifSwKKwl7MTAyNCwgNTc2LCBWSUFfUkVTXzEwMjRYNTc2LCAiMTAyNHg1NzYifSwKKwl7MTAyNCwgNjAwLCBWSUFfUkVTXzEwMjRYNjAwLCAiMTAyNHg2MDAifSwKKwl7MTA4OCwgNjEyLCBWSUFfUkVTXzEwODhYNjEyLCAiMTA4OHg2MTIifSwKKwl7MTE1MiwgNzIwLCBWSUFfUkVTXzExNTJYNzIwLCAiMTE1Mng3MjAifSwKKwl7MTIwMCwgNzIwLCBWSUFfUkVTXzEyMDBYNzIwLCAiMTIwMHg3MjAifSwKKwl7MTI4MCwgNjAwLCBWSUFfUkVTXzEyODBYNjAwLCAiMTI4MHg2MDAifSwKKwl7MTM2MCwgNzY4LCBWSUFfUkVTXzEzNjBYNzY4LCAiMTM2MHg3NjgifSwKKwl7MTQ0MCwgOTAwLCBWSUFfUkVTXzE0NDBYOTAwLCAiMTQ0MHg5MDAifSwKKwl7MTYwMCwgOTAwLCBWSUFfUkVTXzE2MDBYOTAwLCAiMTYwMHg5MDAifSwKKwl7MTYwMCwgMTAyNCwgVklBX1JFU18xNjAwWDEwMjQsICIxNjAweDEwMjQifSwKKwl7MTc5MiwgMTM0NCwgVklBX1JFU18xNzkyWDEzNDQsICIxNzkyeDEzNDQifSwKKwl7MTg1NiwgMTM5MiwgVklBX1JFU18xODU2WDEzOTIsICIxODU2eDEzOTIifSwKKwl7MTkyMCwgMTIwMCwgVklBX1JFU18xOTIwWDEyMDAsICIxOTIweDEyMDAifSwKKwl7MjA0OCwgMTUzNiwgVklBX1JFU18yMDQ4WDE1MzYsICIyMDQ4eDE1MzYifSwKKwl7MCwgMCwgVklBX1JFU19JTlZBTElELCAiNjQweDQ4MCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGZiX29wcyB2aWFmYl9vcHM7CisKK3N0YXRpYyBpbnQgdmlhZmJfdXBkYXRlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHZpYWZiX3BhciAqcHBhcjsKKwlwcGFyID0gaW5mby0+cGFyOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfdXBkYXRlX2ZpeCFcbiIpOworCisJZml4LT52aXN1YWwgPQorCSAgICBwcGFyLT5icHAgPT0gOCA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJZml4LT5saW5lX2xlbmd0aCA9IHBwYXItPmxpbmVsZW5ndGg7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB2aWFmYl9zZXR1cF9maXhpbmZvKHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LAorCXN0cnVjdCB2aWFmYl9wYXIgKnZpYXBhcmluZm8pCit7CisJbWVtc2V0KGZpeCwgMCwgc2l6ZW9mKHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbykpOworCXN0cmNweShmaXgtPmlkLCB2aWFmYl9uYW1lKTsKKworCWZpeC0+c21lbV9zdGFydCA9IHZpYXBhcmluZm8tPmZibWVtOworCWZpeC0+c21lbV9sZW4gPSB2aWFwYXJpbmZvLT5mYm1lbV9mcmVlOworCWZpeC0+bW1pb19zdGFydCA9IHZpYXBhcmluZm8tPm1taW9fYmFzZTsKKwlmaXgtPm1taW9fbGVuID0gdmlhcGFyaW5mby0+bW1pb19sZW47CisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJZml4LT50eXBlX2F1eCA9IDA7CisKKwlmaXgtPnhwYW5zdGVwID0gZml4LT55d3JhcHN0ZXAgPSAwOworCWZpeC0+eXBhbnN0ZXAgPSAxOworCisJLyogSnVzdCB0ZWxsIHRoZSBhY2NlbCBuYW1lICovCisJdmlhZmJpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9WSUFfVU5JQ0hST01FOworfQorc3RhdGljIGludCB2aWFmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9vcGVuIVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfcmVsZWFzZSFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aWFmYl91cGRhdGVfdmlhZmJfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCB2aWFmYl9wYXIgKnBwYXI7CisKKwlwcGFyID0gaW5mby0+cGFyOworCXBwYXItPmJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKKwlwcGFyLT5saW5lbGVuZ3RoID0gKChpbmZvLT52YXIueHJlc192aXJ0dWFsICsgNykgJiB+NykgKiBwcGFyLT5icHAgLyA4OworCXBwYXItPmhyZXMgPSBpbmZvLT52YXIueHJlczsKKwlwcGFyLT52cmVzID0gaW5mby0+dmFyLnlyZXM7CisJcHBhci0+eG9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0OworCXBwYXItPnlvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldDsKK30KKworc3RhdGljIGludCB2aWFmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHZtb2RlX2luZGV4LCBodG90YWwsIHZ0b3RhbDsKKwlzdHJ1Y3QgdmlhZmJfcGFyICpwcGFyOworCXUzMiBsb25nX3JlZnJlc2g7CisJc3RydWN0IHZpYWZiX3BhciAqcF92aWFmYl9wYXI7CisJcHBhciA9IGluZm8tPnBhcjsKKworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfY2hlY2tfdmFyIVxuIik7CisJLyogU2FuaXR5IGNoZWNrICovCisJLyogSFcgbmVpdGhlciBzdXBwb3J0IGludGVybGFjdGUgbm9yIGRvdWJsZS1zY2FuZWQgbW9kZSAqLworCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCB8fCB2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtb2RlX2luZGV4ID0gdmlhZmJfZ2V0X21vZGVfaW5kZXgodmFyLT54cmVzLCB2YXItPnlyZXMsIDApOworCWlmICh2bW9kZV9pbmRleCA9PSBWSUFfUkVTX0lOVkFMSUQpIHsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTworCQkJICAidmlhZmI6IE1vZGUgJWR4JWR4JWQgbm90IHN1cHBvcnRlZCEhXG4iLAorCQkJICB2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgyNCA9PSB2YXItPmJpdHNfcGVyX3BpeGVsKQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMzI7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSA4ICYmIHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMTYgJiYKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCAhPSAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhci0+eHJlc192aXJ0dWFsICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMykpICYgMHgxRikKKwkJLyozMiBwaXhlbCBhbGlnbm1lbnQgKi8KKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSAodmFyLT54cmVzX3ZpcnR1YWwgKyAzMSkgJiB+MzE7CisJaWYgKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCA+CisJCXBwYXItPm1lbXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQmFzZWQgb24gdmFyIHBhc3NlZCBpbiB0byBjYWxjdWxhdGUgdGhlIHJlZnJlc2gsCisJICogYmVjYXVzZSBvdXIgZHJpdmVyIHVzZSBzb21lIG1vZGVzIHNwZWNpYWwuCisJICovCisJaHRvdGFsID0gdmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArCisJdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbjsKKwl2dG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArCisJCXZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CisJbG9uZ19yZWZyZXNoID0gMTAwMDAwMDAwMFVMIC8gdmFyLT5waXhjbG9jayAqIDEwMDA7CisJbG9uZ19yZWZyZXNoIC89IChodG90YWwgKiB2dG90YWwpOworCisJdmlhZmJfcmVmcmVzaCA9IHZpYWZiX2dldF9yZWZyZXNoKHZhci0+eHJlcywgdmFyLT55cmVzLCBsb25nX3JlZnJlc2gpOworCisJLyogQWRqdXN0IHZhciBhY2NvcmRpbmcgdG8gb3VyIGRyaXZlcidzIG93biB0YWJsZSAqLworCXZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKHZhciwgdmlhZmJfcmVmcmVzaCwgdm1vZGVfaW5kZXgpOworCisJLyogVGhpcyBpcyBpbmRlZWQgYSBwYXRjaCBmb3IgVlQzMzUzICovCisJaWYgKCFpbmZvLT5wYXIpCisJCXJldHVybiAtMTsKKwlwX3ZpYWZiX3BhciA9IChzdHJ1Y3QgdmlhZmJfcGFyICopaW5mby0+cGFyOworCWlmIChwX3ZpYWZiX3Bhci0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9WWDgwMCkKKwkJdmFyLT5hY2NlbF9mbGFncyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCB2bW9kZV9pbmRleDsKKwlpbnQgdm1vZGVfaW5kZXgxID0gMDsKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXRfcGFyIVxuIik7CisKKwl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcoaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAorCQkJICAgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLCB2aWFmYl9yZWZyZXNoLCAwKTsKKworCXZtb2RlX2luZGV4ID0gdmlhZmJfZ2V0X21vZGVfaW5kZXgoaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLCAwKTsKKworCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKKwkJREVCVUdfTVNHKEtFUk5fSU5GTworCQkidmlhZmJfc2Vjb25kX3hyZXMgPSAlZCwgdmlhZmJfc2Vjb25kX3lyZXMgPSAlZCwgYnBwID0gJWRcbiIsCisJCQkgIHZpYWZiX3NlY29uZF94cmVzLCB2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfYnBwMSk7CisJCXZtb2RlX2luZGV4MSA9IHZpYWZiX2dldF9tb2RlX2luZGV4KHZpYWZiX3NlY29uZF94cmVzLAorCQkJdmlhZmJfc2Vjb25kX3lyZXMsIDEpOworCQlERUJVR19NU0coS0VSTl9JTkZPICItPnZpYWZiX1NBTU1fT046IGluZGV4PSVkXG4iLAorCQkJdm1vZGVfaW5kZXgxKTsKKworCQl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcodmlhZmJfc2Vjb25kX3hyZXMsCisJCQl2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfYnBwMSwgdmlhZmJfcmVmcmVzaDEsIDEpOworCX0KKworCWlmICh2bW9kZV9pbmRleCAhPSBWSUFfUkVTX0lOVkFMSUQpIHsKKwkJdmlhZmJfc2V0bW9kZSh2bW9kZV9pbmRleCwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAorCQkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLCB2bW9kZV9pbmRleDEsCisJCQl2aWFmYl9zZWNvbmRfeHJlcywgdmlhZmJfc2Vjb25kX3lyZXMsIHZpYWZiX2JwcDEpOworCisJCS8qV2Ugc2hvdWxkIHNldCBtZW1vcnkgb2Zmc2V0IGFjY29yZGluZyB2aXJ0dWFsX3ggKi8KKwkJLypGaXggbWU6cHV0IHRoaXMgZnVuY3Rpb24gaW50byB2aWFmYl9zZXRtb2RlICovCisJCXZpYWZiX21lbW9yeV9waXRjaF9wYXRjaChpbmZvKTsKKworCQkvKiBVcGRhdGUgKioqZmJfcGFyIGluZm9ybWF0aW9uICovCisJCXZpYWZiX3VwZGF0ZV92aWFmYl9wYXIoaW5mbyk7CisKKwkJLyogVXBkYXRlIG90aGVyIGZpeGVkIGluZm9ybWF0aW9uICovCisJCXZpYWZiX3VwZGF0ZV9maXgoJmluZm8tPmZpeCwgaW5mbyk7CisJCXZpYWZiX2JwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKKwkJLyogVXBkYXRlIHZpYWZiX2FjY2VsLCBpdCBpcyBuZWNlc3NhcnkgdG8gb3VyIDJEIGFjY2VsZXJhdGUgKi8KKwkJdmlhZmJfYWNjZWwgPSBpbmZvLT52YXIuYWNjZWxfZmxhZ3M7CisKKwkJaWYgKHZpYWZiX2FjY2VsKQorCQkJdmlhZmJfc2V0XzJkX2NvbG9yX2RlcHRoKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvbmUgY29sb3IgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQgdmlhZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAordW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1OCBzcjFhLCBzcjFiLCBjcjY3LCBjcjZhLCByZXYgPSAwLCBzaGlmdCA9IDEwOworCXVuc2lnbmVkIGNtYXBfZW50cmllcyA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkgPyAyNTYgOiAxNjsKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXRjb2xyZWchXG4iKTsKKwlpZiAocmVnbm8gPj0gY21hcF9lbnRyaWVzKQorCQlyZXR1cm4gMTsKKwlpZiAoVU5JQ0hST01FX0NMRTI2NiA9PSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUpIHsKKwkJLyoKKwkJICogUmVhZCBQQ0kgYnVzIDAsZGV2IDAsZnVuY3Rpb24gMCxpbmRleCAweEY2IHRvIGdldCBjaGlwIHJldi4KKwkJICovCisJCW91dGwoMHg4MDAwMDAwMCB8ICgweGY2ICYgfjMpLCAodW5zaWduZWQgbG9uZykweENGOCk7CisJCXJldiA9IChpbmwoKHVuc2lnbmVkIGxvbmcpMHhDRkMpID4+ICgoMHhmNiAmIDMpICogOCkpICYgMHhmZjsKKwl9CisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCW91dGIoMHgxQSwgMHgzQzQpOworCQlzcjFhID0gaW5iKDB4M0M1KTsKKwkJb3V0YigweDFCLCAweDNDNCk7CisJCXNyMWIgPSBpbmIoMHgzQzUpOworCQlvdXRiKDB4NjcsIDB4M0Q0KTsKKwkJY3I2NyA9IGluYigweDNENSk7CisJCW91dGIoMHg2QSwgMHgzRDQpOworCQljcjZhID0gaW5iKDB4M0Q1KTsKKworCQkvKiBNYXAgdGhlIDNDNi83LzgvOSB0byB0aGUgSUdBMiAqLworCQlvdXRiKDB4MUEsIDB4M0M0KTsKKwkJb3V0YihzcjFhIHwgMHgwMSwgMHgzQzUpOworCQkvKiBTZWNvbmQgRGlzcGxheSBFbmdpbmUgY29sY2sgYWx3YXlzIG9uICovCisJCW91dGIoMHgxQiwgMHgzQzQpOworCQlvdXRiKHNyMWIgfCAweDgwLCAweDNDNSk7CisJCS8qIFNlY29uZCBEaXNwbGF5IENvbG9yIERlcHRoIDggKi8KKwkJb3V0YigweDY3LCAweDNENCk7CisJCW91dGIoY3I2NyAmIDB4M0YsIDB4M0Q1KTsKKwkJb3V0YigweDZBLCAweDNENCk7CisJCS8qIFNlY29uZCBEaXNwbGF5IENoYW5uZWwgUmVzZXQgQ1I2QVs2XSkgKi8KKwkJb3V0YihjcjZhICYgMHhCRiwgMHgzRDUpOworCQkvKiBTZWNvbmQgRGlzcGxheSBDaGFubmVsIEVuYWJsZSBDUjZBWzddICovCisJCW91dGIoY3I2YSB8IDB4ODAsIDB4M0Q1KTsKKwkJLyogU2Vjb25kIERpc3BsYXkgQ2hhbm5lbCBzdG9wIHJlc2V0KSAqLworCQlvdXRiKGNyNmEgfCAweDQwLCAweDNENSk7CisKKwkJLyogQml0IG1hc2sgb2YgcGFsZXR0ZSAqLworCQlvdXRiKDB4RkYsIDB4M2M2KTsKKwkJLyogV3JpdGUgb25lIHJlZ2lzdGVyIG9mIElHQTIgKi8KKwkJb3V0YihyZWdubywgMHgzQzgpOworCQlpZiAoVU5JQ0hST01FX0NMRTI2NiA9PSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgJiYKKwkJCXJldiA+PSAxNSkgeworCQkJc2hpZnQgPSA4OworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I2QSwgVklBQ1IsIEJJVDUsIEJJVDUpOworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IxNSwgVklBU1IsIEJJVDcsIEJJVDcpOworCQl9IGVsc2UgeworCQkJc2hpZnQgPSAxMDsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCAwLCBCSVQ1KTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMTUsIFZJQVNSLCAwLCBCSVQ3KTsKKwkJfQorCQlvdXRiKHJlZCA+PiBzaGlmdCwgMHgzQzkpOworCQlvdXRiKGdyZWVuID4+IHNoaWZ0LCAweDNDOSk7CisJCW91dGIoYmx1ZSA+PiBzaGlmdCwgMHgzQzkpOworCisJCS8qIE1hcCB0aGUgM0M2LzcvOC85IHRvIHRoZSBJR0ExICovCisJCW91dGIoMHgxQSwgMHgzQzQpOworCQlvdXRiKHNyMWEgJiAweEZFLCAweDNDNSk7CisJCS8qIEJpdCBtYXNrIG9mIHBhbGV0dGUgKi8KKwkJb3V0YigweEZGLCAweDNjNik7CisJCS8qIFdyaXRlIG9uZSByZWdpc3RlciBvZiBJR0ExICovCisJCW91dGIocmVnbm8sIDB4M0M4KTsKKwkJb3V0YihyZWQgPj4gc2hpZnQsIDB4M0M5KTsKKwkJb3V0YihncmVlbiA+PiBzaGlmdCwgMHgzQzkpOworCQlvdXRiKGJsdWUgPj4gc2hpZnQsIDB4M0M5KTsKKworCQlvdXRiKDB4MUEsIDB4M0M0KTsKKwkJb3V0YihzcjFhLCAweDNDNSk7CisJCW91dGIoMHgxQiwgMHgzQzQpOworCQlvdXRiKHNyMWIsIDB4M0M1KTsKKwkJb3V0YigweDY3LCAweDNENCk7CisJCW91dGIoY3I2NywgMHgzRDUpOworCQlvdXRiKDB4NkEsIDB4M0Q0KTsKKwkJb3V0YihjcjZhLCAweDNENSk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPSAocmVkICYgMHhGODAwKSB8CisJCSAgICAoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8ICgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOworCQlicmVhazsKKwljYXNlIDMyOgorCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJICAgICgodHJhbnNwICYgMHhGRjAwKSA8PCAxNikgfAorCQkgICAgKChyZWQgJiAweEZGMDApIDw8IDgpIHwKKwkJICAgICgoZ3JlZW4gJiAweEZGMDApKSB8ICgoYmx1ZSAmIDB4RkYwMCkgPj4gOCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qQ0FMTEVEIEJZOiBmYl9zZXRfY21hcCAqLworLyogICAgICAgICAgIGZiX3NldF92YXIsIHBhc3MgMjU2IGNvbG9ycyAqLworLypDQUxMRUQgQlk6IGZiX3NldF9jbWFwICovCisvKiAgICAgICAgICAgZmJjb25fc2V0X3BhbGV0dGUsIHBhc3MgMTYgY29sb3JzICovCitzdGF0aWMgaW50IHZpYWZiX3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXUzMiBsZW4gPSBjbWFwLT5sZW47CisJdTMyIGk7CisJdTE2ICpwcmVkID0gY21hcC0+cmVkOworCXUxNiAqcGdyZWVuID0gY21hcC0+Z3JlZW47CisJdTE2ICpwYmx1ZSA9IGNtYXAtPmJsdWU7CisJdTE2ICpwdHJhbnNwID0gY21hcC0+dHJhbnNwOworCXU4IHNyMWEsIHNyMWIsIGNyNjcsIGNyNmEsIHJldiA9IDAsIHNoaWZ0ID0gMTA7CisJaWYgKGxlbiA+IDI1NikKKwkJcmV0dXJuIDE7CisJaWYgKFVOSUNIUk9NRV9DTEUyNjYgPT0gdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKSB7CisJCS8qCisJCSAqIFJlYWQgUENJIGJ1cyAwLCBkZXYgMCwgZnVuY3Rpb24gMCwgaW5kZXggMHhGNiB0byBnZXQgY2hpcAorCQkgKiByZXYuCisJCSAqLworCQlvdXRsKDB4ODAwMDAwMDAgfCAoMHhmNiAmIH4zKSwgKHVuc2lnbmVkIGxvbmcpMHhDRjgpOworCQlyZXYgPSAoaW5sKCh1bnNpZ25lZCBsb25nKTB4Q0ZDKSA+PiAoKDB4ZjYgJiAzKSAqIDgpKSAmIDB4ZmY7CisJfQorCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlvdXRiKDB4MUEsIDB4M0M0KTsKKwkJc3IxYSA9IGluYigweDNDNSk7CisJCW91dGIoMHgxQiwgMHgzQzQpOworCQlzcjFiID0gaW5iKDB4M0M1KTsKKwkJb3V0YigweDY3LCAweDNENCk7CisJCWNyNjcgPSBpbmIoMHgzRDUpOworCQlvdXRiKDB4NkEsIDB4M0Q0KTsKKwkJY3I2YSA9IGluYigweDNENSk7CisJCS8qIE1hcCB0aGUgM0M2LzcvOC85IHRvIHRoZSBJR0EyICovCisJCW91dGIoMHgxQSwgMHgzQzQpOworCQlvdXRiKHNyMWEgfCAweDAxLCAweDNDNSk7CisJCW91dGIoMHgxQiwgMHgzQzQpOworCQkvKiBTZWNvbmQgRGlzcGxheSBFbmdpbmUgY29sY2sgYWx3YXlzIG9uICovCisJCW91dGIoc3IxYiB8IDB4ODAsIDB4M0M1KTsKKwkJb3V0YigweDY3LCAweDNENCk7CisJCS8qIFNlY29uZCBEaXNwbGF5IENvbG9yIERlcHRoIDggKi8KKwkJb3V0YihjcjY3ICYgMHgzRiwgMHgzRDUpOworCQlvdXRiKDB4NkEsIDB4M0Q0KTsKKwkJLyogU2Vjb25kIERpc3BsYXkgQ2hhbm5lbCBSZXNldCBDUjZBWzZdKSAqLworCQlvdXRiKGNyNmEgJiAweEJGLCAweDNENSk7CisJCS8qIFNlY29uZCBEaXNwbGF5IENoYW5uZWwgRW5hYmxlIENSNkFbN10gKi8KKwkJb3V0YihjcjZhIHwgMHg4MCwgMHgzRDUpOworCQkvKiBTZWNvbmQgRGlzcGxheSBDaGFubmVsIHN0b3AgcmVzZXQpICovCisJCW91dGIoY3I2YSB8IDB4QzAsIDB4M0Q1KTsKKworCQkvKiBCaXQgbWFzayBvZiBwYWxldHRlICovCisJCW91dGIoMHhGRiwgMHgzYzYpOworCQlvdXRiKDB4MDAsIDB4M0M4KTsKKwkJaWYgKFVOSUNIUk9NRV9DTEUyNjYgPT0gdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICYmCisJCQlyZXYgPj0gMTUpIHsKKwkJCXNoaWZ0ID0gODsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNkEsIFZJQUNSLCBCSVQ1LCBCSVQ1KTsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMTUsIFZJQVNSLCBCSVQ3LCBCSVQ3KTsKKwkJfSBlbHNlIHsKKwkJCXNoaWZ0ID0gMTA7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjZBLCBWSUFDUiwgMCwgQklUNSk7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjE1LCBWSUFTUiwgMCwgQklUNyk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlvdXRiKCgqKHByZWQgKyBpKSkgPj4gc2hpZnQsIDB4M0M5KTsKKwkJCW91dGIoKCoocGdyZWVuICsgaSkpID4+IHNoaWZ0LCAweDNDOSk7CisJCQlvdXRiKCgqKHBibHVlICsgaSkpID4+IHNoaWZ0LCAweDNDOSk7CisJCX0KKworCQlvdXRiKDB4MUEsIDB4M0M0KTsKKwkJLyogTWFwIHRoZSAzQzYvNy84LzkgdG8gdGhlIElHQTEgKi8KKwkJb3V0YihzcjFhICYgMHhGRSwgMHgzQzUpOworCQkvKiBCaXQgbWFzayBvZiBwYWxldHRlICovCisJCW91dGIoMHhGRiwgMHgzYzYpOworCQlvdXRiKDB4MDAsIDB4M0M4KTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlvdXRiKCgqKHByZWQgKyBpKSkgPj4gc2hpZnQsIDB4M0M5KTsKKwkJCW91dGIoKCoocGdyZWVuICsgaSkpID4+IHNoaWZ0LCAweDNDOSk7CisJCQlvdXRiKCgqKHBibHVlICsgaSkpID4+IHNoaWZ0LCAweDNDOSk7CisJCX0KKworCQlvdXRiKDB4MUEsIDB4M0M0KTsKKwkJb3V0YihzcjFhLCAweDNDNSk7CisJCW91dGIoMHgxQiwgMHgzQzQpOworCQlvdXRiKHNyMWIsIDB4M0M1KTsKKwkJb3V0YigweDY3LCAweDNENCk7CisJCW91dGIoY3I2NywgMHgzRDUpOworCQlvdXRiKDB4NkEsIDB4M0Q0KTsKKwkJb3V0YihjcjZhLCAweDNENSk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWlmIChsZW4gPiAxNykKKwkJCXJldHVybiAwOwkvKiBCZWNhdXNlIHN0YXRpYyB1MzIgcHNldWRvX3BhbFsxN107ICovCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtpXSA9CisJCQkgICAgKCoocHJlZCArIGkpICYgMHhGODAwKSB8CisJCQkgICAgKCgqKHBncmVlbiArIGkpICYgMHhGQzAwKSA+PiA1KSB8CisJCQkgICAgKCgqKHBibHVlICsgaSkgJiAweEY4MDApID4+IDExKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJaWYgKGxlbiA+IDE3KQorCQkJcmV0dXJuIDA7CisJCWlmIChwdHJhbnNwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW2ldID0KKwkJCQkgICAgKCgqKHB0cmFuc3AgKyBpKSAmIDB4RkYwMCkgPDwgMTYpIHwKKwkJCQkgICAgKCgqKHByZWQgKyBpKSAmIDB4RkYwMCkgPDwgOCkgfAorCQkJCSAgICAoKCoocGdyZWVuICsgaSkgJiAweEZGMDApKSB8CisJCQkJICAgICgoKihwYmx1ZSArIGkpICYgMHhGRjAwKSA+PiA4KTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbaV0gPQorCQkJCSAgICAweDAwMDAwMDAwIHwKKwkJCQkgICAgKCgqKHByZWQgKyBpKSAmIDB4RkYwMCkgPDwgOCkgfAorCQkJCSAgICAoKCoocGdyZWVuICsgaSkgJiAweEZGMDApKSB8CisJCQkJICAgICgoKihwYmx1ZSArIGkpICYgMHhGRjAwKSA+PiA4KTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX3Bhbl9kaXNwbGF5IVxuIik7CisKKwlvZmZzZXQgPSAodmFyLT54b2Zmc2V0ICsgKHZhci0+eW9mZnNldCAqIHZhci0+eHJlc192aXJ0dWFsKSkgKgorCSAgICB2YXItPmJpdHNfcGVyX3BpeGVsIC8gMTY7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJcbnZpYWZiX3Bhbl9kaXNwbGF5LG9mZnNldCA9JWQgIiwgb2Zmc2V0KTsKKworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKDB4NDgsIDB4M2Q0LCAoKG9mZnNldCA+PiAyNCkgJiAweDMpLCAweDMpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKDB4MzQsIDB4M2Q0LCAoKG9mZnNldCA+PiAxNikgJiAweGZmKSwgMHhmZik7CisJdmlhZmJfd3JpdGVfcmVnX21hc2soMHgwYywgMHgzZDQsICgob2Zmc2V0ID4+IDgpICYgMHhmZiksIDB4ZmYpOworCXZpYWZiX3dyaXRlX3JlZ19tYXNrKDB4MGQsIDB4M2Q0LCAob2Zmc2V0ICYgMHhmZiksIDB4ZmYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2JsYW5rIVxuIik7CisJLyogY2xlYXIgRFBNUyBzZXR0aW5nICovCisKKwlzd2l0Y2ggKGJsYW5rX21vZGUpIHsKKwljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCS8qIFNjcmVlbjogT24sIEhTeW5jOiBPbiwgVlN5bmM6IE9uICovCisJCS8qIGNvbnRyb2wgQ1JUIG1vbml0b3IgcG93ZXIgbWFuYWdlbWVudCAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjM2LCBWSUFDUiwgMHgwMCwgQklUNCArIEJJVDUpOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CisJCS8qIFNjcmVlbjogT2ZmLCBIU3luYzogT2ZmLCBWU3luYzogT24gKi8KKwkJLyogY29udHJvbCBDUlQgbW9uaXRvciBwb3dlciBtYW5hZ2VtZW50ICovCisJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMzYsIFZJQUNSLCAweDEwLCBCSVQ0ICsgQklUNSk7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKwkJLyogU2NyZWVuOiBPZmYsIEhTeW5jOiBPbiwgVlN5bmM6IE9mZiAqLworCQkvKiBjb250cm9sIENSVCBtb25pdG9yIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwkJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1IzNiwgVklBQ1IsIDB4MjAsIEJJVDQgKyBCSVQ1KTsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisJCS8qIFNjcmVlbjogT2ZmLCBIU3luYzogT2ZmLCBWU3luYzogT2ZmICovCisJCS8qIGNvbnRyb2wgQ1JUIG1vbml0b3IgcG93ZXIgbWFuYWdlbWVudCAqLworCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjM2LCBWSUFDUiwgMHgzMCwgQklUNCArIEJJVDUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCXN0cnVjdCB2aWFmYl9pb2N0bF9tb2RlIHZpYW1vZGU7CisJc3RydWN0IHZpYWZiX2lvY3RsX3NhbW0gdmlhc2FtbTsKKwlzdHJ1Y3QgdmlhZmJfZHJpdmVyX3ZlcnNpb24gZHJpdmVyX3ZlcnNpb247CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHNlY192YXI7CisJc3RydWN0IF9wYW5lbF9zaXplX3Bvc19pbmZvIHBhbmVsX3Bvc19zaXplX3BhcmE7CisJdTMyIHN0YXRlX2luZm8gPSAwOworCXUzMiB2aWFpbmZvX3NpemUgPSBzaXplb2Yoc3RydWN0IHZpYWZiX2lvY3RsX2luZm8pOworCXUzMiAqdmlhZmJfZ2FtbWFfdGFibGU7CisJY2hhciBkcml2ZXJfbmFtZVtdID0gInZpYWZiIjsKKworCXUzMiBfX3VzZXIgKmFyZ3AgPSAodTMyIF9fdXNlciAqKSBhcmc7CisJdTMyIGdwdTMyOworCXUzMiB2aWRlb19kZXZfaW5mbyA9IDA7CisJc3RydWN0IHZpYWZiX2lvY3RsX3NldHRpbmcgdmlhZmJfc2V0dGluZyA9IHt9OworCXN0cnVjdCBkZXZpY2VfdCBhY3RpdmVfZGV2ID0ge307CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9pb2N0bDogMHglWCAhIVxuIiwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSUFGQl9HRVRfQ0hJUF9JTkZPOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIHZpYXBhcmluZm8tPmNoaXBfaW5mbywKKwkJCQlzaXplb2Yoc3RydWN0IGNoaXBfaW5mb3JtYXRpb24pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFZJQUZCX0dFVF9JTkZPX1NJWkU6CisJCXJldHVybiBwdXRfdXNlcih2aWFpbmZvX3NpemUsIGFyZ3ApOworCWNhc2UgVklBRkJfR0VUX0lORk86CisJCXJldHVybiB2aWFmYl9pb2N0bF9nZXRfdmlhZmJfaW5mbyhhcmcpOworCWNhc2UgVklBRkJfSE9UUExVRzoKKwkJcmV0dXJuIHB1dF91c2VyKHZpYWZiX2lvY3RsX2hvdHBsdWcoaW5mby0+dmFyLnhyZXMsCisJCQkJCSAgICAgIGluZm8tPnZhci55cmVzLAorCQkJCQkgICAgICBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpLCBhcmdwKTsKKwljYXNlIFZJQUZCX1NFVF9IT1RQTFVHX0ZMQUc6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3B1MzIsIGFyZ3AsIHNpemVvZihncHUzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZpYWZiX2hvdHBsdWcgPSAoZ3B1MzIpID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgVklBRkJfR0VUX1JFU09MVVRJT046CisJCXZpYW1vZGUueHJlcyA9ICh1MzIpIHZpYWZiX2hvdHBsdWdfWHJlczsKKwkJdmlhbW9kZS55cmVzID0gKHUzMikgdmlhZmJfaG90cGx1Z19ZcmVzOworCQl2aWFtb2RlLnJlZnJlc2ggPSAodTMyKSB2aWFmYl9ob3RwbHVnX3JlZnJlc2g7CisJCXZpYW1vZGUuYnBwID0gKHUzMikgdmlhZmJfaG90cGx1Z19icHA7CisJCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKKwkJCXZpYW1vZGUueHJlc19zZWMgPSB2aWFmYl9zZWNvbmRfeHJlczsKKwkJCXZpYW1vZGUueXJlc19zZWMgPSB2aWFmYl9zZWNvbmRfeXJlczsKKwkJCXZpYW1vZGUudmlydHVhbF94cmVzX3NlYyA9IHZpYWZiX3NlY29uZF92aXJ0dWFsX3hyZXM7CisJCQl2aWFtb2RlLnZpcnR1YWxfeXJlc19zZWMgPSB2aWFmYl9zZWNvbmRfdmlydHVhbF95cmVzOworCQkJdmlhbW9kZS5yZWZyZXNoX3NlYyA9IHZpYWZiX3JlZnJlc2gxOworCQkJdmlhbW9kZS5icHBfc2VjID0gdmlhZmJfYnBwMTsKKwkJfSBlbHNlIHsKKwkJCXZpYW1vZGUueHJlc19zZWMgPSAwOworCQkJdmlhbW9kZS55cmVzX3NlYyA9IDA7CisJCQl2aWFtb2RlLnZpcnR1YWxfeHJlc19zZWMgPSAwOworCQkJdmlhbW9kZS52aXJ0dWFsX3lyZXNfc2VjID0gMDsKKwkJCXZpYW1vZGUucmVmcmVzaF9zZWMgPSAwOworCQkJdmlhbW9kZS5icHBfc2VjID0gMDsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2aWFtb2RlLCBzaXplb2YodmlhbW9kZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgVklBRkJfR0VUX1NBTU1fSU5GTzoKKwkJdmlhc2FtbS5zYW1tX3N0YXR1cyA9IHZpYWZiX1NBTU1fT047CisKKwkJaWYgKHZpYWZiX1NBTU1fT04gPT0gMSkgeworCQkJaWYgKHZpYWZiX2R1YWxfZmIpIHsKKwkJCQl2aWFzYW1tLnNpemVfcHJpbSA9IHZpYXBhcmluZm8tPmZibWVtX2ZyZWU7CisJCQkJdmlhc2FtbS5zaXplX3NlYyA9IHZpYXBhcmluZm8xLT5mYm1lbV9mcmVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodmlhZmJfc2Vjb25kX3NpemUpIHsKKwkJCQkJdmlhc2FtbS5zaXplX3ByaW0gPQorCQkJCQkgICAgdmlhcGFyaW5mby0+ZmJtZW1fZnJlZSAtCisJCQkJCSAgICB2aWFmYl9zZWNvbmRfc2l6ZSAqIDEwMjQgKiAxMDI0OworCQkJCQl2aWFzYW1tLnNpemVfc2VjID0KKwkJCQkJICAgIHZpYWZiX3NlY29uZF9zaXplICogMTAyNCAqIDEwMjQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmlhc2FtbS5zaXplX3ByaW0gPQorCQkJCQkgICAgdmlhcGFyaW5mby0+ZmJtZW1fZnJlZSA+PiAxOworCQkJCQl2aWFzYW1tLnNpemVfc2VjID0KKwkJCQkJICAgICh2aWFwYXJpbmZvLT5mYm1lbV9mcmVlID4+IDEpOworCQkJCX0KKwkJCX0KKwkJCXZpYXNhbW0ubWVtX2Jhc2UgPSB2aWFwYXJpbmZvLT5mYm1lbTsKKwkJCXZpYXNhbW0ub2Zmc2V0X3NlYyA9IHZpYWZiX3NlY29uZF9vZmZzZXQ7CisJCX0gZWxzZSB7CisJCQl2aWFzYW1tLnNpemVfcHJpbSA9CisJCQkgICAgdmlhcGFyaW5mby0+bWVtc2l6ZSAtIHZpYXBhcmluZm8tPmZibWVtX3VzZWQ7CisJCQl2aWFzYW1tLnNpemVfc2VjID0gMDsKKwkJCXZpYXNhbW0ubWVtX2Jhc2UgPSB2aWFwYXJpbmZvLT5mYm1lbTsKKwkJCXZpYXNhbW0ub2Zmc2V0X3NlYyA9IDA7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2aWFzYW1tLCBzaXplb2Yodmlhc2FtbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJY2FzZSBWSUFGQl9UVVJOX09OX09VVFBVVF9ERVZJQ0U6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3B1MzIsIGFyZ3AsIHNpemVvZihncHUzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChncHUzMiAmIENSVF9EZXZpY2UpCisJCQl2aWFmYl9jcnRfZW5hYmxlKCk7CisJCWlmIChncHUzMiAmIERWSV9EZXZpY2UpCisJCQl2aWFmYl9kdmlfZW5hYmxlKCk7CisJCWlmIChncHUzMiAmIExDRF9EZXZpY2UpCisJCQl2aWFmYl9sY2RfZW5hYmxlKCk7CisJCWJyZWFrOworCWNhc2UgVklBRkJfVFVSTl9PRkZfT1VUUFVUX0RFVklDRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZncHUzMiwgYXJncCwgc2l6ZW9mKGdwdTMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGdwdTMyICYgQ1JUX0RldmljZSkKKwkJCXZpYWZiX2NydF9kaXNhYmxlKCk7CisJCWlmIChncHUzMiAmIERWSV9EZXZpY2UpCisJCQl2aWFmYl9kdmlfZGlzYWJsZSgpOworCQlpZiAoZ3B1MzIgJiBMQ0RfRGV2aWNlKQorCQkJdmlhZmJfbGNkX2Rpc2FibGUoKTsKKwkJYnJlYWs7CisJY2FzZSBWSUFGQl9TRVRfREVWSUNFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmFjdGl2ZV9kZXYsICh2b2lkICopYXJncCwKKwkJCXNpemVvZihhY3RpdmVfZGV2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmlhZmJfc2V0X2RldmljZShhY3RpdmVfZGV2KTsKKwkJdmlhZmJfc2V0X3BhcihpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBWSUFGQl9HRVRfREVWSUNFOgorCQlhY3RpdmVfZGV2LmNydCA9IHZpYWZiX0NSVF9PTjsKKwkJYWN0aXZlX2Rldi5kdmkgPSB2aWFmYl9EVklfT047CisJCWFjdGl2ZV9kZXYubGNkID0gdmlhZmJfTENEX09OOworCQlhY3RpdmVfZGV2LnNhbW0gPSB2aWFmYl9TQU1NX09OOworCQlhY3RpdmVfZGV2LnByaW1hcnlfZGV2ID0gdmlhZmJfcHJpbWFyeV9kZXY7CisKKwkJYWN0aXZlX2Rldi5sY2RfZHNwX2NlbnQgPSB2aWFmYl9sY2RfZHNwX21ldGhvZDsKKwkJYWN0aXZlX2Rldi5sY2RfcGFuZWxfaWQgPSB2aWFmYl9sY2RfcGFuZWxfaWQ7CisJCWFjdGl2ZV9kZXYubGNkX21vZGUgPSB2aWFmYl9sY2RfbW9kZTsKKworCQlhY3RpdmVfZGV2LnhyZXMgPSB2aWFmYl9ob3RwbHVnX1hyZXM7CisJCWFjdGl2ZV9kZXYueXJlcyA9IHZpYWZiX2hvdHBsdWdfWXJlczsKKworCQlhY3RpdmVfZGV2LnhyZXMxID0gdmlhZmJfc2Vjb25kX3hyZXM7CisJCWFjdGl2ZV9kZXYueXJlczEgPSB2aWFmYl9zZWNvbmRfeXJlczsKKworCQlhY3RpdmVfZGV2LmJwcCA9IHZpYWZiX2JwcDsKKwkJYWN0aXZlX2Rldi5icHAxID0gdmlhZmJfYnBwMTsKKwkJYWN0aXZlX2Rldi5yZWZyZXNoID0gdmlhZmJfcmVmcmVzaDsKKwkJYWN0aXZlX2Rldi5yZWZyZXNoMSA9IHZpYWZiX3JlZnJlc2gxOworCisJCWFjdGl2ZV9kZXYuZXBpYV9kdmkgPSB2aWFmYl9wbGF0Zm9ybV9lcGlhX2R2aTsKKwkJYWN0aXZlX2Rldi5sY2RfZHVhbF9lZGdlID0gdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZTsKKwkJYWN0aXZlX2Rldi5idXNfd2lkdGggPSB2aWFmYl9idXNfd2lkdGg7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmYWN0aXZlX2Rldiwgc2l6ZW9mKGFjdGl2ZV9kZXYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgVklBRkJfR0VUX0RSSVZFUl9WRVJTSU9OOgorCQlkcml2ZXJfdmVyc2lvbi5pTWFqb3JOdW0gPSBWRVJTSU9OX01BSk9SOworCQlkcml2ZXJfdmVyc2lvbi5pS2VybmVsTnVtID0gVkVSU0lPTl9LRVJORUw7CisJCWRyaXZlcl92ZXJzaW9uLmlPU051bSA9IFZFUlNJT05fT1M7CisJCWRyaXZlcl92ZXJzaW9uLmlNaW5vck51bSA9IFZFUlNJT05fTUlOT1I7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZHJpdmVyX3ZlcnNpb24sCisJCQlzaXplb2YoZHJpdmVyX3ZlcnNpb24pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9TRVRfREVWSUNFX0lORk86CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmlhZmJfc2V0dGluZywKKwkJCWFyZ3AsIHNpemVvZih2aWFmYl9zZXR0aW5nKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGFwcGx5X2RldmljZV9zZXR0aW5nKHZpYWZiX3NldHRpbmcsIGluZm8pIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9TRVRfU0VDT05EX01PREU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VjX3ZhciwgYXJncCwgc2l6ZW9mKHNlY192YXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhcHBseV9zZWNvbmRfbW9kZV9zZXR0aW5nKCZzZWNfdmFyKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJQUZCX0dFVF9ERVZJQ0VfSU5GTzoKKworCQlyZXRyaWV2ZV9kZXZpY2Vfc2V0dGluZygmdmlhZmJfc2V0dGluZyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmlhZmJfc2V0dGluZywgc2l6ZW9mKHZpYWZiX3NldHRpbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9HRVRfREVWSUNFX1NVUFBPUlQ6CisJCXZpYWZiX2dldF9kZXZpY2Vfc3VwcG9ydF9zdGF0ZSgmc3RhdGVfaW5mbyk7CisJCWlmIChwdXRfdXNlcihzdGF0ZV9pbmZvLCBhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgVklBRkJfR0VUX0RFVklDRV9DT05ORUNUOgorCQl2aWFmYl9nZXRfZGV2aWNlX2Nvbm5lY3Rfc3RhdGUoJnN0YXRlX2luZm8pOworCQlpZiAocHV0X3VzZXIoc3RhdGVfaW5mbywgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFZJQUZCX0dFVF9QQU5FTF9TVVBQT1JUX0VYUEFORDoKKwkJc3RhdGVfaW5mbyA9CisJCSAgICB2aWFmYl9sY2RfZ2V0X3N1cHBvcnRfZXhwYW5kX3N0YXRlKGluZm8tPnZhci54cmVzLAorCQkJCQkJIGluZm8tPnZhci55cmVzKTsKKwkJaWYgKHB1dF91c2VyKHN0YXRlX2luZm8sIGFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9HRVRfRFJJVkVSX05BTUU6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgZHJpdmVyX25hbWUsIHNpemVvZihkcml2ZXJfbmFtZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9TRVRfR0FNTUFfTFVUOgorCQl2aWFmYl9nYW1tYV90YWJsZSA9IGttYWxsb2MoMjU2ICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIXZpYWZiX2dhbW1hX3RhYmxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChjb3B5X2Zyb21fdXNlcih2aWFmYl9nYW1tYV90YWJsZSwgYXJncCwKKwkJCQlzaXplb2YodmlhZmJfZ2FtbWFfdGFibGUpKSkgeworCQkJa2ZyZWUodmlhZmJfZ2FtbWFfdGFibGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJdmlhZmJfc2V0X2dhbW1hX3RhYmxlKHZpYWZiX2JwcCwgdmlhZmJfZ2FtbWFfdGFibGUpOworCQlrZnJlZSh2aWFmYl9nYW1tYV90YWJsZSk7CisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9HRVRfR0FNTUFfTFVUOgorCQl2aWFmYl9nYW1tYV90YWJsZSA9IGttYWxsb2MoMjU2ICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIXZpYWZiX2dhbW1hX3RhYmxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXZpYWZiX2dldF9nYW1tYV90YWJsZSh2aWFmYl9nYW1tYV90YWJsZSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgdmlhZmJfZ2FtbWFfdGFibGUsCisJCQlzaXplb2YodmlhZmJfZ2FtbWFfdGFibGUpKSkgeworCQkJa2ZyZWUodmlhZmJfZ2FtbWFfdGFibGUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJa2ZyZWUodmlhZmJfZ2FtbWFfdGFibGUpOworCQlicmVhazsKKworCWNhc2UgVklBRkJfR0VUX0dBTU1BX1NVUFBPUlRfU1RBVEU6CisJCXZpYWZiX2dldF9nYW1tYV9zdXBwb3J0X3N0YXRlKHZpYWZiX2JwcCwgJnN0YXRlX2luZm8pOworCQlpZiAocHV0X3VzZXIoc3RhdGVfaW5mbywgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBWSUFGQl9TRVRfVklERU9fREVWSUNFOgorCQlnZXRfdXNlcih2aWRlb19kZXZfaW5mbywgYXJncCk7CisJCXZpYWZiX3NldF92aWRlb19kZXZpY2UodmlkZW9fZGV2X2luZm8pOworCQlicmVhazsKKwljYXNlIFZJQUZCX0dFVF9WSURFT19ERVZJQ0U6CisJCXZpYWZiX2dldF92aWRlb19kZXZpY2UoJnZpZGVvX2Rldl9pbmZvKTsKKwkJaWYgKHB1dF91c2VyKHZpZGVvX2Rldl9pbmZvLCBhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFZJQUZCX1NZTkNfU1VSRkFDRToKKwkJREVCVUdfTVNHKEtFUk5fSU5GTyAibG9ibyBWSUFGQl9TWU5DX1NVUkZBQ0VcbiIpOworCQlicmVhazsKKwljYXNlIFZJQUZCX0dFVF9EUklWRVJfQ0FQUzoKKwkJYnJlYWs7CisKKwljYXNlIFZJQUZCX0dFVF9QQU5FTF9NQVhfU0laRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJnBhbmVsX3Bvc19zaXplX3BhcmEsIGFyZ3AsIHNpemVvZihwYW5lbF9wb3Nfc2l6ZV9wYXJhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcGFuZWxfcG9zX3NpemVfcGFyYS54ID0gcGFuZWxfcG9zX3NpemVfcGFyYS55ID0gMDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcGFuZWxfcG9zX3NpemVfcGFyYSwKKwkJICAgICBzaXplb2YocGFuZWxfcG9zX3NpemVfcGFyYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgVklBRkJfR0VUX1BBTkVMX01BWF9QT1NJVElPTjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJnBhbmVsX3Bvc19zaXplX3BhcmEsIGFyZ3AsIHNpemVvZihwYW5lbF9wb3Nfc2l6ZV9wYXJhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcGFuZWxfcG9zX3NpemVfcGFyYS54ID0gcGFuZWxfcG9zX3NpemVfcGFyYS55ID0gMDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcGFuZWxfcG9zX3NpemVfcGFyYSwKKwkJICAgICBzaXplb2YocGFuZWxfcG9zX3NpemVfcGFyYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBWSUFGQl9HRVRfUEFORUxfUE9TSVRJT046CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZwYW5lbF9wb3Nfc2l6ZV9wYXJhLCBhcmdwLCBzaXplb2YocGFuZWxfcG9zX3NpemVfcGFyYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBhbmVsX3Bvc19zaXplX3BhcmEueCA9IHBhbmVsX3Bvc19zaXplX3BhcmEueSA9IDA7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnBhbmVsX3Bvc19zaXplX3BhcmEsCisJCSAgICAgc2l6ZW9mKHBhbmVsX3Bvc19zaXplX3BhcmEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFZJQUZCX0dFVF9QQU5FTF9TSVpFOgorCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmcGFuZWxfcG9zX3NpemVfcGFyYSwgYXJncCwgc2l6ZW9mKHBhbmVsX3Bvc19zaXplX3BhcmEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwYW5lbF9wb3Nfc2l6ZV9wYXJhLnggPSBwYW5lbF9wb3Nfc2l6ZV9wYXJhLnkgPSAwOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZwYW5lbF9wb3Nfc2l6ZV9wYXJhLAorCQkgICAgIHNpemVvZihwYW5lbF9wb3Nfc2l6ZV9wYXJhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFZJQUZCX1NFVF9QQU5FTF9QT1NJVElPTjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJnBhbmVsX3Bvc19zaXplX3BhcmEsIGFyZ3AsIHNpemVvZihwYW5lbF9wb3Nfc2l6ZV9wYXJhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBWSUFGQl9TRVRfUEFORUxfU0laRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJnBhbmVsX3Bvc19zaXplX3BhcmEsIGFyZ3AsIHNpemVvZihwYW5lbF9wb3Nfc2l6ZV9wYXJhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlhZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sCisJY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXUzMiBjb2wgPSAwLCByb3AgPSAwOworCWludCBwaXRjaDsKKworCWlmICghdmlhZmJfYWNjZWwpCisJCXJldHVybiBjZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisKKwlpZiAoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQpCisJCXJldHVybjsKKworCXN3aXRjaCAocmVjdC0+cm9wKSB7CisJY2FzZSBST1BfWE9SOgorCQlyb3AgPSAweDVBOworCQlicmVhazsKKwljYXNlIFJPUF9DT1BZOgorCWRlZmF1bHQ6CisJCXJvcCA9IDB4RjA7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQljb2wgPSByZWN0LT5jb2xvcjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJY29sID0gKCh1MzIgKikgKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVjdC0+Y29sb3JdOworCQlicmVhazsKKwljYXNlIDMyOgorCQljb2wgPSAoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWN0LT5jb2xvcl07CisJCWJyZWFrOworCX0KKworCS8qIEJpdEJsdCBTb3VyY2UgQWRkcmVzcyAqLworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1NSQ1BPUyk7CisJLyogU291cmNlIEJhc2UgQWRkcmVzcyAqLworCXdyaXRlbCgweDAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1NSQ0JBU0UpOworCS8qIERlc3RpbmF0aW9uIEJhc2UgQWRkcmVzcyAqLworCXdyaXRlbCgoKHVuc2lnbmVkIGxvbmcpIChpbmZvLT5zY3JlZW5fYmFzZSkgLQorCQkgICAodW5zaWduZWQgbG9uZykgdmlhZmJfRkJfTU0pID4+IDMsCisJCSAgIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RTVEJBU0UpOworCS8qIFBpdGNoICovCisJcGl0Y2ggPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIDcpICYgfjc7CisJd3JpdGVsKFZJQV9QSVRDSF9FTkFCTEUgfAorCQkgICAoKChwaXRjaCAqCisJCSAgICAgIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA+PiAzKSA+PiAzKSB8CisJCSAgICAgICgoKHBpdGNoICogaW5mby0+CisJCSAgICAgIHZhci5iaXRzX3Blcl9waXhlbCA+PiAzKSA+PiAzKSA8PCAxNikpLAorCQkgICAgICB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19QSVRDSCk7CisJLyogQml0Qmx0IERlc3RpbmF0aW9uIEFkZHJlc3MgKi8KKwl3cml0ZWwoKChyZWN0LT5keSA8PCAxNikgfCByZWN0LT5keCksCisJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RTVFBPUyk7CisJLyogRGltZW5zaW9uOiB3aWR0aCAmIGhlaWdodCAqLworCXdyaXRlbCgoKChyZWN0LT5oZWlnaHQgLSAxKSA8PCAxNikgfCAocmVjdC0+d2lkdGggLSAxKSksCisJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RJTUVOU0lPTik7CisJLyogRm9yZ3JvdW5kIGNvbG9yIG9yIERlc3RpbmF0aW9uIGNvbG9yICovCisJd3JpdGVsKGNvbCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfRkdDT0xPUik7CisJLyogR0UgQ29tbWFuZCAqLworCXdyaXRlbCgoMHgwMSB8IDB4MjAwMCB8IChyb3AgPDwgMjQpKSwKKwkJdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfR0VDTUQpOworCit9CisKK3N0YXRpYyB2b2lkIHZpYWZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCWNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKK3sKKwl1MzIgZHkgPSBhcmVhLT5keSwgc3kgPSBhcmVhLT5zeSwgZGlyZWN0aW9uID0gMHgwOworCXUzMiBzeCA9IGFyZWEtPnN4LCBkeCA9IGFyZWEtPmR4LCB3aWR0aCA9IGFyZWEtPndpZHRoOworCWludCBwaXRjaDsKKworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2NvcHlhcmVhISFcbiIpOworCisJaWYgKCF2aWFmYl9hY2NlbCkKKwkJcmV0dXJuIGNmYl9jb3B5YXJlYShpbmZvLCBhcmVhKTsKKworCWlmICghYXJlYS0+d2lkdGggfHwgIWFyZWEtPmhlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKHN5IDwgZHkpIHsKKwkJZHkgKz0gYXJlYS0+aGVpZ2h0IC0gMTsKKwkJc3kgKz0gYXJlYS0+aGVpZ2h0IC0gMTsKKwkJZGlyZWN0aW9uIHw9IDB4NDAwMDsKKwl9CisKKwlpZiAoc3ggPCBkeCkgeworCQlkeCArPSB3aWR0aCAtIDE7CisJCXN4ICs9IHdpZHRoIC0gMTsKKwkJZGlyZWN0aW9uIHw9IDB4ODAwMDsKKwl9CisKKwkvKiBTb3VyY2UgQmFzZSBBZGRyZXNzICovCisJd3JpdGVsKCgodW5zaWduZWQgbG9uZykgKGluZm8tPnNjcmVlbl9iYXNlKSAtCisJCSAgICh1bnNpZ25lZCBsb25nKSB2aWFmYl9GQl9NTSkgPj4gMywKKwkJICAgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfU1JDQkFTRSk7CisJLyogRGVzdGluYXRpb24gQmFzZSBBZGRyZXNzICovCisJd3JpdGVsKCgodW5zaWduZWQgbG9uZykgKGluZm8tPnNjcmVlbl9iYXNlKSAtCisJCSAgICh1bnNpZ25lZCBsb25nKSB2aWFmYl9GQl9NTSkgPj4gMywKKwkJICAgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfRFNUQkFTRSk7CisJLyogUGl0Y2ggKi8KKwlwaXRjaCA9IChpbmZvLT52YXIueHJlc192aXJ0dWFsICsgNykgJiB+NzsKKwkvKiBWSUFfUElUQ0hfRU5BQkxFIGNhbiBiZSBvbWl0dGVkIG5vdy4gKi8KKwl3cml0ZWwoVklBX1BJVENIX0VOQUJMRSB8CisJCSAgICgoKHBpdGNoICoKKwkJICAgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDMpID4+IDMpIHwgKCgocGl0Y2ggKgorCQkJCQkJCQlpbmZvLT52YXIuCisJCQkJCQkJCWJpdHNfcGVyX3BpeGVsCisJCQkJCQkJCT4+IDMpID4+IDMpCisJCQkJCQkJICAgICAgPDwgMTYpKSwKKwkJCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19QSVRDSCk7CisJLyogQml0Qmx0IFNvdXJjZSBBZGRyZXNzICovCisJd3JpdGVsKCgoc3kgPDwgMTYpIHwgc3gpLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TUkNQT1MpOworCS8qIEJpdEJsdCBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisJd3JpdGVsKCgoZHkgPDwgMTYpIHwgZHgpLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19EU1RQT1MpOworCS8qIERpbWVuc2lvbjogd2lkdGggJiBoZWlnaHQgKi8KKwl3cml0ZWwoKCgoYXJlYS0+aGVpZ2h0IC0gMSkgPDwgMTYpIHwgKGFyZWEtPndpZHRoIC0gMSkpLAorCQkgICB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19ESU1FTlNJT04pOworCS8qIEdFIENvbW1hbmQgKi8KKwl3cml0ZWwoKDB4MDEgfCBkaXJlY3Rpb24gfCAoMHhDQyA8PCAyNCkpLAorCQl2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19HRUNNRCk7CisKK30KKworc3RhdGljIHZvaWQgdmlhZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLAorCWNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCit7CisJdTMyIHNpemUsIGJnX2NvbCA9IDAsIGZnX2NvbCA9IDAsICp1ZGF0YTsKKwlpbnQgaTsKKwlpbnQgcGl0Y2g7CisKKwlpZiAoIXZpYWZiX2FjY2VsKQorCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisKKwl1ZGF0YSA9ICh1MzIgKikgaW1hZ2UtPmRhdGE7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJYmdfY29sID0gaW1hZ2UtPmJnX2NvbG9yOworCQlmZ19jb2wgPSBpbWFnZS0+ZmdfY29sb3I7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWJnX2NvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl07CisJCWZnX2NvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWJnX2NvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5iZ19jb2xvcl07CisJCWZnX2NvbCA9ICgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJyZWFrOworCX0KKwlzaXplID0gaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodDsKKworCS8qIFNvdXJjZSBCYXNlIEFkZHJlc3MgKi8KKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TUkNCQVNFKTsKKwkvKiBEZXN0aW5hdGlvbiBCYXNlIEFkZHJlc3MgKi8KKwl3cml0ZWwoKCh1bnNpZ25lZCBsb25nKSAoaW5mby0+c2NyZWVuX2Jhc2UpIC0KKwkJICAgKHVuc2lnbmVkIGxvbmcpIHZpYWZiX0ZCX01NKSA+PiAzLAorCQkgICB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19EU1RCQVNFKTsKKwkvKiBQaXRjaCAqLworCXBpdGNoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OworCXdyaXRlbChWSUFfUElUQ0hfRU5BQkxFIHwKKwkJICAgKCgocGl0Y2ggKgorCQkgICAgICBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPj4gMykgPj4gMykgfCAoKChwaXRjaCAqCisJCQkJCQkJCWluZm8tPnZhci4KKwkJCQkJCQkJYml0c19wZXJfcGl4ZWwKKwkJCQkJCQkJPj4gMykgPj4gMykKKwkJCQkJCQkgICAgICA8PCAxNikpLAorCQkJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX1BJVENIKTsKKwkvKiBCaXRCbHQgU291cmNlIEFkZHJlc3MgKi8KKwl3cml0ZWwoMHgwLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19TUkNQT1MpOworCS8qIEJpdEJsdCBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisJd3JpdGVsKCgoaW1hZ2UtPmR5IDw8IDE2KSB8IGltYWdlLT5keCksCisJCXZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0RTVFBPUyk7CisJLyogRGltZW5zaW9uOiB3aWR0aCAmIGhlaWdodCAqLworCXdyaXRlbCgoKChpbWFnZS0+aGVpZ2h0IC0gMSkgPDwgMTYpIHwgKGltYWdlLT53aWR0aCAtIDEpKSwKKwkJICAgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfRElNRU5TSU9OKTsKKwkvKiBmYiBjb2xvciAqLworCXdyaXRlbChmZ19jb2wsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0ZHQ09MT1IpOworCS8qIGJnIGNvbG9yICovCisJd3JpdGVsKGJnX2NvbCwgdmlhcGFyaW5mby0+aW9fdmlydCArIFZJQV9SRUdfQkdDT0xPUik7CisJLyogR0UgQ29tbWFuZCAqLworCXdyaXRlbCgweENDMDIwMTQyLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19HRUNNRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIDQ7IGkrKykgeworCQl3cml0ZWwoKnVkYXRhLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX01NSU9fQkxUQkFTRSk7CisJCXVkYXRhKys7CisJfQorCit9CisKK3N0YXRpYyBpbnQgdmlhZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCit7CisJdTggZGF0YVtDVVJTT1JfU0laRSAvIDhdOworCXUzMiBkYXRhX2Jha1tDVVJTT1JfU0laRSAvIDMyXTsKKwl1MzIgdGVtcCwgeHgsIHl5LCBiZ19jb2wgPSAwLCBmZ19jb2wgPSAwOworCWludCBzaXplLCBpLCBqID0gMDsKKwlzdGF0aWMgaW50IGh3X2N1cnNvcjsKKwlzdHJ1Y3QgdmlhZmJfcGFyICpwX3ZpYWZiX3BhcjsKKworCWlmICh2aWFmYl9hY2NlbCkKKwkJaHdfY3Vyc29yID0gMTsKKworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJaWYgKGh3X2N1cnNvcikgeworCQkJdmlhZmJfc2hvd19od19jdXJzb3IoaW5mbywgSFdfQ3Vyc29yX09GRik7CisJCQlod19jdXJzb3IgPSAwOworCQl9CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgoKChzdHJ1Y3QgdmlhZmJfcGFyICopKGluZm8tPnBhcikpLT5pZ2FfcGF0aCA9PSBJR0EyKQorCSAgICAmJiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFdoZW4gZHVvdmlldyBhbmQgdXNpbmcgbGNkICwgdXNlIHNvZnQgY3Vyc29yICovCisJaWYgKHZpYWZiX0xDRF9PTiB8fCAoKHN0cnVjdCB2aWFmYl9wYXIgKikoaW5mby0+cGFyKSktPmR1b3ZpZXcpCisJCXJldHVybiAtRU5PREVWOworCisJdmlhZmJfc2hvd19od19jdXJzb3IoaW5mbywgSFdfQ3Vyc29yX09GRik7CisJdmlhY3Vyc29yID0gKmN1cnNvcjsKKworCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRIT1QpIHsKKwkJdmlhY3Vyc29yLmhvdCA9IGN1cnNvci0+aG90OworCQl0ZW1wID0gKCh2aWFjdXJzb3IuaG90LngpIDw8IDE2KSArIHZpYWN1cnNvci5ob3QueTsKKwkJd3JpdGVsKHRlbXAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NVUlNPUl9PUkcpOworCX0KKworCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRQT1MpIHsKKwkJdmlhY3Vyc29yLmltYWdlLmR4ID0gY3Vyc29yLT5pbWFnZS5keDsKKwkJdmlhY3Vyc29yLmltYWdlLmR5ID0gY3Vyc29yLT5pbWFnZS5keTsKKwkJeXkgPSBjdXJzb3ItPmltYWdlLmR5IC0gaW5mby0+dmFyLnlvZmZzZXQ7CisJCXh4ID0gY3Vyc29yLT5pbWFnZS5keCAtIGluZm8tPnZhci54b2Zmc2V0OworCQl0ZW1wID0geXkgJiAweEZGRkY7CisJCXRlbXAgfD0gKHh4IDw8IDE2KTsKKwkJd3JpdGVsKHRlbXAsIHZpYXBhcmluZm8tPmlvX3ZpcnQgKyBWSUFfUkVHX0NVUlNPUl9QT1MpOworCX0KKworCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRTSVpFKSB7CisJCXRlbXAgPSByZWFkbCh2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfTU9ERSk7CisKKwkJaWYgKChjdXJzb3ItPmltYWdlLndpZHRoIDw9IDMyKQorCQkgICAgJiYgKGN1cnNvci0+aW1hZ2UuaGVpZ2h0IDw9IDMyKSkgeworCQkJTUFYX0NVUlMgPSAzMjsKKwkJCXRlbXAgfD0gMHgyOworCQl9IGVsc2UgaWYgKChjdXJzb3ItPmltYWdlLndpZHRoIDw9IDY0KQorCQkJICAgJiYgKGN1cnNvci0+aW1hZ2UuaGVpZ2h0IDw9IDY0KSkgeworCQkJTUFYX0NVUlMgPSA2NDsKKwkJCXRlbXAgJj0gMHhGRkZGRkZGRDsKKwkJfSBlbHNlIHsKKwkJCURFQlVHX01TRyhLRVJOX0lORk8KKwkJCSJUaGUgY3Vyc29yIGltYWdlIGlzIGJpZ2VyIHRoYW4gNjR4NjQgYml0cy4uLlxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXdyaXRlbCh0ZW1wLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfTU9ERSk7CisKKwkJdmlhY3Vyc29yLmltYWdlLmhlaWdodCA9IGN1cnNvci0+aW1hZ2UuaGVpZ2h0OworCQl2aWFjdXJzb3IuaW1hZ2Uud2lkdGggPSBjdXJzb3ItPmltYWdlLndpZHRoOworCX0KKworCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRDTUFQKSB7CisJCXZpYWN1cnNvci5pbWFnZS5mZ19jb2xvciA9IGN1cnNvci0+aW1hZ2UuZmdfY29sb3I7CisJCXZpYWN1cnNvci5pbWFnZS5iZ19jb2xvciA9IGN1cnNvci0+aW1hZ2UuYmdfY29sb3I7CisKKwkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA4OgorCQljYXNlIDE2OgorCQljYXNlIDMyOgorCQkJYmdfY29sID0KKwkJCSAgICAoMHhGRiA8PCAyNCkgfAorCQkJICAgICgoKGluZm8tPmNtYXAucmVkKVt2aWFjdXJzb3IuaW1hZ2UuYmdfY29sb3JdICYKKwkJCSAgICAweEZGMDApIDw8IDgpIHwKKwkJCSAgICAoKGluZm8tPmNtYXAuZ3JlZW4pW3ZpYWN1cnNvci5pbWFnZS5iZ19jb2xvcl0gJgorCQkJICAgIDB4RkYwMCkgfAorCQkJICAgICgoKGluZm8tPmNtYXAuYmx1ZSlbdmlhY3Vyc29yLmltYWdlLmJnX2NvbG9yXSAmCisJCQkgICAgMHhGRjAwKSA+PiA4KTsKKwkJCWZnX2NvbCA9CisJCQkgICAgKDB4RkYgPDwgMjQpIHwKKwkJCSAgICAoKChpbmZvLT5jbWFwLnJlZClbdmlhY3Vyc29yLmltYWdlLmZnX2NvbG9yXSAmCisJCQkgICAgMHhGRjAwKSA8PCA4KSB8CisJCQkgICAgKChpbmZvLT5jbWFwLmdyZWVuKVt2aWFjdXJzb3IuaW1hZ2UuZmdfY29sb3JdICYKKwkJCSAgICAweEZGMDApIHwKKwkJCSAgICAoKChpbmZvLT5jbWFwLmJsdWUpW3ZpYWN1cnNvci5pbWFnZS5mZ19jb2xvcl0gJgorCQkJICAgIDB4RkYwMCkgPj4gOCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogVGhpcyBpcyBpbmRlZWQgYSBwYXRjaCBmb3IgVlQzMzI0L1ZUMzM1MyAqLworCQlpZiAoIWluZm8tPnBhcikKKwkJCXJldHVybiAwOworCQlwX3ZpYWZiX3BhciA9IChzdHJ1Y3QgdmlhZmJfcGFyICopaW5mby0+cGFyOworCisJCWlmICgocF92aWFmYl9wYXItPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PQorCQkJVU5JQ0hST01FX0NYNzAwKSB8fAorCQkJKChwX3ZpYWZiX3Bhci0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09CisJCQlVTklDSFJPTUVfVlg4MDApKSkgeworCQkJYmdfY29sID0KKwkJCSAgICAoKChpbmZvLT5jbWFwLnJlZClbdmlhY3Vyc29yLmltYWdlLmJnX2NvbG9yXSAmCisJCQkgICAgMHhGRkMwKSA8PCAxNCkgfAorCQkJICAgICgoKGluZm8tPmNtYXAuZ3JlZW4pW3ZpYWN1cnNvci5pbWFnZS5iZ19jb2xvcl0gJgorCQkJICAgIDB4RkZDMCkgPDwgNCkgfAorCQkJICAgICgoKGluZm8tPmNtYXAuYmx1ZSlbdmlhY3Vyc29yLmltYWdlLmJnX2NvbG9yXSAmCisJCQkgICAgMHhGRkMwKSA+PiA2KTsKKwkJCWZnX2NvbCA9CisJCQkgICAgKCgoaW5mby0+Y21hcC5yZWQpW3ZpYWN1cnNvci5pbWFnZS5mZ19jb2xvcl0gJgorCQkJICAgIDB4RkZDMCkgPDwgMTQpIHwKKwkJCSAgICAoKChpbmZvLT5jbWFwLmdyZWVuKVt2aWFjdXJzb3IuaW1hZ2UuZmdfY29sb3JdICYKKwkJCSAgICAweEZGQzApIDw8IDQpIHwKKwkJCSAgICAoKChpbmZvLT5jbWFwLmJsdWUpW3ZpYWN1cnNvci5pbWFnZS5mZ19jb2xvcl0gJgorCQkJICAgIDB4RkZDMCkgPj4gNik7CisJCX0KKworCQl3cml0ZWwoYmdfY29sLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfQkcpOworCQl3cml0ZWwoZmdfY29sLCB2aWFwYXJpbmZvLT5pb192aXJ0ICsgVklBX1JFR19DVVJTT1JfRkcpOworCX0KKworCWlmIChjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRTSEFQRSkgeworCQlzaXplID0KKwkJICAgICgodmlhY3Vyc29yLmltYWdlLndpZHRoICsgNykgPj4gMykgKgorCQkgICAgdmlhY3Vyc29yLmltYWdlLmhlaWdodDsKKworCQlpZiAoTUFYX0NVUlMgPT0gMzIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCAoQ1VSU09SX1NJWkUgLyAzMik7IGkrKykgeworCQkJCWRhdGFfYmFrW2ldID0gMHgwOworCQkJCWRhdGFfYmFrW2kgKyAxXSA9IDB4RkZGRkZGRkY7CisJCQkJaSArPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKE1BWF9DVVJTID09IDY0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgKENVUlNPUl9TSVpFIC8gMzIpOyBpKyspIHsKKwkJCQlkYXRhX2Jha1tpXSA9IDB4MDsKKwkJCQlkYXRhX2Jha1tpICsgMV0gPSAweDA7CisJCQkJZGF0YV9iYWtbaSArIDJdID0gMHhGRkZGRkZGRjsKKwkJCQlkYXRhX2Jha1tpICsgM10gPSAweEZGRkZGRkZGOworCQkJCWkgKz0gMzsKKwkJCX0KKwkJfQorCisJCXN3aXRjaCAodmlhY3Vyc29yLnJvcCkgeworCQljYXNlIFJPUF9YT1I6CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCWRhdGFbaV0gPSB2aWFjdXJzb3IubWFza1tpXTsKKwkJCWJyZWFrOworCQljYXNlIFJPUF9DT1BZOgorCisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJCWRhdGFbaV0gPSB2aWFjdXJzb3IubWFza1tpXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoTUFYX0NVUlMgPT0gMzIpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlkYXRhX2Jha1tqXSA9ICh1MzIpIGRhdGFbaV07CisJCQkJZGF0YV9iYWtbaiArIDFdID0gfmRhdGFfYmFrW2pdOworCQkJCWogKz0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmIChNQVhfQ1VSUyA9PSA2NCkgeworCQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCWRhdGFfYmFrW2pdID0gKHUzMikgZGF0YVtpXTsKKwkJCQlkYXRhX2Jha1tqICsgMV0gPSAweDA7CisJCQkJZGF0YV9iYWtbaiArIDJdID0gfmRhdGFfYmFrW2pdOworCQkJCWRhdGFfYmFrW2ogKyAzXSA9IH5kYXRhX2Jha1tqICsgMV07CisJCQkJaiArPSA0OworCQkJfQorCQl9CisKKwkJbWVtY3B5KCgoc3RydWN0IHZpYWZiX3BhciAqKShpbmZvLT5wYXIpKS0+ZmJtZW1fdmlydCArCisJCSAgICAgICAoKHN0cnVjdCB2aWFmYl9wYXIgKikoaW5mby0+cGFyKSktPmN1cnNvcl9zdGFydCwKKwkJICAgICAgIGRhdGFfYmFrLCBDVVJTT1JfU0laRSk7CisJfQorCisJaWYgKHZpYWN1cnNvci5lbmFibGUpCisJCXZpYWZiX3Nob3dfaHdfY3Vyc29yKGluZm8sIEhXX0N1cnNvcl9PTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWlmICh2aWFmYl9hY2NlbCkKKwkJdmlhZmJfd2FpdF9lbmdpbmVfaWRsZSgpOworCXJldHVybiAwOworfQorCitpbnQgdmlhZmJfZ2V0X21vZGVfaW5kZXgoaW50IGhyZXMsIGludCB2cmVzLCBpbnQgZmxhZykKK3sKKwl1MzIgaTsKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9nZXRfbW9kZV9pbmRleCFcbiIpOworCisJZm9yIChpID0gMDsgdmlhZmJfbW9kZW50cnlbaV0ubW9kZV9pbmRleCAhPSBWSUFfUkVTX0lOVkFMSUQ7IGkrKykKKwkJaWYgKHZpYWZiX21vZGVudHJ5W2ldLnhyZXMgPT0gaHJlcyAmJgorCQkJdmlhZmJfbW9kZW50cnlbaV0ueXJlcyA9PSB2cmVzKQorCQkJYnJlYWs7CisKKwl2aWFmYl9yZXNNb2RlID0gdmlhZmJfbW9kZW50cnlbaV0ubW9kZV9pbmRleDsKKwlpZiAoZmxhZykKKwkJdmlhZmJfbW9kZTEgPSB2aWFmYl9tb2RlbnRyeVtpXS5tb2RlX3JlczsKKwllbHNlCisJCXZpYWZiX21vZGUgPSB2aWFmYl9tb2RlbnRyeVtpXS5tb2RlX3JlczsKKworCXJldHVybiB2aWFmYl9yZXNNb2RlOworfQorCitzdGF0aWMgdm9pZCBjaGVja19hdmFpbGFibGVfZGV2aWNlX3RvX2VuYWJsZShpbnQgZGV2aWNlX2lkKQoreworCWludCBkZXZpY2VfbnVtID0gMDsKKworCS8qIEluaXRpYWxpemU6ICovCisJdmlhZmJfQ1JUX09OID0gU1RBVEVfT0ZGOworCXZpYWZiX0RWSV9PTiA9IFNUQVRFX09GRjsKKwl2aWFmYl9MQ0RfT04gPSBTVEFURV9PRkY7CisJdmlhZmJfTENEMl9PTiA9IFNUQVRFX09GRjsKKwl2aWFmYl9EZXZpY2VTdGF0dXMgPSBOb25lX0RldmljZTsKKworCWlmICgoZGV2aWNlX2lkICYgQ1JUX0RldmljZSkgJiYgKGRldmljZV9udW0gPCBNQVhfQUNUSVZFX0RFVl9OVU0pKSB7CisJCXZpYWZiX0NSVF9PTiA9IFNUQVRFX09OOworCQlkZXZpY2VfbnVtKys7CisJCXZpYWZiX0RldmljZVN0YXR1cyB8PSBDUlRfRGV2aWNlOworCX0KKworCWlmICgoZGV2aWNlX2lkICYgRFZJX0RldmljZSkgJiYgKGRldmljZV9udW0gPCBNQVhfQUNUSVZFX0RFVl9OVU0pKSB7CisJCXZpYWZiX0RWSV9PTiA9IFNUQVRFX09OOworCQlkZXZpY2VfbnVtKys7CisJCXZpYWZiX0RldmljZVN0YXR1cyB8PSBEVklfRGV2aWNlOworCX0KKworCWlmICgoZGV2aWNlX2lkICYgTENEX0RldmljZSkgJiYgKGRldmljZV9udW0gPCBNQVhfQUNUSVZFX0RFVl9OVU0pKSB7CisJCXZpYWZiX0xDRF9PTiA9IFNUQVRFX09OOworCQlkZXZpY2VfbnVtKys7CisJCXZpYWZiX0RldmljZVN0YXR1cyB8PSBMQ0RfRGV2aWNlOworCX0KKworCWlmICgoZGV2aWNlX2lkICYgTENEMl9EZXZpY2UpICYmIChkZXZpY2VfbnVtIDwgTUFYX0FDVElWRV9ERVZfTlVNKSkgeworCQl2aWFmYl9MQ0QyX09OID0gU1RBVEVfT047CisJCWRldmljZV9udW0rKzsKKwkJdmlhZmJfRGV2aWNlU3RhdHVzIHw9IExDRDJfRGV2aWNlOworCX0KKworCWlmICh2aWFmYl9EZXZpY2VTdGF0dXMgPT0gTm9uZV9EZXZpY2UpIHsKKwkJLyogVXNlIENSVCBhcyBkZWZhdWx0IGFjdGl2ZSBkZXZpY2U6ICovCisJCXZpYWZiX0NSVF9PTiA9IFNUQVRFX09OOworCQl2aWFmYl9EZXZpY2VTdGF0dXMgPSBDUlRfRGV2aWNlOworCX0KKwlERUJVR19NU0coS0VSTl9JTkZPICJEZXZpY2UgU3RhdHVzOiV4IiwgdmlhZmJfRGV2aWNlU3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgdmlhZmJfc2V0X2RldmljZShzdHJ1Y3QgZGV2aWNlX3QgYWN0aXZlX2RldikKK3sKKwkvKiBDaGVjayBhdmFpbGFibGUgZGV2aWNlIHRvIGVuYWJsZTogKi8KKwlpbnQgZGV2aWNlX2lkID0gTm9uZV9EZXZpY2U7CisJaWYgKGFjdGl2ZV9kZXYuY3J0KQorCQlkZXZpY2VfaWQgfD0gQ1JUX0RldmljZTsKKwlpZiAoYWN0aXZlX2Rldi5kdmkpCisJCWRldmljZV9pZCB8PSBEVklfRGV2aWNlOworCWlmIChhY3RpdmVfZGV2LmxjZCkKKwkJZGV2aWNlX2lkIHw9IExDRF9EZXZpY2U7CisKKwljaGVja19hdmFpbGFibGVfZGV2aWNlX3RvX2VuYWJsZShkZXZpY2VfaWQpOworCisJLyogQ2hlY2sgcHJvcGVydHkgb2YgTENEOiAqLworCWlmICh2aWFmYl9MQ0RfT04pIHsKKwkJaWYgKGFjdGl2ZV9kZXYubGNkX2RzcF9jZW50KSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPQorCQkJCXZpYWZiX2xjZF9kc3BfbWV0aG9kID0gTENEX0NFTlRFUklORzsKKwkJfSBlbHNlIHsKKwkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9CisJCQkJdmlhZmJfbGNkX2RzcF9tZXRob2QgPSBMQ0RfRVhQQU5EU0lPTjsKKwkJfQorCisJCWlmIChhY3RpdmVfZGV2LmxjZF9tb2RlID09IExDRF9TUFdHKSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGUgPQorCQkJCXZpYWZiX2xjZF9tb2RlID0gTENEX1NQV0c7CisJCX0gZWxzZSB7CisJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGUgPQorCQkJCXZpYWZiX2xjZF9tb2RlID0gTENEX09QRU5MREk7CisJCX0KKworCQlpZiAoYWN0aXZlX2Rldi5sY2RfcGFuZWxfaWQgPD0gTENEX1BBTkVMX0lEX01BWElNVU0pIHsKKwkJCXZpYWZiX2xjZF9wYW5lbF9pZCA9IGFjdGl2ZV9kZXYubGNkX3BhbmVsX2lkOworCQkJdmlhZmJfaW5pdF9sY2Rfc2l6ZSgpOworCQl9CisJfQorCisJLyogQ2hlY2sgcHJvcGVydHkgb2YgbW9kZTogKi8KKwlpZiAoIWFjdGl2ZV9kZXYueHJlczEpCisJCXZpYWZiX3NlY29uZF94cmVzID0gNjQwOworCWVsc2UKKwkJdmlhZmJfc2Vjb25kX3hyZXMgPSBhY3RpdmVfZGV2LnhyZXMxOworCWlmICghYWN0aXZlX2Rldi55cmVzMSkKKwkJdmlhZmJfc2Vjb25kX3lyZXMgPSA0ODA7CisJZWxzZQorCQl2aWFmYl9zZWNvbmRfeXJlcyA9IGFjdGl2ZV9kZXYueXJlczE7CisJaWYgKGFjdGl2ZV9kZXYuYnBwICE9IDApCisJCXZpYWZiX2JwcCA9IGFjdGl2ZV9kZXYuYnBwOworCWlmIChhY3RpdmVfZGV2LmJwcDEgIT0gMCkKKwkJdmlhZmJfYnBwMSA9IGFjdGl2ZV9kZXYuYnBwMTsKKwlpZiAoYWN0aXZlX2Rldi5yZWZyZXNoICE9IDApCisJCXZpYWZiX3JlZnJlc2ggPSBhY3RpdmVfZGV2LnJlZnJlc2g7CisJaWYgKGFjdGl2ZV9kZXYucmVmcmVzaDEgIT0gMCkKKwkJdmlhZmJfcmVmcmVzaDEgPSBhY3RpdmVfZGV2LnJlZnJlc2gxOworCWlmICgoYWN0aXZlX2Rldi5zYW1tID09IFNUQVRFX09GRikgfHwgKGFjdGl2ZV9kZXYuc2FtbSA9PSBTVEFURV9PTikpCisJCXZpYWZiX1NBTU1fT04gPSBhY3RpdmVfZGV2LnNhbW07CisJdmlhZmJfcHJpbWFyeV9kZXYgPSBhY3RpdmVfZGV2LnByaW1hcnlfZGV2OworCisJdmlhZmJfc2V0X3N0YXJ0X2FkZHIoKTsKKwl2aWFmYl9zZXRfaWdhX3BhdGgoKTsKK30KKworc3RhdGljIHZvaWQgdmlhZmJfc2V0X3ZpZGVvX2RldmljZSh1MzIgdmlkZW9fZGV2X2luZm8pCit7CisJdmlhcGFyaW5mby0+dmlkZW9fb25fY3J0ID0gU1RBVEVfT0ZGOworCXZpYXBhcmluZm8tPnZpZGVvX29uX2R2aSA9IFNUQVRFX09GRjsKKwl2aWFwYXJpbmZvLT52aWRlb19vbl9sY2QgPSBTVEFURV9PRkY7CisKKwkvKiBDaGVjayBhdmFpbGFibGUgZGV2aWNlIHRvIGVuYWJsZTogKi8KKwlpZiAoKHZpZGVvX2Rldl9pbmZvICYgQ1JUX0RldmljZSkgPT0gQ1JUX0RldmljZSkKKwkJdmlhcGFyaW5mby0+dmlkZW9fb25fY3J0ID0gU1RBVEVfT047CisJZWxzZSBpZiAoKHZpZGVvX2Rldl9pbmZvICYgRFZJX0RldmljZSkgPT0gRFZJX0RldmljZSkKKwkJdmlhcGFyaW5mby0+dmlkZW9fb25fZHZpID0gU1RBVEVfT047CisJZWxzZSBpZiAoKHZpZGVvX2Rldl9pbmZvICYgTENEX0RldmljZSkgPT0gTENEX0RldmljZSkKKwkJdmlhcGFyaW5mby0+dmlkZW9fb25fbGNkID0gU1RBVEVfT047Cit9CisKK3N0YXRpYyB2b2lkIHZpYWZiX2dldF92aWRlb19kZXZpY2UodTMyICp2aWRlb19kZXZfaW5mbykKK3sKKwkqdmlkZW9fZGV2X2luZm8gPSBOb25lX0RldmljZTsKKwlpZiAodmlhcGFyaW5mby0+dmlkZW9fb25fY3J0ID09IFNUQVRFX09OKQorCQkqdmlkZW9fZGV2X2luZm8gfD0gQ1JUX0RldmljZTsKKwllbHNlIGlmICh2aWFwYXJpbmZvLT52aWRlb19vbl9kdmkgPT0gU1RBVEVfT04pCisJCSp2aWRlb19kZXZfaW5mbyB8PSBEVklfRGV2aWNlOworCWVsc2UgaWYgKHZpYXBhcmluZm8tPnZpZGVvX29uX2xjZCA9PSBTVEFURV9PTikKKwkJKnZpZGVvX2Rldl9pbmZvIHw9IExDRF9EZXZpY2U7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ByaW1hcnlfZGV2aWNlKHZvaWQpCit7CisJaW50IHByaW1hcnlfZGV2aWNlID0gMDsKKwkvKiBSdWxlOiBkZXZpY2Ugb24gaWdhMSBwYXRoIGFyZSB0aGUgcHJpbWFyeSBkZXZpY2UuICovCisJaWYgKHZpYWZiX1NBTU1fT04pIHsKKwkJaWYgKHZpYWZiX0NSVF9PTikgeworCQkJaWYgKHZpYXBhcmluZm8tPmNydF9zZXR0aW5nX2luZm8tPmlnYV9wYXRoID09IElHQTEpIHsKKwkJCQlERUJVR19NU0coS0VSTl9JTkZPICJDUlQgSUdBIFBhdGg6JWRcbiIsCisJCQkJCXZpYXBhcmluZm8tPgorCQkJCQljcnRfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisJCQkJcHJpbWFyeV9kZXZpY2UgPSBDUlRfRGV2aWNlOworCQkJfQorCQl9CisJCWlmICh2aWFmYl9EVklfT04pIHsKKwkJCWlmICh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPT0gSUdBMSkgeworCQkJCURFQlVHX01TRyhLRVJOX0lORk8gIkRWSSBJR0EgUGF0aDolZFxuIiwKKwkJCQkJdmlhcGFyaW5mby0+CisJCQkJCXRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisJCQkJcHJpbWFyeV9kZXZpY2UgPSBEVklfRGV2aWNlOworCQkJfQorCQl9CisJCWlmICh2aWFmYl9MQ0RfT04pIHsKKwkJCWlmICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGggPT0gSUdBMSkgeworCQkJCURFQlVHX01TRyhLRVJOX0lORk8gIkxDRCBJR0EgUGF0aDolZFxuIiwKKwkJCQkJdmlhcGFyaW5mby0+CisJCQkJCWx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CisJCQkJcHJpbWFyeV9kZXZpY2UgPSBMQ0RfRGV2aWNlOworCQkJfQorCQl9CisJCWlmICh2aWFmYl9MQ0QyX09OKSB7CisJCQlpZiAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5pZ2FfcGF0aCA9PSBJR0ExKSB7CisJCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAiTENEMiBJR0EgUGF0aDolZFxuIiwKKwkJCQkJdmlhcGFyaW5mby0+CisJCQkJCWx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGgpOworCQkJCXByaW1hcnlfZGV2aWNlID0gTENEMl9EZXZpY2U7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHByaW1hcnlfZGV2aWNlOworfQorCitzdGF0aWMgdTggaXNfZHVvdmlldyh2b2lkKQoreworCWlmICgwID09IHZpYWZiX1NBTU1fT04pIHsKKwkJaWYgKHZpYWZiX0xDRF9PTiArIHZpYWZiX0xDRDJfT04gKworCQkJdmlhZmJfRFZJX09OICsgdmlhZmJfQ1JUX09OID09IDIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3NlY29uZF9tb2RlX3NldHRpbmcoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvCisJKnNlY192YXIpCit7CisJdTMyIGh0b3RhbCwgdnRvdGFsLCBsb25nX3JlZnJlc2g7CisKKwlodG90YWwgPSBzZWNfdmFyLT54cmVzICsgc2VjX3Zhci0+bGVmdF9tYXJnaW4gKworCQlzZWNfdmFyLT5yaWdodF9tYXJnaW4gKyBzZWNfdmFyLT5oc3luY19sZW47CisJdnRvdGFsID0gc2VjX3Zhci0+eXJlcyArIHNlY192YXItPnVwcGVyX21hcmdpbiArCisJCXNlY192YXItPmxvd2VyX21hcmdpbiArIHNlY192YXItPnZzeW5jX2xlbjsKKwlpZiAoKHNlY192YXItPnhyZXNfdmlydHVhbCAqIChzZWNfdmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKSkgJiAweDFGKSB7CisJCS8qSXMgMzIgYnl0ZXMgYWxpZ25tZW50PyAqLworCQkvKjMyIHBpeGVsIGFsaWdubWVudCAqLworCQlzZWNfdmFyLT54cmVzX3ZpcnR1YWwgPSAoc2VjX3Zhci0+eHJlc192aXJ0dWFsICsgMzEpICYgfjMxOworCX0KKworCWh0b3RhbCA9IHNlY192YXItPnhyZXMgKyBzZWNfdmFyLT5sZWZ0X21hcmdpbiArCisJCXNlY192YXItPnJpZ2h0X21hcmdpbiArIHNlY192YXItPmhzeW5jX2xlbjsKKwl2dG90YWwgPSBzZWNfdmFyLT55cmVzICsgc2VjX3Zhci0+dXBwZXJfbWFyZ2luICsKKwkJc2VjX3Zhci0+bG93ZXJfbWFyZ2luICsgc2VjX3Zhci0+dnN5bmNfbGVuOworCWxvbmdfcmVmcmVzaCA9IDEwMDAwMDAwMDBVTCAvIHNlY192YXItPnBpeGNsb2NrICogMTAwMDsKKwlsb25nX3JlZnJlc2ggLz0gKGh0b3RhbCAqIHZ0b3RhbCk7CisKKwl2aWFmYl9zZWNvbmRfeHJlcyA9IHNlY192YXItPnhyZXM7CisJdmlhZmJfc2Vjb25kX3lyZXMgPSBzZWNfdmFyLT55cmVzOworCXZpYWZiX3NlY29uZF92aXJ0dWFsX3hyZXMgPSBzZWNfdmFyLT54cmVzX3ZpcnR1YWw7CisJdmlhZmJfc2Vjb25kX3ZpcnR1YWxfeXJlcyA9IHNlY192YXItPnlyZXNfdmlydHVhbDsKKwl2aWFmYl9icHAxID0gc2VjX3Zhci0+Yml0c19wZXJfcGl4ZWw7CisJdmlhZmJfcmVmcmVzaDEgPSB2aWFmYl9nZXRfcmVmcmVzaChzZWNfdmFyLT54cmVzLCBzZWNfdmFyLT55cmVzLAorCQlsb25nX3JlZnJlc2gpOworfQorCitzdGF0aWMgaW50IGFwcGx5X2RldmljZV9zZXR0aW5nKHN0cnVjdCB2aWFmYl9pb2N0bF9zZXR0aW5nIHNldHRpbmdfaW5mbywKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgbmVlZF9zZXRfbW9kZSA9IDA7CisJREVCVUdfTVNHKEtFUk5fSU5GTyAiYXBwbHlfZGV2aWNlX3NldHRpbmdcbiIpOworCisJaWYgKHNldHRpbmdfaW5mby5kZXZpY2VfZmxhZykgeworCQluZWVkX3NldF9tb2RlID0gMTsKKwkJY2hlY2tfYXZhaWxhYmxlX2RldmljZV90b19lbmFibGUoc2V0dGluZ19pbmZvLmRldmljZV9zdGF0dXMpOworCX0KKworCS8qIFVubG9jayBMQ0QncyBvcGVyYXRpb24gYWNjb3JkaW5nIHRvIExDRCBmbGFnCisJICAgYW5kIGNoZWNrIGlmIHRoZSBzZXR0aW5nIHZhbHVlIGlzIHZhbGlkLiAqLworCS8qIElmIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYXBwbHkgdGhlIG5ldyBzZXR0aW5nIHZhbHVlIHRvIHRoZSBkZXZpY2UuICovCisJaWYgKHZpYWZiX0xDRF9PTikgeworCQlpZiAoc2V0dGluZ19pbmZvLmxjZF9vcGVyYXRpb25fZmxhZyAmIE9QX0xDRF9DRU5URVJJTkcpIHsKKwkJCW5lZWRfc2V0X21vZGUgPSAxOworCQkJaWYgKHNldHRpbmdfaW5mby5sY2RfYXR0cmlidXRlcy5kaXNwbGF5X2NlbnRlcikgeworCQkJCS8qIENlbnRlcmluZyAqLworCQkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9CisJCQkJICAgIExDRF9DRU5URVJJTkc7CisJCQkJdmlhZmJfbGNkX2RzcF9tZXRob2QgPSBMQ0RfQ0VOVEVSSU5HOworCQkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+ZGlzcGxheV9tZXRob2QgPQorCQkJCSAgICB2aWFmYl9sY2RfZHNwX21ldGhvZCA9IExDRF9DRU5URVJJTkc7CisJCQl9IGVsc2UgeworCQkJCS8qIGV4cGFuZHNpb24gKi8KKwkJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPQorCQkJCSAgICBMQ0RfRVhQQU5EU0lPTjsKKwkJCQl2aWFmYl9sY2RfZHNwX21ldGhvZCA9IExDRF9FWFBBTkRTSU9OOworCQkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+ZGlzcGxheV9tZXRob2QgPQorCQkJCSAgICBMQ0RfRVhQQU5EU0lPTjsKKwkJCQl2aWFmYl9sY2RfZHNwX21ldGhvZCA9IExDRF9FWFBBTkRTSU9OOworCQkJfQorCQl9CisKKwkJaWYgKHNldHRpbmdfaW5mby5sY2Rfb3BlcmF0aW9uX2ZsYWcgJiBPUF9MQ0RfTU9ERSkgeworCQkJbmVlZF9zZXRfbW9kZSA9IDE7CisJCQlpZiAoc2V0dGluZ19pbmZvLmxjZF9hdHRyaWJ1dGVzLmxjZF9tb2RlID09CisJCQkJTENEX1NQV0cpIHsKKwkJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGUgPQorCQkJCQl2aWFmYl9sY2RfbW9kZSA9IExDRF9TUFdHOworCQkJfSBlbHNlIHsKKwkJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+bGNkX21vZGUgPQorCQkJCQl2aWFmYl9sY2RfbW9kZSA9IExDRF9PUEVOTERJOworCQkJfQorCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLT5sY2RfbW9kZSA9CisJCQkgICAgdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmxjZF9tb2RlOworCQl9CisKKwkJaWYgKHNldHRpbmdfaW5mby5sY2Rfb3BlcmF0aW9uX2ZsYWcgJiBPUF9MQ0RfUEFORUxfSUQpIHsKKwkJCW5lZWRfc2V0X21vZGUgPSAxOworCQkJaWYgKHNldHRpbmdfaW5mby5sY2RfYXR0cmlidXRlcy5wYW5lbF9pZCA8PQorCQkJICAgIExDRF9QQU5FTF9JRF9NQVhJTVVNKSB7CisJCQkJdmlhZmJfbGNkX3BhbmVsX2lkID0KKwkJCQkgICAgc2V0dGluZ19pbmZvLmxjZF9hdHRyaWJ1dGVzLnBhbmVsX2lkOworCQkJCXZpYWZiX2luaXRfbGNkX3NpemUoKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICgwICE9IChzZXR0aW5nX2luZm8uc2FtbV9zdGF0dXMgJiBPUF9TQU1NKSkgeworCQlzZXR0aW5nX2luZm8uc2FtbV9zdGF0dXMgPQorCQkgICAgc2V0dGluZ19pbmZvLnNhbW1fc3RhdHVzICYgKH5PUF9TQU1NKTsKKwkJaWYgKHNldHRpbmdfaW5mby5zYW1tX3N0YXR1cyA9PSAwCisJCSAgICB8fCBzZXR0aW5nX2luZm8uc2FtbV9zdGF0dXMgPT0gMSkgeworCQkJdmlhZmJfU0FNTV9PTiA9IHNldHRpbmdfaW5mby5zYW1tX3N0YXR1czsKKworCQkJaWYgKHZpYWZiX1NBTU1fT04pCisJCQkJdmlhZmJfcHJpbWFyeV9kZXYgPSBzZXR0aW5nX2luZm8ucHJpbWFyeV9kZXZpY2U7CisKKwkJCXZpYWZiX3NldF9zdGFydF9hZGRyKCk7CisJCQl2aWFmYl9zZXRfaWdhX3BhdGgoKTsKKwkJfQorCQluZWVkX3NldF9tb2RlID0gMTsKKwl9CisKKwl2aWFwYXJpbmZvLT5kdW92aWV3ID0gaXNfZHVvdmlldygpOworCisJaWYgKCFuZWVkX3NldF9tb2RlKSB7CisJCTsKKwl9IGVsc2UgeworCQl2aWFmYl9zZXRfaWdhX3BhdGgoKTsKKwkJdmlhZmJfc2V0X3BhcihpbmZvKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHJldHJpZXZlX2RldmljZV9zZXR0aW5nKHN0cnVjdCB2aWFmYl9pb2N0bF9zZXR0aW5nCisJKnNldHRpbmdfaW5mbykKK3sKKworCS8qIGdldCBkZXZpY2Ugc3RhdHVzICovCisJaWYgKHZpYWZiX0NSVF9PTiA9PSAxKQorCQlzZXR0aW5nX2luZm8tPmRldmljZV9zdGF0dXMgPSBDUlRfRGV2aWNlOworCWlmICh2aWFmYl9EVklfT04gPT0gMSkKKwkJc2V0dGluZ19pbmZvLT5kZXZpY2Vfc3RhdHVzIHw9IERWSV9EZXZpY2U7CisJaWYgKHZpYWZiX0xDRF9PTiA9PSAxKQorCQlzZXR0aW5nX2luZm8tPmRldmljZV9zdGF0dXMgfD0gTENEX0RldmljZTsKKwlpZiAodmlhZmJfTENEMl9PTiA9PSAxKQorCQlzZXR0aW5nX2luZm8tPmRldmljZV9zdGF0dXMgfD0gTENEMl9EZXZpY2U7CisJaWYgKCh2aWFwYXJpbmZvLT52aWRlb19vbl9jcnQgPT0gMSkgJiYgKHZpYWZiX0NSVF9PTiA9PSAxKSkgeworCQlzZXR0aW5nX2luZm8tPnZpZGVvX2RldmljZV9zdGF0dXMgPQorCQkJdmlhcGFyaW5mby0+Y3J0X3NldHRpbmdfaW5mby0+aWdhX3BhdGg7CisJfSBlbHNlIGlmICgodmlhcGFyaW5mby0+dmlkZW9fb25fZHZpID09IDEpICYmICh2aWFmYl9EVklfT04gPT0gMSkpIHsKKwkJc2V0dGluZ19pbmZvLT52aWRlb19kZXZpY2Vfc3RhdHVzID0KKwkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aDsKKwl9IGVsc2UgaWYgKCh2aWFwYXJpbmZvLT52aWRlb19vbl9sY2QgPT0gMSkgJiYgKHZpYWZiX0xDRF9PTiA9PSAxKSkgeworCQlzZXR0aW5nX2luZm8tPnZpZGVvX2RldmljZV9zdGF0dXMgPQorCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmlnYV9wYXRoOworCX0gZWxzZSB7CisJCXNldHRpbmdfaW5mby0+dmlkZW9fZGV2aWNlX3N0YXR1cyA9IDA7CisJfQorCisJc2V0dGluZ19pbmZvLT5zYW1tX3N0YXR1cyA9IHZpYWZiX1NBTU1fT047CisJc2V0dGluZ19pbmZvLT5wcmltYXJ5X2RldmljZSA9IGdldF9wcmltYXJ5X2RldmljZSgpOworCisJc2V0dGluZ19pbmZvLT5maXJzdF9kZXZfYnBwID0gdmlhZmJfYnBwOworCXNldHRpbmdfaW5mby0+c2Vjb25kX2Rldl9icHAgPSB2aWFmYl9icHAxOworCisJc2V0dGluZ19pbmZvLT5maXJzdF9kZXZfcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2g7CisJc2V0dGluZ19pbmZvLT5zZWNvbmRfZGV2X3JlZnJlc2ggPSB2aWFmYl9yZWZyZXNoMTsKKworCXNldHRpbmdfaW5mby0+Zmlyc3RfZGV2X2hvcl9yZXMgPSB2aWFmYl9ob3RwbHVnX1hyZXM7CisJc2V0dGluZ19pbmZvLT5maXJzdF9kZXZfdmVyX3JlcyA9IHZpYWZiX2hvdHBsdWdfWXJlczsKKwlzZXR0aW5nX2luZm8tPnNlY29uZF9kZXZfaG9yX3JlcyA9IHZpYWZiX3NlY29uZF94cmVzOworCXNldHRpbmdfaW5mby0+c2Vjb25kX2Rldl92ZXJfcmVzID0gdmlhZmJfc2Vjb25kX3lyZXM7CisKKwkvKiBHZXQgbGNkIGF0dHJpYnV0ZXMgKi8KKwlzZXR0aW5nX2luZm8tPmxjZF9hdHRyaWJ1dGVzLmRpc3BsYXlfY2VudGVyID0gdmlhZmJfbGNkX2RzcF9tZXRob2Q7CisJc2V0dGluZ19pbmZvLT5sY2RfYXR0cmlidXRlcy5wYW5lbF9pZCA9IHZpYWZiX2xjZF9wYW5lbF9pZDsKKwlzZXR0aW5nX2luZm8tPmxjZF9hdHRyaWJ1dGVzLmxjZF9tb2RlID0gdmlhZmJfbGNkX21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2FjdGl2ZV9kZXYodm9pZCkKK3sKKwl2aWFmYl9DUlRfT04gPSBTVEFURV9PRkY7CisJdmlhZmJfRFZJX09OID0gU1RBVEVfT0ZGOworCXZpYWZiX0xDRF9PTiA9IFNUQVRFX09GRjsKKwl2aWFmYl9MQ0QyX09OID0gU1RBVEVfT0ZGOworCS8qIDEuIE1vZGlmeSB0aGUgYWN0aXZlIHN0YXR1cyBvZiBkZXZpY2VzLiAqLworCS8qIDIuIEtlZXAgdGhlIG9yZGVyIG9mIGRldmljZXMsIHNvIHdlIGNhbiBzZXQgY29ycmVzcG9uZGluZworCSAgIElHQSBwYXRoIHRvIGRldmljZXMgaW4gU0FNTSBjYXNlLiAqLworCS8qICAgIE5vdGU6IFRoZSBwcmV2aW91cyBvZiBhY3RpdmVfZGV2IGlzIHByaW1hcnkgZGV2aWNlLAorCSAgIGFuZCB0aGUgZm9sbG93aW5nIGlzIHNlY29uZGFyeSBkZXZpY2UuICovCisJaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJDUlQrRFZJIiwgNykpIHsKKwkJLyogQ1JUK0RWSSAqLworCQl2aWFmYl9DUlRfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfRFZJX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gQ1JUX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJEVkkrQ1JUIiwgNykpIHsKKwkJLyogRFZJK0NSVCAqLworCQl2aWFmYl9DUlRfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfRFZJX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gRFZJX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJDUlQrTENEIiwgNykpIHsKKwkJLyogQ1JUK0xDRCAqLworCQl2aWFmYl9DUlRfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfTENEX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gQ1JUX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJMQ0QrQ1JUIiwgNykpIHsKKwkJLyogTENEK0NSVCAqLworCQl2aWFmYl9DUlRfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfTENEX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gTENEX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJEVkkrTENEIiwgNykpIHsKKwkJLyogRFZJK0xDRCAqLworCQl2aWFmYl9EVklfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfTENEX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gRFZJX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJMQ0QrRFZJIiwgNykpIHsKKwkJLyogTENEK0RWSSAqLworCQl2aWFmYl9EVklfT04gPSBTVEFURV9PTjsKKwkJdmlhZmJfTENEX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gTENEX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJMQ0QrTENEMiIsIDgpKSB7CisJCXZpYWZiX0xDRF9PTiA9IFNUQVRFX09OOworCQl2aWFmYl9MQ0QyX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gTENEX0RldmljZTsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX2FjdGl2ZV9kZXYsICJMQ0QyK0xDRCIsIDgpKSB7CisJCXZpYWZiX0xDRF9PTiA9IFNUQVRFX09OOworCQl2aWFmYl9MQ0QyX09OID0gU1RBVEVfT047CisJCXZpYWZiX3ByaW1hcnlfZGV2ID0gTENEMl9EZXZpY2U7CisJfSBlbHNlIGlmICghc3RybmNtcCh2aWFmYl9hY3RpdmVfZGV2LCAiQ1JUIiwgMykpIHsKKwkJLyogQ1JUIG9ubHkgKi8KKwkJdmlhZmJfQ1JUX09OID0gU1RBVEVfT047CisJCXZpYWZiX1NBTU1fT04gPSBTVEFURV9PRkY7CisJfSBlbHNlIGlmICghc3RybmNtcCh2aWFmYl9hY3RpdmVfZGV2LCAiRFZJIiwgMykpIHsKKwkJLyogRFZJIG9ubHkgKi8KKwkJdmlhZmJfRFZJX09OID0gU1RBVEVfT047CisJCXZpYWZiX1NBTU1fT04gPSBTVEFURV9PRkY7CisJfSBlbHNlIGlmICghc3RybmNtcCh2aWFmYl9hY3RpdmVfZGV2LCAiTENEIiwgMykpIHsKKwkJLyogTENEIG9ubHkgKi8KKwkJdmlhZmJfTENEX09OID0gU1RBVEVfT047CisJCXZpYWZiX1NBTU1fT04gPSBTVEFURV9PRkY7CisJfSBlbHNlIHsKKwkJdmlhZmJfQ1JUX09OID0gU1RBVEVfT047CisJCXZpYWZiX1NBTU1fT04gPSBTVEFURV9PRkY7CisJfQorCXZpYXBhcmluZm8tPmR1b3ZpZXcgPSBpc19kdW92aWV3KCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3ZpZGVvX2Rldih2b2lkKQoreworCXZpYXBhcmluZm8tPnZpZGVvX29uX2NydCA9IFNUQVRFX09GRjsKKwl2aWFwYXJpbmZvLT52aWRlb19vbl9kdmkgPSBTVEFURV9PRkY7CisJdmlhcGFyaW5mby0+dmlkZW9fb25fbGNkID0gU1RBVEVfT0ZGOworCisJaWYgKCFzdHJuY21wKHZpYWZiX3ZpZGVvX2RldiwgIkNSVCIsIDMpKSB7CisJCS8qIFZpZGVvIG9uIENSVCAqLworCQl2aWFwYXJpbmZvLT52aWRlb19vbl9jcnQgPSBTVEFURV9PTjsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX3ZpZGVvX2RldiwgIkRWSSIsIDMpKSB7CisJCS8qIFZpZGVvIG9uIERWSSAqLworCQl2aWFwYXJpbmZvLT52aWRlb19vbl9kdmkgPSBTVEFURV9PTjsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHZpYWZiX3ZpZGVvX2RldiwgIkxDRCIsIDMpKSB7CisJCS8qIFZpZGVvIG9uIExDRCAqLworCQl2aWFwYXJpbmZvLT52aWRlb19vbl9sY2QgPSBTVEFURV9PTjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcG9ydChjaGFyICpvcHRfc3RyLCBpbnQgKm91dHB1dF9pbnRlcmZhY2UpCit7CisJaWYgKCFzdHJuY21wKG9wdF9zdHIsICJEVlAwIiwgNCkpCisJCSpvdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX0RWUDA7CisJZWxzZSBpZiAoIXN0cm5jbXAob3B0X3N0ciwgIkRWUDEiLCA0KSkKKwkJKm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfRFZQMTsKKwllbHNlIGlmICghc3RybmNtcChvcHRfc3RyLCAiREZQX0hJR0hMT1ciLCAxMSkpCisJCSpvdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX0RGUDsKKwllbHNlIGlmICghc3RybmNtcChvcHRfc3RyLCAiREZQX0hJR0giLCA4KSkKKwkJKm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfREZQX0hJR0g7CisJZWxzZSBpZiAoIXN0cm5jbXAob3B0X3N0ciwgIkRGUF9MT1ciLCA3KSkKKwkJKm91dHB1dF9pbnRlcmZhY2UgPSBJTlRFUkZBQ0VfREZQX0xPVzsKKwllbHNlCisJCSpvdXRwdXRfaW50ZXJmYWNlID0gSU5URVJGQUNFX05PTkU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2xjZF9wb3J0KHZvaWQpCit7CisJcGFyc2VfcG9ydCh2aWFmYl9sY2RfcG9ydCwgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uCisJCW91dHB1dF9pbnRlcmZhY2UpOworCS8qSW5pdGlhbGl6ZSB0byBhdm9pZCB1bmV4cGVjdGVkIGJlaGF2aW9yICovCisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIub3V0cHV0X2ludGVyZmFjZSA9CisJSU5URVJGQUNFX05PTkU7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJwYXJzZV9sY2RfcG9ydDogdmlhZmJfbGNkX3BvcnQ6JXMsaW50ZXJmYWNlOiVkXG4iLAorCQkgIHZpYWZiX2xjZF9wb3J0LCB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLgorCQkgIG91dHB1dF9pbnRlcmZhY2UpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9kdmlfcG9ydCh2b2lkKQoreworCXBhcnNlX3BvcnQodmlhZmJfZHZpX3BvcnQsICZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPnRtZHNfY2hpcF9pbmZvLgorCQlvdXRwdXRfaW50ZXJmYWNlKTsKKworCURFQlVHX01TRyhLRVJOX0lORk8gInBhcnNlX2R2aV9wb3J0OiB2aWFmYl9kdmlfcG9ydDolcyxpbnRlcmZhY2U6JWRcbiIsCisJCSAgdmlhZmJfZHZpX3BvcnQsIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+dG1kc19jaGlwX2luZm8uCisJCSAgb3V0cHV0X2ludGVyZmFjZSk7Cit9CisKKy8qCisgKiBUaGUgcHJvYyBmaWxlc3lzdGVtIHJlYWQvd3JpdGUgZnVuY3Rpb24sIGEgc2ltcGxlIHByb2MgaW1wbGVtZW50IHRvCisgKiBnZXQvc2V0IHRoZSB2YWx1ZSBvZiBEUEEgIERWUDAsICAgRFZQMERhdGFEcml2aW5nLCAgRFZQMENsb2NrRHJpdmluZywgRFZQMSwKKyAqIERWUDFEcml2aW5nLCBERlBIaWdoLCBERlBMb3cgQ1I5NiwgICBTUjJBWzVdLCBTUjFCWzFdLCBTUjJBWzRdLCBTUjFFWzJdLAorICogQ1I5QiwgICAgU1I2NSwgICAgQ1I5NywgICAgQ1I5OQorICovCitzdGF0aWMgaW50IHZpYWZiX2R2cDBfcHJvY19yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCitpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwOworCXU4IGR2cDBfZGF0YV9kcmkgPSAwLCBkdnAwX2Nsa19kcmkgPSAwLCBkdnAwID0gMDsKKwlkdnAwX2RhdGFfZHJpID0KKwkgICAgKHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjJBKSAmIEJJVDUpID4+IDQgfAorCSAgICAodmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMUIpICYgQklUMSkgPj4gMTsKKwlkdnAwX2Nsa19kcmkgPQorCSAgICAodmlhZmJfcmVhZF9yZWcoVklBU1IsIFNSMkEpICYgQklUNCkgPj4gMyB8CisJICAgICh2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1IxRSkgJiBCSVQyKSA+PiAyOworCWR2cDAgPSB2aWFmYl9yZWFkX3JlZyhWSUFDUiwgQ1I5NikgJiAweDBmOworCWxlbiArPQorCSAgICBzcHJpbnRmKGJ1ZiArIGxlbiwgIiV4ICV4ICV4XG4iLCBkdnAwLCBkdnAwX2RhdGFfZHJpLCBkdnAwX2Nsa19kcmkpOworCSplb2YgPSAxOwkJLypJbmZvcm0ga2VybmVsIGVuZCBvZiBkYXRhICovCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgdmlhZmJfZHZwMF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMjBdLCAqdmFsdWUsICpwYnVmOworCXU4IHJlZ192YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBpOworCWlmIChjb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWxlbmd0aCA9IGNvdW50ID4gMjAgPyAyMCA6IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmWzBdLCBidWZmZXIsIGxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5ndGggLSAxXSA9ICdcMCc7CS8qRW5zdXJlIGVuZCBzdHJpbmcgKi8KKwlwYnVmID0gJmJ1ZlswXTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXZhbHVlID0gc3Ryc2VwKCZwYnVmLCAiICIpOworCQlpZiAodmFsdWUgIT0gTlVMTCkgeworCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsICh1bnNpZ25lZCBsb25nICopJnJlZ192YWwpOworCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAiRFZQMDpyZWdfdmFsWyVsXT06JXhcbiIsIGksCisJCQkJICByZWdfdmFsKTsKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAwOgorCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTYsIFZJQUNSLAorCQkJCQlyZWdfdmFsLCAweDBmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwKKwkJCQkJcmVnX3ZhbCA8PCA0LCBCSVQ1KTsKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFCLCBWSUFTUiwKKwkJCQkJcmVnX3ZhbCA8PCAxLCBCSVQxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwKKwkJCQkJcmVnX3ZhbCA8PCAzLCBCSVQ0KTsKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFFLCBWSUFTUiwKKwkJCQkJcmVnX3ZhbCA8PCAyLCBCSVQyKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgaW50IHZpYWZiX2R2cDFfcHJvY19yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwl1OCBkdnAxID0gMCwgZHZwMV9kYXRhX2RyaSA9IDAsIGR2cDFfY2xrX2RyaSA9IDA7CisJZHZwMSA9IHZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjlCKSAmIDB4MGY7CisJZHZwMV9kYXRhX2RyaSA9ICh2aWFmYl9yZWFkX3JlZyhWSUFTUiwgU1I2NSkgJiAweDBjKSA+PiAyOworCWR2cDFfY2xrX2RyaSA9IHZpYWZiX3JlYWRfcmVnKFZJQVNSLCBTUjY1KSAmIDB4MDM7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmICsgbGVuLCAiJXggJXggJXhcbiIsIGR2cDEsIGR2cDFfZGF0YV9kcmksIGR2cDFfY2xrX2RyaSk7CisJKmVvZiA9IDE7CQkvKkluZm9ybSBrZXJuZWwgZW5kIG9mIGRhdGEgKi8KKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludCB2aWFmYl9kdnAxX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGJ1ZlsyMF0sICp2YWx1ZSwgKnBidWY7CisJdTggcmVnX3ZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBsZW5ndGgsIGk7CisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGVuZ3RoID0gY291bnQgPiAyMCA/IDIwIDogY291bnQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZbMF0sIGJ1ZmZlciwgbGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbmd0aCAtIDFdID0gJ1wwJzsJLypFbnN1cmUgZW5kIHN0cmluZyAqLworCXBidWYgPSAmYnVmWzBdOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJdmFsdWUgPSBzdHJzZXAoJnBidWYsICIgIik7CisJCWlmICh2YWx1ZSAhPSBOVUxMKSB7CisJCQlzdHJpY3Rfc3RydG91bCh2YWx1ZSwgMCwgKHVuc2lnbmVkIGxvbmcgKikmcmVnX3ZhbCk7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgMDoKKwkJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjlCLCBWSUFDUiwKKwkJCQkJcmVnX3ZhbCwgMHgwZik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I2NSwgVklBU1IsCisJCQkJCXJlZ192YWwgPDwgMiwgMHgwYyk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1I2NSwgVklBU1IsCisJCQkJCXJlZ192YWwsIDB4MDMpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB2aWFmYl9kZnBoX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJdTggZGZwX2hpZ2ggPSAwOworCWRmcF9oaWdoID0gdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSOTcpICYgMHgwZjsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIleFxuIiwgZGZwX2hpZ2gpOworCSplb2YgPSAxOwkJLypJbmZvcm0ga2VybmVsIGVuZCBvZiBkYXRhICovCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgdmlhZmJfZGZwaF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMjBdOworCXU4IHJlZ192YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCWlmIChjb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWxlbmd0aCA9IGNvdW50ID4gMjAgPyAyMCA6IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmWzBdLCBidWZmZXIsIGxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5ndGggLSAxXSA9ICdcMCc7CS8qRW5zdXJlIGVuZCBzdHJpbmcgKi8KKwlzdHJpY3Rfc3RydG91bCgmYnVmWzBdLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk3LCBWSUFDUiwgcmVnX3ZhbCwgMHgwZik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIGludCB2aWFmYl9kZnBsX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJdTggZGZwX2xvdyA9IDA7CisJZGZwX2xvdyA9IHZpYWZiX3JlYWRfcmVnKFZJQUNSLCBDUjk5KSAmIDB4MGY7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXhcbiIsIGRmcF9sb3cpOworCSplb2YgPSAxOwkJLypJbmZvcm0ga2VybmVsIGVuZCBvZiBkYXRhICovCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgdmlhZmJfZGZwbF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMjBdOworCXU4IHJlZ192YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCWlmIChjb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWxlbmd0aCA9IGNvdW50ID4gMjAgPyAyMCA6IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmWzBdLCBidWZmZXIsIGxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5ndGggLSAxXSA9ICdcMCc7CS8qRW5zdXJlIGVuZCBzdHJpbmcgKi8KKwlzdHJpY3Rfc3RydG91bCgmYnVmWzBdLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjk5LCBWSUFDUiwgcmVnX3ZhbCwgMHgwZik7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIGludCB2aWFmYl92dDE2MzZfcHJvY19yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LAorCW9mZl90IG9mZnNldCwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwl1OCB2dDE2MzZfMDggPSAwLCB2dDE2MzZfMDkgPSAwOworCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby5sdmRzX2NoaXBfbmFtZSkgeworCWNhc2UgVlQxNjM2X0xWRFM6CisJCXZ0MTYzNl8wOCA9CisJCSAgICB2aWFmYl9ncGlvX2kyY19yZWFkX2x2ZHModmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCSAgICAmdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbywgMHgwOCkgJiAweDBmOworCQl2dDE2MzZfMDkgPQorCQkgICAgdmlhZmJfZ3Bpb19pMmNfcmVhZF9sdmRzKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8sIDB4MDkpICYgMHgxZjsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXggJXhcbiIsIHZ0MTYzNl8wOCwgdnQxNjM2XzA5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIubHZkc19jaGlwX25hbWUpIHsKKwljYXNlIFZUMTYzNl9MVkRTOgorCQl2dDE2MzZfMDggPQorCQkgICAgdmlhZmJfZ3Bpb19pMmNfcmVhZF9sdmRzKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMiwKKwkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMiwgMHgwOCkgJiAweDBmOworCQl2dDE2MzZfMDkgPQorCQkgICAgdmlhZmJfZ3Bpb19pMmNfcmVhZF9sdmRzKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMiwKKwkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMiwgMHgwOSkgJiAweDFmOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIgJXggJXhcbiIsIHZ0MTYzNl8wOCwgdnQxNjM2XzA5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCSplb2YgPSAxOwkJLypJbmZvcm0ga2VybmVsIGVuZCBvZiBkYXRhICovCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgdmlhZmJfdnQxNjM2X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGJ1ZlszMF0sICp2YWx1ZSwgKnBidWY7CisJc3RydWN0IElPREFUQSByZWdfdmFsOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBpOworCWlmIChjb3VudCA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCWxlbmd0aCA9IGNvdW50ID4gMzAgPyAzMCA6IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmWzBdLCBidWZmZXIsIGxlbmd0aCkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5ndGggLSAxXSA9ICdcMCc7CS8qRW5zdXJlIGVuZCBzdHJpbmcgKi8KKwlwYnVmID0gJmJ1ZlswXTsKKwlzd2l0Y2ggKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8ubHZkc19jaGlwX25hbWUpIHsKKwljYXNlIFZUMTYzNl9MVkRTOgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKKwkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7CisJCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCisJCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJc3dpdGNoIChpKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZWdfdmFsLkluZGV4ID0gMHgwODsKKwkJCQkJcmVnX3ZhbC5NYXNrID0gMHgwZjsKKwkJCQkJdmlhZmJfZ3Bpb19pMmNfd3JpdGVfbWFza19sdmRzCisJCQkJCSAgICAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8sCisJCQkJCSAgICAmdmlhcGFyaW5mby0+CisJCQkJCSAgICBjaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLAorCQkJCQkgICAgIHJlZ192YWwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXJlZ192YWwuSW5kZXggPSAweDA5OworCQkJCQlyZWdfdmFsLk1hc2sgPSAweDFmOworCQkJCQl2aWFmYl9ncGlvX2kyY193cml0ZV9tYXNrX2x2ZHMKKwkJCQkJICAgICh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbywKKwkJCQkJICAgICZ2aWFwYXJpbmZvLT4KKwkJCQkJICAgIGNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8sCisJCQkJCSAgICAgcmVnX3ZhbCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIubHZkc19jaGlwX25hbWUpIHsKKwljYXNlIFZUMTYzNl9MVkRTOgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKKwkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7CisJCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCisJCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJc3dpdGNoIChpKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZWdfdmFsLkluZGV4ID0gMHgwODsKKwkJCQkJcmVnX3ZhbC5NYXNrID0gMHgwZjsKKwkJCQkJdmlhZmJfZ3Bpb19pMmNfd3JpdGVfbWFza19sdmRzCisJCQkJCSAgICAodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLAorCQkJCQkgICAgJnZpYXBhcmluZm8tPgorCQkJCQkgICAgY2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIsCisJCQkJCSAgICAgcmVnX3ZhbCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJcmVnX3ZhbC5JbmRleCA9IDB4MDk7CisJCQkJCXJlZ192YWwuTWFzayA9IDB4MWY7CisJCQkJCXZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcworCQkJCQkgICAgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMiwKKwkJCQkJICAgICZ2aWFwYXJpbmZvLT4KKwkJCQkJICAgIGNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yLAorCQkJCQkgICAgIHJlZ192YWwpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpYWZiX2luaXRfcHJvYyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZpYWZiX2VudHJ5KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisJdmlhZmJfZW50cnkgPSBwcm9jX21rZGlyKCJ2aWFmYiIsIE5VTEwpOworCWlmICh2aWFmYl9lbnRyeSkgeworCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkdnAwIiwgMCwgdmlhZmJfZW50cnkpOworCQlpZiAoZW50cnkpIHsKKwkJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJZW50cnktPnJlYWRfcHJvYyA9IHZpYWZiX2R2cDBfcHJvY19yZWFkOworCQkJZW50cnktPndyaXRlX3Byb2MgPSB2aWFmYl9kdnAwX3Byb2Nfd3JpdGU7CisJCX0KKwkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiZHZwMSIsIDAsIHZpYWZiX2VudHJ5KTsKKwkJaWYgKGVudHJ5KSB7CisJCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJCWVudHJ5LT5yZWFkX3Byb2MgPSB2aWFmYl9kdnAxX3Byb2NfcmVhZDsKKwkJCWVudHJ5LT53cml0ZV9wcm9jID0gdmlhZmJfZHZwMV9wcm9jX3dyaXRlOworCQl9CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImRmcGgiLCAwLCB2aWFmYl9lbnRyeSk7CisJCWlmIChlbnRyeSkgeworCQkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJCQllbnRyeS0+cmVhZF9wcm9jID0gdmlhZmJfZGZwaF9wcm9jX3JlYWQ7CisJCQllbnRyeS0+d3JpdGVfcHJvYyA9IHZpYWZiX2RmcGhfcHJvY193cml0ZTsKKwkJfQorCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkZnBsIiwgMCwgdmlhZmJfZW50cnkpOworCQlpZiAoZW50cnkpIHsKKwkJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJZW50cnktPnJlYWRfcHJvYyA9IHZpYWZiX2RmcGxfcHJvY19yZWFkOworCQkJZW50cnktPndyaXRlX3Byb2MgPSB2aWFmYl9kZnBsX3Byb2Nfd3JpdGU7CisJCX0KKwkJaWYgKFZUMTYzNl9MVkRTID09IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uCisJCQlsdmRzX2NoaXBfbmFtZSB8fCBWVDE2MzZfTFZEUyA9PQorCQkgICAgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mbzIubHZkc19jaGlwX25hbWUpIHsKKwkJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInZ0MTYzNiIsIDAsIHZpYWZiX2VudHJ5KTsKKwkJCWlmIChlbnRyeSkgeworCQkJCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJCWVudHJ5LT5yZWFkX3Byb2MgPSB2aWFmYl92dDE2MzZfcHJvY19yZWFkOworCQkJCWVudHJ5LT53cml0ZV9wcm9jID0gdmlhZmJfdnQxNjM2X3Byb2Nfd3JpdGU7CisJCQl9CisJCX0KKworCX0KK30KK3N0YXRpYyB2b2lkIHZpYWZiX3JlbW92ZV9wcm9jKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdmlhZmJfZW50cnkpCit7CisJLyogbm8gcHJvYmxlbSBpZiBpdCB3YXMgbm90IHJlZ2lzdGVyZWQgKi8KKwlyZW1vdmVfcHJvY19lbnRyeSgiZHZwMCIsIHZpYWZiX2VudHJ5KTsvKiBwYXJlbnQgZGlyICovCisJcmVtb3ZlX3Byb2NfZW50cnkoImR2cDEiLCB2aWFmYl9lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRmcGgiLCB2aWFmYl9lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRmcGwiLCB2aWFmYl9lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoInZ0MTYzNiIsIHZpYWZiX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgidnQxNjI1IiwgdmlhZmJfZW50cnkpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfcGNpX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfeHJlcywgZGVmYXVsdF95cmVzOworCWNoYXIgKnRtcGMsICp0bXBtOworCWNoYXIgKnRtcGNfc2VjLCAqdG1wbV9zZWM7CisJaW50IHZtb2RlX2luZGV4OworCXUzMiB0bWRzX2xlbmd0aCwgbHZkc19sZW5ndGgsIGNydF9sZW5ndGgsIGNoaXBfbGVuZ3RoLCB2aWFmYl9wYXJfbGVuZ3RoOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAiVklBRkIgUENJIFByb2JlISFcbiIpOworCisJdmlhZmJfcGFyX2xlbmd0aCA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgdmlhZmJfcGFyKSwgQklUU19QRVJfTE9ORy84KTsKKwl0bWRzX2xlbmd0aCA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgdG1kc19zZXR0aW5nX2luZm9ybWF0aW9uKSwKKwkJQklUU19QRVJfTE9ORy84KTsKKwlsdmRzX2xlbmd0aCA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uKSwKKwkJQklUU19QRVJfTE9ORy84KTsKKwljcnRfbGVuZ3RoID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24pLAorCQlCSVRTX1BFUl9MT05HLzgpOworCWNoaXBfbGVuZ3RoID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBjaGlwX2luZm9ybWF0aW9uKSwgQklUU19QRVJfTE9ORy84KTsKKworCS8qIEFsbG9jYXRlIGZiX2luZm8gYW5kICoqKl9wYXIgaGVyZSwgYWxzbyBpbmNsdWRpbmcgc29tZSBvdGhlciBuZWVkZWQKKwkgKiB2YXJpYWJsZXMKKwkqLworCXZpYWZiaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHZpYWZiX3Bhcl9sZW5ndGggKyAyICogbHZkc19sZW5ndGggKworCXRtZHNfbGVuZ3RoICsgY3J0X2xlbmd0aCArIGNoaXBfbGVuZ3RoLCBOVUxMKTsKKwlpZiAoIXZpYWZiaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdmlhZmJfaW5mby5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2aWFwYXJpbmZvID0gKHN0cnVjdCB2aWFmYl9wYXIgKil2aWFmYmluZm8tPnBhcjsKKwl2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mbyA9IChzdHJ1Y3QgdG1kc19zZXR0aW5nX2luZm9ybWF0aW9uICopCisJCSgodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvICsgdmlhZmJfcGFyX2xlbmd0aCk7CisJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8gPSAoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqKQorCQkoKHVuc2lnbmVkIGxvbmcpdmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8gKyB0bWRzX2xlbmd0aCk7CisJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yID0gKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKikKKwkJKCh1bnNpZ25lZCBsb25nKXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvICsgbHZkc19sZW5ndGgpOworCXZpYXBhcmluZm8tPmNydF9zZXR0aW5nX2luZm8gPSAoc3RydWN0IGNydF9zZXR0aW5nX2luZm9ybWF0aW9uICopCisJCSgodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzIgKyBsdmRzX2xlbmd0aCk7CisJdmlhcGFyaW5mby0+Y2hpcF9pbmZvID0gKHN0cnVjdCBjaGlwX2luZm9ybWF0aW9uICopCisJCSgodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvLT5jcnRfc2V0dGluZ19pbmZvICsgY3J0X2xlbmd0aCk7CisKKwlpZiAodmlhZmJfZHVhbF9mYikKKwkJdmlhZmJfU0FNTV9PTiA9IDE7CisJcGFyc2VfYWN0aXZlX2RldigpOworCXBhcnNlX3ZpZGVvX2RldigpOworCXBhcnNlX2xjZF9wb3J0KCk7CisJcGFyc2VfZHZpX3BvcnQoKTsKKworCS8qIGZvciBkdWFsLWZiIG11c3QgdmlhZmJfU0FNTV9PTj0xIGFuZCB2aWFmYl9kdWFsX2ZiPTEgKi8KKwlpZiAoIXZpYWZiX1NBTU1fT04pCisJCXZpYWZiX2R1YWxfZmIgPSAwOworCisJLyogU2V0IHVwIEkyQyBidXMgc3R1ZmYgKi8KKwl2aWFmYl9jcmVhdGVfaTJjX2J1cyh2aWFwYXJpbmZvKTsKKworCXZpYWZiX2luaXRfY2hpcF9pbmZvKCk7CisJdmlhZmJfZ2V0X2ZiX2luZm8oJnZpYXBhcmluZm8tPmZibWVtLCAmdmlhcGFyaW5mby0+bWVtc2l6ZSk7CisJdmlhcGFyaW5mby0+ZmJtZW1fZnJlZSA9IHZpYXBhcmluZm8tPm1lbXNpemU7CisJdmlhcGFyaW5mby0+ZmJtZW1fdXNlZCA9IDA7CisJdmlhcGFyaW5mby0+ZmJtZW1fdmlydCA9IGlvcmVtYXBfbm9jYWNoZSh2aWFwYXJpbmZvLT5mYm1lbSwKKwkJdmlhcGFyaW5mby0+bWVtc2l6ZSk7CisJdmlhZmJpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyICopdmlhcGFyaW5mby0+ZmJtZW1fdmlydDsKKworCWlmICghdmlhcGFyaW5mby0+ZmJtZW1fdmlydCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl2aWFmYl9nZXRfbW1pb19pbmZvKCZ2aWFwYXJpbmZvLT5tbWlvX2Jhc2UsICZ2aWFwYXJpbmZvLT5tbWlvX2xlbik7CisJdmlhcGFyaW5mby0+aW9fdmlydCA9IGlvcmVtYXBfbm9jYWNoZSh2aWFwYXJpbmZvLT5tbWlvX2Jhc2UsCisJCXZpYXBhcmluZm8tPm1taW9fbGVuKTsKKworCXZpYWZiaW5mby0+bm9kZSA9IDA7CisJdmlhZmJpbmZvLT5mYm9wcyA9ICZ2aWFmYl9vcHM7CisJdmlhZmJpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKKworCXZpYWZiaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsOworCWlmICh2aWFmYl9hY2NlbCkgeworCQl2aWFmYl9pbml0X2FjY2VsKCk7CisJCXZpYWZiX2luaXRfMmRfZW5naW5lKCk7CisJCXZpYWZiX2h3X2N1cnNvcl9pbml0KCk7CisJfQorCisJaWYgKHZpYWZiX3NlY29uZF9zaXplICYmICh2aWFmYl9zZWNvbmRfc2l6ZSA8IDgpKSB7CisJCXZpYWZiX3NlY29uZF9vZmZzZXQgPSB2aWFwYXJpbmZvLT5mYm1lbV9mcmVlIC0KKwkJCXZpYWZiX3NlY29uZF9zaXplICogMTAyNCAqIDEwMjQ7CisJfSBlbHNlIHsKKwkJdmlhZmJfc2Vjb25kX3NpemUgPSA4OworCQl2aWFmYl9zZWNvbmRfb2Zmc2V0ID0gdmlhcGFyaW5mby0+ZmJtZW1fZnJlZSAtCisJCQl2aWFmYl9zZWNvbmRfc2l6ZSAqIDEwMjQgKiAxMDI0OworCX0KKworCXZpYWZiX0ZCX01NID0gdmlhcGFyaW5mby0+ZmJtZW1fdmlydDsKKwl0bXBtID0gdmlhZmJfbW9kZTsKKwl0bXBjID0gc3Ryc2VwKCZ0bXBtLCAieCIpOworCXN0cmljdF9zdHJ0b3VsKHRtcGMsIDAsICh1bnNpZ25lZCBsb25nICopJmRlZmF1bHRfeHJlcyk7CisJc3RyaWN0X3N0cnRvdWwodG1wbSwgMCwgKHVuc2lnbmVkIGxvbmcgKikmZGVmYXVsdF95cmVzKTsKKworCXZtb2RlX2luZGV4ID0gdmlhZmJfZ2V0X21vZGVfaW5kZXgoZGVmYXVsdF94cmVzLCBkZWZhdWx0X3lyZXMsIDApOworCURFQlVHX01TRyhLRVJOX0lORk8gIjAtPmluZGV4PSVkXG4iLCB2bW9kZV9pbmRleCk7CisKKwlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKSB7CisJCWlmIChzdHJjbXAodmlhZmJfbW9kZSwgdmlhZmJfbW9kZTEpKSB7CisJCQl0bXBtX3NlYyA9IHZpYWZiX21vZGUxOworCQkJdG1wY19zZWMgPSBzdHJzZXAoJnRtcG1fc2VjLCAieCIpOworCQkJc3RyaWN0X3N0cnRvdWwodG1wY19zZWMsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfc2Vjb25kX3hyZXMpOworCQkJc3RyaWN0X3N0cnRvdWwodG1wbV9zZWMsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfc2Vjb25kX3lyZXMpOworCQl9IGVsc2UgeworCQkJdmlhZmJfc2Vjb25kX3hyZXMgPSBkZWZhdWx0X3hyZXM7CisJCQl2aWFmYl9zZWNvbmRfeXJlcyA9IGRlZmF1bHRfeXJlczsKKwkJfQorCQlpZiAoMCA9PSB2aWFmYl9zZWNvbmRfdmlydHVhbF94cmVzKSB7CisJCQlzd2l0Y2ggKHZpYWZiX3NlY29uZF94cmVzKSB7CisJCQljYXNlIDE0MDA6CisJCQkJdmlhZmJfc2Vjb25kX3ZpcnR1YWxfeHJlcyA9IDE0MDg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZpYWZiX3NlY29uZF92aXJ0dWFsX3hyZXMgPSB2aWFmYl9zZWNvbmRfeHJlczsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoMCA9PSB2aWFmYl9zZWNvbmRfdmlydHVhbF95cmVzKQorCQkJdmlhZmJfc2Vjb25kX3ZpcnR1YWxfeXJlcyA9IHZpYWZiX3NlY29uZF95cmVzOworCX0KKworCXN3aXRjaCAodmlhZmJfYnBwKSB7CisJY2FzZSAwIC4uLiA4OgorCQl2aWFmYl9icHAgPSA4OworCQlicmVhazsKKwljYXNlIDkgLi4uIDE2OgorCQl2aWFmYl9icHAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxNyAuLi4gMzI6CisJCXZpYWZiX2JwcCA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2aWFmYl9icHAgPSA4OworCX0KKwlkZWZhdWx0X3Zhci54cmVzID0gZGVmYXVsdF94cmVzOworCWRlZmF1bHRfdmFyLnlyZXMgPSBkZWZhdWx0X3lyZXM7CisJc3dpdGNoIChkZWZhdWx0X3hyZXMpIHsKKwljYXNlIDE0MDA6CisJCWRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IDE0MDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IGRlZmF1bHRfeHJlczsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IGRlZmF1bHRfeXJlczsKKwlkZWZhdWx0X3Zhci5iaXRzX3Blcl9waXhlbCA9IHZpYWZiX2JwcDsKKwlpZiAoZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPT0gMTUpCisJCWRlZmF1bHRfdmFyLmJpdHNfcGVyX3BpeGVsID0gMTY7CisJZGVmYXVsdF92YXIucGl4Y2xvY2sgPQorCSAgICB2aWFmYl9nZXRfcGl4Y2xvY2soZGVmYXVsdF94cmVzLCBkZWZhdWx0X3lyZXMsIHZpYWZiX3JlZnJlc2gpOworCWRlZmF1bHRfdmFyLmxlZnRfbWFyZ2luID0gKGRlZmF1bHRfeHJlcyA+PiAzKSAmIDB4Zjg7CisJZGVmYXVsdF92YXIucmlnaHRfbWFyZ2luID0gMzI7CisJZGVmYXVsdF92YXIudXBwZXJfbWFyZ2luID0gMTY7CisJZGVmYXVsdF92YXIubG93ZXJfbWFyZ2luID0gNDsKKwlkZWZhdWx0X3Zhci5oc3luY19sZW4gPSBkZWZhdWx0X3Zhci5sZWZ0X21hcmdpbjsKKwlkZWZhdWx0X3Zhci52c3luY19sZW4gPSA0OworCWRlZmF1bHRfdmFyLmFjY2VsX2ZsYWdzID0gMDsKKworCWlmICh2aWFmYl9hY2NlbCkgeworCQl2aWFmYmluZm8tPmZsYWdzIHw9CisJCSAgICAoRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfCBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCB8CisJCSAgICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUKTsKKwkJZGVmYXVsdF92YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CisJfSBlbHNlCisJCXZpYWZiaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisKKwlpZiAodmlhZmJfZHVhbF9mYikgeworCQl2aWFmYmluZm8xID0gZnJhbWVidWZmZXJfYWxsb2ModmlhZmJfcGFyX2xlbmd0aCwgTlVMTCk7CisJCWlmICghdmlhZmJpbmZvMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkiYWxsb2NhdGUgdGhlIHNlY29uZCBmcmFtZWJ1ZmZlciBzdHJ1Y3QgZXJyb3JcbiIpOworCQkJZnJhbWVidWZmZXJfcmVsZWFzZSh2aWFmYmluZm8pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdmlhcGFyaW5mbzEgPSB2aWFmYmluZm8xLT5wYXI7CisJCW1lbWNweSh2aWFwYXJpbmZvMSwgdmlhcGFyaW5mbywgdmlhZmJfcGFyX2xlbmd0aCk7CisJCXZpYXBhcmluZm8xLT5tZW1zaXplID0gdmlhcGFyaW5mby0+bWVtc2l6ZSAtCisJCQl2aWFmYl9zZWNvbmRfb2Zmc2V0OworCQl2aWFwYXJpbmZvLT5tZW1zaXplID0gdmlhZmJfc2Vjb25kX29mZnNldDsKKwkJdmlhcGFyaW5mbzEtPmZibWVtX3ZpcnQgPSB2aWFwYXJpbmZvLT5mYm1lbV92aXJ0ICsKKwkJCXZpYWZiX3NlY29uZF9vZmZzZXQ7CisJCXZpYXBhcmluZm8xLT5mYm1lbSA9IHZpYXBhcmluZm8tPmZibWVtICsgdmlhZmJfc2Vjb25kX29mZnNldDsKKworCQl2aWFwYXJpbmZvMS0+ZmJtZW1fdXNlZCA9IHZpYXBhcmluZm8tPmZibWVtX3VzZWQ7CisJCXZpYXBhcmluZm8xLT5mYm1lbV9mcmVlID0gdmlhcGFyaW5mbzEtPm1lbXNpemUgLQorCQkJdmlhcGFyaW5mbzEtPmZibWVtX3VzZWQ7CisJCXZpYXBhcmluZm8tPmZibWVtX2ZyZWUgPSB2aWFwYXJpbmZvLT5tZW1zaXplOworCQl2aWFwYXJpbmZvLT5mYm1lbV91c2VkID0gMDsKKwkJaWYgKHZpYWZiX2FjY2VsKSB7CisJCQl2aWFwYXJpbmZvMS0+Y3Vyc29yX3N0YXJ0ID0KKwkJCSAgICB2aWFwYXJpbmZvLT5jdXJzb3Jfc3RhcnQgLSB2aWFmYl9zZWNvbmRfb2Zmc2V0OworCQkJdmlhcGFyaW5mbzEtPlZRX3N0YXJ0ID0gdmlhcGFyaW5mby0+VlFfc3RhcnQgLQorCQkJCXZpYWZiX3NlY29uZF9vZmZzZXQ7CisJCQl2aWFwYXJpbmZvMS0+VlFfZW5kID0gdmlhcGFyaW5mby0+VlFfZW5kIC0KKwkJCQl2aWFmYl9zZWNvbmRfb2Zmc2V0OworCQl9CisKKwkJbWVtY3B5KHZpYWZiaW5mbzEsIHZpYWZiaW5mbywgc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSk7CisJCXZpYWZiaW5mbzEtPnNjcmVlbl9iYXNlID0gdmlhZmJpbmZvLT5zY3JlZW5fYmFzZSArCisJCQl2aWFmYl9zZWNvbmRfb2Zmc2V0OworCQl2aWFmYmluZm8xLT5maXguc21lbV9zdGFydCA9IHZpYXBhcmluZm8xLT5mYm1lbTsKKwkJdmlhZmJpbmZvMS0+Zml4LnNtZW1fbGVuID0gdmlhcGFyaW5mbzEtPmZibWVtX2ZyZWU7CisKKwkJZGVmYXVsdF92YXIueHJlcyA9IHZpYWZiX3NlY29uZF94cmVzOworCQlkZWZhdWx0X3Zhci55cmVzID0gdmlhZmJfc2Vjb25kX3lyZXM7CisJCWRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IHZpYWZiX3NlY29uZF92aXJ0dWFsX3hyZXM7CisJCWRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9IHZpYWZiX3NlY29uZF92aXJ0dWFsX3lyZXM7CisJCWlmICh2aWFmYl9icHAxICE9IHZpYWZiX2JwcCkKKwkJCXZpYWZiX2JwcDEgPSB2aWFmYl9icHA7CisJCWRlZmF1bHRfdmFyLmJpdHNfcGVyX3BpeGVsID0gdmlhZmJfYnBwMTsKKwkJZGVmYXVsdF92YXIucGl4Y2xvY2sgPQorCQkgICAgdmlhZmJfZ2V0X3BpeGNsb2NrKHZpYWZiX3NlY29uZF94cmVzLCB2aWFmYl9zZWNvbmRfeXJlcywKKwkJICAgIHZpYWZiX3JlZnJlc2gpOworCQlkZWZhdWx0X3Zhci5sZWZ0X21hcmdpbiA9ICh2aWFmYl9zZWNvbmRfeHJlcyA+PiAzKSAmIDB4Zjg7CisJCWRlZmF1bHRfdmFyLnJpZ2h0X21hcmdpbiA9IDMyOworCQlkZWZhdWx0X3Zhci51cHBlcl9tYXJnaW4gPSAxNjsKKwkJZGVmYXVsdF92YXIubG93ZXJfbWFyZ2luID0gNDsKKwkJZGVmYXVsdF92YXIuaHN5bmNfbGVuID0gZGVmYXVsdF92YXIubGVmdF9tYXJnaW47CisJCWRlZmF1bHRfdmFyLnZzeW5jX2xlbiA9IDQ7CisKKwkJdmlhZmJfc2V0dXBfZml4aW5mbygmdmlhZmJpbmZvMS0+Zml4LCB2aWFwYXJpbmZvMSk7CisJCXZpYWZiX2NoZWNrX3ZhcigmZGVmYXVsdF92YXIsIHZpYWZiaW5mbzEpOworCQl2aWFmYmluZm8xLT52YXIgPSBkZWZhdWx0X3ZhcjsKKwkJdmlhZmJfdXBkYXRlX3ZpYWZiX3Bhcih2aWFmYmluZm8pOworCQl2aWFmYl91cGRhdGVfZml4KCZ2aWFmYmluZm8xLT5maXgsIHZpYWZiaW5mbzEpOworCX0KKworCXZpYWZiX3NldHVwX2ZpeGluZm8oJnZpYWZiaW5mby0+Zml4LCB2aWFwYXJpbmZvKTsKKwl2aWFmYl9jaGVja192YXIoJmRlZmF1bHRfdmFyLCB2aWFmYmluZm8pOworCXZpYWZiaW5mby0+dmFyID0gZGVmYXVsdF92YXI7CisJdmlhZmJfdXBkYXRlX3ZpYWZiX3Bhcih2aWFmYmluZm8pOworCXZpYWZiX3VwZGF0ZV9maXgoJnZpYWZiaW5mby0+Zml4LCB2aWFmYmluZm8pOworCWRlZmF1bHRfdmFyLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOworCWZiX2FsbG9jX2NtYXAoJnZpYWZiaW5mby0+Y21hcCwgMjU2LCAwKTsKKworCWlmICh2aWFmYl9kdWFsX2ZiICYmICh2aWFmYl9wcmltYXJ5X2RldiA9PSBMQ0RfRGV2aWNlKQorCSAgICAmJiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lID09IFVOSUNIUk9NRV9DTEUyNjYpKSB7CisJCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcih2aWFmYmluZm8xKSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHZpYWZiaW5mbykgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2aWFmYl9kdWFsX2ZiICYmICgodmlhZmJfcHJpbWFyeV9kZXYgIT0gTENEX0RldmljZSkKKwkJCXx8ICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0KKwkJCVVOSUNIUk9NRV9DTEUyNjYpKSkgeworCQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIodmlhZmJpbmZvMSkgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCURFQlVHX01TRyhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UgJWR4JWQtJWRicHBcbiIsCisJCSAgdmlhZmJpbmZvLT5ub2RlLCB2aWFmYmluZm8tPmZpeC5pZCwgZGVmYXVsdF92YXIueHJlcywKKwkJICBkZWZhdWx0X3Zhci55cmVzLCBkZWZhdWx0X3Zhci5iaXRzX3Blcl9waXhlbCk7CisKKwl2aWFmYl9pbml0X3Byb2ModmlhcGFyaW5mby0+cHJvY19lbnRyeSk7CisJdmlhZmJfaW5pdF9kYWMoSUdBMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcGNpX3JlbW92ZSh2b2lkKQoreworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYV9wY2lfcmVtb3ZlIVxuIik7CisJZmJfZGVhbGxvY19jbWFwKCZ2aWFmYmluZm8tPmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIodmlhZmJpbmZvKTsKKwlpZiAodmlhZmJfZHVhbF9mYikKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcih2aWFmYmluZm8xKTsKKwlpb3VubWFwKCh2b2lkICopdmlhcGFyaW5mby0+ZmJtZW1fdmlydCk7CisJaW91bm1hcCh2aWFwYXJpbmZvLT5pb192aXJ0KTsKKworCXZpYWZiX2RlbGV0ZV9pMmNfYnVzcyh2aWFwYXJpbmZvKTsKKworCWZyYW1lYnVmZmVyX3JlbGVhc2UodmlhZmJpbmZvKTsKKwlpZiAodmlhZmJfZHVhbF9mYikKKwkJZnJhbWVidWZmZXJfcmVsZWFzZSh2aWFmYmluZm8xKTsKKworCXZpYWZiX3JlbW92ZV9wcm9jKHZpYXBhcmluZm8tPnByb2NfZW50cnkpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgdmlhZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdDsKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXR1cCFcbiIpOworCisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfbW9kZTE9IiwgMTIpKQorCQkJdmlhZmJfbW9kZTEgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTIsIEdGUF9LRVJORUwpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX21vZGU9IiwgMTEpKQorCQkJdmlhZmJfbW9kZSA9IGtzdHJkdXAodGhpc19vcHQgKyAxMSwgR0ZQX0tFUk5FTCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnBwMT0iLCAxMSkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDExLCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2JwcDEpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2JwcD0iLCAxMCkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDEwLCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2JwcCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaDE9IiwgMTUpKQorCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxNSwgMCwKKwkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9yZWZyZXNoMSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaD0iLCAxNCkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE0LCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX3JlZnJlc2gpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2xjZF9kc3BfbWV0aG9kPSIsIDIxKSkKKwkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjEsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfbGNkX2RzcF9tZXRob2QpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2xjZF9wYW5lbF9pZD0iLCAxOSkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE5LCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9wYW5lbF9pZCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYWNjZWw9IiwgMTIpKQorCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxMiwgMCwKKwkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9hY2NlbCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfU0FNTV9PTj0iLCAxNCkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE0LCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX1NBTU1fT04pOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2FjdGl2ZV9kZXY9IiwgMTcpKQorCQkJdmlhZmJfYWN0aXZlX2RldiA9IGtzdHJkdXAodGhpc19vcHQgKyAxNywgR0ZQX0tFUk5FTCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAorCQkJInZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0PSIsIDMwKSkKKwkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMzAsIDAsCisJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfc2Vjb25kX3NpemU9IiwgMTgpKQorCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxOCwgMCwKKwkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9zZWNvbmRfc2l6ZSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAorCQkJInZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpPSIsIDI0KSkKKwkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjQsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfcGxhdGZvcm1fZXBpYV9kdmkpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwKKwkJCSJ2aWFmYl9kZXZpY2VfbGNkX2R1YWxlZGdlPSIsIDI2KSkKKwkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjYsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnVzX3dpZHRoPSIsIDE2KSkKKwkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTYsIDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfYnVzX3dpZHRoKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfbW9kZT0iLCAxNSkpCisJCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE1LCAwLAorCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9tb2RlKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl92aWRlb19kZXY9IiwgMTYpKQorCQkJdmlhZmJfdmlkZW9fZGV2ID0ga3N0cmR1cCh0aGlzX29wdCArIDE2LCBHRlBfS0VSTkVMKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcG9ydD0iLCAxNSkpCisJCQl2aWFmYl9sY2RfcG9ydCA9IGtzdHJkdXAodGhpc19vcHQgKyAxNSwgR0ZQX0tFUk5FTCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfZHZpX3BvcnQ9IiwgMTUpKQorCQkJdmlhZmJfZHZpX3BvcnQgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTUsIEdGUF9LRVJORUwpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB2aWFmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbiA9IE5VTEw7CisJaWYgKGZiX2dldF9vcHRpb25zKCJ2aWFmYiIsICZvcHRpb24pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwl2aWFmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTworICAgICAgICJWSUEgR3JhcGhpY3MgSW50ZXJncmF0aW9uIENoaXBzZXQgZnJhbWVidWZmZXIgJWQuJWQgaW5pdGlhbGl6aW5nXG4iLAorCSAgICAgICBWRVJTSU9OX01BSk9SLCBWRVJTSU9OX01JTk9SKTsKKwlyZXR1cm4gdmlhX3BjaV9wcm9iZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlhZmJfZXhpdCh2b2lkKQoreworCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2V4aXQhXG4iKTsKKwl2aWFfcGNpX3JlbW92ZSgpOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyB2aWFmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX29wZW4gPSB2aWFmYl9vcGVuLAorCS5mYl9yZWxlYXNlID0gdmlhZmJfcmVsZWFzZSwKKwkuZmJfY2hlY2tfdmFyID0gdmlhZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gdmlhZmJfc2V0X3BhciwKKwkuZmJfc2V0Y29scmVnID0gdmlhZmJfc2V0Y29scmVnLAorCS5mYl9wYW5fZGlzcGxheSA9IHZpYWZiX3Bhbl9kaXNwbGF5LAorCS5mYl9ibGFuayA9IHZpYWZiX2JsYW5rLAorCS5mYl9maWxscmVjdCA9IHZpYWZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYSA9IHZpYWZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQgPSB2aWFmYl9pbWFnZWJsaXQsCisJLmZiX2N1cnNvciA9IHZpYWZiX2N1cnNvciwKKwkuZmJfaW9jdGwgPSB2aWFmYl9pb2N0bCwKKwkuZmJfc3luYyA9IHZpYWZiX3N5bmMsCisJLmZiX3NldGNtYXAgPSB2aWFmYl9zZXRjbWFwLAorfTsKKworbW9kdWxlX2luaXQodmlhZmJfaW5pdCk7Cittb2R1bGVfZXhpdCh2aWFmYl9leGl0KTsKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtKHZpYWZiX21lbXNpemUsIGludCwgMCk7CisKK21vZHVsZV9wYXJhbSh2aWFmYl9tb2RlLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpYWZiX21vZGUsICJTZXQgcmVzb2x1dGlvbiAoZGVmYXVsdD02NDB4NDgwKSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfbW9kZTEsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfbW9kZTEsICJTZXQgcmVzb2x1dGlvbiAoZGVmYXVsdD02NDB4NDgwKSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfYnBwLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9icHAsICJTZXQgY29sb3IgZGVwdGggKGRlZmF1bHQ9MzJicHApIik7CisKK21vZHVsZV9wYXJhbSh2aWFmYl9icHAxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9icHAxLCAiU2V0IGNvbG9yIGRlcHRoIChkZWZhdWx0PTMyYnBwKSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfcmVmcmVzaCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfcmVmcmVzaCwKKwkiU2V0IENSVCB2aWFmYl9yZWZyZXNoIHJhdGUgKGRlZmF1bHQgPSA2MCkiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX3JlZnJlc2gxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9yZWZyZXNoMSwKKwkiU2V0IENSVCByZWZyZXNoIHJhdGUgKGRlZmF1bHQgPSA2MCkiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2xjZF9wYW5lbF9pZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfbGNkX3BhbmVsX2lkLAorCSJTZXQgRmxhdCBQYW5lbCB0eXBlKERlZmF1bHQ9MTAyNHg3NjgpIik7CisKK21vZHVsZV9wYXJhbSh2aWFmYl9sY2RfZHNwX21ldGhvZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfbGNkX2RzcF9tZXRob2QsCisJIlNldCBGbGF0IFBhbmVsIGRpc3BsYXkgc2NhbGluZyBtZXRob2QuKERlZmF1bHQ9RXhwYW5kc2lvbikiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX1NBTU1fT04sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpYWZiX1NBTU1fT04sCisJIlR1cm4gb24vb2ZmIGZsYWcgb2YgU0FNTShEZWZhdWx0PU9GRikiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2FjY2VsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9hY2NlbCwKKwkiU2V0IDJEIEhhcmR3YXJlIEFjY2VsZXJhdGlvbi4oRGVmYXVsdCA9IE9GRikiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2FjdGl2ZV9kZXYsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfYWN0aXZlX2RldiwgIlNwZWNpZnkgYWN0aXZlIGRldmljZXMuIik7CisKK21vZHVsZV9wYXJhbSh2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQsCisJIkRpc3BsYXkgSGFyZHdhcmUgTGF5b3V0IChMQ0QgT25seSwgRFZJIE9ubHkuLi4sZXRjKSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfc2Vjb25kX3NpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpYWZiX3NlY29uZF9zaXplLAorCSJTZXQgc2Vjb25kYXJ5IGRldmljZSBtZW1vcnkgc2l6ZSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfZHVhbF9mYiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfZHVhbF9mYiwKKwkiVHVybiBvbi9vZmYgZmxhZyBvZiBkdWFsIGZyYW1lYnVmZmVyIGRldmljZXMuKERlZmF1bHQgPSBPRkYpIik7CisKK21vZHVsZV9wYXJhbSh2aWFmYl9wbGF0Zm9ybV9lcGlhX2R2aSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfcGxhdGZvcm1fZXBpYV9kdmksCisJIlR1cm4gb24vb2ZmIGZsYWcgb2YgRFZJIGRldmljZXMgb24gRVBJQSBib2FyZC4oRGVmYXVsdCA9IE9GRikiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2RldmljZV9sY2RfZHVhbGVkZ2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpYWZiX2RldmljZV9sY2RfZHVhbGVkZ2UsCisJIlR1cm4gb24vb2ZmIGZsYWcgb2YgZHVhbCBlZGdlIHBhbmVsLihEZWZhdWx0ID0gT0ZGKSIpOworCittb2R1bGVfcGFyYW0odmlhZmJfYnVzX3dpZHRoLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9idXNfd2lkdGgsCisJIlNldCBidXMgd2lkdGggb2YgcGFuZWwuKERlZmF1bHQgPSAxMikiKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2xjZF9tb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh2aWFmYl9sY2RfbW9kZSwKKwkiU2V0IEZsYXQgUGFuZWwgbW9kZShEZWZhdWx0PU9QRU5MREkpIik7CisKK21vZHVsZV9wYXJhbSh2aWFmYl92aWRlb19kZXYsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfdmlkZW9fZGV2LCAiU3BlY2lmeSB2aWRlbyBkZXZpY2VzLiIpOworCittb2R1bGVfcGFyYW0odmlhZmJfbGNkX3BvcnQsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmlhZmJfbGNkX3BvcnQsICJTcGVjaWZ5IExDRCBvdXRwdXQgcG9ydC4iKTsKKworbW9kdWxlX3BhcmFtKHZpYWZiX2R2aV9wb3J0LCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpYWZiX2R2aV9wb3J0LCAiU3BlY2lmeSBEVkkgb3V0cHV0IHBvcnQuIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuaCBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxNThlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19WSUFGQkRFVl9IX18KKyNkZWZpbmUgX19WSUFGQkRFVl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSAiaW9jdGwuaCIKKyNpbmNsdWRlICJzaGFyZS5oIgorI2luY2x1ZGUgImNoaXAuaCIKKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgInZpYV9pMmMuaCIKKworI2RlZmluZSBWRVJTSU9OX01BSk9SICAgICAgIDIKKyNkZWZpbmUgVkVSU0lPTl9LRVJORUwgICAgICA2CS8qIEZvciBrZXJuZWwgMi42ICovCisKKyNkZWZpbmUgVkVSU0lPTl9PUyAgICAgICAgICAwCS8qIDA6IGZvciAzMiBiaXRzIE9TLCAxOiBmb3IgNjQgYml0cyBPUyAqLworI2RlZmluZSBWRVJTSU9OX01JTk9SICAgICAgIDQKKworc3RydWN0IHZpYWZiX3BhciB7CisJaW50IGJwcDsKKwlpbnQgaHJlczsKKwlpbnQgdnJlczsKKwlpbnQgbGluZWxlbmd0aDsKKwl1MzIgeG9mZnNldDsKKwl1MzIgeW9mZnNldDsKKworCXZvaWQgX19pb21lbSAqZmJtZW1fdmlydDsJLypmcmFtZWJ1ZmZlciB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICppb192aXJ0OwkvKmlvc3BhY2UgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBmYm1lbTsJLypmcmFtZWJ1ZmZlciBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBtZW1zaXplOwkvKnNpemUgb2YgZmJtZW0gKi8KKwl1bnNpZ25lZCBpbnQgaW87CS8qaW8gc3BhY2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwkvKm1taW8gYmFzZSBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBtbWlvX2xlbjsJLyptbWlvIGJhc2UgbGVuZ3RoICovCisJdTMyIGZibWVtX2ZyZWU7CQkvKiBGcmVlIEZCIG1lbW9yeSAqLworCXUzMiBmYm1lbV91c2VkOwkJLyogVXNlIEZCIG1lbW9yeSBzaXplICovCisJdTMyIGN1cnNvcl9zdGFydDsJLyogQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgKi8KKwl1MzIgVlFfc3RhcnQ7CQkvKiBWaXJ0dWFsIFF1ZXVlIFN0YXJ0IEFkZHJlc3MgKi8KKwl1MzIgVlFfZW5kOwkJLyogVmlydHVhbCBRdWV1ZSBFbmQgQWRkcmVzcyAqLworCXUzMiBpZ2FfcGF0aDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50cnk7CS8qdmlhZmIgcHJvYyBlbnRyeSAqLworCXU4IGR1b3ZpZXc7CQkvKklzIHdvcmtpbmcgaW4gZHVvdmlldyBtb2RlPyAqLworCisJLyogSTJDIHN0dWZmICovCisJc3RydWN0IHZpYV9pMmNfc3R1ZmYgaTJjX3N0dWZmOworCisJLyogQWxsIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIG5lZWRlZCB0byBzZXQgZW5naW5lICovCisJc3RydWN0IHRtZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqdG1kc19zZXR0aW5nX2luZm87CisJc3RydWN0IGNydF9zZXR0aW5nX2luZm9ybWF0aW9uICpjcnRfc2V0dGluZ19pbmZvOworCXN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKmx2ZHNfc2V0dGluZ19pbmZvOworCXN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKmx2ZHNfc2V0dGluZ19pbmZvMjsKKwlzdHJ1Y3QgY2hpcF9pbmZvcm1hdGlvbiAqY2hpcF9pbmZvOworCisJLyogc29tZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHZpZGVvIHBsYXlpbmcgKi8KKwlpbnQgdmlkZW9fb25fY3J0OworCWludCB2aWRlb19vbl9kdmk7CisJaW50IHZpZGVvX29uX2xjZDsKKworfTsKK3N0cnVjdCB2aWFmYl9tb2RlaW5mbyB7CisJdTMyIHhyZXM7CisJdTMyIHlyZXM7CisJaW50IG1vZGVfaW5kZXg7CisJY2hhciAqbW9kZV9yZXM7Cit9OworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfdmlydHVhbF95cmVzOworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfdmlydHVhbF94cmVzOworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfb2Zmc2V0OworZXh0ZXJuIGludCB2aWFmYl9zZWNvbmRfc2l6ZTsKK2V4dGVybiBpbnQgdmlhZmJfU0FNTV9PTjsKK2V4dGVybiBpbnQgdmlhZmJfZHVhbF9mYjsKK2V4dGVybiBpbnQgdmlhZmJfTENEMl9PTjsKK2V4dGVybiBpbnQgdmlhZmJfTENEX09OOworZXh0ZXJuIGludCB2aWFmYl9EVklfT047CitleHRlcm4gaW50IHZpYWZiX2FjY2VsOworZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnOworZXh0ZXJuIGludCB2aWFmYl9tZW1zaXplOworCitleHRlcm4gaW50IHN0cmljdF9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwKKwl1bnNpZ25lZCBsb25nICpyZXMpOworCit2b2lkIHZpYWZiX21lbW9yeV9waXRjaF9wYXRjaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Cit2b2lkIHZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgcmVmcmVzaCwKKwkJCSAgaW50IG1vZGVfaW5kZXgpOworaW50IHZpYWZiX2dldF9tb2RlX2luZGV4KGludCBocmVzLCBpbnQgdnJlcywgaW50IGZsYWcpOwordTggdmlhZmJfZ3Bpb19pMmNfcmVhZF9sdmRzKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkqcGx2ZHNfc2V0dGluZ19pbmZvLCBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCisJKnBsdmRzX2NoaXBfaW5mbywgdTggaW5kZXgpOwordm9pZCB2aWFmYl9ncGlvX2kyY193cml0ZV9tYXNrX2x2ZHMoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJICAgICAgKnBsdmRzX3NldHRpbmdfaW5mbywgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbgorCQkJICAgICAgKnBsdmRzX2NoaXBfaW5mbywgc3RydWN0IElPREFUQSBpb19kYXRhKTsKKyNlbmRpZiAvKiBfX1ZJQUZCREVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkY2Y1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwOCBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA4IFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4KKyAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UuU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCitzdHJ1Y3QgcmVzX21hcF9yZWZyZXNoIHJlc19tYXBfcmVmcmVzaF90YmxbXSA9IHsKKy8qaHJlcywgdnJlcywgdmNsb2NrLCB2bW9kZV9yZWZyZXNoKi8KKwl7NDgwLCA2NDAsIFJFU180ODBYNjQwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7NjQwLCA0ODAsIFJFU182NDBYNDgwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7NjQwLCA0ODAsIFJFU182NDBYNDgwXzc1SFpfUElYQ0xPQ0ssIDc1fSwKKwl7NjQwLCA0ODAsIFJFU182NDBYNDgwXzg1SFpfUElYQ0xPQ0ssIDg1fSwKKwl7NjQwLCA0ODAsIFJFU182NDBYNDgwXzEwMEhaX1BJWENMT0NLLCAxMDB9LAorCXs2NDAsIDQ4MCwgUkVTXzY0MFg0ODBfMTIwSFpfUElYQ0xPQ0ssIDEyMH0sCisJezcyMCwgNDgwLCBSRVNfNzIwWDQ4MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezcyMCwgNTc2LCBSRVNfNzIwWDU3Nl82MEhaX1BJWENMT0NLLCA2MH0sCisJezgwMCwgNDgwLCBSRVNfODAwWDQ4MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezgwMCwgNjAwLCBSRVNfODAwWDYwMF82MEhaX1BJWENMT0NLLCA2MH0sCisJezgwMCwgNjAwLCBSRVNfODAwWDYwMF83NUhaX1BJWENMT0NLLCA3NX0sCisJezgwMCwgNjAwLCBSRVNfODAwWDYwMF84NUhaX1BJWENMT0NLLCA4NX0sCisJezgwMCwgNjAwLCBSRVNfODAwWDYwMF8xMDBIWl9QSVhDTE9DSywgMTAwfSwKKwl7ODAwLCA2MDAsIFJFU184MDBYNjAwXzEyMEhaX1BJWENMT0NLLCAxMjB9LAorCXs4NDgsIDQ4MCwgUkVTXzg0OFg0ODBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXs4NTYsIDQ4MCwgUkVTXzg1Nlg0ODBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMDI0LCA1MTIsIFJFU18xMDI0WDUxMl82MEhaX1BJWENMT0NLLCA2MH0sCisJezEwMjQsIDYwMCwgUkVTXzEwMjRYNjAwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTAyNCwgNzY4LCBSRVNfMTAyNFg3NjhfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMDI0LCA3NjgsIFJFU18xMDI0WDc2OF83NUhaX1BJWENMT0NLLCA3NX0sCisJezEwMjQsIDc2OCwgUkVTXzEwMjRYNzY4Xzg1SFpfUElYQ0xPQ0ssIDg1fSwKKwl7MTAyNCwgNzY4LCBSRVNfMTAyNFg3NjhfMTAwSFpfUElYQ0xPQ0ssIDEwMH0sCisvKiAgezExNTIsODY0LCBSRVNfMTE1Mlg4NjRfNzBIWl9QSVhDTE9DSywgIDcwfSwqLworCXsxMTUyLCA4NjQsIFJFU18xMTUyWDg2NF83NUhaX1BJWENMT0NLLCA3NX0sCisJezEyODAsIDc2OCwgUkVTXzEyODBYNzY4XzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTI4MCwgODAwLCBSRVNfMTI4MFg4MDBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMjgwLCA5NjAsIFJFU18xMjgwWDk2MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezEyODAsIDEwMjQsIFJFU18xMjgwWDEwMjRfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMjgwLCAxMDI0LCBSRVNfMTI4MFgxMDI0Xzc1SFpfUElYQ0xPQ0ssIDc1fSwKKwl7MTI4MCwgMTAyNCwgUkVTXzEyODBYNzY4Xzg1SFpfUElYQ0xPQ0ssIDg1fSwKKwl7MTQ0MCwgMTA1MCwgUkVTXzE0NDBYMTA1MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezE2MDAsIDEyMDAsIFJFU18xNjAwWDEyMDBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxNjAwLCAxMjAwLCBSRVNfMTYwMFgxMjAwXzc1SFpfUElYQ0xPQ0ssIDc1fSwKKwl7MTI4MCwgNzIwLCBSRVNfMTI4MFg3MjBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxOTIwLCAxMDgwLCBSRVNfMTkyMFgxMDgwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTQwMCwgMTA1MCwgUkVTXzE0MDBYMTA1MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezE0MDAsIDEwNTAsIFJFU18xNDAwWDEwNTBfNzVIWl9QSVhDTE9DSywgNzV9LAorCXsxMzY4LCA3NjgsIFJFU18xMzY4WDc2OF82MEhaX1BJWENMT0NLLCA2MH0sCisJezk2MCwgNjAwLCBSRVNfOTYwWDYwMF82MEhaX1BJWENMT0NLLCA2MH0sCisJezEwMDAsIDYwMCwgUkVTXzEwMDBYNjAwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTAyNCwgNTc2LCBSRVNfMTAyNFg1NzZfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMDg4LCA2MTIsIFJFU18xMDg4WDYxMl82MEhaX1BJWENMT0NLLCA2MH0sCisJezExNTIsIDcyMCwgUkVTXzExNTJYNzIwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTIwMCwgNzIwLCBSRVNfMTIwMFg3MjBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxMjgwLCA2MDAsIFJFU18xMjgwWDYwMF82MEhaX1BJWENMT0NLLCA2MH0sCisJezEyODAsIDcyMCwgUkVTXzEyODBYNzIwXzUwSFpfUElYQ0xPQ0ssIDUwfSwKKwl7MTI4MCwgNzY4LCBSRVNfMTI4MFg3NjhfNTBIWl9QSVhDTE9DSywgNTB9LAorCXsxMzYwLCA3NjgsIFJFU18xMzYwWDc2OF82MEhaX1BJWENMT0NLLCA2MH0sCisJezEzNjYsIDc2OCwgUkVTXzEzNjZYNzY4XzUwSFpfUElYQ0xPQ0ssIDUwfSwKKwl7MTM2NiwgNzY4LCBSRVNfMTM2Nlg3NjhfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxNDQwLCA5MDAsIFJFU18xNDQwWDkwMF82MEhaX1BJWENMT0NLLCA2MH0sCisJezE0NDAsIDkwMCwgUkVTXzE0NDBYOTAwXzc1SFpfUElYQ0xPQ0ssIDc1fSwKKwl7MTYwMCwgOTAwLCBSRVNfMTYwMFg5MDBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxNjAwLCAxMDI0LCBSRVNfMTYwMFgxMDI0XzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTY4MCwgMTA1MCwgUkVTXzE2ODBYMTA1MF82MEhaX1BJWENMT0NLLCA2MH0sCisJezE2ODAsIDEwNTAsIFJFU18xNjgwWDEwNTBfNzVIWl9QSVhDTE9DSywgNzV9LAorCXsxNzkyLCAxMzQ0LCBSRVNfMTc5MlgxMzQ0XzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTg1NiwgMTM5MiwgUkVTXzE4NTZYMTM5Ml82MEhaX1BJWENMT0NLLCA2MH0sCisJezE5MjAsIDEyMDAsIFJFU18xOTIwWDEyMDBfNjBIWl9QSVhDTE9DSywgNjB9LAorCXsxOTIwLCAxNDQwLCBSRVNfMTkyMFgxNDQwXzYwSFpfUElYQ0xPQ0ssIDYwfSwKKwl7MTkyMCwgMTQ0MCwgUkVTXzE5MjBYMTQ0MF83NUhaX1BJWENMT0NLLCA3NX0sCisJezIwNDgsIDE1MzYsIFJFU18yMDQ4WDE1MzZfNjBIWl9QSVhDTE9DSywgNjB9Cit9OworCitzdHJ1Y3QgaW9fcmVnIENONDAwX01vZGVYcmVnc1tdID0geyB7VklBU1IsIFNSMTAsIDB4RkYsIDB4MDF9LAore1ZJQVNSLCBTUjE1LCAweDAyLCAweDAyfSwKK3tWSUFTUiwgU1IxNiwgMHhCRiwgMHgwOH0sCit7VklBU1IsIFNSMTcsIDB4RkYsIDB4MUZ9LAore1ZJQVNSLCBTUjE4LCAweEZGLCAweDRFfSwKK3tWSUFTUiwgU1IxQSwgMHhGQiwgMHgwOH0sCit7VklBU1IsIFNSMUUsIDB4MEYsIDB4MDF9LAore1ZJQVNSLCBTUjJBLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IwQSwgMHhGRiwgMHgxRX0sCS8qIEN1cnNvciBTdGFydCAgICAgICAgICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSMEIsIDB4RkYsIDB4MDB9LAkvKiBDdXJzb3IgRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjBFLCAweEZGLCAweDAwfSwJLyogQ3Vyc29yIExvY2F0aW9uIEhpZ2ggICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1IwRiwgMHhGRiwgMHgwMH0sCS8qIEN1cnNvciBMb2NhbHRpb24gTG93ICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSMzIsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjMzLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzNCwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSMzUsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjM2LCAweDA4LCAweDAwfSwKK3tWSUFDUiwgQ1I2MiwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgICovCit7VklBQ1IsIENSNjMsIDB4RkYsIDB4MDB9LAkvKiBTZWNvbmRhcnkgRGlzcGxheSBTdGFydGluZyBBZGRyZXNzICAqLwore1ZJQUNSLCBDUjY0LCAweEZGLCAweDAwfSwJLyogU2Vjb25kYXJ5IERpc3BsYXkgU3RhcnRpbmcgQWRkcmVzcyAgKi8KK3tWSUFDUiwgQ1I2OSwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSNkEsIDB4RkYsIDB4NDB9LAore1ZJQUNSLCBDUjZCLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I2QywgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSN0EsIDB4RkYsIDB4MDF9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMSAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjdCLCAweEZGLCAweDAyfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDIgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I3QywgMHhGRiwgMHgwM30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAzICAgICAgICAgICAgICovCit7VklBQ1IsIENSN0QsIDB4RkYsIDB4MDR9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNCAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjdFLCAweEZGLCAweDA3fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDUgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I3RiwgMHhGRiwgMHgwQX0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA2ICAgICAgICAgICAgICovCit7VklBQ1IsIENSODAsIDB4RkYsIDB4MER9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNyAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjgxLCAweEZGLCAweDEzfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDggICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4MiwgMHhGRiwgMHgxNn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA5ICAgICAgICAgICAgICovCit7VklBQ1IsIENSODMsIDB4RkYsIDB4MTl9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg0LCAweEZGLCAweDFDfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDExICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4NSwgMHhGRiwgMHgxRH0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMiAgICAgICAgICAgICovCit7VklBQ1IsIENSODYsIDB4RkYsIDB4MUV9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTMgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg3LCAweEZGLCAweDFGfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDE0ICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4OCwgMHhGRiwgMHg0MH0sCS8qIExDRCBQYW5lbCBUeXBlICAgICAgICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSODksIDB4RkYsIDB4MDB9LAkvKiBMQ0QgVGltaW5nIENvbnRyb2wgMCAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjhBLCAweEZGLCAweDg4fSwJLyogTENEIFRpbWluZyBDb250cm9sIDEgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4QiwgMHhGRiwgMHg2OX0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDAgICAgICAgICovCit7VklBQ1IsIENSOEMsIDB4RkYsIDB4NTd9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCAxICAgICAgICAqLwore1ZJQUNSLCBDUjhELCAweEZGLCAweDAwfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgMiAgICAgICAgKi8KK3tWSUFDUiwgQ1I4RSwgMHhGRiwgMHg3Qn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDMgICAgICAgICovCit7VklBQ1IsIENSOEYsIDB4RkYsIDB4MDN9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCA0ICAgICAgICAqLwore1ZJQUNSLCBDUjkwLCAweEZGLCAweDMwfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgNSAgICAgICAgKi8KK3tWSUFDUiwgQ1I5MSwgMHhGRiwgMHhBMH0sCS8qIDI0LzEyIGJpdCBMVkRTIERhdGEgb2ZmICAgICAgICAgICAgICovCit7VklBQ1IsIENSOTYsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjk3LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I5OSwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSOUIsIDB4RkYsIDB4MDB9Cit9OworCisvKiBWaWRlbyBNb2RlIFRhYmxlIGZvciBWVDMzMTQgY2hpcHNldCovCisvKiBDb21tb24gU2V0dGluZyBmb3IgVmlkZW8gTW9kZSAqLworc3RydWN0IGlvX3JlZyBDTjcwMF9Nb2RlWHJlZ3NbXSA9IHsge1ZJQVNSLCBTUjEwLCAweEZGLCAweDAxfSwKK3tWSUFTUiwgU1IxNSwgMHgwMiwgMHgwMn0sCit7VklBU1IsIFNSMTYsIDB4QkYsIDB4MDh9LAore1ZJQVNSLCBTUjE3LCAweEZGLCAweDFGfSwKK3tWSUFTUiwgU1IxOCwgMHhGRiwgMHg0RX0sCit7VklBU1IsIFNSMUEsIDB4RkIsIDB4ODJ9LAore1ZJQVNSLCBTUjFCLCAweEZGLCAweEYwfSwKK3tWSUFTUiwgU1IxRiwgMHhGRiwgMHgwMH0sCit7VklBU1IsIFNSMUUsIDB4RkYsIDB4MDF9LAore1ZJQVNSLCBTUjIyLCAweEZGLCAweDFGfSwKK3tWSUFTUiwgU1IyQSwgMHgwRiwgMHgwMH0sCit7VklBU1IsIFNSMkUsIDB4RkYsIDB4RkZ9LAore1ZJQVNSLCBTUjNGLCAweEZGLCAweEZGfSwKK3tWSUFTUiwgU1I0MCwgMHhGNywgMHgwMH0sCit7VklBU1IsIENSMzAsIDB4RkYsIDB4MDR9LAore1ZJQUNSLCBDUjMyLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzMywgMHg3RiwgMHgwMH0sCit7VklBQ1IsIENSMzQsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjM1LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzNiwgMHhGRiwgMHgzMX0sCit7VklBQ1IsIENSNDEsIDB4RkYsIDB4ODB9LAore1ZJQUNSLCBDUjQyLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I1NSwgMHg4MCwgMHgwMH0sCit7VklBQ1IsIENSNUQsIDB4ODAsIDB4MDB9LAkvKkhvcml6b250YWwgUmV0cmFjZSBTdGFydCBiaXRbMTFdIHNob3VsZCBiZSAwKi8KK3tWSUFDUiwgQ1I2MiwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgKi8KK3tWSUFDUiwgQ1I2MywgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgKi8KK3tWSUFDUiwgQ1I2NCwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgKi8KK3tWSUFDUiwgQ1I2OCwgMHhGRiwgMHg2N30sCS8qIERlZmF1bHQgRklGTyBGb3IgSUdBMiAqLwore1ZJQUNSLCBDUjY5LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I2QSwgMHhGRCwgMHg0MH0sCit7VklBQ1IsIENSNkIsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjZDLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I3NywgMHhGRiwgMHgwMH0sCS8qIExDRCBzY2FsaW5nIEZhY3RvciAqLwore1ZJQUNSLCBDUjc4LCAweEZGLCAweDAwfSwJLyogTENEIHNjYWxpbmcgRmFjdG9yICovCit7VklBQ1IsIENSNzksIDB4RkYsIDB4MDB9LAkvKiBMQ0Qgc2NhbGluZyBGYWN0b3IgKi8KK3tWSUFDUiwgQ1I5RiwgMHgwMywgMHgwMH0sCS8qIExDRCBzY2FsaW5nIEZhY3RvciAqLwore1ZJQUNSLCBDUjdBLCAweEZGLCAweDAxfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEgKi8KK3tWSUFDUiwgQ1I3QiwgMHhGRiwgMHgwMn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAyICovCit7VklBQ1IsIENSN0MsIDB4RkYsIDB4MDN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMyAqLwore1ZJQUNSLCBDUjdELCAweEZGLCAweDA0fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDQgKi8KK3tWSUFDUiwgQ1I3RSwgMHhGRiwgMHgwN30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA1ICovCit7VklBQ1IsIENSN0YsIDB4RkYsIDB4MEF9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNiAqLwore1ZJQUNSLCBDUjgwLCAweEZGLCAweDBEfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDcgKi8KK3tWSUFDUiwgQ1I4MSwgMHhGRiwgMHgxM30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA4ICovCit7VklBQ1IsIENSODIsIDB4RkYsIDB4MTZ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgOSAqLwore1ZJQUNSLCBDUjgzLCAweEZGLCAweDE5fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEwICovCit7VklBQ1IsIENSODQsIDB4RkYsIDB4MUN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTEgKi8KK3tWSUFDUiwgQ1I4NSwgMHhGRiwgMHgxRH0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMiAqLwore1ZJQUNSLCBDUjg2LCAweEZGLCAweDFFfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEzICovCit7VklBQ1IsIENSODcsIDB4RkYsIDB4MUZ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTQgKi8KK3tWSUFDUiwgQ1I4OCwgMHhGRiwgMHg0MH0sCS8qIExDRCBQYW5lbCBUeXBlICovCit7VklBQ1IsIENSODksIDB4RkYsIDB4MDB9LAkvKiBMQ0QgVGltaW5nIENvbnRyb2wgMCAqLwore1ZJQUNSLCBDUjhBLCAweEZGLCAweDg4fSwJLyogTENEIFRpbWluZyBDb250cm9sIDEgKi8KK3tWSUFDUiwgQ1I4QiwgMHhGRiwgMHg1RH0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDAgKi8KK3tWSUFDUiwgQ1I4QywgMHhGRiwgMHgyQn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDEgKi8KK3tWSUFDUiwgQ1I4RCwgMHhGRiwgMHg2Rn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDIgKi8KK3tWSUFDUiwgQ1I4RSwgMHhGRiwgMHgyQn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDMgKi8KK3tWSUFDUiwgQ1I4RiwgMHhGRiwgMHgwMX0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDQgKi8KK3tWSUFDUiwgQ1I5MCwgMHhGRiwgMHgwMX0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDUgKi8KK3tWSUFDUiwgQ1I5MSwgMHhGRiwgMHhBMH0sCS8qIDI0LzEyIGJpdCBMVkRTIERhdGEgb2ZmICovCit7VklBQ1IsIENSOTYsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjk3LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I5OSwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSOUIsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjlELCAweEZGLCAweDgwfSwKK3tWSUFDUiwgQ1I5RSwgMHhGRiwgMHg4MH0KK307CisKK3N0cnVjdCBpb19yZWcgS000MDBfTW9kZVhyZWdzW10gPSB7CisJe1ZJQVNSLCBTUjEwLCAweEZGLCAweDAxfSwJLyogVW5sb2NrIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1IxNiwgMHhGRiwgMHgwOH0sCS8qIERpc3BsYXkgRklGTyB0aHJlc2hvbGQgQ29udHJvbCAgKi8KKwl7VklBU1IsIFNSMTcsIDB4RkYsIDB4MUZ9LAkvKiBEaXNwbGF5IEZJRk8gQ29udHJvbCAgICAgICAgICAgICovCisJe1ZJQVNSLCBTUjE4LCAweEZGLCAweDRFfSwJLyogR0ZYIFBSRVEgdGhyZXNob2xkICAgICAgICAgICAgICAqLworCXtWSUFTUiwgU1IxQSwgMHhGRiwgMHgwYX0sCS8qIEdGWCBQUkVRIHRocmVzaG9sZCAgICAgICAgICAgICAgKi8KKwl7VklBU1IsIFNSMUYsIDB4RkYsIDB4MDB9LAkvKiBNZW1vcnkgQ29udHJvbCAwICAgICAgICAgICAgICAgICovCisJe1ZJQVNSLCBTUjFCLCAweEZGLCAweEYwfSwJLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIDAgICAgICAqLworCXtWSUFTUiwgU1IxRSwgMHhGRiwgMHgwMX0sCS8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCAgICAgICAgKi8KKwl7VklBU1IsIFNSMjAsIDB4RkYsIDB4MDB9LAkvKiBTZXF1ZW5jZXIgQXJiaXRlciBDb250cm9sIDAgICAgICovCisJe1ZJQVNSLCBTUjIxLCAweEZGLCAweDAwfSwJLyogU2VxdWVuY2VyIEFyYml0ZXIgQ29udHJvbCAxICAgICAqLworCXtWSUFTUiwgU1IyMiwgMHhGRiwgMHgxRn0sCS8qIERpc3BsYXkgQXJiaXRlciBDb250cm9sIDEgICAgICAgKi8KKwl7VklBU1IsIFNSMkEsIDB4RkYsIDB4MDB9LAkvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgNSAgICAgICovCisJe1ZJQVNSLCBTUjJELCAweEZGLCAweEZGfSwJLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sIDEgICAgICAqLworCXtWSUFTUiwgU1IyRSwgMHhGRiwgMHhGRn0sCS8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCAyICAgICAgKi8KKwl7VklBQ1IsIENSMEEsIDB4RkYsIDB4MUV9LAkvKiBDdXJzb3IgU3RhcnQgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjBCLCAweEZGLCAweDAwfSwJLyogQ3Vyc29yIEVuZCAgICAgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1IwRSwgMHhGRiwgMHgwMH0sCS8qIEN1cnNvciBMb2NhdGlvbiBIaWdoICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSMEYsIDB4RkYsIDB4MDB9LAkvKiBDdXJzb3IgTG9jYWx0aW9uIExvdyAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjMzLCAweEZGLCAweDAwfSwKKwl7VklBQ1IsIENSNTUsIDB4ODAsIDB4MDB9LAorCXtWSUFDUiwgQ1I1RCwgMHg4MCwgMHgwMH0sCisJe1ZJQUNSLCBDUjM2LCAweEZGLCAweDAxfSwJLyogUG93ZXIgTWFuZ2VtZW50IDMgICAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I2MiwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgKi8KKwl7VklBQ1IsIENSNjMsIDB4RkYsIDB4MDB9LAkvKiBTZWNvbmRhcnkgRGlzcGxheSBTdGFydGluZyBBZGRyZXNzICovCisJe1ZJQUNSLCBDUjY0LCAweEZGLCAweDAwfSwJLyogU2Vjb25kYXJ5IERpc3BsYXkgU3RhcnRpbmcgQWRkcmVzcyAqLworCXtWSUFDUiwgQ1I2OCwgMHhGRiwgMHg2N30sCS8qIERlZmF1bHQgRklGTyBGb3IgSUdBMiAgICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSNkEsIDB4MjAsIDB4MjB9LAkvKiBFeHRlbmRlZCBGSUZPIE9uICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjdBLCAweEZGLCAweDAxfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I3QiwgMHhGRiwgMHgwMn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAyICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSN0MsIDB4RkYsIDB4MDN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMyAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjdELCAweEZGLCAweDA0fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDQgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I3RSwgMHhGRiwgMHgwN30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA1ICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSN0YsIDB4RkYsIDB4MEF9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNiAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjgwLCAweEZGLCAweDBEfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDcgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I4MSwgMHhGRiwgMHgxM30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA4ICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSODIsIDB4RkYsIDB4MTZ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgOSAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjgzLCAweEZGLCAweDE5fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEwICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I4NCwgMHhGRiwgMHgxQ30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMSAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSODUsIDB4RkYsIDB4MUR9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTIgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjg2LCAweEZGLCAweDFFfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEzICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I4NywgMHhGRiwgMHgxRn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxNCAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSODgsIDB4RkYsIDB4NDB9LAkvKiBMQ0QgUGFuZWwgVHlwZSAgICAgICAgICAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjg5LCAweEZGLCAweDAwfSwJLyogTENEIFRpbWluZyBDb250cm9sIDAgICAgICAgICAgICAgICAqLworCXtWSUFDUiwgQ1I4QSwgMHhGRiwgMHg4OH0sCS8qIExDRCBUaW1pbmcgQ29udHJvbCAxICAgICAgICAgICAgICAgKi8KKwl7VklBQ1IsIENSOEIsIDB4RkYsIDB4MkR9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCAwICAgICAgICovCisJe1ZJQUNSLCBDUjhDLCAweEZGLCAweDJEfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgMSAgICAgICAqLworCXtWSUFDUiwgQ1I4RCwgMHhGRiwgMHhDOH0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDIgICAgICAgKi8KKwl7VklBQ1IsIENSOEUsIDB4RkYsIDB4MzZ9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCAzICAgICAgICovCisJe1ZJQUNSLCBDUjhGLCAweEZGLCAweDAwfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgNCAgICAgICAqLworCXtWSUFDUiwgQ1I5MCwgMHhGRiwgMHgxMH0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDUgICAgICAgKi8KKwl7VklBQ1IsIENSOTEsIDB4RkYsIDB4QTB9LAkvKiAyNC8xMiBiaXQgTFZEUyBEYXRhIG9mZiAgICAgICAgICAgICovCisJe1ZJQUNSLCBDUjk2LCAweEZGLCAweDAzfSwJLyogRFZQMCAgICAgICAgOyBEVlAwIENsb2NrIFNrZXcgKi8KKwl7VklBQ1IsIENSOTcsIDB4RkYsIDB4MDN9LAkvKiBERlAgaGlnaCAgICA7IERGUEggQ2xvY2sgU2tldyAqLworCXtWSUFDUiwgQ1I5OSwgMHhGRiwgMHgwM30sCS8qIERGUCBsb3cgICAgICAgICAgIDsgREZQTCBDbG9jayBTa2V3Ki8KKwl7VklBQ1IsIENSOUIsIDB4RkYsIDB4MDd9CS8qIERWSSBvbiBEVlAxICAgICAgIDsgRFZQMSBDbG9jayBTa2V3Ki8KK307CisKKy8qIEZvciBWVDMzMjQ6IENvbW1vbiBTZXR0aW5nIGZvciBWaWRlbyBNb2RlICovCitzdHJ1Y3QgaW9fcmVnIENYNzAwX01vZGVYcmVnc1tdID0geyB7VklBU1IsIFNSMTAsIDB4RkYsIDB4MDF9LAore1ZJQVNSLCBTUjE1LCAweDAyLCAweDAyfSwKK3tWSUFTUiwgU1IxNiwgMHhCRiwgMHgwOH0sCit7VklBU1IsIFNSMTcsIDB4RkYsIDB4MUZ9LAore1ZJQVNSLCBTUjE4LCAweEZGLCAweDRFfSwKK3tWSUFTUiwgU1IxQSwgMHhGQiwgMHgwOH0sCit7VklBU1IsIFNSMUIsIDB4RkYsIDB4RjB9LAore1ZJQVNSLCBTUjFFLCAweEZGLCAweDAxfSwKK3tWSUFTUiwgU1IyQSwgMHhGRiwgMHgwMH0sCit7VklBU1IsIFNSMkQsIDB4RkYsIDB4RkZ9LAkvKiBWQ0sgYW5kIExDSyBQTEwgcG93ZXIgb24uICAgICAgICAgICAqLwore1ZJQUNSLCBDUjBBLCAweEZGLCAweDFFfSwJLyogQ3Vyc29yIFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1IwQiwgMHhGRiwgMHgwMH0sCS8qIEN1cnNvciBFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSMEUsIDB4RkYsIDB4MDB9LAkvKiBDdXJzb3IgTG9jYXRpb24gSGlnaCAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjBGLCAweEZGLCAweDAwfSwJLyogQ3Vyc29yIExvY2FsdGlvbiBMb3cgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1IzMiwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSMzMsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjM0LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzNSwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSMzYsIDB4MDgsIDB4MDB9LAore1ZJQUNSLCBDUjQ3LCAweEM4LCAweDAwfSwJLyogQ2xlYXIgVkNLIFBsdXMuICovCit7VklBQ1IsIENSNjIsIDB4RkYsIDB4MDB9LAkvKiBTZWNvbmRhcnkgRGlzcGxheSBTdGFydGluZyBBZGRyZXNzICAqLwore1ZJQUNSLCBDUjYzLCAweEZGLCAweDAwfSwJLyogU2Vjb25kYXJ5IERpc3BsYXkgU3RhcnRpbmcgQWRkcmVzcyAgKi8KK3tWSUFDUiwgQ1I2NCwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgICovCit7VklBQ1IsIENSQTMsIDB4RkYsIDB4MDB9LAkvKiBTZWNvbmRhcnkgRGlzcGxheSBTdGFydGluZyBBZGRyZXNzICAqLwore1ZJQUNSLCBDUjY5LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I2QSwgMHhGRiwgMHg0MH0sCit7VklBQ1IsIENSNkIsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjZDLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I3QSwgMHhGRiwgMHgwMX0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxICAgICAgICAgICAgICovCit7VklBQ1IsIENSN0IsIDB4RkYsIDB4MDJ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMiAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjdDLCAweEZGLCAweDAzfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDMgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I3RCwgMHhGRiwgMHgwNH0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA0ICAgICAgICAgICAgICovCit7VklBQ1IsIENSN0UsIDB4RkYsIDB4MDd9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNSAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjdGLCAweEZGLCAweDBBfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDYgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4MCwgMHhGRiwgMHgwRH0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA3ICAgICAgICAgICAgICovCit7VklBQ1IsIENSODEsIDB4RkYsIDB4MTN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgOCAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjgyLCAweEZGLCAweDE2fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDkgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4MywgMHhGRiwgMHgxOX0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMCAgICAgICAgICAgICovCit7VklBQ1IsIENSODQsIDB4RkYsIDB4MUN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTEgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg1LCAweEZGLCAweDFEfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEyICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4NiwgMHhGRiwgMHgxRX0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMyAgICAgICAgICAgICovCit7VklBQ1IsIENSODcsIDB4RkYsIDB4MUZ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTQgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg4LCAweEZGLCAweDQwfSwJLyogTENEIFBhbmVsIFR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4OSwgMHhGRiwgMHgwMH0sCS8qIExDRCBUaW1pbmcgQ29udHJvbCAwICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSOEEsIDB4RkYsIDB4ODh9LAkvKiBMQ0QgVGltaW5nIENvbnRyb2wgMSAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUkQ0LCAweEZGLCAweDgxfSwJLyogU2Vjb25kIHBvd2VyIHNlcXVlbmNlIGNvbnRyb2wgICAgICAgKi8KK3tWSUFDUiwgQ1I4QiwgMHhGRiwgMHg1RH0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDAgICAgICAgICovCit7VklBQ1IsIENSOEMsIDB4RkYsIDB4MkJ9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCAxICAgICAgICAqLwore1ZJQUNSLCBDUjhELCAweEZGLCAweDZGfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgMiAgICAgICAgKi8KK3tWSUFDUiwgQ1I4RSwgMHhGRiwgMHgyQn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDMgICAgICAgICovCit7VklBQ1IsIENSOEYsIDB4RkYsIDB4MDF9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCA0ICAgICAgICAqLwore1ZJQUNSLCBDUjkwLCAweEZGLCAweDAxfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgNSAgICAgICAgKi8KK3tWSUFDUiwgQ1I5MSwgMHhGRiwgMHg4MH0sCS8qIDI0LzEyIGJpdCBMVkRTIERhdGEgb2ZmICAgICAgICAgICAgICovCit7VklBQ1IsIENSOTYsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjk3LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I5OSwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSOUIsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUkQyLCAweEZGLCAweEZGfQkvKiBUTURTL0xWRFMgY29udHJvbCByZWdpc3Rlci4gICAgICAgICAqLworfTsKKworLyogRm9yIFZUMzM1MzogQ29tbW9uIFNldHRpbmcgZm9yIFZpZGVvIE1vZGUgKi8KK3N0cnVjdCBpb19yZWcgVlg4MDBfTW9kZVhyZWdzW10gPSB7IHtWSUFTUiwgU1IxMCwgMHhGRiwgMHgwMX0sCit7VklBU1IsIFNSMTUsIDB4MDIsIDB4MDJ9LAore1ZJQVNSLCBTUjE2LCAweEJGLCAweDA4fSwKK3tWSUFTUiwgU1IxNywgMHhGRiwgMHgxRn0sCit7VklBU1IsIFNSMTgsIDB4RkYsIDB4NEV9LAore1ZJQVNSLCBTUjFBLCAweEZCLCAweDA4fSwKK3tWSUFTUiwgU1IxQiwgMHhGRiwgMHhGMH0sCit7VklBU1IsIFNSMUUsIDB4RkYsIDB4MDF9LAore1ZJQVNSLCBTUjJBLCAweEZGLCAweDAwfSwKK3tWSUFTUiwgU1IyRCwgMHhGRiwgMHhGRn0sCS8qIFZDSyBhbmQgTENLIFBMTCBwb3dlciBvbi4gICAgICAgICAgICovCit7VklBQ1IsIENSMEEsIDB4RkYsIDB4MUV9LAkvKiBDdXJzb3IgU3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjBCLCAweEZGLCAweDAwfSwJLyogQ3Vyc29yIEVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1IwRSwgMHhGRiwgMHgwMH0sCS8qIEN1cnNvciBMb2NhdGlvbiBIaWdoICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSMEYsIDB4RkYsIDB4MDB9LAkvKiBDdXJzb3IgTG9jYWx0aW9uIExvdyAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjMyLCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzMywgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSMzQsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjM1LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzNiwgMHgwOCwgMHgwMH0sCit7VklBQ1IsIENSNDcsIDB4QzgsIDB4MDB9LAkvKiBDbGVhciBWQ0sgUGx1cy4gKi8KK3tWSUFDUiwgQ1I2MiwgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgICovCit7VklBQ1IsIENSNjMsIDB4RkYsIDB4MDB9LAkvKiBTZWNvbmRhcnkgRGlzcGxheSBTdGFydGluZyBBZGRyZXNzICAqLwore1ZJQUNSLCBDUjY0LCAweEZGLCAweDAwfSwJLyogU2Vjb25kYXJ5IERpc3BsYXkgU3RhcnRpbmcgQWRkcmVzcyAgKi8KK3tWSUFDUiwgQ1JBMywgMHhGRiwgMHgwMH0sCS8qIFNlY29uZGFyeSBEaXNwbGF5IFN0YXJ0aW5nIEFkZHJlc3MgICovCit7VklBQ1IsIENSNjksIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjZBLCAweEZGLCAweDQwfSwKK3tWSUFDUiwgQ1I2QiwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSNkMsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjdBLCAweEZGLCAweDAxfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I3QiwgMHhGRiwgMHgwMn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAyICAgICAgICAgICAgICovCit7VklBQ1IsIENSN0MsIDB4RkYsIDB4MDN9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMyAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjdELCAweEZGLCAweDA0fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDQgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I3RSwgMHhGRiwgMHgwN30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA1ICAgICAgICAgICAgICovCit7VklBQ1IsIENSN0YsIDB4RkYsIDB4MEF9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgNiAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjgwLCAweEZGLCAweDBEfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDcgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4MSwgMHhGRiwgMHgxM30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciA4ICAgICAgICAgICAgICovCit7VklBQ1IsIENSODIsIDB4RkYsIDB4MTZ9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgOSAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjgzLCAweEZGLCAweDE5fSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEwICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4NCwgMHhGRiwgMHgxQ30sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxMSAgICAgICAgICAgICovCit7VklBQ1IsIENSODUsIDB4RkYsIDB4MUR9LAkvKiBMQ0QgU2NhbGluZyBQYXJhbWV0ZXIgMTIgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg2LCAweEZGLCAweDFFfSwJLyogTENEIFNjYWxpbmcgUGFyYW1ldGVyIDEzICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4NywgMHhGRiwgMHgxRn0sCS8qIExDRCBTY2FsaW5nIFBhcmFtZXRlciAxNCAgICAgICAgICAgICovCit7VklBQ1IsIENSODgsIDB4RkYsIDB4NDB9LAkvKiBMQ0QgUGFuZWwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAqLwore1ZJQUNSLCBDUjg5LCAweEZGLCAweDAwfSwJLyogTENEIFRpbWluZyBDb250cm9sIDAgICAgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I4QSwgMHhGRiwgMHg4OH0sCS8qIExDRCBUaW1pbmcgQ29udHJvbCAxICAgICAgICAgICAgICAgICovCit7VklBQ1IsIENSRDQsIDB4RkYsIDB4ODF9LAkvKiBTZWNvbmQgcG93ZXIgc2VxdWVuY2UgY29udHJvbCAgICAgICAqLwore1ZJQUNSLCBDUjhCLCAweEZGLCAweDVEfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgMCAgICAgICAgKi8KK3tWSUFDUiwgQ1I4QywgMHhGRiwgMHgyQn0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDEgICAgICAgICovCit7VklBQ1IsIENSOEQsIDB4RkYsIDB4NkZ9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCAyICAgICAgICAqLwore1ZJQUNSLCBDUjhFLCAweEZGLCAweDJCfSwJLyogTENEIFBvd2VyIFNlcXVlbmNlIENvbnRyb2wgMyAgICAgICAgKi8KK3tWSUFDUiwgQ1I4RiwgMHhGRiwgMHgwMX0sCS8qIExDRCBQb3dlciBTZXF1ZW5jZSBDb250cm9sIDQgICAgICAgICovCit7VklBQ1IsIENSOTAsIDB4RkYsIDB4MDF9LAkvKiBMQ0QgUG93ZXIgU2VxdWVuY2UgQ29udHJvbCA1ICAgICAgICAqLwore1ZJQUNSLCBDUjkxLCAweEZGLCAweDgwfSwJLyogMjQvMTIgYml0IExWRFMgRGF0YSBvZmYgICAgICAgICAgICAgKi8KK3tWSUFDUiwgQ1I5NiwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSOTcsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjk5LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1I5QiwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSRDIsIDB4RkYsIDB4RkZ9CS8qIFRNRFMvTFZEUyBjb250cm9sIHJlZ2lzdGVyLiAgICAgICAgICovCit9OworCisvKiBWaWRlbyBNb2RlIFRhYmxlICovCisvKiBDb21tb24gU2V0dGluZyBmb3IgVmlkZW8gTW9kZSAqLworc3RydWN0IGlvX3JlZyBDTEUyNjZfTW9kZVhyZWdzW10gPSB7IHtWSUFTUiwgU1IxRSwgMHhGMCwgMHgwMH0sCit7VklBU1IsIFNSMkEsIDB4MEYsIDB4MDB9LAore1ZJQVNSLCBTUjE1LCAweDAyLCAweDAyfSwKK3tWSUFTUiwgU1IxNiwgMHhCRiwgMHgwOH0sCit7VklBU1IsIFNSMTcsIDB4RkYsIDB4MUZ9LAore1ZJQVNSLCBTUjE4LCAweEZGLCAweDRFfSwKK3tWSUFTUiwgU1IxQSwgMHhGQiwgMHgwOH0sCisKK3tWSUFDUiwgQ1IzMiwgMHhGRiwgMHgwMH0sCit7VklBQ1IsIENSMzQsIDB4RkYsIDB4MDB9LAore1ZJQUNSLCBDUjM1LCAweEZGLCAweDAwfSwKK3tWSUFDUiwgQ1IzNiwgMHgwOCwgMHgwMH0sCit7VklBQ1IsIENSNkEsIDB4RkYsIDB4ODB9LAore1ZJQUNSLCBDUjZBLCAweEZGLCAweEMwfSwKKwore1ZJQUNSLCBDUjU1LCAweDgwLCAweDAwfSwKK3tWSUFDUiwgQ1I1RCwgMHg4MCwgMHgwMH0sCisKK3tWSUFHUiwgR1IyMCwgMHhGRiwgMHgwMH0sCit7VklBR1IsIEdSMjEsIDB4RkYsIDB4MDB9LAore1ZJQUdSLCBHUjIyLCAweEZGLCAweDAwfSwKKwkvKiBMQ0QgUGFyYW1ldGVycyAqLwore1ZJQUNSLCBDUjdBLCAweEZGLCAweDAxfSwJLyogTENEIFBhcmFtZXRlciAxICovCit7VklBQ1IsIENSN0IsIDB4RkYsIDB4MDJ9LAkvKiBMQ0QgUGFyYW1ldGVyIDIgKi8KK3tWSUFDUiwgQ1I3QywgMHhGRiwgMHgwM30sCS8qIExDRCBQYXJhbWV0ZXIgMyAqLwore1ZJQUNSLCBDUjdELCAweEZGLCAweDA0fSwJLyogTENEIFBhcmFtZXRlciA0ICovCit7VklBQ1IsIENSN0UsIDB4RkYsIDB4MDd9LAkvKiBMQ0QgUGFyYW1ldGVyIDUgKi8KK3tWSUFDUiwgQ1I3RiwgMHhGRiwgMHgwQX0sCS8qIExDRCBQYXJhbWV0ZXIgNiAqLwore1ZJQUNSLCBDUjgwLCAweEZGLCAweDBEfSwJLyogTENEIFBhcmFtZXRlciA3ICovCit7VklBQ1IsIENSODEsIDB4RkYsIDB4MTN9LAkvKiBMQ0QgUGFyYW1ldGVyIDggKi8KK3tWSUFDUiwgQ1I4MiwgMHhGRiwgMHgxNn0sCS8qIExDRCBQYXJhbWV0ZXIgOSAqLwore1ZJQUNSLCBDUjgzLCAweEZGLCAweDE5fSwJLyogTENEIFBhcmFtZXRlciAxMCAqLwore1ZJQUNSLCBDUjg0LCAweEZGLCAweDFDfSwJLyogTENEIFBhcmFtZXRlciAxMSAqLwore1ZJQUNSLCBDUjg1LCAweEZGLCAweDFEfSwJLyogTENEIFBhcmFtZXRlciAxMiAqLwore1ZJQUNSLCBDUjg2LCAweEZGLCAweDFFfSwJLyogTENEIFBhcmFtZXRlciAxMyAqLwore1ZJQUNSLCBDUjg3LCAweEZGLCAweDFGfSwJLyogTENEIFBhcmFtZXRlciAxNCAqLworCit9OworCisvKiBNb2RlOjEwMjRYNzY4ICovCitzdHJ1Y3QgaW9fcmVnIFBNMTAyNHg3NjhbXSA9IHsge1ZJQVNSLCAweDE2LCAweEJGLCAweDBDfSwKK3tWSUFTUiwgMHgxOCwgMHhGRiwgMHg0Q30KK307CisKK3N0cnVjdCBwYXRjaF90YWJsZSByZXNfcGF0Y2hfdGFibGVbXSA9IHsKKwl7VklBX1JFU18xMDI0WDc2OCwgQVJSQVlfU0laRShQTTEwMjR4NzY4KSwgUE0xMDI0eDc2OH0KK307CisKKy8qIHN0cnVjdCBWUElUVGFibGUgeworCXVuc2lnbmVkIGNoYXIgIE1pc2M7CisJdW5zaWduZWQgY2hhciAgU1JbU3RkU1JdOworCXVuc2lnbmVkIGNoYXIgIENSW1N0ZENSXTsKKwl1bnNpZ25lZCBjaGFyICBHUltTdGRHUl07CisJdW5zaWduZWQgY2hhciAgQVJbU3RkQVJdOworIH07Ki8KKworc3RydWN0IFZQSVRUYWJsZSBWUElUID0geworCS8qIE1zaWMgKi8KKwkweEM3LAorCS8qIFNlcXVlbmNlciAqLworCXsweDAxLCAweDBGLCAweDAwLCAweDBFfSwKKwkvKiBHcmFwaGljIENvbnRyb2xsZXIgKi8KKwl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwRiwgMHhGRn0sCisJLyogQXR0cmlidXRlIENvbnRyb2xsZXIgKi8KKwl7MHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKwkgMHgwMSwgMHgwMCwgMHgwRiwgMHgwMH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZGUgVGFibGUgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKworLyogNDgweDY0MCAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE00ODB4NjQwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzI1XzE3NU0sIE00ODBYNjQwX1I2MF9IU1AsIE00ODBYNjQwX1I2MF9WU1AsCisJIHs2MjQsIDQ4MCwgNDgwLCAxNDQsIDUwNCwgNDgsIDY2MywgNjQwLCA2NDAsIDIzLCA2NDEsIDN9IH0JLyogR1RGKi8KK307CisKKy8qIDY0MHg0ODAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE02NDB4NDgwW10gPSB7CisJLypyX3JhdGUsdmNsayxoc3AsdnNwICovCisJLypIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18yNV8xNzVNLCBNNjQwWDQ4MF9SNjBfSFNQLCBNNjQwWDQ4MF9SNjBfVlNQLAorCSB7ODAwLCA2NDAsIDY0OCwgMTQ0LCA2NTYsIDk2LCA1MjUsIDQ4MCwgNDgwLCA0NSwgNDkwLCAyfSB9LAorCXtSRUZSRVNIXzc1LCBDTEtfMzFfNTAwTSwgTTY0MFg0ODBfUjc1X0hTUCwgTTY0MFg0ODBfUjc1X1ZTUCwKKwkgezg0MCwgNjQwLCA2NDAsIDIwMCwgNjU2LCA2NCwgNTAwLCA0ODAsIDQ4MCwgMjAsIDQ4MSwgM30gfSwKKwl7UkVGUkVTSF84NSwgQ0xLXzM2XzAwME0sIE02NDBYNDgwX1I4NV9IU1AsIE02NDBYNDgwX1I4NV9WU1AsCisJIHs4MzIsIDY0MCwgNjQwLCAxOTIsIDY5NiwgNTYsIDUwOSwgNDgwLCA0ODAsIDI5LCA0ODEsIDN9IH0sCisJe1JFRlJFU0hfMTAwLCBDTEtfNDNfMTYzTSwgTTY0MFg0ODBfUjEwMF9IU1AsIE02NDBYNDgwX1IxMDBfVlNQLAorCSB7ODQ4LCA2NDAsIDY0MCwgMjA4LCA2ODAsIDY0LCA1MDksIDQ4MCwgNDgwLCAyOSwgNDgxLCAzfSB9LCAvKkdURiovCisJICAgIHtSRUZSRVNIXzEyMCwgQ0xLXzUyXzQwNk0sIE02NDBYNDgwX1IxMjBfSFNQLAorCSAgICAgTTY0MFg0ODBfUjEyMF9WU1AsCisJICAgICB7ODQ4LCA2NDAsIDY0MCwgMjA4LCA2ODAsIDY0LCA1MTUsIDQ4MCwgNDgwLCAzNSwgNDgxLAorCSAgICAgIDN9IH0gLypHVEYqLworfTsKKworLyo3MjB4NDgwIChHVEYpKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNNzIweDQ4MFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAgICAgICovCisJLypIVCwgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzI2Xzg4ME0sIE03MjBYNDgwX1I2MF9IU1AsIE03MjBYNDgwX1I2MF9WU1AsCisJIHs4OTYsIDcyMCwgNzIwLCAxNzYsIDczNiwgNzIsIDQ5NywgNDgwLCA0ODAsIDE3LCA0ODEsIDN9IH0KKworfTsKKworLyo3MjB4NTc2IChHVEYpKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNNzIweDU3NltdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAqLworCS8qSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMzJfNjY4TSwgTTcyMFg1NzZfUjYwX0hTUCwgTTcyMFg1NzZfUjYwX1ZTUCwKKwkgezkxMiwgNzIwLCA3MjAsIDE5MiwgNzQ0LCA3MiwgNTk3LCA1NzYsIDU3NiwgMjEsIDU3NywgM30gfQorfTsKKworLyogODAweDQ4MCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE04MDB4NDgwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzI5XzU4MU0sIE04MDBYNDgwX1I2MF9IU1AsIE04MDBYNDgwX1I2MF9WU1AsCisJIHs5OTIsIDgwMCwgODAwLCAxOTIsIDgyNCwgNzIsIDUwMCwgNDgwLCA0ODAsIDIwLCA0ODMsIDd9IH0KK307CisKKy8qIDgwMHg2MDAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE04MDB4NjAwW10gPSB7CisJLypyX3JhdGUsdmNsayxoc3AsdnNwICAgICAqLworCS8qSFQsICAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzQwXzAwME0sIE04MDBYNjAwX1I2MF9IU1AsIE04MDBYNjAwX1I2MF9WU1AsCisJIHsxMDU2LCA4MDAsIDgwMCwgMjU2LCA4NDAsIDEyOCwgNjI4LCA2MDAsIDYwMCwgMjgsIDYwMSwgNH0gfSwKKwl7UkVGUkVTSF83NSwgQ0xLXzQ5XzUwME0sIE04MDBYNjAwX1I3NV9IU1AsIE04MDBYNjAwX1I3NV9WU1AsCisJIHsxMDU2LCA4MDAsIDgwMCwgMjU2LCA4MTYsIDgwLCA2MjUsIDYwMCwgNjAwLCAyNSwgNjAxLCAzfSB9LAorCXtSRUZSRVNIXzg1LCBDTEtfNTZfMjUwTSwgTTgwMFg2MDBfUjg1X0hTUCwgTTgwMFg2MDBfUjg1X1ZTUCwKKwkgezEwNDgsIDgwMCwgODAwLCAyNDgsIDgzMiwgNjQsIDYzMSwgNjAwLCA2MDAsIDMxLCA2MDEsIDN9IH0sCisJe1JFRlJFU0hfMTAwLCBDTEtfNjhfMTc5TSwgTTgwMFg2MDBfUjEwMF9IU1AsIE04MDBYNjAwX1IxMDBfVlNQLAorCSB7MTA3MiwgODAwLCA4MDAsIDI3MiwgODQ4LCA4OCwgNjM2LCA2MDAsIDYwMCwgMzYsIDYwMSwgM30gfSwKKwl7UkVGUkVTSF8xMjAsIENMS184M185NTBNLCBNODAwWDYwMF9SMTIwX0hTUCwKKwkJICBNODAwWDYwMF9SMTIwX1ZTUCwKKwkJICB7MTA4OCwgODAwLCA4MDAsIDI4OCwgODU2LCA4OCwgNjQzLCA2MDAsIDYwMCwgNDMsIDYwMSwKKwkJICAgM30gfQorfTsKKworLyogODQ4eDQ4MCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE04NDh4NDgwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzMxXzUwME0sIE04NDhYNDgwX1I2MF9IU1AsIE04NDhYNDgwX1I2MF9WU1AsCisJIHsxMDU2LCA4NDgsIDg0OCwgMjA4LCA4NzIsIDgwLCA1MDAsIDQ4MCwgNDgwLCAyMCwgNDgzLCA1fSB9Cit9OworCisvKjg1Nng0ODAgKEdURikgY29udmVydCB0byA4NTJ4NDgwKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNODUyeDQ4MFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAgICAgKi8KKwkvKkhULCAgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18zMV83MjhNLCBNODUyWDQ4MF9SNjBfSFNQLCBNODUyWDQ4MF9SNjBfVlNQLAorCXsxMDY0LCA4NTYsIDg1NiwgMjA4LCA4NzIsIDg4LCA0OTcsIDQ4MCwgNDgwLCAxNywgNDgxLCAzfSB9Cit9OworCisvKjEwMjR4NTEyIChHVEYpKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTAyNHg1MTJbXSA9IHsKKwkvKnJfcmF0ZSx2Y2xrLGhzcCx2c3AgICAgICovCisJLypIVCwgICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfNDFfMjkxTSwgTTEwMjRYNTEyX1I2MF9IU1AsIE0xMDI0WDUxMl9SNjBfVlNQLAorCSB7MTI5NiwgMTAyNCwgMTAyNCwgMjcyLCAxMDU2LCAxMDQsIDUzMSwgNTEyLCA1MTIsIDE5LCA1MTMsIDN9IH0KKworfTsKKworLyogMTAyNHg2MDAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMDI0eDYwMFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAqLworCS8qSFQsICBIQSwgICBIQlMsICBIQkUsIEhTUywgIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfNDhfODc1TSwgTTEwMjRYNjAwX1I2MF9IU1AsIE0xMDI0WDYwMF9SNjBfVlNQLAorCSB7MTMxMiwgMTAyNCwgMTAyNCwgMjg4LCAxMDY0LCAxMDQsIDYyMiwgNjAwLCA2MDAsIDIyLCA2MDEsIDN9IH0sCit9OworCisvKiAxMDI0eDc2OCovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEwMjR4NzY4W10gPSB7CisJLypyX3JhdGUsdmNsayxoc3AsdnNwICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS182NV8wMDBNLCBNMTAyNFg3NjhfUjYwX0hTUCwgTTEwMjRYNzY4X1I2MF9WU1AsCisJezEzNDQsIDEwMjQsIDEwMjQsIDMyMCwgMTA0OCwgMTM2LCA4MDYsIDc2OCwgNzY4LCAzOCwgNzcxLCA2fSB9LAorCXtSRUZSRVNIXzc1LCBDTEtfNzhfNzUwTSwgTTEwMjRYNzY4X1I3NV9IU1AsIE0xMDI0WDc2OF9SNzVfVlNQLAorCXsxMzEyLCAxMDI0LCAxMDI0LCAyODgsIDEwNDAsIDk2LCA4MDAsIDc2OCwgNzY4LCAzMiwgNzY5LCAzfSB9LAorCXtSRUZSRVNIXzg1LCBDTEtfOTRfNTAwTSwgTTEwMjRYNzY4X1I4NV9IU1AsIE0xMDI0WDc2OF9SODVfVlNQLAorCXsxMzc2LCAxMDI0LCAxMDI0LCAzNTIsIDEwNzIsIDk2LCA4MDgsIDc2OCwgNzY4LCA0MCwgNzY5LCAzfSB9LAorCXtSRUZSRVNIXzEwMCwgQ0xLXzExM18zMDlNLCBNMTAyNFg3NjhfUjEwMF9IU1AsIE0xMDI0WDc2OF9SMTAwX1ZTUCwKKwl7MTM5MiwgMTAyNCwgMTAyNCwgMzY4LCAxMDk2LCAxMTIsIDgxNCwgNzY4LCA3NjgsIDQ2LCA3NjksIDN9IH0KK307CisKKy8qIDExNTJ4ODY0Ki8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTE1Mng4NjRbXSA9IHsKKwkvKnJfcmF0ZSx2Y2xrLGhzcCx2c3AgICAgICAqLworCS8qSFQsICBIQSwgICBIQlMsICBIQkUsIEhTUywgIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzc1LCBDTEtfMTA4XzAwME0sIE0xMTUyWDg2NF9SNzVfSFNQLCBNMTE1Mlg4NjRfUjc1X1ZTUCwKKwkgezE2MDAsIDExNTIsIDExNTIsIDQ0OCwgMTIxNiwgMTI4LCA5MDAsIDg2NCwgODY0LCAzNiwgODY1LCAzfSB9CisKK307CisKKy8qIDEyODB4NzIwIChIRE1JIDcyMFApKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg3MjBbXSA9IHsKKwkvKnJfcmF0ZSx2Y2xrLGhzcCx2c3AgKi8KKwkvKkhULCAgSEEsICAgSEJTLCAgSEJFLCBIU1MsICBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgICAgICAqLworCXtSRUZSRVNIXzYwLCBDTEtfNzRfNDgxTSwgTTEyODBYNzIwX1I2MF9IU1AsIE0xMjgwWDcyMF9SNjBfVlNQLAorCSB7MTY0OCwgMTI4MCwgMTI4MCwgMzY4LCAxMzkyLCA0MCwgNzUwLCA3MjAsIDcyMCwgMzAsIDcyNSwgNX0gfSwKKwl7UkVGUkVTSF81MCwgQ0xLXzYwXzQ2Nk0sIE0xMjgwWDcyMF9SNTBfSFNQLCBNMTI4MFg3MjBfUjUwX1ZTUCwKKwkgezE2MzIsIDEyODAsIDEyODAsIDM1MiwgMTMyOCwgMTI4LCA3NDEsIDcyMCwgNzIwLCAyMSwgNzIxLCAzfSB9Cit9OworCisvKjEyODB4NzY4IChHVEYpKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg3NjhbXSA9IHsKKwkvKnJfcmF0ZSx2Y2xrLGhzcCx2c3AgICAgICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS184MF8xMzZNLCBNMTI4MFg3NjhfUjYwX0hTUCwgTTEyODBYNzY4X1I2MF9WU1AsCisJIHsxNjgwLCAxMjgwLCAxMjgwLCA0MDAsIDEzNDQsIDEzNiwgNzk1LCA3NjgsIDc2OCwgMjcsIDc2OSwgM30gfSwKKwl7UkVGUkVTSF81MCwgQ0xLXzY1XzE3OE0sIE0xMjgwWDc2OF9SNTBfSFNQLCBNMTI4MFg3NjhfUjUwX1ZTUCwKKwkgezE2NDgsIDEyODAsIDEyODAsIDM2OCwgMTMzNiwgMTI4LCA3OTEsIDc2OCwgNzY4LCAyMywgNzY5LCAzfSB9Cit9OworCisvKiAxMjgweDgwMCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMjgweDgwMFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS184M18zNzVNLCBNMTI4MFg4MDBfUjYwX0hTUCwgTTEyODBYODAwX1I2MF9WU1AsCisJIHsxNjgwLCAxMjgwLCAxMjgwLCA0MDAsIDEzNTIsIDEyOCwgODMxLCA4MDAsIDgwMCwgMzEsIDgwMywgNn0gfQorfTsKKworLyoxMjgweDk2MCovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEyODB4OTYwW10gPSB7CisJLypyX3JhdGUsdmNsayxoc3AsdnNwICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMDhfMDAwTSwgTTEyODBYOTYwX1I2MF9IU1AsIE0xMjgwWDk2MF9SNjBfVlNQLAorCSB7MTgwMCwgMTI4MCwgMTI4MCwgNTIwLCAxMzc2LCAxMTIsIDEwMDAsIDk2MCwgOTYwLCA0MCwgOTYxLCAzfSB9Cit9OworCisvKiAxMjgweDEwMjQqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMjgweDEwMjRbXSA9IHsKKwkvKnJfcmF0ZSx2Y2xrLCxoc3AsdnNwICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMDhfMDAwTSwgTTEyODBYMTAyNF9SNjBfSFNQLCBNMTI4MFgxMDI0X1I2MF9WU1AsCisJIHsxNjg4LCAxMjgwLCAxMjgwLCA0MDgsIDEzMjgsIDExMiwgMTA2NiwgMTAyNCwgMTAyNCwgNDIsIDEwMjUsCisJICAzfSB9LAorCXtSRUZSRVNIXzc1LCBDTEtfMTM1XzAwME0sIE0xMjgwWDEwMjRfUjc1X0hTUCwgTTEyODBYMTAyNF9SNzVfVlNQLAorCSB7MTY4OCwgMTI4MCwgMTI4MCwgNDA4LCAxMjk2LCAxNDQsIDEwNjYsIDEwMjQsIDEwMjQsIDQyLCAxMDI1LAorCSAgM30gfSwKKwl7UkVGUkVTSF84NSwgQ0xLXzE1N181MDBNLCBNMTI4MFgxMDI0X1I4NV9IU1AsIE0xMjgwWDEwMjRfUjg1X1ZTUCwKKwkgezE3MjgsIDEyODAsIDEyODAsIDQ0OCwgMTM0NCwgMTYwLCAxMDcyLCAxMDI0LCAxMDI0LCA0OCwgMTAyNSwgM30gfQorfTsKKworLyogMTM2OHg3NjggKEdURikgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTM2OHg3NjhbXSA9IHsKKwkvKiByX3JhdGUsICB2Y2xrLCBoc3AsIHZzcCAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzg1Xzg2ME0sIE0xMzY4WDc2OF9SNjBfSFNQLCBNMTM2OFg3NjhfUjYwX1ZTUCwKKwkgezE4MDAsIDEzNjgsIDEzNjgsIDQzMiwgMTQ0MCwgMTQ0LCA3OTUsIDc2OCwgNzY4LCAyNywgNzY5LCAzfSB9Cit9OworCisvKjE0NDB4MTA1MCAoR1RGKSovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0NDB4MTA1MFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAgICAgICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMjVfMTA0TSwgTTE0NDBYMTA1MF9SNjBfSFNQLCBNMTQ0MFgxMDUwX1I2MF9WU1AsCisJIHsxOTM2LCAxNDQwLCAxNDQwLCA0OTYsIDE1MzYsIDE1MiwgMTA3NywgMTA0MCwgMTA0MCwgMzcsIDEwNDEsIDN9IH0KK307CisKKy8qIDE2MDB4MTIwMCovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE2MDB4MTIwMFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAqLworCS8qSFQsICBIQSwgICBIQlMsICBIQkUsIEhTUywgIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMTYyXzAwME0sIE0xNjAwWDEyMDBfUjYwX0hTUCwgTTE2MDBYMTIwMF9SNjBfVlNQLAorCSB7MjE2MCwgMTYwMCwgMTYwMCwgNTYwLCAxNjY0LCAxOTIsIDEyNTAsIDEyMDAsIDEyMDAsIDUwLCAxMjAxLAorCSAgM30gfSwKKwl7UkVGUkVTSF83NSwgQ0xLXzIwMl81MDBNLCBNMTYwMFgxMjAwX1I3NV9IU1AsIE0xNjAwWDEyMDBfUjc1X1ZTUCwKKwkgezIxNjAsIDE2MDAsIDE2MDAsIDU2MCwgMTY2NCwgMTkyLCAxMjUwLCAxMjAwLCAxMjAwLCA1MCwgMTIwMSwgM30gfQorCit9OworCisvKiAxNjgweDEwNTAgKENWVCkgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTY4MHgxMDUwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgICAgVlQsICBWQSwgIFZCUywgVkJFLCAgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzE0Nl83NjBNLCBNMTY4MHgxMDUwX1I2MF9IU1AsIE0xNjgweDEwNTBfUjYwX1ZTUCwKKwkgezIyNDAsIDE2ODAsIDE2ODAsIDU2MCwgMTc4NCwgMTc2LCAxMDg5LCAxMDUwLCAxMDUwLCAzOSwgMTA1MywKKwkgIDZ9IH0sCisJe1JFRlJFU0hfNzUsIENMS18xODdfMDAwTSwgTTE2ODB4MTA1MF9SNzVfSFNQLCBNMTY4MHgxMDUwX1I3NV9WU1AsCisJIHsyMjcyLCAxNjgwLCAxNjgwLCA1OTIsIDE4MDAsIDE3NiwgMTA5OSwgMTA1MCwgMTA1MCwgNDksIDEwNTMsIDZ9IH0KK307CisKKy8qIDE2ODB4MTA1MCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTY4MHgxMDUwX1JCW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsICAgIFZULCAgVkEsICBWQlMsIFZCRSwgIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMTlfMDAwTSwgTTE2ODB4MTA1MF9SQl9SNjBfSFNQLAorCSBNMTY4MHgxMDUwX1JCX1I2MF9WU1AsCisJIHsxODQwLCAxNjgwLCAxNjgwLCAxNjAsIDE3MjgsIDMyLCAxMDgwLCAxMDUwLCAxMDUwLCAzMCwgMTA1MywgNn0gfQorfTsKKworLyogMTkyMHgxMDgwIChDVlQpKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTkyMHgxMDgwW10gPSB7CisJLypyX3JhdGUsdmNsayxoc3AsdnNwICovCisJLypIVCwgIEhBLCAgIEhCUywgIEhCRSwgSFNTLCAgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xNzJfNzk4TSwgTTE5MjBYMTA4MF9SNjBfSFNQLCBNMTkyMFgxMDgwX1I2MF9WU1AsCisJIHsyNTc2LCAxOTIwLCAxOTIwLCA2NTYsIDIwNDgsIDIwMCwgMTEyMCwgMTA4MCwgMTA4MCwgNDAsIDEwODMsIDV9IH0KK307CisKKy8qIDE5MjB4MTA4MCAoQ1ZUIHdpdGggUmVkdWNlIEJsYW5raW5nKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xOTIweDEwODBfUkJbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMTM4XzQwME0sIE0xOTIwWDEwODBfUkJfUjYwX0hTUCwKKwkgTTE5MjBYMTA4MF9SQl9SNjBfVlNQLAorCSB7MjA4MCwgMTkyMCwgMTkyMCwgMTYwLCAxOTY4LCAzMiwgMTExMSwgMTA4MCwgMTA4MCwgMzEsIDEwODMsIDV9IH0KK307CisKKy8qIDE5MjB4MTQ0MCovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE5MjB4MTQ0MFtdID0geworCS8qcl9yYXRlLHZjbGssaHNwLHZzcCAqLworCS8qSFQsICBIQSwgICBIQlMsICBIQkUsIEhTUywgIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMjM0XzAwME0sIE0xOTIwWDE0NDBfUjYwX0hTUCwgTTE5MjBYMTQ0MF9SNjBfVlNQLAorCSB7MjYwMCwgMTkyMCwgMTkyMCwgNjgwLCAyMDQ4LCAyMDgsIDE1MDAsIDE0NDAsIDE0NDAsIDYwLCAxNDQxLAorCSAgM30gfSwKKwl7UkVGUkVTSF83NSwgQ0xLXzI5N181MDBNLCBNMTkyMFgxNDQwX1I3NV9IU1AsIE0xOTIwWDE0NDBfUjc1X1ZTUCwKKwkgezI2NDAsIDE5MjAsIDE5MjAsIDcyMCwgMjA2NCwgMjI0LCAxNTAwLCAxNDQwLCAxNDQwLCA2MCwgMTQ0MSwgM30gfQorfTsKKworLyogMTQwMHgxMDUwIChDVlQpICovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0MDB4MTA1MFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsICBIU1MsIEhTRSwgICBWVCwgIFZBLCAgVkJTLCBWQkUsICBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMTIxXzc1ME0sIE0xNDAwWDEwNTBfUjYwX0hTUCwgTTE0MDBYMTA1MF9SNjBfVlNQLAorCSB7MTg2NCwgMTQwMCwgMTQwMCwgNDY0LCAxNDg4LCAxNDQsIDEwODksIDEwNTAsIDEwNTAsIDM5LCAxMDUzLAorCSAgNH0gfSwKKwl7UkVGUkVTSF83NSwgQ0xLXzE1Nl8wMDBNLCBNMTQwMFgxMDUwX1I3NV9IU1AsIE0xNDAwWDEwNTBfUjc1X1ZTUCwKKwkgezE4OTYsIDE0MDAsIDE0MDAsIDQ5NiwgMTUwNCwgMTQ0LCAxMDk5LCAxMDUwLCAxMDUwLCA0OSwgMTA1MywgNH0gfQorfTsKKworLyogMTQwMHgxMDUwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNDAweDEwNTBfUkJbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCAgSFNTLCBIU0UsICAgVlQsICBWQSwgIFZCUywgVkJFLCAgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzEwMV8wMDBNLCBNMTQwMFgxMDUwX1JCX1I2MF9IU1AsCisJIE0xNDAwWDEwNTBfUkJfUjYwX1ZTUCwKKwkgezE1NjAsIDE0MDAsIDE0MDAsIDE2MCwgMTQ0OCwgMzIsIDEwODAsIDEwNTAsIDEwNTAsIDMwLCAxMDUzLCA0fSB9Cit9OworCisvKiA5NjB4NjAwIChDVlQpICovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTk2MHg2MDBbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfNDVfMjUwTSwgTTk2MFg2MDBfUjYwX0hTUCwgTTk2MFg2MDBfUjYwX1ZTUCwKKwkgezEyMTYsIDk2MCwgOTYwLCAyNTYsIDk5MiwgOTYsIDYyNCwgNjAwLCA2MDAsIDI0LCA2MDMsIDZ9IH0KK307CisKKy8qIDEwMDB4NjAwIChHVEYpICovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEwMDB4NjAwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzQ4XzAwME0sIE0xMDAwWDYwMF9SNjBfSFNQLCBNMTAwMFg2MDBfUjYwX1ZTUCwKKwkgezEyODgsIDEwMDAsIDEwMDAsIDI4OCwgMTA0MCwgMTA0LCA2MjIsIDYwMCwgNjAwLCAyMiwgNjAxLCAzfSB9Cit9OworCisvKiAxMDI0eDU3NiAoR1RGKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMDI0eDU3NltdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS180Nl85OTZNLCBNMTAyNFg1NzZfUjYwX0hTUCwgTTEwMjRYNTc2X1I2MF9WU1AsCisJIHsxMzEyLCAxMDI0LCAxMDI0LCAyODgsIDEwNjQsIDEwNCwgNTk3LCA1NzYsIDU3NiwgMjEsIDU3NywgM30gfQorfTsKKworLyogMTA4OHg2MTIgKENWVCkgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTA4OHg2MTJbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfNTJfOTc3TSwgTTEwODhYNjEyX1I2MF9IU1AsIE0xMDg4WDYxMl9SNjBfVlNQLAorCSB7MTM5MiwgMTA4OCwgMTA4OCwgMzA0LCAxMTM2LCAxMDQsIDYzNiwgNjEyLCA2MTIsIDI0LCA2MTUsIDV9IH0KK307CisKKy8qIDExNTJ4NzIwIChDVlQpICovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTExNTJ4NzIwW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzY2Xzc1ME0sIE0xMTUyWDcyMF9SNjBfSFNQLCBNMTE1Mlg3MjBfUjYwX1ZTUCwKKwkgezE0ODgsIDExNTIsIDExNTIsIDMzNiwgMTIwOCwgMTEyLCA3NDgsIDcyMCwgNzIwLCAyOCwgNzIzLCA2fSB9Cit9OworCisvKiAxMjAweDcyMCAoR1RGKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMjAweDcyMFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS183MF8xNTlNLCBNMTIwMFg3MjBfUjYwX0hTUCwgTTEyMDBYNzIwX1I2MF9WU1AsCisJIHsxNTY4LCAxMjAwLCAxMjAwLCAzNjgsIDEyNTYsIDEyOCwgNzQ2LCA3MjAsIDcyMCwgMjYsIDcyMSwgM30gfQorfTsKKworLyogMTI4MHg2MDAgKEdURikgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg2MDBbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCAgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS182MV81MDBNLCBNMTI4MHg2MDBfUjYwX0hTUCwgTTEyODB4NjAwX1I2MF9WU1AsCisJIHsxNjQ4LCAxMjgwLCAxMjgwLCAzNjgsIDEzMzYsIDEyOCwgNjIyLCA2MDAsIDYwMCwgMjIsIDYwMSwgM30gfQorfTsKKworLyogMTM2MHg3NjggKENWVCkgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTM2MHg3NjhbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfODRfNzUwTSwgTTEzNjBYNzY4X1I2MF9IU1AsIE0xMzYwWDc2OF9SNjBfVlNQLAorCSB7MTc3NiwgMTM2MCwgMTM2MCwgNDE2LCAxNDMyLCAxMzYsIDc5OCwgNzY4LCA3NjgsIDMwLCA3NzEsIDV9IH0KK307CisKKy8qIDEzNjB4NzY4IChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMzYweDc2OF9SQltdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS183Ml8wMDBNLCBNMTM2MFg3NjhfUkJfUjYwX0hTUCwKKwkgTTEzNjBYNzY4X1JCX1I2MF9WU1AsCisJIHsxNTIwLCAxMzYwLCAxMzYwLCAxNjAsIDE0MDgsIDMyLCA3OTAsIDc2OCwgNzY4LCAyMiwgNzcxLCA1fSB9Cit9OworCisvKiAxMzY2eDc2OCAoR1RGKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMzY2eDc2OFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS184NV84NjBNLCBNMTM2OFg3NjhfUjYwX0hTUCwgTTEzNjhYNzY4X1I2MF9WU1AsCisJIHsxODAwLCAxMzY4LCAxMzY4LCA0MzIsIDE0NDAsIDE0NCwgNzk1LCA3NjgsIDc2OCwgMjcsIDc2OSwgM30gfSwKKwl7UkVGUkVTSF81MCwgQ0xLXzY5XzkyNE0sIE0xMzY4WDc2OF9SNTBfSFNQLCBNMTM2OFg3NjhfUjUwX1ZTUCwKKwkgezE3NjgsIDEzNjgsIDEzNjgsIDQwMCwgMTQyNCwgMTQ0LCA3OTEsIDc2OCwgNzY4LCAyMywgNzY5LCAzfSB9Cit9OworCisvKiAxNDQweDkwMCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNDQweDkwMFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMDZfNTAwTSwgTTE0NDBYOTAwX1I2MF9IU1AsIE0xNDQwWDkwMF9SNjBfVlNQLAorCSB7MTkwNCwgMTQ0MCwgMTQ0MCwgNDY0LCAxNTIwLCAxNTIsIDkzNCwgOTAwLCA5MDAsIDM0LCA5MDMsIDZ9IH0sCisJe1JFRlJFU0hfNzUsIENMS18xMzZfNzAwTSwgTTE0NDBYOTAwX1I3NV9IU1AsIE0xNDQwWDkwMF9SNzVfVlNQLAorCSB7MTkzNiwgMTQ0MCwgMTQ0MCwgNDk2LCAxNTM2LCAxNTIsIDk0MiwgOTAwLCA5MDAsIDQyLCA5MDMsIDZ9IH0KK307CisKKy8qIDE0NDB4OTAwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNDQweDkwMF9SQltdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS184OF83NTBNLCBNMTQ0MFg5MDBfUkJfUjYwX0hTUCwKKwkgTTE0NDBYOTAwX1JCX1I2MF9WU1AsCisJIHsxNjAwLCAxNDQwLCAxNDQwLCAxNjAsIDE0ODgsIDMyLCA5MjYsIDkwMCwgOTAwLCAyNiwgOTAzLCA2fSB9Cit9OworCisvKiAxNjAweDkwMCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNjAweDkwMFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18xMThfODQwTSwgTTE2MDBYOTAwX1I2MF9IU1AsIE0xNjAwWDkwMF9SNjBfVlNQLAorCSB7MjExMiwgMTYwMCwgMTYwMCwgNTEyLCAxNjg4LCAxNjgsIDkzNCwgOTAwLCA5MDAsIDM0LCA5MDMsIDV9IH0KK307CisKKy8qIDE2MDB4OTAwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNjAweDkwMF9SQltdID0geworCS8qIHJfcmF0ZSwgICAgICAgIHZjbGssICAgICAgICAgICBoc3AsICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzk3Xzc1ME0sIE0xNjAwWDkwMF9SQl9SNjBfSFNQLAorCSBNMTYwMFg5MDBfUkJfUjYwX1ZTUCwKKwkgezE3NjAsIDE2MDAsIDE2MDAsIDE2MCwgMTY0OCwgMzIsIDkyNiwgOTAwLCA5MDAsIDI2LCA5MDMsIDV9IH0KK307CisKKy8qIDE2MDB4MTAyNCAoR1RGKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNjAweDEwMjRbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCAgSFNTLCBIU0UsICAgVlQsICBWQSwgIFZCUywgVkJFLCAgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzEzNl83MDBNLCBNMTYwMFgxMDI0X1I2MF9IU1AsIE0xNjAwWDEwMjRfUjYwX1ZTUCwKKwkgezIxNDQsIDE2MDAsIDE2MDAsIDU0NCwgMTcwNCwgMTY4LCAxMDYwLCAxMDI0LCAxMDI0LCAzNiwgMTAyNSwgM30gfQorfTsKKworLyogMTc5MngxMzQ0IChETVQpICovCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE3OTJ4MTM0NFtdID0geworCS8qIHJfcmF0ZSwgICAgICAgICAgdmNsaywgICAgICAgICAgICAgIGhzcCwgICAgICAgICAgICAgdnNwICAgKi8KKwkvKiBIVCwgIEhBLCAgSEJTLCBIQkUsICBIU1MsIEhTRSwgICBWVCwgIFZBLCAgVkJTLCBWQkUsICBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMjA0XzAwME0sIE0xNzkyeDEzNDRfUjYwX0hTUCwgTTE3OTJ4MTM0NF9SNjBfVlNQLAorCSB7MjQ0OCwgMTc5MiwgMTc5MiwgNjU2LCAxOTIwLCAyMDAsIDEzOTQsIDEzNDQsIDEzNDQsIDUwLCAxMzQ1LCAzfSB9Cit9OworCisvKiAxODU2eDEzOTIgKERNVCkgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTg1NngxMzkyW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgIEhTUywgSFNFLCAgIFZULCAgVkEsICBWQlMsIFZCRSwgIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18yMThfNTAwTSwgTTE4NTZ4MTM5Ml9SNjBfSFNQLCBNMTg1NngxMzkyX1I2MF9WU1AsCisJIHsyNTI4LCAxODU2LCAxODU2LCA2NzIsIDE5NTIsIDIyNCwgMTQzOSwgMTM5MiwgMTM5MiwgNDcsIDEzOTMsIDN9IH0KK307CisKKy8qIDE5MjB4MTIwMCAoQ1ZUKSAqLworc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xOTIweDEyMDBbXSA9IHsKKwkvKiByX3JhdGUsICAgICAgICAgIHZjbGssICAgICAgICAgICAgICBoc3AsICAgICAgICAgICAgIHZzcCAgICovCisJLyogSFQsICBIQSwgIEhCUywgSEJFLCBIU1MsIEhTRSwgVlQsICBWQSwgIFZCUywgVkJFLCBWU1MsIFZTRSAqLworCXtSRUZSRVNIXzYwLCBDTEtfMTkzXzI5NU0sIE0xOTIwWDEyMDBfUjYwX0hTUCwgTTE5MjBYMTIwMF9SNjBfVlNQLAorCSB7MjU5MiwgMTkyMCwgMTkyMCwgNjcyLCAyMDU2LCAyMDAsIDEyNDUsIDEyMDAsIDEyMDAsIDQ1LCAxMjAzLCA2fSB9Cit9OworCisvKiAxOTIweDEyMDAgKENWVCB3aXRoIFJlZHVjZSBCbGFua2luZykgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTkyMHgxMjAwX1JCW10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgSFNTLCBIU0UsIFZULCAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwl7UkVGUkVTSF82MCwgQ0xLXzE1M185MjBNLCBNMTkyMFgxMjAwX1JCX1I2MF9IU1AsCisJIE0xOTIwWDEyMDBfUkJfUjYwX1ZTUCwKKwkgezIwODAsIDE5MjAsIDE5MjAsIDE2MCwgMTk2OCwgMzIsIDEyMzUsIDEyMDAsIDEyMDAsIDM1LCAxMjAzLCA2fSB9Cit9OworCisvKiAyMDQ4eDE1MzYgKENWVCkgKi8KK3N0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMjA0OHgxNTM2W10gPSB7CisJLyogcl9yYXRlLCAgICAgICAgICB2Y2xrLCAgICAgICAgICAgICAgaHNwLCAgICAgICAgICAgICB2c3AgICAqLworCS8qIEhULCAgSEEsICBIQlMsIEhCRSwgIEhTUywgSFNFLCAgIFZULCAgVkEsICBWQlMsIFZCRSwgIFZTUywgVlNFICovCisJe1JFRlJFU0hfNjAsIENMS18yNjdfMjUwTSwgTTIwNDh4MTUzNl9SNjBfSFNQLCBNMjA0OHgxNTM2X1I2MF9WU1AsCisJIHsyODAwLCAyMDQ4LCAyMDQ4LCA3NTIsIDIyMDAsIDIyNCwgMTU5MiwgMTUzNiwgMTUzNiwgNTYsIDE1MzksIDR9IH0KK307CisKKy8qIFZpZGVvIE1vZGUgVGFibGUgKi8KKy8qIHN0cnVjdCBWaWRlb01vZGVUYWJsZSB7Ki8KKy8qICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZUluZGV4OyovCisvKiAgc3RydWN0IGNydF9tb2RlX3RhYmxlICAgICAgICAgICAgICpjcnRjOyovCisvKiAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfYXJyYXk7Ki8KKy8qIH07Ki8KK3N0cnVjdCBWaWRlb01vZGVUYWJsZSBDTEUyNjZNb2Rlc1tdID0geworCS8qIERpc3BsYXkgOiA0ODB4NjQwIChHVEYpICovCisJe1ZJQV9SRVNfNDgwWDY0MCwgQ1JUTTQ4MHg2NDAsIEFSUkFZX1NJWkUoQ1JUTTQ4MHg2NDApfSwKKworCS8qIERpc3BsYXkgOiA2NDB4NDgwICovCisJe1ZJQV9SRVNfNjQwWDQ4MCwgQ1JUTTY0MHg0ODAsIEFSUkFZX1NJWkUoQ1JUTTY0MHg0ODApfSwKKworCS8qIERpc3BsYXkgOiA3MjB4NDgwIChHVEYpICovCisJe1ZJQV9SRVNfNzIwWDQ4MCwgQ1JUTTcyMHg0ODAsIEFSUkFZX1NJWkUoQ1JUTTcyMHg0ODApfSwKKworCS8qIERpc3BsYXkgOiA3MjB4NTc2IChHVEYpICovCisJe1ZJQV9SRVNfNzIwWDU3NiwgQ1JUTTcyMHg1NzYsIEFSUkFZX1NJWkUoQ1JUTTcyMHg1NzYpfSwKKworCS8qIERpc3BsYXkgOiA4MDB4NjAwICovCisJe1ZJQV9SRVNfODAwWDYwMCwgQ1JUTTgwMHg2MDAsIEFSUkFZX1NJWkUoQ1JUTTgwMHg2MDApfSwKKworCS8qIERpc3BsYXkgOiA4MDB4NDgwIChDVlQpICovCisJe1ZJQV9SRVNfODAwWDQ4MCwgQ1JUTTgwMHg0ODAsIEFSUkFZX1NJWkUoQ1JUTTgwMHg0ODApfSwKKworCS8qIERpc3BsYXkgOiA4NDh4NDgwIChDVlQpICovCisJe1ZJQV9SRVNfODQ4WDQ4MCwgQ1JUTTg0OHg0ODAsIEFSUkFZX1NJWkUoQ1JUTTg0OHg0ODApfSwKKworCS8qIERpc3BsYXkgOiA4NTJ4NDgwIChHVEYpICovCisJe1ZJQV9SRVNfODU2WDQ4MCwgQ1JUTTg1Mng0ODAsIEFSUkFZX1NJWkUoQ1JUTTg1Mng0ODApfSwKKworCS8qIERpc3BsYXkgOiAxMDI0eDUxMiAoR1RGKSAqLworCXtWSUFfUkVTXzEwMjRYNTEyLCBDUlRNMTAyNHg1MTIsIEFSUkFZX1NJWkUoQ1JUTTEwMjR4NTEyKX0sCisKKwkvKiBEaXNwbGF5IDogMTAyNHg2MDAgKi8KKwl7VklBX1JFU18xMDI0WDYwMCwgQ1JUTTEwMjR4NjAwLCBBUlJBWV9TSVpFKENSVE0xMDI0eDYwMCl9LAorCisJLyogRGlzcGxheSA6IDEwMjR4NTc2IChHVEYpICovCisJLyp7IFZJQV9SRVNfMTAyNFg1NzYsIENSVE0xMDI0eDU3NiwgQVJSQVlfU0laRShDUlRNMTAyNHg1NzYpfSwgKi8KKworCS8qIERpc3BsYXkgOiAxMDI0eDc2OCAqLworCXtWSUFfUkVTXzEwMjRYNzY4LCBDUlRNMTAyNHg3NjgsIEFSUkFZX1NJWkUoQ1JUTTEwMjR4NzY4KX0sCisKKwkvKiBEaXNwbGF5IDogMTE1Mng4NjQgKi8KKwl7VklBX1JFU18xMTUyWDg2NCwgQ1JUTTExNTJ4ODY0LCBBUlJBWV9TSVpFKENSVE0xMTUyeDg2NCl9LAorCisJLyogRGlzcGxheSA6IDEyODB4NzY4IChHVEYpICovCisJe1ZJQV9SRVNfMTI4MFg3NjgsIENSVE0xMjgweDc2OCwgQVJSQVlfU0laRShDUlRNMTI4MHg3NjgpfSwKKworCS8qIERpc3BsYXkgOiA5NjB4NjAwIChDVlQpICovCisJe1ZJQV9SRVNfOTYwWDYwMCwgQ1JUTTk2MHg2MDAsIEFSUkFZX1NJWkUoQ1JUTTk2MHg2MDApfSwKKworCS8qIERpc3BsYXkgOiAxMDAweDYwMCAoR1RGKSAqLworCXtWSUFfUkVTXzEwMDBYNjAwLCBDUlRNMTAwMHg2MDAsIEFSUkFZX1NJWkUoQ1JUTTEwMDB4NjAwKX0sCisKKwkvKiBEaXNwbGF5IDogMTAyNHg1NzYgKEdURikgKi8KKwl7VklBX1JFU18xMDI0WDU3NiwgQ1JUTTEwMjR4NTc2LCBBUlJBWV9TSVpFKENSVE0xMDI0eDU3Nil9LAorCisJLyogRGlzcGxheSA6IDEwODh4NjEyIChHVEYpICovCisJe1ZJQV9SRVNfMTA4OFg2MTIsIENSVE0xMDg4eDYxMiwgQVJSQVlfU0laRShDUlRNMTA4OHg2MTIpfSwKKworCS8qIERpc3BsYXkgOiAxMTUyeDcyMCAoQ1ZUKSAqLworCXtWSUFfUkVTXzExNTJYNzIwLCBDUlRNMTE1Mng3MjAsIEFSUkFZX1NJWkUoQ1JUTTExNTJ4NzIwKX0sCisKKwkvKiBEaXNwbGF5IDogMTIwMHg3MjAgKEdURikgKi8KKwl7VklBX1JFU18xMjAwWDcyMCwgQ1JUTTEyMDB4NzIwLCBBUlJBWV9TSVpFKENSVE0xMjAweDcyMCl9LAorCisJLyogRGlzcGxheSA6IDEyODB4NjAwIChHVEYpICovCisJe1ZJQV9SRVNfMTI4MFg2MDAsIENSVE0xMjgweDYwMCwgQVJSQVlfU0laRShDUlRNMTI4MHg2MDApfSwKKworCS8qIERpc3BsYXkgOiAxMjgweDgwMCAoQ1ZUKSAqLworCXtWSUFfUkVTXzEyODBYODAwLCBDUlRNMTI4MHg4MDAsIEFSUkFZX1NJWkUoQ1JUTTEyODB4ODAwKX0sCisKKwkvKiBEaXNwbGF5IDogMTI4MHg4MDAgKEdURikgKi8KKwkvKnsgTTEyODB4ODAwLCBDUlRNMTI4MHg4MDAsIEFSUkFZX1NJWkUoQ1JUTTEyODB4ODAwKX0sICovCisKKwkvKiBEaXNwbGF5IDogMTI4MHg5NjAgKi8KKwl7VklBX1JFU18xMjgwWDk2MCwgQ1JUTTEyODB4OTYwLCBBUlJBWV9TSVpFKENSVE0xMjgweDk2MCl9LAorCisJLyogRGlzcGxheSA6IDEyODB4MTAyNCAqLworCXtWSUFfUkVTXzEyODBYMTAyNCwgQ1JUTTEyODB4MTAyNCwgQVJSQVlfU0laRShDUlRNMTI4MHgxMDI0KX0sCisKKwkvKiBEaXNwbGF5IDogMTM2MHg3NjggKENWVCkgKi8KKwl7VklBX1JFU18xMzYwWDc2OCwgQ1JUTTEzNjB4NzY4LCBBUlJBWV9TSVpFKENSVE0xMzYweDc2OCl9LAorCisJLyogRGlzcGxheSA6IDEzNjB4NzY4IChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworCXtWSUFfUkVTXzEzNjBYNzY4X1JCLCBDUlRNMTM2MHg3NjhfUkIsCisJIEFSUkFZX1NJWkUoQ1JUTTEzNjB4NzY4X1JCKX0sCisKKwkvKiBEaXNwbGF5IDogMTM2Nng3NjggKi8KKwl7VklBX1JFU18xMzY2WDc2OCwgQ1JUTTEzNjZ4NzY4LCBBUlJBWV9TSVpFKENSVE0xMzY2eDc2OCl9LAorCisJLyogRGlzcGxheSA6IDEzNjh4NzY4IChHVEYpICovCisJLyp7IE0xMzY4eDc2OCxDUlRNMTM2OHg3NjgsQVJSQVlfU0laRShDUlRNMTM2OHg3NjgpfSwgKi8KKwkvKiBEaXNwbGF5IDogMTM2OHg3NjggKEdURikgKi8KKwl7VklBX1JFU18xMzY4WDc2OCwgQ1JUTTEzNjh4NzY4LCBBUlJBWV9TSVpFKENSVE0xMzY4eDc2OCl9LAorCisJLyogRGlzcGxheSA6IDE0NDB4OTAwIChDVlQpICovCisJe1ZJQV9SRVNfMTQ0MFg5MDAsIENSVE0xNDQweDkwMCwgQVJSQVlfU0laRShDUlRNMTQ0MHg5MDApfSwKKworCS8qIERpc3BsYXkgOiAxNDQweDkwMCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KKwl7VklBX1JFU18xNDQwWDkwMF9SQiwgQ1JUTTE0NDB4OTAwX1JCLAorCSBBUlJBWV9TSVpFKENSVE0xNDQweDkwMF9SQil9LAorCisJLyogRGlzcGxheSA6IDE0NDB4MTA1MCAoR1RGKSAqLworCXtWSUFfUkVTXzE0NDBYMTA1MCwgQ1JUTTE0NDB4MTA1MCwgQVJSQVlfU0laRShDUlRNMTQ0MHgxMDUwKX0sCisKKwkvKiBEaXNwbGF5IDogMTQwMHgxMDUwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworCXtWSUFfUkVTXzE0MDBYMTA1MF9SQiwgQ1JUTTE0MDB4MTA1MF9SQiwKKwkgQVJSQVlfU0laRShDUlRNMTQwMHgxMDUwX1JCKX0sCisKKwkvKiBEaXNwbGF5IDogMTYwMHg5MDAgKENWVCkgKi8KKwl7VklBX1JFU18xNjAwWDkwMCwgQ1JUTTE2MDB4OTAwLCBBUlJBWV9TSVpFKENSVE0xNjAweDkwMCl9LAorCisJLyogRGlzcGxheSA6IDE2MDB4OTAwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworCXtWSUFfUkVTXzE2MDBYOTAwX1JCLCBDUlRNMTYwMHg5MDBfUkIsCisJIEFSUkFZX1NJWkUoQ1JUTTE2MDB4OTAwX1JCKX0sCisKKwkvKiBEaXNwbGF5IDogMTYwMHgxMDI0IChHVEYpICovCisJe1ZJQV9SRVNfMTYwMFgxMDI0LCBDUlRNMTYwMHgxMDI0LCBBUlJBWV9TSVpFKENSVE0xNjAweDEwMjQpfSwKKworCS8qIERpc3BsYXkgOiAxNjAweDEyMDAgKi8KKwl7VklBX1JFU18xNjAwWDEyMDAsIENSVE0xNjAweDEyMDAsIEFSUkFZX1NJWkUoQ1JUTTE2MDB4MTIwMCl9LAorCisJLyogRGlzcGxheSA6IDE2ODB4MTA1MCAoQ1ZUKSAqLworCXtWSUFfUkVTXzE2ODBYMTA1MCwgQ1JUTTE2ODB4MTA1MCwgQVJSQVlfU0laRShDUlRNMTY4MHgxMDUwKX0sCisKKwkvKiBEaXNwbGF5IDogMTY4MHgxMDUwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworCXtWSUFfUkVTXzE2ODBYMTA1MF9SQiwgQ1JUTTE2ODB4MTA1MF9SQiwKKwkgQVJSQVlfU0laRShDUlRNMTY4MHgxMDUwX1JCKX0sCisKKwkvKiBEaXNwbGF5IDogMTc5MngxMzQ0IChETVQpICovCisJe1ZJQV9SRVNfMTc5MlgxMzQ0LCBDUlRNMTc5MngxMzQ0LCBBUlJBWV9TSVpFKENSVE0xNzkyeDEzNDQpfSwKKworCS8qIERpc3BsYXkgOiAxODU2eDEzOTIgKERNVCkgKi8KKwl7VklBX1JFU18xODU2WDEzOTIsIENSVE0xODU2eDEzOTIsIEFSUkFZX1NJWkUoQ1JUTTE4NTZ4MTM5Mil9LAorCisJLyogRGlzcGxheSA6IDE5MjB4MTQ0MCAqLworCXtWSUFfUkVTXzE5MjBYMTQ0MCwgQ1JUTTE5MjB4MTQ0MCwgQVJSQVlfU0laRShDUlRNMTkyMHgxNDQwKX0sCisKKwkvKiBEaXNwbGF5IDogMjA0OHgxNTM2ICovCisJe1ZJQV9SRVNfMjA0OFgxNTM2LCBDUlRNMjA0OHgxNTM2LCBBUlJBWV9TSVpFKENSVE0yMDQ4eDE1MzYpfSwKKworCS8qIERpc3BsYXkgOiAxMjgweDcyMCAqLworCXtWSUFfUkVTXzEyODBYNzIwLCBDUlRNMTI4MHg3MjAsIEFSUkFZX1NJWkUoQ1JUTTEyODB4NzIwKX0sCisKKwkvKiBEaXNwbGF5IDogMTkyMHgxMDgwIChDVlQpICovCisJe1ZJQV9SRVNfMTkyMFgxMDgwLCBDUlRNMTkyMHgxMDgwLCBBUlJBWV9TSVpFKENSVE0xOTIweDEwODApfSwKKworCS8qIERpc3BsYXkgOiAxOTIweDEwODAgKENWVCBSZWR1Y2UgQmxhbmtpbmcpICovCisJe1ZJQV9SRVNfMTkyMFgxMDgwX1JCLCBDUlRNMTkyMHgxMDgwX1JCLAorCSBBUlJBWV9TSVpFKENSVE0xOTIweDEwODBfUkIpfSwKKworCS8qIERpc3BsYXkgOiAxOTIweDEyMDAgKENWVCkgKi8KKwl7VklBX1JFU18xOTIwWDEyMDAsIENSVE0xOTIweDEyMDAsIEFSUkFZX1NJWkUoQ1JUTTE5MjB4MTIwMCl9LAorCisJLyogRGlzcGxheSA6IDE5MjB4MTIwMCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KKwl7VklBX1JFU18xOTIwWDEyMDBfUkIsIENSVE0xOTIweDEyMDBfUkIsCisJIEFSUkFZX1NJWkUoQ1JUTTE5MjB4MTIwMF9SQil9LAorCisJLyogRGlzcGxheSA6IDE0MDB4MTA1MCAoQ1ZUKSAqLworCXtWSUFfUkVTXzE0MDBYMTA1MCwgQ1JUTTE0MDB4MTA1MCwgQVJSQVlfU0laRShDUlRNMTQwMHgxMDUwKX0KK307CitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ0VBTTEyODB4NzIwW10gPSB7CisJe1JFRlJFU0hfNjAsIENMS183NF8yNzBNLCBNMTI4MFg3MjBfQ0VBX1I2MF9IU1AsCisJIE0xMjgwWDcyMF9DRUFfUjYwX1ZTUCwKKwkgLyogSFQsICAgIEhBLCAgIEhCUywgIEhCRSwgIEhTUywgSFNFLCAgVlQsICAgVkEsICBWQlMsIFZCRSwgVlNTLCBWU0UgKi8KKwkgezE2NTAsIDEyODAsIDEyODAsIDM3MCwgMTM5MCwgNDAsIDc1MCwgNzIwLCA3MjAsIDMwLCA3MjUsIDV9IH0KK307CitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ0VBTTE5MjB4MTA4MFtdID0geworCXtSRUZSRVNIXzYwLCBDTEtfMTQ4XzUwME0sIE0xOTIwWDEwODBfQ0VBX1I2MF9IU1AsCisJIE0xOTIwWDEwODBfQ0VBX1I2MF9WU1AsCisJIC8qIEhULCAgICBIQSwgICBIQlMsICBIQkUsICBIU1MsIEhTRSwgIFZULCAgVkEsIFZCUywgVkJFLCAgVlNTLCBWU0UgKi8KKwkgezIyMDAsIDE5MjAsIDE5MjAsIDMwMCwgMjAwOCwgNDQsIDExMjUsIDEwODAsIDEwODAsIDQ1LCAxMDg0LCA1fSB9Cit9Oworc3RydWN0IFZpZGVvTW9kZVRhYmxlIENFQV9IRE1JX01vZGVzW10gPSB7CisJLyogRGlzcGxheSA6IDEyODB4NzIwICovCisJe1ZJQV9SRVNfMTI4MFg3MjAsIENFQU0xMjgweDcyMCwgQVJSQVlfU0laRShDRUFNMTI4MHg3MjApfSwKKwl7VklBX1JFU18xOTIwWDEwODAsIENFQU0xOTIweDEwODAsIEFSUkFZX1NJWkUoQ0VBTTE5MjB4MTA4MCl9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5oIGIvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWRlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19WSUFNT0RFX0hfXworI2RlZmluZSBfX1ZJQU1PREVfSF9fCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKworc3RydWN0IFZQSVRUYWJsZSB7CisJdW5zaWduZWQgY2hhciBNaXNjOworCXVuc2lnbmVkIGNoYXIgU1JbU3RkU1JdOworCXVuc2lnbmVkIGNoYXIgR1JbU3RkR1JdOworCXVuc2lnbmVkIGNoYXIgQVJbU3RkQVJdOworfTsKKworc3RydWN0IFZpZGVvTW9kZVRhYmxlIHsKKwlpbnQgTW9kZUluZGV4OworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0YzsKKwlpbnQgbW9kZV9hcnJheTsKK307CisKK3N0cnVjdCBwYXRjaF90YWJsZSB7CisJaW50IG1vZGVfaW5kZXg7CisJaW50IHRhYmxlX2xlbmd0aDsKKwlzdHJ1Y3QgaW9fcmVnICppb19yZWdfdGFibGU7Cit9OworCitzdHJ1Y3QgcmVzX21hcF9yZWZyZXNoIHsKKwlpbnQgaHJlczsKKwlpbnQgdnJlczsKKwlpbnQgcGl4Y2xvY2s7CisJaW50IHZtb2RlX3JlZnJlc2g7Cit9OworCisjZGVmaW5lIE5VTV9UT1RBTF9SRVNfTUFQX1JFRlJFU0ggQVJSQVlfU0laRShyZXNfbWFwX3JlZnJlc2hfdGJsKQorI2RlZmluZSBOVU1fVE9UQUxfQ0VBX01PREVTICBBUlJBWV9TSVpFKENFQV9IRE1JX01vZGVzKQorI2RlZmluZSBOVU1fVE9UQUxfQ040MDBfTW9kZVhyZWdzIEFSUkFZX1NJWkUoQ040MDBfTW9kZVhyZWdzKQorI2RlZmluZSBOVU1fVE9UQUxfQ043MDBfTW9kZVhyZWdzIEFSUkFZX1NJWkUoQ043MDBfTW9kZVhyZWdzKQorI2RlZmluZSBOVU1fVE9UQUxfS000MDBfTW9kZVhyZWdzIEFSUkFZX1NJWkUoS000MDBfTW9kZVhyZWdzKQorI2RlZmluZSBOVU1fVE9UQUxfQ1g3MDBfTW9kZVhyZWdzIEFSUkFZX1NJWkUoQ1g3MDBfTW9kZVhyZWdzKQorI2RlZmluZSBOVU1fVE9UQUxfVlg4MDBfTW9kZVhyZWdzIEFSUkFZX1NJWkUoVlg4MDBfTW9kZVhyZWdzKQorI2RlZmluZSBOVU1fVE9UQUxfQ0xFMjY2X01vZGVYcmVncyBBUlJBWV9TSVpFKENMRTI2Nl9Nb2RlWHJlZ3MpCisjZGVmaW5lIE5VTV9UT1RBTF9QQVRDSF9NT0RFIEFSUkFZX1NJWkUocmVzX3BhdGNoX3RhYmxlKQorI2RlZmluZSBOVU1fVE9UQUxfTU9ERVRBQkxFIEFSUkFZX1NJWkUoQ0xFMjY2TW9kZXMpCisKKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZGUgVGFibGUgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKworLyogNDgweDY0MCAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNNDgweDY0MFsxXTsKKy8qIDY0MHg0ODAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNNjQweDQ4MFs1XTsKKy8qNzIweDQ4MCAoR1RGKSovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE03MjB4NDgwWzFdOworLyo3MjB4NTc2IChHVEYpKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTcyMHg1NzZbMV07CisvKiA4MDB4NDgwIChDVlQpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE04MDB4NDgwWzFdOworLyogODAweDYwMCovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE04MDB4NjAwWzVdOworLyogODQ4eDQ4MCAoQ1ZUKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNODQ4eDQ4MFsxXTsKKy8qODU2eDQ4MCAoR1RGKSBjb252ZXJ0IHRvIDg1Mng0ODAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNODUyeDQ4MFsxXTsKKy8qMTAyNHg1MTIgKEdURikqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTAyNHg1MTJbMV07CisvKiAxMDI0eDYwMCovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMDI0eDYwMFsxXTsKKy8qIDEwMjR4NzY4Ki8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEwMjR4NzY4WzRdOworLyogMTE1Mng4NjQqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTE1Mng4NjRbMV07CisvKiAxMjgweDcyMCAoSERNSSA3MjBQKSovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMjgweDcyMFsyXTsKKy8qMTI4MHg3NjggKEdURikqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg3NjhbMl07CisvKiAxMjgweDgwMCAoQ1ZUKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg4MDBbMV07CisvKjEyODB4OTYwKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEyODB4OTYwWzFdOworLyogMTI4MHgxMDI0Ki8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEyODB4MTAyNFszXTsKKy8qIDEzNjh4NzY4IChHVEYpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xMzY4eDc2OFsxXTsKKy8qMTQ0MHgxMDUwIChHVEYpKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0NDB4MTA1MFsxXTsKKy8qIDE2MDB4MTIwMCovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNjAweDEyMDBbMl07CisvKiAxNjgweDEwNTAgKENWVCkgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE2ODB4MTA1MFsyXTsKKy8qIDE2ODB4MTA1MCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE2ODB4MTA1MF9SQlsxXTsKKy8qIDE5MjB4MTA4MCAoQ1ZUKSovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xOTIweDEwODBbMV07CisvKiAxOTIweDEwODAgKENWVCB3aXRoIFJlZHVjZSBCbGFua2luZykgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE5MjB4MTA4MF9SQlsxXTsKKy8qIDE5MjB4MTQ0MCovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xOTIweDE0NDBbMl07CisvKiAxNDAweDEwNTAgKENWVCkgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0MDB4MTA1MFsyXTsKKy8qIDE0MDB4MTA1MCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0MDB4MTA1MF9SQlsxXTsKKy8qIDk2MHg2MDAgKENWVCkgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTk2MHg2MDBbMV07CisvKiAxMDAweDYwMCAoR1RGKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTAwMHg2MDBbMV07CisvKiAxMDI0eDU3NiAoR1RGKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTAyNHg1NzZbMV07CisvKiAxMDg4eDYxMiAoQ1ZUKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTA4OHg2MTJbMV07CisvKiAxMTUyeDcyMCAoQ1ZUKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTE1Mng3MjBbMV07CisvKiAxMjAweDcyMCAoR1RGKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTIwMHg3MjBbMV07CisvKiAxMjgweDYwMCAoR1RGKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTI4MHg2MDBbMV07CisvKiAxMzYweDc2OCAoQ1ZUKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTM2MHg3NjhbMV07CisvKiAxMzYweDc2OCAoQ1ZUIFJlZHVjZSBCbGFua2luZykgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEzNjB4NzY4X1JCWzFdOworLyogMTM2Nng3NjggKEdURikgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTEzNjZ4NzY4WzJdOworLyogMTQ0MHg5MDAgKENWVCkgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE0NDB4OTAwWzJdOworLyogMTQ0MHg5MDAgKENWVCBSZWR1Y2UgQmxhbmtpbmcpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNDQweDkwMF9SQlsxXTsKKy8qIDE2MDB4OTAwIChDVlQpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xNjAweDkwMFsxXTsKKy8qIDE2MDB4OTAwIChDVlQgUmVkdWNlIEJsYW5raW5nKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTYwMHg5MDBfUkJbMV07CisvKiAxNjAweDEwMjQgKEdURikgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE2MDB4MTAyNFsxXTsKKy8qIDE3OTJ4MTM0NCAoRE1UKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTc5MngxMzQ0WzFdOworLyogMTg1NngxMzkyIChETVQpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0xODU2eDEzOTJbMV07CisvKiAxOTIweDEyMDAgKENWVCkgKi8KK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ1JUTTE5MjB4MTIwMFsxXTsKKy8qIDE5MjB4MTIwMCAoQ1ZUIHdpdGggUmVkdWNlIEJsYW5raW5nKSAqLworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDUlRNMTkyMHgxMjAwX1JCWzFdOworLyogMjA0OHgxNTM2IChDVlQpICovCitleHRlcm4gc3RydWN0IGNydF9tb2RlX3RhYmxlIENSVE0yMDQ4eDE1MzZbMV07CitleHRlcm4gc3RydWN0IFZpZGVvTW9kZVRhYmxlIENMRTI2Nk1vZGVzWzQ3XTsKK2V4dGVybiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgQ0VBTTEyODB4NzIwWzFdOworZXh0ZXJuIHN0cnVjdCBjcnRfbW9kZV90YWJsZSBDRUFNMTkyMHgxMDgwWzFdOworZXh0ZXJuIHN0cnVjdCBWaWRlb01vZGVUYWJsZSBDRUFfSERNSV9Nb2Rlc1syXTsKKworZXh0ZXJuIHN0cnVjdCByZXNfbWFwX3JlZnJlc2ggcmVzX21hcF9yZWZyZXNoX3RibFs2MV07CitleHRlcm4gc3RydWN0IGlvX3JlZyBDTjQwMF9Nb2RlWHJlZ3NbNTJdOworZXh0ZXJuIHN0cnVjdCBpb19yZWcgQ043MDBfTW9kZVhyZWdzWzY2XTsKK2V4dGVybiBzdHJ1Y3QgaW9fcmVnIEtNNDAwX01vZGVYcmVnc1s1NV07CitleHRlcm4gc3RydWN0IGlvX3JlZyBDWDcwMF9Nb2RlWHJlZ3NbNThdOworZXh0ZXJuIHN0cnVjdCBpb19yZWcgVlg4MDBfTW9kZVhyZWdzWzU4XTsKK2V4dGVybiBzdHJ1Y3QgaW9fcmVnIENMRTI2Nl9Nb2RlWHJlZ3NbMzJdOworZXh0ZXJuIHN0cnVjdCBpb19yZWcgUE0xMDI0eDc2OFsyXTsKK2V4dGVybiBzdHJ1Y3QgcGF0Y2hfdGFibGUgcmVzX3BhdGNoX3RhYmxlWzFdOworZXh0ZXJuIHN0cnVjdCBWUElUVGFibGUgVlBJVDsKKyNlbmRpZiAvKiBfX1ZJQU1PREVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92dDE2MzYuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3Z0MTYzNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMmE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92dDE2MzYuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDggVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwOCBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKiBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUzsgd2l0aG91dCBldmVuCisgKiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFLlNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImdsb2JhbC5oIgorCit1OCB2aWFmYl9ncGlvX2kyY19yZWFkX2x2ZHMoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCSpwbHZkc19zZXR0aW5nX2luZm8sIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbywKKwl1OCBpbmRleCkKK3sKKwl1OCBkYXRhOworCisJdmlhcGFyaW5mby0+aTJjX3N0dWZmLmkyY19wb3J0ID0gcGx2ZHNfY2hpcF9pbmZvLT5pMmNfcG9ydDsKKwl2aWFmYl9pMmNfcmVhZGJ5dGUocGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfc2xhdmVfYWRkciwgaW5kZXgsICZkYXRhKTsKKworCXJldHVybiBkYXRhOworfQorCit2b2lkIHZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcyhzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJCQkgICAgICAqcGx2ZHNfc2V0dGluZ19pbmZvLCBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCisJCQkgICAgICAqcGx2ZHNfY2hpcF9pbmZvLCBzdHJ1Y3QgSU9EQVRBIGlvX2RhdGEpCit7CisJaW50IGluZGV4LCBkYXRhOworCisJdmlhcGFyaW5mby0+aTJjX3N0dWZmLmkyY19wb3J0ID0gcGx2ZHNfY2hpcF9pbmZvLT5pMmNfcG9ydDsKKworCWluZGV4ID0gaW9fZGF0YS5JbmRleDsKKwlkYXRhID0gdmlhZmJfZ3Bpb19pMmNfcmVhZF9sdmRzKHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvLAorCQlpbmRleCk7CisJZGF0YSA9IChkYXRhICYgKH5pb19kYXRhLk1hc2spKSB8IGlvX2RhdGEuRGF0YTsKKworCXZpYWZiX2kyY193cml0ZWJ5dGUocGx2ZHNfY2hpcF9pbmZvLT5sdmRzX2NoaXBfc2xhdmVfYWRkciwgaW5kZXgsIGRhdGEpOworfQorCit2b2lkIHZpYWZiX2luaXRfbHZkc192dDE2MzYoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCSpwbHZkc19zZXR0aW5nX2luZm8sIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpbnQgcmVnX251bSwgaTsKKworCS8qIENvbW1vbiBzZXR0aW5nczogKi8KKwlyZWdfbnVtID0gQVJSQVlfU0laRShDT01NT05fSU5JVF9UQkxfVlQxNjM2KTsKKworCWZvciAoaSA9IDA7IGkgPCByZWdfbnVtOyBpKyspIHsKKwkJdmlhZmJfZ3Bpb19pMmNfd3JpdGVfbWFza19sdmRzKHBsdmRzX3NldHRpbmdfaW5mbywKKwkJCQkJIHBsdmRzX2NoaXBfaW5mbywKKwkJCQkJIENPTU1PTl9JTklUX1RCTF9WVDE2MzZbaV0pOworCX0KKworCS8qIElucHV0IERhdGEgTW9kZSBTZWxlY3QgKi8KKwlpZiAocGx2ZHNfc2V0dGluZ19pbmZvLT5kZXZpY2VfbGNkX2R1YWxlZGdlKSB7CisJCXZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcyhwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJCSBwbHZkc19jaGlwX2luZm8sCisJCQkJCSBEVUFMX0NIQU5ORUxfRU5BQkxFX1RCTF9WVDE2MzZbMF0pOworCX0gZWxzZSB7CisJCXZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcyhwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJCSBwbHZkc19jaGlwX2luZm8sCisJCQkJCSBTSU5HTEVfQ0hBTk5FTF9FTkFCTEVfVEJMX1ZUMTYzNlswXSk7CisJfQorCisJaWYgKHBsdmRzX3NldHRpbmdfaW5mby0+TENERGl0aGVyaW5nKSB7CisJCXZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcyhwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJCSBwbHZkc19jaGlwX2luZm8sCisJCQkJCSBESVRIRVJJTkdfRU5BQkxFX1RCTF9WVDE2MzZbMF0pOworCX0gZWxzZSB7CisJCXZpYWZiX2dwaW9faTJjX3dyaXRlX21hc2tfbHZkcyhwbHZkc19zZXR0aW5nX2luZm8sCisJCQkJCSBwbHZkc19jaGlwX2luZm8sCisJCQkJCSBESVRIRVJJTkdfRElTQUJMRV9UQkxfVlQxNjM2WzBdKTsKKwl9Cit9CisKK3ZvaWQgdmlhZmJfZW5hYmxlX2x2ZHNfdnQxNjM2KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSpwbHZkc19zZXR0aW5nX2luZm8sCisJCQlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit7CisKKwl2aWFmYl9ncGlvX2kyY193cml0ZV9tYXNrX2x2ZHMocGx2ZHNfc2V0dGluZ19pbmZvLCBwbHZkc19jaGlwX2luZm8sCisJCQkJIFZERF9PTl9UQkxfVlQxNjM2WzBdKTsKKworCS8qIFBhZCBvbjogKi8KKwlzd2l0Y2ggKHBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSkgeworCWNhc2UgSU5URVJGQUNFX0RWUDA6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUUsIFZJQVNSLCAweEMwLCAweEMwKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIElOVEVSRkFDRV9EVlAxOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFFLCBWSUFTUiwgMHgzMCwgMHgzMCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJTlRFUkZBQ0VfREZQX0xPVzoKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IyQSwgVklBU1IsIDB4MDMsIDB4MDMpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSU5URVJGQUNFX0RGUF9ISUdIOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMHgwMywgMHgwQyk7CisJCQlicmVhazsKKwkJfQorCisJfQorfQorCit2b2lkIHZpYWZiX2Rpc2FibGVfbHZkc192dDE2MzYoc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgorCQkJICpwbHZkc19zZXR0aW5nX2luZm8sCisJCQkgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKQoreworCisJdmlhZmJfZ3Bpb19pMmNfd3JpdGVfbWFza19sdmRzKHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvLAorCQkJCSBWRERfT0ZGX1RCTF9WVDE2MzZbMF0pOworCisJLyogUGFkIG9mZjogKi8KKwlzd2l0Y2ggKHBsdmRzX2NoaXBfaW5mby0+b3V0cHV0X2ludGVyZmFjZSkgeworCWNhc2UgSU5URVJGQUNFX0RWUDA6CisJCXsKKwkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKFNSMUUsIFZJQVNSLCAweDAwLCAweEMwKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIElOVEVSRkFDRV9EVlAxOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjFFLCBWSUFTUiwgMHgwMCwgMHgzMCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBJTlRFUkZBQ0VfREZQX0xPVzoKKwkJeworCQkJdmlhZmJfd3JpdGVfcmVnX21hc2soU1IyQSwgVklBU1IsIDB4MDAsIDB4MDMpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgSU5URVJGQUNFX0RGUF9ISUdIOgorCQl7CisJCQl2aWFmYl93cml0ZV9yZWdfbWFzayhTUjJBLCBWSUFTUiwgMHgwMCwgMHgwQyk7CisJCQlicmVhazsKKwkJfQorCisJfQorfQorCitib29sIHZpYWZiX2x2ZHNfaWRlbnRpZnlfdnQxNjM2KHZvaWQpCit7CisJdTggQnVmZmVyWzJdOworCisJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfbHZkc19pZGVudGlmeV92dDE2MzYuXG4iKTsKKworCS8qIFNlbnNlIFZUMTYzNiBMVkRTIFRyYW5zbWl0ZXIgKi8KKwl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9zbGF2ZV9hZGRyID0KKwlWVDE2MzZfTFZEU19JMkNfQUREUjsKKworCS8qIENoZWNrIHZlbmRvciBJRCBmaXJzdDogKi8KKwl2aWFmYl9pMmNfcmVhZGJ5dGUoKHU4KSB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLgorCWx2ZHNfY2hpcF9zbGF2ZV9hZGRyLAorCQkgICAgMHgwMCwgJkJ1ZmZlclswXSk7CisJdmlhZmJfaTJjX3JlYWRieXRlKCh1OCkgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby4KKwkJbHZkc19jaGlwX3NsYXZlX2FkZHIsCisJCSAgICAweDAxLCAmQnVmZmVyWzFdKTsKKworCWlmICghKChCdWZmZXJbMF0gPT0gMHgwNikgJiYgKEJ1ZmZlclsxXSA9PSAweDExKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIENoZWNrIENoaXAgSUQ6ICovCisJdmlhZmJfaTJjX3JlYWRieXRlKCh1OCkgdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5sdmRzX2NoaXBfaW5mby4KKwlsdmRzX2NoaXBfc2xhdmVfYWRkciwKKwkJICAgIDB4MDIsICZCdWZmZXJbMF0pOworCXZpYWZiX2kyY19yZWFkYnl0ZSgodTgpIHZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8uCisJCWx2ZHNfY2hpcF9zbGF2ZV9hZGRyLAorCQkgICAgMHgwMywgJkJ1ZmZlclsxXSk7CisJaWYgKChCdWZmZXJbMF0gPT0gMHg0NSkgJiYgKEJ1ZmZlclsxXSA9PSAweDMzKSkgeworCQl2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvLmx2ZHNfY2hpcF9uYW1lID0KKwkJCVZUMTYzNl9MVkRTOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Nsa19yYW5nZV9pbmRleCh1MzIgQ2xrKQoreworCWlmIChDbGsgPCBEUEFfQ0xLXzMwTSkKKwkJcmV0dXJuIERQQV9DTEtfUkFOR0VfMzBNOworCWVsc2UgaWYgKENsayA8IERQQV9DTEtfNTBNKQorCQlyZXR1cm4gRFBBX0NMS19SQU5HRV8zMF81ME07CisJZWxzZSBpZiAoQ2xrIDwgRFBBX0NMS183ME0pCisJCXJldHVybiBEUEFfQ0xLX1JBTkdFXzUwXzcwTTsKKwllbHNlIGlmIChDbGsgPCBEUEFfQ0xLXzEwME0pCisJCXJldHVybiBEUEFfQ0xLX1JBTkdFXzcwXzEwME07CisJZWxzZSBpZiAoQ2xrIDwgRFBBX0NMS18xNTBNKQorCQlyZXR1cm4gRFBBX0NMS19SQU5HRV8xMDBfMTUwTTsKKwllbHNlCisJCXJldHVybiBEUEFfQ0xLX1JBTkdFXzE1ME07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2x2ZHNfZHBhX3NldHRpbmdfaW5kZXgoaW50IHBhbmVsX3NpemVfaWQsCisJCQkgICAgIHN0cnVjdCBWVDE2MzZfRFBBX1NFVFRJTkcgKnBfdnQxNjM2X2RwYXNldHRpbmdfdGJsLAorCQkJICAgICAgIGludCB0Ymxfc2l6ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0Ymxfc2l6ZTsgaSsrKSB7CisJCWlmIChwYW5lbF9zaXplX2lkID09IHBfdnQxNjM2X2RwYXNldHRpbmdfdGJsLT5QYW5lbFNpemVJRCkKKwkJCXJldHVybiBpOworCisJCXBfdnQxNjM2X2RwYXNldHRpbmdfdGJsKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kcGFfdnQxNjM2KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkqcGx2ZHNfc2V0dGluZ19pbmZvLCBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8sCisJCSAgICBzdHJ1Y3QgVlQxNjM2X0RQQV9TRVRUSU5HICpwX3Z0MTYzNl9kcGFfc2V0dGluZykKK3sKKwlzdHJ1Y3QgSU9EQVRBIGlvX2RhdGE7CisKKwlpb19kYXRhLkluZGV4ID0gMHgwOTsKKwlpb19kYXRhLk1hc2sgPSAweDFGOworCWlvX2RhdGEuRGF0YSA9IHBfdnQxNjM2X2RwYV9zZXR0aW5nLT5DTEtfU0VMX1NUMTsKKwl2aWFmYl9ncGlvX2kyY193cml0ZV9tYXNrX2x2ZHMocGx2ZHNfc2V0dGluZ19pbmZvLAorCQlwbHZkc19jaGlwX2luZm8sIGlvX2RhdGEpOworCisJaW9fZGF0YS5JbmRleCA9IDB4MDg7CisJaW9fZGF0YS5NYXNrID0gMHgwRjsKKwlpb19kYXRhLkRhdGEgPSBwX3Z0MTYzNl9kcGFfc2V0dGluZy0+Q0xLX1NFTF9TVDI7CisJdmlhZmJfZ3Bpb19pMmNfd3JpdGVfbWFza19sdmRzKHBsdmRzX3NldHRpbmdfaW5mbywgcGx2ZHNfY2hpcF9pbmZvLAorCQlpb19kYXRhKTsKK30KKwordm9pZCB2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzMjQoCisJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCXN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpbnQgaW5kZXgsIHNpemU7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzMjQuXG4iKTsKKworCS8qIEdyYXBoaWNzIERQQSBzZXR0aW5nczogKi8KKwlpbmRleCA9IGdldF9jbGtfcmFuZ2VfaW5kZXgocGx2ZHNfc2V0dGluZ19pbmZvLT52Y2xrKTsKKwl2aWFmYl9zZXRfZHBhX2dmeChwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UsCisJCSAgICAmR0ZYX0RQQV9TRVRUSU5HX1RCTF9WVDMzMjRbaW5kZXhdKTsKKworCS8qIExWRFMgVHJhbnNtaXR0ZXIgRFBBIHNldHRpbmdzOiAqLworCXNpemUgPSBBUlJBWV9TSVpFKFZUMTYzNl9EUEFfU0VUVElOR19UQkxfVlQzMzI0KTsKKwlpbmRleCA9CisJICAgIGdldF9sdmRzX2RwYV9zZXR0aW5nX2luZGV4KHBsdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkLAorCQkJCSAgICAgICBWVDE2MzZfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyNCwgc2l6ZSk7CisJc2V0X2RwYV92dDE2MzYocGx2ZHNfc2V0dGluZ19pbmZvLCBwbHZkc19jaGlwX2luZm8sCisJCSAgICAgICAmVlQxNjM2X0RQQV9TRVRUSU5HX1RCTF9WVDMzMjRbaW5kZXhdKTsKK30KKwordm9pZCB2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzMjcoCisJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCXN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpbnQgaW5kZXgsIHNpemU7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzMjcuXG4iKTsKKworCS8qIEdyYXBoaWNzIERQQSBzZXR0aW5nczogKi8KKwlpbmRleCA9IGdldF9jbGtfcmFuZ2VfaW5kZXgocGx2ZHNfc2V0dGluZ19pbmZvLT52Y2xrKTsKKwl2aWFmYl9zZXRfZHBhX2dmeChwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UsCisJCSAgICAmR0ZYX0RQQV9TRVRUSU5HX1RCTF9WVDMzMjdbaW5kZXhdKTsKKworCS8qIExWRFMgVHJhbnNtaXR0ZXIgRFBBIHNldHRpbmdzOiAqLworCXNpemUgPSBBUlJBWV9TSVpFKFZUMTYzNl9EUEFfU0VUVElOR19UQkxfVlQzMzI3KTsKKwlpbmRleCA9CisJICAgIGdldF9sdmRzX2RwYV9zZXR0aW5nX2luZGV4KHBsdmRzX3NldHRpbmdfaW5mby0+bGNkX3BhbmVsX2lkLAorCQkJCSAgICAgICBWVDE2MzZfRFBBX1NFVFRJTkdfVEJMX1ZUMzMyNywgc2l6ZSk7CisJc2V0X2RwYV92dDE2MzYocGx2ZHNfc2V0dGluZ19pbmZvLCBwbHZkc19jaGlwX2luZm8sCisJCSAgICAgICAmVlQxNjM2X0RQQV9TRVRUSU5HX1RCTF9WVDMzMjdbaW5kZXhdKTsKK30KKwordm9pZCB2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzNjQoCisJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCXN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbykKK3sKKwlpbnQgaW5kZXg7CisKKwlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzNjQuXG4iKTsKKworCS8qIEdyYXBoaWNzIERQQSBzZXR0aW5nczogKi8KKwlpbmRleCA9IGdldF9jbGtfcmFuZ2VfaW5kZXgocGx2ZHNfc2V0dGluZ19pbmZvLT52Y2xrKTsKKwl2aWFmYl9zZXRfZHBhX2dmeChwbHZkc19jaGlwX2luZm8tPm91dHB1dF9pbnRlcmZhY2UsCisJCSAgICAmR0ZYX0RQQV9TRVRUSU5HX1RCTF9WVDMzNjRbaW5kZXhdKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3Z0MTYzNi5oIGIvZHJpdmVycy92aWRlby92aWEvdnQxNjM2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExNTBjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3Z0MTYzNi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDA4IFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDggUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICogZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbgorICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5TZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1ZUMTYzNl9IXworI2RlZmluZSBfVlQxNjM2X0hfCisjaW5jbHVkZSAiY2hpcC5oIgorYm9vbCB2aWFmYl9sdmRzX2lkZW50aWZ5X3Z0MTYzNih2b2lkKTsKK3ZvaWQgdmlhZmJfaW5pdF9sdmRzX3Z0MTYzNihzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCisJKnBsdmRzX3NldHRpbmdfaW5mbywgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3ZvaWQgdmlhZmJfZW5hYmxlX2x2ZHNfdnQxNjM2KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSpwbHZkc19zZXR0aW5nX2luZm8sCisJCQlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pOwordm9pZCB2aWFmYl9kaXNhYmxlX2x2ZHNfdnQxNjM2KHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24KKwkJCSAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCQkJIHN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7Cit2b2lkIHZpYWZiX3Z0MTYzNl9wYXRjaF9za2V3X29uX3Z0MzMyNCgKKwlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCisJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3ZvaWQgdmlhZmJfdnQxNjM2X3BhdGNoX3NrZXdfb25fdnQzMzI3KAorCXN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKKwlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pOwordm9pZCB2aWFmYl92dDE2MzZfcGF0Y2hfc2tld19vbl92dDMzNjQoCisJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbiAqcGx2ZHNfc2V0dGluZ19pbmZvLAorCXN0cnVjdCBsdmRzX2NoaXBfaW5mb3JtYXRpb24gKnBsdmRzX2NoaXBfaW5mbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCmluZGV4IDQ3ZWQzOWIuLmE0NjNiM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYworKysgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKQEAgLTY4MCwxMSArNjgwLDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHhlbmZiX2luaXQodm9pZCkKIHsKLQlpZiAoIWlzX3J1bm5pbmdfb25feGVuKCkpCisJaWYgKCF4ZW5fZG9tYWluKCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogTm90aGluZyB0byBkbyBpZiBydW5uaW5nIGluIGRvbTAuICovCi0JaWYgKGlzX2luaXRpYWxfeGVuZG9tYWluKCkpCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiB4ZW5idXNfcmVnaXN0ZXJfZnJvbnRlbmQoJnhlbmZiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKaW5kZXggMTAyMTFlNC4uMjllMTQ0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMKQEAgLTE2MCw4ICsxNjAsMTAgQEAKIAkgKiAgICAgNjI1IHVzIC0gNjAgdXMgLSAyNDAgdXMgLSAxMDAgbnMgPSAzMjQuOSB1cwogCSAqCiAJICogV2UnbGwgd2FpdCBhIGJpdCBsb25nZXIganVzdCB0byBiZSBzdXJlLgorCSAqIFdhcyB1ZGVsYXkoNTAwKSwgYnV0IGlmIGl0IGlzIGdvaW5nIHRvIGJ1c3l3YWl0IHRoZSBjcHUgdGhhdCBsb25nLAorCSAqIG1pZ2h0IGFzIHdlbGwgY29tZSBiYWNrIGxhdGVyLgogCSAqLwotCXVkZWxheSg1MDApOworCW1zbGVlcCgxKTsKIAogCWRzMXdtX3dyaXRlX3JlZ2lzdGVyKGRzMXdtX2RhdGEsIERTMVdNX0lOVF9FTiwKIAkJRFMxV01fSU5URU5fRVJCRiB8IERTMVdNX0lOVEVOX0VUTVQgfCBEUzFXTV9JTlRFTl9FUEQgfApAQCAtMjc0LDggKzI3Niw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRzMXdtX3NlYXJjaCh2b2lkICpkYXRhLCB1OCBzZWFyY2hfdHlwZSwKLQkJCSB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBzbGF2ZV9mb3VuZCkKK3N0YXRpYyB2b2lkIGRzMXdtX3NlYXJjaCh2b2lkICpkYXRhLCBzdHJ1Y3QgdzFfbWFzdGVyICptYXN0ZXJfZGV2LAorCQkJdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIHNsYXZlX2ZvdW5kKQogewogCXN0cnVjdCBkczF3bV9kYXRhICpkczF3bV9kYXRhID0gZGF0YTsKIAlpbnQgaTsKQEAgLTMxMyw3ICszMTUsNyBAQAogCWRzMXdtX3dyaXRlX3JlZ2lzdGVyKGRzMXdtX2RhdGEsIERTMVdNX0NNRCwgfkRTMVdNX0NNRF9TUkEpOwogCWRzMXdtX3Jlc2V0KGRzMXdtX2RhdGEpOwogCi0Jc2xhdmVfZm91bmQoZHMxd21fZGF0YSwgcm9tX2lkKTsKKwlzbGF2ZV9mb3VuZChtYXN0ZXJfZGV2LCByb21faWQpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0OTAuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0OTAuYwppbmRleCBiNjNiNWUwNC4uNTlhZDZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0OTAuYwpAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBDT01NX0RUCQkJCTB4MjAwMAogI2RlZmluZSBDT01NX1NQVQkJCTB4MTAwMAogI2RlZmluZSBDT01NX0YJCQkJMHgwODAwCi0jZGVmaW5lIENPTU1fTlRQCQkJMHgwNDAwCisjZGVmaW5lIENPTU1fTlRGCQkJMHgwNDAwCiAjZGVmaW5lIENPTU1fSUNQCQkJMHgwMjAwCiAjZGVmaW5lIENPTU1fUlNUCQkJMHgwMTAwCiAKQEAgLTk4LDExICs5OCw2IEBACiAjZGVmaW5lIEJSQU5DSF9NQUlOCQkJMHhDQwogI2RlZmluZSBCUkFOQ0hfQVVYCQkJMHgzMwogCi0vKgotICogRHVyYXRpb24gb2YgdGhlIHN0cm9uZyBwdWxsLXVwIHB1bHNlIGluIG1pbGxpc2Vjb25kcy4KLSAqLwotI2RlZmluZSBQVUxMVVBfUFVMU0VfRFVSQVRJT04JCTc1MAotCiAvKiBTdGF0dXMgZmxhZ3MgKi8KICNkZWZpbmUgU1RfU1BVQQkJCQkweDAxICAvKiBTdHJvbmcgUHVsbC11cCBpcyBhY3RpdmUgKi8KICNkZWZpbmUgU1RfUFJHQQkJCQkweDAyICAvKiAxMlYgcHJvZ3JhbW1pbmcgcHVsc2UgaXMgYmVpbmcgZ2VuZXJhdGVkICovCkBAIC0xMTIsNiArMTA3LDE3IEBACiAjZGVmaW5lIFNUX0lETEUJCQkJMHgyMCAgLyogRFMyNDkwIGlzIGN1cnJlbnRseSBpZGxlICovCiAjZGVmaW5lIFNUX0VQT0YJCQkJMHg4MAogCisvKiBSZXN1bHQgUmVnaXN0ZXIgZmxhZ3MgKi8KKyNkZWZpbmUgUlJfREVURUNUCQkJMHhBNSAvKiBOZXcgZGV2aWNlIGRldGVjdGVkICovCisjZGVmaW5lIFJSX05SUwkJCQkweDAxIC8qIFJlc2V0IG5vIHByZXNlbmNlIG9yIC4uLiAqLworI2RlZmluZSBSUl9TSAkJCQkweDAyIC8qIHNob3J0IG9uIHJlc2V0IG9yIHNldCBwYXRoICovCisjZGVmaW5lIFJSX0FQUAkJCQkweDA0IC8qIGFsYXJtaW5nIHByZXNlbmNlIG9uIHJlc2V0ICovCisjZGVmaW5lIFJSX1ZQUAkJCQkweDA4IC8qIDEyViBleHBlY3RlZCBub3Qgc2VlbiAqLworI2RlZmluZSBSUl9DTVAJCQkJMHgxMCAvKiBjb21wYXJlIGVycm9yICovCisjZGVmaW5lIFJSX0NSQwkJCQkweDIwIC8qIENSQyBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBSUl9SRFAJCQkJMHg0MCAvKiByZWRpcmVjdGVkIHBhZ2UgKi8KKyNkZWZpbmUgUlJfRU9TCQkJCTB4ODAgLyogZW5kIG9mIHNlYXJjaCBlcnJvciAqLworCiAjZGVmaW5lIFNQRUVEX05PUk1BTAkJCTB4MDAKICNkZWZpbmUgU1BFRURfRkxFWElCTEUJCQkweDAxCiAjZGVmaW5lIFNQRUVEX09WRVJEUklWRQkJCTB4MDIKQEAgLTEzMSw2ICsxMzcsMTUgQEAKIAogCWludAkJCWVwW05VTV9FUF07CiAKKwkvKiBTdHJvbmcgUHVsbFVwCisJICogMDogcHVsbHVwIG5vdCBhY3RpdmUsIGVsc2UgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisJICovCisJaW50CQkJc3B1X3NsZWVwOworCS8qIHNwdV9iaXQgY29udGFpbnMgQ09NTV9TUFUgb3IgMCBkZXBlbmRpbmcgb24gaWYgdGhlIHN0cm9uZyBwdWxsdXAKKwkgKiBzaG91bGQgYmUgYWN0aXZlIG9yIG5vdCBmb3Igd3JpdGVzLgorCSAqLworCXUxNgkJCXNwdV9iaXQ7CisKIAlzdHJ1Y3QgdzFfYnVzX21hc3RlcgltYXN0ZXI7CiB9OwogCkBAIC0xNjQsNyArMTc5LDYgQEAKIHN0YXRpYyBpbnQgZHNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CiBzdGF0aWMgdm9pZCBkc19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHNfZHVtcF9zdGF0dXModW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CiBzdGF0aWMgaW50IGRzX3NlbmRfY29udHJvbChzdHJ1Y3QgZHNfZGV2aWNlICosIHUxNiwgdTE2KTsKIHN0YXRpYyBpbnQgZHNfc2VuZF9jb250cm9sX2NtZChzdHJ1Y3QgZHNfZGV2aWNlICosIHUxNiwgdTE2KTsKIApAQCAtMTkyLDcgKzIwNiw3IEBACiAKIAlyZXR1cm4gZXJyOwogfQotI2lmIDAKKwogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfbW9kZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCBlcnI7CkBAIC0yMDcsNyArMjIxLDcgQEAKIAogCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYKKwogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2woc3RydWN0IGRzX2RldmljZSAqZGV2LCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKIHsKIAlpbnQgZXJyOwpAQCAtMjIzLDExICsyMzcsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkc19kdW1wX3N0YXR1cyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IG9mZikKLXsKLQlwcmludGsoIiU0NXM6ICU4eFxuIiwgc3RyLCBidWZbb2ZmXSk7Ci19Ci0KIHN0YXRpYyBpbnQgZHNfcmVjdl9zdGF0dXNfbm9kdW1wKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgc3RydWN0IGRzX3N0YXR1cyAqc3QsCiAJCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7CkBAIC0yNDgsNjIgKzI1Nyw4MSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGludCBkc19yZWN2X3N0YXR1cyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQorc3RhdGljIGlubGluZSB2b2lkIGRzX3ByaW50X21zZyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IG9mZikKIHsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Ci0JaW50IGNvdW50LCBlcnIgPSAwLCBpOworCXByaW50ayhLRVJOX0lORk8gIiU0NXM6ICU4eFxuIiwgc3RyLCBidWZbb2ZmXSk7Cit9CiAKLQltZW1jcHkoc3QsIGJ1Ziwgc2l6ZW9mKCpzdCkpOworc3RhdGljIHZvaWQgZHNfZHVtcF9zdGF0dXMoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKIAotCWNvdW50ID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgc3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChjb3VudCA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlwcmludGsoIjB4JXg6IGNvdW50PSVkLCBzdGF0dXM6ICIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgY291bnQpOworCXByaW50ayhLRVJOX0lORk8gIjB4JXg6IGNvdW50PSVkLCBzdGF0dXM6ICIsIGRldi0+ZXBbRVBfU1RBVFVTXSwgY291bnQpOwogCWZvciAoaT0wOyBpPGNvdW50OyArK2kpCiAJCXByaW50aygiJTAyeCAiLCBidWZbaV0pOwotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCiAJaWYgKGNvdW50ID49IDE2KSB7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgImVuYWJsZSBmbGFnIiwgMCk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgIjEtd2lyZSBzcGVlZCIsIDEpOwotCQlkc19kdW1wX3N0YXR1cyhidWYsICJzdHJvbmcgcHVsbHVwIGR1cmF0aW9uIiwgMik7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgInByb2dyYW1taW5nIHB1bHNlIGR1cmF0aW9uIiwgMyk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgInB1bGxkb3duIHNsZXcgcmF0ZSBjb250cm9sIiwgNCk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgIndyaXRlLTEgbG93IHRpbWUiLCA1KTsKLQkJZHNfZHVtcF9zdGF0dXMoYnVmLCAiZGF0YSBzYW1wbGUgb2Zmc2V0L3dyaXRlLTAgcmVjb3ZlcnkgdGltZSIsIDYpOwotCQlkc19kdW1wX3N0YXR1cyhidWYsICJyZXNlcnZlZCAodGVzdCByZWdpc3RlcikiLCA3KTsKLQkJZHNfZHVtcF9zdGF0dXMoYnVmLCAiZGV2aWNlIHN0YXR1cyBmbGFncyIsIDgpOwotCQlkc19kdW1wX3N0YXR1cyhidWYsICJjb21tdW5pY2F0aW9uIGNvbW1hbmQgYnl0ZSAxIiwgOSk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgImNvbW11bmljYXRpb24gY29tbWFuZCBieXRlIDIiLCAxMCk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgImNvbW11bmljYXRpb24gY29tbWFuZCBidWZmZXIgc3RhdHVzIiwgMTEpOwotCQlkc19kdW1wX3N0YXR1cyhidWYsICIxLXdpcmUgZGF0YSBvdXRwdXQgYnVmZmVyIHN0YXR1cyIsIDEyKTsKLQkJZHNfZHVtcF9zdGF0dXMoYnVmLCAiMS13aXJlIGRhdGEgaW5wdXQgYnVmZmVyIHN0YXR1cyIsIDEzKTsKLQkJZHNfZHVtcF9zdGF0dXMoYnVmLCAicmVzZXJ2ZWQiLCAxNCk7Ci0JCWRzX2R1bXBfc3RhdHVzKGJ1ZiwgInJlc2VydmVkIiwgMTUpOworCQlkc19wcmludF9tc2coYnVmLCAiZW5hYmxlIGZsYWciLCAwKTsKKwkJZHNfcHJpbnRfbXNnKGJ1ZiwgIjEtd2lyZSBzcGVlZCIsIDEpOworCQlkc19wcmludF9tc2coYnVmLCAic3Ryb25nIHB1bGx1cCBkdXJhdGlvbiIsIDIpOworCQlkc19wcmludF9tc2coYnVmLCAicHJvZ3JhbW1pbmcgcHVsc2UgZHVyYXRpb24iLCAzKTsKKwkJZHNfcHJpbnRfbXNnKGJ1ZiwgInB1bGxkb3duIHNsZXcgcmF0ZSBjb250cm9sIiwgNCk7CisJCWRzX3ByaW50X21zZyhidWYsICJ3cml0ZS0xIGxvdyB0aW1lIiwgNSk7CisJCWRzX3ByaW50X21zZyhidWYsICJkYXRhIHNhbXBsZSBvZmZzZXQvd3JpdGUtMCByZWNvdmVyeSB0aW1lIiwKKwkJCTYpOworCQlkc19wcmludF9tc2coYnVmLCAicmVzZXJ2ZWQgKHRlc3QgcmVnaXN0ZXIpIiwgNyk7CisJCWRzX3ByaW50X21zZyhidWYsICJkZXZpY2Ugc3RhdHVzIGZsYWdzIiwgOCk7CisJCWRzX3ByaW50X21zZyhidWYsICJjb21tdW5pY2F0aW9uIGNvbW1hbmQgYnl0ZSAxIiwgOSk7CisJCWRzX3ByaW50X21zZyhidWYsICJjb21tdW5pY2F0aW9uIGNvbW1hbmQgYnl0ZSAyIiwgMTApOworCQlkc19wcmludF9tc2coYnVmLCAiY29tbXVuaWNhdGlvbiBjb21tYW5kIGJ1ZmZlciBzdGF0dXMiLCAxMSk7CisJCWRzX3ByaW50X21zZyhidWYsICIxLXdpcmUgZGF0YSBvdXRwdXQgYnVmZmVyIHN0YXR1cyIsIDEyKTsKKwkJZHNfcHJpbnRfbXNnKGJ1ZiwgIjEtd2lyZSBkYXRhIGlucHV0IGJ1ZmZlciBzdGF0dXMiLCAxMyk7CisJCWRzX3ByaW50X21zZyhidWYsICJyZXNlcnZlZCIsIDE0KTsKKwkJZHNfcHJpbnRfbXNnKGJ1ZiwgInJlc2VydmVkIiwgMTUpOwogCX0KLQotCW1lbWNweShzdCwgYnVmLCBzaXplb2YoKnN0KSk7Ci0KLQlpZiAoc3QtPnN0YXR1cyAmIFNUX0VQT0YpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXR0aW5nIGRldmljZSBhZnRlciBTVF9FUE9GLlxuIik7Ci0JCWVyciA9IGRzX3NlbmRfY29udHJvbF9jbWQoZGV2LCBDVExfUkVTRVRfREVWSUNFLCAwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWNvdW50ID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgc3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAoY291bnQgPCAwKQotCQkJcmV0dXJuIGVycjsKKwlmb3IgKGkgPSAxNjsgaSA8IGNvdW50OyArK2kpIHsKKwkJaWYgKGJ1ZltpXSA9PSBSUl9ERVRFQ1QpIHsKKwkJCWRzX3ByaW50X21zZyhidWYsICJuZXcgZGV2aWNlIGRldGVjdCIsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJZHNfcHJpbnRfbXNnKGJ1ZiwgIlJlc3VsdCBSZWdpc3RlciBWYWx1ZTogIiwgaSk7CisJCWlmIChidWZbaV0gJiBSUl9OUlMpCisJCQlwcmludGsoS0VSTl9JTkZPICJOUlM6IFJlc2V0IG5vIHByZXNlbmNlIG9yIC4uLlxuIik7CisJCWlmIChidWZbaV0gJiBSUl9TSCkKKwkJCXByaW50ayhLRVJOX0lORk8gIlNIOiBzaG9ydCBvbiByZXNldCBvciBzZXQgcGF0aFxuIik7CisJCWlmIChidWZbaV0gJiBSUl9BUFApCisJCQlwcmludGsoS0VSTl9JTkZPICJBUFA6IGFsYXJtaW5nIHByZXNlbmNlIG9uIHJlc2V0XG4iKTsKKwkJaWYgKGJ1ZltpXSAmIFJSX1ZQUCkKKwkJCXByaW50ayhLRVJOX0lORk8gIlZQUDogMTJWIGV4cGVjdGVkIG5vdCBzZWVuXG4iKTsKKwkJaWYgKGJ1ZltpXSAmIFJSX0NNUCkKKwkJCXByaW50ayhLRVJOX0lORk8gIkNNUDogY29tcGFyZSBlcnJvclxuIik7CisJCWlmIChidWZbaV0gJiBSUl9DUkMpCisJCQlwcmludGsoS0VSTl9JTkZPICJDUkM6IENSQyBlcnJvciBkZXRlY3RlZFxuIik7CisJCWlmIChidWZbaV0gJiBSUl9SRFApCisJCQlwcmludGsoS0VSTl9JTkZPICJSRFA6IHJlZGlyZWN0ZWQgcGFnZVxuIik7CisJCWlmIChidWZbaV0gJiBSUl9FT1MpCisJCQlwcmludGsoS0VSTl9JTkZPICJFT1M6IGVuZCBvZiBzZWFyY2ggZXJyb3JcbiIpOwogCX0KLSNpZiAwCi0JaWYgKHN0LT5zdGF0dXMgJiBTVF9JRExFKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyBwdWxzZSBhZnRlciBTVF9JRExFLlxuIik7Ci0JCWVyciA9IGRzX3N0YXJ0X3B1bHNlKGRldiwgUFVMTFVQX1BVTFNFX0RVUkFUSU9OKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotI2VuZGlmCit9CiAKLQlyZXR1cm4gZXJyOworc3RhdGljIHZvaWQgZHNfcmVzZXRfZGV2aWNlKHN0cnVjdCBkc19kZXZpY2UgKmRldikKK3sKKwlkc19zZW5kX2NvbnRyb2xfY21kKGRldiwgQ1RMX1JFU0VUX0RFVklDRSwgMCk7CisJLyogQWx3YXlzIGFsbG93IHN0cm9uZyBwdWxsdXAgd2hpY2ggYWxsb3cgaW5kaXZpZHVhbCB3cml0ZXMgdG8gdXNlCisJICogdGhlIHN0cm9uZyBwdWxsdXAuCisJICovCisJaWYgKGRzX3NlbmRfY29udHJvbF9tb2RlKGRldiwgTU9EX1BVTFNFX0VOLCBQVUxTRV9TUFVFKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJkc19yZXNldF9kZXZpY2U6ICIKKwkJCSJFcnJvciBhbGxvd2luZyBzdHJvbmcgcHVsbHVwXG4iKTsKKwkvKiBDaGlwIHN0cm9uZyBwdWxsdXAgdGltZSB3YXMgY2xlYXJlZC4gKi8KKwlpZiAoZGV2LT5zcHVfc2xlZXApIHsKKwkJLyogbG93ZXIgNCBiaXRzIGFyZSAwLCBzZWUgZHNfc2V0X3B1bGx1cCAqLworCQl1OCBkZWwgPSBkZXYtPnNwdV9zbGVlcD4+NDsKKwkJaWYgKGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fU0VUX0RVUkFUSU9OIHwgQ09NTV9JTSwgZGVsKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiZHNfcmVzZXRfZGV2aWNlOiAiCisJCQkJIkVycm9yIHNldHRpbmcgZHVyYXRpb25cbiIpOworCX0KIH0KIAogc3RhdGljIGludCBkc19yZWN2X2RhdGEoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQpAQCAtMzExLDEzICszMzksMjcgQEAKIAlpbnQgY291bnQsIGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCisJLyogQ2FyZWZ1bCBvbiBzaXplLiAgSWYgc2l6ZSBpcyBsZXNzIHRoYW4gd2hhdCBpcyBhdmFpbGFibGUgaW4KKwkgKiB0aGUgaW5wdXQgYnVmZmVyLCB0aGUgZGV2aWNlIGZhaWxzIHRoZSBidWxrIHRyYW5zZmVyIGFuZAorCSAqIGNsZWFycyB0aGUgaW5wdXQgYnVmZmVyLiAgSXQgY291bGQgcmVhZCB0aGUgbWF4aW11bSBzaXplIG9mCisJICogdGhlIGRhdGEgYnVmZmVyLCBidXQgdGhlbiBkbyB5b3UgcmV0dXJuIHRoZSBmaXJzdCwgbGFzdCwgb3IKKwkgKiBzb21lIHNldCBvZiB0aGUgbWlkZGxlIHNpemUgYnl0ZXM/ICBBcyBsb25nIGFzIHRoZSByZXN0IG9mCisJICogdGhlIGNvZGUgaXMgY29ycmVjdCB0aGVyZSB3aWxsIGJlIHNpemUgYnl0ZXMgd2FpdGluZy4gIEEKKwkgKiBjYWxsIHRvIGRzX3dhaXRfc3RhdHVzIHdpbGwgd2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIGlkbGUKKwkgKiBhbmQgYW55IGRhdGEgdG8gYmUgcmVjZWl2ZWQgd291bGQgaGF2ZSBiZWVuIGF2YWlsYWJsZS4KKwkgKi8KIAljb3VudCA9IDA7CiAJZXJyID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwgdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5lcFtFUF9EQVRBX0lOXSksCiAJCQkJYnVmLCBzaXplLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CisJCXU4IGJ1ZlsweDIwXTsKKwkJaW50IGNvdW50OworCiAJCXByaW50ayhLRVJOX0lORk8gIkNsZWFyaW5nIGVwMHgleC5cbiIsIGRldi0+ZXBbRVBfREFUQV9JTl0pOwogCQl1c2JfY2xlYXJfaGFsdChkZXYtPnVkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+ZXBbRVBfREFUQV9JTl0pKTsKLQkJZHNfcmVjdl9zdGF0dXMoZGV2LCAmc3QpOworCisJCWNvdW50ID0gZHNfcmVjdl9zdGF0dXNfbm9kdW1wKGRldiwgJnN0LCBidWYsIHNpemVvZihidWYpKTsKKwkJZHNfZHVtcF9zdGF0dXMoZGV2LCBidWYsIGNvdW50KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTM0MSw3ICszODMsOCBAQAogCWNvdW50ID0gMDsKIAllcnIgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmVwW0VQX0RBVEFfT1VUXSksIGJ1ZiwgbGVuLCAmY291bnQsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlYWQgMS13aXJlIGRhdGEgZnJvbSAweDAyOiBlcnI9JWQuXG4iLCBlcnIpOworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byB3cml0ZSAxLXdpcmUgZGF0YSB0byBlcDB4JXg6ICIKKwkJCSJlcnI9JWQuXG4iLCBkZXYtPmVwW0VQX0RBVEFfT1VUXSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTM5Nyw3ICs0NDAsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBkc19yZWN2X3N0YXR1cyhkZXYsIHN0KTsKKwllcnIgPSBkc19kdW1wX3N0YXR1cyhkZXYsIHN0KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00MjAsMzMgKzQ2Myw0OSBAQAogCQkJcHJpbnRrKCJcbiIpOwogCQl9CiAjZW5kaWYKLQl9IHdoaWxlKCEoYnVmWzB4MDhdICYgMHgyMCkgJiYgIShlcnIgPCAwKSAmJiArK2NvdW50IDwgMTAwKTsKKwl9IHdoaWxlICghKGJ1ZlsweDA4XSAmIFNUX0lETEUpICYmICEoZXJyIDwgMCkgJiYgKytjb3VudCA8IDEwMCk7CiAKKwlpZiAoZXJyID49IDE2ICYmIHN0LT5zdGF0dXMgJiBTVF9FUE9GKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyBkZXZpY2UgYWZ0ZXIgU1RfRVBPRi5cbiIpOworCQlkc19yZXNldF9kZXZpY2UoZGV2KTsKKwkJLyogQWx3YXlzIGR1bXAgdGhlIGRldmljZSBzdGF0dXMuICovCisJCWNvdW50ID0gMTAxOworCX0KIAotCWlmICgoKGVyciA+IDE2KSAmJiAoYnVmWzB4MTBdICYgMHgwMSkpIHx8IGNvdW50ID49IDEwMCB8fCBlcnIgPCAwKSB7Ci0JCWRzX3JlY3Zfc3RhdHVzKGRldiwgc3QpOworCS8qIER1bXAgdGhlIHN0YXR1cyBmb3IgZXJyb3JzIG9yIGlmIHRoZXJlIGlzIGV4dGVuZGVkIHJldHVybiBkYXRhLgorCSAqIFRoZSBleHRlbmRlZCBzdGF0dXMgaW5jbHVkZXMgbmV3IGRldmljZSBkZXRlY3Rpb24gKG1heWJlIHNvbWVvbmUKKwkgKiBjYW4gZG8gc29tZXRoaW5nIHdpdGggaXQpLgorCSAqLworCWlmIChlcnIgPiAxNiB8fCBjb3VudCA+PSAxMDAgfHwgZXJyIDwgMCkKKwkJZHNfZHVtcF9zdGF0dXMoZGV2LCBidWYsIGVycik7CisKKwkvKiBFeHRlbmRlZCBkYXRhIGlzbid0IGFuIGVycm9yLiAgV2VsbCwgYSBzaG9ydCBpcywgYnV0IHRoZSBkdW1wCisJICogd291bGQgaGF2ZSBhbHJlYWR5IHRvbGQgdGhlIHVzZXIgdGhhdCBhbmQgd2UgY2FuJ3QgZG8gYW55dGhpbmcKKwkgKiBhYm91dCBpdCBpbiBzb2Z0d2FyZSBhbnl3YXkuCisJICovCisJaWYgKGNvdW50ID49IDEwMCB8fCBlcnIgPCAwKQogCQlyZXR1cm4gLTE7Ci0JfSBlbHNlCisJZWxzZQogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkc19yZXNldChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHN0cnVjdCBkc19zdGF0dXMgKnN0KQorc3RhdGljIGludCBkc19yZXNldChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGVycjsKIAotCS8vZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV8xX1dJUkVfUkVTRVQgfCBDT01NX0YgfCBDT01NX0lNIHwgQ09NTV9TRSwgU1BFRURfRkxFWElCTEUpOwotCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIDB4NDMsIFNQRUVEX05PUk1BTCk7CisJLyogT3RoZXIgcG90ZW50aW9uYWxseSBpbnRlcmVzdGluZyBmbGFncyBmb3IgcmVzZXQuCisJICoKKwkgKiBDT01NX05URjogUmV0dXJuIHJlc3VsdCByZWdpc3RlciBmZWVkYmFjay4gIFRoaXMgY291bGQgYmUgdXNlZCB0bworCSAqIGRldGVjdCBzb21lIGNvbmRpdGlvbnMgc3VjaCBhcyBzaG9ydCwgYWxhcm1pbmcgcHJlc2VuY2UsIG9yCisJICogZGV0ZWN0IGlmIGEgbmV3IGRldmljZSB3YXMgZGV0ZWN0ZWQuCisJICoKKwkgKiBDT01NX1NFIHdoaWNoIGFsbG93cyBTUEVFRF9OT1JNQUwsIFNQRUVEX0ZMRVhJQkxFLCBTUEVFRF9PVkVSRFJJVkU6CisJICogU2VsZWN0IHRoZSBkYXRhIHRyYW5zZmVyIHJhdGUuCisJICovCisJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV8xX1dJUkVfUkVTRVQgfCBDT01NX0lNLCBTUEVFRF9OT1JNQUwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlkc193YWl0X3N0YXR1cyhkZXYsIHN0KTsKLSNpZiAwCi0JaWYgKHN0LT5jb21tYW5kX2J1ZmZlcl9zdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU2hvcnQgY2lyY3VpdC5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCkBAIC00NzEsNjAgKzUzMCw0MyBAQAogfQogI2VuZGlmICAvKiAgMCAgKi8KIAotc3RhdGljIGludCBkc19zdGFydF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIGludCBkZWxheSkKK3N0YXRpYyBpbnQgZHNfc2V0X3B1bGx1cChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIGludCBkZWxheSkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCXU4IGRlbCA9IDEgKyAodTgpKGRlbGF5ID4+IDQpOwotCXN0cnVjdCBkc19zdGF0dXMgc3Q7CisJLyogSnVzdCBzdG9yaW5nIGRlbGF5IHdvdWxkIG5vdCBnZXQgdGhlIHRydW5pY2F0aW9uIGFuZCByb3VuZHVwLiAqLworCWludCBtcyA9IGRlbDw8NDsKIAotI2lmIDAKLQllcnIgPSBkc19zdG9wX3B1bHNlKGRldiwgMTApOwotCWlmIChlcnIpCisJLyogRW5hYmxlIHNwdV9iaXQgaWYgYSBkZWxheSBpcyBzZXQuICovCisJZGV2LT5zcHVfYml0ID0gZGVsYXkgPyBDT01NX1NQVSA6IDA7CisJLyogSWYgZGVsYXkgaXMgemVybywgaXQgaGFzIGFscmVhZHkgYmVlbiBkaXNhYmxlZCwgaWYgdGhlIHRpbWUgaXMKKwkgKiB0aGUgc2FtZSBhcyB0aGUgaGFyZHdhcmUgd2FzIGxhc3QgcHJvZ3JhbW1lZCB0bywgdGhlcmUgaXMgYWxzbworCSAqIG5vdGhpbmcgbW9yZSB0byBkby4gIENvbXBhcmUgd2l0aCB0aGUgcmVjYWxjdWxhdGVkIHZhbHVlIG1zCisJICogcmF0aGVyIHRoYW4gZGVsIG9yIGRlbGF5IHdoaWNoIGNhbiBoYXZlIGEgZGlmZmVyZW50IHZhbHVlLgorCSAqLworCWlmIChkZWxheSA9PSAwIHx8IG1zID09IGRldi0+c3B1X3NsZWVwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZHNfc2VuZF9jb250cm9sX21vZGUoZGV2LCBNT0RfUFVMU0VfRU4sIFBVTFNFX1NQVUUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0jZW5kaWYKIAllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX1NFVF9EVVJBVElPTiB8IENPTU1fSU0sIGRlbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fUFVMU0UgfCBDT01NX0lNIHwgQ09NTV9GLCAwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbWRlbGF5KGRlbGF5KTsKLQotCWRzX3dhaXRfc3RhdHVzKGRldiwgJnN0KTsKKwlkZXYtPnNwdV9zbGVlcCA9IG1zOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkc190b3VjaF9iaXQoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCBiaXQsIHU4ICp0Yml0KQogewotCWludCBlcnIsIGNvdW50OworCWludCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKLQl1MTYgdmFsdWUgPSAoQ09NTV9CSVRfSU8gfCBDT01NX0lNKSB8ICgoYml0KSA/IENPTU1fRCA6IDApOwotCXUxNiBjbWQ7CiAKLQllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCB2YWx1ZSwgMCk7CisJZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CSVRfSU8gfCBDT01NX0lNIHwgKGJpdCA/IENPTU1fRCA6IDApLAorCQkwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JY291bnQgPSAwOwotCWRvIHsKLQkJZXJyID0gZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQljbWQgPSBzdC5jb21tYW5kMCB8IChzdC5jb21tYW5kMSA8PCA4KTsKLQl9IHdoaWxlIChjbWQgIT0gdmFsdWUgJiYgKytjb3VudCA8IDEwKTsKLQotCWlmIChlcnIgPCAwIHx8IGNvdW50ID49IDEwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWRzX3dhaXRfc3RhdHVzKGRldiwgJnN0KTsKIAogCWVyciA9IGRzX3JlY3ZfZGF0YShkZXYsIHRiaXQsIHNpemVvZigqdGJpdCkpOwogCWlmIChlcnIgPCAwKQpAQCAtNTMzLDEyICs1NzUsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbnQgZHNfd3JpdGVfYml0KHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTggYml0KQogewogCWludCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKIAotCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQklUX0lPIHwgQ09NTV9JTSB8IChiaXQpID8gQ09NTV9EIDogMCwgMCk7CisJLyogU2V0IENPTU1fSUNQIHRvIHdyaXRlIHdpdGhvdXQgYSByZWFkYmFjay4gIE5vdGUsIHRoaXMgd2lsbAorCSAqIHByb2R1Y2Ugb25lIHRpbWUgc2xvdCwgYSBkb3duIGZvbGxvd2VkIGJ5IGFuIHVwIHdpdGggQ09NTV9ECisJICogb25seSBkZXRlcm1pbmcgdGhlIHRpbWluZy4KKwkgKi8KKwllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JJVF9JTyB8IENPTU1fSU0gfCBDT01NX0lDUCB8CisJCShiaXQgPyBDT01NX0QgOiAwKSwgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNTQ2LDYgKzU5NCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGRzX3dyaXRlX2J5dGUoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCBieXRlKQogewpAQCAtNTUzLDEwICs2MDIsMTMgQEAKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCXU4IHJieXRlOwogCi0JZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CWVRFX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBieXRlKTsKKwllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JZVEVfSU8gfCBDT01NX0lNIHwgZGV2LT5zcHVfYml0LCBieXRlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKGRldi0+c3B1X2JpdCkKKwkJbXNsZWVwKGRldi0+c3B1X3NsZWVwKTsKKwogCWVyciA9IGRzX3dhaXRfc3RhdHVzKGRldiwgJnN0KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNTY1LDggKzYxNyw2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlkc19zdGFydF9wdWxzZShkZXYsIFBVTExVUF9QVUxTRV9EVVJBVElPTik7Ci0KIAlyZXR1cm4gIShieXRlID09IHJieXRlKTsKIH0KIApAQCAtNjAyLDcgKzY1Miw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JMT0NLX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBsZW4pOworCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQkxPQ0tfSU8gfCBDT01NX0lNLCBsZW4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTYyMywyMCArNjczLDE5IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlkc193YWl0X3N0YXR1cyhkZXYsICZzdCk7Ci0KLQllcnIgPSBkc19zZW5kX2NvbnRyb2woZGV2LCBDT01NX0JMT0NLX0lPIHwgQ09NTV9JTSB8IENPTU1fU1BVLCBsZW4pOworCWVyciA9IGRzX3NlbmRfY29udHJvbChkZXYsIENPTU1fQkxPQ0tfSU8gfCBDT01NX0lNIHwgZGV2LT5zcHVfYml0LCBsZW4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoZGV2LT5zcHVfYml0KQorCQltc2xlZXAoZGV2LT5zcHVfc2xlZXApOworCiAJZHNfd2FpdF9zdGF0dXMoZGV2LCAmc3QpOwogCiAJZXJyID0gZHNfcmVjdl9kYXRhKGRldiwgYnVmLCBsZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZHNfc3RhcnRfcHVsc2UoZGV2LCBQVUxMVVBfUFVMU0VfRFVSQVRJT04pOwotCiAJcmV0dXJuICEoZXJyID09IGxlbik7CiB9CiAKQEAgLTcyOCw2ICs3NzcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZiAwCiBzdGF0aWMgdm9pZCBkczk0OTByX3dyaXRlX2JpdCh2b2lkICpkYXRhLCB1OCBiaXQpCiB7CiAJc3RydWN0IGRzX2RldmljZSAqZGV2ID0gZGF0YTsKQEAgLTczNSwxMyArNzg1LDYgQEAKIAlkc193cml0ZV9iaXQoZGV2LCBiaXQpOwogfQogCi1zdGF0aWMgdm9pZCBkczk0OTByX3dyaXRlX2J5dGUodm9pZCAqZGF0YSwgdTggYnl0ZSkKLXsKLQlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwotCi0JZHNfd3JpdGVfYnl0ZShkZXYsIGJ5dGUpOwotfQotCiBzdGF0aWMgdTggZHM5NDkwcl9yZWFkX2JpdCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7CkBAIC03NTQsNiArNzk3LDE0IEBACiAKIAlyZXR1cm4gYml0ICYgMTsKIH0KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkczk0OTByX3dyaXRlX2J5dGUodm9pZCAqZGF0YSwgdTggYnl0ZSkKK3sKKwlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOworCisJZHNfd3JpdGVfYnl0ZShkZXYsIGJ5dGUpOworfQogCiBzdGF0aWMgdTggZHM5NDkwcl9yZWFkX2J5dGUodm9pZCAqZGF0YSkKIHsKQEAgLTc5MCwzMSArODQxLDU4IEBACiBzdGF0aWMgdTggZHM5NDkwcl9yZXNldCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGRzX3N0YXR1cyBzdDsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7Ci0KLQllcnIgPSBkc19yZXNldChkZXYsICZzdCk7CisJZXJyID0gZHNfcmVzZXQoZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTggZHM5NDkwcl9zZXRfcHVsbHVwKHZvaWQgKmRhdGEsIGludCBkZWxheSkKK3sKKwlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaWYgKGRzX3NldF9wdWxsdXAoZGV2LCBkZWxheSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHNfdzFfaW5pdChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYpCiB7CiAJbWVtc2V0KCZkZXYtPm1hc3RlciwgMCwgc2l6ZW9mKHN0cnVjdCB3MV9idXNfbWFzdGVyKSk7CiAKKwkvKiBSZXNldCB0aGUgZGV2aWNlIGFzIGl0IGNhbiBiZSBpbiBhIGJhZCBzdGF0ZS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGEgYmxvY2sgd3JpdGUgd2lsbCB3YWl0IGZvciBkYXRhCisJICogdG8gYmUgcGxhY2VkIGluIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCBibG9jayBhbnkgbGF0ZXIKKwkgKiBjb21tYW5kcyB3aGljaCB3aWxsIGtlZXAgYWNjdW11bGF0aW5nIGFuZCB0aGUgZGV2aWNlIHdpbGwKKwkgKiBub3QgYmUgaWRsZS4gIEFub3RoZXIgY2FzZSBpcyByZW1vdmluZyB0aGUgZHMyNDkwIG1vZHVsZQorCSAqIHdoaWxlIGEgYnVzIHNlYXJjaCBpcyBpbiBwcm9ncmVzcywgc29tZWhvdyBhIGZldyBjb21tYW5kcworCSAqIGdldCB0aHJvdWdoLCBidXQgdGhlIGlucHV0IHRyYW5zZmVycyBmYWlsIGxlYXZpbmcgZGF0YSBpbgorCSAqIHRoZSBpbnB1dCBidWZmZXIuICBUaGlzIHdpbGwgY2F1c2UgdGhlIG5leHQgcmVhZCB0byBmYWlsCisJICogc2VlIHRoZSBub3RlIGluIGRzX3JlY3ZfZGF0YS4KKwkgKi8KKwlkc19yZXNldF9kZXZpY2UoZGV2KTsKKwogCWRldi0+bWFzdGVyLmRhdGEJPSBkZXY7CiAJZGV2LT5tYXN0ZXIudG91Y2hfYml0CT0gJmRzOTQ5MHJfdG91Y2hfYml0OworCS8qIHJlYWRfYml0IGFuZCB3cml0ZV9iaXQgaW4gdzFfYnVzX21hc3RlciBhcmUgZXhwZWN0ZWQgdG8gc2V0IGFuZAorCSAqIHNhbXBsZSB0aGUgbGluZSBsZXZlbC4gIEZvciB3cml0ZV9iaXQgdGhhdCBtZWFucyBpdCBpcyBleHBlY3RlZCB0bworCSAqIHNldCBpdCB0byB0aGF0IHZhbHVlIGFuZCBsZWF2ZSBpdCB0aGVyZS4gIGRzMjQ5MCBvbmx5IHN1cHBvcnRzIGFuCisJICogaW5kaXZpZHVhbCB0aW1lIHNsb3QgYXQgdGhlIGxvd2VzdCBsZXZlbC4gIFRoZSByZXF1aXJlbWVudCBmcm9tCisJICogcHVsbGluZyB0aGUgYnVzIHN0YXRlIGRvd24gdG8gcmVhZGluZyB0aGUgc3RhdGUgaXMgMTV1cywgc29tZXRoaW5nCisJICogdGhhdCBpc24ndCByZWFsaXN0aWMgb24gdGhlIFVTQiBidXMgYW55d2F5LgogCWRldi0+bWFzdGVyLnJlYWRfYml0CT0gJmRzOTQ5MHJfcmVhZF9iaXQ7CiAJZGV2LT5tYXN0ZXIud3JpdGVfYml0CT0gJmRzOTQ5MHJfd3JpdGVfYml0OworCSovCiAJZGV2LT5tYXN0ZXIucmVhZF9ieXRlCT0gJmRzOTQ5MHJfcmVhZF9ieXRlOwogCWRldi0+bWFzdGVyLndyaXRlX2J5dGUJPSAmZHM5NDkwcl93cml0ZV9ieXRlOwogCWRldi0+bWFzdGVyLnJlYWRfYmxvY2sJPSAmZHM5NDkwcl9yZWFkX2Jsb2NrOwogCWRldi0+bWFzdGVyLndyaXRlX2Jsb2NrCT0gJmRzOTQ5MHJfd3JpdGVfYmxvY2s7CiAJZGV2LT5tYXN0ZXIucmVzZXRfYnVzCT0gJmRzOTQ5MHJfcmVzZXQ7CisJZGV2LT5tYXN0ZXIuc2V0X3B1bGx1cAk9ICZkczk0OTByX3NldF9wdWxsdXA7CiAKIAlyZXR1cm4gdzFfYWRkX21hc3Rlcl9kZXZpY2UoJmRldi0+bWFzdGVyKTsKIH0KQEAgLTgzOCw2ICs5MTYsOCBAQAogCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IERTOTQ5MFIgc3RydWN0dXJlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwlkZXYtPnNwdV9zbGVlcCA9IDA7CisJZGV2LT5zcHVfYml0ID0gMDsKIAlkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKIAlpZiAoIWRldi0+dWRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNDMxLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZjMGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNDMxLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiB3MV9kczI0MzEuYyAtIHcxIGZhbWlseSAyZCAoRFMyNDMxKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmVybmhhcmQgV2VpcmljaCA8YmVybmhhcmQud2VpcmljaEByaWVkZWwubmV0PgorICoKKyAqIEhlYXZpbHkgaW5zcGlyZWQgYnkgdzFfRFMyNDMzIGRyaXZlciBmcm9tIEJlbiBHYXJkbmVyIDxiZ2FyZG5lckB3YWJ0ZWMuY29tPgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIi4uL3cxLmgiCisjaW5jbHVkZSAiLi4vdzFfaW50LmgiCisjaW5jbHVkZSAiLi4vdzFfZmFtaWx5LmgiCisKKyNkZWZpbmUgVzFfRjJEX0VFUFJPTV9TSVpFCQkxMjgKKyNkZWZpbmUgVzFfRjJEX1BBR0VfQ09VTlQJCTQKKyNkZWZpbmUgVzFfRjJEX1BBR0VfQklUUwkJNQorI2RlZmluZSBXMV9GMkRfUEFHRV9TSVpFCQkoMTw8VzFfRjJEX1BBR0VfQklUUykKKyNkZWZpbmUgVzFfRjJEX1BBR0VfTUFTSwkJMHgxRgorCisjZGVmaW5lIFcxX0YyRF9TQ1JBVENIX0JJVFMgIDMKKyNkZWZpbmUgVzFfRjJEX1NDUkFUQ0hfU0laRSAgKDE8PFcxX0YyRF9TQ1JBVENIX0JJVFMpCisjZGVmaW5lIFcxX0YyRF9TQ1JBVENIX01BU0sgIChXMV9GMkRfU0NSQVRDSF9TSVpFLTEpCisKKyNkZWZpbmUgVzFfRjJEX1JFQURfRUVQUk9NCTB4RjAKKyNkZWZpbmUgVzFfRjJEX1dSSVRFX1NDUkFUQ0gJMHgwRgorI2RlZmluZSBXMV9GMkRfUkVBRF9TQ1JBVENICTB4QUEKKyNkZWZpbmUgVzFfRjJEX0NPUFlfU0NSQVRDSAkweDU1CisKKworI2RlZmluZSBXMV9GMkRfVFBST0dfTVMJCTExCisKKyNkZWZpbmUgVzFfRjJEX1JFQURfUkVUUklFUwkJMTAKKyNkZWZpbmUgVzFfRjJEX1JFQURfTUFYTEVOCQk4CisKKy8qCisgKiBDaGVjayB0aGUgZmlsZSBzaXplIGJvdW5kcyBhbmQgYWRqdXN0cyBjb3VudCBhcyBuZWVkZWQuCisgKiBUaGlzIHdvdWxkIG5vdCBiZSBuZWVkZWQgaWYgdGhlIGZpbGUgc2l6ZSBkaWRuJ3QgcmVzZXQgdG8gMCBhZnRlciBhIHdyaXRlLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB3MV9mMmRfZml4X2NvdW50KGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUpCit7CisJaWYgKG9mZiA+IHNpemUpCisJCXJldHVybiAwOworCisJaWYgKChvZmYgKyBjb3VudCkgPiBzaXplKQorCQlyZXR1cm4gc2l6ZSAtIG9mZjsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFJlYWQgYSBibG9jayBmcm9tIFcxIFJPTSB0d28gdGltZXMgYW5kIGNvbXBhcmVzIHRoZSByZXN1bHRzLgorICogSWYgdGhleSBhcmUgZXF1YWwgdGhleSBhcmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgcmVhZAorICogaXMgcmVwZWF0ZWQgVzFfRjJEX1JFQURfUkVUUklFUyB0aW1lcy4KKyAqCisgKiBjb3VudCBtdXN0IG5vdCBleGNlZWQgVzFfRjJEX1JFQURfTUFYTEVOLgorICovCitzdGF0aWMgaW50IHcxX2YyZF9yZWFkYmxvY2soc3RydWN0IHcxX3NsYXZlICpzbCwgaW50IG9mZiwgaW50IGNvdW50LCBjaGFyICpidWYpCit7CisJdTggd3JidWZbM107CisJdTggY21wW1cxX0YyRF9SRUFEX01BWExFTl07CisJaW50IHRyaWVzID0gVzFfRjJEX1JFQURfUkVUUklFUzsKKworCWRvIHsKKwkJd3JidWZbMF0gPSBXMV9GMkRfUkVBRF9FRVBST007CisJCXdyYnVmWzFdID0gb2ZmICYgMHhmZjsKKwkJd3JidWZbMl0gPSBvZmYgPj4gODsKKworCQlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkKKwkJCXJldHVybiAtMTsKKworCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCB3cmJ1ZiwgMyk7CisJCXcxX3JlYWRfYmxvY2soc2wtPm1hc3RlciwgYnVmLCBjb3VudCk7CisKKwkJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCQlyZXR1cm4gLTE7CisKKwkJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOworCQl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIGNtcCwgY291bnQpOworCisJCWlmICghbWVtY21wKGNtcCwgYnVmLCBjb3VudCkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgtLXRyaWVzKTsKKworCWRldl9lcnIoJnNsLT5kZXYsICJwcm9vZiByZWFkaW5nIGZhaWxlZCAlZCB0aW1lc1xuIiwKKwkJCVcxX0YyRF9SRUFEX1JFVFJJRVMpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3NpemVfdCB3MV9mMmRfcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOworCWludCB0b2RvID0gY291bnQ7CisKKwljb3VudCA9IHcxX2YyZF9maXhfY291bnQob2ZmLCBjb3VudCwgVzFfRjJEX0VFUFJPTV9TSVpFKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CisKKwkvKiByZWFkIGRpcmVjdGx5IGZyb20gdGhlIEVFUFJPTSBpbiBjaHVua3Mgb2YgVzFfRjJEX1JFQURfTUFYTEVOICovCisJd2hpbGUgKHRvZG8gPiAwKSB7CisJCWludCBibG9ja19yZWFkOworCisJCWlmICh0b2RvID49IFcxX0YyRF9SRUFEX01BWExFTikKKwkJCWJsb2NrX3JlYWQgPSBXMV9GMkRfUkVBRF9NQVhMRU47CisJCWVsc2UKKwkJCWJsb2NrX3JlYWQgPSB0b2RvOworCisJCWlmICh3MV9mMmRfcmVhZGJsb2NrKHNsLCBvZmYsIGJsb2NrX3JlYWQsIGJ1ZikgPCAwKQorCQkJY291bnQgPSAtRUlPOworCisJCXRvZG8gLT0gVzFfRjJEX1JFQURfTUFYTEVOOworCQlidWYgKz0gVzFfRjJEX1JFQURfTUFYTEVOOworCQlvZmYgKz0gVzFfRjJEX1JFQURfTUFYTEVOOworCX0KKworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogV3JpdGVzIHRvIHRoZSBzY3JhdGNocGFkIGFuZCByZWFkcyBpdCBiYWNrIGZvciB2ZXJpZmljYXRpb24uCisgKiBUaGVuIGNvcGllcyB0aGUgc2NyYXRjaHBhZCB0byBFRVBST00uCisgKiBUaGUgZGF0YSBtdXN0IGJlIGFsaWduZWQgYXQgVzFfRjJEX1NDUkFUQ0hfU0laRSBieXRlcyBhbmQKKyAqIG11c3QgYmUgVzFfRjJEX1NDUkFUQ0hfU0laRSBieXRlcyBsb25nLgorICogVGhlIG1hc3RlciBtdXN0IGJlIGxvY2tlZC4KKyAqCisgKiBAcGFyYW0gc2wJVGhlIHNsYXZlIHN0cnVjdHVyZQorICogQHBhcmFtIGFkZHIJQWRkcmVzcyBmb3IgdGhlIHdyaXRlCisgKiBAcGFyYW0gbGVuICAgbGVuZ3RoIG11c3QgYmUgPD0gKFcxX0YyRF9QQUdFX1NJWkUgLSAoYWRkciAmIFcxX0YyRF9QQUdFX01BU0spKQorICogQHBhcmFtIGRhdGEJVGhlIGRhdGEgdG8gd3JpdGUKKyAqIEByZXR1cm4JMD1TdWNjZXNzIC0xPWZhaWx1cmUKKyAqLworc3RhdGljIGludCB3MV9mMmRfd3JpdGUoc3RydWN0IHcxX3NsYXZlICpzbCwgaW50IGFkZHIsIGludCBsZW4sIGNvbnN0IHU4ICpkYXRhKQoreworCWludCB0cmllcyA9IFcxX0YyRF9SRUFEX1JFVFJJRVM7CisJdTggd3JidWZbNF07CisJdTggcmRidWZbVzFfRjJEX1NDUkFUQ0hfU0laRSArIDNdOworCXU4IGVzID0gKGFkZHIgKyBsZW4gLSAxKSAlIFcxX0YyRF9TQ1JBVENIX1NJWkU7CisKK3JldHJ5OgorCisJLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIHNjcmF0Y2hwYWQgKi8KKwlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkKKwkJcmV0dXJuIC0xOworCisJd3JidWZbMF0gPSBXMV9GMkRfV1JJVEVfU0NSQVRDSDsKKwl3cmJ1ZlsxXSA9IGFkZHIgJiAweGZmOworCXdyYnVmWzJdID0gYWRkciA+PiA4OworCisJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIGRhdGEsIGxlbik7CisKKwkvKiBSZWFkIHRoZSBzY3JhdGNocGFkIGFuZCB2ZXJpZnkgKi8KKwlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkKKwkJcmV0dXJuIC0xOworCisJdzFfd3JpdGVfOChzbC0+bWFzdGVyLCBXMV9GMkRfUkVBRF9TQ1JBVENIKTsKKwl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIHJkYnVmLCBsZW4gKyAzKTsKKworCS8qIENvbXBhcmUgd2hhdCB3YXMgcmVhZCBhZ2FpbnN0IHRoZSBkYXRhIHdyaXR0ZW4gKi8KKwlpZiAoKHJkYnVmWzBdICE9IHdyYnVmWzFdKSB8fCAocmRidWZbMV0gIT0gd3JidWZbMl0pIHx8CisJICAgIChyZGJ1ZlsyXSAhPSBlcykgfHwgKG1lbWNtcChkYXRhLCAmcmRidWZbM10sIGxlbikgIT0gMCkpIHsKKworCQlpZiAoLS10cmllcykKKwkJCWdvdG8gcmV0cnk7CisKKwkJZGV2X2Vycigmc2wtPmRldiwKKwkJCSJjb3VsZCBub3Qgd3JpdGUgdG8gZWVwcm9tLCBzY3JhdGNocGFkIGNvbXBhcmUgZmFpbGVkICVkIHRpbWVzXG4iLAorCQkJVzFfRjJEX1JFQURfUkVUUklFUyk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENvcHkgdGhlIHNjcmF0Y2hwYWQgdG8gRUVQUk9NICovCisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpCisJCXJldHVybiAtMTsKKworCXdyYnVmWzBdID0gVzFfRjJEX0NPUFlfU0NSQVRDSDsKKwl3cmJ1ZlszXSA9IGVzOworCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIHdyYnVmLCA0KTsKKworCS8qIFNsZWVwIGZvciB0cHJvZyBtcyB0byB3YWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUgKi8KKwltc2xlZXAoVzFfRjJEX1RQUk9HX01TKTsKKworCS8qIFJlc2V0IHRoZSBidXMgdG8gd2FrZSB1cCB0aGUgRUVQUk9NICAqLworCXcxX3Jlc2V0X2J1cyhzbC0+bWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3MV9mMmRfd3JpdGVfYmluKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0ga29ial90b193MV9zbGF2ZShrb2JqKTsKKwlpbnQgYWRkciwgbGVuOworCWludCBjb3B5OworCisJY291bnQgPSB3MV9mMmRfZml4X2NvdW50KG9mZiwgY291bnQsIFcxX0YyRF9FRVBST01fU0laRSk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCisJLyogQ2FuIG9ubHkgd3JpdGUgZGF0YSBpbiBibG9ja3Mgb2YgdGhlIHNpemUgb2YgdGhlIHNjcmF0Y2hwYWQgKi8KKwlhZGRyID0gb2ZmOworCWxlbiA9IGNvdW50OworCXdoaWxlIChsZW4gPiAwKSB7CisKKwkJLyogaWYgbGVuIHRvbyBzaG9ydCBvciBhZGRyIG5vdCBhbGlnbmVkICovCisJCWlmIChsZW4gPCBXMV9GMkRfU0NSQVRDSF9TSVpFIHx8IGFkZHIgJiBXMV9GMkRfU0NSQVRDSF9NQVNLKSB7CisJCQljaGFyIHRtcFtXMV9GMkRfU0NSQVRDSF9TSVpFXTsKKworCQkJLyogcmVhZCB0aGUgYmxvY2sgYW5kIHVwZGF0ZSB0aGUgcGFydHMgdG8gYmUgd3JpdHRlbiAqLworCQkJaWYgKHcxX2YyZF9yZWFkYmxvY2soc2wsIGFkZHIgJiB+VzFfRjJEX1NDUkFUQ0hfTUFTSywKKwkJCQkJVzFfRjJEX1NDUkFUQ0hfU0laRSwgdG1wKSkgeworCQkJCWNvdW50ID0gLUVJTzsKKwkJCQlnb3RvIG91dF91cDsKKwkJCX0KKworCQkJLyogY29weSBhdCBtb3N0IHRvIHRoZSBib3VuZGFyeSBvZiB0aGUgUEFHRSBvciBsZW4gKi8KKwkJCWNvcHkgPSBXMV9GMkRfU0NSQVRDSF9TSVpFIC0KKwkJCQkoYWRkciAmIFcxX0YyRF9TQ1JBVENIX01BU0spOworCisJCQlpZiAoY29weSA+IGxlbikKKwkJCQljb3B5ID0gbGVuOworCisJCQltZW1jcHkoJnRtcFthZGRyICYgVzFfRjJEX1NDUkFUQ0hfTUFTS10sIGJ1ZiwgY29weSk7CisJCQlpZiAodzFfZjJkX3dyaXRlKHNsLCBhZGRyICYgflcxX0YyRF9TQ1JBVENIX01BU0ssCisJCQkJCVcxX0YyRF9TQ1JBVENIX1NJWkUsIHRtcCkgPCAwKSB7CisJCQkJY291bnQgPSAtRUlPOworCQkJCWdvdG8gb3V0X3VwOworCQkJfQorCQl9IGVsc2UgeworCisJCQljb3B5ID0gVzFfRjJEX1NDUkFUQ0hfU0laRTsKKwkJCWlmICh3MV9mMmRfd3JpdGUoc2wsIGFkZHIsIGNvcHksIGJ1ZikgPCAwKSB7CisJCQkJY291bnQgPSAtRUlPOworCQkJCWdvdG8gb3V0X3VwOworCQkJfQorCQl9CisJCWJ1ZiArPSBjb3B5OworCQlhZGRyICs9IGNvcHk7CisJCWxlbiAtPSBjb3B5OworCX0KKworb3V0X3VwOgorCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgdzFfZjJkX2Jpbl9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJlZXByb20iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSLAorCX0sCisJLnNpemUgPSBXMV9GMkRfRUVQUk9NX1NJWkUsCisJLnJlYWQgPSB3MV9mMmRfcmVhZF9iaW4sCisJLndyaXRlID0gdzFfZjJkX3dyaXRlX2JpbiwKK307CisKK3N0YXRpYyBpbnQgdzFfZjJkX2FkZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX2YyZF9iaW5fYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHcxX2YyZF9yZW1vdmVfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX2YyZF9iaW5fYXR0cik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5X29wcyB3MV9mMmRfZm9wcyA9IHsKKwkuYWRkX3NsYXZlICAgICAgPSB3MV9mMmRfYWRkX3NsYXZlLAorCS5yZW1vdmVfc2xhdmUgICA9IHcxX2YyZF9yZW1vdmVfc2xhdmUsCit9OworCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9mYW1pbHlfMmQgPSB7CisJLmZpZCA9IFcxX0VFUFJPTV9EUzI0MzEsCisJLmZvcHMgPSAmdzFfZjJkX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3MV9mMmRfaW5pdCh2b2lkKQoreworCXJldHVybiB3MV9yZWdpc3Rlcl9mYW1pbHkoJncxX2ZhbWlseV8yZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3MV9mMmRfZmluaSh2b2lkKQoreworCXcxX3VucmVnaXN0ZXJfZmFtaWx5KCZ3MV9mYW1pbHlfMmQpOworfQorCittb2R1bGVfaW5pdCh3MV9mMmRfaW5pdCk7Cittb2R1bGVfZXhpdCh3MV9mMmRfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJlcm5oYXJkIFdlaXJpY2ggPGJlcm5oYXJkLndlaXJpY2hAcmllZGVsLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigidzEgZmFtaWx5IDJkIGRyaXZlciBmb3IgRFMyNDMxLCAxa2IgRUVQUk9NIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCBmYjI4YWNhLi4yYzhkZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTM3LDMxICszNywzMyBAQAogTU9EVUxFX0FVVEhPUigiRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciAxLXdpcmUgRGFsbGFzIG5ldHdvcmsgcHJvdG9jb2wsIHRlbXBlcmF0dXJlIGZhbWlseS4iKTsKIAorLyogQWxsb3cgdGhlIHN0cm9uZyBwdWxsdXAgdG8gYmUgZGlzYWJsZWQsIGJ1dCBkZWZhdWx0IHRvIGVuYWJsZWQuCisgKiBJZiBpdCB3YXMgZGlzYWJsZWQgYSBwYXJhc2l0ZSBwb3dlcmVkIGRldmljZSBtaWdodCBub3QgZ2V0IHRoZSByZXF1aXJlCisgKiBjdXJyZW50IHRvIGRvIGEgdGVtcGVyYXR1cmUgY29udmVyc2lvbi4gIElmIGl0IGlzIGVuYWJsZWQgcGFyYXNpdGUgcG93ZXJlZAorICogZGV2aWNlcyBoYXZlIGEgYmV0dGVyIGNoYW5jZSBvZiBnZXR0aW5nIHRoZSBjdXJyZW50IHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IHcxX3N0cm9uZ19wdWxsdXAgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKHN0cm9uZ19wdWxsdXAsIHcxX3N0cm9uZ19wdWxsdXAsIGludCwgMCk7CisKIHN0YXRpYyB1OCBiYWRfcm9tc1tdWzldID0gewogCQkJCXsweGFhLCAweDAwLCAweDRiLCAweDQ2LCAweGZmLCAweGZmLCAweDBjLCAweDEwLCAweDg3fSwKIAkJCQl7fQogCQkJfTsKIAotc3RhdGljIHNzaXplX3QgdzFfdGhlcm1fcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiwKLQkJCQkgY2hhciAqLCBsb2ZmX3QsIHNpemVfdCk7CitzdGF0aWMgc3NpemVfdCB3MV90aGVybV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKIAotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX3RoZXJtX2Jpbl9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJ3MV9zbGF2ZSIsCi0JCS5tb2RlID0gU19JUlVHTywKLQl9LAotCS5zaXplID0gVzFfU0xBVkVfREFUQV9TSVpFLAotCS5yZWFkID0gdzFfdGhlcm1fcmVhZF9iaW4sCi19Oworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHcxX3RoZXJtX2F0dHIgPQorCV9fQVRUUih3MV9zbGF2ZSwgU19JUlVHTywgdzFfdGhlcm1fcmVhZCwgTlVMTCk7CiAKIHN0YXRpYyBpbnQgdzFfdGhlcm1fYWRkX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCiB7Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfdGhlcm1fYmluX2F0dHIpOworCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNsLT5kZXYsICZ3MV90aGVybV9hdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgdzFfdGhlcm1fcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCiB7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV90aGVybV9iaW5fYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZzbC0+ZGV2LCAmdzFfdGhlcm1fYXR0cik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdzFfZmFtaWx5X29wcyB3MV90aGVybV9mb3BzID0gewpAQCAtMTYwLDMwICsxNjIsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgdzFfdGhlcm1fcmVhZF9iaW4oc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQkgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCB3MV90aGVybV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBkZXZfdG9fdzFfc2xhdmUoZGV2aWNlKTsKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYgPSBzbC0+bWFzdGVyOwogCXU4IHJvbVs5XSwgY3JjLCB2ZXJkaWN0OwogCWludCBpLCBtYXhfdHJ5aW5nID0gMTA7CisJc3NpemVfdCBjID0gUEFHRV9TSVpFOwogCi0JbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCi0JaWYgKG9mZiA+IFcxX1NMQVZFX0RBVEFfU0laRSkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAob2ZmICsgY291bnQgPiBXMV9TTEFWRV9EQVRBX1NJWkUpIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltZW1zZXQoYnVmLCAwLCBjb3VudCk7CiAJbWVtc2V0KHJvbSwgMCwgc2l6ZW9mKHJvbSkpOwogCi0JY291bnQgPSAwOwogCXZlcmRpY3QgPSAwOwogCWNyYyA9IDA7CiAKQEAgLTE5MiwxNSArMTgzLDIwIEBACiAJCQlpbnQgY291bnQgPSAwOwogCQkJdW5zaWduZWQgaW50IHRtID0gNzUwOwogCisJCQkvKiA3NTBtcyBzdHJvbmcgcHVsbHVwIChvciBkZWxheSkgYWZ0ZXIgdGhlIGNvbnZlcnQgKi8KKwkJCWlmICh3MV9zdHJvbmdfcHVsbHVwKQorCQkJCXcxX25leHRfcHVsbHVwKGRldiwgdG0pOwogCQkJdzFfd3JpdGVfOChkZXYsIFcxX0NPTlZFUlRfVEVNUCk7Ci0KLQkJCW1zbGVlcCh0bSk7CisJCQlpZiAoIXcxX3N0cm9uZ19wdWxsdXApCisJCQkJbXNsZWVwKHRtKTsKIAogCQkJaWYgKCF3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CiAKIAkJCQl3MV93cml0ZV84KGRldiwgVzFfUkVBRF9TQ1JBVENIUEFEKTsKIAkJCQlpZiAoKGNvdW50ID0gdzFfcmVhZF9ibG9jayhkZXYsIHJvbSwgOSkpICE9IDkpIHsKLQkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAidzFfcmVhZF9ibG9jaygpIHJldHVybmVkICVkIGluc3RlYWQgb2YgOS5cbiIsIGNvdW50KTsKKwkJCQkJZGV2X3dhcm4oZGV2aWNlLCAidzFfcmVhZF9ibG9jaygpICIKKwkJCQkJCSJyZXR1cm5lZCAldSBpbnN0ZWFkIG9mIDkuXG4iLAorCQkJCQkJY291bnQpOwogCQkJCX0KIAogCQkJCWNyYyA9IHcxX2NhbGNfY3JjOChyb20sIDgpOwpAQCAtMjE1LDIyICsyMTEsMjIgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgOTsgKytpKQotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJTAyeCAiLCByb21baV0pOwotCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICI6IGNyYz0lMDJ4ICVzXG4iLAorCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICIlMDJ4ICIsIHJvbVtpXSk7CisJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAiOiBjcmM9JTAyeCAlc1xuIiwKIAkJCSAgIGNyYywgKHZlcmRpY3QpID8gIllFUyIgOiAiTk8iKTsKIAlpZiAodmVyZGljdCkKIAkJbWVtY3B5KHNsLT5yb20sIHJvbSwgc2l6ZW9mKHNsLT5yb20pKTsKIAllbHNlCi0JCWRldl93YXJuKCZkZXYtPmRldiwgIjE4UzIwIGRvZXNuJ3QgcmVzcG9uZCB0byBDT05WRVJUX1RFTVAuXG4iKTsKKwkJZGV2X3dhcm4oZGV2aWNlLCAiMThTMjAgZG9lc24ndCByZXNwb25kIHRvIENPTlZFUlRfVEVNUC5cbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IDk7ICsraSkKLQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiUwMnggIiwgc2wtPnJvbVtpXSk7CisJCWMgLT0gc25wcmludGYoYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIiUwMnggIiwgc2wtPnJvbVtpXSk7CiAKLQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAidD0lZFxuIiwgdzFfY29udmVydF90ZW1wKHJvbSwgc2wtPmZhbWlseS0+ZmlkKSk7Ci1vdXQ6CisJYyAtPSBzbnByaW50ZihidWYgKyBQQUdFX1NJWkUgLSBjLCBjLCAidD0lZFxuIiwKKwkJdzFfY29udmVydF90ZW1wKHJvbSwgc2wtPmZhbWlseS0+ZmlkKSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gUEFHRV9TSVpFIC0gYzsKIH0KIAogc3RhdGljIGludCBfX2luaXQgdzFfdGhlcm1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDcyOTNjOWIuLjNiNjE1ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTQ2LDE5ICs0NiwxNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIDEtd2lyZSBEYWxsYXMgbmV0d29yayBwcm90b2NvbC4iKTsKIAogc3RhdGljIGludCB3MV90aW1lb3V0ID0gMTA7Ci1zdGF0aWMgaW50IHcxX2NvbnRyb2xfdGltZW91dCA9IDE7CiBpbnQgdzFfbWF4X3NsYXZlX2NvdW50ID0gMTA7CiBpbnQgdzFfbWF4X3NsYXZlX3R0bCA9IDEwOwogCiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dCwgdzFfdGltZW91dCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChjb250cm9sX3RpbWVvdXQsIHcxX2NvbnRyb2xfdGltZW91dCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfc2xhdmVfY291bnQsIHcxX21heF9zbGF2ZV9jb3VudCwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChzbGF2ZV90dGwsIHcxX21heF9zbGF2ZV90dGwsIGludCwgMCk7CiAKIERFRklORV9NVVRFWCh3MV9tbG9jayk7CiBMSVNUX0hFQUQodzFfbWFzdGVycyk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKncxX2NvbnRyb2xfdGhyZWFkOworc3RhdGljIGludCB3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IHcxX3JlZ19udW0gKnJuKTsKIAogc3RhdGljIGludCB3MV9tYXN0ZXJfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewpAQCAtODMsMTAgKzgxLDEwIEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOwogCi0JcHJpbnRrKCIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBSZWxlYXNpbmcgJXMuXG4iLCBfX2Z1bmNfXywgc2wtPm5hbWUpOwogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZzbC0+cmVmY250KSkgewotCQlwcmludGsoIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAorCQlkZXZfZGJnKGRldiwgIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAogCQkJCXNsLT5uYW1lLCBhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpOwogCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtMTA1LDM1ICsxMDMsMjAgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc2wtPm5hbWUpOwogfQogCi1zdGF0aWMgc3NpemVfdCB3MV9zbGF2ZV9yZWFkX2lkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHcxX3NsYXZlX3JlYWRfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCA9IGtvYmpfdG9fdzFfc2xhdmUoa29iaik7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOworCXNzaXplX3QgY291bnQgPSBzaXplb2Yoc2wtPnJlZ19udW0pOwogCi0JaWYgKG9mZiA+IDgpIHsKLQkJY291bnQgPSAwOwotCX0gZWxzZSB7Ci0JCWlmIChvZmYgKyBjb3VudCA+IDgpCi0JCQljb3VudCA9IDggLSBvZmY7Ci0KLQkJbWVtY3B5KGJ1ZiwgKHU4ICopJnNsLT5yZWdfbnVtLCBjb3VudCk7Ci0JfQotCisJbWVtY3B5KGJ1ZiwgKHU4ICopJnNsLT5yZWdfbnVtLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdzFfc2xhdmVfYXR0cl9uYW1lID0KIAlfX0FUVFIobmFtZSwgU19JUlVHTywgdzFfc2xhdmVfcmVhZF9uYW1lLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX3NsYXZlX2F0dHJfYmluX2lkID0gewotICAgICAgLmF0dHIgPSB7Ci0gICAgICAgICAgICAgIC5uYW1lID0gImlkIiwKLSAgICAgICAgICAgICAgLm1vZGUgPSBTX0lSVUdPLAotICAgICAgfSwKLSAgICAgIC5zaXplID0gOCwKLSAgICAgIC5yZWFkID0gdzFfc2xhdmVfcmVhZF9pZCwKLX07CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdzFfc2xhdmVfYXR0cl9pZCA9CisJX19BVFRSKGlkLCBTX0lSVUdPLCB3MV9zbGF2ZV9yZWFkX2lkLCBOVUxMKTsKIAogLyogRGVmYXVsdCBmYW1pbHkgKi8KIApAQCAtMjUwLDExICsyMzMsMTYgQEAKIAkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkJY29uc3QgY2hhciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQogeworCWxvbmcgdG1wOwogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAwLCAmdG1wKSA9PSAtRUlOVkFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW11dGV4X2xvY2soJm1kLT5tdXRleCk7Ci0JbWQtPnNlYXJjaF9jb3VudCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAwKTsKKwltZC0+c2VhcmNoX2NvdW50ID0gdG1wOwogCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKKwl3YWtlX3VwX3Byb2Nlc3MobWQtPnRocmVhZCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yNzMsNiArMjYxLDM4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3N0b3JlX3B1bGx1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWxvbmcgdG1wOworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAwLCAmdG1wKSA9PSAtRUlOVkFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CisJbWQtPmVuYWJsZV9wdWxsdXAgPSB0bXA7CisJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOworCXdha2VfdXBfcHJvY2VzcyhtZC0+dGhyZWFkKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X3B1bGx1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKKwlzc2l6ZV90IGNvdW50OworCisJbXV0ZXhfbG9jaygmbWQtPm11dGV4KTsKKwljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIG1kLT5lbmFibGVfcHVsbHVwKTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc2hvd19wb2ludGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKQEAgLTMyNCw3ICszNDQsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X3NsYXZlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfc2xhdmVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCWludCBjID0gUEFHRV9TSVpFOwpAQCAtMzQ5LDYgKzM3MCwxMzUgQEAKIAlyZXR1cm4gUEFHRV9TSVpFIC0gYzsKIH0KIAorc3RhdGljIHNzaXplX3QgdzFfbWFzdGVyX2F0dHJpYnV0ZV9zaG93X2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgYyA9IFBBR0VfU0laRTsKKwljIC09IHNucHJpbnRmKGJ1ZitQQUdFX1NJWkUgLSBjLCBjLAorCQkid3JpdGUgZGV2aWNlIGlkIHh4LXh4eHh4eHh4eHh4eCB0byBhZGQgc2xhdmVcbiIpOworCXJldHVybiBQQUdFX1NJWkUgLSBjOworfQorCitzdGF0aWMgaW50IHcxX2F0b3JlZ19udW0oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwlzdHJ1Y3QgdzFfcmVnX251bSAqcm4pCit7CisJdW5zaWduZWQgaW50IGZhbWlseTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaWQ7CisJaW50IGk7CisJdTY0IHJuNjRfbGU7CisKKwkvKiBUaGUgQ1JDIHZhbHVlIGlzbid0IHJlYWQgZnJvbSB0aGUgdXNlciBiZWNhdXNlIHRoZSBzeXNmcyBkaXJlY3RvcnkKKwkgKiBkb2Vzbid0IGluY2x1ZGUgaXQgYW5kIG1vc3QgbWVzc2FnZXMgZnJvbSB0aGUgYnVzIHNlYXJjaCBkb24ndAorCSAqIHByaW50IGl0IGVpdGhlci4gIEl0IHdvdWxkIGJlIHVucmVhc29uYWJsZSBmb3IgdGhlIHVzZXIgdG8gdGhlbgorCSAqIHByb3ZpZGUgaXQuCisJICovCisJY29uc3QgY2hhciAqZXJyb3JfbXNnID0gImJhZCBzbGF2ZSBzdHJpbmcgZm9ybWF0LCBleHBlY3RpbmcgIgorCQkiZmYtZGRkZGRkZGRkZGRkXG4iOworCisJaWYgKGJ1ZlsyXSAhPSAnLScpIHsKKwkJZGV2X2VycihkZXYsICIlcyIsIGVycm9yX21zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpID0gc3NjYW5mKGJ1ZiwgIiUwMngtJTAxMmxseCIsICZmYW1pbHksICZpZCk7CisJaWYgKGkgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIiwgZXJyb3JfbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJuLT5mYW1pbHkgPSBmYW1pbHk7CisJcm4tPmlkID0gaWQ7CisKKwlybjY0X2xlID0gY3B1X3RvX2xlNjQoKih1NjQgKilybik7CisJcm4tPmNyYyA9IHcxX2NhbGNfY3JjOCgodTggKikmcm42NF9sZSwgNyk7CisKKyNpZiAwCisJZGV2X2luZm8oZGV2LCAiV2l0aCBDUkMgZGV2aWNlIGlzICUwMnguJTAxMmxseC4lMDJ4LlxuIiwKKwkJICBybi0+ZmFtaWx5LCAodW5zaWduZWQgbG9uZyBsb25nKXJuLT5pZCwgcm4tPmNyYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKiBTZWFyY2hlcyB0aGUgc2xhdmVzIGluIHRoZSB3MV9tYXN0ZXIgYW5kIHJldHVybnMgYSBwb2ludGVyIG9yIE5VTEwuCisgKiBOb3RlOiBtdXN0IGhvbGQgdGhlIG11dGV4CisgKi8KK3N0YXRpYyBzdHJ1Y3QgdzFfc2xhdmUgKncxX3NsYXZlX3NlYXJjaF9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2LAorCXN0cnVjdCB3MV9yZWdfbnVtICpybikKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQlpZiAoc2wtPnJlZ19udW0uZmFtaWx5ID09IHJuLT5mYW1pbHkgJiYKKwkJCQlzbC0+cmVnX251bS5pZCA9PSBybi0+aWQgJiYKKwkJCQlzbC0+cmVnX251bS5jcmMgPT0gcm4tPmNyYykgeworCQkJcmV0dXJuIHNsOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3N0b3JlX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOworCXN0cnVjdCB3MV9yZWdfbnVtIHJuOworCXN0cnVjdCB3MV9zbGF2ZSAqc2w7CisJc3NpemVfdCByZXN1bHQgPSBjb3VudDsKKworCWlmICh3MV9hdG9yZWdfbnVtKGRldiwgYnVmLCBjb3VudCwgJnJuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOworCXNsID0gdzFfc2xhdmVfc2VhcmNoX2RldmljZShtZCwgJnJuKTsKKwkvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGRvIGEgdGFyZ2V0ZWQgc2VhcmNoIG9uZSB0aGUgb25lLXdpcmUgYnVzCisJICogZm9yIHRoZSBuZXcgZGV2aWNlIHRvIHNlZSBpZiBpdCBpcyBvdXQgdGhlcmUgb3Igbm90LiAgQnV0IHRoZQorCSAqIGN1cnJlbnQgc2VhcmNoIGRvZXNuJ3Qgc3VwcG9ydCB0aGF0LgorCSAqLworCWlmIChzbCkgeworCQlkZXZfaW5mbyhkZXYsICJEZXZpY2UgJXMgYWxyZWFkeSBleGlzdHNcbiIsIHNsLT5uYW1lKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQl3MV9hdHRhY2hfc2xhdmVfZGV2aWNlKG1kLCAmcm4pOworCX0KKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdCB3MV9tYXN0ZXJfYXR0cmlidXRlX3Nob3dfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBjID0gUEFHRV9TSVpFOworCWMgLT0gc25wcmludGYoYnVmK1BBR0VfU0laRSAtIGMsIGMsCisJCSJ3cml0ZSBkZXZpY2UgaWQgeHgteHh4eHh4eHh4eHh4IHRvIHJlbW92ZSBzbGF2ZVxuIik7CisJcmV0dXJuIFBBR0VfU0laRSAtIGM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHcxX21hc3Rlcl9hdHRyaWJ1dGVfc3RvcmVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CisJc3RydWN0IHcxX3JlZ19udW0gcm47CisJc3RydWN0IHcxX3NsYXZlICpzbDsKKwlzc2l6ZV90IHJlc3VsdCA9IGNvdW50OworCisJaWYgKHcxX2F0b3JlZ19udW0oZGV2LCBidWYsIGNvdW50LCAmcm4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CisJc2wgPSB3MV9zbGF2ZV9zZWFyY2hfZGV2aWNlKG1kLCAmcm4pOworCWlmIChzbCkgeworCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKGRldiwgIkRldmljZSAlMDJ4LSUwMTJsbHggZG9lc24ndCBleGlzdHNcbiIsIHJuLmZhbWlseSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcm4uaWQpOworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0KKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiAjZGVmaW5lIFcxX01BU1RFUl9BVFRSX1JPKF9uYW1lLCBfbW9kZSkJCQkJXAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHcxX21hc3Rlcl9hdHRyaWJ1dGVfIyNfbmFtZSA9CVwKIAkJX19BVFRSKHcxX21hc3Rlcl8jI19uYW1lLCBfbW9kZSwJCVwKQEAgLTM2OCw2ICs1MTgsOSBAQAogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHRpbWVvdXQsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JPKHBvaW50ZXIsIFNfSVJVR08pOwogc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKHNlYXJjaCwgU19JUlVHTyB8IFNfSVdVR08pOworc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKHB1bGx1cCwgU19JUlVHTyB8IFNfSVdVR08pOworc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKGFkZCwgU19JUlVHTyB8IFNfSVdVR08pOworc3RhdGljIFcxX01BU1RFUl9BVFRSX1JXKHJlbW92ZSwgU19JUlVHTyB8IFNfSVdVR08pOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdzFfbWFzdGVyX2RlZmF1bHRfYXR0cnNbXSA9IHsKIAkmdzFfbWFzdGVyX2F0dHJpYnV0ZV9uYW1lLmF0dHIsCkBAIC0zNzgsNiArNTMxLDkgQEAKIAkmdzFfbWFzdGVyX2F0dHJpYnV0ZV90aW1lb3V0LmF0dHIsCiAJJncxX21hc3Rlcl9hdHRyaWJ1dGVfcG9pbnRlci5hdHRyLAogCSZ3MV9tYXN0ZXJfYXR0cmlidXRlX3NlYXJjaC5hdHRyLAorCSZ3MV9tYXN0ZXJfYXR0cmlidXRlX3B1bGx1cC5hdHRyLAorCSZ3MV9tYXN0ZXJfYXR0cmlidXRlX2FkZC5hdHRyLAorCSZ3MV9tYXN0ZXJfYXR0cmlidXRlX3JlbW92ZS5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTM5MCw3ICs1NDYsNyBAQAogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJm1hc3Rlci0+ZGV2LmtvYmosICZ3MV9tYXN0ZXJfZGVmYXR0cl9ncm91cCk7CiB9CiAKLXN0YXRpYyB2b2lkIHcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqbWFzdGVyKQordm9pZCB3MV9kZXN0cm95X21hc3Rlcl9hdHRyaWJ1dGVzKHN0cnVjdCB3MV9tYXN0ZXIgKm1hc3RlcikKIHsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJm1hc3Rlci0+ZGV2LmtvYmosICZ3MV9tYXN0ZXJfZGVmYXR0cl9ncm91cCk7CiB9CkBAIC00NzksNyArNjM1LDcgQEAKIAl9CiAKIAkvKiBDcmVhdGUgImlkIiBlbnRyeSAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfc2xhdmVfYXR0cl9iaW5faWQpOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfaWQpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKQEAgLTUwMSw3ICs2NTcsNyBAQAogCXJldHVybiAwOwogCiBvdXRfcmVtMjoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX3NsYXZlX2F0dHJfYmluX2lkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNsLT5kZXYsICZ3MV9zbGF2ZV9hdHRyX2lkKTsKIG91dF9yZW0xOgogCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfbmFtZSk7CiBvdXRfdW5yZWc6CkBAIC01NjcsNyArNzIzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdzFfc2xhdmVfZGV0YWNoKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit2b2lkIHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CiAKQEAgLTU4Myw3ICs3MzksNyBAQAogCW1zZy50eXBlID0gVzFfU0xBVkVfUkVNT1ZFOwogCXcxX25ldGxpbmtfc2VuZChzbC0+bWFzdGVyLCAmbXNnKTsKIAotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfc2xhdmVfYXR0cl9iaW5faWQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfaWQpOwogCWRldmljZV9yZW1vdmVfZmlsZSgmc2wtPmRldiwgJncxX3NsYXZlX2F0dHJfbmFtZSk7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJnNsLT5kZXYpOwogCkBAIC01OTEsMjQgKzc0Nyw2IEBACiAJa2ZyZWUoc2wpOwogfQogCi1zdGF0aWMgc3RydWN0IHcxX21hc3RlciAqdzFfc2VhcmNoX21hc3Rlcih2b2lkICpkYXRhKQotewotCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKLQlpbnQgZm91bmQgPSAwOwotCi0JbXV0ZXhfbG9jaygmdzFfbWxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7Ci0JCWlmIChkZXYtPmJ1c19tYXN0ZXItPmRhdGEgPT0gZGF0YSkgewotCQkJZm91bmQgPSAxOwotCQkJYXRvbWljX2luYygmZGV2LT5yZWZjbnQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7Ci0KLQlyZXR1cm4gKGZvdW5kKT9kZXY6TlVMTDsKLX0KLQogc3RydWN0IHcxX21hc3RlciAqdzFfc2VhcmNoX21hc3Rlcl9pZCh1MzIgaWQpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2OwpAQCAtNjU2LDU1ICs3OTQsNTYgQEAKIAlyZXR1cm4gKGZvdW5kKT9zbDpOVUxMOwogfQogCi12b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZikKK3ZvaWQgdzFfcmVjb25uZWN0X3NsYXZlcyhzdHJ1Y3QgdzFfZmFtaWx5ICpmLCBpbnQgYXR0YWNoKQogeworCXN0cnVjdCB3MV9zbGF2ZSAqc2wsICpzbG47CiAJc3RydWN0IHcxX21hc3RlciAqZGV2OwogCiAJbXV0ZXhfbG9jaygmdzFfbWxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7Ci0JCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiAlcyBpbnRvIG5ldyBmYW1pbHkgJTAyeC5cbiIsCi0JCQkJZGV2LT5uYW1lLCBmLT5maWQpOwotCQlzZXRfYml0KFcxX01BU1RFUl9ORUVEX1JFQ09OTkVDVCwgJmRldi0+ZmxhZ3MpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzICIKKwkJCSJmb3IgZmFtaWx5ICUwMnguXG4iLCBkZXYtPm5hbWUsIGYtPmZpZCk7CisJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CisJCQkvKiBJZiBpdCBpcyBhIG5ldyBmYW1pbHksIHNsYXZlcyB3aXRoIHRoZSBkZWZhdWx0CisJCQkgKiBmYW1pbHkgZHJpdmVyIGFuZCBhcmUgdGhhdCBmYW1pbHkgd2lsbCBiZQorCQkJICogY29ubmVjdGVkLiAgSWYgdGhlIGZhbWlseSBpcyBnb2luZyBhd2F5LCBkZXZpY2VzCisJCQkgKiBtYXRjaGluZyB0aGF0IGZhbWlseSBhcmUgcmVjb25uZWNlZC4KKwkJCSAqLworCQkJaWYgKChhdHRhY2ggJiYgc2wtPmZhbWlseS0+ZmlkID09IFcxX0ZBTUlMWV9ERUZBVUxUCisJCQkJJiYgc2wtPnJlZ19udW0uZmFtaWx5ID09IGYtPmZpZCkgfHwKKwkJCQkoIWF0dGFjaCAmJiBzbC0+ZmFtaWx5LT5maWQgPT0gZi0+ZmlkKSkgeworCQkJCXN0cnVjdCB3MV9yZWdfbnVtIHJuOworCisJCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKKwkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCisJCQkJdzFfYXR0YWNoX3NsYXZlX2RldmljZShkZXYsICZybik7CisJCQl9CisJCX0KKwkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcyAiCisJCQkiaGFzIGJlZW4gZmluaXNoZWQuXG4iLCBkZXYtPm5hbWUpOworCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCX0KIAltdXRleF91bmxvY2soJncxX21sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgdzFfc2xhdmVfZm91bmQodm9pZCAqZGF0YSwgdTY0IHJuKQorc3RhdGljIHZvaWQgdzFfc2xhdmVfZm91bmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1NjQgcm4pCiB7Ci0JaW50IHNsYXZlX2NvdW50OwogCXN0cnVjdCB3MV9zbGF2ZSAqc2w7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50OwogCXN0cnVjdCB3MV9yZWdfbnVtICp0bXA7Ci0Jc3RydWN0IHcxX21hc3RlciAqZGV2OwogCXU2NCBybl9sZSA9IGNwdV90b19sZTY0KHJuKTsKIAotCWRldiA9IHcxX3NlYXJjaF9tYXN0ZXIoZGF0YSk7Ci0JaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZmluZCB3MSBtYXN0ZXIgZGV2aWNlIGZvciBkYXRhICVwLCAiCi0JCSAgICAgICAiaXQgaXMgaW1wb3NzaWJsZS5cbiIsIGRhdGEpOwotCQlyZXR1cm47Ci0JfQorCWF0b21pY19pbmMoJmRldi0+cmVmY250KTsKIAogCXRtcCA9IChzdHJ1Y3QgdzFfcmVnX251bSAqKSAmcm47CiAKLQlzbGF2ZV9jb3VudCA9IDA7Ci0JbGlzdF9mb3JfZWFjaChlbnQsICZkZXYtPnNsaXN0KSB7Ci0KLQkJc2wgPSBsaXN0X2VudHJ5KGVudCwgc3RydWN0IHcxX3NsYXZlLCB3MV9zbGF2ZV9lbnRyeSk7Ci0KLQkJaWYgKHNsLT5yZWdfbnVtLmZhbWlseSA9PSB0bXAtPmZhbWlseSAmJgotCQkgICAgc2wtPnJlZ19udW0uaWQgPT0gdG1wLT5pZCAmJgotCQkgICAgc2wtPnJlZ19udW0uY3JjID09IHRtcC0+Y3JjKSB7Ci0JCQlzZXRfYml0KFcxX1NMQVZFX0FDVElWRSwgKGxvbmcgKikmc2wtPmZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2xhdmVfY291bnQrKzsKLQl9Ci0KLQlpZiAoc2xhdmVfY291bnQgPT0gZGV2LT5zbGF2ZV9jb3VudCAmJgotCQlybiAmJiAoKHJuID4+IDU2KSAmIDB4ZmYpID09IHcxX2NhbGNfY3JjOCgodTggKikmcm5fbGUsIDcpKSB7Ci0JCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCB0bXApOworCXNsID0gdzFfc2xhdmVfc2VhcmNoX2RldmljZShkZXYsIHRtcCk7CisJaWYgKHNsKSB7CisJCXNldF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAobG9uZyAqKSZzbC0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCWlmIChybiAmJiB0bXAtPmNyYyA9PSB3MV9jYWxjX2NyYzgoKHU4ICopJnJuX2xlLCA3KSkKKwkJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCB0bXApOwogCX0KIAogCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKQEAgLTc3OSw4MiArOTE4LDIyIEBACiAJCQkvKiBleHRyYWN0IHRoZSBkaXJlY3Rpb24gdGFrZW4gJiB1cGRhdGUgdGhlIGRldmljZSBudW1iZXIgKi8KIAkJCXRtcDY0ID0gKHRyaXBsZXRfcmV0ID4+IDIpOwogCQkJcm4gfD0gKHRtcDY0IDw8IGkpOworCisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJBYm9ydCB3MV9zZWFyY2hcbiIpOworCQkJCXJldHVybjsKKwkJCX0KIAkJfQogCiAJCWlmICggKHRyaXBsZXRfcmV0ICYgMHgwMykgIT0gMHgwMyApIHsKIAkJCWlmICggKGRlc2NfYml0ID09IGxhc3RfemVybykgfHwgKGxhc3RfemVybyA8IDApKQogCQkJCWxhc3RfZGV2aWNlID0gMTsKIAkJCWRlc2NfYml0ID0gbGFzdF96ZXJvOwotCQkJY2IoZGV2LT5idXNfbWFzdGVyLT5kYXRhLCBybik7CisJCQljYihkZXYsIHJuKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIGludCB3MV9jb250cm9sKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKLQlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsICpuOwotCWludCBoYXZlX3RvX3dhaXQgPSAwOwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGhhdmVfdG9fd2FpdCkgewotCQloYXZlX3RvX3dhaXQgPSAwOwotCi0JCXRyeV90b19mcmVlemUoKTsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUodzFfY29udHJvbF90aW1lb3V0ICogMTAwMCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgbiwgJncxX21hc3RlcnMsIHcxX21hc3Rlcl9lbnRyeSkgewotCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWRldi0+ZmxhZ3MpCi0JCQkJY29udGludWU7Ci0JCQkvKgotCQkJICogTGl0dGxlIHJhY2U6IHdlIGNhbiBjcmVhdGUgdGhyZWFkIGJ1dCBub3Qgc2V0IHRoZSBmbGFnLgotCQkJICogR2V0IGEgY2hhbmNlIGZvciBleHRlcm5hbCBwcm9jZXNzIHRvIHNldCBmbGFnIHVwLgotCQkJICovCi0JCQlpZiAoIWRldi0+aW5pdGlhbGl6ZWQpIHsKLQkJCQloYXZlX3RvX3dhaXQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IHRlc3RfYml0KFcxX01BU1RFUl9ORUVEX0VYSVQsICZkZXYtPmZsYWdzKSkgewotCQkJCXNldF9iaXQoVzFfTUFTVEVSX05FRURfRVhJVCwgJmRldi0+ZmxhZ3MpOwotCi0JCQkJbXV0ZXhfbG9jaygmdzFfbWxvY2spOwotCQkJCWxpc3RfZGVsKCZkZXYtPncxX21hc3Rlcl9lbnRyeSk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7Ci0KLQkJCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKLQkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7Ci0JCQkJCXcxX3NsYXZlX2RldGFjaChzbCk7Ci0JCQkJfQotCQkJCXcxX2Rlc3Ryb3lfbWFzdGVyX2F0dHJpYnV0ZXMoZGV2KTsKLQkJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwotCQkJCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRlc3RfYml0KFcxX01BU1RFUl9ORUVEX1JFQ09OTkVDVCwgJmRldi0+ZmxhZ3MpKSB7Ci0JCQkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluIGRldmljZSAlcy5cbiIsIGRldi0+bmFtZSk7Ci0JCQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewotCQkJCQlpZiAoc2wtPmZhbWlseS0+ZmlkID09IFcxX0ZBTUlMWV9ERUZBVUxUKSB7Ci0JCQkJCQlzdHJ1Y3QgdzFfcmVnX251bSBybjsKLQotCQkJCQkJbWVtY3B5KCZybiwgJnNsLT5yZWdfbnVtLCBzaXplb2Yocm4pKTsKLQkJCQkJCXcxX3NsYXZlX2RldGFjaChzbCk7Ci0KLQkJCQkJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCAmcm4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiBkZXZpY2UgJXMgaGFzIGJlZW4gZmluaXNoZWQuXG4iLCBkZXYtPm5hbWUpOwotCQkJCWNsZWFyX2JpdChXMV9NQVNURVJfTkVFRF9SRUNPTk5FQ1QsICZkZXYtPmZsYWdzKTsKLQkJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgdzFfc2VhcmNoX3Byb2Nlc3Moc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSkKIHsKIAlzdHJ1Y3QgdzFfc2xhdmUgKnNsLCAqc2xuOwpAQCAtODc4LDIzICs5NTcsMjkgQEAKIGludCB3MV9wcm9jZXNzKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gKHN0cnVjdCB3MV9tYXN0ZXIgKikgZGF0YTsKKwkvKiBBcyBsb25nIGFzIHcxX3RpbWVvdXQgaXMgb25seSBzZXQgYnkgYSBtb2R1bGUgcGFyYW1ldGVyIHRoZSBzbGVlcAorCSAqIHRpbWUgY2FuIGJlIGNhbGN1bGF0ZWQgaW4gamlmZmllcyBvbmNlLgorCSAqLworCWNvbnN0IHVuc2lnbmVkIGxvbmcganRpbWUgPSBtc2Vjc190b19qaWZmaWVzKHcxX3RpbWVvdXQgKiAxMDAwKTsKIAotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICF0ZXN0X2JpdChXMV9NQVNURVJfTkVFRF9FWElULCAmZGV2LT5mbGFncykpIHsKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpZiAoZGV2LT5zZWFyY2hfY291bnQpIHsKKwkJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCQkJdzFfc2VhcmNoX3Byb2Nlc3MoZGV2LCBXMV9TRUFSQ0gpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJfQorCiAJCXRyeV90b19mcmVlemUoKTsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUodzFfdGltZW91dCAqIDEwMDApOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCB0ZXN0X2JpdChXMV9NQVNURVJfTkVFRF9FWElULCAmZGV2LT5mbGFncykpCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAotCQlpZiAoIWRldi0+aW5pdGlhbGl6ZWQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZGV2LT5zZWFyY2hfY291bnQgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwotCQl3MV9zZWFyY2hfcHJvY2VzcyhkZXYsIFcxX1NFQVJDSCk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCS8qIE9ubHkgc2xlZXAgd2hlbiB0aGUgc2VhcmNoIGlzIGFjdGl2ZS4gKi8KKwkJaWYgKGRldi0+c2VhcmNoX2NvdW50KQorCQkJc2NoZWR1bGVfdGltZW91dChqdGltZSk7CisJCWVsc2UKKwkJCXNjaGVkdWxlKCk7CiAJfQogCiAJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOwpAQCAtOTMyLDE4ICsxMDE3LDEzIEBACiAJCWdvdG8gZXJyX291dF9tYXN0ZXJfdW5yZWdpc3RlcjsKIAl9CiAKLQl3MV9jb250cm9sX3RocmVhZCA9IGt0aHJlYWRfcnVuKHcxX2NvbnRyb2wsIE5VTEwsICJ3MV9jb250cm9sIik7Ci0JaWYgKElTX0VSUih3MV9jb250cm9sX3RocmVhZCkpIHsKLQkJcmV0dmFsID0gUFRSX0VSUih3MV9jb250cm9sX3RocmVhZCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sIHRocmVhZC4gZXJyPSVkXG4iLAotCQkJcmV0dmFsKTsKLQkJZ290byBlcnJfb3V0X3NsYXZlX3VucmVnaXN0ZXI7Ci0JfQotCiAJcmV0dXJuIDA7CiAKKyNpZiAwCisvKiBGb3IgdW5kb2luZyB0aGUgc2xhdmUgcmVnaXN0ZXIgaWYgdGhlcmUgd2FzIGEgc3RlcCBhZnRlciBpdC4gKi8KIGVycl9vdXRfc2xhdmVfdW5yZWdpc3RlcjoKIAlkcml2ZXJfdW5yZWdpc3RlcigmdzFfc2xhdmVfZHJpdmVyKTsKKyNlbmRpZgogCiBlcnJfb3V0X21hc3Rlcl91bnJlZ2lzdGVyOgogCWRyaXZlcl91bnJlZ2lzdGVyKCZ3MV9tYXN0ZXJfZHJpdmVyKTsKQEAgLTk1OSwxMyArMTAzOSwxMiBAQAogewogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKIAorCS8qIFNldCBuZXRsaW5rIHJlbW92YWwgbWVzc2FnZXMgYW5kIHNvbWUgY2xlYW51cCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KQogCQlfX3cxX3JlbW92ZV9tYXN0ZXJfZGV2aWNlKGRldik7CiAKIAl3MV9maW5pX25ldGxpbmsoKTsKIAotCWt0aHJlYWRfc3RvcCh3MV9jb250cm9sX3RocmVhZCk7Ci0KIAlkcml2ZXJfdW5yZWdpc3RlcigmdzFfc2xhdmVfZHJpdmVyKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmdzFfbWFzdGVyX2RyaXZlcik7CiAJYnVzX3VucmVnaXN0ZXIoJncxX2J1c190eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuaCBiL2RyaXZlcnMvdzEvdzEuaAppbmRleCBmMWRmNTM0Li5jZGFhNmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmgKKysrIGIvZHJpdmVycy93MS93MS5oCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAidzFfZmFtaWx5LmgiCiAKICNkZWZpbmUgVzFfTUFYTkFNRUxFTgkJMzIKLSNkZWZpbmUgVzFfU0xBVkVfREFUQV9TSVpFCTEyOAogCiAjZGVmaW5lIFcxX1NFQVJDSAkJMHhGMAogI2RlZmluZSBXMV9BTEFSTV9TRUFSQ0gJCTB4RUMKQEAgLTc3LDcgKzc2LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbglyZWxlYXNlZDsKIH07CiAKLXR5cGVkZWYgdm9pZCAoKiB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjaykodm9pZCAqLCB1NjQpOwordHlwZWRlZiB2b2lkICgqdzFfc2xhdmVfZm91bmRfY2FsbGJhY2spKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTY0KTsKIAogCiAvKioKQEAgLTE0MiwxMiArMTQxLDE4IEBACiAJICovCiAJdTgJCSgqcmVzZXRfYnVzKSh2b2lkICopOwogCi0JLyoqIFJlYWxseSBuaWNlIGhhcmR3YXJlIGNhbiBoYW5kbGVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgUk9NIHNlYXJjaCAqLwotCXZvaWQJCSgqc2VhcmNoKSh2b2lkICosIHU4LCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayk7Ci19OworCS8qKgorCSAqIFB1dCBvdXQgYSBzdHJvbmcgcHVsbC11cCBwdWxzZSBvZiB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLgorCSAqIEByZXR1cm4gLTE9RXJyb3IsIDA9Y29tcGxldGVkCisJICovCisJdTgJCSgqc2V0X3B1bGx1cCkodm9pZCAqLCBpbnQpOwogCi0jZGVmaW5lIFcxX01BU1RFUl9ORUVEX0VYSVQJCTAKLSNkZWZpbmUgVzFfTUFTVEVSX05FRURfUkVDT05ORUNUCTEKKwkvKiogUmVhbGx5IG5pY2UgaGFyZHdhcmUgY2FuIGhhbmRsZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBST00gc2VhcmNoCisJICogIHcxX21hc3RlciogaXMgcGFzc2VkIHRvIHRoZSBzbGF2ZSBmb3VuZCBjYWxsYmFjay4KKwkgKi8KKwl2b2lkCQkoKnNlYXJjaCkodm9pZCAqLCBzdHJ1Y3QgdzFfbWFzdGVyICosCisJCXU4LCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayk7Cit9OwogCiBzdHJ1Y3QgdzFfbWFzdGVyCiB7CkBAIC0xNjcsNyArMTcyLDEwIEBACiAJdm9pZAkJCSpwcml2OwogCWludAkJCXByaXZfc2l6ZTsKIAotCWxvbmcJCQlmbGFnczsKKwkvKiogNVYgc3Ryb25nIHB1bGx1cCBlbmFibGVkIGZsYWcsIDEgZW5hYmxlZCwgemVybyBkaXNhYmxlZC4gKi8KKwlpbnQJCQllbmFibGVfcHVsbHVwOworCS8qKiA1ViBzdHJvbmcgcHVsbHVwIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgemVybyBkaXNhYmxlZC4gKi8KKwlpbnQJCQlwdWxsdXBfZHVyYXRpb247CiAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRocmVhZDsKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwpAQCAtMTgxLDEyICsxODksMjEgQEAKIH07CiAKIGludCB3MV9jcmVhdGVfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqKTsKK3ZvaWQgdzFfZGVzdHJveV9tYXN0ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgdzFfbWFzdGVyICptYXN0ZXIpOwogdm9pZCB3MV9zZWFyY2goc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOwogdm9pZCB3MV9zZWFyY2hfZGV2aWNlcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYik7CiBzdHJ1Y3QgdzFfc2xhdmUgKncxX3NlYXJjaF9zbGF2ZShzdHJ1Y3QgdzFfcmVnX251bSAqaWQpOwogdm9pZCB3MV9zZWFyY2hfcHJvY2VzcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlKTsKIHN0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKTsKIAorLyogRGlzY29ubmVjdCBhbmQgcmVjb25uZWN0IGRldmljZXMgaW4gdGhlIGdpdmVuIGZhbWlseS4gIFVzZWQgZm9yIGZpbmRpbmcKKyAqIHVuY2xhaW1lZCBkZXZpY2VzIGFmdGVyIGEgZmFtaWx5IGhhcyBiZWVuIHJlZ2lzdGVyZWQgb3IgcmVsZWFzaW5nIGRldmljZXMKKyAqIGFmdGVyIGEgZmFtaWx5IGhhcyBiZWVuIHVucmVnaXN0ZXJlZC4gIFNldCBhdHRhY2ggdG8gMSB3aGVuIGEgbmV3IGZhbWlseQorICogaGFzIGp1c3QgYmVlbiByZWdpc3RlcmVkLCB0byAwIHdoZW4gaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLgorICovCit2b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZiwgaW50IGF0dGFjaCk7Cit2b2lkIHcxX3NsYXZlX2RldGFjaChzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKKwogdTggdzFfdHJpcGxldChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiZGlyKTsKIHZvaWQgdzFfd3JpdGVfOChzdHJ1Y3QgdzFfbWFzdGVyICosIHU4KTsKIGludCB3MV9yZXNldF9idXMoc3RydWN0IHcxX21hc3RlciAqKTsKQEAgLTE5NCw2ICsyMTEsNyBAQAogdm9pZCB3MV93cml0ZV9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIGNvbnN0IHU4ICosIGludCk7CiB1OCB3MV9yZWFkX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTggKiwgaW50KTsKIGludCB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCk7Cit2b2lkIHcxX25leHRfcHVsbHVwKHN0cnVjdCB3MV9tYXN0ZXIgKiwgaW50KTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdzFfc2xhdmUqIGRldl90b193MV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCBhM2M5NWJkLi40YTA5OTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKQEAgLTQ4LDEyICs0OCwxMiBAQAogCiAJaWYgKCFyZXQpIHsKIAkJYXRvbWljX3NldCgmbmV3Zi0+cmVmY250LCAwKTsKLQkJbmV3Zi0+bmVlZF9leGl0ID0gMDsKIAkJbGlzdF9hZGRfdGFpbCgmbmV3Zi0+ZmFtaWx5X2VudHJ5LCAmdzFfZmFtaWxpZXMpOwogCX0KIAlzcGluX3VubG9jaygmdzFfZmxvY2spOwogCi0JdzFfcmVjb25uZWN0X3NsYXZlcyhuZXdmKTsKKwkvKiBjaGVjayBkZWZhdWx0IGRldmljZXMgYWdhaW5zdCB0aGUgbmV3IHNldCBvZiBkcml2ZXJzICovCisJdzFfcmVjb25uZWN0X3NsYXZlcyhuZXdmLCAxKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03MiwxMSArNzIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCi0JZmVudC0+bmVlZF9leGl0ID0gMTsKLQogCXNwaW5fdW5sb2NrKCZ3MV9mbG9jayk7CiAKKwkvKiBkZWF0Y2ggZGV2aWNlcyB1c2luZyB0aGlzIGZhbWlseSBjb2RlICovCisJdzFfcmVjb25uZWN0X3NsYXZlcyhmZW50LCAwKTsKKwogCXdoaWxlIChhdG9taWNfcmVhZCgmZmVudC0+cmVmY250KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciBmYW1pbHkgJXUgdG8gYmVjb21lIGZyZWU6IHJlZmNudD0lZC5cbiIsCiAJCQkJZmVudC0+ZmlkLCBhdG9taWNfcmVhZCgmZmVudC0+cmVmY250KSk7CkBAIC0xMDksOCArMTA5LDcgQEAKIAogc3RhdGljIHZvaWQgX193MV9mYW1pbHlfcHV0KHN0cnVjdCB3MV9mYW1pbHkgKmYpCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmYtPnJlZmNudCkpCi0JCWYtPm5lZWRfZXhpdCA9IDE7CisJYXRvbWljX2RlYygmZi0+cmVmY250KTsKIH0KIAogdm9pZCB3MV9mYW1pbHlfcHV0KHN0cnVjdCB3MV9mYW1pbHkgKmYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oIGIvZHJpdmVycy93MS93MV9mYW1pbHkuaAppbmRleCBlZjFlMWRhLi4zY2ExYjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKQEAgLTMzLDYgKzMzLDcgQEAKICNkZWZpbmUgVzFfVEhFUk1fRFMxODIyICAJMHgyMgogI2RlZmluZSBXMV9FRVBST01fRFMyNDMzICAJMHgyMwogI2RlZmluZSBXMV9USEVSTV9EUzE4QjIwIAkweDI4CisjZGVmaW5lIFcxX0VFUFJPTV9EUzI0MzEJMHgyRAogI2RlZmluZSBXMV9GQU1JTFlfRFMyNzYwCTB4MzAKIAogI2RlZmluZSBNQVhOQU1FTEVOCQkzMgpAQCAtNTMsNyArNTQsNiBAQAogCXN0cnVjdCB3MV9mYW1pbHlfb3BzCSpmb3BzOwogCiAJYXRvbWljX3QJCXJlZmNudDsKLQl1OAkJCW5lZWRfZXhpdDsKIH07CiAKIGV4dGVybiBzcGlubG9ja190IHcxX2Zsb2NrOwpAQCAtNjMsNiArNjMsNSBAQAogc3RydWN0IHcxX2ZhbWlseSAqIHcxX2ZhbWlseV9yZWdpc3RlcmVkKHU4KTsKIHZvaWQgdzFfdW5yZWdpc3Rlcl9mYW1pbHkoc3RydWN0IHcxX2ZhbWlseSAqKTsKIGludCB3MV9yZWdpc3Rlcl9mYW1pbHkoc3RydWN0IHcxX2ZhbWlseSAqKTsKLXZvaWQgdzFfcmVjb25uZWN0X3NsYXZlcyhzdHJ1Y3QgdzFfZmFtaWx5ICpmKTsKIAogI2VuZGlmIC8qIF9fVzFfRkFNSUxZX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW50LmMgYi9kcml2ZXJzL3cxL3cxX2ludC5jCmluZGV4IDY4NDBkZmUuLmEzYTU0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfaW50LmMKKysrIGIvZHJpdmVycy93MS93MV9pbnQuYwpAQCAtMjksNyArMjksMTEgQEAKICNpbmNsdWRlICJ3MV9uZXRsaW5rLmgiCiAjaW5jbHVkZSAidzFfaW50LmgiCiAKLXN0YXRpYyB1MzIgdzFfaWRzID0gMTsKK3N0YXRpYyBpbnQgdzFfc2VhcmNoX2NvdW50ID0gLTE7IC8qIERlZmF1bHQgaXMgY29udGludWFsIHNjYW4gKi8KK21vZHVsZV9wYXJhbV9uYW1lZChzZWFyY2hfY291bnQsIHcxX3NlYXJjaF9jb3VudCwgaW50LCAwKTsKKworc3RhdGljIGludCB3MV9lbmFibGVfcHVsbHVwID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChlbmFibGVfcHVsbHVwLCB3MV9lbmFibGVfcHVsbHVwLCBpbnQsIDApOwogCiBzdGF0aWMgc3RydWN0IHcxX21hc3RlciAqIHcxX2FsbG9jX2Rldih1MzIgaWQsIGludCBzbGF2ZV9jb3VudCwgaW50IHNsYXZlX3R0bCwKIAkJCQkgICAgICAgc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwKQEAgLTU5LDggKzYzLDEyIEBACiAJZGV2LT5pbml0aWFsaXplZAk9IDA7CiAJZGV2LT5pZAkJCT0gaWQ7CiAJZGV2LT5zbGF2ZV90dGwJCT0gc2xhdmVfdHRsOwotICAgICAgICBkZXYtPnNlYXJjaF9jb3VudAk9IC0xOyAvKiBjb250aW51YWwgc2NhbiAqLworCWRldi0+c2VhcmNoX2NvdW50CT0gdzFfc2VhcmNoX2NvdW50OworCWRldi0+ZW5hYmxlX3B1bGx1cAk9IHcxX2VuYWJsZV9wdWxsdXA7CiAKKwkvKiAxIGZvciB3MV9wcm9jZXNzIHRvIGRlY3JlbWVudAorCSAqIDEgZm9yIF9fdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2UgdG8gZGVjcmVtZW50CisJICovCiAJYXRvbWljX3NldCgmZGV2LT5yZWZjbnQsIDIpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+c2xpc3QpOwpAQCAtOTMsOSArMTAxLDEwIEBACiAKIGludCB3MV9hZGRfbWFzdGVyX2RldmljZShzdHJ1Y3QgdzFfYnVzX21hc3RlciAqbWFzdGVyKQogewotCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsICplbnRyeTsKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOworCWludCBpZCwgZm91bmQ7CiAKICAgICAgICAgLyogdmFsaWRhdGUgbWluaW11bSBmdW5jdGlvbmFsaXR5ICovCiAgICAgICAgIGlmICghKG1hc3Rlci0+dG91Y2hfYml0ICYmIG1hc3Rlci0+cmVzZXRfYnVzKSAmJgpAQCAtMTA0LDEwICsxMTMsNTAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJ3MV9hZGRfbWFzdGVyX2RldmljZTogaW52YWxpZCBmdW5jdGlvbiBzZXRcbiIpOwogCQlyZXR1cm4oLUVJTlZBTCk7CiAgICAgICAgIH0KKwkvKiBXaGlsZSBpdCB3b3VsZCBiZSBlbGVjdHJpY2FsbHkgcG9zc2libGUgdG8gbWFrZSBhIGRldmljZSB0aGF0CisJICogZ2VuZXJhdGVkIGEgc3Ryb25nIHB1bGx1cCBpbiBiaXQgYmFuZyBtb2RlLCBvbmx5IGhhcmRhcmUgdGhhdAorCSAqIGNvbnRyb2xzIDEtd2lyZSB0aW1lIGZyYW1lcyBhcmUgZXZlbiBleHBlY3RlZCB0byBzdXBwb3J0IGEgc3Ryb25nCisJICogcHVsbHVwLiAgdzFfaW8uYyB3b3VsZCBuZWVkIHRvIHN1cHBvcnQgY2FsbGluZyBzZXRfcHVsbHVwIGJlZm9yZQorCSAqIHRoZSBsYXN0IHdyaXRlX2JpdCBvcGVyYXRpb24gb2YgYSB3MV93cml0ZV84IHdoaWNoIGl0IGN1cnJlbnRseQorCSAqIGRvZXNuJ3QuCisJICovCisJaWYgKCFtYXN0ZXItPndyaXRlX2J5dGUgJiYgIW1hc3Rlci0+dG91Y2hfYml0ICYmIG1hc3Rlci0+c2V0X3B1bGx1cCkgeworCQlwcmludGsoS0VSTl9FUlIgIncxX2FkZF9tYXN0ZXJfZGV2aWNlOiBzZXRfcHVsbHVwIHJlcXVpcmVzICIKKwkJCSJ3cml0ZV9ieXRlIG9yIHRvdWNoX2JpdCwgZGlzYWJsaW5nXG4iKTsKKwkJbWFzdGVyLT5zZXRfcHVsbHVwID0gTlVMTDsKKwl9CiAKLQlkZXYgPSB3MV9hbGxvY19kZXYodzFfaWRzKyssIHcxX21heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX3R0bCwgJncxX21hc3Rlcl9kcml2ZXIsICZ3MV9tYXN0ZXJfZGV2aWNlKTsKLQlpZiAoIWRldikKKwkvKiBMb2NrIHVudGlsIHRoZSBkZXZpY2UgaXMgYWRkZWQgKG9yIG5vdCkgdG8gdzFfbWFzdGVycy4gKi8KKwltdXRleF9sb2NrKCZ3MV9tbG9jayk7CisJLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYXZhaWxhYmxlIGlkIChzdGFydGluZyBhdCAxKS4gKi8KKwlpZCA9IDA7CisJZG8geworCQkrK2lkOworCQlmb3VuZCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKKwkJCWlmIChlbnRyeS0+aWQgPT0gaWQpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlIChmb3VuZCk7CisKKwlkZXYgPSB3MV9hbGxvY19kZXYoaWQsIHcxX21heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX3R0bCwKKwkJJncxX21hc3Rlcl9kcml2ZXIsICZ3MV9tYXN0ZXJfZGV2aWNlKTsKKwlpZiAoIWRldikgeworCQltdXRleF91bmxvY2soJncxX21sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dmFsID0gIHcxX2NyZWF0ZV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwltZW1jcHkoZGV2LT5idXNfbWFzdGVyLCBtYXN0ZXIsIHNpemVvZihzdHJ1Y3QgdzFfYnVzX21hc3RlcikpOworCisJZGV2LT5pbml0aWFsaXplZCA9IDE7CiAKIAlkZXYtPnRocmVhZCA9IGt0aHJlYWRfcnVuKCZ3MV9wcm9jZXNzLCBkZXYsICIlcyIsIGRldi0+bmFtZSk7CiAJaWYgKElTX0VSUihkZXYtPnRocmVhZCkpIHsKQEAgLTExNSwxOCArMTY0LDEwIEBACiAJCWRldl9lcnIoJmRldi0+ZGV2LAogCQkJICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBrZXJuZWwgdGhyZWFkLiBlcnI9JWRcbiIsCiAJCQkgcmV0dmFsKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQltdXRleF91bmxvY2soJncxX21sb2NrKTsKKwkJZ290byBlcnJfb3V0X3JtX2F0dHI7CiAJfQogCi0JcmV0dmFsID0gIHcxX2NyZWF0ZV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyX291dF9raWxsX3RocmVhZDsKLQotCW1lbWNweShkZXYtPmJ1c19tYXN0ZXIsIG1hc3Rlciwgc2l6ZW9mKHN0cnVjdCB3MV9idXNfbWFzdGVyKSk7Ci0KLQlkZXYtPmluaXRpYWxpemVkID0gMTsKLQotCW11dGV4X2xvY2soJncxX21sb2NrKTsKIAlsaXN0X2FkZCgmZGV2LT53MV9tYXN0ZXJfZW50cnksICZ3MV9tYXN0ZXJzKTsKIAltdXRleF91bmxvY2soJncxX21sb2NrKTsKIApAQCAtMTM3LDggKzE3OCwxMiBAQAogCiAJcmV0dXJuIDA7CiAKKyNpZiAwIC8qIFRocmVhZCBjbGVhbnVwIGNvZGUsIG5vdCByZXF1aXJlZCBjdXJyZW50bHkuICovCiBlcnJfb3V0X2tpbGxfdGhyZWFkOgogCWt0aHJlYWRfc3RvcChkZXYtPnRocmVhZCk7CisjZW5kaWYKK2Vycl9vdXRfcm1fYXR0cjoKKwl3MV9kZXN0cm95X21hc3Rlcl9hdHRyaWJ1dGVzKGRldik7CiBlcnJfb3V0X2ZyZWVfZGV2OgogCXcxX2ZyZWVfZGV2KGRldik7CiAKQEAgLTE0OCwxMCArMTkzLDIxIEBACiB2b2lkIF9fdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2Uoc3RydWN0IHcxX21hc3RlciAqZGV2KQogewogCXN0cnVjdCB3MV9uZXRsaW5rX21zZyBtc2c7CisJc3RydWN0IHcxX3NsYXZlICpzbCwgKnNsbjsKIAotCXNldF9iaXQoVzFfTUFTVEVSX05FRURfRVhJVCwgJmRldi0+ZmxhZ3MpOwogCWt0aHJlYWRfc3RvcChkZXYtPnRocmVhZCk7CiAKKwltdXRleF9sb2NrKCZ3MV9tbG9jayk7CisJbGlzdF9kZWwoJmRldi0+dzFfbWFzdGVyX2VudHJ5KTsKKwltdXRleF91bmxvY2soJncxX21sb2NrKTsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpCisJCXcxX3NsYXZlX2RldGFjaChzbCk7CisJdzFfZGVzdHJveV9tYXN0ZXJfYXR0cmlidXRlcyhkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOworCiAJd2hpbGUgKGF0b21pY19yZWFkKCZkZXYtPnJlZmNudCkpIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiV2FpdGluZyBmb3IgJXMgdG8gYmVjb21lIGZyZWU6IHJlZmNudD0lZC5cbiIsCiAJCQkJZGV2LT5uYW1lLCBhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uYyBiL2RyaXZlcnMvdzEvdzFfaW8uYwppbmRleCAzMGI2ZmJmLi5mNGY4MmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmMKKysrIGIvZHJpdmVycy93MS93MV9pby5jCkBAIC05Myw2ICs5Myw0MCBAQAogfQogCiAvKioKKyAqIFByZS13cml0ZSBvcGVyYXRpb24sIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgc3Ryb25nIHB1bGx1cHMuCisgKiBQcm9ncmFtIHRoZSBoYXJkd2FyZSBmb3IgYSBzdHJvbmcgcHVsbHVwLCBpZiBvbmUgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZAorICogdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgorICoKKyAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHcxX3ByZV93cml0ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit7CisJaWYgKGRldi0+cHVsbHVwX2R1cmF0aW9uICYmCisJCWRldi0+ZW5hYmxlX3B1bGx1cCAmJiBkZXYtPmJ1c19tYXN0ZXItPnNldF9wdWxsdXApIHsKKwkJZGV2LT5idXNfbWFzdGVyLT5zZXRfcHVsbHVwKGRldi0+YnVzX21hc3Rlci0+ZGF0YSwKKwkJCWRldi0+cHVsbHVwX2R1cmF0aW9uKTsKKwl9Cit9CisKKy8qKgorICogUG9zdC13cml0ZSBvcGVyYXRpb24sIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgc3Ryb25nIHB1bGx1cHMuCisgKiBJZiBhIHN0cm9uZyBwdWxsdXAgd2FzIHJlcXVlc3RlZCwgY2xlYXIgaXQgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzCisgKiB0aGVtLCBvciBleGVjdXRlIHRoZSBkZWxheSBvdGhlcndpc2UsIGluIGVpdGhlciBjYXNlIGNsZWFyIHRoZSByZXF1ZXN0LgorICoKKyAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHcxX3Bvc3Rfd3JpdGUoc3RydWN0IHcxX21hc3RlciAqZGV2KQoreworCWlmIChkZXYtPnB1bGx1cF9kdXJhdGlvbikgeworCQlpZiAoZGV2LT5lbmFibGVfcHVsbHVwICYmIGRldi0+YnVzX21hc3Rlci0+c2V0X3B1bGx1cCkKKwkJCWRldi0+YnVzX21hc3Rlci0+c2V0X3B1bGx1cChkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIDApOworCQllbHNlCisJCQltc2xlZXAoZGV2LT5wdWxsdXBfZHVyYXRpb24pOworCQlkZXYtPnB1bGx1cF9kdXJhdGlvbiA9IDA7CisJfQorfQorCisvKioKICAqIFdyaXRlcyA4IGJpdHMuCiAgKgogICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKQEAgLTEwMiwxMSArMTM2LDE3IEBACiB7CiAJaW50IGk7CiAKLQlpZiAoZGV2LT5idXNfbWFzdGVyLT53cml0ZV9ieXRlKQorCWlmIChkZXYtPmJ1c19tYXN0ZXItPndyaXRlX2J5dGUpIHsKKwkJdzFfcHJlX3dyaXRlKGRldik7CiAJCWRldi0+YnVzX21hc3Rlci0+d3JpdGVfYnl0ZShkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIGJ5dGUpOworCX0KIAllbHNlCi0JCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJCWlmIChpID09IDcpCisJCQkJdzFfcHJlX3dyaXRlKGRldik7CiAJCQl3MV90b3VjaF9iaXQoZGV2LCAoYnl0ZSA+PiBpKSAmIDB4MSk7CisJCX0KKwl3MV9wb3N0X3dyaXRlKGRldik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3MV93cml0ZV84KTsKIApAQCAtMjAzLDExICsyNDMsMTQgQEAKIHsKIAlpbnQgaTsKIAotCWlmIChkZXYtPmJ1c19tYXN0ZXItPndyaXRlX2Jsb2NrKQorCWlmIChkZXYtPmJ1c19tYXN0ZXItPndyaXRlX2Jsb2NrKSB7CisJCXcxX3ByZV93cml0ZShkZXYpOwogCQlkZXYtPmJ1c19tYXN0ZXItPndyaXRlX2Jsb2NrKGRldi0+YnVzX21hc3Rlci0+ZGF0YSwgYnVmLCBsZW4pOworCX0KIAllbHNlCiAJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLQkJCXcxX3dyaXRlXzgoZGV2LCBidWZbaV0pOworCQkJdzFfd3JpdGVfOChkZXYsIGJ1ZltpXSk7IC8qIGNhbGxzIHcxX3ByZV93cml0ZSAqLworCXcxX3Bvc3Rfd3JpdGUoZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHcxX3dyaXRlX2Jsb2NrKTsKIApAQCAtMjUwLDEyICsyOTMsMjQgQEAKIAkJcmVzdWx0ID0gZGV2LT5idXNfbWFzdGVyLT5yZXNldF9idXMoZGV2LT5idXNfbWFzdGVyLT5kYXRhKSAmIDB4MTsKIAllbHNlIHsKIAkJZGV2LT5idXNfbWFzdGVyLT53cml0ZV9iaXQoZGV2LT5idXNfbWFzdGVyLT5kYXRhLCAwKTsKKwkJLyogbWluaW11bSA0ODAsIG1heCA/IHVzCisJCSAqIGJlIG5pY2UgYW5kIHNsZWVwLCBleGNlcHQgMThiMjAgc3BlYyBsaXN0cyA5NjB1cyBtYXhpbXVtLAorCQkgKiBzbyB1bnRpbCB3ZSBjYW4gc2xlZXAgd2l0aCBtaWNyb3NlY29uZCBhY2N1cmFjeSwgc3Bpbi4KKwkJICogRmVlbCBmcmVlIHRvIGNvbWUgdXAgd2l0aCBzb21lIG90aGVyIHdheSB0byBnaXZlIHVwIHRoZQorCQkgKiBjcHUgZm9yIHN1Y2ggYSBzaG9ydCBhbW91bnQgb2YgdGltZSBBTkQgZ2V0IGl0IGJhY2sgaW4KKwkJICogdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUuCisJCSAqLwogCQl3MV9kZWxheSg0ODApOwogCQlkZXYtPmJ1c19tYXN0ZXItPndyaXRlX2JpdChkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIDEpOwogCQl3MV9kZWxheSg3MCk7CiAKIAkJcmVzdWx0ID0gZGV2LT5idXNfbWFzdGVyLT5yZWFkX2JpdChkZXYtPmJ1c19tYXN0ZXItPmRhdGEpICYgMHgxOwotCQl3MV9kZWxheSg0MTApOworCQkvKiBtaW5tdW0gNzAgKGFib3ZlKSArIDQxMCA9IDQ4MCB1cworCQkgKiBUaGVyZSBhcmVuJ3QgYW55IHRpbWluZyByZXF1aXJlbWVudHMgYmV0d2VlbiBhIHJlc2V0IGFuZAorCQkgKiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9ucy4gIFNsZWVwaW5nIGlzIHNhZmUgaGVyZS4KKwkJICovCisJCS8qIHcxX2RlbGF5KDQxMCk7IG1pbiByZXF1aXJlZCB0aW1lICovCisJCW1zbGVlcCgxKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjc3LDcgKzMzMiw4IEBACiB7CiAJZGV2LT5hdHRlbXB0cysrOwogCWlmIChkZXYtPmJ1c19tYXN0ZXItPnNlYXJjaCkKLQkJZGV2LT5idXNfbWFzdGVyLT5zZWFyY2goZGV2LT5idXNfbWFzdGVyLT5kYXRhLCBzZWFyY2hfdHlwZSwgY2IpOworCQlkZXYtPmJ1c19tYXN0ZXItPnNlYXJjaChkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIGRldiwKKwkJCXNlYXJjaF90eXBlLCBjYik7CiAJZWxzZQogCQl3MV9zZWFyY2goZGV2LCBzZWFyY2hfdHlwZSwgY2IpOwogfQpAQCAtMzA1LDMgKzM2MSwyMCBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVzZXRfc2VsZWN0X3NsYXZlKTsKKworLyoqCisgKiBQdXQgb3V0IGEgc3Ryb25nIHB1bGwtdXAgb2YgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBhZnRlciB0aGUgbmV4dCB3cml0ZQorICogb3BlcmF0aW9uLiAgTm90IGFsbCBoYXJkd2FyZSBzdXBwb3J0cyBzdHJvbmcgcHVsbHVwcy4gIEhhcmR3YXJlIHRoYXQKKyAqIGRvZXNuJ3Qgc3VwcG9ydCBzdHJvbmcgcHVsbHVwcyB3aWxsIHNsZWVwIGZvciB0aGUgZ2l2ZW4gdGltZSBhZnRlciB0aGUKKyAqIHdyaXRlIG9wZXJhdGlvbiB3aXRob3V0IGEgc3Ryb25nIHB1bGx1cC4gIFRoaXMgaXMgYSBvbmUgc2hvdCByZXF1ZXN0IGZvcgorICogdGhlIG5leHQgd3JpdGUsIHNwZWNpZnlpbmcgemVybyB3aWxsIGNsZWFyIGEgcHJldmlvdXMgcmVxdWVzdC4KKyAqIFRoZSB3MSBtYXN0ZXIgbG9jayBtdXN0IGJlIGhlbGQuCisgKgorICogQHBhcmFtIGRlbGF5CXRpbWUgaW4gbWlsbGlzZWNvbmRzCisgKiBAcmV0dXJuCTA9c3VjY2VzcywgYW55dGhpbmcgZWxzZT1lcnJvcgorICovCit2b2lkIHcxX25leHRfcHVsbHVwKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGRlbGF5KQoreworCWRldi0+cHVsbHVwX2R1cmF0aW9uID0gZGVsYXk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3MV9uZXh0X3B1bGx1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKaW5kZXggYzUxMDM2Ny4uMWEyMmZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtNjYsNiArNjYsMTMgQEAKIAkgIFdhdGNoZG9nIHRpbWVyIGVtYmVkZGVkIGludG8gQVQ5MVJNOTIwMCBjaGlwcy4gVGhpcyB3aWxsIHJlYm9vdCB5b3VyCiAJICBzeXN0ZW0gd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLgogCitjb25maWcgQVQ5MVNBTTlYX1dBVENIRE9HCisJdHJpc3RhdGUgIkFUOTFTQU05WCB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIChBUkNIX0FUOTFTQU05MjYwIHx8IEFSQ0hfQVQ5MVNBTTkyNjEpCisJaGVscAorCSAgV2F0Y2hkb2cgdGltZXIgZW1iZWRkZWQgaW50byBBVDkxU0FNOVggY2hpcHMuIFRoaXMgd2lsbCByZWJvb3QgeW91cgorCSAgc3lzdGVtIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KKwogY29uZmlnIDIxMjg1X1dBVENIRE9HCiAJdHJpc3RhdGUgIkRDMjEyODUgd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBGT09UQlJJREdFCkBAIC0yMTcsNiArMjI0LDE1IEBACiAJICBOT1RFOiBvbmNlIGVuYWJsZWQsIHRoaXMgdGltZXIgY2Fubm90IGJlIGRpc2FibGVkLgogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKK2NvbmZpZyBPUklPTjVYX1dBVENIRE9HCisJdHJpc3RhdGUgIk9yaW9uNXggd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBBUkNIX09SSU9ONVgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyCisJICBpbiB0aGUgT3Jpb241eCBBUk0gU29Dcy4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9yaW9uNXhfd2R0LgorCiAjIEFSTTI2IEFyY2hpdGVjdHVyZQogCiAjIEFWUjMyIEFyY2hpdGVjdHVyZQpAQCAtNDE2LDYgKzQzMiwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXQ4NzEyZl93ZHQuCiAKK2NvbmZpZyBJVDg3X1dEVAorCXRyaXN0YXRlICJJVDg3IFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBJVEUgSVQ4NzE2LAorCSAgSVQ4NzE4LCBJVDg3MjYsIElUODcxMihWZXJzaW9uIEosSykgU3VwZXIgSS9PIGNoaXBzLiBUaGlzIHdhdGNoZG9nCisJICBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsIGFuZCBpZgorCSAgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgaXQ4N193ZHQuCisKIGNvbmZpZyBIUF9XQVRDSERPRwogCXRyaXN0YXRlICJIUCBQcm9saWFudCBpTE8gMiBIYXJkd2FyZSBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFg4NgpAQCAtNTczLDYgKzYwMSwyMSBAQAogCiAJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgogCitjb25maWcgVzgzNjk3VUdfV0RUCisJdHJpc3RhdGUgIlc4MzY5N1VHL1c4MzY5N1VGIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFc4MzY5N1VHL1VGCisJICBjaGlwc2V0IGFzIHVzZWQgaW4gTVNJIEZ1enp5IENYNzAwIFZJQSBtb3RoZXJib2FyZHMgKGFuZCBsaWtlbHkgb3RoZXJzKS4KKwkgIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKKwkgIGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4KKwkgIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3ODM2OTd1Z193ZHQuCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgc2F5IE4uCisKIGNvbmZpZyBXODM4NzdGX1dEVAogCXRyaXN0YXRlICJXODM4NzdGIChFTUFDUykgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBYODYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IGUwZWYxMjMuLmUzNTJiYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQpAQCAtMjYsNiArMjYsNyBAQAogCiAjIEFSTSBBcmNoaXRlY3R1cmUKIG9iai0kKENPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HKSArPSBhdDkxcm05MjAwX3dkdC5vCitvYmotJChDT05GSUdfQVQ5MVNBTTlYX1dBVENIRE9HKSArPSBhdDkxc2FtOV93ZHQubwogb2JqLSQoQ09ORklHX09NQVBfV0FUQ0hET0cpICs9IG9tYXBfd2R0Lm8KIG9iai0kKENPTkZJR18yMTI4NV9XQVRDSERPRykgKz0gd2R0Mjg1Lm8KIG9iai0kKENPTkZJR185NzdfV0FUQ0hET0cpICs9IHdkdDk3Ny5vCkBAIC0zOSw2ICs0MCw3IEBACiBvYmotJChDT05GSUdfUE5YNDAwOF9XQVRDSERPRykgKz0gcG54NDAwOF93ZHQubwogb2JqLSQoQ09ORklHX0lPUF9XQVRDSERPRykgKz0gaW9wX3dkdC5vCiBvYmotJChDT05GSUdfREFWSU5DSV9XQVRDSERPRykgKz0gZGF2aW5jaV93ZHQubworb2JqLSQoQ09ORklHX09SSU9ONVhfV0FUQ0hET0cpICs9IG9yaW9uNXhfd2R0Lm8KIAogIyBBUk0yNiBBcmNoaXRlY3R1cmUKIApAQCAtNzEsNiArNzMsNyBAQAogb2JqLSQoQ09ORklHX0lUQ09fV0RUKSArPSBpVENPX3ZlbmRvcl9zdXBwb3J0Lm8KIGVuZGlmCiBvYmotJChDT05GSUdfSVQ4NzEyRl9XRFQpICs9IGl0ODcxMmZfd2R0Lm8KK29iai0kKENPTkZJR19JVDg3X1dEVCkgKz0gaXQ4N193ZHQubwogb2JqLSQoQ09ORklHX0hQX1dBVENIRE9HKSArPSBocHdkdC5vCiBvYmotJChDT05GSUdfU0MxMjAwX1dEVCkgKz0gc2MxMjAwd2R0Lm8KIG9iai0kKENPTkZJR19TQ3gyMDBfV0RUKSArPSBzY3gyMDBfd2R0Lm8KQEAgLTgzLDYgKzg2LDcgQEAKIG9iai0kKENPTkZJR19TTVNDMzdCNzg3X1dEVCkgKz0gc21zYzM3Yjc4N193ZHQubwogb2JqLSQoQ09ORklHX1c4MzYyN0hGX1dEVCkgKz0gdzgzNjI3aGZfd2R0Lm8KIG9iai0kKENPTkZJR19XODM2OTdIRl9XRFQpICs9IHc4MzY5N2hmX3dkdC5vCitvYmotJChDT05GSUdfVzgzNjk3VUdfV0RUKSArPSB3ODM2OTd1Z193ZHQubwogb2JqLSQoQ09ORklHX1c4Mzg3N0ZfV0RUKSArPSB3ODM4NzdmX3dkdC5vCiBvYmotJChDT05GSUdfVzgzOTc3Rl9XRFQpICs9IHc4Mzk3N2Zfd2R0Lm8KIG9iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2QubwpAQCAtMTIzLDYgKzEyNyw5IEBACiAKICMgU1BBUkM2NCBBcmNoaXRlY3R1cmUKIAorb2JqLSQoQ09ORklHX1dBVENIRE9HX1JJTykJCSs9IHJpb3dkLm8KK29iai0kKENPTkZJR19XQVRDSERPR19DUDFYWFgpCQkrPSBjcHdkLm8KKwogIyBYVEVOU0EgQXJjaGl0ZWN0dXJlCiAKICMgQXJjaGl0ZWN0dXJlIEluZGVwZW5kYW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJhYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIFdhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQ5MVNBTTl4IHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlbmF1ZCBDRVJSQVRPIHIuY2VycmF0b0B0aWwtdGVjaG5vbG9naWVzLmZyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogVGhlIFdhdGNoZG9nIFRpbWVyIE1vZGUgUmVnaXN0ZXIgY2FuIGJlIG9ubHkgd3JpdHRlbiB0byBvbmNlLiBJZiB0aGUKKyAqIHRpbWVvdXQgbmVlZCB0byBiZSBzZXQgZnJvbSBMaW51eCwgYmUgc3VyZSB0aGF0IHRoZSBib290c3RyYXAgb3IgdGhlCisgKiBib290bG9hZGVyIGRvZXNuJ3Qgd3JpdGUgdG8gdGhpcyByZWdpc3Rlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV93ZHQuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiQVQ5MVNBTTkgV2F0Y2hkb2ciCisKKy8qIEFUOTFTQU05IHdhdGNoZG9nIHJ1bnMgYSAxMmJpdCBjb3VudGVyIEAgMjU2SHosCisgKiB1c2UgdGhpcyB0byBjb252ZXJ0IGEgd2F0Y2hkb2cKKyAqIHZhbHVlIGZyb20vdG8gbWlsbGlzZWNvbmRzLgorICovCisjZGVmaW5lIG1zX3RvX3RpY2tzKHQpCSgoKHQgPDwgOCkgLyAxMDAwKSAtIDEpCisjZGVmaW5lIHRpY2tzX3RvX21zKHQpCSgoKHQgKyAxKSAqIDEwMDApID4+IDgpCisKKy8qIEhhcmR3YXJlIHRpbWVvdXQgaW4gc2Vjb25kcyAqLworI2RlZmluZSBXRFRfSFdfVElNRU9VVCAyCisKKy8qIFRpbWVyIGhlYXJ0YmVhdCAoNTAwbXMpICovCisjZGVmaW5lIFdEVF9USU1FT1VUCShIWi8yKQorCisvKiBVc2VyIGxhbmQgdGltZW91dCAqLworI2RlZmluZSBXRFRfSEVBUlRCRUFUIDE1CitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9IFdEVF9IRUFSVEJFQVQ7Cittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXRzIGluIHNlY29uZHMuICIKKwkiKGRlZmF1bHQgPSAiIF9fTU9EVUxFX1NUUklORyhXRFRfSEVBUlRCRUFUKSAiKSIpOworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkICIKKwkiKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKK3N0YXRpYyB2b2lkIGF0OTFfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG5leHRfaGVhcnRiZWF0OwkvKiB0aGUgbmV4dF9oZWFydGJlYXQgZm9yIHRoZSB0aW1lciAqLworCXVuc2lnbmVkIGxvbmcgb3BlbjsKKwljaGFyIGV4cGVjdF9jbG9zZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogVGhlIHRpbWVyIHRoYXQgcGluZ3MgdGhlIHdhdGNoZG9nICovCit9IGF0OTF3ZHRfcHJpdmF0ZTsKKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisKKy8qCisgKiBSZWxvYWQgdGhlIHdhdGNoZG9nIHRpbWVyLiAgKGllLCBwYXQgdGhlIHdhdGNoZG9nKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXQ5MV93ZHRfcmVzZXQodm9pZCkKK3sKKwlhdDkxX3N5c193cml0ZShBVDkxX1dEVF9DUiwgQVQ5MV9XRFRfS0VZIHwgQVQ5MV9XRFRfV0RSU1RUKTsKK30KKworLyoKKyAqIFRpbWVyIHRpY2sKKyAqLworc3RhdGljIHZvaWQgYXQ5MV9waW5nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgYXQ5MXdkdF9wcml2YXRlLm5leHRfaGVhcnRiZWF0KSB8fAorCQkJKCFub3dheW91dCAmJiAhYXQ5MXdkdF9wcml2YXRlLm9wZW4pKSB7CisJCWF0OTFfd2R0X3Jlc2V0KCk7CisJCW1vZF90aW1lcigmYXQ5MXdkdF9wcml2YXRlLnRpbWVyLCBqaWZmaWVzICsgV0RUX1RJTUVPVVQpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9DUklUIERSVl9OQU1FIjogSSB3aWxsIHJlc2V0IHlvdXIgbWFjaGluZSAhXG4iKTsKK30KKworLyoKKyAqIFdhdGNoZG9nIGRldmljZSBpcyBvcGVuZWQsIGFuZCB3YXRjaGRvZyBzdGFydHMgcnVubmluZy4KKyAqLworc3RhdGljIGludCBhdDkxX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZhdDkxd2R0X3ByaXZhdGUub3BlbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlhdDkxd2R0X3ByaXZhdGUubmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgaGVhcnRiZWF0ICogSFo7CisJbW9kX3RpbWVyKCZhdDkxd2R0X3ByaXZhdGUudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGF0OTFfd2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNsZWFyX2JpdCgwLCAmYXQ5MXdkdF9wcml2YXRlLm9wZW4pOworCisJLyogc3RvcCBpbnRlcm5hbCBwaW5nICovCisJaWYgKCFhdDkxd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlKQorCQlkZWxfdGltZXIoJmF0OTF3ZHRfcHJpdmF0ZS50aW1lcik7CisKKwlhdDkxd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgd2F0Y2hkb2cgdGltZSBpbnRlcnZhbCBpbiAxLzI1Nkh6ICh3cml0ZS1vbmNlKQorICogQ291bnRlciBpcyAxMiBiaXQuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV93ZHRfc2V0dGltZW91dCh1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBtcjsKKworCS8qIENoZWNrIGlmIGRpc2FibGVkICovCisJbXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfV0RUX01SKTsKKwlpZiAobXIgJiBBVDkxX1dEVF9XRERJUykgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUiOiBzb3JyeSwgd2F0Y2hkb2cgaXMgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIEFsbCBjb3VudGluZyBvY2N1cnMgYXQgU0xPV19DTE9DSyAvIDEyOCA9IDI1NiBIegorCSAqCisJICogU2luY2UgV0RWIGlzIGEgMTItYml0IGNvdW50ZXIsIHRoZSBtYXhpbXVtIHBlcmlvZCBpcworCSAqIDQwOTYgLyAyNTYgPSAxNiBzZWNvbmRzLgorCSAqLworCXJlZyA9IEFUOTFfV0RUX1dEUlNURU4JLyogY2F1c2VzIHdhdGNoZG9nIHJlc2V0ICovCisJCS8qIHwgQVQ5MV9XRFRfV0RSUFJPQwljYXVzZXMgcHJvY2Vzc29yIHJlc2V0IG9ubHkgKi8KKwkJfCBBVDkxX1dEVF9XRERCR0hMVAkvKiBkaXNhYmxlZCBpbiBkZWJ1ZyBtb2RlICovCisJCXwgQVQ5MV9XRFRfV0RECQkvKiByZXN0YXJ0IGF0IGFueSB0aW1lICovCisJCXwgKHRpbWVvdXQgJiBBVDkxX1dEVF9XRFYpOyAgLyogdGltZXIgdmFsdWUgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1dEVF9NUiwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gYXQ5MV93ZHRfaW5mbyA9IHsKKwkuaWRlbnRpdHkJPSBEUlZfTkFNRSwKKwkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorfTsKKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyBsb25nIGF0OTFfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X3ZhbHVlOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmF0OTFfd2R0X2luZm8sCisJCQkJICAgIHNpemVvZihhdDkxX3dkdF9pbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWF0OTF3ZHRfcHJpdmF0ZS5uZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyBoZWFydGJlYXQgKiBIWjsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfdmFsdWUsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaGVhcnRiZWF0ID0gbmV3X3ZhbHVlOworCQlhdDkxd2R0X3ByaXZhdGUubmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgaGVhcnRiZWF0ICogSFo7CisKKwkJcmV0dXJuIHB1dF91c2VyKG5ld192YWx1ZSwgcCk7ICAvKiByZXR1cm4gY3VycmVudCB2YWx1ZSAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8qCisgKiBQYXQgdGhlIHdhdGNoZG9nIHdoZW5ldmVyIGRldmljZSBpcyB3cml0dGVuIHRvLgorICovCitzdGF0aWMgc3NpemVfdCBhdDkxX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwKKyAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwkvKiBTY2FuIGZvciBtYWdpYyBjaGFyYWN0ZXIgKi8KKwlpZiAoIW5vd2F5b3V0KSB7CisJCXNpemVfdCBpOworCisJCWF0OTF3ZHRfcHJpdmF0ZS5leHBlY3RfY2xvc2UgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJY2hhciBjOworCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjID09ICdWJykgeworCQkJCWF0OTF3ZHRfcHJpdmF0ZS5leHBlY3RfY2xvc2UgPSA0MjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWF0OTF3ZHRfcHJpdmF0ZS5uZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyBoZWFydGJlYXQgKiBIWjsKKworCXJldHVybiBsZW47Cit9CisKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXQ5MXdkdF9mb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJCT0gbm9fbGxzZWVrLAorCS51bmxvY2tlZF9pb2N0bAk9IGF0OTFfd2R0X2lvY3RsLAorCS5vcGVuCQkJPSBhdDkxX3dkdF9vcGVuLAorCS5yZWxlYXNlCQk9IGF0OTFfd2R0X2Nsb3NlLAorCS53cml0ZQkJCT0gYXQ5MV93ZHRfd3JpdGUsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXQ5MXdkdF9taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZhdDkxd2R0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJlczsKKworCWlmIChhdDkxd2R0X21pc2NkZXYucGFyZW50KQorCQlyZXR1cm4gLUVCVVNZOworCWF0OTF3ZHRfbWlzY2Rldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJLyogU2V0IHdhdGNoZG9nICovCisJcmVzID0gYXQ5MV93ZHRfc2V0dGltZW91dChtc190b190aWNrcyhXRFRfSFdfVElNRU9VVCAqIDEwMDApKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0gbWlzY19yZWdpc3RlcigmYXQ5MXdkdF9taXNjZGV2KTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJYXQ5MXdkdF9wcml2YXRlLm5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIGhlYXJ0YmVhdCAqIEhaOworCXNldHVwX3RpbWVyKCZhdDkxd2R0X3ByaXZhdGUudGltZXIsIGF0OTFfcGluZywgMCk7CisJbW9kX3RpbWVyKCZhdDkxd2R0X3ByaXZhdGUudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIgZW5hYmxlZCAoaGVhcnRiZWF0PSVkIHNlYywgbm93YXlvdXQ9JWQpXG4iLAorCQloZWFydGJlYXQsIG5vd2F5b3V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhdDkxd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXM7CisKKwlyZXMgPSBtaXNjX2RlcmVnaXN0ZXIoJmF0OTF3ZHRfbWlzY2Rldik7CisJaWYgKCFyZXMpCisJCWF0OTF3ZHRfbWlzY2Rldi5wYXJlbnQgPSBOVUxMOworCisJcmV0dXJuIHJlczsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGF0OTF3ZHRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxd2R0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBhdDkxd2R0X3N1c3BlbmQJTlVMTAorI2RlZmluZSBhdDkxd2R0X3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQ5MXdkdF9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChhdDkxd2R0X3JlbW92ZSksCisJLnN1c3BlbmQJPSBhdDkxd2R0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdDkxd2R0X3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQ5MV93ZHQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MXNhbV93ZHRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0OTF3ZHRfZHJpdmVyLCBhdDkxd2R0X3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0OTFzYW1fd2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MXdkdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdDkxc2FtX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KGF0OTFzYW1fd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSZW5hdWQgQ0VSUkFUTyA8ci5jZXJyYXRvQHRpbC10ZWNobm9sb2dpZXMuZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQ5MVNBTTl4IHByb2Nlc3NvcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY3B3ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9jcHdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0ZGZlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvY3B3ZC5jCkBAIC0wLDAgKzEsNjk1IEBACisvKiBjcHdkLmMgLSBkcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIGhhcmR3YXJlIHdhdGNoZG9nCisgKiB0aW1lcnMgZm91bmQgb24gU3VuIE1pY3Jvc3lzdGVtcyBDUDE0MDAgYW5kIENQMTUwMCBib2FyZHMuCisgKgorICogVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCB0aGUgZ2VuZXJpYyBMaW51eCB3YXRjaGRvZyAKKyAqIGludGVyZmFjZSBhbmQgU29sYXJpcy1jb21wYXRpYmxlIGlvY3RscyBhcyBiZXN0IGl0IGlzCisgKiBhYmxlLgorICoKKyAqIE5PVEU6IAlDUDE0MDAgc3lzdGVtcyBhcHBlYXIgdG8gaGF2ZSBhIGRlZmVjdGl2ZSBpbnRyX21hc2sKKyAqIAkJCXJlZ2lzdGVyIG9uIHRoZSBQTEQsIHByZXZlbnRpbmcgdGhlIGRpc2FibGluZyBvZgorICogCQkJdGltZXIgaW50ZXJydXB0cy4gIFdlIHVzZSBhIHRpbWVyIHRvIHBlcmlvZGljYWxseSAKKyAqIAkJCXJlc2V0ICdzdG9wcGVkJyB3YXRjaGRvZ3Mgb24gYWZmZWN0ZWQgcGxhdGZvcm1zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBFcmljIEJyb3dlciAoZWJyb3dlckB1c2EubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vd2F0Y2hkb2cuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkiY3B3ZCIKKyNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCisKKyNkZWZpbmUgV0RfT0JQTkFNRQkid2F0Y2hkb2ciCisjZGVmaW5lIFdEX0JBRE1PREVMCSJTVU5XLDUwMS01MzM2IgorI2RlZmluZSBXRF9CVElNRU9VVAkoamlmZmllcyArIChIWiAqIDEwMDApKQorI2RlZmluZSBXRF9CTElNSVQJMHhGRkZGCisKKyNkZWZpbmUgV0QwX01JTk9SCTIxMgorI2RlZmluZSBXRDFfTUlOT1IJMjEzCQorI2RlZmluZSBXRDJfTUlOT1IJMjE0CQorCisvKiBJbnRlcm5hbCBkcml2ZXIgZGVmaW5pdGlvbnMuICAqLworI2RlZmluZSBXRDBfSUQJCQkwCisjZGVmaW5lIFdEMV9JRAkJCTEKKyNkZWZpbmUgV0QyX0lECQkJMgorI2RlZmluZSBXRF9OVU1ERVZTCQkzCisKKyNkZWZpbmUgV0RfSU5UUl9PRkYJCTAKKyNkZWZpbmUgV0RfSU5UUl9PTgkJMQorCisjZGVmaW5lIFdEX1NUQVRfSU5JVAkweDAxCS8qIFdhdGNoZG9nIHRpbWVyIGlzIGluaXRpYWxpemVkCSovCisjZGVmaW5lIFdEX1NUQVRfQlNUT1AJMHgwMgkvKiBXYXRjaGRvZyB0aW1lciBpcyBicm9rZW5zdG9wcGVkCSovCisjZGVmaW5lIFdEX1NUQVRfU1ZDRAkweDA0CS8qIFdhdGNoZG9nIGludGVycnVwdCBvY2N1cnJlZAkJKi8KKworLyogUmVnaXN0ZXIgdmFsdWUgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBXRDBfSU5UUl9NQVNLCTB4MDEJLyogV2F0Y2hkb2cgZGV2aWNlIGludGVycnVwdCBtYXNrcwkqLworI2RlZmluZSBXRDFfSU5UUl9NQVNLCTB4MDIKKyNkZWZpbmUgV0QyX0lOVFJfTUFTSwkweDA0CisKKyNkZWZpbmUgV0RfU19SVU5OSU5HCTB4MDEJLyogV2F0Y2hkb2cgZGV2aWNlIHN0YXR1cyBydW5uaW5nCSovCisjZGVmaW5lIFdEX1NfRVhQSVJFRAkweDAyCS8qIFdhdGNoZG9nIGRldmljZSBzdGF0dXMgZXhwaXJlZAkqLworCitzdHJ1Y3QgY3B3ZCB7CisJdm9pZCBfX2lvbWVtCSpyZWdzOworCXNwaW5sb2NrX3QJbG9jazsKKworCXVuc2lnbmVkIGludAlpcnE7CisKKwl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7CisJYm9vbAkJZW5hYmxlZDsKKwlib29sCQlyZWJvb3Q7CisJYm9vbAkJYnJva2VuOworCWJvb2wJCWluaXRpYWxpemVkOworCisJc3RydWN0IHsKKwkJc3RydWN0IG1pc2NkZXZpY2UJbWlzYzsKKwkJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwkJdTgJCQlpbnRyX21hc2s7CisJCXU4CQkJcnVuc3RhdHVzOworCQl1MTYJCQl0aW1lb3V0OworCX0gZGV2c1tXRF9OVU1ERVZTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B3ZCAqY3B3ZF9kZXZpY2U7CisKKy8qIFN1biB1c2VzIEFsdGVyYSBQTEQgRVBGODgyMEFUQzE0NC00IAorICogcHJvdmlkaW5nIHRocmVlIGhhcmR3YXJlIHdhdGNoZG9nczoKKyAqCisgKiAJMSkgUklDIC0gc2VuZHMgYW4gaW50ZXJydXB0IHdoZW4gdHJpZ2dlcmVkCisgKiAJMikgWElSIC0gYXNzZXJ0cyBYSVJfQl9SRVNFVCB3aGVuIHRyaWdnZXJlZCwgcmVzZXRzIENQVQorICogCTMpIFBPUiAtIGFzc2VydHMgUE9SX0JfUkVTRVQgd2hlbiB0cmlnZ2VyZWQsIHJlc2V0cyBDUFUsIGJhY2twbGFuZSwgYm9hcmQKKyAqCisgKioqIFRpbWVyIHJlZ2lzdGVyIGJsb2NrIGRlZmluaXRpb24gKHN0cnVjdCB3ZF90aW1lcl9yZWdibGspCisgKgorICogZGNudHIgYW5kIGxpbWl0IHJlZ2lzdGVycyAoaGFsZndvcmQgYWNjZXNzKTogICAgICAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgMTUgfCAuLi58IDEgfCAwIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwtICBjb3VudGVyIHZhbCAgLXwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRjbnRyIC0gCUN1cnJlbnQgMTYtYml0IGRvd25jb3VudGVyIHZhbHVlLgorICogCQkJV2hlbiBkb3duY291bnRlciByZWFjaGVzICcwJyB3YXRjaGRvZyBleHBpcmVzLgorICogCQkJUmVhZGluZyB0aGlzIHJlZ2lzdGVyIHJlc2V0cyBkb3duY291bnRlciB3aXRoICdsaW1pdCcgdmFsdWUuCisgKiBsaW1pdCAtIAkxNi1iaXQgY291bnRkb3duIHZhbHVlIGluIDEvMTB0aCBzZWNvbmQgaW5jcmVtZW50cy4KKyAqIAkJCVdyaXRpbmcgdGhpcyByZWdpc3RlciBiZWdpbnMgY291bnRkb3duIHdpdGggaW5wdXQgdmFsdWUuCisgKiAJCQlSZWFkaW5nIGZyb20gdGhpcyByZWdpc3RlciBkb2VzIG5vdCBhZmZlY3QgY291bnRlci4KKyAqIE5PVEVTOglBZnRlciB3YXRjaGRvZyByZXNldCwgZGNudHIgYW5kIGxpbWl0IGNvbnRhaW4gJzEnCisgKgorICogc3RhdHVzIHJlZ2lzdGVyIChieXRlIGFjY2Vzcyk6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgNyB8IC4uLiB8IDIgfCAgMSAgfCAgMCAgfAorICogLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgKiB8LSAgIFVOVVNFRCAgLXwgRVhQIHwgUlVOIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc3RhdHVzLQlCaXQgMCAtIFdhdGNoZG9nIGlzIHJ1bm5pbmcKKyAqIAkJCUJpdCAxIC0gV2F0Y2hkb2cgaGFzIGV4cGlyZWQKKyAqCisgKioqIFBMRCByZWdpc3RlciBibG9jayBkZWZpbml0aW9uIChzdHJ1Y3Qgd2RfcGxkX3JlZ2JsaykKKyAqCisgKiBpbnRyX21hc2sgcmVnaXN0ZXIgKGJ5dGUgYWNjZXNzKToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCA3IHwgLi4uIHwgMyB8ICAyICB8ICAxICB8ICAwICB8CisgKiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwtICAgVU5VU0VEICAtfCBXRDMgfCBXRDIgfCBXRDEgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXRDMgLSAgMSA9PSBJbnRlcnJ1cHQgZGlzYWJsZWQgZm9yIHdhdGNoZG9nIDMKKyAqIFdEMiAtICAxID09IEludGVycnVwdCBkaXNhYmxlZCBmb3Igd2F0Y2hkb2cgMgorICogV0QxIC0gIDEgPT0gSW50ZXJydXB0IGRpc2FibGVkIGZvciB3YXRjaGRvZyAxCisgKgorICogcGxkX3N0YXR1cyByZWdpc3RlciAoYnl0ZSBhY2Nlc3MpOgorICogVU5LTk9XTiwgTUFHSUNBTCBNWVNURVJZIFJFR0lTVEVSCisgKgorICovCisjZGVmaW5lIFdEX1RJTUVSX1JFR1NaCTE2CisjZGVmaW5lIFdEMF9PRkYJCTAKKyNkZWZpbmUgV0QxX09GRgkJKFdEX1RJTUVSX1JFR1NaICogMSkKKyNkZWZpbmUgV0QyX09GRgkJKFdEX1RJTUVSX1JFR1NaICogMikKKyNkZWZpbmUgUExEX09GRgkJKFdEX1RJTUVSX1JFR1NaICogMykKKworI2RlZmluZSBXRF9EQ05UUgkweDAwCisjZGVmaW5lIFdEX0xJTUlUCTB4MDQKKyNkZWZpbmUgV0RfU1RBVFVTCTB4MDgKKworI2RlZmluZSBQTERfSU1BU0sJKFBMRF9PRkYgKyAweDAwKQorI2RlZmluZSBQTERfU1RBVFVTCShQTERfT0ZGICsgMHgwNCkKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNwd2RfdGltZXI7CisKK3N0YXRpYyBpbnQgd2QwX3RpbWVvdXQgPSAwOworc3RhdGljIGludCB3ZDFfdGltZW91dCA9IDA7CitzdGF0aWMgaW50IHdkMl90aW1lb3V0ID0gMDsKKworbW9kdWxlX3BhcmFtCSh3ZDBfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2QwX3RpbWVvdXQsICJEZWZhdWx0IHdhdGNoZG9nMCB0aW1lb3V0IGluIDEvMTBzZWNzIik7Cittb2R1bGVfcGFyYW0gCSh3ZDFfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2QxX3RpbWVvdXQsICJEZWZhdWx0IHdhdGNoZG9nMSB0aW1lb3V0IGluIDEvMTBzZWNzIik7Cittb2R1bGVfcGFyYW0gCSh3ZDJfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2QyX3RpbWVvdXQsICJEZWZhdWx0IHdhdGNoZG9nMiB0aW1lb3V0IGluIDEvMTBzZWNzIik7CisKK01PRFVMRV9BVVRIT1IoIkVyaWMgQnJvd2VyIDxlYnJvd2VyQHVzYS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIHdhdGNoZG9nIGRyaXZlciBmb3IgU3VuIE1pY3Jvc3lzdGVtcyBDUDE0MDAvMTUwMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIndhdGNoZG9nIik7CisKK3N0YXRpYyB2b2lkIGNwd2Rfd3JpdGV3KHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZXcoY3B1X3RvX2xlMTYodmFsKSwgYWRkcik7Cit9CitzdGF0aWMgdTE2IGNwd2RfcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKQoreworCXUxNiB2YWwgPSByZWFkdyhhZGRyKTsKKworCXJldHVybiBsZTE2X3RvX2NwdSh2YWwpOworfQorCitzdGF0aWMgdm9pZCBjcHdkX3dyaXRlYih1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl3cml0ZWIodmFsLCBhZGRyKTsKK30KKworc3RhdGljIHU4IGNwd2RfcmVhZGIodm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiByZWFkYihhZGRyKTsKK30KKworLyogRW5hYmxlIG9yIGRpc2FibGUgd2F0Y2hkb2cgaW50ZXJydXB0cworICogQmVjYXVzZSBvZiB0aGUgQ1AxNDAwIGRlZmVjdCB0aGlzIHNob3VsZCBvbmx5IGJlCisgKiBjYWxsZWQgZHVyaW5nIGluaXRpYWx6YXRpb24gb3IgYnkgd2RfW3N0YXJ0fHN0b3BddGltZXIoKQorICoKKyAqIGluZGV4IAktIHN1Yi1kZXZpY2UgaW5kZXgsIG9yIC0xIGZvciAnYWxsJworICogZW5hYmxlCS0gbm9uLXplcm8gdG8gZW5hYmxlIGludGVycnVwdHMsIHplcm8gdG8gZGlzYWJsZQorICovCitzdGF0aWMgdm9pZCBjcHdkX3RvZ2dsZWludHIoc3RydWN0IGNwd2QgKnAsIGludCBpbmRleCwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGN1cnJlZ3MgPSBjcHdkX3JlYWRiKHAtPnJlZ3MgKyBQTERfSU1BU0spOworCXVuc2lnbmVkIGNoYXIgc2V0cmVncyA9IAorCQkoaW5kZXggPT0gLTEpID8gCisJCShXRDBfSU5UUl9NQVNLIHwgV0QxX0lOVFJfTUFTSyB8IFdEMl9JTlRSX01BU0spIDogCisJCShwLT5kZXZzW2luZGV4XS5pbnRyX21hc2spOworCisJaWYgKGVuYWJsZSA9PSBXRF9JTlRSX09OKQorCQljdXJyZWdzICY9IH5zZXRyZWdzOworCWVsc2UKKwkJY3VycmVncyB8PSBzZXRyZWdzOworCisJY3B3ZF93cml0ZWIoY3VycmVncywgcC0+cmVncyArIFBMRF9JTUFTSyk7Cit9CisKKy8qIFJlc3RhcnRzIHRpbWVyIHdpdGggbWF4aW11bSBsaW1pdCB2YWx1ZSBhbmQKKyAqIGRvZXMgbm90IHVuc2V0ICdicm9rZW5zdG9wJyB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQgY3B3ZF9yZXNldGJyb2tlbnRpbWVyKHN0cnVjdCBjcHdkICpwLCBpbnQgaW5kZXgpCit7CisJY3B3ZF90b2dnbGVpbnRyKHAsIGluZGV4LCBXRF9JTlRSX09OKTsKKwljcHdkX3dyaXRldyhXRF9CTElNSVQsIHAtPmRldnNbaW5kZXhdLnJlZ3MgKyBXRF9MSU1JVCk7Cit9CisKKy8qIFRpbWVyIG1ldGhvZCBjYWxsZWQgdG8gcmVzZXQgc3RvcHBlZCB3YXRjaGRvZ3MtLQorICogYmVjYXVzZSBvZiB0aGUgUExEIGJ1ZyBvbiBDUDE0MDAsIHdlIGNhbm5vdCBtYXNrCisgKiBpbnRlcnJ1cHRzIHdpdGhpbiB0aGUgUExEIHNvIG1lIG11c3QgY29udGludWFsbHkKKyAqIHJlc2V0IHRoZSB0aW1lcnMgYWQgaW5maW5pdHVtLgorICovCitzdGF0aWMgdm9pZCBjcHdkX2Jyb2tlbnRpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgY3B3ZCAqcCA9IChzdHJ1Y3QgY3B3ZCAqKSBkYXRhOworCWludCBpZCwgdHJpcHBlZCA9IDA7CisKKwkvKiBraWxsIGEgcnVubmluZyB0aW1lciBpbnN0YW5jZSwgaW4gY2FzZSB3ZQorCSAqIHdlcmUgY2FsbGVkIGRpcmVjdGx5IGluc3RlYWQgb2YgYnkga2VybmVsIHRpbWVyCisJICovCisJaWYgKHRpbWVyX3BlbmRpbmcoJmNwd2RfdGltZXIpKQorCQlkZWxfdGltZXIoJmNwd2RfdGltZXIpOworCisJZm9yIChpZCA9IDA7IGlkIDwgV0RfTlVNREVWUzsgaWQrKykgeworCQlpZiAocC0+ZGV2c1tpZF0ucnVuc3RhdHVzICYgV0RfU1RBVF9CU1RPUCkgeworCQkJKyt0cmlwcGVkOworCQkJY3B3ZF9yZXNldGJyb2tlbnRpbWVyKHAsIGlkKTsKKwkJfQorCX0KKworCWlmICh0cmlwcGVkKSB7CisJCS8qIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB0aW1lciBicm9rZW5zdG9wcGVkLS0gcmVzY2hlZHVsZSAqLworCQljcHdkX3RpbWVyLmV4cGlyZXMgPSBXRF9CVElNRU9VVDsKKwkJYWRkX3RpbWVyKCZjcHdkX3RpbWVyKTsKKwl9Cit9CisKKy8qIFJlc2V0IGNvdW50ZG93biB0aW1lciB3aXRoICdsaW1pdCcgdmFsdWUgYW5kIGNvbnRpbnVlIGNvdW50ZG93bi4KKyAqIFRoaXMgd2lsbCBub3Qgc3RhcnQgYSBzdG9wcGVkIHRpbWVyLgorICovCitzdGF0aWMgdm9pZCBjcHdkX3Bpbmd0aW1lcihzdHJ1Y3QgY3B3ZCAqcCwgaW50IGluZGV4KQoreworCWlmIChjcHdkX3JlYWRiKHAtPmRldnNbaW5kZXhdLnJlZ3MgKyBXRF9TVEFUVVMpICYgV0RfU19SVU5OSU5HKQorCQljcHdkX3JlYWR3KHAtPmRldnNbaW5kZXhdLnJlZ3MgKyBXRF9EQ05UUik7Cit9CisKKy8qIFN0b3AgYSBydW5uaW5nIHdhdGNoZG9nIHRpbWVyLS0gdGhlIHRpbWVyIGFjdHVhbGx5IGtlZXBzCisgKiBydW5uaW5nLCBidXQgdGhlIGludGVycnVwdCBpcyBtYXNrZWQgc28gdGhhdCBubyBhY3Rpb24gaXMKKyAqIHRha2VuIHVwb24gZXhwaXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgY3B3ZF9zdG9wdGltZXIoc3RydWN0IGNwd2QgKnAsIGludCBpbmRleCkKK3sKKwlpZiAoY3B3ZF9yZWFkYihwLT5kZXZzW2luZGV4XS5yZWdzICsgV0RfU1RBVFVTKSAmIFdEX1NfUlVOTklORykgeworCQljcHdkX3RvZ2dsZWludHIocCwgaW5kZXgsIFdEX0lOVFJfT0ZGKTsKKworCQlpZiAocC0+YnJva2VuKSB7CisJCQlwLT5kZXZzW2luZGV4XS5ydW5zdGF0dXMgfD0gV0RfU1RBVF9CU1RPUDsKKwkJCWNwd2RfYnJva2VudGltZXIoKHVuc2lnbmVkIGxvbmcpIHApOworCQl9CisJfQorfQorCisvKiBTdGFydCBhIHdhdGNoZG9nIHRpbWVyIHdpdGggdGhlIHNwZWNpZmllZCBsaW1pdCB2YWx1ZQorICogSWYgdGhlIHdhdGNoZG9nIGlzIHJ1bm5pbmcsIGl0IHdpbGwgYmUgcmVzdGFydGVkIHdpdGgKKyAqIHRoZSBwcm92aWRlZCBsaW1pdCB2YWx1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIGludGVycnVwdHMgb24gdGhlIHNwZWNpZmllZAorICogd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIGNwd2Rfc3RhcnR0aW1lcihzdHJ1Y3QgY3B3ZCAqcCwgaW50IGluZGV4KQoreworCWlmIChwLT5icm9rZW4pCisJCXAtPmRldnNbaW5kZXhdLnJ1bnN0YXR1cyAmPSB+V0RfU1RBVF9CU1RPUDsKKworCXAtPmRldnNbaW5kZXhdLnJ1bnN0YXR1cyAmPSB+V0RfU1RBVF9TVkNEOworCisJY3B3ZF93cml0ZXcocC0+ZGV2c1tpbmRleF0udGltZW91dCwgcC0+ZGV2c1tpbmRleF0ucmVncyArIFdEX0xJTUlUKTsKKwljcHdkX3RvZ2dsZWludHIocCwgaW5kZXgsIFdEX0lOVFJfT04pOworfQorCitzdGF0aWMgaW50IGNwd2RfZ2V0c3RhdHVzKHN0cnVjdCBjcHdkICpwLCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgY2hhciBzdGF0ID0gY3B3ZF9yZWFkYihwLT5kZXZzW2luZGV4XS5yZWdzICsgV0RfU1RBVFVTKTsKKwl1bnNpZ25lZCBjaGFyIGludHIgPSBjcHdkX3JlYWRiKHAtPmRldnNbaW5kZXhdLnJlZ3MgKyBQTERfSU1BU0spOworCXVuc2lnbmVkIGNoYXIgcmV0ICA9IFdEX1NUT1BQRUQ7CisKKwkvKiBkZXRlcm1pbmUgU1RPUFBFRCAqLworCWlmICghc3RhdCkgCisJCXJldHVybiByZXQ7CisKKwkvKiBkZXRlcm1pbmUgRVhQSVJFRCB2cyBGUkVFUlVOIHZzIFJVTk5JTkcgKi8KKwllbHNlIGlmIChXRF9TX0VYUElSRUQgJiBzdGF0KSB7CisJCXJldCA9IFdEX0VYUElSRUQ7CisJfSBlbHNlIGlmKFdEX1NfUlVOTklORyAmIHN0YXQpIHsKKwkJaWYgKGludHIgJiBwLT5kZXZzW2luZGV4XS5pbnRyX21hc2spIHsKKwkJCXJldCA9IFdEX0ZSRUVSVU47CisJCX0gZWxzZSB7CisJCQkvKiBGdWRnZSBXRF9FWFBJUkVEIHN0YXR1cyBmb3IgZGVmZWN0aXZlIENQMTQwMC0tCisJCQkgKiBJRiB0aW1lciBpcyBydW5uaW5nIAorCQkJICogCUFORCBicm9rZW5zdG9wIGlzIHNldCAKKwkJCSAqIAlBTkQgYW4gaW50ZXJydXB0IGhhcyBiZWVuIHNlcnZpY2VkCisJCQkgKiB3ZSBhcmUgV0RfRVhQSVJFRC4KKwkJCSAqCisJCQkgKiBJRiB0aW1lciBpcyBydW5uaW5nIAorCQkJICogCUFORCBicm9rZW5zdG9wIGlzIHNldCAKKwkJCSAqIAlBTkQgbm8gaW50ZXJydXB0IGhhcyBiZWVuIHNlcnZpY2VkCisJCQkgKiB3ZSBhcmUgV0RfRlJFRVJVTi4KKwkJCSAqLworCQkJaWYgKHAtPmJyb2tlbiAmJgorCQkJICAgIChwLT5kZXZzW2luZGV4XS5ydW5zdGF0dXMgJiBXRF9TVEFUX0JTVE9QKSkgeworCQkJCWlmIChwLT5kZXZzW2luZGV4XS5ydW5zdGF0dXMgJiBXRF9TVEFUX1NWQ0QpIHsKKwkJCQkJcmV0ID0gV0RfRVhQSVJFRDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3ZSBjb3VsZCBhcyB3ZWxsIHByZXRlbmQgd2UgYXJlIGV4cGlyZWQgKi8KKwkJCQkJcmV0ID0gV0RfRlJFRVJVTjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXJldCA9IFdEX1JVTk5JTkc7CisJCQl9CisJCX0KKwl9CisKKwkvKiBkZXRlcm1pbmUgU0VSVklDRUQgKi8KKwlpZiAocC0+ZGV2c1tpbmRleF0ucnVuc3RhdHVzICYgV0RfU1RBVF9TVkNEKQorCQlyZXQgfD0gV0RfU0VSVklDRUQ7CisKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNwd2RfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY3B3ZCAqcCA9IGRldl9pZDsKKworCS8qIE9ubHkgV0QwIHdpbGwgaW50ZXJydXB0LS0gb3RoZXJzIGFyZSBOTUkgYW5kIHdlIHdvbid0CisJICogc2VlIHRoZW0gaGVyZS4uLi4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZwLT5sb2NrKTsKKworCWNwd2Rfc3RvcHRpbWVyKHAsIFdEMF9JRCk7CisJcC0+ZGV2c1tXRDBfSURdLnJ1bnN0YXR1cyB8PSAgV0RfU1RBVF9TVkNEOworCisJc3Bpbl91bmxvY2tfaXJxKCZwLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjcHdkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCit7CisJc3RydWN0IGNwd2QgKnAgPSBjcHdkX2RldmljZTsKKworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoKGltaW5vcihpbm9kZSkpIHsKKwkJY2FzZSBXRDBfTUlOT1I6CisJCWNhc2UgV0QxX01JTk9SOgorCQljYXNlIFdEMl9NSU5PUjoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBSZWdpc3RlciBJUlEgb24gZmlyc3Qgb3BlbiBvZiBkZXZpY2UgKi8KKwlpZiAoIXAtPmluaXRpYWxpemVkKSB7CisJCWlmIChyZXF1ZXN0X2lycShwLT5pcnEsICZjcHdkX2ludGVycnVwdCwgCisJCQkJSVJRRl9TSEFSRUQsIERSSVZFUl9OQU1FLCBwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIElSUSAlZFxuIiwgCisJCQkJcC0+aXJxKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJcC0+aW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmKTsKK30KKworc3RhdGljIGludCBjcHdkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B3ZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpbmZvID0geworCQkub3B0aW9ucwkJPSBXRElPRl9TRVRUSU1FT1VULAorCQkuZmlybXdhcmVfdmVyc2lvbgk9IDEsCisJCS5pZGVudGl0eQkJPSBEUklWRVJfTkFNRSwKKwl9OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBpbmRleCA9IGltaW5vcihpbm9kZSkgLSBXRDBfTUlOT1I7CisJc3RydWN0IGNwd2QgKnAgPSBjcHdkX2RldmljZTsKKwlpbnQgc2V0b3B0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJLyogR2VuZXJpYyBMaW51eCBJT0NUTHMgKi8KKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAocHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQljcHdkX3Bpbmd0aW1lcihwLCBpbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnNldG9wdCwgYXJncCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHNldG9wdCAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQlpZiAocC0+ZW5hYmxlZCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWNwd2Rfc3RvcHRpbWVyKHAsIGluZGV4KTsKKwkJfSBlbHNlIGlmIChzZXRvcHQgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQljcHdkX3N0YXJ0dGltZXIocCwgaW5kZXgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0JCisJCWJyZWFrOworCisJLyogU29sYXJpcy1jb21wYXRpYmxlIElPQ1RMcyAqLworCWNhc2UgV0lPQ0dTVEFUOgorCQlzZXRvcHQgPSBjcHdkX2dldHN0YXR1cyhwLCBpbmRleCk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnNldG9wdCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXSU9DU1RBUlQ6CisJCWNwd2Rfc3RhcnR0aW1lcihwLCBpbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBXSU9DU1RPUDoKKwkJaWYgKHAtPmVuYWJsZWQpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJY3B3ZF9zdG9wdGltZXIocCwgaW5kZXgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBjcHdkX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBydmFsID0gLUVOT0lPQ1RMQ01EOworCisJc3dpdGNoIChjbWQpIHsKKwkvKiBzb2xhcmlzIGlvY3RscyBhcmUgc3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIgKi8KKwljYXNlIFdJT0NTVEFSVDoKKwljYXNlIFdJT0NTVE9QOgorCWNhc2UgV0lPQ0dTVEFUOgorCQlsb2NrX2tlcm5lbCgpOworCQlydmFsID0gY3B3ZF9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJYnJlYWs7CisKKwkvKiBldmVyeXRoaW5nIGVsc2UgaXMgaGFuZGxlZCBieSB0aGUgZ2VuZXJpYyBjb21wYXQgbGF5ZXIgKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIHNzaXplX3QgY3B3ZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjcHdkICpwID0gY3B3ZF9kZXZpY2U7CisJaW50IGluZGV4ID0gaW1pbm9yKGlub2RlKTsKKworCWlmIChjb3VudCkgeworCQljcHdkX3Bpbmd0aW1lcihwLCBpbmRleCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBjcHdkX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcHdkX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmlvY3RsID0JY3B3ZF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0JY3B3ZF9jb21wYXRfaW9jdGwsCisJLm9wZW4gPQkJY3B3ZF9vcGVuLAorCS53cml0ZSA9CWNwd2Rfd3JpdGUsCisJLnJlYWQgPQkJY3B3ZF9yZWFkLAorCS5yZWxlYXNlID0JY3B3ZF9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgY3B3ZF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wdGlvbnM7CisJY29uc3QgY2hhciAqc3RyX3Byb3A7CisJY29uc3Qgdm9pZCAqcHJvcF92YWw7CisJaW50IGksIGVyciA9IC1FSU5WQUw7CisJc3RydWN0IGNwd2QgKnA7CisKKwlpZiAoY3B3ZF9kZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jYXRlIHN0cnVjdCBjcHdkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXAtPmlycSA9IG9wLT5pcnFzWzBdOworCisJc3Bpbl9sb2NrX2luaXQoJnAtPmxvY2spOworCisJcC0+cmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgICAgNCAqIFdEX1RJTUVSX1JFR1NaLCBEUklWRVJfTkFNRSk7CisJaWYgKCFwLT5yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJb3B0aW9ucyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvb3B0aW9ucyIpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFvcHRpb25zKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBmaW5kIC9vcHRpb25zIG5vZGUuXG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwcm9wX3ZhbCA9IG9mX2dldF9wcm9wZXJ0eShvcHRpb25zLCAid2F0Y2hkb2ctZW5hYmxlPyIsIE5VTEwpOworCXAtPmVuYWJsZWQgPSAocHJvcF92YWwgPyB0cnVlIDogZmFsc2UpOworCisJcHJvcF92YWwgPSBvZl9nZXRfcHJvcGVydHkob3B0aW9ucywgIndhdGNoZG9nLXJlYm9vdD8iLCBOVUxMKTsKKwlwLT5yZWJvb3QgPSAocHJvcF92YWwgPyB0cnVlIDogZmFsc2UpOworCisJc3RyX3Byb3AgPSBvZl9nZXRfcHJvcGVydHkob3B0aW9ucywgIndhdGNoZG9nLXRpbWVvdXQiLCBOVUxMKTsKKwlpZiAoc3RyX3Byb3ApCisJCXAtPnRpbWVvdXQgPSBzaW1wbGVfc3RydG91bChzdHJfcHJvcCwgTlVMTCwgMTApOworCisJLyogQ1AxNDAwcyBzZWVtIHRvIGhhdmUgYnJva2VuIFBMRCBpbXBsZW1lbnRhdGlvbnMtLSB0aGUKKwkgKiBpbnRlcnJ1cHRfbWFzayByZWdpc3RlciBjYW5ub3QgYmUgd3JpdHRlbiwgc28gbm8gdGltZXIKKwkgKiBpbnRlcnJ1cHRzIGNhbiBiZSBtYXNrZWQgd2l0aGluIHRoZSBQTEQuCisJICovCisJc3RyX3Byb3AgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJtb2RlbCIsIE5VTEwpOworCXAtPmJyb2tlbiA9IChzdHJfcHJvcCAmJiAhc3RyY21wKHN0cl9wcm9wLCBXRF9CQURNT0RFTCkpOworCisJaWYgKCFwLT5lbmFibGVkKQorCQljcHdkX3RvZ2dsZWludHIocCwgLTEsIFdEX0lOVFJfT0ZGKTsKKworCWZvciAoaSA9IDA7IGkgPCBXRF9OVU1ERVZTOyBpKyspIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmNwd2RfbmFtZXNbXSA9IHsgIlJJQyIsICJYSVIiLCAiUE9SIiB9OworCQlzdGF0aWMgaW50ICpwYXJtc1tdID0geyAmd2QwX3RpbWVvdXQsCisJCQkJCSZ3ZDFfdGltZW91dCwKKwkJCQkJJndkMl90aW1lb3V0IH07CisJCXN0cnVjdCBtaXNjZGV2aWNlICptcCA9ICZwLT5kZXZzW2ldLm1pc2M7CisKKwkJbXAtPm1pbm9yID0gV0QwX01JTk9SICsgaTsKKwkJbXAtPm5hbWUgPSBjcHdkX25hbWVzW2ldOworCQltcC0+Zm9wcyA9ICZjcHdkX2ZvcHM7CisKKwkJcC0+ZGV2c1tpXS5yZWdzID0gcC0+cmVncyArIChpICogV0RfVElNRVJfUkVHU1opOworCQlwLT5kZXZzW2ldLmludHJfbWFzayA9IChXRDBfSU5UUl9NQVNLIDw8IGkpOworCQlwLT5kZXZzW2ldLnJ1bnN0YXR1cyAmPSB+V0RfU1RBVF9CU1RPUDsKKwkJcC0+ZGV2c1tpXS5ydW5zdGF0dXMgfD0gV0RfU1RBVF9JTklUOworCQlwLT5kZXZzW2ldLnRpbWVvdXQgPSBwLT50aW1lb3V0OworCQlpZiAoKnBhcm1zW2ldKQorCQkJcC0+ZGV2c1tpXS50aW1lb3V0ID0gKnBhcm1zW2ldOworCisJCWVyciA9IG1pc2NfcmVnaXN0ZXIoJnAtPmRldnNbaV0ubWlzYyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlIGZvciAiCisJCQkgICAgICAgImRldiAlZFxuIiwgaSk7CisJCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCQl9CisJfQorCisJaWYgKHAtPmJyb2tlbikgeworCQlpbml0X3RpbWVyKCZjcHdkX3RpbWVyKTsKKwkJY3B3ZF90aW1lci5mdW5jdGlvbiAJPSBjcHdkX2Jyb2tlbnRpbWVyOworCQljcHdkX3RpbWVyLmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpIHA7CisJCWNwd2RfdGltZXIuZXhwaXJlcwk9IFdEX0JUSU1FT1VUOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJQTEQgZGVmZWN0IHdvcmthcm91bmQgZW5hYmxlZCBmb3IgIgorCQkgICAgICAgIm1vZGVsICIgV0RfQkFETU9ERUwgIi5cbiIpOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcCk7CisJY3B3ZF9kZXZpY2UgPSBwOworCWVyciA9IDA7CisKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfdW5yZWdpc3RlcjoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCW1pc2NfZGVyZWdpc3RlcigmcC0+ZGV2c1tpXS5taXNjKTsKKworb3V0X2lvdW5tYXA6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCA0ICogV0RfVElNRVJfUkVHU1opOworCitvdXRfZnJlZToKKwlrZnJlZShwKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY3B3ZF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJc3RydWN0IGNwd2QgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQltaXNjX2RlcmVnaXN0ZXIoJnAtPmRldnNbaV0ubWlzYyk7CisKKwkJaWYgKCFwLT5lbmFibGVkKSB7CisJCQljcHdkX3N0b3B0aW1lcihwLCBpKTsKKwkJCWlmIChwLT5kZXZzW2ldLnJ1bnN0YXR1cyAmIFdEX1NUQVRfQlNUT1ApCisJCQkJY3B3ZF9yZXNldGJyb2tlbnRpbWVyKHAsIGkpOworCQl9CisJfQorCisJaWYgKHAtPmJyb2tlbikKKwkJZGVsX3RpbWVyX3N5bmMoJmNwd2RfdGltZXIpOworCisJaWYgKHAtPmluaXRpYWxpemVkKQorCQlmcmVlX2lycShwLT5pcnEsIHApOworCisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwLT5yZWdzLCA0ICogV0RfVElNRVJfUkVHU1opOworCWtmcmVlKHApOworCisJY3B3ZF9kZXZpY2UgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNwd2RfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gIndhdGNoZG9nIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNwd2RfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBjcHdkX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSBjcHdkX21hdGNoLAorCS5wcm9iZQkJPSBjcHdkX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3B3ZF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B3ZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmY3B3ZF9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHdkX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmY3B3ZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjcHdkX2luaXQpOworbW9kdWxlX2V4aXQoY3B3ZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZ2VvZGV3ZHQuYwppbmRleCA2MTRhNWM3Li42Nzk5YTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2dlb2Rld2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9nZW9kZXdkdC5jCkBAIC0xMzAsOCArMTMwLDggQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGdlb2Rld2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgZ2VvZGV3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IF9fdXNlciAqcCA9IGFyZ3A7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiAJLndyaXRlICAgICAgICAgID0gZ2VvZGV3ZHRfd3JpdGUsCi0JLmlvY3RsICAgICAgICAgID0gZ2VvZGV3ZHRfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsID0gZ2VvZGV3ZHRfaW9jdGwsCiAJLm9wZW4gICAgICAgICAgID0gZ2VvZGV3ZHRfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSBnZW9kZXdkdF9yZWxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMgYi9kcml2ZXJzL3dhdGNoZG9nL2libWFzci5jCmluZGV4IGI4MjQwNWMuLjg5ZmNlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaWJtYXNyLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pYm1hc3IuYwpAQCAtODUsNyArODUsNiBAQAogCiAJb3V0YihyZWcgJiB+YXNyX3RvZ2dsZV9tYXNrLCBhc3Jfd3JpdGVfYWRkcik7CiAJcmVnID0gaW5iKGFzcl9yZWFkX2FkZHIpOwotCXNwaW5fdW5sb2NrKCZhc3JfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGFzcl90b2dnbGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI4YWYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCkBAIC0wLDAgKzEsNzI1IEBACisvKgorICoJV2F0Y2hkb2cgVGltZXIgRHJpdmVyCisgKgkgICBmb3IgSVRFIElUODd4eCBFbnZpcm9ubWVudCBDb250cm9sIC0gTG93IFBpbiBDb3VudCBJbnB1dCAvIE91dHB1dAorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwNyAgT2xpdmVyIFNjaHVzdGVyIDxvbGl2ZXJzMTM3QGFvbC5jb20+CisgKgorICoJQmFzZWQgb24gc29mdGRvZy5jCWJ5IEFsYW4gQ294LAorICoJCSA4Mzk3N2Zfd2R0LmMJYnkgSm9zZSBHb25jYWx2ZXMsCisgKgkJIGl0ODcuYwkJYnkgQ2hyaXMgR2F1dGhyb24sIEplYW4gRGVsdmFyZQorICoKKyAqCURhdGEtc2hlZXRzOiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIElURSB3ZWJzaXRlCisgKgkJICAgIGh0dHA6Ly93d3cuaXRlLmNvbS50dy8KKyAqCisgKglTdXBwb3J0IG9mIHRoZSB3YXRjaGRvZyB0aW1lcnMsIHdoaWNoIGFyZSBhdmFpbGFibGUgb24KKyAqCUlUODcxNiwgSVQ4NzE4LCBJVDg3MjYgYW5kIElUODcxMiAoSixLIHZlcnNpb24pLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBXQVRDSERPR19WRVJTSU9OCSIxLjEyIgorI2RlZmluZSBXQVRDSERPR19OQU1FCQkiSVQ4NyBXRFQiCisjZGVmaW5lIFBGWAkJCVdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJV0FUQ0hET0dfTkFNRSAiIGRyaXZlciwgdiIgV0FUQ0hET0dfVkVSU0lPTiAiXG4iCisjZGVmaW5lIFdEX01BR0lDCQknVicKKworLyogRGVmYXVsdHMgZm9yIE1vZHVsZSBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgREVGQVVMVF9OT0dBTUVQT1JUCTAKKyNkZWZpbmUgREVGQVVMVF9FWENMVVNJVkUJMQorI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgCTYwCisjZGVmaW5lIERFRkFVTFRfVEVTVE1PREUJMAorI2RlZmluZSBERUZBVUxUX05PV0FZT1VUCVdBVENIRE9HX05PV0FZT1VUCisKKy8qIElPIFBvcnRzICovCisjZGVmaW5lIFJFRwkJMHgyZQorI2RlZmluZSBWQUwJCTB4MmYKKworLyogTG9naWNhbCBkZXZpY2UgTnVtYmVycyBMRE4gKi8KKyNkZWZpbmUgR1BJTwkJMHgwNworI2RlZmluZSBHQU1FUE9SVAkweDA5CisjZGVmaW5lIENJUgkJMHgwYQorCisvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyBhbmQgRnVuY3Rpb25zICovCisjZGVmaW5lIExETlJFRwkJMHgwNworI2RlZmluZSBDSElQSUQJCTB4MjAKKyNkZWZpbmUgQ0hJUFJFViAJMHgyMgorI2RlZmluZSBBQ1RSRUcJCTB4MzAKKyNkZWZpbmUgQkFTRVJFRyAJMHg2MAorCisvKiBDaGlwIElkIG51bWJlcnMgKi8KKyNkZWZpbmUgTk9fREVWX0lECTB4ZmZmZgorI2RlZmluZSBJVDg3MDVfSUQJMHg4NzA1CisjZGVmaW5lIElUODcxMl9JRAkweDg3MTIKKyNkZWZpbmUgSVQ4NzE2X0lECTB4ODcxNgorI2RlZmluZSBJVDg3MThfSUQJMHg4NzE4CisjZGVmaW5lIElUODcyNl9JRAkweDg3MjYJLyogdGhlIGRhdGEgc2hlZXQgc3VnZ2VzdCB3cm9uZ2x5IDB4ODcxNiAqLworCisvKiBHUElPIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIExETj0weDA3ICovCisjZGVmaW5lIFdEVENUUkwgCTB4NzEKKyNkZWZpbmUgV0RUQ0ZHCQkweDcyCisjZGVmaW5lIFdEVFZBTExTQgkweDczCisjZGVmaW5lIFdEVFZBTE1TQgkweDc0CisKKy8qIEdQSU8gQml0cyBXRFRDVFJMICovCisjZGVmaW5lIFdEVF9DSVJJTlQJMHg4MAorI2RlZmluZSBXRFRfTU9VU0VJTlQJMHg0MAorI2RlZmluZSBXRFRfS1lCSU5UCTB4MjAKKyNkZWZpbmUgV0RUX0dBTUVQT1JUCTB4MTAgLyogbm90IGl0ODcxOCAqLworI2RlZmluZSBXRFRfRk9SQ0UJMHgwMgorI2RlZmluZSBXRFRfWkVSTwkweDAxCisKKy8qIEdQSU8gQml0cyBXRFRDRkcgKi8KKyNkZWZpbmUgV0RUX1RPVjEJMHg4MAorI2RlZmluZSBXRFRfS1JTVAkweDQwCisjZGVmaW5lIFdEVF9UT1ZFCTB4MjAKKyNkZWZpbmUgV0RUX1BXUk9LCTB4MTAKKyNkZWZpbmUgV0RUX0lOVF9NQVNLCTB4MGYKKworLyogQ0lSIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgTEROPTB4MGEgKi8KKyNkZWZpbmUgQ0lSX0lMUyAJMHg3MAorCisvKiBUaGUgZGVmYXVsdCBCYXNlIGFkZHJlc3MgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIHdlIHVzZSB0aGlzICovCisjZGVmaW5lIENJUl9CQVNFCTB4MDIwOAorCisvKiBDSVIgQ29udHJvbGxlciAqLworI2RlZmluZSBDSVJfRFIoYikJKGIpCisjZGVmaW5lIENJUl9JRVIoYikJKGIgKyAxKQorI2RlZmluZSBDSVJfUkNSKGIpCShiICsgMikKKyNkZWZpbmUgQ0lSX1RDUjEoYikJKGIgKyAzKQorI2RlZmluZSBDSVJfVENSMihiKQkoYiArIDQpCisjZGVmaW5lIENJUl9UU1IoYikJKGIgKyA1KQorI2RlZmluZSBDSVJfUlNSKGIpCShiICsgNikKKyNkZWZpbmUgQ0lSX0JETFIoYikJKGIgKyA1KQorI2RlZmluZSBDSVJfQkRIUihiKQkoYiArIDYpCisjZGVmaW5lIENJUl9JSVIoYikJKGIgKyA3KQorCisvKiBEZWZhdWx0IEJhc2UgYWRkcmVzcyBvZiBHYW1lIHBvcnQgKi8KKyNkZWZpbmUgR1BfQkFTRV9ERUZBVUxUCTB4MDIwMQorCisvKiB3ZHRfc3RhdHVzICovCisjZGVmaW5lIFdEVFNfVElNRVJfUlVOCTAKKyNkZWZpbmUgV0RUU19ERVZfT1BFTgkxCisjZGVmaW5lIFdEVFNfS0VFUEFMSVZFCTIKKyNkZWZpbmUgV0RUU19MT0NLRUQJMworI2RlZmluZSBXRFRTX1VTRV9HUAk0CisjZGVmaW5lIFdEVFNfRVhQRUNURUQJNQorCitzdGF0aWMJdW5zaWduZWQgaW50IGJhc2UsIGdwYWN0LCBjaXJhY3Q7CitzdGF0aWMJdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOworc3RhdGljCURFRklORV9TUElOTE9DSyhzcGlubG9jayk7CisKK3N0YXRpYwlpbnQgbm9nYW1lcG9ydCA9IERFRkFVTFRfTk9HQU1FUE9SVDsKK3N0YXRpYwlpbnQgZXhjbHVzaXZlICA9IERFRkFVTFRfRVhDTFVTSVZFOworc3RhdGljCWludCB0aW1lb3V0ICAgID0gREVGQVVMVF9USU1FT1VUOworc3RhdGljCWludCB0ZXN0bW9kZSAgID0gREVGQVVMVF9URVNUTU9ERTsKK3N0YXRpYwlpbnQgbm93YXlvdXQgICA9IERFRkFVTFRfTk9XQVlPVVQ7CisKK21vZHVsZV9wYXJhbShub2dhbWVwb3J0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub2dhbWVwb3J0LCAiRm9yYmlkIHRoZSBhY3RpdmF0aW9uIG9mIGdhbWUgcG9ydCwgZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX05PR0FNRVBPUlQpKTsKK21vZHVsZV9wYXJhbShleGNsdXNpdmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV4Y2x1c2l2ZSwgIldhdGNoZG9nIGV4Y2x1c2l2ZSBkZXZpY2Ugb3BlbiwgZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX0VYQ0xVU0lWRSkpOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMsIGRlZmF1bHQ9IgorCQlfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9USU1FT1VUKSk7Cittb2R1bGVfcGFyYW0odGVzdG1vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRlc3Rtb2RlLCAiV2F0Y2hkb2cgdGVzdCBtb2RlICgxID0gbm8gcmVib290KSwgZGVmYXVsdD0iCisJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RFU1RNT0RFKSk7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkLCBkZWZhdWx0PSIKKwkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSk7CisKKy8qIFN1cGVyaW8gQ2hpcCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19lbnRlcih2b2lkKQoreworCW91dGIoMHg4NywgUkVHKTsKKwlvdXRiKDB4MDEsIFJFRyk7CisJb3V0YigweDU1LCBSRUcpOworCW91dGIoMHg1NSwgUkVHKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdCh2b2lkKQoreworCW91dGIoMHgwMiwgUkVHKTsKKwlvdXRiKDB4MDIsIFZBTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX3NlbGVjdChpbnQgbGRuKQoreworCW91dGIoTEROUkVHLCBSRUcpOworCW91dGIobGRuLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2luYihpbnQgcmVnKQoreworCW91dGIocmVnLCBSRUcpOworCXJldHVybiBpbmIoVkFMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fb3V0YihpbnQgdmFsLCBpbnQgcmVnKQoreworICAgICAgIG91dGIocmVnLCBSRUcpOworICAgICAgIG91dGIodmFsLCBWQUwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2ludyhpbnQgcmVnKQoreworCWludCB2YWw7CisJb3V0YihyZWcrKywgUkVHKTsKKwl2YWwgPSBpbmIoVkFMKSA8PCA4OworCW91dGIocmVnLCBSRUcpOworCXZhbCB8PSBpbmIoVkFMKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19vdXR3KGludCB2YWwsIGludCByZWcpCit7CisgICAgICAgb3V0YihyZWcrKywgUkVHKTsKKyAgICAgICBvdXRiKHZhbCA+PiA4LCBWQUwpOworICAgICAgIG91dGIocmVnLCBSRUcpOworICAgICAgIG91dGIodmFsLCBWQUwpOworfQorCisvKiB3YXRjaGRvZyB0aW1lciBoYW5kbGluZyAqLworCitzdGF0aWMgdm9pZCB3ZHRfa2VlcGFsaXZlKHZvaWQpCit7CisJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpCisJCWluYihiYXNlKTsKKwllbHNlCisJCS8qIFRoZSB0aW1lciByZWxvYWRzIHdpdGggYXJvdW5kIDUgbXNlYyBkZWxheSAqLworCQlvdXRiKDB4NTUsIENJUl9EUihiYXNlKSk7CisJc2V0X2JpdChXRFRTX0tFRVBBTElWRSwgJndkdF9zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfc3RhcnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CisJc3VwZXJpb19lbnRlcigpOworCisJc3VwZXJpb19zZWxlY3QoR1BJTyk7CisJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpCisJCXN1cGVyaW9fb3V0YihXRFRfR0FNRVBPUlQsIFdEVENUUkwpOworCWVsc2UKKwkJc3VwZXJpb19vdXRiKFdEVF9DSVJJTlQsIFdEVENUUkwpOworCWlmICghdGVzdG1vZGUpCisJCXN1cGVyaW9fb3V0YihXRFRfVE9WMSB8IFdEVF9LUlNUIHwgV0RUX1BXUk9LLCBXRFRDRkcpOworCWVsc2UKKwkJc3VwZXJpb19vdXRiKFdEVF9UT1YxLCBXRFRDRkcpOworCXN1cGVyaW9fb3V0Yih0aW1lb3V0Pj44LCBXRFRWQUxNU0IpOworCXN1cGVyaW9fb3V0Yih0aW1lb3V0LCBXRFRWQUxMU0IpOworCisJc3VwZXJpb19leGl0KCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgd2R0X3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CisJc3VwZXJpb19lbnRlcigpOworCisJc3VwZXJpb19zZWxlY3QoR1BJTyk7CisJc3VwZXJpb19vdXRiKDB4MDAsIFdEVENUUkwpOworCXN1cGVyaW9fb3V0YihXRFRfVE9WMSwgV0RUQ0ZHKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTVNCKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTFNCKTsKKworCXN1cGVyaW9fZXhpdCgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJd2R0X3NldF90aW1lb3V0IC0gc2V0IGEgbmV3IHRpbWVvdXQgdmFsdWUgd2l0aCB3YXRjaGRvZyBpb2N0bAorICoJQHQ6IHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcworICoKKyAqCVRoZSBoYXJkd2FyZSBkZXZpY2UgaGFzIGEgMTYgYml0IHdhdGNoZG9nIHRpbWVyLCB0aHVzIHRoZQorICoJdGltZW91dCB0aW1lIHJhbmdlcyBiZXR3ZWVuIDEgYW5kIDY1NTM1IHNlY29uZHMuCisgKgorICoJVXNlZCB3aXRoaW4gV0RJT0NfU0VUVElNRU9VVCB3YXRjaGRvZyBkZXZpY2UgaW9jdGwuCisgKi8KKworc3RhdGljIGludCB3ZHRfc2V0X3RpbWVvdXQoaW50IHQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0IDwgMSB8fCB0ID4gNjU1MzUpCisJCXJldHVybiAtRUlOVkFMOworCisJdGltZW91dCA9IHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAodGVzdF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkgeworCQlzdXBlcmlvX2VudGVyKCk7CisKKwkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CisJCXN1cGVyaW9fb3V0Yih0Pj44LCBXRFRWQUxNU0IpOworCQlzdXBlcmlvX291dGIodCwgV0RUVkFMTFNCKTsKKworCQlzdXBlcmlvX2V4aXQoKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfZ2V0X3N0YXR1cyAtIGRldGVybWluZXMgdGhlIHN0YXR1cyBzdXBwb3J0ZWQgYnkgd2F0Y2hkb2cgaW9jdGwKKyAqCUBzdGF0dXM6IHN0YXR1cyByZXR1cm5lZCB0byB1c2VyIHNwYWNlCisgKgorICoJVGhlIHN0YXR1cyBiaXQgb2YgdGhlIGRldmljZSBkb2VzIG5vdCBhbGxvdyB0byBkaXN0aW5ndWlzaAorICoJYmV0d2VlbiBhIHJlZ3VsYXIgc3lzdGVtIHJlc2V0IGFuZCBhIHdhdGNoZG9nIGZvcmNlZCByZXNldC4KKyAqCUJ1dCwgaW4gdGVzdCBtb2RlIGl0IGlzIHVzZWZ1bCwgc28gaXQgaXMgc3VwcG9ydGVkIHRocm91Z2gKKyAqCVdESU9DX0dFVFNUQVRVUyB3YXRjaGRvZyBpb2N0bC4gQWRkaXRpb25hbGx5IHRoZSBkcml2ZXIKKyAqCXJlcG9ydHMgdGhlIGtlZXBhbGl2ZSBzaWduYWwgYW5kIHRoZSBhY2NlcHRpb24gb2YgdGhlIG1hZ2ljLgorICoKKyAqCVVzZWQgd2l0aGluIFdESU9DX0dFVFNUQVRVUyB3YXRjaGRvZyBkZXZpY2UgaW9jdGwuCisgKi8KKworc3RhdGljIGludCB3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJKnN0YXR1cyA9IDA7CisJaWYgKHRlc3Rtb2RlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOworCQlzdXBlcmlvX2VudGVyKCk7CisJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOworCQlpZiAoc3VwZXJpb19pbmIoV0RUQ1RSTCkgJiBXRFRfWkVSTykgeworCQkJc3VwZXJpb19vdXRiKDB4MDAsIFdEVENUUkwpOworCQkJY2xlYXJfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cyk7CisJCQkqc3RhdHVzIHw9IFdESU9GX0NBUkRSRVNFVDsKKwkJfQorCisJCXN1cGVyaW9fZXhpdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdEVFNfS0VFUEFMSVZFLCAmd2R0X3N0YXR1cykpCisJCSpzdGF0dXMgfD0gV0RJT0ZfS0VFUEFMSVZFUElORzsKKwlpZiAodGVzdF9iaXQoV0RUU19FWFBFQ1RFRCwgJndkdF9zdGF0dXMpKQorCQkqc3RhdHVzIHw9IFdESU9GX01BR0lDQ0xPU0U7CisJcmV0dXJuIDA7Cit9CisKKy8qIC9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcgKi8KKworLyoqCisgKgl3ZHRfb3BlbiAtIHdhdGNoZG9nIGZpbGVfb3BlcmF0aW9ucyAub3BlbgorICoJQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICoKKyAqCVRoZSB3YXRjaGRvZyB0aW1lciBzdGFydHMgYnkgb3BlbmluZyB0aGUgZGV2aWNlLgorICoKKyAqCVVzZWQgd2l0aGluIHRoZSBmaWxlIG9wZXJhdGlvbiBvZiB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGV4Y2x1c2l2ZSAmJiB0ZXN0X2FuZF9zZXRfYml0KFdEVFNfREVWX09QRU4sICZ3ZHRfc3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkgeworCQlpZiAobm93YXlvdXQgJiYgIXRlc3RfYW5kX3NldF9iaXQoV0RUU19MT0NLRUQsICZ3ZHRfc3RhdHVzKSkKKwkJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCXdkdF9zdGFydCgpOworCX0KKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qKgorICoJd2R0X3JlbGVhc2UgLSB3YXRjaGRvZyBmaWxlX29wZXJhdGlvbnMgLnJlbGVhc2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCisgKglDbG9zaW5nIHRoZSB3YXRjaGRvZyBkZXZpY2UgZWl0aGVyIHN0b3BzIHRoZSB3YXRjaGRvZyB0aW1lcgorICoJb3IgaW4gdGhlIGNhc2UsIHRoYXQgbm93YXlvdXQgaXMgc2V0IG9yIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKyAqCXdhc24ndCB3cml0dGVuLCBhIGNyaXRpY2FsIHdhcm5pbmcgYWJvdXQgYW4gcnVubmluZyB3YXRjaGRvZworICoJdGltZXIgaXMgZ2l2ZW4uCisgKgorICoJVXNlZCB3aXRoaW4gdGhlIGZpbGUgb3BlcmF0aW9uIG9mIHRoZSB3YXRjaGRvZyBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCB3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdEVFNfRVhQRUNURUQsICZ3ZHRfc3RhdHVzKSkgeworCQkJd2R0X3N0b3AoKTsKKwkJCWNsZWFyX2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpOworCQl9IGVsc2UgeworCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJcHJpbnRrKEtFUk5fQ1JJVCBQRlgKKwkJCSAgICAgICAidW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCX0KKwl9CisJY2xlYXJfYml0KFdEVFNfREVWX09QRU4sICZ3ZHRfc3RhdHVzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfd3JpdGUgLSB3YXRjaGRvZyBmaWxlX29wZXJhdGlvbnMgLndyaXRlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKglAYnVmOiBidWZmZXIgdG8gd3JpdGUKKyAqCUBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICoKKyAqCVVzZWQgd2l0aGluIHRoZSBmaWxlIG9wZXJhdGlvbiBvZiB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICovCisKK3N0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpZiAoY291bnQpIHsKKwkJY2xlYXJfYml0KFdEVFNfRVhQRUNURUQsICZ3ZHRfc3RhdHVzKTsKKwkJd2R0X2tlZXBhbGl2ZSgpOworCX0KKwlpZiAoIW5vd2F5b3V0KSB7CisJCXNpemVfdCBvZnM7CisKKwkvKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyIGxvbmcgYWdvICovCisJCWZvciAob2ZzID0gMDsgb2ZzICE9IGNvdW50OyBvZnMrKykgeworCQkJY2hhciBjOworCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIG9mcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoYyA9PSBXRF9NQUdJQykKKwkJCQlzZXRfYml0KFdEVFNfRVhQRUNURUQsICZ3ZHRfc3RhdHVzKTsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucyA9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFIHwgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJLmlkZW50aXR5ID0gV0FUQ0hET0dfTkFNRSwKK307CisKKy8qKgorICoJd2R0X2lvY3RsIC0gd2F0Y2hkb2cgZmlsZV9vcGVyYXRpb25zIC51bmxvY2tlZF9pb2N0bAorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqCUBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKglUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICoJYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAqCisgKglVc2VkIHdpdGhpbiB0aGUgZmlsZSBvcGVyYXRpb24gb2YgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqLworCitzdGF0aWMgbG9uZyB3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYyA9IDAsIHN0YXR1cywgbmV3X29wdGlvbnMsIG5ld190aW1lb3V0OworCXVuaW9uIHsKKwkJc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICppZGVudDsKKwkJaW50IF9fdXNlciAqaTsKKwl9IHVhcmc7CisKKwl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKHVhcmcuaWRlbnQsCisJCQkJICAgICZpZGVudCwgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQl3ZHRfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgdWFyZy5pKTsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHVhcmcuaSk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X2tlZXBhbGl2ZSgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyKG5ld19vcHRpb25zLCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChuZXdfb3B0aW9ucykgeworCQljYXNlIFdESU9TX0RJU0FCTEVDQVJEOgorCQkJaWYgKHRlc3RfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpCisJCQkJd2R0X3N0b3AoKTsKKwkJCWNsZWFyX2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPU19FTkFCTEVDQVJEOgorCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpCisJCQkJd2R0X3N0YXJ0KCk7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJjID0gd2R0X3NldF90aW1lb3V0KG5ld190aW1lb3V0KTsKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCWlmIChwdXRfdXNlcih0aW1lb3V0LCB1YXJnLmkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiByYzsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwl2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKKwkJd2R0X3N0b3AoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0X3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IHdkdF9pb2N0bCwKKwkub3BlbgkJPSB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdkdF9taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZ3ZHRfZm9wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpdDg3X3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKwl1MTYgY2hpcF90eXBlOworCXU4ICBjaGlwX3JldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CisJc3VwZXJpb19lbnRlcigpOworCWNoaXBfdHlwZSA9IHN1cGVyaW9faW53KENISVBJRCk7CisJY2hpcF9yZXYgID0gc3VwZXJpb19pbmIoQ0hJUFJFVikgJiAweDBmOworCXN1cGVyaW9fZXhpdCgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGNoaXBfdHlwZSkgeworCWNhc2UgSVQ4NzE2X0lEOgorCWNhc2UgSVQ4NzE4X0lEOgorCWNhc2UgSVQ4NzI2X0lEOgorCQlicmVhazsKKwljYXNlIElUODcxMl9JRDoKKwkJaWYgKGNoaXBfcmV2ID4gNykKKwkJCWJyZWFrOworCWNhc2UgSVQ4NzA1X0lEOgorCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiVW5zdXBwb3J0ZWQgQ2hpcCBmb3VuZCwgQ2hpcCAlMDR4IFJldmlzaW9uICUwMnhcbiIsCisJCSAgICAgICBjaGlwX3R5cGUsIGNoaXBfcmV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FzZSBOT19ERVZfSUQ6CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJVbmtub3duIENoaXAgZm91bmQsIENoaXAgJTA0eCBSZXZpc2lvbiAlMDR4XG4iLAorCQkgICAgICAgY2hpcF90eXBlLCBjaGlwX3Jldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOworCXN1cGVyaW9fZW50ZXIoKTsKKworCXN1cGVyaW9fc2VsZWN0KEdQSU8pOworCXN1cGVyaW9fb3V0YihXRFRfVE9WMSwgV0RUQ0ZHKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ1RSTCk7CisKKwkvKiBGaXJzdCB0cnkgdG8gZ2V0IEdhbWVwb3J0IHN1cHBvcnQgKi8KKwlpZiAoY2hpcF90eXBlICE9IElUODcxOF9JRCAmJiAhbm9nYW1lcG9ydCkgeworCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7CisJCWJhc2UgPSBzdXBlcmlvX2ludyhCQVNFUkVHKTsKKwkJaWYgKCFiYXNlKSB7CisJCQliYXNlID0gR1BfQkFTRV9ERUZBVUxUOworCQkJc3VwZXJpb19vdXR3KGJhc2UsIEJBU0VSRUcpOworCQl9CisJCWdwYWN0ID0gc3VwZXJpb19pbmIoQUNUUkVHKTsKKwkJc3VwZXJpb19vdXRiKDB4MDEsIEFDVFJFRyk7CisJCXN1cGVyaW9fZXhpdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCQlpZiAocmVxdWVzdF9yZWdpb24oYmFzZSwgMSwgV0FUQ0hET0dfTkFNRSkpCisJCQlzZXRfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cyk7CisJCWVsc2UKKwkJCXJjID0gLUVJTzsKKwl9IGVsc2UgeworCQlzdXBlcmlvX2V4aXQoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlbid0IEdhbWVwb3J0IHN1cHBvcnQsIHRyeSB0byBnZXQgQ0lSIHN1cHBvcnQgKi8KKwlpZiAoIXRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihDSVJfQkFTRSwgOCwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJCWlmIChyYyA9PSAtRUlPKQorCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkJIkkvTyBBZGRyZXNzIDB4JTA0eCBhbmQgMHglMDR4IgorCQkJCQkiIGFscmVhZHkgaW4gdXNlXG4iLCBiYXNlLCBDSVJfQkFTRSk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCQkiSS9PIEFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJCQlDSVJfQkFTRSk7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJYmFzZSA9IENJUl9CQVNFOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwkJc3VwZXJpb19lbnRlcigpOworCisJCXN1cGVyaW9fc2VsZWN0KENJUik7CisJCXN1cGVyaW9fb3V0dyhiYXNlLCBCQVNFUkVHKTsKKwkJc3VwZXJpb19vdXRiKDB4MDAsIENJUl9JTFMpOworCQljaXJhY3QgPSBzdXBlcmlvX2luYihBQ1RSRUcpOworCQlzdXBlcmlvX291dGIoMHgwMSwgQUNUUkVHKTsKKwkJaWYgKHJjID09IC1FSU8pIHsKKwkJCXN1cGVyaW9fc2VsZWN0KEdBTUVQT1JUKTsKKwkJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKKwkJfQorCisJCXN1cGVyaW9fZXhpdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCX0KKworCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gNjU1MzUpIHsKKwkJdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJICAgICAgICJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSwgdXNlIGRlZmF1bHQgJWQgc2VjXG4iLAorCQkgICAgICAgREVGQVVMVF9USU1FT1VUKTsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIkNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsIHJjKTsKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjsKKwl9CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgIkNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJd2R0X21pc2NkZXYubWlub3IsIHJjKTsKKwkJZ290byBlcnJfb3V0X3JlYm9vdDsKKwl9CisKKwkvKiBJbml0aWFsaXplIENJUiB0byB1c2UgaXQgYXMga2VlcGFsaXZlIHNvdXJjZSAqLworCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCQlvdXRiKDB4MDAsIENJUl9SQ1IoYmFzZSkpOworCQlvdXRiKDB4YzAsIENJUl9UQ1IxKGJhc2UpKTsKKwkJb3V0YigweDVjLCBDSVJfVENSMihiYXNlKSk7CisJCW91dGIoMHgxMCwgQ0lSX0lFUihiYXNlKSk7CisJCW91dGIoMHgwMCwgQ0lSX0JESFIoYmFzZSkpOworCQlvdXRiKDB4MDEsIENJUl9CRExSKGJhc2UpKTsKKwkJb3V0YigweDA5LCBDSVJfSUVSKGJhc2UpKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ2hpcCBpdCUwNHggcmV2aXNpb24gJWQgaW5pdGlhbGl6ZWQuICIKKwkJInRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZCB0ZXN0bW9kZT0lZCBleGNsdXNpdmU9JWQgIgorCQkibm9nYW1lcG9ydD0lZClcbiIsIGNoaXBfdHlwZSwgY2hpcF9yZXYsIHRpbWVvdXQsCisJCW5vd2F5b3V0LCB0ZXN0bW9kZSwgZXhjbHVzaXZlLCBub2dhbWVwb3J0KTsKKworCXJldHVybiAwOworCitlcnJfb3V0X3JlYm9vdDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKK2Vycl9vdXRfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7CisJaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOworCQlzdXBlcmlvX2VudGVyKCk7CisJCXN1cGVyaW9fc2VsZWN0KENJUik7CisJCXN1cGVyaW9fb3V0YihjaXJhY3QsIEFDVFJFRyk7CisJCXN1cGVyaW9fZXhpdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCX0KK2Vycl9vdXQ6CisJaWYgKGNoaXBfdHlwZSAhPSBJVDg3MThfSUQgJiYgIW5vZ2FtZXBvcnQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CisJCXN1cGVyaW9fZW50ZXIoKTsKKwkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOworCQlzdXBlcmlvX291dGIoZ3BhY3QsIEFDVFJFRyk7CisJCXN1cGVyaW9fZXhpdCgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl0ODdfd2R0X2V4aXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBub2xvY2s7CisKKwlub2xvY2sgPSAhc3Bpbl90cnlsb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CisJc3VwZXJpb19lbnRlcigpOworCXN1cGVyaW9fc2VsZWN0KEdQSU8pOworCXN1cGVyaW9fb3V0YigweDAwLCBXRFRDVFJMKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ0ZHKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTVNCKTsKKwlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTFNCKTsKKwlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7CisJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKKwl9IGVsc2UgeworCQlzdXBlcmlvX3NlbGVjdChDSVIpOworCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOworCX0KKwlzdXBlcmlvX2V4aXQoKTsKKwlpZiAoIW5vbG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKKworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7Cit9CisKK21vZHVsZV9pbml0KGl0ODdfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoaXQ4N193ZHRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk9saXZlciBTY2h1c3RlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIYXJkd2FyZSBXYXRjaGRvZyBEZXZpY2UgRHJpdmVyIGZvciBJVDg3eHggRUMtTFBDIEkvTyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9peHA0eHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwppbmRleCA4MzAyZWYwLi4xNDdiNGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2l4cDR4eF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwpAQCAtMTc0LDEwICsxNzQsOCBAQAogc3RhdGljIGludCBfX2luaXQgaXhwNHh4X3dkdF9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHByb2Nlc3Nvcl9pZDsKIAotCWFzbSgibXJjIHAxNSwgMCwgJTAsIGNyMCwgY3IwLCAwOyIgOiAiPXIiKHByb2Nlc3Nvcl9pZCkgOik7Ci0JaWYgKCEocHJvY2Vzc29yX2lkICYgMHhmKSAmJiAhY3B1X2lzX2l4cDQ2eCgpKSB7CisJaWYgKCEocmVhZF9jcHVpZF9pZCgpICYgMHhmKSAmJiAhY3B1X2lzX2l4cDQ2eCgpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSVhQNFhYWCBXYXRjaGRvZzogUmV2LiBBMCBJWFA0MnggQ1BVIGRldGVjdGVkIgogCQkJIiAtIHdhdGNoZG9nIGRpc2FibGVkXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vbWFwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9vbWFwX3dkdC5jCmluZGV4IDNhMTFkYWQuLjdiY2JiN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogbGludXgvZHJpdmVycy9jaGFyL3dhdGNoZG9nL29tYXBfd2R0LmMKKyAqIG9tYXBfd2R0LmMKICAqCi0gKiBXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSBUSSBPTUFQIDE2eHggJiAyNHh4IDMyS0h6IChub24tc2VjdXJlKSB3YXRjaGRvZworICogV2F0Y2hkb2cgZHJpdmVyIGZvciB0aGUgVEkgT01BUCAxNnh4ICYgMjR4eC8zNHh4IDMyS0h6IChub24tc2VjdXJlKSB3YXRjaGRvZwogICoKICAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoJIDxnZGF2aXNAbXZpc3RhLmNvbT4gb3IgPHNvdXJjZUBtdmlzdGEuY29tPgpAQCAtNDcsNTAgKzQ3LDY4IEBACiAKICNpbmNsdWRlICJvbWFwX3dkdC5oIgogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcF93ZHRfZGV2OworCiBzdGF0aWMgdW5zaWduZWQgdGltZXJfbWFyZ2luOwogbW9kdWxlX3BhcmFtKHRpbWVyX21hcmdpbiwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRpbWVyX21hcmdpbiwgImluaXRpYWwgd2F0Y2hkb2cgdGltZW91dCAoaW4gc2Vjb25kcykiKTsKIAotc3RhdGljIGludCBvbWFwX3dkdF91c2VyczsKLXN0YXRpYyBzdHJ1Y3QgY2xrICphcm13ZHRfY2s7Ci1zdGF0aWMgc3RydWN0IGNsayAqbXB1X3dkdF9pY2s7Ci1zdGF0aWMgc3RydWN0IGNsayAqbXB1X3dkdF9mY2s7Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgd2R0X3RyZ3JfcGF0dGVybiA9IDB4MTIzNDsKIHN0YXRpYyBzcGlubG9ja190IHdkdF9sb2NrOwogCi1zdGF0aWMgdm9pZCBvbWFwX3dkdF9waW5nKHZvaWQpCitzdHJ1Y3Qgb21hcF93ZHRfZGV2IHsKKwl2b2lkIF9faW9tZW0gICAgKmJhc2U7ICAgICAgICAgIC8qIHBoeXNpY2FsICovCisJc3RydWN0IGRldmljZSAgICpkZXY7CisJaW50ICAgICAgICAgICAgIG9tYXBfd2R0X3VzZXJzOworCXN0cnVjdCBjbGsgICAgICAqYXJtd2R0X2NrOworCXN0cnVjdCBjbGsgICAgICAqbXB1X3dkdF9pY2s7CisJc3RydWN0IGNsayAgICAgICptcHVfd2R0X2ZjazsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlzdHJ1Y3QgbWlzY2RldmljZSBvbWFwX3dkdF9taXNjZGV2OworfTsKKworc3RhdGljIHZvaWQgb21hcF93ZHRfcGluZyhzdHJ1Y3Qgb21hcF93ZHRfZGV2ICp3ZGV2KQogeworCXZvaWQgX19pb21lbSAgICAqYmFzZSA9IHdkZXYtPmJhc2U7CisKIAkvKiB3YWl0IGZvciBwb3N0ZWQgd3JpdGUgdG8gY29tcGxldGUgKi8KLQl3aGlsZSAoKG9tYXBfcmVhZGwoT01BUF9XQVRDSERPR19XUFMpKSAmIDB4MDgpCisJd2hpbGUgKChfX3Jhd19yZWFkbChiYXNlICsgT01BUF9XQVRDSERPR19XUFMpKSAmIDB4MDgpCiAJCWNwdV9yZWxheCgpOworCiAJd2R0X3RyZ3JfcGF0dGVybiA9IH53ZHRfdHJncl9wYXR0ZXJuOwotCW9tYXBfd3JpdGVsKHdkdF90cmdyX3BhdHRlcm4sIChPTUFQX1dBVENIRE9HX1RHUikpOworCV9fcmF3X3dyaXRlbCh3ZHRfdHJncl9wYXR0ZXJuLCAoYmFzZSArIE9NQVBfV0FUQ0hET0dfVEdSKSk7CisKIAkvKiB3YWl0IGZvciBwb3N0ZWQgd3JpdGUgdG8gY29tcGxldGUgKi8KLQl3aGlsZSAoKG9tYXBfcmVhZGwoT01BUF9XQVRDSERPR19XUFMpKSAmIDB4MDgpCisJd2hpbGUgKChfX3Jhd19yZWFkbChiYXNlICsgT01BUF9XQVRDSERPR19XUFMpKSAmIDB4MDgpCiAJCWNwdV9yZWxheCgpOwogCS8qIHJlbG9hZGVkIFdDUlIgZnJvbSBXTERSICovCiB9CiAKLXN0YXRpYyB2b2lkIG9tYXBfd2R0X2VuYWJsZSh2b2lkKQorc3RhdGljIHZvaWQgb21hcF93ZHRfZW5hYmxlKHN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXYpCiB7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gd2Rldi0+YmFzZTsKKwogCS8qIFNlcXVlbmNlIHRvIGVuYWJsZSB0aGUgd2F0Y2hkb2cgKi8KLQlvbWFwX3dyaXRlbCgweEJCQkIsIE9NQVBfV0FUQ0hET0dfU1BSKTsKLQl3aGlsZSAoKG9tYXBfcmVhZGwoT01BUF9XQVRDSERPR19XUFMpKSAmIDB4MTApCisJX19yYXdfd3JpdGVsKDB4QkJCQiwgYmFzZSArIE9NQVBfV0FUQ0hET0dfU1BSKTsKKwl3aGlsZSAoKF9fcmF3X3JlYWRsKGJhc2UgKyBPTUFQX1dBVENIRE9HX1dQUykpICYgMHgxMCkKIAkJY3B1X3JlbGF4KCk7Ci0Jb21hcF93cml0ZWwoMHg0NDQ0LCBPTUFQX1dBVENIRE9HX1NQUik7Ci0Jd2hpbGUgKChvbWFwX3JlYWRsKE9NQVBfV0FUQ0hET0dfV1BTKSkgJiAweDEwKQorCisJX19yYXdfd3JpdGVsKDB4NDQ0NCwgYmFzZSArIE9NQVBfV0FUQ0hET0dfU1BSKTsKKwl3aGlsZSAoKF9fcmF3X3JlYWRsKGJhc2UgKyBPTUFQX1dBVENIRE9HX1dQUykpICYgMHgxMCkKIAkJY3B1X3JlbGF4KCk7CiB9CiAKLXN0YXRpYyB2b2lkIG9tYXBfd2R0X2Rpc2FibGUodm9pZCkKK3N0YXRpYyB2b2lkIG9tYXBfd2R0X2Rpc2FibGUoc3RydWN0IG9tYXBfd2R0X2RldiAqd2RldikKIHsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSB3ZGV2LT5iYXNlOworCiAJLyogc2VxdWVuY2UgcmVxdWlyZWQgdG8gZGlzYWJsZSB3YXRjaGRvZyAqLwotCW9tYXBfd3JpdGVsKDB4QUFBQSwgT01BUF9XQVRDSERPR19TUFIpOwkvKiBUSU1FUl9NT0RFICovCi0Jd2hpbGUgKG9tYXBfcmVhZGwoT01BUF9XQVRDSERPR19XUFMpICYgMHgxMCkKKwlfX3Jhd193cml0ZWwoMHhBQUFBLCBiYXNlICsgT01BUF9XQVRDSERPR19TUFIpOwkvKiBUSU1FUl9NT0RFICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyBPTUFQX1dBVENIRE9HX1dQUykgJiAweDEwKQogCQljcHVfcmVsYXgoKTsKLQlvbWFwX3dyaXRlbCgweDU1NTUsIE9NQVBfV0FUQ0hET0dfU1BSKTsJLyogVElNRVJfTU9ERSAqLwotCXdoaWxlIChvbWFwX3JlYWRsKE9NQVBfV0FUQ0hET0dfV1BTKSAmIDB4MTApCisKKwlfX3Jhd193cml0ZWwoMHg1NTU1LCBiYXNlICsgT01BUF9XQVRDSERPR19TUFIpOwkvKiBUSU1FUl9NT0RFICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyBPTUFQX1dBVENIRE9HX1dQUykgJiAweDEwKQogCQljcHVfcmVsYXgoKTsKIH0KIApAQCAtMTAzLDgzICsxMjEsOTAgQEAKIAl0aW1lcl9tYXJnaW4gPSBuZXdfdGltZW91dDsKIH0KIAotc3RhdGljIHZvaWQgb21hcF93ZHRfc2V0X3RpbWVvdXQodm9pZCkKK3N0YXRpYyB2b2lkIG9tYXBfd2R0X3NldF90aW1lb3V0KHN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXYpCiB7CiAJdTMyIHByZV9tYXJnaW4gPSBHRVRfV0xEUl9WQUwodGltZXJfbWFyZ2luKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSB3ZGV2LT5iYXNlOwogCiAJLyoganVzdCBjb3VudCB1cCBhdCAzMiBLSHogKi8KLQl3aGlsZSAob21hcF9yZWFkbChPTUFQX1dBVENIRE9HX1dQUykgJiAweDA0KQorCXdoaWxlIChfX3Jhd19yZWFkbChiYXNlICsgT01BUF9XQVRDSERPR19XUFMpICYgMHgwNCkKIAkJY3B1X3JlbGF4KCk7Ci0Jb21hcF93cml0ZWwocHJlX21hcmdpbiwgT01BUF9XQVRDSERPR19MRFIpOwotCXdoaWxlIChvbWFwX3JlYWRsKE9NQVBfV0FUQ0hET0dfV1BTKSAmIDB4MDQpCisKKwlfX3Jhd193cml0ZWwocHJlX21hcmdpbiwgYmFzZSArIE9NQVBfV0FUQ0hET0dfTERSKTsKKwl3aGlsZSAoX19yYXdfcmVhZGwoYmFzZSArIE9NQVBfV0FUQ0hET0dfV1BTKSAmIDB4MDQpCiAJCWNwdV9yZWxheCgpOwogfQogCiAvKgogICoJQWxsb3cgb25seSBvbmUgdGFzayB0byBob2xkIGl0IG9wZW4KICAqLwotCiBzdGF0aWMgaW50IG9tYXBfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMSwgKHVuc2lnbmVkIGxvbmcgKikmb21hcF93ZHRfdXNlcnMpKQorCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShvbWFwX3dkdF9kZXYpOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHdkZXYtPmJhc2U7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgxLCAodW5zaWduZWQgbG9uZyAqKSYod2Rldi0+b21hcF93ZHRfdXNlcnMpKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKLQkJY2xrX2VuYWJsZShhcm13ZHRfY2spOwkvKiBFbmFibGUgdGhlIGNsb2NrICovCisJCWNsa19lbmFibGUod2Rldi0+YXJtd2R0X2NrKTsJLyogRW5hYmxlIHRoZSBjbG9jayAqLwogCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCWNsa19lbmFibGUobXB1X3dkdF9pY2spOyAgICAvKiBFbmFibGUgdGhlIGludGVyZmFjZSBjbG9jayAqLwotCQljbGtfZW5hYmxlKG1wdV93ZHRfZmNrKTsgICAgLyogRW5hYmxlIHRoZSBmdW5jdGlvbmFsIGNsb2NrICovCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWNsa19lbmFibGUod2Rldi0+bXB1X3dkdF9pY2spOyAgICAvKiBFbmFibGUgdGhlIGludGVyZmFjZSBjbG9jayAqLworCQljbGtfZW5hYmxlKHdkZXYtPm1wdV93ZHRfZmNrKTsgICAgLyogRW5hYmxlIHRoZSBmdW5jdGlvbmFsIGNsb2NrICovCiAJfQogCiAJLyogaW5pdGlhbGl6ZSBwcmVzY2FsZXIgKi8KLQl3aGlsZSAob21hcF9yZWFkbChPTUFQX1dBVENIRE9HX1dQUykgJiAweDAxKQotCQljcHVfcmVsYXgoKTsKLQlvbWFwX3dyaXRlbCgoMSA8PCA1KSB8IChQVFYgPDwgMiksIE9NQVBfV0FUQ0hET0dfQ05UUkwpOwotCXdoaWxlIChvbWFwX3JlYWRsKE9NQVBfV0FUQ0hET0dfV1BTKSAmIDB4MDEpCisJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyBPTUFQX1dBVENIRE9HX1dQUykgJiAweDAxKQogCQljcHVfcmVsYXgoKTsKIAotCW9tYXBfd2R0X3NldF90aW1lb3V0KCk7Ci0Jb21hcF93ZHRfZW5hYmxlKCk7CisJX19yYXdfd3JpdGVsKCgxIDw8IDUpIHwgKFBUViA8PCAyKSwgYmFzZSArIE9NQVBfV0FUQ0hET0dfQ05UUkwpOworCXdoaWxlIChfX3Jhd19yZWFkbChiYXNlICsgT01BUF9XQVRDSERPR19XUFMpICYgMHgwMSkKKwkJY3B1X3JlbGF4KCk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSB3ZGV2OworCisJb21hcF93ZHRfc2V0X3RpbWVvdXQod2Rldik7CisJb21hcF93ZHRfZW5hYmxlKHdkZXYpOworCiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCiBzdGF0aWMgaW50IG9tYXBfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJc3RydWN0IG9tYXBfd2R0X2RldiAqd2RldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwogCS8qCiAJICogICAgICBTaHV0IG9mZiB0aGUgdGltZXIgdW5sZXNzIE5PV0FZT1VUIGlzIGRlZmluZWQuCiAJICovCiAjaWZuZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAotCW9tYXBfd2R0X2Rpc2FibGUoKTsKIAotCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQljbGtfZGlzYWJsZShhcm13ZHRfY2spOwkvKiBEaXNhYmxlIHRoZSBjbG9jayAqLwotCQljbGtfcHV0KGFybXdkdF9jayk7Ci0JCWFybXdkdF9jayA9IE5VTEw7Ci0JfQorCW9tYXBfd2R0X2Rpc2FibGUod2Rldik7CiAKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKLQkJY2xrX2Rpc2FibGUobXB1X3dkdF9pY2spOwkvKiBEaXNhYmxlIHRoZSBjbG9jayAqLwotCQljbGtfZGlzYWJsZShtcHVfd2R0X2Zjayk7CS8qIERpc2FibGUgdGhlIGNsb2NrICovCi0JCWNsa19wdXQobXB1X3dkdF9pY2spOwotCQljbGtfcHV0KG1wdV93ZHRfZmNrKTsKLQkJbXB1X3dkdF9pY2sgPSBOVUxMOwotCQltcHVfd2R0X2ZjayA9IE5VTEw7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQljbGtfZGlzYWJsZSh3ZGV2LT5hcm13ZHRfY2spOwkvKiBEaXNhYmxlIHRoZSBjbG9jayAqLworCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWNsa19kaXNhYmxlKHdkZXYtPm1wdV93ZHRfaWNrKTsJLyogRGlzYWJsZSB0aGUgY2xvY2sgKi8KKwkJY2xrX2Rpc2FibGUod2Rldi0+bXB1X3dkdF9mY2spOwkvKiBEaXNhYmxlIHRoZSBjbG9jayAqLwogCX0KICNlbHNlCiAJcHJpbnRrKEtFUk5fQ1JJVCAib21hcF93ZHQ6IFVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyFcbiIpOwogI2VuZGlmCi0Jb21hcF93ZHRfdXNlcnMgPSAwOworCXdkZXYtPm9tYXBfd2R0X3VzZXJzID0gMDsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvbWFwX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCiAJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKKwlzdHJ1Y3Qgb21hcF93ZHRfZGV2ICp3ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJLyogUmVmcmVzaCBMT0FEX1RJTUUuICovCiAJaWYgKGxlbikgewogCQlzcGluX2xvY2soJndkdF9sb2NrKTsKLQkJb21hcF93ZHRfcGluZygpOworCQlvbWFwX3dkdF9waW5nKHdkZXYpOwogCQlzcGluX3VubG9jaygmd2R0X2xvY2spOwogCX0KIAlyZXR1cm4gbGVuOwpAQCAtMTg4LDYgKzIxMyw3IEBACiBzdGF0aWMgbG9uZyBvbWFwX3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQogeworCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXY7CiAJaW50IG5ld19tYXJnaW47CiAJc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewogCQkuaWRlbnRpdHkgPSAiT01BUCBXYXRjaGRvZyIsCkBAIC0xOTUsNiArMjIxLDggQEAKIAkJLmZpcm13YXJlX3ZlcnNpb24gPSAwLAogCX07CiAKKwl3ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CiAJCXJldHVybiBjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvIF9fdXNlciAqKWFyZywgJmlkZW50LApAQCAtMjAzLDE0ICsyMzEsMTQgQEAKIAkJcmV0dXJuIHB1dF91c2VyKDAsIChpbnQgX191c2VyICopYXJnKTsKIAljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CiAJCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKLQkJCXJldHVybiBwdXRfdXNlcihvbWFwX3JlYWR3KEFSTV9TWVNTVCksCisJCQlyZXR1cm4gcHV0X3VzZXIoX19yYXdfcmVhZHcoQVJNX1NZU1NUKSwKIAkJCQkJKGludCBfX3VzZXIgKilhcmcpOwogCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCiAJCQlyZXR1cm4gcHV0X3VzZXIob21hcF9wcmNtX2dldF9yZXNldF9zb3VyY2VzKCksCiAJCQkJCShpbnQgX191c2VyICopYXJnKTsKIAljYXNlIFdESU9DX0tFRVBBTElWRToKIAkJc3Bpbl9sb2NrKCZ3ZHRfbG9jayk7Ci0JCW9tYXBfd2R0X3BpbmcoKTsKKwkJb21hcF93ZHRfcGluZyh3ZGV2KTsKIAkJc3Bpbl91bmxvY2soJndkdF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgpAQCAtMjE5LDExICsyNDcsMTEgQEAKIAkJb21hcF93ZHRfYWRqdXN0X3RpbWVvdXQobmV3X21hcmdpbik7CiAKIAkJc3Bpbl9sb2NrKCZ3ZHRfbG9jayk7Ci0JCW9tYXBfd2R0X2Rpc2FibGUoKTsKLQkJb21hcF93ZHRfc2V0X3RpbWVvdXQoKTsKLQkJb21hcF93ZHRfZW5hYmxlKCk7CisJCW9tYXBfd2R0X2Rpc2FibGUod2Rldik7CisJCW9tYXBfd2R0X3NldF90aW1lb3V0KHdkZXYpOworCQlvbWFwX3dkdF9lbmFibGUod2Rldik7CiAKLQkJb21hcF93ZHRfcGluZygpOworCQlvbWFwX3dkdF9waW5nKHdkZXYpOwogCQlzcGluX3VubG9jaygmd2R0X2xvY2spOwogCQkvKiBGYWxsICovCiAJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgpAQCAtMjQxLDk2ICsyNjksMTczIEBACiAJLnJlbGVhc2UgPSBvbWFwX3dkdF9yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG9tYXBfd2R0X21pc2NkZXYgPSB7Ci0JLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCi0JLm5hbWUgPSAid2F0Y2hkb2ciLAotCS5mb3BzID0gJm9tYXBfd2R0X2ZvcHMsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX3dkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqbWVtOworCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXY7CiAJaW50IHJldDsKIAogCS8qIHJlc2VydmUgc3RhdGljIHJlZ2lzdGVyIG1hcHBpbmdzICovCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfZ2V0X3Jlc291cmNlOworCX0KKworCWlmIChvbWFwX3dkdF9kZXYpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9idXN5OworCX0KIAogCW1lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLAogCQkJCSBwZGV2LT5uYW1lKTsKLQlpZiAobWVtID09IE5VTEwpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKCFtZW0pIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9idXN5OworCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1lbSk7CisJd2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX3dkdF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfa3phbGxvYzsKKwl9CiAKLQlvbWFwX3dkdF91c2VycyA9IDA7CisJd2Rldi0+b21hcF93ZHRfdXNlcnMgPSAwOworCXdkZXYtPm1lbSA9IG1lbTsKIAogCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlhcm13ZHRfY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJhcm13ZHRfY2siKTsKLQkJaWYgKElTX0VSUihhcm13ZHRfY2spKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGFybXdkdF9jayk7Ci0JCQlhcm13ZHRfY2sgPSBOVUxMOwotCQkJZ290byBmYWlsOworCQl3ZGV2LT5hcm13ZHRfY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJhcm13ZHRfY2siKTsKKwkJaWYgKElTX0VSUih3ZGV2LT5hcm13ZHRfY2spKSB7CisJCQlyZXQgPSBQVFJfRVJSKHdkZXYtPmFybXdkdF9jayk7CisJCQl3ZGV2LT5hcm13ZHRfY2sgPSBOVUxMOworCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQogCiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCW1wdV93ZHRfaWNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibXB1X3dkdF9pY2siKTsKLQkJaWYgKElTX0VSUihtcHVfd2R0X2ljaykpIHsKLQkJCXJldCA9IFBUUl9FUlIobXB1X3dkdF9pY2spOwotCQkJbXB1X3dkdF9pY2sgPSBOVUxMOwotCQkJZ290byBmYWlsOworCQl3ZGV2LT5tcHVfd2R0X2ljayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1wdV93ZHRfaWNrIik7CisJCWlmIChJU19FUlIod2Rldi0+bXB1X3dkdF9pY2spKSB7CisJCQlyZXQgPSBQVFJfRVJSKHdkZXYtPm1wdV93ZHRfaWNrKTsKKwkJCXdkZXYtPm1wdV93ZHRfaWNrID0gTlVMTDsKKwkJCWdvdG8gZXJyX2NsazsKIAkJfQotCQltcHVfd2R0X2ZjayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1wdV93ZHRfZmNrIik7Ci0JCWlmIChJU19FUlIobXB1X3dkdF9mY2spKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKG1wdV93ZHRfZmNrKTsKLQkJCW1wdV93ZHRfZmNrID0gTlVMTDsKLQkJCWdvdG8gZmFpbDsKKwkJd2Rldi0+bXB1X3dkdF9mY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtcHVfd2R0X2ZjayIpOworCQlpZiAoSVNfRVJSKHdkZXYtPm1wdV93ZHRfZmNrKSkgeworCQkJcmV0ID0gUFRSX0VSUih3ZGV2LT5tcHVfd2R0X2Zjayk7CisJCQl3ZGV2LT5tcHVfd2R0X2ZjayA9IE5VTEw7CisJCQlnb3RvIGVycl9jbGs7CiAJCX0KIAl9CiAKLQlvbWFwX3dkdF9kaXNhYmxlKCk7CisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCXdkZXYtPm1wdV93ZHRfaWNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAid2R0Ml9pY2siKTsKKwkJaWYgKElTX0VSUih3ZGV2LT5tcHVfd2R0X2ljaykpIHsKKwkJCXJldCA9IFBUUl9FUlIod2Rldi0+bXB1X3dkdF9pY2spOworCQkJd2Rldi0+bXB1X3dkdF9pY2sgPSBOVUxMOworCQkJZ290byBlcnJfY2xrOworCQl9CisJCXdkZXYtPm1wdV93ZHRfZmNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAid2R0Ml9mY2siKTsKKwkJaWYgKElTX0VSUih3ZGV2LT5tcHVfd2R0X2ZjaykpIHsKKwkJCXJldCA9IFBUUl9FUlIod2Rldi0+bXB1X3dkdF9mY2spOworCQkJd2Rldi0+bXB1X3dkdF9mY2sgPSBOVUxMOworCQkJZ290byBlcnJfY2xrOworCQl9CisJfQorCXdkZXYtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmICghd2Rldi0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdkZXYpOworCisJb21hcF93ZHRfZGlzYWJsZSh3ZGV2KTsKIAlvbWFwX3dkdF9hZGp1c3RfdGltZW91dCh0aW1lcl9tYXJnaW4pOwogCi0Jb21hcF93ZHRfbWlzY2Rldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm9tYXBfd2R0X21pc2NkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKKwl3ZGV2LT5vbWFwX3dkdF9taXNjZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJd2Rldi0+b21hcF93ZHRfbWlzY2Rldi5taW5vciA9IFdBVENIRE9HX01JTk9SOworCXdkZXYtPm9tYXBfd2R0X21pc2NkZXYubmFtZSA9ICJ3YXRjaGRvZyI7CisJd2Rldi0+b21hcF93ZHRfbWlzY2Rldi5mb3BzID0gJm9tYXBfd2R0X2ZvcHM7CiAKLQlwcl9pbmZvKCJPTUFQIFdhdGNoZG9nIFRpbWVyOiBpbml0aWFsIHRpbWVvdXQgJWQgc2VjXG4iLCB0aW1lcl9tYXJnaW4pOworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJih3ZGV2LT5vbWFwX3dkdF9taXNjZGV2KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWlzYzsKKworCXByX2luZm8oIk9NQVAgV2F0Y2hkb2cgVGltZXIgUmV2IDB4JTAyeDogaW5pdGlhbCB0aW1lb3V0ICVkIHNlY1xuIiwKKwkJX19yYXdfcmVhZGwod2Rldi0+YmFzZSArIE9NQVBfV0FUQ0hET0dfUkVWKSAmIDB4RkYsCisJCXRpbWVyX21hcmdpbik7CiAKIAkvKiBhdXRvZ2F0ZSBPQ1AgaW50ZXJmYWNlIGNsb2NrICovCi0Jb21hcF93cml0ZWwoMHgwMSwgT01BUF9XQVRDSERPR19TWVNfQ09ORklHKTsKKwlfX3Jhd193cml0ZWwoMHgwMSwgd2Rldi0+YmFzZSArIE9NQVBfV0FUQ0hET0dfU1lTX0NPTkZJRyk7CisKKwlvbWFwX3dkdF9kZXYgPSBwZGV2OworCiAJcmV0dXJuIDA7CiAKLWZhaWw6Ci0JaWYgKGFybXdkdF9jaykKLQkJY2xrX3B1dChhcm13ZHRfY2spOwotCWlmIChtcHVfd2R0X2ljaykKLQkJY2xrX3B1dChtcHVfd2R0X2ljayk7Ci0JaWYgKG1wdV93ZHRfZmNrKQotCQljbGtfcHV0KG1wdV93ZHRfZmNrKTsKLQlyZWxlYXNlX3Jlc291cmNlKG1lbSk7CitlcnJfbWlzYzoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpb3VubWFwKHdkZXYtPmJhc2UpOworCitlcnJfaW9yZW1hcDoKKwl3ZGV2LT5iYXNlID0gTlVMTDsKKworZXJyX2NsazoKKwlpZiAod2Rldi0+YXJtd2R0X2NrKQorCQljbGtfcHV0KHdkZXYtPmFybXdkdF9jayk7CisJaWYgKHdkZXYtPm1wdV93ZHRfaWNrKQorCQljbGtfcHV0KHdkZXYtPm1wdV93ZHRfaWNrKTsKKwlpZiAod2Rldi0+bXB1X3dkdF9mY2spCisJCWNsa19wdXQod2Rldi0+bXB1X3dkdF9mY2spOworCWtmcmVlKHdkZXYpOworCitlcnJfa3phbGxvYzoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisKK2Vycl9idXN5OgorZXJyX2dldF9yZXNvdXJjZToKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfd2R0X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jb21hcF93ZHRfZGlzYWJsZSgpOworCXN0cnVjdCBvbWFwX3dkdF9kZXYgKndkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICh3ZGV2LT5vbWFwX3dkdF91c2VycykKKwkJb21hcF93ZHRfZGlzYWJsZSh3ZGV2KTsKIH0KIAogc3RhdGljIGludCBvbWFwX3dkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCW1pc2NfZGVyZWdpc3Rlcigmb21hcF93ZHRfbWlzY2Rldik7Ci0JcmVsZWFzZV9yZXNvdXJjZShtZW0pOwotCWlmIChhcm13ZHRfY2spCi0JCWNsa19wdXQoYXJtd2R0X2NrKTsKLQlpZiAobXB1X3dkdF9pY2spCi0JCWNsa19wdXQobXB1X3dkdF9pY2spOwotCWlmIChtcHVfd2R0X2ZjaykKLQkJY2xrX3B1dChtcHVfd2R0X2Zjayk7CisJc3RydWN0IG9tYXBfd2R0X2RldiAqd2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1pc2NfZGVyZWdpc3RlcigmKHdkZXYtPm9tYXBfd2R0X21pc2NkZXYpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZiAod2Rldi0+YXJtd2R0X2NrKSB7CisJCWNsa19wdXQod2Rldi0+YXJtd2R0X2NrKTsKKwkJd2Rldi0+YXJtd2R0X2NrID0gTlVMTDsKKwl9CisKKwlpZiAod2Rldi0+bXB1X3dkdF9pY2spIHsKKwkJY2xrX3B1dCh3ZGV2LT5tcHVfd2R0X2ljayk7CisJCXdkZXYtPm1wdV93ZHRfaWNrID0gTlVMTDsKKwl9CisKKwlpZiAod2Rldi0+bXB1X3dkdF9mY2spIHsKKwkJY2xrX3B1dCh3ZGV2LT5tcHVfd2R0X2Zjayk7CisJCXdkZXYtPm1wdV93ZHRfZmNrID0gTlVMTDsKKwl9CisJaW91bm1hcCh3ZGV2LT5iYXNlKTsKKworCWtmcmVlKHdkZXYpOworCW9tYXBfd2R0X2RldiA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ0LDE3ICs0NDksMjMgQEAKIAogc3RhdGljIGludCBvbWFwX3dkdF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpZiAob21hcF93ZHRfdXNlcnMpCi0JCW9tYXBfd2R0X2Rpc2FibGUoKTsKKwlzdHJ1Y3Qgb21hcF93ZHRfZGV2ICp3ZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAod2Rldi0+b21hcF93ZHRfdXNlcnMpCisJCW9tYXBfd2R0X2Rpc2FibGUod2Rldik7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvbWFwX3dkdF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpZiAob21hcF93ZHRfdXNlcnMpIHsKLQkJb21hcF93ZHRfZW5hYmxlKCk7Ci0JCW9tYXBfd2R0X3BpbmcoKTsKKwlzdHJ1Y3Qgb21hcF93ZHRfZGV2ICp3ZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAod2Rldi0+b21hcF93ZHRfdXNlcnMpIHsKKwkJb21hcF93ZHRfZW5hYmxlKHdkZXYpOworCQlvbWFwX3dkdF9waW5nKHdkZXYpOwogCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmggYi9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmgKaW5kZXggNTJhNTMyYTUuLmZjMDJlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvb21hcF93ZHQuaAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL29tYXBfd2R0LmgKQEAgLTMwLDI1ICszMCwxNSBAQAogI2lmbmRlZiBfT01BUF9XQVRDSERPR19ICiAjZGVmaW5lIF9PTUFQX1dBVENIRE9HX0gKIAotI2RlZmluZSBPTUFQMTYxMF9XQVRDSERPR19CQVNFCQkweGZmZmViMDAwCi0jZGVmaW5lIE9NQVAyNDIwX1dBVENIRE9HX0JBU0UJCTB4NDgwMjIwMDAJLypXRFQgVGltZXIgMiAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKLSNkZWZpbmUgT01BUF9XQVRDSERPR19CQVNFIAkJT01BUDI0MjBfV0FUQ0hET0dfQkFTRQotI2Vsc2UKLSNkZWZpbmUgT01BUF9XQVRDSERPR19CQVNFIAkJT01BUDE2MTBfV0FUQ0hET0dfQkFTRQotI2RlZmluZSBSTV9SU1RTVF9XS1VQCQkJMAotI2VuZGlmCi0KLSNkZWZpbmUgT01BUF9XQVRDSERPR19SRVYJCShPTUFQX1dBVENIRE9HX0JBU0UgKyAweDAwKQotI2RlZmluZSBPTUFQX1dBVENIRE9HX1NZU19DT05GSUcJKE9NQVBfV0FUQ0hET0dfQkFTRSArIDB4MTApCi0jZGVmaW5lIE9NQVBfV0FUQ0hET0dfU1RBVFVTCQkoT01BUF9XQVRDSERPR19CQVNFICsgMHgxNCkKLSNkZWZpbmUgT01BUF9XQVRDSERPR19DTlRSTAkJKE9NQVBfV0FUQ0hET0dfQkFTRSArIDB4MjQpCi0jZGVmaW5lIE9NQVBfV0FUQ0hET0dfQ1JSCQkoT01BUF9XQVRDSERPR19CQVNFICsgMHgyOCkKLSNkZWZpbmUgT01BUF9XQVRDSERPR19MRFIJCShPTUFQX1dBVENIRE9HX0JBU0UgKyAweDJjKQotI2RlZmluZSBPTUFQX1dBVENIRE9HX1RHUgkJKE9NQVBfV0FUQ0hET0dfQkFTRSArIDB4MzApCi0jZGVmaW5lIE9NQVBfV0FUQ0hET0dfV1BTCQkoT01BUF9XQVRDSERPR19CQVNFICsgMHgzNCkKLSNkZWZpbmUgT01BUF9XQVRDSERPR19TUFIJCShPTUFQX1dBVENIRE9HX0JBU0UgKyAweDQ4KQorI2RlZmluZSBPTUFQX1dBVENIRE9HX1JFVgkJKDB4MDApCisjZGVmaW5lIE9NQVBfV0FUQ0hET0dfU1lTX0NPTkZJRwkoMHgxMCkKKyNkZWZpbmUgT01BUF9XQVRDSERPR19TVEFUVVMJCSgweDE0KQorI2RlZmluZSBPTUFQX1dBVENIRE9HX0NOVFJMCQkoMHgyNCkKKyNkZWZpbmUgT01BUF9XQVRDSERPR19DUlIJCSgweDI4KQorI2RlZmluZSBPTUFQX1dBVENIRE9HX0xEUgkJKDB4MmMpCisjZGVmaW5lIE9NQVBfV0FUQ0hET0dfVEdSCQkoMHgzMCkKKyNkZWZpbmUgT01BUF9XQVRDSERPR19XUFMJCSgweDM0KQorI2RlZmluZSBPTUFQX1dBVENIRE9HX1NQUgkJKDB4NDgpCiAKIC8qIFVzaW5nIHRoZSBwcmVzY2FsZXIsIHRoZSBPTUFQIHdhdGNoZG9nIGNvdWxkIGdvIGZvciBtYW55CiAgKiBtb250aHMgYmVmb3JlIGZpcmluZy4gIFRoZXNlIGxpbWl0cyB3b3JrIHdpdGhvdXQgc2NhbGluZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvb3Jpb241eF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvb3Jpb241eF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGEzMzlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9vcmlvbjV4X3dkdC5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogZHJpdmVycy93YXRjaGRvZy9vcmlvbjV4X3dkdC5jCisgKgorICogV2F0Y2hkb2cgZHJpdmVyIGZvciBPcmlvbjV4IHByb2Nlc3NvcnMKKyAqCisgKiBBdXRob3I6IFN5bHZlciBCcnVuZWF1IDxzeWx2ZXIuYnJ1bmVhdUBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKy8qCisgKiBXYXRjaGRvZyB0aW1lciBibG9jayByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgVElNRVJfQ1RSTAkJKFRJTUVSX1ZJUlRfQkFTRSArIDB4MDAwMCkKKyNkZWZpbmUgIFdEVF9FTgkJCTB4MDAxMAorI2RlZmluZSBXRFRfVkFMCQkJKFRJTUVSX1ZJUlRfQkFTRSArIDB4MDAyNCkKKworI2RlZmluZSBXRFRfTUFYX0RVUkFUSU9OCSgweGZmZmZmZmZmIC8gT1JJT041WF9UQ0xLKQorI2RlZmluZSBXRFRfSU5fVVNFCQkwCisjZGVmaW5lIFdEVF9PS19UT19DTE9TRQkJMQorCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CitzdGF0aWMgaW50IGhlYXJ0YmVhdCA9ICBXRFRfTUFYX0RVUkFUSU9OOwkvKiAoc2Vjb25kcykgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9zdGF0dXM7CitzdGF0aWMgc3BpbmxvY2tfdCB3ZHRfbG9jazsKKworc3RhdGljIHZvaWQgd2R0X2VuYWJsZSh2b2lkKQoreworCXUzMiByZWc7CisKKwlzcGluX2xvY2soJndkdF9sb2NrKTsKKworCS8qIFNldCB3YXRjaGRvZyBkdXJhdGlvbiAqLworCXdyaXRlbChPUklPTjVYX1RDTEsgKiBoZWFydGJlYXQsIFdEVF9WQUwpOworCisJLyogQ2xlYXIgd2F0Y2hkb2cgdGltZXIgaW50ZXJydXB0ICovCisJcmVnID0gcmVhZGwoQlJJREdFX0NBVVNFKTsKKwlyZWcgJj0gfldEVF9JTlRfUkVROworCXdyaXRlbChyZWcsIEJSSURHRV9DQVVTRSk7CisKKwkvKiBFbmFibGUgd2F0Y2hkb2cgdGltZXIgKi8KKwlyZWcgPSByZWFkbChUSU1FUl9DVFJMKTsKKwlyZWcgfD0gV0RUX0VOOworCXdyaXRlbChyZWcsIFRJTUVSX0NUUkwpOworCisJLyogRW5hYmxlIHJlc2V0IG9uIHdhdGNoZG9nICovCisJcmVnID0gcmVhZGwoQ1BVX1JFU0VUX01BU0spOworCXJlZyB8PSBXRFRfUkVTRVQ7CisJd3JpdGVsKHJlZywgQ1BVX1JFU0VUX01BU0spOworCisJc3Bpbl91bmxvY2soJndkdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2R0X2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgcmVnOworCisJc3Bpbl9sb2NrKCZ3ZHRfbG9jayk7CisKKwkvKiBEaXNhYmxlIHJlc2V0IG9uIHdhdGNoZG9nICovCisJcmVnID0gcmVhZGwoQ1BVX1JFU0VUX01BU0spOworCXJlZyAmPSB+V0RUX1JFU0VUOworCXdyaXRlbChyZWcsIENQVV9SRVNFVF9NQVNLKTsKKworCS8qIERpc2FibGUgd2F0Y2hkb2cgdGltZXIgKi8KKwlyZWcgPSByZWFkbChUSU1FUl9DVFJMKTsKKwlyZWcgJj0gfldEVF9FTjsKKwl3cml0ZWwocmVnLCBUSU1FUl9DVFJMKTsKKworCXNwaW5fdW5sb2NrKCZ3ZHRfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb3Jpb241eF93ZHRfZ2V0X3RpbWVsZWZ0KGludCAqdGltZV9sZWZ0KQoreworCXNwaW5fbG9jaygmd2R0X2xvY2spOworCSp0aW1lX2xlZnQgPSByZWFkbChXRFRfVkFMKSAvIE9SSU9ONVhfVENMSzsKKwlzcGluX3VubG9jaygmd2R0X2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW9uNXhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0RUX0lOX1VTRSwgJndkdF9zdGF0dXMpKQorCQlyZXR1cm4gLUVCVVNZOworCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKwl3ZHRfZW5hYmxlKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdCBvcmlvbjV4X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCXNldF9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisJCQl9CisJCX0KKwkJd2R0X2VuYWJsZSgpOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9NQUdJQ0NMT1NFIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkgIFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmlkZW50aXR5CT0gIk9yaW9uNXggV2F0Y2hkb2ciLAorfTsKKworCitzdGF0aWMgbG9uZyBvcmlvbjV4X3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gLUVOT1RUWTsKKwlpbnQgdGltZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCB3YXRjaGRvZ19pbmZvICopYXJnLCAmaWRlbnQsCisJCQkJICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfZW5hYmxlKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lIDw9IDAgfHwgdGltZSA+IFdEVF9NQVhfRFVSQVRJT04pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQloZWFydGJlYXQgPSB0aW1lOworCQl3ZHRfZW5hYmxlKCk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXQgPSBwdXRfdXNlcihoZWFydGJlYXQsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUVElNRUxFRlQ6CisJCWlmIChvcmlvbjV4X3dkdF9nZXRfdGltZWxlZnQoJnRpbWUpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcHV0X3VzZXIodGltZSwgKGludCAqKWFyZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9yaW9uNXhfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpKQorCQl3ZHRfZGlzYWJsZSgpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IERldmljZSBjbG9zZWQgdW5leHBlY3RlZGx5IC0gIgorCQkJCQkidGltZXIgd2lsbCBub3Qgc3RvcFxuIik7CisJY2xlYXJfYml0KFdEVF9JTl9VU0UsICZ3ZHRfc3RhdHVzKTsKKwljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvcmlvbjV4X3dkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gb3Jpb241eF93ZHRfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gb3Jpb241eF93ZHRfaW9jdGwsCisJLm9wZW4JCT0gb3Jpb241eF93ZHRfb3BlbiwKKwkucmVsZWFzZQk9IG9yaW9uNXhfd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugb3Jpb241eF93ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmb3Jpb241eF93ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW9uNXhfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJndkdF9sb2NrKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm9yaW9uNXhfd2R0X21pc2NkZXYpOworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRrKCJPcmlvbjV4IFdhdGNoZG9nIFRpbWVyOiBoZWFydGJlYXQgJWQgc2VjXG4iLAorCQkJCQkJCQloZWFydGJlYXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9yaW9uNXhfd2R0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJm9yaW9uNXhfd2R0X21pc2NkZXYpOworfQorCittb2R1bGVfaW5pdChvcmlvbjV4X3dkdF9pbml0KTsKK21vZHVsZV9leGl0KG9yaW9uNXhfd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTeWx2ZXIgQnJ1bmVhdSA8c3lsdmVyLmJydW5lYXVAZ29vZ2xlbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9yaW9uNXggUHJvY2Vzc29yIFdhdGNoZG9nIik7CisKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdCBpbiBzZWNvbmRzIChkZWZhdWx0IGlzICIKKwkJCQkJX19NT0RVTEVfU1RSSU5HKFdEVF9NQVhfRFVSQVRJT04pICIpIik7CisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9wbng0MDA4X3dkdC5jCmluZGV4IDBlZDg0MTYuLjZkOWYzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcG54NDAwOF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3BueDQwMDhfd2R0LmMKQEAgLTE3Myw4ICsxNzMsOCBAQAogCS5pZGVudGl0eSA9ICJQTlg0MDA4IFdhdGNoZG9nIiwKIH07CiAKLXN0YXRpYyBsb25nIHBueDQwMDhfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIHBueDQwMDhfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCByZXQgPSAtRU5PVFRZOwogCWludCB0aW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yYzMyNDM0X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9yYzMyNDM0X3dkdC5jCmluZGV4IDY3NTZiY2IuLmM5YzczYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmMzMjQzNF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3JjMzI0MzRfd2R0LmMKQEAgLTE4Miw4ICsxODIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJjMzI0MzRfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgcmMzMjQzNF93ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IG5ld190aW1lb3V0OwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogCS53cml0ZQkJPSByYzMyNDM0X3dkdF93cml0ZSwKLQkuaW9jdGwJCT0gcmMzMjQzNF93ZHRfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gcmMzMjQzNF93ZHRfaW9jdGwsCiAJLm9wZW4JCT0gcmMzMjQzNF93ZHRfb3BlbiwKIAkucmVsZWFzZQk9IHJjMzI0MzRfd2R0X3JlbGVhc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9yZGMzMjF4X3dkdC5jCmluZGV4IDkxMDhlZmEuLmJmOTI4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcmRjMzIxeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3JkYzMyMXhfd2R0LmMKQEAgLTE0NCw4ICsxNDQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJkYzMyMXhfd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgcmRjMzIxeF93ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJdW5zaWduZWQgaW50IHZhbHVlOwpAQCAtMjA0LDcgKzIwNCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZGMzMjF4X3dkdF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gcmRjMzIxeF93ZHRfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gcmRjMzIxeF93ZHRfaW9jdGwsCiAJLm9wZW4JCT0gcmRjMzIxeF93ZHRfb3BlbiwKIAkud3JpdGUJCT0gcmRjMzIxeF93ZHRfd3JpdGUsCiAJLnJlbGVhc2UJPSByZGMzMjF4X3dkdF9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jIGIvZHJpdmVycy93YXRjaGRvZy9yaW93ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2IxODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3Jpb3dkLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIHJpb3dkLmMgLSBkcml2ZXIgZm9yIGh3IHdhdGNoZG9nIGluc2lkZSBTdXBlciBJL08gb2YgUklPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworLyogUklPIHVzZXMgdGhlIE5hdFNlbWkgU3VwZXIgSS9PIHBvd2VyIG1hbmFnZW1lbnQgbG9naWNhbCBkZXZpY2UKKyAqIGFzIGl0cycgd2F0Y2hkb2cuCisgKgorICogV2hlbiB0aGUgd2F0Y2hkb2cgdHJpZ2dlcnMsIGl0IGFzc2VydHMgYSBsaW5lIHRvIHRoZSBCQkMgKEJvb3QgQnVzCisgKiBDb250cm9sbGVyKSBvZiB0aGUgbWFjaGluZS4gIFRoZSBCQkMgY2FuIG9ubHkgYmUgY29uZmlndXJlZCB0bworICogdHJpZ2dlciBhIHBvd2VyLW9uIHJlc2V0IHdoZW4gdGhlIHNpZ25hbCBpcyBhc3NlcnRlZC4gIFRoZSBCQkMKKyAqIGNhbiBiZSBjb25maWd1cmVkIHRvIGlnbm9yZSB0aGUgc2lnbmFsIGVudGlyZWx5IGFzIHdlbGwuCisgKgorICogVGhlIG9ubHkgU3VwZXIgSS9PIGRldmljZSByZWdpc3RlciB3ZSBjYXJlIGFib3V0IGlzIGF0IGluZGV4CisgKiAweDA1IChXRFRPX0lOREVYKSB3aGljaCBpcyB0aGUgd2F0Y2hkb2cgdGltZS1vdXQgaW4gbWludXRlcyAoMS0yNTUpLgorICogSWYgc2V0IHRvIHplcm8sIHRoaXMgZGlzYWJsZXMgdGhlIHdhdGNoZG9nLiAgV2hlbiBzZXQsIHRoZSBzeXN0ZW0KKyAqIG11c3QgcGVyaW9kaWNhbGx5IChiZWZvcmUgd2F0Y2hkb2cgZXhwaXJlcykgY2xlYXIgKHNldCB0byB6ZXJvKSBhbmQKKyAqIHJlLXNldCB0aGUgd2F0Y2hkb2cgZWxzZSBpdCB3aWxsIHRyaWdnZXIuCisgKgorICogVGhlcmUgYXJlIHR3byBvdGhlciBpbmRleGVkIHdhdGNoZG9nIHJlZ2lzdGVycyBpbnNpZGUgdGhpcyBTdXBlciBJL08KKyAqIGxvZ2ljYWwgZGV2aWNlLCBidXQgdGhleSBhcmUgdW51c2VkLiAgVGhlIGZpcnN0LCBhdCBpbmRleCAweDA2IGlzCisgKiB0aGUgd2F0Y2hkb2cgY29udHJvbCBhbmQgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGUgd2F0Y2hkb2cgdGltZXIgcmUtc2V0CisgKiB3aGVuIHRoZSBQUy8yIG1vdXNlIG9yIHNlcmlhbCBsaW5lcyBzaG93IGFjdGl2aXR5LiAgVGhlIHNlY29uZCwgYXQKKyAqIGluZGV4IDB4MDcgaXMgbWVyZWx5IGEgc2FtcGxpbmcgb2YgdGhlIGxpbmUgZnJvbSB0aGUgd2F0Y2hkb2cgdG8gdGhlCisgKiBCQkMuCisgKgorICogVGhlIHdhdGNoZG9nIGRldmljZSBnZW5lcmF0ZXMgbm8gaW50ZXJydXB0cy4KKyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIHdhdGNoZG9nIGRyaXZlciBmb3IgU3VuIFJJTyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIndhdGNoZG9nIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJInJpb3dkIgorI2RlZmluZSBQRlgJCURSSVZFUl9OQU1FICI6ICIKKworc3RydWN0IHJpb3dkIHsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHJpb3dkICpyaW93ZF9kZXZpY2U7CisKKyNkZWZpbmUgV0RUT19JTkRFWAkweDA1CisKK3N0YXRpYyBpbnQgcmlvd2RfdGltZW91dCA9IDE7CQkvKiBpbiBtaW51dGVzICovCittb2R1bGVfcGFyYW0ocmlvd2RfdGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mocmlvd2RfdGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gbWludXRlcyIpOworCitzdGF0aWMgdm9pZCByaW93ZF93cml0ZXJlZyhzdHJ1Y3Qgcmlvd2QgKnAsIHU4IHZhbCwgaW50IGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+bG9jaywgZmxhZ3MpOworCXdyaXRlYihpbmRleCwgcC0+cmVncyArIDApOworCXdyaXRlYih2YWwsIHAtPnJlZ3MgKyAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcmlvd2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwljeWNsZV9rZXJuZWxfbG9jaygpOworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJpb3dkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmlvd2RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaW5mbyA9IHsKKwkJLm9wdGlvbnMJCT0gV0RJT0ZfU0VUVElNRU9VVCwKKwkJLmZpcm13YXJlX3ZlcnNpb24JPSAxLAorCQkuaWRlbnRpdHkJCT0gRFJJVkVSX05BTUUsCisJfTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3Qgcmlvd2QgKnAgPSByaW93ZF9kZXZpY2U7CisJdW5zaWduZWQgaW50IG9wdGlvbnM7CisJaW50IG5ld19tYXJnaW47CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJaWYgKHB1dF91c2VyKDAsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJcmlvd2Rfd3JpdGVyZWcocCwgcmlvd2RfdGltZW91dCwgV0RUT19JTkRFWCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJm9wdGlvbnMsIGFyZ3AsIHNpemVvZihvcHRpb25zKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJcmlvd2Rfd3JpdGVyZWcocCwgMCwgV0RUT19JTkRFWCk7CisJCWVsc2UgaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKQorCQkJcmlvd2Rfd3JpdGVyZWcocCwgcmlvd2RfdGltZW91dCwgV0RUT19JTkRFWCk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKG5ld19tYXJnaW4gPCA2MCkgfHwgKG5ld19tYXJnaW4gPiAoMjU1ICogNjApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyaW93ZF90aW1lb3V0ID0gKG5ld19tYXJnaW4gKyA1OSkgLyA2MDsKKwkJcmlvd2Rfd3JpdGVyZWcocCwgcmlvd2RfdGltZW91dCwgV0RUT19JTkRFWCk7CisJCS8qIEZhbGwgKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHJpb3dkX3RpbWVvdXQgKiA2MCwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgcmlvd2Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCByaW93ZCAqcCA9IHJpb3dkX2RldmljZTsKKworCWlmIChjb3VudCkgeworCQlyaW93ZF93cml0ZXJlZyhwLCByaW93ZF90aW1lb3V0LCBXRFRPX0lOREVYKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJpb3dkX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CW5vX2xsc2VlaywKKwkuaW9jdGwgPQlyaW93ZF9pb2N0bCwKKwkub3BlbiA9CQlyaW93ZF9vcGVuLAorCS53cml0ZSA9CXJpb3dkX3dyaXRlLAorCS5yZWxlYXNlID0Jcmlvd2RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSByaW93ZF9taXNjZGV2ID0geworCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCT0gIndhdGNoZG9nIiwKKwkuZm9wcwk9ICZyaW93ZF9mb3BzCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCByaW93ZF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IHJpb3dkICpwOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKHJpb3dkX2RldmljZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmcC0+bG9jayk7CisKKwlwLT5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLCAyLCBEUklWRVJfTkFNRSk7CisJaWYgKCFwLT5yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZXJyID0gbWlzY19yZWdpc3Rlcigmcmlvd2RfbWlzY2Rldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgbWlzYyBkZXZpY2UuXG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSGFyZHdhcmUgd2F0Y2hkb2cgWyVpIG1pbnV0ZXNdLCAiCisJICAgICAgICJyZWdzIGF0ICVwXG4iLCByaW93ZF90aW1lb3V0LCBwLT5yZWdzKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgcCk7CisJcmlvd2RfZGV2aWNlID0gcDsKKwllcnIgPSAwOworCitvdXRfaW91bm1hcDoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIDIpOworCitvdXRfZnJlZToKKwlrZnJlZShwKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHJpb3dkX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3Qgcmlvd2QgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCisJbWlzY19kZXJlZ2lzdGVyKCZyaW93ZF9taXNjZGV2KTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHAtPnJlZ3MsIDIpOworCWtmcmVlKHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJpb3dkX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJwbWMiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcmlvd2RfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciByaW93ZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLm1hdGNoX3RhYmxlCT0gcmlvd2RfbWF0Y2gsCisJLnByb2JlCQk9IHJpb3dkX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aocmlvd2RfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJpb3dkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZyaW93ZF9kcml2ZXIsICZvZl9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByaW93ZF9leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnJpb3dkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJpb3dkX2luaXQpOworbW9kdWxlX2V4aXQocmlvd2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3c4MzY5N3VnX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93ODM2OTd1Z193ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNiNWUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2OTd1Z193ZHQuYwpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqCXc4MzY5N3VnL3VmIFdEVCBkcml2ZXIKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDggRmxlbW1pbmcgRnJhbnNlbiA8ZmZAbnJ2aXNzaW5nLm5ldD4KKyAqICAgICAgICAgICAgICByZXVzZWQgb3JpZ2luYWwgY29kZSB0byBzdXBvcHJ0IHc4MzY5N3VnL3VmLgorICoKKyAqCUJhc2VkIG9uIHc4MzYyN2hmX3dkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIGFkdmFudGVjaHdkdC5jCisgKgl3aGljaCBpcyBiYXNlZCBvbiB3ZHQuYy4KKyAqCU9yaWdpbmFsIGNvcHlyaWdodCBtZXNzYWdlczoKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDcgVmxhZCBEcnVra2VyIDx2bGFkQHN0b3Jld2l6LmNvbT4KKyAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDAzIFDDoWRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQorICoJd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkCisgKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk1ICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgV0FUQ0hET0dfTkFNRSAidzgzNjk3dWcvdWYgV0RUIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvX2xvY2spOworCitzdGF0aWMgaW50IHdkdF9pbyA9IDB4MmU7Cittb2R1bGVfcGFyYW0od2R0X2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfaW8sICJ3ODM2OTd1Zy91ZiBXRFQgaW8gcG9ydCAoZGVmYXVsdCAweDJlKSIpOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwKKwkiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzLiAxPD0gdGltZW91dCA8PTI1NSAoZGVmYXVsdD0iCisJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX1RJTUVPVVQpICIpIik7CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsCisJIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iCisJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOworCisvKgorICoJS2VybmVsIG1ldGhvZHMuCisgKi8KKworI2RlZmluZSBXRFRfRUZFUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLworI2RlZmluZSBXRFRfRUZJUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gSW5kZXggUmVnaXN0ZXIKKwkJCQkJCQkoc2FtZSBhcyBFRkVSKSAqLworI2RlZmluZSBXRFRfRUZEUiAoV0RUX0VGSVIrMSkgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRGF0YSBSZWdpc3RlciAqLworCitzdGF0aWMgdm9pZCB3ODM2OTd1Z19zZWxlY3Rfd2RfcmVnaXN0ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgY2hhciB2ZXJzaW9uOworCisJb3V0Yl9wKDB4ODcsIFdEVF9FRkVSKTsgLyogRW50ZXIgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLworCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEFnYWluIGFjY29yZGluZyB0byBtYW51YWwgKi8KKworCW91dGIoMHgyMCwgV0RUX0VGRVIpOyAJLyogY2hlY2sgY2hpcCB2ZXJzaW9uCSovCisJdmVyc2lvbiA9IGluYihXRFRfRUZEUik7CisKKwlpZiAodmVyc2lvbiA9PSAweDY4KSB7CS8qIFc4MzY5N1VHIAkJKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIGNoaXAgdmVyc2lvbiAweCUwMnggPSAiCisJCQkiVzgzNjk3VUcvVUYgZm91bmQgYXQgMHglMDR4XG4iLCB2ZXJzaW9uLCB3ZHRfaW8pOworCisJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7CisJCWMgPSBpbmJfcChXRFRfRUZEUik7ICAgIC8qIHNlbGVjdCBXRFQwICovCisJCWMgJj0gfjB4MDQ7CisJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7CisJCW91dGJfcChjLCBXRFRfRUZEUik7CS8qIHNldCBwaW4xMTggdG8gV0RUMCAqLworCisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gVzgzNjk3VUcvVUYgY291bGQgYmUgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlvdXRiX3AoMHgwNywgV0RUX0VGRVIpOyAvKiBwb2ludCB0byBsb2dpY2FsIGRldmljZSBudW1iZXIgcmVnICovCisJb3V0Yl9wKDB4MDgsIFdEVF9FRkRSKTsgLyogc2VsZWN0IGxvZ2ljYWwgZGV2aWNlIDggKEdQSU8yKSAqLworCW91dGJfcCgweDMwLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBDUjMwICovCisJYyA9IGluYl9wKFdEVF9FRkRSKTsKKwlvdXRiX3AoYyB8fCAweDAxLCBXRFRfRUZEUik7IC8qIHNldCBiaXQgMCB0byBhY3RpdmF0ZSBHUElPMiAqLworfQorCitzdGF0aWMgdm9pZCB3ODM2OTd1Z191bnNlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQoreworCW91dGJfcCgweEFBLCBXRFRfRUZFUik7IC8qIExlYXZlIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KK30KKworc3RhdGljIHZvaWQgdzgzNjk3dWdfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdDsKKworCXc4MzY5N3VnX3NlbGVjdF93ZF9yZWdpc3RlcigpOworCisJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjYgKi8KKwl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAvKiByZWFkIENSRjYgKi8KKwlpZiAodCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJXYXRjaGRvZyBhbHJlYWR5IHJ1bm5pbmcuIgorCQkJIiBSZXNldHRpbmcgdGltZW91dCB0byAlZCBzZWNcbiIsIHRpbWVvdXQpOworCQlvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjYgKi8KKwl9CisJb3V0Yl9wKDB4RjUsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjUgKi8KKwl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAvKiByZWFkIENSRjUgKi8KKwl0ICY9IH4weDBDOyAgICAgICAgICAgICAvKiBzZXQgc2Vjb25kIG1vZGUgJgorCQkJCQlkaXNhYmxlIGtleWJvYXJkIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCisJb3V0Yl9wKHQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY1ICovCisKKwl3ODM2OTd1Z191bnNlbGVjdF93ZF9yZWdpc3RlcigpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfY3RybChpbnQgdGltZW91dCkKK3sKKwlzcGluX2xvY2soJmlvX2xvY2spOworCisJdzgzNjk3dWdfc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CisKKwlvdXRiX3AoMHhGNCwgV0RUX0VGRVIpOyAgICAvKiBTZWxlY3QgQ1JGNCAqLworCW91dGJfcCh0aW1lb3V0LCBXRFRfRUZEUik7IC8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY0ICovCisKKwl3ODM2OTd1Z191bnNlbGVjdF93ZF9yZWdpc3RlcigpOworCisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCitzdGF0aWMgaW50IHdkdF9waW5nKHZvaWQpCit7CisJd2R0X2N0cmwodGltZW91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2R0X2Rpc2FibGUodm9pZCkKK3sKKwl3ZHRfY3RybCgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpZiAodCA8IDEgfHwgdCA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXdkdF9waW5nKCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGxvbmcgd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X3RpbWVvdXQ7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9CQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJCVdESU9GX01BR0lDQ0xPU0UsCisJCS5maXJtd2FyZV92ZXJzaW9uID0JMSwKKwkJLmlkZW50aXR5ID0JCSJXODM2OTdVRyBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJeworCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKworCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQl3ZHRfZGlzYWJsZSgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJd2R0X3BpbmcoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfcGluZygpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAod2R0X3NldF9oZWFydGJlYXQobmV3X3RpbWVvdXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdkdF9waW5nKCk7CisJCS8qIEZhbGwgKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKglBY3RpdmF0ZQorCSAqLworCisJd2R0X3BpbmcoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgd2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpCisJCXdkdF9kaXNhYmxlKCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYCisJCQkiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXdkdF9waW5nKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglOb3RpZmllciBmb3Igc3lzdGVtIGRvd24KKyAqLworCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCXZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQl3ZHRfZGlzYWJsZSgpOwkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0X3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IHdkdF9pb2N0bCwKKwkub3BlbgkJPSB3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHdkdF9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bworICoJdHVybiB0aGUgdGltZWJvbWIgcmVnaXN0ZXJzIG9mZi4KKyAqLworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzY5N1VHL1VGIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOworCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkJInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD0yNTUsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfVElNRU9VVCk7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbih3ZHRfaW8sIDEsIFdBVENIRE9HX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCXdkdF9pbyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXc4MzY5N3VnX2luaXQoKTsKKworCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJImNhbm5vdCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsIHJldCk7CisJCWdvdG8gdW5yZWdfcmVnaW9uczsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIHVucmVnX3JlYm9vdDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCisJCXRpbWVvdXQsIG5vd2F5b3V0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit1bnJlZ19yZWJvb3Q6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7Cit1bnJlZ19yZWdpb25zOgorCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7Cit9CisKK21vZHVsZV9pbml0KHdkdF9pbml0KTsKK21vZHVsZV9leGl0KHdkdF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRmxlbW1pbmcgRnJhbmRzZW4gPGZmQG5ydmlzc2luZy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInc4MzY5N3VnL3VmIFdEVCBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdDI4NS5jCmluZGV4IGRiMzYyYzMuLjE5MWVhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0Mjg1LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ZHQyODUuYwpAQCAtMTE1LDggKzExNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHdhdGNoZG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLAotCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQogewogCS8qCiAJICoJUmVmcmVzaCB0aGUgdGltZXIuCkBAIC0xMzMsMjEgKzEzMywyMiBAQAogfTsKIAogc3RhdGljIGxvbmcgd2F0Y2hkb2dfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bnNpZ25lZCBpbnQgbmV3X21hcmdpbjsKKwlpbnQgX191c2VyICppbnRfYXJnID0gKGludCBfX3VzZXIgKilhcmc7CiAJaW50IHJldCA9IC1FTk9UVFk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKIAkJcmV0ID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmlkZW50LCBzaXplb2YoaWRlbnQpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCiAJCQlyZXQgPSAtRUZBVUxUOwogCQlicmVhazsKIAogCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgogCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisJCXJldCA9IHB1dF91c2VyKDAsIGludF9hcmcpOwogCQlicmVhazsKIAogCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgpAQCAtMTU2LDcgKzE1Nyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgotCQlyZXQgPSBnZXRfdXNlcihuZXdfbWFyZ2luLCAoaW50ICopYXJnKTsKKwkJcmV0ID0gZ2V0X3VzZXIobmV3X21hcmdpbiwgaW50X2FyZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIApAQCAtMTcxLDcgKzE3Miw3IEBACiAJCXdhdGNoZG9nX3BpbmcoKTsKIAkJLyogRmFsbCAqLwogCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKLQkJcmV0ID0gcHV0X3VzZXIoc29mdF9tYXJnaW4sIChpbnQgKilhcmcpOworCQlyZXQgPSBwdXRfdXNlcihzb2Z0X21hcmdpbiwgaW50X2FyZyk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vTWFrZWZpbGUgYi9kcml2ZXJzL3hlbi9NYWtlZmlsZQppbmRleCAzNjMyODZjLi5kMmE4ZmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3hlbi9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIG9iai15CSs9IGdyYW50LXRhYmxlLm8gZmVhdHVyZXMubyBldmVudHMubyBtYW5hZ2Uubwogb2JqLXkJKz0geGVuYnVzLworb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCBkNDQyN2NiLi44YzgzYWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC01MywxNCArNTMsMTMgQEAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgotI2luY2x1ZGUgPHhlbi9iYWxsb29uLmg+CiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAKICNkZWZpbmUgUEFHRVMyS0IoX3ApICgoX3ApPDwoUEFHRV9TSElGVC0xMCkpCiAKLSNkZWZpbmUgQkFMTE9PTl9DTEFTU19OQU1FICJtZW1vcnkiCisjZGVmaW5lIEJBTExPT05fQ0xBU1NfTkFNRSAieGVuX21lbW9yeSIKIAogc3RydWN0IGJhbGxvb25fc3RhdHMgewogCS8qIFdlIGFpbSBmb3IgJ2N1cnJlbnQgYWxsb2NhdGlvbicgPT0gJ3RhcmdldCBhbGxvY2F0aW9uJy4gKi8KQEAgLTIyNiw5ICsyMjUsOCBAQAogCX0KIAogCXNldF94ZW5fZ3Vlc3RfaGFuZGxlKHJlc2VydmF0aW9uLmV4dGVudF9zdGFydCwgZnJhbWVfbGlzdCk7Ci0JcmVzZXJ2YXRpb24ubnJfZXh0ZW50cyAgID0gbnJfcGFnZXM7Ci0JcmMgPSBIWVBFUlZJU09SX21lbW9yeV9vcCgKLQkJWEVOTUVNX3BvcHVsYXRlX3BoeXNtYXAsICZyZXNlcnZhdGlvbik7CisJcmVzZXJ2YXRpb24ubnJfZXh0ZW50cyA9IG5yX3BhZ2VzOworCXJjID0gSFlQRVJWSVNPUl9tZW1vcnlfb3AoWEVOTUVNX3BvcHVsYXRlX3BoeXNtYXAsICZyZXNlcnZhdGlvbik7CiAJaWYgKHJjIDwgbnJfcGFnZXMpIHsKIAkJaWYgKHJjID4gMCkgewogCQkJaW50IHJldDsKQEAgLTIzNiw3ICsyMzQsNyBAQAogCQkJLyogV2UgaGl0IHRoZSBYZW4gaGFyZCBsaW1pdDogcmVwcm9iZS4gKi8KIAkJCXJlc2VydmF0aW9uLm5yX2V4dGVudHMgPSByYzsKIAkJCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9kZWNyZWFzZV9yZXNlcnZhdGlvbiwKLQkJCQkJJnJlc2VydmF0aW9uKTsKKwkJCQkJCSAgICZyZXNlcnZhdGlvbik7CiAJCQlCVUdfT04ocmV0ICE9IHJjKTsKIAkJfQogCQlpZiAocmMgPj0gMCkKQEAgLTQyMCw3ICs0MTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgcGZuOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JaWYgKCFpc19ydW5uaW5nX29uX3hlbigpKQorCWlmICgheGVuX3B2X2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXByX2luZm8oInhlbl9iYWxsb29uOiBJbml0aWFsaXNpbmcgYmFsbG9vbiBkcml2ZXIuXG4iKTsKQEAgLTQ2NCwxMzYgKzQ2MiwxMyBAQAogCiBtb2R1bGVfZXhpdChiYWxsb29uX2V4aXQpOwogCi1zdGF0aWMgdm9pZCBiYWxsb29uX3VwZGF0ZV9kcml2ZXJfYWxsb3dhbmNlKGxvbmcgZGVsdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKLQliYWxsb29uX3N0YXRzLmRyaXZlcl9wYWdlcyArPSBkZWx0YTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBkZWFsbG9jX3B0ZV9mbigKLQlwdGVfdCAqcHRlLCBzdHJ1Y3QgcGFnZSAqcG1kX3BhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIG1mbiA9IHB0ZV9tZm4oKnB0ZSk7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgeGVuX21lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbiA9IHsKLQkJLm5yX2V4dGVudHMgICA9IDEsCi0JCS5leHRlbnRfb3JkZXIgPSAwLAotCQkuZG9taWQgICAgICAgID0gRE9NSURfU0VMRgotCX07Ci0Jc2V0X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCAmbWZuKTsKLQlzZXRfcHRlX2F0KCZpbml0X21tLCBhZGRyLCBwdGUsIF9fcHRlX21hKDB1bGwpKTsKLQlzZXRfcGh5c190b19tYWNoaW5lKF9fcGEoYWRkcikgPj4gUEFHRV9TSElGVCwgSU5WQUxJRF9QMk1fRU5UUlkpOwotCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9kZWNyZWFzZV9yZXNlcnZhdGlvbiwgJnJlc2VydmF0aW9uKTsKLQlCVUdfT04ocmV0ICE9IDEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKiphbGxvY19lbXB0eV9wYWdlc19hbmRfcGFnZXZlYyhpbnQgbnJfcGFnZXMpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWRkciwgZmxhZ3M7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UsICoqcGFnZXZlYzsKLQlpbnQgaSwgcmV0OwotCi0JcGFnZXZlYyA9IGttYWxsb2Moc2l6ZW9mKHBhZ2UpICogbnJfcGFnZXMsIEdGUF9LRVJORUwpOwotCWlmIChwYWdldmVjID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKLQkJcGFnZSA9IHBhZ2V2ZWNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAocGFnZSA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0KLQkJdmFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7Ci0KLQkJc2NydWJfcGFnZShwYWdlKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGdtZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKLQkJCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0aW9uID0gewotCQkJCS5ucl9leHRlbnRzICAgPSAxLAotCQkJCS5leHRlbnRfb3JkZXIgPSAwLAotCQkJCS5kb21pZCAgICAgICAgPSBET01JRF9TRUxGCi0JCQl9OwotCQkJc2V0X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCAmZ21mbik7Ci0JCQlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fZGVjcmVhc2VfcmVzZXJ2YXRpb24sCi0JCQkJCQkgICAmcmVzZXJ2YXRpb24pOwotCQkJaWYgKHJldCA9PSAxKQotCQkJCXJldCA9IDA7IC8qIHN1Y2Nlc3MgKi8KLQkJfSBlbHNlIHsKLQkJCXJldCA9IGFwcGx5X3RvX3BhZ2VfcmFuZ2UoJmluaXRfbW0sIHZhZGRyLCBQQUdFX1NJWkUsCi0JCQkJCQkgIGRlYWxsb2NfcHRlX2ZuLCBOVUxMKTsKLQkJfQotCi0JCWlmIChyZXQgIT0gMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7Ci0JCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJdG90YWxyYW1fcGFnZXMgPSAtLWJhbGxvb25fc3RhdHMuY3VycmVudF9wYWdlczsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLSBvdXQ6Ci0Jc2NoZWR1bGVfd29yaygmYmFsbG9vbl93b3JrZXIpOwotCWZsdXNoX3RsYl9hbGwoKTsKLQlyZXR1cm4gcGFnZXZlYzsKLQotIGVycjoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKC0taSA+PSAwKQotCQliYWxsb29uX2FwcGVuZChwYWdldmVjW2ldKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKLQlrZnJlZShwYWdldmVjKTsKLQlwYWdldmVjID0gTlVMTDsKLQlnb3RvIG91dDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9lbXB0eV9wYWdlc19hbmRfcGFnZXZlYyhzdHJ1Y3QgcGFnZSAqKnBhZ2V2ZWMsIGludCBucl9wYWdlcykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JaWYgKHBhZ2V2ZWMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhbGxvb25fbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7Ci0JCUJVR19PTihwYWdlX2NvdW50KHBhZ2V2ZWNbaV0pICE9IDEpOwotCQliYWxsb29uX2FwcGVuZChwYWdldmVjW2ldKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7Ci0KLQlrZnJlZShwYWdldmVjKTsKLQotCXNjaGVkdWxlX3dvcmsoJmJhbGxvb25fd29ya2VyKTsKLX0KLQotc3RhdGljIHZvaWQgYmFsbG9vbl9yZWxlYXNlX2RyaXZlcl9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFsbG9vbl9sb2NrLCBmbGFncyk7Ci0JYmFsbG9vbl9hcHBlbmQocGFnZSk7Ci0JYmFsbG9vbl9zdGF0cy5kcml2ZXJfcGFnZXMtLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYWxsb29uX2xvY2ssIGZsYWdzKTsKLQotCXNjaGVkdWxlX3dvcmsoJmJhbGxvb25fd29ya2VyKTsKLX0KLQotCi0jZGVmaW5lIEJBTExPT05fU0hPVyhuYW1lLCBmb3JtYXQsIGFyZ3MuLi4pCQkJXAotCXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCVwKLQkJCQkgICBjaGFyICpidWYpCQkJXAotCXsJCQkJCQkJXAotCQlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdCwgIyNhcmdzKTsJCVwKLQl9CQkJCQkJCVwKKyNkZWZpbmUgQkFMTE9PTl9TSE9XKG5hbWUsIGZvcm1hdCwgYXJncy4uLikJCQkJXAorCXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCQlcCisJCQkJICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkgICBjaGFyICpidWYpCQkJCVwKKwl7CQkJCQkJCQlcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCAjI2FyZ3MpOwkJCVwKKwl9CQkJCQkJCQlcCiAJc3RhdGljIFNZU0RFVl9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQogCiBCQUxMT09OX1NIT1coY3VycmVudF9rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5jdXJyZW50X3BhZ2VzKSk7CkBAIC02MDQsNyArNDc5LDggQEAKIAkgICAgIChiYWxsb29uX3N0YXRzLmhhcmRfbGltaXQhPX4wVUwpID8gUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5oYXJkX2xpbWl0KSA6IDApOwogQkFMTE9PTl9TSE9XKGRyaXZlcl9rYiwgIiVsdVxuIiwgUEFHRVMyS0IoYmFsbG9vbl9zdGF0cy5kcml2ZXJfcGFnZXMpKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd190YXJnZXRfa2Ioc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd190YXJnZXRfa2Ioc3RydWN0IHN5c19kZXZpY2UgKmRldiwgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBQQUdFUzJLQihiYWxsb29uX3N0YXRzLnRhcmdldF9wYWdlcykpOwogfQpAQCAtNjE0LDE5ICs0OTAsMTQgQEAKIAkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50KQogewotCWNoYXIgbWVtc3RyaW5nWzY0XSwgKmVuZGNoYXI7CisJY2hhciAqZW5kY2hhcjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdGFyZ2V0X2J5dGVzOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKGNvdW50IDw9IDEpCi0JCXJldHVybiAtRUJBRE1TRzsgLyogcnVudCAqLwotCWlmIChjb3VudCA+IHNpemVvZihtZW1zdHJpbmcpKQotCQlyZXR1cm4gLUVGQklHOyAgIC8qIHRvbyBsb25nICovCi0Jc3RyY3B5KG1lbXN0cmluZywgYnVmKTsKKwl0YXJnZXRfYnl0ZXMgPSBtZW1wYXJzZShidWYsICZlbmRjaGFyKTsKIAotCXRhcmdldF9ieXRlcyA9IG1lbXBhcnNlKG1lbXN0cmluZywgJmVuZGNoYXIpOwogCWJhbGxvb25fc2V0X25ld190YXJnZXQodGFyZ2V0X2J5dGVzID4+IFBBR0VfU0hJRlQpOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtNjk0LDIwICs1NjUsNCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9iYWxsb29uKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCi17Ci0JaW50IGk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c2Rldi0+a29iaiwgJmJhbGxvb25faW5mb19ncm91cCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmFsbG9vbl9hdHRycyk7IGkrKykKLQkJc3lzZGV2X3JlbW92ZV9maWxlKHN5c2RldiwgYmFsbG9vbl9hdHRyc1tpXSk7Ci0Jc3lzZGV2X3VucmVnaXN0ZXIoc3lzZGV2KTsKLQlzeXNkZXZfY2xhc3NfdW5yZWdpc3RlcigmYmFsbG9vbl9zeXNkZXZfY2xhc3MpOwotfQotCi1zdGF0aWMgdm9pZCBiYWxsb29uX3N5c2ZzX2V4aXQodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2JhbGxvb24oJmJhbGxvb25fc3lzZGV2KTsKLX0KLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vY3B1X2hvdHBsdWcuYyBiL2RyaXZlcnMveGVuL2NwdV9ob3RwbHVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MjgwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi9jcHVfaG90cGx1Zy5jCkBAIC0wLDAgKzEsOTAgQEAKKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorCisjaW5jbHVkZSA8YXNtLXg4Ni94ZW4vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KKworc3RhdGljIHZvaWQgZW5hYmxlX2hvdHBsdWdfY3B1KGludCBjcHUpCit7CisJaWYgKCFjcHVfcHJlc2VudChjcHUpKQorCQlhcmNoX3JlZ2lzdGVyX2NwdShjcHUpOworCisJY3B1X3NldChjcHUsIGNwdV9wcmVzZW50X21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfaG90cGx1Z19jcHUoaW50IGNwdSkKK3sKKwlpZiAoY3B1X3ByZXNlbnQoY3B1KSkKKwkJYXJjaF91bnJlZ2lzdGVyX2NwdShjcHUpOworCisJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKK30KKworc3RhdGljIHZvaWQgdmNwdV9ob3RwbHVnKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGVycjsKKwljaGFyIGRpclszMl0sIHN0YXRlWzMyXTsKKworCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCisJCXJldHVybjsKKworCXNwcmludGYoZGlyLCAiY3B1LyV1IiwgY3B1KTsKKwllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgZGlyLCAiYXZhaWxhYmlsaXR5IiwgIiVzIiwgc3RhdGUpOworCWlmIChlcnIgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIlhFTkJVUzogVW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJjbXAoc3RhdGUsICJvbmxpbmUiKSA9PSAwKSB7CisJCWVuYWJsZV9ob3RwbHVnX2NwdShjcHUpOworCX0gZWxzZSBpZiAoc3RyY21wKHN0YXRlLCAib2ZmbGluZSIpID09IDApIHsKKwkJKHZvaWQpY3B1X2Rvd24oY3B1KTsKKwkJZGlzYWJsZV9ob3RwbHVnX2NwdShjcHUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiWEVOQlVTOiB1bmtub3duIHN0YXRlKCVzKSBvbiBDUFUlZFxuIiwKKwkJICAgICAgIHN0YXRlLCBjcHUpOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3ZjcHVfaG90cGx1Z19ldmVudChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKKwkJCQkJY29uc3QgY2hhciAqKnZlYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWNoYXIgKmNwdXN0cjsKKwljb25zdCBjaGFyICpub2RlID0gdmVjW1hTX1dBVENIX1BBVEhdOworCisJY3B1c3RyID0gc3Ryc3RyKG5vZGUsICJjcHUvIik7CisJaWYgKGNwdXN0ciAhPSBOVUxMKSB7CisJCXNzY2FuZihjcHVzdHIsICJjcHUvJXUiLCAmY3B1KTsKKwkJdmNwdV9ob3RwbHVnKGNwdSk7CisJfQorfQorCitzdGF0aWMgaW50IHNldHVwX2NwdV93YXRjaGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBzdHJ1Y3QgeGVuYnVzX3dhdGNoIGNwdV93YXRjaCA9IHsKKwkJLm5vZGUgPSAiY3B1IiwKKwkJLmNhbGxiYWNrID0gaGFuZGxlX3ZjcHVfaG90cGx1Z19ldmVudH07CisKKwkodm9pZClyZWdpc3Rlcl94ZW5idXNfd2F0Y2goJmNwdV93YXRjaCk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3ZjcHVfaG90cGx1Z19ldmVudCh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgeHNuX2NwdSA9IHsKKwkJLm5vdGlmaWVyX2NhbGwgPSBzZXR1cF9jcHVfd2F0Y2hlciB9OworCisJaWYgKCF4ZW5fcHZfZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmVnaXN0ZXJfeGVuc3RvcmVfbm90aWZpZXIoJnhzbl9jcHUpOworCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoc2V0dXBfdmNwdV9ob3RwbHVnX2V2ZW50KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCAwZTBjMjg1Li5jMzI5MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtODQsMTcgKzg0LDYgQEAKIC8qIFhlbiB3aWxsIG5ldmVyIGFsbG9jYXRlIHBvcnQgemVybyBmb3IgYW55IHB1cnBvc2UuICovCiAjZGVmaW5lIFZBTElEX0VWVENITihjaG4pCSgoY2huKSAhPSAwKQogCi0vKgotICogRm9yY2UgYSBwcm9wZXIgZXZlbnQtY2hhbm5lbCBjYWxsYmFjayBmcm9tIFhlbiBhZnRlciBjbGVhcmluZyB0aGUKLSAqIGNhbGxiYWNrIG1hc2suIFdlIGRvIHRoaXMgaW4gYSB2ZXJ5IHNpbXBsZSBtYW5uZXIsIGJ5IG1ha2luZyBhIGNhbGwKLSAqIGRvd24gaW50byBYZW4uIFRoZSBwZW5kaW5nIGZsYWcgd2lsbCBiZSBjaGVja2VkIGJ5IFhlbiBvbiByZXR1cm4uCi0gKi8KLXZvaWQgZm9yY2VfZXZ0Y2huX2NhbGxiYWNrKHZvaWQpCi17Ci0JKHZvaWQpSFlQRVJWSVNPUl94ZW5fdmVyc2lvbigwLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZvcmNlX2V2dGNobl9jYWxsYmFjayk7Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGVuX2R5bmFtaWNfY2hpcDsKIAogLyogQ29uc3RydWN0b3IgZm9yIHBhY2tlZCBJUlEgaW5mb3JtYXRpb24uICovCkBAIC0xNzUsNiArMTY0LDEyIEBACiAJc3luY19zZXRfYml0KHBvcnQsICZzLT5ldnRjaG5fcGVuZGluZ1swXSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfZXZ0Y2huKGludCBwb3J0KQoreworCXN0cnVjdCBzaGFyZWRfaW5mbyAqcyA9IEhZUEVSVklTT1Jfc2hhcmVkX2luZm87CisJcmV0dXJuIHN5bmNfdGVzdF9iaXQocG9ydCwgJnMtPmV2dGNobl9wZW5kaW5nWzBdKTsKK30KKwogCiAvKioKICAqIG5vdGlmeV9yZW1vdGVfdmlhX2lycSAtIHNlbmQgZXZlbnQgdG8gcmVtb3RlIGVuZCBvZiBldmVudCBjaGFubmVsIHZpYSBpcnEKQEAgLTM2NSw2ICszNjAsMTAgQEAKIAkJCXBlcl9jcHUodmlycV90b19pcnEsIGNwdV9mcm9tX2V2dGNobihldnRjaG4pKQogCQkJCVtpbmRleF9mcm9tX2lycShpcnEpXSA9IC0xOwogCQkJYnJlYWs7CisJCWNhc2UgSVJRVF9JUEk6CisJCQlwZXJfY3B1KGlwaV90b19pcnEsIGNwdV9mcm9tX2V2dGNobihldnRjaG4pKQorCQkJCVtpbmRleF9mcm9tX2lycShpcnEpXSA9IC0xOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtNzQzLDYgKzc0MiwyNSBAQAogCQljbGVhcl9ldnRjaG4oZXZ0Y2huKTsKIH0KIAordm9pZCB4ZW5fc2V0X2lycV9wZW5kaW5nKGludCBpcnEpCit7CisJaW50IGV2dGNobiA9IGV2dGNobl9mcm9tX2lycShpcnEpOworCisJaWYgKFZBTElEX0VWVENITihldnRjaG4pKQorCQlzZXRfZXZ0Y2huKGV2dGNobik7Cit9CisKK2Jvb2wgeGVuX3Rlc3RfaXJxX3BlbmRpbmcoaW50IGlycSkKK3sKKwlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGlycSk7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCWlmIChWQUxJRF9FVlRDSE4oZXZ0Y2huKSkKKwkJcmV0ID0gdGVzdF9ldnRjaG4oZXZ0Y2huKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIFBvbGwgd2FpdGluZyBmb3IgYW4gaXJxIHRvIGJlY29tZSBwZW5kaW5nLiAgSW4gdGhlIHVzdWFsIGNhc2UsIHRoZQogICAgaXJxIHdpbGwgYmUgZGlzYWJsZWQgc28gaXQgd29uJ3QgZGVsaXZlciBhbiBpbnRlcnJ1cHQuICovCiB2b2lkIHhlbl9wb2xsX2lycShpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggZTllMTExNi4uMDY1OTJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC01MDgsNyArNTA4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWF4X25yX2dsaXN0X2ZyYW1lcywgbnJfZ2xpc3RfZnJhbWVzOwogCXVuc2lnbmVkIGludCBucl9pbml0X2dyZWZzOwogCi0JaWYgKCFpc19ydW5uaW5nX29uX3hlbigpKQorCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCW5yX2dyYW50X2ZyYW1lcyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggNTdjZWI1My4uN2YyNGE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtODE0LDcgKzgxNCw3IEBACiAJRFBSSU5USygiIik7CiAKIAllcnIgPSAtRU5PREVWOwotCWlmICghaXNfcnVubmluZ19vbl94ZW4oKSkKKwlpZiAoIXhlbl9kb21haW4oKSkKIAkJZ290byBvdXRfZXJyb3I7CiAKIAkvKiBSZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCB0aGUga2VybmVsIGJ1cyBzdWJzeXN0ZW0gKi8KQEAgLTgyOSw3ICs4MjksNyBAQAogCS8qCiAJICogRG9tYWluMCBkb2Vzbid0IGhhdmUgYSBzdG9yZV9ldnRjaG4gb3Igc3RvcmVfbWZuIHlldC4KIAkgKi8KLQlpZiAoaXNfaW5pdGlhbF94ZW5kb21haW4oKSkgeworCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkgewogCQkvKiBkb20wIG5vdCB5ZXQgc3VwcG9ydGVkICovCiAJfSBlbHNlIHsKIAkJeGVuc3RvcmVkX3JlYWR5ID0gMTsKQEAgLTg0Niw3ICs4NDYsNyBAQAogCQlnb3RvIG91dF91bnJlZ19iYWNrOwogCX0KIAotCWlmICghaXNfaW5pdGlhbF94ZW5kb21haW4oKSkKKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQogCQl4ZW5idXNfcHJvYmUoTlVMTCk7CiAKIAlyZXR1cm4gMDsKQEAgLTkzNyw3ICs5MzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAxMCpIWjsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0geGVuZHJ2ID8gJnhlbmRydi0+ZHJpdmVyIDogTlVMTDsKIAotCWlmICghcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlcyB8fCAhaXNfcnVubmluZ19vbl94ZW4oKSkKKwlpZiAoIXJlYWR5X3RvX3dhaXRfZm9yX2RldmljZXMgfHwgIXhlbl9kb21haW4oKSkKIAkJcmV0dXJuOwogCiAJd2hpbGUgKGV4aXN0c19kaXNjb25uZWN0ZWRfZGV2aWNlKGRydikpIHsKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL01ha2VmaWxlIGIvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggZGE3NWE2Zi4uY2E4Y2QzMCAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDcgQEAKIAogZnctc2hpcHBlZC0kKENPTkZJR19BVEFSSV9EU1A1NkspICs9IGRzcDU2ay9ib290c3RyYXAuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX0FUTV9BTUJBU1NBRE9SKSArPSBhdG1zYXIxMS5mdworZnctc2hpcHBlZC0kKENPTkZJR19DQVNTSU5JKSArPSBzdW4vY2Fzc2luaS5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfQ09NUFVUT05FKSArPSBpbnRlbGxpcG9ydDIuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX0RWQl9UVFVTQl9CVURHRVQpICs9IHR0dXNiLWJ1ZGdldC9kc3Bib290Y29kZS5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfU01DVFIpICs9IHRyX3NtY3RyLmJpbgpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvV0hFTkNFIGIvZmlybXdhcmUvV0hFTkNFCmluZGV4IDY2YzUxYjIuLjU3MDAyY2QgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL1dIRU5DRQorKysgYi9maXJtd2FyZS9XSEVOQ0UKQEAgLTMzOSwzICszMzksMTMgQEAKIEZvdW5kIGluIGhleCBmb3JtIGluIGtlcm5lbCBzb3VyY2UuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RyaXZlcjogQ0FTU0lOSSAtIFN1biBDYXNzaW5pCisKK0ZpbGU6IHN1bi9jYXNzaW5pLmJpbgorCitMaWNlbmNlOiBVbmtub3duCisKK0ZvdW5kIGluIGhleCBmb3JtIGluIGtlcm5lbCBzb3VyY2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9maXJtd2FyZS9zdW4vY2Fzc2luaS5iaW4uaWhleCBiL2Zpcm13YXJlL3N1bi9jYXNzaW5pLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9zdW4vY2Fzc2luaS5iaW4uaWhleApAQCAtMCwwICsxLDE0MyBAQAorOjEwMDAwMDAwMDA4MjdFODIwOTAwMDAwMDAwMDAwMDhFOEVGRkNFODJGQQorOjEwMDAxMDAwMjVGRjAxMEZDRTg0MjZGRjAxMTFDRTg1M0RERkU1ODY0OQorOjEwMDAyMDAwMzlCNzhGRjg3RUMzQzI5NjQ3ODRGMzhBMDA5NzQ3Q0VDQworOjEwMDAzMDAwODIzM0ZGMDEwRjk2NDY4NDBDODEwNDI3MEI5NjQ2ODQ3OQorOjEwMDA0MDAwMEM4MTA4Mjc1NzdFODQyNTk2NDc4NEYzOEEwNDk3NDdCNgorOjEwMDA1MDAwQ0U4MjU0RkYwMTBGOTY0Njg0MEM4MTA0MjYzOEI2MTJENgorOjEwMDA2MDAwMjA4NDIwMjYwMzdFODQyNTk2N0JENjdDRkU4RjU2QkQ3OQorOjEwMDA3MDAwRjdCNkZFOEY0RUJERUM4RUJERkFGN0JERjcyOENFODJFNworOjEwMDA4MDAwODJGRjAxMEY5NjQ2ODQwQzgxMDQyNjBBQjYxMjIwODQ1MgorOjEwMDA5MDAwMjAyN0I1N0U4NDI1QkRGNzFGN0U4NDFGOTY0Nzg0RjNGNQorOjEwMDBBMDAwOEEwODk3NDdERUUxQUQwMENFODJBRkZGMDEwRjdFODQ2NAorOjEwMDBCMDAwMjU5NjQxODUxMDI2MDY5NjIzODU0MDI3MDZCREVEMDAyRQorOjEwMDBDMDAwN0U4M0EyREU0MkJERUI4RTk2MjQ4NDA4MjcwMzdFODNDNgorOjEwMDBEMDAwREY5NjdCRDY3Q0ZFOEY1NkJERjdCNkZFOEY1MEJERUMwQgorOjEwMDBFMDAwOEVCREZBRjc4NjExQzY0OUJERTQxMkNFODJFRkZGMDEzQworOjEwMDBGMDAwMEY5NjQ2ODQwQzgxMDAyNzE3QzY0OUJERTQ5MTI0MEQ1NAorOjEwMDEwMDAwQjYxMjIwODUyMDI2MENDRTgyQzFGRjAxMEY3RTg0MjVFOQorOjEwMDExMDAwN0U4NDE2RkU4RjUyQkRFQzhFQkRGQUY3ODY2QUM2NDkwNAorOjEwMDEyMDAwQkRFNDEyQ0U4MzI3RkYwMTBGOTY0Njg0MEM4MTAwMjc4MQorOjEwMDEzMDAwMEFDNjQ5QkRFNDkxMjUwNjdFODQyNTdFODQxNkI2MTgzQworOjEwMDE0MDAwNzBCQjE5NzAyQTA0ODFBRjJFMTk5NjdCRjYyMDA3RkEyRQorOjEwMDE1MDAwMjAyN0M0Mzg4MTM4MjcwQkY2MjAwN0ZBMjAyN0NCMDg0MAorOjEwMDE2MDAwN0U4MkQzQkRGNzY2ODY3NEM2NDlCREU0MTJDRTgzNzEyNAorOjEwMDE3MDAwRkYwMTBGOTY0Njg0MEM4MTA4MjYwQUM2NDlCREU0OTEwQQorOjEwMDE4MDAwMjUwNjdFODQyNTdFODQxNkJERjczRTI2MEVCREU1MDkzNAorOjEwMDE5MDAwMjYwNkNFODJDMUZGMDEwRjdFODQyNUZFOEY1NEJERUM2MgorOjEwMDFBMDAwOEVCREZBRjdCREY3MzM4NjBGQzY1MUJERTQxMkNFODM3QworOjEwMDFCMDAwQjJGRjAxMEY5NjQ2ODQwQzgxMDgyNjVDQjYxMjIwODQ5QgorOjEwMDFDMDAwM0Y4MTNBMjcxQzk2MjM4NTQwMjcwMzdFODQyNUM2NTEwQworOjEwMDFEMDAwQkRFNDkxMjUwMzdFODQyNUNFODJDMUZGMDEwRjdFODQ3QworOjEwMDFFMDAwMjVCREY4Mzc3QzAwN0FDRTgzRUVGRjAxMEY3RTg0MjU5MworOjEwMDFGMDAwOTY0Njg0MEM4MTA4MjYyMDk2MjQ4NDA4MjYyOUI2MTg2MQorOjEwMDIwMDAwODJCQjE5ODJCMTAxM0IyMjA5QjYxMjIwODQzNzgxMzJBOAorOjEwMDIxMDAwMjcxNUJERjg0NDdFODJDMUJERjcxRkJERjg0NEJERkM2MworOjEwMDIyMDAwMjlDRTgyMjVGRjAxMEYzOTk2NDc4NEZDOEEwMDk3NDcyMworOjEwMDIzMDAwQ0U4NDM0RkYwMTExOTY0Njg0MDM4MTAyMjcwMzdFODUxNAorOjEwMDI0MDAwMUU5NjQ3ODRGQzhBMDI5NzQ3REVFMUFEMDA4NjAxQjcxRgorOjEwMDI1MDAwMTI1MUJERjcxNEI2MTAzMTg0RkRCNzEwMzFCREY4MUUzMAorOjEwMDI2MDAwOTY4MUQ2ODJGRThGNUFCREY3QjZGRThGNUNCREVDOEVBRQorOjEwMDI3MDAwQkRGQUY3ODYwOEQ2MDBDNTEwMjYwMjhCMjBDNjUxQkRGMAorOjEwMDI4MDAwRTQxMkNFODQ4NkZGMDExMTk2NDY4NDAzODEwMjI3MDM3RgorOjEwMDI5MDAwN0U4NTBGQzY1MUJERTQ5MTI1MDM3RTg1MUU5NjQ0ODU1QgorOjEwMDJBMDAwMTAyNjBBQjYxMjUwQkEwMTNDODUxMDI3QThCREY3NjY4MQorOjEwMDJCMDAwQ0U4NEI3RkYwMTExN0U4NTFFOTY0Njg0MDM4MTAyMjZGNworOjEwMDJDMDAwNTBCNjEyMzA4NDAzODEwMTI3MDM3RTg1MUU5NjQ0ODUzMworOjEwMDJEMDAwMTAyNjEzQjYxMjUwQkEwMTNDODUxMDI2MDlDRTg0NTM1RAorOjEwMDJFMDAwRkYwMTExN0U4NTFFQjYxMDMxOEEwMkI3MTAzMUJEODUxRgorOjEwMDJGMDAwMUZCREY4Mzc3QzAwODBDRTg0RkVGRjAxMTE3RTg1MUU3NQorOjEwMDMwMDAwOTY0Njg0MDM4MTAyMjYwOUI2MTIzMDg0MDM4MTAxMjdCMAorOjEwMDMxMDAwMEZCREY4NDRCREY3MEJCREZDMjlDRTg0MjZGRjAxMTFBQgorOjEwMDMyMDAwMzlENjIyQzQwRkI2MTIzMEJBMTIzMjg0MDQyNzBEOTY4MQorOjEwMDMzMDAwMjI4NTA0MjcwNUNBMTA3RTg1M0FDQTIwRDcyMjM5ODYyRAorOjEwMDM0MDAwMDA5NzgzMThDRTFDMDBCREVCNDY5NjU3ODUwMTI3MDIwNworOjEwMDM1MDAwNEYzOTg1MDIyNzAxMzk3RjhGN0Q4NjA0QjcxMjA0ODZDNQorOjEwMDM2MDAwMDhCNzEyMDc4NjEwQjcxMjBDODYwN0I3MTIwNkI2OEZBOQorOjEwMDM3MDAwN0RCNzEyNzA4NjAxQkExMjA0QjcxMjA0MDEwMTAxMDE5RgorOjEwMDM4MDAwMDEwMUI2MTIwNDg0RkU4QTAyQjcxMjA0MDEwMTAxMDFDMAorOjEwMDM5MDAwMDEwMTg2RkRCNDEyMDRCNzEyMDRCNjEyMDA4NDA4ODE2QworOjEwMDNBMDAwMDgyNzE2QjY4RjdEODEwQzI3MDg4QjA0Qjc4RjdEN0VCQQorOjEwMDNCMDAwODU2Qzg2MDM5NzQwN0U4OTZFODYwN0I3MTIwNjVGRjdDNQorOjEwMDNDMDAwOEY4MjVGRjc4RjdGRjc4RjcwRjc4RjcxRjc4RjcyRjdEQworOjEwMDNEMDAwOEY3M0Y3OEY3NEY3OEY3NUY3OEY3NkY3OEY3N0Y3OEZBNworOjEwMDNFMDAwNzhGNzhGNzlGNzhGN0FGNzhGN0JCNjEyMDQ4QTEwQjc3OAorOjEwMDNGMDAwMTIwNDg2RTRCNzEyNzBCNzEyMDdGNzEyMDVGNzEyMDk1NAorOjEwMDQwMDAwODYwOEJBMTIwNEI3MTIwNDg2RjdCNDEyMDRCNzEyMDRBRAorOjEwMDQxMDAwMDEwMTAxMDEwMTAxQjYxMjA4Mjc3RjgxODAyNjBCODZBOAorOjEwMDQyMDAwMDhDRThGNzlCRDg5N0I3RTg2OEU4MTQwMjYwQjg2MDQxRgorOjEwMDQzMDAwQ0U4Rjc2QkQ4OTdCN0U4NjhFODEyMDI2MEI4NjAyQ0U2RQorOjEwMDQ0MDAwOEY3M0JEODk3QjdFODY4RTgxMTAyNjBCODYwMUNFOEZCMQorOjEwMDQ1MDAwNzBCRDg5N0I3RTg2OEU4MTA4MjYwQjg2MDhDRThGNzlCQgorOjEwMDQ2MDAwQkQ4OTdGN0U4NjhFODEwNDI2MEI4NjA0Q0U4Rjc2QkQ2NQorOjEwMDQ3MDAwODk3RjdFODY4RTgxMDIyNjBCOEEwMkNFOEY3M0JEODk4QworOjEwMDQ4MDAwN0Y3RTg2OEU4MTAxMjYwODg2MDFDRThGNzBCRDg5N0Y5MgorOjEwMDQ5MDAwQjY4RjdGODEwRjI2MDM3RTg3NDdCNjEyMDk4NDAzODFCQQorOjEwMDRBMDAwMDMyNzA2N0MxMjA5N0U4NUZFQjYxMjA2ODQwNzgxMDdBMworOjEwMDRCMDAwMjcwODhCMDFCNzEyMDY3RTg2RDVCNjhGODIyNjBBN0M2NgorOjEwMDRDMDAwOEY4MjRGQjcxMjA2N0U4NUMwQjYxMjA2ODQzRjgxM0ZFOQorOjEwMDREMDAwMjcxMDhCMDhCNzEyMDZCNjEyMDk4NEZDQjcxMjA5N0VFMgorOjEwMDRFMDAwODVGRUNFOEY3MDE4Q0U4Rjg0QzYwQ0JEODk2RkNFOEZERgorOjEwMDRGMDAwODQxOENFOEY3MEM2MENCRDg5NkZENjgzQzE0RjJEMDM3MworOjEwMDUwMDAwN0U4NzQwQjY4RjdGODEwNzI3MEY4MTBCMjcxNTgxMERDRQorOjEwMDUxMDAwMjcxQjgxMEUyNzIxN0U4NzQwRjc4RjdCODYwMkI3OEZBRQorOjEwMDUyMDAwN0EyMDFDRjc4Rjc4ODYwMkI3OEY3NzIwMTJGNzhGNzVBNQorOjEwMDUzMDAwODYwMkI3OEY3NDIwMDhGNzhGNzI4NjAyQjc4RjcxN0U5QworOjEwMDU0MDAwODc0Nzg2MDQ5NzQwN0U4OTZFQ0U4RjcyQkQ4OUY3Q0UyRAorOjEwMDU1MDAwOEY3NUJEODlGN0NFOEY3OEJEODlGN0NFOEY3QkJEODkyQQorOjEwMDU2MDAwRjc0RkI3OEY3REI3OEY4MUI2OEY3MjI3NDc3QzhGN0QwRQorOjEwMDU3MDAwQjY4Rjc1MjczRjdDOEY3REI2OEY3ODI3Mzc3QzhGN0QzMAorOjEwMDU4MDAwQjY4RjdCMjcyRjdGOEY3RDdDOEY4MTdBOEY3MjI3MUI4MQorOjEwMDU5MDAwN0M4RjdEN0E4Rjc1MjcxNjdDOEY3RDdBOEY3ODI3MTFENworOjEwMDVBMDAwN0M4RjdEN0E4RjdCMjcwQzdFODc4MzdBOEY3NTdBOEZGRAorOjEwMDVCMDAwNzg3QThGN0JDRUMxRkNGNjhGN0QzQUE2MDBCNzEyNzA5OQorOjEwMDVDMDAwQjY4RjcyMjYwMzdFODdGQUI2OEY3NTI2MEExOENFOEZFRAorOjEwMDVEMDAwNzNCRDg5RDU3RTg3RkFCNjhGNzgyNjBBMThDRThGNzZCNgorOjEwMDVFMDAwQkQ4OUQ1N0U4N0ZBQjY4RjdCMjYwQTE4Q0U4Rjc5QkQ1NgorOjEwMDVGMDAwODlENTdFODdGQTg2MDU5NzQwN0U4OTAwQjY4Rjc1ODFGQQorOjEwMDYwMDAwMDcyRUYyRjYxMjA2QzRGODFCQjcxMjA2QjY4Rjc4ODFEMQorOjEwMDYxMDAwMDcyRUUyNDg0ODQ4RjYxMjA2QzRDNzFCQjcxMjA2QjZCMgorOjEwMDYyMDAwOEY3QjgxMDcyRUNGRjYxMjA1QzRGODFCQjcxMjA1ODYwMworOjEwMDYzMDAwMDBGNjhGNzFCRDg5OTQ4NjAxRjY4Rjc0QkQ4OTk0ODYwQQorOjEwMDY0MDAwMDJGNjhGNzdCRDg5OTQ4NjAzRjY4RjdBQkQ4OTk0Q0VBMgorOjEwMDY1MDAwOEY3MEE2MDE4MTAxMjcwNzgxMDMyNzAzN0U4ODY2QTY4NAorOjEwMDY2MDAwMDBCODhGODE4NDAxMjYwQjhDOEY3OTJDMEUwODA4MDgyNgorOjEwMDY3MDAwN0U4ODUwQjYxMjA0OEE0MEI3MTIwNEI2MTIwNDg0RkI3NgorOjEwMDY4MDAwODRFRkI3MTIwNEI2MTIwNzM2QjY4RjdDNDg0OEI3MTIwQgorOjEwMDY5MDAwMDc4NjAxQkExMjA0QjcxMjA0MDEwMTAxMDEwMTAxODZBMworOjEwMDZBMDAwRkVCNDEyMDRCNzEyMDQ4NjAyQkExMjA0QjcxMjA0ODYwQQorOjEwMDZCMDAwRkRCNDEyMDRCNzEyMDQzMkI3MTIwN0I2MTIwMDg0MDg1MAorOjEwMDZDMDAwODEwODI3MEY3QzgyMDgyNjA3ODY3Njk3NDA3RTg5NkVGMAorOjEwMDZEMDAwN0U4NkVDQjY4RjdGODEwRjI3M0NCREU2QzdCNzEyMEQzMworOjEwMDZFMDAwQkRFNkNCQjYxMjA0OEEyMEI3MTIwNENFRkZGRkI2MTJDNQorOjEwMDZGMDAwMDA4MTBDMjYwNTA5MjZGNjI3MUNCNjEyMDQ4NERGQjdGNAorOjEwMDcwMDAwMTIwNDk2ODM4MTA3MkMwNTdDMDA4MzIwMDY5NjgzOEIzOAorOjEwMDcxMDAwMDg5NzgzN0U4NTQxN0Y4RjdFODY4MEI3MTIwQzg2MDE4NQorOjEwMDcyMDAwQjc4RjdEQjYxMjBDODQ3RkI3MTIwQzhBODBCNzEyMEM3QgorOjEwMDczMDAwODYwQUJEOEEwNkI2MTIwQTJBMDlCNjEyMENCQThGN0QzRAorOjEwMDc0MDAwQjcxMjBDQjY4RjdFODE2MDI3MUE4QjIwQjc4RjdFQjZDQQorOjEwMDc1MDAwMTIwQzg0OUZCQThGN0VCNzEyMENCNjhGN0Q0OEI3OEY2QworOjEwMDc2MDAwN0Q3RTg5MjFCNjEyMDQ4QTIwQjcxMjA0QkQ4QTBBNEYwMQorOjEwMDc3MDAwMzlBNjAwMThBNzAwMDgxODA4NUEyNkY1MzkzNjZDMDA2MworOjEwMDc4MDAwMzJCQThGN0ZCNzhGN0ZCNjEyMDk4NDAzQTcwMUI2MTJFMgorOjEwMDc5MDAwMDY4NDNGQTcwMjM5MzY4NjAzQjc4RjgwMzJDMTAwMjYxMAorOjEwMDdBMDAwMDZCNzhGN0M3RTg5QzlDMTAxMjcxOEMxMDIyNzBDQzFGOQorOjEwMDdCMDAwMDMyNzAwRjY4RjgwMDUwNUY3OEY4MEY2OEY4MDA1MDVFQgorOjEwMDdDMDAwRjc4RjgwRjY4RjgwMDUwNUY3OEY4MEY2OEY4MDUzRjRDMgorOjEwMDdEMDAwMTIwNzFCQjcxMjA3MzlDRThGNzBBNjAwMThFNjAwMTg1MworOjEwMDdFMDAwQTcwMEU3MDBBNjAxMThFNjAxMThBNzAxRTcwMUE2MDI4NQorOjEwMDdGMDAwMThFNjAyMThBNzAyRTcwMjM5QTYwMDg0MDdFNjAwQzQzQgorOjEwMDgwMDAwMzg1NDU0NTQxQkE3MDAzOTRBMjZGRDM5OTYyMjg0MEZDOAorOjEwMDgxMDAwOTcyMjg2MDFCNzhGNzBCNjEyMDdCNzhGNzFGNjEyMEM0OAorOjEwMDgyMDAwQzQwRkM4MEZGNzhGNzJGNjhGNzJCNjhGNzE4NDAzMjdDQgorOjEwMDgzMDAwMTQ4MTAxMjcxQzgxMDIyNzI0RjQ4RjcwMjcyQTk2MjIxNQorOjEwMDg0MDAwOEE4MDdFOEE2NEY0OEY3MDI3MUU5NjIyOEExMDdFOEFBMAorOjEwMDg1MDAwNjRGNDhGNzAyNzEyOTYyMjhBMjA3RThBNjRGNDhGNzA0NworOjEwMDg2MDAwMjcwNjk2MjI4QTQwOTcyMjc0OEY3MTc0OEY3MTc4OEYzMQorOjEwMDg3MDAwNzBCNjhGNzA4NTEwMjdBRkQ2MjJDNDEwNThCNjEyNzA4QworOjEwMDg4MDAwODFFNDI3MzY4MUUxMjYwQzk2MjI4NDIwNDQxQkQ2MjI1RgorOjEwMDg5MDAwQzRDRjIwMjM1ODgxQzYyNjBEOTYyMjg0NDA0NDQ0MUI5MQorOjEwMDhBMDAwRDYyMkM0QUYyMDExNTg4MTI3MjYwRjk2MjI4NDgwNDQ3NworOjEwMDhCMDAwNDQ0NDFCRDYyMkM0NkYxQjk3MjIzOTI3MEM3QzgyMDYyNgorOjBEMDhDMDAwQkREOUVEQjY4MjA3N0U4QUI5N0Y4MjA2Mzk2OAorOjAwMDAwMDAxRkYKKy8qIGZpcm13YXJlIHBhdGNoIGZvciBOU19EUDgzMDY1ICovCmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmMgYi9mcy85cC92OWZzLmMKaW5kZXggMDQ3Yzc5MS4uYzA2MWMzZiAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmcy5jCisrKyBiL2ZzLzlwL3Y5ZnMuYwpAQCAtNTUsNyArNTUsNyBAQAogCU9wdF9lcnIKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X2RlYnVnLCAiZGVidWc9JXgifSwKIAl7T3B0X2RmbHR1aWQsICJkZmx0dWlkPSV1In0sCiAJe09wdF9kZmx0Z2lkLCAiZGZsdGdpZD0ldSJ9LApkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlLmMgYi9mcy85cC92ZnNfaW5vZGUuYwppbmRleCBjOTUyOTVjLi5lODNhYTVlIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtNjI2LDggKzYyNiw3IEBACiAJcmV0dXJuIE5VTEw7CiAKIGVycm9yOgotCWlmIChmaWQpCi0JCXA5X2NsaWVudF9jbHVuayhmaWQpOworCXA5X2NsaWVudF9jbHVuayhmaWQpOwogCiAJcmV0dXJuIEVSUl9QVFIocmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IGFiY2NiNWQuLjllOWQ3MGMgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtMTM2LDM3ICsxMzYsNTEgQEAKIAkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKIAkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KIAotY29uZmlnIEVYVDRERVZfRlMKLQl0cmlzdGF0ZSAiRXh0NGRldi9leHQ0IGV4dGVuZGVkIGZzIHN1cHBvcnQgZGV2ZWxvcG1lbnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKK2NvbmZpZyBFWFQ0X0ZTCisJdHJpc3RhdGUgIlRoZSBFeHRlbmRlZCA0IChleHQ0KSBmaWxlc3lzdGVtIgogCXNlbGVjdCBKQkQyCiAJc2VsZWN0IENSQzE2CiAJaGVscAotCSAgRXh0NGRldiBpcyBhIHByZWRlY2Vzc29yIGZpbGVzeXN0ZW0gb2YgdGhlIG5leHQgZ2VuZXJhdGlvbgotCSAgZXh0ZW5kZWQgZnMgZXh0NCwgYmFzZWQgb24gZXh0MyBmaWxlc3lzdGVtIGNvZGUuIEl0IHdpbGwgYmUKLQkgIHJlbmFtZWQgZXh0NCBmcyBsYXRlciwgb25jZSBleHQ0ZGV2IGlzIG1hdHVyZSBhbmQgc3RhYmlsaXplZC4KKwkgIFRoaXMgaXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0MyBmaWxlc3lzdGVtLgogCiAJICBVbmxpa2UgdGhlIGNoYW5nZSBmcm9tIGV4dDIgZmlsZXN5c3RlbSB0byBleHQzIGZpbGVzeXN0ZW0sCi0JICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NGRldiBpcyBub3QgdGhlIHNhbWUgYXMgZXh0MyBhbnkgbW9yZToKLQkgIGl0IGlzIGJhc2VkIG9uIGV4dGVudCBtYXBzIGFuZCBpdCBzdXBwb3J0cyA0OC1iaXQgcGh5c2ljYWwgYmxvY2sKLQkgIG51bWJlcnMuIFRoZXNlIGNvbWJpbmVkIG9uLWRpc2sgZm9ybWF0IGNoYW5nZXMgd2lsbCBhbGxvdwotCSAgZXh0NGRldi9leHQ0IHRvIGhhbmRsZSBtb3JlIHRoYW4gMTYgVEIgZmlsZXN5c3RlbSB2b2x1bWVzIC0tCi0JICBhIGhhcmQgbGltaXQgdGhhdCBleHQzIGNhbm5vdCBvdmVyY29tZSB3aXRob3V0IGNoYW5naW5nIHRoZQotCSAgb24tZGlzayBmb3JtYXQuCisJICB0aGUgb24tZGlzayBmb3JtYXQgb2YgZXh0NCBpcyBub3QgZm9yd2FyZHMgY29tcGF0aWJsZSB3aXRoCisJICBleHQzOyBpdCBpcyBiYXNlZCBvbiBleHRlbnQgbWFwcyBhbmQgaXQgc3VwcG9ydHMgNDgtYml0CisJICBwaHlzaWNhbCBibG9jayBudW1iZXJzLiAgVGhlIGV4dDQgZmlsZXN5c3RlbSBhbHNvIHN1cHBvcnRzIGRlbGF5ZWQKKwkgIGFsbG9jYXRpb24sIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwgaGlnaCByZXNvbHV0aW9uIHRpbWUgc3RhbXBzLAorCSAgYW5kIGEgbnVtYmVyIG9mIG90aGVyIGZlYXR1cmVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHNwZWVkCisJICB1cCBmc2NrIHRpbWUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgd2ViIHBhZ2VzIGF0CisJICBodHRwOi8vZXh0NC53aWtpLmtlcm5lbC5vcmcuCiAKLQkgIE90aGVyIHRoYW4gZXh0ZW50IG1hcHMgYW5kIDQ4LWJpdCBibG9jayBudW1iZXJzLCBleHQ0ZGV2IGFsc28gaXMKLQkgIGxpa2VseSB0byBoYXZlIG90aGVyIG5ldyBmZWF0dXJlcyBzdWNoIGFzIHBlcnNpc3RlbnQgcHJlYWxsb2NhdGlvbiwKLQkgIGhpZ2ggcmVzb2x1dGlvbiB0aW1lIHN0YW1wcywgYW5kIGxhcmdlciBmaWxlIHN1cHBvcnQgZXRjLiAgVGhlc2UKLQkgIGZlYXR1cmVzIHdpbGwgYmUgYWRkZWQgdG8gZXh0NGRldiBncmFkdWFsbHkuCisJICBUaGUgZXh0NCBmaWxlc3lzdGVtIHdpbGwgc3VwcG9ydCBtb3VudGluZyBhbiBleHQzCisJICBmaWxlc3lzdGVtOyB3aGlsZSB0aGVyZSB3aWxsIGJlIHNvbWUgcGVyZm9ybWFuY2UgZ2FpbnMgZnJvbQorCSAgdGhlIGRlbGF5ZWQgYWxsb2NhdGlvbiBhbmQgaW5vZGUgdGFibGUgcmVhZGFoZWFkLCB0aGUgYmVzdAorCSAgcGVyZm9ybWFuY2UgZ2FpbnMgd2lsbCByZXF1aXJlIGVuYWJsaW5nIGV4dDQgZmVhdHVyZXMgaW4gdGhlCisJICBmaWxlc3lzdGVtLCBvciBmb3JtYXRpbmcgYSBuZXcgZmlsZXN5c3RlbSBhcyBhbiBleHQ0CisJICBmaWxlc3lzdGVtIGluaXRpYWxseS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDRkZXYuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBFWFQ0REVWX0ZTX1hBVFRSCi0JYm9vbCAiRXh0NGRldiBleHRlbmRlZCBhdHRyaWJ1dGVzIgotCWRlcGVuZHMgb24gRVhUNERFVl9GUworY29uZmlnIEVYVDRERVZfQ09NUEFUCisJYm9vbCAiRW5hYmxlIGV4dDRkZXYgY29tcGF0aWJpbGl0eSIKKwlkZXBlbmRzIG9uIEVYVDRfRlMKKwloZWxwCisJICBTdGFydGluZyB3aXRoIDIuNi4yOCwgdGhlIG5hbWUgb2YgdGhlIGV4dDQgZmlsZXN5c3RlbSB3YXMKKwkgIHJlbmFtZWQgZnJvbSBleHQ0ZGV2IHRvIGV4dDQuICBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFyZSBzb21lCisJICBsZWdhY3kgdXNlcnNwYWNlIHByb2dyYW1zIChzdWNoIGFzIGtsaWJjJ3MgZnN0eXBlKSBoYXZlCisJICAiZXh0NGRldiIgaGFyZGNvZGVkLgorCisJICBUbyBlbmFibGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc28gdGhhdCBzeXN0ZW1zIHRoYXQgYXJlCisJICBzdGlsbCBleHBlY3RpbmcgdG8gbW91bnQgZXh0NCBmaWxlc3lzdGVtcyB1c2luZyBleHQ0ZGV2LAorCSAgY2hvc2UgWSBoZXJlLiAgIFRoaXMgZmVhdHVyZSB3aWxsIGdvIGF3YXkgYnkgMi42LjMxLCBzbworCSAgcGxlYXNlIGFycmFuZ2UgdG8gZ2V0IHlvdXIgdXNlcnNwYWNlIHByb2dyYW1zIGZpeGVkIQorCitjb25maWcgRVhUNF9GU19YQVRUUgorCWJvb2wgIkV4dDQgZXh0ZW5kZWQgYXR0cmlidXRlcyIKKwlkZXBlbmRzIG9uIEVYVDRfRlMKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBFeHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBuYW1lOnZhbHVlIHBhaXJzIGFzc29jaWF0ZWQgd2l0aCBpbm9kZXMgYnkKQEAgLTE3NSwxMSArMTg5LDExIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLQkgIFlvdSBuZWVkIHRoaXMgZm9yIFBPU0lYIEFDTCBzdXBwb3J0IG9uIGV4dDRkZXYvZXh0NC4KKwkgIFlvdSBuZWVkIHRoaXMgZm9yIFBPU0lYIEFDTCBzdXBwb3J0IG9uIGV4dDQuCiAKLWNvbmZpZyBFWFQ0REVWX0ZTX1BPU0lYX0FDTAotCWJvb2wgIkV4dDRkZXYgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCi0JZGVwZW5kcyBvbiBFWFQ0REVWX0ZTX1hBVFRSCitjb25maWcgRVhUNF9GU19QT1NJWF9BQ0wKKwlib29sICJFeHQ0IFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgorCWRlcGVuZHMgb24gRVhUNF9GU19YQVRUUgogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCkBAIC0xOTAsMTQgKzIwNCwxNCBAQAogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KIAotY29uZmlnIEVYVDRERVZfRlNfU0VDVVJJVFkKLQlib29sICJFeHQ0ZGV2IFNlY3VyaXR5IExhYmVscyIKLQlkZXBlbmRzIG9uIEVYVDRERVZfRlNfWEFUVFIKK2NvbmZpZyBFWFQ0X0ZTX1NFQ1VSSVRZCisJYm9vbCAiRXh0NCBTZWN1cml0eSBMYWJlbHMiCisJZGVwZW5kcyBvbiBFWFQ0X0ZTX1hBVFRSCiAJaGVscAogCSAgU2VjdXJpdHkgbGFiZWxzIHN1cHBvcnQgYWx0ZXJuYXRpdmUgYWNjZXNzIGNvbnRyb2wgbW9kZWxzCiAJICBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBtb2R1bGVzIGxpa2UgU0VMaW51eC4gIFRoaXMgb3B0aW9uCiAJICBlbmFibGVzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVyIGZvciBmaWxlIHNlY3VyaXR5Ci0JICBsYWJlbHMgaW4gdGhlIGV4dDRkZXYvZXh0NCBmaWxlc3lzdGVtLgorCSAgbGFiZWxzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uCiAKIAkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKIAkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KQEAgLTIwNiwxNyArMjIwLDE2IEBACiAJdHJpc3RhdGUKIAloZWxwCiAJICBUaGlzIGlzIGEgZ2VuZXJpYyBqb3VybmFsbGluZyBsYXllciBmb3IgYmxvY2sgZGV2aWNlcy4gIEl0IGlzCi0JICBjdXJyZW50bHkgdXNlZCBieSB0aGUgZXh0MyBhbmQgT0NGUzIgZmlsZSBzeXN0ZW1zLCBidXQgaXQgY291bGQKLQkgIGFsc28gYmUgdXNlZCB0byBhZGQgam91cm5hbCBzdXBwb3J0IHRvIG90aGVyIGZpbGUgc3lzdGVtcyBvciBibG9jaworCSAgY3VycmVudGx5IHVzZWQgYnkgdGhlIGV4dDMgZmlsZSBzeXN0ZW0sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlCisJICB1c2VkIHRvIGFkZCBqb3VybmFsIHN1cHBvcnQgdG8gb3RoZXIgZmlsZSBzeXN0ZW1zIG9yIGJsb2NrCiAJICBkZXZpY2VzIHN1Y2ggYXMgUkFJRCBvciBMVk0uCiAKLQkgIElmIHlvdSBhcmUgdXNpbmcgdGhlIGV4dDMgb3IgT0NGUzIgZmlsZSBzeXN0ZW1zLCB5b3UgbmVlZCB0bwotCSAgc2F5IFkgaGVyZS4gSWYgeW91IGFyZSBub3QgdXNpbmcgZXh0MyBPQ0ZTMiB0aGVuIHlvdSB3aWxsIHByb2JhYmx5Ci0JICB3YW50IHRvIHNheSBOLgorCSAgSWYgeW91IGFyZSB1c2luZyB0aGUgZXh0MyBmaWxlIHN5c3RlbSwgeW91IG5lZWQgdG8gc2F5IFkgaGVyZS4KKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGV4dDMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHNheSBOLgogCiAJICBUbyBjb21waWxlIHRoaXMgZGV2aWNlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCBqYmQuICBJZiB5b3UgYXJlIGNvbXBpbGluZyBleHQzIG9yIE9DRlMyIGludG8gdGhlIGtlcm5lbCwKLQkgIHlvdSBjYW5ub3QgY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUuCisJICBjYWxsZWQgamJkLiAgSWYgeW91IGFyZSBjb21waWxpbmcgZXh0MyBpbnRvIHRoZSBrZXJuZWwsIHlvdQorCSAgY2Fubm90IGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLgogCiBjb25maWcgSkJEX0RFQlVHCiAJYm9vbCAiSkJEIChleHQzKSBkZWJ1Z2dpbmcgc3VwcG9ydCIKQEAgLTI0MCwyMiArMjUzLDIzIEBACiAJaGVscAogCSAgVGhpcyBpcyBhIGdlbmVyaWMgam91cm5hbGluZyBsYXllciBmb3IgYmxvY2sgZGV2aWNlcyB0aGF0IHN1cHBvcnQKIAkgIGJvdGggMzItYml0IGFuZCA2NC1iaXQgYmxvY2sgbnVtYmVycy4gIEl0IGlzIGN1cnJlbnRseSB1c2VkIGJ5Ci0JICB0aGUgZXh0NGRldi9leHQ0IGZpbGVzeXN0ZW0sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gYWRkCisJICB0aGUgZXh0NCBhbmQgT0NGUzIgZmlsZXN5c3RlbXMsIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gYWRkCiAJICBqb3VybmFsIHN1cHBvcnQgdG8gb3RoZXIgZmlsZSBzeXN0ZW1zIG9yIGJsb2NrIGRldmljZXMgc3VjaAogCSAgYXMgUkFJRCBvciBMVk0uCiAKLQkgIElmIHlvdSBhcmUgdXNpbmcgZXh0NGRldi9leHQ0LCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlLiBJZiB5b3UgYXJlIG5vdAotCSAgdXNpbmcgZXh0NGRldi9leHQ0IHRoZW4geW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBzYXkgTi4KKwkgIElmIHlvdSBhcmUgdXNpbmcgZXh0NCBvciBPQ0ZTMiwgeW91IG5lZWQgdG8gc2F5IFkgaGVyZS4KKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGV4dDQgb3IgT0NGUzIgdGhlbiB5b3Ugd2lsbAorCSAgcHJvYmFibHkgd2FudCB0byBzYXkgTi4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRldmljZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgamJkMi4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDRkZXYvZXh0NCBpbnRvIHRoZSBrZXJuZWwsCisJICBjYWxsZWQgamJkMi4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDQgb3IgT0NGUzIgaW50byB0aGUga2VybmVsLAogCSAgeW91IGNhbm5vdCBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KIAogY29uZmlnIEpCRDJfREVCVUcKLQlib29sICJKQkQyIChleHQ0ZGV2L2V4dDQpIGRlYnVnZ2luZyBzdXBwb3J0IgorCWJvb2wgIkpCRDIgKGV4dDQpIGRlYnVnZ2luZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gSkJEMiAmJiBERUJVR19GUwogCWhlbHAKLQkgIElmIHlvdSBhcmUgdXNpbmcgdGhlIGV4dDRkZXYvZXh0NCBqb3VybmFsZWQgZmlsZSBzeXN0ZW0gKG9yCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQ0IGpvdXJuYWxlZCBmaWxlIHN5c3RlbSAob3IKIAkgIHBvdGVudGlhbGx5IGFueSBvdGhlciBmaWxlc3lzdGVtL2RldmljZSB1c2luZyBKQkQyKSwgdGhpcyBvcHRpb24KIAkgIGFsbG93cyB5b3UgdG8gZW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgd2hpbGUgdGhlIHN5c3RlbSBpcyBydW5uaW5nLAogCSAgaW4gb3JkZXIgdG8gaGVscCB0cmFjayBkb3duIGFueSBwcm9ibGVtcyB5b3UgYXJlIGhhdmluZy4KQEAgLTI3MCw5ICsyODQsOSBAQAogY29uZmlnIEZTX01CQ0FDSEUKICMgTWV0YSBibG9jayBjYWNoZSBmb3IgRXh0ZW5kZWQgQXR0cmlidXRlcyAoZXh0Mi9leHQzL2V4dDQpCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIgfHwgRVhUM19GU19YQVRUUiB8fCBFWFQ0REVWX0ZTX1hBVFRSCi0JZGVmYXVsdCB5IGlmIEVYVDJfRlM9eSB8fCBFWFQzX0ZTPXkgfHwgRVhUNERFVl9GUz15Ci0JZGVmYXVsdCBtIGlmIEVYVDJfRlM9bSB8fCBFWFQzX0ZTPW0gfHwgRVhUNERFVl9GUz1tCisJZGVwZW5kcyBvbiBFWFQyX0ZTX1hBVFRSIHx8IEVYVDNfRlNfWEFUVFIgfHwgRVhUNF9GU19YQVRUUgorCWRlZmF1bHQgeSBpZiBFWFQyX0ZTPXkgfHwgRVhUM19GUz15IHx8IEVYVDRfRlM9eQorCWRlZmF1bHQgbSBpZiBFWFQyX0ZTPW0gfHwgRVhUM19GUz1tIHx8IEVYVDRfRlM9bQogCiBjb25maWcgUkVJU0VSRlNfRlMKIAl0cmlzdGF0ZSAiUmVpc2VyZnMgc3VwcG9ydCIKQEAgLTQxOSw2ICs0MzMsMTQgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBGSUxFX0xPQ0tJTkcKKwlib29sICJFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSSIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZAorICAgICAgICAgIGZvciBmaWxlc3lzdGVtcyBsaWtlIE5GUyBhbmQgZm9yIHRoZSBmbG9jaygpIHN5c3RlbQorICAgICAgICAgIGNhbGwuIERpc2FibGluZyB0aGlzIG9wdGlvbiBzYXZlcyBhYm91dCAxMWsuCisKIHNvdXJjZSAiZnMveGZzL0tjb25maWciCiBzb3VyY2UgImZzL2dmczIvS2NvbmZpZyIKIApAQCAtNDI2LDcgKzQ0OCw3IEBACiAJdHJpc3RhdGUgIk9DRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQgJiYgU1lTRlMKIAlzZWxlY3QgQ09ORklHRlNfRlMKLQlzZWxlY3QgSkJECisJc2VsZWN0IEpCRDIKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBPQ0ZTMiBpcyBhIGdlbmVyYWwgcHVycG9zZSBleHRlbnQgYmFzZWQgc2hhcmVkIGRpc2sgY2x1c3RlciBmaWxlCkBAIC00OTcsNiArNTE5LDE2IEBACiAJICB0aGlzIG9wdGlvbiBmb3IgZGVidWdnaW5nIG9ubHkgYXMgaXQgaXMgbGlrZWx5IHRvIGRlY3JlYXNlCiAJICBwZXJmb3JtYW5jZSBvZiB0aGUgZmlsZXN5c3RlbS4KIAorY29uZmlnIE9DRlMyX0NPTVBBVF9KQkQKKwlib29sICJVc2UgSkJEIGZvciBjb21wYXRpYmlsaXR5IgorCWRlcGVuZHMgb24gT0NGUzJfRlMKKwlkZWZhdWx0IG4KKwlzZWxlY3QgSkJECisJaGVscAorCSAgVGhlIG9jZnMyIGZpbGVzeXN0ZW0gbm93IHVzZXMgSkJEMiBmb3IgaXRzIGpvdXJuYWxsaW5nLiAgSkJEMgorCSAgaXMgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBKQkQuICBJdCBpcyBzYWZlIHRvIHNheSBOIGhlcmUuCisJICBIb3dldmVyLCBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSBvcmlnaW5hbCBKQkQsIHNheSBZIGhlcmUuCisKIGVuZGlmICMgQkxPQ0sKIAogY29uZmlnIEROT1RJRlkKQEAgLTE3NjUsNiArMTc5NywyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU1VOUlBDX1JFR0lTVEVSX1Y0CisJYm9vbCAiUmVnaXN0ZXIgbG9jYWwgUlBDIHNlcnZpY2VzIHZpYSBycGNiaW5kIHY0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFN1biBhZGRlZCBzdXBwb3J0IGZvciByZWdpc3RlcmluZyBSUEMgc2VydmljZXMgYXQgYW4gSVB2NgorCSAgYWRkcmVzcyBieSBjcmVhdGluZyB0d28gbmV3IHZlcnNpb25zIG9mIHRoZSBycGNiaW5kIHByb3RvY29sCisJICAoUkZDIDE4MzMpLgorCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBSUEMgc2VydmVyIGZvcgorCSAgcmVnaXN0ZXJpbmcga2VybmVsIFJQQyBzZXJ2aWNlcyB2aWEgdmVyc2lvbiA0IG9mIHRoZSBycGNiaW5kCisJICBwcm90b2NvbC4gIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIHlvdSBtdXN0IHJ1biBhIHBvcnRtYXBwZXIKKwkgIGRhZW1vbiB0aGF0IHN1cHBvcnRzIHJwY2JpbmQgcHJvdG9jb2wgdmVyc2lvbiA0LgorCisJICBTZXJ2aW5nIE5GUyBvdmVyIElQdjYgZnJvbSBrbmZzZCAodGhlIGtlcm5lbCdzIE5GUyBzZXJ2ZXIpCisJICByZXF1aXJlcyB0aGF0IHlvdSBlbmFibGUgdGhpcyBvcHRpb24gYW5kIHVzZSBhIHBvcnRtYXBwZXIgdGhhdAorCSAgc3VwcG9ydHMgcnBjYmluZCB2ZXJzaW9uIDQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4gdG8gZ2V0IHRyYWRpdGlvbmFsIGJlaGF2aW9yIChyZWdpc3RlciBrZXJuZWwKKwkgIFJQQyBzZXJ2aWNlcyB1c2luZyBvbmx5IHJwY2JpbmQgdmVyc2lvbiAyKS4gIERpc3RyaWJ1dGlvbnMKKwkgIHVzaW5nIHRoZSBsZWdhY3kgTGludXggcG9ydG1hcHBlciBkYWVtb24gbXVzdCBzYXkgTiBoZXJlLgorCiBjb25maWcgUlBDU0VDX0dTU19LUkI1CiAJdHJpc3RhdGUgIlNlY3VyZSBSUEM6IEtlcmJlcm9zIFYgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCA0YTU1MWFmLi44MDFkYjEzIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtMjUsNyArMjUsNyBAQAogCiBjb25maWcgQ09NUEFUX0JJTkZNVF9FTEYKIAlib29sCi0JZGVwZW5kcyBvbiBDT01QQVQgJiYgTU1VCisJZGVwZW5kcyBvbiBDT01QQVQgJiYgQklORk1UX0VMRgogCiBjb25maWcgQklORk1UX0VMRl9GRFBJQwogCWJvb2wgIktlcm5lbCBzdXBwb3J0IGZvciBGRFBJQyBFTEYgYmluYXJpZXMiCkBAIC01OSwxMCArNTksMTIgQEAKIAloZWxwCiAJICBTdXBwb3J0IEZMQVQgc2hhcmVkIGxpYnJhcmllcwogCitjb25maWcgSEFWRV9BT1VUCisgICAgICAgZGVmX2Jvb2wgbgorCiBjb25maWcgQklORk1UX0FPVVQKIAl0cmlzdGF0ZSAiS2VybmVsIHN1cHBvcnQgZm9yIGEub3V0IGFuZCBFQ09GRiBiaW5hcmllcyIKLQlkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfQU9VVCAmJiBcCi0JCShYODZfMzIgfHwgQUxQSEEgfHwgQVJNIHx8IE02OEspCisJZGVwZW5kcyBvbiBIQVZFX0FPVVQKIAktLS1oZWxwLS0tCiAJICBBLm91dCAoQXNzZW1ibGVyLk9VVHB1dCkgaXMgYSBzZXQgb2YgZm9ybWF0cyBmb3IgbGlicmFyaWVzIGFuZAogCSAgZXhlY3V0YWJsZXMgdXNlZCBpbiB0aGUgZWFybGllc3QgdmVyc2lvbnMgb2YgVU5JWC4gIExpbnV4IHVzZWQKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggYTE0ODJhNS4uZDBjNjlmNSAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTcsOCArNyw4IEBACiAKIG9iai15IDo9CW9wZW4ubyByZWFkX3dyaXRlLm8gZmlsZV90YWJsZS5vIHN1cGVyLm8gXAogCQljaGFyX2Rldi5vIHN0YXQubyBleGVjLm8gcGlwZS5vIG5hbWVpLm8gZmNudGwubyBcCi0JCWlvY3RsLm8gcmVhZGRpci5vIHNlbGVjdC5vIGZpZm8ubyBsb2Nrcy5vIGRjYWNoZS5vIGlub2RlLm8gXAotCQlhdHRyLm8gYmFkX2lub2RlLm8gZmlsZS5vIGZpbGVzeXN0ZW1zLm8gbmFtZXNwYWNlLm8gYWlvLm8gXAorCQlpb2N0bC5vIHJlYWRkaXIubyBzZWxlY3QubyBmaWZvLm8gZGNhY2hlLm8gaW5vZGUubyBcCisJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBcCiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIFwKIAkJcG5vZGUubyBkcm9wX2NhY2hlcy5vIHNwbGljZS5vIHN5bmMubyB1dGltZXMubyBcCiAJCXN0YWNrLm8KQEAgLTI3LDYgKzI3LDggQEAKIG9iai0kKENPTkZJR19TSUdOQUxGRCkJCSs9IHNpZ25hbGZkLm8KIG9iai0kKENPTkZJR19USU1FUkZEKQkJKz0gdGltZXJmZC5vCiBvYmotJChDT05GSUdfRVZFTlRGRCkJCSs9IGV2ZW50ZmQubworb2JqLSQoQ09ORklHX0FJTykgICAgICAgICAgICAgICArPSBhaW8ubworb2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICArPSBsb2Nrcy5vCiBvYmotJChDT05GSUdfQ09NUEFUKQkJKz0gY29tcGF0Lm8gY29tcGF0X2lvY3RsLm8KIAogbmZzZC0kKENPTkZJR19ORlNEKQkJOj0gbmZzY3RsLm8KQEAgLTY5LDcgKzcxLDcgQEAKICMgRG8gbm90IGFkZCBhbnkgZmlsZXN5c3RlbXMgYmVmb3JlIHRoaXMgbGluZQogb2JqLSQoQ09ORklHX1JFSVNFUkZTX0ZTKQkrPSByZWlzZXJmcy8KIG9iai0kKENPTkZJR19FWFQzX0ZTKQkJKz0gZXh0My8gIyBCZWZvcmUgZXh0MiBzbyByb290IGZzIGNhbiBiZSBleHQzCi1vYmotJChDT05GSUdfRVhUNERFVl9GUykJKz0gZXh0NC8gIyBCZWZvcmUgZXh0MiBzbyByb290IGZzIGNhbiBiZSBleHQ0ZGV2CitvYmotJChDT05GSUdfRVhUNF9GUykJCSs9IGV4dDQvICMgQmVmb3JlIGV4dDIgc28gcm9vdCBmcyBjYW4gYmUgZXh0NGRldgogb2JqLSQoQ09ORklHX0pCRCkJCSs9IGpiZC8KIG9iai0kKENPTkZJR19KQkQyKQkJKz0gamJkMi8KIG9iai0kKENPTkZJR19FWFQyX0ZTKQkJKz0gZXh0Mi8KZGlmZiAtLWdpdCBhL2ZzL2FkZnMvc3VwZXIuYyBiL2ZzL2FkZnMvc3VwZXIuYwppbmRleCAyNmYzYjQzLi43ZjgzYTQ2IDEwMDY0NAotLS0gYS9mcy9hZGZzL3N1cGVyLmMKKysrIGIvZnMvYWRmcy9zdXBlci5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogZW51bSB7T3B0X3VpZCwgT3B0X2dpZCwgT3B0X293bm1hc2ssIE9wdF9vdGhtYXNrLCBPcHRfZXJyfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfdWlkLCAidWlkPSV1In0sCiAJe09wdF9naWQsICJnaWQ9JXUifSwKIAl7T3B0X293bm1hc2ssICJvd25tYXNrPSVvIn0sCmRpZmYgLS1naXQgYS9mcy9hZmZzL3N1cGVyLmMgYi9mcy9hZmZzL3N1cGVyLmMKaW5kZXggM2E4OTA5NC4uODk4OWM5MyAxMDA2NDQKLS0tIGEvZnMvYWZmcy9zdXBlci5jCisrKyBiL2ZzL2FmZnMvc3VwZXIuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJT3B0X3ZlcmJvc2UsIE9wdF92b2x1bWUsIE9wdF9pZ25vcmUsIE9wdF9lcnIsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9icywgImJzPSV1In0sCiAJe09wdF9tb2RlLCAibW9kZT0lbyJ9LAogCXtPcHRfbXVmcywgIm11ZnMifSwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9maWxlLmMgYi9mcy9hZnMvZmlsZS5jCmluZGV4IDUyNWY3YzUuLmEzOTAxNzYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9maWxlLmMKKysrIGIvZnMvYWZzL2ZpbGUuYwpAQCAtNTAsOCArNTAsOCBAQAogCS5sYXVuZGVyX3BhZ2UJPSBhZnNfbGF1bmRlcl9wYWdlLAogCS5yZWxlYXNlcGFnZQk9IGFmc19yZWxlYXNlcGFnZSwKIAkuaW52YWxpZGF0ZXBhZ2UJPSBhZnNfaW52YWxpZGF0ZXBhZ2UsCi0JLnByZXBhcmVfd3JpdGUJPSBhZnNfcHJlcGFyZV93cml0ZSwKLQkuY29tbWl0X3dyaXRlCT0gYWZzX2NvbW1pdF93cml0ZSwKKwkud3JpdGVfYmVnaW4JPSBhZnNfd3JpdGVfYmVnaW4sCisJLndyaXRlX2VuZAk9IGFmc193cml0ZV9lbmQsCiAJLndyaXRlcGFnZQk9IGFmc193cml0ZXBhZ2UsCiAJLndyaXRlcGFnZXMJPSBhZnNfd3JpdGVwYWdlcywKIH07CmRpZmYgLS1naXQgYS9mcy9hZnMvaW50ZXJuYWwuaCBiL2ZzL2Fmcy9pbnRlcm5hbC5oCmluZGV4IDNjYjY5MjAuLjY3ZjI1OWQgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2Fmcy9pbnRlcm5hbC5oCkBAIC03MjgsOCArNzI4LDEyIEBACiAgKi8KIGV4dGVybiBpbnQgYWZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgYWZzX3B1dF93cml0ZWJhY2soc3RydWN0IGFmc193cml0ZWJhY2sgKik7Ci1leHRlcm4gaW50IGFmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7Ci1leHRlcm4gaW50IGFmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK2V4dGVybiBpbnQgYWZzX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCWxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKTsKK2V4dGVybiBpbnQgYWZzX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpOwogZXh0ZXJuIGludCBhZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICosIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqKTsKIGV4dGVybiBpbnQgYWZzX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICopOwogZXh0ZXJuIGludCBhZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IDI1MGQ4YzQuLmFlZTIzOWEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC02NCw3ICs2NCw3IEBACiAJYWZzX29wdF92b2wsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBhZnNfb3B0aW9uc19saXN0ID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgYWZzX29wdGlvbnNfbGlzdCA9IHsKIAl7IGFmc19vcHRfY2VsbCwJCSJjZWxsPSVzIgl9LAogCXsgYWZzX29wdF9yd3BhdGgsCSJyd3BhdGgiCX0sCiAJeyBhZnNfb3B0X3ZvbCwJCSJ2b2w9JXMiCX0sCmRpZmYgLS1naXQgYS9mcy9hZnMvd3JpdGUuYyBiL2ZzL2Fmcy93cml0ZS5jCmluZGV4IDA2NWI0ZTEuLmQ2Yjg1ZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy93cml0ZS5jCisrKyBiL2ZzL2Fmcy93cml0ZS5jCkBAIC04NCwxNSArODQsMjMgQEAKICAqIHBhcnRseSBvciB3aG9sbHkgZmlsbCBhIHBhZ2UgdGhhdCdzIHVuZGVyIHByZXBhcmF0aW9uIGZvciB3cml0aW5nCiAgKi8KIHN0YXRpYyBpbnQgYWZzX2ZpbGxfcGFnZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5LAotCQkJIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBsZW4sIHN0cnVjdCBwYWdlICpwYWdlKQorCQkJIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CisJbG9mZl90IGlfc2l6ZTsKKwl1bnNpZ25lZCBlb2Y7CiAJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSwldSIsIHN0YXJ0LCBsZW4pOworCV9lbnRlcigiLCwlbGx1LCV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MsIGxlbik7CiAKLQlBU1NFUlRDTVAoc3RhcnQgKyBsZW4sIDw9LCBQQUdFX1NJWkUpOworCUFTU0VSVENNUChsZW4sIDw9LCBQQUdFX0NBQ0hFX1NJWkUpOwogCi0JcmV0ID0gYWZzX3Zub2RlX2ZldGNoX2RhdGEodm5vZGUsIGtleSwgc3RhcnQsIGxlbiwgcGFnZSk7CisJaV9zaXplID0gaV9zaXplX3JlYWQoJnZub2RlLT52ZnNfaW5vZGUpOworCWlmIChwb3MgKyBsZW4gPiBpX3NpemUpCisJCWVvZiA9IGlfc2l6ZTsKKwllbHNlCisJCWVvZiA9IFBBR0VfQ0FDSEVfU0laRTsKKworCXJldCA9IGFmc192bm9kZV9mZXRjaF9kYXRhKHZub2RlLCBrZXksIDAsIGVvZiwgcGFnZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCA9PSAtRU5PRU5UKSB7CiAJCQlfZGVidWcoImdvdCBOT0VOVCBmcm9tIHNlcnZlciIKQEAgLTEwNywxMDkgKzExNSw1NSBAQAogfQogCiAvKgotICogcHJlcGFyZSBhIHBhZ2UgZm9yIGJlaW5nIHdyaXR0ZW4gdG8KLSAqLwotc3RhdGljIGludCBhZnNfcHJlcGFyZV9wYWdlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCSAgICBzdHJ1Y3Qga2V5ICprZXksIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCi17Ci0JdW5zaWduZWQgZW9mLCB0YWlsLCBzdGFydCwgc3RvcCwgbGVuOwotCWxvZmZfdCBpX3NpemUsIHBvczsKLQl2b2lkICpwOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiIpOwotCi0JaWYgKG9mZnNldCA9PSAwICYmIHRvID09IFBBR0VfU0laRSkKLQkJcmV0dXJuIDA7Ci0KLQlwID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCi0JaV9zaXplID0gaV9zaXplX3JlYWQoJnZub2RlLT52ZnNfaW5vZGUpOwotCXBvcyA9IChsb2ZmX3QpIHBhZ2UtPmluZGV4IDw8IFBBR0VfU0hJRlQ7Ci0JaWYgKHBvcyA+PSBpX3NpemUpIHsKLQkJLyogcGFydGlhbCB3cml0ZSwgcGFnZSBiZXlvbmQgRU9GICovCi0JCV9kZWJ1ZygiYmV5b25kIik7Ci0JCWlmIChvZmZzZXQgPiAwKQotCQkJbWVtc2V0KHAsIDAsIG9mZnNldCk7Ci0JCWlmICh0byA8IFBBR0VfU0laRSkKLQkJCW1lbXNldChwICsgdG8sIDAsIFBBR0VfU0laRSAtIHRvKTsKLQkJa3VubWFwX2F0b21pYyhwLCBLTV9VU0VSMCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChpX3NpemUgLSBwb3MgPj0gUEFHRV9TSVpFKSB7Ci0JCS8qIHBhcnRpYWwgd3JpdGUsIHBhZ2UgZW50aXJlbHkgYmVmb3JlIEVPRiAqLwotCQlfZGVidWcoImJlZm9yZSIpOwotCQl0YWlsID0gZW9mID0gUEFHRV9TSVpFOwotCX0gZWxzZSB7Ci0JCS8qIHBhcnRpYWwgd3JpdGUsIHBhZ2Ugb3ZlcmxhcHMgRU9GICovCi0JCWVvZiA9IGlfc2l6ZSAtIHBvczsKLQkJX2RlYnVnKCJvdmVybGFwICV1IiwgZW9mKTsKLQkJdGFpbCA9IG1heChlb2YsIHRvKTsKLQkJaWYgKHRhaWwgPCBQQUdFX1NJWkUpCi0JCQltZW1zZXQocCArIHRhaWwsIDAsIFBBR0VfU0laRSAtIHRhaWwpOwotCQlpZiAob2Zmc2V0ID4gZW9mKQotCQkJbWVtc2V0KHAgKyBlb2YsIDAsIFBBR0VfU0laRSAtIGVvZik7Ci0JfQotCi0Ja3VubWFwX2F0b21pYyhwLCBLTV9VU0VSMCk7Ci0KLQlyZXQgPSAwOwotCWlmIChvZmZzZXQgPiAwIHx8IGVvZiA+IHRvKSB7Ci0JCS8qIG5lZWQgdG8gZmlsbCBvbmUgb3IgdHdvIGJpdHMgdGhhdCBhcmVuJ3QgZ29pbmcgdG8gYmUgd3JpdHRlbgotCQkgKiAoY292ZXIgYm90aCBmaWxsZXJzIGluIG9uZSByZWFkIGlmIHRoZXJlIGFyZSB0d28pICovCi0JCXN0YXJ0ID0gKG9mZnNldCA+IDApID8gMCA6IHRvOwotCQlzdG9wID0gKGVvZiA+IHRvKSA/IGVvZiA6IG9mZnNldDsKLQkJbGVuID0gc3RvcCAtIHN0YXJ0OwotCQlfZGVidWcoIndyPSV1LSV1IGF2PTAtJXUgcmQ9JXVAJXUiLAotCQkgICAgICAgb2Zmc2V0LCB0bywgZW9mLCBzdGFydCwgbGVuKTsKLQkJcmV0ID0gYWZzX2ZpbGxfcGFnZSh2bm9kZSwga2V5LCBzdGFydCwgbGVuLCBwYWdlKTsKLQl9Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgogICogcHJlcGFyZSB0byBwZXJmb3JtIHBhcnQgb2YgYSB3cml0ZSB0byBhIHBhZ2UKLSAqIC0gdGhlIGNhbGxlciBob2xkcyB0aGUgcGFnZSBsb2NrZWQsIHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyB3cml0dGVuIG91dCBvcgotICogICBtb2RpZmllZCBieSBhbnlvbmUgZWxzZQogICovCi1pbnQgYWZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoraW50IGFmc193cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSkKIHsKIAlzdHJ1Y3QgYWZzX3dyaXRlYmFjayAqY2FuZGlkYXRlLCAqd2I7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGtleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCB0byA9IGZyb20gKyBsZW47CisJcGdvZmZfdCBpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWludCByZXQ7CiAKIAlfZW50ZXIoInsleDoldX0seyVseH0sJXUsJXUiLAotCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgcGFnZS0+aW5kZXgsIG9mZnNldCwgdG8pOworCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgaW5kZXgsIGZyb20sIHRvKTsKIAogCWNhbmRpZGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpjYW5kaWRhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNhbmRpZGF0ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJY2FuZGlkYXRlLT52bm9kZSA9IHZub2RlOwotCWNhbmRpZGF0ZS0+Zmlyc3QgPSBjYW5kaWRhdGUtPmxhc3QgPSBwYWdlLT5pbmRleDsKLQljYW5kaWRhdGUtPm9mZnNldF9maXJzdCA9IG9mZnNldDsKKwljYW5kaWRhdGUtPmZpcnN0ID0gY2FuZGlkYXRlLT5sYXN0ID0gaW5kZXg7CisJY2FuZGlkYXRlLT5vZmZzZXRfZmlyc3QgPSBmcm9tOwogCWNhbmRpZGF0ZS0+dG9fbGFzdCA9IHRvOwogCWNhbmRpZGF0ZS0+dXNhZ2UgPSAxOwogCWNhbmRpZGF0ZS0+c3RhdGUgPSBBRlNfV0JBQ0tfUEVORElORzsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW5kaWRhdGUtPndhaXRxKTsKIAorCXBhZ2UgPSBfX2dyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKSB7CisJCWtmcmVlKGNhbmRpZGF0ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkqcGFnZXAgPSBwYWdlOworCS8qIHBhZ2Ugd29uJ3QgbGVhayBpbiBlcnJvciBjYXNlOiBpdCBldmVudHVhbGx5IGdldHMgY2xlYW5lZCBvZmYgTFJVICovCisKIAlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewogCQlfZGVidWcoIm5vdCB1cCB0byBkYXRlIik7Ci0JCXJldCA9IGFmc19wcmVwYXJlX3BhZ2Uodm5vZGUsIHBhZ2UsIGtleSwgb2Zmc2V0LCB0byk7CisJCXJldCA9IGFmc19maWxsX3BhZ2Uodm5vZGUsIGtleSwgcG9zLCBsZW4sIHBhZ2UpOwogCQlpZiAocmV0IDwgMCkgewogCQkJa2ZyZWUoY2FuZGlkYXRlKTsKIAkJCV9sZWF2ZSgiID0gJWQgW3ByZXBdIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCX0KIAogdHJ5X2FnYWluOgotCWluZGV4ID0gcGFnZS0+aW5kZXg7CiAJc3Bpbl9sb2NrKCZ2bm9kZS0+d3JpdGViYWNrX2xvY2spOwogCiAJLyogc2VlIGlmIHRoaXMgcGFnZSBpcyBhbHJlYWR5IHBlbmRpbmcgYSB3cml0ZWJhY2sgdW5kZXIgYSBzdWl0YWJsZSBrZXkKQEAgLTI0Miw4ICsxOTYsOCBAQAogc3Vic3VtZV9pbl9jdXJyZW50X3diOgogCV9kZWJ1Zygic3Vic3VtZSIpOwogCUFTU0VSVFJBTkdFKHdiLT5maXJzdCwgPD0sIGluZGV4LCA8PSwgd2ItPmxhc3QpOwotCWlmIChpbmRleCA9PSB3Yi0+Zmlyc3QgJiYgb2Zmc2V0IDwgd2ItPm9mZnNldF9maXJzdCkKLQkJd2ItPm9mZnNldF9maXJzdCA9IG9mZnNldDsKKwlpZiAoaW5kZXggPT0gd2ItPmZpcnN0ICYmIGZyb20gPCB3Yi0+b2Zmc2V0X2ZpcnN0KQorCQl3Yi0+b2Zmc2V0X2ZpcnN0ID0gZnJvbTsKIAlpZiAoaW5kZXggPT0gd2ItPmxhc3QgJiYgdG8gPiB3Yi0+dG9fbGFzdCkKIAkJd2ItPnRvX2xhc3QgPSB0bzsKIAlzcGluX3VubG9jaygmdm5vZGUtPndyaXRlYmFja19sb2NrKTsKQEAgLTI4OSwxNyArMjQzLDE3IEBACiAvKgogICogZmluYWxpc2UgcGFydCBvZiBhIHdyaXRlIHRvIGEgcGFnZQogICovCi1pbnQgYWZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCSAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK2ludCBhZnNfd3JpdGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwogCWxvZmZfdCBpX3NpemUsIG1heWJlX2lfc2l6ZTsKIAotCV9lbnRlcigieyV4OiV1fSx7JWx4fSwldSwldSIsCi0JICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBwYWdlLT5pbmRleCwgb2Zmc2V0LCB0byk7CisJX2VudGVyKCJ7JXg6JXV9LHslbHh9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHBhZ2UtPmluZGV4KTsKIAotCW1heWJlX2lfc2l6ZSA9IChsb2ZmX3QpIHBhZ2UtPmluZGV4IDw8IFBBR0VfU0hJRlQ7Ci0JbWF5YmVfaV9zaXplICs9IHRvOworCW1heWJlX2lfc2l6ZSA9IHBvcyArIGNvcGllZDsKIAogCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKCZ2bm9kZS0+dmZzX2lub2RlKTsKIAlpZiAobWF5YmVfaV9zaXplID4gaV9zaXplKSB7CkBAIC0zMTAsMTIgKzI2NCwxMyBAQAogCQlzcGluX3VubG9jaygmdm5vZGUtPndyaXRlYmFja19sb2NrKTsKIAl9CiAKLQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAJaWYgKFBhZ2VEaXJ0eShwYWdlKSkKIAkJX2RlYnVnKCJkaXJ0aWVkIik7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGNvcGllZDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbm9kZS5jIGIvZnMvYXV0b2ZzL2lub2RlLmMKaW5kZXggZGRhNTEwZC4uYjcwZWVhMSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzL2lub2RlLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogZW51bSB7T3B0X2VyciwgT3B0X2ZkLCBPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfcGdycCwgT3B0X21pbnByb3RvLCBPcHRfbWF4cHJvdG99OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBhdXRvZnNfdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgYXV0b2ZzX3Rva2VucyA9IHsKIAl7T3B0X2ZkLCAiZmQ9JXUifSwKIAl7T3B0X3VpZCwgInVpZD0ldSJ9LAogCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L01ha2VmaWxlIGIvZnMvYXV0b2ZzNC9NYWtlZmlsZQppbmRleCBmMmMzYjc5Li5hODExYzFmIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L01ha2VmaWxlCisrKyBiL2ZzL2F1dG9mczQvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAKIG9iai0kKENPTkZJR19BVVRPRlM0X0ZTKSArPSBhdXRvZnM0Lm8KIAotYXV0b2ZzNC1vYmpzIDo9IGluaXQubyBpbm9kZS5vIHJvb3QubyBzeW1saW5rLm8gd2FpdHEubyBleHBpcmUubworYXV0b2ZzNC1vYmpzIDo9IGluaXQubyBpbm9kZS5vIHJvb3QubyBzeW1saW5rLm8gd2FpdHEubyBleHBpcmUubyBkZXYtaW9jdGwubwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCmluZGV4IDY5YTJmNWMuLmUwZjE2ZGEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKQEAgLTE0LDYgKzE0LDcgQEAKIC8qIEludGVybmFsIGhlYWRlciBmaWxlIGZvciBhdXRvZnMgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2F1dG9fZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvYXV0b19kZXYtaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtMjEsNiArMjIsMTEgQEAKICNkZWZpbmUgQVVUT0ZTX0lPQ19GSVJTVCAgICAgQVVUT0ZTX0lPQ19SRUFEWQogI2RlZmluZSBBVVRPRlNfSU9DX0NPVU5UICAgICAzMgogCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfSU9DX0ZJUlNUCShBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT04pCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfSU9DX0NPVU5UCShBVVRPRlNfSU9DX0NPVU5UIC0gMTEpCisKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfVFJJR0dFUgkoQVVUT0ZTX1RZUEVfRElSRUNUfEFVVE9GU19UWVBFX09GRlNFVCkKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC0zNSwxMSArNDEsMjcgQEAKIC8qICNkZWZpbmUgREVCVUcgKi8KIAogI2lmZGVmIERFQlVHCi0jZGVmaW5lIERQUklOVEsoZm10LGFyZ3MuLi4pIGRvIHsgcHJpbnRrKEtFUk5fREVCVUcgInBpZCAlZDogJXM6ICIgZm10ICJcbiIgLCBjdXJyZW50LT5waWQgLCBfX2Z1bmNfXyAsICMjYXJncyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCQkJCVwKK2RvIHsJCQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHICJwaWQgJWQ6ICVzOiAiIGZtdCAiXG4iLAlcCisJCWN1cnJlbnQtPnBpZCwgX19mdW5jX18sICMjYXJncyk7CVwKK30gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBEUFJJTlRLKGZtdCxhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAorI2RlZmluZSBBVVRPRlNfV0FSTihmbXQsIGFyZ3MuLi4pCQkJXAorZG8gewkJCQkJCQlcCisJcHJpbnRrKEtFUk5fV0FSTklORyAicGlkICVkOiAlczogIiBmbXQgIlxuIiwJXAorCQljdXJyZW50LT5waWQsIF9fZnVuY19fLCAjI2FyZ3MpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFVVE9GU19FUlJPUihmbXQsIGFyZ3MuLi4pCQkJXAorZG8gewkJCQkJCQlcCisJcHJpbnRrKEtFUk5fRVJSICJwaWQgJWQ6ICVzOiAiIGZtdCAiXG4iLAlcCisJCWN1cnJlbnQtPnBpZCwgX19mdW5jX18sICMjYXJncyk7CVwKK30gd2hpbGUgKDApCisKIC8qIFVuaWZpZWQgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzIHBvaW50ZWQgdG8gYnkgYm90aCB0aGUgZGVudHJ5IGFuZAogICAgaW5vZGUgc3RydWN0dXJlcy4gIEVhY2ggZmlsZSBpbiB0aGUgZmlsZXN5c3RlbSBoYXMgYW4gaW5zdGFuY2Ugb2YgdGhpcwogICAgc3RydWN0dXJlLiAgSXQgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGRlbnRyeSwgc28gZGVudHJpZXMgYXJlIG5ldmVyCkBAIC02MSw2ICs4Myw5IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3VzZWQ7CiAJYXRvbWljX3QgY291bnQ7CiAKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCiAJbW9kZV90CW1vZGU7CiAJc2l6ZV90CXNpemU7CiAKQEAgLTkyLDEwICsxMTcsNiBAQAogCiAjZGVmaW5lIEFVVE9GU19TQklfTUFHSUMgMHg2ZDRhNTU2ZAogCi0jZGVmaW5lIEFVVE9GU19UWVBFX0lORElSRUNUICAgICAweDAwMDEKLSNkZWZpbmUgQVVUT0ZTX1RZUEVfRElSRUNUICAgICAgIDB4MDAwMgotI2RlZmluZSBBVVRPRlNfVFlQRV9PRkZTRVQgICAgICAgMHgwMDA0Ci0KIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyB7CiAJdTMyIG1hZ2ljOwogCWludCBwaXBlZmQ7CkBAIC0xNjksNiArMTkwLDE3IEBACiAJCQlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgX191c2VyICopOwogaW50IGF1dG9mczRfZXhwaXJlX211bHRpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdmZzbW91bnQgKiwKIAkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqLCBpbnQgX191c2VyICopOworc3RydWN0IGRlbnRyeSAqYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCQkgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBpbnQgaG93KTsKK3N0cnVjdCBkZW50cnkgKmF1dG9mczRfZXhwaXJlX2luZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgaW50IGhvdyk7CisKKy8qIERldmljZSBub2RlIGluaXRpYWxpemF0aW9uICovCisKK2ludCBhdXRvZnNfZGV2X2lvY3RsX2luaXQodm9pZCk7Cit2b2lkIGF1dG9mc19kZXZfaW9jdGxfZXhpdCh2b2lkKTsKIAogLyogT3BlcmF0aW9ucyBzdHJ1Y3R1cmVzICovCiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWFiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCkBAIC0wLDAgKzEsODYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDggSWFuIEtlbnQgPHJhdmVuQHRoZW1hdy5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImF1dG9mc19pLmgiCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSBmb3Igcm91dGluZyBhdXRvZnMgaW9jdGwgY29udHJvbAorICogY29tbWFuZHMgdmlhIGEgbWlzY2VsbGFuZW91cyBkZXZpY2UgZmlsZS4KKyAqCisgKiBUaGUgYWx0ZXJuYXRlIGludGVyZmFjZSBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgb3BlbgorICogYW4gaW9jdGwgZmlsZSBkZXNjcmlwdG9yIG9uIGFuIGF1dG9mcyBtb3VudCB0aGF0IG1heSBiZSBjb3ZlcmVkIGJ5CisgKiBhbm90aGVyIG1vdW50LiBUaGlzIHNpdHVhdGlvbiBhcmlzZXMgd2hlbiBzdGFydGluZyBhdXRvbW91bnQoOCkKKyAqIG9yIG90aGVyIHVzZXIgc3BhY2UgZGFlbW9uIHdoaWNoIHVzZXMgZGlyZWN0IG1vdW50cyBvciBvZmZzZXQKKyAqIG1vdW50cyAodXNlZCBmb3IgYXV0b2ZzIGxhenkgbW91bnQvdW1vdW50IG9mIG5lc3RlZCBtb3VudCB0cmVlcyksCisgKiB3aGljaCBoYXZlIGJlZW4gbGVmdCBidXN5IGF0IGF0IHNlcnZpY2Ugc2h1dGRvd24uCisgKi8KKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX1NJWkUJc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKQorCit0eXBlZGVmIGludCAoKmlvY3RsX2ZuKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKiwKKwkJCXN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICopOworCitzdGF0aWMgaW50IGNoZWNrX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIXN0cmNocihuYW1lLCAnLycpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGEgc3RyaW5nIGRvZXNuJ3Qgb3ZlcnJ1biB0aGUgY2h1bmsgb2YKKyAqIG1lbW9yeSB3ZSBjb3BpZWQgZnJvbSB1c2VyIGxhbmQuCisgKi8KK3N0YXRpYyBpbnQgaW52YWxpZF9zdHIoY2hhciAqc3RyLCB2b2lkICplbmQpCit7CisJd2hpbGUgKCh2b2lkICopIHN0ciA8PSBlbmQpCisJCWlmICghKnN0cisrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSB1c2VyIGNvbXBpbGVkIGFnYWluc3QgY29ycmVjdCB2ZXJzaW9uIG9mIGF1dG9mcworICogbWlzYyBkZXZpY2UgY29kZS4KKyAqCisgKiBBcyB3ZWxsIGFzIGNoZWNraW5nIHRoZSB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgdGhpcyBhbHdheXMgY29waWVzCisgKiB0aGUga2VybmVsIGludGVyZmFjZSB2ZXJzaW9uIG91dC4KKyAqLworc3RhdGljIGludCBjaGVja19kZXZfaW9jdGxfdmVyc2lvbihpbnQgY21kLCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoKEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NQUpPUiAhPSBwYXJhbS0+dmVyX21ham9yKSB8fAorCSAgICAoQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX01JTk9SIDwgcGFyYW0tPnZlcl9taW5vcikpIHsKKwkJQVVUT0ZTX1dBUk4oImlvY3RsIGNvbnRyb2wgaW50ZXJmYWNlIHZlcnNpb24gbWlzbWF0Y2g6ICIKKwkJICAgICAia2VybmVsKCV1LiV1KSwgdXNlcigldS4ldSksIGNtZCglZCkiLAorCQkgICAgIEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NQUpPUiwKKwkJICAgICBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUlOT1IsCisJCSAgICAgcGFyYW0tPnZlcl9tYWpvciwgcGFyYW0tPnZlcl9taW5vciwgY21kKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSBrZXJuZWwgdmVyc2lvbi4gKi8KKwlwYXJhbS0+dmVyX21ham9yID0gQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX01BSk9SOworCXBhcmFtLT52ZXJfbWlub3IgPSBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUlOT1I7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ29weSBwYXJhbWV0ZXIgY29udHJvbCBzdHJ1Y3QsIGluY2x1ZGluZyBhIHBvc3NpYmxlIHBhdGggYWxsb2NhdGVkCisgKiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqY29weV9kZXZfaW9jdGwoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgX191c2VyICppbikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCB0bXAsICphZHM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgaW4sIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisKKwlpZiAodG1wLnNpemUgPCBzaXplb2YodG1wKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlhZHMgPSBrbWFsbG9jKHRtcC5zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkcykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYWRzLCBpbiwgdG1wLnNpemUpKSB7CisJCWtmcmVlKGFkcyk7CisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCX0KKworCXJldHVybiBhZHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2Rldl9pb2N0bChzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCit7CisJa2ZyZWUocGFyYW0pOworCXJldHVybjsKK30KKworLyoKKyAqIENoZWNrIHNhbml0eSBvZiBwYXJhbWV0ZXIgY29udHJvbCBmaWVsZHMgYW5kIGlmIGEgcGF0aCBpcyBwcmVzZW50CisgKiBjaGVjayB0aGF0IGl0IGhhcyBhICIvIiBhbmQgaXMgdGVybWluYXRlZC4KKyAqLworc3RhdGljIGludCB2YWxpZGF0ZV9kZXZfaW9jdGwoaW50IGNtZCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCisJaWYgKGNoZWNrX2Rldl9pb2N0bF92ZXJzaW9uKGNtZCwgcGFyYW0pKSB7CisJCUFVVE9GU19XQVJOKCJpbnZhbGlkIGRldmljZSBjb250cm9sIG1vZHVsZSB2ZXJzaW9uICIKKwkJICAgICAic3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwgY21kKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBhcmFtLT5zaXplID4gc2l6ZW9mKCpwYXJhbSkpIHsKKwkJZXJyID0gY2hlY2tfbmFtZShwYXJhbS0+cGF0aCk7CisJCWlmIChlcnIpIHsKKwkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKKwkJCQkgICAgY21kKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZXJyID0gaW52YWxpZF9zdHIocGFyYW0tPnBhdGgsCisJCQkJICh2b2lkICopICgoc2l6ZV90KSBwYXJhbSArIHBhcmFtLT5zaXplKSk7CisJCWlmIChlcnIpIHsKKwkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKKwkJCQkgICAgY21kKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyID0gMDsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogR2V0IHRoZSBhdXRvZnMgc3VwZXIgYmxvY2sgaW5mbyBzdHJ1Y3QgZnJvbSB0aGUgZmlsZSBvcGVuZWQgb24KKyAqIHRoZSBhdXRvZnMgbW91bnQgcG9pbnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKmF1dG9mc19kZXZfaW9jdGxfc2JpKHN0cnVjdCBmaWxlICpmKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKGYpIHsKKwkJaW5vZGUgPSBmLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCQlzYmkgPSBhdXRvZnM0X3NiaShpbm9kZS0+aV9zYik7CisJfQorCXJldHVybiBzYmk7Cit9CisKKy8qIFJldHVybiBhdXRvZnMgbW9kdWxlIHByb3RvY29sIHZlcnNpb24gKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9wcm90b3ZlcihzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlwYXJhbS0+YXJnMSA9IHNiaS0+dmVyc2lvbjsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIGF1dG9mcyBtb2R1bGUgcHJvdG9jb2wgc3ViIHZlcnNpb24gKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9wcm90b3N1YnZlcihzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCQlzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCit7CisJcGFyYW0tPmFyZzEgPSBzYmktPnN1Yl92ZXJzaW9uOworCXJldHVybiAwOworfQorCisvKgorICogV2FsayBkb3duIHRoZSBtb3VudCBzdGFjayBsb29raW5nIGZvciBhbiBhdXRvZnMgbW91bnQgdGhhdAorICogaGFzIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIG51bWJlciAoYWthLiBuZXdfZW5jb2RlX2RldihzYi0+c19kZXYpLgorICovCitzdGF0aWMgaW50IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcihzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgZGV2X3QgZGV2bm8pCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlkZXZfdCBzX2RldjsKKwl1bnNpZ25lZCBpbnQgZXJyOworCisJZXJyID0gLUVOT0VOVDsKKworCS8qIExvb2t1cCB0aGUgZGVudHJ5IG5hbWUgYXQgdGhlIGJhc2Ugb2Ygb3VyIG1vdW50IHBvaW50ICovCisJZGVudHJ5ID0gZF9sb29rdXAobmQtPnBhdGguZGVudHJ5LCAmbmQtPmxhc3QpOworCWlmICghZGVudHJ5KQorCQlnb3RvIG91dDsKKworCWRwdXQobmQtPnBhdGguZGVudHJ5KTsKKwluZC0+cGF0aC5kZW50cnkgPSBkZW50cnk7CisKKwkvKiBBbmQgZm9sbG93IHRoZSBtb3VudCBzdGFjayBsb29raW5nIGZvciBvdXIgYXV0b2ZzIG1vdW50ICovCisJd2hpbGUgKGZvbGxvd19kb3duKCZuZC0+cGF0aC5tbnQsICZuZC0+cGF0aC5kZW50cnkpKSB7CisJCWlub2RlID0gbmQtPnBhdGguZGVudHJ5LT5kX2lub2RlOworCQlpZiAoIWlub2RlKQorCQkJYnJlYWs7CisKKwkJc2IgPSBpbm9kZS0+aV9zYjsKKwkJc19kZXYgPSBuZXdfZW5jb2RlX2RldihzYi0+c19kZXYpOworCQlpZiAoZGV2bm8gPT0gc19kZXYpIHsKKwkJCWlmIChzYi0+c19tYWdpYyA9PSBBVVRPRlNfU1VQRVJfTUFHSUMpIHsKKwkJCQllcnIgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXYWxrIGRvd24gdGhlIG1vdW50IHN0YWNrIGxvb2tpbmcgZm9yIGFuIGF1dG9mcyBtb3VudCB0aGF0CisgKiBoYXMgdGhlIHJlcXVlc3RlZCBtb3VudCB0eXBlIChpZS4gaW5kaXJlY3QsIGRpcmVjdCBvciBvZmZzZXQpLgorICovCitzdGF0aWMgaW50IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zYmlfdHlwZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vOworCXVuc2lnbmVkIGludCBlcnI7CisKKwllcnIgPSAtRU5PRU5UOworCisJLyogTG9va3VwIHRoZSBkZW50cnkgbmFtZSBhdCB0aGUgYmFzZSBvZiBvdXIgbW91bnQgcG9pbnQgKi8KKwlkZW50cnkgPSBkX2xvb2t1cChuZC0+cGF0aC5kZW50cnksICZuZC0+bGFzdCk7CisJaWYgKCFkZW50cnkpCisJCWdvdG8gb3V0OworCisJZHB1dChuZC0+cGF0aC5kZW50cnkpOworCW5kLT5wYXRoLmRlbnRyeSA9IGRlbnRyeTsKKworCS8qIEFuZCBmb2xsb3cgdGhlIG1vdW50IHN0YWNrIGxvb2tpbmcgZm9yIG91ciBhdXRvZnMgbW91bnQgKi8KKwl3aGlsZSAoZm9sbG93X2Rvd24oJm5kLT5wYXRoLm1udCwgJm5kLT5wYXRoLmRlbnRyeSkpIHsKKwkJaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKG5kLT5wYXRoLmRlbnRyeSk7CisJCWlmIChpbm8gJiYgaW5vLT5zYmktPnR5cGUgJiB0eXBlKSB7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzX2Rldl9pb2N0bF9mZF9pbnN0YWxsKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlCVUdfT04oZmR0LT5mZFtmZF0gIT0gTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBmaWxlKTsKKwlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworfQorCisKKy8qCisgKiBPcGVuIGEgZmlsZSBkZXNjcmlwdG9yIG9uIHRoZSBhdXRvZnMgbW91bnQgcG9pbnQgY29ycmVzcG9uZGluZworICogdG8gdGhlIGdpdmVuIHBhdGggYW5kIGRldmljZSBudW1iZXIgKGFrYS4gbmV3X2VuY29kZV9kZXYoc2ItPnNfZGV2KSkuCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9vcGVuX21vdW50cG9pbnQoY29uc3QgY2hhciAqcGF0aCwgZGV2X3QgZGV2aWQpCit7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyLCBmZDsKKworCWZkID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChsaWtlbHkoZmQgPj0gMCkpIHsKKwkJLyogR2V0IG5hbWVpZGF0YSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSAqLworCQllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogU2VhcmNoIGRvd24sIHdpdGhpbiB0aGUgcGFyZW50LCBsb29raW5nIGZvciBhbgorCQkgKiBhdXRvZnMgc3VwZXIgYmxvY2sgdGhhdCBoYXMgdGhlIGRldmljZSBudW1iZXIKKwkJICogY29ycmVzcG9uZGluZyB0byB0aGUgYXV0b2ZzIGZzIHdlIHdhbnQgdG8gb3Blbi4KKwkJICovCisJCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcigmbmQsIGRldmlkKTsKKwkJaWYgKGVycikgeworCQkJcGF0aF9wdXQoJm5kLnBhdGgpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmaWxwID0gZGVudHJ5X29wZW4obmQucGF0aC5kZW50cnksIG5kLnBhdGgubW50LCBPX1JET05MWSk7CisJCWlmIChJU19FUlIoZmlscCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlscCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWF1dG9mc19kZXZfaW9jdGxfZmRfaW5zdGFsbChmZCwgZmlscCk7CisJfQorCisJcmV0dXJuIGZkOworCitvdXQ6CisJcHV0X3VudXNlZF9mZChmZCk7CisJcmV0dXJuIGVycjsKK30KKworLyogT3BlbiBhIGZpbGUgZGVzY3JpcHRvciBvbiBhbiBhdXRvZnMgbW91bnQgcG9pbnQgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9vcGVubW91bnQoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCWRldl90IGRldmlkOworCWludCBlcnIsIGZkOworCisJLyogcGFyYW0tPnBhdGggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkICovCisJaWYgKCFwYXJhbS0+YXJnMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJhbS0+aW9jdGxmZCA9IC0xOworCisJcGF0aCA9IHBhcmFtLT5wYXRoOworCWRldmlkID0gcGFyYW0tPmFyZzE7CisKKwllcnIgPSAwOworCWZkID0gYXV0b2ZzX2Rldl9pb2N0bF9vcGVuX21vdW50cG9pbnQocGF0aCwgZGV2aWQpOworCWlmICh1bmxpa2VseShmZCA8IDApKSB7CisJCWVyciA9IGZkOworCQlnb3RvIG91dDsKKwl9CisKKwlwYXJhbS0+aW9jdGxmZCA9IGZkOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIENsb3NlIGZpbGUgZGVzY3JpcHRvciBhbGxvY2F0ZWQgYWJvdmUgKHVzZXIgY2FuIGFsc28gdXNlIGNsb3NlKDIpKS4gKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9jbG9zZW1vdW50KHN0cnVjdCBmaWxlICpmcCwKKwkJCQkgICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlyZXR1cm4gc3lzX2Nsb3NlKHBhcmFtLT5pb2N0bGZkKTsKK30KKworLyoKKyAqIFNlbmQgInJlYWR5IiBzdGF0dXMgZm9yIGFuIGV4aXN0aW5nIHdhaXQgKGVpdGhlciBhIG1vdW50IG9yIGFuIGV4cGlyZQorICogcmVxdWVzdCkuCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9yZWFkeShzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlhdXRvZnNfd3F0X3QgdG9rZW47CisKKwl0b2tlbiA9IChhdXRvZnNfd3F0X3QpIHBhcmFtLT5hcmcxOworCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksIHRva2VuLCAwKTsKK30KKworLyoKKyAqIFNlbmQgImZhaWwiIHN0YXR1cyBmb3IgYW4gZXhpc3Rpbmcgd2FpdCAoZWl0aGVyIGEgbW91bnQgb3IgYW4gZXhwaXJlCisgKiByZXF1ZXN0KS4KKyAqLworc3RhdGljIGludCBhdXRvZnNfZGV2X2lvY3RsX2ZhaWwoc3RydWN0IGZpbGUgKmZwLAorCQkJCSBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQoreworCWF1dG9mc193cXRfdCB0b2tlbjsKKwlpbnQgc3RhdHVzOworCisJdG9rZW4gPSAoYXV0b2ZzX3dxdF90KSBwYXJhbS0+YXJnMTsKKwlzdGF0dXMgPSBwYXJhbS0+YXJnMiA/IHBhcmFtLT5hcmcyIDogLUVOT0VOVDsKKwlyZXR1cm4gYXV0b2ZzNF93YWl0X3JlbGVhc2Uoc2JpLCB0b2tlbiwgc3RhdHVzKTsKK30KKworLyoKKyAqIFNldCB0aGUgcGlwZSBmZCBmb3Iga2VybmVsIGNvbW11bmljYXRpb24gdG8gdGhlIGRhZW1vbi4KKyAqCisgKiBOb3JtYWxseSB0aGlzIGlzIHNldCBhdCBtb3VudCB1c2luZyBhbiBvcHRpb24gYnV0IGlmIHdlCisgKiBhcmUgcmVjb25uZWN0aW5nIHRvIGEgYnVzeSBtb3VudCB0aGVuIHdlIG5lZWQgdG8gdXNlIHRoaXMKKyAqIHRvIHRlbGwgdGhlIGF1dG9mcyBtb3VudCBhYm91dCB0aGUgbmV3IGtlcm5lbCBwaXBlIGZkLiBJbgorICogb3JkZXIgdG8gcHJvdGVjdCBtb3VudHMgYWdhaW5zdCBpbmNvcnJlY3RseSBzZXR0aW5nIHRoZQorICogcGlwZWZkIHdlIGFsc28gcmVxdWlyZSB0aGF0IHRoZSBhdXRvZnMgbW91bnQgYmUgY2F0YXRvbmljLgorICoKKyAqIFRoaXMgYWxzbyBzZXRzIHRoZSBwcm9jZXNzIGdyb3VwIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgKiBjb250cm9sbGluZyBwcm9jZXNzIChlZy4gdGhlIG93bmluZyBhdXRvbW91bnQoOCkgZGFlbW9uKS4KKyAqLworc3RhdGljIGludCBhdXRvZnNfZGV2X2lvY3RsX3NldHBpcGVmZChzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICAgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQoreworCWludCBwaXBlZmQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGFyYW0tPmFyZzEgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCisJcGlwZWZkID0gcGFyYW0tPmFyZzE7CisKKwltdXRleF9sb2NrKCZzYmktPndxX211dGV4KTsKKwlpZiAoIXNiaS0+Y2F0YXRvbmljKSB7CisJCW11dGV4X3VubG9jaygmc2JpLT53cV9tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZpbGUgKnBpcGUgPSBmZ2V0KHBpcGVmZCk7CisJCWlmICghcGlwZS0+Zl9vcCB8fCAhcGlwZS0+Zl9vcC0+d3JpdGUpIHsKKwkJCWVyciA9IC1FUElQRTsKKwkJCWZwdXQocGlwZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzYmktPm96X3BncnAgPSB0YXNrX3BncnBfbnIoY3VycmVudCk7CisJCXNiaS0+cGlwZWZkID0gcGlwZWZkOworCQlzYmktPnBpcGUgPSBwaXBlOworCQlzYmktPmNhdGF0b25pYyA9IDA7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmc2JpLT53cV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE1ha2UgdGhlIGF1dG9mcyBtb3VudCBwb2ludCBjYXRhdG9uaWMsIG5vIGxvbmdlciByZXNwb25zaXZlIHRvCisgKiBtb3VudCByZXF1ZXN0cy4gQWxzbyBjbG9zZXMgdGhlIGtlcm5lbCBwaXBlIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIGludCBhdXRvZnNfZGV2X2lvY3RsX2NhdGF0b25pYyhzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICAgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQoreworCWF1dG9mczRfY2F0YXRvbmljX21vZGUoc2JpKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSBhdXRvZnMgbW91bnQgdGltZW91dCAqLworc3RhdGljIGludCBhdXRvZnNfZGV2X2lvY3RsX3RpbWVvdXQoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgICAgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXRpbWVvdXQgPSBwYXJhbS0+YXJnMTsKKwlwYXJhbS0+YXJnMSA9IHNiaS0+ZXhwX3RpbWVvdXQgLyBIWjsKKwlzYmktPmV4cF90aW1lb3V0ID0gdGltZW91dCAqIEhaOworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIHRoZSB1aWQgYW5kIGdpZCBvZiB0aGUgbGFzdCByZXF1ZXN0IGZvciB0aGUgbW91bnQKKyAqCisgKiBXaGVuIHJlY29uc3RydWN0aW5nIGFuIGF1dG9mcyBtb3VudCB0cmVlIHdpdGggYWN0aXZlIG1vdW50cworICogd2UgbmVlZCB0byByZS1jb25uZWN0IHRvIG1vdW50cyB0aGF0IG1heSBoYXZlIHVzZWQgdGhlIG9yaWdpbmFsCisgKiBwcm9jZXNzIHVpZCBhbmQgZ2lkIChvciBzdHJpbmcgdmFyaWF0aW9ucyBvZiB0aGVtKSBmb3IgbW91bnQKKyAqIGxvb2t1cHMgd2l0aGluIHRoZSBtYXAgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9yZXF1ZXN0ZXIoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWNvbnN0IGNoYXIgKnBhdGg7CisJZGV2X3QgZGV2aWQ7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlpZiAocGFyYW0tPnNpemUgPD0gc2l6ZW9mKCpwYXJhbSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGF0aCA9IHBhcmFtLT5wYXRoOworCWRldmlkID0gc2JpLT5zYi0+c19kZXY7CisKKwlwYXJhbS0+YXJnMSA9IHBhcmFtLT5hcmcyID0gLTE7CisKKwkvKiBHZXQgbmFtZWlkYXRhIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcigmbmQsIGRldmlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKG5kLnBhdGguZGVudHJ5KTsKKwlpZiAoaW5vKSB7CisJCWVyciA9IDA7CisJCWF1dG9mczRfZXhwaXJlX3dhaXQobmQucGF0aC5kZW50cnkpOworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CisJCXBhcmFtLT5hcmcxID0gaW5vLT51aWQ7CisJCXBhcmFtLT5hcmcyID0gaW5vLT5naWQ7CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOworCX0KKworb3V0X3JlbGVhc2U6CisJcGF0aF9wdXQoJm5kLnBhdGgpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsIHJlcGVhdGVkbHkgdW50aWwgaXQgcmV0dXJucyAtRUFHQUlOLCBtZWFuaW5nIHRoZXJlJ3Mgbm90aGluZworICogbW9yZSB0aGF0IGNhbiBiZSBkb25lLgorICovCitzdGF0aWMgaW50IGF1dG9mc19kZXZfaW9jdGxfZXhwaXJlKHN0cnVjdCBmaWxlICpmcCwKKwkJCQkgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgICBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCWludCBlcnIgPSAtRUFHQUlOOworCWludCBob3c7CisKKwlob3cgPSBwYXJhbS0+YXJnMTsKKwltbnQgPSBmcC0+Zl9wYXRoLm1udDsKKworCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQorCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9kaXJlY3Qoc2JpLT5zYiwgbW50LCBzYmksIGhvdyk7CisJZWxzZQorCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzYmktPnNiLCBtbnQsIHNiaSwgaG93KTsKKworCWlmIChkZW50cnkpIHsKKwkJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKworCQkvKgorCQkgKiBUaGlzIGlzIHN5bmNocm9ub3VzIGJlY2F1c2UgaXQgbWFrZXMgdGhlIGRhZW1vbiBhCisJCSAqIGxpdHRsZSBlYXNpZXIKKwkJKi8KKwkJZXJyID0gYXV0b2ZzNF93YWl0KHNiaSwgZGVudHJ5LCBORllfRVhQSVJFKTsKKworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CisJCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9NT1VOVFBPSU5UKSB7CisJCQlpbm8tPmZsYWdzICY9IH5BVVRPRlNfSU5GX01PVU5UUE9JTlQ7CisJCQlzYmktPnNiLT5zX3Jvb3QtPmRfbW91bnRlZCsrOworCQl9CisJCWluby0+ZmxhZ3MgJj0gfkFVVE9GU19JTkZfRVhQSVJJTkc7CisJCWNvbXBsZXRlX2FsbCgmaW5vLT5leHBpcmVfY29tcGxldGUpOworCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKKwkJZHB1dChkZW50cnkpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIENoZWNrIGlmIGF1dG9mcyBtb3VudCBwb2ludCBpcyBpbiB1c2UgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX2Rldl9pb2N0bF9hc2t1bW91bnQoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlwYXJhbS0+YXJnMSA9IDA7CisJaWYgKG1heV91bW91bnQoZnAtPmZfcGF0aC5tbnQpKQorCQlwYXJhbS0+YXJnMSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhIG1vdW50cG9pbnQuCisgKgorICogSWYgd2UgYXJlIHN1cHBsaWVkIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBhdXRvZnMKKyAqIG1vdW50IHdlJ3JlIGxvb2tpbmcgZm9yIGEgc3BlY2lmaWMgbW91bnQuIEluIHRoaXMgY2FzZQorICogdGhlIHBhdGggaXMgY29uc2lkZXJlZCBhIG1vdW50cG9pbnQgaWYgaXQgaXMgaXRzZWxmIGEKKyAqIG1vdW50cG9pbnQgb3IgY29udGFpbnMgYSBtb3VudCwgc3VjaCBhcyBhIG11bHRpLW1vdW50CisgKiB3aXRob3V0IGEgcm9vdCBtb3VudC4gSW4gdGhpcyBjYXNlIHdlIHJldHVybiAxIGlmIHRoZQorICogcGF0aCBpcyBhIG1vdW50IHBvaW50IGFuZCB0aGUgc3VwZXIgbWFnaWMgb2YgdGhlIGNvdmVyaW5nCisgKiBtb3VudCBpZiB0aGVyZSBpcyBvbmUgb3IgMCBpZiBpdCBpc24ndCBhIG1vdW50cG9pbnQuCisgKgorICogSWYgd2UgYXJlbid0IHN1cHBsaWVkIHdpdGggYSBmaWxlIGRlc2NyaXB0b3IgdGhlbiB3ZQorICogbG9va3VwIHRoZSBuYW1laWRhdGEgb2YgdGhlIHBhdGggYW5kIGNoZWNrIGlmIGl0IGlzIHRoZQorICogcm9vdCBvZiBhIG1vdW50LiBJZiBhIHR5cGUgaXMgZ2l2ZW4gd2UgYXJlIGxvb2tpbmcgZm9yCisgKiBhIHBhcnRpY3VsYXIgYXV0b2ZzIG1vdW50IGFuZCBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gKKyAqIHdlIHJldHVybiBmYWlsLiBJZiB0aGUgbG9jYXRlZCBuYW1laWRhdGEgcGF0aCBpcyB0aGUKKyAqIHJvb3Qgb2YgYSBtb3VudCB3ZSByZXR1cm4gMSBhbG9uZyB3aXRoIHRoZSBzdXBlciBtYWdpYworICogb2YgdGhlIG1vdW50IG9yIDAgb3RoZXJ3aXNlLgorICoKKyAqIEluIGJvdGggY2FzZXMgdGhlIHRoZSBkZXZpY2UgbnVtYmVyIChhcyByZXR1cm5lZCBieQorICogbmV3X2VuY29kZV9kZXYoKSkgaXMgYWxzbyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBhdXRvZnNfZGV2X2lvY3RsX2lzbW91bnRwb2ludChzdHJ1Y3QgZmlsZSAqZnAsCisJCQkJCSBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkJIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWNvbnN0IGNoYXIgKnBhdGg7CisJdW5zaWduZWQgaW50IHR5cGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlpZiAocGFyYW0tPnNpemUgPD0gc2l6ZW9mKCpwYXJhbSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGF0aCA9IHBhcmFtLT5wYXRoOworCXR5cGUgPSBwYXJhbS0+YXJnMTsKKworCXBhcmFtLT5hcmcxID0gMDsKKwlwYXJhbS0+YXJnMiA9IDA7CisKKwlpZiAoIWZwIHx8IHBhcmFtLT5pb2N0bGZkID09IC0xKSB7CisJCWlmICh0eXBlID09IEFVVE9GU19UWVBFX0FOWSkgeworCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCQkJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCXNiID0gbmQucGF0aC5kZW50cnktPmRfc2I7CisJCQlwYXJhbS0+YXJnMSA9IG5ld19lbmNvZGVfZGV2KHNiLT5zX2Rldik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKKworCQkJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zYmlfdHlwZSgmbmQsIHR5cGUpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9yZWxlYXNlOworCisJCQlpbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8obmQucGF0aC5kZW50cnkpOworCQkJcGFyYW0tPmFyZzEgPSBhdXRvZnM0X2dldF9kZXYoaW5vLT5zYmkpOworCQl9CisKKwkJZXJyID0gMDsKKwkJaWYgKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlICYmCisJCSAgICBuZC5wYXRoLm1udC0+bW50X3Jvb3QgPT0gbmQucGF0aC5kZW50cnkpIHsKKwkJCWVyciA9IDE7CisJCQlwYXJhbS0+YXJnMiA9IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21hZ2ljOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3QgZGV2aWQgPSBuZXdfZW5jb2RlX2RldihzYmktPnNiLT5zX2Rldik7CisKKwkJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcigmbmQsIGRldmlkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CisKKwkJcGFyYW0tPmFyZzEgPSBhdXRvZnM0X2dldF9kZXYoc2JpKTsKKworCQllcnIgPSBoYXZlX3N1Ym1vdW50cyhuZC5wYXRoLmRlbnRyeSk7CisKKwkJaWYgKG5kLnBhdGgubW50LT5tbnRfbW91bnRwb2ludCAhPSBuZC5wYXRoLm1udC0+bW50X3Jvb3QpIHsKKwkJCWlmIChmb2xsb3dfZG93bigmbmQucGF0aC5tbnQsICZuZC5wYXRoLmRlbnRyeSkpIHsKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGU7CisJCQkJcGFyYW0tPmFyZzIgPSBpbm9kZS0+aV9zYi0+c19tYWdpYzsKKwkJCX0KKwkJfQorCX0KKworb3V0X3JlbGVhc2U6CisJcGF0aF9wdXQoJm5kLnBhdGgpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBPdXIgcmFuZ2Ugb2YgaW9jdGwgbnVtYmVycyBpc24ndCAwIGJhc2VkIHNvIHdlIG5lZWQgdG8gc2hpZnQKKyAqIHRoZSBhcnJheSBpbmRleCBieSBfSU9DX05SKEFVVE9GU19DVExfSU9DX0ZJUlNUKSBmb3IgdGhlIHRhYmxlCisgKiBsb29rdXAuCisgKi8KKyNkZWZpbmUgY21kX2lkeChjbWQpCShjbWQgLSBfSU9DX05SKEFVVE9GU19ERVZfSU9DVExfSU9DX0ZJUlNUKSkKKworc3RhdGljIGlvY3RsX2ZuIGxvb2t1cF9kZXZfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJaW50IGNtZDsKKwkJaW9jdGxfZm4gZm47CisJfSBfaW9jdGxzW10gPSB7CisJCXtjbWRfaWR4KEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9DTUQpLCBOVUxMfSwKKwkJe2NtZF9pZHgoQVVUT0ZTX0RFVl9JT0NUTF9QUk9UT1ZFUl9DTUQpLAorCQkJIGF1dG9mc19kZXZfaW9jdGxfcHJvdG92ZXJ9LAorCQl7Y21kX2lkeChBVVRPRlNfREVWX0lPQ1RMX1BST1RPU1VCVkVSX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF9wcm90b3N1YnZlcn0sCisJCXtjbWRfaWR4KEFVVE9GU19ERVZfSU9DVExfT1BFTk1PVU5UX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF9vcGVubW91bnR9LAorCQl7Y21kX2lkeChBVVRPRlNfREVWX0lPQ1RMX0NMT1NFTU9VTlRfQ01EKSwKKwkJCSBhdXRvZnNfZGV2X2lvY3RsX2Nsb3NlbW91bnR9LAorCQl7Y21kX2lkeChBVVRPRlNfREVWX0lPQ1RMX1JFQURZX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF9yZWFkeX0sCisJCXtjbWRfaWR4KEFVVE9GU19ERVZfSU9DVExfRkFJTF9DTUQpLAorCQkJIGF1dG9mc19kZXZfaW9jdGxfZmFpbH0sCisJCXtjbWRfaWR4KEFVVE9GU19ERVZfSU9DVExfU0VUUElQRUZEX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF9zZXRwaXBlZmR9LAorCQl7Y21kX2lkeChBVVRPRlNfREVWX0lPQ1RMX0NBVEFUT05JQ19DTUQpLAorCQkJIGF1dG9mc19kZXZfaW9jdGxfY2F0YXRvbmljfSwKKwkJe2NtZF9pZHgoQVVUT0ZTX0RFVl9JT0NUTF9USU1FT1VUX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF90aW1lb3V0fSwKKwkJe2NtZF9pZHgoQVVUT0ZTX0RFVl9JT0NUTF9SRVFVRVNURVJfQ01EKSwKKwkJCSBhdXRvZnNfZGV2X2lvY3RsX3JlcXVlc3Rlcn0sCisJCXtjbWRfaWR4KEFVVE9GU19ERVZfSU9DVExfRVhQSVJFX0NNRCksCisJCQkgYXV0b2ZzX2Rldl9pb2N0bF9leHBpcmV9LAorCQl7Y21kX2lkeChBVVRPRlNfREVWX0lPQ1RMX0FTS1VNT1VOVF9DTUQpLAorCQkJIGF1dG9mc19kZXZfaW9jdGxfYXNrdW1vdW50fSwKKwkJe2NtZF9pZHgoQVVUT0ZTX0RFVl9JT0NUTF9JU01PVU5UUE9JTlRfQ01EKSwKKwkJCSBhdXRvZnNfZGV2X2lvY3RsX2lzbW91bnRwb2ludH0KKwl9OworCXVuc2lnbmVkIGludCBpZHggPSBjbWRfaWR4KGNtZCk7CisKKwlyZXR1cm4gKGlkeCA+PSBBUlJBWV9TSVpFKF9pb2N0bHMpKSA/IE5VTEwgOiBfaW9jdGxzW2lkeF0uZm47Cit9CisKKy8qIGlvY3RsIGRpc3BhdGNoZXIgKi8KK3N0YXRpYyBpbnQgX2F1dG9mc19kZXZfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIF9fdXNlciAqdXNlcikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW07CisJc3RydWN0IGZpbGUgKmZwOworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGludCBjbWRfZmlyc3QsIGNtZDsKKwlpb2N0bF9mbiBmbiA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwkvKiBvbmx5IHJvb3QgY2FuIHBsYXkgd2l0aCB0aGlzICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJY21kX2ZpcnN0ID0gX0lPQ19OUihBVVRPRlNfREVWX0lPQ1RMX0lPQ19GSVJTVCk7CisJY21kID0gX0lPQ19OUihjb21tYW5kKTsKKworCWlmIChfSU9DX1RZUEUoY29tbWFuZCkgIT0gX0lPQ19UWVBFKEFVVE9GU19ERVZfSU9DVExfSU9DX0ZJUlNUKSB8fAorCSAgICBjbWQgLSBjbWRfZmlyc3QgPj0gQVVUT0ZTX0RFVl9JT0NUTF9JT0NfQ09VTlQpIHsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJLyogQ29weSB0aGUgcGFyYW1ldGVycyBpbnRvIGtlcm5lbCBzcGFjZS4gKi8KKwlwYXJhbSA9IGNvcHlfZGV2X2lvY3RsKHVzZXIpOworCWlmIChJU19FUlIocGFyYW0pKQorCQlyZXR1cm4gUFRSX0VSUihwYXJhbSk7CisKKwllcnIgPSB2YWxpZGF0ZV9kZXZfaW9jdGwoY29tbWFuZCwgcGFyYW0pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogVGhlIHZhbGlkYXRlIHJvdXRpbmUgYWJvdmUgYWx3YXlzIHNldHMgdGhlIHZlcnNpb24gKi8KKwlpZiAoY21kID09IEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9DTUQpCisJCWdvdG8gZG9uZTsKKworCWZuID0gbG9va3VwX2Rldl9pb2N0bChjbWQpOworCWlmICghZm4pIHsKKwkJQVVUT0ZTX1dBUk4oInVua25vd24gY29tbWFuZCAweCUwOHgiLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJZnAgPSBOVUxMOworCXNiaSA9IE5VTEw7CisKKwkvKgorCSAqIEZvciBvYnZpb3VzIHJlYXNvbnMgdGhlIG9wZW5tb3VudCBjYW4ndCBoYXZlIGEgZmlsZQorCSAqIGRlc2NyaXB0b3IgeWV0LiBXZSBkb24ndCB0YWtlIGEgcmVmZXJlbmNlIHRvIHRoZQorCSAqIGZpbGUgZHVyaW5nIGNsb3NlIHRvIGFsbG93IGZvciBpbW1lZGlhdGUgcmVsZWFzZS4KKwkgKi8KKwlpZiAoY21kICE9IEFVVE9GU19ERVZfSU9DVExfT1BFTk1PVU5UX0NNRCAmJgorCSAgICBjbWQgIT0gQVVUT0ZTX0RFVl9JT0NUTF9DTE9TRU1PVU5UX0NNRCkgeworCQlmcCA9IGZnZXQocGFyYW0tPmlvY3RsZmQpOworCQlpZiAoIWZwKSB7CisJCQlpZiAoY21kID09IEFVVE9GU19ERVZfSU9DVExfSVNNT1VOVFBPSU5UX0NNRCkKKwkJCQlnb3RvIGNvbnQ7CisJCQllcnIgPSAtRUJBREY7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghZnAtPmZfb3ApIHsKKwkJCWVyciA9IC1FTk9UVFk7CisJCQlmcHV0KGZwKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc2JpID0gYXV0b2ZzX2Rldl9pb2N0bF9zYmkoZnApOworCQlpZiAoIXNiaSB8fCBzYmktPm1hZ2ljICE9IEFVVE9GU19TQklfTUFHSUMpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlmcHV0KGZwKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogQWRtaW4gbmVlZHMgdG8gYmUgYWJsZSB0byBzZXQgdGhlIG1vdW50IGNhdGF0b25pYyBpbgorCQkgKiBvcmRlciB0byBiZSBhYmxlIHRvIHBlcmZvcm0gdGhlIHJlLW9wZW4uCisJCSAqLworCQlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpICYmCisJCSAgICBjbWQgIT0gQVVUT0ZTX0RFVl9JT0NUTF9DQVRBVE9OSUNfQ01EKSB7CisJCQllcnIgPSAtRUFDQ0VTOworCQkJZnB1dChmcCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK2NvbnQ6CisJZXJyID0gZm4oZnAsIHNiaSwgcGFyYW0pOworCisJaWYgKGZwKQorCQlmcHV0KGZwKTsKK2RvbmU6CisJaWYgKGVyciA+PSAwICYmIGNvcHlfdG9fdXNlcih1c2VyLCBwYXJhbSwgQVVUT0ZTX0RFVl9JT0NUTF9TSVpFKSkKKwkJZXJyID0gLUVGQVVMVDsKK291dDoKKwlmcmVlX2Rldl9pb2N0bChwYXJhbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGxvbmcgYXV0b2ZzX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdWludCBjb21tYW5kLCB1bG9uZyB1KQoreworCWludCBlcnI7CisJZXJyID0gX2F1dG9mc19kZXZfaW9jdGwoY29tbWFuZCwgKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIF9fdXNlciAqKSB1KTsKKwlyZXR1cm4gKGxvbmcpIGVycjsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGF1dG9mc19kZXZfaW9jdGxfY29tcGF0KHN0cnVjdCBmaWxlICpmaWxlLCB1aW50IGNvbW1hbmQsIHVsb25nIHUpCit7CisJcmV0dXJuIChsb25nKSBhdXRvZnNfZGV2X2lvY3RsKGZpbGUsIGNvbW1hbmQsICh1bG9uZykgY29tcGF0X3B0cih1KSk7Cit9CisjZWxzZQorI2RlZmluZSBhdXRvZnNfZGV2X2lvY3RsX2NvbXBhdCBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgX2Rldl9pb2N0bF9mb3BzID0geworCS51bmxvY2tlZF9pb2N0bAkgPSBhdXRvZnNfZGV2X2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSBhdXRvZnNfZGV2X2lvY3RsX2NvbXBhdCwKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgX2F1dG9mc19kZXZfaW9jdGxfbWlzYyA9IHsKKwkubWlub3IgCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSAgCQk9IEFVVE9GU19ERVZJQ0VfTkFNRSwKKwkuZm9wcyAgCQk9ICZfZGV2X2lvY3RsX2ZvcHMKK307CisKKy8qIFJlZ2lzdGVyL2RlcmVnaXN0ZXIgbWlzYyBjaGFyYWN0ZXIgZGV2aWNlICovCitpbnQgYXV0b2ZzX2Rldl9pb2N0bF9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gbWlzY19yZWdpc3RlcigmX2F1dG9mc19kZXZfaW9jdGxfbWlzYyk7CisJaWYgKHIpIHsKKwkJQVVUT0ZTX0VSUk9SKCJtaXNjX3JlZ2lzdGVyIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXV0b2ZzX2Rldl9pb2N0bF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZfYXV0b2ZzX2Rldl9pb2N0bF9taXNjKTsKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IGNkYWJiNzkuLmNkZTJmOGUgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtMjQ0LDEwICsyNDQsMTAgQEAKIH0KIAogLyogQ2hlY2sgaWYgd2UgY2FuIGV4cGlyZSBhIGRpcmVjdCBtb3VudCAocG9zc2libHkgYSB0cmVlKSAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mczRfZXhwaXJlX2RpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQkgICAgc3RydWN0IHZmc21vdW50ICptbnQsCi0JCQkJCSAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKLQkJCQkJICAgIGludCBob3cpCitzdHJ1Y3QgZGVudHJ5ICphdXRvZnM0X2V4cGlyZV9kaXJlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICBpbnQgaG93KQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gZGdldChzYi0+c19yb290KTsKQEAgLTI4MywxMCArMjgzLDEwIEBACiAgKiAgLSBpdCBpcyB1bnVzZWQgYnkgYW55IHVzZXIgcHJvY2VzcwogICogIC0gaXQgaGFzIGJlZW4gdW51c2VkIGZvciBleHBfdGltZW91dCB0aW1lCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKLQkJCQkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCi0JCQkJCSAgICAgIGludCBob3cpCitzdHJ1Y3QgZGVudHJ5ICphdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCQkgICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICAgIGludCBob3cpCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYi0+c19yb290OwpAQCAtNDc5LDcgKzQ3OSw3IEBACiAJaWYgKGFyZyAmJiBnZXRfdXNlcihkb19ub3csIGFyZykpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX0RJUkVDVCkKKwlpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKIAllbHNlCiAJCWRlbnRyeSA9IGF1dG9mczRfZXhwaXJlX2luZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5pdC5jIGIvZnMvYXV0b2ZzNC9pbml0LmMKaW5kZXggNzIzYTFjNWUuLjk3MjJlNGIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5pdC5jCisrKyBiL2ZzL2F1dG9mczQvaW5pdC5jCkBAIC0yOSwxMSArMjksMjAgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9hdXRvZnM0X2ZzKHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1dG9mc19mc190eXBlKTsKKwlpbnQgZXJyOworCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYXV0b2ZzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlhdXRvZnNfZGV2X2lvY3RsX2luaXQoKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2F1dG9mczRfZnModm9pZCkKIHsKKwlhdXRvZnNfZGV2X2lvY3RsX2V4aXQoKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1dG9mc19mc190eXBlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbm9kZS5jIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCmluZGV4IDdiYjNlNWIuLmM3ZTY1YmIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5vZGUuYworKysgYi9mcy9hdXRvZnM0L2lub2RlLmMKQEAgLTUzLDYgKzUzLDggQEAKIAkJYXRvbWljX3NldCgmaW5vLT5jb3VudCwgMCk7CiAJfQogCisJaW5vLT51aWQgPSAwOworCWluby0+Z2lkID0gMDsKIAlpbm8tPm1vZGUgPSBtb2RlOwogCWluby0+bGFzdF91c2VkID0gamlmZmllczsKIApAQCAtMjEzLDcgKzIxNSw3IEBACiBlbnVtIHtPcHRfZXJyLCBPcHRfZmQsIE9wdF91aWQsIE9wdF9naWQsIE9wdF9wZ3JwLCBPcHRfbWlucHJvdG8sIE9wdF9tYXhwcm90bywKIAlPcHRfaW5kaXJlY3QsIE9wdF9kaXJlY3QsIE9wdF9vZmZzZXR9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9mZCwgImZkPSV1In0sCiAJe09wdF91aWQsICJ1aWQ9JXUifSwKIAl7T3B0X2dpZCwgImdpZD0ldSJ9LApAQCAtMjg4LDcgKzI5MCw3IEBACiAJCQkqdHlwZSA9IEFVVE9GU19UWVBFX0RJUkVDVDsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vZmZzZXQ6Ci0JCQkqdHlwZSA9IEFVVE9GU19UWVBFX0RJUkVDVCB8IEFVVE9GU19UWVBFX09GRlNFVDsKKwkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gMTsKQEAgLTMzNiw3ICszMzgsNyBAQAogCXNiaS0+c2IgPSBzOwogCXNiaS0+dmVyc2lvbiA9IDA7CiAJc2JpLT5zdWJfdmVyc2lvbiA9IDA7Ci0Jc2JpLT50eXBlID0gMDsKKwlzYmktPnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKIAlzYmktPm1pbl9wcm90byA9IDA7CiAJc2JpLT5tYXhfcHJvdG8gPSAwOwogCW11dGV4X2luaXQoJnNiaS0+d3FfbXV0ZXgpOwpAQCAtMzc4LDcgKzM4MCw3IEBACiAJfQogCiAJcm9vdF9pbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9yb290X29wZXJhdGlvbnM7Ci0Jcm9vdF9pbm9kZS0+aV9vcCA9IHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX0RJUkVDVCA/CisJcm9vdF9pbm9kZS0+aV9vcCA9IHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIgPwogCQkJJmF1dG9mczRfZGlyZWN0X3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA6CiAJCQkmYXV0b2ZzNF9pbmRpcmVjdF9yb290X2lub2RlX29wZXJhdGlvbnM7CiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvd2FpdHEuYyBiL2ZzL2F1dG9mczQvd2FpdHEuYwppbmRleCAzNTIxNmQxLi40YjY3YzJhIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3dhaXRxLmMKKysrIGIvZnMvYXV0b2ZzNC93YWl0cS5jCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJICogaXMgdmVyeSBzaW1pbGFyIGZvciBpbmRpcmVjdCBtb3VudHMgZXhjZXB0IG9ubHkgZGVudHJ5cwogCQkgKiBpbiB0aGUgcm9vdCBvZiB0aGUgYXV0b2ZzIGZpbGUgc3lzdGVtIG1heSBiZSBuZWdhdGl2ZS4KIAkJICovCi0JCWlmIChzYmktPnR5cGUgJiAoQVVUT0ZTX1RZUEVfRElSRUNUfEFVVE9GU19UWVBFX09GRlNFVCkpCisJCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCWVsc2UgaWYgKCFJU19ST09UKGRlbnRyeS0+ZF9wYXJlbnQpKQogCQkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBJZiB0aGlzIGlzIGEgZGlyZWN0IG1vdW50IHJlcXVlc3QgY3JlYXRlIGEgZHVtbXkgbmFtZSAqLwotCWlmIChJU19ST09UKGRlbnRyeSkgJiYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX0RJUkVDVCkpCisJaWYgKElTX1JPT1QoZGVudHJ5KSAmJiBzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQogCQlxc3RyLmxlbiA9IHNwcmludGYobmFtZSwgIiVwIiwgZGVudHJ5KTsKIAllbHNlIHsKIAkJcXN0ci5sZW4gPSBhdXRvZnM0X2dldHBhdGgoc2JpLCBkZW50cnksICZuYW1lKTsKQEAgLTQwNiwxMSArNDA2LDExIEBACiAJCQkJdHlwZSA9IGF1dG9mc19wdHlwZV9leHBpcmVfbXVsdGk7CiAJCX0gZWxzZSB7CiAJCQlpZiAobm90aWZ5ID09IE5GWV9NT1VOVCkKLQkJCQl0eXBlID0gKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX0RJUkVDVCkgPworCQkJCXR5cGUgPSAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikgPwogCQkJCQlhdXRvZnNfcHR5cGVfbWlzc2luZ19kaXJlY3QgOgogCQkJCQkgYXV0b2ZzX3B0eXBlX21pc3NpbmdfaW5kaXJlY3Q7CiAJCQllbHNlCi0JCQkJdHlwZSA9IChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9ESVJFQ1QpID8KKwkJCQl0eXBlID0gKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpID8KIAkJCQkJYXV0b2ZzX3B0eXBlX2V4cGlyZV9kaXJlY3QgOgogCQkJCQlhdXRvZnNfcHR5cGVfZXhwaXJlX2luZGlyZWN0OwogCQl9CkBAIC00NTcsNiArNDU3LDQwIEBACiAKIAlzdGF0dXMgPSB3cS0+c3RhdHVzOwogCisJLyoKKwkgKiBGb3IgZGlyZWN0IGFuZCBvZmZzZXQgbW91bnRzIHdlIG5lZWQgdG8gdHJhY2sgdGhlIHJlcXVlc3RlcidzCisJICogdWlkIGFuZCBnaWQgaW4gdGhlIGRlbnRyeSBpbmZvIHN0cnVjdC4gVGhpcyBpcyBzbyBpdCBjYW4gYmUKKwkgKiBzdXBwbGllZCwgb24gcmVxdWVzdCwgYnkgdGhlIG1pc2MgZGV2aWNlIGlvY3RsIGludGVyZmFjZS4KKwkgKiBUaGlzIGlzIG5lZWRlZCBkdXJpbmcgZGFlbW9uIHJlc2F0YXJ0IHdoZW4gcmVjb25uZWN0aW5nCisJICogdG8gZXhpc3RpbmcsIGFjdGl2ZSwgYXV0b2ZzIG1vdW50cy4gVGhlIHVpZCBhbmQgZ2lkIChhbmQKKwkgKiByZWxhdGVkIHN0cmluZyB2YWx1ZXMpIG1heSBiZSB1c2VkIGZvciBtYWNybyBzdWJzdGl0dXRpb24KKwkgKiBpbiBhdXRvZnMgbW91bnQgbWFwcy4KKwkgKi8KKwlpZiAoIXN0YXR1cykgeworCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKKwkJc3RydWN0IGRlbnRyeSAqZGUgPSBOVUxMOworCisJCS8qIGRpcmVjdCBtb3VudCBvciBicm93c2FibGUgbWFwICovCisJCWlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOworCQlpZiAoIWlubykgeworCQkJLyogSWYgbm90IGxvb2t1cCBhY3R1YWwgZGVudHJ5IHVzZWQgKi8KKwkJCWRlID0gZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwkJCWlmIChkZSkKKwkJCQlpbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGUpOworCQl9CisKKwkJLyogU2V0IG1vdW50IHJlcXVlc3RlciAqLworCQlpZiAoaW5vKSB7CisJCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CisJCQlpbm8tPnVpZCA9IHdxLT51aWQ7CisJCQlpbm8tPmdpZCA9IHdxLT5naWQ7CisJCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKKwkJfQorCisJCWlmIChkZSkKKwkJCWRwdXQoZGUpOworCX0KKwogCS8qIEFyZSB3ZSB0aGUgbGFzdCBwcm9jZXNzIHRvIG5lZWQgc3RhdHVzPyAqLwogCW11dGV4X2xvY2soJnNiaS0+d3FfbXV0ZXgpOwogCWlmICghLS13cS0+d2FpdF9jdHIpCmRpZmYgLS1naXQgYS9mcy9iZWZzL2JlZnNfZnNfdHlwZXMuaCBiL2ZzL2JlZnMvYmVmc19mc190eXBlcy5oCmluZGV4IGUyNTk1YzIuLjc4OTNlYWEgMTAwNjQ0Ci0tLSBhL2ZzL2JlZnMvYmVmc19mc190eXBlcy5oCisrKyBiL2ZzL2JlZnMvYmVmc19mc190eXBlcy5oCkBAIC01NSw4ICs1NSwxMiBAQAogfTsKIAogI2RlZmluZSBCRUZTX0JZVEVPUkRFUl9OQVRJVkUgMHg0MjQ5NDc0NQorI2RlZmluZSBCRUZTX0JZVEVPUkRFUl9OQVRJVkVfTEUgKF9fZm9yY2UgZnMzMiljcHVfdG9fbGUzMihCRUZTX0JZVEVPUkRFUl9OQVRJVkUpCisjZGVmaW5lIEJFRlNfQllURU9SREVSX05BVElWRV9CRSAoX19mb3JjZSBmczMyKWNwdV90b19iZTMyKEJFRlNfQllURU9SREVSX05BVElWRSkKIAogI2RlZmluZSBCRUZTX1NVUEVSX01BR0lDIEJFRlNfU1VQRVJfTUFHSUMxCisjZGVmaW5lIEJFRlNfU1VQRVJfTUFHSUMxX0xFIChfX2ZvcmNlIGZzMzIpY3B1X3RvX2xlMzIoQkVGU19TVVBFUl9NQUdJQzEpCisjZGVmaW5lIEJFRlNfU1VQRVJfTUFHSUMxX0JFIChfX2ZvcmNlIGZzMzIpY3B1X3RvX2JlMzIoQkVGU19TVVBFUl9NQUdJQzEpCiAKIC8qCiAgKiBGbGFncyBvZiBpbm9kZQpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9saW51eHZmcy5jIGIvZnMvYmVmcy9saW51eHZmcy5jCmluZGV4IDc0MGY1MzYuLmI2ZGZlZTMgMTAwNjQ0Ci0tLSBhL2ZzL2JlZnMvbGludXh2ZnMuYworKysgYi9mcy9iZWZzL2xpbnV4dmZzLmMKQEAgLTY1MCw3ICs2NTAsNyBAQAogCU9wdF91aWQsIE9wdF9naWQsIE9wdF9jaGFyc2V0LCBPcHRfZGVidWcsIE9wdF9lcnIsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBiZWZzX3Rva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IGJlZnNfdG9rZW5zID0gewogCXtPcHRfdWlkLCAidWlkPSVkIn0sCiAJe09wdF9naWQsICJnaWQ9JWQifSwKIAl7T3B0X2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKQEAgLTgwOSw4ICs4MDksOCBAQAogCiAJLyogYWNjb3VudCBmb3Igb2Zmc2V0IG9mIHN1cGVyIGJsb2NrIG9uIHg4NiAqLwogCWRpc2tfc2IgPSAoYmVmc19zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOwotCWlmICgobGUzMl90b19jcHUoZGlza19zYi0+bWFnaWMxKSA9PSBCRUZTX1NVUEVSX01BR0lDMSkgfHwKLQkgICAgKGJlMzJfdG9fY3B1KGRpc2tfc2ItPm1hZ2ljMSkgPT0gQkVGU19TVVBFUl9NQUdJQzEpKSB7CisJaWYgKChkaXNrX3NiLT5tYWdpYzEgPT0gQkVGU19TVVBFUl9NQUdJQzFfTEUpIHx8CisJICAgIChkaXNrX3NiLT5tYWdpYzEgPT0gQkVGU19TVVBFUl9NQUdJQzFfQkUpKSB7CiAJCWJlZnNfZGVidWcoc2IsICJVc2luZyBQUEMgc3VwZXJibG9jayBsb2NhdGlvbiIpOwogCX0gZWxzZSB7CiAJCWJlZnNfZGVidWcoc2IsICJVc2luZyB4ODYgc3VwZXJibG9jayBsb2NhdGlvbiIpOwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9zdXBlci5jIGIvZnMvYmVmcy9zdXBlci5jCmluZGV4IDhjMzQwMWYuLjQxZjJiNGQgMTAwNjQ0Ci0tLSBhL2ZzL2JlZnMvc3VwZXIuYworKysgYi9mcy9iZWZzL3N1cGVyLmMKQEAgLTI2LDEwICsyNiwxMCBAQAogCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOwogCiAJLyogQ2hlY2sgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGZpbGVzeXN0ZW0gKi8KLQlpZiAobGUzMl90b19jcHUoZGlza19zYi0+ZnNfYnl0ZV9vcmRlcikgPT0gQkVGU19CWVRFT1JERVJfTkFUSVZFKQorCWlmIChkaXNrX3NiLT5mc19ieXRlX29yZGVyID09IEJFRlNfQllURU9SREVSX05BVElWRV9MRSkKIAkgICAgYmVmc19zYi0+Ynl0ZV9vcmRlciA9IEJFRlNfQllURVNFWF9MRTsKLQllbHNlIGlmIChiZTMyX3RvX2NwdShkaXNrX3NiLT5mc19ieXRlX29yZGVyKSA9PSBCRUZTX0JZVEVPUkRFUl9OQVRJVkUpCi0JICAgIGJlZnNfc2ItPmJ5dGVfb3JkZXIgPSBCRUZTX0JZVEVTRVhfQkU7CQorCWVsc2UgaWYgKGRpc2tfc2ItPmZzX2J5dGVfb3JkZXIgPT0gQkVGU19CWVRFT1JERVJfTkFUSVZFX0JFKQorCSAgICBiZWZzX3NiLT5ieXRlX29yZGVyID0gQkVGU19CWVRFU0VYX0JFOwogCiAJYmVmc19zYi0+bWFnaWMxID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPm1hZ2ljMSk7CiAJYmVmc19zYi0+bWFnaWMyID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPm1hZ2ljMik7CmRpZmYgLS1naXQgYS9mcy9iZnMvZGlyLmMgYi9mcy9iZnMvZGlyLmMKaW5kZXggODdlZTVjYy4uZWQ4ZmViMCAxMDA2NDQKLS0tIGEvZnMvYmZzL2Rpci5jCisrKyBiL2ZzL2Jmcy9kaXIuYwpAQCAtMTI1LDggKzEyNSw4IEBACiAJCQkJCQkJaW5vZGUtPmlfaW5vKTsKIAlpZiAoZXJyKSB7CiAJCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKLQkJaXB1dChpbm9kZSk7CiAJCW11dGV4X3VubG9jaygmaW5mby0+YmZzX2xvY2spOworCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpbmZvLT5iZnNfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggNjU1ZWQ4ZC4uYzc2YWZhMiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCQkgKiBzd2l0Y2ggcmVhbGx5IGlzIGdvaW5nIHRvIGhhcHBlbiAtIGRvIHRoaXMgaW4KIAkJCSAqIGZsdXNoX3RocmVhZCgpLgktIGFrcG0KIAkJCSAqLwotCQkJU0VUX1BFUlNPTkFMSVRZKGxvYy0+ZWxmX2V4LCAwKTsKKwkJCVNFVF9QRVJTT05BTElUWShsb2MtPmVsZl9leCk7CiAKIAkJCWludGVycHJldGVyID0gb3Blbl9leGVjKGVsZl9pbnRlcnByZXRlcik7CiAJCQlyZXR2YWwgPSBQVFJfRVJSKGludGVycHJldGVyKTsKQEAgLTczNCw3ICs3MzQsNyBAQAogCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CiAJfSBlbHNlIHsKIAkJLyogRXhlY3V0YWJsZXMgd2l0aG91dCBhbiBpbnRlcnByZXRlciBhbHNvIG5lZWQgYSBwZXJzb25hbGl0eSAgKi8KLQkJU0VUX1BFUlNPTkFMSVRZKGxvYy0+ZWxmX2V4LCAwKTsKKwkJU0VUX1BFUlNPTkFMSVRZKGxvYy0+ZWxmX2V4KTsKIAl9CiAKIAkvKiBGbHVzaCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlICovCkBAIC03NDgsNyArNzQ4LDcgQEAKIAogCS8qIERvIHRoaXMgaW1tZWRpYXRlbHksIHNpbmNlIFNUQUNLX1RPUCBhcyB1c2VkIGluIHNldHVwX2FyZ19wYWdlcwogCSAgIG1heSBkZXBlbmQgb24gdGhlIHBlcnNvbmFsaXR5LiAgKi8KLQlTRVRfUEVSU09OQUxJVFkobG9jLT5lbGZfZXgsIDApOworCVNFVF9QRVJTT05BTElUWShsb2MtPmVsZl9leCk7CiAJaWYgKGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhsb2MtPmVsZl9leCwgZXhlY3V0YWJsZV9zdGFjaykpCiAJCWN1cnJlbnQtPnBlcnNvbmFsaXR5IHw9IFJFQURfSU1QTElFU19FWEVDOwogCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKaW5kZXggODBjMWY5NS4uMGU4MzY3YyAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZl9mZHBpYy5jCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KQEAgLTQ1NSw4ICs0NTYsMTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVMRl9CQVNFX1BMQVRGT1JNCiAvKgotICogcHJlc2VudCB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdGhlIHByb2dyYW0KKyAqIEFUX0JBU0VfUExBVEZPUk0gaW5kaWNhdGVzIHRoZSAicmVhbCIgaGFyZHdhcmUvbWljcm9hcmNoaXRlY3R1cmUuCisgKiBJZiB0aGUgYXJjaCBkZWZpbmVzIEVMRl9CQVNFX1BMQVRGT1JNIChpbiBhc20vZWxmLmgpLCB0aGUgdmFsdWUKKyAqIHdpbGwgYmUgY29waWVkIHRvIHRoZSB1c2VyIHN0YWNrIGluIHRoZSBzYW1lIG1hbm5lciBhcyBBVF9QTEFURk9STS4KKyAqLworI2RlZmluZSBFTEZfQkFTRV9QTEFURk9STSBOVUxMCisjZW5kaWYKKworLyoKKyAqIHByZXNlbnQgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSBwcm9ncmFtIGJ5IHNob3ZlbGxpbmcgaXQgb250byB0aGUgbmV3CisgKiBwcm9jZXNzJ3Mgc3RhY2sKICAqLwogc3RhdGljIGludCBjcmVhdGVfZWxmX2ZkcGljX3RhYmxlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAogCQkJCSAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApAQCAtNDY2LDE1ICs0NzgsMTkgQEAKIAl1bnNpZ25lZCBsb25nIHNwLCBjc3AsIG5pdGVtczsKIAllbGZfY2FkZHJfdCBfX3VzZXIgKmFyZ3YsICplbnZwOwogCXNpemVfdCBwbGF0Zm9ybV9sZW4gPSAwLCBsZW47Ci0JY2hhciAqa19wbGF0Zm9ybTsKLQljaGFyIF9fdXNlciAqdV9wbGF0Zm9ybSwgKnA7CisJY2hhciAqa19wbGF0Zm9ybSwgKmtfYmFzZV9wbGF0Zm9ybTsKKwljaGFyIF9fdXNlciAqdV9wbGF0Zm9ybSwgKnVfYmFzZV9wbGF0Zm9ybSwgKnA7CiAJbG9uZyBod2NhcDsKIAlpbnQgbG9vcDsKIAlpbnQgbnI7CS8qIHJlc2V0IGZvciBlYWNoIGNzcCBhZGp1c3RtZW50ICovCiAKLQkvKiB3ZSdyZSBnb2luZyB0byBzaG92ZWwgYSB3aG9sZSBsb2FkIG9mIHN0dWZmIG9udG8gdGhlIHN0YWNrICovCiAjaWZkZWYgQ09ORklHX01NVQotCXNwID0gYnBybS0+cDsKKwkvKiBJbiBzb21lIGNhc2VzIChlLmcuIEh5cGVyLVRocmVhZGluZyksIHdlIHdhbnQgdG8gYXZvaWQgTDEgZXZpY3Rpb25zCisJICogYnkgdGhlIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHBhY2thZ2UuIE9uZSB0aGluZyB3ZSBjYW4gZG8gaXMKKwkgKiB0byBzaHVmZmxlIHRoZSBpbml0aWFsIHN0YWNrIGZvciB0aGVtLCBzbyB3ZSBnaXZlIHRoZSBhcmNoaXRlY3R1cmUKKwkgKiBhbiBvcHBvcnR1bml0eSB0byBkbyBzbyBoZXJlLgorCSAqLworCXNwID0gYXJjaF9hbGlnbl9zdGFjayhicHJtLT5wKTsKICNlbHNlCiAJc3AgPSBtbS0+c3RhcnRfc3RhY2s7CiAKQEAgLTQ4MywxMSArNDk5LDE0IEBACiAJCXJldHVybiAtRUZBVUxUOwogI2VuZGlmCiAKLQkvKiBnZXQgaG9sZCBvZiBwbGF0Zm9ybSBhbmQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIG1hc2tzIGZvciB0aGUgbWFjaGluZQotCSAqIHdlIGFyZSBydW5uaW5nIG9uLiAgSW4gc29tZSBjYXNlcyAoU3BhcmMpLCB0aGlzIGluZm8gaXMgaW1wb3NzaWJsZQotCSAqIHRvIGdldCwgaW4gb3RoZXJzIChpMzg2KSBpdCBpcyBtZXJlbHkgZGlmZmljdWx0LgotCSAqLwogCWh3Y2FwID0gRUxGX0hXQ0FQOworCisJLyoKKwkgKiBJZiB0aGlzIGFyY2hpdGVjdHVyZSBoYXMgYSBwbGF0Zm9ybSBjYXBhYmlsaXR5IHN0cmluZywgY29weSBpdAorCSAqIHRvIHVzZXJzcGFjZS4gIEluIHNvbWUgY2FzZXMgKFNwYXJjKSwgdGhpcyBpbmZvIGlzIGltcG9zc2libGUKKwkgKiBmb3IgdXNlcnNwYWNlIHRvIGdldCBhbnkgb3RoZXIgd2F5LCBpbiBvdGhlcnMgKGkzODYpIGl0IGlzCisJICogbWVyZWx5IGRpZmZpY3VsdC4KKwkgKi8KIAlrX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOwogCXVfcGxhdGZvcm0gPSBOVUxMOwogCkBAIC00OTksMTkgKzUxOCwyMCBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0jaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCS8qIGluIHNvbWUgY2FzZXMgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSwgd2Ugd2FudCB0byBhdm9pZCBMMSBldmljdGlvbnMKLQkgKiBieSB0aGUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFja2FnZS4gT25lIHRoaW5nIHdlIGNhbiBkbyBpcwotCSAqIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCi0JICoKLQkgKiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHVubmVlZGVkLCBidXQga2VwdCBpbiB0byBtYWtlIHRoZSBjb2RlCi0JICogYmVoYXZpb3VyIHRoZSBzYW1lIGFzIHByZSBjaGFuZ2UgdW5sZXNzIHdlIGhhdmUgaHlwZXJ0aHJlYWRlZAotCSAqIHByb2Nlc3NvcnMuIFRoaXMga2VlcHMgTXIgTWFyY2VsbyBQZXJzb24gaGFwcGllciBidXQgc2hvdWxkIGJlCi0JICogcmVtb3ZlZCBmb3IgMi41CisJLyoKKwkgKiBJZiB0aGlzIGFyY2hpdGVjdHVyZSBoYXMgYSAiYmFzZSIgcGxhdGZvcm0gY2FwYWJpbGl0eQorCSAqIHN0cmluZywgY29weSBpdCB0byB1c2Vyc3BhY2UuCiAJICovCi0JaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKQotCQlzcCA9IHNwIC0gKChjdXJyZW50LT5waWQgJSA2NCkgPDwgNyk7Ci0jZW5kaWYKKwlrX2Jhc2VfcGxhdGZvcm0gPSBFTEZfQkFTRV9QTEFURk9STTsKKwl1X2Jhc2VfcGxhdGZvcm0gPSBOVUxMOworCisJaWYgKGtfYmFzZV9wbGF0Zm9ybSkgeworCQlwbGF0Zm9ybV9sZW4gPSBzdHJsZW4oa19iYXNlX3BsYXRmb3JtKSArIDE7CisJCXNwIC09IHBsYXRmb3JtX2xlbjsKKwkJdV9iYXNlX3BsYXRmb3JtID0gKGNoYXIgX191c2VyICopIHNwOworCQlpZiAoX19jb3B5X3RvX3VzZXIodV9iYXNlX3BsYXRmb3JtLCBrX2Jhc2VfcGxhdGZvcm0sIHBsYXRmb3JtX2xlbikgIT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KIAogCXNwICY9IH43VUw7CiAKQEAgLTU0MSw5ICs1NjEsMTMgQEAKIAl9CiAKIAkvKiBmb3JjZSAxNiBieXRlIF9maW5hbF8gYWxpZ25tZW50IGhlcmUgZm9yIGdlbmVyYWxpdHkgKi8KLSNkZWZpbmUgRExJTkZPX0lURU1TIDEzCisjZGVmaW5lIERMSU5GT19JVEVNUyAxNQogCi0Jbml0ZW1zID0gMSArIERMSU5GT19JVEVNUyArIChrX3BsYXRmb3JtID8gMSA6IDApICsgQVRfVkVDVE9SX1NJWkVfQVJDSDsKKwluaXRlbXMgPSAxICsgRExJTkZPX0lURU1TICsgKGtfcGxhdGZvcm0gPyAxIDogMCkgKworCQkoa19iYXNlX3BsYXRmb3JtID8gMSA6IDApICsgQVRfVkVDVE9SX1NJWkVfQVJDSDsKKworCWlmIChicHJtLT5pbnRlcnBfZmxhZ3MgJiBCSU5QUk1fRkxBR1NfRVhFQ0ZEKQorCQluaXRlbXMrKzsKIAogCWNzcCA9IHNwOwogCXNwIC09IG5pdGVtcyAqIDIgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CkBAIC01NzUsNiArNTk5LDE5IEBACiAJCQkgICAgKGVsZl9hZGRyX3QpICh1bnNpZ25lZCBsb25nKSB1X3BsYXRmb3JtKTsKIAl9CiAKKwlpZiAoa19iYXNlX3BsYXRmb3JtKSB7CisJCW5yID0gMDsKKwkJY3NwIC09IDIgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCU5FV19BVVhfRU5UKEFUX0JBU0VfUExBVEZPUk0sCisJCQkgICAgKGVsZl9hZGRyX3QpICh1bnNpZ25lZCBsb25nKSB1X2Jhc2VfcGxhdGZvcm0pOworCX0KKworCWlmIChicHJtLT5pbnRlcnBfZmxhZ3MgJiBCSU5QUk1fRkxBR1NfRVhFQ0ZEKSB7CisJCW5yID0gMDsKKwkJY3NwIC09IDIgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCU5FV19BVVhfRU5UKEFUX0VYRUNGRCwgYnBybS0+aW50ZXJwX2RhdGEpOworCX0KKwogCW5yID0gMDsKIAljc3AgLT0gRExJTkZPX0lURU1TICogMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAlORVdfQVVYX0VOVChBVF9IV0NBUCwJaHdjYXApOwpAQCAtNTkwLDYgKzYyNyw4IEBACiAJTkVXX0FVWF9FTlQoQVRfRVVJRCwJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmV1aWQpOwogCU5FV19BVVhfRU5UKEFUX0dJRCwJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmdpZCk7CiAJTkVXX0FVWF9FTlQoQVRfRUdJRCwJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmVnaWQpOworCU5FV19BVVhfRU5UKEFUX1NFQ1VSRSwJc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKKwlORVdfQVVYX0VOVChBVF9FWEVDRk4sCWJwcm0tPmV4ZWMpOwogCiAjaWZkZWYgQVJDSF9ETElORk8KIAluciA9IDA7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZW04Ni5jIGIvZnMvYmluZm10X2VtODYuYwppbmRleCBmOWM4OGQwLi4zMmZiMDBiIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZW04Ni5jCisrKyBiL2ZzL2JpbmZtdF9lbTg2LmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKLQlicHJtLT5zaF9iYW5nID0gMTsJLyogV2VsbCwgdGhlIGJhbmctc2hlbGwgaXMgaW1wbGljaXQuLi4gKi8KKwlicHJtLT5yZWN1cnNpb25fZGVwdGgrKzsgLyogV2VsbCwgdGhlIGJhbmctc2hlbGwgaXMgaW1wbGljaXQuLi4gKi8KIAlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CiAJZnB1dChicHJtLT5maWxlKTsKIAlicHJtLT5maWxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9mbGF0LmMgYi9mcy9iaW5mbXRfZmxhdC5jCmluZGV4IGRmYzAxOTcuLmNjYjc4MWEgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9mbGF0LmMKKysrIGIvZnMvYmluZm10X2ZsYXQuYwpAQCAtMjI5LDEzICsyMjksMTMgQEAKIAlyZXQgPSAxMDsKIAlpZiAoYnVmWzNdICYgRVhUUkFfRklFTEQpIHsKIAkJcmV0ICs9IDIgKyBidWZbMTBdICsgKGJ1ZlsxMV0gPDwgOCk7Ci0JCWlmICh1bmxpa2VseShMQlVGU0laRSA9PSByZXQpKSB7CisJCWlmICh1bmxpa2VseShMQlVGU0laRSA8PSByZXQpKSB7CiAJCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogYnVmZmVyIG92ZXJmbG93IChFWFRSQSk/XG4iKTsKIAkJCWdvdG8gb3V0X2ZyZWVfYnVmOwogCQl9CiAJfQogCWlmIChidWZbM10gJiBPUklHX05BTUUpIHsKLQkJZm9yICg7IHJldCA8IExCVUZTSVpFICYmIChidWZbcmV0XSAhPSAwKTsgcmV0KyspCisJCXdoaWxlIChyZXQgPCBMQlVGU0laRSAmJiBidWZbcmV0KytdICE9IDApCiAJCQk7CiAJCWlmICh1bmxpa2VseShMQlVGU0laRSA9PSByZXQpKSB7CiAJCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogYnVmZmVyIG92ZXJmbG93IChPUklHX05BTUUpP1xuIik7CkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJfQogCX0KIAlpZiAoYnVmWzNdICYgQ09NTUVOVCkgewotCQlmb3IgKDsgIHJldCA8IExCVUZTSVpFICYmIChidWZbcmV0XSAhPSAwKTsgcmV0KyspCisJCXdoaWxlIChyZXQgPCBMQlVGU0laRSAmJiBidWZbcmV0KytdICE9IDApCiAJCQk7CiAJCWlmICh1bmxpa2VseShMQlVGU0laRSA9PSByZXQpKSB7CiAJCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogYnVmZmVyIG92ZXJmbG93IChDT01NRU5UKT9cbiIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmMKaW5kZXggOGQ3ZTg4ZS4uZjI3NDRhYiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYworKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkJZ290byBfcmV0OwogCiAJcmV0dmFsID0gLUVOT0VYRUM7Ci0JaWYgKGJwcm0tPm1pc2NfYmFuZykKKwlpZiAoYnBybS0+cmVjdXJzaW9uX2RlcHRoID4gQklOUFJNX01BWF9SRUNVUlNJT04pCiAJCWdvdG8gX3JldDsKIAogCS8qIHRvIGtlZXAgbG9ja2luZyB0aW1lIGxvdywgd2UgY29weSB0aGUgaW50ZXJwcmV0ZXIgc3RyaW5nICovCkBAIC0xOTcsNyArMTk3LDcgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBfZXJyb3I7CiAKLQlicHJtLT5taXNjX2JhbmcgPSAxOworCWJwcm0tPnJlY3Vyc2lvbl9kZXB0aCsrOwogCiAJcmV0dmFsID0gc2VhcmNoX2JpbmFyeV9oYW5kbGVyIChicHJtLCByZWdzKTsKIAlpZiAocmV0dmFsIDwgMCkKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9zY3JpcHQuYyBiL2ZzL2JpbmZtdF9zY3JpcHQuYwppbmRleCA5ZTM5NjNmLi4wODM0MzUwIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfc2NyaXB0LmMKKysrIGIvZnMvYmluZm10X3NjcmlwdC5jCkBAIC0yMiwxNCArMjIsMTUgQEAKIAljaGFyIGludGVycFtCSU5QUk1fQlVGX1NJWkVdOwogCWludCByZXR2YWw7CiAKLQlpZiAoKGJwcm0tPmJ1ZlswXSAhPSAnIycpIHx8IChicHJtLT5idWZbMV0gIT0gJyEnKSB8fCAoYnBybS0+c2hfYmFuZykpIAorCWlmICgoYnBybS0+YnVmWzBdICE9ICcjJykgfHwgKGJwcm0tPmJ1ZlsxXSAhPSAnIScpIHx8CisJICAgIChicHJtLT5yZWN1cnNpb25fZGVwdGggPiBCSU5QUk1fTUFYX1JFQ1VSU0lPTikpCiAJCXJldHVybiAtRU5PRVhFQzsKIAkvKgogCSAqIFRoaXMgc2VjdGlvbiBkb2VzIHRoZSAjISBpbnRlcnByZXRhdGlvbi4KIAkgKiBTb3J0YSBjb21wbGljYXRlZCwgYnV0IGhvcGVmdWxseSBpdCB3aWxsIHdvcmsuICAtVFlUCiAJICovCiAKLQlicHJtLT5zaF9iYW5nID0gMTsKKwlicHJtLT5yZWN1cnNpb25fZGVwdGgrKzsKIAlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CiAJZnB1dChicHJtLT5maWxlKTsKIAlicHJtLT5maWxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9zb20uYyBiL2ZzL2JpbmZtdF9zb20uYwppbmRleCA2OGJlNTgwLi43NGU1ODdhIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfc29tLmMKKysrIGIvZnMvYmluZm10X3NvbS5jCkBAIC0zMDYsMyArMzA2LDUgQEAKIAogY29yZV9pbml0Y2FsbChpbml0X3NvbV9iaW5mbXQpOwogbW9kdWxlX2V4aXQoZXhpdF9zb21fYmluZm10KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IGMzZTE3NGIuLjE5Y2FmN2MgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTEwNyw3ICsxMDcsOCBAQAogCUJVR19PTihiaXAgPT0gTlVMTCk7CiAKIAkvKiBBIGNsb25lZCBiaW8gZG9lc24ndCBvd24gdGhlIGludGVncml0eSBtZXRhZGF0YSAqLwotCWlmICghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fQ0xPTkVEKSAmJiBiaXAtPmJpcF9idWYgIT0gTlVMTCkKKwlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX0NMT05FRCkgJiYgIWJpb19mbGFnZ2VkKGJpbywgQklPX0ZTX0lOVEVHUklUWSkKKwkgICAgJiYgYmlwLT5iaXBfYnVmICE9IE5VTEwpCiAJCWtmcmVlKGJpcC0+YmlwX2J1Zik7CiAKIAltZW1wb29sX2ZyZWUoYmlwLT5iaXBfdmVjLCBicy0+YnZlY19wb29sc1tiaXAtPmJpcF9wb29sXSk7CkBAIC0xNTAsNiArMTUxLDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJpb19pbnRlZ3JpdHlfYWRkX3BhZ2UpOwogCitzdGF0aWMgaW50IGJkZXZfaW50ZWdyaXR5X2VuYWJsZWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgaW50IHJ3KQoreworCXN0cnVjdCBibGtfaW50ZWdyaXR5ICpiaSA9IGJkZXZfZ2V0X2ludGVncml0eShiZGV2KTsKKworCWlmIChiaSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChydyA9PSBSRUFEICYmIGJpLT52ZXJpZnlfZm4gIT0gTlVMTCAmJgorCSAgICAoYmktPmZsYWdzICYgSU5URUdSSVRZX0ZMQUdfUkVBRCkpCisJCXJldHVybiAxOworCisJaWYgKHJ3ID09IFdSSVRFICYmIGJpLT5nZW5lcmF0ZV9mbiAhPSBOVUxMICYmCisJICAgIChiaS0+ZmxhZ3MgJiBJTlRFR1JJVFlfRkxBR19XUklURSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogYmlvX2ludGVncml0eV9lbmFibGVkIC0gQ2hlY2sgd2hldGhlciBpbnRlZ3JpdHkgY2FuIGJlIHBhc3NlZAogICogQGJpbzoJYmlvIHRvIGNoZWNrCkBAIC0zMTMsNiArMzMyLDE0IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGJsa19pbnRlZ3JpdHlfdHVwbGVfc2l6ZShzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkpCit7CisJaWYgKGJpKQorCQlyZXR1cm4gYmktPnR1cGxlX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBiaW9faW50ZWdyaXR5X3ByZXAgLSBQcmVwYXJlIGJpbyBmb3IgaW50ZWdyaXR5IEkvTwogICogQGJpbzoJYmlvIHRvIHByZXBhcmUKZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggM2NiYTdhZS4uNzdhNTViYyAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiaW9fc2xhYiBfX3JlYWRfbW9zdGx5OwogCi1tZW1wb29sX3QgKmJpb19zcGxpdF9wb29sIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgbWVtcG9vbF90ICpiaW9fc3BsaXRfcG9vbCBfX3JlYWRfbW9zdGx5OwogCiAvKgogICogaWYgeW91IGNoYW5nZSB0aGlzIGxpc3QsIGFsc28gY2hhbmdlIGJ2ZWNfYWxsb2Mgb3IgdGhpbmdzIHdpbGwKQEAgLTYwLDI1ICs2MCw0NiBAQAogCXN0cnVjdCBiaW9fdmVjICpidmw7CiAKIAkvKgotCSAqIHNlZSBjb21tZW50IG5lYXIgYnZlY19hcnJheSBkZWZpbmUhCisJICogSWYgJ2JzJyBpcyBnaXZlbiwgbG9va3VwIHRoZSBwb29sIGFuZCBkbyB0aGUgbWVtcG9vbCBhbGxvYy4KKwkgKiBJZiBub3QsIHRoaXMgaXMgYSBiaW9fa21hbGxvYygpIGFsbG9jYXRpb24gYW5kIGp1c3QgZG8gYQorCSAqIGt6YWxsb2MoKSBmb3IgdGhlIGV4YWN0IG51bWJlciBvZiB2ZWNzIHJpZ2h0IGF3YXkuCiAJICovCi0Jc3dpdGNoIChucikgewotCQljYXNlICAgMSAgICAgICAgOiAqaWR4ID0gMDsgYnJlYWs7Ci0JCWNhc2UgICAyIC4uLiAgIDQ6ICppZHggPSAxOyBicmVhazsKLQkJY2FzZSAgIDUgLi4uICAxNjogKmlkeCA9IDI7IGJyZWFrOwotCQljYXNlICAxNyAuLi4gIDY0OiAqaWR4ID0gMzsgYnJlYWs7Ci0JCWNhc2UgIDY1IC4uLiAxMjg6ICppZHggPSA0OyBicmVhazsKLQkJY2FzZSAxMjkgLi4uIEJJT19NQVhfUEFHRVM6ICppZHggPSA1OyBicmVhazsKKwlpZiAoYnMpIHsKKwkJLyoKKwkJICogc2VlIGNvbW1lbnQgbmVhciBidmVjX2FycmF5IGRlZmluZSEKKwkJICovCisJCXN3aXRjaCAobnIpIHsKKwkJY2FzZSAxOgorCQkJKmlkeCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAyIC4uLiA0OgorCQkJKmlkeCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSA1IC4uLiAxNjoKKwkJCSppZHggPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMTcgLi4uIDY0OgorCQkJKmlkeCA9IDM7CisJCQlicmVhazsKKwkJY2FzZSA2NSAuLi4gMTI4OgorCQkJKmlkeCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSAxMjkgLi4uIEJJT19NQVhfUEFHRVM6CisJCQkqaWR4ID0gNTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qCi0JICogaWR4IG5vdyBwb2ludHMgdG8gdGhlIHBvb2wgd2Ugd2FudCB0byBhbGxvY2F0ZSBmcm9tCi0JICovCisJCX0KIAotCWJ2bCA9IG1lbXBvb2xfYWxsb2MoYnMtPmJ2ZWNfcG9vbHNbKmlkeF0sIGdmcF9tYXNrKTsKLQlpZiAoYnZsKQotCQltZW1zZXQoYnZsLCAwLCBidmVjX25yX3ZlY3MoKmlkeCkgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpKTsKKwkJLyoKKwkJICogaWR4IG5vdyBwb2ludHMgdG8gdGhlIHBvb2wgd2Ugd2FudCB0byBhbGxvY2F0ZSBmcm9tCisJCSAqLworCQlidmwgPSBtZW1wb29sX2FsbG9jKGJzLT5idmVjX3Bvb2xzWyppZHhdLCBnZnBfbWFzayk7CisJCWlmIChidmwpCisJCQltZW1zZXQoYnZsLCAwLAorCQkJCWJ2ZWNfbnJfdmVjcygqaWR4KSAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOworCX0gZWxzZQorCQlidmwgPSBremFsbG9jKG5yICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwgZ2ZwX21hc2spOwogCiAJcmV0dXJuIGJ2bDsKIH0KQEAgLTEwNywxMCArMTI4LDE3IEBACiAJYmlvX2ZyZWUoYmlvLCBmc19iaW9fc2V0KTsKIH0KIAorc3RhdGljIHZvaWQgYmlvX2ttYWxsb2NfZGVzdHJ1Y3RvcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJa2ZyZWUoYmlvLT5iaV9pb192ZWMpOworCWtmcmVlKGJpbyk7Cit9CisKIHZvaWQgYmlvX2luaXQoc3RydWN0IGJpbyAqYmlvKQogewogCW1lbXNldChiaW8sIDAsIHNpemVvZigqYmlvKSk7CiAJYmlvLT5iaV9mbGFncyA9IDEgPDwgQklPX1VQVE9EQVRFOworCWJpby0+YmlfY29tcF9jcHUgPSAtMTsKIAlhdG9taWNfc2V0KCZiaW8tPmJpX2NudCwgMSk7CiB9CiAKQEAgLTExOCwxOSArMTQ2LDI1IEBACiAgKiBiaW9fYWxsb2NfYmlvc2V0IC0gYWxsb2NhdGUgYSBiaW8gZm9yIEkvTwogICogQGdmcF9tYXNrOiAgIHRoZSBHRlBfIG1hc2sgZ2l2ZW4gdG8gdGhlIHNsYWIgYWxsb2NhdG9yCiAgKiBAbnJfaW92ZWNzOgludW1iZXIgb2YgaW92ZWNzIHRvIHByZS1hbGxvY2F0ZQotICogQGJzOgkJdGhlIGJpb19zZXQgdG8gYWxsb2NhdGUgZnJvbQorICogQGJzOgkJdGhlIGJpb19zZXQgdG8gYWxsb2NhdGUgZnJvbS4gSWYgJU5VTEwsIGp1c3QgdXNlIGttYWxsb2MKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgYmlvX2FsbG9jX2Jpb3NldCB3aWxsIGZpcnN0IHRyeSBpdCdzIG9uIG1lbXBvb2wgdG8gc2F0aXNmeSB0aGUgYWxsb2NhdGlvbi4KKyAqICAgYmlvX2FsbG9jX2Jpb3NldCB3aWxsIGZpcnN0IHRyeSBpdHMgb3duIG1lbXBvb2wgdG8gc2F0aXNmeSB0aGUgYWxsb2NhdGlvbi4KICAqICAgSWYgJV9fR0ZQX1dBSVQgaXMgc2V0IHRoZW4gd2Ugd2lsbCBibG9jayBvbiB0aGUgaW50ZXJuYWwgcG9vbCB3YWl0aW5nCi0gKiAgIGZvciBhICZzdHJ1Y3QgYmlvIHRvIGJlY29tZSBmcmVlLgorICogICBmb3IgYSAmc3RydWN0IGJpbyB0byBiZWNvbWUgZnJlZS4gSWYgYSAlTlVMTCBAYnMgaXMgcGFzc2VkIGluLCB3ZSB3aWxsCisgKiAgIGZhbGwgYmFjayB0byBqdXN0IHVzaW5nIEBrbWFsbG9jIHRvIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBtZW1vcnkuCiAgKgogICogICBhbGxvY2F0ZSBiaW8gYW5kIGlvdmVjcyBmcm9tIHRoZSBtZW1vcnkgcG9vbHMgc3BlY2lmaWVkIGJ5IHRoZQotICogICBiaW9fc2V0IHN0cnVjdHVyZS4KKyAqICAgYmlvX3NldCBzdHJ1Y3R1cmUsIG9yIEBrbWFsbG9jIGlmIG5vbmUgZ2l2ZW4uCiAgKiovCiBzdHJ1Y3QgYmlvICpiaW9fYWxsb2NfYmlvc2V0KGdmcF90IGdmcF9tYXNrLCBpbnQgbnJfaW92ZWNzLCBzdHJ1Y3QgYmlvX3NldCAqYnMpCiB7Ci0Jc3RydWN0IGJpbyAqYmlvID0gbWVtcG9vbF9hbGxvYyhicy0+YmlvX3Bvb2wsIGdmcF9tYXNrKTsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwlpZiAoYnMpCisJCWJpbyA9IG1lbXBvb2xfYWxsb2MoYnMtPmJpb19wb29sLCBnZnBfbWFzayk7CisJZWxzZQorCQliaW8gPSBrbWFsbG9jKHNpemVvZigqYmlvKSwgZ2ZwX21hc2spOwogCiAJaWYgKGxpa2VseShiaW8pKSB7CiAJCXN0cnVjdCBiaW9fdmVjICpidmwgPSBOVUxMOwpAQCAtMTQxLDcgKzE3NSwxMCBAQAogCiAJCQlidmwgPSBidmVjX2FsbG9jX2JzKGdmcF9tYXNrLCBucl9pb3ZlY3MsICZpZHgsIGJzKTsKIAkJCWlmICh1bmxpa2VseSghYnZsKSkgewotCQkJCW1lbXBvb2xfZnJlZShiaW8sIGJzLT5iaW9fcG9vbCk7CisJCQkJaWYgKGJzKQorCQkJCQltZW1wb29sX2ZyZWUoYmlvLCBicy0+YmlvX3Bvb2wpOworCQkJCWVsc2UKKwkJCQkJa2ZyZWUoYmlvKTsKIAkJCQliaW8gPSBOVUxMOwogCQkJCWdvdG8gb3V0OwogCQkJfQpAQCAtMTY0LDYgKzIwMSwyMyBAQAogCXJldHVybiBiaW87CiB9CiAKKy8qCisgKiBMaWtlIGJpb19hbGxvYygpLCBidXQgZG9lc24ndCB1c2UgYSBtZW1wb29sIGJhY2tpbmcuIFRoaXMgbWVhbnMgdGhhdAorICogaXQgQ0FOIGZhaWwsIGJ1dCB3aGlsZSBiaW9fYWxsb2MoKSBjYW4gb25seSBiZSB1c2VkIGZvciBhbGxvY2F0aW9ucworICogdGhhdCBoYXZlIGEgc2hvcnQgKGZpbml0ZSkgbGlmZSBzcGFuLCBiaW9fa21hbGxvYygpIHNob3VsZCBiZSB1c2VkCisgKiBmb3IgbW9yZSBwZXJtYW5lbnQgYmlvIGFsbG9jYXRpb25zIChsaWtlIGFsbG9jYXRpbmcgc29tZSBiaW8ncyBmb3IKKyAqIGluaXRhbGl6YXRpb24gb3Igc2V0dXAgcHVycG9zZXMpLgorICovCitzdHJ1Y3QgYmlvICpiaW9fa21hbGxvYyhnZnBfdCBnZnBfbWFzaywgaW50IG5yX2lvdmVjcykKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBiaW9fYWxsb2NfYmlvc2V0KGdmcF9tYXNrLCBucl9pb3ZlY3MsIE5VTEwpOworCisJaWYgKGJpbykKKwkJYmlvLT5iaV9kZXN0cnVjdG9yID0gYmlvX2ttYWxsb2NfZGVzdHJ1Y3RvcjsKKworCXJldHVybiBiaW87Cit9CisKIHZvaWQgemVyb19maWxsX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIwOCwxNCArMjYyLDYgQEAKIAlyZXR1cm4gYmlvLT5iaV9waHlzX3NlZ21lbnRzOwogfQogCi1pbmxpbmUgaW50IGJpb19od19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQotewotCWlmICh1bmxpa2VseSghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fU0VHX1ZBTElEKSkpCi0JCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpbyk7Ci0KLQlyZXR1cm4gYmlvLT5iaV9od19zZWdtZW50czsKLX0KLQogLyoqCiAgKiAJX19iaW9fY2xvbmUJLQljbG9uZSBhIGJpbwogICogCUBiaW86IGRlc3RpbmF0aW9uIGJpbwpAQCAtMzUwLDggKzM5Niw3IEBACiAJICovCiAKIAl3aGlsZSAoYmlvLT5iaV9waHlzX3NlZ21lbnRzID49IHEtPm1heF9waHlzX3NlZ21lbnRzCi0JICAgICAgIHx8IGJpby0+YmlfaHdfc2VnbWVudHMgPj0gcS0+bWF4X2h3X3NlZ21lbnRzCi0JICAgICAgIHx8IEJJT1ZFQ19WSVJUX09WRVJTSVpFKGJpby0+Ymlfc2l6ZSkpIHsKKwkgICAgICAgfHwgYmlvLT5iaV9waHlzX3NlZ21lbnRzID49IHEtPm1heF9od19zZWdtZW50cykgewogCiAJCWlmIChyZXRyaWVkX3NlZ21lbnRzKQogCQkJcmV0dXJuIDA7CkBAIC0zOTUsMTMgKzQ0MCwxMSBAQAogCX0KIAogCS8qIElmIHdlIG1heSBiZSBhYmxlIHRvIG1lcmdlIHRoZXNlIGJpb3ZlY3MsIGZvcmNlIGEgcmVjb3VudCAqLwotCWlmIChiaW8tPmJpX3ZjbnQgJiYgKEJJT1ZFQ19QSFlTX01FUkdFQUJMRShidmVjLTEsIGJ2ZWMpIHx8Ci0JICAgIEJJT1ZFQ19WSVJUX01FUkdFQUJMRShidmVjLTEsIGJ2ZWMpKSkKKwlpZiAoYmlvLT5iaV92Y250ICYmIChCSU9WRUNfUEhZU19NRVJHRUFCTEUoYnZlYy0xLCBidmVjKSkpCiAJCWJpby0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOwogCiAJYmlvLT5iaV92Y250Kys7CiAJYmlvLT5iaV9waHlzX3NlZ21lbnRzKys7Ci0JYmlvLT5iaV9od19zZWdtZW50cysrOwogIGRvbmU6CiAJYmlvLT5iaV9zaXplICs9IGxlbjsKIAlyZXR1cm4gbGVuOwpAQCAtNDQ5LDE2ICs0OTIsMTkgQEAKIAogc3RydWN0IGJpb19tYXBfZGF0YSB7CiAJc3RydWN0IGJpb192ZWMgKmlvdmVjczsKLQlpbnQgbnJfc2d2ZWNzOwogCXN0cnVjdCBzZ19pb3ZlYyAqc2d2ZWNzOworCWludCBucl9zZ3ZlY3M7CisJaW50IGlzX291cl9wYWdlczsKIH07CiAKIHN0YXRpYyB2b2lkIGJpb19zZXRfbWFwX2RhdGEoc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kLCBzdHJ1Y3QgYmlvICpiaW8sCi0JCQkgICAgIHN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50KQorCQkJICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKKwkJCSAgICAgaW50IGlzX291cl9wYWdlcykKIHsKIAltZW1jcHkoYm1kLT5pb3ZlY3MsIGJpby0+YmlfaW9fdmVjLCBzaXplb2Yoc3RydWN0IGJpb192ZWMpICogYmlvLT5iaV92Y250KTsKIAltZW1jcHkoYm1kLT5zZ3ZlY3MsIGlvdiwgc2l6ZW9mKHN0cnVjdCBzZ19pb3ZlYykgKiBpb3ZfY291bnQpOwogCWJtZC0+bnJfc2d2ZWNzID0gaW92X2NvdW50OworCWJtZC0+aXNfb3VyX3BhZ2VzID0gaXNfb3VyX3BhZ2VzOwogCWJpby0+YmlfcHJpdmF0ZSA9IGJtZDsKIH0KIApAQCAtNDkzLDcgKzUzOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgX19iaW9fY29weV9pb3Yoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvX3ZlYyAqaW92ZWNzLAotCQkJICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwgaW50IHVuY29weSkKKwkJCSAgc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQsIGludCB1bmNvcHksCisJCQkgIGludCBkb19mcmVlX3BhZ2UpCiB7CiAJaW50IHJldCA9IDAsIGk7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CkBAIC01MzYsNyArNTgzLDcgQEAKIAkJCX0KIAkJfQogCi0JCWlmICh1bmNvcHkpCisJCWlmIChkb19mcmVlX3BhZ2UpCiAJCQlfX2ZyZWVfcGFnZShidmVjLT5idl9wYWdlKTsKIAl9CiAKQEAgLTU1MywxMCArNjAwLDExIEBACiBpbnQgYmlvX3VuY29weV91c2VyKHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQgPSBiaW8tPmJpX3ByaXZhdGU7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAotCXJldCA9IF9fYmlvX2NvcHlfaW92KGJpbywgYm1kLT5pb3ZlY3MsIGJtZC0+c2d2ZWNzLCBibWQtPm5yX3NndmVjcywgMSk7Ci0KKwlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX05VTExfTUFQUEVEKSkKKwkJcmV0ID0gX19iaW9fY29weV9pb3YoYmlvLCBibWQtPmlvdmVjcywgYm1kLT5zZ3ZlY3MsCisJCQkJICAgICBibWQtPm5yX3NndmVjcywgMSwgYm1kLT5pc19vdXJfcGFnZXMpOwogCWJpb19mcmVlX21hcF9kYXRhKGJtZCk7CiAJYmlvX3B1dChiaW8pOwogCXJldHVybiByZXQ7CkBAIC01NjUsMTYgKzYxMywyMCBAQAogLyoqCiAgKgliaW9fY29weV91c2VyX2lvdgktCWNvcHkgdXNlciBkYXRhIHRvIGJpbwogICoJQHE6IGRlc3RpbmF0aW9uIGJsb2NrIHF1ZXVlCisgKglAbWFwX2RhdGE6IHBvaW50ZXIgdG8gdGhlIHJxX21hcF9kYXRhIGhvbGRpbmcgcGFnZXMgKGlmIG5lY2Vzc2FyeSkKICAqCUBpb3Y6CXRoZSBpb3ZlYy4KICAqCUBpb3ZfY291bnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW92ZWMKICAqCUB3cml0ZV90b192bTogYm9vbCBpbmRpY2F0aW5nIHdyaXRpbmcgdG8gcGFnZXMgb3Igbm90CisgKglAZ2ZwX21hc2s6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCiAgKgogICoJUHJlcGFyZXMgYW5kIHJldHVybnMgYSBiaW8gZm9yIGluZGlyZWN0IHVzZXIgaW8sIGJvdW5jaW5nIGRhdGEKICAqCXRvL2Zyb20ga2VybmVsIHBhZ2VzIGFzIG5lY2Vzc2FyeS4gTXVzdCBiZSBwYWlyZWQgd2l0aAogICoJY2FsbCBiaW9fdW5jb3B5X3VzZXIoKSBvbiBpbyBjb21wbGV0aW9uLgogICovCi1zdHJ1Y3QgYmlvICpiaW9fY29weV91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHNnX2lvdmVjICppb3YsCi0JCQkgICAgICBpbnQgaW92X2NvdW50LCBpbnQgd3JpdGVfdG9fdm0pCitzdHJ1Y3QgYmlvICpiaW9fY29weV91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCSAgICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqbWFwX2RhdGEsCisJCQkgICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKKwkJCSAgICAgIGludCB3cml0ZV90b192bSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kOwogCXN0cnVjdCBiaW9fdmVjICpidmVjOwpAQCAtNTk3LDI1ICs2NDksMzggQEAKIAkJbGVuICs9IGlvdltpXS5pb3ZfbGVuOwogCX0KIAotCWJtZCA9IGJpb19hbGxvY19tYXBfZGF0YShucl9wYWdlcywgaW92X2NvdW50LCBHRlBfS0VSTkVMKTsKKwlibWQgPSBiaW9fYWxsb2NfbWFwX2RhdGEobnJfcGFnZXMsIGlvdl9jb3VudCwgZ2ZwX21hc2spOwogCWlmICghYm1kKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJldCA9IC1FTk9NRU07Ci0JYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3BhZ2VzKTsKKwliaW8gPSBiaW9fYWxsb2MoZ2ZwX21hc2ssIG5yX3BhZ2VzKTsKIAlpZiAoIWJpbykKIAkJZ290byBvdXRfYm1kOwogCiAJYmlvLT5iaV9ydyB8PSAoIXdyaXRlX3RvX3ZtIDw8IEJJT19SVyk7CiAKIAlyZXQgPSAwOworCWkgPSAwOwogCXdoaWxlIChsZW4pIHsKLQkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFOworCQl1bnNpZ25lZCBpbnQgYnl0ZXM7CisKKwkJaWYgKG1hcF9kYXRhKQorCQkJYnl0ZXMgPSAxVSA8PCAoUEFHRV9TSElGVCArIG1hcF9kYXRhLT5wYWdlX29yZGVyKTsKKwkJZWxzZQorCQkJYnl0ZXMgPSBQQUdFX1NJWkU7CiAKIAkJaWYgKGJ5dGVzID4gbGVuKQogCQkJYnl0ZXMgPSBsZW47CiAKLQkJcGFnZSA9IGFsbG9jX3BhZ2UocS0+Ym91bmNlX2dmcCB8IEdGUF9LRVJORUwpOworCQlpZiAobWFwX2RhdGEpIHsKKwkJCWlmIChpID09IG1hcF9kYXRhLT5ucl9lbnRyaWVzKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBhZ2UgPSBtYXBfZGF0YS0+cGFnZXNbaSsrXTsKKwkJfSBlbHNlCisJCQlwYWdlID0gYWxsb2NfcGFnZShxLT5ib3VuY2VfZ2ZwIHwgZ2ZwX21hc2spOwogCQlpZiAoIXBhZ2UpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlicmVhazsKQEAgLTYzNCwxNiArNjk5LDE3IEBACiAJICogc3VjY2VzcwogCSAqLwogCWlmICghd3JpdGVfdG9fdm0pIHsKLQkJcmV0ID0gX19iaW9fY29weV9pb3YoYmlvLCBiaW8tPmJpX2lvX3ZlYywgaW92LCBpb3ZfY291bnQsIDApOworCQlyZXQgPSBfX2Jpb19jb3B5X2lvdihiaW8sIGJpby0+YmlfaW9fdmVjLCBpb3YsIGlvdl9jb3VudCwgMCwgMCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JYmlvX3NldF9tYXBfZGF0YShibWQsIGJpbywgaW92LCBpb3ZfY291bnQpOworCWJpb19zZXRfbWFwX2RhdGEoYm1kLCBiaW8sIGlvdiwgaW92X2NvdW50LCBtYXBfZGF0YSA/IDAgOiAxKTsKIAlyZXR1cm4gYmlvOwogY2xlYW51cDoKLQliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpCi0JCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOworCWlmICghbWFwX2RhdGEpCisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkKKwkJCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOwogCiAJYmlvX3B1dChiaW8pOwogb3V0X2JtZDoKQEAgLTY1NCwyOSArNzIwLDMyIEBACiAvKioKICAqCWJpb19jb3B5X3VzZXIJLQljb3B5IHVzZXIgZGF0YSB0byBiaW8KICAqCUBxOiBkZXN0aW5hdGlvbiBibG9jayBxdWV1ZQorICoJQG1hcF9kYXRhOiBwb2ludGVyIHRvIHRoZSBycV9tYXBfZGF0YSBob2xkaW5nIHBhZ2VzIChpZiBuZWNlc3NhcnkpCiAgKglAdWFkZHI6IHN0YXJ0IG9mIHVzZXIgYWRkcmVzcwogICoJQGxlbjogbGVuZ3RoIGluIGJ5dGVzCiAgKglAd3JpdGVfdG9fdm06IGJvb2wgaW5kaWNhdGluZyB3cml0aW5nIHRvIHBhZ2VzIG9yIG5vdAorICoJQGdmcF9tYXNrOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncwogICoKICAqCVByZXBhcmVzIGFuZCByZXR1cm5zIGEgYmlvIGZvciBpbmRpcmVjdCB1c2VyIGlvLCBib3VuY2luZyBkYXRhCiAgKgl0by9mcm9tIGtlcm5lbCBwYWdlcyBhcyBuZWNlc3NhcnkuIE11c3QgYmUgcGFpcmVkIHdpdGgKICAqCWNhbGwgYmlvX3VuY29weV91c2VyKCkgb24gaW8gY29tcGxldGlvbi4KICAqLwotc3RydWN0IGJpbyAqYmlvX2NvcHlfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyB1YWRkciwKLQkJCSAgdW5zaWduZWQgaW50IGxlbiwgaW50IHdyaXRlX3RvX3ZtKQorc3RydWN0IGJpbyAqYmlvX2NvcHlfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJxX21hcF9kYXRhICptYXBfZGF0YSwKKwkJCSAgdW5zaWduZWQgbG9uZyB1YWRkciwgdW5zaWduZWQgaW50IGxlbiwKKwkJCSAgaW50IHdyaXRlX3RvX3ZtLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2dfaW92ZWMgaW92OwogCiAJaW92Lmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopdWFkZHI7CiAJaW92Lmlvdl9sZW4gPSBsZW47CiAKLQlyZXR1cm4gYmlvX2NvcHlfdXNlcl9pb3YocSwgJmlvdiwgMSwgd3JpdGVfdG9fdm0pOworCXJldHVybiBiaW9fY29weV91c2VyX2lvdihxLCBtYXBfZGF0YSwgJmlvdiwgMSwgd3JpdGVfdG9fdm0sIGdmcF9tYXNrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBiaW8gKl9fYmlvX21hcF91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJCSAgICAgIHN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50LAotCQkJCSAgICAgIGludCB3cml0ZV90b192bSkKKwkJCQkgICAgICBpbnQgd3JpdGVfdG9fdm0sIGdmcF90IGdmcF9tYXNrKQogewogCWludCBpLCBqOwogCWludCBucl9wYWdlcyA9IDA7CkBAIC03MDIsMTIgKzc3MSwxMiBAQAogCWlmICghbnJfcGFnZXMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3BhZ2VzKTsKKwliaW8gPSBiaW9fYWxsb2MoZ2ZwX21hc2ssIG5yX3BhZ2VzKTsKIAlpZiAoIWJpbykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXQgPSAtRU5PTUVNOwotCXBhZ2VzID0ga2NhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlwYWdlcyA9IGtjYWxsb2MobnJfcGFnZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgZ2ZwX21hc2spOwogCWlmICghcGFnZXMpCiAJCWdvdG8gb3V0OwogCkBAIC03ODYsMTkgKzg1NSwyMSBAQAogICoJQHVhZGRyOiBzdGFydCBvZiB1c2VyIGFkZHJlc3MKICAqCUBsZW46IGxlbmd0aCBpbiBieXRlcwogICoJQHdyaXRlX3RvX3ZtOiBib29sIGluZGljYXRpbmcgd3JpdGluZyB0byBwYWdlcyBvciBub3QKKyAqCUBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqCiAgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCiAgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgogICovCiBzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCi0JCQkgdW5zaWduZWQgbG9uZyB1YWRkciwgdW5zaWduZWQgaW50IGxlbiwgaW50IHdyaXRlX3RvX3ZtKQorCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCB3cml0ZV90b192bSwKKwkJCSBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2dfaW92ZWMgaW92OwogCiAJaW92Lmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopdWFkZHI7CiAJaW92Lmlvdl9sZW4gPSBsZW47CiAKLQlyZXR1cm4gYmlvX21hcF91c2VyX2lvdihxLCBiZGV2LCAmaW92LCAxLCB3cml0ZV90b192bSk7CisJcmV0dXJuIGJpb19tYXBfdXNlcl9pb3YocSwgYmRldiwgJmlvdiwgMSwgd3JpdGVfdG9fdm0sIGdmcF9tYXNrKTsKIH0KIAogLyoqCkBAIC04MDgsMTggKzg3OSwxOSBAQAogICoJQGlvdjoJdGhlIGlvdmVjLgogICoJQGlvdl9jb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpb3ZlYwogICoJQHdyaXRlX3RvX3ZtOiBib29sIGluZGljYXRpbmcgd3JpdGluZyB0byBwYWdlcyBvciBub3QKKyAqCUBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqCiAgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCiAgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgogICovCiBzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXJfaW92KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKLQkJCSAgICAgaW50IHdyaXRlX3RvX3ZtKQorCQkJICAgICBpbnQgd3JpdGVfdG9fdm0sIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCBiaW8gKmJpbzsKIAotCWJpbyA9IF9fYmlvX21hcF91c2VyX2lvdihxLCBiZGV2LCBpb3YsIGlvdl9jb3VudCwgd3JpdGVfdG9fdm0pOwotCisJYmlvID0gX19iaW9fbWFwX3VzZXJfaW92KHEsIGJkZXYsIGlvdiwgaW92X2NvdW50LCB3cml0ZV90b192bSwKKwkJCQkgZ2ZwX21hc2spOwogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIGJpbzsKIApAQCAtOTc2LDQ4ICsxMDQ4LDEzIEBACiBzdHJ1Y3QgYmlvICpiaW9fY29weV9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLAogCQkJICBnZnBfdCBnZnBfbWFzaywgaW50IHJlYWRpbmcpCiB7Ci0JdW5zaWduZWQgbG9uZyBrYWRkciA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSAoa2FkZHIgKyBsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBrYWRkciA+PiBQQUdFX1NISUZUOwotCWNvbnN0IGludCBucl9wYWdlcyA9IGVuZCAtIHN0YXJ0OwogCXN0cnVjdCBiaW8gKmJpbzsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKLQlzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQ7Ci0JaW50IGksIHJldDsKLQlzdHJ1Y3Qgc2dfaW92ZWMgaW92OworCWludCBpOwogCi0JaW92Lmlvdl9iYXNlID0gZGF0YTsKLQlpb3YuaW92X2xlbiA9IGxlbjsKLQotCWJtZCA9IGJpb19hbGxvY19tYXBfZGF0YShucl9wYWdlcywgMSwgZ2ZwX21hc2spOwotCWlmICghYm1kKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXJldCA9IC1FTk9NRU07Ci0JYmlvID0gYmlvX2FsbG9jKGdmcF9tYXNrLCBucl9wYWdlcyk7Ci0JaWYgKCFiaW8pCi0JCWdvdG8gb3V0X2JtZDsKLQotCXdoaWxlIChsZW4pIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBieXRlcyA9IFBBR0VfU0laRTsKLQotCQlpZiAoYnl0ZXMgPiBsZW4pCi0JCQlieXRlcyA9IGxlbjsKLQotCQlwYWdlID0gYWxsb2NfcGFnZShxLT5ib3VuY2VfZ2ZwIHwgZ2ZwX21hc2spOwotCQlpZiAoIXBhZ2UpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQlpZiAoYmlvX2FkZF9wY19wYWdlKHEsIGJpbywgcGFnZSwgYnl0ZXMsIDApIDwgYnl0ZXMpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQlsZW4gLT0gYnl0ZXM7Ci0JfQorCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgTlVMTCwgKHVuc2lnbmVkIGxvbmcpZGF0YSwgbGVuLCAxLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihiaW8pKQorCQlyZXR1cm4gYmlvOwogCiAJaWYgKCFyZWFkaW5nKSB7CiAJCXZvaWQgKnAgPSBkYXRhOwpAQCAtMTAzMCwyMCArMTA2Nyw5IEBACiAJCX0KIAl9CiAKLQliaW8tPmJpX3ByaXZhdGUgPSBibWQ7CiAJYmlvLT5iaV9lbmRfaW8gPSBiaW9fY29weV9rZXJuX2VuZGlvOwogCi0JYmlvX3NldF9tYXBfZGF0YShibWQsIGJpbywgJmlvdiwgMSk7CiAJcmV0dXJuIGJpbzsKLWNsZWFudXA6Ci0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKQotCQlfX2ZyZWVfcGFnZShidmVjLT5idl9wYWdlKTsKLQotCWJpb19wdXQoYmlvKTsKLW91dF9ibWQ6Ci0JYmlvX2ZyZWVfbWFwX2RhdGEoYm1kKTsKLQotCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIC8qCkBAIC0xMjMwLDkgKzEyNTYsOSBAQAogICogc3BsaXQgYSBiaW8gLSBvbmx5IHdvcnJ5IGFib3V0IGEgYmlvIHdpdGggYSBzaW5nbGUgcGFnZQogICogaW4gaXQncyBpb3ZlYwogICovCi1zdHJ1Y3QgYmlvX3BhaXIgKmJpb19zcGxpdChzdHJ1Y3QgYmlvICpiaSwgbWVtcG9vbF90ICpwb29sLCBpbnQgZmlyc3Rfc2VjdG9ycykKK3N0cnVjdCBiaW9fcGFpciAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpLCBpbnQgZmlyc3Rfc2VjdG9ycykKIHsKLQlzdHJ1Y3QgYmlvX3BhaXIgKmJwID0gbWVtcG9vbF9hbGxvYyhwb29sLCBHRlBfTk9JTyk7CisJc3RydWN0IGJpb19wYWlyICpicCA9IG1lbXBvb2xfYWxsb2MoYmlvX3NwbGl0X3Bvb2wsIEdGUF9OT0lPKTsKIAogCWlmICghYnApCiAJCXJldHVybiBicDsKQEAgLTEyNjYsNyArMTI5Miw3IEBACiAJYnAtPmJpbzIuYmlfZW5kX2lvID0gYmlvX3BhaXJfZW5kXzI7CiAKIAlicC0+YmlvMS5iaV9wcml2YXRlID0gYmk7Ci0JYnAtPmJpbzIuYmlfcHJpdmF0ZSA9IHBvb2w7CisJYnAtPmJpbzIuYmlfcHJpdmF0ZSA9IGJpb19zcGxpdF9wb29sOwogCiAJaWYgKGJpb19pbnRlZ3JpdHkoYmkpKQogCQliaW9faW50ZWdyaXR5X3NwbGl0KGJpLCBicCwgZmlyc3Rfc2VjdG9ycyk7CkBAIC0xMjc0LDYgKzEzMDAsNDIgQEAKIAlyZXR1cm4gYnA7CiB9CiAKKy8qKgorICogICAgICBiaW9fc2VjdG9yX29mZnNldCAtIEZpbmQgaGFyZHdhcmUgc2VjdG9yIG9mZnNldCBpbiBiaW8KKyAqICAgICAgQGJpbzogICAgICAgICAgIGJpbyB0byBpbnNwZWN0CisgKiAgICAgIEBpbmRleDogICAgICAgICBiaW9fdmVjIGluZGV4CisgKiAgICAgIEBvZmZzZXQ6ICAgICAgICBvZmZzZXQgaW4gYnZfcGFnZQorICoKKyAqICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgc2VjdG9ycyBiZXR3ZWVuIGJlZ2lubmluZyBvZiBiaW8KKyAqICAgICAgYW5kIGFuIGVuZCBwb2ludCBpbmRpY2F0ZWQgYnkgYSBiaW9fdmVjIGluZGV4IGFuZCBhbiBvZmZzZXQKKyAqICAgICAgd2l0aGluIHRoYXQgdmVjdG9yJ3MgcGFnZS4KKyAqLworc2VjdG9yX3QgYmlvX3NlY3Rvcl9vZmZzZXQoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBzaG9ydCBpbmRleCwKKwkJCSAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50IHNlY3Rvcl9zeiA9IHF1ZXVlX2hhcmRzZWN0X3NpemUoYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5xdWV1ZSk7CisJc3RydWN0IGJpb192ZWMgKmJ2OworCXNlY3Rvcl90IHNlY3RvcnM7CisJaW50IGk7CisKKwlzZWN0b3JzID0gMDsKKworCWlmIChpbmRleCA+PSBiaW8tPmJpX2lkeCkKKwkJaW5kZXggPSBiaW8tPmJpX3ZjbnQgLSAxOworCisJX19iaW9fZm9yX2VhY2hfc2VnbWVudChidiwgYmlvLCBpLCAwKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQlpZiAob2Zmc2V0ID4gYnYtPmJ2X29mZnNldCkKKwkJCQlzZWN0b3JzICs9IChvZmZzZXQgLSBidi0+YnZfb2Zmc2V0KSAvIHNlY3Rvcl9zejsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VjdG9ycyArPSBidi0+YnZfbGVuIC8gc2VjdG9yX3N6OworCX0KKworCXJldHVybiBzZWN0b3JzOworfQorRVhQT1JUX1NZTUJPTChiaW9fc2VjdG9yX29mZnNldCk7CiAKIC8qCiAgKiBjcmVhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW92ZWMncyBpbiBhIGJpb19zZXQuCkBAIC0xMzc2LDYgKzE0MzgsNyBAQAogc3Vic3lzX2luaXRjYWxsKGluaXRfYmlvKTsKIAogRVhQT1JUX1NZTUJPTChiaW9fYWxsb2MpOworRVhQT1JUX1NZTUJPTChiaW9fa21hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKGJpb19wdXQpOwogRVhQT1JUX1NZTUJPTChiaW9fZnJlZSk7CiBFWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7CkBAIC0xMzgzLDcgKzE0NDYsNiBAQAogRVhQT1JUX1NZTUJPTChfX2Jpb19jbG9uZSk7CiBFWFBPUlRfU1lNQk9MKGJpb19jbG9uZSk7CiBFWFBPUlRfU1lNQk9MKGJpb19waHlzX3NlZ21lbnRzKTsKLUVYUE9SVF9TWU1CT0woYmlvX2h3X3NlZ21lbnRzKTsKIEVYUE9SVF9TWU1CT0woYmlvX2FkZF9wYWdlKTsKIEVYUE9SVF9TWU1CT0woYmlvX2FkZF9wY19wYWdlKTsKIEVYUE9SVF9TWU1CT0woYmlvX2dldF9ucl92ZWNzKTsKQEAgLTEzOTMsNyArMTQ1NSw2IEBACiBFWFBPUlRfU1lNQk9MKGJpb19jb3B5X2tlcm4pOwogRVhQT1JUX1NZTUJPTChiaW9fcGFpcl9yZWxlYXNlKTsKIEVYUE9SVF9TWU1CT0woYmlvX3NwbGl0KTsKLUVYUE9SVF9TWU1CT0woYmlvX3NwbGl0X3Bvb2wpOwogRVhQT1JUX1NZTUJPTChiaW9fY29weV91c2VyKTsKIEVYUE9SVF9TWU1CT0woYmlvX3VuY29weV91c2VyKTsKIEVYUE9SVF9TWU1CT0woYmlvc2V0X2NyZWF0ZSk7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IGFmZjU0MjEuLmQ4NGYwNDY5IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtNTQwLDIyICs1NDAsNiBAQAogICogICAgICAgICAgIC9zeXMvYmxvY2svc2RhL2hvbGRlcnMvZG0tMCAtLT4gL3N5cy9ibG9jay9kbS0wCiAgKi8KIAotc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpiZGV2X2dldF9rb2JqKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCi17Ci0JaWYgKGJkZXYtPmJkX2NvbnRhaW5zICE9IGJkZXYpCi0JCXJldHVybiBrb2JqZWN0X2dldCgmYmRldi0+YmRfcGFydC0+ZGV2LmtvYmopOwotCWVsc2UKLQkJcmV0dXJuIGtvYmplY3RfZ2V0KCZiZGV2LT5iZF9kaXNrLT5kZXYua29iaik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqYmRldl9nZXRfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCi17Ci0JaWYgKGJkZXYtPmJkX2NvbnRhaW5zICE9IGJkZXYpCi0JCXJldHVybiBrb2JqZWN0X2dldChiZGV2LT5iZF9wYXJ0LT5ob2xkZXJfZGlyKTsKLQllbHNlCi0JCXJldHVybiBrb2JqZWN0X2dldChiZGV2LT5iZF9kaXNrLT5ob2xkZXJfZGlyKTsKLX0KLQogc3RhdGljIGludCBhZGRfc3ltbGluayhzdHJ1Y3Qga29iamVjdCAqZnJvbSwgc3RydWN0IGtvYmplY3QgKnRvKQogewogCWlmICghZnJvbSB8fCAhdG8pCkBAIC02MDQsMTEgKzU4OCwxMSBAQAogCWlmICghYm8tPmhkZXYpCiAJCWdvdG8gZmFpbF9wdXRfc2RpcjsKIAotCWJvLT5zZGV2ID0gYmRldl9nZXRfa29iaihiZGV2KTsKKwliby0+c2RldiA9IGtvYmplY3RfZ2V0KCZwYXJ0X3RvX2RldihiZGV2LT5iZF9wYXJ0KS0+a29iaik7CiAJaWYgKCFiby0+c2RldikKIAkJZ290byBmYWlsX3B1dF9oZGV2OwogCi0JYm8tPmhkaXIgPSBiZGV2X2dldF9ob2xkZXIoYmRldik7CisJYm8tPmhkaXIgPSBrb2JqZWN0X2dldChiZGV2LT5iZF9wYXJ0LT5ob2xkZXJfZGlyKTsKIAlpZiAoIWJvLT5oZGlyKQogCQlnb3RvIGZhaWxfcHV0X3NkZXY7CiAKQEAgLTg2OCw2ICs4NTIsODcgQEAKIAogRVhQT1JUX1NZTUJPTChvcGVuX2J5X2Rldm51bSk7CiAKKy8qKgorICogZmx1c2hfZGlzayAtIGludmFsaWRhdGVzIGFsbCBidWZmZXItY2FjaGUgZW50cmllcyBvbiBhIGRpc2sKKyAqCisgKiBAYmRldjogICAgICBzdHJ1Y3QgYmxvY2sgZGV2aWNlIHRvIGJlIGZsdXNoZWQKKyAqCisgKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVyLWNhY2hlIGVudHJpZXMgb24gYSBkaXNrLiBJdCBzaG91bGQgYmUgY2FsbGVkCisgKiB3aGVuIGEgZGlzayBoYXMgYmVlbiBjaGFuZ2VkIC0tIGVpdGhlciBieSBhIG1lZGlhIGNoYW5nZSBvciBvbmxpbmUKKyAqIHJlc2l6ZS4KKyAqLworc3RhdGljIHZvaWQgZmx1c2hfZGlzayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWlmIChfX2ludmFsaWRhdGVfZGV2aWNlKGJkZXYpKSB7CisJCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXSA9ICIiOworCisJCWlmIChiZGV2LT5iZF9kaXNrKQorCQkJZGlza19uYW1lKGJkZXYtPmJkX2Rpc2ssIDAsIG5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGJ1c3kgaW5vZGVzIG9uIGNoYW5nZWQgbWVkaWEgb3IgIgorCQkgICAgICAgInJlc2l6ZWQgZGlzayAlc1xuIiwgbmFtZSk7CisJfQorCisJaWYgKCFiZGV2LT5iZF9kaXNrKQorCQlyZXR1cm47CisJaWYgKGRpc2tfcGFydGl0aW9uYWJsZShiZGV2LT5iZF9kaXNrKSkKKwkJYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAxOworfQorCisvKioKKyAqIGNoZWNrX2Rpc2tfc2l6ZV9jaGFuZ2UgLSBjaGVja3MgZm9yIGRpc2sgc2l6ZSBjaGFuZ2UgYW5kIGFkanVzdHMgYmRldiBzaXplLgorICogQGRpc2s6IHN0cnVjdCBnZW5kaXNrIHRvIGNoZWNrCisgKiBAYmRldjogc3RydWN0IGJkZXYgdG8gYWRqdXN0LgorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdG8gc2VlIGlmIHRoZSBiZGV2IHNpemUgZG9lcyBub3QgbWF0Y2ggdGhlIGRpc2sgc2l6ZQorICogYW5kIGFkanVzdHMgaXQgaWYgaXQgZGlmZmVycy4KKyAqLwordm9pZCBjaGVja19kaXNrX3NpemVfY2hhbmdlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWxvZmZfdCBkaXNrX3NpemUsIGJkZXZfc2l6ZTsKKworCWRpc2tfc2l6ZSA9IChsb2ZmX3QpZ2V0X2NhcGFjaXR5KGRpc2spIDw8IDk7CisJYmRldl9zaXplID0gaV9zaXplX3JlYWQoYmRldi0+YmRfaW5vZGUpOworCWlmIChkaXNrX3NpemUgIT0gYmRldl9zaXplKSB7CisJCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsKKworCQlkaXNrX25hbWUoZGlzaywgMCwgbmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogZGV0ZWN0ZWQgY2FwYWNpdHkgY2hhbmdlIGZyb20gJWxsZCB0byAlbGxkXG4iLAorCQkgICAgICAgbmFtZSwgYmRldl9zaXplLCBkaXNrX3NpemUpOworCQlpX3NpemVfd3JpdGUoYmRldi0+YmRfaW5vZGUsIGRpc2tfc2l6ZSk7CisJCWZsdXNoX2Rpc2soYmRldik7CisJfQorfQorRVhQT1JUX1NZTUJPTChjaGVja19kaXNrX3NpemVfY2hhbmdlKTsKKworLyoqCisgKiByZXZhbGlkYXRlX2Rpc2sgLSB3cmFwcGVyIGZvciBsb3dlci1sZXZlbCBkcml2ZXIncyByZXZhbGlkYXRlX2Rpc2sgY2FsbC1iYWNrCisgKiBAZGlzazogc3RydWN0IGdlbmRpc2sgdG8gYmUgcmV2YWxpZGF0ZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgYSB3cmFwcGVyIGZvciBsb3dlci1sZXZlbCBkcml2ZXIncyByZXZhbGlkYXRlX2Rpc2sKKyAqIGNhbGwtYmFja3MuICBJdCBpcyB1c2VkIHRvIGRvIGNvbW1vbiBwcmUgYW5kIHBvc3Qgb3BlcmF0aW9ucyBuZWVkZWQKKyAqIGZvciBhbGwgcmV2YWxpZGF0ZV9kaXNrIG9wZXJhdGlvbnMuCisgKi8KK2ludCByZXZhbGlkYXRlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkaXNrLT5mb3BzLT5yZXZhbGlkYXRlX2Rpc2spCisJCXJldCA9IGRpc2stPmZvcHMtPnJldmFsaWRhdGVfZGlzayhkaXNrKTsKKworCWJkZXYgPSBiZGdldF9kaXNrKGRpc2ssIDApOworCWlmICghYmRldikKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKKwljaGVja19kaXNrX3NpemVfY2hhbmdlKGRpc2ssIGJkZXYpOworCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworCWJkcHV0KGJkZXYpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJldmFsaWRhdGVfZGlzayk7CisKIC8qCiAgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHdoZXRoZXIgYSByZW1vdmFibGUgbWVkaWEgaGFzIGJlZW4gY2hhbmdlZCwKICAqIGFuZCBpbnZhbGlkYXRlcyBhbGwgYnVmZmVyLWNhY2hlLWVudHJpZXMgaW4gdGhhdCBjYXNlLiBUaGlzCkBAIC04ODcsMTMgKzk1Miw5IEBACiAJaWYgKCFiZG9wcy0+bWVkaWFfY2hhbmdlZChiZGV2LT5iZF9kaXNrKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoX19pbnZhbGlkYXRlX2RldmljZShiZGV2KSkKLQkJcHJpbnRrKCJWRlM6IGJ1c3kgaW5vZGVzIG9uIGNoYW5nZWQgbWVkaWEuXG4iKTsKLQorCWZsdXNoX2Rpc2soYmRldik7CiAJaWYgKGJkb3BzLT5yZXZhbGlkYXRlX2Rpc2spCiAJCWJkb3BzLT5yZXZhbGlkYXRlX2Rpc2soYmRldi0+YmRfZGlzayk7Ci0JaWYgKGJkZXYtPmJkX2Rpc2stPm1pbm9ycyA+IDEpCi0JCWJkZXYtPmJkX2ludmFsaWRhdGVkID0gMTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtOTI3LDEwICs5ODgsMTAgQEAKIAogc3RhdGljIGludCBkb19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZm9yX3BhcnQpCiB7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXIgPSBOVUxMOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQgPSBOVUxMOwogCWludCByZXQ7Ci0JaW50IHBhcnQ7CisJaW50IHBhcnRubzsKIAlpbnQgcGVybSA9IDA7CiAKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKQEAgLTk0OCwyNSArMTAwOSwyNyBAQAogCiAJcmV0ID0gLUVOWElPOwogCWZpbGUtPmZfbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisKIAlsb2NrX2tlcm5lbCgpOwotCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0KTsKLQlpZiAoIWRpc2spIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQliZHB1dChiZGV2KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0Jb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKKworCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0bm8pOworCWlmICghZGlzaykKKwkJZ290byBvdXRfdW5sb2NrX2tlcm5lbDsKKwlwYXJ0ID0gZGlza19nZXRfcGFydChkaXNrLCBwYXJ0bm8pOworCWlmICghcGFydCkKKwkJZ290byBvdXRfdW5sb2NrX2tlcm5lbDsKIAogCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2LT5iZF9tdXRleCwgZm9yX3BhcnQpOwogCWlmICghYmRldi0+YmRfb3BlbmVycykgewogCQliZGV2LT5iZF9kaXNrID0gZGlzazsKKwkJYmRldi0+YmRfcGFydCA9IHBhcnQ7CiAJCWJkZXYtPmJkX2NvbnRhaW5zID0gYmRldjsKLQkJaWYgKCFwYXJ0KSB7CisJCWlmICghcGFydG5vKSB7CiAJCQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwogCQkJaWYgKGRpc2stPmZvcHMtPm9wZW4pIHsKIAkJCQlyZXQgPSBkaXNrLT5mb3BzLT5vcGVuKGJkZXYtPmJkX2lub2RlLCBmaWxlKTsKIAkJCQlpZiAocmV0KQotCQkJCQlnb3RvIG91dF9maXJzdDsKKwkJCQkJZ290byBvdXRfY2xlYXI7CiAJCQl9CiAJCQlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKIAkJCQliZF9zZXRfc2l6ZShiZGV2LChsb2ZmX3QpZ2V0X2NhcGFjaXR5KGRpc2spPDw5KTsKQEAgLTk3OCwzNiArMTA0MSwzNiBAQAogCQkJaWYgKGJkZXYtPmJkX2ludmFsaWRhdGVkKQogCQkJCXJlc2Nhbl9wYXJ0aXRpb25zKGRpc2ssIGJkZXYpOwogCQl9IGVsc2UgewotCQkJc3RydWN0IGhkX3N0cnVjdCAqcDsKIAkJCXN0cnVjdCBibG9ja19kZXZpY2UgKndob2xlOwogCQkJd2hvbGUgPSBiZGdldF9kaXNrKGRpc2ssIDApOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWlmICghd2hvbGUpCi0JCQkJZ290byBvdXRfZmlyc3Q7CisJCQkJZ290byBvdXRfY2xlYXI7CiAJCQlCVUdfT04oZm9yX3BhcnQpOwogCQkJcmV0ID0gX19ibGtkZXZfZ2V0KHdob2xlLCBmaWxlLT5mX21vZGUsIGZpbGUtPmZfZmxhZ3MsIDEpOwogCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dF9maXJzdDsKKwkJCQlnb3RvIG91dF9jbGVhcjsKIAkJCWJkZXYtPmJkX2NvbnRhaW5zID0gd2hvbGU7Ci0JCQlwID0gZGlzay0+cGFydFtwYXJ0IC0gMV07CiAJCQliZGV2LT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPQogCQkJICAgd2hvbGUtPmJkX2lub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbzsKLQkJCWlmICghKGRpc2stPmZsYWdzICYgR0VOSERfRkxfVVApIHx8ICFwIHx8ICFwLT5ucl9zZWN0cykgeworCQkJaWYgKCEoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgfHwKKwkJCSAgICAhcGFydCB8fCAhcGFydC0+bnJfc2VjdHMpIHsKIAkJCQlyZXQgPSAtRU5YSU87Ci0JCQkJZ290byBvdXRfZmlyc3Q7CisJCQkJZ290byBvdXRfY2xlYXI7CiAJCQl9Ci0JCQlrb2JqZWN0X2dldCgmcC0+ZGV2LmtvYmopOwotCQkJYmRldi0+YmRfcGFydCA9IHA7Ci0JCQliZF9zZXRfc2l6ZShiZGV2LCAobG9mZl90KSBwLT5ucl9zZWN0cyA8PCA5KTsKKwkJCWJkX3NldF9zaXplKGJkZXYsIChsb2ZmX3QpcGFydC0+bnJfc2VjdHMgPDwgOSk7CiAJCX0KIAl9IGVsc2UgeworCQlkaXNrX3B1dF9wYXJ0KHBhcnQpOwogCQlwdXRfZGlzayhkaXNrKTsKLQkJbW9kdWxlX3B1dChvd25lcik7CisJCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOworCQlwYXJ0ID0gTlVMTDsKKwkJZGlzayA9IE5VTEw7CiAJCWlmIChiZGV2LT5iZF9jb250YWlucyA9PSBiZGV2KSB7CiAJCQlpZiAoYmRldi0+YmRfZGlzay0+Zm9wcy0+b3BlbikgewogCQkJCXJldCA9IGJkZXYtPmJkX2Rpc2stPmZvcHMtPm9wZW4oYmRldi0+YmRfaW5vZGUsIGZpbGUpOwogCQkJCWlmIChyZXQpCi0JCQkJCWdvdG8gb3V0OworCQkJCQlnb3RvIG91dF91bmxvY2tfYmRldjsKIAkJCX0KIAkJCWlmIChiZGV2LT5iZF9pbnZhbGlkYXRlZCkKIAkJCQlyZXNjYW5fcGFydGl0aW9ucyhiZGV2LT5iZF9kaXNrLCBiZGV2KTsKQEAgLTEwMjAsMTkgKzEwODMsMjQgQEAKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiAKLW91dF9maXJzdDoKKyBvdXRfY2xlYXI6CiAJYmRldi0+YmRfZGlzayA9IE5VTEw7CisJYmRldi0+YmRfcGFydCA9IE5VTEw7CiAJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKIAlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKIAkJX19ibGtkZXZfcHV0KGJkZXYtPmJkX2NvbnRhaW5zLCAxKTsKIAliZGV2LT5iZF9jb250YWlucyA9IE5VTEw7Ci0JcHV0X2Rpc2soZGlzayk7Ci0JbW9kdWxlX3B1dChvd25lcik7Ci1vdXQ6Cisgb3V0X3VubG9ja19iZGV2OgogCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworIG91dF91bmxvY2tfa2VybmVsOgogCXVubG9ja19rZXJuZWwoKTsKLQlpZiAocmV0KQotCQliZHB1dChiZGV2KTsKKworCWRpc2tfcHV0X3BhcnQocGFydCk7CisJaWYgKGRpc2spCisJCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOworCXB1dF9kaXNrKGRpc2spOworCWJkcHV0KGJkZXYpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTExNywxMSArMTE4NSw4IEBACiAKIAkJcHV0X2Rpc2soZGlzayk7CiAJCW1vZHVsZV9wdXQob3duZXIpOwotCi0JCWlmIChiZGV2LT5iZF9jb250YWlucyAhPSBiZGV2KSB7Ci0JCQlrb2JqZWN0X3B1dCgmYmRldi0+YmRfcGFydC0+ZGV2LmtvYmopOwotCQkJYmRldi0+YmRfcGFydCA9IE5VTEw7Ci0JCX0KKwkJZGlza19wdXRfcGFydChiZGV2LT5iZF9wYXJ0KTsKKwkJYmRldi0+YmRfcGFydCA9IE5VTEw7CiAJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOwogCQliZGV2LT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwogCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKQEAgLTExOTcsMTAgKzEyNjIsOSBAQAogCiAvKioKICAqIGxvb2t1cF9iZGV2ICAtIGxvb2t1cCBhIHN0cnVjdCBibG9ja19kZXZpY2UgYnkgbmFtZQorICogQHBhdGhuYW1lOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKICAqCi0gKiBAcGF0aDoJc3BlY2lhbCBmaWxlIHJlcHJlc2VudGluZyB0aGUgYmxvY2sgZGV2aWNlCi0gKgotICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBibG9ja2RldmljZSBhdCBAcGF0aCBpbiB0aGUgY3VycmVudAorICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBibG9ja2RldmljZSBhdCBAcGF0aG5hbWUgaW4gdGhlIGN1cnJlbnQKICAqIG5hbWVzcGFjZSBpZiBwb3NzaWJsZSBhbmQgcmV0dXJuIGl0LiAgUmV0dXJuIEVSUl9QVFIoZXJyb3IpCiAgKiBvdGhlcndpc2UuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCmluZGV4IDNjYjdjZGEuLjI2MmZhMTAgMTAwNjQ0Ci0tLSBhL2ZzL2NoYXJfZGV2LmMKKysrIGIvZnMvY2hhcl9kZXYuYwpAQCAtMjIsOSArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KIAotI2lmZGVmIENPTkZJR19LTU9ECi0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2VuZGlmCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19zcG5lZ28uYyBiL2ZzL2NpZnMvY2lmc19zcG5lZ28uYwppbmRleCAxMTdlZjRiLi5mY2VlOTI5IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKKysrIGIvZnMvY2lmcy9jaWZzX3NwbmVnby5jCkBAIC02NiwxMSArNjYsMjggQEAKIAkuZGVzY3JpYmUJPSB1c2VyX2Rlc2NyaWJlLAogfTsKIAotI2RlZmluZSBNQVhfVkVSX1NUUl9MRU4gICA4IC8qIGxlbmd0aCBvZiBsb25nZXN0IHZlcnNpb24gc3RyaW5nIGUuZy4KLQkJCQlzdHJsZW4oInZlcj0weEZGIikgKi8KLSNkZWZpbmUgTUFYX01FQ0hfU1RSX0xFTiAxMyAvKiBsZW5ndGggb2YgbG9uZ2VzdCBzZWN1cml0eSBtZWNoYW5pc20gbmFtZSwgZWcKLQkJCSAgICAgICBpbiBmdXR1cmUgY291bGQgaGF2ZSBzdHJsZW4oIjtzZWM9bnRsbXNzcGkiKSAqLwotI2RlZmluZSBNQVhfSVBWNl9BRERSX0xFTiA0MiAvKiBlZyBGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTAvNjAgKi8KKy8qIGxlbmd0aCBvZiBsb25nZXN0IHZlcnNpb24gc3RyaW5nIGUuZy4gIHN0cmxlbigidmVyPTB4RkYiKSAqLworI2RlZmluZSBNQVhfVkVSX1NUUl9MRU4JCTgKKworLyogbGVuZ3RoIG9mIGxvbmdlc3Qgc2VjdXJpdHkgbWVjaGFuaXNtIG5hbWUsIGVnIGluIGZ1dHVyZSBjb3VsZCBoYXZlCisgKiBzdHJsZW4oIjtzZWM9bnRsbXNzcGkiKSAqLworI2RlZmluZSBNQVhfTUVDSF9TVFJfTEVOCTEzCisKKy8qIG1heCBwb3NzaWJsZSBhZGRyIGxlbiBlZyBGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTAvNjAgKi8KKyNkZWZpbmUgTUFYX0lQVjZfQUREUl9MRU4JNDIKKworLyogc3RybGVuIG9mICJob3N0PSIgKi8KKyNkZWZpbmUgSE9TVF9LRVlfTEVOCQk1CisKKy8qIHN0cmxlbiBvZiAiO2lwND0iIG9yICI7aXA2PSIgKi8KKyNkZWZpbmUgSVBfS0VZX0xFTgkJNQorCisvKiBzdHJsZW4gb2YgIjt1aWQ9MHgiICovCisjZGVmaW5lIFVJRF9LRVlfTEVOCQk3CisKKy8qIHN0cmxlbiBvZiAiO3VzZXI9IiAqLworI2RlZmluZSBVU0VSX0tFWV9MRU4JCTYKKwogLyogZ2V0IGEga2V5IHN0cnVjdCB3aXRoIGEgU1BORUdPIHNlY3VyaXR5IGJsb2IsIHN1aXRhYmxlIGZvciBzZXNzaW9uIHNldHVwICovCiBzdHJ1Y3Qga2V5ICoKIGNpZnNfZ2V0X3NwbmVnb19rZXkoc3RydWN0IGNpZnNTZXNJbmZvICpzZXNJbmZvKQpAQCAtODQsMTEgKzEwMSwxMSBAQAogCS8qIGxlbmd0aCBvZiBmaWVsZHMgKHdpdGggc2VtaWNvbG9ucyk6IHZlcj0weHl6IGlwND1pcGFkZHJlc3MKIAkgICBob3N0PWhvc3RuYW1lIHNlYz1tZWNoYW5pc20gdWlkPTB4RkYgdXNlcj11c2VybmFtZSAqLwogCWRlc2NfbGVuID0gTUFYX1ZFUl9TVFJfTEVOICsKLQkJICAgNiAvKiBsZW4gb2YgImhvc3Q9IiAqLyArIHN0cmxlbihob3N0bmFtZSkgKwotCQkgICA1IC8qIGxlbiBvZiAiO2lwdjQ9IiAqLyArIE1BWF9JUFY2X0FERFJfTEVOICsKKwkJICAgSE9TVF9LRVlfTEVOICsgc3RybGVuKGhvc3RuYW1lKSArCisJCSAgIElQX0tFWV9MRU4gKyBNQVhfSVBWNl9BRERSX0xFTiArCiAJCSAgIE1BWF9NRUNIX1NUUl9MRU4gKwotCQkgICA3IC8qIGxlbiBvZiAiO3VpZD0weCIgKi8gKyAoc2l6ZW9mKHVpZF90KSAqIDIpICsKLQkJICAgNiAvKiBsZW4gb2YgIjt1c2VyPSIgKi8gKyBzdHJsZW4oc2VzSW5mby0+dXNlck5hbWUpICsgMTsKKwkJICAgVUlEX0tFWV9MRU4gKyAoc2l6ZW9mKHVpZF90KSAqIDIpICsKKwkJICAgVVNFUl9LRVlfTEVOICsgc3RybGVuKHNlc0luZm8tPnVzZXJOYW1lKSArIDE7CiAKIAlzcG5lZ29fa2V5ID0gRVJSX1BUUigtRU5PTUVNKTsKIAlkZXNjcmlwdGlvbiA9IGt6YWxsb2MoZGVzY19sZW4sIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuaCBiL2ZzL2NpZnMvY2lmc2ZzLmgKaW5kZXggMTM1Yzk2NS4uZjdiNGE1YyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC00MSw3ICs0MSw3IEBACiAJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICopOwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmNpZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCiAJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICopOwotZXh0ZXJuIGludCBjaWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK2V4dGVybiBpbnQgY2lmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBleHRlcm4gaW50IGNpZnNfaGFyZGxpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBpbnQgY2lmc19ta25vZChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIGRldl90KTsKIGV4dGVybiBpbnQgY2lmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCmluZGV4IDhkZmQ2ZjIuLjBkMjI0NzkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2dsb2IuaAorKysgYi9mcy9jaWZzL2NpZnNnbG9iLmgKQEAgLTMwOSw2ICszMDksNyBAQAogCV9fdTMyIHJlc3VtZV9rZXk7CiAJY2hhciAqbnR3cmtfYnVmX3N0YXJ0OwogCWNoYXIgKnNyY2hfZW50cmllc19zdGFydDsKKwljaGFyICpsYXN0X2VudHJ5OwogCWNoYXIgKnByZXN1bWVfbmFtZTsKIAl1bnNpZ25lZCBpbnQgcmVzdW1lX25hbWVfbGVuOwogCWJvb2wgZW5kT2ZTZWFyY2g6MTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IGE3MjlkMDguLjBjZmY3ZmUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtMTc5LDYgKzE3OSw4IEBACiBleHRlcm4gaW50IENJRlNTTUJTZXRGaWxlSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogCQkJY29uc3QgRklMRV9CQVNJQ19JTkZPICpkYXRhLCBfX3UxNiBmaWQsCiAJCQlfX3UzMiBwaWRfb2Zfb3BlbmVyKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlNldEZpbGVEaXNwb3NpdGlvbihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJYm9vbCBkZWxldGVfZmlsZSwgX191MTYgZmlkLCBfX3UzMiBwaWRfb2Zfb3BlbmVyKTsKICNpZiAwCiBleHRlcm4gaW50IENJRlNTTUJTZXRBdHRyTGVnYWN5KGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCQljaGFyICpmaWxlTmFtZSwgX191MTYgZG9zX2F0dHJpYnV0ZXMsCkBAIC0yMjksNyArMjMxLDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwKIAkJCWludCByZW1hcF9zcGVjaWFsX2NoYXJzKTsKIGV4dGVybiBpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uLAotCQkJaW50IG5ldGZpZCwgY2hhciAqdGFyZ2V0X25hbWUsCisJCQlpbnQgbmV0ZmlkLCBjb25zdCBjaGFyICp0YXJnZXRfbmFtZSwKIAkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwKIAkJCWludCByZW1hcF9zcGVjaWFsX2NoYXJzKTsKIGV4dGVybiBpbnQgQ0lGU0NyZWF0ZUhhcmRMaW5rKGNvbnN0IGludCB4aWQsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDk5NGRlN2MuLjZmNGZmZTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC0yMDE3LDcgKzIwMTcsNyBAQAogfQogCiBpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uLAotCQlpbnQgbmV0ZmlkLCBjaGFyICp0YXJnZXRfbmFtZSwKKwkJaW50IG5ldGZpZCwgY29uc3QgY2hhciAqdGFyZ2V0X25hbWUsCiAJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwgaW50IHJlbWFwKQogewogCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zZmlfcmVxICpwU01CICA9IE5VTEw7CkBAIC0yMDcxLDcgKzIwNzEsNyBAQAogCQkJCQlyZW1hcCk7CiAJfQogCXJlbmFtZV9pbmZvLT50YXJnZXRfbmFtZV9sZW4gPSBjcHVfdG9fbGUzMigyICogbGVuX29mX3N0cik7Ci0JY291bnQgPSAxMiAvKiBzaXplb2Yoc3RydWN0IHNldF9maWxlX3JlbmFtZSkgKi8gKyAoMiAqIGxlbl9vZl9zdHIpICsgMjsKKwljb3VudCA9IDEyIC8qIHNpemVvZihzdHJ1Y3Qgc2V0X2ZpbGVfcmVuYW1lKSAqLyArICgyICogbGVuX29mX3N0cik7CiAJYnl0ZV9jb3VudCArPSBjb3VudDsKIAlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CkBAIC0zNjE0LDYgKzM2MTQsOCBAQAogCQkvKiBCQiByZW1lbWJlciB0byBmcmVlIGJ1ZmZlciBpZiBlcnJvciBCQiAqLwogCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKIAkJaWYgKHJjID09IDApIHsKKwkJCXVuc2lnbmVkIGludCBsbm9mZjsKKwogCQkJaWYgKHBTTUJyLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKQogCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IHRydWU7CiAJCQllbHNlCkBAIC0zNjM2LDYgKzM2MzgsMTcgQEAKIAkJCQkJbGUxNl90b19jcHUocGFybXMtPlNlYXJjaENvdW50KTsKIAkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSA9IDIgLyogc2tpcCAuIGFuZCAuLiAqLyArCiAJCQkJcHNyY2hfaW5mLT5lbnRyaWVzX2luX2J1ZmZlcjsKKwkJCWxub2ZmID0gbGUxNl90b19jcHUocGFybXMtPkxhc3ROYW1lT2Zmc2V0KTsKKwkJCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUgPAorCQkJICAgICAgbG5vZmYpIHsKKwkJCQljRVJST1IoMSwgKCJpZ25vcmluZyBjb3JydXB0IHJlc3VtZSBuYW1lIikpOworCQkJCXBzcmNoX2luZi0+bGFzdF9lbnRyeSA9IE5VTEw7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCisJCQlwc3JjaF9pbmYtPmxhc3RfZW50cnkgPSBwc3JjaF9pbmYtPnNyY2hfZW50cmllc19zdGFydCArCisJCQkJCQkJbG5vZmY7CisKIAkJCSpwbmV0ZmlkID0gcGFybXMtPlNlYXJjaEhhbmRsZTsKIAkJfSBlbHNlIHsKIAkJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CkBAIC0zNzI1LDYgKzM3MzgsOCBAQAogCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKIAogCQlpZiAocmMgPT0gMCkgeworCQkJdW5zaWduZWQgaW50IGxub2ZmOworCiAJCQkvKiBCQiBmaXhtZSBhZGQgbG9jayBmb3IgZmlsZSAoc3JjaF9pbmZvKSBzdHJ1Y3QgaGVyZSAqLwogCQkJaWYgKHBTTUJyLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKQogCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IHRydWU7CkBAIC0zNzUxLDYgKzM3NjYsMTYgQEAKIAkJCQkJCWxlMTZfdG9fY3B1KHBhcm1zLT5TZWFyY2hDb3VudCk7CiAJCQlwc3JjaF9pbmYtPmluZGV4X29mX2xhc3RfZW50cnkgKz0KIAkJCQlwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyOworCQkJbG5vZmYgPSBsZTE2X3RvX2NwdShwYXJtcy0+TGFzdE5hbWVPZmZzZXQpOworCQkJaWYgKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLSBNQVhfQ0lGU19IRFJfU0laRSA8CisJCQkgICAgICBsbm9mZikgeworCQkJCWNFUlJPUigxLCAoImlnbm9yaW5nIGNvcnJ1cHQgcmVzdW1lIG5hbWUiKSk7CisJCQkJcHNyY2hfaW5mLT5sYXN0X2VudHJ5ID0gTlVMTDsKKwkJCQlyZXR1cm4gcmM7CisJCQl9IGVsc2UKKwkJCQlwc3JjaF9pbmYtPmxhc3RfZW50cnkgPQorCQkJCQlwc3JjaF9pbmYtPnNyY2hfZW50cmllc19zdGFydCArIGxub2ZmOworCiAvKiAgY0ZZSSgxLCgiZm54dDIgZW50cmllcyBpbiBidWYgJWQgaW5kZXhfb2ZfbGFzdCAlZCIsCiAJICAgIHBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXIsIHBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSkpOyAqLwogCkBAIC00ODc2LDYgKzQ5MDEsNjEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludAorQ0lGU1NNQlNldEZpbGVEaXNwb3NpdGlvbihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJICBib29sIGRlbGV0ZV9maWxlLCBfX3UxNiBmaWQsIF9fdTMyIHBpZF9vZl9vcGVuZXIpCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKKwljaGFyICpkYXRhX29mZnNldDsKKwlpbnQgcmMgPSAwOworCV9fdTE2IHBhcmFtcywgcGFyYW1fb2Zmc2V0LCBvZmZzZXQsIGJ5dGVfY291bnQsIGNvdW50OworCisJY0ZZSSgxLCAoIlNldCBGaWxlIERpc3Bvc2l0aW9uICh2aWEgU2V0RmlsZUluZm8pIikpOworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIpOworCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5oZHIuUGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KXBpZF9vZl9vcGVuZXIpOworCXBTTUItPmhkci5QaWRIaWdoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShwaWRfb2Zfb3BlbmVyID4+IDE2KSk7CisKKwlwYXJhbXMgPSA2OworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JlcSwgRmlkKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7CisKKwljb3VudCA9IDE7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIG1heCBTTUIgUERVIGZyb20gc2VzcyAqLworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfRklMRV9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIGNvdW50OworCXBTTUItPkRhdGFDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KHBhcmFtX29mZnNldCk7CisJcFNNQi0+RGF0YU9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldCk7CisJcFNNQi0+RmlkID0gZmlkOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfRElTUE9TSVRJT05fSU5GTyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwkqZGF0YV9vZmZzZXQgPSBkZWxldGVfZmlsZSA/IDEgOiAwOworCXJjID0gU2VuZFJlY2VpdmVOb1JzcCh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsIDApOworCWlmIChyYykKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gU2V0RmlsZURpc3Bvc2l0aW9uID0gJWQiLCByYykpOworCisJcmV0dXJuIHJjOworfQogCiBpbnQKIENJRlNTTUJTZXRQYXRoSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9kbnNfcmVzb2x2ZS5jIGIvZnMvY2lmcy9kbnNfcmVzb2x2ZS5jCmluZGV4IGEyZTA2NzMuLjFlMGMxYmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZG5zX3Jlc29sdmUuYworKysgYi9mcy9jaWZzL2Ruc19yZXNvbHZlLmMKQEAgLTI5LDQ1ICsyOSwxMyBAQAogI2luY2x1ZGUgImNpZnNwcm90by5oIgogI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKIAotc3RhdGljIGludCBkbnNfcmVzb2x2ZXJfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLAotCQlzaXplX3QgZGF0YWxlbikKLXsKLQlpbnQgcmMgPSAwOwotCWNoYXIgKmlwOwotCi0JaXAgPSBrbWFsbG9jKGRhdGFsZW4rMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1jcHkoaXAsIGRhdGEsIGRhdGFsZW4pOwotCWlwW2RhdGFsZW5dID0gJ1wwJzsKLQotCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgaXApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZAotZG5zX3Jlc29sdmVyX2Rlc3Ryb3koc3RydWN0IGtleSAqa2V5KQotewotCWtmcmVlKGtleS0+cGF5bG9hZC5kYXRhKTsKLX0KLQotc3RydWN0IGtleV90eXBlIGtleV90eXBlX2Ruc19yZXNvbHZlciA9IHsKLQkubmFtZSAgICAgICAgPSAiZG5zX3Jlc29sdmVyIiwKLQkuZGVmX2RhdGFsZW4gPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAotCS5kZXNjcmliZSAgICA9IHVzZXJfZGVzY3JpYmUsCi0JLmluc3RhbnRpYXRlID0gZG5zX3Jlc29sdmVyX2luc3RhbnRpYXRlLAotCS5kZXN0cm95ICAgICA9IGRuc19yZXNvbHZlcl9kZXN0cm95LAotCS5tYXRjaCAgICAgICA9IHVzZXJfbWF0Y2gsCi19OwotCiAvKiBDaGVja3MgaWYgc3VwcGxpZWQgbmFtZSBpcyBJUCBhZGRyZXNzCiAgKiByZXR1cm5zOgogICogCQkxIC0gbmFtZSBpcyBJUAogICogCQkwIC0gbmFtZSBpcyBub3QgSVAKICAqLwotc3RhdGljIGludCBpc19pcChjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGludAoraXNfaXAoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHNvY2thZGRyX2luIHNpbl9zZXJ2ZXI7CkBAIC04OSw2ICs1Nyw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50CitkbnNfcmVzb2x2ZXJfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLAorCQlzaXplX3QgZGF0YWxlbikKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgKmlwOworCisJaXAgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShpcCwgZGF0YSwgZGF0YWxlbik7CisJaXBbZGF0YWxlbl0gPSAnXDAnOworCisJLyogbWFrZSBzdXJlIHRoaXMgbG9va3MgbGlrZSBhbiBhZGRyZXNzICovCisJaWYgKCFpc19pcCgoY29uc3QgY2hhciAqKSBpcCkpIHsKKwkJa2ZyZWUoaXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZXktPnR5cGVfZGF0YS54WzBdID0gZGF0YWxlbjsKKwlyY3VfYXNzaWduX3BvaW50ZXIoa2V5LT5wYXlsb2FkLmRhdGEsIGlwKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2Ruc19yZXNvbHZlcl9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKK3sKKwlrZnJlZShrZXktPnBheWxvYWQuZGF0YSk7Cit9CisKK3N0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9kbnNfcmVzb2x2ZXIgPSB7CisJLm5hbWUgICAgICAgID0gImRuc19yZXNvbHZlciIsCisJLmRlZl9kYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKKwkuZGVzY3JpYmUgICAgPSB1c2VyX2Rlc2NyaWJlLAorCS5pbnN0YW50aWF0ZSA9IGRuc19yZXNvbHZlcl9pbnN0YW50aWF0ZSwKKwkuZGVzdHJveSAgICAgPSBkbnNfcmVzb2x2ZXJfZGVzdHJveSwKKwkubWF0Y2ggICAgICAgPSB1c2VyX21hdGNoLAorfTsKKwogLyogUmVzb2x2ZXMgc2VydmVyIG5hbWUgdG8gaXAgYWRkcmVzcy4KICAqIGlucHV0OgogICogCXVuYyAtIHNlcnZlciBVTkMKQEAgLTE0MCw2ICsxNDksNyBAQAogCiAJcmtleSA9IHJlcXVlc3Rfa2V5KCZrZXlfdHlwZV9kbnNfcmVzb2x2ZXIsIG5hbWUsICIiKTsKIAlpZiAoIUlTX0VSUihya2V5KSkgeworCQlsZW4gPSBya2V5LT50eXBlX2RhdGEueFswXTsKIAkJZGF0YSA9IHJrZXktPnBheWxvYWQuZGF0YTsKIAl9IGVsc2UgewogCQljRVJST1IoMSwgKCIlczogdW5hYmxlIHRvIHJlc29sdmU6ICVzIiwgX19mdW5jX18sIG5hbWUpKTsKQEAgLTE0OCwxMSArMTU4LDkgQEAKIAogc2tpcF91cGNhbGw6CiAJaWYgKGRhdGEpIHsKLQkJbGVuID0gc3RybGVuKGRhdGEpOwotCQkqaXBfYWRkciA9IGttYWxsb2MobGVuKzEsIEdGUF9LRVJORUwpOworCQkqaXBfYWRkciA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJCWlmICgqaXBfYWRkcikgewotCQkJbWVtY3B5KCppcF9hZGRyLCBkYXRhLCBsZW4pOwotCQkJKCppcF9hZGRyKVtsZW5dID0gJ1wwJzsKKwkJCW1lbWNweSgqaXBfYWRkciwgZGF0YSwgbGVuICsgMSk7CiAJCQlpZiAoIUlTX0VSUihya2V5KSkKIAkJCQljRllJKDEsICgiJXM6IHJlc29sdmVkOiAlcyB0byAlcyIsIF9fZnVuY19fLAogCQkJCQkJCW5hbWUsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IGNiZWZlMWYuLmM0YThhMDYgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogCS8qIHdhbnQgaGFuZGxlcyB3ZSBjYW4gdXNlIHRvIHJlYWQgd2l0aCBmaXJzdAogCSAgIGluIHRoZSBsaXN0IHNvIHdlIGRvIG5vdCBoYXZlIHRvIHdhbGsgdGhlCi0JICAgbGlzdCB0byBzZWFyY2ggZm9yIG9uZSBpbiBwcmVwYXJlX3dyaXRlICovCisJICAgbGlzdCB0byBzZWFyY2ggZm9yIG9uZSBpbiB3cml0ZV9iZWdpbiAqLwogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpIHsKIAkJbGlzdF9hZGRfdGFpbCgmcENpZnNGaWxlLT5mbGlzdCwKIAkJCSAgICAgICZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOwpAQCAtOTE1LDcgKzkxNSw3IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGNpZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKndyaXRlX2RhdGEsCi0Jc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKKwkJCSAgc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKIHsKIAlpbnQgcmMgPSAwOwogCXVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKQEAgLTEwNjUsNiArMTA2NSw3IEBACiBzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpmaW5kX3dyaXRhYmxlX2ZpbGUoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNfaW5vZGUpCiB7CiAJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCWJvb2wgYW55X2F2YWlsYWJsZSA9IGZhbHNlOwogCWludCByYzsKIAogCS8qIEhhdmluZyBhIG51bGwgaW5vZGUgaGVyZSAoYmVjYXVzZSBtYXBwaW5nLT5ob3N0IHdhcyBzZXQgdG8gemVybyBieQpAQCAtMTA4MCw4ICsxMDgxLDEwIEBACiAJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKIHJlZmluZF93cml0YWJsZToKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wZW5fZmlsZSwgJmNpZnNfaW5vZGUtPm9wZW5GaWxlTGlzdCwgZmxpc3QpIHsKLQkJaWYgKG9wZW5fZmlsZS0+Y2xvc2VQZW5kKQorCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQgfHwKKwkJICAgICghYW55X2F2YWlsYWJsZSAmJiBvcGVuX2ZpbGUtPnBpZCAhPSBjdXJyZW50LT50Z2lkKSkKIAkJCWNvbnRpbnVlOworCiAJCWlmIChvcGVuX2ZpbGUtPnBmaWxlICYmCiAJCSAgICAoKG9wZW5fZmlsZS0+cGZpbGUtPmZfZmxhZ3MgJiBPX1JEV1IpIHx8CiAJCSAgICAgKG9wZW5fZmlsZS0+cGZpbGUtPmZfZmxhZ3MgJiBPX1dST05MWSkpKSB7CkBAIC0xMTMxLDYgKzExMzQsMTEgQEAKIAkJCSAgIG9mIHRoZSBsb29wIGhlcmUuICovCiAJCX0KIAl9CisJLyogY291bGRuJ3QgZmluZCB1c2VhYmxlIEZIIHdpdGggc2FtZSBwaWQsIHRyeSBhbnkgYXZhaWxhYmxlICovCisJaWYgKCFhbnlfYXZhaWxhYmxlKSB7CisJCWFueV9hdmFpbGFibGUgPSB0cnVlOworCQlnb3RvIHJlZmluZF93cml0YWJsZTsKKwl9CiAJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTQ0Nyw0OSArMTQ1NSw1MiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBjaWZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3N0YXRpYyBpbnQgY2lmc193cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQogewotCWludCB4aWQ7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlsb2ZmX3QgcG9zaXRpb24gPSAoKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOwotCWNoYXIgKnBhZ2VfZGF0YTsKKwlpbnQgcmM7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAKLQl4aWQgPSBHZXRYaWQoKTsKLQljRllJKDEsICgiY29tbWl0IHdyaXRlIGZvciBwYWdlICVwIHVwIHRvIHBvc2l0aW9uICVsbGQgZm9yICVkIiwKLQkJIHBhZ2UsIHBvc2l0aW9uLCB0bykpOwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKHBvc2l0aW9uID4gaW5vZGUtPmlfc2l6ZSkKLQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3NpdGlvbik7CisJY0ZZSSgxLCAoIndyaXRlX2VuZCBmb3IgcGFnZSAlcCBmcm9tIHBvcyAlbGxkIHdpdGggJWQgYnl0ZXMiLAorCQkgcGFnZSwgcG9zLCBjb3BpZWQpKTsKIAotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSAmJiBjb3BpZWQgPT0gUEFHRV9DQUNIRV9TSVpFKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKIAlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQlwb3NpdGlvbiA9ICAoKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mZnNldDsKLQkJLyogY2FuIG5vdCByZWx5IG9uIChvciBsZXQpIHdyaXRlcGFnZSB3cml0ZSB0aGlzIGRhdGEgKi8KLQkJaWYgKHRvIDwgb2Zmc2V0KSB7Ci0JCQljRllJKDEsICgiSWxsZWdhbCBvZmZzZXRzLCBjYW4gbm90IGNvcHkgZnJvbSAlZCB0byAlZCIsCi0JCQkJb2Zmc2V0LCB0bykpOwotCQkJRnJlZVhpZCh4aWQpOwotCQkJcmV0dXJuIHJjOwotCQl9CisJCWNoYXIgKnBhZ2VfZGF0YTsKKwkJdW5zaWduZWQgb2Zmc2V0ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpbnQgeGlkOworCisJCXhpZCA9IEdldFhpZCgpOwogCQkvKiB0aGlzIGlzIHByb2JhYmx5IGJldHRlciB0aGFuIGRpcmVjdGx5IGNhbGxpbmcKIAkJICAgcGFydGlhbHBhZ2Vfd3JpdGUgc2luY2UgaW4gdGhpcyBmdW5jdGlvbiB0aGUgZmlsZSBoYW5kbGUgaXMKIAkJICAga25vd24gd2hpY2ggd2UgbWlnaHQgYXMgd2VsbAlsZXZlcmFnZSAqLwogCQkvKiBCQiBjaGVjayBpZiBhbnl0aGluZyBlbHNlIG1pc3Npbmcgb3V0IG9mIHBwdwogCQkgICBzdWNoIGFzIHVwZGF0aW5nIGxhc3Qgd3JpdGUgdGltZSAqLwogCQlwYWdlX2RhdGEgPSBrbWFwKHBhZ2UpOwotCQlyYyA9IGNpZnNfd3JpdGUoZmlsZSwgcGFnZV9kYXRhICsgb2Zmc2V0LCB0by1vZmZzZXQsCi0JCQkJJnBvc2l0aW9uKTsKLQkJaWYgKHJjID4gMCkKLQkJCXJjID0gMDsKLQkJLyogZWxzZSBpZiAocmMgPCAwKSBzaG91bGQgd2Ugc2V0IHdyaXRlYmVoaW5kIHJjPyAqLworCQlyYyA9IGNpZnNfd3JpdGUoZmlsZSwgcGFnZV9kYXRhICsgb2Zmc2V0LCBjb3BpZWQsICZwb3MpOworCQkvKiBpZiAocmMgPCAwKSBzaG91bGQgd2Ugc2V0IHdyaXRlYmVoaW5kIHJjPyAqLwogCQlrdW5tYXAocGFnZSk7CisKKwkJRnJlZVhpZCh4aWQpOwogCX0gZWxzZSB7CisJCXJjID0gY29waWVkOworCQlwb3MgKz0gY29waWVkOwogCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAl9CiAKLQlGcmVlWGlkKHhpZCk7CisJaWYgKHJjID4gMCkgeworCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0KKworCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtMjAzNSw0OSArMjA0Niw0NCBAQAogCQlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBjaWZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQorc3RhdGljIGludCBjaWZzX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCWxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQogewotCWludCByYyA9IDA7Ci0JbG9mZl90IGlfc2l6ZTsKLQlsb2ZmX3Qgb2Zmc2V0OworCXBnb2ZmX3QgaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsb2ZmX3Qgb2Zmc2V0ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCi0JY0ZZSSgxLCAoInByZXBhcmUgd3JpdGUgZm9yIHBhZ2UgJXAgZnJvbSAlZCB0byAlZCIsIHBhZ2UsIGZyb20sIHRvKSk7Ci0JaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwljRllJKDEsICgid3JpdGVfYmVnaW4gZnJvbSAlbGxkIGxlbiAlZCIsIChsb25nIGxvbmcpcG9zLCBsZW4pKTsKKworCSpwYWdlcCA9IF9fZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoISpwYWdlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoUGFnZVVwdG9kYXRlKCpwYWdlcCkpCiAJCXJldHVybiAwOwogCiAJLyogSWYgd2UgYXJlIHdyaXRpbmcgYSBmdWxsIHBhZ2UgaXQgd2lsbCBiZSB1cCB0byBkYXRlLAogCSAgIG5vIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgKi8KLQlpZiAoKHRvID09IFBBR0VfQ0FDSEVfU0laRSkgJiYgKGZyb20gPT0gMCkpIHsKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWlmIChsZW4gPT0gUEFHRV9DQUNIRV9TSVpFICYmIGZsYWdzICYgQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFKQogCQlyZXR1cm4gMDsKLQl9CiAKLQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JaV9zaXplID0gaV9zaXplX3JlYWQocGFnZS0+bWFwcGluZy0+aG9zdCk7CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1dST05MWSkgeworCQlpbnQgcmM7CiAKLQlpZiAoKG9mZnNldCA+PSBpX3NpemUpIHx8Ci0JICAgICgoZnJvbSA9PSAwKSAmJiAob2Zmc2V0ICsgdG8pID49IGlfc2l6ZSkpIHsKLQkJLyoKLQkJICogV2UgZG9uJ3QgbmVlZCB0byByZWFkIGRhdGEgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCSAqIHplcm8gaXQsIGFuZCBzZXQgdGhlIHBhZ2UgdXB0b2RhdGUKLQkJICovCi0JCXNpbXBsZV9wcmVwYXJlX3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIHRvKTsKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fV1JPTkxZKSB7CiAJCS8qIG1pZ2h0IGFzIHdlbGwgcmVhZCBhIHBhZ2UsIGl0IGlzIGZhc3QgZW5vdWdoICovCi0JCXJjID0gY2lmc19yZWFkcGFnZV93b3JrZXIoZmlsZSwgcGFnZSwgJm9mZnNldCk7CisJCXJjID0gY2lmc19yZWFkcGFnZV93b3JrZXIoZmlsZSwgKnBhZ2VwLCAmb2Zmc2V0KTsKKworCQkvKiB3ZSBkbyBub3QgbmVlZCB0byBwYXNzIGVycm9ycyBiYWNrCisJCSAgIGUuZy4gaWYgd2UgZG8gbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUKKwkJICAgYmVjYXVzZSBjaWZzX3dyaXRlX2VuZCB3aWxsIGF0dGVtcHQgc3luY2hyb25vdXMgd3JpdGVzCisJCSAgIC0tIHNoYWdneSAqLwogCX0gZWxzZSB7CiAJCS8qIHdlIGNvdWxkIHRyeSB1c2luZyBhbm90aGVyIGZpbGUgaGFuZGxlIGlmIHRoZXJlIGlzIG9uZSAtCiAJCSAgIGJ1dCBob3cgd291bGQgd2UgbG9jayBpdCB0byBwcmV2ZW50IGNsb3NlIG9mIHRoYXQgaGFuZGxlCiAJCSAgIHJhY2luZyB3aXRoIHRoaXMgcmVhZD8gSW4gYW55IGNhc2UKLQkJICAgdGhpcyB3aWxsIGJlIHdyaXR0ZW4gb3V0IGJ5IGNvbW1pdF93cml0ZSBzbyBpcyBmaW5lICovCisJCSAgIHRoaXMgd2lsbCBiZSB3cml0dGVuIG91dCBieSB3cml0ZV9lbmQgc28gaXMgZmluZSAqLwogCX0KIAotCS8qIHdlIGRvIG5vdCBuZWVkIHRvIHBhc3MgZXJyb3JzIGJhY2sKLQkgICBlLmcuIGlmIHdlIGRvIG5vdCBoYXZlIHJlYWQgYWNjZXNzIHRvIHRoZSBmaWxlCi0JICAgYmVjYXVzZSBjaWZzX2NvbW1pdF93cml0ZSB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4gIC0tIHNoYWdneSAqLwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODYsOCArMjA5Miw4IEBACiAJLnJlYWRwYWdlcyA9IGNpZnNfcmVhZHBhZ2VzLAogCS53cml0ZXBhZ2UgPSBjaWZzX3dyaXRlcGFnZSwKIAkud3JpdGVwYWdlcyA9IGNpZnNfd3JpdGVwYWdlcywKLQkucHJlcGFyZV93cml0ZSA9IGNpZnNfcHJlcGFyZV93cml0ZSwKLQkuY29tbWl0X3dyaXRlID0gY2lmc19jb21taXRfd3JpdGUsCisJLndyaXRlX2JlZ2luID0gY2lmc193cml0ZV9iZWdpbiwKKwkud3JpdGVfZW5kID0gY2lmc193cml0ZV9lbmQsCiAJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCiAJLyogLnN5bmNfcGFnZSA9IGNpZnNfc3luY19wYWdlLCAqLwogCS8qIC5kaXJlY3RfSU8gPSAqLwpAQCAtMjEwMiw4ICsyMTA4LDggQEAKIAkucmVhZHBhZ2UgPSBjaWZzX3JlYWRwYWdlLAogCS53cml0ZXBhZ2UgPSBjaWZzX3dyaXRlcGFnZSwKIAkud3JpdGVwYWdlcyA9IGNpZnNfd3JpdGVwYWdlcywKLQkucHJlcGFyZV93cml0ZSA9IGNpZnNfcHJlcGFyZV93cml0ZSwKLQkuY29tbWl0X3dyaXRlID0gY2lmc19jb21taXRfd3JpdGUsCisJLndyaXRlX2JlZ2luID0gY2lmc193cml0ZV9iZWdpbiwKKwkud3JpdGVfZW5kID0gY2lmc193cml0ZV9lbmQsCiAJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCiAJLyogLnN5bmNfcGFnZSA9IGNpZnNfc3luY19wYWdlLCAqLwogCS8qIC5kaXJlY3RfSU8gPSAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IDljNTQ4ZjEuLmE4YzgzMzMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTY2NSw0MCArNjY1LDIwMSBAQAogCXJldHVybiBpbm9kZTsKIH0KIAotaW50IGNpZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KQorc3RhdGljIGludAorY2lmc19zZXRfZmlsZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMsIGludCB4aWQsCisJCSAgICBjaGFyICpmdWxsX3BhdGgsIF9fdTMyIGRvc2F0dHIpCit7CisJaW50IHJjOworCWludCBvcGxvY2sgPSAwOworCV9fdTE2IG5ldGZpZDsKKwlfX3UzMiBuZXRwaWQ7CisJYm9vbCBzZXRfdGltZSA9IGZhbHNlOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0lub2RlID0gQ0lGU19JKGlub2RlKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24gPSBjaWZzX3NiLT50Y29uOworCUZJTEVfQkFTSUNfSU5GTwlpbmZvX2J1ZjsKKworCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSB7CisJCXNldF90aW1lID0gdHJ1ZTsKKwkJaW5mb19idWYuTGFzdEFjY2Vzc1RpbWUgPQorCQkJY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoYXR0cnMtPmlhX2F0aW1lKSk7CisJfSBlbHNlCisJCWluZm9fYnVmLkxhc3RBY2Nlc3NUaW1lID0gMDsKKworCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCXNldF90aW1lID0gdHJ1ZTsKKwkJaW5mb19idWYuTGFzdFdyaXRlVGltZSA9CisJCSAgICBjcHVfdG9fbGU2NChjaWZzX1VuaXhUaW1lVG9OVChhdHRycy0+aWFfbXRpbWUpKTsKKwl9IGVsc2UKKwkJaW5mb19idWYuTGFzdFdyaXRlVGltZSA9IDA7CisKKwkvKgorCSAqIFNhbWJhIHRocm93cyB0aGlzIGZpZWxkIGF3YXksIGJ1dCB3aW5kb3dzIG1heSBhY3R1YWxseSB1c2UgaXQuCisJICogRG8gbm90IHNldCBjdGltZSB1bmxlc3Mgb3RoZXIgdGltZSBzdGFtcHMgYXJlIGNoYW5nZWQgZXhwbGljaXRseQorCSAqIChpLmUuIGJ5IHV0aW1lcygpKSBzaW5jZSB3ZSB3b3VsZCB0aGVuIGhhdmUgYSBtaXggb2YgY2xpZW50IGFuZAorCSAqIHNlcnZlciB0aW1lcy4KKwkgKi8KKwlpZiAoc2V0X3RpbWUgJiYgKGF0dHJzLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpKSB7CisJCWNGWUkoMSwgKCJDSUZTIC0gQ1RJTUUgY2hhbmdlZCIpKTsKKwkJaW5mb19idWYuQ2hhbmdlVGltZSA9CisJCSAgICBjcHVfdG9fbGU2NChjaWZzX1VuaXhUaW1lVG9OVChhdHRycy0+aWFfY3RpbWUpKTsKKwl9IGVsc2UKKwkJaW5mb19idWYuQ2hhbmdlVGltZSA9IDA7CisKKwlpbmZvX2J1Zi5DcmVhdGlvblRpbWUgPSAwOwkvKiBkb24ndCBjaGFuZ2UgKi8KKwlpbmZvX2J1Zi5BdHRyaWJ1dGVzID0gY3B1X3RvX2xlMzIoZG9zYXR0cik7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgb3BlbiBmb3Igd3JpdGUsIGp1c3QgdXNlIHRoYXQgZmlsZWlkCisJICovCisJb3Blbl9maWxlID0gZmluZF93cml0YWJsZV9maWxlKGNpZnNJbm9kZSk7CisJaWYgKG9wZW5fZmlsZSkgeworCQluZXRmaWQgPSBvcGVuX2ZpbGUtPm5ldGZpZDsKKwkJbmV0cGlkID0gb3Blbl9maWxlLT5waWQ7CisJCWdvdG8gc2V0X3ZpYV9maWxlaGFuZGxlOworCX0KKworCS8qCisJICogTlQ0IGFwcGFyZW50bHkgcmV0dXJucyBzdWNjZXNzIG9uIHRoaXMgY2FsbCwgYnV0IGl0IGRvZXNuJ3QKKwkgKiByZWFsbHkgd29yay4KKwkgKi8KKwlpZiAoIShwVGNvbi0+c2VzLT5mbGFncyAmIENJRlNfU0VTX05UNCkpIHsKKwkJcmMgPSBDSUZTU01CU2V0UGF0aEluZm8oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCSAgICAgJmluZm9fYnVmLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQkJICAgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCisJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCWNpZnNJbm9kZS0+Y2lmc0F0dHJzID0gZG9zYXR0cjsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKHJjICE9IC1FT1BOT1RTVVBQICYmIHJjICE9IC1FSU5WQUwpCisJCQlnb3RvIG91dDsKKwl9CisKKwljRllJKDEsICgiY2FsbGluZyBTZXRGaWxlSW5mbyBzaW5jZSBTZXRQYXRoSW5mbyBmb3IgIgorCQkgInRpbWVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzZXJ2ZXIiKSk7CisJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIEZJTEVfT1BFTiwKKwkJCSBTWU5DSFJPTklaRSB8IEZJTEVfV1JJVEVfQVRUUklCVVRFUywKKwkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywKKwkJCSBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKworCWlmIChyYyAhPSAwKSB7CisJCWlmIChyYyA9PSAtRUlPKQorCQkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwluZXRwaWQgPSBjdXJyZW50LT50Z2lkOworCitzZXRfdmlhX2ZpbGVoYW5kbGU6CisJcmMgPSBDSUZTU01CU2V0RmlsZUluZm8oeGlkLCBwVGNvbiwgJmluZm9fYnVmLCBuZXRmaWQsIG5ldHBpZCk7CisJaWYgKCFyYykKKwkJY2lmc0lub2RlLT5jaWZzQXR0cnMgPSBkb3NhdHRyOworCisJaWYgKG9wZW5fZmlsZSA9PSBOVUxMKQorCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwllbHNlCisJCWF0b21pY19kZWMoJm9wZW5fZmlsZS0+d3J0UGVuZGluZyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKgorICogb3BlbiB0aGUgZ2l2ZW4gZmlsZSAoaWYgaXQgaXNuJ3QgYWxyZWFkeSksIHNldCB0aGUgREVMRVRFX09OX0NMT1NFIGJpdAorICogYW5kIHJlbmFtZSBpdCB0byBhIHJhbmRvbSBuYW1lIHRoYXQgaG9wZWZ1bGx5IHdvbid0IGNvbmZsaWN0IHdpdGgKKyAqIGFueXRoaW5nIGVsc2UuCisgKi8KK3N0YXRpYyBpbnQKK2NpZnNfcmVuYW1lX3BlbmRpbmdfZGVsZXRlKGNoYXIgKmZ1bGxfcGF0aCwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IHhpZCkKK3sKKwlpbnQgb3Bsb2NrID0gMDsKKwlpbnQgcmM7CisJX191MTYgbmV0ZmlkOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uID0gY2lmc19zYi0+dGNvbjsKKwlfX3UzMiBkb3NhdHRyOworCUZJTEVfQkFTSUNfSU5GTyAqaW5mb19idWY7CisKKwlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCisJCQkgREVMRVRFfEZJTEVfV1JJVEVfQVRUUklCVVRFUywKKwkJCSBDUkVBVEVfTk9UX0RJUnxDUkVBVEVfREVMRVRFX09OX0NMT1NFLAorCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKKwkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBzZXQgQVRUUl9ISURERU4gYW5kIGNsZWFyIEFUVFJfUkVBRE9OTFkgKi8KKwljaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCWRvc2F0dHIgPSBjaWZzSW5vZGUtPmNpZnNBdHRycyAmIH5BVFRSX1JFQURPTkxZOworCWlmIChkb3NhdHRyID09IDApCisJCWRvc2F0dHIgfD0gQVRUUl9OT1JNQUw7CisJZG9zYXR0ciB8PSBBVFRSX0hJRERFTjsKKworCWluZm9fYnVmID0ga3phbGxvYyhzaXplb2YoKmluZm9fYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm9fYnVmID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisJaW5mb19idWYtPkF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihkb3NhdHRyKTsKKwlyYyA9IENJRlNTTUJTZXRGaWxlSW5mbyh4aWQsIHRjb24sIGluZm9fYnVmLCBuZXRmaWQsIGN1cnJlbnQtPnRnaWQpOworCWtmcmVlKGluZm9fYnVmKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfY2xvc2U7CisJY2lmc0lub2RlLT5jaWZzQXR0cnMgPSBkb3NhdHRyOworCisJLyogc2lsbHktcmVuYW1lIHRoZSBmaWxlICovCisJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgdGNvbiwgbmV0ZmlkLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQkJICAgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCQkgICAgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCisJLyogc2V0IERFTEVURV9PTl9DTE9TRSAqLworCXJjID0gQ0lGU1NNQlNldEZpbGVEaXNwb3NpdGlvbih4aWQsIHRjb24sIHRydWUsIG5ldGZpZCwgY3VycmVudC0+dGdpZCk7CisKKwkvKgorCSAqIHNvbWUgc2FtYmEgdmVyc2lvbnMgcmV0dXJuIC1FTk9FTlQgd2hlbiB3ZSB0cnkgdG8gc2V0IHRoZSBmaWxlCisJICogZGlzcG9zaXRpb24gaGVyZS4gTGlrZWx5IGEgc2FtYmEgYnVnLCBidXQgd29yayBhcm91bmQgaXQgZm9yIG5vdworCSAqLworCWlmIChyYyA9PSAtRU5PRU5UKQorCQlyYyA9IDA7CisKK291dF9jbG9zZToKKwlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOworb3V0OgorCXJldHVybiByYzsKK30KKworaW50IGNpZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgeGlkOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7Ci0Jc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CiAJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKLQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0lub2RlOwotCUZJTEVfQkFTSUNfSU5GTyAqcGluZm9fYnVmOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihzYik7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiA9IGNpZnNfc2ItPnRjb247CisJc3RydWN0IGlhdHRyICphdHRycyA9IE5VTEw7CisJX191MzIgZG9zYXR0ciA9IDAsIG9yaWdhdHRyID0gMDsKIAotCWNGWUkoMSwgKCJjaWZzX3VubGluaywgaW5vZGUgPSAweCVwIiwgaW5vZGUpKTsKKwljRllJKDEsICgiY2lmc191bmxpbmssIGRpcj0weCVwLCBkZW50cnk9MHglcCIsIGRpciwgZGVudHJ5KSk7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIAotCWlmIChpbm9kZSkKLQkJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwotCWVsc2UKLQkJY2lmc19zYiA9IENJRlNfU0IoZGlyZW50cnktPmRfc2IpOwotCXBUY29uID0gY2lmc19zYi0+dGNvbjsKLQotCS8qIFVubGluayBjYW4gYmUgY2FsbGVkIGZyb20gcmVuYW1lIHNvIHdlIGNhbiBub3QgZ3JhYiB0aGUgc2VtIGhlcmUKLQkgICBzaW5jZSB3ZSBkZWFkbG9jayBvdGhlcndpc2UgKi8KLS8qCW11dGV4X2xvY2soJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfbXV0ZXgpOyovCi0JZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7Ci0vKgltdXRleF91bmxvY2soJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfbXV0ZXgpOyovCisJLyogVW5saW5rIGNhbiBiZSBjYWxsZWQgZnJvbSByZW5hbWUgc28gd2UgY2FuIG5vdCB0YWtlIHRoZQorCSAqIHNiLT5zX3Zmc19yZW5hbWVfbXV0ZXggaGVyZSAqLworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGVudHJ5KTsKIAlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCWlmICgodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgJiYKIAkJKENJRlNfVU5JWF9QT1NJWF9QQVRIX09QU19DQVAgJgotCQkJbGU2NF90b19jcHUocFRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSkpKSB7Ci0JCXJjID0gQ0lGU1BPU0lYRGVsRmlsZSh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQlsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKSkgeworCQlyYyA9IENJRlNQT1NJWERlbEZpbGUoeGlkLCB0Y29uLCBmdWxsX3BhdGgsCiAJCQlTTUJfUE9TSVhfVU5MSU5LX0ZJTEVfVEFSR0VULCBjaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAkJY0ZZSSgxLCAoInBvc2l4IGRlbCByYyAlZCIsIHJjKSk7CkBAIC03MDYsMTI1ICs4NjcsNjAgQEAKIAkJCWdvdG8gcHN4X2RlbF9ub19yZXRyeTsKIAl9CiAKLQlyYyA9IENJRlNTTUJEZWxGaWxlKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgY2lmc19zYi0+bG9jYWxfbmxzLAorcmV0cnlfc3RkX2RlbGV0ZToKKwlyYyA9IENJRlNTTUJEZWxGaWxlKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBjaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwogcHN4X2RlbF9ub19yZXRyeToKIAlpZiAoIXJjKSB7Ci0JCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkKLQkJCWRyb3BfbmxpbmsoZGlyZW50cnktPmRfaW5vZGUpOworCQlpZiAoaW5vZGUpCisJCQlkcm9wX25saW5rKGlub2RlKTsKIAl9IGVsc2UgaWYgKHJjID09IC1FTk9FTlQpIHsKLQkJZF9kcm9wKGRpcmVudHJ5KTsKKwkJZF9kcm9wKGRlbnRyeSk7CiAJfSBlbHNlIGlmIChyYyA9PSAtRVRYVEJTWSkgewotCQlpbnQgb3Bsb2NrID0gMDsKLQkJX191MTYgbmV0ZmlkOwotCi0JCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sIERFTEVURSwKLQkJCQkgQ1JFQVRFX05PVF9ESVIgfCBDUkVBVEVfREVMRVRFX09OX0NMT1NFLAotCQkJCSAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCQlpZiAocmMgPT0gMCkgewotCQkJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgcFRjb24sIG5ldGZpZCwgTlVMTCwKLQkJCQkJICAgICAgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQkgICAgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKLQkJCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkKLQkJCQlkcm9wX25saW5rKGRpcmVudHJ5LT5kX2lub2RlKTsKKwkJcmMgPSBjaWZzX3JlbmFtZV9wZW5kaW5nX2RlbGV0ZShmdWxsX3BhdGgsIGlub2RlLCB4aWQpOworCQlpZiAocmMgPT0gMCkKKwkJCWRyb3BfbmxpbmsoaW5vZGUpOworCX0gZWxzZSBpZiAocmMgPT0gLUVBQ0NFUyAmJiBkb3NhdHRyID09IDApIHsKKwkJYXR0cnMgPSBremFsbG9jKHNpemVvZigqYXR0cnMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGF0dHJzID09IE5VTEwpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3JldmFsOwogCQl9Ci0JfSBlbHNlIGlmIChyYyA9PSAtRUFDQ0VTKSB7Ci0JCS8qIHRyeSBvbmx5IGlmIHIvbyBhdHRyaWJ1dGUgc2V0IGluIGxvY2FsIGxvb2t1cCBkYXRhPyAqLwotCQlwaW5mb19idWYgPSBremFsbG9jKHNpemVvZihGSUxFX0JBU0lDX0lORk8pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBpbmZvX2J1ZikgewotCQkJLyogQVRUUlMgc2V0IHRvIG5vcm1hbCBjbGVhcnMgci9vIGJpdCAqLwotCQkJcGluZm9fYnVmLT5BdHRyaWJ1dGVzID0gY3B1X3RvX2xlMzIoQVRUUl9OT1JNQUwpOwotCQkJaWYgKCEocFRjb24tPnNlcy0+ZmxhZ3MgJiBDSUZTX1NFU19OVDQpKQotCQkJCXJjID0gQ0lGU1NNQlNldFBhdGhJbmZvKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKLQkJCQkJCSAgICAgcGluZm9fYnVmLAotCQkJCQkJICAgICBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJCQkgICAgIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQllbHNlCi0JCQkJcmMgPSAtRU9QTk9UU1VQUDsKIAotCQkJaWYgKHJjID09IC1FT1BOT1RTVVBQKSB7Ci0JCQkJaW50IG9wbG9jayA9IDA7Ci0JCQkJX191MTYgbmV0ZmlkOwotCQkJLyoJcmMgPSBDSUZTU01CU2V0QXR0ckxlZ2FjeSh4aWQsIHBUY29uLAotCQkJCQkJCSAgZnVsbF9wYXRoLAotCQkJCQkJCSAgKF9fdTE2KUFUVFJfTk9STUFMLAotCQkJCQkJCSAgY2lmc19zYi0+bG9jYWxfbmxzKTsKLQkJCSAgIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uIGl0IHNlZW1zIHRoYXQgTlQ0IGVhdHMgdGhlCi0JCQkgICBvbGQgc2V0YXR0ciBjYWxsIHdpdGhvdXQgYWN0dWFsbHkgc2V0dGluZyB0aGUKLQkJCSAgIGF0dHJpYnV0ZXMgc28gb24gdG8gdGhlIHRoaXJkIGF0dGVtcHRlZCB3b3JrYXJvdW5kCi0JCQkgICAqLworCQkvKiB0cnkgdG8gcmVzZXQgZG9zIGF0dHJpYnV0ZXMgKi8KKwkJb3JpZ2F0dHIgPSBjaWZzSW5vZGUtPmNpZnNBdHRyczsKKwkJaWYgKG9yaWdhdHRyID09IDApCisJCQlvcmlnYXR0ciB8PSBBVFRSX05PUk1BTDsKKwkJZG9zYXR0ciA9IG9yaWdhdHRyICYgfkFUVFJfUkVBRE9OTFk7CisJCWlmIChkb3NhdHRyID09IDApCisJCQlkb3NhdHRyIHw9IEFUVFJfTk9STUFMOworCQlkb3NhdHRyIHw9IEFUVFJfSElEREVOOwogCi0JCQkvKiBCQiBjb3VsZCBzY2FuIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgb3BlbgotCQkJICAgYW5kIHBhc3MgaW4gcGlkIG9mIG9wZW5lciB0byBmdW5jdGlvbiAqLwotCQkJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAotCQkJCQkJIEZJTEVfT1BFTiwgU1lOQ0hST05JWkUgfAotCQkJCQkJIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgMCwKLQkJCQkJCSAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLAotCQkJCQkJIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCQkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQkgICAgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJCXJjID0gQ0lGU1NNQlNldEZpbGVJbmZvKHhpZCwgcFRjb24sCi0JCQkJCQkJCXBpbmZvX2J1ZiwKLQkJCQkJCQkJbmV0ZmlkLAotCQkJCQkJCQljdXJyZW50LT50Z2lkKTsKLQkJCQkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIG5ldGZpZCk7Ci0JCQkJfQotCQkJfQotCQkJa2ZyZWUocGluZm9fYnVmKTsKLQkJfQotCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBDSUZTU01CRGVsRmlsZSh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCi0JCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJCSAgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJaWYgKGRpcmVudHJ5LT5kX2lub2RlKQotCQkJCQlkcm9wX25saW5rKGRpcmVudHJ5LT5kX2lub2RlKTsKLQkJCX0gZWxzZSBpZiAocmMgPT0gLUVUWFRCU1kpIHsKLQkJCQlpbnQgb3Bsb2NrID0gMDsKLQkJCQlfX3UxNiBuZXRmaWQ7CisJCXJjID0gY2lmc19zZXRfZmlsZV9pbmZvKGlub2RlLCBhdHRycywgeGlkLCBmdWxsX3BhdGgsIGRvc2F0dHIpOworCQlpZiAocmMgIT0gMCkKKwkJCWdvdG8gb3V0X3JldmFsOwogCi0JCQkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsCi0JCQkJCQkgRklMRV9PUEVOLCBERUxFVEUsCi0JCQkJCQkgQ1JFQVRFX05PVF9ESVIgfAotCQkJCQkJIENSRUFURV9ERUxFVEVfT05fQ0xPU0UsCi0JCQkJCQkgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKLQkJCQkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQkJICAgIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQkJCQlpZiAocmMgPT0gMCkgewotCQkJCQlDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCBwVGNvbiwKLQkJCQkJCW5ldGZpZCwgTlVMTCwKLQkJCQkJCWNpZnNfc2ItPmxvY2FsX25scywKLQkJCQkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJCSAgICBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQkJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBuZXRmaWQpOwotCQkJCQlpZiAoZGlyZW50cnktPmRfaW5vZGUpCi0JCQkJCQlkcm9wX25saW5rKGRpcmVudHJ5LT5kX2lub2RlKTsKLQkJCQl9Ci0JCQkvKiBCQiBpZiByYyA9IC1FVFhUQlVTWSBnb3RvIHRoZSByZW5hbWUgbG9naWMgQkIgKi8KLQkJCX0KLQkJfQorCQlnb3RvIHJldHJ5X3N0ZF9kZWxldGU7CiAJfQotCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkgewotCQljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCisJLyogdW5kbyB0aGUgc2V0YXR0ciBpZiB3ZSBlcnJvcmVkIG91dCBhbmQgaXQncyBuZWVkZWQgKi8KKwlpZiAocmMgIT0gMCAmJiBkb3NhdHRyICE9IDApCisJCWNpZnNfc2V0X2ZpbGVfaW5mbyhpbm9kZSwgYXR0cnMsIHhpZCwgZnVsbF9wYXRoLCBvcmlnYXR0cik7CisKK291dF9yZXZhbDoKKwlpZiAoaW5vZGUpIHsKKwkJY2lmc0lub2RlID0gQ0lGU19JKGlub2RlKTsKIAkJY2lmc0lub2RlLT50aW1lID0gMDsJLyogd2lsbCBmb3JjZSByZXZhbGlkYXRlIHRvIGdldCBpbmZvCiAJCQkJCSAgIHdoZW4gbmVlZGVkICovCi0JCWRpcmVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoc2IpOwogCX0KLQlpZiAoaW5vZGUpIHsKLQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Ci0JCWNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7Ci0JCWNpZnNJbm9kZS0+dGltZSA9IDA7CS8qIGZvcmNlIHJldmFsaWRhdGUgb2YgZGlyIGFzIHdlbGwgKi8KLQl9CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKHNiKTsKKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyKTsKKwlDSUZTX0koZGlyKS0+dGltZSA9IDA7CS8qIGZvcmNlIHJldmFsaWRhdGUgb2YgZGlyIGFzIHdlbGwgKi8KIAogCWtmcmVlKGZ1bGxfcGF0aCk7CisJa2ZyZWUoYXR0cnMpOwogCUZyZWVYaWQoeGlkKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC04NjksNyArOTY1LDcgQEAKIAogaW50IGNpZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIGludCBtb2RlKQogewotCWludCByYyA9IDA7CisJaW50IHJjID0gMCwgdG1wcmM7CiAJaW50IHhpZDsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOwpAQCAtOTMxLDYgKzEwMjcsNyBAQAogCQkJCWtmcmVlKHBJbmZvKTsKIAkJCQlnb3RvIG1rZGlyX2dldF9pbmZvOwogCQkJfQorCiAJCQkvKiBJcyBhbiBpX2lubyBvZiB6ZXJvIGxlZ2FsPyAqLwogCQkJLyogQXJlIHRoZXJlIHNhbml0eSBjaGVja3Mgd2UgY2FuIHVzZSB0byBlbnN1cmUgdGhhdAogCQkJICAgdGhlIHNlcnZlciBpcyByZWFsbHkgZmlsbGluZyBpbiB0aGF0IGZpZWxkPyAqLwpAQCAtMTAxOSwxMiArMTExNiwyMCBAQAogCQkJaWYgKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSAmJgogCQkJICAgIChtb2RlICYgU19JV1VHTykgPT0gMCkgewogCQkJCUZJTEVfQkFTSUNfSU5GTyBwSW5mbzsKKwkJCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0lub2RlOworCQkJCXUzMiBkb3NhdHRyczsKKwogCQkJCW1lbXNldCgmcEluZm8sIDAsIHNpemVvZihwSW5mbykpOwotCQkJCXBJbmZvLkF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX1JFQURPTkxZKTsKLQkJCQlDSUZTU01CU2V0UGF0aEluZm8oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAotCQkJCQkJJnBJbmZvLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQkJY2lmc0lub2RlID0gQ0lGU19JKG5ld2lub2RlKTsKKwkJCQlkb3NhdHRycyA9IGNpZnNJbm9kZS0+Y2lmc0F0dHJzfEFUVFJfUkVBRE9OTFk7CisJCQkJcEluZm8uQXR0cmlidXRlcyA9IGNwdV90b19sZTMyKGRvc2F0dHJzKTsKKwkJCQl0bXByYyA9IENJRlNTTUJTZXRQYXRoSW5mbyh4aWQsIHBUY29uLAorCQkJCQkJZnVsbF9wYXRoLCAmcEluZm8sCisJCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMsCiAJCQkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCQkJaWYgKHRtcHJjID09IDApCisJCQkJCWNpZnNJbm9kZS0+Y2lmc0F0dHJzID0gZG9zYXR0cnM7CiAJCQl9CiAJCQlpZiAoZGlyZW50cnktPmRfaW5vZGUpIHsKIAkJCQlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgpAQCAtMTA5NiwxMTcgKzEyMDEsMTQxIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50CitjaWZzX2RvX3JlbmFtZShpbnQgeGlkLCBzdHJ1Y3QgZGVudHJ5ICpmcm9tX2RlbnRyeSwgY29uc3QgY2hhciAqZnJvbVBhdGgsCisJCXN0cnVjdCBkZW50cnkgKnRvX2RlbnRyeSwgY29uc3QgY2hhciAqdG9QYXRoKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGZyb21fZGVudHJ5LT5kX3NiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiA9IGNpZnNfc2ItPnRjb247CisJX191MTYgc3JjZmlkOworCWludCBvcGxvY2ssIHJjOworCisJLyogdHJ5IHBhdGgtYmFzZWQgcmVuYW1lIGZpcnN0ICovCisJcmMgPSBDSUZTU01CUmVuYW1lKHhpZCwgcFRjb24sIGZyb21QYXRoLCB0b1BhdGgsIGNpZnNfc2ItPmxvY2FsX25scywKKwkJCSAgIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKKwkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisKKwkvKgorCSAqIGRvbid0IGJvdGhlciB3aXRoIHJlbmFtZSBieSBmaWxlaGFuZGxlIHVubGVzcyBmaWxlIGlzIGJ1c3kgYW5kCisJICogc291cmNlIE5vdGUgdGhhdCBjcm9zcyBkaXJlY3RvcnkgbW92ZXMgZG8gbm90IHdvcmsgd2l0aAorCSAqIHJlbmFtZSBieSBmaWxlaGFuZGxlIHRvIHZhcmlvdXMgV2luZG93cyBzZXJ2ZXJzLgorCSAqLworCWlmIChyYyA9PSAwIHx8IHJjICE9IC1FVFhUQlNZKQorCQlyZXR1cm4gcmM7CisKKwkvKiBvcGVuIHRoZSBmaWxlIHRvIGJlIHJlbmFtZWQgLS0gd2UgbmVlZCBERUxFVEUgcGVybXMgKi8KKwlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZyb21QYXRoLCBGSUxFX09QRU4sIERFTEVURSwKKwkJCSBDUkVBVEVfTk9UX0RJUiwgJnNyY2ZpZCwgJm9wbG9jaywgTlVMTCwKKwkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKKwkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisKKwlpZiAocmMgPT0gMCkgeworCQlyYyA9IENJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHBUY29uLCBzcmNmaWQsCisJCQkJKGNvbnN0IGNoYXIgKikgdG9fZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKKwkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCisJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBzcmNmaWQpOworCX0KKworCXJldHVybiByYzsKK30KKwogaW50IGNpZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqc291cmNlX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpzb3VyY2VfZGlyZW50cnksCiAJc3RydWN0IGlub2RlICp0YXJnZXRfaW5vZGUsIHN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXJlbnRyeSkKIHsKLQljaGFyICpmcm9tTmFtZTsKLQljaGFyICp0b05hbWU7CisJY2hhciAqZnJvbU5hbWUgPSBOVUxMOworCWNoYXIgKnRvTmFtZSA9IE5VTEw7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl9zb3VyY2U7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl90YXJnZXQ7CiAJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3NvdXJjZSA9IE5VTEw7CisJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3RhcmdldDsKIAlpbnQgeGlkOwotCWludCByYyA9IDA7Ci0KLQl4aWQgPSBHZXRYaWQoKTsKKwlpbnQgcmM7CiAKIAljaWZzX3NiX3RhcmdldCA9IENJRlNfU0IodGFyZ2V0X2lub2RlLT5pX3NiKTsKIAljaWZzX3NiX3NvdXJjZSA9IENJRlNfU0Ioc291cmNlX2lub2RlLT5pX3NiKTsKIAlwVGNvbiA9IGNpZnNfc2Jfc291cmNlLT50Y29uOwogCisJeGlkID0gR2V0WGlkKCk7CisKKwkvKgorCSAqIEJCOiB0aGlzIG1pZ2h0IGJlIGFsbG93ZWQgaWYgc2FtZSBzZXJ2ZXIsIGJ1dCBkaWZmZXJlbnQgc2hhcmUuCisJICogQ29uc2lkZXIgYWRkaW5nIHN1cHBvcnQgZm9yIHRoaXMKKwkgKi8KIAlpZiAocFRjb24gIT0gY2lmc19zYl90YXJnZXQtPnRjb24pIHsKLQkJRnJlZVhpZCh4aWQpOwotCQlyZXR1cm4gLUVYREVWOwkvKiBCQiBhY3R1YWxseSBjb3VsZCBiZSBhbGxvd2VkIGlmIHNhbWUgc2VydmVyLAotCQkJCSAgIGJ1dCBkaWZmZXJlbnQgc2hhcmUuCi0JCQkJICAgTWlnaHQgZXZlbnR1YWxseSBhZGQgc3VwcG9ydCBmb3IgdGhpcyAqLworCQlyYyA9IC1FWERFVjsKKwkJZ290byBjaWZzX3JlbmFtZV9leGl0OwogCX0KIAotCS8qIHdlIGFscmVhZHkgIGhhdmUgdGhlIHJlbmFtZSBzZW0gc28gd2UgZG8gbm90IG5lZWQgdG8gZ3JhYiBpdCBhZ2FpbgotCSAgIGhlcmUgdG8gcHJvdGVjdCB0aGUgcGF0aCBpbnRlZ3JpdHkgKi8KKwkvKgorCSAqIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVuYW1lIHNlbSBzbyB3ZSBkbyBub3QgbmVlZCB0bworCSAqIGdyYWIgaXQgYWdhaW4gaGVyZSB0byBwcm90ZWN0IHRoZSBwYXRoIGludGVncml0eQorCSAqLwogCWZyb21OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShzb3VyY2VfZGlyZW50cnkpOwotCXRvTmFtZSA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkodGFyZ2V0X2RpcmVudHJ5KTsKLQlpZiAoKGZyb21OYW1lID09IE5VTEwpIHx8ICh0b05hbWUgPT0gTlVMTCkpIHsKKwlpZiAoZnJvbU5hbWUgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gY2lmc19yZW5hbWVfZXhpdDsKIAl9CiAKLQlyYyA9IENJRlNTTUJSZW5hbWUoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSwKLQkJCSAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMsCi0JCQkgICBjaWZzX3NiX3NvdXJjZS0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQlpZiAocmMgPT0gLUVFWElTVCkgewotCQkvKiBjaGVjayBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlIGJlY2F1c2UgcmVuYW1lIG9mIGhhcmRsaW5rZWQKLQkJICAgZmlsZXMgaXMgYSBub29wICovCi0JCUZJTEVfVU5JWF9CQVNJQ19JTkZPICppbmZvX2J1Zl9zb3VyY2U7Ci0JCUZJTEVfVU5JWF9CQVNJQ19JTkZPICppbmZvX2J1Zl90YXJnZXQ7CisJdG9OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeSh0YXJnZXRfZGlyZW50cnkpOworCWlmICh0b05hbWUgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2lmc19yZW5hbWVfZXhpdDsKKwl9CiAKLQkJaW5mb19idWZfc291cmNlID0KLQkJCWttYWxsb2MoMiAqIHNpemVvZihGSUxFX1VOSVhfQkFTSUNfSU5GTyksIEdGUF9LRVJORUwpOwotCQlpZiAoaW5mb19idWZfc291cmNlICE9IE5VTEwpIHsKKwlyYyA9IGNpZnNfZG9fcmVuYW1lKHhpZCwgc291cmNlX2RpcmVudHJ5LCBmcm9tTmFtZSwKKwkJCSAgICB0YXJnZXRfZGlyZW50cnksIHRvTmFtZSk7CisKKwlpZiAocmMgPT0gLUVFWElTVCkgeworCQlpZiAocFRjb24tPnVuaXhfZXh0KSB7CisJCQkvKgorCQkJICogQXJlIHNyYyBhbmQgZHN0IGhhcmRsaW5rcyBvZiBzYW1lIGlub2RlPyBXZSBjYW4KKwkJCSAqIG9ubHkgdGVsbCB3aXRoIHVuaXggZXh0ZW5zaW9ucyBlbmFibGVkCisJCQkgKi8KKwkJCWluZm9fYnVmX3NvdXJjZSA9CisJCQkJa21hbGxvYygyICogc2l6ZW9mKEZJTEVfVU5JWF9CQVNJQ19JTkZPKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKGluZm9fYnVmX3NvdXJjZSA9PSBOVUxMKQorCQkJCWdvdG8gdW5saW5rX3RhcmdldDsKKwogCQkJaW5mb19idWZfdGFyZ2V0ID0gaW5mb19idWZfc291cmNlICsgMTsKLQkJCWlmIChwVGNvbi0+dW5peF9leHQpCi0JCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCBmcm9tTmFtZSwKLQkJCQkJaW5mb19idWZfc291cmNlLAotCQkJCQljaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzLAotCQkJCQljaWZzX3NiX3NvdXJjZS0+bW50X2NpZnNfZmxhZ3MgJgorCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCBmcm9tTmFtZSwKKwkJCQkJCWluZm9fYnVmX3NvdXJjZSwKKwkJCQkJCWNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMsCisJCQkJCQljaWZzX3NiX3NvdXJjZS0+bW50X2NpZnNfZmxhZ3MgJgogCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCQkJLyogZWxzZSByYyBpcyBzdGlsbCBFRVhJU1Qgc28gd2lsbCBmYWxsIHRocm91Z2ggdG8KLQkJCSAgIHVubGluayB0aGUgdGFyZ2V0IGFuZCByZXRyeSByZW5hbWUgKi8KLQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCB0b05hbWUsCi0JCQkJCQlpbmZvX2J1Zl90YXJnZXQsCisJCQlpZiAocmMgIT0gMCkKKwkJCQlnb3RvIHVubGlua190YXJnZXQ7CisKKwkJCXJjID0gQ0lGU1NNQlVuaXhRUGF0aEluZm8oeGlkLCBwVGNvbiwKKwkJCQkJCXRvTmFtZSwgaW5mb19idWZfdGFyZ2V0LAogCQkJCQkJY2lmc19zYl90YXJnZXQtPmxvY2FsX25scywKIAkJCQkJCS8qIHJlbWFwIGJhc2VkIG9uIHNvdXJjZSBzYiAqLwogCQkJCQkJY2lmc19zYl9zb3VyY2UtPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJCSAgICBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQl9Ci0JCQlpZiAoKHJjID09IDApICYmCi0JCQkgICAgKGluZm9fYnVmX3NvdXJjZS0+VW5pcXVlSWQgPT0KLQkJCSAgICAgaW5mb19idWZfdGFyZ2V0LT5VbmlxdWVJZCkpIHsKLQkJCS8qIGRvIG5vdCByZW5hbWUgc2luY2UgdGhlIGZpbGVzIGFyZSBoYXJkbGlua2VkIHdoaWNoCi0JCQkgICBpcyBhIG5vb3AgKi8KLQkJCX0gZWxzZSB7Ci0JCQkvKiB3ZSBlaXRoZXIgY2FuIG5vdCB0ZWxsIHRoZSBmaWxlcyBhcmUgaGFyZGxpbmtlZAotCQkJICAgKGFzIHdpdGggV2luZG93cyBzZXJ2ZXJzKSBvciBmaWxlcyBhcmUgbm90Ci0JCQkgICBoYXJkbGlua2VkIHNvIGRlbGV0ZSB0aGUgdGFyZ2V0IG1hbnVhbGx5IGJlZm9yZQotCQkJICAgcmVuYW1pbmcgdG8gZm9sbG93IFBPU0lYIHJhdGhlciB0aGFuIFdpbmRvd3MKLQkJCSAgIHNlbWFudGljcyAqLwotCQkJCWNpZnNfdW5saW5rKHRhcmdldF9pbm9kZSwgdGFyZ2V0X2RpcmVudHJ5KTsKLQkJCQlyYyA9IENJRlNTTUJSZW5hbWUoeGlkLCBwVGNvbiwgZnJvbU5hbWUsCi0JCQkJCQkgICB0b05hbWUsCi0JCQkJCQkgICBjaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzLAotCQkJCQkJICAgY2lmc19zYl9zb3VyY2UtPm1udF9jaWZzX2ZsYWdzCi0JCQkJCQkgICAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQkJCX0KLQkJCWtmcmVlKGluZm9fYnVmX3NvdXJjZSk7Ci0JCX0gLyogaWYgd2UgY2FuIG5vdCBnZXQgbWVtb3J5IGp1c3QgbGVhdmUgcmMgYXMgRUVYSVNUICovCi0JfQotCi0JaWYgKHJjKQotCQljRllJKDEsICgicmVuYW1lIHJjICVkIiwgcmMpKTsKLQotCWlmICgocmMgPT0gLUVJTykgfHwgKHJjID09IC1FRVhJU1QpKSB7Ci0JCWludCBvcGxvY2sgPSAwOwotCQlfX3UxNiBuZXRmaWQ7Ci0KLQkJLyogQkIgRklYTUUgSXMgR2VuZXJpYyBSZWFkIGNvcnJlY3QgZm9yIHJlbmFtZT8gKi8KLQkJLyogaWYgcmVuYW1pbmcgZGlyZWN0b3J5IC0gd2Ugc2hvdWxkIG5vdCBzYXkgQ1JFQVRFX05PVF9ESVIsCi0JCSAgIG5lZWQgdG8gdGVzdCByZW5hbWluZyBvcGVuIGRpcmVjdG9yeSwgYWxzbyBHRU5FUklDX1JFQUQKLQkJICAgbWlnaHQgbm90IHJpZ2h0IGJlIHJpZ2h0IGFjY2VzcyB0byByZXF1ZXN0ICovCi0JCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnJvbU5hbWUsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAotCQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKLQkJCQkgY2lmc19zYl9zb3VyY2UtPmxvY2FsX25scywKLQkJCQkgY2lmc19zYl9zb3VyY2UtPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCBwVGNvbiwgbmV0ZmlkLCB0b05hbWUsCi0JCQkJCSAgICAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMsCi0JCQkJCSAgICAgIGNpZnNfc2Jfc291cmNlLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKLQkJfQorCisJCQlpZiAocmMgPT0gMCAmJiAoaW5mb19idWZfc291cmNlLT5VbmlxdWVJZCA9PQorCQkJCQlpbmZvX2J1Zl90YXJnZXQtPlVuaXF1ZUlkKSkKKwkJCQkvKiBzYW1lIGZpbGUsIFBPU0lYIHNheXMgdGhhdCB0aGlzIGlzIGEgbm9vcCAqLworCQkJCWdvdG8gY2lmc19yZW5hbWVfZXhpdDsKKwkJfSAvKiBlbHNlIC4uLiBCQiB3ZSBjb3VsZCBhZGQgdGhlIHNhbWUgY2hlY2sgZm9yIFdpbmRvd3MgYnkKKwkJICAgICBjaGVja2luZyB0aGUgVW5pcXVlSWQgdmlhIEZJTEVfSU5URVJOQUxfSU5GTyAqLwordW5saW5rX3RhcmdldDoKKwkJLyoKKwkJICogd2UgZWl0aGVyIGNhbiBub3QgdGVsbCB0aGUgZmlsZXMgYXJlIGhhcmRsaW5rZWQgKGFzIHdpdGgKKwkJICogV2luZG93cyBzZXJ2ZXJzKSBvciBmaWxlcyBhcmUgbm90IGhhcmRsaW5rZWQuIERlbGV0ZSB0aGUKKwkJICogdGFyZ2V0IG1hbnVhbGx5IGJlZm9yZSByZW5hbWluZyB0byBmb2xsb3cgUE9TSVggcmF0aGVyIHRoYW4KKwkJICogV2luZG93cyBzZW1hbnRpY3MKKwkJICovCisJCWNpZnNfdW5saW5rKHRhcmdldF9pbm9kZSwgdGFyZ2V0X2RpcmVudHJ5KTsKKwkJcmMgPSBjaWZzX2RvX3JlbmFtZSh4aWQsIHNvdXJjZV9kaXJlbnRyeSwgZnJvbU5hbWUsCisJCQkJICAgIHRhcmdldF9kaXJlbnRyeSwgdG9OYW1lKTsKIAl9CiAKIGNpZnNfcmVuYW1lX2V4aXQ6CisJa2ZyZWUoaW5mb19idWZfc291cmNlKTsKIAlrZnJlZShmcm9tTmFtZSk7CiAJa2ZyZWUodG9OYW1lKTsKIAlGcmVlWGlkKHhpZCk7CkBAIC0xNTA3LDEwMSArMTYzNiw2IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNpZnNfc2V0X2ZpbGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmF0dHJzLCBpbnQgeGlkLAotCQkgICAgY2hhciAqZnVsbF9wYXRoLCBfX3UzMiBkb3NhdHRyKQotewotCWludCByYzsKLQlpbnQgb3Bsb2NrID0gMDsKLQlfX3UxNiBuZXRmaWQ7Ci0JX191MzIgbmV0cGlkOwotCWJvb2wgc2V0X3RpbWUgPSBmYWxzZTsKLQlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7Ci0Jc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7Ci0Jc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uID0gY2lmc19zYi0+dGNvbjsKLQlGSUxFX0JBU0lDX0lORk8JaW5mb19idWY7Ci0KLQlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgewotCQlzZXRfdGltZSA9IHRydWU7Ci0JCWluZm9fYnVmLkxhc3RBY2Nlc3NUaW1lID0KLQkJCWNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGF0dHJzLT5pYV9hdGltZSkpOwotCX0gZWxzZQotCQlpbmZvX2J1Zi5MYXN0QWNjZXNzVGltZSA9IDA7Ci0KLQlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgewotCQlzZXRfdGltZSA9IHRydWU7Ci0JCWluZm9fYnVmLkxhc3RXcml0ZVRpbWUgPQotCQkgICAgY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoYXR0cnMtPmlhX210aW1lKSk7Ci0JfSBlbHNlCi0JCWluZm9fYnVmLkxhc3RXcml0ZVRpbWUgPSAwOwotCi0JLyoKLQkgKiBTYW1iYSB0aHJvd3MgdGhpcyBmaWVsZCBhd2F5LCBidXQgd2luZG93cyBtYXkgYWN0dWFsbHkgdXNlIGl0LgotCSAqIERvIG5vdCBzZXQgY3RpbWUgdW5sZXNzIG90aGVyIHRpbWUgc3RhbXBzIGFyZSBjaGFuZ2VkIGV4cGxpY2l0bHkKLQkgKiAoaS5lLiBieSB1dGltZXMoKSkgc2luY2Ugd2Ugd291bGQgdGhlbiBoYXZlIGEgbWl4IG9mIGNsaWVudCBhbmQKLQkgKiBzZXJ2ZXIgdGltZXMuCi0JICovCi0JaWYgKHNldF90aW1lICYmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX0NUSU1FKSkgewotCQljRllJKDEsICgiQ0lGUyAtIENUSU1FIGNoYW5nZWQiKSk7Ci0JCWluZm9fYnVmLkNoYW5nZVRpbWUgPQotCQkgICAgY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoYXR0cnMtPmlhX2N0aW1lKSk7Ci0JfSBlbHNlCi0JCWluZm9fYnVmLkNoYW5nZVRpbWUgPSAwOwotCi0JaW5mb19idWYuQ3JlYXRpb25UaW1lID0gMDsJLyogZG9uJ3QgY2hhbmdlICovCi0JaW5mb19idWYuQXR0cmlidXRlcyA9IGNwdV90b19sZTMyKGRvc2F0dHIpOwotCi0JLyoKLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IG9wZW4gZm9yIHdyaXRlLCBqdXN0IHVzZSB0aGF0IGZpbGVpZAotCSAqLwotCW9wZW5fZmlsZSA9IGZpbmRfd3JpdGFibGVfZmlsZShjaWZzSW5vZGUpOwotCWlmIChvcGVuX2ZpbGUpIHsKLQkJbmV0ZmlkID0gb3Blbl9maWxlLT5uZXRmaWQ7Ci0JCW5ldHBpZCA9IG9wZW5fZmlsZS0+cGlkOwotCQlnb3RvIHNldF92aWFfZmlsZWhhbmRsZTsKLQl9Ci0KLQkvKgotCSAqIE5UNCBhcHBhcmVudGx5IHJldHVybnMgc3VjY2VzcyBvbiB0aGlzIGNhbGwsIGJ1dCBpdCBkb2Vzbid0Ci0JICogcmVhbGx5IHdvcmsuCi0JICovCi0JaWYgKCEocFRjb24tPnNlcy0+ZmxhZ3MgJiBDSUZTX1NFU19OVDQpKSB7Ci0JCXJjID0gQ0lGU1NNQlNldFBhdGhJbmZvKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKLQkJCQkgICAgICZpbmZvX2J1ZiwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCSAgICAgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCWlmIChyYyAhPSAtRU9QTk9UU1VQUCAmJiByYyAhPSAtRUlOVkFMKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JY0ZZSSgxLCAoImNhbGxpbmcgU2V0RmlsZUluZm8gc2luY2UgU2V0UGF0aEluZm8gZm9yICIKLQkJICJ0aW1lcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2VydmVyIikpOwotCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sCi0JCQkgU1lOQ0hST05JWkUgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMsCi0JCQkgQ1JFQVRFX05PVF9ESVIsICZuZXRmaWQsICZvcGxvY2ssCi0JCQkgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0KLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgPT0gLUVJTykKLQkJCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbmV0cGlkID0gY3VycmVudC0+dGdpZDsKLQotc2V0X3ZpYV9maWxlaGFuZGxlOgotCXJjID0gQ0lGU1NNQlNldEZpbGVJbmZvKHhpZCwgcFRjb24sICZpbmZvX2J1ZiwgbmV0ZmlkLCBuZXRwaWQpOwotCWlmIChvcGVuX2ZpbGUgPT0gTlVMTCkKLQkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIG5ldGZpZCk7Ci0JZWxzZQotCQlhdG9taWNfZGVjKCZvcGVuX2ZpbGUtPndydFBlbmRpbmcpOwotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludAogY2lmc19zZXRhdHRyX3VuaXgoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cnMpCiB7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9taXNjLmMgYi9mcy9jaWZzL21pc2MuYwppbmRleCA0YjE3ZjhmLi44ODc4NmJhIDEwMDY0NAotLS0gYS9mcy9jaWZzL21pc2MuYworKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtMTUwLDggKzE1MCw3IEBACiAgICBidXQgaXQgbWF5IGJlIG1vcmUgZWZmaWNpZW50IHRvIGFsd2F5cyBhbGxvYyBzYW1lIHNpemUKICAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUKICAgIGRlZmF1bHRzIHRvIHRoaXMgYW5kIGNhbiBub3QgYmUgYmlnZ2VyICovCi0JcmV0X2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKSBtZW1wb29sX2FsbG9jKGNpZnNfcmVxX3Bvb2xwLAotCQkJCQkJICAgR0ZQX0tFUk5FTCB8IEdGUF9OT0ZTKTsKKwlyZXRfYnVmID0gbWVtcG9vbF9hbGxvYyhjaWZzX3JlcV9wb29scCwgR0ZQX05PRlMpOwogCiAJLyogY2xlYXIgdGhlIGZpcnN0IGZldyBoZWFkZXIgYnl0ZXMgKi8KIAkvKiBmb3IgbW9zdCBwYXRocywgbW9yZSBpcyBjbGVhcmVkIGluIGhlYWRlcl9hc3NlbWJsZSAqLwpAQCAtMTg4LDggKzE4Nyw3IEBACiAgICBidXQgaXQgbWF5IGJlIG1vcmUgZWZmaWNpZW50IHRvIGFsd2F5cyBhbGxvYyBzYW1lIHNpemUKICAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUKICAgIGRlZmF1bHRzIHRvIHRoaXMgYW5kIGNhbiBub3QgYmUgYmlnZ2VyICovCi0JcmV0X2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKSBtZW1wb29sX2FsbG9jKGNpZnNfc21fcmVxX3Bvb2xwLAotCQkJCQkJICAgR0ZQX0tFUk5FTCB8IEdGUF9OT0ZTKTsKKwlyZXRfYnVmID0gbWVtcG9vbF9hbGxvYyhjaWZzX3NtX3JlcV9wb29scCwgR0ZQX05PRlMpOwogCWlmIChyZXRfYnVmKSB7CiAJLyogTm8gbmVlZCB0byBjbGVhciBtZW1vcnkgaGVyZSwgY2xlYXJlZCBpbiBoZWFkZXIgYXNzZW1ibGUgKi8KIAkvKgltZW1zZXQocmV0X2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDI3KTsqLwpAQCAtMzEzLDggKzMxMSw2IEBACiAJYnVmZmVyLT5GbGFnczIgPSBTTUJGTEcyX0tOT1dTX0xPTkdfTkFNRVM7CiAJYnVmZmVyLT5QaWQgPSBjcHVfdG9fbGUxNigoX191MTYpY3VycmVudC0+dGdpZCk7CiAJYnVmZmVyLT5QaWRIaWdoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShjdXJyZW50LT50Z2lkID4+IDE2KSk7Ci0Jc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0Jc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAlpZiAodHJlZUNvbikgewogCQlidWZmZXItPlRpZCA9IHRyZWVDb24tPnRpZDsKIAkJaWYgKHRyZWVDb24tPnNlcykgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9yZWFkZGlyLmMgYi9mcy9jaWZzL3JlYWRkaXIuYwppbmRleCA1ZjQwZWQzLi43NjVhZGYxIDEwMDY0NAotLS0gYS9mcy9jaWZzL3JlYWRkaXIuYworKysgYi9mcy9jaWZzL3JlYWRkaXIuYwpAQCAtNjQwLDYgKzY0MCw3MCBAQAogCiB9CiAKK3N0YXRpYyBpbnQgY2lmc19zYXZlX3Jlc3VtZV9rZXkoY29uc3QgY2hhciAqY3VycmVudF9lbnRyeSwKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjaWZzRmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCV9fdTE2IGxldmVsOworCWNoYXIgKmZpbGVuYW1lOworCisJaWYgKChjaWZzRmlsZSA9PSBOVUxMKSB8fCAoY3VycmVudF9lbnRyeSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZXZlbCA9IGNpZnNGaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsOworCisJaWYgKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfVU5JWCkgeworCQlGSUxFX1VOSVhfSU5GTyAqcEZpbmREYXRhID0gKEZJTEVfVU5JWF9JTkZPICopY3VycmVudF9lbnRyeTsKKworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlpZiAoY2lmc0ZpbGUtPnNyY2hfaW5mLnVuaWNvZGUpIHsKKwkJCWxlbiA9IGNpZnNfdW5pY29kZV9ieXRlbGVuKGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgc3RybmxlbiBvZiBQQVRIX01BWD8gKi8KKwkJCWxlbiA9IHN0cm5sZW4oZmlsZW5hbWUsIFBBVEhfTUFYKTsKKwkJfQorCQljaWZzRmlsZS0+c3JjaF9pbmYucmVzdW1lX2tleSA9IHBGaW5kRGF0YS0+UmVzdW1lS2V5OworCX0gZWxzZSBpZiAobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0RJUkVDVE9SWV9JTkZPICpwRmluZERhdGEgPQorCQkJKEZJTEVfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKKwl9IGVsc2UgaWYgKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0ZVTExfRElSRUNUT1JZX0lORk8gKnBGaW5kRGF0YSA9CisJCQkoRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmIChsZXZlbCA9PSBTTUJfRklORF9GSUxFX0lEX0ZVTExfRElSX0lORk8pIHsKKwkJU0VBUkNIX0lEX0ZVTExfRElSX0lORk8gKnBGaW5kRGF0YSA9CisJCQkoU0VBUkNIX0lEX0ZVTExfRElSX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKKwl9IGVsc2UgaWYgKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKnBGaW5kRGF0YSA9CisJCQkoRklMRV9CT1RIX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmIChsZXZlbCA9PSBTTUJfRklORF9GSUxFX0lORk9fU1RBTkRBUkQpIHsKKwkJRklORF9GSUxFX1NUQU5EQVJEX0lORk8gKnBGaW5kRGF0YSA9CisJCQkoRklORF9GSUxFX1NUQU5EQVJEX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQkvKiBvbmUgYnl0ZSBsZW5ndGgsIG5vIG5hbWUgY29udmVyc2lvbiAqLworCQlsZW4gPSAodW5zaWduZWQgaW50KXBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGg7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5SZXN1bWVLZXk7CisJfSBlbHNlIHsKKwkJY0ZZSSgxLCAoIlVua25vd24gZmluZGZpcnN0IGxldmVsICVkIiwgbGV2ZWwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfbmFtZV9sZW4gPSBsZW47CisJY2lmc0ZpbGUtPnNyY2hfaW5mLnByZXN1bWVfbmFtZSA9IGZpbGVuYW1lOworCXJldHVybiByYzsKK30KKwogLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgc2VhcmNoICovCiAvKiBOb3RlIHRoYXQgdGhlIFNNQiBzZXJ2ZXIgcmV0dXJucyBzZWFyY2ggZW50cmllcyBmb3IgLiBhbmQgLi4gd2hpY2gKICAgIGNvbXBsaWNhdGVzIGxvZ2ljIGhlcmUgaWYgd2UgY2hvb3NlIHRvIHBhcnNlIGZvciB0aGVtIGFuZCB3ZSBkbyBub3QKQEAgLTcwMyw2ICs3NjcsNyBAQAogCXdoaWxlICgoaW5kZXhfdG9fZmluZCA+PSBjaWZzRmlsZS0+c3JjaF9pbmYuaW5kZXhfb2ZfbGFzdF9lbnRyeSkgJiYKIAkgICAgICAocmMgPT0gMCkgJiYgIWNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCkgewogCQljRllJKDEsICgiY2FsbGluZyBmaW5kbmV4dDIiKSk7CisJCWNpZnNfc2F2ZV9yZXN1bWVfa2V5KGNpZnNGaWxlLT5zcmNoX2luZi5sYXN0X2VudHJ5LCBjaWZzRmlsZSk7CiAJCXJjID0gQ0lGU0ZpbmROZXh0KHhpZCwgcFRjb24sIGNpZnNGaWxlLT5uZXRmaWQsCiAJCQkJICAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsKIAkJaWYgKHJjKQpAQCAtOTE5LDY5ICs5ODQsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBjaWZzX3NhdmVfcmVzdW1lX2tleShjb25zdCBjaGFyICpjdXJyZW50X2VudHJ5LAotCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNpZnNGaWxlKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0JX191MTYgbGV2ZWw7Ci0JY2hhciAqZmlsZW5hbWU7Ci0KLQlpZiAoKGNpZnNGaWxlID09IE5VTEwpIHx8IChjdXJyZW50X2VudHJ5ID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxldmVsID0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZm9fbGV2ZWw7Ci0KLQlpZiAobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9VTklYKSB7Ci0JCUZJTEVfVU5JWF9JTkZPICpwRmluZERhdGEgPSAoRklMRV9VTklYX0lORk8gKiljdXJyZW50X2VudHJ5OwotCi0JCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07Ci0JCWlmIChjaWZzRmlsZS0+c3JjaF9pbmYudW5pY29kZSkgewotCQkJbGVuID0gY2lmc191bmljb2RlX2J5dGVsZW4oZmlsZW5hbWUpOwotCQl9IGVsc2UgewotCQkJLyogQkIgc2hvdWxkIHdlIG1ha2UgdGhpcyBzdHJubGVuIG9mIFBBVEhfTUFYPyAqLwotCQkJbGVuID0gc3RybmxlbihmaWxlbmFtZSwgUEFUSF9NQVgpOwotCQl9Ci0JCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5SZXN1bWVLZXk7Ci0JfSBlbHNlIGlmIChsZXZlbCA9PSBTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPKSB7Ci0JCUZJTEVfRElSRUNUT1JZX0lORk8gKnBGaW5kRGF0YSA9Ci0JCQkoRklMRV9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7Ci0JCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07Ci0JCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOwotCQljaWZzRmlsZS0+c3JjaF9pbmYucmVzdW1lX2tleSA9IHBGaW5kRGF0YS0+RmlsZUluZGV4OwotCX0gZWxzZSBpZiAobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPKSB7Ci0JCUZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAqcEZpbmREYXRhID0KLQkJCShGSUxFX0ZVTExfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OwotCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOwotCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKLQkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKLQl9IGVsc2UgaWYgKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTykgewotCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqcEZpbmREYXRhID0KLQkJCShTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqKWN1cnJlbnRfZW50cnk7Ci0JCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07Ci0JCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOwotCQljaWZzRmlsZS0+c3JjaF9pbmYucmVzdW1lX2tleSA9IHBGaW5kRGF0YS0+RmlsZUluZGV4OwotCX0gZWxzZSBpZiAobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9CT1RIX0RJUkVDVE9SWV9JTkZPKSB7Ci0JCUZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTyAqcEZpbmREYXRhID0KLQkJCShGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OwotCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOwotCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKLQkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKLQl9IGVsc2UgaWYgKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSU5GT19TVEFOREFSRCkgewotCQlGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqcEZpbmREYXRhID0KLQkJCShGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqKWN1cnJlbnRfZW50cnk7Ci0JCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07Ci0JCS8qIG9uZSBieXRlIGxlbmd0aCwgbm8gbmFtZSBjb252ZXJzaW9uICovCi0JCWxlbiA9ICh1bnNpZ25lZCBpbnQpcEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aDsKLQkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPlJlc3VtZUtleTsKLQl9IGVsc2UgewotCQljRllJKDEsICgiVW5rbm93biBmaW5kZmlyc3QgbGV2ZWwgJWQiLCBsZXZlbCkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9uYW1lX2xlbiA9IGxlbjsKLQljaWZzRmlsZS0+c3JjaF9pbmYucHJlc3VtZV9uYW1lID0gZmlsZW5hbWU7Ci0JcmV0dXJuIHJjOwotfQogCiBpbnQgY2lmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnRyeSwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3Nlc3MuYyBiL2ZzL2NpZnMvc2Vzcy5jCmluZGV4IDI1MmZkYzAuLjI4NTFkNWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc2Vzcy5jCisrKyBiL2ZzL2NpZnMvc2Vzcy5jCkBAIC02MjQsOCArNjI0LDEwIEBACiAJCQkJCSBzZXMsIG5sc19jcCk7CiAKIHNzZXR1cF9leGl0OgotCWlmIChzcG5lZ29fa2V5KQorCWlmIChzcG5lZ29fa2V5KSB7CisJCWtleV9yZXZva2Uoc3BuZWdvX2tleSk7CiAJCWtleV9wdXQoc3BuZWdvX2tleSk7CisJfQogCWtmcmVlKHN0cl9hcmVhKTsKIAlpZiAocmVzcF9idWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikgewogCQljRllJKDEsICgic3NldHVwIGZyZWVpbmcgc21hbGwgYnVmICVwIiwgaW92WzBdLmlvdl9iYXNlKSk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCBlMjg2ZGI5Li5iZjBlNmQ4IDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTUwLDggKzUwLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdGVtcCA9IChzdHJ1Y3QgbWlkX3FfZW50cnkgKikgbWVtcG9vbF9hbGxvYyhjaWZzX21pZF9wb29scCwKLQkJCQkJCSAgICBHRlBfS0VSTkVMIHwgR0ZQX05PRlMpOworCXRlbXAgPSBtZW1wb29sX2FsbG9jKGNpZnNfbWlkX3Bvb2xwLCBHRlBfTk9GUyk7CiAJaWYgKHRlbXAgPT0gTlVMTCkKIAkJcmV0dXJuIHRlbXA7CiAJZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9jb2RhL3BzZGV2LmMgYi9mcy9jb2RhL3BzZGV2LmMKaW5kZXggMGQ5YjgwZS4uY2ZkMjlkYSAxMDA2NDQKLS0tIGEvZnMvY29kYS9wc2Rldi5jCisrKyBiL2ZzL2NvZGEvcHNkZXYuYwpAQCAtMzYyLDkgKzM2Miw4IEBACiAJCWdvdG8gb3V0X2NocmRldjsKIAl9CQkKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREFERVZTOyBpKyspCi0JCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShjb2RhX3BzZGV2X2NsYXNzLCBOVUxMLAotCQkJCSAgICAgIE1LREVWKENPREFfUFNERVZfTUFKT1IsIGkpLAotCQkJCSAgICAgIE5VTEwsICJjZnMlZCIsIGkpOworCQlkZXZpY2VfY3JlYXRlKGNvZGFfcHNkZXZfY2xhc3MsIE5VTEwsCisJCQkgICAgICBNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSwgTlVMTCwgImNmcyVkIiwgaSk7CiAJY29kYV9zeXNjdGxfaW5pdCgpOwogCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDEzM2VkN2YuLjNiNThjMzIgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xMzcsNiArMTM3LDQ1IEBACiAJcmV0dXJuIGNvbXBhdF9zeXNfZnV0aW1lc2F0KEFUX0ZEQ1dELCBmaWxlbmFtZSwgdCk7CiB9CiAKK3N0YXRpYyBpbnQgY3BfY29tcGF0X3N0YXQoc3RydWN0IGtzdGF0ICpzdGF0LCBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICp1YnVmKQoreworCWNvbXBhdF9pbm9fdCBpbm8gPSBzdGF0LT5pbm87CisJdHlwZW9mKHVidWYtPnN0X3VpZCkgdWlkID0gMDsKKwl0eXBlb2YodWJ1Zi0+c3RfZ2lkKSBnaWQgPSAwOworCWludCBlcnI7CisKKwlTRVRfVUlEKHVpZCwgc3RhdC0+dWlkKTsKKwlTRVRfR0lEKGdpZCwgc3RhdC0+Z2lkKTsKKworCWlmICgodTY0KSBzdGF0LT5zaXplID4gTUFYX05PTl9MRlMgfHwKKwkgICAgIW9sZF92YWxpZF9kZXYoc3RhdC0+ZGV2KSB8fAorCSAgICAhb2xkX3ZhbGlkX2RldihzdGF0LT5yZGV2KSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJaWYgKHNpemVvZihpbm8pIDwgc2l6ZW9mKHN0YXQtPmlubykgJiYgaW5vICE9IHN0YXQtPmlubykKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlpZiAoY2xlYXJfdXNlcih1YnVmLCBzaXplb2YoKnVidWYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgID0gX19wdXRfdXNlcihvbGRfZW5jb2RlX2RldihzdGF0LT5kZXYpLCAmdWJ1Zi0+c3RfZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcihpbm8sICZ1YnVmLT5zdF9pbm8pOworCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPm1vZGUsICZ1YnVmLT5zdF9tb2RlKTsKKwllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5ubGluaywgJnVidWYtPnN0X25saW5rKTsKKwllcnIgfD0gX19wdXRfdXNlcih1aWQsICZ1YnVmLT5zdF91aWQpOworCWVyciB8PSBfX3B1dF91c2VyKGdpZCwgJnVidWYtPnN0X2dpZCk7CisJZXJyIHw9IF9fcHV0X3VzZXIob2xkX2VuY29kZV9kZXYoc3RhdC0+cmRldiksICZ1YnVmLT5zdF9yZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5zaXplLCAmdWJ1Zi0+c3Rfc2l6ZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+YXRpbWUudHZfc2VjLCAmdWJ1Zi0+c3RfYXRpbWUpOworCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmF0aW1lLnR2X25zZWMsICZ1YnVmLT5zdF9hdGltZV9uc2VjKTsKKwllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5tdGltZS50dl9zZWMsICZ1YnVmLT5zdF9tdGltZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+bXRpbWUudHZfbnNlYywgJnVidWYtPnN0X210aW1lX25zZWMpOworCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmN0aW1lLnR2X3NlYywgJnVidWYtPnN0X2N0aW1lKTsKKwllcnIgfD0gX19wdXRfdXNlcihzdGF0LT5jdGltZS50dl9uc2VjLCAmdWJ1Zi0+c3RfY3RpbWVfbnNlYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc3RhdC0+Ymxrc2l6ZSwgJnVidWYtPnN0X2Jsa3NpemUpOworCWVyciB8PSBfX3B1dF91c2VyKHN0YXQtPmJsb2NrcywgJnVidWYtPnN0X2Jsb2Nrcyk7CisJcmV0dXJuIGVycjsKK30KKwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLAogCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQogewpAQCAtMTIzOSw3ICsxMjc4LDcgQEAKIAkJCWlmICghcCkKIAkJCQlicmVhazsKIAkJCWFyZ3YrKzsKLQkJCWlmKCsraSA+IG1heCkKKwkJCWlmIChpKysgPj0gbWF4KQogCQkJCXJldHVybiAtRTJCSUc7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDgwZTkzOTUuLmU3YTFhOTkgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0xMzk1LDYgKzEzOTUsMTAgQEAKIAkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQogCQkJZ290byBuZXh0OwogCisJCS8qIG5vbi1leGlzdGluZyBkdWUgdG8gUkNVPyAqLworCQlpZiAoZF91bmhhc2hlZChkZW50cnkpKQorCQkJZ290byBuZXh0OworCiAJCS8qCiAJCSAqIEl0IGlzIHNhZmUgdG8gY29tcGFyZSBuYW1lcyBzaW5jZSBkX21vdmUoKSBjYW5ub3QKIAkJICogY2hhbmdlIHRoZSBxc3RyIChwcm90ZWN0ZWQgYnkgZF9sb2NrKS4KQEAgLTE0MTAsMTAgKzE0MTQsOCBAQAogCQkJCWdvdG8gbmV4dDsKIAkJfQogCi0JCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7Ci0JCQlhdG9taWNfaW5jKCZkZW50cnktPmRfY291bnQpOwotCQkJZm91bmQgPSBkZW50cnk7Ci0JCX0KKwkJYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKKwkJZm91bmQgPSBkZW50cnk7CiAJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCWJyZWFrOwogbmV4dDoKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCAwOGUyOGM5Li4zZGJlMjE2IDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0yNiw4ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLSNkZWZpbmUgREVCVUdGU19NQUdJQwkweDY0NjI2NzIwCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KIAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZGVidWdmc19tb3VudDsKIHN0YXRpYyBpbnQgZGVidWdmc19tb3VudF9jb3VudDsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggNDg4ZWI0Mi4uNGE3MTRmNmMgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIERFVlBUU19TVVBFUl9NQUdJQyAweDFjZDEKIAogI2RlZmluZSBERVZQVFNfREVGQVVMVF9NT0RFIDA2MDAKKyNkZWZpbmUgUFRNWF9NSU5PUgkyCiAKIGV4dGVybiBpbnQgcHR5X2xpbWl0OwkJCS8qIENvbmZpZyBsaW1pdCBvbiBVbml4OTggcHR5cyAqLwogc3RhdGljIERFRklORV9JREEoYWxsb2NhdGVkX3B0eXMpOwpAQCAtNDgsNyArNDksNyBAQAogCU9wdF9lcnIKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X3VpZCwgInVpZD0ldSJ9LAogCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCiAJe09wdF9tb2RlLCAibW9kZT0lbyJ9LApAQCAtMTY5LDE1ICsxNzAsNyBAQAogICogdG8gdGhlIFN5c3RlbSBWIG5hbWluZyBjb252ZW50aW9uCiAgKi8KIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9ub2RlKGludCBudW0pCi17Ci0JY2hhciBzWzEyXTsKLQlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gZGV2cHRzX3Jvb3Q7Ci0JbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JcmV0dXJuIGxvb2t1cF9vbmVfbGVuKHMsIHJvb3QsIHNwcmludGYocywgIiVkIiwgbnVtKSk7Ci19Ci0KLWludCBkZXZwdHNfbmV3X2luZGV4KHZvaWQpCitpbnQgZGV2cHRzX25ld19pbmRleChzdHJ1Y3QgaW5vZGUgKnB0bXhfaW5vZGUpCiB7CiAJaW50IGluZGV4OwogCWludCBpZGFfcmV0OwpAQCAtMjA1LDIwICsxOTgsMjEgQEAKIAlyZXR1cm4gaW5kZXg7CiB9CiAKLXZvaWQgZGV2cHRzX2tpbGxfaW5kZXgoaW50IGlkeCkKK3ZvaWQgZGV2cHRzX2tpbGxfaW5kZXgoc3RydWN0IGlub2RlICpwdG14X2lub2RlLCBpbnQgaWR4KQogewogCW11dGV4X2xvY2soJmFsbG9jYXRlZF9wdHlzX2xvY2spOwogCWlkYV9yZW1vdmUoJmFsbG9jYXRlZF9wdHlzLCBpZHgpOwogCW11dGV4X3VubG9jaygmYWxsb2NhdGVkX3B0eXNfbG9jayk7CiB9CiAKLWludCBkZXZwdHNfcHR5X25ldyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoraW50IGRldnB0c19wdHlfbmV3KHN0cnVjdCBpbm9kZSAqcHRteF9pbm9kZSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlpbnQgbnVtYmVyID0gdHR5LT5pbmRleDsgLyogdHR5IGxheWVyIHB1dHMgaW5kZXggZnJvbSBkZXZwdHNfbmV3X2luZGV4KCkgaW4gaGVyZSAqLwogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIgPSB0dHktPmRyaXZlcjsKIAlkZXZfdCBkZXZpY2UgPSBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0K251bWJlcik7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoZGV2cHRzX21udC0+bW50X3NiKTsKKwljaGFyIHNbMTJdOwogCiAJLyogV2UncmUgc3VwcG9zZWQgdG8gYmUgZ2l2ZW4gdGhlIHNsYXZlIGVuZCBvZiBhIHB0eSAqLwogCUJVR19PTihkcml2ZXItPnR5cGUgIT0gVFRZX0RSSVZFUl9UWVBFX1BUWSk7CkBAIC0yMzMsMTAgKzIyNywxNSBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIFNfSUZDSFJ8Y29uZmlnLm1vZGUsIGRldmljZSk7CiAJaW5vZGUtPmlfcHJpdmF0ZSA9IHR0eTsKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5vZGU7CiAKLQlkZW50cnkgPSBnZXRfbm9kZShudW1iZXIpOwotCWlmICghSVNfRVJSKGRlbnRyeSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkgewotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXNwcmludGYocywgIiVkIiwgbnVtYmVyKTsKKworCW11dGV4X2xvY2soJmRldnB0c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKKworCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkZXZwdHNfcm9vdCwgcyk7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAkJZnNub3RpZnlfY3JlYXRlKGRldnB0c19yb290LT5kX2lub2RlLCBkZW50cnkpOwogCX0KIApAQCAtMjQ1LDM2ICsyNDQsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHR0eV9zdHJ1Y3QgKmRldnB0c19nZXRfdHR5KGludCBudW1iZXIpCitzdHJ1Y3QgdHR5X3N0cnVjdCAqZGV2cHRzX2dldF90dHkoc3RydWN0IGlub2RlICpwdHNfaW5vZGUsIGludCBudW1iZXIpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZ2V0X25vZGUobnVtYmVyKTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCUJVR19PTihwdHNfaW5vZGUtPmlfcmRldiA9PSBNS0RFVihUVFlBVVhfTUFKT1IsIFBUTVhfTUlOT1IpKTsKIAotCXR0eSA9IE5VTEw7Ci0JaWYgKCFJU19FUlIoZGVudHJ5KSkgewotCQlpZiAoZGVudHJ5LT5kX2lub2RlKQotCQkJdHR5ID0gZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7Ci0JCWRwdXQoZGVudHJ5KTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmRldnB0c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKLQotCXJldHVybiB0dHk7CisJaWYgKHB0c19pbm9kZS0+aV9zYi0+c19tYWdpYyA9PSBERVZQVFNfU1VQRVJfTUFHSUMpCisJCXJldHVybiAoc3RydWN0IHR0eV9zdHJ1Y3QgKilwdHNfaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBkZXZwdHNfcHR5X2tpbGwoaW50IG51bWJlcikKK3ZvaWQgZGV2cHRzX3B0eV9raWxsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZ2V0X25vZGUobnVtYmVyKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAKLQlpZiAoIUlTX0VSUihkZW50cnkpKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0JCWlmIChpbm9kZSkgewotCQkJaW5vZGUtPmlfbmxpbmstLTsKLQkJCWRfZGVsZXRlKGRlbnRyeSk7Ci0JCQlkcHV0KGRlbnRyeSk7Ci0JCX0KKwlCVUdfT04oaW5vZGUtPmlfcmRldiA9PSBNS0RFVihUVFlBVVhfTUFKT1IsIFBUTVhfTUlOT1IpKTsKKworCW11dGV4X2xvY2soJmRldnB0c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKKworCWRlbnRyeSA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJaWYgKGRlbnRyeSAmJiAhSVNfRVJSKGRlbnRyeSkpIHsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJZF9kZWxldGUoZGVudHJ5KTsKIAkJZHB1dChkZW50cnkpOwogCX0KKwogCW11dGV4X3VubG9jaygmZGV2cHRzX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCmRpZmYgLS1naXQgYS9mcy9kaXJlY3QtaW8uYyBiL2ZzL2RpcmVjdC1pby5jCmluZGV4IDk2MDZlZTguLmFmMDU1OGQgMTAwNjQ0Ci0tLSBhL2ZzL2RpcmVjdC1pby5jCisrKyBiL2ZzL2RpcmVjdC1pby5jCkBAIC01LDExICs1LDExIEBACiAgKgogICogT19ESVJFQ1QKICAqCi0gKiAwNEp1bDIwMDIJYWtwbUB6aXAuY29tLmF1CisgKiAwNEp1bDIwMDIJQW5kcmV3IE1vcnRvbgogICoJCUluaXRpYWwgdmVyc2lvbgogICogMTFTZXAyMDAyCWphbmV0aW5jQHVzLmlibS5jb20KICAqIAkJYWRkZWQgcmVhZHYvd3JpdGV2IHN1cHBvcnQuCi0gKiAyOU9jdDIwMDIJYWtwbUB6aXAuY29tLmF1CisgKiAyOU9jdDIwMDIJQW5kcmV3IE1vcnRvbgogICoJCXJld3JvdGUgYmlvX2FkZF9wYWdlKCkgc3VwcG9ydC4KICAqIDMwT2N0MjAwMglwYmFkYXJpQHVzLmlibS5jb20KICAqCQlhZGRlZCBzdXBwb3J0IGZvciBub24tYWxpZ25lZCBJTy4KZGlmZiAtLWdpdCBhL2ZzL2RsbS9jb25maWcuYyBiL2ZzL2RsbS9jb25maWcuYwppbmRleCA4OWQyZmI3Li5mZDk4NTlmIDEwMDY0NAotLS0gYS9mcy9kbG0vY29uZmlnLmMKKysrIGIvZnMvZGxtL2NvbmZpZy5jCkBAIC0xNCw2ICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgImNvbmZpZy5oIgpAQCAtMzc3LDI0ICszODAsMjQgQEAKIAkuY3Rfb3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZGxtX2NsdXN0ZXIgKnRvX2NsdXN0ZXIoc3RydWN0IGNvbmZpZ19pdGVtICppKQorc3RhdGljIHN0cnVjdCBkbG1fY2x1c3RlciAqY29uZmlnX2l0ZW1fdG9fY2x1c3RlcihzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCiB7CiAJcmV0dXJuIGkgPyBjb250YWluZXJfb2YodG9fY29uZmlnX2dyb3VwKGkpLCBzdHJ1Y3QgZGxtX2NsdXN0ZXIsIGdyb3VwKSA6CiAJCSAgIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGxtX3NwYWNlICp0b19zcGFjZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCitzdGF0aWMgc3RydWN0IGRsbV9zcGFjZSAqY29uZmlnX2l0ZW1fdG9fc3BhY2Uoc3RydWN0IGNvbmZpZ19pdGVtICppKQogewogCXJldHVybiBpID8gY29udGFpbmVyX29mKHRvX2NvbmZpZ19ncm91cChpKSwgc3RydWN0IGRsbV9zcGFjZSwgZ3JvdXApIDoKIAkJICAgTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkbG1fY29tbSAqdG9fY29tbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCitzdGF0aWMgc3RydWN0IGRsbV9jb21tICpjb25maWdfaXRlbV90b19jb21tKHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKIAlyZXR1cm4gaSA/IGNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgZGxtX2NvbW0sIGl0ZW0pIDogTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkbG1fbm9kZSAqdG9fbm9kZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCitzdGF0aWMgc3RydWN0IGRsbV9ub2RlICpjb25maWdfaXRlbV90b19ub2RlKHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKIAlyZXR1cm4gaSA/IGNvbnRhaW5lcl9vZihpLCBzdHJ1Y3QgZGxtX25vZGUsIGl0ZW0pIDogTlVMTDsKIH0KQEAgLTQ1MCw3ICs0NTMsNyBAQAogCiBzdGF0aWMgdm9pZCBkcm9wX2NsdXN0ZXIoc3RydWN0IGNvbmZpZ19ncm91cCAqZywgc3RydWN0IGNvbmZpZ19pdGVtICppKQogewotCXN0cnVjdCBkbG1fY2x1c3RlciAqY2wgPSB0b19jbHVzdGVyKGkpOworCXN0cnVjdCBkbG1fY2x1c3RlciAqY2wgPSBjb25maWdfaXRlbV90b19jbHVzdGVyKGkpOwogCXN0cnVjdCBjb25maWdfaXRlbSAqdG1wOwogCWludCBqOwogCkBAIC00NjgsNyArNDcxLDcgQEAKIAogc3RhdGljIHZvaWQgcmVsZWFzZV9jbHVzdGVyKHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKLQlzdHJ1Y3QgZGxtX2NsdXN0ZXIgKmNsID0gdG9fY2x1c3RlcihpKTsKKwlzdHJ1Y3QgZGxtX2NsdXN0ZXIgKmNsID0gY29uZmlnX2l0ZW1fdG9fY2x1c3RlcihpKTsKIAlrZnJlZShjbC0+Z3JvdXAuZGVmYXVsdF9ncm91cHMpOwogCWtmcmVlKGNsKTsKIH0KQEAgLTUwNyw3ICs1MTAsNyBAQAogCiBzdGF0aWMgdm9pZCBkcm9wX3NwYWNlKHN0cnVjdCBjb25maWdfZ3JvdXAgKmcsIHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKLQlzdHJ1Y3QgZGxtX3NwYWNlICpzcCA9IHRvX3NwYWNlKGkpOworCXN0cnVjdCBkbG1fc3BhY2UgKnNwID0gY29uZmlnX2l0ZW1fdG9fc3BhY2UoaSk7CiAJc3RydWN0IGNvbmZpZ19pdGVtICp0bXA7CiAJaW50IGo7CiAKQEAgLTUyNCw3ICs1MjcsNyBAQAogCiBzdGF0aWMgdm9pZCByZWxlYXNlX3NwYWNlKHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKLQlzdHJ1Y3QgZGxtX3NwYWNlICpzcCA9IHRvX3NwYWNlKGkpOworCXN0cnVjdCBkbG1fc3BhY2UgKnNwID0gY29uZmlnX2l0ZW1fdG9fc3BhY2UoaSk7CiAJa2ZyZWUoc3AtPmdyb3VwLmRlZmF1bHRfZ3JvdXBzKTsKIAlrZnJlZShzcCk7CiB9CkBAIC01NDYsNyArNTQ5LDcgQEAKIAogc3RhdGljIHZvaWQgZHJvcF9jb21tKHN0cnVjdCBjb25maWdfZ3JvdXAgKmcsIHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKLQlzdHJ1Y3QgZGxtX2NvbW0gKmNtID0gdG9fY29tbShpKTsKKwlzdHJ1Y3QgZGxtX2NvbW0gKmNtID0gY29uZmlnX2l0ZW1fdG9fY29tbShpKTsKIAlpZiAobG9jYWxfY29tbSA9PSBjbSkKIAkJbG9jYWxfY29tbSA9IE5VTEw7CiAJZGxtX2xvd2NvbW1zX2Nsb3NlKGNtLT5ub2RlaWQpOwpAQCAtNTU3LDEzICs1NjAsMTMgQEAKIAogc3RhdGljIHZvaWQgcmVsZWFzZV9jb21tKHN0cnVjdCBjb25maWdfaXRlbSAqaSkKIHsKLQlzdHJ1Y3QgZGxtX2NvbW0gKmNtID0gdG9fY29tbShpKTsKKwlzdHJ1Y3QgZGxtX2NvbW0gKmNtID0gY29uZmlnX2l0ZW1fdG9fY29tbShpKTsKIAlrZnJlZShjbSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2l0ZW0gKm1ha2Vfbm9kZShzdHJ1Y3QgY29uZmlnX2dyb3VwICpnLCBjb25zdCBjaGFyICpuYW1lKQogewotCXN0cnVjdCBkbG1fc3BhY2UgKnNwID0gdG9fc3BhY2UoZy0+Y2dfaXRlbS5jaV9wYXJlbnQpOworCXN0cnVjdCBkbG1fc3BhY2UgKnNwID0gY29uZmlnX2l0ZW1fdG9fc3BhY2UoZy0+Y2dfaXRlbS5jaV9wYXJlbnQpOwogCXN0cnVjdCBkbG1fbm9kZSAqbmQ7CiAKIAluZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fbm9kZSksIEdGUF9LRVJORUwpOwpAQCAtNTg1LDggKzU4OCw4IEBACiAKIHN0YXRpYyB2b2lkIGRyb3Bfbm9kZShzdHJ1Y3QgY29uZmlnX2dyb3VwICpnLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCiB7Ci0Jc3RydWN0IGRsbV9zcGFjZSAqc3AgPSB0b19zcGFjZShnLT5jZ19pdGVtLmNpX3BhcmVudCk7Ci0Jc3RydWN0IGRsbV9ub2RlICpuZCA9IHRvX25vZGUoaSk7CisJc3RydWN0IGRsbV9zcGFjZSAqc3AgPSBjb25maWdfaXRlbV90b19zcGFjZShnLT5jZ19pdGVtLmNpX3BhcmVudCk7CisJc3RydWN0IGRsbV9ub2RlICpuZCA9IGNvbmZpZ19pdGVtX3RvX25vZGUoaSk7CiAKIAltdXRleF9sb2NrKCZzcC0+bWVtYmVyc19sb2NrKTsKIAlsaXN0X2RlbCgmbmQtPmxpc3QpOwpAQCAtNTk4LDcgKzYwMSw3IEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2Vfbm9kZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmkpCiB7Ci0Jc3RydWN0IGRsbV9ub2RlICpuZCA9IHRvX25vZGUoaSk7CisJc3RydWN0IGRsbV9ub2RlICpuZCA9IGNvbmZpZ19pdGVtX3RvX25vZGUoaSk7CiAJa2ZyZWUobmQpOwogfQogCkBAIC02MzIsNyArNjM1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfY2x1c3RlcihzdHJ1Y3QgY29uZmlnX2l0ZW0gKmksIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmEsCiAJCQkgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBkbG1fY2x1c3RlciAqY2wgPSB0b19jbHVzdGVyKGkpOworCXN0cnVjdCBkbG1fY2x1c3RlciAqY2wgPSBjb25maWdfaXRlbV90b19jbHVzdGVyKGkpOwogCXN0cnVjdCBjbHVzdGVyX2F0dHJpYnV0ZSAqY2xhID0KIAkJCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgY2x1c3Rlcl9hdHRyaWJ1dGUsIGF0dHIpOwogCXJldHVybiBjbGEtPnNob3cgPyBjbGEtPnNob3coY2wsIGJ1ZikgOiAwOwpAQCAtNjQyLDcgKzY0NSw3IEBACiAJCQkgICAgIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmEsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgZGxtX2NsdXN0ZXIgKmNsID0gdG9fY2x1c3RlcihpKTsKKwlzdHJ1Y3QgZGxtX2NsdXN0ZXIgKmNsID0gY29uZmlnX2l0ZW1fdG9fY2x1c3RlcihpKTsKIAlzdHJ1Y3QgY2x1c3Rlcl9hdHRyaWJ1dGUgKmNsYSA9CiAJCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgY2x1c3Rlcl9hdHRyaWJ1dGUsIGF0dHIpOwogCXJldHVybiBjbGEtPnN0b3JlID8gY2xhLT5zdG9yZShjbCwgYnVmLCBsZW4pIDogLUVJTlZBTDsKQEAgLTY1MSw3ICs2NTQsNyBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19jb21tKHN0cnVjdCBjb25maWdfaXRlbSAqaSwgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqYSwKIAkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGRsbV9jb21tICpjbSA9IHRvX2NvbW0oaSk7CisJc3RydWN0IGRsbV9jb21tICpjbSA9IGNvbmZpZ19pdGVtX3RvX2NvbW0oaSk7CiAJc3RydWN0IGNvbW1fYXR0cmlidXRlICpjbWEgPQogCQkJY29udGFpbmVyX29mKGEsIHN0cnVjdCBjb21tX2F0dHJpYnV0ZSwgYXR0cik7CiAJcmV0dXJuIGNtYS0+c2hvdyA/IGNtYS0+c2hvdyhjbSwgYnVmKSA6IDA7CkBAIC02NjAsNyArNjYzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2NvbW0oc3RydWN0IGNvbmZpZ19pdGVtICppLCBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICphLAogCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGRsbV9jb21tICpjbSA9IHRvX2NvbW0oaSk7CisJc3RydWN0IGRsbV9jb21tICpjbSA9IGNvbmZpZ19pdGVtX3RvX2NvbW0oaSk7CiAJc3RydWN0IGNvbW1fYXR0cmlidXRlICpjbWEgPQogCQljb250YWluZXJfb2YoYSwgc3RydWN0IGNvbW1fYXR0cmlidXRlLCBhdHRyKTsKIAlyZXR1cm4gY21hLT5zdG9yZSA/IGNtYS0+c3RvcmUoY20sIGJ1ZiwgbGVuKSA6IC1FSU5WQUw7CkBAIC03MTQsNyArNzE3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfbm9kZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKmksIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmEsCiAJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBkbG1fbm9kZSAqbmQgPSB0b19ub2RlKGkpOworCXN0cnVjdCBkbG1fbm9kZSAqbmQgPSBjb25maWdfaXRlbV90b19ub2RlKGkpOwogCXN0cnVjdCBub2RlX2F0dHJpYnV0ZSAqbmRhID0KIAkJCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3Qgbm9kZV9hdHRyaWJ1dGUsIGF0dHIpOwogCXJldHVybiBuZGEtPnNob3cgPyBuZGEtPnNob3cobmQsIGJ1ZikgOiAwOwpAQCAtNzIzLDcgKzcyNiw3IEBACiBzdGF0aWMgc3NpemVfdCBzdG9yZV9ub2RlKHN0cnVjdCBjb25maWdfaXRlbSAqaSwgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqYSwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBkbG1fbm9kZSAqbmQgPSB0b19ub2RlKGkpOworCXN0cnVjdCBkbG1fbm9kZSAqbmQgPSBjb25maWdfaXRlbV90b19ub2RlKGkpOwogCXN0cnVjdCBub2RlX2F0dHJpYnV0ZSAqbmRhID0KIAkJY29udGFpbmVyX29mKGEsIHN0cnVjdCBub2RlX2F0dHJpYnV0ZSwgYXR0cik7CiAJcmV0dXJuIG5kYS0+c3RvcmUgPyBuZGEtPnN0b3JlKG5kLCBidWYsIGxlbikgOiAtRUlOVkFMOwpAQCAtNzY4LDcgKzc3MSw3IEBACiAJaSA9IGNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3BhY2VfbGlzdCwgbmFtZSk7CiAJbXV0ZXhfdW5sb2NrKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X211dGV4KTsKIAotCXJldHVybiB0b19zcGFjZShpKTsKKwlyZXR1cm4gY29uZmlnX2l0ZW1fdG9fc3BhY2UoaSk7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9zcGFjZShzdHJ1Y3QgZGxtX3NwYWNlICpzcCkKQEAgLTc3Niw2ICs3NzksMzMgQEAKIAljb25maWdfaXRlbV9wdXQoJnNwLT5ncm91cC5jZ19pdGVtKTsKIH0KIAorc3RhdGljIGludCBhZGRyX2NvbXBhcmUoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKngsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICp5KQoreworCXN3aXRjaCAoeC0+c3NfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOiB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2lueCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKil4OworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbnkgPSAoc3RydWN0IHNvY2thZGRyX2luICopeTsKKwkJaWYgKHNpbngtPnNpbl9hZGRyLnNfYWRkciAhPSBzaW55LT5zaW5fYWRkci5zX2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHNpbngtPnNpbl9wb3J0ICE9IHNpbnktPnNpbl9wb3J0KQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwljYXNlIEFGX0lORVQ2OiB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbnggPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXg7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbnkgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXk7CisJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZzaW54LT5zaW42X2FkZHIsICZzaW55LT5zaW42X2FkZHIpKQorCQkJcmV0dXJuIDA7CisJCWlmIChzaW54LT5zaW42X3BvcnQgIT0gc2lueS0+c2luNl9wb3J0KQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGxtX2NvbW0gKmdldF9jb21tKGludCBub2RlaWQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQogewogCXN0cnVjdCBjb25maWdfaXRlbSAqaTsKQEAgLTc4OCw3ICs4MTgsNyBAQAogCW11dGV4X2xvY2soJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmNvbW1fbGlzdC0+Y2dfY2hpbGRyZW4sIGNpX2VudHJ5KSB7Ci0JCWNtID0gdG9fY29tbShpKTsKKwkJY20gPSBjb25maWdfaXRlbV90b19jb21tKGkpOwogCiAJCWlmIChub2RlaWQpIHsKIAkJCWlmIChjbS0+bm9kZWlkICE9IG5vZGVpZCkKQEAgLTc5Nyw4ICs4MjcsNyBAQAogCQkJY29uZmlnX2l0ZW1fZ2V0KGkpOwogCQkJYnJlYWs7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIWNtLT5hZGRyX2NvdW50IHx8Ci0JCQkgICAgbWVtY21wKGNtLT5hZGRyWzBdLCBhZGRyLCBzaXplb2YoKmFkZHIpKSkKKwkJCWlmICghY20tPmFkZHJfY291bnQgfHwgIWFkZHJfY29tcGFyZShjbS0+YWRkclswXSwgYWRkcikpCiAJCQkJY29udGludWU7CiAJCQlmb3VuZCA9IDE7CiAJCQljb25maWdfaXRlbV9nZXQoaSk7CmRpZmYgLS1naXQgYS9mcy9kbG0vZGxtX2ludGVybmFsLmggYi9mcy9kbG0vZGxtX2ludGVybmFsLmgKaW5kZXggNWE3YWMzMy4uODY4ZTRjOSAxMDA2NDQKLS0tIGEvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCisrKyBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaApAQCAtMiw3ICsyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKioKICoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKICoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwpAQCAtNDQxLDggKzQ0MSwxMSBAQAogCXVpbnQzMl90CQlsc19nbG9iYWxfaWQ7CS8qIGdsb2JhbCB1bmlxdWUgbG9ja3NwYWNlIElEICovCiAJdWludDMyX3QJCWxzX2V4ZmxhZ3M7CiAJaW50CQkJbHNfbHZibGVuOwotCWludAkJCWxzX2NvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlpbnQJCQlsc19jb3VudDsJLyogcmVmY291bnQgb2YgcHJvY2Vzc2VzIGluCisJCQkJCQkgICB0aGUgZGxtIHVzaW5nIHRoaXMgbHMgKi8KKwlpbnQJCQlsc19jcmVhdGVfY291bnQ7IC8qIGNyZWF0ZS9yZWxlYXNlIHJlZmNvdW50ICovCiAJdW5zaWduZWQgbG9uZwkJbHNfZmxhZ3M7CS8qIExTRkxfICovCisJdW5zaWduZWQgbG9uZwkJbHNfc2Nhbl90aW1lOwogCXN0cnVjdCBrb2JqZWN0CQlsc19rb2JqOwogCiAJc3RydWN0IGRsbV9yc2J0YWJsZQkqbHNfcnNidGJsOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvY2tzcGFjZS5jIGIvZnMvZGxtL2xvY2tzcGFjZS5jCmluZGV4IDQ5OWUxNjcuLmQ5MTA1MDEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2Nrc3BhY2UuYworKysgYi9mcy9kbG0vbG9ja3NwYWNlLmMKQEAgLTIsNyArMiw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiogIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoqCiAqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCiAqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJsb2NrLmgiCiAjaW5jbHVkZSAicmVjb3Zlci5oIgogI2luY2x1ZGUgInJlcXVlc3RxdWV1ZS5oIgorI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIGludAkJCWxzX2NvdW50Owogc3RhdGljIHN0cnVjdCBtdXRleAkJbHNfbG9jazsKQEAgLTIxMSwxOSArMjEyLDQxIEBACiAJa3NldF91bnJlZ2lzdGVyKGRsbV9rc2V0KTsKIH0KIAotc3RhdGljIGludCBkbG1fc2NhbmQodm9pZCAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgZGxtX2xzICpmaW5kX2xzX3RvX3NjYW4odm9pZCkKIHsKIAlzdHJ1Y3QgZGxtX2xzICpsczsKIAorCXNwaW5fbG9jaygmbHNsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZsc2xpc3QsIGxzX2xpc3QpIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbHMtPmxzX3NjYW5fdGltZSArCisJCQkJCSAgICBkbG1fY29uZmlnLmNpX3NjYW5fc2VjcyAqIEhaKSkgeworCQkJc3Bpbl91bmxvY2soJmxzbGlzdF9sb2NrKTsKKwkJCXJldHVybiBsczsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbHNsaXN0X2xvY2spOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRsbV9zY2FuZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkbG1fbHMgKmxzOworCWludCB0aW1lb3V0X2ppZmZpZXMgPSBkbG1fY29uZmlnLmNpX3NjYW5fc2VjcyAqIEhaOworCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJmxzbGlzdCwgbHNfbGlzdCkgeworCQlscyA9IGZpbmRfbHNfdG9fc2NhbigpOworCQlpZiAobHMpIHsKIAkJCWlmIChkbG1fbG9ja19yZWNvdmVyeV90cnkobHMpKSB7CisJCQkJbHMtPmxzX3NjYW5fdGltZSA9IGppZmZpZXM7CiAJCQkJZGxtX3NjYW5fcnNicyhscyk7CiAJCQkJZGxtX3NjYW5fdGltZW91dChscyk7CiAJCQkJZGxtX3VubG9ja19yZWNvdmVyeShscyk7CisJCQl9IGVsc2UgeworCQkJCWxzLT5sc19zY2FuX3RpbWUgKz0gSFo7CiAJCQl9CisJCX0gZWxzZSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dF9qaWZmaWVzKTsKIAkJfQotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGxtX2NvbmZpZy5jaV9zY2FuX3NlY3MgKiBIWik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjQ2LDIzICsyNjksNiBAQAogCWt0aHJlYWRfc3RvcChzY2FuZF90YXNrKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkbG1fbHMgKmRsbV9maW5kX2xvY2tzcGFjZV9uYW1lKGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQotewotCXN0cnVjdCBkbG1fbHMgKmxzOwotCi0Jc3Bpbl9sb2NrKCZsc2xpc3RfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzLCAmbHNsaXN0LCBsc19saXN0KSB7Ci0JCWlmIChscy0+bHNfbmFtZWxlbiA9PSBuYW1lbGVuICYmCi0JCSAgICBtZW1jbXAobHMtPmxzX25hbWUsIG5hbWUsIG5hbWVsZW4pID09IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0JbHMgPSBOVUxMOwotIG91dDoKLQlzcGluX3VubG9jaygmbHNsaXN0X2xvY2spOwotCXJldHVybiBsczsKLX0KLQogc3RydWN0IGRsbV9scyAqZGxtX2ZpbmRfbG9ja3NwYWNlX2dsb2JhbCh1aW50MzJfdCBpZCkKIHsKIAlzdHJ1Y3QgZGxtX2xzICpsczsKQEAgLTMyNyw2ICszMzMsNyBAQAogCWZvciAoOzspIHsKIAkJc3Bpbl9sb2NrKCZsc2xpc3RfbG9jayk7CiAJCWlmIChscy0+bHNfY291bnQgPT0gMCkgeworCQkJV0FSTl9PTihscy0+bHNfY3JlYXRlX2NvdW50ICE9IDApOwogCQkJbGlzdF9kZWwoJmxzLT5sc19saXN0KTsKIAkJCXNwaW5fdW5sb2NrKCZsc2xpc3RfbG9jayk7CiAJCQlyZXR1cm47CkBAIC0zODEsNyArMzg4LDcgQEAKIAkJCSB1aW50MzJfdCBmbGFncywgaW50IGx2YmxlbikKIHsKIAlzdHJ1Y3QgZGxtX2xzICpsczsKLQlpbnQgaSwgc2l6ZSwgZXJyb3IgPSAtRU5PTUVNOworCWludCBpLCBzaXplLCBlcnJvcjsKIAlpbnQgZG9fdW5yZWcgPSAwOwogCiAJaWYgKG5hbWVsZW4gPiBETE1fTE9DS1NQQUNFX0xFTikKQEAgLTM5MywxMyArNDAwLDM4IEBACiAJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbHMgPSBkbG1fZmluZF9sb2Nrc3BhY2VfbmFtZShuYW1lLCBuYW1lbGVuKTsKLQlpZiAobHMpIHsKLQkJKmxvY2tzcGFjZSA9IGxzOworCWlmICghZGxtX3VzZXJfZGFlbW9uX2F2YWlsYWJsZSgpKSB7CiAJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCQlyZXR1cm4gLUVFWElTVDsKKwkJcmV0dXJuIC1FVU5BVENIOwogCX0KIAorCWVycm9yID0gMDsKKworCXNwaW5fbG9jaygmbHNsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobHMsICZsc2xpc3QsIGxzX2xpc3QpIHsKKwkJV0FSTl9PTihscy0+bHNfY3JlYXRlX2NvdW50IDw9IDApOworCQlpZiAobHMtPmxzX25hbWVsZW4gIT0gbmFtZWxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKGxzLT5sc19uYW1lLCBuYW1lLCBuYW1lbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZmxhZ3MgJiBETE1fTFNGTF9ORVdFWENMKSB7CisJCQllcnJvciA9IC1FRVhJU1Q7CisJCQlicmVhazsKKwkJfQorCQlscy0+bHNfY3JlYXRlX2NvdW50Kys7CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQllcnJvciA9IDE7IC8qIG5vdCBhbiBlcnJvciwgcmV0dXJuIDAgKi8KKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZsc2xpc3RfbG9jayk7CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAoZXJyb3IpCisJCWdvdG8gcmV0X3plcm87CisKKwllcnJvciA9IC1FTk9NRU07CisKIAlscyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fbHMpICsgbmFtZWxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFscykKIAkJZ290byBvdXQ7CkBAIC00MDgsNiArNDQwLDcgQEAKIAlscy0+bHNfbHZibGVuID0gbHZibGVuOwogCWxzLT5sc19jb3VudCA9IDA7CiAJbHMtPmxzX2ZsYWdzID0gMDsKKwlscy0+bHNfc2Nhbl90aW1lID0gamlmZmllczsKIAogCWlmIChmbGFncyAmIERMTV9MU0ZMX1RJTUVXQVJOKQogCQlzZXRfYml0KExTRkxfVElNRVdBUk4sICZscy0+bHNfZmxhZ3MpOwpAQCAtNDE4LDggKzQ1MSw5IEBACiAJCWxzLT5sc19hbGxvY2F0aW9uID0gR0ZQX0tFUk5FTDsKIAogCS8qIGxzX2V4ZmxhZ3MgYXJlIGZvcmNlZCB0byBtYXRjaCBhbW9uZyBub2RlcywgYW5kIHdlIGRvbid0Ci0JICAgbmVlZCB0byByZXF1aXJlIGFsbCBub2RlcyB0byBoYXZlIFRJTUVXQVJOIG9yIEZTIHNldCAqLwotCWxzLT5sc19leGZsYWdzID0gKGZsYWdzICYgfihETE1fTFNGTF9USU1FV0FSTiB8IERMTV9MU0ZMX0ZTKSk7CisJICAgbmVlZCB0byByZXF1aXJlIGFsbCBub2RlcyB0byBoYXZlIHNvbWUgZmxhZ3Mgc2V0ICovCisJbHMtPmxzX2V4ZmxhZ3MgPSAoZmxhZ3MgJiB+KERMTV9MU0ZMX1RJTUVXQVJOIHwgRExNX0xTRkxfRlMgfAorCQkJCSAgICBETE1fTFNGTF9ORVdFWENMKSk7CiAKIAlzaXplID0gZGxtX2NvbmZpZy5jaV9yc2J0Ymxfc2l6ZTsKIAlscy0+bHNfcnNidGJsX3NpemUgPSBzaXplOwpAQCAtNTEwLDYgKzU0NCw3IEBACiAJZG93bl93cml0ZSgmbHMtPmxzX2luX3JlY292ZXJ5KTsKIAogCXNwaW5fbG9jaygmbHNsaXN0X2xvY2spOworCWxzLT5sc19jcmVhdGVfY291bnQgPSAxOwogCWxpc3RfYWRkKCZscy0+bHNfbGlzdCwgJmxzbGlzdCk7CiAJc3Bpbl91bmxvY2soJmxzbGlzdF9sb2NrKTsKIApAQCAtNTQ4LDcgKzU4Myw3IEBACiAJZGxtX2NyZWF0ZV9kZWJ1Z19maWxlKGxzKTsKIAogCWxvZ19kZWJ1ZyhscywgImpvaW4gY29tcGxldGUiKTsKLQorIHJldF96ZXJvOgogCSpsb2Nrc3BhY2UgPSBsczsKIAlyZXR1cm4gMDsKIApAQCAtNjM1LDEzICs2NzAsMzQgQEAKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCXN0cnVjdCBkbG1fcnNiICpyc2I7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKLQlpbnQgaTsKLQlpbnQgYnVzeSA9IGxvY2tzcGFjZV9idXN5KGxzKTsKKwlpbnQgaSwgYnVzeSwgcnY7CiAKLQlpZiAoYnVzeSA+IGZvcmNlKQotCQlyZXR1cm4gLUVCVVNZOworCWJ1c3kgPSBsb2Nrc3BhY2VfYnVzeShscyk7CiAKLQlpZiAoZm9yY2UgPCAzKQorCXNwaW5fbG9jaygmbHNsaXN0X2xvY2spOworCWlmIChscy0+bHNfY3JlYXRlX2NvdW50ID09IDEpIHsKKwkJaWYgKGJ1c3kgPiBmb3JjZSkKKwkJCXJ2ID0gLUVCVVNZOworCQllbHNlIHsKKwkJCS8qIHJlbW92ZV9sb2Nrc3BhY2UgdGFrZXMgbHMgb2ZmIGxzbGlzdCAqLworCQkJbHMtPmxzX2NyZWF0ZV9jb3VudCA9IDA7CisJCQlydiA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGxzLT5sc19jcmVhdGVfY291bnQgPiAxKSB7CisJCXJ2ID0gLS1scy0+bHNfY3JlYXRlX2NvdW50OworCX0gZWxzZSB7CisJCXJ2ID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2soJmxzbGlzdF9sb2NrKTsKKworCWlmIChydikgeworCQlsb2dfZGVidWcobHMsICJyZWxlYXNlX2xvY2tzcGFjZSBubyByZW1vdmUgJWQiLCBydik7CisJCXJldHVybiBydjsKKwl9CisKKwlkbG1fZGV2aWNlX2RlcmVnaXN0ZXIobHMpOworCisJaWYgKGZvcmNlIDwgMyAmJiBkbG1fdXNlcl9kYWVtb25fYXZhaWxhYmxlKCkpCiAJCWRvX3VldmVudChscywgMCk7CiAKIAlkbG1fcmVjb3ZlcmRfc3RvcChscyk7CkBAIC03MjAsMTUgKzc3NiwxMCBAQAogCWRsbV9jbGVhcl9tZW1iZXJzKGxzKTsKIAlkbG1fY2xlYXJfbWVtYmVyc19nb25lKGxzKTsKIAlrZnJlZShscy0+bHNfbm9kZV9hcnJheSk7CisJbG9nX2RlYnVnKGxzLCAicmVsZWFzZV9sb2Nrc3BhY2UgZmluYWwgZnJlZSIpOwogCWtvYmplY3RfcHV0KCZscy0+bHNfa29iaik7CiAJLyogVGhlIGxzIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGtvYmplY3QgaXMgZG9uZSB3aXRoICovCiAKLQltdXRleF9sb2NrKCZsc19sb2NrKTsKLQlsc19jb3VudC0tOwotCWlmICghbHNfY291bnQpCi0JCXRocmVhZHNfc3RvcCgpOwotCW11dGV4X3VubG9jaygmbHNfbG9jayk7Ci0KIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc1MCwxMSArODAxLDM4IEBACiBpbnQgZGxtX3JlbGVhc2VfbG9ja3NwYWNlKHZvaWQgKmxvY2tzcGFjZSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBkbG1fbHMgKmxzOworCWludCBlcnJvcjsKIAogCWxzID0gZGxtX2ZpbmRfbG9ja3NwYWNlX2xvY2FsKGxvY2tzcGFjZSk7CiAJaWYgKCFscykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZGxtX3B1dF9sb2Nrc3BhY2UobHMpOwotCXJldHVybiByZWxlYXNlX2xvY2tzcGFjZShscywgZm9yY2UpOworCisJbXV0ZXhfbG9jaygmbHNfbG9jayk7CisJZXJyb3IgPSByZWxlYXNlX2xvY2tzcGFjZShscywgZm9yY2UpOworCWlmICghZXJyb3IpCisJCWxzX2NvdW50LS07CisJZWxzZSBpZiAoIWxzX2NvdW50KQorCQl0aHJlYWRzX3N0b3AoKTsKKwltdXRleF91bmxvY2soJmxzX2xvY2spOworCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGRsbV9zdG9wX2xvY2tzcGFjZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGxtX2xzICpsczsKKworIHJlc3RhcnQ6CisJc3Bpbl9sb2NrKCZsc2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShscywgJmxzbGlzdCwgbHNfbGlzdCkgeworCQlpZiAoIXRlc3RfYml0KExTRkxfUlVOTklORywgJmxzLT5sc19mbGFncykpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2soJmxzbGlzdF9sb2NrKTsKKwkJbG9nX2Vycm9yKGxzLCAibm8gdXNlcmxhbmQgY29udHJvbCBkYWVtb24sIHN0b3BwaW5nIGxvY2tzcGFjZSIpOworCQlkbG1fbHNfc3RvcChscyk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJc3Bpbl91bmxvY2soJmxzbGlzdF9sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvY2tzcGFjZS5oIGIvZnMvZGxtL2xvY2tzcGFjZS5oCmluZGV4IDg5MWVhYmIuLmY4NzlmODcgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2Nrc3BhY2UuaAorKysgYi9mcy9kbG0vbG9ja3NwYWNlLmgKQEAgLTIwLDYgKzIwLDcgQEAKIHN0cnVjdCBkbG1fbHMgKmRsbV9maW5kX2xvY2tzcGFjZV9sb2NhbCh2b2lkICppZCk7CiBzdHJ1Y3QgZGxtX2xzICpkbG1fZmluZF9sb2Nrc3BhY2VfZGV2aWNlKGludCBtaW5vcik7CiB2b2lkIGRsbV9wdXRfbG9ja3NwYWNlKHN0cnVjdCBkbG1fbHMgKmxzKTsKK3ZvaWQgZGxtX3N0b3BfbG9ja3NwYWNlcyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTE9DS1NQQUNFX0RPVF9IX18gKi8KIApkaWZmIC0tZ2l0IGEvZnMvZGxtL3VzZXIuYyBiL2ZzL2RsbS91c2VyLmMKaW5kZXggMzRmMTRhMS4uYjM4MzJjNiAxMDA2NDQKLS0tIGEvZnMvZGxtL3VzZXIuYworKysgYi9mcy9kbG0vdXNlci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAogICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RsbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RsbV9kZXZpY2UuaD4KIApAQCAtMjcsNiArMjYsOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciBuYW1lX3ByZWZpeFtdID0gImRsbSI7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZpY2VfZm9wczsKK3N0YXRpYyBhdG9taWNfdCBkbG1fbW9uaXRvcl9vcGVuZWQ7CitzdGF0aWMgaW50IGRsbV9tb25pdG9yX3VudXNlZCA9IDE7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKQEAgLTM0MCwxMCArMzQxLDE1IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IGNyZWF0ZV9taXNjX2RldmljZShzdHJ1Y3QgZGxtX2xzICpscywgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgZGxtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZGxtX2xzICpscywgY2hhciAqbmFtZSkKIHsKIAlpbnQgZXJyb3IsIGxlbjsKIAorCS8qIFRoZSBkZXZpY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlCisJICAgbG9ja3NwYWNlIGlzIGNyZWF0ZWQgbXVsdGlwbGUgdGltZXMgZnJvbSB1c2Vyc3BhY2UuICovCisJaWYgKGxzLT5sc19kZXZpY2UubmFtZSkKKwkJcmV0dXJuIDA7CisKIAllcnJvciA9IC1FTk9NRU07CiAJbGVuID0gc3RybGVuKG5hbWUpICsgc3RybGVuKG5hbWVfcHJlZml4KSArIDI7CiAJbHMtPmxzX2RldmljZS5uYW1lID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOwpAQCAtMzYzLDYgKzM2OSwyMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAoraW50IGRsbV9kZXZpY2VfZGVyZWdpc3RlcihzdHJ1Y3QgZGxtX2xzICpscykKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBUaGUgZGV2aWNlIGlzIG5vdCByZWdpc3RlcmVkLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGxvY2tzcGFjZQorCSAgIHdhcyBuZXZlciB1c2VkIGZyb20gdXNlcnNwYWNlLCBvciB3aGVuIGRldmljZV9jcmVhdGVfbG9ja3NwYWNlKCkKKwkgICBjYWxscyBkbG1fcmVsZWFzZV9sb2Nrc3BhY2UoKSBhZnRlciB0aGUgcmVnaXN0ZXIgZmFpbHMuICovCisJaWYgKCFscy0+bHNfZGV2aWNlLm5hbWUpCisJCXJldHVybiAwOworCisJZXJyb3IgPSBtaXNjX2RlcmVnaXN0ZXIoJmxzLT5sc19kZXZpY2UpOworCWlmICghZXJyb3IpCisJCWtmcmVlKGxzLT5sc19kZXZpY2UubmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgaW50IGRldmljZV91c2VyX3B1cmdlKHN0cnVjdCBkbG1fdXNlcl9wcm9jICpwcm9jLAogCQkJICAgICBzdHJ1Y3QgZGxtX3B1cmdlX3BhcmFtcyAqcGFyYW1zKQogewpAQCAtMzk3LDcgKzQxOSw3IEBACiAJaWYgKCFscykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQllcnJvciA9IGNyZWF0ZV9taXNjX2RldmljZShscywgcGFyYW1zLT5uYW1lKTsKKwllcnJvciA9IGRsbV9kZXZpY2VfcmVnaXN0ZXIobHMsIHBhcmFtcy0+bmFtZSk7CiAJZGxtX3B1dF9sb2Nrc3BhY2UobHMpOwogCiAJaWYgKGVycm9yKQpAQCAtNDIxLDMxICs0NDMsMjIgQEAKIAlpZiAoIWxzKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCS8qIERlcmVnaXN0ZXIgdGhlIG1pc2MgZGV2aWNlIGZpcnN0LCBzbyB3ZSBkb24ndCBoYXZlCi0JICogYSBkZXZpY2UgdGhhdCdzIG5vdCBhdHRhY2hlZCB0byBhIGxvY2tzcGFjZS4gSWYKLQkgKiBkbG1fcmVsZWFzZV9sb2Nrc3BhY2UgZmFpbHMgdGhlbiB3ZSBjYW4gcmVjcmVhdGUgaXQKLQkgKi8KLQllcnJvciA9IG1pc2NfZGVyZWdpc3RlcigmbHMtPmxzX2RldmljZSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWRsbV9wdXRfbG9ja3NwYWNlKGxzKTsKLQkJZ290byBvdXQ7Ci0JfQotCWtmcmVlKGxzLT5sc19kZXZpY2UubmFtZSk7Ci0KIAlpZiAocGFyYW1zLT5mbGFncyAmIERMTV9VU0VSX0xTRkxHX0ZPUkNFRlJFRSkKIAkJZm9yY2UgPSAyOwogCiAJbG9ja3NwYWNlID0gbHMtPmxzX2xvY2FsX2hhbmRsZTsKLQotCS8qIGRsbV9yZWxlYXNlX2xvY2tzcGFjZSB3YWl0cyBmb3IgcmVmZXJlbmNlcyB0byBnbyB0byB6ZXJvLAotCSAgIHNvIGFsbCBwcm9jZXNzZXMgd2lsbCBuZWVkIHRvIGNsb3NlIHRoZWlyIGRldmljZSBmb3IgdGhlIGxzCi0JICAgYmVmb3JlIHRoZSByZWxlYXNlIHdpbGwgcHJvY2VkZSAqLwotCiAJZGxtX3B1dF9sb2Nrc3BhY2UobHMpOworCisJLyogVGhlIGZpbmFsIGRsbV9yZWxlYXNlX2xvY2tzcGFjZSB3YWl0cyBmb3IgcmVmZXJlbmNlcyB0byBnbyB0bworCSAgIHplcm8sIHNvIGFsbCBwcm9jZXNzZXMgd2lsbCBuZWVkIHRvIGNsb3NlIHRoZWlyIGRldmljZSBmb3IgdGhlCisJICAgbHMgYmVmb3JlIHRoZSByZWxlYXNlIHdpbGwgcHJvY2VlZC4gIHJlbGVhc2UgYWxzbyBjYWxscyB0aGUKKwkgICBkZXZpY2VfZGVyZWdpc3RlciBhYm92ZS4gIENvbnZlcnRpbmcgYSBwb3NpdGl2ZSByZXR1cm4gdmFsdWUKKwkgICBmcm9tIHJlbGVhc2UgdG8gemVybyBtZWFucyB0aGF0IHVzZXJzcGFjZSB3b24ndCBrbm93IHdoZW4gaXRzCisJICAgcmVsZWFzZSB3YXMgdGhlIGZpbmFsIG9uZSwgYnV0IGl0IHNob3VsZG4ndCBuZWVkIHRvIGtub3cuICovCisKIAllcnJvciA9IGRsbV9yZWxlYXNlX2xvY2tzcGFjZShsb2Nrc3BhY2UsIGZvcmNlKTsKLQlpZiAoZXJyb3IpCi0JCWNyZWF0ZV9taXNjX2RldmljZShscywgbHMtPmxzX25hbWUpOwotIG91dDoKKwlpZiAoZXJyb3IgPiAwKQorCQllcnJvciA9IDA7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC02MjMsMTcgKzYzNiwxMyBAQAogCXN0cnVjdCBkbG1fdXNlcl9wcm9jICpwcm9jOwogCXN0cnVjdCBkbG1fbHMgKmxzOwogCi0JbG9ja19rZXJuZWwoKTsKIAlscyA9IGRsbV9maW5kX2xvY2tzcGFjZV9kZXZpY2UoaW1pbm9yKGlub2RlKSk7Ci0JaWYgKCFscykgewotCQl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFscykKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQogCiAJcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbG1fdXNlcl9wcm9jKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcm9jKSB7CiAJCWRsbV9wdXRfbG9ja3NwYWNlKGxzKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTY0NSw3ICs2NTQsNiBAQAogCXNwaW5fbG9ja19pbml0KCZwcm9jLT5sb2Nrc19zcGluKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcm9jLT53YWl0KTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBwcm9jOwotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiAwOwogfQpAQCAtODc4LDkgKzg4NiwyOCBAQAogCXJldHVybiAwOwogfQogCitpbnQgZGxtX3VzZXJfZGFlbW9uX2F2YWlsYWJsZSh2b2lkKQoreworCS8qIGRsbV9jb250cm9sZCBoYXNuJ3Qgc3RhcnRlZCAob3IsIGhhcyBzdGFydGVkLCBidXQgbm90CisJICAgcHJvcGVybHkgcG9wdWxhdGVkIGNvbmZpZ2ZzKSAqLworCisJaWYgKCFkbG1fb3VyX25vZGVpZCgpKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgaXMgdG8gZGVhbCB3aXRoIHZlcnNpb25zIG9mIGRsbV9jb250cm9sZCB0aGF0IGRvbid0CisJICAga25vdyBhYm91dCB0aGUgbW9uaXRvciBkZXZpY2UuICBXZSBhc3N1bWUgdGhhdCBpZiB0aGUKKwkgICBkbG1fY29udHJvbGQgd2FzIHN0YXJ0ZWQgKGFib3ZlKSwgYnV0IHRoZSBtb25pdG9yIGRldmljZQorCSAgIHdhcyBuZXZlciBvcGVuZWQsIHRoYXQgaXQncyBhbiBvbGQgdmVyc2lvbi4gIGRsbV9jb250cm9sZAorCSAgIHNob3VsZCBvcGVuIHRoZSBtb25pdG9yIGRldmljZSBiZWZvcmUgcG9wdWxhdGluZyBjb25maWdmcy4gKi8KKworCWlmIChkbG1fbW9uaXRvcl91bnVzZWQpCisJCXJldHVybiAxOworCisJcmV0dXJuIGF0b21pY19yZWFkKCZkbG1fbW9uaXRvcl9vcGVuZWQpID8gMSA6IDA7Cit9CisKIHN0YXRpYyBpbnQgY3RsX2RldmljZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWN5Y2xlX2tlcm5lbF9sb2NrKCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5MCw2ICs5MTcsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtb25pdG9yX2RldmljZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWF0b21pY19pbmMoJmRsbV9tb25pdG9yX29wZW5lZCk7CisJZGxtX21vbml0b3JfdW51c2VkID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb25pdG9yX2RldmljZV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGxtX21vbml0b3Jfb3BlbmVkKSkKKwkJZGxtX3N0b3BfbG9ja3NwYWNlcygpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZpY2VfZm9wcyA9IHsKIAkub3BlbiAgICA9IGRldmljZV9vcGVuLAogCS5yZWxlYXNlID0gZGV2aWNlX2Nsb3NlLApAQCAtOTEzLDE5ICs5NTQsNDIgQEAKIAkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25pdG9yX2RldmljZV9mb3BzID0geworCS5vcGVuICAgID0gbW9uaXRvcl9kZXZpY2Vfb3BlbiwKKwkucmVsZWFzZSA9IG1vbml0b3JfZGV2aWNlX2Nsb3NlLAorCS5vd25lciAgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbW9uaXRvcl9kZXZpY2UgPSB7CisJLm5hbWUgID0gImRsbS1tb25pdG9yIiwKKwkuZm9wcyAgPSAmbW9uaXRvcl9kZXZpY2VfZm9wcywKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCit9OworCiBpbnQgX19pbml0IGRsbV91c2VyX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJmN0bF9kZXZpY2UpOwotCWlmIChlcnJvcikKLQkJbG9nX3ByaW50KCJtaXNjX3JlZ2lzdGVyIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKKwlhdG9taWNfc2V0KCZkbG1fbW9uaXRvcl9vcGVuZWQsIDApOwogCisJZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZjdGxfZGV2aWNlKTsKKwlpZiAoZXJyb3IpIHsKKwkJbG9nX3ByaW50KCJtaXNjX3JlZ2lzdGVyIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBtaXNjX3JlZ2lzdGVyKCZtb25pdG9yX2RldmljZSk7CisJaWYgKGVycm9yKSB7CisJCWxvZ19wcmludCgibWlzY19yZWdpc3RlciBmYWlsZWQgZm9yIG1vbml0b3IgZGV2aWNlIik7CisJCW1pc2NfZGVyZWdpc3RlcigmY3RsX2RldmljZSk7CisJfQorIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHZvaWQgZGxtX3VzZXJfZXhpdCh2b2lkKQogewogCW1pc2NfZGVyZWdpc3RlcigmY3RsX2RldmljZSk7CisJbWlzY19kZXJlZ2lzdGVyKCZtb25pdG9yX2RldmljZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS91c2VyLmggYi9mcy9kbG0vdXNlci5oCmluZGV4IGQzOGU5ZjMuLjM1ZWI2YTEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS91c2VyLmgKKysrIGIvZnMvZGxtL3VzZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCiAgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwpAQCAtMTIsNSArMTIsNyBAQAogdm9pZCBkbG1fdXNlcl9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlKTsKIGludCBkbG1fdXNlcl9pbml0KHZvaWQpOwogdm9pZCBkbG1fdXNlcl9leGl0KHZvaWQpOworaW50IGRsbV9kZXZpY2VfZGVyZWdpc3RlcihzdHJ1Y3QgZGxtX2xzICpscyk7CitpbnQgZGxtX3VzZXJfZGFlbW9uX2F2YWlsYWJsZSh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9kcXVvdC5jIGIvZnMvZHF1b3QuYwppbmRleCA4ZWM0ZDZjLi5kYTMwYTI3IDEwMDY0NAotLS0gYS9mcy9kcXVvdC5jCisrKyBiL2ZzL2RxdW90LmMKQEAgLTksOCArOSw2IEBACiAgKiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBvbmUgb2YgdGhlIHNldmVyYWwgdmFyaWFudHMgb2YgdGhlIExJTlVYCiAgKiBpbm9kZS1zdWJzeXN0ZW0gd2l0aCBhZGRlZCBjb21wbGV4aXR5IG9mIHRoZSBkaXNrcXVvdGEgc3lzdGVtLgogICogCi0gKiBWZXJzaW9uOiAkSWQ6IGRxdW90LmMsdiA2LjMgMTk5Ni8xMS8xNyAxODozNTozNCBtdncgRXhwIG12dyAkCi0gKiAKICAqIEF1dGhvcjoJTWFyY28gdmFuIFdpZXJpbmdlbiA8bXZ3QHBsYW5ldHMuZWxtLm5ldD4KICAqCiAgKiBGaXhlczogICBEbWl0cnkgR29yb2RjaGFuaW4gPHBnbWRzZ0BpYmkuY29tPiwgMTEgRmViIDk2CkBAIC04OTUsMTAgKzg5Myw5IEBACiAJICAgIHdhcm50eXBlID09IFFVT1RBX05MX0JTT0ZUQkVMT1cgfHwgIW5lZWRfcHJpbnRfd2FybmluZyhkcXVvdCkpCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CiAJaWYgKCF0dHkpCi0JCWdvdG8gb3V0X2xvY2s7CisJCXJldHVybjsKIAl0dHlfd3JpdGVfbWVzc2FnZSh0dHksIGRxdW90LT5kcV9zYi0+c19pZCk7CiAJaWYgKHdhcm50eXBlID09IFFVT1RBX05MX0lTT0ZUV0FSTiB8fCB3YXJudHlwZSA9PSBRVU9UQV9OTF9CU09GVFdBUk4pCiAJCXR0eV93cml0ZV9tZXNzYWdlKHR0eSwgIjogd2FybmluZywgIik7CkBAIC05MjYsOCArOTIzLDcgQEAKIAkJCWJyZWFrOwogCX0KIAl0dHlfd3JpdGVfbWVzc2FnZSh0dHksIG1zZyk7Ci1vdXRfbG9jazoKLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvTWFrZWZpbGUgYi9mcy9lY3J5cHRmcy9NYWtlZmlsZQppbmRleCBiNDc1NWE4Li4yY2M5ZWU0IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9NYWtlZmlsZQorKysgYi9mcy9lY3J5cHRmcy9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX0VDUllQVF9GUykgKz0gZWNyeXB0ZnMubwogCi1lY3J5cHRmcy1vYmpzIDo9IGRlbnRyeS5vIGZpbGUubyBpbm9kZS5vIG1haW4ubyBzdXBlci5vIG1tYXAubyByZWFkX3dyaXRlLm8gY3J5cHRvLm8ga2V5c3RvcmUubyBtZXNzYWdpbmcubyBuZXRsaW5rLm8gbWlzY2Rldi5vIGt0aHJlYWQubyBkZWJ1Zy5vCitlY3J5cHRmcy1vYmpzIDo9IGRlbnRyeS5vIGZpbGUubyBpbm9kZS5vIG1haW4ubyBzdXBlci5vIG1tYXAubyByZWFkX3dyaXRlLm8gY3J5cHRvLm8ga2V5c3RvcmUubyBtZXNzYWdpbmcubyBtaXNjZGV2Lm8ga3RocmVhZC5vIGRlYnVnLm8KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKaW5kZXggYjczZmI3NS4uMzUwNGNmOSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKKysrIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKQEAgLTc5LDExICs3OSw2IEBACiAjZGVmaW5lIEVDUllQVEZTX01BWF9QS0lfTkFNRV9CWVRFUyAxNgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX05VTV9VU0VSUyA0CiAjZGVmaW5lIEVDUllQVEZTX01BWF9OVU1fVVNFUlMgMzI3NjgKLSNkZWZpbmUgRUNSWVBURlNfVFJBTlNQT1JUX05FVExJTksgMAotI2RlZmluZSBFQ1JZUFRGU19UUkFOU1BPUlRfQ09OTkVDVE9SIDEKLSNkZWZpbmUgRUNSWVBURlNfVFJBTlNQT1JUX1JFTEFZRlMgMgotI2RlZmluZSBFQ1JZUFRGU19UUkFOU1BPUlRfTUlTQ0RFViAzCi0jZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfVFJBTlNQT1JUIEVDUllQVEZTX1RSQU5TUE9SVF9NSVNDREVWCiAjZGVmaW5lIEVDUllQVEZTX1hBVFRSX05BTUUgInVzZXIuZWNyeXB0ZnMiCiAKICNkZWZpbmUgUkZDMjQ0MF9DSVBIRVJfREVTM19FREUgMHgwMgpAQCAtNDAwLDggKzM5NSw2IEBACiAJc3RydWN0IG11dGV4IG11eDsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgZWNyeXB0ZnNfdHJhbnNwb3J0OwotCiBzdHJ1Y3QgZWNyeXB0ZnNfZGFlbW9uOwogCiBzdHJ1Y3QgZWNyeXB0ZnNfZGFlbW9uIHsKQEAgLTYyNywzMSArNjIwLDIwIEBACiBlY3J5cHRmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAogCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwogaW50IGVjcnlwdGZzX3JlYWRfeGF0dHJfcmVnaW9uKGNoYXIgKnBhZ2VfdmlydCwgc3RydWN0IGlub2RlICplY3J5cHRmc19pbm9kZSk7Ci1pbnQgZWNyeXB0ZnNfcHJvY2Vzc19oZWxvKHVuc2lnbmVkIGludCB0cmFuc3BvcnQsIHVpZF90IGV1aWQsCi0JCQkgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywgc3RydWN0IHBpZCAqcGlkKTsKK2ludCBlY3J5cHRmc19wcm9jZXNzX2hlbG8odWlkX3QgZXVpZCwgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAorCQkJICBzdHJ1Y3QgcGlkICpwaWQpOwogaW50IGVjcnlwdGZzX3Byb2Nlc3NfcXVpdCh1aWRfdCBldWlkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCQkgIHN0cnVjdCBwaWQgKnBpZCk7CiBpbnQgZWNyeXB0ZnNfcHJvY2Vzc19yZXNwb25zZShzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSAqbXNnLCB1aWRfdCBldWlkLAogCQkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLCBzdHJ1Y3QgcGlkICpwaWQsCiAJCQkgICAgICB1MzIgc2VxKTsKLWludCBlY3J5cHRmc19zZW5kX21lc3NhZ2UodW5zaWduZWQgaW50IHRyYW5zcG9ydCwgY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLAoraW50IGVjcnlwdGZzX3NlbmRfbWVzc2FnZShjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sCiAJCQkgIHN0cnVjdCBlY3J5cHRmc19tc2dfY3R4ICoqbXNnX2N0eCk7CiBpbnQgZWNyeXB0ZnNfd2FpdF9mb3JfcmVzcG9uc2Uoc3RydWN0IGVjcnlwdGZzX21zZ19jdHggKm1zZ19jdHgsCiAJCQkgICAgICAgc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UgKiplbXNnKTsKLWludCBlY3J5cHRmc19pbml0X21lc3NhZ2luZyh1bnNpZ25lZCBpbnQgdHJhbnNwb3J0KTsKLXZvaWQgZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcodW5zaWduZWQgaW50IHRyYW5zcG9ydCk7CitpbnQgZWNyeXB0ZnNfaW5pdF9tZXNzYWdpbmcodm9pZCk7Cit2b2lkIGVjcnlwdGZzX3JlbGVhc2VfbWVzc2FnaW5nKHZvaWQpOwogCi1pbnQgZWNyeXB0ZnNfc2VuZF9uZXRsaW5rKGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKLQkJCSAgc3RydWN0IGVjcnlwdGZzX21zZ19jdHggKm1zZ19jdHgsIHU4IG1zZ190eXBlLAotCQkJICB1MTYgbXNnX2ZsYWdzLCBzdHJ1Y3QgcGlkICpkYWVtb25fcGlkKTsKLWludCBlY3J5cHRmc19pbml0X25ldGxpbmsodm9pZCk7Ci12b2lkIGVjcnlwdGZzX3JlbGVhc2VfbmV0bGluayh2b2lkKTsKLQotaW50IGVjcnlwdGZzX3NlbmRfY29ubmVjdG9yKGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKLQkJCSAgICBzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqbXNnX2N0eCwgdTggbXNnX3R5cGUsCi0JCQkgICAgdTE2IG1zZ19mbGFncywgc3RydWN0IHBpZCAqZGFlbW9uX3BpZCk7Ci1pbnQgZWNyeXB0ZnNfaW5pdF9jb25uZWN0b3Iodm9pZCk7Ci12b2lkIGVjcnlwdGZzX3JlbGVhc2VfY29ubmVjdG9yKHZvaWQpOwogdm9pZAogZWNyeXB0ZnNfd3JpdGVfaGVhZGVyX21ldGFkYXRhKGNoYXIgKnZpcnQsCiAJCQkgICAgICAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9maWxlLmMgYi9mcy9lY3J5cHRmcy9maWxlLmMKaW5kZXggOTI0NGQ2NS4uZWIzZGM0YyAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZmlsZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwpAQCAtNzEsMTIgKzcxLDExIEBACiAJdm9pZCAqZGlyZW50OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlmaWxsZGlyX3QgZmlsbGRpcjsKLQlpbnQgZXJyOwogCWludCBmaWxsZGlyX2NhbGxlZDsKIAlpbnQgZW50cmllc193cml0dGVuOwogfTsKIAotLyogSW5zcGlyZWQgYnkgZ2VuZXJpYyBmaWxsZGlyIGluIGZzL3JlYWRpci5jICovCisvKiBJbnNwaXJlZCBieSBnZW5lcmljIGZpbGxkaXIgaW4gZnMvcmVhZGRpci5jICovCiBzdGF0aWMgaW50CiBlY3J5cHRmc19maWxsZGlyKHZvaWQgKmRpcmVudCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGxvZmZfdCBvZmZzZXQsCiAJCSB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQpAQCAtMTI1LDE4ICsxMjQsMTggQEAKIAlidWYuZGlyZW50ID0gZGlyZW50OwogCWJ1Zi5kZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCWJ1Zi5maWxsZGlyID0gZmlsbGRpcjsKLXJldHJ5OgogCWJ1Zi5maWxsZGlyX2NhbGxlZCA9IDA7CiAJYnVmLmVudHJpZXNfd3JpdHRlbiA9IDA7Ci0JYnVmLmVyciA9IDA7CiAJcmMgPSB2ZnNfcmVhZGRpcihsb3dlcl9maWxlLCBlY3J5cHRmc19maWxsZGlyLCAodm9pZCAqKSZidWYpOwotCWlmIChidWYuZXJyKQotCQlyYyA9IGJ1Zi5lcnI7Ci0JaWYgKGJ1Zi5maWxsZGlyX2NhbGxlZCAmJiAhYnVmLmVudHJpZXNfd3JpdHRlbikKLQkJZ290byByZXRyeTsKIAlmaWxlLT5mX3BvcyA9IGxvd2VyX2ZpbGUtPmZfcG9zOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0OworCWlmIChidWYuZmlsbGRpcl9jYWxsZWQgJiYgIWJ1Zi5lbnRyaWVzX3dyaXR0ZW4pCisJCWdvdG8gb3V0OwogCWlmIChyYyA+PSAwKQotCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShpbm9kZSwgbG93ZXJfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGlub2RlLAorCQkJCQlsb3dlcl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKK291dDoKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IGY1Yjc2YTMuLmUyMmJjMzkgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtMjM0LDggKzIzNCw4IEBACiAJfQogCWkgKz0gZGF0YV9sZW47CiAJaWYgKG1lc3NhZ2VfbGVuIDwgKGkgKyBtX3NpemUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIlRoZSByZWNlaXZlZCBuZXRsaW5rIG1lc3NhZ2UgaXMgIgotCQkJCSJzaG9ydGVyIHRoYW4gZXhwZWN0ZWRcbiIpOworCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGVjcnlwdGZzZCAiCisJCQkJImlzIHNob3J0ZXIgdGhhbiBleHBlY3RlZFxuIik7CiAJCXJjID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDM4LDggKzQzOCw4IEBACiAJc3RydWN0IGVjcnlwdGZzX21zZ19jdHggKm1zZ19jdHg7CiAJc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UgKm1zZyA9IE5VTEw7CiAJY2hhciAqYXV0aF90b2tfc2lnOwotCWNoYXIgKm5ldGxpbmtfbWVzc2FnZTsKLQlzaXplX3QgbmV0bGlua19tZXNzYWdlX2xlbmd0aDsKKwljaGFyICpwYXlsb2FkOworCXNpemVfdCBwYXlsb2FkX2xlbjsKIAlpbnQgcmM7CiAKIAlyYyA9IGVjcnlwdGZzX2dldF9hdXRoX3Rva19zaWcoJmF1dGhfdG9rX3NpZywgYXV0aF90b2spOwpAQCAtNDQ5LDE1ICs0NDksMTUgQEAKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gd3JpdGVfdGFnXzY0X3BhY2tldChhdXRoX3Rva19zaWcsICYoYXV0aF90b2stPnNlc3Npb25fa2V5KSwKLQkJCQkgJm5ldGxpbmtfbWVzc2FnZSwgJm5ldGxpbmtfbWVzc2FnZV9sZW5ndGgpOworCQkJCSAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRmFpbGVkIHRvIHdyaXRlIHRhZyA2NCBwYWNrZXRcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBlY3J5cHRmc19zZW5kX21lc3NhZ2UoZWNyeXB0ZnNfdHJhbnNwb3J0LCBuZXRsaW5rX21lc3NhZ2UsCi0JCQkJICAgbmV0bGlua19tZXNzYWdlX2xlbmd0aCwgJm1zZ19jdHgpOworCXJjID0gZWNyeXB0ZnNfc2VuZF9tZXNzYWdlKHBheWxvYWQsIHBheWxvYWRfbGVuLCAmbXNnX2N0eCk7CiAJaWYgKHJjKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIHNlbmRpbmcgbmV0bGluayBtZXNzYWdlXG4iKTsKKwkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igc2VuZGluZyBtZXNzYWdlIHRvICIKKwkJCQkiZWNyeXB0ZnNkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gZWNyeXB0ZnNfd2FpdF9mb3JfcmVzcG9uc2UobXNnX2N0eCwgJm1zZyk7CkBAIC0xMzMzLDIzICsxMzMzLDIyIEBACiAJCQlzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3JlY29yZCAqa2V5X3JlYykKIHsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqbXNnX2N0eCA9IE5VTEw7Ci0JY2hhciAqbmV0bGlua19wYXlsb2FkOwotCXNpemVfdCBuZXRsaW5rX3BheWxvYWRfbGVuZ3RoOworCWNoYXIgKnBheWxvYWQgPSBOVUxMOworCXNpemVfdCBwYXlsb2FkX2xlbjsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSAqbXNnOwogCWludCByYzsKIAogCXJjID0gd3JpdGVfdGFnXzY2X3BhY2tldChhdXRoX3Rvay0+dG9rZW4ucHJpdmF0ZV9rZXkuc2lnbmF0dXJlLAogCQkJCSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQpLAotCQkJCSBjcnlwdF9zdGF0LCAmbmV0bGlua19wYXlsb2FkLAotCQkJCSAmbmV0bGlua19wYXlsb2FkX2xlbmd0aCk7CisJCQkJIGNyeXB0X3N0YXQsICZwYXlsb2FkLCAmcGF5bG9hZF9sZW4pOwogCWlmIChyYykgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBnZW5lcmF0aW5nIHRhZyA2NiBwYWNrZXRcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBlY3J5cHRmc19zZW5kX21lc3NhZ2UoZWNyeXB0ZnNfdHJhbnNwb3J0LCBuZXRsaW5rX3BheWxvYWQsCi0JCQkJICAgbmV0bGlua19wYXlsb2FkX2xlbmd0aCwgJm1zZ19jdHgpOworCXJjID0gZWNyeXB0ZnNfc2VuZF9tZXNzYWdlKHBheWxvYWQsIHBheWxvYWRfbGVuLCAmbXNnX2N0eCk7CiAJaWYgKHJjKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIHNlbmRpbmcgbmV0bGluayBtZXNzYWdlXG4iKTsKKwkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igc2VuZGluZyBtZXNzYWdlIHRvICIKKwkJCQkiZWNyeXB0ZnNkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gZWNyeXB0ZnNfd2FpdF9mb3JfcmVzcG9uc2UobXNnX2N0eCwgJm1zZyk7CkBAIC0xMzY0LDggKzEzNjMsNyBAQAogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBwYXJzaW5nIHRhZyA2NyBwYWNrZXRcbiIpOwogCWtmcmVlKG1zZyk7CiBvdXQ6Ci0JaWYgKG5ldGxpbmtfcGF5bG9hZCkKLQkJa2ZyZWUobmV0bGlua19wYXlsb2FkKTsKKwlrZnJlZShwYXlsb2FkKTsKIAlyZXR1cm4gcmM7CiB9CiAvKioKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL21haW4uYyBiL2ZzL2VjcnlwdGZzL21haW4uYwppbmRleCA0NDhkZmQ1Li4wNDZlMDI3IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9tYWluLmMKKysrIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CkBAIC00OSw4ICs0OCw3IEBACiAJCSAiMCwgd2hpY2ggaXMgUXVpZXQpIik7CiAKIC8qKgotICogTW9kdWxlIHBhcmFtZXRlciB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UgYnVmZmVyCi0gKiBlbGVtZW50cworICogTW9kdWxlIHBhcmFtZXRlciB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZiBtZXNzYWdlIGJ1ZmZlciBlbGVtZW50cwogICovCiB1bnNpZ25lZCBpbnQgZWNyeXB0ZnNfbWVzc2FnZV9idWZfbGVuID0gRUNSWVBURlNfREVGQVVMVF9NU0dfQ1RYX0VMRU1TOwogCkBAIC02MCw5ICs1OCw5IEBACiAKIC8qKgogICogTW9kdWxlIHBhcmFtZXRlciB0aGF0IGRlZmluZXMgdGhlIG1heGltdW0gZ3VhcmFudGVlZCBhbW91bnQgb2YgdGltZSB0byB3YWl0Ci0gKiBmb3IgYSByZXNwb25zZSB0aHJvdWdoIG5ldGxpbmsuICBUaGUgYWN0dWFsIHNsZWVwIHRpbWUgd2lsbCBiZSwgbW9yZSB0aGFuCisgKiBmb3IgYSByZXNwb25zZSBmcm9tIGVjcnlwdGZzZC4gIFRoZSBhY3R1YWwgc2xlZXAgdGltZSB3aWxsIGJlLCBtb3JlIHRoYW4KICAqIGxpa2VseSwgYSBzbWFsbCBhbW91bnQgZ3JlYXRlciB0aGFuIHRoaXMgc3BlY2lmaWVkIHZhbHVlLCBidXQgb25seSBsZXNzIGlmCi0gKiB0aGUgbmV0bGluayBtZXNzYWdlIHN1Y2Nlc3NmdWxseSBhcnJpdmVzLgorICogdGhlIG1lc3NhZ2Ugc3VjY2Vzc2Z1bGx5IGFycml2ZXMuCiAgKi8KIHNpZ25lZCBsb25nIGVjcnlwdGZzX21lc3NhZ2Vfd2FpdF90aW1lb3V0ID0gRUNSWVBURlNfTUFYX01TR19DVFhfVFRMIC8gSFo7CiAKQEAgLTgzLDggKzgxLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZWNyeXB0ZnNfbnVtYmVyX29mX3VzZXJzLCAiQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiAiCiAJCSAiY29uY3VycmVudCB1c2VycyBvZiBlQ3J5cHRmcyIpOwogCi11bnNpZ25lZCBpbnQgZWNyeXB0ZnNfdHJhbnNwb3J0ID0gRUNSWVBURlNfREVGQVVMVF9UUkFOU1BPUlQ7Ci0KIHZvaWQgX19lY3J5cHRmc19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwpAQCAtMjExLDcgKzIwNyw3IEBACiAgICAgICAgZWNyeXB0ZnNfb3B0X3Bhc3N0aHJvdWdoLCBlY3J5cHRmc19vcHRfeGF0dHJfbWV0YWRhdGEsCiAgICAgICAgZWNyeXB0ZnNfb3B0X2VuY3J5cHRlZF92aWV3LCBlY3J5cHRmc19vcHRfZXJyIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7ZWNyeXB0ZnNfb3B0X3NpZywgInNpZz0lcyJ9LAogCXtlY3J5cHRmc19vcHRfZWNyeXB0ZnNfc2lnLCAiZWNyeXB0ZnNfc2lnPSVzIn0sCiAJe2VjcnlwdGZzX29wdF9jaXBoZXIsICJjaXBoZXI9JXMifSwKQEAgLTc3OSwxMCArNzc1LDExIEBACiAJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOwogCQlnb3RvIG91dF9kb19zeXNmc191bnJlZ2lzdHJhdGlvbjsKIAl9Ci0JcmMgPSBlY3J5cHRmc19pbml0X21lc3NhZ2luZyhlY3J5cHRmc190cmFuc3BvcnQpOworCXJjID0gZWNyeXB0ZnNfaW5pdF9tZXNzYWdpbmcoKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsdXJlIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byAiCi0JCQkJImluaXRpYWxpemUgdGhlIGVDcnlwdGZzIG5ldGxpbmsgc29ja2V0XG4iKTsKKwkJCQkiaW5pdGlhbGl6ZSB0aGUgY29tbXVuaWNhdGlvbnMgY2hhbm5lbCB0byAiCisJCQkJImVjcnlwdGZzZFxuIik7CiAJCWdvdG8gb3V0X2Rlc3Ryb3lfa3RocmVhZDsKIAl9CiAJcmMgPSBlY3J5cHRmc19pbml0X2NyeXB0bygpOwpAQCAtNzk3LDcgKzc5NCw3IEBACiAKIAlnb3RvIG91dDsKIG91dF9yZWxlYXNlX21lc3NhZ2luZzoKLQllY3J5cHRmc19yZWxlYXNlX21lc3NhZ2luZyhlY3J5cHRmc190cmFuc3BvcnQpOworCWVjcnlwdGZzX3JlbGVhc2VfbWVzc2FnaW5nKCk7CiBvdXRfZGVzdHJveV9rdGhyZWFkOgogCWVjcnlwdGZzX2Rlc3Ryb3lfa3RocmVhZCgpOwogb3V0X2RvX3N5c2ZzX3VucmVnaXN0cmF0aW9uOgpAQCAtODE4LDcgKzgxNSw3IEBACiAJaWYgKHJjKQogCQlwcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgd2hpbHN0IGF0dGVtcHRpbmcgdG8gZGVzdHJveSBjcnlwdG87ICIKIAkJICAgICAgICJyYyA9IFslZF1cbiIsIHJjKTsKLQllY3J5cHRmc19yZWxlYXNlX21lc3NhZ2luZyhlY3J5cHRmc190cmFuc3BvcnQpOworCWVjcnlwdGZzX3JlbGVhc2VfbWVzc2FnaW5nKCk7CiAJZWNyeXB0ZnNfZGVzdHJveV9rdGhyZWFkKCk7CiAJZG9fc3lzZnNfdW5yZWdpc3RyYXRpb24oKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmVjcnlwdGZzX2ZzX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwppbmRleCAxYjVjMjAwLi5jNjk4Mzk3IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYworKysgYi9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYwpAQCAtMTM0LDEyICsxMzQsMTEgQEAKIH0KIAogc3RhdGljIGludAotZWNyeXB0ZnNfc2VuZF9tZXNzYWdlX2xvY2tlZCh1bnNpZ25lZCBpbnQgdHJhbnNwb3J0LCBjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sCi0JCQkgICAgIHU4IG1zZ190eXBlLCBzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqKm1zZ19jdHgpOworZWNyeXB0ZnNfc2VuZF9tZXNzYWdlX2xvY2tlZChjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sIHU4IG1zZ190eXBlLAorCQkJICAgICBzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqKm1zZ19jdHgpOwogCiAvKioKICAqIGVjcnlwdGZzX3NlbmRfcmF3X21lc3NhZ2UKLSAqIEB0cmFuc3BvcnQ6IFRyYW5zcG9ydCB0eXBlCiAgKiBAbXNnX3R5cGU6IE1lc3NhZ2UgdHlwZQogICogQGRhZW1vbjogRGFlbW9uIHN0cnVjdCBmb3IgcmVjaXBpZW50IG9mIG1lc3NhZ2UKICAqCkBAIC0xNTAsMzggKzE0OSwyNSBAQAogICoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBlY3J5cHRmc19zZW5kX3Jhd19tZXNzYWdlKHVuc2lnbmVkIGludCB0cmFuc3BvcnQsIHU4IG1zZ190eXBlLAorc3RhdGljIGludCBlY3J5cHRmc19zZW5kX3Jhd19tZXNzYWdlKHU4IG1zZ190eXBlLAogCQkJCSAgICAgc3RydWN0IGVjcnlwdGZzX2RhZW1vbiAqZGFlbW9uKQogewogCXN0cnVjdCBlY3J5cHRmc19tc2dfY3R4ICptc2dfY3R4OwogCWludCByYzsKIAotCXN3aXRjaCh0cmFuc3BvcnQpIHsKLQljYXNlIEVDUllQVEZTX1RSQU5TUE9SVF9ORVRMSU5LOgotCQlyYyA9IGVjcnlwdGZzX3NlbmRfbmV0bGluayhOVUxMLCAwLCBOVUxMLCBtc2dfdHlwZSwgMCwKLQkJCQkJICAgZGFlbW9uLT5waWQpOwotCQlicmVhazsKLQljYXNlIEVDUllQVEZTX1RSQU5TUE9SVF9NSVNDREVWOgotCQlyYyA9IGVjcnlwdGZzX3NlbmRfbWVzc2FnZV9sb2NrZWQodHJhbnNwb3J0LCBOVUxMLCAwLCBtc2dfdHlwZSwKLQkJCQkJCSAgJm1zZ19jdHgpOwotCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvIHNlbmQgIgotCQkJICAgICAgICJtZXNzYWdlIHZpYSBwcm9jZnM7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCS8qIFJhdyBtZXNzYWdlcyBhcmUgbG9naWNhbGx5IGNvbnRleHQtZnJlZSAoZS5nLiwgbm8KLQkJICogcmVwbHkgaXMgZXhwZWN0ZWQpLCBzbyB3ZSBzZXQgdGhlIHN0YXRlIG9mIHRoZQotCQkgKiBlY3J5cHRmc19tc2dfY3R4IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZAotCQkgKiBiZSBmcmVlZCBhcyBzb29uIGFzIHRoZSB0cmFuc3BvcnQgc2VuZHMgb3V0IHRoZSBtZXNzYWdlLiAqLwotCQltdXRleF9sb2NrKCZtc2dfY3R4LT5tdXgpOwotCQltc2dfY3R4LT5zdGF0ZSA9IEVDUllQVEZTX01TR19DVFhfU1RBVEVfTk9fUkVQTFk7Ci0JCW11dGV4X3VubG9jaygmbXNnX2N0eC0+bXV4KTsKLQkJYnJlYWs7Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfQ09OTkVDVE9SOgotCWNhc2UgRUNSWVBURlNfVFJBTlNQT1JUX1JFTEFZRlM6Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRU5PU1lTOworCXJjID0gZWNyeXB0ZnNfc2VuZF9tZXNzYWdlX2xvY2tlZChOVUxMLCAwLCBtc2dfdHlwZSwgJm1zZ19jdHgpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byBzZW5kICIKKwkJICAgICAgICJtZXNzYWdlIHRvIGVjcnlwdGZzZDsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dDsKIAl9CisJLyogUmF3IG1lc3NhZ2VzIGFyZSBsb2dpY2FsbHkgY29udGV4dC1mcmVlIChlLmcuLCBubworCSAqIHJlcGx5IGlzIGV4cGVjdGVkKSwgc28gd2Ugc2V0IHRoZSBzdGF0ZSBvZiB0aGUKKwkgKiBlY3J5cHRmc19tc2dfY3R4IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZAorCSAqIGJlIGZyZWVkIGFzIHNvb24gYXMgdGhlIG1lc3NhZ2UgaXMgc2VudC4gKi8KKwltdXRleF9sb2NrKCZtc2dfY3R4LT5tdXgpOworCW1zZ19jdHgtPnN0YXRlID0gRUNSWVBURlNfTVNHX0NUWF9TVEFURV9OT19SRVBMWTsKKwltdXRleF91bmxvY2soJm1zZ19jdHgtPm11eCk7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtMjI3LDcgKzIxMyw2IEBACiAKIC8qKgogICogZWNyeXB0ZnNfcHJvY2Vzc19oZWxvCi0gKiBAdHJhbnNwb3J0OiBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKG5ldGxpbmssIGV0Yy4pCiAgKiBAZXVpZDogVGhlIHVzZXIgSUQgb3duZXIgb2YgdGhlIG1lc3NhZ2UKICAqIEB1c2VyX25zOiBUaGUgbmFtZXNwYWNlIGluIHdoaWNoIEBldWlkIGFwcGxpZXMKICAqIEBwaWQ6IFRoZSBwcm9jZXNzIElEIGZvciB0aGUgdXNlcnNwYWNlIHByb2dyYW0gdGhhdCBzZW50IHRoZQpAQCAtMjM5LDggKzIyNCw4IEBACiAgKiBSZXR1cm5zIHplcm8gYWZ0ZXIgYWRkaW5nIGEgbmV3IGRhZW1vbiB0byB0aGUgaGFzaCBsaXN0OwogICogbm9uLXplcm8gb3RoZXJ3aXNlLgogICovCi1pbnQgZWNyeXB0ZnNfcHJvY2Vzc19oZWxvKHVuc2lnbmVkIGludCB0cmFuc3BvcnQsIHVpZF90IGV1aWQsCi0JCQkgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywgc3RydWN0IHBpZCAqcGlkKQoraW50IGVjcnlwdGZzX3Byb2Nlc3NfaGVsbyh1aWRfdCBldWlkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCisJCQkgIHN0cnVjdCBwaWQgKnBpZCkKIHsKIAlzdHJ1Y3QgZWNyeXB0ZnNfZGFlbW9uICpuZXdfZGFlbW9uOwogCXN0cnVjdCBlY3J5cHRmc19kYWVtb24gKm9sZF9kYWVtb247CkBAIC0yNTIsOCArMjM3LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVjZWl2ZWQgcmVxdWVzdCBmcm9tIHVzZXIgWyVkXSAiCiAJCSAgICAgICAidG8gcmVnaXN0ZXIgZGFlbW9uIFsweCVwXTsgdW5yZWdpc3RlcmluZyBkYWVtb24gIgogCQkgICAgICAgIlsweCVwXVxuIiwgZXVpZCwgcGlkLCBvbGRfZGFlbW9uLT5waWQpOwotCQlyYyA9IGVjcnlwdGZzX3NlbmRfcmF3X21lc3NhZ2UodHJhbnNwb3J0LCBFQ1JZUFRGU19NU0dfUVVJVCwKLQkJCQkJICAgICAgIG9sZF9kYWVtb24pOworCQlyYyA9IGVjcnlwdGZzX3NlbmRfcmF3X21lc3NhZ2UoRUNSWVBURlNfTVNHX1FVSVQsIG9sZF9kYWVtb24pOwogCQlpZiAocmMpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gc2VuZCBRVUlUICIKIAkJCSAgICAgICAibWVzc2FnZSB0byBkYWVtb24gWzB4JXBdOyByYyA9IFslZF1cbiIsCkBAIC00NjcsOCArNDUxLDYgQEAKIAogLyoqCiAgKiBlY3J5cHRmc19zZW5kX21lc3NhZ2VfbG9ja2VkCi0gKiBAdHJhbnNwb3J0OiBUaGUgdHJhbnNwb3J0IG92ZXIgd2hpY2ggdG8gc2VuZCB0aGUgbWVzc2FnZSAoaS5lLiwKLSAqICAgICAgICAgICAgIG5ldGxpbmspCiAgKiBAZGF0YTogVGhlIGRhdGEgdG8gc2VuZAogICogQGRhdGFfbGVuOiBUaGUgbGVuZ3RoIG9mIGRhdGEKICAqIEBtc2dfY3R4OiBUaGUgbWVzc2FnZSBjb250ZXh0IGFsbG9jYXRlZCBmb3IgdGhlIHNlbmQKQEAgLTQ3OCw4ICs0NjAsOCBAQAogICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG90aGVyd2lzZQogICovCiBzdGF0aWMgaW50Ci1lY3J5cHRmc19zZW5kX21lc3NhZ2VfbG9ja2VkKHVuc2lnbmVkIGludCB0cmFuc3BvcnQsIGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKLQkJCSAgICAgdTggbXNnX3R5cGUsIHN0cnVjdCBlY3J5cHRmc19tc2dfY3R4ICoqbXNnX2N0eCkKK2VjcnlwdGZzX3NlbmRfbWVzc2FnZV9sb2NrZWQoY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLCB1OCBtc2dfdHlwZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21zZ19jdHggKiptc2dfY3R4KQogewogCXN0cnVjdCBlY3J5cHRmc19kYWVtb24gKmRhZW1vbjsKIAlpbnQgcmM7CkBAIC01MDMsMjAgKzQ4NSw4IEBACiAJZWNyeXB0ZnNfbXNnX2N0eF9mcmVlX3RvX2FsbG9jKCptc2dfY3R4KTsKIAltdXRleF91bmxvY2soJigqbXNnX2N0eCktPm11eCk7CiAJbXV0ZXhfdW5sb2NrKCZlY3J5cHRmc19tc2dfY3R4X2xpc3RzX211eCk7Ci0Jc3dpdGNoICh0cmFuc3BvcnQpIHsKLQljYXNlIEVDUllQVEZTX1RSQU5TUE9SVF9ORVRMSU5LOgotCQlyYyA9IGVjcnlwdGZzX3NlbmRfbmV0bGluayhkYXRhLCBkYXRhX2xlbiwgKm1zZ19jdHgsIG1zZ190eXBlLAotCQkJCQkgICAwLCBkYWVtb24tPnBpZCk7Ci0JCWJyZWFrOwotCWNhc2UgRUNSWVBURlNfVFJBTlNQT1JUX01JU0NERVY6Ci0JCXJjID0gZWNyeXB0ZnNfc2VuZF9taXNjZGV2KGRhdGEsIGRhdGFfbGVuLCAqbXNnX2N0eCwgbXNnX3R5cGUsCi0JCQkJCSAgIDAsIGRhZW1vbik7Ci0JCWJyZWFrOwotCWNhc2UgRUNSWVBURlNfVFJBTlNQT1JUX0NPTk5FQ1RPUjoKLQljYXNlIEVDUllQVEZTX1RSQU5TUE9SVF9SRUxBWUZTOgotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT1NZUzsKLQl9CisJcmMgPSBlY3J5cHRmc19zZW5kX21pc2NkZXYoZGF0YSwgZGF0YV9sZW4sICptc2dfY3R4LCBtc2dfdHlwZSwgMCwKKwkJCQkgICBkYWVtb24pOwogCWlmIChyYykKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBzZW5kIG1lc3NhZ2UgdG8gIgogCQkgICAgICAgInVzZXJzcGFjZSBkYWVtb247IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKQEAgLTUyNiw4ICs0OTYsNiBAQAogCiAvKioKICAqIGVjcnlwdGZzX3NlbmRfbWVzc2FnZQotICogQHRyYW5zcG9ydDogVGhlIHRyYW5zcG9ydCBvdmVyIHdoaWNoIHRvIHNlbmQgdGhlIG1lc3NhZ2UgKGkuZS4sCi0gKiAgICAgICAgICAgICBuZXRsaW5rKQogICogQGRhdGE6IFRoZSBkYXRhIHRvIHNlbmQKICAqIEBkYXRhX2xlbjogVGhlIGxlbmd0aCBvZiBkYXRhCiAgKiBAbXNnX2N0eDogVGhlIG1lc3NhZ2UgY29udGV4dCBhbGxvY2F0ZWQgZm9yIHRoZSBzZW5kCkBAIC01MzYsMTQgKzUwNCwxNCBAQAogICoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKICAqLwotaW50IGVjcnlwdGZzX3NlbmRfbWVzc2FnZSh1bnNpZ25lZCBpbnQgdHJhbnNwb3J0LCBjaGFyICpkYXRhLCBpbnQgZGF0YV9sZW4sCitpbnQgZWNyeXB0ZnNfc2VuZF9tZXNzYWdlKGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKIAkJCSAgc3RydWN0IGVjcnlwdGZzX21zZ19jdHggKiptc2dfY3R4KQogewogCWludCByYzsKIAogCW11dGV4X2xvY2soJmVjcnlwdGZzX2RhZW1vbl9oYXNoX211eCk7Ci0JcmMgPSBlY3J5cHRmc19zZW5kX21lc3NhZ2VfbG9ja2VkKHRyYW5zcG9ydCwgZGF0YSwgZGF0YV9sZW4sCi0JCQkJCSAgRUNSWVBURlNfTVNHX1JFUVVFU1QsIG1zZ19jdHgpOworCXJjID0gZWNyeXB0ZnNfc2VuZF9tZXNzYWdlX2xvY2tlZChkYXRhLCBkYXRhX2xlbiwgRUNSWVBURlNfTVNHX1JFUVVFU1QsCisJCQkJCSAgbXNnX2N0eCk7CiAJbXV0ZXhfdW5sb2NrKCZlY3J5cHRmc19kYWVtb25faGFzaF9tdXgpOwogCXJldHVybiByYzsKIH0KQEAgLTU4Niw3ICs1NTQsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGVjcnlwdGZzX2luaXRfbWVzc2FnaW5nKHVuc2lnbmVkIGludCB0cmFuc3BvcnQpCitpbnQgZWNyeXB0ZnNfaW5pdF9tZXNzYWdpbmcodm9pZCkKIHsKIAlpbnQgaTsKIAlpbnQgcmMgPSAwOwpAQCAtNjM5LDI3ICs2MDcsMTQgQEAKIAkJbXV0ZXhfdW5sb2NrKCZlY3J5cHRmc19tc2dfY3R4X2FycltpXS5tdXgpOwogCX0KIAltdXRleF91bmxvY2soJmVjcnlwdGZzX21zZ19jdHhfbGlzdHNfbXV4KTsKLQlzd2l0Y2godHJhbnNwb3J0KSB7Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfTkVUTElOSzoKLQkJcmMgPSBlY3J5cHRmc19pbml0X25ldGxpbmsoKTsKLQkJaWYgKHJjKQotCQkJZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcodHJhbnNwb3J0KTsKLQkJYnJlYWs7Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfTUlTQ0RFVjoKLQkJcmMgPSBlY3J5cHRmc19pbml0X2VjcnlwdGZzX21pc2NkZXYoKTsKLQkJaWYgKHJjKQotCQkJZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcodHJhbnNwb3J0KTsKLQkJYnJlYWs7Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfQ09OTkVDVE9SOgotCWNhc2UgRUNSWVBURlNfVFJBTlNQT1JUX1JFTEFZRlM6Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRU5PU1lTOwotCX0KKwlyYyA9IGVjcnlwdGZzX2luaXRfZWNyeXB0ZnNfbWlzY2RldigpOworCWlmIChyYykKKwkJZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcoKTsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQgZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcodW5zaWduZWQgaW50IHRyYW5zcG9ydCkKK3ZvaWQgZWNyeXB0ZnNfcmVsZWFzZV9tZXNzYWdpbmcodm9pZCkKIHsKIAlpZiAoZWNyeXB0ZnNfbXNnX2N0eF9hcnIpIHsKIAkJaW50IGk7CkBAIC02OTgsMTcgKzY1Myw2IEBACiAJCWtmcmVlKGVjcnlwdGZzX2RhZW1vbl9oYXNoKTsKIAkJbXV0ZXhfdW5sb2NrKCZlY3J5cHRmc19kYWVtb25faGFzaF9tdXgpOwogCX0KLQlzd2l0Y2godHJhbnNwb3J0KSB7Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfTkVUTElOSzoKLQkJZWNyeXB0ZnNfcmVsZWFzZV9uZXRsaW5rKCk7Ci0JCWJyZWFrOwotCWNhc2UgRUNSWVBURlNfVFJBTlNQT1JUX01JU0NERVY6Ci0JCWVjcnlwdGZzX2Rlc3Ryb3lfZWNyeXB0ZnNfbWlzY2RldigpOwotCQlicmVhazsKLQljYXNlIEVDUllQVEZTX1RSQU5TUE9SVF9DT05ORUNUT1I6Ci0JY2FzZSBFQ1JZUFRGU19UUkFOU1BPUlRfUkVMQVlGUzoKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisJZWNyeXB0ZnNfZGVzdHJveV9lY3J5cHRmc19taXNjZGV2KCk7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbW1hcC5jIGIvZnMvZWNyeXB0ZnMvbW1hcC5jCmluZGV4IDI0NWMyZGMuLjA0ZDdiM2YgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21tYXAuYworKysgYi9mcy9lY3J5cHRmcy9tbWFwLmMKQEAgLTI2NSwyMiArMjY1LDM0IEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfcHJlcGFyZV93cml0ZQorICogZWNyeXB0ZnNfd3JpdGVfYmVnaW4KICAqIEBmaWxlOiBUaGUgZUNyeXB0ZnMgZmlsZQotICogQHBhZ2U6IFRoZSBlQ3J5cHRmcyBwYWdlCi0gKiBAZnJvbTogVGhlIHN0YXJ0IGJ5dGUgZnJvbSB3aGljaCB3ZSB3aWxsIHdyaXRlCi0gKiBAdG86IFRoZSBlbmQgYnl0ZSB0byB3aGljaCB3ZSB3aWxsIHdyaXRlCisgKiBAbWFwcGluZzogVGhlIGVDcnlwdGZzIG9iamVjdAorICogQHBvczogVGhlIGZpbGUgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmcKKyAqIEBsZW46IExlbmd0aCBvZiB0aGUgd3JpdGUKKyAqIEBmbGFnczogVmFyaW91cyBmbGFncworICogQHBhZ2VwOiBQb2ludGVyIHRvIHJldHVybiB0aGUgcGFnZQorICogQGZzZGF0YTogUG9pbnRlciB0byByZXR1cm4gZnMgZGF0YSAodW51c2VkKQogICoKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCB6ZXJvIGFueSBob2xlIHdlIGNyZWF0ZQogICoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBlY3J5cHRmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQorc3RhdGljIGludCBlY3J5cHRmc193cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpCiB7CisJcGdvZmZfdCBpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBwYWdlICpwYWdlOwogCWxvZmZfdCBwcmV2X3BhZ2VfZW5kX3NpemU7CiAJaW50IHJjID0gMDsKIAorCXBhZ2UgPSBfX2dyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqcGFnZXAgPSBwYWdlOworCiAJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPQogCQkJJmVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoCkBAIC0yODksOCArMzAxLDcgQEAKIAkJaWYgKCEoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBURUQpCiAJCSAgICB8fCAoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19ORVdfRklMRSkpIHsKIAkJCXJjID0gZWNyeXB0ZnNfcmVhZF9sb3dlcl9wYWdlX3NlZ21lbnQoCi0JCQkJcGFnZSwgcGFnZS0+aW5kZXgsIDAsIFBBR0VfQ0FDSEVfU0laRSwKLQkJCQlwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKwkJCQlwYWdlLCBpbmRleCwgMCwgUEFHRV9DQUNIRV9TSVpFLCBtYXBwaW5nLT5ob3N0KTsKIAkJCWlmIChyYykgewogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcGluZyB0byByZWFkICIKIAkJCQkgICAgICAgImxvd2VyIHBhZ2Ugc2VnbWVudDsgcmMgPSBbJWRdXG4iLApAQCAtMzE2LDggKzMyNyw4IEBACiAJCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQlyYyA9IGVjcnlwdGZzX3JlYWRfbG93ZXJfcGFnZV9zZWdtZW50KAotCQkJCQlwYWdlLCBwYWdlLT5pbmRleCwgMCwgUEFHRV9DQUNIRV9TSVpFLAotCQkJCQlwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKwkJCQkJcGFnZSwgaW5kZXgsIDAsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJbWFwcGluZy0+aG9zdCk7CiAJCQkJaWYgKHJjKSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHJlYWRpbmcgIgogCQkJCQkgICAgICAgInBhZ2U7IHJjID0gWyVkXVxuIiwKQEAgLTMzOSwxMCArMzUwLDEwIEBACiAJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJCX0KIAl9Ci0JcHJldl9wYWdlX2VuZF9zaXplID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCk7CisJcHJldl9wYWdlX2VuZF9zaXplID0gKChsb2ZmX3QpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCk7CiAJLyogSWYgY3JlYXRpbmcgYSBwYWdlIG9yIG1vcmUgb2YgaG9sZXMsIHplcm8gdGhlbSBvdXQgdmlhIHRydW5jYXRlLgogCSAqIE5vdGUsIHRoaXMgd2lsbCBpbmNyZWFzZSBpX3NpemUuICovCi0JaWYgKHBhZ2UtPmluZGV4ICE9IDApIHsKKwlpZiAoaW5kZXggIT0gMCkgewogCQlpZiAocHJldl9wYWdlX2VuZF9zaXplID4gaV9zaXplX3JlYWQocGFnZS0+bWFwcGluZy0+aG9zdCkpIHsKIAkJCXJjID0gZWNyeXB0ZnNfdHJ1bmNhdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeSwKIAkJCQkJICAgICAgIHByZXZfcGFnZV9lbmRfc2l6ZSk7CkBAIC0zNTcsOCArMzY4LDggQEAKIAl9CiAJLyogV3JpdGluZyB0byBhIG5ldyBwYWdlLCBhbmQgY3JlYXRpbmcgYSBzbWFsbCBob2xlIGZyb20gc3RhcnQKIAkgKiBvZiBwYWdlPyAgWmVybyBpdCBvdXQuICovCi0JaWYgKChpX3NpemVfcmVhZChwYWdlLT5tYXBwaW5nLT5ob3N0KSA9PSBwcmV2X3BhZ2VfZW5kX3NpemUpCi0JICAgICYmIChmcm9tICE9IDApKQorCWlmICgoaV9zaXplX3JlYWQobWFwcGluZy0+aG9zdCkgPT0gcHJldl9wYWdlX2VuZF9zaXplKQorCSAgICAmJiAocG9zICE9IDApKQogCQl6ZXJvX3VzZXIocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKIG91dDoKIAlyZXR1cm4gcmM7CkBAIC00NDUsMjEgKzQ1NiwyOCBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX2NvbW1pdF93cml0ZQorICogZWNyeXB0ZnNfd3JpdGVfZW5kCiAgKiBAZmlsZTogVGhlIGVDcnlwdGZzIGZpbGUgb2JqZWN0CisgKiBAbWFwcGluZzogVGhlIGVDcnlwdGZzIG9iamVjdAorICogQHBvczogVGhlIGZpbGUgcG9zaXRpb24KKyAqIEBsZW46IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKHVudXNlZCkKKyAqIEBjb3BpZWQ6IFRoZSBhbW91bnQgb2YgZGF0YSBjb3BpZWQKICAqIEBwYWdlOiBUaGUgZUNyeXB0ZnMgcGFnZQotICogQGZyb206IElnbm9yZWQgKHdlIHJvdGF0ZSB0aGUgcGFnZSBJViBvbiBlYWNoIHdyaXRlKQotICogQHRvOiBJZ25vcmVkCisgKiBAZnNkYXRhOiBUaGUgZnNkYXRhICh1bnVzZWQpCiAgKgogICogVGhpcyBpcyB3aGVyZSB3ZSBlbmNyeXB0IHRoZSBkYXRhIGFuZCBwYXNzIHRoZSBlbmNyeXB0ZWQgZGF0YSB0bwogICogdGhlIGxvd2VyIGZpbGVzeXN0ZW0uICBJbiBPcGVuUEdQLWNvbXBhdGlibGUgbW9kZSwgd2Ugb3BlcmF0ZSBvbgogICogZW50aXJlIHVuZGVybHlpbmcgcGFja2V0cy4KICAqLwotc3RhdGljIGludCBlY3J5cHRmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3N0YXRpYyBpbnQgZWNyeXB0ZnNfd3JpdGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpCiB7Ci0JbG9mZl90IHBvczsKLQlzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2lub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlwZ29mZl90IGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCB0byA9IGZyb20gKyBjb3BpZWQ7CisJc3RydWN0IGlub2RlICplY3J5cHRmc19pbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPQogCQkmZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+Y3J5cHRfc3RhdDsKIAlpbnQgcmM7CkBAIC00NzEsMjUgKzQ4OSwyMiBAQAogCX0gZWxzZQogCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIk5vdCBhIG5ldyBmaWxlXG4iKTsKIAllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIkNhbGxpbmcgZmlsbF96ZXJvc190b19lbmRfb2ZfcGFnZSIKLQkJCSIocGFnZSB3LyBpbmRleCA9IFsweCUuMTZ4XSwgdG8gPSBbJWRdKVxuIiwgcGFnZS0+aW5kZXgsCi0JCQl0byk7CisJCQkiKHBhZ2Ugdy8gaW5kZXggPSBbMHglLjE2eF0sIHRvID0gWyVkXSlcbiIsIGluZGV4LCB0byk7CiAJLyogRmlsbHMgaW4gemVyb3MgaWYgJ3RvJyBnb2VzIGJleW9uZCBpbm9kZSBzaXplICovCiAJcmMgPSBmaWxsX3plcm9zX3RvX2VuZF9vZl9wYWdlKHBhZ2UsIHRvKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yIGF0dGVtcHRpbmcgdG8gZmlsbCAiCi0JCQkJInplcm9zIGluIHBhZ2Ugd2l0aCBpbmRleCA9IFsweCUuMTZ4XVxuIiwKLQkJCQlwYWdlLT5pbmRleCk7CisJCQkiemVyb3MgaW4gcGFnZSB3aXRoIGluZGV4ID0gWzB4JS4xNnhdXG4iLCBpbmRleCk7CiAJCWdvdG8gb3V0OwogCX0KIAlyYyA9IGVjcnlwdGZzX2VuY3J5cHRfcGFnZShwYWdlKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yIGVuY3J5cHRpbmcgcGFnZSAodXBwZXIgIgotCQkJCSJpbmRleCBbMHglLjE2eF0pXG4iLCBwYWdlLT5pbmRleCk7CisJCQkJImluZGV4IFsweCUuMTZ4XSlcbiIsIGluZGV4KTsKIAkJZ290byBvdXQ7CiAJfQotCXBvcyA9ICgoKGxvZmZfdClwYWdlLT5pbmRleCkgPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKLQlpZiAocG9zID4gaV9zaXplX3JlYWQoZWNyeXB0ZnNfaW5vZGUpKSB7Ci0JCWlfc2l6ZV93cml0ZShlY3J5cHRmc19pbm9kZSwgcG9zKTsKKwlpZiAocG9zICsgY29waWVkID4gaV9zaXplX3JlYWQoZWNyeXB0ZnNfaW5vZGUpKSB7CisJCWlfc2l6ZV93cml0ZShlY3J5cHRmc19pbm9kZSwgcG9zICsgY29waWVkKTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJFeHBhbmRlZCBmaWxlIHNpemUgdG8gIgogCQkJCSJbMHglLjE2eF1cbiIsIGlfc2l6ZV9yZWFkKGVjcnlwdGZzX2lub2RlKSk7CiAJfQpAQCAtNDk3LDcgKzUxMiwxMSBAQAogCWlmIChyYykKIAkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciB3cml0aW5nIGlub2RlIHNpemUgdG8gbWV0YWRhdGE7ICIKIAkJICAgICAgICJyYyA9IFslZF1cbiIsIHJjKTsKKwllbHNlCisJCXJjID0gY29waWVkOwogb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUxOCw3ICs1MzcsNyBAQAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlY3J5cHRmc19hb3BzID0gewogCS53cml0ZXBhZ2UgPSBlY3J5cHRmc193cml0ZXBhZ2UsCiAJLnJlYWRwYWdlID0gZWNyeXB0ZnNfcmVhZHBhZ2UsCi0JLnByZXBhcmVfd3JpdGUgPSBlY3J5cHRmc19wcmVwYXJlX3dyaXRlLAotCS5jb21taXRfd3JpdGUgPSBlY3J5cHRmc19jb21taXRfd3JpdGUsCisJLndyaXRlX2JlZ2luID0gZWNyeXB0ZnNfd3JpdGVfYmVnaW4sCisJLndyaXRlX2VuZCA9IGVjcnlwdGZzX3dyaXRlX2VuZCwKIAkuYm1hcCA9IGVjcnlwdGZzX2JtYXAsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbmV0bGluay5jIGIvZnMvZWNyeXB0ZnMvbmV0bGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFiYWQ2Li4wMDAwMDAwCi0tLSBhL2ZzL2VjcnlwdGZzL25ldGxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioKLSAqIGVDcnlwdGZzOiBMaW51eCBmaWxlc3lzdGVtIGVuY3J5cHRpb24gbGF5ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuCi0gKiAgIEF1dGhvcihzKTogTWljaGFlbCBBLiBIYWxjcm93IDxtaGFsY3Jvd0B1cy5pYm0uY29tPgotICoJCVR5bGVyIEhpY2tzIDx0eWhpY2tzQG91LmVkdT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAqIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bmV0L3NvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9oYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSAiZWNyeXB0ZnNfa2VybmVsLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgc29jayAqZWNyeXB0ZnNfbmxfc29jazsKLQotLyoqCi0gKiBlY3J5cHRmc19zZW5kX25ldGxpbmsKLSAqIEBkYXRhOiBUaGUgZGF0YSB0byBpbmNsdWRlIGFzIHRoZSBwYXlsb2FkCi0gKiBAZGF0YV9sZW46IFRoZSBieXRlIGNvdW50IG9mIHRoZSBkYXRhCi0gKiBAbXNnX2N0eDogVGhlIG5ldGxpbmsgY29udGV4dCB0aGF0IHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgdGhlCi0gKiAgICAgICAgICByZXNwb25zZSBtZXNzYWdlCi0gKiBAbXNnX3R5cGU6IFRoZSB0eXBlIG9mIG5ldGxpbmsgbWVzc2FnZSB0byBzZW5kCi0gKiBAbXNnX2ZsYWdzOiBUaGUgZmxhZ3MgdG8gaW5jbHVkZSBpbiB0aGUgbmV0bGluayBoZWFkZXIKLSAqIEBkYWVtb25fcGlkOiBUaGUgcHJvY2VzcyBpZCBvZiB0aGUgZGFlbW9uIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8KLSAqCi0gKiBTZW5kcyB0aGUgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGRhZW1vbiBwaWQgYW5kIHVzZXMgdGhlIG5ldGxpbmsKLSAqIGNvbnRleHQgZWxlbWVudCB0byBzdG9yZSB0aGUgZGF0YSBuZWVkZWQgZm9yIHZhbGlkYXRpb24gdXBvbgotICogcmVjZWl2aW5nIHRoZSByZXNwb25zZS4gIFRoZSBkYXRhIGFuZCB0aGUgbmV0bGluayBjb250ZXh0IGNhbiBiZQotICogbnVsbCBpZiBqdXN0IHNlbmRpbmcgYSBuZXRsaW5rIGhlYWRlciBpcyBzdWZmaWNpZW50LiAgUmV0dXJucyB6ZXJvCi0gKiB1cG9uIHNlbmRpbmcgdGhlIG1lc3NhZ2U7IG5vbi16ZXJvIHVwb24gZXJyb3IuCi0gKi8KLWludCBlY3J5cHRmc19zZW5kX25ldGxpbmsoY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLAotCQkJICBzdHJ1Y3QgZWNyeXB0ZnNfbXNnX2N0eCAqbXNnX2N0eCwgdTggbXNnX3R5cGUsCi0JCQkgIHUxNiBtc2dfZmxhZ3MsIHN0cnVjdCBwaWQgKmRhZW1vbl9waWQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSAqbXNnOwotCXNpemVfdCBwYXlsb2FkX2xlbjsKLQlpbnQgcmM7Ci0KLQlwYXlsb2FkX2xlbiA9ICgoZGF0YSAmJiBkYXRhX2xlbikgPyAoc2l6ZW9mKCptc2cpICsgZGF0YV9sZW4pIDogMCk7Ci0Jc2tiID0gYWxsb2Nfc2tiKE5MTVNHX1NQQUNFKHBheWxvYWRfbGVuKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJGYWlsZWQgdG8gYWxsb2NhdGUgc29ja2V0IGJ1ZmZlclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlubGggPSBOTE1TR19QVVQoc2tiLCBwaWRfbnIoZGFlbW9uX3BpZCksIG1zZ19jdHggPyBtc2dfY3R4LT5jb3VudGVyIDogMCwKLQkJCW1zZ190eXBlLCBwYXlsb2FkX2xlbik7Ci0JbmxoLT5ubG1zZ19mbGFncyA9IG1zZ19mbGFnczsKLQlpZiAobXNnX2N0eCAmJiBwYXlsb2FkX2xlbikgewotCQltc2cgPSAoc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UgKilOTE1TR19EQVRBKG5saCk7Ci0JCW1zZy0+aW5kZXggPSBtc2dfY3R4LT5pbmRleDsKLQkJbXNnLT5kYXRhX2xlbiA9IGRhdGFfbGVuOwotCQltZW1jcHkobXNnLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0JfQotCXJjID0gbmV0bGlua191bmljYXN0KGVjcnlwdGZzX25sX3NvY2ssIHNrYiwgcGlkX25yKGRhZW1vbl9waWQpLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBzZW5kIGVDcnlwdGZzIG5ldGxpbmsgIgotCQkJCSJtZXNzYWdlOyByYyA9IFslZF1cbiIsIHJjKTsKLQkJZ290byBvdXQ7Ci0JfQotCXJjID0gMDsKLQlnb3RvIG91dDsKLW5sbXNnX2ZhaWx1cmU6Ci0JcmMgPSAtRU1TR1NJWkU7Ci0Ja2ZyZWVfc2tiKHNrYik7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGVjcnlwdGZzX3Byb2Nlc3NfbmxfcmVwb25zZQotICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgY29udGFpbmluZyB0aGUgbmV0bGluayBtZXNzYWdlIG9mIHN0YXRlCi0gKiAgICAgICBSRVNQT05TRQotICoKLSAqIFByb2Nlc3NlcyBhIHJlc3BvbnNlIG1lc3NhZ2UgYWZ0ZXIgc2VuZGluZyBhIG9wZXJhdGlvbiByZXF1ZXN0IHRvCi0gKiB1c2Vyc3BhY2UuICBBdHRlbXB0cyB0byBhc3NpZ24gdGhlIG1zZyB0byBhIG5ldGxpbmsgY29udGV4dCBlbGVtZW50Ci0gKiBhdCB0aGUgaW5kZXggc3BlY2lmaWVkIGluIHRoZSBtc2cuICBUaGUgc2tfYnVmZiBhbmQgbmxtc2doZHIgbXVzdAotICogYmUgdmFsaWRhdGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLiBSZXR1cm5zIHplcm8gdXBvbiBkZWxpdmVyeSB0bwotICogZGVzaXJlZCBjb250ZXh0IGVsZW1lbnQ7IG5vbi16ZXJvIHVwb24gZGVsaXZlcnkgZmFpbHVyZSBvciBlcnJvci4KLSAqLwotc3RhdGljIGludCBlY3J5cHRmc19wcm9jZXNzX25sX3Jlc3BvbnNlKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGggPSBubG1zZ19oZHIoc2tiKTsKLQlzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSAqbXNnID0gTkxNU0dfREFUQShubGgpOwotCXN0cnVjdCBwaWQgKnBpZDsKLQlpbnQgcmM7Ci0KLQlpZiAoc2tiLT5sZW4gLSBOTE1TR19IRFJMRU4gLSBzaXplb2YoKm1zZykgIT0gbXNnLT5kYXRhX2xlbikgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIlJlY2VpdmVkIG5ldGxpbmsgbWVzc2FnZSB3aXRoICIKLQkJCQkiaW5jb3JyZWN0bHkgc3BlY2lmaWVkIGRhdGEgbGVuZ3RoXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCXBpZCA9IGZpbmRfZ2V0X3BpZChORVRMSU5LX0NSRURTKHNrYiktPnBpZCk7Ci0JcmMgPSBlY3J5cHRmc19wcm9jZXNzX3Jlc3BvbnNlKG1zZywgTkVUTElOS19DUkVEUyhza2IpLT51aWQsIE5VTEwsCi0JCQkJICAgICAgIHBpZCwgbmxoLT5ubG1zZ19zZXEpOwotCXB1dF9waWQocGlkKTsKLQlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIkVycm9yIHByb2Nlc3NpbmcgcmVzcG9uc2UgbWVzc2FnZTsgcmMgPSBbJWRdXG4iLCByYyk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGVjcnlwdGZzX3Byb2Nlc3NfbmxfaGVsbwotICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgY29udGFpbmluZyB0aGUgbmxtc2doZHIgaW4gSEVMTyBzdGF0ZQotICoKLSAqIEdldHMgdWlkIGFuZCBwaWQgb2YgdGhlIHNrYiBhbmQgYWRkcyB0aGUgdmFsdWVzIHRvIHRoZSBkYWVtb24gaWQKLSAqIGhhc2guIFJldHVybnMgemVybyBhZnRlciBhZGRpbmcgYSBuZXcgZGFlbW9uIGlkIHRvIHRoZSBoYXNoIGxpc3Q7Ci0gKiBub24temVybyBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgZWNyeXB0ZnNfcHJvY2Vzc19ubF9oZWxvKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHBpZCAqcGlkOwotCWludCByYzsKLQotCXBpZCA9IGZpbmRfZ2V0X3BpZChORVRMSU5LX0NSRURTKHNrYiktPnBpZCk7Ci0JcmMgPSBlY3J5cHRmc19wcm9jZXNzX2hlbG8oRUNSWVBURlNfVFJBTlNQT1JUX05FVExJTkssCi0JCQkJICAgTkVUTElOS19DUkVEUyhza2IpLT51aWQsIE5VTEwsIHBpZCk7Ci0JcHV0X3BpZChwaWQpOwotCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3IgcHJvY2Vzc2luZyBIRUxPOyByYyA9IFslZF1cbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKgotICogZWNyeXB0ZnNfcHJvY2Vzc19ubF9xdWl0Ci0gKiBAc2tiOiBUaGUgc29ja2V0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBubG1zZ2hkciBpbiBRVUlUIHN0YXRlCi0gKgotICogR2V0cyB1aWQgYW5kIHBpZCBvZiB0aGUgc2tiIGFuZCBkZWxldGVzIHRoZSBjb3JyZXNwb25kaW5nIGRhZW1vbgotICogaWQsIGlmIGl0IGlzIHRoZSByZWdpc3RlcmVkIHRoYXQgaXMgcmVxdWVzdGluZyB0aGUKLSAqIGRlbGV0aW9uLiBSZXR1cm5zIHplcm8gYWZ0ZXIgZGVsZXRpbmcgdGhlIGRlc2lyZWQgZGFlbW9uIGlkOwotICogbm9uLXplcm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW50IGVjcnlwdGZzX3Byb2Nlc3NfbmxfcXVpdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBwaWQgKnBpZDsKLQlpbnQgcmM7Ci0KLQlwaWQgPSBmaW5kX2dldF9waWQoTkVUTElOS19DUkVEUyhza2IpLT5waWQpOwotCXJjID0gZWNyeXB0ZnNfcHJvY2Vzc19xdWl0KE5FVExJTktfQ1JFRFMoc2tiKS0+dWlkLCBOVUxMLCBwaWQpOwotCXB1dF9waWQocGlkKTsKLQlpZiAocmMpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJFcnJvciBwcm9jZXNzaW5nIFFVSVQgbWVzc2FnZTsgcmMgPSBbJWRdXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGVjcnlwdGZzX3JlY2VpdmVfbmxfbWVzc2FnZQotICoKLSAqIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBieSBuZXRsaW5rIHN5c3RlbSB3aGVuIGEgbWVzc2FnZSBhcnJpdmVzLgotICogSWYgdGhlIG1lc3NhZ2UgbG9va3MgdG8gYmUgdmFsaWQsIHRoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2lnbgotICogaXQgdG8gaXRzIGRlc2lyZWQgbmV0bGluayBjb250ZXh0IGVsZW1lbnQgYW5kIHdha2UgdXAgdGhlIHByb2Nlc3MKLSAqIHRoYXQgaXMgd2FpdGluZyBmb3IgYSByZXNwb25zZS4KLSAqLwotc3RhdGljIHZvaWQgZWNyeXB0ZnNfcmVjZWl2ZV9ubF9tZXNzYWdlKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0KLQlubGggPSBubG1zZ19oZHIoc2tiKTsKLQlpZiAoIU5MTVNHX09LKG5saCwgc2tiLT5sZW4pKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIlJlY2VpdmVkIGNvcnJ1cHQgbmV0bGluayAiCi0JCQkJIm1lc3NhZ2VcbiIpOwotCQlnb3RvIGZyZWU7Ci0JfQotCXN3aXRjaCAobmxoLT5ubG1zZ190eXBlKSB7Ci0JCWNhc2UgRUNSWVBURlNfTVNHX1JFU1BPTlNFOgotCQkJaWYgKGVjcnlwdGZzX3Byb2Nlc3NfbmxfcmVzcG9uc2Uoc2tiKSkgewotCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJGYWlsZWQgdG8gIgotCQkJCQkJImRlbGl2ZXIgbmV0bGluayByZXNwb25zZSB0byAiCi0JCQkJCQkicmVxdWVzdGluZyBvcGVyYXRpb25cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRUNSWVBURlNfTVNHX0hFTE86Ci0JCQlpZiAoZWNyeXB0ZnNfcHJvY2Vzc19ubF9oZWxvKHNrYikpIHsKLQkJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRmFpbGVkIHRvICIKLQkJCQkJCSJmdWxmaWxsIEhFTE8gcmVxdWVzdFxuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFQ1JZUFRGU19NU0dfUVVJVDoKLQkJCWlmIChlY3J5cHRmc19wcm9jZXNzX25sX3F1aXQoc2tiKSkgewotCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJGYWlsZWQgdG8gIgotCQkJCQkJImZ1bGZpbGwgUVVJVCByZXF1ZXN0XG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkRyb3BwaW5nIG5ldGxpbmsgIgotCQkJCQkibWVzc2FnZSBvZiB1bnJlY29nbml6ZWQgdHlwZSBbJWRdXG4iLAotCQkJCQlubGgtPm5sbXNnX3R5cGUpOwotCQkJYnJlYWs7Ci0JfQotZnJlZToKLQlrZnJlZV9za2Ioc2tiKTsKLX0KLQotLyoqCi0gKiBlY3J5cHRmc19pbml0X25ldGxpbmsKLSAqCi0gKiBJbml0aWFsaXplcyB0aGUgZGFlbW9uIGlkIGhhc2ggbGlzdCwgbmV0bGluayBjb250ZXh0IGFycmF5LCBhbmQKLSAqIG5lY2Vzc2FyeSBsb2Nrcy4gIFJldHVybnMgemVybyB1cG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIHVwb24gZXJyb3IuCi0gKi8KLWludCBlY3J5cHRmc19pbml0X25ldGxpbmsodm9pZCkKLXsKLQlpbnQgcmM7Ci0KLQllY3J5cHRmc19ubF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgTkVUTElOS19FQ1JZUFRGUywgMCwKLQkJCQkJCSBlY3J5cHRmc19yZWNlaXZlX25sX21lc3NhZ2UsCi0JCQkJCQkgTlVMTCwgVEhJU19NT0RVTEUpOwotCWlmICghZWNyeXB0ZnNfbmxfc29jaykgewotCQlyYyA9IC1FSU87Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBjcmVhdGUgbmV0bGluayBzb2NrZXRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JZWNyeXB0ZnNfbmxfc29jay0+c2tfc25kdGltZW8gPSBFQ1JZUFRGU19ERUZBVUxUX1NFTkRfVElNRU9VVDsKLQlyYyA9IDA7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGVjcnlwdGZzX3JlbGVhc2VfbmV0bGluawotICoKLSAqIEZyZWVzIGFsbCBtZW1vcnkgdXNlZCBieSB0aGUgbmV0bGluayBjb250ZXh0IGFycmF5IGFuZCByZWxlYXNlcyB0aGUKLSAqIG5ldGxpbmsgc29ja2V0LgotICovCi12b2lkIGVjcnlwdGZzX3JlbGVhc2VfbmV0bGluayh2b2lkKQotewotCW5ldGxpbmtfa2VybmVsX3JlbGVhc2UoZWNyeXB0ZnNfbmxfc29jayk7Ci0JZWNyeXB0ZnNfbmxfc29jayA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9mcy9lZnMvc3VwZXIuYyBiL2ZzL2Vmcy9zdXBlci5jCmluZGV4IDU2N2IxMzQuLjczYjE5Y2YgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9zdXBlci5jCisrKyBiL2ZzL2Vmcy9zdXBlci5jCkBAIC0zNDEsOCArMzQxLDYgQEAKIAkJCXNiLT5pbm9kZV9ibG9ja3MgKgogCQkJKEVGU19CTE9DS1NJWkUgLyBzaXplb2Yoc3RydWN0IGVmc19kaW5vZGUpKTsKIAlidWYtPmZfZmZyZWUgICA9IHNiLT5pbm9kZV9mcmVlOwkvKiBmcmVlIGlub2RlcyAqLwotCWJ1Zi0+Zl9mc2lkLnZhbFswXSA9IChzYi0+ZnNfbWFnaWMgPj4gMTYpICYgMHhmZmZmOyAvKiBmcyBJRCAqLwotCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9ICBzYi0+ZnNfbWFnaWMgICAgICAgICYgMHhmZmZmOyAvKiBmcyBJRCAqLwogCWJ1Zi0+Zl9uYW1lbGVuID0gRUZTX01BWE5BTUVMRU47CS8qIG1heCBmaWxlbmFtZSBsZW5ndGggKi8KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCA3Y2MwZWI3Li45OTM2OGJkIDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtOTI3LDE0ICs5MjcsMTEgQEAKIAkvKgogCSAqIER1cmluZyB0aGUgdGltZSB3ZSBzcGVudCBpbiB0aGUgbG9vcCBhYm92ZSwgc29tZSBvdGhlciBldmVudHMKIAkgKiBtaWdodCBoYXZlIGJlZW4gcXVldWVkIGJ5IHRoZSBwb2xsIGNhbGxiYWNrLiBXZSByZS1pbnNlcnQgdGhlbQotCSAqIGhlcmUgKGluIGNhc2UgdGhleSBhcmUgbm90IGFscmVhZHkgcXVldWVkLCBvciB0aGV5J3JlIG9uZS1zaG90KS4KKwkgKiBpbnNpZGUgdGhlIG1haW4gcmVhZHktbGlzdCBoZXJlLgogCSAqLwogCWZvciAobmVwaSA9IGVwLT5vdmZsaXN0OyAoZXBpID0gbmVwaSkgIT0gTlVMTDsKLQkgICAgIG5lcGkgPSBlcGktPm5leHQsIGVwaS0+bmV4dCA9IEVQX1VOQUNUSVZFX1BUUikgewotCQlpZiAoIWVwX2lzX2xpbmtlZCgmZXBpLT5yZGxsaW5rKSAmJgotCQkgICAgKGVwaS0+ZXZlbnQuZXZlbnRzICYgfkVQX1BSSVZBVEVfQklUUykpCi0JCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7Ci0JfQorCSAgICAgbmVwaSA9IGVwaS0+bmV4dCwgZXBpLT5uZXh0ID0gRVBfVU5BQ1RJVkVfUFRSKQorCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7CiAJLyoKIAkgKiBXZSBuZWVkIHRvIHNldCBiYWNrIGVwLT5vdmZsaXN0IHRvIEVQX1VOQUNUSVZFX1BUUiwgc28gdGhhdCBhZnRlcgogCSAqIHJlbGVhc2luZyB0aGUgbG9jaywgZXZlbnRzIHdpbGwgYmUgcXVldWVkIGluIHRoZSBub3JtYWwgd2F5IGluc2lkZQpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDMyOTkzYmUuLmE0MWU3OTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTUwLDE1ICs1MCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NuX3Byb2MuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogCi0jaWZkZWYgQ09ORklHX0tNT0QKLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKLQogI2lmZGVmIF9fYWxwaGFfXwogLyogZm9yIC9zYmluL2xvYWRlciBoYW5kbGluZyBpbiBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CkBAIC0zOTEsNyArMzg4LDcgQEAKIAkJCWlmICghcCkKIAkJCQlicmVhazsKIAkJCWFyZ3YrKzsKLQkJCWlmKCsraSA+IG1heCkKKwkJCWlmIChpKysgPj0gbWF4KQogCQkJCXJldHVybiAtRTJCSUc7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJfQpAQCAtNzUyLDExICs3NDksMTEgQEAKIAl0c2stPmFjdGl2ZV9tbSA9IG1tOwogCWFjdGl2YXRlX21tKGFjdGl2ZV9tbSwgbW0pOwogCXRhc2tfdW5sb2NrKHRzayk7Ci0JbW1fdXBkYXRlX25leHRfb3duZXIob2xkX21tKTsKIAlhcmNoX3BpY2tfbW1hcF9sYXlvdXQobW0pOwogCWlmIChvbGRfbW0pIHsKIAkJdXBfcmVhZCgmb2xkX21tLT5tbWFwX3NlbSk7CiAJCUJVR19PTihhY3RpdmVfbW0gIT0gb2xkX21tKTsKKwkJbW1fdXBkYXRlX25leHRfb3duZXIob2xkX21tKTsKIAkJbW1wdXQob2xkX21tKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODI1LDggKzgyMiw2IEBACiAJCQlzY2hlZHVsZSgpOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KHRhc2tfY2hpbGRfcmVhcGVyKHRzaykgPT0gbGVhZGVyKSkKLQkJCXRhc2tfYWN0aXZlX3BpZF9ucyh0c2spLT5jaGlsZF9yZWFwZXIgPSB0c2s7CiAJCS8qCiAJCSAqIFRoZSBvbmx5IHJlY29yZCB3ZSBoYXZlIG9mIHRoZSByZWFsLXRpbWUgYWdlIG9mIGEKIAkJICogcHJvY2VzcywgcmVnYXJkbGVzcyBvZiBleGVjcyBpdCdzIGRvbmUsIGlzIHN0YXJ0X3RpbWUuCkBAIC0xMTg5LDcgKzExODQsNyBAQAogCQkJcmV0dXJuIHJldHZhbDsKIAogCQkvKiBSZW1lbWJlciBpZiB0aGUgYXBwbGljYXRpb24gaXMgVEFTTy4gICovCi0JCWJwcm0tPnNoX2JhbmcgPSBlaC0+YWguZW50cnkgPCAweDEwMDAwMDAwMFVMOworCQlicHJtLT50YXNvID0gZWgtPmFoLmVudHJ5IDwgMHgxMDAwMDAwMDBVTDsKIAogCQlicHJtLT5maWxlID0gZmlsZTsKIAkJYnBybS0+bG9hZGVyID0gbG9hZGVyOwpAQCAtMTI0Nyw4ICsxMjQyLDggQEAKIAkJcmVhZF91bmxvY2soJmJpbmZtdF9sb2NrKTsKIAkJaWYgKHJldHZhbCAhPSAtRU5PRVhFQyB8fCBicHJtLT5tbSA9PSBOVUxMKSB7CiAJCQlicmVhazsKLSNpZmRlZiBDT05GSUdfS01PRAotCQl9ZWxzZXsKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCQl9IGVsc2UgewogI2RlZmluZSBwcmludGFibGUoYykgKCgoYyk9PSdcdCcpIHx8ICgoYyk9PSdcbicpIHx8ICgweDIwPD0oYykgJiYgKGMpPD0weDdlKSkKIAkJCWlmIChwcmludGFibGUoYnBybS0+YnVmWzBdKSAmJgogCQkJICAgIHByaW50YWJsZShicHJtLT5idWZbMV0pICYmCmRpZmYgLS1naXQgYS9mcy9leHQyL2JhbGxvYy5jIGIvZnMvZXh0Mi9iYWxsb2MuYwppbmRleCAxMGJiMDJjLi42ZGFjN2JhIDEwMDY0NAotLS0gYS9mcy9leHQyL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDIvYmFsbG9jLmMKQEAgLTEyOTUsNiArMTI5NSw3IEBACiAJICogdHVybiBvZmYgcmVzZXJ2YXRpb24gZm9yIHRoaXMgYWxsb2NhdGlvbgogCSAqLwogCWlmIChteV9yc3YgJiYgKGZyZWVfYmxvY2tzIDwgd2luZG93c3opCisJCSYmIChmcmVlX2Jsb2NrcyA+IDApCiAJCSYmIChyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpKQogCQlteV9yc3YgPSBOVUxMOwogCkBAIC0xMzMyLDcgKzEzMzMsNyBAQAogCQkgKiBmcmVlIGJsb2NrcyBpcyBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgcmVzZXJ2YXRpb24KIAkJICogd2luZG93IHNpemUuCiAJCSAqLwotCQlpZiAoZnJlZV9ibG9ja3MgPD0gKHdpbmRvd3N6LzIpKQorCQlpZiAobXlfcnN2ICYmIChmcmVlX2Jsb2NrcyA8PSAod2luZG93c3ovMikpKQogCQkJY29udGludWU7CiAKIAkJYnJlbHNlKGJpdG1hcF9iaCk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCBhNzhjNmI0Li4xMWE0OWNlIDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGV4dDJfY2hlY2tfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIGV4dDJfY2hlY2tfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHF1aWV0KQogewogCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOwpAQCAtMTQ2LDEwICsxNDYsMTAgQEAKIAkvKiBUb28gYmFkLCB3ZSBoYWQgYW4gZXJyb3IgKi8KIAogRWJhZHNpemU6Ci0JZXh0Ml9lcnJvcihzYiwgImV4dDJfY2hlY2tfcGFnZSIsCi0JCSJzaXplIG9mIGRpcmVjdG9yeSAjJWx1IGlzIG5vdCBhIG11bHRpcGxlIG9mIGNodW5rIHNpemUiLAotCQlkaXItPmlfaW5vCi0JKTsKKwlpZiAoIXF1aWV0KQorCQlleHQyX2Vycm9yKHNiLCBfX2Z1bmNfXywKKwkJCSJzaXplIG9mIGRpcmVjdG9yeSAjJWx1IGlzIG5vdCBhIG11bHRpcGxlICIKKwkJCSJvZiBjaHVuayBzaXplIiwgZGlyLT5pX2lubyk7CiAJZ290byBmYWlsOwogRXNob3J0OgogCWVycm9yID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOwpAQCAtMTY2LDMyICsxNjYsMzYgQEAKIEVpbnVtYmVyOgogCWVycm9yID0gImlub2RlIG91dCBvZiBib3VuZHMiOwogYmFkX2VudHJ5OgotCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwgImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCi0JCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKLQkJZGlyLT5pX2lubywgZXJyb3IsIChwYWdlLT5pbmRleDw8UEFHRV9DQUNIRV9TSElGVCkrb2ZmcywKLQkJKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KHAtPmlub2RlKSwKLQkJcmVjX2xlbiwgcC0+bmFtZV9sZW4pOworCWlmICghcXVpZXQpCisJCWV4dDJfZXJyb3Ioc2IsIF9fZnVuY19fLCAiYmFkIGVudHJ5IGluIGRpcmVjdG9yeSAjJWx1OiA6ICVzIC0gIgorCQkJIm9mZnNldD0lbHUsIGlub2RlPSVsdSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAorCQkJZGlyLT5pX2lubywgZXJyb3IsIChwYWdlLT5pbmRleDw8UEFHRV9DQUNIRV9TSElGVCkrb2ZmcywKKwkJCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShwLT5pbm9kZSksCisJCQlyZWNfbGVuLCBwLT5uYW1lX2xlbik7CiAJZ290byBmYWlsOwogRWVuZDoKLQlwID0gKGV4dDJfZGlyZW50ICopKGthZGRyICsgb2Zmcyk7Ci0JZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX3BhZ2UiLAotCQkiZW50cnkgaW4gZGlyZWN0b3J5ICMlbHUgc3BhbnMgdGhlIHBhZ2UgYm91bmRhcnkiCi0JCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUiLAotCQlkaXItPmlfaW5vLCAocGFnZS0+aW5kZXg8PFBBR0VfQ0FDSEVfU0hJRlQpK29mZnMsCi0JCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShwLT5pbm9kZSkpOworCWlmICghcXVpZXQpIHsKKwkJcCA9IChleHQyX2RpcmVudCAqKShrYWRkciArIG9mZnMpOworCQlleHQyX2Vycm9yKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwKKwkJCSJlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdSBzcGFucyB0aGUgcGFnZSBib3VuZGFyeSIKKwkJCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUiLAorCQkJZGlyLT5pX2lubywgKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKStvZmZzLAorCQkJKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KHAtPmlub2RlKSk7CisJfQogZmFpbDoKIAlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKIAlTZXRQYWdlRXJyb3IocGFnZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqIGV4dDJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqIGV4dDJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkgICBpbnQgcXVpZXQpCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG4sIE5VTEwpOwogCWlmICghSVNfRVJSKHBhZ2UpKSB7CiAJCWttYXAocGFnZSk7CiAJCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCi0JCQlleHQyX2NoZWNrX3BhZ2UocGFnZSk7CisJCQlleHQyX2NoZWNrX3BhZ2UocGFnZSwgcXVpZXQpOwogCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQogCQkJZ290byBmYWlsOwogCX0KQEAgLTI5Miw3ICsyOTYsNyBAQAogCWZvciAoIDsgbiA8IG5wYWdlczsgbisrLCBvZmZzZXQgPSAwKSB7CiAJCWNoYXIgKmthZGRyLCAqbGltaXQ7CiAJCWV4dDJfZGlyZW50ICpkZTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBleHQyX2dldF9wYWdlKGlub2RlLCBuKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBleHQyX2dldF9wYWdlKGlub2RlLCBuLCAwKTsKIAogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlleHQyX2Vycm9yKHNiLCBfX2Z1bmNfXywKQEAgLTM2MSw2ICszNjUsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShkaXIpOwogCWV4dDJfZGlyZW50ICogZGU7CisJaW50IGRpcl9oYXNfZXJyb3IgPSAwOwogCiAJaWYgKG5wYWdlcyA9PSAwKQogCQlnb3RvIG91dDsKQEAgLTM3NCw3ICszNzksNyBAQAogCW4gPSBzdGFydDsKIAlkbyB7CiAJCWNoYXIgKmthZGRyOwotCQlwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIG4pOworCQlwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIG4sIGRpcl9oYXNfZXJyb3IpOwogCQlpZiAoIUlTX0VSUihwYWdlKSkgewogCQkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJCQlkZSA9IChleHQyX2RpcmVudCAqKSBrYWRkcjsKQEAgLTM5MSw3ICszOTYsOSBAQAogCQkJCWRlID0gZXh0Ml9uZXh0X2VudHJ5KGRlKTsKIAkJCX0KIAkJCWV4dDJfcHV0X3BhZ2UocGFnZSk7Ci0JCX0KKwkJfSBlbHNlCisJCQlkaXJfaGFzX2Vycm9yID0gMTsKKwogCQlpZiAoKytuID49IG5wYWdlcykKIAkJCW4gPSAwOwogCQkvKiBuZXh0IHBhZ2UgaXMgcGFzdCB0aGUgYmxvY2tzIHdlJ3ZlIGdvdCAqLwpAQCAtNDE0LDcgKzQyMSw3IEBACiAKIHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZXh0Ml9kb3Rkb3QgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcGFnZSAqKnApCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBleHQyX2dldF9wYWdlKGRpciwgMCk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBleHQyX2dldF9wYWdlKGRpciwgMCwgMCk7CiAJZXh0Ml9kaXJlbnQgKmRlID0gTlVMTDsKIAogCWlmICghSVNfRVJSKHBhZ2UpKSB7CkBAIC00ODcsNyArNDk0LDcgQEAKIAlmb3IgKG4gPSAwOyBuIDw9IG5wYWdlczsgbisrKSB7CiAJCWNoYXIgKmRpcl9lbmQ7CiAKLQkJcGFnZSA9IGV4dDJfZ2V0X3BhZ2UoZGlyLCBuKTsKKwkJcGFnZSA9IGV4dDJfZ2V0X3BhZ2UoZGlyLCBuLCAwKTsKIAkJZXJyID0gUFRSX0VSUihwYWdlKTsKIAkJaWYgKElTX0VSUihwYWdlKSkKIAkJCWdvdG8gb3V0OwpAQCAtNjU1LDE0ICs2NjIsMTcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpLCBucGFnZXMgPSBkaXJfcGFnZXMoaW5vZGUpOworCWludCBkaXJfaGFzX2Vycm9yID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogCQljaGFyICprYWRkcjsKIAkJZXh0Ml9kaXJlbnQgKiBkZTsKLQkJcGFnZSA9IGV4dDJfZ2V0X3BhZ2UoaW5vZGUsIGkpOworCQlwYWdlID0gZXh0Ml9nZXRfcGFnZShpbm9kZSwgaSwgZGlyX2hhc19lcnJvcik7CiAKLQkJaWYgKElTX0VSUihwYWdlKSkKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZGlyX2hhc19lcnJvciA9IDE7CiAJCQljb250aW51ZTsKKwkJfQogCiAJCWthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCQlkZSA9IChleHQyX2RpcmVudCAqKWthZGRyOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCA0N2Q4OGRhLi5iYWU5OThjIDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDIuaAorKysgYi9mcy9leHQyL2V4dDIuaApAQCAtMTMzLDYgKzEzMyw4IEBACiBleHRlcm4gaW50IGV4dDJfc2V0YXR0ciAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBleHRlcm4gdm9pZCBleHQyX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGV4dDJfZ2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKik7CitleHRlcm4gaW50IGV4dDJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pOwogaW50IF9fZXh0Ml93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCWxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCiAJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwppbmRleCA1ZjJmYTljLi40NWVkMDcxIDEwMDY0NAotLS0gYS9mcy9leHQyL2ZpbGUuYworKysgYi9mcy9leHQyL2ZpbGUuYwpAQCAtODYsNCArODYsNSBAQAogI2VuZGlmCiAJLnNldGF0dHIJPSBleHQyX3NldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBleHQyX3Blcm1pc3Npb24sCisJLmZpZW1hcAkJPSBleHQyX2ZpZW1hcCwKIH07CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggOTkxZDZkZi4uNzY1OGIzMyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KICNpbmNsdWRlICJleHQyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAjaW5jbHVkZSAieGlwLmgiCkBAIC03MDQsNiArNzA1LDEzIEBACiAKIH0KIAoraW50IGV4dDJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCXU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19maWVtYXAoaW5vZGUsIGZpZWluZm8sIHN0YXJ0LCBsZW4sCisJCQkJICAgIGV4dDJfZ2V0X2Jsb2NrKTsKK30KKwogc3RhdGljIGludCBleHQyX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBleHQyX2dldF9ibG9jaywgd2JjKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCBmZDg4YzdiNC4uNjQ3Y2Q4OCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJT3B0X3VzcnF1b3RhLCBPcHRfZ3JwcXVvdGEsIE9wdF9yZXNlcnZhdGlvbiwgT3B0X25vcmVzZXJ2YXRpb24KIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X2JzZF9kZiwgImJzZGRmIn0sCiAJe09wdF9taW5peF9kZiwgIm1pbml4ZGYifSwKIAl7T3B0X2dycGlkLCAiZ3JwaWQifSwKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvZmlsZS5jIGIvZnMvZXh0My9maWxlLmMKaW5kZXggYWNjNDkxMy4uM2JlMWUwNiAxMDA2NDQKLS0tIGEvZnMvZXh0My9maWxlLmMKKysrIGIvZnMvZXh0My9maWxlLmMKQEAgLTEzNCw1ICsxMzQsNiBAQAogCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjZW5kaWYKIAkucGVybWlzc2lvbgk9IGV4dDNfcGVybWlzc2lvbiwKKwkuZmllbWFwCQk9IGV4dDNfZmllbWFwLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDUwN2Q4NjguLmViZmVjNGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAKQEAgLTk4MSw2ICs5ODIsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgZXh0M19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2ZpZW1hcChpbm9kZSwgZmllaW5mbywgc3RhcnQsIGxlbiwKKwkJCQkgICAgZXh0M19nZXRfYmxvY2spOworfQorCiAvKgogICogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlIGlzIHplcm8KICAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGYzOGE1YWYuLjM5OWE5NmEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTc2MCw3ICs3NjAsNyBAQAogCU9wdF9ncnBxdW90YQogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfYnNkX2RmLCAiYnNkZGYifSwKIAl7T3B0X21pbml4X2RmLCAibWluaXhkZiJ9LAogCXtPcHRfZ3JwaWQsICJncnBpZCJ9LApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9NYWtlZmlsZSBiL2ZzL2V4dDQvTWFrZWZpbGUKaW5kZXggYWM2ZmE4Yy4uYThmZjAwMyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9NYWtlZmlsZQorKysgYi9mcy9leHQ0L01ha2VmaWxlCkBAIC0yLDEyICsyLDEyIEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXggZXh0NC1maWxlc3lzdGVtIHJvdXRpbmVzLgogIwogCi1vYmotJChDT05GSUdfRVhUNERFVl9GUykgKz0gZXh0NGRldi5vCitvYmotJChDT05GSUdfRVhUNF9GUykgKz0gZXh0NC5vCiAKLWV4dDRkZXYteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKK2V4dDQteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKIAkJICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubyBleHRlbnRzLm8gXAogCQkgICBleHQ0X2piZDIubyBtaWdyYXRlLm8gbWJhbGxvYy5vCiAKLWV4dDRkZXYtJChDT05GSUdfRVhUNERFVl9GU19YQVRUUikJKz0geGF0dHIubyB4YXR0cl91c2VyLm8geGF0dHJfdHJ1c3RlZC5vCi1leHQ0ZGV2LSQoQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMKQkrPSBhY2wubwotZXh0NGRldi0kKENPTkZJR19FWFQ0REVWX0ZTX1NFQ1VSSVRZKQkrPSB4YXR0cl9zZWN1cml0eS5vCitleHQ0LSQoQ09ORklHX0VYVDRfRlNfWEFUVFIpCQkrPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDQtJChDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wpCSs9IGFjbC5vCitleHQ0LSQoQ09ORklHX0VYVDRfRlNfU0VDVVJJVFkpCQkrPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9leHQ0L2FjbC5oIGIvZnMvZXh0NC9hY2wuaAppbmRleCBjZDJiODU1Li5jYjQ1MjU3IDEwMDY0NAotLS0gYS9mcy9leHQ0L2FjbC5oCisrKyBiL2ZzL2V4dDQvYWNsLmgKQEAgLTUxLDE4ICs1MSwxOCBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCiAvKiBWYWx1ZSBmb3IgaW5vZGUtPnUuZXh0NF9pLmlfYWNsIGFuZCBpbm9kZS0+dS5leHQ0X2kuaV9kZWZhdWx0X2FjbAogICAgaWYgdGhlIEFDTCBoYXMgbm90IGJlZW4gY2FjaGVkICovCiAjZGVmaW5lIEVYVDRfQUNMX05PVF9DQUNIRUQgKCh2b2lkICopLTEpCiAKIC8qIGFjbC5jICovCi1leHRlcm4gaW50IGV4dDRfcGVybWlzc2lvbiAoc3RydWN0IGlub2RlICosIGludCk7Ci1leHRlcm4gaW50IGV4dDRfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKik7Ci1leHRlcm4gaW50IGV4dDRfaW5pdF9hY2wgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDRfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgZXh0NF9hY2xfY2htb2Qoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBleHQ0X2luaXRfYWNsKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAKLSNlbHNlICAvKiBDT05GSUdfRVhUNERFVl9GU19QT1NJWF9BQ0wgKi8KKyNlbHNlICAvKiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2RlZmluZSBleHQ0X3Blcm1pc3Npb24gTlVMTAogCkBAIC03Nyw1ICs3Nyw1IEBACiB7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgIC8qIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTCAqLworI2VuZGlmICAvKiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wgKi8KIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggZTlmYTk2MC4uYmQyZWNlMiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC04Myw2ICs4Myw3IEBACiAJfQogCXJldHVybiB1c2VkX2Jsb2NrczsKIH0KKwogLyogSW5pdGlhbGl6ZXMgYW4gdW5pbml0aWFsaXplZCBibG9jayBiaXRtYXAgaWYgZ2l2ZW4sIGFuZCByZXR1cm5zIHRoZQogICogbnVtYmVyIG9mIGJsb2NrcyBmcmVlIGluIHRoZSBncm91cC4gKi8KIHVuc2lnbmVkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKQEAgLTEzMiw3ICsxMzMsNyBAQAogCQkgKi8KIAkJZ3JvdXBfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoc2JpLT5zX2VzKSAtCiAJCQlsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgLQotCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKiAoc2JpLT5zX2dyb3Vwc19jb3VudCAtMSkpOworCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKiAoc2JpLT5zX2dyb3Vwc19jb3VudCAtIDEpKTsKIAl9IGVsc2UgewogCQlncm91cF9ibG9ja3MgPSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCX0KQEAgLTIwMCwyMCArMjAxLDIwIEBACiAgKiBAYmg6CQkJcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWQgdG8gc3RvcmUgdGhlIGJsb2NrCiAgKgkJCWdyb3VwIGRlc2NyaXB0b3IKICAqLwotc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqIGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCitzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCQkgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKLQkJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgpCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCiB7CiAJdW5zaWduZWQgbG9uZyBncm91cF9kZXNjOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKIAlpZiAoYmxvY2tfZ3JvdXAgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewotCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAotCQkJICAgICJibG9ja19ncm91cCA+PSBncm91cHNfY291bnQgLSAiCi0JCQkgICAgImJsb2NrX2dyb3VwID0gJWx1LCBncm91cHNfY291bnQgPSAlbHUiLAotCQkJICAgIGJsb2NrX2dyb3VwLCBzYmktPnNfZ3JvdXBzX2NvdW50KTsKKwkJZXh0NF9lcnJvcihzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgImJsb2NrX2dyb3VwID49IGdyb3Vwc19jb3VudCAtICIKKwkJCSAgICJibG9ja19ncm91cCA9ICVsdSwgZ3JvdXBzX2NvdW50ID0gJWx1IiwKKwkJCSAgIGJsb2NrX2dyb3VwLCBzYmktPnNfZ3JvdXBzX2NvdW50KTsKIAogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yMjIsMTAgKzIyMywxMCBAQAogCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOwogCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CiAJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgewotCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAotCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCi0JCQkgICAgImJsb2NrX2dyb3VwID0gJWx1LCBncm91cF9kZXNjID0gJWx1LCBkZXNjID0gJWx1IiwKLQkJCSAgICAgYmxvY2tfZ3JvdXAsIGdyb3VwX2Rlc2MsIG9mZnNldCk7CisJCWV4dDRfZXJyb3Ioc2IsICJleHQ0X2dldF9ncm91cF9kZXNjIiwKKwkJCSAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgYmxvY2tfZ3JvdXAsIGdyb3VwX2Rlc2MsIG9mZnNldCk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzAyLDggKzMwMyw4IEBACiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgogZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXApCiB7Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqIGRlc2M7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJZXh0NF9mc2Jsa190IGJpdG1hcF9ibGs7CiAKIAlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgYmxvY2tfZ3JvdXAsIE5VTEwpOwpAQCAtMzE4LDkgKzMxOSwxMSBAQAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChiaF91cHRvZGF0ZV9vcl9sb2NrKGJoKSkKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSkKIAkJcmV0dXJuIGJoOwogCisJbG9ja19idWZmZXIoYmgpOwogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKIAlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzYiwgYmgsIGJsb2NrX2dyb3VwLCBkZXNjKTsKQEAgLTM0NSwzMDEgKzM0OCw2IEBACiAJICovCiAJcmV0dXJuIGJoOwogfQotLyoKLSAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIG9wZXJhdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPcGVyYXRpb25zIGluY2x1ZGU6Ci0gKiBkdW1wLCBmaW5kLCBhZGQsIHJlbW92ZSwgaXNfZW1wdHksIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdywgZXRjLgotICoKLSAqIFdlIHVzZSBhIHJlZC1ibGFjayB0cmVlIHRvIHJlcHJlc2VudCBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbgotICogd2luZG93cy4KLSAqCi0gKi8KLQotLyoqCi0gKiBfX3Jzdl93aW5kb3dfZHVtcCgpIC0tIER1bXAgdGhlIGZpbGVzeXN0ZW0gYmxvY2sgYWxsb2NhdGlvbiByZXNlcnZhdGlvbiBtYXAKLSAqIEByYl9yb290OgkJcm9vdCBvZiBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiByYiB0cmVlCi0gKiBAdmVyYm9zZToJCXZlcmJvc2UgbW9kZQotICogQGZuOgkJCWZ1bmN0aW9uIHdoaWNoIHdpc2hlcyB0byBkdW1wIHRoZSByZXNlcnZhdGlvbiBtYXAKLSAqCi0gKiBJZiB2ZXJib3NlIGlzIHR1cm5lZCBvbiwgaXQgd2lsbCBwcmludCB0aGUgd2hvbGUgYmxvY2sgcmVzZXJ2YXRpb24KLSAqIHdpbmRvd3Moc3RhcnQsIGVuZCkuCU90aGVyd2lzZSwgaXQgd2lsbCBvbmx5IHByaW50IG91dCB0aGUgImJhZCIgd2luZG93cywKLSAqIHRob3NlIHdpbmRvd3MgdGhhdCBvdmVybGFwIHdpdGggdGhlaXIgaW1tZWRpYXRlIG5laWdoYm9ycy4KLSAqLwotI2lmIDEKLXN0YXRpYyB2b2lkIF9fcnN2X3dpbmRvd19kdW1wKHN0cnVjdCByYl9yb290ICpyb290LCBpbnQgdmVyYm9zZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmZuKQotewotCXN0cnVjdCByYl9ub2RlICpuOwotCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7Ci0JaW50IGJhZDsKLQotcmVzdGFydDoKLQluID0gcmJfZmlyc3Qocm9vdCk7Ci0JYmFkID0gMDsKLQlwcmV2ID0gTlVMTDsKLQotCXByaW50aygiQmxvY2sgQWxsb2NhdGlvbiBSZXNlcnZhdGlvbiBXaW5kb3dzIE1hcCAoJXMpOlxuIiwgZm4pOwotCXdoaWxlIChuKSB7Ci0JCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKLQkJaWYgKHZlcmJvc2UpCi0JCQlwcmludGsoInJlc2VydmF0aW9uIHdpbmRvdyAweCVwICIKLQkJCSAgICAgICAic3RhcnQ6ICAlbGx1LCBlbmQ6ICAlbGx1XG4iLAotCQkJICAgICAgIHJzdiwgcnN2LT5yc3Zfc3RhcnQsIHJzdi0+cnN2X2VuZCk7Ci0JCWlmIChyc3YtPnJzdl9zdGFydCAmJiByc3YtPnJzdl9zdGFydCA+PSByc3YtPnJzdl9lbmQpIHsKLQkJCXByaW50aygiQmFkIHJlc2VydmF0aW9uICVwIChzdGFydCA+PSBlbmQpXG4iLAotCQkJICAgICAgIHJzdik7Ci0JCQliYWQgPSAxOwotCQl9Ci0JCWlmIChwcmV2ICYmIHByZXYtPnJzdl9lbmQgPj0gcnN2LT5yc3Zfc3RhcnQpIHsKLQkJCXByaW50aygiQmFkIHJlc2VydmF0aW9uICVwIChwcmV2LT5lbmQgPj0gc3RhcnQpXG4iLAotCQkJICAgICAgIHJzdik7Ci0JCQliYWQgPSAxOwotCQl9Ci0JCWlmIChiYWQpIHsKLQkJCWlmICghdmVyYm9zZSkgewotCQkJCXByaW50aygiUmVzdGFydGluZyByZXNlcnZhdGlvbiB3YWxrIGluIHZlcmJvc2UgbW9kZVxuIik7Ci0JCQkJdmVyYm9zZSA9IDE7Ci0JCQkJZ290byByZXN0YXJ0OwotCQkJfQotCQl9Ci0JCW4gPSByYl9uZXh0KG4pOwotCQlwcmV2ID0gcnN2OwotCX0KLQlwcmludGsoIldpbmRvdyBtYXAgY29tcGxldGUuXG4iKTsKLQlCVUdfT04oYmFkKTsKLX0KLSNkZWZpbmUgcnN2X3dpbmRvd19kdW1wKHJvb3QsIHZlcmJvc2UpIFwKLQlfX3Jzdl93aW5kb3dfZHVtcCgocm9vdCksICh2ZXJib3NlKSwgX19mdW5jX18pCi0jZWxzZQotI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotLyoqCi0gKiBnb2FsX2luX215X3Jlc2VydmF0aW9uKCkKLSAqIEByc3Y6CQlpbm9kZSdzIHJlc2VydmF0aW9uIHdpbmRvdwotICogQGdycF9nb2FsOgkJZ2l2ZW4gZ29hbCBibG9jayByZWxhdGl2ZSB0byB0aGUgYWxsb2NhdGlvbiBibG9jayBncm91cAotICogQGdyb3VwOgkJdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBibG9jayBncm91cAotICogQHNiOgkJCWZpbGVzeXN0ZW0gc3VwZXIgYmxvY2sKLSAqCi0gKiBUZXN0IGlmIHRoZSBnaXZlbiBnb2FsIGJsb2NrIChncm91cCByZWxhdGl2ZSkgaXMgd2l0aGluIHRoZSBmaWxlJ3MKLSAqIG93biBibG9jayByZXNlcnZhdGlvbiB3aW5kb3cgcmFuZ2UuCi0gKgotICogSWYgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpcyBvdXRzaWRlIHRoZSBnb2FsIGFsbG9jYXRpb24gZ3JvdXAsIHJldHVybiAwOwotICogZ3JwX2dvYWwgKGdpdmVuIGdvYWwgYmxvY2spIGNvdWxkIGJlIC0xLCB3aGljaCBtZWFucyBubyBzcGVjaWZpYwotICogZ29hbCBibG9jay4gSW4gdGhpcyBjYXNlLCBhbHdheXMgcmV0dXJuIDEuCi0gKiBJZiB0aGUgZ29hbCBibG9jayBpcyB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdywgcmV0dXJuIDE7Ci0gKiBvdGhlcndpc2UsIHJldHVybiAwOwotICovCi1zdGF0aWMgaW50Ci1nb2FsX2luX215X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93ICpyc3YsIGV4dDRfZ3JwYmxrX3QgZ3JwX2dvYWwsCi0JCQlleHQ0X2dyb3VwX3QgZ3JvdXAsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JZXh0NF9mc2Jsa190IGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9sYXN0X2Jsb2NrOwotCi0JZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7Ci0JZ3JvdXBfbGFzdF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrICsgKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKTsKLQotCWlmICgocnN2LT5fcnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKLQkgICAgKHJzdi0+X3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCi0JCXJldHVybiAwOwotCWlmICgoZ3JwX2dvYWwgPj0gMCkgJiYgKChncnBfZ29hbCArIGdyb3VwX2ZpcnN0X2Jsb2NrIDwgcnN2LT5fcnN2X3N0YXJ0KQotCQl8fCAoZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jayA+IHJzdi0+X3Jzdl9lbmQpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogc2VhcmNoX3Jlc2VydmVfd2luZG93KCkKLSAqIEByYl9yb290OgkJcm9vdCBvZiByZXNlcnZhdGlvbiB0cmVlCi0gKiBAZ29hbDoJCXRhcmdldCBhbGxvY2F0aW9uIGJsb2NrCi0gKgotICogRmluZCB0aGUgcmVzZXJ2ZWQgd2luZG93IHdoaWNoIGluY2x1ZGVzIHRoZSBnb2FsLCBvciB0aGUgcHJldmlvdXMgb25lCi0gKiBpZiB0aGUgZ29hbCBpcyBub3QgaW4gYW55IHdpbmRvdy4KLSAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUgbm8gd2luZG93cyBvciBpZiBhbGwgd2luZG93cyBzdGFydCBhZnRlciB0aGUgZ29hbC4KLSAqLwotc3RhdGljIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKgotc2VhcmNoX3Jlc2VydmVfd2luZG93KHN0cnVjdCByYl9yb290ICpyb290LCBleHQ0X2ZzYmxrX3QgZ29hbCkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OwotCi0JaWYgKCFuKQotCQlyZXR1cm4gTlVMTDsKLQotCWRvIHsKLQkJcnN2ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOwotCi0JCWlmIChnb2FsIDwgcnN2LT5yc3Zfc3RhcnQpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoZ29hbCA+IHJzdi0+cnN2X2VuZCkKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIHJzdjsKLQl9IHdoaWxlIChuKTsKLQkvKgotCSAqIFdlJ3ZlIGZhbGxlbiBvZmYgdGhlIGVuZCBvZiB0aGUgdHJlZTogdGhlIGdvYWwgd2Fzbid0IGluc2lkZQotCSAqIGFueSBwYXJ0aWN1bGFyIG5vZGUuICBPSywgdGhlIHByZXZpb3VzIG5vZGUgbXVzdCBiZSB0byBvbmUKLQkgKiBzaWRlIG9mIHRoZSBpbnRlcnZhbCBjb250YWluaW5nIHRoZSBnb2FsLiAgSWYgaXQncyB0aGUgUkhTLAotCSAqIHdlIG5lZWQgdG8gYmFjayB1cCBvbmUuCi0JICovCi0JaWYgKHJzdi0+cnN2X3N0YXJ0ID4gZ29hbCkgewotCQluID0gcmJfcHJldigmcnN2LT5yc3Zfbm9kZSk7Ci0JCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKLQl9Ci0JcmV0dXJuIHJzdjsKLX0KLQotLyoqCi0gKiBleHQ0X3Jzdl93aW5kb3dfYWRkKCkgLS0gSW5zZXJ0IGEgd2luZG93IHRvIHRoZSBibG9jayByZXNlcnZhdGlvbiByYiB0cmVlLgotICogQHNiOgkJCXN1cGVyIGJsb2NrCi0gKiBAcnN2OgkJcmVzZXJ2YXRpb24gd2luZG93IHRvIGFkZAotICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggcnN2X2xvY2sgaG9sZC4KLSAqLwotdm9pZCBleHQ0X3Jzdl93aW5kb3dfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCSAgICBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpCi17Ci0Jc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmRVhUNF9TQihzYiktPnNfcnN2X3dpbmRvd19yb290OwotCXN0cnVjdCByYl9ub2RlICpub2RlID0gJnJzdi0+cnN2X25vZGU7Ci0JZXh0NF9mc2Jsa190IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7Ci0KLQlzdHJ1Y3QgcmJfbm9kZSAqKiBwID0gJnJvb3QtPnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnRoaXM7Ci0KLQl3aGlsZSAoKnApCi0JewotCQlwYXJlbnQgPSAqcDsKLQkJdGhpcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOwotCi0JCWlmIChzdGFydCA8IHRoaXMtPnJzdl9zdGFydCkKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoc3RhcnQgPiB0aGlzLT5yc3ZfZW5kKQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlyc3Zfd2luZG93X2R1bXAocm9vdCwgMSk7Ci0JCQlCVUcoKTsKLQkJfQotCX0KLQotCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcihub2RlLCByb290KTsKLX0KLQotLyoqCi0gKiBleHQ0X3Jzdl93aW5kb3dfcmVtb3ZlKCkgLS0gdW5saW5rIGEgd2luZG93IGZyb20gdGhlIHJlc2VydmF0aW9uIHJiIHRyZWUKLSAqIEBzYjoJCQlzdXBlciBibG9jawotICogQHJzdjoJCXJlc2VydmF0aW9uIHdpbmRvdyB0byByZW1vdmUKLSAqCi0gKiBNYXJrIHRoZSBibG9jayByZXNlcnZhdGlvbiB3aW5kb3cgYXMgbm90IGFsbG9jYXRlZCwgYW5kIHVubGluayBpdAotICogZnJvbSB0aGUgZmlsZXN5c3RlbSByZXNlcnZhdGlvbiB3aW5kb3cgcmIgdHJlZS4gTXVzdCBiZSBjYWxsZWQgd2l0aAotICogcnN2X2xvY2sgaG9sZC4KLSAqLwotc3RhdGljIHZvaWQgcnN2X3dpbmRvd19yZW1vdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCSAgICAgIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnJzdikKLXsKLQlyc3YtPnJzdl9zdGFydCA9IEVYVDRfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKLQlyc3YtPnJzdl9lbmQgPSBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7Ci0JcnN2LT5yc3ZfYWxsb2NfaGl0ID0gMDsKLQlyYl9lcmFzZSgmcnN2LT5yc3Zfbm9kZSwgJkVYVDRfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdCk7Ci19Ci0KLS8qCi0gKiByc3ZfaXNfZW1wdHkoKSAtLSBDaGVjayBpZiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGlzIGFsbG9jYXRlZC4KLSAqIEByc3Y6CQlnaXZlbiByZXNlcnZhdGlvbiB3aW5kb3cgdG8gY2hlY2sKLSAqCi0gKiByZXR1cm5zIDEgaWYgdGhlIGVuZCBibG9jayBpcyBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJzdl9pc19lbXB0eShzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvdyAqcnN2KQotewotCS8qIGEgdmFsaWQgcmVzZXJ2YXRpb24gZW5kIGJsb2NrIGNvdWxkIG5vdCBiZSAwICovCi0JcmV0dXJuIHJzdi0+X3Jzdl9lbmQgPT0gRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOwotfQotCi0vKioKLSAqIGV4dDRfaW5pdF9ibG9ja19hbGxvY19pbmZvKCkKLSAqIEBpbm9kZToJCWZpbGUgaW5vZGUgc3RydWN0dXJlCi0gKgotICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlCXJlc2VydmF0aW9uIHdpbmRvdyBzdHJ1Y3R1cmUsIGFuZAotICogbGluayB0aGUgd2luZG93IHRvIHRoZSBleHQ0IGlub2RlIHN0cnVjdHVyZSBhdCBsYXN0Ci0gKgotICogVGhlIHJlc2VydmF0aW9uIHdpbmRvdyBzdHJ1Y3R1cmUgaXMgb25seSBkeW5hbWljYWxseSBhbGxvY2F0ZWQKLSAqIGFuZCBsaW5rZWQgdG8gZXh0NCBpbm9kZSB0aGUgZmlyc3QgdGltZSB0aGUgb3BlbiBmaWxlCi0gKiBuZWVkcyBhIG5ldyBibG9jay4gU28sIGJlZm9yZSBldmVyeSBleHQ0X25ld19ibG9jayhzKSBjYWxsLCBmb3IKLSAqIHJlZ3VsYXIgZmlsZXMsIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cKLSAqIHN0cnVjdHVyZSBleGlzdHMgb3Igbm90LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgotICogRmFpbCB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBibG9jayByZXNlcnZhdGlvbiBiZWluZyB0dXJuZWQgb2ZmIGZvciB0aGF0Ci0gKiBvcGVuIGZpbGUuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBleHQ0X2dldF9ibG9ja3NfaGFuZGxlKCksIGFsc28gY2FsbGVkCi0gKiB3aGVuIHNldHRpbmcgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBzaXplIHRocm91Z2ggaW9jdGwgYmVmb3JlIHRoZSBmaWxlCi0gKiBpcyBvcGVuIGZvciB3cml0ZSAobmVlZHMgYmxvY2sgYWxsb2NhdGlvbikuCi0gKgotICogTmVlZHMgZG93bl93cml0ZShpX2RhdGFfc2VtKSBwcm90ZWN0aW9uIHByaW9yIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KLSAqLwotdm9pZCBleHQ0X2luaXRfYmxvY2tfYWxsb2NfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pID0gZWktPmlfYmxvY2tfYWxsb2NfaW5mbzsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7Ci0KLQlibG9ja19pID0ga21hbGxvYyhzaXplb2YoKmJsb2NrX2kpLCBHRlBfTk9GUyk7Ci0JaWYgKGJsb2NrX2kpIHsKLQkJc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2ID0gJmJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZTsKLQotCQlyc3YtPnJzdl9zdGFydCA9IEVYVDRfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKLQkJcnN2LT5yc3ZfZW5kID0gRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOwotCi0JCS8qCi0JCSAqIGlmIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRoIE5PUkVTRVJWQVRJT04sIHRoZSBnb2FsCi0JCSAqIHJlc2VydmF0aW9uIHdpbmRvdyBzaXplIGlzIHNldCB0byB6ZXJvIHRvIGluZGljYXRlCi0JCSAqIGJsb2NrIHJlc2VydmF0aW9uIGlzIG9mZgotCQkgKi8KLQkJaWYgKCF0ZXN0X29wdChzYiwgUkVTRVJWQVRJT04pKQotCQkJcnN2LT5yc3ZfZ29hbF9zaXplID0gMDsKLQkJZWxzZQotCQkJcnN2LT5yc3ZfZ29hbF9zaXplID0gRVhUNF9ERUZBVUxUX1JFU0VSVkVfQkxPQ0tTOwotCQlyc3YtPnJzdl9hbGxvY19oaXQgPSAwOwotCQlibG9ja19pLT5sYXN0X2FsbG9jX2xvZ2ljYWxfYmxvY2sgPSAwOwotCQlibG9ja19pLT5sYXN0X2FsbG9jX3BoeXNpY2FsX2Jsb2NrID0gMDsKLQl9Ci0JZWktPmlfYmxvY2tfYWxsb2NfaW5mbyA9IGJsb2NrX2k7Ci19Ci0KLS8qKgotICogZXh0NF9kaXNjYXJkX3Jlc2VydmF0aW9uKCkKLSAqIEBpbm9kZToJCWlub2RlCi0gKgotICogRGlzY2FyZChmcmVlKSBibG9jayByZXNlcnZhdGlvbiB3aW5kb3cgb24gbGFzdCBmaWxlIGNsb3NlLCBvciB0cnVuY2F0ZQotICogb3IgYXQgbGFzdCBpcHV0KCkuCi0gKgotICogSXQgaXMgYmVpbmcgY2FsbGVkIGluIHRocmVlIGNhc2VzOgotICoJZXh0NF9yZWxlYXNlX2ZpbGUoKTogbGFzdCB3cml0ZXIgY2xvc2UgdGhlIGZpbGUKLSAqCWV4dDRfY2xlYXJfaW5vZGUoKTogbGFzdCBpcHV0KCksIHdoZW4gbm9ib2R5IGxpbmsgdG8gdGhpcyBmaWxlLgotICoJZXh0NF90cnVuY2F0ZSgpOiB3aGVuIHRoZSBibG9jayBpbmRpcmVjdCBtYXAgaXMgYWJvdXQgdG8gY2hhbmdlLgotICoKLSAqLwotdm9pZCBleHQ0X2Rpc2NhcmRfcmVzZXJ2YXRpb24oc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0Jc3RydWN0IGV4dDRfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OwotCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKLQotCWV4dDRfbWJfZGlzY2FyZF9pbm9kZV9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7Ci0KLQlpZiAoIWJsb2NrX2kpCi0JCXJldHVybjsKLQotCXJzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7Ci0JaWYgKCFyc3ZfaXNfZW1wdHkoJnJzdi0+cnN2X3dpbmRvdykpIHsKLQkJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKLQkJaWYgKCFyc3ZfaXNfZW1wdHkoJnJzdi0+cnN2X3dpbmRvdykpCi0JCQlyc3Zfd2luZG93X3JlbW92ZShpbm9kZS0+aV9zYiwgcnN2KTsKLQkJc3Bpbl91bmxvY2socnN2X2xvY2spOwotCX0KLX0KIAogLyoqCiAgKiBleHQ0X2ZyZWVfYmxvY2tzX3NiKCkgLS0gRnJlZSBnaXZlbiBibG9ja3MgYW5kIHVwZGF0ZSBxdW90YQpAQCAtNjQ4LDYgKzM1NiwxMyBAQAogICogQGJsb2NrOgkJCXN0YXJ0IHBoeXNjaWFsIGJsb2NrIHRvIGZyZWUKICAqIEBjb3VudDoJCQludW1iZXIgb2YgYmxvY2tzIHRvIGZyZWUKICAqIEBwZHF1b3RfZnJlZWRfYmxvY2tzOglwb2ludGVyIHRvIHF1b3RhCisgKgorICogWFhYIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IHRoZSBvbi1saW5lIHJlc2l6aW5nIGNvZGUsIHdoaWNoCisgKiBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgdXAgdG8gY2FsbCB0aGUgbWJhbGxvYyB2YXJpYW50LiAgVGhlcmUKKyAqIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCBsYXRlcjsgaW4gZmFjdCwgSSdtIG5vdCBjb252aW5jZWQgdGhpcworICogaXMgMTAwJSBjb3JyZWN0IGluIHRoZSBmYWNlIG9mIHRoZSBtYmFsbG9jIGNvZGUuICBUaGUgb25saW5lIHJlc2l6aW5nCisgKiBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIHVwIHRvIG1vcmUgdGlnaHRseSAoYW5kIGNvcnJlY3RseSkgaW50ZXJsb2NrCisgKiB3aXRoIHRoZSBtYmFsbG9jIGNvZGUuCiAgKi8KIHZvaWQgZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJIGV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKQEAgLTY1OSw4ICszNzQsOCBAQAogCWV4dDRfZ3JwYmxrX3QgYml0OwogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIG92ZXJmbG93OwotCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBkZXNjOwotCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICogZXM7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCWludCBlcnIgPSAwLCByZXQ7CiAJZXh0NF9ncnBibGtfdCBncm91cF9mcmVlZDsKQEAgLTY3MSwxMyArMzg2LDEzIEBACiAJaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKIAkgICAgYmxvY2sgKyBjb3VudCA8IGJsb2NrIHx8CiAJICAgIGJsb2NrICsgY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLQkJZXh0NF9lcnJvciAoc2IsICJleHQ0X2ZyZWVfYmxvY2tzIiwKLQkJCSAgICAiRnJlZWluZyBibG9ja3Mgbm90IGluIGRhdGF6b25lIC0gIgotCQkJICAgICJibG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKKwkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAorCQkJICAgIkZyZWVpbmcgYmxvY2tzIG5vdCBpbiBkYXRhem9uZSAtICIKKwkJCSAgICJibG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCi0JZXh0NF9kZWJ1ZyAoImZyZWVpbmcgYmxvY2socykgJWxsdS0lbGx1XG4iLCBibG9jaywgYmxvY2sgKyBjb3VudCAtIDEpOworCWV4dDRfZGVidWcoImZyZWVpbmcgYmxvY2socykgJWxsdS0lbGx1XG4iLCBibG9jaywgYmxvY2sgKyBjb3VudCAtIDEpOwogCiBkb19tb3JlOgogCW92ZXJmbG93ID0gMDsKQEAgLTY5NCw3ICs0MDksNyBAQAogCWJpdG1hcF9iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKIAlpZiAoIWJpdG1hcF9iaCkKIAkJZ290byBlcnJvcl9yZXR1cm47Ci0JZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBibG9ja19ncm91cCwgJmdkX2JoKTsKKwlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgYmxvY2tfZ3JvdXAsICZnZF9iaCk7CiAJaWYgKCFkZXNjKQogCQlnb3RvIGVycm9yX3JldHVybjsKIApAQCAtNzAzLDEwICs0MTgsMTAgQEAKIAkgICAgaW5fcmFuZ2UoYmxvY2ssIGV4dDRfaW5vZGVfdGFibGUoc2IsIGRlc2MpLCBzYmktPnNfaXRiX3Blcl9ncm91cCkgfHwKIAkgICAgaW5fcmFuZ2UoYmxvY2sgKyBjb3VudCAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGRlc2MpLAogCQkgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSkgewotCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAotCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCi0JCQkgICAgIkJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLAotCQkJICAgIGJsb2NrLCBjb3VudCk7CisJCWV4dDRfZXJyb3Ioc2IsICJleHQ0X2ZyZWVfYmxvY2tzIiwKKwkJCSAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAiQmxvY2sgPSAlbGx1LCBjb3VudCA9ICVsdSIsCisJCQkgICBibG9jaywgY291bnQpOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKQEAgLTg0OCw3ICs1NjMsNyBAQAogCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50LAogCQkJaW50IG1ldGFkYXRhKQogewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJdW5zaWduZWQgbG9uZyBkcXVvdF9mcmVlZF9ibG9ja3M7CiAKIAkvKiB0aGlzIGlzbid0IHRoZSByaWdodCBwbGFjZSB0byBkZWNpZGUgd2hldGhlciBibG9jayBpcyBtZXRhZGF0YQpAQCAtODU5LDc0OCArNTc0LDUyIEBACiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCi0JaWYgKCF0ZXN0X29wdChzYiwgTUJBTExPQykgfHwgIUVYVDRfU0Ioc2IpLT5zX2dyb3VwX2luZm8pCi0JCWV4dDRfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgYmxvY2ssIGNvdW50LAotCQkJCQkJJmRxdW90X2ZyZWVkX2Jsb2Nrcyk7Ci0JZWxzZQotCQlleHQ0X21iX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCBjb3VudCwKLQkJCQkJCW1ldGFkYXRhLCAmZHF1b3RfZnJlZWRfYmxvY2tzKTsKKwlleHQ0X21iX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCBjb3VudCwKKwkJCSAgICBtZXRhZGF0YSwgJmRxdW90X2ZyZWVkX2Jsb2Nrcyk7CiAJaWYgKGRxdW90X2ZyZWVkX2Jsb2NrcykKIAkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgZHF1b3RfZnJlZWRfYmxvY2tzKTsKIAlyZXR1cm47CiB9CiAKLS8qKgotICogZXh0NF90ZXN0X2FsbG9jYXRhYmxlKCkKLSAqIEBucjoJCQlnaXZlbiBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCi0gKiBAYmg6CQkJYnVmZmVyaGVhZCBjb250YWlucyB0aGUgYml0bWFwIG9mIHRoZSBnaXZlbiBibG9jayBncm91cAotICoKLSAqIEZvciBleHQ0IGFsbG9jYXRpb25zLCB3ZSBtdXN0IG5vdCByZXVzZSBhbnkgYmxvY2tzIHdoaWNoIGFyZQotICogYWxsb2NhdGVkIGluIHRoZSBiaXRtYXAgYnVmZmVyJ3MgImxhc3QgY29tbWl0dGVkIGRhdGEiIGNvcHkuICBUaGlzCi0gKiBwcmV2ZW50cyBkZWxldGVzIGZyb20gZnJlZWluZyB1cCB0aGUgcGFnZSBmb3IgcmV1c2UgdW50aWwgd2UgaGF2ZQotICogY29tbWl0dGVkIHRoZSBkZWxldGUgdHJhbnNhY3Rpb24uCi0gKgotICogSWYgd2UgZGlkbid0IGRvIHRoaXMsIHRoZW4gZGVsZXRpbmcgc29tZXRoaW5nIGFuZCByZWFsbG9jYXRpbmcgaXQgYXMKLSAqIGRhdGEgd291bGQgYWxsb3cgdGhlIG9sZCBibG9jayB0byBiZSBvdmVyd3JpdHRlbiBiZWZvcmUgdGhlCi0gKiB0cmFuc2FjdGlvbiBjb21taXR0ZWQgKGJlY2F1c2Ugd2UgZm9yY2UgZGF0YSB0byBkaXNrIGJlZm9yZSBjb21taXQpLgotICogVGhpcyB3b3VsZCBsZWFkIHRvIGNvcnJ1cHRpb24gaWYgd2UgY3Jhc2hlZCBiZXR3ZWVuIG92ZXJ3cml0aW5nIHRoZQotICogZGF0YSBhbmQgY29tbWl0dGluZyB0aGUgZGVsZXRlLgotICoKLSAqIEBAQCBXZSBtYXkgd2FudCB0byBtYWtlIHRoaXMgYWxsb2NhdGlvbiBiZWhhdmlvdXIgY29uZGl0aW9uYWwgb24KLSAqIGRhdGEtd3JpdGVzIGF0IHNvbWUgcG9pbnQsIGFuZCBkaXNhYmxlIGl0IGZvciBtZXRhZGF0YSBhbGxvY2F0aW9ucyBvcgotICogc3luYy1kYXRhIGlub2Rlcy4KLSAqLwotc3RhdGljIGludCBleHQ0X3Rlc3RfYWxsb2NhdGFibGUoZXh0NF9ncnBibGtfdCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK2ludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKKwkJCQkJCXM2NCBuYmxvY2tzKQogewotCWludCByZXQ7Ci0Jc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisJczY0IGZyZWVfYmxvY2tzLCBkaXJ0eV9ibG9ja3M7CisJczY0IHJvb3RfYmxvY2tzID0gMDsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyA9ICZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyOworCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZGJjID0gJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyOwogCi0JaWYgKGV4dDRfdGVzdF9iaXQobnIsIGJoLT5iX2RhdGEpKQotCQlyZXR1cm4gMDsKKwlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKGZiYyk7CisJZGlydHlfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShkYmMpOwogCi0JamJkX2xvY2tfYmhfc3RhdGUoYmgpOwotCWlmICghamgtPmJfY29tbWl0dGVkX2RhdGEpCi0JCXJldCA9IDE7Ci0JZWxzZQotCQlyZXQgPSAhZXh0NF90ZXN0X2JpdChuciwgamgtPmJfY29tbWl0dGVkX2RhdGEpOwotCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCXJldHVybiByZXQ7Ci19CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcChzYmktPnNfcmVzZ2lkKSkpCisJCXJvb3RfYmxvY2tzID0gZXh0NF9yX2Jsb2Nrc19jb3VudChzYmktPnNfZXMpOwogCi0vKioKLSAqIGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soKQotICogQHN0YXJ0OgkJdGhlIHN0YXJ0aW5nIGJsb2NrIChncm91cCByZWxhdGl2ZSkgb2YgdGhlIHNlYXJjaAotICogQGJoOgkJCWJ1ZmZlcmhlYWQgY29udGFpbnMgdGhlIGJsb2NrIGdyb3VwIGJpdG1hcAotICogQG1heGJsb2NrczoJCXRoZSBlbmRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSBvZiB0aGUgcmVzZXJ2YXRpb24KLSAqCi0gKiBUaGUgYml0bWFwIHNlYXJjaCAtLS0gc2VhcmNoIGZvcndhcmQgYWx0ZXJuYXRlbHkgdGhyb3VnaCB0aGUgYWN0dWFsCi0gKiBiaXRtYXAgb24gZGlzayBhbmQgdGhlIGxhc3QtY29tbWl0dGVkIGNvcHkgaW4gam91cm5hbCwgdW50aWwgd2UgZmluZCBhCi0gKiBiaXQgZnJlZSBpbiBib3RoIGJpdG1hcHMuCi0gKi8KLXN0YXRpYyBleHQ0X2dycGJsa190Ci1iaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGV4dDRfZ3JwYmxrX3Qgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkJCWV4dDRfZ3JwYmxrX3QgbWF4YmxvY2tzKQotewotCWV4dDRfZ3JwYmxrX3QgbmV4dDsKLQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKLQotCXdoaWxlIChzdGFydCA8IG1heGJsb2NrcykgewotCQluZXh0ID0gZXh0NF9maW5kX25leHRfemVyb19iaXQoYmgtPmJfZGF0YSwgbWF4YmxvY2tzLCBzdGFydCk7Ci0JCWlmIChuZXh0ID49IG1heGJsb2NrcykKLQkJCXJldHVybiAtMTsKLQkJaWYgKGV4dDRfdGVzdF9hbGxvY2F0YWJsZShuZXh0LCBiaCkpCi0JCQlyZXR1cm4gbmV4dDsKLQkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwotCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpCi0JCQlzdGFydCA9IGV4dDRfZmluZF9uZXh0X3plcm9fYml0KGpoLT5iX2NvbW1pdHRlZF9kYXRhLAotCQkJCQkJCW1heGJsb2NrcywgbmV4dCk7Ci0JCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKgotICogZmluZF9uZXh0X3VzYWJsZV9ibG9jaygpCi0gKiBAc3RhcnQ6CQl0aGUgc3RhcnRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSB0byBmaW5kIG5leHQKLSAqCQkJYWxsb2NhdGFibGUgYmxvY2sgaW4gYml0bWFwLgotICogQGJoOgkJCWJ1ZmZlcmhlYWQgY29udGFpbnMgdGhlIGJsb2NrIGdyb3VwIGJpdG1hcAotICogQG1heGJsb2NrczoJCXRoZSBlbmRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSBmb3IgdGhlIHNlYXJjaAotICoKLSAqIEZpbmQgYW4gYWxsb2NhdGFibGUgYmxvY2sgaW4gYSBiaXRtYXAuICBXZSBob25vciBib3RoIHRoZSBiaXRtYXAgYW5kCi0gKiBpdHMgbGFzdC1jb21taXR0ZWQgY29weSAoaWYgdGhhdCBleGlzdHMpLCBhbmQgcGVyZm9ybSB0aGUgIm1vc3QKLSAqIGFwcHJvcHJpYXRlIGFsbG9jYXRpb24iIGFsZ29yaXRobSBvZiBsb29raW5nIGZvciBhIGZyZWUgYmxvY2sgbmVhcgotICogdGhlIGluaXRpYWwgZ29hbDsgdGhlbiBmb3IgYSBmcmVlIGJ5dGUgc29tZXdoZXJlIGluIHRoZSBiaXRtYXA7IHRoZW4KLSAqIGZvciBhbnkgZnJlZSBiaXQgaW4gdGhlIGJpdG1hcC4KLSAqLwotc3RhdGljIGV4dDRfZ3JwYmxrX3QKLWZpbmRfbmV4dF91c2FibGVfYmxvY2soZXh0NF9ncnBibGtfdCBzdGFydCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCWV4dDRfZ3JwYmxrX3QgbWF4YmxvY2tzKQotewotCWV4dDRfZ3JwYmxrX3QgaGVyZSwgbmV4dDsKLQljaGFyICpwLCAqcjsKLQotCWlmIChzdGFydCA+IDApIHsKLQkJLyoKLQkJICogVGhlIGdvYWwgd2FzIG9jY3VwaWVkOyBzZWFyY2ggZm9yd2FyZCBmb3IgYSBmcmVlCi0JCSAqIGJsb2NrIHdpdGhpbiB0aGUgbmV4dCBYWCBibG9ja3MuCi0JCSAqCi0JCSAqIGVuZF9nb2FsIGlzIG1vcmUgb3IgbGVzcyByYW5kb20sIGJ1dCBpdCBoYXMgdG8gYmUKLQkJICogbGVzcyB0aGFuIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUC4gQWxpZ25pbmcgdXAgdG8gdGhlCi0JCSAqIG5leHQgNjQtYml0IGJvdW5kYXJ5IGlzIHNpbXBsZS4uCi0JCSAqLwotCQlleHQ0X2dycGJsa190IGVuZF9nb2FsID0gKHN0YXJ0ICsgNjMpICYgfjYzOwotCQlpZiAoZW5kX2dvYWwgPiBtYXhibG9ja3MpCi0JCQllbmRfZ29hbCA9IG1heGJsb2NrczsKLQkJaGVyZSA9IGV4dDRfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIGVuZF9nb2FsLCBzdGFydCk7Ci0JCWlmIChoZXJlIDwgZW5kX2dvYWwgJiYgZXh0NF90ZXN0X2FsbG9jYXRhYmxlKGhlcmUsIGJoKSkKLQkJCXJldHVybiBoZXJlOwotCQlleHQ0X2RlYnVnKCJCaXQgbm90IGZvdW5kIG5lYXIgZ29hbFxuIik7Ci0JfQotCi0JaGVyZSA9IHN0YXJ0OwotCWlmIChoZXJlIDwgMCkKLQkJaGVyZSA9IDA7Ci0KLQlwID0gKChjaGFyICopYmgtPmJfZGF0YSkgKyAoaGVyZSA+PiAzKTsKLQlyID0gbWVtc2NhbihwLCAwLCAoKG1heGJsb2NrcyArIDcpID4+IDMpIC0gKGhlcmUgPj4gMykpOwotCW5leHQgPSAociAtICgoY2hhciAqKWJoLT5iX2RhdGEpKSA8PCAzOwotCi0JaWYgKG5leHQgPCBtYXhibG9ja3MgJiYgbmV4dCA+PSBzdGFydCAmJiBleHQ0X3Rlc3RfYWxsb2NhdGFibGUobmV4dCwgYmgpKQotCQlyZXR1cm4gbmV4dDsKLQotCS8qCi0JICogVGhlIGJpdG1hcCBzZWFyY2ggLS0tIHNlYXJjaCBmb3J3YXJkIGFsdGVybmF0ZWx5IHRocm91Z2ggdGhlIGFjdHVhbAotCSAqIGJpdG1hcCBhbmQgdGhlIGxhc3QtY29tbWl0dGVkIGNvcHkgdW50aWwgd2UgZmluZCBhIGJpdCBmcmVlIGluCi0JICogYm90aAotCSAqLwotCWhlcmUgPSBiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGhlcmUsIGJoLCBtYXhibG9ja3MpOwotCXJldHVybiBoZXJlOwotfQotCi0vKioKLSAqIGNsYWltX2Jsb2NrKCkKLSAqIEBibG9jazoJCXRoZSBmcmVlIGJsb2NrIChncm91cCByZWxhdGl2ZSkgdG8gYWxsb2NhdGUKLSAqIEBiaDoJCQl0aGUgYnVmZmVyaGVhZCBjb250YWludHMgdGhlIGJsb2NrIGdyb3VwIGJpdG1hcAotICoKLSAqIFdlIHRoaW5rIHdlIGNhbiBhbGxvY2F0ZSB0aGlzIGJsb2NrIGluIHRoaXMgYml0bWFwLiAgVHJ5IHRvIHNldCB0aGUgYml0LgotICogSWYgdGhhdCBzdWNjZWVkcyB0aGVuIGNoZWNrIHRoYXQgbm9ib2R5IGhhcyBhbGxvY2F0ZWQgYW5kIHRoZW4gZnJlZWQgdGhlCi0gKiBibG9jayBzaW5jZSB3ZSBzYXcgdGhhdCBpcyB3YXMgbm90IG1hcmtlZCBpbiBiX2NvbW1pdHRlZF9kYXRhLiAgSWYgaXQgX3dhc18KLSAqIGFsbG9jYXRlZCBhbmQgZnJlZWQgdGhlbiBjbGVhciB0aGUgYml0IGluIHRoZSBiaXRtYXAgYWdhaW4gYW5kIHJldHVybgotICogemVybyAoZmFpbHVyZSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1jbGFpbV9ibG9jayhzcGlubG9ja190ICpsb2NrLCBleHQ0X2dycGJsa190IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOwotCWludCByZXQ7Ci0KLQlpZiAoZXh0NF9zZXRfYml0X2F0b21pYyhsb2NrLCBibG9jaywgYmgtPmJfZGF0YSkpCi0JCXJldHVybiAwOwotCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKLQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEgJiYgZXh0NF90ZXN0X2JpdChibG9jayxqaC0+Yl9jb21taXR0ZWRfZGF0YSkpIHsKLQkJZXh0NF9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGJsb2NrLCBiaC0+Yl9kYXRhKTsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlyZXQgPSAxOwotCX0KLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGV4dDRfdHJ5X3RvX2FsbG9jYXRlKCkKLSAqIEBzYjoJCQlzdXBlcmJsb2NrCi0gKiBAaGFuZGxlOgkJaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBncm91cDoJCWdpdmVuIGFsbG9jYXRpb24gYmxvY2sgZ3JvdXAKLSAqIEBiaXRtYXBfYmg6CQlidWZmZXJoZWFkIGhvbGRzIHRoZSBibG9jayBiaXRtYXAKLSAqIEBncnBfZ29hbDoJCWdpdmVuIHRhcmdldCBibG9jayB3aXRoaW4gdGhlIGdyb3VwCi0gKiBAY291bnQ6CQl0YXJnZXQgbnVtYmVyIG9mIGJsb2NrcyB0byBhbGxvY2F0ZQotICogQG15X3JzdjoJCXJlc2VydmF0aW9uIHdpbmRvdwotICoKLSAqIEF0dGVtcHQgdG8gYWxsb2NhdGUgYmxvY2tzIHdpdGhpbiBhIGdpdmUgcmFuZ2UuIFNldCB0aGUgcmFuZ2Ugb2YgYWxsb2NhdGlvbgotICogZmlyc3QsIHRoZW4gZmluZCB0aGUgZmlyc3QgZnJlZSBiaXQocykgZnJvbSB0aGUgYml0bWFwICh3aXRoaW4gdGhlIHJhbmdlKSwKLSAqIGFuZCBhdCBsYXN0LCBhbGxvY2F0ZSB0aGUgYmxvY2tzIGJ5IGNsYWltaW5nIHRoZSBmb3VuZCBmcmVlIGJpdCBhcyBhbGxvY2F0ZWQuCi0gKgotICogVG8gc2V0IHRoZSByYW5nZSBvZiB0aGlzIGFsbG9jYXRpb246Ci0gKglpZiB0aGVyZSBpcyBhIHJlc2VydmF0aW9uIHdpbmRvdywgb25seSB0cnkgdG8gYWxsb2NhdGUgYmxvY2socykgZnJvbSB0aGUKLSAqCWZpbGUncyBvd24gcmVzZXJ2YXRpb24gd2luZG93OwotICoJT3RoZXJ3aXNlLCB0aGUgYWxsb2NhdGlvbiByYW5nZSBzdGFydHMgZnJvbSB0aGUgZ2l2ZSBnb2FsIGJsb2NrLCBlbmRzIGF0Ci0gKgl0aGUgYmxvY2sgZ3JvdXAncyBsYXN0IGJsb2NrLgotICoKLSAqIElmIHdlIGZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgZGVzaXJlZCBibG9jayB0aGVuIHdlIG1heSBlbmQgdXAgY3Jvc3NpbmcgdG8gYQotICogbmV3IGJpdG1hcC4gIEluIHRoYXQgY2FzZSB3ZSBtdXN0IHJlbGVhc2Ugd3JpdGUgYWNjZXNzIHRvIHRoZSBvbGQgb25lIHZpYQotICogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKCksIGVsc2Ugd2UnbGwgcnVuIG91dCBvZiBjcmVkaXRzLgotICovCi1zdGF0aWMgZXh0NF9ncnBibGtfdAotZXh0NF90cnlfdG9fYWxsb2NhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCWV4dDRfZ3JvdXBfdCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCi0JCQlleHQ0X2dycGJsa190IGdycF9nb2FsLCB1bnNpZ25lZCBsb25nICpjb3VudCwKLQkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93ICpteV9yc3YpCi17Ci0JZXh0NF9mc2Jsa190IGdyb3VwX2ZpcnN0X2Jsb2NrOwotCWV4dDRfZ3JwYmxrX3Qgc3RhcnQsIGVuZDsKLQl1bnNpZ25lZCBsb25nIG51bSA9IDA7Ci0KLQkvKiB3ZSBkbyBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGlmIHdlIGhhdmUgYSB3aW5kb3cgKi8KLQlpZiAobXlfcnN2KSB7Ci0JCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOwotCQlpZiAobXlfcnN2LT5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrKQotCQkJc3RhcnQgPSBteV9yc3YtPl9yc3Zfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jazsKLQkJZWxzZQotCQkJLyogcmVzZXJ2YXRpb24gd2luZG93IGNyb3NzIGdyb3VwIGJvdW5kYXJ5ICovCi0JCQlzdGFydCA9IDA7Ci0JCWVuZCA9IG15X3Jzdi0+X3Jzdl9lbmQgLSBncm91cF9maXJzdF9ibG9jayArIDE7Ci0JCWlmIChlbmQgPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQotCQkJLyogcmVzZXJ2YXRpb24gd2luZG93IGNyb3NzZXMgZ3JvdXAgYm91bmRhcnkgKi8KLQkJCWVuZCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7Ci0JCWlmICgoc3RhcnQgPD0gZ3JwX2dvYWwpICYmIChncnBfZ29hbCA8IGVuZCkpCi0JCQlzdGFydCA9IGdycF9nb2FsOwotCQllbHNlCi0JCQlncnBfZ29hbCA9IC0xOwotCX0gZWxzZSB7Ci0JCWlmIChncnBfZ29hbCA+IDApCi0JCQlzdGFydCA9IGdycF9nb2FsOwotCQllbHNlCi0JCQlzdGFydCA9IDA7Ci0JCWVuZCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7Ci0JfQotCi0JQlVHX09OKHN0YXJ0ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7Ci0KLXJlcGVhdDoKLQlpZiAoZ3JwX2dvYWwgPCAwIHx8ICFleHQ0X3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKLQkJZ3JwX2dvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7Ci0JCWlmIChncnBfZ29hbCA8IDApCi0JCQlnb3RvIGZhaWxfYWNjZXNzOwotCQlpZiAoIW15X3JzdikgewotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCA3ICYmIGdycF9nb2FsID4gc3RhcnQgJiYKLQkJCQkJZXh0NF90ZXN0X2FsbG9jYXRhYmxlKGdycF9nb2FsIC0gMSwKLQkJCQkJCQkJYml0bWFwX2JoKTsKLQkJCQkJaSsrLCBncnBfZ29hbC0tKQotCQkJCTsKKwlpZiAoZnJlZV9ibG9ja3MgLSAobmJsb2NrcyArIHJvb3RfYmxvY2tzICsgZGlydHlfYmxvY2tzKSA8CisJCQkJCQlFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLKSB7CisJCWZyZWVfYmxvY2tzICA9IHBlcmNwdV9jb3VudGVyX3N1bShmYmMpOworCQlkaXJ0eV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9zdW0oZGJjKTsKKwkJaWYgKGRpcnR5X2Jsb2NrcyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkRpcnR5IGJsb2NrIGFjY291bnRpbmcgIgorCQkJCQkid2VudCB3cm9uZyAlbGxkXG4iLAorCQkJCQlkaXJ0eV9ibG9ja3MpOwogCQl9CiAJfQotCXN0YXJ0ID0gZ3JwX2dvYWw7Ci0KLQlpZiAoIWNsYWltX2Jsb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBncm91cCksCi0JCWdycF9nb2FsLCBiaXRtYXBfYmgpKSB7Ci0JCS8qCi0JCSAqIFRoZSBibG9jayB3YXMgYWxsb2NhdGVkIGJ5IGFub3RoZXIgdGhyZWFkLCBvciBpdCB3YXMKLQkJICogYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIGJ5IGFub3RoZXIgdGhyZWFkCi0JCSAqLwotCQlzdGFydCsrOwotCQlncnBfZ29hbCsrOwotCQlpZiAoc3RhcnQgPj0gZW5kKQotCQkJZ290byBmYWlsX2FjY2VzczsKLQkJZ290byByZXBlYXQ7Ci0JfQotCW51bSsrOwotCWdycF9nb2FsKys7Ci0Jd2hpbGUgKG51bSA8ICpjb3VudCAmJiBncnBfZ29hbCA8IGVuZAotCQkmJiBleHQ0X3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkKLQkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGdyb3VwKSwKLQkJCQlncnBfZ29hbCwgYml0bWFwX2JoKSkgewotCQludW0rKzsKLQkJZ3JwX2dvYWwrKzsKLQl9Ci0JKmNvdW50ID0gbnVtOwotCXJldHVybiBncnBfZ29hbCAtIG51bTsKLWZhaWxfYWNjZXNzOgotCSpjb3VudCA9IG51bTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKgotICoJZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KCk6Ci0gKgkJZmluZCBhIHJlc2VydmFibGUgc3BhY2Ugd2l0aGluIHRoZSBnaXZlbiByYW5nZS4KLSAqCQlJdCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGZvciBub3c6Ci0gKgkJYWxsb2NfbmV3X3Jlc2VydmF0aW9uKCkgd2lsbCBkbyB0aGUgd29yayBsYXRlci4KLSAqCi0gKglAc2VhcmNoX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBzZWFyY2hpbmcgbGlzdDsKLSAqCQlUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgbGlzdCBoZWFkIG9mIHRoZSB3aG9sZSBmaWxlc3lzdGVtCi0gKgotICoJCVdlIGhhdmUgYm90aCBoZWFkIGFuZCBzdGFydF9ibG9jayB0byBhc3Npc3QgdGhlIHNlYXJjaAotICoJCWZvciB0aGUgcmVzZXJ2YWJsZSBzcGFjZS4gVGhlIGxpc3Qgc3RhcnRzIGZyb20gaGVhZCwKLSAqCQlidXQgd2Ugd2lsbCBzaGlmdCB0byB0aGUgcGxhY2Ugd2hlcmUgc3RhcnRfYmxvY2sgaXMsCi0gKgkJdGhlbiBzdGFydCBmcm9tIHRoZXJlLCB3aGVuIGxvb2tpbmcgZm9yIGEgcmVzZXJ2YWJsZSBzcGFjZS4KLSAqCi0gKglAc2l6ZTogdGhlIHRhcmdldCBuZXcgcmVzZXJ2YXRpb24gd2luZG93IHNpemUKLSAqCi0gKglAZ3JvdXBfZmlyc3RfYmxvY2s6IHRoZSBmaXJzdCBibG9jayB3ZSBjb25zaWRlciB0byBzdGFydAotICoJCQl0aGUgcmVhbCBzZWFyY2ggZnJvbQotICoKLSAqCUBsYXN0X2Jsb2NrOgotICoJCXRoZSBtYXhpbXVtIGJsb2NrIG51bWJlciB0aGF0IG91ciBnb2FsIHJlc2VydmFibGUgc3BhY2UKLSAqCQljb3VsZCBzdGFydCBmcm9tLiBUaGlzIGlzIG5vcm1hbGx5IHRoZSBsYXN0IGJsb2NrIGluIHRoaXMKLSAqCQlncm91cC4gVGhlIHNlYXJjaCB3aWxsIGVuZCB3aGVuIHdlIGZvdW5kIHRoZSBzdGFydCBvZiBuZXh0Ci0gKgkJcG9zc2libGUgcmVzZXJ2YWJsZSBzcGFjZSBpcyBvdXQgb2YgdGhpcyBib3VuZGFyeS4KLSAqCQlUaGlzIGNvdWxkIGhhbmRsZSB0aGUgY3Jvc3MgYm91bmRhcnkgcmVzZXJ2YXRpb24gd2luZG93Ci0gKgkJcmVxdWVzdC4KLSAqCi0gKgliYXNpY2FsbHkgd2Ugc2VhcmNoIGZyb20gdGhlIGdpdmVuIHJhbmdlLCByYXRoZXIgdGhhbiB0aGUgd2hvbGUKLSAqCXJlc2VydmF0aW9uIGRvdWJsZSBsaW5rZWQgbGlzdCwgKHN0YXJ0X2Jsb2NrLCBsYXN0X2Jsb2NrKQotICoJdG8gZmluZCBhIGZyZWUgcmVnaW9uIHRoYXQgaXMgb2YgbXkgc2l6ZSBhbmQgaGFzIG5vdAotICoJYmVlbiByZXNlcnZlZC4KLSAqCi0gKi8KLXN0YXRpYyBpbnQgZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KAotCQkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKnNlYXJjaF9oZWFkLAotCQkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKLQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKLQkJCQlleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxvY2ssCi0JCQkJZXh0NF9mc2Jsa190IGxhc3RfYmxvY2spCi17Ci0Jc3RydWN0IHJiX25vZGUgKm5leHQ7Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2LCAqcHJldjsKLQlleHQ0X2ZzYmxrX3QgY3VyOwotCWludCBzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOwotCi0JLyogVE9ETzogbWFrZSB0aGUgc3RhcnQgb2YgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBieXRlLWFsaWduZWQgKi8KLQkvKiBjdXIgPSAqc3RhcnRfYmxvY2sgJiB+NzsqLwotCWN1ciA9IHN0YXJ0X2Jsb2NrOwotCXJzdiA9IHNlYXJjaF9oZWFkOwotCWlmICghcnN2KQotCQlyZXR1cm4gLTE7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAoY3VyIDw9IHJzdi0+cnN2X2VuZCkKLQkJCWN1ciA9IHJzdi0+cnN2X2VuZCArIDE7Ci0KLQkJLyogVE9ETz8KLQkJICogaW4gdGhlIGNhc2Ugd2UgY291bGQgbm90IGZpbmQgYSByZXNlcnZhYmxlIHNwYWNlCi0JCSAqIHRoYXQgaXMgd2hhdCBpcyBleHBlY3RlZCwgZHVyaW5nIHRoZSByZS1zZWFyY2gsIHdlIGNvdWxkCi0JCSAqIHJlbWVtYmVyIHdoYXQncyB0aGUgbGFyZ2VzdCByZXNlcnZhYmxlIHNwYWNlIHdlIGNvdWxkIGhhdmUKLQkJICogYW5kIHJldHVybiB0aGF0IG9uZS4KLQkJICoKLQkJICogRm9yIG5vdyBpdCB3aWxsIGZhaWwgaWYgd2UgY291bGQgbm90IGZpbmQgdGhlIHJlc2VydmFibGUKLQkJICogc3BhY2Ugd2l0aCBleHBlY3RlZC1zaXplIChvciBtb3JlKS4uLgotCQkgKi8KLQkJaWYgKGN1ciA+IGxhc3RfYmxvY2spCi0JCQlyZXR1cm4gLTE7CQkvKiBmYWlsICovCi0KLQkJcHJldiA9IHJzdjsKLQkJbmV4dCA9IHJiX25leHQoJnJzdi0+cnN2X25vZGUpOwotCQlyc3YgPSByYl9lbnRyeShuZXh0LHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOwotCi0JCS8qCi0JCSAqIFJlYWNoZWQgdGhlIGxhc3QgcmVzZXJ2YXRpb24sIHdlIGNhbiBqdXN0IGFwcGVuZCB0byB0aGUKLQkJICogcHJldmlvdXMgb25lLgotCQkgKi8KLQkJaWYgKCFuZXh0KQotCQkJYnJlYWs7Ci0KLQkJaWYgKGN1ciArIHNpemUgPD0gcnN2LT5yc3Zfc3RhcnQpIHsKLQkJCS8qCi0JCQkgKiBGb3VuZCBhIHJlc2VydmVhYmxlIHNwYWNlIGJpZyBlbm91Z2guICBXZSBjb3VsZAotCQkJICogaGF2ZSBhIHJlc2VydmF0aW9uIGFjcm9zcyB0aGUgZ3JvdXAgYm91bmRhcnkgaGVyZQotCQkJICovCi0JCQlicmVhazsKLQkJfQotCX0KLQkvKgotCSAqIHdlIGNvbWUgaGVyZSBlaXRoZXIgOgotCSAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgd2hvbGUgbGlzdCwKLQkgKiBhbmQgdGhlcmUgaXMgZW1wdHkgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciBsYXN0IGVudHJ5IGluIHRoZSBsaXN0LgotCSAqIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqCi0JICogb3Igd2UgZm91bmQgb25lIHJlc2VydmFibGUgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCwKLQkgKiByZXR1cm4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGF0IHdlIGNvdWxkIGFwcGVuZCB0by4KLQkgKiBzdWNjZWVkLgorCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBzcGFjZSBhZnRlcgorCSAqIGFjY291bnRpbmcgZm9yIGN1cnJlbnQgZGlydHkgYmxvY2tzCiAJICovCisJaWYgKGZyZWVfYmxvY2tzIDwgKChyb290X2Jsb2NrcyArIG5ibG9ja3MpICsgZGlydHlfYmxvY2tzKSkKKwkJLyogd2UgZG9uJ3QgaGF2ZSBmcmVlIHNwYWNlICovCisJCXJldHVybiAtRU5PU1BDOwogCi0JaWYgKChwcmV2ICE9IG15X3JzdikgJiYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpKQotCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKLQotCS8qCi0JICogTGV0J3MgYm9vayB0aGUgd2hvbGUgYXZhbGlhYmxlIHdpbmRvdyBmb3Igbm93LiAgV2Ugd2lsbCBjaGVjayB0aGUKLQkgKiBkaXNrIGJpdG1hcCBsYXRlciBhbmQgdGhlbiwgaWYgdGhlcmUgYXJlIGZyZWUgYmxvY2tzIHRoZW4gd2UgYWRqdXN0Ci0JICogdGhlIHdpbmRvdyBzaXplIGlmIGl0J3MgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkLgotCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCByZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIHRyZWUgbmV4dCB0aW1lCi0JICogY2FsbCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3cuCi0JICovCi0JbXlfcnN2LT5yc3Zfc3RhcnQgPSBjdXI7Ci0JbXlfcnN2LT5yc3ZfZW5kID0gY3VyICsgc2l6ZSAtIDE7Ci0JbXlfcnN2LT5yc3ZfYWxsb2NfaGl0ID0gMDsKLQotCWlmIChwcmV2ICE9IG15X3JzdikKLQkJZXh0NF9yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKLQorCS8qIEFkZCB0aGUgYmxvY2tzIHRvIG5ibG9ja3MgKi8KKwlwZXJjcHVfY291bnRlcl9hZGQoZGJjLCBuYmxvY2tzKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKglhbGxvY19uZXdfcmVzZXJ2YXRpb24oKS0tYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93Ci0gKgotICoJCVRvIG1ha2UgYSBuZXcgcmVzZXJ2YXRpb24sIHdlIHNlYXJjaCBwYXJ0IG9mIHRoZSBmaWxlc3lzdGVtCi0gKgkJcmVzZXJ2YXRpb24gbGlzdCAodGhlIGxpc3QgdGhhdCBpbnNpZGUgdGhlIGdyb3VwKS4gV2UgdHJ5IHRvCi0gKgkJYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93IG5lYXIgdGhlIGFsbG9jYXRpb24gZ29hbCwKLSAqCQlvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncm91cCwgaWYgdGhlcmUgaXMgbm8gZ29hbC4KLSAqCi0gKgkJV2UgZmlyc3QgZmluZCBhIHJlc2VydmFibGUgc3BhY2UgYWZ0ZXIgdGhlIGdvYWwsIHRoZW4gZnJvbQotICoJCXRoZXJlLCB3ZSBjaGVjayB0aGUgYml0bWFwIGZvciB0aGUgZmlyc3QgZnJlZSBibG9jayBhZnRlcgotICoJCWl0LiBJZiB0aGVyZSBpcyBubyBmcmVlIGJsb2NrIHVudGlsIHRoZSBlbmQgb2YgZ3JvdXAsIHRoZW4gdGhlCi0gKgkJd2hvbGUgZ3JvdXAgaXMgZnVsbCwgd2UgZmFpbGVkLiBPdGhlcndpc2UsIGNoZWNrIGlmIHRoZSBmcmVlCi0gKgkJYmxvY2sgaXMgaW5zaWRlIHRoZSBleHBlY3RlZCByZXNlcnZhYmxlIHNwYWNlLCBpZiBzbywgd2UKLSAqCQlzdWNjZWVkLgotICoJCUlmIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGlzIG91dHNpZGUgdGhlIHJlc2VydmFibGUgc3BhY2UsIHRoZW4KLSAqCQlzdGFydCBmcm9tIHRoZSBmaXJzdCBmcmVlIGJsb2NrLCB3ZSBzZWFyY2ggZm9yIG5leHQgYXZhaWxhYmxlCi0gKgkJc3BhY2UsIGFuZCBnbyBvbi4KLSAqCi0gKglvbiBzdWNjZWVkLCBhIG5ldyByZXNlcnZhdGlvbiB3aWxsIGJlIGZvdW5kIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0Ci0gKglJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZnJlZSBibG9jaywgYW5kIGl0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCBvdGhlcgotICoJcmVzZXJ2YXRpb24gd2luZG93cy4KLSAqCi0gKglmYWlsZWQ6IHdlIGZhaWxlZCB0byBmaW5kIGEgcmVzZXJ2YXRpb24gd2luZG93IGluIHRoaXMgZ3JvdXAKLSAqCi0gKglAcnN2OiB0aGUgcmVzZXJ2YXRpb24KLSAqCi0gKglAZ3JwX2dvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCi0gKgkJZnJlZSByZXNlcnZhYmxlIHNwYWNlIHNob3VsZCBzdGFydCBmcm9tLgotICoJCWlmIHdlIGhhdmUgYSBncnBfZ29hbChncnBfZ29hbCA+MCApLCB0aGVuIHN0YXJ0IGZyb20gdGhlcmUsCi0gKgkJbm8gZ3JwX2dvYWwoZ3JwX2dvYWwgPSAtMSksIHdlIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGJsb2NrCi0gKgkJb2YgdGhlIGdyb3VwLgotICoKLSAqCUBzYjogdGhlIHN1cGVyIGJsb2NrCi0gKglAZ3JvdXA6IHRoZSBncm91cCB3ZSBhcmUgdHJ5aW5nIHRvIGFsbG9jYXRlIGluCi0gKglAYml0bWFwX2JoOiB0aGUgYmxvY2sgZ3JvdXAgYmxvY2sgYml0bWFwCi0gKgotICovCi1zdGF0aWMgaW50IGFsbG9jX25ld19yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpteV9yc3YsCi0JCWV4dDRfZ3JwYmxrX3QgZ3JwX2dvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCWV4dDRfZ3JvdXBfdCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgpCi17Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQ7Ci0JZXh0NF9mc2Jsa190IGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2ssIHN0YXJ0X2Jsb2NrOwotCWV4dDRfZ3JwYmxrX3QgZmlyc3RfZnJlZV9ibG9jazsKLQlzdHJ1Y3QgcmJfcm9vdCAqZnNfcnN2X3Jvb3QgPSAmRVhUNF9TQihzYiktPnNfcnN2X3dpbmRvd19yb290OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlpbnQgcmV0OwotCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDRfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKLQotCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOwotCWdyb3VwX2VuZF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrICsgKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKTsKLQotCWlmIChncnBfZ29hbCA8IDApCi0JCXN0YXJ0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2s7Ci0JZWxzZQotCQlzdGFydF9ibG9jayA9IGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2s7Ci0KLQlzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOwotCi0JaWYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpIHsKLQkJLyoKLQkJICogaWYgdGhlIG9sZCByZXNlcnZhdGlvbiBpcyBjcm9zcyBncm91cCBib3VuZGFyeQotCQkgKiBhbmQgaWYgdGhlIGdvYWwgaXMgaW5zaWRlIHRoZSBvbGQgcmVzZXJ2YXRpb24gd2luZG93LAotCQkgKiB3ZSB3aWxsIGNvbWUgaGVyZSB3aGVuIHdlIGp1c3QgZmFpbGVkIHRvIGFsbG9jYXRlIGZyb20KLQkJICogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdpbmRvdy4gV2Ugc3RpbGwgaGF2ZSBhbm90aGVyIHBhcnQKLQkJICogdGhhdCBiZWxvbmdzIHRvIHRoZSBuZXh0IGdyb3VwLiBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vCi0JCSAqIHBvaW50IHRvIGRpc2NhcmQgb3VyIHdpbmRvdyBhbmQgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IG9uZQotCQkgKiBpbiB0aGlzIGdyb3VwKHdoaWNoIHdpbGwgZmFpbCkuIHdlIHNob3VsZAotCQkgKiBrZWVwIHRoZSByZXNlcnZhdGlvbiB3aW5kb3csIGp1c3Qgc2ltcGx5IG1vdmUgb24uCi0JCSAqCi0JCSAqIE1heWJlIHdlIGNvdWxkIHNoaWZ0IHRoZSBzdGFydCBibG9jayBvZiB0aGUgcmVzZXJ2YXRpb24KLQkJICogd2luZG93IHRvIHRoZSBmaXJzdCBibG9jayBvZiBuZXh0IGdyb3VwLgotCQkgKi8KLQotCQlpZiAoKG15X3Jzdi0+cnN2X3N0YXJ0IDw9IGdyb3VwX2VuZF9ibG9jaykgJiYKLQkJCQkobXlfcnN2LT5yc3ZfZW5kID4gZ3JvdXBfZW5kX2Jsb2NrKSAmJgotCQkJCShzdGFydF9ibG9jayA+PSBteV9yc3YtPnJzdl9zdGFydCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKChteV9yc3YtPnJzdl9hbGxvY19oaXQgPgotCQkgICAgIChteV9yc3YtPnJzdl9lbmQgLSBteV9yc3YtPnJzdl9zdGFydCArIDEpIC8gMikpIHsKLQkJCS8qCi0JCQkgKiBpZiB0aGUgcHJldmlvdXNseSBhbGxvY2F0aW9uIGhpdCByYXRpbyBpcwotCQkJICogZ3JlYXRlciB0aGFuIDEvMiwgdGhlbiB3ZSBkb3VibGUgdGhlIHNpemUgb2YKLQkJCSAqIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgdGhlIG5leHQgdGltZSwKLQkJCSAqIG90aGVyd2lzZSB3ZSBrZWVwIHRoZSBzYW1lIHNpemUgd2luZG93Ci0JCQkgKi8KLQkJCXNpemUgPSBzaXplICogMjsKLQkJCWlmIChzaXplID4gRVhUNF9NQVhfUkVTRVJWRV9CTE9DS1MpCi0JCQkJc2l6ZSA9IEVYVDRfTUFYX1JFU0VSVkVfQkxPQ0tTOwotCQkJbXlfcnN2LT5yc3ZfZ29hbF9zaXplPSBzaXplOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrKHJzdl9sb2NrKTsKLQkvKgotCSAqIHNoaWZ0IHRoZSBzZWFyY2ggc3RhcnQgdG8gdGhlIHdpbmRvdyBuZWFyIHRoZSBnb2FsIGJsb2NrCi0JICovCi0Jc2VhcmNoX2hlYWQgPSBzZWFyY2hfcmVzZXJ2ZV93aW5kb3coZnNfcnN2X3Jvb3QsIHN0YXJ0X2Jsb2NrKTsKLQotCS8qCi0JICogZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KCkgc2ltcGx5IGZpbmRzIGEgcmVzZXJ2YWJsZSB3aW5kb3cKLQkgKiBpbnNpZGUgdGhlIGdpdmVuIHJhbmdlKHN0YXJ0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2spLgotCSAqCi0JICogVG8gbWFrZSBzdXJlIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgaGFzIGEgZnJlZSBiaXQgaW5zaWRlIGl0LCB3ZQotCSAqIG5lZWQgdG8gY2hlY2sgdGhlIGJpdG1hcCBhZnRlciB3ZSBmb3VuZCBhIHJlc2VydmFibGUgd2luZG93LgotCSAqLwotcmV0cnk6Ci0JcmV0ID0gZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KHNlYXJjaF9oZWFkLCBteV9yc3YsIHNiLAotCQkJCQkJc3RhcnRfYmxvY2ssIGdyb3VwX2VuZF9ibG9jayk7Ci0KLQlpZiAocmV0ID09IC0xKSB7Ci0JCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQotCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7Ci0JCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogT24gc3VjY2VzcywgZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KCkgcmV0dXJucyB0aGUKLQkgKiByZXNlcnZhdGlvbiB3aW5kb3cgd2hlcmUgdGhlcmUgaXMgYSByZXNlcnZhYmxlIHNwYWNlIGFmdGVyIGl0LgotCSAqIEJlZm9yZSB3ZSByZXNlcnZlIHRoaXMgcmVzZXJ2YWJsZSBzcGFjZSwgd2UgbmVlZAotCSAqIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBhIGZyZWUgYmxvY2sgaW5zaWRlIHRoaXMgcmVnaW9uLgotCSAqCi0JICogc2VhcmNoaW5nIHRoZSBmaXJzdCBmcmVlIGJpdCBvbiB0aGUgYmxvY2sgYml0bWFwIGFuZCBjb3B5IG9mCi0JICogbGFzdCBjb21taXR0ZWQgYml0bWFwIGFsdGVybmF0aXZlbHksIHVudGlsIHdlIGZvdW5kIGEgYWxsb2NhdGFibGUKLQkgKiBibG9jay4gU2VhcmNoIHN0YXJ0IGZyb20gdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZSByZXNlcnZhYmxlIHNwYWNlCi0JICogd2UganVzdCBmb3VuZC4KLQkgKi8KLQlzcGluX3VubG9jayhyc3ZfbG9jayk7Ci0JZmlyc3RfZnJlZV9ibG9jayA9IGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soCi0JCQlteV9yc3YtPnJzdl9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrLAotCQkJYml0bWFwX2JoLCBncm91cF9lbmRfYmxvY2sgLSBncm91cF9maXJzdF9ibG9jayArIDEpOwotCi0JaWYgKGZpcnN0X2ZyZWVfYmxvY2sgPCAwKSB7Ci0JCS8qCi0JCSAqIG5vIGZyZWUgYmxvY2sgbGVmdCBvbiB0aGUgYml0bWFwLCBubyBwb2ludAotCQkgKiB0byByZXNlcnZlIHRoZSBzcGFjZS4gcmV0dXJuIGZhaWxlZC4KLQkJICovCi0JCXNwaW5fbG9jayhyc3ZfbG9jayk7Ci0JCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQotCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7Ci0JCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKLQkJcmV0dXJuIC0xOwkJLyogZmFpbGVkICovCi0JfQotCi0Jc3RhcnRfYmxvY2sgPSBmaXJzdF9mcmVlX2Jsb2NrICsgZ3JvdXBfZmlyc3RfYmxvY2s7Ci0JLyoKLQkgKiBjaGVjayBpZiB0aGUgZmlyc3QgZnJlZSBibG9jayBpcyB3aXRoaW4gdGhlCi0JICogZnJlZSBzcGFjZSB3ZSBqdXN0IHJlc2VydmVkCi0JICovCi0JaWYgKHN0YXJ0X2Jsb2NrID49IG15X3Jzdi0+cnN2X3N0YXJ0ICYmIHN0YXJ0X2Jsb2NrIDw9IG15X3Jzdi0+cnN2X2VuZCkKLQkJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCi0JLyoKLQkgKiBpZiB0aGUgZmlyc3QgZnJlZSBiaXQgd2UgZm91bmQgaXMgb3V0IG9mIHRoZSByZXNlcnZhYmxlIHNwYWNlCi0JICogY29udGludWUgc2VhcmNoIGZvciBuZXh0IHJlc2VydmFibGUgc3BhY2UsCi0JICogc3RhcnQgZnJvbSB3aGVyZSB0aGUgZnJlZSBibG9jayBpcywKLQkgKiB3ZSBhbHNvIHNoaWZ0IHRoZSBsaXN0IGhlYWQgdG8gd2hlcmUgd2Ugc3RvcHBlZCBsYXN0IHRpbWUKLQkgKi8KLQlzZWFyY2hfaGVhZCA9IG15X3JzdjsKLQlzcGluX2xvY2socnN2X2xvY2spOwotCWdvdG8gcmV0cnk7Ci19Ci0KLS8qKgotICogdHJ5X3RvX2V4dGVuZF9yZXNlcnZhdGlvbigpCi0gKiBAbXlfcnN2OgkJZ2l2ZW4gcmVzZXJ2YXRpb24gd2luZG93Ci0gKiBAc2I6CQkJc3VwZXIgYmxvY2sKLSAqIEBzaXplOgkJdGhlIGRlbHRhIHRvIGV4dGVuZAotICoKLSAqIEF0dGVtcHQgdG8gZXhwYW5kIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgbGFyZ2UgZW5vdWdoIHRvIGhhdmUKLSAqIHJlcXVpcmVkIG51bWJlciBvZiBmcmVlIGJsb2NrcwotICoKLSAqIFNpbmNlIGV4dDRfdHJ5X3RvX2FsbG9jYXRlKCkgd2lsbCBhbHdheXMgYWxsb2NhdGUgYmxvY2tzIHdpdGhpbgotICogdGhlIHJlc2VydmF0aW9uIHdpbmRvdyByYW5nZSwgaWYgdGhlIHdpbmRvdyBzaXplIGlzIHRvbyBzbWFsbCwKLSAqIG11bHRpcGxlIGJsb2NrcyBhbGxvY2F0aW9uIGhhcyB0byBzdG9wIGF0IHRoZSBlbmQgb2YgdGhlIHJlc2VydmF0aW9uCi0gKiB3aW5kb3cuIFRvIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudCwgZ2l2ZW4gdGhlIHRvdGFsIG51bWJlciBvZgotICogYmxvY2tzIG5lZWRlZCBhbmQgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LCB3ZSB0cnkgdG8KLSAqIGV4cGFuZCB0aGUgcmVzZXJ2YXRpb24gd2luZG93IHNpemUgaWYgbmVjZXNzYXJ5IG9uIGEgYmVzdC1lZmZvcnQKLSAqIGJhc2lzIGJlZm9yZSBleHQ0X25ld19ibG9ja3MoKSB0cmllcyB0byBhbGxvY2F0ZSBibG9ja3MsCi0gKi8KLXN0YXRpYyB2b2lkIHRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24oc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAotCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbmV4dF9yc3Y7Ci0Jc3RydWN0IHJiX25vZGUgKm5leHQ7Ci0Jc3BpbmxvY2tfdCAqcnN2X2xvY2sgPSAmRVhUNF9TQihzYiktPnNfcnN2X3dpbmRvd19sb2NrOwotCi0JaWYgKCFzcGluX3RyeWxvY2socnN2X2xvY2spKQotCQlyZXR1cm47Ci0KLQluZXh0ID0gcmJfbmV4dCgmbXlfcnN2LT5yc3Zfbm9kZSk7Ci0KLQlpZiAoIW5leHQpCi0JCW15X3Jzdi0+cnN2X2VuZCArPSBzaXplOwotCWVsc2UgewotCQluZXh0X3JzdiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKLQotCQlpZiAoKG5leHRfcnN2LT5yc3Zfc3RhcnQgLSBteV9yc3YtPnJzdl9lbmQgLSAxKSA+PSBzaXplKQotCQkJbXlfcnN2LT5yc3ZfZW5kICs9IHNpemU7Ci0JCWVsc2UKLQkJCW15X3Jzdi0+cnN2X2VuZCA9IG5leHRfcnN2LT5yc3Zfc3RhcnQgLSAxOwotCX0KLQlzcGluX3VubG9jayhyc3ZfbG9jayk7Ci19Ci0KLS8qKgotICogZXh0NF90cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3YoKQotICogQHNiOgkJCXN1cGVyYmxvY2sKLSAqIEBoYW5kbGU6CQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgotICogQGdyb3VwOgkJZ2l2ZW4gYWxsb2NhdGlvbiBibG9jayBncm91cAotICogQGJpdG1hcF9iaDoJCWJ1ZmZlcmhlYWQgaG9sZHMgdGhlIGJsb2NrIGJpdG1hcAotICogQGdycF9nb2FsOgkJZ2l2ZW4gdGFyZ2V0IGJsb2NrIHdpdGhpbiB0aGUgZ3JvdXAKLSAqIEBjb3VudDoJCXRhcmdldCBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCi0gKiBAbXlfcnN2OgkJcmVzZXJ2YXRpb24gd2luZG93Ci0gKiBAZXJycDoJCXBvaW50ZXIgdG8gc3RvcmUgdGhlIGVycm9yIGNvZGUKLSAqCi0gKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIGl0cyByZXNlcnZhdGlvbgotICogd2luZG93LgotICoKLSAqIEVhY2ggdGltZSB3aGVuIGEgbmV3IGJsb2NrIGFsbG9jYXRpb24gaXMgbmVlZCwgZmlyc3QgdHJ5IHRvIGFsbG9jYXRlIGZyb20KLSAqIGl0cyBvd24gcmVzZXJ2YXRpb24uICBJZiBpdCBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93LCBpbnN0ZWFkIG9mCi0gKiBsb29raW5nIGZvciBhIGZyZWUgYml0IG9uIGJpdG1hcCBmaXJzdCwgdGhlbiBsb29rIHVwIHRoZSByZXNlcnZhdGlvbiBsaXN0IHRvCi0gKiBzZWUgaWYgaXQgaXMgaW5zaWRlIHNvbWVib2R5IGVsc2UncyByZXNlcnZhdGlvbiB3aW5kb3csIHdlIHRyeSB0byBhbGxvY2F0ZSBhCi0gKiByZXNlcnZhdGlvbiB3aW5kb3cgZm9yIGl0IHN0YXJ0aW5nIGZyb20gdGhlIGdvYWwgZmlyc3QuIFRoZW4gZG8gdGhlIGJsb2NrCi0gKiBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93LgotICoKLSAqIFRoaXMgd2lsbCBhdm9pZCBrZWVwaW5nIG9uIHNlYXJjaGluZyB0aGUgcmVzZXJ2YXRpb24gbGlzdCBhZ2FpbiBhbmQKLSAqIGFnYWluIHdoZW4gc29tZWJvZHkgaXMgbG9va2luZyBmb3IgYSBmcmVlIGJsb2NrICh3aXRob3V0Ci0gKiByZXNlcnZhdGlvbiksIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBmcmVlIGJsb2NrcywgYnV0IHRoZXkgYXJlIGFsbAotICogYmVpbmcgcmVzZXJ2ZWQuCi0gKgotICogV2UgdXNlIGEgcmVkLWJsYWNrIHRyZWUgZm9yIHRoZSBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiBsaXN0LgotICoKLSAqLwotc3RhdGljIGV4dDRfZ3JwYmxrX3QKLWV4dDRfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQlleHQ0X2dyb3VwX3QgZ3JvdXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAotCQkJZXh0NF9ncnBibGtfdCBncnBfZ29hbCwKLQkJCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCi0JCQl1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQotewotCWV4dDRfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKLQlleHQ0X2dycGJsa190IHJldCA9IDA7Ci0JaW50IGZhdGFsOwotCXVuc2lnbmVkIGxvbmcgbnVtID0gKmNvdW50OwotCi0JKmVycnAgPSAwOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgd2UgdXNlIHVuZG8gYWNjZXNzIGZvciB0aGUgYml0bWFwLCBiZWNhdXNlIGl0IGlzIGNyaXRpY2FsCi0JICogdGhhdCB3ZSBkbyB0aGUgZnJvemVuX2RhdGEgQ09XIG9uIGJpdG1hcCBidWZmZXJzIGluIGFsbCBjYXNlcyBldmVuCi0JICogaWYgdGhlIGJ1ZmZlciBpcyBpbiBCSl9Gb3JnZXQgc3RhdGUgaW4gdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uCi0JICovCi0JQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldCB1bmRvIGFjY2VzcyBmb3IgbmV3IGJsb2NrIik7Ci0JZmF0YWwgPSBleHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKLQlpZiAoZmF0YWwpIHsKLQkJKmVycnAgPSBmYXRhbDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogd2UgZG9uJ3QgZGVhbCB3aXRoIHJlc2VydmF0aW9uIHdoZW4KLQkgKiBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgd2l0aG91dCByZXNlcnZhdGlvbgotCSAqIG9yIHRoZSBmaWxlIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZQotCSAqIG9yIGxhc3QgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIGJsb2NrIHdpdGggcmVzZXJ2YXRpb24gdHVybmVkIG9uIGZhaWxlZAotCSAqLwotCWlmIChteV9yc3YgPT0gTlVMTCApIHsKLQkJcmV0ID0gZXh0NF90cnlfdG9fYWxsb2NhdGUoc2IsIGhhbmRsZSwgZ3JvdXAsIGJpdG1hcF9iaCwKLQkJCQkJCWdycF9nb2FsLCBjb3VudCwgTlVMTCk7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKgotCSAqIGdycF9nb2FsIGlzIGEgZ3JvdXAgcmVsYXRpdmUgYmxvY2sgbnVtYmVyIChpZiB0aGVyZSBpcyBhIGdvYWwpCi0JICogMCA8PSBncnBfZ29hbCA8IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikKLQkgKiBmaXJzdCBibG9jayBpcyBhIGZpbGVzeXN0ZW0gd2lkZSBibG9jayBudW1iZXIKLQkgKiBmaXJzdCBibG9jayBpcyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGlzIGdyb3VwCi0JICovCi0JZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7Ci0JZ3JvdXBfbGFzdF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrICsgKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKTsKLQotCS8qCi0JICogQmFzaWNhbGx5IHdlIHdpbGwgYWxsb2NhdGUgYSBuZXcgYmxvY2sgZnJvbSBpbm9kZSdzIHJlc2VydmF0aW9uCi0JICogd2luZG93LgotCSAqCi0JICogV2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3csIGlmOgotCSAqIGEpIGlub2RlIGRvZXMgbm90IGhhdmUgYSByZXNlcnZhdGlvbiB3aW5kb3c7IG9yCi0JICogYikgbGFzdCBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgYmxvY2sgZnJvbSBleGlzdGluZyByZXNlcnZhdGlvbgotCSAqICAgIGZhaWxlZDsgb3IKLQkgKiBjKSB3ZSBjb21lIGhlcmUgd2l0aCBhIGdvYWwgYW5kIHdpdGggYSByZXNlcnZhdGlvbiB3aW5kb3cKLQkgKgotCSAqIFdlIGRvIG5vdCBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBpZiB3ZSBjb21lIGhlcmUKLQkgKiBhdCB0aGUgYmVnaW5uaW5nIHdpdGggYSBnb2FsIGFuZCB0aGUgZ29hbCBpcyBpbnNpZGUgdGhlIHdpbmRvdywgb3IKLQkgKiB3ZSBkb24ndCBoYXZlIGEgZ29hbCBidXQgYWxyZWFkeSBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93LgotCSAqIHRoZW4gd2UgY291bGQgZ28gdG8gYWxsb2NhdGUgZnJvbSB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGRpcmVjdGx5LgotCSAqLwotCXdoaWxlICgxKSB7Ci0JCWlmIChyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykgfHwgKHJldCA8IDApIHx8Ci0JCQkhZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LAotCQkJCQkJZ3JwX2dvYWwsIGdyb3VwLCBzYikpIHsKLQkJCWlmIChteV9yc3YtPnJzdl9nb2FsX3NpemUgPCAqY291bnQpCi0JCQkJbXlfcnN2LT5yc3ZfZ29hbF9zaXplID0gKmNvdW50OwotCQkJcmV0ID0gYWxsb2NfbmV3X3Jlc2VydmF0aW9uKG15X3JzdiwgZ3JwX2dvYWwsIHNiLAotCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJYnJlYWs7CQkJLyogZmFpbGVkICovCi0KLQkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LAotCQkJCQkJCWdycF9nb2FsLCBncm91cCwgc2IpKQotCQkJCWdycF9nb2FsID0gLTE7Ci0JCX0gZWxzZSBpZiAoZ3JwX2dvYWwgPj0gMCkgewotCQkJaW50IGN1cnIgPSBteV9yc3YtPnJzdl9lbmQgLQotCQkJCQkoZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jaykgKyAxOwotCi0JCQlpZiAoY3VyciA8ICpjb3VudCkKLQkJCQl0cnlfdG9fZXh0ZW5kX3Jlc2VydmF0aW9uKG15X3Jzdiwgc2IsCi0JCQkJCQkJKmNvdW50IC0gY3Vycik7Ci0JCX0KLQotCQlpZiAoKG15X3Jzdi0+cnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKLQkJCQkobXlfcnN2LT5yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKSB7Ci0JCQlyc3Zfd2luZG93X2R1bXAoJkVYVDRfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdCwgMSk7Ci0JCQlCVUcoKTsKLQkJfQotCQlyZXQgPSBleHQ0X3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLAotCQkJCQkgICBncnBfZ29hbCwgJm51bSwgJm15X3Jzdi0+cnN2X3dpbmRvdyk7Ci0JCWlmIChyZXQgPj0gMCkgewotCQkJbXlfcnN2LT5yc3ZfYWxsb2NfaGl0ICs9IG51bTsKLQkJCSpjb3VudCA9IG51bTsKLQkJCWJyZWFrOwkJCQkvKiBzdWNjZWVkICovCi0JCX0KLQkJbnVtID0gKmNvdW50OwotCX0KLW91dDoKLQlpZiAocmV0ID49IDApIHsKLQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImpvdXJuYWxfZGlydHlfbWV0YWRhdGEgZm9yICIKLQkJCQkJImJpdG1hcCBibG9jayIpOwotCQlmYXRhbCA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7Ci0JCWlmIChmYXRhbCkgewotCQkJKmVycnAgPSBmYXRhbDsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJqb3VybmFsX3JlbGVhc2VfYnVmZmVyIik7Ci0JZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYml0bWFwX2JoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKICAqIGV4dDRfaGFzX2ZyZWVfYmxvY2tzKCkKICAqIEBzYmk6CWluLWNvcmUgc3VwZXIgYmxvY2sgc3RydWN0dXJlLgogICogQG5ibG9ja3M6CW51bWJlciBvZiBuZWVlZCBibG9ja3MKQEAgLTE2MTAsMjkgKzYyOSwzNCBAQAogICogT24gc3VjY2VzcywgcmV0dXJuIG5ibG9ja3MKICAqLwogZXh0NF9mc2Jsa190IGV4dDRfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKLQkJCQkJCWV4dDRfZnNibGtfdCBuYmxvY2tzKQorCQkJCQkJczY0IG5ibG9ja3MpCiB7Ci0JZXh0NF9mc2Jsa190IGZyZWVfYmxvY2tzOwotCWV4dDRfZnNibGtfdCByb290X2Jsb2NrcyA9IDA7CisJczY0IGZyZWVfYmxvY2tzLCBkaXJ0eV9ibG9ja3M7CisJczY0IHJvb3RfYmxvY2tzID0gMDsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyA9ICZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyOworCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZGJjID0gJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyOwogCi0JZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKGZiYyk7CisJZGlydHlfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShkYmMpOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCiAJCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKIAkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcChzYmktPnNfcmVzZ2lkKSkpCiAJCXJvb3RfYmxvY2tzID0gZXh0NF9yX2Jsb2Nrc19jb3VudChzYmktPnNfZXMpOwotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoZnJlZV9ibG9ja3MgLSByb290X2Jsb2NrcyA8IEZCQ19CQVRDSCkKLQkJZnJlZV9ibG9ja3MgPQotCQkJcGVyY3B1X2NvdW50ZXJfc3VtX2FuZF9zZXQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotI2VuZGlmCi0JaWYgKGZyZWVfYmxvY2tzIDw9IHJvb3RfYmxvY2tzKQorCisJaWYgKGZyZWVfYmxvY2tzIC0gKG5ibG9ja3MgKyByb290X2Jsb2NrcyArIGRpcnR5X2Jsb2NrcykgPAorCQkJCQkJRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSykgeworCQlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9zdW0oZmJjKTsKKwkJZGlydHlfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfc3VtKGRiYyk7CisJfQorCWlmIChmcmVlX2Jsb2NrcyA8PSAocm9vdF9ibG9ja3MgKyBkaXJ0eV9ibG9ja3MpKQogCQkvKiB3ZSBkb24ndCBoYXZlIGZyZWUgc3BhY2UgKi8KIAkJcmV0dXJuIDA7Ci0JaWYgKGZyZWVfYmxvY2tzIC0gcm9vdF9ibG9ja3MgPCBuYmxvY2tzKQotCQlyZXR1cm4gZnJlZV9ibG9ja3MgLSByb290X2Jsb2NrczsKKworCWlmIChmcmVlX2Jsb2NrcyAtIChyb290X2Jsb2NrcyArIGRpcnR5X2Jsb2NrcykgPCBuYmxvY2tzKQorCQlyZXR1cm4gZnJlZV9ibG9ja3MgLSAocm9vdF9ibG9ja3MgKyBkaXJ0eV9ibG9ja3MpOwogCXJldHVybiBuYmxvY2tzOwotIH0KK30KIAogCiAvKioKQEAgLTE2NTcsMzAzICs2ODEsNiBAQAogCXJldHVybiBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKIH0KIAotLyoqCi0gKiBleHQ0X29sZF9uZXdfYmxvY2tzKCkgLS0gY29yZSBibG9jayBiaXRtYXAgYmFzZWQgYmxvY2sgYWxsb2NhdGlvbiBmdW5jdGlvbgotICoKLSAqIEBoYW5kbGU6CQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgotICogQGlub2RlOgkJZmlsZSBpbm9kZQotICogQGdvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQotICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKLSAqIEBlcnJwOgkJZXJyb3IgY29kZQotICoKLSAqIGV4dDRfb2xkX25ld19ibG9ja3MgdXNlcyBhIGdvYWwgYmxvY2sgdG8gYXNzaXN0IGFsbG9jYXRpb24gYW5kIGxvb2sgdXAKLSAqIHRoZSBibG9jayBiaXRtYXAgZGlyZWN0bHkgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4gIEl0IHRyaWVzIHRvCi0gKiBhbGxvY2F0ZSBibG9jayhzKSBmcm9tIHRoZSBibG9jayBncm91cCBjb250YWlucyB0aGUgZ29hbCBibG9jayBmaXJzdC4gSWYKLSAqIHRoYXQgZmFpbHMsIGl0IHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gb3RoZXIgYmxvY2sgZ3JvdXBzCi0gKiB3aXRob3V0IGFueSBzcGVjaWZpYyBnb2FsIGJsb2NrLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gLW8gbm9tYmFsbG9jIG1vdW50IG9wdGlvbiBpcyBlbmFibGVkCi0gKgotICovCi1leHQ0X2ZzYmxrX3QgZXh0NF9vbGRfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCi17Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOwotCWV4dDRfZ3JvdXBfdCBncm91cF9ubzsKLQlleHQ0X2dyb3VwX3QgZ29hbF9ncm91cDsKLQlleHQ0X2dycGJsa190IGdycF90YXJnZXRfYmxrOwkvKiBibG9ja2dyb3VwIHJlbGF0aXZlIGdvYWwgYmxvY2sgKi8KLQlleHQ0X2dycGJsa190IGdycF9hbGxvY19ibGs7CS8qIGJsb2NrZ3JvdXAtcmVsYXRpdmUgYWxsb2NhdGVkIGJsb2NrKi8KLQlleHQ0X2ZzYmxrX3QgcmV0X2Jsb2NrOwkJLyogZmlsZXN5ZXRlbS13aWRlIGFsbG9jYXRlZCBibG9jayAqLwotCWV4dDRfZ3JvdXBfdCBiZ2k7CQkJLyogYmxvY2tncm91cCBpdGVyYXRpb24gaW5kZXggKi8KLQlpbnQgZmF0YWwgPSAwLCBlcnI7Ci0JaW50IHBlcmZvcm1lZF9hbGxvY2F0aW9uID0gMDsKLQlleHQ0X2dycGJsa190IGZyZWVfYmxvY2tzOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgaW4gYSBncm91cCAqLwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwOwotCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7Ci0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2ID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pOwotCXVuc2lnbmVkIHNob3J0IHdpbmRvd3N6ID0gMDsKLQlleHQ0X2dyb3VwX3Qgbmdyb3VwczsKLQl1bnNpZ25lZCBsb25nIG51bSA9ICpjb3VudDsKLQotCXNiID0gaW5vZGUtPmlfc2I7Ci0JaWYgKCFzYikgewotCQkqZXJycCA9IC1FTk9ERVY7Ci0JCXByaW50aygiZXh0NF9uZXdfYmxvY2s6IG5vbmV4aXN0ZW50IGRldmljZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzYmkgPSBFWFQ0X1NCKHNiKTsKLQlpZiAoIUVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgewotCQkvKgotCQkgKiBXaXRoIGRlbGFsbG9jIHdlIGFscmVhZHkgcmVzZXJ2ZWQgdGhlIGJsb2NrcwotCQkgKi8KLQkJKmNvdW50ID0gZXh0NF9oYXNfZnJlZV9ibG9ja3Moc2JpLCAqY291bnQpOwotCX0KLQlpZiAoKmNvdW50ID09IDApIHsKLQkJKmVycnAgPSAtRU5PU1BDOwotCQlyZXR1cm4gMDsJLypyZXR1cm4gd2l0aCBFTk9TUEMgZXJyb3IgKi8KLQl9Ci0JbnVtID0gKmNvdW50OwotCi0JLyoKLQkgKiBDaGVjayBxdW90YSBmb3IgYWxsb2NhdGlvbiBvZiB0aGlzIGJsb2NrLgotCSAqLwotCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgbnVtKSkgewotCQkqZXJycCA9IC1FRFFVT1Q7Ci0JCXJldHVybiAwOwotCX0KLQotCXNiaSA9IEVYVDRfU0Ioc2IpOwotCWVzID0gRVhUNF9TQihzYiktPnNfZXM7Ci0JZXh0NF9kZWJ1ZygiZ29hbD0lbGx1LlxuIiwgZ29hbCk7Ci0JLyoKLQkgKiBBbGxvY2F0ZSBhIGJsb2NrIGZyb20gcmVzZXJ2YXRpb24gb25seSB3aGVuCi0JICogZmlsZXN5c3RlbSBpcyBtb3VudGVkIHdpdGggcmVzZXJ2YXRpb24oZGVmYXVsdCwtbyByZXNlcnZhdGlvbiksIGFuZAotCSAqIGl0J3MgYSByZWd1bGFyIGZpbGUsIGFuZAotCSAqIHRoZSBkZXNpcmVkIHdpbmRvdyBzaXplIGlzIGdyZWF0ZXIgdGhhbiAwIChPbmUgY291bGQgdXNlIGlvY3RsCi0JICogY29tbWFuZCBFWFQ0X0lPQ19TRVRSU1ZTWiB0byBzZXQgdGhlIHdpbmRvdyBzaXplIHRvIDAgdG8gdHVybiBvZmYKLQkgKiByZXNlcnZhdGlvbiBvbiB0aGF0IHBhcnRpY3VsYXIgZmlsZSkKLQkgKi8KLQlibG9ja19pID0gRVhUNF9JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOwotCWlmIChibG9ja19pICYmICgod2luZG93c3ogPSBibG9ja19pLT5yc3Zfd2luZG93X25vZGUucnN2X2dvYWxfc2l6ZSkgPiAwKSkKLQkJbXlfcnN2ID0gJmJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZTsKLQotCS8qCi0JICogRmlyc3QsIHRlc3Qgd2hldGhlciB0aGUgZ29hbCBibG9jayBpcyBmcmVlLgotCSAqLwotCWlmIChnb2FsIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKLQkgICAgZ29hbCA+PSBleHQ0X2Jsb2Nrc19jb3VudChlcykpCi0JCWdvYWwgPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBnb2FsLCAmZ3JvdXBfbm8sICZncnBfdGFyZ2V0X2Jsayk7Ci0JZ29hbF9ncm91cCA9IGdyb3VwX25vOwotcmV0cnlfYWxsb2M6Ci0JZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXBfbm8sICZnZHBfYmgpOwotCWlmICghZ2RwKQotCQlnb3RvIGlvX2Vycm9yOwotCi0JZnJlZV9ibG9ja3MgPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKLQkvKgotCSAqIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZnJlZSBibG9ja3MgdG8gbWFrZSBhIG5ldyByZXNldmF0aW9uCi0JICogdHVybiBvZmYgcmVzZXJ2YXRpb24gZm9yIHRoaXMgYWxsb2NhdGlvbgotCSAqLwotCWlmIChteV9yc3YgJiYgKGZyZWVfYmxvY2tzIDwgd2luZG93c3opCi0JCSYmIChyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpKQotCQlteV9yc3YgPSBOVUxMOwotCi0JaWYgKGZyZWVfYmxvY2tzID4gMCkgewotCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7Ci0JCWlmICghYml0bWFwX2JoKQotCQkJZ290byBpb19lcnJvcjsKLQkJZ3JwX2FsbG9jX2JsayA9IGV4dDRfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHNiLCBoYW5kbGUsCi0JCQkJCWdyb3VwX25vLCBiaXRtYXBfYmgsIGdycF90YXJnZXRfYmxrLAotCQkJCQlteV9yc3YsCSZudW0sICZmYXRhbCk7Ci0JCWlmIChmYXRhbCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQotCQkJZ290byBhbGxvY2F0ZWQ7Ci0JfQotCi0Jbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKLQlzbXBfcm1iKCk7Ci0KLQkvKgotCSAqIE5vdyBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIGdyb3Vwcy4gIFdlIGFzc3VtZSB0aGF0Ci0JICogZ3JvdXBfbm8gYW5kIGdkcCBjb3JyZWN0bHkgcG9pbnQgdG8gdGhlIGxhc3QgZ3JvdXAgdmlzaXRlZC4KLQkgKi8KLQlmb3IgKGJnaSA9IDA7IGJnaSA8IG5ncm91cHM7IGJnaSsrKSB7Ci0JCWdyb3VwX25vKys7Ci0JCWlmIChncm91cF9ubyA+PSBuZ3JvdXBzKQotCQkJZ3JvdXBfbm8gPSAwOwotCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cF9ubywgJmdkcF9iaCk7Ci0JCWlmICghZ2RwKQotCQkJZ290byBpb19lcnJvcjsKLQkJZnJlZV9ibG9ja3MgPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKLQkJLyoKLQkJICogc2tpcCB0aGlzIGdyb3VwIGlmIHRoZSBudW1iZXIgb2YKLQkJICogZnJlZSBibG9ja3MgaXMgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIHJlc2VydmF0aW9uCi0JCSAqIHdpbmRvdyBzaXplLgotCQkgKi8KLQkJaWYgKGZyZWVfYmxvY2tzIDw9ICh3aW5kb3dzei8yKSkKLQkJCWNvbnRpbnVlOwotCi0JCWJyZWxzZShiaXRtYXBfYmgpOwotCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7Ci0JCWlmICghYml0bWFwX2JoKQotCQkJZ290byBpb19lcnJvcjsKLQkJLyoKLQkJICogdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gdGhpcyBncm91cCwgd2l0aG91dCBhIGdvYWwoLTEpLgotCQkgKi8KLQkJZ3JwX2FsbG9jX2JsayA9IGV4dDRfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHNiLCBoYW5kbGUsCi0JCQkJCWdyb3VwX25vLCBiaXRtYXBfYmgsIC0xLCBteV9yc3YsCi0JCQkJCSZudW0sICZmYXRhbCk7Ci0JCWlmIChmYXRhbCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQotCQkJZ290byBhbGxvY2F0ZWQ7Ci0JfQotCS8qCi0JICogV2UgbWF5IGVuZCB1cCBhIGJvZ3VzIGVhbGllciBFTk9TUEMgZXJyb3IgZHVlIHRvCi0JICogZmlsZXN5c3RlbSBpcyAiZnVsbCIgb2YgcmVzZXJ2YXRpb25zLCBidXQKLQkgKiB0aGVyZSBtYXliZSBpbmRlZWQgZnJlZSBibG9ja3MgYXZhbGlhYmxlIG9uIGRpc2sKLQkgKiBJbiB0aGlzIGNhc2UsIHdlIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSByZXNlcnZhdGlvbnMKLQkgKiBqdXN0IGRvIGJsb2NrIGFsbG9jYXRpb24gYXMgd2l0aG91dCByZXNlcnZhdGlvbnMuCi0JICovCi0JaWYgKG15X3JzdikgewotCQlteV9yc3YgPSBOVUxMOwotCQl3aW5kb3dzeiA9IDA7Ci0JCWdyb3VwX25vID0gZ29hbF9ncm91cDsKLQkJZ290byByZXRyeV9hbGxvYzsKLQl9Ci0JLyogTm8gc3BhY2UgbGVmdCBvbiB0aGUgZGV2aWNlICovCi0JKmVycnAgPSAtRU5PU1BDOwotCWdvdG8gb3V0OwotCi1hbGxvY2F0ZWQ6Ci0KLQlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAlbHUoJWQpXG4iLAotCQkJZ3JvdXBfbm8sIGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOwotCi0JQlVGRkVSX1RSQUNFKGdkcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQlmYXRhbCA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RwX2JoKTsKLQlpZiAoZmF0YWwpCi0JCWdvdG8gb3V0OwotCi0JcmV0X2Jsb2NrID0gZ3JwX2FsbG9jX2JsayArIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwX25vKTsKLQotCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8Ci0JICAgIGluX3JhbmdlKGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApLCByZXRfYmxvY2ssIG51bSkgfHwKLQkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLAotCQkgICAgIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApIHx8Ci0JICAgIGluX3JhbmdlKHJldF9ibG9jayArIG51bSAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCi0JCSAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpIHsKLQkJZXh0NF9lcnJvcihzYiwgImV4dDRfbmV3X2Jsb2NrIiwKLQkJCSAgICAiQWxsb2NhdGluZyBibG9jayBpbiBzeXN0ZW0gem9uZSAtICIKLQkJCSAgICAiYmxvY2tzIGZyb20gJWxsdSwgbGVuZ3RoICVsdSIsCi0JCQkgICAgIHJldF9ibG9jaywgbnVtKTsKLQkJLyoKLQkJICogY2xhaW1fYmxvY2sgbWFya2VkIHRoZSBibG9ja3Mgd2UgYWxsb2NhdGVkCi0JCSAqIGFzIGluIHVzZS4gU28gd2UgbWF5IHdhbnQgdG8gc2VsZWN0aXZlbHkKLQkJICogbWFyayBzb21lIG9mIHRoZSBibG9ja3MgYXMgZnJlZQotCQkgKi8KLQkJZ290byByZXRyeV9hbGxvYzsKLQl9Ci0KLQlwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDE7Ci0KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCXsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWJ1Z19iaDsKLQotCQkvKiBSZWNvcmQgYml0bWFwIGJ1ZmZlciBzdGF0ZSBpbiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCi0JCWRlYnVnX2JoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIHJldF9ibG9jayk7Ci0JCWlmIChkZWJ1Z19iaCkgewotCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLCAic3RhdGUgd2hlbiBhbGxvY2F0ZWQiKTsKLQkJCUJVRkZFUl9UUkFDRTIoZGVidWdfYmgsIGJpdG1hcF9iaCwgImJpdG1hcCBzdGF0ZSIpOwotCQkJYnJlbHNlKGRlYnVnX2JoKTsKLQkJfQotCX0KLQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7Ci0JaWYgKGJ1ZmZlcl9qYmQoYml0bWFwX2JoKSAmJiBiaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJaWYgKGV4dDRfdGVzdF9iaXQoZ3JwX2FsbG9jX2JsaytpLAotCQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSkgewotCQkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKLQkJCQkJImJfY29tbWl0dGVkX2RhdGFcbiIsIF9fZnVuY19fKTsKLQkJCX0KLQkJfQotCX0KLQlleHQ0X2RlYnVnKCJmb3VuZCBiaXQgJWRcbiIsIGdycF9hbGxvY19ibGspOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pKTsKLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0jZW5kaWYKLQotCWlmIChyZXRfYmxvY2sgKyBudW0gLSAxID49IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewotCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9uZXdfYmxvY2siLAotCQkJICAgICJibG9jayglbGx1KSA+PSBibG9ja3MgY291bnQoJWxsdSkgLSAiCi0JCQkgICAgImJsb2NrX2dyb3VwID0gJWx1LCBlcyA9PSAlcCAiLCByZXRfYmxvY2ssCi0JCQlleHQ0X2Jsb2Nrc19jb3VudChlcyksIGdyb3VwX25vLCBlcyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhZGQgdGhlIG5ldyBidWZmZXIgdG8gYSBqb3VybmFsCi0JICogbGlzdCBvZiBzb21lIGRlc2NyaXB0aW9uLiAgV2UgZG9uJ3Qga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIKLQkgKiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSBpdCBhcyBtZXRhZGF0YSBvciBkYXRhLgotCSAqLwotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7Ci0JaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpCi0JCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKLQlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQsIC1udW0pOwotCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGdyb3VwX25vLCBnZHApOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pKTsKLQlpZiAoIUVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykKLQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBudW0pOwotCi0JaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7Ci0JCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgZ3JvdXBfbm8pOwotCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBmbGV4X2dyb3VwKSk7Ci0JCXNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2Jsb2NrcyAtPSBudW07Ci0JCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZmxleF9ncm91cCkpOwotCX0KLQotCUJVRkZFUl9UUkFDRShnZHBfYmgsICJqb3VybmFsX2RpcnR5X21ldGFkYXRhIGZvciBncm91cCBkZXNjcmlwdG9yIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RwX2JoKTsKLQlpZiAoIWZhdGFsKQotCQlmYXRhbCA9IGVycjsKLQotCXNiLT5zX2RpcnQgPSAxOwotCWlmIChmYXRhbCkKLQkJZ290byBvdXQ7Ci0KLQkqZXJycCA9IDA7Ci0JYnJlbHNlKGJpdG1hcF9iaCk7Ci0JRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgKmNvdW50LW51bSk7Ci0JKmNvdW50ID0gbnVtOwotCXJldHVybiByZXRfYmxvY2s7Ci0KLWlvX2Vycm9yOgotCSplcnJwID0gLUVJTzsKLW91dDoKLQlpZiAoZmF0YWwpIHsKLQkJKmVycnAgPSBmYXRhbDsKLQkJZXh0NF9zdGRfZXJyb3Ioc2IsIGZhdGFsKTsKLQl9Ci0JLyoKLQkgKiBVbmRvIHRoZSBibG9jayBhbGxvY2F0aW9uCi0JICovCi0JaWYgKCFwZXJmb3JtZWRfYWxsb2NhdGlvbikKLQkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgKmNvdW50KTsKLQlicmVsc2UoYml0bWFwX2JoKTsKLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBFWFQ0X01FVEFfQkxPQ0sgMHgxCiAKIHN0YXRpYyBleHQ0X2ZzYmxrX3QgZG9fYmxrX2FsbG9jKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0xOTYzLDEwICs2OTAsNiBAQAogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAlleHQ0X2ZzYmxrX3QgcmV0OwogCi0JaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgTUJBTExPQykpIHsKLQkJcmV0dXJuIGV4dDRfb2xkX25ld19ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwgY291bnQsIGVycnApOwotCX0KLQogCW1lbXNldCgmYXIsIDAsIHNpemVvZihhcikpOwogCS8qIEZpbGwgd2l0aCBuZWlnaGJvdXIgYWxsb2NhdGVkIGJsb2NrcyAqLwogCkBAIC0yMDA4LDcgKzczMSw3IEBACiAJLyoKIAkgKiBBY2NvdW50IGZvciB0aGUgYWxsb2NhdGVkIG1ldGEgYmxvY2tzCiAJICovCi0JaWYgKCEoKmVycnApKSB7CisJaWYgKCEoKmVycnApICYmIEVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgewogCQlzcGluX2xvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAJCUVYVDRfSShpbm9kZSktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzICs9ICpjb3VudDsKIAkJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CkBAIC0yMDkzLDEwICs4MTYsOSBAQAogCQliaXRtYXBfY291bnQgKz0geDsKIAl9CiAJYnJlbHNlKGJpdG1hcF9iaCk7Ci0JcHJpbnRrKCJleHQ0X2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAlbGx1IgotCQkiLCBjb21wdXRlZCA9ICVsbHUsICVsbHVcbiIsCi0JCWV4dDRfZnJlZV9ibG9ja3NfY291bnQoZXMpLAotCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXByaW50ayhLRVJOX0RFQlVHICJleHQ0X2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAlbGx1IgorCQkiLCBjb21wdXRlZCA9ICVsbHUsICVsbHVcbiIsIGV4dDRfZnJlZV9ibG9ja3NfY291bnQoZXMpLAorCSAgICAgICBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOwogCXJldHVybiBiaXRtYXBfY291bnQ7CiAjZWxzZQogCWRlc2NfY291bnQgPSAwOwpAQCAtMjE4Myw4ICs5MDUsOSBAQAogCiAJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKSB8fAogCQkJbWV0YWdyb3VwIDwgZmlyc3RfbWV0YV9iZykKLQkJcmV0dXJuIGV4dDRfYmdfbnVtX2dkYl9ub21ldGEoc2IsZ3JvdXApOworCQlyZXR1cm4gZXh0NF9iZ19udW1fZ2RiX25vbWV0YShzYiwgZ3JvdXApOwogCiAJcmV0dXJuIGV4dDRfYmdfbnVtX2dkYl9tZXRhKHNiLGdyb3VwKTsKIAogfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2JpdG1hcC5jIGIvZnMvZXh0NC9iaXRtYXAuYwppbmRleCBkMzdlYTY3Li4wYTdhNjY2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2JpdG1hcC5jCisrKyBiL2ZzL2V4dDQvYml0bWFwLmMKQEAgLTE1LDE3ICsxNSwxNyBAQAogCiBzdGF0aWMgY29uc3QgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OwogCi11bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcCwgdW5zaWduZWQgaW50IG51bWNoYXJzKQogewogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKIAogCWlmICghbWFwKQotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtY2hhcnM7IGkrKykKIAkJc3VtICs9IG5pYmJsZW1hcFttYXAtPmJfZGF0YVtpXSAmIDB4Zl0gKwogCQkJbmliYmxlbWFwWyhtYXAtPmJfZGF0YVtpXSA+PiA0KSAmIDB4Zl07Ci0JcmV0dXJuIChzdW0pOworCXJldHVybiBzdW07CiB9CiAKICNlbmRpZiAgLyogIEVYVDRGU19ERUJVRyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jCmluZGV4IGVjOGUzM2IuLjNjYTZhMmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZGlyLmMKKysrIGIvZnMvZXh0NC9kaXIuYwpAQCAtMzMsMTAgKzMzLDEwIEBACiB9OwogCiBzdGF0aWMgaW50IGV4dDRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7Ci1zdGF0aWMgaW50IGV4dDRfZHhfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCi0JCQkgICB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7Ci1zdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCXN0cnVjdCBmaWxlICogZmlscCk7CitzdGF0aWMgaW50IGV4dDRfZHhfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIGludCBleHQ0X3JlbGVhc2VfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKmZpbHApOwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDRfZGlyX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLApAQCAtNjEsMTIgKzYxLDEyIEBACiB9CiAKIAotaW50IGV4dDRfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICogZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqIGRpciwKLQkJCSAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZSwKLQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCi0JCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoraW50IGV4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLQljb25zdCBjaGFyICogZXJyb3JfbXNnID0gTlVMTDsKKwljb25zdCBjaGFyICplcnJvcl9tc2cgPSBOVUxMOwogCWNvbnN0IGludCBybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0+cmVjX2xlbik7CiAKIAlpZiAocmxlbiA8IEVYVDRfRElSX1JFQ19MRU4oMSkpCkBAIC04Miw3ICs4Miw3IEBACiAJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKIAogCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKLQkJZXh0NF9lcnJvciAoZGlyLT5pX3NiLCBmdW5jdGlvbiwKKwkJZXh0NF9lcnJvcihkaXItPmlfc2IsIGZ1bmN0aW9uLAogCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCiAJCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCiAJCQlkaXItPmlfaW5vLCBlcnJvcl9tc2csIG9mZnNldCwKQEAgLTkxLDggKzkxLDggQEAKIAlyZXR1cm4gZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMDsKIH0KIAotc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAotCQkJIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQorc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlpbnQgZXJyb3IgPSAwOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwpAQCAtMTAyLDYgKzEwMiw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0ID0gMDsKKwlpbnQgZGlyX2hhc19lcnJvciA9IDA7CiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCkBAIC0xNDgsOSArMTQ5LDEzIEBACiAJCSAqIG9mIHJlY292ZXJpbmcgZGF0YSB3aGVuIHRoZXJlJ3MgYSBiYWQgc2VjdG9yCiAJCSAqLwogCQlpZiAoIWJoKSB7Ci0JCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfcmVhZGRpciIsCi0JCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKLQkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKwkJCWlmICghZGlyX2hhc19lcnJvcikgeworCQkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiZGlyZWN0b3J5ICMlbHUgIgorCQkJCQkgICAiY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlTHUiLAorCQkJCQkgICBpbm9kZS0+aV9pbm8sCisJCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGZpbHAtPmZfcG9zKTsKKwkJCQlkaXJfaGFzX2Vycm9yID0gMTsKKwkJCX0KIAkJCS8qIGNvcnJ1cHQgc2l6ZT8gIE1heWJlIG5vIG1vcmUgYmxvY2tzIHRvIHJlYWQgKi8KIAkJCWlmIChmaWxwLT5mX3BvcyA+IGlub2RlLT5pX2Jsb2NrcyA8PCA5KQogCQkJCWJyZWFrOwpAQCAtMTg3LDE0ICsxOTIsMTQgQEAKIAkJd2hpbGUgKCFlcnJvciAmJiBmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUKIAkJICAgICAgICYmIG9mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSkgewogCQkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOwotCQkJaWYgKCFleHQ0X2NoZWNrX2Rpcl9lbnRyeSAoImV4dDRfcmVhZGRpciIsIGlub2RlLCBkZSwKLQkJCQkJCSAgIGJoLCBvZmZzZXQpKSB7CisJCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KCJleHQ0X3JlYWRkaXIiLCBpbm9kZSwgZGUsCisJCQkJCQkgIGJoLCBvZmZzZXQpKSB7CiAJCQkJLyoKIAkJCQkgKiBPbiBlcnJvciwgc2tpcCB0aGUgZl9wb3MgdG8gdGhlIG5leHQgYmxvY2sKIAkJCQkgKi8KIAkJCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyB8CiAJCQkJCQkoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKLQkJCQlicmVsc2UgKGJoKTsKKwkJCQlicmVsc2UoYmgpOwogCQkJCXJldCA9IHN0b3JlZDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTIxOCwxMiArMjIzLDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCWlmICh2ZXJzaW9uICE9IGZpbHAtPmZfdmVyc2lvbikKIAkJCQkJZ290byByZXZhbGlkYXRlOwotCQkJCXN0b3JlZCArKzsKKwkJCQlzdG9yZWQrKzsKIAkJCX0KIAkJCWZpbHAtPmZfcG9zICs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwogCQl9CiAJCW9mZnNldCA9IDA7Ci0JCWJyZWxzZSAoYmgpOworCQlicmVsc2UoYmgpOwogCX0KIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMjkwLDkgKzI5NSw5IEBACiAJCXBhcmVudCA9IHJiX3BhcmVudChuKTsKIAkJZm5hbWUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOwogCQl3aGlsZSAoZm5hbWUpIHsKLQkJCXN0cnVjdCBmbmFtZSAqIG9sZCA9IGZuYW1lOworCQkJc3RydWN0IGZuYW1lICpvbGQgPSBmbmFtZTsKIAkJCWZuYW1lID0gZm5hbWUtPm5leHQ7Ci0JCQlrZnJlZSAob2xkKTsKKwkJCWtmcmVlKG9sZCk7CiAJCX0KIAkJaWYgKCFwYXJlbnQpCiAJCQlyb290LT5yYl9ub2RlID0gTlVMTDsKQEAgLTMzMSw3ICszMzYsNyBAQAogCQkJICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50KQogewogCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGZuYW1lICogZm5hbWUsICpuZXdfZm47CisJc3RydWN0IGZuYW1lICpmbmFtZSwgKm5ld19mbjsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbzsKIAlpbnQgbGVuOwogCkBAIC0zODgsMTkgKzM5MywyMCBAQAogICogZm9yIGFsbCBlbnRyZXMgb24gdGhlIGZuYW1lIGxpbmtlZCBsaXN0LiAgKE5vcm1hbGx5IHRoZXJlIGlzIG9ubHkKICAqIG9uZSBlbnRyeSBvbiB0aGUgbGlua2VkIGxpc3QsIHVubGVzcyB0aGVyZSBhcmUgNjIgYml0IGhhc2ggY29sbGlzaW9ucy4pCiAgKi8KLXN0YXRpYyBpbnQgY2FsbF9maWxsZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwKK3N0YXRpYyBpbnQgY2FsbF9maWxsZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsCiAJCQlmaWxsZGlyX3QgZmlsbGRpciwgc3RydWN0IGZuYW1lICpmbmFtZSkKIHsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlsb2ZmX3QJY3Vycl9wb3M7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlpbnQgZXJyb3I7CiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCiAJaWYgKCFmbmFtZSkgewotCQlwcmludGsoImNhbGxfZmlsbGRpcjogY2FsbGVkIHdpdGggbnVsbCBmbmFtZT8hP1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiZXh0NDogY2FsbF9maWxsZGlyOiBjYWxsZWQgd2l0aCAiCisJCSAgICAgICAibnVsbCBmbmFtZT8hP1xuIik7CiAJCXJldHVybiAwOwogCX0KIAljdXJyX3BvcyA9IGhhc2gycG9zKGZuYW1lLT5oYXNoLCBmbmFtZS0+bWlub3JfaGFzaCk7CkBAIC00MTksOCArNDI1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHQ0X2R4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAotCQkJIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQorc3RhdGljIGludCBleHQ0X2R4X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKQEAgLTUxMSw3ICs1MTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9kaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkKIAkJZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKGZpbHAtPnByaXZhdGVfZGF0YSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IDI5NTAwMzIuLjY2OTBhNDEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC00NCw5ICs0NCw5IEBACiAjaWZkZWYgRVhUNEZTX0RFQlVHCiAjZGVmaW5lIGV4dDRfZGVidWcoZiwgYS4uLikJCQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQlwcmludGsgKEtFUk5fREVCVUcgIkVYVDQtZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDQtZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsCVwKIAkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwkJCVwKLQkJcHJpbnRrIChLRVJOX0RFQlVHIGYsICMjIGEpOwkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIGYsICMjIGEpOwkJCQlcCiAJfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIGV4dDRfZGVidWcoZiwgYS4uLikJZG8ge30gd2hpbGUgKDApCkBAIC0xMjgsNyArMTI4LDcgQEAKICNlbHNlCiAjIGRlZmluZSBFWFQ0X0JMT0NLX1NJWkUocykJCShFWFQ0X01JTl9CTE9DS19TSVpFIDw8IChzKS0+c19sb2dfYmxvY2tfc2l6ZSkKICNlbmRpZgotI2RlZmluZQlFWFQ0X0FERFJfUEVSX0JMT0NLKHMpCQkoRVhUNF9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChfX3UzMikpCisjZGVmaW5lCUVYVDRfQUREUl9QRVJfQkxPQ0socykJCShFWFQ0X0JMT0NLX1NJWkUocykgLyBzaXplb2YoX191MzIpKQogI2lmZGVmIF9fS0VSTkVMX18KICMgZGVmaW5lIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfYmxvY2tzaXplX2JpdHMpCiAjZWxzZQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAjZGVmaW5lIEVYVDRfUkVTRVJWRURfRkwJCTB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIGV4dDQgbGliICovCiAKICNkZWZpbmUgRVhUNF9GTF9VU0VSX1ZJU0lCTEUJCTB4MDAwQkRGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCi0jZGVmaW5lIEVYVDRfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwMDM4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworI2RlZmluZSBFWFQ0X0ZMX1VTRVJfTU9ESUZJQUJMRQkJMHgwMDBCODBGRiAvKiBVc2VyIG1vZGlmaWFibGUgZmxhZ3MgKi8KIAogLyoKICAqIElub2RlIGR5bmFtaWMgc3RhdGUgZmxhZ3MKQEAgLTI5MSw4ICsyOTEsNiBAQAogI2RlZmluZQlFWFQ0X0lPQ19TRVRGTEFHUwkJRlNfSU9DX1NFVEZMQUdTCiAjZGVmaW5lCUVYVDRfSU9DX0dFVFZFUlNJT04JCV9JT1IoJ2YnLCAzLCBsb25nKQogI2RlZmluZQlFWFQ0X0lPQ19TRVRWRVJTSU9OCQlfSU9XKCdmJywgNCwgbG9uZykKLSNkZWZpbmUgRVhUNF9JT0NfR1JPVVBfRVhURU5ECQlfSU9XKCdmJywgNywgdW5zaWduZWQgbG9uZykKLSNkZWZpbmUgRVhUNF9JT0NfR1JPVVBfQURECQlfSU9XKCdmJywgOCxzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQpCiAjZGVmaW5lCUVYVDRfSU9DX0dFVFZFUlNJT05fT0xECQlGU19JT0NfR0VUVkVSU0lPTgogI2RlZmluZQlFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRAkJRlNfSU9DX1NFVFZFUlNJT04KICNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwpAQCAtMzAwLDcgKzI5OCwxMCBAQAogI2VuZGlmCiAjZGVmaW5lIEVYVDRfSU9DX0dFVFJTVlNaCQlfSU9SKCdmJywgNSwgbG9uZykKICNkZWZpbmUgRVhUNF9JT0NfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBsb25nKQotI2RlZmluZSBFWFQ0X0lPQ19NSUdSQVRFCQlfSU8oJ2YnLCA3KQorI2RlZmluZSBFWFQ0X0lPQ19HUk9VUF9FWFRFTkQJCV9JT1coJ2YnLCA3LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBFWFQ0X0lPQ19HUk9VUF9BREQJCV9JT1coJ2YnLCA4LCBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQpCisjZGVmaW5lIEVYVDRfSU9DX01JR1JBVEUJCV9JTygnZicsIDkpCisgLyogbm90ZSBpb2N0bCAxMSByZXNlcnZlZCBmb3IgZmlsZXN5c3RlbS1pbmRlcGVuZGVudCBGSUVNQVAgaW9jdGwgKi8KIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzIGluIDMyIGJpdCBlbXVsYXRpb24KQEAgLTUzOCw4ICs1MzksOSBAQAogI2RlZmluZSBFWFQ0X01PVU5UX0pPVVJOQUxfQ0hFQ0tTVU0JMHg4MDAwMDAgLyogSm91cm5hbCBjaGVja3N1bXMgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9KT1VSTkFMX0FTWU5DX0NPTU1JVAkweDEwMDAwMDAgLyogSm91cm5hbCBBc3luYyBDb21taXQgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9JX1ZFUlNJT04gICAgICAgICAgICAweDIwMDAwMDAgLyogaV92ZXJzaW9uIHN1cHBvcnQgKi8KLSNkZWZpbmUgRVhUNF9NT1VOVF9NQkFMTE9DCQkweDQwMDAwMDAgLyogQnVkZHkgYWxsb2NhdGlvbiBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREVMQUxMT0MJCTB4ODAwMDAwMCAvKiBEZWxhbGxvYyBzdXBwb3J0ICovCisjZGVmaW5lIEVYVDRfTU9VTlRfREFUQV9FUlJfQUJPUlQJMHgxMDAwMDAwMCAvKiBBYm9ydCBvbiBmaWxlIGRhdGEgd3JpdGUgKi8KKwogLyogQ29tcGF0aWJpbGl0eSwgZm9yIGhhdmluZyBib3RoIGV4dDJfZnMuaCBhbmQgZXh0NF9mcy5oIGluY2x1ZGVkIGF0IG9uY2UgKi8KICNpZm5kZWYgX0xJTlVYX0VYVDJfRlNfSAogI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUNF9NT1VOVF8jI29wdApAQCAtNjY3LDcgKzY2OSw3IEBACiB9OwogCiAjaWZkZWYgX19LRVJORUxfXwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0NF9zYl9pbmZvICogRVhUNF9TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0NF9zYl9pbmZvICpFWFQ0X1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJcmV0dXJuIHNiLT5zX2ZzX2luZm87CiB9CkBAIC03MjUsMTEgKzcyNywxMSBAQAogICovCiAKICNkZWZpbmUgRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKCBFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spICkKKwkoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkKICNkZWZpbmUgRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKCBFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spICkKKwkoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkKICNkZWZpbmUgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQkoIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisJKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkKICNkZWZpbmUgRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCiAJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKICNkZWZpbmUgRVhUNF9TRVRfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCkBAIC03ODksNiArNzkxLDggQEAKICNkZWZpbmUJRVhUNF9ERUZfUkVTVUlECQkwCiAjZGVmaW5lCUVYVDRfREVGX1JFU0dJRAkJMAogCisjZGVmaW5lIEVYVDRfREVGX0lOT0RFX1JFQURBSEVBRF9CTEtTCTMyCisKIC8qCiAgKiBEZWZhdWx0IG1vdW50IG9wdGlvbnMKICAqLwpAQCAtOTU0LDYgKzk1OCwyNCBAQAogdm9pZCBleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZnNibGtfdCBibG9ja25yLAogCQkJdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKTsKIAorZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0NF9wcm9jX3Jvb3Q7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF91aV9wcm9jX2ZvcHM7CisKKyNkZWZpbmUJRVhUNF9QUk9DX0hBTkRMRVIobmFtZSwgdmFyKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlwcm9jID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCBtb2RlLCBzYmktPnNfcHJvYywJCVwKKwkJCQkmZXh0NF91aV9wcm9jX2ZvcHMsICZzYmktPnNfIyN2YXIpOwlcCisJaWYgKHByb2MgPT0gTlVMTCkgewkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjYW4ndCBjcmVhdGUgJXNcbiIsIG5hbWUpOwlcCisJCWdvdG8gZXJyX291dDsJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEVYVDRfUFJPQ19IQU5ETEVSKG5hbWUsIHZhcikKKyNlbmRpZgorCiAvKgogICogRnVuY3Rpb24gcHJvdG90eXBlcwogICovCkBAIC05ODEsMjMgKzEwMDMsMjAgQEAKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOwotZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X29sZF9uZXdfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2ZzYmxrX3QgZ29hbCwgdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCk7CitleHRlcm4gaW50IGV4dDRfY2xhaW1fZnJlZV9ibG9ja3Moc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLCBzNjQgbmJsb2Nrcyk7CiBleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKLQkJCQkJCWV4dDRfZnNibGtfdCBuYmxvY2tzKTsKLWV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3MgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzNjQgbmJsb2Nrcyk7CitleHRlcm4gdm9pZCBleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBtZXRhZGF0YSk7Ci1leHRlcm4gdm9pZCBleHQ0X2ZyZWVfYmxvY2tzX3NiIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCitleHRlcm4gdm9pZCBleHQ0X2ZyZWVfYmxvY2tzX3NiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50LAogCQkJCXVuc2lnbmVkIGxvbmcgKnBkcXVvdF9mcmVlZF9ibG9ja3MpOwotZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2NvdW50X2ZyZWVfYmxvY2tzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1leHRlcm4gdm9pZCBleHQ0X2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQ0X2NoZWNrX2Jsb2Nrc19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBleHQ0X2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAogCQkJCQkJICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKIAkJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgpOwogZXh0ZXJuIGludCBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpOwotZXh0ZXJuIHZvaWQgZXh0NF9pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHZvaWQgZXh0NF9yc3Zfd2luZG93X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpOwogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLApAQCAtMTAwOSwyMCArMTAyOCwyMCBAQAogZXh0ZXJuIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKTsKIAogLyogZnN5bmMuYyAqLwotZXh0ZXJuIGludCBleHQ0X3N5bmNfZmlsZSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworZXh0ZXJuIGludCBleHQ0X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CiAKIC8qIGhhc2guYyAqLwogZXh0ZXJuIGludCBleHQ0ZnNfZGlyaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QKIAkJCSAgZHhfaGFzaF9pbmZvICpoaW5mbyk7CiAKIC8qIGlhbGxvYy5jICovCi1leHRlcm4gc3RydWN0IGlub2RlICogZXh0NF9uZXdfaW5vZGUgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2lub2RlIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7Ci1leHRlcm4gc3RydWN0IGlub2RlICogZXh0NF9vcnBoYW5fZ2V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWVfaW5vZGVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2RpcnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLWV4dGVybiB2b2lkIGV4dDRfY2hlY2tfaW5vZGVzX2JpdG1hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQpOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIGV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2lub2RlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKiBleHQ0X29ycGhhbl9nZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2RpcnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19pbm9kZXNfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQpOwogCiAvKiBtYmFsbG9jLmMgKi8KIGV4dGVybiBsb25nIGV4dDRfbWJfc3RhdHM7CkBAIC0xMDMyLDcgKzEwNTEsNyBAQAogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlX3QgKiwKIAkJCQlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgKiwgaW50ICopOwogZXh0ZXJuIGludCBleHQ0X21iX3Jlc2VydmVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXh0NF9tYl9kaXNjYXJkX2lub2RlX3ByZWFsbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IF9faW5pdCBpbml0X2V4dDRfbWJhbGxvYyh2b2lkKTsKIGV4dGVybiB2b2lkIGV4aXRfZXh0NF9tYmFsbG9jKHZvaWQpOwogZXh0ZXJuIHZvaWQgZXh0NF9tYl9mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwKQEAgLTEwNTAsMjQgKzEwNjksMjUgQEAKIAkJCQkJCWV4dDRfbGJsa190LCBpbnQsIGludCAqKTsKIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0NF9icmVhZChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwKIAkJCQkJCWV4dDRfbGJsa190LCBpbnQsIGludCAqKTsKK2ludCBleHQ0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOwogaW50IGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAogCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAogCQkJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpOwogCiBleHRlcm4gc3RydWN0IGlub2RlICpleHQ0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGludCAgZXh0NF93cml0ZV9pbm9kZSAoc3RydWN0IGlub2RlICosIGludCk7Ci1leHRlcm4gaW50ICBleHQ0X3NldGF0dHIgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOworZXh0ZXJuIGludCAgZXh0NF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgIGV4dDRfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGV4dGVybiBpbnQgIGV4dDRfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCXN0cnVjdCBrc3RhdCAqc3RhdCk7Ci1leHRlcm4gdm9pZCBleHQ0X2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIGludCAgZXh0NF9zeW5jX2lub2RlIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7Ci1leHRlcm4gdm9pZCBleHQ0X2Rpc2NhcmRfcmVzZXJ2YXRpb24gKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDRfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgIGV4dDRfc3luY19pbm9kZShoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQ0X2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0NF9jaGFuZ2VfaW5vZGVfam91cm5hbF9mbGFnKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCBleHQ0X2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICosIHN0cnVjdCBleHQ0X2lsb2MgKik7CiBleHRlcm4gaW50IGV4dDRfY2FuX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotZXh0ZXJuIHZvaWQgZXh0NF90cnVuY2F0ZSAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgZXh0NF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQ0X3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQ0X2dldF9pbm9kZV9mbGFncyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICopOwogZXh0ZXJuIHZvaWQgZXh0NF9zZXRfYW9wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTEwODAsMTEgKzExMDAsMTAgQEAKIAogLyogaW9jdGwuYyAqLwogZXh0ZXJuIGxvbmcgZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGxvbmcgZXh0NF9jb21wYXRfaW9jdGwgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKiBtaWdyYXRlLmMgKi8KLWV4dGVybiBpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICopOwogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGludCBleHQ0X29ycGhhbl9hZGQoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBleHQ0X29ycGhhbl9kZWwoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICopOwpAQCAtMTA5OSwxNCArMTExOCwxNCBAQAogCQkJCWV4dDRfZnNibGtfdCBuX2Jsb2Nrc19jb3VudCk7CiAKIC8qIHN1cGVyLmMgKi8KLWV4dGVybiB2b2lkIGV4dDRfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQorZXh0ZXJuIHZvaWQgZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCBfX2V4dDRfc3RkX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXh0NF9hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCitleHRlcm4gdm9pZCBfX2V4dDRfc3RkX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBleHQ0X2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiB2b2lkIGV4dDRfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCitleHRlcm4gdm9pZCBleHQ0X3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gaW50IGV4dDRfdXBkYXRlX2NvbXBhdF9mZWF0dXJlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCV9fdTMyIGNvbXBhdCk7CiBleHRlcm4gaW50IGV4dDRfdXBkYXRlX3JvY29tcGF0X2ZlYXR1cmUoaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTExNzksNyArMTE5OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmV4dDRfZ2V0X2dyb3VwX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCisJCQkJCSAgICBleHQ0X2dyb3VwX3QgZ3JvdXApCiB7CiAJIHN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKioqZ3JwX2luZm87CiAJIGxvbmcgaW5kZXh2LCBpbmRleGg7CkBAIC0xMjA3LDYgKzEyMjYsMjggQEAKIAkJX19leHQ0X3N0ZF9lcnJvcigoc2IpLCBfX2Z1bmNfXywgKGVycm5vKSk7CVwKIH0gd2hpbGUgKDApCiAKKyNpZmRlZiBDT05GSUdfU01QCisvKiBFYWNoIENQVSBjYW4gYWNjdW11bGF0ZSBGQkNfQkFUQ0ggYmxvY2tzIGluIHRoZWlyIGxvY2FsCisgKiBjb3VudGVycy4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBmcmVlIGJsb2NrcyBtb3JlCisgKiB0aGFuIEZCQ19CQVRDSCAgKiBucl9jcHVfaWRzLiBBbHNvIGFkZCBhIHdpbmRvdyBvZiA0IHRpbWVzLgorICovCisjZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgKDQgKiAoRkJDX0JBVENIICogbnJfY3B1X2lkcykpCisjZWxzZQorI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLIDAKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91cGRhdGVfaV9kaXNrc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbmV3c2l6ZSkKK3sKKwkvKgorCSAqIFhYWDogcmVwbGFjZSB3aXRoIHNwaW5sb2NrIGlmIHNlZW4gY29udGVuZGVkIC1ienp6CisJICovCisJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CisJaWYgKG5ld3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKQorCQlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gbmV3c2l6ZTsKKwl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CisJcmV0dXJuIDsKK30KKwogLyoKICAqIElub2RlcyBhbmQgZmlsZXMgb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAppbmRleCBkMzNkYzU2Li5iZWM3Y2U1IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCisrKyBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKQEAgLTEyNCw2ICsxMjQsMTkgQEAKICNkZWZpbmUgRVhUNF9FWFRfQ0FDSEVfR0FQCTEKICNkZWZpbmUgRVhUNF9FWFRfQ0FDSEVfRVhURU5UCTIKIAorLyoKKyAqIHRvIGJlIGNhbGxlZCBieSBleHQ0X2V4dF93YWxrX3NwYWNlKCkKKyAqIG5lZ2F0aXZlIHJldGNvZGUgLSBlcnJvcgorICogcG9zaXRpdmUgcmV0Y29kZSAtIHNpZ25hbCBmb3IgZXh0NF9leHRfd2Fsa19zcGFjZSgpLCBzZWUgYmVsb3cKKyAqIGNhbGxiYWNrIG11c3QgcmV0dXJuIHZhbGlkIGV4dGVudCAocGFzc2VkIG9yIG5ld2x5IGNyZWF0ZWQpCisgKi8KK3R5cGVkZWYgaW50ICgqZXh0X3ByZXBhcmVfY2FsbGJhY2spKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLAorCQkJCQlzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKiwKKwkJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICosIHZvaWQgKik7CisKKyNkZWZpbmUgRVhUX0NPTlRJTlVFICAgMAorI2RlZmluZSBFWFRfQlJFQUsgICAgICAxCisjZGVmaW5lIEVYVF9SRVBFQVQgICAgIDIKIAogI2RlZmluZSBFWFRfTUFYX0JMT0NLCTB4ZmZmZmZmZmYKIApAQCAtMjI0LDYgKzIzNyw4IEBACiAJCQkJIHN0cnVjdCBleHQ0X2V4dGVudCAqKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDRfZXh0ZW50ICosIHN0cnVjdCBleHQ0X2V4dF9wYXRoICopOwogZXh0ZXJuIGludCBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqLCBzdHJ1Y3QgZXh0NF9leHRlbnQgKik7CitleHRlcm4gaW50IGV4dDRfZXh0X3dhbGtfc3BhY2Uoc3RydWN0IGlub2RlICosIGV4dDRfbGJsa190LCBleHQ0X2xibGtfdCwKKwkJCQkJCQlleHRfcHJlcGFyZV9jYWxsYmFjaywgdm9pZCAqKTsKIGV4dGVybiBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9leHRfZmluZF9leHRlbnQoc3RydWN0IGlub2RlICosIGV4dDRfbGJsa190LAogCQkJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICopOwogZXh0ZXJuIGludCBleHQ0X2V4dF9zZWFyY2hfbGVmdChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDRfZXh0X3BhdGggKiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9pLmggYi9mcy9leHQ0L2V4dDRfaS5oCmluZGV4IGVmNzQwOWYuLjVjMTI0YzAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9pLmgKKysrIGIvZnMvZXh0NC9leHQ0X2kuaApAQCAtMzMsMzggKzMzLDYgQEAKIC8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgZ3JvdXAgbnVtYmVyICovCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZXh0NF9ncm91cF90OwogCi1zdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvdyB7Ci0JZXh0NF9mc2Jsa190CV9yc3Zfc3RhcnQ7CS8qIEZpcnN0IGJ5dGUgcmVzZXJ2ZWQgKi8KLQlleHQ0X2ZzYmxrX3QJX3Jzdl9lbmQ7CS8qIExhc3QgYnl0ZSByZXNlcnZlZCBvciAwICovCi19OwotCi1zdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlIHsKLQlzdHJ1Y3QgcmJfbm9kZQkJcnN2X25vZGU7Ci0JX191MzIJCQlyc3ZfZ29hbF9zaXplOwotCV9fdTMyCQkJcnN2X2FsbG9jX2hpdDsKLQlzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvdwlyc3Zfd2luZG93OwotfTsKLQotc3RydWN0IGV4dDRfYmxvY2tfYWxsb2NfaW5mbyB7Ci0JLyogaW5mb3JtYXRpb24gYWJvdXQgcmVzZXJ2YXRpb24gd2luZG93ICovCi0Jc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSByc3Zfd2luZG93X25vZGU7Ci0JLyoKLQkgKiB3YXMgaV9uZXh0X2FsbG9jX2Jsb2NrIGluIGV4dDRfaW5vZGVfaW5mbwotCSAqIGlzIHRoZSBsb2dpY2FsIChmaWxlLXJlbGF0aXZlKSBudW1iZXIgb2YgdGhlCi0JICogbW9zdC1yZWNlbnRseS1hbGxvY2F0ZWQgYmxvY2sgaW4gdGhpcyBmaWxlLgotCSAqIFdlIHVzZSB0aGlzIGZvciBkZXRlY3RpbmcgbGluZWFybHkgYXNjZW5kaW5nIGFsbG9jYXRpb24gcmVxdWVzdHMuCi0JICovCi0JZXh0NF9sYmxrX3QgbGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrOwotCS8qCi0JICogV2FzIGlfbmV4dF9hbGxvY19nb2FsIGluIGV4dDRfaW5vZGVfaW5mbwotCSAqIGlzIHRoZSAqcGh5c2ljYWwqIGNvbXBhbmlvbiB0byBpX25leHRfYWxsb2NfYmxvY2suCi0JICogaXQgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgd2hpY2ggd2FzIG1vc3QtcmVjZW50bAotCSAqIGFsbG9jYXRlZCB0byB0aGlzIGZpbGUuICBUaGlzIGdpdmUgdXMgdGhlIGdvYWwgKHRhcmdldCkgZm9yIHRoZSBuZXh0Ci0JICogYWxsb2NhdGlvbiB3aGVuIHdlIGRldGVjdCBsaW5lYXJseSBhc2NlbmRpbmcgcmVxdWVzdHMuCi0JICovCi0JZXh0NF9mc2Jsa190IGxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2s7Ci19OwotCiAjZGVmaW5lIHJzdl9zdGFydCByc3Zfd2luZG93Ll9yc3Zfc3RhcnQKICNkZWZpbmUgcnN2X2VuZCByc3Zfd2luZG93Ll9yc3ZfZW5kCiAKQEAgLTk3LDExICs2NSw4IEBACiAJZXh0NF9ncm91cF90CWlfYmxvY2tfZ3JvdXA7CiAJX191MzIJaV9zdGF0ZTsJCS8qIER5bmFtaWMgc3RhdGUgZmxhZ3MgZm9yIGV4dDQgKi8KIAotCS8qIGJsb2NrIHJlc2VydmF0aW9uIGluZm8gKi8KLQlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICppX2Jsb2NrX2FsbG9jX2luZm87Ci0KIAlleHQ0X2xibGtfdAkJaV9kaXJfc3RhcnRfbG9va3VwOwotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKIAkvKgogCSAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJlYWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBmaWxlCiAJICogZGF0YS4gVGFraW5nIGlfbXV0ZXggZXZlbiB3aGVuIHJlYWRpbmcgd291bGQgY2F1c2UgY29udGVudGlvbgpAQCAtMTExLDcgKzc2LDcgQEAKIAkgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOwogCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9zYi5oIGIvZnMvZXh0NC9leHQ0X3NiLmgKaW5kZXggNjMwMDIyNi4uNmEwYjQwZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X3NiLmgKKysrIGIvZnMvZXh0NC9leHQ0X3NiLmgKQEAgLTQwLDggKzQwLDggQEAKIAl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLwogCWxvZmZfdCBzX2JpdG1hcF9tYXhieXRlczsJLyogbWF4IGJ5dGVzIGZvciBiaXRtYXAgZmlsZXMgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCi0Jc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnNfZ3JvdXBfZGVzYzsKIAl1bnNpZ25lZCBsb25nICBzX21vdW50X29wdDsKIAlleHQ0X2ZzYmxrX3Qgc19zYl9ibG9jazsKIAl1aWRfdCBzX3Jlc3VpZDsKQEAgLTUyLDYgKzUyLDcgQEAKIAlpbnQgc19kZXNjX3Blcl9ibG9ja19iaXRzOwogCWludCBzX2lub2RlX3NpemU7CiAJaW50IHNfZmlyc3RfaW5vOworCXVuc2lnbmVkIGludCBzX2lub2RlX3JlYWRhaGVhZF9ibGtzOwogCXNwaW5sb2NrX3Qgc19uZXh0X2dlbl9sb2NrOwogCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKIAl1MzIgc19oYXNoX3NlZWRbNF07CkBAIC01OSwxNiArNjAsMTcgQEAKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19kaXJ0eWJsb2Nrc19jb3VudGVyOwogCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgc19ibG9ja2dyb3VwX2xvY2s7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzX3Byb2M7CiAKIAkvKiByb290IG9mIHRoZSBwZXIgZnMgcmVzZXJ2YXRpb24gd2luZG93IHRyZWUgKi8KIAlzcGlubG9ja190IHNfcnN2X3dpbmRvd19sb2NrOwogCXN0cnVjdCByYl9yb290IHNfcnN2X3dpbmRvd19yb290OwotCXN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUgc19yc3Zfd2luZG93X2hlYWQ7CiAKIAkvKiBKb3VybmFsaW5nICovCi0Jc3RydWN0IGlub2RlICogc19qb3VybmFsX2lub2RlOwotCXN0cnVjdCBqb3VybmFsX3MgKiBzX2pvdXJuYWw7CisJc3RydWN0IGlub2RlICpzX2pvdXJuYWxfaW5vZGU7CisJc3RydWN0IGpvdXJuYWxfcyAqc19qb3VybmFsOwogCXN0cnVjdCBsaXN0X2hlYWQgc19vcnBoYW47CiAJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpqb3VybmFsX2JkZXY7CkBAIC0xMDYsMTIgKzEwOCwxMiBAQAogCiAJLyogdHVuYWJsZXMgKi8KIAl1bnNpZ25lZCBsb25nIHNfc3RyaXBlOwotCXVuc2lnbmVkIGxvbmcgc19tYl9zdHJlYW1fcmVxdWVzdDsKLQl1bnNpZ25lZCBsb25nIHNfbWJfbWF4X3RvX3NjYW47Ci0JdW5zaWduZWQgbG9uZyBzX21iX21pbl90b19zY2FuOwotCXVuc2lnbmVkIGxvbmcgc19tYl9zdGF0czsKLQl1bnNpZ25lZCBsb25nIHNfbWJfb3JkZXIyX3JlcXM7Ci0JdW5zaWduZWQgbG9uZyBzX21iX2dyb3VwX3ByZWFsbG9jOworCXVuc2lnbmVkIGludCBzX21iX3N0cmVhbV9yZXF1ZXN0OworCXVuc2lnbmVkIGludCBzX21iX21heF90b19zY2FuOworCXVuc2lnbmVkIGludCBzX21iX21pbl90b19zY2FuOworCXVuc2lnbmVkIGludCBzX21iX3N0YXRzOworCXVuc2lnbmVkIGludCBzX21iX29yZGVyMl9yZXFzOworCXVuc2lnbmVkIGludCBzX21iX2dyb3VwX3ByZWFsbG9jOwogCS8qIHdoZXJlIGxhc3QgYWxsb2NhdGlvbiB3YXMgZG9uZSAtIGZvciBzdHJlYW0gYWxsb2NhdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgc19tYl9sYXN0X2dyb3VwOwogCXVuc2lnbmVkIGxvbmcgc19tYl9sYXN0X3N0YXJ0OwpAQCAtMTIxLDcgKzEyMyw2IEBACiAJaW50IHNfbWJfaGlzdG9yeV9jdXI7CiAJaW50IHNfbWJfaGlzdG9yeV9tYXg7CiAJaW50IHNfbWJfaGlzdG9yeV9udW07Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzX21iX3Byb2M7CiAJc3BpbmxvY2tfdCBzX21iX2hpc3RvcnlfbG9jazsKIAlpbnQgc19tYl9oaXN0b3J5X2ZpbHRlcjsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCBiMjRkM2M1Li5lYTJjZTNjIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogCkBAIC0zODMsOCArMzg0LDggQEAKIAlleHRfZGVidWcoIlxuIik7CiB9CiAjZWxzZQotI2RlZmluZSBleHQ0X2V4dF9zaG93X3BhdGgoaW5vZGUscGF0aCkKLSNkZWZpbmUgZXh0NF9leHRfc2hvd19sZWFmKGlub2RlLHBhdGgpCisjZGVmaW5lIGV4dDRfZXh0X3Nob3dfcGF0aChpbm9kZSwgcGF0aCkKKyNkZWZpbmUgZXh0NF9leHRfc2hvd19sZWFmKGlub2RlLCBwYXRoKQogI2VuZGlmCiAKIHZvaWQgZXh0NF9leHRfZHJvcF9yZWZzKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQpAQCAtNDQwLDkgKzQ0MSwxMCBAQAogCQlmb3IgKGsgPSAwOyBrIDwgbGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpOyBrKyssIGl4KyspIHsKIAkJICBpZiAoayAhPSAwICYmCiAJCSAgICAgIGxlMzJfdG9fY3B1KGl4LT5laV9ibG9jaykgPD0gbGUzMl90b19jcHUoaXhbLTFdLmVpX2Jsb2NrKSkgewotCQkJCXByaW50aygiaz0lZCwgaXg9MHglcCwgZmlyc3Q9MHglcFxuIiwgaywKLQkJCQkJaXgsIEVYVF9GSVJTVF9JTkRFWChlaCkpOwotCQkJCXByaW50aygiJXUgPD0gJXVcbiIsCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIms9JWQsIGl4PTB4JXAsICIKKwkJCQkgICAgICAgImZpcnN0PTB4JXBcbiIsIGssCisJCQkJICAgICAgIGl4LCBFWFRfRklSU1RfSU5ERVgoZWgpKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXUgPD0gJXVcbiIsCiAJCQkJICAgICAgIGxlMzJfdG9fY3B1KGl4LT5laV9ibG9jayksCiAJCQkJICAgICAgIGxlMzJfdG9fY3B1KGl4Wy0xXS5laV9ibG9jaykpOwogCQkJfQpAQCAtMTQ3NSw3ICsxNDc3LDcgQEAKIAkJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCkKIHsKLQlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICogZWg7CisJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CiAJc3RydWN0IGV4dDRfZXh0ZW50ICpleCwgKmZleDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKm5lYXJleDsgLyogbmVhcmVzdCBleHRlbnQgKi8KIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqbnBhdGggPSBOVUxMOwpAQCAtMTYyNSw2ICsxNjI3LDExMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBleHQ0X2V4dF93YWxrX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLAorCQkJZXh0NF9sYmxrX3QgbnVtLCBleHRfcHJlcGFyZV9jYWxsYmFjayBmdW5jLAorCQkJdm9pZCAqY2JkYXRhKQoreworCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgY2JleDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OworCWV4dDRfbGJsa190IG5leHQsIHN0YXJ0ID0gMCwgZW5kID0gMDsKKwlleHQ0X2xibGtfdCBsYXN0ID0gYmxvY2sgKyBudW07CisJaW50IGRlcHRoLCBleGlzdHMsIGVyciA9IDA7CisKKwlCVUdfT04oZnVuYyA9PSBOVUxMKTsKKwlCVUdfT04oaW5vZGUgPT0gTlVMTCk7CisKKwl3aGlsZSAoYmxvY2sgPCBsYXN0ICYmIGJsb2NrICE9IEVYVF9NQVhfQkxPQ0spIHsKKwkJbnVtID0gbGFzdCAtIGJsb2NrOworCQkvKiBmaW5kIGV4dGVudCBmb3IgdGhpcyBibG9jayAqLworCQlwYXRoID0gZXh0NF9leHRfZmluZF9leHRlbnQoaW5vZGUsIGJsb2NrLCBwYXRoKTsKKwkJaWYgKElTX0VSUihwYXRoKSkgeworCQkJZXJyID0gUFRSX0VSUihwYXRoKTsKKwkJCXBhdGggPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJCUJVR19PTihwYXRoW2RlcHRoXS5wX2hkciA9PSBOVUxMKTsKKwkJZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKKwkJbmV4dCA9IGV4dDRfZXh0X25leHRfYWxsb2NhdGVkX2Jsb2NrKHBhdGgpOworCisJCWV4aXN0cyA9IDA7CisJCWlmICghZXgpIHsKKwkJCS8qIHRoZXJlIGlzIG5vIGV4dGVudCB5ZXQsIHNvIHRyeSB0byBhbGxvY2F0ZQorCQkJICogYWxsIHJlcXVlc3RlZCBzcGFjZSAqLworCQkJc3RhcnQgPSBibG9jazsKKwkJCWVuZCA9IGJsb2NrICsgbnVtOworCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykgPiBibG9jaykgeworCQkJLyogbmVlZCB0byBhbGxvY2F0ZSBzcGFjZSBiZWZvcmUgZm91bmQgZXh0ZW50ICovCisJCQlzdGFydCA9IGJsb2NrOworCQkJZW5kID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKKwkJCWlmIChibG9jayArIG51bSA8IGVuZCkKKwkJCQllbmQgPSBibG9jayArIG51bTsKKwkJfSBlbHNlIGlmIChibG9jayA+PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spCisJCQkJCSsgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpKSB7CisJCQkvKiBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGFmdGVyIGZvdW5kIGV4dGVudCAqLworCQkJc3RhcnQgPSBibG9jazsKKwkJCWVuZCA9IGJsb2NrICsgbnVtOworCQkJaWYgKGVuZCA+PSBuZXh0KQorCQkJCWVuZCA9IG5leHQ7CisJCX0gZWxzZSBpZiAoYmxvY2sgPj0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkgeworCQkJLyoKKwkJCSAqIHNvbWUgcGFydCBvZiByZXF1ZXN0ZWQgc3BhY2UgaXMgY292ZXJlZAorCQkJICogYnkgZm91bmQgZXh0ZW50CisJCQkgKi8KKwkJCXN0YXJ0ID0gYmxvY2s7CisJCQllbmQgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spCisJCQkJKyBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CisJCQlpZiAoYmxvY2sgKyBudW0gPCBlbmQpCisJCQkJZW5kID0gYmxvY2sgKyBudW07CisJCQlleGlzdHMgPSAxOworCQl9IGVsc2UgeworCQkJQlVHKCk7CisJCX0KKwkJQlVHX09OKGVuZCA8PSBzdGFydCk7CisKKwkJaWYgKCFleGlzdHMpIHsKKwkJCWNiZXguZWNfYmxvY2sgPSBzdGFydDsKKwkJCWNiZXguZWNfbGVuID0gZW5kIC0gc3RhcnQ7CisJCQljYmV4LmVjX3N0YXJ0ID0gMDsKKwkJCWNiZXguZWNfdHlwZSA9IEVYVDRfRVhUX0NBQ0hFX0dBUDsKKwkJfSBlbHNlIHsKKwkJCWNiZXguZWNfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCQkJY2JleC5lY19sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CisJCQljYmV4LmVjX3N0YXJ0ID0gZXh0X3BibG9jayhleCk7CisJCQljYmV4LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQ7CisJCX0KKworCQlCVUdfT04oY2JleC5lY19sZW4gPT0gMCk7CisJCWVyciA9IGZ1bmMoaW5vZGUsIHBhdGgsICZjYmV4LCBleCwgY2JkYXRhKTsKKwkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOworCisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGVyciA9PSBFWFRfUkVQRUFUKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKGVyciA9PSBFWFRfQlJFQUspIHsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChleHRfZGVwdGgoaW5vZGUpICE9IGRlcHRoKSB7CisJCQkvKiBkZXB0aCB3YXMgY2hhbmdlZC4gd2UgaGF2ZSB0byByZWFsbG9jIHBhdGggKi8KKwkJCWtmcmVlKHBhdGgpOworCQkJcGF0aCA9IE5VTEw7CisJCX0KKworCQlibG9jayA9IGNiZXguZWNfYmxvY2sgKyBjYmV4LmVjX2xlbjsKKwl9CisKKwlpZiAocGF0aCkgeworCQlleHQ0X2V4dF9kcm9wX3JlZnMocGF0aCk7CisJCWtmcmVlKHBhdGgpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkCiBleHQ0X2V4dF9wdXRfaW5fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgYmxvY2ssCiAJCQlfX3UzMiBsZW4sIGV4dDRfZnNibGtfdCBzdGFydCwgaW50IHR5cGUpCkBAIC0yMTQyLDcgKzIyNTEsNyBAQAogCSAqLwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkgewotCQlwcmludGsoIkVYVDQtZnM6IGZpbGUgZXh0ZW50cyBlbmFibGVkIik7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGZpbGUgZXh0ZW50cyBlbmFibGVkIik7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCiAJCXByaW50aygiLCBhZ2dyZXNzaXZlIHRlc3RzIik7CiAjZW5kaWYKQEAgLTI2OTYsMTEgKzI4MDUsOCBAQAogCQlnb3RvIG91dDI7CiAJfQogCS8qCi0JICogT2theSwgd2UgbmVlZCB0byBkbyBibG9jayBhbGxvY2F0aW9uLiAgTGF6aWx5IGluaXRpYWxpemUgdGhlIGJsb2NrCi0JICogYWxsb2NhdGlvbiBpbmZvIGhlcmUgaWYgbmVjZXNzYXJ5LgorCSAqIE9rYXksIHdlIG5lZWQgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4KIAkgKi8KLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoIUVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbykpCi0JCWV4dDRfaW5pdF9ibG9ja19hbGxvY19pbmZvKGlub2RlKTsKIAogCS8qIGZpbmQgbmVpZ2hib3VyIGFsbG9jYXRlZCBibG9ja3MgKi8KIAlhci5sbGVmdCA9IGlibG9jazsKQEAgLTI3NjAsNyArMjg2Niw3IEBACiAJCS8qIGZyZWUgZGF0YSBibG9ja3Mgd2UganVzdCBhbGxvY2F0ZWQgKi8KIAkJLyogbm90IGEgZ29vZCBpZGVhIHRvIGNhbGwgZGlzY2FyZCBoZXJlIGRpcmVjdGx5LAogCQkgKiBidXQgb3RoZXJ3aXNlIHdlJ2QgbmVlZCB0byBjYWxsIGl0IGV2ZXJ5IGZyZWUoKSAqLwotCQlleHQ0X21iX2Rpc2NhcmRfaW5vZGVfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOworCQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwogCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGV4dF9wYmxvY2soJm5ld2V4KSwKIAkJCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJm5ld2V4KSwgMCk7CiAJCWdvdG8gb3V0MjsKQEAgLTI4MjQsNyArMjkzMCw3IEBACiAJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CiAJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShpbm9kZSk7CiAKLQlleHQ0X2Rpc2NhcmRfcmVzZXJ2YXRpb24oaW5vZGUpOworCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiAKIAkvKgogCSAqIFRPRE86IG9wdGltaXphdGlvbiBpcyBwb3NzaWJsZSBoZXJlLgpAQCAtMjg3NywxMCArMjk4MywxMSBAQAogCSAqIFVwZGF0ZSBvbmx5IHdoZW4gcHJlYWxsb2NhdGlvbiB3YXMgcmVxdWVzdGVkIGJleW9uZAogCSAqIHRoZSBmaWxlIHNpemUuCiAJICovCi0JaWYgKCEobW9kZSAmIEZBTExPQ19GTF9LRUVQX1NJWkUpICYmCi0JCQkJbmV3X3NpemUgPiBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdfc2l6ZSk7Ci0JCUVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfc2l6ZTsKKwlpZiAoIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpIHsKKwkJaWYgKG5ld19zaXplID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdfc2l6ZSk7CisJCWlmIChuZXdfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpCisJCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfc2l6ZSk7CiAJfQogCiB9CkBAIC0yOTcyLDMgKzMwNzksMTQzIEBACiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIHJldCA+IDAgPyByZXQyIDogcmV0OwogfQorCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIGV4dGVudCB0byBnYXRoZXIgRklFTUFQIGluZm9ybWF0aW9uLgorICovCitpbnQgZXh0NF9leHRfZmllbWFwX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorCQkgICAgICAgc3RydWN0IGV4dDRfZXh0X2NhY2hlICpuZXdleCwgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBibGtzaXplX2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwlfX3U2NAlsb2dpY2FsOworCV9fdTY0CXBoeXNpY2FsOworCV9fdTY0CWxlbmd0aDsKKwlfX3UzMglmbGFncyA9IDA7CisJaW50CWVycm9yOworCisJbG9naWNhbCA9ICAoX191NjQpbmV3ZXgtPmVjX2Jsb2NrIDw8IGJsa3NpemVfYml0czsKKworCWlmIChuZXdleC0+ZWNfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9HQVApIHsKKwkJcGdvZmZfdCBvZmZzZXQ7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCQlvZmZzZXQgPSBsb2dpY2FsID4+IFBBR0VfU0hJRlQ7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsIG9mZnNldCk7CisJCWlmICghcGFnZSB8fCAhcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJCXJldHVybiBFWFRfQ09OVElOVUU7CisKKwkJYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisKKwkJaWYgKCFiaCkKKwkJCXJldHVybiBFWFRfQ09OVElOVUU7CisKKwkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfREVMQUxMT0M7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0gZWxzZSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlyZXR1cm4gRVhUX0NPTlRJTlVFOworCQl9CisJfQorCisJcGh5c2ljYWwgPSAoX191NjQpbmV3ZXgtPmVjX3N0YXJ0IDw8IGJsa3NpemVfYml0czsKKwlsZW5ndGggPSAgIChfX3U2NCluZXdleC0+ZWNfbGVuIDw8IGJsa3NpemVfYml0czsKKworCWlmIChleCAmJiBleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKGV4KSkKKwkJZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9VTldSSVRURU47CisKKwkvKgorCSAqIElmIHRoaXMgZXh0ZW50IHJlYWNoZXMgRVhUX01BWF9CTE9DSywgaXQgbXVzdCBiZSBsYXN0LgorCSAqCisJICogT3IgaWYgZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2sgaXMgRVhUX01BWF9CTE9DSywKKwkgKiB0aGlzIGFsc28gaW5kaWNhdGVzIG5vIG1vcmUgYWxsb2NhdGVkIGJsb2Nrcy4KKwkgKgorCSAqIFhYWCB0aGlzIG1pZ2h0IG1pc3MgYSBzaW5nbGUtYmxvY2sgZXh0ZW50IGF0IEVYVF9NQVhfQkxPQ0sKKwkgKi8KKwlpZiAobG9naWNhbCArIGxlbmd0aCAtIDEgPT0gRVhUX01BWF9CTE9DSyB8fAorCSAgICBleHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhwYXRoKSA9PSBFWFRfTUFYX0JMT0NLKQorCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX0xBU1Q7CisKKwllcnJvciA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIGxvZ2ljYWwsIHBoeXNpY2FsLAorCQkJCQlsZW5ndGgsIGZsYWdzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKGVycm9yID09IDEpCisJCXJldHVybiBFWFRfQlJFQUs7CisKKwlyZXR1cm4gRVhUX0NPTlRJTlVFOworfQorCisvKiBmaWVtYXAgZmxhZ3Mgd2UgY2FuIGhhbmRsZSBzcGVjaWZpZWQgaGVyZSAqLworI2RlZmluZSBFWFQ0X0ZJRU1BUF9GTEFHUwkoRklFTUFQX0ZMQUdfU1lOQ3xGSUVNQVBfRkxBR19YQVRUUikKKworaW50IGV4dDRfeGF0dHJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8pCit7CisJX191NjQgcGh5c2ljYWwgPSAwOworCV9fdTY0IGxlbmd0aDsKKwlfX3UzMiBmbGFncyA9IEZJRU1BUF9FWFRFTlRfTEFTVDsKKwlpbnQgYmxvY2tiaXRzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVycm9yID0gMDsKKworCS8qIGluLWlub2RlPyAqLworCWlmIChFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9YQVRUUikgeworCQlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CisJCWludCBvZmZzZXQ7CS8qIG9mZnNldCBvZiB4YXR0ciBpbiBpbm9kZSAqLworCisJCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJcGh5c2ljYWwgPSBpbG9jLmJoLT5iX2Jsb2NrbnIgPDwgYmxvY2tiaXRzOworCQlvZmZzZXQgPSBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQkJCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemU7CisJCXBoeXNpY2FsICs9IG9mZnNldDsKKwkJbGVuZ3RoID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZSAtIG9mZnNldDsKKwkJZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9EQVRBX0lOTElORTsKKwl9IGVsc2UgeyAvKiBleHRlcm5hbCBibG9jayAqLworCQlwaHlzaWNhbCA9IEVYVDRfSShpbm9kZSktPmlfZmlsZV9hY2wgPDwgYmxvY2tiaXRzOworCQlsZW5ndGggPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJfQorCisJaWYgKHBoeXNpY2FsKQorCQllcnJvciA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIDAsIHBoeXNpY2FsLAorCQkJCQkJbGVuZ3RoLCBmbGFncyk7CisJcmV0dXJuIChlcnJvciA8IDAgPyBlcnJvciA6IDApOworfQorCitpbnQgZXh0NF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJX191NjQgc3RhcnQsIF9fdTY0IGxlbikKK3sKKwlleHQ0X2xibGtfdCBzdGFydF9ibGs7CisJZXh0NF9sYmxrX3QgbGVuX2Jsa3M7CisJaW50IGVycm9yID0gMDsKKworCS8qIGZhbGxiYWNrIHRvIGdlbmVyaWMgaGVyZSBpZiBub3QgaW4gZXh0ZW50cyBmbXQgKi8KKwlpZiAoIShFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKSkKKwkJcmV0dXJuIGdlbmVyaWNfYmxvY2tfZmllbWFwKGlub2RlLCBmaWVpbmZvLCBzdGFydCwgbGVuLAorCQkJZXh0NF9nZXRfYmxvY2spOworCisJaWYgKGZpZW1hcF9jaGVja19mbGFncyhmaWVpbmZvLCBFWFQ0X0ZJRU1BUF9GTEFHUykpCisJCXJldHVybiAtRUJBRFI7CisKKwlpZiAoZmllaW5mby0+ZmlfZmxhZ3MgJiBGSUVNQVBfRkxBR19YQVRUUikgeworCQllcnJvciA9IGV4dDRfeGF0dHJfZmllbWFwKGlub2RlLCBmaWVpbmZvKTsKKwl9IGVsc2UgeworCQlzdGFydF9ibGsgPSBzdGFydCA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJbGVuX2Jsa3MgPSBsZW4gPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwkJLyoKKwkJICogV2FsayB0aGUgZXh0ZW50IHRyZWUgZ2F0aGVyaW5nIGV4dGVudCBpbmZvcm1hdGlvbi4KKwkJICogZXh0NF9leHRfZmllbWFwX2NiIHdpbGwgcHVzaCBleHRlbnRzIGJhY2sgdG8gdXNlci4KKwkJICovCisJCWRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOworCQllcnJvciA9IGV4dDRfZXh0X3dhbGtfc3BhY2UoaW5vZGUsIHN0YXJ0X2JsaywgbGVuX2Jsa3MsCisJCQkJCSAgZXh0NF9leHRfZmllbWFwX2NiLCBmaWVpbmZvKTsKKwkJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9maWxlLmMgYi9mcy9leHQ0L2ZpbGUuYwppbmRleCA0MzBlYjc5Li42YmQxMWZiIDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZpbGUuYworKysgYi9mcy9leHQ0L2ZpbGUuYwpAQCAtMzEsMTQgKzMxLDE0IEBACiAgKiBmcm9tIGV4dDRfZmlsZV9vcGVuOiBvcGVuIGdldHMgY2FsbGVkIGF0IGV2ZXJ5IG9wZW4sIGJ1dCByZWxlYXNlCiAgKiBnZXRzIGNhbGxlZCBvbmx5IHdoZW4gL2FsbC8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCiAgKi8KLXN0YXRpYyBpbnQgZXh0NF9yZWxlYXNlX2ZpbGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgaW50IGV4dDRfcmVsZWFzZV9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCS8qIGlmIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXIgb24gdGhlIGlub2RlLCBkcm9wIHRoZSBibG9jayByZXNlcnZhdGlvbiAqLwogCWlmICgoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCiAJCQkoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID09IDEpKQogCXsKIAkJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7Ci0JCWV4dDRfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiAJCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAl9CiAJaWYgKGlzX2R4KGlub2RlKSAmJiBmaWxwLT5wcml2YXRlX2RhdGEpCkBAIC0xNDAsNiArMTQwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorZXh0ZXJuIGludCBleHQ0X2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAorCQlfX3U2NCBzdGFydCwgX191NjQgbGVuKTsKKwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZG9fc3luY19yZWFkLApAQCAtMTYyLDcgKzE2NSw3IEBACiAJLnRydW5jYXRlCT0gZXh0NF90cnVuY2F0ZSwKIAkuc2V0YXR0cgk9IGV4dDRfc2V0YXR0ciwKIAkuZ2V0YXR0cgk9IGV4dDRfZ2V0YXR0ciwKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1hBVFRSCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBleHQ0X2xpc3R4YXR0ciwKQEAgLTE3MCw1ICsxNzMsNiBAQAogI2VuZGlmCiAJLnBlcm1pc3Npb24JPSBleHQ0X3Blcm1pc3Npb24sCiAJLmZhbGxvY2F0ZQk9IGV4dDRfZmFsbG9jYXRlLAorCS5maWVtYXAJCT0gZXh0NF9maWVtYXAsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZzeW5jLmMgYi9mcy9leHQ0L2ZzeW5jLmMKaW5kZXggYTQ1YzM3My4uNWFmZTQzNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9mc3luYy5jCisrKyBiL2ZzL2V4dDQvZnN5bmMuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KICNpbmNsdWRlICJleHQ0LmgiCiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAKQEAgLTQzLDcgKzQ0LDcgQEAKICAqIGlub2RlIHRvIGRpc2suCiAgKi8KIAotaW50IGV4dDRfc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCitpbnQgZXh0NF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbDsKQEAgLTUxLDYgKzUyLDEwIEBACiAKIAlKX0FTU0VSVChleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBOVUxMKTsKIAorCXRyYWNlX21hcmsoZXh0NF9zeW5jX2ZpbGUsICJkZXYgJXMgZGF0YXN5bmMgJWQgaW5vICVsZCBwYXJlbnQgJWxkIiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGRhdGFzeW5jLCBpbm9kZS0+aV9pbm8sCisJCSAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vKTsKKwogCS8qCiAJICogZGF0YT13cml0ZWJhY2s6CiAJICogIFRoZSBjYWxsZXIncyBmaWxlbWFwX2ZkYXRhd3JpdGUoKS93YWl0IHdpbGwgc3luYyB0aGUgZGF0YS4KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaGFzaC5jIGIvZnMvZXh0NC9oYXNoLmMKaW5kZXggMWQ2MzI5ZC4uNTU2Y2E4ZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9oYXNoLmMKKysrIGIvZnMvZXh0NC9oYXNoLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAkJc3VtICs9IERFTFRBOwogCQliMCArPSAoKGIxIDw8IDQpK2EpIF4gKGIxK3N1bSkgXiAoKGIxID4+IDUpK2IpOwogCQliMSArPSAoKGIwIDw8IDQpK2MpIF4gKGIwK3N1bSkgXiAoKGIwID4+IDUpK2QpOwotCX0gd2hpbGUoLS1uKTsKKwl9IHdoaWxlICgtLW4pOwogCiAJYnVmWzBdICs9IGIwOwogCWJ1ZlsxXSArPSBiMTsKQEAgLTM1LDcgKzM1LDcgQEAKIAogCiAvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCi1zdGF0aWMgX191MzIgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQorc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewogCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OwogCXdoaWxlIChsZW4tLSkgewpAQCAtNTksNyArNTksNyBAQAogCXZhbCA9IHBhZDsKIAlpZiAobGVuID4gbnVtKjQpCiAJCWxlbiA9IG51bSAqIDQ7Ci0JZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoKGkgJSA0KSA9PSAwKQogCQkJdmFsID0gcGFkOwogCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIAkvKiBDaGVjayB0byBzZWUgaWYgdGhlIHNlZWQgaXMgYWxsIHplcm8ncyAqLwogCWlmIChoaW5mby0+c2VlZCkgewotCQlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQlpZiAoaGluZm8tPnNlZWRbaV0pCiAJCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCmluZGV4IGYzNDQ4MzQuLmZlMzRkNzQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaWFsbG9jLmMKKysrIGIvZnMvZXh0NC9pYWxsb2MuYwpAQCAtMTE1LDkgKzExNSwxMSBAQAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChiaF91cHRvZGF0ZV9vcl9sb2NrKGJoKSkKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSkKIAkJcmV0dXJuIGJoOwogCisJbG9ja19idWZmZXIoYmgpOwogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKIAlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1VOSU5JVCkpIHsKIAkJZXh0NF9pbml0X2lub2RlX2JpdG1hcChzYiwgYmgsIGJsb2NrX2dyb3VwLCBkZXNjKTsKQEAgLTE1NCwzOSArMTU2LDQwIEBACiAgKiB0aG91Z2gpLCBhbmQgdGhlbiB3ZSdkIGhhdmUgdHdvIGlub2RlcyBzaGFyaW5nIHRoZQogICogc2FtZSBpbm9kZSBudW1iZXIgYW5kIHNwYWNlIG9uIHRoZSBoYXJkZGlzay4KICAqLwotdm9pZCBleHQ0X2ZyZWVfaW5vZGUgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQordm9pZCBleHQ0X2ZyZWVfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlpbnQgaXNfZGlyZWN0b3J5OwogCXVuc2lnbmVkIGxvbmcgaW5vOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKIAlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7CiAJdW5zaWduZWQgbG9uZyBiaXQ7Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqIGdkcDsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCWludCBmYXRhbCA9IDAsIGVycjsKIAlleHQ0X2dyb3VwX3QgZmxleF9ncm91cDsKIAogCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpID4gMSkgewotCQlwcmludGsgKCJleHQ0X2ZyZWVfaW5vZGU6IGlub2RlIGhhcyBjb3VudD0lZFxuIiwKLQkJCQkJYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSk7CisJCXByaW50ayhLRVJOX0VSUiAiZXh0NF9mcmVlX2lub2RlOiBpbm9kZSBoYXMgY291bnQ9JWRcbiIsCisJCSAgICAgICBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoaW5vZGUtPmlfbmxpbmspIHsKLQkJcHJpbnRrICgiZXh0NF9mcmVlX2lub2RlOiBpbm9kZSBoYXMgbmxpbms9JWRcbiIsCi0JCQlpbm9kZS0+aV9ubGluayk7CisJCXByaW50ayhLRVJOX0VSUiAiZXh0NF9mcmVlX2lub2RlOiBpbm9kZSBoYXMgbmxpbms9JWRcbiIsCisJCSAgICAgICBpbm9kZS0+aV9ubGluayk7CiAJCXJldHVybjsKIAl9CiAJaWYgKCFzYikgewotCQlwcmludGsoImV4dDRfZnJlZV9pbm9kZTogaW5vZGUgb24gbm9uZXhpc3RlbnQgZGV2aWNlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJleHQ0X2ZyZWVfaW5vZGU6IGlub2RlIG9uICIKKwkJICAgICAgICJub25leGlzdGVudCBkZXZpY2VcbiIpOwogCQlyZXR1cm47CiAJfQogCXNiaSA9IEVYVDRfU0Ioc2IpOwogCiAJaW5vID0gaW5vZGUtPmlfaW5vOwotCWV4dDRfZGVidWcgKCJmcmVlaW5nIGlub2RlICVsdVxuIiwgaW5vKTsKKwlleHQ0X2RlYnVnKCJmcmVlaW5nIGlub2RlICVsdVxuIiwgaW5vKTsKIAogCS8qCiAJICogTm90ZTogd2UgbXVzdCBmcmVlIGFueSBxdW90YSBiZWZvcmUgbG9ja2luZyB0aGUgc3VwZXJibG9jaywKQEAgLTIwMCwxMiArMjAzLDEyIEBACiAJaXNfZGlyZWN0b3J5ID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKIAogCS8qIERvIHRoaXMgQkVGT1JFIG1hcmtpbmcgdGhlIGlub2RlIG5vdCBpbiB1c2Ugb3IgcmV0dXJuaW5nIGFuIGVycm9yICovCi0JY2xlYXJfaW5vZGUgKGlub2RlKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7CiAKIAllcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwogCWlmIChpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikgfHwgaW5vID4gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSkgewotCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZnJlZV9pbm9kZSIsCi0JCQkgICAgInJlc2VydmVkIG9yIG5vbmV4aXN0ZW50IGlub2RlICVsdSIsIGlubyk7CisJCWV4dDRfZXJyb3Ioc2IsICJleHQ0X2ZyZWVfaW5vZGUiLAorCQkJICAgInJlc2VydmVkIG9yIG5vbmV4aXN0ZW50IGlub2RlICVsdSIsIGlubyk7CiAJCWdvdG8gZXJyb3JfcmV0dXJuOwogCX0KIAlibG9ja19ncm91cCA9IChpbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYik7CkBAIC0yMjIsMTAgKzIyNSwxMCBAQAogCS8qIE9rLCBub3cgd2UgY2FuIGFjdHVhbGx5IHVwZGF0ZSB0aGUgaW5vZGUgYml0bWFwcy4uICovCiAJaWYgKCFleHQ0X2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCiAJCQkJCWJpdCwgYml0bWFwX2JoLT5iX2RhdGEpKQotCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfZnJlZV9pbm9kZSIsCi0JCQkgICAgICAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgaW5vZGUgJWx1IiwgaW5vKTsKKwkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9pbm9kZSIsCisJCQkgICAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgaW5vZGUgJWx1IiwgaW5vKTsKIAllbHNlIHsKLQkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCAmYmgyKTsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOwogCiAJCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJCWZhdGFsID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOwpAQCAtMjg3LDcgKzI5MCw3IEBACiAJYXZlZnJlZWkgPSBmcmVlaSAvIG5ncm91cHM7CiAKIAlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7Ci0JCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsIE5VTEwpOworCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOwogCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQogCQkJY29udGludWU7CiAJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKQEAgLTU3NiwxNiArNTc5LDE2IEBACiAgKiBGb3Igb3RoZXIgaW5vZGVzLCBzZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3J5J3MgYmxvY2sKICAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgogICovCi1zdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqIGRpciwgaW50IG1vZGUpCitzdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKIAlleHQ0X2dyb3VwX3QgZ3JvdXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwID0gTlVMTDsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCWludCByZXQyLCBlcnIgPSAwOwpAQCAtNjEzLDcgKzYxNiw3IEBACiAJfQogCiAJaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaWYgKHRlc3Rfb3B0IChzYiwgT0xEQUxMT0MpKQorCQlpZiAodGVzdF9vcHQoc2IsIE9MREFMTE9DKSkKIAkJCXJldDIgPSBmaW5kX2dyb3VwX2RpcihzYiwgZGlyLCAmZ3JvdXApOwogCQllbHNlCiAJCQlyZXQyID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyLCAmZ3JvdXApOwpAQCAtNzgzLDcgKzc4Niw3IEBACiAJfQogCiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7Ci0JaWYgKHRlc3Rfb3B0IChzYiwgR1JQSUQpKQorCWlmICh0ZXN0X29wdChzYiwgR1JQSUQpKQogCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOwogCWVsc2UgaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgewogCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOwpAQCAtODE2LDcgKzgxOSw2IEBACiAJCWVpLT5pX2ZsYWdzICY9IH5FWFQ0X0RJUlNZTkNfRkw7CiAJZWktPmlfZmlsZV9hY2wgPSAwOwogCWVpLT5pX2R0aW1lID0gMDsKLQllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKIAllaS0+aV9ibG9ja19ncm91cCA9IGdyb3VwOwogCiAJZXh0NF9zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOwpAQCAtODMyLDcgKzgzNCw3IEBACiAJZWktPmlfZXh0cmFfaXNpemUgPSBFWFQ0X1NCKHNiKS0+c193YW50X2V4dHJhX2lzaXplOwogCiAJcmV0ID0gaW5vZGU7Ci0JaWYoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgewogCQllcnIgPSAtRURRVU9UOwogCQlnb3RvIGZhaWxfZHJvcDsKIAl9CkBAIC04NDEsNyArODQzLDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWxfZnJlZV9kcm9wOwogCi0JZXJyID0gZXh0NF9pbml0X3NlY3VyaXR5KGhhbmRsZSxpbm9kZSwgZGlyKTsKKwllcnIgPSBleHQ0X2luaXRfc2VjdXJpdHkoaGFuZGxlLCBpbm9kZSwgZGlyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWxfZnJlZV9kcm9wOwogCkBAIC05NTksNyArOTYxLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi11bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQordW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50OwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKQEAgLTk3NCw3ICs5NzYsNyBAQAogCWJpdG1hcF9jb3VudCA9IDA7CiAJZ2RwID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKLQkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKIAkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKQEAgLTk4OSwxMyArOTkxLDE0IEBACiAJCWJpdG1hcF9jb3VudCArPSB4OwogCX0KIAlicmVsc2UoYml0bWFwX2JoKTsKLQlwcmludGsoImV4dDRfY291bnRfZnJlZV9pbm9kZXM6IHN0b3JlZCA9ICV1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAotCQlsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCksIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CisJcHJpbnRrKEtFUk5fREVCVUcgImV4dDRfY291bnRfZnJlZV9pbm9kZXM6ICIKKwkgICAgICAgInN0b3JlZCA9ICV1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCksIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CiAJcmV0dXJuIGRlc2NfY291bnQ7CiAjZWxzZQogCWRlc2NfY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgewotCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwogCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOwpAQCAtMTAwNiwxMyArMTAwOSwxMyBAQAogfQogCiAvKiBDYWxsZWQgYXQgbW91bnQtdGltZSwgc3VwZXItYmxvY2sgaXMgbG9ja2VkICovCi11bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZGlycyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZGlycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlleHQ0X2dyb3VwX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwogCQljb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggN2U5MTkxM2UuLjliNGVjOWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogLyoKICAqIENhbGxlZCBhdCB0aGUgbGFzdCBpcHV0KCkgaWYgaV9ubGluayBpcyB6ZXJvLgogICovCi12b2lkIGV4dDRfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3ZvaWQgZXh0NF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAloYW5kbGVfdCAqaGFuZGxlOwogCWludCBlcnI7CkBAIC0zMzAsMTEgKzMzMCwxMSBAQAogCWludCBmaW5hbCA9IDA7CiAKIAlpZiAoaV9ibG9jayA8IDApIHsKLQkJZXh0NF93YXJuaW5nIChpbm9kZS0+aV9zYiwgImV4dDRfYmxvY2tfdG9fcGF0aCIsICJibG9jayA8IDAiKTsKKwkJZXh0NF93YXJuaW5nKGlub2RlLT5pX3NiLCAiZXh0NF9ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOwogCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKIAkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKIAkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOwotCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBkaXJlY3RfYmxvY2tzKSA8IGluZGlyZWN0X2Jsb2NrcykgewogCQlvZmZzZXRzW24rK10gPSBFWFQ0X0lORF9CTE9DSzsKIAkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKIAkJZmluYWwgPSBwdHJzOwpAQCAtNDAwLDE0ICs0MDAsMTQgQEAKIAogCSplcnIgPSAwOwogCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KLQlhZGRfY2hhaW4gKGNoYWluLCBOVUxMLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7CisJYWRkX2NoYWluKGNoYWluLCBOVUxMLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7CiAJaWYgKCFwLT5rZXkpCiAJCWdvdG8gbm9fYmxvY2s7CiAJd2hpbGUgKC0tZGVwdGgpIHsKIAkJYmggPSBzYl9icmVhZChzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7CiAJCWlmICghYmgpCiAJCQlnb3RvIGZhaWx1cmU7Ci0JCWFkZF9jaGFpbigrK3AsIGJoLCAoX19sZTMyKiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7CisJCWFkZF9jaGFpbigrK3AsIGJoLCAoX19sZTMyICopYmgtPmJfZGF0YSArICorK29mZnNldHMpOwogCQkvKiBSZWFkZXI6IGVuZCAqLwogCQlpZiAoIXAtPmtleSkKIAkJCWdvdG8gbm9fYmxvY2s7CkBAIC00NDMsNyArNDQzLDcgQEAKIHN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyKikgaW5kLT5iaC0+Yl9kYXRhIDogZWktPmlfZGF0YTsKKwlfX2xlMzIgKnN0YXJ0ID0gaW5kLT5iaCA/IChfX2xlMzIgKikgaW5kLT5iaC0+Yl9kYXRhIDogZWktPmlfZGF0YTsKIAlfX2xlMzIgKnA7CiAJZXh0NF9mc2Jsa190IGJnX3N0YXJ0OwogCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOwpAQCAtNDg2LDE4ICs0ODYsOSBAQAogc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKIAkJSW5kaXJlY3QgKnBhcnRpYWwpCiB7Ci0Jc3RydWN0IGV4dDRfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKLQotCWJsb2NrX2kgPSAgRVhUNF9JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOwotCiAJLyoKLQkgKiB0cnkgdGhlIGhldXJpc3RpYyBmb3Igc2VxdWVudGlhbCBhbGxvY2F0aW9uLAotCSAqIGZhaWxpbmcgdGhhdCBhdCBsZWFzdCB0cnkgdG8gZ2V0IGRlY2VudCBsb2NhbGl0eS4KKwkgKiBYWFggbmVlZCB0byBnZXQgZ29hbCBibG9jayBmcm9tIG1iYWxsb2MncyBkYXRhIHN0cnVjdHVyZXMKIAkgKi8KLQlpZiAoYmxvY2tfaSAmJiAoYmxvY2sgPT0gYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrICsgMSkKLQkJJiYgKGJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgIT0gMCkpIHsKLQkJcmV0dXJuIGJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgKyAxOwotCX0KIAogCXJldHVybiBleHQ0X2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7CiB9CkBAIC02MzAsNyArNjIxLDcgQEAKIAkqZXJyID0gMDsKIAlyZXR1cm4gcmV0OwogZmFpbGVkX291dDoKLQlmb3IgKGkgPSAwOyBpIDxpbmRleDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQogCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG5ld19ibG9ja3NbaV0sIDEsIDApOwogCXJldHVybiByZXQ7CiB9CkBAIC03MDMsNyArNjk0LDcgQEAKIAkJYnJhbmNoW25dLnAgPSAoX19sZTMyICopIGJoLT5iX2RhdGEgKyBvZmZzZXRzW25dOwogCQlicmFuY2hbbl0ua2V5ID0gY3B1X3RvX2xlMzIobmV3X2Jsb2Nrc1tuXSk7CiAJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7Ci0JCWlmICggbiA9PSBpbmRpcmVjdF9ibGtzKSB7CisJCWlmIChuID09IGluZGlyZWN0X2Jsa3MpIHsKIAkJCWN1cnJlbnRfYmxvY2sgPSBuZXdfYmxvY2tzW25dOwogCQkJLyoKIAkJCSAqIEVuZCBvZiBjaGFpbiwgdXBkYXRlIHRoZSBsYXN0IG5ldyBtZXRhYmxvY2sgb2YKQEAgLTczMCw3ICs3MjEsNyBAQAogCQlCVUZGRVJfVFJBQ0UoYnJhbmNoW2ldLmJoLCAiY2FsbCBqYmQyX2pvdXJuYWxfZm9yZ2V0Iik7CiAJCWV4dDRfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBicmFuY2hbaV0uYmgpOwogCX0KLQlmb3IgKGkgPSAwOyBpIDxpbmRpcmVjdF9ibGtzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGluZGlyZWN0X2Jsa3M7IGkrKykKIAkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBuZXdfYmxvY2tzW2ldLCAxLCAwKTsKIAogCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbmV3X2Jsb2Nrc1tpXSwgbnVtLCAwKTsKQEAgLTc1NywxMCArNzQ4LDggQEAKIHsKIAlpbnQgaTsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpibG9ja19pOwogCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOwogCi0JYmxvY2tfaSA9IEVYVDRfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKIAkvKgogCSAqIElmIHdlJ3JlIHNwbGljaW5nIGludG8gYSBbdGRdaW5kaXJlY3QgYmxvY2sgKGFzIG9wcG9zZWQgdG8gdGhlCiAJICogaW5vZGUpIHRoZW4gd2UgbmVlZCB0byBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZSBbdGRdaW5kaXJlY3QgYmxvY2sKQEAgLTc4MywxOCArNzcyLDcgQEAKIAlpZiAobnVtID09IDAgJiYgYmxrcyA+IDEpIHsKIAkJY3VycmVudF9ibG9jayA9IGxlMzJfdG9fY3B1KHdoZXJlLT5rZXkpICsgMTsKIAkJZm9yIChpID0gMTsgaSA8IGJsa3M7IGkrKykKLQkJCSood2hlcmUtPnAgKyBpICkgPSBjcHVfdG9fbGUzMihjdXJyZW50X2Jsb2NrKyspOwotCX0KLQotCS8qCi0JICogdXBkYXRlIHRoZSBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBsb2dpY2FsICYgcGh5c2ljYWwgYmxvY2sKLQkgKiBpbiBpX2Jsb2NrX2FsbG9jX2luZm8sIHRvIGFzc2lzdCBmaW5kIHRoZSBwcm9wZXIgZ29hbCBibG9jayBmb3IgbmV4dAotCSAqIGFsbG9jYXRpb24KLQkgKi8KLQlpZiAoYmxvY2tfaSkgewotCQlibG9ja19pLT5sYXN0X2FsbG9jX2xvZ2ljYWxfYmxvY2sgPSBibG9jayArIGJsa3MgLSAxOwotCQlibG9ja19pLT5sYXN0X2FsbG9jX3BoeXNpY2FsX2Jsb2NrID0KLQkJCQlsZTMyX3RvX2NwdSh3aGVyZVtudW1dLmtleSkgKyBibGtzIC0gMTsKKwkJCSood2hlcmUtPnAgKyBpKSA9IGNwdV90b19sZTMyKGN1cnJlbnRfYmxvY2srKyk7CiAJfQogCiAJLyogV2UgYXJlIGRvbmUgd2l0aCBhdG9taWMgc3R1ZmYsIG5vdyBkbyB0aGUgcmVzdCBvZiBob3VzZWtlZXBpbmcgKi8KQEAgLTkxNCwxMiArODkyLDggQEAKIAkJZ290byBjbGVhbnVwOwogCiAJLyoKLQkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uICBMYXppbHkgaW5pdGlhbGl6ZSB0aGUgYmxvY2sKLQkgKiBhbGxvY2F0aW9uIGluZm8gaGVyZSBpZiBuZWNlc3NhcnkKKwkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCiAJKi8KLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoIWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pKQotCQlleHQ0X2luaXRfYmxvY2tfYWxsb2NfaW5mbyhpbm9kZSk7Ci0KIAlnb2FsID0gZXh0NF9maW5kX2dvYWwoaW5vZGUsIGlibG9jaywgcGFydGlhbCk7CiAKIAkvKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlIGZvciBbZCx0XWluZGlyZWN0IGJsb2NrcyAqLwpAQCAtMTAzMCwxOSArMTAwNCwyMCBAQAogCUJVR19PTihtZGIgPiBFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzKTsKIAltZGJfZnJlZSA9IEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgLSBtZGI7CiAKLQkvKiBBY2NvdW50IGZvciBhbGxvY2F0ZWQgbWV0YV9ibG9ja3MgKi8KLQltZGJfZnJlZSAtPSBFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKKwlpZiAobWRiX2ZyZWUpIHsKKwkJLyogQWNjb3VudCBmb3IgYWxsb2NhdGVkIG1ldGFfYmxvY2tzICovCisJCW1kYl9mcmVlIC09IEVYVDRfSShpbm9kZSktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzOwogCi0JLyogdXBkYXRlIGZzIGZyZWUgYmxvY2tzIGNvdW50ZXIgZm9yIHRydW5jYXRlIGNhc2UgKi8KLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIG1kYl9mcmVlKTsKKwkJLyogdXBkYXRlIGZzIGRpcnR5IGJsb2NrcyBjb3VudGVyICovCisJCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsIG1kYl9mcmVlKTsKKwkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgPSAwOworCQlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzID0gbWRiOworCX0KIAogCS8qIHVwZGF0ZSBwZXItaW5vZGUgcmVzZXJ2YXRpb25zICovCiAJQlVHX09OKHVzZWQgID4gRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcyk7CiAJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2NrcyAtPSB1c2VkOwogCi0JQlVHX09OKG1kYiA+IEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOwotCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSBtZGI7Ci0JRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgPSAwOwogCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogfQogCkBAIC0xMTYwLDggKzExMzUsOCBAQAogLyogTWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHdlIG1hcCBmb3IgZGlyZWN0IElPIGF0IG9uY2UuICovCiAjZGVmaW5lIERJT19NQVhfQkxPQ0tTIDQwOTYKIAotc3RhdGljIGludCBleHQ0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK2ludCBleHQ0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogewogCWhhbmRsZV90ICpoYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAlpbnQgcmV0ID0gMCwgc3RhcnRlZCA9IDA7CkBAIC0xMjQxLDcgKzEyMTYsNyBAQAogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOwogCQkJZmF0YWwgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CiAJCQlpZiAoIWZhdGFsICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JCQkJbWVtc2V0KGJoLT5iX2RhdGEsMCxpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJfQogCQkJdW5sb2NrX2J1ZmZlcihiaCk7CkBAIC0xMjY2LDcgKzEyNDEsNyBAQAogc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2JyZWFkKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgZXh0NF9sYmxrX3QgYmxvY2ssIGludCBjcmVhdGUsIGludCAqZXJyKQogewotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAliaCA9IGV4dDRfZ2V0YmxrKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCBjcmVhdGUsIGVycik7CiAJaWYgKCFiaCkKQEAgLTEyODIsMTMgKzEyNTcsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCB3YWxrX3BhZ2VfYnVmZmVycygJaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsCi0JCQkJdW5zaWduZWQgZnJvbSwKLQkJCQl1bnNpZ25lZCB0bywKLQkJCQlpbnQgKnBhcnRpYWwsCi0JCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCitzdGF0aWMgaW50IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwKKwkJCSAgICAgdW5zaWduZWQgZnJvbSwKKwkJCSAgICAgdW5zaWduZWQgdG8sCisJCQkgICAgIGludCAqcGFydGlhbCwKKwkJCSAgICAgaW50ICgqZm4pKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKQEAgLTEyOTYsOSArMTI3MSw5IEBACiAJaW50IGVyciwgcmV0ID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQ7CiAKLQlmb3IgKAliaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsKLQkJcmV0ID09IDAgJiYgKGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0KTsKLQkJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gbmV4dCkKKwlmb3IgKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOworCSAgICAgcmV0ID09IDAgJiYgKGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0KTsKKwkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IG5leHQpCiAJewogCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOwogCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKQEAgLTEzNTEsMjMgKzEzMjYsMjMgQEAKIAkJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAogCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpCiB7Ci0gCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCWludCByZXQsIG5lZWRlZF9ibG9ja3MgPSBleHQ0X3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IHJldHJpZXMgPSAwOwotIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKICAJcGdvZmZfdCBpbmRleDsKLSAJdW5zaWduZWQgZnJvbSwgdG87CisJdW5zaWduZWQgZnJvbSwgdG87CiAKICAJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKLSAJZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKLSAJdG8gPSBmcm9tICsgbGVuOworCWZyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJdG8gPSBmcm9tICsgbGVuOwogCiByZXRyeToKLSAgCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgbmVlZGVkX2Jsb2Nrcyk7Ci0gIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLSAgCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0gIAkJZ290byBvdXQ7CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBuZWVkZWRfYmxvY2tzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dDsKIAl9CiAKIAlwYWdlID0gX19ncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpOwpAQCAtMTM4Nyw5ICsxMzYyLDE2IEBACiAJfQogCiAJaWYgKHJldCkgewotIAkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCS8qCisJCSAqIGJsb2NrX3dyaXRlX2JlZ2luIG1heSBoYXZlIGluc3RhbnRpYXRlZCBhIGZldyBibG9ja3MKKwkJICogb3V0c2lkZSBpX3NpemUuICBUcmltIHRoZXNlIG9mZiBhZ2Fpbi4gRG9uJ3QgbmVlZAorCQkgKiBpX3NpemVfcmVhZCBiZWNhdXNlIHdlIGhvbGQgaV9tdXRleC4KKwkJICovCisJCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKQorCQkJdm10cnVuY2F0ZShpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CiAJfQogCiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCkBAIC0xNDI2LDE2ICsxNDA4LDE4IEBACiAJcmV0ID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CiAKIAlpZiAocmV0ID09IDApIHsKLQkJLyoKLQkJICogZ2VuZXJpY193cml0ZV9lbmQoKSB3aWxsIHJ1biBtYXJrX2lub2RlX2RpcnR5KCkgaWYgaV9zaXplCi0JCSAqIGNoYW5nZXMuICBTbyBsZXQncyBwaWdneWJhY2sgdGhlIGlfZGlza3NpemUgbWFya19pbm9kZV9kaXJ0eQotCQkgKiBpbnRvIHRoYXQuCi0JCSAqLwogCQlsb2ZmX3QgbmV3X2lfc2l6ZTsKIAogCQluZXdfaV9zaXplID0gcG9zICsgY29waWVkOwotCQlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpCi0JCQlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gbmV3X2lfc2l6ZTsKKwkJaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfaV9zaXplKTsKKwkJCS8qIFdlIG5lZWQgdG8gbWFyayBpbm9kZSBkaXJ0eSBldmVuIGlmCisJCQkgKiBuZXdfaV9zaXplIGlzIGxlc3MgdGhhdCBpbm9kZS0+aV9zaXplCisJCQkgKiBidSBncmVhdGVyIHRoYW4gaV9kaXNrc2l6ZS4oaGludCBkZWxhbGxvYykKKwkJCSAqLworCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQl9CisKIAkJcmV0MiA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsCiAJCQkJCQkJcGFnZSwgZnNkYXRhKTsKIAkJY29waWVkID0gcmV0MjsKQEAgLTE0NjAsOCArMTQ0NCwxNCBAQAogCWxvZmZfdCBuZXdfaV9zaXplOwogCiAJbmV3X2lfc2l6ZSA9IHBvcyArIGNvcGllZDsKLQlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpCi0JCUVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfaV9zaXplOworCWlmIChuZXdfaV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgeworCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfaV9zaXplKTsKKwkJLyogV2UgbmVlZCB0byBtYXJrIGlub2RlIGRpcnR5IGV2ZW4gaWYKKwkJICogbmV3X2lfc2l6ZSBpcyBsZXNzIHRoYXQgaW5vZGUtPmlfc2l6ZQorCQkgKiBidSBncmVhdGVyIHRoYW4gaV9kaXNrc2l6ZS4oaGludCBkZWxhbGxvYykKKwkJICovCisJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwl9CiAKIAlyZXQyID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwKIAkJCQkJCQlwYWdlLCBmc2RhdGEpOwpAQCAtMTQ4Niw2ICsxNDc2LDcgQEAKIAlpbnQgcmV0ID0gMCwgcmV0MjsKIAlpbnQgcGFydGlhbCA9IDA7CiAJdW5zaWduZWQgZnJvbSwgdG87CisJbG9mZl90IG5ld19pX3NpemU7CiAKIAlmcm9tID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCXRvID0gZnJvbSArIGxlbjsKQEAgLTE1MDAsMTEgKzE0OTEsMTIgQEAKIAkJCQl0bywgJnBhcnRpYWwsIHdyaXRlX2VuZF9mbik7CiAJaWYgKCFwYXJ0aWFsKQogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JaWYgKHBvcytjb3BpZWQgPiBpbm9kZS0+aV9zaXplKQorCW5ld19pX3NpemUgPSBwb3MgKyBjb3BpZWQ7CisJaWYgKG5ld19pX3NpemUgPiBpbm9kZS0+aV9zaXplKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcytjb3BpZWQpOwogCUVYVDRfSShpbm9kZSktPmlfc3RhdGUgfD0gRVhUNF9TVEFURV9KREFUQTsKLQlpZiAoaW5vZGUtPmlfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKLQkJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCWV4dDRfdXBkYXRlX2lfZGlza3NpemUoaW5vZGUsIG5ld19pX3NpemUpOwogCQlyZXQyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IHJldDI7CkBAIC0xNTIxLDYgKzE1MTMsNyBAQAogCiBzdGF0aWMgaW50IGV4dDRfZGFfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbnJibG9ja3MpCiB7CisJaW50IHJldHJpZXMgPSAwOwogICAgICAgIHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwogICAgICAgIHVuc2lnbmVkIGxvbmcgbWRfbmVlZGVkLCBtZGJsb2NrcywgdG90YWwgPSAwOwogCkBAIC0xNTI5LDYgKzE1MjIsNyBAQAogCSAqIGluIG9yZGVyIHRvIGFsbG9jYXRlIG5yYmxvY2tzCiAJICogd29yc2UgY2FzZSBpcyBvbmUgZXh0ZW50IHBlciBibG9jawogCSAqLworcmVwZWF0OgogCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAl0b3RhbCA9IEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MgKyBucmJsb2NrczsKIAltZGJsb2NrcyA9IGV4dDRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIHRvdGFsKTsKQEAgLTE1MzcsMTMgKzE1MzEsMTQgQEAKIAltZF9uZWVkZWQgPSBtZGJsb2NrcyAtIEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7CiAJdG90YWwgPSBtZF9uZWVkZWQgKyBucmJsb2NrczsKIAotCWlmIChleHQ0X2hhc19mcmVlX2Jsb2NrcyhzYmksIHRvdGFsKSA8IHRvdGFsKSB7CisJaWYgKGV4dDRfY2xhaW1fZnJlZV9ibG9ja3Moc2JpLCB0b3RhbCkpIHsKIAkJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CisJCWlmIChleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKSB7CisJCQl5aWVsZCgpOworCQkJZ290byByZXBlYXQ7CisJCX0KIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQotCS8qIHJlZHVjZSBmcyBmcmVlIGJsb2NrcyBjb3VudGVyICovCi0JcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCB0b3RhbCk7Ci0KIAlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzICs9IG5yYmxvY2tzOwogCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSBtZGJsb2NrczsKIApAQCAtMTU4NSw4ICsxNTgwLDggQEAKIAogCXJlbGVhc2UgPSB0b19mcmVlICsgbWRiX2ZyZWU7CiAKLQkvKiB1cGRhdGUgZnMgZnJlZSBibG9ja3MgY291bnRlciBmb3IgdHJ1bmNhdGUgY2FzZSAqLwotCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgcmVsZWFzZSk7CisJLyogdXBkYXRlIGZzIGRpcnR5IGJsb2NrcyBjb3VudGVyIGZvciB0cnVuY2F0ZSBjYXNlICovCisJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgcmVsZWFzZSk7CiAKIAkvKiB1cGRhdGUgcGVyLWlub2RlIHJlc2VydmF0aW9ucyAqLwogCUJVR19PTih0b19mcmVlID4gRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcyk7CkBAIC0xNjMwLDYgKzE2MjUsNyBAQAogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjOwogCWludCBpb19kb25lOwogCWxvbmcgcGFnZXNfd3JpdHRlbjsKKwlpbnQgcmV0dmFsOwogfTsKIAogLyoKQEAgLTE3ODMsNiArMTc3OSw1NyBAQAogCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJkZXYsIGJoLT5iX2Jsb2NrbnIgKyBpKTsKIH0KIAorc3RhdGljIHZvaWQgZXh0NF9kYV9ibG9ja19pbnZhbGlkYXRlcGFnZXMoc3RydWN0IG1wYWdlX2RhX2RhdGEgKm1wZCwKKwkJCQkJc2VjdG9yX3QgbG9naWNhbCwgbG9uZyBibGtfY250KQoreworCWludCBucl9wYWdlcywgaTsKKwlwZ29mZl90IGluZGV4LCBlbmQ7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbXBkLT5pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlpbmRleCA9IGxvZ2ljYWwgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwllbmQgICA9IChsb2dpY2FsICsgYmxrX2NudCAtIDEpID4+CisJCQkJKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwl3aGlsZSAoaW5kZXggPD0gZW5kKSB7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIGluZGV4LCBQQUdFVkVDX1NJWkUpOworCQlpZiAobnJfcGFnZXMgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOworCQkJaW5kZXggPSBwYWdlLT5pbmRleDsKKwkJCWlmIChpbmRleCA+IGVuZCkKKwkJCQlicmVhazsKKwkJCWluZGV4Kys7CisKKwkJCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJCQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKKwkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBleHQ0X3ByaW50X2ZyZWVfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlRvdGFsIGZyZWUgYmxvY2tzIGNvdW50ICVsbGRcbiIsCisJCQlleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiKSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkZyZWUvRGlydHkgYmxvY2sgZGV0YWlsc1xuIik7CisJcHJpbnRrKEtFUk5fRU1FUkcgImZyZWVfYmxvY2tzPSVsbGRcbiIsCisJCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiZGlydHlfYmxvY2tzPSVsbGRcbiIsCisJCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkJsb2NrIHJlc2VydmF0aW9uIGRldGFpbHNcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSVsdVxuIiwKKwkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MpOworCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX21ldGFfYmxvY2tzPSVsdVxuIiwKKwkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOworCXJldHVybjsKK30KKwogLyoKICAqIG1wYWdlX2RhX21hcF9ibG9ja3MgLSBnbyB0aHJvdWdoIGdpdmVuIHNwYWNlCiAgKgpAQCAtMTc5MiwzMiArMTgzOSw2OSBAQAogICogVGhlIGZ1bmN0aW9uIHNraXBzIHNwYWNlIHdlIGtub3cgaXMgYWxyZWFkeSBtYXBwZWQgdG8gZGlzayBibG9ja3MuCiAgKgogICovCi1zdGF0aWMgdm9pZCBtcGFnZV9kYV9tYXBfYmxvY2tzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQpCitzdGF0aWMgaW50ICBtcGFnZV9kYV9tYXBfYmxvY2tzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQpCiB7CiAJaW50IGVyciA9IDA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpsYmggPSAmbXBkLT5sYmg7Ci0Jc2VjdG9yX3QgbmV4dCA9IGxiaC0+Yl9ibG9ja25yOwogCXN0cnVjdCBidWZmZXJfaGVhZCBuZXc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYmggPSAmbXBkLT5sYmg7CisJc2VjdG9yX3QgbmV4dDsKIAogCS8qCiAJICogV2UgY29uc2lkZXIgb25seSBub24tbWFwcGVkIGFuZCBub24tYWxsb2NhdGVkIGJsb2NrcwogCSAqLwogCWlmIChidWZmZXJfbWFwcGVkKGxiaCkgJiYgIWJ1ZmZlcl9kZWxheShsYmgpKQotCQlyZXR1cm47Ci0KKwkJcmV0dXJuIDA7CiAJbmV3LmJfc3RhdGUgPSBsYmgtPmJfc3RhdGU7CiAJbmV3LmJfYmxvY2tuciA9IDA7CiAJbmV3LmJfc2l6ZSA9IGxiaC0+Yl9zaXplOwotCisJbmV4dCA9IGxiaC0+Yl9ibG9ja25yOwogCS8qCiAJICogSWYgd2UgZGlkbid0IGFjY3VtdWxhdGUgYW55dGhpbmcKIAkgKiB0byB3cml0ZSBzaW1wbHkgcmV0dXJuCiAJICovCiAJaWYgKCFuZXcuYl9zaXplKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCWVyciA9IG1wZC0+Z2V0X2Jsb2NrKG1wZC0+aW5vZGUsIG5leHQsICZuZXcsIDEpOwotCWlmIChlcnIpCi0JCXJldHVybjsKKwlpZiAoZXJyKSB7CisKKwkJLyogSWYgZ2V0IGJsb2NrIHJldHVybnMgd2l0aCBlcnJvcgorCQkgKiB3ZSBzaW1wbHkgcmV0dXJuLiBMYXRlciB3cml0ZXBhZ2UKKwkJICogd2lsbCByZWRpcnR5IHRoZSBwYWdlIGFuZCB3cml0ZXBhZ2VzCisJCSAqIHdpbGwgZmluZCB0aGUgZGlydHkgcGFnZSBhZ2FpbgorCQkgKi8KKwkJaWYgKGVyciA9PSAtRUFHQUlOKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGVyciA9PSAtRU5PU1BDICYmCisJCQkJZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhtcGQtPmlub2RlLT5pX3NiKSkgeworCQkJbXBkLT5yZXR2YWwgPSBlcnI7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIGdldCBibG9jayBmYWlsdXJlIHdpbGwgY2F1c2UgdXMKKwkJICogdG8gbG9vcCBpbiB3cml0ZXBhZ2VzLiBCZWNhdXNlCisJCSAqIGFfb3BzLT53cml0ZXBhZ2Ugd29uJ3QgYmUgYWJsZSB0bworCQkgKiBtYWtlIHByb2dyZXNzLiBUaGUgcGFnZSB3aWxsIGJlIHJlZGlydGllZAorCQkgKiBieSB3cml0ZXBhZ2UgYW5kIHdyaXRlcGFnZXMgd2lsbCBhZ2FpbgorCQkgKiB0cnkgdG8gd3JpdGUgdGhlIHNhbWUuCisJCSAqLworCQlwcmludGsoS0VSTl9FTUVSRyAiJXMgYmxvY2sgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGlub2RlICVsdSAiCisJCQkJICAiYXQgbG9naWNhbCBvZmZzZXQgJWxsdSB3aXRoIG1heCBibG9ja3MgIgorCQkJCSAgIiV6ZCB3aXRoIGVycm9yICVkXG4iLAorCQkJCSAgX19mdW5jX18sIG1wZC0+aW5vZGUtPmlfaW5vLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXh0LAorCQkJCSAgbGJoLT5iX3NpemUgPj4gbXBkLT5pbm9kZS0+aV9ibGtiaXRzLCBlcnIpOworCQlwcmludGsoS0VSTl9FTUVSRyAiVGhpcyBzaG91bGQgbm90IGhhcHBlbi4hISAiCisJCQkJCSJEYXRhIHdpbGwgYmUgbG9zdFxuIik7CisJCWlmIChlcnIgPT0gLUVOT1NQQykgeworCQkJZXh0NF9wcmludF9mcmVlX2Jsb2NrcyhtcGQtPmlub2RlKTsKKwkJfQorCQkvKiBpbnZsYWlkYXRlIGFsbCB0aGUgcGFnZXMgKi8KKwkJZXh0NF9kYV9ibG9ja19pbnZhbGlkYXRlcGFnZXMobXBkLCBuZXh0LAorCQkJCWxiaC0+Yl9zaXplID4+IG1wZC0+aW5vZGUtPmlfYmxrYml0cyk7CisJCXJldHVybiBlcnI7CisJfQogCUJVR19PTihuZXcuYl9zaXplID09IDApOwogCiAJaWYgKGJ1ZmZlcl9uZXcoJm5ldykpCkBAIC0xODMwLDcgKzE5MTQsNyBAQAogCWlmIChidWZmZXJfZGVsYXkobGJoKSB8fCBidWZmZXJfdW53cml0dGVuKGxiaCkpCiAJCW1wYWdlX3B1dF9ibnJfdG9fYmhzKG1wZCwgbmV4dCwgJm5ldyk7CiAKLQlyZXR1cm47CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgQkhfRkxBR1MgKCgxIDw8IEJIX1VwdG9kYXRlKSB8ICgxIDw8IEJIX01hcHBlZCkgfCBcCkBAIC0xODk5LDggKzE5ODMsOCBAQAogCSAqIFdlIGNvdWxkbid0IG1lcmdlIHRoZSBibG9jayB0byBvdXIgZXh0ZW50LCBzbyB3ZQogCSAqIG5lZWQgdG8gZmx1c2ggY3VycmVudCAgZXh0ZW50IGFuZCBzdGFydCBuZXcgb25lCiAJICovCi0JbXBhZ2VfZGFfbWFwX2Jsb2NrcyhtcGQpOwotCW1wYWdlX2RhX3N1Ym1pdF9pbyhtcGQpOworCWlmIChtcGFnZV9kYV9tYXBfYmxvY2tzKG1wZCkgPT0gMCkKKwkJbXBhZ2VfZGFfc3VibWl0X2lvKG1wZCk7CiAJbXBkLT5pb19kb25lID0gMTsKIAlyZXR1cm47CiB9CkBAIC0xOTQyLDggKzIwMjYsOCBAQAogCQkgKiBhbmQgc3RhcnQgSU8gb24gdGhlbSB1c2luZyB3cml0ZXBhZ2UoKQogCQkgKi8KIAkJaWYgKG1wZC0+bmV4dF9wYWdlICE9IG1wZC0+Zmlyc3RfcGFnZSkgewotCQkJbXBhZ2VfZGFfbWFwX2Jsb2NrcyhtcGQpOwotCQkJbXBhZ2VfZGFfc3VibWl0X2lvKG1wZCk7CisJCQlpZiAobXBhZ2VfZGFfbWFwX2Jsb2NrcyhtcGQpID09IDApCisJCQkJbXBhZ2VfZGFfc3VibWl0X2lvKG1wZCk7CiAJCQkvKgogCQkJICogc2tpcCByZXN0IG9mIHRoZSBwYWdlIGluIHRoZSBwYWdlX3ZlYwogCQkJICovCkBAIC0yMDE4LDM5ICsyMTAyLDM2IEBACiAgKi8KIHN0YXRpYyBpbnQgbXBhZ2VfZGFfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCSAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQkJCSAgICAgICBnZXRfYmxvY2tfdCBnZXRfYmxvY2spCisJCQkgICAgICAgc3RydWN0IG1wYWdlX2RhX2RhdGEgKm1wZCkKIHsKLQlzdHJ1Y3QgbXBhZ2VfZGFfZGF0YSBtcGQ7CiAJbG9uZyB0b193cml0ZTsKIAlpbnQgcmV0OwogCi0JaWYgKCFnZXRfYmxvY2spCisJaWYgKCFtcGQtPmdldF9ibG9jaykKIAkJcmV0dXJuIGdlbmVyaWNfd3JpdGVwYWdlcyhtYXBwaW5nLCB3YmMpOwogCi0JbXBkLndiYyA9IHdiYzsKLQltcGQuaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCW1wZC5sYmguYl9zaXplID0gMDsKLQltcGQubGJoLmJfc3RhdGUgPSAwOwotCW1wZC5sYmguYl9ibG9ja25yID0gMDsKLQltcGQuZmlyc3RfcGFnZSA9IDA7Ci0JbXBkLm5leHRfcGFnZSA9IDA7Ci0JbXBkLmdldF9ibG9jayA9IGdldF9ibG9jazsKLQltcGQuaW9fZG9uZSA9IDA7Ci0JbXBkLnBhZ2VzX3dyaXR0ZW4gPSAwOworCW1wZC0+bGJoLmJfc2l6ZSA9IDA7CisJbXBkLT5sYmguYl9zdGF0ZSA9IDA7CisJbXBkLT5sYmguYl9ibG9ja25yID0gMDsKKwltcGQtPmZpcnN0X3BhZ2UgPSAwOworCW1wZC0+bmV4dF9wYWdlID0gMDsKKwltcGQtPmlvX2RvbmUgPSAwOworCW1wZC0+cGFnZXNfd3JpdHRlbiA9IDA7CisJbXBkLT5yZXR2YWwgPSAwOwogCiAJdG9fd3JpdGUgPSB3YmMtPm5yX3RvX3dyaXRlOwogCi0JcmV0ID0gd3JpdGVfY2FjaGVfcGFnZXMobWFwcGluZywgd2JjLCBfX21wYWdlX2RhX3dyaXRlcGFnZSwgJm1wZCk7CisJcmV0ID0gd3JpdGVfY2FjaGVfcGFnZXMobWFwcGluZywgd2JjLCBfX21wYWdlX2RhX3dyaXRlcGFnZSwgbXBkKTsKIAogCS8qCiAJICogSGFuZGxlIGxhc3QgZXh0ZW50IG9mIHBhZ2VzCiAJICovCi0JaWYgKCFtcGQuaW9fZG9uZSAmJiBtcGQubmV4dF9wYWdlICE9IG1wZC5maXJzdF9wYWdlKSB7Ci0JCW1wYWdlX2RhX21hcF9ibG9ja3MoJm1wZCk7Ci0JCW1wYWdlX2RhX3N1Ym1pdF9pbygmbXBkKTsKKwlpZiAoIW1wZC0+aW9fZG9uZSAmJiBtcGQtPm5leHRfcGFnZSAhPSBtcGQtPmZpcnN0X3BhZ2UpIHsKKwkJaWYgKG1wYWdlX2RhX21hcF9ibG9ja3MobXBkKSA9PSAwKQorCQkJbXBhZ2VfZGFfc3VibWl0X2lvKG1wZCk7CiAJfQogCi0Jd2JjLT5ucl90b193cml0ZSA9IHRvX3dyaXRlIC0gbXBkLnBhZ2VzX3dyaXR0ZW47CisJd2JjLT5ucl90b193cml0ZSA9IHRvX3dyaXRlIC0gbXBkLT5wYWdlc193cml0dGVuOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxMDMsMTggKzIxODQsMjQgQEAKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwotCWlmICghaGFuZGxlKSB7Ci0JCXJldCA9IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgbWF4X2Jsb2NrcywKLQkJCQkgICBiaF9yZXN1bHQsIDAsIDAsIDApOwotCQlCVUdfT04oIXJldCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBtYXhfYmxvY2tzLAotCQkJCSAgIGJoX3Jlc3VsdCwgY3JlYXRlLCAwLCBFWFQ0X0RFTEFMTE9DX1JTVkVEKTsKLQl9Ci0KKwlCVUdfT04oIWhhbmRsZSk7CisJcmV0ID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBtYXhfYmxvY2tzLAorCQkJYmhfcmVzdWx0LCBjcmVhdGUsIDAsIEVYVDRfREVMQUxMT0NfUlNWRUQpOwogCWlmIChyZXQgPiAwKSB7CisKIAkJYmhfcmVzdWx0LT5iX3NpemUgPSAocmV0IDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogCisJCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJaW50IHJldHZhbDsKKwkJCXJldHZhbCA9IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworCQkJaWYgKHJldHZhbCkKKwkJCQkvKgorCQkJCSAqIEZhaWxlZCB0byBhZGQgaW5vZGUgZm9yIG9yZGVyZWQKKwkJCQkgKiBtb2RlLiBEb24ndCB1cGRhdGUgZmlsZSBzaXplCisJCQkJICovCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCiAJCS8qCiAJCSAqIFVwZGF0ZSBvbi1kaXNrIHNpemUgYWxvbmcgd2l0aCBibG9jayBhbGxvY2F0aW9uCiAJCSAqIHdlIGRvbid0IHVzZSAnZXh0ZW5kX2Rpc2tzaXplJyBhcyBzaXplIG1heSBjaGFuZ2UKQEAgLTIxMjQsMTggKzIyMTEsOSBAQAogCQlpZiAoZGlza3NpemUgPiBpX3NpemVfcmVhZChpbm9kZSkpCiAJCQlkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJaWYgKGRpc2tzaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgewotCQkJLyoKLQkJCSAqIFhYWDogcmVwbGFjZSB3aXRoIHNwaW5sb2NrIGlmIHNlZW4gY29udGVuZGVkIC1ienp6Ci0JCQkgKi8KLQkJCWRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwotCQkJaWYgKGRpc2tzaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkKLQkJCQlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gZGlza3NpemU7Ci0JCQl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7Ci0KLQkJCWlmIChFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID09IGRpc2tzaXplKSB7Ci0JCQkJcmV0ID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9CisJCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBkaXNrc2l6ZSk7CisJCQlyZXQgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJCXJldCA9IDA7CiAJfQpAQCAtMjI4NCw2ICsyMzYyLDcgQEAKIHsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlsb2ZmX3QgcmFuZ2Vfc3RhcnQgPSAwOworCXN0cnVjdCBtcGFnZV9kYV9kYXRhIG1wZDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgbmVlZGVkX2Jsb2NrcywgcmV0ID0gMCwgbnJfdG9fd3JpdGVidW1wID0gMDsKIAlsb25nIHRvX3dyaXRlLCBwYWdlc19za2lwcGVkID0gMDsKQEAgLTIzMTcsNiArMjM5Niw5IEBACiAJcmFuZ2Vfc3RhcnQgPSAgd2JjLT5yYW5nZV9zdGFydDsKIAlwYWdlc19za2lwcGVkID0gd2JjLT5wYWdlc19za2lwcGVkOwogCisJbXBkLndiYyA9IHdiYzsKKwltcGQuaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCiByZXN0YXJ0X2xvb3A6CiAJdG9fd3JpdGUgPSB3YmMtPm5yX3RvX3dyaXRlOwogCXdoaWxlICghcmV0ICYmIHRvX3dyaXRlID4gMCkgewpAQCAtMjM0MCwyMyArMjQyMiwxNyBAQAogCQkJZHVtcF9zdGFjaygpOwogCQkJZ290byBvdXRfd3JpdGVwYWdlczsKIAkJfQotCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKLQkJCS8qCi0JCQkgKiBXaXRoIG9yZGVyZWQgbW9kZSB3ZSBuZWVkIHRvIGFkZAotCQkJICogdGhlIGlub2RlIHRvIHRoZSBqb3VybmFsIGhhbmRsCi0JCQkgKiB3aGVuIHdlIGRvIGJsb2NrIGFsbG9jYXRpb24uCi0JCQkgKi8KLQkJCXJldCA9IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOwotCQkJaWYgKHJldCkgewotCQkJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCQkJZ290byBvdXRfd3JpdGVwYWdlczsKLQkJCX0KLQkJfQotCiAJCXRvX3dyaXRlIC09IHdiYy0+bnJfdG9fd3JpdGU7Ci0JCXJldCA9IG1wYWdlX2RhX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLAotCQkJCQkgIGV4dDRfZGFfZ2V0X2Jsb2NrX3dyaXRlKTsKKworCQltcGQuZ2V0X2Jsb2NrID0gZXh0NF9kYV9nZXRfYmxvY2tfd3JpdGU7CisJCXJldCA9IG1wYWdlX2RhX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCAmbXBkKTsKKwogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCisJCWlmIChtcGQucmV0dmFsID09IC1FTk9TUEMpCisJCQlqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChzYmktPnNfam91cm5hbCk7CisKKwkJLyogcmVzZXQgdGhlIHJldHJ5IGNvdW50ICovCiAJCWlmIChyZXQgPT0gTVBBR0VfREFfRVhURU5UX1RBSUwpIHsKIAkJCS8qCiAJCQkgKiBnb3Qgb25lIGV4dGVudCBub3cgdHJ5IHdpdGgKQEAgLTIzOTEsNiArMjQ2NywzMyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgRkFMTF9CQUNLX1RPX05PTkRFTEFMTE9DIDEKK3N0YXRpYyBpbnQgZXh0NF9ub25kYV9zd2l0Y2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzNjQgZnJlZV9ibG9ja3MsIGRpcnR5X2Jsb2NrczsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKworCS8qCisJICogc3dpdGNoIHRvIG5vbiBkZWxhbGxvYyBtb2RlIGlmIHdlIGFyZSBydW5uaW5nIGxvdworCSAqIG9uIGZyZWUgYmxvY2suIFRoZSBmcmVlIGJsb2NrIGFjY291bnRpbmcgdmlhIHBlcmNwdQorCSAqIGNvdW50ZXJzIGNhbiBnZXQgc2xpZ2h0bHkgd3Jvbmcgd2l0aCBGQkNfQkFUQ0ggZ2V0dGluZworCSAqIGFjY3VtdWxhdGVkIG9uIGVhY2ggQ1BVIHdpdGhvdXQgdXBkYXRpbmcgZ2xvYmFsIGNvdW50ZXJzCisJICogRGVsYWxsb2MgbmVlZCBhbiBhY2N1cmF0ZSBmcmVlIGJsb2NrIGFjY291bnRpbmcuIFNvIHN3aXRjaAorCSAqIHRvIG5vbiBkZWxhbGxvYyB3aGVuIHdlIGFyZSBuZWFyIHRvIGVycm9yIHJhbmdlLgorCSAqLworCWZyZWVfYmxvY2tzICA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWRpcnR5X2Jsb2NrcyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKTsKKwlpZiAoMiAqIGZyZWVfYmxvY2tzIDwgMyAqIGRpcnR5X2Jsb2NrcyB8fAorCQlmcmVlX2Jsb2NrcyA8IChkaXJ0eV9ibG9ja3MgKyBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLKSkgeworCQkvKgorCQkgKiBmcmVlIGJsb2NrIGNvdW50IGlzIGxlc3MgdGhhdCAxNTAlIG9mIGRpcnR5IGJsb2NrcworCQkgKiBvciBmcmVlIGJsb2NrcyBpcyBsZXNzIHRoYXQgd2F0ZXJtYXJrCisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZXh0NF9kYV93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKIAkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQpAQCAtMjQwNiw2ICsyNTA5LDEyIEBACiAJZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAl0byA9IGZyb20gKyBsZW47CiAKKwlpZiAoZXh0NF9ub25kYV9zd2l0Y2goaW5vZGUtPmlfc2IpKSB7CisJCSpmc2RhdGEgPSAodm9pZCAqKUZBTExfQkFDS19UT19OT05ERUxBTExPQzsKKwkJcmV0dXJuIGV4dDRfd3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgcG9zLAorCQkJCQlsZW4sIGZsYWdzLCBwYWdlcCwgZnNkYXRhKTsKKwl9CisJKmZzZGF0YSA9ICh2b2lkICopMDsKIHJldHJ5OgogCS8qCiAJICogV2l0aCBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IGxvZyB0aGUgaV9kaXNrc2l6ZSB1cGRhdGUKQEAgLTI0MzMsNiArMjU0MiwxMyBAQAogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkvKgorCQkgKiBibG9ja193cml0ZV9iZWdpbiBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcgYmxvY2tzCisJCSAqIG91dHNpZGUgaV9zaXplLiAgVHJpbSB0aGVzZSBvZmYgYWdhaW4uIERvbid0IG5lZWQKKwkJICogaV9zaXplX3JlYWQgYmVjYXVzZSB3ZSBob2xkIGlfbXV0ZXguCisJCSAqLworCQlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKKwkJCXZtdHJ1bmNhdGUoaW5vZGUsIGlub2RlLT5pX3NpemUpOwogCX0KIAogCWlmIChyZXQgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQpAQCAtMjQ1Niw3ICsyNTcyLDcgQEAKIAliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAlpZHggPSBvZmZzZXQgPj4gaW5vZGUtPmlfYmxrYml0czsKIAotCWZvciAoaT0wOyBpIDwgaWR4OyBpKyspCisJZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKQogCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKIAogCWlmICghYnVmZmVyX21hcHBlZChiaCkgfHwgKGJ1ZmZlcl9kZWxheShiaCkpKQpAQCAtMjQ3NCw5ICsyNTkwLDIyIEBACiAJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCWxvZmZfdCBuZXdfaV9zaXplOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwlpbnQgd3JpdGVfbW9kZSA9IChpbnQpKHVuc2lnbmVkIGxvbmcpZnNkYXRhOworCisJaWYgKHdyaXRlX21vZGUgPT0gRkFMTF9CQUNLX1RPX05PTkRFTEFMTE9DKSB7CisJCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJcmV0dXJuIGV4dDRfb3JkZXJlZF93cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLAorCQkJCQlsZW4sIGNvcGllZCwgcGFnZSwgZnNkYXRhKTsKKwkJfSBlbHNlIGlmIChleHQ0X3Nob3VsZF93cml0ZWJhY2tfZGF0YShpbm9kZSkpIHsKKwkJCXJldHVybiBleHQ0X3dyaXRlYmFja193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLAorCQkJCQlsZW4sIGNvcGllZCwgcGFnZSwgZnNkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCUJVRygpOworCQl9CisJfQogCiAJc3RhcnQgPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JZW5kID0gc3RhcnQgKyBjb3BpZWQgLTE7CisJZW5kID0gc3RhcnQgKyBjb3BpZWQgLSAxOwogCiAJLyoKIAkgKiBnZW5lcmljX3dyaXRlX2VuZCgpIHdpbGwgcnVuIG1hcmtfaW5vZGVfZGlydHkoKSBpZiBpX3NpemUKQEAgLTI1MDAsNiArMjYyOSwxMSBAQAogCQkJCUVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfaV9zaXplOwogCQkJfQogCQkJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOworCQkJLyogV2UgbmVlZCB0byBtYXJrIGlub2RlIGRpcnR5IGV2ZW4gaWYKKwkJCSAqIG5ld19pX3NpemUgaXMgbGVzcyB0aGF0IGlub2RlLT5pX3NpemUKKwkJCSAqIGJ1IGdyZWF0ZXIgdGhhbiBpX2Rpc2tzaXplLihoaW50IGRlbGFsbG9jKQorCQkJICovCisJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJCX0KIAl9CiAJcmV0MiA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsCkBAIC0yNTkxLDcgKzI3MjUsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGV4dDRfZ2V0X2Jsb2NrKTsKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBleHQ0X2dldF9ibG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgYmdldF9vbmUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKQEAgLTMxOTcsNyArMzMzMSw3IEBACiAJaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApCiAJCS8qIFdyaXRlcjogZW5kICovCiAJCWdvdG8gbm9fdG9wOwotCWZvciAocD1wYXJ0aWFsOyBwPmNoYWluICYmIGFsbF96ZXJvZXMoKF9fbGUzMiopcC0+YmgtPmJfZGF0YSxwLT5wKTsgcC0tKQorCWZvciAocCA9IHBhcnRpYWw7IChwID4gY2hhaW4pICYmIGFsbF96ZXJvZXMoKF9fbGUzMiAqKSBwLT5iaC0+Yl9kYXRhLCBwLT5wKTsgcC0tKQogCQk7CiAJLyoKIAkgKiBPSywgd2UndmUgZm91bmQgdGhlIGxhc3QgYmxvY2sgdGhhdCBtdXN0IHN1cnZpdmUuIFRoZSByZXN0IG9mIG91cgpAQCAtMzIxNiw3ICszMzUwLDcgQEAKIAl9CiAJLyogV3JpdGVyOiBlbmQgKi8KIAotCXdoaWxlKHBhcnRpYWwgPiBwKSB7CisJd2hpbGUgKHBhcnRpYWwgPiBwKSB7CiAJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CiAJCXBhcnRpYWwtLTsKIAl9CkBAIC0zNDA4LDkgKzM1NDIsOSBAQAogCQkJLyogVGhpcyB6YXBzIHRoZSBlbnRpcmUgYmxvY2suICBCb3R0b20gdXAuICovCiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJmcmVlIGNoaWxkIGJyYW5jaGVzIik7CiAJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEsCi0JCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKLQkJCQkJICAgZGVwdGgpOworCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEsCisJCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSArIGFkZHJfcGVyX2Jsb2NrLAorCQkJCQlkZXB0aCk7CiAKIAkJCS8qCiAJCQkgKiBXZSd2ZSBwcm9iYWJseSBqb3VybmFsbGVkIHRoZSBpbmRpcmVjdCBibG9jayBzZXZlcmFsCkBAIC0zNTc4LDcgKzM3MTIsNyBAQAogCSAqLwogCWRvd25fd3JpdGUoJmVpLT5pX2RhdGFfc2VtKTsKIAotCWV4dDRfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKIAogCS8qCiAJICogVGhlIG9ycGhhbiBsaXN0IGVudHJ5IHdpbGwgbm93IHByb3RlY3QgdXMgZnJvbSBhbnkgY3Jhc2ggd2hpY2gKQEAgLTM2NzMsNDEgKzM4MDcsNiBAQAogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9nZXRfaW5vZGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJdW5zaWduZWQgbG9uZyBpbm8sIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpCi17Ci0JZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCWV4dDRfZnNibGtfdCBibG9jazsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7Ci0KLQlpZiAoIWV4dDRfdmFsaWRfaW51bShzYiwgaW5vKSkgewotCQkvKgotCQkgKiBUaGlzIGVycm9yIGlzIGFscmVhZHkgY2hlY2tlZCBmb3IgaW4gbmFtZWkuYyB1bmxlc3Mgd2UgYXJlCi0JCSAqIGxvb2tpbmcgYXQgYW4gTkZTIGZpbGVoYW5kbGUsIGluIHdoaWNoIGNhc2Ugbm8gZXJyb3IKLQkJICogcmVwb3J0IGlzIG5lZWRlZAotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwotCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGJsb2NrX2dyb3VwLCBOVUxMKTsKLQlpZiAoIWdkcCkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIEZpZ3VyZSBvdXQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGJsb2NrIGdyb3VwIGlub2RlIHRhYmxlCi0JICovCi0Jb2Zmc2V0ID0gKChpbm8gLSAxKSAlIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpICoKLQkJRVhUNF9JTk9ERV9TSVpFKHNiKTsKLQlibG9jayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCkgKwotCQkob2Zmc2V0ID4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKSk7Ci0KLQlpbG9jLT5ibG9ja19ncm91cCA9IGJsb2NrX2dyb3VwOwotCWlsb2MtPm9mZnNldCA9IG9mZnNldCAmIChFWFQ0X0JMT0NLX1NJWkUoc2IpIC0gMSk7Ci0JcmV0dXJuIGJsb2NrOwotfQotCiAvKgogICogZXh0NF9nZXRfaW5vZGVfbG9jIHJldHVybnMgd2l0aCBhbiBleHRyYSByZWZjb3VudCBhZ2FpbnN0IHRoZSBpbm9kZSdzCiAgKiB1bmRlcmx5aW5nIGJ1ZmZlcl9oZWFkIG9uIHN1Y2Nlc3MuIElmICdpbl9tZW0nIGlzIHRydWUsIHdlIGhhdmUgYWxsCkBAIC0zNzE3LDE5ICszODE2LDM1IEBACiBzdGF0aWMgaW50IF9fZXh0NF9nZXRfaW5vZGVfbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGV4dDRfaWxvYyAqaWxvYywgaW50IGluX21lbSkKIHsKLQlleHQ0X2ZzYmxrX3QgYmxvY2s7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjCSpnZHA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gaW5vZGUtPmlfc2I7CisJZXh0NF9mc2Jsa190CQlibG9jazsKKwlpbnQJCQlpbm9kZXNfcGVyX2Jsb2NrLCBpbm9kZV9vZmZzZXQ7CiAKLQlibG9jayA9IGV4dDRfZ2V0X2lub2RlX2Jsb2NrKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sIGlsb2MpOwotCWlmICghYmxvY2spCisJaWxvYy0+YmggPSAwOworCWlmICghZXh0NF92YWxpZF9pbnVtKHNiLCBpbm9kZS0+aV9pbm8pKQogCQlyZXR1cm4gLUVJTzsKIAotCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWxvYy0+YmxvY2tfZ3JvdXAgPSAoaW5vZGUtPmlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGlsb2MtPmJsb2NrX2dyb3VwLCBOVUxMKTsKKwlpZiAoIWdkcCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGJsb2NrIGdyb3VwIGlub2RlIHRhYmxlCisJICovCisJaW5vZGVzX3Blcl9ibG9jayA9IChFWFQ0X0JMT0NLX1NJWkUoc2IpIC8gRVhUNF9JTk9ERV9TSVpFKHNiKSk7CisJaW5vZGVfb2Zmc2V0ID0gKChpbm9kZS0+aV9pbm8gLSAxKSAlCisJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKKwlibG9jayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCkgKyAoaW5vZGVfb2Zmc2V0IC8gaW5vZGVzX3Blcl9ibG9jayk7CisJaWxvYy0+b2Zmc2V0ID0gKGlub2RlX29mZnNldCAlIGlub2Rlc19wZXJfYmxvY2spICogRVhUNF9JTk9ERV9TSVpFKHNiKTsKKworCWJoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CiAJaWYgKCFiaCkgewotCQlleHQ0X2Vycm9yIChpbm9kZS0+aV9zYiwgImV4dDRfZ2V0X2lub2RlX2xvYyIsCi0JCQkJInVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIC0gIgotCQkJCSJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAotCQkJCSBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJZXh0NF9lcnJvcihzYiwgImV4dDRfZ2V0X2lub2RlX2xvYyIsICJ1bmFibGUgdG8gcmVhZCAiCisJCQkgICAiaW5vZGUgYmxvY2sgLSBpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJICAgaW5vZGUtPmlfaW5vLCBibG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKQEAgLTM3NTcsMjggKzM4NzIsMTIgQEAKIAkJICovCiAJCWlmIChpbl9tZW0pIHsKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoOwotCQkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKLQkJCWludCBpbm9kZXNfcGVyX2J1ZmZlcjsKLQkJCWludCBpbm9kZV9vZmZzZXQsIGk7Ci0JCQlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7Ci0JCQlpbnQgc3RhcnQ7CisJCQlpbnQgaSwgc3RhcnQ7CiAKLQkJCWJsb2NrX2dyb3VwID0gKGlub2RlLT5pX2lubyAtIDEpIC8KLQkJCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKLQkJCWlub2Rlc19wZXJfYnVmZmVyID0gYmgtPmJfc2l6ZSAvCi0JCQkJRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKLQkJCWlub2RlX29mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJQotCQkJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKTsKLQkJCXN0YXJ0ID0gaW5vZGVfb2Zmc2V0ICYgfihpbm9kZXNfcGVyX2J1ZmZlciAtIDEpOworCQkJc3RhcnQgPSBpbm9kZV9vZmZzZXQgJiB+KGlub2Rlc19wZXJfYmxvY2sgLSAxKTsKIAogCQkJLyogSXMgdGhlIGlub2RlIGJpdG1hcCBpbiBjYWNoZT8gKi8KLQkJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKGlub2RlLT5pX3NiLAotCQkJCQkJYmxvY2tfZ3JvdXAsIE5VTEwpOwotCQkJaWYgKCFkZXNjKQotCQkJCWdvdG8gbWFrZV9pbzsKLQotCQkJYml0bWFwX2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLAotCQkJCWV4dDRfaW5vZGVfYml0bWFwKGlub2RlLT5pX3NiLCBkZXNjKSk7CisJCQliaXRtYXBfYmggPSBzYl9nZXRibGsoc2IsIGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApKTsKIAkJCWlmICghYml0bWFwX2JoKQogCQkJCWdvdG8gbWFrZV9pbzsKIApAQCAtMzc5MSwxNCArMzg5MCwxNCBAQAogCQkJCWJyZWxzZShiaXRtYXBfYmgpOwogCQkJCWdvdG8gbWFrZV9pbzsKIAkJCX0KLQkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBpbm9kZXNfcGVyX2J1ZmZlcjsgaSsrKSB7CisJCQlmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgaW5vZGVzX3Blcl9ibG9jazsgaSsrKSB7CiAJCQkJaWYgKGkgPT0gaW5vZGVfb2Zmc2V0KQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoZXh0NF90ZXN0X2JpdChpLCBiaXRtYXBfYmgtPmJfZGF0YSkpCiAJCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlbHNlKGJpdG1hcF9iaCk7Ci0JCQlpZiAoaSA9PSBzdGFydCArIGlub2Rlc19wZXJfYnVmZmVyKSB7CisJCQlpZiAoaSA9PSBzdGFydCArIGlub2Rlc19wZXJfYmxvY2spIHsKIAkJCQkvKiBhbGwgb3RoZXIgaW5vZGVzIGFyZSBmcmVlLCBzbyBza2lwIEkvTyAqLwogCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBiaC0+Yl9zaXplKTsKIAkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKQEAgLTM4MDksNiArMzkwOCwzNiBAQAogCiBtYWtlX2lvOgogCQkvKgorCQkgKiBJZiB3ZSBuZWVkIHRvIGRvIGFueSBJL08sIHRyeSB0byBwcmUtcmVhZGFoZWFkIGV4dHJhCisJCSAqIGJsb2NrcyBmcm9tIHRoZSBpbm9kZSB0YWJsZS4KKwkJICovCisJCWlmIChFWFQ0X1NCKHNiKS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcykgeworCQkJZXh0NF9mc2Jsa190IGIsIGVuZCwgdGFibGU7CisJCQl1bnNpZ25lZCBudW07CisKKwkJCXRhYmxlID0gZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKTsKKwkJCS8qIE1ha2Ugc3VyZSBzX2lub2RlX3JlYWRhaGVhZF9ibGtzIGlzIGEgcG93ZXIgb2YgMiAqLworCQkJd2hpbGUgKEVYVDRfU0Ioc2IpLT5zX2lub2RlX3JlYWRhaGVhZF9ibGtzICYKKwkJCSAgICAgICAoRVhUNF9TQihzYiktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MtMSkpCisJCQkJRVhUNF9TQihzYiktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgPSAKKwkJCQkgICAoRVhUNF9TQihzYiktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgJgorCQkJCSAgICAoRVhUNF9TQihzYiktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MtMSkpOworCQkJYiA9IGJsb2NrICYgfihFWFQ0X1NCKHNiKS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcy0xKTsKKwkJCWlmICh0YWJsZSA+IGIpCisJCQkJYiA9IHRhYmxlOworCQkJZW5kID0gYiArIEVYVDRfU0Ioc2IpLT5zX2lub2RlX3JlYWRhaGVhZF9ibGtzOworCQkJbnVtID0gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwkJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkgICAgICAgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9HRFRfQ1NVTSkpCisJCQkJbnVtIC09IGxlMTZfdG9fY3B1KGdkcC0+YmdfaXRhYmxlX3VudXNlZCk7CisJCQl0YWJsZSArPSBudW0gLyBpbm9kZXNfcGVyX2Jsb2NrOworCQkJaWYgKGVuZCA+IHRhYmxlKQorCQkJCWVuZCA9IHRhYmxlOworCQkJd2hpbGUgKGIgPD0gZW5kKQorCQkJCXNiX2JyZWFkYWhlYWQoc2IsIGIrKyk7CisJCX0KKworCQkvKgogCQkgKiBUaGVyZSBhcmUgb3RoZXIgdmFsaWQgaW5vZGVzIGluIHRoZSBidWZmZXIsIHRoaXMgaW5vZGUKIAkJICogaGFzIGluLWlub2RlIHhhdHRycywgb3Igd2UgZG9uJ3QgaGF2ZSB0aGlzIGlub2RlIGluIG1lbW9yeS4KIAkJICogUmVhZCB0aGUgYmxvY2sgZnJvbSBkaXNrLgpAQCAtMzgxOCwxMCArMzk0Nyw5IEBACiAJCXN1Ym1pdF9iaChSRUFEX01FVEEsIGJoKTsKIAkJd2FpdF9vbl9idWZmZXIoYmgpOwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQ0X2dldF9pbm9kZV9sb2MiLAotCQkJCQkidW5hYmxlIHRvIHJlYWQgaW5vZGUgYmxvY2sgLSAiCi0JCQkJCSJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAotCQkJCQlpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAorCQkJCSAgICJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtIGlub2RlPSVsdSwgIgorCQkJCSAgICJibG9jaz0lbGx1IiwgaW5vZGUtPmlfaW5vLCBibG9jayk7CiAJCQlicmVsc2UoYmgpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTM5MTMsMTEgKzQwNDEsMTAgQEAKIAkJcmV0dXJuIGlub2RlOwogCiAJZWkgPSBFWFQ0X0koaW5vZGUpOwotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCWVpLT5pX2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CiAJZWktPmlfZGVmYXVsdF9hY2wgPSBFWFQ0X0FDTF9OT1RfQ0FDSEVEOwogI2VuZGlmCi0JZWktPmlfYmxvY2tfYWxsb2NfaW5mbyA9IE5VTEw7CiAKIAlyZXQgPSBfX2V4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MsIDApOwogCWlmIChyZXQgPCAwKQpAQCAtMzkyNyw3ICs0MDU0LDcgQEAKIAlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CiAJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9naWRfbG93KTsKLQlpZighKHRlc3Rfb3B0IChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCWlmICghKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT19VSUQzMikpKSB7CiAJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OwogCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKIAl9CkBAIC0zOTQ1LDcgKzQwNzIsNyBAQAogCQlpZiAoaW5vZGUtPmlfbW9kZSA9PSAwIHx8CiAJCSAgICAhKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX21vdW50X3N0YXRlICYgRVhUNF9PUlBIQU5fRlMpKSB7CiAJCQkvKiB0aGlzIGlub2RlIGlzIGRlbGV0ZWQgKi8KLQkJCWJyZWxzZSAoYmgpOworCQkJYnJlbHNlKGJoKTsKIAkJCXJldCA9IC1FU1RBTEU7CiAJCQlnb3RvIGJhZF9pbm9kZTsKIAkJfQpAQCAtMzk3OCw3ICs0MTA1LDcgQEAKIAkJZWktPmlfZXh0cmFfaXNpemUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUpOwogCQlpZiAoRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgogCQkgICAgRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkgewotCQkJYnJlbHNlIChiaCk7CisJCQlicmVsc2UoYmgpOwogCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gYmFkX2lub2RlOwogCQl9CkBAIC00MDMxLDcgKzQxNTgsNyBAQAogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAogCQkJICAgbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2NrWzFdKSkpOwogCX0KLQlicmVsc2UgKGlsb2MuYmgpOworCWJyZWxzZShpbG9jLmJoKTsKIAlleHQ0X3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJcmV0dXJuIGlub2RlOwpAQCAtNDExMywxNCArNDI0MCwxNCBAQAogCiAJZXh0NF9nZXRfaW5vZGVfZmxhZ3MoZWkpOwogCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7Ci0JaWYoISh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCWlmICghKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT19VSUQzMikpKSB7CiAJCXJhd19pbm9kZS0+aV91aWRfbG93ID0gY3B1X3RvX2xlMTYobG93XzE2X2JpdHMoaW5vZGUtPmlfdWlkKSk7CiAJCXJhd19pbm9kZS0+aV9naWRfbG93ID0gY3B1X3RvX2xlMTYobG93XzE2X2JpdHMoaW5vZGUtPmlfZ2lkKSk7CiAvKgogICogRml4IHVwIGludGVyb3BlcmFiaWxpdHkgd2l0aCBvbGQga2VybmVscy4gT3RoZXJ3aXNlLCBvbGQgaW5vZGVzIGdldAogICogcmUtdXNlZCB3aXRoIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSB1aWQvZ2lkIGludGFjdAogICovCi0JCWlmKCFlaS0+aV9kdGltZSkgeworCQlpZiAoIWVpLT5pX2R0aW1lKSB7CiAJCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPQogCQkJCWNwdV90b19sZTE2KGhpZ2hfMTZfYml0cyhpbm9kZS0+aV91aWQpKTsKIAkJCXJhd19pbm9kZS0+aV9naWRfaGlnaCA9CkBAIC00MjA4LDcgKzQzMzUsNyBAQAogCWVpLT5pX3N0YXRlICY9IH5FWFQ0X1NUQVRFX05FVzsKIAogb3V0X2JyZWxzZToKLQlicmVsc2UgKGJoKTsKKwlicmVsc2UoYmgpOwogCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC00ODExLDYgKzQ5MzgsNyBAQAogCWxvZmZfdCBzaXplOwogCXVuc2lnbmVkIGxvbmcgbGVuOwogCWludCByZXQgPSAtRUlOVkFMOworCXZvaWQgKmZzZGF0YTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CkBAIC00ODQ5LDExICs0OTc3LDExIEBACiAJICogb24gdGhlIHNhbWUgcGFnZSB0aG91Z2gKIAkgKi8KIAlyZXQgPSBtYXBwaW5nLT5hX29wcy0+d3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgcGFnZV9vZmZzZXQocGFnZSksCi0JCQlsZW4sIEFPUF9GTEFHX1VOSU5URVJSVVBUSUJMRSwgJnBhZ2UsIE5VTEwpOworCQkJbGVuLCBBT1BfRkxBR19VTklOVEVSUlVQVElCTEUsICZwYWdlLCAmZnNkYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfdW5sb2NrOwogCXJldCA9IG1hcHBpbmctPmFfb3BzLT53cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcGFnZV9vZmZzZXQocGFnZSksCi0JCQlsZW4sIGxlbiwgcGFnZSwgTlVMTCk7CisJCQlsZW4sIGxlbiwgcGFnZSwgZnNkYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfdW5sb2NrOwogCXJldCA9IDA7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKaW5kZXggN2E2YzJmMS4uZGM5OWI0NyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pb2N0bC5jCisrKyBiL2ZzL2V4dDQvaW9jdGwuYwpAQCAtMjMsOSArMjMsOCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotCXVuc2lnbmVkIHNob3J0IHJzdl93aW5kb3dfc2l6ZTsKIAotCWV4dDRfZGVidWcgKCJjbWQgPSAldSwgYXJnID0gJWx1XG4iLCBjbWQsIGFyZyk7CisJZXh0NF9kZWJ1ZygiY21kID0gJXUsIGFyZyA9ICVsdVxuIiwgY21kLCBhcmcpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEVYVDRfSU9DX0dFVEZMQUdTOgpAQCAtMzQsNyArMzMsNyBAQAogCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7CiAJY2FzZSBFWFQ0X0lPQ19TRVRGTEFHUzogewogCQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQkJaW50IGVycjsKKwkJaW50IGVyciwgbWlncmF0ZSA9IDA7CiAJCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzsKIAkJdW5zaWduZWQgaW50IG9sZGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgamZsYWc7CkBAIC04Miw2ICs4MSwxNyBAQAogCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQogCQkJCWdvdG8gZmxhZ3Nfb3V0OwogCQl9CisJCWlmIChvbGRmbGFncyAmIEVYVDRfRVhURU5UU19GTCkgeworCQkJLyogV2UgZG9uJ3Qgc3VwcG9ydCBjbGVhcm5pbmcgZXh0ZW50IGZsYWdzICovCisJCQlpZiAoIShmbGFncyAmIEVYVDRfRVhURU5UU19GTCkpIHsKKwkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGZsYWdzX291dDsKKwkJCX0KKwkJfSBlbHNlIGlmIChmbGFncyAmIEVYVDRfRVhURU5UU19GTCkgeworCQkJLyogbWlncmF0ZSB0aGUgZmlsZSAqLworCQkJbWlncmF0ZSA9IDE7CisJCQlmbGFncyAmPSB+RVhUNF9FWFRFTlRTX0ZMOworCQl9CiAKIAkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAxKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CkBAIC0xMDksNiArMTE5LDEwIEBACiAKIAkJaWYgKChqZmxhZyBeIG9sZGZsYWdzKSAmIChFWFQ0X0pPVVJOQUxfREFUQV9GTCkpCiAJCQllcnIgPSBleHQ0X2NoYW5nZV9pbm9kZV9qb3VybmFsX2ZsYWcoaW5vZGUsIGpmbGFnKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmxhZ3Nfb3V0OworCQlpZiAobWlncmF0ZSkKKwkJCWVyciA9IGV4dDRfZXh0X21pZ3JhdGUoaW5vZGUpOwogZmxhZ3Nfb3V0OgogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJbW50X2Ryb3Bfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CkBAIC0xNzUsNTMgKzE4OSwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogI2VuZGlmCi0JY2FzZSBFWFQ0X0lPQ19HRVRSU1ZTWjoKLQkJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBSRVNFUlZBVElPTikKLQkJCSYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKLQkJCSYmIGVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pIHsKLQkJCXJzdl93aW5kb3dfc2l6ZSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm8tPnJzdl93aW5kb3dfbm9kZS5yc3ZfZ29hbF9zaXplOwotCQkJcmV0dXJuIHB1dF91c2VyKHJzdl93aW5kb3dfc2l6ZSwgKGludCBfX3VzZXIgKilhcmcpOwotCQl9Ci0JCXJldHVybiAtRU5PVFRZOwotCWNhc2UgRVhUNF9JT0NfU0VUUlNWU1o6IHsKLQkJaW50IGVycjsKLQotCQlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBSRVNFUlZBVElPTikgfHwhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJCXJldHVybiAtRU5PVFRZOwotCi0JCWlmICghaXNfb3duZXJfb3JfY2FwKGlub2RlKSkKLQkJCXJldHVybiAtRUFDQ0VTOwotCi0JCWlmIChnZXRfdXNlcihyc3Zfd2luZG93X3NpemUsIChpbnQgX191c2VyICopYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWVyciA9IG1udF93YW50X3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlpZiAocnN2X3dpbmRvd19zaXplID4gRVhUNF9NQVhfUkVTRVJWRV9CTE9DS1MpCi0JCQlyc3Zfd2luZG93X3NpemUgPSBFWFQ0X01BWF9SRVNFUlZFX0JMT0NLUzsKLQotCQkvKgotCQkgKiBuZWVkIHRvIGFsbG9jYXRlIHJlc2VydmF0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcyBpbm9kZQotCQkgKiBiZWZvcmUgc2V0IHRoZSB3aW5kb3cgc2l6ZQotCQkgKi8KLQkJZG93bl93cml0ZSgmZWktPmlfZGF0YV9zZW0pOwotCQlpZiAoIWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pCi0JCQlleHQ0X2luaXRfYmxvY2tfYWxsb2NfaW5mbyhpbm9kZSk7Ci0KLQkJaWYgKGVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pewotCQkJc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2ID0gJmVpLT5pX2Jsb2NrX2FsbG9jX2luZm8tPnJzdl93aW5kb3dfbm9kZTsKLQkJCXJzdi0+cnN2X2dvYWxfc2l6ZSA9IHJzdl93aW5kb3dfc2l6ZTsKLQkJfQotCQl1cF93cml0ZSgmZWktPmlfZGF0YV9zZW0pOwotCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKLQkJcmV0dXJuIDA7Ci0JfQogCWNhc2UgRVhUNF9JT0NfR1JPVVBfRVhURU5EOiB7CiAJCWV4dDRfZnNibGtfdCBuX2Jsb2Nrc19jb3VudDsKIAkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCQlpbnQgZXJyOworCQlpbnQgZXJyLCBlcnIyOwogCiAJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKIAkJCXJldHVybiAtRVBFUk07CkBAIC0yMzUsOCArMjA2LDEwIEBACiAKIAkJZXJyID0gZXh0NF9ncm91cF9leHRlbmQoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCBuX2Jsb2Nrc19jb3VudCk7CiAJCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7Ci0JCWpiZDJfam91cm5hbF9mbHVzaChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKKwkJZXJyMiA9IGpiZDJfam91cm5hbF9mbHVzaChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKIAkJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOworCQlpZiAoZXJyID09IDApCisJCQllcnIgPSBlcnIyOwogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKIAogCQlyZXR1cm4gZXJyOwpAQCAtMjQ0LDcgKzIxNyw3IEBACiAJY2FzZSBFWFQ0X0lPQ19HUk9VUF9BREQ6IHsKIAkJc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgaW5wdXQ7CiAJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKLQkJaW50IGVycjsKKwkJaW50IGVyciwgZXJyMjsKIAogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCiAJCQlyZXR1cm4gLUVQRVJNOwpAQCAtMjU5LDE1ICsyMzIsMzYgQEAKIAogCQllcnIgPSBleHQ0X2dyb3VwX2FkZChzYiwgJmlucHV0KTsKIAkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKLQkJamJkMl9qb3VybmFsX2ZsdXNoKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOworCQllcnIyID0gamJkMl9qb3VybmFsX2ZsdXNoKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOwogCQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CisJCWlmIChlcnIgPT0gMCkKKwkJCWVyciA9IGVycjI7CiAJCW1udF9kcm9wX3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwogCiAJCXJldHVybiBlcnI7CiAJfQogCiAJY2FzZSBFWFQ0X0lPQ19NSUdSQVRFOgotCQlyZXR1cm4gZXh0NF9leHRfbWlncmF0ZShpbm9kZSwgZmlscCwgY21kLCBhcmcpOworCXsKKwkJaW50IGVycjsKKwkJaWYgKCFpc19vd25lcl9vcl9jYXAoaW5vZGUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKgorCQkgKiBpbm9kZV9tdXRleCBwcmV2ZW50IHdyaXRlIGFuZCB0cnVuY2F0ZSBvbiB0aGUgZmlsZS4KKwkJICogUmVhZCBzdGlsbCBnb2VzIHRocm91Z2guIFdlIHRha2UgaV9kYXRhX3NlbSBpbgorCQkgKiBleHQ0X2V4dF9zd2FwX2lub2RlX2RhdGEgYmVmb3JlIHdlIHN3aXRjaCB0aGUKKwkJICogaW5vZGUgZm9ybWF0IHRvIHByZXZlbnQgcmVhZC4KKwkJICovCisJCW11dGV4X2xvY2soJihpbm9kZS0+aV9tdXRleCkpOworCQllcnIgPSBleHQ0X2V4dF9taWdyYXRlKGlub2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCYoaW5vZGUtPmlfbXV0ZXgpKTsKKwkJbW50X2Ryb3Bfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CisJCXJldHVybiBlcnI7CisJfQogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBiL2ZzL2V4dDQvbWJhbGxvYy5jCmluZGV4IGUwZTNhNWUuLmI1ODA3MTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5jCkBAIC00NzcsOSArNDc3LDEwIEBACiAJCWIyID0gKHVuc2lnbmVkIGNoYXIgKikgYml0bWFwOwogCQlmb3IgKGkgPSAwOyBpIDwgZTRiLT5iZF9zYi0+c19ibG9ja3NpemU7IGkrKykgewogCQkJaWYgKGIxW2ldICE9IGIyW2ldKSB7Ci0JCQkJcHJpbnRrKCJjb3JydXB0aW9uIGluIGdyb3VwICVsdSBhdCBieXRlICV1KCV1KToiCi0JCQkJICAgICAgICIgJXggaW4gY29weSAhPSAleCBvbiBkaXNrL3ByZWFsbG9jXG4iLAotCQkJCQllNGItPmJkX2dyb3VwLCBpLCBpICogOCwgYjFbaV0sIGIyW2ldKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImNvcnJ1cHRpb24gaW4gZ3JvdXAgJWx1ICIKKwkJCQkgICAgICAgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKKwkJCQkgICAgICAgIm9uIGRpc2svcHJlYWxsb2NcbiIsCisJCQkJICAgICAgIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOwogCQkJCUJVRygpOwogCQkJfQogCQl9CkBAIC01MzMsOSArNTM0LDYgQEAKIAl2b2lkICpidWRkeTsKIAl2b2lkICpidWRkeTI7CiAKLQlpZiAoIXRlc3Rfb3B0KHNiLCBNQkFMTE9DKSkKLQkJcmV0dXJuIDA7Ci0KIAl7CiAJCXN0YXRpYyBpbnQgbWJfY2hlY2tfY291bnRlcjsKIAkJaWYgKG1iX2NoZWNrX2NvdW50ZXIrKyAlIDEwMCAhPSAwKQpAQCAtNzg0LDkgKzc4MiwxMSBAQAogCQlpZiAoYmhbaV0gPT0gTlVMTCkKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChiaF91cHRvZGF0ZV9vcl9sb2NrKGJoW2ldKSkKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkgJiYKKwkJICAgICEoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpKQogCQkJY29udGludWU7CiAKKwkJbG9ja19idWZmZXIoYmhbaV0pOwogCQlzcGluX2xvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGZpcnN0X2dyb3VwICsgaSkpOwogCQlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIGJoW2ldLApAQCAtMjE2OSw5ICsyMTY5LDEwIEBACiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKLQlyZW1vdmVfcHJvY19lbnRyeSgibWJfZ3JvdXBzIiwgc2JpLT5zX21iX3Byb2MpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJtYl9oaXN0b3J5Iiwgc2JpLT5zX21iX3Byb2MpOwotCisJaWYgKHNiaS0+c19wcm9jICE9IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm1iX2dyb3VwcyIsIHNiaS0+c19wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm1iX2hpc3RvcnkiLCBzYmktPnNfcHJvYyk7CisJfQogCWtmcmVlKHNiaS0+c19tYl9oaXN0b3J5KTsKIH0KIApAQCAtMjE4MCwxMCArMjE4MSwxMCBAQAogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCWludCBpOwogCi0JaWYgKHNiaS0+c19tYl9wcm9jICE9IE5VTEwpIHsKLQkJcHJvY19jcmVhdGVfZGF0YSgibWJfaGlzdG9yeSIsIFNfSVJVR08sIHNiaS0+c19tYl9wcm9jLAorCWlmIChzYmktPnNfcHJvYyAhPSBOVUxMKSB7CisJCXByb2NfY3JlYXRlX2RhdGEoIm1iX2hpc3RvcnkiLCBTX0lSVUdPLCBzYmktPnNfcHJvYywKIAkJCQkgJmV4dDRfbWJfc2VxX2hpc3RvcnlfZm9wcywgc2IpOwotCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9ncm91cHMiLCBTX0lSVUdPLCBzYmktPnNfbWJfcHJvYywKKwkJcHJvY19jcmVhdGVfZGF0YSgibWJfZ3JvdXBzIiwgU19JUlVHTywgc2JpLT5zX3Byb2MsCiAJCQkJICZleHQ0X21iX3NlcV9ncm91cHNfZm9wcywgc2IpOwogCX0KIApAQCAtMjQ4NSwxOSArMjQ4NiwxNCBAQAogCXVuc2lnbmVkIG1heDsKIAlpbnQgcmV0OwogCi0JaWYgKCF0ZXN0X29wdChzYiwgTUJBTExPQykpCi0JCXJldHVybiAwOwotCiAJaSA9IChzYi0+c19ibG9ja3NpemVfYml0cyArIDIpICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKIAogCXNiaS0+c19tYl9vZmZzZXRzID0ga21hbGxvYyhpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX21iX29mZnNldHMgPT0gTlVMTCkgewotCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJBTExPQyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlzYmktPnNfbWJfbWF4cyA9IGttYWxsb2MoaSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19tYl9tYXhzID09IE5VTEwpIHsKLQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE1CQUxMT0MpOwogCQlrZnJlZShzYmktPnNfbWJfbWF4cyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI1MjAsNyArMjUxNiw2IEBACiAJLyogaW5pdCBmaWxlIGZvciBidWRkeSBkYXRhICovCiAJcmV0ID0gZXh0NF9tYl9pbml0X2JhY2tlbmQoc2IpOwogCWlmIChyZXQgIT0gMCkgewotCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJBTExPQyk7CiAJCWtmcmVlKHNiaS0+c19tYl9vZmZzZXRzKTsKIAkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjU0MCwxNyArMjUzNSwxNSBAQAogCXNiaS0+c19tYl9oaXN0b3J5X2ZpbHRlciA9IEVYVDRfTUJfSElTVE9SWV9ERUZBVUxUOwogCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA9IE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0M7CiAKLQlpID0gc2l6ZW9mKHN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwKSAqIG5yX2NwdV9pZHM7Ci0Jc2JpLT5zX2xvY2FsaXR5X2dyb3VwcyA9IGttYWxsb2MoaSwgR0ZQX0tFUk5FTCk7CisJc2JpLT5zX2xvY2FsaXR5X2dyb3VwcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCk7CiAJaWYgKHNiaS0+c19sb2NhbGl0eV9ncm91cHMgPT0gTlVMTCkgewotCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJBTExPQyk7CiAJCWtmcmVlKHNiaS0+c19tYl9vZmZzZXRzKTsKIAkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykgeworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpsZzsKLQkJbGcgPSAmc2JpLT5zX2xvY2FsaXR5X2dyb3Vwc1tpXTsKKwkJbGcgPSBwZXJfY3B1X3B0cihzYmktPnNfbG9jYWxpdHlfZ3JvdXBzLCBpKTsKIAkJbXV0ZXhfaW5pdCgmbGctPmxnX211dGV4KTsKIAkJZm9yIChqID0gMDsgaiA8IFBSRUFMTE9DX1RCX1NJWkU7IGorKykKIAkJCUlOSVRfTElTVF9IRUFEKCZsZy0+bGdfcHJlYWxsb2NfbGlzdFtqXSk7CkBAIC0yNTYwLDcgKzI1NTMsNyBAQAogCWV4dDRfbWJfaW5pdF9wZXJfZGV2X3Byb2Moc2IpOwogCWV4dDRfbWJfaGlzdG9yeV9pbml0KHNiKTsKIAotCXByaW50aygiRVhUNC1mczogbWJhbGxvYyBlbmFibGVkXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtYmFsbG9jIGVuYWJsZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTg5LDkgKzI1ODIsNiBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbzsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAotCWlmICghdGVzdF9vcHQoc2IsIE1CQUxMT0MpKQotCQlyZXR1cm4gMDsKLQogCS8qIHJlbGVhc2UgZnJlZWQsIG5vbi1jb21taXR0ZWQgYmxvY2tzICovCiAJc3Bpbl9sb2NrKCZzYmktPnNfbWRfbG9jayk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmc2JpLT5zX2Nsb3NlZF90cmFuc2FjdGlvbiwKQEAgLTI2NDcsOCArMjYzNyw3IEBACiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19tYl9kaXNjYXJkZWQpKTsKIAl9CiAKLQlrZnJlZShzYmktPnNfbG9jYWxpdHlfZ3JvdXBzKTsKLQorCWZyZWVfcGVyY3B1KHNiaS0+c19sb2NhbGl0eV9ncm91cHMpOwogCWV4dDRfbWJfaGlzdG9yeV9yZWxlYXNlKHNiKTsKIAlleHQ0X21iX2Rlc3Ryb3lfcGVyX2Rldl9wcm9jKHNiKTsKIApAQCAtMjcyMSwxMTggKzI3MTAsNDYgQEAKICNkZWZpbmUgRVhUNF9NQl9TVFJFQU1fUkVRCQkic3RyZWFtX3JlcSIKICNkZWZpbmUgRVhUNF9NQl9HUk9VUF9QUkVBTExPQwkJImdyb3VwX3ByZWFsbG9jIgogCi0KLQotI2RlZmluZSBNQl9QUk9DX0ZPUFMobmFtZSkJCQkJCVwKLXN0YXRpYyBpbnQgZXh0NF9tYl8jI25hbWUjI19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQlcCi17CQkJCQkJCQlcCi0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gbS0+cHJpdmF0ZTsJCQlcCi0JCQkJCQkJCVwKLQlzZXFfcHJpbnRmKG0sICIlbGRcbiIsIHNiaS0+c19tYl8jI25hbWUpOwkJXAotCXJldHVybiAwOwkJCQkJCVwKLX0JCQkJCQkJCVwKLQkJCQkJCQkJXAotc3RhdGljIGludCBleHQ0X21iXyMjbmFtZSMjX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcCi17CQkJCQkJCQlcCi0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGV4dDRfbWJfIyNuYW1lIyNfcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTtcCi19CQkJCQkJCQlcCi0JCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IGV4dDRfbWJfIyNuYW1lIyNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwJXAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCVwKLXsJCQkJCQkJCVwKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7XAotCWNoYXIgc3RyWzMyXTsJCQkJCQlcCi0JbG9uZyB2YWx1ZTsJCQkJCQlcCi0JaWYgKGNudCA+PSBzaXplb2Yoc3RyKSkJCQkJCVwKLQkJcmV0dXJuIC1FSU5WQUw7CQkJCQlcCi0JaWYgKGNvcHlfZnJvbV91c2VyKHN0ciwgYnVmLCBjbnQpKQkJCVwKLQkJcmV0dXJuIC1FRkFVTFQ7CQkJCQlcCi0JdmFsdWUgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CQkJXAotCWlmICh2YWx1ZSA8PSAwKQkJCQkJCVwKLQkJcmV0dXJuIC1FUkFOR0U7CQkJCQlcCi0Jc2JpLT5zX21iXyMjbmFtZSA9IHZhbHVlOwkJCQlcCi0JcmV0dXJuIGNudDsJCQkJCQlcCi19CQkJCQkJCQlcCi0JCQkJCQkJCVwKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDRfbWJfIyNuYW1lIyNfcHJvY19mb3BzID0gewlcCi0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCi0JLm9wZW4JCT0gZXh0NF9tYl8jI25hbWUjI19wcm9jX29wZW4sCQlcCi0JLnJlYWQJCT0gc2VxX3JlYWQsCQkJCVwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywJCQkJXAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCQkJXAotCS53cml0ZQkJPSBleHQ0X21iXyMjbmFtZSMjX3Byb2Nfd3JpdGUsCQlcCi19OwotCi1NQl9QUk9DX0ZPUFMoc3RhdHMpOwotTUJfUFJPQ19GT1BTKG1heF90b19zY2FuKTsKLU1CX1BST0NfRk9QUyhtaW5fdG9fc2Nhbik7Ci1NQl9QUk9DX0ZPUFMob3JkZXIyX3JlcXMpOwotTUJfUFJPQ19GT1BTKHN0cmVhbV9yZXF1ZXN0KTsKLU1CX1BST0NfRk9QUyhncm91cF9wcmVhbGxvYyk7Ci0KLSNkZWZpbmUJTUJfUFJPQ19IQU5ETEVSKG5hbWUsIHZhcikJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcHJvYyA9IHByb2NfY3JlYXRlX2RhdGEobmFtZSwgbW9kZSwgc2JpLT5zX21iX3Byb2MsCQlcCi0JCQkJJmV4dDRfbWJfIyN2YXIjI19wcm9jX2ZvcHMsIHNiaSk7CVwKLQlpZiAocHJvYyA9PSBOVUxMKSB7CQkJCQkJXAotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbid0IHRvIGNyZWF0ZSAlc1xuIiwgbmFtZSk7CVwKLQkJZ290byBlcnJfb3V0OwkJCQkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQotCiBzdGF0aWMgaW50IGV4dDRfbWJfaW5pdF9wZXJfZGV2X3Byb2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAltb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0JY2hhciBkZXZuYW1lWzY0XTsKIAotCWlmIChwcm9jX3Jvb3RfZXh0NCA9PSBOVUxMKSB7Ci0JCXNiaS0+c19tYl9wcm9jID0gTlVMTDsKKwlpZiAoc2JpLT5zX3Byb2MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWJkZXZuYW1lKHNiLT5zX2JkZXYsIGRldm5hbWUpOwotCXNiaS0+c19tYl9wcm9jID0gcHJvY19ta2RpcihkZXZuYW1lLCBwcm9jX3Jvb3RfZXh0NCk7CiAKLQlNQl9QUk9DX0hBTkRMRVIoRVhUNF9NQl9TVEFUU19OQU1FLCBzdGF0cyk7Ci0JTUJfUFJPQ19IQU5ETEVSKEVYVDRfTUJfTUFYX1RPX1NDQU5fTkFNRSwgbWF4X3RvX3NjYW4pOwotCU1CX1BST0NfSEFORExFUihFWFQ0X01CX01JTl9UT19TQ0FOX05BTUUsIG1pbl90b19zY2FuKTsKLQlNQl9QUk9DX0hBTkRMRVIoRVhUNF9NQl9PUkRFUjJfUkVRLCBvcmRlcjJfcmVxcyk7Ci0JTUJfUFJPQ19IQU5ETEVSKEVYVDRfTUJfU1RSRUFNX1JFUSwgc3RyZWFtX3JlcXVlc3QpOwotCU1CX1BST0NfSEFORExFUihFWFQ0X01CX0dST1VQX1BSRUFMTE9DLCBncm91cF9wcmVhbGxvYyk7Ci0KKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX1NUQVRTX05BTUUsIG1iX3N0YXRzKTsKKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX01BWF9UT19TQ0FOX05BTUUsIG1iX21heF90b19zY2FuKTsKKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX01JTl9UT19TQ0FOX05BTUUsIG1iX21pbl90b19zY2FuKTsKKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX09SREVSMl9SRVEsIG1iX29yZGVyMl9yZXFzKTsKKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX1NUUkVBTV9SRVEsIG1iX3N0cmVhbV9yZXF1ZXN0KTsKKwlFWFQ0X1BST0NfSEFORExFUihFWFQ0X01CX0dST1VQX1BSRUFMTE9DLCBtYl9ncm91cF9wcmVhbGxvYyk7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBVbmFibGUgdG8gY3JlYXRlICVzXG4iLCBkZXZuYW1lKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX0dST1VQX1BSRUFMTE9DLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9TVFJFQU1fUkVRLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9PUkRFUjJfUkVRLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9NSU5fVE9fU0NBTl9OQU1FLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9NQVhfVE9fU0NBTl9OQU1FLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9TVEFUU19OQU1FLCBzYmktPnNfbWJfcHJvYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoZGV2bmFtZSwgcHJvY19yb290X2V4dDQpOwotCXNiaS0+c19tYl9wcm9jID0gTlVMTDsKLQorCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfR1JPVVBfUFJFQUxMT0MsIHNiaS0+c19wcm9jKTsKKwlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX1NUUkVBTV9SRVEsIHNiaS0+c19wcm9jKTsKKwlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX09SREVSMl9SRVEsIHNiaS0+c19wcm9jKTsKKwlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX01JTl9UT19TQ0FOX05BTUUsIHNiaS0+c19wcm9jKTsKKwlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX01BWF9UT19TQ0FOX05BTUUsIHNiaS0+c19wcm9jKTsKKwlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX1NUQVRTX05BTUUsIHNiaS0+c19wcm9jKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIGludCBleHQ0X21iX2Rlc3Ryb3lfcGVyX2Rldl9wcm9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0JY2hhciBkZXZuYW1lWzY0XTsKIAotCWlmIChzYmktPnNfbWJfcHJvYyA9PSBOVUxMKQorCWlmIChzYmktPnNfcHJvYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWJkZXZuYW1lKHNiLT5zX2JkZXYsIGRldm5hbWUpOwotCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfR1JPVVBfUFJFQUxMT0MsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX1NUUkVBTV9SRVEsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX09SREVSMl9SRVEsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX01JTl9UT19TQ0FOX05BTUUsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX01BWF9UT19TQ0FOX05BTUUsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShFWFQ0X01CX1NUQVRTX05BTUUsIHNiaS0+c19tYl9wcm9jKTsKLQlyZW1vdmVfcHJvY19lbnRyeShkZXZuYW1lLCBwcm9jX3Jvb3RfZXh0NCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoRVhUNF9NQl9HUk9VUF9QUkVBTExPQywgc2JpLT5zX3Byb2MpOworCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfU1RSRUFNX1JFUSwgc2JpLT5zX3Byb2MpOworCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfT1JERVIyX1JFUSwgc2JpLT5zX3Byb2MpOworCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfTUlOX1RPX1NDQU5fTkFNRSwgc2JpLT5zX3Byb2MpOworCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfTUFYX1RPX1NDQU5fTkFNRSwgc2JpLT5zX3Byb2MpOworCXJlbW92ZV9wcm9jX2VudHJ5KEVYVDRfTUJfU1RBVFNfTkFNRSwgc2JpLT5zX3Byb2MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODU0LDExICsyNzcxLDYgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KGV4dDRfcHNwYWNlX2NhY2hlcCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXByb2Nfcm9vdF9leHQ0ID0gcHJvY19ta2RpcigiZnMvZXh0NCIsIE5VTEwpOwotCWlmIChwcm9jX3Jvb3RfZXh0NCA9PSBOVUxMKQotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IFVuYWJsZSB0byBjcmVhdGUgZnMvZXh0NFxuIik7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg2Nyw5ICsyNzc5LDYgQEAKIAkvKiBYWFg6IHN5bmNocm9uaXplX3JjdSgpOyAqLwogCWttZW1fY2FjaGVfZGVzdHJveShleHQ0X3BzcGFjZV9jYWNoZXApOwogCWttZW1fY2FjaGVfZGVzdHJveShleHQ0X2FjX2NhY2hlcCk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZW1vdmVfcHJvY19lbnRyeSgiZnMvZXh0NCIsIE5VTEwpOwotI2VuZGlmCiB9CiAKIApAQCAtMjg3OSw3ICsyNzg4LDcgQEAKICAqLwogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKIGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLAotCQkJCWhhbmRsZV90ICpoYW5kbGUpCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyByZXNlcnZfYmxrcykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwpAQCAtMjk2OCwxNSArMjg3NywxNiBAQAogCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgLWFjLT5hY19iX2V4LmZlX2xlbik7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXAsIGdkcCk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCkpOwotCisJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBhYy0+YWNfYl9leC5mZV9sZW4pOwogCS8qCi0JICogZnJlZSBibG9ja3MgYWNjb3VudCBoYXMgYWxyZWFkeSBiZSByZWR1Y2VkL3Jlc2VydmVkCi0JICogYXQgd3JpdGVfYmVnaW4oKSB0aW1lIGZvciBkZWxheWVkIGFsbG9jYXRpb24KLQkgKiBkbyBub3QgZG91YmxlIGFjY291bnRpbmcKKwkgKiBOb3cgcmVkdWNlIHRoZSBkaXJ0eSBibG9jayBjb3VudCBhbHNvLiBTaG91bGQgbm90IGdvIG5lZ2F0aXZlCiAJICovCiAJaWYgKCEoYWMtPmFjX2ZsYWdzICYgRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRCkpCi0JCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJCQkJYWMtPmFjX2JfZXguZmVfbGVuKTsKKwkJLyogcmVsZWFzZSBhbGwgdGhlIHJlc2VydmVkIGJsb2NrcyBpZiBub24gZGVsYWxsb2MgKi8KKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgcmVzZXJ2X2Jsa3MpOworCWVsc2UKKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwkJCQkJCWFjLT5hY19iX2V4LmZlX2xlbik7CiAKIAlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLApAQCAtMzg4NCw3ICszNzk0LDcgQEAKICAqCiAgKiBGSVhNRSEhIE1ha2Ugc3VyZSBpdCBpcyB2YWxpZCBhdCBhbGwgdGhlIGNhbGwgc2l0ZXMKICAqLwotdm9pZCBleHQ0X21iX2Rpc2NhcmRfaW5vZGVfcHJlYWxsb2NhdGlvbnMoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKQEAgLTM4OTYsNyArMzgwNiw3IEBACiAJc3RydWN0IGV4dDRfYnVkZHkgZTRiOwogCWludCBlcnI7CiAKLQlpZiAoIXRlc3Rfb3B0KHNiLCBNQkFMTE9DKSB8fCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkvKkJVR19PTighbGlzdF9lbXB0eSgmZWktPmlfcHJlYWxsb2NfbGlzdCkpOyovCiAJCXJldHVybjsKIAl9CkBAIC00MDk0LDggKzQwMDQsNyBAQAogCSAqIHBlciBjcHUgbG9jYWxpdHkgZ3JvdXAgaXMgdG8gcmVkdWNlIHRoZSBjb250ZW50aW9uIGJldHdlZW4gYmxvY2sKIAkgKiByZXF1ZXN0IGZyb20gbXVsdGlwbGUgQ1BVcy4KIAkgKi8KLQlhYy0+YWNfbGcgPSAmc2JpLT5zX2xvY2FsaXR5X2dyb3Vwc1tnZXRfY3B1KCldOwotCXB1dF9jcHUoKTsKKwlhYy0+YWNfbGcgPSBwZXJfY3B1X3B0cihzYmktPnNfbG9jYWxpdHlfZ3JvdXBzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCS8qIHdlJ3JlIGdvaW5nIHRvIHVzZSBncm91cCBhbGxvY2F0aW9uICovCiAJYWMtPmFjX2ZsYWdzIHw9IEVYVDRfTUJfSElOVF9HUk9VUF9BTExPQzsKQEAgLTQzNjksMzMgKzQyNzgsMzIgQEAKIGV4dDRfZnNibGtfdCBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0ICphciwgaW50ICplcnJwKQogeworCWludCBmcmVlZDsKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlleHQ0X2ZzYmxrX3QgYmxvY2sgPSAwOwotCWludCBmcmVlZDsKLQlpbnQgaW5xdW90YTsKKwl1bnNpZ25lZCBsb25nIGlucXVvdGE7CisJdW5zaWduZWQgbG9uZyByZXNlcnZfYmxrcyA9IDA7CiAKIAlzYiA9IGFyLT5pbm9kZS0+aV9zYjsKIAlzYmkgPSBFWFQ0X1NCKHNiKTsKIAotCWlmICghdGVzdF9vcHQoc2IsIE1CQUxMT0MpKSB7Ci0JCWJsb2NrID0gZXh0NF9vbGRfbmV3X2Jsb2NrcyhoYW5kbGUsIGFyLT5pbm9kZSwgYXItPmdvYWwsCi0JCQkJCSAgICAmKGFyLT5sZW4pLCBlcnJwKTsKLQkJcmV0dXJuIGJsb2NrOwotCX0KIAlpZiAoIUVYVDRfSShhci0+aW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcpIHsKIAkJLyoKIAkJICogV2l0aCBkZWxhbGxvYyB3ZSBhbHJlYWR5IHJlc2VydmVkIHRoZSBibG9ja3MKIAkJICovCi0JCWFyLT5sZW4gPSBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzYmksIGFyLT5sZW4pOworCQl3aGlsZSAoYXItPmxlbiAmJiBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHNiaSwgYXItPmxlbikpIHsKKwkJCS8qIGxldCBvdGhlcnMgdG8gZnJlZSB0aGUgc3BhY2UgKi8KKwkJCXlpZWxkKCk7CisJCQlhci0+bGVuID0gYXItPmxlbiA+PiAxOworCQl9CisJCWlmICghYXItPmxlbikgeworCQkJKmVycnAgPSAtRU5PU1BDOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVzZXJ2X2Jsa3MgPSBhci0+bGVuOwogCX0KLQotCWlmIChhci0+bGVuID09IDApIHsKLQkJKmVycnAgPSAtRU5PU1BDOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAl3aGlsZSAoYXItPmxlbiAmJiBEUVVPVF9BTExPQ19CTE9DSyhhci0+aW5vZGUsIGFyLT5sZW4pKSB7CiAJCWFyLT5mbGFncyB8PSBFWFQ0X01CX0hJTlRfTk9QUkVBTExPQzsKIAkJYXItPmxlbi0tOwpAQCAtNDQ0MSw3ICs0MzQ5LDcgQEAKIAl9CiAKIAlpZiAobGlrZWx5KGFjLT5hY19zdGF0dXMgPT0gQUNfU1RBVFVTX0ZPVU5EKSkgewotCQkqZXJycCA9IGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChhYywgaGFuZGxlKTsKKwkJKmVycnAgPSBleHQ0X21iX21hcmtfZGlza3NwYWNlX3VzZWQoYWMsIGhhbmRsZSwgcmVzZXJ2X2Jsa3MpOwogCQlpZiAoKmVycnAgPT0gIC1FQUdBSU4pIHsKIAkJCWFjLT5hY19iX2V4LmZlX2dyb3VwID0gMDsKIAkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5oIGIvZnMvZXh0NC9tYmFsbG9jLmgKaW5kZXggYzdjOTkwNi4uYjNiNDgyOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmgKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmgKQEAgLTI1Nyw3ICsyNTcsNiBAQAogCiAjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290X2V4dDQ7CiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBleHQ0X2dyb3VwX3QpOwogCiBzdGF0aWMgdm9pZCBleHQ0X21iX2dlbmVyYXRlX2Zyb21fcGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqYml0bWFwLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCA0NmZjMGI1Li5mMmE5Y2Y0IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtNDQ3LDggKzQ0Nyw3IEBACiAKIH0KIAotaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IHJldHZhbCA9IDAsIGk7CkBAIC01MTYsMTIgKzUxNSw2IEBACiAJICogd2hlbiB3ZSBhZGQgZXh0ZW50cyB3ZSBleHRlbnQgdGhlIGpvdXJuYWwKIAkgKi8KIAkvKgotCSAqIGlub2RlX211dGV4IHByZXZlbnQgd3JpdGUgYW5kIHRydW5jYXRlIG9uIHRoZSBmaWxlLiBSZWFkIHN0aWxsIGdvZXMKLQkgKiB0aHJvdWdoLiBXZSB0YWtlIGlfZGF0YV9zZW0gaW4gZXh0NF9leHRfc3dhcF9pbm9kZV9kYXRhIGJlZm9yZSB3ZQotCSAqIHN3aXRjaCB0aGUgaW5vZGUgZm9ybWF0IHRvIHByZXZlbnQgcmVhZC4KLQkgKi8KLQltdXRleF9sb2NrKCYoaW5vZGUtPmlfbXV0ZXgpKTsKLQkvKgogCSAqIEV2ZW4gdGhvdWdoIHdlIHRha2UgaV9tdXRleCB3ZSBjYW4gc3RpbGwgY2F1c2UgYmxvY2sgYWxsb2NhdGlvbgogCSAqIHZpYSBtbWFwIHdyaXRlIHRvIGhvbGVzLiBJZiB3ZSBoYXZlIGFsbG9jYXRlZCBuZXcgYmxvY2tzIHdlIGZhaWwKIAkgKiBtaWdyYXRlLiAgTmV3IGJsb2NrIGFsbG9jYXRpb24gd2lsbCBjbGVhciBFWFQ0X0VYVF9NSUdSQVRFIGZsYWcuCkBAIC02MjMsNyArNjE2LDYgQEAKIAl0bXBfaW5vZGUtPmlfbmxpbmsgPSAwOwogCiAJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQltdXRleF91bmxvY2soJihpbm9kZS0+aV9tdXRleCkpOwogCiAJaWYgKHRtcF9pbm9kZSkKIAkJaXB1dCh0bXBfaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5jIGIvZnMvZXh0NC9uYW1laS5jCmluZGV4IDM4N2FkOTguLjkyZGI5ZTkgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbmFtZWkuYworKysgYi9mcy9leHQ0L25hbWVpLmMKQEAgLTE1MSwzNCArMTUxLDM2IEBACiAKIHN0YXRpYyBpbmxpbmUgZXh0NF9sYmxrX3QgZHhfZ2V0X2Jsb2NrKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOwogc3RhdGljIHZvaWQgZHhfc2V0X2Jsb2NrKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIGV4dDRfbGJsa190IHZhbHVlKTsKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2hhc2ggKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOwotc3RhdGljIHZvaWQgZHhfc2V0X2hhc2ggKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKTsKLXN0YXRpYyB1bnNpZ25lZCBkeF9nZXRfY291bnQgKHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcyk7Ci1zdGF0aWMgdW5zaWduZWQgZHhfZ2V0X2xpbWl0IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOwotc3RhdGljIHZvaWQgZHhfc2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIHVuc2lnbmVkIHZhbHVlKTsKLXN0YXRpYyB2b2lkIGR4X3NldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSk7Ci1zdGF0aWMgdW5zaWduZWQgZHhfcm9vdF9saW1pdCAoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKTsKLXN0YXRpYyB1bnNpZ25lZCBkeF9ub2RlX2xpbWl0IChzdHJ1Y3QgaW5vZGUgKmRpcik7Ci1zdGF0aWMgc3RydWN0IGR4X2ZyYW1lICpkeF9wcm9iZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9oYXNoKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgZHhfc2V0X2hhc2goc3RydWN0IGR4X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGR4X2dldF9jb3VudChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOworc3RhdGljIHVuc2lnbmVkIGR4X2dldF9saW1pdChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOworc3RhdGljIHZvaWQgZHhfc2V0X2NvdW50KHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHZvaWQgZHhfc2V0X2xpbWl0KHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKTsKK3N0YXRpYyB1bnNpZ25lZCBkeF9ub2RlX2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyKTsKK3N0YXRpYyBzdHJ1Y3QgZHhfZnJhbWUgKmR4X3Byb2JlKGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsCiAJCQkJIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCSBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywKIAkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKIAkJCQkgaW50ICplcnIpOwotc3RhdGljIHZvaWQgZHhfcmVsZWFzZSAoc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpOwotc3RhdGljIGludCBkeF9tYWtlX21hcCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCBpbnQgc2l6ZSwKLQkJCXN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvLCBzdHJ1Y3QgZHhfbWFwX2VudHJ5IG1hcFtdKTsKK3N0YXRpYyB2b2lkIGR4X3JlbGVhc2Uoc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpOworc3RhdGljIGludCBkeF9tYWtlX21hcChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIGludCBzaXplLAorCQkgICAgICAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIHN0cnVjdCBkeF9tYXBfZW50cnkgbWFwW10pOwogc3RhdGljIHZvaWQgZHhfc29ydF9tYXAoc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwLCB1bnNpZ25lZCBjb3VudCk7Ci1zdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmR4X21vdmVfZGlyZW50cyAoY2hhciAqZnJvbSwgY2hhciAqdG8sCitzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmR4X21vdmVfZGlyZW50cyhjaGFyICpmcm9tLCBjaGFyICp0bywKIAkJc3RydWN0IGR4X21hcF9lbnRyeSAqb2Zmc2V0cywgaW50IGNvdW50KTsKLXN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiogZHhfcGFja19kaXJlbnRzIChjaGFyICpiYXNlLCBpbnQgc2l6ZSk7CitzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIqIGR4X3BhY2tfZGlyZW50cyhjaGFyICpiYXNlLCBpbnQgc2l6ZSk7CiBzdGF0aWMgdm9pZCBkeF9pbnNlcnRfYmxvY2soc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKIAkJCQkJdTMyIGhhc2gsIGV4dDRfbGJsa190IGJsb2NrKTsKIHN0YXRpYyBpbnQgZXh0NF9odHJlZV9uZXh0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqZGlyLCBfX3UzMiBoYXNoLAogCQkJCSBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lLAogCQkJCSBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcywKIAkJCQkgX191MzIgKnN0YXJ0X2hhc2gpOwotc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDRfZHhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCSAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKnJlc19kaXIsIGludCAqZXJyKTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQ0X2R4X2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsCisJCWNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsCisJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqcmVzX2RpciwKKwkJaW50ICplcnIpOwogc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCkBAIC0yMDcsNDQgKzIwOSw0NCBAQAogCWVudHJ5LT5ibG9jayA9IGNwdV90b19sZTMyKHZhbHVlKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfaGFzaCAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2hhc2goc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUoZW50cnktPmhhc2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2hhc2ggKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9oYXNoKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQogewogCWVudHJ5LT5oYXNoID0gY3B1X3RvX2xlMzIodmFsdWUpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfY291bnQoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQogewogCXJldHVybiBsZTE2X3RvX2NwdSgoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2xpbWl0IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9saW1pdChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCiB7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KCgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmxpbWl0KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfY291bnQoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKIHsKIAkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCA9IGNwdV90b19sZTE2KHZhbHVlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfbGltaXQoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKIHsKIAkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5saW1pdCA9IGNwdV90b19sZTE2KHZhbHVlKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0IChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKQogewogCXVuc2lnbmVkIGVudHJ5X3NwYWNlID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIEVYVDRfRElSX1JFQ19MRU4oMSkgLQogCQlFWFQ0X0RJUl9SRUNfTEVOKDIpIC0gaW5mb3NpemU7CiAJcmV0dXJuIGVudHJ5X3NwYWNlIC8gc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X25vZGVfbGltaXQoc3RydWN0IGlub2RlICpkaXIpCiB7CiAJdW5zaWduZWQgZW50cnlfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gRVhUNF9ESVJfUkVDX0xFTigwKTsKIAlyZXR1cm4gZW50cnlfc3BhY2UgLyBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KTsKQEAgLTI1NCwxMiArMjU2LDEyIEBACiAgKiBEZWJ1ZwogICovCiAjaWZkZWYgRFhfREVCVUcKLXN0YXRpYyB2b2lkIGR4X3Nob3dfaW5kZXggKGNoYXIgKiBsYWJlbCwgc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQorc3RhdGljIHZvaWQgZHhfc2hvd19pbmRleChjaGFyICogbGFiZWwsIHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcykKIHsKIAlpbnQgaSwgbiA9IGR4X2dldF9jb3VudCAoZW50cmllcyk7Ci0JcHJpbnRrKCIlcyBpbmRleCAiLCBsYWJlbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGluZGV4ICIsIGxhYmVsKTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXByaW50aygiJXgtPiVsdSAiLCBpPyBkeF9nZXRfaGFzaChlbnRyaWVzICsgaSkgOgorCQlwcmludGsoIiV4LT4lbHUgIiwgaSA/IGR4X2dldF9oYXNoKGVudHJpZXMgKyBpKSA6CiAJCQkJMCwgKHVuc2lnbmVkIGxvbmcpZHhfZ2V0X2Jsb2NrKGVudHJpZXMgKyBpKSk7CiAJfQogCXByaW50aygiXG4iKTsKQEAgLTMwNiw3ICszMDgsNyBAQAogCQkJICAgICBzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIGludCBsZXZlbHMpCiB7CiAJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQl1bnNpZ25lZCBjb3VudCA9IGR4X2dldF9jb3VudCAoZW50cmllcyksIG5hbWVzID0gMCwgc3BhY2UgPSAwLCBpOworCXVuc2lnbmVkIGNvdW50ID0gZHhfZ2V0X2NvdW50KGVudHJpZXMpLCBuYW1lcyA9IDAsIHNwYWNlID0gMCwgaTsKIAl1bnNpZ25lZCBiY291bnQgPSAwOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGVycjsKQEAgLTMyNSwxMSArMzI3LDEyIEBACiAJCW5hbWVzICs9IHN0YXRzLm5hbWVzOwogCQlzcGFjZSArPSBzdGF0cy5zcGFjZTsKIAkJYmNvdW50ICs9IHN0YXRzLmJjb3VudDsKLQkJYnJlbHNlIChiaCk7CisJCWJyZWxzZShiaCk7CiAJfQogCWlmIChiY291bnQpCi0JCXByaW50aygiJXNuYW1lcyAldSwgZnVsbG5lc3MgJXUgKCV1JSUpXG4iLCBsZXZlbHM/IiI6IiAgICIsCi0JCQluYW1lcywgc3BhY2UvYmNvdW50LChzcGFjZS9iY291bnQpKjEwMC9ibG9ja3NpemUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXNuYW1lcyAldSwgZnVsbG5lc3MgJXUgKCV1JSUpXG4iLCAKKwkJICAgICAgIGxldmVscyA/ICIiIDogIiAgICIsIG5hbWVzLCBzcGFjZS9iY291bnQsCisJCSAgICAgICAoc3BhY2UvYmNvdW50KSoxMDAvYmxvY2tzaXplKTsKIAlyZXR1cm4gKHN0cnVjdCBzdGF0cykgeyBuYW1lcywgc3BhY2UsIGJjb3VudH07CiB9CiAjZW5kaWYgLyogRFhfREVCVUcgKi8KQEAgLTM0NCw3ICszNDcsNyBAQAogICogYmFjayB0byB1c2Vyc3BhY2UuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZHhfZnJhbWUgKgotZHhfcHJvYmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKK2R4X3Byb2JlKGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCSBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X2ZyYW1lICpmcmFtZV9pbiwgaW50ICplcnIpCiB7CiAJdW5zaWduZWQgY291bnQsIGluZGlyZWN0OwpAQCAtMzU1LDggKzM1OCw2IEBACiAJdTMyIGhhc2g7CiAKIAlmcmFtZS0+YmggPSBOVUxMOwotCWlmIChkZW50cnkpCi0JCWRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJaWYgKCEoYmggPSBleHQ0X2JyZWFkIChOVUxMLGRpciwgMCwgMCwgZXJyKSkpCiAJCWdvdG8gZmFpbDsKIAlyb290ID0gKHN0cnVjdCBkeF9yb290ICopIGJoLT5iX2RhdGE7CkBAIC0zNzIsOCArMzczLDggQEAKIAl9CiAJaGluZm8tPmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOwogCWhpbmZvLT5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKLQlpZiAoZGVudHJ5KQotCQlleHQ0ZnNfZGlyaGFzaChkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIGhpbmZvKTsKKwlpZiAoZF9uYW1lKQorCQlleHQ0ZnNfZGlyaGFzaChkX25hbWUtPm5hbWUsIGRfbmFtZS0+bGVuLCBoaW5mbyk7CiAJaGFzaCA9IGhpbmZvLT5oYXNoOwogCiAJaWYgKHJvb3QtPmluZm8udW51c2VkX2ZsYWdzICYgMSkgewpAQCAtNDA2LDcgKzQwNyw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlkeHRyYWNlIChwcmludGsoIkxvb2sgdXAgJXgiLCBoYXNoKSk7CisJZHh0cmFjZShwcmludGsoIkxvb2sgdXAgJXgiLCBoYXNoKSk7CiAJd2hpbGUgKDEpCiAJewogCQljb3VudCA9IGR4X2dldF9jb3VudChlbnRyaWVzKTsKQEAgLTU1NSw3ICs1NTYsNyBAQAogCQkJCSAgICAgIDAsICZlcnIpKSkKIAkJCXJldHVybiBlcnI7IC8qIEZhaWx1cmUgKi8KIAkJcCsrOwotCQlicmVsc2UgKHAtPmJoKTsKKwkJYnJlbHNlKHAtPmJoKTsKIAkJcC0+YmggPSBiaDsKIAkJcC0+YXQgPSBwLT5lbnRyaWVzID0gKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaC0+Yl9kYXRhKS0+ZW50cmllczsKIAl9CkBAIC01OTMsNyArNTk0LDcgQEAKIAkJCS8qIE9uIGVycm9yLCBza2lwIHRoZSBmX3BvcyB0byB0aGUgbmV4dCBibG9jay4gKi8KIAkJCWRpcl9maWxlLT5mX3BvcyA9IChkaXJfZmlsZS0+Zl9wb3MgfAogCQkJCQkoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7Ci0JCQlicmVsc2UgKGJoKTsKKwkJCWJyZWxzZShiaCk7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KIAkJZXh0NGZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgaGluZm8pOwpAQCAtNjM1LDggKzYzNiw4IEBACiAJaW50IHJldCwgZXJyOwogCV9fdTMyIGhhc2h2YWw7CiAKLQlkeHRyYWNlKHByaW50aygiSW4gaHRyZWVfZmlsbF90cmVlLCBzdGFydCBoYXNoOiAleDoleFxuIiwgc3RhcnRfaGFzaCwKLQkJICAgICAgIHN0YXJ0X21pbm9yX2hhc2gpKTsKKwlkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHICJJbiBodHJlZV9maWxsX3RyZWUsIHN0YXJ0IGhhc2g6ICV4OiV4XG4iLCAKKwkJICAgICAgIHN0YXJ0X2hhc2gsIHN0YXJ0X21pbm9yX2hhc2gpKTsKIAlkaXIgPSBkaXJfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIShFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKSB7CiAJCWhpbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOwpAQCAtNjQ4LDcgKzY0OSw3IEBACiAJfQogCWhpbmZvLmhhc2ggPSBzdGFydF9oYXNoOwogCWhpbmZvLm1pbm9yX2hhc2ggPSAwOwotCWZyYW1lID0gZHhfcHJvYmUoTlVMTCwgZGlyX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlmcmFtZSA9IGR4X3Byb2JlKE5VTEwsIGRpciwgJmhpbmZvLCBmcmFtZXMsICZlcnIpOwogCWlmICghZnJhbWUpCiAJCXJldHVybiBlcnI7CiAKQEAgLTY5NCw4ICs2OTUsOCBAQAogCQkJYnJlYWs7CiAJfQogCWR4X3JlbGVhc2UoZnJhbWVzKTsKLQlkeHRyYWNlKHByaW50aygiRmlsbCB0cmVlOiByZXR1cm5lZCAlZCBlbnRyaWVzLCBuZXh0IGhhc2g6ICV4XG4iLAotCQkgICAgICAgY291bnQsICpuZXh0X2hhc2gpKTsKKwlkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHICJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsICIKKwkJICAgICAgICJuZXh0IGhhc2g6ICV4XG4iLCBjb3VudCwgKm5leHRfaGFzaCkpOwogCXJldHVybiBjb3VudDsKIGVycm91dDoKIAlkeF9yZWxlYXNlKGZyYW1lcyk7CkBAIC04MDIsMTcgKzgwMywxNyBAQAogLyoKICAqIFJldHVybnMgMCBpZiBub3QgZm91bmQsIC0xIG9uIGZhaWx1cmUsIGFuZCAxIG9uIHN1Y2Nlc3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgc2VhcmNoX2RpcmJsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLAorc3RhdGljIGlubGluZSBpbnQgc2VhcmNoX2RpcmJsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsCiAJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqIHJlc19kaXIpCiB7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKIAljaGFyICogZGxpbWl0OwogCWludCBkZV9sZW47Ci0JY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJY29uc3QgY2hhciAqbmFtZSA9IGRfbmFtZS0+bmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRfbmFtZS0+bGVuOwogCiAJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAlkbGltaXQgPSBiaC0+Yl9kYXRhICsgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTg1MSwxMiArODUyLDEzIEBACiAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyX2hlYWQgaGFzIC0+Yl9jb3VudCBlbGV2YXRlZC4gIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQKICAqIHRvIGJyZWxzZSgpIGl0IHdoZW4gYXBwcm9wcmlhdGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQ0X2ZpbmRfZW50cnkgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQ0X2ZpbmRfZW50cnkgKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLAogCQkJCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKiByZXNfZGlyKQogewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKnJldCA9IE5VTEw7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqcmV0ID0gTlVMTDsKIAlleHQ0X2xibGtfdCBzdGFydCwgYmxvY2ssIGI7CiAJaW50IHJhX21heCA9IDA7CQkvKiBOdW1iZXIgb2YgYmgncyBpbiB0aGUgcmVhZGFoZWFkCiAJCQkJICAgYnVmZmVyLCBiaF91c2VbXSAqLwpAQCAtODY1LDE2ICs4NjcsMTUgQEAKIAlpbnQgbnVtID0gMDsKIAlleHQ0X2xibGtfdCAgbmJsb2NrczsKIAlpbnQgaSwgZXJyOwotCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKIAlpbnQgbmFtZWxlbjsKIAogCSpyZXNfZGlyID0gTlVMTDsKIAlzYiA9IGRpci0+aV9zYjsKLQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCW5hbWVsZW4gPSBkX25hbWUtPmxlbjsKIAlpZiAobmFtZWxlbiA+IEVYVDRfTkFNRV9MRU4pCiAJCXJldHVybiBOVUxMOwogCWlmIChpc19keChkaXIpKSB7Ci0JCWJoID0gZXh0NF9keF9maW5kX2VudHJ5KGRlbnRyeSwgcmVzX2RpciwgJmVycik7CisJCWJoID0gZXh0NF9keF9maW5kX2VudHJ5KGRpciwgZF9uYW1lLCByZXNfZGlyLCAmZXJyKTsKIAkJLyoKIAkJICogT24gc3VjY2Vzcywgb3IgaWYgdGhlIGVycm9yIHdhcyBmaWxlIG5vdCBmb3VuZCwKIAkJICogcmV0dXJuLiAgT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gZG9pbmcgYSBzZWFyY2ggdGhlCkBAIC04ODIsNyArODgzLDggQEAKIAkJICovCiAJCWlmIChiaCB8fCAoZXJyICE9IEVSUl9CQURfRFhfRElSKSkKIAkJCXJldHVybiBiaDsKLQkJZHh0cmFjZShwcmludGsoImV4dDRfZmluZF9lbnRyeTogZHggZmFpbGVkLCBmYWxsaW5nIGJhY2tcbiIpKTsKKwkJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiZXh0NF9maW5kX2VudHJ5OiBkeCBmYWlsZWQsICIKKwkJCSAgICAgICAiZmFsbGluZyBiYWNrXG4iKSk7CiAJfQogCW5ibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7CiAJc3RhcnQgPSBFWFQ0X0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwOwpAQCAtOTI2LDcgKzkyOCw3IEBACiAJCQlicmVsc2UoYmgpOwogCQkJZ290byBuZXh0OwogCQl9Ci0JCWkgPSBzZWFyY2hfZGlyYmxvY2soYmgsIGRpciwgZGVudHJ5LAorCQlpID0gc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIGRfbmFtZSwKIAkJCSAgICBibG9jayA8PCBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYiksIHJlc19kaXIpOwogCQlpZiAoaSA9PSAxKSB7CiAJCQlFWFQ0X0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gYmxvY2s7CkBAIC05NTYsMTEgKzk1OCwxMSBAQAogY2xlYW51cF9hbmRfZXhpdDoKIAkvKiBDbGVhbiB1cCB0aGUgcmVhZC1haGVhZCBibG9ja3MgKi8KIAlmb3IgKDsgcmFfcHRyIDwgcmFfbWF4OyByYV9wdHIrKykKLQkJYnJlbHNlIChiaF91c2VbcmFfcHRyXSk7CisJCWJyZWxzZShiaF91c2VbcmFfcHRyXSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDRfZHhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9keF9maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLAogCQkgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipyZXNfZGlyLCBpbnQgKmVycikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKQEAgLTk3MSwxNCArOTczLDEzIEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlleHQ0X2xibGtfdCBibG9jazsKIAlpbnQgcmV0dmFsOwotCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCWNvbnN0IHU4ICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKLQlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJaW50IG5hbWVsZW4gPSBkX25hbWUtPmxlbjsKKwljb25zdCB1OCAqbmFtZSA9IGRfbmFtZS0+bmFtZTsKIAogCXNiID0gZGlyLT5pX3NiOwogCS8qIE5GUyBtYXkgbG9vayB1cCAiLi4iIC0gbG9vayBhdCBkeF9yb290IGRpcmVjdG9yeSBibG9jayAqLwogCWlmIChuYW1lbGVuID4gMiB8fCBuYW1lWzBdICE9ICcuJ3x8KG5hbWVbMV0gIT0gJy4nICYmIG5hbWVbMV0gIT0gJ1wwJykpewotCQlpZiAoIShmcmFtZSA9IGR4X3Byb2JlKGRlbnRyeSwgTlVMTCwgJmhpbmZvLCBmcmFtZXMsIGVycikpKQorCQlpZiAoIShmcmFtZSA9IGR4X3Byb2JlKGRfbmFtZSwgZGlyLCAmaGluZm8sIGZyYW1lcywgZXJyKSkpCiAJCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgewogCQlmcmFtZSA9IGZyYW1lczsKQEAgLTEwMTAsNyArMTAxMSw3IEBACiAJCQkJcmV0dXJuIGJoOwogCQkJfQogCQl9Ci0JCWJyZWxzZSAoYmgpOworCQlicmVsc2UoYmgpOwogCQkvKiBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHRvIHNlYXJjaCAqLwogCQlyZXR2YWwgPSBleHQ0X2h0cmVlX25leHRfYmxvY2soZGlyLCBoYXNoLCBmcmFtZSwKIAkJCQkJICAgICAgIGZyYW1lcywgTlVMTCk7CkBAIC0xMDI1LDI1ICsxMDI2LDI1IEBACiAKIAkqZXJyID0gLUVOT0VOVDsKIGVycm91dDoKLQlkeHRyYWNlKHByaW50aygiJXMgbm90IGZvdW5kXG4iLCBuYW1lKSk7CisJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiJXMgbm90IGZvdW5kXG4iLCBuYW1lKSk7CiAJZHhfcmVsZWFzZSAoZnJhbWVzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4dDRfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gRVhUNF9OQU1FX0xFTikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKLQliaCA9IGV4dDRfZmluZF9lbnRyeShkZW50cnksICZkZSk7CisJYmggPSBleHQ0X2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZkZSk7CiAJaW5vZGUgPSBOVUxMOwogCWlmIChiaCkgewogCQl1bnNpZ25lZCBsb25nIGlubyA9IGxlMzJfdG9fY3B1KGRlLT5pbm9kZSk7Ci0JCWJyZWxzZSAoYmgpOworCQlicmVsc2UoYmgpOwogCQlpZiAoIWV4dDRfdmFsaWRfaW51bShkaXItPmlfc2IsIGlubykpIHsKIAkJCWV4dDRfZXJyb3IoZGlyLT5pX3NiLCAiZXh0NF9sb29rdXAiLAogCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOwpAQCAtMTA2MiwxNSArMTA2MywxNCBAQAogCXVuc2lnbmVkIGxvbmcgaW5vOwogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgZG90ZG90OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBkb3Rkb3QgPSB7CisJCS5uYW1lID0gIi4uIiwKKwkJLmxlbiA9IDIsCisJfTsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlkb3Rkb3QuZF9uYW1lLm5hbWUgPSAiLi4iOwotCWRvdGRvdC5kX25hbWUubGVuID0gMjsKLQlkb3Rkb3QuZF9wYXJlbnQgPSBjaGlsZDsgLyogY29uZnVzaW5nLCBpc24ndCBpdCEgKi8KLQotCWJoID0gZXh0NF9maW5kX2VudHJ5KCZkb3Rkb3QsICZkZSk7CisJYmggPSBleHQ0X2ZpbmRfZW50cnkoY2hpbGQtPmRfaW5vZGUsICZkb3Rkb3QsICZkZSk7CiAJaW5vZGUgPSBOVUxMOwogCWlmICghYmgpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwpAQCAtMTIwMSwxMCArMTIwMSwxMCBAQAogCiAJLyogY3JlYXRlIG1hcCBpbiB0aGUgZW5kIG9mIGRhdGEyIGJsb2NrICovCiAJbWFwID0gKHN0cnVjdCBkeF9tYXBfZW50cnkgKikgKGRhdGEyICsgYmxvY2tzaXplKTsKLQljb3VudCA9IGR4X21ha2VfbWFwICgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZGF0YTEsCisJY291bnQgPSBkeF9tYWtlX21hcCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZGF0YTEsCiAJCQkgICAgIGJsb2Nrc2l6ZSwgaGluZm8sIG1hcCk7CiAJbWFwIC09IGNvdW50OwotCWR4X3NvcnRfbWFwIChtYXAsIGNvdW50KTsKKwlkeF9zb3J0X21hcChtYXAsIGNvdW50KTsKIAkvKiBTcGxpdCB0aGUgZXhpc3RpbmcgYmxvY2sgaW4gdGhlIG1pZGRsZSwgc2l6ZS13aXNlICovCiAJc2l6ZSA9IDA7CiAJbW92ZSA9IDA7CkBAIC0xMjI1LDcgKzEyMjUsNyBAQAogCiAJLyogRmFuY3kgZGFuY2UgdG8gc3RheSB3aXRoaW4gdHdvIGJ1ZmZlcnMgKi8KIAlkZTIgPSBkeF9tb3ZlX2RpcmVudHMoZGF0YTEsIGRhdGEyLCBtYXAgKyBzcGxpdCwgY291bnQgLSBzcGxpdCk7Ci0JZGUgPSBkeF9wYWNrX2RpcmVudHMoZGF0YTEsYmxvY2tzaXplKTsKKwlkZSA9IGR4X3BhY2tfZGlyZW50cyhkYXRhMSwgYmxvY2tzaXplKTsKIAlkZS0+cmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOwogCWRlMi0+cmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGRhdGEyICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUyKTsKIAlkeHRyYWNlKGR4X3Nob3dfbGVhZiAoaGluZm8sIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBkYXRhMSwgYmxvY2tzaXplLCAxKSk7CkBAIC0xMjM3LDE1ICsxMjM3LDE1IEBACiAJCXN3YXAoKmJoLCBiaDIpOwogCQlkZSA9IGRlMjsKIAl9Ci0JZHhfaW5zZXJ0X2Jsb2NrIChmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEgKGhhbmRsZSwgYmgyKTsKKwlkeF9pbnNlcnRfYmxvY2soZnJhbWUsIGhhc2gyICsgY29udGludWVkLCBuZXdibG9jayk7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGpvdXJuYWxfZXJyb3I7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIChoYW5kbGUsIGZyYW1lLT5iaCk7CisJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWUtPmJoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGpvdXJuYWxfZXJyb3I7Ci0JYnJlbHNlIChiaDIpOwotCWR4dHJhY2UoZHhfc2hvd19pbmRleCAoImZyYW1lIiwgZnJhbWUtPmVudHJpZXMpKTsKKwlicmVsc2UoYmgyKTsKKwlkeHRyYWNlKGR4X3Nob3dfaW5kZXgoImZyYW1lIiwgZnJhbWUtPmVudHJpZXMpKTsKIAlyZXR1cm4gZGU7CiAKIGpvdXJuYWxfZXJyb3I6CkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogICovCiBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzdHJ1Y3QgaW5vZGUJKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJY29uc3QgY2hhcgkqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CkBAIC0xMjg4LDExICsxMjg4LDExIEBACiAJCXdoaWxlICgoY2hhciAqKSBkZSA8PSB0b3ApIHsKIAkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoImV4dDRfYWRkX2VudHJ5IiwgZGlyLCBkZSwKIAkJCQkJCSAgYmgsIG9mZnNldCkpIHsKLQkJCQlicmVsc2UgKGJoKTsKKwkJCQlicmVsc2UoYmgpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQotCQkJaWYgKGV4dDRfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgewotCQkJCWJyZWxzZSAoYmgpOworCQkJaWYgKGV4dDRfbWF0Y2gobmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkJYnJlbHNlKGJoKTsKIAkJCQlyZXR1cm4gLUVFWElTVDsKIAkJCX0KIAkJCW5sZW4gPSBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbik7CkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCX0gZWxzZQogCQlkZS0+aW5vZGUgPSAwOwogCWRlLT5uYW1lX2xlbiA9IG5hbWVsZW47Ci0JbWVtY3B5IChkZS0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJbWVtY3B5KGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKIAkvKgogCSAqIFhYWCBzaG91bGRuJ3QgdXBkYXRlIGFueSB0aW1lcyB1bnRpbCBzdWNjZXNzZnVsCiAJICogY29tcGxldGlvbiBvZiBzeXNjYWxsLCBidXQgdG9vIG1hbnkgY2FsbGVycyBkZXBlbmQKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAJc3RydWN0IGZha2VfZGlyZW50ICpmZGU7CiAKIAlibG9ja3NpemUgPSAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQlkeHRyYWNlKHByaW50aygiQ3JlYXRpbmcgaW5kZXhcbiIpKTsKKwlkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHICJDcmVhdGluZyBpbmRleFxuIikpOwogCXJldHZhbCA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOwogCWlmIChyZXR2YWwpIHsKIAkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCByZXR2YWwpOwpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIAl9CiAJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOwogCi0JYmgyID0gZXh0NF9hcHBlbmQgKGhhbmRsZSwgZGlyLCAmYmxvY2ssICZyZXR2YWwpOworCWJoMiA9IGV4dDRfYXBwZW5kKGhhbmRsZSwgZGlyLCAmYmxvY2ssICZyZXR2YWwpOwogCWlmICghKGJoMikpIHsKIAkJYnJlbHNlKGJoKTsKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTE0MTIsOSArMTQxMiw5IEBACiAJcm9vdC0+aW5mby5pbmZvX2xlbmd0aCA9IHNpemVvZihyb290LT5pbmZvKTsKIAlyb290LT5pbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOwogCWVudHJpZXMgPSByb290LT5lbnRyaWVzOwotCWR4X3NldF9ibG9jayAoZW50cmllcywgMSk7Ci0JZHhfc2V0X2NvdW50IChlbnRyaWVzLCAxKTsKLQlkeF9zZXRfbGltaXQgKGVudHJpZXMsIGR4X3Jvb3RfbGltaXQoZGlyLCBzaXplb2Yocm9vdC0+aW5mbykpKTsKKwlkeF9zZXRfYmxvY2soZW50cmllcywgMSk7CisJZHhfc2V0X2NvdW50KGVudHJpZXMsIDEpOworCWR4X3NldF9saW1pdChlbnRyaWVzLCBkeF9yb290X2xpbWl0KGRpciwgc2l6ZW9mKHJvb3QtPmluZm8pKSk7CiAKIAkvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqLwogCWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOwpAQCAtMTQ0MywxNCArMTQ0MywxNCBAQAogICogbWF5IG5vdCBzbGVlcCBiZXR3ZWVuIGNhbGxpbmcgdGhpcyBhbmQgcHV0dGluZyBzb21ldGhpbmcgaW50bwogICogdGhlIGVudHJ5LCBhcyBzb21lb25lIGVsc2UgbWlnaHQgaGF2ZSB1c2VkIGl0IHdoaWxlIHlvdSBzbGVwdC4KICAqLwotc3RhdGljIGludCBleHQ0X2FkZF9lbnRyeSAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCXN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGV4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlpbnQJcmV0dmFsOwogCWludAlkeF9mYWxsYmFjaz0wOwogCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKQEAgLTE1MDAsMTMgKzE1MDAsMTMgQEAKIAlzdHJ1Y3QgZHhfZnJhbWUgZnJhbWVzWzJdLCAqZnJhbWU7CiAJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCAqYXQ7CiAJc3RydWN0IGR4X2hhc2hfaW5mbyBoaW5mbzsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOwogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTsKIAlpbnQgZXJyOwogCi0JZnJhbWUgPSBkeF9wcm9iZShkZW50cnksIE5VTEwsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlmcmFtZSA9IGR4X3Byb2JlKCZkZW50cnktPmRfbmFtZSwgZGlyLCAmaGluZm8sIGZyYW1lcywgJmVycik7CiAJaWYgKCFmcmFtZSkKIAkJcmV0dXJuIGVycjsKIAllbnRyaWVzID0gZnJhbWUtPmVudHJpZXM7CkBAIC0xNTI3LDcgKzE1MjcsNyBAQAogCX0KIAogCS8qIEJsb2NrIGZ1bGwsIHNob3VsZCBjb21wcmVzcyBidXQgZm9yIG5vdyBqdXN0IHNwbGl0ICovCi0JZHh0cmFjZShwcmludGsoInVzaW5nICV1IG9mICV1IG5vZGUgZW50cmllc1xuIiwKKwlkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHICJ1c2luZyAldSBvZiAldSBub2RlIGVudHJpZXNcbiIsCiAJCSAgICAgICBkeF9nZXRfY291bnQoZW50cmllcyksIGR4X2dldF9saW1pdChlbnRyaWVzKSkpOwogCS8qIE5lZWQgdG8gc3BsaXQgaW5kZXg/ICovCiAJaWYgKGR4X2dldF9jb3VudChlbnRyaWVzKSA9PSBkeF9nZXRfbGltaXQoZW50cmllcykpIHsKQEAgLTE1NTksNyArMTU1OSw4IEBACiAJCWlmIChsZXZlbHMpIHsKIAkJCXVuc2lnbmVkIGljb3VudDEgPSBpY291bnQvMiwgaWNvdW50MiA9IGljb3VudCAtIGljb3VudDE7CiAJCQl1bnNpZ25lZCBoYXNoMiA9IGR4X2dldF9oYXNoKGVudHJpZXMgKyBpY291bnQxKTsKLQkJCWR4dHJhY2UocHJpbnRrKCJTcGxpdCBpbmRleCAlaS8laVxuIiwgaWNvdW50MSwgaWNvdW50MikpOworCQkJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiU3BsaXQgaW5kZXggJWkvJWlcbiIsCisJCQkJICAgICAgIGljb3VudDEsIGljb3VudDIpKTsKIAogCQkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsgLyogaW5kZXggcm9vdCAqLwogCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLApAQCAtMTU2NywxMSArMTU2OCwxMSBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAKLQkJCW1lbWNweSAoKGNoYXIgKikgZW50cmllczIsIChjaGFyICopIChlbnRyaWVzICsgaWNvdW50MSksCi0JCQkJaWNvdW50MiAqIHNpemVvZihzdHJ1Y3QgZHhfZW50cnkpKTsKLQkJCWR4X3NldF9jb3VudCAoZW50cmllcywgaWNvdW50MSk7Ci0JCQlkeF9zZXRfY291bnQgKGVudHJpZXMyLCBpY291bnQyKTsKLQkJCWR4X3NldF9saW1pdCAoZW50cmllczIsIGR4X25vZGVfbGltaXQoZGlyKSk7CisJCQltZW1jcHkoKGNoYXIgKikgZW50cmllczIsIChjaGFyICopIChlbnRyaWVzICsgaWNvdW50MSksCisJCQkgICAgICAgaWNvdW50MiAqIHNpemVvZihzdHJ1Y3QgZHhfZW50cnkpKTsKKwkJCWR4X3NldF9jb3VudChlbnRyaWVzLCBpY291bnQxKTsKKwkJCWR4X3NldF9jb3VudChlbnRyaWVzMiwgaWNvdW50Mik7CisJCQlkeF9zZXRfbGltaXQoZW50cmllczIsIGR4X25vZGVfbGltaXQoZGlyKSk7CiAKIAkJCS8qIFdoaWNoIGluZGV4IGJsb2NrIGdldHMgdGhlIG5ldyBlbnRyeT8gKi8KIAkJCWlmIChhdCAtIGVudHJpZXMgPj0gaWNvdW50MSkgewpAQCAtMTU3OSwxNiArMTU4MCwxNyBAQAogCQkJCWZyYW1lLT5lbnRyaWVzID0gZW50cmllcyA9IGVudHJpZXMyOwogCQkJCXN3YXAoZnJhbWUtPmJoLCBiaDIpOwogCQkJfQotCQkJZHhfaW5zZXJ0X2Jsb2NrIChmcmFtZXMgKyAwLCBoYXNoMiwgbmV3YmxvY2spOwotCQkJZHh0cmFjZShkeF9zaG93X2luZGV4ICgibm9kZSIsIGZyYW1lc1sxXS5lbnRyaWVzKSk7Ci0JCQlkeHRyYWNlKGR4X3Nob3dfaW5kZXggKCJub2RlIiwKKwkJCWR4X2luc2VydF9ibG9jayhmcmFtZXMgKyAwLCBoYXNoMiwgbmV3YmxvY2spOworCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwgZnJhbWVzWzFdLmVudHJpZXMpKTsKKwkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCgibm9kZSIsCiAJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKIAkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJCWJyZWxzZSAoYmgyKTsKIAkJfSBlbHNlIHsKLQkJCWR4dHJhY2UocHJpbnRrKCJDcmVhdGluZyBzZWNvbmQgbGV2ZWwgaW5kZXguLi5cbiIpKTsKKwkJCWR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIkNyZWF0aW5nIHNlY29uZCBsZXZlbCBpbmRleC4uLlxuIikpOwogCQkJbWVtY3B5KChjaGFyICopIGVudHJpZXMyLCAoY2hhciAqKSBlbnRyaWVzLAogCQkJICAgICAgIGljb3VudCAqIHNpemVvZihzdHJ1Y3QgZHhfZW50cnkpKTsKIAkJCWR4X3NldF9saW1pdChlbnRyaWVzMiwgZHhfbm9kZV9saW1pdChkaXIpKTsKQEAgLTE2MzAsMTIgKzE2MzIsMTIgQEAKICAqIGV4dDRfZGVsZXRlX2VudHJ5IGRlbGV0ZXMgYSBkaXJlY3RvcnkgZW50cnkgYnkgbWVyZ2luZyBpdCB3aXRoIHRoZQogICogcHJldmlvdXMgZW50cnkKICAqLwotc3RhdGljIGludCBleHQ0X2RlbGV0ZV9lbnRyeSAoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqIGRpciwKLQkJCSAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGVfZGVsLAotCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGVfZGVsLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGUsICogcGRlOworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgKnBkZTsKIAlpbnQgaTsKIAogCWkgPSAwOwpAQCAtMTcxNiwxMSArMTcxOCwxMSBAQAogICogSWYgdGhlIGNyZWF0ZSBzdWNjZWVkcywgd2UgZmlsbCBpbiB0aGUgaW5vZGUgaW5mb3JtYXRpb24KICAqIHdpdGggZF9pbnN0YW50aWF0ZSgpLgogICovCi1zdGF0aWMgaW50IGV4dDRfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLAotCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBpbnQgZXh0NF9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAloYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVyciwgcmV0cmllcyA9IDA7CiAKIHJldHJ5OgpAQCAtMTc0Nyw4ICsxNzQ5LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGV4dDRfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJaW50IG1vZGUsIGRldl90IHJkZXYpCitzdGF0aWMgaW50IGV4dDRfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgaW50IG1vZGUsIGRldl90IHJkZXYpCiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpAQCAtMTc2NywxMSArMTc2OSwxMSBAQAogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCWhhbmRsZS0+aF9zeW5jID0gMTsKIAotCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBtb2RlKTsKKwlpbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZGlyLCBtb2RlKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1hBVFRSCiAJCWlub2RlLT5pX29wID0gJmV4dDRfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOwogI2VuZGlmCiAJCWVyciA9IGV4dDRfYWRkX25vbmRpcihoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOwpAQCAtMTc4MiwxMiArMTc4NCwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQorc3RhdGljIGludCBleHQ0X21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogewogCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IGlub2RlICogaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrOwotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9ibG9jazsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CiAJaW50IGVyciwgcmV0cmllcyA9IDA7CiAKIAlpZiAoRVhUNF9ESVJfTElOS19NQVgoZGlyKSkKQEAgLTE4MDMsNyArMTgwNSw3IEBACiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKIAkJaGFuZGxlLT5oX3N5bmMgPSAxOwogCi0JaW5vZGUgPSBleHQ0X25ld19pbm9kZSAoaGFuZGxlLCBkaXIsIFNfSUZESVIgfCBtb2RlKTsKKwlpbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZGlyLCBTX0lGRElSIHwgbW9kZSk7CiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJaWYgKElTX0VSUihpbm9kZSkpCiAJCWdvdG8gb3V0X3N0b3A7CkBAIC0xODExLDcgKzE4MTMsNyBAQAogCWlub2RlLT5pX29wID0gJmV4dDRfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJmV4dDRfZGlyX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfc2l6ZSA9IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JZGlyX2Jsb2NrID0gZXh0NF9icmVhZCAoaGFuZGxlLCBpbm9kZSwgMCwgMSwgJmVycik7CisJZGlyX2Jsb2NrID0gZXh0NF9icmVhZChoYW5kbGUsIGlub2RlLCAwLCAxLCAmZXJyKTsKIAlpZiAoIWRpcl9ibG9jaykKIAkJZ290byBvdXRfY2xlYXJfaW5vZGU7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImdldF93cml0ZV9hY2Nlc3MiKTsKQEAgLTE4MjAsMjYgKzE4MjIsMjYgQEAKIAlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOwogCWRlLT5uYW1lX2xlbiA9IDE7CiAJZGUtPnJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpOwotCXN0cmNweSAoZGUtPm5hbWUsICIuIik7CisJc3RyY3B5KGRlLT5uYW1lLCAiLiIpOwogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CiAJZGUgPSBleHQ0X25leHRfZW50cnkoZGUpOwogCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGRpci0+aV9pbm8pOwogCWRlLT5yZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KIAkJCQkJCUVYVDRfRElSX1JFQ19MRU4oMSkpOwogCWRlLT5uYW1lX2xlbiA9IDI7Ci0Jc3RyY3B5IChkZS0+bmFtZSwgIi4uIik7CisJc3RyY3B5KGRlLT5uYW1lLCAiLi4iKTsKIAlleHQ0X3NldF9kZV90eXBlKGRpci0+aV9zYiwgZGUsIFNfSUZESVIpOwogCWlub2RlLT5pX25saW5rID0gMjsKIAlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKIAlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmxvY2spOwotCWJyZWxzZSAoZGlyX2Jsb2NrKTsKKwlicmVsc2UoZGlyX2Jsb2NrKTsKIAlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7Ci0JZXJyID0gZXh0NF9hZGRfZW50cnkgKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CisJZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKIAlpZiAoZXJyKSB7CiBvdXRfY2xlYXJfaW5vZGU6CiAJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlpcHV0IChpbm9kZSk7CisJCWlwdXQoaW5vZGUpOwogCQlnb3RvIG91dF9zdG9wOwogCX0KIAlleHQ0X2luY19jb3VudChoYW5kbGUsIGRpcik7CkBAIC0xODU2LDE3ICsxODU4LDE3IEBACiAvKgogICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCiAgKi8KLXN0YXRpYyBpbnQgZW1wdHlfZGlyIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3N0YXRpYyBpbnQgZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0Jc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZSwgKiBkZTE7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsICpkZTE7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlpbnQgZXJyID0gMDsKIAogCXNiID0gaW5vZGUtPmlfc2I7CiAJaWYgKGlub2RlLT5pX3NpemUgPCBFWFQ0X0RJUl9SRUNfTEVOKDEpICsgRVhUNF9ESVJfUkVDX0xFTigyKSB8fAotCSAgICAhKGJoID0gZXh0NF9icmVhZCAoTlVMTCwgaW5vZGUsIDAsIDAsICZlcnIpKSkgeworCSAgICAhKGJoID0gZXh0NF9icmVhZChOVUxMLCBpbm9kZSwgMCwgMCwgJmVycikpKSB7CiAJCWlmIChlcnIpCiAJCQlleHQ0X2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKIAkJCQkgICAiZXJyb3IgJWQgcmVhZGluZyBkaXJlY3RvcnkgIyVsdSBvZmZzZXQgMCIsCkBAIC0xODgxLDIzICsxODgzLDIzIEBACiAJZGUxID0gZXh0NF9uZXh0X2VudHJ5KGRlKTsKIAlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8gfHwKIAkJCSFsZTMyX3RvX2NwdShkZTEtPmlub2RlKSB8fAotCQkJc3RyY21wICgiLiIsIGRlLT5uYW1lKSB8fAotCQkJc3RyY21wICgiLi4iLCBkZTEtPm5hbWUpKSB7Ci0JCWV4dDRfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAotCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGAuJyBvciBgLi4nIiwKLQkJCSAgICAgIGlub2RlLT5pX2lubyk7Ci0JCWJyZWxzZSAoYmgpOworCQkJc3RyY21wKCIuIiwgZGUtPm5hbWUpIHx8CisJCQlzdHJjbXAoIi4uIiwgZGUxLT5uYW1lKSkgeworCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAorCQkJICAgICAiYmFkIGRpcmVjdG9yeSAoZGlyICMlbHUpIC0gbm8gYC4nIG9yIGAuLiciLAorCQkJICAgICBpbm9kZS0+aV9pbm8pOworCQlicmVsc2UoYmgpOwogCQlyZXR1cm4gMTsKIAl9CiAJb2Zmc2V0ID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0+cmVjX2xlbikgKwogCQkgZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZTEtPnJlY19sZW4pOwogCWRlID0gZXh0NF9uZXh0X2VudHJ5KGRlMSk7Ci0Jd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUgKSB7CisJd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUpIHsKIAkJaWYgKCFiaCB8fAogCQkJKHZvaWQgKikgZGUgPj0gKHZvaWQgKikgKGJoLT5iX2RhdGErc2ItPnNfYmxvY2tzaXplKSkgewogCQkJZXJyID0gMDsKLQkJCWJyZWxzZSAoYmgpOwotCQkJYmggPSBleHQ0X2JyZWFkIChOVUxMLCBpbm9kZSwKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IGV4dDRfYnJlYWQoTlVMTCwgaW5vZGUsCiAJCQkJb2Zmc2V0ID4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKSwgMCwgJmVycik7CiAJCQlpZiAoIWJoKSB7CiAJCQkJaWYgKGVycikKQEAgLTE5MTcsMTMgKzE5MTksMTMgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpKSB7Ci0JCQlicmVsc2UgKGJoKTsKKwkJCWJyZWxzZShiaCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlvZmZzZXQgKz0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0+cmVjX2xlbik7CiAJCWRlID0gZXh0NF9uZXh0X2VudHJ5KGRlKTsKIAl9Ci0JYnJlbHNlIChiaCk7CisJYnJlbHNlKGJoKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTk1NCw4ICsxOTU2LDggQEAKIAkgKiAtPmlfbmxpbmsuIEZvciwgc2F5IGl0LCBjaGFyYWN0ZXIgZGV2aWNlLiBOb3QgYSByZWd1bGFyIGZpbGUsCiAJICogbm90IGEgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rIGFuZCAtPmlfbmxpbmsgPiAwLgogCSAqLwotCUpfQVNTRVJUICgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8Ci0JCVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHx8IGlub2RlLT5pX25saW5rID09IDApOworCUpfQVNTRVJUKChTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKKwkJICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB8fCBpbm9kZS0+aV9ubGluayA9PSAwKTsKIAogCUJVRkZFUl9UUkFDRShFWFQ0X1NCKHNiKS0+c19zYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwpAQCAtMjA2OSwxMiArMjA3MSwxMiBAQAogCWdvdG8gb3V0X2VycjsKIH0KIAotc3RhdGljIGludCBleHQ0X3JtZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgZXh0NF9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IGlub2RlICogaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0Jc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCWhhbmRsZV90ICpoYW5kbGU7CiAKIAkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28gaW4KQEAgLTIwODUsNyArMjA4Nyw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlyZXR2YWwgPSAtRU5PRU5UOwotCWJoID0gZXh0NF9maW5kX2VudHJ5IChkZW50cnksICZkZSk7CisJYmggPSBleHQ0X2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZkZSk7CiAJaWYgKCFiaCkKIAkJZ290byBlbmRfcm1kaXI7CiAKQEAgLTIwOTksMTYgKzIxMDEsMTYgQEAKIAkJZ290byBlbmRfcm1kaXI7CiAKIAlyZXR2YWwgPSAtRU5PVEVNUFRZOwotCWlmICghZW1wdHlfZGlyIChpbm9kZSkpCisJaWYgKCFlbXB0eV9kaXIoaW5vZGUpKQogCQlnb3RvIGVuZF9ybWRpcjsKIAogCXJldHZhbCA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZW5kX3JtZGlyOwogCWlmICghRVhUNF9ESVJfTElOS19FTVBUWShpbm9kZSkpCi0JCWV4dDRfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQ0X3JtZGlyIiwKLQkJCSAgICAgICJlbXB0eSBkaXJlY3RvcnkgaGFzIHRvbyBtYW55IGxpbmtzICglZCkiLAotCQkJICAgICAgaW5vZGUtPmlfbmxpbmspOworCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsICJleHQ0X3JtZGlyIiwKKwkJCSAgICAgImVtcHR5IGRpcmVjdG9yeSBoYXMgdG9vIG1hbnkgbGlua3MgKCVkKSIsCisJCQkgICAgIGlub2RlLT5pX25saW5rKTsKIAlpbm9kZS0+aV92ZXJzaW9uKys7CiAJY2xlYXJfbmxpbmsoaW5vZGUpOwogCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZXQgaV9kaXNrc2l6ZTogdGhlIGZhY3QgdGhhdCBpX25saW5rIGlzCkBAIC0yMTI0LDE2ICsyMTI2LDE2IEBACiAKIGVuZF9ybWRpcjoKIAlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCWJyZWxzZSAoYmgpOworCWJyZWxzZShiaCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBleHQ0X3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgZXh0NF91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCiAJLyogSW5pdGlhbGl6ZSBxdW90YXMgYmVmb3JlIHNvIHRoYXQgZXZlbnR1YWwgd3JpdGVzIGdvCkBAIC0yMTQ3LDcgKzIxNDksNyBAQAogCQloYW5kbGUtPmhfc3luYyA9IDE7CiAKIAlyZXR2YWwgPSAtRU5PRU5UOwotCWJoID0gZXh0NF9maW5kX2VudHJ5IChkZW50cnksICZkZSk7CisJYmggPSBleHQ0X2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZkZSk7CiAJaWYgKCFiaCkKIAkJZ290byBlbmRfdW5saW5rOwogCkBAIC0yMTU4LDkgKzIxNjAsOSBAQAogCQlnb3RvIGVuZF91bmxpbms7CiAKIAlpZiAoIWlub2RlLT5pX25saW5rKSB7Ci0JCWV4dDRfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQ0X3VubGluayIsCi0JCQkgICAgICAiRGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAoJWx1KSwgJWQiLAotCQkJICAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwgImV4dDRfdW5saW5rIiwKKwkJCSAgICAgIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKKwkJCSAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CiAJCWlub2RlLT5pX25saW5rID0gMTsKIAl9CiAJcmV0dmFsID0gZXh0NF9kZWxldGVfZW50cnkoaGFuZGxlLCBkaXIsIGRlLCBiaCk7CkBAIC0yMTc4LDE1ICsyMTgwLDE1IEBACiAKIGVuZF91bmxpbms6CiAJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQlicmVsc2UgKGJoKTsKKwlicmVsc2UoYmgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsCi0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCitzdGF0aWMgaW50IGV4dDRfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKIHsKIAloYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGwsIGVyciwgcmV0cmllcyA9IDA7CiAKIAlsID0gc3RybGVuKHN5bW5hbWUpKzE7CkBAIC0yMjAzLDEyICsyMjA1LDEyIEBACiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKIAkJaGFuZGxlLT5oX3N5bmMgPSAxOwogCi0JaW5vZGUgPSBleHQ0X25ld19pbm9kZSAoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPKTsKKwlpbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZGlyLCBTX0lGTE5LfFNfSVJXWFVHTyk7CiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJaWYgKElTX0VSUihpbm9kZSkpCiAJCWdvdG8gb3V0X3N0b3A7CiAKLQlpZiAobCA+IHNpemVvZiAoRVhUNF9JKGlub2RlKS0+aV9kYXRhKSkgeworCWlmIChsID4gc2l6ZW9mKEVYVDRfSShpbm9kZSktPmlfZGF0YSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJCWV4dDRfc2V0X2FvcHMoaW5vZGUpOwogCQkvKgpAQCAtMjIyMSwxNCArMjIyMywxNCBAQAogCQlpZiAoZXJyKSB7CiAJCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7Ci0JCQlpcHV0IChpbm9kZSk7CisJCQlpcHV0KGlub2RlKTsKIAkJCWdvdG8gb3V0X3N0b3A7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBjbGVhciB0aGUgZXh0ZW50IGZvcm1hdCBmb3IgZmFzdCBzeW1saW5rICovCiAJCUVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDRfRVhURU5UU19GTDsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJbWVtY3B5KChjaGFyKikmRVhUNF9JKGlub2RlKS0+aV9kYXRhLHN5bW5hbWUsbCk7CisJCW1lbWNweSgoY2hhciAqKSZFWFQ0X0koaW5vZGUpLT5pX2RhdGEsIHN5bW5hbWUsIGwpOwogCQlpbm9kZS0+aV9zaXplID0gbC0xOwogCX0KIAlFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKQEAgLTIyNDAsOCArMjI0Miw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBleHQ0X2xpbmsgKHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAotCQlzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgZXh0NF9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwpAQCAtMjI4NCwxMyArMjI4NiwxMyBAQAogICogQW55Ym9keSBjYW4gcmVuYW1lIGFueXRoaW5nIHdpdGggdGhpczogdGhlIHBlcm1pc3Npb24gY2hlY2tzIGFyZSBsZWZ0IHRvIHRoZQogICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLgogICovCi1zdGF0aWMgaW50IGV4dDRfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiBvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAotCQkJICAgc3RydWN0IGlub2RlICogbmV3X2RpcixzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQorc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3QgaW5vZGUgKiBvbGRfaW5vZGUsICogbmV3X2lub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIG9sZF9iaCwgKiBuZXdfYmgsICogZGlyX2JoOwotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogb2xkX2RlLCAqIG5ld19kZTsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCwgKm5ld19iaCwgKmRpcl9iaDsKKwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqb2xkX2RlLCAqbmV3X2RlOwogCWludCByZXR2YWw7CiAKIAlvbGRfYmggPSBuZXdfYmggPSBkaXJfYmggPSBOVUxMOwpAQCAtMjMwOCw3ICsyMzEwLDcgQEAKIAlpZiAoSVNfRElSU1lOQyhvbGRfZGlyKSB8fCBJU19ESVJTWU5DKG5ld19kaXIpKQogCQloYW5kbGUtPmhfc3luYyA9IDE7CiAKLQlvbGRfYmggPSBleHQ0X2ZpbmRfZW50cnkgKG9sZF9kZW50cnksICZvbGRfZGUpOworCW9sZF9iaCA9IGV4dDRfZmluZF9lbnRyeShvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLCAmb2xkX2RlKTsKIAkvKgogCSAqICBDaGVjayBmb3IgaW5vZGUgbnVtYmVyIGlzIF9ub3RfIGR1ZSB0byBwb3NzaWJsZSBJTyBlcnJvcnMuCiAJICogIFdlIG1pZ2h0IHJtZGlyIHRoZSBzb3VyY2UsIGtlZXAgaXQgYXMgcHdkIG9mIHNvbWUgcHJvY2VzcwpAQCAtMjMyMSwzMiArMjMyMywzMiBAQAogCQlnb3RvIGVuZF9yZW5hbWU7CiAKIAluZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwotCW5ld19iaCA9IGV4dDRfZmluZF9lbnRyeSAobmV3X2RlbnRyeSwgJm5ld19kZSk7CisJbmV3X2JoID0gZXh0NF9maW5kX2VudHJ5KG5ld19kaXIsICZuZXdfZGVudHJ5LT5kX25hbWUsICZuZXdfZGUpOwogCWlmIChuZXdfYmgpIHsKIAkJaWYgKCFuZXdfaW5vZGUpIHsKLQkJCWJyZWxzZSAobmV3X2JoKTsKKwkJCWJyZWxzZShuZXdfYmgpOwogCQkJbmV3X2JoID0gTlVMTDsKIAkJfQogCX0KIAlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJaWYgKG5ld19pbm9kZSkgewogCQkJcmV0dmFsID0gLUVOT1RFTVBUWTsKLQkJCWlmICghZW1wdHlfZGlyIChuZXdfaW5vZGUpKQorCQkJaWYgKCFlbXB0eV9kaXIobmV3X2lub2RlKSkKIAkJCQlnb3RvIGVuZF9yZW5hbWU7CiAJCX0KIAkJcmV0dmFsID0gLUVJTzsKLQkJZGlyX2JoID0gZXh0NF9icmVhZCAoaGFuZGxlLCBvbGRfaW5vZGUsIDAsIDAsICZyZXR2YWwpOworCQlkaXJfYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgb2xkX2lub2RlLCAwLCAwLCAmcmV0dmFsKTsKIAkJaWYgKCFkaXJfYmgpCiAJCQlnb3RvIGVuZF9yZW5hbWU7CiAJCWlmIChsZTMyX3RvX2NwdShQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSkgIT0gb2xkX2Rpci0+aV9pbm8pCiAJCQlnb3RvIGVuZF9yZW5hbWU7CiAJCXJldHZhbCA9IC1FTUxJTks7Ci0JCWlmICghbmV3X2lub2RlICYmIG5ld19kaXIhPW9sZF9kaXIgJiYKKwkJaWYgKCFuZXdfaW5vZGUgJiYgbmV3X2RpciAhPSBvbGRfZGlyICYmCiAJCQkJbmV3X2Rpci0+aV9ubGluayA+PSBFWFQ0X0xJTktfTUFYKQogCQkJZ290byBlbmRfcmVuYW1lOwogCX0KIAlpZiAoIW5ld19iaCkgewotCQlyZXR2YWwgPSBleHQ0X2FkZF9lbnRyeSAoaGFuZGxlLCBuZXdfZGVudHJ5LCBvbGRfaW5vZGUpOworCQlyZXR2YWwgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIG5ld19kZW50cnksIG9sZF9pbm9kZSk7CiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGVuZF9yZW5hbWU7CiAJfSBlbHNlIHsKQEAgLTIzODgsNyArMjM5MCw3IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoMjsKIAkJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKm9sZF9kZTI7CiAKLQkJb2xkX2JoMiA9IGV4dDRfZmluZF9lbnRyeShvbGRfZGVudHJ5LCAmb2xkX2RlMik7CisJCW9sZF9iaDIgPSBleHQ0X2ZpbmRfZW50cnkob2xkX2RpciwgJm9sZF9kZW50cnktPmRfbmFtZSwgJm9sZF9kZTIpOwogCQlpZiAob2xkX2JoMikgewogCQkJcmV0dmFsID0gZXh0NF9kZWxldGVfZW50cnkoaGFuZGxlLCBvbGRfZGlyLAogCQkJCQkJICAgb2xkX2RlMiwgb2xkX2JoMik7CkBAIC0yNDMzLDkgKzI0MzUsOSBAQAogCXJldHZhbCA9IDA7CiAKIGVuZF9yZW5hbWU6Ci0JYnJlbHNlIChkaXJfYmgpOwotCWJyZWxzZSAob2xkX2JoKTsKLQlicmVsc2UgKG5ld19iaCk7CisJYnJlbHNlKGRpcl9iaCk7CisJYnJlbHNlKG9sZF9iaCk7CisJYnJlbHNlKG5ld19iaCk7CiAJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjQ1NCw3ICsyNDU2LDcgQEAKIAkubWtub2QJCT0gZXh0NF9ta25vZCwKIAkucmVuYW1lCQk9IGV4dDRfcmVuYW1lLAogCS5zZXRhdHRyCT0gZXh0NF9zZXRhdHRyLAotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKIAkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAogCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IGV4dDRfbGlzdHhhdHRyLApAQCAtMjQ2NSw3ICsyNDY3LDcgQEAKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0NF9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnNldGF0dHIJPSBleHQ0X3NldGF0dHIsCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCiAJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCBiM2QzNTYwLi5iNmVjMTg0IDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTQxNiw4ICs0MTYsOCBAQAogCQkgICAgICAgIkVYVDQtZnM6IGV4dDRfYWRkX25ld19nZGI6IGFkZGluZyBncm91cCBibG9jayAlbHVcbiIsCiAJCSAgICAgICBnZGJfbnVtKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBwcmltYXJ5IHN1cGVyYmxvY2svR0RUIGNvcHkgZG9uJ3QgcmVzaXplLAorCS8qCisJICogSWYgd2UgYXJlIG5vdCB1c2luZyB0aGUgcHJpbWFyeSBzdXBlcmJsb2NrL0dEVCBjb3B5IGRvbid0IHJlc2l6ZSwKICAgICAgICAgICogYmVjYXVzZSB0aGUgdXNlciB0b29scyBoYXZlIG5vIHdheSBvZiBoYW5kbGluZyB0aGlzLiAgUHJvYmFibHkgYQogICAgICAgICAgKiBiYWQgdGltZSB0byBkbyBpdCBhbnl3YXlzLgogICAgICAgICAgKi8KQEAgLTg3MCwxMSArODcwLDEwIEBACiAJICogV2UgY2FuIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWJfYWxsb2MgYmFzZWQgb24gdGhlIG5ldyBncm91cAogCSAqIGRlc2NyaXB0b3IKIAkgKi8KLQlpZiAodGVzdF9vcHQoc2IsIE1CQUxMT0MpKSB7Ci0JCWVyciA9IGV4dDRfbWJfYWRkX21vcmVfZ3JvdXBpbmZvKHNiLCBpbnB1dC0+Z3JvdXAsIGdkcCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9CisJZXJyID0gZXh0NF9tYl9hZGRfbW9yZV9ncm91cGluZm8oc2IsIGlucHV0LT5ncm91cCwgZ2RwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfam91cm5hbDsKKwogCS8qCiAJICogTWFrZSB0aGUgbmV3IGJsb2NrcyBhbmQgaW5vZGVzIHZhbGlkIG5leHQuICBXZSBkbyB0aGlzIGJlZm9yZQogCSAqIGluY3JlYXNpbmcgdGhlIGdyb3VwIGNvdW50IHNvIHRoYXQgb25jZSB0aGUgZ3JvdXAgaXMgZW5hYmxlZCwKQEAgLTkyOSw2ICs5MjgsMTUgQEAKIAlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIsCiAJCQkgICBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKIAorCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CRykpIHsKKwkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXA7CisJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpbnB1dC0+Z3JvdXApOworCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0KKwkJCWlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudDsKKwkJc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfaW5vZGVzICs9CisJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOworCX0KKwogCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHNiaS0+c19zYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCkBAIC05NjQsNyArOTcyLDcgQEAKIAlleHQ0X2dyb3VwX3Qgb19ncm91cHNfY291bnQ7CiAJZXh0NF9ncnBibGtfdCBsYXN0OwogCWV4dDRfZ3JwYmxrX3QgYWRkOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgZnJlZWRfYmxvY2tzOwpAQCAtMTA3Nyw4ICsxMDg1LDE1IEBACiAJLyoKIAkgKiBNYXJrIG1iYWxsb2MgcGFnZXMgYXMgbm90IHVwIHRvIGRhdGUgc28gdGhhdCB0aGV5IHdpbGwgYmUgdXBkYXRlZAogCSAqIG5leHQgdGltZSB0aGV5IGFyZSBsb2FkZWQgYnkgZXh0NF9tYl9sb2FkX2J1ZGR5LgorCSAqCisJICogWFhYIEJhZCwgQmFkLCBCQUQhISEgIFdlIHNob3VsZCBub3QgYmUgb3ZlcmxvYWRpbmcgdGhlCisJICogVXB0b2RhdGUgZmxhZywgcGFydGljdWxhcmx5IG9uIHRodGUgYml0bWFwIGJoLCBhcyB3YXkgb2YKKwkgKiBoaW50aW5nIHRvIGV4dDRfbWJfbG9hZF9idWRkeSgpIHRoYXQgaXQgbmVlZHMgdG8gYmUKKwkgKiBvdmVybG9hZGVkLiAgQSB1c2VyIGNvdWxkIHRha2UgYSBMVk0gc25hcHNob3QsIHRoZW4gZG8gYW4KKwkgKiBvbi1saW5lIGZzY2ssIGFuZCBjbGVhciB0aGUgdXB0b2RhdGUgZmxhZywgYW5kIHRoaXMgd291bGQKKwkgKiBub3QgYmUgYSBidWcgaW4gdXNlcnNwYWNlLCBidXQgYSBidWcgaW4gdGhlIGtlcm5lbC4gIEZJWE1FISEhCiAJICovCi0JaWYgKHRlc3Rfb3B0KHNiLCBNQkFMTE9DKSkgeworCXsKIAkJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7CiAJCWludCBibG9ja3NfcGVyX3BhZ2U7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggNTY2MzQ0Yi4uZGVhOGYxMyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMTYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDUsNiArNDcsOCBAQAogI2luY2x1ZGUgIm5hbWVpLmgiCiAjaW5jbHVkZSAiZ3JvdXAuaCIKIAorc3RydWN0IHByb2NfZGlyX2VudHJ5ICpleHQ0X3Byb2Nfcm9vdDsKKwogc3RhdGljIGludCBleHQ0X2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSk7CiBzdGF0aWMgaW50IGV4dDRfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCkBAIC01MDMsMTUgKzUwNywxOCBAQAogCWV4dDRfbWJfcmVsZWFzZShzYik7CiAJZXh0NF9leHRfcmVsZWFzZShzYik7CiAJZXh0NF94YXR0cl9wdXRfc3VwZXIoc2IpOwotCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKKwlpZiAoamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpIDwgMCkKKwkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sICJDb3VsZG4ndCBjbGVhbiB1cCB0aGUgam91cm5hbCIpOwogCXNiaS0+c19qb3VybmFsID0gTlVMTDsKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKLQkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJtYXJraW5nIGRpcnR5Iik7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19zYmgpOwogCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogCX0KKwlpZiAoc2JpLT5zX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImlub2RlX3JlYWRhaGVhZF9ibGtzIiwgc2JpLT5zX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShzYi0+c19pZCwgZXh0NF9wcm9jX3Jvb3QpOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCiAJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CkBAIC01MjAsNiArNTI3LDcgQEAKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CiAJYnJlbHNlKHNiaS0+c19zYmgpOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKQEAgLTU2MiwxMSArNTcwLDEwIEBACiAJZWkgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJZWktPmlfYWNsID0gRVhUNF9BQ0xfTk9UX0NBQ0hFRDsKIAllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CiAjZW5kaWYKLQllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKIAllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CiAJZWktPnZmc19pbm9kZS5pX2RhdGEud3JpdGViYWNrX2luZGV4ID0gMDsKIAltZW1zZXQoJmVpLT5pX2NhY2hlZF9leHRlbnQsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfY2FjaGUpKTsKQEAgLTU5OSw3ICs2MDYsNyBAQAogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKikgZm9vOwogCiAJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX29ycGhhbik7Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWluaXRfcndzZW0oJmVpLT54YXR0cl9zZW0pOwogI2VuZGlmCiAJaW5pdF9yd3NlbSgmZWktPmlfZGF0YV9zZW0pOwpAQCAtNjI1LDggKzYzMiw3IEBACiAKIHN0YXRpYyB2b2lkIGV4dDRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgZXh0NF9ibG9ja19hbGxvY19pbmZvICpyc3YgPSBFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm87Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJaWYgKEVYVDRfSShpbm9kZSktPmlfYWNsICYmCiAJCQlFWFQ0X0koaW5vZGUpLT5pX2FjbCAhPSBFWFQ0X0FDTF9OT1RfQ0FDSEVEKSB7CiAJCXBvc2l4X2FjbF9yZWxlYXNlKEVYVDRfSShpbm9kZSktPmlfYWNsKTsKQEAgLTYzOCwxMCArNjQ0LDcgQEAKIAkJRVhUNF9JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CiAJfQogI2VuZGlmCi0JZXh0NF9kaXNjYXJkX3Jlc2VydmF0aW9uKGlub2RlKTsKLQlFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBOVUxMOwotCWlmICh1bmxpa2VseShyc3YpKQotCQlrZnJlZShyc3YpOworCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiAJamJkMl9qb3VybmFsX3JlbGVhc2VfamJkX2lub2RlKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2pvdXJuYWwsCiAJCQkJICAgICAgICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOwogfQpAQCAtNjU0LDcgKzY1Nyw3IEBACiAKIAlpZiAoc2JpLT5zX2pxdW90YV9mbXQpCiAJCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwKLQkJKHNiaS0+c19qcXVvdGFfZm10ID09IFFGTVRfVkZTX09MRCkgPyAidmZzb2xkIjogInZmc3YwIik7CisJCShzYmktPnNfanF1b3RhX2ZtdCA9PSBRRk1UX1ZGU19PTEQpID8gInZmc29sZCIgOiAidmZzdjAiKTsKIAogCWlmIChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdKQogCQlzZXFfcHJpbnRmKHNlcSwgIix1c3JqcXVvdGE9JXMiLCBzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdKTsKQEAgLTcxOCw3ICs3MjEsNyBAQAogCQlzZXFfcHV0cyhzZXEsICIsZGVidWciKTsKIAlpZiAodGVzdF9vcHQoc2IsIE9MREFMTE9DKSkKIAkJc2VxX3B1dHMoc2VxLCAiLG9sZGFsbG9jIik7Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWlmICh0ZXN0X29wdChzYiwgWEFUVFJfVVNFUikgJiYKIAkJIShkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9YQVRUUl9VU0VSKSkKIAkJc2VxX3B1dHMoc2VxLCAiLHVzZXJfeGF0dHIiKTsKQEAgLTcyNyw3ICs3MzAsNyBAQAogCQlzZXFfcHV0cyhzZXEsICIsbm91c2VyX3hhdHRyIik7CiAJfQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJaWYgKHRlc3Rfb3B0KHNiLCBQT1NJWF9BQ0wpICYmICEoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fQUNMKSkKIAkJc2VxX3B1dHMoc2VxLCAiLGFjbCIpOwogCWlmICghdGVzdF9vcHQoc2IsIFBPU0lYX0FDTCkgJiYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0FDTCkpCkBAIC03NTIsOCArNzU1LDYgQEAKIAkJc2VxX3B1dHMoc2VxLCAiLG5vYmgiKTsKIAlpZiAoIXRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkKIAkJc2VxX3B1dHMoc2VxLCAiLG5vZXh0ZW50cyIpOwotCWlmICghdGVzdF9vcHQoc2IsIE1CQUxMT0MpKQotCQlzZXFfcHV0cyhzZXEsICIsbm9tYmFsbG9jIik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBJX1ZFUlNJT04pKQogCQlzZXFfcHV0cyhzZXEsICIsaV92ZXJzaW9uIik7CiAJaWYgKCF0ZXN0X29wdChzYiwgREVMQUxMT0MpKQpAQCAtNzczLDYgKzc3NCwxMyBAQAogCWVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX1dSSVRFQkFDS19EQVRBKQogCQlzZXFfcHV0cyhzZXEsICIsZGF0YT13cml0ZWJhY2siKTsKIAorCWlmIChzYmktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgIT0gRVhUNF9ERUZfSU5PREVfUkVBREFIRUFEX0JMS1MpCisJCXNlcV9wcmludGYoc2VxLCAiLGlub2RlX3JlYWRhaGVhZF9ibGtzPSV1IiwKKwkJCSAgIHNiaS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcyk7CisKKwlpZiAodGVzdF9vcHQoc2IsIERBVEFfRVJSX0FCT1JUKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGRhdGFfZXJyPWFib3J0Iik7CisKIAlleHQ0X3Nob3dfcXVvdGFfb3B0aW9ucyhzZXEsIHNiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgyMiw3ICs4MzAsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1FVT1RBCi0jZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KSA9PSBVU1JRVU9UQT8idXNlciI6Imdyb3VwIikKKyNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpID09IFVTUlFVT1RBID8gInVzZXIiIDogImdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KSA9PSBVU1JRVU9UQT8oKG9uKSMjVVNSSlFVT1RBKTooKG9uKSMjR1JQSlFVT1RBKSkKIAogc3RhdGljIGludCBleHQ0X2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwpAQCAtOTAyLDE0ICs5MTAsMTYgQEAKIAlPcHRfY29tbWl0LCBPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2ludW0sIE9wdF9qb3VybmFsX2RldiwKIAlPcHRfam91cm5hbF9jaGVja3N1bSwgT3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAorCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAogCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKIAlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwgT3B0X3VzcnF1b3RhLAogCU9wdF9ncnBxdW90YSwgT3B0X2V4dGVudHMsIE9wdF9ub2V4dGVudHMsIE9wdF9pX3ZlcnNpb24sCiAJT3B0X21iYWxsb2MsIE9wdF9ub21iYWxsb2MsIE9wdF9zdHJpcGUsIE9wdF9kZWxhbGxvYywgT3B0X25vZGVsYWxsb2MsCisJT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9ic2RfZGYsICJic2RkZiJ9LAogCXtPcHRfbWluaXhfZGYsICJtaW5peGRmIn0sCiAJe09wdF9ncnBpZCwgImdycGlkIn0sCkBAIC05NDcsNiArOTU3LDggQEAKIAl7T3B0X2RhdGFfam91cm5hbCwgImRhdGE9am91cm5hbCJ9LAogCXtPcHRfZGF0YV9vcmRlcmVkLCAiZGF0YT1vcmRlcmVkIn0sCiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCisJe09wdF9kYXRhX2Vycl9hYm9ydCwgImRhdGFfZXJyPWFib3J0In0sCisJe09wdF9kYXRhX2Vycl9pZ25vcmUsICJkYXRhX2Vycj1pZ25vcmUifSwKIAl7T3B0X29mZnVzcmpxdW90YSwgInVzcmpxdW90YT0ifSwKIAl7T3B0X3VzcmpxdW90YSwgInVzcmpxdW90YT0lcyJ9LAogCXtPcHRfb2ZmZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSJ9LApAQCAtOTY3LDYgKzk3OSw3IEBACiAJe09wdF9yZXNpemUsICJyZXNpemUifSwKIAl7T3B0X2RlbGFsbG9jLCAiZGVsYWxsb2MifSwKIAl7T3B0X25vZGVsYWxsb2MsICJub2RlbGFsbG9jIn0sCisJe09wdF9pbm9kZV9yZWFkYWhlYWRfYmxrcywgImlub2RlX3JlYWRhaGVhZF9ibGtzPSV1In0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtOTgxLDcgKzk5NCw3IEBACiAJLyp0b2RvOiB1c2Ugc2ltcGxlX3N0cnRvbGwgd2l0aCA+MzJiaXQgZXh0NCAqLwogCXNiX2Jsb2NrID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgJm9wdGlvbnMsIDApOwogCWlmICgqb3B0aW9ucyAmJiAqb3B0aW9ucyAhPSAnLCcpIHsKLQkJcHJpbnRrKCJFWFQ0LWZzOiBJbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEludmFsaWQgc2Igc3BlY2lmaWNhdGlvbjogJXNcbiIsCiAJCSAgICAgICAoY2hhciAqKSAqZGF0YSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTEwNzIsNyArMTA4NSw3IEBACiAJCWNhc2UgT3B0X29ybG92OgogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE9MREFMTE9DKTsKIAkJCWJyZWFrOwotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1hBVFRSCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CiAJCQlicmVhazsKQEAgLTEwODIsMTAgKzEwOTUsMTEgQEAKICNlbHNlCiAJCWNhc2UgT3B0X3VzZXJfeGF0dHI6CiAJCWNhc2UgT3B0X25vdXNlcl94YXR0cjoKLQkJCXByaW50aygiRVhUNCAobm8pdXNlcl94YXR0ciBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0IChubyl1c2VyX3hhdHRyIG9wdGlvbnMgIgorCQkJICAgICAgICJub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCWJyZWFrOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJCWNhc2UgT3B0X2FjbDoKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKIAkJCWJyZWFrOwpAQCAtMTA5NSw3ICsxMTA5LDggQEAKICNlbHNlCiAJCWNhc2UgT3B0X2FjbDoKIAkJY2FzZSBPcHRfbm9hY2w6Ci0JCQlwcmludGsoIkVYVDQgKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0IChubylhY2wgb3B0aW9ucyAiCisJCQkgICAgICAgIm5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJYnJlYWs7CiAjZW5kaWYKIAkJY2FzZSBPcHRfcmVzZXJ2YXRpb246CkBAIC0xMTc4LDYgKzExOTMsMTIgQEAKIAkJCQlzYmktPnNfbW91bnRfb3B0IHw9IGRhdGFfb3B0OwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFfZXJyX2Fib3J0OgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0VSUl9BQk9SVCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGF0YV9lcnJfaWdub3JlOgorCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRVJSX0FCT1JUKTsKKwkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19RVU9UQQogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCQlxdHlwZSA9IFVTUlFVT1RBOwpAQCAtMTE4OSw4ICsxMjEwLDggQEAKIAkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpICYmCiAJCQkgICAgIXNiaS0+c19xZl9uYW1lc1txdHlwZV0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkJIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKLQkJCQkJInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uXG4iKTsKKwkJCQkgICAgICAgIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKKwkJCQkgICAgICAgInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXFuYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKQEAgLTEzNTcsMTIgKzEzNzgsNiBAQAogCQljYXNlIE9wdF9ub2RlbGFsbG9jOgogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9tYmFsbG9jOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBNQkFMTE9DKTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9ub21iYWxsb2M6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJBTExPQyk7Ci0JCQlicmVhazsKIAkJY2FzZSBPcHRfc3RyaXBlOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCiAJCQkJcmV0dXJuIDA7CkBAIC0xMzczLDYgKzEzODgsMTMgQEAKIAkJY2FzZSBPcHRfZGVsYWxsb2M6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9pbm9kZV9yZWFkYWhlYWRfYmxrczoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA8IDAgfHwgb3B0aW9uID4gKDEgPDwgMzApKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX2lub2RlX3JlYWRhaGVhZF9ibGtzID0gb3B0aW9uOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiRVhUNC1mczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgpAQCAtMTQ3MywxNSArMTQ5NSw5IEBACiAJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLAogCQkJc2JpLT5zX21vdW50X29wdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCAiLCBzYi0+c19pZCk7Ci0JaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgewotCQljaGFyIGJbQkRFVk5BTUVfU0laRV07Ci0KLQkJcHJpbnRrKCJleHRlcm5hbCBqb3VybmFsIG9uICVzXG4iLAotCQkJYmRldm5hbWUoRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9kZXYsIGIpKTsKLQl9IGVsc2UgewotCQlwcmludGsoImludGVybmFsIGpvdXJuYWxcbiIpOwotCX0KKwlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCAlcyBqb3VybmFsIG9uICVzXG4iLAorCSAgICAgICBzYi0+c19pZCwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9pbm9kZSA/ICJpbnRlcm5hbCIgOgorCSAgICAgICAiZXh0ZXJuYWwiLCBFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2Rldm5hbWUpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE1MDQsOCArMTUyMCwxMSBAQAogCXNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4ID0gc2JpLT5zX2VzLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXg7CiAJZ3JvdXBzX3Blcl9mbGV4ID0gMSA8PCBzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleDsKIAotCWZsZXhfZ3JvdXBfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIGdyb3Vwc19wZXJfZmxleCAtIDEpIC8KLQkJZ3JvdXBzX3Blcl9mbGV4OworCS8qIFdlIGFsbG9jYXRlIGJvdGggZXhpc3RpbmcgYW5kIHBvdGVudGlhbGx5IGFkZGVkIGdyb3VwcyAqLworCWZsZXhfZ3JvdXBfY291bnQgPSAoKHNiaS0+c19ncm91cHNfY291bnQgKyBncm91cHNfcGVyX2ZsZXggLSAxKSArCisJCQkgICAgKChzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyArMSApIDw8CisJCQkgICAgICBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpKSkgLworCQkJICAgZ3JvdXBzX3Blcl9mbGV4OwogCXNiaS0+c19mbGV4X2dyb3VwcyA9IGt6YWxsb2MoZmxleF9ncm91cF9jb3VudCAqCiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7CkBAIC0xNTg0LDcgKzE2MDMsNyBAQAogCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CRykpCiAJCWZsZXhiZ19mbGFnID0gMTsKIAotCWV4dDRfZGVidWcgKCJDaGVja2luZyBncm91cCBkZXNjcmlwdG9ycyIpOworCWV4dDRfZGVidWcoIkNoZWNraW5nIGdyb3VwIGRlc2NyaXB0b3JzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwpAQCAtMTYyMyw4ICsxNjQyLDEwIEBACiAJCQkgICAgICAgIkNoZWNrc3VtIGZvciBncm91cCAlbHUgZmFpbGVkICgldSE9JXUpXG4iLAogCQkJICAgICAgIGksIGxlMTZfdG9fY3B1KGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaSwKIAkJCSAgICAgICBnZHApKSwgbGUxNl90b19jcHUoZ2RwLT5iZ19jaGVja3N1bSkpOwotCQkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBpKSk7CiAJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBpKSk7CiAJCWlmICghZmxleGJnX2ZsYWcpCkBAIC0xNzE0LDkgKzE3MzUsOSBAQAogCQlEUVVPVF9JTklUKGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX25saW5rKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJUxkIGJ5dGVzXG4iLAorCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJWxsZCBieXRlc1xuIiwKIAkJCQlfX2Z1bmNfXywgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9zaXplKTsKLQkJCWpiZF9kZWJ1ZygyLCAidHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJUxkIGJ5dGVzXG4iLAorCQkJamJkX2RlYnVnKDIsICJ0cnVuY2F0aW5nIGlub2RlICVsdSB0byAlbGxkIGJ5dGVzXG4iLAogCQkJCSAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9zaXplKTsKIAkJCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOwogCQkJbnJfdHJ1bmNhdGVzKys7CkBAIC0xOTE0LDYgKzE5MzUsNyBAQAogCXVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0gPSAwOwogCXVuc2lnbmVkIGxvbmcgZGVmX21vdW50X29wdHM7CiAJc3RydWN0IGlub2RlICpyb290OworCWNoYXIgKmNwOwogCWludCByZXQgPSAtRUlOVkFMOwogCWludCBibG9ja3NpemU7CiAJaW50IGRiX2NvdW50OwpAQCAtMTkzMCwxMCArMTk1MiwxNSBAQAogCXNiaS0+c19tb3VudF9vcHQgPSAwOwogCXNiaS0+c19yZXN1aWQgPSBFWFQ0X0RFRl9SRVNVSUQ7CiAJc2JpLT5zX3Jlc2dpZCA9IEVYVDRfREVGX1JFU0dJRDsKKwlzYmktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgPSBFWFQ0X0RFRl9JTk9ERV9SRUFEQUhFQURfQkxLUzsKIAlzYmktPnNfc2JfYmxvY2sgPSBzYl9ibG9jazsKIAogCXVubG9ja19rZXJuZWwoKTsKIAorCS8qIENsZWFudXAgc3VwZXJibG9jayBuYW1lICovCisJZm9yIChjcCA9IHNiLT5zX2lkOyAoY3AgPSBzdHJjaHIoY3AsICcvJykpOykKKwkJKmNwID0gJyEnOworCiAJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgRVhUNF9NSU5fQkxPQ0tfU0laRSk7CiAJaWYgKCFibG9ja3NpemUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CkBAIC0xOTczLDExICsyMDAwLDExIEBACiAJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOwogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9VSUQxNikKIAkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7Ci0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9YQVRUUl9VU0VSKQogCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFhBVFRSX1VTRVIpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0FDTCkKIAkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOwogI2VuZGlmCkBAIC0yMDEyLDExICsyMDM5LDYgQEAKIAkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywKIAkJCSJleHRlbnRzIGZlYXR1cmUgbm90IGVuYWJsZWQgb24gdGhpcyBmaWxlc3lzdGVtLCAiCiAJCQkidXNlIHR1bmUyZnMuXG4iKTsKLQkvKgotCSAqIHR1cm4gb24gbWJhbGxvYyBjb2RlIGJ5IGRlZmF1bHQgaW4gZXh0NCBmaWxlc3lzdGVtCi0JICogVXNlIC1vIG5vbWJhbGxvYyB0byB0dXJuIGl0IG9mZgotCSAqLwotCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJBTExPQyk7CiAKIAkvKgogCSAqIGVuYWJsZSBkZWxheWVkIGFsbG9jYXRpb24gYnkgZGVmYXVsdApAQCAtMjA0MSwxNiArMjA2Myw2IEBACiAJCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOwogCiAJLyoKLQkgKiBTaW5jZSBleHQ0IGlzIHN0aWxsIGNvbnNpZGVyZWQgZGV2ZWxvcG1lbnQgY29kZSwgd2UgcmVxdWlyZQotCSAqIHRoYXQgdGhlIFRFU1RfRklMRVNZUyBmbGFnIGluIHMtPmZsYWdzIGJlIHNldC4KLQkgKi8KLQlpZiAoIShsZTMyX3RvX2NwdShlcy0+c19mbGFncykgJiBFWFQyX0ZMQUdTX1RFU1RfRklMRVNZUykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogJXM6IG5vdCBtYXJrZWQgIgotCQkgICAgICAgIk9LIHRvIHVzZSB3aXRoIHRlc3QgY29kZS5cbiIsIHNiLT5zX2lkKTsKLQkJZ290byBmYWlsZWRfbW91bnQ7Ci0JfQotCi0JLyoKIAkgKiBDaGVjayBmZWF0dXJlIGZsYWdzIHJlZ2FyZGxlc3Mgb2YgdGhlIHJldmlzaW9uIGxldmVsLCBzaW5jZSB3ZQogCSAqIHByZXZpb3VzbHkgZGlkbid0IGNoYW5nZSB0aGUgcmV2aXNpb24gbGV2ZWwgd2hlbiBzZXR0aW5nIHRoZSBmbGFncywKIAkgKiBzbyB0aGVyZSBpcyBhIGNoYW5jZSBpbmNvbXBhdCBmbGFncyBhcmUgc2V0IG9uIGEgcmV2IDAgZmlsZXN5c3RlbS4KQEAgLTIyMTksNiArMjIzMSwxNiBAQAogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWlmIChleHQ0X3Byb2Nfcm9vdCkKKwkJc2JpLT5zX3Byb2MgPSBwcm9jX21rZGlyKHNiLT5zX2lkLCBleHQ0X3Byb2Nfcm9vdCk7CisKKwlpZiAoc2JpLT5zX3Byb2MpCisJCXByb2NfY3JlYXRlX2RhdGEoImlub2RlX3JlYWRhaGVhZF9ibGtzIiwgMDY0NCwgc2JpLT5zX3Byb2MsCisJCQkJICZleHQ0X3VpX3Byb2NfZm9wcywKKwkJCQkgJnNiaS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcyk7CisjZW5kaWYKKwogCWJnbF9sb2NrX2luaXQoJnNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IGRiX2NvdW50OyBpKyspIHsKQEAgLTIyNTcsMjQgKzIyNzksMTQgQEAKIAkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2RpcnNfY291bnRlciwKIAkJCQlleHQ0X2NvdW50X2RpcnMoc2IpKTsKIAl9CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsIDApOworCX0KIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7CiAJCWdvdG8gZmFpbGVkX21vdW50MzsKIAl9CiAKLQkvKiBwZXIgZmlsZXlzdGVtIHJlc2VydmF0aW9uIGxpc3QgaGVhZCAmIGxvY2sgKi8KLQlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX3Jzdl93aW5kb3dfbG9jayk7Ci0Jc2JpLT5zX3Jzdl93aW5kb3dfcm9vdCA9IFJCX1JPT1Q7Ci0JLyogQWRkIGEgc2luZ2xlLCBzdGF0aWMgZHVtbXkgcmVzZXJ2YXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZQotCSAqIHJlc2VydmF0aW9uIHdpbmRvdyBsaXN0IC0tLSBpdCBnaXZlcyB1cyBhIHBsYWNlaG9sZGVyIGZvcgotCSAqIGFwcGVuZC1hdC1zdGFydC1vZi1saXN0IHdoaWNoIG1ha2VzIHRoZSBhbGxvY2F0aW9uIGxvZ2ljCi0JICogX211Y2hfIHNpbXBsZXIuICovCi0Jc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3Zfc3RhcnQgPSBFWFQ0X1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7Ci0Jc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZW5kID0gRVhUNF9SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOwotCXNiaS0+c19yc3Zfd2luZG93X2hlYWQucnN2X2FsbG9jX2hpdCA9IDA7Ci0Jc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZ29hbF9zaXplID0gMDsKLQlleHQ0X3Jzdl93aW5kb3dfYWRkKHNiLCAmc2JpLT5zX3Jzdl93aW5kb3dfaGVhZCk7Ci0KIAlzYmktPnNfc3RyaXBlID0gZXh0NF9nZXRfc3RyaXBlX3NpemUoc2JpKTsKIAogCS8qCkBAIC0yNDcxLDcgKzI0ODMsMTIgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogZGVsYXllZCBhbGxvY2F0aW9uIGVuYWJsZWRcbiIpOwogCiAJZXh0NF9leHRfaW5pdChzYik7Ci0JZXh0NF9tYl9pbml0KHNiLCBuZWVkc19yZWNvdmVyeSk7CisJZXJyID0gZXh0NF9tYl9pbml0KHNiLCBuZWVkc19yZWNvdmVyeSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBpbml0YWxpemUgbWJhbGxvYyAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZ290byBmYWlsZWRfbW91bnQ0OworCX0KIAogCWxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CkBAIC0yNDg5LDExICsyNTA2LDE2IEBACiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpOwogZmFpbGVkX21vdW50MjoKIAlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKIAkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKIAlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CiBmYWlsZWRfbW91bnQ6CisJaWYgKHNiaS0+c19wcm9jKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJpbm9kZV9yZWFkYWhlYWRfYmxrcyIsIHNiaS0+c19wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoc2ItPnNfaWQsIGV4dDRfcHJvY19yb290KTsKKwl9CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQogCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbaV0pOwpAQCAtMjUyNyw2ICsyNTQ5LDEwIEBACiAJCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkJEMl9CQVJSSUVSOwogCWVsc2UKIAkJam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9CQVJSSUVSOworCWlmICh0ZXN0X29wdChzYiwgREFUQV9FUlJfQUJPUlQpKQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpCRDJfQUJPUlRfT05fU1lOQ0RBVEFfRVJSOworCWVsc2UKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9BQk9SVF9PTl9TWU5DREFUQV9FUlI7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiB9CiAKQEAgLTI1NTIsNyArMjU3OCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAorCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJWxsZCBieXRlc1xuIiwKIAkJICBqb3VybmFsX2lub2RlLCBqb3VybmFsX2lub2RlLT5pX3NpemUpOwogCWlmICghU19JU1JFRyhqb3VybmFsX2lub2RlLT5pX21vZGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogaW52YWxpZCBqb3VybmFsIGlub2RlLlxuIik7CkBAIC0yNzE1LDYgKzI3NDEsMTEgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkJEMl9CQVJSSUVSKQorCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBiYXJyaWVycyBlbmFibGVkXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGJhcnJpZXJzIGRpc2FibGVkXG4iKTsKKwogCWlmICghcmVhbGx5X3JlYWRfb25seSAmJiB0ZXN0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpKSB7CiAJCWVyciA9IGpiZDJfam91cm5hbF91cGRhdGVfZm9ybWF0KGpvdXJuYWwpOwogCQlpZiAoZXJyKSAgewpAQCAtMjc5OSwxMyArMjgzMCwzNCBAQAogCiAJaWYgKCFzYmgpCiAJCXJldHVybjsKKwlpZiAoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCkpIHsKKwkJLyoKKwkJICogT2gsIGRlYXIuICBBIHByZXZpb3VzIGF0dGVtcHQgdG8gd3JpdGUgdGhlCisJCSAqIHN1cGVyYmxvY2sgZmFpbGVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gYmVjYXVzZSB0aGUKKwkJICogVVNCIGRldmljZSB3YXMgeWFua2VkIG91dC4gIE9yIGl0IGNvdWxkIGhhcHBlbiB0bworCQkgKiBiZSBhIHRyYW5zaWVudCB3cml0ZSBlcnJvciBhbmQgbWF5YmUgdGhlIGJsb2NrIHdpbGwKKwkJICogYmUgcmVtYXBwZWQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgdG8gcmV0cnkgdGhlCisJCSAqIHdyaXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiZXh0NDogcHJldmlvdXMgSS9PIGVycm9yIHRvICIKKwkJICAgICAgICJzdXBlcmJsb2NrIGRldGVjdGVkIGZvciAlcy5cbiIsIHNiLT5zX2lkKTsKKwkJY2xlYXJfYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoc2JoKTsKKwl9CiAJZXMtPnNfd3RpbWUgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKIAlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzYikpOwogCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzYikpOwogCUJVRkZFUl9UUkFDRShzYmgsICJtYXJraW5nIGRpcnR5Iik7CiAJbWFya19idWZmZXJfZGlydHkoc2JoKTsKLQlpZiAoc3luYykKKwlpZiAoc3luYykgewogCQlzeW5jX2RpcnR5X2J1ZmZlcihzYmgpOworCQlpZiAoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZXh0NDogSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgIgorCQkJICAgICAgICJzdXBlcmJsb2NrIGZvciAlcy5cbiIsIHNiLT5zX2lkKTsKKwkJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShzYmgpOworCQl9CisJfQogfQogCiAKQEAgLTI4MjAsNyArMjg3Miw5IEBACiAJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAogCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7Ci0JamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCWlmIChqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCkgPCAwKQorCQlnb3RvIG91dDsKKwogCWxvY2tfc3VwZXIoc2IpOwogCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgJiYKIAkgICAgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKQEAgLTI4MjksNiArMjg4Myw4IEBACiAJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJfQogCXVubG9ja19zdXBlcihzYik7CisKK291dDoKIAlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiB9CiAKQEAgLTI5MDcsNiArMjk2Myw3IEBACiB7CiAJdGlkX3QgdGFyZ2V0OwogCisJdHJhY2VfbWFyayhleHQ0X3N5bmNfZnMsICJkZXYgJXMgd2FpdCAlZCIsIHNiLT5zX2lkLCB3YWl0KTsKIAlzYi0+c19kaXJ0ID0gMDsKIAlpZiAoamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgewogCQlpZiAod2FpdCkKQEAgLTI5MjgsNyArMjk4NSwxMyBAQAogCiAJCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KIAkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKLQkJamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCisJCS8qCisJCSAqIFdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZyB3aGVuIHdlIGZhaWxlZAorCQkgKiB0byBmbHVzaCB0aGUgam91cm5hbC4KKwkJICovCisJCWlmIChqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCkgPCAwKQorCQkJcmV0dXJuOwogCiAJCS8qIEpvdXJuYWwgYmxvY2tlZCBhbmQgZmx1c2hlZCwgY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZy4gKi8KIAkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CkBAIC0zMTYyLDcgKzMyMjUsOCBAQAogCWJ1Zi0+Zl90eXBlID0gRVhUNF9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtIHNiaS0+c19vdmVyaGVhZF9sYXN0OwotCWJ1Zi0+Zl9iZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSAtCisJCSAgICAgICBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKTsKIAlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gZXh0NF9yX2Jsb2Nrc19jb3VudChlcyk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGV4dDRfcl9ibG9ja3NfY291bnQoZXMpKQpAQCAtMzM2Nyw4ICszNDMxLDEyIEBACiAJCSAqIG90aGVyd2lzZSBiZSBsaXZlbG9ja2VkLi4uCiAJCSAqLwogCQlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOwotCQlqYmQyX2pvdXJuYWxfZmx1c2goRVhUNF9TQihzYiktPnNfam91cm5hbCk7CisJCWVyciA9IGpiZDJfam91cm5hbF9mbHVzaChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKIAkJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpOworCQlpZiAoZXJyKSB7CisJCQlwYXRoX3B1dCgmbmQucGF0aCk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCiAJZXJyID0gdmZzX3F1b3RhX29uX3BhdGgoc2IsIHR5cGUsIGZvcm1hdF9pZCwgJm5kLnBhdGgpOwpAQCAtMzQzMiw3ICszNTAwLDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCiAJaWYgKCFoYW5kbGUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogUXVvdGEgd3JpdGUgKG9mZj0lTHUsIGxlbj0lTHUpIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBRdW90YSB3cml0ZSAob2ZmPSVsbHUsIGxlbj0lbGx1KSIKIAkJCSIgY2FuY2VsbGVkIGJlY2F1c2UgdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQuXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0zNDkzLDE4ICszNTYxLDgyIEBACiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLCBtbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0NGRldl9mc190eXBlID0geworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IGV4dDRfdWlfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwl1bnNpZ25lZCBpbnQgKnAgPSBtLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihtLCAiJXVcbiIsICpwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQ0X3VpX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZXh0NF91aV9wcm9jX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCBleHQ0X3VpX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGludCAqcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwljaGFyIHN0clszMl07CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCWlmIChjbnQgPj0gc2l6ZW9mKHN0cikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihzdHIsIGJ1ZiwgY250KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJKnAgPSB2YWx1ZTsKKwlyZXR1cm4gY250OworfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDRfdWlfcHJvY19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiZXh0NGRldiIsCisJLm9wZW4JCT0gZXh0NF91aV9wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkud3JpdGUJCT0gZXh0NF91aV9wcm9jX3dyaXRlLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0NF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZXh0NCIsCiAJLmdldF9zYgkJPSBleHQ0X2dldF9zYiwKIAkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCiAJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAogfTsKIAorI2lmZGVmIENPTkZJR19FWFQ0REVWX0NPTVBBVAorc3RhdGljIGludCBleHQ0ZGV2X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBVcGRhdGUgeW91ciB1c2Vyc3BhY2UgcHJvZ3JhbXMgIgorCSAgICAgICAidG8gbW91bnQgdXNpbmcgZXh0NFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogZXh0NGRldiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAiCisJICAgICAgICJ3aWxsIGdvIGF3YXkgYnkgMi42LjMxXG4iKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQ0X2ZpbGxfc3VwZXIsIG1udCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQ0ZGV2X2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJleHQ0ZGV2IiwKKwkuZ2V0X3NiCQk9IGV4dDRkZXZfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworTU9EVUxFX0FMSUFTKCJleHQ0ZGV2Iik7CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9leHQ0X2ZzKHZvaWQpCiB7CiAJaW50IGVycjsKIAorCWV4dDRfcHJvY19yb290ID0gcHJvY19ta2RpcigiZnMvZXh0NCIsIE5VTEwpOwogCWVyciA9IGluaXRfZXh0NF9tYmFsbG9jKCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTM1MTUsOSArMzY0NywxNiBAQAogCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKLQllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQ0ZGV2X2ZzX3R5cGUpOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRfZnNfdHlwZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CisjaWZkZWYgQ09ORklHX0VYVDRERVZfQ09NUEFUCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NGRldl9mc190eXBlKTsKKwlpZiAoZXJyKSB7CisJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NF9mc190eXBlKTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiBvdXQ6CiAJZGVzdHJveV9pbm9kZWNhY2hlKCk7CkBAIC0zNTMwLDEwICszNjY5LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2V4dDRfZnModm9pZCkKIHsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDRfZnNfdHlwZSk7CisjaWZkZWYgQ09ORklHX0VYVDRERVZfQ09NUEFUCiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQ0ZGV2X2ZzX3R5cGUpOworI2VuZGlmCiAJZGVzdHJveV9pbm9kZWNhY2hlKCk7CiAJZXhpdF9leHQ0X3hhdHRyKCk7CiAJZXhpdF9leHQ0X21iYWxsb2MoKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvZXh0NCIsIE5VTEwpOwogfQogCiBNT0RVTEVfQVVUSE9SKCJSZW15IENhcmQsIFN0ZXBoZW4gVHdlZWRpZSwgQW5kcmV3IE1vcnRvbiwgQW5kcmVhcyBEaWxnZXIsIFRoZW9kb3JlIFRzJ28gYW5kIG90aGVycyIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zeW1saW5rLmMgYi9mcy9leHQ0L3N5bWxpbmsuYwppbmRleCBlOTE3ODY0Li4wMDc0MGNiIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N5bWxpbmsuYworKysgYi9mcy9leHQ0L3N5bWxpbmsuYwpAQCAtMjMsMTAgKzIzLDEwIEBACiAjaW5jbHVkZSAiZXh0NC5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAKLXN0YXRpYyB2b2lkICogZXh0NF9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIHZvaWQgKmV4dDRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShkZW50cnktPmRfaW5vZGUpOwotCW5kX3NldF9saW5rKG5kLCAoY2hhciopZWktPmlfZGF0YSk7CisJbmRfc2V0X2xpbmsobmQsIChjaGFyICopIGVpLT5pX2RhdGEpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zNCw3ICszNCw3IEBACiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAogCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCiAJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gZXh0NF9saXN0eGF0dHIsCkBAIC00NSw3ICs0NSw3IEBACiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewogCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCiAJLmZvbGxvd19saW5rCT0gZXh0NF9mb2xsb3dfbGluaywKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19YQVRUUgorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1hBVFRSCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBleHQ0X2xpc3R4YXR0ciwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuYyBiL2ZzL2V4dDQveGF0dHIuYwppbmRleCA4OTU0MjA4Li44MDYyNmQ1IDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmMKKysrIGIvZnMvZXh0NC94YXR0ci5jCkBAIC05OSwxMiArOTksMTIgQEAKIAogc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQ0X3hhdHRyX2hhbmRsZXJfbWFwW10gPSB7CiAJW0VYVDRfWEFUVFJfSU5ERVhfVVNFUl0JCSAgICAgPSAmZXh0NF94YXR0cl91c2VyX2hhbmRsZXIsCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJW0VYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTU10gID0gJmV4dDRfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAogCVtFWFQ0X1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUXSA9ICZleHQ0X3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCiAjZW5kaWYKIAlbRVhUNF9YQVRUUl9JTkRFWF9UUlVTVEVEXQkgICAgID0gJmV4dDRfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1NFQ1VSSVRZCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfU0VDVVJJVFkKIAlbRVhUNF9YQVRUUl9JTkRFWF9TRUNVUklUWV0JICAgICA9ICZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCiAjZW5kaWYKIH07CkBAIC0xMTIsMTEgKzExMiwxMSBAQAogc3RydWN0IHhhdHRyX2hhbmRsZXIgKmV4dDRfeGF0dHJfaGFuZGxlcnNbXSA9IHsKIAkmZXh0NF94YXR0cl91c2VyX2hhbmRsZXIsCiAJJmV4dDRfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAotI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTAorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCSZleHQ0X3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlciwKIAkmZXh0NF94YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyLAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfU0VDVVJJVFkKKyNpZmRlZiBDT05GSUdfRVhUNF9GU19TRUNVUklUWQogCSZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCiAjZW5kaWYKIAlOVUxMCkBAIC05NTksNiArOTU5LDcgQEAKIAlzdHJ1Y3QgZXh0NF94YXR0cl9ibG9ja19maW5kIGJzID0gewogCQkucyA9IHsgLm5vdF9mb3VuZCA9IC1FTk9EQVRBLCB9LAogCX07CisJdW5zaWduZWQgbG9uZyBub19leHBhbmQ7CiAJaW50IGVycm9yOwogCiAJaWYgKCFuYW1lKQpAQCAtOTY2LDYgKzk2Nyw5IEBACiAJaWYgKHN0cmxlbihuYW1lKSA+IDI1NSkKIAkJcmV0dXJuIC1FUkFOR0U7CiAJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlub19leHBhbmQgPSBFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9OT19FWFBBTkQ7CisJRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSB8PSBFWFQ0X1NUQVRFX05PX0VYUEFORDsKKwogCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaXMuaWxvYyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGNsZWFudXA7CkBAIC0xMDQyLDYgKzEwNDYsOCBAQAogY2xlYW51cDoKIAlicmVsc2UoaXMuaWxvYy5iaCk7CiAJYnJlbHNlKGJzLmJoKTsKKwlpZiAobm9fZXhwYW5kID09IDApCisJCUVYVDRfSShpbm9kZSktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTk9fRVhQQU5EOwogCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuaCBiL2ZzL2V4dDQveGF0dHIuaAppbmRleCA1OTkyZmU5Li44ZWRlODhiIDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmgKKysrIGIvZnMvZXh0NC94YXR0ci5oCkBAIC01MSw4ICs1MSw4IEBACiAJKCgobmFtZV9sZW4pICsgRVhUNF9YQVRUUl9ST1VORCArIFwKIAlzaXplb2Yoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkpKSAmIH5FWFQ0X1hBVFRSX1JPVU5EKQogI2RlZmluZSBFWFQ0X1hBVFRSX05FWFQoZW50cnkpIFwKLQkoIChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSggXAotCSAgKGNoYXIgKikoZW50cnkpICsgRVhUNF9YQVRUUl9MRU4oKGVudHJ5KS0+ZV9uYW1lX2xlbikpICkKKwkoKHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICopKCBcCisJIChjaGFyICopKGVudHJ5KSArIEVYVDRfWEFUVFJfTEVOKChlbnRyeSktPmVfbmFtZV9sZW4pKSkKICNkZWZpbmUgRVhUNF9YQVRUUl9TSVpFKHNpemUpIFwKIAkoKChzaXplKSArIEVYVDRfWEFUVFJfUk9VTkQpICYgfkVYVDRfWEFUVFJfUk9VTkQpCiAKQEAgLTYzLDcgKzYzLDcgQEAKIAkJRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSkpCiAjZGVmaW5lIElGSVJTVChoZHIpICgoc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKikoKGhkcikrMSkpCiAKLSMgaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfWEFUVFIKKyMgaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKIAogZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfdXNlcl9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDRfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyOwpAQCAtODgsNyArODgsNyBAQAogCiBleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgKmV4dDRfeGF0dHJfaGFuZGxlcnNbXTsKIAotIyBlbHNlICAvKiBDT05GSUdfRVhUNERFVl9GU19YQVRUUiAqLworIyBlbHNlICAvKiBDT05GSUdfRVhUNF9GU19YQVRUUiAqLwogCiBzdGF0aWMgaW5saW5lIGludAogZXh0NF94YXR0cl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0xNDEsOSArMTQxLDkgQEAKIAogI2RlZmluZSBleHQ0X3hhdHRyX2hhbmRsZXJzCU5VTEwKIAotIyBlbmRpZiAgLyogQ09ORklHX0VYVDRERVZfRlNfWEFUVFIgKi8KKyMgZW5kaWYgIC8qIENPTkZJR19FWFQ0X0ZTX1hBVFRSICovCiAKLSNpZmRlZiBDT05GSUdfRVhUNERFVl9GU19TRUNVUklUWQorI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZCiBleHRlcm4gaW50IGV4dDRfaW5pdF9zZWN1cml0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBpbm9kZSAqZGlyKTsKICNlbHNlCmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0ZW50LmMgYi9mcy9mYXQvZmF0ZW50LmMKaW5kZXggMzAyZTk1Yy4uZmI5OGIzZCAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZhdGVudC5jCisrKyBiL2ZzL2ZhdC9mYXRlbnQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21zZG9zX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAKIHN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyB7CiAJdm9pZCAoKmVudF9ibG9ja25yKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBpbnQgKiwgc2VjdG9yX3QgKik7CkBAIC01MzUsNiArNTM2LDcgQEAKIAlzdHJ1Y3QgZmF0X2VudHJ5IGZhdGVudDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKIAlpbnQgaSwgZXJyLCBucl9iaHM7CisJaW50IGZpcnN0X2NsID0gY2x1c3RlcjsKIAogCW5yX2JocyA9IDA7CiAJZmF0ZW50X2luaXQoJmZhdGVudCk7CkBAIC01NTEsNiArNTUzLDE4IEBACiAJCQlnb3RvIGVycm9yOwogCQl9CiAKKwkJLyogCisJCSAqIElzc3VlIGRpc2NhcmQgZm9yIHRoZSBzZWN0b3JzIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0LAorCQkgKiBiYXRjaGluZyBjb250aWd1b3VzIGNsdXN0ZXJzIGludG8gb25lIHJlcXVlc3QKKwkJICovCisJCWlmIChjbHVzdGVyICE9IGZhdGVudC5lbnRyeSArIDEpIHsKKwkJCWludCBucl9jbHVzID0gZmF0ZW50LmVudHJ5IC0gZmlyc3RfY2wgKyAxOworCisJCQlzYl9pc3N1ZV9kaXNjYXJkKHNiLCBmYXRfY2x1c190b19ibGtucihzYmksIGZpcnN0X2NsKSwKKwkJCQkJIG5yX2NsdXMgKiBzYmktPnNlY19wZXJfY2x1cyk7CisJCQlmaXJzdF9jbCA9IGNsdXN0ZXI7CisJCX0KKwogCQlvcHMtPmVudF9wdXQoJmZhdGVudCwgRkFUX0VOVF9GUkVFKTsKIAkJaWYgKHNiaS0+ZnJlZV9jbHVzdGVycyAhPSAtMSkgewogCQkJc2JpLT5mcmVlX2NsdXN0ZXJzKys7CmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDgwZmYzMzguLmQxMmNkZjIgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC04NTUsNyArODU1LDcgQEAKIAlPcHRfb2Jzb2xhdGUsIE9wdF9mbHVzaCwgT3B0X3R6X3V0YywgT3B0X2VyciwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IGZhdF90b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBmYXRfdG9rZW5zID0gewogCXtPcHRfY2hlY2tfciwgImNoZWNrPXJlbGF4ZWQifSwKIAl7T3B0X2NoZWNrX3MsICJjaGVjaz1zdHJpY3QifSwKIAl7T3B0X2NoZWNrX24sICJjaGVjaz1ub3JtYWwifSwKQEAgLTg5MCwxNCArODkwLDE0IEBACiAJe09wdF90el91dGMsICJ0ej1VVEMifSwKIAl7T3B0X2VyciwgTlVMTH0sCiB9Owotc3RhdGljIG1hdGNoX3RhYmxlX3QgbXNkb3NfdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgbXNkb3NfdG9rZW5zID0gewogCXtPcHRfbm9kb3RzLCAibm9kb3RzIn0sCiAJe09wdF9ub2RvdHMsICJkb3RzT0s9bm8ifSwKIAl7T3B0X2RvdHMsICJkb3RzIn0sCiAJe09wdF9kb3RzLCAiZG90c09LPXllcyJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKLXN0YXRpYyBtYXRjaF90YWJsZV90IHZmYXRfdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdmZhdF90b2tlbnMgPSB7CiAJe09wdF9jaGFyc2V0LCAiaW9jaGFyc2V0PSVzIn0sCiAJe09wdF9zaG9ydG5hbWVfbG93ZXIsICJzaG9ydG5hbWU9bG93ZXIifSwKIAl7T3B0X3Nob3J0bmFtZV93aW45NSwgInNob3J0bmFtZT13aW45NSJ9LApkaWZmIC0tZ2l0IGEvZnMvZnMtd3JpdGViYWNrLmMgYi9mcy9mcy13cml0ZWJhY2suYwppbmRleCAyNWFkZmMzLi5kMGZmMGI4IDEwMDY0NAotLS0gYS9mcy9mcy13cml0ZWJhY2suYworKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtOCw3ICs4LDcgQEAKICAqIHBhZ2VzIGFnYWluc3QgaW5vZGVzLiAgaWU6IGRhdGEgd3JpdGViYWNrLiAgV3JpdGVvdXQgb2YgdGhlCiAgKiBpbm9kZSBpdHNlbGYgaXMgbm90IGhhbmRsZWQgaGVyZS4KICAqCi0gKiAxMEFwcjIwMDIJYWtwbUB6aXAuY29tLmF1CisgKiAxMEFwcjIwMDIJQW5kcmV3IE1vcnRvbgogICoJCVNwbGl0IG91dCBvZiBmcy9pbm9kZS5jCiAgKgkJQWRkaXRpb25zIGZvciBhZGRyZXNzX3NwYWNlLWJhc2VkIHdyaXRlYmFjawogICovCmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggZDIyNDlmMS4uNmE4NDM4OCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMzU0LDcgKzM1NCw3IEBACiAJT1BUX0VSUgogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPUFRfRkQsCQkJImZkPSV1In0sCiAJe09QVF9ST09UTU9ERSwJCQkicm9vdG1vZGU9JW8ifSwKIAl7T1BUX1VTRVJfSUQsCQkJInVzZXJfaWQ9JXUifSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suYyBiL2ZzL2dmczIvZ2xvY2suYwppbmRleCAxMzM5MWU1Li5jOTYyMjgzIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmMKKysrIGIvZnMvZ2ZzMi9nbG9jay5jCkBAIC0xMjY1LDYgKzEyNjUsOCBAQAogCWhvbGR0aW1lID0gZ2wtPmdsX3RjaGFuZ2UgKyBnbC0+Z2xfb3BzLT5nb19taW5faG9sZF90aW1lOwogCWlmICh0aW1lX2JlZm9yZShub3csIGhvbGR0aW1lKSkKIAkJZGVsYXkgPSBob2xkdGltZSAtIG5vdzsKKwlpZiAodGVzdF9iaXQoR0xGX1JFUExZX1BFTkRJTkcsICZnbC0+Z2xfZmxhZ3MpKQorCQlkZWxheSA9IGdsLT5nbF9vcHMtPmdvX21pbl9ob2xkX3RpbWU7CiAKIAlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKIAloYW5kbGVfY2FsbGJhY2soZ2wsIHN0YXRlLCAxLCBkZWxheSk7CkBAIC0xNTc4LDggKzE1ODAsNiBAQAogCQkqcCsrID0gJ2EnOwogCWlmIChmbGFncyAmIEdMX0VYQUNUKQogCQkqcCsrID0gJ0UnOwotCWlmIChmbGFncyAmIEdMX0FUSU1FKQotCQkqcCsrID0gJ2EnOwogCWlmIChmbGFncyAmIEdMX05PQ0FDSEUpCiAJCSpwKysgPSAnYyc7CiAJaWYgKHRlc3RfYml0KEhJRl9IT0xERVIsICZpZmxhZ3MpKQpAQCAtMTgxNiwxNSArMTgxNiwxNyBAQAogCWlmIChnbCkgewogCQlnaS0+Z2wgPSBobGlzdF9lbnRyeShnbC0+Z2xfbGlzdC5uZXh0LAogCQkJCSAgICAgc3RydWN0IGdmczJfZ2xvY2ssIGdsX2xpc3QpOwotCQlpZiAoZ2ktPmdsKQotCQkJZ2ZzMl9nbG9ja19ob2xkKGdpLT5nbCk7CisJfSBlbHNlIHsKKwkJZ2ktPmdsID0gaGxpc3RfZW50cnkoZ2xfaGFzaF90YWJsZVtnaS0+aGFzaF0uaGJfbGlzdC5maXJzdCwKKwkJCQkgICAgIHN0cnVjdCBnZnMyX2dsb2NrLCBnbF9saXN0KTsKIAl9CisJaWYgKGdpLT5nbCkKKwkJZ2ZzMl9nbG9ja19ob2xkKGdpLT5nbCk7CiAJcmVhZF91bmxvY2soZ2xfbG9ja19hZGRyKGdpLT5oYXNoKSk7CiAJaWYgKGdsKQogCQlnZnMyX2dsb2NrX3B1dChnbCk7Ci0JaWYgKGdsICYmIGdpLT5nbCA9PSBOVUxMKQotCQlnaS0+aGFzaCsrOwogCXdoaWxlIChnaS0+Z2wgPT0gTlVMTCkgeworCQlnaS0+aGFzaCsrOwogCQlpZiAoZ2ktPmhhc2ggPj0gR0ZTMl9HTF9IQVNIX1NJWkUpCiAJCQlyZXR1cm4gMTsKIAkJcmVhZF9sb2NrKGdsX2xvY2tfYWRkcihnaS0+aGFzaCkpOwpAQCAtMTgzMyw3ICsxODM1LDYgQEAKIAkJaWYgKGdpLT5nbCkKIAkJCWdmczJfZ2xvY2tfaG9sZChnaS0+Z2wpOwogCQlyZWFkX3VubG9jayhnbF9sb2NrX2FkZHIoZ2ktPmhhc2gpKTsKLQkJZ2ktPmhhc2grKzsKIAl9CiAKIAlpZiAoZ2ktPnNkcCAhPSBnaS0+Z2wtPmdsX3NiZCkKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suaCBiL2ZzL2dmczIvZ2xvY2suaAppbmRleCA5NzFkOTJhLi42OTVjNmIxIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmgKKysrIGIvZnMvZ2ZzMi9nbG9jay5oCkBAIC0yNCw3ICsyNCw2IEBACiAjZGVmaW5lIEdMX0FTWU5DCQkweDAwMDAwMDQwCiAjZGVmaW5lIEdMX0VYQUNUCQkweDAwMDAwMDgwCiAjZGVmaW5lIEdMX1NLSVAJCQkweDAwMDAwMTAwCi0jZGVmaW5lIEdMX0FUSU1FCQkweDAwMDAwMjAwCiAjZGVmaW5lIEdMX05PQ0FDSEUJCTB4MDAwMDA0MDAKIAogI2RlZmluZSBHTFJfVFJZRkFJTEVECQkxMwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbmNvcmUuaCBiL2ZzL2dmczIvaW5jb3JlLmgKaW5kZXggNDQ4Njk3YS4uZjU2NmVjMSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbmNvcmUuaAorKysgYi9mcy9nZnMyL2luY29yZS5oCkBAIC0zODYsMjAgKzM4NiwyMSBAQAogI2RlZmluZSBHRlMyX0RBVEFfT1JERVJFRAkyCiAKIHN0cnVjdCBnZnMyX2FyZ3MgewotCWNoYXIgYXJfbG9ja3Byb3RvW0dGUzJfTE9DS05BTUVfTEVOXTsgLyogTmFtZSBvZiB0aGUgTG9jayBQcm90b2NvbCAqLwotCWNoYXIgYXJfbG9ja3RhYmxlW0dGUzJfTE9DS05BTUVfTEVOXTsgLyogTmFtZSBvZiB0aGUgTG9jayBUYWJsZSAqLwotCWNoYXIgYXJfaG9zdGRhdGFbR0ZTMl9MT0NLTkFNRV9MRU5dOyAvKiBIb3N0IHNwZWNpZmljIGRhdGEgKi8KLQlpbnQgYXJfc3BlY3RhdG9yOyAvKiBEb24ndCBnZXQgYSBqb3VybmFsIGJlY2F1c2Ugd2UncmUgYWx3YXlzIFJPICovCi0JaW50IGFyX2lnbm9yZV9sb2NhbF9mczsgLyogRG9uJ3Qgb3B0aW1pemUgZXZlbiBpZiBsb2NhbF9mcyBpcyAxICovCi0JaW50IGFyX2xvY2FsZmxvY2tzOyAvKiBMZXQgdGhlIFZGUyBkbyBmbG9ja3xmY250bCBsb2NrcyBmb3IgdXMgKi8KLQlpbnQgYXJfbG9jYWxjYWNoaW5nOyAvKiBMb2NhbC1zdHlsZSBjYWNoaW5nIChkYW5nZXJvdXMgb24gbXVsdGlob3N0KSAqLwotCWludCBhcl9kZWJ1ZzsgLyogT29wcyBvbiBlcnJvcnMgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYmUgZ3JhY2VmdWwgKi8KLQlpbnQgYXJfdXBncmFkZTsgLyogVXBncmFkZSBvbmRpc2svbXVsdGlob3N0IGZvcm1hdCAqLwotCXVuc2lnbmVkIGludCBhcl9udW1fZ2xvY2tkOyAvKiBOdW1iZXIgb2YgZ2xvY2tkIHRocmVhZHMgKi8KLQlpbnQgYXJfcG9zaXhfYWNsOyAvKiBFbmFibGUgcG9zaXggYWNscyAqLwotCWludCBhcl9xdW90YTsgLyogb2ZmL2FjY291bnQvb24gKi8KLQlpbnQgYXJfc3VpZGRpcjsgLyogc3VpZGRpciBzdXBwb3J0ICovCi0JaW50IGFyX2RhdGE7IC8qIG9yZGVyZWQvd3JpdGViYWNrICovCisJY2hhciBhcl9sb2NrcHJvdG9bR0ZTMl9MT0NLTkFNRV9MRU5dOwkvKiBOYW1lIG9mIHRoZSBMb2NrIFByb3RvY29sICovCisJY2hhciBhcl9sb2NrdGFibGVbR0ZTMl9MT0NLTkFNRV9MRU5dOwkvKiBOYW1lIG9mIHRoZSBMb2NrIFRhYmxlICovCisJY2hhciBhcl9ob3N0ZGF0YVtHRlMyX0xPQ0tOQU1FX0xFTl07CS8qIEhvc3Qgc3BlY2lmaWMgZGF0YSAqLworCXVuc2lnbmVkIGludCBhcl9zcGVjdGF0b3I6MTsJCS8qIERvbid0IGdldCBhIGpvdXJuYWwgKi8KKwl1bnNpZ25lZCBpbnQgYXJfaWdub3JlX2xvY2FsX2ZzOjE7CS8qIElnbm9yZSBvcHRpbWlzYXRpb25zICovCisJdW5zaWduZWQgaW50IGFyX2xvY2FsZmxvY2tzOjE7CQkvKiBMZXQgdGhlIFZGUyBkbyBmbG9ja3xmY250bCAqLworCXVuc2lnbmVkIGludCBhcl9sb2NhbGNhY2hpbmc6MTsJCS8qIExvY2FsIGNhY2hpbmcgKi8KKwl1bnNpZ25lZCBpbnQgYXJfZGVidWc6MTsJCS8qIE9vcHMgb24gZXJyb3JzICovCisJdW5zaWduZWQgaW50IGFyX3VwZ3JhZGU6MTsJCS8qIFVwZ3JhZGUgb25kaXNrIGZvcm1hdCAqLworCXVuc2lnbmVkIGludCBhcl9wb3NpeF9hY2w6MTsJCS8qIEVuYWJsZSBwb3NpeCBhY2xzICovCisJdW5zaWduZWQgaW50IGFyX3F1b3RhOjI7CQkvKiBvZmYvYWNjb3VudC9vbiAqLworCXVuc2lnbmVkIGludCBhcl9zdWlkZGlyOjE7CQkvKiBzdWlkZGlyIHN1cHBvcnQgKi8KKwl1bnNpZ25lZCBpbnQgYXJfZGF0YToyOwkJCS8qIG9yZGVyZWQvd3JpdGViYWNrICovCisJdW5zaWduZWQgaW50IGFyX21ldGE6MTsJCQkvKiBtb3VudCBtZXRhZnMgKi8KKwl1bnNpZ25lZCBpbnQgYXJfbnVtX2dsb2NrZDsJCS8qIE51bWJlciBvZiBnbG9ja2QgdGhyZWFkcyAqLwogfTsKIAogc3RydWN0IGdmczJfdHVuZSB7CkBAIC00MTksNyArNDIwLDYgQEAKIAl1bnNpZ25lZCBpbnQgZ3RfcXVvdGFfc2NhbGVfZGVuOyAvKiBEZW5vbWluYXRvciAqLwogCXVuc2lnbmVkIGludCBndF9xdW90YV9jYWNoZV9zZWNzOwogCXVuc2lnbmVkIGludCBndF9xdW90YV9xdWFudHVtOyAvKiBTZWNzIGJldHdlZW4gc3luY3MgdG8gcXVvdGEgZmlsZSAqLwotCXVuc2lnbmVkIGludCBndF9hdGltZV9xdWFudHVtOyAvKiBNaW4gc2VjcyBiZXR3ZWVuIGF0aW1lIHVwZGF0ZXMgKi8KIAl1bnNpZ25lZCBpbnQgZ3RfbmV3X2ZpbGVzX2pkYXRhOwogCXVuc2lnbmVkIGludCBndF9tYXhfcmVhZGFoZWFkOyAvKiBNYXggYnl0ZXMgdG8gcmVhZC1haGVhZCBmcm9tIGRpc2sgKi8KIAl1bnNpZ25lZCBpbnQgZ3Rfc3RhbGxfc2VjczsgLyogRGV0ZWN0cyB0cm91YmxlISAqLwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJU0RGX0pPVVJOQUxfQ0hFQ0tFRAk9IDAsCiAJU0RGX0pPVVJOQUxfTElWRQk9IDEsCiAJU0RGX1NIVVRET1dOCQk9IDIsCi0JU0RGX05PQVRJTUUJCT0gMywKKwlTREZfTk9CQVJSSUVSUwkJPSAzLAogfTsKIAogI2RlZmluZSBHRlMyX0ZTTkFNRV9MRU4JCTI1NgpAQCAtNDYxLDcgKzQ2MSw2IEBACiAKIHN0cnVjdCBnZnMyX3NiZCB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzZF92ZnM7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzZF92ZnNfbWV0YTsKIAlzdHJ1Y3Qga29iamVjdCBzZF9rb2JqOwogCXVuc2lnbmVkIGxvbmcgc2RfZmxhZ3M7CS8qIFNERl8uLi4gKi8KIAlzdHJ1Y3QgZ2ZzMl9zYl9ob3N0IHNkX3NiOwpAQCAtNDk5LDcgKzQ5OCw5IEBACiAKIAkvKiBJbm9kZSBTdHVmZiAqLwogCi0Jc3RydWN0IGlub2RlICpzZF9tYXN0ZXJfZGlyOworCXN0cnVjdCBkZW50cnkgKnNkX21hc3Rlcl9kaXI7CisJc3RydWN0IGRlbnRyeSAqc2Rfcm9vdF9kaXI7CisKIAlzdHJ1Y3QgaW5vZGUgKnNkX2ppbmRleDsKIAlzdHJ1Y3QgaW5vZGUgKnNkX2ludW1faW5vZGU7CiAJc3RydWN0IGlub2RlICpzZF9zdGF0ZnNfaW5vZGU7CkBAIC02MzQsNyArNjM1LDYgQEAKIAkvKiBEZWJ1Z2dpbmcgY3J1ZCAqLwogCiAJdW5zaWduZWQgbG9uZyBzZF9sYXN0X3dhcm5pbmc7Ci0Jc3RydWN0IHZmc21vdW50ICpzZF9nZnMybW50OwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOyAgICAvKiBkZWJ1Z2ZzIGRpcmVjdG9yeSAqLwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5X2dsb2NrczsgLyogZm9yIGRlYnVnZnMgKi8KIH07CmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmMgYi9mcy9nZnMyL2lub2RlLmMKaW5kZXggOGIwODA2YS4uN2NlZTY5NSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5jCisrKyBiL2ZzL2dmczIvaW5vZGUuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC0yNDksNiArMjUwLDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCAqZGkgPSAmaXAtPmlfZGk7CiAJY29uc3Qgc3RydWN0IGdmczJfZGlub2RlICpzdHIgPSBidWY7CisJc3RydWN0IHRpbWVzcGVjIGF0aW1lOwogCXUxNiBoZWlnaHQsIGRlcHRoOwogCiAJaWYgKHVubGlrZWx5KGlwLT5pX25vX2FkZHIgIT0gYmU2NF90b19jcHUoc3RyLT5kaV9udW0ubm9fYWRkcikpKQpAQCAtMjc1LDggKzI3NywxMCBAQAogCWRpLT5kaV9zaXplID0gYmU2NF90b19jcHUoc3RyLT5kaV9zaXplKTsKIAlpX3NpemVfd3JpdGUoJmlwLT5pX2lub2RlLCBkaS0+ZGlfc2l6ZSk7CiAJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSwgYmU2NF90b19jcHUoc3RyLT5kaV9ibG9ja3MpKTsKLQlpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfYXRpbWUpOwotCWlwLT5pX2lub2RlLmlfYXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfYXRpbWVfbnNlYyk7CisJYXRpbWUudHZfc2VjID0gYmU2NF90b19jcHUoc3RyLT5kaV9hdGltZSk7CisJYXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfYXRpbWVfbnNlYyk7CisJaWYgKHRpbWVzcGVjX2NvbXBhcmUoJmlwLT5pX2lub2RlLmlfYXRpbWUsICZhdGltZSkgPCAwKQorCQlpcC0+aV9pbm9kZS5pX2F0aW1lID0gYXRpbWU7CiAJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBiZTY0X3RvX2NwdShzdHItPmRpX210aW1lKTsKIAlpcC0+aV9pbm9kZS5pX210aW1lLnR2X25zZWMgPSBiZTMyX3RvX2NwdShzdHItPmRpX210aW1lX25zZWMpOwogCWlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gYmU2NF90b19jcHUoc3RyLT5kaV9jdGltZSk7CkBAIC0xMDMzLDEzICsxMDM3LDExIEBACiAKIAlpZiAoYmgpCiAJCWJyZWxzZShiaCk7Ci0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJcmV0dXJuIGlub2RlOwogCiBmYWlsX2d1bmxvY2syOgogCWdmczJfZ2xvY2tfZHFfdW5pbml0KGdocyArIDEpOwotCWlmIChpbm9kZSkKKwlpZiAoaW5vZGUgJiYgIUlTX0VSUihpbm9kZSkpCiAJCWlwdXQoaW5vZGUpOwogZmFpbF9ndW5sb2NrOgogCWdmczJfZ2xvY2tfZHEoZ2hzKTsKQEAgLTExNDAsNTQgKzExNDIsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogZ2ZzMl9va190b19tb3ZlIC0gY2hlY2sgaWYgaXQncyBvayB0byBtb3ZlIGEgZGlyZWN0b3J5IHRvIGFub3RoZXIgZGlyZWN0b3J5Ci0gKiBAdGhpczogbW92ZSB0aGlzCi0gKiBAdG86IHRvIGhlcmUKLSAqCi0gKiBGb2xsb3cgQHRvIGJhY2sgdG8gdGhlIHJvb3QgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBlbmNvdW50ZXIgQHRoaXMKLSAqIEFzc3VtZXMgd2UgYWxyZWFkeSBob2xkIHRoZSByZW5hbWUgbG9jay4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX29rX3RvX21vdmUoc3RydWN0IGdmczJfaW5vZGUgKnRoaXMsIHN0cnVjdCBnZnMyX2lub2RlICp0bykKLXsKLQlzdHJ1Y3QgaW5vZGUgKmRpciA9ICZ0by0+aV9pbm9kZTsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOwotCXN0cnVjdCBpbm9kZSAqdG1wOwotCXN0cnVjdCBxc3RyIGRvdGRvdDsKLQlpbnQgZXJyb3IgPSAwOwotCi0JZ2ZzMl9zdHIycXN0cigmZG90ZG90LCAiLi4iKTsKLQotCWlncmFiKGRpcik7Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChkaXIgPT0gJnRoaXMtPmlfaW5vZGUpIHsKLQkJCWVycm9yID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChkaXIgPT0gc2ItPnNfcm9vdC0+ZF9pbm9kZSkgewotCQkJZXJyb3IgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl0bXAgPSBnZnMyX2xvb2t1cGkoZGlyLCAmZG90ZG90LCAxKTsKLQkJaWYgKElTX0VSUih0bXApKSB7Ci0JCQllcnJvciA9IFBUUl9FUlIodG1wKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaXB1dChkaXIpOwotCQlkaXIgPSB0bXA7Ci0JfQotCi0JaXB1dChkaXIpOwotCi0JcmV0dXJuIGVycm9yOwotfQotCiAvKioKICAqIGdmczJfcmVhZGxpbmtpIC0gcmV0dXJuIHRoZSBjb250ZW50cyBvZiBhIHN5bWxpbmsKICAqIEBpcDogdGhlIHN5bWxpbmsncyBpbm9kZQpAQCAtMTIwNyw4ICsxMTYxLDggQEAKIAl1bnNpZ25lZCBpbnQgeDsKIAlpbnQgZXJyb3I7CiAKLQlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIEdMX0FUSU1FLCAmaV9naCk7Ci0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX2F0aW1lKCZpX2doKTsKKwlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsICZpX2doKTsKKwllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlfZ2gpOwogCWlmIChlcnJvcikgewogCQlnZnMyX2hvbGRlcl91bmluaXQoJmlfZ2gpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC0xMjQzLDEwMSArMTE5Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKioKLSAqIGdmczJfZ2xvY2tfbnFfYXRpbWUgLSBBY3F1aXJlIGEgaG9sZCBvbiBhbiBpbm9kZSdzIGdsb2NrLCBhbmQKLSAqICAgICAgIGNvbmRpdGlvbmFsbHkgdXBkYXRlIHRoZSBpbm9kZSdzIGF0aW1lCi0gKiBAZ2g6IHRoZSBob2xkZXIgdG8gYWNxdWlyZQotICoKLSAqIFRlc3RzIGF0aW1lIChhY2Nlc3MgdGltZSkgZm9yIGdmczJfcmVhZCwgZ2ZzMl9yZWFkZGlyIGFuZCBnZnMyX21tYXAKLSAqIFVwZGF0ZSBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBpbm9kZSdzIGN1cnJlbnQKLSAqIGF0aW1lIGlzIGdyZWF0ZXIgdGhhbiBhbiBpbnRlcnZhbCBzcGVjaWZpZWQgYXQgbW91bnQuCi0gKgotICogUmV0dXJuczogZXJybm8KLSAqLwotCi1pbnQgZ2ZzMl9nbG9ja19ucV9hdGltZShzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKQotewotCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGdoLT5naF9nbDsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGdsLT5nbF9zYmQ7Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gZ2wtPmdsX29iamVjdDsKLQlzNjQgcXVhbnR1bSA9IGdmczJfdHVuZV9nZXQoc2RwLCBndF9hdGltZV9xdWFudHVtKTsKLQl1bnNpZ25lZCBpbnQgc3RhdGU7Ci0JaW50IGZsYWdzOwotCWludCBlcnJvcjsKLQlzdHJ1Y3QgdGltZXNwZWMgdHYgPSBDVVJSRU5UX1RJTUU7Ci0KLQlpZiAoZ2ZzMl9hc3NlcnRfd2FybihzZHAsIGdoLT5naF9mbGFncyAmIEdMX0FUSU1FKSB8fAotCSAgICBnZnMyX2Fzc2VydF93YXJuKHNkcCwgIShnaC0+Z2hfZmxhZ3MgJiBHTF9BU1lOQykpIHx8Ci0JICAgIGdmczJfYXNzZXJ0X3dhcm4oc2RwLCBnbC0+Z2xfb3BzID09ICZnZnMyX2lub2RlX2dsb3BzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdGF0ZSA9IGdoLT5naF9zdGF0ZTsKLQlmbGFncyA9IGdoLT5naF9mbGFnczsKLQotCWVycm9yID0gZ2ZzMl9nbG9ja19ucShnaCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlpZiAodGVzdF9iaXQoU0RGX05PQVRJTUUsICZzZHAtPnNkX2ZsYWdzKSB8fAotCSAgICAoc2RwLT5zZF92ZnMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQotCQlyZXR1cm4gMDsKLQotCWlmICh0di50dl9zZWMgLSBpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X3NlYyA+PSBxdWFudHVtKSB7Ci0JCWdmczJfZ2xvY2tfZHEoZ2gpOwotCQlnZnMyX2hvbGRlcl9yZWluaXQoTE1fU1RfRVhDTFVTSVZFLCBnaC0+Z2hfZmxhZ3MgJiB+TE1fRkxBR19BTlksCi0JCQkJICAgZ2gpOwotCQllcnJvciA9IGdmczJfZ2xvY2tfbnEoZ2gpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0KLQkJLyogVmVyaWZ5IHRoYXQgYXRpbWUgaGFzbid0IGJlZW4gdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlCi0JCSAgIHRyeWluZyB0byBnZXQgZXhjbHVzaXZlIGxvY2suICovCi0KLQkJdHYgPSBDVVJSRU5UX1RJTUU7Ci0JCWlmICh0di50dl9zZWMgLSBpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X3NlYyA+PSBxdWFudHVtKSB7Ci0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmg7Ci0JCQlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpOwotCi0JCQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKLQkJCWlmIChlcnJvciA9PSAtRVJPRlMpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJZ290byBmYWlsOwotCi0JCQllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKLQkJCWlmIChlcnJvcikKLQkJCQlnb3RvIGZhaWxfZW5kX3RyYW5zOwotCi0JCQlpcC0+aV9pbm9kZS5pX2F0aW1lID0gdHY7Ci0KLQkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWRpYmgtPmJfZGF0YTsKLQkJCWRpLT5kaV9hdGltZSA9IGNwdV90b19iZTY0KGlwLT5pX2lub2RlLmlfYXRpbWUudHZfc2VjKTsKLQkJCWRpLT5kaV9hdGltZV9uc2VjID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV9hdGltZS50dl9uc2VjKTsKLQkJCWJyZWxzZShkaWJoKTsKLQotCQkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKLQkJfQotCi0JCS8qIElmIHNvbWVvbmUgZWxzZSBoYXMgYXNrZWQgZm9yIHRoZSBnbG9jaywKLQkJICAgdW5sb2NrIGFuZCBsZXQgdGhlbSBoYXZlIGl0LiBUaGVuIHJlYWNxdWlyZQotCQkgICBpbiB0aGUgb3JpZ2luYWwgc3RhdGUuICovCi0JCWlmIChnZnMyX2dsb2NrX2lzX2Jsb2NraW5nKGdsKSkgewotCQkJZ2ZzMl9nbG9ja19kcShnaCk7Ci0JCQlnZnMyX2hvbGRlcl9yZWluaXQoc3RhdGUsIGZsYWdzLCBnaCk7Ci0JCQlyZXR1cm4gZ2ZzMl9nbG9ja19ucShnaCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbF9lbmRfdHJhbnM6Ci0JZ2ZzMl90cmFuc19lbmQoc2RwKTsKLWZhaWw6Ci0JZ2ZzMl9nbG9ja19kcShnaCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiBzdGF0aWMgaW50CiBfX2dmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmggYi9mcy9nZnMyL2lub2RlLmgKaW5kZXggNThmOTYwNy4uMmQ0M2Y2OSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5oCisrKyBiL2ZzL2dmczIvaW5vZGUuaApAQCAtOTEsOSArOTEsNyBAQAogaW50IGdmczJfdW5saW5rX29rKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAogCQkgICBjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogaW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7Ci1pbnQgZ2ZzMl9va190b19tb3ZlKHN0cnVjdCBnZnMyX2lub2RlICp0aGlzLCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqdG8pOwogaW50IGdmczJfcmVhZGxpbmtpKHN0cnVjdCBnZnMyX2lub2RlICppcCwgY2hhciAqKmJ1ZiwgdW5zaWduZWQgaW50ICpsZW4pOwotaW50IGdmczJfZ2xvY2tfbnFfYXRpbWUoc3RydWN0IGdmczJfaG9sZGVyICpnaCk7CiBpbnQgZ2ZzMl9zZXRhdHRyX3NpbXBsZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBzdHJ1Y3QgaW5vZGUgKmdmczJfbG9va3VwX3NpbXBsZShzdHJ1Y3QgaW5vZGUgKmRpcCwgY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIGdmczJfZGlub2RlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHZvaWQgKmJ1Zik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMgYi9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMKaW5kZXggMDlkNzhjMi4uMGM0Y2JlNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9sb2NraW5nL2RsbS9tb3VudC5jCisrKyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vbW91bnQuYwpAQCAtMTQ0LDcgKzE0NCw4IEBACiAKIAllcnJvciA9IGRsbV9uZXdfbG9ja3NwYWNlKGxzLT5mc25hbWUsIHN0cmxlbihscy0+ZnNuYW1lKSwKIAkJCQkgICZscy0+ZGxtX2xvY2tzcGFjZSwKLQkJCQkgIERMTV9MU0ZMX0ZTIHwgKG5vZGlyID8gRExNX0xTRkxfTk9ESVIgOiAwKSwKKwkJCQkgIERMTV9MU0ZMX0ZTIHwgRExNX0xTRkxfTkVXRVhDTCB8CisJCQkJICAobm9kaXIgPyBETE1fTFNGTF9OT0RJUiA6IDApLAogCQkJCSAgR0RMTV9MVkJfU0laRSk7CiAJaWYgKGVycm9yKSB7CiAJCWxvZ19lcnJvcigiZGxtX25ld19sb2Nrc3BhY2UgZXJyb3IgJWQiLCBlcnJvcik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5jIGIvZnMvZ2ZzMi9sb2cuYwppbmRleCA2YzZhZjlmLi5hZDMwNTg1IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5jCisrKyBiL2ZzL2dmczIvbG9nLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC01ODQsNyArNTg1LDYgQEAKIAltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYmgtPmJfc2l6ZSk7CiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQl1bmxvY2tfYnVmZmVyKGJoKTsKIAogCWdmczJfYWlsMV9lbXB0eShzZHAsIDApOwogCXRhaWwgPSBjdXJyZW50X3RhaWwoc2RwKTsKQEAgLTYwMSw4ICs2MDEsMjMgQEAKIAloYXNoID0gZ2ZzMl9kaXNrX2hhc2goYmgtPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBnZnMyX2xvZ19oZWFkZXIpKTsKIAlsaC0+bGhfaGFzaCA9IGNwdV90b19iZTMyKGhhc2gpOwogCi0Jc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0JaWYgKHN5bmNfZGlydHlfYnVmZmVyKGJoKSkKKwliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJaWYgKHRlc3RfYml0KFNERl9OT0JBUlJJRVJTLCAmc2RwLT5zZF9mbGFncykpCisJCWdvdG8gc2tpcF9iYXJyaWVyOworCWdldF9iaChiaCk7CisJc3VibWl0X2JoKFdSSVRFX0JBUlJJRVIgfCAoMSA8PCBCSU9fUldfTUVUQSksIGJoKTsKKwl3YWl0X29uX2J1ZmZlcihiaCk7CisJaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSkgeworCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlzZXRfYml0KFNERl9OT0JBUlJJRVJTLCAmc2RwLT5zZF9mbGFncyk7CisJCWxvY2tfYnVmZmVyKGJoKTsKK3NraXBfYmFycmllcjoKKwkJZ2V0X2JoKGJoKTsKKwkJc3VibWl0X2JoKFdSSVRFX1NZTkMgfCAoMSA8PCBCSU9fUldfTUVUQSksIGJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCiAJCWdmczJfaW9fZXJyb3JfYmgoc2RwLCBiaCk7CiAJYnJlbHNlKGJoKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9tb3VudC5jIGIvZnMvZ2ZzMi9tb3VudC5jCmluZGV4IGI5NDFmOWYuLmY5NmViOTAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbW91bnQuYworKysgYi9mcy9nZnMyL21vdW50LmMKQEAgLTQyLDEwICs0MiwxMSBAQAogCU9wdF9ub3N1aWRkaXIsCiAJT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9kYXRhX29yZGVyZWQsCisJT3B0X21ldGEsCiAJT3B0X2VyciwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X2xvY2twcm90bywgImxvY2twcm90bz0lcyJ9LAogCXtPcHRfbG9ja3RhYmxlLCAibG9ja3RhYmxlPSVzIn0sCiAJe09wdF9ob3N0ZGF0YSwgImhvc3RkYXRhPSVzIn0sCkBAIC02Niw2ICs2Nyw3IEBACiAJe09wdF9ub3N1aWRkaXIsICJub3N1aWRkaXIifSwKIAl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKIAl7T3B0X2RhdGFfb3JkZXJlZCwgImRhdGE9b3JkZXJlZCJ9LAorCXtPcHRfbWV0YSwgIm1ldGEifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTIzOSw2ICsyNDEsMTEgQEAKIAkJY2FzZSBPcHRfZGF0YV9vcmRlcmVkOgogCQkJYXJncy0+YXJfZGF0YSA9IEdGUzJfREFUQV9PUkRFUkVEOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X21ldGE6CisJCQlpZiAocmVtb3VudCAmJiBhcmdzLT5hcl9tZXRhICE9IDEpCisJCQkJZ290byBjYW50X3JlbW91bnQ7CisJCQlhcmdzLT5hcl9tZXRhID0gMTsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9lcnI6CiAJCWRlZmF1bHQ6CiAJCQlmc19pbmZvKHNkcCwgInVua25vd24gb3B0aW9uOiAlc1xuIiwgbyk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19hZGRyZXNzLmMgYi9mcy9nZnMyL29wc19hZGRyZXNzLmMKaW5kZXggZTY0YTFiMC4uMjc1NjM4MSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCisrKyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwpAQCAtNTEyLDggKzUxMiw4IEBACiAJaW50IGVycm9yOwogCiAJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBHTF9BVElNRSwgJmdoKTsKLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfYXRpbWUoJmdoKTsKKwlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsICZnaCk7CisJZXJyb3IgPSBnZnMyX2dsb2NrX25xKCZnaCk7CiAJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJZ290byBvdXQ7CiAJZXJyb3IgPSBBT1BfVFJVTkNBVEVEX1BBR0U7CkBAIC01OTQsOCArNTk0LDggQEAKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJaW50IHJldDsKIAotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgR0xfQVRJTUUsICZnaCk7Ci0JcmV0ID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmZ2gpOworCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJmdoKTsKKwlyZXQgPSBnZnMyX2dsb2NrX25xKCZnaCk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCWdvdG8gb3V0X3VuaW5pdDsKIAlpZiAoIWdmczJfaXNfc3R1ZmZlZChpcCkpCkBAIC02MzYsOCArNjM2LDggQEAKIAl1bnNpZ25lZCB0byA9IGZyb20gKyBsZW47CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIEdMX0FUSU1FLCAmaXAtPmlfZ2gpOwotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmaXAtPmlfZ2gpOworCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmlwLT5pX2doKTsKKwllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlwLT5pX2doKTsKIAlpZiAodW5saWtlbHkoZXJyb3IpKQogCQlnb3RvIG91dF91bmluaXQ7CiAKQEAgLTk3NSw3ICs5NzUsNyBAQAogCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKQogCQlyZXR1cm4gMDsKIAotCWlmIChvZmZzZXQgPiBpX3NpemVfcmVhZCgmaXAtPmlfaW5vZGUpKQorCWlmIChvZmZzZXQgPj0gaV9zaXplX3JlYWQoJmlwLT5pX2lub2RlKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CkBAIC0xMDAwLDggKzEwMDAsOCBAQAogCSAqIHVuZm9ydHVuYXRlbHkgaGF2ZSB0aGUgb3B0aW9uIG9mIG9ubHkgZmx1c2hpbmcgYSByYW5nZSBsaWtlCiAJICogdGhlIFZGUyBkb2VzLgogCSAqLwotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0RFRkVSUkVELCBHTF9BVElNRSwgJmdoKTsKLQlydiA9IGdmczJfZ2xvY2tfbnFfYXRpbWUoJmdoKTsKKwlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9ERUZFUlJFRCwgMCwgJmdoKTsKKwlydiA9IGdmczJfZ2xvY2tfbnEoJmdoKTsKIAlpZiAocnYpCiAJCXJldHVybiBydjsKIAlydiA9IGdmczJfb2tfZm9yX2RpbyhpcCwgcncsIG9mZnNldCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19maWxlLmMgYi9mcy9nZnMyL29wc19maWxlLmMKaW5kZXggZTlhMzY2ZC4uM2E3NDdmOCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZmlsZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZpbGUuYwpAQCAtODksOCArODksOCBAQAogCXU2NCBvZmZzZXQgPSBmaWxlLT5mX3BvczsKIAlpbnQgZXJyb3I7CiAKLQlnZnMyX2hvbGRlcl9pbml0KGRpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBHTF9BVElNRSwgJmRfZ2gpOwotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmZF9naCk7CisJZ2ZzMl9ob2xkZXJfaW5pdChkaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJmRfZ2gpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmZF9naCk7CiAJaWYgKGVycm9yKSB7CiAJCWdmczJfaG9sZGVyX3VuaW5pdCgmZF9naCk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTE1Myw4ICsxNTMsOCBAQAogCWludCBlcnJvcjsKIAl1MzIgZnNmbGFnczsKIAotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgR0xfQVRJTUUsICZnaCk7Ci0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX2F0aW1lKCZnaCk7CisJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCAwLCAmZ2gpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmZ2gpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0zNTEsOCArMzUxLDggQEAKIAlzdHJ1Y3QgZ2ZzMl9hbGxvYyAqYWw7CiAJaW50IHJldDsKIAotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgR0xfQVRJTUUsICZnaCk7Ci0JcmV0ID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmZ2gpOworCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKKwlyZXQgPSBnZnMyX2dsb2NrX25xKCZnaCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTQzNCw4ICs0MzQsOCBAQAogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwogCWludCBlcnJvcjsKIAotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgR0xfQVRJTUUsICZpX2doKTsKLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfYXRpbWUoJmlfZ2gpOworCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJmlfZ2gpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmaV9naCk7CiAJaWYgKGVycm9yKSB7CiAJCWdmczJfaG9sZGVyX3VuaW5pdCgmaV9naCk7CiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggYjRkMWQ2NC4uYjExN2ZjZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTQwLDYgKzQwLDQ0IEBACiAjZGVmaW5lIERPIDAKICNkZWZpbmUgVU5ETyAxCiAKK3N0YXRpYyBjb25zdCB1MzIgZ2ZzMl9vbGRfZnNfZm9ybWF0c1tdID0geworICAgICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIGdmczJfb2xkX211bHRpaG9zdF9mb3JtYXRzW10gPSB7CisgICAgICAgIDAKK307CisKKy8qKgorICogZ2ZzMl90dW5lX2luaXQgLSBGaWxsIGEgZ2ZzMl90dW5lIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCisgKiBAZ3Q6IHR1bmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl90dW5lX2luaXQoc3RydWN0IGdmczJfdHVuZSAqZ3QpCit7CisJc3Bpbl9sb2NrX2luaXQoJmd0LT5ndF9zcGluKTsKKworCWd0LT5ndF9kZW1vdGVfc2VjcyA9IDMwMDsKKwlndC0+Z3RfaW5jb3JlX2xvZ19ibG9ja3MgPSAxMDI0OworCWd0LT5ndF9sb2dfZmx1c2hfc2VjcyA9IDYwOworCWd0LT5ndF9yZWNvdmVyZF9zZWNzID0gNjA7CisJZ3QtPmd0X2xvZ2Rfc2VjcyA9IDE7CisJZ3QtPmd0X3F1b3RhZF9zZWNzID0gNTsKKwlndC0+Z3RfcXVvdGFfc2ltdWxfc3luYyA9IDY0OworCWd0LT5ndF9xdW90YV93YXJuX3BlcmlvZCA9IDEwOworCWd0LT5ndF9xdW90YV9zY2FsZV9udW0gPSAxOworCWd0LT5ndF9xdW90YV9zY2FsZV9kZW4gPSAxOworCWd0LT5ndF9xdW90YV9jYWNoZV9zZWNzID0gMzAwOworCWd0LT5ndF9xdW90YV9xdWFudHVtID0gNjA7CisJZ3QtPmd0X25ld19maWxlc19qZGF0YSA9IDA7CisJZ3QtPmd0X21heF9yZWFkYWhlYWQgPSAxIDw8IDE4OworCWd0LT5ndF9zdGFsbF9zZWNzID0gNjAwOworCWd0LT5ndF9jb21wbGFpbl9zZWNzID0gMTA7CisJZ3QtPmd0X3N0YXRmc19xdWFudHVtID0gMzA7CisJZ3QtPmd0X3N0YXRmc19zbG93ID0gMDsKK30KKwogc3RhdGljIHN0cnVjdCBnZnMyX3NiZCAqaW5pdF9zYmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcDsKQEAgLTk2LDIxICsxMzQsMjcxIEBACiAJcmV0dXJuIHNkcDsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF92ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbm9hdGltZSkKKworLyoqCisgKiBnZnMyX2NoZWNrX3NiIC0gQ2hlY2sgc3VwZXJibG9jaworICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqIEBzYjogVGhlIHN1cGVyYmxvY2sKKyAqIEBzaWxlbnQ6IERvbid0IHByaW50IGEgbWVzc2FnZSBpZiB0aGUgY2hlY2sgZmFpbHMKKyAqCisgKiBDaGVja3MgdGhlIHZlcnNpb24gY29kZSBvZiB0aGUgRlMgaXMgb25lIHRoYXQgd2UgdW5kZXJzdGFuZCBob3cgdG8KKyAqIHJlYWQgYW5kIHRoYXQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIG9uLWRpc2sgc3RydWN0dXJlcyBoYXZlIG5vdAorICogY2hhbmdlZC4KKyAqLworCitzdGF0aWMgaW50IGdmczJfY2hlY2tfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3NiX2hvc3QgKnNiLCBpbnQgc2lsZW50KQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItPnNfZnNfaW5mbzsKKwl1bnNpZ25lZCBpbnQgeDsKIAotCXNiLT5zX21hZ2ljID0gR0ZTMl9NQUdJQzsKLQlzYi0+c19vcCA9ICZnZnMyX3N1cGVyX29wczsKLQlzYi0+c19leHBvcnRfb3AgPSAmZ2ZzMl9leHBvcnRfb3BzOwotCXNiLT5zX3RpbWVfZ3JhbiA9IDE7Ci0Jc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCWlmIChzYi0+c2JfbWFnaWMgIT0gR0ZTMl9NQUdJQyB8fAorCSAgICBzYi0+c2JfdHlwZSAhPSBHRlMyX01FVEFUWVBFX1NCKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiR0ZTMjogbm90IGEgR0ZTMiBmaWxlc3lzdGVtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKHNiLT5zX2ZsYWdzICYgKE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FKSkKLQkJc2V0X2JpdChub2F0aW1lLCAmc2RwLT5zZF9mbGFncyk7CisJLyogIElmIGZvcm1hdCBudW1iZXJzIG1hdGNoIGV4YWN0bHksIHdlJ3JlIGRvbmUuICAqLwogCi0JLyogRG9uJ3QgbGV0IHRoZSBWRlMgdXBkYXRlIGF0aW1lcy4gIEdGUzIgaGFuZGxlcyB0aGlzIGl0c2VsZi4gKi8KLQlzYi0+c19mbGFncyB8PSBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwlpZiAoc2ItPnNiX2ZzX2Zvcm1hdCA9PSBHRlMyX0ZPUk1BVF9GUyAmJgorCSAgICBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCA9PSBHRlMyX0ZPUk1BVF9NVUxUSSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2ItPnNiX2ZzX2Zvcm1hdCAhPSBHRlMyX0ZPUk1BVF9GUykgeworCQlmb3IgKHggPSAwOyBnZnMyX29sZF9mc19mb3JtYXRzW3hdOyB4KyspCisJCQlpZiAoZ2ZzMl9vbGRfZnNfZm9ybWF0c1t4XSA9PSBzYi0+c2JfZnNfZm9ybWF0KQorCQkJCWJyZWFrOworCisJCWlmICghZ2ZzMl9vbGRfZnNfZm9ybWF0c1t4XSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJHRlMyOiBjb2RlIHZlcnNpb24gKCV1LCAldSkgaXMgaW5jb21wYXRpYmxlICIKKwkJCSAgICAgICAid2l0aCBvbmRpc2sgZm9ybWF0ICgldSwgJXUpXG4iLAorCQkJICAgICAgIEdGUzJfRk9STUFUX0ZTLCBHRlMyX0ZPUk1BVF9NVUxUSSwKKwkJCSAgICAgICBzYi0+c2JfZnNfZm9ybWF0LCBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkdGUzI6IEkgZG9uJ3Qga25vdyBob3cgdG8gdXBncmFkZSB0aGlzIEZTXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKHNiLT5zYl9tdWx0aWhvc3RfZm9ybWF0ICE9IEdGUzJfRk9STUFUX01VTFRJKSB7CisJCWZvciAoeCA9IDA7IGdmczJfb2xkX211bHRpaG9zdF9mb3JtYXRzW3hdOyB4KyspCisJCQlpZiAoZ2ZzMl9vbGRfbXVsdGlob3N0X2Zvcm1hdHNbeF0gPT0KKwkJCSAgICBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCkKKwkJCQlicmVhazsKKworCQlpZiAoIWdmczJfb2xkX211bHRpaG9zdF9mb3JtYXRzW3hdKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkdGUzI6IGNvZGUgdmVyc2lvbiAoJXUsICV1KSBpcyBpbmNvbXBhdGlibGUgIgorCQkJICAgICAgICJ3aXRoIG9uZGlzayBmb3JtYXQgKCV1LCAldSlcbiIsCisJCQkgICAgICAgR0ZTMl9GT1JNQVRfRlMsIEdGUzJfRk9STUFUX01VTFRJLAorCQkJICAgICAgIHNiLT5zYl9mc19mb3JtYXQsIHNiLT5zYl9tdWx0aWhvc3RfZm9ybWF0KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiR0ZTMjogSSBkb24ndCBrbm93IGhvdyB0byB1cGdyYWRlIHRoaXMgRlNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIXNkcC0+c2RfYXJncy5hcl91cGdyYWRlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHRlMyOiBjb2RlIHZlcnNpb24gKCV1LCAldSkgaXMgaW5jb21wYXRpYmxlICIKKwkJICAgICAgICJ3aXRoIG9uZGlzayBmb3JtYXQgKCV1LCAldSlcbiIsCisJCSAgICAgICBHRlMyX0ZPUk1BVF9GUywgR0ZTMl9GT1JNQVRfTVVMVEksCisJCSAgICAgICBzYi0+c2JfZnNfZm9ybWF0LCBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJHRlMyOiBVc2UgdGhlIFwidXBncmFkZVwiIG1vdW50IG9wdGlvbiB0byB1cGdyYWRlICIKKwkJICAgICAgICJ0aGUgRlNcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJHRlMyOiBTZWUgdGhlIG1hbnVhbCBmb3IgbW9yZSBkZXRhaWxzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9iaW9faW9fcGFnZShzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJpby0+YmlfcHJpdmF0ZTsKKworCWlmICghZXJyb3IpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdmczI6IGVycm9yICVkIHJlYWRpbmcgc3VwZXJibG9ja1xuIiwgZXJyb3IpOworCXVubG9ja19wYWdlKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBnZnMyX3NiX2luKHN0cnVjdCBnZnMyX3NiX2hvc3QgKnNiLCBjb25zdCB2b2lkICpidWYpCit7CisJY29uc3Qgc3RydWN0IGdmczJfc2IgKnN0ciA9IGJ1ZjsKKworCXNiLT5zYl9tYWdpYyA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfaGVhZGVyLm1oX21hZ2ljKTsKKwlzYi0+c2JfdHlwZSA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfaGVhZGVyLm1oX3R5cGUpOworCXNiLT5zYl9mb3JtYXQgPSBiZTMyX3RvX2NwdShzdHItPnNiX2hlYWRlci5taF9mb3JtYXQpOworCXNiLT5zYl9mc19mb3JtYXQgPSBiZTMyX3RvX2NwdShzdHItPnNiX2ZzX2Zvcm1hdCk7CisJc2ItPnNiX211bHRpaG9zdF9mb3JtYXQgPSBiZTMyX3RvX2NwdShzdHItPnNiX211bHRpaG9zdF9mb3JtYXQpOworCXNiLT5zYl9ic2l6ZSA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfYnNpemUpOworCXNiLT5zYl9ic2l6ZV9zaGlmdCA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfYnNpemVfc2hpZnQpOworCXNiLT5zYl9tYXN0ZXJfZGlyLm5vX2FkZHIgPSBiZTY0X3RvX2NwdShzdHItPnNiX21hc3Rlcl9kaXIubm9fYWRkcik7CisJc2ItPnNiX21hc3Rlcl9kaXIubm9fZm9ybWFsX2lubyA9IGJlNjRfdG9fY3B1KHN0ci0+c2JfbWFzdGVyX2Rpci5ub19mb3JtYWxfaW5vKTsKKwlzYi0+c2Jfcm9vdF9kaXIubm9fYWRkciA9IGJlNjRfdG9fY3B1KHN0ci0+c2Jfcm9vdF9kaXIubm9fYWRkcik7CisJc2ItPnNiX3Jvb3RfZGlyLm5vX2Zvcm1hbF9pbm8gPSBiZTY0X3RvX2NwdShzdHItPnNiX3Jvb3RfZGlyLm5vX2Zvcm1hbF9pbm8pOworCisJbWVtY3B5KHNiLT5zYl9sb2NrcHJvdG8sIHN0ci0+c2JfbG9ja3Byb3RvLCBHRlMyX0xPQ0tOQU1FX0xFTik7CisJbWVtY3B5KHNiLT5zYl9sb2NrdGFibGUsIHN0ci0+c2JfbG9ja3RhYmxlLCBHRlMyX0xPQ0tOQU1FX0xFTik7Cit9CisKKy8qKgorICogZ2ZzMl9yZWFkX3N1cGVyIC0gUmVhZCB0aGUgZ2ZzMiBzdXBlciBibG9jayBmcm9tIGRpc2sKKyAqIEBzZHA6IFRoZSBHRlMyIHN1cGVyIGJsb2NrCisgKiBAc2VjdG9yOiBUaGUgbG9jYXRpb24gb2YgdGhlIHN1cGVyIGJsb2NrCisgKiBAZXJyb3I6IFRoZSBlcnJvciBjb2RlIHRvIHJldHVybgorICoKKyAqIFRoaXMgdXNlcyB0aGUgYmlvIGZ1bmN0aW9ucyB0byByZWFkIHRoZSBzdXBlciBibG9jayBmcm9tIGRpc2sKKyAqIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSAxMDAlIHN1cmUgdGhhdCB3ZSBuZXZlciByZWFkIGNhY2hlZCBkYXRhLgorICogQSBzdXBlciBibG9jayBpcyByZWFkIHR3aWNlIG9ubHkgZHVyaW5nIGVhY2ggR0ZTMiBtb3VudCBhbmQgaXMKKyAqIG5ldmVyIHdyaXR0ZW4gdG8gYnkgdGhlIGZpbGVzeXN0ZW0uIFRoZSBmaXJzdCB0aW1lIGl0cyByZWFkIG5vCisgKiBsb2NrcyBhcmUgaGVsZCwgYW5kIHRoZSBvbmx5IGRldGFpbHMgd2hpY2ggYXJlIGxvb2tlZCBhdCBhcmUgdGhvc2UKKyAqIHJlbGF0aW5nIHRvIHRoZSBsb2NraW5nIHByb3RvY29sLiBPbmNlIGxvY2tpbmcgaXMgdXAgYW5kIHdvcmtpbmcsCisgKiB0aGUgc2IgaXMgcmVhZCBhZ2FpbiB1bmRlciB0aGUgbG9jayB0byBlc3RhYmxpc2ggdGhlIGxvY2F0aW9uIG9mCisgKiB0aGUgbWFzdGVyIGRpcmVjdG9yeSAoY29udGFpbnMgcG9pbnRlcnMgdG8gam91cm5hbHMgZXRjKSBhbmQgdGhlCisgKiByb290IGRpcmVjdG9yeS4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IKKyAqLworCitzdGF0aWMgaW50IGdmczJfcmVhZF9zdXBlcihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc2VjdG9yX3Qgc2VjdG9yKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBzZHAtPnNkX3ZmczsKKwlzdHJ1Y3QgZ2ZzMl9zYiAqcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9GUyk7CisJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJQ2xlYXJQYWdlRGlydHkocGFnZSk7CisJbG9ja19wYWdlKHBhZ2UpOworCisJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCAxKTsKKwlpZiAodW5saWtlbHkoIWJpbykpIHsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwliaW8tPmJpX3NlY3RvciA9IHNlY3RvciAqIChzYi0+c19ibG9ja3NpemUgPj4gOSk7CisJYmlvLT5iaV9iZGV2ID0gc2ItPnNfYmRldjsKKwliaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBQQUdFX1NJWkUsIDApOworCisJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX2lvX3BhZ2U7CisJYmlvLT5iaV9wcml2YXRlID0gcGFnZTsKKwlzdWJtaXRfYmlvKFJFQURfU1lOQyB8ICgxIDw8IEJJT19SV19NRVRBKSwgYmlvKTsKKwl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCWJpb19wdXQoYmlvKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXAgPSBrbWFwKHBhZ2UpOworCWdmczJfc2JfaW4oJnNkcC0+c2Rfc2IsIHApOworCWt1bm1hcChwYWdlKTsKKwlfX2ZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKy8qKgorICogZ2ZzMl9yZWFkX3NiIC0gUmVhZCBzdXBlciBibG9jaworICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jaworICogQGdsOiB0aGUgZ2xvY2sgZm9yIHRoZSBzdXBlcmJsb2NrIChhc3N1bWVkIHRvIGJlIGhlbGQpCisgKiBAc2lsZW50OiBEb24ndCBwcmludCBtZXNzYWdlIGlmIG1vdW50IGZhaWxzCisgKgorICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9yZWFkX3NiKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGludCBzaWxlbnQpCit7CisJdTMyIGhhc2hfYmxvY2tzLCBpbmRfYmxvY2tzLCBsZWFmX2Jsb2NrczsKKwl1MzIgdG1wX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgeDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGdmczJfcmVhZF9zdXBlcihzZHAsIEdGUzJfU0JfQUREUiA+PiBzZHAtPnNkX2ZzYjJiYl9zaGlmdCk7CisJaWYgKGVycm9yKSB7CisJCWlmICghc2lsZW50KQorCQkJZnNfZXJyKHNkcCwgImNhbid0IHJlYWQgc3VwZXJibG9ja1xuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGdmczJfY2hlY2tfc2Ioc2RwLCAmc2RwLT5zZF9zYiwgc2lsZW50KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNkcC0+c2RfZnNiMmJiX3NoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCAtCisJCQkgICAgICAgR0ZTMl9CQVNJQ19CTE9DS19TSElGVDsKKwlzZHAtPnNkX2ZzYjJiYiA9IDEgPDwgc2RwLT5zZF9mc2IyYmJfc2hpZnQ7CisJc2RwLT5zZF9kaXB0cnMgPSAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCisJCQkgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSAvIHNpemVvZih1NjQpOworCXNkcC0+c2RfaW5wdHJzID0gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQorCQkJICBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKSAvIHNpemVvZih1NjQpOworCXNkcC0+c2RfamJzaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcik7CisJc2RwLT5zZF9oYXNoX2JzaXplID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAvIDI7CisJc2RwLT5zZF9oYXNoX2JzaXplX3NoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCAtIDE7CisJc2RwLT5zZF9oYXNoX3B0cnMgPSBzZHAtPnNkX2hhc2hfYnNpemUgLyBzaXplb2YodTY0KTsKKwlzZHAtPnNkX3FjX3Blcl9ibG9jayA9IChzZHAtPnNkX3NiLnNiX2JzaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKSAvCisJCQkgICAgICAgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9xdW90YV9jaGFuZ2UpOworCisJLyogQ29tcHV0ZSBtYXhpbXVtIHJlc2VydmF0aW9uIHJlcXVpcmVkIHRvIGFkZCBhIGVudHJ5IHRvIGEgZGlyZWN0b3J5ICovCisKKwloYXNoX2Jsb2NrcyA9IERJVl9ST1VORF9VUChzaXplb2YodTY0KSAqICgxIDw8IEdGUzJfRElSX01BWF9ERVBUSCksCisJCQkgICAgIHNkcC0+c2RfamJzaXplKTsKKworCWluZF9ibG9ja3MgPSAwOworCWZvciAodG1wX2Jsb2NrcyA9IGhhc2hfYmxvY2tzOyB0bXBfYmxvY2tzID4gc2RwLT5zZF9kaXB0cnM7KSB7CisJCXRtcF9ibG9ja3MgPSBESVZfUk9VTkRfVVAodG1wX2Jsb2Nrcywgc2RwLT5zZF9pbnB0cnMpOworCQlpbmRfYmxvY2tzICs9IHRtcF9ibG9ja3M7CisJfQorCisJbGVhZl9ibG9ja3MgPSAyICsgR0ZTMl9ESVJfTUFYX0RFUFRIOworCisJc2RwLT5zZF9tYXhfZGlycmVzID0gaGFzaF9ibG9ja3MgKyBpbmRfYmxvY2tzICsgbGVhZl9ibG9ja3M7CisKKwlzZHAtPnNkX2hlaWdodHNpemVbMF0gPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0KKwkJCQlzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKTsKKwlzZHAtPnNkX2hlaWdodHNpemVbMV0gPSBzZHAtPnNkX3NiLnNiX2JzaXplICogc2RwLT5zZF9kaXB0cnM7CisJZm9yICh4ID0gMjs7IHgrKykgeworCQl1NjQgc3BhY2UsIGQ7CisJCXUzMiBtOworCisJCXNwYWNlID0gc2RwLT5zZF9oZWlnaHRzaXplW3ggLSAxXSAqIHNkcC0+c2RfaW5wdHJzOworCQlkID0gc3BhY2U7CisJCW0gPSBkb19kaXYoZCwgc2RwLT5zZF9pbnB0cnMpOworCisJCWlmIChkICE9IHNkcC0+c2RfaGVpZ2h0c2l6ZVt4IC0gMV0gfHwgbSkKKwkJCWJyZWFrOworCQlzZHAtPnNkX2hlaWdodHNpemVbeF0gPSBzcGFjZTsKKwl9CisJc2RwLT5zZF9tYXhfaGVpZ2h0ID0geDsKKwlzZHAtPnNkX2hlaWdodHNpemVbeF0gPSB+MDsKKwlnZnMyX2Fzc2VydChzZHAsIHNkcC0+c2RfbWF4X2hlaWdodCA8PSBHRlMyX01BWF9NRVRBX0hFSUdIVCk7CisKKwlzZHAtPnNkX2poZWlnaHRzaXplWzBdID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCisJCQkJIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOworCXNkcC0+c2RfamhlaWdodHNpemVbMV0gPSBzZHAtPnNkX2pic2l6ZSAqIHNkcC0+c2RfZGlwdHJzOworCWZvciAoeCA9IDI7OyB4KyspIHsKKwkJdTY0IHNwYWNlLCBkOworCQl1MzIgbTsKKworCQlzcGFjZSA9IHNkcC0+c2RfamhlaWdodHNpemVbeCAtIDFdICogc2RwLT5zZF9pbnB0cnM7CisJCWQgPSBzcGFjZTsKKwkJbSA9IGRvX2RpdihkLCBzZHAtPnNkX2lucHRycyk7CisKKwkJaWYgKGQgIT0gc2RwLT5zZF9qaGVpZ2h0c2l6ZVt4IC0gMV0gfHwgbSkKKwkJCWJyZWFrOworCQlzZHAtPnNkX2poZWlnaHRzaXplW3hdID0gc3BhY2U7CisJfQorCXNkcC0+c2RfbWF4X2poZWlnaHQgPSB4OworCXNkcC0+c2RfamhlaWdodHNpemVbeF0gPSB+MDsKKwlnZnMyX2Fzc2VydChzZHAsIHNkcC0+c2RfbWF4X2poZWlnaHQgPD0gR0ZTMl9NQVhfTUVUQV9IRUlHSFQpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaW5pdF9uYW1lcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHNpbGVudCkKQEAgLTIyNCw1MSArNTEyLDU5IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqZ2ZzMl9sb29rdXBfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQkgICAgIHU2NCBub19hZGRyKQorc3RhdGljIGludCBnZnMyX2xvb2t1cF9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKipkcHRyLAorCQkJICAgIHU2NCBub19hZGRyLCBjb25zdCBjaGFyICpuYW1lKQogewotCXJldHVybiBnZnMyX2lub2RlX2xvb2t1cChzYiwgRFRfRElSLCBub19hZGRyLCAwLCAwKTsKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IGdmczJfaW5vZGVfbG9va3VwKHNiLCBEVF9ESVIsIG5vX2FkZHIsIDAsIDApOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWZzX2VycihzZHAsICJjYW4ndCByZWFkIGluICVzIGlub2RlOiAlbGRcbiIsIG5hbWUsIFBUUl9FUlIoaW5vZGUpKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOworCX0KKwlkZW50cnkgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghZGVudHJ5KSB7CisJCWZzX2VycihzZHAsICJjYW4ndCBhbGxvYyAlcyBkZW50cnlcbiIsIG5hbWUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRlbnRyeS0+ZF9vcCA9ICZnZnMyX2RvcHM7CisJKmRwdHIgPSBkZW50cnk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9zYihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHNpbGVudCwgaW50IHVuZG8pCitzdGF0aWMgaW50IGluaXRfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIGludCBzaWxlbnQpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNkcC0+c2RfdmZzOwogCXN0cnVjdCBnZnMyX2hvbGRlciBzYl9naDsKIAl1NjQgbm9fYWRkcjsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCWludCBlcnJvciA9IDA7CisJaW50IHJldDsKIAotCWlmICh1bmRvKSB7Ci0JCWlmIChzYi0+c19yb290KSB7Ci0JCQlkcHV0KHNiLT5zX3Jvb3QpOwotCQkJc2ItPnNfcm9vdCA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIDA7CisJcmV0ID0gZ2ZzMl9nbG9ja19ucV9udW0oc2RwLCBHRlMyX1NCX0xPQ0ssICZnZnMyX21ldGFfZ2xvcHMsCisJCQkJTE1fU1RfU0hBUkVELCAwLCAmc2JfZ2gpOworCWlmIChyZXQpIHsKKwkJZnNfZXJyKHNkcCwgImNhbid0IGFjcXVpcmUgc3VwZXJibG9jayBnbG9jazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX251bShzZHAsIEdGUzJfU0JfTE9DSywgJmdmczJfbWV0YV9nbG9wcywKLQkJCQkgTE1fU1RfU0hBUkVELCAwLCAmc2JfZ2gpOwotCWlmIChlcnJvcikgewotCQlmc19lcnIoc2RwLCAiY2FuJ3QgYWNxdWlyZSBzdXBlcmJsb2NrIGdsb2NrOiAlZFxuIiwgZXJyb3IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JZXJyb3IgPSBnZnMyX3JlYWRfc2Ioc2RwLCBzYl9naC5naF9nbCwgc2lsZW50KTsKLQlpZiAoZXJyb3IpIHsKLQkJZnNfZXJyKHNkcCwgImNhbid0IHJlYWQgc3VwZXJibG9jazogJWRcbiIsIGVycm9yKTsKKwlyZXQgPSBnZnMyX3JlYWRfc2Ioc2RwLCBzYl9naC5naF9nbCwgc2lsZW50KTsKKwlpZiAocmV0KSB7CisJCWZzX2VycihzZHAsICJjYW4ndCByZWFkIHN1cGVyYmxvY2s6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBTZXQgdXAgdGhlIGJ1ZmZlciBjYWNoZSBhbmQgU0IgZm9yIHJlYWwgKi8KIAlpZiAoc2RwLT5zZF9zYi5zYl9ic2l6ZSA8IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KSkgewotCQllcnJvciA9IC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CiAJCWZzX2VycihzZHAsICJGUyBibG9jayBzaXplICgldSkgaXMgdG9vIHNtYWxsIGZvciBkZXZpY2UgIgogCQkgICAgICAgImJsb2NrIHNpemUgKCV1KVxuIiwKIAkJICAgICAgIHNkcC0+c2Rfc2Iuc2JfYnNpemUsIGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KSk7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAoc2RwLT5zZF9zYi5zYl9ic2l6ZSA+IFBBR0VfU0laRSkgewotCQllcnJvciA9IC1FSU5WQUw7CisJCXJldCA9IC1FSU5WQUw7CiAJCWZzX2VycihzZHAsICJGUyBibG9jayBzaXplICgldSkgaXMgdG9vIGJpZyBmb3IgbWFjaGluZSAiCiAJCSAgICAgICAicGFnZSBzaXplICgldSlcbiIsCiAJCSAgICAgICBzZHAtPnNkX3NiLnNiX2JzaXplLCAodW5zaWduZWQgaW50KVBBR0VfU0laRSk7CkBAIC0yNzgsMjYgKzU3NCwyMSBAQAogCiAJLyogR2V0IHRoZSByb290IGlub2RlICovCiAJbm9fYWRkciA9IHNkcC0+c2Rfc2Iuc2Jfcm9vdF9kaXIubm9fYWRkcjsKLQlpZiAoc2ItPnNfdHlwZSA9PSAmZ2ZzMm1ldGFfZnNfdHlwZSkKLQkJbm9fYWRkciA9IHNkcC0+c2Rfc2Iuc2JfbWFzdGVyX2Rpci5ub19hZGRyOwotCWlub2RlID0gZ2ZzMl9sb29rdXBfcm9vdChzYiwgbm9fYWRkcik7Ci0JaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKGlub2RlKTsKLQkJZnNfZXJyKHNkcCwgImNhbid0IHJlYWQgaW4gcm9vdCBpbm9kZTogJWRcbiIsIGVycm9yKTsKKwlyZXQgPSBnZnMyX2xvb2t1cF9yb290KHNiLCAmc2RwLT5zZF9yb290X2Rpciwgbm9fYWRkciwgInJvb3QiKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIEdldCB0aGUgbWFzdGVyIGlub2RlICovCisJbm9fYWRkciA9IHNkcC0+c2Rfc2Iuc2JfbWFzdGVyX2Rpci5ub19hZGRyOworCXJldCA9IGdmczJfbG9va3VwX3Jvb3Qoc2IsICZzZHAtPnNkX21hc3Rlcl9kaXIsIG5vX2FkZHIsICJtYXN0ZXIiKTsKKwlpZiAocmV0KSB7CisJCWRwdXQoc2RwLT5zZF9yb290X2Rpcik7CiAJCWdvdG8gb3V0OwogCX0KLQotCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwotCWlmICghc2ItPnNfcm9vdCkgewotCQlmc19lcnIoc2RwLCAiY2FuJ3QgZ2V0IHJvb3QgZGVudHJ5XG4iKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpcHV0KGlub2RlKTsKLQl9IGVsc2UKLQkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZnZnMyX2RvcHM7Ci0JCisJc2ItPnNfcm9vdCA9IGRnZXQoc2RwLT5zZF9hcmdzLmFyX21ldGEgPyBzZHAtPnNkX21hc3Rlcl9kaXIgOiBzZHAtPnNkX3Jvb3RfZGlyKTsKIG91dDoKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2JfZ2gpOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTM3Miw2ICs2NjMsNyBAQAogCiBzdGF0aWMgaW50IGluaXRfam91cm5hbChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHVuZG8pCiB7CisJc3RydWN0IGlub2RlICptYXN0ZXIgPSBzZHAtPnNkX21hc3Rlcl9kaXItPmRfaW5vZGU7CiAJc3RydWN0IGdmczJfaG9sZGVyIGppX2doOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXA7CkBAIC0zODMsNyArNjc1LDcgQEAKIAkJZ290byBmYWlsX3JlY292ZXJkOwogCX0KIAotCXNkcC0+c2RfamluZGV4ID0gZ2ZzMl9sb29rdXBfc2ltcGxlKHNkcC0+c2RfbWFzdGVyX2RpciwgImppbmRleCIpOworCXNkcC0+c2RfamluZGV4ID0gZ2ZzMl9sb29rdXBfc2ltcGxlKG1hc3RlciwgImppbmRleCIpOwogCWlmIChJU19FUlIoc2RwLT5zZF9qaW5kZXgpKSB7CiAJCWZzX2VycihzZHAsICJjYW4ndCBsb29rdXAgam91cm5hbCBpbmRleDogJWRcbiIsIGVycm9yKTsKIAkJcmV0dXJuIFBUUl9FUlIoc2RwLT5zZF9qaW5kZXgpOwpAQCAtNTA2LDI1ICs3OTgsMTcgQEAKIHsKIAlpbnQgZXJyb3IgPSAwOwogCXN0cnVjdCBnZnMyX2lub2RlICppcDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBpbm9kZSAqbWFzdGVyID0gc2RwLT5zZF9tYXN0ZXJfZGlyLT5kX2lub2RlOwogCiAJaWYgKHVuZG8pCiAJCWdvdG8gZmFpbF9xaW5vZGU7CiAKLQlpbm9kZSA9IGdmczJfbG9va3VwX3Jvb3Qoc2RwLT5zZF92ZnMsIHNkcC0+c2Rfc2Iuc2JfbWFzdGVyX2Rpci5ub19hZGRyKTsKLQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQllcnJvciA9IFBUUl9FUlIoaW5vZGUpOwotCQlmc19lcnIoc2RwLCAiY2FuJ3QgcmVhZCBpbiBtYXN0ZXIgZGlyZWN0b3J5OiAlZFxuIiwgZXJyb3IpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXNkcC0+c2RfbWFzdGVyX2RpciA9IGlub2RlOwotCiAJZXJyb3IgPSBpbml0X2pvdXJuYWwoc2RwLCB1bmRvKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gZmFpbF9tYXN0ZXI7CisJCWdvdG8gZmFpbDsKIAogCS8qIFJlYWQgaW4gdGhlIG1hc3RlciBpbm9kZSBudW1iZXIgaW5vZGUgKi8KLQlzZHAtPnNkX2ludW1faW5vZGUgPSBnZnMyX2xvb2t1cF9zaW1wbGUoc2RwLT5zZF9tYXN0ZXJfZGlyLCAiaW51bSIpOworCXNkcC0+c2RfaW51bV9pbm9kZSA9IGdmczJfbG9va3VwX3NpbXBsZShtYXN0ZXIsICJpbnVtIik7CiAJaWYgKElTX0VSUihzZHAtPnNkX2ludW1faW5vZGUpKSB7CiAJCWVycm9yID0gUFRSX0VSUihzZHAtPnNkX2ludW1faW5vZGUpOwogCQlmc19lcnIoc2RwLCAiY2FuJ3QgcmVhZCBpbiBpbnVtIGlub2RlOiAlZFxuIiwgZXJyb3IpOwpAQCAtNTMzLDcgKzgxNyw3IEBACiAKIAogCS8qIFJlYWQgaW4gdGhlIG1hc3RlciBzdGF0ZnMgaW5vZGUgKi8KLQlzZHAtPnNkX3N0YXRmc19pbm9kZSA9IGdmczJfbG9va3VwX3NpbXBsZShzZHAtPnNkX21hc3Rlcl9kaXIsICJzdGF0ZnMiKTsKKwlzZHAtPnNkX3N0YXRmc19pbm9kZSA9IGdmczJfbG9va3VwX3NpbXBsZShtYXN0ZXIsICJzdGF0ZnMiKTsKIAlpZiAoSVNfRVJSKHNkcC0+c2Rfc3RhdGZzX2lub2RlKSkgewogCQllcnJvciA9IFBUUl9FUlIoc2RwLT5zZF9zdGF0ZnNfaW5vZGUpOwogCQlmc19lcnIoc2RwLCAiY2FuJ3QgcmVhZCBpbiBzdGF0ZnMgaW5vZGU6ICVkXG4iLCBlcnJvcik7CkBAIC01NDEsNyArODI1LDcgQEAKIAl9CiAKIAkvKiBSZWFkIGluIHRoZSByZXNvdXJjZSBpbmRleCBpbm9kZSAqLwotCXNkcC0+c2RfcmluZGV4ID0gZ2ZzMl9sb29rdXBfc2ltcGxlKHNkcC0+c2RfbWFzdGVyX2RpciwgInJpbmRleCIpOworCXNkcC0+c2RfcmluZGV4ID0gZ2ZzMl9sb29rdXBfc2ltcGxlKG1hc3RlciwgInJpbmRleCIpOwogCWlmIChJU19FUlIoc2RwLT5zZF9yaW5kZXgpKSB7CiAJCWVycm9yID0gUFRSX0VSUihzZHAtPnNkX3JpbmRleCk7CiAJCWZzX2VycihzZHAsICJjYW4ndCBnZXQgcmVzb3VyY2UgaW5kZXggaW5vZGU6ICVkXG4iLCBlcnJvcik7CkBAIC01NTIsNyArODM2LDcgQEAKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDA7CiAKIAkvKiBSZWFkIGluIHRoZSBxdW90YSBpbm9kZSAqLwotCXNkcC0+c2RfcXVvdGFfaW5vZGUgPSBnZnMyX2xvb2t1cF9zaW1wbGUoc2RwLT5zZF9tYXN0ZXJfZGlyLCAicXVvdGEiKTsKKwlzZHAtPnNkX3F1b3RhX2lub2RlID0gZ2ZzMl9sb29rdXBfc2ltcGxlKG1hc3RlciwgInF1b3RhIik7CiAJaWYgKElTX0VSUihzZHAtPnNkX3F1b3RhX2lub2RlKSkgewogCQllcnJvciA9IFBUUl9FUlIoc2RwLT5zZF9xdW90YV9pbm9kZSk7CiAJCWZzX2VycihzZHAsICJjYW4ndCBnZXQgcXVvdGEgZmlsZSBpbm9kZTogJWRcbiIsIGVycm9yKTsKQEAgLTU3MSw4ICs4NTUsNiBAQAogCWlwdXQoc2RwLT5zZF9pbnVtX2lub2RlKTsKIGZhaWxfam91cm5hbDoKIAlpbml0X2pvdXJuYWwoc2RwLCBVTkRPKTsKLWZhaWxfbWFzdGVyOgotCWlwdXQoc2RwLT5zZF9tYXN0ZXJfZGlyKTsKIGZhaWw6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNTgzLDYgKzg2NSw3IEBACiAJY2hhciBidWZbMzBdOwogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwOworCXN0cnVjdCBpbm9kZSAqbWFzdGVyID0gc2RwLT5zZF9tYXN0ZXJfZGlyLT5kX2lub2RlOwogCiAJaWYgKHNkcC0+c2RfYXJncy5hcl9zcGVjdGF0b3IpCiAJCXJldHVybiAwOwpAQCAtNTkwLDcgKzg3Myw3IEBACiAJaWYgKHVuZG8pCiAJCWdvdG8gZmFpbF9xY19naDsKIAotCXBuID0gZ2ZzMl9sb29rdXBfc2ltcGxlKHNkcC0+c2RfbWFzdGVyX2RpciwgInBlcl9ub2RlIik7CisJcG4gPSBnZnMyX2xvb2t1cF9zaW1wbGUobWFzdGVyLCAicGVyX25vZGUiKTsKIAlpZiAoSVNfRVJSKHBuKSkgewogCQllcnJvciA9IFBUUl9FUlIocG4pOwogCQlmc19lcnIoc2RwLCAiY2FuJ3QgZmluZCBwZXJfbm9kZSBkaXJlY3Rvcnk6ICVkXG4iLCBlcnJvcik7CkBAIC04MDAsNyArMTA4MywxMSBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaW5pdF92ZnMoc2IsIFNERl9OT0FUSU1FKTsKKwlzYi0+c19tYWdpYyA9IEdGUzJfTUFHSUM7CisJc2ItPnNfb3AgPSAmZ2ZzMl9zdXBlcl9vcHM7CisJc2ItPnNfZXhwb3J0X29wID0gJmdmczJfZXhwb3J0X29wczsKKwlzYi0+c190aW1lX2dyYW4gPSAxOworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKIAogCS8qIFNldCB1cCB0aGUgYnVmZmVyIGNhY2hlIGFuZCBmaWxsIGluIHNvbWUgZmFrZSBibG9jayBzaXplIHZhbHVlcwogCSAgIHRvIGFsbG93IHVzIHRvIHJlYWQtaW4gdGhlIG9uLWRpc2sgc3VwZXJibG9jay4gKi8KQEAgLTgyOCw3ICsxMTE1LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9sbTsKIAotCWVycm9yID0gaW5pdF9zYihzZHAsIHNpbGVudCwgRE8pOworCWVycm9yID0gaW5pdF9zYihzZHAsIHNpbGVudCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfbG9ja2luZzsKIApAQCAtODY5LDcgKzExNTYsMTEgQEAKIGZhaWxfaW5vZGVzOgogCWluaXRfaW5vZGVzKHNkcCwgVU5ETyk7CiBmYWlsX3NiOgotCWluaXRfc2Ioc2RwLCAwLCBVTkRPKTsKKwlpZiAoc2RwLT5zZF9yb290X2RpcikKKwkJZHB1dChzZHAtPnNkX3Jvb3RfZGlyKTsKKwlpZiAoc2RwLT5zZF9tYXN0ZXJfZGlyKQorCQlkcHV0KHNkcC0+c2RfbWFzdGVyX2Rpcik7CisJc2ItPnNfcm9vdCA9IE5VTEw7CiBmYWlsX2xvY2tpbmc6CiAJaW5pdF9sb2NraW5nKHNkcCwgJm1vdW50X2doLCBVTkRPKTsKIGZhaWxfbG06CkBAIC04ODcsMTUxICsxMTc4LDYzIEBACiB9CiAKIHN0YXRpYyBpbnQgZ2ZzMl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKLQkJY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQorCQkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGZpbGxfc3VwZXIsIG1udCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9nZnMyX3NiKGNvbnN0IGNoYXIgKmRldl9uYW1lKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Ci0Jc3RydWN0IGdmczJfc2JkICpzZHA7Ci0JaW50IGVycm9yID0gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBmaWxsX3N1cGVyLCBtbnQpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0Jc2IgPSBtbnQtPm1udF9zYjsKLQlzZHAgPSBzYi0+c19mc19pbmZvOwotCXNkcC0+c2RfZ2ZzMm1udCA9IG1udDsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsbF9zdXBlcl9tZXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzdXBlcl9ibG9jayAqbmV3LAotCQkJICAgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlpbnQgZXJyb3IgPSAwOwotCi0JbmV3LT5zX2ZzX2luZm8gPSBzZHA7Ci0Jc2RwLT5zZF92ZnNfbWV0YSA9IHNiOwotCi0JaW5pdF92ZnMobmV3LCBTREZfTk9BVElNRSk7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtYXN0ZXIgaW5vZGUgKi8KLQlpbm9kZSA9IGlncmFiKHNkcC0+c2RfbWFzdGVyX2Rpcik7Ci0KLQluZXctPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7Ci0JaWYgKCFuZXctPnNfcm9vdCkgewotCQlmc19lcnIoc2RwLCAiY2FuJ3QgZ2V0IHJvb3QgZGVudHJ5XG4iKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpcHV0KGlub2RlKTsKLQl9IGVsc2UKLQkJbmV3LT5zX3Jvb3QtPmRfb3AgPSAmZ2ZzMl9kb3BzOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHNldF9iZGV2X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKLXsKLQlzLT5zX2JkZXYgPSBkYXRhOwotCXMtPnNfZGV2ID0gcy0+c19iZGV2LT5iZF9kZXY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9iZGV2X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcy0+c19iZGV2ID09IGRhdGE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sqIGdldF9nZnMyX3NiKGNvbnN0IGNoYXIgKmRldl9uYW1lKQotewotCXN0cnVjdCBrc3RhdCBzdGF0OwogCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEwsICpzOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gcGF0aF9sb29rdXAoZGV2X25hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CiAJaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkdGUzI6IHBhdGhfbG9va3VwIG9uICVzIHJldHVybmVkIGVycm9yXG4iLAotCQkgICAgICAgZGV2X25hbWUpOwotCQlnb3RvIG91dDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR0ZTMjogcGF0aF9sb29rdXAgb24gJXMgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCisJCSAgICAgICBkZXZfbmFtZSwgZXJyb3IpOworCQlyZXR1cm4gTlVMTDsKIAl9Ci0JZXJyb3IgPSB2ZnNfZ2V0YXR0cihuZC5wYXRoLm1udCwgbmQucGF0aC5kZW50cnksICZzdGF0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJmdmczJfZnNfdHlwZS5mc19zdXBlcnMsIHNfaW5zdGFuY2VzKSB7Ci0JCWlmICgoU19JU0JMSyhzdGF0Lm1vZGUpICYmIHMtPnNfZGV2ID09IHN0YXQucmRldikgfHwKLQkJICAgIChTX0lTRElSKHN0YXQubW9kZSkgJiYKLQkJICAgICBzID09IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiKSkgewotCQkJc2IgPSBzOwotCQkJZ290byBmcmVlX25kOwotCQl9Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiR0ZTMjogVW5yZWNvZ25pemVkIGJsb2NrIGRldmljZSBvciAiCi0JICAgICAgICJtb3VudCBwb2ludCAlc1xuIiwgZGV2X25hbWUpOwotCi1mcmVlX25kOgorCXNiID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2I7CisJaWYgKHNiICYmIChzYi0+c190eXBlID09ICZnZnMyX2ZzX3R5cGUpKQorCQlhdG9taWNfaW5jKCZzYi0+c19hY3RpdmUpOworCWVsc2UKKwkJc2IgPSBOVUxMOwogCXBhdGhfcHV0KCZuZC5wYXRoKTsKLW91dDoKIAlyZXR1cm4gc2I7CiB9CiAKIHN0YXRpYyBpbnQgZ2ZzMl9nZXRfc2JfbWV0YShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAogCQkJICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMLCAqbmV3OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwOwogCiAJc2IgPSBnZXRfZ2ZzMl9zYihkZXZfbmFtZSk7CiAJaWYgKCFzYikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJHRlMyOiBnZnMyIG1vdW50IGRvZXMgbm90IGV4aXN0XG4iKTsKLQkJZXJyb3IgPSAtRU5PRU5UOwotCQlnb3RvIGVycm9yOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAJc2RwID0gc2ItPnNfZnNfaW5mbzsKLQlpZiAoc2RwLT5zZF92ZnNfbWV0YSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJHRlMyOiBnZnMybWV0YSBtb3VudCBhbHJlYWR5IGV4aXN0c1xuIik7Ci0JCWVycm9yID0gLUVCVVNZOwotCQlnb3RvIGVycm9yOwotCX0KLQlkb3duKCZzYi0+c19iZGV2LT5iZF9tb3VudF9zZW0pOwotCW5ldyA9IHNnZXQoZnNfdHlwZSwgdGVzdF9iZGV2X3N1cGVyLCBzZXRfYmRldl9zdXBlciwgc2ItPnNfYmRldik7Ci0JdXAoJnNiLT5zX2JkZXYtPmJkX21vdW50X3NlbSk7Ci0JaWYgKElTX0VSUihuZXcpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihuZXcpOwotCQlnb3RvIGVycm9yOwotCX0KLQluZXctPnNfZmxhZ3MgPSBmbGFnczsKLQlzdHJsY3B5KG5ldy0+c19pZCwgc2ItPnNfaWQsIHNpemVvZihuZXctPnNfaWQpKTsKLQlzYl9zZXRfYmxvY2tzaXplKG5ldywgc2ItPnNfYmxvY2tzaXplKTsKLQllcnJvciA9IGZpbGxfc3VwZXJfbWV0YShzYiwgbmV3LCBkYXRhLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAoZXJyb3IpIHsKLQkJdXBfd3JpdGUoJm5ldy0+c191bW91bnQpOwotCQlkZWFjdGl2YXRlX3N1cGVyKG5ldyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JbmV3LT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLQotCS8qIEdyYWIgYSByZWZlcmVuY2UgdG8gdGhlIGdmczIgbW91bnQgcG9pbnQgKi8KLQlhdG9taWNfaW5jKCZzZHAtPnNkX2dmczJtbnQtPm1udF9jb3VudCk7Ci0JcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgbmV3KTsKLWVycm9yOgotCXJldHVybiBlcnJvcjsKKwltbnQtPm1udF9zYiA9IHNiOworCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNkcC0+c2RfbWFzdGVyX2Rpcik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmIChzYi0+c19mc19pbmZvKSB7Ci0JCWdmczJfZGVsZXRlX2RlYnVnZnNfZmlsZShzYi0+c19mc19pbmZvKTsKLQkJZ2ZzMl9tZXRhX3N5bmNmcyhzYi0+c19mc19pbmZvKTsKLQl9Ci0Ja2lsbF9ibG9ja19zdXBlcihzYik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYl9tZXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwotCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwotCXNkcC0+c2RfdmZzX21ldGEgPSBOVUxMOwotCWF0b21pY19kZWMoJnNkcC0+c2RfZ2ZzMm1udC0+bW50X2NvdW50KTsKKwlpZiAoc2RwKSB7CisJCWdmczJfbWV0YV9zeW5jZnMoc2RwKTsKKwkJZHB1dChzZHAtPnNkX3Jvb3RfZGlyKTsKKwkJZHB1dChzZHAtPnNkX21hc3Rlcl9kaXIpOworCQlzZHAtPnNkX3Jvb3RfZGlyID0gTlVMTDsKKwkJc2RwLT5zZF9tYXN0ZXJfZGlyID0gTlVMTDsKKwl9CisJc2hyaW5rX2RjYWNoZV9zYihzYik7CisJa2lsbF9ibG9ja19zdXBlcihzYik7CisJaWYgKHNkcCkKKwkJZ2ZzMl9kZWxldGVfZGVidWdmc19maWxlKHNkcCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGdmczJfZnNfdHlwZSA9IHsKQEAgLTEwNDYsNyArMTI0OSw2IEBACiAJLm5hbWUgPSAiZ2ZzMm1ldGEiLAogCS5mc19mbGFncyA9IEZTX1JFUVVJUkVTX0RFViwKIAkuZ2V0X3NiID0gZ2ZzMl9nZXRfc2JfbWV0YSwKLQkua2lsbF9zYiA9IGdmczJfa2lsbF9zYl9tZXRhLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKaW5kZXggZTJjNjJmNy4uNTM0ZTFlMiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYworKysgYi9mcy9nZnMyL29wc19pbm9kZS5jCkBAIC0xNTksOSArMTU5LDEzIEBACiAJZ2ZzMl9ob2xkZXJfaW5pdChkaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgZ2hzKTsKIAlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsIGdocyArIDEpOwogCi0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX20oMiwgZ2hzKTsKKwllcnJvciA9IGdmczJfZ2xvY2tfbnEoZ2hzKTsgLyogcGFyZW50ICovCiAJaWYgKGVycm9yKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcGFyZW50OworCisJZXJyb3IgPSBnZnMyX2dsb2NrX25xKGdocyArIDEpOyAvKiBjaGlsZCAqLworCWlmIChlcnJvcikKKwkJZ290byBvdXRfY2hpbGQ7CiAKIAllcnJvciA9IGdmczJfcGVybWlzc2lvbihkaXIsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKIAlpZiAoZXJyb3IpCkBAIC0yNDUsOCArMjQ5LDEwIEBACiAJaWYgKGFsbG9jX3JlcXVpcmVkKQogCQlnZnMyX2FsbG9jX3B1dChkaXApOwogb3V0X2d1bmxvY2s6Ci0JZ2ZzMl9nbG9ja19kcV9tKDIsIGdocyk7Ci1vdXQ6CisJZ2ZzMl9nbG9ja19kcShnaHMgKyAxKTsKK291dF9jaGlsZDoKKwlnZnMyX2dsb2NrX2RxKGdocyk7CitvdXRfcGFyZW50OgogCWdmczJfaG9sZGVyX3VuaW5pdChnaHMpOwogCWdmczJfaG9sZGVyX3VuaW5pdChnaHMgKyAxKTsKIAlpZiAoIWVycm9yKSB7CkBAIC0zMDIsNyArMzA4LDcgQEAKIAogCWVycm9yID0gZ2ZzMl91bmxpbmtfb2soZGlwLCAmZGVudHJ5LT5kX25hbWUsIGlwKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3JncnA7CisJCWdvdG8gb3V0X2d1bmxvY2s7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAyKlJFU19ESU5PREUgKyBSRVNfTEVBRiArIFJFU19SR19CSVQsIDApOwogCWlmIChlcnJvcikKQEAgLTMxNiw2ICszMjIsNyBAQAogCiBvdXRfZW5kX3RyYW5zOgogCWdmczJfdHJhbnNfZW5kKHNkcCk7CitvdXRfZ3VubG9jazoKIAlnZnMyX2dsb2NrX2RxKGdocyArIDIpOwogb3V0X3JncnA6CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyArIDIpOwpAQCAtNDg1LDcgKzQ5Miw2IEBACiAJc3RydWN0IGdmczJfaG9sZGVyIHJpX2doOwogCWludCBlcnJvcjsKIAotCiAJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKQEAgLTQ5NSw5ICs1MDEsMTcgQEAKIAlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX25vX2FkZHIpOwogCWdmczJfaG9sZGVyX2luaXQocmdkLT5yZF9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCBnaHMgKyAyKTsKIAotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9tKDMsIGdocyk7CisJZXJyb3IgPSBnZnMyX2dsb2NrX25xKGdocyk7IC8qIHBhcmVudCAqLwogCWlmIChlcnJvcikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3BhcmVudDsKKworCWVycm9yID0gZ2ZzMl9nbG9ja19ucShnaHMgKyAxKTsgLyogY2hpbGQgKi8KKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2NoaWxkOworCisJZXJyb3IgPSBnZnMyX2dsb2NrX25xKGdocyArIDIpOyAvKiByZ3JwICovCisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9yZ3JwOwogCiAJZXJyb3IgPSBnZnMyX3VubGlua19vayhkaXAsICZkZW50cnktPmRfbmFtZSwgaXApOwogCWlmIChlcnJvcikKQEAgLTUyMywxMSArNTM3LDE1IEBACiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAogb3V0X2d1bmxvY2s6Ci0JZ2ZzMl9nbG9ja19kcV9tKDMsIGdocyk7Ci1vdXQ6Ci0JZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyk7Ci0JZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyArIDEpOworCWdmczJfZ2xvY2tfZHEoZ2hzICsgMik7CitvdXRfcmdycDoKIAlnZnMyX2hvbGRlcl91bmluaXQoZ2hzICsgMik7CisJZ2ZzMl9nbG9ja19kcShnaHMgKyAxKTsKK291dF9jaGlsZDoKKwlnZnMyX2hvbGRlcl91bmluaXQoZ2hzICsgMSk7CisJZ2ZzMl9nbG9ja19kcShnaHMpOworb3V0X3BhcmVudDoKKwlnZnMyX2hvbGRlcl91bmluaXQoZ2hzKTsKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcmlfZ2gpOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTU3MSw2ICs1ODksNTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIGdmczJfb2tfdG9fbW92ZSAtIGNoZWNrIGlmIGl0J3Mgb2sgdG8gbW92ZSBhIGRpcmVjdG9yeSB0byBhbm90aGVyIGRpcmVjdG9yeQorICogQHRoaXM6IG1vdmUgdGhpcworICogQHRvOiB0byBoZXJlCisgKgorICogRm9sbG93IEB0byBiYWNrIHRvIHRoZSByb290IGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZW5jb3VudGVyIEB0aGlzCisgKiBBc3N1bWVzIHdlIGFscmVhZHkgaG9sZCB0aGUgcmVuYW1lIGxvY2suCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IGdmczJfb2tfdG9fbW92ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqdGhpcywgc3RydWN0IGdmczJfaW5vZGUgKnRvKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gJnRvLT5pX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlICp0bXA7CisJc3RydWN0IHFzdHIgZG90ZG90OworCWludCBlcnJvciA9IDA7CisKKwlnZnMyX3N0cjJxc3RyKCZkb3Rkb3QsICIuLiIpOworCisJaWdyYWIoZGlyKTsKKworCWZvciAoOzspIHsKKwkJaWYgKGRpciA9PSAmdGhpcy0+aV9pbm9kZSkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRpciA9PSBzYi0+c19yb290LT5kX2lub2RlKSB7CisJCQllcnJvciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXRtcCA9IGdmczJfbG9va3VwaShkaXIsICZkb3Rkb3QsIDEpOworCQlpZiAoSVNfRVJSKHRtcCkpIHsKKwkJCWVycm9yID0gUFRSX0VSUih0bXApOworCQkJYnJlYWs7CisJCX0KKworCQlpcHV0KGRpcik7CisJCWRpciA9IHRtcDsKKwl9CisKKwlpcHV0KGRpcik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKIC8qKgogICogZ2ZzMl9yZW5hbWUgLSBSZW5hbWUgYSBmaWxlCiAgKiBAb2RpcjogUGFyZW50IGRpcmVjdG9yeSBvZiBvbGQgZmlsZSBuYW1lCkBAIC01ODksNyArNjU1LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0kob2RlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfaW5vZGUgKm5pcCA9IE5VTEw7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKG9kaXIpOwotCXN0cnVjdCBnZnMyX2hvbGRlciBnaHNbNV0sIHJfZ2g7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoc1s1XSwgcl9naCA9IHsgLmdoX2dsID0gTlVMTCwgfTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqbnJnZDsKIAl1bnNpZ25lZCBpbnQgbnVtX2doOwogCWludCBkaXJfcmVuYW1lID0gMDsKQEAgLTYwMywxOSArNjY5LDIwIEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBNYWtlIHN1cmUgd2UgYXJlbid0IHRyeWluZyB0byBtb3ZlIGEgZGlyY3RvcnkgaW50byBpdCdzIHN1YmRpciAqLwogCi0JaWYgKFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSAmJiBvZGlwICE9IG5kaXApIHsKLQkJZGlyX3JlbmFtZSA9IDE7Ci0KLQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwKLQkJCQkJICAgJnJfZ2gpOworCWlmIChvZGlwICE9IG5kaXApIHsKKwkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsIExNX1NUX0VYQ0xVU0lWRSwKKwkJCQkJICAgMCwgJnJfZ2gpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAotCQllcnJvciA9IGdmczJfb2tfdG9fbW92ZShpcCwgbmRpcCk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0X2d1bmxvY2tfcjsKKwkJaWYgKFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSkgeworCQkJZGlyX3JlbmFtZSA9IDE7CisJCQkvKiBkb24ndCBtb3ZlIGEgZGlyY3RvcnkgaW50byBpdCdzIHN1YmRpciAqLworCQkJZXJyb3IgPSBnZnMyX29rX3RvX21vdmUoaXAsIG5kaXApOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gb3V0X2d1bmxvY2tfcjsKKwkJfQogCX0KIAogCW51bV9naCA9IDE7CkBAIC02MzksOSArNzA2LDExIEBACiAJCQlnZnMyX2hvbGRlcl9pbml0KG5yZ2QtPnJkX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsIGdocyArIG51bV9naCsrKTsKIAl9CiAKLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfbShudW1fZ2gsIGdocyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF91bmluaXQ7CisJZm9yICh4ID0gMDsgeCA8IG51bV9naDsgeCsrKSB7CisJCWVycm9yID0gZ2ZzMl9nbG9ja19ucShnaHMgKyB4KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfZ3VubG9jazsKKwl9CiAKIAkvKiBDaGVjayBvdXQgdGhlIG9sZCBkaXJlY3RvcnkgKi8KIApAQCAtODA0LDEyICs4NzMsMTIgQEAKIAlpZiAoYWxsb2NfcmVxdWlyZWQpCiAJCWdmczJfYWxsb2NfcHV0KG5kaXApOwogb3V0X2d1bmxvY2s6Ci0JZ2ZzMl9nbG9ja19kcV9tKG51bV9naCwgZ2hzKTsKLW91dF91bmluaXQ6Ci0JZm9yICh4ID0gMDsgeCA8IG51bV9naDsgeCsrKQorCXdoaWxlICh4LS0pIHsKKwkJZ2ZzMl9nbG9ja19kcShnaHMgKyB4KTsKIAkJZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyArIHgpOworCX0KIG91dF9ndW5sb2NrX3I6Ci0JaWYgKGRpcl9yZW5hbWUpCisJaWYgKHJfZ2guZ2hfZ2wpCiAJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyX2doKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19zdXBlci5jIGIvZnMvZ2ZzMi9vcHNfc3VwZXIuYwppbmRleCBmNjZlYTBmLi5kNTM1NWQ5IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19zdXBlci5jCisrKyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgImRpci5oIgogI2luY2x1ZGUgImVhdHRyLmgiCiAjaW5jbHVkZSAiYm1hcC5oIgorI2luY2x1ZGUgIm1ldGFfaW8uaCIKIAogLyoqCiAgKiBnZnMyX3dyaXRlX2lub2RlIC0gTWFrZSBzdXJlIHRoZSBpbm9kZSBpcyBzdGFibGUgb24gdGhlIGRpc2sKQEAgLTUwLDE2ICs1Miw3NCBAQAogc3RhdGljIGludCBnZnMyX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzeW5jKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IGdmczJfZGlub2RlICpkaTsKKwlpbnQgcmV0ID0gMDsKIAotCS8qIENoZWNrIHRoaXMgaXMgYSAibm9ybWFsIiBpbm9kZSAqLwotCWlmICh0ZXN0X2JpdChHSUZfVVNFUiwgJmlwLT5pX2ZsYWdzKSkgewotCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKLQkJCXJldHVybiAwOwotCQlpZiAoc3luYykKLQkJCWdmczJfbG9nX2ZsdXNoKEdGUzJfU0IoaW5vZGUpLCBpcC0+aV9nbCk7CisJLyogQ2hlY2sgdGhpcyBpcyBhICJub3JtYWwiIGlub2RlLCBldGMgKi8KKwlpZiAoIXRlc3RfYml0KEdJRl9VU0VSLCAmaXAtPmlfZmxhZ3MpIHx8CisJICAgIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsICZnaCk7CisJaWYgKHJldCkKKwkJZ290byBkb19mbHVzaDsKKwlyZXQgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgUkVTX0RJTk9ERSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBkb191bmxvY2s7CisJcmV0ID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKKwlpZiAocmV0ID09IDApIHsKKwkJZGkgPSAoc3RydWN0IGdmczJfZGlub2RlICopYmgtPmJfZGF0YTsKKwkJYXRpbWUudHZfc2VjID0gYmU2NF90b19jcHUoZGktPmRpX2F0aW1lKTsKKwkJYXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpLT5kaV9hdGltZV9uc2VjKTsKKwkJaWYgKHRpbWVzcGVjX2NvbXBhcmUoJmlub2RlLT5pX2F0aW1lLCAmYXRpbWUpID4gMCkgeworCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKKwkJCWdmczJfZGlub2RlX291dChpcCwgYmgtPmJfZGF0YSk7CisJCX0KKwkJYnJlbHNlKGJoKTsKIAl9CisJZ2ZzMl90cmFuc19lbmQoc2RwKTsKK2RvX3VubG9jazoKKwlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOworZG9fZmx1c2g6CisJaWYgKHN5bmMgIT0gMCkKKwkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKKwlyZXR1cm4gcmV0OworfQogCi0JcmV0dXJuIDA7CisvKioKKyAqIGdmczJfbWFrZV9mc19ybyAtIFR1cm4gYSBSZWFkLVdyaXRlIEZTIGludG8gYSBSZWFkLU9ubHkgb25lCisgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQorICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX21ha2VfZnNfcm8oc3RydWN0IGdmczJfc2JkICpzZHApCit7CisJc3RydWN0IGdmczJfaG9sZGVyIHRfZ2g7CisJaW50IGVycm9yOworCisJZ2ZzMl9xdW90YV9zeW5jKHNkcCk7CisJZ2ZzMl9zdGF0ZnNfc3luYyhzZHApOworCisJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF90cmFuc19nbCwgTE1fU1RfU0hBUkVELCBHTF9OT0NBQ0hFLAorCQkJCSAgICZ0X2doKTsKKwlpZiAoZXJyb3IgJiYgIXRlc3RfYml0KFNERl9TSFVURE9XTiwgJnNkcC0+c2RfZmxhZ3MpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlnZnMyX21ldGFfc3luY2ZzKHNkcCk7CisJZ2ZzMl9sb2dfc2h1dGRvd24oc2RwKTsKKworCWNsZWFyX2JpdChTREZfSk9VUk5BTF9MSVZFLCAmc2RwLT5zZF9mbGFncyk7CisKKwlpZiAodF9naC5naF9nbCkKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnRfZ2gpOworCisJZ2ZzMl9xdW90YV9jbGVhbnVwKHNkcCk7CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgpAQCAtNzMsMTIgKzEzMyw2IEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwogCWludCBlcnJvcjsKIAotCWlmICghc2RwKQotCQlyZXR1cm47Ci0KLQlpZiAoIXN0cm5jbXAoc2ItPnNfdHlwZS0+bmFtZSwgImdmczJtZXRhIiwgOCkpCi0JCXJldHVybjsgLyogTm90aGluZyB0byBkbyAqLwotCiAJLyogIFVuZnJlZXplIHRoZSBmaWxlc3lzdGVtLCBpZiB3ZSBuZWVkIHRvICAqLwogCiAJbXV0ZXhfbG9jaygmc2RwLT5zZF9mcmVlemVfbG9jayk7CkBAIC0xMDEsNyArMTU1LDYgQEAKIAogCS8qICBSZWxlYXNlIHN0dWZmICAqLwogCi0JaXB1dChzZHAtPnNkX21hc3Rlcl9kaXIpOwogCWlwdXQoc2RwLT5zZF9qaW5kZXgpOwogCWlwdXQoc2RwLT5zZF9pbnVtX2lub2RlKTsKIAlpcHV0KHNkcC0+c2Rfc3RhdGZzX2lub2RlKTsKQEAgLTE1Miw2ICsyMDUsNyBAQAogICoKICAqIEZsdXNoZXMgdGhlIGxvZyB0byBkaXNrLgogICovCisKIHN0YXRpYyBpbnQgZ2ZzMl9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQogewogCXNiLT5zX2RpcnQgPSAwOwpAQCAtMjcwLDE0ICszMjQsNiBAQAogCQl9CiAJfQogCi0JaWYgKCpmbGFncyAmIChNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRSkpCi0JCXNldF9iaXQoU0RGX05PQVRJTUUsICZzZHAtPnNkX2ZsYWdzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChTREZfTk9BVElNRSwgJnNkcC0+c2RfZmxhZ3MpOwotCi0JLyogRG9uJ3QgbGV0IHRoZSBWRlMgdXBkYXRlIGF0aW1lcy4gIEdGUzIgaGFuZGxlcyB0aGlzIGl0c2VsZi4gKi8KLQkqZmxhZ3MgfD0gTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7Ci0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTI5NSw2ICszNDEsNyBAQAogICogaW5vZGUncyBibG9ja3MsIG9yIGFsdGVybmF0aXZlbHkgcGFzcyB0aGUgYmF0b24gb24gdG8gYW5vdGhlcgogICogbm9kZSBmb3IgbGF0ZXIgZGVhbGxvY2F0aW9uLgogICovCisKIHN0YXRpYyB2b2lkIGdmczJfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CkBAIC0zMzMsNiArMzgwLDE2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGlzX2FuY2VzdG9yKGNvbnN0IHN0cnVjdCBkZW50cnkgKmQxLCBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkMikKK3sKKwlkbyB7CisJCWlmIChkMSA9PSBkMikKKwkJCXJldHVybiAxOworCQlkMSA9IGQxLT5kX3BhcmVudDsKKwl9IHdoaWxlICghSVNfUk9PVChkMSkpOworCXJldHVybiAwOworfQorCiAvKioKICAqIGdmczJfc2hvd19vcHRpb25zIC0gU2hvdyBtb3VudCBvcHRpb25zIGZvciAvcHJvYy9tb3VudHMKICAqIEBzOiBzZXFfZmlsZSBzdHJ1Y3R1cmUKQEAgLTM0Niw2ICs0MDMsOCBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gbW50LT5tbnRfc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3QgZ2ZzMl9hcmdzICphcmdzID0gJnNkcC0+c2RfYXJnczsKIAorCWlmIChpc19hbmNlc3RvcihtbnQtPm1udF9yb290LCBzZHAtPnNkX21hc3Rlcl9kaXIpKQorCQlzZXFfcHJpbnRmKHMsICIsbWV0YSIpOwogCWlmIChhcmdzLT5hcl9sb2NrcHJvdG9bMF0pCiAJCXNlcV9wcmludGYocywgIixsb2NrcHJvdG89JXMiLCBhcmdzLT5hcl9sb2NrcHJvdG8pOwogCWlmIChhcmdzLT5hcl9sb2NrdGFibGVbMF0pCkBAIC00MTQsNiArNDczLDcgQEAKICAqIGNvbnZlcnNpb24gb24gdGhlIGlvcGVuIGxvY2ssIGJ1dCB3ZSBjYW4gY2hhbmdlIHRoYXQgbGF0ZXIuIFRoaXMKICAqIGlzIHNhZmUsIGp1c3QgbGVzcyBlZmZpY2llbnQuCiAgKi8KKwogc3RhdGljIHZvaWQgZ2ZzMl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CkBAIC00NzgsOCArNTM4LDYgQEAKIAljbGVhcl9pbm9kZShpbm9kZSk7CiB9CiAKLQotCiBzdGF0aWMgc3RydWN0IGlub2RlICpnZnMyX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IGNhODMxOTkuLmMzYmEzZDkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTMzLDMxMyArMzMsNiBAQAogI2luY2x1ZGUgInRyYW5zLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi1zdGF0aWMgY29uc3QgdTMyIGdmczJfb2xkX2ZzX2Zvcm1hdHNbXSA9IHsKLSAgICAgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBnZnMyX29sZF9tdWx0aWhvc3RfZm9ybWF0c1tdID0gewotICAgICAgICAwCi19OwotCi0vKioKLSAqIGdmczJfdHVuZV9pbml0IC0gRmlsbCBhIGdmczJfdHVuZSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICogQGd0OiB0dW5lCi0gKgotICovCi0KLXZvaWQgZ2ZzMl90dW5lX2luaXQoc3RydWN0IGdmczJfdHVuZSAqZ3QpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmd0LT5ndF9zcGluKTsKLQotCWd0LT5ndF9kZW1vdGVfc2VjcyA9IDMwMDsKLQlndC0+Z3RfaW5jb3JlX2xvZ19ibG9ja3MgPSAxMDI0OwotCWd0LT5ndF9sb2dfZmx1c2hfc2VjcyA9IDYwOwotCWd0LT5ndF9yZWNvdmVyZF9zZWNzID0gNjA7Ci0JZ3QtPmd0X2xvZ2Rfc2VjcyA9IDE7Ci0JZ3QtPmd0X3F1b3RhZF9zZWNzID0gNTsKLQlndC0+Z3RfcXVvdGFfc2ltdWxfc3luYyA9IDY0OwotCWd0LT5ndF9xdW90YV93YXJuX3BlcmlvZCA9IDEwOwotCWd0LT5ndF9xdW90YV9zY2FsZV9udW0gPSAxOwotCWd0LT5ndF9xdW90YV9zY2FsZV9kZW4gPSAxOwotCWd0LT5ndF9xdW90YV9jYWNoZV9zZWNzID0gMzAwOwotCWd0LT5ndF9xdW90YV9xdWFudHVtID0gNjA7Ci0JZ3QtPmd0X2F0aW1lX3F1YW50dW0gPSAzNjAwOwotCWd0LT5ndF9uZXdfZmlsZXNfamRhdGEgPSAwOwotCWd0LT5ndF9tYXhfcmVhZGFoZWFkID0gMSA8PCAxODsKLQlndC0+Z3Rfc3RhbGxfc2VjcyA9IDYwMDsKLQlndC0+Z3RfY29tcGxhaW5fc2VjcyA9IDEwOwotCWd0LT5ndF9zdGF0ZnNfcXVhbnR1bSA9IDMwOwotCWd0LT5ndF9zdGF0ZnNfc2xvdyA9IDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9jaGVja19zYiAtIENoZWNrIHN1cGVyYmxvY2sKLSAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCi0gKiBAc2I6IFRoZSBzdXBlcmJsb2NrCi0gKiBAc2lsZW50OiBEb24ndCBwcmludCBhIG1lc3NhZ2UgaWYgdGhlIGNoZWNrIGZhaWxzCi0gKgotICogQ2hlY2tzIHRoZSB2ZXJzaW9uIGNvZGUgb2YgdGhlIEZTIGlzIG9uZSB0aGF0IHdlIHVuZGVyc3RhbmQgaG93IHRvCi0gKiByZWFkIGFuZCB0aGF0IHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBvbi1kaXNrIHN0cnVjdHVyZXMgaGF2ZSBub3QKLSAqIGNoYW5nZWQuCi0gKi8KLQotaW50IGdmczJfY2hlY2tfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3NiX2hvc3QgKnNiLCBpbnQgc2lsZW50KQotewotCXVuc2lnbmVkIGludCB4OwotCi0JaWYgKHNiLT5zYl9tYWdpYyAhPSBHRlMyX01BR0lDIHx8Ci0JICAgIHNiLT5zYl90eXBlICE9IEdGUzJfTUVUQVRZUEVfU0IpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJHRlMyOiBub3QgYSBHRlMyIGZpbGVzeXN0ZW1cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiAgSWYgZm9ybWF0IG51bWJlcnMgbWF0Y2ggZXhhY3RseSwgd2UncmUgZG9uZS4gICovCi0KLQlpZiAoc2ItPnNiX2ZzX2Zvcm1hdCA9PSBHRlMyX0ZPUk1BVF9GUyAmJgotCSAgICBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCA9PSBHRlMyX0ZPUk1BVF9NVUxUSSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2ItPnNiX2ZzX2Zvcm1hdCAhPSBHRlMyX0ZPUk1BVF9GUykgewotCQlmb3IgKHggPSAwOyBnZnMyX29sZF9mc19mb3JtYXRzW3hdOyB4KyspCi0JCQlpZiAoZ2ZzMl9vbGRfZnNfZm9ybWF0c1t4XSA9PSBzYi0+c2JfZnNfZm9ybWF0KQotCQkJCWJyZWFrOwotCi0JCWlmICghZ2ZzMl9vbGRfZnNfZm9ybWF0c1t4XSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJHRlMyOiBjb2RlIHZlcnNpb24gKCV1LCAldSkgaXMgaW5jb21wYXRpYmxlICIKLQkJCSAgICAgICAid2l0aCBvbmRpc2sgZm9ybWF0ICgldSwgJXUpXG4iLAotCQkJICAgICAgIEdGUzJfRk9STUFUX0ZTLCBHRlMyX0ZPUk1BVF9NVUxUSSwKLQkJCSAgICAgICBzYi0+c2JfZnNfZm9ybWF0LCBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIkdGUzI6IEkgZG9uJ3Qga25vdyBob3cgdG8gdXBncmFkZSB0aGlzIEZTXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JaWYgKHNiLT5zYl9tdWx0aWhvc3RfZm9ybWF0ICE9IEdGUzJfRk9STUFUX01VTFRJKSB7Ci0JCWZvciAoeCA9IDA7IGdmczJfb2xkX211bHRpaG9zdF9mb3JtYXRzW3hdOyB4KyspCi0JCQlpZiAoZ2ZzMl9vbGRfbXVsdGlob3N0X2Zvcm1hdHNbeF0gPT0KLQkJCSAgICBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCkKLQkJCQlicmVhazsKLQotCQlpZiAoIWdmczJfb2xkX211bHRpaG9zdF9mb3JtYXRzW3hdKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIkdGUzI6IGNvZGUgdmVyc2lvbiAoJXUsICV1KSBpcyBpbmNvbXBhdGlibGUgIgotCQkJICAgICAgICJ3aXRoIG9uZGlzayBmb3JtYXQgKCV1LCAldSlcbiIsCi0JCQkgICAgICAgR0ZTMl9GT1JNQVRfRlMsIEdGUzJfRk9STUFUX01VTFRJLAotCQkJICAgICAgIHNiLT5zYl9mc19mb3JtYXQsIHNiLT5zYl9tdWx0aWhvc3RfZm9ybWF0KTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiR0ZTMjogSSBkb24ndCBrbm93IGhvdyB0byB1cGdyYWRlIHRoaXMgRlNcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlpZiAoIXNkcC0+c2RfYXJncy5hcl91cGdyYWRlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJHRlMyOiBjb2RlIHZlcnNpb24gKCV1LCAldSkgaXMgaW5jb21wYXRpYmxlICIKLQkJICAgICAgICJ3aXRoIG9uZGlzayBmb3JtYXQgKCV1LCAldSlcbiIsCi0JCSAgICAgICBHRlMyX0ZPUk1BVF9GUywgR0ZTMl9GT1JNQVRfTVVMVEksCi0JCSAgICAgICBzYi0+c2JfZnNfZm9ybWF0LCBzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCk7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJHRlMyOiBVc2UgdGhlIFwidXBncmFkZVwiIG1vdW50IG9wdGlvbiB0byB1cGdyYWRlICIKLQkJICAgICAgICJ0aGUgRlNcbiIpOwotCQlwcmludGsoS0VSTl9JTkZPICJHRlMyOiBTZWUgdGhlIG1hbnVhbCBmb3IgbW9yZSBkZXRhaWxzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgZW5kX2Jpb19pb19wYWdlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gYmlvLT5iaV9wcml2YXRlOwotCi0JaWYgKCFlcnJvcikKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ2ZzMjogZXJyb3IgJWQgcmVhZGluZyBzdXBlcmJsb2NrXG4iLCBlcnJvcik7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdmczJfc2JfaW4oc3RydWN0IGdmczJfc2JfaG9zdCAqc2IsIGNvbnN0IHZvaWQgKmJ1ZikKLXsKLQljb25zdCBzdHJ1Y3QgZ2ZzMl9zYiAqc3RyID0gYnVmOwotCi0Jc2ItPnNiX21hZ2ljID0gYmUzMl90b19jcHUoc3RyLT5zYl9oZWFkZXIubWhfbWFnaWMpOwotCXNiLT5zYl90eXBlID0gYmUzMl90b19jcHUoc3RyLT5zYl9oZWFkZXIubWhfdHlwZSk7Ci0Jc2ItPnNiX2Zvcm1hdCA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfaGVhZGVyLm1oX2Zvcm1hdCk7Ci0Jc2ItPnNiX2ZzX2Zvcm1hdCA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfZnNfZm9ybWF0KTsKLQlzYi0+c2JfbXVsdGlob3N0X2Zvcm1hdCA9IGJlMzJfdG9fY3B1KHN0ci0+c2JfbXVsdGlob3N0X2Zvcm1hdCk7Ci0Jc2ItPnNiX2JzaXplID0gYmUzMl90b19jcHUoc3RyLT5zYl9ic2l6ZSk7Ci0Jc2ItPnNiX2JzaXplX3NoaWZ0ID0gYmUzMl90b19jcHUoc3RyLT5zYl9ic2l6ZV9zaGlmdCk7Ci0Jc2ItPnNiX21hc3Rlcl9kaXIubm9fYWRkciA9IGJlNjRfdG9fY3B1KHN0ci0+c2JfbWFzdGVyX2Rpci5ub19hZGRyKTsKLQlzYi0+c2JfbWFzdGVyX2Rpci5ub19mb3JtYWxfaW5vID0gYmU2NF90b19jcHUoc3RyLT5zYl9tYXN0ZXJfZGlyLm5vX2Zvcm1hbF9pbm8pOwotCXNiLT5zYl9yb290X2Rpci5ub19hZGRyID0gYmU2NF90b19jcHUoc3RyLT5zYl9yb290X2Rpci5ub19hZGRyKTsKLQlzYi0+c2Jfcm9vdF9kaXIubm9fZm9ybWFsX2lubyA9IGJlNjRfdG9fY3B1KHN0ci0+c2Jfcm9vdF9kaXIubm9fZm9ybWFsX2lubyk7Ci0KLQltZW1jcHkoc2ItPnNiX2xvY2twcm90bywgc3RyLT5zYl9sb2NrcHJvdG8sIEdGUzJfTE9DS05BTUVfTEVOKTsKLQltZW1jcHkoc2ItPnNiX2xvY2t0YWJsZSwgc3RyLT5zYl9sb2NrdGFibGUsIEdGUzJfTE9DS05BTUVfTEVOKTsKLX0KLQotLyoqCi0gKiBnZnMyX3JlYWRfc3VwZXIgLSBSZWFkIHRoZSBnZnMyIHN1cGVyIGJsb2NrIGZyb20gZGlzawotICogQHNkcDogVGhlIEdGUzIgc3VwZXIgYmxvY2sKLSAqIEBzZWN0b3I6IFRoZSBsb2NhdGlvbiBvZiB0aGUgc3VwZXIgYmxvY2sKLSAqIEBlcnJvcjogVGhlIGVycm9yIGNvZGUgdG8gcmV0dXJuCi0gKgotICogVGhpcyB1c2VzIHRoZSBiaW8gZnVuY3Rpb25zIHRvIHJlYWQgdGhlIHN1cGVyIGJsb2NrIGZyb20gZGlzawotICogYmVjYXVzZSB3ZSB3YW50IHRvIGJlIDEwMCUgc3VyZSB0aGF0IHdlIG5ldmVyIHJlYWQgY2FjaGVkIGRhdGEuCi0gKiBBIHN1cGVyIGJsb2NrIGlzIHJlYWQgdHdpY2Ugb25seSBkdXJpbmcgZWFjaCBHRlMyIG1vdW50IGFuZCBpcwotICogbmV2ZXIgd3JpdHRlbiB0byBieSB0aGUgZmlsZXN5c3RlbS4gVGhlIGZpcnN0IHRpbWUgaXRzIHJlYWQgbm8KLSAqIGxvY2tzIGFyZSBoZWxkLCBhbmQgdGhlIG9ubHkgZGV0YWlscyB3aGljaCBhcmUgbG9va2VkIGF0IGFyZSB0aG9zZQotICogcmVsYXRpbmcgdG8gdGhlIGxvY2tpbmcgcHJvdG9jb2wuIE9uY2UgbG9ja2luZyBpcyB1cCBhbmQgd29ya2luZywKLSAqIHRoZSBzYiBpcyByZWFkIGFnYWluIHVuZGVyIHRoZSBsb2NrIHRvIGVzdGFibGlzaCB0aGUgbG9jYXRpb24gb2YKLSAqIHRoZSBtYXN0ZXIgZGlyZWN0b3J5IChjb250YWlucyBwb2ludGVycyB0byBqb3VybmFscyBldGMpIGFuZCB0aGUKLSAqIHJvb3QgZGlyZWN0b3J5LgotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciBlcnJvcgotICovCi0KLWludCBnZnMyX3JlYWRfc3VwZXIoc3RydWN0IGdmczJfc2JkICpzZHAsIHNlY3Rvcl90IHNlY3RvcikKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2RwLT5zZF92ZnM7Ci0Jc3RydWN0IGdmczJfc2IgKnA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IGJpbyAqYmlvOwotCi0JcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOwotCWlmICh1bmxpa2VseSghcGFnZSkpCi0JCXJldHVybiAtRU5PQlVGUzsKLQotCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCUNsZWFyUGFnZURpcnR5KHBhZ2UpOwotCWxvY2tfcGFnZShwYWdlKTsKLQotCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7Ci0JaWYgKHVubGlrZWx5KCFiaW8pKSB7Ci0JCV9fZnJlZV9wYWdlKHBhZ2UpOwotCQlyZXR1cm4gLUVOT0JVRlM7Ci0JfQotCi0JYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3IgKiAoc2ItPnNfYmxvY2tzaXplID4+IDkpOwotCWJpby0+YmlfYmRldiA9IHNiLT5zX2JkZXY7Ci0JYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgUEFHRV9TSVpFLCAwKTsKLQotCWJpby0+YmlfZW5kX2lvID0gZW5kX2Jpb19pb19wYWdlOwotCWJpby0+YmlfcHJpdmF0ZSA9IHBhZ2U7Ci0Jc3VibWl0X2JpbyhSRUFEX1NZTkMgfCAoMSA8PCBCSU9fUldfTUVUQSksIGJpbyk7Ci0Jd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQliaW9fcHV0KGJpbyk7Ci0JaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJX19mcmVlX3BhZ2UocGFnZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlwID0ga21hcChwYWdlKTsKLQlnZnMyX3NiX2luKCZzZHAtPnNkX3NiLCBwKTsKLQlrdW5tYXAocGFnZSk7Ci0JX19mcmVlX3BhZ2UocGFnZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9yZWFkX3NiIC0gUmVhZCBzdXBlciBibG9jawotICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawotICogQGdsOiB0aGUgZ2xvY2sgZm9yIHRoZSBzdXBlcmJsb2NrIChhc3N1bWVkIHRvIGJlIGhlbGQpCi0gKiBAc2lsZW50OiBEb24ndCBwcmludCBtZXNzYWdlIGlmIG1vdW50IGZhaWxzCi0gKgotICovCi0KLWludCBnZnMyX3JlYWRfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgaW50IHNpbGVudCkKLXsKLQl1MzIgaGFzaF9ibG9ja3MsIGluZF9ibG9ja3MsIGxlYWZfYmxvY2tzOwotCXUzMiB0bXBfYmxvY2tzOwotCXVuc2lnbmVkIGludCB4OwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9yZWFkX3N1cGVyKHNkcCwgR0ZTMl9TQl9BRERSID4+IHNkcC0+c2RfZnNiMmJiX3NoaWZ0KTsKLQlpZiAoZXJyb3IpIHsKLQkJaWYgKCFzaWxlbnQpCi0JCQlmc19lcnIoc2RwLCAiY2FuJ3QgcmVhZCBzdXBlcmJsb2NrXG4iKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWVycm9yID0gZ2ZzMl9jaGVja19zYihzZHAsICZzZHAtPnNkX3NiLCBzaWxlbnQpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0Jc2RwLT5zZF9mc2IyYmJfc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0KLQkJCSAgICAgICBHRlMyX0JBU0lDX0JMT0NLX1NISUZUOwotCXNkcC0+c2RfZnNiMmJiID0gMSA8PCBzZHAtPnNkX2ZzYjJiYl9zaGlmdDsKLQlzZHAtPnNkX2RpcHRycyA9IChzZHAtPnNkX3NiLnNiX2JzaXplIC0KLQkJCSAgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpIC8gc2l6ZW9mKHU2NCk7Ci0Jc2RwLT5zZF9pbnB0cnMgPSAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCi0JCQkgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcikpIC8gc2l6ZW9mKHU2NCk7Ci0Jc2RwLT5zZF9qYnNpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKTsKLQlzZHAtPnNkX2hhc2hfYnNpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC8gMjsKLQlzZHAtPnNkX2hhc2hfYnNpemVfc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0gMTsKLQlzZHAtPnNkX2hhc2hfcHRycyA9IHNkcC0+c2RfaGFzaF9ic2l6ZSAvIHNpemVvZih1NjQpOwotCXNkcC0+c2RfcWNfcGVyX2Jsb2NrID0gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQotCQkJCXNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcikpIC8KLQkJCSAgICAgICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhX2NoYW5nZSk7Ci0KLQkvKiBDb21wdXRlIG1heGltdW0gcmVzZXJ2YXRpb24gcmVxdWlyZWQgdG8gYWRkIGEgZW50cnkgdG8gYSBkaXJlY3RvcnkgKi8KLQotCWhhc2hfYmxvY2tzID0gRElWX1JPVU5EX1VQKHNpemVvZih1NjQpICogKDEgPDwgR0ZTMl9ESVJfTUFYX0RFUFRIKSwKLQkJCSAgICAgc2RwLT5zZF9qYnNpemUpOwotCi0JaW5kX2Jsb2NrcyA9IDA7Ci0JZm9yICh0bXBfYmxvY2tzID0gaGFzaF9ibG9ja3M7IHRtcF9ibG9ja3MgPiBzZHAtPnNkX2RpcHRyczspIHsKLQkJdG1wX2Jsb2NrcyA9IERJVl9ST1VORF9VUCh0bXBfYmxvY2tzLCBzZHAtPnNkX2lucHRycyk7Ci0JCWluZF9ibG9ja3MgKz0gdG1wX2Jsb2NrczsKLQl9Ci0KLQlsZWFmX2Jsb2NrcyA9IDIgKyBHRlMyX0RJUl9NQVhfREVQVEg7Ci0KLQlzZHAtPnNkX21heF9kaXJyZXMgPSBoYXNoX2Jsb2NrcyArIGluZF9ibG9ja3MgKyBsZWFmX2Jsb2NrczsKLQotCXNkcC0+c2RfaGVpZ2h0c2l6ZVswXSA9IHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQotCQkJCXNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwotCXNkcC0+c2RfaGVpZ2h0c2l6ZVsxXSA9IHNkcC0+c2Rfc2Iuc2JfYnNpemUgKiBzZHAtPnNkX2RpcHRyczsKLQlmb3IgKHggPSAyOzsgeCsrKSB7Ci0JCXU2NCBzcGFjZSwgZDsKLQkJdTMyIG07Ci0KLQkJc3BhY2UgPSBzZHAtPnNkX2hlaWdodHNpemVbeCAtIDFdICogc2RwLT5zZF9pbnB0cnM7Ci0JCWQgPSBzcGFjZTsKLQkJbSA9IGRvX2RpdihkLCBzZHAtPnNkX2lucHRycyk7Ci0KLQkJaWYgKGQgIT0gc2RwLT5zZF9oZWlnaHRzaXplW3ggLSAxXSB8fCBtKQotCQkJYnJlYWs7Ci0JCXNkcC0+c2RfaGVpZ2h0c2l6ZVt4XSA9IHNwYWNlOwotCX0KLQlzZHAtPnNkX21heF9oZWlnaHQgPSB4OwotCXNkcC0+c2RfaGVpZ2h0c2l6ZVt4XSA9IH4wOwotCWdmczJfYXNzZXJ0KHNkcCwgc2RwLT5zZF9tYXhfaGVpZ2h0IDw9IEdGUzJfTUFYX01FVEFfSEVJR0hUKTsKLQotCXNkcC0+c2RfamhlaWdodHNpemVbMF0gPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0KLQkJCQkgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7Ci0Jc2RwLT5zZF9qaGVpZ2h0c2l6ZVsxXSA9IHNkcC0+c2RfamJzaXplICogc2RwLT5zZF9kaXB0cnM7Ci0JZm9yICh4ID0gMjs7IHgrKykgewotCQl1NjQgc3BhY2UsIGQ7Ci0JCXUzMiBtOwotCi0JCXNwYWNlID0gc2RwLT5zZF9qaGVpZ2h0c2l6ZVt4IC0gMV0gKiBzZHAtPnNkX2lucHRyczsKLQkJZCA9IHNwYWNlOwotCQltID0gZG9fZGl2KGQsIHNkcC0+c2RfaW5wdHJzKTsKLQotCQlpZiAoZCAhPSBzZHAtPnNkX2poZWlnaHRzaXplW3ggLSAxXSB8fCBtKQotCQkJYnJlYWs7Ci0JCXNkcC0+c2RfamhlaWdodHNpemVbeF0gPSBzcGFjZTsKLQl9Ci0Jc2RwLT5zZF9tYXhfamhlaWdodCA9IHg7Ci0Jc2RwLT5zZF9qaGVpZ2h0c2l6ZVt4XSA9IH4wOwotCWdmczJfYXNzZXJ0KHNkcCwgc2RwLT5zZF9tYXhfamhlaWdodCA8PSBHRlMyX01BWF9NRVRBX0hFSUdIVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKiBnZnMyX2ppbmRleF9ob2xkIC0gR3JhYiBhIGxvY2sgb24gdGhlIGppbmRleAogICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawpAQCAtNTgxLDM5ICsyNzQsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoqCi0gKiBnZnMyX21ha2VfZnNfcm8gLSBUdXJuIGEgUmVhZC1Xcml0ZSBGUyBpbnRvIGEgUmVhZC1Pbmx5IG9uZQotICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX21ha2VfZnNfcm8oc3RydWN0IGdmczJfc2JkICpzZHApCi17Ci0Jc3RydWN0IGdmczJfaG9sZGVyIHRfZ2g7Ci0JaW50IGVycm9yOwotCi0JZ2ZzMl9xdW90YV9zeW5jKHNkcCk7Ci0JZ2ZzMl9zdGF0ZnNfc3luYyhzZHApOwotCi0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF90cmFuc19nbCwgTE1fU1RfU0hBUkVELCBHTF9OT0NBQ0hFLAotCQkJCSAgICZ0X2doKTsKLQlpZiAoZXJyb3IgJiYgIXRlc3RfYml0KFNERl9TSFVURE9XTiwgJnNkcC0+c2RfZmxhZ3MpKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlnZnMyX21ldGFfc3luY2ZzKHNkcCk7Ci0JZ2ZzMl9sb2dfc2h1dGRvd24oc2RwKTsKLQotCWNsZWFyX2JpdChTREZfSk9VUk5BTF9MSVZFLCAmc2RwLT5zZF9mbGFncyk7Ci0KLQlpZiAodF9naC5naF9nbCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnRfZ2gpOwotCi0JZ2ZzMl9xdW90YV9jbGVhbnVwKHNkcCk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIHN0YXRpYyB2b2lkIGdmczJfc3RhdGZzX2NoYW5nZV9pbihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc3RyID0gYnVmOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5oIGIvZnMvZ2ZzMi9zdXBlci5oCmluZGV4IDQ0MzYxZWMuLjUwYTRjOWIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuaAorKysgYi9mcy9nZnMyL3N1cGVyLmgKQEAgLTEyLDExICsxMiw2IEBACiAKICNpbmNsdWRlICJpbmNvcmUuaCIKIAotdm9pZCBnZnMyX3R1bmVfaW5pdChzdHJ1Y3QgZ2ZzMl90dW5lICpndCk7Ci0KLWludCBnZnMyX2NoZWNrX3NiKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zYl9ob3N0ICpzYiwgaW50IHNpbGVudCk7Ci1pbnQgZ2ZzMl9yZWFkX3NiKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGludCBzaWxlbnQpOwotaW50IGdmczJfcmVhZF9zdXBlcihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc2VjdG9yX3Qgc2VjdG9yKTsKIHZvaWQgZ2ZzMl9sbV91bm1vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2ZzMl9qaW5kZXhfc2l6ZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKQEAgLTQwLDcgKzM1LDYgQEAKIAkJCSAgICAgIHN0cnVjdCBnZnMyX2lub2RlICoqaXBwKTsKIAogaW50IGdmczJfbWFrZV9mc19ydyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7Ci1pbnQgZ2ZzMl9tYWtlX2ZzX3JvKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAogaW50IGdmczJfc3RhdGZzX2luaXQoc3RydWN0IGdmczJfc2JkICpzZHApOwogdm9pZCBnZnMyX3N0YXRmc19jaGFuZ2Uoc3RydWN0IGdmczJfc2JkICpzZHAsCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N5cy5jIGIvZnMvZ2ZzMi9zeXMuYwppbmRleCA3NDg0NjU1Li43ZTE4NzlmIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTI2OSwxNCArMjY5LDYgQEAKIEFSR1NfQVRUUihzdWlkZGlyLCAgICAgICAgICIlZFxuIik7CiBBUkdTX0FUVFIoZGF0YSwgICAgICAgICAgICAiJWRcbiIpOwogCi0vKiBvbmUgb2RkYmFsbCBkb2Vzbid0IGZpdCB0aGUgbWFjcm8gbW9sZCAqLwotc3RhdGljIHNzaXplX3Qgbm9hdGltZV9zaG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCi0JCQkhIXRlc3RfYml0KFNERl9OT0FUSU1FLCAmc2RwLT5zZF9mbGFncykpOwotfQotc3RhdGljIHN0cnVjdCBhcmdzX2F0dHIgYXJnc19hdHRyX25vYXRpbWUgPSBfX0FUVFJfUk8obm9hdGltZSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcmdzX2F0dHJzW10gPSB7CiAJJmFyZ3NfYXR0cl9sb2NrcHJvdG8uYXR0ciwKIAkmYXJnc19hdHRyX2xvY2t0YWJsZS5hdHRyLApAQCAtMjkyLDcgKzI4NCw2IEBACiAJJmFyZ3NfYXR0cl9xdW90YS5hdHRyLAogCSZhcmdzX2F0dHJfc3VpZGRpci5hdHRyLAogCSZhcmdzX2F0dHJfZGF0YS5hdHRyLAotCSZhcmdzX2F0dHJfbm9hdGltZS5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC00MDcsNyArMzk4LDYgQEAKIFRVTkVfQVRUUihsb2dfZmx1c2hfc2VjcywgMCk7CiBUVU5FX0FUVFIocXVvdGFfd2Fybl9wZXJpb2QsIDApOwogVFVORV9BVFRSKHF1b3RhX3F1YW50dW0sIDApOwotVFVORV9BVFRSKGF0aW1lX3F1YW50dW0sIDApOwogVFVORV9BVFRSKG1heF9yZWFkYWhlYWQsIDApOwogVFVORV9BVFRSKGNvbXBsYWluX3NlY3MsIDApOwogVFVORV9BVFRSKHN0YXRmc19zbG93LCAwKTsKQEAgLTQyNyw3ICs0MTcsNiBAQAogCSZ0dW5lX2F0dHJfbG9nX2ZsdXNoX3NlY3MuYXR0ciwKIAkmdHVuZV9hdHRyX3F1b3RhX3dhcm5fcGVyaW9kLmF0dHIsCiAJJnR1bmVfYXR0cl9xdW90YV9xdWFudHVtLmF0dHIsCi0JJnR1bmVfYXR0cl9hdGltZV9xdWFudHVtLmF0dHIsCiAJJnR1bmVfYXR0cl9tYXhfcmVhZGFoZWFkLmF0dHIsCiAJJnR1bmVfYXR0cl9jb21wbGFpbl9zZWNzLmF0dHIsCiAJJnR1bmVfYXR0cl9zdGF0ZnNfc2xvdy5hdHRyLApkaWZmIC0tZ2l0IGEvZnMvaGZzL2NhdGFsb2cuYyBiL2ZzL2hmcy9jYXRhbG9nLmMKaW5kZXggYmE4NTE1Ny4uNmQ5OGYxMSAxMDA2NDQKLS0tIGEvZnMvaGZzL2NhdGFsb2cuYworKysgYi9mcy9oZnMvY2F0YWxvZy5jCkBAIC0xOTAsNiArMTkwLDEwIEBACiAKIAlmZC0+c2VhcmNoX2tleS0+Y2F0LlBhcklEID0gcmVjLnRocmVhZC5QYXJJRDsKIAlsZW4gPSBmZC0+c2VhcmNoX2tleS0+Y2F0LkNOYW1lLmxlbiA9IHJlYy50aHJlYWQuQ05hbWUubGVuOworCWlmIChsZW4gPiBIRlNfTkFNRUxFTikgeworCQlwcmludGsoS0VSTl9FUlIgImhmczogYmFkIGNhdGFsb2cgbmFtZWxlbmd0aFxuIik7CisJCXJldHVybiAtRUlPOworCX0KIAltZW1jcHkoZmQtPnNlYXJjaF9rZXktPmNhdC5DTmFtZS5uYW1lLCByZWMudGhyZWFkLkNOYW1lLm5hbWUsIGxlbik7CiAJcmV0dXJuIGhmc19icmVjX2ZpbmQoZmQpOwogfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL3N1cGVyLmMgYi9mcy9oZnMvc3VwZXIuYwppbmRleCA0YWJiMTA0Li4zYzdjNzYzIDEwMDY0NAotLS0gYS9mcy9oZnMvc3VwZXIuYworKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJb3B0X2VycgogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXsgb3B0X3VpZCwgInVpZD0ldSIgfSwKIAl7IG9wdF9naWQsICJnaWQ9JXUiIH0sCiAJeyBvcHRfdW1hc2ssICJ1bWFzaz0lbyIgfSwKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYml0bWFwLmMgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCmluZGV4IGQxMjhhMjViLi5lYTMwYWZjIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2JpdG1hcC5jCisrKyBiL2ZzL2hmc3BsdXMvYml0bWFwLmMKQEAgLTMyLDYgKzMyLDEwIEBACiAJbXV0ZXhfbG9jaygmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tdXRleCk7CiAJbWFwcGluZyA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfbWFwcGluZzsKIAlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCXN0YXJ0ID0gc2l6ZTsKKwkJZ290byBvdXQ7CisJfQogCXBwdHIgPSBrbWFwKHBhZ2UpOwogCWN1cnIgPSBwcHRyICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX0JJVFMgLSAxKSkgLyAzMjsKIAlpID0gb2Zmc2V0ICUgMzI7CkBAIC03Myw2ICs3NywxMCBAQAogCQkJYnJlYWs7CiAJCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFMsCiAJCQkJCSBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJc3RhcnQgPSBzaXplOworCQkJZ290byBvdXQ7CisJCX0KIAkJY3VyciA9IHBwdHIgPSBrbWFwKHBhZ2UpOwogCQlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQogCQkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOwpAQCAtMTIwLDYgKzEyOCwxMCBAQAogCQlvZmZzZXQgKz0gUEFHRV9DQUNIRV9CSVRTOwogCQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAogCQkJCQkgTlVMTCk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCXN0YXJ0ID0gc2l6ZTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCXBwdHIgPSBrbWFwKHBhZ2UpOwogCQljdXJyID0gcHB0cjsKIAkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9jYXRhbG9nLmMgYi9mcy9oZnNwbHVzL2NhdGFsb2cuYwppbmRleCBiYTExN2M0Li5mNjg3NGFjIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2NhdGFsb2cuYworKysgYi9mcy9oZnNwbHVzL2NhdGFsb2cuYwpAQCAtMTY4LDYgKzE2OCwxMSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwlpZiAoYmUxNl90b19jcHUodG1wLnRocmVhZC5ub2RlTmFtZS5sZW5ndGgpID4gMjU1KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBjYXRhbG9nIG5hbWUgbGVuZ3RoIGNvcnJ1cHRlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwogCWhmc3BsdXNfY2F0X2J1aWxkX2tleV91bmkoZmQtPnNlYXJjaF9rZXksIGJlMzJfdG9fY3B1KHRtcC50aHJlYWQucGFyZW50SUQpLAogCQkJCSAmdG1wLnRocmVhZC5ub2RlTmFtZSk7CiAJcmV0dXJuIGhmc19icmVjX2ZpbmQoZmQpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9vcHRpb25zLmMgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwppbmRleCA5OTk3Y2JmLi45Njk5YzU2IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL29wdGlvbnMuYworKysgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwpAQCAtMjUsNyArMjUsNyBAQAogCW9wdF9mb3JjZSwgb3B0X2VycgogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXsgb3B0X2NyZWF0b3IsICJjcmVhdG9yPSVzIiB9LAogCXsgb3B0X3R5cGUsICJ0eXBlPSVzIiB9LAogCXsgb3B0X3VtYXNrLCAidW1hc2s9JW8iIH0sCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggZTgzNGU1Ny4uZWI3NDUzMSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJfSBlbHNlIGlmICh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfU09GVExPQ0spKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhmczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwotCX0gZWxzZSBpZiAodmhkci0+YXR0cmlidXRlcyAmIGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX0pPVVJOQUxFRCkpIHsKKwl9IGVsc2UgaWYgKCh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfSk9VUk5BTEVEKSkgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGZzOiB3cml0ZSBhY2Nlc3MgdG8gYSBqb3VybmFsZWQgZmlsZXN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkLCAiCiAJCSAgICAgICAidXNlIHRoZSBmb3JjZSBvcHRpb24gYXQgeW91ciBvd24gcmlzaywgbW91bnRpbmcgcmVhZC1vbmx5LlxuIik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvc3VwZXIuYyBiL2ZzL2hwZnMvc3VwZXIuYwppbmRleCBiOGFlOWM5Li4yOWFkNDYxIDEwMDY0NAotLS0gYS9mcy9ocGZzL3N1cGVyLmMKKysrIGIvZnMvaHBmcy9zdXBlci5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlPcHRfdGltZXNoaWZ0LCBPcHRfZXJyLAogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfaGVscCwgImhlbHAifSwKIAl7T3B0X3VpZCwgInVpZD0ldSJ9LAogCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IDNmNTg5MjMuLjYxZWRjNzAgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJT3B0X2VyciwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X3NpemUsCSJzaXplPSVzIn0sCiAJe09wdF9ucl9pbm9kZXMsCSJucl9pbm9kZXM9JXMifSwKIAl7T3B0X21vZGUsCSJtb2RlPSVvIn0sCmRpZmYgLS1naXQgYS9mcy9pbm90aWZ5X3VzZXIuYyBiL2ZzL2lub3RpZnlfdXNlci5jCmluZGV4IDYwMjQ5NDIuLmQ4NWM3ZDkgMTAwNjQ0Ci0tLSBhL2ZzL2lub3RpZnlfdXNlci5jCisrKyBiL2ZzL2lub3RpZnlfdXNlci5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIH0KIAogLyoKLSAqIHJlbW92ZV9rZXZlbnQgLSBjbGVhbnMgdXAgYW5kIHVsdGltYXRlbHkgZnJlZXMgdGhlIGdpdmVuIGtldmVudAorICogcmVtb3ZlX2tldmVudCAtIGNsZWFucyB1cCB0aGUgZ2l2ZW4ga2V2ZW50CiAgKgogICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmV2X211dGV4LgogICovCkBAIC0zMzQsNyArMzM0LDEzIEBACiAKIAlkZXYtPmV2ZW50X2NvdW50LS07CiAJZGV2LT5xdWV1ZV9zaXplIC09IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBrZXZlbnQtPmV2ZW50LmxlbjsKK30KIAorLyoKKyAqIGZyZWVfa2V2ZW50IC0gZnJlZXMgdGhlIGdpdmVuIGtldmVudC4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9rZXZlbnQoc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQpCit7CiAJa2ZyZWUoa2V2ZW50LT5uYW1lKTsKIAlrbWVtX2NhY2hlX2ZyZWUoZXZlbnRfY2FjaGVwLCBrZXZlbnQpOwogfQpAQCAtMzUwLDYgKzM1Niw3IEBACiAJCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OwogCQlrZXZlbnQgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsKIAkJcmVtb3ZlX2tldmVudChkZXYsIGtldmVudCk7CisJCWZyZWVfa2V2ZW50KGtldmVudCk7CiAJfQogfQogCkBAIC00MzMsMTcgKzQ0MCwxNSBAQAogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXdoaWxlICgxKSB7Ci0JCWludCBldmVudHM7CiAKIAkJcHJlcGFyZV90b193YWl0KCZkZXYtPndxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAogCQltdXRleF9sb2NrKCZkZXYtPmV2X211dGV4KTsKLQkJZXZlbnRzID0gIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmV2X211dGV4KTsKLQkJaWYgKGV2ZW50cykgeworCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkgewogCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5ldl9tdXRleCk7CiAKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CiAJCQlyZXQgPSAtRUFHQUlOOwpAQCAtNDYyLDcgKzQ2Nyw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW11dGV4X2xvY2soJmRldi0+ZXZfbXV0ZXgpOwogCXdoaWxlICgxKSB7CiAJCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OwogCkBAIC00ODEsNiArNDg1LDEzIEBACiAJCQl9CiAJCQlicmVhazsKIAkJfQorCQlyZW1vdmVfa2V2ZW50KGRldiwga2V2ZW50KTsKKworCQkvKgorCQkgKiBNdXN0IHBlcmZvcm0gdGhlIGNvcHlfdG9fdXNlciBvdXRzaWRlIHRoZSBtdXRleCBpbiBvcmRlcgorCQkgKiB0byBhdm9pZCBhIGxvY2sgb3JkZXIgcmV2ZXJzYWwgd2l0aCBtbWFwX3NlbS4KKwkJICovCisJCW11dGV4X3VubG9jaygmZGV2LT5ldl9tdXRleCk7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZrZXZlbnQtPmV2ZW50LCBldmVudF9zaXplKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTQ5OCw3ICs1MDksOSBAQAogCQkJY291bnQgLT0ga2V2ZW50LT5ldmVudC5sZW47CiAJCX0KIAotCQlyZW1vdmVfa2V2ZW50KGRldiwga2V2ZW50KTsKKwkJZnJlZV9rZXZlbnQoa2V2ZW50KTsKKworCQltdXRleF9sb2NrKCZkZXYtPmV2X211dGV4KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmV2X211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZnMvaW9jdGwuYyBiL2ZzL2lvY3RsLmMKaW5kZXggN2RiMzJiMy4uZDE1Mjg1NiAxMDA2NDQKLS0tIGEvZnMvaW9jdGwuYworKysgYi9mcy9pb2N0bC5jCkBAIC0xMyw5ICsxMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKKy8qIFNvIHRoYXQgdGhlIGZpZW1hcCBhY2Nlc3MgY2hlY2tzIGNhbid0IG92ZXJmbG93IG9uIDMyIGJpdCBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgRklFTUFQX01BWF9FWFRFTlRTCShVSU5UX01BWCAvIHNpemVvZihzdHJ1Y3QgZmllbWFwX2V4dGVudCkpCisKIC8qKgogICogdmZzX2lvY3RsIC0gY2FsbCBmaWxlc3lzdGVtIHNwZWNpZmljIGlvY3RsIG1ldGhvZHMKICAqIEBmaWxwOglvcGVuIGZpbGUgdG8gaW52b2tlIGlvY3RsIG1ldGhvZCBvbgpAQCAtNzEsNiArNzYsMjc2IEBACiAJcmV0dXJuIHB1dF91c2VyKHJlcywgcCk7CiB9CiAKKy8qKgorICogZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQgLSBGaWVtYXAgaGVscGVyIGZ1bmN0aW9uCisgKiBAZmllaW5mbzoJRmllbWFwIGNvbnRleHQgcGFzc2VkIGludG8gLT5maWVtYXAKKyAqIEBsb2dpY2FsOglFeHRlbnQgbG9naWNhbCBzdGFydCBvZmZzZXQsIGluIGJ5dGVzCisgKiBAcGh5czoJRXh0ZW50IHBoeXNpY2FsIHN0YXJ0IG9mZnNldCwgaW4gYnl0ZXMKKyAqIEBsZW46CUV4dGVudCBsZW5ndGgsIGluIGJ5dGVzCisgKiBAZmxhZ3M6CUZJRU1BUF9FWFRFTlQgZmxhZ3MgdGhhdCBkZXNjcmliZSB0aGlzIGV4dGVudAorICoKKyAqIENhbGxlZCBmcm9tIGZpbGUgc3lzdGVtIC0+ZmllbWFwIGNhbGxiYWNrLiBXaWxsIHBvcHVsYXRlIGV4dGVudAorICogaW5mbyBhcyBwYXNzZWQgaW4gdmlhIGFyZ3VtZW50cyBhbmQgY29weSB0byB1c2VyIG1lbW9yeS4gT24KKyAqIHN1Y2Nlc3MsIGV4dGVudCBjb3VudCBvbiBmaWVpbmZvIGlzIGluY3JlbWVudGVkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IsIDEgaWYgdGhpcyB3YXMgdGhlIGxhc3QKKyAqIGV4dGVudCB0aGF0IHdpbGwgZml0IGluIHVzZXIgYXJyYXkuCisgKi8KKyNkZWZpbmUgU0VUX1VOS05PV05fRkxBR1MJKEZJRU1BUF9FWFRFTlRfREVMQUxMT0MpCisjZGVmaW5lIFNFVF9OT19VTk1PVU5URURfSU9fRkxBR1MJKEZJRU1BUF9FWFRFTlRfREFUQV9FTkNSWVBURUQpCisjZGVmaW5lIFNFVF9OT1RfQUxJR05FRF9GTEFHUwkoRklFTUFQX0VYVEVOVF9EQVRBX1RBSUx8RklFTUFQX0VYVEVOVF9EQVRBX0lOTElORSkKK2ludCBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLCB1NjQgbG9naWNhbCwKKwkJCSAgICB1NjQgcGh5cywgdTY0IGxlbiwgdTMyIGZsYWdzKQoreworCXN0cnVjdCBmaWVtYXBfZXh0ZW50IGV4dGVudDsKKwlzdHJ1Y3QgZmllbWFwX2V4dGVudCAqZGVzdCA9IGZpZWluZm8tPmZpX2V4dGVudHNfc3RhcnQ7CisKKwkvKiBvbmx5IGNvdW50IHRoZSBleHRlbnRzICovCisJaWYgKGZpZWluZm8tPmZpX2V4dGVudHNfbWF4ID09IDApIHsKKwkJZmllaW5mby0+ZmlfZXh0ZW50c19tYXBwZWQrKzsKKwkJcmV0dXJuIChmbGFncyAmIEZJRU1BUF9FWFRFTlRfTEFTVCkgPyAxIDogMDsKKwl9CisKKwlpZiAoZmllaW5mby0+ZmlfZXh0ZW50c19tYXBwZWQgPj0gZmllaW5mby0+ZmlfZXh0ZW50c19tYXgpCisJCXJldHVybiAxOworCisJaWYgKGZsYWdzICYgU0VUX1VOS05PV05fRkxBR1MpCisJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfVU5LTk9XTjsKKwlpZiAoZmxhZ3MgJiBTRVRfTk9fVU5NT1VOVEVEX0lPX0ZMQUdTKQorCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX0VOQ09ERUQ7CisJaWYgKGZsYWdzICYgU0VUX05PVF9BTElHTkVEX0ZMQUdTKQorCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX05PVF9BTElHTkVEOworCisJbWVtc2V0KCZleHRlbnQsIDAsIHNpemVvZihleHRlbnQpKTsKKwlleHRlbnQuZmVfbG9naWNhbCA9IGxvZ2ljYWw7CisJZXh0ZW50LmZlX3BoeXNpY2FsID0gcGh5czsKKwlleHRlbnQuZmVfbGVuZ3RoID0gbGVuOworCWV4dGVudC5mZV9mbGFncyA9IGZsYWdzOworCisJZGVzdCArPSBmaWVpbmZvLT5maV9leHRlbnRzX21hcHBlZDsKKwlpZiAoY29weV90b191c2VyKGRlc3QsICZleHRlbnQsIHNpemVvZihleHRlbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmaWVpbmZvLT5maV9leHRlbnRzX21hcHBlZCsrOworCWlmIChmaWVpbmZvLT5maV9leHRlbnRzX21hcHBlZCA9PSBmaWVpbmZvLT5maV9leHRlbnRzX21heCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIChmbGFncyAmIEZJRU1BUF9FWFRFTlRfTEFTVCkgPyAxIDogMDsKK30KK0VYUE9SVF9TWU1CT0woZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQpOworCisvKioKKyAqIGZpZW1hcF9jaGVja19mbGFncyAtIGNoZWNrIHZhbGlkaXR5IG9mIHJlcXVlc3RlZCBmbGFncyBmb3IgZmllbWFwCisgKiBAZmllaW5mbzoJRmllbWFwIGNvbnRleHQgcGFzc2VkIGludG8gLT5maWVtYXAKKyAqIEBmc19mbGFnczoJU2V0IG9mIGZpZW1hcCBmbGFncyB0aGF0IHRoZSBmaWxlIHN5c3RlbSB1bmRlcnN0YW5kcworICoKKyAqIENhbGxlZCBmcm9tIGZpbGUgc3lzdGVtIC0+ZmllbWFwIGNhbGxiYWNrLiBUaGlzIHdpbGwgY29tcHV0ZSB0aGUKKyAqIGludGVyc2VjdGlvbiBvZiB2YWxpZCBmaWVtYXAgZmxhZ3MgYW5kIHRob3NlIHRoYXQgdGhlIGZzIHN1cHBvcnRzLiBUaGF0CisgKiB2YWx1ZSBpcyB0aGVuIGNvbXBhcmVkIGFnYWluc3QgdGhlIHVzZXIgc3VwcGxpZWQgZmxhZ3MuIEluIGNhc2Ugb2YgYmFkIHVzZXIKKyAqIGZsYWdzLCB0aGUgaW52YWxpZCB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIGZpZWluZm8gc3RydWN0dXJlLCBhbmQKKyAqIC1FQkFEUiBpcyByZXR1cm5lZCwgd2hpY2ggdGVsbHMgaW9jdGxfZmllbWFwKCkgdG8gcmV0dXJuIHRob3NlIHZhbHVlcyB0bworICogdXNlcnNwYWNlLiBGb3IgdGhpcyByZWFzb24sIGEgcmV0dXJuIGNvZGUgb2YgLUVCQURSIHNob3VsZCBiZSBwcmVzZXJ2ZWQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQkFEUiBvbiBiYWQgZmxhZ3MuCisgKi8KK2ludCBmaWVtYXBfY2hlY2tfZmxhZ3Moc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTMyIGZzX2ZsYWdzKQoreworCXUzMiBpbmNvbXBhdF9mbGFnczsKKworCWluY29tcGF0X2ZsYWdzID0gZmllaW5mby0+ZmlfZmxhZ3MgJiB+KEZJRU1BUF9GTEFHU19DT01QQVQgJiBmc19mbGFncyk7CisJaWYgKGluY29tcGF0X2ZsYWdzKSB7CisJCWZpZWluZm8tPmZpX2ZsYWdzID0gaW5jb21wYXRfZmxhZ3M7CisJCXJldHVybiAtRUJBRFI7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmaWVtYXBfY2hlY2tfZmxhZ3MpOworCitzdGF0aWMgaW50IGZpZW1hcF9jaGVja19yYW5nZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4sIHU2NCAqbmV3X2xlbikKK3sKKwkqbmV3X2xlbiA9IGxlbjsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RhcnQgPiBzYi0+c19tYXhieXRlcykKKwkJcmV0dXJuIC1FRkJJRzsKKworCS8qCisJICogU2hyaW5rIHJlcXVlc3Qgc2NvcGUgdG8gd2hhdCB0aGUgZnMgY2FuIGFjdHVhbGx5IGhhbmRsZS4KKwkgKi8KKwlpZiAoKGxlbiA+IHNiLT5zX21heGJ5dGVzKSB8fAorCSAgICAoc2ItPnNfbWF4Ynl0ZXMgLSBsZW4pIDwgc3RhcnQpCisJCSpuZXdfbGVuID0gc2ItPnNfbWF4Ynl0ZXMgLSBzdGFydDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvY3RsX2ZpZW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGZpZW1hcCBmaWVtYXA7CisJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyBmaWVpbmZvID0geyAwLCB9OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1NjQgbGVuOworCWludCBlcnJvcjsKKworCWlmICghaW5vZGUtPmlfb3AtPmZpZW1hcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZmaWVtYXAsIChzdHJ1Y3QgZmllbWFwIF9fdXNlciAqKWFyZywKKwkJCSAgIHNpemVvZihzdHJ1Y3QgZmllbWFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGZpZW1hcC5mbV9leHRlbnRfY291bnQgPiBGSUVNQVBfTUFYX0VYVEVOVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBmaWVtYXBfY2hlY2tfcmFuZ2VzKHNiLCBmaWVtYXAuZm1fc3RhcnQsIGZpZW1hcC5mbV9sZW5ndGgsCisJCQkJICAgICZsZW4pOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZmllaW5mby5maV9mbGFncyA9IGZpZW1hcC5mbV9mbGFnczsKKwlmaWVpbmZvLmZpX2V4dGVudHNfbWF4ID0gZmllbWFwLmZtX2V4dGVudF9jb3VudDsKKwlmaWVpbmZvLmZpX2V4dGVudHNfc3RhcnQgPSAoc3RydWN0IGZpZW1hcF9leHRlbnQgKikoYXJnICsgc2l6ZW9mKGZpZW1hcCkpOworCisJaWYgKGZpZW1hcC5mbV9leHRlbnRfY291bnQgIT0gMCAmJgorCSAgICAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgZmllaW5mby5maV9leHRlbnRzX3N0YXJ0LAorCQkgICAgICAgZmllaW5mby5maV9leHRlbnRzX21heCAqIHNpemVvZihzdHJ1Y3QgZmllbWFwX2V4dGVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChmaWVpbmZvLmZpX2ZsYWdzICYgRklFTUFQX0ZMQUdfU1lOQykKKwkJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKworCWVycm9yID0gaW5vZGUtPmlfb3AtPmZpZW1hcChpbm9kZSwgJmZpZWluZm8sIGZpZW1hcC5mbV9zdGFydCwgbGVuKTsKKwlmaWVtYXAuZm1fZmxhZ3MgPSBmaWVpbmZvLmZpX2ZsYWdzOworCWZpZW1hcC5mbV9tYXBwZWRfZXh0ZW50cyA9IGZpZWluZm8uZmlfZXh0ZW50c19tYXBwZWQ7CisJaWYgKGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgJmZpZW1hcCwgc2l6ZW9mKGZpZW1hcCkpKQorCQllcnJvciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxPQ0sKKworI2RlZmluZSBibGtfdG9fbG9naWNhbChpbm9kZSwgYmxrKSAoYmxrIDw8IChpbm9kZSktPmlfYmxrYml0cykKKyNkZWZpbmUgbG9naWNhbF90b19ibGsoaW5vZGUsIG9mZnNldCkgKG9mZnNldCA+PiAoaW5vZGUpLT5pX2Jsa2JpdHMpOworCisvKgorICogQGlub2RlIC0gdGhlIGlub2RlIHRvIG1hcAorICogQGFyZyAtIHRoZSBwb2ludGVyIHRvIHVzZXJzcGFjZSB3aGVyZSB3ZSBjb3B5IGV2ZXJ5dGhpbmcgdG8KKyAqIEBnZXRfYmxvY2sgLSB0aGUgZnMncyBnZXRfYmxvY2sgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGRvZXMgRklFTUFQIGZvciBibG9jayBiYXNlZCBpbm9kZXMuICBCYXNpY2FsbHkgaXQgd2lsbCBqdXN0IGxvb3AKKyAqIHRocm91Z2ggZ2V0X2Jsb2NrIHVudGlsIHdlIGhpdCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2Ugd2FudCB0byBtYXAsIG9yIHdlCisgKiBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGhpdCBhIGhvbGUuCisgKgorICogSWYgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBkYXRhIGJsb2NrcyBiZXlvbmQgYSBob2xlIHBhc3QgQGlub2RlLT5pX3NpemUsIHRoZW4KKyAqIHBsZWFzZSBkbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24sIGl0IHdpbGwgc3RvcCBhdCB0aGUgZmlyc3QgdW5tYXBwZWQgYmxvY2sKKyAqIGJleW9uZCBpX3NpemUKKyAqLworaW50IGdlbmVyaWNfYmxvY2tfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTY0IHN0YXJ0LAorCQkJIHU2NCBsZW4sIGdldF9ibG9ja190ICpnZXRfYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcDsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYmxrOworCWxvbmcgbG9uZyBsZW5ndGggPSAwLCBtYXBfbGVuID0gMDsKKwl1NjQgbG9naWNhbCA9IDAsIHBoeXMgPSAwLCBzaXplID0gMDsKKwl1MzIgZmxhZ3MgPSBGSUVNQVBfRVhURU5UX01FUkdFRDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgocmV0ID0gZmllbWFwX2NoZWNrX2ZsYWdzKGZpZWluZm8sIEZJRU1BUF9GTEFHX1NZTkMpKSkKKwkJcmV0dXJuIHJldDsKKworCXN0YXJ0X2JsayA9IGxvZ2ljYWxfdG9fYmxrKGlub2RlLCBzdGFydCk7CisKKwkvKiBndWFyZCBhZ2FpbnN0IGNoYW5nZSAqLworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCWxlbmd0aCA9IChsb25nIGxvbmcpbWluX3QodTY0LCBsZW4sIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisJbWFwX2xlbiA9IGxlbmd0aDsKKworCWRvIHsKKwkJLyoKKwkJICogd2Ugc2V0IGJfc2l6ZSB0byB0aGUgdG90YWwgc2l6ZSB3ZSB3YW50IHNvIGl0IHdpbGwgbWFwIGFzCisJCSAqIG1hbnkgY29udGlndW91cyBibG9ja3MgYXMgcG9zc2libGUgYXQgb25jZQorCQkgKi8KKwkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQpKTsKKwkJdG1wLmJfc2l6ZSA9IG1hcF9sZW47CisKKwkJcmV0ID0gZ2V0X2Jsb2NrKGlub2RlLCBzdGFydF9ibGssICZ0bXAsIDApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJLyogSE9MRSAqLworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJnRtcCkpIHsKKwkJCS8qCisJCQkgKiBmaXJzdCBob2xlIGFmdGVyIGdvaW5nIHBhc3QgdGhlIEVPRiwgdGhpcyBpcyBvdXIKKwkJCSAqIGxhc3QgZXh0ZW50CisJCQkgKi8KKwkJCWlmIChsZW5ndGggPD0gMCkgeworCQkJCWZsYWdzID0gRklFTUFQX0VYVEVOVF9NRVJHRUR8RklFTUFQX0VYVEVOVF9MQVNUOworCQkJCXJldCA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIGxvZ2ljYWwsCisJCQkJCQkJICAgICAgcGh5cywgc2l6ZSwKKwkJCQkJCQkgICAgICBmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxlbmd0aCAtPSBibGtfdG9fbG9naWNhbChpbm9kZSwgMSk7CisKKwkJCS8qIGlmIHdlIGhhdmUgaG9sZXMgdXAgdG8vcGFzdCBFT0YgdGhlbiB3ZSdyZSBkb25lICovCisJCQlpZiAobGVuZ3RoIDw9IDApCisJCQkJYnJlYWs7CisKKwkJCXN0YXJ0X2JsaysrOworCQl9IGVsc2UgeworCQkJaWYgKGxlbmd0aCA8PSAwICYmIHNpemUpIHsKKwkJCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaWVpbmZvLCBsb2dpY2FsLAorCQkJCQkJCSAgICAgIHBoeXMsIHNpemUsCisJCQkJCQkJICAgICAgZmxhZ3MpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlsb2dpY2FsID0gYmxrX3RvX2xvZ2ljYWwoaW5vZGUsIHN0YXJ0X2Jsayk7CisJCQlwaHlzID0gYmxrX3RvX2xvZ2ljYWwoaW5vZGUsIHRtcC5iX2Jsb2NrbnIpOworCQkJc2l6ZSA9IHRtcC5iX3NpemU7CisJCQlmbGFncyA9IEZJRU1BUF9FWFRFTlRfTUVSR0VEOworCisJCQlsZW5ndGggLT0gdG1wLmJfc2l6ZTsKKwkJCXN0YXJ0X2JsayArPSBsb2dpY2FsX3RvX2Jsayhpbm9kZSwgc2l6ZSk7CisKKwkJCS8qCisJCQkgKiBpZiB3ZSBhcmUgcGFzdCB0aGUgRU9GIHdlIG5lZWQgdG8gbG9vcCBhZ2FpbiB0byBzZWUKKwkJCSAqIGlmIHRoZXJlIGlzIGEgaG9sZSBzbyB3ZSBjYW4gbWFyayB0aGlzIGV4dGVudCBhcyB0aGUKKwkJCSAqIGxhc3Qgb25lLCBhbmQgaWYgbm90IGtlZXAgbWFwcGluZyB0aGluZ3MgdW50aWwgd2UKKwkJCSAqIGZpbmQgYSBob2xlLCBvciB3ZSBydW4gb3V0IG9mIHNsb3RzIGluIHRoZSBleHRlbnQKKwkJCSAqIGFycmF5CisJCQkgKi8KKwkJCWlmIChsZW5ndGggPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoZmllaW5mbywgbG9naWNhbCwgcGh5cywKKwkJCQkJCSAgICAgIHNpemUsIGZsYWdzKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAoMSk7CisKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworCS8qIGlmIHJldCBpcyAxIHRoZW4gd2UganVzdCBoaXQgdGhlIGVuZCBvZiB0aGUgZXh0ZW50IGFycmF5ICovCisJaWYgKHJldCA9PSAxKQorCQlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19ibG9ja19maWVtYXApOworCisjZW5kaWYgIC8qICBDT05GSUdfQkxPQ0sgICovCisKIHN0YXRpYyBpbnQgZmlsZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC04MCw2ICszNTUsOCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGSUJNQVA6CiAJCXJldHVybiBpb2N0bF9maWJtYXAoZmlscCwgcCk7CisJY2FzZSBGU19JT0NfRklFTUFQOgorCQlyZXR1cm4gaW9jdGxfZmllbWFwKGZpbHAsIGFyZyk7CiAJY2FzZSBGSUdFVEJTWjoKIAkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgcCk7CiAJY2FzZSBGSU9OUkVBRDoKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lub2RlLmMgYi9mcy9pc29mcy9pbm9kZS5jCmluZGV4IDI2OTQ4YTYuLjNmOGFmMGYgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lub2RlLmMKKysrIGIvZnMvaXNvZnMvaW5vZGUuYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJT3B0X25vY29tcHJlc3MsIE9wdF9oaWRlLCBPcHRfc2hvd2Fzc29jLCBPcHRfZG1vZGUsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9ub3JvY2ssICJub3JvY2sifSwKIAl7T3B0X25vam9saWV0LCAibm9qb2xpZXQifSwKIAl7T3B0X3VuaGlkZSwgInVuaGlkZSJ9LApkaWZmIC0tZ2l0IGEvZnMvamJkMi9jaGVja3BvaW50LmMgYi9mcy9qYmQyL2NoZWNrcG9pbnQuYwppbmRleCA5MTM4OWM4Li45MjAzYzMzIDEwMDY0NAotLS0gYS9mcy9qYmQyL2NoZWNrcG9pbnQuYworKysgYi9mcy9qYmQyL2NoZWNrcG9pbnQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtOTMsNyArOTQsOCBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CiAKLQlpZiAoamgtPmJfamxpc3QgPT0gQkpfTm9uZSAmJiAhYnVmZmVyX2xvY2tlZChiaCkgJiYgIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwlpZiAoamgtPmJfamxpc3QgPT0gQkpfTm9uZSAmJiAhYnVmZmVyX2xvY2tlZChiaCkgJiYKKwkgICAgIWJ1ZmZlcl9kaXJ0eShiaCkgJiYgIWJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgInJlbW92ZSBmcm9tIGNoZWNrcG9pbnQgbGlzdCIpOwogCQlyZXQgPSBfX2piZDJfam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCkgKyAxOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKQEAgLTEyNiwxNCArMTI4LDI5IEBACiAKIAkJLyoKIAkJICogVGVzdCBhZ2FpbiwgYW5vdGhlciBwcm9jZXNzIG1heSBoYXZlIGNoZWNrcG9pbnRlZCB3aGlsZSB3ZQotCQkgKiB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBjaGVja3BvaW50IGxvY2sKKwkJICogd2VyZSB3YWl0aW5nIGZvciB0aGUgY2hlY2twb2ludCBsb2NrLiBJZiB0aGVyZSBhcmUgbm8KKwkJICogb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2hlY2twb2ludCBhbmQKKwkJICogd2UgY2FuJ3QgbWFrZSBwcm9ncmVzcy4gQWJvcnQgdGhlIGpvdXJuYWwgaW4gdGhpcyBjYXNlLgogCQkgKi8KIAkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJbmJsb2NrcyA9IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbCk7CiAJCWlmIChfX2piZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBuYmxvY2tzKSB7CisJCQlpbnQgY2hrcHQgPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IE5VTEw7CisKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKLQkJCWpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCQlpZiAoY2hrcHQpIHsKKwkJCQlqYmQyX2xvZ19kb19jaGVja3BvaW50KGpvdXJuYWwpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyB0cmFuc2FjdGlvbnNcbiIsCisJCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQlqYmQyX2pvdXJuYWxfYWJvcnQoam91cm5hbCwgMCk7CisJCQl9CisKIAkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOwogCX0KQEAgLTE2MCwyMSArMTc3LDI1IEBACiAgKiBidWZmZXJzLiBOb3RlIHRoYXQgd2UgdGFrZSB0aGUgYnVmZmVycyBpbiB0aGUgb3Bwb3NpdGUgb3JkZXJpbmcKICAqIGZyb20gdGhlIG9uZSBpbiB3aGljaCB0aGV5IHdlcmUgc3VibWl0dGVkIGZvciBJTy4KICAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbmQgcmV0dXJuIDwwIGlmIHNvbWUgYnVmZmVycyBoYXZlIGZhaWxlZAorICogdG8gYmUgd3JpdHRlbiBvdXQuCisgKgogICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgX193YWl0X2NwX2lvKGpvdXJuYWxfdCAqam91cm5hbCwgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCitzdGF0aWMgaW50IF9fd2FpdF9jcF9pbyhqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQogewogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJdGlkX3QgdGhpc190aWQ7CiAJaW50IHJlbGVhc2VkID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCXRoaXNfdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOwogcmVzdGFydDoKIAkvKiBEaWQgc29tZWJvZHkgY2xlYW4gdXAgdGhlIHRyYW5zYWN0aW9uIGluIHRoZSBtZWFud2hpbGU/ICovCiAJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gdHJhbnNhY3Rpb24gfHwKIAkJCXRyYW5zYWN0aW9uLT50X3RpZCAhPSB0aGlzX3RpZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmV0OwogCXdoaWxlICghcmVsZWFzZWQgJiYgdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0KSB7CiAJCWpoID0gdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0OwogCQliaCA9IGpoMmJoKGpoKTsKQEAgLTE5NCw2ICsyMTUsOSBAQAogCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KKwkJaWYgKHVubGlrZWx5KGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpKQorCQkJcmV0ID0gLUVJTzsKKwogCQkvKgogCQkgKiBOb3cgaW4gd2hhdGV2ZXIgc3RhdGUgdGhlIGJ1ZmZlciBjdXJyZW50bHkgaXMsIHdlIGtub3cgdGhhdAogCQkgKiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCBhbmQgc28gd2UgY2FuIGRyb3AgaXQgZnJvbSB0aGUgbGlzdApAQCAtMjAzLDYgKzIyNyw4IEBACiAJCWpiZDJfam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKIAkJX19icmVsc2UoYmgpOwogCX0KKworCXJldHVybiByZXQ7CiB9CiAKICNkZWZpbmUgTlJfQkFUQ0gJNjQKQEAgLTIyNiw3ICsyNTIsOCBAQAogICogVHJ5IHRvIGZsdXNoIG9uZSBidWZmZXIgZnJvbSB0aGUgY2hlY2twb2ludCBsaXN0IHRvIGRpc2suCiAgKgogICogUmV0dXJuIDEgaWYgc29tZXRoaW5nIGhhcHBlbmVkIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGFib3J0IHRoZSBjdXJyZW50Ci0gKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuCisgKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuICBSZXR1cm4gPDAgaWYgdGhlIGJ1ZmZlciBoYXMgZmFpbGVkIHRvCisgKiBiZSB3cml0dGVuIG91dC4KICAqCiAgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkIGFuZCBkcm9wcyBpdCBpZiAxIGlzIHJldHVybmVkCiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CkBAIC0yNTgsNiArMjg1LDkgQEAKIAkJamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKIAkJcmV0ID0gMTsKIAl9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCXJldCA9IDE7CisJCWlmICh1bmxpa2VseShidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSkKKwkJCXJldCA9IC1FSU87CiAJCUpfQVNTRVJUX0pIKGpoLCAhYnVmZmVyX2piZGRpcnR5KGJoKSk7CiAJCUJVRkZFUl9UUkFDRShiaCwgInJlbW92ZSBmcm9tIGNoZWNrcG9pbnQiKTsKIAkJX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOwpAQCAtMjY1LDcgKzI5NSw2IEBACiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQlqYmQyX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CiAJCV9fYnJlbHNlKGJoKTsKLQkJcmV0ID0gMTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJbXBvcnRhbnQ6IHdlIGFyZSBhYm91dCB0byB3cml0ZSB0aGUgYnVmZmVyLCBhbmQKQEAgLTI5OCw2ICszMjcsNyBAQAogICogdG8gZGlzay4gV2Ugc3VibWl0IGxhcmdlciBjaHVua3Mgb2YgZGF0YSBhdCBvbmNlLgogICoKICAqIFRoZSBqb3VybmFsIHNob3VsZCBiZSBsb2NrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIENhbGxlZCB3aXRoIGpfY2hlY2twb2ludF9tdXRleCBoZWxkLgogICovCiBpbnQgamJkMl9sb2dfZG9fY2hlY2twb2ludChqb3VybmFsX3QgKmpvdXJuYWwpCiB7CkBAIC0zMTMsNiArMzQzLDggQEAKIAkgKiBqb3VybmFsIHN0cmFpZ2h0IGF3YXkuCiAJICovCiAJcmVzdWx0ID0gamJkMl9jbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKKwl0cmFjZV9tYXJrKGpiZDJfY2hlY2twb2ludCwgImRldiAlcyBuZWVkX2NoZWNrcG9pbnQgJWQiLAorCQkgICBqb3VybmFsLT5qX2Rldm5hbWUsIHJlc3VsdCk7CiAJamJkX2RlYnVnKDEsICJjbGVhbnVwX2pvdXJuYWxfdGFpbCByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKIAlpZiAocmVzdWx0IDw9IDApCiAJCXJldHVybiByZXN1bHQ7CkBAIC0zMjEsNiArMzUzLDcgQEAKIAkgKiBPSywgd2UgbmVlZCB0byBzdGFydCB3cml0aW5nIGRpc2sgYmxvY2tzLiAgVGFrZSBvbmUgdHJhbnNhY3Rpb24KIAkgKiBhbmQgd3JpdGUgaXQuCiAJICovCisJcmVzdWx0ID0gMDsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAlpZiAoIWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMpCiAJCWdvdG8gb3V0OwpAQCAtMzM5LDcgKzM3Miw3IEBACiAJCWludCBiYXRjaF9jb3VudCA9IDA7CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW05SX0JBVENIXTsKIAkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7Ci0JCWludCByZXRyeSA9IDA7CisJCWludCByZXRyeSA9IDAsIGVycjsKIAogCQl3aGlsZSAoIXJldHJ5ICYmIHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgewogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKQEAgLTM1Myw2ICszODYsOCBAQAogCQkJfQogCQkJcmV0cnkgPSBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWwsIGpoLCBiaHMsICZiYXRjaF9jb3VudCwKIAkJCQkJCSB0cmFuc2FjdGlvbik7CisJCQlpZiAocmV0cnkgPCAwICYmICFyZXN1bHQpCisJCQkJcmVzdWx0ID0gcmV0cnk7CiAJCQlpZiAoIXJldHJ5ICYmIChuZWVkX3Jlc2NoZWQoKSB8fAogCQkJCXNwaW5fbmVlZGJyZWFrKCZqb3VybmFsLT5qX2xpc3RfbG9jaykpKSB7CiAJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKQEAgLTM3NywxNCArNDEyLDE4IEBACiAJCSAqIE5vdyB3ZSBoYXZlIGNsZWFuZWQgdXAgdGhlIGZpcnN0IHRyYW5zYWN0aW9uJ3MgY2hlY2twb2ludAogCQkgKiBsaXN0LiBMZXQncyBjbGVhbiB1cCB0aGUgc2Vjb25kIG9uZQogCQkgKi8KLQkJX193YWl0X2NwX2lvKGpvdXJuYWwsIHRyYW5zYWN0aW9uKTsKKwkJZXJyID0gX193YWl0X2NwX2lvKGpvdXJuYWwsIHRyYW5zYWN0aW9uKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXN1bHQgPSBlcnI7CiAJfQogb3V0OgogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7Ci0JcmVzdWx0ID0gamJkMl9jbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKIAlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXR1cm4gMDsKKwkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIHJlc3VsdCk7CisJZWxzZQorCQlyZXN1bHQgPSBqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWwpOworCisJcmV0dXJuIChyZXN1bHQgPCAwKSA/IHJlc3VsdCA6IDA7CiB9CiAKIC8qCkBAIC00MDAsOCArNDM5LDkgQEAKICAqIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgam91cm5hbGluZyBjb2RlIHdoaWNoIHJlYWxseSBuZWVkcyB0byBiZQogICogYXdhcmUgb2YgdHJhbnNhY3Rpb24gYWJvcnRzLiAgQ2hlY2twb2ludGluZyBpbnZvbHZlcyB3cml0aW5nIHRvIHRoZQogICogbWFpbiBmaWxlc3lzdGVtIGFyZWEgcmF0aGVyIHRoYW4gdG8gdGhlIGpvdXJuYWwsIHNvIGl0IGNhbiBwcm9jZWVkCi0gKiBldmVuIGluIGFib3J0IHN0YXRlLCBidXQgd2UgbXVzdCBub3QgdXBkYXRlIHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgaWYKLSAqIHdlIGhhdmUgYW4gYWJvcnQgZXJyb3Igb3V0c3RhbmRpbmcuCisgKiBldmVuIGluIGFib3J0IHN0YXRlLCBidXQgd2UgbXVzdCBub3QgdXBkYXRlIHRoZSBzdXBlciBibG9jayBpZgorICogY2hlY2twb2ludGluZyBtYXkgaGF2ZSBmYWlsZWQuICBPdGhlcndpc2UsIHdlIHdvdWxkIGxvc2Ugc29tZSBtZXRhZGF0YQorICogYnVmZmVycyB3aGljaCBzaG91bGQgYmUgd3JpdHRlbi1iYWNrIHRvIHRoZSBmaWxlc3lzdGVtLgogICovCiAKIGludCBqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqam91cm5hbCkKQEAgLTQxMCw2ICs0NTAsOSBAQAogCXRpZF90CQlmaXJzdF90aWQ7CiAJdW5zaWduZWQgbG9uZwlibG9ja25yLCBmcmVlZDsKIAorCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCisJCXJldHVybiAxOworCiAJLyogT0ssIHdvcmsgb3V0IHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gcmVtYWluaW5nIGluIHRoZSBsb2csIGFuZAogCSAqIHRoZSBsb2cgYmxvY2sgaXQgc3RhcnRzIGF0LgogCSAqCmRpZmYgLS1naXQgYS9mcy9qYmQyL2NvbW1pdC5jIGIvZnMvamJkMi9jb21taXQuYwppbmRleCBmMmFkMDYxLi4wYWJlMDJjIDEwMDY0NAotLS0gYS9mcy9qYmQyL2NvbW1pdC5jCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CisjaW5jbHVkZSA8bGludXgvbWFya2VyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTEyNiw4ICsxMjcsNyBAQAogCiAJSkJVRkZFUl9UUkFDRShkZXNjcmlwdG9yLCAic3VibWl0IGNvbW1pdCBibG9jayIpOwogCWxvY2tfYnVmZmVyKGJoKTsKLQlnZXRfYmgoYmgpOwotCXNldF9idWZmZXJfZGlydHkoYmgpOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJYmgtPmJfZW5kX2lvID0gam91cm5hbF9lbmRfYnVmZmVyX2lvX3N5bmM7CiAKQEAgLTE0NywxMiArMTQ3LDkgQEAKIAkgKiB0byByZW1lbWJlciBpZiB3ZSBzZW50IGEgYmFycmllciByZXF1ZXN0CiAJICovCiAJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCAmJiBiYXJyaWVyX2RvbmUpIHsKLQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwotCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJKQkQ6IGJhcnJpZXItYmFzZWQgc3luYyBmYWlsZWQgb24gJXMgLSAiCi0JCQkiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLAotCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJICAgICAgICJKQkQ6IGJhcnJpZXItYmFzZWQgc3luYyBmYWlsZWQgb24gJXMgLSAiCisJCSAgICAgICAiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLCBqb3VybmFsLT5qX2Rldm5hbWUpOwogCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpCRDJfQkFSUklFUjsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CkBAIC0xNjAsNyArMTU3LDcgQEAKIAkJLyogQW5kIHRyeSBhZ2Fpbiwgd2l0aG91dCB0aGUgYmFycmllciAqLwogCQlsb2NrX2J1ZmZlcihiaCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKIAkJcmV0ID0gc3VibWl0X2JoKFdSSVRFLCBiaCk7CiAJfQogCSpjYmggPSBiaDsKQEAgLTM3MSw2ICszNjgsOCBAQAogCWNvbW1pdF90cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKIAlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKIAorCXRyYWNlX21hcmsoamJkMl9zdGFydF9jb21taXQsICJkZXYgJXMgdHJhbnNhY3Rpb24gJWQiLAorCQkgICBqb3VybmFsLT5qX2Rldm5hbWUsIGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQpOwogCWpiZF9kZWJ1ZygxLCAiSkJEOiBzdGFydGluZyBjb21taXQgb2YgdHJhbnNhY3Rpb24gJWRcbiIsCiAJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKIApAQCAtNTA1LDkgKzUwNCwxMCBAQAogCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzOwogCiAJCS8qIElmIHdlJ3JlIGluIGFib3J0IG1vZGUsIHdlIGp1c3QgdW4tam91cm5hbCB0aGUgYnVmZmVyIGFuZAotCQkgICByZWxlYXNlIGl0IGZvciBiYWNrZ3JvdW5kIHdyaXRpbmcuICovCisJCSAgIHJlbGVhc2UgaXQuICovCiAKIAkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgeworCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGpoMmJoKGpoKSk7CiAJCQlKQlVGRkVSX1RSQUNFKGpoLCAiam91cm5hbCBpcyBhYm9ydGluZzogcmVmaWxlIik7CiAJCQlqYmQyX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CiAJCQkvKiBJZiB0aGF0IHdhcyB0aGUgbGFzdCBvbmUsIHdlIG5lZWQgdG8gY2xlYW4gdXAKQEAgLTY4MSwxMSArNjgxLDExIEBACiAJICovCiAJZXJyID0gam91cm5hbF9maW5pc2hfaW5vZGVfZGF0YV9idWZmZXJzKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CiAJaWYgKGVycikgewotCQljaGFyIGJbQkRFVk5BTUVfU0laRV07Ci0KIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJIkpCRDI6IERldGVjdGVkIElPIGVycm9ycyB3aGlsZSBmbHVzaGluZyBmaWxlIGRhdGEgIgotCQkJIm9uICVzXG4iLCBiZGV2bmFtZShqb3VybmFsLT5qX2ZzX2RldiwgYikpOworCQkgICAgICAgIm9uICVzXG4iLCBqb3VybmFsLT5qX2Rldm5hbWUpOworCQlpZiAoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQUJPUlRfT05fU1lOQ0RBVEFfRVJSKQorCQkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIGVycik7CiAJCWVyciA9IDA7CiAJfQogCkBAIC03ODYsNiArNzg2LDkgQEAKIAkJLyogQUtQTTogYmZvcmdldCBoZXJlICovCiAJfQogCisJaWYgKGVycikKKwkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIGVycik7CisKIAlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDVcbiIpOwogCiAJaWYgKCFKQkQyX0hBU19JTkNPTVBBVF9GRUFUVVJFKGpvdXJuYWwsCkBAIC04ODQsNiArODg3LDggQEAKIAkJaWYgKGJ1ZmZlcl9qYmRkaXJ0eShiaCkpIHsKIAkJCUpCVUZGRVJfVFJBQ0UoamgsICJhZGQgdG8gbmV3IGNoZWNrcG9pbnRpbmcgdHJhbnMiKTsKIAkJCV9famJkMl9qb3VybmFsX2luc2VydF9jaGVja3BvaW50KGpoLCBjb21taXRfdHJhbnNhY3Rpb24pOworCQkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOwogCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlZmlsZSBmb3IgY2hlY2twb2ludCB3cml0ZWJhY2siKTsKIAkJCV9famJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOwogCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CkBAIC05OTAsNiArOTk1LDkgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAorCXRyYWNlX21hcmsoamJkMl9lbmRfY29tbWl0LCAiZGV2ICVzIHRyYW5zYWN0aW9uICVkIGhlYWQgJWQiLAorCQkgICBqb3VybmFsLT5qX2Rldm5hbWUsIGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQsCisJCSAgIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSk7CiAJamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKIAkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKIApkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCA4MjA3YTAxLi43ODNkZTExIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtNTk3LDEzICs1OTcsOSBAQAogCQlpZiAocmV0KQogCQkJKnJldHAgPSByZXQ7CiAJCWVsc2UgewotCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwotCiAJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGpvdXJuYWwgYmxvY2sgbm90IGZvdW5kICIKIAkJCQkJImF0IG9mZnNldCAlbHUgb24gJXNcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJYmxvY2tuciwKLQkJCQliZGV2bmFtZShqb3VybmFsLT5qX2RldiwgYikpOworCQkJICAgICAgIF9fZnVuY19fLCBibG9ja25yLCBqb3VybmFsLT5qX2Rldm5hbWUpOwogCQkJZXJyID0gLUVJTzsKIAkJCV9fam91cm5hbF9hYm9ydF9zb2Z0KGpvdXJuYWwsIGVycik7CiAJCX0KQEAgLTkwMSwxMCArODk3LDcgQEAKIAogc3RhdGljIHZvaWQgamJkMl9zdGF0c19wcm9jX2luaXQoam91cm5hbF90ICpqb3VybmFsKQogewotCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsKLQotCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2LCBuYW1lKTsKLQlqb3VybmFsLT5qX3Byb2NfZW50cnkgPSBwcm9jX21rZGlyKG5hbWUsIHByb2NfamJkMl9zdGF0cyk7CisJam91cm5hbC0+al9wcm9jX2VudHJ5ID0gcHJvY19ta2Rpcihqb3VybmFsLT5qX2Rldm5hbWUsIHByb2NfamJkMl9zdGF0cyk7CiAJaWYgKGpvdXJuYWwtPmpfcHJvY19lbnRyeSkgewogCQlwcm9jX2NyZWF0ZV9kYXRhKCJoaXN0b3J5IiwgU19JUlVHTywgam91cm5hbC0+al9wcm9jX2VudHJ5LAogCQkJCSAmamJkMl9zZXFfaGlzdG9yeV9mb3BzLCBqb3VybmFsKTsKQEAgLTkxNSwxMiArOTA4LDkgQEAKIAogc3RhdGljIHZvaWQgamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbF90ICpqb3VybmFsKQogewotCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsKLQotCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2LCBuYW1lKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgiaW5mbyIsIGpvdXJuYWwtPmpfcHJvY19lbnRyeSk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImhpc3RvcnkiLCBqb3VybmFsLT5qX3Byb2NfZW50cnkpOwotCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIHByb2NfamJkMl9zdGF0cyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoam91cm5hbC0+al9kZXZuYW1lLCBwcm9jX2piZDJfc3RhdHMpOwogfQogCiBzdGF0aWMgdm9pZCBqb3VybmFsX2luaXRfc3RhdHMoam91cm5hbF90ICpqb3VybmFsKQpAQCAtMTAxOCw2ICsxMDA4LDcgQEAKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSBqb3VybmFsX2luaXRfY29tbW9uKCk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwljaGFyICpwOwogCWludCBuOwogCiAJaWYgKCFqb3VybmFsKQpAQCAtMTAzOSw2ICsxMDMwLDEwIEBACiAJam91cm5hbC0+al9mc19kZXYgPSBmc19kZXY7CiAJam91cm5hbC0+al9ibGtfb2Zmc2V0ID0gc3RhcnQ7CiAJam91cm5hbC0+al9tYXhsZW4gPSBsZW47CisJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGpvdXJuYWwtPmpfZGV2bmFtZSk7CisJcCA9IGpvdXJuYWwtPmpfZGV2bmFtZTsKKwl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJy8nKSkpCisJCSpwID0gJyEnOwogCWpiZDJfc3RhdHNfcHJvY19pbml0KGpvdXJuYWwpOwogCiAJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2Rldiwgc3RhcnQsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKQEAgLTEwNjEsNiArMTA1Niw3IEBACiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSBqb3VybmFsX2luaXRfY29tbW9uKCk7CisJY2hhciAqcDsKIAlpbnQgZXJyOwogCWludCBuOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOwpAQCAtMTA3MCw2ICsxMDY2LDEyIEBACiAKIAlqb3VybmFsLT5qX2RldiA9IGpvdXJuYWwtPmpfZnNfZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKIAlqb3VybmFsLT5qX2lub2RlID0gaW5vZGU7CisJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGpvdXJuYWwtPmpfZGV2bmFtZSk7CisJcCA9IGpvdXJuYWwtPmpfZGV2bmFtZTsKKwl3aGlsZSAoKHAgPSBzdHJjaHIocCwgJy8nKSkpCisJCSpwID0gJyEnOworCXAgPSBqb3VybmFsLT5qX2Rldm5hbWUgKyBzdHJsZW4oam91cm5hbC0+al9kZXZuYW1lKTsKKwlzcHJpbnRmKHAsICI6JWx1Iiwgam91cm5hbC0+al9pbm9kZS0+aV9pbm8pOwogCWpiZF9kZWJ1ZygxLAogCQkgICJqb3VybmFsICVwOiBpbm9kZSAlcy8lbGQsIHNpemUgJUxkLCBiaXRzICVkLCBibGtzaXplICVsZFxuIiwKIAkJICBqb3VybmFsLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLApAQCAtMTI1Myw2ICsxMjU1LDIyIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSB7CisJCS8qCisJCSAqIE9oLCBkZWFyLiAgQSBwcmV2aW91cyBhdHRlbXB0IHRvIHdyaXRlIHRoZSBqb3VybmFsCisJCSAqIHN1cGVyYmxvY2sgZmFpbGVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gYmVjYXVzZSB0aGUKKwkJICogVVNCIGRldmljZSB3YXMgeWFua2VkIG91dC4gIE9yIGl0IGNvdWxkIGhhcHBlbiB0bworCQkgKiBiZSBhIHRyYW5zaWVudCB3cml0ZSBlcnJvciBhbmQgbWF5YmUgdGhlIGJsb2NrIHdpbGwKKwkJICogYmUgcmVtYXBwZWQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgdG8gcmV0cnkgdGhlCisJCSAqIHdyaXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogcHJldmlvdXMgSS9PIGVycm9yIGRldGVjdGVkICIKKwkJICAgICAgICJmb3Igam91cm5hbCBzdXBlcmJsb2NrIHVwZGF0ZSBmb3IgJXMuXG4iLAorCQkgICAgICAgam91cm5hbC0+al9kZXZuYW1lKTsKKwkJY2xlYXJfYnVmZmVyX3dyaXRlX2lvX2Vycm9yKGJoKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfQorCiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCWpiZF9kZWJ1ZygxLCJKQkQ6IHVwZGF0aW5nIHN1cGVyYmxvY2sgKHN0YXJ0ICVsZCwgc2VxICVkLCBlcnJubyAlZClcbiIsCiAJCSAgam91cm5hbC0+al90YWlsLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UsIGpvdXJuYWwtPmpfZXJybm8pOwpAQCAtMTI2NCw5ICsxMjgyLDE2IEBACiAKIAlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIGRpcnR5Iik7CiAJbWFya19idWZmZXJfZGlydHkoYmgpOwotCWlmICh3YWl0KQorCWlmICh3YWl0KSB7CiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKLQllbHNlCisJCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IEkvTyBlcnJvciBkZXRlY3RlZCAiCisJCQkgICAgICAgIndoZW4gdXBkYXRpbmcgam91cm5hbCBzdXBlcmJsb2NrIGZvciAlcy5cbiIsCisJCQkgICAgICAgam91cm5hbC0+al9kZXZuYW1lKTsKKwkJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihiaCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJfQorCX0gZWxzZQogCQlsbF9yd19ibG9jayhTV1JJVEUsIDEsICZiaCk7CiAKIG91dDoKQEAgLTE0MjYsOSArMTQ1MSwxMiBAQAogICoKICAqIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUKICAqIGpvdXJuYWxlZCBvYmplY3QuCisgKiBSZXR1cm4gPDAgaWYgd2UgY291bGRuJ3QgY2xlYW4gdXAgdGhlIGpvdXJuYWwuCiAgKi8KLXZvaWQgamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbF90ICpqb3VybmFsKQoraW50IGpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWxfdCAqam91cm5hbCkKIHsKKwlpbnQgZXJyID0gMDsKKwogCS8qIFdhaXQgZm9yIHRoZSBjb21taXQgdGhyZWFkIHRvIHdha2UgdXAgYW5kIGRpZS4gKi8KIAlqb3VybmFsX2tpbGxfdGhyZWFkKGpvdXJuYWwpOwogCkBAIC0xNDUxLDExICsxNDc5LDE2IEBACiAJSl9BU1NFUlQoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCi0JLyogV2UgY2FuIG5vdyBtYXJrIHRoZSBqb3VybmFsIGFzIGVtcHR5LiAqLwotCWpvdXJuYWwtPmpfdGFpbCA9IDA7Ci0Jam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gKytqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOwogCWlmIChqb3VybmFsLT5qX3NiX2J1ZmZlcikgewotCQlqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJCWlmICghaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCQkvKiBXZSBjYW4gbm93IG1hcmsgdGhlIGpvdXJuYWwgYXMgZW1wdHkuICovCisJCQlqb3VybmFsLT5qX3RhaWwgPSAwOworCQkJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0KKwkJCQkrK2pvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2U7CisJCQlqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUlPOworCQl9CiAJCWJyZWxzZShqb3VybmFsLT5qX3NiX2J1ZmZlcik7CiAJfQogCkBAIC0xNDY3LDYgKzE1MDAsOCBAQAogCQlqYmQyX2pvdXJuYWxfZGVzdHJveV9yZXZva2Uoam91cm5hbCk7CiAJa2ZyZWUoam91cm5hbC0+al93YnVmKTsKIAlrZnJlZShqb3VybmFsKTsKKworCXJldHVybiBlcnI7CiB9CiAKIApAQCAtMTY5MiwxMCArMTcyNywxNiBAQAogCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCXdoaWxlICghZXJyICYmIGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gTlVMTCkgewogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQltdXRleF9sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOwogCQllcnIgPSBqYmQyX2xvZ19kb19jaGVja3BvaW50KGpvdXJuYWwpOworCQltdXRleF91bmxvY2soJmpvdXJuYWwtPmpfY2hlY2twb2ludF9tdXRleCk7CiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJcmV0dXJuIC1FSU87CisKIAlqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWwpOwogCiAJLyogRmluYWxseSwgbWFyayB0aGUgam91cm5hbCBhcyByZWFsbHkgbmVlZGluZyBubyByZWNvdmVyeS4KQEAgLTE3MTcsNyArMTc1OCw3IEBACiAJSl9BU1NFUlQoam91cm5hbC0+al9oZWFkID09IGpvdXJuYWwtPmpfdGFpbCk7CiAJSl9BU1NFUlQoam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTc2MSwyMyArMTgwMiw2IEBACiB9CiAKIC8qCi0gKiBqb3VybmFsX2Rldl9uYW1lOiBmb3JtYXQgYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGRlc2NyaWJlIG9uIHdoYXQKLSAqIGRldmljZSB0aGlzIGpvdXJuYWwgaXMgcHJlc2VudC4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqam91cm5hbF9kZXZfbmFtZShqb3VybmFsX3QgKmpvdXJuYWwsIGNoYXIgKmJ1ZmZlcikKLXsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwotCi0JaWYgKGpvdXJuYWwtPmpfaW5vZGUpCi0JCWJkZXYgPSBqb3VybmFsLT5qX2lub2RlLT5pX3NiLT5zX2JkZXY7Ci0JZWxzZQotCQliZGV2ID0gam91cm5hbC0+al9kZXY7Ci0KLQlyZXR1cm4gYmRldm5hbWUoYmRldiwgYnVmZmVyKTsKLX0KLQotLyoKICAqIEpvdXJuYWwgYWJvcnQgaGFzIHZlcnkgc3BlY2lmaWMgc2VtYW50aWNzLCB3aGljaCB3ZSBkZXNjcmliZQogICogZm9yIGpvdXJuYWwgYWJvcnQuCiAgKgpAQCAtMTc5MywxMyArMTgxNywxMiBAQAogdm9pZCBfX2piZDJfam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWxfdCAqam91cm5hbCkKIHsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKLQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKIAlpZiAoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQUJPUlQpCiAJCXJldHVybjsKIAogCXByaW50ayhLRVJOX0VSUiAiQWJvcnRpbmcgam91cm5hbCBvbiBkZXZpY2UgJXMuXG4iLAotCQlqb3VybmFsX2Rldl9uYW1lKGpvdXJuYWwsIGIpKTsKKwkgICAgICAgam91cm5hbC0+al9kZXZuYW1lKTsKIAogCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAlqb3VybmFsLT5qX2ZsYWdzIHw9IEpCRDJfQUJPUlQ7CmRpZmYgLS1naXQgYS9mcy9qYmQyL3JlY292ZXJ5LmMgYi9mcy9qYmQyL3JlY292ZXJ5LmMKaW5kZXggMDU4ZjUwZi4uNzMwNjMyOCAxMDA2NDQKLS0tIGEvZnMvamJkMi9yZWNvdmVyeS5jCisrKyBiL2ZzL2piZDIvcmVjb3ZlcnkuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAgKi8KIGludCBqYmQyX2pvdXJuYWxfcmVjb3Zlcihqb3VybmFsX3QgKmpvdXJuYWwpCiB7Ci0JaW50CQkJZXJyOworCWludAkJCWVyciwgZXJyMjsKIAlqb3VybmFsX3N1cGVyYmxvY2tfdCAqCXNiOwogCiAJc3RydWN0IHJlY292ZXJ5X2luZm8JaW5mbzsKQEAgLTI2Myw3ICsyNjMsMTAgQEAKIAlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlID0gKytpbmZvLmVuZF90cmFuc2FjdGlvbjsKIAogCWpiZDJfam91cm5hbF9jbGVhcl9yZXZva2Uoam91cm5hbCk7Ci0Jc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2ZzX2Rldik7CisJZXJyMiA9IHN5bmNfYmxvY2tkZXYoam91cm5hbC0+al9mc19kZXYpOworCWlmICghZXJyKQorCQllcnIgPSBlcnIyOworCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvamZzL3N1cGVyLmMgYi9mcy9qZnMvc3VwZXIuYwppbmRleCAzNjMwNzE4Li4wZGFlMzQ1IDEwMDY0NAotLS0gYS9mcy9qZnMvc3VwZXIuYworKysgYi9mcy9qZnMvc3VwZXIuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJT3B0X3VzcnF1b3RhLCBPcHRfZ3JwcXVvdGEsIE9wdF91aWQsIE9wdF9naWQsIE9wdF91bWFzawogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfaW50ZWdyaXR5LCAiaW50ZWdyaXR5In0sCiAJe09wdF9ub2ludGVncml0eSwgIm5vaW50ZWdyaXR5In0sCiAJe09wdF9pb2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL01ha2VmaWxlIGIvZnMvbG9ja2QvTWFrZWZpbGUKaW5kZXggNzcyNWEwYS4uOTdmNjA3MyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvTWFrZWZpbGUKKysrIGIvZnMvbG9ja2QvTWFrZWZpbGUKQEAgLTUsNiArNSw2IEBACiBvYmotJChDT05GSUdfTE9DS0QpICs9IGxvY2tkLm8KIAogbG9ja2Qtb2Jqcy15IDo9IGNsbnRsb2NrLm8gY2xudHByb2MubyBob3N0Lm8gc3ZjLm8gc3ZjbG9jay5vIHN2Y3NoYXJlLm8gXAotCSAgICAgICAgc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubworCSAgICAgICAgc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubyBncmFjZS5vCiBsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSB4ZHI0Lm8gc3ZjNHByb2MubwogbG9ja2Qtb2JqcwkJICAgICAgOj0gJChsb2NrZC1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50bG9jay5jIGIvZnMvbG9ja2QvY2xudGxvY2suYwppbmRleCAwYjQ1ZmQzLi44MzA3ZGQ2IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9jbG50bG9jay5jCisrKyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKQEAgLTU0LDE0ICs1NCwxMyBAQAogCXUzMiBubG1fdmVyc2lvbiA9IChubG1faW5pdC0+bmZzX3ZlcnNpb24gPT0gMikgPyAxIDogNDsKIAlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gbG9ja2RfdXAobmxtX2luaXQtPnByb3RvY29sKTsKKwlzdGF0dXMgPSBsb2NrZF91cCgpOwogCWlmIChzdGF0dXMgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOwogCi0JaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW5sbV9pbml0LT5hZGRyZXNzLAorCWhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KG5sbV9pbml0LT5hZGRyZXNzLCBubG1faW5pdC0+YWRkcmxlbiwKIAkJCQkgICBubG1faW5pdC0+cHJvdG9jb2wsIG5sbV92ZXJzaW9uLAotCQkJCSAgIG5sbV9pbml0LT5ob3N0bmFtZSwKLQkJCQkgICBzdHJsZW4obmxtX2luaXQtPmhvc3RuYW1lKSk7CisJCQkJICAgbmxtX2luaXQtPmhvc3RuYW1lKTsKIAlpZiAoaG9zdCA9PSBOVUxMKSB7CiAJCWxvY2tkX2Rvd24oKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0xDSyk7CkBAIC0xNDIsNyArMTQxLDcgQEAKIC8qCiAgKiBUaGUgc2VydmVyIGxvY2tkIGhhcyBjYWxsZWQgdXMgYmFjayB0byB0ZWxsIHVzIHRoZSBsb2NrIHdhcyBncmFudGVkCiAgKi8KLV9fYmUzMiBubG1jbG50X2dyYW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciwgY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrKQorX19iZTMyIG5sbWNsbnRfZ3JhbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJY29uc3Qgc3RydWN0IGZpbGVfbG9jayAqZmwgPSAmbG9jay0+Zmw7CiAJY29uc3Qgc3RydWN0IG5mc19maCAqZmggPSAmbG9jay0+Zmg7CkBAIC0xNjYsNyArMTY1LDcgQEAKIAkJICovCiAJCWlmIChmbF9ibG9ja2VkLT5mbF91Lm5mc19mbC5vd25lci0+cGlkICE9IGxvY2stPnN2aWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCFubG1fY21wX2FkZHIoJmJsb2NrLT5iX2hvc3QtPmhfYWRkciwgYWRkcikpCisJCWlmICghbmxtX2NtcF9hZGRyKG5sbV9hZGRyKGJsb2NrLT5iX2hvc3QpLCBhZGRyKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAobmZzX2NvbXBhcmVfZmgoTkZTX0ZIKGZsX2Jsb2NrZWQtPmZsX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICxmaCkgIT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMjE2LDcgKzIxNSw3IEBACiAJLyogVGhpcyBvbmUgZW5zdXJlcyB0aGF0IG91ciBwYXJlbnQgZG9lc24ndCB0ZXJtaW5hdGUgd2hpbGUgdGhlCiAJICogcmVjbGFpbSBpcyBpbiBwcm9ncmVzcyAqLwogCWxvY2tfa2VybmVsKCk7Ci0JbG9ja2RfdXAoMCk7IC8qIG5vdGU6IHRoaXMgY2Fubm90IGZhaWwgYXMgbG9ja2QgaXMgYWxyZWFkeSBydW5uaW5nICovCisJbG9ja2RfdXAoKTsJLyogbm90ZTogdGhpcyBjYW5ub3QgZmFpbCBhcyBsb2NrZCBpcyBhbHJlYWR5IHJ1bm5pbmcgKi8KIAogCWRwcmludGsoImxvY2tkOiByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOwogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ncmFjZS5jIGIvZnMvbG9ja2QvZ3JhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNjYzFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2QvZ3JhY2UuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29tbW9uIGNvZGUgZm9yIGNvbnRyb2wgb2YgbG9ja2QgYW5kIG5mc3Y0IGdyYWNlIHBlcmlvZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKworc3RhdGljIExJU1RfSEVBRChncmFjZV9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3JhY2VfbG9jayk7CisKKy8qKgorICogbG9ja3Nfc3RhcnRfZ3JhY2UKKyAqIEBsbTogd2hvIHRoaXMgZ3JhY2UgcGVyaW9kIGlzIGZvcgorICoKKyAqIEEgZ3JhY2UgcGVyaW9kIGlzIGEgcGVyaW9kIGR1cmluZyB3aGljaCBsb2NrcyBzaG91bGQgbm90IGJlIGdpdmVuCisgKiBvdXQuICBDdXJyZW50bHkgZ3JhY2UgcGVyaW9kcyBhcmUgb25seSBlbmZvcmNlZCBieSB0aGUgdHdvIGxvY2sKKyAqIG1hbmFnZXJzIChsb2NrZCBhbmQgbmZzZCksIHVzaW5nIHRoZSBsb2Nrc19pbl9ncmFjZSgpIGZ1bmN0aW9uIHRvCisgKiBjaGVjayB3aGVuIHRoZXkgYXJlIGluIGEgZ3JhY2UgcGVyaW9kLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IGEgZ3JhY2UgcGVyaW9kLgorICovCit2b2lkIGxvY2tzX3N0YXJ0X2dyYWNlKHN0cnVjdCBsb2NrX21hbmFnZXIgKmxtKQoreworCXNwaW5fbG9jaygmZ3JhY2VfbG9jayk7CisJbGlzdF9hZGQoJmxtLT5saXN0LCAmZ3JhY2VfbGlzdCk7CisJc3Bpbl91bmxvY2soJmdyYWNlX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwobG9ja3Nfc3RhcnRfZ3JhY2UpOworCisvKioKKyAqIGxvY2tzX2VuZF9ncmFjZQorICogQGxtOiB3aG8gdGhpcyBncmFjZSBwZXJpb2QgaXMgZm9yCisgKgorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRlIHRoYXQgdGhlIGdpdmVuIGxvY2sgbWFuYWdlciBpcyByZWFkeSB0bworICogcmVzdW1lIHJlZ3VsYXIgbG9ja2luZy4gIFRoZSBncmFjZSBwZXJpb2Qgd2lsbCBub3QgZW5kIHVudGlsIGFsbCBsb2NrCisgKiBtYW5hZ2VycyB0aGF0IGNhbGxlZCBsb2Nrc19zdGFydF9ncmFjZSgpIGFsc28gY2FsbCBsb2Nrc19lbmRfZ3JhY2UoKS4KKyAqIE5vdGUgdGhhdCBjYWxsZXJzIGNvdW50IG9uIGl0IGJlaW5nIHNhZmUgdG8gY2FsbCB0aGlzIG1vcmUgdGhhbiBvbmNlLAorICogYW5kIHRoZSBzZWNvbmQgY2FsbCBzaG91bGQgYmUgYSBuby1vcC4KKyAqLwordm9pZCBsb2Nrc19lbmRfZ3JhY2Uoc3RydWN0IGxvY2tfbWFuYWdlciAqbG0pCit7CisJc3Bpbl9sb2NrKCZncmFjZV9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZsbS0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmdyYWNlX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwobG9ja3NfZW5kX2dyYWNlKTsKKworLyoqCisgKiBsb2Nrc19pbl9ncmFjZQorICoKKyAqIExvY2sgbWFuYWdlcnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGVuIGl0IGlzIE9LIGZvciB0aGVtCisgKiB0byBhbnN3ZXIgb3JkaW5hcnkgbG9jayByZXF1ZXN0cywgYW5kIHdoZW4gdGhleSBzaG91bGQgYWNjZXB0IG9ubHkKKyAqIGxvY2sgcmVjbGFpbXMuCisgKi8KK2ludCBsb2Nrc19pbl9ncmFjZSh2b2lkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmZ3JhY2VfbGlzdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsb2Nrc19pbl9ncmFjZSk7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKaW5kZXggYTE3NjY0Yy4uOWZkODg4OSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvaG9zdC5jCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtMTEsMTYgKzExLDE3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfSE9TVENBQ0hFCiAjZGVmaW5lIE5MTV9IT1NUX05SSEFTSAkJMzIKLSNkZWZpbmUgTkxNX0FERFJIQVNIKGFkZHIpCShudG9obChhZGRyKSAmIChOTE1fSE9TVF9OUkhBU0gtMSkpCiAjZGVmaW5lIE5MTV9IT1NUX1JFQklORAkJKDYwICogSFopCiAjZGVmaW5lIE5MTV9IT1NUX0VYUElSRQkJKDMwMCAqIEhaKQogI2RlZmluZSBOTE1fSE9TVF9DT0xMRUNUCSgxMjAgKiBIWikKQEAgLTMwLDQyICszMSwxMTUgQEAKIHN0YXRpYyBpbnQJCQlucmhvc3RzOwogc3RhdGljIERFRklORV9NVVRFWChubG1faG9zdF9tdXRleCk7CiAKLQogc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7Ci1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKglfX25zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqLAotCQkJCQljb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgaW50KTsKLXN0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqCW5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLAotCQkJCQkgY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJCSB1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuKTsKK3N0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZQkqbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJCWNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4sCisJCQkJCQljb25zdCBpbnQgY3JlYXRlKTsKKworc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvIHsKKwljb25zdCBpbnQJCXNlcnZlcjsJCS8qIHNlYXJjaCBmb3Igc2VydmVyfGNsaWVudCAqLworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcgkqc2FwOwkJLyogYWRkcmVzcyB0byBzZWFyY2ggZm9yICovCisJY29uc3Qgc2l6ZV90CQlzYWxlbjsJCS8qIGl0J3MgbGVuZ3RoICovCisJY29uc3QgdW5zaWduZWQgc2hvcnQJcHJvdG9jb2w7CS8qIHRyYW5zcG9ydCB0byBzZWFyY2ggZm9yKi8KKwljb25zdCB1MzIJCXZlcnNpb247CS8qIE5MTSB2ZXJzaW9uIHRvIHNlYXJjaCBmb3IgKi8KKwljb25zdCBjaGFyCQkqaG9zdG5hbWU7CS8qIHJlbW90ZSdzIGhvc3RuYW1lICovCisJY29uc3Qgc2l6ZV90CQlob3N0bmFtZV9sZW47CS8qIGl0J3MgbGVuZ3RoICovCisJY29uc3Qgc3RydWN0IHNvY2thZGRyCSpzcmNfc2FwOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCisJY29uc3Qgc2l6ZV90CQlzcmNfbGVuOwkvKiBpdCdzIGxlbmd0aCAqLworfTsKKworLyoKKyAqIEhhc2ggZnVuY3Rpb24gbXVzdCB3b3JrIHdlbGwgb24gYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBfX25sbV9oYXNoMzIoY29uc3QgX19iZTMyIG4pCit7CisJdW5zaWduZWQgaW50IGhhc2ggPSAoX19mb3JjZSB1MzIpbiBeICgoX19mb3JjZSB1MzIpbiA+PiAxNik7CisJcmV0dXJuIGhhc2ggXiAoaGFzaCA+PiA4KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX25sbV9oYXNoX2FkZHI0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcDsKKwlyZXR1cm4gX19ubG1faGFzaDMyKHNpbi0+c2luX2FkZHIuc19hZGRyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX25sbV9oYXNoX2FkZHI2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKKwljb25zdCBzdHJ1Y3QgaW42X2FkZHIgYWRkciA9IHNpbjYtPnNpbjZfYWRkcjsKKwlyZXR1cm4gX19ubG1faGFzaDMyKGFkZHIuczZfYWRkcjMyWzBdKSBeCisJICAgICAgIF9fbmxtX2hhc2gzMihhZGRyLnM2X2FkZHIzMlsxXSkgXgorCSAgICAgICBfX25sbV9oYXNoMzIoYWRkci5zNl9hZGRyMzJbMl0pIF4KKwkgICAgICAgX19ubG1faGFzaDMyKGFkZHIuczZfYWRkcjMyWzNdKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBubG1faGFzaF9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXVuc2lnbmVkIGludCBoYXNoOworCisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJaGFzaCA9IF9fbmxtX2hhc2hfYWRkcjQoc2FwKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJaGFzaCA9IF9fbmxtX2hhc2hfYWRkcjYoc2FwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGFzaCA9IDA7CisJfQorCXJldHVybiBoYXNoICYgKE5MTV9IT1NUX05SSEFTSCAtIDEpOworfQorCitzdGF0aWMgdm9pZCBubG1fY2xlYXJfcG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcCktPnNpbl9wb3J0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwKS0+c2luNl9wb3J0ID0gMDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBubG1fZGlzcGxheV9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOworCisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfVU5TUEVDOgorCQlzbnByaW50ZihidWYsIGxlbiwgInVuc3BlY2lmaWVkIik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDoKKwkJc25wcmludGYoYnVmLCBsZW4sIE5JUFFVQURfRk1ULCBOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWlmIChpcHY2X2FkZHJfdjRtYXBwZWQoJnNpbjYtPnNpbjZfYWRkcikpCisJCQlzbnByaW50ZihidWYsIGxlbiwgTklQUVVBRF9GTVQsCisJCQkJIE5JUFFVQUQoc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSkpOworCQllbHNlCisJCQlzbnByaW50ZihidWYsIGxlbiwgTklQNl9GTVQsIE5JUDYoc2luNi0+c2luNl9hZGRyKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAidW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKKwkJYnJlYWs7CisJfQorfQogCiAvKgogICogQ29tbW9uIGhvc3QgbG9va3VwIHJvdXRpbmUgZm9yIHNlcnZlciAmIGNsaWVudAogICovCi1zdGF0aWMgc3RydWN0IG5sbV9ob3N0ICpubG1fbG9va3VwX2hvc3QoaW50IHNlcnZlciwKLQkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCi0JCQkJCWludCBwcm90bywgdTMyIHZlcnNpb24sCi0JCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJCQl1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuLAotCQkJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNzaW4pCitzdGF0aWMgc3RydWN0IG5sbV9ob3N0ICpubG1fbG9va3VwX2hvc3Qoc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvICpuaSkKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7Ci0JaW50CQloYXNoOwogCi0JZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCgiTklQUVVBRF9GTVQiLT4iTklQUVVBRF9GTVQKLQkJCSIsIHA9JWQsIHY9JXUsIG15IHJvbGU9JXMsIG5hbWU9JS4qcylcbiIsCi0JCQlOSVBRVUFEKHNzaW4tPnNpbl9hZGRyLnNfYWRkciksCi0JCQlOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSwgcHJvdG8sIHZlcnNpb24sCi0JCQlzZXJ2ZXI/ICJzZXJ2ZXIiIDogImNsaWVudCIsCi0JCQlob3N0bmFtZV9sZW4sCi0JCQlob3N0bmFtZT8gaG9zdG5hbWUgOiAiPG5vbmU+Iik7Ci0KLQotCWhhc2ggPSBOTE1fQUREUkhBU0goc2luLT5zaW5fYWRkci5zX2FkZHIpOwotCi0JLyogTG9jayBoYXNoIHRhYmxlICovCiAJbXV0ZXhfbG9jaygmbmxtX2hvc3RfbXV0ZXgpOwogCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dF9nYykpCkBAIC03OCwyMiArMTUyLDIyIEBACiAJICogZGlmZmVyZW50IE5MTSBycGNfY2xpZW50cyBpbnRvIG9uZSBzaW5nbGUgbmxtX2hvc3Qgb2JqZWN0LgogCSAqIFRoaXMgd291bGQgYWxsb3cgdXMgdG8gaGF2ZSBvbmUgbmxtX2hvc3QgcGVyIGFkZHJlc3MuCiAJICovCi0JY2hhaW4gPSAmbmxtX2hvc3RzW2hhc2hdOworCWNoYWluID0gJm5sbV9ob3N0c1tubG1faGFzaF9hZGRyZXNzKG5pLT5zYXApXTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKLQkJaWYgKCFubG1fY21wX2FkZHIoJmhvc3QtPmhfYWRkciwgc2luKSkKKwkJaWYgKCFubG1fY21wX2FkZHIobmxtX2FkZHIoaG9zdCksIG5pLT5zYXApKQogCQkJY29udGludWU7CiAKIAkJLyogU2VlIGlmIHdlIGhhdmUgYW4gTlNNIGhhbmRsZSBmb3IgdGhpcyBjbGllbnQgKi8KIAkJaWYgKCFuc20pCiAJCQluc20gPSBob3N0LT5oX25zbWhhbmRsZTsKIAotCQlpZiAoaG9zdC0+aF9wcm90byAhPSBwcm90bykKKwkJaWYgKGhvc3QtPmhfcHJvdG8gIT0gbmktPnByb3RvY29sKQogCQkJY29udGludWU7Ci0JCWlmIChob3N0LT5oX3ZlcnNpb24gIT0gdmVyc2lvbikKKwkJaWYgKGhvc3QtPmhfdmVyc2lvbiAhPSBuaS0+dmVyc2lvbikKIAkJCWNvbnRpbnVlOwotCQlpZiAoaG9zdC0+aF9zZXJ2ZXIgIT0gc2VydmVyKQorCQlpZiAoaG9zdC0+aF9zZXJ2ZXIgIT0gbmktPnNlcnZlcikKIAkJCWNvbnRpbnVlOwotCQlpZiAoIW5sbV9jbXBfYWRkcigmaG9zdC0+aF9zYWRkciwgc3NpbikpCisJCWlmICghbmxtX2NtcF9hZGRyKG5sbV9zcmNhZGRyKGhvc3QpLCBuaS0+c3JjX3NhcCkpCiAJCQljb250aW51ZTsKIAogCQkvKiBNb3ZlIHRvIGhlYWQgb2YgaGFzaCBjaGFpbi4gKi8KQEAgLTEwMSwzMCArMTc1LDQxIEBACiAJCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKIAogCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZm91bmQgaG9zdCAlcyAoJXMpXG4iLAorCQkJCWhvc3QtPmhfbmFtZSwgaG9zdC0+aF9hZGRyYnVmKTsKIAkJZ290byBvdXQ7CiAJfQorCisJLyoKKwkgKiBUaGUgaG9zdCB3YXNuJ3QgaW4gb3VyIGhhc2ggdGFibGUuICBJZiB3ZSBkb24ndAorCSAqIGhhdmUgYW4gTlNNIGhhbmRsZSBmb3IgaXQgeWV0LCBjcmVhdGUgb25lLgorCSAqLwogCWlmIChuc20pCiAJCWF0b21pY19pbmMoJm5zbS0+c21fY291bnQpOwotCi0JaG9zdCA9IE5VTEw7Ci0KLQkvKiBTYWRseSwgdGhlIGhvc3QgaXNuJ3QgaW4gb3VyIGhhc2ggdGFibGUgeWV0LiBTZWUgaWYKLQkgKiB3ZSBoYXZlIGFuIE5TTSBoYW5kbGUgZm9yIGl0LiBJZiBub3QsIGNyZWF0ZSBvbmUuCi0JICovCi0JaWYgKCFuc20gJiYgIShuc20gPSBuc21fZmluZChzaW4sIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pKSkKLQkJZ290byBvdXQ7CisJZWxzZSB7CisJCWhvc3QgPSBOVUxMOworCQluc20gPSBuc21fZmluZChuaS0+c2FwLCBuaS0+c2FsZW4sCisJCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuLCAxKTsKKwkJaWYgKCFuc20pIHsKKwkJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyAiCisJCQkJIm5vIG5zbSBoYW5kbGVcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKIAlob3N0ID0ga3phbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhvc3QpIHsKIAkJbnNtX3JlbGVhc2UobnNtKTsKKwkJZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBmYWlsZWQ7IG5vIG1lbW9yeVxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAlob3N0LT5oX25hbWUJICAgPSBuc20tPnNtX25hbWU7Ci0JaG9zdC0+aF9hZGRyICAgICAgID0gKnNpbjsKLQlob3N0LT5oX2FkZHIuc2luX3BvcnQgPSAwOwkvKiBvdWNoISAqLwotCWhvc3QtPmhfc2FkZHIJICAgPSAqc3NpbjsKLQlob3N0LT5oX3ZlcnNpb24gICAgPSB2ZXJzaW9uOwotCWhvc3QtPmhfcHJvdG8gICAgICA9IHByb3RvOworCW1lbWNweShubG1fYWRkcihob3N0KSwgbmktPnNhcCwgbmktPnNhbGVuKTsKKwlob3N0LT5oX2FkZHJsZW4gPSBuaS0+c2FsZW47CisJbmxtX2NsZWFyX3BvcnQobmxtX2FkZHIoaG9zdCkpOworCW1lbWNweShubG1fc3JjYWRkcihob3N0KSwgbmktPnNyY19zYXAsIG5pLT5zcmNfbGVuKTsKKwlob3N0LT5oX3ZlcnNpb24gICAgPSBuaS0+dmVyc2lvbjsKKwlob3N0LT5oX3Byb3RvICAgICAgPSBuaS0+cHJvdG9jb2w7CiAJaG9zdC0+aF9ycGNjbG50ICAgID0gTlVMTDsKIAltdXRleF9pbml0KCZob3N0LT5oX211dGV4KTsKIAlob3N0LT5oX25leHRyZWJpbmQgPSBqaWZmaWVzICsgTkxNX0hPU1RfUkVCSU5EOwpAQCAtMTM1LDcgKzIyMCw3IEBACiAJaG9zdC0+aF9zdGF0ZSAgICAgID0gMDsJCQkvKiBwc2V1ZG8gTlNNIHN0YXRlICovCiAJaG9zdC0+aF9uc21zdGF0ZSAgID0gMDsJCQkvKiByZWFsIE5TTSBzdGF0ZSAqLwogCWhvc3QtPmhfbnNtaGFuZGxlICA9IG5zbTsKLQlob3N0LT5oX3NlcnZlcgkgICA9IHNlcnZlcjsKKwlob3N0LT5oX3NlcnZlcgkgICA9IG5pLT5zZXJ2ZXI7CiAJaGxpc3RfYWRkX2hlYWQoJmhvc3QtPmhfaGFzaCwgY2hhaW4pOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2xvY2tvd25lcnMpOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5oX2xvY2spOwpAQCAtMTQzLDYgKzIyOCwxNSBAQAogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX3JlY2xhaW0pOwogCiAJbnJob3N0cysrOworCisJbmxtX2Rpc3BsYXlfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfYWRkciwKKwkJCQlob3N0LT5oX2FkZHJidWYsIHNpemVvZihob3N0LT5oX2FkZHJidWYpKTsKKwlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9zcmNhZGRyLAorCQkJCWhvc3QtPmhfc3JjYWRkcmJ1Ziwgc2l6ZW9mKGhvc3QtPmhfc3JjYWRkcmJ1ZikpOworCisJZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBjcmVhdGVkIGhvc3QgJXNcbiIsCisJCQlob3N0LT5oX25hbWUpOworCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CiAJcmV0dXJuIGhvc3Q7CkBAIC0xNzAsMzMgKzI2NCwxMDMgQEAKIAlrZnJlZShob3N0KTsKIH0KIAotLyoKLSAqIEZpbmQgYW4gTkxNIHNlcnZlciBoYW5kbGUgaW4gdGhlIGNhY2hlLiBJZiB0aGVyZSBpcyBub25lLCBjcmVhdGUgaXQuCisvKioKKyAqIG5sbWNsbnRfbG9va3VwX2hvc3QgLSBGaW5kIGFuIE5MTSBob3N0IGhhbmRsZSBtYXRjaGluZyBhIHJlbW90ZSBzZXJ2ZXIKKyAqIEBzYXA6IG5ldHdvcmsgYWRkcmVzcyBvZiBzZXJ2ZXIKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNlcnZlciBhZGRyZXNzCisgKiBAcHJvdG9jb2w6IHRyYW5zcG9ydCBwcm90b2NvbCB0byB1c2UKKyAqIEB2ZXJzaW9uOiBOTE0gcHJvdG9jb2wgdmVyc2lvbgorICogQGhvc3RuYW1lOiAnXDAnLXRlcm1pbmF0ZWQgaG9zdG5hbWUgb2Ygc2VydmVyCisgKgorICogUmV0dXJucyBhbiBubG1faG9zdCBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHRoZSBwYXNzZWQtaW4KKyAqIFtzZXJ2ZXIgYWRkcmVzcywgdHJhbnNwb3J0IHByb3RvY29sLCBOTE0gdmVyc2lvbiwgc2VydmVyIGhvc3RuYW1lXS4KKyAqIElmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgY2FjaGUsIGEgbmV3IGhhbmRsZSBpcworICogY3JlYXRlZCBhbmQgcmV0dXJuZWQuCiAgKi8KLXN0cnVjdCBubG1faG9zdCAqbmxtY2xudF9sb29rdXBfaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwKLQkJCQkgICAgIGludCBwcm90bywgdTMyIHZlcnNpb24sCi0JCQkJICAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBob3N0bmFtZV9sZW4pCitzdHJ1Y3QgbmxtX2hvc3QgKm5sbWNsbnRfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJICAgICBjb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCwKKwkJCQkgICAgIGNvbnN0IHUzMiB2ZXJzaW9uLCBjb25zdCBjaGFyICpob3N0bmFtZSkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3NpbiA9IHswfTsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgc291cmNlID0geworCQkuc2FfZmFtaWx5CT0gQUZfVU5TUEVDLAorCX07CisJc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvIG5pID0geworCQkuc2VydmVyCQk9IDAsCisJCS5zYXAJCT0gc2FwLAorCQkuc2FsZW4JCT0gc2FsZW4sCisJCS5wcm90b2NvbAk9IHByb3RvY29sLAorCQkudmVyc2lvbgk9IHZlcnNpb24sCisJCS5ob3N0bmFtZQk9IGhvc3RuYW1lLAorCQkuaG9zdG5hbWVfbGVuCT0gc3RybGVuKGhvc3RuYW1lKSwKKwkJLnNyY19zYXAJPSAmc291cmNlLAorCQkuc3JjX2xlbgk9IHNpemVvZihzb3VyY2UpLAorCX07CiAKLQlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDAsIHNpbiwgcHJvdG8sIHZlcnNpb24sCi0JCQkgICAgICAgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbiwgJnNzaW4pOworCWRwcmludGsoImxvY2tkOiAlcyhob3N0PSclcycsIHZlcnM9JXUsIHByb3RvPSVzKVxuIiwgX19mdW5jX18sCisJCQkoaG9zdG5hbWUgPyBob3N0bmFtZSA6ICI8bm9uZT4iKSwgdmVyc2lvbiwKKwkJCShwcm90b2NvbCA9PSBJUFBST1RPX1VEUCA/ICJ1ZHAiIDogInRjcCIpKTsKKworCXJldHVybiBubG1fbG9va3VwX2hvc3QoJm5pKTsKIH0KIAotLyoKLSAqIEZpbmQgYW4gTkxNIGNsaWVudCBoYW5kbGUgaW4gdGhlIGNhY2hlLiBJZiB0aGVyZSBpcyBub25lLCBjcmVhdGUgaXQuCisvKioKKyAqIG5sbXN2Y19sb29rdXBfaG9zdCAtIEZpbmQgYW4gTkxNIGhvc3QgaGFuZGxlIG1hdGNoaW5nIGEgcmVtb3RlIGNsaWVudAorICogQHJxc3RwOiBpbmNvbWluZyBOTE0gcmVxdWVzdAorICogQGhvc3RuYW1lOiBuYW1lIG9mIGNsaWVudCBob3N0CisgKiBAaG9zdG5hbWVfbGVuOiBsZW5ndGggb2YgY2xpZW50IGhvc3RuYW1lCisgKgorICogUmV0dXJucyBhbiBubG1faG9zdCBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHRoZSBbY2xpZW50IGFkZHJlc3MsCisgKiB0cmFuc3BvcnQgcHJvdG9jb2wsIE5MTSB2ZXJzaW9uLCBjbGllbnQgaG9zdG5hbWVdIG9mIHRoZSBwYXNzZWQtaW4KKyAqIE5MTSByZXF1ZXN0LiAgSWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgaG9zdCBjYWNoZSwgYQorICogbmV3IGhhbmRsZSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KKyAqCisgKiBCZWZvcmUgcG9zc2libHkgY3JlYXRpbmcgYSBuZXcgbmxtX2hvc3QsIGNvbnN0cnVjdCBhIHNvY2thZGRyCisgKiBmb3IgYSBzcGVjaWZpYyBzb3VyY2UgYWRkcmVzcyBpbiBjYXNlIHRoZSBsb2NhbCBzeXN0ZW0gaGFzCisgKiBtdWx0aXBsZSBuZXR3b3JrIGFkZHJlc3Nlcy4gIFRoZSBmYW1pbHkgb2YgdGhlIGFkZHJlc3MgaW4KKyAqIHJxX2RhZGRyIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGZhbWlseSBvZiB0aGUKKyAqIGFkZHJlc3MgaW4gcnFfYWRkciwgc28gaXQncyBzYWZlIHRvIHVzZSB0aGUgc2FtZSBmYW1pbHkgZm9yCisgKiB0aGUgc291cmNlIGFkZHJlc3MuCiAgKi8KLXN0cnVjdCBubG1faG9zdCAqCi1ubG1zdmNfbG9va3VwX2hvc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKLQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCB1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuKQorc3RydWN0IG5sbV9ob3N0ICpubG1zdmNfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJCQkgICAgY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQkJICAgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNzaW4gPSB7MH07CisJc3RydWN0IHNvY2thZGRyX2luIHNpbiA9IHsKKwkJLnNpbl9mYW1pbHkJPSBBRl9JTkVULAorCX07CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW42ID0geworCQkuc2luNl9mYW1pbHkJPSBBRl9JTkVUNiwKKwl9OworCXN0cnVjdCBubG1fbG9va3VwX2hvc3RfaW5mbyBuaSA9IHsKKwkJLnNlcnZlcgkJPSAxLAorCQkuc2FwCQk9IHN2Y19hZGRyKHJxc3RwKSwKKwkJLnNhbGVuCQk9IHJxc3RwLT5ycV9hZGRybGVuLAorCQkucHJvdG9jb2wJPSBycXN0cC0+cnFfcHJvdCwKKwkJLnZlcnNpb24JPSBycXN0cC0+cnFfdmVycywKKwkJLmhvc3RuYW1lCT0gaG9zdG5hbWUsCisJCS5ob3N0bmFtZV9sZW4JPSBob3N0bmFtZV9sZW4sCisJCS5zcmNfbGVuCT0gcnFzdHAtPnJxX2FkZHJsZW4sCisJfTsKIAotCXNzaW4uc2luX2FkZHIgPSBycXN0cC0+cnFfZGFkZHIuYWRkcjsKLQlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDEsIHN2Y19hZGRyX2luKHJxc3RwKSwKLQkJCSAgICAgICBycXN0cC0+cnFfcHJvdCwgcnFzdHAtPnJxX3ZlcnMsCi0JCQkgICAgICAgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbiwgJnNzaW4pOworCWRwcmludGsoImxvY2tkOiAlcyhob3N0PSclKnMnLCB2ZXJzPSV1LCBwcm90bz0lcylcbiIsIF9fZnVuY19fLAorCQkJKGludClob3N0bmFtZV9sZW4sIGhvc3RuYW1lLCBycXN0cC0+cnFfdmVycywKKwkJCShycXN0cC0+cnFfcHJvdCA9PSBJUFBST1RPX1VEUCA/ICJ1ZHAiIDogInRjcCIpKTsKKworCXN3aXRjaCAobmkuc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNpbi5zaW5fYWRkci5zX2FkZHIgPSBycXN0cC0+cnFfZGFkZHIuYWRkci5zX2FkZHI7CisJCW5pLnNyY19zYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYuc2luNl9hZGRyLCAmcnFzdHAtPnJxX2RhZGRyLmFkZHI2KTsKKwkJbmkuc3JjX3NhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG5sbV9sb29rdXBfaG9zdCgmbmkpOwogfQogCiAvKgpAQCAtMjA3LDkgKzM3MSw4IEBACiB7CiAJc3RydWN0IHJwY19jbG50CSpjbG50OwogCi0JZHByaW50aygibG9ja2Q6IG5sbV9iaW5kX2hvc3QoIk5JUFFVQURfRk1UIi0+Ik5JUFFVQURfRk1UIilcbiIsCi0JCQlOSVBRVUFEKGhvc3QtPmhfc2FkZHIuc2luX2FkZHIpLAotCQkJTklQUVVBRChob3N0LT5oX2FkZHIuc2luX2FkZHIpKTsKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2JpbmRfaG9zdCAlcyAoJXMpLCBteSBhZGRyPSVzXG4iLAorCQkJaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYsIGhvc3QtPmhfc3JjYWRkcmJ1Zik7CiAKIAkvKiBMb2NrIGhvc3QgaGFuZGxlICovCiAJbXV0ZXhfbG9jaygmaG9zdC0+aF9tdXRleCk7CkBAIC0yMjEsNyArMzg0LDcgQEAKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgaG9zdC0+aF9uZXh0cmViaW5kKSkgewogCQkJcnBjX2ZvcmNlX3JlYmluZChjbG50KTsKIAkJCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7Ci0JCQlkcHJpbnRrKCJsb2NrZDogbmV4dCByZWJpbmQgaW4gJWxkIGppZmZpZXNcbiIsCisJCQlkcHJpbnRrKCJsb2NrZDogbmV4dCByZWJpbmQgaW4gJWx1IGppZmZpZXNcbiIsCiAJCQkJCWhvc3QtPmhfbmV4dHJlYmluZCAtIGppZmZpZXMpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTIzNCw5ICszOTcsOSBAQAogCQl9OwogCQlzdHJ1Y3QgcnBjX2NyZWF0ZV9hcmdzIGFyZ3MgPSB7CiAJCQkucHJvdG9jb2wJPSBob3N0LT5oX3Byb3RvLAotCQkJLmFkZHJlc3MJPSAoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfYWRkciwKLQkJCS5hZGRyc2l6ZQk9IHNpemVvZihob3N0LT5oX2FkZHIpLAotCQkJLnNhZGRyZXNzCT0gKHN0cnVjdCBzb2NrYWRkciAqKSZob3N0LT5oX3NhZGRyLAorCQkJLmFkZHJlc3MJPSBubG1fYWRkcihob3N0KSwKKwkJCS5hZGRyc2l6ZQk9IGhvc3QtPmhfYWRkcmxlbiwKKwkJCS5zYWRkcmVzcwk9IG5sbV9zcmNhZGRyKGhvc3QpLAogCQkJLnRpbWVvdXQJPSAmdGltZXBhcm1zLAogCQkJLnNlcnZlcm5hbWUJPSBob3N0LT5oX25hbWUsCiAJCQkucHJvZ3JhbQk9ICZubG1fcHJvZ3JhbSwKQEAgLTMyNCwxMiArNDg3LDE2IEBACiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbTsKIAlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CiAKLQlkcHJpbnRrKCJsb2NrZDogbmxtX2hvc3RfcmVib290ZWQoJXMsICV1LiV1LiV1LiV1KVxuIiwKLQkJCWhvc3RuYW1lLCBOSVBRVUFEKHNpbi0+c2luX2FkZHIpKTsKLQotCS8qIEZpbmQgdGhlIE5TTSBoYW5kbGUgZm9yIHRoaXMgcGVlciAqLwotCWlmICghKG5zbSA9IF9fbnNtX2ZpbmQoc2luLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuLCAwKSkpCisJbnNtID0gbnNtX2ZpbmQoKHN0cnVjdCBzb2NrYWRkciAqKXNpbiwgc2l6ZW9mKCpzaW4pLAorCQkJaG9zdG5hbWUsIGhvc3RuYW1lX2xlbiwgMCk7CisJaWYgKG5zbSA9PSBOVUxMKSB7CisJCWRwcmludGsoImxvY2tkOiBuZXZlciBzYXcgcmVib290ZWQgcGVlciAnJS4qcycgYmVmb3JlXG4iLAorCQkJCWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUpOwogCQlyZXR1cm47CisJfQorCisJZHByaW50aygibG9ja2Q6IG5sbV9ob3N0X3JlYm9vdGVkKCUuKnMsICVzKVxuIiwKKwkJCWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUsIG5zbS0+c21fYWRkcmJ1Zik7CiAKIAkvKiBXaGVuIHJlY2xhaW1pbmcgbG9ja3Mgb24gdGhpcyBwZWVyLCBtYWtlIHN1cmUgdGhhdAogCSAqIHdlIHNldCB1cCBhIG5ldyBub3RpZmljYXRpb24gKi8KQEAgLTQ2MSwyMiArNjI4LDIzIEBACiBzdGF0aWMgTElTVF9IRUFEKG5zbV9oYW5kbGVzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnNtX2xvY2spOwogCi1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKgotX19uc21fZmluZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwKLQkJY29uc3QgY2hhciAqaG9zdG5hbWUsIHVuc2lnbmVkIGludCBob3N0bmFtZV9sZW4sCi0JCWludCBjcmVhdGUpCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCSAgIGNvbnN0IHNpemVfdCBzYWxlbiwKKwkJCQkgICBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkgICBjb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuLAorCQkJCSAgIGNvbnN0IGludCBjcmVhdGUpCiB7CiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7CiAJc3RydWN0IG5zbV9oYW5kbGUgKnBvczsKIAotCWlmICghc2luKQorCWlmICghc2FwKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChob3N0bmFtZSAmJiBtZW1jaHIoaG9zdG5hbWUsICcvJywgaG9zdG5hbWVfbGVuKSAhPSBOVUxMKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaG9zdG5hbWUgXCIlLipzXCIgIgogCQkJCQkgICAgImluIE5GUyBsb2NrIHJlcXVlc3RcbiIsCi0JCQkJaG9zdG5hbWVfbGVuLCBob3N0bmFtZSk7CisJCQkJKGludClob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKIAkJfQogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00ODksNyArNjU3LDcgQEAKIAkJCWlmIChzdHJsZW4ocG9zLT5zbV9uYW1lKSAhPSBob3N0bmFtZV9sZW4KIAkJCSB8fCBtZW1jbXAocG9zLT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKSkKIAkJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICghbmxtX2NtcF9hZGRyKCZwb3MtPnNtX2FkZHIsIHNpbikpCisJCX0gZWxzZSBpZiAoIW5sbV9jbXBfYWRkcihuc21fYWRkcihwb3MpLCBzYXApKQogCQkJY29udGludWU7CiAJCWF0b21pY19pbmMoJnBvcy0+c21fY291bnQpOwogCQlrZnJlZShuc20pOwpAQCAtNTA5LDEwICs2NzcsMTMgQEAKIAlpZiAobnNtID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JbnNtLT5zbV9hZGRyID0gKnNpbjsKKwltZW1jcHkobnNtX2FkZHIobnNtKSwgc2FwLCBzYWxlbik7CisJbnNtLT5zbV9hZGRybGVuID0gc2FsZW47CiAJbnNtLT5zbV9uYW1lID0gKGNoYXIgKikgKG5zbSArIDEpOwogCW1lbWNweShuc20tPnNtX25hbWUsIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOwogCW5zbS0+c21fbmFtZVtob3N0bmFtZV9sZW5dID0gJ1wwJzsKKwlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmbnNtLT5zbV9hZGRyLAorCQkJCW5zbS0+c21fYWRkcmJ1Ziwgc2l6ZW9mKG5zbS0+c21fYWRkcmJ1ZikpOwogCWF0b21pY19zZXQoJm5zbS0+c21fY291bnQsIDEpOwogCWdvdG8gcmV0cnk7CiAKQEAgLTUyMSwxMyArNjkyLDYgQEAKIAlyZXR1cm4gbnNtOwogfQogCi1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKgotbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCSB1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuKQotewotCXJldHVybiBfX25zbV9maW5kKHNpbiwgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbiwgMSk7Ci19Ci0KIC8qCiAgKiBSZWxlYXNlIGFuIE5TTSBoYW5kbGUKICAqLwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvbW9uLmMgYi9mcy9sb2NrZC9tb24uYwppbmRleCBlNGQ1NjM1Li40ZTdlOTU4IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9tb24uYworKysgYi9mcy9sb2NrZC9tb24uYwpAQCAtNTEsNyArNTEsNyBAQAogCiAJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwogCWFyZ3MubW9uX25hbWUgPSBuc20tPnNtX25hbWU7Ci0JYXJncy5hZGRyID0gbnNtLT5zbV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlhcmdzLmFkZHIgPSBuc21fYWRkcl9pbihuc20pLT5zaW5fYWRkci5zX2FkZHI7CiAJYXJncy5wcm9nID0gTkxNX1BST0dSQU07CiAJYXJncy52ZXJzID0gMzsKIAlhcmdzLnByb2MgPSBOTE1QUk9DX05TTV9OT1RJRlk7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IDViZDliZjAuLmM2MzFhODMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Yy5jCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC01MSw3ICs1MSw2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CQlubG1zdmNfdXNlcnM7CiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0CSpubG1zdmNfdGFzazsKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3Jxc3QJCSpubG1zdmNfcnFzdDsKLWludAkJCQlubG1zdmNfZ3JhY2VfcGVyaW9kOwogdW5zaWduZWQgbG9uZwkJCW5sbXN2Y190aW1lb3V0OwogCiAvKgpAQCAtODUsMjcgKzg0LDIzIEBACiAJCXJldHVybiBubG1fdGltZW91dCAqIDUgKiBIWjsKIH0KIAotdW5zaWduZWQgbG9uZyBnZXRfbmZzX2dyYWNlX3BlcmlvZCh2b2lkKQorc3RhdGljIHN0cnVjdCBsb2NrX21hbmFnZXIgbG9ja2RfbWFuYWdlciA9IHsKK307CisKK3N0YXRpYyB2b2lkIGdyYWNlX2VuZGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqbm90X3VzZWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb2NrZGdyYWNlID0gZ2V0X2xvY2tkX2dyYWNlX3BlcmlvZCgpOwotCXVuc2lnbmVkIGxvbmcgbmZzZGdyYWNlID0gMDsKLQotCWlmIChubG1zdmNfb3BzKQotCQluZnNkZ3JhY2UgPSBubG1zdmNfb3BzLT5nZXRfZ3JhY2VfcGVyaW9kKCk7Ci0KLQlyZXR1cm4gbWF4KGxvY2tkZ3JhY2UsIG5mc2RncmFjZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9uZnNfZ3JhY2VfcGVyaW9kKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2dyYWNlX3BlcmlvZCh2b2lkKQotewotCW5sbXN2Y19ncmFjZV9wZXJpb2QgPSAxOwotCXJldHVybiBnZXRfbmZzX2dyYWNlX3BlcmlvZCgpICsgamlmZmllczsKKwlsb2Nrc19lbmRfZ3JhY2UoJmxvY2tkX21hbmFnZXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZ3JhY2VfcGVyaW9kKHZvaWQpCitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZ3JhY2VfcGVyaW9kX2VuZCwgZ3JhY2VfZW5kZXIpOworCitzdGF0aWMgdm9pZCBzZXRfZ3JhY2VfcGVyaW9kKHZvaWQpCiB7Ci0Jbmxtc3ZjX2dyYWNlX3BlcmlvZCA9IDA7CisJdW5zaWduZWQgbG9uZyBncmFjZV9wZXJpb2QgPSBnZXRfbG9ja2RfZ3JhY2VfcGVyaW9kKCk7CisKKwlsb2Nrc19zdGFydF9ncmFjZSgmbG9ja2RfbWFuYWdlcik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZncmFjZV9wZXJpb2RfZW5kKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmdyYWNlX3BlcmlvZF9lbmQsIGdyYWNlX3BlcmlvZCk7CiB9CiAKIC8qCkBAIC0xMTYsNyArMTExLDYgQEAKIHsKIAlpbnQJCWVyciA9IDAsIHByZXZlcnIgPSAwOwogCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAgPSB2cnFzdHA7Ci0JdW5zaWduZWQgbG9uZyBncmFjZV9wZXJpb2RfZXhwaXJlOwogCiAJLyogdHJ5X3RvX2ZyZWV6ZSgpIGlzIGNhbGxlZCBmcm9tIHN2Y19yZWN2KCkgKi8KIAlzZXRfZnJlZXphYmxlKCk7CkBAIC0xMzksNyArMTMzLDcgQEAKIAkJbmxtX3RpbWVvdXQgPSBMT0NLRF9ERkxUX1RJTUVPOwogCW5sbXN2Y190aW1lb3V0ID0gbmxtX3RpbWVvdXQgKiBIWjsKIAotCWdyYWNlX3BlcmlvZF9leHBpcmUgPSBzZXRfZ3JhY2VfcGVyaW9kKCk7CisJc2V0X2dyYWNlX3BlcmlvZCgpOwogCiAJLyoKIAkgKiBUaGUgbWFpbiByZXF1ZXN0IGxvb3AuIFdlIGRvbid0IHRlcm1pbmF0ZSB1bnRpbCB0aGUgbGFzdApAQCAtMTUzLDIxICsxNDcsMTIgQEAKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQlpZiAobmxtc3ZjX29wcykgewogCQkJCW5sbXN2Y19pbnZhbGlkYXRlX2FsbCgpOwotCQkJCWdyYWNlX3BlcmlvZF9leHBpcmUgPSBzZXRfZ3JhY2VfcGVyaW9kKCk7CisJCQkJc2V0X2dyYWNlX3BlcmlvZCgpOwogCQkJfQogCQkJY29udGludWU7CiAJCX0KIAotCQkvKgotCQkgKiBSZXRyeSBhbnkgYmxvY2tlZCBsb2NrcyB0aGF0IGhhdmUgYmVlbiBub3RpZmllZCBieQotCQkgKiB0aGUgVkZTLiBEb24ndCBkbyB0aGlzIGR1cmluZyBncmFjZSBwZXJpb2QuCi0JCSAqIChUaGVvcmV0aWNhbGx5LCB0aGVyZSBzaG91bGRuJ3QgZXZlbiBiZSBibG9ja2VkIGxvY2tzCi0JCSAqIGR1cmluZyBncmFjZSBwZXJpb2QpLgotCQkgKi8KLQkJaWYgKCFubG1zdmNfZ3JhY2VfcGVyaW9kKSB7Ci0JCQl0aW1lb3V0ID0gbmxtc3ZjX3JldHJ5X2Jsb2NrZWQoKTsKLQkJfSBlbHNlIGlmICh0aW1lX2JlZm9yZShncmFjZV9wZXJpb2RfZXhwaXJlLCBqaWZmaWVzKSkKLQkJCWNsZWFyX2dyYWNlX3BlcmlvZCgpOworCQl0aW1lb3V0ID0gbmxtc3ZjX3JldHJ5X2Jsb2NrZWQoKTsKIAogCQkvKgogCQkgKiBGaW5kIGEgc29ja2V0IHdpdGggZGF0YSBhdmFpbGFibGUgYW5kIGNhbGwgaXRzCkBAIC0xOTUsNiArMTgwLDcgQEAKIAkJc3ZjX3Byb2Nlc3MocnFzdHApOwogCX0KIAlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZ3JhY2VfcGVyaW9kX2VuZCk7CiAJaWYgKG5sbXN2Y19vcHMpCiAJCW5sbXN2Y19pbnZhbGlkYXRlX2FsbCgpOwogCW5sbV9zaHV0ZG93bl9ob3N0cygpOwpAQCAtMjAzLDI1ICsxODksMjggQEAKIH0KIAogLyoKLSAqIE1ha2UgYW55IHNvY2tldHMgdGhhdCBhcmUgbmVlZGVkIGJ1dCBub3QgcHJlc2VudC4KLSAqIElmIG5sbV91ZHBwb3J0IG9yIG5sbV90Y3Bwb3J0IHdlcmUgc2V0IGFzIG1vZHVsZQotICogb3B0aW9ucywgbWFrZSB0aG9zZSBzb2NrZXRzIHVuY29uZGl0aW9uYWxseQorICogRW5zdXJlIHRoZXJlIGFyZSBhY3RpdmUgVURQIGFuZCBUQ1AgbGlzdGVuZXJzIGZvciBsb2NrZC4KKyAqCisgKiBFdmVuIGlmIHdlIGhhdmUgb25seSBUQ1AgTkZTIG1vdW50cyBhbmQvb3IgVENQIE5GU0RzLCBzb21lCisgKiBsb2NhbCBzZXJ2aWNlcyAoc3VjaCBhcyBycGMuc3RhdGQpIHN0aWxsIHJlcXVpcmUgVURQLCBhbmQKKyAqIHNvbWUgTkZTIHNlcnZlcnMgZG8gbm90IHlldCBzdXBwb3J0IE5MTSBvdmVyIFRDUC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgYWxsIGxpc3RlbmVycyBhcmUgYXZhaWxhYmxlOyBvdGhlcndpc2UgYQorICogbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKi8KLXN0YXRpYyBpbnQgbWFrZV9zb2NrcyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBwcm90bykKK3N0YXRpYyBpbnQgbWFrZV9zb2NrcyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCiB7CiAJc3RhdGljIGludCB3YXJuZWQ7CiAJc3RydWN0IHN2Y194cHJ0ICp4cHJ0OwogCWludCBlcnIgPSAwOwogCi0JaWYgKHByb3RvID09IElQUFJPVE9fVURQIHx8IG5sbV91ZHBwb3J0KSB7Ci0JCXhwcnQgPSBzdmNfZmluZF94cHJ0KHNlcnYsICJ1ZHAiLCAwLCAwKTsKLQkJaWYgKCF4cHJ0KQotCQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ1ZHAiLCBubG1fdWRwcG9ydCwKLQkJCQkJICAgICAgU1ZDX1NPQ0tfREVGQVVMVFMpOwotCQllbHNlCi0JCQlzdmNfeHBydF9wdXQoeHBydCk7Ci0JfQotCWlmIChlcnIgPj0gMCAmJiAocHJvdG8gPT0gSVBQUk9UT19UQ1AgfHwgbmxtX3RjcHBvcnQpKSB7CisJeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgInVkcCIsIDAsIDApOworCWlmICgheHBydCkKKwkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ1ZHAiLCBubG1fdWRwcG9ydCwKKwkJCQkgICAgICBTVkNfU09DS19ERUZBVUxUUyk7CisJZWxzZQorCQlzdmNfeHBydF9wdXQoeHBydCk7CisJaWYgKGVyciA+PSAwKSB7CiAJCXhwcnQgPSBzdmNfZmluZF94cHJ0KHNlcnYsICJ0Y3AiLCAwLCAwKTsKIAkJaWYgKCF4cHJ0KQogCQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ0Y3AiLCBubG1fdGNwcG9ydCwKQEAgLTI0MSw4ICsyMzAsNyBAQAogLyoKICAqIEJyaW5nIHVwIHRoZSBsb2NrZCBwcm9jZXNzIGlmIGl0J3Mgbm90IGFscmVhZHkgdXAuCiAgKi8KLWludAotbG9ja2RfdXAoaW50IHByb3RvKSAvKiBNYXliZSBhZGQgYSAnZmFtaWx5JyBvcHRpb24gd2hlbiBJUHY2IGlzIHN1cHBvcnRlZCA/PyAqLworaW50IGxvY2tkX3VwKHZvaWQpCiB7CiAJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2OwogCWludAkJZXJyb3IgPSAwOwpAQCAtMjUxLDExICsyMzksOCBAQAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB3ZSdyZSBhbHJlYWR5IHVwIGFuZCBydW5uaW5nLgogCSAqLwotCWlmIChubG1zdmNfcnFzdCkgewotCQlpZiAocHJvdG8pCi0JCQllcnJvciA9IG1ha2Vfc29ja3Mobmxtc3ZjX3Jxc3QtPnJxX3NlcnZlciwgcHJvdG8pOworCWlmIChubG1zdmNfcnFzdCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyoKIAkgKiBTYW5pdHkgY2hlY2s6IGlmIHRoZXJlJ3Mgbm8gcGlkLApAQCAtMjY2LDEzICsyNTEsMTQgQEAKIAkJCSJsb2NrZF91cDogbm8gcGlkLCAlZCB1c2Vycz8/XG4iLCBubG1zdmNfdXNlcnMpOwogCiAJZXJyb3IgPSAtRU5PTUVNOwotCXNlcnYgPSBzdmNfY3JlYXRlKCZubG1zdmNfcHJvZ3JhbSwgTE9DS0RfQlVGU0laRSwgTlVMTCk7CisJc2VydiA9IHN2Y19jcmVhdGUoJm5sbXN2Y19wcm9ncmFtLCBMT0NLRF9CVUZTSVpFLCBBRl9JTkVULCBOVUxMKTsKIAlpZiAoIXNlcnYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2RfdXA6IGNyZWF0ZSBzZXJ2aWNlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICgoZXJyb3IgPSBtYWtlX3NvY2tzKHNlcnYsIHByb3RvKSkgPCAwKQorCWVycm9yID0gbWFrZV9zb2NrcyhzZXJ2KTsKKwlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGRlc3Ryb3lfYW5kX291dDsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmM0cHJvYy5jIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwppbmRleCA0YTcxNGY2NC4uMDE0ZjZjZSAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjNHByb2MuYworKysgYi9mcy9sb2NrZC9zdmM0cHJvYy5jCkBAIC04OCwxMiArODgsNiBAQAogCWRwcmludGsoImxvY2tkOiBURVNUNCAgICAgICAgY2FsbGVkXG4iKTsKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKLQkvKiBEb24ndCBhY2NlcHQgdGVzdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCi0JaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKLQkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOwotCQlyZXR1cm4gcmM7Ci0JfQotCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKIAkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKQEAgLTEyMiwxMiArMTE2LDYgQEAKIAogCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKIAotCS8qIERvbid0IGFjY2VwdCBuZXcgbG9jayByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCi0JaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QgJiYgIWFyZ3AtPnJlY2xhaW0pIHsKLQkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOwotCQlyZXR1cm4gcmM7Ci0JfQotCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKIAkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKQEAgLTE0Niw3ICsxMzQsOCBAQAogCiAJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCiAJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2xvY2socnFzdHAsIGZpbGUsIGhvc3QsICZhcmdwLT5sb2NrLAotCQkJCQlhcmdwLT5ibG9jaywgJmFyZ3AtPmNvb2tpZSk7CisJCQkJCWFyZ3AtPmJsb2NrLCAmYXJncC0+Y29va2llLAorCQkJCQlhcmdwLT5yZWNsYWltKTsKIAlpZiAocmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5KQogCQlyYyA9IHJwY19kcm9wX3JlcGx5OwogCWVsc2UKQEAgLTE2OSw3ICsxNTgsNyBAQAogCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKIAogCS8qIERvbid0IGFjY2VwdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCi0JaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkgewogCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CiAJCXJldHVybiBycGNfc3VjY2VzczsKIAl9CkBAIC0yMDIsNyArMTkxLDcgQEAKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKIAkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLwotCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJaWYgKGxvY2tzX2luX2dyYWNlKCkpIHsKIAkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOwogCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiAJfQpAQCAtMjMxLDcgKzIyMCw3IEBACiAJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOwogCiAJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgY2FsbGVkXG4iKTsKLQlyZXNwLT5zdGF0dXMgPSBubG1jbG50X2dyYW50KHN2Y19hZGRyX2luKHJxc3RwKSwgJmFyZ3AtPmxvY2spOworCXJlc3AtPnN0YXR1cyA9IG5sbWNsbnRfZ3JhbnQoc3ZjX2FkZHIocnFzdHApLCAmYXJncC0+bG9jayk7CiAJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0zNDEsNyArMzMwLDcgQEAKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKIAkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLwotCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7CisJaWYgKGxvY2tzX2luX2dyYWNlKCkgJiYgIWFyZ3AtPnJlY2xhaW0pIHsKIAkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOwogCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiAJfQpAQCAtMzc0LDcgKzM2Myw3IEBACiAJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOwogCiAJLyogRG9uJ3QgYWNjZXB0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KLQlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCWlmIChsb2Nrc19pbl9ncmFjZSgpKSB7CiAJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCX0KQEAgLTQzMiwxMSArNDIxLDkgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2FkZHI7CiAKLQltZW1jcHkoJnNhZGRyLCBzdmNfYWRkcl9pbihycXN0cCksIHNpemVvZihzYWRkcikpOwotCiAJZHByaW50aygibG9ja2Q6IFNNX05PVElGWSAgICAgY2FsbGVkXG4iKTsKLQlpZiAoc2FkZHIuc2luX2FkZHIuc19hZGRyICE9IGh0b25sKElOQUREUl9MT09QQkFDSykKLQkgfHwgbnRvaHMoc2FkZHIuc2luX3BvcnQpID49IDEwMjQpIHsKKworCWlmICghbmxtX3ByaXZpbGVnZWRfcmVxdWVzdGVyKHJxc3RwKSkgewogCQljaGFyIGJ1ZltSUENfTUFYX0FERFJCVUZMRU5dOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZDogcmVqZWN0ZWQgTlNNIGNhbGxiYWNrIGZyb20gJXNcbiIsCiAJCQkJc3ZjX3ByaW50X2FkZHIocnFzdHAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y2xvY2suYyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwppbmRleCBjZjBkNWMyLi42MDYzYThlIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNsb2NrLmMKKysrIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIF9fYmUzMgogbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAogCSAgICBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fbG9jayAqbG9jaywgaW50IHdhaXQsCi0JICAgIHN0cnVjdCBubG1fY29va2llICpjb29raWUpCisJICAgIHN0cnVjdCBubG1fY29va2llICpjb29raWUsIGludCByZWNsYWltKQogewogCXN0cnVjdCBubG1fYmxvY2sJKmJsb2NrID0gTlVMTDsKIAlpbnQJCQllcnJvcjsKQEAgLTQwNiw2ICs0MDYsMTUgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKGxvY2tzX2luX2dyYWNlKCkgJiYgIXJlY2xhaW0pIHsKKwkJcmV0ID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlY2xhaW0gJiYgIWxvY2tzX2luX2dyYWNlKCkpIHsKKwkJcmV0ID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoIXdhaXQpCiAJCWxvY2stPmZsLmZsX2ZsYWdzICY9IH5GTF9TTEVFUDsKIAllcnJvciA9IHZmc19sb2NrX2ZpbGUoZmlsZS0+Zl9maWxlLCBGX1NFVExLLCAmbG9jay0+ZmwsIE5VTEwpOwpAQCAtNTAyLDYgKzUxMSwxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkgeworCQlyZXQgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCWdvdG8gb3V0OworCX0KIAllcnJvciA9IHZmc190ZXN0X2xvY2soZmlsZS0+Zl9maWxlLCAmbG9jay0+ZmwpOwogCWlmIChlcnJvciA9PSBGSUxFX0xPQ0tfREVGRVJSRUQpIHsKIAkJcmV0ID0gbmxtc3ZjX2RlZmVyX2xvY2tfcnFzdChycXN0cCwgYmxvY2spOwpAQCAtNTgyLDYgKzU5NSw5IEBACiAJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9zdGFydCwKIAkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX2VuZCk7CiAKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkKKwkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwogCW11dGV4X2xvY2soJmZpbGUtPmZfbXV0ZXgpOwogCWJsb2NrID0gbmxtc3ZjX2xvb2t1cF9ibG9jayhmaWxlLCBsb2NrKTsKIAltdXRleF91bmxvY2soJmZpbGUtPmZfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjcHJvYy5jIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCmluZGV4IDc2MjYyYzEuLjU0OGIwYmIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3Byb2MuYworKysgYi9mcy9sb2NrZC9zdmNwcm9jLmMKQEAgLTExNywxMiArMTE3LDYgQEAKIAlkcHJpbnRrKCJsb2NrZDogVEVTVCAgICAgICAgICBjYWxsZWRcbiIpOwogCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKIAotCS8qIERvbid0IGFjY2VwdCB0ZXN0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KLQlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgewotCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7Ci0JCXJldHVybiByYzsKLQl9Ci0KIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCiAJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CkBAIC0xNTIsMTIgKzE0Niw2IEBACiAKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKLQkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLwotCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7Ci0JCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKLQkJcmV0dXJuIHJjOwotCX0KLQogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKIAkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKQEAgLTE3Niw3ICsxNjQsOCBAQAogCiAJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX2xvY2socnFzdHAsIGZpbGUsIGhvc3QsICZhcmdwLT5sb2NrLAotCQkJCQkgICAgICAgYXJncC0+YmxvY2ssICZhcmdwLT5jb29raWUpKTsKKwkJCQkJICAgICAgIGFyZ3AtPmJsb2NrLCAmYXJncC0+Y29va2llLAorCQkJCQkgICAgICAgYXJncC0+cmVjbGFpbSkpOwogCWlmIChyZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkpCiAJCXJjID0gcnBjX2Ryb3BfcmVwbHk7CiAJZWxzZQpAQCAtMTk5LDcgKzE4OCw3IEBACiAJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOwogCiAJLyogRG9uJ3QgYWNjZXB0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KLQlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCWlmIChsb2Nrc19pbl9ncmFjZSgpKSB7CiAJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCX0KQEAgLTIzMiw3ICsyMjEsNyBAQAogCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKIAogCS8qIERvbid0IGFjY2VwdCBuZXcgbG9jayByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCi0JaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkgewogCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CiAJCXJldHVybiBycGNfc3VjY2VzczsKIAl9CkBAIC0yNjEsNyArMjUwLDcgQEAKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKIAlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBjYWxsZWRcbiIpOwotCXJlc3AtPnN0YXR1cyA9IG5sbWNsbnRfZ3JhbnQoc3ZjX2FkZHJfaW4ocnFzdHApLCAmYXJncC0+bG9jayk7CisJcmVzcC0+c3RhdHVzID0gbmxtY2xudF9ncmFudChzdmNfYWRkcihycXN0cCksICZhcmdwLT5sb2NrKTsKIAlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTM3Myw3ICszNjIsNyBAQAogCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKIAogCS8qIERvbid0IGFjY2VwdCBuZXcgbG9jayByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCi0JaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QgJiYgIWFyZ3AtPnJlY2xhaW0pIHsKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSAmJiAhYXJncC0+cmVjbGFpbSkgewogCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CiAJCXJldHVybiBycGNfc3VjY2VzczsKIAl9CkBAIC00MDYsNyArMzk1LDcgQEAKIAlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CiAKIAkvKiBEb24ndCBhY2NlcHQgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLwotCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJaWYgKGxvY2tzX2luX2dyYWNlKCkpIHsKIAkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOwogCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiAJfQpAQCAtNDY0LDExICs0NTMsOSBAQAogewogCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkcjsKIAotCW1lbWNweSgmc2FkZHIsIHN2Y19hZGRyX2luKHJxc3RwKSwgc2l6ZW9mKHNhZGRyKSk7Ci0KIAlkcHJpbnRrKCJsb2NrZDogU01fTk9USUZZICAgICBjYWxsZWRcbiIpOwotCWlmIChzYWRkci5zaW5fYWRkci5zX2FkZHIgIT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKQotCSB8fCBudG9ocyhzYWRkci5zaW5fcG9ydCkgPj0gMTAyNCkgeworCisJaWYgKCFubG1fcHJpdmlsZWdlZF9yZXF1ZXN0ZXIocnFzdHApKSB7CiAJCWNoYXIgYnVmW1JQQ19NQVhfQUREUkJVRkxFTl07CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiByZWplY3RlZCBOU00gY2FsbGJhY2sgZnJvbSAlc1xuIiwKIAkJCQlzdmNfcHJpbnRfYWRkcihycXN0cCwgYnVmLCBzaXplb2YoYnVmKSkpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc3Vicy5jIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCmluZGV4IDE5OGI0ZTUuLjM0YzI3NjYgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3N1YnMuYworKysgYi9mcy9sb2NrZC9zdmNzdWJzLmMKQEAgLTQxOCw3ICs0MTgsNyBAQAogc3RhdGljIGludAogbmxtc3ZjX21hdGNoX2lwKHZvaWQgKmRhdGFwLCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCiB7Ci0JcmV0dXJuIG5sbV9jbXBfYWRkcigmaG9zdC0+aF9zYWRkciwgZGF0YXApOworCXJldHVybiBubG1fY21wX2FkZHIobmxtX3NyY2FkZHIoaG9zdCksIGRhdGFwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHIuYyBiL2ZzL2xvY2tkL3hkci5jCmluZGV4IDNlNDU5ZTEuLjFmMjI2MjkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkci5jCisrKyBiL2ZzL2xvY2tkL3hkci5jCkBAIC0zNTEsOCArMzUxLDYgQEAKIAlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOwogCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwogCWFyZ3AtPmFkZHIgPSAqcCsrOwotCWFyZ3AtPnZlcnMgPSAqcCsrOwotCWFyZ3AtPnByb3RvID0gKnArKzsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHI0LmMgYi9mcy9sb2NrZC94ZHI0LmMKaW5kZXggNDNmZjkzOS4uNTBjNDkzYSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyNC5jCisrKyBiL2ZzL2xvY2tkL3hkcjQuYwpAQCAtMzU4LDggKzM1OCw2IEBACiAJYXJncC0+c3RhdGUgPSBudG9obCgqcCsrKTsKIAkvKiBQcmVzZXJ2ZSB0aGUgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KIAlhcmdwLT5hZGRyICA9ICpwKys7Ci0JYXJncC0+dmVycyAgPSAqcCsrOwotCWFyZ3AtPnByb3RvID0gKnArKzsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9tcGFnZS5jIGIvZnMvbXBhZ2UuYwppbmRleCBkYmNjN2FmLi41NTJiODBiIDEwMDY0NAotLS0gYS9mcy9tcGFnZS5jCisrKyBiL2ZzL21wYWdlLmMKQEAgLTYsNyArNiw3IEBACiAgKiBDb250YWlucyBmdW5jdGlvbnMgcmVsYXRlZCB0byBwcmVwYXJpbmcgYW5kIHN1Ym1pdHRpbmcgQklPcyB3aGljaCBjb250YWluCiAgKiBtdWx0aXBsZSBwYWdlY2FjaGUgcGFnZXMuCiAgKgotICogMTVNYXkyMDAyCWFrcG1AemlwLmNvbS5hdQorICogMTVNYXkyMDAyCUFuZHJldyBNb3J0b24KICAqCQlJbml0aWFsIHZlcnNpb24KICAqIDI3SnVuMjAwMglheGJvZUBzdXNlLmRlCiAgKgkJdXNlIGJpb19hZGRfcGFnZSgpIHRvIGJ1aWxkIGJpbydzIGp1c3QgdGhlIHJpZ2h0IHNpemUKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggZjQ0N2Y0Yi4uNmEwOTc2MCAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTEwNSw3ICsxMDUsOCBAQAogCW11dGV4X2xvY2soJm5mc19jYWxsYmFja19tdXRleCk7CiAJaWYgKG5mc19jYWxsYmFja19pbmZvLnVzZXJzKysgfHwgbmZzX2NhbGxiYWNrX2luZm8udGFzayAhPSBOVUxMKQogCQlnb3RvIG91dDsKLQlzZXJ2ID0gc3ZjX2NyZWF0ZSgmbmZzNF9jYWxsYmFja19wcm9ncmFtLCBORlM0X0NBTExCQUNLX0JVRlNJWkUsIE5VTEwpOworCXNlcnYgPSBzdmNfY3JlYXRlKCZuZnM0X2NhbGxiYWNrX3Byb2dyYW0sIE5GUzRfQ0FMTEJBQ0tfQlVGU0laRSwKKwkJCQlBRl9JTkVULCBOVUxMKTsKIAlyZXQgPSAtRU5PTUVNOwogCWlmICghc2VydikKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDVlZTIzZTcuLjc1NDc2MDAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTY3NSw3ICs2NzUsNyBAQAogCXNlcnZlci0+bmZzX2NsaWVudCA9IGNscDsKIAogCS8qIEluaXRpYWxpc2UgdGhlIGNsaWVudCByZXByZXNlbnRhdGlvbiBmcm9tIHRoZSBtb3VudCBkYXRhICovCi0Jc2VydmVyLT5mbGFncyA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOworCXNlcnZlci0+ZmxhZ3MgPSBkYXRhLT5mbGFnczsKIAogCWlmIChkYXRhLT5yc2l6ZSkKIAkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKQEAgLTg1MCw3ICs4NTAsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmNsaWVudF9saW5rKTsKIAlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5tYXN0ZXJfbGluayk7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJ2ZXItPmFjdGl2ZV93cSk7CiAJYXRvbWljX3NldCgmc2VydmVyLT5hY3RpdmUsIDApOwogCiAJc2VydmVyLT5pb19zdGF0cyA9IG5mc19hbGxvY19pb3N0YXRzKCk7CkBAIC0xMDczLDcgKzEwNzIsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgY2xpZW50IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlIG1vdW50IGRhdGEgKi8KLQlzZXJ2ZXItPmZsYWdzID0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxBR01BU0s7CisJc2VydmVyLT5mbGFncyA9IGRhdGEtPmZsYWdzOwogCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0FUT01JQ19PUEVOOwogCiAJaWYgKGRhdGEtPnJzaXplKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IDc0ZjkyYjcuLjJhYjcwZDQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTE1Niw2ICsxNTYsNyBAQAogCWRlY29kZV9kaXJlbnRfdAlkZWNvZGU7CiAJaW50CQlwbHVzOwogCXVuc2lnbmVkIGxvbmcJdGltZXN0YW1wOworCXVuc2lnbmVkIGxvbmcJZ2VuY291bnQ7CiAJaW50CQl0aW1lc3RhbXBfdmFsaWQ7CiB9IG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdDsKIApAQCAtMTc3LDcgKzE3OCw3IEBACiAJc3RydWN0IGZpbGUJKmZpbGUgPSBkZXNjLT5maWxlOwogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IG5mc19maWxlX2NyZWQoZmlsZSk7Ci0JdW5zaWduZWQgbG9uZwl0aW1lc3RhbXA7CisJdW5zaWduZWQgbG9uZwl0aW1lc3RhbXAsIGdlbmNvdW50OwogCWludAkJZXJyb3I7CiAKIAlkZnByaW50ayhESVJDQUNIRSwgIk5GUzogJXM6IHJlYWRpbmcgY29va2llICVMdSBpbnRvIHBhZ2UgJWx1XG4iLApAQCAtMTg2LDYgKzE4Nyw3IEBACiAKICBhZ2FpbjoKIAl0aW1lc3RhbXAgPSBqaWZmaWVzOworCWdlbmNvdW50ID0gbmZzX2luY19hdHRyX2dlbmVyYXRpb25fY291bnRlcigpOwogCWVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZGRpcihmaWxlLT5mX3BhdGguZGVudHJ5LCBjcmVkLCBkZXNjLT5lbnRyeS0+Y29va2llLCBwYWdlLAogCQkJCQkgIE5GU19TRVJWRVIoaW5vZGUpLT5kdHNpemUsIGRlc2MtPnBsdXMpOwogCWlmIChlcnJvciA8IDApIHsKQEAgLTE5OSw2ICsyMDEsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAlkZXNjLT50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJZGVzYy0+Z2VuY291bnQgPSBnZW5jb3VudDsKIAlkZXNjLT50aW1lc3RhbXBfdmFsaWQgPSAxOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkvKiBFbnN1cmUgY29uc2lzdGVudCBwYWdlIGFsaWdubWVudCBvZiB0aGUgZGF0YS4KQEAgLTIyNCw5ICsyMjcsMTAgQEAKIAlpZiAoSVNfRVJSKHApKQogCQlyZXR1cm4gUFRSX0VSUihwKTsKIAlkZXNjLT5wdHIgPSBwOwotCWlmIChkZXNjLT50aW1lc3RhbXBfdmFsaWQpCisJaWYgKGRlc2MtPnRpbWVzdGFtcF92YWxpZCkgewogCQlkZXNjLT5lbnRyeS0+ZmF0dHItPnRpbWVfc3RhcnQgPSBkZXNjLT50aW1lc3RhbXA7Ci0JZWxzZQorCQlkZXNjLT5lbnRyeS0+ZmF0dHItPmdlbmNvdW50ID0gZGVzYy0+Z2VuY291bnQ7CisJfSBlbHNlCiAJCWRlc2MtPmVudHJ5LT5mYXR0ci0+dmFsaWQgJj0gfk5GU19BVFRSX0ZBVFRSOwogCXJldHVybiAwOwogfQpAQCAtNDcxLDcgKzQ3NSw3IEBACiAJc3RydWN0IHJwY19jcmVkCSpjcmVkID0gbmZzX2ZpbGVfY3JlZChmaWxlKTsKIAlzdHJ1Y3QgcGFnZQkqcGFnZSA9IE5VTEw7CiAJaW50CQlzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwl0aW1lc3RhbXA7CisJdW5zaWduZWQgbG9uZwl0aW1lc3RhbXAsIGdlbmNvdW50OwogCiAJZGZwcmludGsoRElSQ0FDSEUsICJORlM6IHVuY2FjaGVkX3JlYWRkaXIoKSBzZWFyY2hpbmcgZm9yIGNvb2tpZSAlTHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSpkZXNjLT5kaXJfY29va2llKTsKQEAgLTQ4Miw2ICs0ODYsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJdGltZXN0YW1wID0gamlmZmllczsKKwlnZW5jb3VudCA9IG5mc19pbmNfYXR0cl9nZW5lcmF0aW9uX2NvdW50ZXIoKTsKIAlzdGF0dXMgPSBORlNfUFJPVE8oaW5vZGUpLT5yZWFkZGlyKGZpbGUtPmZfcGF0aC5kZW50cnksIGNyZWQsCiAJCQkJCQkqZGVzYy0+ZGlyX2Nvb2tpZSwgcGFnZSwKIAkJCQkJCU5GU19TRVJWRVIoaW5vZGUpLT5kdHNpemUsCkBAIC00OTAsNiArNDk1LDcgQEAKIAlkZXNjLT5wdHIgPSBrbWFwKHBhZ2UpOwkJLyogbWF0Y2hpbmcga3VubWFwIGluIG5mc19kb19maWxsZGlyICovCiAJaWYgKHN0YXR1cyA+PSAwKSB7CiAJCWRlc2MtPnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJZGVzYy0+Z2VuY291bnQgPSBnZW5jb3VudDsKIAkJZGVzYy0+dGltZXN0YW1wX3ZhbGlkID0gMTsKIAkJaWYgKChzdGF0dXMgPSBkaXJfZGVjb2RlKGRlc2MpKSA9PSAwKQogCQkJZGVzYy0+ZW50cnktPnByZXZfY29va2llID0gKmRlc2MtPmRpcl9jb29raWU7CkBAIC02NTUsNyArNjYxLDcgQEAKICAqLwogdm9pZCBuZnNfZm9yY2VfbG9va3VwX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICpkaXIpCiB7Ci0JTkZTX0koZGlyKS0+Y2FjaGVfY2hhbmdlX2F0dHJpYnV0ZSA9IGppZmZpZXM7CisJTkZTX0koZGlyKS0+Y2FjaGVfY2hhbmdlX2F0dHJpYnV0ZSsrOwogfQogCiAvKgpAQCAtNjY3LDYgKzY3Myw4IEBACiB7CiAJaWYgKElTX1JPT1QoZGVudHJ5KSkKIAkJcmV0dXJuIDE7CisJaWYgKE5GU19TRVJWRVIoZGlyKS0+ZmxhZ3MgJiBORlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkUpCisJCXJldHVybiAwOwogCWlmICghbmZzX3ZlcmlmeV9jaGFuZ2VfYXR0cmlidXRlKGRpciwgZGVudHJ5LT5kX3RpbWUpKQogCQlyZXR1cm4gMDsKIAkvKiBSZXZhbGlkYXRlIG5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUgYmVmb3JlIHdlIGRlY2xhcmUgYSBtYXRjaCAqLwpAQCAtNzUwLDYgKzc1OCw4IEBACiAJLyogRG9uJ3QgcmV2YWxpZGF0ZSBhIG5lZ2F0aXZlIGRlbnRyeSBpZiB3ZSdyZSBjcmVhdGluZyBhIG5ldyBmaWxlICovCiAJaWYgKG5kICE9IE5VTEwgJiYgbmZzX2xvb2t1cF9jaGVja19pbnRlbnQobmQsIExPT0tVUF9DUkVBVEUpICE9IDApCiAJCXJldHVybiAwOworCWlmIChORlNfU0VSVkVSKGRpciktPmZsYWdzICYgTkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FRykKKwkJcmV0dXJuIDE7CiAJcmV0dXJuICFuZnNfY2hlY2tfdmVyaWZpZXIoZGlyLCBkZW50cnkpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwppbmRleCA3ODQ2MDY1Li5kMzE5YjQ5IDEwMDY0NAotLS0gYS9mcy9uZnMvZmlsZS5jCisrKyBiL2ZzL25mcy9maWxlLmMKQEAgLTE4OCwxMyArMTg4LDE2IEBACiAJLyogb3JpZ2luID09IFNFRUtfRU5EID0+IHdlIG11c3QgcmV2YWxpZGF0ZSB0aGUgY2FjaGVkIGZpbGUgbGVuZ3RoICovCiAJaWYgKG9yaWdpbiA9PSBTRUVLX0VORCkgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCiAJCWludCByZXR2YWwgPSBuZnNfcmV2YWxpZGF0ZV9maWxlX3NpemUoaW5vZGUsIGZpbHApOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCXJldHVybiAobG9mZl90KXJldHZhbDsKLQl9Ci0JbG9ja19rZXJuZWwoKTsJLyogQktMIG5lZWRlZD8gKi8KLQlsb2ZmID0gZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZChmaWxwLCBvZmZzZXQsIG9yaWdpbik7Ci0JdW5sb2NrX2tlcm5lbCgpOworCisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWxvZmYgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbHAsIG9mZnNldCwgb3JpZ2luKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0gZWxzZQorCQlsb2ZmID0gZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZChmaWxwLCBvZmZzZXQsIG9yaWdpbik7CiAJcmV0dXJuIGxvZmY7CiB9CiAKQEAgLTY5OSwxMyArNzAyLDYgQEAKIAkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncyk7CiAKLQkvKgotCSAqIE5vIEJTRCBmbG9ja3Mgb3ZlciBORlMgYWxsb3dlZC4KLQkgKiBOb3RlOiB3ZSBjb3VsZCB0cnkgdG8gZmFrZSBhIFBPU0lYIGxvY2sgcmVxdWVzdCBoZXJlIGJ5Ci0JICogdXNpbmcgKCh1MzIpIGZpbHAgfCAweDgwMDAwMDAwKSBvciBzb21lIHN1Y2ggYXMgdGhlIHBpZC4KLQkgKiBOb3Qgc3VyZSB3aGV0aGVyIHRoYXQgd291bGQgYmUgdW5pcXVlLCB0aG91Z2gsIG9yIHdoZXRoZXIKLQkgKiB0aGF0IHdvdWxkIGJyZWFrIGluIG90aGVyIHBsYWNlcy4KLQkgKi8KIAlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykpCiAJCXJldHVybiAtRU5PTENLOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IDUyZGFlZmEuLmI5MTk1YzAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0zMDUsOCArMzA1LDcgQEAKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgZmF0dHItPnJkZXYpOwogCiAJCW5mc2ktPnJlYWRfY2FjaGVfamlmZmllcyA9IGZhdHRyLT50aW1lX3N0YXJ0OwotCQluZnNpLT5sYXN0X3VwZGF0ZWQgPSBub3c7Ci0JCW5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUgPSBub3c7CisJCW5mc2ktPmF0dHJfZ2VuY291bnQgPSBmYXR0ci0+Z2VuY291bnQ7CiAJCWlub2RlLT5pX2F0aW1lID0gZmF0dHItPmF0aW1lOwogCQlpbm9kZS0+aV9tdGltZSA9IGZhdHRyLT5tdGltZTsKIAkJaW5vZGUtPmlfY3RpbWUgPSBmYXR0ci0+Y3RpbWU7CkBAIC00NTMsNiArNDUyLDcgQEAKIHZvaWQgbmZzX3NldGF0dHJfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRCkpICE9IDApIHsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgIT0gMCkgewogCQkJaW50IG1vZGUgPSBhdHRyLT5pYV9tb2RlICYgU19JQUxMVUdPOwogCQkJbW9kZSB8PSBpbm9kZS0+aV9tb2RlICYgflNfSUFMTFVHTzsKQEAgLTQ2Miw3ICs0NjIsNiBAQAogCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOwogCQlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICE9IDApCiAJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7Ci0JCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCU5GU19JKGlub2RlKS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOwogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJfQpAQCAtNDcyLDM3ICs0NzEsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBuZnNfd2FpdF9zY2hlZHVsZSh2b2lkICp3b3JkKQotewotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlzY2hlZHVsZSgpOwotCXJldHVybiAwOwotfQotCi0vKgotICogV2FpdCBmb3IgdGhlIGlub2RlIHRvIGdldCB1bmxvY2tlZC4KLSAqLwotc3RhdGljIGludCBuZnNfd2FpdF9vbl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSB3YWl0X29uX2JpdF9sb2NrKCZuZnNpLT5mbGFncywgTkZTX0lOT19SRVZBTElEQVRJTkcsCi0JCQkJCW5mc193YWl0X3NjaGVkdWxlLCBUQVNLX0tJTExBQkxFKTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIHZvaWQgbmZzX3dha2VfdXBfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwotCi0JY2xlYXJfYml0KE5GU19JTk9fUkVWQUxJREFUSU5HLCAmbmZzaS0+ZmxhZ3MpOwotCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Ci0Jd2FrZV91cF9iaXQoJm5mc2ktPmZsYWdzLCBORlNfSU5PX1JFVkFMSURBVElORyk7Ci19Ci0KIGludCBuZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTY5NywyMCArNjY1LDE1IEBACiAJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiByZXZhbGlkYXRpbmcgKCVzLyVMZClcbiIsCiAJCWlub2RlLT5pX3NiLT5zX2lkLCAobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAotCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19JTk9ERVJFVkFMSURBVEUpOwogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQotIAkJZ290byBvdXRfbm93YWl0OwotCWlmIChORlNfU1RBTEUoaW5vZGUpKQotIAkJZ290byBvdXRfbm93YWl0OwotCi0Jc3RhdHVzID0gbmZzX3dhaXRfb25faW5vZGUoaW5vZGUpOwotCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIG91dDsKLQotCXN0YXR1cyA9IC1FU1RBTEU7CiAJaWYgKE5GU19TVEFMRShpbm9kZSkpCiAJCWdvdG8gb3V0OwogCisJaWYgKE5GU19TVEFMRShpbm9kZSkpCisJCWdvdG8gb3V0OworCisJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0lOT0RFUkVWQUxJREFURSk7CiAJc3RhdHVzID0gTkZTX1BST1RPKGlub2RlKS0+Z2V0YXR0cihzZXJ2ZXIsIE5GU19GSChpbm9kZSksICZmYXR0cik7CiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCWRmcHJpbnRrKFBBR0VDQUNIRSwgIm5mc19yZXZhbGlkYXRlX2lub2RlOiAoJXMvJUxkKSBnZXRhdHRyIGZhaWxlZCwgZXJyb3I9JWRcbiIsCkBAIC03MjQsMTYgKzY4NywxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCXN0YXR1cyA9IG5mc191cGRhdGVfaW5vZGUoaW5vZGUsICZmYXR0cik7CisJc3RhdHVzID0gbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsICZmYXR0cik7CiAJaWYgKHN0YXR1cykgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWRmcHJpbnRrKFBBR0VDQUNIRSwgIm5mc19yZXZhbGlkYXRlX2lub2RlOiAoJXMvJUxkKSByZWZyZXNoIGZhaWxlZCwgZXJyb3I9JWRcbiIsCiAJCQkgaW5vZGUtPmlfc2ItPnNfaWQsCiAJCQkgKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAogCWlmIChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fSU5WQUxJRF9BQ0wpCiAJCW5mc196YXBfYWNsX2NhY2hlKGlub2RlKTsKQEAgLTc0Myw5ICs3MDMsNiBAQAogCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAogIG91dDoKLQluZnNfd2FrZV91cF9pbm9kZShpbm9kZSk7Ci0KLSBvdXRfbm93YWl0OgogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTkwOCw5ICs4NjUsNiBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKiBEbyBhdG9taWMgd2VhayBjYWNoZSBjb25zaXN0ZW5jeSB1cGRhdGVzICovCi0JbmZzX3djY191cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKLQogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjQpICE9IDAgJiYKIAkJCW5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikKIAkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKQEAgLTkzOSwxNSArODkzLDgxIEBACiAKIAlpZiAoaW52YWxpZCAhPSAwKQogCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBpbnZhbGlkOwotCWVsc2UKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfihORlNfSU5PX0lOVkFMSURfQVRUUgotCQkJCXwgTkZTX0lOT19JTlZBTElEX0FUSU1FCi0JCQkJfCBORlNfSU5PX1JFVkFMX1BBR0VDQUNIRSk7CiAKIAluZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMgPSBmYXR0ci0+dGltZV9zdGFydDsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBuZnNfY3RpbWVfbmVlZF91cGRhdGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJcmV0dXJuIHRpbWVzcGVjX2NvbXBhcmUoJmZhdHRyLT5jdGltZSwgJmlub2RlLT5pX2N0aW1lKSA+IDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3NpemVfbmVlZF91cGRhdGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJcmV0dXJuIG5mc19zaXplX3RvX2xvZmZfdChmYXR0ci0+c2l6ZSkgPiBpX3NpemVfcmVhZChpbm9kZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5mc19hdHRyX2dlbmVyYXRpb25fY291bnRlcjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmZzX3JlYWRfYXR0cl9nZW5lcmF0aW9uX2NvdW50ZXIodm9pZCkKK3sKKwlzbXBfcm1iKCk7CisJcmV0dXJuIG5mc19hdHRyX2dlbmVyYXRpb25fY291bnRlcjsKK30KKwordW5zaWduZWQgbG9uZyBuZnNfaW5jX2F0dHJfZ2VuZXJhdGlvbl9jb3VudGVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJc21wX3JtYigpOworCXJldCA9ICsrbmZzX2F0dHJfZ2VuZXJhdGlvbl9jb3VudGVyOworCXNtcF93bWIoKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mc19mYXR0cl9pbml0KHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWZhdHRyLT52YWxpZCA9IDA7CisJZmF0dHItPnRpbWVfc3RhcnQgPSBqaWZmaWVzOworCWZhdHRyLT5nZW5jb3VudCA9IG5mc19pbmNfYXR0cl9nZW5lcmF0aW9uX2NvdW50ZXIoKTsKK30KKworLyoqCisgKiBuZnNfaW5vZGVfYXR0cnNfbmVlZF91cGRhdGUgLSBjaGVjayBpZiB0aGUgaW5vZGUgYXR0cmlidXRlcyBuZWVkIHVwZGF0aW5nCisgKiBAaW5vZGUgLSBwb2ludGVyIHRvIGlub2RlCisgKiBAZmF0dHIgLSBhdHRyaWJ1dGVzCisgKgorICogQXR0ZW1wdCB0byBkaXZpbmUgd2hldGhlciBvciBub3QgYW4gUlBDIGNhbGwgcmVwbHkgY2Fycnlpbmcgc3RhbGUKKyAqIGF0dHJpYnV0ZXMgZ290IHNjaGVkdWxlZCBhZnRlciBhbm90aGVyIGNhbGwgY2FycnlpbmcgdXBkYXRlZCBvbmVzLgorICoKKyAqIFRvIGRvIHNvLCB0aGUgZnVuY3Rpb24gZmlyc3QgYXNzdW1lcyB0aGF0IGEgbW9yZSByZWNlbnQgY3RpbWUgbWVhbnMKKyAqIHRoYXQgdGhlIGF0dHJpYnV0ZXMgaW4gZmF0dHIgYXJlIG5ld2VyLCBob3dldmVyIGl0IGFsc28gYXR0ZW1wdCB0bworICogY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgY3RpbWUgZWl0aGVyIGRpZG4ndCBjaGFuZ2UsIG9yIHdlbnQgYmFja3dhcmRzCisgKiAoaWYgc29tZW9uZSByZXNldCB0aGUgY2xvY2sgb24gdGhlIHNlcnZlcikgYnkgbG9va2luZyBhdCB3aGV0aGVyCisgKiBvciBub3QgdGhpcyBSUEMgY2FsbCB3YXMgc3RhcnRlZCBhZnRlciB0aGUgaW5vZGUgd2FzIGxhc3QgdXBkYXRlZC4KKyAqIE5vdGUgYWxzbyB0aGUgY2hlY2sgZm9yIHdyYXBhcm91bmQgb2YgJ2F0dHJfZ2VuY291bnQnCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIGl0IHRoaW5rcyB0aGUgYXR0cmlidXRlcyBpbiAnZmF0dHInIGFyZQorICogbW9yZSByZWNlbnQgdGhhbiB0aGUgb25lcyBjYWNoZWQgaW4gdGhlIGlub2RlLgorICoKKyAqLworc3RhdGljIGludCBuZnNfaW5vZGVfYXR0cnNfbmVlZF91cGRhdGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJY29uc3Qgc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCXJldHVybiAoKGxvbmcpZmF0dHItPmdlbmNvdW50IC0gKGxvbmcpbmZzaS0+YXR0cl9nZW5jb3VudCkgPiAwIHx8CisJCW5mc19jdGltZV9uZWVkX3VwZGF0ZShpbm9kZSwgZmF0dHIpIHx8CisJCW5mc19zaXplX25lZWRfdXBkYXRlKGlub2RlLCBmYXR0cikgfHwKKwkJKChsb25nKW5mc2ktPmF0dHJfZ2VuY291bnQgLSAobG9uZyluZnNfcmVhZF9hdHRyX2dlbmVyYXRpb25fY291bnRlcigpID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JlZnJlc2hfaW5vZGVfbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWlmIChuZnNfaW5vZGVfYXR0cnNfbmVlZF91cGRhdGUoaW5vZGUsIGZhdHRyKSkKKwkJcmV0dXJuIG5mc191cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKKwlyZXR1cm4gbmZzX2NoZWNrX2lub2RlX2F0dHJpYnV0ZXMoaW5vZGUsIGZhdHRyKTsKK30KKwogLyoqCiAgKiBuZnNfcmVmcmVzaF9pbm9kZSAtIHRyeSB0byB1cGRhdGUgdGhlIGlub2RlIGF0dHJpYnV0ZSBjYWNoZQogICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQpAQCAtOTYwLDIxICs5ODAsMjggQEAKICAqLwogaW50IG5mc19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewotCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAJaW50IHN0YXR1czsKIAogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpID09IDApCiAJCXJldHVybiAwOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKHRpbWVfYWZ0ZXIoZmF0dHItPnRpbWVfc3RhcnQsIG5mc2ktPmxhc3RfdXBkYXRlZCkpCi0JCXN0YXR1cyA9IG5mc191cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKLQllbHNlCi0JCXN0YXR1cyA9IG5mc19jaGVja19pbm9kZV9hdHRyaWJ1dGVzKGlub2RlLCBmYXR0cik7Ci0KKwlzdGF0dXMgPSBuZnNfcmVmcmVzaF9pbm9kZV9sb2NrZWQoaW5vZGUsIGZhdHRyKTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBuZnNfcG9zdF9vcF91cGRhdGVfaW5vZGVfbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7CisJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG5mc19yZWZyZXNoX2lub2RlX2xvY2tlZChpbm9kZSwgZmF0dHIpOworfQorCiAvKioKICAqIG5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZSAtIHRyeSB0byB1cGRhdGUgdGhlIGlub2RlIGF0dHJpYnV0ZSBjYWNoZQogICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQpAQCAtOTkxLDE0ICsxMDE4LDEyIEBACiAgKi8KIGludCBuZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7Ci0Jc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQgc3RhdHVzOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7CisJc3RhdHVzID0gbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlX2xvY2tlZChpbm9kZSwgZmF0dHIpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlyZXR1cm4gbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsIGZhdHRyKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKQEAgLTEwMTQsNiArMTAzOSwxNSBAQAogICovCiBpbnQgbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlX2ZvcmNlX3djYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkvKiBEb24ndCBkbyBhIFdDQyB1cGRhdGUgaWYgdGhlc2UgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBzdGFsZSAqLworCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpID09IDAgfHwKKwkJCSFuZnNfaW5vZGVfYXR0cnNfbmVlZF91cGRhdGUoaW5vZGUsIGZhdHRyKSkgeworCQlmYXR0ci0+dmFsaWQgJj0gfihORlNfQVRUUl9XQ0NfVjR8TkZTX0FUVFJfV0NDKTsKKwkJZ290byBvdXRfbm9mb3JjZTsKKwl9CiAJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNCkgIT0gMCAmJgogCQkJKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX1dDQ19WNCkgPT0gMCkgewogCQlmYXR0ci0+cHJlX2NoYW5nZV9hdHRyID0gTkZTX0koaW5vZGUpLT5jaGFuZ2VfYXR0cjsKQEAgLTEwMjYsNyArMTA2MCwxMCBAQAogCQlmYXR0ci0+cHJlX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9XQ0M7CiAJfQotCXJldHVybiBuZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKK291dF9ub2ZvcmNlOgorCXN0YXR1cyA9IG5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZV9sb2NrZWQoaW5vZGUsIGZhdHRyKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTEwOTIsNyArMTEyOSw3IEBACiAJCX0KIAkJLyogSWYgY3RpbWUgaGFzIGNoYW5nZWQgd2Ugc2hvdWxkIGRlZmluaXRlbHkgY2xlYXIgYWNjZXNzK2FjbCBjYWNoZXMgKi8KIAkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZmYXR0ci0+Y3RpbWUpKQotCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQUNDRVNTfE5GU19JTk9fSU5WQUxJRF9BQ0w7CisJCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9BQ0NFU1N8TkZTX0lOT19JTlZBTElEX0FDTDsKIAl9IGVsc2UgaWYgKG5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikgewogCQlkcHJpbnRrKCJORlM6IGNoYW5nZV9hdHRyIGNoYW5nZSBvbiBzZXJ2ZXIgZm9yIGZpbGUgJXMvJWxkXG4iLAogCQkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwpAQCAtMTEyNiw2ICsxMTYzLDkgQEAKIAkgICAgaW5vZGUtPmlfZ2lkICE9IGZhdHRyLT5naWQpCiAJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOwogCisJaWYgKGlub2RlLT5pX25saW5rICE9IGZhdHRyLT5ubGluaykKKwkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKKwogCWlub2RlLT5pX21vZGUgPSBmYXR0ci0+bW9kZTsKIAlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5ubGluazsKIAlpbm9kZS0+aV91aWQgPSBmYXR0ci0+dWlkOwpAQCAtMTE0NSwxOCArMTE4NSwxMyBAQAogCQluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfQVRUUklOVkFMSURBVEUpOwogCQluZnNpLT5hdHRydGltZW8gPSBORlNfTUlOQVRUUlRJTUVPKGlub2RlKTsKIAkJbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCA9IG5vdzsKLQkJbmZzaS0+bGFzdF91cGRhdGVkID0gbm93OworCQluZnNpLT5hdHRyX2dlbmNvdW50ID0gbmZzX2luY19hdHRyX2dlbmVyYXRpb25fY291bnRlcigpOwogCX0gZWxzZSB7CiAJCWlmICghdGltZV9pbl9yYW5nZShub3csIG5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAsIG5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgKyBuZnNpLT5hdHRydGltZW8pKSB7CiAJCQlpZiAoKG5mc2ktPmF0dHJ0aW1lbyA8PD0gMSkgPiBORlNfTUFYQVRUUlRJTUVPKGlub2RlKSkKIAkJCQluZnNpLT5hdHRydGltZW8gPSBORlNfTUFYQVRUUlRJTUVPKGlub2RlKTsKIAkJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBub3c7CiAJCX0KLQkJLyoKLQkJICogQXZvaWQgamlmZnkgd3JhcGFyb3VuZCBpc3N1ZXMgd2l0aCBuZnNpLT5sYXN0X3VwZGF0ZWQKLQkJICovCi0JCWlmICghdGltZV9pbl9yYW5nZShuZnNpLT5sYXN0X3VwZGF0ZWQsIG5mc2ktPnJlYWRfY2FjaGVfamlmZmllcywgbm93KSkKLQkJCW5mc2ktPmxhc3RfdXBkYXRlZCA9IG5mc2ktPnJlYWRfY2FjaGVfamlmZmllczsKIAl9CiAJaW52YWxpZCAmPSB+TkZTX0lOT19JTlZBTElEX0FUVFI7CiAJLyogRG9uJ3QgaW52YWxpZGF0ZSB0aGUgZGF0YSBpZiB3ZSB3ZXJlIHRvIGJsYW1lICovCmRpZmYgLS1naXQgYS9mcy9uZnMvaW50ZXJuYWwuaCBiL2ZzL25mcy9pbnRlcm5hbC5oCmluZGV4IDI0MjQxZmMuLmQyMTJlZTQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL25mcy9pbnRlcm5hbC5oCkBAIC0xNTMsNiArMTUzLDcgQEAKIHZvaWQgbmZzX3phcF9hY2xfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKIC8qIHN1cGVyLmMgKi8KK3ZvaWQgbmZzX3BhcnNlX2lwX2FkZHJlc3MoY2hhciAqLCBzaXplX3QsIHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QgKik7CiBleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX3hkZXZfZnNfdHlwZTsKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiBleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzNF94ZGV2X2ZzX3R5cGU7CkBAIC0xNjMsOCArMTY0LDggQEAKIAogZXh0ZXJuIGludCBfX2luaXQgcmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZzX3NiX2FjdGl2ZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKTsKLWV4dGVybiB2b2lkIG5mc19zYl9kZWFjdGl2ZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKTsKK2V4dGVybiB2b2lkIG5mc19zYl9hY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBuZnNfc2JfZGVhY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIC8qIG5hbWVzcGFjZS5jICovCiBleHRlcm4gY2hhciAqbmZzX3BhdGgoY29uc3QgY2hhciAqYmFzZSwKQEAgLTI3NiwzICsyNzcsMjMgQEAKIAkJUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIH0KIAorI2RlZmluZSBJUFY2X1NDT1BFX0RFTElNSVRFUgknJScKKworLyoKKyAqIFNldCB0aGUgcG9ydCBudW1iZXIgaW4gYW4gYWRkcmVzcy4gIEJlIGFnbm9zdGljIGFib3V0IHRoZSBhZGRyZXNzCisgKiBmYW1pbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnNfc2V0X3BvcnQoc3RydWN0IHNvY2thZGRyICpzYXAsIHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luICphcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisJc3RydWN0IHNvY2thZGRyX2luNiAqYXA2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7CisKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlhcC0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJYXA2LT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL21vdW50X2NsbnQuYyBiL2ZzL25mcy9tb3VudF9jbG50LmMKaW5kZXggNzc5ZDJlYi4uMDg2YTY4MyAxMDA2NDQKLS0tIGEvZnMvbmZzL21vdW50X2NsbnQuYworKysgYi9mcy9uZnMvbW91bnRfY2xudC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaWZkZWYgUlBDX0RFQlVHCiAjIGRlZmluZSBORlNEQkdfRkFDSUxJVFkJTkZTREJHX01PVU5UCkBAIC05OCw3ICs5OSw3IEBACiAKIG91dF9tbnRfZXJyOgogCWRwcmludGsoIk5GUzogTU5UIHNlcnZlciByZXR1cm5lZCByZXN1bHQgJWRcbiIsIHJlc3VsdC5zdGF0dXMpOwotCXN0YXR1cyA9IC1FQUNDRVM7CisJc3RhdHVzID0gbmZzX3N0YXRfdG9fZXJybm8ocmVzdWx0LnN0YXR1cyk7CiAJZ290byBvdXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uYW1lc3BhY2UuYyBiL2ZzL25mcy9uYW1lc3BhY2UuYwppbmRleCA2NmRmMDhkLi42NGEyODhlIDEwMDY0NAotLS0gYS9mcy9uZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmZzL25hbWVzcGFjZS5jCkBAIC0xMDUsNyArMTA1LDEwIEBACiAKIAlkcHJpbnRrKCItLT4gbmZzX2ZvbGxvd19tb3VudHBvaW50KClcbiIpOwogCi0JQlVHX09OKElTX1JPT1QoZGVudHJ5KSk7CisJZXJyID0gLUVTVEFMRTsKKwlpZiAoSVNfUk9PVChkZW50cnkpKQorCQlnb3RvIG91dF9lcnI7CisKIAlkcHJpbnRrKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKIAlkcHV0KG5kLT5wYXRoLmRlbnRyeSk7CiAJbmQtPnBhdGguZGVudHJ5ID0gZGdldChkZW50cnkpOwpAQCAtMTg5LDcgKzE5Miw3IEBACiAJCQkJCSAgIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKm1vdW50ZGF0YSkKIHsKICNpZmRlZiBDT05GSUdfTkZTX1Y0Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gRVJSX1BUUigtRUlOVkFMKTsKIAlzd2l0Y2ggKHNlcnZlci0+bmZzX2NsaWVudC0+cnBjX29wcy0+dmVyc2lvbikgewogCQljYXNlIDI6CiAJCWNhc2UgMzoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzYWNsLmMgYi9mcy9uZnMvbmZzM2FjbC5jCmluZGV4IDQyMzg0MmYuLmNlZjYyNTUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzYWNsLmMKKysrIGIvZnMvbmZzL25mczNhY2wuYwpAQCAtMjI5LDYgKzIyOSw3IEBACiAKIAlkcHJpbnRrKCJORlMgY2FsbCBnZXRhY2xcbiIpOwogCW1zZy5ycGNfcHJvYyA9ICZzZXJ2ZXItPmNsaWVudF9hY2wtPmNsX3Byb2NpbmZvW0FDTFBST0MzX0dFVEFDTF07CisJbmZzX2ZhdHRyX2luaXQoJmZhdHRyKTsKIAlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50X2FjbCwgJm1zZywgMCk7CiAJZHByaW50aygiTkZTIHJlcGx5IGdldGFjbDogJWRcbiIsIHN0YXR1cyk7CiAKQEAgLTMyMiw2ICszMjMsNyBAQAogCiAJZHByaW50aygiTkZTIGNhbGwgc2V0YWNsXG4iKTsKIAltc2cucnBjX3Byb2MgPSAmc2VydmVyLT5jbGllbnRfYWNsLT5jbF9wcm9jaW5mb1tBQ0xQUk9DM19TRVRBQ0xdOworCW5mc19mYXR0cl9pbml0KCZmYXR0cik7CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudF9hY2wsICZtc2csIDApOwogCW5mc19hY2Nlc3NfemFwX2NhY2hlKGlub2RlKTsKIAluZnNfemFwX2FjbF9jYWNoZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3Byb2MuYyBiL2ZzL25mcy9uZnMzcHJvYy5jCmluZGV4IDFlNzUwZTQ1Li5jNTViZTdhIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3Byb2MuYworKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtNjk5LDcgKzY5OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mczNfcHJvY19mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKK2RvX3Byb2NfZnNpbmZvKHN0cnVjdCBycGNfY2xudCAqY2xpZW50LCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAogCQkgc3RydWN0IG5mc19mc2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKQEAgLTcxMSwxMSArNzExLDI3IEBACiAKIAlkcHJpbnRrKCJORlMgY2FsbCAgZnNpbmZvXG4iKTsKIAluZnNfZmF0dHJfaW5pdChpbmZvLT5mYXR0cik7Ci0Jc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbGllbnQsICZtc2csIDApOwogCWRwcmludGsoIk5GUyByZXBseSBmc2luZm86ICVkXG4iLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBCYXJlLWJvbmVzIGFjY2VzcyB0byBmc2luZm86IHRoaXMgaXMgZm9yIG5mc19nZXRfcm9vdC9uZnNfZ2V0X3NiIHZpYQorICogbmZzX2NyZWF0ZV9zZXJ2ZXIKKyAqLworc3RhdGljIGludAorbmZzM19wcm9jX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgICBzdHJ1Y3QgbmZzX2ZzaW5mbyAqaW5mbykKK3sKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gZG9fcHJvY19mc2luZm8oc2VydmVyLT5jbGllbnQsIGZoYW5kbGUsIGluZm8pOworCWlmIChzdGF0dXMgJiYgc2VydmVyLT5uZnNfY2xpZW50LT5jbF9ycGNjbGllbnQgIT0gc2VydmVyLT5jbGllbnQpCisJCXN0YXR1cyA9IGRvX3Byb2NfZnNpbmZvKHNlcnZlci0+bmZzX2NsaWVudC0+Y2xfcnBjY2xpZW50LCBmaGFuZGxlLCBpbmZvKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgaW50CiBuZnMzX3Byb2NfcGF0aGNvbmYoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKIAkJICAgc3RydWN0IG5mc19wYXRoY29uZiAqaW5mbykKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMgYi9mcy9uZnMvbmZzNG5hbWVzcGFjZS5jCmluZGV4IGIxMTI4NTcuLjMwYmVmYzMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKKysrIGIvZnMvbmZzL25mczRuYW1lc3BhY2UuYwpAQCAtOTMsMjEgKzkzLDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDaGVjayBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudHMgYSAidmFsaWQiIElQdjQgYWRkcmVzcwotICovCi1zdGF0aWMgaW5saW5lIGludCB2YWxpZF9pcGFkZHI0KGNvbnN0IGNoYXIgKmJ1ZikKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnRyeV9sb2NhdGlvbihzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICptb3VudGRhdGEsCisJCQkJICAgICBjaGFyICpwYWdlLCBjaGFyICpwYWdlMiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbikKIHsKLQlpbnQgcmMsIGNvdW50LCBpbls0XTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJY2hhciAqbW50X3BhdGg7CisJaW50IHBhZ2UybGVuOworCXVuc2lnbmVkIGludCBzOwogCi0JcmMgPSBzc2NhbmYoYnVmLCAiJWQuJWQuJWQuJWQiLCAmaW5bMF0sICZpblsxXSwgJmluWzJdLCAmaW5bM10pOwotCWlmIChyYyAhPSA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA0OyBjb3VudCsrKSB7Ci0JCWlmIChpbltjb3VudF0gPiAyNTUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwltbnRfcGF0aCA9IG5mczRfcGF0aG5hbWVfc3RyaW5nKCZsb2NhdGlvbi0+cm9vdHBhdGgsIHBhZ2UyLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIobW50X3BhdGgpKQorCQlyZXR1cm4gbW50OworCW1vdW50ZGF0YS0+bW50X3BhdGggPSBtbnRfcGF0aDsKKwlwYWdlMiArPSBzdHJsZW4obW50X3BhdGgpICsgMTsKKwlwYWdlMmxlbiA9IFBBR0VfU0laRSAtIHN0cmxlbihtbnRfcGF0aCkgLSAxOworCisJZm9yIChzID0gMDsgcyA8IGxvY2F0aW9uLT5uc2VydmVyczsgcysrKSB7CisJCWNvbnN0IHN0cnVjdCBuZnM0X3N0cmluZyAqYnVmID0gJmxvY2F0aW9uLT5zZXJ2ZXJzW3NdOworCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworCisJCWlmIChidWYtPmxlbiA8PSAwIHx8IGJ1Zi0+bGVuID49IFBBR0VfU0laRSkKKwkJCWNvbnRpbnVlOworCisJCW1vdW50ZGF0YS0+YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKKworCQlpZiAobWVtY2hyKGJ1Zi0+ZGF0YSwgSVBWNl9TQ09QRV9ERUxJTUlURVIsIGJ1Zi0+bGVuKSkKKwkJCWNvbnRpbnVlOworCQluZnNfcGFyc2VfaXBfYWRkcmVzcyhidWYtPmRhdGEsIGJ1Zi0+bGVuLAorCQkJCW1vdW50ZGF0YS0+YWRkciwgJm1vdW50ZGF0YS0+YWRkcmxlbik7CisJCWlmIChtb3VudGRhdGEtPmFkZHItPnNhX2ZhbWlseSA9PSBBRl9VTlNQRUMpCisJCQljb250aW51ZTsKKwkJbmZzX3NldF9wb3J0KG1vdW50ZGF0YS0+YWRkciwgTkZTX1BPUlQpOworCisJCXN0cm5jcHkocGFnZTIsIGJ1Zi0+ZGF0YSwgcGFnZTJsZW4pOworCQlwYWdlMltwYWdlMmxlbl0gPSAnXDAnOworCQltb3VudGRhdGEtPmhvc3RuYW1lID0gcGFnZTI7CisKKwkJc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXM6JXMiLAorCQkJCW1vdW50ZGF0YS0+aG9zdG5hbWUsCisJCQkJbW91bnRkYXRhLT5tbnRfcGF0aCk7CisKKwkJbW50ID0gdmZzX2tlcm5fbW91bnQoJm5mczRfcmVmZXJyYWxfZnNfdHlwZSwgMCwgcGFnZSwgbW91bnRkYXRhKTsKKwkJaWYgKCFJU19FUlIobW50KSkKKwkJCWJyZWFrOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbW50OwogfQogCiAvKioKQEAgLTEyOCw3ICsxNTksNiBAQAogCQkuYXV0aGZsYXZvciA9IE5GU19TQihtbnRfcGFyZW50LT5tbnRfc2IpLT5jbGllbnQtPmNsX2F1dGgtPmF1X2ZsYXZvciwKIAl9OwogCWNoYXIgKnBhZ2UgPSBOVUxMLCAqcGFnZTIgPSBOVUxMOwotCXVuc2lnbmVkIGludCBzOwogCWludCBsb2MsIGVycm9yOwogCiAJaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGxvY2F0aW9ucy0+bmxvY2F0aW9ucyA8PSAwKQpAQCAtMTUyLDUzICsxODIsMTYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbG9jID0gMDsKLQl3aGlsZSAobG9jIDwgbG9jYXRpb25zLT5ubG9jYXRpb25zICYmIElTX0VSUihtbnQpKSB7CisJZm9yIChsb2MgPSAwOyBsb2MgPCBsb2NhdGlvbnMtPm5sb2NhdGlvbnM7IGxvYysrKSB7CiAJCWNvbnN0IHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbiA9ICZsb2NhdGlvbnMtPmxvY2F0aW9uc1tsb2NdOwotCQljaGFyICptbnRfcGF0aDsKIAogCQlpZiAobG9jYXRpb24gPT0gTlVMTCB8fCBsb2NhdGlvbi0+bnNlcnZlcnMgPD0gMCB8fAotCQkgICAgbG9jYXRpb24tPnJvb3RwYXRoLm5jb21wb25lbnRzID09IDApIHsKLQkJCWxvYysrOworCQkgICAgbG9jYXRpb24tPnJvb3RwYXRoLm5jb21wb25lbnRzID09IDApCiAJCQljb250aW51ZTsKLQkJfQogCi0JCW1udF9wYXRoID0gbmZzNF9wYXRobmFtZV9zdHJpbmcoJmxvY2F0aW9uLT5yb290cGF0aCwgcGFnZTIsIFBBR0VfU0laRSk7Ci0JCWlmIChJU19FUlIobW50X3BhdGgpKSB7Ci0JCQlsb2MrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW1vdW50ZGF0YS5tbnRfcGF0aCA9IG1udF9wYXRoOwotCi0JCXMgPSAwOwotCQl3aGlsZSAocyA8IGxvY2F0aW9uLT5uc2VydmVycykgewotCQkJc3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7Ci0JCQkJLnNpbl9mYW1pbHkJPSBBRl9JTkVULAotCQkJCS5zaW5fcG9ydAk9IGh0b25zKE5GU19QT1JUKSwKLQkJCX07Ci0KLQkJCWlmIChsb2NhdGlvbi0+c2VydmVyc1tzXS5sZW4gPD0gMCB8fAotCQkJICAgIHZhbGlkX2lwYWRkcjQobG9jYXRpb24tPnNlcnZlcnNbc10uZGF0YSkgPCAwKSB7Ci0JCQkJcysrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQltb3VudGRhdGEuaG9zdG5hbWUgPSBsb2NhdGlvbi0+c2VydmVyc1tzXS5kYXRhOwotCQkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbl9hdG9uKG1vdW50ZGF0YS5ob3N0bmFtZSksCi0JCQltb3VudGRhdGEuYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKLQkJCW1vdW50ZGF0YS5hZGRybGVuID0gc2l6ZW9mKGFkZHIpOwotCi0JCQlzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlczolcyIsCi0JCQkJCW1vdW50ZGF0YS5ob3N0bmFtZSwKLQkJCQkJbW91bnRkYXRhLm1udF9wYXRoKTsKLQotCQkJbW50ID0gdmZzX2tlcm5fbW91bnQoJm5mczRfcmVmZXJyYWxfZnNfdHlwZSwgMCwgcGFnZSwgJm1vdW50ZGF0YSk7Ci0JCQlpZiAoIUlTX0VSUihtbnQpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzKys7Ci0JCX0KLQkJbG9jKys7CisJCW1udCA9IHRyeV9sb2NhdGlvbigmbW91bnRkYXRhLCBwYWdlLCBwYWdlMiwgbG9jYXRpb24pOworCQlpZiAoIUlTX0VSUihtbnQpKQorCQkJYnJlYWs7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzcm9vdC5jIGIvZnMvbmZzL25mc3Jvb3QuYwppbmRleCA0Njc2M2QxYy4uODQ3OGZjMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mc3Jvb3QuYworKysgYi9mcy9uZnMvbmZzcm9vdC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlPcHRfZXJyCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBfX2luaXRkYXRhIHRva2VucyA9IHsKK3N0YXRpYyBtYXRjaF90YWJsZV90IF9faW5pdGNvbnN0IHRva2VucyA9IHsKIAl7T3B0X3BvcnQsICJwb3J0PSV1In0sCiAJe09wdF9yc2l6ZSwgInJzaXplPSV1In0sCiAJe09wdF93c2l6ZSwgIndzaXplPSV1In0sCmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwppbmRleCA0ZGJiODRkLi4xOTM0NjUyIDEwMDY0NAotLS0gYS9mcy9uZnMvcHJvYy5jCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTY1LDE0ICs2NSwyMCBAQAogCiAJZHByaW50aygiJXM6IGNhbGwgZ2V0YXR0clxuIiwgX19mdW5jX18pOwogCW5mc19mYXR0cl9pbml0KGZhdHRyKTsKLQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+bmZzX2NsaWVudC0+Y2xfcnBjY2xpZW50LCAmbXNnLCAwKTsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwkvKiBSZXRyeSB3aXRoIGRlZmF1bHQgYXV0aGVudGljYXRpb24gaWYgZGlmZmVyZW50ICovCisJaWYgKHN0YXR1cyAmJiBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3JwY2NsaWVudCAhPSBzZXJ2ZXItPmNsaWVudCkKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CiAJZHByaW50aygiJXM6IHJlcGx5IGdldGF0dHI6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCWRwcmludGsoIiVzOiBjYWxsIHN0YXRmc1xuIiwgX19mdW5jX18pOwogCW1zZy5ycGNfcHJvYyA9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1NUQVRGU107CiAJbXNnLnJwY19yZXNwID0gJmZzaW5mbzsKLQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+bmZzX2NsaWVudC0+Y2xfcnBjY2xpZW50LCAmbXNnLCAwKTsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwkvKiBSZXRyeSB3aXRoIGRlZmF1bHQgYXV0aGVudGljYXRpb24gaWYgZGlmZmVyZW50ICovCisJaWYgKHN0YXR1cyAmJiBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3JwY2NsaWVudCAhPSBzZXJ2ZXItPmNsaWVudCkKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CiAJZHByaW50aygiJXM6IHJlcGx5IHN0YXRmczogJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCmluZGV4IDlhYmNkMmIuLjhiMjhiOTUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zdXBlci5jCisrKyBiL2ZzL25mcy9zdXBlci5jCkBAIC05MSw2ICs5MSw3IEBACiAJLyogTW91bnQgb3B0aW9ucyB0aGF0IHRha2Ugc3RyaW5nIGFyZ3VtZW50cyAqLwogCU9wdF9zZWMsIE9wdF9wcm90bywgT3B0X21vdW50cHJvdG8sIE9wdF9tb3VudGhvc3QsCiAJT3B0X2FkZHIsIE9wdF9tb3VudGFkZHIsIE9wdF9jbGllbnRhZGRyLAorCU9wdF9sb29rdXBjYWNoZSwKIAogCS8qIFNwZWNpYWwgbW91bnQgb3B0aW9ucyAqLwogCU9wdF91c2Vyc3BhY2UsIE9wdF9kZXByZWNhdGVkLCBPcHRfc2xvcHB5LApAQCAtOTgsNyArOTksNyBAQAogCU9wdF9lcnIKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IG5mc19tb3VudF9vcHRpb25fdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgbmZzX21vdW50X29wdGlvbl90b2tlbnMgPSB7CiAJeyBPcHRfdXNlcnNwYWNlLCAiYmciIH0sCiAJeyBPcHRfdXNlcnNwYWNlLCAiZmciIH0sCiAJeyBPcHRfdXNlcnNwYWNlLCAicmV0cnk9JXMiIH0sCkBAIC0xNTQsNiArMTU1LDggQEAKIAl7IE9wdF9tb3VudGhvc3QsICJtb3VudGhvc3Q9JXMiIH0sCiAJeyBPcHRfbW91bnRhZGRyLCAibW91bnRhZGRyPSVzIiB9LAogCisJeyBPcHRfbG9va3VwY2FjaGUsICJsb29rdXBjYWNoZT0lcyIgfSwKKwogCXsgT3B0X2VyciwgTlVMTCB9CiB9OwogCkBAIC0xNjMsNyArMTY2LDcgQEAKIAlPcHRfeHBydF9lcnIKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IG5mc194cHJ0X3Byb3RvY29sX3Rva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IG5mc194cHJ0X3Byb3RvY29sX3Rva2VucyA9IHsKIAl7IE9wdF94cHJ0X3VkcCwgInVkcCIgfSwKIAl7IE9wdF94cHJ0X3RjcCwgInRjcCIgfSwKIAl7IE9wdF94cHJ0X3JkbWEsICJyZG1hIiB9LApAQCAtMTgwLDcgKzE4Myw3IEBACiAJT3B0X3NlY19lcnIKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IG5mc19zZWNmbGF2b3JfdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgbmZzX3NlY2ZsYXZvcl90b2tlbnMgPSB7CiAJeyBPcHRfc2VjX25vbmUsICJub25lIiB9LAogCXsgT3B0X3NlY19ub25lLCAibnVsbCIgfSwKIAl7IE9wdF9zZWNfc3lzLCAic3lzIiB9LApAQCAtMjAwLDYgKzIwMywyMiBAQAogCXsgT3B0X3NlY19lcnIsIE5VTEwgfQogfTsKIAorZW51bSB7CisJT3B0X2xvb2t1cGNhY2hlX2FsbCwgT3B0X2xvb2t1cGNhY2hlX3Bvc2l0aXZlLAorCU9wdF9sb29rdXBjYWNoZV9ub25lLAorCisJT3B0X2xvb2t1cGNhY2hlX2VycgorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgbmZzX2xvb2t1cGNhY2hlX3Rva2VucyA9IHsKKwl7IE9wdF9sb29rdXBjYWNoZV9hbGwsICJhbGwiIH0sCisJeyBPcHRfbG9va3VwY2FjaGVfcG9zaXRpdmUsICJwb3MiIH0sCisJeyBPcHRfbG9va3VwY2FjaGVfcG9zaXRpdmUsICJwb3NpdGl2ZSIgfSwKKwl7IE9wdF9sb29rdXBjYWNoZV9ub25lLCAibm9uZSIgfSwKKworCXsgT3B0X2xvb2t1cGNhY2hlX2VyciwgTlVMTCB9Cit9OworCiAKIHN0YXRpYyB2b2lkIG5mc191bW91bnRfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCAgbmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwpAQCAtMjA5LDcgKzIyOCw2IEBACiBzdGF0aWMgaW50IG5mc194ZGV2X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIHN0YXRpYyB2b2lkIG5mc19raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLXN0YXRpYyB2b2lkIG5mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCBuZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpyYXdfZGF0YSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNfZnNfdHlwZSA9IHsKQEAgLTIzMiw3ICsyNTAsNiBAQAogCS5hbGxvY19pbm9kZQk9IG5mc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IG5mc19kZXN0cm95X2lub2RlLAogCS53cml0ZV9pbm9kZQk9IG5mc193cml0ZV9pbm9kZSwKLQkucHV0X3N1cGVyCT0gbmZzX3B1dF9zdXBlciwKIAkuc3RhdGZzCQk9IG5mc19zdGF0ZnMsCiAJLmNsZWFyX2lub2RlCT0gbmZzX2NsZWFyX2lub2RlLAogCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLApAQCAtMzM3LDI2ICszNTQsMjAgQEAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mc19mc190eXBlKTsKIH0KIAotdm9pZCBuZnNfc2JfYWN0aXZlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCi17Ci0JYXRvbWljX2luYygmc2VydmVyLT5hY3RpdmUpOwotfQotCi12b2lkIG5mc19zYl9kZWFjdGl2ZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXJ2ZXItPmFjdGl2ZSkpCi0JCXdha2VfdXAoJnNlcnZlci0+YWN0aXZlX3dxKTsKLX0KLQotc3RhdGljIHZvaWQgbmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQordm9pZCBuZnNfc2JfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7Ci0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIG9wcyB0byB0aGlzIHNlcnZlci4KLQkgKiBJZiBzbywgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2ggYmVmb3JlIGFsbG93aW5nIHRoZQotCSAqIHVubW91bnQgdG8gY29udGludWUuCi0JICovCi0Jd2FpdF9ldmVudChzZXJ2ZXItPmFjdGl2ZV93cSwgYXRvbWljX3JlYWQoJnNlcnZlci0+YWN0aXZlKSA9PSAwKTsKKworCWlmIChhdG9taWNfaW5jX3JldHVybigmc2VydmVyLT5hY3RpdmUpID09IDEpCisJCWF0b21pY19pbmMoJnNiLT5zX2FjdGl2ZSk7Cit9CisKK3ZvaWQgbmZzX3NiX2RlYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2VydmVyLT5hY3RpdmUpKQorCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKIH0KIAogLyoKQEAgLTY2NCwyNSArNjc1LDYgQEAKIH0KIAogLyoKLSAqIFNldCB0aGUgcG9ydCBudW1iZXIgaW4gYW4gYWRkcmVzcy4gIEJlIGFnbm9zdGljIGFib3V0IHRoZSBhZGRyZXNzIGZhbWlseS4KLSAqLwotc3RhdGljIHZvaWQgbmZzX3NldF9wb3J0KHN0cnVjdCBzb2NrYWRkciAqc2FwLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQotewotCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6IHsKLQkJc3RydWN0IHNvY2thZGRyX2luICphcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7Ci0JCWFwLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBRl9JTkVUNjogewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOwotCQlhcC0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCWJyZWFrOwotCX0KLQl9Ci19Ci0KLS8qCiAgKiBTYW5pdHktY2hlY2sgYSBzZXJ2ZXIgYWRkcmVzcyBwcm92aWRlZCBieSB0aGUgbW91bnQgY29tbWFuZC4KICAqCiAgKiBBZGRyZXNzIGZhbWlseSBtdXN0IGJlIGluaXRpYWxpemVkLCBhbmQgYWRkcmVzcyBtdXN0IG5vdCBiZQpAQCAtNzI0LDIwICs3MTYsMjIgQEAKIAkqYWRkcl9sZW4gPSAwOwogfQogCi0jZGVmaW5lIElQVjZfU0NPUEVfREVMSU1JVEVSCSclJwotCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCi1zdGF0aWMgdm9pZCBuZnNfcGFyc2VfaXB2Nl9zY29wZV9pZChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IHNpemVfdCBzdHJfbGVuLAotCQkJCSAgICBjb25zdCBjaGFyICpkZWxpbSwKLQkJCQkgICAgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNikKK3N0YXRpYyBpbnQgbmZzX3BhcnNlX2lwdjZfc2NvcGVfaWQoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBzaXplX3Qgc3RyX2xlbiwKKwkJCQkgICBjb25zdCBjaGFyICpkZWxpbSwKKwkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42KQogewogCWNoYXIgKnA7CiAJc2l6ZV90IGxlbjsKIAotCWlmICghKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpCi0JCXJldHVybiA7CisJaWYgKChzdHJpbmcgKyBzdHJfbGVuKSA9PSBkZWxpbSkKKwkJcmV0dXJuIDE7CisKIAlpZiAoKmRlbGltICE9IElQVjZfU0NPUEVfREVMSU1JVEVSKQotCQlyZXR1cm47CisJCXJldHVybiAwOworCisJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSkKKwkJcmV0dXJuIDA7CiAKIAlsZW4gPSAoc3RyaW5nICsgc3RyX2xlbikgLSBkZWxpbSAtIDE7CiAJcCA9IGtzdHJuZHVwKGRlbGltICsgMSwgbGVuLCBHRlBfS0VSTkVMKTsKQEAgLTc1MCwxNCArNzQ0LDIwIEBACiAJCQlzY29wZV9pZCA9IGRldi0+aWZpbmRleDsKIAkJCWRldl9wdXQoZGV2KTsKIAkJfSBlbHNlIHsKLQkJCS8qIHNjb3BlX2lkIGlzIHNldCB0byB6ZXJvIG9uIGVycm9yICovCi0JCQlzdHJpY3Rfc3RydG91bChwLCAxMCwgJnNjb3BlX2lkKTsKKwkJCWlmIChzdHJpY3Rfc3RydG91bChwLCAxMCwgJnNjb3BlX2lkKSA9PSAwKSB7CisJCQkJa2ZyZWUocCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAogCQlrZnJlZShwKTsKKwogCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7CiAJCWRmcHJpbnRrKE1PVU5ULCAiTkZTOiBJUHY2IHNjb3BlIElEID0gJWx1XG4iLCBzY29wZV9pZCk7CisJCXJldHVybiAxOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBuZnNfcGFyc2VfaXB2Nl9hZGRyZXNzKGNoYXIgKnN0cmluZywgc2l6ZV90IHN0cl9sZW4sCkBAIC03NzMsOSArNzczLDExIEBACiAKIAkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJKmFkZHJfbGVuID0gc2l6ZW9mKCpzaW42KTsKLQkJaWYgKGluNl9wdG9uKHN0cmluZywgc3RyX2xlbiwgYWRkciwgSVBWNl9TQ09QRV9ERUxJTUlURVIsICZkZWxpbSkpIHsKLQkJCW5mc19wYXJzZV9pcHY2X3Njb3BlX2lkKHN0cmluZywgc3RyX2xlbiwgZGVsaW0sIHNpbjYpOwotCQkJcmV0dXJuOworCQlpZiAoaW42X3B0b24oc3RyaW5nLCBzdHJfbGVuLCBhZGRyLAorCQkJCQlJUFY2X1NDT1BFX0RFTElNSVRFUiwgJmRlbGltKSAhPSAwKSB7CisJCQlpZiAobmZzX3BhcnNlX2lwdjZfc2NvcGVfaWQoc3RyaW5nLCBzdHJfbGVuLAorCQkJCQkJCWRlbGltLCBzaW42KSAhPSAwKQorCQkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtNzk4LDcgKzgwMCw3IEBACiAgKiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gY29uc3RydWN0aW5nIHRoZSBuZXcgc29ja2FkZHIsIHNldCB0aGUgYWRkcmVzcwogICogZmFtaWx5IHRvIEFGX1VOU1BFQy4KICAqLwotc3RhdGljIHZvaWQgbmZzX3BhcnNlX2lwX2FkZHJlc3MoY2hhciAqc3RyaW5nLCBzaXplX3Qgc3RyX2xlbiwKK3ZvaWQgbmZzX3BhcnNlX2lwX2FkZHJlc3MoY2hhciAqc3RyaW5nLCBzaXplX3Qgc3RyX2xlbiwKIAkJCQkgc3RydWN0IHNvY2thZGRyICpzYXAsIHNpemVfdCAqYWRkcl9sZW4pCiB7CiAJdW5zaWduZWQgaW50IGksIGNvbG9uczsKQEAgLTEyNTgsNiArMTI2MCwzMCBAQAogCQkJCQkgICAgICZtbnQtPm1vdW50X3NlcnZlci5hZGRybGVuKTsKIAkJCWtmcmVlKHN0cmluZyk7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfbG9va3VwY2FjaGU6CisJCQlzdHJpbmcgPSBtYXRjaF9zdHJkdXAoYXJncyk7CisJCQlpZiAoc3RyaW5nID09IE5VTEwpCisJCQkJZ290byBvdXRfbm9tZW07CisJCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHN0cmluZywKKwkJCQkJbmZzX2xvb2t1cGNhY2hlX3Rva2VucywgYXJncyk7CisJCQlrZnJlZShzdHJpbmcpOworCQkJc3dpdGNoICh0b2tlbikgeworCQkJCWNhc2UgT3B0X2xvb2t1cGNhY2hlX2FsbDoKKwkJCQkJbW50LT5mbGFncyAmPSB+KE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORUd8TkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBPcHRfbG9va3VwY2FjaGVfcG9zaXRpdmU6CisJCQkJCW1udC0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORTsKKwkJCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkVHOworCQkJCQlicmVhazsKKwkJCQljYXNlIE9wdF9sb29rdXBjYWNoZV9ub25lOgorCQkJCQltbnQtPmZsYWdzIHw9IE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORUd8TkZTX01PVU5UX0xPT0tVUF9DQUNIRV9OT05FOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQllcnJvcnMrKzsKKwkJCQkJZGZwcmludGsoTU9VTlQsICJORlM6ICAgaW52YWxpZCAiCisJCQkJCQkJImxvb2t1cGNhY2hlIGFyZ3VtZW50XG4iKTsKKwkJCX07CisJCQlicmVhazsKIAogCQkvKgogCQkgKiBTcGVjaWFsIG9wdGlvbnMKQEAgLTEyNzksNiArMTMwNSwxMiBAQAogCQl9CiAJfQogCisJaWYgKGVycm9ycyA+IDApIHsKKwkJZGZwcmludGsoTU9VTlQsICJORlM6IHBhcnNpbmcgZW5jb3VudGVyZWQgJWQgZXJyb3Ilc1xuIiwKKwkJCQllcnJvcnMsIChlcnJvcnMgPT0gMSA/ICIiIDogInMiKSk7CisJCWlmICghc2xvcHB5KQorCQkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogCiBvdXRfbm9tZW06CkBAIC0xNTUyLDcgKzE1ODQsNyBAQAogCQkgKiBUcmFuc2xhdGUgdG8gbmZzX3BhcnNlZF9tb3VudF9kYXRhLCB3aGljaCBuZnNfZmlsbF9zdXBlcgogCQkgKiBjYW4gZGVhbCB3aXRoLgogCQkgKi8KLQkJYXJncy0+ZmxhZ3MJCT0gZGF0YS0+ZmxhZ3M7CisJCWFyZ3MtPmZsYWdzCQk9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOwogCQlhcmdzLT5yc2l6ZQkJPSBkYXRhLT5yc2l6ZTsKIAkJYXJncy0+d3NpemUJCT0gZGF0YS0+d3NpemU7CiAJCWFyZ3MtPnRpbWVvCQk9IGRhdGEtPnRpbWVvOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL3VubGluay5jIGIvZnMvbmZzL3VubGluay5jCmluZGV4IGYwODllNTguLmVjYzI5NTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy91bmxpbmsuYworKysgYi9mcy9uZnMvdW5saW5rLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAogCW5mc19kZWNfc2lsbHljb3VudChkYXRhLT5kaXIpOwogCW5mc19mcmVlX3VubGlua2RhdGEoZGF0YSk7Ci0JbmZzX3NiX2RlYWN0aXZlKE5GU19TQihzYikpOworCW5mc19zYl9kZWFjdGl2ZShzYik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5mc191bmxpbmtfb3BzID0gewpAQCAtMTE4LDYgKzExOCw3IEBACiAJCS5ycGNfbWVzc2FnZSA9ICZtc2csCiAJCS5jYWxsYmFja19vcHMgPSAmbmZzX3VubGlua19vcHMsCiAJCS5jYWxsYmFja19kYXRhID0gZGF0YSwKKwkJLndvcmtxdWV1ZSA9IG5mc2lvZF93b3JrcXVldWUsCiAJCS5mbGFncyA9IFJQQ19UQVNLX0FTWU5DLAogCX07CiAJc3RydWN0IHJwY190YXNrICp0YXNrOwpAQCAtMTQ5LDcgKzE1MCw3IEBACiAJCW5mc19kZWNfc2lsbHljb3VudChkaXIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JbmZzX3NiX2FjdGl2ZShORlNfU0VSVkVSKGRpcikpOworCW5mc19zYl9hY3RpdmUoZGlyLT5pX3NiKTsKIAlkYXRhLT5hcmdzLmZoID0gTkZTX0ZIKGRpcik7CiAJbmZzX2ZhdHRyX2luaXQoJmRhdGEtPnJlcy5kaXJfYXR0cik7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggMzIyOWUyMS4uOWY5ODQ1OCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTE0MjcsOCArMTQyNyw5IEBACiAJCS5iZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvLAogCQkuc3luY19tb2RlID0gV0JfU1lOQ19OT05FLAogCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKKwkJLnJhbmdlX3N0YXJ0ID0gMCwKKwkJLnJhbmdlX2VuZCA9IExMT05HX01BWCwKIAkJLmZvcl93cml0ZXBhZ2VzID0gMSwKLQkJLnJhbmdlX2N5Y2xpYyA9IDEsCiAJfTsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9mcy9uZnNkL2xvY2tkLmMgYi9mcy9uZnNkL2xvY2tkLmMKaW5kZXggMTVjNmZhZS4uYjI3ODZhNSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9sb2NrZC5jCisrKyBiL2ZzL25mc2QvbG9ja2QuYwpAQCAtNzAsNyArNzAsNiBAQAogc3RhdGljIHN0cnVjdCBubG1zdmNfYmluZGluZwluZnNkX25sbV9vcHMgPSB7CiAJLmZvcGVuCQk9IG5sbV9mb3BlbiwJCS8qIG9wZW4gZmlsZSBmb3IgbG9ja2luZyAqLwogCS5mY2xvc2UJCT0gbmxtX2ZjbG9zZSwJCS8qIGNsb3NlIGZpbGUgKi8KLQkuZ2V0X2dyYWNlX3BlcmlvZCA9IGdldF9uZnM0X2dyYWNlX3BlcmlvZCwKIH07CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzM3Byb2MuYyBiL2ZzL25mc2QvbmZzM3Byb2MuYwppbmRleCA0ZDYxN2VhLi45ZGJkMmViIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnMzcHJvYy5jCkBAIC02Myw3ICs2Myw4IEBACiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAogCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwotCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLCBORlNEX01BWV9OT1ApOworCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLAorCQkJTkZTRF9NQVlfTk9QIHwgTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UKTsKIAlpZiAobmZzZXJyKQogCQlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CiAKQEAgLTUzMCw3ICs1MzEsNyBAQAogCWRwcmludGsoIm5mc2Q6IEZTU1RBVCgzKSAgICVzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAotCW5mc2VyciA9IG5mc2Rfc3RhdGZzKHJxc3RwLCAmYXJncC0+ZmgsICZyZXNwLT5zdGF0cyk7CisJbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzLCAwKTsKIAlmaF9wdXQoJmFyZ3AtPmZoKTsKIAlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CiB9CkBAIC01NTgsNyArNTU5LDggQEAKIAlyZXNwLT5mX21heGZpbGVzaXplID0gfih1MzIpIDA7CiAJcmVzcC0+Zl9wcm9wZXJ0aWVzID0gTkZTM19GU0ZfREVGQVVMVDsKIAotCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJmFyZ3AtPmZoLCAwLCBORlNEX01BWV9OT1ApOworCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJmFyZ3AtPmZoLCAwLAorCQkJTkZTRF9NQVlfTk9QIHwgTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UKTsKIAogCS8qIENoZWNrIHNwZWNpYWwgZmVhdHVyZXMgb2YgdGhlIGZpbGUgc3lzdGVtLiBNYXkgcmVxdWVzdAogCSAqIGRpZmZlcmVudCByZWFkL3dyaXRlIHNpemVzIGZvciBmaWxlIHN5c3RlbXMga25vd24gdG8gaGF2ZQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggNzAyZmE1Ny4uMDk0NzQ3YSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC0yMjUsNyArMjI1LDggQEAKIAogCVJFU0VSVkVfU1BBQ0UoMTIrc2l6ZW9mKGNiX3JlYy0+Y2JyX3N0YXRlaWQpICsgbGVuKTsKIAlXUklURTMyKE9QX0NCX1JFQ0FMTCk7Ci0JV1JJVEVNRU0oJmNiX3JlYy0+Y2JyX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlXUklURTMyKGNiX3JlYy0+Y2JyX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJV1JJVEVNRU0oJmNiX3JlYy0+Y2JyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOwogCVdSSVRFMzIoY2JfcmVjLT5jYnJfdHJ1bmMpOwogCVdSSVRFMzIobGVuKTsKIAlXUklURU1FTShjYl9yZWMtPmNicl9maHZhbCwgbGVuKTsKQEAgLTM3OSw2ICszODAsNyBAQAogCQkuYWRkcnNpemUJPSBzaXplb2YoYWRkciksCiAJCS50aW1lb3V0CT0gJnRpbWVwYXJtcywKIAkJLnByb2dyYW0JPSAmY2JfcHJvZ3JhbSwKKwkJLnByb2dudW1iZXIJPSBjYi0+Y2JfcHJvZywKIAkJLnZlcnNpb24JPSBuZnNfY2JfdmVyc2lvblsxXS0+bnVtYmVyLAogCQkuYXV0aGZsYXZvcgk9IFJQQ19BVVRIX1VOSVgsIC8qIFhYWDogbmVlZCBBVVRIX0dTUy4uLiAqLwogCQkuZmxhZ3MJCT0gKFJQQ19DTE5UX0NSRUFURV9OT1BJTkcgfCBSUENfQ0xOVF9DUkVBVEVfUVVJRVQpLApAQCAtMzk2LDkgKzM5OCw2IEBACiAJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNiLT5jYl9wb3J0KTsKIAlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGNiLT5jYl9hZGRyKTsKIAotCS8qIEluaXRpYWxpemUgcnBjX3N0YXQgKi8KLQltZW1zZXQoYXJncy5wcm9ncmFtLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBycGNfc3RhdCkpOwotCiAJLyogQ3JlYXRlIFJQQyBjbGllbnQgKi8KIAljbGllbnQgPSBycGNfY3JlYXRlKCZhcmdzKTsKIAlpZiAoSVNfRVJSKGNsaWVudCkpIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwppbmRleCBlNWI1MWZmLi42Njk0NjFlIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC0yMDEsMTAgKzIwMSwxMCBAQAogCS8qIE9wZW5vd25lciBpcyBub3cgc2V0LCBzbyBzZXF1ZW5jZSBpZCB3aWxsIGdldCBidW1wZWQuICBOb3cgd2UgbmVlZAogCSAqIHRoZXNlIGNoZWNrcyBiZWZvcmUgd2UgZG8gYW55IGNyZWF0ZXM6ICovCiAJc3RhdHVzID0gbmZzZXJyX2dyYWNlOwotCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJaWYgKGxvY2tzX2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IG5mc2Vycl9ub19ncmFjZTsKLQlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwlpZiAoIWxvY2tzX2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCiAJCWdvdG8gb3V0OwogCiAJc3dpdGNoIChvcGVuLT5vcF9jbGFpbV90eXBlKSB7CkBAIC01NzUsNyArNTc1LDcgQEAKIHsKIAlfX2JlMzIgc3RhdHVzOwogCi0JaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkKIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKIAlzdGF0dXMgPSBuZnNkX3VubGluayhycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgMCwKIAkJCSAgICAgcmVtb3ZlLT5ybV9uYW1lLCByZW1vdmUtPnJtX25hbWVsZW4pOwpAQCAtNTk2LDcgKzU5Niw3IEBACiAKIAlpZiAoIWNzdGF0ZS0+c2F2ZV9maC5maF9kZW50cnkpCiAJCXJldHVybiBzdGF0dXM7Ci0JaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhKGNzdGF0ZS0+c2F2ZV9maC5maF9leHBvcnQtPmV4X2ZsYWdzCisJaWYgKGxvY2tzX2luX2dyYWNlKCkgJiYgIShjc3RhdGUtPnNhdmVfZmguZmhfZXhwb3J0LT5leF9mbGFncwogCQkJCQkmIE5GU0VYUF9OT1NVQlRSRUVDSEVDSykpCiAJCXJldHVybiBuZnNlcnJfZ3JhY2U7CiAJc3RhdHVzID0gbmZzZF9yZW5hbWUocnFzdHAsICZjc3RhdGUtPnNhdmVfZmgsIHJlbmFtZS0+cm5fc25hbWUsCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCAxNTc4ZDdhLi4wY2M3ZmY1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTYxLDcgKzYxLDYgQEAKIHN0YXRpYyB0aW1lX3QgbGVhc2VfdGltZSA9IDkwOyAgICAgLyogZGVmYXVsdCBsZWFzZSB0aW1lICovCiBzdGF0aWMgdGltZV90IHVzZXJfbGVhc2VfdGltZSA9IDkwOwogc3RhdGljIHRpbWVfdCBib290X3RpbWU7Ci1zdGF0aWMgaW50IGluX2dyYWNlID0gMTsKIHN0YXRpYyB1MzIgY3VycmVudF9vd25lcmlkID0gMTsKIHN0YXRpYyB1MzIgY3VycmVudF9maWxlaWQgPSAxOwogc3RhdGljIHUzMiBjdXJyZW50X2RlbGVnaWQgPSAxOwpAQCAtMTY0MCw3ICsxNjM5LDcgQEAKIAkJY2FzZSBORlM0X09QRU5fQ0xBSU1fTlVMTDoKIAkJCS8qIExldCdzIG5vdCBnaXZlIG91dCBhbnkgZGVsZWdhdGlvbnMgdGlsbCBldmVyeW9uZSdzCiAJCQkgKiBoYWQgdGhlIGNoYW5jZSB0byByZWNsYWltIHRoZWlycy4uLi4gKi8KLQkJCWlmIChuZnM0X2luX2dyYWNlKCkpCisJCQlpZiAobG9ja3NfaW5fZ3JhY2UoKSkKIAkJCQlnb3RvIG91dDsKIAkJCWlmICghYXRvbWljX3JlYWQoJmNiLT5jYl9zZXQpIHx8ICFzb3AtPnNvX2NvbmZpcm1lZCkKIAkJCQlnb3RvIG91dDsKQEAgLTE4MTYsMTIgKzE4MTUsMTUgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdHJ1Y3QgbG9ja19tYW5hZ2VyIG5mc2Q0X21hbmFnZXIgPSB7Cit9OworCiBzdGF0aWMgdm9pZAotZW5kX2dyYWNlKHZvaWQpCituZnNkNF9lbmRfZ3JhY2Uodm9pZCkKIHsKIAlkcHJpbnRrKCJORlNEOiBlbmQgb2YgZ3JhY2UgcGVyaW9kXG4iKTsKIAluZnNkNF9yZWNkaXJfcHVyZ2Vfb2xkKCk7Ci0JaW5fZ3JhY2UgPSAwOworCWxvY2tzX2VuZF9ncmFjZSgmbmZzZDRfbWFuYWdlcik7CiB9CiAKIHN0YXRpYyB0aW1lX3QKQEAgLTE4MzgsOCArMTg0MCw4IEBACiAJbmZzNF9sb2NrX3N0YXRlKCk7CiAKIAlkcHJpbnRrKCJORlNEOiBsYXVuZHJvbWF0IHNlcnZpY2UgLSBzdGFydGluZ1xuIik7Ci0JaWYgKGluX2dyYWNlKQotCQllbmRfZ3JhY2UoKTsKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkKKwkJbmZzZDRfZW5kX2dyYWNlKCk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmNsaWVudF9scnUpIHsKIAkJY2xwID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X2NsaWVudCwgY2xfbHJ1KTsKIAkJaWYgKHRpbWVfYWZ0ZXIoKHVuc2lnbmVkIGxvbmcpY2xwLT5jbF90aW1lLCAodW5zaWduZWQgbG9uZyljdXRvZmYpKSB7CkBAIC0xOTc0LDcgKzE5NzYsNyBAQAogCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCWVsc2UgaWYgKE9ORV9TVEFURUlEKHN0YXRlaWQpICYmIChmbGFncyAmIFJEX1NUQVRFKSkKIAkJcmV0dXJuIG5mc19vazsKLQllbHNlIGlmIChuZnM0X2luX2dyYWNlKCkpIHsKKwllbHNlIGlmIChsb2Nrc19pbl9ncmFjZSgpKSB7CiAJCS8qIEFuc3dlciBpbiByZW1haW5pbmcgY2FzZXMgZGVwZW5kcyBvbiBleGlzdGFuY2Ugb2YKIAkJICogY29uZmxpY3Rpbmcgc3RhdGU7IHNvIHdlIG11c3Qgd2FpdCBvdXQgdGhlIGdyYWNlIHBlcmlvZC4gKi8KIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKQEAgLTE5OTMsNyArMTk5NSw3IEBACiBzdGF0aWMgaW5saW5lIGludAogaW9fZHVyaW5nX2dyYWNlX2Rpc2FsbG93ZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQogewotCXJldHVybiBuZnM0X2luX2dyYWNlKCkgJiYgKGZsYWdzICYgKFJEX1NUQVRFIHwgV1JfU1RBVEUpKQorCXJldHVybiBsb2Nrc19pbl9ncmFjZSgpICYmIChmbGFncyAmIChSRF9TVEFURSB8IFdSX1NUQVRFKSkKIAkJJiYgbWFuZGF0b3J5X2xvY2soaW5vZGUpOwogfQogCkBAIC0yNjkzLDEwICsyNjk1LDEwIEBACiAJZmlscCA9IGxvY2tfc3RwLT5zdF92ZnNfZmlsZTsKIAogCXN0YXR1cyA9IG5mc2Vycl9ncmFjZTsKLQlpZiAobmZzNF9pbl9ncmFjZSgpICYmICFsb2NrLT5sa19yZWNsYWltKQorCWlmIChsb2Nrc19pbl9ncmFjZSgpICYmICFsb2NrLT5sa19yZWNsYWltKQogCQlnb3RvIG91dDsKIAlzdGF0dXMgPSBuZnNlcnJfbm9fZ3JhY2U7Ci0JaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgbG9jay0+bGtfcmVjbGFpbSkKKwlpZiAoIWxvY2tzX2luX2dyYWNlKCkgJiYgbG9jay0+bGtfcmVjbGFpbSkKIAkJZ290byBvdXQ7CiAKIAlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CkBAIC0yNzc5LDcgKzI3ODEsNyBAQAogCWludCBlcnJvcjsKIAlfX2JlMzIgc3RhdHVzOwogCi0JaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwlpZiAobG9ja3NfaW5fZ3JhY2UoKSkKIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKIAogCWlmIChjaGVja19sb2NrX2xlbmd0aChsb2NrdC0+bHRfb2Zmc2V0LCBsb2NrdC0+bHRfbGVuZ3RoKSkKQEAgLTMxOTIsOSArMzE5NCw5IEBACiAJdW5zaWduZWQgbG9uZyBncmFjZV90aW1lOwogCiAJYm9vdF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlncmFjZV90aW1lID0gZ2V0X25mc19ncmFjZV9wZXJpb2QoKTsKKwlncmFjZV90aW1lID0gZ2V0X25mczRfZ3JhY2VfcGVyaW9kKCk7CiAJbGVhc2VfdGltZSA9IHVzZXJfbGVhc2VfdGltZTsKLQlpbl9ncmFjZSA9IDE7CisJbG9ja3Nfc3RhcnRfZ3JhY2UoJm5mc2Q0X21hbmFnZXIpOwogCXByaW50ayhLRVJOX0lORk8gIk5GU0Q6IHN0YXJ0aW5nICVsZC1zZWNvbmQgZ3JhY2UgcGVyaW9kXG4iLAogCSAgICAgICBncmFjZV90aW1lL0haKTsKIAlsYXVuZHJ5X3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm5mc2Q0Iik7CkBAIC0zMjEzLDEyICszMjE1LDYgQEAKIAlyZXR1cm47CiB9CiAKLWludAotbmZzNF9pbl9ncmFjZSh2b2lkKQotewotCXJldHVybiBpbl9ncmFjZTsKLX0KLQogdGltZV90CiBuZnM0X2xlYXNlX3RpbWUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggMTRiYTRkOS4uYWZjZGY0YiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTQxMyw2ICs0MTMsMTggQEAKIH0KIAogc3RhdGljIF9fYmUzMgorbmZzZDRfZGVjb2RlX3N0YXRlaWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RhdGVpZF90ICpzaWQpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSk7CisJUkVBRDMyKHNpZC0+c2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmc2lkLT5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2FjY2VzcyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfYWNjZXNzICphY2Nlc3MpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC00MjksMTAgKzQ0MSw5IEBACiAJREVDT0RFX0hFQUQ7CiAKIAljbG9zZS0+Y2xfc3RhdGVvd25lciA9IE5VTEw7Ci0JUkVBRF9CVUYoNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEX0JVRig0KTsKIAlSRUFEMzIoY2xvc2UtPmNsX3NlcWlkKTsKLQlSRUFEMzIoY2xvc2UtPmNsX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmY2xvc2UtPmNsX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXJldHVybiBuZnNkNF9kZWNvZGVfc3RhdGVpZChhcmdwLCAmY2xvc2UtPmNsX3N0YXRlaWQpOwogCiAJREVDT0RFX1RBSUw7CiB9CkBAIC00OTMsMTMgKzUwNCw3IEBACiBzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfZGVjb2RlX2RlbGVncmV0dXJuKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9kZWxlZ3JldHVybiAqZHIpCiB7Ci0JREVDT0RFX0hFQUQ7Ci0KLQlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSk7Ci0JUkVBRDMyKGRyLT5kcl9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCUNPUFlNRU0oJmRyLT5kcl9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQotCURFQ09ERV9UQUlMOworCXJldHVybiBuZnNkNF9kZWNvZGVfc3RhdGVpZChhcmdwLCAmZHItPmRyX3N0YXRlaWQpOwogfQogCiBzdGF0aWMgaW5saW5lIF9fYmUzMgpAQCAtNTQyLDIwICs1NDcsMjIgQEAKIAlSRUFEMzIobG9jay0+bGtfaXNfbmV3KTsKIAogCWlmIChsb2NrLT5sa19pc19uZXcpIHsKLQkJUkVBRF9CVUYoMzYpOworCQlSRUFEX0JVRig0KTsKIAkJUkVBRDMyKGxvY2stPmxrX25ld19vcGVuX3NlcWlkKTsKLQkJUkVBRDMyKGxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0KLQkJQ09QWU1FTSgmbG9jay0+bGtfbmV3X29wZW5fc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZsb2NrLT5sa19uZXdfb3Blbl9zdGF0ZWlkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJCVJFQURfQlVGKDggKyBzaXplb2YoY2xpZW50aWRfdCkpOwogCQlSRUFEMzIobG9jay0+bGtfbmV3X2xvY2tfc2VxaWQpOwogCQlDT1BZTUVNKCZsb2NrLT5sa19uZXdfY2xpZW50aWQsIHNpemVvZihjbGllbnRpZF90KSk7CiAJCVJFQUQzMihsb2NrLT5sa19uZXdfb3duZXIubGVuKTsKIAkJUkVBRF9CVUYobG9jay0+bGtfbmV3X293bmVyLmxlbik7CiAJCVJFQURNRU0obG9jay0+bGtfbmV3X293bmVyLmRhdGEsIGxvY2stPmxrX25ld19vd25lci5sZW4pOwogCX0gZWxzZSB7Ci0JCVJFQURfQlVGKDIwKTsKLQkJUkVBRDMyKGxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JCUNPUFlNRU0oJmxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlzdGF0dXMgPSBuZnNkNF9kZWNvZGVfc3RhdGVpZChhcmdwLCAmbG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZCk7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCQlSRUFEX0JVRig0KTsKIAkJUkVBRDMyKGxvY2stPmxrX29sZF9sb2NrX3NlcWlkKTsKIAl9CiAKQEAgLTU4NywxMyArNTk0LDE1IEBACiAJREVDT0RFX0hFQUQ7CiAKIAlsb2NrdS0+bHVfc3RhdGVvd25lciA9IE5VTEw7Ci0JUkVBRF9CVUYoMjQgKyBzaXplb2Yoc3RhdGVpZF90KSk7CisJUkVBRF9CVUYoOCk7CiAJUkVBRDMyKGxvY2t1LT5sdV90eXBlKTsKIAlpZiAoKGxvY2t1LT5sdV90eXBlIDwgTkZTNF9SRUFEX0xUKSB8fCAobG9ja3UtPmx1X3R5cGUgPiBORlM0X1dSSVRFV19MVCkpCiAJCWdvdG8geGRyX2Vycm9yOwogCVJFQUQzMihsb2NrdS0+bHVfc2VxaWQpOwotCVJFQUQzMihsb2NrdS0+bHVfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQlDT1BZTUVNKCZsb2NrdS0+bHVfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJmxvY2t1LT5sdV9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDE2KTsKIAlSRUFENjQobG9ja3UtPmx1X29mZnNldCk7CiAJUkVBRDY0KGxvY2t1LT5sdV9sZW5ndGgpOwogCkBAIC02NzgsOCArNjg3LDEwIEBACiAJCVJFQUQzMihvcGVuLT5vcF9kZWxlZ2F0ZV90eXBlKTsKIAkJYnJlYWs7CiAJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgotCQlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSArIDQpOwotCQlDT1BZTUVNKCZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJCVJFQURfQlVGKDQpOwogCQlSRUFEMzIob3Blbi0+b3BfZm5hbWUubGVuKTsKIAkJUkVBRF9CVUYob3Blbi0+b3BfZm5hbWUubGVuKTsKIAkJU0FWRU1FTShvcGVuLT5vcF9mbmFtZS5kYXRhLCBvcGVuLT5vcF9mbmFtZS5sZW4pOwpAQCAtNjk5LDkgKzcxMCwxMCBAQAogCURFQ09ERV9IRUFEOwogCQkgICAgCiAJb3Blbl9jb25mLT5vY19zdGF0ZW93bmVyID0gTlVMTDsKLQlSRUFEX0JVRig0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCVJFQUQzMihvcGVuX2NvbmYtPm9jX3JlcV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCUNPUFlNRU0oJm9wZW5fY29uZi0+b2NfcmVxX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZvcGVuX2NvbmYtPm9jX3JlcV9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDQpOwogCVJFQUQzMihvcGVuX2NvbmYtPm9jX3NlcWlkKTsKIAkJCQkJCSAgICAgICAgCiAJREVDT0RFX1RBSUw7CkBAIC03MTMsOSArNzI1LDEwIEBACiAJREVDT0RFX0hFQUQ7CiAJCSAgICAKIAlvcGVuX2Rvd24tPm9kX3N0YXRlb3duZXIgPSBOVUxMOwotCVJFQURfQlVGKDEyICsgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCVJFQUQzMihvcGVuX2Rvd24tPm9kX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmb3Blbl9kb3duLT5vZF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlzdGF0dXMgPSBuZnNkNF9kZWNvZGVfc3RhdGVpZChhcmdwLCAmb3Blbl9kb3duLT5vZF9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDEyKTsKIAlSRUFEMzIob3Blbl9kb3duLT5vZF9zZXFpZCk7CiAJUkVBRDMyKG9wZW5fZG93bi0+b2Rfc2hhcmVfYWNjZXNzKTsKIAlSRUFEMzIob3Blbl9kb3duLT5vZF9zaGFyZV9kZW55KTsKQEAgLTc0Myw5ICs3NTYsMTAgQEAKIHsKIAlERUNPREVfSEVBRDsKIAotCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpICsgMTIpOwotCVJFQUQzMihyZWFkLT5yZF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCUNPUFlNRU0oJnJlYWQtPnJkX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZyZWFkLT5yZF9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDEyKTsKIAlSRUFENjQocmVhZC0+cmRfb2Zmc2V0KTsKIAlSRUFEMzIocmVhZC0+cmRfbGVuZ3RoKTsKIApAQCAtODM0LDE1ICs4NDgsMTMgQEAKIHN0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQogewotCURFQ09ERV9IRUFEOworCV9fYmUzMiBzdGF0dXM7CiAKLQlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSk7Ci0JUkVBRDMyKHNldGF0dHItPnNhX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmc2V0YXR0ci0+c2Ffc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7Ci0JaWYgKChzdGF0dXMgPSBuZnNkNF9kZWNvZGVfZmF0dHIoYXJncCwgc2V0YXR0ci0+c2FfYm12YWwsICZzZXRhdHRyLT5zYV9pYXR0ciwgJnNldGF0dHItPnNhX2FjbCkpKQotCQlnb3RvIG91dDsKLQotCURFQ09ERV9UQUlMOworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZzZXRhdHRyLT5zYV9zdGF0ZWlkKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBuZnNkNF9kZWNvZGVfZmF0dHIoYXJncCwgc2V0YXR0ci0+c2FfYm12YWwsCisJCQkJICAmc2V0YXR0ci0+c2FfaWF0dHIsICZzZXRhdHRyLT5zYV9hY2wpOwogfQogCiBzdGF0aWMgX19iZTMyCkBAIC05MjcsOSArOTM5LDEwIEBACiAJaW50IGxlbjsKIAlERUNPREVfSEVBRDsKIAotCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSArIDIwKTsKLQlSRUFEMzIod3JpdGUtPndyX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JQ09QWU1FTSgmd3JpdGUtPndyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZ3cml0ZS0+d3Jfc3RhdGVpZCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRigxNik7CiAJUkVBRDY0KHdyaXRlLT53cl9vZmZzZXQpOwogCVJFQUQzMih3cml0ZS0+d3Jfc3RhYmxlX2hvdyk7CiAJaWYgKHdyaXRlLT53cl9zdGFibGVfaG93ID4gMikKQEAgLTExODMsNyArMTE5Niw2IEBACiAgKiBIZWFkZXIgcm91dGluZSB0byBzZXR1cCBzZXFpZCBvcGVyYXRpb24gcmVwbGF5IGNhY2hlCiAgKi8KICNkZWZpbmUgRU5DT0RFX1NFUUlEX09QX0hFQUQJCQkJCVwKLQlfX2JlMzIgKnA7CQkJCQkJXAogCV9fYmUzMiAqc2F2ZTsJCQkJCQlcCiAJCQkJCQkJCVwKIAlzYXZlID0gcmVzcC0+cDsKQEAgLTE5NTAsNiArMTk2MiwxNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3N0YXRlaWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBzdGF0ZWlkX3QgKnNpZCkKK3sKKwlFTkNPREVfSEVBRDsKKworCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOworCVdSSVRFMzIoc2lkLT5zaV9nZW5lcmF0aW9uKTsKKwlXUklURU1FTSgmc2lkLT5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJQURKVVNUX0FSR1MoKTsKK30KKwogc3RhdGljIF9fYmUzMgogbmZzZDRfZW5jb2RlX2FjY2VzcyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKIHsKQEAgLTE5NjksMTIgKzE5OTIsOSBAQAogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCi0JaWYgKCFuZnNlcnIpIHsKLQkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7Ci0JCVdSSVRFMzIoY2xvc2UtPmNsX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JCVdSSVRFTUVNKCZjbG9zZS0+Y2xfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7Ci0JCUFESlVTVF9BUkdTKCk7Ci0JfQorCWlmICghbmZzZXJyKQorCQluZnNkNF9lbmNvZGVfc3RhdGVpZChyZXNwLCAmY2xvc2UtPmNsX3N0YXRlaWQpOworCiAJRU5DT0RFX1NFUUlEX09QX1RBSUwoY2xvc2UtPmNsX3N0YXRlb3duZXIpOwogCXJldHVybiBuZnNlcnI7CiB9CkBAIC0yMDc0LDEyICsyMDk0LDkgQEAKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIAotCWlmICghbmZzZXJyKSB7Ci0JCVJFU0VSVkVfU1BBQ0UoNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEUzMihsb2NrLT5sa19yZXNwX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JCVdSSVRFTUVNKCZsb2NrLT5sa19yZXNwX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOwotCQlBREpVU1RfQVJHUygpOwotCX0gZWxzZSBpZiAobmZzZXJyID09IG5mc2Vycl9kZW5pZWQpCisJaWYgKCFuZnNlcnIpCisJCW5mc2Q0X2VuY29kZV9zdGF0ZWlkKHJlc3AsICZsb2NrLT5sa19yZXNwX3N0YXRlaWQpOworCWVsc2UgaWYgKG5mc2VyciA9PSBuZnNlcnJfZGVuaWVkKQogCQluZnNkNF9lbmNvZGVfbG9ja19kZW5pZWQocmVzcCwgJmxvY2stPmxrX2RlbmllZCk7CiAKIAlFTkNPREVfU0VRSURfT1BfVEFJTChsb2NrLT5sa19yZXBsYXlfb3duZXIpOwpAQCAtMjA5OSwxMyArMjExNiw5IEBACiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAKLQlpZiAoIW5mc2VycikgewotCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEUzMihsb2NrdS0+bHVfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKLQkJV1JJVEVNRU0oJmxvY2t1LT5sdV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKLQkJQURKVVNUX0FSR1MoKTsKLQl9Ci0JCQkJICAgICAgICAKKwlpZiAoIW5mc2VycikKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJmxvY2t1LT5sdV9zdGF0ZWlkKTsKKwogCUVOQ09ERV9TRVFJRF9PUF9UQUlMKGxvY2t1LT5sdV9zdGF0ZW93bmVyKTsKIAlyZXR1cm4gbmZzZXJyOwogfQpAQCAtMjEyOCwxNCArMjE0MSwxNCBAQAogc3RhdGljIF9fYmUzMgogbmZzZDRfZW5jb2RlX29wZW4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKKwlFTkNPREVfSEVBRDsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIAogCWlmIChuZnNlcnIpCiAJCWdvdG8gb3V0OwogCi0JUkVTRVJWRV9TUEFDRSgzNiArIHNpemVvZihzdGF0ZWlkX3QpKTsKLQlXUklURTMyKG9wZW4tPm9wX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JV1JJVEVNRU0oJm9wZW4tPm9wX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCW5mc2Q0X2VuY29kZV9zdGF0ZWlkKHJlc3AsICZvcGVuLT5vcF9zdGF0ZWlkKTsKKwlSRVNFUlZFX1NQQUNFKDQwKTsKIAlXUklURUNJTkZPKG9wZW4tPm9wX2NpbmZvKTsKIAlXUklURTMyKG9wZW4tPm9wX3JmbGFncyk7CiAJV1JJVEUzMigyKTsKQEAgLTIxNDgsOCArMjE2MSw4IEBACiAJY2FzZSBORlM0X09QRU5fREVMRUdBVEVfTk9ORToKIAkJYnJlYWs7CiAJY2FzZSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDoKLQkJUkVTRVJWRV9TUEFDRSgyMCArIHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEVNRU0oJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQpOworCQlSRVNFUlZFX1NQQUNFKDIwKTsKIAkJV1JJVEUzMihvcGVuLT5vcF9yZWNhbGwpOwogCiAJCS8qCkBAIC0yMTYyLDggKzIxNzUsOCBAQAogCQlBREpVU1RfQVJHUygpOwogCQlicmVhazsKIAljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9XUklURToKLQkJUkVTRVJWRV9TUEFDRSgzMiArIHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEVNRU0oJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJbmZzZDRfZW5jb2RlX3N0YXRlaWQocmVzcCwgJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQpOworCQlSRVNFUlZFX1NQQUNFKDMyKTsKIAkJV1JJVEUzMigwKTsKIAogCQkvKgpAQCAtMjE5NSwxMyArMjIwOCw5IEBACiBuZnNkNF9lbmNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSAqb2MpCiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7Ci0JCQkJICAgICAgICAKLQlpZiAoIW5mc2VycikgewotCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKLQkJV1JJVEUzMihvYy0+b2NfcmVzcF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOwotCQlXUklURU1FTSgmb2MtPm9jX3Jlc3Bfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7Ci0JCUFESlVTVF9BUkdTKCk7Ci0JfQorCisJaWYgKCFuZnNlcnIpCisJCW5mc2Q0X2VuY29kZV9zdGF0ZWlkKHJlc3AsICZvYy0+b2NfcmVzcF9zdGF0ZWlkKTsKIAogCUVOQ09ERV9TRVFJRF9PUF9UQUlMKG9jLT5vY19zdGF0ZW93bmVyKTsKIAlyZXR1cm4gbmZzZXJyOwpAQCAtMjIxMSwxMyArMjIyMCw5IEBACiBuZnNkNF9lbmNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKQogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwotCQkJCSAgICAgICAgCi0JaWYgKCFuZnNlcnIpIHsKLQkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7Ci0JCVdSSVRFMzIob2QtPm9kX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7Ci0JCVdSSVRFTUVNKCZvZC0+b2Rfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7Ci0JCUFESlVTVF9BUkdTKCk7Ci0JfQorCisJaWYgKCFuZnNlcnIpCisJCW5mc2Q0X2VuY29kZV9zdGF0ZWlkKHJlc3AsICZvZC0+b2Rfc3RhdGVpZCk7CiAKIAlFTkNPREVfU0VRSURfT1BfVEFJTChvZC0+b2Rfc3RhdGVvd25lcik7CiAJcmV0dXJuIG5mc2VycjsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IGM1M2U2NWYuLjk3NTQzZGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtNjE0LDEwICs2MTQsOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWVyciA9IG5mc2RfY3JlYXRlX3NlcnYoKTsKIAkJaWYgKCFlcnIpIHsKLQkJCWludCBwcm90byA9IDA7Ci0JCQllcnIgPSBzdmNfYWRkc29jayhuZnNkX3NlcnYsIGZkLCBidWYsICZwcm90byk7CisJCQllcnIgPSBzdmNfYWRkc29jayhuZnNkX3NlcnYsIGZkLCBidWYpOwogCQkJaWYgKGVyciA+PSAwKSB7Ci0JCQkJZXJyID0gbG9ja2RfdXAocHJvdG8pOworCQkJCWVyciA9IGxvY2tkX3VwKCk7CiAJCQkJaWYgKGVyciA8IDApCiAJCQkJCXN2Y19zb2NrX25hbWVzKGJ1ZitzdHJsZW4oYnVmKSsxLCBuZnNkX3NlcnYsIGJ1Zik7CiAJCQl9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggZWEzN2M5Ni4uY2QyNWQ5MSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtMzAyLDE3ICszMDIsMjcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCEoYWNjZXNzICYgTkZTRF9NQVlfTE9DSykpIHsKLQkJLyoKLQkJICogcHNldWRvZmxhdm9yIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIG9uIE5MTSwKLQkJICogd2hpY2ggY2xpZW50cyB2aXJ0dWFsbHkgYWx3YXlzIHVzZSBhdXRoX3N5cyBmb3IsCi0JCSAqIGV2ZW4gd2hpbGUgdXNpbmcgUlBDU0VDX0dTUyBmb3IgTkZTLgotCQkgKi8KLQkJZXJyb3IgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7Ci0JfQorCS8qCisJICogcHNldWRvZmxhdm9yIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIG9uIE5MTSwKKwkgKiB3aGljaCBjbGllbnRzIHZpcnR1YWxseSBhbHdheXMgdXNlIGF1dGhfc3lzIGZvciwKKwkgKiBldmVuIHdoaWxlIHVzaW5nIFJQQ1NFQ19HU1MgZm9yIE5GUy4KKwkgKi8KKwlpZiAoYWNjZXNzICYgTkZTRF9NQVlfTE9DSykKKwkJZ290byBza2lwX3BzZXVkb2ZsYXZvcl9jaGVjazsKKwkvKgorCSAqIENsaWVudHMgbWF5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHVzZSBhdXRoX3N5cyBkdXJpbmcgbW91bnQsCisJICogZXZlbiBpZiB0aGV5IHVzZSBnc3MgZm9yIGV2ZXJ5dGhpbmcgZWxzZTsgc2VlIHNlY3Rpb24gMi4zLjIKKwkgKiBvZiByZmMgMjYyMy4KKwkgKi8KKwlpZiAoYWNjZXNzICYgTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UCisJCQkmJiBleHAtPmV4X3BhdGguZGVudHJ5ID09IGRlbnRyeSkKKwkJZ290byBza2lwX3BzZXVkb2ZsYXZvcl9jaGVjazsKIAorCWVycm9yID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworc2tpcF9wc2V1ZG9mbGF2b3JfY2hlY2s6CiAJLyogRmluYWxseSwgY2hlY2sgYWNjZXNzIHBlcm1pc3Npb25zLiAqLwogCWVycm9yID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBleHAsIGRlbnRyeSwgYWNjZXNzKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNwcm9jLmMgYi9mcy9uZnNkL25mc3Byb2MuYwppbmRleCAwNzY2Zjk1Li41Y2ZmZWNhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3Byb2MuYworKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtNjUsNyArNjUsOCBAQAogCWRwcmludGsoIm5mc2Q6IEdFVEFUVFIgICVzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CiAKIAlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKLQluZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsICZyZXNwLT5maCwgMCwgTkZTRF9NQVlfTk9QKTsKKwluZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsICZyZXNwLT5maCwgMCwKKwkJCU5GU0RfTUFZX05PUCB8IE5GU0RfTUFZX0JZUEFTU19HU1NfT05fUk9PVCk7CiAJcmV0dXJuIG5mc2RfcmV0dXJuX2F0dHJzKG5mc2VyciwgcmVzcCk7CiB9CiAKQEAgLTUyMSw3ICs1MjIsOCBAQAogCiAJZHByaW50aygibmZzZDogU1RBVEZTICAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIAotCW5mc2VyciA9IG5mc2Rfc3RhdGZzKHJxc3RwLCAmYXJncC0+ZmgsICZyZXNwLT5zdGF0cyk7CisJbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzLAorCQkJTkZTRF9NQVlfQllQQVNTX0dTU19PTl9ST09UKTsKIAlmaF9wdXQoJmFyZ3AtPmZoKTsKIAlyZXR1cm4gbmZzZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggODAyOTJmZi4uNTllZWI0NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC0yMjksNiArMjI5LDcgQEAKIAogCWF0b21pY19zZXQoJm5mc2RfYnVzeSwgMCk7CiAJbmZzZF9zZXJ2ID0gc3ZjX2NyZWF0ZV9wb29sZWQoJm5mc2RfcHJvZ3JhbSwgbmZzZF9tYXhfYmxrc2l6ZSwKKwkJCQkgICAgICBBRl9JTkVULAogCQkJCSAgICAgIG5mc2RfbGFzdF90aHJlYWQsIG5mc2QsIFRISVNfTU9EVUxFKTsKIAlpZiAobmZzZF9zZXJ2ID09IE5VTEwpCiAJCWVyciA9IC1FTk9NRU07CkBAIC0yNDMsMjUgKzI0NCwyMCBAQAogCWlmICghbGlzdF9lbXB0eSgmbmZzZF9zZXJ2LT5zdl9wZXJtc29ja3MpKQogCQlyZXR1cm4gMDsKIAotCWVycm9yID0gbG9ja2RfdXAoSVBQUk9UT19VRFApOwotCWlmIChlcnJvciA+PSAwKSB7Ci0JCWVycm9yID0gc3ZjX2NyZWF0ZV94cHJ0KG5mc2Rfc2VydiwgInVkcCIsIHBvcnQsCisJZXJyb3IgPSBzdmNfY3JlYXRlX3hwcnQobmZzZF9zZXJ2LCAidWRwIiwgcG9ydCwKIAkJCQkJU1ZDX1NPQ0tfREVGQVVMVFMpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJbG9ja2RfZG93bigpOwotCX0KIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKLQllcnJvciA9IGxvY2tkX3VwKElQUFJPVE9fVENQKTsKLQlpZiAoZXJyb3IgPj0gMCkgewotCQllcnJvciA9IHN2Y19jcmVhdGVfeHBydChuZnNkX3NlcnYsICJ0Y3AiLCBwb3J0LAorCWVycm9yID0gc3ZjX2NyZWF0ZV94cHJ0KG5mc2Rfc2VydiwgInRjcCIsIHBvcnQsCiAJCQkJCVNWQ19TT0NLX0RFRkFVTFRTKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWxvY2tkX2Rvd24oKTsKLQl9CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBsb2NrZF91cCgpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCAxODA2MGJlLi5hYTFkMGQ2IDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTgzLDcgKzgzLDYgQEAKIAlzcGlubG9ja190CQlwYl9sb2NrOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCi1zdGF0aWMgc3RydWN0IHJhcGFybXMgKgkJcmFwYXJtbDsKICNkZWZpbmUgUkFQQVJNX0hBU0hfQklUUwk0CiAjZGVmaW5lIFJBUEFSTV9IQVNIX1NJWkUJKDE8PFJBUEFSTV9IQVNIX0JJVFMpCiAjZGVmaW5lIFJBUEFSTV9IQVNIX01BU0sJKFJBUEFSTV9IQVNIX1NJWkUtMSkKQEAgLTE4NjYsOSArMTg2NSw5IEBACiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CiAgKi8KIF9fYmUzMgotbmZzZF9zdGF0ZnMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qga3N0YXRmcyAqc3RhdCkKK25mc2Rfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGtzdGF0ZnMgKnN0YXQsIGludCBhY2Nlc3MpCiB7Ci0JX19iZTMyIGVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCAwLCBORlNEX01BWV9OT1ApOworCV9fYmUzMiBlcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTkZTRF9NQVlfTk9QIHwgYWNjZXNzKTsKIAlpZiAoIWVyciAmJiB2ZnNfc3RhdGZzKGZocC0+ZmhfZGVudHJ5LHN0YXQpKQogCQllcnIgPSBuZnNlcnJfaW87CiAJcmV0dXJuIGVycjsKQEAgLTE5NjYsMTEgKzE5NjUsMjAgQEAKIHZvaWQKIG5mc2RfcmFjYWNoZV9zaHV0ZG93bih2b2lkKQogewotCWlmICghcmFwYXJtbCkKLQkJcmV0dXJuOworCXN0cnVjdCByYXBhcm1zICpyYXBhcm0sICpsYXN0X3JhcGFybTsKKwl1bnNpZ25lZCBpbnQgaTsKKwogCWRwcmludGsoIm5mc2Q6IGZyZWVpbmcgcmVhZGFoZWFkIGJ1ZmZlcnMuXG4iKTsKLQlrZnJlZShyYXBhcm1sKTsKLQlyYXBhcm1sID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVBBUk1fSEFTSF9TSVpFOyBpKyspIHsKKwkJcmFwYXJtID0gcmFwYXJtX2hhc2hbaV0ucGJfaGVhZDsKKwkJd2hpbGUocmFwYXJtKSB7CisJCQlsYXN0X3JhcGFybSA9IHJhcGFybTsKKwkJCXJhcGFybSA9IHJhcGFybS0+cF9uZXh0OworCQkJa2ZyZWUobGFzdF9yYXBhcm0pOworCQl9CisJCXJhcGFybV9oYXNoW2ldLnBiX2hlYWQgPSBOVUxMOworCX0KIH0KIC8qCiAgKiBJbml0aWFsaXplIHJlYWRhaGVhZCBwYXJhbSBjYWNoZQpAQCAtMTk4MSwzNSArMTk4OSwzOCBAQAogCWludAlpOwogCWludAlqID0gMDsKIAlpbnQJbnBlcmJ1Y2tldDsKKwlzdHJ1Y3QgcmFwYXJtcyAqKnJhcGFybSA9IE5VTEw7CiAKIAotCWlmIChyYXBhcm1sKQorCWlmIChyYXBhcm1faGFzaFswXS5wYl9oZWFkKQogCQlyZXR1cm4gMDsKLQlpZiAoY2FjaGVfc2l6ZSA8IDIqUkFQQVJNX0hBU0hfU0laRSkKLQkJY2FjaGVfc2l6ZSA9IDIqUkFQQVJNX0hBU0hfU0laRTsKLQlyYXBhcm1sID0ga2NhbGxvYyhjYWNoZV9zaXplLCBzaXplb2Yoc3RydWN0IHJhcGFybXMpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcmFwYXJtbCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkibmZzZDogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSByZWFkLWFoZWFkIGNhY2hlLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlucGVyYnVja2V0ID0gRElWX1JPVU5EX1VQKGNhY2hlX3NpemUsIFJBUEFSTV9IQVNIX1NJWkUpOworCWlmIChucGVyYnVja2V0IDwgMikKKwkJbnBlcmJ1Y2tldCA9IDI7CisJY2FjaGVfc2l6ZSA9IG5wZXJidWNrZXQgKiBSQVBBUk1fSEFTSF9TSVpFOwogCiAJZHByaW50aygibmZzZDogYWxsb2NhdGluZyAlZCByZWFkYWhlYWQgYnVmZmVycy5cbiIsIGNhY2hlX3NpemUpOwotCWZvciAoaSA9IDAgOyBpIDwgUkFQQVJNX0hBU0hfU0laRSA7IGkrKykgewotCQlyYXBhcm1faGFzaFtpXS5wYl9oZWFkID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVBBUk1fSEFTSF9TSVpFOyBpKyspIHsKIAkJc3Bpbl9sb2NrX2luaXQoJnJhcGFybV9oYXNoW2ldLnBiX2xvY2spOwotCX0KLQlucGVyYnVja2V0ID0gRElWX1JPVU5EX1VQKGNhY2hlX3NpemUsIFJBUEFSTV9IQVNIX1NJWkUpOwotCWZvciAoaSA9IDA7IGkgPCBjYWNoZV9zaXplIC0gMTsgaSsrKSB7Ci0JCWlmIChpICUgbnBlcmJ1Y2tldCA9PSAwKQotCQkJcmFwYXJtX2hhc2hbaisrXS5wYl9oZWFkID0gcmFwYXJtbCArIGk7Ci0JCWlmIChpICUgbnBlcmJ1Y2tldCA8IG5wZXJidWNrZXQtMSkKLQkJCXJhcGFybWxbaV0ucF9uZXh0ID0gcmFwYXJtbCArIGkgKyAxOworCisJCXJhcGFybSA9ICZyYXBhcm1faGFzaFtpXS5wYl9oZWFkOworCQlmb3IgKGogPSAwOyBqIDwgbnBlcmJ1Y2tldDsgaisrKSB7CisJCQkqcmFwYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhcGFybXMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghKnJhcGFybSkKKwkJCQlnb3RvIG91dF9ub21lbTsKKwkJCXJhcGFybSA9ICYoKnJhcGFybSktPnBfbmV4dDsKKwkJfQorCQkqcmFwYXJtID0gTlVMTDsKIAl9CiAKIAluZnNkc3RhdHMucmFfc2l6ZSA9IGNhY2hlX3NpemU7CiAJcmV0dXJuIDA7CisKK291dF9ub21lbToKKwlkcHJpbnRrKCJuZnNkOiBrbWFsbG9jIGZhaWxlZCwgZnJlZWluZyByZWFkYWhlYWQgYnVmZmVyc1xuIik7CisJbmZzZF9yYWNhY2hlX3NodXRkb3duKCk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1YyX0FDTCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9WM19BQ0wpCmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2Jhc2UuYyBiL2ZzL25scy9ubHNfYmFzZS5jCmluZGV4IDY0OTY1ZTEuLjliMGVmZGEgMTAwNjQ0Ci0tLSBhL2ZzL25scy9ubHNfYmFzZS5jCisrKyBiL2ZzL25scy9ubHNfYmFzZS5jCkBAIC0xMyw5ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmxzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpZmRlZiBDT05GSUdfS01PRAogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIGRlZmF1bHRfdGFibGU7CkBAIC0yMTUsMjQgKzIxMyw3IEBACiAKIHN0cnVjdCBubHNfdGFibGUgKmxvYWRfbmxzKGNoYXIgKmNoYXJzZXQpCiB7Ci0Jc3RydWN0IG5sc190YWJsZSAqbmxzOwotI2lmZGVmIENPTkZJR19LTU9ECi0JaW50IHJldDsKLSNlbmRpZgotCi0JbmxzID0gZmluZF9ubHMoY2hhcnNldCk7Ci0JaWYgKG5scykKLQkJcmV0dXJuIG5sczsKLQotI2lmZGVmIENPTkZJR19LTU9ECi0JcmV0ID0gcmVxdWVzdF9tb2R1bGUoIm5sc18lcyIsIGNoYXJzZXQpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoIlVuYWJsZSB0byBsb2FkIE5MUyBjaGFyc2V0ICVzXG4iLCBjaGFyc2V0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5scyA9IGZpbmRfbmxzKGNoYXJzZXQpOwotI2VuZGlmCi0JcmV0dXJuIG5sczsKKwlyZXR1cm4gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9ubHMoY2hhcnNldCksICJubHNfJXMiLCBjaGFyc2V0KTsKIH0KIAogdm9pZCB1bmxvYWRfbmxzKHN0cnVjdCBubHNfdGFibGUgKm5scykKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL01ha2VmaWxlIGIvZnMvb2NmczIvTWFrZWZpbGUKaW5kZXggZjY5NTZkZS4uNTg5ZGNkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvTWFrZWZpbGUKKysrIGIvZnMvb2NmczIvTWFrZWZpbGUKQEAgLTM0LDcgKzM0LDggQEAKIAlzeW1saW5rLm8gCQlcCiAJc3lzZmlsZS5vIAkJXAogCXVwdG9kYXRlLm8JCVwKLQl2ZXIubworCXZlci5vCQkJXAorCXhhdHRyLm8KIAogb2NmczJfc3RhY2tnbHVlLW9ianMgOj0gc3RhY2tnbHVlLm8KIG9jZnMyX3N0YWNrX28yY2Itb2JqcyA6PSBzdGFja19vMmNiLm8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDEwYmZiNDYuLjBjYzJkZWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNDksNiArNDksMzQwIEBACiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCisKKy8qCisgKiBPcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGV4dGVudCB0cmVlIHR5cGUuCisgKgorICogVG8gaW1wbGVtZW50IGFuIG9uLWRpc2sgYnRyZWUgKGV4dGVudCB0cmVlKSB0eXBlIGluIG9jZnMyLCBhZGQKKyAqIGFuIG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgc3RydWN0dXJlIGFuZCB0aGUgbWF0Y2hpbmcKKyAqIG9jZnMyX2luaXRfPHRoaW5neT5fZXh0ZW50X3RyZWUoKSBmdW5jdGlvbi4gIFRoYXQncyBwcmV0dHkgbXVjaCBpdAorICogZm9yIHRoZSBhbGxvY2F0aW9uIHBvcnRpb24gb2YgdGhlIGV4dGVudCB0cmVlLgorICovCitzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyB7CisJLyoKKwkgKiBsYXN0X2ViX2JsayBpcyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSByaWdodCBtb3N0IGxlYWYgZXh0ZW50CisJICogYmxvY2suICBNb3N0IG9uLWRpc2sgc3RydWN0dXJlcyBjb250YWluaW5nIGFuIGV4dGVudCB0cmVlIHN0b3JlCisJICogdGhpcyB2YWx1ZSBmb3IgZmFzdCBhY2Nlc3MuICBUaGUgLT5lb19zZXRfbGFzdF9lYl9ibGsoKSBhbmQKKwkgKiAtPmVvX2dldF9sYXN0X2ViX2JsaygpIG9wZXJhdGlvbnMgYWNjZXNzIHRoaXMgdmFsdWUuICBUaGV5IGFyZQorCSAqICBib3RoIHJlcXVpcmVkLgorCSAqLworCXZvaWQgKCplb19zZXRfbGFzdF9lYl9ibGspKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJICAgdTY0IGJsa25vKTsKKwl1NjQgKCplb19nZXRfbGFzdF9lYl9ibGspKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworCisJLyoKKwkgKiBUaGUgb24tZGlzayBzdHJ1Y3R1cmUgdXN1YWxseSBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0b3RhbAorCSAqIGNsdXN0ZXJzIGFyZSBzdG9yZWQgaW4gdGhpcyBleHRlbnQgdHJlZS4gIFRoaXMgZnVuY3Rpb24gdXBkYXRlcworCSAqIHRoYXQgdmFsdWUuICBuZXdfY2x1c3RlcnMgaXMgdGhlIGRlbHRhLCBhbmQgbXVzdCBiZQorCSAqIGFkZGVkIHRvIHRoZSB0b3RhbC4gIFJlcXVpcmVkLgorCSAqLworCXZvaWQgKCplb191cGRhdGVfY2x1c3RlcnMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICB1MzIgbmV3X2NsdXN0ZXJzKTsKKworCS8qCisJICogSWYgLT5lb19pbnNlcnRfY2hlY2soKSBleGlzdHMsIGl0IGlzIGNhbGxlZCBiZWZvcmUgcmVjIGlzCisJICogaW5zZXJ0ZWQgaW50byB0aGUgZXh0ZW50IHRyZWUuICBJdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlpbnQgKCplb19pbnNlcnRfY2hlY2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKTsKKwlpbnQgKCplb19zYW5pdHlfY2hlY2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworCisJLyoKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFRoZSByZW1haW5pbmcgYXJlIGludGVybmFsIHRvIG9jZnMyX2V4dGVudF90cmVlIGFuZCBkb24ndCBoYXZlCisJICogYWNjZXNzb3IgZnVuY3Rpb25zCisJICovCisKKwkvKgorCSAqIC0+ZW9fZmlsbF9yb290X2VsKCkgdGFrZXMgZXQtPmV0X29iamVjdCBhbmQgc2V0cyBldC0+ZXRfcm9vdF9lbC4KKwkgKiBJdCBpcyByZXF1aXJlZC4KKwkgKi8KKwl2b2lkICgqZW9fZmlsbF9yb290X2VsKShzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KTsKKworCS8qCisJICogLT5lb19maWxsX21heF9sZWFmX2NsdXN0ZXJzIHNldHMgZXQtPmV0X21heF9sZWFmX2NsdXN0ZXJzIGlmCisJICogaXQgZXhpc3RzLiAgSWYgaXQgZG9lcyBub3QsIGV0LT5ldF9tYXhfbGVhZl9jbHVzdGVycyBpcyBzZXQKKwkgKiB0byAwICh1bmxpbWl0ZWQpLiAgT3B0aW9uYWwuCisJICovCisJdm9pZCAoKmVvX2ZpbGxfbWF4X2xlYWZfY2x1c3RlcnMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCk7Cit9OworCisKKy8qCisgKiBQcmUtZGVjbGFyZSBvY2ZzMl9kaW5vZGVfZXRfb3BzIHNvIHdlIGNhbiB1c2UgaXQgYXMgYSBzYW5pdHkgY2hlY2sKKyAqIGluIHRoZSBtZXRob2RzLgorICovCitzdGF0aWMgdTY0IG9jZnMyX2Rpbm9kZV9nZXRfbGFzdF9lYl9ibGsoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCk7CitzdGF0aWMgdm9pZCBvY2ZzMl9kaW5vZGVfc2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCSB1NjQgYmxrbm8pOworc3RhdGljIHZvaWQgb2NmczJfZGlub2RlX3VwZGF0ZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJIHUzMiBjbHVzdGVycyk7CitzdGF0aWMgaW50IG9jZnMyX2Rpbm9kZV9pbnNlcnRfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKTsKK3N0YXRpYyBpbnQgb2NmczJfZGlub2RlX3Nhbml0eV9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCk7CitzdGF0aWMgdm9pZCBvY2ZzMl9kaW5vZGVfZmlsbF9yb290X2VsKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpOworc3RhdGljIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zIG9jZnMyX2Rpbm9kZV9ldF9vcHMgPSB7CisJLmVvX3NldF9sYXN0X2ViX2Jsawk9IG9jZnMyX2Rpbm9kZV9zZXRfbGFzdF9lYl9ibGssCisJLmVvX2dldF9sYXN0X2ViX2Jsawk9IG9jZnMyX2Rpbm9kZV9nZXRfbGFzdF9lYl9ibGssCisJLmVvX3VwZGF0ZV9jbHVzdGVycwk9IG9jZnMyX2Rpbm9kZV91cGRhdGVfY2x1c3RlcnMsCisJLmVvX2luc2VydF9jaGVjawk9IG9jZnMyX2Rpbm9kZV9pbnNlcnRfY2hlY2ssCisJLmVvX3Nhbml0eV9jaGVjawk9IG9jZnMyX2Rpbm9kZV9zYW5pdHlfY2hlY2ssCisJLmVvX2ZpbGxfcm9vdF9lbAk9IG9jZnMyX2Rpbm9kZV9maWxsX3Jvb3RfZWwsCit9OworCitzdGF0aWMgdm9pZCBvY2ZzMl9kaW5vZGVfc2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCSB1NjQgYmxrbm8pCit7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSBldC0+ZXRfb2JqZWN0OworCisJQlVHX09OKGV0LT5ldF9vcHMgIT0gJm9jZnMyX2Rpbm9kZV9ldF9vcHMpOworCWRpLT5pX2xhc3RfZWJfYmxrID0gY3B1X3RvX2xlNjQoYmxrbm8pOworfQorCitzdGF0aWMgdTY0IG9jZnMyX2Rpbm9kZV9nZXRfbGFzdF9lYl9ibGsoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IGV0LT5ldF9vYmplY3Q7CisKKwlCVUdfT04oZXQtPmV0X29wcyAhPSAmb2NmczJfZGlub2RlX2V0X29wcyk7CisJcmV0dXJuIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKTsKK30KKworc3RhdGljIHZvaWQgb2NmczJfZGlub2RlX3VwZGF0ZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJIHUzMiBjbHVzdGVycykKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IGV0LT5ldF9vYmplY3Q7CisKKwlsZTMyX2FkZF9jcHUoJmRpLT5pX2NsdXN0ZXJzLCBjbHVzdGVycyk7CisJc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7CisJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoZGktPmlfY2x1c3RlcnMpOworCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZGlub2RlX2luc2VydF9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlCVUdfT04oT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKTsKKwltbG9nX2J1Z19vbl9tc2coIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmCisJCQkoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzICE9IHJlYy0+ZV9jcG9zKSwKKwkJCSJEZXZpY2UgJXMsIGFza2luZyBmb3Igc3BhcnNlIGFsbG9jYXRpb246IGlub2RlICVsbHUsICIKKwkJCSJjcG9zICV1LCBjbHVzdGVycyAldVxuIiwKKwkJCW9zYi0+ZGV2X3N0ciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJcmVjLT5lX2Nwb3MsCisJCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZGlub2RlX3Nhbml0eV9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKworCUJVR19PTihldC0+ZXRfb3BzICE9ICZvY2ZzMl9kaW5vZGVfZXRfb3BzKTsKKworCWRpID0gZXQtPmV0X29iamVjdDsKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkiSW5vZGUgJWxsdSBoYXMgaW52YWxpZCBwYXRoIHJvb3QiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2Rpbm9kZV9maWxsX3Jvb3RfZWwoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IGV0LT5ldF9vYmplY3Q7CisKKwlldC0+ZXRfcm9vdF9lbCA9ICZkaS0+aWQyLmlfbGlzdDsKK30KKworCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl92YWx1ZV9maWxsX3Jvb3RfZWwoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBldC0+ZXRfb2JqZWN0OworCisJZXQtPmV0X3Jvb3RfZWwgPSAmeHYtPnhyX2xpc3Q7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX3ZhbHVlX3NldF9sYXN0X2ViX2JsayhzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAorCQkJCQkgICAgICB1NjQgYmxrbm8pCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0KKwkJKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopZXQtPmV0X29iamVjdDsKKworCXh2LT54cl9sYXN0X2ViX2JsayA9IGNwdV90b19sZTY0KGJsa25vKTsKK30KKworc3RhdGljIHU2NCBvY2ZzMl94YXR0cl92YWx1ZV9nZXRfbGFzdF9lYl9ibGsoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPQorCQkoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikgZXQtPmV0X29iamVjdDsKKworCXJldHVybiBsZTY0X3RvX2NwdSh4di0+eHJfbGFzdF9lYl9ibGspOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl92YWx1ZV91cGRhdGVfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJICAgICAgdTMyIGNsdXN0ZXJzKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diA9CisJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKWV0LT5ldF9vYmplY3Q7CisKKwlsZTMyX2FkZF9jcHUoJnh2LT54cl9jbHVzdGVycywgY2x1c3RlcnMpOworfQorCitzdGF0aWMgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgb2NmczJfeGF0dHJfdmFsdWVfZXRfb3BzID0geworCS5lb19zZXRfbGFzdF9lYl9ibGsJPSBvY2ZzMl94YXR0cl92YWx1ZV9zZXRfbGFzdF9lYl9ibGssCisJLmVvX2dldF9sYXN0X2ViX2Jsawk9IG9jZnMyX3hhdHRyX3ZhbHVlX2dldF9sYXN0X2ViX2JsaywKKwkuZW9fdXBkYXRlX2NsdXN0ZXJzCT0gb2NmczJfeGF0dHJfdmFsdWVfdXBkYXRlX2NsdXN0ZXJzLAorCS5lb19maWxsX3Jvb3RfZWwJPSBvY2ZzMl94YXR0cl92YWx1ZV9maWxsX3Jvb3RfZWwsCit9OworCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl90cmVlX2ZpbGxfcm9vdF9lbChzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPSBldC0+ZXRfb2JqZWN0OworCisJZXQtPmV0X3Jvb3RfZWwgPSAmeGItPnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdDsKK30KKworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfdHJlZV9maWxsX21heF9sZWFmX2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKK3sKKwlldC0+ZXRfbWF4X2xlYWZfY2x1c3RlcnMgPQorCQlvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsCisJCQkJCSBPQ0ZTMl9NQVhfWEFUVFJfVFJFRV9MRUFGX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl90cmVlX3NldF9sYXN0X2ViX2JsayhzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAorCQkJCQkgICAgIHU2NCBibGtubykKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0gZXQtPmV0X29iamVjdDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4dCA9ICZ4Yi0+eGJfYXR0cnMueGJfcm9vdDsKKworCXh0LT54dF9sYXN0X2ViX2JsayA9IGNwdV90b19sZTY0KGJsa25vKTsKK30KKworc3RhdGljIHU2NCBvY2ZzMl94YXR0cl90cmVlX2dldF9sYXN0X2ViX2JsayhzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPSBldC0+ZXRfb2JqZWN0OworCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgKnh0ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCisJcmV0dXJuIGxlNjRfdG9fY3B1KHh0LT54dF9sYXN0X2ViX2Jsayk7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX3RyZWVfdXBkYXRlX2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJICAgICB1MzIgY2x1c3RlcnMpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9IGV0LT5ldF9vYmplY3Q7CisKKwlsZTMyX2FkZF9jcHUoJnhiLT54Yl9hdHRycy54Yl9yb290Lnh0X2NsdXN0ZXJzLCBjbHVzdGVycyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyBvY2ZzMl94YXR0cl90cmVlX2V0X29wcyA9IHsKKwkuZW9fc2V0X2xhc3RfZWJfYmxrCT0gb2NmczJfeGF0dHJfdHJlZV9zZXRfbGFzdF9lYl9ibGssCisJLmVvX2dldF9sYXN0X2ViX2Jsawk9IG9jZnMyX3hhdHRyX3RyZWVfZ2V0X2xhc3RfZWJfYmxrLAorCS5lb191cGRhdGVfY2x1c3RlcnMJPSBvY2ZzMl94YXR0cl90cmVlX3VwZGF0ZV9jbHVzdGVycywKKwkuZW9fZmlsbF9yb290X2VsCT0gb2NmczJfeGF0dHJfdHJlZV9maWxsX3Jvb3RfZWwsCisJLmVvX2ZpbGxfbWF4X2xlYWZfY2x1c3RlcnMgPSBvY2ZzMl94YXR0cl90cmVlX2ZpbGxfbWF4X2xlYWZfY2x1c3RlcnMsCit9OworCitzdGF0aWMgdm9pZCBfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgICAgdm9pZCAqb2JqLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlldC0+ZXRfb3BzID0gb3BzOworCWV0LT5ldF9yb290X2JoID0gYmg7CisJaWYgKCFvYmopCisJCW9iaiA9ICh2b2lkICopYmgtPmJfZGF0YTsKKwlldC0+ZXRfb2JqZWN0ID0gb2JqOworCisJZXQtPmV0X29wcy0+ZW9fZmlsbF9yb290X2VsKGV0KTsKKwlpZiAoIWV0LT5ldF9vcHMtPmVvX2ZpbGxfbWF4X2xlYWZfY2x1c3RlcnMpCisJCWV0LT5ldF9tYXhfbGVhZl9jbHVzdGVycyA9IDA7CisJZWxzZQorCQlldC0+ZXRfb3BzLT5lb19maWxsX21heF9sZWFmX2NsdXN0ZXJzKGlub2RlLCBldCk7Cit9CisKK3ZvaWQgb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX19vY2ZzMl9pbml0X2V4dGVudF90cmVlKGV0LCBpbm9kZSwgYmgsIE5VTEwsICZvY2ZzMl9kaW5vZGVfZXRfb3BzKTsKK30KKwordm9pZCBvY2ZzMl9pbml0X3hhdHRyX3RyZWVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgTlVMTCwKKwkJCQkgJm9jZnMyX3hhdHRyX3RyZWVfZXRfb3BzKTsKK30KKwordm9pZCBvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dikKK3sKKwlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgeHYsCisJCQkJICZvY2ZzMl94YXR0cl92YWx1ZV9ldF9vcHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfZXRfc2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCSAgICB1NjQgbmV3X2xhc3RfZWJfYmxrKQoreworCWV0LT5ldF9vcHMtPmVvX3NldF9sYXN0X2ViX2JsayhldCwgbmV3X2xhc3RfZWJfYmxrKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCit7CisJcmV0dXJuIGV0LT5ldF9vcHMtPmVvX2dldF9sYXN0X2ViX2JsayhldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9ldF91cGRhdGVfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCSAgICB1MzIgY2x1c3RlcnMpCit7CisJZXQtPmV0X29wcy0+ZW9fdXBkYXRlX2NsdXN0ZXJzKGlub2RlLCBldCwgY2x1c3RlcnMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ldF9pbnNlcnRfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChldC0+ZXRfb3BzLT5lb19pbnNlcnRfY2hlY2spCisJCXJldCA9IGV0LT5ldF9vcHMtPmVvX2luc2VydF9jaGVjayhpbm9kZSwgZXQsIHJlYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXRfc2FuaXR5X2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZXQtPmV0X29wcy0+ZW9fc2FuaXR5X2NoZWNrKQorCQlyZXQgPSBldC0+ZXRfb3BzLT5lb19zYW5pdHlfY2hlY2soaW5vZGUsIGV0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKTsKIHN0YXRpYyBpbnQgb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCiAJCQkJCSBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYik7CkBAIC0yMDUsMTcgKzUzOSw2IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBwYXRoIGJhc2VkIG9uIGEgZGlzayBpbm9kZSB0cmVlLgotICovCi1zdGF0aWMgc3RydWN0IG9jZnMyX3BhdGggKm9jZnMyX25ld19pbm9kZV9wYXRoKHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCi17Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZkaS0+aWQyLmlfbGlzdDsKLQotCXJldHVybiBvY2ZzMl9uZXdfcGF0aChkaV9iaCwgZWwpOwotfQotCi0vKgogICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gam91cm5hbCBhbGwgY29tcG9uZW50cyBpbiBhIHBhdGguCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLApAQCAtMzY4LDM5ICs2OTEsMzUgQEAKICAqLwogaW50IG9jZnMyX251bV9mcmVlX2V4dGVudHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUpCisJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoID0gTlVMTDsKKwl1NjQgbGFzdF9lYl9ibGsgPSAwOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoaW5vZGUtPmlfc2IsIGZlKTsKLQkJcmV0dmFsID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KKwllbCA9IGV0LT5ldF9yb290X2VsOworCWxhc3RfZWJfYmxrID0gb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KTsKIAotCWlmIChmZS0+aV9sYXN0X2ViX2JsaykgewotCQlyZXR2YWwgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgbGU2NF90b19jcHUoZmUtPmlfbGFzdF9lYl9ibGspLAotCQkJCQkgICZlYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJaWYgKGxhc3RfZWJfYmxrKSB7CisJCXJldHZhbCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxhc3RfZWJfYmxrLAorCQkJCQkgICZlYl9iaCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldHZhbCk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KIAkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaC0+Yl9kYXRhOwogCQllbCA9ICZlYi0+aF9saXN0OwotCX0gZWxzZQotCQllbCA9ICZmZS0+aWQyLmlfbGlzdDsKKwl9CiAKIAlCVUdfT04oZWwtPmxfdHJlZV9kZXB0aCAhPSAwKTsKIAogCXJldHZhbCA9IGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSAtIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOwogYmFpbDoKLQlpZiAoZWJfYmgpCi0JCWJyZWxzZShlYl9iaCk7CisJYnJlbHNlKGViX2JoKTsKIAogCW1sb2dfZXhpdChyZXR2YWwpOwogCXJldHVybiByZXR2YWw7CkBAIC00ODYsOCArODA1LDcgQEAKIGJhaWw6CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZm9yKGkgPSAwOyBpIDwgd2FudGVkOyBpKyspIHsKLQkJCWlmIChiaHNbaV0pCi0JCQkJYnJlbHNlKGJoc1tpXSk7CisJCQlicmVsc2UoYmhzW2ldKTsKIAkJCWJoc1tpXSA9IE5VTEw7CiAJCX0KIAl9CkBAIC01MzEsNyArODQ5LDcgQEAKIHN0YXRpYyBpbnQgb2NmczJfYWRkX2JyYW5jaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmgsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKQEAgLTU0MCw3ICs4NTgsNiBAQAogCXU2NCBuZXh0X2Jsa25vLCBuZXdfbGFzdF9lYl9ibGs7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipuZXdfZWJfYmhzID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgICplYl9lbDsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgICplbDsKQEAgLTU1MCwxMyArODY3LDExIEBACiAKIAlCVUdfT04oIWxhc3RfZWJfYmggfHwgISpsYXN0X2ViX2JoKTsKIAotCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKLQogCWlmIChlYl9iaCkgewogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGViX2JoLT5iX2RhdGE7CiAJCWVsID0gJmViLT5oX2xpc3Q7CiAJfSBlbHNlCi0JCWVsID0gJmZlLT5pZDIuaV9saXN0OworCQllbCA9IGV0LT5ldF9yb290X2VsOwogCiAJLyogd2UgbmV2ZXIgYWRkIGEgYnJhbmNoIHRvIGEgbGVhZi4gKi8KIAlCVUdfT04oIWVsLT5sX3RyZWVfZGVwdGgpOwpAQCAtNjQ2LDcgKzk2MSw3IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKIAkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjYyLDcgKzk3Nyw3IEBACiAJfQogCiAJLyogTGluayB0aGUgbmV3IGJyYW5jaCBpbnRvIHRoZSByZXN0IG9mIHRoZSB0cmVlIChlbCB3aWxsCi0JICogZWl0aGVyIGJlIG9uIHRoZSBmZSwgb3IgdGhlIGV4dGVudCBibG9jayBwYXNzZWQgaW4uICovCisJICogZWl0aGVyIGJlIG9uIHRoZSByb290X2JoLCBvciB0aGUgZXh0ZW50IGJsb2NrIHBhc3NlZCBpbi4gKi8KIAlpID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CiAJZWwtPmxfcmVjc1tpXS5lX2Jsa25vID0gY3B1X3RvX2xlNjQobmV4dF9ibGtubyk7CiAJZWwtPmxfcmVjc1tpXS5lX2Nwb3MgPSBjcHVfdG9fbGUzMihuZXdfY3Bvcyk7CkBAIC02NzEsNyArOTg2LDcgQEAKIAogCS8qIGZlIG5lZWRzIGEgbmV3IGxhc3QgZXh0ZW50IGJsb2NrIHBvaW50ZXIsIGFzIGRvZXMgdGhlCiAJICogbmV4dF9sZWFmIG9uIHRoZSBwcmV2aW91c2x5IGxhc3QtZXh0ZW50LWJsb2NrLiAqLwotCWZlLT5pX2xhc3RfZWJfYmxrID0gY3B1X3RvX2xlNjQobmV3X2xhc3RfZWJfYmxrKTsKKwlvY2ZzMl9ldF9zZXRfbGFzdF9lYl9ibGsoZXQsIG5ld19sYXN0X2ViX2Jsayk7CiAKIAllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopICgqbGFzdF9lYl9iaCktPmJfZGF0YTsKIAllYi0+aF9uZXh0X2xlYWZfYmxrID0gY3B1X3RvX2xlNjQobmV3X2xhc3RfZWJfYmxrKTsKQEAgLTY3OSw3ICs5OTQsNyBAQAogCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCAqbGFzdF9lYl9iaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZmVfYmgpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBldC0+ZXRfcm9vdF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAlpZiAoZWJfYmgpIHsKQEAgLTcwMCw4ICsxMDE1LDcgQEAKIGJhaWw6CiAJaWYgKG5ld19lYl9iaHMpIHsKIAkJZm9yIChpID0gMDsgaSA8IG5ld19ibG9ja3M7IGkrKykKLQkJCWlmIChuZXdfZWJfYmhzW2ldKQotCQkJCWJyZWxzZShuZXdfZWJfYmhzW2ldKTsKKwkJCWJyZWxzZShuZXdfZWJfYmhzW2ldKTsKIAkJa2ZyZWUobmV3X2ViX2Jocyk7CiAJfQogCkBAIC03MTcsMTYgKzEwMzEsMTUgQEAKIHN0YXRpYyBpbnQgb2NmczJfc2hpZnRfdHJlZV9kZXB0aChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9uZXdfZWJfYmgpCiB7CiAJaW50IHN0YXR1cywgaTsKIAl1MzIgbmV3X2NsdXN0ZXJzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2ViX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgICpmZV9lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgICpyb290X2VsOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAgKmViX2VsOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CkBAIC03NDYsOCArMTA1OSw3IEBACiAJfQogCiAJZWJfZWwgPSAmZWItPmhfbGlzdDsKLQlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7Ci0JZmVfZWwgPSAmZmUtPmlkMi5pX2xpc3Q7CisJcm9vdF9lbCA9IGV0LT5ldF9yb290X2VsOwogCiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgbmV3X2ViX2JoLAogCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CkBAIC03NTYsMTEgKzEwNjgsMTEgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCS8qIGNvcHkgdGhlIGZlIGRhdGEgaW50byB0aGUgbmV3IGV4dGVudCBibG9jayAqLwotCWViX2VsLT5sX3RyZWVfZGVwdGggPSBmZV9lbC0+bF90cmVlX2RlcHRoOwotCWViX2VsLT5sX25leHRfZnJlZV9yZWMgPSBmZV9lbC0+bF9uZXh0X2ZyZWVfcmVjOwotCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGZlX2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspCi0JCWViX2VsLT5sX3JlY3NbaV0gPSBmZV9lbC0+bF9yZWNzW2ldOworCS8qIGNvcHkgdGhlIHJvb3QgZXh0ZW50IGxpc3QgZGF0YSBpbnRvIHRoZSBuZXcgZXh0ZW50IGJsb2NrICovCisJZWJfZWwtPmxfdHJlZV9kZXB0aCA9IHJvb3RfZWwtPmxfdHJlZV9kZXB0aDsKKwllYl9lbC0+bF9uZXh0X2ZyZWVfcmVjID0gcm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjOworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShyb290X2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspCisJCWViX2VsLT5sX3JlY3NbaV0gPSByb290X2VsLT5sX3JlY3NbaV07CiAKIAlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2ViX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNzY4LDcgKzEwODAsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCiAJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTc3NywyMSArMTA4OSwyMSBAQAogCiAJbmV3X2NsdXN0ZXJzID0gb2NmczJfc3VtX3JpZ2h0bW9zdF9yZWMoZWJfZWwpOwogCi0JLyogdXBkYXRlIGZlIG5vdyAqLwotCWxlMTZfYWRkX2NwdSgmZmVfZWwtPmxfdHJlZV9kZXB0aCwgMSk7Ci0JZmVfZWwtPmxfcmVjc1swXS5lX2Nwb3MgPSAwOwotCWZlX2VsLT5sX3JlY3NbMF0uZV9ibGtubyA9IGViLT5oX2Jsa25vOwotCWZlX2VsLT5sX3JlY3NbMF0uZV9pbnRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihuZXdfY2x1c3RlcnMpOwotCWZvcihpID0gMTsgaSA8IGxlMTZfdG9fY3B1KGZlX2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspCi0JCW1lbXNldCgmZmVfZWwtPmxfcmVjc1tpXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7Ci0JZmVfZWwtPmxfbmV4dF9mcmVlX3JlYyA9IGNwdV90b19sZTE2KDEpOworCS8qIHVwZGF0ZSByb290X2JoIG5vdyAqLworCWxlMTZfYWRkX2NwdSgmcm9vdF9lbC0+bF90cmVlX2RlcHRoLCAxKTsKKwlyb290X2VsLT5sX3JlY3NbMF0uZV9jcG9zID0gMDsKKwlyb290X2VsLT5sX3JlY3NbMF0uZV9ibGtubyA9IGViLT5oX2Jsa25vOworCXJvb3RfZWwtPmxfcmVjc1swXS5lX2ludF9jbHVzdGVycyA9IGNwdV90b19sZTMyKG5ld19jbHVzdGVycyk7CisJZm9yIChpID0gMTsgaSA8IGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykKKwkJbWVtc2V0KCZyb290X2VsLT5sX3JlY3NbaV0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCXJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYyA9IGNwdV90b19sZTE2KDEpOwogCiAJLyogSWYgdGhpcyBpcyBvdXIgMXN0IHRyZWUgZGVwdGggc2hpZnQsIHRoZW4gbGFzdF9lYl9ibGsKIAkgKiBiZWNvbWVzIHRoZSBhbGxvY2F0ZWQgZXh0ZW50IGJsb2NrICovCi0JaWYgKGZlX2VsLT5sX3RyZWVfZGVwdGggPT0gY3B1X3RvX2xlMTYoMSkpCi0JCWZlLT5pX2xhc3RfZWJfYmxrID0gZWItPmhfYmxrbm87CisJaWYgKHJvb3RfZWwtPmxfdHJlZV9kZXB0aCA9PSBjcHVfdG9fbGUxNigxKSkKKwkJb2NmczJfZXRfc2V0X2xhc3RfZWJfYmxrKGV0LCBsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZXQtPmV0X3Jvb3RfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtODAxLDggKzExMTMsNyBAQAogCW5ld19lYl9iaCA9IE5VTEw7CiAJc3RhdHVzID0gMDsKIGJhaWw6Ci0JaWYgKG5ld19lYl9iaCkKLQkJYnJlbHNlKG5ld19lYl9iaCk7CisJYnJlbHNlKG5ld19lYl9iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtODE3LDIyICsxMTI4LDIxIEBACiAgKiAxKSBhIGxvd2VzdCBleHRlbnQgYmxvY2sgaXMgZm91bmQsIHRoZW4gd2UgcGFzcyBpdCBiYWNrIGluCiAgKiAgICAqbG93ZXN0X2ViX2JoIGFuZCByZXR1cm4gJzAnCiAgKgotICogMikgdGhlIHNlYXJjaCBmYWlscyB0byBmaW5kIGFueXRoaW5nLCBidXQgdGhlIGRpbm9kZSBoYXMgcm9vbS4gV2UKKyAqIDIpIHRoZSBzZWFyY2ggZmFpbHMgdG8gZmluZCBhbnl0aGluZywgYnV0IHRoZSByb290X2VsIGhhcyByb29tLiBXZQogICogICAgcGFzcyBOVUxMIGJhY2sgaW4gKmxvd2VzdF9lYl9iaCwgYnV0IHN0aWxsIHJldHVybiAnMCcKICAqCi0gKiAzKSB0aGUgc2VhcmNoIGZhaWxzIHRvIGZpbmQgYW55dGhpbmcgQU5EIHRoZSBkaW5vZGUgaXMgZnVsbCwgaW4KKyAqIDMpIHRoZSBzZWFyY2ggZmFpbHMgdG8gZmluZCBhbnl0aGluZyBBTkQgdGhlIHJvb3RfZWwgaXMgZnVsbCwgaW4KICAqICAgIHdoaWNoIGNhc2Ugd2UgcmV0dXJuID4gMAogICoKICAqIHJldHVybiBzdGF0dXMgPCAwIGluZGljYXRlcyBhbiBlcnJvci4KICAqLwogc3RhdGljIGludCBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnRhcmdldF9iaCkKIHsKIAlpbnQgc3RhdHVzID0gMCwgaTsKIAl1NjQgYmxrbm87Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICAqZWw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CkBAIC04NDIsOCArMTE1Miw3IEBACiAKIAkqdGFyZ2V0X2JoID0gTlVMTDsKIAotCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKLQllbCA9ICZmZS0+aWQyLmlfbGlzdDsKKwllbCA9IGV0LT5ldF9yb290X2VsOwogCiAJd2hpbGUobGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkgPiAxKSB7CiAJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKSB7CkBAIC04NjQsMTMgKzExNzMsMTAgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCi0JCWlmIChiaCkgewotCQkJYnJlbHNlKGJoKTsKLQkJCWJoID0gTlVMTDsKLQkJfQorCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CiAKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGJsa25vLCAmYmgsIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCQkJICBpbm9kZSk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpAQCAtODg2LDggKzExOTIsNyBAQAogCiAJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA8CiAJCSAgICBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkpIHsKLQkJCWlmIChsb3dlc3RfYmgpCi0JCQkJYnJlbHNlKGxvd2VzdF9iaCk7CisJCQlicmVsc2UobG93ZXN0X2JoKTsKIAkJCWxvd2VzdF9iaCA9IGJoOwogCQkJZ2V0X2JoKGxvd2VzdF9iaCk7CiAJCX0KQEAgLTg5NSwxNCArMTIwMCwxMyBAQAogCiAJLyogSWYgd2UgZGlkbid0IGZpbmQgb25lIGFuZCB0aGUgZmUgZG9lc24ndCBoYXZlIGFueSByb29tLAogCSAqIHRoZW4gcmV0dXJuICcxJyAqLwotCWlmICghbG93ZXN0X2JoCi0JICAgICYmIChmZS0+aWQyLmlfbGlzdC5sX25leHRfZnJlZV9yZWMgPT0gZmUtPmlkMi5pX2xpc3QubF9jb3VudCkpCisJZWwgPSBldC0+ZXRfcm9vdF9lbDsKKwlpZiAoIWxvd2VzdF9iaCAmJiAoZWwtPmxfbmV4dF9mcmVlX3JlYyA9PSBlbC0+bF9jb3VudCkpCiAJCXN0YXR1cyA9IDE7CiAKIAkqdGFyZ2V0X2JoID0gbG93ZXN0X2JoOwogYmFpbDoKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC05MTksMTkgKzEyMjMsMTkgQEAKICAqICpsYXN0X2ViX2JoIHdpbGwgYmUgdXBkYXRlZCBieSBvY2ZzMl9hZGRfYnJhbmNoKCkuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZ3Jvd190cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBpbnQgKmZpbmFsX2RlcHRoLAorCQkJICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwgaW50ICpmaW5hbF9kZXB0aCwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCiAJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKIHsKIAlpbnQgcmV0LCBzaGlmdDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKLQlpbnQgZGVwdGggPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBldC0+ZXRfcm9vdF9lbDsKKwlpbnQgZGVwdGggPSBsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAogCUJVR19PTihtZXRhX2FjID09IE5VTEwpOwogCi0Jc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZGlfYmgsICZiaCk7CisJc2hpZnQgPSBvY2ZzMl9maW5kX2JyYW5jaF90YXJnZXQob3NiLCBpbm9kZSwgZXQsICZiaCk7CiAJaWYgKHNoaWZ0IDwgMCkgewogCQlyZXQgPSBzaGlmdDsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtOTQ4LDcgKzEyNTIsNyBAQAogCQkvKiBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoIHdpbGwgcmV0dXJuIHVzIGEgYnVmZmVyIHdpdGgKIAkJICogdGhlIG5ldyBleHRlbnQgYmxvY2sgKHNvIHdlIGNhbiBwYXNzIHRoYXQgdG8KIAkJICogb2NmczJfYWRkX2JyYW5jaCkuICovCi0JCXJldCA9IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgob3NiLCBoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJcmV0ID0gb2NmczJfc2hpZnRfdHJlZV9kZXB0aChvc2IsIGhhbmRsZSwgaW5vZGUsIGV0LAogCQkJCQkgICAgIG1ldGFfYWMsICZiaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC05NzUsNyArMTI3OSw3IEBACiAJLyogY2FsbCBvY2ZzMl9hZGRfYnJhbmNoIHRvIGFkZCB0aGUgZmluYWwgcGFydCBvZiB0aGUgdHJlZSB3aXRoCiAJICogdGhlIG5ldyBkYXRhLiAqLwogCW1sb2coMCwgImFkZCBicmFuY2guIGJoID0gJXBcbiIsIGJoKTsKLQlyZXQgPSBvY2ZzMl9hZGRfYnJhbmNoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsIGJoLCBsYXN0X2ViX2JoLAorCXJldCA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBldCwgYmgsIGxhc3RfZWJfYmgsCiAJCQkgICAgICAgbWV0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtOTkwLDE1ICsxMjk0LDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVhZiBub2Rlcywgd2hpY2ggYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBjYW4KLSAqIGhhdmUgZW1wdHkgZXh0ZW50cyBhbnl3YXkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2lzX2VtcHR5X2V4dGVudChzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKQotewotCXJldHVybiAhcmVjLT5lX2xlYWZfY2x1c3RlcnM7Ci19Ci0KLS8qCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGlzY2FyZCB0aGUgcmlnaHRtb3N0IGV4dGVudCByZWNvcmQuCiAgKi8KIHN0YXRpYyB2b2lkIG9jZnMyX3NoaWZ0X3JlY29yZHNfcmlnaHQoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKQEAgLTEyNDUsOCArMTU0MCw3IEBACiAKIAkJYnJlbHNlKGJoKTsKIAkJYmggPSBOVUxMOwotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgYmxrbm8sCi0JCQkJICAgICAgICZiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTIwNjcsMTEgKzIzNjEsMTEgQEAKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAogCQkJCSAgICAgaW50IHN1YnRyZWVfaW5kZXgsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKLQkJCQkgICAgIGludCAqZGVsZXRlZCkKKwkJCQkgICAgIGludCAqZGVsZXRlZCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7CiAJaW50IHJldCwgaSwgZGVsX3JpZ2h0X3N1YnRyZWUgPSAwLCByaWdodF9oYXNfZW1wdHkgPSAwOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwgKmRpX2JoID0gcGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpOwotCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwgKmV0X3Jvb3RfYmggPSBwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCk7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodF9sZWFmX2VsLCAqbGVmdF9sZWFmX2VsOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCkBAIC0yMTIzLDcgKzI0MTcsNyBAQAogCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSBpX2xhc3RfZWJfYmxrIGR1cmluZyB0aGUgbWV0YQogCQkgKiBkYXRhIGRlbGV0ZS4KIAkJICovCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldF9yb290X2JoLAogCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTIxOTgsNyArMjQ5Miw3IEBACiAJCW9jZnMyX3VwZGF0ZV9lZGdlX2xlbmd0aHMoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoKTsKIAogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfZGF0YTsKLQkJZGktPmlfbGFzdF9lYl9ibGsgPSBlYi0+aF9ibGtubzsKKwkJb2NmczJfZXRfc2V0X2xhc3RfZWJfYmxrKGV0LCBsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOwogCiAJCS8qCiAJCSAqIFJlbW92YWwgb2YgdGhlIGV4dGVudCBpbiB0aGUgbGVmdCBsZWFmIHdhcyBza2lwcGVkCkBAIC0yMjA4LDcgKzI1MDIsNyBAQAogCQlpZiAocmlnaHRfaGFzX2VtcHR5KQogCQkJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChsZWZ0X2xlYWZfZWwpOwogCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBldF9yb290X2JoKTsKIAkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMjMzMSw3ICsyNjI1LDggQEAKIAkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwgaW50IG9yaWdfY3JlZGl0cywKIAkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKmVtcHR5X2V4dGVudF9wYXRoKQorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKmVtcHR5X2V4dGVudF9wYXRoLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCByZXQsIHN1YnRyZWVfcm9vdCwgZGVsZXRlZDsKIAl1MzIgcmlnaHRfY3BvczsKQEAgLTI0MDQsNyArMjY5OSw3IEBACiAKIAkJcmV0ID0gb2NmczJfcm90YXRlX3N1YnRyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCiAJCQkJCQlyaWdodF9wYXRoLCBzdWJ0cmVlX3Jvb3QsCi0JCQkJCQlkZWFsbG9jLCAmZGVsZXRlZCk7CisJCQkJCQlkZWFsbG9jLCAmZGVsZXRlZCwgZXQpOwogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCS8qCiAJCQkgKiBUaGUgcm90YXRpb24gaGFzIHRvIHRlbXBvcmFyaWx5IHN0b3AgZHVlIHRvCkBAIC0yNDQ3LDI5ICsyNzQyLDIwIEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX3JpZ2h0bW9zdF9wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAotCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKKwkJCQlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCByZXQsIHN1YnRyZWVfaW5kZXg7CiAJdTMyIGNwb3M7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAotCS8qCi0JICogWFhYOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSByb290IGlzIGFuIGlub2RlLCB3aGljaCBpcwotCSAqIHRydWUgZm9yIG5vdyBidXQgbWF5IGNoYW5nZSBhcyB0cmVlIGNvZGUgZ2V0cyBnZW5lcmljLgotCSAqLwotCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilwYXRoX3Jvb3RfYmgocGF0aCktPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKLQkJcmV0ID0gLUVJTzsKLQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCi0JCQkgICAgIklub2RlICVsbHUgaGFzIGludmFsaWQgcGF0aCByb290IiwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7Ci0JCWdvdG8gb3V0OwotCX0KIAorCXJldCA9IG9jZnMyX2V0X3Nhbml0eV9jaGVjayhpbm9kZSwgZXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCS8qCiAJICogVGhlcmUncyB0d28gd2F5cyB3ZSBoYW5kbGUgdGhpcyBkZXBlbmRpbmcgb24KIAkgKiB3aGV0aGVyIHBhdGggaXMgdGhlIG9ubHkgZXhpc3Rpbmcgb25lLgpAQCAtMjUyNiw3ICsyODEyLDcgQEAKIAkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOwogCiAJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOwotCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCQlvY2ZzMl9ldF9zZXRfbGFzdF9lYl9ibGsoZXQsIGxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogJ3BhdGgnIGlzIGFsc28gdGhlIGxlZnRtb3N0IHBhdGggd2hpY2gKQEAgLTI1MzcsMTIgKzI4MjMsMTIgQEAKIAkJICovCiAJCW9jZnMyX3VubGlua19wYXRoKGlub2RlLCBoYW5kbGUsIGRlYWxsb2MsIHBhdGgsIDEpOwogCi0JCWVsID0gJmRpLT5pZDIuaV9saXN0OworCQllbCA9IGV0LT5ldF9yb290X2VsOwogCQllbC0+bF90cmVlX2RlcHRoID0gMDsKIAkJZWwtPmxfbmV4dF9mcmVlX3JlYyA9IDA7CiAJCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CiAKLQkJZGktPmlfbGFzdF9lYl9ibGsgPSAwOworCQlvY2ZzMl9ldF9zZXRfbGFzdF9lYl9ibGsoZXQsIDApOwogCX0KIAogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX3Jvb3RfYmgocGF0aCkpOwpAQCAtMjU3MCw3ICsyODU2LDggQEAKICAqLwogc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKLQkJCQkgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQorCQkJCSAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCByZXQsIG9yaWdfY3JlZGl0cyA9IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqdG1wX3BhdGggPSBOVUxMLCAqcmVzdGFydF9wYXRoID0gTlVMTDsKQEAgLTI1ODQsNyArMjg3MSw3IEBACiAJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCA9PSAwKSB7CiByaWdodG1vc3Rfbm9fZGVsZXRlOgogCQkvKgotCQkgKiBJbi1pbm9kZSBleHRlbnRzLiBUaGlzIGlzIHRyaXZpYWxseSBoYW5kbGVkLCBzbyBkbworCQkgKiBJbmxpbmUgZXh0ZW50cy4gVGhpcyBpcyB0cml2aWFsbHkgaGFuZGxlZCwgc28gZG8KIAkJICogaXQgdXAgZnJvbnQuCiAJCSAqLwogCQlyZXQgPSBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdChpbm9kZSwgaGFuZGxlLApAQCAtMjYzOCw3ICsyOTI1LDcgQEAKIAkJICovCiAKIAkJcmV0ID0gb2NmczJfcmVtb3ZlX3JpZ2h0bW9zdF9wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgsCi0JCQkJCQkgIGRlYWxsb2MpOworCQkJCQkJICBkZWFsbG9jLCBldCk7CiAJCWlmIChyZXQpCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMjY1MCw3ICsyOTM3LDcgQEAKIAkgKi8KIHRyeV9yb3RhdGU6CiAJcmV0ID0gX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIG9yaWdfY3JlZGl0cywgcGF0aCwKLQkJCQkgICAgICAgZGVhbGxvYywgJnJlc3RhcnRfcGF0aCk7CisJCQkJICAgICAgIGRlYWxsb2MsICZyZXN0YXJ0X3BhdGgsIGV0KTsKIAlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0yNjYyLDcgKzI5NDksNyBAQAogCiAJCXJldCA9IF9fb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBvcmlnX2NyZWRpdHMsCiAJCQkJCSAgICAgICB0bXBfcGF0aCwgZGVhbGxvYywKLQkJCQkJICAgICAgICZyZXN0YXJ0X3BhdGgpOworCQkJCQkgICAgICAgJnJlc3RhcnRfcGF0aCwgZXQpOwogCQlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTI5NDgsNiArMzIzNSw3IEBACiAJCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAogCQkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJaW50IGluZGV4KQogewogCWludCByZXQsIGksIHN1YnRyZWVfaW5kZXggPSAwLCBoYXNfZW1wdHlfZXh0ZW50ID0gMDsKQEAgLTMwNjgsNyArMzM1Niw4IEBACiAJCSAgICBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAxKSB7CiAKIAkJCXJldCA9IG9jZnMyX3JlbW92ZV9yaWdodG1vc3RfcGF0aChpbm9kZSwgaGFuZGxlLAotCQkJCQkJCSAgcmlnaHRfcGF0aCwgZGVhbGxvYyk7CisJCQkJCQkJICByaWdodF9wYXRoLAorCQkJCQkJCSAgZGVhbGxvYywgZXQpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKQEAgLTMwOTUsNyArMzM4NCw4IEBACiAJCQkJICAgICBpbnQgc3BsaXRfaW5kZXgsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCi0JCQkJICAgICBzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCAqY3R4dCkKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0ICpjdHh0LAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKIAogewogCWludCByZXQgPSAwOwpAQCAtMzExMyw3ICszNDAzLDcgQEAKIAkJICogaWxsZWdhbC4KIAkJICovCiAJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwKLQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCQkJICAgICBkZWFsbG9jLCBldCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzE1Niw3ICszNDQ2LDggQEAKIAkJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKIAogCQkvKiBUaGUgbWVyZ2UgbGVmdCB1cyB3aXRoIGFuIGVtcHR5IGV4dGVudCwgcmVtb3ZlIGl0LiAqLwotCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MpOworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsCisJCQkJCSAgICAgZGVhbGxvYywgZXQpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTMxNzAsNyArMzQ2MSw3IEBACiAJCSAqLwogCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfbGVmdChpbm9kZSwgcGF0aCwKIAkJCQkJICAgaGFuZGxlLCByZWMsCi0JCQkJCSAgIGRlYWxsb2MsCisJCQkJCSAgIGRlYWxsb2MsIGV0LAogCQkJCQkgICBzcGxpdF9pbmRleCk7CiAKIAkJaWYgKHJldCkgewpAQCAtMzE3OSw3ICszNDcwLDcgQEAKIAkJfQogCiAJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwKLQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCQkJICAgICBkZWFsbG9jLCBldCk7CiAJCS8qCiAJCSAqIEVycm9yIGZyb20gdGhpcyBsYXN0IHJvdGF0ZSBpcyBub3QgY3JpdGljYWwsIHNvCiAJCSAqIHByaW50IGJ1dCBkb24ndCBidWJibGUgaXQgdXAuCkBAIC0zMTk5LDcgKzM0OTAsNyBAQAogCQkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX2xlZnQoaW5vZGUsCiAJCQkJCQkgICBwYXRoLAogCQkJCQkJICAgaGFuZGxlLCBzcGxpdF9yZWMsCi0JCQkJCQkgICBkZWFsbG9jLAorCQkJCQkJICAgZGVhbGxvYywgZXQsCiAJCQkJCQkgICBzcGxpdF9pbmRleCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzIyMiw3ICszNTEzLDcgQEAKIAkJCSAqIG91ciBsZWFmLiBUcnkgdG8gcm90YXRlIGl0IGF3YXkuCiAJCQkgKi8KIAkJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwKLQkJCQkJCSAgICAgZGVhbGxvYyk7CisJCQkJCQkgICAgIGRlYWxsb2MsIGV0KTsKIAkJCWlmIChyZXQpCiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJcmV0ID0gMDsKQEAgLTMzNTYsMTYgKzM2NDcsNiBAQAogCW9jZnMyX3JvdGF0ZV9sZWFmKGVsLCBpbnNlcnRfcmVjKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX3VwZGF0ZV9kaW5vZGVfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJCQkJdTMyIGNsdXN0ZXJzKQotewotCWxlMzJfYWRkX2NwdSgmZGktPmlfY2x1c3RlcnMsIGNsdXN0ZXJzKTsKLQlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdShkaS0+aV9jbHVzdGVycyk7Ci0Jc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLX0KLQogc3RhdGljIHZvaWQgb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLApAQCAtMzU2Nyw4ICszODQ4LDggQEAKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gb25seSBkb2VzIGluc2VydHMgb24gYW4gYWxsb2NhdGlvbiBiLXRyZWUuIEZvciBkaW5vZGUKLSAqIGxpc3RzLCBvY2ZzMl9pbnNlcnRfYXRfbGVhZigpIGlzIGNhbGxlZCBkaXJlY3RseS4KKyAqIFRoaXMgZnVuY3Rpb24gb25seSBkb2VzIGluc2VydHMgb24gYW4gYWxsb2NhdGlvbiBiLXRyZWUuIEZvciB0cmVlCisgKiBkZXB0aCA9IDAsIG9jZnMyX2luc2VydF9hdF9sZWFmKCkgaXMgY2FsbGVkIGRpcmVjdGx5LgogICoKICAqIHJpZ2h0X3BhdGggaXMgdGhlIHBhdGggd2Ugd2FudCB0byBkbyB0aGUgYWN0dWFsIGluc2VydAogICogaW4uIGxlZnRfcGF0aCBzaG91bGQgb25seSBiZSBwYXNzZWQgaW4gaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhhdApAQCAtMzY2NSw3ICszOTQ2LDcgQEAKIAogc3RhdGljIGludCBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKIAkJCQkgIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSAqdHlwZSkKIHsKQEAgLTM2NzMsMTMgKzM5NTQsMTEgQEAKIAl1MzIgY3BvczsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAotCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKLQllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwllbCA9IGV0LT5ldF9yb290X2VsOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCiAJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzY5MSw3ICszOTcwLDcgQEAKIAkJZ290byBvdXRfdXBkYXRlX2NsdXN0ZXJzOwogCX0KIAotCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKGV0LT5ldF9yb290X2JoLCBldC0+ZXRfcm9vdF9lbCk7CiAJaWYgKCFyaWdodF9wYXRoKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTM3NDEsNyArNDAyMCw3IEBACiAJCSAqIG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KCkgbWlnaHQgaGF2ZSBleHRlbmRlZCB0aGUKIAkJICogdHJhbnNhY3Rpb24gd2l0aG91dCByZS1qb3VybmFsaW5nIG91ciB0cmVlIHJvb3QuCiAJCSAqLwotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCiAJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzc2NiwxMCArNDA0NSwxMCBAQAogCiBvdXRfdXBkYXRlX2NsdXN0ZXJzOgogCWlmICh0eXBlLT5pbnNfc3BsaXQgPT0gU1BMSVRfTk9ORSkKLQkJb2NmczJfdXBkYXRlX2Rpbm9kZV9jbHVzdGVycyhpbm9kZSwgZGksCi0JCQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCW9jZnMyX2V0X3VwZGF0ZV9jbHVzdGVycyhpbm9kZSwgZXQsCisJCQkJCSBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGV0LT5ldF9yb290X2JoKTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CiAKQEAgLTM4OTksNyArNDE3OCw4IEBACiBzdGF0aWMgdm9pZCBvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSAqaW5zZXJ0LAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjKQorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewogCWludCBpOwogCWVudW0gb2NmczJfY29udGlnX3R5cGUgY29udGlnX3R5cGUgPSBDT05USUdfTk9ORTsKQEAgLTM5MTUsNiArNDE5NSwyMSBAQAogCQl9CiAJfQogCWluc2VydC0+aW5zX2NvbnRpZyA9IGNvbnRpZ190eXBlOworCisJaWYgKGluc2VydC0+aW5zX2NvbnRpZyAhPSBDT05USUdfTk9ORSkgeworCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0KKwkJCQkmZWwtPmxfcmVjc1tpbnNlcnQtPmluc19jb250aWdfaW5kZXhdOworCQl1bnNpZ25lZCBpbnQgbGVuID0gbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpICsKKwkJCQkgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCisJCS8qCisJCSAqIENhbGxlciBtaWdodCB3YW50IHVzIHRvIGxpbWl0IHRoZSBzaXplIG9mIGV4dGVudHMsIGRvbid0CisJCSAqIGNhbGN1bGF0ZSBjb250aWd1b3VzbmVzcyBpZiB3ZSBtaWdodCBleGNlZWQgdGhhdCBsaW1pdC4KKwkJICovCisJCWlmIChldC0+ZXRfbWF4X2xlYWZfY2x1c3RlcnMgJiYKKwkJICAgIChsZW4gPiBldC0+ZXRfbWF4X2xlYWZfY2x1c3RlcnMpKQorCQkJaW5zZXJ0LT5pbnNfY29udGlnID0gQ09OVElHX05PTkU7CisJfQogfQogCiAvKgpAQCAtMzkyMyw4ICs0MjE4LDggQEAKICAqIG9jZnMyX2ZpZ3VyZV9hcHBlbmRpbmdfdHlwZSgpIHdpbGwgZmlndXJlIG91dCB3aGV0aGVyIHdlJ2xsIGhhdmUgdG8KICAqIGluc2VydCBhdCB0aGUgdGFpbCBvZiB0aGUgcmlnaHRtb3N0IGxlYWYuCiAgKgotICogVGhpcyBzaG91bGQgYWxzbyB3b3JrIGFnYWluc3QgdGhlIGRpbm9kZSBsaXN0IGZvciB0cmVlJ3Mgd2l0aCAwCi0gKiBkZXB0aC4gSWYgd2UgY29uc2lkZXIgdGhlIGRpbm9kZSBsaXN0IHRvIGJlIHRoZSByaWdodG1vc3QgbGVhZiBub2RlCisgKiBUaGlzIHNob3VsZCBhbHNvIHdvcmsgYWdhaW5zdCB0aGUgcm9vdCBleHRlbnQgbGlzdCBmb3IgdHJlZSdzIHdpdGggMAorICogZGVwdGguIElmIHdlIGNvbnNpZGVyIHRoZSByb290IGV4dGVudCBsaXN0IHRvIGJlIHRoZSByaWdodG1vc3QgbGVhZiBub2RlCiAgKiB0aGVuIHRoZSBsb2dpYyBoZXJlIG1ha2VzIHNlbnNlLgogICovCiBzdGF0aWMgdm9pZCBvY2ZzMl9maWd1cmVfYXBwZW5kaW5nX3R5cGUoc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCkBAIC0zOTc1LDE0ICs0MjcwLDEzIEBACiAgKiBzdHJ1Y3R1cmUuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZmlndXJlX2luc2VydF90eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjLAogCQkJCSAgICBpbnQgKmZyZWVfcmVjb3JkcywKIAkJCQkgICAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoID0gTlVMTDsKQEAgLTM5OTAsNyArNDI4NCw3IEBACiAKIAlpbnNlcnQtPmluc19zcGxpdCA9IFNQTElUX05PTkU7CiAKLQllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwllbCA9IGV0LT5ldF9yb290X2VsOwogCWluc2VydC0+aW5zX3RyZWVfZGVwdGggPSBsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKTsKIAogCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7CkBAIC00MDAwLDkgKzQyOTQsNyBAQAogCQkgKiBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoKSBhbmQgb2NmczJfYWRkX2JyYW5jaCgpCiAJCSAqIG1heSB3YW50IGl0IGxhdGVyLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCi0JCQkJICAgICAgIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSwgJmJoLAotCQkJCSAgICAgICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KSwgJmJoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19leGl0KHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQwMjMsMTIgKzQzMTUsMTIgQEAKIAkJbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CiAKIAlpZiAoIWluc2VydC0+aW5zX3RyZWVfZGVwdGgpIHsKLQkJb2NmczJfZmlndXJlX2NvbnRpZ190eXBlKGlub2RlLCBpbnNlcnQsIGVsLCBpbnNlcnRfcmVjKTsKKwkJb2NmczJfZmlndXJlX2NvbnRpZ190eXBlKGlub2RlLCBpbnNlcnQsIGVsLCBpbnNlcnRfcmVjLCBldCk7CiAJCW9jZnMyX2ZpZ3VyZV9hcHBlbmRpbmdfdHlwZShpbnNlcnQsIGVsLCBpbnNlcnRfcmVjKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlwYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKIAlpZiAoIXBhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDA1Nyw3ICs0MzQ5LDcgQEAKICAgICAgICAgICogICAgIGludG8gdHdvIHR5cGVzIG9mIGFwcGVuZHM6IHNpbXBsZSByZWNvcmQgYXBwZW5kLCBvciBhCiAgICAgICAgICAqICAgICByb3RhdGUgaW5zaWRlIHRoZSB0YWlsIGxlYWYuCiAJICovCi0Jb2NmczJfZmlndXJlX2NvbnRpZ190eXBlKGlub2RlLCBpbnNlcnQsIGVsLCBpbnNlcnRfcmVjKTsKKwlvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoaW5vZGUsIGluc2VydCwgZWwsIGluc2VydF9yZWMsIGV0KTsKIAogCS8qCiAJICogVGhlIGluc2VydCBjb2RlIGlzbid0IHF1aXRlIHJlYWR5IHRvIGRlYWwgd2l0aCBhbGwgY2FzZXMgb2YKQEAgLTQwNzgsNyArNDM3MCw4IEBACiAJICogdGhlIGNhc2UgdGhhdCB3ZSdyZSBkb2luZyBhIHRhaWwgYXBwZW5kLCBzbyBtYXliZSB3ZSBjYW4KIAkgKiB0YWtlIGFkdmFudGFnZSBvZiB0aGF0IGluZm9ybWF0aW9uIHNvbWVob3cuCiAJICovCi0JaWYgKGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSA9PSBwYXRoX2xlYWZfYmgocGF0aCktPmJfYmxvY2tucikgeworCWlmIChvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpID09CisJICAgIHBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yKSB7CiAJCS8qCiAJCSAqIE9rLCBvY2ZzMl9maW5kX3BhdGgoKSByZXR1cm5lZCB1cyB0aGUgcmlnaHRtb3N0CiAJCSAqIHRyZWUgcGF0aC4gVGhpcyBtaWdodCBiZSBhbiBhcHBlbmRpbmcgaW5zZXJ0LiBUaGVyZSBhcmUKQEAgLTQxMDgsNyArNDQwMSw3IEBACiBpbnQgb2NmczJfaW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQl1MzIgY3BvcywKIAkJCXU2NCBzdGFydF9ibGssCiAJCQl1MzIgbmV3X2NsdXN0ZXJzLApAQCAtNDEyMSwyNiArNDQxNCwyMSBAQAogCXN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSBpbnNlcnQgPSB7MCwgfTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyByZWM7CiAKLQlCVUdfT04oT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKTsKLQogCW1sb2coMCwgImFkZCAldSBjbHVzdGVycyBhdCBwb3NpdGlvbiAldSB0byBpbm9kZSAlbGx1XG4iLAogCSAgICAgbmV3X2NsdXN0ZXJzLCBjcG9zLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAKLQltbG9nX2J1Z19vbl9tc2coIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmCi0JCQkoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzICE9IGNwb3MpLAotCQkJIkRldmljZSAlcywgYXNraW5nIGZvciBzcGFyc2UgYWxsb2NhdGlvbjogaW5vZGUgJWxsdSwgIgotCQkJImNwb3MgJXUsIGNsdXN0ZXJzICV1XG4iLAotCQkJb3NiLT5kZXZfc3RyLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGNwb3MsCi0JCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwotCiAJbWVtc2V0KCZyZWMsIDAsIHNpemVvZihyZWMpKTsKIAlyZWMuZV9jcG9zID0gY3B1X3RvX2xlMzIoY3Bvcyk7CiAJcmVjLmVfYmxrbm8gPSBjcHVfdG9fbGU2NChzdGFydF9ibGspOwogCXJlYy5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNihuZXdfY2x1c3RlcnMpOwogCXJlYy5lX2ZsYWdzID0gZmxhZ3M7CisJc3RhdHVzID0gb2NmczJfZXRfaW5zZXJ0X2NoZWNrKGlub2RlLCBldCwgJnJlYyk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKKwl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoaW5vZGUsIGZlX2JoLCAmbGFzdF9lYl9iaCwgJnJlYywKKwlzdGF0dXMgPSBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoaW5vZGUsIGV0LCAmbGFzdF9lYl9iaCwgJnJlYywKIAkJCQkJICAmZnJlZV9yZWNvcmRzLCAmaW5zZXJ0KTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC00MTU0LDcgKzQ0NDIsNyBAQAogCSAgICAgZnJlZV9yZWNvcmRzLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwogCiAJaWYgKGluc2VydC5pbnNfY29udGlnID09IENPTlRJR19OT05FICYmIGZyZWVfcmVjb3JkcyA9PSAwKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBmZV9iaCwKKwkJc3RhdHVzID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGV0LAogCQkJCQkgJmluc2VydC5pbnNfdHJlZV9kZXB0aCwgJmxhc3RfZWJfYmgsCiAJCQkJCSBtZXRhX2FjKTsKIAkJaWYgKHN0YXR1cykgewpAQCAtNDE2NCwyMCArNDQ1MiwxMjcgQEAKIAl9CiAKIAkvKiBGaW5hbGx5LCB3ZSBjYW4gYWRkIGNsdXN0ZXJzLiBUaGlzIG1pZ2h0IHJvdGF0ZSB0aGUgdHJlZSBmb3IgdXMuICovCi0Jc3RhdHVzID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBmZV9iaCwgJnJlYywgJmluc2VydCk7CisJc3RhdHVzID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBldCwgJnJlYywgJmluc2VydCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQllbHNlCisJZWxzZSBpZiAoZXQtPmV0X29wcyA9PSAmb2NmczJfZGlub2RlX2V0X29wcykKIAkJb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfcmVjKGlub2RlLCAmcmVjKTsKIAogYmFpbDoKLQlpZiAobGFzdF9lYl9iaCkKLQkJYnJlbHNlKGxhc3RfZWJfYmgpOworCWJyZWxzZShsYXN0X2ViX2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBBbGxjYXRlIGFuZCBhZGQgY2x1c3RlcnMgaW50byB0aGUgZXh0ZW50IGItdHJlZS4KKyAqIFRoZSBuZXcgY2x1c3RlcnMoY2x1c3RlcnNfdG9fYWRkKSB3aWxsIGJlIGluc2VydGVkIGF0IGxvZ2ljYWxfb2Zmc2V0LgorICogVGhlIGV4dGVudCBiLXRyZWUncyByb290IGlzIHNwZWNpZmllZCBieSBldCwgYW5kCisgKiBpdCBpcyBub3QgbGltaXRlZCB0byB0aGUgZmlsZSBzdG9yYWdlLiBBbnkgZXh0ZW50IHRyZWUgY2FuIHVzZSB0aGlzCisgKiBmdW5jdGlvbiBpZiBpdCBpbXBsZW1lbnRzIHRoZSBwcm9wZXIgb2NmczJfZXh0ZW50X3RyZWUuCisgKi8KK2ludCBvY2ZzMl9hZGRfY2x1c3RlcnNfaW5fYnRyZWUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQl1MzIgKmxvZ2ljYWxfb2Zmc2V0LAorCQkJCXUzMiBjbHVzdGVyc190b19hZGQsCisJCQkJaW50IG1hcmtfdW53cml0dGVuLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKKwkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgZnJlZV9leHRlbnRzOworCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHJlYXNvbiA9IFJFU1RBUlRfTk9ORTsKKwl1MzIgYml0X29mZiwgbnVtX2JpdHM7CisJdTY0IGJsb2NrOworCXU4IGZsYWdzID0gMDsKKworCUJVR19PTighY2x1c3RlcnNfdG9fYWRkKTsKKworCWlmIChtYXJrX3Vud3JpdHRlbikKKwkJZmxhZ3MgPSBPQ0ZTMl9FWFRfVU5XUklUVEVOOworCisJZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGlub2RlLCBldCk7CisJaWYgKGZyZWVfZXh0ZW50cyA8IDApIHsKKwkJc3RhdHVzID0gZnJlZV9leHRlbnRzOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJLyogdGhlcmUgYXJlIHR3byBjYXNlcyB3aGljaCBjb3VsZCBjYXVzZSB1cyB0byBFQUdBSU4gaW4gdGhlCisJICogd2UtbmVlZC1tb3JlLW1ldGFkYXRhIGNhc2U6CisJICogMSkgd2UgaGF2ZW4ndCByZXNlcnZlZCAqYW55KgorCSAqIDIpIHdlIGFyZSBzbyBmcmFnbWVudGVkLCB3ZSd2ZSBuZWVkZWQgdG8gYWRkIG1ldGFkYXRhIHRvbworCSAqICAgIG1hbnkgdGltZXMuICovCisJaWYgKCFmcmVlX2V4dGVudHMgJiYgIW1ldGFfYWMpIHsKKwkJbWxvZygwLCAid2UgaGF2ZW4ndCByZXNlcnZlZCBhbnkgbWV0YWRhdGEhXG4iKTsKKwkJc3RhdHVzID0gLUVBR0FJTjsKKwkJcmVhc29uID0gUkVTVEFSVF9NRVRBOworCQlnb3RvIGxlYXZlOworCX0gZWxzZSBpZiAoKCFmcmVlX2V4dGVudHMpCisJCSAgICYmIChvY2ZzMl9hbGxvY19jb250ZXh0X2JpdHNfbGVmdChtZXRhX2FjKQorCQkgICAgICAgPCBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZXQtPmV0X3Jvb3RfZWwpKSkgeworCQltbG9nKDAsICJmaWxlc3lzdGVtIGlzIHJlYWxseSBmcmFnbWVudGVkLi4uXG4iKTsKKwkJc3RhdHVzID0gLUVBR0FJTjsKKwkJcmVhc29uID0gUkVTVEFSVF9NRVRBOworCQlnb3RvIGxlYXZlOworCX0KKworCXN0YXR1cyA9IF9fb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsCisJCQkJCWNsdXN0ZXJzX3RvX2FkZCwgJmJpdF9vZmYsICZudW1fYml0cyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCUJVR19PTihudW1fYml0cyA+IGNsdXN0ZXJzX3RvX2FkZCk7CisKKwkvKiByZXNlcnZlIG91ciB3cml0ZSBlYXJseSAtLSBpbnNlcnRfZXh0ZW50IG1heSB1cGRhdGUgdGhlIGlub2RlICovCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKKwltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciBpbm9kZSAlbGx1XG4iLAorCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwlzdGF0dXMgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJICAgICAqbG9naWNhbF9vZmZzZXQsIGJsb2NrLAorCQkJCSAgICAgbnVtX2JpdHMsIGZsYWdzLCBtZXRhX2FjKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGV0LT5ldF9yb290X2JoKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJY2x1c3RlcnNfdG9fYWRkIC09IG51bV9iaXRzOworCSpsb2dpY2FsX29mZnNldCArPSBudW1fYml0czsKKworCWlmIChjbHVzdGVyc190b19hZGQpIHsKKwkJbWxvZygwLCAibmVlZCB0byBhbGxvYyBvbmNlIG1vcmUsIHdhbnRlZCA9ICV1XG4iLAorCQkgICAgIGNsdXN0ZXJzX3RvX2FkZCk7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJCXJlYXNvbiA9IFJFU1RBUlRfVFJBTlM7CisJfQorCitsZWF2ZToKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlpZiAocmVhc29uX3JldCkKKwkJKnJlYXNvbl9yZXQgPSByZWFzb247CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIHZvaWQgb2NmczJfbWFrZV9yaWdodF9zcGxpdF9yZWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKIAkJCQkgICAgICAgdTMyIGNwb3MsCkBAIC00MjAxLDcgKzQ1OTYsNyBAQAogc3RhdGljIGludCBvY2ZzMl9zcGxpdF9hbmRfaW5zZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCi0JCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCiAJCQkJICBpbnQgc3BsaXRfaW5kZXgsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqb3JpZ19zcGxpdF9yZWMsCkBAIC00MjE1LDcgKzQ2MTAsNiBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHNwbGl0X3JlYyA9ICpvcmlnX3NwbGl0X3JlYzsKIAlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0OwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwotCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCiBsZWZ0cmlnaHQ6CiAJLyoKQEAgLTQyMjQsOCArNDYxOCw3IEBACiAJICovCiAJcmVjID0gcGF0aF9sZWFmX2VsKHBhdGgpLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOwogCi0JZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7Ci0JcmlnaHRtb3N0X2VsID0gJmRpLT5pZDIuaV9saXN0OworCXJpZ2h0bW9zdF9lbCA9IGV0LT5ldF9yb290X2VsOwogCiAJZGVwdGggPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfdHJlZV9kZXB0aCk7CiAJaWYgKGRlcHRoKSB7CkBAIC00MjM2LDggKzQ2MjksOCBAQAogCiAJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PQogCSAgICBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpKSB7Ci0JCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJmRlcHRoLCBsYXN0X2ViX2JoLAotCQkJCSAgICAgIG1ldGFfYWMpOworCQlyZXQgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZXQsCisJCQkJICAgICAgJmRlcHRoLCBsYXN0X2ViX2JoLCBtZXRhX2FjKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC00Mjc0LDggKzQ2NjcsNyBAQAogCQlkb19sZWZ0cmlnaHQgPSAxOwogCX0KIAotCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZzcGxpdF9yZWMsCi0JCQkJICAgICAmaW5zZXJ0KTsKKwlyZXQgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGV0LCAmc3BsaXRfcmVjLCAmaW5zZXJ0KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC00MzE3LDggKzQ3MDksOSBAQAogICogb2YgdGhlIHRyZWUgaXMgcmVxdWlyZWQuIEFsbCBvdGhlciBjYXNlcyB3aWxsIGRlZ3JhZGUgaW50byBhIGxlc3MKICAqIG9wdGltYWwgdHJlZSBsYXlvdXQuCiAgKgotICogbGFzdF9lYl9iaCBzaG91bGQgYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIGJsb2NrIGZvciBhbnkgaW5vZGUgd2l0aCBhCi0gKiBidHJlZS4gU2luY2UgYSBzcGxpdCBtYXkgZ3JvdyB0aGUgdHJlZSBvciBhIG1lcmdlIG1pZ2h0IHNocmluayBpdCwgdGhlIGNhbGxlciBjYW5ub3QgdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYnVmZmVyIGFmdGVyIHRoaXMgY2FsbC4KKyAqIGxhc3RfZWJfYmggc2hvdWxkIGJlIHRoZSByaWdodG1vc3QgbGVhZiBibG9jayBmb3IgYW55IGV4dGVudAorICogYnRyZWUuIFNpbmNlIGEgc3BsaXQgbWF5IGdyb3cgdGhlIHRyZWUgb3IgYSBtZXJnZSBtaWdodCBzaHJpbmsgaXQsCisgKiB0aGUgY2FsbGVyIGNhbm5vdCB0cnVzdCB0aGUgY29udGVudHMgb2YgdGhhdCBidWZmZXIgYWZ0ZXIgdGhpcyBjYWxsLgogICoKICAqIFRoaXMgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIHJlYWRhYmlsaXR5IC0gc2V2ZXJhbCBwYXNzZXMgbWlnaHQgYmUKICAqIG1hZGUgb3ZlciBjZXJ0YWluIHBvcnRpb25zIG9mIHRoZSB0cmVlLiBBbGwgb2YgdGhvc2UgYmxvY2tzIHdpbGwKQEAgLTQzMjYsNyArNDcxOSw3IEBACiAgKiBleHRyYSBvdmVyaGVhZCBpcyBub3QgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGRpc2sgcmVhZHMuCiAgKi8KIHN0YXRpYyBpbnQgX19vY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAogCQkJCSAgICAgICBpbnQgc3BsaXRfaW5kZXgsCkBAIC00MzY2LDExICs0NzU5LDkgQEAKIAkgKi8KIAlpZiAocGF0aC0+cF90cmVlX2RlcHRoKSB7CiAJCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwotCQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAotCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksCisJCQkJICAgICAgICZsYXN0X2ViX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19leGl0KHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQ0MDMsNyArNDc5NCw3IEBACiAJCWlmIChjdHh0LmNfc3BsaXRfY292ZXJzX3JlYykKIAkJCWVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdID0gKnNwbGl0X3JlYzsKIAkJZWxzZQotCQkJcmV0ID0gb2NmczJfc3BsaXRfYW5kX2luc2VydChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkaV9iaCwKKwkJCXJldCA9IG9jZnMyX3NwbGl0X2FuZF9pbnNlcnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZXQsCiAJCQkJCQkgICAgICZsYXN0X2ViX2JoLCBzcGxpdF9pbmRleCwKIAkJCQkJCSAgICAgc3BsaXRfcmVjLCBtZXRhX2FjKTsKIAkJaWYgKHJldCkKQEAgLTQ0MTEsNyArNDgwMiw3IEBACiAJfSBlbHNlIHsKIAkJcmV0ID0gb2NmczJfdHJ5X3RvX21lcmdlX2V4dGVudChpbm9kZSwgaGFuZGxlLCBwYXRoLAogCQkJCQkJc3BsaXRfaW5kZXgsIHNwbGl0X3JlYywKLQkJCQkJCWRlYWxsb2MsICZjdHh0KTsKKwkJCQkJCWRlYWxsb2MsICZjdHh0LCBldCk7CiAJCWlmIChyZXQpCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJfQpAQCAtNDQyOSw3ICs0ODIwLDggQEAKICAqCiAgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwYXNzaW5nIGRvd24gbWV0YV9hYyBpZiB3ZSdsbCBuZWVkIGl0LgogICovCi1pbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAoraW50IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLCB1MzIgY3BvcywgdTMyIGxlbiwgdTMyIHBoeXMsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQpAQCAtNDQ1NSwxMCArNDg0NywxNCBAQAogCS8qCiAJICogWFhYOiBUaGlzIHNob3VsZCBiZSBmaXhlZCB1cCBzbyB0aGF0IHdlIGp1c3QgcmUtaW5zZXJ0IHRoZQogCSAqIG5leHQgZXh0ZW50IHJlY29yZHMuCisJICoKKwkgKiBYWFg6IFRoaXMgaXMgYSBoYWNrIG9uIHRoZSBleHRlbnQgdHJlZSwgbWF5YmUgaXQgc2hvdWxkIGJlCisJICogYW4gb3A/CiAJICovCi0Jb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CisJaWYgKGV0LT5ldF9vcHMgPT0gJm9jZnMyX2Rpbm9kZV9ldF9vcHMpCisJCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOwogCi0JbGVmdF9wYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZGlfYmgpOworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKGV0LT5ldF9yb290X2JoLCBldC0+ZXRfcm9vdF9lbCk7CiAJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDQ4OSw4ICs0ODg1LDkgQEAKIAlzcGxpdF9yZWMuZV9mbGFncyA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpLT5sX3JlY3NbaW5kZXhdLmVfZmxhZ3M7CiAJc3BsaXRfcmVjLmVfZmxhZ3MgJj0gfk9DRlMyX0VYVF9VTldSSVRURU47CiAKLQlyZXQgPSBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIGRpX2JoLCBoYW5kbGUsIGxlZnRfcGF0aCwKLQkJCQkJICBpbmRleCwgJnNwbGl0X3JlYywgbWV0YV9hYywgZGVhbGxvYyk7CisJcmV0ID0gX19vY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKGlub2RlLCBldCwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCSAgaW5kZXgsICZzcGxpdF9yZWMsIG1ldGFfYWMsCisJCQkJCSAgZGVhbGxvYyk7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC00NDk5LDEzICs0ODk2LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9zcGxpdF90cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCitzdGF0aWMgaW50IG9jZnMyX3NwbGl0X3RyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKIAkJCSAgICBpbnQgaW5kZXgsIHUzMiBuZXdfcmFuZ2UsCiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCiB7CiAJaW50IHJldCwgZGVwdGgsIGNyZWRpdHMgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0bW9zdF9lbCwgKmVsOwpAQCAtNDUyMiw5ICs0OTE4LDggQEAKIAogCWRlcHRoID0gcGF0aC0+cF90cmVlX2RlcHRoOwogCWlmIChkZXB0aCA+IDApIHsKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCi0JCQkJICAgICAgIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSwKLQkJCQkgICAgICAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAorCQkJCSAgICAgICAmbGFzdF9lYl9iaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQ1MzUsNyArNDkzMCw4IEBACiAJfSBlbHNlCiAJCXJpZ2h0bW9zdF9lbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKIAotCWNyZWRpdHMgKz0gcGF0aC0+cF90cmVlX2RlcHRoICsgb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKGRpKTsKKwljcmVkaXRzICs9IHBhdGgtPnBfdHJlZV9kZXB0aCArCisJCSAgIG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChldC0+ZXRfcm9vdF9lbCk7CiAJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NTQ0LDcgKzQ5NDAsNyBAQAogCiAJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PQogCSAgICBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpKSB7Ci0JCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJmRlcHRoLCAmbGFzdF9lYl9iaCwKKwkJcmV0ID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGV0LCAmZGVwdGgsICZsYXN0X2ViX2JoLAogCQkJCSAgICAgIG1ldGFfYWMpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NTU4LDcgKzQ5NTQsNyBAQAogCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9SSUdIVDsKIAlpbnNlcnQuaW5zX3RyZWVfZGVwdGggPSBkZXB0aDsKIAotCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZzcGxpdF9yZWMsICZpbnNlcnQpOworCXJldCA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZXQsICZzcGxpdF9yZWMsICZpbnNlcnQpOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtNDU3MCw3ICs0OTY2LDggQEAKIHN0YXRpYyBpbnQgb2NmczJfdHJ1bmNhdGVfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgaW50IGluZGV4LAogCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCi0JCQkgICAgICB1MzIgY3BvcywgdTMyIGxlbikKKwkJCSAgICAgIHUzMiBjcG9zLCB1MzIgbGVuLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKIHsKIAlpbnQgcmV0OwogCXUzMiBsZWZ0X2Nwb3MsIHJlY19yYW5nZSwgdHJ1bmNfcmFuZ2U7CkBAIC00NTgyLDcgKzQ5NzksNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCiAJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkgJiYgaW5kZXggPiAwKSB7Ci0JCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYyk7CisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYywgZXQpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQ3MTMsNyArNTExMCw3IEBACiAKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKHBhdGgpKTsKIAotCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYyk7CisJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBwYXRoLCBkZWFsbG9jLCBldCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNDcyNCw3ICs1MTIxLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAoraW50IG9jZnMyX3JlbW92ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQl1MzIgY3BvcywgdTMyIGxlbiwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCkBAIC00NzMzLDExICs1MTMxLDExIEBACiAJdTMyIHJlY19yYW5nZSwgdHJ1bmNfcmFuZ2U7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwotCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoOworCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoID0gTlVMTDsKIAogCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOwogCi0JcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlwYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKIAlpZiAoIXBhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNDc5MCwxMyArNTE4OCwxMyBAQAogCiAJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zIHx8IHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgewogCQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9yZWMoaW5vZGUsIGhhbmRsZSwgcGF0aCwgaW5kZXgsIGRlYWxsb2MsCi0JCQkJCSBjcG9zLCBsZW4pOworCQkJCQkgY3BvcywgbGVuLCBldCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfSBlbHNlIHsKLQkJcmV0ID0gb2NmczJfc3BsaXRfdHJlZShpbm9kZSwgZGlfYmgsIGhhbmRsZSwgcGF0aCwgaW5kZXgsCisJCXJldCA9IG9jZnMyX3NwbGl0X3RyZWUoaW5vZGUsIGV0LCBoYW5kbGUsIHBhdGgsIGluZGV4LAogCQkJCSAgICAgICB0cnVuY19yYW5nZSwgbWV0YV9hYyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQ4NDUsNyArNTI0Myw3IEBACiAJCX0KIAogCQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9yZWMoaW5vZGUsIGhhbmRsZSwgcGF0aCwgaW5kZXgsIGRlYWxsb2MsCi0JCQkJCSBjcG9zLCBsZW4pOworCQkJCQkgY3BvcywgbGVuLCBldCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNTE4OCw4ICs1NTg2LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKLQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpcHV0KGlub2RlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNTI2NCw4ICs1NjYxLDcgQEAKIGJhaWw6CiAJaWYgKHRsX2lub2RlKQogCQlpcHV0KHRsX2lub2RlKTsKLQlpZiAodGxfYmgpCi0JCWJyZWxzZSh0bF9iaCk7CisJYnJlbHNlKHRsX2JoKTsKIAogCWlmIChzdGF0dXMgPCAwICYmICgqdGxfY29weSkpIHsKIAkJa2ZyZWUoKnRsX2NvcHkpOwpAQCAtNjAwOCwyMCArNjQwNCwxMyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfd3JpdGViYWNrX3plcm9fZnVuYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBvY2ZzMl96ZXJvX2Z1bmMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfb3JkZXJlZF96ZXJvX2Z1bmMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JcmV0dXJuIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGUsIGJoKTsKLX0KLQogc3RhdGljIHZvaWQgb2NmczJfbWFwX2FuZF9kaXJ0eV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvLAogCQkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB6ZXJvLCB1NjQgKnBoeXMpCkBAIC02MDQwLDE3ICs2NDI5LDE4IEBACiAJICogaGVyZSBpZiB0aGV5IGFyZW4ndCAtIG9jZnMyX21hcF9wYWdlX2Jsb2NrcygpCiAJICogbWlnaHQndmUgc2tpcHBlZCBzb21lCiAJICovCi0JaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgewotCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsCi0JCQkJCXBhZ2VfYnVmZmVycyhwYWdlKSwKLQkJCQkJZnJvbSwgdG8sICZwYXJ0aWFsLAotCQkJCQlvY2ZzMl9vcmRlcmVkX3plcm9fZnVuYyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJbWxvZ19lcnJubyhyZXQpOwotCX0gZWxzZSB7CisJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCisJCQkJZnJvbSwgdG8sICZwYXJ0aWFsLAorCQkJCW9jZnMyX3plcm9fZnVuYyk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKKwllbHNlIGlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKKwkJcmV0ID0gb2NmczJfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECiAJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLAogCQkJCQlmcm9tLCB0bywgJnBhcnRpYWwsCi0JCQkJCW9jZnMyX3dyaXRlYmFja196ZXJvX2Z1bmMpOworCQkJCQlvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworI2VuZGlmCiAJCWlmIChyZXQgPCAwKQogCQkJbWxvZ19lcnJubyhyZXQpOwogCX0KQEAgLTYyMTUsMjAgKzY2MDUsMjkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX2Rpbm9kZV9pZDIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCitzdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX2Rpbm9kZV9pZDJfd2l0aF94YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKQogewogCXVuc2lnbmVkIGludCBibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXVuc2lnbmVkIGludCB4YXR0cnNpemUgPSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSk7CiAKLQltZW1zZXQoJmRpLT5pZDIsIDAsIGJsb2Nrc2l6ZSAtIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMikpOworCWlmIChsZTE2X3RvX2NwdShkaS0+aV9keW5fZmVhdHVyZXMpICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKQorCQltZW1zZXQoJmRpLT5pZDIsIDAsIGJsb2Nrc2l6ZSAtCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMikgLQorCQkJCSAgICB4YXR0cnNpemUpOworCWVsc2UKKwkJbWVtc2V0KCZkaS0+aWQyLCAwLCBibG9ja3NpemUgLQorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfZGlub2RlLCBpZDIpKTsKIH0KIAogdm9pZCBvY2ZzMl9kaW5vZGVfbmV3X2V4dGVudF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKIHsKLQlvY2ZzMl96ZXJvX2Rpbm9kZV9pZDIoaW5vZGUsIGRpKTsKKwlvY2ZzMl96ZXJvX2Rpbm9kZV9pZDJfd2l0aF94YXR0cihpbm9kZSwgZGkpOwogCWRpLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCA9IDA7CiAJZGktPmlkMi5pX2xpc3QubF9uZXh0X2ZyZWVfcmVjID0gMDsKLQlkaS0+aWQyLmlfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYob2NmczJfZXh0ZW50X3JlY3NfcGVyX2lub2RlKGlub2RlLT5pX3NiKSk7CisJZGktPmlkMi5pX2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KAorCQlvY2ZzMl9leHRlbnRfcmVjc19wZXJfaW5vZGVfd2l0aF94YXR0cihpbm9kZS0+aV9zYiwgZGkpKTsKIH0KIAogdm9pZCBvY2ZzMl9zZXRfaW5vZGVfZGF0YV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCkBAIC02MjQ1LDkgKzY2NDQsMTAgQEAKIAkgKiBXZSBjbGVhciB0aGUgZW50aXJlIGlfZGF0YSBzdHJ1Y3R1cmUgaGVyZSBzbyB0aGF0IGFsbAogCSAqIGZpZWxkcyBjYW4gYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCiAJICovCi0Jb2NmczJfemVyb19kaW5vZGVfaWQyKGlub2RlLCBkaSk7CisJb2NmczJfemVyb19kaW5vZGVfaWQyX3dpdGhfeGF0dHIoaW5vZGUsIGRpKTsKIAotCWlkYXRhLT5pZF9jb3VudCA9IGNwdV90b19sZTE2KG9jZnMyX21heF9pbmxpbmVfZGF0YShpbm9kZS0+aV9zYikpOworCWlkYXRhLT5pZF9jb3VudCA9IGNwdV90b19sZTE2KAorCQkJb2NmczJfbWF4X2lubGluZV9kYXRhX3dpdGhfeGF0dHIoaW5vZGUtPmlfc2IsIGRpKSk7CiB9CiAKIGludCBvY2ZzMl9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTYyNjIsNiArNjY2Miw3IEBACiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwogCWxvZmZfdCBlbmQgPSBvc2ItPnNfY2x1c3RlcnNpemU7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCiAJaGFzX2RhdGEgPSBpX3NpemVfcmVhZChpbm9kZSkgPyAxIDogMDsKIApAQCAtNjM2MSw3ICs2NzYyLDggQEAKIAkJICogdGhpcyBwcm92ZXMgdG8gYmUgZmFsc2UsIHdlIGNvdWxkIGFsd2F5cyByZS1idWlsZAogCQkgKiB0aGUgaW4taW5vZGUgZGF0YSBmcm9tIG91ciBwYWdlcy4KIAkJICovCi0JCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgZGlfYmgpOworCQlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgJmV0LAogCQkJCQkgIDAsIGJsb2NrLCAxLCAwLCBOVUxMKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNjQwNCwxMyArNjgwNiwxNCBAQAogCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWZlX2JoLT5iX2RhdGE7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAogCW5ld19oaWdoZXN0X2Nwb3MgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwKIAkJCQkJCSAgICAgaV9zaXplX3JlYWQoaW5vZGUpKTsKIAotCXBhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChmZV9iaCk7CisJcGF0aCA9IG9jZnMyX25ld19wYXRoKGZlX2JoLCAmZGktPmlkMi5pX2xpc3QpOwogCWlmICghcGF0aCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02NTgxLDggKzY5ODQsOCBAQAogCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCYoKnRjKS0+dGNfZGVhbGxvYyk7CiAKIAlpZiAoZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCi0JCQkJCSAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCisJCQkJCSAgJmxhc3RfZWJfYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwpAQCAtNjY5NSw4ICs3MDk4LDcgQEAKIAkJbWxvZyhNTF9OT1RJQ0UsCiAJCSAgICAgIlRydW5jYXRlIGNvbXBsZXRpb24gaGFzIG5vbi1lbXB0eSBkZWFsbG9jIGNvbnRleHRcbiIpOwogCi0JaWYgKHRjLT50Y19sYXN0X2ViX2JoKQotCQlicmVsc2UodGMtPnRjX2xhc3RfZWJfYmgpOworCWJyZWxzZSh0Yy0+dGNfbGFzdF9lYl9iaCk7CiAKIAlrZnJlZSh0Yyk7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCA0MmZmOTRiLi43MDI1N2M4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTI2LDMwICsyNiwxMDIgQEAKICNpZm5kZWYgT0NGUzJfQUxMT0NfSAogI2RlZmluZSBPQ0ZTMl9BTExPQ19ICiAKKworLyoKKyAqIEZvciB4YXR0ciB0cmVlIGxlYWYsIHdlIGxpbWl0IHRoZSBsZWFmIGJ5dGUgc2l6ZSB0byBiZSA2NEsuCisgKi8KKyNkZWZpbmUgT0NGUzJfTUFYX1hBVFRSX1RSRUVfTEVBRl9TSVpFIDY1NTM2CisKKy8qCisgKiBvY2ZzMl9leHRlbnRfdHJlZSBhbmQgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyBhcmUgdXNlZCB0byBhYnN0cmFjdAorICogdGhlIGItdHJlZSBvcGVyYXRpb25zIGluIG9jZnMyLiBOb3cgYWxsIHRoZSBiLXRyZWUgb3BlcmF0aW9ucyBhcmUgbm90CisgKiBsaW1pdGVkIHRvIG9jZnMyX2Rpbm9kZSBvbmx5LiBBbnkgZGF0YSB3aGljaCBuZWVkIHRvIGFsbG9jYXRlIGNsdXN0ZXJzCisgKiB0byBzdG9yZSBjYW4gdXNlIGItdHJlZS4gQW5kIGl0IG9ubHkgbmVlZHMgdG8gaW1wbGVtZW50IGl0cyBvY2ZzMl9leHRlbnRfdHJlZQorICogYW5kIG9wZXJhdGlvbi4KKyAqCisgKiBvY2ZzMl9leHRlbnRfdHJlZSBiZWNvbWVzIHRoZSBmaXJzdC1jbGFzcyBvYmplY3QgZm9yIGV4dGVudCB0cmVlCisgKiBtYW5pcHVsYXRpb24uICBDYWxsZXJzIG9mIHRoZSBhbGxvYy5jIGNvZGUgbmVlZCB0byBmaWxsIGl0IHZpYSBvbmUgb2YKKyAqIHRoZSBvY2ZzMl9pbml0XypfZXh0ZW50X3RyZWUoKSBvcGVyYXRpb25zIGJlbG93LgorICoKKyAqIG9jZnMyX2V4dGVudF90cmVlIGNvbnRhaW5zIGluZm8gZm9yIHRoZSByb290IG9mIHRoZSBiLXRyZWUsIGl0IG11c3QgaGF2ZSBhCisgKiByb290IG9jZnMyX2V4dGVudF9saXN0IGFuZCBhIHJvb3RfYmggc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGluIHRoZSBiLXRyZWUKKyAqIGZ1bmN0aW9ucy4KKyAqIG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgYWJzdHJhY3QgdGhlIG5vcm1hbCBvcGVyYXRpb25zIHdlIGRvIGZvcgorICogdGhlIHJvb3Qgb2YgZXh0ZW50IGItdHJlZS4KKyAqLworc3RydWN0IG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnM7CitzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgeworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zCSpldF9vcHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCQkJKmV0X3Jvb3RfYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0CQkqZXRfcm9vdF9lbDsKKwl2b2lkCQkJCQkqZXRfb2JqZWN0OworCXVuc2lnbmVkIGludAkJCQlldF9tYXhfbGVhZl9jbHVzdGVyczsKK307CisKKy8qCisgKiBvY2ZzMl9pbml0XypfZXh0ZW50X3RyZWUoKSB3aWxsIGZpbGwgYW4gb2NmczJfZXh0ZW50X3RyZWUgZnJvbSB0aGUKKyAqIHNwZWNpZmllZCBvYmplY3QgYnVmZmVyLgorICovCit2b2lkIG9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgb2NmczJfaW5pdF94YXR0cl90cmVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dik7CisKIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0OwogaW50IG9jZnMyX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICppbm9kZSwKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCisJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJdTMyIGNwb3MsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdTMyIG5ld19jbHVzdGVycywKIAkJCXU4IGZsYWdzLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpOworCitlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCB7CisJUkVTVEFSVF9OT05FID0gMCwKKwlSRVNUQVJUX1RSQU5TLAorCVJFU1RBUlRfTUVUQQorfTsKK2ludCBvY2ZzMl9hZGRfY2x1c3RlcnNfaW5fYnRyZWUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQl1MzIgKmxvZ2ljYWxfb2Zmc2V0LAorCQkJCXUzMiBjbHVzdGVyc190b19hZGQsCisJCQkJaW50IG1hcmtfdW53cml0dGVuLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKKwkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCk7CiBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dDsKLWludCBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCitpbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHUzMiBjcG9zLCB1MzIgbGVuLCB1MzIgcGh5cywKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOwotaW50IG9jZnMyX3JlbW92ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKK2ludCBvY2ZzMl9yZW1vdmVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKIAkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKIGludCBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlKTsKLS8qIGhvdyBtYW55IG5ldyBtZXRhZGF0YSBjaHVua3Mgd291bGQgYW4gYWxsb2NhdGlvbiBuZWVkIGF0IG1heGltdW0/ICovCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUpCisJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KTsKKworLyoKKyAqIGhvdyBtYW55IG5ldyBtZXRhZGF0YSBjaHVua3Mgd291bGQgYW4gYWxsb2NhdGlvbiBuZWVkIGF0IG1heGltdW0/CisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgcm9vdF9lbCBpcyB0aGUgcm9vdAorICogb2YgZXh0ZW50IHRyZWUuIFNvIGZvciBhbiBpbm9kZSwgaXQgc2hvdWxkIGJlICZmZS0+aWQyLmlfbGlzdC4gT3RoZXJ3aXNlCisgKiB0aGUgcmVzdWx0IG1heSBiZSB3cm9uZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCkKIHsKIAkvKgogCSAqIFJhdGhlciB0aGFuIGRvIGFsbCB0aGUgd29yayBvZiBkZXRlcm1pbmluZyBob3cgbXVjaCB3ZSBuZWVkCkBAIC01OSw3ICsxMzEsNyBAQAogCSAqIG5ldyB0cmVlX2RlcHRoPT0wIGV4dGVudF9ibG9jaywgYW5kIG9uZSBibG9jayBhdCB0aGUgbmV3CiAJICogdG9wLW9mLXRoZSB0cmVlLgogCSAqLwotCXJldHVybiBsZTE2X3RvX2NwdShmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpICsgMjsKKwlyZXR1cm4gbGUxNl90b19jcHUocm9vdF9lbC0+bF90cmVlX2RlcHRoKSArIDI7CiB9CiAKIHZvaWQgb2NmczJfZGlub2RlX25ld19leHRlbnRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSk7CkBAIC0xNDYsNCArMjE4LDEzIEBACiAJCXJldHVybiBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycyk7CiB9CiAKKy8qCisgKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlYWYgbm9kZXMsIHdoaWNoIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgY2FuCisgKiBoYXZlIGVtcHR5IGV4dGVudHMgYW55d2F5LgorICovCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9pc19lbXB0eV9leHRlbnQoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYykKK3sKKwlyZXR1cm4gIXJlYy0+ZV9sZWFmX2NsdXN0ZXJzOworfQorCiAjZW5kaWYgLyogT0NGUzJfQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IDUwNmMyNGYuLmMyMjU0M2IgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTY4LDkgKzY4LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMjgsOCArMTI2LDcgQEAKIAllcnIgPSAwOwogCiBiYWlsOgotCWlmIChiaCkKLQkJYnJlbHNlKGJoKTsKKwlicmVsc2UoYmgpOwogCiAJbWxvZ19leGl0KGVycik7CiAJcmV0dXJuIGVycjsKQEAgLTI2MSwxMyArMjU4LDExIEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJQlVHX09OKCEoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSk7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmZGlfYmgsCi0JCQkgICAgICAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTQ4NSwxMSArNDgwLDE0IEBACiAJfQogCiAJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQlyZXQgPSBvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CisjaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKIAkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLAogCQkJCQlwYWdlX2J1ZmZlcnMocGFnZSksCiAJCQkJCWZyb20sIHRvLCBOVUxMLAogCQkJCQlvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOwotCQlpZiAocmV0IDwgMCkgCisjZW5kaWYKKwkJaWYgKHJldCA8IDApCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJfQogb3V0OgpAQCAtNTk0LDcgKzU5Miw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlpZiAoIW9jZnMyX3NwYXJzZV9hbGxvYyhPQ0ZTMl9TQihpbm9kZS0+aV9zYikpICYmICFwX2Jsa25vKSB7CisJaWYgKCFvY2ZzMl9zcGFyc2VfYWxsb2MoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSAmJiAhcF9ibGtubyAmJiBjcmVhdGUpIHsKIAkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCiAJCQkgICAgIklub2RlICVsbHUgaGFzIGEgaG9sZSBhdCBibG9jayAlbGx1XG4iLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLApAQCAtNjY5LDcgKzY2Nyw3IEBACiB7CiAJam91cm5hbF90ICpqb3VybmFsID0gT0NGUzJfU0IocGFnZS0+bWFwcGluZy0+aG9zdC0+aV9zYiktPmpvdXJuYWwtPmpfam91cm5hbDsKIAotCWpvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKKwlqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3Qgd2FpdCkKQEAgLTY3OCw3ICs2NzYsNyBAQAogCiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKGpvdXJuYWwsIHBhZ2UsIHdhaXQpOworCXJldHVybiBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCB3YWl0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgb2NmczJfZGlyZWN0X0lPKGludCBydywKQEAgLTEwNzQsMTEgKzEwNzIsMTUgQEAKIAkJdG1wcGFnZSA9IHdjLT53X3BhZ2VzW2ldOwogCiAJCWlmIChwYWdlX2hhc19idWZmZXJzKHRtcHBhZ2UpKSB7Ci0JCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJCW9jZnMyX2piZDJfZmlsZV9pbm9kZSh3Yy0+d19oYW5kbGUsIGlub2RlKTsKKyNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAogCQkJCXdhbGtfcGFnZV9idWZmZXJzKHdjLT53X2hhbmRsZSwKIAkJCQkJCSAgcGFnZV9idWZmZXJzKHRtcHBhZ2UpLAogCQkJCQkJICBmcm9tLCB0bywgTlVMTCwKIAkJCQkJCSAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKKyNlbmRpZgorCQkJfQogCiAJCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOwogCQl9CkBAIC0xMjQyLDYgKzEyNDQsNyBAQAogCWludCByZXQsIGksIG5ldywgc2hvdWxkX3plcm8gPSAwOwogCXU2NCB2X2Jsa25vLCBwX2Jsa25vOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAogCW5ldyA9IHBoeXMgPT0gMCA/IDEgOiAwOwogCWlmIChuZXcgfHwgdW53cml0dGVuKQpAQCAtMTI1NSwxMCArMTI1OCwxMCBAQAogCQkgKiBhbnkgYWRkaXRpb25hbCBzZW1hcGhvcmVzIG9yIGNsdXN0ZXIgbG9ja3MuCiAJCSAqLwogCQl0bXBfcG9zID0gY3BvczsKLQkJcmV0ID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwKLQkJCQkJCSAmdG1wX3BvcywgMSwgMCwgd2MtPndfZGlfYmgsCi0JCQkJCQkgd2MtPndfaGFuZGxlLCBkYXRhX2FjLAotCQkJCQkJIG1ldGFfYWMsIE5VTEwpOworCQlyZXQgPSBvY2ZzMl9hZGRfaW5vZGVfZGF0YShPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGlub2RlLAorCQkJCQkgICAmdG1wX3BvcywgMSwgMCwgd2MtPndfZGlfYmgsCisJCQkJCSAgIHdjLT53X2hhbmRsZSwgZGF0YV9hYywKKwkJCQkJICAgbWV0YV9hYywgTlVMTCk7CiAJCS8qCiAJCSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHdlIG11c3QgaGF2ZSBhbHJlYWR5CiAJCSAqIGNhbGN1bGF0ZWQgdGhlIGNvcnJlY3QgbWV0YSBkYXRhIGFsbG9jYXRpb24gcmVxdWlyZWQuIFRoZQpAQCAtMTI3Niw3ICsxMjc5LDggQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJfSBlbHNlIGlmICh1bndyaXR0ZW4pIHsKLQkJcmV0ID0gb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihpbm9kZSwgd2MtPndfZGlfYmgsCisJCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHdjLT53X2RpX2JoKTsKKwkJcmV0ID0gb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihpbm9kZSwgJmV0LAogCQkJCQkJd2MtPndfaGFuZGxlLCBjcG9zLCAxLCBwaHlzLAogCQkJCQkJbWV0YV9hYywgJndjLT53X2RlYWxsb2MpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMTY2NSw2ICsxNjY5LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCiAJcmV0ID0gb2NmczJfYWxsb2Nfd3JpdGVfY3R4dCgmd2MsIG9zYiwgcG9zLCBsZW4sIGRpX2JoKTsKIAlpZiAocmV0KSB7CkBAIC0xNzEyLDE0ICsxNzE3LDIzIEBACiAJCSAqIG9jZnMyX2xvY2tfYWxsb2NhdG9ycygpLiBJdCBncmVhdGx5IG92ZXItZXN0aW1hdGVzCiAJCSAqIHRoZSB3b3JrIHRvIGJlIGRvbmUuCiAJCSAqLwotCQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCBjbHVzdGVyc190b19hbGxvYywKLQkJCQkJICAgIGV4dGVudHNfdG9fc3BsaXQsICZkYXRhX2FjLCAmbWV0YV9hYyk7CisJCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCIKKwkJICAgICAiIGNsdXN0ZXJzX3RvX2FkZCA9ICV1LCBleHRlbnRzX3RvX3NwbGl0ID0gJXVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCSAgICAgKGxvbmcgbG9uZylpX3NpemVfcmVhZChpbm9kZSksIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwKKwkJICAgICBjbHVzdGVyc190b19hbGxvYywgZXh0ZW50c190b19zcGxpdCk7CisKKwkJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgd2MtPndfZGlfYmgpOworCQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwKKwkJCQkJICAgIGNsdXN0ZXJzX3RvX2FsbG9jLCBleHRlbnRzX3RvX3NwbGl0LAorCQkJCQkgICAgJmRhdGFfYWMsICZtZXRhX2FjKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwgZGksCisJCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLAorCQkJCQkJICAgICZkaS0+aWQyLmlfbGlzdCwKIAkJCQkJCSAgICBjbHVzdGVyc190b19hbGxvYyk7CiAKIAl9CkBAIC0xOTA1LDExICsxOTE5LDE1IEBACiAJCX0KIAogCQlpZiAocGFnZV9oYXNfYnVmZmVycyh0bXBwYWdlKSkgewotCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKKwkJCQlvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUod2MtPndfaGFuZGxlLCBpbm9kZSk7CisjaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKIAkJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsCiAJCQkJCQkgIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKIAkJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCiAJCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisjZW5kaWYKKwkJCX0KIAkJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jIGIvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uYwppbmRleCBmMTM2NjM5Li43ZTk0N2M2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jCisrKyBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAkvKiByZW1vdmUgZnJvbSBkaXJ0eSBsaXN0IGJlZm9yZSBJL08uICovCiAJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKIAotCWdldF9iaChiaCk7IC8qIGZvciBlbmRfYnVmZmVyX3dyaXRlX3N5bmMoKSAqLyAgICAgICAgICAgICAgICAgICAKKwlnZXRfYmgoYmgpOyAvKiBmb3IgZW5kX2J1ZmZlcl93cml0ZV9zeW5jKCkgKi8KIAliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CiAJc3VibWl0X2JoKFdSSVRFLCBiaCk7CiAKQEAgLTg4LDIyICs4OCwxMDMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgb2NmczJfcmVhZF9ibG9ja3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBibG9jaywgaW50IG5yLAotCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCitpbnQgb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgdTY0IGJsb2NrLAorCQkJICAgdW5zaWduZWQgaW50IG5yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdKQogewogCWludCBzdGF0dXMgPSAwOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWlmICghbnIpIHsKKwkJbWxvZyhNTF9CSF9JTywgIk5vIGJ1ZmZlcnMgd2lsbCBiZSByZWFkIVxuIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlmb3IgKGkgPSAwIDsgaSA8IG5yIDsgaSsrKSB7CisJCWlmIChiaHNbaV0gPT0gTlVMTCkgeworCQkJYmhzW2ldID0gc2JfZ2V0YmxrKG9zYi0+c2IsIGJsb2NrKyspOworCQkJaWYgKGJoc1tpXSA9PSBOVUxMKSB7CisJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQl9CisJCWJoID0gYmhzW2ldOworCisJCWlmIChidWZmZXJfamJkKGJoKSkgeworCQkJbWxvZyhNTF9FUlJPUiwKKwkJCSAgICAgInRyeWluZyB0byBzeW5jIHJlYWQgYSBqYmQgIgorCQkJICAgICAibWFuYWdlZCBiaCAoYmxvY2tuciA9ICVsbHUpLCBza2lwcGluZ1xuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgQlVHLCBvcgorCQkJICogYXQgbGVhc3QgcmV0dXJuIGFuIGVycm9yLiAqLworCQkJbWxvZyhNTF9FUlJPUiwKKwkJCSAgICAgInRyeWluZyB0byBzeW5jIHJlYWQgYSBkaXJ0eSAiCisJCQkgICAgICJidWZmZXIhIChibG9ja25yID0gJWxsdSksIHNraXBwaW5nXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQkJY29udGludWU7CisJCX0KKworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfamJkKGJoKSkgeworCQkJbWxvZyhNTF9FUlJPUiwKKwkJCSAgICAgImJsb2NrICVsbHUgaGFkIHRoZSBKQkQgYml0IHNldCAiCisJCQkgICAgICJ3aGlsZSBJIHdhcyBpbiBsb2NrX2J1ZmZlciEiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQkJQlVHKCk7CisJCX0KKworCQljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlnZXRfYmgoYmgpOyAvKiBmb3IgZW5kX2J1ZmZlcl9yZWFkX3N5bmMoKSAqLworCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwl9CisKKwlmb3IgKGkgPSBucjsgaSA+IDA7IGktLSkgeworCQliaCA9IGJoc1tpIC0gMV07CisKKwkJaWYgKGJ1ZmZlcl9qYmQoYmgpKSB7CisJCQltbG9nKE1MX0VSUk9SLAorCQkJICAgICAidGhlIGpvdXJuYWwgZ290IHRoZSBidWZmZXIgd2hpbGUgaXQgd2FzICIKKwkJCSAgICAgImxvY2tlZCBmb3IgaW8hIChibG9ja25yID0gJWxsdSlcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCQlCVUcoKTsKKwkJfQorCisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiBTdGF0dXMgd29uJ3QgYmUgY2xlYXJlZCBmcm9tIGhlcmUgb24gb3V0LAorCQkJICogc28gd2UgY2FuIHNhZmVseSByZWNvcmQgdGhpcyBhbmQgbG9vcCBiYWNrCisJCQkgKiB0byBjbGVhbnVwIHRoZSBvdGhlciBidWZmZXJzLiAqLworCQkJc3RhdHVzID0gLUVJTzsKKwkJCXB1dF9iaChiaCk7CisJCQliaHNbaSAtIDFdID0gTlVMTDsKKwkJfQorCX0KKworYmFpbDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgb2NmczJfcmVhZF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGJsb2NrLCBpbnQgbnIsCisJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10sIGludCBmbGFncykKK3sKKwlpbnQgc3RhdHVzID0gMDsKIAlpbnQgaSwgaWdub3JlX2NhY2hlID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JbWxvZ19lbnRyeSgiKGJsb2NrPSglbGx1KSwgbnI9KCVkKSwgZmxhZ3M9JWQsIGlub2RlPSVwKVxuIiwKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaywgbnIsIGZsYWdzLCBpbm9kZSk7CisJbWxvZ19lbnRyeSgiKGlub2RlPSVwLCBibG9jaz0oJWxsdSksIG5yPSglZCksIGZsYWdzPSVkKVxuIiwKKwkJICAgaW5vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssIG5yLCBmbGFncyk7CiAKKwlCVUdfT04oIWlub2RlKTsKIAlCVUdfT04oKGZsYWdzICYgT0NGUzJfQkhfUkVBREFIRUFEKSAmJgotCSAgICAgICAoIWlub2RlIHx8ICEoZmxhZ3MgJiBPQ0ZTMl9CSF9DQUNIRUQpKSk7CisJICAgICAgIChmbGFncyAmIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSkpOwogCi0JaWYgKG9zYiA9PSBOVUxMIHx8IG9zYi0+c2IgPT0gTlVMTCB8fCBiaHMgPT0gTlVMTCkgeworCWlmIChiaHMgPT0gTlVMTCkgewogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEyMiwyNiArMjAzLDE5IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzYiA9IG9zYi0+c2I7Ci0KLQlpZiAoZmxhZ3MgJiBPQ0ZTMl9CSF9DQUNIRUQgJiYgIWlub2RlKQotCQlmbGFncyAmPSB+T0NGUzJfQkhfQ0FDSEVEOwotCi0JaWYgKGlub2RlKQotCQltdXRleF9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOworCW11dGV4X2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9pb19tdXRleCk7CiAJZm9yIChpID0gMCA7IGkgPCBuciA7IGkrKykgewogCQlpZiAoYmhzW2ldID09IE5VTEwpIHsKLQkJCWJoc1tpXSA9IHNiX2dldGJsayhzYiwgYmxvY2srKyk7CisJCQliaHNbaV0gPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGJsb2NrKyspOwogCQkJaWYgKGJoc1tpXSA9PSBOVUxMKSB7Ci0JCQkJaWYgKGlub2RlKQotCQkJCQltdXRleF91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9pb19tdXRleCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOwogCQkJCXN0YXR1cyA9IC1FSU87CiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJCWdvdG8gYmFpbDsKIAkJCX0KIAkJfQogCQliaCA9IGJoc1tpXTsKLQkJaWdub3JlX2NhY2hlID0gMDsKKwkJaWdub3JlX2NhY2hlID0gKGZsYWdzICYgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAogCQkvKiBUaGVyZSBhcmUgdGhyZWUgcmVhZC1haGVhZCBjYXNlcyBoZXJlIHdoaWNoIHdlIG5lZWQgdG8KIAkJICogYmUgY29uY2VybmVkIHdpdGguIEFsbCB0aHJlZSBhc3N1bWUgYSBidWZmZXIgaGFzCkBAIC0xNjcsMjYgKzI0MSwyNyBAQAogCQkgKiAgICBiZWZvcmUgb3VyIGlzLWl0LWluLWZsaWdodCBjaGVjay4KIAkJICovCiAKLQkJaWYgKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEICYmCi0JCSAgICAhb2NmczJfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBiaCkpIHsKKwkJaWYgKCFpZ25vcmVfY2FjaGUgJiYgIW9jZnMyX2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmgpKSB7CiAJCQltbG9nKE1MX1VQVE9EQVRFLAogCQkJICAgICAiYmggKCVsbHUpLCBpbm9kZSAlbGx1IG5vdCB1cHRvZGF0ZVxuIiwKIAkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAogCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJCQkvKiBXZSdyZSB1c2luZyBpZ25vcmVfY2FjaGUgaGVyZSB0byBzYXkKKwkJCSAqICJnbyB0byBkaXNrIiAqLwogCQkJaWdub3JlX2NhY2hlID0gMTsKIAkJfQogCiAJCS8qIFhYWDogQ2FuIHdlIGV2ZXIgZ2V0IHRoaXMgYW5kICpub3QqIGhhdmUgdGhlIGNhY2hlZAogCQkgKiBmbGFnIHNldD8gKi8KIAkJaWYgKGJ1ZmZlcl9qYmQoYmgpKSB7Ci0JCQlpZiAoIShmbGFncyAmIE9DRlMyX0JIX0NBQ0hFRCkgfHwgaWdub3JlX2NhY2hlKQorCQkJaWYgKGlnbm9yZV9jYWNoZSkKIAkJCQltbG9nKE1MX0JIX0lPLCAidHJ5aW5nIHRvIHN5bmMgcmVhZCBhIGpiZCAiCiAJCQkJCSAgICAgICAibWFuYWdlZCBiaCAoYmxvY2tuciA9ICVsbHUpXG4iLAogCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKCEoZmxhZ3MgJiBPQ0ZTMl9CSF9DQUNIRUQpIHx8IGlnbm9yZV9jYWNoZSkgeworCQlpZiAoaWdub3JlX2NhY2hlKSB7CiAJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJCS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGEgQlVHLCBvcgogCQkJCSAqIGF0IGxlYXN0IHJldHVybiBhbiBlcnJvci4gKi8KQEAgLTIyMSw3ICsyOTYsNyBAQAogCQkJICogcHJldmlvdXNseSByZWFkLWFoZWFkIGJ1ZmZlciBtYXkgaGF2ZQogCQkJICogY29tcGxldGVkIEkvTyB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZQogCQkJICogYnVmZmVyIGxvY2suICovCi0JCQlpZiAoKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEKQorCQkJaWYgKCEoZmxhZ3MgJiBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpCiAJCQkgICAgJiYgIShmbGFncyAmIE9DRlMyX0JIX1JFQURBSEVBRCkKIAkJCSAgICAmJiBvY2ZzMl9idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoKSkgewogCQkJCXVubG9ja19idWZmZXIoYmgpOwpAQCAtMjY1LDE1ICszNDAsMTQgQEAKIAkJLyogQWx3YXlzIHNldCB0aGUgYnVmZmVyIGluIHRoZSBjYWNoZSwgZXZlbiBpZiBpdCB3YXMKIAkJICogYSBmb3JjZWQgcmVhZCwgb3IgcmVhZC1haGVhZCB3aGljaCBoYXNuJ3QgeWV0CiAJCSAqIGNvbXBsZXRlZC4gKi8KLQkJaWYgKGlub2RlKQotCQkJb2NmczJfc2V0X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmgpOworCQlvY2ZzMl9zZXRfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBiaCk7CiAJfQotCWlmIChpbm9kZSkKLQkJbXV0ZXhfdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOworCW11dGV4X3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2lvX211dGV4KTsKIAogCW1sb2coTUxfQkhfSU8sICJibG9jaz0oJWxsdSksIG5yPSglZCksIGNhY2hlZD0lcywgZmxhZ3M9MHgleFxuIiwgCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrLCBuciwKLQkgICAgICghKGZsYWdzICYgT0NGUzJfQkhfQ0FDSEVEKSB8fCBpZ25vcmVfY2FjaGUpID8gIm5vIiA6ICJ5ZXMiLCBmbGFncyk7CisJICAgICAoKGZsYWdzICYgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKSB8fCBpZ25vcmVfY2FjaGUpID8gIm5vIiA6ICJ5ZXMiLAorCSAgICAgZmxhZ3MpOwogCiBiYWlsOgogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5oIGIvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaAppbmRleCBjMmU3ODYxLi43NWUxZGNiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5oCisrKyBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmgKQEAgLTMxLDMxICszMSwyOSBAQAogdm9pZCBvY2ZzMl9lbmRfYnVmZmVyX2lvX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCSAgICAgaW50IHVwdG9kYXRlKTsKIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfcmVhZF9ibG9jayhzdHJ1Y3Qgb2NmczJfc3VwZXIgICAgICAgICAgKm9zYiwKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfYmxvY2soc3RydWN0IGlub2RlCSAgICAgICAqaW5vZGUsCiAJCQkJICAgdTY0ICAgICAgICAgICAgICAgICAgb2ZmLAotCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAotCQkJCSAgIGludCAgICAgICAgICAgICAgICAgIGZsYWdzLAotCQkJCSAgIHN0cnVjdCBpbm9kZSAgICAgICAgKmlub2RlKTsKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7CiAKIGludCBvY2ZzMl93cml0ZV9ibG9jayhzdHJ1Y3Qgb2NmczJfc3VwZXIgICAgICAgICAgKm9zYiwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqYmgsCiAJCSAgICAgIHN0cnVjdCBpbm9kZSAgICAgICAgKmlub2RlKTsKLWludCBvY2ZzMl9yZWFkX2Jsb2NrcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgICAgICAgICAgKm9zYiwKK2ludCBvY2ZzMl9yZWFkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUJICAqaW5vZGUsCiAJCSAgICAgIHU2NCAgICAgICAgICAgICAgICAgIGJsb2NrLAogCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICBuciwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqYmhzW10sCi0JCSAgICAgIGludCAgICAgICAgICAgICAgICAgIGZsYWdzLAotCQkgICAgICBzdHJ1Y3QgaW5vZGUgICAgICAgICppbm9kZSk7CisJCSAgICAgIGludCAgICAgICAgICAgICAgICAgIGZsYWdzKTsKK2ludCBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCB1NjQgYmxvY2ssCisJCQkgICB1bnNpZ25lZCBpbnQgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10pOwogCiBpbnQgb2NmczJfd3JpdGVfc3VwZXJfb3JfYmFja3VwKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi0jZGVmaW5lIE9DRlMyX0JIX0NBQ0hFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFICAgICAgMQogI2RlZmluZSBPQ0ZTMl9CSF9SRUFEQUhFQUQgICAgICAgICA4CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfYmxvY2soc3RydWN0IG9jZnMyX3N1cGVyICogb3NiLCB1NjQgb2ZmLAotCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgZmxhZ3MsCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IG9mZiwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtNjUsOCArNjMsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3Mob3NiLCBvZmYsIDEsIGJoLAotCQkJCSAgIGZsYWdzLCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIG9mZiwgMSwgYmgsIDApOwogCiBiYWlsOgogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5jCmluZGV4IDIzYzczMmYuLmQ4YTBjYjkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5jCkBAIC0xMDksNiArMTA5LDcgQEAKIAlkZWZpbmVfbWFzayhDT05OKSwKIAlkZWZpbmVfbWFzayhRVU9SVU0pLAogCWRlZmluZV9tYXNrKEVYUE9SVCksCisJZGVmaW5lX21hc2soWEFUVFIpLAogCWRlZmluZV9tYXNrKEVSUk9SKSwKIAlkZWZpbmVfbWFzayhOT1RJQ0UpLAogCWRlZmluZV9tYXNrKEtUSFJFQUQpLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmggYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAppbmRleCA1OTdlMDY0Li41NzY3MGM2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaApAQCAtMTEyLDYgKzExMiw3IEBACiAjZGVmaW5lIE1MX0NPTk4JCTB4MDAwMDAwMDAwNDAwMDAwMFVMTCAvKiBuZXQgY29ubmVjdGlvbiBtYW5hZ2VtZW50ICovCiAjZGVmaW5lIE1MX1FVT1JVTQkweDAwMDAwMDAwMDgwMDAwMDBVTEwgLyogbmV0IGNvbm5lY3Rpb24gcXVvcnVtICovCiAjZGVmaW5lIE1MX0VYUE9SVAkweDAwMDAwMDAwMTAwMDAwMDBVTEwgLyogb2NmczIgZXhwb3J0IG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTUxfWEFUVFIJMHgwMDAwMDAwMDIwMDAwMDAwVUxMIC8qIG9jZnMyIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KIC8qIGJpdHMgdGhhdCBhcmUgaW5mcmVxdWVudGx5IGdpdmVuIGFuZCBmcmVxdWVudGx5IG1hdGNoZWQgaW4gdGhlIGhpZ2ggd29yZCAqLwogI2RlZmluZSBNTF9FUlJPUgkweDAwMDAwMDAxMDAwMDAwMDBVTEwgLyogc2VudCB0byBLRVJOX0VSUiAqLwogI2RlZmluZSBNTF9OT1RJQ0UJMHgwMDAwMDAwMjAwMDAwMDAwVUxMIC8qIHNldG4gdG8gS0VSTl9OT1RJQ0UgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggOWNjZTU2My4uMDI2ZTZlYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTgyLDYgKzgyLDQ5IEBACiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2JoKTsKIAorc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqb2NmczJfYnJlYWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgaW50IGJsb2NrLCBpbnQgKmVyciwgaW50IHJlYWRhKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCB0bXBlcnI7CisJdTY0IHBfYmxrbm87CisJaW50IHJlYWRmbGFncyA9IDA7CisKKwlpZiAocmVhZGEpCisJCXJlYWRmbGFncyB8PSBPQ0ZTMl9CSF9SRUFEQUhFQUQ7CisKKwlpZiAoKCh1NjQpYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49CisJICAgIGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQlCVUdfT04oIXJlYWRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG93bl9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwl0bXBlcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrLCAmcF9ibGtubywgTlVMTCwKKwkJCQkJICAgICBOVUxMKTsKKwl1cF9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlpZiAodG1wZXJyIDwgMCkgeworCQltbG9nX2Vycm5vKHRtcGVycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl0bXBlcnIgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgcF9ibGtubywgMSwgJmJoLCByZWFkZmxhZ3MpOworCWlmICh0bXBlcnIgPCAwKQorCQlnb3RvIGZhaWw7CisKKwl0bXBlcnIgPSAwOworCisJKmVyciA9IDA7CisJcmV0dXJuIGJoOworCitmYWlsOgorCWJyZWxzZShiaCk7CisJYmggPSBOVUxMOworCisJKmVyciA9IC1FSU87CisJcmV0dXJuIE5VTEw7Cit9CisKIC8qCiAgKiBiaCBwYXNzZWQgaGVyZSBjYW4gYmUgYW4gaW5vZGUgYmxvY2sgb3IgYSBkaXIgZGF0YSBibG9jaywgZGVwZW5kaW5nCiAgKiBvbiB0aGUgaW5vZGUgaW5saW5lIGRhdGEgZmxhZy4KQEAgLTE4OCw4ICsyMzEsNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqZGF0YTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoZGlyLT5pX3NiKSwgT0NGUzJfSShkaXIpLT5pcF9ibGtubywKLQkJCSAgICAgICAmZGlfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgZGlyKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGRpciwgT0NGUzJfSShkaXIpLT5pcF9ibGtubywgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0yNjAsMTQgKzMwMiwxMyBAQAogCQl9CiAJCWlmICgoYmggPSBiaF91c2VbcmFfcHRyKytdKSA9PSBOVUxMKQogCQkJZ290byBuZXh0OwotCQl3YWl0X29uX2J1ZmZlcihiaCk7Ci0JCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQkJLyogcmVhZCBlcnJvciwgc2tpcCBibG9jayAmIGhvcGUgZm9yIHRoZSBiZXN0ICovCisJCWlmIChvY2ZzMl9yZWFkX2Jsb2NrKGRpciwgYmxvY2ssICZiaCkpIHsKKwkJCS8qIHJlYWQgZXJyb3IsIHNraXAgYmxvY2sgJiBob3BlIGZvciB0aGUgYmVzdC4KKwkJCSAqIG9jZnMyX3JlYWRfYmxvY2soKSBoYXMgcmVsZWFzZWQgdGhlIGJoLiAqLwogCQkJb2NmczJfZXJyb3IoZGlyLT5pX3NiLCAicmVhZGluZyBkaXJlY3RvcnkgJWxsdSwgIgogCQkJCSAgICAib2Zmc2V0ICVsdVxuIiwKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGRpciktPmlwX2Jsa25vLAogCQkJCSAgICBibG9jayk7Ci0JCQlicmVsc2UoYmgpOwogCQkJZ290byBuZXh0OwogCQl9CiAJCWkgPSBvY2ZzMl9zZWFyY2hfZGlyYmxvY2soYmgsIGRpciwgbmFtZSwgbmFtZWxlbiwKQEAgLTQxNyw4ICs0NTgsNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqZGF0YTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoZGlyLT5pX3NiKSwgT0NGUzJfSShkaXIpLT5pcF9ibGtubywKLQkJCSAgICAgICAmZGlfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgZGlyKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGRpciwgT0NGUzJfSShkaXIpLT5pcF9ibGtubywgJmRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC01OTYsOCArNjM2LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmRhdGE7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGU7CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJICAgICAgICZkaV9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIlVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIGZvciBkaXIgJWxsdVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CkBAIC03MTYsOCArNzU1LDcgQEAKIAkJCWZvciAoaSA9IHJhX3NlY3RvcnMgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CiAJCQkgICAgIGkgPiAwOyBpLS0pIHsKIAkJCQl0bXAgPSBvY2ZzMl9icmVhZChpbm9kZSwgKytibGssICZlcnIsIDEpOwotCQkJCWlmICh0bXApCi0JCQkJCWJyZWxzZSh0bXApOworCQkJCWJyZWxzZSh0bXApOwogCQkJfQogCQkJbGFzdF9yYV9ibGsgPSBibGs7CiAJCQlyYV9zZWN0b3JzID0gODsKQEAgLTg5OSwxMCArOTM3LDggQEAKIGxlYXZlOgogCWlmIChzdGF0dXMgPCAwKSB7CiAJCSpkaXJlbnQgPSBOVUxMOwotCQlpZiAoKmRpcmVudF9iaCkgewotCQkJYnJlbHNlKCpkaXJlbnRfYmgpOwotCQkJKmRpcmVudF9iaCA9IE5VTEw7Ci0JCX0KKwkJYnJlbHNlKCpkaXJlbnRfYmgpOworCQkqZGlyZW50X2JoID0gTlVMTDsKIAl9CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTk1MSw4ICs5ODcsNyBAQAogCiAJcmV0ID0gMDsKIGJhaWw6Ci0JaWYgKGRpcmVudF9iaCkKLQkJYnJlbHNlKGRpcmVudF9iaCk7CisJYnJlbHNlKGRpcmVudF9iaCk7CiAKIAltbG9nX2V4aXQocmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTEyNyw4ICsxMTYyLDcgQEAKIAogCXN0YXR1cyA9IDA7CiBiYWlsOgotCWlmIChuZXdfYmgpCi0JCWJyZWxzZShuZXdfYmgpOworCWJyZWxzZShuZXdfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTExOTIsNiArMTIyNiw5IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJkYXRhX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKworCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgZGlyLCBkaV9iaCk7CiAKIAlhbGxvYyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhzYiwgYnl0ZXMpOwogCkBAIC0xMzA1LDggKzEzNDIsOCBAQAogCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGZhaWwgYXMgb3VyIGV4dGVudCBsaXN0IGlzIGVtcHR5IGFuZCBhbGwKIAkgKiByZWxhdGVkIGJsb2NrcyBoYXZlIGJlZW4gam91cm5hbGVkIGFscmVhZHkuCiAJICovCi0JcmV0ID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgZGlyLCBkaV9iaCwgMCwgYmxrbm8sIGxlbiwgMCwKLQkJCQkgIE5VTEwpOworCXJldCA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGRpciwgJmV0LCAwLCBibGtubywgbGVuLAorCQkJCSAgMCwgTlVMTCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTEzMzcsOCArMTM3NCw4IEBACiAJCX0KIAkJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoZGlyLT5pX3NiLCBiaXRfb2ZmKTsKIAotCQlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBkaXIsIGRpX2JoLCAxLCBibGtubywKLQkJCQkJICBsZW4sIDAsIE5VTEwpOworCQlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBkaXIsICZldCwgMSwKKwkJCQkJICBibGtubywgbGVuLCAwLCBOVUxMKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXRfY29tbWl0OwpAQCAtMTM4Myw5ICsxNDIwLDkgQEAKIAlpZiAoZXh0ZW5kKSB7CiAJCXUzMiBvZmZzZXQgPSBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzOwogCi0JCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKE9DRlMyX1NCKHNiKSwgZGlyLCAmb2Zmc2V0LAotCQkJCQkJICAgIDEsIDAsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAotCQkJCQkJICAgIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOworCQlzdGF0dXMgPSBvY2ZzMl9hZGRfaW5vZGVfZGF0YShPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKKwkJCQkJICAgICAgMSwgMCwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCisJCQkJCSAgICAgIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOwogCQlCVUdfT04oc3RhdHVzID09IC1FQUdBSU4pOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTQzMCwxMiArMTQ2NywxNCBAQAogCWludCBjcmVkaXRzLCBudW1fZnJlZV9leHRlbnRzLCBkcm9wX2FsbG9jX3NlbSA9IDA7CiAJbG9mZl90IGRpcl9pX3NpemU7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBwYXJlbnRfZmVfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gJmZlLT5pZDIuaV9saXN0OwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CiAJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKiBkZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb3NiLT5zYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMTQ3OSw3ICsxNTE4LDggQEAKIAlzcGluX2xvY2soJk9DRlMyX0koZGlyKS0+aXBfbG9jayk7CiAJaWYgKGRpcl9pX3NpemUgPT0gb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMoc2IsIE9DRlMyX0koZGlyKS0+aXBfY2x1c3RlcnMpKSB7CiAJCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGRpciktPmlwX2xvY2spOwotCQludW1fZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGRpciwgZmUpOworCQlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGRpciwgcGFyZW50X2ZlX2JoKTsKKwkJbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLCBkaXIsICZldCk7CiAJCWlmIChudW1fZnJlZV9leHRlbnRzIDwgMCkgewogCQkJc3RhdHVzID0gbnVtX2ZyZWVfZXh0ZW50czsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE0ODcsNyArMTUyNyw3IEBACiAJCX0KIAogCQlpZiAoIW51bV9mcmVlX2V4dGVudHMpIHsKLQkJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZmUsICZtZXRhX2FjKTsKKwkJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZWwsICZtZXRhX2FjKTsKIAkJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNTAyLDcgKzE1NDIsNyBAQAogCQkJZ290byBiYWlsOwogCQl9CiAKLQkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoc2IsIGZlLCAxKTsKKwkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoc2IsIGVsLCAxKTsKIAl9IGVsc2UgewogCQlzcGluX3VubG9jaygmT0NGUzJfSShkaXIpLT5pcF9sb2NrKTsKIAkJY3JlZGl0cyA9IE9DRlMyX1NJTVBMRV9ESVJfRVhURU5EX0NSRURJVFM7CkBAIC0xNTY4LDggKzE2MDgsNyBAQAogCWlmIChtZXRhX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CiAKLQlpZiAobmV3X2JoKQotCQlicmVsc2UobmV3X2JoKTsKKwlicmVsc2UobmV3X2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xNjk2LDggKzE3MzUsNyBAQAogCiAJc3RhdHVzID0gMDsKIGJhaWw6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTc1Niw3ICsxNzk0LDYgQEAKIAkqcmV0X2RlX2JoID0gYmg7CiAJYmggPSBOVUxMOwogb3V0OgotCWlmIChiaCkKLQkJYnJlbHNlKGJoKTsKKwlicmVsc2UoYmgpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG1nbHVlLmMgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKaW5kZXggZWFlM2Q2NC4uZWM2ODQ0MiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL2RsbWdsdWUuYwpAQCAtMjAyNCw4ICsyMDI0LDcgQEAKIAl9IGVsc2UgewogCQkvKiBCb28sIHdlIGhhdmUgdG8gZ28gdG8gZGlzay4gKi8KIAkJLyogcmVhZCBiaCwgY2FzdCwgb2NmczJfcmVmcmVzaF9pbm9kZSAqLwotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgb2ktPmlwX2Jsa25vLAotCQkJCQkgIGJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2ktPmlwX2Jsa25vLCBiaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWxfcmVmcmVzaDsKQEAgLTIwODYsMTEgKzIwODUsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCQkgIHJldF9iaCwKLQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwKLQkJCQkgIGlub2RlKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIHJldF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXh0ZW50X21hcC5jIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCmluZGV4IGM1ODY2OGEuLjJiYWVkYWMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYworKysgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfRVhURU5UX01BUAogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtMzIsNiArMzMsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJleHRlbnRfbWFwLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJzdXBlci5oIgpAQCAtMjgyLDYgKzI4NCw1MCBAQAogCQlrZnJlZShuZXdfZW1pKTsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9sYXN0X2ViX2lzX2VtcHR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKK3sKKwlpbnQgcmV0LCBuZXh0X2ZyZWU7CisJdTY0IGxhc3RfZWJfYmxrID0gbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsYXN0X2ViX2JsaywgJmViX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaC0+Yl9kYXRhOworCWVsID0gJmViLT5oX2xpc3Q7CisKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKKwkJcmV0ID0gLUVST0ZTOworCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWx1IGhhcyBub24gemVybyB0cmVlIGRlcHRoIGluICIKKwkJCSAgICAibGVhZiBibG9jayAlbGx1XG4iLCBpbm9kZS0+aV9pbm8sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllYl9iaC0+Yl9ibG9ja25yKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKworCWlmIChuZXh0X2ZyZWUgPT0gMCB8fAorCSAgICAobmV4dF9mcmVlID09IDEgJiYgb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkpCisJCXJldCA9IDE7CisKK291dDoKKwlicmVsc2UoZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBSZXR1cm4gdGhlIDFzdCBpbmRleCB3aXRoaW4gZWwgd2hpY2ggY29udGFpbnMgYW4gZXh0ZW50IHN0YXJ0CiAgKiBsYXJnZXIgdGhhbiB2X2NsdXN0ZXIuCkBAIC0zMzUsOSArMzgxLDkgQEAKIAkJaWYgKGxlNjRfdG9fY3B1KGViLT5oX25leHRfbGVhZl9ibGspID09IDBVTEwpCiAJCQlnb3RvIG5vX21vcmVfZXh0ZW50czsKIAotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwKIAkJCQkgICAgICAgbGU2NF90b19jcHUoZWItPmhfbmV4dF9sZWFmX2JsayksCi0JCQkJICAgICAgICZuZXh0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJCQkgICAgICAgJm5leHRfZWJfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTM3Myw0MiArNDE5LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG9jZnMyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAotCQkgICAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAotCQkgICAgICAgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpCitzdGF0aWMgaW50IG9jZnMyX2dldF9jbHVzdGVyc19ub2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgICB1MzIgdl9jbHVzdGVyLCB1bnNpZ25lZCBpbnQgKmhvbGVfbGVuLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZXRfcmVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqaXNfbGFzdCkKIHsKLQlpbnQgcmV0LCBpOwotCXVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCA9IE5VTEw7CisJaW50IGksIHJldCwgdHJlZV9oZWlnaHQsIGxlbjsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICp1bmluaXRpYWxpemVkX3ZhcihlYik7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOwotCXUzMiBjb2ZmOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOwogCi0JaWYgKE9DRlMyX0koaW5vZGUpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkgewotCQlyZXQgPSAtRVJBTkdFOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfbG9va3VwKGlub2RlLCB2X2NsdXN0ZXIsIHBfY2x1c3RlciwKLQkJCQkgICAgICBudW1fY2x1c3RlcnMsIGV4dGVudF9mbGFncyk7Ci0JaWYgKHJldCA9PSAwKQotCQlnb3RvIG91dDsKLQotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkgICAgICAgJmRpX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQorCW1lbXNldChyZXRfcmVjLCAwLCBzaXplb2YoKnJldF9yZWMpKTsKKwlpZiAoaXNfbGFzdCkKKwkJKmlzX2xhc3QgPSAwOwogCiAJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBkaV9iaC0+Yl9kYXRhOwogCWVsID0gJmRpLT5pZDIuaV9saXN0OworCXRyZWVfaGVpZ2h0ID0gbGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCk7CiAKLQlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCWlmICh0cmVlX2hlaWdodCA+IDApIHsKIAkJcmV0ID0gb2NmczJfZmluZF9sZWFmKGlub2RlLCBlbCwgdl9jbHVzdGVyLCAmZWJfYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC00MzEsNDYgKzQ2MywyMDIgQEAKIAlpID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCB2X2NsdXN0ZXIpOwogCWlmIChpID09IC0xKSB7CiAJCS8qCisJCSAqIEhvbGVzIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBzaXplIG9mIGFuCisJCSAqIGV4dGVudCwgc28gd2UgcmV0dXJuIHRoZWlyIGxlbmd0aHMgaW4gYSBzZXBlcmF0ZQorCQkgKiBmaWVsZC4KKwkJICovCisJCWlmIChob2xlX2xlbikgeworCQkJcmV0ID0gb2NmczJfZmlndXJlX2hvbGVfY2x1c3RlcnMoaW5vZGUsIGVsLCBlYl9iaCwKKwkJCQkJCQkgdl9jbHVzdGVyLCAmbGVuKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCSpob2xlX2xlbiA9IGxlbjsKKwkJfQorCQlnb3RvIG91dF9ob2xlOworCX0KKworCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJQlVHX09OKHZfY2x1c3RlciA8IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwlpZiAoIXJlYy0+ZV9ibGtubykgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIklub2RlICVsdSBoYXMgYmFkIGV4dGVudCAiCisJCQkgICAgInJlY29yZCAoJXUsICV1LCAwKSIsIGlub2RlLT5pX2lubywKKwkJCSAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkgICAgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkqcmV0X3JlYyA9ICpyZWM7CisKKwkvKgorCSAqIENoZWNraW5nIGZvciBsYXN0IGV4dGVudCBpcyBwb3RlbnRpYWxseSBleHBlbnNpdmUgLSB3ZQorCSAqIG1pZ2h0IGhhdmUgdG8gbG9vayBhdCB0aGUgbmV4dCBsZWFmIG92ZXIgdG8gc2VlIGlmIGl0J3MKKwkgKiBlbXB0eS4KKwkgKgorCSAqIFRoZSBmaXJzdCB0d28gY2hlY2tzIGFyZSB0byBzZWUgd2hldGhlciB0aGUgY2FsbGVyIGV2ZW4KKwkgKiBjYXJlcyBmb3IgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIGlmIHRoZSBleHRlbnQgaXMgYXQgbGVhc3QKKwkgKiB0aGUgbGFzdCBpbiBpdCdzIGxpc3QuCisJICoKKwkgKiBJZiB0aG9zZSBob2xkIHRydWUsIHRoZW4gdGhlIGV4dGVudCBpcyBsYXN0IGlmIGFueSBvZiB0aGUKKwkgKiBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgaG9sZCB0cnVlOgorCSAqICAtIEV4dGVudCBsaXN0IGlzIGluLWlub2RlCisJICogIC0gRXh0ZW50IGxpc3QgaXMgcmlnaHQtbW9zdAorCSAqICAtIEV4dGVudCBsaXN0IGlzIDJuZCB0byByaWdodG1vc3QsIHdpdGggZW1wdHkgcmlnaHQtbW9zdAorCSAqLworCWlmIChpc19sYXN0KSB7CisJCWlmIChpID09IChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpKSB7CisJCQlpZiAodHJlZV9oZWlnaHQgPT0gMCkKKwkJCQkqaXNfbGFzdCA9IDE7CisJCQllbHNlIGlmIChlYi0+aF9ibGtubyA9PSBkaS0+aV9sYXN0X2ViX2JsaykKKwkJCQkqaXNfbGFzdCA9IDE7CisJCQllbHNlIGlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IGRpLT5pX2xhc3RfZWJfYmxrKSB7CisJCQkJcmV0ID0gb2NmczJfbGFzdF9lYl9pc19lbXB0eShpbm9kZSwgZGkpOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmIChyZXQgPT0gMSkKKwkJCQkJKmlzX2xhc3QgPSAxOworCQkJfQorCQl9CisJfQorCitvdXRfaG9sZToKKwlyZXQgPSAwOworb3V0OgorCWJyZWxzZShlYl9iaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2NmczJfcmVsYXRpdmVfZXh0ZW50X29mZnNldHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICB1MzIgdl9jbHVzdGVyLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsCisJCQkJCSAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzKQorCit7CisJdTMyIGNvZmYgPSB2X2NsdXN0ZXIgLSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CisKKwkqcF9jbHVzdGVyID0gb2NmczJfYmxvY2tzX3RvX2NsdXN0ZXJzKHNiLCBsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pKTsKKwkqcF9jbHVzdGVyID0gKnBfY2x1c3RlciArIGNvZmY7CisKKwlpZiAobnVtX2NsdXN0ZXJzKQorCQkqbnVtX2NsdXN0ZXJzID0gbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpIC0gY29mZjsKK30KKworaW50IG9jZnMyX3hhdHRyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAorCQkJICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpCit7CisJaW50IHJldCA9IDAsIGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwl1MzIgY29mZjsKKworCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7CisJCXJldCA9IG9jZnMyX2ZpbmRfbGVhZihpbm9kZSwgZWwsIHZfY2x1c3RlciwgJmViX2JoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGViX2JoLT5iX2RhdGE7CisJCWVsID0gJmViLT5oX2xpc3Q7CisKKwkJaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWx1IGhhcyBub24gemVybyB0cmVlIGRlcHRoIGluICIKKwkJCQkgICAgInhhdHRyIGxlYWYgYmxvY2sgJWxsdVxuIiwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWViX2JoLT5iX2Jsb2NrbnIpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCB2X2NsdXN0ZXIpOworCWlmIChpID09IC0xKSB7CisJCXJldCA9IC1FUk9GUzsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKwkJQlVHX09OKHZfY2x1c3RlciA8IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwkJaWYgKCFyZWMtPmVfYmxrbm8pIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLCAiSW5vZGUgJWx1IGhhcyBiYWQgZXh0ZW50ICIKKwkJCQkgICAgInJlY29yZCAoJXUsICV1LCAwKSBpbiB4YXR0ciIsIGlub2RlLT5pX2lubywKKwkJCQkgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAorCQkJCSAgICBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKwkJY29mZiA9IHZfY2x1c3RlciAtIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwkJKnBfY2x1c3RlciA9IG9jZnMyX2Jsb2Nrc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICBsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pKTsKKwkJKnBfY2x1c3RlciA9ICpwX2NsdXN0ZXIgKyBjb2ZmOworCQlpZiAobnVtX2NsdXN0ZXJzKQorCQkJKm51bV9jbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSAtIGNvZmY7CisJfQorb3V0OgorCWlmIChlYl9iaCkKKwkJYnJlbHNlKGViX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiB2X2NsdXN0ZXIsCisJCSAgICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKmV4dGVudF9mbGFncykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB1bmluaXRpYWxpemVkX3Zhcihob2xlX2xlbiksIGZsYWdzID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyByZWM7CisKKwlpZiAoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSB7CisJCXJldCA9IC1FUkFOR0U7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXAoaW5vZGUsIHZfY2x1c3RlciwgcF9jbHVzdGVyLAorCQkJCSAgICAgIG51bV9jbHVzdGVycywgZXh0ZW50X2ZsYWdzKTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmZGlfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnNfbm9jYWNoZShpbm9kZSwgZGlfYmgsIHZfY2x1c3RlciwgJmhvbGVfbGVuLAorCQkJCQkgJnJlYywgTlVMTCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyZWMuZV9ibGtubyA9PSAwVUxMKSB7CisJCS8qCiAJCSAqIEEgaG9sZSB3YXMgZm91bmQuIFJldHVybiBzb21lIGNhbm5lZCB2YWx1ZXMgdGhhdAogCQkgKiBjYWxsZXJzIGNhbiBrZXkgb24uIElmIGFza2VkIGZvciwgbnVtX2NsdXN0ZXJzIHdpbGwKIAkJICogYmUgcG9wdWxhdGVkIHdpdGggdGhlIHNpemUgb2YgdGhlIGhvbGUuCiAJCSAqLwogCQkqcF9jbHVzdGVyID0gMDsKIAkJaWYgKG51bV9jbHVzdGVycykgewotCQkJcmV0ID0gb2NmczJfZmlndXJlX2hvbGVfY2x1c3RlcnMoaW5vZGUsIGVsLCBlYl9iaCwKLQkJCQkJCQkgdl9jbHVzdGVyLAotCQkJCQkJCSBudW1fY2x1c3RlcnMpOwotCQkJaWYgKHJldCkgewotCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KKwkJCSpudW1fY2x1c3RlcnMgPSBob2xlX2xlbjsKIAkJfQogCX0gZWxzZSB7Ci0JCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCQlvY2ZzMl9yZWxhdGl2ZV9leHRlbnRfb2Zmc2V0cyhpbm9kZS0+aV9zYiwgdl9jbHVzdGVyLCAmcmVjLAorCQkJCQkgICAgICBwX2NsdXN0ZXIsIG51bV9jbHVzdGVycyk7CisJCWZsYWdzID0gcmVjLmVfZmxhZ3M7CiAKLQkJQlVHX09OKHZfY2x1c3RlciA8IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7Ci0KLQkJaWYgKCFyZWMtPmVfYmxrbm8pIHsKLQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLCAiSW5vZGUgJWx1IGhhcyBiYWQgZXh0ZW50ICIKLQkJCQkgICAgInJlY29yZCAoJXUsICV1LCAwKSIsIGlub2RlLT5pX2lubywKLQkJCQkgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAotCQkJCSAgICBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykpOwotCQkJcmV0ID0gLUVST0ZTOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQljb2ZmID0gdl9jbHVzdGVyIC0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwotCi0JCSpwX2NsdXN0ZXIgPSBvY2ZzMl9ibG9ja3NfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsCi0JCQkJCQkgICAgbGU2NF90b19jcHUocmVjLT5lX2Jsa25vKSk7Ci0JCSpwX2NsdXN0ZXIgPSAqcF9jbHVzdGVyICsgY29mZjsKLQotCQlpZiAobnVtX2NsdXN0ZXJzKQotCQkJKm51bV9jbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSAtIGNvZmY7Ci0KLQkJZmxhZ3MgPSByZWMtPmVfZmxhZ3M7Ci0KLQkJb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfcmVjKGlub2RlLCByZWMpOworCQlvY2ZzMl9leHRlbnRfbWFwX2luc2VydF9yZWMoaW5vZGUsICZyZWMpOwogCX0KIAogCWlmIChleHRlbnRfZmxhZ3MpCkBAIC00NzgsNyArNjY2LDYgQEAKIAogb3V0OgogCWJyZWxzZShkaV9iaCk7Ci0JYnJlbHNlKGViX2JoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MjEsMyArNzA4LDExNCBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9CisKK3N0YXRpYyBpbnQgb2NmczJfZmllbWFwX2lubGluZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgICAgIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCQkgICAgICAgdTY0IG1hcF9zdGFydCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpZF9jb3VudDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKwl1NjQgcGh5czsKKwl1MzIgZmxhZ3MgPSBGSUVNQVBfRVhURU5UX0RBVEFfSU5MSU5FfEZJRU1BUF9FWFRFTlRfTEFTVDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCWlkX2NvdW50ID0gbGUxNl90b19jcHUoZGktPmlkMi5pX2RhdGEuaWRfY291bnQpOworCisJaWYgKG1hcF9zdGFydCA8IGlkX2NvdW50KSB7CisJCXBoeXMgPSBvaS0+aXBfYmxrbm8gPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCXBoeXMgKz0gb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfZGF0YS5pZF9kYXRhKTsKKworCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaWVpbmZvLCAwLCBwaHlzLCBpZF9jb3VudCwKKwkJCQkJICAgICAgZmxhZ3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0NGUzJfRklFTUFQX0ZMQUdTCShGSUVNQVBfRkxBR19TWU5DKQorCitpbnQgb2NmczJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSB1NjQgbWFwX3N0YXJ0LCB1NjQgbWFwX2xlbikKK3sKKwlpbnQgcmV0LCBpc19sYXN0OworCXUzMiBtYXBwaW5nX2VuZCwgY3BvczsKKwl1bnNpZ25lZCBpbnQgaG9sZV9zaXplOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXU2NCBsZW5fYnl0ZXMsIHBoeXNfYnl0ZXMsIHZpcnRfYnl0ZXM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgcmVjOworCisJcmV0ID0gZmllbWFwX2NoZWNrX2ZsYWdzKGZpZWluZm8sIE9DRlMyX0ZJRU1BUF9GTEFHUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9jZnMyX2lub2RlX2xvY2soaW5vZGUsICZkaV9iaCwgMCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWRvd25fcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwkvKgorCSAqIEhhbmRsZSBpbmxpbmUtZGF0YSBzZXBhcmF0ZWx5LgorCSAqLworCWlmIChPQ0ZTMl9JKGlub2RlKS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpIHsKKwkJcmV0ID0gb2NmczJfZmllbWFwX2lubGluZShpbm9kZSwgZGlfYmgsIGZpZWluZm8sIG1hcF9zdGFydCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwljcG9zID0gbWFwX3N0YXJ0ID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCW1hcHBpbmdfZW5kID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLAorCQkJCQkgICAgICAgbWFwX3N0YXJ0ICsgbWFwX2xlbik7CisJbWFwcGluZ19lbmQgLT0gY3BvczsKKwlpc19sYXN0ID0gMDsKKwl3aGlsZSAoY3BvcyA8IG1hcHBpbmdfZW5kICYmICFpc19sYXN0KSB7CisJCXUzMiBmZV9mbGFnczsKKworCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnNfbm9jYWNoZShpbm9kZSwgZGlfYmgsIGNwb3MsCisJCQkJCQkgJmhvbGVfc2l6ZSwgJnJlYywgJmlzX2xhc3QpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChyZWMuZV9ibGtubyA9PSAwVUxMKSB7CisJCQljcG9zICs9IGhvbGVfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmVfZmxhZ3MgPSAwOworCQlpZiAocmVjLmVfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKQorCQkJZmVfZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9VTldSSVRURU47CisJCWlmIChpc19sYXN0KQorCQkJZmVfZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9MQVNUOworCQlsZW5fYnl0ZXMgPSAodTY0KWxlMTZfdG9fY3B1KHJlYy5lX2xlYWZfY2x1c3RlcnMpIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCQlwaHlzX2J5dGVzID0gbGU2NF90b19jcHUocmVjLmVfYmxrbm8pIDw8IG9zYi0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCXZpcnRfYnl0ZXMgPSAodTY0KWxlMzJfdG9fY3B1KHJlYy5lX2Nwb3MpIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCisJCXJldCA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIHZpcnRfYnl0ZXMsIHBoeXNfYnl0ZXMsCisJCQkJCSAgICAgIGxlbl9ieXRlcywgZmVfZmxhZ3MpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJY3BvcyA9IGxlMzJfdG9fY3B1KHJlYy5lX2Nwb3MpKyBsZTE2X3RvX2NwdShyZWMuZV9sZWFmX2NsdXN0ZXJzKTsKKwl9CisKKwlpZiAocmV0ID4gMCkKKwkJcmV0ID0gMDsKKworb3V0X3VubG9jazoKKwlicmVsc2UoZGlfYmgpOworCisJdXBfcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDApOworb3V0OgorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuaCBiL2ZzL29jZnMyL2V4dGVudF9tYXAuaAppbmRleCBkZTkxZTNlLi4xYzRhYThiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmgKKysrIGIvZnMvb2NmczIvZXh0ZW50X21hcC5oCkBAIC01MCw0ICs1MCwxMSBAQAogaW50IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgdl9ibGtubywgdTY0ICpwX2Jsa25vLAogCQkJCXU2NCAqcmV0X2NvdW50LCB1bnNpZ25lZCBpbnQgKmV4dGVudF9mbGFncyk7CiAKK2ludCBvY2ZzMl9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJIHU2NCBtYXBfc3RhcnQsIHU2NCBtYXBfbGVuKTsKKworaW50IG9jZnMyX3hhdHRyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAorCQkJICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpOworCiAjZW5kaWYgIC8qIF9FWFRFTlRfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCBlYzJlZDE1Li44ZDMyMjVhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSAibW1hcC5oIgogI2luY2x1ZGUgInN1YmFsbG9jLmgiCiAjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtMTg0LDcgKzE4NSw3IEBACiAJCWdvdG8gYmFpbDsKIAogCWpvdXJuYWwgPSBvc2ItPmpvdXJuYWwtPmpfam91cm5hbDsKLQllcnIgPSBqb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwllcnIgPSBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOwogCiBiYWlsOgogCW1sb2dfZXhpdChlcnIpOwpAQCAtNDg4LDcgKzQ4OSw3IEBACiB9CiAKIC8qCi0gKiBleHRlbmQgYWxsb2NhdGlvbiBvbmx5IGhlcmUuCisgKiBleHRlbmQgZmlsZSBhbGxvY2F0aW9uIG9ubHkgaGVyZS4KICAqIHdlJ2xsIHVwZGF0ZSBhbGwgdGhlIGRpc2sgc3R1ZmYsIGFuZCBvaXAtPmFsbG9jX3NpemUKICAqCiAgKiBleHBlY3Qgc3R1ZmYgdG8gYmUgbG9ja2VkLCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQgYW5kIGVub3VnaCBkYXRhIC8KQEAgLTQ5NywxODkgKzQ5OCwyNSBAQAogICogV2lsbCByZXR1cm4gLUVBR0FJTiwgYW5kIGEgcmVhc29uIGlmIGEgcmVzdGFydCBpcyBuZWVkZWQuCiAgKiBJZiBwYXNzZWQgaW4sICpyZWFzb24gd2lsbCBhbHdheXMgYmUgc2V0LCBldmVuIGluIGVycm9yLgogICovCi1pbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAotCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCi0JCQkgICAgICAgaW50IG1hcmtfdW53cml0dGVuLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCi0JCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgICAgICBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCkKK2ludCBvY2ZzMl9hZGRfaW5vZGVfZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHUzMiAqbG9naWNhbF9vZmZzZXQsCisJCQkgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSBpbnQgbWFya191bndyaXR0ZW4sCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KQogewotCWludCBzdGF0dXMgPSAwOwotCWludCBmcmVlX2V4dGVudHM7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwotCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHJlYXNvbiA9IFJFU1RBUlRfTk9ORTsKLQl1MzIgYml0X29mZiwgbnVtX2JpdHM7Ci0JdTY0IGJsb2NrOwotCXU4IGZsYWdzID0gMDsKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAotCUJVR19PTighY2x1c3RlcnNfdG9fYWRkKTsKLQotCWlmIChtYXJrX3Vud3JpdHRlbikKLQkJZmxhZ3MgPSBPQ0ZTMl9FWFRfVU5XUklUVEVOOwotCi0JZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsIGlub2RlLCBmZSk7Ci0JaWYgKGZyZWVfZXh0ZW50cyA8IDApIHsKLQkJc3RhdHVzID0gZnJlZV9leHRlbnRzOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JLyogdGhlcmUgYXJlIHR3byBjYXNlcyB3aGljaCBjb3VsZCBjYXVzZSB1cyB0byBFQUdBSU4gaW4gdGhlCi0JICogd2UtbmVlZC1tb3JlLW1ldGFkYXRhIGNhc2U6Ci0JICogMSkgd2UgaGF2ZW4ndCByZXNlcnZlZCAqYW55KgotCSAqIDIpIHdlIGFyZSBzbyBmcmFnbWVudGVkLCB3ZSd2ZSBuZWVkZWQgdG8gYWRkIG1ldGFkYXRhIHRvbwotCSAqICAgIG1hbnkgdGltZXMuICovCi0JaWYgKCFmcmVlX2V4dGVudHMgJiYgIW1ldGFfYWMpIHsKLQkJbWxvZygwLCAid2UgaGF2ZW4ndCByZXNlcnZlZCBhbnkgbWV0YWRhdGEhXG4iKTsKLQkJc3RhdHVzID0gLUVBR0FJTjsKLQkJcmVhc29uID0gUkVTVEFSVF9NRVRBOwotCQlnb3RvIGxlYXZlOwotCX0gZWxzZSBpZiAoKCFmcmVlX2V4dGVudHMpCi0JCSAgICYmIChvY2ZzMl9hbGxvY19jb250ZXh0X2JpdHNfbGVmdChtZXRhX2FjKQotCQkgICAgICAgPCBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZmUpKSkgewotCQltbG9nKDAsICJmaWxlc3lzdGVtIGlzIHJlYWxseSBmcmFnbWVudGVkLi4uXG4iKTsKLQkJc3RhdHVzID0gLUVBR0FJTjsKLQkJcmVhc29uID0gUkVTVEFSVF9NRVRBOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCXN0YXR1cyA9IF9fb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsCi0JCQkJCWNsdXN0ZXJzX3RvX2FkZCwgJmJpdF9vZmYsICZudW1fYml0cyk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCUJVR19PTihudW1fYml0cyA+IGNsdXN0ZXJzX3RvX2FkZCk7Ci0KLQkvKiByZXNlcnZlIG91ciB3cml0ZSBlYXJseSAtLSBpbnNlcnRfZXh0ZW50IG1heSB1cGRhdGUgdGhlIGlub2RlICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKLQltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciBpbm9kZSAlbGx1XG4iLAotCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQlzdGF0dXMgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJICAgICAqbG9naWNhbF9vZmZzZXQsIGJsb2NrLCBudW1fYml0cywKLQkJCQkgICAgIGZsYWdzLCBtZXRhX2FjKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JY2x1c3RlcnNfdG9fYWRkIC09IG51bV9iaXRzOwotCSpsb2dpY2FsX29mZnNldCArPSBudW1fYml0czsKLQotCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJbWxvZygwLCAibmVlZCB0byBhbGxvYyBvbmNlIG1vcmUsIGNsdXN0ZXJzID0gJXUsIHdhbnRlZCA9ICIKLQkJICAgICAiJXVcbiIsIGZlLT5pX2NsdXN0ZXJzLCBjbHVzdGVyc190b19hZGQpOwotCQlzdGF0dXMgPSAtRUFHQUlOOwotCQlyZWFzb24gPSBSRVNUQVJUX1RSQU5TOwotCX0KLQotbGVhdmU6Ci0JbWxvZ19leGl0KHN0YXR1cyk7Ci0JaWYgKHJlYXNvbl9yZXQpCi0JCSpyZWFzb25fcmV0ID0gcmVhc29uOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBGb3IgYSBnaXZlbiBhbGxvY2F0aW9uLCBkZXRlcm1pbmUgd2hpY2ggYWxsb2NhdG9ycyB3aWxsIG5lZWQgdG8gYmUKLSAqIGFjY2Vzc2VkLCBhbmQgbG9jayB0aGVtLCByZXNlcnZpbmcgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBiaXRzLgotICoKLSAqIFNwYXJzZSBmaWxlIHN5c3RlbXMgY2FsbCB0aGlzIGZyb20gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkKLSAqIGFuZCBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cygpLgotICoKLSAqIEZpbGUgc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IGhvbGVzIGNhbGwgdGhpcyBmcm9tCi0gKiBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpLgotICovCi1pbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKLQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAotCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpCi17Ci0JaW50IHJldCA9IDAsIG51bV9mcmVlX2V4dGVudHM7Ci0JdW5zaWduZWQgaW50IG1heF9yZWNzX25lZWRlZCA9IGNsdXN0ZXJzX3RvX2FkZCArIDIgKiBleHRlbnRzX3RvX3NwbGl0OwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCi0JKm1ldGFfYWMgPSBOVUxMOwotCWlmIChkYXRhX2FjKQotCQkqZGF0YV9hYyA9IE5VTEw7Ci0KLQlCVUdfT04oY2x1c3RlcnNfdG9fYWRkICE9IDAgJiYgZGF0YV9hYyA9PSBOVUxMKTsKLQotCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCAiCi0JICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXUsIGV4dGVudHNfdG9fc3BsaXQgPSAldVxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAobG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkLCBleHRlbnRzX3RvX3NwbGl0KTsKLQotCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKLQlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKLQkJcmV0ID0gbnVtX2ZyZWVfZXh0ZW50czsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFNwYXJzZSBhbGxvY2F0aW9uIGZpbGUgc3lzdGVtcyBuZWVkIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlCi0JICogd2l0aCByZXNlcnZpbmcgcm9vbSBmb3IgZXhwYW5zaW9uIC0gdGhlIGFjdHVhbCBhbGxvY2F0aW9uCi0JICogaGFwcGVucyB3aGlsZSB3ZSd2ZSBnb3QgYSBqb3VybmFsIGhhbmRsZSBvcGVuIHNvIHJlLXRha2luZwotCSAqIGEgY2x1c3RlciBsb2NrIChiZWNhdXNlIHdlIHJhbiBvdXQgb2Ygcm9vbSBmb3IgYW5vdGhlcgotCSAqIGV4dGVudCkgd2lsbCB2aW9sYXRlIG9yZGVyaW5nIHJ1bGVzLgotCSAqCi0JICogTW9zdCBvZiB0aGUgdGltZSB3ZSdsbCBvbmx5IGJlIHNlZWluZyB0aGlzIDEgY2x1c3RlciBhdCBhIHRpbWUKLQkgKiBhbnl3YXkuCi0JICoKLQkgKiBBbHdheXMgbG9jayBmb3IgYW55IHVud3JpdHRlbiBleHRlbnRzIC0gd2UgbWlnaHQgd2FudCB0bwotCSAqIGFkZCBibG9ja3MgZHVyaW5nIGEgc3BsaXQuCi0JICovCi0JaWYgKCFudW1fZnJlZV9leHRlbnRzIHx8Ci0JICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgbWF4X3JlY3NfbmVlZGVkKSkgewotCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGRpLCBtZXRhX2FjKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChyZXQgIT0gLUVOT1NQQykKLQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWlmIChjbHVzdGVyc190b19hZGQgPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgY2x1c3RlcnNfdG9fYWRkLCBkYXRhX2FjKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ICE9IC1FTk9TUEMpCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotb3V0OgotCWlmIChyZXQpIHsKLQkJaWYgKCptZXRhX2FjKSB7Ci0JCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoKm1ldGFfYWMpOwotCQkJKm1ldGFfYWMgPSBOVUxMOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgY2Fubm90IGhhdmUgYW4gZXJyb3IgYW5kIGEgbm9uIG51bGwgKmRhdGFfYWMuCi0JCSAqLwotCX0KKwlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCBmZV9iaCk7CisJcmV0ID0gb2NmczJfYWRkX2NsdXN0ZXJzX2luX2J0cmVlKG9zYiwgaW5vZGUsIGxvZ2ljYWxfb2Zmc2V0LAorCQkJCQkgICBjbHVzdGVyc190b19hZGQsIG1hcmtfdW53cml0dGVuLAorCQkJCQkgICAmZXQsIGhhbmRsZSwKKwkJCQkJICAgZGF0YV9hYywgbWV0YV9hYywgcmVhc29uX3JldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjk4LDYgKzUzNSw3IEBACiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHdoeTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAltbG9nX2VudHJ5KCIoY2x1c3RlcnNfdG9fYWRkID0gJXUpXG4iLCBjbHVzdGVyc190b19hZGQpOwogCkBAIC03MDcsOCArNTQ1LDcgQEAKIAkgKi8KIAlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKLQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC03MjQsMTQgKzU2MSwyMSBAQAogcmVzdGFydF9hbGw6CiAJQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSAhPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwogCi0Jc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAwLCAmZGF0YV9hYywKLQkJCQkgICAgICAgJm1ldGFfYWMpOworCW1sb2coMCwgImV4dGVuZCBpbm9kZSAlbGx1LCBpX3NpemUgPSAlbGxkLCBkaS0+aV9jbHVzdGVycyA9ICV1LCAiCisJICAgICAiY2x1c3RlcnNfdG9fYWRkID0gJXVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkgICAgIChsb25nIGxvbmcpaV9zaXplX3JlYWQoaW5vZGUpLCBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycyksCisJICAgICBjbHVzdGVyc190b19hZGQpOworCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIGJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgY2x1c3RlcnNfdG9fYWRkLCAwLAorCQkJCSAgICAgICAmZGF0YV9hYywgJm1ldGFfYWMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsIGZlLCBjbHVzdGVyc190b19hZGQpOworCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsICZmZS0+aWQyLmlfbGlzdCwKKwkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCk7CiAJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwpAQCAtNzUzLDE2ICs1OTcsMTYgQEAKIAogCXByZXZfY2x1c3RlcnMgPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7CiAKLQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsCi0JCQkJCSAgICBpbm9kZSwKLQkJCQkJICAgICZsb2dpY2FsX3N0YXJ0LAotCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkLAotCQkJCQkgICAgbWFya191bndyaXR0ZW4sCi0JCQkJCSAgICBiaCwKLQkJCQkJICAgIGhhbmRsZSwKLQkJCQkJICAgIGRhdGFfYWMsCi0JCQkJCSAgICBtZXRhX2FjLAotCQkJCQkgICAgJndoeSk7CisJc3RhdHVzID0gb2NmczJfYWRkX2lub2RlX2RhdGEob3NiLAorCQkJCSAgICAgIGlub2RlLAorCQkJCSAgICAgICZsb2dpY2FsX3N0YXJ0LAorCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkgICAgICBtYXJrX3Vud3JpdHRlbiwKKwkJCQkgICAgICBiaCwKKwkJCQkgICAgICBoYW5kbGUsCisJCQkJICAgICAgZGF0YV9hYywKKwkJCQkgICAgICBtZXRhX2FjLAorCQkJCSAgICAgICZ3aHkpOwogCWlmICgoc3RhdHVzIDwgMCkgJiYgKHN0YXR1cyAhPSAtRUFHQUlOKSkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC03ODksNyArNjMzLDcgQEAKIAkJCW1sb2coMCwgInJlc3RhcnRpbmcgdHJhbnNhY3Rpb24uXG4iKTsKIAkJCS8qIFRPRE86IFRoaXMgY2FuIGJlIG1vcmUgaW50ZWxsaWdlbnQuICovCiAJCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLAotCQkJCQkJCSAgICBmZSwKKwkJCQkJCQkgICAgJmZlLT5pZDIuaV9saXN0LAogCQkJCQkJCSAgICBjbHVzdGVyc190b19hZGQpOwogCQkJc3RhdHVzID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewpAQCAtODI2LDEwICs2NzAsOCBAQAogCQlyZXN0YXJ0X2Z1bmMgPSAwOwogCQlnb3RvIHJlc3RhcnRfYWxsOwogCX0KLQlpZiAoYmgpIHsKLQkJYnJlbHNlKGJoKTsKLQkJYmggPSBOVUxMOwotCX0KKwlicmVsc2UoYmgpOworCWJoID0gTlVMTDsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xMDk2LDkgKzkzOCwxNSBAQAogCQkJZ290byBiYWlsX3VubG9jazsKIAkJfQogCi0JCWlmIChpX3NpemVfcmVhZChpbm9kZSkgPiBhdHRyLT5pYV9zaXplKQorCQlpZiAoaV9zaXplX3JlYWQoaW5vZGUpID4gYXR0ci0+aWFfc2l6ZSkgeworCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJCXN0YXR1cyA9IG9jZnMyX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoaW5vZGUsCisJCQkJCQkJCSAgICAgIGF0dHItPmlhX3NpemUpOworCQkJCWlmIChzdGF0dXMpCisJCQkJCWdvdG8gYmFpbF91bmxvY2s7CisJCQl9CiAJCQlzdGF0dXMgPSBvY2ZzMl90cnVuY2F0ZV9maWxlKGlub2RlLCBiaCwgYXR0ci0+aWFfc2l6ZSk7Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlzdGF0dXMgPSBvY2ZzMl9leHRlbmRfZmlsZShpbm9kZSwgYmgsIGF0dHItPmlhX3NpemUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQpAQCAtMTE0MCw4ICs5ODgsNyBAQAogCWlmIChzaXplX2NoYW5nZSkKIAkJb2NmczJfcndfdW5sb2NrKGlub2RlLCAxKTsKIGJhaWw6Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTI4NCw4ICsxMTMxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJICAgICAgIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvaS0+aXBfYmxrbm8sICZiaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTEzMTEsOSArMTE1Nyw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CiAKIAlpZiAoT0NGUzJfSShpbm9kZSktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKSB7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZkaV9iaCwKLQkJCQkgICAgICAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgICAgJmRpX2JoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xMzk0LDggKzEyMzksMTEgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKLQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgZGlfYmgpOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIDAsIDEsIE5VTEwsICZtZXRhX2FjKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTE0MjUsNyArMTI3Myw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsIGRpX2JoLCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAogCQkJCSAgZGVhbGxvYyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMDQwLDcgKzE4ODgsNyBAQAogCQkgKi8KIAkJaWYgKG9sZF9zaXplICE9IGlfc2l6ZV9yZWFkKGlub2RlKSB8fAogCQkgICAgb2xkX2NsdXN0ZXJzICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycykgewotCQkJcmV0ID0gam91cm5hbF9mb3JjZV9jb21taXQob3NiLT5qb3VybmFsLT5qX2pvdXJuYWwpOworCQkJcmV0ID0gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdChvc2ItPmpvdXJuYWwtPmpfam91cm5hbCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQl3cml0dGVuID0gcmV0OwogCQl9CkBAIC0yMjI3LDcgKzIwNzUsMTIgQEAKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAogCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IG9jZnMyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5mYWxsb2NhdGUJPSBvY2ZzMl9mYWxsb2NhdGUsCisJLmZpZW1hcAkJPSBvY2ZzMl9maWVtYXAsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvY2ZzMl9zcGVjaWFsX2ZpbGVfaW9wcyA9IHsKQEAgLTIyMzYsNiArMjA4OSwxMCBAQAogCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKIH07CiAKKy8qCisgKiBPdGhlciB0aGFuIC0+bG9jaywga2VlcCBvY2ZzMl9mb3BzIGFuZCBvY2ZzMl9kb3BzIGluIHN5bmMgd2l0aAorICogb2NmczJfZm9wc19ub19wbG9ja3MgYW5kIG9jZnMyX2RvcHNfbm9fcGxvY2tzIQorICovCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKQEAgLTIyNTAsMTIgKzIxMDcsNTkgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bCAgID0gb2NmczJfY29tcGF0X2lvY3RsLAogI2VuZGlmCisJLmxvY2sJCT0gb2NmczJfbG9jaywKKwkuZmxvY2sJCT0gb2NmczJfZmxvY2ssCisJLnNwbGljZV9yZWFkCT0gb2NmczJfZmlsZV9zcGxpY2VfcmVhZCwKKwkuc3BsaWNlX3dyaXRlCT0gb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUsCit9OworCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2RvcHMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBvY2ZzMl9yZWFkZGlyLAorCS5mc3luYwkJPSBvY2ZzMl9zeW5jX2ZpbGUsCisJLnJlbGVhc2UJPSBvY2ZzMl9kaXJfcmVsZWFzZSwKKwkub3BlbgkJPSBvY2ZzMl9kaXJfb3BlbiwKKwkudW5sb2NrZWRfaW9jdGwJPSBvY2ZzMl9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gb2NmczJfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLmxvY2sJCT0gb2NmczJfbG9jaywKKwkuZmxvY2sJCT0gb2NmczJfZmxvY2ssCit9OworCisvKgorICogUE9TSVgtbG9ja2xlc3MgdmFyaWFudHMgb2Ygb3VyIGZpbGVfb3BlcmF0aW9ucy4KKyAqCisgKiBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgdGhlIHVuZGVybHlpbmcgY2x1c3RlciBzdGFjayBkb2VzIG5vdCBzdXBwb3J0CisgKiBwb3NpeCBmaWxlIGxvY2tpbmcsIGlmIHRoZSB1c2VyIHBhc3NlcyB0aGUgImxvY2FsZmxvY2tzIiBtb3VudAorICogb3B0aW9uLCBvciBpZiB3ZSBoYXZlIGEgbG9jYWwtb25seSBmcy4KKyAqCisgKiBvY2ZzMl9mbG9jayBpcyBpbiBoZXJlIGJlY2F1c2UgYWxsIHN0YWNrcyBoYW5kbGUgVU5JWCBmaWxlIGxvY2tzLAorICogc28gd2Ugc3RpbGwgd2FudCBpdCBpbiB0aGUgY2FzZSBvZiBubyBzdGFjayBzdXBwb3J0IGZvcgorICogcGxvY2tzLiBJbnRlcm5hbGx5LCBpdCB3aWxsIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGFza2VkIHRvIGlnbm9yZQorICogdGhlIGNsdXN0ZXIuCisgKi8KK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wc19ub19wbG9ja3MgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkubW1hcAkJPSBvY2ZzMl9tbWFwLAorCS5mc3luYwkJPSBvY2ZzMl9zeW5jX2ZpbGUsCisJLnJlbGVhc2UJPSBvY2ZzMl9maWxlX3JlbGVhc2UsCisJLm9wZW4JCT0gb2NmczJfZmlsZV9vcGVuLAorCS5haW9fcmVhZAk9IG9jZnMyX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IG9jZnMyX2ZpbGVfYWlvX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IG9jZnMyX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsICAgPSBvY2ZzMl9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkuZmxvY2sJCT0gb2NmczJfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gb2NmczJfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUsCiB9OwogCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2RvcHMgPSB7Citjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2RvcHNfbm9fcGxvY2tzID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCT0gb2NmczJfcmVhZGRpciwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuaCBiL2ZzL29jZnMyL2ZpbGUuaAppbmRleCAxZTI3YjRkLi5lOTIzODJjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmgKKysrIGIvZnMvb2NmczIvZmlsZS5oCkBAIC0yOCw5ICsyOCwxMiBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9mb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9jZnMyX2ZvcHNfbm9fcGxvY2tzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZG9wc19ub19wbG9ja3M7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfZmlsZV9pb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG9jZnMyX3NwZWNpYWxfZmlsZV9pb3BzOwogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQ7CitlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZDsKIAogc3RydWN0IG9jZnMyX2ZpbGVfcHJpdmF0ZSB7CiAJc3RydWN0IGZpbGUJCSpmcF9maWxlOwpAQCAtMzgsMjcgKzQxLDE4IEBACiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzCWZwX2Zsb2NrOwogfTsKIAotZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgewotCVJFU1RBUlRfTk9ORSA9IDAsCi0JUkVTVEFSVF9UUkFOUywKLQlSRVNUQVJUX01FVEEKLX07Ci1pbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAotCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCi0JCQkgICAgICAgaW50IG1hcmtfdW53cml0dGVuLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCi0JCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgICAgICBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCk7CitpbnQgb2NmczJfYWRkX2lub2RlX2RhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAorCQkJIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgaW50IG1hcmtfdW53cml0dGVuLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCisJCQkgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKKwkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSBlbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCAqcmVhc29uX3JldCk7CiBpbnQgb2NmczJfZXh0ZW5kX25vX2hvbGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBuZXdfaV9zaXplLAogCQkJICB1NjQgemVyb190byk7Ci1pbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKLQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAotCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpOwogaW50IG9jZnMyX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogaW50IG9jZnMyX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggN2U5ZTRjNy4uNDkwMzY4OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSAic3ltbGluay5oIgogI2luY2x1ZGUgInN5c2ZpbGUuaCIKICNpbmNsdWRlICJ1cHRvZGF0ZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCkBAIC0yMTksNiArMjIwLDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiOwogCWludCBzdGF0dXMgPSAtRUlOVkFMOworCWludCB1c2VfcGxvY2tzID0gMTsKIAogCW1sb2dfZW50cnkoIigweCVwLCBzaXplOiVsbHUpXG4iLCBpbm9kZSwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7CkBAIC0yMjYsNiArMjI4LDEwIEBACiAJc2IgPSBpbm9kZS0+aV9zYjsKIAlvc2IgPSBPQ0ZTMl9TQihzYik7CiAKKwlpZiAoKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9MT0NBTEZMT0NLUykgfHwKKwkgICAgb2NmczJfbW91bnRfbG9jYWwob3NiKSB8fCAhb2NmczJfc3RhY2tfc3VwcG9ydHNfcGxvY2tzKCkpCisJCXVzZV9wbG9ja3MgPSAwOworCiAJLyogdGhpcyBtZWFucyB0aGF0IHJlYWRfaW5vZGUgY2Fubm90IGNyZWF0ZSBhIHN1cGVyYmxvY2sgaW5vZGUKIAkgKiB0b2RheS4gIGNoYW5nZSBpZiBuZWVkZWQuICovCiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpIHx8CkBAIC0yOTUsMTMgKzMwMSwxOSBAQAogCiAJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CiAJICAgIGNhc2UgU19JRlJFRzoKLQkJICAgIGlub2RlLT5pX2ZvcCA9ICZvY2ZzMl9mb3BzOworCQkgICAgaWYgKHVzZV9wbG9ja3MpCisJCQkgICAgaW5vZGUtPmlfZm9wID0gJm9jZnMyX2ZvcHM7CisJCSAgICBlbHNlCisJCQkgICAgaW5vZGUtPmlfZm9wID0gJm9jZnMyX2ZvcHNfbm9fcGxvY2tzOwogCQkgICAgaW5vZGUtPmlfb3AgPSAmb2NmczJfZmlsZV9pb3BzOwogCQkgICAgaV9zaXplX3dyaXRlKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7CiAJCSAgICBicmVhazsKIAkgICAgY2FzZSBTX0lGRElSOgogCQkgICAgaW5vZGUtPmlfb3AgPSAmb2NmczJfZGlyX2lvcHM7Ci0JCSAgICBpbm9kZS0+aV9mb3AgPSAmb2NmczJfZG9wczsKKwkJICAgIGlmICh1c2VfcGxvY2tzKQorCQkJICAgIGlub2RlLT5pX2ZvcCA9ICZvY2ZzMl9kb3BzOworCQkgICAgZWxzZQorCQkJICAgIGlub2RlLT5pX2ZvcCA9ICZvY2ZzMl9kb3BzX25vX3Bsb2NrczsKIAkJICAgIGlfc2l6ZV93cml0ZShpbm9kZSwgbGU2NF90b19jcHUoZmUtPmlfc2l6ZSkpOwogCQkgICAgYnJlYWs7CiAJICAgIGNhc2UgU19JRkxOSzoKQEAgLTQ0OCw4ICs0NjAsMTEgQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBhcmdzLT5maV9ibGtubywgJmJoLCAwLAotCQkJCSAgY2FuX2xvY2sgPyBpbm9kZSA6IE5VTEwpOworCWlmIChjYW5fbG9jaykKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIGFyZ3MtPmZpX2Jsa25vLCAxLCAmYmgsCisJCQkJCSAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CisJZWxzZQorCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKG9zYiwgYXJncy0+ZmlfYmxrbm8sIDEsICZiaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC01MjIsNiArNTM3LDkgQEAKIAkgKiBkYXRhIGFuZCBmYXN0IHN5bWxpbmtzLgogCSAqLwogCWlmIChmZS0+aV9jbHVzdGVycykgeworCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJb2NmczJfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShpbm9kZSwgMCk7CisKIAkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwpAQCAtNzMwLDYgKzc0OCwxMyBAQAogCQlnb3RvIGJhaWxfdW5sb2NrX2RpcjsKIAl9CiAKKwkvKkZyZWUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZS4qLworCXN0YXR1cyA9IG9jZnMyX3hhdHRyX3JlbW92ZShpbm9kZSwgZGlfYmgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBiYWlsX3VubG9ja19kaXI7CisJfQorCiAJc3RhdHVzID0gb2NmczJfcmVtb3ZlX2lub2RlKGlub2RlLCBkaV9iaCwgb3JwaGFuX2Rpcl9pbm9kZSwKIAkJCQkgICAgb3JwaGFuX2Rpcl9iaCk7CiAJaWYgKHN0YXR1cyA8IDApCkBAIC0xMDgxLDYgKzExMDYsOCBAQAogCW9pLT5pcF9sYXN0X3RyYW5zID0gMDsKIAlvaS0+aXBfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CiAJb2ktPmlwX2Jsa25vID0gMFVMTDsKKwlqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5qb3VybmFsLT5qX2pvdXJuYWwsCisJCQkJICAgICAgICZvaS0+aXBfamlub2RlKTsKIAogYmFpbDoKIAltbG9nX2V4aXRfdm9pZCgpOwpAQCAtMTEwNyw1OCArMTEzNCw2IEBACiB9CiAKIC8qCi0gKiBUT0RPOiB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBtZXJnZWQgaW50byBvY2ZzMl9nZXRfYmxvY2sKLSAqCi0gKiBIb3dldmVyLCB5b3Ugbm93IG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgY29udF9wcmVwYXJlX3dyaXRlKCkKLSAqIHN0dWZmIGluIG9jZnMyX2dldF9ibG9jayAodGhhdCBpcywgb2NmczJfZ2V0X2Jsb2NrIHByZXR0eSBtdWNoCi0gKiBleHBlY3RzIG5ldmVyIHRvIGV4dGVuZCkuCi0gKi8KLXN0cnVjdCBidWZmZXJfaGVhZCAqb2NmczJfYnJlYWQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlpbnQgYmxvY2ssIGludCAqZXJyLCBpbnQgcmVhZGEpCi17Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0JaW50IHRtcGVycjsKLQl1NjQgcF9ibGtubzsKLQlpbnQgcmVhZGZsYWdzID0gT0NGUzJfQkhfQ0FDSEVEOwotCi0JaWYgKHJlYWRhKQotCQlyZWFkZmxhZ3MgfD0gT0NGUzJfQkhfUkVBREFIRUFEOwotCi0JaWYgKCgodTY0KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA+PQotCSAgICBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJQlVHX09OKCFyZWFkYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRvd25fcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JdG1wZXJyID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBibG9jaywgJnBfYmxrbm8sIE5VTEwsCi0JCQkJCSAgICAgTlVMTCk7Ci0JdXBfcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JaWYgKHRtcGVyciA8IDApIHsKLQkJbWxvZ19lcnJubyh0bXBlcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JdG1wZXJyID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIHBfYmxrbm8sICZiaCwKLQkJCQkgIHJlYWRmbGFncywgaW5vZGUpOwotCWlmICh0bXBlcnIgPCAwKQotCQlnb3RvIGZhaWw7Ci0KLQl0bXBlcnIgPSAwOwotCi0JKmVyciA9IDA7Ci0JcmV0dXJuIGJoOwotCi1mYWlsOgotCWlmIChiaCkgewotCQlicmVsc2UoYmgpOwotCQliaCA9IE5VTEw7Ci0JfQotCSplcnIgPSAtRUlPOwotCXJldHVybiBOVUxMOwotfQotCi0vKgogICogVGhpcyBpcyBjYWxsZWQgZnJvbSBvdXIgZ2V0YXR0ci4KICAqLwogaW50IG9jZnMyX2lub2RlX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuaCBiL2ZzL29jZnMyL2lub2RlLmgKaW5kZXggMzkwYTg1NS4uMmYzN2FmOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuaAorKysgYi9mcy9vY2ZzMi9pbm9kZS5oCkBAIC00MCw2ICs0MCw5IEBACiAJLyogcHJvdGVjdHMgYWxsb2NhdGlvbiBjaGFuZ2VzIG9uIHRoaXMgaW5vZGUuICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZQkJaXBfYWxsb2Nfc2VtOwogCisJLyogcHJvdGVjdHMgZXh0ZW5kZWQgYXR0cmlidXRlIGNoYW5nZXMgb24gdGhpcyBpbm9kZSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJCWlwX3hhdHRyX3NlbTsKKwogCS8qIFRoZXNlIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IGlwX2xvY2sgKi8KIAlzcGlubG9ja190CQkJaXBfbG9jazsKIAl1MzIJCQkJaXBfb3Blbl9jb3VudDsKQEAgLTY4LDYgKzcxLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcAkJaXBfZXh0ZW50X21hcDsKIAogCXN0cnVjdCBpbm9kZQkJCXZmc19pbm9kZTsKKwlzdHJ1Y3QgamJkMl9pbm9kZQkJaXBfamlub2RlOwogfTsKIAogLyoKQEAgLTExMyw4ICsxMTcsNiBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBvY2ZzMl9hb3BzOwogCi1zdHJ1Y3QgYnVmZmVyX2hlYWQgKm9jZnMyX2JyZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaywKLQkJCQlpbnQgKmVyciwgaW50IHJlYWRhKTsKIHZvaWQgb2NmczJfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIG9jZnMyX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgb2NmczJfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lvY3RsLmMgYi9mcy9vY2ZzMi9pb2N0bC5jCmluZGV4IDdiMTQyZjAuLjlmY2QzNmQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lvY3RsLmMKKysrIGIvZnMvb2NmczIvaW9jdGwuYwpAQCAtMTAyLDggKzEwMiw3IEBACiBiYWlsOgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5jIGIvZnMvb2NmczIvam91cm5hbC5jCmluZGV4IGM0N2JjMmEuLjgxZTQwNjcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuYworKysgYi9mcy9vY2ZzMi9qb3VybmFsLmMKQEAgLTIxNSw5ICsyMTUsOSBAQAogCQlnb3RvIGZpbmFsbHk7CiAJfQogCi0Jam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKLQlzdGF0dXMgPSBqb3VybmFsX2ZsdXNoKGpvdXJuYWwtPmpfam91cm5hbCk7Ci0Jam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOworCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKKwlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbC0+al9qb3VybmFsKTsKKwlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQl1cF93cml0ZSgmam91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIAlkb3duX3JlYWQoJm9zYi0+am91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKIAotCWhhbmRsZSA9IGpvdXJuYWxfc3RhcnQoam91cm5hbCwgbWF4X2J1ZmZzKTsKKwloYW5kbGUgPSBqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbCwgbWF4X2J1ZmZzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJdXBfcmVhZCgmb3NiLT5qb3VybmFsLT5qX3RyYW5zX2JhcnJpZXIpOwogCkBAIC0yOTAsNyArMjkwLDcgQEAKIAogCUJVR19PTighaGFuZGxlKTsKIAotCXJldCA9IGpvdXJuYWxfc3RvcChoYW5kbGUpOworCXJldCA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMzA0LDcgKzMwNCw3IEBACiAgKiB0cmFuc2FjdGlvbi4gZXh0ZW5kX3RyYW5zIHdpbGwgZWl0aGVyIGV4dGVuZCB0aGUgY3VycmVudCBoYW5kbGUgYnkKICAqIG5ibG9ja3MsIG9yIGNvbW1pdCBpdCBhbmQgc3RhcnQgYSBuZXcgb25lIHdpdGggbmJsb2NrcyBjcmVkaXRzLgogICoKLSAqIFRoaXMgbWlnaHQgY2FsbCBqb3VybmFsX3Jlc3RhcnQoKSB3aGljaCB3aWxsIGNvbW1pdCBkaXJ0eSBidWZmZXJzCisgKiBUaGlzIG1pZ2h0IGNhbGwgamJkMl9qb3VybmFsX3Jlc3RhcnQoKSB3aGljaCB3aWxsIGNvbW1pdCBkaXJ0eSBidWZmZXJzCiAgKiBhbmQgdGhlbiByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbi4gQmVmb3JlIGNhbGxpbmcKICAqIG9jZnMyX2V4dGVuZF90cmFucygpLCBhbnkgY2hhbmdlZCBibG9ja3Mgc2hvdWxkIGhhdmUgYmVlbgogICogZGlydGllZC4gQWZ0ZXIgY2FsbGluZyBpdCwgYWxsIGJsb2NrcyB3aGljaCBuZWVkIHRvIGJlIGNoYW5nZWQgbXVzdApAQCAtMzMyLDcgKzMzMiw3IEBACiAjaWZkZWYgQ09ORklHX09DRlMyX0RFQlVHX0ZTCiAJc3RhdHVzID0gMTsKICNlbHNlCi0Jc3RhdHVzID0gam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKKwlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmJsb2Nrcyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0zNDAsOCArMzQwLDEwIEBACiAjZW5kaWYKIAogCWlmIChzdGF0dXMgPiAwKSB7Ci0JCW1sb2coMCwgImpvdXJuYWxfZXh0ZW5kIGZhaWxlZCwgdHJ5aW5nIGpvdXJuYWxfcmVzdGFydFxuIik7Ci0JCXN0YXR1cyA9IGpvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5ibG9ja3MpOworCQltbG9nKDAsCisJCSAgICAgImpiZDJfam91cm5hbF9leHRlbmQgZmFpbGVkLCB0cnlpbmcgIgorCQkgICAgICJqYmQyX2pvdXJuYWxfcmVzdGFydFxuIik7CisJCXN0YXR1cyA9IGpiZDJfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmJsb2Nrcyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC0zOTMsMTEgKzM5NSwxMSBAQAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFOgogCWNhc2UgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEU6Ci0JCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJc3RhdHVzID0gamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CiAJCWJyZWFrOwogCiAJY2FzZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19VTkRPOgotCQlzdGF0dXMgPSBqb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJc3RhdHVzID0gamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDIyLDcgKzQyNCw3IEBACiAJbWxvZ19lbnRyeSgiKGJoLT5iX2Jsb2NrbnI9JWxsdSlcbiIsCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CiAKLQlzdGF0dXMgPSBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCXN0YXR1cyA9IGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZyhNTF9FUlJPUiwgIkNvdWxkIG5vdCBkaXJ0eSBtZXRhZGF0YSBidWZmZXIuICIKIAkJICAgICAiKGJoLT5iX2Jsb2NrbnI9JWxsdSlcbiIsCkBAIC00MzIsNiArNDM0LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisjaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKIGludCBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKQEAgLTQ0Myw4ICs0NDYsOSBAQAogCiAJcmV0dXJuIGVycjsKIH0KKyNlbmRpZgogCi0jZGVmaW5lIE9DRlMyX0RFRkFVTFRfQ09NTUlUX0lOVEVSVkFMIAkoSFogKiBKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSkKKyNkZWZpbmUgT0NGUzJfREVGQVVMVF9DT01NSVRfSU5URVJWQUwJKEhaICogSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFKQogCiB2b2lkIG9jZnMyX3NldF9qb3VybmFsX3BhcmFtcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKQEAgLTQ1Nyw5ICs0NjEsOSBAQAogCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCA9IGNvbW1pdF9pbnRlcnZhbDsKIAlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX0JBUlJJRVIpCi0JCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX0JBUlJJRVI7CisJCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkJEMl9CQVJSSUVSOwogCWVsc2UKLQkJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0JBUlJJRVI7CisJCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpCRDJfQkFSUklFUjsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIH0KIApAQCAtNTI0LDE0ICs1MjgsMTQgQEAKIAltbG9nKDAsICJpbm9kZS0+aXBfY2x1c3RlcnMgPSAldVxuIiwgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKIAogCS8qIGNhbGwgdGhlIGtlcm5lbHMgam91cm5hbCBpbml0IGZ1bmN0aW9uIG5vdyAqLwotCWpfam91cm5hbCA9IGpvdXJuYWxfaW5pdF9pbm9kZShpbm9kZSk7CisJal9qb3VybmFsID0gamJkMl9qb3VybmFsX2luaXRfaW5vZGUoaW5vZGUpOwogCWlmIChqX2pvdXJuYWwgPT0gTlVMTCkgewogCQltbG9nKE1MX0VSUk9SLCAiTGludXggam91cm5hbCBsYXllciBlcnJvclxuIik7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQltbG9nKDAsICJSZXR1cm5lZCBmcm9tIGpvdXJuYWxfaW5pdF9pbm9kZVxuIik7CisJbWxvZygwLCAiUmV0dXJuZWQgZnJvbSBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZVxuIik7CiAJbWxvZygwLCAial9qb3VybmFsLT5qX21heGxlbiA9ICV1XG4iLCBqX2pvdXJuYWwtPmpfbWF4bGVuKTsKIAogCSpkaXJ0eSA9IChsZTMyX3RvX2NwdShkaS0+aWQxLmpvdXJuYWwxLmlqX2ZsYWdzKSAmCkBAIC01NTAsOCArNTU0LDcgQEAKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoaW5vZGVfbG9jaykKIAkJCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMSk7Ci0JCWlmIChiaCAhPSBOVUxMKQotCQkJYnJlbHNlKGJoKTsKKwkJYnJlbHNlKGJoKTsKIAkJaWYgKGlub2RlKSB7CiAJCQlPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9jb3VudC0tOwogCQkJaXB1dChpbm9kZSk7CkBAIC02MzksNyArNjQyLDcgQEAKIAlpZiAoam91cm5hbC0+al9zdGF0ZSAhPSBPQ0ZTMl9KT1VSTkFMX0xPQURFRCkKIAkJZ290byBkb25lOwogCi0JLyogbmVlZCB0byBpbmMgaW5vZGUgdXNlIGNvdW50IGFzIGpvdXJuYWxfZGVzdHJveSB3aWxsIGlwdXQuICovCisJLyogbmVlZCB0byBpbmMgaW5vZGUgdXNlIGNvdW50IC0gamJkMl9qb3VybmFsX2Rlc3Ryb3kgd2lsbCBpcHV0LiAqLwogCWlmICghaWdyYWIoaW5vZGUpKQogCQlCVUcoKTsKIApAQCAtNjY4LDkgKzY3MSw5IEBACiAJQlVHX09OKGF0b21pY19yZWFkKCYob3NiLT5qb3VybmFsLT5qX251bV90cmFucykpICE9IDApOwogCiAJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpIHsKLQkJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKLQkJc3RhdHVzID0gam91cm5hbF9mbHVzaChqb3VybmFsLT5qX2pvdXJuYWwpOwotCQlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwtPmpfam91cm5hbCk7CisJCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKKwkJc3RhdHVzID0gamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwtPmpfam91cm5hbCk7CisJCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAl9CkBAIC02ODYsNyArNjg5LDcgQEAKIAl9CiAKIAkvKiBTaHV0ZG93biB0aGUga2VybmVsIGpvdXJuYWwgc3lzdGVtICovCi0Jam91cm5hbF9kZXN0cm95KGpvdXJuYWwtPmpfam91cm5hbCk7CisJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbC0+al9qb3VybmFsKTsKIAogCU9DRlMyX0koaW5vZGUpLT5pcF9vcGVuX2NvdW50LS07CiAKQEAgLTcxMSwxNSArNzE0LDE1IEBACiB7CiAJaW50IG9sZGVycjsKIAotCW9sZGVyciA9IGpvdXJuYWxfZXJybm8oam91cm5hbCk7CisJb2xkZXJyID0gamJkMl9qb3VybmFsX2Vycm5vKGpvdXJuYWwpOwogCWlmIChvbGRlcnIpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIkZpbGUgc3lzdGVtIGVycm9yICVkIHJlY29yZGVkIGluICIKIAkJICAgICAiam91cm5hbCAldS5cbiIsIG9sZGVyciwgc2xvdCk7CiAJCW1sb2coTUxfRVJST1IsICJGaWxlIHN5c3RlbSBvbiBkZXZpY2UgJXMgbmVlZHMgY2hlY2tpbmcuXG4iLAogCQkgICAgIHNiLT5zX2lkKTsKIAotCQlqb3VybmFsX2Fja19lcnIoam91cm5hbCk7Ci0JCWpvdXJuYWxfY2xlYXJfZXJyKGpvdXJuYWwpOworCQlqYmQyX2pvdXJuYWxfYWNrX2Vycihqb3VybmFsKTsKKwkJamJkMl9qb3VybmFsX2NsZWFyX2Vycihqb3VybmFsKTsKIAl9CiB9CiAKQEAgLTczNCw3ICs3MzcsNyBAQAogCiAJb3NiID0gam91cm5hbC0+al9vc2I7CiAKLQlzdGF0dXMgPSBqb3VybmFsX2xvYWQoam91cm5hbC0+al9qb3VybmFsKTsKKwlzdGF0dXMgPSBqYmQyX2pvdXJuYWxfbG9hZChqb3VybmFsLT5qX2pvdXJuYWwpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gbG9hZCBqb3VybmFsIVxuIik7CiAJCWdvdG8gZG9uZTsKQEAgLTc3OCw3ICs3ODEsNyBAQAogCiAJQlVHX09OKCFqb3VybmFsKTsKIAotCXN0YXR1cyA9IGpvdXJuYWxfd2lwZShqb3VybmFsLT5qX2pvdXJuYWwsIGZ1bGwpOworCXN0YXR1cyA9IGpiZDJfam91cm5hbF93aXBlKGpvdXJuYWwtPmpfam91cm5hbCwgZnVsbCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC04NDcsOSArODUwLDggQEAKIAogCQkvKiBXZSBhcmUgcmVhZGluZyBqb3VybmFsIGRhdGEgd2hpY2ggc2hvdWxkIG5vdAogCQkgKiBiZSBwdXQgaW4gdGhlIHVwdG9kYXRlIGNhY2hlICovCi0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkJICAgcF9ibGtubywgcF9ibG9ja3MsIGJocywgMCwKLQkJCQkJICAgTlVMTCk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzX3N5bmMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJCQkJcF9ibGtubywgcF9ibG9ja3MsIGJocyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC04NjUsOCArODY3LDcgQEAKIAogYmFpbDoKIAlmb3IoaSA9IDA7IGkgPCBDT05DVVJSRU5UX0pPVVJOQUxfRklMTDsgaSsrKQotCQlpZiAoYmhzW2ldKQotCQkJYnJlbHNlKGJoc1tpXSk7CisJCWJyZWxzZShiaHNbaV0pOwogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTMzLDcgKzExMzQsOCBAQAogCX0KIAlTRVRfSU5PREVfSk9VUk5BTChpbm9kZSk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBiaCwgMCwgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIDEsIGJoLAorCQkJCSAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMjI5LDE5ICsxMjMxLDE5IEBACiAJfQogCiAJbWxvZygwLCAiY2FsbGluZyBqb3VybmFsX2luaXRfaW5vZGVcbiIpOwotCWpvdXJuYWwgPSBqb3VybmFsX2luaXRfaW5vZGUoaW5vZGUpOworCWpvdXJuYWwgPSBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZShpbm9kZSk7CiAJaWYgKGpvdXJuYWwgPT0gTlVMTCkgewogCQltbG9nKE1MX0VSUk9SLCAiTGludXggam91cm5hbCBsYXllciBlcnJvclxuIik7CiAJCXN0YXR1cyA9IC1FSU87CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlzdGF0dXMgPSBqb3VybmFsX2xvYWQoam91cm5hbCk7CisJc3RhdHVzID0gamJkMl9qb3VybmFsX2xvYWQoam91cm5hbCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlpZiAoIWlncmFiKGlub2RlKSkKIAkJCUJVRygpOwotCQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CisJCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0xMjQ5LDkgKzEyNTEsOSBAQAogCiAJLyogd2lwZSB0aGUgam91cm5hbCAqLwogCW1sb2coMCwgImZsdXNoaW5nIHRoZSBqb3VybmFsLlxuIik7Ci0Jam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7Ci0Jc3RhdHVzID0gam91cm5hbF9mbHVzaChqb3VybmFsKTsKLQlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJc3RhdHVzID0gamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCkBAIC0xMjcyLDcgKzEyNzQsNyBAQAogCWlmICghaWdyYWIoaW5vZGUpKQogCQlCVUcoKTsKIAotCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKKwlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAogZG9uZToKIAkvKiBkcm9wIHRoZSBsb2NrIG9uIHRoaXMgbm9kZXMgam91cm5hbCAqLwpAQCAtMTI4Miw4ICsxMjg0LDcgQEAKIAlpZiAoaW5vZGUpCiAJCWlwdXQoaW5vZGUpOwogCi0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5oIGIvZnMvb2NmczIvam91cm5hbC5oCmluZGV4IDIxNzhlYmYuLmQ0ZDE0ZTkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuaAorKysgYi9mcy9vY2ZzMi9qb3VybmFsLmgKQEAgLTI3LDcgKzI3LDEyIEBACiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfSAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpZm5kZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKKyMgaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvamJkLmg+CisjIGluY2x1ZGUgIm9jZnMyX2piZF9jb21wYXQuaCIKKyNlbmRpZgogCiBlbnVtIG9jZnMyX2pvdXJuYWxfc3RhdGUgewogCU9DRlMyX0pPVVJOQUxfRlJFRSA9IDAsCkBAIC0yMTUsOCArMjIwLDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuIFdpbGwgaGF2ZSB0byBjYWxsIG9jZnMyX2pvdXJuYWxfZGlydHkgb25jZQogICogICAgICAgICAgICAgICAgICAgICAgICAgIHdlJ3ZlIGFjdHVhbGx5IGRpcnRpZWQgaXQuIFR5cGUgaXMgb25lIG9mIC4gb3IgLgogICogIG9jZnMyX2pvdXJuYWxfZGlydHkgICAgLSBNYXJrIGEgam91cm5hbGxlZCBidWZmZXIgYXMgaGF2aW5nIGRpcnR5IGRhdGEuCi0gKiAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhIC0gSW5kaWNhdGUgdGhhdCBhIGRhdGEgYnVmZmVyIHNob3VsZCBnbyBvdXQgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgaGFuZGxlIGNvbW1pdHMuCisgKiAgb2NmczJfamJkMl9maWxlX2lub2RlICAtIE1hcmsgYW4gaW5vZGUgc28gdGhhdCBpdHMgZGF0YSBnb2VzIG91dCBiZWZvcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgaGFuZGxlIGNvbW1pdHMuCiAgKi8KIAogLyogWW91IG11c3QgYWx3YXlzIHN0YXJ0X3RyYW5zIHdpdGggYSBudW1iZXIgb2YgYnVmZnMgPiAwLCBidXQgaXQncwpAQCAtMjY4LDggKzI3MywxMCBAQAogICovCiBpbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKyNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAogaW50ICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworI2VuZGlmCiAKIC8qCiAgKiAgQ3JlZGl0IE1hY3JvczoKQEAgLTI4Myw2ICsyOTAsOSBAQAogLyogc2ltcGxlIGZpbGUgdXBkYXRlcyBsaWtlIGNobW9kLCBldGMuICovCiAjZGVmaW5lIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTIDEKIAorLyogZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrIHVwZGF0ZSAqLworI2RlZmluZSBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyAxCisKIC8qIGdyb3VwIGV4dGVuZC4gaW5vZGUgdXBkYXRlIGFuZCBsYXN0IGdyb3VwIHVwZGF0ZS4gKi8KICNkZWZpbmUgT0NGUzJfR1JPVVBfRVhURU5EX0NSRURJVFMJKE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsgMSkKIApAQCAtMzQwLDExICszNTAsMjMgQEAKICNkZWZpbmUgT0NGUzJfUkVOQU1FX0NSRURJVFMgKDMgKiBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArIDMgICAgICAgICAgICAgIFwKIAkJCSAgICAgKyBPQ0ZTMl9VTkxJTktfQ1JFRElUUykKIAorLyogZ2xvYmFsIGJpdG1hcCBkaW5vZGUsIGdyb3VwIGRlc2MuLCByZWxpbmtlZCBncm91cCwKKyAqIHN1YmFsbG9jYXRvciBkaW5vZGUsIGdyb3VwIGRlc2MuLCByZWxpbmtlZCBncm91cCwKKyAqIGRpbm9kZSwgeGF0dHIgYmxvY2sgKi8KKyNkZWZpbmUgT0NGUzJfWEFUVFJfQkxPQ0tfQ1JFQVRFX0NSRURJVFMgKE9DRlMyX1NVQkFMTE9DX0FMTE9DICogMiArIFwKKwkJCQkJICArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTIFwKKwkJCQkJICArIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTKQorCisvKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgcm9vdF9lbCBpcyB0aGUgcm9vdAorICogb2YgZXh0ZW50IHRyZWUuIFNvIGZvciBhbiBpbm9kZSwgaXQgc2hvdWxkIGJlICZmZS0+aWQyLmlfbGlzdC4gT3RoZXJ3aXNlCisgKiB0aGUgcmVzdWx0IG1heSBiZSB3cm9uZy4KKyAqLwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCiAJCQkJCSAgICB1MzIgYml0c193YW50ZWQpCiB7Ci0JaW50IGJpdG1hcF9ibG9ja3MsIHN5c2ZpbGVfYml0bWFwX2Jsb2NrcywgZGlub2RlX2Jsb2NrczsKKwlpbnQgYml0bWFwX2Jsb2Nrcywgc3lzZmlsZV9iaXRtYXBfYmxvY2tzLCBleHRlbnRfYmxvY2tzOwogCiAJLyogYml0bWFwIGRpbm9kZSwgZ3JvdXAgZGVzYy4gKyByZWxpbmtlZCBncm91cC4gKi8KIAliaXRtYXBfYmxvY2tzID0gT0NGUzJfU1VCQUxMT0NfQUxMT0M7CkBAIC0zNTUsMTYgKzM3NywxNiBAQAogCSAqIGhvd2V2ZXIgbWFueSBtZXRhZGF0YSBjaHVua3MgbmVlZGVkICogYSByZW1haW5pbmcgc3ViYWxsb2MKIAkgKiBhbGxvYy4gKi8KIAlzeXNmaWxlX2JpdG1hcF9ibG9ja3MgPSAxICsKLQkJKE9DRlMyX1NVQkFMTE9DX0FMTE9DIC0gMSkgKiBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZmUpOworCQkoT0NGUzJfU1VCQUxMT0NfQUxMT0MgLSAxKSAqIG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChyb290X2VsKTsKIAogCS8qIHRoaXMgZG9lcyBub3QgaW5jbHVkZSAqbmV3KiBtZXRhZGF0YSBibG9ja3MsIHdoaWNoIGFyZQotCSAqIGFjY291bnRlZCBmb3IgaW4gc3lzZmlsZV9iaXRtYXBfYmxvY2tzLiBmZSArCisJICogYWNjb3VudGVkIGZvciBpbiBzeXNmaWxlX2JpdG1hcF9ibG9ja3MuIHJvb3RfZWwgKwogCSAqIHByZXYuIGxhc3RfZWJfYmxrICsgYmxvY2tzIGFsb25nIGVkZ2Ugb2YgdHJlZS4KIAkgKiBjYWxjX3N5bWxpbmtfY3JlZGl0cyBwYXNzZXMgYmVjYXVzZSB3ZSBqdXN0IG5lZWQgMQogCSAqIGNyZWRpdCBmb3IgdGhlIGRpbm9kZSB0aGVyZS4gKi8KLQlkaW5vZGVfYmxvY2tzID0gMSArIDEgKyBsZTE2X3RvX2NwdShmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpOworCWV4dGVudF9ibG9ja3MgPSAxICsgMSArIGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfdHJlZV9kZXB0aCk7CiAKLQlyZXR1cm4gYml0bWFwX2Jsb2NrcyArIHN5c2ZpbGVfYml0bWFwX2Jsb2NrcyArIGRpbm9kZV9ibG9ja3M7CisJcmV0dXJuIGJpdG1hcF9ibG9ja3MgKyBzeXNmaWxlX2JpdG1hcF9ibG9ja3MgKyBleHRlbnRfYmxvY2tzOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9jYWxjX3N5bWxpbmtfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtNDE1LDQgKzQzNywxNiBAQAogCXJldHVybiBjcmVkaXRzOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlLCAmT0NGUzJfSShpbm9kZSktPmlwX2ppbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgIGxvZmZfdCBuZXdfc2l6ZSkKK3sKKwlyZXR1cm4gamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9qaW5vZGUsCisJCQkJCQkgICBuZXdfc2l6ZSk7Cit9CisKICNlbmRpZiAvKiBPQ0ZTMl9KT1VSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuYwppbmRleCAyOGU0OTJlLi42ODdiMjg3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKKysrIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9ESVNLX0FMTE9DCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC00Nyw4ICs0OCw2IEBACiAKICNkZWZpbmUgT0NGUzJfTE9DQUxfQUxMT0MoZGlub2RlKQkoJigoZGlub2RlKS0+aWQyLmlfbGFiKSkKIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwotCiBzdGF0aWMgdTMyIG9jZnMyX2xvY2FsX2FsbG9jX2NvdW50X2JpdHMoc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MpOwogCiBzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2FsbG9jX2ZpbmRfY2xlYXJfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKQEAgLTc1LDI0ICs3NCwxMjkgQEAKIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2Nfc2xpZGVfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCQkgIHN0cnVjdCBpbm9kZSAqbG9jYWxfYWxsb2NfaW5vZGUpOwogCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKLXsKLQlCVUdfT04ob3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMgPiAyMCk7CisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1NUQVRTCiAKLQkvKiBTaXplIGxvY2FsIGFsbG9jIHdpbmRvd3MgYnkgdGhlIG1lZ2FieXRlICovCi0JcmV0dXJuIG9zYi0+bG9jYWxfYWxsb2Nfc2l6ZSA8PCAoMjAgLSBvc2ItPnNfY2x1c3RlcnNpemVfYml0cyk7CitzdGF0aWMgaW50IG9jZnMyX2xhX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBMQV9ERUJVR19CVUZfU1oJUEFHRV9DQUNIRV9TSVpFCisjZGVmaW5lIExBX0RFQlVHX1ZFUgkxCitzdGF0aWMgc3NpemVfdCBvY2ZzMl9sYV9kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdGF0aWMgREVGSU5FX01VVEVYKGxhX2RlYnVnX211dGV4KTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgd3JpdHRlbiwgcmV0OworCWNoYXIgKmJ1ZiA9IG9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmOworCisJbXV0ZXhfbG9jaygmbGFfZGVidWdfbXV0ZXgpOworCW1lbXNldChidWYsIDAsIExBX0RFQlVHX0JVRl9TWik7CisKKwl3cml0dGVuID0gc25wcmludGYoYnVmLCBMQV9ERUJVR19CVUZfU1osCisJCQkgICAiMHgleFx0MHglbGx4XHQldVx0JXVcdDB4JXhcbiIsCisJCQkgICBMQV9ERUJVR19WRVIsCisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW9zYi0+bGFfbGFzdF9nZCwKKwkJCSAgIG9zYi0+bG9jYWxfYWxsb2NfZGVmYXVsdF9iaXRzLAorCQkJICAgb3NiLT5sb2NhbF9hbGxvY19iaXRzLCBvc2ItPmxvY2FsX2FsbG9jX3N0YXRlKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHdyaXR0ZW4pOworCisJbXV0ZXhfdW5sb2NrKCZsYV9kZWJ1Z19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfbGFfZGVidWdfZm9wcyA9IHsKKwkub3BlbiA9CQlvY2ZzMl9sYV9kZWJ1Z19vcGVuLAorCS5yZWFkID0JCW9jZnMyX2xhX2RlYnVnX3JlYWQsCit9OworCitzdGF0aWMgdm9pZCBvY2ZzMl9pbml0X2xhX2RlYnVnKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCW9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmID0ga21hbGxvYyhMQV9ERUJVR19CVUZfU1osIEdGUF9OT0ZTKTsKKwlpZiAoIW9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmKQorCQlyZXR1cm47CisKKwlvc2ItPmxvY2FsX2FsbG9jX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZmlsZSgibG9jYWxfYWxsb2Nfc3RhdHMiLAorCQkJCQkJICAgICBTX0lGUkVHfFNfSVJVU1IsCisJCQkJCQkgICAgIG9zYi0+b3NiX2RlYnVnX3Jvb3QsCisJCQkJCQkgICAgIG9zYiwKKwkJCQkJCSAgICAgJm9jZnMyX2xhX2RlYnVnX2ZvcHMpOworCWlmICghb3NiLT5sb2NhbF9hbGxvY19kZWJ1ZykgeworCQlrZnJlZShvc2ItPmxvY2FsX2FsbG9jX2RlYnVnX2J1Zik7CisJCW9zYi0+bG9jYWxfYWxsb2NfZGVidWdfYnVmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3NodXRkb3duX2xhX2RlYnVnKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCWlmIChvc2ItPmxvY2FsX2FsbG9jX2RlYnVnKQorCQlkZWJ1Z2ZzX3JlbW92ZShvc2ItPmxvY2FsX2FsbG9jX2RlYnVnKTsKKworCWlmIChvc2ItPmxvY2FsX2FsbG9jX2RlYnVnX2J1ZikKKwkJa2ZyZWUob3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWYpOworCisJb3NiLT5sb2NhbF9hbGxvY19kZWJ1Z19idWYgPSBOVUxMOworCW9zYi0+bG9jYWxfYWxsb2NfZGVidWcgPSBOVUxMOworfQorI2Vsc2UJLyogQ09ORklHX09DRlMyX0ZTX1NUQVRTICovCitzdGF0aWMgdm9pZCBvY2ZzMl9pbml0X2xhX2RlYnVnKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIG9jZnMyX3NodXRkb3duX2xhX2RlYnVnKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9sYV9zdGF0ZV9lbmFibGVkKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXJldHVybiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9USFJPVFRMRUQgfHwKKwkJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9FTkFCTEVEKTsKK30KKwordm9pZCBvY2ZzMl9sb2NhbF9hbGxvY19zZWVuX2ZyZWVfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKQoreworCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPT0gT0NGUzJfTEFfRElTQUJMRUQgfHwKKwkgICAgb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9USFJPVFRMRUQpCisJCWlmIChudW1fY2x1c3RlcnMgPj0gb3NiLT5sb2NhbF9hbGxvY19kZWZhdWx0X2JpdHMpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJm9zYi0+bGFfZW5hYmxlX3dxKTsKKwkJCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9FTkFCTEVEOworCQl9CisJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworfQorCit2b2lkIG9jZnMyX2xhX2VuYWJsZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY2ZzMl9zdXBlciwKKwkJCSAgICAgbGFfZW5hYmxlX3dxLndvcmspOworCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9IE9DRlMyX0xBX0VOQUJMRUQ7CisJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOwogfQogCiAvKgogICogVGVsbCB1cyB3aGV0aGVyIGEgZ2l2ZW4gYWxsb2NhdGlvbiBzaG91bGQgdXNlIHRoZSBsb2NhbCBhbGxvYwogICogZmlsZS4gT3RoZXJ3aXNlLCBpdCBoYXMgdG8gZ28gdG8gdGhlIG1haW4gYml0bWFwLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBzZW1pLWRpcnR5IHJlYWRzIG9mIGxvY2FsIGFsbG9jIHNpemUgYW5kIHN0YXRlIQorICogVGhpcyBpcyBvayBob3dldmVyLCBhcyB0aGUgdmFsdWVzIGFyZSByZS1jaGVja2VkIG9uY2UgdW5kZXIgbXV0ZXguCiAgKi8KIGludCBvY2ZzMl9hbGxvY19zaG91bGRfdXNlX2xvY2FsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCB1NjQgYml0cykKIHsKLQlpbnQgbGFfYml0cyA9IG9jZnMyX2xvY2FsX2FsbG9jX3dpbmRvd19iaXRzKG9zYik7CiAJaW50IHJldCA9IDA7CisJaW50IGxhX2JpdHM7CiAKLQlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSAhPSBPQ0ZTMl9MQV9FTkFCTEVEKQorCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJbGFfYml0cyA9IG9zYi0+bG9jYWxfYWxsb2NfYml0czsKKworCWlmICghb2NmczJfbGFfc3RhdGVfZW5hYmxlZChvc2IpKQogCQlnb3RvIGJhaWw7CiAKIAkvKiBsYV9iaXRzIHNob3VsZCBiZSBhdCBsZWFzdCB0d2ljZSB0aGUgc2l6ZSAoaW4gY2x1c3RlcnMpIG9mCkBAIC0xMDYsNiArMjEwLDcgQEAKIGJhaWw6CiAJbWxvZygwLCAic3RhdGU9JWQsIGJpdHM9JWxsdSwgbGFfYml0cz0lZCwgcmV0PSVkXG4iLAogCSAgICAgb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRzLCBsYV9iaXRzLCByZXQpOworCXNwaW5fdW5sb2NrKCZvc2ItPm9zYl9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjAsMTQgKzIyNSwxOCBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlpZiAob3NiLT5sb2NhbF9hbGxvY19zaXplID09IDApCisJb2NmczJfaW5pdF9sYV9kZWJ1Zyhvc2IpOworCisJaWYgKG9zYi0+bG9jYWxfYWxsb2NfYml0cyA9PSAwKQogCQlnb3RvIGJhaWw7CiAKLQlpZiAob2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKSA+PSBvc2ItPmJpdG1hcF9jcGcpIHsKKwlpZiAob3NiLT5sb2NhbF9hbGxvY19iaXRzID49IG9zYi0+Yml0bWFwX2NwZykgewogCQltbG9nKE1MX05PVElDRSwgIlJlcXVlc3RlZCBsb2NhbCBhbGxvYyB3aW5kb3cgJWQgaXMgbGFyZ2VyICIKIAkJICAgICAidGhhbiBtYXggcG9zc2libGUgJXUuIFVzaW5nIGRlZmF1bHRzLlxuIiwKLQkJICAgICBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpLCAob3NiLT5iaXRtYXBfY3BnIC0gMSkpOwotCQlvc2ItPmxvY2FsX2FsbG9jX3NpemUgPSBPQ0ZTMl9ERUZBVUxUX0xPQ0FMX0FMTE9DX1NJWkU7CisJCSAgICAgb3NiLT5sb2NhbF9hbGxvY19iaXRzLCAob3NiLT5iaXRtYXBfY3BnIC0gMSkpOworCQlvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPQorCQkJb2NmczJfbWVnYWJ5dGVzX3RvX2NsdXN0ZXJzKG9zYi0+c2IsCisJCQkJCQkgICAgT0NGUzJfREVGQVVMVF9MT0NBTF9BTExPQ19TSVpFKTsKIAl9CiAKIAkvKiByZWFkIHRoZSBhbGxvYyBvZmYgZGlzayAqLwpAQCAtMTM5LDggKzI0OCw4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgJmFsbG9jX2JoLCAwLCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwKKwkJCQkgICAmYWxsb2NfYmgsIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xODUsMTMgKzI5NCwxNCBAQAogCiBiYWlsOgogCWlmIChzdGF0dXMgPCAwKQotCQlpZiAoYWxsb2NfYmgpCi0JCQlicmVsc2UoYWxsb2NfYmgpOworCQlicmVsc2UoYWxsb2NfYmgpOwogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CiAKLQltbG9nKDAsICJMb2NhbCBhbGxvYyB3aW5kb3cgYml0cyA9ICVkXG4iLAotCSAgICAgb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCW9jZnMyX3NodXRkb3duX2xhX2RlYnVnKG9zYik7CisKKwltbG9nKDAsICJMb2NhbCBhbGxvYyB3aW5kb3cgYml0cyA9ICVkXG4iLCBvc2ItPmxvY2FsX2FsbG9jX2JpdHMpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTIxNyw2ICszMjcsMTEgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmb3NiLT5sYV9lbmFibGVfd3EpOworCWZsdXNoX3dvcmtxdWV1ZShvY2ZzMl93cSk7CisKKwlvY2ZzMl9zaHV0ZG93bl9sYV9kZWJ1Zyhvc2IpOworCiAJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPT0gT0NGUzJfTEFfVU5VU0VEKQogCQlnb3RvIG91dDsKIApAQCAtMjk1LDggKzQxMCw3IEBACiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogb3V0X3VubG9jazoKLQlpZiAobWFpbl9ibV9iaCkKLQkJYnJlbHNlKG1haW5fYm1fYmgpOworCWJyZWxzZShtYWluX2JtX2JoKTsKIAogCW9jZnMyX2lub2RlX3VubG9jayhtYWluX2JtX2lub2RlLCAxKTsKIApAQCAtMzQ1LDggKzQ1OSw4IEBACiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgJmFsbG9jX2JoLCAwLCBpbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwKKwkJCQkgICAmYWxsb2NfYmgsIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0zNzIsOCArNDg2LDcgQEAKIAkJKmFsbG9jX2NvcHkgPSBOVUxMOwogCX0KIAotCWlmIChhbGxvY19iaCkKLQkJYnJlbHNlKGFsbG9jX2JoKTsKKwlicmVsc2UoYWxsb2NfYmgpOwogCiAJaWYgKGlub2RlKSB7CiAJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwpAQCAtNDQxLDggKzU1NCw3IEBACiBvdXRfbXV0ZXg6CiAJbXV0ZXhfdW5sb2NrKCZtYWluX2JtX2lub2RlLT5pX211dGV4KTsKIAotCWlmIChtYWluX2JtX2JoKQotCQlicmVsc2UobWFpbl9ibV9iaCk7CisJYnJlbHNlKG1haW5fYm1fYmgpOwogCiAJaXB1dChtYWluX2JtX2lub2RlKTsKIApAQCAtNDUzLDggKzU2NSw0OCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbG9jYWwgYWxsb2Mgd2luZG93IGlzIHdpdGhpbiBhYy0+YWNfbWF4X2Jsb2NrICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2FsbG9jX2luX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAorCQkJCSAgICAgIHUzMiBiaXRzX3dhbnRlZCkKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICphbGxvYzsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfYWxsb2MgKmxhOworCWludCBzdGFydDsKKwl1NjQgYmxvY2tfb2ZmOworCisJaWYgKCFhYy0+YWNfbWF4X2Jsb2NrKQorCQlyZXR1cm4gMTsKKworCWFsbG9jID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3NiLT5sb2NhbF9hbGxvY19iaC0+Yl9kYXRhOworCWxhID0gT0NGUzJfTE9DQUxfQUxMT0MoYWxsb2MpOworCisJc3RhcnQgPSBvY2ZzMl9sb2NhbF9hbGxvY19maW5kX2NsZWFyX2JpdHMob3NiLCBhbGxvYywgYml0c193YW50ZWQpOworCWlmIChzdGFydCA9PSAtMSkgeworCQltbG9nX2Vycm5vKC1FTk9TUEMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENvbnZlcnRpbmcgKGJtX29mZiArIHN0YXJ0ICsgYml0c193YW50ZWQpIHRvIGJsb2NrcyBnaXZlcyB1cworCSAqIHRoZSBibGtubyBqdXN0IHBhc3Qgb3VyIGFjdHVhbCBhbGxvY2F0aW9uLiAgVGhpcyBpcyBwZXJmZWN0CisJICogdG8gY29tcGFyZSB3aXRoIGFjX21heF9ibG9jay4KKwkgKi8KKwlibG9ja19vZmYgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgbGUzMl90b19jcHUobGEtPmxhX2JtX29mZikgKworCQkJCQkgICAgIHN0YXJ0ICsgYml0c193YW50ZWQpOworCW1sb2coMCwgIkNoZWNraW5nICVsbHUgYWdhaW5zdCAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9ja19vZmYsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFjLT5hY19tYXhfYmxvY2spOworCWlmIChibG9ja19vZmYgPiBhYy0+YWNfbWF4X2Jsb2NrKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiAvKgotICogbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhdCBsZWFzdCBiaXRzd2FudGVkIGNvbnRpZ3VvdXMgYml0cyBpbiB0aGUKKyAqIG1ha2Ugc3VyZSB3ZSd2ZSBnb3QgYXQgbGVhc3QgYml0c193YW50ZWQgY29udGlndW91cyBiaXRzIGluIHRoZQogICogbG9jYWwgYWxsb2MuIFlvdSBsb3NlIHRoZW0gd2hlbiB5b3UgZHJvcCBpX211dGV4LgogICoKICAqIFdlIHdpbGwgYWRkIG91cnNlbHZlcyB0byB0aGUgdHJhbnNhY3Rpb24gcGFzc2VkIGluLCBidXQgbWF5IHN0YXJ0CkBAIC00ODUsMTYgKzYzNywxOCBAQAogCiAJbXV0ZXhfbG9jaygmbG9jYWxfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwogCi0JaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgIT0gT0NGUzJfTEFfRU5BQkxFRCkgeworCS8qCisJICogV2UgbXVzdCBkb3VibGUgY2hlY2sgc3RhdGUgYW5kIGFsbG9jYXRvciBiaXRzIGJlY2F1c2UKKwkgKiBhbm90aGVyIHByb2Nlc3MgbWF5IGhhdmUgY2hhbmdlZCB0aGVtIHdoaWxlIGhvbGRpbmcgaV9tdXRleC4KKwkgKi8KKwlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOworCWlmICghb2NmczJfbGFfc3RhdGVfZW5hYmxlZChvc2IpIHx8CisJICAgIChiaXRzX3dhbnRlZCA+IG9zYi0+bG9jYWxfYWxsb2NfYml0cykpIHsKKwkJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOwogCQlzdGF0dXMgPSAtRU5PU1BDOwogCQlnb3RvIGJhaWw7CiAJfQotCi0JaWYgKGJpdHNfd2FudGVkID4gb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKSkgewotCQltbG9nKDAsICJBc2tpbmcgZm9yIG1vcmUgdGhhbiBteSBtYXggd2luZG93IHNpemUhXG4iKTsKLQkJc3RhdHVzID0gLUVOT1NQQzsKLQkJZ290byBiYWlsOwotCX0KKwlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CiAKIAlhbGxvYyA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIG9zYi0+bG9jYWxfYWxsb2NfYmgtPmJfZGF0YTsKIApAQCAtNTIyLDYgKzY3NiwzNiBAQAogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQorCisJCS8qCisJCSAqIFVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIHdpbmRvdyBzbGlkZSBjb2RlCisJCSAqIG1pZ2h0IGhhdmUgcmVkdWNlZCB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIG9yCisJCSAqIGRpc2FibGVkIHRoZSB0aGUgbG9jYWwgYWxsb2MgZW50aXJlbHkuIFJlLWNoZWNrCisJCSAqIGhlcmUgYW5kIHJldHVybiAtRU5PU1BDIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCXN0YXR1cyA9IC1FTk9TUEM7CisJCWlmICghb2NmczJfbGFfc3RhdGVfZW5hYmxlZChvc2IpKQorCQkJZ290byBiYWlsOworCisJCWZyZWVfYml0cyA9IGxlMzJfdG9fY3B1KGFsbG9jLT5pZDEuYml0bWFwMS5pX3RvdGFsKSAtCisJCQlsZTMyX3RvX2NwdShhbGxvYy0+aWQxLmJpdG1hcDEuaV91c2VkKTsKKwkJaWYgKGJpdHNfd2FudGVkID4gZnJlZV9iaXRzKQorCQkJZ290byBiYWlsOworCX0KKworCWlmIChhYy0+YWNfbWF4X2Jsb2NrKQorCQltbG9nKDAsICJDYWxsaW5nIGluX3JhbmdlIGZvciBtYXggYmxvY2sgJWxsdVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFjLT5hY19tYXhfYmxvY2spOworCisJaWYgKCFvY2ZzMl9sb2NhbF9hbGxvY19pbl9yYW5nZShsb2NhbF9hbGxvY19pbm9kZSwgYWMsCisJCQkJCWJpdHNfd2FudGVkKSkgeworCQkvKgorCQkgKiBUaGUgd2luZG93IGlzIG91dHNpZGUgYWMtPmFjX21heF9ibG9jay4KKwkJICogVGhpcyBlcnJubyB0ZWxscyB0aGUgY2FsbGVyIHRvIGtlZXAgbG9jYWxhbGxvYyBlbmFibGVkCisJCSAqIGJ1dCB0byBnZXQgdGhlIGFsbG9jYXRpb24gZnJvbSB0aGUgbWFpbiBiaXRtYXAuCisJCSAqLworCQlzdGF0dXMgPSAtRUZCSUc7CisJCWdvdG8gYmFpbDsKIAl9CiAKIAlhYy0+YWNfaW5vZGUgPSBsb2NhbF9hbGxvY19pbm9kZTsKQEAgLTc4OSw2ICs5NzMsODUgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitlbnVtIG9jZnMyX2xhX2V2ZW50IHsKKwlPQ0ZTMl9MQV9FVkVOVF9TTElERSwJCS8qIE5vcm1hbCB3aW5kb3cgc2xpZGUuICovCisJT0NGUzJfTEFfRVZFTlRfRlJBR01FTlRFRCwJLyogVGhlIGdsb2JhbCBiaXRtYXAgaGFzCisJCQkJCSAqIGVub3VnaCBiaXRzIHRoZW9yZXRpY2FsbHkKKwkJCQkJICogZnJlZSwgYnV0IGEgY29udGlndW91cworCQkJCQkgKiBhbGxvY2F0aW9uIGNvdWxkIG5vdCBiZQorCQkJCQkgKiBmb3VuZC4gKi8KKwlPQ0ZTMl9MQV9FVkVOVF9FTk9TUEMsCQkvKiBHbG9iYWwgYml0bWFwIGRvZXNuJ3QgaGF2ZQorCQkJCQkgKiBlbm91Z2ggYml0cyBmcmVlIHRvIHNhdGlzZnkKKwkJCQkJICogb3VyIHJlcXVlc3QuICovCit9OworI2RlZmluZSBPQ0ZTMl9MQV9FTkFCTEVfSU5URVJWQUwgKDMwICogSFopCisvKgorICogR2l2ZW4gYW4gZXZlbnQsIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBvdXIgbmV4dCBsb2NhbCBhbGxvYyB3aW5kb3cuCisgKgorICogVGhpcyBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB1bmRlciBpX211dGV4IG9mIHRoZSBsb2NhbCBhbGxvYyBpbm9kZQorICogc28gdGhhdCBsb2NhbCBhbGxvYyBkaXNhYmxpbmcgZG9lc24ndCByYWNlIHdpdGggcHJvY2Vzc2VzIHRyeWluZyB0bworICogdXNlIHRoZSBhbGxvY2F0b3IuCisgKgorICogUmV0dXJucyB0aGUgc3RhdGUgd2hpY2ggdGhlIGxvY2FsIGFsbG9jIHdhcyBsZWZ0IGluLiBUaGlzIHZhbHVlIGNhbgorICogYmUgaWdub3JlZCBieSBzb21lIHBhdGhzLgorICovCitzdGF0aWMgaW50IG9jZnMyX3JlY2FsY19sYV93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJICBlbnVtIG9jZnMyX2xhX2V2ZW50IGV2ZW50KQoreworCXVuc2lnbmVkIGludCBiaXRzOworCWludCBzdGF0ZTsKKworCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPT0gT0NGUzJfTEFfRElTQUJMRUQpIHsKKwkJV0FSTl9PTl9PTkNFKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPT0gT0NGUzJfTEFfRElTQUJMRUQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyoKKwkgKiBFTk9TUEMgYW5kIGZyYWdtZW50YXRpb24gYXJlIHRyZWF0ZWQgc2ltaWxhcmx5IGZvciBub3cuCisJICovCisJaWYgKGV2ZW50ID09IE9DRlMyX0xBX0VWRU5UX0VOT1NQQyB8fAorCSAgICBldmVudCA9PSBPQ0ZTMl9MQV9FVkVOVF9GUkFHTUVOVEVEKSB7CisJCS8qCisJCSAqIFdlIHJhbiBvdXQgb2YgY29udGlndW91cyBzcGFjZSBpbiB0aGUgcHJpbWFyeQorCQkgKiBiaXRtYXAuIERyYXN0aWNhbGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZAorCQkgKiBieSBsb2NhbCBhbGxvYyB1bnRpbCB3ZSBoYXZlIHRvIGRpc2FibGUgaXQuCisJCSAqLworCQliaXRzID0gb3NiLT5sb2NhbF9hbGxvY19iaXRzID4+IDE7CisJCWlmIChiaXRzID4gb2NmczJfbWVnYWJ5dGVzX3RvX2NsdXN0ZXJzKG9zYi0+c2IsIDEpKSB7CisJCQkvKgorCQkJICogQnkgc2V0dGluZyBzdGF0ZSB0byBUSFJPVFRMRUQsIHdlJ2xsIGtlZXAKKwkJCSAqIHRoZSBudW1iZXIgb2YgbG9jYWwgYWxsb2MgYml0cyB1c2VkIGRvd24KKwkJCSAqIHVudGlsIGFuIGV2ZW50IG9jY3VycyB3aGljaCB3b3VsZCBnaXZlIHVzCisJCQkgKiByZWFzb24gdG8gYXNzdW1lIHRoZSBiaXRtYXAgc2l0dWF0aW9uIG1pZ2h0CisJCQkgKiBoYXZlIGNoYW5nZWQuCisJCQkgKi8KKwkJCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9USFJPVFRMRUQ7CisJCQlvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPSBiaXRzOworCQl9IGVsc2UgeworCQkJb3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9IE9DRlMyX0xBX0RJU0FCTEVEOworCQl9CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhvY2ZzMl93cSwgJm9zYi0+bGFfZW5hYmxlX3dxLAorCQkJCSAgIE9DRlMyX0xBX0VOQUJMRV9JTlRFUlZBTCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKgorCSAqIERvbid0IGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBsb2NhbCBhbGxvYyB3aW5kb3cgdW50aWwgd2UKKwkgKiBrbm93IHdlIG1pZ2h0IGJlIGFibGUgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdC4gT3RoZXJ3aXNlLCB3ZQorCSAqIHJpc2sgYm91bmNpbmcgYXJvdW5kIHRoZSBnbG9iYWwgYml0bWFwIGR1cmluZyBwZXJpb2RzIG9mCisJICogbG93IHNwYWNlLgorCSAqLworCWlmIChvc2ItPmxvY2FsX2FsbG9jX3N0YXRlICE9IE9DRlMyX0xBX1RIUk9UVExFRCkKKwkJb3NiLT5sb2NhbF9hbGxvY19iaXRzID0gb3NiLT5sb2NhbF9hbGxvY19kZWZhdWx0X2JpdHM7CisKK291dF91bmxvY2s6CisJc3RhdGUgPSBvc2ItPmxvY2FsX2FsbG9jX3N0YXRlOworCXNwaW5fdW5sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKworCXJldHVybiBzdGF0ZTsKK30KKwogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19yZXNlcnZlX2Zvcl93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjLAogCQkJCQkJc3RydWN0IGlub2RlICoqYml0bWFwX2lub2RlLApAQCAtODAzLDEyICsxMDY2LDIxIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkoKmFjKS0+YWNfYml0c193YW50ZWQgPSBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpOworcmV0cnlfZW5vc3BjOgorCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9zYi0+bG9jYWxfYWxsb2NfYml0czsKIAogCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3Rlcl9iaXRtYXBfYml0cyhvc2IsICphYyk7CisJaWYgKHN0YXR1cyA9PSAtRU5PU1BDKSB7CisJCWlmIChvY2ZzMl9yZWNhbGNfbGFfd2luZG93KG9zYiwgT0NGUzJfTEFfRVZFTlRfRU5PU1BDKSA9PQorCQkgICAgT0NGUzJfTEFfRElTQUJMRUQpCisJCQlnb3RvIGJhaWw7CisKKwkJb2NmczJfZnJlZV9hY19yZXNvdXJjZSgqYWMpOworCQltZW1zZXQoKmFjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQpKTsKKwkJZ290byByZXRyeV9lbm9zcGM7CisJfQogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCkBAIC04NDksNyArMTEyMSw3IEBACiAJCSAgICAgIm9uZVxuIik7CiAKIAltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGZvciBhIG5ldyB3aW5kb3cuXG4iLAotCSAgICAgb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKSk7CisJICAgICBvc2ItPmxvY2FsX2FsbG9jX2JpdHMpOwogCiAJLyogSW5zdHJ1Y3QgdGhlIGFsbG9jYXRpb24gY29kZSB0byB0cnkgdGhlIG1vc3QgcmVjZW50bHkgdXNlZAogCSAqIGNsdXN0ZXIgZ3JvdXAuIFdlJ2xsIHJlLXJlY29yZCB0aGUgZ3JvdXAgdXNlZCB0aGlzIHBhc3MKQEAgLTg1OSw5ICsxMTMxLDM2IEBACiAJLyogd2UgdXNlZCB0aGUgZ2VuZXJpYyBzdWJhbGxvYyByZXNlcnZlIGZ1bmN0aW9uLCBidXQgd2Ugc2V0CiAJICogZXZlcnl0aGluZyB1cCBuaWNlbHksIHNvIHRoZXJlJ3Mgbm8gcmVhc29uIHdoeSB3ZSBjYW4ndCB1c2UKIAkgKiB0aGUgbW9yZSBzcGVjaWZpYyBjbHVzdGVyIGFwaSB0byBjbGFpbSBiaXRzLiAqLwotCXN0YXR1cyA9IG9jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBhYywKLQkJCQkgICAgICBvY2ZzMl9sb2NhbF9hbGxvY193aW5kb3dfYml0cyhvc2IpLAorCXN0YXR1cyA9IG9jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBhYywgb3NiLT5sb2NhbF9hbGxvY19iaXRzLAogCQkJCSAgICAgICZjbHVzdGVyX29mZiwgJmNsdXN0ZXJfY291bnQpOworCWlmIChzdGF0dXMgPT0gLUVOT1NQQykgeworcmV0cnlfZW5vc3BjOgorCQkvKgorCQkgKiBOb3RlOiBXZSBjb3VsZCBhbHNvIHRyeSBzeW5jaW5nIHRoZSBqb3VybmFsIGhlcmUgdG8KKwkJICogYWxsb3cgdXNlIG9mIGFueSBmcmVlIGJpdHMgd2hpY2ggdGhlIGN1cnJlbnQKKwkJICogdHJhbnNhY3Rpb24gY2FuJ3QgZ2l2ZSB1cyBhY2Nlc3MgdG8uIC0tTWFyaworCQkgKi8KKwkJaWYgKG9jZnMyX3JlY2FsY19sYV93aW5kb3cob3NiLCBPQ0ZTMl9MQV9FVkVOVF9GUkFHTUVOVEVEKSA9PQorCQkgICAgT0NGUzJfTEFfRElTQUJMRUQpCisJCQlnb3RvIGJhaWw7CisKKwkJc3RhdHVzID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGFjLAorCQkJCQkgICAgICBvc2ItPmxvY2FsX2FsbG9jX2JpdHMsCisJCQkJCSAgICAgICZjbHVzdGVyX29mZiwKKwkJCQkJICAgICAgJmNsdXN0ZXJfY291bnQpOworCQlpZiAoc3RhdHVzID09IC1FTk9TUEMpCisJCQlnb3RvIHJldHJ5X2Vub3NwYzsKKwkJLyoKKwkJICogV2Ugb25seSBzaHJ1bmsgdGhlICptaW5pbXVtKiBudW1iZXIgb2YgaW4gb3VyCisJCSAqIHJlcXVlc3QgLSBpdCdzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgdGhlIGFsbG9jYXRvcgorCQkgKiBtaWdodCBnaXZlIHVzIG1vcmUgdGhhbiB3ZSBhc2tlZCBmb3IuCisJCSAqLworCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CisJCQlvc2ItPmxvY2FsX2FsbG9jX2JpdHMgPSBjbHVzdGVyX2NvdW50OworCQkJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworCQl9CisJfQogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTkwNSw2ICsxMjA0LDggQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCisJb2NmczJfcmVjYWxjX2xhX3dpbmRvdyhvc2IsIE9DRlMyX0xBX0VWRU5UX1NMSURFKTsKKwogCS8qIFRoaXMgd2lsbCBsb2NrIHRoZSBtYWluIGJpdG1hcCBmb3IgdXMuICovCiAJc3RhdHVzID0gb2NmczJfbG9jYWxfYWxsb2NfcmVzZXJ2ZV9mb3Jfd2luZG93KG9zYiwKIAkJCQkJCSAgICAgICZhYywKQEAgLTk3Niw4ICsxMjc3LDcgQEAKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCi0JaWYgKG1haW5fYm1fYmgpCi0JCWJyZWxzZShtYWluX2JtX2JoKTsKKwlicmVsc2UobWFpbl9ibV9iaCk7CiAKIAlpZiAobWFpbl9ibV9pbm9kZSkKIAkJaXB1dChtYWluX2JtX2lub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuaCBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuaAppbmRleCAzZjc2NjMxLi5hYzVlYTlmOCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9jYWxhbGxvYy5oCisrKyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuaApAQCAtNTIsNCArNTIsOCBAQAogCQkJCSB1MzIgKmJpdF9vZmYsCiAJCQkJIHUzMiAqbnVtX2JpdHMpOwogCit2b2lkIG9jZnMyX2xvY2FsX2FsbG9jX3NlZW5fZnJlZV9iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpOwordm9pZCBvY2ZzMl9sYV9lbmFibGVfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKICNlbmRpZiAvKiBPQ0ZTMl9MT0NBTEFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2tzLmMgYi9mcy9vY2ZzMi9sb2Nrcy5jCmluZGV4IDIwM2Y4NzEuLjU0NGFjNjIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2xvY2tzLmMKKysrIGIvZnMvb2NmczIvbG9ja3MuYwpAQCAtMjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9JTk9ERQogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtMzIsNiArMzMsNyBAQAogCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImxvY2tzLmgiCiAKIHN0YXRpYyBpbnQgb2NmczJfZG9fZmxvY2soc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0xMjMsMyArMTI1LDE2IEBACiAJZWxzZQogCQlyZXR1cm4gb2NmczJfZG9fZmxvY2soZmlsZSwgaW5vZGUsIGNtZCwgZmwpOwogfQorCitpbnQgb2NmczJfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKworCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX1BPU0lYKSkKKwkJcmV0dXJuIC1FTk9MQ0s7CisJaWYgKF9fbWFuZGF0b3J5X2xvY2soaW5vZGUpKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCXJldHVybiBvY2ZzMl9wbG9jayhvc2ItPmNjb25uLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGZpbGUsIGNtZCwgZmwpOworfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9ja3MuaCBiL2ZzL29jZnMyL2xvY2tzLmgKaW5kZXggOTc0M2VmMi4uNDk2ZDQ4OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9ja3MuaAorKysgYi9mcy9vY2ZzMi9sb2Nrcy5oCkBAIC0yNyw1ICsyNyw2IEBACiAjZGVmaW5lIE9DRlMyX0xPQ0tTX0gKIAogaW50IG9jZnMyX2Zsb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CitpbnQgb2NmczJfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogCiAjZW5kaWYgLyogT0NGUzJfTE9DS1NfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggZDVkODA4Zi4uNDg1YTZhYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSAic3ltbGluay5oIgogI2luY2x1ZGUgInN5c2ZpbGUuaCIKICNpbmNsdWRlICJ1cHRvZGF0ZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCkBAIC0zMjcsMTQgKzMyOCw5IEBACiAJaWYgKHN0YXR1cyA9PSAtRU5PU1BDKQogCQltbG9nKDAsICJEaXNrIGlzIGZ1bGxcbiIpOwogCi0JaWYgKG5ld19mZV9iaCkKLQkJYnJlbHNlKG5ld19mZV9iaCk7Ci0KLQlpZiAoZGVfYmgpCi0JCWJyZWxzZShkZV9iaCk7Ci0KLQlpZiAocGFyZW50X2ZlX2JoKQotCQlicmVsc2UocGFyZW50X2ZlX2JoKTsKKwlicmVsc2UobmV3X2ZlX2JoKTsKKwlicmVsc2UoZGVfYmgpOworCWJyZWxzZShwYXJlbnRfZmVfYmgpOwogCiAJaWYgKChzdGF0dXMgPCAwKSAmJiBpbm9kZSkKIAkJaXB1dChpbm9kZSk7CkBAIC02NDcsMTIgKzY0Myw5IEBACiBvdXQ6CiAJb2NmczJfaW5vZGVfdW5sb2NrKGRpciwgMSk7CiAKLQlpZiAoZGVfYmgpCi0JCWJyZWxzZShkZV9iaCk7Ci0JaWYgKGZlX2JoKQotCQlicmVsc2UoZmVfYmgpOwotCWlmIChwYXJlbnRfZmVfYmgpCi0JCWJyZWxzZShwYXJlbnRfZmVfYmgpOworCWJyZWxzZShkZV9iaCk7CisJYnJlbHNlKGZlX2JoKTsKKwlicmVsc2UocGFyZW50X2ZlX2JoKTsKIAogCW1sb2dfZXhpdChlcnIpOwogCkBAIC04NTEsMTcgKzg0NCwxMCBAQAogCQlpcHV0KG9ycGhhbl9kaXIpOwogCX0KIAotCWlmIChmZV9iaCkKLQkJYnJlbHNlKGZlX2JoKTsKLQotCWlmIChkaXJlbnRfYmgpCi0JCWJyZWxzZShkaXJlbnRfYmgpOwotCi0JaWYgKHBhcmVudF9ub2RlX2JoKQotCQlicmVsc2UocGFyZW50X25vZGVfYmgpOwotCi0JaWYgKG9ycGhhbl9lbnRyeV9iaCkKLQkJYnJlbHNlKG9ycGhhbl9lbnRyeV9iaCk7CisJYnJlbHNlKGZlX2JoKTsKKwlicmVsc2UoZGlyZW50X2JoKTsKKwlicmVsc2UocGFyZW50X25vZGVfYmgpOworCWJyZWxzZShvcnBoYW5fZW50cnlfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAKQEAgLTEzNzIsMjQgKzEzNTgsMTUgQEAKIAogCWlmIChuZXdfaW5vZGUpCiAJCWlwdXQobmV3X2lub2RlKTsKLQlpZiAobmV3ZmVfYmgpCi0JCWJyZWxzZShuZXdmZV9iaCk7Ci0JaWYgKG9sZF9pbm9kZV9iaCkKLQkJYnJlbHNlKG9sZF9pbm9kZV9iaCk7Ci0JaWYgKG9sZF9kaXJfYmgpCi0JCWJyZWxzZShvbGRfZGlyX2JoKTsKLQlpZiAobmV3X2Rpcl9iaCkKLQkJYnJlbHNlKG5ld19kaXJfYmgpOwotCWlmIChuZXdfZGVfYmgpCi0JCWJyZWxzZShuZXdfZGVfYmgpOwotCWlmIChvbGRfZGVfYmgpCi0JCWJyZWxzZShvbGRfZGVfYmgpOwotCWlmIChvbGRfaW5vZGVfZGVfYmgpCi0JCWJyZWxzZShvbGRfaW5vZGVfZGVfYmgpOwotCWlmIChvcnBoYW5fZW50cnlfYmgpCi0JCWJyZWxzZShvcnBoYW5fZW50cnlfYmgpOwotCWlmIChpbnNlcnRfZW50cnlfYmgpCi0JCWJyZWxzZShpbnNlcnRfZW50cnlfYmgpOworCWJyZWxzZShuZXdmZV9iaCk7CisJYnJlbHNlKG9sZF9pbm9kZV9iaCk7CisJYnJlbHNlKG9sZF9kaXJfYmgpOworCWJyZWxzZShuZXdfZGlyX2JoKTsKKwlicmVsc2UobmV3X2RlX2JoKTsKKwlicmVsc2Uob2xkX2RlX2JoKTsKKwlicmVsc2Uob2xkX2lub2RlX2RlX2JoKTsKKwlicmVsc2Uob3JwaGFuX2VudHJ5X2JoKTsKKwlicmVsc2UoaW5zZXJ0X2VudHJ5X2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCkBAIC0xNDkyLDggKzE0NjksNyBAQAogCiAJaWYgKGJocykgewogCQlmb3IoaSA9IDA7IGkgPCBibG9ja3M7IGkrKykKLQkJCWlmIChiaHNbaV0pCi0JCQkJYnJlbHNlKGJoc1tpXSk7CisJCQlicmVsc2UoYmhzW2ldKTsKIAkJa2ZyZWUoYmhzKTsKIAl9CiAKQEAgLTE1OTgsMTAgKzE1NzQsMTAgQEAKIAkJdTMyIG9mZnNldCA9IDA7CiAKIAkJaW5vZGUtPmlfb3AgPSAmb2NmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsIGlub2RlLCAmb2Zmc2V0LCAxLCAwLAotCQkJCQkJICAgIG5ld19mZV9iaCwKLQkJCQkJCSAgICBoYW5kbGUsIGRhdGFfYWMsIE5VTEwsCi0JCQkJCQkgICAgTlVMTCk7CisJCXN0YXR1cyA9IG9jZnMyX2FkZF9pbm9kZV9kYXRhKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCisJCQkJCSAgICAgIG5ld19mZV9iaCwKKwkJCQkJICAgICAgaGFuZGxlLCBkYXRhX2FjLCBOVUxMLAorCQkJCQkgICAgICBOVUxMKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQyAmJiBzdGF0dXMgIT0gLUVJTlRSKSB7CiAJCQkJbWxvZyhNTF9FUlJPUiwKQEAgLTE2NTksMTIgKzE2MzUsOSBAQAogCiAJb2NmczJfaW5vZGVfdW5sb2NrKGRpciwgMSk7CiAKLQlpZiAobmV3X2ZlX2JoKQotCQlicmVsc2UobmV3X2ZlX2JoKTsKLQlpZiAocGFyZW50X2ZlX2JoKQotCQlicmVsc2UocGFyZW50X2ZlX2JoKTsKLQlpZiAoZGVfYmgpCi0JCWJyZWxzZShkZV9iaCk7CisJYnJlbHNlKG5ld19mZV9iaCk7CisJYnJlbHNlKHBhcmVudF9mZV9iaCk7CisJYnJlbHNlKGRlX2JoKTsKIAlpZiAoaW5vZGVfYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChpbm9kZV9hYyk7CiAJaWYgKGRhdGFfYWMpCkBAIC0xNzU5LDggKzE3MzIsNyBAQAogCQlpcHV0KG9ycGhhbl9kaXJfaW5vZGUpOwogCX0KIAotCWlmIChvcnBoYW5fZGlyX2JoKQotCQlicmVsc2Uob3JwaGFuX2Rpcl9iaCk7CisJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE3ODAsMTAgKzE3NTIsOSBAQAogCiAJbWxvZ19lbnRyeSgiKGlub2RlLT5pX2lubyA9ICVsdSlcbiIsIGlub2RlLT5pX2lubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9ycGhhbl9kaXJfaW5vZGUsCiAJCQkJICBPQ0ZTMl9JKG9ycGhhbl9kaXJfaW5vZGUpLT5pcF9ibGtubywKLQkJCQkgICZvcnBoYW5fZGlyX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJICBvcnBoYW5fZGlyX2lub2RlKTsKKwkJCQkgICZvcnBoYW5fZGlyX2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC0xODI5LDggKzE4MDAsNyBAQAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIG9zYi0+c2xvdF9udW0pOwogCiBsZWF2ZToKLQlpZiAob3JwaGFuX2Rpcl9iaCkKLQkJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOworCWJyZWxzZShvcnBoYW5fZGlyX2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xODk4LDggKzE4NjgsNyBAQAogCX0KIAogbGVhdmU6Ci0JaWYgKHRhcmdldF9kZV9iaCkKLQkJYnJlbHNlKHRhcmdldF9kZV9iaCk7CisJYnJlbHNlKHRhcmdldF9kZV9iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTkxOCw0ICsxODg3LDggQEAKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAogCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IG9jZnMyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IDdmNjI1ZjIuLmEyMWE0NjUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMzQsNyArMzQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpZm5kZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKKyMgaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvamJkLmg+CisjIGluY2x1ZGUgIm9jZnMyX2piZF9jb21wYXQuaCIKKyNlbmRpZgogCiAvKiBGb3IgdW5pb24gb2NmczJfZGxtX2xrc2IgKi8KICNpbmNsdWRlICJzdGFja2dsdWUuaCIKQEAgLTE3MSw5ICsxNzYsMTMgQEAKIAogZW51bSBvY2ZzMl9sb2NhbF9hbGxvY19zdGF0ZQogewotCU9DRlMyX0xBX1VOVVNFRCA9IDAsCi0JT0NGUzJfTEFfRU5BQkxFRCwKLQlPQ0ZTMl9MQV9ESVNBQkxFRAorCU9DRlMyX0xBX1VOVVNFRCA9IDAsCS8qIExvY2FsIGFsbG9jIHdpbGwgbmV2ZXIgYmUgdXNlZCBmb3IKKwkJCQkgKiB0aGlzIG1vdW50cG9pbnQuICovCisJT0NGUzJfTEFfRU5BQkxFRCwJLyogTG9jYWwgYWxsb2MgaXMgaW4gdXNlLiAqLworCU9DRlMyX0xBX1RIUk9UVExFRCwJLyogTG9jYWwgYWxsb2MgaXMgaW4gdXNlLCBidXQgbnVtYmVyCisJCQkJICogb2YgYml0cyBoYXMgYmVlbiByZWR1Y2VkLiAqLworCU9DRlMyX0xBX0RJU0FCTEVECS8qIExvY2FsIGFsbG9jIGhhcyB0ZW1wb3JhcmlseSBiZWVuCisJCQkJICogZGlzYWJsZWQuICovCiB9OwogCiBlbnVtIG9jZnMyX21vdW50X29wdGlvbnMKQEAgLTE4NCw2ICsxOTMsOCBAQAogCU9DRlMyX01PVU5UX0VSUk9SU19QQU5JQyA9IDEgPDwgMywgLyogUGFuaWMgb24gZXJyb3JzICovCiAJT0NGUzJfTU9VTlRfREFUQV9XUklURUJBQ0sgPSAxIDw8IDQsIC8qIE5vIGRhdGEgb3JkZXJpbmcgKi8KIAlPQ0ZTMl9NT1VOVF9MT0NBTEZMT0NLUyA9IDEgPDwgNSwgLyogTm8gY2x1c3RlciBhd2FyZSB1c2VyIGZpbGUgbG9ja3MgKi8KKwlPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUiA9IDEgPDwgNiwgLyogTm8gdXNlciB4YXR0ciAqLworCU9DRlMyX01PVU5UX0lOT0RFNjQgPSAxIDw8IDcsCS8qIEFsbG93IGlub2RlIG51bWJlcnMgPiAyXjMyICovCiB9OwogCiAjZGVmaW5lIE9DRlMyX09TQl9TT0ZUX1JPCTB4MDAwMQpAQCAtMjE0LDYgKzIyNSw3IEBACiAJdTMyIGJpdG1hcF9jcGc7CiAJdTggKnV1aWQ7CiAJY2hhciAqdXVpZF9zdHI7CisJdTMyIHV1aWRfaGFzaDsKIAl1OCAqdm9sX2xhYmVsOwogCXU2NCBmaXJzdF9jbHVzdGVyX2dyb3VwX2Jsa25vOwogCXUzMiBmc19nZW5lcmF0aW9uOwpAQCAtMjQxLDYgKzI1Myw3IEBACiAJaW50IHNfc2VjdHNpemVfYml0czsKIAlpbnQgc19jbHVzdGVyc2l6ZTsKIAlpbnQgc19jbHVzdGVyc2l6ZV9iaXRzOworCXVuc2lnbmVkIGludCBzX3hhdHRyX2lubGluZV9zaXplOwogCiAJYXRvbWljX3Qgdm9sX3N0YXRlOwogCXN0cnVjdCBtdXRleCByZWNvdmVyeV9sb2NrOwpAQCAtMjUyLDExICsyNjUsMjcgQEAKIAlzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbDsKIAl1bnNpZ25lZCBsb25nIG9zYl9jb21taXRfaW50ZXJ2YWw7CiAKLQlpbnQgbG9jYWxfYWxsb2Nfc2l6ZTsKLQllbnVtIG9jZnMyX2xvY2FsX2FsbG9jX3N0YXRlIGxvY2FsX2FsbG9jX3N0YXRlOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCWxhX2VuYWJsZV93cTsKKworCS8qCisJICogTXVzdCBob2xkIGxvY2FsIGFsbG9jIGlfbXV0ZXggYW5kIG9zYi0+b3NiX2xvY2sgdG8gY2hhbmdlCisJICogbG9jYWxfYWxsb2NfYml0cy4gUmVhZHMgY2FuIGJlIGRvbmUgdW5kZXIgZWl0aGVyIGxvY2suCisJICovCisJdW5zaWduZWQgaW50IGxvY2FsX2FsbG9jX2JpdHM7CisJdW5zaWduZWQgaW50IGxvY2FsX2FsbG9jX2RlZmF1bHRfYml0czsKKworCWVudW0gb2NmczJfbG9jYWxfYWxsb2Nfc3RhdGUgbG9jYWxfYWxsb2Nfc3RhdGU7IC8qIHByb3RlY3RlZAorCQkJCQkJCSAqIGJ5IG9zYl9sb2NrICovCisKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxvY2FsX2FsbG9jX2JoOworCiAJdTY0IGxhX2xhc3RfZ2Q7CiAKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfU1RBVFMKKwlzdHJ1Y3QgZGVudHJ5ICpsb2NhbF9hbGxvY19kZWJ1ZzsKKwljaGFyICpsb2NhbF9hbGxvY19kZWJ1Z19idWY7CisjZW5kaWYKKwogCS8qIE5leHQgdHdvIGZpZWxkcyBhcmUgZm9yIGxvY2FsIG5vZGUgc2xvdCByZWNvdmVyeSBkdXJpbmcKIAkgKiBtb3VudC4gKi8KIAlpbnQgZGlydHk7CkBAIC0zNDAsNiArMzY5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3N1cHBvcnRzX3hhdHRyKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCWlmIChvc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfWEFUVFIpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKiBzZXQgLyBjbGVhciBmdW5jdGlvbnMgYmVjYXVzZSBjbHVzdGVyIGV2ZW50cyBjYW4gbWFrZSB0aGVzZSBoYXBwZW4KICAqIGluIHBhcmFsbGVsIHNvIHdlIHdhbnQgdGhlIHRyYW5zaXRpb25zIHRvIGJlIGF0b21pYy4gdGhpcyBhbHNvCiAgKiBtZWFucyB0aGF0IGFueSBmdXR1cmUgZmxhZ3Mgb3NiX2ZsYWdzIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCkBAIC01NTQsNiArNTkwLDE0IEBACiAJcmV0dXJuIHBhZ2VzX3Blcl9jbHVzdGVyOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvY2ZzMl9tZWdhYnl0ZXNfdG9fY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWVncykKK3sKKwlCVUlMRF9CVUdfT04oT0NGUzJfTUFYX0NMVVNURVJTSVpFID4gMTA0ODU3Nik7CisKKwlyZXR1cm4gbWVncyA8PCAoMjAgLSBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0cyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9pbml0X2lub2RlX3N0ZWFsX3Nsb3Qoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2ZzLmggYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCmluZGV4IDRmNjE5ODUuLmYyNGNlM2QgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyX2ZzLmgKKysrIGIvZnMvb2NmczIvb2NmczJfZnMuaApAQCAtNjQsNiArNjQsNyBAQAogI2RlZmluZSBPQ0ZTMl9JTk9ERV9TSUdOQVRVUkUJCSJJTk9ERTAxIgogI2RlZmluZSBPQ0ZTMl9FWFRFTlRfQkxPQ0tfU0lHTkFUVVJFCSJFWEJMSzAxIgogI2RlZmluZSBPQ0ZTMl9HUk9VUF9ERVNDX1NJR05BVFVSRSAgICAgICJHUk9VUDAxIgorI2RlZmluZSBPQ0ZTMl9YQVRUUl9CTE9DS19TSUdOQVRVUkUJIlhBVFRSMDEiCiAKIC8qIENvbXBhdGliaWxpdHkgZmxhZ3MgKi8KICNkZWZpbmUgT0NGUzJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXApAQCAtOTAsNyArOTEsOCBAQAogCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NQQVJTRV9BTExPQyBcCiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfSU5MSU5FX0RBVEEgXAogCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOREVEX1NMT1RfTUFQIFwKLQkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9VU0VSU1BBQ0VfU1RBQ0spCisJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfVVNFUlNQQUNFX1NUQUNLIFwKKwkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUikKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4KIAogLyoKQEAgLTEyNywxMCArMTI5LDYgQEAKIC8qIFN1cHBvcnQgZm9yIGRhdGEgcGFja2VkIGludG8gaW5vZGUgYmxvY2tzICovCiAjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfSU5MSU5FX0RBVEEJMHgwMDQwCiAKLS8qIFN1cHBvcnQgZm9yIHRoZSBleHRlbmRlZCBzbG90IG1hcCAqLwotI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOREVEX1NMT1RfTUFQIDB4MTAwCi0KLQogLyoKICAqIFN1cHBvcnQgZm9yIGFsdGVybmF0ZSwgdXNlcnNwYWNlIGNsdXN0ZXIgc3RhY2tzLiAgSWYgc2V0LCB0aGUgc3VwZXJibG9jawogICogZmllbGQgc19jbHVzdGVyX2luZm8gY29udGFpbnMgYSB0YWcgZm9yIHRoZSBhbHRlcm5hdGUgc3RhY2sgaW4gdXNlIGFzCkBAIC0xNDIsNiArMTQwLDEyIEBACiAgKi8KICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9VU0VSU1BBQ0VfU1RBQ0sJMHgwMDgwCiAKKy8qIFN1cHBvcnQgZm9yIHRoZSBleHRlbmRlZCBzbG90IG1hcCAqLworI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOREVEX1NMT1RfTUFQIDB4MTAwCisKKy8qIFN1cHBvcnQgZm9yIGV4dGVuZGVkIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUgkJMHgwMjAwCisKIC8qCiAgKiBiYWNrdXAgc3VwZXJibG9jayBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHZvbHVtZQogICogaGFzIGJhY2t1cCBzdXBlcmJsb2Nrcy4KQEAgLTI5OSw2ICszMDMsMTIgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9ERUZBVUxUX0xPQ0FMX0FMTE9DX1NJWkUJOAogCisvKgorICogSW5saW5lIGV4dGVuZGVkIGF0dHJpYnV0ZSBzaXplIChpbiBieXRlcykKKyAqIFRoZSB2YWx1ZSBjaG9zZW4gc2hvdWxkIGJlIGFsaWduZWQgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLgorICovCisjZGVmaW5lIE9DRlMyX01JTl9YQVRUUl9JTkxJTkVfU0laRSAgICAgMjU2CisKIHN0cnVjdCBvY2ZzMl9zeXN0ZW1faW5vZGVfaW5mbyB7CiAJY2hhcgkqc2lfbmFtZTsKIAlpbnQJc2lfaWZsYWdzOwpAQCAtNTYzLDcgKzU3Myw3IEBACiAvKjQwKi8JX19sZTE2IHNfbWF4X3Nsb3RzOwkJLyogTWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgbW91bnRzCiAJCQkJCSAgIGJlZm9yZSB0dW5lZnMgcmVxdWlyZWQgKi8KIAlfX2xlMTYgc190dW5lZnNfZmxhZzsKLQlfX2xlMzIgc19yZXNlcnZlZDE7CisJX19sZTMyIHNfdXVpZF9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiB1dWlkICovCiAJX19sZTY0IHNfZmlyc3RfY2x1c3Rlcl9ncm91cDsJLyogQmxvY2sgb2Zmc2V0IG9mIDFzdCBjbHVzdGVyCiAJCQkJCSAqIGdyb3VwIGhlYWRlciAqLwogLyo1MCovCV9fdTggIHNfbGFiZWxbT0NGUzJfTUFYX1ZPTF9MQUJFTF9MRU5dOwkvKiBMYWJlbCBmb3IgbW91bnRpbmcsIGV0Yy4gKi8KQEAgLTU3MSw3ICs1ODEsMTEgQEAKIC8qQTAqLyAgc3RydWN0IG9jZnMyX2NsdXN0ZXJfaW5mbyBzX2NsdXN0ZXJfaW5mbzsgLyogU2VsZWN0ZWQgdXNlcnNwYWNlCiAJCQkJCQkgICAgIHN0YWNrLiAgT25seSB2YWxpZAogCQkJCQkJICAgICB3aXRoIElOQ09NUEFUIGZsYWcuICovCi0vKkI4Ki8gIF9fbGU2NCBzX3Jlc2VydmVkMlsxN107CQkvKiBGaWxsIG91dCBzdXBlcmJsb2NrICovCisvKkI4Ki8JX19sZTE2IHNfeGF0dHJfaW5saW5lX3NpemU7CS8qIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbmxpbmUgc2l6ZQorCQkJCQkgICBmb3IgdGhpcyBmcyovCisJX19sZTE2IHNfcmVzZXJ2ZWQwOworCV9fbGUzMiBzX3Jlc2VydmVkMTsKKy8qQzAqLyAgX19sZTY0IHNfcmVzZXJ2ZWQyWzE2XTsJCS8qIEZpbGwgb3V0IHN1cGVyYmxvY2sgKi8KIC8qMTQwKi8KIAogCS8qCkBAIC02MjEsNyArNjM1LDggQEAKIAkJCQkJICAgYmVsb25ncyB0byAqLwogCV9fbGUxNiBpX3N1YmFsbG9jX2JpdDsJCS8qIEJpdCBvZmZzZXQgaW4gc3ViYWxsb2NhdG9yCiAJCQkJCSAgIGJsb2NrIGdyb3VwICovCi0vKjEwKi8JX19sZTMyIGlfcmVzZXJ2ZWQwOworLyoxMCovCV9fbGUxNiBpX3Jlc2VydmVkMDsKKwlfX2xlMTYgaV94YXR0cl9pbmxpbmVfc2l6ZTsKIAlfX2xlMzIgaV9jbHVzdGVyczsJCS8qIENsdXN0ZXIgY291bnQgKi8KIAlfX2xlMzIgaV91aWQ7CQkJLyogT3duZXIgVUlEICovCiAJX19sZTMyIGlfZ2lkOwkJCS8qIE93bmluZyBHSUQgKi8KQEAgLTY0MCwxMSArNjU1LDEyIEBACiAJX19sZTMyIGlfYXRpbWVfbnNlYzsKIAlfX2xlMzIgaV9jdGltZV9uc2VjOwogCV9fbGUzMiBpX210aW1lX25zZWM7Ci0JX19sZTMyIGlfYXR0cjsKKy8qNzAqLwlfX2xlMzIgaV9hdHRyOwogCV9fbGUxNiBpX29ycGhhbmVkX3Nsb3Q7CQkvKiBPbmx5IHZhbGlkIHdoZW4gT0NGUzJfT1JQSEFORURfRkwKIAkJCQkJICAgd2FzIHNldCBpbiBpX2ZsYWdzICovCiAJX19sZTE2IGlfZHluX2ZlYXR1cmVzOwotLyo3MCovCV9fbGU2NCBpX3Jlc2VydmVkMls4XTsKKwlfX2xlNjQgaV94YXR0cl9sb2M7CisvKjgwKi8JX19sZTY0IGlfcmVzZXJ2ZWQyWzddOwogLypCOCovCXVuaW9uIHsKIAkJX19sZTY0IGlfcGFkMTsJCS8qIEdlbmVyaWMgd2F5IHRvIHJlZmVyIHRvIHRoaXMKIAkJCQkJICAgNjRiaXQgdW5pb24gKi8KQEAgLTcxNSw2ICs3MzEsMTM2IEBACiAvKjQwKi8JX191OCAgICBiZ19iaXRtYXBbMF07CiB9OwogCisvKgorICogT24gZGlzayBleHRlbmRlZCBhdHRyaWJ1dGUgc3RydWN0dXJlIGZvciBPQ0ZTMi4KKyAqLworCisvKgorICogb2NmczJfeGF0dHJfZW50cnkgaW5kaWNhdGVzIG9uZSBleHRlbmQgYXR0cmlidXRlLgorICoKKyAqIE5vdGUgdGhhdCBpdCBjYW4gYmUgc3RvcmVkIGluIGlub2RlLCBvbmUgYmxvY2sgb3Igb25lIHhhdHRyIGJ1Y2tldC4KKyAqLworc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5IHsKKwlfX2xlMzIJeGVfbmFtZV9oYXNoOyAgICAvKiBoYXNoIHZhbHVlIG9mIHhhdHRyIHByZWZpeCtzdWZmaXguICovCisJX19sZTE2CXhlX25hbWVfb2Zmc2V0OyAgLyogYnl0ZSBvZmZzZXQgZnJvbSB0aGUgMXN0IGV0bnJ5IGluIHRoZSBsb2NhbAorCQkJCSAgICBsb2NhbCB4YXR0ciBzdG9yYWdlKGlub2RlLCB4YXR0ciBibG9jayBvcgorCQkJCSAgICB4YXR0ciBidWNrZXQpLiAqLworCV9fdTgJeGVfbmFtZV9sZW47CSAvKiB4YXR0ciBuYW1lIGxlbiwgZG9lcyd0IGluY2x1ZGUgcHJlZml4LiAqLworCV9fdTgJeGVfdHlwZTsgICAgICAgICAvKiB0aGUgbG93IDcgYml0cyBpbmRpY2F0ZXMgdGhlIG5hbWUgcHJlZml4J3MKKwkJCQkgICogdHlwZSBhbmQgdGhlIGhpZ2hlc3QgMSBiaXRzIGluZGljYXRlIHdoZXRoZXIKKwkJCQkgICogdGhlIEVBIGlzIHN0b3JlZCBpbiB0aGUgbG9jYWwgc3RvcmFnZS4gKi8KKwlfX2xlNjQJeGVfdmFsdWVfc2l6ZTsJIC8qIHJlYWwgeGF0dHIgdmFsdWUgbGVuZ3RoLiAqLworfTsKKworLyoKKyAqIE9uIGRpc2sgc3RydWN0dXJlIGZvciB4YXR0ciBoZWFkZXIuCisgKgorICogT25lIG9jZnMyX3hhdHRyX2hlYWRlciBkZXNjcmliZXMgaG93IG1hbnkgb2NmczJfeGF0dHJfZW50cnkgcmVjb3JkcyBpbgorICogdGhlIGxvY2FsIHhhdHRyIHN0b3JhZ2UuCisgKi8KK3N0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgeworCV9fbGUxNgl4aF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRhaW5zIHRoZSBjb3VudCBvZiBob3cKKwkJCQkJCSAgIG1hbnkgcmVjb3JkcyBhcmUgaW4gdGhlCisJCQkJCQkgICBsb2NhbCB4YXR0ciBzdG9yYWdlLiAqLworCV9fbGUxNgl4aF9mcmVlX3N0YXJ0OyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGZvciBzdG9yaW5nCisJCQkJCQkgICB4YXR0ci4gKi8KKwlfX2xlMTYJeGhfbmFtZV92YWx1ZV9sZW47ICAgICAgICAgICAgICAvKiB0b3RhbCBsZW5ndGggb2YgbmFtZS92YWx1ZQorCQkJCQkJICAgbGVuZ3RoIGluIHRoaXMgYnVja2V0LiAqLworCV9fbGUxNgl4aF9udW1fYnVja2V0czsgICAgICAgICAgICAgICAgIC8qIGJ1Y2tldCBudW1zIGluIG9uZSBleHRlbnQKKwkJCQkJCSAgIHJlY29yZCwgb25seSB2YWxpZCBpbiB0aGUKKwkJCQkJCSAgIGZpcnN0IGJ1Y2tldC4gKi8KKwlfX2xlNjQgIHhoX2NzdW07CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5IHhoX2VudHJpZXNbMF07IC8qIHhhdHRyIGVudHJ5IGxpc3QuICovCit9OworCisvKgorICogT24gZGlzayBzdHJ1Y3R1cmUgZm9yIHhhdHRyIHZhbHVlIHJvb3QuCisgKgorICogSXQgaXMgdXNlZCB3aGVuIG9uZSBleHRlbmRlZCBhdHRyaWJ1dGUncyBzaXplIGlzIGxhcmdlciwgYW5kIHdlIHdpbGwgc2F2ZSBpdAorICogaW4gYW4gb3V0c2lkZSBjbHVzdGVyLiBJdCB3aWxsIHN0b3JlZCBpbiBhIGItdHJlZSBsaWtlIGZpbGUgY29udGVudC4KKyAqLworc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgeworLyowMCovCV9fbGUzMgl4cl9jbHVzdGVyczsgICAgICAgICAgICAgIC8qIGNsdXN0ZXJzIGNvdmVyZWQgYnkgeGF0dHIgdmFsdWUuICovCisJX19sZTMyCXhyX3Jlc2VydmVkMDsKKwlfX2xlNjQJeHJfbGFzdF9lYl9ibGs7ICAgICAgICAgICAvKiBQb2ludGVyIHRvIGxhc3QgZXh0ZW50IGJsb2NrICovCisvKjEwKi8Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0IHhyX2xpc3Q7IC8qIEV4dGVudCByZWNvcmQgbGlzdCAqLworfTsKKworLyoKKyAqIE9uIGRpc2sgc3RydWN0dXJlIGZvciB4YXR0ciB0cmVlIHJvb3QuCisgKgorICogSXQgaXMgdXNlZCB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBvbmUgZmlsZS4gVGhlc2UKKyAqIGF0dHJpYnV0ZXMgd2lsbCBiZSBvcmdhbml6ZWQgYW5kIHN0b3JlZCBpbiBhbiBpbmRleGVkLWJ0cmVlLgorICovCitzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290IHsKKy8qMDAqLwlfX2xlMzIJeHRfY2x1c3RlcnM7ICAgICAgICAgICAgICAvKiBjbHVzdGVycyBjb3ZlcmVkIGJ5IHhhdHRyLiAqLworCV9fbGUzMgl4dF9yZXNlcnZlZDA7CisJX19sZTY0CXh0X2xhc3RfZWJfYmxrOyAgICAgICAgICAgLyogUG9pbnRlciB0byBsYXN0IGV4dGVudCBibG9jayAqLworLyoxMCovCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCB4dF9saXN0OyAvKiBFeHRlbnQgcmVjb3JkIGxpc3QgKi8KK307CisKKyNkZWZpbmUgT0NGUzJfWEFUVFJfSU5ERVhFRAkweDEKKyNkZWZpbmUgT0NGUzJfSEFTSF9TSElGVAk1CisjZGVmaW5lIE9DRlMyX1hBVFRSX1JPVU5ECTMKKyNkZWZpbmUgT0NGUzJfWEFUVFJfU0laRShzaXplKQkoKChzaXplKSArIE9DRlMyX1hBVFRSX1JPVU5EKSAmIFwKKwkJCQl+KE9DRlMyX1hBVFRSX1JPVU5EKSkKKworI2RlZmluZSBPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRQkJCTQwOTYKKyNkZWZpbmUgT0NGUzJfWEFUVFJfTUFYX0JMT0NLU19QRVJfQlVDS0VUIAkoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgXAorCQkJCQkJIC8gT0NGUzJfTUlOX0JMT0NLU0laRSkKKworLyoKKyAqIE9uIGRpc2sgc3RydWN0dXJlIGZvciB4YXR0ciBibG9jay4KKyAqLworc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrIHsKKy8qMDAqLwlfX3U4CXhiX3NpZ25hdHVyZVs4XTsgICAgIC8qIFNpZ25hdHVyZSBmb3IgdmVyaWZpY2F0aW9uICovCisJX19sZTE2CXhiX3N1YmFsbG9jX3Nsb3Q7ICAgIC8qIFNsb3Qgc3ViYWxsb2NhdG9yIHRoaXMKKwkJCQkJYmxvY2sgYmVsb25ncyB0by4gKi8KKwlfX2xlMTYJeGJfc3ViYWxsb2NfYml0OyAgICAgLyogQml0IG9mZnNldCBpbiBzdWJhbGxvY2F0b3IKKwkJCQkJYmxvY2sgZ3JvdXAgKi8KKwlfX2xlMzIJeGJfZnNfZ2VuZXJhdGlvbjsgICAgLyogTXVzdCBtYXRjaCBzdXBlciBibG9jayAqLworLyoxMCovCV9fbGU2NAl4Yl9ibGtubzsgICAgICAgICAgICAvKiBPZmZzZXQgb24gZGlzaywgaW4gYmxvY2tzICovCisJX19sZTY0CXhiX2NzdW07CisvKjIwKi8JX19sZTE2CXhiX2ZsYWdzOyAgICAgICAgICAgIC8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYmxvY2sgY29udGFpbnMKKwkJCQkJcmVhbCB4YXR0ciBvciBhIHhhdHRyIHRyZWUuICovCisJX19sZTE2CXhiX3Jlc2VydmVkMDsKKwlfX2xlMzIgIHhiX3Jlc2VydmVkMTsKKwlfX2xlNjQJeGJfcmVzZXJ2ZWQyOworLyozMCovCXVuaW9uIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciB4Yl9oZWFkZXI7IC8qIHhhdHRyIGhlYWRlciBpZiB0aGlzCisJCQkJCQkJYmxvY2sgY29udGFpbnMgeGF0dHIgKi8KKwkJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCB4Yl9yb290Oy8qIHhhdHRyIHRyZWUgcm9vdCBpZiB0aGlzCisJCQkJCQkJYmxvY2sgY290YWlucyB4YXR0cgorCQkJCQkJCXRyZWUuICovCisJfSB4Yl9hdHRyczsKK307CisKKyNkZWZpbmUgT0NGUzJfWEFUVFJfRU5UUllfTE9DQUwJCTB4ODAKKyNkZWZpbmUgT0NGUzJfWEFUVFJfVFlQRV9NQVNLCQkweDdGCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfeGF0dHJfc2V0X2xvY2FsKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUsCisJCQkJCSBpbnQgbG9jYWwpCit7CisJaWYgKGxvY2FsKQorCQl4ZS0+eGVfdHlwZSB8PSBPQ0ZTMl9YQVRUUl9FTlRSWV9MT0NBTDsKKwllbHNlCisJCXhlLT54ZV90eXBlICY9IH5PQ0ZTMl9YQVRUUl9FTlRSWV9MT0NBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfeGF0dHJfaXNfbG9jYWwoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSkKK3sKKwlyZXR1cm4geGUtPnhlX3R5cGUgJiBPQ0ZTMl9YQVRUUl9FTlRSWV9MT0NBTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX3hhdHRyX3NldF90eXBlKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUsIGludCB0eXBlKQoreworCXhlLT54ZV90eXBlIHw9IHR5cGUgJiBPQ0ZTMl9YQVRUUl9UWVBFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3hhdHRyX2dldF90eXBlKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUpCit7CisJcmV0dXJuIHhlLT54ZV90eXBlICYgT0NGUzJfWEFUVFJfVFlQRV9NQVNLOworfQorCiAjaWZkZWYgX19LRVJORUxfXwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfZmFzdF9zeW1saW5rX2NoYXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC03MjgsNiArODc0LDIwIEBACiAJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMi5pX2RhdGEuaWRfZGF0YSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX21heF9pbmxpbmVfZGF0YV93aXRoX3hhdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQkgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSkKK3sKKwl1bnNpZ25lZCBpbnQgeGF0dHJzaXplID0gbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpOworCisJaWYgKGxlMTZfdG9fY3B1KGRpLT5pX2R5bl9mZWF0dXJlcykgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpCisJCXJldHVybiBzYi0+c19ibG9ja3NpemUgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2Rpbm9kZSwgaWQyLmlfZGF0YS5pZF9kYXRhKSAtCisJCQl4YXR0cnNpemU7CisJZWxzZQorCQlyZXR1cm4gc2ItPnNfYmxvY2tzaXplIC0KKwkJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMi5pX2RhdGEuaWRfZGF0YSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2V4dGVudF9yZWNzX3Blcl9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWludCBzaXplOwpAQCAtNzM4LDYgKzg5OCwyNCBAQAogCXJldHVybiBzaXplIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXh0ZW50X3JlY3NfcGVyX2lub2RlX3dpdGhfeGF0dHIoCisJCQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCit7CisJaW50IHNpemU7CisJdW5zaWduZWQgaW50IHhhdHRyc2l6ZSA9IGxlMTZfdG9fY3B1KGRpLT5pX3hhdHRyX2lubGluZV9zaXplKTsKKworCWlmIChsZTE2X3RvX2NwdShkaS0+aV9keW5fZmVhdHVyZXMpICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKQorCQlzaXplID0gc2ItPnNfYmxvY2tzaXplIC0KKwkJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMi5pX2xpc3QubF9yZWNzKSAtCisJCQl4YXR0cnNpemU7CisJZWxzZQorCQlzaXplID0gc2ItPnNfYmxvY2tzaXplIC0KKwkJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlkMi5pX2xpc3QubF9yZWNzKTsKKworCXJldHVybiBzaXplIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfY2hhaW5fcmVjc19wZXJfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlpbnQgc2l6ZTsKQEAgLTgwMSw2ICs5NzksMTcgQEAKIAlyZXR1cm4gMDsKIAogfQorCitzdGF0aWMgaW5saW5lIHUxNiBvY2ZzMl94YXR0cl9yZWNzX3Blcl94YihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBzaXplOworCisJc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtCisJCW9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywKKwkJCSB4Yl9hdHRycy54Yl9yb290Lnh0X2xpc3QubF9yZWNzKTsKKworCXJldHVybiBzaXplIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKK30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9mYXN0X3N5bWxpbmtfY2hhcnMoaW50IGJsb2Nrc2l6ZSkKIHsKQEAgLTg4NCw2ICsxMDczLDE3IEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfeGF0dHJfcmVjc19wZXJfeGIoaW50IGJsb2Nrc2l6ZSkKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBibG9ja3NpemUgLQorCQlvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2ssCisJCQkgeGJfYXR0cnMueGJfcm9vdC54dF9saXN0LmxfcmVjcyk7CisKKwlyZXR1cm4gc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7Cit9CiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIAogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9qYmRfY29tcGF0LmggYi9mcy9vY2ZzMi9vY2ZzMl9qYmRfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL29jZnMyX2piZF9jb21wYXQuaApAQCAtMCwwICsxLDgyIEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLQorICogdmltOiBub2V4cGFuZHRhYiBzdz04IHRzPTggc3RzPTA6CisgKgorICogb2NmczJfamJkX2NvbXBhdC5oCisgKgorICogQ29tcGF0aWJpbGl0eSBkZWZpbmVzIGZvciBKQkQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgT0NGUzJfSkJEX0NPTVBBVF9ICisjZGVmaW5lIE9DRlMyX0pCRF9DT01QQVRfSAorCisjaWZuZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECisjIGVycm9yIFNob3VsZCBub3QgaGF2ZSBiZWVuIGluY2x1ZGVkCisjZW5kaWYKKworc3RydWN0IGpiZDJfaW5vZGUgeworCXVuc2lnbmVkIGludCBkdW1teTsKK307CisKKyNkZWZpbmUgSkJEMl9CQVJSSUVSCQkJSkZTX0JBUlJJRVIKKyNkZWZpbmUgSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFCUpCRF9ERUZBVUxUX01BWF9DT01NSVRfQUdFCisKKyNkZWZpbmUgamJkMl9qb3VybmFsX2Fja19lcnIJCQlqb3VybmFsX2Fja19lcnIKKyNkZWZpbmUgamJkMl9qb3VybmFsX2NsZWFyX2VycgkJCWpvdXJuYWxfY2xlYXJfZXJyCisjZGVmaW5lIGpiZDJfam91cm5hbF9kZXN0cm95CQkJam91cm5hbF9kZXN0cm95CisjZGVmaW5lIGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YQkJam91cm5hbF9kaXJ0eV9tZXRhZGF0YQorI2RlZmluZSBqYmQyX2pvdXJuYWxfZXJybm8JCQlqb3VybmFsX2Vycm5vCisjZGVmaW5lIGpiZDJfam91cm5hbF9leHRlbmQJCQlqb3VybmFsX2V4dGVuZAorI2RlZmluZSBqYmQyX2pvdXJuYWxfZmx1c2gJCQlqb3VybmFsX2ZsdXNoCisjZGVmaW5lIGpiZDJfam91cm5hbF9mb3JjZV9jb21taXQJCWpvdXJuYWxfZm9yY2VfY29tbWl0CisjZGVmaW5lIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzCQlqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MKKyNkZWZpbmUgamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcwkJam91cm5hbF9nZXRfdW5kb19hY2Nlc3MKKyNkZWZpbmUgamJkMl9qb3VybmFsX2luaXRfaW5vZGUJCQlqb3VybmFsX2luaXRfaW5vZGUKKyNkZWZpbmUgamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlCQlqb3VybmFsX2ludmFsaWRhdGVwYWdlCisjZGVmaW5lIGpiZDJfam91cm5hbF9sb2FkCQkJam91cm5hbF9sb2FkCisjZGVmaW5lIGpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMJCWpvdXJuYWxfbG9ja191cGRhdGVzCisjZGVmaW5lIGpiZDJfam91cm5hbF9yZXN0YXJ0CQkJam91cm5hbF9yZXN0YXJ0CisjZGVmaW5lIGpiZDJfam91cm5hbF9zdGFydAkJCWpvdXJuYWxfc3RhcnQKKyNkZWZpbmUgamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdAkJam91cm5hbF9zdGFydF9jb21taXQKKyNkZWZpbmUgamJkMl9qb3VybmFsX3N0b3AJCQlqb3VybmFsX3N0b3AKKyNkZWZpbmUgamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMJam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzCisjZGVmaW5lIGpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcwkJam91cm5hbF91bmxvY2tfdXBkYXRlcworI2RlZmluZSBqYmQyX2pvdXJuYWxfd2lwZQkJCWpvdXJuYWxfd2lwZQorI2RlZmluZSBqYmQyX2xvZ193YWl0X2NvbW1pdAkJCWxvZ193YWl0X2NvbW1pdAorCitzdGF0aWMgaW5saW5lIGludCBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgIHN0cnVjdCBqYmQyX2lub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoc3RydWN0IGpiZDJfaW5vZGUgKmlub2RlLAorCQkJCQkJICAgICAgbG9mZl90IG5ld19zaXplKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKHN0cnVjdCBqYmQyX2lub2RlICpqaW5vZGUsCisJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCQkgIHN0cnVjdCBqYmQyX2lub2RlICpqaW5vZGUpCit7CisJcmV0dXJuOworfQorCisKKyNlbmRpZiAgLyogT0NGUzJfSkJEX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9yZXNpemUuYyBiL2ZzL29jZnMyL3Jlc2l6ZS5jCmluZGV4IDgxNjY5NjguLmZmZDQ4ZGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3Jlc2l6ZS5jCisrKyBiL2ZzL29jZnMyL3Jlc2l6ZS5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAkJaWYgKGNsdXN0ZXIgPiBjbHVzdGVycykKIAkJCWJyZWFrOwogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBibGtubywgJmJhY2t1cCwgMCwgTlVMTCk7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzX3N5bmMob3NiLCBibGtubywgMSwgJmJhY2t1cCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlicmVhazsKQEAgLTIzNiw4ICsyMzYsOCBAQAogCSAqIHVwZGF0ZSB0aGUgc3VwZXJibG9jayBsYXN0LgogCSAqIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB3cml0ZSBmYWlsZWQuCiAJICovCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIE9DRlMyX1NVUEVSX0JMT0NLX0JMS05PLAotCQkJICAgICAgICZzdXBlcl9iaCwgMCwgTlVMTCk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhvc2IsIE9DRlMyX1NVUEVSX0JMT0NLX0JMS05PLCAxLAorCQkJCSAgICAgJnN1cGVyX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzMyLDggKzMzMiw3IEBACiAJbGdkX2Jsa25vID0gb2NmczJfd2hpY2hfY2x1c3Rlcl9ncm91cChtYWluX2JtX2lub2RlLAogCQkJCQkgICAgICBmaXJzdF9uZXdfY2x1c3RlciAtIDEpOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGxnZF9ibGtubywgJmdyb3VwX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkgICAgICAgbWFpbl9ibV9pbm9kZSk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhtYWluX2JtX2lub2RlLCBsZ2RfYmxrbm8sICZncm91cF9iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC01NDAsNyArNTM5LDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBpbnB1dC0+Z3JvdXAsICZncm91cF9iaCwgMCwgTlVMTCk7CisJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3Nfc3luYyhvc2IsIGlucHV0LT5ncm91cCwgMSwgJmdyb3VwX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nKE1MX0VSUk9SLCAiQ2FuJ3QgcmVhZCB0aGUgZ3JvdXAgZGVzY3JpcHRvciAjICVsbHUgIgogCQkgICAgICJmcm9tIHRoZSBkZXZpY2UuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+Z3JvdXApOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc2xvdF9tYXAuYyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKaW5kZXggYmI1ZmY4OS4uYmRkYTJkOCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc2xvdF9tYXAuYworKysgYi9mcy9vY2ZzMi9zbG90X21hcC5jCkBAIC0xNTAsOCArMTUwLDggQEAKIAkgKiBiZSAhTlVMTC4gIFRodXMsIG9jZnMyX3JlYWRfYmxvY2tzKCkgd2lsbCBpZ25vcmUgYmxvY2tuci4gIElmCiAJICogdGhpcyBpcyBub3QgdHJ1ZSwgdGhlIHJlYWQgb2YgLTEgKFVJTlQ2NF9NQVgpIHdpbGwgZmFpbC4KIAkgKi8KLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhvc2IsIC0xLCBzaS0+c2lfYmxvY2tzLCBzaS0+c2lfYmgsIDAsCi0JCQkJc2ktPnNpX2lub2RlKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrcyhzaS0+c2lfaW5vZGUsIC0xLCBzaS0+c2lfYmxvY2tzLCBzaS0+c2lfYmgsCisJCQkJT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAocmV0ID09IDApIHsKIAkJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKIAkJb2NmczJfdXBkYXRlX3Nsb3RfaW5mbyhzaSk7CkBAIC00MDQsNyArNDA0LDggQEAKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vKTsKIAogCQliaCA9IE5VTEw7ICAvKiBBY3F1aXJlIGEgZnJlc2ggYmggKi8KLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGJsa25vLCAmYmgsIDAsIHNpLT5zaV9pbm9kZSk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKHNpLT5zaV9pbm9kZSwgYmxrbm8sIDEsICZiaCwKKwkJCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N0YWNrX3VzZXIuYyBiL2ZzL29jZnMyL3N0YWNrX3VzZXIuYwppbmRleCAzNTNmYzM1Li5mYWVjMmQ4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdGFja191c2VyLmMKKysrIGIvZnMvb2NmczIvc3RhY2tfdXNlci5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIgIC8qIEZvciBzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKi8KICNpbmNsdWRlICJzdGFja2dsdWUuaCIKIAorI2luY2x1ZGUgPGxpbnV4L2RsbV9wbG9jay5oPgogCiAvKgogICogVGhlIGNvbnRyb2wgcHJvdG9jb2wgc3RhcnRzIHdpdGggYSBoYW5kc2hha2UuICBVbnRpbCB0aGUgaGFuZHNoYWtlCkBAIC03NDYsNiArNzQ3LDM3IEBACiB7CiB9CiAKK3N0YXRpYyBpbnQgdXNlcl9wbG9jayhzdHJ1Y3Qgb2NmczJfY2x1c3Rlcl9jb25uZWN0aW9uICpjb25uLAorCQkgICAgICB1NjQgaW5vLAorCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgaW50IGNtZCwKKwkJICAgICAgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJLyoKKwkgKiBUaGlzIG1vcmUgb3IgbGVzcyBqdXN0IGRlbXV4ZXMgdGhlIHBsb2NrIHJlcXVlc3QgaW50byBhbnkKKwkgKiBvbmUgb2YgdGhyZWUgZGxtIGNhbGxzLgorCSAqCisJICogSW50ZXJuYWxseSwgZnMvZGxtIHdpbGwgcGFzcyB0aGVzZSB0byBhIG1pc2MgZGV2aWNlLCB3aGljaAorCSAqIGEgdXNlcnNwYWNlIGRhZW1vbiB3aWxsIHJlYWQgYW5kIHdyaXRlIHRvLgorCSAqCisJICogRm9yIG5vdywgY2FuY2VsIHJlcXVlc3RzICh3aGljaCBoYXBwZW4gaW50ZXJuYWxseSBvbmx5KSwKKwkgKiBhcmUgdHVybmVkIGludG8gdW5sb2Nrcy4gTW9zdCBvZiB0aGlzIGZ1bmN0aW9uIHRha2VuIGZyb20KKwkgKiBnZnMyX2xvY2suCisJICovCisKKwlpZiAoY21kID09IEZfQ0FOQ0VMTEspIHsKKwkJY21kID0gRl9TRVRMSzsKKwkJZmwtPmZsX3R5cGUgPSBGX1VOTENLOworCX0KKworCWlmIChJU19HRVRMSyhjbWQpKQorCQlyZXR1cm4gZGxtX3Bvc2l4X2dldChjb25uLT5jY19sb2Nrc3BhY2UsIGlubywgZmlsZSwgZmwpOworCWVsc2UgaWYgKGZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBkbG1fcG9zaXhfdW5sb2NrKGNvbm4tPmNjX2xvY2tzcGFjZSwgaW5vLCBmaWxlLCBmbCk7CisJZWxzZQorCQlyZXR1cm4gZGxtX3Bvc2l4X2xvY2soY29ubi0+Y2NfbG9ja3NwYWNlLCBpbm8sIGZpbGUsIGNtZCwgZmwpOworfQorCiAvKgogICogQ29tcGFyZSBhIHJlcXVlc3RlZCBsb2NraW5nIHByb3RvY29sIHZlcnNpb24gYWdhaW5zdCB0aGUgY3VycmVudCBvbmUuCiAgKgpAQCAtODM5LDYgKzg3MSw3IEBACiAJLmRsbV91bmxvY2sJPSB1c2VyX2RsbV91bmxvY2ssCiAJLmxvY2tfc3RhdHVzCT0gdXNlcl9kbG1fbG9ja19zdGF0dXMsCiAJLmxvY2tfbHZiCT0gdXNlcl9kbG1fbHZiLAorCS5wbG9jawkJPSB1c2VyX3Bsb2NrLAogCS5kdW1wX2xrc2IJPSB1c2VyX2RsbV9kdW1wX2xrc2IsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdGFja2dsdWUuYyBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCmluZGV4IDA3ZjM0OGIuLjY4YjY2OGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL3N0YWNrZ2x1ZS5jCkBAIC0yODgsNiArMjg4LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvY2ZzMl9kbG1fZHVtcF9sa3NiKTsKIAoraW50IG9jZnMyX3N0YWNrX3N1cHBvcnRzX3Bsb2Nrcyh2b2lkKQoreworCXJldHVybiBhY3RpdmVfc3RhY2sgJiYgYWN0aXZlX3N0YWNrLT5zcF9vcHMtPnBsb2NrOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2NmczJfc3RhY2tfc3VwcG9ydHNfcGxvY2tzKTsKKworLyoKKyAqIG9jZnMyX3Bsb2NrKCkgY2FuIG9ubHkgYmUgc2FmZWx5IGNhbGxlZCBpZgorICogb2NmczJfc3RhY2tfc3VwcG9ydHNfcGxvY2tzKCkgcmV0dXJuZWQgdHJ1ZQorICovCitpbnQgb2NmczJfcGxvY2soc3RydWN0IG9jZnMyX2NsdXN0ZXJfY29ubmVjdGlvbiAqY29ubiwgdTY0IGlubywKKwkJc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCVdBUk5fT05fT05DRShhY3RpdmVfc3RhY2stPnNwX29wcy0+cGxvY2sgPT0gTlVMTCk7CisJaWYgKGFjdGl2ZV9zdGFjay0+c3Bfb3BzLT5wbG9jaykKKwkJcmV0dXJuIGFjdGl2ZV9zdGFjay0+c3Bfb3BzLT5wbG9jayhjb25uLCBpbm8sIGZpbGUsIGNtZCwgZmwpOworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9jZnMyX3Bsb2NrKTsKKwogaW50IG9jZnMyX2NsdXN0ZXJfY29ubmVjdChjb25zdCBjaGFyICpzdGFja19uYW1lLAogCQkJICBjb25zdCBjaGFyICpncm91cCwKIAkJCSAgaW50IGdyb3VwbGVuLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3RhY2tnbHVlLmggYi9mcy9vY2ZzMi9zdGFja2dsdWUuaAppbmRleCBkYjU2MjgxLi5jNTcxYWYzIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdGFja2dsdWUuaAorKysgYi9mcy9vY2ZzMi9zdGFja2dsdWUuaApAQCAtMjgsNiArMjgsMTAgQEAKICNpbmNsdWRlICJkbG0vZGxtYXBpLmgiCiAjaW5jbHVkZSA8bGludXgvZGxtLmg+CiAKKy8qIE5lZWRlZCBmb3IgcGxvY2stcmVsYXRlZCBwcm90b3R5cGVzICovCitzdHJ1Y3QgZmlsZTsKK3N0cnVjdCBmaWxlX2xvY2s7CisKIC8qCiAgKiBkbG1jb25zdGFudHMuaCBkb2VzIG5vdCBoYXZlIGEgTE9DQUwgZmxhZy4gIFdlIGhvcGUgdG8gcmVtb3ZlIGl0CiAgKiBzb21lIGRheSwgYnV0IHJpZ2h0IG5vdyB3ZSBuZWVkIGl0LiAgTGV0J3MgZmFrZSBpdC4gIFRoaXMgdmFsdWUgaXMgbGFyZ2VyCkBAIC0xODcsNiArMTkxLDE3IEBACiAJdm9pZCAqKCpsb2NrX2x2YikodW5pb24gb2NmczJfZGxtX2xrc2IgKmxrc2IpOwogCiAJLyoKKwkgKiBDbHVzdGVyLWF3YXJlIHBvc2l4IGxvY2tzCisJICoKKwkgKiBUaGlzIGlzIE5VTEwgZm9yIHN0YWNrcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBwb3NpeCBsb2Nrcy4KKwkgKi8KKwlpbnQgKCpwbG9jaykoc3RydWN0IG9jZnMyX2NsdXN0ZXJfY29ubmVjdGlvbiAqY29ubiwKKwkJICAgICB1NjQgaW5vLAorCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIGludCBjbWQsCisJCSAgICAgc3RydWN0IGZpbGVfbG9jayAqZmwpOworCisJLyoKIAkgKiBUaGlzIGlzIGFuIG9wdG9pbmFsIGRlYnVnZ2luZyBob29rLiAgSWYgcHJvdmlkZWQsIHRoZQogCSAqIHN0YWNrIGNhbiBkdW1wIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGxvY2suCiAJICovCkBAIC0yNDAsNiArMjU1LDEwIEBACiB2b2lkICpvY2ZzMl9kbG1fbHZiKHVuaW9uIG9jZnMyX2RsbV9sa3NiICpsa3NiKTsKIHZvaWQgb2NmczJfZGxtX2R1bXBfbGtzYih1bmlvbiBvY2ZzMl9kbG1fbGtzYiAqbGtzYik7CiAKK2ludCBvY2ZzMl9zdGFja19zdXBwb3J0c19wbG9ja3Modm9pZCk7CitpbnQgb2NmczJfcGxvY2soc3RydWN0IG9jZnMyX2NsdXN0ZXJfY29ubmVjdGlvbiAqY29ubiwgdTY0IGlubywKKwkJc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKKwogdm9pZCBvY2ZzMl9zdGFja19nbHVlX3NldF9sb2NraW5nX3Byb3RvY29sKHN0cnVjdCBvY2ZzMl9sb2NraW5nX3Byb3RvY29sICpwcm90byk7CiAKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZDJkMjc4Zi4uYzVmZjE4YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC02MiwxNSArNjIsMTggQEAKIAkJCQkgIHN0cnVjdCBvY2ZzMl9jaGFpbl9saXN0ICpjbCk7CiBzdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2FsbG9jKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICB1NjQgbWF4X2Jsb2NrKTsKIAogc3RhdGljIGludCBvY2ZzMl9jbHVzdGVyX2dyb3VwX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJICAgICAgdTMyIGJpdHNfd2FudGVkLCB1MzIgbWluX2JpdHMsCisJCQkJICAgICAgdTY0IG1heF9ibG9jaywKIAkJCQkgICAgICB1MTYgKmJpdF9vZmYsIHUxNiAqYml0c19mb3VuZCk7CiBzdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoLAogCQkJCSAgICB1MzIgYml0c193YW50ZWQsIHUzMiBtaW5fYml0cywKKwkJCQkgICAgdTY0IG1heF9ibG9jaywKIAkJCQkgICAgdTE2ICpiaXRfb2ZmLCB1MTYgKmJpdHNfZm91bmQpOwogc3RhdGljIGludCBvY2ZzMl9jbGFpbV9zdWJhbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLApAQCAtMTEwLDggKzExMywxMSBAQAogCQkJCQkJdTY0IGRhdGFfYmxrbm8sCiAJCQkJCQl1NjQgKmJnX2Jsa25vLAogCQkJCQkJdTE2ICpiZ19iaXRfb2ZmKTsKK3N0YXRpYyBpbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVyc193aXRoX2xpbWl0KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCQkgICAgIHUzMiBiaXRzX3dhbnRlZCwgdTY0IG1heF9ibG9jaywKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKTsKIAotc3RhdGljIHZvaWQgb2NmczJfZnJlZV9hY19yZXNvdXJjZShzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpCit2b2lkIG9jZnMyX2ZyZWVfYWNfcmVzb3VyY2Uoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBhYy0+YWNfaW5vZGU7CiAKQEAgLTEyNCwxMCArMTMwLDggQEAKIAkJaXB1dChpbm9kZSk7CiAJCWFjLT5hY19pbm9kZSA9IE5VTEw7CiAJfQotCWlmIChhYy0+YWNfYmgpIHsKLQkJYnJlbHNlKGFjLT5hY19iaCk7Ci0JCWFjLT5hY19iaCA9IE5VTEw7Ci0JfQorCWJyZWxzZShhYy0+YWNfYmgpOworCWFjLT5hY19iaCA9IE5VTEw7CiB9CiAKIHZvaWQgb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKQEAgLTI3Niw3ICsyODAsOCBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2FsbG9jKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCSAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgIHU2NCBtYXhfYmxvY2spCiB7CiAJaW50IHN0YXR1cywgY3JlZGl0czsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGJoLT5iX2RhdGE7CkBAIC0yOTQsOSArMjk5LDkgQEAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAogCWNsID0gJmZlLT5pZDIuaV9jaGFpbjsKLQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwKLQkJCQkJbGUxNl90b19jcHUoY2wtPmNsX2NwZyksCi0JCQkJCSZhYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVyc193aXRoX2xpbWl0KG9zYiwKKwkJCQkJCSAgIGxlMTZfdG9fY3B1KGNsLT5jbF9jcGcpLAorCQkJCQkJICAgbWF4X2Jsb2NrLCAmYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTM5NCw4ICszOTksNyBAQAogCWlmIChhYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGFjKTsKIAotCWlmIChiZ19iaCkKLQkJYnJlbHNlKGJnX2JoKTsKKwlicmVsc2UoYmdfYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTQ2OSw3ICs0NzMsOCBAQAogCQkJZ290byBiYWlsOwogCQl9CiAKLQkJc3RhdHVzID0gb2NmczJfYmxvY2tfZ3JvdXBfYWxsb2Mob3NiLCBhbGxvY19pbm9kZSwgYmgpOworCQlzdGF0dXMgPSBvY2ZzMl9ibG9ja19ncm91cF9hbGxvYyhvc2IsIGFsbG9jX2lub2RlLCBiaCwKKwkJCQkJCSBhYy0+YWNfbWF4X2Jsb2NrKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC00ODYsMTYgKzQ5MSwxNSBAQAogCWdldF9iaChiaCk7CiAJYWMtPmFjX2JoID0gYmg7CiBiYWlsOgotCWlmIChiaCkKLQkJYnJlbHNlKGJoKTsKKwlicmVsc2UoYmgpOwogCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpCitpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCSAgICAgIGludCBibG9ja3MsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiBzbG90OwpAQCAtNTA3LDcgKzUxMSw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkoKmFjKS0+YWNfYml0c193YW50ZWQgPSBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZmUpOworCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IGJsb2NrczsKIAkoKmFjKS0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfTUVUQTsKIAlzbG90ID0gb3NiLT5zbG90X251bTsKIAkoKmFjKS0+YWNfZ3JvdXBfc2VhcmNoID0gb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoOwpAQCAtNTMyLDYgKzUzNiwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK2ludCBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKK3sKKwlyZXR1cm4gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwKKwkJCQkJb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKHJvb3RfZWwpLAorCQkJCQlhYyk7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfc3RlYWxfaW5vZGVfZnJvbV9vdGhlcl9ub2RlcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKQogewpAQCAtNTgyLDYgKzU5NSwxNCBAQAogCSgqYWMpLT5hY19ncm91cF9zZWFyY2ggPSBvY2ZzMl9ibG9ja19ncm91cF9zZWFyY2g7CiAKIAkvKgorCSAqIHN0YXQoMikgY2FuJ3QgaGFuZGxlIGlfaW5vID4gMzJiaXRzLCBzbyB3ZSB0ZWxsIHRoZQorCSAqIGxvd2VyIGxldmVscyBub3QgdG8gYWxsb2NhdGUgdXMgYSBibG9jayBncm91cCBwYXN0IHRoYXQKKwkgKiBsaW1pdC4gIFRoZSAnaW5vZGU2NCcgbW91bnQgb3B0aW9uIGF2b2lkcyB0aGlzIGJlaGF2aW9yLgorCSAqLworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9JTk9ERTY0KSkKKwkJKCphYyktPmFjX21heF9ibG9jayA9ICh1MzIpfjBVOworCisJLyoKIAkgKiBzbG90IGlzIHNldCB3aGVuIHdlIHN1Y2Nlc3NmdWxseSBzdGVhbCBpbm9kZSBmcm9tIG90aGVyIG5vZGVzLgogCSAqIEl0IGlzIHJlc2V0IGluIDMgcGxhY2VzOgogCSAqIDEuIHdoZW4gd2UgZmx1c2ggdGhlIHRydW5jYXRlIGxvZwpAQCAtNjYxLDkgKzY4Miw5IEBACiAvKiBDYWxsZXJzIGRvbid0IG5lZWQgdG8gY2FyZSB3aGljaCBiaXRtYXAgKGxvY2FsIGFsbG9jIG9yIG1haW4pIHRvCiAgKiB1c2Ugc28gd2UgZmlndXJlIGl0IG91dCBmb3IgdGhlbSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhpcyBjbHV0dGVycwogICogdGhpbmdzIGEgYml0LiAqLwotaW50IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICB1MzIgYml0c193YW50ZWQsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKQorc3RhdGljIGludCBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzX3dpdGhfbGltaXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJCSAgICAgdTMyIGJpdHNfd2FudGVkLCB1NjQgbWF4X2Jsb2NrLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpCiB7CiAJaW50IHN0YXR1czsKIApAQCAtNjc3LDI0ICs2OTgsMjAgQEAKIAl9CiAKIAkoKmFjKS0+YWNfYml0c193YW50ZWQgPSBiaXRzX3dhbnRlZDsKKwkoKmFjKS0+YWNfbWF4X2Jsb2NrID0gbWF4X2Jsb2NrOwogCiAJc3RhdHVzID0gLUVOT1NQQzsKIAlpZiAob2NmczJfYWxsb2Nfc2hvdWxkX3VzZV9sb2NhbChvc2IsIGJpdHNfd2FudGVkKSkgewogCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2xvY2FsX2FsbG9jX2JpdHMob3NiLAogCQkJCQkJCWJpdHNfd2FudGVkLAogCQkJCQkJCSphYyk7Ci0JCWlmICgoc3RhdHVzIDwgMCkgJiYgKHN0YXR1cyAhPSAtRU5PU1BDKSkgeworCQlpZiAoc3RhdHVzID09IC1FRkJJRykgeworCQkJLyogVGhlIGxvY2FsIGFsbG9jIHdpbmRvdyBpcyBvdXRzaWRlIGFjX21heF9ibG9jay4KKwkJCSAqIHVzZSB0aGUgbWFpbiBiaXRtYXAuICovCisJCQlzdGF0dXMgPSAtRU5PU1BDOworCQl9IGVsc2UgaWYgKChzdGF0dXMgPCAwKSAmJiAoc3RhdHVzICE9IC1FTk9TUEMpKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzID09IC1FTk9TUEMpIHsKLQkJCS8qIHJlc2VydmVfbG9jYWxfYml0cyB3aWxsIHJldHVybiBlbm9zcGMgd2l0aAotCQkJICogdGhlIGxvY2FsIGFsbG9jIGlub2RlIHN0aWxsIGxvY2tlZCwgc28gd2UKLQkJCSAqIGNhbiBjaGFuZ2UgdGhpcyBzYWZlbHkgaGVyZS4gKi8KLQkJCW1sb2coMCwgIkRpc2FibGluZyBsb2NhbCBhbGxvY1xuIik7Ci0JCQkvKiBXZSBzZXQgdG8gT0NGUzJfTEFfRElTQUJMRUQgc28gdGhhdCB1bW91bnQKLQkJCSAqIGNhbiBjbGVhbiB1cCB3aGF0J3MgbGVmdCBvZiB0aGUgbG9jYWwKLQkJCSAqIGFsbG9jYXRpb24gKi8KLQkJCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9ESVNBQkxFRDsKIAkJfQogCX0KIApAQCAtNzE4LDYgKzczNSwxMyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK2ludCBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJICAgdTMyIGJpdHNfd2FudGVkLAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKK3sKKwlyZXR1cm4gb2NmczJfcmVzZXJ2ZV9jbHVzdGVyc193aXRoX2xpbWl0KG9zYiwgYml0c193YW50ZWQsIDAsIGFjKTsKK30KKwogLyoKICAqIE1vcmUgb3IgbGVzcyBsaWZ0ZWQgZnJvbSBleHQzLiBJJ2xsIGxlYXZlIHRoZWlyIGRlc2NyaXB0aW9uIGJlbG93OgogICoKQEAgLTEwMDAsMTEgKzEwMjQsMTQgQEAKIHN0YXRpYyBpbnQgb2NmczJfY2x1c3Rlcl9ncm91cF9zZWFyY2goc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoLAogCQkJCSAgICAgIHUzMiBiaXRzX3dhbnRlZCwgdTMyIG1pbl9iaXRzLAorCQkJCSAgICAgIHU2NCBtYXhfYmxvY2ssCiAJCQkJICAgICAgdTE2ICpiaXRfb2ZmLCB1MTYgKmJpdHNfZm91bmQpCiB7CiAJaW50IHNlYXJjaCA9IC1FTk9TUEM7CiAJaW50IHJldDsKKwl1NjQgYmxrb2ZmOwogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKSBncm91cF9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXUxNiB0bXBfb2ZmLCB0bXBfZm91bmQ7CiAJdW5zaWduZWQgaW50IG1heF9iaXRzLCBnZF9jbHVzdGVyX29mZjsKIApAQCAtMTAzNyw2ICsxMDY0LDE3IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCisJCWlmIChtYXhfYmxvY2spIHsKKwkJCWJsa29mZiA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJCQkgIGdkX2NsdXN0ZXJfb2ZmICsKKwkJCQkJCQkgIHRtcF9vZmYgKyB0bXBfZm91bmQpOworCQkJbWxvZygwLCAiQ2hlY2tpbmcgJWxsdSBhZ2FpbnN0ICVsbHVcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrb2ZmLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1heF9ibG9jayk7CisJCQlpZiAoYmxrb2ZmID4gbWF4X2Jsb2NrKQorCQkJCXJldHVybiAtRU5PU1BDOworCQl9CisKIAkJLyogb2NmczJfYmxvY2tfZ3JvdXBfZmluZF9jbGVhcl9iaXRzKCkgbWlnaHQKIAkJICogcmV0dXJuIHN1Y2Nlc3MsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHJldHVybgogCQkgKiAtRU5PU1BDIHVubGVzcyBpdCBmb3VuZCB0aGUgbWluaW11bSBudW1iZXIKQEAgLTEwNDUsNiArMTA4MywxMiBAQAogCQkJKmJpdF9vZmYgPSB0bXBfb2ZmOwogCQkJKmJpdHNfZm91bmQgPSB0bXBfZm91bmQ7CiAJCQlzZWFyY2ggPSAwOyAvKiBzdWNjZXNzICovCisJCX0gZWxzZSBpZiAodG1wX2ZvdW5kKSB7CisJCQkvKgorCQkJICogRG9uJ3Qgc2hvdyBiaXRzIHdoaWNoIHdlJ2xsIGJlIHJldHVybmluZworCQkJICogZm9yIGFsbG9jYXRpb24gdG8gdGhlIGxvY2FsIGFsbG9jIGJpdG1hcC4KKwkJCSAqLworCQkJb2NmczJfbG9jYWxfYWxsb2Nfc2Vlbl9mcmVlX2JpdHMob3NiLCB0bXBfZm91bmQpOwogCQl9CiAJfQogCkBAIC0xMDU0LDE5ICsxMDk4LDMxIEBACiBzdGF0aWMgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoLAogCQkJCSAgICB1MzIgYml0c193YW50ZWQsIHUzMiBtaW5fYml0cywKKwkJCQkgICAgdTY0IG1heF9ibG9jaywKIAkJCQkgICAgdTE2ICpiaXRfb2ZmLCB1MTYgKmJpdHNfZm91bmQpCiB7CiAJaW50IHJldCA9IC1FTk9TUEM7CisJdTY0IGJsa29mZjsKIAlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKikgZ3JvdXBfYmgtPmJfZGF0YTsKIAogCUJVR19PTihtaW5fYml0cyAhPSAxKTsKIAlCVUdfT04ob2NmczJfaXNfY2x1c3Rlcl9iaXRtYXAoaW5vZGUpKTsKIAotCWlmIChiZy0+YmdfZnJlZV9iaXRzX2NvdW50KQorCWlmIChiZy0+YmdfZnJlZV9iaXRzX2NvdW50KSB7CiAJCXJldCA9IG9jZnMyX2Jsb2NrX2dyb3VwX2ZpbmRfY2xlYXJfYml0cyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCiAJCQkJCQkJZ3JvdXBfYmgsIGJpdHNfd2FudGVkLAogCQkJCQkJCWxlMTZfdG9fY3B1KGJnLT5iZ19iaXRzKSwKIAkJCQkJCQliaXRfb2ZmLCBiaXRzX2ZvdW5kKTsKKwkJaWYgKCFyZXQgJiYgbWF4X2Jsb2NrKSB7CisJCQlibGtvZmYgPSBsZTY0X3RvX2NwdShiZy0+YmdfYmxrbm8pICsgKmJpdF9vZmYgKworCQkJCSpiaXRzX2ZvdW5kOworCQkJbWxvZygwLCAiQ2hlY2tpbmcgJWxsdSBhZ2FpbnN0ICVsbHVcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrb2ZmLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1heF9ibG9jayk7CisJCQlpZiAoYmxrb2ZmID4gbWF4X2Jsb2NrKQorCQkJCXJldCA9IC1FTk9TUEM7CisJCX0KKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTExNiw4ICsxMTcyLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2Q7CiAJc3RydWN0IGlub2RlICphbGxvY19pbm9kZSA9IGFjLT5hY19pbm9kZTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoYWxsb2NfaW5vZGUtPmlfc2IpLCBnZF9ibGtubywKLQkJCSAgICAgICAmZ3JvdXBfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgYWxsb2NfaW5vZGUpOworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsIGdkX2Jsa25vLCAmZ3JvdXBfYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTExMzEsNyArMTE4Niw3IEBACiAJfQogCiAJcmV0ID0gYWMtPmFjX2dyb3VwX3NlYXJjaChhbGxvY19pbm9kZSwgZ3JvdXBfYmgsIGJpdHNfd2FudGVkLCBtaW5fYml0cywKLQkJCQkgIGJpdF9vZmYsICZmb3VuZCk7CisJCQkJICBhYy0+YWNfbWF4X2Jsb2NrLCBiaXRfb2ZmLCAmZm91bmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWlmIChyZXQgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTExODYsOSArMTI0MSw5IEBACiAJICAgICBiaXRzX3dhbnRlZCwgY2hhaW4sCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koYWxsb2NfaW5vZGUpLT5pcF9ibGtubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGFsbG9jX2lub2RlLT5pX3NiKSwKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLAogCQkJCSAgbGU2NF90b19jcHUoY2wtPmNsX3JlY3NbY2hhaW5dLmNfYmxrbm8pLAotCQkJCSAgJmdyb3VwX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGFsbG9jX2lub2RlKTsKKwkJCQkgICZncm91cF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMjA0LDIxICsxMjU5LDIwIEBACiAJLyogZm9yIG5vdywgdGhlIGNoYWluIHNlYXJjaCBpcyBhIGJpdCBzaW1wbGlzdGljLiBXZSBqdXN0IHVzZQogCSAqIHRoZSAxc3QgZ3JvdXAgd2l0aCBhbnkgZW1wdHkgYml0cy4gKi8KIAl3aGlsZSAoKHN0YXR1cyA9IGFjLT5hY19ncm91cF9zZWFyY2goYWxsb2NfaW5vZGUsIGdyb3VwX2JoLAotCQkJCQkgICAgIGJpdHNfd2FudGVkLCBtaW5fYml0cywgYml0X29mZiwKKwkJCQkJICAgICBiaXRzX3dhbnRlZCwgbWluX2JpdHMsCisJCQkJCSAgICAgYWMtPmFjX21heF9ibG9jaywgYml0X29mZiwKIAkJCQkJICAgICAmdG1wX2JpdHMpKSA9PSAtRU5PU1BDKSB7CiAJCWlmICghYmctPmJnX25leHRfZ3JvdXApCiAJCQlicmVhazsKIAotCQlpZiAocHJldl9ncm91cF9iaCkgewotCQkJYnJlbHNlKHByZXZfZ3JvdXBfYmgpOwotCQkJcHJldl9ncm91cF9iaCA9IE5VTEw7Ci0JCX0KKwkJYnJlbHNlKHByZXZfZ3JvdXBfYmgpOworCQlwcmV2X2dyb3VwX2JoID0gTlVMTDsKKwogCQluZXh0X2dyb3VwID0gbGU2NF90b19jcHUoYmctPmJnX25leHRfZ3JvdXApOwogCQlwcmV2X2dyb3VwX2JoID0gZ3JvdXBfYmg7CiAJCWdyb3VwX2JoID0gTlVMTDsKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihhbGxvY19pbm9kZS0+aV9zYiksCi0JCQkJCSAgbmV4dF9ncm91cCwgJmdyb3VwX2JoLAotCQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgYWxsb2NfaW5vZGUpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGFsbG9jX2lub2RlLAorCQkJCQkgIG5leHRfZ3JvdXAsICZncm91cF9iaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC0xMzA3LDEwICsxMzYxLDggQEAKIAkqYmdfYmxrbm8gPSBsZTY0X3RvX2NwdShiZy0+YmdfYmxrbm8pOwogCSpiaXRzX2xlZnQgPSBsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9iaXRzX2NvdW50KTsKIGJhaWw6Ci0JaWYgKGdyb3VwX2JoKQotCQlicmVsc2UoZ3JvdXBfYmgpOwotCWlmIChwcmV2X2dyb3VwX2JoKQotCQlicmVsc2UocHJldl9ncm91cF9iaCk7CisJYnJlbHNlKGdyb3VwX2JoKTsKKwlicmVsc2UocHJldl9ncm91cF9iaCk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTcyMyw3ICsxNzc1LDYgQEAKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgdG1wX3VzZWQ7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihhbGxvY19pbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBhbGxvY19iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl9jaGFpbl9saXN0ICpjbCA9ICZmZS0+aWQyLmlfY2hhaW47CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCA9IE5VTEw7CkBAIC0xNzQyLDggKzE3OTMsNyBAQAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGFsbG9jX2lub2RlKS0+aXBfYmxrbm8sIGNvdW50LAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliZ19ibGtubywgc3RhcnRfYml0KTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBiZ19ibGtubywgJmdyb3VwX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJICBhbGxvY19pbm9kZSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhhbGxvY19pbm9kZSwgYmdfYmxrbm8sICZncm91cF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xNzg0LDggKzE4MzQsNyBAQAogCX0KIAogYmFpbDoKLQlpZiAoZ3JvdXBfYmgpCi0JCWJyZWxzZShncm91cF9iaCk7CisJYnJlbHNlKGdyb3VwX2JoKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xODM4LDkgKzE4ODcsMTUgQEAKIAlzdGF0dXMgPSBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlLCBiaXRtYXBfaW5vZGUsIGJpdG1hcF9iaCwKIAkJCQkJICBiZ19zdGFydF9iaXQsIGJnX2Jsa25vLAogCQkJCQkgIG51bV9jbHVzdGVycyk7Ci0JaWYgKHN0YXR1cyA8IDApCisJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CiAKKwlvY2ZzMl9sb2NhbF9hbGxvY19zZWVuX2ZyZWVfYml0cyhPQ0ZTMl9TQihiaXRtYXBfaW5vZGUtPmlfc2IpLAorCQkJCQkgbnVtX2NsdXN0ZXJzKTsKKworb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xODkxLDMgKzE5NDYsODQgQEAKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZmUtPmlkMi5pX2NoYWluLmNsX3JlY3NbaV0uY19ibGtubyk7CiAJfQogfQorCisvKgorICogRm9yIGEgZ2l2ZW4gYWxsb2NhdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIGFsbG9jYXRvcnMgd2lsbCBuZWVkIHRvIGJlCisgKiBhY2Nlc3NlZCwgYW5kIGxvY2sgdGhlbSwgcmVzZXJ2aW5nIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYml0cy4KKyAqCisgKiBTcGFyc2UgZmlsZSBzeXN0ZW1zIGNhbGwgdGhpcyBmcm9tIG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jaygpCisgKiBhbmQgb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoKS4KKyAqCisgKiBGaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBob2xlcyBjYWxsIHRoaXMgZnJvbQorICogb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oKS4KKyAqLworaW50IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAorCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAorCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpCit7CisJaW50IHJldCA9IDAsIG51bV9mcmVlX2V4dGVudHM7CisJdW5zaWduZWQgaW50IG1heF9yZWNzX25lZWRlZCA9IGNsdXN0ZXJzX3RvX2FkZCArIDIgKiBleHRlbnRzX3RvX3NwbGl0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJKm1ldGFfYWMgPSBOVUxMOworCWlmIChkYXRhX2FjKQorCQkqZGF0YV9hYyA9IE5VTEw7CisKKwlCVUdfT04oY2x1c3RlcnNfdG9fYWRkICE9IDAgJiYgZGF0YV9hYyA9PSBOVUxMKTsKKworCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGV0KTsKKwlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKKwkJcmV0ID0gbnVtX2ZyZWVfZXh0ZW50czsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFNwYXJzZSBhbGxvY2F0aW9uIGZpbGUgc3lzdGVtcyBuZWVkIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlCisJICogd2l0aCByZXNlcnZpbmcgcm9vbSBmb3IgZXhwYW5zaW9uIC0gdGhlIGFjdHVhbCBhbGxvY2F0aW9uCisJICogaGFwcGVucyB3aGlsZSB3ZSd2ZSBnb3QgYSBqb3VybmFsIGhhbmRsZSBvcGVuIHNvIHJlLXRha2luZworCSAqIGEgY2x1c3RlciBsb2NrIChiZWNhdXNlIHdlIHJhbiBvdXQgb2Ygcm9vbSBmb3IgYW5vdGhlcgorCSAqIGV4dGVudCkgd2lsbCB2aW9sYXRlIG9yZGVyaW5nIHJ1bGVzLgorCSAqCisJICogTW9zdCBvZiB0aGUgdGltZSB3ZSdsbCBvbmx5IGJlIHNlZWluZyB0aGlzIDEgY2x1c3RlciBhdCBhIHRpbWUKKwkgKiBhbnl3YXkuCisJICoKKwkgKiBBbHdheXMgbG9jayBmb3IgYW55IHVud3JpdHRlbiBleHRlbnRzIC0gd2UgbWlnaHQgd2FudCB0bworCSAqIGFkZCBibG9ja3MgZHVyaW5nIGEgc3BsaXQuCisJICovCisJaWYgKCFudW1fZnJlZV9leHRlbnRzIHx8CisJICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgbWF4X3JlY3NfbmVlZGVkKSkgeworCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGV0LT5ldF9yb290X2VsLCBtZXRhX2FjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChjbHVzdGVyc190b19hZGQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgY2x1c3RlcnNfdG9fYWRkLCBkYXRhX2FjKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FTk9TUEMpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWlmIChyZXQpIHsKKwkJaWYgKCptZXRhX2FjKSB7CisJCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoKm1ldGFfYWMpOworCQkJKm1ldGFfYWMgPSBOVUxMOworCQl9CisKKwkJLyoKKwkJICogV2UgY2Fubm90IGhhdmUgYW4gZXJyb3IgYW5kIGEgbm9uIG51bGwgKmRhdGFfYWMuCisJCSAqLworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5oIGIvZnMvb2NmczIvc3ViYWxsb2MuaAppbmRleCA1NDRjNjAwLi40ZGYxNTlkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5oCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKQEAgLTI4LDEwICsyOCwxMSBAQAogCiB0eXBlZGVmIGludCAoZ3JvdXBfc2VhcmNoX3QpKHN0cnVjdCBpbm9kZSAqLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKLQkJCSAgICAgdTMyLAotCQkJICAgICB1MzIsCi0JCQkgICAgIHUxNiAqLAotCQkJICAgICB1MTYgKik7CisJCQkgICAgIHUzMiwJCQkvKiBiaXRzX3dhbnRlZCAqLworCQkJICAgICB1MzIsCQkJLyogbWluX2JpdHMgKi8KKwkJCSAgICAgdTY0LAkJCS8qIG1heF9ibG9jayAqLworCQkJICAgICB1MTYgKiwJCQkvKiAqYml0X29mZiAqLworCQkJICAgICB1MTYgKik7CQkJLyogKmJpdHNfZm91bmQgKi8KIAogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgewogCXN0cnVjdCBpbm9kZSAqYWNfaW5vZGU7ICAgIC8qIHdoaWNoIGJpdG1hcCBhcmUgd2UgYWxsb2NhdGluZyBmcm9tPyAqLwpAQCAtNTEsNiArNTIsOCBAQAogCWdyb3VwX3NlYXJjaF90ICphY19ncm91cF9zZWFyY2g7CiAKIAl1NjQgICAgYWNfbGFzdF9ncm91cDsKKwl1NjQgICAgYWNfbWF4X2Jsb2NrOyAgLyogSGlnaGVzdCBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUuIDAgaXMKKwkJCQkgaXMgdGhlIHNhbWUgYXMgfjAgLSB1bmxpbWl0ZWQgKi8KIH07CiAKIHZvaWQgb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYyk7CkBAIC01OSw5ICs2MiwxNyBAQAogCXJldHVybiBhYy0+YWNfYml0c193YW50ZWQgLSBhYy0+YWNfYml0c19naXZlbjsKIH0KIAorLyoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IHJvb3RfZWwgaXMgdGhlIHJvb3QKKyAqIG9mIGV4dGVudCB0cmVlLiBTbyBmb3IgYW4gaW5vZGUsIGl0IHNob3VsZCBiZSAmZmUtPmlkMi5pX2xpc3QuIE90aGVyd2lzZQorICogdGhlIHJlc3VsdCBtYXkgYmUgd3JvbmcuCisgKi8KIGludCBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CitpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCSAgICAgIGludCBibG9ja3MsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CiBpbnQgb2NmczJfcmVzZXJ2ZV9uZXdfaW5vZGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYyk7CiBpbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKQEAgLTE0Nyw2ICsxNTgsNyBAQAogICogYXBpcyBhYm92ZS4gKi8KIGludCBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJfYml0bWFwX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKK3ZvaWQgb2NmczJfZnJlZV9hY19yZXNvdXJjZShzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMpOwogCiAvKiBnaXZlbiBhIGNsdXN0ZXIgb2Zmc2V0LCBjYWxjdWxhdGUgd2hpY2ggYmxvY2sgZ3JvdXAgaXQgYmVsb25ncyB0bwogICogYW5kIHJldHVybiB0aGF0IGJsb2NrIG9mZnNldC4gKi8KQEAgLTE1Niw0ICsxNjgsOCBAQAogaW50IG9jZnMyX2NoZWNrX2dyb3VwX2Rlc2NyaXB0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCiAJCQkJIHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCk7CitpbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAorCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiAjZW5kaWYgLyogX0NIQUlOQUxMT0NfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1cGVyLmMgYi9mcy9vY2ZzMi9zdXBlci5jCmluZGV4IDg4MjU1ZDNmLi4zMDRiNjNhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTY0LDYgKzY0LDcgQEAKICNpbmNsdWRlICJzeXNmaWxlLmgiCiAjaW5jbHVkZSAidXB0b2RhdGUuaCIKICNpbmNsdWRlICJ2ZXIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtMTU0LDEwICsxNTUsMTMgQEAKIAlPcHRfbG9jYWxhbGxvYywKIAlPcHRfbG9jYWxmbG9ja3MsCiAJT3B0X3N0YWNrLAorCU9wdF91c2VyX3hhdHRyLAorCU9wdF9ub3VzZXJfeGF0dHIsCisJT3B0X2lub2RlNjQsCiAJT3B0X2VyciwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSV1In0sCiAJe09wdF9lcnJfcGFuaWMsICJlcnJvcnM9cGFuaWMifSwKIAl7T3B0X2Vycl9ybywgImVycm9ycz1yZW1vdW50LXJvIn0sCkBAIC0xNzMsNiArMTc3LDkgQEAKIAl7T3B0X2xvY2FsYWxsb2MsICJsb2NhbGFsbG9jPSVkIn0sCiAJe09wdF9sb2NhbGZsb2NrcywgImxvY2FsZmxvY2tzIn0sCiAJe09wdF9zdGFjaywgImNsdXN0ZXJfc3RhY2s9JXMifSwKKwl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCisJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKKwl7T3B0X2lub2RlNjQsICJpbm9kZTY0In0sCiAJe09wdF9lcnIsIE5VTEx9CiB9OwogCkBAIC0yMDUsMTAgKzIxMiwxMSBAQAogCQlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAwKTsKIAl9CiAKLQlpZiAoam91cm5hbF9zdGFydF9jb21taXQoT0NGUzJfU0Ioc2IpLT5qb3VybmFsLT5qX2pvdXJuYWwsICZ0YXJnZXQpKSB7CisJaWYgKGpiZDJfam91cm5hbF9zdGFydF9jb21taXQoT0NGUzJfU0Ioc2IpLT5qb3VybmFsLT5qX2pvdXJuYWwsCisJCQkJICAgICAgJnRhcmdldCkpIHsKIAkJaWYgKHdhaXQpCi0JCQlsb2dfd2FpdF9jb21taXQoT0NGUzJfU0Ioc2IpLT5qb3VybmFsLT5qX2pvdXJuYWwsCi0JCQkJCXRhcmdldCk7CisJCQlqYmQyX2xvZ193YWl0X2NvbW1pdChPQ0ZTMl9TQihzYiktPmpvdXJuYWwtPmpfam91cm5hbCwKKwkJCQkJICAgICB0YXJnZXQpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMyNSw2ICszMzMsNyBAQAogCWlmICghb2kpCiAJCXJldHVybiBOVUxMOwogCisJamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKCZvaS0+aXBfamlub2RlLCAmb2ktPnZmc19pbm9kZSk7CiAJcmV0dXJuICZvaS0+dmZzX2lub2RlOwogfQogCkBAIC00MDYsNiArNDE1LDE1IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCS8qIFByb2JhYmx5IGRvbid0IHdhbnQgdGhpcyBvbiByZW1vdW50OyBpdCBtaWdodAorCSAqIG1lc3Mgd2l0aCBvdGhlciBub2RlcyAqLworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9JTk9ERTY0KSAmJgorCSAgICAocGFyc2VkX29wdGlvbnMubW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfSU5PREU2NCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJbWxvZyhNTF9FUlJPUiwgIkNhbm5vdCBlbmFibGUgaW5vZGU2NCBvbiByZW1vdW50XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogV2UncmUgZ29pbmcgdG8vZnJvbSByZWFkb25seSBtb2RlLiAqLwogCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSAhPSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCS8qIExvY2sgaGVyZSBzbyB0aGUgY2hlY2sgb2YgSEFSRF9STyBhbmQgdGhlIHBvdGVudGlhbApAQCAtNjM3LDcgKzY1NSw4IEBACiAJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBwYXJzZWRfb3B0aW9ucy5hdGltZV9xdWFudHVtOwogCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBwYXJzZWRfb3B0aW9ucy5zbG90OwogCW9zYi0+b3NiX2NvbW1pdF9pbnRlcnZhbCA9IHBhcnNlZF9vcHRpb25zLmNvbW1pdF9pbnRlcnZhbDsKLQlvc2ItPmxvY2FsX2FsbG9jX3NpemUgPSBwYXJzZWRfb3B0aW9ucy5sb2NhbGFsbG9jX29wdDsKKwlvc2ItPmxvY2FsX2FsbG9jX2RlZmF1bHRfYml0cyA9IG9jZnMyX21lZ2FieXRlc190b19jbHVzdGVycyhzYiwgcGFyc2VkX29wdGlvbnMubG9jYWxhbGxvY19vcHQpOworCW9zYi0+bG9jYWxfYWxsb2NfYml0cyA9IG9zYi0+bG9jYWxfYWxsb2NfZGVmYXVsdF9iaXRzOwogCiAJc3RhdHVzID0gb2NmczJfdmVyaWZ5X3VzZXJzcGFjZV9zdGFjayhvc2IsICZwYXJzZWRfb3B0aW9ucyk7CiAJaWYgKHN0YXR1cykKQEAgLTc0Myw4ICs3NjIsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIHJlYWRfc3VwZXJfZXJyb3I6Ci0JaWYgKGJoICE9IE5VTEwpCi0JCWJyZWxzZShiaCk7CisJYnJlbHNlKGJoKTsKIAogCWlmIChpbm9kZSkKIAkJaXB1dChpbm9kZSk7CkBAIC04NDcsNiArODY1LDEyIEBACiAJCWNhc2UgT3B0X2RhdGFfd3JpdGViYWNrOgogCQkJbW9wdC0+bW91bnRfb3B0IHw9IE9DRlMyX01PVU5UX0RBVEFfV1JJVEVCQUNLOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VzZXJfeGF0dHI6CisJCQltb3B0LT5tb3VudF9vcHQgJj0gfk9DRlMyX01PVU5UX05PVVNFUlhBVFRSOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vdXNlcl94YXR0cjoKKwkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUjsKKwkJCWJyZWFrOwogCQljYXNlIE9wdF9hdGltZV9xdWFudHVtOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpIHsKIAkJCQlzdGF0dXMgPSAwOwpAQCAtODczLDcgKzg5Nyw3IEBACiAJCQlpZiAob3B0aW9uIDwgMCkKIAkJCQlyZXR1cm4gMDsKIAkJCWlmIChvcHRpb24gPT0gMCkKLQkJCQlvcHRpb24gPSBKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRTsKKwkJCQlvcHRpb24gPSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0U7CiAJCQltb3B0LT5jb21taXRfaW50ZXJ2YWwgPSBIWiAqIG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9sb2NhbGFsbG9jOgpAQCAtOTE4LDYgKzk0Miw5IEBACiAJCQkgICAgICAgT0NGUzJfU1RBQ0tfTEFCRUxfTEVOKTsKIAkJCW1vcHQtPmNsdXN0ZXJfc3RhY2tbT0NGUzJfU1RBQ0tfTEFCRUxfTEVOXSA9ICdcMCc7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfaW5vZGU2NDoKKwkJCW1vcHQtPm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9JTk9ERTY0OworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQltbG9nKE1MX0VSUk9SLAogCQkJICAgICAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgpAQCAtOTM4LDYgKzk2NSw3IEBACiB7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihtbnQtPm1udF9zYik7CiAJdW5zaWduZWQgbG9uZyBvcHRzID0gb3NiLT5zX21vdW50X29wdDsKKwl1bnNpZ25lZCBpbnQgbG9jYWxfYWxsb2NfbWVnczsKIAogCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfSEJfTE9DQUwpCiAJCXNlcV9wcmludGYocywgIixfbmV0ZGV2LGhlYXJ0YmVhdD1sb2NhbCIpOwpAQCAtOTcwLDggKzk5OCw5IEBACiAJCXNlcV9wcmludGYocywgIixjb21taXQ9JXUiLAogCQkJICAgKHVuc2lnbmVkKSAob3NiLT5vc2JfY29tbWl0X2ludGVydmFsIC8gSFopKTsKIAotCWlmIChvc2ItPmxvY2FsX2FsbG9jX3NpemUgIT0gT0NGUzJfREVGQVVMVF9MT0NBTF9BTExPQ19TSVpFKQotCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxhbGxvYz0lZCIsIG9zYi0+bG9jYWxfYWxsb2Nfc2l6ZSk7CisJbG9jYWxfYWxsb2NfbWVncyA9IG9zYi0+bG9jYWxfYWxsb2NfYml0cyA+PiAoMjAgLSBvc2ItPnNfY2x1c3RlcnNpemVfYml0cyk7CisJaWYgKGxvY2FsX2FsbG9jX21lZ3MgIT0gT0NGUzJfREVGQVVMVF9MT0NBTF9BTExPQ19TSVpFKQorCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxhbGxvYz0lZCIsIGxvY2FsX2FsbG9jX21lZ3MpOwogCiAJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9MT0NBTEZMT0NLUykKIAkJc2VxX3ByaW50ZihzLCAiLGxvY2FsZmxvY2tzLCIpOwpAQCAtOTgwLDYgKzEwMDksMTQgQEAKIAkJc2VxX3ByaW50ZihzLCAiLGNsdXN0ZXJfc3RhY2s9JS4qcyIsIE9DRlMyX1NUQUNLX0xBQkVMX0xFTiwKIAkJCSAgIG9zYi0+b3NiX2NsdXN0ZXJfc3RhY2spOwogCisJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUikKKwkJc2VxX3ByaW50ZihzLCAiLG5vdXNlcl94YXR0ciIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiLHVzZXJfeGF0dHIiKTsKKworCWlmIChvcHRzICYgT0NGUzJfTU9VTlRfSU5PREU2NCkKKwkJc2VxX3ByaW50ZihzLCAiLGlub2RlNjQiKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTMyLDYgKzExNjksNyBAQAogCW9pLT5pcF9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAogCWluaXRfcndzZW0oJm9pLT5pcF9hbGxvY19zZW0pOworCWluaXRfcndzZW0oJm9pLT5pcF94YXR0cl9zZW0pOwogCW11dGV4X2luaXQoJm9pLT5pcF9pb19tdXRleCk7CiAKIAlvaS0+aXBfYmxrbm8gPSAwVUxMOwpAQCAtMTM3NSw2ICsxNDEzLDcgQEAKIAlzYi0+c19mc19pbmZvID0gb3NiOwogCXNiLT5zX29wID0gJm9jZnMyX3NvcHM7CiAJc2ItPnNfZXhwb3J0X29wID0gJm9jZnMyX2V4cG9ydF9vcHM7CisJc2ItPnNfeGF0dHIgPSBvY2ZzMl94YXR0cl9oYW5kbGVyczsKIAlzYi0+c190aW1lX2dyYW4gPSAxOwogCXNiLT5zX2ZsYWdzIHw9IE1TX05PQVRJTUU7CiAJLyogdGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBPX0xBUkdFRklMRSAqLwpAQCAtMTQyMSw4ICsxNDYwLDEyIEBACiAKIAlvc2ItPnNsb3RfbnVtID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCisJb3NiLT5zX3hhdHRyX2lubGluZV9zaXplID0gbGUxNl90b19jcHUoCisJCQkJCWRpLT5pZDIuaV9zdXBlci5zX3hhdHRyX2lubGluZV9zaXplKTsKKwogCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9VTlVTRUQ7CiAJb3NiLT5sb2NhbF9hbGxvY19iaCA9IE5VTEw7CisJSU5JVF9ERUxBWUVEX1dPUksoJm9zYi0+bGFfZW5hYmxlX3dxLCBvY2ZzMl9sYV9lbmFibGVfd29ya2VyKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9zYi0+b3NiX21vdW50X2V2ZW50KTsKIApAQCAtMTU2OCw2ICsxNjExLDcgQEAKIAlvc2ItPmZpcnN0X2NsdXN0ZXJfZ3JvdXBfYmxrbm8gPQogCQlsZTY0X3RvX2NwdShkaS0+aWQyLmlfc3VwZXIuc19maXJzdF9jbHVzdGVyX2dyb3VwKTsKIAlvc2ItPmZzX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShkaS0+aV9mc19nZW5lcmF0aW9uKTsKKwlvc2ItPnV1aWRfaGFzaCA9IGxlMzJfdG9fY3B1KGRpLT5pZDIuaV9zdXBlci5zX3V1aWRfaGFzaCk7CiAJbWxvZygwLCAidm9sX2xhYmVsOiAlc1xuIiwgb3NiLT52b2xfbGFiZWwpOwogCW1sb2coMCwgInV1aWQ6ICVzXG4iLCBvc2ItPnV1aWRfc3RyKTsKIAltbG9nKDAsICJyb290X2Jsa25vPSVsbHUsIHN5c3RlbV9kaXJfYmxrbm89JWxsdVxuIiwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N5bWxpbmsuYyBiL2ZzL29jZnMyL3N5bWxpbmsuYwppbmRleCBiYTlkYmI1Li5jYmQwM2RmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zeW1saW5rLmMKKysrIGIvZnMvb2NmczIvc3ltbGluay5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCiAjaW5jbHVkZSAic3ltbGluay5oIgorI2luY2x1ZGUgInhhdHRyLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCkBAIC04MywxMSArODQsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKLQkJCQkgIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCQkgIGJoLAotCQkJCSAgT0NGUzJfQkhfQ0FDSEVELAotCQkJCSAgaW5vZGUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJbGluayA9IEVSUl9QVFIoc3RhdHVzKTsKQEAgLTE1Nyw4ICsxNTQsNyBAQAogCQlrdW5tYXAocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9Ci0JaWYgKGJoKQotCQlicmVsc2UoYmgpOworCWJyZWxzZShiaCk7CiAKIAlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOwogfQpAQCAtMTY4LDEwICsxNjQsMTggQEAKIAkuZm9sbG93X2xpbmsJPSBvY2ZzMl9mb2xsb3dfbGluaywKIAkuZ2V0YXR0cgk9IG9jZnMyX2dldGF0dHIsCiAJLnNldGF0dHIJPSBvY2ZzMl9zZXRhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gb2NmczJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb2NmczJfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rCT0gb2NmczJfcmVhZGxpbmssCiAJLmZvbGxvd19saW5rCT0gb2NmczJfZm9sbG93X2xpbmssCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAogCS5zZXRhdHRyCT0gb2NmczJfc2V0YXR0ciwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IG9jZnMyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3VwdG9kYXRlLmMgYi9mcy9vY2ZzMi91cHRvZGF0ZS5jCmluZGV4IDRkYTg4NTEuLjE4N2I5OWYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3VwdG9kYXRlLmMKKysrIGIvZnMvb2NmczIvdXB0b2RhdGUuYwpAQCAtNTMsNyArNTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLSNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpZm5kZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKKyMgaW5jbHVkZSA8bGludXgvamJkMi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvamJkLmg+CisjZW5kaWYKIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX1VQVE9EQVRFCiAKQEAgLTUxMSwxNCArNTE1LDEwIEBACiAJY2ktPmNpX251bV9jYWNoZWQtLTsKIH0KIAotLyogQ2FsbGVkIHdoZW4gd2UgcmVtb3ZlIGEgY2h1bmsgb2YgbWV0YWRhdGEgZnJvbSBhbiBpbm9kZS4gV2UgZG9uJ3QKLSAqIGJvdGhlciByZXZlcnRpbmcgdGhpbmdzIHRvIGFuIGlubGluZWQgYXJyYXkgaW4gdGhlIGNhc2Ugb2YgYSByZW1vdmUKLSAqIHdoaWNoIG1vdmVzIHVzIGJhY2sgdW5kZXIgdGhlIGxpbWl0LiAqLwotdm9pZCBvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIHZvaWQgb2NmczJfcmVtb3ZlX2Jsb2NrX2Zyb21fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzZWN0b3JfdCBibG9jaykKIHsKIAlpbnQgaW5kZXg7Ci0Jc2VjdG9yX3QgYmxvY2sgPSBiaC0+Yl9ibG9ja25yOwogCXN0cnVjdCBvY2ZzMl9tZXRhX2NhY2hlX2l0ZW0gKml0ZW0gPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9jYWNoaW5nX2luZm8gKmNpID0gJm9pLT5pcF9tZXRhZGF0YV9jYWNoZTsKQEAgLTU0NCw2ICs1NDQsMzAgQEAKIAkJa21lbV9jYWNoZV9mcmVlKG9jZnMyX3VwdG9kYXRlX2NhY2hlcCwgaXRlbSk7CiB9CiAKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSByZW1vdmUgYSBjaHVuayBvZiBtZXRhZGF0YSBmcm9tIGFuIGlub2RlLiBXZSBkb24ndAorICogYm90aGVyIHJldmVydGluZyB0aGluZ3MgdG8gYW4gaW5saW5lZCBhcnJheSBpbiB0aGUgY2FzZSBvZiBhIHJlbW92ZQorICogd2hpY2ggbW92ZXMgdXMgYmFjayB1bmRlciB0aGUgbGltaXQuCisgKi8KK3ZvaWQgb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzZWN0b3JfdCBibG9jayA9IGJoLT5iX2Jsb2NrbnI7CisKKwlvY2ZzMl9yZW1vdmVfYmxvY2tfZnJvbV9jYWNoZShpbm9kZSwgYmxvY2spOworfQorCisvKiBDYWxsZWQgd2hlbiB3ZSByZW1vdmUgeGF0dHIgY2x1c3RlcnMgZnJvbSBhbiBpbm9kZS4gKi8KK3ZvaWQgb2NmczJfcmVtb3ZlX3hhdHRyX2NsdXN0ZXJzX2Zyb21fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHNlY3Rvcl90IGJsb2NrLAorCQkJCQkgICAgdTMyIGNfbGVuKQoreworCXVuc2lnbmVkIGludCBpLCBiX2xlbiA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSkgKiBjX2xlbjsKKworCWZvciAoaSA9IDA7IGkgPCBiX2xlbjsgaSsrLCBibG9jaysrKQorCQlvY2ZzMl9yZW1vdmVfYmxvY2tfZnJvbV9jYWNoZShpbm9kZSwgYmxvY2spOworfQorCiBpbnQgX19pbml0IGluaXRfb2NmczJfdXB0b2RhdGVfY2FjaGUodm9pZCkKIHsKIAlvY2ZzMl91cHRvZGF0ZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgib2NmczJfdXB0b2RhdGUiLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvdXB0b2RhdGUuaCBiL2ZzL29jZnMyL3VwdG9kYXRlLmgKaW5kZXggMmU3MzIwNi4uNTMxYjRiMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvdXB0b2RhdGUuaAorKysgYi9mcy9vY2ZzMi91cHRvZGF0ZS5oCkBAIC00MCw2ICs0MCw5IEBACiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiB2b2lkIG9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBvY2ZzMl9yZW1vdmVfeGF0dHJfY2x1c3RlcnNfZnJvbV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc2VjdG9yX3QgYmxvY2ssCisJCQkJCSAgICB1MzIgY19sZW4pOwogaW50IG9jZnMyX2J1ZmZlcl9yZWFkX2FoZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3hhdHRyLmMgYi9mcy9vY2ZzMi94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmM0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9vY2ZzMi94YXR0ci5jCkBAIC0wLDAgKzEsNDgzMiBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIHhhdHRyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDUkVESVRTOgorICogTG90cyBvZiBjb2RlIGluIHRoaXMgZmlsZSBpcyB0YWtlbiBmcm9tIGV4dDMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfWEFUVFIKKyNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KKworI2luY2x1ZGUgIm9jZnMyLmgiCisjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJkbG1nbHVlLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInN5bWxpbmsuaCIKKyNpbmNsdWRlICJzeXNmaWxlLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJqb3VybmFsLmgiCisjaW5jbHVkZSAib2NmczJfZnMuaCIKKyNpbmNsdWRlICJzdWJhbGxvYy5oIgorI2luY2x1ZGUgInVwdG9kYXRlLmgiCisjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKKyNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisKKworc3RydWN0IG9jZnMyX3hhdHRyX2RlZl92YWx1ZV9yb290IHsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdAl4djsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYwkJZXI7Cit9OworCitzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVRdOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworfTsKKworI2RlZmluZSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkUJKHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZGVmX3ZhbHVlX3Jvb3QpKQorI2RlZmluZSBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRQk4MAorCitzdGF0aWMgc3RydWN0IG9jZnMyX3hhdHRyX2RlZl92YWx1ZV9yb290IGRlZl94diA9IHsKKwkueHYueHJfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYoMSksCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb2NmczJfeGF0dHJfaGFuZGxlcnNbXSA9IHsKKwkmb2NmczJfeGF0dHJfdXNlcl9oYW5kbGVyLAorCSZvY2ZzMl94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvY2ZzMl94YXR0cl9oYW5kbGVyX21hcFtdID0geworCVtPQ0ZTMl9YQVRUUl9JTkRFWF9VU0VSXQk9ICZvY2ZzMl94YXR0cl91c2VyX2hhbmRsZXIsCisJW09DRlMyX1hBVFRSX0lOREVYX1RSVVNURURdCT0gJm9jZnMyX3hhdHRyX3RydXN0ZWRfaGFuZGxlciwKK307CisKK3N0cnVjdCBvY2ZzMl94YXR0cl9pbmZvIHsKKwlpbnQgbmFtZV9pbmRleDsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHZvaWQgKnZhbHVlOworCXNpemVfdCB2YWx1ZV9sZW47Cit9OworCitzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2JoOworCS8qCisJICogeGF0dHJfYmggcG9pbnQgdG8gdGhlIGJsb2NrIGJ1ZmZlciBoZWFkIHdoaWNoIGhhcyBleHRlbmRlZCBhdHRyaWJ1dGUKKwkgKiB3aGVuIGV4dGVuZGVkIGF0dHJpYnV0ZSBpbiBpbm9kZSwgeGF0dHJfYmggaXMgZXF1YWwgdG8gaW5vZGVfYmguCisJICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICp4YXR0cl9iaDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCBidWNrZXQ7CisJdm9pZCAqYmFzZTsKKwl2b2lkICplbmQ7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpoZXJlOworCWludCBub3RfZm91bmQ7Cit9OworCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoLAorCQkJCQkgICAgIGludCBpbmRleCwKKwkJCQkJICAgICBpbnQgKmJsb2NrX29mZiwKKwkJCQkJICAgICBpbnQgKm5ld19vZmZzZXQpOworCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2luZGV4X2Jsb2NrX2ZpbmQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAorCQkJCQlpbnQgbmFtZV9pbmRleCwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpOworCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3RyZWVfbGlzdF9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4dCwKKwkJCQkJY2hhciAqYnVmZmVyLAorCQkJCQlzaXplX3QgYnVmZmVyX3NpemUpOworCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKTsKKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpOworCitzdGF0aWMgaW50IG9jZnMyX2RlbGV0ZV94YXR0cl9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYmgpOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm9jZnMyX3hhdHRyX3ByZWZpeChpbnQgbmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CisKKwlpZiAobmFtZV9pbmRleCA+IDAgJiYgbmFtZV9pbmRleCA8IE9DRlMyX1hBVFRSX01BWCkKKwkJaGFuZGxlciA9IG9jZnMyX3hhdHRyX2hhbmRsZXJfbWFwW25hbWVfaW5kZXhdOworCisJcmV0dXJuIGhhbmRsZXIgPyBoYW5kbGVyLT5wcmVmaXggOiBOVUxMOworfQorCitzdGF0aWMgdTMyIG9jZnMyX3hhdHRyX25hbWVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBpbnQgbmFtZV9sZW4pCit7CisJLyogR2V0IGhhc2ggdmFsdWUgb2YgdXVpZCBmcm9tIHN1cGVyIGJsb2NrICovCisJdTMyIGhhc2ggPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnV1aWRfaGFzaDsKKwlpbnQgaTsKKworCS8qIGhhc2ggZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykgeworCQloYXNoID0gKGhhc2ggPDwgT0NGUzJfSEFTSF9TSElGVCkgXgorCQkgICAgICAgKGhhc2ggPj4gKDgqc2l6ZW9mKGhhc2gpIC0gT0NGUzJfSEFTSF9TSElGVCkpIF4KKwkJICAgICAgICpuYW1lKys7CisJfQorCisJcmV0dXJuIGhhc2g7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9oYXNoX2VudHJ5KCkKKyAqCisgKiBDb21wdXRlIHRoZSBoYXNoIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfaGFzaF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmVudHJ5KQoreworCXUzMiBoYXNoID0gMDsKKwljaGFyICpuYW1lID0gKGNoYXIgKiloZWFkZXIgKyBsZTE2X3RvX2NwdShlbnRyeS0+eGVfbmFtZV9vZmZzZXQpOworCisJaGFzaCA9IG9jZnMyX3hhdHRyX25hbWVfaGFzaChpbm9kZSwgbmFtZSwgZW50cnktPnhlX25hbWVfbGVuKTsKKwllbnRyeS0+eGVfbmFtZV9oYXNoID0gY3B1X3RvX2xlMzIoaGFzaCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhhdHRyX2JoLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2KQoreworCWludCBzdGF0dXMgPSAwOworCWludCByZXN0YXJ0X2Z1bmMgPSAwOworCWludCBjcmVkaXRzID0gMDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCWVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkIHdoeTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwl1MzIgcHJldl9jbHVzdGVycywgbG9naWNhbF9zdGFydCA9IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycyk7CisJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OworCisJbWxvZygwLCAiKGNsdXN0ZXJzX3RvX2FkZCBmb3IgeGF0dHI9ICV1KVxuIiwgY2x1c3RlcnNfdG9fYWRkKTsKKworCW9jZnMyX2luaXRfeGF0dHJfdmFsdWVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgeGF0dHJfYmgsIHh2KTsKKworcmVzdGFydF9hbGw6CisKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgY2x1c3RlcnNfdG9fYWRkLCAwLAorCQkJCSAgICAgICAmZGF0YV9hYywgJm1ldGFfYWMpOworCWlmIChzdGF0dXMpIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsIGV0LmV0X3Jvb3RfZWwsCisJCQkJCSAgICBjbHVzdGVyc190b19hZGQpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworcmVzdGFydGVkX3RyYW5zYWN0aW9uOgorCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhhdHRyX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcHJldl9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycyk7CisJc3RhdHVzID0gb2NmczJfYWRkX2NsdXN0ZXJzX2luX2J0cmVlKG9zYiwKKwkJCQkJICAgICBpbm9kZSwKKwkJCQkJICAgICAmbG9naWNhbF9zdGFydCwKKwkJCQkJICAgICBjbHVzdGVyc190b19hZGQsCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICAmZXQsCisJCQkJCSAgICAgaGFuZGxlLAorCQkJCQkgICAgIGRhdGFfYWMsCisJCQkJCSAgICAgbWV0YV9hYywKKwkJCQkJICAgICAmd2h5KTsKKwlpZiAoKHN0YXR1cyA8IDApICYmIChzdGF0dXMgIT0gLUVBR0FJTikpIHsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4YXR0cl9iaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCWNsdXN0ZXJzX3RvX2FkZCAtPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpIC0gcHJldl9jbHVzdGVyczsKKworCWlmICh3aHkgIT0gUkVTVEFSVF9OT05FICYmIGNsdXN0ZXJzX3RvX2FkZCkgeworCQlpZiAod2h5ID09IFJFU1RBUlRfTUVUQSkgeworCQkJbWxvZygwLCAicmVzdGFydGluZyBmdW5jdGlvbi5cbiIpOworCQkJcmVzdGFydF9mdW5jID0gMTsKKwkJfSBlbHNlIHsKKwkJCUJVR19PTih3aHkgIT0gUkVTVEFSVF9UUkFOUyk7CisKKwkJCW1sb2coMCwgInJlc3RhcnRpbmcgdHJhbnNhY3Rpb24uXG4iKTsKKwkJCS8qIFRPRE86IFRoaXMgY2FuIGJlIG1vcmUgaW50ZWxsaWdlbnQuICovCisJCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLAorCQkJCQkJCSAgICBldC5ldF9yb290X2VsLAorCQkJCQkJCSAgICBjbHVzdGVyc190b19hZGQpOworCQkJc3RhdHVzID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJCS8qIGhhbmRsZSBzdGlsbCBoYXMgdG8gYmUgY29tbWl0dGVkIGF0CisJCQkJICogdGhpcyBwb2ludC4gKi8KKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIGxlYXZlOworCQkJfQorCQkJZ290byByZXN0YXJ0ZWRfdHJhbnNhY3Rpb247CisJCX0KKwl9CisKK2xlYXZlOgorCWlmIChoYW5kbGUpIHsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwl9CisJaWYgKGRhdGFfYWMpIHsKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOworCQlkYXRhX2FjID0gTlVMTDsKKwl9CisJaWYgKG1ldGFfYWMpIHsKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCQltZXRhX2FjID0gTlVMTDsKKwl9CisJaWYgKCghc3RhdHVzKSAmJiByZXN0YXJ0X2Z1bmMpIHsKKwkJcmVzdGFydF9mdW5jID0gMDsKKwkJZ290byByZXN0YXJ0X2FsbDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fb2NmczJfcmVtb3ZlX3hhdHRyX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diwKKwkJCQkgICAgICB1MzIgY3BvcywgdTMyIHBoeXNfY3BvcywgdTMyIGxlbiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0OworCXU2NCBwaHlzX2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwaHlzX2Nwb3MpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisKKwlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHJvb3RfYmgsIHh2KTsKKworCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgJmV0LCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7CisJCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgJmV0LCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwkJCQkgIGRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJbGUzMl9hZGRfY3B1KCZ4di0+eHJfY2x1c3RlcnMsIC1sZW4pOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHJvb3RfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgcGh5c19ibGtubywgbGVuKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3Nocmlua19zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgdTMyIG9sZF9jbHVzdGVycywKKwkJCQkgICB1MzIgbmV3X2NsdXN0ZXJzLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYpCit7CisJaW50IHJldCA9IDA7CisJdTMyIHRydW5jX2xlbiwgY3BvcywgcGh5c19jcG9zLCBhbGxvY19zaXplOworCXU2NCBibG9jazsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOworCisJaWYgKG9sZF9jbHVzdGVycyA8PSBuZXdfY2x1c3RlcnMpCisJCXJldHVybiAwOworCisJY3BvcyA9IG5ld19jbHVzdGVyczsKKwl0cnVuY19sZW4gPSBvbGRfY2x1c3RlcnMgLSBuZXdfY2x1c3RlcnM7CisJd2hpbGUgKHRydW5jX2xlbikgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwaHlzX2Nwb3MsCisJCQkJCSAgICAgICAmYWxsb2Nfc2l6ZSwgJnh2LT54cl9saXN0KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoYWxsb2Nfc2l6ZSA+IHRydW5jX2xlbikKKwkJCWFsbG9jX3NpemUgPSB0cnVuY19sZW47CisKKwkJcmV0ID0gX19vY2ZzMl9yZW1vdmVfeGF0dHJfcmFuZ2UoaW5vZGUsIHJvb3RfYmgsIHh2LCBjcG9zLAorCQkJCQkJIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZSwKKwkJCQkJCSAmZGVhbGxvYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYmxvY2sgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7CisJCW9jZnMyX3JlbW92ZV94YXR0cl9jbHVzdGVyc19mcm9tX2NhY2hlKGlub2RlLCBibG9jaywKKwkJCQkJCSAgICAgICBhbGxvY19zaXplKTsKKwkJY3BvcyArPSBhbGxvY19zaXplOworCQl0cnVuY19sZW4gLT0gYWxsb2Nfc2l6ZTsKKwl9CisKK291dDoKKwlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmZGVhbGxvYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diwKKwkJCQkgICAgICBpbnQgbGVuKQoreworCWludCByZXQ7CisJdTMyIG5ld19jbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgbGVuKTsKKwl1MzIgb2xkX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKTsKKworCWlmIChuZXdfY2x1c3RlcnMgPT0gb2xkX2NsdXN0ZXJzKQorCQlyZXR1cm4gMDsKKworCWlmIChuZXdfY2x1c3RlcnMgPiBvbGRfY2x1c3RlcnMpCisJCXJldCA9IG9jZnMyX3hhdHRyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLAorCQkJCQkJICAgIG5ld19jbHVzdGVycyAtIG9sZF9jbHVzdGVycywKKwkJCQkJCSAgICByb290X2JoLCB4dik7CisJZWxzZQorCQlyZXQgPSBvY2ZzMl94YXR0cl9zaHJpbmtfc2l6ZShpbm9kZSwKKwkJCQkJICAgICAgb2xkX2NsdXN0ZXJzLCBuZXdfY2x1c3RlcnMsCisJCQkJCSAgICAgIHJvb3RfYmgsIHh2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfbGlzdF9lbnRyeShjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJCSAgc2l6ZV90ICpyZXN1bHQsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbikKK3sKKwljaGFyICpwID0gYnVmZmVyICsgKnJlc3VsdDsKKwlpbnQgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworCWludCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisJKnJlc3VsdCArPSB0b3RhbF9sZW47CisKKwkvKiB3ZSBhcmUganVzdCBsb29raW5nIGZvciBob3cgYmlnIG91ciBidWZmZXIgbmVlZHMgdG8gYmUgKi8KKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJaWYgKCpyZXN1bHQgPiBzaXplKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCW1lbWNweShwLCBwcmVmaXgsIHByZWZpeF9sZW4pOworCW1lbWNweShwICsgcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCXBbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9saXN0X2VudHJpZXMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkJCSAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzaXplX3QgcmVzdWx0ID0gMDsKKwlpbnQgaSwgdHlwZSwgcmV0OworCWNvbnN0IGNoYXIgKnByZWZpeCwgKm5hbWU7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGxlMTZfdG9fY3B1KGhlYWRlci0+eGhfY291bnQpOyBpKyspIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeSA9ICZoZWFkZXItPnhoX2VudHJpZXNbaV07CisJCXR5cGUgPSBvY2ZzMl94YXR0cl9nZXRfdHlwZShlbnRyeSk7CisJCXByZWZpeCA9IG9jZnMyX3hhdHRyX3ByZWZpeCh0eXBlKTsKKworCQlpZiAocHJlZml4KSB7CisJCQluYW1lID0gKGNvbnN0IGNoYXIgKiloZWFkZXIgKworCQkJCWxlMTZfdG9fY3B1KGVudHJ5LT54ZV9uYW1lX29mZnNldCk7CisKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2xpc3RfZW50cnkoYnVmZmVyLCBidWZmZXJfc2l6ZSwKKwkJCQkJCSAgICAgJnJlc3VsdCwgcHJlZml4LCBuYW1lLAorCQkJCQkJICAgICBlbnRyeS0+eGVfbmFtZV9sZW4pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9pYm9keV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCQkgIGNoYXIgKmJ1ZmZlciwKKwkJCQkgIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCWludCByZXQgPSAwOworCisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpCisJCXJldHVybiByZXQ7CisKKwloZWFkZXIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQorCQkgKCh2b2lkICopZGkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkgbGUxNl90b19jcHUoZGktPmlfeGF0dHJfaW5saW5lX3NpemUpKTsKKworCXJldCA9IG9jZnMyX3hhdHRyX2xpc3RfZW50cmllcyhpbm9kZSwgaGVhZGVyLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYmxvY2tfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJICBjaGFyICpidWZmZXIsCisJCQkJICBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpibGtfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRpLT5pX3hhdHRyX2xvYykKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksICZibGtfYmgpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLypWZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiB4YXR0ciBibG9jayovCisJaWYgKG1lbWNtcCgodm9pZCAqKWJsa19iaC0+Yl9kYXRhLCBPQ0ZTMl9YQVRUUl9CTE9DS19TSUdOQVRVUkUsCisJCSAgIHN0cmxlbihPQ0ZTMl9YQVRUUl9CTE9DS19TSUdOQVRVUkUpKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7CisKKwlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyID0gJnhiLT54Yl9hdHRycy54Yl9oZWFkZXI7CisJCXJldCA9IG9jZnMyX3hhdHRyX2xpc3RfZW50cmllcyhpbm9kZSwgaGVhZGVyLAorCQkJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqeHQgPSAmeGItPnhiX2F0dHJzLnhiX3Jvb3Q7CisJCXJldCA9IG9jZnMyX3hhdHRyX3RyZWVfbGlzdF9pbmRleF9ibG9jayhpbm9kZSwgeHQsCisJCQkJCQkgICBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwl9CitjbGVhbnVwOgorCWJyZWxzZShibGtfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBvY2ZzMl9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJY2hhciAqYnVmZmVyLAorCQkJc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IDAsIGlfcmV0ID0gMCwgYl9yZXQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGRlbnRyeS0+ZF9zYikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIShvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSEFTX1hBVFRSX0ZMKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9jZnMyX2lub2RlX2xvY2soZGVudHJ5LT5kX2lub2RlLCAmZGlfYmgsIDApOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRvd25fcmVhZCgmb2ktPmlwX3hhdHRyX3NlbSk7CisJaV9yZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9saXN0KGRlbnRyeS0+ZF9pbm9kZSwgZGksIGJ1ZmZlciwgc2l6ZSk7CisJaWYgKGlfcmV0IDwgMCkKKwkJYl9yZXQgPSAwOworCWVsc2UgeworCQlpZiAoYnVmZmVyKSB7CisJCQlidWZmZXIgKz0gaV9yZXQ7CisJCQlzaXplIC09IGlfcmV0OworCQl9CisJCWJfcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfbGlzdChkZW50cnktPmRfaW5vZGUsIGRpLAorCQkJCQkgICAgICAgYnVmZmVyLCBzaXplKTsKKwkJaWYgKGJfcmV0IDwgMCkKKwkJCWlfcmV0ID0gMDsKKwl9CisJdXBfcmVhZCgmb2ktPmlwX3hhdHRyX3NlbSk7CisJb2NmczJfaW5vZGVfdW5sb2NrKGRlbnRyeS0+ZF9pbm9kZSwgMCk7CisKKwlicmVsc2UoZGlfYmgpOworCisJcmV0dXJuIGlfcmV0ICsgYl9yZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZmluZF9lbnRyeShpbnQgbmFtZV9pbmRleCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmVudHJ5OworCXNpemVfdCBuYW1lX2xlbjsKKwlpbnQgaSwgY21wID0gMTsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJZW50cnkgPSB4cy0+aGVyZTsKKwlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoeHMtPmhlYWRlci0+eGhfY291bnQpOyBpKyspIHsKKwkJY21wID0gbmFtZV9pbmRleCAtIG9jZnMyX3hhdHRyX2dldF90eXBlKGVudHJ5KTsKKwkJaWYgKCFjbXApCisJCQljbXAgPSBuYW1lX2xlbiAtIGVudHJ5LT54ZV9uYW1lX2xlbjsKKwkJaWYgKCFjbXApCisJCQljbXAgPSBtZW1jbXAobmFtZSwgKHhzLT5iYXNlICsKKwkJCQkgICAgIGxlMTZfdG9fY3B1KGVudHJ5LT54ZV9uYW1lX29mZnNldCkpLAorCQkJCSAgICAgbmFtZV9sZW4pOworCQlpZiAoY21wID09IDApCisJCQlicmVhazsKKwkJZW50cnkgKz0gMTsKKwl9CisJeHMtPmhlcmUgPSBlbnRyeTsKKworCXJldHVybiBjbXAgPyAtRU5PREFUQSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZ2V0X3ZhbHVlX291dHNpZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diwKKwkJCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCQkJIHNpemVfdCBsZW4pCit7CisJdTMyIGNwb3MsIHBfY2x1c3RlciwgbnVtX2NsdXN0ZXJzLCBicGMsIGNsdXN0ZXJzOworCXU2NCBibGtubzsKKwlpbnQgaSwgcmV0ID0gMDsKKwlzaXplX3QgY3BsZW4sIGJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJZWwgPSAmeHYtPnhyX2xpc3Q7CisJY2x1c3RlcnMgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCWJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisJYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJY3BvcyA9IDA7CisJd2hpbGUgKGNwb3MgPCBjbHVzdGVycykgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwX2NsdXN0ZXIsCisJCQkJCSAgICAgICAmbnVtX2NsdXN0ZXJzLCBlbCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBfY2x1c3Rlcik7CisJCS8qIENvcHkgb2NmczJfeGF0dHJfdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9jbHVzdGVycyAqIGJwYzsgaSsrLCBibGtubysrKSB7CisJCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWNwbGVuID0gbGVuID49IGJsb2Nrc2l6ZSA/IGJsb2Nrc2l6ZSA6IGxlbjsKKwkJCW1lbWNweShidWZmZXIsIGJoLT5iX2RhdGEsIGNwbGVuKTsKKwkJCWxlbiAtPSBjcGxlbjsKKwkJCWJ1ZmZlciArPSBjcGxlbjsKKworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQljcG9zICs9IG51bV9jbHVzdGVyczsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9pYm9keV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgaW50IG5hbWVfaW5kZXgsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGJ1ZmZlcl9zaXplLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2OworCXNpemVfdCBzaXplOworCWludCByZXQgPSAwOworCisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpCisJCXJldHVybiAtRU5PREFUQTsKKworCXhzLT5lbmQgPSAodm9pZCAqKWRpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXhzLT5oZWFkZXIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQorCQkJKHhzLT5lbmQgLSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSkpOworCXhzLT5iYXNlID0gKHZvaWQgKil4cy0+aGVhZGVyOworCXhzLT5oZXJlID0geHMtPmhlYWRlci0+eGhfZW50cmllczsKKworCXJldCA9IG9jZnMyX3hhdHRyX2ZpbmRfZW50cnkobmFtZV9pbmRleCwgbmFtZSwgeHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJc2l6ZSA9IGxlNjRfdG9fY3B1KHhzLT5oZXJlLT54ZV92YWx1ZV9zaXplKTsKKwlpZiAoYnVmZmVyKSB7CisJCWlmIChzaXplID4gYnVmZmVyX3NpemUpCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhzLT5oZXJlKSkgeworCQkJbWVtY3B5KGJ1ZmZlciwgKHZvaWQgKil4cy0+YmFzZSArCisJCQkgICAgICAgbGUxNl90b19jcHUoeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0KSArCisJCQkgICAgICAgT0NGUzJfWEFUVFJfU0laRSh4cy0+aGVyZS0+eGVfbmFtZV9sZW4pLCBzaXplKTsKKwkJfSBlbHNlIHsKKwkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCQkJKHhzLT5iYXNlICsgbGUxNl90b19jcHUoCisJCQkJIHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCkgKworCQkJCU9DRlMyX1hBVFRSX1NJWkUoeHMtPmhlcmUtPnhlX25hbWVfbGVuKSk7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeHYsCisJCQkJCQkJICAgIGJ1ZmZlciwgc2l6ZSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYmxvY2tfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIGludCBuYW1lX2luZGV4LAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSB2b2lkICpidWZmZXIsCisJCQkJIHNpemVfdCBidWZmZXJfc2l6ZSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxrX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiOworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4djsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0ID0gLUVOT0RBVEEsIG5hbWVfb2Zmc2V0LCBuYW1lX2xlbiwgYmxvY2tfb2ZmLCBpOworCisJaWYgKCFkaS0+aV94YXR0cl9sb2MpCisJCXJldHVybiByZXQ7CisKKwltZW1zZXQoJnhzLT5idWNrZXQsIDAsIHNpemVvZih4cy0+YnVja2V0KSk7CisKKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShkaS0+aV94YXR0cl9sb2MpLCAmYmxrX2JoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCS8qVmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgeGF0dHIgYmxvY2sqLworCWlmIChtZW1jbXAoKHZvaWQgKilibGtfYmgtPmJfZGF0YSwgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFLAorCQkgICBzdHJsZW4oT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXhzLT54YXR0cl9iaCA9IGJsa19iaDsKKwl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKKworCWlmICghKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgeworCQl4cy0+aGVhZGVyID0gJnhiLT54Yl9hdHRycy54Yl9oZWFkZXI7CisJCXhzLT5iYXNlID0gKHZvaWQgKil4cy0+aGVhZGVyOworCQl4cy0+ZW5kID0gKHZvaWQgKikoYmxrX2JoLT5iX2RhdGEpICsgYmxrX2JoLT5iX3NpemU7CisJCXhzLT5oZXJlID0geHMtPmhlYWRlci0+eGhfZW50cmllczsKKworCQlyZXQgPSBvY2ZzMl94YXR0cl9maW5kX2VudHJ5KG5hbWVfaW5kZXgsIG5hbWUsIHhzKTsKKwl9IGVsc2UKKwkJcmV0ID0gb2NmczJfeGF0dHJfaW5kZXhfYmxvY2tfZmluZChpbm9kZSwgYmxrX2JoLAorCQkJCQkJICAgbmFtZV9pbmRleCwKKwkJCQkJCSAgIG5hbWUsIHhzKTsKKworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKwlzaXplID0gbGU2NF90b19jcHUoeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUpOworCWlmIChidWZmZXIpIHsKKwkJcmV0ID0gLUVSQU5HRTsKKwkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQluYW1lX29mZnNldCA9IGxlMTZfdG9fY3B1KHhzLT5oZXJlLT54ZV9uYW1lX29mZnNldCk7CisJCW5hbWVfbGVuID0gT0NGUzJfWEFUVFJfU0laRSh4cy0+aGVyZS0+eGVfbmFtZV9sZW4pOworCQlpID0geHMtPmhlcmUgLSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisJCWlmIChsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkgeworCQkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF9uYW1lX3ZhbHVlKGlub2RlLAorCQkJCQkJCQl4cy0+YnVja2V0LnhoLAorCQkJCQkJCQlpLAorCQkJCQkJCQkmYmxvY2tfb2ZmLAorCQkJCQkJCQkmbmFtZV9vZmZzZXQpOworCQkJeHMtPmJhc2UgPSB4cy0+YnVja2V0LmJoc1tibG9ja19vZmZdLT5iX2RhdGE7CisJCX0KKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhzLT5oZXJlKSkgeworCQkJbWVtY3B5KGJ1ZmZlciwgKHZvaWQgKil4cy0+YmFzZSArCisJCQkgICAgICAgbmFtZV9vZmZzZXQgKyBuYW1lX2xlbiwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQl4diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkJCSh4cy0+YmFzZSArIG5hbWVfb2Zmc2V0ICsgbmFtZV9sZW4pOworCQkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHh2LAorCQkJCQkJCSAgICBidWZmZXIsIHNpemUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQl9CisJfQorCXJldCA9IHNpemU7CitjbGVhbnVwOgorCWZvciAoaSA9IDA7IGkgPCBPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVQ7IGkrKykKKwkJYnJlbHNlKHhzLT5idWNrZXQuYmhzW2ldKTsKKwltZW1zZXQoJnhzLT5idWNrZXQsIDAsIHNpemVvZih4cy0+YnVja2V0KSk7CisKKwlicmVsc2UoYmxrX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBvY2ZzMl94YXR0cl9nZXQoKQorICoKKyAqIENvcHkgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZC4KKyAqIEJ1ZmZlciBpcyBOVUxMIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgYnVmZmVyIHJlcXVpcmVkLgorICovCitpbnQgb2NmczJfeGF0dHJfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICBpbnQgbmFtZV9pbmRleCwKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICB2b2lkICpidWZmZXIsCisJCSAgICBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4aXMgPSB7CisJCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKKwl9OworCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggeGJzID0geworCQkubm90X2ZvdW5kID0gLUVOT0RBVEEsCisJfTsKKworCWlmICghb2NmczJfc3VwcG9ydHNfeGF0dHIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0hBU19YQVRUUl9GTCkpCisJCXJldCA9IC1FTk9EQVRBOworCisJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgJmRpX2JoLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXhpcy5pbm9kZV9iaCA9IHhicy5pbm9kZV9iaCA9IGRpX2JoOworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJZG93bl9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkgICAgYnVmZmVyX3NpemUsICZ4aXMpOworCWlmIChyZXQgPT0gLUVOT0RBVEEpCisJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2dldChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgYnVmZmVyLAorCQkJCQkgICAgYnVmZmVyX3NpemUsICZ4YnMpOworCXVwX3JlYWQoJm9pLT5pcF94YXR0cl9zZW0pOworCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMCk7CisKKwlicmVsc2UoZGlfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diwKKwkJCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQkJCSAgIGludCB2YWx1ZV9sZW4pCit7CisJaW50IHJldCA9IDAsIGksIGNwX2xlbiwgY3JlZGl0czsKKwl1MTYgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXUzMiBwX2NsdXN0ZXIsIG51bV9jbHVzdGVyczsKKwl1MzIgY3BvcyA9IDAsIGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisJdTMyIGNsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCB2YWx1ZV9sZW4pOworCXU2NCBibGtubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJQlVHX09OKGNsdXN0ZXJzID4gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKSk7CisKKwljcmVkaXRzID0gY2x1c3RlcnMgKiBicGM7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChjcG9zIDwgY2x1c3RlcnMpIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcF9jbHVzdGVyLAorCQkJCQkgICAgICAgJm51bV9jbHVzdGVycywgJnh2LT54cl9saXN0KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisKKwkJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBfY2x1c3Rlcik7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jbHVzdGVycyAqIGJwYzsgaSsrLCBibGtubysrKSB7CisJCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXRfY29tbWl0OworCQkJfQorCisJCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkgICBpbm9kZSwKKwkJCQkJCSAgIGJoLAorCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXRfY29tbWl0OworCQkJfQorCisJCQljcF9sZW4gPSB2YWx1ZV9sZW4gPiBibG9ja3NpemUgPyBibG9ja3NpemUgOiB2YWx1ZV9sZW47CisJCQltZW1jcHkoYmgtPmJfZGF0YSwgdmFsdWUsIGNwX2xlbik7CisJCQl2YWx1ZV9sZW4gLT0gY3BfbGVuOworCQkJdmFsdWUgKz0gY3BfbGVuOworCQkJaWYgKGNwX2xlbiA8IGJsb2Nrc2l6ZSkKKwkJCQltZW1zZXQoYmgtPmJfZGF0YSArIGNwX2xlbiwgMCwKKwkJCQkgICAgICAgYmxvY2tzaXplIC0gY3BfbGVuKTsKKworCQkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiBYWFg6IGRvIHdlIG5lZWQgdG8gZW1wdHkgYWxsIHRoZSBmb2xsb3dpbmcKKwkJCSAqIGJsb2NrcyBpbiB0aGlzIGNsdXN0ZXI/CisJCQkgKi8KKwkJCWlmICghdmFsdWVfbGVuKQorCQkJCWJyZWFrOworCQl9CisJCWNwb3MgKz0gbnVtX2NsdXN0ZXJzOworCX0KK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKwlicmVsc2UoYmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9jbGVhbnVwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJICAgICAgIHNpemVfdCBvZmZzKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CisJdm9pZCAqdmFsID0geHMtPmJhc2UgKyBvZmZzOworCXNpemVfdCBzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKKwkJCQkgICBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPnhhdHRyX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKwkvKiBEZWNyZWFzZSB4YXR0ciBjb3VudCAqLworCWxlMTZfYWRkX2NwdSgmeHMtPmhlYWRlci0+eGhfY291bnQsIC0xKTsKKwkvKiBSZW1vdmUgdGhlIHhhdHRyIGVudHJ5IGFuZCB0cmVlIHJvb3Qgd2hpY2ggaGFzIGFscmVhZHkgYmUgc2V0Ki8KKwltZW1zZXQoKHZvaWQgKil4cy0+aGVyZSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworCW1lbXNldCh2YWwsIDAsIHNpemUpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3VwZGF0ZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCSAgICBzaXplX3Qgb2ZmcykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKChPQ0ZTMl9TQihpbm9kZS0+aV9zYikpLAorCQkJCSAgIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+eGF0dHJfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmcyk7CisJeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NCh4aS0+dmFsdWVfbGVuKTsKKwlpZiAoeGktPnZhbHVlX2xlbiA8PSBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJb2NmczJfeGF0dHJfc2V0X2xvY2FsKHhzLT5oZXJlLCAxKTsKKwllbHNlCisJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMCk7CisJb2NmczJfeGF0dHJfaGFzaF9lbnRyeShpbm9kZSwgeHMtPmhlYWRlciwgeHMtPmhlcmUpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoKQorICoKKyAqIFNldCBsYXJnZSBzaXplIHZhbHVlIGluIEIgdHJlZS4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSBzaXplX3Qgb2ZmcykKK3sKKwlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4oeGktPm5hbWUpOworCXZvaWQgKnZhbCA9IHhzLT5iYXNlICsgb2ZmczsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBOVUxMOworCXNpemVfdCBzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQodmFsLCAwLCBzaXplKTsKKwltZW1jcHkodmFsLCB4aS0+bmFtZSwgbmFtZV9sZW4pOworCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CisJeHYtPnhyX2NsdXN0ZXJzID0gMDsKKwl4di0+eHJfbGFzdF9lYl9ibGsgPSAwOworCXh2LT54cl9saXN0LmxfdHJlZV9kZXB0aCA9IDA7CisJeHYtPnhyX2xpc3QubF9jb3VudCA9IGNwdV90b19sZTE2KDEpOworCXh2LT54cl9saXN0LmxfbmV4dF9mcmVlX3JlYyA9IDA7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgeHMtPnhhdHRyX2JoLCB4diwKKwkJCQkJIHhpLT52YWx1ZV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeHYsIHhpLT52YWx1ZSwKKwkJCQkJICAgICAgeGktPnZhbHVlX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoaW5vZGUsIHhpLCB4cywgb2Zmcyk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9zZXRfZW50cnlfbG9jYWwoKQorICoKKyAqIFNldCwgcmVwbGFjZSBvciByZW1vdmUgZXh0ZW5kZWQgYXR0cmlidXRlIGluIGxvY2FsLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfbG9jYWwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0LAorCQkJCQlzaXplX3QgbWluX29mZnMpCit7CisJc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKKwlpbnQgaTsKKworCWlmICh4aS0+dmFsdWUgJiYgeHMtPm5vdF9mb3VuZCkgeworCQkvKiBJbnNlcnQgdGhlIG5ldyB4YXR0ciBlbnRyeS4gKi8KKwkJbGUxNl9hZGRfY3B1KCZ4cy0+aGVhZGVyLT54aF9jb3VudCwgMSk7CisJCW9jZnMyX3hhdHRyX3NldF90eXBlKGxhc3QsIHhpLT5uYW1lX2luZGV4KTsKKwkJb2NmczJfeGF0dHJfc2V0X2xvY2FsKGxhc3QsIDEpOworCQlsYXN0LT54ZV9uYW1lX2xlbiA9IG5hbWVfbGVuOworCX0gZWxzZSB7CisJCXZvaWQgKmZpcnN0X3ZhbDsKKwkJdm9pZCAqdmFsOworCQlzaXplX3Qgb2Zmcywgc2l6ZTsKKworCQlmaXJzdF92YWwgPSB4cy0+YmFzZSArIG1pbl9vZmZzOworCQlvZmZzID0gbGUxNl90b19jcHUoeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJdmFsID0geHMtPmJhc2UgKyBvZmZzOworCisJCWlmIChsZTY0X3RvX2NwdSh4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSkgPgorCQkgICAgT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCisJCQlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJCU9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCU9DRlMyX1hBVFRSX1NJWkUobGU2NF90b19jcHUoeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUpKTsKKworCQlpZiAoeGktPnZhbHVlICYmIHNpemUgPT0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJCU9DRlMyX1hBVFRSX1NJWkUoeGktPnZhbHVlX2xlbikpIHsKKwkJCS8qIFRoZSBvbGQgYW5kIHRoZSBuZXcgdmFsdWUgaGF2ZSB0aGUKKwkJCSAgIHNhbWUgc2l6ZS4gSnVzdCByZXBsYWNlIHRoZSB2YWx1ZS4gKi8KKwkJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMSk7CisJCQl4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTY0KHhpLT52YWx1ZV9sZW4pOworCQkJLyogQ2xlYXIgdmFsdWUgYnl0ZXMuICovCisJCQltZW1zZXQodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbiksCisJCQkgICAgICAgMCwKKwkJCSAgICAgICBPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pKTsKKwkJCW1lbWNweSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSwKKwkJCSAgICAgICB4aS0+dmFsdWUsCisJCQkgICAgICAgeGktPnZhbHVlX2xlbik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogUmVtb3ZlIHRoZSBvbGQgbmFtZSt2YWx1ZS4gKi8KKwkJbWVtbW92ZShmaXJzdF92YWwgKyBzaXplLCBmaXJzdF92YWwsIHZhbCAtIGZpcnN0X3ZhbCk7CisJCW1lbXNldChmaXJzdF92YWwsIDAsIHNpemUpOworCQl4cy0+aGVyZS0+eGVfbmFtZV9oYXNoID0gMDsKKwkJeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0ID0gMDsKKwkJb2NmczJfeGF0dHJfc2V0X2xvY2FsKHhzLT5oZXJlLCAxKTsKKwkJeHMtPmhlcmUtPnhlX3ZhbHVlX3NpemUgPSAwOworCisJCW1pbl9vZmZzICs9IHNpemU7CisKKwkJLyogQWRqdXN0IGFsbCB2YWx1ZSBvZmZzZXRzLiAqLworCQlsYXN0ID0geHMtPmhlYWRlci0+eGhfZW50cmllczsKKwkJZm9yIChpID0gMCA7IGkgPCBsZTE2X3RvX2NwdSh4cy0+aGVhZGVyLT54aF9jb3VudCk7IGkrKykgeworCQkJc2l6ZV90IG8gPSBsZTE2X3RvX2NwdShsYXN0LT54ZV9uYW1lX29mZnNldCk7CisKKwkJCWlmIChvIDwgb2ZmcykKKwkJCQlsYXN0LT54ZV9uYW1lX29mZnNldCA9IGNwdV90b19sZTE2KG8gKyBzaXplKTsKKwkJCWxhc3QgKz0gMTsKKwkJfQorCisJCWlmICgheGktPnZhbHVlKSB7CisJCQkvKiBSZW1vdmUgdGhlIG9sZCBlbnRyeS4gKi8KKwkJCWxhc3QgLT0gMTsKKwkJCW1lbW1vdmUoeHMtPmhlcmUsIHhzLT5oZXJlICsgMSwKKwkJCQkodm9pZCAqKWxhc3QgLSAodm9pZCAqKXhzLT5oZXJlKTsKKwkJCW1lbXNldChsYXN0LCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CisJCQlsZTE2X2FkZF9jcHUoJnhzLT5oZWFkZXItPnhoX2NvdW50LCAtMSk7CisJCX0KKwl9CisJaWYgKHhpLT52YWx1ZSkgeworCQkvKiBJbnNlcnQgdGhlIG5ldyBuYW1lK3ZhbHVlLiAqLworCQlzaXplX3Qgc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pICsKKwkJCQlPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pOworCQl2b2lkICp2YWwgPSB4cy0+YmFzZSArIG1pbl9vZmZzIC0gc2l6ZTsKKworCQl4cy0+aGVyZS0+eGVfbmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihtaW5fb2ZmcyAtIHNpemUpOworCQltZW1zZXQodmFsLCAwLCBzaXplKTsKKwkJbWVtY3B5KHZhbCwgeGktPm5hbWUsIG5hbWVfbGVuKTsKKwkJbWVtY3B5KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLAorCQkgICAgICAgeGktPnZhbHVlLAorCQkgICAgICAgeGktPnZhbHVlX2xlbik7CisJCXhzLT5oZXJlLT54ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlNjQoeGktPnZhbHVlX2xlbik7CisJCW9jZnMyX3hhdHRyX3NldF9sb2NhbCh4cy0+aGVyZSwgMSk7CisJCW9jZnMyX3hhdHRyX2hhc2hfZW50cnkoaW5vZGUsIHhzLT5oZWFkZXIsIHhzLT5oZXJlKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9zZXRfZW50cnkoKQorICoKKyAqIFNldCBleHRlbmRlZCBhdHRyaWJ1dGUgZW50cnkgaW50byBpbm9kZSBvciBibG9jay4KKyAqCisgKiBJZiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUgc2l6ZSA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFLAorICogV2UgZmlyc3QgaW5zZXJ0IHRyZWUgcm9vdChvY2ZzMl94YXR0cl92YWx1ZV9yb290KSB3aXRoIHNldF9lbnRyeV9sb2NhbCgpLAorICogdGhlbiBzZXQgdmFsdWUgaW4gQiB0cmVlIHdpdGggc2V0X3ZhbHVlX291dHNpZGUoKS4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkgaW50IGZsYWcpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsYXN0OworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKKwlzaXplX3QgbWluX29mZnMgPSB4cy0+ZW5kIC0geHMtPmJhc2UsIG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKKwlzaXplX3Qgc2l6ZV9sID0gMDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgZnJlZSwgaSwgcmV0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvIHhpX2wgPSB7CisJCS5uYW1lX2luZGV4ID0geGktPm5hbWVfaW5kZXgsCisJCS5uYW1lID0geGktPm5hbWUsCisJCS52YWx1ZSA9IHhpLT52YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHhpLT52YWx1ZV9sZW4sCisJfTsKKworCS8qIENvbXB1dGUgbWluX29mZnMsIGxhc3QgYW5kIGZyZWUgc3BhY2UuICovCisJbGFzdCA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGxlMTZfdG9fY3B1KHhzLT5oZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CisJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUobGFzdC0+eGVfbmFtZV9vZmZzZXQpOworCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQorCQkJbWluX29mZnMgPSBvZmZzOworCQlsYXN0ICs9IDE7CisJfQorCisJZnJlZSA9IG1pbl9vZmZzIC0gKCh2b2lkICopbGFzdCAtIHhzLT5iYXNlKSAtIHNpemVvZihfX3UzMik7CisJaWYgKGZyZWUgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgheHMtPm5vdF9mb3VuZCkgeworCQlzaXplX3Qgc2l6ZSA9IDA7CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpCisJCQlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJT0NGUzJfWEFUVFJfU0laRShsZTY0X3RvX2NwdSh4cy0+aGVyZS0+eGVfdmFsdWVfc2l6ZSkpOworCQllbHNlCisJCQlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJCU9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwkJZnJlZSArPSAoc2l6ZSArIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKKwl9CisJLyogQ2hlY2sgZnJlZSBzcGFjZSBpbiBpbm9kZSBvciBibG9jayAqLworCWlmICh4aS0+dmFsdWUgJiYgeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCWlmIChmcmVlIDwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKworCQkJICAgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJICAgT0NGUzJfWEFUVFJfUk9PVF9TSVpFKSB7CisJCQlyZXQgPSAtRU5PU1BDOworCQkJZ290byBvdXQ7CisJCX0KKwkJc2l6ZV9sID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJCXhpX2wudmFsdWUgPSAodm9pZCAqKSZkZWZfeHY7CisJCXhpX2wudmFsdWVfbGVuID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCX0gZWxzZSBpZiAoeGktPnZhbHVlKSB7CisJCWlmIChmcmVlIDwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKworCQkJICAgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKworCQkJICAgT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKSkgeworCQkJcmV0ID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCF4cy0+bm90X2ZvdW5kKSB7CisJCS8qIEZvciBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUgKi8KKwkJc2l6ZV90IHNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQlPQ0ZTMl9YQVRUUl9TSVpFKGxlNjRfdG9fY3B1KHhzLT5oZXJlLT54ZV92YWx1ZV9zaXplKSk7CisJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUoeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJdm9pZCAqdmFsID0geHMtPmJhc2UgKyBvZmZzOworCisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkgJiYgc2l6ZSA9PSBzaXplX2wpIHsKKwkJCS8qIFJlcGxhY2UgZXhpc3RpbmcgbG9jYWwgeGF0dHIgd2l0aCB0cmVlIHJvb3QgKi8KKwkJCXJldCA9IG9jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4aSwgeHMsCisJCQkJCQkJICAgIG9mZnMpOworCQkJaWYgKHJldCA8IDApCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKHhzLT5oZXJlKSkgeworCQkJLyogRm9yIGV4aXN0aW5nIHhhdHRyIHdoaWNoIGhhcyB2YWx1ZSBvdXRzaWRlICovCisJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBOVUxMOworCQkJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikodmFsICsKKwkJCQlPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CisKKwkJCWlmICh4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKKwkJCQkvKgorCQkJCSAqIElmIG5ldyB2YWx1ZSBuZWVkIHNldCBvdXRzaWRlIGFsc28sCisJCQkJICogZmlyc3QgdHJ1bmNhdGUgb2xkIHZhbHVlIHRvIG5ldyB2YWx1ZSwKKwkJCQkgKiB0aGVuIHNldCBuZXcgdmFsdWUgd2l0aCBzZXRfdmFsdWVfb3V0c2lkZSgpLgorCQkJCSAqLworCQkJCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLAorCQkJCQkJCQkgeHMtPnhhdHRyX2JoLAorCQkJCQkJCQkgeHYsCisJCQkJCQkJCSB4aS0+dmFsdWVfbGVuKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsCisJCQkJCQkJCXh2LAorCQkJCQkJCQl4aS0+dmFsdWUsCisJCQkJCQkJCXhpLT52YWx1ZV9sZW4pOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJcmV0ID0gb2NmczJfeGF0dHJfdXBkYXRlX2VudHJ5KGlub2RlLAorCQkJCQkJCSAgICAgICB4aSwKKwkJCQkJCQkgICAgICAgeHMsCisJCQkJCQkJICAgICAgIG9mZnMpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSWYgbmV3IHZhbHVlIG5lZWQgc2V0IGluIGxvY2FsLAorCQkJCSAqIGp1c3QgdHJ1Y2F0ZSBvbGQgdmFsdWUgdG8gemVyby4KKwkJCQkgKi8KKwkJCQkgcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsCisJCQkJCQkJCSB4cy0+eGF0dHJfYmgsCisJCQkJCQkJCSB4diwKKwkJCQkJCQkJIDApOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQl9CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKKwkJCQkgICBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+aW5vZGVfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJaWYgKCEoZmxhZyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKKwkJLyogc2V0IGV4dGVuZGVkIGF0dHJpYnV0ZSBpbiBleHRlcm5hbCBibG9jay4gKi8KKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwKKwkJCQkJIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsKKwkJCQkJIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9jb21taXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCB2YWx1ZSBpbiBsb2NhbCwgaW5jbHVkZSBzZXQgdHJlZSByb290IGluIGxvY2FsLgorCSAqIFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAgZm9yIHZhbHVlIHNpemUgPklOTElORV9TSVpFLgorCSAqLworCW9jZnMyX3hhdHRyX3NldF9lbnRyeV9sb2NhbChpbm9kZSwgJnhpX2wsIHhzLCBsYXN0LCBtaW5fb2Zmcyk7CisKKwlpZiAoIShmbGFnICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSkgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPnhhdHRyX2JoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCX0KKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpICYmCisJICAgIChmbGFnICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSkgeworCQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwkJdW5zaWduZWQgaW50IHhhdHRyc2l6ZSA9IG9zYi0+c194YXR0cl9pbmxpbmVfc2l6ZTsKKworCQkvKgorCQkgKiBBZGp1c3QgZXh0ZW50IHJlY29yZCBjb3VudCBvciBpbmxpbmUgZGF0YSBzaXplCisJCSAqIHRvIHJlc2VydmUgc3BhY2UgZm9yIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKwkJICovCisJCWlmIChvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpIHsKKwkJCXN0cnVjdCBvY2ZzMl9pbmxpbmVfZGF0YSAqaWRhdGEgPSAmZGktPmlkMi5pX2RhdGE7CisJCQlsZTE2X2FkZF9jcHUoJmlkYXRhLT5pZF9jb3VudCwgLXhhdHRyc2l6ZSk7CisJCX0gZWxzZSBpZiAoIShvY2ZzMl9pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKSkgeworCQkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwkJCWxlMTZfYWRkX2NwdSgmZWwtPmxfY291bnQsIC0oeGF0dHJzaXplIC8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSkpOworCQl9CisJCWRpLT5pX3hhdHRyX2lubGluZV9zaXplID0gY3B1X3RvX2xlMTYoeGF0dHJzaXplKTsKKwl9CisJLyogVXBkYXRlIHhhdHRyIGZsYWcgKi8KKwlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKKwlvaS0+aXBfZHluX2ZlYXR1cmVzIHw9IGZsYWc7CisJZGktPmlfZHluX2ZlYXR1cmVzID0gY3B1X3RvX2xlMTYob2ktPmlwX2R5bl9mZWF0dXJlcyk7CisJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKwkvKiBVcGRhdGUgaW5vZGUgY3RpbWUgKi8KKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlkaS0+aV9jdGltZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X25zZWMpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5pbm9kZV9iaCk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOworCisJaWYgKCFyZXQgJiYgeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCS8qCisJCSAqIFNldCB2YWx1ZSBvdXRzaWRlIGluIEIgdHJlZS4KKwkJICogVGhpcyBpcyB0aGUgc2Vjb25kIHN0ZXAgZm9yIHZhbHVlIHNpemUgPiBJTkxJTkVfU0laRS4KKwkJICovCisJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUoeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHhpLCB4cywgb2Zmcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpbnQgcmV0MjsKKworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJLyoKKwkJCSAqIElmIHNldCB2YWx1ZSBvdXRzaWRlIGZhaWxlZCwgd2UgaGF2ZSB0byBjbGVhbgorCQkJICogdGhlIGp1bmsgdHJlZSByb290IHdlIGhhdmUgYWxyZWFkeSBzZXQgaW4gbG9jYWwuCisJCQkgKi8KKwkJCXJldDIgPSBvY2ZzMl94YXR0cl9jbGVhbnVwKGlub2RlLCB4aSwgeHMsIG9mZnMpOworCQkJaWYgKHJldDIgPCAwKQorCQkJCW1sb2dfZXJybm8ocmV0Mik7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50IG9jZnMyX3JlbW92ZV92YWx1ZV9vdXRzaWRlKHN0cnVjdCBpbm9kZSppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlcikKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShoZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqZW50cnkgPSAmaGVhZGVyLT54aF9lbnRyaWVzW2ldOworCisJCWlmICghb2NmczJfeGF0dHJfaXNfbG9jYWwoZW50cnkpKSB7CisJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CisJCQl2b2lkICp2YWw7CisKKwkJCXZhbCA9ICh2b2lkICopaGVhZGVyICsKKwkJCQlsZTE2X3RvX2NwdShlbnRyeS0+eGVfbmFtZV9vZmZzZXQpOworCQkJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJCQkodmFsICsgT0NGUzJfWEFUVFJfU0laRShlbnRyeS0+eGVfbmFtZV9sZW4pKTsKKwkJCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCBiaCwgeHYsIDApOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaWJvZHlfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCit7CisKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXI7CisJaW50IHJldDsKKworCWhlYWRlciA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopCisJCSAoKHZvaWQgKilkaSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSkpOworCisJcmV0ID0gb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoaW5vZGUsIGRpX2JoLCBoZWFkZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9ibG9ja19yZW1vdmUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpibGtfYmgpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YjsKKwlpbnQgcmV0ID0gMDsKKworCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOworCWlmICghKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgeworCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSAmKHhiLT54Yl9hdHRycy54Yl9oZWFkZXIpOworCQlyZXQgPSBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShpbm9kZSwgYmxrX2JoLCBoZWFkZXIpOworCX0gZWxzZQorCQlyZXQgPSBvY2ZzMl9kZWxldGVfeGF0dHJfaW5kZXhfYmxvY2soaW5vZGUsIGJsa19iaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2ZyZWVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHU2NCBibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnhiX2FsbG9jX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYWxsb2NfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxrX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHJldCA9IDA7CisJdTY0IGJsaywgYmdfYmxrbm87CisJdTE2IGJpdDsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsb2NrLCAmYmxrX2JoKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qVmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgeGF0dHIgYmxvY2sqLworCWlmIChtZW1jbXAoKHZvaWQgKilibGtfYmgtPmJfZGF0YSwgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFLAorCQkgICBzdHJsZW4oT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfcmVtb3ZlKGlub2RlLCBibGtfYmgpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7CisJYmxrID0gbGU2NF90b19jcHUoeGItPnhiX2Jsa25vKTsKKwliaXQgPSBsZTE2X3RvX2NwdSh4Yi0+eGJfc3ViYWxsb2NfYml0KTsKKwliZ19ibGtubyA9IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKGJsaywgYml0KTsKKworCXhiX2FsbG9jX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKKwkJCQlFWFRFTlRfQUxMT0NfU1lTVEVNX0lOT0RFLAorCQkJCWxlMTZfdG9fY3B1KHhiLT54Yl9zdWJhbGxvY19zbG90KSk7CisJaWYgKCF4Yl9hbGxvY19pbm9kZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF9sb2NrKCZ4Yl9hbGxvY19pbm9kZS0+aV9tdXRleCk7CisKKwlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKHhiX2FsbG9jX2lub2RlLCAmeGJfYWxsb2NfYmgsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbXV0ZXg7CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlyZXQgPSBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlLCB4Yl9hbGxvY19pbm9kZSwgeGJfYWxsb2NfYmgsCisJCQkJICAgICAgIGJpdCwgYmdfYmxrbm8sIDEpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X3VubG9jazoKKwlvY2ZzMl9pbm9kZV91bmxvY2soeGJfYWxsb2NfaW5vZGUsIDEpOworCWJyZWxzZSh4Yl9hbGxvY19iaCk7CitvdXRfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZ4Yl9hbGxvY19pbm9kZS0+aV9tdXRleCk7CisJaXB1dCh4Yl9hbGxvY19pbm9kZSk7CitvdXQ6CisJYnJlbHNlKGJsa19iaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9jZnMyX3hhdHRyX3JlbW92ZSgpCisgKgorICogRnJlZSBleHRlbmRlZCBhdHRyaWJ1dGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlLgorICovCitpbnQgb2NmczJfeGF0dHJfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCit7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgcmV0OworCisJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQorCQlyZXR1cm4gMDsKKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9IQVNfWEFUVFJfRkwpKQorCQlyZXR1cm4gMDsKKworCWlmIChvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3JlbW92ZShpbm9kZSwgZGlfYmgpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoZGktPmlfeGF0dHJfbG9jKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2ZyZWVfYmxvY2soaW5vZGUsCisJCQkJCSAgICAgbGU2NF90b19jcHUoZGktPmlfeGF0dHJfbG9jKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKChPQ0ZTMl9TQihpbm9kZS0+aV9zYikpLAorCQkJCSAgIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlkaS0+aV94YXR0cl9sb2MgPSAwOworCisJc3Bpbl9sb2NrKCZvaS0+aXBfbG9jayk7CisJb2ktPmlwX2R5bl9mZWF0dXJlcyAmPSB+KE9DRlMyX0lOTElORV9YQVRUUl9GTCB8IE9DRlMyX0hBU19YQVRUUl9GTCk7CisJZGktPmlfZHluX2ZlYXR1cmVzID0gY3B1X3RvX2xlMTYob2ktPmlwX2R5bl9mZWF0dXJlcyk7CisJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2hhc19zcGFjZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCit7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJdW5zaWduZWQgaW50IHhhdHRyc2l6ZSA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c194YXR0cl9pbmxpbmVfc2l6ZTsKKwlpbnQgZnJlZTsKKworCWlmICh4YXR0cnNpemUgPCBPQ0ZTMl9NSU5fWEFUVFJfSU5MSU5FX1NJWkUpCisJCXJldHVybiAwOworCisJaWYgKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkgeworCQlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmlkYXRhID0gJmRpLT5pZDIuaV9kYXRhOworCQlmcmVlID0gbGUxNl90b19jcHUoaWRhdGEtPmlkX2NvdW50KSAtIGxlNjRfdG9fY3B1KGRpLT5pX3NpemUpOworCX0gZWxzZSBpZiAob2NmczJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKGlub2RlKSkgeworCQlmcmVlID0gb2NmczJfZmFzdF9zeW1saW5rX2NoYXJzKGlub2RlLT5pX3NiKSAtCisJCQlsZTY0X3RvX2NwdShkaS0+aV9zaXplKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gJmRpLT5pZDIuaV9saXN0OworCQlmcmVlID0gKGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSAtCisJCQlsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgKgorCQkJc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKKwl9CisJaWYgKGZyZWUgPj0geGF0dHJzaXplKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogb2NmczJfeGF0dHJfaWJvZHlfZmluZCgpCisgKgorICogRmluZCBleHRlbmRlZCBhdHRyaWJ1dGUgaW4gaW5vZGUgYmxvY2sgYW5kCisgKiBmaWxsIHNlYXJjaCBpbmZvIGludG8gc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaC4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9pYm9keV9maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBpbnQgbmFtZV9pbmRleCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CisJaW50IHJldDsKKwlpbnQgaGFzX3NwYWNlID0gMDsKKworCWlmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPT0gT0NGUzJfTUlOX0JMT0NLU0laRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShvaS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX1hBVFRSX0ZMKSkgeworCQlkb3duX3JlYWQoJm9pLT5pcF9hbGxvY19zZW0pOworCQloYXNfc3BhY2UgPSBvY2ZzMl94YXR0cl9oYXNfc3BhY2VfaW5saW5lKGlub2RlLCBkaSk7CisJCXVwX3JlYWQoJm9pLT5pcF9hbGxvY19zZW0pOworCQlpZiAoIWhhc19zcGFjZSkKKwkJCXJldHVybiAwOworCX0KKworCXhzLT54YXR0cl9iaCA9IHhzLT5pbm9kZV9iaDsKKwl4cy0+ZW5kID0gKHZvaWQgKilkaSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpZiAob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkKKwkJeHMtPmhlYWRlciA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopCisJCQkoeHMtPmVuZCAtIGxlMTZfdG9fY3B1KGRpLT5pX3hhdHRyX2lubGluZV9zaXplKSk7CisJZWxzZQorCQl4cy0+aGVhZGVyID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKikKKwkJCSh4cy0+ZW5kIC0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX3hhdHRyX2lubGluZV9zaXplKTsKKwl4cy0+YmFzZSA9ICh2b2lkICopeHMtPmhlYWRlcjsKKwl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKwkvKiBGaW5kIHRoZSBuYW1lZCBhdHRyaWJ1dGUuICovCisJaWYgKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpIHsKKwkJcmV0ID0gb2NmczJfeGF0dHJfZmluZF9lbnRyeShuYW1lX2luZGV4LCBuYW1lLCB4cyk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9EQVRBKQorCQkJcmV0dXJuIHJldDsKKwkJeHMtPm5vdF9mb3VuZCA9IHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG9jZnMyX3hhdHRyX2lib2R5X3NldCgpCisgKgorICogU2V0LCByZXBsYWNlIG9yIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byBpbm9kZSBibG9jay4KKyAqCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaWJvZHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCWludCByZXQ7CisKKwlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID09IE9DRlMyX01JTl9CTE9DS1NJWkUpCisJCXJldHVybiAtRU5PU1BDOworCisJZG93bl93cml0ZSgmb2ktPmlwX2FsbG9jX3NlbSk7CisJaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKKwkJaWYgKCFvY2ZzMl94YXR0cl9oYXNfc3BhY2VfaW5saW5lKGlub2RlLCBkaSkpIHsKKwkJCXJldCA9IC1FTk9TUEM7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeShpbm9kZSwgeGksIHhzLAorCQkJCShPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwgfCBPQ0ZTMl9IQVNfWEFUVFJfRkwpKTsKK291dDoKKwl1cF93cml0ZSgmb2ktPmlwX2FsbG9jX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogb2NmczJfeGF0dHJfYmxvY2tfZmluZCgpCisgKgorICogRmluZCBleHRlbmRlZCBhdHRyaWJ1dGUgaW4gZXh0ZXJuYWwgYmxvY2sgYW5kCisgKiBmaWxsIHNlYXJjaCBpbmZvIGludG8gc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaC4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9ibG9ja19maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBpbnQgbmFtZV9pbmRleCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopeHMtPmlub2RlX2JoLT5iX2RhdGE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpibGtfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRpLT5pX3hhdHRyX2xvYykKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksICZibGtfYmgpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLypWZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiB4YXR0ciBibG9jayovCisJaWYgKG1lbWNtcCgodm9pZCAqKWJsa19iaC0+Yl9kYXRhLCBPQ0ZTMl9YQVRUUl9CTE9DS19TSUdOQVRVUkUsCisJCSAgIHN0cmxlbihPQ0ZTMl9YQVRUUl9CTE9DS19TSUdOQVRVUkUpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwl4cy0+eGF0dHJfYmggPSBibGtfYmg7CisJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7CisKKwlpZiAoIShsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpICYgT0NGUzJfWEFUVFJfSU5ERVhFRCkpIHsKKwkJeHMtPmhlYWRlciA9ICZ4Yi0+eGJfYXR0cnMueGJfaGVhZGVyOworCQl4cy0+YmFzZSA9ICh2b2lkICopeHMtPmhlYWRlcjsKKwkJeHMtPmVuZCA9ICh2b2lkICopKGJsa19iaC0+Yl9kYXRhKSArIGJsa19iaC0+Yl9zaXplOworCQl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfZmluZF9lbnRyeShuYW1lX2luZGV4LCBuYW1lLCB4cyk7CisJfSBlbHNlCisJCXJldCA9IG9jZnMyX3hhdHRyX2luZGV4X2Jsb2NrX2ZpbmQoaW5vZGUsIGJsa19iaCwKKwkJCQkJCSAgIG5hbWVfaW5kZXgsCisJCQkJCQkgICBuYW1lLCB4cyk7CisKKwlpZiAocmV0ICYmIHJldCAhPSAtRU5PREFUQSkgeworCQl4cy0+eGF0dHJfYmggPSBOVUxMOworCQlnb3RvIGNsZWFudXA7CisJfQorCXhzLT5ub3RfZm91bmQgPSByZXQ7CisJcmV0dXJuIDA7CitjbGVhbnVwOgorCWJyZWxzZShibGtfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdoZW4gYWxsIHRoZSB4YXR0cnMgYXJlIGRlbGV0ZWQgZnJvbSBpbmRleCBidHJlZSwgdGhlIG9jZnMyX3hhdHRyX3RyZWUKKyAqIHdpbGwgYmUgZXJhc2VkIGFuZCBvY2ZzMl94YXR0cl9ibG9jayB3aWxsIGhhdmUgaXRzIG9jZnMyX3hhdHRyX2hlYWRlcgorICogcmUtaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVzdG9yZV94YXR0cl9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJaW50IHJldDsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeHMtPnhhdHRyX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZ4Yi0+eGJfYXR0cnMueGJfcm9vdC54dF9saXN0OworCXUxNiB4Yl9mbGFncyA9IGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncyk7CisKKwlCVUdfT04oISh4Yl9mbGFncyAmIE9DRlMyX1hBVFRSX0lOREVYRUQpIHx8CisJCWxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpICE9IDApOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPnhhdHRyX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwltZW1zZXQoJnhiLT54Yl9hdHRycywgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrLCB4Yl9hdHRycykpOworCisJeGItPnhiX2ZsYWdzID0gY3B1X3RvX2xlMTYoeGJfZmxhZ3MgJiB+T0NGUzJfWEFUVFJfSU5ERVhFRCk7CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPnhhdHRyX2JoKTsKKworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9ibG9ja19zZXQoKQorICoKKyAqIFNldCwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gZXh0ZXJuYWwgYmxvY2suCisgKgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9ICAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXhzLT5pbm9kZV9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhibGsgPSBOVUxMOworCXUxNiBzdWJhbGxvY19iaXRfc3RhcnQ7CisJdTMyIG51bV9nb3Q7CisJdTY0IGZpcnN0X2Jsa25vOworCWludCByZXQ7CisKKwlpZiAoIXhzLT54YXR0cl9iaCkgeworCQkvKgorCQkgKiBBbGxvYyBvbmUgZXh0ZXJuYWwgYmxvY2sgZm9yIGV4dGVuZGVkIGF0dHJpYnV0ZQorCQkgKiBvdXRzaWRlIG9mIGlub2RlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwgMSwgJm1ldGFfYWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLAorCQkJCQkgICBPQ0ZTMl9YQVRUUl9CTE9DS19DUkVBVEVfQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPmlub2RlX2JoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisKKwkJcmV0ID0gb2NmczJfY2xhaW1fbWV0YWRhdGEob3NiLCBoYW5kbGUsIG1ldGFfYWMsIDEsCisJCQkJCSAgICZzdWJhbGxvY19iaXRfc3RhcnQsICZudW1fZ290LAorCQkJCQkgICAmZmlyc3RfYmxrbm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisKKwkJbmV3X2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBmaXJzdF9ibGtubyk7CisJCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBuZXdfYmgpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCisJCS8qIEluaXRpYWxpemUgb2NmczJfeGF0dHJfYmxvY2sgKi8KKwkJeHMtPnhhdHRyX2JoID0gbmV3X2JoOworCQl4YmxrID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKW5ld19iaC0+Yl9kYXRhOworCQltZW1zZXQoeGJsaywgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJc3RyY3B5KCh2b2lkICopeGJsaywgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKTsKKwkJeGJsay0+eGJfc3ViYWxsb2Nfc2xvdCA9IGNwdV90b19sZTE2KG9zYi0+c2xvdF9udW0pOworCQl4YmxrLT54Yl9zdWJhbGxvY19iaXQgPSBjcHVfdG9fbGUxNihzdWJhbGxvY19iaXRfc3RhcnQpOworCQl4YmxrLT54Yl9mc19nZW5lcmF0aW9uID0gY3B1X3RvX2xlMzIob3NiLT5mc19nZW5lcmF0aW9uKTsKKwkJeGJsay0+eGJfYmxrbm8gPSBjcHVfdG9fbGU2NChmaXJzdF9ibGtubyk7CisKKwkJeHMtPmhlYWRlciA9ICZ4YmxrLT54Yl9hdHRycy54Yl9oZWFkZXI7CisJCXhzLT5iYXNlID0gKHZvaWQgKil4cy0+aGVhZGVyOworCQl4cy0+ZW5kID0gKHZvaWQgKil4YmxrICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CisKKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2JoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJfQorCQlkaS0+aV94YXR0cl9sb2MgPSBjcHVfdG9fbGU2NChmaXJzdF9ibGtubyk7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+aW5vZGVfYmgpOworCQlpZiAocmV0IDwgMCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKK291dF9jb21taXQ6CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJCWlmIChtZXRhX2FjKQorCQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXhibGsgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeHMtPnhhdHRyX2JoLT5iX2RhdGE7CisKKwlpZiAoIShsZTE2X3RvX2NwdSh4YmxrLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgeworCQkvKiBTZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gZXh0ZXJuYWwgYmxvY2sgKi8KKwkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5KGlub2RlLCB4aSwgeHMsIE9DRlMyX0hBU19YQVRUUl9GTCk7CisJCWlmICghcmV0IHx8IHJldCAhPSAtRU5PU1BDKQorCQkJZ290byBlbmQ7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfY3JlYXRlX2luZGV4X2Jsb2NrKGlub2RlLCB4cyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVuZDsKKwl9CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5kZXhfYmxvY2soaW5vZGUsIHhpLCB4cyk7CisJaWYgKCFyZXQgJiYgeGJsay0+eGJfYXR0cnMueGJfcm9vdC54dF9saXN0LmxfbmV4dF9mcmVlX3JlYyA9PSAwKQorCQlyZXQgPSBvY2ZzMl9yZXN0b3JlX3hhdHRyX2Jsb2NrKGlub2RlLCB4cyk7CisKK2VuZDoKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBvY2ZzMl94YXR0cl9zZXQoKQorICoKKyAqIFNldCwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLgorICogdmFsdWUgaXMgTlVMTCB0byByZW1vdmUgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBlbHNlIGVpdGhlcgorICogY3JlYXRlIG9yIHJlcGxhY2UgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLgorICovCitpbnQgb2NmczJfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICBpbnQgbmFtZV9pbmRleCwKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICAgIHNpemVfdCB2YWx1ZV9sZW4sCisJCSAgICBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJaW50IHJldDsKKwl1MTYgaSwgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyB4aSA9IHsKKwkJLm5hbWVfaW5kZXggPSBuYW1lX2luZGV4LAorCQkubmFtZSA9IG5hbWUsCisJCS52YWx1ZSA9IHZhbHVlLAorCQkudmFsdWVfbGVuID0gdmFsdWVfbGVuLAorCX07CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhpcyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhicyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldCA9IG9jZnMyX2lub2RlX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwl4aXMuaW5vZGVfYmggPSB4YnMuaW5vZGVfYmggPSBkaV9iaDsKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF94YXR0cl9zZW0pOworCS8qCisJICogU2NhbiBpbm9kZSBhbmQgZXh0ZXJuYWwgYmxvY2sgdG8gZmluZCB0aGUgc2FtZSBuYW1lCisJICogZXh0ZW5kZWQgYXR0cmlidXRlIGFuZCBjb2xsZWN0IHNlYXJjaCBpbmZvbWF0aW9uLgorCSAqLworCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsICZ4aXMpOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoeGlzLm5vdF9mb3VuZCkgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCAmeGJzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoeGlzLm5vdF9mb3VuZCAmJiB4YnMubm90X2ZvdW5kKSB7CisJCXJldCA9IC1FTk9EQVRBOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQorCQkJZ290byBjbGVhbnVwOworCQlyZXQgPSAwOworCQlpZiAoIXZhbHVlKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCWlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoIXZhbHVlKSB7CisJCS8qIFJlbW92ZSBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUgKi8KKwkJaWYgKCF4aXMubm90X2ZvdW5kKQorCQkJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfc2V0KGlub2RlLCAmeGksICZ4aXMpOworCQllbHNlIGlmICgheGJzLm5vdF9mb3VuZCkKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgJnhpLCAmeGJzKTsKKwl9IGVsc2UgeworCQkvKiBXZSBhbHdheXMgdHJ5IHRvIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byBpbm9kZSBmaXJzdCovCisJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgJnhpLCAmeGlzKTsKKwkJaWYgKCFyZXQgJiYgIXhicy5ub3RfZm91bmQpIHsKKwkJCS8qCisJCQkgKiBJZiBzdWNjZWVkIGFuZCB0aGF0IGV4dGVuZGVkIGF0dHJpYnV0ZSBleGlzdGluZyBpbgorCQkJICogZXh0ZXJuYWwgYmxvY2ssIHRoZW4gd2Ugd2lsbCByZW1vdmUgaXQuCisJCQkgKi8KKwkJCXhpLnZhbHVlID0gTlVMTDsKKwkJCXhpLnZhbHVlX2xlbiA9IDA7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19zZXQoaW5vZGUsICZ4aSwgJnhicyk7CisJCX0gZWxzZSBpZiAocmV0ID09IC1FTk9TUEMpIHsKKwkJCWlmIChkaS0+aV94YXR0cl9sb2MgJiYgIXhicy54YXR0cl9iaCkgeworCQkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsCisJCQkJCQkJICAgICBuYW1lLCAmeGJzKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQkvKgorCQkJICogSWYgbm8gc3BhY2UgaW4gaW5vZGUsIHdlIHdpbGwgc2V0IGV4dGVuZGVkIGF0dHJpYnV0ZQorCQkJICogaW50byBleHRlcm5hbCBibG9jay4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCAmeGksICZ4YnMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlpZiAoIXhpcy5ub3RfZm91bmQpIHsKKwkJCQkvKgorCQkJCSAqIElmIHN1Y2NlZWQgYW5kIHRoYXQgZXh0ZW5kZWQgYXR0cmlidXRlCisJCQkJICogZXhpc3RpbmcgaW4gaW5vZGUsIHdlIHdpbGwgcmVtb3ZlIGl0LgorCQkJCSAqLworCQkJCXhpLnZhbHVlID0gTlVMTDsKKwkJCQl4aS52YWx1ZV9sZW4gPSAwOworCQkJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgJnhpLCAmeGlzKTsKKwkJCX0KKwkJfQorCX0KK2NsZWFudXA6CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF94YXR0cl9zZW0pOworCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMSk7CisJYnJlbHNlKGRpX2JoKTsKKwlicmVsc2UoeGJzLnhhdHRyX2JoKTsKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJYnJlbHNlKHhicy5idWNrZXQuYmhzW2ldKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSB4YXR0ciBleHRlbnQgcmVjIHdoaWNoIG1heSBjb250YWlucyBuYW1lX2hhc2guCisgKiBlX2Nwb3Mgd2lsbCBiZSB0aGUgZmlyc3QgbmFtZSBoYXNoIG9mIHRoZSB4YXR0ciByZWMuCisgKiBlbCBtdXN0IGJlIHRoZSBvY2ZzMl94YXR0cl9oZWFkZXIueGJfYXR0cnMueGJfcm9vdC54dF9saXN0LgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2dldF9yZWMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICB1MzIgbmFtZV9oYXNoLAorCQkJICAgICAgIHU2NCAqcF9ibGtubywKKwkJCSAgICAgICB1MzIgKmVfY3BvcywKKwkJCSAgICAgICB1MzIgKm51bV9jbHVzdGVycywKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKQoreworCWludCByZXQgPSAwLCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPSBOVUxMOworCXU2NCBlX2Jsa25vID0gMDsKKworCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7CisJCXJldCA9IG9jZnMyX2ZpbmRfbGVhZihpbm9kZSwgZWwsIG5hbWVfaGFzaCwgJmViX2JoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGViX2JoLT5iX2RhdGE7CisJCWVsID0gJmViLT5oX2xpc3Q7CisKKwkJaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWx1IGhhcyBub24gemVybyB0cmVlIGRlcHRoIGluICIKKwkJCQkgICAgInhhdHRyIHRyZWUgYmxvY2sgJWxsdVxuIiwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWViX2JoLT5iX2Jsb2NrbnIpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlmb3IgKGkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPD0gbmFtZV9oYXNoKSB7CisJCQllX2Jsa25vID0gbGU2NF90b19jcHUocmVjLT5lX2Jsa25vKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFlX2Jsa25vKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLCAiSW5vZGUgJWx1IGhhcyBiYWQgZXh0ZW50ICIKKwkJCSAgICAicmVjb3JkICgldSwgJXUsIDApIGluIHhhdHRyIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSwKKwkJCSAgICBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykpOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KKworCSpwX2Jsa25vID0gbGU2NF90b19jcHUocmVjLT5lX2Jsa25vKTsKKwkqbnVtX2NsdXN0ZXJzID0gbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCWlmIChlX2Nwb3MpCisJCSplX2Nwb3MgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CitvdXQ6CisJYnJlbHNlKGViX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCit0eXBlZGVmIGludCAoeGF0dHJfYnVja2V0X2Z1bmMpKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAorCQkJCXZvaWQgKnBhcmEpOworCitzdGF0aWMgaW50IG9jZnMyX2ZpbmRfeGVfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgsCisJCQkJICAgaW50IG5hbWVfaW5kZXgsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICB1MzIgbmFtZV9oYXNoLAorCQkJCSAgIHUxNiAqeGVfaW5kZXgsCisJCQkJICAgaW50ICpmb3VuZCkKK3sKKwlpbnQgaSwgcmV0ID0gMCwgY21wID0gMSwgYmxvY2tfb2ZmLCBuZXdfb2Zmc2V0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KKwkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopaGVhZGVyX2JoLT5iX2RhdGE7CisJc2l6ZV90IG5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmFtZV9iaCA9IE5VTEw7CisJY2hhciAqeGVfbmFtZTsKKworCS8qCisJICogV2UgZG9uJ3QgdXNlIGJpbmFyeSBzZWFyY2ggaW4gdGhlIGJ1Y2tldCBiZWNhdXNlIHRoZXJlCisJICogbWF5IGJlIG11bHRpcGxlIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGhhc2guCisJICovCisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7IGkrKykgeworCQl4ZSA9ICZ4aC0+eGhfZW50cmllc1tpXTsKKworCQlpZiAobmFtZV9oYXNoID4gbGUzMl90b19jcHUoeGUtPnhlX25hbWVfaGFzaCkpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAobmFtZV9oYXNoIDwgbGUzMl90b19jcHUoeGUtPnhlX25hbWVfaGFzaCkpCisJCQlicmVhazsKKworCQljbXAgPSBuYW1lX2luZGV4IC0gb2NmczJfeGF0dHJfZ2V0X3R5cGUoeGUpOworCQlpZiAoIWNtcCkKKwkJCWNtcCA9IG5hbWVfbGVuIC0geGUtPnhlX25hbWVfbGVuOworCQlpZiAoY21wKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF9uYW1lX3ZhbHVlKGlub2RlLAorCQkJCQkJCXhoLAorCQkJCQkJCWksCisJCQkJCQkJJmJsb2NrX29mZiwKKwkJCQkJCQkmbmV3X29mZnNldCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgaGVhZGVyX2JoLT5iX2Jsb2NrbnIgKyBibG9ja19vZmYsCisJCQkJICAgICAgICZuYW1lX2JoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKwkJeGVfbmFtZSA9IG5hbWVfYmgtPmJfZGF0YSArIG5ld19vZmZzZXQ7CisKKwkJY21wID0gbWVtY21wKG5hbWUsIHhlX25hbWUsIG5hbWVfbGVuKTsKKwkJYnJlbHNlKG5hbWVfYmgpOworCQluYW1lX2JoID0gTlVMTDsKKworCQlpZiAoY21wID09IDApIHsKKwkJCSp4ZV9pbmRleCA9IGk7CisJCQkqZm91bmQgPSAxOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbmQgdGhlIHNwZWNpZmllZCB4YXR0ciBlbnRyeSBpbiBhIHNlcmllcyBvZiBidWNrZXRzLgorICogVGhpcyBzZXJpZXMgc3RhcnQgZnJvbSBwX2Jsa25vIGFuZCBsYXN0IGZvciBudW1fY2x1c3RlcnMuCisgKiBUaGUgb2NmczJfeGF0dHJfaGVhZGVyLnhoX251bV9idWNrZXRzIG9mIHRoZSBmaXJzdCBidWNrZXQgY29udGFpbnMKKyAqIHRoZSBudW0gb2YgdGhlIHZhbGlkIGJ1Y2tldHMuCisgKgorICogUmV0dXJuIHRoZSBidWZmZXJfaGVhZCB0aGlzIHhhdHRyIHNob3VsZCByZXNpZGUgaW4uIEFuZCBpZiB0aGUgeGF0dHIncworICogaGFzaCBpcyBpbiB0aGUgZ2FwIG9mIDIgYnVja2V0cywgcmV0dXJuIHRoZSBsb3dlciBidWNrZXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X2ZpbmQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBpbnQgbmFtZV9pbmRleCwKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHUzMiBuYW1lX2hhc2gsCisJCQkJICAgdTY0IHBfYmxrbm8sCisJCQkJICAgdTMyIGZpcnN0X2hhc2gsCisJCQkJICAgdTMyIG51bV9jbHVzdGVycywKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlpbnQgcmV0LCBmb3VuZCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsb3dlcl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSBOVUxMOworCXUxNiBpbmRleCA9IDA7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCBsb3dfYnVja2V0ID0gMCwgYnVja2V0LCBoaWdoX2J1Y2tldDsKKwl1MzIgbGFzdF9oYXNoOworCXU2NCBibGtubzsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHBfYmxrbm8sICZiaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiliaC0+Yl9kYXRhOworCWhpZ2hfYnVja2V0ID0gbGUxNl90b19jcHUoeGgtPnhoX251bV9idWNrZXRzKSAtIDE7CisKKwl3aGlsZSAobG93X2J1Y2tldCA8PSBoaWdoX2J1Y2tldCkgeworCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CisJCWJ1Y2tldCA9IChsb3dfYnVja2V0ICsgaGlnaF9idWNrZXQpIC8gMjsKKworCQlibGtubyA9IHBfYmxrbm8gKyBidWNrZXQgKiBibGtfcGVyX2J1Y2tldDsKKworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYmgtPmJfZGF0YTsKKwkJeGUgPSAmeGgtPnhoX2VudHJpZXNbMF07CisJCWlmIChuYW1lX2hhc2ggPCBsZTMyX3RvX2NwdSh4ZS0+eGVfbmFtZV9oYXNoKSkgeworCQkJaGlnaF9idWNrZXQgPSBidWNrZXQgLSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoZSBoYXNoIG9mIHRoZSBsYXN0IGVudHJ5IGluIG91cgorCQkgKiBidWNrZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNlYXJjaCBvbmUuIGZvciBhbiBlbXB0eQorCQkgKiBidWNrZXQsIHRoZSBsYXN0IG9uZSBpcyBhbHNvIHRoZSBmaXJzdCBvbmUuCisJCSAqLworCQlpZiAoeGgtPnhoX2NvdW50KQorCQkJeGUgPSAmeGgtPnhoX2VudHJpZXNbbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KSAtIDFdOworCisJCWxhc3RfaGFzaCA9IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpOworCisJCS8qIHJlY29yZCBsb3dlcl9iaCB3aGljaCBtYXkgYmUgdGhlIGluc2VydCBwbGFjZS4gKi8KKwkJYnJlbHNlKGxvd2VyX2JoKTsKKwkJbG93ZXJfYmggPSBiaDsKKwkJYmggPSBOVUxMOworCisJCWlmIChuYW1lX2hhc2ggPiBsZTMyX3RvX2NwdSh4ZS0+eGVfbmFtZV9oYXNoKSkgeworCQkJbG93X2J1Y2tldCA9IGJ1Y2tldCArIDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHRoZSBzZWFyY2hlZCB4YXR0ciBzaG91bGQgcmVzaWRlIGluIHRoaXMgYnVja2V0IGlmIGV4aXN0cy4gKi8KKwkJcmV0ID0gb2NmczJfZmluZF94ZV9pbl9idWNrZXQoaW5vZGUsIGxvd2VyX2JoLAorCQkJCQkgICAgICBuYW1lX2luZGV4LCBuYW1lLCBuYW1lX2hhc2gsCisJCQkJCSAgICAgICZpbmRleCwgJmZvdW5kKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBSZWNvcmQgdGhlIGJ1Y2tldCB3ZSBoYXZlIGZvdW5kLgorCSAqIFdoZW4gdGhlIHhhdHRyJ3MgaGFzaCB2YWx1ZSBpcyBpbiB0aGUgZ2FwIG9mIDIgYnVja2V0cywgd2Ugd2lsbAorCSAqIGFsd2F5cyBzZXQgaXQgdG8gdGhlIHByZXZpb3VzIGJ1Y2tldC4KKwkgKi8KKwlpZiAoIWxvd2VyX2JoKSB7CisJCS8qCisJCSAqIFdlIGNhbid0IGZpbmQgYW55IGJ1Y2tldCB3aG9zZSBmaXJzdCBuYW1lX2hhc2ggaXMgbGVzcworCQkgKiB0aGFuIHRoZSBmaW5kIG5hbWVfaGFzaC4KKwkJICovCisJCUJVR19PTihiaC0+Yl9ibG9ja25yICE9IHBfYmxrbm8pOworCQlsb3dlcl9iaCA9IGJoOworCQliaCA9IE5VTEw7CisJfQorCXhzLT5idWNrZXQuYmhzWzBdID0gbG93ZXJfYmg7CisJeHMtPmJ1Y2tldC54aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopCisJCQkJCXhzLT5idWNrZXQuYmhzWzBdLT5iX2RhdGE7CisJbG93ZXJfYmggPSBOVUxMOworCisJeHMtPmhlYWRlciA9IHhzLT5idWNrZXQueGg7CisJeHMtPmJhc2UgPSB4cy0+YnVja2V0LmJoc1swXS0+Yl9kYXRhOworCXhzLT5lbmQgPSB4cy0+YmFzZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCWlmIChmb3VuZCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGZvdW5kIHRoZSB4YXR0ciBlbnR5LCByZWFkIGFsbCB0aGUgYmxvY2tzIGluCisJCSAqIHRoaXMgYnVja2V0LgorCQkgKi8KKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIgKyAxLAorCQkJCQlibGtfcGVyX2J1Y2tldCAtIDEsICZ4cy0+YnVja2V0LmJoc1sxXSwKKwkJCQkJMCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJeHMtPmhlcmUgPSAmeHMtPmhlYWRlci0+eGhfZW50cmllc1tpbmRleF07CisJCW1sb2coMCwgImZpbmQgeGF0dHIgJXMgaW4gYnVja2V0ICVsbHUsIGVudHJ5ID0gJXVcbiIsIG5hbWUsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLCBpbmRleCk7CisJfSBlbHNlCisJCXJldCA9IC1FTk9EQVRBOworCitvdXQ6CisJYnJlbHNlKGJoKTsKKwlicmVsc2UobG93ZXJfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfaW5kZXhfYmxvY2tfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCisJCQkJCWludCBuYW1lX2luZGV4LAorCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXJvb3RfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4Yl9yb290ID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeGJfcm9vdC0+eHRfbGlzdDsKKwl1NjQgcF9ibGtubyA9IDA7CisJdTMyIGZpcnN0X2hhc2gsIG51bV9jbHVzdGVycyA9IDA7CisJdTMyIG5hbWVfaGFzaCA9IG9jZnMyX3hhdHRyX25hbWVfaGFzaChpbm9kZSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKKworCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwltbG9nKDAsICJmaW5kIHhhdHRyICVzLCBoYXNoID0gJXUsIGluZGV4ID0gJWQgaW4geGF0dHIgdHJlZVxuIiwKKwkgICAgIG5hbWUsIG5hbWVfaGFzaCwgbmFtZV9pbmRleCk7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfcmVjKGlub2RlLCBuYW1lX2hhc2gsICZwX2Jsa25vLCAmZmlyc3RfaGFzaCwKKwkJCQkgICZudW1fY2x1c3RlcnMsIGVsKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJQlVHX09OKHBfYmxrbm8gPT0gMCB8fCBudW1fY2x1c3RlcnMgPT0gMCB8fCBmaXJzdF9oYXNoID4gbmFtZV9oYXNoKTsKKworCW1sb2coMCwgImZpbmQgeGF0dHIgZXh0ZW50IHJlYyAldSBjbHVzdGVycyBmcm9tICVsbHUsIHRoZSBmaXJzdCBoYXNoICIKKwkgICAgICJpbiB0aGUgcmVjIGlzICV1XG4iLCBudW1fY2x1c3RlcnMsIHBfYmxrbm8sIGZpcnN0X2hhc2gpOworCisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIG5hbWVfaGFzaCwKKwkJCQkgICAgICBwX2Jsa25vLCBmaXJzdF9oYXNoLCBudW1fY2x1c3RlcnMsIHhzKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfaXRlcmF0ZV94YXR0cl9idWNrZXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHU2NCBibGtubywKKwkJCQkgICAgICAgdTMyIGNsdXN0ZXJzLAorCQkJCSAgICAgICB4YXR0cl9idWNrZXRfZnVuYyAqZnVuYywKKwkJCQkgICAgICAgdm9pZCAqcGFyYSkKK3sKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwlpbnQgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJdTMyIGJwYyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKTsKKwl1MzIgbnVtX2J1Y2tldHMgPSBjbHVzdGVycyAqIGJwYzsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0IGJ1Y2tldDsKKworCW1lbXNldCgmYnVja2V0LCAwLCBzaXplb2YoYnVja2V0KSk7CisKKwltbG9nKDAsICJpdGVyYXRpbmcgeGF0dHIgYnVja2V0cyBpbiAldSBjbHVzdGVycyBzdGFydGluZyBmcm9tICVsbHVcbiIsCisJICAgICBjbHVzdGVycywgYmxrbm8pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyssIGJsa25vICs9IGJsa19wZXJfYnVja2V0KSB7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywgYmxrX3Blcl9idWNrZXQsCisJCQkJCWJ1Y2tldC5iaHMsIDApOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJ1Y2tldC54aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYnVja2V0LmJoc1swXS0+Yl9kYXRhOworCQkvKgorCQkgKiBUaGUgcmVhbCBidWNrZXQgbnVtIGluIHRoaXMgc2VyaWVzIG9mIGJsb2NrcyBpcyBzdG9yZWQKKwkJICogaW4gdGhlIDFzdCBidWNrZXQuCisJCSAqLworCQlpZiAoaSA9PSAwKQorCQkJbnVtX2J1Y2tldHMgPSBsZTE2X3RvX2NwdShidWNrZXQueGgtPnhoX251bV9idWNrZXRzKTsKKworCQltbG9nKDAsICJpdGVyYXRpbmcgeGF0dHIgYnVja2V0ICVsbHUsIGZpcnN0IGhhc2ggJXVcbiIsIGJsa25vLAorCQkgICAgIGxlMzJfdG9fY3B1KGJ1Y2tldC54aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKTsKKwkJaWYgKGZ1bmMpIHsKKwkJCXJldCA9IGZ1bmMoaW5vZGUsICZidWNrZXQsIHBhcmEpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBibGtfcGVyX2J1Y2tldDsgaisrKQorCQkJYnJlbHNlKGJ1Y2tldC5iaHNbal0pOworCQltZW1zZXQoJmJ1Y2tldCwgMCwgc2l6ZW9mKGJ1Y2tldCkpOworCX0KKworb3V0OgorCWZvciAoaiA9IDA7IGogPCBibGtfcGVyX2J1Y2tldDsgaisrKQorCQlicmVsc2UoYnVja2V0LmJoc1tqXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9saXN0IHsKKwljaGFyICpidWZmZXI7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXNpemVfdCByZXN1bHQ7Cit9OworCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoLAorCQkJCQkgICAgIGludCBpbmRleCwKKwkJCQkJICAgICBpbnQgKmJsb2NrX29mZiwKKwkJCQkJICAgICBpbnQgKm5ld19vZmZzZXQpCit7CisJdTE2IG5hbWVfb2Zmc2V0OworCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5hbWVfb2Zmc2V0ID0gbGUxNl90b19jcHUoeGgtPnhoX2VudHJpZXNbaW5kZXhdLnhlX25hbWVfb2Zmc2V0KTsKKworCSpibG9ja19vZmYgPSBuYW1lX29mZnNldCA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkqbmV3X29mZnNldCA9IG5hbWVfb2Zmc2V0ICUgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfbGlzdF94YXR0cl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQsCisJCQkJICAgdm9pZCAqcGFyYSkKK3sKKwlpbnQgcmV0ID0gMCwgdHlwZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9saXN0ICp4bCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9saXN0ICopcGFyYTsKKwlpbnQgaSwgYmxvY2tfb2ZmLCBuZXdfb2Zmc2V0OworCWNvbnN0IGNoYXIgKnByZWZpeCwgKm5hbWU7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGxlMTZfdG9fY3B1KGJ1Y2tldC0+eGgtPnhoX2NvdW50KTsgaSsrKSB7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqZW50cnkgPSAmYnVja2V0LT54aC0+eGhfZW50cmllc1tpXTsKKwkJdHlwZSA9IG9jZnMyX3hhdHRyX2dldF90eXBlKGVudHJ5KTsKKwkJcHJlZml4ID0gb2NmczJfeGF0dHJfcHJlZml4KHR5cGUpOworCisJCWlmIChwcmVmaXgpIHsKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKKwkJCQkJCQkJYnVja2V0LT54aCwKKwkJCQkJCQkJaSwKKwkJCQkJCQkJJmJsb2NrX29mZiwKKwkJCQkJCQkJJm5ld19vZmZzZXQpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKworCQkJbmFtZSA9IChjb25zdCBjaGFyICopYnVja2V0LT5iaHNbYmxvY2tfb2ZmXS0+Yl9kYXRhICsKKwkJCQluZXdfb2Zmc2V0OworCQkJcmV0ID0gb2NmczJfeGF0dHJfbGlzdF9lbnRyeSh4bC0+YnVmZmVyLAorCQkJCQkJICAgICB4bC0+YnVmZmVyX3NpemUsCisJCQkJCQkgICAgICZ4bC0+cmVzdWx0LAorCQkJCQkJICAgICBwcmVmaXgsIG5hbWUsCisJCQkJCQkgICAgIGVudHJ5LT54ZV9uYW1lX2xlbik7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl90cmVlX2xpc3RfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4dCwKKwkJCQkJICAgICBjaGFyICpidWZmZXIsCisJCQkJCSAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmeHQtPnh0X2xpc3Q7CisJaW50IHJldCA9IDA7CisJdTMyIG5hbWVfaGFzaCA9IFVJTlRfTUFYLCBlX2Nwb3MgPSAwLCBudW1fY2x1c3RlcnMgPSAwOworCXU2NCBwX2Jsa25vID0gMDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9saXN0IHhsID0geworCQkuYnVmZmVyID0gYnVmZmVyLAorCQkuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZSwKKwkJLnJlc3VsdCA9IDAsCisJfTsKKworCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChuYW1lX2hhc2ggPiAwKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2dldF9yZWMoaW5vZGUsIG5hbWVfaGFzaCwgJnBfYmxrbm8sCisJCQkJCSAgJmVfY3BvcywgJm51bV9jbHVzdGVycywgZWwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2l0ZXJhdGVfeGF0dHJfYnVja2V0cyhpbm9kZSwgcF9ibGtubywgbnVtX2NsdXN0ZXJzLAorCQkJCQkJICBvY2ZzMl9saXN0X3hhdHRyX2J1Y2tldCwKKwkJCQkJCSAgJnhsKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZV9jcG9zID09IDApCisJCQlicmVhazsKKworCQluYW1lX2hhc2ggPSBlX2Nwb3MgLSAxOworCX0KKworCXJldCA9IHhsLnJlc3VsdDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNtcF94ZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbCA9IGEsICpyID0gYjsKKwl1MzIgbF9oYXNoID0gbGUzMl90b19jcHUobC0+eGVfbmFtZV9oYXNoKTsKKwl1MzIgcl9oYXNoID0gbGUzMl90b19jcHUoci0+eGVfbmFtZV9oYXNoKTsKKworCWlmIChsX2hhc2ggPiByX2hhc2gpCisJCXJldHVybiAxOworCWlmIChsX2hhc2ggPCByX2hhc2gpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3dhcF94ZSh2b2lkICphLCB2b2lkICpiLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmwgPSBhLCAqciA9IGIsIHRtcDsKKworCXRtcCA9ICpsOworCW1lbWNweShsLCByLCBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSk7CisJbWVtY3B5KHIsICZ0bXAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKK30KKworLyoKKyAqIFdoZW4gdGhlIG9jZnMyX3hhdHRyX2Jsb2NrIGlzIGZpbGxlZCB1cCwgbmV3IGJ1Y2tldCB3aWxsIGJlIGNyZWF0ZWQKKyAqIGFuZCBhbGwgdGhlIHhhdHRyIGVudHJpZXMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgbmV3IGJ1Y2tldC4KKyAqIE5vdGU6IHdlIG5lZWQgdG8gc29ydCB0aGUgZW50cmllcyBzaW5jZSB0aGV5IGFyZSBub3Qgc2F2ZWQgaW4gb3JkZXIKKyAqIGluIHRoZSBvY2ZzMl94YXR0cl9ibG9jay4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfY3BfeGF0dHJfYmxvY2tfdG9fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYmgsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqeGhfYmgsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCkKK3sKKwlpbnQgaSwgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXUxNiBvZmZzZXQsIHNpemUsIG9mZl9jaGFuZ2U7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KKwkJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeGJfYmgtPmJfZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4Yl94aCA9ICZ4Yi0+eGJfYXR0cnMueGJfaGVhZGVyOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KKwkJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXhoX2JoLT5iX2RhdGE7CisJdTE2IGNvdW50ID0gbGUxNl90b19jcHUoeGJfeGgtPnhoX2NvdW50KTsKKwljaGFyICp0YXJnZXQgPSB4aF9iaC0+Yl9kYXRhLCAqc3JjID0geGJfYmgtPmJfZGF0YTsKKworCW1sb2coMCwgImNwIHhhdHRyIGZyb20gYmxvY2sgJWxsdSB0byBidWNrZXQgJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeGJfYmgtPmJfYmxvY2tuciwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpeGhfYmgtPmJfYmxvY2tucik7CisKKwltZW1zZXQoeGhfYmgtPmJfZGF0YSwgMCwgYmxvY2tzaXplKTsKKwlpZiAoZGF0YV9iaCkKKwkJbWVtc2V0KGRhdGFfYmgtPmJfZGF0YSwgMCwgYmxvY2tzaXplKTsKKwkvKgorCSAqIFNpbmNlIHRoZSB4ZV9uYW1lX29mZnNldCBpcyBiYXNlZCBvbiBvY2ZzMl94YXR0cl9oZWFkZXIsCisJICogdGhlcmUgaXMgYSBvZmZzZXQgY2hhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNoYW5nZSBvZgorCSAqIG9jZnMyX3hhdHRyX2hlYWRlcidzIHBvc2l0aW9uLgorCSAqLworCW9mZl9jaGFuZ2UgPSBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2ssIHhiX2F0dHJzLnhiX2hlYWRlcik7CisJeGUgPSAmeGJfeGgtPnhoX2VudHJpZXNbY291bnQgLSAxXTsKKwlvZmZzZXQgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpICsgb2ZmX2NoYW5nZTsKKwlzaXplID0gYmxvY2tzaXplIC0gb2Zmc2V0OworCisJLyogY29weSBhbGwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMuICovCisJaWYgKGRhdGFfYmgpCisJCXRhcmdldCA9IGRhdGFfYmgtPmJfZGF0YTsKKwltZW1jcHkodGFyZ2V0ICsgb2Zmc2V0LCBzcmMgKyBvZmZzZXQsIHNpemUpOworCisJLyogSW5pdCBuZXcgaGVhZGVyIG5vdy4gKi8KKwl4aC0+eGhfY291bnQgPSB4Yl94aC0+eGhfY291bnQ7CisJeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYoMSk7CisJeGgtPnhoX25hbWVfdmFsdWVfbGVuID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSAtIHNpemUpOworCisJLyogY29weSBhbGwgdGhlIGVudHJpZXMuICovCisJdGFyZ2V0ID0geGhfYmgtPmJfZGF0YTsKKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyLCB4aF9lbnRyaWVzKTsKKwlzaXplID0gY291bnQgKiBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KTsKKwltZW1jcHkodGFyZ2V0ICsgb2Zmc2V0LCAoY2hhciAqKXhiX3hoICsgb2Zmc2V0LCBzaXplKTsKKworCS8qIENoYW5nZSB0aGUgeGUgb2Zmc2V0IGZvciBhbGwgdGhlIHhlIGJlY2F1c2Ugb2YgdGhlIG1vdmUuICovCisJb2ZmX2NoYW5nZSA9IE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFIC0gYmxvY2tzaXplICsKKwkJIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfYXR0cnMueGJfaGVhZGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfZW50cmllc1tpXS54ZV9uYW1lX29mZnNldCwgb2ZmX2NoYW5nZSk7CisKKwltbG9nKDAsICJjb3B5IGVudHJ5OiBzdGFydCA9ICV1LCBzaXplID0gJXUsIG9mZnNldF9jaGFuZ2UgPSAldVxuIiwKKwkgICAgIG9mZnNldCwgc2l6ZSwgb2ZmX2NoYW5nZSk7CisKKwlzb3J0KHRhcmdldCArIG9mZnNldCwgY291bnQsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpLAorCSAgICAgY21wX3hlLCBzd2FwX3hlKTsKK30KKworLyoKKyAqIEFmdGVyIHdlIG1vdmUgeGF0dHIgZnJvbSBibG9jayB0byBpbmRleCBidHJlZSwgd2UgaGF2ZSB0bworICogdXBkYXRlIG9jZnMyX3hhdHRyX3NlYXJjaCB0byB0aGUgbmV3IHhlIGFuZCBiYXNlLgorICoKKyAqIFdoZW4gdGhlIGVudHJ5IGlzIGluIHhhdHRyIGJsb2NrLCB4YXR0cl9iaCBpbmRpY2F0ZXMgdGhlIHN0b3JhZ2UgcGxhY2UuCisgKiBXaGlsZSBpZiB0aGUgZW50cnkgaXMgaW4gaW5kZXggYi10cmVlLCAiYnVja2V0IiBpbmRpY2F0ZXMgdGhlCisgKiByZWFsIHBsYWNlIG9mIHRoZSB4YXR0ci4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl91cGRhdGVfeGF0dHJfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmgpCit7CisJaW50IHJldCA9IDA7CisJY2hhciAqYnVmID0gb2xkX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICpvbGRfeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYnVmOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKm9sZF94aCA9ICZvbGRfeGItPnhiX2F0dHJzLnhiX2hlYWRlcjsKKwlpbnQgaSwgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKworCXhzLT5idWNrZXQuYmhzWzBdID0gbmV3X2JoOworCWdldF9iaChuZXdfYmgpOworCXhzLT5idWNrZXQueGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXhzLT5idWNrZXQuYmhzWzBdLT5iX2RhdGE7CisJeHMtPmhlYWRlciA9IHhzLT5idWNrZXQueGg7CisKKwl4cy0+YmFzZSA9IG5ld19iaC0+Yl9kYXRhOworCXhzLT5lbmQgPSB4cy0+YmFzZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCWlmICgheHMtPm5vdF9mb3VuZCkgeworCQlpZiAoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgIT0gYmxvY2tzaXplKSB7CisJCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwKKwkJCQkJeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tuciArIDEsCisJCQkJCWJsa19wZXJfYnVja2V0IC0gMSwgJnhzLT5idWNrZXQuYmhzWzFdLAorCQkJCQkwKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQkJaSA9IHhzLT5oZXJlIC0gb2xkX3hoLT54aF9lbnRyaWVzOworCQkJeHMtPmhlcmUgPSAmeHMtPmhlYWRlci0+eGhfZW50cmllc1tpXTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfY3JlYXRlX2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCit7CisJaW50IHJldCwgY3JlZGl0cyA9IE9DRlMyX1NVQkFMTE9DX0FMTE9DOworCXUzMiBiaXRfb2ZmLCBsZW47CisJdTY0IGJsa25vOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp4aF9iaCA9IE5VTEwsICpkYXRhX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoID0geHMtPnhhdHRyX2JoOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhiX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqeHI7CisJdTE2IHhiX2ZsYWdzID0gbGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKTsKKwl1MTYgYnBiID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisJbWxvZygwLCAiY3JlYXRlIHhhdHRyIGluZGV4IGJsb2NrIGZvciAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4Yl9iaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTih4Yl9mbGFncyAmIE9DRlMyX1hBVFRSX0lOREVYRUQpOworCisJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBYWFg6CisJICogV2UgY2FuIHVzZSB0aGlzIGxvY2sgZm9yIG5vdywgYW5kIG1heWJlIG1vdmUgdG8gYSBkZWRpY2F0ZWQgbXV0ZXgKKwkgKiBpZiBwZXJmb3JtYW5jZSBiZWNvbWVzIGEgcHJvYmxlbSBsYXRlci4KKwkgKi8KKwlkb3duX3dyaXRlKCZvaS0+aXBfYWxsb2Nfc2VtKTsKKworCS8qCisJICogMyBtb3JlIGNyZWRpdHMsIG9uZSBmb3IgeGF0dHIgYmxvY2sgdXBkYXRlLCBvbmUgZm9yIHRoZSAxc3QgYmxvY2sKKwkgKiBvZiB0aGUgbmV3IHhhdHRyIGJ1Y2tldCBhbmQgb25lIGZvciB0aGUgdmFsdWUvZGF0YS4KKwkgKi8KKwljcmVkaXRzICs9IDM7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3NlbTsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4Yl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgZGF0YV9hYywgMSwgJmJpdF9vZmYsICZsZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJLyoKKwkgKiBUaGUgYnVja2V0IG1heSBzcHJlYWQgaW4gbWFueSBibG9ja3MsIGFuZAorCSAqIHdlIHdpbGwgb25seSB0b3VjaCB0aGUgMXN0IGJsb2NrIGFuZCB0aGUgbGFzdCBibG9jaworCSAqIGluIHRoZSB3aG9sZSBidWNrZXQob25lIGZvciBlbnRyeSBhbmQgb25lIGZvciBkYXRhKS4KKwkgKi8KKwlibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgYml0X29mZik7CisKKwltbG9nKDAsICJhbGxvY2F0ZSAxIGNsdXN0ZXIgZnJvbSAlbGx1IHRvIHhhdHRyIGJsb2NrXG4iLCBibGtubyk7CisKKwl4aF9iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxrbm8pOworCWlmICgheGhfYmgpIHsKKwkJcmV0ID0gLUVJTzsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIHhoX2JoKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhoX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlpZiAoYnBiID4gMSkgeworCQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibGtubyArIGJwYiAtIDEpOworCQlpZiAoIWRhdGFfYmgpIHsKKwkJCXJldCA9IC1FSU87CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9jb21taXQ7CisJCX0KKworCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgZGF0YV9iaCk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisJfQorCisJb2NmczJfY3BfeGF0dHJfYmxvY2tfdG9fYnVja2V0KGlub2RlLCB4Yl9iaCwgeGhfYmgsIGRhdGFfYmgpOworCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhoX2JoKTsKKwlpZiAoZGF0YV9iaCkKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRhdGFfYmgpOworCisJb2NmczJfeGF0dHJfdXBkYXRlX3hhdHRyX3NlYXJjaChpbm9kZSwgeHMsIHhiX2JoLCB4aF9iaCk7CisKKwkvKiBDaGFuZ2UgZnJvbSBvY2ZzMl94YXR0cl9oZWFkZXIgdG8gb2NmczJfeGF0dHJfdHJlZV9yb290ICovCisJbWVtc2V0KCZ4Yi0+eGJfYXR0cnMsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJICAgICAgIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfYXR0cnMpKTsKKworCXhyID0gJnhiLT54Yl9hdHRycy54Yl9yb290OworCXhyLT54dF9jbHVzdGVycyA9IGNwdV90b19sZTMyKDEpOworCXhyLT54dF9sYXN0X2ViX2JsayA9IDA7CisJeHItPnh0X2xpc3QubF90cmVlX2RlcHRoID0gMDsKKwl4ci0+eHRfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYob2NmczJfeGF0dHJfcmVjc19wZXJfeGIoaW5vZGUtPmlfc2IpKTsKKwl4ci0+eHRfbGlzdC5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNigxKTsKKworCXhyLT54dF9saXN0LmxfcmVjc1swXS5lX2Nwb3MgPSAwOworCXhyLT54dF9saXN0LmxfcmVjc1swXS5lX2Jsa25vID0gY3B1X3RvX2xlNjQoYmxrbm8pOworCXhyLT54dF9saXN0LmxfcmVjc1swXS5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNigxKTsKKworCXhiLT54Yl9mbGFncyA9IGNwdV90b19sZTE2KHhiX2ZsYWdzIHwgT0NGUzJfWEFUVFJfSU5ERVhFRCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGJfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKK291dF9zZW06CisJdXBfd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOworCitvdXQ6CisJaWYgKGRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKworCWJyZWxzZSh4aF9iaCk7CisJYnJlbHNlKGRhdGFfYmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjbXBfeGVfb2Zmc2V0KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJY29uc3Qgc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICpsID0gYSwgKnIgPSBiOworCXUzMiBsX25hbWVfb2Zmc2V0ID0gbGUxNl90b19jcHUobC0+eGVfbmFtZV9vZmZzZXQpOworCXUzMiByX25hbWVfb2Zmc2V0ID0gbGUxNl90b19jcHUoci0+eGVfbmFtZV9vZmZzZXQpOworCisJaWYgKGxfbmFtZV9vZmZzZXQgPCByX25hbWVfb2Zmc2V0KQorCQlyZXR1cm4gMTsKKwlpZiAobF9uYW1lX29mZnNldCA+IHJfbmFtZV9vZmZzZXQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlZnJhZyBhIHhhdHRyIGJ1Y2tldCBpZiB3ZSBmaW5kIHRoYXQgdGhlIGJ1Y2tldCBoYXMgc29tZQorICogaG9sZXMgYmV0ZWVuIG5hbWUvdmFsdWUgcGFpcnMuCisgKiBXZSB3aWxsIG1vdmUgYWxsIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1Y2tldAorICogc28gdGhhdCB3ZSBjYW4gc3BhcmUgc29tZSBzcGFjZSBmb3IgaW5zZXJ0aW9uLgorICovCitzdGF0aWMgaW50IG9jZnMyX2RlZnJhZ194YXR0cl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCkKK3sKKwlpbnQgcmV0LCBpOworCXNpemVfdCBlbmQsIG9mZnNldCwgbGVuLCB2YWx1ZV9sZW47CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7CisJY2hhciAqZW50cmllcywgKmJ1ZiwgKmJ1Y2tldF9idWYgPSBOVUxMOworCXU2NCBibGtubyA9IGJ1Y2tldC0+YmhzWzBdLT5iX2Jsb2NrbnI7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCXUxNiB4aF9mcmVlX3N0YXJ0OworCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHM7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKworCWJocyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIGJsa19wZXJfYnVja2V0LAorCQkJR0ZQX05PRlMpOworCWlmICghYmhzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywgYmxrX3Blcl9idWNrZXQsIGJocywgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIG9wZXJhdGlvbiBtb3JlIGVmZmljaWVudCBhbmQgZ2VuZXJpYywKKwkgKiB3ZSBjb3B5IGFsbCB0aGUgYmxvY2tzIGludG8gYSBjb250aWd1b3VzIG1lbW9yeSBhbmQgZG8gdGhlCisJICogZGVmcmFnbWVudCB0aGVyZSwgc28gaWYgYW55dGhpbmcgaXMgZXJyb3IsIHdlIHdpbGwgbm90IHRvdWNoCisJICogdGhlIHJlYWwgYmxvY2suCisJICovCisJYnVja2V0X2J1ZiA9IGttYWxsb2MoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUsIEdGUF9OT0ZTKTsKKwlpZiAoIWJ1Y2tldF9idWYpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJYnVmID0gYnVja2V0X2J1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKywgYnVmICs9IGJsb2Nrc2l6ZSkKKwkJbWVtY3B5KGJ1ZiwgYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwgYmxrX3Blcl9idWNrZXQpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWhhbmRsZSA9IE5VTEw7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmhzW2ldLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIGNvbW1pdDsKKwkJfQorCX0KKworCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilidWNrZXRfYnVmOworCWVudHJpZXMgPSAoY2hhciAqKXhoLT54aF9lbnRyaWVzOworCXhoX2ZyZWVfc3RhcnQgPSBsZTE2X3RvX2NwdSh4aC0+eGhfZnJlZV9zdGFydCk7CisKKwltbG9nKDAsICJhZGp1c3QgeGF0dHIgYnVja2V0IGluICVsbHUsIGNvdW50ID0gJXUsICIKKwkgICAgICJ4aF9mcmVlX3N0YXJ0ID0gJXUsIHhoX25hbWVfdmFsdWVfbGVuID0gJXUuXG4iLAorCSAgICAgYmxrbm8sIGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCksIHhoX2ZyZWVfc3RhcnQsCisJICAgICBsZTE2X3RvX2NwdSh4aC0+eGhfbmFtZV92YWx1ZV9sZW4pKTsKKworCS8qCisJICogc29ydCBhbGwgdGhlIGVudHJpZXMgYnkgdGhlaXIgb2Zmc2V0LgorCSAqIHRoZSBsYXJnZXN0IHdpbGwgYmUgdGhlIGZpcnN0LCBzbyB0aGF0IHdlIGNhbgorCSAqIG1vdmUgdGhlbSB0byB0aGUgZW5kIG9uZSBieSBvbmUuCisJICovCisJc29ydChlbnRyaWVzLCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpLAorCSAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSksCisJICAgICBjbXBfeGVfb2Zmc2V0LCBzd2FwX3hlKTsKKworCS8qIE1vdmUgYWxsIG5hbWUvdmFsdWVzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1Y2tldC4gKi8KKwl4ZSA9IHhoLT54aF9lbnRyaWVzOworCWVuZCA9IE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOyBpKyssIHhlKyspIHsKKwkJb2Zmc2V0ID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKKwkJCXZhbHVlX2xlbiA9IE9DRlMyX1hBVFRSX1NJWkUoCisJCQkJCWxlNjRfdG9fY3B1KHhlLT54ZV92YWx1ZV9zaXplKSk7CisJCWVsc2UKKwkJCXZhbHVlX2xlbiA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwkJbGVuID0gT0NGUzJfWEFUVFJfU0laRSh4ZS0+eGVfbmFtZV9sZW4pICsgdmFsdWVfbGVuOworCisJCS8qCisJCSAqIFdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIG5hbWUvdmFsdWUgcGFpcgorCQkgKiBleGlzdCBpbiB0aGUgc2FtZSBibG9jay4gU28gYWRqdXN0IGVuZCB0bworCQkgKiB0aGUgcHJldmlvdXMgYmxvY2sgZW5kIGlmIG5lZWRlZC4KKwkJICovCisJCWlmICgoKGVuZCAtIGxlbikgLyBibG9ja3NpemUgIT0KKwkJCShlbmQgLSAxKSAvIGJsb2Nrc2l6ZSkpCisJCQllbmQgPSBlbmQgLSBlbmQgJSBibG9ja3NpemU7CisKKwkJaWYgKGVuZCA+IG9mZnNldCArIGxlbikgeworCQkJbWVtbW92ZShidWNrZXRfYnVmICsgZW5kIC0gbGVuLAorCQkJCWJ1Y2tldF9idWYgKyBvZmZzZXQsIGxlbik7CisJCQl4ZS0+eGVfbmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihlbmQgLSBsZW4pOworCQl9CisKKwkJbWxvZ19idWdfb25fbXNnKGVuZCA8IG9mZnNldCArIGxlbiwgIkRlZnJhZyBjaGVjayBmYWlsZWQgZm9yICIKKwkJCQkiYnVja2V0ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJCWVuZCAtPSBsZW47CisJfQorCisJbWxvZ19idWdfb25fbXNnKHhoX2ZyZWVfc3RhcnQgPiBlbmQsICJEZWZyYWcgY2hlY2sgZmFpbGVkIGZvciAiCisJCQkiYnVja2V0ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJaWYgKHhoX2ZyZWVfc3RhcnQgPT0gZW5kKQorCQlnb3RvIGNvbW1pdDsKKworCW1lbXNldChidWNrZXRfYnVmICsgeGhfZnJlZV9zdGFydCwgMCwgZW5kIC0geGhfZnJlZV9zdGFydCk7CisJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihlbmQpOworCisJLyogc29ydCB0aGUgZW50cmllcyBieSB0aGVpciBuYW1lX2hhc2guICovCisJc29ydChlbnRyaWVzLCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpLAorCSAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSksCisJICAgICBjbXBfeGUsIHN3YXBfeGUpOworCisJYnVmID0gYnVja2V0X2J1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKywgYnVmICs9IGJsb2Nrc2l6ZSkgeworCQltZW1jcHkoYmhzW2ldLT5iX2RhdGEsIGJ1ZiwgYmxvY2tzaXplKTsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoc1tpXSk7CisJfQorCitjb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKK291dDoKKworCWlmIChiaHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2UoYmhzW2ldKTsKKwl9CisJa2ZyZWUoYmhzKTsKKworCWtmcmVlKGJ1Y2tldF9idWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNb3ZlIGhhbGYgbnVtcyBvZiB0aGUgeGF0dHIgYnVja2V0IGluIHRoZSBwcmV2aW91cyBjbHVzdGVyIHRvIHRoaXMgbmV3CisgKiBjbHVzdGVyLiBXZSBvbmx5IHRvdWNoIHRoZSBsYXN0IGNsdXN0ZXIgb2YgdGhlIHByZXZpb3VzIGV4dGVuZCByZWNvcmQuCisgKgorICogZmlyc3RfYmggaXMgdGhlIGZpcnN0IGJ1ZmZlcl9oZWFkIG9mIGEgc2VyaWVzIG9mIGJ1Y2tldCBpbiB0aGUgc2FtZQorICogZXh0ZW50IHJlYyBhbmQgaGVhZGVyX2JoIGlzIHRoZSBoZWFkZXIgb2Ygb25lIGJ1Y2tldCBpbiB0aGlzIGNsdXN0ZXIuCisgKiBUaGV5IHdpbGwgYmUgdXBkYXRlZCBpZiB3ZSBtb3ZlIHRoZSBkYXRhIGhlYWRlcl9iaCBjb250YWlucyB0byB0aGUgbmV3CisgKiBjbHVzdGVyLiBmaXJzdF9oYXNoIHdpbGwgYmUgc2V0IGFzIHRoZSAxc3QgeGUncyBuYW1lX2hhc2ggb2YgdGhlIG5ldyBjbHVzdGVyLgorICovCitzdGF0aWMgaW50IG9jZnMyX212X3hhdHRyX2J1Y2tldF9jcm9zc19jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCisJCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJCSAgICAgICB1NjQgbmV3X2Jsa25vLAorCQkJCQkgICAgICAgdTY0IHByZXZfYmxrbm8sCisJCQkJCSAgICAgICB1MzIgbnVtX2NsdXN0ZXJzLAorCQkJCQkgICAgICAgdTMyICpmaXJzdF9oYXNoKQoreworCWludCBpLCByZXQsIGNyZWRpdHM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJaW50IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CisJaW50IG51bV9idWNrZXRzID0gb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpOworCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpvbGRfYmgsICpuZXdfYmgsICpwcmV2X2JoLCAqbmV3X2ZpcnN0X2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpuZXdfeGg7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKikoKCpmaXJzdF9iaCktPmJfZGF0YSk7CisKKwlCVUdfT04obGUxNl90b19jcHUoeGgtPnhoX251bV9idWNrZXRzKSA8IG51bV9idWNrZXRzKTsKKwlCVUdfT04oT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPT0gb3NiLT5zX2NsdXN0ZXJzaXplKTsKKworCXByZXZfYmggPSAqZmlyc3RfYmg7CisJZ2V0X2JoKHByZXZfYmgpOworCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilwcmV2X2JoLT5iX2RhdGE7CisKKwlwcmV2X2Jsa25vICs9IChudW1fY2x1c3RlcnMgLSAxKSAqIGJwYyArIGJwYyAvIDI7CisKKwltbG9nKDAsICJtb3ZlIGhhbGYgb2YgeGF0dHJzIGluIGNsdXN0ZXIgJWxsdSB0byAlbGx1XG4iLAorCSAgICAgcHJldl9ibGtubywgbmV3X2Jsa25vKTsKKworCS8qCisJICogV2UgbmVlZCB0byB1cGRhdGUgdGhlIDFzdCBoYWxmIG9mIHRoZSBuZXcgY2x1c3RlciBhbmQKKwkgKiAxIG1vcmUgZm9yIHRoZSB1cGRhdGUgb2YgdGhlIDFzdCBidWNrZXQgb2YgdGhlIHByZXZpb3VzCisJICogZXh0ZW50IHJlY29yZC4KKwkgKi8KKwljcmVkaXRzID0gYnBjIC8gMiArIDE7CisJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHByZXZfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYnBjIC8gMjsgaSsrLCBwcmV2X2Jsa25vKyssIG5ld19ibGtubysrKSB7CisJCW9sZF9iaCA9IG5ld19iaCA9IE5VTEw7CisJCW5ld19iaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsa25vKTsKKwkJaWYgKCFuZXdfYmgpIHsKKwkJCXJldCA9IC1FSU87CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBuZXdfYmgpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWxzZShuZXdfYmgpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBwcmV2X2Jsa25vLCAmb2xkX2JoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWxzZShuZXdfYmgpOworCQkJZ290byBvdXQ7CisJCX0KKworCQltZW1jcHkobmV3X2JoLT5iX2RhdGEsIG9sZF9iaC0+Yl9kYXRhLCBibG9ja3NpemUpOworCisJCWlmIChpID09IDApIHsKKwkJCW5ld194aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopbmV3X2JoLT5iX2RhdGE7CisJCQluZXdfeGgtPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYobnVtX2J1Y2tldHMgLyAyKTsKKworCQkJaWYgKGZpcnN0X2hhc2gpCisJCQkJKmZpcnN0X2hhc2ggPSBsZTMyX3RvX2NwdSgKKwkJCQkJbmV3X3hoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7CisJCQluZXdfZmlyc3RfYmggPSBuZXdfYmg7CisJCQlnZXRfYmgobmV3X2ZpcnN0X2JoKTsKKwkJfQorCisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBuZXdfYmgpOworCisJCWlmICgqaGVhZGVyX2JoID09IG9sZF9iaCkgeworCQkJYnJlbHNlKCpoZWFkZXJfYmgpOworCQkJKmhlYWRlcl9iaCA9IG5ld19iaDsKKwkJCWdldF9iaCgqaGVhZGVyX2JoKTsKKworCQkJYnJlbHNlKCpmaXJzdF9iaCk7CisJCQkqZmlyc3RfYmggPSBuZXdfZmlyc3RfYmg7CisJCQlnZXRfYmgoKmZpcnN0X2JoKTsKKwkJfQorCQlicmVsc2UobmV3X2JoKTsKKwkJYnJlbHNlKG9sZF9iaCk7CisJfQorCisJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbnVtX2J1Y2tldHMsIC0obnVtX2J1Y2tldHMgLyAyKSk7CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcHJldl9iaCk7CitvdXQ6CisJYnJlbHNlKHByZXZfYmgpOworCWJyZWxzZShuZXdfZmlyc3RfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICB1NjQgYmxrbm8sCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLAorCQkJCSAgIGludCBuZXcpCit7CisJaW50IHJldCA9IDA7CisJdTE2IGksIGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisJaWYgKCFuZXcpCisJCXJldHVybiBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgYmxrbm8sCisJCQkJCSBibGtfcGVyX2J1Y2tldCwgYmhzLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7CisJCWJoc1tpXSA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxrbm8gKyBpKTsKKwkJaWYgKGJoc1tpXSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUlPOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKwkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoc1tpXSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1vdmUgaGFsZiBudW0gb2YgdGhlIHhhdHRycyBpbiBvbGQgYnVja2V0KGJsaykgdG8gbmV3IGJ1Y2tldChuZXdfYmxrKS4KKyAqIGZpcnN0X2hhc2ggd2lsbCByZWNvcmQgdGhlIDFzdCBoYXNoIG9mIHRoZSBuZXcgYnVja2V0LgorICovCitzdGF0aWMgaW50IG9jZnMyX2hhbGZfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICB1NjQgYmxrLAorCQkJCSAgIHU2NCBuZXdfYmxrLAorCQkJCSAgIHUzMiAqZmlyc3RfaGFzaCwKKwkJCQkgICBpbnQgbmV3X2J1Y2tldF9oZWFkKQoreworCWludCByZXQsIGk7CisJdTE2IGNvdW50LCBzdGFydCwgbGVuLCBuYW1lX3ZhbHVlX2xlbiwgeGVfbGVuLCBuYW1lX29mZnNldDsKKwl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqc19iaHMsICoqdF9iaHMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCW1sb2coMCwgIm1vdmUgaGFsZiBvZiB4YXR0cnMgZnJvbSBidWNrZXQgJWxsdSB0byAlbGx1XG4iLAorCSAgICAgYmxrLCBuZXdfYmxrKTsKKworCXNfYmhzID0ga2NhbGxvYyhibGtfcGVyX2J1Y2tldCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMpOworCWlmICghc19iaHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIGJsaywgc19iaHMsIDApOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBzX2Joc1swXSwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXRfYmhzID0ga2NhbGxvYyhibGtfcGVyX2J1Y2tldCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMpOworCWlmICghdF9iaHMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIG5ld19ibGssIHRfYmhzLCBuZXdfYnVja2V0X2hlYWQpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB0X2Joc1tpXSwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBjb3B5IHRoZSB3aG9sZSBidWNrZXQgdG8gdGhlIG5ldyBmaXJzdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJbWVtY3B5KHRfYmhzW2ldLT5iX2RhdGEsIHNfYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisKKwkvKiB1cGRhdGUgdGhlIG5ldyBidWNrZXQuICovCisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXRfYmhzWzBdLT5iX2RhdGE7CisJY291bnQgPSBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOworCXN0YXJ0ID0gY291bnQgLyAyOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIG5hbWUvdmFsdWUgbGVuIGFuZCB4aF9mcmVlX3N0YXJ0IGZvcgorCSAqIHRoZSBvbGQgYnVja2V0IGZpcnN0LgorCSAqLworCW5hbWVfb2Zmc2V0ID0gT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkU7CisJbmFtZV92YWx1ZV9sZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBzdGFydDsgaSsrKSB7CisJCXhlID0gJnhoLT54aF9lbnRyaWVzW2ldOworCQl4ZV9sZW4gPSBPQ0ZTMl9YQVRUUl9TSVpFKHhlLT54ZV9uYW1lX2xlbik7CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCisJCQl4ZV9sZW4gKz0KKwkJCSAgIE9DRlMyX1hBVFRSX1NJWkUobGU2NF90b19jcHUoeGUtPnhlX3ZhbHVlX3NpemUpKTsKKwkJZWxzZQorCQkJeGVfbGVuICs9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwkJbmFtZV92YWx1ZV9sZW4gKz0geGVfbGVuOworCQlpZiAobGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KSA8IG5hbWVfb2Zmc2V0KQorCQkJbmFtZV9vZmZzZXQgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpOworCX0KKworCS8qCisJICogTm93IGJlZ2luIHRoZSBtb2RpZmljYXRpb24gdG8gdGhlIG5ldyBidWNrZXQuCisJICoKKwkgKiBJbiB0aGUgbmV3IGJ1Y2tldCwgV2UganVzdCBtb3ZlIHRoZSB4YXR0ciBlbnRyeSB0byB0aGUgYmVnaW5uaW5nCisJICogYW5kIGRvbid0IHRvdWNoIHRoZSBuYW1lL3ZhbHVlLiBTbyB0aGVyZSB3aWxsIGJlIHNvbWUgaG9sZXMgaW4gdGhlCisJICogYnVja2V0LCBhbmQgdGhleSB3aWxsIGJlIHJlbW92ZWQgd2hlbiBvY2ZzMl9kZWZyYWdfeGF0dHJfYnVja2V0IGlzCisJICogY2FsbGVkLgorCSAqLworCXhlID0gJnhoLT54aF9lbnRyaWVzW3N0YXJ0XTsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSAqIChjb3VudCAtIHN0YXJ0KTsKKwltbG9nKDAsICJtdiB4YXR0ciBlbnRyeSBsZW4gJWQgZnJvbSAlZCB0byAlZFxuIiwgbGVuLAorCSAgICAgKGludCkoKGNoYXIgKil4ZSAtIChjaGFyICopeGgpLAorCSAgICAgKGludCkoKGNoYXIgKil4aC0+eGhfZW50cmllcyAtIChjaGFyICopeGgpKTsKKwltZW1tb3ZlKChjaGFyICopeGgtPnhoX2VudHJpZXMsIChjaGFyICopeGUsIGxlbik7CisJeGUgPSAmeGgtPnhoX2VudHJpZXNbY291bnQgLSBzdGFydF07CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKiBzdGFydDsKKwltZW1zZXQoKGNoYXIgKil4ZSwgMCwgbGVuKTsKKworCWxlMTZfYWRkX2NwdSgmeGgtPnhoX2NvdW50LCAtc3RhcnQpOworCWxlMTZfYWRkX2NwdSgmeGgtPnhoX25hbWVfdmFsdWVfbGVuLCAtbmFtZV92YWx1ZV9sZW4pOworCisJLyogQ2FsY3VsYXRlIHhoX2ZyZWVfc3RhcnQgZm9yIHRoZSBuZXcgYnVja2V0LiAqLworCXhoLT54aF9mcmVlX3N0YXJ0ID0gY3B1X3RvX2xlMTYoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOyBpKyspIHsKKwkJeGUgPSAmeGgtPnhoX2VudHJpZXNbaV07CisJCXhlX2xlbiA9IE9DRlMyX1hBVFRSX1NJWkUoeGUtPnhlX25hbWVfbGVuKTsKKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKKwkJCXhlX2xlbiArPQorCQkJICAgT0NGUzJfWEFUVFJfU0laRShsZTY0X3RvX2NwdSh4ZS0+eGVfdmFsdWVfc2l6ZSkpOworCQllbHNlCisJCQl4ZV9sZW4gKz0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCQlpZiAobGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KSA8CisJCSAgICBsZTE2X3RvX2NwdSh4aC0+eGhfZnJlZV9zdGFydCkpCisJCQl4aC0+eGhfZnJlZV9zdGFydCA9IHhlLT54ZV9uYW1lX29mZnNldDsKKwl9CisKKwkvKiBzZXQgeGgtPnhoX251bV9idWNrZXRzIGZvciB0aGUgbmV3IHhoLiAqLworCWlmIChuZXdfYnVja2V0X2hlYWQpCisJCXhoLT54aF9udW1fYnVja2V0cyA9IGNwdV90b19sZTE2KDEpOworCWVsc2UKKwkJeGgtPnhoX251bV9idWNrZXRzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7CisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB0X2Joc1tpXSk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQorCisJLyogc3RvcmUgdGhlIGZpcnN0X2hhc2ggb2YgdGhlIG5ldyBidWNrZXQuICovCisJaWYgKGZpcnN0X2hhc2gpCisJCSpmaXJzdF9oYXNoID0gbGUzMl90b19jcHUoeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKKworCS8qCisJICogTm93IG9ubHkgdXBkYXRlIHRoZSAxc3QgYmxvY2sgb2YgdGhlIG9sZCBidWNrZXQuCisJICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZW50cnkgaGFzIGJlZW4gc29ydGVkIGFscmVhZHkgYWJvdmUuCisJICovCisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXNfYmhzWzBdLT5iX2RhdGE7CisJbWVtc2V0KCZ4aC0+eGhfZW50cmllc1tzdGFydF0sIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpICogKGNvdW50IC0gc3RhcnQpKTsKKwl4aC0+eGhfY291bnQgPSBjcHVfdG9fbGUxNihzdGFydCk7CisJeGgtPnhoX2ZyZWVfc3RhcnQgPSBjcHVfdG9fbGUxNihuYW1lX29mZnNldCk7CisJeGgtPnhoX25hbWVfdmFsdWVfbGVuID0gY3B1X3RvX2xlMTYobmFtZV92YWx1ZV9sZW4pOworCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHNfYmhzWzBdKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlpZiAoc19iaHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2Uoc19iaHNbaV0pOworCX0KKwlrZnJlZShzX2Jocyk7CisKKwlpZiAodF9iaHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCisJCQlicmVsc2UodF9iaHNbaV0pOworCX0KKwlrZnJlZSh0X2Jocyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29weSB4YXR0ciBmcm9tIG9uZSBidWNrZXQgdG8gYW5vdGhlciBidWNrZXQuCisgKgorICogVGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBqb3VybmFsIHRyYW5zYWN0aW9uCisgKiBoYXMgZW5vdWdoIHNwYWNlIGZvciBqb3VybmFsaW5nLgorICovCitzdGF0aWMgaW50IG9jZnMyX2NwX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSB1NjQgc19ibGtubywKKwkJCQkgdTY0IHRfYmxrbm8sCisJCQkJIGludCB0X2lzX25ldykKK3sKKwlpbnQgcmV0LCBpOworCWludCBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnNfYmhzLCAqKnRfYmhzID0gTlVMTDsKKworCUJVR19PTihzX2Jsa25vID09IHRfYmxrbm8pOworCisJbWxvZygwLCAiY3AgYnVja2V0ICVsbHUgdG8gJWxsdSwgdGFyZ2V0IGlzICVkXG4iLAorCSAgICAgc19ibGtubywgdF9ibGtubywgdF9pc19uZXcpOworCisJc19iaHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBibGtfcGVyX2J1Y2tldCwKKwkJCUdGUF9OT0ZTKTsKKwlpZiAoIXNfYmhzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGlub2RlLCBzX2Jsa25vLCBzX2JocywgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwl0X2JocyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIGJsa19wZXJfYnVja2V0LAorCQkJR0ZQX05PRlMpOworCWlmICghdF9iaHMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIHRfYmxrbm8sIHRfYmhzLCB0X2lzX25ldyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB0X2Joc1tpXSwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKKwkJbWVtY3B5KHRfYmhzW2ldLT5iX2RhdGEsIHNfYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB0X2Joc1tpXSk7CisJfQorCitvdXQ6CisJaWYgKHNfYmhzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQorCQkJYnJlbHNlKHNfYmhzW2ldKTsKKwl9CisJa2ZyZWUoc19iaHMpOworCisJaWYgKHRfYmhzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQorCQkJYnJlbHNlKHRfYmhzW2ldKTsKKwl9CisJa2ZyZWUodF9iaHMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENvcHkgb25lIHhhdHRyIGNsdXN0ZXIgZnJvbSBzcmNfYmxrIHRvIHRvX2Jsay4KKyAqIFRoZSB0b19ibGsgd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGJ1Y2tldCBoZWFkZXIgb2YgdGhlIGNsdXN0ZXIsIHNvIGl0cworICogeGhfbnVtX2J1Y2tldHMgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB0aGUgYnVja2V0IG51bSBpbiB0aGUgY2x1c3Rlci4KKyAqLworc3RhdGljIGludCBvY2ZzMl9jcF94YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCwKKwkJCQkgIHU2NCBzcmNfYmxrLAorCQkJCSAgdTY0IHRvX2JsaywKKwkJCQkgIHUzMiAqZmlyc3RfaGFzaCkKK3sKKwlpbnQgaSwgcmV0LCBjcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWludCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCWludCBudW1fYnVja2V0cyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIob3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKKwl1NjQgdG9fYmxrX3N0YXJ0ID0gdG9fYmxrOworCisJbWxvZygwLCAiY3AgeGF0dHJzIGZyb20gY2x1c3RlciAlbGx1IHRvICVsbHVcbiIsIHNyY19ibGssIHRvX2Jsayk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBuZXcgY2x1c3RlciBhbmQgMSBtb3JlIGZvciB0aGUgdXBkYXRlIG9mCisJICogdGhlIDFzdCBidWNrZXQgb2YgdGhlIHByZXZpb3VzIGV4dGVudCByZWMuCisJICovCisJY3JlZGl0cyA9IGJwYyArIDE7CisJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZpcnN0X2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyspIHsKKwkJcmV0ID0gb2NmczJfY3BfeGF0dHJfYnVja2V0KGlub2RlLCBoYW5kbGUsCisJCQkJCSAgICBzcmNfYmxrLCB0b19ibGssIDEpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNyY19ibGsgKz0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCQl0b19ibGsgKz0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCX0KKworCS8qIHVwZGF0ZSB0aGUgb2xkIGJ1Y2tldCBoZWFkZXIuICovCisJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWZpcnN0X2JoLT5iX2RhdGE7CisJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbnVtX2J1Y2tldHMsIC1udW1fYnVja2V0cyk7CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZmlyc3RfYmgpOworCisJLyogdXBkYXRlIHRoZSBuZXcgYnVja2V0IGhlYWRlci4gKi8KKwlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCB0b19ibGtfc3RhcnQsICZiaCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiliaC0+Yl9kYXRhOworCXhoLT54aF9udW1fYnVja2V0cyA9IGNwdV90b19sZTE2KG51bV9idWNrZXRzKTsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisKKwlpZiAoZmlyc3RfaGFzaCkKKwkJKmZpcnN0X2hhc2ggPSBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOworb3V0OgorCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1vdmUgaGFsZiBvZiB0aGUgeGF0dHJzIGluIHRoaXMgY2x1c3RlciB0byB0aGUgbmV3IGNsdXN0ZXIuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGJ1Y2tldCBzaXplID09IGNsdXN0ZXIgc2l6ZS4KKyAqIE90aGVyd2lzZSBvY2ZzMl9tdl94YXR0cl9idWNrZXRfY3Jvc3NfY2x1c3RlciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IG9jZnMyX2hhbGZfeGF0dHJfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICB1NjQgcHJldl9ibGssCisJCQkJICAgIHU2NCBuZXdfYmxrLAorCQkJCSAgICB1MzIgKmZpcnN0X2hhc2gpCit7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCByZXQsIGNyZWRpdHMgPSAyICogYmxrX3Blcl9idWNrZXQ7CisKKwlCVUdfT04oT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPCBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemUpOworCisJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogTW92ZSBoYWxmIG9mIHRoZSB4YXR0ciBpbiBzdGFydF9ibGsgdG8gdGhlIG5leHQgYnVja2V0LiAqLworCXJldHVybiAgb2NmczJfaGFsZl94YXR0cl9idWNrZXQoaW5vZGUsIGhhbmRsZSwgcHJldl9ibGssCisJCQkJCW5ld19ibGssIGZpcnN0X2hhc2gsIDEpOworfQorCisvKgorICogTW92ZSBzb21lIHhhdHRycyBmcm9tIHRoZSBvbGQgY2x1c3RlciB0byB0aGUgbmV3IG9uZSBzaW5jZSB0aGV5IGFyZSBub3QKKyAqIGNvbnRpZ3VvdXMgaW4gb2NmczIgeGF0dHIgdHJlZS4KKyAqCisgKiBuZXdfYmxrIHN0YXJ0cyBhIG5ldyBzZXBhcmF0ZSBjbHVzdGVyLCBhbmQgd2Ugd2lsbCBtb3ZlIHNvbWUgeGF0dHJzIGZyb20KKyAqIHByZXZfYmxrIHRvIGl0LiB2X3N0YXJ0IHdpbGwgYmUgc2V0IGFzIHRoZSBmaXJzdCBuYW1lIGhhc2ggdmFsdWUgaW4gdGhpcworICogbmV3IGNsdXN0ZXIgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBlX2Nwb3MgZHVyaW5nIHRyZWUgaW5zZXJ0aW9uIGFuZAorICogZG9uJ3QgY29sbGlkZSB3aXRoIG91ciBvcmlnaW5hbCBiLXRyZWUgb3BlcmF0aW9ucy4gZmlyc3RfYmggYW5kIGhlYWRlcl9iaAorICogd2lsbCBhbHNvIGJlIHVwZGF0ZWQgc2luY2UgdGhleSB3aWxsIGJlIHVzZWQgaW4gb2NmczJfZXh0ZW5kX3hhdHRyX2J1Y2tldAorICogdG8gZXh0ZW5kIHRoZSBpbnNlcnQgYnVja2V0LgorICoKKyAqIFRoZSBwcm9ibGVtIGlzIGhvdyBtdWNoIHhhdHRyIHNob3VsZCB3ZSBtb3ZlIHRvIHRoZSBuZXcgb25lIGFuZCB3aGVuIHNob3VsZAorICogd2UgdXBkYXRlIGZpcnN0X2JoIGFuZCBoZWFkZXJfYmg/CisgKiAxLiBJZiBjbHVzdGVyIHNpemUgPiBidWNrZXQgc2l6ZSwgdGhhdCBtZWFucyB0aGUgcHJldmlvdXMgY2x1c3RlciBoYXMgbW9yZQorICogICAgdGhhbiAxIGJ1Y2tldCwgc28ganVzdCBtb3ZlIGhhbGYgbnVtcyBvZiBidWNrZXQgaW50byB0aGUgbmV3IGNsdXN0ZXIgYW5kCisgKiAgICB1cGRhdGUgdGhlIGZpcnN0X2JoIGFuZCBoZWFkZXJfYmggaWYgdGhlIGluc2VydCBidWNrZXQgaGFzIGJlZW4gbW92ZWQKKyAqICAgIHRvIHRoZSBuZXcgY2x1c3Rlci4KKyAqIDIuIElmIGNsdXN0ZXJfc2l6ZSA9PSBidWNrZXRfc2l6ZToKKyAqICAgIGEpIElmIHRoZSBwcmV2aW91cyBleHRlbnQgcmVjIGhhcyBtb3JlIHRoYW4gb25lIGNsdXN0ZXIgYW5kIHRoZSBpbnNlcnQKKyAqICAgICAgIHBsYWNlIGlzbid0IGluIHRoZSBsYXN0IGNsdXN0ZXIsIGNvcHkgdGhlIGVudGlyZSBsYXN0IGNsdXN0ZXIgdG8gdGhlCisgKiAgICAgICBuZXcgb25lLiBUaGlzIHRpbWUsIHdlIGRvbid0IG5lZWQgdG8gdXBhdGUgdGhlIGZpcnN0X2JoIGFuZCBoZWFkZXJfYmgKKyAqICAgICAgIHNpbmNlIHRoZXkgd2lsbCBub3QgYmUgbW92ZWQgaW50byB0aGUgbmV3IGNsdXN0ZXIuCisgKiAgICBiKSBPdGhlcndpc2UsIG1vdmUgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSB4YXR0cnMgaW4gdGhlIGxhc3QgY2x1c3RlciBpbnRvCisgKiAgICAgICB0aGUgbmV3IG9uZS4gQW5kIHdlIHNldCB0aGUgZXh0ZW5kIGZsYWcgdG8gemVybyBpZiB0aGUgaW5zZXJ0IHBsYWNlIGlzCisgKiAgICAgICBtb3ZlZCBpbnRvIHRoZSBuZXcgYWxsb2NhdGVkIGNsdXN0ZXIgc2luY2Ugbm8gZXh0ZW5kIGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGludCBvY2ZzMl9hZGp1c3RfeGF0dHJfY3Jvc3NfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmZpcnN0X2JoLAorCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZGVyX2JoLAorCQkJCQkgICAgdTY0IG5ld19ibGssCisJCQkJCSAgICB1NjQgcHJldl9ibGssCisJCQkJCSAgICB1MzIgcHJldl9jbHVzdGVycywKKwkJCQkJICAgIHUzMiAqdl9zdGFydCwKKwkJCQkJICAgIGludCAqZXh0ZW5kKQoreworCWludCByZXQgPSAwOworCWludCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCisJbWxvZygwLCAiYWRqdXN0IHhhdHRycyBmcm9tIGNsdXN0ZXIgJWxsdSBsZW4gJXUgdG8gJWxsdVxuIiwKKwkgICAgIHByZXZfYmxrLCBwcmV2X2NsdXN0ZXJzLCBuZXdfYmxrKTsKKworCWlmIChvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkgPiAxKQorCQlyZXQgPSBvY2ZzMl9tdl94YXR0cl9idWNrZXRfY3Jvc3NfY2x1c3Rlcihpbm9kZSwKKwkJCQkJCQkgIGhhbmRsZSwKKwkJCQkJCQkgIGZpcnN0X2JoLAorCQkJCQkJCSAgaGVhZGVyX2JoLAorCQkJCQkJCSAgbmV3X2JsaywKKwkJCQkJCQkgIHByZXZfYmxrLAorCQkJCQkJCSAgcHJldl9jbHVzdGVycywKKwkJCQkJCQkgIHZfc3RhcnQpOworCWVsc2UgeworCQl1NjQgbGFzdF9ibGsgPSBwcmV2X2JsayArIGJwYyAqIChwcmV2X2NsdXN0ZXJzIC0gMSk7CisKKwkJaWYgKHByZXZfY2x1c3RlcnMgPiAxICYmICgqaGVhZGVyX2JoKS0+Yl9ibG9ja25yICE9IGxhc3RfYmxrKQorCQkJcmV0ID0gb2NmczJfY3BfeGF0dHJfY2x1c3Rlcihpbm9kZSwgaGFuZGxlLCAqZmlyc3RfYmgsCisJCQkJCQkgICAgIGxhc3RfYmxrLCBuZXdfYmxrLAorCQkJCQkJICAgICB2X3N0YXJ0KTsKKwkJZWxzZSB7CisJCQlyZXQgPSBvY2ZzMl9oYWxmX3hhdHRyX2NsdXN0ZXIoaW5vZGUsIGhhbmRsZSwKKwkJCQkJCSAgICAgICBsYXN0X2JsaywgbmV3X2JsaywKKwkJCQkJCSAgICAgICB2X3N0YXJ0KTsKKworCQkJaWYgKCgqaGVhZGVyX2JoKS0+Yl9ibG9ja25yID09IGxhc3RfYmxrICYmIGV4dGVuZCkKKwkJCQkqZXh0ZW5kID0gMDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBZGQgYSBuZXcgY2x1c3RlciBmb3IgeGF0dHIgc3RvcmFnZS4KKyAqCisgKiBJZiB0aGUgbmV3IGNsdXN0ZXIgaXMgY29udGlndW91cyB3aXRoIHRoZSBwcmV2aW91cyBvbmUsIGl0IHdpbGwgYmUKKyAqIGFwcGVuZGVkIHRvIHRoZSBzYW1lIGV4dGVudCByZWNvcmQsIGFuZCBudW1fY2x1c3RlcnMgd2lsbCBiZSB1cGRhdGVkLgorICogSWYgbm90LCB3ZSB3aWxsIGluc2VydCBhIG5ldyBleHRlbnQgZm9yIGl0IGFuZCBtb3ZlIHNvbWUgeGF0dHJzIGluCisgKiB0aGUgbGFzdCBjbHVzdGVyIGludG8gdGhlIG5ldyBhbGxvY2F0ZWQgb25lLgorICogV2UgYWxzbyBuZWVkIHRvIGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgYSBidHJlZSBsZWFmLCBvdGhlcndpc2Ugd2UnbGwKKyAqIGxvc2UgdGhlIGJlbmVmaXRzIG9mIGhhc2hpbmcgYmVjYXVzZSB3ZSdsbCBoYXZlIHRvIHNlYXJjaCBsYXJnZSBsZWF2ZXMuCisgKiBTbyBub3cgdGhlIG1heGltdW0gc2l6ZSBpcyBPQ0ZTMl9NQVhfWEFUVFJfVFJFRV9MRUFGX1NJWkUob3IgY2x1c3RlcnNpemUsCisgKiBpZiBpdCdzIGJpZ2dlcikuCisgKgorICogZmlyc3RfYmggaXMgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBwcmV2aW91cyBleHRlbnQgcmVjIGFuZCBoZWFkZXJfYmgKKyAqIGluZGljYXRlcyB0aGUgYnVja2V0IHdlIHdpbGwgaW5zZXJ0IHRoZSBuZXcgeGF0dHJzLiBUaGV5IHdpbGwgYmUgdXBkYXRlZAorICogd2hlbiB0aGUgaGVhZGVyX2JoIGlzIG1vdmVkIGludG8gdGhlIG5ldyBjbHVzdGVyLgorICovCitzdGF0aWMgaW50IG9jZnMyX2FkZF9uZXdfeGF0dHJfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmZpcnN0X2JoLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkZXJfYmgsCisJCQkJICAgICAgIHUzMiAqbnVtX2NsdXN0ZXJzLAorCQkJCSAgICAgICB1MzIgcHJldl9jcG9zLAorCQkJCSAgICAgICB1NjQgcHJldl9ibGtubywKKwkJCQkgICAgICAgaW50ICpleHRlbmQpCit7CisJaW50IHJldCwgY3JlZGl0czsKKwl1MTYgYnBjID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKKwl1MzIgcHJldl9jbHVzdGVycyA9ICpudW1fY2x1c3RlcnM7CisJdTMyIGNsdXN0ZXJzX3RvX2FkZCA9IDEsIGJpdF9vZmYsIG51bV9iaXRzLCB2X3N0YXJ0ID0gMDsKKwl1NjQgYmxvY2s7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisKKwltbG9nKDAsICJBZGQgbmV3IHhhdHRyIGNsdXN0ZXIgZm9yICVsbHUsIHByZXZpb3VzIHhhdHRyIGhhc2ggPSAldSwgIgorCSAgICAgInByZXZpb3VzIHhhdHRyIGJsa25vID0gJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCSAgICAgcHJldl9jcG9zLCBwcmV2X2Jsa25vKTsKKworCW9jZnMyX2luaXRfeGF0dHJfdHJlZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCByb290X2JoKTsKKworCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgJmV0LCBjbHVzdGVyc190b19hZGQsIDAsCisJCQkJICAgICZkYXRhX2FjLCAmbWV0YV9hYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMob3NiLT5zYiwgZXQuZXRfcm9vdF9lbCwKKwkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQloYW5kbGUgPSBOVUxMOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGxlYXZlOworCX0KKworCXJldCA9IF9fb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsCisJCQkJICAgICBjbHVzdGVyc190b19hZGQsICZiaXRfb2ZmLCAmbnVtX2JpdHMpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlCVUdfT04obnVtX2JpdHMgPiBjbHVzdGVyc190b19hZGQpOworCisJYmxvY2sgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Mob3NiLT5zYiwgYml0X29mZik7CisJbWxvZygwLCAiQWxsb2NhdGluZyAldSBjbHVzdGVycyBhdCBibG9jayAldSBmb3IgeGF0dHIgaW4gaW5vZGUgJWxsdVxuIiwKKwkgICAgIG51bV9iaXRzLCBiaXRfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisKKwlpZiAocHJldl9ibGtubyArIHByZXZfY2x1c3RlcnMgKiBicGMgPT0gYmxvY2sgJiYKKwkgICAgKHByZXZfY2x1c3RlcnMgKyBudW1fYml0cykgPDwgb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMgPD0KKwkgICAgIE9DRlMyX01BWF9YQVRUUl9UUkVFX0xFQUZfU0laRSkgeworCQkvKgorCQkgKiBJZiB0aGlzIGNsdXN0ZXIgaXMgY29udGlndW91cyB3aXRoIHRoZSBvbGQgb25lIGFuZAorCQkgKiBhZGRpbmcgdGhpcyBuZXcgY2x1c3Rlciwgd2UgZG9uJ3Qgc3VycGFzcyB0aGUgbGltaXQgb2YKKwkJICogT0NGUzJfTUFYX1hBVFRSX1RSRUVfTEVBRl9TSVpFLCBjb29sLiBXZSB3aWxsIGxldCBpdCBiZQorCQkgKiBpbml0aWFsaXplZCBhbmQgdXNlZCBsaWtlIG90aGVyIGJ1Y2tldHMgaW4gdGhlIHByZXZpb3VzCisJCSAqIGNsdXN0ZXIuCisJCSAqIFNvIGFkZCBpdCBhcyBhIGNvbnRpZ3VvdXMgb25lLiBUaGUgY2FsbGVyIHdpbGwgaGFuZGxlCisJCSAqIGl0cyBpbml0IHByb2Nlc3MuCisJCSAqLworCQl2X3N0YXJ0ID0gcHJldl9jcG9zICsgcHJldl9jbHVzdGVyczsKKwkJKm51bV9jbHVzdGVycyA9IHByZXZfY2x1c3RlcnMgKyBudW1fYml0czsKKwkJbWxvZygwLCAiQWRkIGNvbnRpZ3VvdXMgJXUgY2x1c3RlcnMgdG8gcHJldmlvdXMgZXh0ZW50IHJlYy5cbiIsCisJCSAgICAgbnVtX2JpdHMpOworCX0gZWxzZSB7CisJCXJldCA9IG9jZnMyX2FkanVzdF94YXR0cl9jcm9zc19jbHVzdGVyKGlub2RlLAorCQkJCQkJICAgICAgIGhhbmRsZSwKKwkJCQkJCSAgICAgICBmaXJzdF9iaCwKKwkJCQkJCSAgICAgICBoZWFkZXJfYmgsCisJCQkJCQkgICAgICAgYmxvY2ssCisJCQkJCQkgICAgICAgcHJldl9ibGtubywKKwkJCQkJCSAgICAgICBwcmV2X2NsdXN0ZXJzLAorCQkJCQkJICAgICAgICZ2X3N0YXJ0LAorCQkJCQkJICAgICAgIGV4dGVuZCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gbGVhdmU7CisJCX0KKwl9CisKKwlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzIDwgY3JlZGl0cykgeworCQkvKgorCQkgKiBUaGUgam91cm5hbCBoYXMgYmVlbiByZXN0YXJ0ZWQgYmVmb3JlLCBhbmQgZG9uJ3QKKwkJICogaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBpbnNlcnRpb24sIHNvIGV4dGVuZCBpdAorCQkgKiBoZXJlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gbGVhdmU7CisJCX0KKwl9CisJbWxvZygwLCAiSW5zZXJ0ICV1IGNsdXN0ZXJzIGF0IGJsb2NrICVsbHUgZm9yIHhhdHRyIGF0ICV1XG4iLAorCSAgICAgbnVtX2JpdHMsIGJsb2NrLCB2X3N0YXJ0KTsKKwlyZXQgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgJmV0LCB2X3N0YXJ0LCBibG9jaywKKwkJCQkgIG51bV9iaXRzLCAwLCBtZXRhX2FjKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHJvb3RfYmgpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBsZWF2ZTsKKwl9CisKK2xlYXZlOgorCWlmIChoYW5kbGUpCisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisJaWYgKGRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEV4dGVuZCBhIG5ldyB4YXR0ciBidWNrZXQgYW5kIG1vdmUgeGF0dHJzIHRvIHRoZSBlbmQgb25lIGJ5IG9uZSB1bnRpbAorICogV2UgbWVldCB3aXRoIHN0YXJ0X2JoLiBPbmx5IG1vdmUgaGFsZiBvZiB0aGUgeGF0dHJzIHRvIHRoZSBidWNrZXQgYWZ0ZXIgaXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCwKKwkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqc3RhcnRfYmgsCisJCQkJICAgICB1MzIgbnVtX2NsdXN0ZXJzKQoreworCWludCByZXQsIGNyZWRpdHM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCXU2NCBzdGFydF9ibGsgPSBzdGFydF9iaC0+Yl9ibG9ja25yLCBlbmRfYmxrOworCXUzMiBudW1fYnVja2V0cyA9IG51bV9jbHVzdGVycyAqIG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIob3NiKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmZpcnN0X3hoID0KKwkJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWZpcnN0X2JoLT5iX2RhdGE7CisJdTE2IGJ1Y2tldCA9IGxlMTZfdG9fY3B1KGZpcnN0X3hoLT54aF9udW1fYnVja2V0cyk7CisKKwltbG9nKDAsICJleHRlbmQgeGF0dHIgYnVja2V0IGluICVsbHUsIHhhdHRyIGV4dGVuZCByZWMgc3RhcnRpbmcgIgorCSAgICAgImZyb20gJWxsdSwgbGVuID0gJXVcbiIsIHN0YXJ0X2JsaywKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZmlyc3RfYmgtPmJfYmxvY2tuciwgbnVtX2NsdXN0ZXJzKTsKKworCUJVR19PTihidWNrZXQgPj0gbnVtX2J1Y2tldHMpOworCisJZW5kX2JsayA9IGZpcnN0X2JoLT5iX2Jsb2NrbnIgKyAoYnVja2V0IC0gMSkgKiBibGtfcGVyX2J1Y2tldDsKKworCS8qCisJICogV2Ugd2lsbCB0b3VjaCBhbGwgdGhlIGJ1Y2tldHMgYWZ0ZXIgdGhlIHN0YXJ0X2JoKGluY2x1ZGUgaXQpLgorCSAqIEFkZCBvbmUgbW9yZSBidWNrZXQgYW5kIG1vZGlmeSB0aGUgZmlyc3RfYmguCisJICovCisJY3JlZGl0cyA9IGVuZF9ibGsgLSBzdGFydF9ibGsgKyAyICogYmxrX3Blcl9idWNrZXQgKyAxOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJaGFuZGxlID0gTlVMTDsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmaXJzdF9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gY29tbWl0OworCX0KKworCXdoaWxlIChlbmRfYmxrICE9IHN0YXJ0X2JsaykgeworCQlyZXQgPSBvY2ZzMl9jcF94YXR0cl9idWNrZXQoaW5vZGUsIGhhbmRsZSwgZW5kX2JsaywKKwkJCQkJICAgIGVuZF9ibGsgKyBibGtfcGVyX2J1Y2tldCwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNvbW1pdDsKKwkJZW5kX2JsayAtPSBibGtfcGVyX2J1Y2tldDsKKwl9CisKKwkvKiBNb3ZlIGhhbGYgb2YgdGhlIHhhdHRyIGluIHN0YXJ0X2JsayB0byB0aGUgbmV4dCBidWNrZXQuICovCisJcmV0ID0gb2NmczJfaGFsZl94YXR0cl9idWNrZXQoaW5vZGUsIGhhbmRsZSwgc3RhcnRfYmxrLAorCQkJCSAgICAgIHN0YXJ0X2JsayArIGJsa19wZXJfYnVja2V0LCBOVUxMLCAwKTsKKworCWxlMTZfYWRkX2NwdSgmZmlyc3RfeGgtPnhoX251bV9idWNrZXRzLCAxKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZmlyc3RfYmgpOworCitjb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWRkIG5ldyB4YXR0ciBidWNrZXQgaW4gYW4gZXh0ZW50IHJlY29yZCBhbmQgYWRqdXN0IHRoZSBidWNrZXRzIGFjY29yZGluZ2x5LgorICogeGJfYmggaXMgdGhlIG9jZnMyX3hhdHRyX2Jsb2NrLgorICogV2Ugd2lsbCBtb3ZlIGFsbCB0aGUgYnVja2V0cyBzdGFydGluZyBmcm9tIGhlYWRlcl9iaCB0byB0aGUgbmV4dCBwbGFjZS4gQXMKKyAqIGZvciB0aGlzIG9uZSwgaGFsZiBudW0gb2YgaXRzIHhhdHRycyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBuZXh0IG9uZS4KKyAqCisgKiBXZSB3aWxsIGFsbG9jYXRlIGEgbmV3IGNsdXN0ZXIgaWYgY3VycmVudCBjbHVzdGVyIGlzIGZ1bGwgYW5kIGFkanVzdAorICogaGVhZGVyX2JoIGFuZCBmaXJzdF9iaCBpZiB0aGUgaW5zZXJ0IHBsYWNlIGlzIG1vdmVkIHRvIHRoZSBuZXcgY2x1c3Rlci4KKyAqLworc3RhdGljIGludCBvY2ZzMl9hZGRfbmV3X3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYmgsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqZmlyc3RfeGggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3RfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhiX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX3RyZWVfcm9vdCAqeGJfcm9vdCA9ICZ4Yi0+eGJfYXR0cnMueGJfcm9vdDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gJnhiX3Jvb3QtPnh0X2xpc3Q7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiloZWFkZXJfYmgtPmJfZGF0YTsKKwl1MzIgbmFtZV9oYXNoID0gbGUzMl90b19jcHUoeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CisJaW50IHJldCwgbnVtX2J1Y2tldHMsIGV4dGVuZCA9IDE7CisJdTY0IHBfYmxrbm87CisJdTMyIGVfY3BvcywgbnVtX2NsdXN0ZXJzOworCisJbWxvZygwLCAiQWRkIG5ldyB4YXR0ciBidWNrZXQgc3RhcnRpbmcgZm9ybSAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyloZWFkZXJfYmgtPmJfYmxvY2tucik7CisKKwkvKgorCSAqIEFkZCByZWZyZW5jZSBmb3IgaGVhZGVyX2JoIGhlcmUgYmVjYXVzZSBpdCBtYXkgYmUKKwkgKiBjaGFuZ2VkIGluIG9jZnMyX2FkZF9uZXdfeGF0dHJfY2x1c3RlciBhbmQgd2UgbmVlZAorCSAqIHRvIGZyZWUgaXQgaW4gdGhlIGVuZC4KKwkgKi8KKwlnZXRfYmgoaGVhZGVyX2JoKTsKKworCXJldCA9IG9jZnMyX3hhdHRyX2dldF9yZWMoaW5vZGUsIG5hbWVfaGFzaCwgJnBfYmxrbm8sICZlX2Nwb3MsCisJCQkJICAmbnVtX2NsdXN0ZXJzLCBlbCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHBfYmxrbm8sICZmaXJzdF9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW51bV9idWNrZXRzID0gb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3Rlcihvc2IpICogbnVtX2NsdXN0ZXJzOworCWZpcnN0X3hoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilmaXJzdF9iaC0+Yl9kYXRhOworCisJaWYgKG51bV9idWNrZXRzID09IGxlMTZfdG9fY3B1KGZpcnN0X3hoLT54aF9udW1fYnVja2V0cykpIHsKKwkJcmV0ID0gb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyKGlub2RlLAorCQkJCQkJICB4Yl9iaCwKKwkJCQkJCSAgJmZpcnN0X2JoLAorCQkJCQkJICAmaGVhZGVyX2JoLAorCQkJCQkJICAmbnVtX2NsdXN0ZXJzLAorCQkJCQkJICBlX2Nwb3MsCisJCQkJCQkgIHBfYmxrbm8sCisJCQkJCQkgICZleHRlbmQpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChleHRlbmQpCisJCXJldCA9IG9jZnMyX2V4dGVuZF94YXR0cl9idWNrZXQoaW5vZGUsCisJCQkJCQlmaXJzdF9iaCwKKwkJCQkJCWhlYWRlcl9iaCwKKwkJCQkJCW51bV9jbHVzdGVycyk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworb3V0OgorCWJyZWxzZShmaXJzdF9iaCk7CisJYnJlbHNlKGhlYWRlcl9iaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICpvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X3ZhbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQsCisJCQkJCWludCBvZmZzKQoreworCWludCBibG9ja19vZmYgPSBvZmZzID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJb2ZmcyA9IG9mZnMgJSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJcmV0dXJuIGJ1Y2tldC0+YmhzW2Jsb2NrX29mZl0tPmJfZGF0YSArIG9mZnM7Cit9CisKKy8qCisgKiBIYW5kbGUgdGhlIG5vcm1hbCB4YXR0ciBzZXQsIGluY2x1ZGluZyByZXBsYWNlLCBkZWxldGUgYW5kIG5ldy4KKyAqCisgKiBOb3RlOiAibG9jYWwiIGluZGljYXRlcyB0aGUgcmVhbCBkYXRhJ3MgbG9jYWxpdHkuIFNvIHdlIGNhbid0CisgKiBqdXN0IGl0cyBidWNrZXQgbG9jYWxpdHkgYnkgaXRzIGxlbmd0aC4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X25vcm1hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSB1MzIgbmFtZV9oYXNoLAorCQkJCQkgaW50IGxvY2FsKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqbGFzdCwgKnhlOworCWludCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSB4cy0+aGVhZGVyOworCXUxNiBjb3VudCA9IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCksIHN0YXJ0OworCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJY2hhciAqdmFsOworCXNpemVfdCBvZmZzLCBzaXplLCBuZXdfc2l6ZTsKKworCWxhc3QgPSAmeGgtPnhoX2VudHJpZXNbY291bnRdOworCWlmICgheHMtPm5vdF9mb3VuZCkgeworCQl4ZSA9IHhzLT5oZXJlOworCQlvZmZzID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKKwkJCXNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQlPQ0ZTMl9YQVRUUl9TSVpFKGxlNjRfdG9fY3B1KHhlLT54ZV92YWx1ZV9zaXplKSk7CisJCWVsc2UKKwkJCXNpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQlPQ0ZTMl9YQVRUUl9TSVpFKE9DRlMyX1hBVFRSX1JPT1RfU0laRSk7CisKKwkJLyoKKwkJICogSWYgdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBvdXRzaWRlLCB4aS0+dmFsdWUgaGFzIGJlZW4KKwkJICogaW5pdGFsaXplZCBhcyBhbiBlbXB0eSBvY2ZzMl94YXR0cl92YWx1ZV9yb290LCBhbmQgdGhlIHNhbWUKKwkJICogZ29lcyB3aXRoIHhpLT52YWx1ZV9sZW4sIHNvIHdlIGNhbiBzZXQgbmV3X3NpemUgc2FmZWx5IGhlcmUuCisJCSAqIFNlZSBvY2ZzMl94YXR0cl9zZXRfaW5fYnVja2V0LgorCQkgKi8KKwkJbmV3X3NpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArCisJCQkgICBPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pOworCisJCWxlMTZfYWRkX2NwdSgmeGgtPnhoX25hbWVfdmFsdWVfbGVuLCAtc2l6ZSk7CisJCWlmICh4aS0+dmFsdWUpIHsKKwkJCWlmIChuZXdfc2l6ZSA+IHNpemUpCisJCQkJZ290byBzZXRfbmV3X25hbWVfdmFsdWU7CisKKwkJCS8qIE5vdyByZXBsYWNlIHRoZSBvbGQgdmFsdWUgd2l0aCBuZXcgb25lLiAqLworCQkJaWYgKGxvY2FsKQorCQkJCXhlLT54ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlNjQoeGktPnZhbHVlX2xlbik7CisJCQllbHNlCisJCQkJeGUtPnhlX3ZhbHVlX3NpemUgPSAwOworCisJCQl2YWwgPSBvY2ZzMl94YXR0cl9idWNrZXRfZ2V0X3ZhbChpbm9kZSwKKwkJCQkJCQkgJnhzLT5idWNrZXQsIG9mZnMpOworCQkJbWVtc2V0KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLCAwLAorCQkJICAgICAgIHNpemUgLSBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CisJCQlpZiAoT0NGUzJfWEFUVFJfU0laRSh4aS0+dmFsdWVfbGVuKSA+IDApCisJCQkJbWVtY3B5KHZhbCArIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pLAorCQkJCSAgICAgICB4aS0+dmFsdWUsIHhpLT52YWx1ZV9sZW4pOworCisJCQlsZTE2X2FkZF9jcHUoJnhoLT54aF9uYW1lX3ZhbHVlX2xlbiwgbmV3X3NpemUpOworCQkJb2NmczJfeGF0dHJfc2V0X2xvY2FsKHhlLCBsb2NhbCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUmVtb3ZlIHRoZSBvbGQgZW50cnkgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZS4KKwkJCSAqIFdlIGRvbid0IHJlbW92ZSB0aGUgbGFzdCBlbnRyeSBzbyB0aGF0IHdlIGNhbgorCQkJICogdXNlIGl0IHRvIGluZGljYXRlIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBlbXB0eQorCQkJICogYnVja2V0LgorCQkJICovCisJCQlsYXN0IC09IDE7CisJCQlsZTE2X2FkZF9jcHUoJnhoLT54aF9jb3VudCwgLTEpOworCQkJaWYgKHhoLT54aF9jb3VudCkgeworCQkJCW1lbW1vdmUoeGUsIHhlICsgMSwKKwkJCQkJKHZvaWQgKilsYXN0IC0gKHZvaWQgKil4ZSk7CisJCQkJbWVtc2V0KGxhc3QsIDAsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKKwkJCX0gZWxzZQorCQkJCXhoLT54aF9mcmVlX3N0YXJ0ID0KKwkJCQkJY3B1X3RvX2xlMTYoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUpOworCisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQkvKiBmaW5kIGEgbmV3IGVudHJ5IGZvciBpbnNlcnQuICovCisJCWludCBsb3cgPSAwLCBoaWdoID0gY291bnQgLSAxLCB0bXA7CisJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqdG1wX3hlOworCisJCXdoaWxlIChsb3cgPD0gaGlnaCAmJiBjb3VudCkgeworCQkJdG1wID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJCXRtcF94ZSA9ICZ4aC0+eGhfZW50cmllc1t0bXBdOworCisJCQlpZiAobmFtZV9oYXNoID4gbGUzMl90b19jcHUodG1wX3hlLT54ZV9uYW1lX2hhc2gpKQorCQkJCWxvdyA9IHRtcCArIDE7CisJCQllbHNlIGlmIChuYW1lX2hhc2ggPAorCQkJCSBsZTMyX3RvX2NwdSh0bXBfeGUtPnhlX25hbWVfaGFzaCkpCisJCQkJaGlnaCA9IHRtcCAtIDE7CisJCQllbHNlIHsKKwkJCQlsb3cgPSB0bXA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQl4ZSA9ICZ4aC0+eGhfZW50cmllc1tsb3ddOworCQlpZiAobG93ICE9IGNvdW50KQorCQkJbWVtbW92ZSh4ZSArIDEsIHhlLCAodm9pZCAqKWxhc3QgLSAodm9pZCAqKXhlKTsKKworCQlsZTE2X2FkZF9jcHUoJnhoLT54aF9jb3VudCwgMSk7CisJCW1lbXNldCh4ZSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworCQl4ZS0+eGVfbmFtZV9oYXNoID0gY3B1X3RvX2xlMzIobmFtZV9oYXNoKTsKKwkJeGUtPnhlX25hbWVfbGVuID0gbmFtZV9sZW47CisJCW9jZnMyX3hhdHRyX3NldF90eXBlKHhlLCB4aS0+bmFtZV9pbmRleCk7CisJfQorCitzZXRfbmV3X25hbWVfdmFsdWU6CisJLyogSW5zZXJ0IHRoZSBuZXcgbmFtZSt2YWx1ZS4gKi8KKwlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pOworCisJLyoKKwkgKiBXZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBuYW1lL3ZhbHVlIHBhaXIKKwkgKiBleGlzdHMgaW4gdGhlIHNhbWUgYmxvY2suCisJICovCisJb2ZmcyA9IGxlMTZfdG9fY3B1KHhoLT54aF9mcmVlX3N0YXJ0KTsKKwlzdGFydCA9IG9mZnMgLSBzaXplOworCisJaWYgKHN0YXJ0ID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzICE9CisJICAgIChvZmZzIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpIHsKKwkJb2ZmcyA9IG9mZnMgLSBvZmZzICUgYmxvY2tzaXplOworCQl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KG9mZnMpOworCX0KKworCXZhbCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKGlub2RlLAorCQkJCQkgJnhzLT5idWNrZXQsIG9mZnMgLSBzaXplKTsKKwl4ZS0+eGVfbmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzIC0gc2l6ZSk7CisKKwltZW1zZXQodmFsLCAwLCBzaXplKTsKKwltZW1jcHkodmFsLCB4aS0+bmFtZSwgbmFtZV9sZW4pOworCW1lbWNweSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSwgeGktPnZhbHVlLCB4aS0+dmFsdWVfbGVuKTsKKworCXhlLT54ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlNjQoeGktPnZhbHVlX2xlbik7CisJb2NmczJfeGF0dHJfc2V0X2xvY2FsKHhlLCBsb2NhbCk7CisJeHMtPmhlcmUgPSB4ZTsKKwlsZTE2X2FkZF9jcHUoJnhoLT54aF9mcmVlX3N0YXJ0LCAtc2l6ZSk7CisJbGUxNl9hZGRfY3B1KCZ4aC0+eGhfbmFtZV92YWx1ZV9sZW4sIHNpemUpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2J1Y2tldF9oYW5kbGVfam91cm5hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLAorCQkJCQkgICAgIHUxNiBiaF9udW0pCit7CisJaW50IHJldCA9IDAsIG9mZiwgYmxvY2tfb2ZmOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSB4cy0+aGVyZTsKKworCS8qCisJICogRmlyc3QgY2FsY3VsYXRlIGFsbCB0aGUgYmxvY2tzIHdlIHNob3VsZCBqb3VybmFsX2FjY2VzcworCSAqIGFuZCBqb3VybmFsX2RpcnR5LiBUaGUgZmlyc3QgYmxvY2sgc2hvdWxkIGFsd2F5cyBiZSB0b3VjaGVkLgorCSAqLworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaHNbMF0pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCS8qIGNhbGMgdGhlIGRhdGEuICovCisJb2ZmID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KTsKKwlibG9ja19vZmYgPSBvZmYgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoc1tibG9ja19vZmZdKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IHRoZSB4YXR0ciBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGJ1Y2tldC4KKyAqIFRoZSBidWNrZXQgaXMgaW5kaWNhdGVkIGJ5IHhzLT5idWNrZXQgYW5kIGl0IHNob3VsZCBoYXZlIHRoZSBlbm91Z2gKKyAqIHNwYWNlIGZvciB0aGUgeGF0dHIgaW5zZXJ0aW9uLgorICovCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJICAgdTMyIG5hbWVfaGFzaCwKKwkJCQkJICAgaW50IGxvY2FsKQoreworCWludCBpLCByZXQ7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJbWxvZygwLCAiU2V0IHhhdHRyIGVudHJ5IGxlbiA9ICVsdSBpbmRleCA9ICVkIGluIGJ1Y2tldCAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpeGktPnZhbHVlX2xlbiwgeGktPm5hbWVfaW5kZXgsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIpOworCisJaWYgKCF4cy0+YnVja2V0LmJoc1sxXSkgeworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwKKwkJCQkJeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tuciArIDEsCisJCQkJCWJsa19wZXJfYnVja2V0IC0gMSwgJnhzLT5idWNrZXQuYmhzWzFdLAorCQkJCQkwKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGJsa19wZXJfYnVja2V0KTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQloYW5kbGUgPSBOVUxMOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5idWNrZXQuYmhzW2ldLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCW9jZnMyX3hhdHRyX3NldF9lbnRyeV9ub3JtYWwoaW5vZGUsIHhpLCB4cywgbmFtZV9oYXNoLCBsb2NhbCk7CisKKwkvKk9ubHkgZGlydHkgdGhlIGJsb2NrcyB3ZSBoYXZlIHRvdWNoZWQgaW4gc2V0IHhhdHRyLiAqLworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9oYW5kbGVfam91cm5hbChpbm9kZSwgaGFuZGxlLCB4cywKKwkJCQkJCXhzLT5idWNrZXQuYmhzLCBibGtfcGVyX2J1Y2tldCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworb3V0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3ZhbHVlX3VwZGF0ZV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhlX2JoLAorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSwKKwkJCQkJIHU2NCBuZXdfc2l6ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCAxKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4ZV9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJeGUtPnhlX3ZhbHVlX3NpemUgPSBjcHVfdG9fbGU2NChuZXdfc2l6ZSk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGVfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVHJ1bmNhdGUgdGhlIHNwZWNpZmllZCB4ZV9vZmYgZW50cnkgaW4geGF0dHIgYnVja2V0LgorICogYnVja2V0IGlzIGluZGljYXRlZCBieSBoZWFkZXJfYmggYW5kIGxlbiBpcyB0aGUgbmV3IGxlbmd0aC4KKyAqIEJvdGggdGhlIG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgYW5kIHRoZSBlbnRyeSB3aWxsIGJlIHVwZGF0ZWQgaGVyZS4KKyAqCisgKiBDb3B5IHRoZSBuZXcgdXBkYXRlZCB4ZSBhbmQgeGVfdmFsdWVfcm9vdCB0byBuZXdfeGUgYW5kIG5ld194diBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgsCisJCQkJCSAgICAgaW50IHhlX29mZiwKKwkJCQkJICAgICBpbnQgbGVuKQoreworCWludCByZXQsIG9mZnNldDsKKwl1NjQgdmFsdWVfYmxrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdmFsdWVfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4djsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KKwkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopaGVhZGVyX2JoLT5iX2RhdGE7CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCXhlID0gJnhoLT54aF9lbnRyaWVzW3hlX29mZl07CisKKwlCVUdfT04oIXhlIHx8IG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSk7CisKKwlvZmZzZXQgPSBsZTE2X3RvX2NwdSh4ZS0+eGVfbmFtZV9vZmZzZXQpICsKKwkJIE9DRlMyX1hBVFRSX1NJWkUoeGUtPnhlX25hbWVfbGVuKTsKKworCXZhbHVlX2JsayA9IG9mZnNldCAvIGJsb2Nrc2l6ZTsKKworCS8qIFdlIGRvbid0IGFsbG93IG9jZnMyX3hhdHRyX3ZhbHVlIHRvIGJlIHN0b3JlZCBpbiBkaWZmZXJlbnQgYmxvY2suICovCisJQlVHX09OKHZhbHVlX2JsayAhPSAob2Zmc2V0ICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFIC0gMSkgLyBibG9ja3NpemUpOworCXZhbHVlX2JsayArPSBoZWFkZXJfYmgtPmJfYmxvY2tucjsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHZhbHVlX2JsaywgJnZhbHVlX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJKHZhbHVlX2JoLT5iX2RhdGEgKyBvZmZzZXQgJSBibG9ja3NpemUpOworCisJbWxvZygwLCAidHJ1bmNhdGUgJXUgaW4geGF0dHIgYnVja2V0ICVsbHUgdG8gJWQgYnl0ZXMuXG4iLAorCSAgICAgeGVfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKWhlYWRlcl9iaC0+Yl9ibG9ja25yLCBsZW4pOworCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCB2YWx1ZV9iaCwgeHYsIGxlbik7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3VwZGF0ZV9zaXplKGlub2RlLCBoZWFkZXJfYmgsIHhlLCBsZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlicmVsc2UodmFsdWVfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJCWludCBsZW4pCit7CisJaW50IHJldCwgb2Zmc2V0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSB4cy0+aGVyZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopeHMtPmJhc2U7CisKKwlCVUdfT04oIXhzLT5idWNrZXQuYmhzWzBdIHx8ICF4ZSB8fCBvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpOworCisJb2Zmc2V0ID0geGUgLSB4aC0+eGhfZW50cmllczsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLAorCQkJCQkJb2Zmc2V0LCBsZW4pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3NldF92YWx1ZV9vdXRzaWRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJCWNoYXIgKnZhbCwKKwkJCQkJCWludCB2YWx1ZV9sZW4pCit7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IHhzLT5oZXJlOworCisJQlVHX09OKCF4cy0+YmFzZSB8fCAheGUgfHwgb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKTsKKworCW9mZnNldCA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCkgKworCQkgT0NGUzJfWEFUVFJfU0laRSh4ZS0+eGVfbmFtZV9sZW4pOworCisJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikoeHMtPmJhc2UgKyBvZmZzZXQpOworCisJcmV0dXJuIF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHh2LCB2YWwsIHZhbHVlX2xlbik7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcm1feGF0dHJfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAorCQkJCSAgdTY0IGJsa25vLAorCQkJCSAgdTMyIGNwb3MsCisJCQkJICB1MzIgbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9CisJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopcm9vdF9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKworCW9jZnMyX2luaXRfeGF0dHJfdHJlZV9leHRlbnRfdHJlZSgmZXQsIGlub2RlLCByb290X2JoKTsKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZkZWFsbG9jKTsKKworCW1sb2coMCwgInJtIHhhdHRyIGV4dGVudCByZWMgYXQgJXUgbGVuID0gJXUsIHN0YXJ0IGZyb20gJWxsdVxuIiwKKwkgICAgIGNwb3MsIGxlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisKKwlvY2ZzMl9yZW1vdmVfeGF0dHJfY2x1c3RlcnNfZnJvbV9jYWNoZShpbm9kZSwgYmxrbm8sIGxlbik7CisKKwlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAorCQkJCSAgJmRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJbGUzMl9hZGRfY3B1KCZ4Yi0+eGJfYXR0cnMueGJfcm9vdC54dF9jbHVzdGVycywgLWxlbik7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcm9vdF9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKG9zYiwgaGFuZGxlLCBibGtubywgbGVuKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKworCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZkZWFsbG9jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX2J1Y2tldF9yZW1vdmVfeHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0geHMtPmJ1Y2tldC54aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmxhc3QgPSAmeGgtPnhoX2VudHJpZXNbCisJCQkJCQlsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpIC0gMV07CisJaW50IHJldCA9IDA7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwgMSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPmJ1Y2tldC5iaHNbMF0sCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJLyogUmVtb3ZlIHRoZSBvbGQgZW50cnkuICovCisJbWVtbW92ZSh4cy0+aGVyZSwgeHMtPmhlcmUgKyAxLAorCQkodm9pZCAqKWxhc3QgLSAodm9pZCAqKXhzLT5oZXJlKTsKKwltZW1zZXQobGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkpOworCWxlMTZfYWRkX2NwdSgmeGgtPnhoX2NvdW50LCAtMSk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmJ1Y2tldC5iaHNbMF0pOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7Cit9CisKKy8qCisgKiBTZXQgdGhlIHhhdHRyIG5hbWUvdmFsdWUgaW4gdGhlIGJ1Y2tldCBzcGVjaWZpZWQgaW4geHMuCisgKgorICogQXMgdGhlIG5ldyB2YWx1ZSBpbiB4aSBtYXkgYmUgc3RvcmVkIGluIHRoZSBidWNrZXQgb3IgaW4gYW4gb3V0c2lkZSBjbHVzdGVyLAorICogd2UgZGl2aWRlIHRoZSB3aG9sZSBwcm9jZXNzIGludG8gMyBzdGVwczoKKyAqIDEuIGluc2VydCBuYW1lL3ZhbHVlIGluIHRoZSBidWNrZXQob2NmczJfeGF0dHJfc2V0X2VudHJ5X2luX2J1Y2tldCkKKyAqIDIuIHRydW5jYXRlIG9mIHRoZSBvdXRzaWRlIGNsdXN0ZXIob2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKQorICogMy4gU2V0IHRoZSB2YWx1ZSB0byB0aGUgb3V0c2lkZSBjbHVzdGVyKG9jZnMyX3hhdHRyX2J1Y2tldF9zZXRfdmFsdWVfb3V0c2lkZSkKKyAqIDQuIElmIHRoZSBjbHVzdGVycyBmb3IgdGhlIG5ldyBvdXRzaWRlIHZhbHVlIGNhbid0IGJlIGFsbG9jYXRlZCwgd2UgbmVlZAorICogICAgdG8gZnJlZSB0aGUgeGF0dHIgd2UgYWxsb2NhdGVkIGluIHNldC4KKyAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwlpbnQgcmV0LCBsb2NhbCA9IDE7CisJc2l6ZV90IHZhbHVlX2xlbjsKKwljaGFyICp2YWwgPSAoY2hhciAqKXhpLT52YWx1ZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0geHMtPmhlcmU7CisJdTMyIG5hbWVfaGFzaCA9IG9jZnMyX3hhdHRyX25hbWVfaGFzaChpbm9kZSwgeGktPm5hbWUsCisJCQkJCSAgICAgIHN0cmxlbih4aS0+bmFtZSkpOworCisJaWYgKCF4cy0+bm90X2ZvdW5kICYmICFvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byB0cnVuY2F0ZSB0aGUgeGF0dHIgc3RvcmFnZSBmaXJzdC4KKwkJICoKKwkJICogSWYgYm90aCB0aGUgb2xkIGFuZCBuZXcgdmFsdWUgYXJlIHN0b3JlZCB0bworCQkgKiBvdXRzaWRlIGJsb2NrLCB3ZSBvbmx5IG5lZWQgdG8gdHJ1bmNhdGUKKwkJICogdGhlIHN0b3JhZ2UgYW5kIHRoZW4gc2V0IHRoZSB2YWx1ZSBvdXRzaWRlLgorCQkgKgorCQkgKiBJZiB0aGUgbmV3IHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgd2l0aGluIGJsb2NrLAorCQkgKiB3ZSBzaG91bGQgZnJlZSBhbGwgdGhlIG91dHNpZGUgYmxvY2sgZmlyc3QgYW5kCisJCSAqIHRoZSBtb2RpZmljYXRpb24gdG8gdGhlIHhhdHRyIGJsb2NrIHdpbGwgYmUgZG9uZQorCQkgKiBieSBmb2xsb3dpbmcgc3RlcHMuCisJCSAqLworCQlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKQorCQkJdmFsdWVfbGVuID0geGktPnZhbHVlX2xlbjsKKwkJZWxzZQorCQkJdmFsdWVfbGVuID0gMDsKKworCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGVfeHMoaW5vZGUsIHhzLAorCQkJCQkJCSAgIHZhbHVlX2xlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlpZiAodmFsdWVfbGVuKQorCQkJZ290byBzZXRfdmFsdWVfb3V0c2lkZTsKKwl9CisKKwl2YWx1ZV9sZW4gPSB4aS0+dmFsdWVfbGVuOworCS8qIFNvIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBpbnNpZGUgYmxvY2sgY2hhbmdlIG5vdy4gKi8KKwlpZiAodmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKKwkJLyoKKwkJICogSWYgdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBvdXRzaWRlIG9mIGJsb2NrLAorCQkgKiBpbml0YWxpemUgYSBuZXcgZW1wdHkgdmFsdWUgcm9vdCBhbmQgaW5zZXJ0IGl0IGZpcnN0LgorCQkgKi8KKwkJbG9jYWwgPSAwOworCQl4aS0+dmFsdWUgPSAmZGVmX3h2OworCQl4aS0+dmFsdWVfbGVuID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCX0KKworCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbl9idWNrZXQoaW5vZGUsIHhpLCB4cywgbmFtZV9oYXNoLCBsb2NhbCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2YWx1ZV9sZW4gPD0gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpCisJCWdvdG8gb3V0OworCisJLyogYWxsb2NhdGUgdGhlIHNwYWNlIG5vdyBmb3IgdGhlIG91dHNpZGUgYmxvY2sgc3RvcmFnZS4gKi8KKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGVfeHMoaW5vZGUsIHhzLAorCQkJCQkJICAgdmFsdWVfbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKworCQlpZiAoeHMtPm5vdF9mb3VuZCkgeworCQkJLyoKKwkJCSAqIFdlIGNhbid0IGFsbG9jYXRlIGVub3VnaCBjbHVzdGVycyBmb3Igb3V0c2lkZQorCQkJICogc3RvcmFnZSBhbmQgd2UgaGF2ZSBhbGxvY2F0ZWQgeGF0dHIgYWxyZWFkeSwKKwkJCSAqIHNvIG5lZWQgdG8gcmVtb3ZlIGl0LgorCQkJICovCisJCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVtb3ZlX3hzKGlub2RlLCB4cyk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCitzZXRfdmFsdWVfb3V0c2lkZToKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHhzLCB2YWwsIHZhbHVlX2xlbik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogY2hlY2sgd2hldGhlciB0aGUgeGF0dHIgYnVja2V0IGlzIGZpbGxlZCB1cCB3aXRoIHRoZSBzYW1lIGhhc2ggdmFsdWUuICovCitzdGF0aWMgaW50IG9jZnMyX2NoZWNrX3hhdHRyX2J1Y2tldF9jb2xsaXNpb24oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0KQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0LT54aDsKKworCWlmICh4aC0+eGhfZW50cmllc1tsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpIC0gMV0ueGVfbmFtZV9oYXNoID09CisJICAgIHhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCkgeworCQltbG9nKE1MX0VSUk9SLCAiVG9vIG11Y2ggaGFzaCBjb2xsaXNpb24gaW4geGF0dHIgYnVja2V0ICVsbHUsICIKKwkJICAgICAiaGFzaCA9ICV1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0LT5iaHNbMF0tPmJfYmxvY2tuciwKKwkJICAgICBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOworCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CisJdTE2IGNvdW50LCBoZWFkZXJfc2l6ZSwgeGhfZnJlZV9zdGFydDsKKwlpbnQgaSwgZnJlZSwgbWF4X2ZyZWUsIG5lZWQsIG9sZDsKKwlzaXplX3QgdmFsdWVfc2l6ZSA9IDAsIG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKKwlzaXplX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWludCByZXQsIGFsbG9jYXRpb24gPSAwOworCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKworCW1sb2dfZW50cnkoIlNldCB4YXR0ciAlcyBpbiB4YXR0ciBpbmRleCBibG9ja1xuIiwgeGktPm5hbWUpOworCit0cnlfYWdhaW46CisJeGggPSB4cy0+aGVhZGVyOworCWNvdW50ID0gbGUxNl90b19jcHUoeGgtPnhoX2NvdW50KTsKKwl4aF9mcmVlX3N0YXJ0ID0gbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpOworCWhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIpICsKKwkJCWNvdW50ICogc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSk7CisJbWF4X2ZyZWUgPSBPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSAtCisJCWxlMTZfdG9fY3B1KHhoLT54aF9uYW1lX3ZhbHVlX2xlbikgLSBoZWFkZXJfc2l6ZTsKKworCW1sb2dfYnVnX29uX21zZyhoZWFkZXJfc2l6ZSA+IGJsb2Nrc2l6ZSwgImJ1Y2tldCAlbGx1IGhhcyBoZWFkZXIgc2l6ZSAiCisJCQkib2YgJXUgd2hpY2ggZXhjZWVkIGJsb2NrIHNpemVcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIsCisJCQloZWFkZXJfc2l6ZSk7CisKKwlpZiAoeGktPnZhbHVlICYmIHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJdmFsdWVfc2l6ZSA9IE9DRlMyX1hBVFRSX1JPT1RfU0laRTsKKwllbHNlIGlmICh4aS0+dmFsdWUpCisJCXZhbHVlX3NpemUgPSBPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pOworCisJaWYgKHhzLT5ub3RfZm91bmQpCisJCW5lZWQgPSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSArCisJCQlPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSArIHZhbHVlX3NpemU7CisJZWxzZSB7CisJCW5lZWQgPSB2YWx1ZV9zaXplICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbik7CisKKwkJLyoKKwkJICogV2Ugb25seSByZXBsYWNlIHRoZSBvbGQgdmFsdWUgaWYgdGhlIG5ldyBsZW5ndGggaXMgc21hbGxlcgorCQkgKiB0aGFuIHRoZSBvbGQgb25lLiBPdGhlcndpc2Ugd2Ugd2lsbCBhbGxvY2F0ZSBuZXcgc3BhY2UgaW4gdGhlCisJCSAqIGJ1Y2tldCB0byBzdG9yZSBpdC4KKwkJICovCisJCXhlID0geHMtPmhlcmU7CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCisJCQlvbGQgPSBPQ0ZTMl9YQVRUUl9TSVpFKGxlNjRfdG9fY3B1KHhlLT54ZV92YWx1ZV9zaXplKSk7CisJCWVsc2UKKwkJCW9sZCA9IE9DRlMyX1hBVFRSX1NJWkUoT0NGUzJfWEFUVFJfUk9PVF9TSVpFKTsKKworCQlpZiAob2xkID49IHZhbHVlX3NpemUpCisJCQluZWVkID0gMDsKKwl9CisKKwlmcmVlID0geGhfZnJlZV9zdGFydCAtIGhlYWRlcl9zaXplOworCS8qCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBuYW1lL3ZhbHVlIHBhaXIKKwkgKiBjYW4gZXhpc3QgaW4gdGhlIHNhbWUgYmxvY2suCisJICovCisJaWYgKHhoX2ZyZWVfc3RhcnQgJSBibG9ja3NpemUgPCBuZWVkKQorCQlmcmVlIC09IHhoX2ZyZWVfc3RhcnQgJSBibG9ja3NpemU7CisKKwltbG9nKDAsICJ4cy0+bm90X2ZvdW5kID0gJWQsIGluIHhhdHRyIGJ1Y2tldCAlbGx1OiBmcmVlID0gJWQsICIKKwkgICAgICJuZWVkID0gJWQsIG1heF9mcmVlID0gJWQsIHhoX2ZyZWVfc3RhcnQgPSAldSwgeGhfbmFtZV92YWx1ZV9sZW4gPSIKKwkgICAgICIgJXVcbiIsIHhzLT5ub3RfZm91bmQsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIsCisJICAgICBmcmVlLCBuZWVkLCBtYXhfZnJlZSwgbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpLAorCSAgICAgbGUxNl90b19jcHUoeGgtPnhoX25hbWVfdmFsdWVfbGVuKSk7CisKKwlpZiAoZnJlZSA8IG5lZWQgfHwgY291bnQgPT0gb2NmczJfeGF0dHJfbWF4X3hlX2luX2J1Y2tldChpbm9kZS0+aV9zYikpIHsKKwkJaWYgKG5lZWQgPD0gbWF4X2ZyZWUgJiYKKwkJICAgIGNvdW50IDwgb2NmczJfeGF0dHJfbWF4X3hlX2luX2J1Y2tldChpbm9kZS0+aV9zYikpIHsKKwkJCS8qCisJCQkgKiBXZSBjYW4gY3JlYXRlIHRoZSBzcGFjZSBieSBkZWZyYWdtZW50LiBTaW5jZSBvbmx5IHRoZQorCQkJICogbmFtZS92YWx1ZSB3aWxsIGJlIG1vdmVkLCB0aGUgeGUgc2hvdWxkbid0IGJlIGNoYW5nZWQKKwkJCSAqIGluIHhzLgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9kZWZyYWdfeGF0dHJfYnVja2V0KGlub2RlLCAmeHMtPmJ1Y2tldCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQl4aF9mcmVlX3N0YXJ0ID0gbGUxNl90b19jcHUoeGgtPnhoX2ZyZWVfc3RhcnQpOworCQkJZnJlZSA9IHhoX2ZyZWVfc3RhcnQgLSBoZWFkZXJfc2l6ZTsKKwkJCWlmICh4aF9mcmVlX3N0YXJ0ICUgYmxvY2tzaXplIDwgbmVlZCkKKwkJCQlmcmVlIC09IHhoX2ZyZWVfc3RhcnQgJSBibG9ja3NpemU7CisKKwkJCWlmIChmcmVlID49IG5lZWQpCisJCQkJZ290byB4YXR0cl9zZXQ7CisKKwkJCW1sb2coMCwgIkNhbid0IGdldCBlbm91Z2ggc3BhY2UgZm9yIHhhdHRyIGluc2VydCBieSAiCisJCQkgICAgICJkZWZyYWdtZW50LiBOZWVkICV1IGJ5dGVzLCBidXQgd2UgaGF2ZSAlZCwgc28gIgorCQkJICAgICAiYWxsb2NhdGUgbmV3IGJ1Y2tldCBmb3IgaXQuXG4iLCBuZWVkLCBmcmVlKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGhhdmUgdG8gYWRkIG5ldyBidWNrZXRzIG9yIGNsdXN0ZXJzIGFuZCBvbmUKKwkJICogYWxsb2NhdGlvbiBzaG91bGQgbGVhdmUgdXMgZW5vdWdoIHNwYWNlIGZvciBpbnNlcnQuCisJCSAqLworCQlCVUdfT04oYWxsb2NhdGlvbik7CisKKwkJLyoKKwkJICogV2UgZG8gbm90IGFsbG93IGZvciBvdmVybGFwcGluZyByYW5nZXMgYmV0d2VlbiBidWNrZXRzLiBBbmQKKwkJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbGxpc2lvbnMgd2Ugd2lsbCBhbGxvdyBmb3IgdGhlbiBpcworCQkgKiBvbmUgYnVja2V0J3Mgd29ydGgsIHNvIGNoZWNrIGl0IGhlcmUgd2hldGhlciB3ZSBuZWVkIHRvCisJCSAqIGFkZCBhIG5ldyBidWNrZXQgZm9yIHRoZSBpbnNlcnQuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9jaGVja194YXR0cl9idWNrZXRfY29sbGlzaW9uKGlub2RlLCAmeHMtPmJ1Y2tldCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfYWRkX25ld194YXR0cl9idWNrZXQoaW5vZGUsCisJCQkJCQkgeHMtPnhhdHRyX2JoLAorCQkJCQkJIHhzLT5idWNrZXQuYmhzWzBdKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKKwkJCWJyZWxzZSh4cy0+YnVja2V0LmJoc1tpXSk7CisKKwkJbWVtc2V0KCZ4cy0+YnVja2V0LCAwLCBzaXplb2YoeHMtPmJ1Y2tldCkpOworCisJCXJldCA9IG9jZnMyX3hhdHRyX2luZGV4X2Jsb2NrX2ZpbmQoaW5vZGUsIHhzLT54YXR0cl9iaCwKKwkJCQkJCSAgIHhpLT5uYW1lX2luZGV4LAorCQkJCQkJICAgeGktPm5hbWUsIHhzKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RBVEEpCisJCQlnb3RvIG91dDsKKwkJeHMtPm5vdF9mb3VuZCA9IHJldDsKKwkJYWxsb2NhdGlvbiA9IDE7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworeGF0dHJfc2V0OgorCXJldCA9IG9jZnMyX3hhdHRyX3NldF9pbl9idWNrZXQoaW5vZGUsIHhpLCB4cyk7CitvdXQ6CisJbWxvZ19leGl0KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9kZWxldGVfeGF0dHJfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCwKKwkJCQkJdm9pZCAqcGFyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldC0+eGg7CisJdTE2IGk7CisJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKworCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOyBpKyspIHsKKwkJeGUgPSAmeGgtPnhoX2VudHJpZXNbaV07CisJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsCisJCQkJCQkJYnVja2V0LT5iaHNbMF0sCisJCQkJCQkJaSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9kZWxldGVfeGF0dHJfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoKQoreworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhiX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZ4Yi0+eGJfYXR0cnMueGJfcm9vdC54dF9saXN0OworCWludCByZXQgPSAwOworCXUzMiBuYW1lX2hhc2ggPSBVSU5UX01BWCwgZV9jcG9zLCBudW1fY2x1c3RlcnM7CisJdTY0IHBfYmxrbm87CisKKwlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobmFtZV9oYXNoID4gMCkgeworCQlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfcmVjKGlub2RlLCBuYW1lX2hhc2gsICZwX2Jsa25vLAorCQkJCQkgICZlX2Nwb3MsICZudW1fY2x1c3RlcnMsIGVsKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9pdGVyYXRlX3hhdHRyX2J1Y2tldHMoaW5vZGUsIHBfYmxrbm8sIG51bV9jbHVzdGVycywKKwkJCQkJCSAgb2NmczJfZGVsZXRlX3hhdHRyX2luX2J1Y2tldCwKKwkJCQkJCSAgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfcm1feGF0dHJfY2x1c3Rlcihpbm9kZSwgeGJfYmgsCisJCQkJCSAgICAgcF9ibGtubywgZV9jcG9zLCBudW1fY2x1c3RlcnMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlX2Nwb3MgPT0gMCkKKwkJCWJyZWFrOworCisJCW5hbWVfaGFzaCA9IGVfY3BvcyAtIDE7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICd0cnVzdGVkJyBhdHRyaWJ1dGVzIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKworc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl90cnVzdGVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwKKwkJCQkgICAgICAgc2l6ZV90IGxpc3Rfc2l6ZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0ICsgcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCQlsaXN0W3ByZWZpeF9sZW4gKyBuYW1lX2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gdG90YWxfbGVuOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3RydXN0ZWRfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gb2NmczJfeGF0dHJfZ2V0KGlub2RlLCBPQ0ZTMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfdHJ1c3RlZF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvY2ZzMl94YXR0cl9zZXQoaW5vZGUsIE9DRlMyX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsIHZhbHVlLAorCQkJICAgICAgIHNpemUsIGZsYWdzKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9UUlVTVEVEX1BSRUZJWCwKKwkubGlzdAk9IG9jZnMyX3hhdHRyX3RydXN0ZWRfbGlzdCwKKwkuZ2V0CT0gb2NmczJfeGF0dHJfdHJ1c3RlZF9nZXQsCisJLnNldAk9IG9jZnMyX3hhdHRyX3RydXN0ZWRfc2V0LAorfTsKKworCisvKgorICogJ3VzZXInIGF0dHJpYnV0ZXMgc3VwcG9ydAorICovCisKKyNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorCitzdGF0aWMgc2l6ZV90IG9jZnMyX3hhdHRyX3VzZXJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LAorCQkJCSAgICBzaXplX3QgbGlzdF9zaXplLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpIC0gMTsKKwljb25zdCBzaXplX3QgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKworCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfTk9VU0VSWEFUVFIpCisJCXJldHVybiAwOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVVNFUl9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCArIHByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl91c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX05PVVNFUlhBVFRSKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIG9jZnMyX3hhdHRyX2dldChpbm9kZSwgT0NGUzJfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwKKwkJCSAgICAgICBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3VzZXJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX05PVVNFUlhBVFRSKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gb2NmczJfeGF0dHJfc2V0KGlub2RlLCBPQ0ZTMl9YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLCB2YWx1ZSwKKwkJCSAgICAgICBzaXplLCBmbGFncyk7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3VzZXJfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVVNFUl9QUkVGSVgsCisJLmxpc3QJPSBvY2ZzMl94YXR0cl91c2VyX2xpc3QsCisJLmdldAk9IG9jZnMyX3hhdHRyX3VzZXJfZ2V0LAorCS5zZXQJPSBvY2ZzMl94YXR0cl91c2VyX3NldCwKK307CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi94YXR0ci5oIGIvZnMvb2NmczIveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVjN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIveGF0dHIuaApAQCAtMCwwICsxLDY4IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLQorICogdmltOiBub2V4cGFuZHRhYiBzdz04IHRzPTggc3RzPTA6CisgKgorICogeGF0dHIuaAorICoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBPQ0ZTMl9YQVRUUl9ICisjZGVmaW5lIE9DRlMyX1hBVFRSX0gKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCitlbnVtIG9jZnMyX3hhdHRyX3R5cGUgeworCU9DRlMyX1hBVFRSX0lOREVYX1VTRVIgPSAxLAorCU9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1MsCisJT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQsCisJT0NGUzJfWEFUVFJfSU5ERVhfVFJVU1RFRCwKKwlPQ0ZTMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwlPQ0ZTMl9YQVRUUl9NQVgKK307CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl91c2VyX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyOworCitleHRlcm4gc3NpemVfdCBvY2ZzMl9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50IG9jZnMyX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgb2NmczJfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLAorCQkJICAgc2l6ZV90LCBpbnQpOworZXh0ZXJuIGludCBvY2ZzMl94YXR0cl9yZW1vdmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCk7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgKm9jZnMyX3hhdHRyX2hhbmRsZXJzW107CisKK3N0YXRpYyBpbmxpbmUgdTE2IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuICgxIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKSAvIE9DRlMyX1hBVFRSX0JVQ0tFVF9TSVpFOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBPQ0ZTMl9YQVRUUl9CVUNLRVRfU0laRSAvICgxIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgb2NmczJfeGF0dHJfbWF4X3hlX2luX2J1Y2tldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXUxNiBsZW4gPSBzYi0+c19ibG9ja3NpemUgLQorCQkgb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciwgeGhfZW50cmllcyk7CisKKwlyZXR1cm4gbGVuIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSk7Cit9CisjZW5kaWYgLyogT0NGUzJfWEFUVFJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb21mcy9pbm9kZS5jIGIvZnMvb21mcy9pbm9kZS5jCmluZGV4IGQyOTA0N2IuLmNiZjA0N2EgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvaW5vZGUuYworKysgYi9mcy9vbWZzL2lub2RlLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCU9wdF91aWQsIE9wdF9naWQsIE9wdF91bWFzaywgT3B0X2RtYXNrLCBPcHRfZm1hc2sKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X3VpZCwgInVpZD0ldSJ9LAogCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCiAJe09wdF91bWFzaywgInVtYXNrPSVvIn0sCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggMDdkYTkzNS4uNTU5NjA0OSAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtMTE0MSw4ICsxMTQxLDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfdmhhbmd1cCh2b2lkKQogewogCWlmIChjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpIHsKLQkJLyogWFhYOiB0aGlzIG5lZWRzIGxvY2tpbmcgKi8KLQkJdHR5X3ZoYW5ndXAoY3VycmVudC0+c2lnbmFsLT50dHkpOworCQl0dHlfdmhhbmd1cF9zZWxmKCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVQRVJNOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hY29ybi5jIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCmluZGV4IDNkM2UxNjYuLmE5N2I0NzcgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYworKysgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKQEAgLTI3NSwxNiArMjc1LDYgQEAKIAlpZCA9IGRhdGFbMHgxZmNdICYgMTU7CiAJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9NRk0KLQlpZiAoTUFKT1IoYmRldi0+YmRfZGV2KSA9PSBNRk1fQUNPUk5fTUFKT1IpIHsKLQkJZXh0ZXJuIHZvaWQgeGRfc2V0X2dlb21ldHJ5KHN0cnVjdCBibG9ja19kZXZpY2UgKiwKLQkJCXVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGludCk7Ci0JCXhkX3NldF9nZW9tZXRyeShiZGV2LCBkci0+c2Vjc3BlcnRyYWNrLCBoZWFkcywgMSk7Ci0JCWludmFsaWRhdGVfYmhfbHJ1cygpOwotCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLCAwKTsKLQl9Ci0jZW5kaWYKLQogCS8qCiAJICogV29yayBvdXQgc3RhcnQgb2Ygbm9uLWFkZnMgcGFydGl0aW9uLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDdkNmIzNGUuLmZiZWIyZjMgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTEyMCwyMiArMTIwLDIxIEBACiAgKiBhIHBvaW50ZXIgdG8gdGhhdCBzYW1lIGJ1ZmZlciAoZm9yIGNvbnZlbmllbmNlKS4KICAqLwogCi1jaGFyICpkaXNrX25hbWUoc3RydWN0IGdlbmRpc2sgKmhkLCBpbnQgcGFydCwgY2hhciAqYnVmKQorY2hhciAqZGlza19uYW1lKHN0cnVjdCBnZW5kaXNrICpoZCwgaW50IHBhcnRubywgY2hhciAqYnVmKQogewotCWlmICghcGFydCkKKwlpZiAoIXBhcnRubykKIAkJc25wcmludGYoYnVmLCBCREVWTkFNRV9TSVpFLCAiJXMiLCBoZC0+ZGlza19uYW1lKTsKIAllbHNlIGlmIChpc2RpZ2l0KGhkLT5kaXNrX25hbWVbc3RybGVuKGhkLT5kaXNrX25hbWUpLTFdKSkKLQkJc25wcmludGYoYnVmLCBCREVWTkFNRV9TSVpFLCAiJXNwJWQiLCBoZC0+ZGlza19uYW1lLCBwYXJ0KTsKKwkJc25wcmludGYoYnVmLCBCREVWTkFNRV9TSVpFLCAiJXNwJWQiLCBoZC0+ZGlza19uYW1lLCBwYXJ0bm8pOwogCWVsc2UKLQkJc25wcmludGYoYnVmLCBCREVWTkFNRV9TSVpFLCAiJXMlZCIsIGhkLT5kaXNrX25hbWUsIHBhcnQpOworCQlzbnByaW50ZihidWYsIEJERVZOQU1FX1NJWkUsICIlcyVkIiwgaGQtPmRpc2tfbmFtZSwgcGFydG5vKTsKIAogCXJldHVybiBidWY7CiB9CiAKIGNvbnN0IGNoYXIgKmJkZXZuYW1lKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGNoYXIgKmJ1ZikKIHsKLQlpbnQgcGFydCA9IE1JTk9SKGJkZXYtPmJkX2RldikgLSBiZGV2LT5iZF9kaXNrLT5maXJzdF9taW5vcjsKLQlyZXR1cm4gZGlza19uYW1lKGJkZXYtPmJkX2Rpc2ssIHBhcnQsIGJ1Zik7CisJcmV0dXJuIGRpc2tfbmFtZShiZGV2LT5iZF9kaXNrLCBiZGV2LT5iZF9wYXJ0LT5wYXJ0bm8sIGJ1Zik7CiB9CiAKIEVYUE9SVF9TWU1CT0woYmRldm5hbWUpOwpAQCAtMTY5LDcgKzE2OCw3IEBACiAJaWYgKGlzZGlnaXQoc3RhdGUtPm5hbWVbc3RybGVuKHN0YXRlLT5uYW1lKS0xXSkpCiAJCXNwcmludGYoc3RhdGUtPm5hbWUsICJwIik7CiAKLQlzdGF0ZS0+bGltaXQgPSBoZC0+bWlub3JzOworCXN0YXRlLT5saW1pdCA9IGRpc2tfbWF4X3BhcnRzKGhkKTsKIAlpID0gcmVzID0gZXJyID0gMDsKIAl3aGlsZSAoIXJlcyAmJiBjaGVja19wYXJ0W2ldKSB7CiAJCW1lbXNldCgmc3RhdGUtPnBhcnRzLCAwLCBzaXplb2Yoc3RhdGUtPnBhcnRzKSk7CkBAIC0yMDQsMjEgKzIwMywyMiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5zdGFydF9zZWN0KTsKIH0KIAotc3RhdGljIHNzaXplX3QgcGFydF9zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3NzaXplX3QgcGFydF9zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaGRfc3RydWN0ICpwID0gZGV2X3RvX3BhcnQoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCh1bnNpZ25lZCBsb25nIGxvbmcpcC0+bnJfc2VjdHMpOwogfQogCi1zdGF0aWMgc3NpemVfdCBwYXJ0X3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3NpemVfdCBwYXJ0X3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOworCWludCBjcHU7CiAKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlwYXJ0X3JvdW5kX3N0YXRzKHApOwotCXByZWVtcHRfZW5hYmxlKCk7CisJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKKwlwYXJ0X3JvdW5kX3N0YXRzKGNwdSwgcCk7CisJcGFydF9zdGF0X3VubG9jaygpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwKIAkJIiU4bHUgJThsdSAlOGxsdSAlOHUgIgogCQkiJThsdSAlOGx1ICU4bGx1ICU4dSAiCkBAIC0yMzgsMTcgKzIzOCwxNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCi1zdGF0aWMgc3NpemVfdCBwYXJ0X2ZhaWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3NpemVfdCBwYXJ0X2ZhaWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHAtPm1ha2VfaXRfZmFpbCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBhcnRfZmFpbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzc2l6ZV90IHBhcnRfZmFpbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOwogCWludCBpOwpAQCAtMzAwLDQwICszMDAsMzQgQEAKIAkucmVsZWFzZQk9IHBhcnRfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aXRpb25fc3lzZnNfYWRkX3N1YmRpcihzdHJ1Y3QgaGRfc3RydWN0ICpwKQorc3RhdGljIHZvaWQgZGVsZXRlX3BhcnRpdGlvbl9yY3VfY2Ioc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewotCXN0cnVjdCBrb2JqZWN0ICprOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGhkX3N0cnVjdCwgcmN1X2hlYWQpOwogCi0JayA9IGtvYmplY3RfZ2V0KCZwLT5kZXYua29iaik7Ci0JcC0+aG9sZGVyX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImhvbGRlcnMiLCBrKTsKLQlrb2JqZWN0X3B1dChrKTsKKwlwYXJ0LT5zdGFydF9zZWN0ID0gMDsKKwlwYXJ0LT5ucl9zZWN0cyA9IDA7CisJcGFydF9zdGF0X3NldF9hbGwocGFydCwgMCk7CisJcHV0X2RldmljZShwYXJ0X3RvX2RldihwYXJ0KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNrX3N5c2ZzX2FkZF9zdWJkaXJzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQordm9pZCBkZWxldGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgcGFydG5vKQogewotCXN0cnVjdCBrb2JqZWN0ICprOworCXN0cnVjdCBkaXNrX3BhcnRfdGJsICpwdGJsID0gZGlzay0+cGFydF90Ymw7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAotCWsgPSBrb2JqZWN0X2dldCgmZGlzay0+ZGV2LmtvYmopOwotCWRpc2stPmhvbGRlcl9kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJob2xkZXJzIiwgayk7Ci0JZGlzay0+c2xhdmVfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic2xhdmVzIiwgayk7Ci0Ja29iamVjdF9wdXQoayk7Ci19Ci0KLXZvaWQgZGVsZXRlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IHBhcnQpCi17Ci0Jc3RydWN0IGhkX3N0cnVjdCAqcCA9IGRpc2stPnBhcnRbcGFydC0xXTsKLQotCWlmICghcCkKKwlpZiAocGFydG5vID49IHB0YmwtPmxlbikKIAkJcmV0dXJuOwotCWlmICghcC0+bnJfc2VjdHMpCisKKwlwYXJ0ID0gcHRibC0+cGFydFtwYXJ0bm9dOworCWlmICghcGFydCkKIAkJcmV0dXJuOwotCWRpc2stPnBhcnRbcGFydC0xXSA9IE5VTEw7Ci0JcC0+c3RhcnRfc2VjdCA9IDA7Ci0JcC0+bnJfc2VjdHMgPSAwOwotCXBhcnRfc3RhdF9zZXRfYWxsKHAsIDApOwotCWtvYmplY3RfcHV0KHAtPmhvbGRlcl9kaXIpOwotCWRldmljZV9kZWwoJnAtPmRldik7Ci0JcHV0X2RldmljZSgmcC0+ZGV2KTsKKworCWJsa19mcmVlX2RldnQocGFydF9kZXZ0KHBhcnQpKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIocHRibC0+cGFydFtwYXJ0bm9dLCBOVUxMKTsKKwlrb2JqZWN0X3B1dChwYXJ0LT5ob2xkZXJfZGlyKTsKKwlkZXZpY2VfZGVsKHBhcnRfdG9fZGV2KHBhcnQpKTsKKworCWNhbGxfcmN1KCZwYXJ0LT5yY3VfaGVhZCwgZGVsZXRlX3BhcnRpdGlvbl9yY3VfY2IpOwogfQogCiBzdGF0aWMgc3NpemVfdCB3aG9sZV9kaXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtMzQ0LDEwMiArMzM4LDEzMiBAQAogc3RhdGljIERFVklDRV9BVFRSKHdob2xlX2Rpc2ssIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKIAkJICAgd2hvbGVfZGlza19zaG93LCBOVUxMKTsKIAotaW50IGFkZF9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0LCBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCBpbnQgZmxhZ3MpCitpbnQgYWRkX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IHBhcnRubywKKwkJICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGhkX3N0cnVjdCAqcDsKKwlkZXZfdCBkZXZ0ID0gTUtERVYoMCwgMCk7CisJc3RydWN0IGRldmljZSAqZGRldiA9IGRpc2tfdG9fZGV2KGRpc2spOworCXN0cnVjdCBkZXZpY2UgKnBkZXY7CisJc3RydWN0IGRpc2tfcGFydF90YmwgKnB0Ymw7CisJY29uc3QgY2hhciAqZG5hbWU7CiAJaW50IGVycjsKIAorCWVyciA9IGRpc2tfZXhwYW5kX3BhcnRfdGJsKGRpc2ssIHBhcnRubyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlwdGJsID0gZGlzay0+cGFydF90Ymw7CisKKwlpZiAocHRibC0+cGFydFtwYXJ0bm9dKQorCQlyZXR1cm4gLUVCVVNZOworCiAJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICghaW5pdF9wYXJ0X3N0YXRzKHApKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0MDsKKwkJZ290byBvdXRfZnJlZTsKIAl9CisJcGRldiA9IHBhcnRfdG9fZGV2KHApOworCiAJcC0+c3RhcnRfc2VjdCA9IHN0YXJ0OwogCXAtPm5yX3NlY3RzID0gbGVuOwotCXAtPnBhcnRubyA9IHBhcnQ7Ci0JcC0+cG9saWN5ID0gZGlzay0+cG9saWN5OworCXAtPnBhcnRubyA9IHBhcnRubzsKKwlwLT5wb2xpY3kgPSBnZXRfZGlza19ybyhkaXNrKTsKIAotCWlmIChpc2RpZ2l0KGRpc2stPmRldi5idXNfaWRbc3RybGVuKGRpc2stPmRldi5idXNfaWQpLTFdKSkKLQkJc25wcmludGYocC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCSIlc3AlZCIsIGRpc2stPmRldi5idXNfaWQsIHBhcnQpOworCWRuYW1lID0gZGV2X25hbWUoZGRldik7CisJaWYgKGlzZGlnaXQoZG5hbWVbc3RybGVuKGRuYW1lKSAtIDFdKSkKKwkJc25wcmludGYocGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzcCVkIiwgZG5hbWUsIHBhcnRubyk7CiAJZWxzZQotCQlzbnByaW50ZihwLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwKLQkJCSAiJXMlZCIsIGRpc2stPmRldi5idXNfaWQsIHBhcnQpOworCQlzbnByaW50ZihwZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMlZCIsIGRuYW1lLCBwYXJ0bm8pOwogCi0JZGV2aWNlX2luaXRpYWxpemUoJnAtPmRldik7Ci0JcC0+ZGV2LmRldnQgPSBNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IgKyBwYXJ0KTsKLQlwLT5kZXYuY2xhc3MgPSAmYmxvY2tfY2xhc3M7Ci0JcC0+ZGV2LnR5cGUgPSAmcGFydF90eXBlOwotCXAtPmRldi5wYXJlbnQgPSAmZGlzay0+ZGV2OwotCWRpc2stPnBhcnRbcGFydC0xXSA9IHA7CisJZGV2aWNlX2luaXRpYWxpemUocGRldik7CisJcGRldi0+Y2xhc3MgPSAmYmxvY2tfY2xhc3M7CisJcGRldi0+dHlwZSA9ICZwYXJ0X3R5cGU7CisJcGRldi0+cGFyZW50ID0gZGRldjsKKworCWVyciA9IGJsa19hbGxvY19kZXZ0KHAsICZkZXZ0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCXBkZXYtPmRldnQgPSBkZXZ0OwogCiAJLyogZGVsYXkgdWV2ZW50IHVudGlsICdob2xkZXJzJyBzdWJkaXIgaXMgY3JlYXRlZCAqLwotCXAtPmRldi51ZXZlbnRfc3VwcHJlc3MgPSAxOwotCWVyciA9IGRldmljZV9hZGQoJnAtPmRldik7CisJcGRldi0+dWV2ZW50X3N1cHByZXNzID0gMTsKKwllcnIgPSBkZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKLQlwYXJ0aXRpb25fc3lzZnNfYWRkX3N1YmRpcihwKTsKLQlwLT5kZXYudWV2ZW50X3N1cHByZXNzID0gMDsKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gLUVOT01FTTsKKwlwLT5ob2xkZXJfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiaG9sZGVycyIsICZwZGV2LT5rb2JqKTsKKwlpZiAoIXAtPmhvbGRlcl9kaXIpCisJCWdvdG8gb3V0X2RlbDsKKworCXBkZXYtPnVldmVudF9zdXBwcmVzcyA9IDA7CiAJaWYgKGZsYWdzICYgQUREUEFSVF9GTEFHX1dIT0xFRElTSykgewotCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnAtPmRldiwgJmRldl9hdHRyX3dob2xlX2Rpc2spOworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocGRldiwgJmRldl9hdHRyX3dob2xlX2Rpc2spOwogCQlpZiAoZXJyKQotCQkJZ290byBvdXQyOworCQkJZ290byBvdXRfZGVsOwogCX0KIAorCS8qIGV2ZXJ5dGhpbmcgaXMgdXAgYW5kIHJ1bm5pbmcsIGNvbW1lbmNlICovCisJSU5JVF9SQ1VfSEVBRCgmcC0+cmN1X2hlYWQpOworCXJjdV9hc3NpZ25fcG9pbnRlcihwdGJsLT5wYXJ0W3BhcnRub10sIHApOworCiAJLyogc3VwcHJlc3MgdWV2ZW50IGlmIHRoZSBkaXNrIHN1cHJlc3NlcyBpdCAqLwotCWlmICghZGlzay0+ZGV2LnVldmVudF9zdXBwcmVzcykKLQkJa29iamVjdF91ZXZlbnQoJnAtPmRldi5rb2JqLCBLT0JKX0FERCk7CisJaWYgKCFkZGV2LT51ZXZlbnRfc3VwcHJlc3MpCisJCWtvYmplY3RfdWV2ZW50KCZwZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAKIAlyZXR1cm4gMDsKIAotb3V0MjoKLQlkZXZpY2VfZGVsKCZwLT5kZXYpOwotb3V0MToKLQlwdXRfZGV2aWNlKCZwLT5kZXYpOwotCWZyZWVfcGFydF9zdGF0cyhwKTsKLW91dDA6CitvdXRfZnJlZToKIAlrZnJlZShwKTsKIAlyZXR1cm4gZXJyOworb3V0X2RlbDoKKwlrb2JqZWN0X3B1dChwLT5ob2xkZXJfZGlyKTsKKwlkZXZpY2VfZGVsKHBkZXYpOworb3V0X3B1dDoKKwlwdXRfZGV2aWNlKHBkZXYpOworCWJsa19mcmVlX2RldnQoZGV2dCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogTm90IGV4cG9ydGVkLCBoZWxwZXIgdG8gYWRkX2Rpc2soKS4gKi8KIHZvaWQgcmVnaXN0ZXJfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZGV2ID0gZGlza190b19kZXYoZGlzayk7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAljaGFyICpzOwotCWludCBpOwotCXN0cnVjdCBoZF9zdHJ1Y3QgKnA7CiAJaW50IGVycjsKIAotCWRpc2stPmRldi5wYXJlbnQgPSBkaXNrLT5kcml2ZXJmc19kZXY7Ci0JZGlzay0+ZGV2LmRldnQgPSBNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpOworCWRkZXYtPnBhcmVudCA9IGRpc2stPmRyaXZlcmZzX2RldjsKIAotCXN0cmxjcHkoZGlzay0+ZGV2LmJ1c19pZCwgZGlzay0+ZGlza19uYW1lLCBCVVNfSURfU0laRSk7CisJc3RybGNweShkZGV2LT5idXNfaWQsIGRpc2stPmRpc2tfbmFtZSwgQlVTX0lEX1NJWkUpOwogCS8qIGV3d3cuLi4gc29tZSBvZiB0aGVzZSBidWdnZXJzIGhhdmUgLyBpbiB0aGUgbmFtZS4uLiAqLwotCXMgPSBzdHJjaHIoZGlzay0+ZGV2LmJ1c19pZCwgJy8nKTsKKwlzID0gc3RyY2hyKGRkZXYtPmJ1c19pZCwgJy8nKTsKIAlpZiAocykKIAkJKnMgPSAnISc7CiAKIAkvKiBkZWxheSB1ZXZlbnRzLCB1bnRpbCB3ZSBzY2FubmVkIHBhcnRpdGlvbiB0YWJsZSAqLwotCWRpc2stPmRldi51ZXZlbnRfc3VwcHJlc3MgPSAxOworCWRkZXYtPnVldmVudF9zdXBwcmVzcyA9IDE7CiAKLQlpZiAoZGV2aWNlX2FkZCgmZGlzay0+ZGV2KSkKKwlpZiAoZGV2aWNlX2FkZChkZGV2KSkKIAkJcmV0dXJuOwogI2lmbmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAotCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKGJsb2NrX2RlcHIsICZkaXNrLT5kZXYua29iaiwKLQkJCQlrb2JqZWN0X25hbWUoJmRpc2stPmRldi5rb2JqKSk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoYmxvY2tfZGVwciwgJmRkZXYtPmtvYmosCisJCQkJa29iamVjdF9uYW1lKCZkZGV2LT5rb2JqKSk7CiAJaWYgKGVycikgewotCQlkZXZpY2VfZGVsKCZkaXNrLT5kZXYpOworCQlkZXZpY2VfZGVsKGRkZXYpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCi0JZGlza19zeXNmc19hZGRfc3ViZGlycyhkaXNrKTsKKwlkaXNrLT5wYXJ0MC5ob2xkZXJfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiaG9sZGVycyIsICZkZGV2LT5rb2JqKTsKKwlkaXNrLT5zbGF2ZV9kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJzbGF2ZXMiLCAmZGRldi0+a29iaik7CiAKIAkvKiBObyBtaW5vcnMgdG8gdXNlIGZvciBwYXJ0aXRpb25zICovCi0JaWYgKGRpc2stPm1pbm9ycyA9PSAxKQorCWlmICghZGlza19wYXJ0aXRpb25hYmxlKGRpc2spKQogCQlnb3RvIGV4aXQ7CiAKIAkvKiBObyBzdWNoIGRldmljZSAoZS5nLiwgbWVkaWEgd2VyZSBqdXN0IHJlbW92ZWQpICovCkBAIC00NTgsNTEgKzQ4Miw4MCBAQAogCiBleGl0OgogCS8qIGFubm91bmNlIGRpc2sgYWZ0ZXIgcG9zc2libGUgcGFydGl0aW9ucyBhcmUgY3JlYXRlZCAqLwotCWRpc2stPmRldi51ZXZlbnRfc3VwcHJlc3MgPSAwOwotCWtvYmplY3RfdWV2ZW50KCZkaXNrLT5kZXYua29iaiwgS09CSl9BREQpOworCWRkZXYtPnVldmVudF9zdXBwcmVzcyA9IDA7CisJa29iamVjdF91ZXZlbnQoJmRkZXYtPmtvYmosIEtPQkpfQUREKTsKIAogCS8qIGFubm91bmNlIHBvc3NpYmxlIHBhcnRpdGlvbnMgKi8KLQlmb3IgKGkgPSAxOyBpIDwgZGlzay0+bWlub3JzOyBpKyspIHsKLQkJcCA9IGRpc2stPnBhcnRbaS0xXTsKLQkJaWYgKCFwIHx8ICFwLT5ucl9zZWN0cykKLQkJCWNvbnRpbnVlOwotCQlrb2JqZWN0X3VldmVudCgmcC0+ZGV2LmtvYmosIEtPQkpfQUREKTsKLQl9CisJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIDApOworCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpCisJCWtvYmplY3RfdWV2ZW50KCZwYXJ0X3RvX2RldihwYXJ0KS0+a29iaiwgS09CSl9BREQpOworCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKIH0KIAogaW50IHJlc2Nhbl9wYXJ0aXRpb25zKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogeworCXN0cnVjdCBkaXNrX3BhcnRfaXRlciBwaXRlcjsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwogCXN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGU7Ci0JaW50IHAsIHJlczsKKwlpbnQgcCwgaGlnaGVzdCwgcmVzOwogCiAJaWYgKGJkZXYtPmJkX3BhcnRfY291bnQpCiAJCXJldHVybiAtRUJVU1k7CiAJcmVzID0gaW52YWxpZGF0ZV9wYXJ0aXRpb24oZGlzaywgMCk7CiAJaWYgKHJlcykKIAkJcmV0dXJuIHJlczsKLQliZGV2LT5iZF9pbnZhbGlkYXRlZCA9IDA7Ci0JZm9yIChwID0gMTsgcCA8IGRpc2stPm1pbm9yczsgcCsrKQotCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHApOworCisJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIERJU0tfUElURVJfSU5DTF9FTVBUWSk7CisJd2hpbGUgKChwYXJ0ID0gZGlza19wYXJ0X2l0ZXJfbmV4dCgmcGl0ZXIpKSkKKwkJZGVsZXRlX3BhcnRpdGlvbihkaXNrLCBwYXJ0LT5wYXJ0bm8pOworCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKKwogCWlmIChkaXNrLT5mb3BzLT5yZXZhbGlkYXRlX2Rpc2spCiAJCWRpc2stPmZvcHMtPnJldmFsaWRhdGVfZGlzayhkaXNrKTsKKwljaGVja19kaXNrX3NpemVfY2hhbmdlKGRpc2ssIGJkZXYpOworCWJkZXYtPmJkX2ludmFsaWRhdGVkID0gMDsKIAlpZiAoIWdldF9jYXBhY2l0eShkaXNrKSB8fCAhKHN0YXRlID0gY2hlY2tfcGFydGl0aW9uKGRpc2ssIGJkZXYpKSkKIAkJcmV0dXJuIDA7CiAJaWYgKElTX0VSUihzdGF0ZSkpCS8qIEkvTyBlcnJvciByZWFkaW5nIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KIAkJcmV0dXJuIC1FSU87CiAKIAkvKiB0ZWxsIHVzZXJzcGFjZSB0aGF0IHRoZSBtZWRpYSAvIHBhcnRpdGlvbiB0YWJsZSBtYXkgaGF2ZSBjaGFuZ2VkICovCi0Ja29iamVjdF91ZXZlbnQoJmRpc2stPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CisJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiAKKwkvKiBEZXRlY3QgdGhlIGhpZ2hlc3QgcGFydGl0aW9uIG51bWJlciBhbmQgcHJlYWxsb2NhdGUKKwkgKiBkaXNrLT5wYXJ0X3RibC4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGFuZCBub3Qgc3RyaWN0bHkKKwkgKiBuZWNlc3NhcnkuCisJICovCisJZm9yIChwID0gMSwgaGlnaGVzdCA9IDA7IHAgPCBzdGF0ZS0+bGltaXQ7IHArKykKKwkJaWYgKHN0YXRlLT5wYXJ0c1twXS5zaXplKQorCQkJaGlnaGVzdCA9IHA7CisKKwlkaXNrX2V4cGFuZF9wYXJ0X3RibChkaXNrLCBoaWdoZXN0KTsKKworCS8qIGFkZCBwYXJ0aXRpb25zICovCiAJZm9yIChwID0gMTsgcCA8IHN0YXRlLT5saW1pdDsgcCsrKSB7CiAJCXNlY3Rvcl90IHNpemUgPSBzdGF0ZS0+cGFydHNbcF0uc2l6ZTsKIAkJc2VjdG9yX3QgZnJvbSA9IHN0YXRlLT5wYXJ0c1twXS5mcm9tOwogCQlpZiAoIXNpemUpCiAJCQljb250aW51ZTsKLQkJaWYgKGZyb20gKyBzaXplID4gZ2V0X2NhcGFjaXR5KGRpc2spKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiAlczogcCVkIGV4Y2VlZHMgZGV2aWNlIGNhcGFjaXR5XG4iLAotCQkJCWRpc2stPmRpc2tfbmFtZSwgcCk7CisJCWlmIChmcm9tID49IGdldF9jYXBhY2l0eShkaXNrKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogcCVkIGlnbm9yZWQsIHN0YXJ0ICVsbHUgaXMgYmVoaW5kIHRoZSBlbmQgb2YgdGhlIGRpc2tcbiIsCisJCQkgICAgICAgZGlzay0+ZGlza19uYW1lLCBwLCAodW5zaWduZWQgbG9uZyBsb25nKSBmcm9tKTsKIAkJCWNvbnRpbnVlOwogCQl9CisJCWlmIChmcm9tICsgc2l6ZSA+IGdldF9jYXBhY2l0eShkaXNrKSkgeworCQkJLyoKKwkJCSAqIHdlIGNhbiBub3QgaWdub3JlIHBhcnRpdGlvbnMgb2YgYnJva2VuIHRhYmxlcworCQkJICogY3JlYXRlZCBieSBmb3IgZXhhbXBsZSBjYW1lcmEgZmlybXdhcmUsIGJ1dCB3ZQorCQkJICogbGltaXQgdGhlbSB0byB0aGUgZW5kIG9mIHRoZSBkaXNrIHRvIGF2b2lkCisJCQkgKiBjcmVhdGluZyBpbnZhbGlkIGJsb2NrIGRldmljZXMKKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogcCVkIHNpemUgJWxsdSBsaW1pdGVkIHRvIGVuZCBvZiBkaXNrXG4iLAorCQkJICAgICAgIGRpc2stPmRpc2tfbmFtZSwgcCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2l6ZSk7CisJCQlzaXplID0gZ2V0X2NhcGFjaXR5KGRpc2spIC0gZnJvbTsKKwkJfQogCQlyZXMgPSBhZGRfcGFydGl0aW9uKGRpc2ssIHAsIGZyb20sIHNpemUsIHN0YXRlLT5wYXJ0c1twXS5mbGFncyk7CiAJCWlmIChyZXMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiICVzOiBwJWQgY291bGQgbm90IGJlIGFkZGVkOiAlZFxuIiwKQEAgLTU0MSwyNSArNTk0LDMxIEBACiAKIHZvaWQgZGVsX2dlbmRpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JaW50IHA7CisJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAKIAkvKiBpbnZhbGlkYXRlIHN0dWZmICovCi0JZm9yIChwID0gZGlzay0+bWlub3JzIC0gMTsgcCA+IDA7IHAtLSkgewotCQlpbnZhbGlkYXRlX3BhcnRpdGlvbihkaXNrLCBwKTsKLQkJZGVsZXRlX3BhcnRpdGlvbihkaXNrLCBwKTsKKwlkaXNrX3BhcnRfaXRlcl9pbml0KCZwaXRlciwgZGlzaywKKwkJCSAgICAgRElTS19QSVRFUl9JTkNMX0VNUFRZIHwgRElTS19QSVRFUl9SRVZFUlNFKTsKKwl3aGlsZSAoKHBhcnQgPSBkaXNrX3BhcnRfaXRlcl9uZXh0KCZwaXRlcikpKSB7CisJCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIHBhcnQtPnBhcnRubyk7CisJCWRlbGV0ZV9wYXJ0aXRpb24oZGlzaywgcGFydC0+cGFydG5vKTsKIAl9CisJZGlza19wYXJ0X2l0ZXJfZXhpdCgmcGl0ZXIpOworCiAJaW52YWxpZGF0ZV9wYXJ0aXRpb24oZGlzaywgMCk7Ci0JZGlzay0+Y2FwYWNpdHkgPSAwOworCWJsa19mcmVlX2RldnQoZGlza190b19kZXYoZGlzayktPmRldnQpOworCXNldF9jYXBhY2l0eShkaXNrLCAwKTsKIAlkaXNrLT5mbGFncyAmPSB+R0VOSERfRkxfVVA7CiAJdW5saW5rX2dlbmRpc2soZGlzayk7Ci0JZGlza19zdGF0X3NldF9hbGwoZGlzaywgMCk7Ci0JZGlzay0+c3RhbXAgPSAwOworCXBhcnRfc3RhdF9zZXRfYWxsKCZkaXNrLT5wYXJ0MCwgMCk7CisJZGlzay0+cGFydDAuc3RhbXAgPSAwOwogCi0Ja29iamVjdF9wdXQoZGlzay0+aG9sZGVyX2Rpcik7CisJa29iamVjdF9wdXQoZGlzay0+cGFydDAuaG9sZGVyX2Rpcik7CiAJa29iamVjdF9wdXQoZGlzay0+c2xhdmVfZGlyKTsKIAlkaXNrLT5kcml2ZXJmc19kZXYgPSBOVUxMOwogI2lmbmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAotCXN5c2ZzX3JlbW92ZV9saW5rKGJsb2NrX2RlcHIsIGRpc2stPmRldi5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKGJsb2NrX2RlcHIsIGRldl9uYW1lKGRpc2tfdG9fZGV2KGRpc2spKSk7CiAjZW5kaWYKLQlkZXZpY2VfZGVsKCZkaXNrLT5kZXYpOworCWRldmljZV9kZWwoZGlza190b19kZXYoZGlzaykpOwogfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5oIGIvZnMvcGFydGl0aW9ucy9jaGVjay5oCmluZGV4IDE3YWU4ZWMuLjk4ZGJlMWEgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suaAorKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmgKQEAgLTUsMTUgKzUsMTMgQEAKICAqIGFkZF9nZF9wYXJ0aXRpb24gYWRkcyBhIHBhcnRpdGlvbnMgZGV0YWlscyB0byB0aGUgZGV2aWNlcyBwYXJ0aXRpb24KICAqIGRlc2NyaXB0aW9uLgogICovCi1lbnVtIHsgTUFYX1BBUlQgPSAyNTYgfTsKLQogc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zIHsKIAljaGFyIG5hbWVbQkRFVk5BTUVfU0laRV07CiAJc3RydWN0IHsKIAkJc2VjdG9yX3QgZnJvbTsKIAkJc2VjdG9yX3Qgc2l6ZTsKIAkJaW50IGZsYWdzOwotCX0gcGFydHNbTUFYX1BBUlRdOworCX0gcGFydHNbRElTS19NQVhfUEFSVFNdOwogCWludCBuZXh0OwogCWludCBsaW1pdDsKIH07CmRpZmYgLS1naXQgYS9mcy9wcm9jL0tjb25maWcgYi9mcy9wcm9jL0tjb25maWcKaW5kZXggNzNjZDdhNC4uNTBmOGYwNiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9LY29uZmlnCisrKyBiL2ZzL3Byb2MvS2NvbmZpZwpAQCAtNTcsMyArNTcsMTMgQEAKIAkgIEFzIGl0IGlzIGdlbmVyYWxseSBhIGdvb2QgdGhpbmcsIHlvdSBzaG91bGQgc2F5IFkgaGVyZSB1bmxlc3MKIAkgIGJ1aWxkaW5nIGEga2VybmVsIGZvciBpbnN0YWxsL3Jlc2N1ZSBkaXNrcyBvciB5b3VyIHN5c3RlbSBpcyB2ZXJ5CiAJICBsaW1pdGVkIGluIG1lbW9yeS4KKworY29uZmlnIFBST0NfUEFHRV9NT05JVE9SCisgCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFJPQ19GUyAmJiBNTVUKKwlib29sICJFbmFibGUgL3Byb2MgcGFnZSBtb25pdG9yaW5nIiBpZiBFTUJFRERFRAorIAloZWxwCisJICBWYXJpb3VzIC9wcm9jIGZpbGVzIGV4aXN0IHRvIG1vbml0b3IgcHJvY2VzcyBtZW1vcnkgdXRpbGl6YXRpb246CisJICAvcHJvYy9waWQvc21hcHMsIC9wcm9jL3BpZC9jbGVhcl9yZWZzLCAvcHJvYy9waWQvcGFnZW1hcCwKKwkgIC9wcm9jL2twYWdlY291bnQsIGFuZCAvcHJvYy9rcGFnZWZsYWdzLiBEaXNhYmxpbmcgdGhlc2UKKyAgICAgICAgICBpbnRlcmZhY2VzIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwgYnkgYXBwcm94aW1hdGVseSA0a2IuCmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKaW5kZXggNzFjOWJlNS4uZjRiYzBlNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9hcnJheS5jCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtODYsMTEgKzg2LDYgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotLyogR2NjIG9wdGltaXplcyBhd2F5ICJzdHJsZW4oeCkiIGZvciBjb25zdGFudCB4ICovCi0jZGVmaW5lIEFEREJVRihidWZmZXIsIHN0cmluZykgXAotZG8geyBtZW1jcHkoYnVmZmVyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsgXAotICAgICBidWZmZXIgKz0gc3RybGVuKHN0cmluZyk7IH0gd2hpbGUgKDApCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX25hbWUoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJaW50IGk7CkBAIC0yNjEsNyArMjU2LDYgQEAKIAlzaWdlbXB0eXNldCgmaWdub3JlZCk7CiAJc2lnZW1wdHlzZXQoJmNhdWdodCk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKGxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncykpIHsKIAkJcGVuZGluZyA9IHAtPnBlbmRpbmcuc2lnbmFsOwogCQlzaHBlbmRpbmcgPSBwLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLnNpZ25hbDsKQEAgLTI3Miw3ICsyNjYsNiBAQAogCQlxbGltID0gcC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TSUdQRU5ESU5HXS5ybGltX2N1cjsKIAkJdW5sb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAogCXNlcV9wcmludGYobSwgIlRocmVhZHM6XHQlZFxuIiwgbnVtX3RocmVhZHMpOwogCXNlcV9wcmludGYobSwgIlNpZ1E6XHQlbHUvJWx1XG4iLCBxc2l6ZSwgcWxpbSk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IGEyODg0MGIuLmI1OTE4YWUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0xNDgsOSArMTQ4LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLWludCBtYXBzX3Byb3RlY3Q7Ci1FWFBPUlRfU1lNQk9MKG1hcHNfcHJvdGVjdCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZnNfc3RydWN0ICpnZXRfZnNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3QgZnNfc3RydWN0ICpmczsKQEAgLTE2NCw3ICsxNjEsNiBAQAogCiBzdGF0aWMgaW50IGdldF9ucl90aHJlYWRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCS8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJjdV9yZWFkX2xvY2sgaGVsZCAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNvdW50ID0gMDsKIApAQCAtNDcxLDE0ICs0NjcsMTAgQEAKIAogCXN0cnVjdCBybGltaXQgcmxpbVtSTElNX05MSU1JVFNdOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWlmICghbG9ja190YXNrX3NpZ2hhbmQodGFzaywmZmxhZ3MpKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCWlmICghbG9ja190YXNrX3NpZ2hhbmQodGFzaywgJmZsYWdzKSkKIAkJcmV0dXJuIDA7Ci0JfQogCW1lbWNweShybGltLCB0YXNrLT5zaWduYWwtPnJsaW0sIHNpemVvZihzdHJ1Y3QgcmxpbWl0KSAqIFJMSU1fTkxJTUlUUyk7CiAJdW5sb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyoKIAkgKiBwcmludCB0aGUgZmlsZSBoZWFkZXIKQEAgLTI0NDMsNiArMjQzNSwxMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcgKi8KIAorc3RhdGljIGludCBwcm9jX3BpZF9wZXJzb25hbGl0eShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKKwkJCQlzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzZXFfcHJpbnRmKG0sICIlMDh4XG4iLCB0YXNrLT5wZXJzb25hbGl0eSk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBUaHJlYWQgZ3JvdXBzCiAgKi8KQEAgLTI0NTksNiArMjQ1OCw3IEBACiAJUkVHKCJlbnZpcm9uIiwgICAgU19JUlVTUiwgZW52aXJvbiksCiAJSU5GKCJhdXh2IiwgICAgICAgU19JUlVTUiwgcGlkX2F1eHYpLAogCU9ORSgic3RhdHVzIiwgICAgIFNfSVJVR08sIHBpZF9zdGF0dXMpLAorCU9ORSgicGVyc29uYWxpdHkiLCBTX0lSVVNSLCBwaWRfcGVyc29uYWxpdHkpLAogCUlORigibGltaXRzIiwJICBTX0lSVVNSLCBwaWRfbGltaXRzKSwKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKIAlSRUcoInNjaGVkIiwgICAgICBTX0lSVUdPfFNfSVdVU1IsIHBpZF9zY2hlZCksCkBAIC0yNzk0LDYgKzI3OTQsNyBAQAogCVJFRygiZW52aXJvbiIsICAgU19JUlVTUiwgZW52aXJvbiksCiAJSU5GKCJhdXh2IiwgICAgICBTX0lSVVNSLCBwaWRfYXV4diksCiAJT05FKCJzdGF0dXMiLCAgICBTX0lSVUdPLCBwaWRfc3RhdHVzKSwKKwlPTkUoInBlcnNvbmFsaXR5IiwgU19JUlVTUiwgcGlkX3BlcnNvbmFsaXR5KSwKIAlJTkYoImxpbWl0cyIsCSBTX0lSVVNSLCBwaWRfbGltaXRzKSwKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKIAlSRUcoInNjaGVkIiwgICAgIFNfSVJVR098U19JV1VTUiwgcGlkX3NjaGVkKSwKQEAgLTMwODgsOSArMzA4OSw3IEBACiAJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CiAKIAlpZiAocCkgewotCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXN0YXQtPm5saW5rICs9IGdldF9ucl90aHJlYWRzKHApOwotCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcHV0X3Rhc2tfc3RydWN0KHApOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCBiY2EwZjgxLi43ODIxNTg5IDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtNTQ3LDggKzU0Nyw4IEBACiAKIAlmb3IgKHRtcCA9IGRpci0+c3ViZGlyOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKIAkJaWYgKHN0cmNtcCh0bXAtPm5hbWUsIGRwLT5uYW1lKSA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9jX2Rpcl9lbnRyeSAnJXMnIGFscmVhZHkgIgotCQkJCQkicmVnaXN0ZXJlZFxuIiwgZHAtPm5hbWUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHJvY19kaXJfZW50cnkgJyVzLyVzJyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsCisJCQkJZGlyLT5uYW1lLCBkcC0+bmFtZSk7CiAJCQlkdW1wX3N0YWNrKCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IDhiYjAzZjAuLmM2YjRmYTcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKIAkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKIAkJa2ZyZWUocGRlbyk7Ci0JCXJldHVybiBydjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBkZS0+cGRlX3VzZXJzKys7CiAJb3BlbiA9IHBkZS0+cHJvY19mb3BzLT5vcGVuOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbnRlcm5hbC5oIGIvZnMvcHJvYy9pbnRlcm5hbC5oCmluZGV4IDQ0MjIwMjMuLjNiZmI3YjggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW50ZXJuYWwuaAorKysgYi9mcy9wcm9jL2ludGVybmFsLmgKQEAgLTQ1LDggKzQ1LDYgQEAKIGV4dGVybiBpbnQgbm9tbXVfdm1hX3Nob3coc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKICNlbmRpZgogCi1leHRlcm4gaW50IG1hcHNfcHJvdGVjdDsKLQogZXh0ZXJuIGludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAogCQkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIGV4dGVybiBpbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwppbmRleCAwMGYxMGEyLi41OWVhNDJlIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbWlzYy5jCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CkBAIC02OCw3ICs2Nyw2IEBACiBleHRlcm4gaW50IGdldF9oYXJkd2FyZV9saXN0KGNoYXIgKik7CiBleHRlcm4gaW50IGdldF9zdHJhbV9saXN0KGNoYXIgKik7CiBleHRlcm4gaW50IGdldF9leGVjX2RvbWFpbl9saXN0KGNoYXIgKik7Ci1leHRlcm4gaW50IGdldF9kbWFfbGlzdChjaGFyICopOwogCiBzdGF0aWMgaW50IHByb2NfY2FsY19tZXRyaWNzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCBpbnQgbGVuKQpAQCAtMTgzLDYgKzE4MSw5IEBACiAJCSJTUmVjbGFpbWFibGU6ICU4bHUga0JcbiIKIAkJIlNVbnJlY2xhaW06ICAgJThsdSBrQlxuIgogCQkiUGFnZVRhYmxlczogICAlOGx1IGtCXG4iCisjaWZkZWYgQ09ORklHX1FVSUNLTElTVAorCQkiUXVpY2tsaXN0czogICAlOGx1IGtCXG4iCisjZW5kaWYKIAkJIk5GU19VbnN0YWJsZTogJThsdSBrQlxuIgogCQkiQm91bmNlOiAgICAgICAlOGx1IGtCXG4iCiAJCSJXcml0ZWJhY2tUbXA6ICU4bHUga0JcbiIKQEAgLTE5MCw4ICsxOTEsNyBAQAogCQkiQ29tbWl0dGVkX0FTOiAlOGx1IGtCXG4iCiAJCSJWbWFsbG9jVG90YWw6ICU4bHUga0JcbiIKIAkJIlZtYWxsb2NVc2VkOiAgJThsdSBrQlxuIgotCQkiVm1hbGxvY0NodW5rOiAlOGx1IGtCXG4iCi0JCSJRdWlja2xpc3RzOiAgICU4bHUga0JcbiIsCisJCSJWbWFsbG9jQ2h1bms6ICU4bHUga0JcbiIsCiAJCUsoaS50b3RhbHJhbSksCiAJCUsoaS5mcmVlcmFtKSwKIAkJSyhpLmJ1ZmZlcnJhbSksCkBAIC0yMTYsNiArMjE2LDkgQEAKIAkJSyhnbG9iYWxfcGFnZV9zdGF0ZShOUl9TTEFCX1JFQ0xBSU1BQkxFKSksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9VTlJFQ0xBSU1BQkxFKSksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfUEFHRVRBQkxFKSksCisjaWZkZWYgQ09ORklHX1FVSUNLTElTVAorCQlLKHF1aWNrbGlzdF90b3RhbF9zaXplKCkpLAorI2VuZGlmCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQk9VTkNFKSksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfV1JJVEVCQUNLX1RFTVApKSwKQEAgLTIyMyw4ICsyMjYsNyBAQAogCQlLKGNvbW1pdHRlZCksCiAJCSh1bnNpZ25lZCBsb25nKVZNQUxMT0NfVE9UQUwgPj4gMTAsCiAJCXZtaS51c2VkID4+IDEwLAotCQl2bWkubGFyZ2VzdF9jaHVuayA+PiAxMCwKLQkJSyhxdWlja2xpc3RfdG90YWxfc2l6ZSgpKQorCQl2bWkubGFyZ2VzdF9jaHVuayA+PiAxMAogCQkpOwogCiAJCWxlbiArPSBodWdldGxiX3JlcG9ydF9tZW1pbmZvKHBhZ2UgKyBsZW4pOwpAQCAtNjgwLDYgKzY4Miw3IEBACiAJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7CiB9CiAKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiBzdGF0aWMgaW50IGxvY2tzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbHAsICZsb2Nrc19zZXFfb3BlcmF0aW9ucyk7CkBAIC02OTEsNiArNjk0LDcgQEAKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKKyNlbmRpZiAvKiBDT05GSUdfRklMRV9MT0NLSU5HICovCiAKIHN0YXRpYyBpbnQgZXhlY2RvbWFpbnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtNjk5LDI4ICs3MDMsNiBAQAogCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOwogfQogCi0jaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCi0vKgotICogd3JpdGluZyAnQycgdG8gL3Byb2Mvc3lzcnEtdHJpZ2dlciBpcyBsaWtlIHN5c3JxLUMKLSAqLwotc3RhdGljIHNzaXplX3Qgd3JpdGVfc3lzcnFfdHJpZ2dlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAoY291bnQpIHsKLQkJY2hhciBjOwotCi0JCWlmIChnZXRfdXNlcihjLCBidWYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9faGFuZGxlX3N5c3JxKGMsIE5VTEwsIDApOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzcnFfdHJpZ2dlcl9vcGVyYXRpb25zID0gewotCS53cml0ZQkJPSB3cml0ZV9zeXNycV90cmlnZ2VyLAotfTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1BST0NfUEFHRV9NT05JVE9SCiAjZGVmaW5lIEtQTVNJWkUgc2l6ZW9mKHU2NCkKICNkZWZpbmUgS1BNTUFTSyAoS1BNU0laRSAtIDEpCkBAIC04ODQsNyArODY2LDkgQEAKICNpZmRlZiBDT05GSUdfUFJJTlRLCiAJcHJvY19jcmVhdGUoImttc2ciLCBTX0lSVVNSLCBOVUxMLCAmcHJvY19rbXNnX29wZXJhdGlvbnMpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZJTEVfTE9DS0lORwogCXByb2NfY3JlYXRlKCJsb2NrcyIsIDAsIE5VTEwsICZwcm9jX2xvY2tzX29wZXJhdGlvbnMpOworI2VuZGlmCiAJcHJvY19jcmVhdGUoImRldmljZXMiLCAwLCBOVUxMLCAmcHJvY19kZXZpbmZvX29wZXJhdGlvbnMpOwogCXByb2NfY3JlYXRlKCJjcHVpbmZvIiwgMCwgTlVMTCwgJnByb2NfY3B1aW5mb19vcGVyYXRpb25zKTsKICNpZmRlZiBDT05GSUdfQkxPQ0sKQEAgLTkyNyw3ICs5MTEsNCBAQAogI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQogCXByb2Nfdm1jb3JlID0gcHJvY19jcmVhdGUoInZtY29yZSIsIFNfSVJVU1IsIE5VTEwsICZwcm9jX3ZtY29yZV9vcGVyYXRpb25zKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQotCXByb2NfY3JlYXRlKCJzeXNycS10cmlnZ2VyIiwgU19JV1VTUiwgTlVMTCwgJnByb2Nfc3lzcnFfdHJpZ2dlcl9vcGVyYXRpb25zKTsKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IGY5YThiODkuLjk0NWE4MTAgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmdyYWJfaGVhZGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmdyYWJfaGVhZGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKFBST0NfSShpbm9kZSktPnN5c2N0bCkKIAkJcmV0dXJuIHN5c2N0bF9oZWFkX2dyYWIoUFJPQ19JKGlub2RlKS0+c3lzY3RsKTsKQEAgLTM5NSwxMCArMzk1LDEwIEBACiAJLmRfY29tcGFyZQk9IHByb2Nfc3lzX2NvbXBhcmUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3N5c19yb290OwotCiBpbnQgcHJvY19zeXNfaW5pdCh2b2lkKQogeworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zeXNfcm9vdDsKKwogCXByb2Nfc3lzX3Jvb3QgPSBwcm9jX21rZGlyKCJzeXMiLCBOVUxMKTsKIAlwcm9jX3N5c19yb290LT5wcm9jX2lvcHMgPSAmcHJvY19zeXNfZGlyX29wZXJhdGlvbnM7CiAJcHJvY19zeXNfcm9vdC0+cHJvY19mb3BzID0gJnByb2Nfc3lzX2Rpcl9maWxlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggNzNkMTg5MS4uNDgwNjgzMCAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMjEwLDkgKzIxMCw2IEBACiAJZGV2X3QgZGV2ID0gMDsKIAlpbnQgbGVuOwogCi0JaWYgKG1hcHNfcHJvdGVjdCAmJiAhcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRCkpCi0JCXJldHVybiAtRUFDQ0VTOwotCiAJaWYgKGZpbGUpIHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OwpAQCAtNzQyLDIyICs3MzksMTEgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogZXh0ZXJuIGludCBzaG93X251bWFfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CiAKLXN0YXRpYyBpbnQgc2hvd19udW1hX21hcF9jaGVja2VkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgcHJvY19tYXBzX3ByaXZhdGUgKnByaXYgPSBtLT5wcml2YXRlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByaXYtPnRhc2s7Ci0KLQlpZiAobWFwc19wcm90ZWN0ICYmICFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KLQlyZXR1cm4gc2hvd19udW1hX21hcChtLCB2KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9udW1hX21hcHNfb3AgPSB7CiAgICAgICAgIC5zdGFydCAgPSBtX3N0YXJ0LAogICAgICAgICAubmV4dCAgID0gbV9uZXh0LAogICAgICAgICAuc3RvcCAgID0gbV9zdG9wLAotICAgICAgICAuc2hvdyAgID0gc2hvd19udW1hX21hcF9jaGVja2VkCisgICAgICAgIC5zaG93ICAgPSBzaG93X251bWFfbWFwLAogfTsKIAogc3RhdGljIGludCBudW1hX21hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19ub21tdS5jIGIvZnMvcHJvYy90YXNrX25vbW11LmMKaW5kZXggNWQ4NGU3MS4uMjE5YmQ3OSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX25vbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX25vbW11LmMKQEAgLTExMCwxMSArMTEwLDYgQEAKIHN0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpfdm1sKQogewogCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sID0gX3ZtbDsKLQlzdHJ1Y3QgcHJvY19tYXBzX3ByaXZhdGUgKnByaXYgPSBtLT5wcml2YXRlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByaXYtPnRhc2s7Ci0KLQlpZiAobWFwc19wcm90ZWN0ICYmICFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEKSkKLQkJcmV0dXJuIC1FQUNDRVM7CiAKIAlyZXR1cm4gbm9tbXVfdm1hX3Nob3cobSwgdm1sLT52bWEpOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy92bWNvcmUuYyBiL2ZzL3Byb2Mvdm1jb3JlLmMKaW5kZXggOWFjMGY1ZS4uODQxMzY4YiAxMDA2NDQKLS0tIGEvZnMvcHJvYy92bWNvcmUuYworKysgYi9mcy9wcm9jL3ZtY29yZS5jCkBAIC0xNjUsMTQgKzE2NSw4IEBACiAJcmV0dXJuIGFjYzsKIH0KIAotc3RhdGljIGludCBvcGVuX3ZtY29yZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3ZtY29yZV9vcGVyYXRpb25zID0gewogCS5yZWFkCQk9IHJlYWRfdm1jb3JlLAotCS5vcGVuCQk9IG9wZW5fdm1jb3JlLAogfTsKIAogc3RhdGljIHN0cnVjdCB2bWNvcmUqIF9faW5pdCBnZXRfbmV3X2VsZW1lbnQodm9pZCkKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYyBiL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYwppbmRleCA1MjMxMmVjLi41MTQ1Y2I5IDEwMDY0NAotLS0gYS9mcy9yYW1mcy9maWxlLW5vbW11LmMKKysrIGIvZnMvcmFtZnMvZmlsZS1ub21tdS5jCkBAIC01OCw3ICs1OCw3IEBACiAgKiBzaXplIDAgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIGFuIG1tYXAgb2Ygc2hhcmVkCiAgKiBtZW1vcnkKICAqLwotc3RhdGljIGludCByYW1mc19ub21tdV9leHBhbmRfZm9yX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc2l6ZV90IG5ld3NpemUpCitpbnQgcmFtZnNfbm9tbXVfZXhwYW5kX2Zvcl9tYXBwaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBuZXdzaXplKQogewogCXN0cnVjdCBwYWdldmVjIGxydV9wdmVjOwogCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCB4cGFnZXMsIGxvb3AsIGxpbWl0OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcHJvY2ZzLmMgYi9mcy9yZWlzZXJmcy9wcm9jZnMuYwppbmRleCBiOWRiZWVjLi4zNzE3M2ZhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9wcm9jZnMuYworKysgYi9mcy9yZWlzZXJmcy9wcm9jZnMuYwpAQCAtOCw4ICs4LDYgQEAKIAogLyogcHJvYyBpbmZvIHN1cHBvcnQgYSBsYSBvbmUgY3JlYXRlZCBieSBTaXppZkBCb3Rpay5SVSBmb3IgUEdDICovCiAKLS8qICRJZDogcHJvY2ZzLmMsdiAxLjEuOC4yIDIwMDEvMDcvMTUgMTc6MDg6NDIgZ29kIEV4cCAkICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTYyMSw3ICs2MTksNiBAQAogI2VuZGlmCiAKIC8qCi0gKiAkTG9nOiBwcm9jZnMuYyx2ICQKICAqIFJldmlzaW9uIDEuMS44LjIgIDIwMDEvMDcvMTUgMTc6MDg6NDIgIGdvZAogICogIC4gdXNlIGdldF9zdXBlcigpIGluIHByb2Nmcy5jCiAgKiAgLiByZW1vdmUgcmVtb3ZlX3NhdmVfbGluaygpIGZyb20gcmVpc2VyZnNfZG9fdHJ1bmNhdGUoKQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHIuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKaW5kZXggYmIzY2I1Yi4uYWQ5MjQ2MSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHIuYworKysgYi9mcy9yZWlzZXJmcy94YXR0ci5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAl4YWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBmbGFncyk7CiAJaWYgKElTX0VSUih4YWRpcikpIHsKIAkJcmV0dXJuIEVSUl9DQVNUKHhhZGlyKTsKLQl9IGVsc2UgaWYgKHhhZGlyICYmICF4YWRpci0+ZF9pbm9kZSkgeworCX0gZWxzZSBpZiAoIXhhZGlyLT5kX2lub2RlKSB7CiAJCWRwdXQoeGFkaXIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCAxYmJjNmY0Li5hMWU3MDFjIDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtODk4LDYgKzg5OCw5IEBACiAJaWYgKHVubGlrZWx5KCEob3V0LT5mX21vZGUgJiBGTU9ERV9XUklURSkpKQogCQlyZXR1cm4gLUVCQURGOwogCisJaWYgKHVubGlrZWx5KG91dC0+Zl9mbGFncyAmIE9fQVBQRU5EKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXQgPSByd192ZXJpZnlfYXJlYShXUklURSwgb3V0LCBwcG9zLCBsZW4pOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Jpbi5jIGIvZnMvc3lzZnMvYmluLmMKaW5kZXggMDA2ZmM2NC4uNjZmNmU1OCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvYmluLmMKKysrIGIvZnMvc3lzZnMvYmluLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAlpbnQgc2l6ZSA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplOwogCWxvZmZfdCBvZmZzID0gKm9mZjsKIAlpbnQgY291bnQgPSBtaW5fdChzaXplX3QsIGJ5dGVzLCBQQUdFX1NJWkUpOworCWNoYXIgKnRlbXA7CiAKIAlpZiAoc2l6ZSkgewogCQlpZiAob2ZmcyA+IHNpemUpCkBAIC02OSwyMyArNzAsMzMgQEAKIAkJCWNvdW50ID0gc2l6ZSAtIG9mZnM7CiAJfQogCisJdGVtcCA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghdGVtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAltdXRleF9sb2NrKCZiYi0+bXV0ZXgpOwogCiAJY291bnQgPSBmaWxsX3JlYWQoZGVudHJ5LCBiYi0+YnVmZmVyLCBvZmZzLCBjb3VudCk7Ci0JaWYgKGNvdW50IDwgMCkKLQkJZ290byBvdXRfdW5sb2NrOworCWlmIChjb3VudCA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZiYi0+bXV0ZXgpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAotCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgYmItPmJ1ZmZlciwgY291bnQpKSB7CisJbWVtY3B5KHRlbXAsIGJiLT5idWZmZXIsIGNvdW50KTsKKworCW11dGV4X3VubG9jaygmYmItPm11dGV4KTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgdGVtcCwgY291bnQpKSB7CiAJCWNvdW50ID0gLUVGQVVMVDsKLQkJZ290byBvdXRfdW5sb2NrOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCXByX2RlYnVnKCJvZmZzID0gJWxsZCwgKm9mZiA9ICVsbGQsIGNvdW50ID0gJWRcbiIsIG9mZnMsICpvZmYsIGNvdW50KTsKIAogCSpvZmYgPSBvZmZzICsgY291bnQ7CiAKLSBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmYmItPm11dGV4KTsKKyBvdXRfZnJlZToKKwlrZnJlZSh0ZW1wKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTExOCw2ICsxMjksNyBAQAogCWludCBzaXplID0gZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CiAJbG9mZl90IG9mZnMgPSAqb2ZmOwogCWludCBjb3VudCA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIFBBR0VfU0laRSk7CisJY2hhciAqdGVtcDsKIAogCWlmIChzaXplKSB7CiAJCWlmIChvZmZzID4gc2l6ZSkKQEAgLTEyNiwxOSArMTM4LDI3IEBACiAJCQljb3VudCA9IHNpemUgLSBvZmZzOwogCX0KIAotCW11dGV4X2xvY2soJmJiLT5tdXRleCk7CisJdGVtcCA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghdGVtcCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoYmItPmJ1ZmZlciwgdXNlcmJ1ZiwgY291bnQpKSB7CisJaWYgKGNvcHlfZnJvbV91c2VyKHRlbXAsIHVzZXJidWYsIGNvdW50KSkgewogCQljb3VudCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKKwltdXRleF9sb2NrKCZiYi0+bXV0ZXgpOworCisJbWVtY3B5KGJiLT5idWZmZXIsIHRlbXAsIGNvdW50KTsKKwogCWNvdW50ID0gZmx1c2hfd3JpdGUoZGVudHJ5LCBiYi0+YnVmZmVyLCBvZmZzLCBjb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZiYi0+bXV0ZXgpOworCiAJaWYgKGNvdW50ID4gMCkKIAkJKm9mZiA9IG9mZnMgKyBjb3VudDsKIAotIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZiYi0+bXV0ZXgpOworb3V0X2ZyZWU6CisJa2ZyZWUodGVtcCk7CiAJcmV0dXJuIGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IGFlZGFlYmEuLjNhMDVhNTkgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC0zNzAsMTcgKzM3MCwxNyBAQAogCW1lbXNldChhY3h0LCAwLCBzaXplb2YoKmFjeHQpKTsKIAlhY3h0LT5wYXJlbnRfc2QgPSBwYXJlbnRfc2Q7CiAKLQkvKiBMb29rdXAgcGFyZW50IGlub2RlLiAgaW5vZGUgaW5pdGlhbGl6YXRpb24gYW5kIElfTkVXCi0JICogY2xlYXJpbmcgYXJlIHByb3RlY3RlZCBieSBzeXNmc19tdXRleC4gIEJ5IGdyYWJiaW5nIGl0IGFuZAotCSAqIGxvb2tpbmcgdXAgd2l0aCBfbm93YWl0IHZhcmlhbnQsIGlub2RlIHN0YXRlIGNhbiBiZQotCSAqIGRldGVybWluZWQgcmVsaWFibHkuCisJLyogTG9va3VwIHBhcmVudCBpbm9kZS4gIGlub2RlIGluaXRpYWxpemF0aW9uIGlzIHByb3RlY3RlZCBieQorCSAqIHN5c2ZzX211dGV4LCBzbyBpbm9kZSBleGlzdGVuY2UgY2FuIGJlIGRldGVybWluZWQgYnkKKwkgKiBsb29raW5nIHVwIGlub2RlIHdoaWxlIGhvbGRpbmcgc3lzZnNfbXV0ZXguCiAJICovCiAJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwogCi0JaW5vZGUgPSBpbG9va3VwNV9ub3dhaXQoc3lzZnNfc2IsIHBhcmVudF9zZC0+c19pbm8sIHN5c2ZzX2lsb29rdXBfdGVzdCwKLQkJCQlwYXJlbnRfc2QpOworCWlub2RlID0gaWxvb2t1cDUoc3lzZnNfc2IsIHBhcmVudF9zZC0+c19pbm8sIHN5c2ZzX2lsb29rdXBfdGVzdCwKKwkJCSBwYXJlbnRfc2QpOworCWlmIChpbm9kZSkgeworCQlXQVJOX09OKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpOwogCi0JaWYgKGlub2RlICYmICEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKIAkJLyogcGFyZW50IGlub2RlIGF2YWlsYWJsZSAqLwogCQlhY3h0LT5wYXJlbnRfaW5vZGUgPSBpbm9kZTsKIApAQCAtMzkzLDggKzM5Myw3IEBACiAJCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCQltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7CiAJCX0KLQl9IGVsc2UKLQkJaXB1dChpbm9kZSk7CisJfQogfQogCiAvKioKQEAgLTYzNiw2ICs2MzUsNyBAQAogCiAJcmV0dXJuIHNkOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfZ2V0X2RpcmVudCk7CiAKIHN0YXRpYyBpbnQgY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IHN5c2ZzX2RpcmVudCAqcGFyZW50X3NkLAogCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICoqcF9zZCkKQEAgLTgyOSwxNiArODI5LDEyIEBACiAJaWYgKCFuZXdfZGVudHJ5KQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQkvKiByZW5hbWUga29iamVjdCBhbmQgc3lzZnNfZGlyZW50ICovCisJLyogcmVuYW1lIHN5c2ZzX2RpcmVudCAqLwogCWVycm9yID0gLUVOT01FTTsKIAluZXdfbmFtZSA9IGR1cF9uYW1lID0ga3N0cmR1cChuZXdfbmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfbmFtZSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKGtvYmosICIlcyIsIG5ld19uYW1lKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3VubG9jazsKLQogCWR1cF9uYW1lID0gc2QtPnNfbmFtZTsKIAlzZC0+c19uYW1lID0gbmV3X25hbWU7CiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCBjOWU0ZTUwLi4xZjRhM2Y4IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0xOSwxMCArMTksMTggQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgInN5c2ZzLmgiCiAKKy8qIHVzZWQgaW4gY3Jhc2ggZHVtcHMgdG8gaGVscCB3aXRoIGRlYnVnZ2luZyAqLworc3RhdGljIGNoYXIgbGFzdF9zeXNmc19maWxlW1BBVEhfTUFYXTsKK3ZvaWQgc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0VNRVJHICJsYXN0IHN5c2ZzIGZpbGU6ICVzXG4iLCBsYXN0X3N5c2ZzX2ZpbGUpOworfQorCiAvKgogICogVGhlcmUncyBvbmUgc3lzZnNfYnVmZmVyIGZvciBlYWNoIG9wZW4gZmlsZSBhbmQgb25lCiAgKiBzeXNmc19vcGVuX2RpcmVudCBmb3IgZWFjaCBzeXNmc19kaXJlbnQgd2l0aCBvbmUgb3IgbW9yZSBvcGVuCkBAIC0zMjgsNiArMzM2LDExIEBACiAJc3RydWN0IHN5c2ZzX2J1ZmZlciAqYnVmZmVyOwogCXN0cnVjdCBzeXNmc19vcHMgKm9wczsKIAlpbnQgZXJyb3IgPSAtRUFDQ0VTOworCWNoYXIgKnA7CisKKwlwID0gZF9wYXRoKCZmaWxlLT5mX3BhdGgsIGxhc3Rfc3lzZnNfZmlsZSwgc2l6ZW9mKGxhc3Rfc3lzZnNfZmlsZSkpOworCWlmIChwKQorCQltZW1tb3ZlKGxhc3Rfc3lzZnNfZmlsZSwgcCwgc3RybGVuKHApICsgMSk7CiAKIAkvKiBuZWVkIGF0dHJfc2QgZm9yIGF0dHIgYW5kIG9wcywgaXRzIHBhcmVudCBmb3Iga29iaiAqLwogCWlmICghc3lzZnNfZ2V0X2FjdGl2ZV90d28oYXR0cl9zZCkpCkBAIC00NDAsNyArNDUzLDIzIEBACiAJcmV0dXJuIFBPTExFUlJ8UE9MTFBSSTsKIH0KIAotdm9pZCBzeXNmc19ub3RpZnkoc3RydWN0IGtvYmplY3QgKmssIGNoYXIgKmRpciwgY2hhciAqYXR0cikKK3ZvaWQgc3lzZnNfbm90aWZ5X2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfb3Blbl9kaXJlbnQgKm9kOworCisJc3Bpbl9sb2NrKCZzeXNmc19vcGVuX2RpcmVudF9sb2NrKTsKKworCW9kID0gc2QtPnNfYXR0ci5vcGVuOworCWlmIChvZCkgeworCQlhdG9taWNfaW5jKCZvZC0+ZXZlbnQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9kLT5wb2xsKTsKKwl9CisKKwlzcGluX3VubG9jaygmc3lzZnNfb3Blbl9kaXJlbnRfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19ub3RpZnlfZGlyZW50KTsKKwordm9pZCBzeXNmc19ub3RpZnkoc3RydWN0IGtvYmplY3QgKmssIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqYXR0cikKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGstPnNkOwogCkBAIC00NTAsMTkgKzQ3OSw4IEBACiAJCXNkID0gc3lzZnNfZmluZF9kaXJlbnQoc2QsIGRpcik7CiAJaWYgKHNkICYmIGF0dHIpCiAJCXNkID0gc3lzZnNfZmluZF9kaXJlbnQoc2QsIGF0dHIpOwotCWlmIChzZCkgewotCQlzdHJ1Y3Qgc3lzZnNfb3Blbl9kaXJlbnQgKm9kOwotCi0JCXNwaW5fbG9jaygmc3lzZnNfb3Blbl9kaXJlbnRfbG9jayk7Ci0KLQkJb2QgPSBzZC0+c19hdHRyLm9wZW47Ci0JCWlmIChvZCkgewotCQkJYXRvbWljX2luYygmb2QtPmV2ZW50KTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmb2QtPnBvbGwpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJnN5c2ZzX29wZW5fZGlyZW50X2xvY2spOwotCX0KKwlpZiAoc2QpCisJCXN5c2ZzX25vdGlmeV9kaXJlbnQoc2QpOwogCiAJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9tb3VudC5jIGIvZnMvc3lzZnMvbW91bnQuYwppbmRleCAxNGYwMDIzLi5hYjM0M2UzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9tb3VudC5jCisrKyBiL2ZzL3N5c2ZzL21vdW50LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJzeXNmcy5oIgogCkBAIC0xMTUsMyArMTE2LDE3IEBACiAJc3lzZnNfZGlyX2NhY2hlcCA9IE5VTEw7CiAJZ290byBvdXQ7CiB9CisKKyN1bmRlZiBzeXNmc19nZXQKK3N0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKKwlyZXR1cm4gX19zeXNmc19nZXQoc2QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfZ2V0KTsKKworI3VuZGVmIHN5c2ZzX3B1dAordm9pZCBzeXNmc19wdXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCit7CisJX19zeXNmc19wdXQoc2QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcHV0KTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5c2ZzLmggYi9mcy9zeXNmcy9zeXNmcy5oCmluZGV4IGE1ZGI0OTYuLjkzYzZkNmIgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL3N5c2ZzLmgKKysrIGIvZnMvc3lzZnMvc3lzZnMuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICoqcF9zZCk7CiB2b2lkIHN5c2ZzX3JlbW92ZV9zdWJkaXIoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5c2ZzX2RpcmVudCAqX19zeXNmc19nZXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CiAJaWYgKHNkKSB7CiAJCVdBUk5fT04oIWF0b21pY19yZWFkKCZzZC0+c19jb3VudCkpOwpAQCAtMTMyLDEyICsxMzIsMTQgQEAKIAl9CiAJcmV0dXJuIHNkOwogfQorI2RlZmluZSBzeXNmc19nZXQoc2QpIF9fc3lzZnNfZ2V0KHNkKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfcHV0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKQorc3RhdGljIGlubGluZSB2b2lkIF9fc3lzZnNfcHV0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKQogewogCWlmIChzZCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZzZC0+c19jb3VudCkpCiAJCXJlbGVhc2Vfc3lzZnNfZGlyZW50KHNkKTsKIH0KKyNkZWZpbmUgc3lzZnNfcHV0KHNkKSBfX3N5c2ZzX3B1dChzZCkKIAogLyoKICAqIGlub2RlLmMKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2J1ZGdldC5jIGIvZnMvdWJpZnMvYnVkZ2V0LmMKaW5kZXggMTU0MDk4MTUuLjczZGI0NjQgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2J1ZGdldC5jCisrKyBiL2ZzL3ViaWZzL2J1ZGdldC5jCkBAIC0zMDIsMTggKzMwMiw2IEBACiAJaW50IHN1YnRyYWN0X2xlYnM7CiAJbG9uZyBsb25nIGF2YWlsYWJsZTsKIAotCS8qCi0JICogRm9yY2UgdGhlIGFtb3VudCBhdmFpbGFibGUgdG8gdGhlIHRvdGFsIHNpemUgcmVwb3J0ZWQgaWYgdGhlIHVzZWQKLQkgKiBzcGFjZSBpcyB6ZXJvLgotCSAqLwotCWlmIChjLT5sc3QudG90YWxfdXNlZCA8PSBVQklGU19JTk9fTk9ERV9TWiAmJgotCSAgICBjLT5idWRnX2RhdGFfZ3Jvd3RoICsgYy0+YnVkZ19kZF9ncm93dGggPT0gMCkgewotCQkvKiBEbyB0aGUgc2FtZSBjYWxjdWxhdGlvbiBhcyBmb3IgYy0+YmxvY2tfY250ICovCi0JCWF2YWlsYWJsZSA9IGMtPm1haW5fbGVicyAtIDI7Ci0JCWF2YWlsYWJsZSAqPSBjLT5sZWJfc2l6ZSAtIGMtPmRhcmtfd207Ci0JCXJldHVybiBhdmFpbGFibGU7Ci0JfQotCiAJYXZhaWxhYmxlID0gYy0+bWFpbl9ieXRlcyAtIGMtPmxzdC50b3RhbF91c2VkOwogCiAJLyoKQEAgLTcxNCwzNCArNzAyLDEwNiBAQAogfQogCiAvKioKLSAqIHViaWZzX2J1ZGdfZ2V0X2ZyZWVfc3BhY2UgLSByZXR1cm4gYW1vdW50IG9mIGZyZWUgc3BhY2UuCisgKiB1Ymlmc19yZXBvcnRlZF9zcGFjZSAtIGNhbGN1bGF0ZSByZXBvcnRlZCBmcmVlIHNwYWNlLgorICogQGM6IHRoZSBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBmcmVlOiBhbW91bnQgb2YgZnJlZSBzcGFjZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbW91bnQgb2YgZnJlZSBzcGFjZSB3aGljaCB3aWxsIGJlIHJlcG9ydGVkIHRvCisgKiB1c2VyLXNwYWNlLiBVc2VyLXNwYWNlIGFwcGxpY2F0aW9uIHRlbmQgdG8gZXhwZWN0IHRoYXQgaWYgdGhlIGZpbGUtc3lzdGVtCisgKiAoZS5nLiwgdmlhIHRoZSAnc3RhdGZzKCknIGNhbGwpIHJlcG9ydHMgdGhhdCBpdCBoYXMgTiBieXRlcyBhdmFpbGFibGUsIHRoZXkKKyAqIGFyZSBhYmxlIHRvIHdyaXRlIGEgZmlsZSBvZiBzaXplIE4uIFVCSUZTIGF0dGFjaGVzIG5vZGUgaGVhZGVycyB0byBlYWNoIGRhdGEKKyAqIG5vZGUgYW5kIGl0IGhhcyB0byB3cml0ZSBpbmRleGluZCBub2RlcyBhcyB3ZWxsLiBUaGlzIGludHJvZHVjZXMgYWRkaXRpb25hbAorICogb3ZlcmhlYWQsIGFuZCBVQklGUyBpdCBoYXMgdG8gcmVwb3J0IHNsaWd0bHkgbGVzcyBmcmVlIHNwYWNlIHRvIG1lZXQgdGhlCisgKiBhYm92ZSBleHBlY3RldGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgZnJlZSBzcGFjZSBpcyBtYWRlIHVwIG9mIHVuY29tcHJlc3NlZCBkYXRhIG5vZGVzIGFuZAorICogZnVsbCBpbmRleCBub2RlcyAob25lIHBlciBkYXRhIG5vZGUsIHRyaXBsZWQgYmVjYXVzZSB3ZSBhbHdheXMgYWxsb3cgZW5vdWdoCisgKiBzcGFjZSB0byB3cml0ZSB0aGUgaW5kZXggdGhyaWNlKS4KKyAqCisgKiBOb3RlLCB0aGUgY2FsY3VsYXRpb24gaXMgcGVzc2ltaXN0aWMsIHdoaWNoIG1lYW5zIHRoYXQgbW9zdCBvZiB0aGUgdGltZQorICogVUJJRlMgcmVwb3J0cyBsZXNzIHNwYWNlIHRoYW4gaXQgYWN0dWFsbHkgaGFzLgorICovCitsb25nIGxvbmcgdWJpZnNfcmVwb3J0ZWRfc3BhY2UoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHVpbnQ2NF90IGZyZWUpCit7CisJaW50IGRpdmlzb3IsIGZhY3RvciwgZjsKKworCS8qCisJICogUmVwb3J0ZWQgc3BhY2Ugc2l6ZSBpcyBAZnJlZSAqIFgsIHdoZXJlIFggaXMgVUJJRlMgYmxvY2sgc2l6ZQorCSAqIGRpdmlkZWQgYnkgVUJJRlMgYmxvY2sgc2l6ZSArIGFsbCBvdmVyaGVhZCBvbmUgZGF0YSBibG9jaworCSAqIGludHJvZHVjZXMuIFRoZSBvdmVyaGVhZCBpcyB0aGUgbm9kZSBoZWFkZXIgKyBpbmRleGluZyBvdmVyaGVhZC4KKwkgKgorCSAqIEluZGV4aW5nIG92ZXJoZWFkIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorCSAqIEkgPSBOLyhmIC0gMSkgKyAxLCB3aGVyZSBJIC0gbnVtYmVyIG9mIGluZGV4aW5nIG5vZGVzLCBOIC0gbnVtYmVyCisJICogb2YgZGF0YSBub2RlcywgZiAtIGZhbm91dC4gQmVjYXVzZSBlZmZlY3RpdmUgVUJJRlMgZmFub3V0IGlzIHR3aWNlCisJICogYXMgbGVzcyB0aGFuIG1heGltdW0gZmFub3V0LCB3ZSBhc3N1bWUgdGhhdCBlYWNoIGRhdGEgbm9kZQorCSAqIGludHJvZHVjZXMgMyAqIEBjLT5tYXhfaWR4X25vZGVfc3ogLyAoQGMtPmZhbm91dC8yIC0gMSkgYnl0ZXMuCisJICogTm90ZSwgdGhlIG11bHRpcGxpZXIgMyBpcyBiZWNhdXNlIFVCSUZTIHJlc2V2ZXMgdGhyaWNlIGFzIG1vcmUgc3BhY2UKKwkgKiBmb3IgdGhlIGluZGV4LgorCSAqLworCWYgPSBjLT5mYW5vdXQgPiAzID8gYy0+ZmFub3V0ID4+IDEgOiAyOworCWZhY3RvciA9IFVCSUZTX0JMT0NLX1NJWkU7CisJZGl2aXNvciA9IFVCSUZTX01BWF9EQVRBX05PREVfU1o7CisJZGl2aXNvciArPSAoYy0+bWF4X2lkeF9ub2RlX3N6ICogMykgLyAoZiAtIDEpOworCWZyZWUgKj0gZmFjdG9yOworCWRvX2RpdihmcmVlLCBkaXZpc29yKTsKKwlyZXR1cm4gZnJlZTsKK30KKworLyoqCisgKiB1Ymlmc19nZXRfZnJlZV9zcGFjZSAtIHJldHVybiBhbW91bnQgb2YgZnJlZSBzcGFjZS4KICAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW1vdW50IG9mIGZyZWUgc3BhY2Ugb24gdGhlIGZpbGUtc3lzdGVtLgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGFtb3VudCBvZiBmcmVlIHNwYWNlIHRvIHJlcG9ydCB0byB1c2VyLXNwYWNlLgorICoKKyAqIEJlY2F1c2UgVUJJRlMgbWF5IGludHJvZHVjZSBzdWJzdGFudGlhbCBvdmVyaGVhZCAodGhlIGluZGV4LCBub2RlIGhlYWRlcnMsCisgKiBhbGlnaG1lbnQsIHdhc3RhZ2UgYXQgdGhlIGVuZCBvZiBlcmFzZWJsb2NrcywgZXRjKSwgaXQgY2Fubm90IHJlcG9ydCByZWFsCisgKiBhbW91bnQgb2YgZnJlZSBmbGFzaCBzcGFjZSBpdCBoYXMgKHdlbGwsIGJlY2F1c2Ugbm90IGFsbCBkaXJ0eSBzcGFjZSBpcworICogcmVjbGFtYWJsZSwgVUJJRlMgZG9lcyBub3QgYWN0dWFsbHkga25vdyB0aGUgcmVhbCBhbW91bnQpLiBJZiBVQklGUyBkaWQgc28sCisgKiBpdCB3b3VsZCBicmVhZCB1c2VyIGV4cGVjdGV0aW9uIGFib3V0IHdoYXQgZnJlZSBzcGFjZSBpcy4gVXNlcnMgc2VlbSB0bworICogYWNjdXN0b21lZCB0byBhc3N1bWUgdGhhdCBpZiB0aGUgZmlsZS1zeXN0ZW0gcmVwb3J0cyBOIGJ5dGVzIG9mIGZyZWUgc3BhY2UsCisgKiB0aGV5IHdvdWxkIGJlIGFibGUgdG8gZml0IGEgZmlsZSBvZiBOIGJ5dGVzIHRvIHRoZSBGUy4gVGhpcyBhbG1vc3Qgd29ya3MgZm9yCisgKiB0cmFkaXRpb25hbCBmaWxlLXN5c3RlbXMsIGJlY2F1c2UgdGhleSBoYXZlIHdheSBsZXNzIG92ZXJoZWFkIHRoYW4gVUJJRlMuCisgKiBTbywgdG8ga2VlcCB1c2VycyBoYXBweSwgVUJJRlMgdHJpZXMgdG8gdGFrZSB0aGUgb3ZlcmhlYWQgaW50byBhY2NvdW50LgogICovCi1sb25nIGxvbmcgdWJpZnNfYnVkZ19nZXRfZnJlZV9zcGFjZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKK2xvbmcgbG9uZyB1Ymlmc19nZXRfZnJlZV9zcGFjZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYykKIHsKLQlpbnQgbWluX2lkeF9sZWJzLCByc3ZkX2lkeF9sZWJzOworCWludCBtaW5faWR4X2xlYnMsIHJzdmRfaWR4X2xlYnMsIGxlYnM7CiAJbG9uZyBsb25nIGF2YWlsYWJsZSwgb3V0c3RhbmRpbmcsIGZyZWU7CiAKLQkvKiBEbyBleGFjdGx5IHRoZSBzYW1lIGNhbGN1bGF0aW9ucyBhcyBpbiAnZG9fYnVkZ2V0X3NwYWNlKCknICovCiAJc3Bpbl9sb2NrKCZjLT5zcGFjZV9sb2NrKTsKIAltaW5faWR4X2xlYnMgPSB1Ymlmc19jYWxjX21pbl9pZHhfbGVicyhjKTsKKwlvdXRzdGFuZGluZyA9IGMtPmJ1ZGdfZGF0YV9ncm93dGggKyBjLT5idWRnX2RkX2dyb3d0aDsKIAorCS8qCisJICogRm9yY2UgdGhlIGFtb3VudCBhdmFpbGFibGUgdG8gdGhlIHRvdGFsIHNpemUgcmVwb3J0ZWQgaWYgdGhlIHVzZWQKKwkgKiBzcGFjZSBpcyB6ZXJvLgorCSAqLworCWlmIChjLT5sc3QudG90YWxfdXNlZCA8PSBVQklGU19JTk9fTk9ERV9TWiAmJiAhb3V0c3RhbmRpbmcpIHsKKwkJc3Bpbl91bmxvY2soJmMtPnNwYWNlX2xvY2spOworCQlyZXR1cm4gKGxvbmcgbG9uZyljLT5ibG9ja19jbnQgPDwgVUJJRlNfQkxPQ0tfU0hJRlQ7CisJfQorCisJYXZhaWxhYmxlID0gdWJpZnNfY2FsY19hdmFpbGFibGUoYywgbWluX2lkeF9sZWJzKTsKKworCS8qCisJICogV2hlbiByZXBvcnRpbmcgZnJlZSBzcGFjZSB0byB1c2VyLXNwYWNlLCBVQklGUyBndWFyYW50ZWVzIHRoYXQgaXQgaXMKKwkgKiBwb3NzaWJsZSB0byB3cml0ZSBhIGZpbGUgb2YgZnJlZSBzcGFjZSBzaXplLiBUaGlzIG1lYW5zIHRoYXQgZm9yCisJICogZW1wdHkgTEVCcyB3ZSBtYXkgdXNlIG1vcmUgcHJlY2lzZSBjYWxjdWxhdGlvbnMgdGhhbgorCSAqICd1Ymlmc19jYWxjX2F2YWlsYWJsZSgpJyBpcyB1c2luZy4gTmFtZWx5LCB3ZSBrbm93IHRoYXQgaW4gZW1wdHkKKwkgKiBMRUJzIHdlIHdvdWxkIHdhc3RlIG9ubHkgQGMtPmxlYl9vdmVyaGVhZCBieXRlcywgbm90IEBjLT5kYXJrX3dtLgorCSAqIFRodXMsIGFtZW5kIHRoZSBhdmFpbGFibGUgc3BhY2UuCisJICoKKwkgKiBOb3RlLCB0aGUgY2FsY3VsYXRpb25zIGJlbG93IGFyZSBzaW1pbGFyIHRvIHdoYXQgd2UgaGF2ZSBpbgorCSAqICdkb19idWRnZXRfc3BhY2UoKScsIHNvIHJlZmVyIHRoZXJlIGZvciBjb21tZW50cy4KKwkgKi8KIAlpZiAobWluX2lkeF9sZWJzID4gYy0+bHN0LmlkeF9sZWJzKQogCQlyc3ZkX2lkeF9sZWJzID0gbWluX2lkeF9sZWJzIC0gYy0+bHN0LmlkeF9sZWJzOwogCWVsc2UKIAkJcnN2ZF9pZHhfbGVicyA9IDA7Ci0KLQlpZiAocnN2ZF9pZHhfbGVicyA+IGMtPmxzdC5lbXB0eV9sZWJzICsgYy0+ZnJlZWFibGVfY250ICsgYy0+aWR4X2djX2NudAotCQkJCS0gYy0+bHN0LnRha2VuX2VtcHR5X2xlYnMpIHsKLQkJc3Bpbl91bmxvY2soJmMtPnNwYWNlX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlhdmFpbGFibGUgPSB1Ymlmc19jYWxjX2F2YWlsYWJsZShjLCBtaW5faWR4X2xlYnMpOwotCW91dHN0YW5kaW5nID0gYy0+YnVkZ19kYXRhX2dyb3d0aCArIGMtPmJ1ZGdfZGRfZ3Jvd3RoOwotCWMtPm1pbl9pZHhfbGVicyA9IG1pbl9pZHhfbGViczsKKwlsZWJzID0gYy0+bHN0LmVtcHR5X2xlYnMgKyBjLT5mcmVlYWJsZV9jbnQgKyBjLT5pZHhfZ2NfY250IC0KKwkgICAgICAgYy0+bHN0LnRha2VuX2VtcHR5X2xlYnM7CisJbGVicyAtPSByc3ZkX2lkeF9sZWJzOworCWF2YWlsYWJsZSArPSBsZWJzICogKGMtPmRhcmtfd20gLSBjLT5sZWJfb3ZlcmhlYWQpOwogCXNwaW5fdW5sb2NrKCZjLT5zcGFjZV9sb2NrKTsKIAogCWlmIChhdmFpbGFibGUgPiBvdXRzdGFuZGluZykKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2RlYnVnLmMgYi9mcy91Ymlmcy9kZWJ1Zy5jCmluZGV4IGI5Y2I3NzQuLmQ3Zjc2NDUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2RlYnVnLmMKKysrIGIvZnMvdWJpZnMvZGVidWcuYwpAQCAtNTM4LDcgKzUzOCw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICJcdCVkIG9ycGhhbiBpbm9kZSBudW1iZXJzOlxuIiwgbik7CiAJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiXHQgIGlubyAlbGx1XG4iLAotCQkJICAgICAgIGxlNjRfdG9fY3B1KG9ycGgtPmlub3NbaV0pKTsKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KG9ycGgtPmlub3NbaV0pKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kaXIuYyBiL2ZzL3ViaWZzL2Rpci5jCmluZGV4IDVjOTZmMWYuLjUyNmMwMWUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2Rpci5jCisrKyBiL2ZzL3ViaWZzL2Rpci5jCkBAIC00MjYsNyArNDI2LDcgQEAKIAogCXdoaWxlICgxKSB7CiAJCWRiZ19nZW4oImZlZWQgJyVzJywgaW5vICVsbHUsIG5ldyBmX3BvcyAlI3giLAotCQkJZGVudC0+bmFtZSwgbGU2NF90b19jcHUoZGVudC0+aW51bSksCisJCQlkZW50LT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGRlbnQtPmludW0pLAogCQkJa2V5X2hhc2hfZmxhc2goYywgJmRlbnQtPmtleSkpOwogCQl1Ymlmc19hc3NlcnQoZGVudC0+Y2guc3FudW0gPiB1Ymlmc19pbm9kZShkaXIpLT5jcmVhdF9zcW51bSk7CiAKQEAgLTU4Nyw3ICs1ODcsNiBAQAogCWlmIChlcnIpIHsKIAkJaWYgKGVyciAhPSAtRU5PU1BDKQogCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gMDsKIAkJYnVkZ2V0ZWQgPSAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZmlsZS5jIGIvZnMvdWJpZnMvZmlsZS5jCmluZGV4IDQwNzFkMWMuLjNkNjk4ZTIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2ZpbGUuYworKysgYi9mcy91Ymlmcy9maWxlLmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IHViaWZzX2J1ZGdldF9yZXEgcmVxOwogCWxvZmZfdCBvbGRfc2l6ZSA9IGlub2RlLT5pX3NpemUsIG5ld19zaXplID0gYXR0ci0+aWFfc2l6ZTsKLQlpbnQgb2Zmc2V0ID0gbmV3X3NpemUgJiAoVUJJRlNfQkxPQ0tfU0laRSAtIDEpOworCWludCBvZmZzZXQgPSBuZXdfc2l6ZSAmIChVQklGU19CTE9DS19TSVpFIC0gMSksIGJ1ZGdldGVkID0gMTsKIAlzdHJ1Y3QgdWJpZnNfaW5vZGUgKnVpID0gdWJpZnNfaW5vZGUoaW5vZGUpOwogCiAJZGJnX2dlbigiaW5vICVsdSwgc2l6ZSAlbGxkIC0+ICVsbGQiLCBpbm9kZS0+aV9pbm8sIG9sZF9zaXplLCBuZXdfc2l6ZSk7CkBAIC04MTEsOCArODExLDE1IEBACiAJLyogQSBmdW5ueSB3YXkgdG8gYnVkZ2V0IGZvciB0cnVuY2F0aW9uIG5vZGUgKi8KIAlyZXEuZGlydGllZF9pbm9fZCA9IFVCSUZTX1RSVU5fTk9ERV9TWjsKIAllcnIgPSB1Ymlmc19idWRnZXRfc3BhY2UoYywgJnJlcSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlpZiAoZXJyKSB7CisJCS8qCisJCSAqIFRyZWF0IHRydW5jYXRpb25zIHRvIHplcm8gYXMgZGVsZXRpb24gYW5kIGFsd2F5cyBhbGxvdyB0aGVtLAorCQkgKiBqdXN0IGxpa2Ugd2UgZG8gZm9yICctPnVubGluaygpJy4KKwkJICovCisJCWlmIChuZXdfc2l6ZSB8fCBlcnIgIT0gLUVOT1NQQykKKwkJCXJldHVybiBlcnI7CisJCWJ1ZGdldGVkID0gMDsKKwl9CiAKIAllcnIgPSB2bXRydW5jYXRlKGlub2RlLCBuZXdfc2l6ZSk7CiAJaWYgKGVycikKQEAgLTg2OSw3ICs4NzYsMTIgQEAKIAllcnIgPSB1Ymlmc19qbmxfdHJ1bmNhdGUoYywgaW5vZGUsIG9sZF9zaXplLCBuZXdfc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZ1aS0+dWlfbXV0ZXgpOwogb3V0X2J1ZGc6Ci0JdWJpZnNfcmVsZWFzZV9idWRnZXQoYywgJnJlcSk7CisJaWYgKGJ1ZGdldGVkKQorCQl1Ymlmc19yZWxlYXNlX2J1ZGdldChjLCAmcmVxKTsKKwllbHNlIHsKKwkJYy0+bm9zcGFjZSA9IGMtPm5vc3BhY2VfcnAgPSAwOworCQlzbXBfd21iKCk7CisJfQogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2ZpbmQuYyBiL2ZzL3ViaWZzL2ZpbmQuYwppbmRleCBhZGVlN2I1Li40NzgxNGNkIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9maW5kLmMKKysrIGIvZnMvdWJpZnMvZmluZC5jCkBAIC0yMTEsMTQgKzIxMSw4IEBACiAgKiBkaXJ0eSBpbmRleCBoZWFwLCBhbmQgaXQgZmFsbHMtYmFjayB0byBMUFQgc2Nhbm5pbmcgaWYgdGhlIGhlYXBzIGFyZSBlbXB0eQogICogb3IgZG8gbm90IGhhdmUgYW4gTEVCIHdoaWNoIHNhdGlzZmllcyB0aGUgQG1pbl9zcGFjZSBjcml0ZXJpYS4KICAqCi0gKiBOb3RlOgotICogICBvIExFQnMgd2hpY2ggaGF2ZSBsZXNzIHRoYW4gZGVhZCB3YXRlcm1hcmsgb2YgZGlydHkgc3BhY2UgYXJlIG5ldmVyIHBpY2tlZAotICogICBieSB0aGlzIGZ1bmN0aW9uOwotICoKLSAqIFJldHVybnMgemVybyBhbmQgdGhlIExFQiBwcm9wZXJ0aWVzIG9mCi0gKiBmb3VuZCBkaXJ0eSBMRUIgaW4gY2FzZSBvZiBzdWNjZXNzLCAlLUVOT1NQQyBpZiBubyBkaXJ0eSBMRUIgd2FzIGZvdW5kIGFuZCBhCi0gKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2Ygb3RoZXIgZmFpbHVyZXMuIFRoZSByZXR1cm5lZCBMRUIgaXMgbWFya2VkIGFzCi0gKiAidGFrZW4iLgorICogTm90ZSwgTEVCcyB3aGljaCBoYXZlIGxlc3MgdGhhbiBkZWFkIHdhdGVybWFyayBvZiBmcmVlICsgZGlydHkgc3BhY2UgYXJlCisgKiBuZXZlciBwaWNrZWQgYnkgdGhpcyBmdW5jdGlvbi4KICAqCiAgKiBUaGUgYWRkaXRpb25hbCBAcGlja19mcmVlIGFyZ3VtZW50IGNvbnRyb2xzIGlmIHRoaXMgZnVuY3Rpb24gaGFzIHRvIHJldHVybiBhCiAgKiBmcmVlIG9yIGZyZWVhYmxlIExFQiBpZiBvbmUgaXMgcHJlc2VudC4gRm9yIGV4YW1wbGUsIEdDIG11c3QgdG8gc2V0IGl0IHRvICUxLApAQCAtMjMxLDYgKzIyNSwxMCBAQAogICoKICAqIEluIGFkZGl0aW9uIEBwaWNrX2ZyZWUgaXMgc2V0IHRvICUyIGJ5IHRoZSByZWNvdmVyeSBwcm9jZXNzIGluIG9yZGVyIHRvCiAgKiByZWNvdmVyIGdjX2xudW0gaW4gd2hpY2ggY2FzZSBhbiBpbmRleCBMRUIgbXVzdCBub3QgYmUgcmV0dXJuZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gYW5kIHRoZSBMRUIgcHJvcGVydGllcyBvZiBmb3VuZCBkaXJ0eSBMRUIgaW4gY2FzZQorICogb2Ygc3VjY2VzcywgJS1FTk9TUEMgaWYgbm8gZGlydHkgTEVCIHdhcyBmb3VuZCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIG90aGVyIGZhaWx1cmVzLiBUaGUgcmV0dXJuZWQgTEVCIGlzIG1hcmtlZCBhcyAidGFrZW4iLgogICovCiBpbnQgdWJpZnNfZmluZF9kaXJ0eV9sZWIoc3RydWN0IHViaWZzX2luZm8gKmMsIHN0cnVjdCB1Ymlmc19scHJvcHMgKnJldF9scCwKIAkJCSBpbnQgbWluX3NwYWNlLCBpbnQgcGlja19mcmVlKQpAQCAtMjQ1LDcgKzI0Myw3IEBACiAJCWludCBsZWJzLCByc3ZkX2lkeF9sZWJzID0gMDsKIAogCQlzcGluX2xvY2soJmMtPnNwYWNlX2xvY2spOwotCQlsZWJzID0gYy0+bHN0LmVtcHR5X2xlYnM7CisJCWxlYnMgPSBjLT5sc3QuZW1wdHlfbGVicyArIGMtPmlkeF9nY19jbnQ7CiAJCWxlYnMgKz0gYy0+ZnJlZWFibGVfY250IC0gYy0+bHN0LnRha2VuX2VtcHR5X2xlYnM7CiAKIAkJLyoKQEAgLTMxNyw3ICszMTUsNyBAQAogCQlscCA9IGlkeF9scDsKIAogCWlmIChscCkgewotCQl1Ymlmc19hc3NlcnQobHAtPmRpcnR5ID49IGMtPmRlYWRfd20pOworCQl1Ymlmc19hc3NlcnQobHAtPmZyZWUgKyBscC0+ZGlydHkgPj0gYy0+ZGVhZF93bSk7CiAJCWdvdG8gZm91bmQ7CiAJfQogCkBAIC01MDksNyArNTA3LDYgQEAKIAkJcnN2ZF9pZHhfbGVicyA9IDA7CiAJbGVicyA9IGMtPmxzdC5lbXB0eV9sZWJzICsgYy0+ZnJlZWFibGVfY250ICsgYy0+aWR4X2djX2NudCAtCiAJICAgICAgIGMtPmxzdC50YWtlbl9lbXB0eV9sZWJzOwotCXViaWZzX2Fzc2VydChsZWJzICsgYy0+bHN0LmlkeF9sZWJzID49IGMtPm1pbl9pZHhfbGVicyk7CiAJaWYgKHJzdmRfaWR4X2xlYnMgPCBsZWJzKQogCQkvKgogCQkgKiBPSyB0byBhbGxvY2F0ZSBhbiBlbXB0eSBMRUIsIGJ1dCB3ZSBzdGlsbCBkb24ndCB3YW50IHRvIGdvCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9nYy5jIGIvZnMvdWJpZnMvZ2MuYwppbmRleCBkMGYzZGFjLi4wMmFiYTM2IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9nYy5jCisrKyBiL2ZzL3ViaWZzL2djLmMKQEAgLTMzNCwxNSArMzM0LDIxIEBACiAKIAkJZXJyID0gbW92ZV9ub2RlcyhjLCBzbGViKTsKIAkJaWYgKGVycikKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfaW5jX3NlcTsKIAogCQllcnIgPSBnY19zeW5jX3didWZzKGMpOwogCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9pbmNfc2VxOwogCiAJCWVyciA9IHViaWZzX2NoYW5nZV9vbmVfbHAoYywgbG51bSwgYy0+bGViX3NpemUsIDAsIDAsIDAsIDApOwogCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9pbmNfc2VxOworCisJCS8qIEFsbG93IGZvciByYWNlcyB3aXRoIFROQyAqLworCQljLT5nY2VkX2xudW0gPSBsbnVtOworCQlzbXBfd21iKCk7CisJCWMtPmdjX3NlcSArPSAxOworCQlzbXBfd21iKCk7CiAKIAkJaWYgKGMtPmdjX2xudW0gPT0gLTEpIHsKIAkJCWMtPmdjX2xudW0gPSBsbnVtOwpAQCAtMzYzLDYgKzM2OSwxNCBAQAogb3V0OgogCXViaWZzX3NjYW5fZGVzdHJveShzbGViKTsKIAlyZXR1cm4gZXJyOworCitvdXRfaW5jX3NlcToKKwkvKiBXZSBtYXkgaGF2ZSBtb3ZlZCBhdCBsZWFzdCBzb21lIG5vZGVzIHNvIGFsbG93IGZvciByYWNlcyB3aXRoIFROQyAqLworCWMtPmdjZWRfbG51bSA9IGxudW07CisJc21wX3dtYigpOworCWMtPmdjX3NlcSArPSAxOworCXNtcF93bWIoKTsKKwlnb3RvIG91dDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9taXNjLmggYi9mcy91Ymlmcy9taXNjLmgKaW5kZXggODdkYWJmOS4uNGMxMmE5MiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbWlzYy5oCisrKyBiL2ZzL3ViaWZzL21pc2MuaApAQCAtMjg0LDM4ICsyODQsNiBAQAogfQogCiAvKioKLSAqIHViaWZzX3JlcG9ydGVkX3NwYWNlIC0gY2FsY3VsYXRlIHJlcG9ydGVkIGZyZWUgc3BhY2UuCi0gKiBAYzogdGhlIFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAotICogQGZyZWU6IGFtb3VudCBvZiBmcmVlIHNwYWNlCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGFtb3VudCBvZiBmcmVlIHNwYWNlIHdoaWNoIHdpbGwgYmUgcmVwb3J0ZWQgdG8KLSAqIHVzZXItc3BhY2UuIFVzZXItc3BhY2UgYXBwbGljYXRpb24gdGVuZCB0byBleHBlY3QgdGhhdCBpZiB0aGUgZmlsZS1zeXN0ZW0KLSAqIChlLmcuLCB2aWEgdGhlICdzdGF0ZnMoKScgY2FsbCkgcmVwb3J0cyB0aGF0IGl0IGhhcyBOIGJ5dGVzIGF2YWlsYWJsZSwgdGhleQotICogYXJlIGFibGUgdG8gd3JpdGUgYSBmaWxlIG9mIHNpemUgTi4gVUJJRlMgYXR0YWNoZXMgbm9kZSBoZWFkZXJzIHRvIGVhY2ggZGF0YQotICogbm9kZSBhbmQgaXQgaGFzIHRvIHdyaXRlIGluZGV4aW5kIG5vZGVzIGFzIHdlbGwuIFRoaXMgaW50cm9kdWNlcyBhZGRpdGlvbmFsCi0gKiBvdmVyaGVhZCwgYW5kIFVCSUZTIGl0IGhhcyB0byByZXBvcnQgc2xpZ3RseSBsZXNzIGZyZWUgc3BhY2UgdG8gbWVldCB0aGUKLSAqIGFib3ZlIGV4cGVjdGV0aW9uLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBmcmVlIHNwYWNlIGlzIG1hZGUgdXAgb2YgdW5jb21wcmVzc2VkIGRhdGEgbm9kZXMgYW5kCi0gKiBmdWxsIGluZGV4IG5vZGVzIChvbmUgcGVyIGRhdGEgbm9kZSwgZG91YmxlZCBiZWNhdXNlIHdlIGFsd2F5cyBhbGxvdyBlbm91Z2gKLSAqIHNwYWNlIHRvIHdyaXRlIHRoZSBpbmRleCB0d2ljZSkuCi0gKgotICogTm90ZSwgdGhlIGNhbGN1bGF0aW9uIGlzIHBlc3NpbWlzdGljLCB3aGljaCBtZWFucyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUKLSAqIFVCSUZTIHJlcG9ydHMgbGVzcyBzcGFjZSB0aGFuIGl0IGFjdHVhbGx5IGhhcy4KLSAqLwotc3RhdGljIGlubGluZSBsb25nIGxvbmcgdWJpZnNfcmVwb3J0ZWRfc3BhY2UoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCi0JCQkJCSAgICAgdWludDY0X3QgZnJlZSkKLXsKLQlpbnQgZGl2aXNvciwgZmFjdG9yOwotCi0JZGl2aXNvciA9IFVCSUZTX01BWF9EQVRBX05PREVfU1ogKyAoYy0+bWF4X2lkeF9ub2RlX3N6ICogMyk7Ci0JZmFjdG9yID0gVUJJRlNfTUFYX0RBVEFfTk9ERV9TWiAtIFVCSUZTX0RBVEFfTk9ERV9TWjsKLQlkb19kaXYoZnJlZSwgZGl2aXNvcik7Ci0KLQlyZXR1cm4gZnJlZSAqIGZhY3RvcjsKLX0KLQotLyoqCiAgKiB1Ymlmc19jdXJyZW50X3RpbWUgLSByb3VuZCBjdXJyZW50IHRpbWUgdG8gdGltZSBncmFudWxhcml0eS4KICAqIEBpbm9kZTogaW5vZGUKICAqLwpAQCAtMzI1LDQgKzI5MywyMSBAQAogCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpIDogQ1VSUkVOVF9USU1FX1NFQzsKIH0KIAorLyoqCisgKiB1Ymlmc190bmNfbG9va3VwIC0gbG9vayB1cCBhIGZpbGUtc3lzdGVtIG5vZGUuCisgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAa2V5OiBub2RlIGtleSB0byBsb29rdXAKKyAqIEBub2RlOiB0aGUgbm9kZSBpcyByZXR1cm5lZCBoZXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBsb29rIHVwIGFuZCByZWFkcyBub2RlIHdpdGgga2V5IEBrZXkuIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2UKKyAqIHN1cmUgdGhlIEBub2RlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gZml0IHRoZSBub2RlLiBSZXR1cm5zIHplcm8gaW4gY2FzZQorICogb2Ygc3VjY2VzcywgJS1FTk9FTlQgaWYgdGhlIG5vZGUgd2FzIG5vdCBmb3VuZCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1Ymlmc190bmNfbG9va3VwKHN0cnVjdCB1Ymlmc19pbmZvICpjLAorCQkJCSAgIGNvbnN0IHVuaW9uIHViaWZzX2tleSAqa2V5LCB2b2lkICpub2RlKQoreworCXJldHVybiB1Ymlmc190bmNfbG9jYXRlKGMsIGtleSwgbm9kZSwgTlVMTCwgTlVMTCk7Cit9CisKICNlbmRpZiAvKiBfX1VCSUZTX01JU0NfSF9fICovCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCBmNzFlNmI4Li45YTkyMjAzIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTM3MCw4ICszNzAsOSBAQAogewogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gZGVudHJ5LT5kX3NiLT5zX2ZzX2luZm87CiAJdW5zaWduZWQgbG9uZyBsb25nIGZyZWU7CisJX19sZTMyICp1dWlkID0gKF9fbGUzMiAqKWMtPnV1aWQ7CiAKLQlmcmVlID0gdWJpZnNfYnVkZ19nZXRfZnJlZV9zcGFjZShjKTsKKwlmcmVlID0gdWJpZnNfZ2V0X2ZyZWVfc3BhY2UoYyk7CiAJZGJnX2dlbigiZnJlZSBzcGFjZSAlbGxkIGJ5dGVzICglbGxkIGJsb2NrcykiLAogCQlmcmVlLCBmcmVlID4+IFVCSUZTX0JMT0NLX1NISUZUKTsKIApAQCAtMzg2LDcgKzM4Nyw4IEBACiAJYnVmLT5mX2ZpbGVzID0gMDsKIAlidWYtPmZfZmZyZWUgPSAwOwogCWJ1Zi0+Zl9uYW1lbGVuID0gVUJJRlNfTUFYX05MRU47Ci0KKwlidWYtPmZfZnNpZC52YWxbMF0gPSBsZTMyX3RvX2NwdSh1dWlkWzBdKSBeIGxlMzJfdG9fY3B1KHV1aWRbMl0pOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9IGxlMzJfdG9fY3B1KHV1aWRbMV0pIF4gbGUzMl90b19jcHUodXVpZFszXSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzMCw2ICs1MzIsMTIgQEAKIAljLT5kZWFkX3dtID0gQUxJR04oTUlOX1dSSVRFX1NaLCBjLT5taW5faW9fc2l6ZSk7CiAJYy0+ZGFya193bSA9IEFMSUdOKFVCSUZTX01BWF9OT0RFX1NaLCBjLT5taW5faW9fc2l6ZSk7CiAKKwkvKgorCSAqIENhbGN1bGF0ZSBob3cgbWFueSBieXRlcyB3b3VsZCBiZSB3YXN0ZWQgYXQgdGhlIGVuZCBvZiBMRUIgaWYgaXQgd2FzCisJICogZnVsbHkgZmlsbGVkIHdpdGggZGF0YSBub2RlcyBvZiBtYXhpbXVtIHNpemUuIFRoaXMgaXMgdXNlZCBpbgorCSAqIGNhbGN1bGF0aW9ucyB3aGVuIHJlcG9ydGluZyBmcmVlIHNwYWNlLgorCSAqLworCWMtPmxlYl9vdmVyaGVhZCA9IGMtPmxlYl9zaXplICUgVUJJRlNfTUFYX0RBVEFfTk9ERV9TWjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQ3LDEzICs2NTUsMTEgQEAKIAkgKiBpbnRlcm5hbGx5IGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGZvciBVQklGUywgYnV0IGl0IGlzCiAJICogbmVjZXNzYXJ5IHRvIHJlcG9ydCBzb21ldGhpbmcgZm9yIHRoZSAnc3RhdGZzKCknIGNhbGwuCiAJICoKLQkgKiBTdWJ0cmFjdCB0aGUgTEVCIHJlc2VydmVkIGZvciBHQyBhbmQgdGhlIExFQiB3aGljaCBpcyByZXNlcnZlZCBmb3IKLQkgKiBkZWxldGlvbnMuCi0JICoKLQkgKiBSZXZpZXcgJ3ViaWZzX2NhbGNfYXZhaWxhYmxlKCknIGlmIGNoYW5naW5nIHRoaXMgY2FsY3VsYXRpb24uCisJICogU3VidHJhY3QgdGhlIExFQiByZXNlcnZlZCBmb3IgR0MsIHRoZSBMRUIgd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yCisJICogZGVsZXRpb25zLCBhbmQgYXNzdW1lIG9ubHkgb25lIGpvdXJuYWwgaGVhZCBpcyBhdmFpbGFibGUuCiAJICovCi0JdG1wNjQgPSBjLT5tYWluX2xlYnMgLSAyOwotCXRtcDY0ICo9ICh1aW50NjRfdCljLT5sZWJfc2l6ZSAtIGMtPmRhcmtfd207CisJdG1wNjQgPSBjLT5tYWluX2xlYnMgLSAyIC0gYy0+amhlYWRfY250ICsgMTsKKwl0bXA2NCAqPSAodWludDY0X3QpYy0+bGViX3NpemUgLSBjLT5sZWJfb3ZlcmhlYWQ7CiAJdG1wNjQgPSB1Ymlmc19yZXBvcnRlZF9zcGFjZShjLCB0bXA2NCk7CiAJYy0+YmxvY2tfY250ID0gdG1wNjQgPj4gVUJJRlNfQkxPQ0tfU0hJRlQ7CiAKQEAgLTg0Miw3ICs4NDgsNyBAQAogCU9wdF9lcnIsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9mYXN0X3VubW91bnQsICJmYXN0X3VubW91bnQifSwKIAl7T3B0X25vcm1fdW5tb3VudCwgIm5vcm1fdW5tb3VudCJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKQEAgLTEwMTgsMTQgKzEwMjQsMTMgQEAKIAkJZ290byBvdXRfZGVyZWc7CiAJfQogCisJc3ByaW50ZihjLT5iZ3RfbmFtZSwgQkdUX05BTUVfUEFUVEVSTiwgYy0+dmkudWJpX251bSwgYy0+dmkudm9sX2lkKTsKIAlpZiAoIW1vdW50ZWRfcmVhZF9vbmx5KSB7CiAJCWVyciA9IGFsbG9jX3didWZzKGMpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfY2J1ZjsKIAogCQkvKiBDcmVhdGUgYmFja2dyb3VuZCB0aHJlYWQgKi8KLQkJc3ByaW50ZihjLT5iZ3RfbmFtZSwgQkdUX05BTUVfUEFUVEVSTiwgYy0+dmkudWJpX251bSwKLQkJCWMtPnZpLnZvbF9pZCk7CiAJCWMtPmJndCA9IGt0aHJlYWRfY3JlYXRlKHViaWZzX2JnX3RocmVhZCwgYywgYy0+Ymd0X25hbWUpOwogCQlpZiAoIWMtPmJndCkKIAkJCWMtPmJndCA9IEVSUl9QVFIoLUVJTlZBTCk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy90bmMuYyBiL2ZzL3ViaWZzL3RuYy5jCmluZGV4IGU5MDlmNGEuLjc2MzRjNTkgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3RuYy5jCisrKyBiL2ZzL3ViaWZzL3RuYy5jCkBAIC01MDYsNyArNTA2LDcgQEAKIAkJaWYgKGtleXNfY21wKGMsIGtleSwgJm5vZGVfa2V5KSAhPSAwKQogCQkJcmV0ID0gMDsKIAl9Ci0JaWYgKHJldCA9PSAwKQorCWlmIChyZXQgPT0gMCAmJiBjLT5yZXBsYXlpbmcpCiAJCWRiZ19tbnQoImRhbmdsaW5nIGJyYW5jaCBMRUIgJWQ6JWQgbGVuICVkLCBrZXkgJXMiLAogCQkJemJyLT5sbnVtLCB6YnItPm9mZnMsIHpici0+bGVuLCBEQkdLRVkoa2V5KSk7CiAJcmV0dXJuIHJldDsKQEAgLTEzODIsNTAgKzEzODIsMzkgQEAKIH0KIAogLyoqCi0gKiB1Ymlmc190bmNfbG9va3VwIC0gbG9vayB1cCBhIGZpbGUtc3lzdGVtIG5vZGUuCisgKiBtYXliZV9sZWJfZ2NlZCAtIGRldGVybWluZSBpZiBhIExFQiBtYXkgaGF2ZSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgogICogQGM6IFVCSUZTIGZpbGUtc3lzdGVtIGRlc2NyaXB0aW9uIG9iamVjdAotICogQGtleTogbm9kZSBrZXkgdG8gbG9va3VwCi0gKiBAbm9kZTogdGhlIG5vZGUgaXMgcmV0dXJuZWQgaGVyZQorICogQGxudW06IExFQiBudW1iZXIKKyAqIEBnY19zZXExOiBnYXJiYWdlIGNvbGxlY3Rpb24gc2VxdWVuY2UgbnVtYmVyCiAgKgotICogVGhpcyBmdW5jdGlvbiBsb29rIHVwIGFuZCByZWFkcyBub2RlIHdpdGgga2V5IEBrZXkuIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2UKLSAqIHN1cmUgdGhlIEBub2RlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gZml0IHRoZSBub2RlLiBSZXR1cm5zIHplcm8gaW4gY2FzZQotICogb2Ygc3VjY2VzcywgJS1FTk9FTlQgaWYgdGhlIG5vZGUgd2FzIG5vdCBmb3VuZCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgotICogY2FzZSBvZiBmYWlsdXJlLgorICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIEBsbnVtIG1heSBoYXZlIGJlZW4gZ2FyYmFnZSBjb2xsZWN0ZWQgc2luY2UKKyAqIHNlcXVlbmNlIG51bWJlciBAZ2Nfc2VxMS4gSWYgaXQgbWF5IGhhdmUgYmVlbiB0aGVuICUxIGlzIHJldHVybmVkLCBvdGhlcndpc2UKKyAqICUwIGlzIHJldHVybmVkLgogICovCi1pbnQgdWJpZnNfdG5jX2xvb2t1cChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3QgdW5pb24gdWJpZnNfa2V5ICprZXksCi0JCSAgICAgdm9pZCAqbm9kZSkKK3N0YXRpYyBpbnQgbWF5YmVfbGViX2djZWQoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtLCBpbnQgZ2Nfc2VxMSkKIHsKLQlpbnQgZm91bmQsIG4sIGVycjsKLQlzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlOwotCXN0cnVjdCB1Ymlmc196YnJhbmNoIHpiciwgKnp0OworCWludCBnY19zZXEyLCBnY2VkX2xudW07CiAKLQltdXRleF9sb2NrKCZjLT50bmNfbXV0ZXgpOwotCWZvdW5kID0gdWJpZnNfbG9va3VwX2xldmVsMChjLCBrZXksICZ6bm9kZSwgJm4pOwotCWlmICghZm91bmQpIHsKLQkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChmb3VuZCA8IDApIHsKLQkJZXJyID0gZm91bmQ7Ci0JCWdvdG8gb3V0OwotCX0KLQl6dCA9ICZ6bm9kZS0+emJyYW5jaFtuXTsKLQlpZiAoaXNfaGFzaF9rZXkoYywga2V5KSkgewotCQkvKgotCQkgKiBJbiB0aGlzIGNhc2UgdGhlIGxlYWYgbm9kZSBjYWNoZSBnZXRzIHVzZWQsIHNvIHdlIHBhc3MgdGhlCi0JCSAqIGFkZHJlc3Mgb2YgdGhlIHpicmFuY2ggYW5kIGtlZXAgdGhlIG11dGV4IGxvY2tlZAotCQkgKi8KLQkJZXJyID0gdG5jX3JlYWRfbm9kZV9ubShjLCB6dCwgbm9kZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQl6YnIgPSB6bm9kZS0+emJyYW5jaFtuXTsKLQltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7Ci0KLQllcnIgPSB1Ymlmc190bmNfcmVhZF9ub2RlKGMsICZ6YnIsIG5vZGUpOwotCXJldHVybiBlcnI7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7Ci0JcmV0dXJuIGVycjsKKwlnY2VkX2xudW0gPSBjLT5nY2VkX2xudW07CisJc21wX3JtYigpOworCWdjX3NlcTIgPSBjLT5nY19zZXE7CisJLyogU2FtZSBzZXEgbWVhbnMgbm8gR0MgKi8KKwlpZiAoZ2Nfc2VxMSA9PSBnY19zZXEyKQorCQlyZXR1cm4gMDsKKwkvKiBEaWZmZXJlbnQgYnkgbW9yZSB0aGFuIDEgbWVhbnMgd2UgZG9uJ3Qga25vdyAqLworCWlmIChnY19zZXExICsgMSAhPSBnY19zZXEyKQorCQlyZXR1cm4gMTsKKwkvKgorCSAqIFdlIGhhdmUgc2VlbiB0aGUgc2VxdWVuY2UgbnVtYmVyIGhhcyBpbmNyZWFzZWQgYnkgMS4gTm93IHdlIG5lZWQgdG8KKwkgKiBiZSBzdXJlIHdlIHJlYWQgdGhlIHJpZ2h0IExFQiBudW1iZXIsIHNvIHJlYWQgaXQgYWdhaW4uCisJICovCisJc21wX3JtYigpOworCWlmIChnY2VkX2xudW0gIT0gYy0+Z2NlZF9sbnVtKQorCQlyZXR1cm4gMTsKKwkvKiBGaW5hbGx5IHdlIGNhbiBjaGVjayBsbnVtICovCisJaWYgKGdjZWRfbG51bSA9PSBsbnVtKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xNDM2LDE2ICsxNDI1LDE5IEBACiAgKiBAbG51bTogTEVCIG51bWJlciBpcyByZXR1cm5lZCBoZXJlCiAgKiBAb2Zmczogb2Zmc2V0IGlzIHJldHVybmVkIGhlcmUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzICd1Ymlmc190bmNfbG9va3VwKCknIGJ1dCBpdCByZXR1cm5zIHRoZSBub2RlCi0gKiBsb2NhdGlvbiBhbHNvLiBTZWUgJ3ViaWZzX3RuY19sb29rdXAoKScuCisgKiBUaGlzIGZ1bmN0aW9uIGxvb2sgdXAgYW5kIHJlYWRzIG5vZGUgd2l0aCBrZXkgQGtleS4gVGhlIGNhbGxlciBoYXMgdG8gbWFrZQorICogc3VyZSB0aGUgQG5vZGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgdGhlIG5vZGUuIFJldHVybnMgemVybyBpbiBjYXNlCisgKiBvZiBzdWNjZXNzLCAlLUVOT0VOVCBpZiB0aGUgbm9kZSB3YXMgbm90IGZvdW5kLCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuIFRoZSBub2RlIGxvY2F0aW9uIGNhbiBiZSByZXR1cm5lZCBpbiBAbG51bSBhbmQgQG9mZnMuCiAgKi8KIGludCB1Ymlmc190bmNfbG9jYXRlKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCB1bmlvbiB1Ymlmc19rZXkgKmtleSwKIAkJICAgICB2b2lkICpub2RlLCBpbnQgKmxudW0sIGludCAqb2ZmcykKIHsKLQlpbnQgZm91bmQsIG4sIGVycjsKKwlpbnQgZm91bmQsIG4sIGVyciwgc2FmZWx5ID0gMCwgZ2Nfc2VxMTsKIAlzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlOwogCXN0cnVjdCB1Ymlmc196YnJhbmNoIHpiciwgKnp0OwogCithZ2FpbjoKIAltdXRleF9sb2NrKCZjLT50bmNfbXV0ZXgpOwogCWZvdW5kID0gdWJpZnNfbG9va3VwX2xldmVsMChjLCBrZXksICZ6bm9kZSwgJm4pOwogCWlmICghZm91bmQpIHsKQEAgLTE0NTYsMjQgKzE0NDgsNDMgQEAKIAkJZ290byBvdXQ7CiAJfQogCXp0ID0gJnpub2RlLT56YnJhbmNoW25dOworCWlmIChsbnVtKSB7CisJCSpsbnVtID0genQtPmxudW07CisJCSpvZmZzID0genQtPm9mZnM7CisJfQogCWlmIChpc19oYXNoX2tleShjLCBrZXkpKSB7CiAJCS8qCiAJCSAqIEluIHRoaXMgY2FzZSB0aGUgbGVhZiBub2RlIGNhY2hlIGdldHMgdXNlZCwgc28gd2UgcGFzcyB0aGUKIAkJICogYWRkcmVzcyBvZiB0aGUgemJyYW5jaCBhbmQga2VlcCB0aGUgbXV0ZXggbG9ja2VkCiAJCSAqLwotCQkqbG51bSA9IHp0LT5sbnVtOwotCQkqb2ZmcyA9IHp0LT5vZmZzOwogCQllcnIgPSB0bmNfcmVhZF9ub2RlX25tKGMsIHp0LCBub2RlKTsKIAkJZ290byBvdXQ7CiAJfQorCWlmIChzYWZlbHkpIHsKKwkJZXJyID0gdWJpZnNfdG5jX3JlYWRfbm9kZShjLCB6dCwgbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwkvKiBEcm9wIHRoZSBUTkMgbXV0ZXggcHJlbWF0dXJlbHkgYW5kIHJhY2Ugd2l0aCBnYXJiYWdlIGNvbGxlY3Rpb24gKi8KIAl6YnIgPSB6bm9kZS0+emJyYW5jaFtuXTsKKwlnY19zZXExID0gYy0+Z2Nfc2VxOwogCW11dGV4X3VubG9jaygmYy0+dG5jX211dGV4KTsKIAotCSpsbnVtID0gemJyLmxudW07Ci0JKm9mZnMgPSB6YnIub2ZmczsKKwlpZiAodWJpZnNfZ2V0X3didWYoYywgemJyLmxudW0pKSB7CisJCS8qIFdlIGRvIG5vdCBHQyBqb3VybmFsIGhlYWRzICovCisJCWVyciA9IHViaWZzX3RuY19yZWFkX25vZGUoYywgJnpiciwgbm9kZSk7CisJCXJldHVybiBlcnI7CisJfQogCi0JZXJyID0gdWJpZnNfdG5jX3JlYWRfbm9kZShjLCAmemJyLCBub2RlKTsKLQlyZXR1cm4gZXJyOworCWVyciA9IGZhbGxpYmxlX3JlYWRfbm9kZShjLCBrZXksICZ6YnIsIG5vZGUpOworCWlmIChlcnIgPD0gMCB8fCBtYXliZV9sZWJfZ2NlZChjLCB6YnIubG51bSwgZ2Nfc2VxMSkpIHsKKwkJLyoKKwkJICogVGhlIG5vZGUgbWF5IGhhdmUgYmVlbiBHQydlZCBvdXQgZnJvbSB1bmRlciB1cyBzbyB0cnkgYWdhaW4KKwkJICogd2hpbGUga2VlcGluZyB0aGUgVE5DIG11dGV4IGxvY2tlZC4KKwkJICovCisJCXNhZmVseSA9IDE7CisJCWdvdG8gYWdhaW47CisJfQorCXJldHVybiAwOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwpAQCAtMTQ5OCw3ICsxNTA5LDYgQEAKIHsKIAlpbnQgZm91bmQsIG4sIGVycjsKIAlzdHJ1Y3QgdWJpZnNfem5vZGUgKnpub2RlOwotCXN0cnVjdCB1Ymlmc196YnJhbmNoIHpicjsKIAogCWRiZ190bmMoIm5hbWUgJyUuKnMnIGtleSAlcyIsIG5tLT5sZW4sIG5tLT5uYW1lLCBEQkdLRVkoa2V5KSk7CiAJbXV0ZXhfbG9jaygmYy0+dG5jX211dGV4KTsKQEAgLTE1MjIsMTEgKzE1MzIsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JemJyID0gem5vZGUtPnpicmFuY2hbbl07Ci0JbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwotCi0JZXJyID0gdG5jX3JlYWRfbm9kZV9ubShjLCAmemJyLCBub2RlKTsKLQlyZXR1cm4gZXJyOworCWVyciA9IHRuY19yZWFkX25vZGVfbm0oYywgJnpub2RlLT56YnJhbmNoW25dLCBub2RlKTsKIAogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmMtPnRuY19tdXRleCk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy91Ymlmcy1tZWRpYS5oIGIvZnMvdWJpZnMvdWJpZnMtbWVkaWEuaAppbmRleCBiZDIxMjFmLi5hOWVjYmQ5IDEwMDY0NAotLS0gYS9mcy91Ymlmcy91Ymlmcy1tZWRpYS5oCisrKyBiL2ZzL3ViaWZzL3ViaWZzLW1lZGlhLmgKQEAgLTg3LDcgKzg3LDcgQEAKICNkZWZpbmUgVUJJRlNfU0tfTEVOIDgKIAogLyogTWluaW11bSBpbmRleCB0cmVlIGZhbm91dCAqLwotI2RlZmluZSBVQklGU19NSU5fRkFOT1VUIDIKKyNkZWZpbmUgVUJJRlNfTUlOX0ZBTk9VVCAzCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGxldmVscyBpbiBVQklGUyBpbmRleGluZyBCLXRyZWUgKi8KICNkZWZpbmUgVUJJRlNfTUFYX0xFVkVMUyA1MTIKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3ViaWZzLmggYi9mcy91Ymlmcy91Ymlmcy5oCmluZGV4IGQ3ZjcwNmYuLjE3YzYyMGIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3ViaWZzLmgKKysrIGIvZnMvdWJpZnMvdWJpZnMuaApAQCAtOTk1LDYgKzk5NSw5IEBACiAgKiBAbWF4X2lkeF9ub2RlX3N6OiBtYXhpbXVtIGluZGV4aW5nIG5vZGUgYWxpZ25lZCBvbiA4LWJ5dGVzIGJvdW5kYXJ5CiAgKiBAbWF4X2lub2RlX3N6OiBtYXhpbXVtIHBvc3NpYmxlIGlub2RlIHNpemUgaW4gYnl0ZXMKICAqIEBtYXhfem5vZGVfc3o6IHNpemUgb2Ygem5vZGUgaW4gYnl0ZXMKKyAqCisgKiBAbGViX292ZXJoZWFkOiBob3cgbWFueSBieXRlcyBhcmUgd2FzdGVkIGluIGFuIExFQiB3aGVuIGl0IGlzIGZpbGxlZCB3aXRoCisgKiAgICAgICAgICAgICAgICBkYXRhIG5vZGVzIG9mIG1heGltdW0gc2l6ZSAtIHVzZWQgaW4gZnJlZSBzcGFjZSByZXBvcnRpbmcKICAqIEBkZWFkX3dtOiBMRUIgZGVhZCBzcGFjZSB3YXRlcm1hcmsKICAqIEBkYXJrX3dtOiBMRUIgZGFyayBzcGFjZSB3YXRlcm1hcmsKICAqIEBibG9ja19jbnQ6IGNvdW50IG9mIDRLaUIgYmxvY2tzIG9uIHRoZSBGUwpAQCAtMTAyOCw2ICsxMDMxLDggQEAKICAqIEBzYnVmOiBhIGJ1ZmZlciBvZiBMRUIgc2l6ZSB1c2VkIGJ5IEdDIGFuZCByZXBsYXkgZm9yIHNjYW5uaW5nCiAgKiBAaWR4X2djOiBsaXN0IG9mIGluZGV4IExFQnMgdGhhdCBoYXZlIGJlZW4gZ2FyYmFnZSBjb2xsZWN0ZWQKICAqIEBpZHhfZ2NfY250OiBudW1iZXIgb2YgZWxlbWVudHMgb24gdGhlIGlkeF9nYyBsaXN0CisgKiBAZ2Nfc2VxOiBpbmNyZW1lbnRlZCBmb3IgZXZlcnkgbm9uLWluZGV4IExFQiBnYXJiYWdlIGNvbGxlY3RlZAorICogQGdjZWRfbG51bTogbGFzdCBub24taW5kZXggTEVCIHRoYXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkCiAgKgogICogQGluZm9zX2xpc3Q6IGxpbmtzIGFsbCAndWJpZnNfaW5mbycgb2JqZWN0cwogICogQHVtb3VudF9tdXRleDogc2VyaWFsaXplcyBzaHJpbmtlciBhbmQgdW4tbW91bnQKQEAgLTEyMjQsNiArMTIyOSw4IEBACiAJaW50IG1heF9pZHhfbm9kZV9zejsKIAlsb25nIGxvbmcgbWF4X2lub2RlX3N6OwogCWludCBtYXhfem5vZGVfc3o7CisKKwlpbnQgbGViX292ZXJoZWFkOwogCWludCBkZWFkX3dtOwogCWludCBkYXJrX3dtOwogCWludCBibG9ja19jbnQ7CkBAIC0xMjU3LDYgKzEyNjQsOCBAQAogCXZvaWQgKnNidWY7CiAJc3RydWN0IGxpc3RfaGVhZCBpZHhfZ2M7CiAJaW50IGlkeF9nY19jbnQ7CisJdm9sYXRpbGUgaW50IGdjX3NlcTsKKwl2b2xhdGlsZSBpbnQgZ2NlZF9sbnVtOwogCiAJc3RydWN0IGxpc3RfaGVhZCBpbmZvc19saXN0OwogCXN0cnVjdCBtdXRleCB1bW91bnRfbXV0ZXg7CkBAIC0xNDM0LDkgKzE0NDMsMTAgQEAKIAkJCQlzdHJ1Y3QgdWJpZnNfYnVkZ2V0X3JlcSAqcmVxKTsKIHZvaWQgdWJpZnNfY2FuY2VsX2lub19vcChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBzdHJ1Y3QgdWJpZnNfYnVkZ2V0X3JlcSAqcmVxKTsKLWxvbmcgbG9uZyB1Ymlmc19idWRnX2dldF9mcmVlX3NwYWNlKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKK2xvbmcgbG9uZyB1Ymlmc19nZXRfZnJlZV9zcGFjZShzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiBpbnQgdWJpZnNfY2FsY19taW5faWR4X2xlYnMoc3RydWN0IHViaWZzX2luZm8gKmMpOwogdm9pZCB1Ymlmc19jb252ZXJ0X3BhZ2VfYnVkZ2V0KHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKK2xvbmcgbG9uZyB1Ymlmc19yZXBvcnRlZF9zcGFjZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgdWludDY0X3QgZnJlZSk7CiBsb25nIGxvbmcgdWJpZnNfY2FsY19hdmFpbGFibGUoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBtaW5faWR4X2xlYnMpOwogCiAvKiBmaW5kLmMgKi8KQEAgLTE0NTEsOCArMTQ2MSw2IEBACiAvKiB0bmMuYyAqLwogaW50IHViaWZzX2xvb2t1cF9sZXZlbDAoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHVuaW9uIHViaWZzX2tleSAqa2V5LAogCQkJc3RydWN0IHViaWZzX3pub2RlICoqem4sIGludCAqbik7Ci1pbnQgdWJpZnNfdG5jX2xvb2t1cChzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3QgdW5pb24gdWJpZnNfa2V5ICprZXksCi0JCSAgICAgdm9pZCAqbm9kZSk7CiBpbnQgdWJpZnNfdG5jX2xvb2t1cF9ubShzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3QgdW5pb24gdWJpZnNfa2V5ICprZXksCiAJCQl2b2lkICpub2RlLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbm0pOwogaW50IHViaWZzX3RuY19sb2NhdGUoc3RydWN0IHViaWZzX2luZm8gKmMsIGNvbnN0IHVuaW9uIHViaWZzX2tleSAqa2V5LApkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggMGVkNmUxNC4uZWI5MWYzYiAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC0yMTEsNiArMjExLDcgQEAKIAkucmVsZWFzZQkJPSB1ZGZfcmVsZWFzZV9maWxlLAogCS5mc3luYwkJCT0gdWRmX2ZzeW5jX2ZpbGUsCiAJLnNwbGljZV9yZWFkCQk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKKwkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWRmX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9pYWxsb2MuYyBiL2ZzL3VkZi9pYWxsb2MuYwppbmRleCBlYjljZmEyLi5hNGYyYjNjIDEwMDY0NAotLS0gYS9mcy91ZGYvaWFsbG9jLmMKKysrIGIvZnMvdWRmL2lhbGxvYy5jCkBAIC03NiwxMSArNzYsMjQgQEAKIAkqZXJyID0gLUVOT1NQQzsKIAogCWlpbmZvID0gVURGX0koaW5vZGUpOwotCWlpbmZvLT5pX3VuaXF1ZSA9IDA7Ci0JaWluZm8tPmlfbGVuRXh0ZW50cyA9IDA7Ci0JaWluZm8tPmlfbmV4dF9hbGxvY19ibG9jayA9IDA7Ci0JaWluZm8tPmlfbmV4dF9hbGxvY19nb2FsID0gMDsKLQlpaW5mby0+aV9zdHJhdDQwOTYgPSAwOworCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0VYVEVOREVEX0ZFKSkgeworCQlpaW5mby0+aV9lZmUgPSAxOworCQlpZiAoVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFID4gc2JpLT5zX3VkZnJldikKKwkJCXNiaS0+c191ZGZyZXYgPSBVREZfVkVSU19VU0VfRVhURU5ERURfRkU7CisJCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCX0gZWxzZSB7CisJCWlpbmZvLT5pX2VmZSA9IDA7CisJCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwl9CisJaWYgKCFpaW5mby0+aV9leHQuaV9kYXRhKSB7CisJCWlwdXQoaW5vZGUpOworCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJYmxvY2sgPSB1ZGZfbmV3X2Jsb2NrKGRpci0+aV9zYiwgTlVMTCwKIAkJCSAgICAgIGRpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKQEAgLTExMSw2ICsxMjQsNyBAQAogCQlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKIAkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCX0KKwltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgewpAQCAtMTI5LDI1ICsxNDMsNiBAQAogCWlpbmZvLT5pX2xlbkVBdHRyID0gMDsKIAlpaW5mby0+aV9sZW5BbGxvYyA9IDA7CiAJaWluZm8tPmlfdXNlID0gMDsKLQlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9FWFRFTkRFRF9GRSkpIHsKLQkJaWluZm8tPmlfZWZlID0gMTsKLQkJaWYgKFVERl9WRVJTX1VTRV9FWFRFTkRFRF9GRSA+IHNiaS0+c191ZGZyZXYpCi0JCQlzYmktPnNfdWRmcmV2ID0gVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFOwotCQlpaW5mby0+aV9leHQuaV9kYXRhID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQl9IGVsc2UgewotCQlpaW5mby0+aV9lZmUgPSAwOwotCQlpaW5mby0+aV9leHQuaV9kYXRhID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLAotCQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JfQotCWlmICghaWluZm8tPmlfZXh0LmlfZGF0YSkgewotCQlpcHV0KGlub2RlKTsKLQkJKmVyciA9IC1FTk9NRU07Ci0JCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQikpCiAJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CiAJZWxzZSBpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCkBAIC0xNTgsNyArMTUzLDYgQEAKIAkJaWluZm8tPmlfY3J0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwogCiAJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgewogCQlEUVVPVF9EUk9QKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKaW5kZXggNTY5OGJiZi4uZTI1ZTcwMSAxMDA2NDQKLS0tIGEvZnMvdWRmL3N1cGVyLmMKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTM2OSw3ICszNjksNyBAQAogCU9wdF9lcnIsIE9wdF91Zm9yZ2V0LCBPcHRfdWlnbm9yZSwgT3B0X2dmb3JnZXQsIE9wdF9naWdub3JlCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9ub3ZycywJIm5vdnJzIn0sCiAJe09wdF9ub3N0cmljdCwJIm5vc3RyaWN0In0sCiAJe09wdF9icywJImJzPSV1In0sCmRpZmYgLS1naXQgYS9mcy91ZnMvc3VwZXIuYyBiL2ZzL3Vmcy9zdXBlci5jCmluZGV4IDMxNDE5NjkuLmU2NTIxMmQgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9zdXBlci5jCisrKyBiL2ZzL3Vmcy9zdXBlci5jCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICBPcHRfZXJyCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF90eXBlX29sZCwgInVmc3R5cGU9b2xkIn0sCiAJe09wdF90eXBlX3N1bng4NiwgInVmc3R5cGU9c3VueDg2In0sCiAJe09wdF90eXBlX3N1biwgInVmc3R5cGU9c3VuIn0sCkBAIC0xMjMzLDcgKzEyMzMsNyBAQAogewogCXN0cnVjdCB1ZnNfc2JfaW5mbyAqc2JpID0gVUZTX1NCKHZmcy0+bW50X3NiKTsKIAl1bnNpZ25lZCBtdmFsID0gc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFOwotCXN0cnVjdCBtYXRjaF90b2tlbiAqdHAgPSB0b2tlbnM7CisJY29uc3Qgc3RydWN0IG1hdGNoX3Rva2VuICp0cCA9IHRva2VuczsKIAogCXdoaWxlICh0cC0+dG9rZW4gIT0gT3B0X29uZXJyb3JfcGFuaWMgJiYgdHAtPnRva2VuICE9IG12YWwpCiAJCSsrdHA7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggZjQyZjgwYS4uYTQ0ZDY4ZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtMTMzOCw2ICsxMzM4LDEwIEBACiAJb2Zmc2V0ID0gKHhmc19vZmZfdClpYmxvY2sgPDwgaW5vZGUtPmlfYmxrYml0czsKIAlBU1NFUlQoYmhfcmVzdWx0LT5iX3NpemUgPj0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cykpOwogCXNpemUgPSBiaF9yZXN1bHQtPmJfc2l6ZTsKKworCWlmICghY3JlYXRlICYmIGRpcmVjdCAmJiBvZmZzZXQgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQorCQlyZXR1cm4gMDsKKwogCWVycm9yID0geGZzX2lvbWFwKFhGU19JKGlub2RlKSwgb2Zmc2V0LCBzaXplLAogCQkJICAgICBjcmVhdGUgPyBmbGFncyA6IEJNQVBJX1JFQUQsICZpb21hcCwgJm5pb21hcCk7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCA5ODYwNjFhLi4zNmQ1ZmNkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMTAwMSwxMiArMTAwMSwxMyBAQAogCSAqIFdlIGNhbiBnZXQgYW4gRU9QTk9UU1VQUCB0byBvcmRlcmVkIHdyaXRlcy4gIEhlcmUgd2UgY2xlYXIgdGhlCiAJICogb3JkZXJlZCBmbGFnIGFuZCByZWlzc3VlIHRoZW0uICBCZWNhdXNlIHdlIGNhbid0IHRlbGwgdGhlIGhpZ2hlcgogCSAqIGxheWVycyBkaXJlY3RseSB0aGF0IHRoZXkgc2hvdWxkIG5vdCBpc3N1ZSBvcmRlcmVkIEkvTyBhbnltb3JlLCB0aGV5Ci0JICogbmVlZCB0byBjaGVjayBpZiB0aGUgb3JkZXJlZCBmbGFnIHdhcyBjbGVhcmVkIGR1cmluZyBJL08gY29tcGxldGlvbi4KKwkgKiBuZWVkIHRvIGNoZWNrIGlmIHRoZSBfWEZTX0JBUlJJRVJfRkFJTEVEIGZsYWcgd2FzIHNldCBkdXJpbmcgSS9PIGNvbXBsZXRpb24uCiAJICovCiAJaWYgKChicC0+Yl9lcnJvciA9PSBFT1BOT1RTVVBQKSAmJgogCSAgICAoYnAtPmJfZmxhZ3MgJiAoWEJGX09SREVSRUR8WEJGX0FTWU5DKSkgPT0gKFhCRl9PUkRFUkVEfFhCRl9BU1lOQykpIHsKIAkJWEJfVFJBQ0UoYnAsICJvcmRlcmVkX3JldHJ5IiwgYnAtPmJfaW9kb25lKTsKIAkJYnAtPmJfZmxhZ3MgJj0gflhCRl9PUkRFUkVEOworCQlicC0+Yl9mbGFncyB8PSBfWEZTX0JBUlJJRVJfRkFJTEVEOwogCQl4ZnNfYnVmX2lvcmVxdWVzdChicCk7CiAJfSBlbHNlIGlmIChicC0+Yl9pb2RvbmUpCiAJCSgqKGJwLT5iX2lvZG9uZSkpKGJwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggZmUwMTA5OS4uNDU2NTE5YSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTg1LDYgKzg1LDE0IEBACiAJICogbW9kaWZpY2F0aW9ucyBiZWluZyBsb3N0LgogCSAqLwogCV9YQkZfUEFHRV9MT0NLRUQgPSAoMSA8PCAyMiksCisKKwkvKgorCSAqIElmIHdlIHRyeSBhIGJhcnJpZXIgd3JpdGUsIGJ1dCBpdCBmYWlscyB3ZSBoYXZlIHRvIGNvbW11bmljYXRlCisJICogdGhpcyB0byB0aGUgdXBwZXIgbGF5ZXJzLiAgVW5mb3J0dW5hdGVseSBiX2Vycm9yIGdldHMgb3ZlcndyaXR0ZW4KKwkgKiB3aGVuIHRoZSBidWZmZXIgaXMgcmUtaXNzdWVkIHNvIHdlIGhhdmUgdG8gYWRkIGFub3RoZXIgZmxhZyB0bworCSAqIGtlZXAgdGhpcyBpbmZvcm1hdGlvbi4KKwkgKi8KKwlfWEZTX0JBUlJJRVJfRkFJTEVEID0gKDEgPDwgMjMpLAogfSB4ZnNfYnVmX2ZsYWdzX3Q7CiAKIHR5cGVkZWYgZW51bSB7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCA3M2M2NWYxLi5lMzkwMTM2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCU9wdF9iYXJyaWVyLCBPcHRfbm9iYXJyaWVyLCBPcHRfZXJyCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9iYXJyaWVyLCAiYmFycmllciJ9LAogCXtPcHRfbm9iYXJyaWVyLCAibm9iYXJyaWVyIn0sCiAJe09wdF9lcnIsIE5VTEx9CkBAIC0xMzAyLDkgKzEzMDIsMjkgQEAKIAkJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIExvZ2ljYWxseSB3ZSB3b3VsZCByZXR1cm4gYW4gZXJyb3IgaGVyZSB0byBwcmV2ZW50CisJCQkgKiB1c2VycyBmcm9tIGJlbGlldmluZyB0aGV5IG1pZ2h0IGhhdmUgY2hhbmdlZAorCQkJICogbW91bnQgb3B0aW9ucyB1c2luZyByZW1vdW50IHdoaWNoIGNhbid0IGJlIGNoYW5nZWQuCisJCQkgKgorCQkJICogQnV0IHVuZm9ydHVuYXRlbHkgbW91bnQoOCkgYWRkcyBhbGwgb3B0aW9ucyBmcm9tCisJCQkgKiBtdGFiIGFuZCBmc3RhYiB0byB0aGUgbW91bnQgYXJndW1lbnRzIGluIHNvbWUgY2FzZXMKKwkJCSAqIHNvIHdlIGNhbid0IGJsaW5kbHkgcmVqZWN0IG9wdGlvbnMsIGJ1dCBoYXZlIHRvCisJCQkgKiBjaGVjayBmb3IgZWFjaCBzcGVjaWZpZWQgb3B0aW9uIGlmIGl0IGFjdHVhbGx5CisJCQkgKiBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnRseSBzZXQgb3B0aW9uIGFuZCBvbmx5CisJCQkgKiByZWplY3QgaXQgaWYgdGhhdCdzIHRoZSBjYXNlLgorCQkJICoKKwkJCSAqIFVudGlsIHRoYXQgaXMgaW1wbGVtZW50ZWQgd2UgcmV0dXJuIHN1Y2Nlc3MgZm9yCisJCQkgKiBldmVyeSByZW1vdW50IHJlcXVlc3QsIGFuZCBzaWxlbnRseSBpZ25vcmUgYWxsCisJCQkgKiBvcHRpb25zIHRoYXQgd2UgY2FuJ3QgYWN0dWFsbHkgY2hhbmdlLgorCQkJICovCisjaWYgMAogCQkJcHJpbnRrKEtFUk5fSU5GTwogCSJYRlM6IG1vdW50IG9wdGlvbiBcIiVzXCIgbm90IHN1cHBvcnRlZCBmb3IgcmVtb3VudFxuIiwgcCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKaW5kZXggNjA4YzMwYy4uMDAyZmMyNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWZfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwpAQCAtNzMyLDYgKzczMiw3IEBACiAJYmlwLT5ibGlfaXRlbS5saV9vcHMgPSAmeGZzX2J1Zl9pdGVtX29wczsKIAliaXAtPmJsaV9pdGVtLmxpX21vdW50cCA9IG1wOwogCWJpcC0+YmxpX2J1ZiA9IGJwOworCXhmc19idWZfaG9sZChicCk7CiAJYmlwLT5ibGlfZm9ybWF0LmJsZl90eXBlID0gWEZTX0xJX0JVRjsKIAliaXAtPmJsaV9mb3JtYXQuYmxmX2Jsa25vID0gKF9faW50NjRfdClYRlNfQlVGX0FERFIoYnApOwogCWJpcC0+YmxpX2Zvcm1hdC5ibGZfbGVuID0gKHVzaG9ydClCVE9CQihYRlNfQlVGX0NPVU5UKGJwKSk7CkBAIC04NjcsNiArODY4LDIxIEBACiAJcmV0dXJuIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfRElSVFkpOwogfQogCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9pdGVtX2ZyZWUoCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJa21lbV9mcmVlKGJpcC0+YmxpX29yaWcpOworCWttZW1fZnJlZShiaXAtPmJsaV9sb2dnZWQpOworI2VuZGlmIC8qIFhGU19UUkFOU19ERUJVRyAqLworCisjaWZkZWYgWEZTX0JMSV9UUkFDRQorCWt0cmFjZV9mcmVlKGJpcC0+YmxpX3RyYWNlKTsKKyNlbmRpZgorCWttZW1fem9uZV9mcmVlKHhmc19idWZfaXRlbV96b25lLCBiaXApOworfQorCiAvKgogICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYnVmIGxvZyBpdGVtIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCBzaG91bGQKICAqIGZyZWUgdGhlIGJ1ZiBsb2cgaXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGJ1ZmZlciBhbmQgY2xlYXIKQEAgLTg4NywxOCArOTAzLDggQEAKIAkgICAgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IE5VTEwpKSB7CiAJCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKIAl9Ci0KLSNpZmRlZiBYRlNfVFJBTlNfREVCVUcKLQlrbWVtX2ZyZWUoYmlwLT5ibGlfb3JpZyk7Ci0JYmlwLT5ibGlfb3JpZyA9IE5VTEw7Ci0Ja21lbV9mcmVlKGJpcC0+YmxpX2xvZ2dlZCk7Ci0JYmlwLT5ibGlfbG9nZ2VkID0gTlVMTDsKLSNlbmRpZiAvKiBYRlNfVFJBTlNfREVCVUcgKi8KLQotI2lmZGVmIFhGU19CTElfVFJBQ0UKLQlrdHJhY2VfZnJlZShiaXAtPmJsaV90cmFjZSk7Ci0jZW5kaWYKLQlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX2l0ZW1fem9uZSwgYmlwKTsKKwl4ZnNfYnVmX3JlbGUoYnApOworCXhmc19idWZfaXRlbV9mcmVlKGJpcCk7CiB9CiAKIApAQCAtMTEyMCw2ICsxMTI2LDcgQEAKIAogCUFTU0VSVChiaXAtPmJsaV9idWYgPT0gYnApOwogCisJeGZzX2J1Zl9yZWxlKGJwKTsKIAltcCA9IGJpcC0+YmxpX2l0ZW0ubGlfbW91bnRwOwogCiAJLyoKQEAgLTExMzYsMTggKzExNDMsNyBAQAogCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCSAqLwogCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOwotCi0jaWZkZWYgWEZTX1RSQU5TX0RFQlVHCi0Ja21lbV9mcmVlKGJpcC0+YmxpX29yaWcpOwotCWJpcC0+YmxpX29yaWcgPSBOVUxMOwotCWttZW1fZnJlZShiaXAtPmJsaV9sb2dnZWQpOwotCWJpcC0+YmxpX2xvZ2dlZCA9IE5VTEw7Ci0jZW5kaWYgLyogWEZTX1RSQU5TX0RFQlVHICovCi0KLSNpZmRlZiBYRlNfQkxJX1RSQUNFCi0Ja3RyYWNlX2ZyZWUoYmlwLT5ibGlfdHJhY2UpOwotI2VuZGlmCi0Ja21lbV96b25lX2ZyZWUoeGZzX2J1Zl9pdGVtX3pvbmUsIGJpcCk7CisJeGZzX2J1Zl9pdGVtX2ZyZWUoYmlwKTsKIH0KIAogI2lmIGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGZyYWcuYyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwppbmRleCA3NjBmNGM1Li43NWIwY2Q0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RmcmFnLmMKKysrIGIvZnMveGZzL3hmc19kZnJhZy5jCkBAIC0xNDksNyArMTQ5LDE0IEBACiAKIAlzYnAgPSAmc3hwLT5zeF9zdGF0OwogCi0JeGZzX2xvY2tfdHdvX2lub2RlcyhpcCwgdGlwLCBsb2NrX2ZsYWdzKTsKKwkvKgorCSAqIHdlIGhhdmUgdG8gZG8gdHdvIHNlcGFyYXRlIGxvY2sgY2FsbHMgaGVyZSB0byBrZWVwIGxvY2tkZXAKKwkgKiBoYXBweS4gSWYgd2UgdHJ5IHRvIGdldCBhbGwgdGhlIGxvY2tzIGluIG9uZSBjYWxsLCBsb2NrIHdpbGwKKwkgKiByZXBvcnQgZmFsc2UgcG9zaXRpdmVzIHdoZW4gd2UgZHJvcCB0aGUgSUxPQ0sgYW5kIHJlZ2FpbiB0aGVtCisJICogYmVsb3cuCisJICovCisJeGZzX2xvY2tfdHdvX2lub2RlcyhpcCwgdGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCXhmc19sb2NrX3R3b19pbm9kZXMoaXAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWxvY2tlZCA9IDE7CiAKIAkvKiBWZXJpZnkgdGhhdCBib3RoIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0ICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggMDBlODBkZi4uZGJkOWNlZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtNDExOCw3ICs0MTE4LDcgQEAKIAlBU1NFUlQobmV4dGVudHMgPD0gWEZTX0xJTkVBUl9FWFRTKTsKIAlzaXplID0gbmV4dGVudHMgKiBzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwogCi0JeGZzX2lleHRfaXJlY19jb21wYWN0X2Z1bGwoaWZwKTsKKwl4ZnNfaWV4dF9pcmVjX2NvbXBhY3RfcGFnZXMoaWZwKTsKIAlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzID09IFhGU19JRVhUX0JVRlNaKTsKIAogCWVwID0gaWZwLT5pZl91MS5pZl9leHRfaXJlYy0+ZXJfZXh0YnVmOwpAQCAtNDQ0OSw4ICs0NDQ5LDcgQEAKICAqIGNvbXBhY3Rpb24gcG9saWN5IGlzIGFzIGZvbGxvd3M6CiAgKgogICogICAgRnVsbCBDb21wYWN0aW9uOiBFeHRlbnRzIGZpdCBpbnRvIGEgc2luZ2xlIHBhZ2UgKG9yIGlubGluZSBidWZmZXIpCi0gKiAgICBGdWxsIENvbXBhY3Rpb246IEV4dGVudHMgb2NjdXB5IGxlc3MgdGhhbiAxMCUgb2YgYWxsb2NhdGVkIHNwYWNlCi0gKiBQYXJ0aWFsIENvbXBhY3Rpb246IEV4dGVudHMgb2NjdXB5ID4gMTAlIGFuZCA8IDUwJSBvZiBhbGxvY2F0ZWQgc3BhY2UKKyAqIFBhcnRpYWwgQ29tcGFjdGlvbjogRXh0ZW50cyBvY2N1cHkgbGVzcyB0aGFuIDUwJSBvZiBhbGxvY2F0ZWQgc3BhY2UKICAqICAgICAgTm8gQ29tcGFjdGlvbjogRXh0ZW50cyBvY2N1cHkgYXQgbGVhc3QgNTAlIG9mIGFsbG9jYXRlZCBzcGFjZQogICovCiB2b2lkCkBAIC00NDcxLDggKzQ0NzAsNiBAQAogCQl4ZnNfaWV4dF9kaXJlY3RfdG9faW5saW5lKGlmcCwgbmV4dGVudHMpOwogCX0gZWxzZSBpZiAobmV4dGVudHMgPD0gWEZTX0xJTkVBUl9FWFRTKSB7CiAJCXhmc19pZXh0X2luZGlyZWN0X3RvX2RpcmVjdChpZnApOwotCX0gZWxzZSBpZiAobmV4dGVudHMgPCAobmxpc3RzICogWEZTX0xJTkVBUl9FWFRTKSA+PiAzKSB7Ci0JCXhmc19pZXh0X2lyZWNfY29tcGFjdF9mdWxsKGlmcCk7CiAJfSBlbHNlIGlmIChuZXh0ZW50cyA8IChubGlzdHMgKiBYRlNfTElORUFSX0VYVFMpID4+IDEpIHsKIAkJeGZzX2lleHRfaXJlY19jb21wYWN0X3BhZ2VzKGlmcCk7CiAJfQpAQCAtNDQ5Niw3ICs0NDkzLDcgQEAKIAkJZXJwX25leHQgPSBlcnAgKyAxOwogCQlpZiAoZXJwX25leHQtPmVyX2V4dGNvdW50IDw9CiAJCSAgICAoWEZTX0xJTkVBUl9FWFRTIC0gZXJwLT5lcl9leHRjb3VudCkpIHsKLQkJCW1lbW1vdmUoJmVycC0+ZXJfZXh0YnVmW2VycC0+ZXJfZXh0Y291bnRdLAorCQkJbWVtY3B5KCZlcnAtPmVyX2V4dGJ1ZltlcnAtPmVyX2V4dGNvdW50XSwKIAkJCQllcnBfbmV4dC0+ZXJfZXh0YnVmLCBlcnBfbmV4dC0+ZXJfZXh0Y291bnQgKgogCQkJCXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwogCQkJZXJwLT5lcl9leHRjb3VudCArPSBlcnBfbmV4dC0+ZXJfZXh0Y291bnQ7CkBAIC00NTE2LDkxICs0NTEzLDYgQEAKIH0KIAogLyoKLSAqIEZ1bGx5IGNvbXBhY3QgdGhlIGV4dGVudCByZWNvcmRzIG1hbmFnZWQgYnkgdGhlIGluZGlyZWN0aW9uIGFycmF5LgotICovCi12b2lkCi14ZnNfaWV4dF9pcmVjX2NvbXBhY3RfZnVsbCgKLQl4ZnNfaWZvcmtfdAkqaWZwKQkJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLwotewotCXhmc19ibWJ0X3JlY19ob3N0X3QgKmVwLCAqZXBfbmV4dDsJLyogZXh0ZW50IHJlY29yZCBwb2ludGVycyAqLwotCXhmc19leHRfaXJlY190CSplcnAsICplcnBfbmV4dDsJLyogZXh0ZW50IGlyZWMgcG9pbnRlcnMgKi8KLQlpbnQJCWVycF9pZHggPSAwOwkJLyogZXh0ZW50IGlyZWMgaW5kZXggKi8KLQlpbnQJCWV4dF9hdmFpbDsJCS8qIGVtcHR5IGVudHJpZXMgaW4gZXggbGlzdCAqLwotCWludAkJZXh0X2RpZmY7CQkvKiBudW1iZXIgb2YgZXh0cyB0byBhZGQgKi8KLQlpbnQJCW5saXN0czsJCQkvKiBudW1iZXIgb2YgaXJlYydzIChleCBsaXN0cykgKi8KLQotCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhUSVJFQyk7Ci0KLQlubGlzdHMgPSBpZnAtPmlmX3JlYWxfYnl0ZXMgLyBYRlNfSUVYVF9CVUZTWjsKLQllcnAgPSBpZnAtPmlmX3UxLmlmX2V4dF9pcmVjOwotCWVwID0gJmVycC0+ZXJfZXh0YnVmW2VycC0+ZXJfZXh0Y291bnRdOwotCWVycF9uZXh0ID0gZXJwICsgMTsKLQllcF9uZXh0ID0gZXJwX25leHQtPmVyX2V4dGJ1ZjsKLQotCXdoaWxlIChlcnBfaWR4IDwgbmxpc3RzIC0gMSkgewotCQkvKgotCQkgKiBDaGVjayBob3cgbWFueSBleHRlbnQgcmVjb3JkcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgaXJlYy4KLQkJICogSWYgdGhlcmUgaXMgbm9uZSBza2lwIHRoZSB3aG9sZSBleGVyY2lzZS4KLQkJICovCi0JCWV4dF9hdmFpbCA9IFhGU19MSU5FQVJfRVhUUyAtIGVycC0+ZXJfZXh0Y291bnQ7Ci0JCWlmIChleHRfYXZhaWwpIHsKLQotCQkJLyoKLQkJCSAqIENvcHkgb3ZlciBhcyBtYW55IGFzIHBvc3NpYmxlIGV4dGVudCByZWNvcmRzIGludG8KLQkJCSAqIHRoZSBwcmV2aW91cyBwYWdlLgotCQkJICovCi0JCQlleHRfZGlmZiA9IE1JTihleHRfYXZhaWwsIGVycF9uZXh0LT5lcl9leHRjb3VudCk7Ci0JCQltZW1jcHkoZXAsIGVwX25leHQsIGV4dF9kaWZmICogc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7Ci0JCQllcnAtPmVyX2V4dGNvdW50ICs9IGV4dF9kaWZmOwotCQkJZXJwX25leHQtPmVyX2V4dGNvdW50IC09IGV4dF9kaWZmOwotCi0JCQkvKgotCQkJICogSWYgdGhlIG5leHQgaXJlYyBpcyBlbXB0eSBub3cgd2UgY2FuIHNpbXBseQotCQkJICogcmVtb3ZlIGl0LgotCQkJICovCi0JCQlpZiAoZXJwX25leHQtPmVyX2V4dGNvdW50ID09IDApIHsKLQkJCQkvKgotCQkJCSAqIEZyZWUgcGFnZSBiZWZvcmUgcmVtb3ZpbmcgZXh0ZW50IHJlY29yZAotCQkJCSAqIHNvIGVyX2V4dG9mZnMgZG9uJ3QgZ2V0IG1vZGlmaWVkIGluCi0JCQkJICogeGZzX2lleHRfaXJlY19yZW1vdmUuCi0JCQkJICovCi0JCQkJa21lbV9mcmVlKGVycF9uZXh0LT5lcl9leHRidWYpOwotCQkJCWVycF9uZXh0LT5lcl9leHRidWYgPSBOVUxMOwotCQkJCXhmc19pZXh0X2lyZWNfcmVtb3ZlKGlmcCwgZXJwX2lkeCArIDEpOwotCQkJCWVycCA9ICZpZnAtPmlmX3UxLmlmX2V4dF9pcmVjW2VycF9pZHhdOwotCQkJCW5saXN0cyA9IGlmcC0+aWZfcmVhbF9ieXRlcyAvIFhGU19JRVhUX0JVRlNaOwotCi0JCQkvKgotCQkJICogSWYgdGhlIG5leHQgaXJlYyBpcyBub3QgZW1wdHkgbW92ZSB1cCB0aGUgY29udGVudAotCQkJICogdGhhdCBoYXMgbm90IGJlZW4gY29waWVkIHRvIHRoZSBwcmV2aW91cyBwYWdlIHRvCi0JCQkgKiB0aGUgYmVnZ2luaW5nIG9mIHRoaXMgb25lLgotCQkJICovCi0JCQl9IGVsc2UgewotCQkJCW1lbW1vdmUoZXJwX25leHQtPmVyX2V4dGJ1ZiwgJmVwX25leHRbZXh0X2RpZmZdLAotCQkJCQllcnBfbmV4dC0+ZXJfZXh0Y291bnQgKgotCQkJCQlzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKLQkJCQllcF9uZXh0ID0gZXJwX25leHQtPmVyX2V4dGJ1ZjsKLQkJCQltZW1zZXQoJmVwX25leHRbZXJwX25leHQtPmVyX2V4dGNvdW50XSwgMCwKLQkJCQkJKFhGU19MSU5FQVJfRVhUUyAtCi0JCQkJCQllcnBfbmV4dC0+ZXJfZXh0Y291bnQpICoKLQkJCQkJc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXJwLT5lcl9leHRjb3VudCA9PSBYRlNfTElORUFSX0VYVFMpIHsKLQkJCWVycF9pZHgrKzsKLQkJCWlmIChlcnBfaWR4IDwgbmxpc3RzKQotCQkJCWVycCA9ICZpZnAtPmlmX3UxLmlmX2V4dF9pcmVjW2VycF9pZHhdOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCWVwID0gJmVycC0+ZXJfZXh0YnVmW2VycC0+ZXJfZXh0Y291bnRdOwotCQllcnBfbmV4dCA9IGVycCArIDE7Ci0JCWVwX25leHQgPSBlcnBfbmV4dC0+ZXJfZXh0YnVmOwotCX0KLX0KLQotLyoKICAqIFRoaXMgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgZXJfZXh0b2ZmIGZpZWxkIGluIHRoZSBpbmRpcmVjdGlvbgogICogYXJyYXkgd2hlbiBleHRlbnRzIGhhdmUgYmVlbiBhZGRlZCBvciByZW1vdmVkIGZyb20gb25lIG9mIHRoZQogICogZXh0ZW50IGxpc3RzLiBlcnBfaWR4IGNvbnRhaW5zIHRoZSBpcmVjIGluZGV4IHRvIGJlZ2luIHVwZGF0aW5nCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCBjY2JhMTRlLi4wYjAyYzY0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTEyNCwxNiArMTI0LDI3IEBACiBTVEFUSUMgaW50CXhsb2dfaWNsb2dzX2VtcHR5KHhsb2dfdCAqbG9nKTsKIAogI2lmIGRlZmluZWQoWEZTX0xPR19UUkFDRSkKKworI2RlZmluZSBYTE9HX1RSQUNFX0xPR0dSQU5UX1NJWkUJMjA0OAorI2RlZmluZSBYTE9HX1RSQUNFX0lDTE9HX1NJWkUJCTI1NgorCit2b2lkCit4bG9nX3RyYWNlX2xvZ2dyYW50X2FsbG9jKHhsb2dfdCAqbG9nKQoreworCWxvZy0+bF9ncmFudF90cmFjZSA9IGt0cmFjZV9hbGxvYyhYTE9HX1RSQUNFX0xPR0dSQU5UX1NJWkUsIEtNX05PRlMpOworfQorCit2b2lkCit4bG9nX3RyYWNlX2xvZ2dyYW50X2RlYWxsb2MoeGxvZ190ICpsb2cpCit7CisJa3RyYWNlX2ZyZWUobG9nLT5sX2dyYW50X3RyYWNlKTsKK30KKwogdm9pZAogeGxvZ190cmFjZV9sb2dncmFudCh4bG9nX3QgKmxvZywgeGxvZ190aWNrZXRfdCAqdGljLCB4ZnNfY2FkZHJfdCBzdHJpbmcpCiB7CiAJdW5zaWduZWQgbG9uZyBjbnRzOwogCi0JaWYgKCFsb2ctPmxfZ3JhbnRfdHJhY2UpIHsKLQkJbG9nLT5sX2dyYW50X3RyYWNlID0ga3RyYWNlX2FsbG9jKDIwNDgsIEtNX05PU0xFRVApOwotCQlpZiAoIWxvZy0+bF9ncmFudF90cmFjZSkKLQkJCXJldHVybjsKLQl9CiAJLyogdGlja2V0IGNvdW50cyBhcmUgMSBieXRlIGVhY2ggKi8KIAljbnRzID0gKCh1bnNpZ25lZCBsb25nKXRpYy0+dF9vY250KSB8ICgodW5zaWduZWQgbG9uZyl0aWMtPnRfY250KSA8PCA4OwogCkBAIC0xNTcsMTAgKzE2OCwyMCBAQAogfQogCiB2b2lkCit4bG9nX3RyYWNlX2ljbG9nX2FsbG9jKHhsb2dfaW5fY29yZV90ICppY2xvZykKK3sKKwlpY2xvZy0+aWNfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWExPR19UUkFDRV9JQ0xPR19TSVpFLCBLTV9OT0ZTKTsKK30KKwordm9pZAoreGxvZ190cmFjZV9pY2xvZ19kZWFsbG9jKHhsb2dfaW5fY29yZV90ICppY2xvZykKK3sKKwlrdHJhY2VfZnJlZShpY2xvZy0+aWNfdHJhY2UpOworfQorCit2b2lkCiB4bG9nX3RyYWNlX2ljbG9nKHhsb2dfaW5fY29yZV90ICppY2xvZywgdWludCBzdGF0ZSkKIHsKLQlpZiAoIWljbG9nLT5pY190cmFjZSkKLQkJaWNsb2ctPmljX3RyYWNlID0ga3RyYWNlX2FsbG9jKDI1NiwgS01fTk9GUyk7CiAJa3RyYWNlX2VudGVyKGljbG9nLT5pY190cmFjZSwKIAkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylzdGF0ZSksCiAJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9waWQoKSksCkBAIC0xNzAsOCArMTkxLDE1IEBACiAJCSAgICAgKHZvaWQgKilOVUxMLCAodm9pZCAqKU5VTEwpOwogfQogI2Vsc2UKKworI2RlZmluZQl4bG9nX3RyYWNlX2xvZ2dyYW50X2FsbG9jKGxvZykKKyNkZWZpbmUJeGxvZ190cmFjZV9sb2dncmFudF9kZWFsbG9jKGxvZykKICNkZWZpbmUJeGxvZ190cmFjZV9sb2dncmFudChsb2csdGljLHN0cmluZykKKworI2RlZmluZQl4bG9nX3RyYWNlX2ljbG9nX2FsbG9jKGljbG9nKQorI2RlZmluZQl4bG9nX3RyYWNlX2ljbG9nX2RlYWxsb2MoaWNsb2cpCiAjZGVmaW5lCXhsb2dfdHJhY2VfaWNsb2coaWNsb2csc3RhdGUpCisKICNlbmRpZiAvKiBYRlNfTE9HX1RSQUNFICovCiAKIApAQCAtMTAwNSwxMSArMTAzMywxMiBAQAogCWwgPSBpY2xvZy0+aWNfbG9nOwogCiAJLyoKLQkgKiBJZiB0aGUgb3JkZXJlZCBmbGFnIGhhcyBiZWVuIHJlbW92ZWQgYnkgYSBsb3dlcgotCSAqIGxheWVyLCBpdCBtZWFucyB0aGUgdW5kZXJseWluIGRldmljZSBubyBsb25nZXIgc3VwcG9ydHMKKwkgKiBJZiB0aGUgX1hGU19CQVJSSUVSX0ZBSUxFRCBmbGFnIHdhcyBzZXQgYnkgYSBsb3dlcgorCSAqIGxheWVyLCBpdCBtZWFucyB0aGUgdW5kZXJseWluZyBkZXZpY2Ugbm8gbG9uZ2VyIHN1cHBvcnRzCiAJICogYmFycmllciBJL08uIFdhcm4gbG91ZGx5IGFuZCB0dXJuIG9mZiBiYXJyaWVycy4KIAkgKi8KLQlpZiAoKGwtPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgJiYgIVhGU19CVUZfT1JERVJFRChicCkpIHsKKwlpZiAoYnAtPmJfZmxhZ3MgJiBfWEZTX0JBUlJJRVJfRkFJTEVEKSB7CisJCWJwLT5iX2ZsYWdzICY9IH5fWEZTX0JBUlJJRVJfRkFJTEVEOwogCQlsLT5sX21wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfQkFSUklFUjsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbC0+bF9tcCwKIAkJCQkieGxvZ19pb2RvbmU6IEJhcnJpZXJzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIgpAQCAtMTIzMSw2ICsxMjYwLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmbG9nLT5sX2dyYW50X2xvY2spOwogCXN2X2luaXQoJmxvZy0+bF9mbHVzaF93YWl0LCAwLCAiZmx1c2hfd2FpdCIpOwogCisJeGxvZ190cmFjZV9sb2dncmFudF9hbGxvYyhsb2cpOwogCS8qIGxvZyByZWNvcmQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIEJCU0laRTsgc2VlIHhsb2dfcmVjX2hlYWRlcl90ICovCiAJQVNTRVJUKChYRlNfQlVGX1NJWkUoYnApICYgQkJNQVNLKSA9PSAwKTsKIApAQCAtMTI4NSw2ICsxMzE1LDggQEAKIAkJc3ZfaW5pdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsIFNWX0RFRkFVTFQsICJpY2xvZy1mb3JjZSIpOwogCQlzdl9pbml0KCZpY2xvZy0+aWNfd3JpdGVfd2FpdCwgU1ZfREVGQVVMVCwgImljbG9nLXdyaXRlIik7CiAKKwkJeGxvZ190cmFjZV9pY2xvZ19hbGxvYyhpY2xvZyk7CisKIAkJaWNsb2dwID0gJmljbG9nLT5pY19uZXh0OwogCX0KIAkqaWNsb2dwID0gbG9nLT5sX2ljbG9nOwkJCS8qIGNvbXBsZXRlIHJpbmcgKi8KQEAgLTE1NjUsMTEgKzE1OTcsNyBAQAogCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCk7CiAJCXN2X2Rlc3Ryb3koJmljbG9nLT5pY193cml0ZV93YWl0KTsKIAkJeGZzX2J1Zl9mcmVlKGljbG9nLT5pY19icCk7Ci0jaWZkZWYgWEZTX0xPR19UUkFDRQotCQlpZiAoaWNsb2ctPmljX3RyYWNlICE9IE5VTEwpIHsKLQkJCWt0cmFjZV9mcmVlKGljbG9nLT5pY190cmFjZSk7Ci0JCX0KLSNlbmRpZgorCQl4bG9nX3RyYWNlX2ljbG9nX2RlYWxsb2MoaWNsb2cpOwogCQluZXh0X2ljbG9nID0gaWNsb2ctPmljX25leHQ7CiAJCWttZW1fZnJlZShpY2xvZyk7CiAJCWljbG9nID0gbmV4dF9pY2xvZzsKQEAgLTE1NzgsMTQgKzE2MDYsNyBAQAogCXNwaW5sb2NrX2Rlc3Ryb3koJmxvZy0+bF9ncmFudF9sb2NrKTsKIAogCXhmc19idWZfZnJlZShsb2ctPmxfeGJ1Zik7Ci0jaWZkZWYgWEZTX0xPR19UUkFDRQotCWlmIChsb2ctPmxfdHJhY2UgIT0gTlVMTCkgewotCQlrdHJhY2VfZnJlZShsb2ctPmxfdHJhY2UpOwotCX0KLQlpZiAobG9nLT5sX2dyYW50X3RyYWNlICE9IE5VTEwpIHsKLQkJa3RyYWNlX2ZyZWUobG9nLT5sX2dyYW50X3RyYWNlKTsKLQl9Ci0jZW5kaWYKKwl4bG9nX3RyYWNlX2xvZ2dyYW50X2RlYWxsb2MobG9nKTsKIAlsb2ctPmxfbXAtPm1fbG9nID0gTlVMTDsKIAlrbWVtX2ZyZWUobG9nKTsKIH0JLyogeGxvZ19kZWFsbG9jX2xvZyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCmluZGV4IGM4YTViMjIuLmU3ZDhmODQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTQ0OCw3ICs0NDgsNiBAQAogCWludAkJCWxfZ3JhbnRfd3JpdGVfYnl0ZXM7CiAKICNpZmRlZiBYRlNfTE9HX1RSQUNFCi0Jc3RydWN0IGt0cmFjZQkJKmxfdHJhY2U7CiAJc3RydWN0IGt0cmFjZQkJKmxfZ3JhbnRfdHJhY2U7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGFhMjM4YzguLjhiNjgxMmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTE4MzgsNiArMTgzOCwxMiBAQAogI2VuZGlmCiB9CiAKKy8qCisgKiB4ZnNfbG9ja190d29faW5vZGVzKCkgY2FuIG9ubHkgYmUgdXNlZCB0byBsb2NrIG9uZSB0eXBlIG9mIGxvY2sKKyAqIGF0IGEgdGltZSAtIHRoZSBpb2xvY2sgb3IgdGhlIGlsb2NrLCBidXQgbm90IGJvdGggYXQgb25jZS4gSWYKKyAqIHdlIGxvY2sgYm90aCBhdCBvbmNlLCBsb2NrZGVwIHdpbGwgcmVwb3J0IGZhbHNlIHBvc2l0aXZlcyBzYXlpbmcKKyAqIHdlIGhhdmUgdmlvbGF0ZWQgbG9ja2luZyBvcmRlcnMuCisgKi8KIHZvaWQKIHhmc19sb2NrX3R3b19pbm9kZXMoCiAJeGZzX2lub2RlX3QJCSppcDAsCkBAIC0xODQ4LDYgKzE4NTQsOCBAQAogCWludAkJCWF0dGVtcHRzID0gMDsKIAl4ZnNfbG9nX2l0ZW1fdAkJKmxwOwogCisJaWYgKGxvY2tfbW9kZSAmIChYRlNfSU9MT0NLX1NIQVJFRHxYRlNfSU9MT0NLX0VYQ0wpKQorCQlBU1NFUlQoKGxvY2tfbW9kZSAmIChYRlNfSUxPQ0tfU0hBUkVEfFhGU19JTE9DS19FWENMKSkgPT0gMCk7CiAJQVNTRVJUKGlwMC0+aV9pbm8gIT0gaXAxLT5pX2lubyk7CiAKIAlpZiAoaXAwLT5pX2lubyA+IGlwMS0+aV9pbm8pIHsKQEAgLTMxNTIsNiArMzE2MCwxMyBAQAogLyoKICAqIFplcm8gZmlsZSBieXRlcyBiZXR3ZWVuIHN0YXJ0b2ZmIGFuZCBlbmRvZmYgaW5jbHVzaXZlLgogICogVGhlIGlvbG9jayBpcyBoZWxkIGV4Y2x1c2l2ZSBhbmQgbm8gYmxvY2tzIGFyZSBidWZmZXJlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgeGZzX2ZyZWVfZmlsZV9zcGFjZSgpIHRvIHplcm8KKyAqIHBhcnRpYWwgYmxvY2tzIHdoZW4gdGhlIHJhbmdlIHRvIGZyZWUgaXMgbm90IGJsb2NrIGFsaWduZWQuCisgKiBXaGVuIHVucmVzZXJ2aW5nIHNwYWNlIHdpdGggYm91bmRhcmllcyB0aGF0IGFyZSBub3QgYmxvY2sKKyAqIGFsaWduZWQgd2Ugcm91bmQgdXAgdGhlIHN0YXJ0IGFuZCByb3VuZCBkb3duIHRoZSBlbmQKKyAqIGJvdW5kYXJpZXMgYW5kIHRoZW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gemVybyB0aGUgcGFydHMgb2YKKyAqIHRoZSBibG9ja3MgdGhhdCBnb3QgZHJvcHBlZCBkdXJpbmcgdGhlIHJvdW5kaW5nLgogICovCiBTVEFUSUMgaW50CiB4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMoCkBAIC0zMTY4LDYgKzMxODMsMTcgQEAKIAlpbnQJCQluaW1hcDsKIAlpbnQJCQllcnJvciA9IDA7CiAKKwkvKgorCSAqIEF2b2lkIGRvaW5nIEkvTyBiZXlvbmQgZW9mIC0gaXQncyBub3QgbmVjZXNzYXJ5CisJICogc2luY2Ugbm90aGluZyBjYW4gcmVhZCBiZXlvbmQgZW9mLiAgVGhlIHNwYWNlIHdpbGwKKwkgKiBiZSB6ZXJvZWQgd2hlbiB0aGUgZmlsZSBpcyBleHRlbmRlZCBhbnl3YXkuCisJICovCisJaWYgKHN0YXJ0b2ZmID49IGlwLT5pX3NpemUpCisJCXJldHVybiAwOworCisJaWYgKGVuZG9mZiA+IGlwLT5pX3NpemUpCisJCWVuZG9mZiA9IGlwLT5pX3NpemU7CisKIAlicCA9IHhmc19idWZfZ2V0X25vYWRkcihtcC0+bV9zYi5zYl9ibG9ja3NpemUsCiAJCQkJWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSA/CiAJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKaW5kZXggNTdhYjllOS4uNzRhOTYxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmgKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogLyoKICAqIElmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgd2FzIG5vdCBkZWZpbmVkIGluIHRoZSBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyLAogICogZGVmaW5lIGl0IG5vdy4gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGVyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydAotICogYSBfX0ZVTkNUSU9OX18gbWFjcm8gb3IgZXF1aXZhbGVudC4KKyAqIGEgX19mdW5jX18gbWFjcm8gb3IgZXF1aXZhbGVudC4KICAqLwogI2lmbmRlZiBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FCiAjZGVmaW5lIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgICAgICAgICAgX2FjcGlfZnVuY3Rpb25fbmFtZQpAQCAtNDc1LDEyICs0NzUsMTIgQEAKICAqIFRoZSBOYW1lIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHByb2NlZHVyZSBuYW1lIGFzIGEgcXVvdGVkIHN0cmluZy4KICAqIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGFsc28gdXNlZCBieSB0aGUgZnVuY3Rpb24gZXhpdCBtYWNyb3MgYmVsb3cuCiAgKiBOb3RlOiAoY29uc3QgY2hhcikgaXMgdXNlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGRlYnVnIGludGVyZmFjZXMKLSAqIGFuZCBtYWNyb3Mgc3VjaCBhcyBfX0ZVTkNUSU9OX18uCisgKiBhbmQgbWFjcm9zIHN1Y2ggYXMgX19mdW5jX18uCiAgKi8KICNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKG5hbWUpCXN0YXRpYyBjb25zdCBjaGFyIF9hY3BpX2Z1bmN0aW9uX25hbWVbXSA9ICNuYW1lOwogCiAjZWxzZQotLyogQ29tcGlsZXIgc3VwcG9ydHMgX19GVU5DVElPTl9fIChvciBlcXVpdmFsZW50KSAtLSBJZ25vcmUgdGhpcyBtYWNybyAqLworLyogQ29tcGlsZXIgc3VwcG9ydHMgX19mdW5jX18gKG9yIGVxdWl2YWxlbnQpIC0tIElnbm9yZSB0aGlzIG1hY3JvICovCiAKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKG5hbWUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKaW5kZXggODk5NmRiYS4uOGUyY2RjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogLyogRnVuY3Rpb24gbmFtZSBpcyB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQuIE5vbi1BTlNJLCBjb21waWxlci1kZXBlbmRlbnQgKi8KIAotI2RlZmluZSBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FICAgICAgICAgIF9fRlVOQ1RJT05fXworI2RlZmluZSBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FICAgICAgICAgIF9fZnVuY19fCiAKIC8qCiAgKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gdGFnIGZ1bmN0aW9ucyBhcyAicHJpbnRmLWxpa2UiIGJlY2F1c2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL2RlYnVnLW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzQwYjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL2RlYnVnLW1hY3JvLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvZGVidWctbWFjcm8uUwotICoKLSAqIENvcHlyaWdodCAyMDA1LCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYy9yZWdzLXNlcmlhbC5oPgotCi0vKiBUaGUgUzNDMjQ0MCBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSB0aGUKLSAqIG1vc3Qgd2lkZWx5IHJlLXVzZWQgKi8KLQotCS5tYWNybyBmaWZvX2xldmVsX3MzYzI0NDAgcmQsIHJ4Ci0JCWxkcglccmQsIFsgXHJ4LCAjIFMzQzI0MTBfVUZTVEFUIF0KLQkJYW5kCVxyZCwgXHJkLCAjUzNDMjQ0MF9VRlNUQVRfVFhNQVNLCi0JLmVuZG0KLQotI2lmbmRlZiBmaWZvX2xldmVsCi0jZGVmaW5lIGZpZm9fbGV2ZWwgZmlmb19sZXZlbF9zM2MyNDEwCi0jZW5kaWYKLQotCS5tYWNybyAgZmlmb19mdWxsX3MzYzI0NDAgcmQsIHJ4Ci0JCWxkcglccmQsIFsgXHJ4LCAjIFMzQzI0MTBfVUZTVEFUIF0KLQkJdHN0CVxyZCwgI1MzQzI0NDBfVUZTVEFUX1RYRlVMTAotCS5lbmRtCi0KLSNpZm5kZWYgZmlmb19mdWxsCi0jZGVmaW5lIGZpZm9fZnVsbCBmaWZvX2Z1bGxfczNjMjQ0MAotI2VuZGlmCi0KLQkubWFjcm8Jc2VuZHVhcnQscmQscngKLQkJc3RyYiAJXHJkLCBbXHJ4LCAjIFMzQzI0MTBfVVRYSCBdCi0JLmVuZG0KLQotCS5tYWNybwlidXN5dWFydCwgcmQsIHJ4Ci0JCWxkcglccmQsIFsgXHJ4LCAjIFMzQzI0MTBfVUZDT04gXQotCQl0c3QJXHJkLCAjUzNDMjQxMF9VRkNPTl9GSUZPTU9ERQlAIGZpZm8gZW5hYmxlZD8KLQkJYmVxCTEwMDFmCQkJCUAKLQkJQCBGSUZPIGVuYWJsZWQuLi4KLTEwMDM6Ci0JCWZpZm9fZnVsbCBccmQsIFxyeAotCQlibmUJMTAwM2IKLQkJYgkxMDAyZgotCi0xMDAxOgotCQlAIGJ1c3kgd2FpdGluZyBmb3Igbm9uIGZpZm8KLQkJbGRyCVxyZCwgWyBccngsICMgUzNDMjQxMF9VVFJTVEFUIF0KLQkJdHN0CVxyZCwgI1MzQzI0MTBfVVRSU1RBVF9UWEZFCi0JCWJlcQkxMDAxYgotCi0xMDAyOgkJQCBleGl0IGJ1c3l1YXJ0Ci0JLmVuZG0KLQotCS5tYWNybwl3YWl0dWFydCxyZCxyeAotCQlsZHIJXHJkLCBbIFxyeCwgIyBTM0MyNDEwX1VGQ09OIF0KLQkJdHN0CVxyZCwgI1MzQzI0MTBfVUZDT05fRklGT01PREUJQCBmaWZvIGVuYWJsZWQ/Ci0JCWJlcQkxMDAxZgkJCQlACi0JCUAgRklGTyBlbmFibGVkLi4uCi0xMDAzOgotCQlmaWZvX2xldmVsIFxyZCwgXHJ4Ci0JCXRlcQlccmQsICMwCi0JCWJuZQkxMDAzYgotCQliCTEwMDJmCi0xMDAxOgotCQlAIGlkbGUgd2FpdGluZyBmb3Igbm9uIGZpZm8KLQkJbGRyCVxyZCwgWyBccngsICMgUzNDMjQxMF9VVFJTVEFUIF0KLQkJdHN0CVxyZCwgI1MzQzI0MTBfVVRSU1RBVF9UWEZFCi0JCWJlcQkxMDAxYgotCi0xMDAyOgkJQCBleGl0IGJ1c3l1YXJ0Ci0JLmVuZG0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy91bmNvbXByZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MvdW5jb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI5ZWRhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYy91bmNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjL3VuY29tcHJlc3MuaAotICoKLSAqIENvcHlyaWdodCAyMDAzLCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MgLSB1bmNvbXByZXNzIGNvZGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1VOQ09NUFJFU1NfSAotI2RlZmluZSBfX0FTTV9QTEFUX1VOQ09NUFJFU1NfSAotCi10eXBlZGVmIHVuc2lnbmVkIGludCB1cGZfdDsJLyogY2Fubm90IGluY2x1ZGUgbGludXgvc2VyaWFsX2NvcmUuaCAqLwotCi0vKiB1YXJ0IHNldHVwICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlmb19tYXNrOwotc3RhdGljIHVuc2lnbmVkIGludCBmaWZvX21heDsKLQotLyogZm9yd2FyZCBkZWNsZXJhdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgYXJjaF9kZXRlY3RfY3B1KHZvaWQpOwotCi0vKiBkZWZpbmVzIGZvciBVQVJUIHJlZ2lzdGVycyAqLwotCi0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjL3JlZ3Mtd2F0Y2hkb2cuaD4KLQotLyogd29ya2luZyBpbiBwaHlzaWNhbCBzcGFjZS4uLiAqLwotI3VuZGVmIFMzQzI0MTBfV0RPR1JFRwotI2RlZmluZSBTM0MyNDEwX1dET0dSRUcoeCkgKChTM0MyNFhYX1BBX1dBVENIRE9HICsgKHgpKSkKLQotLyogaG93IG1hbnkgYnl0ZXMgd2UgYWxsb3cgaW50byB0aGUgRklGTyBhdCBhIHRpbWUgaW4gRklGTyBtb2RlICovCi0jZGVmaW5lIEZJRk9fTUFYCSAoMTQpCi0KLSNkZWZpbmUgdWFydF9iYXNlIFMzQzI0WFhfUEFfVUFSVCArICgweDQwMDAqQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQpCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXVhcnRfd3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0cjsKLQotCXB0ciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikocmVnICsgdWFydF9iYXNlKTsKLQkqcHRyID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLXVhcnRfcmQodW5zaWduZWQgaW50IHJlZykKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnB0cjsKLQotCXB0ciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikocmVnICsgdWFydF9iYXNlKTsKLQlyZXR1cm4gKnB0cjsKLX0KLQotLyogd2UgY2FuIGRlYWwgd2l0aCB0aGUgY2FzZSB0aGUgVUFSVHMgYXJlIGJlaW5nIHJ1bgotICogaW4gRklGTyBtb2RlLCBzbyB0aGF0IHdlIGRvbid0IGhvbGQgdXAgb3VyIGV4ZWN1dGlvbgotICogd2FpdGluZyBmb3IgdHggdG8gaGFwcGVuLi4uCi0qLwotCi1zdGF0aWMgdm9pZCBwdXRjKGludCBjaCkKLXsKLQlpZiAodWFydF9yZChTM0MyNDEwX1VGQ09OKSAmIFMzQzI0MTBfVUZDT05fRklGT01PREUpIHsKLQkJaW50IGxldmVsOwotCi0JCXdoaWxlICgxKSB7Ci0JCQlsZXZlbCA9IHVhcnRfcmQoUzNDMjQxMF9VRlNUQVQpOwotCQkJbGV2ZWwgJj0gZmlmb19tYXNrOwotCi0JCQlpZiAobGV2ZWwgPCBmaWZvX21heCkKLQkJCQlicmVhazsKLQkJfQotCi0JfSBlbHNlIHsKLQkJLyogbm90IHVzaW5nIGZpZm9zICovCi0KLQkJd2hpbGUgKCh1YXJ0X3JkKFMzQzI0MTBfVVRSU1RBVCkgJiBTM0MyNDEwX1VUUlNUQVRfVFhFKSAhPSBTM0MyNDEwX1VUUlNUQVRfVFhFKQotCQkJYmFycmllcigpOwotCX0KLQotCS8qIHdyaXRlIGJ5dGUgdG8gdHJhbnNtaXNzaW9uIHJlZ2lzdGVyICovCi0JdWFydF93cihTM0MyNDEwX1VUWEgsIGNoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoKHZvaWQpCi17Ci19Ci0KLSNkZWZpbmUgX19yYXdfd3JpdGVsKGQsYWQpIGRvIHsgKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkKSkgPSAoZCk7IH0gd2hpbGUoMCkKLQotLyogQ09ORklHX1MzQ19CT09UX1dBVENIRE9HCi0gKgotICogU2ltcGxlIGJvb3QtdGltZSB3YXRjaGRvZyBzZXR1cCwgdG8gcmVib290IHRoZSBzeXN0ZW0gaWYgdGhlcmUgaXMKLSAqIGFueSBwcm9ibGVtIHdpdGggdGhlIGJvb3QgcHJvY2VzcwotKi8KLQotI2lmZGVmIENPTkZJR19TM0NfQk9PVF9XQVRDSERPRwotCi0jZGVmaW5lIFdET0dfQ09VTlQgKDB4ZmYwMCkKLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZGVjb21wX3dkb2codm9pZCkKLXsKLQlfX3Jhd193cml0ZWwoV0RPR19DT1VOVCwgUzNDMjQxMF9XVENOVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY2hfZGVjb21wX3dkb2dfc3RhcnQodm9pZCkKLXsKLQlfX3Jhd193cml0ZWwoV0RPR19DT1VOVCwgUzNDMjQxMF9XVERBVCk7Ci0JX19yYXdfd3JpdGVsKFdET0dfQ09VTlQsIFMzQzI0MTBfV1RDTlQpOwotCV9fcmF3X3dyaXRlbChTM0MyNDEwX1dUQ09OX0VOQUJMRSB8IFMzQzI0MTBfV1RDT05fRElWMTI4IHwgUzNDMjQxMF9XVENPTl9SU1RFTiB8IFMzQzI0MTBfV1RDT05fUFJFU0NBTEUoMHg4MCksIFMzQzI0MTBfV1RDT04pOwotfQotCi0jZWxzZQotI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nX3N0YXJ0KCkKLSNkZWZpbmUgYXJjaF9kZWNvbXBfd2RvZygpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TM0NfQk9PVF9FUlJPUl9SRVNFVAotCi1zdGF0aWMgdm9pZCBhcmNoX2RlY29tcF9lcnJvcihjb25zdCBjaGFyICp4KQotewotCXB1dHN0cigiXG5cbiIpOwotCXB1dHN0cih4KTsKLQlwdXRzdHIoIlxuXG4gLS0gU3lzdGVtIHJlc2V0dGluZ1xuIik7Ci0KLQlfX3Jhd193cml0ZWwoMHg0MDAwLCBTM0MyNDEwX1dUREFUKTsKLQlfX3Jhd193cml0ZWwoMHg0MDAwLCBTM0MyNDEwX1dUQ05UKTsKLQlfX3Jhd193cml0ZWwoUzNDMjQxMF9XVENPTl9FTkFCTEUgfCBTM0MyNDEwX1dUQ09OX0RJVjEyOCB8IFMzQzI0MTBfV1RDT05fUlNURU4gfCBTM0MyNDEwX1dUQ09OX1BSRVNDQUxFKDB4NDApLCBTM0MyNDEwX1dUQ09OKTsKLQotCXdoaWxlKDEpOwotfQotCi0jZGVmaW5lIGFyY2hfZXJyb3IgYXJjaF9kZWNvbXBfZXJyb3IKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBlcnJvcihjaGFyICplcnIpOwotCi1zdGF0aWMgdm9pZAotYXJjaF9kZWNvbXBfc2V0dXAodm9pZCkKLXsKLQkvKiB3ZSBtYXkgbmVlZCB0byBzZXR1cCB0aGUgdWFydChzKSBoZXJlIGlmIHdlIGFyZSBub3QgcnVubmluZwotCSAqIG9uIGFuIEJBU1QuLi4gdGhlIEJBU1Qgd2lsbCBoYXZlIGxlZnQgdGhlIHVhcnRzIGNvbmZpZ3VyZWQKLQkgKiBhZnRlciBjYWxsaW5nIGxpbnV4LgotCSAqLwotCi0JYXJjaF9kZXRlY3RfY3B1KCk7Ci0JYXJjaF9kZWNvbXBfd2RvZ19zdGFydCgpOwotfQotCi0KLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1VOQ09NUFJFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hLm91dC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hLm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODJlOWY5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNpZm5kZWYgX19DUklTX0FfT1VUX0hfXwotI2RlZmluZSBfX0NSSVNfQV9PVVRfSF9fCi0KLS8qIHdlIGRvbid0IHN1cHBvcnQgYS5vdXQgYmluYXJpZXMgb24gTGludXgvQ1JJUyBhbnl3YXksIHNvIHRoaXMgaXMKLSAqIG5vdCByZWFsbHkgdXNlZCBidXQgc3RpbGwgbmVlZGVkIGJlY2F1c2UgYmluZm10X2VsZi5jIGZvciBzb21lIHJlYXNvbgotICogd2FudHMgdG8ga25vdyBhYm91dCBhLm91dCBldmVuIGlmIHRoZXJlIGlzIG5vIGludGVycHJldGVyIGF2YWlsYWJsZS4uLgotICovCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV9pbmZvOwkJLyogVXNlIG1hY3JvcyBOX01BR0lDLCBldGMgZm9yIGFjY2VzcyAqLwotICB1bnNpZ25lZCBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgYV90cnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi19OwotCi0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZWxmLmggYi9pbmNsdWRlL2FzbS1jcmlzL2VsZi5oCmluZGV4IDAwMWY2NGEuLmYwZDE3ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9lbGYuaApAQCAtODgsNiArODgsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KChpYmNzMik/UEVSX1NWUjQ6UEVSX0xJTlVYKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2VsZi5oIGIvaW5jbHVkZS9hc20tZnJ2L2VsZi5oCmluZGV4IDlmYjk0NmIuLjcyNzllYzA3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9lbGYuaApAQCAtMTM3LDYgKzEzNyw2IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1mcnYvdW5hbGlnbmVkLmgKaW5kZXggODM5YTJmYi4uNmM2MWMwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3VuYWxpZ25lZC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91bmFsaWduZWQuaApAQCAtMTMsNyArMTMsNyBAQAogI2RlZmluZSBfQVNNX1VOQUxJR05FRF9ICiAKICNpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX2J5dGVzaGlmdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9zdHJ1Y3QuaD4KICNpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgogCiAjZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2JlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCBhM2Y3MzhjLi4wZjZkYWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2lmbmRlZiBIQVZFX0FSQ0hfQlVHCiAjZGVmaW5lIEJVRygpIGRvIHsgXAotCXByaW50aygiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IFwKKwlwcmludGsoIkJVRzogZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKIAlwYW5pYygiQlVHISIpOyBcCiB9IHdoaWxlICgwKQogI2VuZGlmCkBAIC05Nyw2ICs5NywxNiBAQAogCXVubGlrZWx5KF9fcmV0X3dhcm5fb25jZSk7CQkJCVwKIH0pCiAKKyNkZWZpbmUgV0FSTl9PTkNFKGNvbmRpdGlvbiwgZm9ybWF0Li4uKQkoewkJCVwKKwlzdGF0aWMgaW50IF9fd2FybmVkOwkJCQkJXAorCWludCBfX3JldF93YXJuX29uY2UgPSAhIShjb25kaXRpb24pOwkJCVwKKwkJCQkJCQkJXAorCWlmICh1bmxpa2VseShfX3JldF93YXJuX29uY2UpKQkJCQlcCisJCWlmIChXQVJOKCFfX3dhcm5lZCwgZm9ybWF0KSkgCQkJXAorCQkJX193YXJuZWQgPSAxOwkJCQlcCisJdW5saWtlbHkoX19yZXRfd2Fybl9vbmNlKTsJCQkJXAorfSkKKwogI2RlZmluZSBXQVJOX09OX1JBVEVMSU1JVChjb25kaXRpb24sIHN0YXRlKQkJCVwKIAkJV0FSTl9PTigoY29uZGl0aW9uKSAmJiBfX3JhdGVsaW1pdChzdGF0ZSkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZ3Bpby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKaW5kZXggMGY5OWFkMy4uODE3OTdlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmgKQEAgLTM1LDExICszNSwxNyBAQAogICogQGxhYmVsOiBmb3IgZGlhZ25vc3RpY3MKICAqIEBkZXY6IG9wdGlvbmFsIGRldmljZSBwcm92aWRpbmcgdGhlIEdQSU9zCiAgKiBAb3duZXI6IGhlbHBzIHByZXZlbnQgcmVtb3ZhbCBvZiBtb2R1bGVzIGV4cG9ydGluZyBhY3RpdmUgR1BJT3MKKyAqIEByZXF1ZXN0OiBvcHRpb25hbCBob29rIGZvciBjaGlwLXNwZWNpZmljIGFjdGl2YXRpb24sIHN1Y2ggYXMKKyAqCWVuYWJsaW5nIG1vZHVsZSBwb3dlciBhbmQgY2xvY2s7IG1heSBzbGVlcAorICogQGZyZWU6IG9wdGlvbmFsIGhvb2sgZm9yIGNoaXAtc3BlY2lmaWMgZGVhY3RpdmF0aW9uLCBzdWNoIGFzCisgKglkaXNhYmxpbmcgbW9kdWxlIHBvd2VyIGFuZCBjbG9jazsgbWF5IHNsZWVwCiAgKiBAZGlyZWN0aW9uX2lucHV0OiBjb25maWd1cmVzIHNpZ25hbCAib2Zmc2V0IiBhcyBpbnB1dCwgb3IgcmV0dXJucyBlcnJvcgogICogQGdldDogcmV0dXJucyB2YWx1ZSBmb3Igc2lnbmFsICJvZmZzZXQiOyBmb3Igb3V0cHV0IHNpZ25hbHMgdGhpcwogICoJcmV0dXJucyBlaXRoZXIgdGhlIHZhbHVlIGFjdHVhbGx5IHNlbnNlZCwgb3IgemVybwogICogQGRpcmVjdGlvbl9vdXRwdXQ6IGNvbmZpZ3VyZXMgc2lnbmFsICJvZmZzZXQiIGFzIG91dHB1dCwgb3IgcmV0dXJucyBlcnJvcgogICogQHNldDogYXNzaWducyBvdXRwdXQgdmFsdWUgZm9yIHNpZ25hbCAib2Zmc2V0IgorICogQHRvX2lycTogb3B0aW9uYWwgaG9vayBzdXBwb3J0aW5nIG5vbi1zdGF0aWMgZ3Bpb190b19pcnEoKSBtYXBwaW5nczsKKyAqCWltcGxlbWVudGF0aW9uIG1heSBub3Qgc2xlZXAKICAqIEBkYmdfc2hvdzogb3B0aW9uYWwgcm91dGluZSB0byBzaG93IGNvbnRlbnRzIGluIGRlYnVnZnM7IGRlZmF1bHQgY29kZQogICoJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyBpcyBvbWl0dGVkLCBidXQgY3VzdG9tIGNvZGUgY2FuIHNob3cgZXh0cmEKICAqCXN0YXRlIChzdWNoIGFzIHB1bGx1cC9wdWxsZG93biBjb25maWd1cmF0aW9uKS4KQEAgLTYxLDEwICs2NywxNSBAQAogICogaXMgY2FsY3VsYXRlZCBieSBzdWJ0cmFjdGluZyBAYmFzZSBmcm9tIHRoZSBncGlvIG51bWJlci4KICAqLwogc3RydWN0IGdwaW9fY2hpcCB7Ci0JY2hhcgkJCSpsYWJlbDsKKwljb25zdCBjaGFyCQkqbGFiZWw7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAKKwlpbnQJCQkoKnJlcXVlc3QpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCQl1bnNpZ25lZCBvZmZzZXQpOworCXZvaWQJCQkoKmZyZWUpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCQl1bnNpZ25lZCBvZmZzZXQpOworCiAJaW50CQkJKCpkaXJlY3Rpb25faW5wdXQpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCiAJCQkJCQl1bnNpZ25lZCBvZmZzZXQpOwogCWludAkJCSgqZ2V0KShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLApAQCAtNzMsNiArODQsMTAgQEAKIAkJCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKTsKIAl2b2lkCQkJKCpzZXQpKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCiAJCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSk7CisKKwlpbnQJCQkoKnRvX2lycSkoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJCXVuc2lnbmVkIG9mZnNldCk7CisKIAl2b2lkCQkJKCpkYmdfc2hvdykoc3RydWN0IHNlcV9maWxlICpzLAogCQkJCQkJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CiAJaW50CQkJYmFzZTsKQEAgLTExMiw2ICsxMjcsNyBAQAogCiBleHRlcm4gaW50IF9fZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBncGlvKTsKIAorZXh0ZXJuIGludCBfX2dwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pOwogCiAjaWZkZWYgQ09ORklHX0dQSU9fU1lTRlMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZWN0aW9ucy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zZWN0aW9ucy5oCmluZGV4IDhmZWVhZTEuLjc5YTdmZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc2VjdGlvbnMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NlY3Rpb25zLmgKQEAgLTE0LDQgKzE0LDEwIEBACiBleHRlcm4gY2hhciBfX2luaXRkYXRhX2JlZ2luW10sIF9faW5pdGRhdGFfZW5kW107CiBleHRlcm4gY2hhciBfX3N0YXJ0X3JvZGF0YVtdLCBfX2VuZF9yb2RhdGFbXTsKIAorLyogZnVuY3Rpb24gZGVzY3JpcHRvciBoYW5kbGluZyAoaWYgYW55KS4gIE92ZXJyaWRlCisgKiBpbiBhc20vc2VjdGlvbnMuaCAqLworI2lmbmRlZiBkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yCisjZGVmaW5lIGRlcmVmZXJlbmNlX2Z1bmN0aW9uX2Rlc2NyaXB0b3IocCkgKHApCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fR0VORVJJQ19TRUNUSU9OU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaAppbmRleCA4Nzg2ZTAxLi45Njk1NzAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaApAQCAtMTk5LDYgKzE5OSw4IEBACiAgKi8KICNkZWZpbmUgVFJBUF9CUktQVAkoX19TSV9GQVVMVHwxKQkvKiBwcm9jZXNzIGJyZWFrcG9pbnQgKi8KICNkZWZpbmUgVFJBUF9UUkFDRQkoX19TSV9GQVVMVHwyKQkvKiBwcm9jZXNzIHRyYWNlIHRyYXAgKi8KKyNkZWZpbmUgVFJBUF9CUkFOQ0ggICAgIChfX1NJX0ZBVUxUfDMpICAvKiBwcm9jZXNzIHRha2VuIGJyYW5jaCB0cmFwICovCisjZGVmaW5lIFRSQVBfSFdCS1BUICAgICAoX19TSV9GQVVMVHw0KSAgLyogaGFyZHdhcmUgYnJlYWtwb2ludC93YXRjaHBvaW50ICovCiAjZGVmaW5lIE5TSUdUUkFQCTIKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3N0YXRmcy5oCmluZGV4IDFkMDEwNDMuLjYxMjlkNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9zdGF0ZnMuaApAQCAtNiwzMyArNiw2NCBAQAogdHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QJZnNpZF90OwogI2VuZGlmCiAKKy8qCisgKiBNb3N0IDY0LWJpdCBwbGF0Zm9ybXMgdXNlICdsb25nJywgd2hpbGUgbW9zdCAzMi1iaXQgcGxhdGZvcm1zIHVzZSAnX191MzInLgorICogWWVzLCB0aGV5IGRpZmZlciBpbiBzaWduZWRuZXNzIGFzIHdlbGwgYXMgc2l6ZS4KKyAqIFNwZWNpYWwgY2FzZXMgY2FuIG92ZXJyaWRlIGl0IGZvciB0aGVtc2VsdmVzIC0tIGV4Y2VwdCBmb3IgUzM5MHgsIHdoaWNoCisgKiBpcyBqdXN0IGEgbGl0dGxlIHRvbyBzcGVjaWFsIGZvciB1cy4gQW5kIE1JUFMsIHdoaWNoIEknbSBub3QgdG91Y2hpbmcKKyAqIHdpdGggYSAxMCcgcG9sZS4KKyAqLworI2lmbmRlZiBfX3N0YXRmc193b3JkCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2RlZmluZSBfX3N0YXRmc193b3JkIGxvbmcKKyNlbHNlCisjZGVmaW5lIF9fc3RhdGZzX3dvcmQgX191MzIKKyNlbmRpZgorI2VuZGlmCisKIHN0cnVjdCBzdGF0ZnMgewotCV9fdTMyIGZfdHlwZTsKLQlfX3UzMiBmX2JzaXplOwotCV9fdTMyIGZfYmxvY2tzOwotCV9fdTMyIGZfYmZyZWU7Ci0JX191MzIgZl9iYXZhaWw7Ci0JX191MzIgZl9maWxlczsKLQlfX3UzMiBmX2ZmcmVlOworCV9fc3RhdGZzX3dvcmQgZl90eXBlOworCV9fc3RhdGZzX3dvcmQgZl9ic2l6ZTsKKwlfX3N0YXRmc193b3JkIGZfYmxvY2tzOworCV9fc3RhdGZzX3dvcmQgZl9iZnJlZTsKKwlfX3N0YXRmc193b3JkIGZfYmF2YWlsOworCV9fc3RhdGZzX3dvcmQgZl9maWxlczsKKwlfX3N0YXRmc193b3JkIGZfZmZyZWU7CiAJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlfX3UzMiBmX25hbWVsZW47Ci0JX191MzIgZl9mcnNpemU7Ci0JX191MzIgZl9zcGFyZVs1XTsKKwlfX3N0YXRmc193b3JkIGZfbmFtZWxlbjsKKwlfX3N0YXRmc193b3JkIGZfZnJzaXplOworCV9fc3RhdGZzX3dvcmQgZl9zcGFyZVs1XTsKIH07CiAKKy8qCisgKiBBUk0gbmVlZHMgdG8gYXZvaWQgdGhlIDMyLWJpdCBwYWRkaW5nIGF0IHRoZSBlbmQsIGZvciBjb25zaXN0ZW5jeQorICogYmV0d2VlbiBFQUJJIGFuZCBPQUJJIAorICovCisjaWZuZGVmIEFSQ0hfUEFDS19TVEFURlM2NAorI2RlZmluZSBBUkNIX1BBQ0tfU1RBVEZTNjQKKyNlbmRpZgorCiBzdHJ1Y3Qgc3RhdGZzNjQgewotCV9fdTMyIGZfdHlwZTsKLQlfX3UzMiBmX2JzaXplOworCV9fc3RhdGZzX3dvcmQgZl90eXBlOworCV9fc3RhdGZzX3dvcmQgZl9ic2l6ZTsKIAlfX3U2NCBmX2Jsb2NrczsKIAlfX3U2NCBmX2JmcmVlOwogCV9fdTY0IGZfYmF2YWlsOwogCV9fdTY0IGZfZmlsZXM7CiAJX191NjQgZl9mZnJlZTsKIAlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCV9fdTMyIGZfbmFtZWxlbjsKLQlfX3UzMiBmX2Zyc2l6ZTsKLQlfX3UzMiBmX3NwYXJlWzVdOwotfTsKKwlfX3N0YXRmc193b3JkIGZfbmFtZWxlbjsKKwlfX3N0YXRmc193b3JkIGZfZnJzaXplOworCV9fc3RhdGZzX3dvcmQgZl9zcGFyZVs1XTsKK30gQVJDSF9QQUNLX1NUQVRGUzY0OworCisvKiAKKyAqIElBNjQgYW5kIHg4Nl82NCBuZWVkIHRvIGF2b2lkIHRoZSAzMi1iaXQgcGFkZGluZyBhdCB0aGUgZW5kLAorICogdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBpMzg2IEFCSQorICovCisjaWZuZGVmIEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQKKyNkZWZpbmUgQVJDSF9QQUNLX0NPTVBBVF9TVEFURlM2NAorI2VuZGlmCiAKIHN0cnVjdCBjb21wYXRfc3RhdGZzNjQgewogCV9fdTMyIGZfdHlwZTsKQEAgLTQ2LDYgKzc3LDYgQEAKIAlfX3UzMiBmX25hbWVsZW47CiAJX191MzIgZl9mcnNpemU7CiAJX191MzIgZl9zcGFyZVs1XTsKLX07Cit9IEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQ7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IGNiNzUyYmEuLjc0YzVmYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTI2OCw3ICsyNjgsMTUgQEAKIAlDUFVfRElTQ0FSRChpbml0LmRhdGEpCQkJCQkJXAogCUNQVV9ESVNDQVJEKGluaXQucm9kYXRhKQkJCQkJXAogCU1FTV9ESVNDQVJEKGluaXQuZGF0YSkJCQkJCQlcCi0JTUVNX0RJU0NBUkQoaW5pdC5yb2RhdGEpCisJTUVNX0RJU0NBUkQoaW5pdC5yb2RhdGEpCQkJCQlcCisJLyogaW1wbGVtZW50IGR5bmFtaWMgcHJpbnRrIGRlYnVnICovCQkJCVwKKwlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fdmVyYm9zZV9zdHJpbmdzKSA9IC47ICAgICAgICAgICAgICAgICAgXAorCSooX192ZXJib3NlX3N0cmluZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fdmVyYm9zZV9zdHJpbmdzKSA9IC47ICAgICAgICAgICAgICAgICAgIFwKKwkuID0gQUxJR04oOCk7CQkJCQkJCVwKKwlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fdmVyYm9zZSkgPSAuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSooX192ZXJib3NlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJVk1MSU5VWF9TWU1CT0woX19zdG9wX19fdmVyYm9zZSkgPSAuOwogCiAjZGVmaW5lIElOSVRfVEVYVAkJCQkJCQlcCiAJKiguaW5pdC50ZXh0KQkJCQkJCQlcCkBAIC0zODUsNiArMzkzLDcgQEAKIAkuID0gQUxJR04oYWxpZ24pOwkJCQkJCVwKIAlWTUxJTlVYX1NZTUJPTChfX3Blcl9jcHVfc3RhcnQpID0gLjsJCQkJXAogCS5kYXRhLnBlcmNwdSAgOiBBVChBRERSKC5kYXRhLnBlcmNwdSkgLSBMT0FEX09GRlNFVCkgewkJXAorCQkqKC5kYXRhLnBlcmNwdS5wYWdlX2FsaWduZWQpCQkJCVwKIAkJKiguZGF0YS5wZXJjcHUpCQkJCQkJXAogCQkqKC5kYXRhLnBlcmNwdS5zaGFyZWRfYWxpZ25lZCkJCQkJXAogCX0JCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RpbWVyLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjgwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90aW1lci5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX19IODMwMF9USU1FUl9ICisjZGVmaW5lIF9fSDgzMDBfVElNRVJfSAorCit2b2lkIGg4MzAwX3RpbWVyX3RpY2sodm9pZCk7Cit2b2lkIGg4MzAwX3RpbWVyX3NldHVwKHZvaWQpOwordm9pZCBoODMwMF9nZXR0b2QodW5zaWduZWQgaW50ICp5ZWFyLCB1bnNpZ25lZCBpbnQgKm1vbiwgdW5zaWduZWQgaW50ICpkYXksCisJCSAgIHVuc2lnbmVkIGludCAqaG91ciwgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqc2VjKTsKKworI2RlZmluZSBUSU1FUl9GUkVRIChDT05GSUdfQ1BVX0NMT0NLKjEwMDAwKSAvKiBUaW1lciBpbnB1dCBmcmVxLiAqLworCisjZGVmaW5lIGNhbGNfcGFyYW0oY250LCBkaXYsIHJhdGUsIGxpbWl0KQkJCVwKK2RvIHsJCQkJCQkJCVwKKwljbnQgPSBUSU1FUl9GUkVRIC8gSFo7CQkJCQlcCisJZm9yIChkaXYgPSAwOyBkaXYgPCBBUlJBWV9TSVpFKGRpdmlkZV9yYXRlKTsgZGl2KyspIHsJXAorCQlpZiAocmF0ZVtkaXZdID09IDApCQkJCVwKKwkJCWNvbnRpbnVlOwkJCQlcCisJCWlmICgoY250IC8gcmF0ZVtkaXZdKSA+IGxpbWl0KQkJCVwKKwkJCWJyZWFrOwkJCQkJXAorCX0JCQkJCQkJXAorCWlmIChkaXYgPT0gQVJSQVlfU0laRShkaXZpZGVfcmF0ZSkpCQkJXAorCQlwYW5pYygiVGltZXIgY291bnRlciBvdmVyZmxvdyIpOwkJXAorCWNudCAvPSBkaXZpZGVfcmF0ZVtkaXZdOwkJCQlcCit9IHdoaWxlKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9hLm91dC5oIGIvaW5jbHVkZS9hc20tbTMyci9hLm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjE1MGY1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvYS5vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgX0FTTV9NMzJSX0FfT1VUX0gKLSNkZWZpbmUgX0FTTV9NMzJSX0FfT1VUX0gKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0gIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYgLyogX0FTTV9NMzJSX0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZWxmLmggYi9pbmNsdWRlL2FzbS1tMzJyL2VsZi5oCmluZGV4IDY3YmNkNzcuLjBjYzM0YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9lbGYuaApAQCAtMTI5LDYgKzEyOSw2IEBACiAgICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4gICovCiAjZGVmaW5lIEVMRl9QTEFURk9STQkoTlVMTCkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAKICNlbmRpZiAgLyogX0FTTV9NMzJSX19FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWh3LmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaHcuaAppbmRleCBlY2YwMDdkLi4xNDEyYjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaHcuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaHcuaApAQCAtMzksNyArMzksNiBAQAogI2RlZmluZSBNQUNIX0lTX1RUCSgoYXRhcmlfbWNoX2Nvb2tpZSA+PiAxNikgPT0gQVRBUklfTUNIX1RUKQogI2RlZmluZSBNQUNIX0lTX0ZBTENPTgkoKGF0YXJpX21jaF9jb29raWUgPj4gMTYpID09IEFUQVJJX01DSF9GQUxDT04pCiAjZGVmaW5lIE1BQ0hfSVNfTUVEVVNBCShhdGFyaV9tY2hfdHlwZSA9PSBBVEFSSV9NQUNIX01FRFVTQSkKLSNkZWZpbmUgTUFDSF9JU19IQURFUwkoYXRhcmlfbWNoX3R5cGUgPT0gQVRBUklfTUFDSF9IQURFUykKICNkZWZpbmUgTUFDSF9JU19BQjQwCShhdGFyaV9tY2hfdHlwZSA9PSBBVEFSSV9NQUNIX0FCNDApCiAKIC8qIHZhbHVlcyBmb3IgYXRhcmlfc3dpdGNoZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaAppbmRleCA5MWY3OTQ0Li4yNmY1MDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oCkBAIC03NCw2ICs3NCwxNCBAQAogZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsCiAJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOwogCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCS8qIGp1c3Qgc3luYyBldmVyeXRoaW5nIGZvciBub3cgKi8KKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGRtYV9oYW5kbGUsIG9mZnNldCArIHNpemUsIGRpcmVjdGlvbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLAogCQkJCQkgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewpAQCAtODQsNiArOTIsMTQgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwkvKiBqdXN0IHN5bmMgZXZlcnl0aGluZyBmb3Igbm93ICovCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQgKyBzaXplLCBkaXJlY3Rpb24pOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9kbWEuaCBiL2luY2x1ZGUvYXNtLW02OGsvZG1hLmgKaW5kZXggZDBjOWU2MS4uNDI0MGZiYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9kbWEuaApAQCAtMTEsMTAgKzExLDYgQEAKIGV4dGVybiBpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGRtYW5yLCBjb25zdCBjaGFyICogZGV2aWNlX2lkKTsJLyogcmVzZXJ2ZSBhIERNQSBjaGFubmVsICovCiBleHRlcm4gdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpOwkvKiByZWxlYXNlIGl0IGFnYWluICovCiAKLSNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gaW50IGlzYV9kbWFfYnJpZGdlX2J1Z2d5OwotI2Vsc2UKICNkZWZpbmUgaXNhX2RtYV9icmlkZ2VfYnVnZ3kgICAgKDApCi0jZW5kaWYKIAogI2VuZGlmIC8qIF9NNjhLX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2VsZi5oIGIvaW5jbHVkZS9hc20tbTY4ay9lbGYuaAppbmRleCAxNGVhNDIxNS4uMGIwZjQ5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2VsZi5oCkBAIC0xMTQsNiArMTE0LDYgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQogCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZW50cnkuaCBiL2luY2x1ZGUvYXNtLW02OGsvZW50cnkuaAppbmRleCBmOGY2YjE4Li41MjAyZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2VudHJ5LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9lbnRyeS5oCkBAIC0zMSw3ICszMSw3IEBACiAgKi8KIAogLyogdGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHdoZW4gZW5hYmxpbmcgaW50ZXJydXB0cyAqLwotI2lmIGRlZmluZWQoTUFDSF9BVEFSSV9PTkxZKSAmJiAhZGVmaW5lZChDT05GSUdfSEFERVMpCisjaWYgZGVmaW5lZChNQUNIX0FUQVJJX09OTFkpCiAJLyogYmxvY2sgb3V0IEhTWU5DIG9uIHRoZSBhdGFyaSAqLwogI2RlZmluZSBBTExPV0lOVAkofjB4NDAwKQogI2RlZmluZQlNQVhfTk9JTlRfSVBMCTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvaW8uaCBiL2luY2x1ZGUvYXNtLW02OGsvaW8uaAppbmRleCA2NTcxODdmLi45ZTY3M2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9pby5oCkBAIC03LDE1ICs3LDEyIEBACiAgKiAgICAgICAgICAgIC0gYWRkZWQgc2tlbGV0b24gZm9yIEdHLUlJIGFuZCBBbWlnYSBQQ01DSUEKICAqIDIvMy8wMSBSWjogLSBtb3ZlZCBhIGZldyBtb3JlIGRlZnMgaW50byByYXdfaW8uaAogICoKLSAqIGluWC9vdXRYL3JlYWRYL3dyaXRlWCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IGRyaXZlciB1bmxlc3MgaXQgZG9lcwotICogSVNBIG9yIFBDSSBhY2Nlc3MuIE90aGVyIGRyaXZlcnMgc2hvdWxkIHVzZSBmdW5jdGlvbiBkZWZpbmVkIGluIHJhd19pby5oCisgKiBpblgvb3V0WCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IGRyaXZlciB1bmxlc3MgaXQgZG9lcworICogSVNBIGFjY2Vzcy4gT3RoZXIgZHJpdmVycyBzaG91bGQgdXNlIGZ1bmN0aW9uIGRlZmluZWQgaW4gcmF3X2lvLmgKICAqIG9yIGRlZmluZSBpdHMgb3duIG1hY3JvcyBvbiB0b3Agb2YgdGhlc2UuCiAgKgotICogICAgaW5YKCksb3V0WCgpICAgICAgICAgICAgICBhcmUgZm9yIFBDSSBhbmQgSVNBIEkvTwotICogICAgcmVhZFgoKSx3cml0ZVgoKSAgICAgICAgICBhcmUgZm9yIFBDSSBtZW1vcnkKKyAqICAgIGluWCgpLG91dFgoKSAgICAgICAgICAgICAgYXJlIGZvciBJU0EgSS9PCiAgKiAgICBpc2FfcmVhZFgoKSxpc2Ffd3JpdGVYKCkgIGFyZSBmb3IgSVNBIG1lbW9yeQotICoKLSAqIG1vdmVkIG1lbXtjcHksc2V0fV8qaW8gaW5zaWRlIENPTkZJR19QQ0kKICAqLwogCiAjaWZuZGVmIF9JT19ICkBAIC0yNTYsMTAgKzI1Myw3IEBACiAgICAgICAgKElTQV9TRVggPyByYXdfb3V0c2woaXNhX2l0bChwb3J0KSwgKHUzMiAqKShidWYpLCAobnIpKSA6ICBcCiAgICAgICAgICAgICAgICAgICByYXdfb3V0c3dfc3dhcHcoaXNhX2l0dyhwb3J0KSwgKHUxNiAqKShidWYpLCAobnIpPDwxKSkKIAotI2VuZGlmICAvKiBDT05GSUdfSVNBICovCiAKLQotI2lmIGRlZmluZWQoQ09ORklHX0lTQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDSSkKICNkZWZpbmUgaW5iICAgICBpc2FfaW5iCiAjZGVmaW5lIGluYl9wICAgaXNhX2luYl9wCiAjZGVmaW5lIG91dGIgICAgaXNhX291dGIKQEAgLTI4Miw1NSArMjc2LDkgQEAKICNkZWZpbmUgcmVhZHcgICBpc2FfcmVhZHcKICNkZWZpbmUgd3JpdGViICBpc2Ffd3JpdGViCiAjZGVmaW5lIHdyaXRldyAgaXNhX3dyaXRldwotI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNlbHNlICAvKiBDT05GSUdfSVNBICovCiAKLSNkZWZpbmUgcmVhZGwoYWRkcikgICAgICBpbl9sZTMyKGFkZHIpCi0jZGVmaW5lIHdyaXRlbCh2YWwsYWRkcikgb3V0X2xlMzIoKGFkZHIpLCh2YWwpKQotCi0vKiB0aG9zZSBjYW4gYmUgZGVmaW5lZCBmb3IgYm90aCBJU0EgYW5kIFBDSSAtIGl0IHdvbid0IHdvcmsgdGhvdWdoICovCi0jZGVmaW5lIHJlYWRiKGFkZHIpICAgICAgIGluXzgoYWRkcikKLSNkZWZpbmUgcmVhZHcoYWRkcikgICAgICAgaW5fbGUxNihhZGRyKQotI2RlZmluZSB3cml0ZWIodmFsLGFkZHIpICBvdXRfOCgoYWRkciksKHZhbCkpCi0jZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgIG91dF9sZTE2KChhZGRyKSwodmFsKSkKLQotI2RlZmluZSByZWFkYl9yZWxheGVkKGFkZHIpIHJlYWRiKGFkZHIpCi0jZGVmaW5lIHJlYWR3X3JlbGF4ZWQoYWRkcikgcmVhZHcoYWRkcikKLSNkZWZpbmUgcmVhZGxfcmVsYXhlZChhZGRyKSByZWFkbChhZGRyKQotCi0jaWZuZGVmIENPTkZJR19JU0EKLSNkZWZpbmUgaW5iKHBvcnQpICAgICAgaW5fOChwb3J0KQotI2RlZmluZSBvdXRiKHZhbCxwb3J0KSBvdXRfOCgocG9ydCksKHZhbCkpCi0jZGVmaW5lIGludyhwb3J0KSAgICAgIGluX2xlMTYocG9ydCkKLSNkZWZpbmUgb3V0dyh2YWwscG9ydCkgb3V0X2xlMTYoKHBvcnQpLCh2YWwpKQotI2RlZmluZSBpbmwocG9ydCkgICAgICBpbl9sZTMyKHBvcnQpCi0jZGVmaW5lIG91dGwodmFsLHBvcnQpIG91dF9sZTMyKChwb3J0KSwodmFsKSkKLQotI2Vsc2UKLS8qCi0gKiBrZXJuZWwgd2l0aCBib3RoIElTQSBhbmQgUENJIGNvbXBpbGVkIGluLCB0aG9zZSBoYXZlCi0gKiBjb25mbGljdGluZyBkZWZzIGZvciBpbi9vdXQuIFNpbXBseSBjb25zaWRlciBwb3J0IDwgMTAyNAotICogSVNBIGFuZCBldmVyeXRoaW5nIGVsc2UgUENJLiByZWFkLHdyaXRlIG5vdCBkZWZpbmVkCi0gKiBpbiB0aGlzIGNhc2UKLSAqLwotI2RlZmluZSBpbmIocG9ydCkgKChwb3J0KTwxMDI0ID8gaXNhX2luYihwb3J0KSA6IGluXzgocG9ydCkpCi0jZGVmaW5lIGluYl9wKHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9pbmJfcChwb3J0KSA6IGluXzgocG9ydCkpCi0jZGVmaW5lIGludyhwb3J0KSAoKHBvcnQpPDEwMjQgPyBpc2FfaW53KHBvcnQpIDogaW5fbGUxNihwb3J0KSkKLSNkZWZpbmUgaW53X3AocG9ydCkgKChwb3J0KTwxMDI0ID8gaXNhX2lud19wKHBvcnQpIDogaW5fbGUxNihwb3J0KSkKLSNkZWZpbmUgaW5sKHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9pbmwocG9ydCkgOiBpbl9sZTMyKHBvcnQpKQotI2RlZmluZSBpbmxfcChwb3J0KSAoKHBvcnQpPDEwMjQgPyBpc2FfaW5sX3AocG9ydCkgOiBpbl9sZTMyKHBvcnQpKQotCi0jZGVmaW5lIG91dGIodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRiKCh2YWwpLChwb3J0KSkgOiBvdXRfOCgocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRiX3AoKHZhbCksKHBvcnQpKSA6IG91dF84KChwb3J0KSwodmFsKSkpCi0jZGVmaW5lIG91dHcodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXR3KCh2YWwpLChwb3J0KSkgOiBvdXRfbGUxNigocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXR3X3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXR3X3AoKHZhbCksKHBvcnQpKSA6IG91dF9sZTE2KChwb3J0KSwodmFsKSkpCi0jZGVmaW5lIG91dGwodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRsKCh2YWwpLChwb3J0KSkgOiBvdXRfbGUzMigocG9ydCksKHZhbCkpKQotI2RlZmluZSBvdXRsX3AodmFsLHBvcnQpICgocG9ydCk8MTAyNCA/IGlzYV9vdXRsX3AoKHZhbCksKHBvcnQpKSA6IG91dF9sZTMyKChwb3J0KSwodmFsKSkpCi0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfSVNBKSAmJiAhZGVmaW5lZChDT05GSUdfUENJKQogLyoKICAqIFdlIG5lZWQgdG8gZGVmaW5lIGR1bW15IGZ1bmN0aW9ucyBmb3IgR0VORVJJQ19JT01BUCBzdXBwb3J0LgogICovCkBAIC0zNTcsMTEgKzMwNSwxMSBAQAogI2RlZmluZSB3cml0ZWIodmFsLGFkZHIpIG91dF84KChhZGRyKSwodmFsKSkKICNkZWZpbmUgcmVhZHcoYWRkcikgICAgICBpbl9sZTE2KGFkZHIpCiAjZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgb3V0X2xlMTYoKGFkZHIpLCh2YWwpKQotI2VuZGlmCi0jaWYgIWRlZmluZWQoQ09ORklHX1BDSSkKKworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKwogI2RlZmluZSByZWFkbChhZGRyKSAgICAgIGluX2xlMzIoYWRkcikKICNkZWZpbmUgd3JpdGVsKHZhbCxhZGRyKSBvdXRfbGUzMigoYWRkciksKHZhbCkpCi0jZW5kaWYKIAogI2RlZmluZSBtbWlvd2IoKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oIGIvaW5jbHVkZS9hc20tbTY4ay9wY2kuaAppbmRleCA2NzhjYjBiLi40YWQwYWVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcGNpLmgKQEAgLTEsNTIgKzEsNyBAQAogI2lmbmRlZiBfQVNNX002OEtfUENJX0gKICNkZWZpbmUgX0FTTV9NNjhLX1BDSV9ICiAKLS8qCi0gKiBhc20tbTY4ay9wY2lfbTY4ay5oIC0gbTY4ayBzcGVjaWZpYyBQQ0kgZGVjbGFyYXRpb25zLgotICoKLSAqIFdyaXR0ZW4gYnkgV291dCBLbGFyZW4uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotCi1zdHJ1Y3QgcGNpX29wczsKLQotLyoKLSAqIFN0cnVjdHVyZSB3aXRoIGhhcmR3YXJlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiBhbmQgZnVuY3Rpb25zIG9mIHRoZQotICogUENJIGJ1cy4KLSAqLwotCi1zdHJ1Y3QgcGNpX2J1c19pbmZvCi17Ci0JLyoKLQkgKiBSZXNvdXJjZXMgb2YgdGhlIFBDSSBidXMuCi0JICovCi0KLQlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3NwYWNlOwotCXN0cnVjdCByZXNvdXJjZSBpb19zcGFjZTsKLQotCS8qCi0JICogU3lzdGVtIGRlcGVuZGVudCBmdW5jdGlvbnMuCi0JICovCi0KLQlzdHJ1Y3QgcGNpX29wcyAqbTY4a19wY2lfb3BzOwotCi0Jdm9pZCAoKmZpeHVwKShpbnQgcGNpX21vZGlmeSk7Ci0Jdm9pZCAoKmNvbmZfZGV2aWNlKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLX07Ci0KLSNkZWZpbmUgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpCTAKLSNkZWZpbmUgcGNpYmlvc19zY2FuX2FsbF9mbnMoYSwgYikJMAotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKLXsKLQkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwotfQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS1kbWEtY29tcGF0Lmg+CiAKIC8qIFRoZSBQQ0kgYWRkcmVzcyBzcGFjZSBkb2VzIGVxdWFsIHRoZSBwaHlzaWNhbCBtZW1vcnkKICAqIGFkZHJlc3Mgc3BhY2UuICBUaGUgbmV0d29ya2luZyBhbmQgYmxvY2sgZGV2aWNlIGxheWVycyB1c2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdmlydGNvbnZlcnQuaCBiL2luY2x1ZGUvYXNtLW02OGsvdmlydGNvbnZlcnQuaAppbmRleCBkZWEzMmZiLi4yMmFiMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3ZpcnRjb252ZXJ0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay92aXJ0Y29udmVydC5oCkBAIC00MCwxNSArNDAsOSBAQAogCiAvKgogICogSU8gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLAotICogZXhjZXB0IG9uIHRoZSBQQ0kgYnVzIG9mIHRoZSBIYWRlcy4KICAqLwotI2lmZGVmIENPTkZJR19IQURFUwotI2RlZmluZSB2aXJ0X3RvX2J1cyhhKSAodmlydF90b19waHlzKGEpICsgKE1BQ0hfSVNfSEFERVMgPyAweDgwMDAwMDAwIDogMCkpCi0jZGVmaW5lIGJ1c190b192aXJ0KGEpIChwaHlzX3RvX3ZpcnQoKGEpIC0gKE1BQ0hfSVNfSEFERVMgPyAweDgwMDAwMDAwIDogMCkpKQotI2Vsc2UKICNkZWZpbmUgdmlydF90b19idXMgdmlydF90b19waHlzCiAjZGVmaW5lIGJ1c190b192aXJ0IHBoeXNfdG9fdmlydAotI2VuZGlmCiAKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDgzNzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hLm91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NCAtIDE5OTksIDIwMDMgYnkgUmFsZiBCYWVjaGxlCi0gKi8KLSNpZm5kZWYgX0FTTV9BX09VVF9ICi0jZGVmaW5lIF9BU01fQV9PVVRfSAotCi0jaWZkZWYgX19LRVJORUxfXwotCi0KLSNlbmRpZgotCi1zdHJ1Y3QgZXhlYwotewotCXVuc2lnbmVkIGxvbmcgYV9pbmZvOwkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0JdW5zaWduZWQgYV90ZXh0OwkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2RhdGE7CS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGFfYnNzOwkJLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvcgotCQkJCSAgICBmaWxlLCBpbiBieXRlcyAqLwotCXVuc2lnbmVkIGFfc3ltczsJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsCi0JCQkJICAgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCi0JdW5zaWduZWQgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluCi0JCQkJICAgIGJ5dGVzICovCi0JdW5zaWduZWQgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi19OwotCi0jZGVmaW5lIE5fVFJTSVpFKGEpCSgoYSkuYV90cnNpemUpCi0jZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCi0jZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKLQotI2VuZGlmIC8qIF9BU01fQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMGYyZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAsIDAxLCAwMiwgMDMgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICovCi0jaWZuZGVmIF9BU01fQ0FDSEVGTFVTSF9ICi0jZGVmaW5lIF9BU01fQ0FDSEVGTFVTSF9ICi0KLS8qIEtlZXAgaW5jbHVkZXMgdGhlIHNhbWUgYWNyb3NzIGFyY2hlcy4gICovCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+Ci0KLS8qIENhY2hlIGZsdXNoaW5nOgotICoKLSAqICAtIGZsdXNoX2NhY2hlX2FsbCgpIGZsdXNoZXMgZW50aXJlIGNhY2hlCi0gKiAgLSBmbHVzaF9jYWNoZV9tbShtbSkgZmx1c2hlcyB0aGUgc3BlY2lmaWVkIG1tIGNvbnRleHQncyBjYWNoZSBsaW5lcwotICogIC0gZmx1c2hfY2FjaGVfZHVwIG1tKG1tKSBoYW5kbGVzIGNhY2hlIGZsdXNoaW5nIHdoZW4gZm9ya2luZwotICogIC0gZmx1c2hfY2FjaGVfcGFnZShtbSwgdm1hZGRyLCBwZm4pIGZsdXNoZXMgYSBzaW5nbGUgcGFnZQotICogIC0gZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKSBmbHVzaGVzIGEgcmFuZ2Ugb2YgcGFnZXMKLSAqICAtIGZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKSBmbHVzaCBhIHJhbmdlIG9mIGluc3RydWN0aW9ucwotICogIC0gZmx1c2hfZGNhY2hlX3BhZ2UocGcpIGZsdXNoZXMod2JhY2smaW52YWxpZGF0ZXMpIGEgcGFnZSBmb3IgZGNhY2hlCi0gKgotICogTUlQUyBzcGVjaWZpYyBmbHVzaCBvcGVyYXRpb25zOgotICoKLSAqICAtIGZsdXNoX2NhY2hlX3NpZ3RyYW1wKCkgZmx1c2ggc2lnbmFsIHRyYW1wb2xpbmUKLSAqICAtIGZsdXNoX2ljYWNoZV9hbGwoKSBmbHVzaCB0aGUgZW50aXJlIGluc3RydWN0aW9uIGNhY2hlCi0gKiAgLSBmbHVzaF9kYXRhX2NhY2hlX3BhZ2UoKSBmbHVzaGVzIGEgcGFnZSBmcm9tIHRoZSBkYXRhIGNhY2hlCi0gKi8KLWV4dGVybiB2b2lkICgqZmx1c2hfY2FjaGVfYWxsKSh2b2lkKTsKLWV4dGVybiB2b2lkICgqX19mbHVzaF9jYWNoZV9hbGwpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9tbSkoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwotI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCWRvIHsgKHZvaWQpIChtbSk7IH0gd2hpbGUgKDApCi1leHRlcm4gdm9pZCAoKmZsdXNoX2NhY2hlX3JhbmdlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCAoKmZsdXNoX2NhY2hlX3BhZ2UpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UsIHVuc2lnbmVkIGxvbmcgcGZuKTsKLWV4dGVybiB2b2lkIF9fZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcyB8fCAhY3B1X2hhc19pY19maWxsc19mX2RjKQotCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCi19Ci0KLSNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEFSQ0hfSEFTX0ZMVVNIX0FOT05fUEFHRQotZXh0ZXJuIHZvaWQgX19mbHVzaF9hbm9uX3BhZ2Uoc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfYW5vbl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZtYWRkcikKLXsKLQlpZiAoY3B1X2hhc19kY19hbGlhc2VzICYmIFBhZ2VBbm9uKHBhZ2UpKQotCQlfX2ZsdXNoX2Fub25fcGFnZShwYWdlLCB2bWFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfaWNhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0Jc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci19Ci0KLWV4dGVybiB2b2lkICgqZmx1c2hfaWNhY2hlX3JhbmdlKSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Ci0KLWV4dGVybiB2b2lkICgqX19mbHVzaF9jYWNoZV92bWFwKSh2b2lkKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2NhY2hlX3ZtYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJX19mbHVzaF9jYWNoZV92bWFwKCk7Ci19Ci0KLWV4dGVybiB2b2lkICgqX19mbHVzaF9jYWNoZV92dW5tYXApKHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGVfdnVubWFwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCi0JCV9fZmx1c2hfY2FjaGVfdnVubWFwKCk7Ci19Ci0KLWV4dGVybiB2b2lkIGNvcHlfdG9fdXNlcl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyLCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKLQl1bnNpZ25lZCBsb25nIGxlbik7Ci0KLWV4dGVybiB2b2lkIGNvcHlfZnJvbV91c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0Jc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAotCXVuc2lnbmVkIGxvbmcgbGVuKTsKLQotZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9zaWd0cmFtcCkodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkICgqZmx1c2hfaWNhY2hlX2FsbCkodm9pZCk7Ci1leHRlcm4gdm9pZCAoKmxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSkodm9pZCAqIGFkZHIpOwotZXh0ZXJuIHZvaWQgKCpmbHVzaF9kYXRhX2NhY2hlX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci0KLS8qCi0gKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYWdlIHBvaW50ZWQgdG8gYnkgYSBwdGUKLSAqIGlzIGRpcnR5IGFuZCByZXF1aXJlcyBjbGVhbmluZyBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSB1c2VyLgotICovCi0jZGVmaW5lIFBHX2RjYWNoZV9kaXJ0eQkJCVBHX2FyY2hfMQotCi0jZGVmaW5lIFBhZ2VfZGNhY2hlX2RpcnR5KHBhZ2UpCQlcCi0JdGVzdF9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmKHBhZ2UpLT5mbGFncykKLSNkZWZpbmUgU2V0UGFnZURjYWNoZURpcnR5KHBhZ2UpCVwKLQlzZXRfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJihwYWdlKS0+ZmxhZ3MpCi0jZGVmaW5lIENsZWFyUGFnZURjYWNoZURpcnR5KHBhZ2UpCVwKLQljbGVhcl9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmKHBhZ2UpLT5mbGFncykKLQotLyogUnVuIGtlcm5lbCBjb2RlIHVuY2FjaGVkLCB1c2VmdWwgZm9yIGNhY2hlIHByb2JpbmcgZnVuY3Rpb25zLiAqLwotdW5zaWduZWQgbG9uZyBydW5fdW5jYWNoZWQodm9pZCAqZnVuYyk7Ci0KLWV4dGVybiB2b2lkICprbWFwX2NvaGVyZW50KHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQga3VubWFwX2NvaGVyZW50KHZvaWQpOwotCi0jZW5kaWYgLyogX0FTTV9DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWluZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNzNkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1pbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0IFdhbGRvcmYgR01CSAotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAxLCAyMDAyLCAyMDAzIFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTS4gQW50b2luZQotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwNCAgTWFjaWVqIFcuIFJvenlja2kKLSAqLwotI2lmbmRlZiBfX0FTTV9DUFVfSU5GT19ICi0jZGVmaW5lIF9fQVNNX0NQVV9JTkZPX0gKLQotI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgotCi0vKgotICogRGVzY3JpcHRvciBmb3IgYSBjYWNoZQotICovCi1zdHJ1Y3QgY2FjaGVfZGVzYyB7Ci0JdW5zaWduZWQgaW50IHdheXNpemU7CS8qIEJ5dGVzIHBlciB3YXkgKi8KLQl1bnNpZ25lZCBzaG9ydCBzZXRzOwkvKiBOdW1iZXIgb2YgbGluZXMgcGVyIHNldCAqLwotCXVuc2lnbmVkIGNoYXIgd2F5czsJLyogTnVtYmVyIG9mIHdheXMgKi8KLQl1bnNpZ25lZCBjaGFyIGxpbmVzejsJLyogU2l6ZSBvZiBsaW5lIGluIGJ5dGVzICovCi0JdW5zaWduZWQgY2hhciB3YXliaXQ7CS8qIEJpdHMgdG8gc2VsZWN0IGluIGEgY2FjaGUgc2V0ICovCi0JdW5zaWduZWQgY2hhciBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyBjYWNoZSBwcm9wZXJ0aWVzICovCi19OwotCi0vKgotICogRmxhZyBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIE1JUFNfQ0FDSEVfTk9UX1BSRVNFTlQJMHgwMDAwMDAwMQotI2RlZmluZSBNSVBTX0NBQ0hFX1ZUQUcJCTB4MDAwMDAwMDIJLyogVmlydHVhbGx5IHRhZ2dlZCBjYWNoZSAqLwotI2RlZmluZSBNSVBTX0NBQ0hFX0FMSUFTRVMJMHgwMDAwMDAwNAkvKiBDYWNoZSBjb3VsZCBoYXZlIGFsaWFzZXMgKi8KLSNkZWZpbmUgTUlQU19DQUNIRV9JQ19GX0RDCTB4MDAwMDAwMDgJLyogSWMgY2FuIHJlZmlsbCBmcm9tIEQtY2FjaGUgKi8KLSNkZWZpbmUgTUlQU19JQ19TTk9PUFNfUkVNT1RFCTB4MDAwMDAwMTAJLyogSWMgc25vb3BzIHJlbW90ZSBzdG9yZXMgKi8KLSNkZWZpbmUgTUlQU19DQUNIRV9QSU5ERVgJMHgwMDAwMDAyMAkvKiBQaHlzaWNhbGx5IGluZGV4ZWQgY2FjaGUgKi8KLQotc3RydWN0IGNwdWluZm9fbWlwcyB7Ci0JdW5zaWduZWQgbG9uZwkJdWRlbGF5X3ZhbDsKLQl1bnNpZ25lZCBsb25nCQlhc2lkX2NhY2hlOwotCi0JLyoKLQkgKiBDYXBhYmlsaXR5IGFuZCBmZWF0dXJlIGRlc2NyaXB0b3Igc3RydWN0dXJlIGZvciBNSVBTIENQVQotCSAqLwotCXVuc2lnbmVkIGxvbmcJCW9wdGlvbnM7Ci0JdW5zaWduZWQgbG9uZwkJYXNlczsKLQl1bnNpZ25lZCBpbnQJCXByb2Nlc3Nvcl9pZDsKLQl1bnNpZ25lZCBpbnQJCWZwdV9pZDsKLQl1bnNpZ25lZCBpbnQJCWNwdXR5cGU7Ci0JaW50CQkJaXNhX2xldmVsOwotCWludAkJCXRsYnNpemU7Ci0Jc3RydWN0IGNhY2hlX2Rlc2MJaWNhY2hlOwkvKiBQcmltYXJ5IEktY2FjaGUgKi8KLQlzdHJ1Y3QgY2FjaGVfZGVzYwlkY2FjaGU7CS8qIFByaW1hcnkgRCBvciBjb21iaW5lZCBJL0QgY2FjaGUgKi8KLQlzdHJ1Y3QgY2FjaGVfZGVzYwlzY2FjaGU7CS8qIFNlY29uZGFyeSBjYWNoZSAqLwotCXN0cnVjdCBjYWNoZV9kZXNjCXRjYWNoZTsJLyogVGVydGlhcnkvc3BsaXQgc2Vjb25kYXJ5IGNhY2hlICovCi0JaW50CQkJc3JzZXRzOwkvKiBTaGFkb3cgcmVnaXN0ZXIgc2V0cyAqLwotCWludAkJCWNvcmU7CS8qIHBoeXNpY2FsIGNvcmUgbnVtYmVyICovCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfTVRfU01UQykKLQkvKgotCSAqIEluIHRoZSBNSVBTIE1UICJTTVRDIiBtb2RlbCwgZWFjaCBUQyBpcyBjb25zaWRlcmVkCi0JICogdG8gYmUgYSAiQ1BVIiBmb3IgdGhlIHB1cnBvc2VzIG9mIHNjaGVkdWxpbmcsIGJ1dAotCSAqIGV4Y2VwdGlvbiByZXNvdXJjZXMsIEFTSUQgc3BhY2VzLCBldGMsIGFyZSBjb21tb24KLQkgKiB0byBhbGwgVENzIHdpdGhpbiB0aGUgc2FtZSBWUEUuCi0JICovCi0JaW50CQkJdnBlX2lkOyAgLyogVmlydHVhbCBQcm9jZXNzb3IgbnVtYmVyICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JaW50CQkJdGNfaWQ7ICAgLyogVGhyZWFkIENvbnRleHQgbnVtYmVyICovCi0jZW5kaWYKLQl2b2lkIAkJCSpkYXRhOwkvKiBBZGRpdGlvbmFsIGRhdGEgKi8KLX0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChTTVBfQ0FDSEVfQllURVMpKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgY3B1aW5mb19taXBzIGNwdV9kYXRhW107Ci0jZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXQotI2RlZmluZSByYXdfY3VycmVudF9jcHVfZGF0YSBjcHVfZGF0YVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXQotCi1leHRlcm4gdm9pZCBjcHVfcHJvYmUodm9pZCk7Ci1leHRlcm4gdm9pZCBjcHVfcmVwb3J0KHZvaWQpOwotCi1leHRlcm4gY29uc3QgY2hhciAqX19jcHVfbmFtZVtdOwotI2RlZmluZSBjcHVfbmFtZV9zdHJpbmcoKQlfX2NwdV9uYW1lW3NtcF9wcm9jZXNzb3JfaWQoKV0KLQotI2VuZGlmIC8qIF9fQVNNX0NQVV9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmggYi9pbmNsdWRlL2FzbS1taXBzL2VsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjlmN2FjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIE11Y2ggb2YgdGhpcyBpcyB0YWtlbiBmcm9tIGJpbnV0aWxzIGFuZCBHTlUgbGliYyAuLi4KLSAqLwotI2lmbmRlZiBfQVNNX0VMRl9ICi0jZGVmaW5lIF9BU01fRUxGX0gKLQotCi0vKiBFTEYgaGVhZGVyIGVfZmxhZ3MgZGVmaW5lcy4gKi8KLS8qIE1JUFMgYXJjaGl0ZWN0dXJlIGxldmVsLiAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0hfMQkJMHgwMDAwMDAwMAkvKiAtbWlwczEgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwCS8qIC1taXBzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMJCTB4MjAwMDAwMDAJLyogLW1pcHMzIGNvZGUuICAqLwotI2RlZmluZSBFRl9NSVBTX0FSQ0hfNAkJMHgzMDAwMDAwMAkvKiAtbWlwczQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSF81CQkweDQwMDAwMDAwCS8qIC1taXBzNSBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMyCQkweDUwMDAwMDAwCS8qIE1JUFMzMiBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzY0CQkweDYwMDAwMDAwCS8qIE1JUFM2NCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19BUkNIXzMyUjIJMHg3MDAwMDAwMAkvKiBNSVBTMzIgUjIgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSF82NFIyCTB4ODAwMDAwMDAJLyogTUlQUzY0IFIyIGNvZGUuICAqLwotCi0vKiBUaGUgQUJJIG9mIGEgZmlsZS4gKi8KLSNkZWZpbmUgRUZfTUlQU19BQklfTzMyCQkweDAwMDAxMDAwCS8qIE8zMiBBQkkuICAqLwotI2RlZmluZSBFRl9NSVBTX0FCSV9PNjQJCTB4MDAwMDIwMDAJLyogTzMyIGV4dGVuZGVkIGZvciA2NCBiaXQuICAqLwotCi0jZGVmaW5lIFBUX01JUFNfUkVHSU5GTwkJMHg3MDAwMDAwMAotI2RlZmluZSBQVF9NSVBTX1JUUFJPQwkJMHg3MDAwMDAwMQotI2RlZmluZSBQVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMDIKLQotLyogRmxhZ3MgaW4gdGhlIGVfZmxhZ3MgZmllbGQgb2YgdGhlIGhlYWRlciAqLwotI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUgkweDAwMDAwMDAxCi0jZGVmaW5lIEVGX01JUFNfUElDCQkweDAwMDAwMDAyCi0jZGVmaW5lIEVGX01JUFNfQ1BJQwkJMHgwMDAwMDAwNAotI2RlZmluZSBFRl9NSVBTX0FCSTIJCTB4MDAwMDAwMjAKLSNkZWZpbmUgRUZfTUlQU19PUFRJT05TX0ZJUlNUCTB4MDAwMDAwODAKLSNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUJMHgwMDAwMDEwMAotI2RlZmluZSBFRl9NSVBTX0FCSQkJMHgwMDAwZjAwMAotI2RlZmluZSBFRl9NSVBTX0FSQ0gJCTB4ZjAwMDAwMDAKLQotI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKLSNkZWZpbmUgRFRfTUlQU19USU1FX1NUQU1QCTB4NzAwMDAwMDIKLSNkZWZpbmUgRFRfTUlQU19JQ0hFQ0tTVU0JMHg3MDAwMDAwMwotI2RlZmluZSBEVF9NSVBTX0lWRVJTSU9OCTB4NzAwMDAwMDQKLSNkZWZpbmUgRFRfTUlQU19GTEFHUwkJMHg3MDAwMDAwNQotCSNkZWZpbmUgUkhGX05PTkUJMHgwMDAwMDAwMAotCSNkZWZpbmUgUkhGX0hBUkRXQVkJMHgwMDAwMDAwMQotCSNkZWZpbmUgUkhGX05PVFBPVAkweDAwMDAwMDAyCi0JI2RlZmluZSBSSEZfU0dJX09OTFkJMHgwMDAwMDAxMAotI2RlZmluZSBEVF9NSVBTX0JBU0VfQUREUkVTUwkweDcwMDAwMDA2Ci0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwOAotI2RlZmluZSBEVF9NSVBTX0xJQkxJU1QJCTB4NzAwMDAwMDkKLSNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTwkweDcwMDAwMDBhCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTwkweDcwMDAwMDBiCi0jZGVmaW5lIERUX01JUFNfTElCTElTVE5PCTB4NzAwMDAwMTAKLSNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTwkweDcwMDAwMDExCi0jZGVmaW5lIERUX01JUFNfVU5SRUZFWFROTwkweDcwMDAwMDEyCi0jZGVmaW5lIERUX01JUFNfR09UU1lNCQkweDcwMDAwMDEzCi0jZGVmaW5lIERUX01JUFNfSElQQUdFTk8JMHg3MDAwMDAxNAotI2RlZmluZSBEVF9NSVBTX1JMRF9NQVAJCTB4NzAwMDAwMTYKLQotI2RlZmluZSBSX01JUFNfTk9ORQkJMAotI2RlZmluZSBSX01JUFNfMTYJCTEKLSNkZWZpbmUgUl9NSVBTXzMyCQkyCi0jZGVmaW5lIFJfTUlQU19SRUwzMgkJMwotI2RlZmluZSBSX01JUFNfMjYJCTQKLSNkZWZpbmUgUl9NSVBTX0hJMTYJCTUKLSNkZWZpbmUgUl9NSVBTX0xPMTYJCTYKLSNkZWZpbmUgUl9NSVBTX0dQUkVMMTYJCTcKLSNkZWZpbmUgUl9NSVBTX0xJVEVSQUwJCTgKLSNkZWZpbmUgUl9NSVBTX0dPVDE2CQk5Ci0jZGVmaW5lIFJfTUlQU19QQzE2CQkxMAotI2RlZmluZSBSX01JUFNfQ0FMTDE2CQkxMQotI2RlZmluZSBSX01JUFNfR1BSRUwzMgkJMTIKLS8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBkZWZpbmVkIG9uIElyaXgsIGFsdGhvdWdoIHRoZXkgYXJlIG5vdAotICAgaW4gdGhlIE1JUFMgRUxGIEFCSS4gICovCi0jZGVmaW5lIFJfTUlQU19VTlVTRUQxCQkxMwotI2RlZmluZSBSX01JUFNfVU5VU0VEMgkJMTQKLSNkZWZpbmUgUl9NSVBTX1VOVVNFRDMJCTE1Ci0jZGVmaW5lIFJfTUlQU19TSElGVDUJCTE2Ci0jZGVmaW5lIFJfTUlQU19TSElGVDYJCTE3Ci0jZGVmaW5lIFJfTUlQU182NAkJMTgKLSNkZWZpbmUgUl9NSVBTX0dPVF9ESVNQCQkxOQotI2RlZmluZSBSX01JUFNfR09UX1BBR0UJCTIwCi0jZGVmaW5lIFJfTUlQU19HT1RfT0ZTVAkJMjEKLS8qCi0gKiBUaGUgZm9sbG93aW5nIHR3byByZWxvY2F0aW9uIHR5cGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIE1JUFMgQUJJCi0gKiBjb25mb3JtYW5jZSBndWlkZSB2ZXJzaW9uIDEuMiBidXQgbm90IHlldCBpbiB0aGUgcHNBQkkuCi0gKi8KLSNkZWZpbmUgUl9NSVBTX0dPVEhJMTYJCTIyCi0jZGVmaW5lIFJfTUlQU19HT1RMTzE2CQkyMwotI2RlZmluZSBSX01JUFNfU1VCCQkyNAotI2RlZmluZSBSX01JUFNfSU5TRVJUX0EJCTI1Ci0jZGVmaW5lIFJfTUlQU19JTlNFUlRfQgkJMjYKLSNkZWZpbmUgUl9NSVBTX0RFTEVURQkJMjcKLSNkZWZpbmUgUl9NSVBTX0hJR0hFUgkJMjgKLSNkZWZpbmUgUl9NSVBTX0hJR0hFU1QJCTI5Ci0vKgotICogVGhlIGZvbGxvd2luZyB0d28gcmVsb2NhdGlvbiB0eXBlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBNSVBTIEFCSQotICogY29uZm9ybWFuY2UgZ3VpZGUgdmVyc2lvbiAxLjIgYnV0IG5vdCB5ZXQgaW4gdGhlIHBzQUJJLgotICovCi0jZGVmaW5lIFJfTUlQU19DQUxMSEkxNgkJMzAKLSNkZWZpbmUgUl9NSVBTX0NBTExMTzE2CQkzMQotLyoKLSAqIFRoaXMgcmFuZ2UgaXMgcmVzZXJ2ZWQgZm9yIHZlbmRvciBzcGVjaWZpYyByZWxvY2F0aW9ucy4KLSAqLwotI2RlZmluZSBSX01JUFNfTE9WRU5ET1IJCTEwMAotI2RlZmluZSBSX01JUFNfSElWRU5ET1IJCTEyNwotCi0jZGVmaW5lIFNITl9NSVBTX0FDQ09NT04JMHhmZjAwCQkvKiBBbGxvY2F0ZWQgY29tbW9uIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0hOX01JUFNfVEVYVAkJMHhmZjAxCQkvKiBBbGxvY2F0ZWQgdGVzdCBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfREFUQQkJMHhmZjAyCQkvKiBBbGxvY2F0ZWQgZGF0YSBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTgkweGZmMDMJCS8qIFNtYWxsIGNvbW1vbiBzeW1ib2xzICovCi0jZGVmaW5lIFNITl9NSVBTX1NVTkRFRklORUQJMHhmZjA0CQkvKiBTbWFsbCB1bmRlZmluZWQgc3ltYm9scyAqLwotCi0jZGVmaW5lIFNIVF9NSVBTX0xJU1QJCTB4NzAwMDAwMDAKLSNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgotI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMwotI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAotI2RlZmluZSBTSFRfTUlQU19ERUJVRwkJMHg3MDAwMDAwNQotI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDYKLSNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRQkweDcwMDAwMDA3Ci0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0JMHg3MDAwMDAwOAotI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5Ci0jZGVmaW5lIFNIVF9NSVBTX0lGQUNFCQkweDcwMDAwMDBiCi0jZGVmaW5lIFNIVF9NSVBTX0NPTlRFTlQJMHg3MDAwMDAwYwotI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQKLSNkZWZpbmUgU0hUX01JUFNfU0hEUgkJMHg3MDAwMDAxMAotI2RlZmluZSBTSFRfTUlQU19GREVTQwkJMHg3MDAwMDAxMQotI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKLSNkZWZpbmUgU0hUX01JUFNfREVOU0UJCTB4NzAwMDAwMTMKLSNkZWZpbmUgU0hUX01JUFNfUERFU0MJCTB4NzAwMDAwMTQKLSNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1Ci0jZGVmaW5lIFNIVF9NSVBTX0FVWFNZTQkJMHg3MDAwMDAxNgotI2RlZmluZSBTSFRfTUlQU19PUFRTWU0JCTB4NzAwMDAwMTcKLSNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4Ci0jZGVmaW5lIFNIVF9NSVBTX0xJTkUJCTB4NzAwMDAwMTkKLSNkZWZpbmUgU0hUX01JUFNfUkZERVNDCQkweDcwMDAwMDFhCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKLSNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUCTB4NzAwMDAwMWMKLSNkZWZpbmUgU0hUX01JUFNfREVMVEFDTEFTUwkweDcwMDAwMDFkCi0jZGVmaW5lIFNIVF9NSVBTX0RXQVJGCQkweDcwMDAwMDFlCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBREVDTAkweDcwMDAwMDFmCi0jZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyMAotI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEKLSNkZWZpbmUgU0hUX01JUFNfVFJBTlNMQVRFCTB4NzAwMDAwMjIKLSNkZWZpbmUgU0hUX01JUFNfUElYSUUJCTB4NzAwMDAwMjMKLSNkZWZpbmUgU0hUX01JUFNfWExBVEUJCTB4NzAwMDAwMjQKLSNkZWZpbmUgU0hUX01JUFNfWExBVEVfREVCVUcJMHg3MDAwMDAyNQotI2RlZmluZSBTSFRfTUlQU19XSElSTAkJMHg3MDAwMDAyNgotI2RlZmluZSBTSFRfTUlQU19FSF9SRUdJT04JMHg3MDAwMDAyNwotI2RlZmluZSBTSFRfTUlQU19YTEFURV9PTEQJMHg3MDAwMDAyOAotI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OCTB4NzAwMDAwMjkKLQotI2RlZmluZSBTSEZfTUlQU19HUFJFTAkJMHgxMDAwMDAwMAotI2RlZmluZSBTSEZfTUlQU19NRVJHRQkJMHgyMDAwMDAwMAotI2RlZmluZSBTSEZfTUlQU19BRERSCQkweDQwMDAwMDAwCi0jZGVmaW5lIFNIRl9NSVBTX1NUUklORwkJMHg4MDAwMDAwMAotI2RlZmluZSBTSEZfTUlQU19OT1NUUklQCTB4MDgwMDAwMDAKLSNkZWZpbmUgU0hGX01JUFNfTE9DQUwJCTB4MDQwMDAwMDAKLSNkZWZpbmUgU0hGX01JUFNfTkFNRVMJCTB4MDIwMDAwMDAKLSNkZWZpbmUgU0hGX01JUFNfTk9EVVBFUwkweDAxMDAwMDAwCi0KLSNpZm5kZWYgRUxGX0FSQ0gKLS8qIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBFTEZfTkdSRUcJNDUKLSNkZWZpbmUgRUxGX05GUFJFRwkzMwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKLXR5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107Ci0KLXR5cGVkZWYgZG91YmxlIGVsZl9mcHJlZ190OwotdHlwZWRlZiBlbGZfZnByZWdfdCBlbGZfZnByZWdzZXRfdFtFTEZfTkZQUkVHXTsKLQotI2lmZGVmIENPTkZJR18zMkJJVAotCi0vKgotICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KLSAqLwotI2RlZmluZSBlbGZfY2hlY2tfYXJjaChoZHIpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fcmVzID0gMTsJCQkJCQkJXAotCXN0cnVjdCBlbGZoZHIgKl9faCA9IChoZHIpOwkJCQkJXAotCQkJCQkJCQkJXAotCWlmIChfX2gtPmVfbWFjaGluZSAhPSBFTV9NSVBTKQkJCQkJXAotCQlfX3JlcyA9IDA7CQkJCQkJXAotCWlmIChfX2gtPmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTMzIpCQkJXAotCQlfX3JlcyA9IDA7CQkJCQkJXAotCWlmICgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkyKSAhPSAwKQkJCQlcCi0JCV9fcmVzID0gMDsJCQkJCQlcCi0JaWYgKCgoX19oLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpICE9IDApICYmCQkJXAotCSAgICAoKF9faC0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSAhPSBFRl9NSVBTX0FCSV9PMzIpKQkJXAotCQlfX3JlcyA9IDA7CQkJCQkJXAotCQkJCQkJCQkJXAotCV9fcmVzOwkJCQkJCQkJXAotfSkKLQotLyoKLSAqIFRoZXNlIGFyZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIGluIHRoZSBjb3JlIGR1bXBzLgotICovCi0jZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzMyCi0KLSNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KLQotI2lmZGVmIENPTkZJR182NEJJVAotLyoKLSAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCi0gKi8KLSNkZWZpbmUgZWxmX2NoZWNrX2FyY2goaGRyKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX3JlcyA9IDE7CQkJCQkJCVwKLQlzdHJ1Y3QgZWxmaGRyICpfX2ggPSAoaGRyKTsJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoX19oLT5lX21hY2hpbmUgIT0gRU1fTUlQUykJCQkJCVwKLQkJX19yZXMgPSAwOwkJCQkJCVwKLQlpZiAoX19oLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzY0KSAJCQlcCi0JCV9fcmVzID0gMDsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19yZXM7CQkJCQkJCQlcCi19KQotCi0vKgotICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCi0gKi8KLSNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTNjQKLQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwotCi0vKgotICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCi0gKi8KLSNpZmRlZiBfX01JUFNFQl9fCi0jZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCi0jZWxpZiBfX01JUFNFTF9fCi0jZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTFNCCi0jZW5kaWYKLSNkZWZpbmUgRUxGX0FSQ0gJRU1fTUlQUwotCi0jZW5kaWYgLyogIWRlZmluZWQoRUxGX0FSQ0gpICovCi0KLXN0cnVjdCBtaXBzX2FiaTsKLQotZXh0ZXJuIHN0cnVjdCBtaXBzX2FiaSBtaXBzX2FiaTsKLWV4dGVybiBzdHJ1Y3QgbWlwc19hYmkgbWlwc19hYmlfMzI7Ci1leHRlcm4gc3RydWN0IG1pcHNfYWJpIG1pcHNfYWJpX24zMjsKLQotI2lmZGVmIENPTkZJR18zMkJJVAotCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChpYmNzMikJCQkJCQkJXAotCQlzZXRfcGVyc29uYWxpdHkoUEVSX1NWUjQpOwkJCQlcCi0Jc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQkJCQlcCi0JCQkJCQkJCQlcCi0JY3VycmVudC0+dGhyZWFkLmFiaSA9ICZtaXBzX2FiaTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwotCi0jaWZkZWYgQ09ORklHXzY0QklUCi0KLSNpZmRlZiBDT05GSUdfTUlQUzMyX04zMgotI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyX04zMigpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzZXRfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpOwkJCVwKLQkJY3VycmVudC0+dGhyZWFkLmFiaSA9ICZtaXBzX2FiaV9uMzI7CQkJXAotCX0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyX04zMigpCQkJCQlcCi0JZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUlQUzMyX08zMgotI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyX08zMigpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzZXRfdGhyZWFkX2ZsYWcoVElGXzMyQklUX1JFR1MpOwkJCVwKLQkJc2V0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKTsJCQlcCi0JCWN1cnJlbnQtPnRocmVhZC5hYmkgPSAmbWlwc19hYmlfMzI7CQkJXAotCX0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyX08zMigpCQkJCQlcCi0JZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUlQUzMyX0NPTVBBVAotI2RlZmluZSBfX1NFVF9QRVJTT05BTElUWTMyKGV4KQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKCgoKGV4KS5lX2ZsYWdzICYgRUZfTUlQU19BQkkyKSAhPSAwKSAmJgkJCVwKLQkgICAgICgoZXgpLmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gMCkJCQkJXAotCQlfX1NFVF9QRVJTT05BTElUWTMyX04zMigpOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX1NFVF9QRVJTT05BTElUWTMyX08zMigpOwkJCQlcCi19IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgX19TRVRfUEVSU09OQUxJVFkzMihleCkJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JY2xlYXJfdGhyZWFkX2ZsYWcoVElGXzMyQklUX1JFR1MpOwkJCQlcCi0JY2xlYXJfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpOwkJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKChleCkuZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1MzMikJCQlcCi0JCV9fU0VUX1BFUlNPTkFMSVRZMzIoZXgpOwkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQljdXJyZW50LT50aHJlYWQuYWJpID0gJm1pcHNfYWJpOwkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoaWJjczIpCQkJCQkJCVwKLQkJc2V0X3BlcnNvbmFsaXR5KFBFUl9TVlI0KTsJCQkJXAotCWVsc2UgaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICE9IFBFUl9MSU5VWDMyKQkJCVwKLQkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQotc3RydWN0IHRhc2tfc3RydWN0OwotCi1leHRlcm4gdm9pZCBlbGZfZHVtcF9yZWdzKGVsZl9ncmVnX3QgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIGludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2dyZWdzZXRfdCAqKTsKLWV4dGVybiBpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZWxmX2ZwcmVnc2V0X3QgKik7Ci0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKGVsZl9yZWdzLCByZWdzKQkJCVwKLQllbGZfZHVtcF9yZWdzKChlbGZfZ3JlZ190ICopJihlbGZfcmVncyksIHJlZ3MpOwotI2RlZmluZSBFTEZfQ09SRV9DT1BZX1RBU0tfUkVHUyh0c2ssIGVsZl9yZWdzKSBkdW1wX3Rhc2tfcmVncyh0c2ssIGVsZl9yZWdzKQotI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0c2ssIGVsZl9mcHJlZ3MpCQkJXAotCWR1bXBfdGFza19mcHUodHNrLCBlbGZfZnByZWdzKQotCi0jZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCi0jZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCVBBR0VfU0laRQotCi0vKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0Ci0gICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBjcHUgc3VwcG9ydHMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlLAotICAgYnV0IGl0J3Mgbm90IGVhc3ksIGFuZCB3ZSd2ZSBhbHJlYWR5IGRvbmUgaXQgaGVyZS4gICovCi0KLSNkZWZpbmUgRUxGX0hXQ0FQICAgICAgICgwKQotCi0vKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KLSAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCi0gICBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KLQotICAgRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgb25seSBvcHRpbWl6YXRpb25zIGZvciB0aGUgSW50ZWwgZ2VuZXJhdGlvbnMsCi0gICBidXQgdGhhdCBjb3VsZCBjaGFuZ2UuLi4gKi8KLQotI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQotCi0vKgotICogU2VlIGNvbW1lbnRzIGluIGFzbS1hbHBoYS9lbGYuaCwgdGhpcyBpcyB0aGUgc2FtZSB0aGluZwotICogb24gdGhlIE1JUFMuCi0gKi8KLSNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKQlkbyB7IFwKLQlfci0+cmVnc1sxXSA9IF9yLT5yZWdzWzJdID0gX3ItPnJlZ3NbM10gPSBfci0+cmVnc1s0XSA9IDA7CVwKLQlfci0+cmVnc1s1XSA9IF9yLT5yZWdzWzZdID0gX3ItPnJlZ3NbN10gPSBfci0+cmVnc1s4XSA9IDA7CVwKLQlfci0+cmVnc1s5XSA9IF9yLT5yZWdzWzEwXSA9IF9yLT5yZWdzWzExXSA9IF9yLT5yZWdzWzEyXSA9IDA7CVwKLQlfci0+cmVnc1sxM10gPSBfci0+cmVnc1sxNF0gPSBfci0+cmVnc1sxNV0gPSBfci0+cmVnc1sxNl0gPSAwOwlcCi0JX3ItPnJlZ3NbMTddID0gX3ItPnJlZ3NbMThdID0gX3ItPnJlZ3NbMTldID0gX3ItPnJlZ3NbMjBdID0gMDsJXAotCV9yLT5yZWdzWzIxXSA9IF9yLT5yZWdzWzIyXSA9IF9yLT5yZWdzWzIzXSA9IF9yLT5yZWdzWzI0XSA9IDA7CVwKLQlfci0+cmVnc1syNV0gPSBfci0+cmVnc1syNl0gPSBfci0+cmVnc1syN10gPSBfci0+cmVnc1syOF0gPSAwOwlcCi0JX3ItPnJlZ3NbMzBdID0gX3ItPnJlZ3NbMzFdID0gMDsJCQkJXAotfSB3aGlsZSAoMCkKLQotLyogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKLSAgIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgotICAgdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KLSAgIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4gICovCi0KLSNpZm5kZWYgRUxGX0VUX0RZTl9CQVNFCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIChUQVNLX1NJWkUgLyAzICogMikKLSNlbmRpZgotCi0jZW5kaWYgLyogX0FTTV9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pcnFmbGFncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9pcnFmbGFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODFlODg2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDMgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgUGF1bCBNLiBBbnRvaW5lCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcwotICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuCi0gKi8KLSNpZm5kZWYgX0FTTV9JUlFGTEFHU19ICi0jZGVmaW5lIF9BU01fSVJRRkxBR1NfSAotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vaGF6YXJkcy5oPgotCi1fX2FzbV9fKAotCSIJLm1hY3JvCXJhd19sb2NhbF9pcnFfZW5hYmxlCQkJCVxuIgotCSIJLnNldAlwdXNoCQkJCQkJXG4iCi0JIgkuc2V0CXJlb3JkZXIJCQkJCQlcbiIKLQkiCS5zZXQJbm9hdAkJCQkJCVxuIgotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkiCW1mYzAJJDEsICQyLCAxCSMgU01UQyAtIGNsZWFyIFRDU3RhdHVzLklYTVQJXG4iCi0JIglvcmkJJDEsIDB4NDAwCQkJCQlcbiIKLQkiCXhvcmkJJDEsIDB4NDAwCQkJCQlcbiIKLQkiCW10YzAJJDEsICQyLCAxCQkJCQlcbiIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCi0JIgllaQkJCQkJCQlcbiIKLSNlbHNlCi0JIgltZmMwCSQxLCQxMgkJCQkJCVxuIgotCSIJb3JpCSQxLDB4MWYJCQkJCQlcbiIKLQkiCXhvcmkJJDEsMHgxZQkJCQkJCVxuIgotCSIJbXRjMAkkMSwkMTIJCQkJCQlcbiIKLSNlbmRpZgotCSIJaXJxX2VuYWJsZV9oYXphcmQJCQkJCVxuIgotCSIJLnNldAlwb3AJCQkJCQlcbiIKLQkiCS5lbmRtIik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkicmF3X2xvY2FsX2lycV9lbmFibGUiCi0JCTogLyogbm8gb3V0cHV0cyAqLwotCQk6IC8qIG5vIGlucHV0cyAqLwotCQk6ICJtZW1vcnkiKTsKLX0KLQotLyoKLSAqIEZvciBjbGkoKSB3ZSBoYXZlIHRvIGluc2VydCBub3BzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgdmFsdWUKLSAqIGhhcyBhY3R1YWxseSBhcnJpdmVkIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcwotICogbWFjcm8uCi0gKiBSNDAwMC9SNDQwMCBuZWVkIHRocmVlIG5vcHMsIHRoZSBSNDYwMCB0d28gbm9wcyBhbmQgdGhlIFIxMDAwMCBuZWVkcwotICogbm8gbm9wcyBhdCBhbGwuCi0gKi8KLS8qCi0gKiBGb3IgVFg0OSwgb3BlcmF0aW5nIG9ubHkgSUUgYml0IGlzIG5vdCBlbm91Z2guCi0gKgotICogSWYgbWZjMCAkMTIgZm9sbG93cyBzdG9yZSBhbmQgdGhlIG1mYzAgaXMgbGFzdCBpbnN0cnVjdGlvbiBvZiBhCi0gKiBwYWdlIGFuZCBmZXRjaGluZyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBjYXVzZXMgVExCIG1pc3MsIHRoZSByZXN1bHQKLSAqIG9mIHRoZSBtZmMwIG1pZ2h0IHdyb25nbHkgY29udGFpbiBFWEwgYml0LgotICoKLSAqIEVSVC1UWDQ5SDItMDI3LCBFUlQtVFg0OUgzLTAxMiwgRVJULVRYNDlITDMtMDA2LCBFUlQtVFg0OUg0LTAwOAotICoKLSAqIFdvcmthcm91bmQ6IG1hc2sgRVhMIGJpdCBvZiB0aGUgcmVzdWx0IG9yIHBsYWNlIGEgbm9wIGJlZm9yZSBtZmMwLgotICovCi1fX2FzbV9fKAotCSIJLm1hY3JvCXJhd19sb2NhbF9pcnFfZGlzYWJsZVxuIgotCSIJLnNldAlwdXNoCQkJCQkJXG4iCi0JIgkuc2V0CW5vYXQJCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JIgltZmMwCSQxLCAkMiwgMQkJCQkJXG4iCi0JIglvcmkJJDEsIDB4NDAwCQkJCQlcbiIKLQkiCS5zZXQJbm9yZW9yZGVyCQkJCQlcbiIKLQkiCW10YzAJJDEsICQyLCAxCQkJCQlcbiIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCi0JIglkaQkJCQkJCQlcbiIKLSNlbHNlCi0JIgltZmMwCSQxLCQxMgkJCQkJCVxuIgotCSIJb3JpCSQxLDB4MWYJCQkJCQlcbiIKLQkiCXhvcmkJJDEsMHgxZgkJCQkJCVxuIgotCSIJLnNldAlub3Jlb3JkZXIJCQkJCVxuIgotCSIJbXRjMAkkMSwkMTIJCQkJCQlcbiIKLSNlbmRpZgotCSIJaXJxX2Rpc2FibGVfaGF6YXJkCQkJCQlcbiIKLQkiCS5zZXQJcG9wCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCQlcbiIpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJyYXdfbG9jYWxfaXJxX2Rpc2FibGUiCi0JCTogLyogbm8gb3V0cHV0cyAqLwotCQk6IC8qIG5vIGlucHV0cyAqLwotCQk6ICJtZW1vcnkiKTsKLX0KLQotX19hc21fXygKLQkiCS5tYWNybwlyYXdfbG9jYWxfc2F2ZV9mbGFncyBmbGFncwkJCVxuIgotCSIJLnNldAlwdXNoCQkJCQkJXG4iCi0JIgkuc2V0CXJlb3JkZXIJCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JIgltZmMwCVxcZmxhZ3MsICQyLCAxCQkJCQlcbiIKLSNlbHNlCi0JIgltZmMwCVxcZmxhZ3MsICQxMgkJCQkJXG4iCi0jZW5kaWYKLQkiCS5zZXQJcG9wCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCQlcbiIpOwotCi0jZGVmaW5lIHJhd19sb2NhbF9zYXZlX2ZsYWdzKHgpCQkJCQkJXAotX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJCVwKLQkicmF3X2xvY2FsX3NhdmVfZmxhZ3MgJTAiCQkJCQlcCi0JOiAiPXIiICh4KSkKLQotX19hc21fXygKLQkiCS5tYWNybwlyYXdfbG9jYWxfaXJxX3NhdmUgcmVzdWx0CQkJXG4iCi0JIgkuc2V0CXB1c2gJCQkJCQlcbiIKLQkiCS5zZXQJcmVvcmRlcgkJCQkJCVxuIgotCSIJLnNldAlub2F0CQkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCSIJbWZjMAlcXHJlc3VsdCwgJDIsIDEJCQkJCVxuIgotCSIJb3JpCSQxLCBcXHJlc3VsdCwgMHg0MDAJCQkJXG4iCi0JIgkuc2V0CW5vcmVvcmRlcgkJCQkJXG4iCi0JIgltdGMwCSQxLCAkMiwgMQkJCQkJXG4iCi0JIglhbmRpCVxccmVzdWx0LCBcXHJlc3VsdCwgMHg0MDAJCQlcbiIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCi0JIglkaQlcXHJlc3VsdAkJCQkJXG4iCi0JIglhbmRpCVxccmVzdWx0LCAxCQkJCQlcbiIKLSNlbHNlCi0JIgltZmMwCVxccmVzdWx0LCAkMTIJCQkJCVxuIgotCSIJb3JpCSQxLCBcXHJlc3VsdCwgMHgxZgkJCQlcbiIKLQkiCXhvcmkJJDEsIDB4MWYJCQkJCVxuIgotCSIJLnNldAlub3Jlb3JkZXIJCQkJCVxuIgotCSIJbXRjMAkkMSwgJDEyCQkJCQkJXG4iCi0jZW5kaWYKLQkiCWlycV9kaXNhYmxlX2hhemFyZAkJCQkJXG4iCi0JIgkuc2V0CXBvcAkJCQkJCVxuIgotCSIJLmVuZG0JCQkJCQkJXG4iKTsKLQotI2RlZmluZSByYXdfbG9jYWxfaXJxX3NhdmUoeCkJCQkJCQlcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkJXAotCSJyYXdfbG9jYWxfaXJxX3NhdmVcdCUwIgkJCQkJXAotCTogIj1yIiAoeCkJCQkJCQkJXAotCTogLyogbm8gaW5wdXRzICovCQkJCQkJXAotCTogIm1lbW9yeSIpCi0KLV9fYXNtX18oCi0JIgkubWFjcm8JcmF3X2xvY2FsX2lycV9yZXN0b3JlIGZsYWdzCQkJXG4iCi0JIgkuc2V0CXB1c2gJCQkJCQlcbiIKLQkiCS5zZXQJbm9yZW9yZGVyCQkJCQlcbiIKLQkiCS5zZXQJbm9hdAkJCQkJCVxuIgotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkibWZjMAkkMSwgJDIsIDEJCQkJCQlcbiIKLQkiYW5kaQlcXGZsYWdzLCAweDQwMAkJCQkJCVxuIgotCSJvcmkJJDEsIDB4NDAwCQkJCQkJXG4iCi0JInhvcmkJJDEsIDB4NDAwCQkJCQkJXG4iCi0JIm9yCVxcZmxhZ3MsICQxCQkJCQkJXG4iCi0JIm10YzAJXFxmbGFncywgJDIsIDEJCQkJCQlcbiIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpICYmIGRlZmluZWQoQ09ORklHX0lSUV9DUFUpCi0JLyoKLQkgKiBTbG93LCBidXQgZG9lc24ndCBzdWZmZXIgZnJvbSBhIHJlbGF0aXZseSB1bmxpa2VseSByYWNlCi0JICogY29uZGl0aW9uIHdlJ3JlIGhhdmluZyBzaW5jZSBkYXlzIDEuCi0JICovCi0JIgliZXF6CVxcZmxhZ3MsIDFmCQkJCQlcbiIKLQkiCSBkaQkJCQkJCQlcbiIKLQkiCWVpCQkJCQkJCVxuIgotCSIxOgkJCQkJCQkJXG4iCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfTUlQU1IyKQotCS8qCi0JICogRmFzdCwgZGFuZ2Vyb3VzLiAgTGlmZSBpcyBmdW4sIGxpZmUgaXMgZ29vZC4KLQkgKi8KLQkiCW1mYzAJJDEsICQxMgkJCQkJCVxuIgotCSIJaW5zCSQxLCBcXGZsYWdzLCAwLCAxCQkJCVxuIgotCSIJbXRjMAkkMSwgJDEyCQkJCQkJXG4iCi0jZWxzZQotCSIJbWZjMAkkMSwgJDEyCQkJCQkJXG4iCi0JIglhbmRpCVxcZmxhZ3MsIDEJCQkJCVxuIgotCSIJb3JpCSQxLCAweDFmCQkJCQlcbiIKLQkiCXhvcmkJJDEsIDB4MWYJCQkJCVxuIgotCSIJb3IJXFxmbGFncywgJDEJCQkJCVxuIgotCSIJbXRjMAlcXGZsYWdzLCAkMTIJCQkJCVxuIgotI2VuZGlmCi0JIglpcnFfZGlzYWJsZV9oYXphcmQJCQkJCVxuIgotCSIJLnNldAlwb3AJCQkJCQlcbiIKLQkiCS5lbmRtCQkJCQkJCVxuIik7Ci0KLWV4dGVybiB2b2lkIHNtdGNfaXBpX3JlcGxheSh2b2lkKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgX190bXAxOwotCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQ19JTlNUQU5UX1JFUExBWQotCS8qCi0JICogQ09ORklHX01JUFNfTVRfU01UQ19JTlNUQU5UX1JFUExBWSBkb2VzIHByb21wdCByZXBsYXkgb2YgZGVmZXJyZWQKLQkgKiBJUElzLCBhdCB0aGUgY29zdCBvZiBicmFuY2ggYW5kIGNhbGwgb3ZlcmhlYWQgb24gZWFjaAotCSAqIGxvY2FsX2lycV9yZXN0b3JlKCkKLQkgKi8KLQlpZiAodW5saWtlbHkoIShmbGFncyAmIDB4MDQwMCkpKQotCQlzbXRjX2lwaV9yZXBsYXkoKTsKLSNlbmRpZgotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJyYXdfbG9jYWxfaXJxX3Jlc3RvcmVcdCUwIgotCQk6ICI9ciIgKF9fdG1wMSkKLQkJOiAiMCIgKGZsYWdzKQotCQk6ICJtZW1vcnkiKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JLyoKLQkgKiBTTVRDIG1vZGVsIHVzZXMgVENTdGF0dXMuSVhNVCB0byBkaXNhYmxlIGludGVycnVwdHMgZm9yIGEgdGhyZWFkL0NQVQotCSAqLwotCXJldHVybiBmbGFncyAmIDB4NDAwOwotI2Vsc2UKLQlyZXR1cm4gIShmbGFncyAmIDEpOwotI2VuZGlmCi19Ci0KLSNlbmRpZgotCi0vKgotICogRG8gdGhlIENQVSdzIElSUS1zdGF0ZSB0cmFjaW5nIGZyb20gYXNzZW1ibHkgY29kZS4KLSAqLwotI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotLyogUmVsb2FkIHNvbWUgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSB0cmFjZV9oYXJkaXJxc19vbiAqLwotI2lmZGVmIENPTkZJR182NEJJVAotIyBkZWZpbmUgVFJBQ0VfSVJRU19SRUxPQURfUkVHUwkJCQkJCVwKLQlMT05HX0wJJDExLCBQVF9SMTEoc3ApOwkJCQkJXAotCUxPTkdfTAkkMTAsIFBUX1IxMChzcCk7CQkJCQlcCi0JTE9OR19MCSQ5LCBQVF9SOShzcCk7CQkJCQkJXAotCUxPTkdfTAkkOCwgUFRfUjgoc3ApOwkJCQkJCVwKLQlMT05HX0wJJDcsIFBUX1I3KHNwKTsJCQkJCQlcCi0JTE9OR19MCSQ2LCBQVF9SNihzcCk7CQkJCQkJXAotCUxPTkdfTAkkNSwgUFRfUjUoc3ApOwkJCQkJCVwKLQlMT05HX0wJJDQsIFBUX1I0KHNwKTsJCQkJCQlcCi0JTE9OR19MCSQyLCBQVF9SMihzcCkKLSNlbHNlCi0jIGRlZmluZSBUUkFDRV9JUlFTX1JFTE9BRF9SRUdTCQkJCQkJXAotCUxPTkdfTAkkNywgUFRfUjcoc3ApOwkJCQkJCVwKLQlMT05HX0wJJDYsIFBUX1I2KHNwKTsJCQkJCQlcCi0JTE9OR19MCSQ1LCBQVF9SNShzcCk7CQkJCQkJXAotCUxPTkdfTAkkNCwgUFRfUjQoc3ApOwkJCQkJCVwKLQlMT05HX0wJJDIsIFBUX1IyKHNwKQotI2VuZGlmCi0jIGRlZmluZSBUUkFDRV9JUlFTX09OCQkJCQkJCVwKLQlDTEk7CS8qIG1ha2Ugc3VyZSB0cmFjZV9oYXJkaXJxc19vbigpIGlzIGNhbGxlZCBpbiBrZXJuZWwgbGV2ZWwgKi8gXAotCWphbAl0cmFjZV9oYXJkaXJxc19vbgotIyBkZWZpbmUgVFJBQ0VfSVJRU19PTl9SRUxPQUQJCQkJCQlcCi0JVFJBQ0VfSVJRU19PTjsJCQkJCQkJXAotCVRSQUNFX0lSUVNfUkVMT0FEX1JFR1MKLSMgZGVmaW5lIFRSQUNFX0lSUVNfT0ZGCQkJCQkJCVwKLQlqYWwJdHJhY2VfaGFyZGlycXNfb2ZmCi0jZWxzZQotIyBkZWZpbmUgVFJBQ0VfSVJRU19PTgotIyBkZWZpbmUgVFJBQ0VfSVJRU19PTl9SRUxPQUQKLSMgZGVmaW5lIFRSQUNFX0lSUVNfT0ZGCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9BU01fSVJRRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTQ3eHgvZ3Bpby5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTQ3eHgvZ3Bpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmM4ZjRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1iY200N3h4L2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PgotICovCi0KLSNpZm5kZWYgX19CQ000N1hYX0dQSU9fSAotI2RlZmluZSBfX0JDTTQ3WFhfR1BJT19ICi0KLSNkZWZpbmUgQkNNNDdYWF9FWFRJRl9HUElPX0xJTkVTCTUKLSNkZWZpbmUgQkNNNDdYWF9DSElQQ09fR1BJT19MSU5FUwkxNgotCi1leHRlcm4gaW50IGJjbTQ3eHhfZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gaW50IGJjbTQ3eHhfZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBiY200N3h4X2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IGJjbTQ3eHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gaW50IGJjbTQ3eHhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKLXsKLSAgICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBiY200N3h4X2dwaW9fdG9faXJxKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBiY200N3h4X2dwaW9fZ2V0X3ZhbHVlKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWJjbTQ3eHhfZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBiY200N3h4X2dwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCXJldHVybiBiY200N3h4X2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Ci19Ci0KLQotLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNlbmRpZiAvKiBfX0JDTTQ3WFhfR1BJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYmNtNDd4eC93YXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1iY200N3h4L3dhci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJiNzk4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1iY200N3h4L3dhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNCwgMjAwNyBieSBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+Ci0gKi8KLSNpZm5kZWYgX19BU01fTUlQU19NQUNIX0JDTTk0N1hYX1dBUl9ICi0jZGVmaW5lIF9fQVNNX01JUFNfTUFDSF9CQ005NDdYWF9XQVJfSAotCi0jZGVmaW5lIFI0NjAwX1YxX0lOREVYX0lDQUNIRU9QX1dBUgkwCi0jZGVmaW5lIFI0NjAwX1YxX0hJVF9DQUNIRU9QX1dBUgkwCi0jZGVmaW5lIFI0NjAwX1YyX0hJVF9DQUNIRU9QX1dBUgkwCi0jZGVmaW5lIFI1NDMyX0NQMF9JTlRFUlJVUFRfV0FSCQkwCi0jZGVmaW5lIEJDTTEyNTBfTTNfV0FSCQkJMAotI2RlZmluZSBTSUJZVEVfMTk1Nl9XQVIJCQkwCi0jZGVmaW5lIE1JUFM0S19JQ0FDSEVfUkVGSUxMX1dBUgkwCi0jZGVmaW5lIE1JUFNfQ0FDSEVfU1lOQ19XQVIJCTAKLSNkZWZpbmUgVFg0OVhYX0lDQUNIRV9JTkRFWF9JTlZfV0FSCTAKLSNkZWZpbmUgUk05MDAwX0NERVhfU01QX1dBUgkJMAotI2RlZmluZSBJQ0FDSEVfUkVGSUxMU19XT1JLQVJPVU5EX1dBUgkwCi0jZGVmaW5lIFIxMDAwMF9MTFNDX1dBUgkJCTAKLSNkZWZpbmUgTUlQUzM0S19NSVNTRURfSVRMQl9XQVIJCTAKLQotI2VuZGlmIC8qIF9fQVNNX01JUFNfTUFDSF9CQ005NDdYWF9XQVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvaWRlLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwMDhmNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYy9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycwotICoKLSAqIENvcGllZCBmcm9tIGkzODY7IG1hbnkgb2YgdGhlIGVzcGVjaWFsbHkgb2xkZXIgTUlQUyBvciBJU0EtYmFzZWQgcGxhdGZvcm1zCi0gKiBhcmUgYmFzaWNhbGx5IGlkZW50aWNhbC4gIFVzaW5nIHRoaXMgZmlsZSBwcm9iYWJseSBpbXBsaWVzIGk4MjU5IFBJQwotICogc3VwcG9ydCBpbiBhIHN5c3RlbSBidXQgdGhlIHZlcnkgbGVhc3QgaW50ZXJydXB0IG51bWJlcnMgMCAtIDE1IG5lZWQgdG8KLSAqIGJlIHB1dCBhc2lkZSBmb3IgbGVnYWN5IGRldmljZXMuCi0gKi8KLSNpZm5kZWYgX19BU01fTUFDSF9HRU5FUklDX0lERV9ICi0jZGVmaW5lIF9fQVNNX01BQ0hfR0VORVJJQ19JREVfSAotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaWRlX3Byb2JlX2xlZ2FjeSh2b2lkKQotewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCS8qCi0JICogVGhpcyBjYW4gYmUgY2FsbGVkIG9uIHRoZSBpZGVfc2V0dXAoKSBwYXRoLCBzdXBlci1lYXJseSBpbgotCSAqIGJvb3QuICBCdXQgdGhlIGRvd25fcmVhZCgpIHdpbGwgZW5hYmxlIGxvY2FsIGludGVycnVwdHMsCi0JICogd2hpY2ggY2FuIGNhdXNlIHNvbWUgbWFjaGluZXMgdG8gY3Jhc2guICBTbyBoZXJlIHdlIGRldGVjdAotCSAqIGFuZCBmbGFnIHRoYXQgc2l0dWF0aW9uIGFuZCBiYWlsIG91dCBlYXJseS4KLQkgKi8KLQlpZiAobm9fcGNpX2RldmljZXMoKSkKLQkJcmV0dXJuIDA7Ci0JZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0VJU0EgPDwgOCwgTlVMTCk7Ci0JaWYgKGRldikKLQkJZ290byBmb3VuZDsKLQlkZXYgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19CUklER0VfSVNBIDw8IDgsIE5VTEwpOwotCWlmIChkZXYpCi0JCWdvdG8gZm91bmQ7Ci0JcmV0dXJuIDA7Ci1mb3VuZDoKLQlwY2lfZGV2X3B1dChkZXYpOwotCXJldHVybiAxOwotI2VsaWYgZGVmaW5lZChDT05GSUdfRUlTQSkgfHwgZGVmaW5lZChDT05GSUdfSVNBKQotCXJldHVybiAxOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKiBNSVBTIHBvcnQgYW5kIG1lbW9yeS1tYXBwZWQgSS9PIHN0cmluZyBvcGVyYXRpb25zLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9mbHVzaF9wcm9sb2d1ZSh2b2lkKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoY3B1X2hhc19kY19hbGlhc2VzKQotCQlwcmVlbXB0X2Rpc2FibGUoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfZmx1c2hfZXBpbG9ndWUodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJcHJlZW1wdF9lbmFibGUoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpIHsKLQkJdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgc2l6ZTsKLQotCQl3aGlsZSAoYWRkciA8IGVuZCkgewotCQkJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlKCh2b2lkICopYWRkcik7Ci0JCQlhZGRyICs9IFBBR0VfU0laRTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIGluc3coKSBhbmQgZ2FuZyBtaWdodCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCBzbyB3ZSBjYW4ndAotICogc2VuZCBJUElzIGZvciBmbHVzaGluZyBkdWUgdG8gdGhlIHBvdGVuY2lhbCBvZiBkZWFkbG9ja3MsIHNlZSB0aGUgY29tbWVudAotICogYWJvdmUgc21wX2NhbGxfZnVuY3Rpb24oKSBpbiBhcmNoL21pcHMva2VybmVsL3NtcC5jLiAgV2Ugd29yayBhcm91bmQgdGhlCi0gKiBwcm9ibGVtIGJ5IGRpc2FibGluZyBwcmVlbXB0aW9uIHNvIHdlIGtub3cgd2UgYWN0dWFsbHkgcGVyZm9ybSB0aGUgZmx1c2gKLSAqIG9uIHRoZSBwcm9jZXNzb3IgdGhhdCBhY3R1YWxseSBoYXMgdGhlIGxpbmVzIHRvIGJlIGZsdXNoZWQgd2hpY2ggaG9wZWZ1bGx5Ci0gKiBpcyBldmVuIGJldHRlciBmb3IgcGVyZm9ybWFuY2UgYW55d2F5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsCi0JdW5zaWduZWQgaW50IGNvdW50KQotewotCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7Ci0JaW5zdyhwb3J0LCBhZGRyLCBjb3VudCk7Ci0JX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogMik7Ci0JX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faWRlX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JX19pZGVfZmx1c2hfcHJvbG9ndWUoKTsKLQlpbnNsKHBvcnQsIGFkZHIsIGNvdW50KTsKLQlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgY291bnQgKiA0KTsKLQlfX2lkZV9mbHVzaF9lcGlsb2d1ZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLAotCXVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0JX19pZGVfZmx1c2hfcHJvbG9ndWUoKTsKLQlvdXRzdyhwb3J0LCBhZGRyLCBjb3VudCk7Ci0JX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogMik7Ci0JX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faWRlX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwKLQl1bnNpZ25lZCBsb25nIGNvdW50KQotewotCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7Ci0Jb3V0c2wocG9ydCwgYWRkciwgY291bnQpOwotCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDQpOwotCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lkZV9tbV9pbnN3KHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYWRkciwgdTMyIGNvdW50KQotewotCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7Ci0JcmVhZHN3KHBvcnQsIGFkZHIsIGNvdW50KTsKLQlfX2lkZV9mbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgY291bnQgKiAyKTsKLQlfX2lkZV9mbHVzaF9lcGlsb2d1ZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pZGVfbW1faW5zbCh2b2lkIF9faW9tZW0gKnBvcnQsIHZvaWQgKmFkZHIsIHUzMiBjb3VudCkKLXsKLQlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOwotCXJlYWRzbChwb3J0LCBhZGRyLCBjb3VudCk7Ci0JX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogNCk7Ci0JX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faWRlX21tX291dHN3KHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYWRkciwgdTMyIGNvdW50KQotewotCV9faWRlX2ZsdXNoX3Byb2xvZ3VlKCk7Ci0Jd3JpdGVzdyhwb3J0LCBhZGRyLCBjb3VudCk7Ci0JX19pZGVfZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsIGNvdW50ICogMik7Ci0JX19pZGVfZmx1c2hfZXBpbG9ndWUoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faWRlX21tX291dHNsKHZvaWQgX19pb21lbSAqIHBvcnQsIHZvaWQgKmFkZHIsIHUzMiBjb3VudCkKLXsKLQlfX2lkZV9mbHVzaF9wcm9sb2d1ZSgpOwotCXdyaXRlc2wocG9ydCwgYWRkciwgY291bnQpOwotCV9faWRlX2ZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCBjb3VudCAqIDQpOwotCV9faWRlX2ZsdXNoX2VwaWxvZ3VlKCk7Ci19Ci0KLS8qIGlkZV9pbnN3IGNhbGxzIGluc3csIG5vdCBfX2lkZV9pbnN3LiAgV2h5PyAqLwotI3VuZGVmIGluc3cKLSN1bmRlZiBpbnNsCi0jdW5kZWYgb3V0c3cKLSN1bmRlZiBvdXRzbAotI2RlZmluZSBpbnN3KHBvcnQsIGFkZHIsIGNvdW50KSBfX2lkZV9pbnN3KHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBpbnNsKHBvcnQsIGFkZHIsIGNvdW50KSBfX2lkZV9pbnNsKHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBvdXRzdyhwb3J0LCBhZGRyLCBjb3VudCkgX19pZGVfb3V0c3cocG9ydCwgYWRkciwgY291bnQpCi0jZGVmaW5lIG91dHNsKHBvcnQsIGFkZHIsIGNvdW50KSBfX2lkZV9vdXRzbChwb3J0LCBhZGRyLCBjb3VudCkKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfR0VORVJJQ19JREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjIvZHMxMjg2LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9kczEyODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5ZjFlYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyMi9kczEyODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDIwMDEsIDAzIGJ5IFJhbGYgQmFlY2hsZQotICoKLSAqIFJUQyByb3V0aW5lcyBmb3IgUEMgc3R5bGUgYXR0YWNoZWQgRGFsbGFzIGNoaXAuCi0gKi8KLSNpZm5kZWYgX19BU01fTUFDSF9JUDIyX0RTMTI4Nl9ICi0jZGVmaW5lIF9fQVNNX01BQ0hfSVAyMl9EUzEyODZfSAotCi0jaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+Ci0KLSNkZWZpbmUgcnRjX3JlYWQocmVnKQkJKGhwYzNjMC0+cnRjcmVnc1socmVnKV0gJiAweGZmKQotI2RlZmluZSBydGNfd3JpdGUoZGF0YSwgcmVnKQlkbyB7IGhwYzNjMC0+cnRjcmVnc1socmVnKV0gPSAoZGF0YSk7IH0gd2hpbGUoMCkKLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfSVAyMl9EUzEyODZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjgvZHMxMjg2LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyOC9kczEyODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxYmI5YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyOC9kczEyODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0lQMjhfRFMxMjg2X0gKLSNkZWZpbmUgX19BU01fTUFDSF9JUDI4X0RTMTI4Nl9ICi0jaW5jbHVkZSA8YXNtL21hY2gtaXAyMi9kczEyODYuaD4KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0lQMjhfRFMxMjg2X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2dwaW8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NmY1Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAyIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KLSAqCUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogR1BJTyByZWdpc3RlciBkZWZpbml0aW9uLgotICoKLSAqIEF1dGhvciA6IHJ5YW4uaG9sbVFWaXN0QGlkdC5jb20KLSAqIERhdGUgICA6IDIwMDExMDA1Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUnlhbiBIb2xtIDxyeWFuLmhvbG1RVmlzdEBpZHQuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA4IEZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+Ci0gKi8KLQotI2lmbmRlZiBfUkMzMjQzNF9HUElPX0hfCi0jZGVmaW5lIF9SQzMyNDM0X0dQSU9fSF8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCByYjUzMl9ncGlvX3JlZyB7Ci0JdTMyICAgZ3Bpb2Z1bmM7ICAgLyogR1BJTyBGdW5jdGlvbiBSZWdpc3RlcgotCQkJICAgKiBncGlvZnVuY1t4XT09MCBiaXQgPSBncGlvCi0JCQkgICAqIGZ1bmNbeF09PTEgIGJpdCA9IGFsdGZ1bmMKLQkJCSAgICovCi0JdTMyICAgZ3Bpb2NmZzsJICAvKiBHUElPIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKLQkJCSAgICogZ3Bpb2NmZ1t4XT09MCBiaXQgPSBpbnB1dAotCQkJICAgKiBncGlvY2ZnW3hdPT0xIGJpdCA9IG91dHB1dAotCQkJICAgKi8KLQl1MzIgICBncGlvZDsJICAvKiBHUElPIERhdGEgUmVnaXN0ZXIKLQkJCSAgICogZ3Bpb2RbeF0gcmVhZC93cml0ZSBncGlvIHBpblggc3RhdHVzCi0JCQkgICAqLwotCXUzMiAgIGdwaW9pbGV2ZWw7IC8qIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgotCQkJICAgKiBpbnRlcnJ1cHQgbGV2ZWwgKHNlZSBncGlvaXN0YXQpCi0JCQkgICAqLwotCXUzMiAgIGdwaW9pc3RhdDsgIC8qIEdwaW8gSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgotCQkJICAgKiBpc3RhdFt4XSA9IChncGlvZFt4XSA9PSBsZXZlbFt4XSkKLQkJCSAgICogY2xlYXJlZCBpbiBJU1IgKFNUSUNLWSBiaXRzKQotCQkJICAgKi8KLQl1MzIgICBncGlvbm1pZW47ICAvKiBHUElPIE5vbi1tYXNrYWJsZSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi19OwotCi0vKiBVQVJUIEdQSU8gc2lnbmFscyAqLwotI2RlZmluZSBSQzMyNDM0X1VBUlQwX1NPVVQJKDEgPDwgMCkKLSNkZWZpbmUgUkMzMjQzNF9VQVJUMF9TSU4JKDEgPDwgMSkKLSNkZWZpbmUgUkMzMjQzNF9VQVJUMF9SVFMJKDEgPDwgMikKLSNkZWZpbmUgUkMzMjQzNF9VQVJUMF9DVFMJKDEgPDwgMykKLQotLyogTSAmIFAgYnVzIEdQSU8gc2lnbmFscyAqLwotI2RlZmluZSBSQzMyNDM0X01QX0JJVF8yMgkoMSA8PCA0KQotI2RlZmluZSBSQzMyNDM0X01QX0JJVF8yMwkoMSA8PCA1KQotI2RlZmluZSBSQzMyNDM0X01QX0JJVF8yNAkoMSA8PCA2KQotI2RlZmluZSBSQzMyNDM0X01QX0JJVF8yNQkoMSA8PCA3KQotCi0vKiBDUFUgR1BJTyBzaWduYWxzICovCi0jZGVmaW5lIFJDMzI0MzRfQ1BVX0dQSU8JKDEgPDwgOCkKLQotLyogUmVzZXJ2ZWQgR1BJTyBzaWduYWxzICovCi0jZGVmaW5lIFJDMzI0MzRfQUZfU1BBUkVfNgkoMSA8PCA5KQotI2RlZmluZSBSQzMyNDM0X0FGX1NQQVJFXzQJKDEgPDwgMTApCi0jZGVmaW5lIFJDMzI0MzRfQUZfU1BBUkVfMwkoMSA8PCAxMSkKLSNkZWZpbmUgUkMzMjQzNF9BRl9TUEFSRV8yCSgxIDw8IDEyKQotCi0vKiBQQ0kgbWVzc2FnaW5nIHVuaXQgKi8KLSNkZWZpbmUgUkMzMjQzNF9QQ0lfTVNVX0dQSU8JKDEgPDwgMTMpCi0KLQotZXh0ZXJuIHZvaWQgc2V0XzQzNF9yZWcodW5zaWduZWQgcmVnX29mZnMsIHVuc2lnbmVkIGJpdCwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCB2YWwpOwotZXh0ZXJuIHVuc2lnbmVkIGdldF80MzRfcmVnKHVuc2lnbmVkIHJlZ19vZmZzKTsKLWV4dGVybiB2b2lkIHNldF9sYXRjaF91NSh1bnNpZ25lZCBjaGFyIG9yX21hc2ssIHVuc2lnbmVkIGNoYXIgbmFuZF9tYXNrKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGdldF9sYXRjaF91NSh2b2lkKTsKLQotZXh0ZXJuIGludCByYjUzMl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKLWV4dGVybiB2b2lkIHJiNTMyX2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHJiNTMyX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pOwotZXh0ZXJuIGludCByYjUzMl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKTsKLWV4dGVybiB2b2lkIHJiNTMyX2dwaW9fc2V0X2ludF9sZXZlbCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCByYjUzMl9ncGlvX2dldF9pbnRfbGV2ZWwodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCByYjUzMl9ncGlvX3NldF9pbnRfc3RhdHVzKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHJiNTMyX2dwaW9fZ2V0X2ludF9zdGF0dXModW5zaWduZWQgZ3Bpbyk7Ci0KLQotLyogV3JhcHBlcnMgZm9yIHRoZSBhcmNoLW5ldXRyYWwgR1BJTyBBUEkgKi8KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCS8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQotewotCS8qIE5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gcmI1MzJfZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCi17Ci0JcmV0dXJuIHJiNTMyX2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIHJiNTMyX2dwaW9fZ2V0X3ZhbHVlKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCXJiNTMyX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gZ3BpbzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQotewotCXJldHVybiBpcnE7Ci19Ci0KLS8qIEZvciBjYW5zbGVlcCAqLwotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2VuZGlmIC8qIF9SQzMyNDM0X0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L2lycS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWU0NzIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpZm5kZWYgX19BU01fUkMzMjQzNF9JUlFfSAotI2RlZmluZSBfX0FTTV9SQzMyNDM0X0lSUV9ICi0KLSNkZWZpbmUgTlJfSVJRUwkyNTYKLQotI2luY2x1ZGUgPGFzbS9tYWNoLWdlbmVyaWMvaXJxLmg+Ci0KLSNlbmRpZiAgLyogX19BU01fUkMzMjQzNF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvcHJvbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDY2ZGRjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L3Byb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiAgRGVmaW5pdGlvbnMgZm9yIHRoZSBQUk9NCi0gKgotICogIENvcHlyaWdodCAyMDAyIFJ5YW4gSG9sbSA8cnlhbi5ob2xtUVZpc3RAaWR0LmNvbT4KLSAqICBDb3B5cmlnaHQgMjAwOCBGbG9yaWFuIEZhaW5lbGxpIDxmbG9yaWFuQG9wZW53cnQub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKi8KLQotI2RlZmluZSBQUk9NX0VOVFJZKHgpCQkoMHhiZmMwMDAwMCArICgoeCkgKiA4KSkKLQotI2RlZmluZSBHUElPX0lOSVRfTk9CVVRUT04JIiIKLSNkZWZpbmUgR1BJT19JTklUX0JVVFRPTgkiIDIiCi0KLSNkZWZpbmUgU1JfTk1JCQkJMHgwMDE4MDAwMAotI2RlZmluZSBTRVJJQUxfU1BFRURfRU5UUlkJMHgwMDAwMDAwMQotCi0jZGVmaW5lIEZSRVFfVEFHCQkiSFo9IgotI2RlZmluZSBHUElPX1RBRwkJImdwaW89IgotI2RlZmluZSBLTUFDX1RBRwkJImttYWM9IgotI2RlZmluZSBNRU1fVEFHCQkJIm1lbT0iCi0jZGVmaW5lIEJPQVJEX1RBRwkJImJvYXJkPSIKLQotI2RlZmluZSBCT0FSRF9SQjUzMgkJIjUwMCIKLSNkZWZpbmUgQk9BUkRfUkI1MzJBCQkiNTAwcjUiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9yYi5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJjMzI0MzQvcmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhNzZlMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9yYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBJRFQgSW5jLgotICogIENvcHlyaWdodCAoQykgMjAwNiBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+Ci0gKi8KLSNpZm5kZWYgX19BU01fUkMzMjQzNF9SQl9ICi0jZGVmaW5lIF9fQVNNX1JDMzI0MzRfUkJfSAotCi0jaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KLQotI2RlZmluZSBJRFQ0MzRfUkVHX0JBU0UJKCh2b2xhdGlsZSB2b2lkICopIEtTRUcxQUREUigweDE4MDAwMDAwKSkKLSNkZWZpbmUgREVWMEJBU0UJMHgwMTAwMDAKLSNkZWZpbmUgREVWME1BU0sJMHgwMTAwMDQKLSNkZWZpbmUgREVWMEMJCTB4MDEwMDA4Ci0jZGVmaW5lIERFVjBUCQkweDAxMDAwQwotI2RlZmluZSBERVYxQkFTRQkweDAxMDAxMAotI2RlZmluZSBERVYxTUFTSwkweDAxMDAxNAotI2RlZmluZSBERVYxQwkJMHgwMTAwMTgKLSNkZWZpbmUgREVWMVRDCQkweDAxMDAxQwotI2RlZmluZSBERVYyQkFTRQkweDAxMDAyMAotI2RlZmluZSBERVYyTUFTSwkweDAxMDAyNAotI2RlZmluZSBERVYyQwkJMHgwMTAwMjgKLSNkZWZpbmUgREVWMlRDCQkweDAxMDAyQwotI2RlZmluZSBERVYzQkFTRQkweDAxMDAzMAotI2RlZmluZSBERVYzTUFTSwkweDAxMDAzNAotI2RlZmluZSBERVYzQwkJMHgwMTAwMzgKLSNkZWZpbmUgREVWM1RDCQkweDAxMDAzQwotI2RlZmluZSBCVENTCQkweDAxMDA0MAotI2RlZmluZSBCVENPTVBBUkUJMHgwMTAwNDQKLSNkZWZpbmUgR1BJT0JBU0UJMHgwNTAwMDAKLSNkZWZpbmUgR1BJT0NGRwkJMHgwNTAwMDQKLSNkZWZpbmUgR1BJT0QJCTB4MDUwMDA4Ci0jZGVmaW5lIEdQSU9JTEVWRUwJMHgwNTAwMEMKLSNkZWZpbmUgR1BJT0lTVEFUCTB4MDUwMDEwCi0jZGVmaW5lIEdQSU9OTUlFTgkweDA1MDAxNAotI2RlZmluZSBJTUFTSzYJCTB4MDM4MDM4Ci0jZGVmaW5lIExPX1dQWAkJKDEgPDwgMCkKLSNkZWZpbmUgTE9fQUxFCQkoMSA8PCAxKQotI2RlZmluZSBMT19DTEUJCSgxIDw8IDIpCi0jZGVmaW5lIExPX0NFWAkJKDEgPDwgMykKLSNkZWZpbmUgTE9fRk9GRgkJKDEgPDwgNSkKLSNkZWZpbmUgTE9fU1BJQ1MJKDEgPDwgNikKLSNkZWZpbmUgTE9fVUxFRAkJKDEgPDwgNykKLQotI2RlZmluZSBCSVRfVE9fTUFTSyh4KQkoMSA8PCB4KQotCi1zdHJ1Y3QgZGV2X3JlZyB7Ci0JdTMyCWJhc2U7Ci0JdTMyCW1hc2s7Ci0JdTMyCWN0bDsKLQl1MzIJdGltaW5nOwotfTsKLQotc3RydWN0IGtvcmluYV9kZXZpY2UgewotCWNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgY2hhciBtYWNbNl07Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLX07Ci0KLXN0cnVjdCBjZl9kZXZpY2UgewotCWludCBncGlvX3BpbjsKLQl2b2lkICpkZXY7Ci0Jc3RydWN0IGdlbmRpc2sgKmdkOwotfTsKLQotc3RydWN0IG1wbWNfZGV2aWNlIHsKLQl1bnNpZ25lZCBjaGFyCXN0YXRlOwotCXNwaW5sb2NrX3QJbG9jazsKLQl2b2lkIF9faW9tZW0gCSpiYXNlOwotfTsKLQotI2VuZGlmICAvKiBfX0FTTV9SQzMyNDM0X1JCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L3JjMzI0MzQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1yYzMyNDM0L3JjMzI0MzQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMDIxNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcmMzMjQzNC9yYzMyNDM0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogRGVmaW5pdGlvbnMgZm9yIElEVCBSQzMyMzQzNCBDUFUuCi0gKi8KLQotI2lmbmRlZiBfQVNNX1JDMzI0MzRfUkMzMjQzNF9IXwotI2RlZmluZSBfQVNNX1JDMzI0MzRfUkMzMjQzNF9IXwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jZGVmaW5lIFJDMzI0MzRfUkVHX0JBU0UJMHgxODAwMDAwMAotI2RlZmluZSBSQzMyNDM0X1JTVAkJKDEgPDwgMTUpCi0KLSNkZWZpbmUgSURUX0NMT0NLX01VTFQJCTIKLSNkZWZpbmUgTUlQU19DUFVfVElNRVJfSVJRCTcKLQotLyogSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSUNfR1JPVVAwX1BFTkQJCShSQzMyNDM0X1JFR19CQVNFICsgMHgzODAwMCkKLSNkZWZpbmUgSUNfR1JPVVAwX01BU0sJCShSQzMyNDM0X1JFR19CQVNFICsgMHgzODAwOCkKLSNkZWZpbmUgSUNfR1JPVVBfT0ZGU0VUCQkweDBDCi0KLSNkZWZpbmUgTlVNX0lOVFJfR1JPVVBTCQk1Ci0KLS8qIDE2NTUwIFVBUlRzICovCi0jZGVmaW5lIEdST1VQMF9JUlFfQkFTRQkJOAkvKiBHUlAyIElSUSBudW1iZXJzIHN0YXJ0IGhlcmUgKi8KLQkJCQkJLyogR1JQMyBJUlEgbnVtYmVycyBzdGFydCBoZXJlICovCi0jZGVmaW5lIEdST1VQMV9JUlFfQkFTRQkJKEdST1VQMF9JUlFfQkFTRSArIDMyKQotCQkJCQkvKiBHUlA0IElSUSBudW1iZXJzIHN0YXJ0IGhlcmUgKi8KLSNkZWZpbmUgR1JPVVAyX0lSUV9CQVNFCQkoR1JPVVAxX0lSUV9CQVNFICsgMzIpCi0JCQkJCS8qIEdSUDUgSVJRIG51bWJlcnMgc3RhcnQgaGVyZSAqLwotI2RlZmluZSBHUk9VUDNfSVJRX0JBU0UJCShHUk9VUDJfSVJRX0JBU0UgKyAzMikKLSNkZWZpbmUgR1JPVVA0X0lSUV9CQVNFCQkoR1JPVVAzX0lSUV9CQVNFICsgMzIpCi0KLQotI2lmZGVmIF9fTUlQU0VCX18KLSNkZWZpbmUgUkMzMjQzNF9VQVJUMF9CQVNFCShSQzMyNDM0X1JFR19CQVNFICsgMHg1ODAwMykKLSNlbHNlCi0jZGVmaW5lIFJDMzI0MzRfVUFSVDBfQkFTRQkoUkMzMjQzNF9SRUdfQkFTRSArIDB4NTgwMDApCi0jZW5kaWYKLQotI2RlZmluZSBSQzMyNDM0X1VBUlQwX0lSUQkoR1JPVVAzX0lSUV9CQVNFICsgMCkKLQotLyogY3B1IHBpcGVsaW5lIGZsdXNoICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmMzMjQzNF9zeW5jKHZvaWQpCi17Ci0JX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJjMzI0MzRfc3luY191ZGVsYXkoaW50IHVzKQotewotCV9fYXNtX18gdm9sYXRpbGUgKCJzeW5jIik7Ci0JdWRlbGF5KHVzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJjMzI0MzRfc3luY19kZWxheShpbnQgbXMpCi17Ci0JX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKLQltZGVsYXkobXMpOwotfQotCi0jZW5kaWYgIC8qIF9BU01fUkMzMjQzNF9SQzMyNDM0X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21pcHNyZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL21pcHNyZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NmY4ZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxIGJ5IFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIE1vZGlmaWVkIGZvciBmdXJ0aGVyIFJbMjM2XTAwMCBzdXBwb3J0IGJ5IFBhdWwgTS4gQW50b2luZSwgMTk5Ni4KLSAqIEtldmluIEQuIEtpc3NlbGwsIGtldmlua0BtaXBzLmNvbSBhbmQgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDA3IE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIE1hY2llaiBXLiBSb3p5Y2tpCi0gKi8KLSNpZm5kZWYgX0FTTV9NSVBTUkVHU19ICi0jZGVmaW5lIF9BU01fTUlQU1JFR1NfSAotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9oYXphcmRzLmg+Ci0jaW5jbHVkZSA8YXNtL3dhci5oPgotCi0vKgotICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBfX2FzbV9fCi0gKiBpbmxpbmUgYXNzZW1ibGVyLgotICovCi0jaWZuZGVmIF9fU1RSCi0jZGVmaW5lIF9fU1RSKHgpICN4Ci0jZW5kaWYKLSNpZm5kZWYgU1RSCi0jZGVmaW5lIFNUUih4KSBfX1NUUih4KQotI2VuZGlmCi0KLS8qCi0gKiAgQ29uZmlndXJlIGxhbmd1YWdlCi0gKi8KLSNpZmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgX1VMQ0FTVF8KLSNlbHNlCi0jZGVmaW5lIF9VTENBU1RfICh1bnNpZ25lZCBsb25nKQotI2VuZGlmCi0KLS8qCi0gKiBDb3Byb2Nlc3NvciAwIHJlZ2lzdGVyIG5hbWVzCi0gKi8KLSNkZWZpbmUgQ1AwX0lOREVYICQwCi0jZGVmaW5lIENQMF9SQU5ET00gJDEKLSNkZWZpbmUgQ1AwX0VOVFJZTE8wICQyCi0jZGVmaW5lIENQMF9FTlRSWUxPMSAkMwotI2RlZmluZSBDUDBfQ09ORiAkMwotI2RlZmluZSBDUDBfQ09OVEVYVCAkNAotI2RlZmluZSBDUDBfUEFHRU1BU0sgJDUKLSNkZWZpbmUgQ1AwX1dJUkVEICQ2Ci0jZGVmaW5lIENQMF9JTkZPICQ3Ci0jZGVmaW5lIENQMF9CQURWQUREUiAkOAotI2RlZmluZSBDUDBfQ09VTlQgJDkKLSNkZWZpbmUgQ1AwX0VOVFJZSEkgJDEwCi0jZGVmaW5lIENQMF9DT01QQVJFICQxMQotI2RlZmluZSBDUDBfU1RBVFVTICQxMgotI2RlZmluZSBDUDBfQ0FVU0UgJDEzCi0jZGVmaW5lIENQMF9FUEMgJDE0Ci0jZGVmaW5lIENQMF9QUklEICQxNQotI2RlZmluZSBDUDBfQ09ORklHICQxNgotI2RlZmluZSBDUDBfTExBRERSICQxNwotI2RlZmluZSBDUDBfV0FUQ0hMTyAkMTgKLSNkZWZpbmUgQ1AwX1dBVENISEkgJDE5Ci0jZGVmaW5lIENQMF9YQ09OVEVYVCAkMjAKLSNkZWZpbmUgQ1AwX0ZSQU1FTUFTSyAkMjEKLSNkZWZpbmUgQ1AwX0RJQUdOT1NUSUMgJDIyCi0jZGVmaW5lIENQMF9ERUJVRyAkMjMKLSNkZWZpbmUgQ1AwX0RFUEMgJDI0Ci0jZGVmaW5lIENQMF9QRVJGT1JNQU5DRSAkMjUKLSNkZWZpbmUgQ1AwX0VDQyAkMjYKLSNkZWZpbmUgQ1AwX0NBQ0hFRVJSICQyNwotI2RlZmluZSBDUDBfVEFHTE8gJDI4Ci0jZGVmaW5lIENQMF9UQUdISSAkMjkKLSNkZWZpbmUgQ1AwX0VSUk9SRVBDICQzMAotI2RlZmluZSBDUDBfREVTQVZFICQzMQotCi0vKgotICogUjQ2NDAvUjQ2NTAgY3AwIHJlZ2lzdGVyIG5hbWVzLiAgVGhlc2UgcmVnaXN0ZXJzIGFyZSBsaXN0ZWQKLSAqIGhlcmUgb25seSBmb3IgY29tcGxldGVuZXNzOyB3aXRob3V0IE1NVSB0aGVzZSBDUFVzIGFyZSBub3QgdXNlYWJsZQotICogYnkgTGludXguICBBIGZ1dHVyZSBFTEtTIHBvcnQgbWlnaHQgdGFrZSBtYWtlIExpbnV4IHJ1biBvbiB0aGVtCi0gKiB0aG91Z2ggLi4uCi0gKi8KLSNkZWZpbmUgQ1AwX0lCQVNFICQwCi0jZGVmaW5lIENQMF9JQk9VTkQgJDEKLSNkZWZpbmUgQ1AwX0RCQVNFICQyCi0jZGVmaW5lIENQMF9EQk9VTkQgJDMKLSNkZWZpbmUgQ1AwX0NBTEcgJDE3Ci0jZGVmaW5lIENQMF9JV0FUQ0ggJDE4Ci0jZGVmaW5lIENQMF9EV0FUQ0ggJDE5Ci0KLS8qCi0gKiBDb3Byb2Nlc3NvciAwIFNldCAxIHJlZ2lzdGVyIG5hbWVzCi0gKi8KLSNkZWZpbmUgQ1AwX1MxX0RFUlJBRERSMCAgJDI2Ci0jZGVmaW5lIENQMF9TMV9ERVJSQUREUjEgICQyNwotI2RlZmluZSBDUDBfUzFfSU5UQ09OVFJPTCAkMjAKLQotLyoKLSAqIENvcHJvY2Vzc29yIDAgU2V0IDIgcmVnaXN0ZXIgbmFtZXMKLSAqLwotI2RlZmluZSBDUDBfUzJfU1JTQ1RMCSAgJDEyCS8qIE1JUFNSMiAqLwotCi0vKgotICogQ29wcm9jZXNzb3IgMCBTZXQgMyByZWdpc3RlciBuYW1lcwotICovCi0jZGVmaW5lIENQMF9TM19TUlNNQVAJICAkMTIJLyogTUlQU1IyICovCi0KLS8qCi0gKiAgVFgzOSBTZXJpZXMKLSAqLwotI2RlZmluZSBDUDBfVFgzOV9DQUNIRQkkNwotCi0vKgotICogQ29wcm9jZXNzb3IgMSAoRlBVKSByZWdpc3RlciBuYW1lcwotICovCi0jZGVmaW5lIENQMV9SRVZJU0lPTiAgICQwCi0jZGVmaW5lIENQMV9TVEFUVVMgICAgICQzMQotCi0vKgotICogRlBVIFN0YXR1cyBSZWdpc3RlciBWYWx1ZXMKLSAqLwotLyoKLSAqIFN0YXR1cyBSZWdpc3RlciBWYWx1ZXMKLSAqLwotCi0jZGVmaW5lIEZQVV9DU1JfRkxVU0ggICAweDAxMDAwMDAwICAgICAgLyogZmx1c2ggZGVub3JtYWxpc2VkIHJlc3VsdHMgdG8gMCAqLwotI2RlZmluZSBGUFVfQ1NSX0NPTkQgICAgMHgwMDgwMDAwMCAgICAgIC8qICRmY2MwICovCi0jZGVmaW5lIEZQVV9DU1JfQ09ORDAgICAweDAwODAwMDAwICAgICAgLyogJGZjYzAgKi8KLSNkZWZpbmUgRlBVX0NTUl9DT05EMSAgIDB4MDIwMDAwMDAgICAgICAvKiAkZmNjMSAqLwotI2RlZmluZSBGUFVfQ1NSX0NPTkQyICAgMHgwNDAwMDAwMCAgICAgIC8qICRmY2MyICovCi0jZGVmaW5lIEZQVV9DU1JfQ09ORDMgICAweDA4MDAwMDAwICAgICAgLyogJGZjYzMgKi8KLSNkZWZpbmUgRlBVX0NTUl9DT05ENCAgIDB4MTAwMDAwMDAgICAgICAvKiAkZmNjNCAqLwotI2RlZmluZSBGUFVfQ1NSX0NPTkQ1ICAgMHgyMDAwMDAwMCAgICAgIC8qICRmY2M1ICovCi0jZGVmaW5lIEZQVV9DU1JfQ09ORDYgICAweDQwMDAwMDAwICAgICAgLyogJGZjYzYgKi8KLSNkZWZpbmUgRlBVX0NTUl9DT05ENyAgIDB4ODAwMDAwMDAgICAgICAvKiAkZmNjNyAqLwotCi0vKgotICogWCB0aGUgZXhjZXB0aW9uIGNhdXNlIGluZGljYXRvcgotICogRSB0aGUgZXhjZXB0aW9uIGVuYWJsZQotICogUyB0aGUgc3RpY2t5L2ZsYWcgYml0Ci0qLwotI2RlZmluZSBGUFVfQ1NSX0FMTF9YICAgMHgwMDAzZjAwMAotI2RlZmluZSBGUFVfQ1NSX1VOSV9YICAgMHgwMDAyMDAwMAotI2RlZmluZSBGUFVfQ1NSX0lOVl9YICAgMHgwMDAxMDAwMAotI2RlZmluZSBGUFVfQ1NSX0RJVl9YICAgMHgwMDAwODAwMAotI2RlZmluZSBGUFVfQ1NSX09WRl9YICAgMHgwMDAwNDAwMAotI2RlZmluZSBGUFVfQ1NSX1VERl9YICAgMHgwMDAwMjAwMAotI2RlZmluZSBGUFVfQ1NSX0lORV9YICAgMHgwMDAwMTAwMAotCi0jZGVmaW5lIEZQVV9DU1JfQUxMX0UgICAweDAwMDAwZjgwCi0jZGVmaW5lIEZQVV9DU1JfSU5WX0UgICAweDAwMDAwODAwCi0jZGVmaW5lIEZQVV9DU1JfRElWX0UgICAweDAwMDAwNDAwCi0jZGVmaW5lIEZQVV9DU1JfT1ZGX0UgICAweDAwMDAwMjAwCi0jZGVmaW5lIEZQVV9DU1JfVURGX0UgICAweDAwMDAwMTAwCi0jZGVmaW5lIEZQVV9DU1JfSU5FX0UgICAweDAwMDAwMDgwCi0KLSNkZWZpbmUgRlBVX0NTUl9BTExfUyAgIDB4MDAwMDAwN2MKLSNkZWZpbmUgRlBVX0NTUl9JTlZfUyAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRlBVX0NTUl9ESVZfUyAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRlBVX0NTUl9PVkZfUyAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRlBVX0NTUl9VREZfUyAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRlBVX0NTUl9JTkVfUyAgIDB4MDAwMDAwMDQKLQotLyogcm91bmRpbmcgbW9kZSAqLwotI2RlZmluZSBGUFVfQ1NSX1JOICAgICAgMHgwICAgICAvKiBuZWFyZXN0ICovCi0jZGVmaW5lIEZQVV9DU1JfUlogICAgICAweDEgICAgIC8qIHRvd2FyZHMgemVybyAqLwotI2RlZmluZSBGUFVfQ1NSX1JVICAgICAgMHgyICAgICAvKiB0b3dhcmRzICtJbmZpbml0eSAqLwotI2RlZmluZSBGUFVfQ1NSX1JEICAgICAgMHgzICAgICAvKiB0b3dhcmRzIC1JbmZpbml0eSAqLwotCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIFBhZ2VNYXNrIHJlZ2lzdGVyCi0gKi8KLSNpZmRlZiBDT05GSUdfQ1BVX1ZSNDFYWAotCi0vKiBXaHkgZG9lc24ndCBzdHVwaWRpdHkgaHVydCAuLi4gKi8KLQotI2RlZmluZSBQTV8xSwkJMHgwMDAwMDAwMAotI2RlZmluZSBQTV80SwkJMHgwMDAwMTgwMAotI2RlZmluZSBQTV8xNksJCTB4MDAwMDc4MDAKLSNkZWZpbmUgUE1fNjRLCQkweDAwMDFmODAwCi0jZGVmaW5lIFBNXzI1NksJCTB4MDAwN2Y4MDAKLQotI2Vsc2UKLQotI2RlZmluZSBQTV80SwkJMHgwMDAwMDAwMAotI2RlZmluZSBQTV8xNksJCTB4MDAwMDYwMDAKLSNkZWZpbmUgUE1fNjRLCQkweDAwMDFlMDAwCi0jZGVmaW5lIFBNXzI1NksJCTB4MDAwN2UwMDAKLSNkZWZpbmUgUE1fMU0JCTB4MDAxZmUwMDAKLSNkZWZpbmUgUE1fNE0JCTB4MDA3ZmUwMDAKLSNkZWZpbmUgUE1fMTZNCQkweDAxZmZlMDAwCi0jZGVmaW5lIFBNXzY0TQkJMHgwN2ZmZTAwMAotI2RlZmluZSBQTV8yNTZNCQkweDFmZmZlMDAwCi0KLSNlbmRpZgotCi0vKgotICogRGVmYXVsdCBwYWdlIHNpemUgZm9yIGEgZ2l2ZW4ga2VybmVsIGNvbmZpZ3VyYXRpb24KLSAqLwotI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfNEtCCi0jZGVmaW5lIFBNX0RFRkFVTFRfTUFTSwlQTV80SwotI2VsaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzE2S0IpCi0jZGVmaW5lIFBNX0RFRkFVTFRfTUFTSwlQTV8xNksKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV82NEtCKQotI2RlZmluZSBQTV9ERUZBVUxUX01BU0sJUE1fNjRLCi0jZWxzZQotI2Vycm9yIEJhZCBwYWdlIHNpemUgY29uZmlndXJhdGlvbiEKLSNlbmRpZgotCi0KLS8qCi0gKiBWYWx1ZXMgdXNlZCBmb3IgY29tcHV0YXRpb24gb2YgbmV3IHRsYiBlbnRyaWVzCi0gKi8KLSNkZWZpbmUgUExfNEsJCTEyCi0jZGVmaW5lIFBMXzE2SwkJMTQKLSNkZWZpbmUgUExfNjRLCQkxNgotI2RlZmluZSBQTF8yNTZLCQkxOAotI2RlZmluZSBQTF8xTQkJMjAKLSNkZWZpbmUgUExfNE0JCTIyCi0jZGVmaW5lIFBMXzE2TQkJMjQKLSNkZWZpbmUgUExfNjRNCQkyNgotI2RlZmluZSBQTF8yNTZNCQkyOAotCi0vKgotICogUjR4MDAgaW50ZXJydXB0IGVuYWJsZSAvIGNhdXNlIGJpdHMKLSAqLwotI2RlZmluZSBJRV9TVzAgICAgICAgICAgKF9VTENBU1RfKDEpIDw8ICA4KQotI2RlZmluZSBJRV9TVzEgICAgICAgICAgKF9VTENBU1RfKDEpIDw8ICA5KQotI2RlZmluZSBJRV9JUlEwICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEwKQotI2RlZmluZSBJRV9JUlExICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDExKQotI2RlZmluZSBJRV9JUlEyICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEyKQotI2RlZmluZSBJRV9JUlEzICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEzKQotI2RlZmluZSBJRV9JUlE0ICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDE0KQotI2RlZmluZSBJRV9JUlE1ICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDE1KQotCi0vKgotICogUjR4MDAgaW50ZXJydXB0IGNhdXNlIGJpdHMKLSAqLwotI2RlZmluZSBDX1NXMCAgICAgICAgICAgKF9VTENBU1RfKDEpIDw8ICA4KQotI2RlZmluZSBDX1NXMSAgICAgICAgICAgKF9VTENBU1RfKDEpIDw8ICA5KQotI2RlZmluZSBDX0lSUTAgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEwKQotI2RlZmluZSBDX0lSUTEgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDExKQotI2RlZmluZSBDX0lSUTIgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEyKQotI2RlZmluZSBDX0lSUTMgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDEzKQotI2RlZmluZSBDX0lSUTQgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDE0KQotI2RlZmluZSBDX0lSUTUgICAgICAgICAgKF9VTENBU1RfKDEpIDw8IDE1KQotCi0vKgotICogQml0ZmllbGRzIGluIHRoZSBSNHh4MCBjcDAgc3RhdHVzIHJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgU1QwX0lFCQkJMHgwMDAwMDAwMQotI2RlZmluZSBTVDBfRVhMCQkJMHgwMDAwMDAwMgotI2RlZmluZSBTVDBfRVJMCQkJMHgwMDAwMDAwNAotI2RlZmluZSBTVDBfS1NVCQkJMHgwMDAwMDAxOAotIyAgZGVmaW5lIEtTVV9VU0VSCQkweDAwMDAwMDEwCi0jICBkZWZpbmUgS1NVX1NVUEVSVklTT1IJMHgwMDAwMDAwOAotIyAgZGVmaW5lIEtTVV9LRVJORUwJCTB4MDAwMDAwMDAKLSNkZWZpbmUgU1QwX1VYCQkJMHgwMDAwMDAyMAotI2RlZmluZSBTVDBfU1gJCQkweDAwMDAwMDQwCi0jZGVmaW5lIFNUMF9LWCAJCQkweDAwMDAwMDgwCi0jZGVmaW5lIFNUMF9ERQkJCTB4MDAwMTAwMDAKLSNkZWZpbmUgU1QwX0NFCQkJMHgwMDAyMDAwMAotCi0vKgotICogU2V0dGluZyBjMF9zdGF0dXMuY28gZW5hYmxlcyBIaXRfV3JpdGViYWNrIGFuZCBIaXRfV3JpdGViYWNrX0ludmFsaWRhdGUKLSAqIGNhY2hlb3BzIGluIHVzZXJzcGFjZS4gIFRoaXMgYml0IGV4aXN0cyBvbmx5IG9uIFJNNzAwMCBhbmQgUk05MDAwCi0gKiBwcm9jZXNzb3JzLgotICovCi0jZGVmaW5lIFNUMF9DTwkJCTB4MDgwMDAwMDAKLQotLyoKLSAqIEJpdGZpZWxkcyBpbiB0aGUgUlsyM10wMDAgY3AwIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTVDBfSUVDICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNUMF9LVUMJCQkweDAwMDAwMDAyCi0jZGVmaW5lIFNUMF9JRVAJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFNUMF9LVVAJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIFNUMF9JRU8JCQkweDAwMDAwMDEwCi0jZGVmaW5lIFNUMF9LVU8JCQkweDAwMDAwMDIwCi0vKiBiaXRzIDYgJiA3IGFyZSByZXNlcnZlZCBvbiBSWzIzXTAwMCAqLwotI2RlZmluZSBTVDBfSVNDCQkJMHgwMDAxMDAwMAotI2RlZmluZSBTVDBfU1dDCQkJMHgwMDAyMDAwMAotI2RlZmluZSBTVDBfQ00JCQkweDAwMDgwMDAwCi0KLS8qCi0gKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBSNDY0MC9SNDY1MAotICovCi0jZGVmaW5lIFNUMF9VTQkJCShfVUxDQVNUXygxKSA8PCAgNCkKLSNkZWZpbmUgU1QwX0lMCQkJKF9VTENBU1RfKDEpIDw8IDIzKQotI2RlZmluZSBTVDBfREwJCQkoX1VMQ0FTVF8oMSkgPDwgMjQpCi0KLS8qCi0gKiBFbmFibGUgdGhlIE1JUFMgTURNWCBhbmQgRFNQIEFTRXMKLSAqLwotI2RlZmluZSBTVDBfTVgJCQkweDAxMDAwMDAwCi0KLS8qCi0gKiBCaXRmaWVsZHMgaW4gdGhlIFRYMzkgZmFtaWx5IENQMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMKLSAqLwotI2RlZmluZSBUWDM5X0NPTkZfSUNTX1NISUZUCTE5Ci0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfTUFTSwkweDAwMzgwMDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfMUtCIAkweDAwMDAwMDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfMktCIAkweDAwMDgwMDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfNEtCIAkweDAwMTAwMDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfOEtCIAkweDAwMTgwMDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9JQ1NfMTZLQiAJMHgwMDIwMDAwMAotCi0jZGVmaW5lIFRYMzlfQ09ORl9EQ1NfU0hJRlQJMTYKLSNkZWZpbmUgVFgzOV9DT05GX0RDU19NQVNLCTB4MDAwNzAwMDAKLSNkZWZpbmUgVFgzOV9DT05GX0RDU18xS0IgCTB4MDAwMDAwMDAKLSNkZWZpbmUgVFgzOV9DT05GX0RDU18yS0IgCTB4MDAwMTAwMDAKLSNkZWZpbmUgVFgzOV9DT05GX0RDU180S0IgCTB4MDAwMjAwMDAKLSNkZWZpbmUgVFgzOV9DT05GX0RDU184S0IgCTB4MDAwMzAwMDAKLSNkZWZpbmUgVFgzOV9DT05GX0RDU18xNktCIAkweDAwMDQwMDAwCi0KLSNkZWZpbmUgVFgzOV9DT05GX0NXRk9OIAkweDAwMDA0MDAwCi0jZGVmaW5lIFRYMzlfQ09ORl9XQk9OICAJMHgwMDAwMjAwMAotI2RlZmluZSBUWDM5X0NPTkZfUkZfU0hJRlQJMTAKLSNkZWZpbmUgVFgzOV9DT05GX1JGX01BU0sJMHgwMDAwMGMwMAotI2RlZmluZSBUWDM5X0NPTkZfRE9aRQkJMHgwMDAwMDIwMAotI2RlZmluZSBUWDM5X0NPTkZfSEFMVAkJMHgwMDAwMDEwMAotI2RlZmluZSBUWDM5X0NPTkZfTE9DSwkJMHgwMDAwMDA4MAotI2RlZmluZSBUWDM5X0NPTkZfSUNFCQkweDAwMDAwMDIwCi0jZGVmaW5lIFRYMzlfQ09ORl9EQ0UJCTB4MDAwMDAwMTAKLSNkZWZpbmUgVFgzOV9DT05GX0lSU0laRV9TSElGVAkyCi0jZGVmaW5lIFRYMzlfQ09ORl9JUlNJWkVfTUFTSwkweDAwMDAwMDBjCi0jZGVmaW5lIFRYMzlfQ09ORl9EUlNJWkVfU0hJRlQJMAotI2RlZmluZSBUWDM5X0NPTkZfRFJTSVpFX01BU0sJMHgwMDAwMDAwMwotCi0vKgotICogU3RhdHVzIHJlZ2lzdGVyIGJpdHMgYXZhaWxhYmxlIGluIGFsbCBNSVBTIENQVXMuCi0gKi8KLSNkZWZpbmUgU1QwX0lNCQkJMHgwMDAwZmYwMAotI2RlZmluZSAgU1RBVFVTQl9JUDAJCTgKLSNkZWZpbmUgIFNUQVRVU0ZfSVAwCQkoX1VMQ0FTVF8oMSkgPDwgIDgpCi0jZGVmaW5lICBTVEFUVVNCX0lQMQkJOQotI2RlZmluZSAgU1RBVFVTRl9JUDEJCShfVUxDQVNUXygxKSA8PCAgOSkKLSNkZWZpbmUgIFNUQVRVU0JfSVAyCQkxMAotI2RlZmluZSAgU1RBVFVTRl9JUDIJCShfVUxDQVNUXygxKSA8PCAxMCkKLSNkZWZpbmUgIFNUQVRVU0JfSVAzCQkxMQotI2RlZmluZSAgU1RBVFVTRl9JUDMJCShfVUxDQVNUXygxKSA8PCAxMSkKLSNkZWZpbmUgIFNUQVRVU0JfSVA0CQkxMgotI2RlZmluZSAgU1RBVFVTRl9JUDQJCShfVUxDQVNUXygxKSA8PCAxMikKLSNkZWZpbmUgIFNUQVRVU0JfSVA1CQkxMwotI2RlZmluZSAgU1RBVFVTRl9JUDUJCShfVUxDQVNUXygxKSA8PCAxMykKLSNkZWZpbmUgIFNUQVRVU0JfSVA2CQkxNAotI2RlZmluZSAgU1RBVFVTRl9JUDYJCShfVUxDQVNUXygxKSA8PCAxNCkKLSNkZWZpbmUgIFNUQVRVU0JfSVA3CQkxNQotI2RlZmluZSAgU1RBVFVTRl9JUDcJCShfVUxDQVNUXygxKSA8PCAxNSkKLSNkZWZpbmUgIFNUQVRVU0JfSVA4CQkwCi0jZGVmaW5lICBTVEFUVVNGX0lQOAkJKF9VTENBU1RfKDEpIDw8ICAwKQotI2RlZmluZSAgU1RBVFVTQl9JUDkJCTEKLSNkZWZpbmUgIFNUQVRVU0ZfSVA5CQkoX1VMQ0FTVF8oMSkgPDwgIDEpCi0jZGVmaW5lICBTVEFUVVNCX0lQMTAJCTIKLSNkZWZpbmUgIFNUQVRVU0ZfSVAxMAkJKF9VTENBU1RfKDEpIDw8ICAyKQotI2RlZmluZSAgU1RBVFVTQl9JUDExCQkzCi0jZGVmaW5lICBTVEFUVVNGX0lQMTEJCShfVUxDQVNUXygxKSA8PCAgMykKLSNkZWZpbmUgIFNUQVRVU0JfSVAxMgkJNAotI2RlZmluZSAgU1RBVFVTRl9JUDEyCQkoX1VMQ0FTVF8oMSkgPDwgIDQpCi0jZGVmaW5lICBTVEFUVVNCX0lQMTMJCTUKLSNkZWZpbmUgIFNUQVRVU0ZfSVAxMwkJKF9VTENBU1RfKDEpIDw8ICA1KQotI2RlZmluZSAgU1RBVFVTQl9JUDE0CQk2Ci0jZGVmaW5lICBTVEFUVVNGX0lQMTQJCShfVUxDQVNUXygxKSA8PCAgNikKLSNkZWZpbmUgIFNUQVRVU0JfSVAxNQkJNwotI2RlZmluZSAgU1RBVFVTRl9JUDE1CQkoX1VMQ0FTVF8oMSkgPDwgIDcpCi0jZGVmaW5lIFNUMF9DSAkJCTB4MDAwNDAwMDAKLSNkZWZpbmUgU1QwX1NSCQkJMHgwMDEwMDAwMAotI2RlZmluZSBTVDBfVFMJCQkweDAwMjAwMDAwCi0jZGVmaW5lIFNUMF9CRVYJCQkweDAwNDAwMDAwCi0jZGVmaW5lIFNUMF9SRQkJCTB4MDIwMDAwMDAKLSNkZWZpbmUgU1QwX0ZSCQkJMHgwNDAwMDAwMAotI2RlZmluZSBTVDBfQ1UJCQkweGYwMDAwMDAwCi0jZGVmaW5lIFNUMF9DVTAJCQkweDEwMDAwMDAwCi0jZGVmaW5lIFNUMF9DVTEJCQkweDIwMDAwMDAwCi0jZGVmaW5lIFNUMF9DVTIJCQkweDQwMDAwMDAwCi0jZGVmaW5lIFNUMF9DVTMJCQkweDgwMDAwMDAwCi0jZGVmaW5lIFNUMF9YWAkJCTB4ODAwMDAwMDAJLyogTUlQUyBJViBuYW1pbmcgKi8KLQotLyoKLSAqIEJpdGZpZWxkcyBhbmQgYml0IG51bWJlcnMgaW4gdGhlIGNvcHJvY2Vzc29yIDAgY2F1c2UgcmVnaXN0ZXIuCi0gKgotICogUmVmZXIgdG8geW91ciBNSVBTIFI0eHgwIG1hbnVhbCwgY2hhcHRlciA1IGZvciBleHBsYW5hdGlvbi4KLSAqLwotI2RlZmluZSAgQ0FVU0VCX0VYQ0NPREUJCTIKLSNkZWZpbmUgIENBVVNFRl9FWENDT0RFCQkoX1VMQ0FTVF8oMzEpICA8PCAgMikKLSNkZWZpbmUgIENBVVNFQl9JUAkJOAotI2RlZmluZSAgQ0FVU0VGX0lQCQkoX1VMQ0FTVF8oMjU1KSA8PCAgOCkKLSNkZWZpbmUgIENBVVNFQl9JUDAJCTgKLSNkZWZpbmUgIENBVVNFRl9JUDAJCShfVUxDQVNUXygxKSAgIDw8ICA4KQotI2RlZmluZSAgQ0FVU0VCX0lQMQkJOQotI2RlZmluZSAgQ0FVU0VGX0lQMQkJKF9VTENBU1RfKDEpICAgPDwgIDkpCi0jZGVmaW5lICBDQVVTRUJfSVAyCQkxMAotI2RlZmluZSAgQ0FVU0VGX0lQMgkJKF9VTENBU1RfKDEpICAgPDwgMTApCi0jZGVmaW5lICBDQVVTRUJfSVAzCQkxMQotI2RlZmluZSAgQ0FVU0VGX0lQMwkJKF9VTENBU1RfKDEpICAgPDwgMTEpCi0jZGVmaW5lICBDQVVTRUJfSVA0CQkxMgotI2RlZmluZSAgQ0FVU0VGX0lQNAkJKF9VTENBU1RfKDEpICAgPDwgMTIpCi0jZGVmaW5lICBDQVVTRUJfSVA1CQkxMwotI2RlZmluZSAgQ0FVU0VGX0lQNQkJKF9VTENBU1RfKDEpICAgPDwgMTMpCi0jZGVmaW5lICBDQVVTRUJfSVA2CQkxNAotI2RlZmluZSAgQ0FVU0VGX0lQNgkJKF9VTENBU1RfKDEpICAgPDwgMTQpCi0jZGVmaW5lICBDQVVTRUJfSVA3CQkxNQotI2RlZmluZSAgQ0FVU0VGX0lQNwkJKF9VTENBU1RfKDEpICAgPDwgMTUpCi0jZGVmaW5lICBDQVVTRUJfSVYJCTIzCi0jZGVmaW5lICBDQVVTRUZfSVYJCShfVUxDQVNUXygxKSAgIDw8IDIzKQotI2RlZmluZSAgQ0FVU0VCX0NFCQkyOAotI2RlZmluZSAgQ0FVU0VGX0NFCQkoX1VMQ0FTVF8oMykgICA8PCAyOCkKLSNkZWZpbmUgIENBVVNFQl9CRAkJMzEKLSNkZWZpbmUgIENBVVNFRl9CRAkJKF9VTENBU1RfKDEpICAgPDwgMzEpCi0KLS8qCi0gKiBCaXRzIGluIHRoZSBjb3Byb2Nlc3NvciAwIGNvbmZpZyByZWdpc3Rlci4KLSAqLwotLyogR2VuZXJpYyBiaXRzLiAgKi8KLSNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9OT19XQQkJMAotI2RlZmluZSBDT05GX0NNX0NBQ0hBQkxFX1dBCQkxCi0jZGVmaW5lIENPTkZfQ01fVU5DQUNIRUQJCTIKLSNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9OT05DT0hFUkVOVAkzCi0jZGVmaW5lIENPTkZfQ01fQ0FDSEFCTEVfQ0UJCTQKLSNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9DT1cJCTUKLSNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9DVVcJCTYKLSNkZWZpbmUgQ09ORl9DTV9DQUNIQUJMRV9BQ0NFTEVSQVRFRAk3Ci0jZGVmaW5lIENPTkZfQ01fQ01BU0sJCQk3Ci0jZGVmaW5lIENPTkZfQkUJCQkoX1VMQ0FTVF8oMSkgPDwgMTUpCi0KLS8qIEJpdHMgY29tbW9uIHRvIHZhcmlvdXMgcHJvY2Vzc29ycy4gICovCi0jZGVmaW5lIENPTkZfQ1UJCQkoX1VMQ0FTVF8oMSkgPDwgIDMpCi0jZGVmaW5lIENPTkZfREIJCQkoX1VMQ0FTVF8oMSkgPDwgIDQpCi0jZGVmaW5lIENPTkZfSUIJCQkoX1VMQ0FTVF8oMSkgPDwgIDUpCi0jZGVmaW5lIENPTkZfREMJCQkoX1VMQ0FTVF8oNykgPDwgIDYpCi0jZGVmaW5lIENPTkZfSUMJCQkoX1VMQ0FTVF8oNykgPDwgIDkpCi0jZGVmaW5lIENPTkZfRUIJCQkoX1VMQ0FTVF8oMSkgPDwgMTMpCi0jZGVmaW5lIENPTkZfRU0JCQkoX1VMQ0FTVF8oMSkgPDwgMTQpCi0jZGVmaW5lIENPTkZfU00JCQkoX1VMQ0FTVF8oMSkgPDwgMTYpCi0jZGVmaW5lIENPTkZfU0MJCQkoX1VMQ0FTVF8oMSkgPDwgMTcpCi0jZGVmaW5lIENPTkZfRVcJCQkoX1VMQ0FTVF8oMykgPDwgMTgpCi0jZGVmaW5lIENPTkZfRVAJCQkoX1VMQ0FTVF8oMTUpPDwgMjQpCi0jZGVmaW5lIENPTkZfRUMJCQkoX1VMQ0FTVF8oNykgPDwgMjgpCi0jZGVmaW5lIENPTkZfQ00JCQkoX1VMQ0FTVF8oMSkgPDwgMzEpCi0KLS8qIEJpdHMgc3BlY2lmaWMgdG8gdGhlIFI0eHgwLiAgKi8KLSNkZWZpbmUgUjRLX0NPTkZfU1cJCShfVUxDQVNUXygxKSA8PCAyMCkKLSNkZWZpbmUgUjRLX0NPTkZfU1MJCShfVUxDQVNUXygxKSA8PCAyMSkKLSNkZWZpbmUgUjRLX0NPTkZfU0IJCShfVUxDQVNUXygzKSA8PCAyMikKLQotLyogQml0cyBzcGVjaWZpYyB0byB0aGUgUjUwMDAuICAqLwotI2RlZmluZSBSNUtfQ09ORl9TRQkJKF9VTENBU1RfKDEpIDw8IDEyKQotI2RlZmluZSBSNUtfQ09ORl9TUwkJKF9VTENBU1RfKDMpIDw8IDIwKQotCi0vKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBSTTcwMDAuICAqLwotI2RlZmluZSBSTTdLX0NPTkZfU0UJCShfVUxDQVNUXygxKSA8PCAgMykKLSNkZWZpbmUgUk03S19DT05GX1RFCQkoX1VMQ0FTVF8oMSkgPDwgMTIpCi0jZGVmaW5lIFJNN0tfQ09ORl9DTEsJCShfVUxDQVNUXygxKSA8PCAxNikKLSNkZWZpbmUgUk03S19DT05GX1RDCQkoX1VMQ0FTVF8oMSkgPDwgMTcpCi0jZGVmaW5lIFJNN0tfQ09ORl9TSQkJKF9VTENBU1RfKDMpIDw8IDIwKQotI2RlZmluZSBSTTdLX0NPTkZfU0MJCShfVUxDQVNUXygxKSA8PCAzMSkKLQotLyogQml0cyBzcGVjaWZpYyB0byB0aGUgUjEwMDAwLiAgKi8KLSNkZWZpbmUgUjEwS19DT05GX0ROCQkoX1VMQ0FTVF8oMykgPDwgIDMpCi0jZGVmaW5lIFIxMEtfQ09ORl9DVAkJKF9VTENBU1RfKDEpIDw8ICA1KQotI2RlZmluZSBSMTBLX0NPTkZfUEUJCShfVUxDQVNUXygxKSA8PCAgNikKLSNkZWZpbmUgUjEwS19DT05GX1BNCQkoX1VMQ0FTVF8oMykgPDwgIDcpCi0jZGVmaW5lIFIxMEtfQ09ORl9FQwkJKF9VTENBU1RfKDE1KTw8ICA5KQotI2RlZmluZSBSMTBLX0NPTkZfU0IJCShfVUxDQVNUXygxKSA8PCAxMykKLSNkZWZpbmUgUjEwS19DT05GX1NLCQkoX1VMQ0FTVF8oMSkgPDwgMTQpCi0jZGVmaW5lIFIxMEtfQ09ORl9TUwkJKF9VTENBU1RfKDcpIDw8IDE2KQotI2RlZmluZSBSMTBLX0NPTkZfU0MJCShfVUxDQVNUXyg3KSA8PCAxOSkKLSNkZWZpbmUgUjEwS19DT05GX0RDCQkoX1VMQ0FTVF8oNykgPDwgMjYpCi0jZGVmaW5lIFIxMEtfQ09ORl9JQwkJKF9VTENBU1RfKDcpIDw8IDI5KQotCi0vKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBWUjQxeHguICAqLwotI2RlZmluZSBWUjQxX0NPTkZfQ1MJCShfVUxDQVNUXygxKSA8PCAxMikKLSNkZWZpbmUgVlI0MV9DT05GX1A0SwkJKF9VTENBU1RfKDEpIDw8IDEzKQotI2RlZmluZSBWUjQxX0NPTkZfQlAJCShfVUxDQVNUXygxKSA8PCAxNikKLSNkZWZpbmUgVlI0MV9DT05GX00xNgkJKF9VTENBU1RfKDEpIDw8IDIwKQotI2RlZmluZSBWUjQxX0NPTkZfQUQJCShfVUxDQVNUXygxKSA8PCAyMykKLQotLyogQml0cyBzcGVjaWZpYyB0byB0aGUgUjMweHguICAqLwotI2RlZmluZSBSMzBYWF9DT05GX0ZETQkJKF9VTENBU1RfKDEpIDw8IDE5KQotI2RlZmluZSBSMzBYWF9DT05GX1JFVgkJKF9VTENBU1RfKDEpIDw8IDIyKQotI2RlZmluZSBSMzBYWF9DT05GX0FDCQkoX1VMQ0FTVF8oMSkgPDwgMjMpCi0jZGVmaW5lIFIzMFhYX0NPTkZfUkYJCShfVUxDQVNUXygxKSA8PCAyNCkKLSNkZWZpbmUgUjMwWFhfQ09ORl9IQUxUCQkoX1VMQ0FTVF8oMSkgPDwgMjUpCi0jZGVmaW5lIFIzMFhYX0NPTkZfRlBJTlQJKF9VTENBU1RfKDcpIDw8IDI2KQotI2RlZmluZSBSMzBYWF9DT05GX0RCUgkJKF9VTENBU1RfKDEpIDw8IDI5KQotI2RlZmluZSBSMzBYWF9DT05GX1NCCQkoX1VMQ0FTVF8oMSkgPDwgMzApCi0jZGVmaW5lIFIzMFhYX0NPTkZfTE9DSwkJKF9VTENBU1RfKDEpIDw8IDMxKQotCi0vKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBUWDQ5LiAgKi8KLSNkZWZpbmUgVFg0OV9DT05GX0RDCQkoX1VMQ0FTVF8oMSkgPDwgMTYpCi0jZGVmaW5lIFRYNDlfQ09ORl9JQwkJKF9VTENBU1RfKDEpIDw8IDE3KSAgLyogY29uZmxpY3Qgd2l0aCBDT05GX1NDICovCi0jZGVmaW5lIFRYNDlfQ09ORl9IQUxUCQkoX1VMQ0FTVF8oMSkgPDwgMTgpCi0jZGVmaW5lIFRYNDlfQ09ORl9DV0ZPTgkJKF9VTENBU1RfKDEpIDw8IDI3KQotCi0vKiBCaXRzIHNwZWNpZmljIHRvIHRoZSBNSVBTMzIvNjQgUFJBLiAgKi8KLSNkZWZpbmUgTUlQU19DT05GX01UCQkoX1VMQ0FTVF8oNykgPDwgIDcpCi0jZGVmaW5lIE1JUFNfQ09ORl9BUgkJKF9VTENBU1RfKDcpIDw8IDEwKQotI2RlZmluZSBNSVBTX0NPTkZfQVQJCShfVUxDQVNUXygzKSA8PCAxMykKLSNkZWZpbmUgTUlQU19DT05GX00JCShfVUxDQVNUXygxKSA8PCAzMSkKLQotLyoKLSAqIEJpdHMgaW4gdGhlIE1JUFMzMi82NCBQUkEgY29wcm9jZXNzb3IgMCBjb25maWcgcmVnaXN0ZXJzIDEgYW5kIGFib3ZlLgotICovCi0jZGVmaW5lIE1JUFNfQ09ORjFfRlAJCShfVUxDQVNUXygxKSA8PCAgMCkKLSNkZWZpbmUgTUlQU19DT05GMV9FUAkJKF9VTENBU1RfKDEpIDw8ICAxKQotI2RlZmluZSBNSVBTX0NPTkYxX0NBCQkoX1VMQ0FTVF8oMSkgPDwgIDIpCi0jZGVmaW5lIE1JUFNfQ09ORjFfV1IJCShfVUxDQVNUXygxKSA8PCAgMykKLSNkZWZpbmUgTUlQU19DT05GMV9QQwkJKF9VTENBU1RfKDEpIDw8ICA0KQotI2RlZmluZSBNSVBTX0NPTkYxX01ECQkoX1VMQ0FTVF8oMSkgPDwgIDUpCi0jZGVmaW5lIE1JUFNfQ09ORjFfQzIJCShfVUxDQVNUXygxKSA8PCAgNikKLSNkZWZpbmUgTUlQU19DT05GMV9EQQkJKF9VTENBU1RfKDcpIDw8ICA3KQotI2RlZmluZSBNSVBTX0NPTkYxX0RMCQkoX1VMQ0FTVF8oNykgPDwgMTApCi0jZGVmaW5lIE1JUFNfQ09ORjFfRFMJCShfVUxDQVNUXyg3KSA8PCAxMykKLSNkZWZpbmUgTUlQU19DT05GMV9JQQkJKF9VTENBU1RfKDcpIDw8IDE2KQotI2RlZmluZSBNSVBTX0NPTkYxX0lMCQkoX1VMQ0FTVF8oNykgPDwgMTkpCi0jZGVmaW5lIE1JUFNfQ09ORjFfSVMJCShfVUxDQVNUXyg3KSA8PCAyMikKLSNkZWZpbmUgTUlQU19DT05GMV9UTEJTCQkoX1VMQ0FTVF8oNjMpPDwgMjUpCi0KLSNkZWZpbmUgTUlQU19DT05GMl9TQQkJKF9VTENBU1RfKDE1KTw8ICAwKQotI2RlZmluZSBNSVBTX0NPTkYyX1NMCQkoX1VMQ0FTVF8oMTUpPDwgIDQpCi0jZGVmaW5lIE1JUFNfQ09ORjJfU1MJCShfVUxDQVNUXygxNSk8PCAgOCkKLSNkZWZpbmUgTUlQU19DT05GMl9TVQkJKF9VTENBU1RfKDE1KTw8IDEyKQotI2RlZmluZSBNSVBTX0NPTkYyX1RBCQkoX1VMQ0FTVF8oMTUpPDwgMTYpCi0jZGVmaW5lIE1JUFNfQ09ORjJfVEwJCShfVUxDQVNUXygxNSk8PCAyMCkKLSNkZWZpbmUgTUlQU19DT05GMl9UUwkJKF9VTENBU1RfKDE1KTw8IDI0KQotI2RlZmluZSBNSVBTX0NPTkYyX1RVCQkoX1VMQ0FTVF8oNykgPDwgMjgpCi0KLSNkZWZpbmUgTUlQU19DT05GM19UTAkJKF9VTENBU1RfKDEpIDw8ICAwKQotI2RlZmluZSBNSVBTX0NPTkYzX1NNCQkoX1VMQ0FTVF8oMSkgPDwgIDEpCi0jZGVmaW5lIE1JUFNfQ09ORjNfTVQJCShfVUxDQVNUXygxKSA8PCAgMikKLSNkZWZpbmUgTUlQU19DT05GM19TUAkJKF9VTENBU1RfKDEpIDw8ICA0KQotI2RlZmluZSBNSVBTX0NPTkYzX1ZJTlQJCShfVUxDQVNUXygxKSA8PCAgNSkKLSNkZWZpbmUgTUlQU19DT05GM19WRUlDCQkoX1VMQ0FTVF8oMSkgPDwgIDYpCi0jZGVmaW5lIE1JUFNfQ09ORjNfTFBBCQkoX1VMQ0FTVF8oMSkgPDwgIDcpCi0jZGVmaW5lIE1JUFNfQ09ORjNfRFNQCQkoX1VMQ0FTVF8oMSkgPDwgMTApCi0jZGVmaW5lIE1JUFNfQ09ORjNfVUxSSQkJKF9VTENBU1RfKDEpIDw8IDEzKQotCi0jZGVmaW5lIE1JUFNfQ09ORjdfV0lJCQkoX1VMQ0FTVF8oMSkgPDwgMzEpCi0KLSNkZWZpbmUgTUlQU19DT05GN19SUFMJCShfVUxDQVNUXygxKSA8PCAyKQotCi0KLS8qCi0gKiBCaXRzIGluIHRoZSBNSVBTMzIvNjQgY29wcm9jZXNzb3IgMSAoRlBVKSByZXZpc2lvbiByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSVBTX0ZQSVJfUwkJKF9VTENBU1RfKDEpIDw8IDE2KQotI2RlZmluZSBNSVBTX0ZQSVJfRAkJKF9VTENBU1RfKDEpIDw8IDE3KQotI2RlZmluZSBNSVBTX0ZQSVJfUFMJCShfVUxDQVNUXygxKSA8PCAxOCkKLSNkZWZpbmUgTUlQU19GUElSXzNECQkoX1VMQ0FTVF8oMSkgPDwgMTkpCi0jZGVmaW5lIE1JUFNfRlBJUl9XCQkoX1VMQ0FTVF8oMSkgPDwgMjApCi0jZGVmaW5lIE1JUFNfRlBJUl9MCQkoX1VMQ0FTVF8oMSkgPDwgMjEpCi0jZGVmaW5lIE1JUFNfRlBJUl9GNjQJCShfVUxDQVNUXygxKSA8PCAyMikKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyoKLSAqIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIFIxMDAwMCBwZXJmb3JtYW5jZSBjb3VudGVycy4gIFRoZXNlIGFyZSBiYXNpY2FsbHkKLSAqIG1mYzAgYW5kIG10YzAgaW5zdHJ1Y3Rpb25zIGZyb20gYW5kIHRvIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIHdpdGggYSA1LWJpdAotICogcGVyZm9ybWFuY2UgY291bnRlciBudW1iZXIgZW5jb2RlZCBpbnRvIGJpdHMgMSAuLi4gNSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gKiBPbmx5IHBlcmZvcm1hbmNlIGNvdW50ZXJzIDAgdG8gMSBhY3R1YWxseSBleGlzdCwgc28gZm9yIGEgbm9uLVIxMDAwMCBhd2FyZQotICogZGlzYXNzZW1ibGVyIHRoZXNlIHdpbGwgbG9vayBsaWtlIGFuIGFjY2VzcyB0byBzZWwgMCBvciAxLgotICovCi0jZGVmaW5lIHJlYWRfcjEwa19wZXJmX2NudHIoY291bnRlcikJCQkJXAotKHsJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgX19yZXM7CQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JIm1mcGNcdCUwLCAlMSIJCQkJCQlcCi0gICAgICAgIDogIj1yIiAoX19yZXMpCQkJCQkJXAotCTogImkiIChjb3VudGVyKSk7CQkJCQlcCi0JCQkJCQkJCVwKLSAgICAgICAgX19yZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgd3JpdGVfcjEwa19wZXJmX2NudHIoY291bnRlcix2YWwpICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7CQkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JIm10cGNcdCUwLCAlMSIJCQkJCQlcCi0JOgkJCQkJCQlcCi0JOiAiciIgKHZhbCksICJpIiAoY291bnRlcikpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHJlYWRfcjEwa19wZXJmX2V2ZW50KGNvdW50ZXIpCQkJCVwKLSh7CQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fcmVzOwkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCSJtZnBzXHQlMCwgJTEiCQkJCQkJXAotICAgICAgICA6ICI9ciIgKF9fcmVzKQkJCQkJCVwKLQk6ICJpIiAoY291bnRlcikpOwkJCQkJXAotCQkJCQkJCQlcCi0gICAgICAgIF9fcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHdyaXRlX3IxMGtfcGVyZl9jbnRsKGNvdW50ZXIsdmFsKSAgICAgICAgICAgICAgICAgICAgICAgXAotZG8gewkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCSJtdHBzXHQlMCwgJTEiCQkJCQkJXAotCToJCQkJCQkJXAotCTogInIiICh2YWwpLCAiaSIgKGNvdW50ZXIpKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotCi0vKgotICogTWFjcm9zIHRvIGFjY2VzcyB0aGUgc3lzdGVtIGNvbnRyb2wgY29wcm9jZXNzb3IKLSAqLwotCi0jZGVmaW5lIF9fcmVhZF8zMmJpdF9jMF9yZWdpc3Rlcihzb3VyY2UsIHNlbCkJCQkJXAotKHsgaW50IF9fcmVzOwkJCQkJCQkJXAotCWlmIChzZWwgPT0gMCkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSJtZmMwXHQlMCwgIiAjc291cmNlICJcblx0IgkJCVwKLQkJCTogIj1yIiAoX19yZXMpKTsJCQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldFx0bWlwczMyXG5cdCIJCQkJXAotCQkJIm1mYzBcdCUwLCAiICNzb3VyY2UgIiwgIiAjc2VsICJcblx0IgkJXAotCQkJIi5zZXRcdG1pcHMwXG5cdCIJCQkJXAotCQkJOiAiPXIiIChfX3JlcykpOwkJCQlcCi0JX19yZXM7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fcmVhZF82NGJpdF9jMF9yZWdpc3Rlcihzb3VyY2UsIHNlbCkJCQkJXAotKHsgdW5zaWduZWQgbG9uZyBsb25nIF9fcmVzOwkJCQkJCVwKLQlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQpCQkJCQlcCi0JCV9fcmVzID0gX19yZWFkXzY0Yml0X2MwX3NwbGl0KHNvdXJjZSwgc2VsKTsJCVwKLQllbHNlIGlmIChzZWwgPT0gMCkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIi5zZXRcdG1pcHMzXG5cdCIJCQkJXAotCQkJImRtZmMwXHQlMCwgIiAjc291cmNlICJcblx0IgkJCVwKLQkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKLQkJCTogIj1yIiAoX19yZXMpKTsJCQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAotCQkJImRtZmMwXHQlMCwgIiAjc291cmNlICIsICIgI3NlbCAiXG5cdCIJCVwKLQkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKLQkJCTogIj1yIiAoX19yZXMpKTsJCQkJXAotCV9fcmVzOwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKHJlZ2lzdGVyLCBzZWwsIHZhbHVlKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKHNlbCA9PSAwKQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIm10YzBcdCV6MCwgIiAjcmVnaXN0ZXIgIlxuXHQiCQkJXAotCQkJOiA6ICJKciIgKCh1bnNpZ25lZCBpbnQpKHZhbHVlKSkpOwkJXAotCWVsc2UJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldFx0bWlwczMyXG5cdCIJCQkJXAotCQkJIm10YzBcdCV6MCwgIiAjcmVnaXN0ZXIgIiwgIiAjc2VsICJcblx0IglcCi0JCQkiLnNldFx0bWlwczAiCQkJCQlcCi0JCQk6IDogIkpyIiAoKHVuc2lnbmVkIGludCkodmFsdWUpKSk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fd3JpdGVfNjRiaXRfYzBfcmVnaXN0ZXIocmVnaXN0ZXIsIHNlbCwgdmFsdWUpCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQpCQkJCQlcCi0JCV9fd3JpdGVfNjRiaXRfYzBfc3BsaXQocmVnaXN0ZXIsIHNlbCwgdmFsdWUpOwkJXAotCWVsc2UgaWYgKHNlbCA9PSAwKQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldFx0bWlwczNcblx0IgkJCQlcCi0JCQkiZG10YzBcdCV6MCwgIiAjcmVnaXN0ZXIgIlxuXHQiCQkJXAotCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAotCQkJOiA6ICJKciIgKHZhbHVlKSk7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIi5zZXRcdG1pcHM2NFxuXHQiCQkJCVwKLQkJCSJkbXRjMFx0JXowLCAiICNyZWdpc3RlciAiLCAiICNzZWwgIlxuXHQiCVwKLQkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKLQkJCTogOiAiSnIiICh2YWx1ZSkpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcihyZWcsIHNlbCkJCQkJXAotCSgoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQpID8JCQkJCVwKLQkodW5zaWduZWQgbG9uZykgX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKHJlZywgc2VsKSA6CQlcCi0JKHVuc2lnbmVkIGxvbmcpIF9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcihyZWcsIHNlbCkpCi0KLSNkZWZpbmUgX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcihyZWcsIHNlbCwgdmFsKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA0KQkJCQkJXAotCQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKHJlZywgc2VsLCB2YWwpOwkJXAotCWVsc2UJCQkJCQkJCVwKLQkJX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcihyZWcsIHNlbCwgdmFsKTsJCVwKLX0gd2hpbGUgKDApCi0KLS8qCi0gKiBPbiBSTTcwMDAvUk05MDAwIHRoZXNlIGFyZSB1c2VzIHRvIGFjY2VzcyBjb3AwIHNldCAxIHJlZ2lzdGVycwotICovCi0jZGVmaW5lIF9fcmVhZF8zMmJpdF9jMF9jdHJsX3JlZ2lzdGVyKHNvdXJjZSkJCQkJXAotKHsgaW50IF9fcmVzOwkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkJImNmYzBcdCUwLCAiICNzb3VyY2UgIlxuXHQiCQkJCVwKLQkJOiAiPXIiIChfX3JlcykpOwkJCQkJXAotCV9fcmVzOwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX3dyaXRlXzMyYml0X2MwX2N0cmxfcmVnaXN0ZXIocmVnaXN0ZXIsIHZhbHVlKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCQkiY3RjMFx0JXowLCAiICNyZWdpc3RlciAiXG5cdCIJCQkJXAotCQk6IDogIkpyIiAoKHVuc2lnbmVkIGludCkodmFsdWUpKSk7CQkJXAotfSB3aGlsZSAoMCkKLQotLyoKLSAqIFRoZXNlIHZlcnNpb25zIGFyZSBvbmx5IG5lZWRlZCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiAzOCBiaXRzIG9mCi0gKiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIHJ1bm5pbmcgdGhlIDMyLWJpdCBrZXJuZWwuICBUaGF0J3Mgbm9uZSBhdG0gOi0pCi0gKi8KLSNkZWZpbmUgX19yZWFkXzY0Yml0X2MwX3NwbGl0KHNvdXJjZSwgc2VsKQkJCQlcCi0oewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGxvbmcgX192YWw7CQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX2ZsYWdzOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlsb2NhbF9pcnFfc2F2ZShfX2ZsYWdzKTsJCQkJCVwKLQlpZiAoc2VsID09IDApCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkiLnNldFx0bWlwczY0XG5cdCIJCQkJXAotCQkJImRtZmMwXHQlTTAsICIgI3NvdXJjZSAiXG5cdCIJCQlcCi0JCQkiZHNsbFx0JUwwLCAlTTAsIDMyXG5cdCIJCQlcCi0JCQkiZHNybFx0JU0wLCAlTTAsIDMyXG5cdCIJCQlcCi0JCQkiZHNybFx0JUwwLCAlTDAsIDMyXG5cdCIJCQlcCi0JCQkiLnNldFx0bWlwczAiCQkJCQlcCi0JCQk6ICI9ciIgKF9fdmFsKSk7CQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIi5zZXRcdG1pcHM2NFxuXHQiCQkJCVwKLQkJCSJkbWZjMFx0JU0wLCAiICNzb3VyY2UgIiwgIiAjc2VsICJcblx0IgkJXAotCQkJImRzbGxcdCVMMCwgJU0wLCAzMlxuXHQiCQkJXAotCQkJImRzcmxcdCVNMCwgJU0wLCAzMlxuXHQiCQkJXAotCQkJImRzcmxcdCVMMCwgJUwwLCAzMlxuXHQiCQkJXAotCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAotCQkJOiAiPXIiIChfX3ZhbCkpOwkJCQlcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7CQkJCQlcCi0JCQkJCQkJCQlcCi0JX192YWw7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fd3JpdGVfNjRiaXRfYzBfc3BsaXQoc291cmNlLCBzZWwsIHZhbCkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19mbGFnczsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JbG9jYWxfaXJxX3NhdmUoX19mbGFncyk7CQkJCQlcCi0JaWYgKHNlbCA9PSAwKQkJCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAotCQkJIi5zZXRcdG1pcHM2NFxuXHQiCQkJCVwKLQkJCSJkc2xsXHQlTDAsICVMMCwgMzJcblx0IgkJCVwKLQkJCSJkc3JsXHQlTDAsICVMMCwgMzJcblx0IgkJCVwKLQkJCSJkc2xsXHQlTTAsICVNMCwgMzJcblx0IgkJCVwKLQkJCSJvclx0JUwwLCAlTDAsICVNMFxuXHQiCQkJCVwKLQkJCSJkbXRjMFx0JUwwLCAiICNzb3VyY2UgIlxuXHQiCQkJXAotCQkJIi5zZXRcdG1pcHMwIgkJCQkJXAotCQkJOiA6ICJyIiAodmFsKSk7CQkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSIuc2V0XHRtaXBzNjRcblx0IgkJCQlcCi0JCQkiZHNsbFx0JUwwLCAlTDAsIDMyXG5cdCIJCQlcCi0JCQkiZHNybFx0JUwwLCAlTDAsIDMyXG5cdCIJCQlcCi0JCQkiZHNsbFx0JU0wLCAlTTAsIDMyXG5cdCIJCQlcCi0JCQkib3JcdCVMMCwgJUwwLCAlTTBcblx0IgkJCQlcCi0JCQkiZG10YzBcdCVMMCwgIiAjc291cmNlICIsICIgI3NlbCAiXG5cdCIJCVwKLQkJCSIuc2V0XHRtaXBzMCIJCQkJCVwKLQkJCTogOiAiciIgKHZhbCkpOwkJCQkJXAotCWxvY2FsX2lycV9yZXN0b3JlKF9fZmxhZ3MpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSByZWFkX2MwX2luZGV4KCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMCwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfaW5kZXgodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQwLCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9yYW5kb20oKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDEsIDApCi0jZGVmaW5lIHdyaXRlX2MwX3JhbmRvbSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDEsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2VudHJ5bG8wKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQyLCAwKQotI2RlZmluZSB3cml0ZV9jMF9lbnRyeWxvMCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDIsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2VudHJ5bG8xKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQzLCAwKQotI2RlZmluZSB3cml0ZV9jMF9lbnRyeWxvMSh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDMsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2NvbmYoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQzLCAwKQotI2RlZmluZSB3cml0ZV9jMF9jb25mKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMywgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfY29udGV4dCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkNCwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfY29udGV4dCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDQsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX3VzZXJsb2NhbCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkNCwgMikKLSNkZWZpbmUgd3JpdGVfYzBfdXNlcmxvY2FsKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkNCwgMiwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfcGFnZW1hc2soKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDUsIDApCi0jZGVmaW5lIHdyaXRlX2MwX3BhZ2VtYXNrKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkNSwgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfd2lyZWQoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ2LCAwKQotI2RlZmluZSB3cml0ZV9jMF93aXJlZCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDYsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2luZm8oKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ3LCAwKQotCi0jZGVmaW5lIHJlYWRfYzBfY2FjaGUoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ3LCAwKQkvKiBUWDM5eHggKi8KLSNkZWZpbmUgd3JpdGVfYzBfY2FjaGUodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ3LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9iYWR2YWRkcigpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkOCwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfYmFkdmFkZHIodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQ4LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9jb3VudCgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDksIDApCi0jZGVmaW5lIHdyaXRlX2MwX2NvdW50KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkOSwgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfY291bnQyKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ5LCA2KSAvKiBwbng4NTUwICovCi0jZGVmaW5lIHdyaXRlX2MwX2NvdW50Mih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDksIDYsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2NvdW50MygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkOSwgNykgLyogcG54ODU1MCAqLwotI2RlZmluZSB3cml0ZV9jMF9jb3VudDModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ5LCA3LCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9lbnRyeWhpKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxMCwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfZW50cnloaSh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDEwLCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9jb21wYXJlKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMSwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfY29tcGFyZSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDExLCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9jb21wYXJlMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTEsIDYpIC8qIHBueDg1NTAgKi8KLSNkZWZpbmUgd3JpdGVfYzBfY29tcGFyZTIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMSwgNiwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfY29tcGFyZTMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDExLCA3KSAvKiBwbng4NTUwICovCi0jZGVmaW5lIHdyaXRlX2MwX2NvbXBhcmUzKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTEsIDcsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX3N0YXR1cygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDApCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotI2RlZmluZSB3cml0ZV9jMF9zdGF0dXModmFsKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDAsIHZhbCk7CQkJCVwKLQlfX2VoYigpOwkJCQkJCQlcCi19IHdoaWxlICgwKQotI2Vsc2UKLS8qCi0gKiBMZWdhY3kgbm9uLVNNVEMgY29kZSwgd2hpY2ggbWF5IGJlIGhhemFyZG91cwotICogYnV0IHdoaWNoIG1pZ2h0IG5vdCBzdXBwb3J0IEVIQgotICovCi0jZGVmaW5lIHdyaXRlX2MwX3N0YXR1cyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDEyLCAwLCB2YWwpCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0jZGVmaW5lIHJlYWRfYzBfY2F1c2UoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMywgMCkKLSNkZWZpbmUgd3JpdGVfYzBfY2F1c2UodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMywgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZXBjKCkJCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTQsIDApCi0jZGVmaW5lIHdyaXRlX2MwX2VwYyh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE0LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9wcmlkKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTUsIDApCi0KLSNkZWZpbmUgcmVhZF9jMF9jb25maWcoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAwKQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzEoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAxKQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAyKQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAzKQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzQoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA0KQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzUoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA1KQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzYoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA2KQotI2RlZmluZSByZWFkX2MwX2NvbmZpZzcoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA3KQotI2RlZmluZSB3cml0ZV9jMF9jb25maWcodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMCwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF9jb25maWcxKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDEsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfY29uZmlnMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCAyLCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX2NvbmZpZzModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgMywgdmFsKQotI2RlZmluZSB3cml0ZV9jMF9jb25maWc0KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDQsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfY29uZmlnNSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE2LCA1LCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX2NvbmZpZzYodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxNiwgNiwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF9jb25maWc3KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTYsIDcsIHZhbCkKLQotLyoKLSAqIFRoZSBXYXRjaExvIHJlZ2lzdGVyLiAgVGhlcmUgbWF5IGJlIHVwdG8gOCBvZiB0aGVtLgotICovCi0jZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzAoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAwKQotI2RlZmluZSByZWFkX2MwX3dhdGNobG8xKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgMSkKLSNkZWZpbmUgcmVhZF9jMF93YXRjaGxvMigpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDIpCi0jZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzMoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAzKQotI2RlZmluZSByZWFkX2MwX3dhdGNobG80KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgNCkKLSNkZWZpbmUgcmVhZF9jMF93YXRjaGxvNSgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDUpCi0jZGVmaW5lIHJlYWRfYzBfd2F0Y2hsbzYoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA2KQotI2RlZmluZSByZWFkX2MwX3dhdGNobG83KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgNykKLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hsbzAodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgMCwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvMSh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCAxLCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX3dhdGNobG8yKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDIsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hsbzModmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgMywgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvNCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA0LCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX3dhdGNobG81KHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMTgsIDUsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hsbzYodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQxOCwgNiwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGxvNyh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDE4LCA3LCB2YWwpCi0KLS8qCi0gKiBUaGUgV2F0Y2hIaSByZWdpc3Rlci4gIFRoZXJlIG1heSBiZSB1cHRvIDggb2YgdGhlbS4KLSAqLwotI2RlZmluZSByZWFkX2MwX3dhdGNoaGkwKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMCkKLSNkZWZpbmUgcmVhZF9jMF93YXRjaGhpMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDEpCi0jZGVmaW5lIHJlYWRfYzBfd2F0Y2hoaTIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAyKQotI2RlZmluZSByZWFkX2MwX3dhdGNoaGkzKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMykKLSNkZWZpbmUgcmVhZF9jMF93YXRjaGhpNCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDQpCi0jZGVmaW5lIHJlYWRfYzBfd2F0Y2hoaTUoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCA1KQotI2RlZmluZSByZWFkX2MwX3dhdGNoaGk2KCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgNikKLSNkZWZpbmUgcmVhZF9jMF93YXRjaGhpNygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDcpCi0KLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hoaTAodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMCwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCAxLCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX3dhdGNoaGkyKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDIsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hoaTModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgMywgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpNCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCA0LCB2YWwpCi0jZGVmaW5lIHdyaXRlX2MwX3dhdGNoaGk1KHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTksIDUsIHZhbCkKLSNkZWZpbmUgd3JpdGVfYzBfd2F0Y2hoaTYodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxOSwgNiwgdmFsKQotI2RlZmluZSB3cml0ZV9jMF93YXRjaGhpNyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE5LCA3LCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF94Y29udGV4dCgpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMjAsIDApCi0jZGVmaW5lIHdyaXRlX2MwX3hjb250ZXh0KHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMjAsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2ludGNvbnRyb2woKQlfX3JlYWRfMzJiaXRfYzBfY3RybF9yZWdpc3RlcigkMjApCi0jZGVmaW5lIHdyaXRlX2MwX2ludGNvbnRyb2wodmFsKSBfX3dyaXRlXzMyYml0X2MwX2N0cmxfcmVnaXN0ZXIoJDIwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9mcmFtZW1hc2soKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIxLCAwKQotI2RlZmluZSB3cml0ZV9jMF9mcmFtZW1hc2sodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMSwgMCwgdmFsKQotCi0vKiBSTTkwMDAgUGVyZkNvbnRyb2wgcGVyZm9ybWFuY2UgY291bnRlciBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIHJlYWRfYzBfcGVyZmNvbnRyb2woKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAwKQotI2RlZmluZSB3cml0ZV9jMF9wZXJmY29udHJvbCh2YWwpIF9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDIyLCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9kaWFnKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjIsIDApCi0jZGVmaW5lIHdyaXRlX2MwX2RpYWcodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGlhZzEoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMSkKLSNkZWZpbmUgd3JpdGVfYzBfZGlhZzEodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMSwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGlhZzIoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMikKLSNkZWZpbmUgd3JpdGVfYzBfZGlhZzIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMiwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGlhZzMoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMykKLSNkZWZpbmUgd3JpdGVfYzBfZGlhZzModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgMywgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGlhZzQoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgNCkKLSNkZWZpbmUgd3JpdGVfYzBfZGlhZzQodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgNCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGlhZzUoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgNSkKLSNkZWZpbmUgd3JpdGVfYzBfZGlhZzUodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMiwgNSwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGVidWcoKQkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyMywgMCkKLSNkZWZpbmUgd3JpdGVfYzBfZGVidWcodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyMywgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZGVwYygpCQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDI0LCAwKQotI2RlZmluZSB3cml0ZV9jMF9kZXBjKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMjQsIDAsIHZhbCkKLQotLyoKLSAqIE1JUFMzMiAvIE1JUFM2NCBwZXJmb3JtYW5jZSBjb3VudGVycwotICovCi0jZGVmaW5lIHJlYWRfYzBfcGVyZmN0cmwwKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMCkKLSNkZWZpbmUgd3JpdGVfYzBfcGVyZmN0cmwwKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDAsIHZhbCkKLSNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjAoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAxKQotI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjAodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMSwgdmFsKQotI2RlZmluZSByZWFkX2MwX3BlcmZjdHJsMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDIpCi0jZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAyLCB2YWwpCi0jZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIxKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMykKLSNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIxKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDMsIHZhbCkKLSNkZWZpbmUgcmVhZF9jMF9wZXJmY3RybDIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA0KQotI2RlZmluZSB3cml0ZV9jMF9wZXJmY3RybDIodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNCwgdmFsKQotI2RlZmluZSByZWFkX2MwX3BlcmZjbnRyMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDUpCi0jZGVmaW5lIHdyaXRlX2MwX3BlcmZjbnRyMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA1LCB2YWwpCi0jZGVmaW5lIHJlYWRfYzBfcGVyZmN0cmwzKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNikKLSNkZWZpbmUgd3JpdGVfYzBfcGVyZmN0cmwzKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDYsIHZhbCkKLSNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjMoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA3KQotI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjModmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNywgdmFsKQotCi0vKiBSTTkwMDAgUGVyZkNvdW50IHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgcmVhZF9jMF9wZXJmY291bnQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCAwKQotI2RlZmluZSB3cml0ZV9jMF9wZXJmY291bnQodmFsKQlfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMCwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfZWNjKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjYsIDApCi0jZGVmaW5lIHdyaXRlX2MwX2VjYyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI2LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9kZXJyYWRkcjAoKQlfX3JlYWRfdWxvbmdfYzBfcmVnaXN0ZXIoJDI2LCAxKQotI2RlZmluZSB3cml0ZV9jMF9kZXJyYWRkcjAodmFsKQlfX3dyaXRlX3Vsb25nX2MwX3JlZ2lzdGVyKCQyNiwgMSwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfY2FjaGVlcnIoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI3LCAwKQotCi0jZGVmaW5lIHJlYWRfYzBfZGVycmFkZHIxKCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQyNywgMSkKLSNkZWZpbmUgd3JpdGVfYzBfZGVycmFkZHIxKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMjcsIDEsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX3RhZ2xvKCkJCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjgsIDApCi0jZGVmaW5lIHdyaXRlX2MwX3RhZ2xvKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjgsIDAsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX2R0YWdsbygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjgsIDIpCi0jZGVmaW5lIHdyaXRlX2MwX2R0YWdsbyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI4LCAyLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF90YWdoaSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDI5LCAwKQotI2RlZmluZSB3cml0ZV9jMF90YWdoaSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI5LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9lcnJvcmVwYygpCV9fcmVhZF91bG9uZ19jMF9yZWdpc3RlcigkMzAsIDApCi0jZGVmaW5lIHdyaXRlX2MwX2Vycm9yZXBjKHZhbCkJX193cml0ZV91bG9uZ19jMF9yZWdpc3RlcigkMzAsIDAsIHZhbCkKLQotLyogTUlQU1IyICovCi0jZGVmaW5lIHJlYWRfYzBfaHdyZW5hKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQ3LCAwKQotI2RlZmluZSB3cml0ZV9jMF9od3JlbmEodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQ3LCAwLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9pbnRjdGwoKQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDEyLCAxKQotI2RlZmluZSB3cml0ZV9jMF9pbnRjdGwodmFsKQlfX3dyaXRlXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMSwgdmFsKQotCi0jZGVmaW5lIHJlYWRfYzBfc3JzY3RsKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQxMiwgMikKLSNkZWZpbmUgd3JpdGVfYzBfc3JzY3RsKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDIsIHZhbCkKLQotI2RlZmluZSByZWFkX2MwX3Nyc21hcCgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMTIsIDMpCi0jZGVmaW5lIHdyaXRlX2MwX3Nyc21hcCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDEyLCAzLCB2YWwpCi0KLSNkZWZpbmUgcmVhZF9jMF9lYmFzZSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE1LCAxKQotI2RlZmluZSB3cml0ZV9jMF9lYmFzZSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE1LCAxLCB2YWwpCi0KLS8qCi0gKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBjb250cm9sIHJlZ2lzdGVycwotICovCi0jZGVmaW5lIHJlYWRfMzJiaXRfY3AxX3JlZ2lzdGVyKHNvdXJjZSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotKHsgaW50IF9fcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkiLnNldFx0cHVzaFxuXHQiCQkJCQlcCi0JIi5zZXRcdHJlb3JkZXJcblx0IgkJCQkJXAotICAgICAgICAiY2ZjMVx0JTAsIlNUUihzb3VyY2UpIlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkiLnNldFx0cG9wIgkJCQkJCVwKLSAgICAgICAgOiAiPXIiIChfX3JlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fcmVzO30pCi0KLSNkZWZpbmUgcmRkc3AobWFzaykJCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IF9fcmVzOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIgkuc2V0CXB1c2gJCQkJXG4iCQlcCi0JIgkuc2V0CW5vYXQJCQkJXG4iCQlcCi0JIgkjIHJkZHNwICQxLCAleDEJCQkJXG4iCQlcCi0JIgkud29yZAkweDdjMDAwY2I4IHwgKCV4MSA8PCAxNikJXG4iCQlcCi0JIgltb3ZlCSUwLCAkMQkJCQlcbiIJCVwKLQkiCS5zZXQJcG9wCQkJCVxuIgkJXAotCTogIj1yIiAoX19yZXMpCQkJCQkJCVwKLQk6ICJpIiAobWFzaykpOwkJCQkJCQlcCi0JX19yZXM7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHdyZHNwKHZhbCwgbWFzaykJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyB3cmRzcCAkMSwgJXgxCQkJCQlcbiIJXAotCSIJLndvcmQJMHg3YzIwMDRmOCB8ICgleDEgPDwgMTEpCQlcbiIJXAotCSIJLnNldAlwb3AJCQkJCVxuIglcCi0gICAgICAgIDoJCQkJCQkJCVwKLQk6ICJyIiAodmFsKSwgImkiIChtYXNrKSk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jaWYgMAkvKiBOZWVkIERTUCBBU0UgY2FwYWJsZSBhc3NlbWJsZXIgLi4uICovCi0jZGVmaW5lIG1mbG8wKCkgKHsgbG9uZyBtZmxvMDsgX19hc21fXygibWZsbyAlMCwgJGFjMCIgOiAiPXIiIChtZmxvMCkpOyBtZmxvMDt9KQotI2RlZmluZSBtZmxvMSgpICh7IGxvbmcgbWZsbzE7IF9fYXNtX18oIm1mbG8gJTAsICRhYzEiIDogIj1yIiAobWZsbzEpKTsgbWZsbzE7fSkKLSNkZWZpbmUgbWZsbzIoKSAoeyBsb25nIG1mbG8yOyBfX2FzbV9fKCJtZmxvICUwLCAkYWMyIiA6ICI9ciIgKG1mbG8yKSk7IG1mbG8yO30pCi0jZGVmaW5lIG1mbG8zKCkgKHsgbG9uZyBtZmxvMzsgX19hc21fXygibWZsbyAlMCwgJGFjMyIgOiAiPXIiIChtZmxvMykpOyBtZmxvMzt9KQotCi0jZGVmaW5lIG1maGkwKCkgKHsgbG9uZyBtZmhpMDsgX19hc21fXygibWZoaSAlMCwgJGFjMCIgOiAiPXIiIChtZmhpMCkpOyBtZmhpMDt9KQotI2RlZmluZSBtZmhpMSgpICh7IGxvbmcgbWZoaTE7IF9fYXNtX18oIm1maGkgJTAsICRhYzEiIDogIj1yIiAobWZoaTEpKTsgbWZoaTE7fSkKLSNkZWZpbmUgbWZoaTIoKSAoeyBsb25nIG1maGkyOyBfX2FzbV9fKCJtZmhpICUwLCAkYWMyIiA6ICI9ciIgKG1maGkyKSk7IG1maGkyO30pCi0jZGVmaW5lIG1maGkzKCkgKHsgbG9uZyBtZmhpMzsgX19hc21fXygibWZoaSAlMCwgJGFjMyIgOiAiPXIiIChtZmhpMykpOyBtZmhpMzt9KQotCi0jZGVmaW5lIG10bG8wKHgpIF9fYXNtX18oIm10bG8gJTAsICRhYzAiIDo6InIiICh4KSkKLSNkZWZpbmUgbXRsbzEoeCkgX19hc21fXygibXRsbyAlMCwgJGFjMSIgOjoiciIgKHgpKQotI2RlZmluZSBtdGxvMih4KSBfX2FzbV9fKCJtdGxvICUwLCAkYWMyIiA6OiJyIiAoeCkpCi0jZGVmaW5lIG10bG8zKHgpIF9fYXNtX18oIm10bG8gJTAsICRhYzMiIDo6InIiICh4KSkKLQotI2RlZmluZSBtdGhpMCh4KSBfX2FzbV9fKCJtdGhpICUwLCAkYWMwIiA6OiJyIiAoeCkpCi0jZGVmaW5lIG10aGkxKHgpIF9fYXNtX18oIm10aGkgJTAsICRhYzEiIDo6InIiICh4KSkKLSNkZWZpbmUgbXRoaTIoeCkgX19hc21fXygibXRoaSAlMCwgJGFjMiIgOjoiciIgKHgpKQotI2RlZmluZSBtdGhpMyh4KSBfX2FzbV9fKCJtdGhpICUwLCAkYWMzIiA6OiJyIiAoeCkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgbWZoaTAoKQkJCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAotCQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKLQkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKLQkiCSMgbWZoaQklMCwgJGFjMAkJXG4iCQkJXAotCSIJLndvcmQJMHgwMDAwMDgxMAkJXG4iCQkJXAotCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCi0JIgkuc2V0CXBvcAkJCVxuIgkJCVwKLQk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKLQlfX3RyZWc7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIG1maGkxKCkJCQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX190cmVnOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIgkuc2V0CXB1c2gJCQlcbiIJCQlcCi0JIgkuc2V0CW5vYXQJCQlcbiIJCQlcCi0JIgkjIG1maGkJJTAsICRhYzEJCVxuIgkJCVwKLQkiCS53b3JkCTB4MDAyMDA4MTAJCVxuIgkJCVwKLQkiCW1vdmUJJTAsICQxCQkJXG4iCQkJXAotCSIJLnNldAlwb3AJCQlcbiIJCQlcCi0JOiAiPXIiIChfX3RyZWcpKTsJCQkJCQlcCi0JX190cmVnOwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBtZmhpMigpCQkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF9fdHJlZzsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIJLnNldAlwdXNoCQkJXG4iCQkJXAotCSIJLnNldAlub2F0CQkJXG4iCQkJXAotCSIJIyBtZmhpCSUwLCAkYWMyCQlcbiIJCQlcCi0JIgkud29yZAkweDAwNDAwODEwCQlcbiIJCQlcCi0JIgltb3ZlCSUwLCAkMQkJCVxuIgkJCVwKLQkiCS5zZXQJcG9wCQkJXG4iCQkJXAotCTogIj1yIiAoX190cmVnKSk7CQkJCQkJXAotCV9fdHJlZzsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgbWZoaTMoKQkJCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAotCQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKLQkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKLQkiCSMgbWZoaQklMCwgJGFjMwkJXG4iCQkJXAotCSIJLndvcmQJMHgwMDYwMDgxMAkJXG4iCQkJXAotCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCi0JIgkuc2V0CXBvcAkJCVxuIgkJCVwKLQk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKLQlfX3RyZWc7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIG1mbG8wKCkJCQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX190cmVnOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIgkuc2V0CXB1c2gJCQlcbiIJCQlcCi0JIgkuc2V0CW5vYXQJCQlcbiIJCQlcCi0JIgkjIG1mbG8JJTAsICRhYzAJCVxuIgkJCVwKLQkiCS53b3JkCTB4MDAwMDA4MTIJCVxuIgkJCVwKLQkiCW1vdmUJJTAsICQxCQkJXG4iCQkJXAotCSIJLnNldAlwb3AJCQlcbiIJCQlcCi0JOiAiPXIiIChfX3RyZWcpKTsJCQkJCQlcCi0JX190cmVnOwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBtZmxvMSgpCQkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF9fdHJlZzsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIJLnNldAlwdXNoCQkJXG4iCQkJXAotCSIJLnNldAlub2F0CQkJXG4iCQkJXAotCSIJIyBtZmxvCSUwLCAkYWMxCQlcbiIJCQlcCi0JIgkud29yZAkweDAwMjAwODEyCQlcbiIJCQlcCi0JIgltb3ZlCSUwLCAkMQkJCVxuIgkJCVwKLQkiCS5zZXQJcG9wCQkJXG4iCQkJXAotCTogIj1yIiAoX190cmVnKSk7CQkJCQkJXAotCV9fdHJlZzsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgbWZsbzIoKQkJCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX3RyZWc7CQkJCQkJXAotCQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCVxuIgkJCVwKLQkiCS5zZXQJbm9hdAkJCVxuIgkJCVwKLQkiCSMgbWZsbwklMCwgJGFjMgkJXG4iCQkJXAotCSIJLndvcmQJMHgwMDQwMDgxMgkJXG4iCQkJXAotCSIJbW92ZQklMCwgJDEJCQlcbiIJCQlcCi0JIgkuc2V0CXBvcAkJCVxuIgkJCVwKLQk6ICI9ciIgKF9fdHJlZykpOwkJCQkJCVwKLQlfX3RyZWc7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIG1mbG8zKCkJCQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX190cmVnOwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIgkuc2V0CXB1c2gJCQlcbiIJCQlcCi0JIgkuc2V0CW5vYXQJCQlcbiIJCQlcCi0JIgkjIG1mbG8JJTAsICRhYzMJCVxuIgkJCVwKLQkiCS53b3JkCTB4MDA2MDA4MTIJCVxuIgkJCVwKLQkiCW1vdmUJJTAsICQxCQkJXG4iCQkJXAotCSIJLnNldAlwb3AJCQlcbiIJCQlcCi0JOiAiPXIiIChfX3RyZWcpKTsJCQkJCQlcCi0JX190cmVnOwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSBtdGhpMCh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGhpCSQxLCAkYWMwCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAwMDExCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGhpMSh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGhpCSQxLCAkYWMxCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAwODExCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGhpMih4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGhpCSQxLCAkYWMyCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAxMDExCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGhpMyh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGhpCSQxLCAkYWMzCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAxODExCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGxvMCh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGxvCSQxLCAkYWMwCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAwMDEzCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGxvMSh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGxvCSQxLCAkYWMxCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAwODEzCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGxvMih4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGxvCSQxLCAkYWMyCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAxMDEzCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtdGxvMyh4KQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCVwKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCVwKLQkiCW1vdmUJJDEsICUwCQkJCQlcbiIJXAotCSIJIyBtdGxvCSQxLCAkYWMzCQkJCVxuIglcCi0JIgkud29yZAkweDAwMjAxODEzCQkJCVxuIglcCi0JIgkuc2V0CXBvcAkJCQkJXG4iCVwKLQk6CQkJCQkJCQlcCi0JOiAiciIgKHgpKTsJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmCi0KLS8qCi0gKiBUTEIgb3BlcmF0aW9ucy4KLSAqCi0gKiBJdCBpcyByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIHRha2UgY2FyZSBvZiBhbnkgVExCIGhhemFyZHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfcHJvYmUodm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIi5zZXQgbm9yZW9yZGVyXG5cdCIKLQkJInRsYnBcblx0IgotCQkiLnNldCByZW9yZGVyIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0bGJfcmVhZCh2b2lkKQotewotI2lmIE1JUFMzNEtfTUlTU0VEX0lUTEJfV0FSCi0JaW50IHJlcyA9IDA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiCS5zZXQJcHVzaAkJCQkJXG4iCi0JIgkuc2V0CW5vcmVvcmRlcgkJCQlcbiIKLQkiCS5zZXQJbm9hdAkJCQkJXG4iCi0JIgkuc2V0CW1pcHMzMnIyCQkJCVxuIgotCSIJLndvcmQJMHg0MTYxMDAwMQkJIyBkdnBlICQxCVxuIgotCSIJbW92ZQklMCwgJDEJCQkJCVxuIgotCSIJZWhiCQkJCQkJXG4iCi0JIgkuc2V0CXBvcAkJCQkJXG4iCi0JOiAiPXIiIChyZXMpKTsKLQotCWluc3RydWN0aW9uX2hhemFyZCgpOwotI2VuZGlmCi0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIi5zZXQgbm9yZW9yZGVyXG5cdCIKLQkJInRsYnJcblx0IgotCQkiLnNldCByZW9yZGVyIik7Ci0KLSNpZiBNSVBTMzRLX01JU1NFRF9JVExCX1dBUgotCWlmICgocmVzICYgX1VMQ0FTVF8oMSkpKQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CXB1c2gJCQkJXG4iCi0JCSIJLnNldAlub3Jlb3JkZXIJCQlcbiIKLQkJIgkuc2V0CW5vYXQJCQkJXG4iCi0JCSIJLnNldAltaXBzMzJyMgkJCVxuIgotCQkiCS53b3JkCTB4NDE2MDAwMjEJIyBldnBlCQlcbiIKLQkJIgllaGIJCQkJCVxuIgotCQkiCS5zZXQJcG9wCQkJCVxuIik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRsYl93cml0ZV9pbmRleGVkKHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIuc2V0IG5vcmVvcmRlclxuXHQiCi0JCSJ0bGJ3aVxuXHQiCi0JCSIuc2V0IHJlb3JkZXIiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRsYl93cml0ZV9yYW5kb20odm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIi5zZXQgbm9yZW9yZGVyXG5cdCIKLQkJInRsYndyXG5cdCIKLQkJIi5zZXQgcmVvcmRlciIpOwotfQotCi0vKgotICogTWFuaXB1bGF0ZSBiaXRzIGluIGEgYzAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgQ09ORklHX01JUFNfTVRfU01UQwotLyoKLSAqIFNNVEMgTGludXggcmVxdWlyZXMgc2h1dHRpbmctZG93biBtaWNyb3RocmVhZCBzY2hlZHVsaW5nCi0gKiBkdXJpbmcgQ1AwIHJlZ2lzdGVyIHJlYWQtbW9kaWZ5LXdyaXRlIHNlcXVlbmNlcy4KLSAqLwotI2RlZmluZSBfX0JVSUxEX1NFVF9DMChuYW1lKQkJCQkJXAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKLXNldF9jMF8jI25hbWUodW5zaWduZWQgaW50IHNldCkJCQkJCVwKLXsJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAotCQkJCQkJCQlcCi0JcmVzID0gcmVhZF9jMF8jI25hbWUoKTsJCQkJCVwKLQlyZXMgfD0gc2V0OwkJCQkJCVwKLQl3cml0ZV9jMF8jI25hbWUocmVzKTsJCQkJCVwKLQkJCQkJCQkJXAotCXJldHVybiByZXM7CQkJCQkJXAotfQkJCQkJCQkJXAotCQkJCQkJCQlcCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAkJCQkJXAotY2xlYXJfYzBfIyNuYW1lKHVuc2lnbmVkIGludCBjbGVhcikJCQkJXAotewkJCQkJCQkJXAotCXVuc2lnbmVkIGludCByZXM7CQkJCQlcCi0JCQkJCQkJCVwKLQlyZXMgPSByZWFkX2MwXyMjbmFtZSgpOwkJCQkJXAotCXJlcyAmPSB+Y2xlYXI7CQkJCQkJXAotCXdyaXRlX2MwXyMjbmFtZShyZXMpOwkJCQkJXAotCQkJCQkJCQlcCi0JcmV0dXJuIHJlczsJCQkJCQlcCi19CQkJCQkJCQlcCi0JCQkJCQkJCVwKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CQkJCQlcCi1jaGFuZ2VfYzBfIyNuYW1lKHVuc2lnbmVkIGludCBjaGFuZ2UsIHVuc2lnbmVkIGludCBuZXcpCQlcCi17CQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IHJlczsJCQkJCVwKLQkJCQkJCQkJXAotCXJlcyA9IHJlYWRfYzBfIyNuYW1lKCk7CQkJCQlcCi0JcmVzICY9IH5jaGFuZ2U7CQkJCQkJXAotCXJlcyB8PSAobmV3ICYgY2hhbmdlKTsJCQkJCVwKLQl3cml0ZV9jMF8jI25hbWUocmVzKTsJCQkJCVwKLQkJCQkJCQkJXAotCXJldHVybiByZXM7CQkJCQkJXAotfQotCi0jZWxzZSAvKiBTTVRDIHZlcnNpb25zIHRoYXQgbWFuYWdlIE1UIHNjaGVkdWxpbmcgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+Ci0KLS8qCi0gKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGRtdCgpIGluIG1pcHNtdHJlZ3MuaCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCi0gKiBoZWFkZXIgZmlsZSByZWN1cnNpb24uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fZG10KHZvaWQpCi17Ci0JaW50IHJlczsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIJLnNldAlwdXNoCQkJCQkJXG4iCi0JIgkuc2V0CW1pcHMzMnIyCQkJCQlcbiIKLQkiCS5zZXQJbm9hdAkJCQkJCVxuIgotCSIJLndvcmQJMHg0MTYxMEJDMQkJCSMgZG10ICQxCVxuIgotCSIJZWhiCQkJCQkJCVxuIgotCSIJbW92ZQklMCwgJDEJCQkJCQlcbiIKLQkiCS5zZXQJcG9wCQkJCQkJXG4iCi0JOiAiPXIiIChyZXMpKTsKLQotCWluc3RydWN0aW9uX2hhemFyZCgpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotI2RlZmluZSBfX1ZQRUNPTlRST0xfVEVfU0hJRlQJMTUKLSNkZWZpbmUgX19WUEVDT05UUk9MX1RFCQkoMVVMIDw8IF9fVlBFQ09OVFJPTF9URV9TSElGVCkKLQotI2RlZmluZSBfX0VNVF9FTkFCTEUJCV9fVlBFQ09OVFJPTF9URQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19lbXQodW5zaWduZWQgaW50IHByZXZpb3VzKQotewotCWlmICgocHJldmlvdXMgJiBfX0VNVF9FTkFCTEUpKQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzMnIyCQkJCVxuIgotCQkiCS53b3JkCTB4NDE2MDBiZTEJCSMgZW10CQlcbiIKLQkJIgllaGIJCQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMwCQkJCQlcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19laGIodm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiCS5zZXQJbWlwczMycjIJCQkJCVxuIgotCSIJZWhiCQkJCQkJCVxuIgkJIgkuc2V0CW1pcHMwCQkJCQkJXG4iKTsKLX0KLQotLyoKLSAqIE5vdGUgdGhhdCBsb2NhbF9pcnFfc2F2ZS9yZXN0b3JlIGFmZmVjdCBUQy1zcGVjaWZpYyBJWE1UIHN0YXRlLAotICogbm90IFN0YXR1cy5JRSBhcyBpbiBub24tU01UQyBrZXJuZWwuCi0gKi8KLQotI2RlZmluZSBfX0JVSUxEX1NFVF9DMChuYW1lKQkJCQkJXAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKLXNldF9jMF8jI25hbWUodW5zaWduZWQgaW50IHNldCkJCQkJCVwKLXsJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAotCXVuc2lnbmVkIGludCBvbXQ7CQkJCQlcCi0JdW5zaWduZWQgaW50IGZsYWdzOwkJCQkJXAotCQkJCQkJCQlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwkJCQkJXAotCW9tdCA9IF9fZG10KCk7CQkJCQkJXAotCXJlcyA9IHJlYWRfYzBfIyNuYW1lKCk7CQkJCQlcCi0JcmVzIHw9IHNldDsJCQkJCQlcCi0Jd3JpdGVfYzBfIyNuYW1lKHJlcyk7CQkJCQlcCi0JX19lbXQob210KTsJCQkJCQlcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkJCQlcCi0JCQkJCQkJCVwKLQlyZXR1cm4gcmVzOwkJCQkJCVwKLX0JCQkJCQkJCVwKLQkJCQkJCQkJXAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKLWNsZWFyX2MwXyMjbmFtZSh1bnNpZ25lZCBpbnQgY2xlYXIpCQkJCVwKLXsJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAotCXVuc2lnbmVkIGludCBvbXQ7CQkJCQlcCi0JdW5zaWduZWQgaW50IGZsYWdzOwkJCQkJXAotCQkJCQkJCQlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwkJCQkJXAotCW9tdCA9IF9fZG10KCk7CQkJCQkJXAotCXJlcyA9IHJlYWRfYzBfIyNuYW1lKCk7CQkJCQlcCi0JcmVzICY9IH5jbGVhcjsJCQkJCQlcCi0Jd3JpdGVfYzBfIyNuYW1lKHJlcyk7CQkJCQlcCi0JX19lbXQob210KTsJCQkJCQlcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkJCQlcCi0JCQkJCQkJCVwKLQlyZXR1cm4gcmVzOwkJCQkJCVwKLX0JCQkJCQkJCVwKLQkJCQkJCQkJXAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQJCQkJCVwKLWNoYW5nZV9jMF8jI25hbWUodW5zaWduZWQgaW50IGNoYW5nZSwgdW5zaWduZWQgaW50IG5ldykJCVwKLXsJCQkJCQkJCVwKLQl1bnNpZ25lZCBpbnQgcmVzOwkJCQkJXAotCXVuc2lnbmVkIGludCBvbXQ7CQkJCQlcCi0JdW5zaWduZWQgaW50IGZsYWdzOwkJCQkJXAotCQkJCQkJCQlcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwkJCQkJXAotCQkJCQkJCQlcCi0Jb210ID0gX19kbXQoKTsJCQkJCQlcCi0JcmVzID0gcmVhZF9jMF8jI25hbWUoKTsJCQkJCVwKLQlyZXMgJj0gfmNoYW5nZTsJCQkJCQlcCi0JcmVzIHw9IChuZXcgJiBjaGFuZ2UpOwkJCQkJXAotCXdyaXRlX2MwXyMjbmFtZShyZXMpOwkJCQkJXAotCV9fZW10KG9tdCk7CQkJCQkJXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJCQkJXAotCQkJCQkJCQlcCi0JcmV0dXJuIHJlczsJCQkJCQlcCi19Ci0jZW5kaWYKLQotX19CVUlMRF9TRVRfQzAoc3RhdHVzKQotX19CVUlMRF9TRVRfQzAoY2F1c2UpCi1fX0JVSUxEX1NFVF9DMChjb25maWcpCi1fX0JVSUxEX1NFVF9DMChpbnRjb250cm9sKQotX19CVUlMRF9TRVRfQzAoaW50Y3RsKQotX19CVUlMRF9TRVRfQzAoc3JzbWFwKQotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0jZW5kaWYgLyogX0FTTV9NSVBTUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1taXBzL21tdV9jb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGYyNDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tbXVfY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiBTd2l0Y2ggYSBNTVUgY29udGV4dC4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICovCi0jaWZuZGVmIF9BU01fTU1VX0NPTlRFWFRfSAotI2RlZmluZSBfQVNNX01NVV9DT05URVhUX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0jaW5jbHVkZSA8YXNtL21pcHNtdHJlZ3MuaD4KLSNpbmNsdWRlIDxhc20vc210Yy5oPgotI2VuZGlmIC8qIFNNVEMgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgotCi0vKgotICogRm9yIHRoZSBmYXN0IHRsYiBtaXNzIGhhbmRsZXJzLCB3ZSBrZWVwIGEgcGVyIGNwdSBhcnJheSBvZiBwb2ludGVycwotICogdG8gdGhlIGN1cnJlbnQgcGdkIGZvciBlYWNoIHByb2Nlc3Nvci4gQWxzbywgdGhlIHByb2MuIGlkIGlzIHN0dWZmZWQKLSAqIGludG8gdGhlIGNvbnRleHQgcmVnaXN0ZXIuCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHBnZF9jdXJyZW50W107Ci0KLSNkZWZpbmUgVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChwZ2QpIFwKLQlwZ2RfY3VycmVudFtzbXBfcHJvY2Vzc29yX2lkKCldID0gKHVuc2lnbmVkIGxvbmcpKHBnZCkKLQotI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKLQl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSBzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMjUpOwlcCi0JVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChzd2FwcGVyX3BnX2RpcikKLSNlbmRpZgotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBUTEJNSVNTX0hBTkRMRVJfU0VUVVAoKQkJCQkJCVwKLQl3cml0ZV9jMF9jb250ZXh0KCh1bnNpZ25lZCBsb25nKSBzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMjYpOwlcCi0JVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChzd2FwcGVyX3BnX2RpcikKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQotCi0jZGVmaW5lIEFTSURfSU5DCTB4NDAKLSNkZWZpbmUgQVNJRF9NQVNLCTB4ZmMwCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9SODAwMCkKLQotI2RlZmluZSBBU0lEX0lOQwkweDEwCi0jZGVmaW5lIEFTSURfTUFTSwkweGZmMAotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfUk05MDAwKQotCi0jZGVmaW5lIEFTSURfSU5DCTB4MQotI2RlZmluZSBBU0lEX01BU0sJMHhmZmYKLQotLyogU01UQy8zNEsgZGVidWcgaGFjayAtIGJ1dCBtYXliZSB3ZSdsbCBrZWVwIGl0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCi0KLSNkZWZpbmUgQVNJRF9JTkMJMHgxCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzbXRjX2FzaWRfbWFzazsKLSNkZWZpbmUgQVNJRF9NQVNLCShzbXRjX2FzaWRfbWFzaykKLSNkZWZpbmUJSFdfQVNJRF9NQVNLCTB4ZmYKLS8qIEVuZCBTTVRDLzM0SyBkZWJ1ZyBoYWNrICovCi0jZWxzZSAvKiBGSVhNRTogbm90IGNvcnJlY3QgZm9yIFI2MDAwICovCi0KLSNkZWZpbmUgQVNJRF9JTkMJMHgxCi0jZGVmaW5lIEFTSURfTUFTSwkweGZmCi0KLSNlbmRpZgotCi0jZGVmaW5lIGNwdV9jb250ZXh0KGNwdSwgbW0pCSgobW0pLT5jb250ZXh0W2NwdV0pCi0jZGVmaW5lIGNwdV9hc2lkKGNwdSwgbW0pCShjcHVfY29udGV4dCgoY3B1KSwgKG1tKSkgJiBBU0lEX01BU0spCi0jZGVmaW5lIGFzaWRfY2FjaGUoY3B1KQkJKGNwdV9kYXRhW2NwdV0uYXNpZF9jYWNoZSkKLQotc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLX0KLQotLyoKLSAqICBBbGwgdW51c2VkIGJ5IGhhcmR3YXJlIHVwcGVyIGJpdHMgd2lsbCBiZSBjb25zaWRlcmVkCi0gKiAgYXMgYSBzb2Z0d2FyZSBhc2lkIGV4dGVuc2lvbi4KLSAqLwotI2RlZmluZSBBU0lEX1ZFUlNJT05fTUFTSyAgKCh1bnNpZ25lZCBsb25nKX4oQVNJRF9NQVNLfChBU0lEX01BU0stMSkpKQotI2RlZmluZSBBU0lEX0ZJUlNUX1ZFUlNJT04gKCh1bnNpZ25lZCBsb25nKSh+QVNJRF9WRVJTSU9OX01BU0spICsgMSkKLQotI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0vKiBOb3JtYWwsIGNsYXNzaWMgTUlQUyBnZXRfbmV3X21tdV9jb250ZXh0ICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWdldF9uZXdfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgY3B1KQotewotCXVuc2lnbmVkIGxvbmcgYXNpZCA9IGFzaWRfY2FjaGUoY3B1KTsKLQotCWlmICghICgoYXNpZCArPSBBU0lEX0lOQykgJiBBU0lEX01BU0spICkgewotCQlpZiAoY3B1X2hhc192dGFnX2ljYWNoZSkKLQkJCWZsdXNoX2ljYWNoZV9hbGwoKTsKLQkJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwkvKiBzdGFydCBuZXcgYXNpZCBjeWNsZSAqLwotCQlpZiAoIWFzaWQpCQkvKiBmaXggdmVyc2lvbiBpZiBuZWVkZWQgKi8KLQkJCWFzaWQgPSBBU0lEX0ZJUlNUX1ZFUlNJT047Ci0JfQotCWNwdV9jb250ZXh0KGNwdSwgbW0pID0gYXNpZF9jYWNoZShjcHUpID0gYXNpZDsKLX0KLQotI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0jZGVmaW5lIGdldF9uZXdfbW11X2NvbnRleHQobW0sIGNwdSkgc210Y19nZXRfbmV3X21tdV9jb250ZXh0KChtbSksIChjcHUpKQotCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGEgbmV3IG1tX3N0cnVjdAotICogaW5zdGFuY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJY3B1X2NvbnRleHQoaSwgbW0pID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JdW5zaWduZWQgbG9uZyBvbGRhc2lkOwotCXVuc2lnbmVkIGxvbmcgbXRmbGFnczsKLQlpbnQgbXl0bGIgPSAoc210Y19zdGF0dXMgJiBTTVRDX1RMQl9TSEFSRUQpID8gMCA6IGNwdV9kYXRhW2NwdV0udnBlX2lkOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQltdGZsYWdzID0gZHZwZSgpOwotI2Vsc2UgLyogTm90IFNNVEMgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0JLyogQ2hlY2sgaWYgb3VyIEFTSUQgaXMgb2YgYW4gb2xkZXIgdmVyc2lvbiBhbmQgdGh1cyBpbnZhbGlkICovCi0JaWYgKChjcHVfY29udGV4dChjcHUsIG5leHQpIF4gYXNpZF9jYWNoZShjcHUpKSAmIEFTSURfVkVSU0lPTl9NQVNLKQotCQlnZXRfbmV3X21tdV9jb250ZXh0KG5leHQsIGNwdSk7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCS8qCi0JICogSWYgdGhlIEVudHJ5SGkgQVNJRCBiZWluZyByZXBsYWNlZCBoYXBwZW5zIHRvIGJlCi0JICogdGhlIHZhbHVlIGZsYWdnZWQgYXQgQVNJRCByZWN5Y2xpbmcgdGltZSBhcyBoYXZpbmcKLQkgKiBhbiBleHRlbmRlZCBsaWZlLCBjbGVhciB0aGUgYml0IHNob3dpbmcgaXQgYmVpbmcKLQkgKiBpbiB1c2UgYnkgdGhpcyAiQ1BVIiwgYW5kIGlmIHRoYXQncyB0aGUgbGFzdCBiaXQsCi0JICogZnJlZSB1cCB0aGUgQVNJRCB2YWx1ZSBmb3IgdXNlIGFuZCBmbHVzaCBhbnkgb2xkCi0JICogaW5zdGFuY2VzIG9mIGl0IGZyb20gdGhlIFRMQi4KLQkgKi8KLQlvbGRhc2lkID0gKHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLKTsKLQlpZihzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0pIHsKLQkJc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdICY9IH4oMHgxIDw8IGNwdSk7Ci0JCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSA9PSAwKQotCQkJc210Y19mbHVzaF90bGJfYXNpZChvbGRhc2lkKTsKLQl9Ci0JLyoKLQkgKiBUcmVhZCBzb2Z0bHkgb24gRW50cnlIaSwgYW5kIHNvIGxvbmcgYXMgd2Ugc3VwcG9ydAotCSAqIGhhdmluZyBBU0lEX01BU0sgc21hbGxlciB0aGFuIHRoZSBoYXJkd2FyZSBtYXhpbXVtLAotCSAqIG1ha2Ugc3VyZSBubyAic29mdCIgYml0cyBiZWNvbWUgImhhcmQiLi4uCi0JICovCi0Jd3JpdGVfYzBfZW50cnloaSgocmVhZF9jMF9lbnRyeWhpKCkgJiB+SFdfQVNJRF9NQVNLKQotCQkJfCAoY3B1X2NvbnRleHQoY3B1LCBuZXh0KSAmIEFTSURfTUFTSykpOwotCWVoYigpOyAvKiBNYWtlIHN1cmUgaXQgcHJvcGFnYXRlcyB0byBUQ1N0YXR1cyAqLwotCWV2cGUobXRmbGFncyk7Ci0jZWxzZQotCXdyaXRlX2MwX2VudHJ5aGkoY3B1X2NvbnRleHQoY3B1LCBuZXh0KSk7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCVRMQk1JU1NfSEFORExFUl9TRVRVUF9QR0QobmV4dC0+cGdkKTsKLQotCS8qCi0JICogTWFyayBjdXJyZW50LT5hY3RpdmVfbW0gYXMgbm90ICJhY3RpdmUiIGFueW1vcmUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBtaXNsZWFkIHBvc3NpYmxlIElQSSB0bGIgZmx1c2ggcm91dGluZXMuCi0JICovCi0JY3B1X2NsZWFyKGNwdSwgcHJldi0+Y3B1X3ZtX21hc2spOwotCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qCi0gKiBEZXN0cm95IGNvbnRleHQgcmVsYXRlZCBpbmZvIGZvciBhbiBtbV9zdHJ1Y3QgdGhhdCBpcyBhYm91dAotICogdG8gYmUgcHV0IHRvIHJlc3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci19Ci0KLSNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKQlkbyB7IH0gd2hpbGUgKDApCi0KLS8qCi0gKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKLSAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCXVuc2lnbmVkIGxvbmcgb2xkYXNpZDsKLQl1bnNpZ25lZCBsb25nIG10ZmxhZ3M7Ci0JaW50IG15dGxiID0gKHNtdGNfc3RhdHVzICYgU01UQ19UTEJfU0hBUkVEKSA/IDAgOiBjcHVfZGF0YVtjcHVdLnZwZV9pZDsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBVbmNvbmRpdGlvbmFsbHkgZ2V0IGEgbmV3IEFTSUQuICAqLwotCWdldF9uZXdfbW11X2NvbnRleHQobmV4dCwgY3B1KTsKLQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLwotCW10ZmxhZ3MgPSBkdnBlKCk7Ci0Jb2xkYXNpZCA9IHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLOwotCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSkgewotCQlzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0gJj0gfigweDEgPDwgY3B1KTsKLSAgICAgICAJCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSA9PSAwKQotICAgICAgICAgICAgICAgCQkgc210Y19mbHVzaF90bGJfYXNpZChvbGRhc2lkKTsKLQl9Ci0JLyogU2VlIGNvbW1lbnRzIGZvciBzaW1pbGFyIGNvZGUgYWJvdmUgKi8KLQl3cml0ZV9jMF9lbnRyeWhpKChyZWFkX2MwX2VudHJ5aGkoKSAmIH5IV19BU0lEX01BU0spIHwKLQkgICAgICAgICAgICAgICAgIChjcHVfY29udGV4dChjcHUsIG5leHQpICYgQVNJRF9NQVNLKSk7Ci0JZWhiKCk7IC8qIE1ha2Ugc3VyZSBpdCBwcm9wYWdhdGVzIHRvIFRDU3RhdHVzICovCi0JZXZwZShtdGZsYWdzKTsKLSNlbHNlCi0Jd3JpdGVfYzBfZW50cnloaShjcHVfY29udGV4dChjcHUsIG5leHQpKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JVExCTUlTU19IQU5ETEVSX1NFVFVQX1BHRChuZXh0LT5wZ2QpOwotCi0JLyogbWFyayBtbXUgb3duZXJzaGlwIGNoYW5nZSAqLwotCWNwdV9jbGVhcihjcHUsIHByZXYtPmNwdV92bV9tYXNrKTsKLQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogSWYgbW0gaXMgY3VycmVudGx5IGFjdGl2ZV9tbSwgd2UgY2FuJ3QgcmVhbGx5IGRyb3AgaXQuICBJbnN0ZWFkLAotICogd2Ugd2lsbCBnZXQgYSBuZXcgb25lIGZvciBpdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1kcm9wX21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JdW5zaWduZWQgbG9uZyBvbGRhc2lkOwotCS8qIENhbid0IHVzZSBzcGlubG9jayBiZWNhdXNlIGNhbGxlZCBmcm9tIFRMQiBmbHVzaCB3aXRoaW4gRFZQRSAqLwotCXVuc2lnbmVkIGludCBwcmV2dnBlOwotCWludCBteXRsYiA9IChzbXRjX3N0YXR1cyAmIFNNVENfVExCX1NIQVJFRCkgPyAwIDogY3B1X2RhdGFbY3B1XS52cGVfaWQ7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKGNwdV9pc3NldChjcHUsIG1tLT5jcHVfdm1fbWFzaykpICB7Ci0JCWdldF9uZXdfbW11X2NvbnRleHQobW0sIGNwdSk7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLwotCQlwcmV2dnBlID0gZHZwZSgpOwotCQlvbGRhc2lkID0gKHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLKTsKLQkJaWYgKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSkgewotCQkJc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdICY9IH4oMHgxIDw8IGNwdSk7Ci0JCQlpZihzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0gPT0gMCkKLQkJCQlzbXRjX2ZsdXNoX3RsYl9hc2lkKG9sZGFzaWQpOwotCQl9Ci0JCS8qIFNlZSBjb21tZW50cyBmb3Igc2ltaWxhciBjb2RlIGFib3ZlICovCi0JCXdyaXRlX2MwX2VudHJ5aGkoKHJlYWRfYzBfZW50cnloaSgpICYgfkhXX0FTSURfTUFTSykKLQkJCQl8IGNwdV9hc2lkKGNwdSwgbW0pKTsKLQkJZWhiKCk7IC8qIE1ha2Ugc3VyZSBpdCBwcm9wYWdhdGVzIHRvIFRDU3RhdHVzICovCi0JCWV2cGUocHJldnZwZSk7Ci0jZWxzZSAvKiBub3QgQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQl3cml0ZV9jMF9lbnRyeWhpKGNwdV9hc2lkKGNwdSwgbW0pKTsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JfSBlbHNlIHsKLQkJLyogd2lsbCBnZXQgYSBuZXcgY29udGV4dCBuZXh0IHRpbWUgKi8KLSNpZm5kZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQljcHVfY29udGV4dChjcHUsIG1tKSA9IDA7Ci0jZWxzZSAvKiBTTVRDICovCi0JCWludCBpOwotCi0JCS8qIFNNVEMgc2hhcmVzIHRoZSBUTEIgKGFuZCBBU0lEcykgYWNyb3NzIFZQRXMgKi8KLQkJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JICAgIAkgICAgaWYoKHNtdGNfc3RhdHVzICYgU01UQ19UTEJfU0hBUkVEKQotCSAgICAJICAgIHx8IChjcHVfZGF0YVtpXS52cGVfaWQgPT0gY3B1X2RhdGFbY3B1XS52cGVfaWQpKQotCQkJY3B1X2NvbnRleHQoaSwgbW0pID0gMDsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX0FTTV9NTVVfQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtMzIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS0zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzk2ZTlmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS0zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMCwgMjAwMyBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKi8KLSNpZm5kZWYgX0FTTV9QR1RBQkxFXzMyX0gKLSNkZWZpbmUgX0FTTV9QR1RBQkxFXzMyX0gKLQotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wbWQuaD4KLQotLyoKLSAqIC0gYWRkX3dpcmVkX2VudHJ5KCkgYWRkIGEgZml4ZWQgVExCIGVudHJ5LCBhbmQgbW92ZSB3aXJlZCByZWdpc3RlcgotICovCi1leHRlcm4gdm9pZCBhZGRfd2lyZWRfZW50cnkodW5zaWduZWQgbG9uZyBlbnRyeWxvMCwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGVudHJ5aGksIHVuc2lnbmVkIGxvbmcgcGFnZW1hc2spOwotCi0vKgotICogLSBhZGRfdGVtcG9yYXJ5X2VudHJ5KCkgYWRkIGEgdGVtcG9yYXJ5IFRMQiBlbnRyeS4gV2UgdXNlIFRMQiBlbnRyaWVzCi0gKglzdGFydGluZyBhdCB0aGUgdG9wIGFuZCB3b3JraW5nIGRvd24uIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlCi0gKglUTEIgYmVmb3JlIHRyYXBfaW5pdCgpIHB1dHMgdGhlIFRMQiBtaXNzIGhhbmRsZXIgaW4gcGxhY2UuIEl0Ci0gKglzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBlbnRyaWVzIG1hdGNoaW5nIHRoZSBhY3R1YWwgcGFnZSB0YWJsZXMsCi0gKgl0byBwcmV2ZW50IGluY29uc2lzdGVuY2llcy4KLSAqLwotZXh0ZXJuIGludCBhZGRfdGVtcG9yYXJ5X2VudHJ5KHVuc2lnbmVkIGxvbmcgZW50cnlsbzAsIHVuc2lnbmVkIGxvbmcgZW50cnlsbzEsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbnRyeWhpLCB1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKTsKLQotCi0vKiBCYXNpY2FsbHkgd2UgaGF2ZSB0aGUgc2FtZSB0d28tbGV2ZWwgKHdoaWNoIGlzIHRoZSBsb2dpY2FsIHRocmVlIGxldmVsCi0gKiBMaW51eCBwYWdlIHRhYmxlIGxheW91dCBmb2xkZWQpIHBhZ2UgdGFibGVzIGFzIHRoZSBpMzg2LiAgU29tZSBkYXkKLSAqIHdoZW4gd2UgaGF2ZSBwcm9wZXIgcGFnZSBjb2xvcmluZyBzdXBwb3J0IHdlIGNhbiBoYXZlIGEgMSUgcXVpY2tlcgotICogdGxiIHJlZmlsbCBoYW5kbGluZyBtZWNoYW5pc20sIGJ1dCBmb3Igbm93IGl0IGlzIGEgYml0IHNsb3dlciBidXQKLSAqIHdvcmtzIGV2ZW4gd2l0aCB0aGUgY2FjaGUgYWxpYXNpbmcgcHJvYmxlbSB0aGUgUjRrIGFuZCBhYm92ZSBoYXZlLgotICovCi0KLS8qIFBHRElSX1NISUZUIGRldGVybWluZXMgd2hhdCBhIHRoaXJkLWxldmVsIHBhZ2UgdGFibGUgZW50cnkgY2FuIG1hcCAqLwotI2RlZmluZSBQR0RJUl9TSElGVAkoMiAqIFBBR0VfU0hJRlQgKyBQVEVfT1JERVIgLSBQVEVfVF9MT0cyKQotI2RlZmluZSBQR0RJUl9TSVpFCSgxVUwgPDwgUEdESVJfU0hJRlQpCi0jZGVmaW5lIFBHRElSX01BU0sJKH4oUEdESVJfU0laRS0xKSkKLQotLyoKLSAqIEVudHJpZXMgcGVyIHBhZ2UgZGlyZWN0b3J5IGxldmVsOiB3ZSB1c2UgdHdvLWxldmVsLCBzbwotICogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55IFBVRC9QTUQgZGlyZWN0b3J5IHBoeXNpY2FsbHkuCi0gKi8KLSNkZWZpbmUgX19QR0RfT1JERVIJKDMyIC0gMyAqIFBBR0VfU0hJRlQgKyBQR0RfVF9MT0cyICsgUFRFX1RfTE9HMikKLSNkZWZpbmUgUEdEX09SREVSCShfX1BHRF9PUkRFUiA+PSAwID8gX19QR0RfT1JERVIgOiAwKQotI2RlZmluZSBQVURfT1JERVIJYWllZWVlX2F0dGVtcHRfdG9fYWxsb2NhdGVfcHVkCi0jZGVmaW5lIFBNRF9PUkRFUgkxCi0jZGVmaW5lIFBURV9PUkRFUgkwCi0KLSNkZWZpbmUgUFRSU19QRVJfUEdECSgoUEFHRV9TSVpFIDw8IFBHRF9PUkRFUikgLyBzaXplb2YocGdkX3QpKQotI2RlZmluZSBQVFJTX1BFUl9QVEUJKChQQUdFX1NJWkUgPDwgUFRFX09SREVSKSAvIHNpemVvZihwdGVfdCkpCi0KLSNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QJKDB4ODAwMDAwMDBVTC9QR0RJUl9TSVpFKQotI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMAotCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQgICAgIE1BUF9CQVNFCi0KLSNkZWZpbmUgUEtNQVBfQkFTRQkJKDB4ZmUwMDAwMDBVTCkKLQotI2lmZGVmIENPTkZJR19ISUdITUVNCi0jIGRlZmluZSBWTUFMTE9DX0VORAkoUEtNQVBfQkFTRS0yKlBBR0VfU0laRSkKLSNlbHNlCi0jIGRlZmluZSBWTUFMTE9DX0VORAkoRklYQUREUl9TVEFSVC0yKlBBR0VfU0laRSkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHXzY0QklUX1BIWVNfQUREUgotI2RlZmluZSBwdGVfRVJST1IoZSkgXAotCXByaW50aygiJXM6JWQ6IGJhZCBwdGUgJTAxNkx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwdGVfdmFsKGUpKQotI2Vsc2UKLSNkZWZpbmUgcHRlX0VSUk9SKGUpIFwKLQlwcmludGsoIiVzOiVkOiBiYWQgcHRlICUwOGx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwdGVfdmFsKGUpKQotI2VuZGlmCi0jZGVmaW5lIHBnZF9FUlJPUihlKSBcCi0JcHJpbnRrKCIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKLQotZXh0ZXJuIHZvaWQgbG9hZF9wZ2QodW5zaWduZWQgbG9uZyBwZ19kaXIpOwotCi1leHRlcm4gcHRlX3QgaW52YWxpZF9wdGVfdGFibGVbUEFHRV9TSVpFL3NpemVvZihwdGVfdCldOwotCi0vKgotICogRW1wdHkgcGdkL3BtZCBlbnRyaWVzIHBvaW50IHRvIHRoZSBpbnZhbGlkX3B0ZV90YWJsZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcG1kX25vbmUocG1kX3QgcG1kKQotewotCXJldHVybiBwbWRfdmFsKHBtZCkgPT0gKHVuc2lnbmVkIGxvbmcpIGludmFsaWRfcHRlX3RhYmxlOwotfQotCi0jZGVmaW5lIHBtZF9iYWQocG1kKQkJKHBtZF92YWwocG1kKSAmIH5QQUdFX01BU0spCi0KLXN0YXRpYyBpbmxpbmUgaW50IHBtZF9wcmVzZW50KHBtZF90IHBtZCkKLXsKLQlyZXR1cm4gcG1kX3ZhbChwbWQpICE9ICh1bnNpZ25lZCBsb25nKSBpbnZhbGlkX3B0ZV90YWJsZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBtZF9jbGVhcihwbWRfdCAqcG1kcCkKLXsKLQlwbWRfdmFsKCpwbWRwKSA9ICgodW5zaWduZWQgbG9uZykgaW52YWxpZF9wdGVfdGFibGUpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfTUlQUzMyKQotI2RlZmluZSBwdGVfcGFnZSh4KQkJcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKLSNkZWZpbmUgcHRlX3Bmbih4KQkJKCh1bnNpZ25lZCBsb25nKSgoeCkucHRlX2hpZ2ggPj4gNikpCi1zdGF0aWMgaW5saW5lIHB0ZV90Ci1wZm5fcHRlKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQotewotCXB0ZV90IHB0ZTsKLQlwdGUucHRlX2hpZ2ggPSAocGZuIDw8IDYpIHwgKHBncHJvdF92YWwocHJvdCkgJiAweDNmKTsKLQlwdGUucHRlX2xvdyA9IHBncHJvdF92YWwocHJvdCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBwdGVfcGFnZSh4KQkJcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKLQotI2lmZGVmIENPTkZJR19DUFVfVlI0MVhYCi0jZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoKHgpLnB0ZSA+PiAoUEFHRV9TSElGVCArIDIpKSkKLSNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCAoUEFHRV9TSElGVCArIDIpKSB8IHBncHJvdF92YWwocHJvdCkpCi0jZWxzZQotI2RlZmluZSBwdGVfcGZuKHgpCQkoKHVuc2lnbmVkIGxvbmcpKCh4KS5wdGUgPj4gUEFHRV9TSElGVCkpCi0jZGVmaW5lIHBmbl9wdGUocGZuLCBwcm90KQlfX3B0ZSgoKHVuc2lnbmVkIGxvbmcgbG9uZykocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCi0jZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpICovCi0KLSNkZWZpbmUgX19wZ2Rfb2Zmc2V0KGFkZHJlc3MpCXBnZF9pbmRleChhZGRyZXNzKQotI2RlZmluZSBfX3B1ZF9vZmZzZXQoYWRkcmVzcykJKCgoYWRkcmVzcykgPj4gUFVEX1NISUZUKSAmIChQVFJTX1BFUl9QVUQtMSkpCi0jZGVmaW5lIF9fcG1kX29mZnNldChhZGRyZXNzKQkoKChhZGRyZXNzKSA+PiBQTURfU0hJRlQpICYgKFBUUlNfUEVSX1BNRC0xKSkKLQotLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIGtlcm5lbCBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLwotI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykgcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcykKLQotI2RlZmluZSBwZ2RfaW5kZXgoYWRkcmVzcykJKCgoYWRkcmVzcykgPj4gUEdESVJfU0hJRlQpICYgKFBUUlNfUEVSX1BHRC0xKSkKLQotLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUtZGlyZWN0b3J5ICovCi0jZGVmaW5lIHBnZF9vZmZzZXQobW0sIGFkZHIpCSgobW0pLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcikpCi0KLS8qIEZpbmQgYW4gZW50cnkgaW4gdGhlIHRoaXJkLWxldmVsIHBhZ2UgdGFibGUuLiAqLwotI2RlZmluZSBfX3B0ZV9vZmZzZXQoYWRkcmVzcykJCQkJCQlcCi0JKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFIC0gMSkpCi0jZGVmaW5lIHB0ZV9vZmZzZXQoZGlyLCBhZGRyZXNzKQkJCQkJXAotCSgocHRlX3QgKikgcG1kX3BhZ2VfdmFkZHIoKihkaXIpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKLSNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwoZGlyLCBhZGRyZXNzKQkJCQkJXAotCSgocHRlX3QgKikgcG1kX3BhZ2VfdmFkZHIoKihkaXIpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKLQotI2RlZmluZSBwdGVfb2Zmc2V0X21hcChkaXIsIGFkZHJlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocHRlX3QgKilwYWdlX2FkZHJlc3MocG1kX3BhZ2UoKihkaXIpKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCi0jZGVmaW5lIHB0ZV9vZmZzZXRfbWFwX25lc3RlZChkaXIsIGFkZHJlc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhwbWRfcGFnZSgqKGRpcikpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKLSNkZWZpbmUgcHRlX3VubWFwKHB0ZSkgKCh2b2lkKShwdGUpKQotI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkgKCh2b2lkKShwdGUpKQotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQotCi0vKiBTd2FwIGVudHJpZXMgbXVzdCBoYXZlIFZBTElEIGJpdCBjbGVhcmVkLiAqLwotI2RlZmluZSBfX3N3cF90eXBlKHgpCQkoKCh4KS52YWwgPj4gMTApICYgMHgxZikKLSNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkoKHgpLnZhbCA+PiAxNSkKLSNkZWZpbmUgX19zd3BfZW50cnkodHlwZSxvZmZzZXQpCVwKLQkoKHN3cF9lbnRyeV90KSB7ICgodHlwZSkgPDwgMTApIHwgKChvZmZzZXQpIDw8IDE1KSB9KQotCi0vKgotICogQml0cyAwLCA0LCA4LCBhbmQgOSBhcmUgdGFrZW4sIHNwbGl0IHVwIDI4IGJpdHMgb2Ygb2Zmc2V0IGludG8gdGhpcyByYW5nZToKLSAqLwotI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkyOAotCi0jZGVmaW5lIHB0ZV90b19wZ29mZihfcHRlKQkoKCgoX3B0ZSkucHRlID4+IDEgKSAmIDB4MDcpIHwgXAotCQkJCSAoKChfcHRlKS5wdGUgPj4gMiApICYgMHgzOCkgfCBcCi0JCQkJICgoKF9wdGUpLnB0ZSA+PiAxMCkgPDwgIDYgKSkKLQotI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7ICgoKG9mZikgJiAweDA3KSA8PCAxICkgfCBcCi0JCQkJCSAgICgoKG9mZikgJiAweDM4KSA8PCAyICkgfCBcCi0JCQkJCSAgICgoKG9mZikgPj4gIDYgKSA8PCAxMCkgfCBcCi0JCQkJCSAgIF9QQUdFX0ZJTEUgfSkKLQotI2Vsc2UKLQotLyogU3dhcCBlbnRyaWVzIG11c3QgaGF2ZSBWQUxJRCBhbmQgR0xPQkFMIGJpdHMgY2xlYXJlZC4gKi8KLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpCi0jZGVmaW5lIF9fc3dwX3R5cGUoeCkJCSgoKHgpLnZhbCA+PiAyKSAmIDB4MWYpCi0jZGVmaW5lIF9fc3dwX29mZnNldCh4KSAJICgoeCkudmFsID4+IDcpCi0jZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsb2Zmc2V0KQlcCi0JCSgoc3dwX2VudHJ5X3QpICB7ICgodHlwZSkgPDwgMikgfCAoKG9mZnNldCkgPDwgNykgfSkKLSNlbHNlCi0jZGVmaW5lIF9fc3dwX3R5cGUoeCkJCSgoKHgpLnZhbCA+PiA4KSAmIDB4MWYpCi0jZGVmaW5lIF9fc3dwX29mZnNldCh4KSAJICgoeCkudmFsID4+IDEzKQotI2RlZmluZSBfX3N3cF9lbnRyeSh0eXBlLG9mZnNldCkJXAotCQkoKHN3cF9lbnRyeV90KSAgeyAoKHR5cGUpIDw8IDgpIHwgKChvZmZzZXQpIDw8IDEzKSB9KQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMikKLS8qCi0gKiBCaXRzIDAgYW5kIDEgb2YgcHRlX2hpZ2ggYXJlIHRha2VuLCB1c2UgdGhlIHJlc3QgZm9yIHRoZSBwYWdlIG9mZnNldC4uLgotICovCi0jZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCTMwCi0KLSNkZWZpbmUgcHRlX3RvX3Bnb2ZmKF9wdGUpCSgoX3B0ZSkucHRlX2hpZ2ggPj4gMikKLSNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikgCSgocHRlX3QpIHsgX1BBR0VfRklMRSwgKG9mZikgPDwgMiB9KQotCi0jZWxzZQotLyoKLSAqIEJpdHMgMCwgNCwgNiwgYW5kIDcgYXJlIHRha2VuLCBzcGxpdCB1cCAyOCBiaXRzIG9mIG9mZnNldCBpbnRvIHRoaXMgcmFuZ2U6Ci0gKi8KLSNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJMjgKLQotI2RlZmluZSBwdGVfdG9fcGdvZmYoX3B0ZSkJKCgoKF9wdGUpLnB0ZSA+PiAxKSAmIDB4NykgfCBcCi0JCQkJICgoKF9wdGUpLnB0ZSA+PiAyKSAmIDB4OCkgfCBcCi0JCQkJICgoKF9wdGUpLnB0ZSA+PiA4KSA8PCAgNCkpCi0KLSNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeyAoKChvZmYpICYgMHg3KSA8PCAxKSB8IFwKLQkJCQkJICAgKCgob2ZmKSAmIDB4OCkgPDwgMikgfCBcCi0JCQkJCSAgICgoKG9mZikgPj4gIDQpIDw8IDgpIHwgXAotCQkJCQkgICBfUEFHRV9GSUxFIH0pCi0jZW5kaWYKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpCi0jZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpICgoc3dwX2VudHJ5X3QpIHsgKHB0ZSkucHRlX2hpZ2ggfSkKLSNkZWZpbmUgX19zd3BfZW50cnlfdG9fcHRlKHgpCSgocHRlX3QpIHsgMCwgKHgpLnZhbCB9KQotI2Vsc2UKLSNkZWZpbmUgX19wdGVfdG9fc3dwX2VudHJ5KHB0ZSkJKChzd3BfZW50cnlfdCkgeyBwdGVfdmFsKHB0ZSkgfSkKLSNkZWZpbmUgX19zd3BfZW50cnlfdG9fcHRlKHgpCSgocHRlX3QpIHsgKHgpLnZhbCB9KQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVNNX1BHVEFCTEVfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTQ0NTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0IFdhbGRvcmYgR01CSAotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAxLCAyMDAyLCAyMDAzIFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTS4gQW50b2luZQotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqLwotI2lmbmRlZiBfQVNNX1BST0NFU1NPUl9ICi0jZGVmaW5lIF9BU01fUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxhc20vY2FjaGVjdGwuaD4KLSNpbmNsdWRlIDxhc20vY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS1pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL3ByZWZldGNoLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0vKgotICogUmV0dXJuIGN1cnJlbnQgKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuCi0gKi8KLSNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCi0KLS8qCi0gKiBTeXN0ZW0gc2V0dXAgYW5kIGhhcmR3YXJlIGZsYWdzLi4KLSAqLwotZXh0ZXJuIHZvaWQgKCpjcHVfd2FpdCkodm9pZCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgdmNlZF9jb3VudCwgdmNlaV9jb3VudDsKLQotI2lmZGVmIENPTkZJR18zMkJJVAotLyoKLSAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAyR0IuIFRoaXMgaXMgaGFyZGNvZGVkIGludG8gYSBmZXcgcGxhY2VzLAotICogc28gZG9uJ3QgY2hhbmdlIGl0IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0gKi8KLSNkZWZpbmUgVEFTS19TSVpFCTB4N2ZmZjgwMDBVTAotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0KLS8qCi0gKiBUaGlzIGRlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtCi0gKiBzcGFjZSBkdXJpbmcgbW1hcCdzLgotICovCi0jZGVmaW5lIFRBU0tfVU5NQVBQRURfQkFTRQkoKFRBU0tfU0laRSAvIDMpICYgfihQQUdFX1NJWkUpKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfNjRCSVQKLS8qCi0gKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMVRCLiBUaGlzIGlzIGhhcmRjb2RlZCBpbnRvIGEgZmV3IHBsYWNlcywKLSAqIHNvIGRvbid0IGNoYW5nZSBpdCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgVEFTS19TSVpFCi0gKiBpcyBsaW1pdGVkIHRvIDFUQiBieSB0aGUgUjQwMDAgYXJjaGl0ZWN0dXJlOyBSMTAwMDAgYW5kIGJldHRlciBjYW4KLSAqIHN1cHBvcnQgMTZUQjsgdGhlIGFyY2hpdGVjdHVyYWwgcmVzZXJ2ZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiBpcwotICogODE5MkVCIC4uLgotICovCi0jZGVmaW5lIFRBU0tfU0laRTMyCTB4N2ZmZjgwMDBVTAotI2RlZmluZSBUQVNLX1NJWkUJMHgxMDAwMDAwMDAwMFVMCi0jZGVmaW5lIFNUQUNLX1RPUAlcCi0gICAgICAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfQUREUikgPyBUQVNLX1NJWkUzMiA6IFRBU0tfU0laRSkKLQotLyoKLSAqIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KLSAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCi0gKi8KLSNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCQkJCQkJXAotCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKSA/CQkJCVwKLQkJUEFHRV9BTElHTihUQVNLX1NJWkUzMiAvIDMpIDogUEFHRV9BTElHTihUQVNLX1NJWkUgLyAzKSkKLSNkZWZpbmUgVEFTS19TSVpFX09GKHRzaykJCQkJCQlcCi0JKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGXzMyQklUX0FERFIpID8gVEFTS19TSVpFMzIgOiBUQVNLX1NJWkUpCi0jZW5kaWYKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlUQVNLX1NJWkUKLSNlbmRpZgotCi0jZGVmaW5lIE5VTV9GUFVfUkVHUwkzMgotCi10eXBlZGVmIF9fdTY0IGZwdXJlZ190OwotCi0vKgotICogSXQgd291bGQgYmUgbmljZSB0byBhZGQgc29tZSBtb3JlIGZpZWxkcyBmb3IgZW11bGF0b3Igc3RhdGlzdGljcywgYnV0IHRoZXJlCi0gKiBhcmUgYSBudW1iZXIgb2YgZml4ZWQgb2Zmc2V0cyBpbiBvZmZzZXQuaCBhbmQgZWxzZXdoZXJlIHRoYXQgd291bGQgaGF2ZSB0bwotICogYmUgcmVjYWxjdWxhdGVkIGJ5IGhhbmQuICBTbyB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIHByaXZhdGUgdG8KLSAqIHRoZSBGUFUgZW11bGF0b3IgZm9yIG5vdy4gIFNlZSBhc20tbWlwcy9mcHVfZW11bGF0b3IuaC4KLSAqLwotCi1zdHJ1Y3QgbWlwc19mcHVfc3RydWN0IHsKLQlmcHVyZWdfdAlmcHJbTlVNX0ZQVV9SRUdTXTsKLQl1bnNpZ25lZCBpbnQJZmNyMzE7Ci19OwotCi0jZGVmaW5lIE5VTV9EU1BfUkVHUyAgIDYKLQotdHlwZWRlZiBfX3UzMiBkc3ByZWdfdDsKLQotc3RydWN0IG1pcHNfZHNwX3N0YXRlIHsKLQlkc3ByZWdfdCAgICAgICAgZHNwcltOVU1fRFNQX1JFR1NdOwotCXVuc2lnbmVkIGludCAgICBkc3Bjb250cm9sOwotfTsKLQotI2RlZmluZSBJTklUX0NQVU1BU0sgeyBcCi0JezAsfSBcCi19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIHNlZzsKLX0gbW1fc2VnbWVudF90OwotCi0jZGVmaW5lIEFSQ0hfTUlOX1RBU0tBTElHTgk4Ci0KLXN0cnVjdCBtaXBzX2FiaTsKLQotLyoKLSAqIElmIHlvdSBjaGFuZ2UgdGhyZWFkX3N0cnVjdCByZW1lbWJlciB0byBjaGFuZ2UgdGhlICNkZWZpbmVzIGJlbG93IHRvbyEKLSAqLwotc3RydWN0IHRocmVhZF9zdHJ1Y3QgewotCS8qIFNhdmVkIG1haW4gcHJvY2Vzc29yIHJlZ2lzdGVycy4gKi8KLQl1bnNpZ25lZCBsb25nIHJlZzE2OwotCXVuc2lnbmVkIGxvbmcgcmVnMTcsIHJlZzE4LCByZWcxOSwgcmVnMjAsIHJlZzIxLCByZWcyMiwgcmVnMjM7Ci0JdW5zaWduZWQgbG9uZyByZWcyOSwgcmVnMzAsIHJlZzMxOwotCi0JLyogU2F2ZWQgY3AwIHN0dWZmLiAqLwotCXVuc2lnbmVkIGxvbmcgY3AwX3N0YXR1czsKLQotCS8qIFNhdmVkIGZwdS9mcHUgZW11bGF0b3Igc3R1ZmYuICovCi0Jc3RydWN0IG1pcHNfZnB1X3N0cnVjdCBmcHU7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfRlBBRkYKLQkvKiBFbXVsYXRlZCBpbnN0cnVjdGlvbiBjb3VudCAqLwotCXVuc2lnbmVkIGxvbmcgZW11bGF0ZWRfZnA7Ci0JLyogU2F2ZWQgcGVyLXRocmVhZCBzY2hlZHVsZXIgYWZmaW5pdHkgbWFzayAqLwotCWNwdW1hc2tfdCB1c2VyX2NwdXNfYWxsb3dlZDsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9GUEFGRiAqLwotCi0JLyogU2F2ZWQgc3RhdGUgb2YgdGhlIERTUCBBU0UsIGlmIGF2YWlsYWJsZS4gKi8KLQlzdHJ1Y3QgbWlwc19kc3Bfc3RhdGUgZHNwOwotCi0JLyogT3RoZXIgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aHJlYWQuICovCi0JdW5zaWduZWQgbG9uZyBjcDBfYmFkdmFkZHI7CS8qIExhc3QgdXNlciBmYXVsdCAqLwotCXVuc2lnbmVkIGxvbmcgY3AwX2JhZHVhZGRyOwkvKiBMYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgVVNFRyAqLwotCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKLQl1bnNpZ25lZCBsb25nIHRyYXBfbm87Ci0JdW5zaWduZWQgbG9uZyBpcml4X3RyYW1wb2xpbmU7ICAvKiBXaGVlZS4uLiAqLwotCXVuc2lnbmVkIGxvbmcgaXJpeF9vbGRjdHg7Ci0Jc3RydWN0IG1pcHNfYWJpICphYmk7Ci19OwotCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfRlBBRkYKLSNkZWZpbmUgRlBBRkZfSU5JVAkJCQkJCVwKLQkuZW11bGF0ZWRfZnAJCQk9IDAsCQkJXAotCS51c2VyX2NwdXNfYWxsb3dlZAkJPSBJTklUX0NQVU1BU0ssCi0jZWxzZQotI2RlZmluZSBGUEFGRl9JTklUCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfRlBBRkYgKi8KLQotI2RlZmluZSBJTklUX1RIUkVBRCAgewkJCQkJCVwKLSAgICAgICAgLyoJCQkJCQkJXAotICAgICAgICAgKiBTYXZlZCBtYWluIHByb2Nlc3NvciByZWdpc3RlcnMJCQlcCi0gICAgICAgICAqLwkJCQkJCQlcCi0JLnJlZzE2CQkJPSAwLAkJCQlcCi0JLnJlZzE3CQkJPSAwLAkJCQlcCi0JLnJlZzE4CQkJPSAwLAkJCQlcCi0JLnJlZzE5CQkJPSAwLAkJCQlcCi0JLnJlZzIwCQkJPSAwLAkJCQlcCi0JLnJlZzIxCQkJPSAwLAkJCQlcCi0JLnJlZzIyCQkJPSAwLAkJCQlcCi0JLnJlZzIzCQkJPSAwLAkJCQlcCi0JLnJlZzI5CQkJPSAwLAkJCQlcCi0JLnJlZzMwCQkJPSAwLAkJCQlcCi0JLnJlZzMxCQkJPSAwLAkJCQlcCi0JLyoJCQkJCQkJXAotCSAqIFNhdmVkIGNwMCBzdHVmZgkJCQkJXAotCSAqLwkJCQkJCQlcCi0JLmNwMF9zdGF0dXMJCT0gMCwJCQkJXAotCS8qCQkJCQkJCVwKLQkgKiBTYXZlZCBGUFUvRlBVIGVtdWxhdG9yIHN0dWZmCQkJCVwKLQkgKi8JCQkJCQkJXAotCS5mcHUJCQk9IHsJCQkJXAotCQkuZnByCQk9IHswLH0sCQkJCVwKLQkJLmZjcjMxCQk9IDAsCQkJCVwKLQl9LAkJCQkJCQlcCi0JLyoJCQkJCQkJXAotCSAqIEZQVSBhZmZpbml0eSBzdGF0ZSAobnVsbCBpZiBub3QgRlBBRkYpCQlcCi0JICovCQkJCQkJCVwKLQlGUEFGRl9JTklUCQkJCQkJXAotCS8qCQkJCQkJCVwKLQkgKiBTYXZlZCBEU1Agc3R1ZmYJCQkJCVwKLQkgKi8JCQkJCQkJXAotCS5kc3AJCQk9IHsJCQkJXAotCQkuZHNwcgkJPSB7MCwgfSwJCQlcCi0JCS5kc3Bjb250cm9sCT0gMCwJCQkJXAotCX0sCQkJCQkJCVwKLQkvKgkJCQkJCQlcCi0JICogT3RoZXIgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzCQlcCi0JICovCQkJCQkJCVwKLQkuY3AwX2JhZHZhZGRyCQk9IDAsCQkJCVwKLQkuY3AwX2JhZHVhZGRyCQk9IDAsCQkJCVwKLQkuZXJyb3JfY29kZQkJPSAwLAkJCQlcCi0JLnRyYXBfbm8JCT0gMCwJCQkJXAotCS5pcml4X3RyYW1wb2xpbmUJPSAwLAkJCQlcCi0JLmlyaXhfb2xkY3R4CQk9IDAsCQkJCVwKLX0KLQotc3RydWN0IHRhc2tfc3RydWN0OwotCi0vKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KLSNkZWZpbmUgcmVsZWFzZV90aHJlYWQodGhyZWFkKSBkbyB7IH0gd2hpbGUoMCkKLQotLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KLSNkZWZpbmUgcHJlcGFyZV90b19jb3B5KHRzaykJZG8geyB9IHdoaWxlICgwKQotCi1leHRlcm4gbG9uZyBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKLQotLyoKLSAqIERvIG5lY2Vzc2FyeSBzZXR1cCB0byBzdGFydCB1cCBhIG5ld2x5IGV4ZWN1dGVkIHRocmVhZC4KLSAqLwotZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCk7Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci0KLSNkZWZpbmUgX19LU1RLX1RPUyh0c2spICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSArIFRIUkVBRF9TSVpFIC0gMzIpCi0jZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MgKilfX0tTVEtfVE9TKHRzaykgLSAxKQotI2RlZmluZSBLU1RLX0VJUCh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX2VwYykKLSNkZWZpbmUgS1NUS19FU1AodHNrKSAodGFza19wdF9yZWdzKHRzayktPnJlZ3NbMjldKQotI2RlZmluZSBLU1RLX1NUQVRVUyh0c2spICh0YXNrX3B0X3JlZ3ModHNrKS0+Y3AwX3N0YXR1cykKLQotI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKLQotLyoKLSAqIFJldHVybl9hZGRyZXNzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyhjb3VudCkKLSAqIHdoaWNoIG9uIGNlcnRhaW4gYXJjaGl0ZWN0dXJlcyBjYW5ub3QgcmVhc29uYWJseSBiZSBpbXBsZW1lbnRlZCBpbiBHQ0MKLSAqIChNSVBTLCBBbHBoYSkgb3IgaXMgdW51c2VhYmxlIHdpdGggLWZvbWl0LWZyYW1lLXBvaW50ZXIgKGkzODYpLgotICogTm90ZSB0aGF0IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyh4Pj0xKSBpcyBmb3JiaWRkZW4gYmVjYXVzZSBHQ0MKLSAqIGFib3J0cyBjb21waWxhdGlvbiBvbiBzb21lIENQVXMuICBJdCdzIHNpbXBseSBub3QgcG9zc2libGUgdG8gdW53aW5kCi0gKiBzb21lIENQVSdzIHN0YWNrZnJhbWVzLgotICoKLSAqIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcyB3b3JrcyBvbmx5IGZvciBub24tbGVhZiBmdW5jdGlvbnMuICBXZSBhdm9pZCB0aGUKLSAqIG92ZXJoZWFkIG9mIGEgZnVuY3Rpb24gY2FsbCBieSBmb3JjaW5nIHRoZSBjb21waWxlciB0byBzYXZlIHRoZSByZXR1cm4KLSAqIGFkZHJlc3MgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLgotICovCi0jZGVmaW5lIHJldHVybl9hZGRyZXNzKCkgKHtfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiIkMzEiKTtfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7fSkKLQotI2lmZGVmIENPTkZJR19DUFVfSEFTX1BSRUZFVENICi0KLSNkZWZpbmUgQVJDSF9IQVNfUFJFRkVUQ0gKLQotc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNoKGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIgkuc2V0CW1pcHM0CQlcbiIKLQkiCXByZWYJJTAsICglMSkJXG4iCi0JIgkuc2V0CW1pcHMwCQlcbiIKLQk6Ci0JOiAiaSIgKFByZWZfTG9hZCksICJyIiAoYWRkcikpOwotfQotCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9BU01fUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZmN2UzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDAgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICovCi0jaWZuZGVmIF9BU01fUFRSQUNFX0gKLSNkZWZpbmUgX0FTTV9QVFJBQ0VfSAotCi0KLS8qIDAgLSAzMSBhcmUgaW50ZWdlciByZWdpc3RlcnMsIDMyIC0gNjMgYXJlIGZwIHJlZ2lzdGVycy4gICovCi0jZGVmaW5lIEZQUl9CQVNFCTMyCi0jZGVmaW5lIFBDCQk2NAotI2RlZmluZSBDQVVTRQkJNjUKLSNkZWZpbmUgQkFEVkFERFIJNjYKLSNkZWZpbmUgTU1ISQkJNjcKLSNkZWZpbmUgTU1MTwkJNjgKLSNkZWZpbmUgRlBDX0NTUgkJNjkKLSNkZWZpbmUgRlBDX0VJUgkJNzAKLSNkZWZpbmUgRFNQX0JBU0UJNzEJCS8qIDMgbW9yZSBoaSAvIGxvIHJlZ2lzdGVyIHBhaXJzICovCi0jZGVmaW5lIERTUF9DT05UUk9MCTc3Ci0jZGVmaW5lIEFDWAkJNzgKLQotLyoKLSAqIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrIGR1cmluZyBhCi0gKiBzeXN0ZW0gY2FsbC9leGNlcHRpb24uIEFzIHVzdWFsIHRoZSByZWdpc3RlcnMgazAvazEgYXJlbid0IGJlaW5nIHNhdmVkLgotICovCi1zdHJ1Y3QgcHRfcmVncyB7Ci0jaWZkZWYgQ09ORklHXzMyQklUCi0JLyogUGFkIGJ5dGVzIGZvciBhcmd1bWVudCBzYXZlIHNwYWNlIG9uIHRoZSBzdGFjay4gKi8KLQl1bnNpZ25lZCBsb25nIHBhZDBbNl07Ci0jZW5kaWYKLQotCS8qIFNhdmVkIG1haW4gcHJvY2Vzc29yIHJlZ2lzdGVycy4gKi8KLQl1bnNpZ25lZCBsb25nIHJlZ3NbMzJdOwotCi0JLyogU2F2ZWQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0JdW5zaWduZWQgbG9uZyBjcDBfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgaGk7Ci0JdW5zaWduZWQgbG9uZyBsbzsKLSNpZmRlZiBDT05GSUdfQ1BVX0hBU19TTUFSVE1JUFMKLQl1bnNpZ25lZCBsb25nIGFjeDsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgY3AwX2JhZHZhZGRyOwotCXVuc2lnbmVkIGxvbmcgY3AwX2NhdXNlOwotCXVuc2lnbmVkIGxvbmcgY3AwX2VwYzsKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JdW5zaWduZWQgbG9uZyBjcDBfdGNzdGF0dXM7Ci0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKLQotLyogQXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBzYW1lIHB0cmFjZSBudW1iZXJzIGFzIHVzZWQgYnkgdGhlIFNwYXJjIGNvZGUuICovCi0jZGVmaW5lIFBUUkFDRV9HRVRSRUdTCQkxMgotI2RlZmluZSBQVFJBQ0VfU0VUUkVHUwkJMTMKLSNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUwkJMTQKLSNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUwkJMTUKLS8qICNkZWZpbmUgUFRSQUNFX0dFVEZQWFJFR1MJCTE4ICovCi0vKiAjZGVmaW5lIFBUUkFDRV9TRVRGUFhSRUdTCQkxOSAqLwotCi0jZGVmaW5lIFBUUkFDRV9PTERTRVRPUFRJT05TCTIxCi0KLSNkZWZpbmUgUFRSQUNFX0dFVF9USFJFQURfQVJFQQkyNQotI2RlZmluZSBQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBCTI2Ci0KLS8qIENhbGxzIHRvIHRyYWNlIGEgNjRiaXQgcHJvZ3JhbSBmcm9tIGEgMzJiaXQgcHJvZ3JhbS4gICovCi0jZGVmaW5lIFBUUkFDRV9QRUVLVEVYVF8zMjY0CTB4YzAKLSNkZWZpbmUgUFRSQUNFX1BFRUtEQVRBXzMyNjQJMHhjMQotI2RlZmluZSBQVFJBQ0VfUE9LRVRFWFRfMzI2NAkweGMyCi0jZGVmaW5lIFBUUkFDRV9QT0tFREFUQV8zMjY0CTB4YzMKLSNkZWZpbmUgUFRSQUNFX0dFVF9USFJFQURfQVJFQV8zMjY0CTB4YzQKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vaXNhZGVwLmg+Ci0KLS8qCi0gKiBEb2VzIHRoZSBwcm9jZXNzIGFjY291bnQgZm9yIHVzZXIgb3IgZm9yIHN5c3RlbSB0aW1lPwotICovCi0jZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoKChyZWdzKS0+Y3AwX3N0YXR1cyAmIEtVX01BU0spID09IEtVX1VTRVIpCi0KLSNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5jcDBfZXBjKQotI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKLQotZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KTsKLQotZXh0ZXJuIE5PUkVUX1RZUEUgdm9pZCBkaWUoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcHRfcmVncyAqKSBBVFRSSUJfTk9SRVQ7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaWYgKHVubGlrZWx5KCF1c2VyX21vZGUocmVncykpKQotCQlkaWUoc3RyLCByZWdzKTsKLX0KLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVNNX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NtdGMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc210Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjM5YjI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc210Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NNVENfTVRfSAotI2RlZmluZSBfQVNNX1NNVENfTVRfSAotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIFNNVEMgbXVsdGl0YXNraW5nIG9uIE1JUFMgTVQgY29yZXMKLSAqLwotCi0jaW5jbHVkZSA8YXNtL21pcHNfbXQuaD4KLQotLyoKLSAqIFN5c3RlbS13aWRlIFNNVEMgc3RhdHVzIGluZm9ybWF0aW9uCi0gKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBzbXRjX3N0YXR1czsKLQotI2RlZmluZSBTTVRDX1RMQl9TSEFSRUQJMHgwMDAwMDAwMQotI2RlZmluZSBTTVRDX01UQ19BQ1RJVkUJMHgwMDAwMDAwMgotCi0vKgotICogVExCL0FTSUQgTWFuYWdlbWVudCBpbmZvcm1hdGlvbgotICovCi0KLSNkZWZpbmUgTUFYX1NNVENfVExCUyAyCi0jZGVmaW5lIE1BWF9TTVRDX0FTSURTIDI1NgotI2lmIE5SX0NQVVMgPD0gOAotdHlwZWRlZiBjaGFyIGFzaWR1c2U7Ci0jZWxzZQotI2lmIE5SX0NQVVMgPD0gMTYKLXR5cGVkZWYgc2hvcnQgYXNpZHVzZTsKLSNlbHNlCi10eXBlZGVmIGxvbmcgYXNpZHVzZTsKLSNlbmRpZgotI2VuZGlmCi0KLWV4dGVybiBhc2lkdXNlIHNtdGNfbGl2ZV9hc2lkW01BWF9TTVRDX1RMQlNdW01BWF9TTVRDX0FTSURTXTsKLQotc3RydWN0IG1tX3N0cnVjdDsKLXN0cnVjdCB0YXNrX3N0cnVjdDsKLQotdm9pZCBzbXRjX2dldF9uZXdfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgY3B1KTsKLQotdm9pZCBzbXRjX2ZsdXNoX3RsYl9hc2lkKHVuc2lnbmVkIGxvbmcgYXNpZCk7Ci1leHRlcm4gaW50IG1pcHNtdF9idWlsZF9jcHVfbWFwKGludCBzdGFydHNsb3QpOwotZXh0ZXJuIHZvaWQgbWlwc210X3ByZXBhcmVfY3B1cyh2b2lkKTsKLWV4dGVybiB2b2lkIHNtdGNfc21wX2ZpbmlzaCh2b2lkKTsKLWV4dGVybiB2b2lkIHNtdGNfYm9vdF9zZWNvbmRhcnkoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICp0KTsKLWV4dGVybiB2b2lkIHNtdGNfY3B1c19kb25lKHZvaWQpOwotCi0vKgotICogU2hhcmluZyB0aGUgVExCIGJldHdlZW4gbXVsdGlwbGUgVlBFcyBtZWFucyB0aGF0IHRoZQotICogInJhbmRvbSIgaW5kZXggc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIHRvCi0gKiBzZWxlY3QgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIEluZGV4IHJlZ2lzdGVyLiBUbwotICogYXZvaWQgYWRkaXRpb25hbCBUTEIgcHJlc3N1cmUsIHRoZSBJbmRleCByZWdpc3RlcnMKLSAqIGFyZSAicGFya2VkIiB3aXRoIGFuIG5vbi1WYWxpZCB2YWx1ZS4KLSAqLwotCi0jZGVmaW5lIFBBUktFRF9JTkRFWAkoKHVuc2lnbmVkIGludCkweDgwMDAwMDAwKQotCi0vKgotICogRGVmaW5lIGxvdy1sZXZlbCBpbnRlcnJ1cHQgbWFzayBmb3IgSVBJcywgaWYgbmVjZXNzYXJ5LgotICogQnkgZGVmYXVsdCwgdXNlIFNXIGludGVycnVwdCAxLCB3aGljaCByZXF1aXJlcyBubyBleHRlcm5hbAotICogaGFyZHdhcmUgc3VwcG9ydCwgYnV0IHdoaWNoIHdvcmtzIG9ubHkgZm9yIHNpbmdsZS1jb3JlCi0gKiBNSVBTIE1UIHN5c3RlbXMuCi0gKi8KLSNpZm5kZWYgTUlQU19DUFVfSVBJX0lSUQotI2RlZmluZSBNSVBTX0NQVV9JUElfSVJRIDEKLSNlbmRpZgotCi0jZW5kaWYgLyogIF9BU01fU01UQ19NVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2tsY29uZmlnLmggYi9pbmNsdWRlL2FzbS1taXBzL3NuL2tsY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2ZkMmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zbi9rbGNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODk4ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBEZXJpdmVkIGZyb20gSVJJWCA8c3lzL1NOL2tsY29uZmlnLmg+LgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIGJ5IFJhbGYgQmFlY2hsZQotICovCi0jaWZuZGVmCV9BU01fU05fS0xDT05GSUdfSAotI2RlZmluZQlfQVNNX1NOX0tMQ09ORklHX0gKLQotLyoKLSAqIFRoZSBLTENPTkZJRyBzdHJ1Y3R1cmVzIHN0b3JlIGluZm8gYWJvdXQgdGhlIHZhcmlvdXMgQk9BUkRzIGZvdW5kCi0gKiBkdXJpbmcgSGFyZHdhcmUgRGlzY292ZXJ5LiBJbiBhZGRpdGlvbiwgaXQgc3RvcmVzIGluZm8gYWJvdXQgdGhlCi0gKiBjb21wb25lbnRzIGZvdW5kIG9uIHRoZSBCT0FSRHMuCi0gKi8KLQotLyoKLSAqIFdBUk5JTkc6Ci0gKglDZXJ0YWluIGFzc2VtYmx5IGxhbmd1YWdlIHJvdXRpbmVzIChub3RhYmx5IHh4eHh4LnMpIGluIHRoZSBJUDI3UFJPTQotICoJd2lsbCBkZXBlbmQgb24gdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZS4gIEluCi0gKiAgICAgIG1vc3QgY2FzZXMsIHJlYXJyYW5naW5nIHRoZSBmaWVsZHMgY2FuIHNlcmlvdXNseSBicmVhayB0aGluZ3MuCi0gKiAgICAgIEFkZGluZyBmaWVsZHMgaW4gdGhlIGJlZ2lubmluZyBvciBtaWRkbGUgY2FuIGFsc28gYnJlYWsgdGhpbmdzLgotICogICAgICBBZGQgZmllbGRzIGlmIG5lY2Vzc2FyeSwgdG8gdGhlIGVuZCBvZiBhIHN0cnVjdCBpbiBzdWNoIGEgd2F5Ci0gKiAgICAgIHRoYXQgb2Zmc2V0cyBvZiBleGlzdGluZyBmaWVsZHMgZG8gbm90IGNoYW5nZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KLQotI2lmIGRlZmluZWQoQ09ORklHX1NHSV9JUDI3KQotCi0jaW5jbHVkZSA8YXNtL3NuL3NuMC9hZGRycy5oPgotLy8jaW5jbHVkZSA8c3lzL1NOL3JvdXRlci5oPgotLy8gWFhYIFN0b2xlbiBmcm9tIDxzeXMvU04vcm91dGVyLmg+OgotI2RlZmluZSBNQVhfUk9VVEVSX1BPUlRTICg2KSAgICAvKiBNYXguIG51bWJlciBvZiBwb3J0cyBvbiBhIHJvdXRlciAqLwotI2luY2x1ZGUgPGFzbS9zbi9mcnUuaD4KLS8vI2luY2x1ZGUgPHN5cy9ncmFwaC5oPgotLy8jaW5jbHVkZSA8c3lzL3h0YWxrL3hib3cuaD4KLQotI2VsaWYgZGVmaW5lZChDT05GSUdfU0dJX0lQMzUpCi0KLSNpbmNsdWRlIDxhc20vc24vc24xL2FkZHJzLmg+Ci0jaW5jbHVkZSA8c3lzL3NuL3JvdXRlci5oPgotI2luY2x1ZGUgPHN5cy9ncmFwaC5oPgotI2luY2x1ZGUgPGFzbS94dGFsay94Ym93Lmg+Ci0KLSNlbmRpZiAvKiAhQ09ORklHX1NHSV9JUDI3ICYmICFDT05GSUdfU0dJX0lQMzUgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NHSV9JUDI3KSB8fCBkZWZpbmVkKENPTkZJR19TR0lfSVAzNSkKLSNpbmNsdWRlIDxhc20vc24vYWdlbnQuaD4KLSNpbmNsdWRlIDxhc20vZncvYXJjL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2Z3L2FyYy9oaW52Lmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfU0dJX0lQMzUpCi0vLyBUaGUgaGFjayBmaWxlIGhhcyB0byBiZSBiZWZvcmUgdmVjdG9yIGFuZCBhZnRlciBzbjBfZnJ1Li4uLgotI2luY2x1ZGUgPGFzbS9oYWNrLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3ZlY3Rvci5oPgotI2luY2x1ZGUgPGFzbS94dGFsay94dGFsay5oPgotI2VuZGlmIC8qIENPTkZJR19TR0lfSVAzNSAqLwotI2VuZGlmIC8qIENPTkZJR19TR0lfSVAyNyB8fCBDT05GSUdfU0dJX0lQMzUgKi8KLQotdHlwZWRlZiB1NjQgIG5pY190OwotCi0jZGVmaW5lIEtMQ0ZHSU5GT19NQUdJQwkweGJlZWRiYWJlCi0KLXR5cGVkZWYgczMyIGtsY29uZl9vZmZfdDsKLQotLyoKLSAqIFNvbWUgSU1QT1JUQU5UIE9GRlNFVFMuIFRoZXNlIGFyZSB0aGUgb2Zmc2V0cyBvbiBhbGwgTk9ERVMuCi0gKi8KLSNkZWZpbmUJTUFYX01PRFVMRV9JRAkJMjU1Ci0jZGVmaW5lIFNJWkVfUEFECQk0MDk2IC8qIDRrIHBhZGRpbmcgZm9yIHN0cnVjdHVyZXMgKi8KLS8qCi0gKiAxIE5PREUgYnJkLCAyIFJvdXRlciBicmQgKDEgOHAsIDEgbWV0YSksIDYgV2lkZ2V0cywKLSAqIDIgTWlkcGxhbmVzIGFzc3VtaW5nIG5vIHBjaSBjYXJkIGNhZ2VzCi0gKi8KLSNkZWZpbmUgTUFYX1NMT1RTX1BFUl9OT0RFCSgxICsgMiArIDYgKyAyKQotCi0vKiBYWFggaWYgZWFjaCBub2RlIGlzIGd1cmFudGVlZCB0byBoYXZlIHNvbWUgbWVtb3J5ICovCi0KLSNkZWZpbmUgTUFYX1BDSV9ERVZTCQk4Ci0KLS8qIGxib2FyZF90LT5icmRfZmxhZ3MgZmllbGRzICovCi0vKiBBbGwgYml0cyBpbiB0aGlzIGZpZWxkIGFyZSBjdXJyZW50bHkgdXNlZC4gVHJ5IHRoZSBwYWQgZmllbGRzIGlmCi0gICB5b3UgbmVlZCBtb3JlIGZsYWcgYml0cyAqLwotCi0jZGVmaW5lIEVOQUJMRV9CT0FSRCAJCTB4MDEKLSNkZWZpbmUgRkFJTEVEX0JPQVJEICAJCTB4MDIKLSNkZWZpbmUgRFVQTElDQVRFX0JPQVJEIAkweDA0ICAgIC8qIEJvYXJkcyBsaWtlIG1pZHBsYW5lcy9yb3V0ZXJzIHdoaWNoCi0JCQkJCSAgIGFyZSBkaXNjb3ZlcmVkIHR3aWNlLiBVc2Ugb25lIG9mIHRoZW0gKi8KLSNkZWZpbmUgVklTSVRFRF9CT0FSRAkJMHgwOAkvKiBVc2VkIGZvciBjb21wYWN0IGh1YiBudW1iZXJpbmcuICovCi0jZGVmaW5lIExPQ0FMX01BU1RFUl9JTzYJMHgxMCAJLyogbWFzdGVyIGlvNiBmb3IgdGhhdCBub2RlICovCi0jZGVmaW5lIEdMT0JBTF9NQVNURVJfSU82CTB4MjAKLSNkZWZpbmUgVEhJUkRfTklDX1BSRVNFTlQgCTB4NDAgIAkvKiBmb3IgZnV0dXJlIHVzZSAqLwotI2RlZmluZSBTRUNPTkRfTklDX1BSRVNFTlQgCTB4ODAgCS8qIGFkZG9ucyBsaWtlIE1JTyBhcmUgcHJlc2VudCAqLwotCi0vKiBrbGluZm8tPmZsYWdzIGZpZWxkcyAqLwotCi0jZGVmaW5lIEtMSU5GT19FTkFCTEUgCQkweDAxICAgIC8qIFRoaXMgY29tcG9uZW50IGlzIGVuYWJsZWQgKi8KLSNkZWZpbmUgS0xJTkZPX0ZBSUxFRCAgIAkweDAyIAkvKiBUaGlzIGNvbXBvbmVudCBmYWlsZWQgKi8KLSNkZWZpbmUgS0xJTkZPX0RFVklDRSAgIAkweDA0IAkvKiBUaGlzIGNvbXBvbmVudCBpcyBhIGRldmljZSAqLwotI2RlZmluZSBLTElORk9fVklTSVRFRCAgCTB4MDggCS8qIFRoaXMgY29tcG9uZW50IGhhcyBiZWVuIHZpc2l0ZWQgKi8KLSNkZWZpbmUgS0xJTkZPX0NPTlRST0xMRVIgICAJMHgxMCAJLyogVGhpcyBjb21wb25lbnQgaXMgYSBkZXZpY2UgY29udHJvbGxlciAqLwotI2RlZmluZSBLTElORk9fSU5TVEFMTCAgIAkweDIwICAJLyogSW5zdGFsbCBhIGRyaXZlciAqLwotI2RlZmluZQlLTElORk9fSEVBRExFU1MJCTB4NDAJLyogSGVhZGxlc3MgKG9yIGh1Ymxlc3MpIGNvbXBvbmVudCAqLwotI2RlZmluZSBJU19DT05TT0xFX0lPQzMoaSkJKCgoKGtsaW5mb190ICopaSktPmZsYWdzKSAmIEtMSU5GT19JTlNUQUxMKQotCi0jZGVmaW5lIEdCMgkJMHg4MDAwMDAwMAotCi0jZGVmaW5lIE1BWF9SU1ZfUFRSUwkzMgotCi0vKiBTdHJ1Y3R1cmVzIHRvIG1hbmFnZSB2YXJpb3VzIGRhdGEgc3RvcmFnZSBhcmVhcyAqLwotLyogVGhlIG51bWJlcnMgbXVzdCBiZSBjb250aWd1b3VzIHNpbmNlIHRoZSBhcnJheSBpbmRleCBpCi0gICBpcyB1c2VkIGluIHRoZSBjb2RlIHRvIGFsbG9jYXRlIHZhcmlvdXMgYXJlYXMuCi0qLwotCi0jZGVmaW5lIEJPQVJEX1NUUlVDVCAJCTAKLSNkZWZpbmUgQ09NUE9ORU5UX1NUUlVDVCAJMQotI2RlZmluZSBFUlJJTkZPX1NUUlVDVCAJCTIKLSNkZWZpbmUgS0xNQUxMT0NfVFlQRV9NQVggCShFUlJJTkZPX1NUUlVDVCArIDEpCi0jZGVmaW5lIERFVklDRV9TVFJVQ1QgCQkzCi0KLQotdHlwZWRlZiBzdHJ1Y3QgY29uc29sZV9zIHsKLQl1bnNpZ25lZCBsb25nIAl1YXJ0X2Jhc2U7Ci0JdW5zaWduZWQgbG9uZyAJY29uZmlnX2Jhc2U7Ci0JdW5zaWduZWQgbG9uZyAJbWVtb3J5X2Jhc2U7Ci0Jc2hvcnQJCWJhdWQ7Ci0Jc2hvcnQJCWZsYWc7Ci0JaW50CQl0eXBlOwotCW5hc2lkX3QJCW5hc2lkOwotCWNoYXIJCXdpZDsKLQljaGFyIAkJbnBjaTsKLQluaWNfdAkJYmFzZWlvX25pYzsKLX0gY29uc29sZV90OwotCi10eXBlZGVmIHN0cnVjdCBrbGNfbWFsbG9jX2hkciB7Ci0gICAgICAgIGtsY29uZl9vZmZfdCBrbV9iYXNlOwotICAgICAgICBrbGNvbmZfb2ZmX3Qga21fbGltaXQ7Ci0gICAgICAgIGtsY29uZl9vZmZfdCBrbV9jdXJyZW50OwotfSBrbGNfbWFsbG9jX2hkcl90OwotCi0vKiBGdW5jdGlvbnMvbWFjcm9zIG5lZWRlZCB0byB1c2UgdGhpcyBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qga2xfY29uZmlnX2hkciB7Ci0JdTY0CQljaF9tYWdpYzsJLyogc2V0IHRoaXMgdG8gS0xDRkdJTkZPX01BR0lDICovCi0JdTMyCQljaF92ZXJzaW9uOyAgICAvKiBzdHJ1Y3R1cmUgdmVyc2lvbiBudW1iZXIgKi8KLQlrbGNvbmZfb2ZmX3QJY2hfbWFsbG9jX2hkcl9vZmY7IC8qIG9mZnNldCBvZiBjaF9tYWxsb2NfaGRyICovCi0Ja2xjb25mX29mZl90CWNoX2NvbnNfb2ZmOyAgICAgICAvKiBvZmZzZXQgb2YgY2hfY29ucyAqLwotCWtsY29uZl9vZmZfdAljaF9ib2FyZF9pbmZvOwkvKiB0aGUgbGluayBsaXN0IG9mIGJvYXJkcyAqLwotCWNvbnNvbGVfdAljaF9jb25zX2luZm87CS8qIGFkZHJlc3MgaW5mbyBvZiB0aGUgY29uc29sZSAqLwotCWtsY19tYWxsb2NfaGRyX3QgY2hfbWFsbG9jX2hkcltLTE1BTExPQ19UWVBFX01BWF07Ci0JY29uZmlkZW5jZV90CWNoX3N3X2JlbGllZjsJLyogY29uZmlkZW5jZSB0aGF0IHNvZnR3YXJlIGlzIGJhZCovCi0JY29uZmlkZW5jZV90CWNoX3NuMG5ldF9iZWxpZWY7IC8qIGNvbmZpZGVuY2UgdGhhdCBzbjBuZXQgaXMgYmFkICovCi19IGtsX2NvbmZpZ19oZHJfdDsKLQotCi0jZGVmaW5lIEtMX0NPTkZJR19IRFIoX25hc2lkKSAJKChrbF9jb25maWdfaGRyX3QgKikoS0xDT05GSUdfQUREUihfbmFzaWQpKSkKLSNkZWZpbmUgS0xfQ09ORklHX0lORk9fT0ZGU0VUKF9uYXNpZCkJCQkJCVwKLSAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbykKLSNkZWZpbmUgS0xfQ09ORklHX0lORk9fU0VUX09GRlNFVChfbmFzaWQsIF9vZmYpCQkJCVwKLSAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbyA9IChfb2ZmKSkKLQotI2RlZmluZSBLTF9DT05GSUdfSU5GTyhfbmFzaWQpIAkJCQkJCVwKLSAgICAgICAgKGxib2FyZF90ICopKChLTF9DT05GSUdfSERSKF9uYXNpZCktPmNoX2JvYXJkX2luZm8pID8JCVwKLQkgTk9ERV9PRkZTRVRfVE9fSzEoKF9uYXNpZCksIEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfYm9hcmRfaW5mbykgOiBcCi0JIDApCi0jZGVmaW5lIEtMX0NPTkZJR19NQUdJQyhfbmFzaWQpCQkoS0xfQ09ORklHX0hEUihfbmFzaWQpLT5jaF9tYWdpYykKLQotI2RlZmluZSBLTF9DT05GSUdfQ0hFQ0tfTUFHSUMoX25hc2lkKQkJCQkJXAotICAgICAgICAoS0xfQ09ORklHX0hEUihfbmFzaWQpLT5jaF9tYWdpYyA9PSBLTENGR0lORk9fTUFHSUMpCi0KLSNkZWZpbmUgS0xfQ09ORklHX0hEUl9JTklUX01BR0lDKF9uYXNpZCkJXAotICAgICAgICAgICAgICAgICAgKEtMX0NPTkZJR19IRFIoX25hc2lkKS0+Y2hfbWFnaWMgPSBLTENGR0lORk9fTUFHSUMpCi0KLS8qIC0tLSBOZXcgTWFjcm9zIGZvciB0aGUgY2hhbmdlZCBrbF9jb25maWdfaGRyX3Qgc3RydWN0dXJlIC0tLSAqLwotCi0jZGVmaW5lIFBUUl9DSF9NQUxMT0NfSERSKF9rKSAgICgoa2xjX21hbGxvY19oZHJfdCAqKVwKLQkJCSgodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfbWFsbG9jX2hkcl9vZmYpKSkKLQotI2RlZmluZSBLTF9DT05GSUdfQ0hfTUFMTE9DX0hEUihfbikgICBQVFJfQ0hfTUFMTE9DX0hEUihLTF9DT05GSUdfSERSKF9uKSkKLQotI2RlZmluZSBQVFJfQ0hfQ09OU19JTkZPKF9rKQkoKGNvbnNvbGVfdCAqKVwKLQkJCSgodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfY29uc19vZmYpKSkKLQotI2RlZmluZSBLTF9DT05GSUdfQ0hfQ09OU19JTkZPKF9uKSAgIFBUUl9DSF9DT05TX0lORk8oS0xfQ09ORklHX0hEUihfbikpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBLTF9DT05GSUdfSU5GT19TVEFSVChfbmFzaWQpCVwKLSAgICAgICAgKGtsY29uZl9vZmZfdCkoS0xDT05GSUdfT0ZGU0VUKF9uYXNpZCkgKyBzaXplb2Yoa2xfY29uZmlnX2hkcl90KSkKLQotI2RlZmluZSBLTF9DT05GSUdfQk9BUkRfTkFTSUQoX2JyZCkJKChfYnJkKS0+YnJkX25hc2lkKQotI2RlZmluZSBLTF9DT05GSUdfQk9BUkRfU0VUX05FWFQoX2JyZCwgX29mZikJKChfYnJkKS0+YnJkX25leHQgPSAoX29mZikpCi0KLSNkZWZpbmUgS0xfQ09ORklHX0RVUExJQ0FURV9CT0FSRChfYnJkKQkoKF9icmQpLT5icmRfZmxhZ3MgJiBEVVBMSUNBVEVfQk9BUkQpCi0KLSNkZWZpbmUgWEJPV19QT1JUX1RZUEVfSFVCKF94Ym93cCwgX2xpbmspIAlcCi0gICAgICAgICAgICAgICAoKF94Ym93cCktPnhib3dfcG9ydF9pbmZvWyhfbGluaykgLSBCQVNFX1hCT1dfUE9SVF0ucG9ydF9mbGFnICYgWEJPV19QT1JUX0hVQikKLSNkZWZpbmUgWEJPV19QT1JUX1RZUEVfSU8oX3hib3dwLCBfbGluaykgCVwKLSAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X2ZsYWcgJiBYQk9XX1BPUlRfSU8pCi0KLSNkZWZpbmUgWEJPV19QT1JUX0lTX0VOQUJMRUQoX3hib3dwLCBfbGluaykgCVwKLSAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X2ZsYWcgJiBYQk9XX1BPUlRfRU5BQkxFKQotI2RlZmluZSBYQk9XX1BPUlRfTkFTSUQoX3hib3dwLCBfbGluaykgCVwKLSAgICAgICAgICAgICAgICgoX3hib3dwKS0+eGJvd19wb3J0X2luZm9bKF9saW5rKSAtIEJBU0VfWEJPV19QT1JUXS5wb3J0X25hc2lkKQotCi0jZGVmaW5lIFhCT1dfUE9SVF9JTyAgICAgMHgxCi0jZGVmaW5lIFhCT1dfUE9SVF9IVUIgICAgMHgyCi0jZGVmaW5lIFhCT1dfUE9SVF9FTkFCTEUgMHg0Ci0KLSNkZWZpbmUJU04wX1BPUlRfRkVOQ0VfU0hGVAkwCi0jZGVmaW5lCVNOMF9QT1JUX0ZFTkNFX01BU0sJKDEgPDwgU04wX1BPUlRfRkVOQ0VfU0hGVCkKLQotLyoKLSAqIFRoZSBLTENPTkZJRyBhcmVhIGlzIG9yZ2FuaXplZCBhcyBhIExJTktFRCBMSVNUIG9mIEJPQVJEcy4gQSBCT0FSRAotICogY2FuIGJlIGVpdGhlciAnTE9DQUwnIG9yICdSRU1PVEUnLiBMT0NBTCBtZWFucyBpdCBpcyBhdHRhY2hlZCB0bwotICogdGhlIExPQ0FML2N1cnJlbnQgTk9ERS4gUkVNT1RFIG1lYW5zIGl0IGlzIGF0dGFjaGVkIHRvIGEgZGlmZmVyZW50Ci0gKiBub2RlLihUQkQgLSBOZWVkIGEgd2F5IHRvIHRyZWF0IFJPVVRFUiBib2FyZHMuKQotICoKLSAqIFRoZXJlIGFyZSAyIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCB0aGVzZSBib2FyZHMgLQotICogbGJvYXJkIC0gTG9jYWwgYm9hcmQsIHJib2FyZCAtIHJlbW90ZSBib2FyZC4gVGhlc2UgMiBzdHJ1Y3R1cmVzCi0gKiBjYW4gYmUgYXJiaXRyYXJpbHkgbWl4ZWQgaW4gdGhlIExJTktFRCBMSVNUIG9mIEJPQVJEcy4gKFJlZmVyCi0gKiBGaWd1cmUgYmVsb3cpLiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmJvYXJkIG9yIGxib2FyZCBzdHJ1Y3R1cmUKLSAqIGlzIHVzZWQgdG8gZmluZCBvdXQgaXRzIHR5cGUgLSBubyB1bmlvbnMgYXJlIHVzZWQuCi0gKiBJZiBpdCBpcyBhIGxib2FyZCwgdGhlbiB0aGUgY29uZmlnIGluZm8gb2YgdGhpcyBib2FyZCB3aWxsIGJlIGZvdW5kCi0gKiBvbiB0aGUgbG9jYWwgbm9kZS4gKExPQ0FMIE5PREUgQkFTRSArIG9mZnNldCB2YWx1ZSBnaXZlcyBwb2ludGVyIHRvCi0gKiB0aGUgc3RydWN0dXJlLgotICogSWYgaXQgaXMgYSByYm9hcmQsIHRoZSBsb2NhbCBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG5vZGUgbnVtYmVyCi0gKiBhbmQgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBMSU5LRUQgTElTVCBvbiB0aGUgcmVtb3RlIG5vZGUuCi0gKiBUaGUgZGV0YWlscyBvZiB0aGUgaGFyZHdhcmUgb24gYSByZW1vdGUgbm9kZSBjYW4gYmUgYnVpbHQgbG9jYWxseSwKLSAqIGlmIHJlcXVpcmVkLCBieSByZWFkaW5nIHRoZSBMSU5LRUQgTElTVCBvbiB0aGUgcmVtb3RlIG5vZGUgYW5kCi0gKiBpZ25vcmluZyBhbGwgdGhlIHJib2FyZHMgb24gdGhhdCBub2RlLgotICoKLSAqIFRoZSBsb2NhbCBub2RlIHVzZXMgdGhlIFJFTU9URSBOT0RFIE5VTUJFUiArIE9GRlNFVCB0byBwb2ludCB0byB0aGUKLSAqIEZpcnN0IGJvYXJkIGluZm8gb24gdGhlIHJlbW90ZSBub2RlLiBUaGUgcmVtb3RlIG5vZGUgbGlzdCBpcwotICogdHJhdmVyc2VkIGFzIHRoZSBsb2NhbCBsaXN0LCB1c2luZyB0aGUgUkVNT1RFIEJBU0UgQUREUkVTUyBhbmQgbm90Ci0gKiB0aGUgbG9jYWwgYmFzZSBhZGRyZXNzIGFuZCBpZ25vcmluZyBhbGwgcmJvYXJkIHZhbHVlcy4KLSAqCi0gKgotIEtMQ09ORklHCi0KLSArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tKwotIHwgIGxib2FyZCAgICB8ICArLS0+fCAgIGxib2FyZCAgIHwgICstLT58ICAgcmJvYXJkICAgfCAgKy0tPnwgICBsYm9hcmQgICB8Ci0gKy0tLS0tLS0tLS0tLSsgIHwgICArLS0tLS0tLS0tLS0tKyAgfCAgICstLS0tLS0tLS0tLS0rICB8ICAgKy0tLS0tLS0tLS0tLSsKLSB8IGJvYXJkIGluZm8gfCAgfCAgIHwgYm9hcmQgaW5mbyB8ICB8ICAgfGVycmluZm8sYnB0cnwgIHwgICB8IGJvYXJkIGluZm8gfAotICstLS0tLS0tLS0tLS0rICB8ICAgKy0tLS0tLS0tLS0tLSsgIHwgICArLS0tLS0tLS0tLS0tKyAgfCAgICstLS0tLS0tLS0tLS0rCi0gfCBvZmZzZXQgICAgIHwtLSsgICB8ICBvZmZzZXQgICAgfC0tKyAgIHwgIG9mZnNldCAgICB8LS0rICAgfG9mZnNldD1OVUxMIHwKLSArLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICArLS0tLS0tLS0tLS0tKwotCi0KLSArLS0tLS0tLS0tLS0tKwotIHwgYm9hcmQgaW5mbyB8Ci0gKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotIHwgY29tcHQgMSAgICB8LS0tLS0tPnwgdHlwZSwgcmV2LCBkaWFnaW5mbywgc2l6ZSAuLi4gIHwgIChDUFUpCi0gKy0tLS0tLS0tLS0tLSsgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotIHwgY29tcHQgMiAgICB8LS0rCi0gKy0tLS0tLS0tLS0tLSsgIHwgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotIHwgIC4uLiAgICAgICB8ICArLS0tPnwgdHlwZSwgcmV2LCBkaWFnaW5mbywgc2l6ZSAuLi4gIHwgIChNRU1fQkFOSykKLSArLS0tLS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gfCBlcnJpbmZvICAgIHwtLSsKLSArLS0tLS0tLS0tLS0tKyAgfCAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICstLS0+fHIvbCBicmQgZXJyaW5mbyxjb21wdCBlcnIgZmxhZ3MgfAotICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQotICoKLSAqIEVhY2ggQk9BUkQgY29uc2lzdHMgb2YgQ09NUE9ORU5UcyBhbmQgdGhlIEJPQVJEIHN0cnVjdHVyZSBoYXMKLSAqIHBvaW50ZXJzIChvZmZzZXRzKSB0byBpdHMgQ09NUE9ORU5UIHN0cnVjdHVyZS4KLSAqIFRoZSBDT01QT05FTlQgc3RydWN0dXJlIGhhcyB2ZXJzaW9uIGluZm8sIHNpemUgYW5kIHNwZWVkIGluZm8sIHJldmlzaW9uLAotICogZXJyb3IgaW5mbyBhbmQgdGhlIE5JQyBpbmZvLiBUaGlzIHN0cnVjdHVyZSBjYW4gYWNjb21tb2RhdGUgYW55Ci0gKiBCT0FSRCB3aXRoIGFyYml0cmFyeSBDT01QT05FTlQgY29tcG9zaXRpb24uCi0gKgotICogVGhlIEVSUk9SSU5GTyBwYXJ0IG9mIGVhY2ggQk9BUkQgaGFzIGVycm9yIGluZm9ybWF0aW9uCi0gKiB0aGF0IGRlc2NyaWJlcyBlcnJvcnMgYWJvdXQgdGhlIEJPQVJEIGl0c2VsZi4gSXQgYWxzbyBoYXMgZmxhZ3MgdG8KLSAqIGluZGljYXRlIHRoZSBDT01QT05FTlQocykgb24gdGhlIGJvYXJkIHRoYXQgaGF2ZSBlcnJvcnMuIFRoZSBlcnJvcgotICogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIENPTVBPTkVOVCBpcyBwcmVzZW50IGluIHRoZSByZXNwZWN0aXZlCi0gKiBDT01QT05FTlQgc3RydWN0dXJlLgotICoKLSAqIFRoZSBFUlJPUklORk8gc3RydWN0dXJlIGlzIGFsc28gdHJlYXRlZCBsaWtlIGEgQ09NUE9ORU5ULCBpZS4gdGhlCi0gKiBCT0FSRCBoYXMgcG9pbnRlcnMob2Zmc2V0KSB0byB0aGUgRVJST1JJTkZPIHN0cnVjdHVyZS4gVGhlIHJib2FyZAotICogc3RydWN0dXJlIGFsc28gaGFzIGEgcG9pbnRlciB0byB0aGUgRVJST1JJTkZPIHN0cnVjdHVyZS4gVGhpcyBpcwotICogdGhlIHBsYWNlIHRvIHN0b3JlIEVSUk9SSU5GTyBhYm91dCBhIFJFTU9URSBOT0RFLCBpZiB0aGUgSFVCIG9uCi0gKiB0aGF0IE5PREUgaXMgbm90IHdvcmtpbmcgb3IgaWYgdGhlIFJFTU9URSBNRU1PUlkgaXMgQkFELiBJbiBjYXNlcyB3aGVyZQotICogb25seSB0aGUgQ1BVIG9mIHRoZSBSRU1PVEUgTk9ERSBpcyBkaXNhYmxlZCwgdGhlIEVSUk9SSU5GTyBwb2ludGVyIGNhbgotICogYmUgYSBOT0RFIE5VTUJFUiwgUkVNT1RFIE9GRlNFVCBjb21iaW5hdGlvbiwgcG9pbnRpbmcgdG8gZXJyb3IgaW5mbwotICogd2hpY2ggaXMgcHJlc2VudCBvbiB0aGUgUkVNT1RFIE5PREUuKFRCRCkKLSAqIFJFTU9URSBFUlJJTkZPIGNhbiBiZSBzdG9yZWQgb24gYW55IG9mIHRoZSBuZWFyZXN0IG5vZGVzCi0gKiBvciBvbiBhbGwgdGhlIG5lYXJlc3Qgbm9kZXMuKFRCRCkKLSAqIExpa2UgQk9BUkQgc3RydWN0dXJlcywgUkVNT1RFIEVSUklORk8gc3RydWN0dXJlcyBjYW4gYmUgYnVpbHQgbG9jYWxseQotICogdXNpbmcgdGhlIHJib2FyZCBlcnJpbmZvIHBvaW50ZXIuCi0gKgotICogSW4gb3JkZXIgdG8gZ2V0IHVzZWZ1bCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgRGF0YSBvcmdhbml6YXRpb24sIGEgc2V0IG9mCi0gKiBpbnRlcmZhY2Ugcm91dGluZXMgYXJlIHByb3ZpZGVkIChUQkQpLiBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIHJlbWVtYmVyIHdoaWxlCi0gKiBtYW5pcHVsYXRpbmcgdGhlIHN0cnVjdHVyZXMsIGlzIHRoYXQsIHRoZSBOT0RFIG51bWJlciBpbmZvcm1hdGlvbiBzaG91bGQKLSAqIGJlIHVzZWQuIElmIHRoZSBOT0RFIGlzIG5vbi16ZXJvIChyZW1vdGUpIHRoZW4gZWFjaCBvZmZzZXQgc2hvdWxkCi0gKiBiZSBhZGRlZCB0byB0aGUgUkVNT1RFIEJBU0UgQUREUiBlbHNlIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgTE9DQUwgQkFTRSBBRERSLgotICogVGhpcyBpbmNsdWRlcyBvZmZzZXRzIGZvciBCT0FSRFMsIENPTVBPTkVOVFMgYW5kIEVSUk9SSU5GTy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlc2Ugc3RydWN0dXJlcyBkbyBub3QgcHJvdmlkZSBtdWNoIGluZm8gYWJvdXQgY29ubmVjdGl2aXR5LgotICogVGhhdCBpbmZvIHdpbGwgYmUgcGFydCBvZiBIV0dSQVBILCB3aGljaCBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGNmZ190Ci0gKiBkYXRhIHN0cnVjdHVyZS4gKHJlZiBJUDI3cHJvbS9jZmcuaCkgSXQgaGFzIHRvIGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUKLSAqIHRoZSBJTyBwYXJ0IG9mIHRoZSBOZXR3b3JrKFRCRCkuCi0gKgotICogVGhlIGRhdGEgc3RydWN0dXJlcyBiZWxvdyBkZWZpbmUgdGhlIGFib3ZlIGNvbmNlcHRzLgotICovCi0KLS8qCi0gKiBWYWx1ZXMgZm9yIENQVSB0eXBlcwotICovCi0jZGVmaW5lIEtMX0NQVV9SNDAwMAkJMHgxCS8qIFN0YW5kYXJkIFI0MDAwICovCi0jZGVmaW5lIEtMX0NQVV9URlAJCTB4MgkvKiBURlAgcHJvY2Vzc29yICovCi0jZGVmaW5lCUtMX0NQVV9SMTAwMDAJCTB4MwkvKiBSMTAwMDAgKFQ1KSAqLwotI2RlZmluZSBLTF9DUFVfTk9ORQkJKC0xKQkvKiBubyBjcHUgcHJlc2VudCBpbiBzbG90ICovCi0KLS8qCi0gKiBJUDI3IEJPQVJEIGNsYXNzZXMKLSAqLwotCi0jZGVmaW5lIEtMQ0xBU1NfTUFTSwkweGYwCi0jZGVmaW5lIEtMQ0xBU1NfTk9ORQkweDAwCi0jZGVmaW5lIEtMQ0xBU1NfTk9ERQkweDEwICAgICAgICAgICAgIC8qIENQVSwgTWVtb3J5IGFuZCBIVUIgYm9hcmQgKi8KLSNkZWZpbmUgS0xDTEFTU19DUFUJS0xDTEFTU19OT0RFCi0jZGVmaW5lIEtMQ0xBU1NfSU8JMHgyMCAgICAgICAgICAgICAvKiBCYXNlSU8sIDQgY2ggU0NTSSwgZXRoZXJuZXQsIEZEREkKLQkJCQkJICAgIGFuZCB0aGUgbm9uLWdyYXBoaWNzIHdpZGdldCBib2FyZHMgKi8KLSNkZWZpbmUgS0xDTEFTU19ST1VURVIJMHgzMCAgICAgICAgICAgICAvKiBSb3V0ZXIgYm9hcmQgKi8KLSNkZWZpbmUgS0xDTEFTU19NSURQTEFORSAweDQwICAgICAgICAgICAgLyogV2UgbmVlZCB0byB0cmVhdCB0aGlzIGFzIGEgYm9hcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB3ZSBjYW4gcmVjb3JkIGVycm9yIGluZm8gKi8KLSNkZWZpbmUgS0xDTEFTU19HRlgJMHg1MAkJLyogZ3JhcGhpY3MgYm9hcmRzICovCi0KLSNkZWZpbmUgS0xDTEFTU19QU0VVRE9fR0ZYCTB4NjAJLyogSERUViB0eXBlIGNhcmRzIHRoYXQgdXNlIGEgZ2Z4Ci0JCQkJCSAqIGh3IGlmYyB0byB4dGFsayBhbmQgYXJlIG5vdCBnZngKLQkJCQkJICogY2xhc3MgZm9yIHN3IHB1cnBvc2VzICovCi0KLSNkZWZpbmUgS0xDTEFTU19NQVgJNwkJLyogQnVtcCB0aGlzIGlmIGEgbmV3IENMQVNTIGlzIGFkZGVkICovCi0jZGVmaW5lIEtMVFlQRV9NQVgJMTAJCS8qIEJ1bXAgdGhpcyBpZiBhIG5ldyBDTEFTUyBpcyBhZGRlZCAqLwotCi0jZGVmaW5lIEtMQ0xBU1NfVU5LTk9XTgkweGYwCi0KLSNkZWZpbmUgS0xDTEFTUyhfeCkgKChfeCkgJiBLTENMQVNTX01BU0spCi0KLS8qCi0gKiBJUDI3IGJvYXJkIHR5cGVzCi0gKi8KLQotI2RlZmluZSBLTFRZUEVfTUFTSwkweDBmCi0jZGVmaW5lIEtMVFlQRV9OT05FCTB4MDAKLSNkZWZpbmUgS0xUWVBFX0VNUFRZCTB4MDAKLQotI2RlZmluZSBLTFRZUEVfV0VJUkRDUFUgKEtMQ0xBU1NfQ1BVIHwgMHgwKQotI2RlZmluZSBLTFRZUEVfSVAyNwkoS0xDTEFTU19DUFUgfCAweDEpIC8qIDIgQ1BVcyhSMTBLKSBwZXIgYm9hcmQgKi8KLQotI2RlZmluZSBLTFRZUEVfV0VJUkRJTwkoS0xDTEFTU19JTyAgfCAweDApCi0jZGVmaW5lIEtMVFlQRV9CQVNFSU8JKEtMQ0xBU1NfSU8gIHwgMHgxKSAvKiBJT0MzLCBTdXBlcklPLCBCcmlkZ2UsIFNDU0kgKi8KLSNkZWZpbmUgS0xUWVBFX0lPNglLTFRZUEVfQkFTRUlPICAgICAgIC8qIEFkZGl0aW9uYWwgbmFtZSAqLwotI2RlZmluZSBLTFRZUEVfNENIU0NTSQkoS0xDTEFTU19JTyAgfCAweDIpCi0jZGVmaW5lIEtMVFlQRV9NU0NTSQlLTFRZUEVfNENIU0NTSSAgICAgIC8qIEFkZGl0aW9uYWwgbmFtZSAqLwotI2RlZmluZSBLTFRZUEVfRVRIRVJORVQJKEtMQ0xBU1NfSU8gIHwgMHgzKQotI2RlZmluZSBLTFRZUEVfTUVORVQJS0xUWVBFX0VUSEVSTkVUICAgICAvKiBBZGRpdGlvbmFsIG5hbWUgKi8KLSNkZWZpbmUgS0xUWVBFX0ZEREkgIAkoS0xDTEFTU19JTyAgfCAweDQpCi0jZGVmaW5lIEtMVFlQRV9VTlVTRUQJKEtMQ0xBU1NfSU8gIHwgMHg1KSAvKiBYWFggVU5VU0VEICovCi0jZGVmaW5lIEtMVFlQRV9IQVJPTEQgICAoS0xDTEFTU19JTyAgfCAweDYpIC8qIFBDSSBTSE9FIEJPWCAqLwotI2RlZmluZSBLTFRZUEVfUENJCUtMVFlQRV9IQVJPTEQKLSNkZWZpbmUgS0xUWVBFX1ZNRSAgICAgIChLTENMQVNTX0lPICB8IDB4NykgLyogQW55IDNyZCBwYXJ0eSBWTUUgY2FyZCAqLwotI2RlZmluZSBLTFRZUEVfTUlPICAgCShLTENMQVNTX0lPICB8IDB4OCkKLSNkZWZpbmUgS0xUWVBFX0ZDICAgIAkoS0xDTEFTU19JTyAgfCAweDkpCi0jZGVmaW5lIEtMVFlQRV9MSU5DICAgIAkoS0xDTEFTU19JTyAgfCAweEEpCi0jZGVmaW5lIEtMVFlQRV9UUFUgICAgCShLTENMQVNTX0lPICB8IDB4QikgLyogVGVuc29yIFByb2Nlc3NpbmcgVW5pdCAqLwotI2RlZmluZSBLTFRZUEVfR1NOX0EgICAJKEtMQ0xBU1NfSU8gIHwgMHhDKSAvKiBNYWluIEdTTiBib2FyZCAqLwotI2RlZmluZSBLTFRZUEVfR1NOX0IgICAJKEtMQ0xBU1NfSU8gIHwgMHhEKSAvKiBBdXhpbGlhcnkgR1NOIGJvYXJkICovCi0KLSNkZWZpbmUgS0xUWVBFX0dGWAkoS0xDTEFTU19HRlggfCAweDApIC8qIHVua25vd24gZ3JhcGhpY3MgdHlwZSAqLwotI2RlZmluZSBLTFRZUEVfR0ZYX0tPTkEgKEtMQ0xBU1NfR0ZYIHwgMHgxKSAvKiBLT05BIGdyYXBoaWNzIG9uIElQMjcgKi8KLSNkZWZpbmUgS0xUWVBFX0dGWF9NR1JBIChLTENMQVNTX0dGWCB8IDB4MykgLyogTUdSQVMgZ3JhcGhpY3Mgb24gSVAyNyAqLwotCi0jZGVmaW5lIEtMVFlQRV9XRUlSRFJPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDApCi0jZGVmaW5lIEtMVFlQRV9ST1VURVIgICAgIChLTENMQVNTX1JPVVRFUiB8IDB4MSkKLSNkZWZpbmUgS0xUWVBFX1JPVVRFUjIgICAgS0xUWVBFX1JPVVRFUgkJLyogT2Jzb2xldGUhICovCi0jZGVmaW5lIEtMVFlQRV9OVUxMX1JPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDIpCi0jZGVmaW5lIEtMVFlQRV9NRVRBX1JPVVRFUiAoS0xDTEFTU19ST1VURVIgfCAweDMpCi0KLSNkZWZpbmUgS0xUWVBFX1dFSVJETUlEUExBTkUgKEtMQ0xBU1NfTUlEUExBTkUgfCAweDApCi0jZGVmaW5lIEtMVFlQRV9NSURQTEFORTggIChLTENMQVNTX01JRFBMQU5FIHwgMHgxKSAvKiA4IHNsb3QgYmFja3BsYW5lICovCi0jZGVmaW5lIEtMVFlQRV9NSURQTEFORSAgICBLTFRZUEVfTUlEUExBTkU4Ci0jZGVmaW5lIEtMVFlQRV9QQlJJQ0tfWEJPVwkoS0xDTEFTU19NSURQTEFORSB8IDB4MikKLQotI2RlZmluZSBLTFRZUEVfSU9CUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MCkKLSNkZWZpbmUgS0xUWVBFX0lCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MSkKLSNkZWZpbmUgS0xUWVBFX1BCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MikKLSNkZWZpbmUgS0xUWVBFX1hCUklDSwkJKEtMQ0xBU1NfSU9CUklDSyB8IDB4MykKLQotI2RlZmluZSBLTFRZUEVfUEJSSUNLX0JSSURHRQlLTFRZUEVfUEJSSUNLCi0KLS8qIFRoZSB2YWx1ZSBvZiB0eXBlIHNob3VsZCBiZSBtb3JlIHRoYW4gOCBzbyB0aGF0IGhpbnYgcHJpbnRzCi0gKiBvdXQgdGhlIGJvYXJkIG5hbWUgZnJvbSB0aGUgTklDIHN0cmluZy4gRm9yIHZhbHVlcyBsZXNzIHRoYW4KLSAqIDggdGhlIG5hbWUgb2YgdGhlIGJvYXJkIG5lZWRzIHRvIGJlIGhhcmQgY29kZWQgaW4gYSBmZXcgcGxhY2VzLgotICogV2hlbiBicmluZ3VwIHN0YXJ0ZWQgbmljIG5hbWVzIGhhZCBub3Qgc3RhbmRhcmRpemVkIGFuZCBzbyB3ZQotICogaGFkIHRvIGhhcmQgY29kZS4gKEZvciBwZW9wbGUgaW50ZXJlc3RlZCBpbiBoaXN0b3J5LikKLSAqLwotI2RlZmluZSBLTFRZUEVfWFRIRCAgIAkoS0xDTEFTU19QU0VVRE9fR0ZYIHwgMHg5KQotCi0jZGVmaW5lIEtMVFlQRV9VTktOT1dOCShLTENMQVNTX1VOS05PV04gfCAweGYpCi0KLSNkZWZpbmUgS0xUWVBFKF94KSAJKChfeCkgJiBLTFRZUEVfTUFTSykKLSNkZWZpbmUgSVNfTUlPX1BSRVNFTlQobCkJKChsLT5icmRfdHlwZSA9PSBLTFRZUEVfQkFTRUlPKSAmJiBcCi0JCQkJIChsLT5icmRfZmxhZ3MgJiBTRUNPTkRfTklDX1BSRVNFTlQpKQotI2RlZmluZSBJU19NSU9fSU9DMyhsLCBuKQkoSVNfTUlPX1BSRVNFTlQobCkgJiYgKG4gPiAyKSkKLQotLyoKLSAqIGJvYXJkIHN0cnVjdHVyZXMKLSAqLwotCi0jZGVmaW5lIE1BWF9DT01QVFNfUEVSX0JSRCAyNAotCi0jZGVmaW5lIExPQ0FMX0JPQVJEIDEKLSNkZWZpbmUgUkVNT1RFX0JPQVJEIDIKLQotI2RlZmluZSBMQk9BUkRfU1RSVUNUX1ZFUlNJT04gCTIKLQotdHlwZWRlZiBzdHJ1Y3QgbGJvYXJkX3MgewotCWtsY29uZl9vZmZfdCAJYnJkX25leHQ7ICAgICAgICAgLyogTmV4dCBCT0FSRCAqLwotCXVuc2lnbmVkIGNoYXIgCXN0cnVjdF90eXBlOyAgICAgIC8qIHR5cGUgb2Ygc3RydWN0dXJlLCBsb2NhbCBvciByZW1vdGUgKi8KLQl1bnNpZ25lZCBjaGFyIAlicmRfdHlwZTsgICAgICAgICAvKiB0eXBlK2NsYXNzICovCi0JdW5zaWduZWQgY2hhciAJYnJkX3N2ZXJzaW9uOyAgICAgLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfYnJldmlzaW9uOyAgICAvKiBib2FyZCByZXZpc2lvbiAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfcHJvbXZlcjsgICAgICAvKiBib2FyZCBwcm9tIHZlcnNpb24sIGlmIGFueSAqLwotIAl1bnNpZ25lZCBjaGFyIAlicmRfZmxhZ3M7ICAgICAgICAvKiBFbmFibGVkLCBEaXNhYmxlZCBldGMgKi8KLQl1bnNpZ25lZCBjaGFyIAlicmRfc2xvdDsgICAgICAgICAvKiBzbG90IG51bWJlciAqLwotCXVuc2lnbmVkIHNob3J0CWJyZF9kZWJ1Z3N3OyAgICAgIC8qIERlYnVnIHN3aXRjaGVzICovCi0JbW9kdWxlaWRfdAlicmRfbW9kdWxlOyAgICAgICAvKiBtb2R1bGUgdG8gd2hpY2ggaXQgYmVsb25ncyAqLwotCXBhcnRpZF90IAlicmRfcGFydGl0aW9uOyAgICAvKiBQYXJ0aXRpb24gbnVtYmVyICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IAlicmRfZGlhZ3ZhbDsgICAgICAvKiBkaWFnbm9zdGljIHZhbHVlICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IAlicmRfZGlhZ3Bhcm07ICAgICAvKiBkaWFnbm9zdGljIHBhcmFtZXRlciAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfaW52ZW50b3J5OyAgICAvKiBpbnZlbnRvcnkgaGlzdG9yeSAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIAlicmRfbnVtY29tcHRzOyAgICAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLwotICAgICAgICBuaWNfdCAgICAgICAgIAlicmRfbmljOyAgICAgICAgICAvKiBOdW1iZXIgaW4gQ0FOICovCi0JbmFzaWRfdAkJYnJkX25hc2lkOyAgICAgICAgLyogcGFzc2VkIHBhcmFtZXRlciAqLwotCWtsY29uZl9vZmZfdCAJYnJkX2NvbXB0c1tNQVhfQ09NUFRTX1BFUl9CUkRdOyAvKiBwb2ludGVycyB0byBDT01QT05FTlRTICovCi0Ja2xjb25mX29mZl90IAlicmRfZXJyaW5mbzsgICAgICAvKiBCb2FyZCdzIGVycm9yIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IGxib2FyZF9zICpicmRfcGFyZW50OwkgIC8qIExvZ2ljYWwgcGFyZW50IGZvciB0aGlzIGJyZCAqLwotCXZlcnRleF9oZGxfdAlicmRfZ3JhcGhfbGluazsgICAvKiB2ZXJ0ZXggaGRsIHRvIGNvbm5lY3QgZXh0ZXJuIGNvbXB0cyAqLwotCWNvbmZpZGVuY2VfdAlicmRfY29uZmlkZW5jZTsJICAvKiBjb25maWRlbmNlIHRoYXQgdGhlIGJvYXJkIGlzIGJhZCAqLwotCW5hc2lkX3QJCWJyZF9vd25lcjsgICAgICAgIC8qIHdobyBvd25zIHRoaXMgYm9hcmQgKi8KLQl1bnNpZ25lZCBjaGFyIAlicmRfbmljX2ZsYWdzOyAgICAvKiBUbyBoYW5kbGUgOCBtb3JlIE5JQ3MgKi8KLQljaGFyCQlicmRfbmFtZVszMl07Ci19IGxib2FyZF90OwotCi0KLS8qCi0gKglNYWtlIHN1cmUgd2UgcGFzcyBiYWNrIHRoZSBjYWxpYXMgc3BhY2UgYWRkcmVzcyBmb3IgbG9jYWwgYm9hcmRzLgotICoJa2xjb25maWcgYm9hcmQgdHJhdmVyc2FsIGFuZCBlcnJvciBzdHJ1Y3R1cmUgZXh0cmFjdGlvbiBkZWZpbmVzLgotICovCi0KLSNkZWZpbmUgQk9BUkRfU0xPVChfYnJkKQkoKF9icmQpLT5icmRfc2xvdCkKLQotI2RlZmluZSBLTENGX0NMQVNTKF9icmQpCUtMQ0xBU1MoKF9icmQpLT5icmRfdHlwZSkKLSNkZWZpbmUgS0xDRl9UWVBFKF9icmQpCQlLTFRZUEUoKF9icmQpLT5icmRfdHlwZSkKLSNkZWZpbmUgS0xDRl9SRU1PVEUoX2JyZCkgIAkoKChfYnJkKS0+c3RydWN0X3R5cGUgJiBMT0NBTF9CT0FSRCkgPyAwIDogMSkKLSNkZWZpbmUgS0xDRl9OVU1fQ09NUFMoX2JyZCkJKChfYnJkKS0+YnJkX251bWNvbXB0cykKLSNkZWZpbmUgS0xDRl9NT0RVTEVfSUQoX2JyZCkJKChfYnJkKS0+YnJkX21vZHVsZSkKLQotI2RlZmluZSBLTENGX05FWFQoX2JyZCkgCVwKLSAgICAgICAgKChfYnJkKS0+YnJkX25leHQgPyAJXAotCSAobGJvYXJkX3QgKikoTk9ERV9PRkZTRVRfVE9fSzEoTkFTSURfR0VUKF9icmQpLCAoX2JyZCktPmJyZF9uZXh0KSk6XAotCSBOVUxMKQotI2RlZmluZSBLTENGX0NPTVAoX2JyZCwgX25keCkgICBcCi0gICAgICAgICAgICAgICAgKGtsaW5mb190ICopKE5PREVfT0ZGU0VUX1RPX0sxKE5BU0lEX0dFVChfYnJkKSwJXAotCQkJCQkgICAgICAgKF9icmQpLT5icmRfY29tcHRzWyhfbmR4KV0pKQotCi0jZGVmaW5lIEtMQ0ZfQ09NUF9FUlJPUihfYnJkLCBfY29tcCkJXAotICAgICAgICAgICAgICAgKE5PREVfT0ZGU0VUX1RPX0sxKE5BU0lEX0dFVChfYnJkKSwgKF9jb21wKS0+ZXJyaW5mbykpCi0KLSNkZWZpbmUgS0xDRl9DT01QX1RZUEUoX2NvbXApCSgoX2NvbXApLT5zdHJ1Y3RfdHlwZSkKLSNkZWZpbmUgS0xDRl9CUklER0VfV19JRChfY29tcCkJKChfY29tcCktPnBoeXNpZCkJLyogV2lkZ2V0IElEICovCi0KLQotCi0vKgotICogR2VuZXJpYyBpbmZvIHN0cnVjdHVyZS4gVGhpcyBzdG9yZXMgY29tbW9uIGluZm8gYWJvdXQgYQotICogY29tcG9uZW50LgotICovCi0KLXR5cGVkZWYgc3RydWN0IGtsaW5mb19zIHsgICAgICAgICAgICAgICAgICAvKiBHZW5lcmljIGluZm8gKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHN0cnVjdF90eXBlOyAgICAgICAvKiB0eXBlIG9mIHRoaXMgc3RydWN0dXJlICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBzdHJ1Y3RfdmVyc2lvbjsgICAgLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgZmxhZ3M7ICAgICAgICAgICAgLyogRW5hYmxlZCwgZGlzYWJsZWQgZXRjICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgICByZXZpc2lvbjsgICAgICAgICAvKiBjb21wb25lbnQgcmV2aXNpb24gKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIGRpYWd2YWw7ICAgICAgICAgIC8qIHJlc3VsdCBvZiBkaWFnbm9zdGljcyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgZGlhZ3Bhcm07ICAgICAgICAgLyogZGlhZ25vc3RpYyBwYXJhbWV0ZXIgKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGludmVudG9yeTsgICAgICAgIC8qIHByZXZpb3VzIGludmVudG9yeSBzdGF0dXMgKi8KLQluaWNfdCAJCW5pYzsgICAgICAgICAgICAgIC8qIE1Vc3QgYmUgYWxpZ25lZCBwcm9wZXJseSAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgcGh5c2lkOyAgICAgICAgICAgLyogcGh5c2ljYWwgaWQgb2YgY29tcG9uZW50ICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICB2aXJ0aWQ7ICAgICAgICAgICAvKiB2aXJ0dWFsIGlkIGFzIHNlZW4gYnkgc3lzdGVtICovCi0JdW5zaWduZWQgY2hhcgl3aWRpZDsJICAgICAgICAgIC8qIFdpZGdldCBpZCAtIGlmIGFwcGxpY2FibGUgKi8KLQluYXNpZF90CQluYXNpZDsgICAgICAgICAgICAvKiBub2RlIG51bWJlciAtIGZyb20gcGFyZW50ICovCi0JY2hhcgkJcGFkMTsJCSAgLyogcGFkIG91dCBzdHJ1Y3R1cmUuICovCi0JY2hhcgkJcGFkMjsJCSAgLyogcGFkIG91dCBzdHJ1Y3R1cmUuICovCi0JQ09NUE9ORU5UCSphcmNzX2NvbXB0OyAgICAgIC8qIHB0ciB0byB0aGUgYXJjcyBzdHJ1Y3QgZm9yIGVhc2UqLwotICAgICAgICBrbGNvbmZfb2ZmX3QJZXJyaW5mbzsgICAgICAgICAgLyogY29tcG9uZW50IHNwZWNpZmljIGVycm9ycyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgcGFkMzsgICAgICAgICAgICAgLyogcGNpIGZpZWxkcyBoYXZlIG1vdmVkIG92ZXIgdG8gKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHBhZDQ7ICAgICAgICAgICAgIC8qIGtsYnJpX3QgKi8KLX0ga2xpbmZvX3QgOwotCi0jZGVmaW5lIEtMQ09ORklHX0lORk9fRU5BQkxFRChfaSkJKChfaSktPmZsYWdzICYgS0xJTkZPX0VOQUJMRSkKLS8qCi0gKiBDb21wb25lbnQgc3RydWN0dXJlcy4KLSAqIEZvbGxvd2luZyBhcmUgdGhlIGN1cnJlbnRseSBpZGVudGlmaWVkIGNvbXBvbmVudHM6Ci0gKiAJQ1BVLCBIVUIsIE1FTV9CQU5LLAotICogCVhCT1coY29uc2lzdHMgb2YgMTYgV0lER0VUcywgZWFjaCBvZiB3aGljaCBjYW4gYmUgSFVCIG9yIEdSQVBISUNTIG9yIEJSSURHRSkKLSAqIAlCUklER0UsIElPQzMsIFN1cGVySU8sIFNDU0ksIEZEREkKLSAqIAlST1VURVIKLSAqIAlHUkFQSElDUwotICovCi0jZGVmaW5lIEtMU1RSVUNUX1VOS05PV04JMAotI2RlZmluZSBLTFNUUlVDVF9DUFUgIAkJMQotI2RlZmluZSBLTFNUUlVDVF9IVUIgIAkJMgotI2RlZmluZSBLTFNUUlVDVF9NRU1CTksgCTMKLSNkZWZpbmUgS0xTVFJVQ1RfWEJPVyAJCTQKLSNkZWZpbmUgS0xTVFJVQ1RfQlJJIAkJNQotI2RlZmluZSBLTFNUUlVDVF9JT0MzIAkJNgotI2RlZmluZSBLTFNUUlVDVF9QQ0kgCQk3Ci0jZGVmaW5lIEtMU1RSVUNUX1ZNRSAJCTgKLSNkZWZpbmUgS0xTVFJVQ1RfUk9VCQk5Ci0jZGVmaW5lIEtMU1RSVUNUX0dGWCAJCTEwCi0jZGVmaW5lIEtMU1RSVUNUX1NDU0kgCQkxMQotI2RlZmluZSBLTFNUUlVDVF9GRERJIAkJMTIKLSNkZWZpbmUgS0xTVFJVQ1RfTUlPIAkJMTMKLSNkZWZpbmUgS0xTVFJVQ1RfRElTSyAJCTE0Ci0jZGVmaW5lIEtMU1RSVUNUX1RBUEUgCQkxNQotI2RlZmluZSBLTFNUUlVDVF9DRFJPTSAJCTE2Ci0jZGVmaW5lIEtMU1RSVUNUX0hVQl9VQVJUIAkxNwotI2RlZmluZSBLTFNUUlVDVF9JT0MzRU5FVCAJMTgKLSNkZWZpbmUgS0xTVFJVQ1RfSU9DM1VBUlQgCTE5Ci0jZGVmaW5lIEtMU1RSVUNUX1VOVVNFRAkJMjAgLyogWFhYIFVOVVNFRCAqLwotI2RlZmluZSBLTFNUUlVDVF9JT0MzUENLTSAgICAgICAyMQotI2RlZmluZSBLTFNUUlVDVF9SQUQgICAgICAgIAkyMgotI2RlZmluZSBLTFNUUlVDVF9IVUJfVFRZICAgICAgICAyMwotI2RlZmluZSBLTFNUUlVDVF9JT0MzX1RUWSAJMjQKLQotLyogRWFybHkgQWNjZXNzIElPIHByb21zIGFyZSBjb21wYXRpYmxlCi0gICBvbmx5IHdpdGggS0xTVFJVQ1QgdmFsdWVzIHVwdG8gMjQuICovCi0KLSNkZWZpbmUgS0xTVFJVQ1RfRklCRVJDSEFOTkVMIAkyNQotI2RlZmluZSBLTFNUUlVDVF9NT0RfU0VSSUFMX05VTSAyNgotI2RlZmluZSBLTFNUUlVDVF9JT0MzTVMgICAgICAgICAyNwotI2RlZmluZSBLTFNUUlVDVF9UUFUgICAgICAgICAgICAyOAotI2RlZmluZSBLTFNUUlVDVF9HU05fQSAgICAgICAgICAyOQotI2RlZmluZSBLTFNUUlVDVF9HU05fQiAgICAgICAgICAzMAotI2RlZmluZSBLTFNUUlVDVF9YVEhEICAgICAgICAgICAzMQotCi0vKgotICogVGhlc2UgYXJlIHRoZSBpbmRpY2VzIG9mIHZhcmlvdXMgY29tcG9uZW50cyB3aXRoaW4gYSBsYm9hcmQgc3RydWN0dXJlLgotICovCi0KLSNkZWZpbmUgSVAyN19DUFUwX0lOREVYIDAKLSNkZWZpbmUgSVAyN19DUFUxX0lOREVYIDEKLSNkZWZpbmUgSVAyN19IVUJfSU5ERVggMgotI2RlZmluZSBJUDI3X01FTV9JTkRFWCAzCi0KLSNkZWZpbmUgQkFTRUlPX0JSSURHRV9JTkRFWCAwCi0jZGVmaW5lIEJBU0VJT19JT0MzX0lOREVYIDEKLSNkZWZpbmUgQkFTRUlPX1NDU0kxX0lOREVYIDIKLSNkZWZpbmUgQkFTRUlPX1NDU0kyX0lOREVYIDMKLQotI2RlZmluZSBNSURQTEFORV9YQk9XX0lOREVYIDAKLSNkZWZpbmUgUk9VVEVSX0NPTVBPTkVOVF9JTkRFWCAwCi0KLSNkZWZpbmUgQ0g0U0NTSV9CUklER0VfSU5ERVggMAotCi0vKiBJbmZvIGhvbGRlcnMgZm9yIHZhcmlvdXMgaGFyZHdhcmUgY29tcG9uZW50cyAqLwotCi10eXBlZGVmIHU2NCAqcGNpX3Q7Ci10eXBlZGVmIHU2NCAqdm1lYl90OwotdHlwZWRlZiB1NjQgKnZtZWRfdDsKLXR5cGVkZWYgdTY0ICpmZGRpX3Q7Ci10eXBlZGVmIHU2NCAqc2NzaV90OwotdHlwZWRlZiB1NjQgKm1pb190OwotdHlwZWRlZiB1NjQgKmdyYXBoaWNzX3Q7Ci10eXBlZGVmIHU2NCAqcm91dGVyX3Q7Ci0KLS8qCi0gKiBUaGUgcG9ydCBpbmZvIGluIGlwMjdfY2ZnIGFyZWEgdHJhbnNsYXRlcyB0byBhIGxib2FydF90IGluIHRoZQotICogS0xDT05GSUcgYXJlYS4gQnV0IHNpbmNlIEtMQ09ORklHIGRvZXMgbm90IHVzZSBwb2ludGVycywgbGJvYXJ0X3QKLSAqIGlzIHN0b3JlZCBpbiB0ZXJtcyBvZiBhIG5hc2lkIGFuZCBhIG9mZnNldCBmcm9tIHN0YXJ0IG9mIEtMQ09ORklHCi0gKiBhcmVhICBvbiB0aGF0IG5hc2lkLgotICovCi10eXBlZGVmIHN0cnVjdCBrbHBvcnRfcyB7Ci0JbmFzaWRfdAkJcG9ydF9uYXNpZDsKLQl1bnNpZ25lZCBjaGFyCXBvcnRfZmxhZzsKLQlrbGNvbmZfb2ZmX3QJcG9ydF9vZmZzZXQ7Ci19IGtscG9ydF90OwotCi10eXBlZGVmIHN0cnVjdCBrbGNwdV9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENQVSAqLwotCWtsaW5mb190IAljcHVfaW5mbzsKLQl1bnNpZ25lZCBzaG9ydCAJY3B1X3ByaWQ7CS8qIFByb2Nlc3NvciBQUklEIHZhbHVlICovCi0JdW5zaWduZWQgc2hvcnQgCWNwdV9mcGlycjsJLyogRlBVIElSUiB2YWx1ZSAqLwotICAgIAl1bnNpZ25lZCBzaG9ydCAJY3B1X3NwZWVkOwkvKiBTcGVlZCBpbiBNSFogKi8KLSAgICAJdW5zaWduZWQgc2hvcnQgCWNwdV9zY2FjaGVzejsJLyogc2Vjb25kYXJ5IGNhY2hlIHNpemUgaW4gTUIgKi8KLSAgICAJdW5zaWduZWQgc2hvcnQgCWNwdV9zY2FjaGVzcGVlZDsvKiBzZWNvbmRhcnkgY2FjaGUgc3BlZWQgaW4gTUh6ICovCi19IGtsY3B1X3QgOwotCi0jZGVmaW5lIENQVV9TVFJVQ1RfVkVSU0lPTiAgIDIKLQotdHlwZWRlZiBzdHJ1Y3Qga2xodWJfcyB7CQkJLyogSFVCICovCi0Ja2xpbmZvX3QgCWh1Yl9pbmZvOwotCXVuc2lnbmVkIGludCAJCWh1Yl9mbGFnczsJCS8qIFBDRkdfSFVCX3h4eCBmbGFncyAqLwotCWtscG9ydF90CWh1Yl9wb3J0OwkJLyogaHViIGlzIGNvbm5lY3RlZCB0byB0aGlzICovCi0JbmljX3QJCWh1Yl9ib3hfbmljOwkJLyogbmljIG9mIGNvbnRhaW5pbmcgYm94ICovCi0Ja2xjb25mX29mZl90CWh1Yl9tZmdfbmljOwkJLyogTUZHIE5JQyBzdHJpbmcgKi8KLQl1NjQJCWh1Yl9zcGVlZDsJCS8qIFNwZWVkIG9mIGh1YiBpbiBIWiAqLwotfSBrbGh1Yl90IDsKLQotdHlwZWRlZiBzdHJ1Y3Qga2xodWJfdWFydF9zIHsJCQkvKiBIVUIgKi8KLQlrbGluZm9fdCAJaHVidWFydF9pbmZvOwotCXVuc2lnbmVkIGludCAJCWh1YnVhcnRfZmxhZ3M7CQkvKiBQQ0ZHX0hVQl94eHggZmxhZ3MgKi8KLQluaWNfdAkJaHVidWFydF9ib3hfbmljOwkvKiBuaWMgb2YgY29udGFpbmluZyBib3ggKi8KLX0ga2xodWJfdWFydF90IDsKLQotI2RlZmluZSBNRU1PUllfU1RSVUNUX1ZFUlNJT04gICAyCi0KLXR5cGVkZWYgc3RydWN0IGtsbWVtYm5rX3MgewkJCS8qIE1FTU9SWSBCQU5LICovCi0Ja2xpbmZvX3QgCW1lbWJua19pbmZvOwotICAgIAlzaG9ydCAJCW1lbWJua19tZW1zejsJCS8qIFRvdGFsIG1lbW9yeSBpbiBtZWdhYnl0ZXMgKi8KLQlzaG9ydAkJbWVtYm5rX2RpbW1fc2VsZWN0OyAvKiBiYW5rIHRvIHBoeXNpY2FsIGFkZHIgbWFwcGluZyovCi0Jc2hvcnQJCW1lbWJua19ibmtzeltNRF9NRU1fQkFOS1NdOyAvKiBNZW1vcnkgYmFuayBzaXplcyAqLwotCXNob3J0CQltZW1ibmtfYXR0cjsKLX0ga2xtZW1ibmtfdCA7Ci0KLSNkZWZpbmUgS0xDT05GSUdfTUVNQk5LX1NJWkUoX2luZm8sIF9iYW5rKQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfaW5mbyktPm1lbWJua19ibmtzelsoX2JhbmspXSkKLQotCi0jZGVmaW5lIE1FTUJOS19QUkVNSVVNIDEKLSNkZWZpbmUgS0xDT05GSUdfTUVNQk5LX1BSRU1JVU0oX2luZm8sIF9iYW5rKQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfaW5mbyktPm1lbWJua19hdHRyICYgKE1FTUJOS19QUkVNSVVNIDw8IChfYmFuaykpKQotCi0jZGVmaW5lIE1BWF9TRVJJQUxfTlVNX1NJWkUgMTAKLQotdHlwZWRlZiBzdHJ1Y3Qga2xtb2Rfc2VyaWFsX251bV9zIHsKLSAgICAgIGtsaW5mb190ICAgICAgICBzbnVtX2luZm87Ci0gICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgIGNoYXIgc251bV9zdHJbTUFYX1NFUklBTF9OVU1fU0laRV07Ci0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICBzbnVtX2ludDsKLSAgICAgIH0gc251bTsKLX0ga2xtb2Rfc2VyaWFsX251bV90OwotCi0vKiBNYWNyb3MgbmVlZGVkIHRvIGFjY2VzcyBzZXJpYWwgbnVtYmVyIHN0cnVjdHVyZSBpbiBsYm9hcmRfdC4KLSAgIEhhcmQgY29kZWQgdmFsdWVzIGFyZSBuZWNlc3Nhcnkgc2luY2Ugd2UgY2Fubm90IHRyZWF0Ci0gICBzZXJpYWwgbnVtYmVyIHN0cnVjdCBhcyBhIGNvbXBvbmVudCB3aXRob3V0IGxvc2luZyBjb21wYXRpYmlsaXR5Ci0gICBiZXR3ZWVuIHByb20gdmVyc2lvbnMuICovCi0KLSNkZWZpbmUgR0VUX1NOVU1fQ09NUChfbCkgCSgoa2xtb2Rfc2VyaWFsX251bV90ICopXAotCQkJCUtMQ0ZfQ09NUChfbCwgX2wtPmJyZF9udW1jb21wdHMpKQotCi0jZGVmaW5lIE1BWF9YQk9XX0xJTktTIDE2Ci0KLXR5cGVkZWYgc3RydWN0IGtseGJvd19zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhCT1cgKi8KLQlrbGluZm9fdCAJeGJvd19pbmZvIDsKLSAgICAJa2xwb3J0X3QJeGJvd19wb3J0X2luZm9bTUFYX1hCT1dfTElOS1NdIDsgLyogTW9kdWxlIG51bWJlciAqLwotICAgICAgICBpbnQJCXhib3dfbWFzdGVyX2h1Yl9saW5rOwotICAgICAgICAvKiB0eXBlIG9mIGJyZCBjb25uZWN0ZWQrY29tcG9uZW50IHN0cnVjdCBwdHIrZmxhZ3MgKi8KLX0ga2x4Ym93X3QgOwotCi0jZGVmaW5lIE1BWF9QQ0lfU0xPVFMgOAotCi10eXBlZGVmIHN0cnVjdCBrbHBjaV9kZXZpY2VfcyB7Ci0JczMyCXBjaV9kZXZpY2VfaWQ7CS8qIDMyIGJpdHMgb2YgdmVuZG9yL2RldmljZSBJRC4gKi8KLQlzMzIJcGNpX2RldmljZV9wYWQ7CS8qIDMyIGJpdHMgb2YgcGFkZGluZy4gKi8KLX0ga2xwY2lfZGV2aWNlX3Q7Ci0KLSNkZWZpbmUgQlJJREdFX1NUUlVDVF9WRVJTSU9OCTIKLQotdHlwZWRlZiBzdHJ1Y3Qga2xicmlfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCUklER0UgKi8KLQlrbGluZm9fdCAJYnJpX2luZm8gOwotICAgIAl1bnNpZ25lZCBjaGFyCWJyaV9lcHJvbWluZm8gOyAgICAvKiBJTzZwcm9tIGNvbm5lY3RlZCB0byBicmlkZ2UgKi8KLSAgICAJdW5zaWduZWQgY2hhcglicmlfYnVzdHlwZSA7ICAgICAgLyogUENJL1ZNRSBCVVMgYnJpZGdlL0dJTyAqLwotICAgIAlwY2lfdCAgICAJcGNpX3NwZWNpZmljICA7ICAgIC8qIFBDSSBCb2FyZCBjb25maWcgaW5mbyAqLwotCWtscGNpX2RldmljZV90CWJyaV9kZXZpY2VzW01BWF9QQ0lfREVWU10gOwkvKiBQQ0kgSURzICovCi0Ja2xjb25mX29mZl90CWJyaV9tZmdfbmljIDsKLX0ga2xicmlfdCA7Ci0KLSNkZWZpbmUgTUFYX0lPQzNfVFRZCTIKLQotdHlwZWRlZiBzdHJ1Y3Qga2xpb2MzX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU9DMyAqLwotCWtsaW5mb190IAlpb2MzX2luZm8gOwotICAgIAl1bnNpZ25lZCBjaGFyCWlvYzNfc3NyYW0gOyAgICAgICAgLyogSW5mbyBhYm91dCBzc3JhbSAqLwotICAgIAl1bnNpZ25lZCBjaGFyCWlvYzNfbnZyYW0gOyAgICAgICAgLyogSW5mbyBhYm91dCBudnJhbSAqLwotICAgIAlrbGluZm9fdAlpb2MzX3N1cGVyaW8gOyAgICAgIC8qIEluZm8gYWJvdXQgc3VwZXJpbyAqLwotCWtsY29uZl9vZmZfdAlpb2MzX3R0eV9vZmYgOwotCWtsaW5mb190CWlvYzNfZW5ldCA7Ci0Ja2xjb25mX29mZl90CWlvYzNfZW5ldF9vZmYgOwotCWtsY29uZl9vZmZfdAlpb2MzX2tiZF9vZmYgOwotfSBrbGlvYzNfdCA7Ci0KLSNkZWZpbmUgTUFYX1ZNRV9TTE9UUyA4Ci0KLXR5cGVkZWYgc3RydWN0IGtsdm1lYl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNRSBCUklER0UgLSBQQ0kgQ1RMUiAqLwotCWtsaW5mb190IAl2bWViX2luZm8gOwotCXZtZWJfdAkJdm1lYl9zcGVjaWZpYyA7Ci0gICAgCWtsY29uZl9vZmZfdCAgIAl2bWViX2JyZGluZm9bTUFYX1ZNRV9TTE9UU10gICA7ICAgIC8qIFZNRSBCb2FyZCBjb25maWcgaW5mbyAqLwotfSBrbHZtZWJfdCA7Ci0KLXR5cGVkZWYgc3RydWN0IGtsdm1lZF9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNRSBERVZJQ0UgLSBWTUUgQk9BUkQgKi8KLQlrbGluZm9fdAl2bWVkX2luZm8gOwotCXZtZWRfdAkJdm1lZF9zcGVjaWZpYyA7Ci0gICAgCWtsY29uZl9vZmZfdCAgIAl2bWVkX2JyZGluZm9bTUFYX1ZNRV9TTE9UU10gICA7ICAgIC8qIFZNRSBCb2FyZCBjb25maWcgaW5mbyAqLwotfSBrbHZtZWRfdCA7Ci0KLSNkZWZpbmUgUk9VVEVSX1ZFQ1RPUl9WRVJTCTIKLQotLyogWFhYIC0gRG9uJ3Qgd2UgbmVlZCB0aGUgbnVtYmVyIG9mIHBvcnRzIGhlcmU/IT8gKi8KLXR5cGVkZWYgc3RydWN0IGtscm91X3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUk9VVEVSICovCi0Ja2xpbmZvX3QgCXJvdV9pbmZvIDsKLQl1bnNpZ25lZCBpbnQJCXJvdV9mbGFncyA7ICAgICAgICAgICAvKiBQQ0ZHX1JPVVRFUl94eHggZmxhZ3MgKi8KLQluaWNfdAkJcm91X2JveF9uaWMgOyAgICAgICAgIC8qIG5pYyBvZiB0aGUgY29udGFpbmluZyBtb2R1bGUgKi8KLSAgICAJa2xwb3J0X3QgCXJvdV9wb3J0W01BWF9ST1VURVJfUE9SVFMgKyAxXSA7IC8qIGFycmF5IGluZGV4IDEgdG8gNiAqLwotCWtsY29uZl9vZmZfdAlyb3VfbWZnX25pYyA7ICAgICAvKiBNRkcgTklDIHN0cmluZyAqLwotCXU2NAlyb3VfdmVjdG9yOwkgIC8qIHZlY3RvciBmcm9tIG1hc3RlciBub2RlICovCi19IGtscm91X3QgOwotCi0vKgotICogIEdyYXBoaWNzIENvbnRyb2xsZXIvRGV2aWNlCi0gKgotICogIChJUDI3L0lPNikgUHJvbSB2ZXJzaW9ucyA2LjEzIChhbmQgNi41LjEga2VybmVscykgYW5kIGVhcmxpZXIKLSAqICB1c2VkIGEgY291cGxlIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIHRvIHN0b3JlIGdyYXBoaWNzIGluZm9ybWF0aW9uLgotICogIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHRoZSBuZXdlciBkYXRhIHN0cnVjdHVyZSBwcmVzZXJ2ZXMgc29tZQotICogIG9mIHRoZSBsYXlvdXQgc28gdGhhdCBmaWVsZHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgb2xkIHZlcnNpb25zIHJlbWFpbgotICogIGluIHRoZSBzYW1lIHBsYWNlICh3aXRoIHRoZSBzYW1lIGluZm8pLiAgRGV0ZXJtaW5hdGlvbiBvZiB3aGF0IHZlcnNpb24KLSAqICBvZiB0aGlzIHN0cnVjdHVyZSB3ZSBoYXZlIGlzIGRvbmUgYnkgY2hlY2tpbmcgdGhlIGNvb2tpZSBmaWVsZC4KLSAqLwotI2RlZmluZSBLTEdGWF9DT09LSUUJMHgwYzBkZTAwMAotCi10eXBlZGVmIHN0cnVjdCBrbGdmeF9zIHsJCS8qIEdSQVBISUNTIERldmljZSAqLwotCWtsaW5mb190IAlnZnhfaW5mbzsKLQlrbGNvbmZfb2ZmX3QgICAgb2xkX2duZGV2czsJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9tcyAqLwotCWtsY29uZl9vZmZfdCAgICBvbGRfZ2RvZmYwOwkvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHByb21zICovCi0JdW5zaWduZWQgaW50CQljb29raWU7CQkvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHByb21zICovCi0JdW5zaWduZWQgaW50CQltb2R1bGVzbG90OwotCXN0cnVjdCBrbGdmeF9zCSpnZnhfbmV4dF9waXBlOwotCWdyYXBoaWNzX3QJZ2Z4X3NwZWNpZmljOwotCWtsY29uZl9vZmZfdCAgICBwYWQwOwkJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBwcm9tcyAqLwotCWtsY29uZl9vZmZfdCAgICBnZnhfbWZnX25pYzsKLX0ga2xnZnhfdDsKLQotdHlwZWRlZiBzdHJ1Y3Qga2x4dGhkX3MgewotCWtsaW5mb190IAl4dGhkX2luZm8gOwotCWtsY29uZl9vZmZfdAl4dGhkX21mZ19uaWMgOyAgICAgICAgLyogTUZHIE5JQyBzdHJpbmcgKi8KLX0ga2x4dGhkX3QgOwotCi10eXBlZGVmIHN0cnVjdCBrbHRwdV9zIHsgICAgICAgICAgICAgICAgICAgICAvKiBUUFUgYm9hcmQgKi8KLQlrbGluZm9fdCAJdHB1X2luZm8gOwotCWtsY29uZl9vZmZfdAl0cHVfbWZnX25pYyA7ICAgICAgICAvKiBNRkcgTklDIHN0cmluZyAqLwotfSBrbHRwdV90IDsKLQotdHlwZWRlZiBzdHJ1Y3Qga2xnc25fcyB7ICAgICAgICAgICAgICAgICAgICAgLyogR1NOIGJvYXJkICovCi0Ja2xpbmZvX3QgCWdzbl9pbmZvIDsKLQlrbGNvbmZfb2ZmX3QJZ3NuX21mZ19uaWMgOyAgICAgICAgLyogTUZHIE5JQyBzdHJpbmcgKi8KLX0ga2xnc25fdCA7Ci0KLSNkZWZpbmUgTUFYX1NDU0lfREVWUyAxNgotCi0vKgotICogTk9URTogVEhpcyBpcyB0aGUgbWF4IHNpemVkIGtsKiBzdHJ1Y3R1cmUgYW5kIGlzIHVzZWQgaW4ga2xtYWxsb2MuYwotICogdG8gYWxsb2NhdGUgc3BhY2Ugb2YgdHlwZSBDT01QT05FTlQuIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBzaXplIG9mCi0gKiBhbnkgb3RoZXIgY29tcG9uZW50IHN0cnVjdCBiZWNvbWVzIG1vcmUgdGhhbiB0aGlzLCB0aGVuIHJlZGVmaW5lCi0gKiB0aGF0IGFzIHRoZSBzaXplIHRvIGJlIGtsbWFsbG9jZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qga2xzY3NpX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NTSSBDb250cm9sbGVyICovCi0Ja2xpbmZvX3QgCXNjc2lfaW5mbyA7Ci0gICAgCXNjc2lfdCAgICAgICAJc2NzaV9zcGVjaWZpYyAgIDsKLQl1bnNpZ25lZCBjaGFyIAlzY3NpX251bWRldnMgOwotCWtsY29uZl9vZmZfdAlzY3NpX2RldmluZm9bTUFYX1NDU0lfREVWU10gOwotfSBrbHNjc2lfdCA7Ci0KLXR5cGVkZWYgc3RydWN0IGtsc2NkZXZfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1NJIGRldmljZSAqLwotCWtsaW5mb190IAlzY2Rldl9pbmZvIDsKLQlzdHJ1Y3Qgc2NzaWRpc2tfZGF0YSAqc2NkZXZfY2ZnIDsgLyogZHJpdmVyIGZpbGxzIHVwIHRoaXMgKi8KLX0ga2xzY2Rldl90IDsKLQotdHlwZWRlZiBzdHJ1Y3Qga2x0dHlkZXZfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVFkgZGV2aWNlICovCi0Ja2xpbmZvX3QgCXR0eWRldl9pbmZvIDsKLQlzdHJ1Y3QgdGVybWluYWxfZGF0YSAqdHR5ZGV2X2NmZyA7IC8qIGRyaXZlciBmaWxscyB1cCB0aGlzICovCi19IGtsdHR5ZGV2X3QgOwotCi10eXBlZGVmIHN0cnVjdCBrbGVuZXRkZXZfcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFTkVUIGRldmljZSAqLwotCWtsaW5mb190IAllbmV0ZGV2X2luZm8gOwotCXN0cnVjdCBuZXRfZGF0YSAqZW5ldGRldl9jZmcgOyAvKiBkcml2ZXIgZmlsbHMgdXAgdGhpcyAqLwotfSBrbGVuZXRkZXZfdCA7Ci0KLXR5cGVkZWYgc3RydWN0IGtsa2JkZGV2X3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS0JEIGRldmljZSAqLwotCWtsaW5mb190IAlrYmRkZXZfaW5mbyA7Ci0Jc3RydWN0IGtleWJvYXJkX2RhdGEgKmtiZGRldl9jZmcgOyAvKiBkcml2ZXIgZmlsbHMgdXAgdGhpcyAqLwotfSBrbGtiZGRldl90IDsKLQotdHlwZWRlZiBzdHJ1Y3Qga2xtc2Rldl9zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdXNlIGRldmljZSAqLwotICAgICAgICBrbGluZm9fdCAgICAgICAgbXNkZXZfaW5mbyA7Ci0gICAgICAgIHZvaWQgCQkqbXNkZXZfY2ZnIDsKLX0ga2xtc2Rldl90IDsKLQotI2RlZmluZSBNQVhfRkRESV9ERVZTIDEwIC8qIFhYWCBJcyB0aGlzIHRydWUgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qga2xmZGRpX3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkRESSAqLwotCWtsaW5mb190IAlmZGRpX2luZm8gOwotICAgIAlmZGRpX3QgICAgICAgIAlmZGRpX3NwZWNpZmljIDsKLQlrbGNvbmZfb2ZmX3QJZmRkaV9kZXZpbmZvW01BWF9GRERJX0RFVlNdIDsKLX0ga2xmZGRpX3QgOwotCi10eXBlZGVmIHN0cnVjdCBrbG1pb19zIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1JTyAqLwotCWtsaW5mb190IAltaW9faW5mbyA7Ci0gICAgCW1pb190ICAgICAgIAltaW9fc3BlY2lmaWMgICA7Ci19IGtsbWlvX3QgOwotCi0KLXR5cGVkZWYgdW5pb24ga2xjb21wX3MgewotCWtsY3B1X3QJCWtjX2NwdTsKLQlrbGh1Yl90CQlrY19odWI7Ci0Ja2xtZW1ibmtfdCAJa2NfbWVtOwotCWtseGJvd190ICAJa2NfeGJvdzsKLQlrbGJyaV90CQlrY19icmk7Ci0Ja2xpb2MzX3QJa2NfaW9jMzsKLQlrbHZtZWJfdAlrY192bWViOwotCWtsdm1lZF90CWtjX3ZtZWQ7Ci0Ja2xyb3VfdAkJa2Nfcm91OwotCWtsZ2Z4X3QJCWtjX2dmeDsKLQlrbHNjc2lfdAlrY19zY3NpOwotCWtsc2NkZXZfdAlrY19zY3NpX2RldjsKLQlrbGZkZGlfdAlrY19mZGRpOwotCWtsbWlvX3QJCWtjX21pbzsKLQlrbG1vZF9zZXJpYWxfbnVtX3Qga2Nfc251bSA7Ci19IGtsY29tcF90OwotCi10eXBlZGVmIHVuaW9uIGtsZGV2X3MgeyAgICAgIC8qIGZvciBkZXZpY2Ugc3RydWN0dXJlIGFsbG9jYXRpb24gKi8KLQlrbHNjZGV2X3QJa2Nfc2NzaV9kZXYgOwotCWtsdHR5ZGV2X3QJa2NfdHR5X2RldiA7Ci0Ja2xlbmV0ZGV2X3QJa2NfZW5ldF9kZXYgOwotCWtsa2JkZGV2X3QgCWtjX2tiZF9kZXYgOwotfSBrbGRldl90IDsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgaW50ZXJmYWNlIHJvdXRpbmVzLiBUQkQgKi8KLQotLyogSW5jbHVkZSBsYXVuY2ggaW5mbyBpbiB0aGlzIGZpbGUgaXRzZWxmPyBUQkQgKi8KLQotLyoKLSAqIFRCRCAtIENhbiB0aGUgQVJDUyBhbmQgZGV2aWNlIGRyaXZlciByZWxhdGVkIGluZm8gYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUKLSAqIEtMQ09ORklHIGFyZWEuIE9uIHRoZSBJTzRQUk9NLCBwcm9tIGRldmljZSBkcml2ZXIgaW5mbyBpcyBwYXJ0IG9mIGNmZ25vZGVfdAotICogc3RydWN0dXJlLCB2aXogcHJpdmF0ZSB0byB0aGUgSU80cHJvbS4KLSAqLwotCi0vKgotICogVEJEIC0gQWxsb2NhdGlvbiBpc3N1ZXMuCi0gKgotICogRG8gd2UgbmVlZCB0byBNYXJrIG9mZiBzZXBhdGF0ZSBoZWFwcyBmb3IgbGJvYXJkX3QsIHJib2FyZF90LCBjb21wb25lbnQsCi0gKiBlcnJpbmZvIGFuZCBhbGxvY2F0ZSBmcm9tIHRoZW0sIG9yIGhhdmUgYSBzaW5nbGUgaGVhcCBhbmQgYWxsb2NhdGUgYWxsCi0gKiBzdHJ1Y3R1cmVzIGZyb20gaXQuIERlYnVnIGlzIGVhc2llciBpbiB0aGUgZm9ybWVyIG1ldGhvZCBzaW5jZSB3ZSBjYW4KLSAqIGR1bXAgYWxsIHNpbWlsYXIgc3RydWN0cyBpbiBvbmUgY29tbWFuZCwgYnV0IHRoZXJlIHdpbGwgYmUgbG90cyBvZiBob2xlcywKLSAqIGluIG1lbW9yeSBhbmQgbWF4IGxpbWl0cyBhcmUgbmVlZGVkIGZvciBudW1iZXIgb2Ygc3RydWN0dXJlcy4KLSAqIEFub3RoZXIgd2F5IHRvIG1ha2UgaXQgb3JnYW5pemVkLCBpcyB0byBoYXZlIGEgdW5pb24gb2YgYWxsIGNvbXBvbmVudHMKLSAqIGFuZCBhbGxvY2F0ZSBhIGFsaWduZWQgY2h1bmsgb2YgbWVtb3J5IGdyZWF0ZXIgdGhhbiB0aGUgYmlnZ2VzdAotICogY29tcG9uZW50LgotICovCi0KLXR5cGVkZWYgdW5pb24gewotCWxib2FyZF90ICpsYmluZm8gOwotfSBiaXB0cl90IDsKLQotCi0jZGVmaW5lIEJSSV9QRVJfWEJPVyA2Ci0jZGVmaW5lIFBDSV9QRVJfQlJJICA4Ci0jZGVmaW5lIERFVl9QRVJfUENJICAxNgotCi0KLS8qIFZpcnR1YWwgZGlwc3dpdGNoIHZhbHVlcyAoc3RhcnRpbmcgZnJvbSBzd2l0Y2ggIjciKTogKi8KLQotI2RlZmluZSBWRFNfTk9HRlgJCTB4ODAwMAkvKiBEb24ndCBlbmFibGUgZ2Z4IGFuZCBhdXRvYm9vdCAqLwotI2RlZmluZSBWRFNfTk9NUAkJMHgxMDAJLyogRG9uJ3Qgc3RhcnQgc2xhdmUgcHJvY2Vzc29ycyAqLwotI2RlZmluZSBWRFNfTUFOVU1PREUJCTB4ODAJLyogTWFudWZhY3R1cmluZyBtb2RlICovCi0jZGVmaW5lIFZEU19OT0FSQgkJMHg0MAkvKiBObyBib290bWFzdGVyIGFyYml0cmF0aW9uICovCi0jZGVmaW5lIFZEU19QT0RNT0RFCQkweDIwCS8qIEdvIHN0cmFpZ2h0IHRvIFBPRCBtb2RlICovCi0jZGVmaW5lIFZEU19OT19ESUFHUwkJMHgxMAkvKiBEb24ndCBydW4gYW55IGRpYWdzIGFmdGVyIEJNIGFyYiAqLwotI2RlZmluZSBWRFNfREVGQVVMVFMJCTB4MDgJLyogVXNlIGRlZmF1bHQgZW52aXJvbm1lbnQgdmFsdWVzICovCi0jZGVmaW5lIFZEU19OT01FTUNMRUFSCQkweDA0CS8qIERvbid0IHJ1biBtZW0gY2ZnIGNvZGUgKi8KLSNkZWZpbmUgVkRTXzJORF9JTzQJCTB4MDIJLyogQm9vdCBmcm9tIHRoZSBzZWNvbmQgSU80ICovCi0jZGVmaW5lIFZEU19ERUJVR19QUk9NCQkweDAxCS8qIFByaW50IFBST00gZGVidWdnaW5nIG1lc3NhZ2VzICovCi0KLS8qIGV4dGVybmFsIGRlY2xhcmF0aW9ucyBvZiBMaW51eCBrZXJuZWwgZnVuY3Rpb25zLiAqLwotCi1leHRlcm4gbGJvYXJkX3QgKmZpbmRfbGJvYXJkKGxib2FyZF90ICpzdGFydCwgdW5zaWduZWQgY2hhciB0eXBlKTsKLWV4dGVybiBrbGluZm9fdCAqZmluZF9jb21wb25lbnQobGJvYXJkX3QgKmJyZCwga2xpbmZvX3QgKmtsaSwgdW5zaWduZWQgY2hhciB0eXBlKTsKLWV4dGVybiBrbGluZm9fdCAqZmluZF9maXJzdF9jb21wb25lbnQobGJvYXJkX3QgKmJyZCwgdW5zaWduZWQgY2hhciB0eXBlKTsKLWV4dGVybiBrbGNwdV90ICpuYXNpZF9zbGljZV90b19jcHVpbmZvKG5hc2lkX3QsIGludCk7Ci1leHRlcm4gbGJvYXJkX3QgKmZpbmRfbGJvYXJkX2NsYXNzKGxib2FyZF90ICpzdGFydCwgdW5zaWduZWQgY2hhciBicmRfY2xhc3MpOwotCi0KLWV4dGVybiBrbGNwdV90ICpzbl9nZXRfY3B1aW5mbyhjcHVpZF90IGNwdSk7Ci0KLSNlbmRpZiAvKiBfQVNNX1NOX0tMQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vbWFwcGVkX2tlcm5lbC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zbi9tYXBwZWRfa2VybmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGQ1ZDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zbi9tYXBwZWRfa2VybmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogRmlsZSBjcmVhdGVkIGJ5IEthbm9qIFNhcmNhciAwNi8wNi8wMC4KLSAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqLwotI2lmbmRlZiBfX0FTTV9TTl9NQVBQRURfS0VSTkVMX0gKLSNkZWZpbmUgX19BU01fU05fTUFQUEVEX0tFUk5FTF9ICi0KLS8qCi0gKiBOb3RlIG9uIGhvdyBtYXBwZWQga2VybmVscyB3b3JrOiB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9uIGlzCi0gKiBjb21waWxlZCBhdCBja3NzZWcgc2VnbWVudCAoTE9BREFERFIgPSAweGMwMDFjMDAwKSwgYW5kIHRoZQotICogaW5pdC9zZXR1cC9kYXRhIHNlY3Rpb24gZ2V0cyBhIDE2TSB2aXJ0dWFsIGFkZHJlc3MgYnVtcCBpbiB0aGUKLSAqIGxkLnNjcmlwdCBmaWxlIChzbyB0aGF0IHRsYmxvMCBhbmQgdGxibG8xIG1hcHMgdGhlIHNlY3Rpb25zKS4KLSAqIFRoZSB2bWxpbnV4LjY0IHNlY3Rpb24gYWRkcmVzc2VzIGFyZSBwdXQgaW4gdGhlIHhrc2VnIHJhbmdlCi0gKiB1c2luZyB0aGUgY2hhbmdlLWFkZHJlc3NlcyBtYWtlZmlsZSBvcHRpb24uIFVzZSBlbGZkdW1wIC1vZgotICogb24gSVJJWCB0byBzZWUgd2hlcmUgdGhlIHNlY3Rpb25zIGdvLiBUaGUgT3JpZ2luIGxvYWRlciBsb2FkcwotICogdGhlIHR3byBzZWN0aW9ucyBjb250aWd1b3VzbHkgaW4gcGh5c2ljYWwgbWVtb3J5LiBUaGUgbG9hZGVyCi0gKiBzZXRzIHRoZSBlbnRyeSBwb2ludCBpbnRvIGtlcm5lbF9lbnRyeSB1c2luZyBhIHhrcGh5cyBhZGRyZXNzLAotICogYnV0IGluc3RlYWQgb2YgdXNpbmcgMHhhODAwMDAwMDAxMTYwMDAwLCBpdCB1c2VzIHRoZSBhZGRyZXNzCi0gKiAweGE4MDAwMDAwMDAxNjAwMDAsIHdoaWNoIGlzIHdoZXJlIGl0IHBoeXNpY2FsbHkgbG9hZGVkIHRoYXQKLSAqIGNvZGUuIFNvIG5vIGp1bXBzIGNhbiBiZSBkb25lIGJlZm9yZSB3ZSBoYXZlIHN3aXRjaGVkIHRvIHVzaW5nCi0gKiBja3NzZWcgYWRkcmVzc2VzLgotICovCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi0jZGVmaW5lIFJFUF9CQVNFCUNBQ19CQVNFCi0KLSNpZmRlZiBDT05GSUdfTUFQUEVEX0tFUk5FTAotCi0jZGVmaW5lIE1BUFBFRF9BRERSX1JPX1RPX1BIWVMoeCkJKHggLSBSRVBfQkFTRSkKLSNkZWZpbmUgTUFQUEVEX0FERFJfUldfVE9fUEhZUyh4KQkoeCAtIFJFUF9CQVNFIC0gMTY3NzcyMTYpCi0KLSNkZWZpbmUgTUFQUEVEX0tFUk5fUk9fUEhZU0JBU0UobikgXAotCQkJKFBMQVRfTk9ERV9EQVRBKG4pLT5rZXJuX3ZhcnMua3Zfcm9fYmFzZWFkZHIpCi0jZGVmaW5lIE1BUFBFRF9LRVJOX1JXX1BIWVNCQVNFKG4pIFwKLQkJCShQTEFUX05PREVfREFUQShuKS0+a2Vybl92YXJzLmt2X3J3X2Jhc2VhZGRyKQotCi0jZGVmaW5lIE1BUFBFRF9LRVJOX1JPX1RPX1BIWVMoeCkgXAotCQkJCSgodW5zaWduZWQgbG9uZylNQVBQRURfQUREUl9ST19UT19QSFlTKHgpIHwgXAotCQkJCU1BUFBFRF9LRVJOX1JPX1BIWVNCQVNFKGdldF9jb21wYWN0X25vZGVpZCgpKSkKLSNkZWZpbmUgTUFQUEVEX0tFUk5fUldfVE9fUEhZUyh4KSBcCi0JCQkJKCh1bnNpZ25lZCBsb25nKU1BUFBFRF9BRERSX1JXX1RPX1BIWVMoeCkgfCBcCi0JCQkJTUFQUEVEX0tFUk5fUldfUEhZU0JBU0UoZ2V0X2NvbXBhY3Rfbm9kZWlkKCkpKQotCi0jZWxzZSAvKiBDT05GSUdfTUFQUEVEX0tFUk5FTCAqLwotCi0jZGVmaW5lIE1BUFBFRF9LRVJOX1JPX1RPX1BIWVMoeCkJKHggLSBSRVBfQkFTRSkKLSNkZWZpbmUgTUFQUEVEX0tFUk5fUldfVE9fUEhZUyh4KQkoeCAtIFJFUF9CQVNFKQotCi0jZW5kaWYgLyogQ09ORklHX01BUFBFRF9LRVJORUwgKi8KLQotI2RlZmluZSBNQVBQRURfS0VSTl9ST19UT19LMCh4KQlQSFlTX1RPX0swKE1BUFBFRF9LRVJOX1JPX1RPX1BIWVMoeCkpCi0jZGVmaW5lIE1BUFBFRF9LRVJOX1JXX1RPX0swKHgpCVBIWVNfVE9fSzAoTUFQUEVEX0tFUk5fUldfVE9fUEhZUyh4KSkKLQotI2VuZGlmIC8qIF9fQVNNX1NOX01BUFBFRF9LRVJORUxfSCAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc24wL2h1YmlvLmggYi9pbmNsdWRlL2FzbS1taXBzL3NuL3NuMC9odWJpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg3ODk1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc24vc24wL2h1YmlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NzIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIERlcml2ZWQgZnJvbSBJUklYIDxzeXMvU04vU04wL2h1YmlvLmg+LCBSZXZpc2lvbiAxLjgwLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IFJhbGYgQmFlY2hsZQotICovCi0jaWZuZGVmCV9BU01fU0dJX1NOX1NOMF9IVUJJT19ICi0jZGVmaW5lCV9BU01fU0dJX1NOX1NOMF9IVUJJT19ICi0KLS8qCi0gKiBIdWIgSS9PIGludGVyZmFjZSByZWdpc3RlcnMKLSAqCi0gKiBBbGwgcmVnaXN0ZXJzIGluIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byBjaGFuZ2UgdW50aWwgSHViIGNoaXAgdGFwZW91dC4KLSAqIEluIGdlbmVyYWwsIHRoZSBsb25nZXIgc29mdHdhcmUgbmFtZSBzaG91bGQgYmUgdXNlZCB3aGVuIGF2YWlsYWJsZS4KLSAqLwotCi0vKgotICogU2xpZ2h0bHkgZnJpZW5kbGllciBuYW1lcyBmb3Igc29tZSBjb21tb24gcmVnaXN0ZXJzLgotICogVGhlIGhhcmR3YXJlIGRlZmluaXRpb25zIGZvbGxvdy4KLSAqLwotI2RlZmluZSBJSU9fV0lER0VUCQlJSU9fV0lEICAgICAgLyogV2lkZ2V0IGlkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lIElJT19XSURHRVRfU1RBVAkJSUlPX1dTVEFUICAgIC8qIFdpZGdldCBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUlPX1dJREdFVF9DVFJMCQlJSU9fV0NSCSAgICAgLyogV2lkZ2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUlPX1dJREdFVF9UT1VUCQlJSU9fV1JUTyAgICAgLyogV2lkZ2V0IHJlcXVlc3QgdGltZW91dCAqLwotI2RlZmluZSBJSU9fV0lER0VUX0ZMVVNICUlJT19XVEZSICAgICAvKiBXaWRnZXQgdGFyZ2V0IGZsdXNoICovCi0jZGVmaW5lIElJT19QUk9URUNUCQlJSU9fSUxBUFIgICAgLyogSU8gaW50ZXJmYWNlIHByb3RlY3Rpb24gKi8KLSNkZWZpbmUgSUlPX1BST1RFQ1RfT1ZSUkQJSUlPX0lMQVBPICAgIC8qIElPIHByb3RlY3Qgb3ZlcnJpZGUgKi8KLSNkZWZpbmUgSUlPX09VVFdJREdFVF9BQ0NFU1MJSUlPX0lPV0EgICAgIC8qIE91dGJvdW5kIHdpZGdldCBhY2Nlc3MgKi8KLSNkZWZpbmUgSUlPX0lOV0lER0VUX0FDQ0VTUwlJSU9fSUlXQSAgICAgLyogSW5ib3VuZCB3aWRnZXQgYWNjZXNzICovCi0jZGVmaW5lIElJT19JTkRFVl9FUlJfTUFTSwlJSU9fSUlERU0gICAgLyogSW5ib3VuZCBkZXZpY2UgZXJyb3IgbWFzayAqLwotI2RlZmluZSBJSU9fTExQX0NTUgkJSUlPX0lMQ1NSICAgIC8qIExMUCBjb250cm9sIGFuZCBzdGF0dXMgKi8KLSNkZWZpbmUgSUlPX0xMUF9MT0cJCUlJT19JTExSICAgICAvKiBMTFAgbG9nICovCi0jZGVmaW5lIElJT19YVEFMS0NDX1RPVVQJSUlPX0lYQ0MgICAgIC8qIFh0YWxrIGNyZWRpdCBjb3VudCB0aW1lb3V0Ki8KLSNkZWZpbmUgSUlPX1hUQUxLVFRfVE9VVAlJSU9fSVhUVCAgICAgLyogWHRhbGsgdGFpbCB0aW1lb3V0ICovCi0jZGVmaW5lIElJT19JT19FUlJfQ0xSCQlJSU9fSUVDTFIgICAgLyogSU8gZXJyb3IgY2xlYXIgKi8KLSNkZWZpbmUgSUlPX0JURV9DUkJfQ05UICAgICAgICAgSUlPX0lCQ04gICAgIC8qIElPIEJURSBDUkIgY291bnQgKi8KLQotI2RlZmluZSBJSU9fTExQX0NTUl9JU19VUAkJMHgwMDAwMjAwMAotI2RlZmluZQlJSU9fTExQX0NTUl9MTFBfU1RBVF9NQVNLCTB4MDAwMDMwMDAKLSNkZWZpbmUJSUlPX0xMUF9DU1JfTExQX1NUQVRfU0hGVAkxMgotCi0vKiBrZXkgdG8gSUlPX1BST1RFQ1RfT1ZSUkQgKi8KLSNkZWZpbmUgSUlPX1BST1RFQ1RfT1ZSUkRfS0VZCTB4NTM0NzQ5NzI3NTZjNjU3M3VsbAkvKiAiU0dJcnVsZXMiICovCi0KLS8qIEJURSByZWdpc3RlciBuYW1lcyAqLwotI2RlZmluZSBJSU9fQlRFX1NUQVRfMAkJSUlPX0lCTFNfMCAgIC8qIEFsc28gQlRFIGxlbmd0aC9zdGF0dXMgMCAqLwotI2RlZmluZSBJSU9fQlRFX1NSQ18wCQlJSU9fSUJTQV8wICAgLyogQWxzbyBCVEUgc291cmNlIGFkZHJlc3MgIDAgKi8KLSNkZWZpbmUgSUlPX0JURV9ERVNUXzAJCUlJT19JQkRBXzAgICAvKiBBbHNvIEJURSBkZXN0LiBhZGRyZXNzIDAgKi8KLSNkZWZpbmUgSUlPX0JURV9DVFJMXzAJCUlJT19JQkNUXzAgICAvKiBBbHNvIEJURSBjb250cm9sL3Rlcm1pbmF0ZSAwICovCi0jZGVmaW5lIElJT19CVEVfTk9USUZZXzAgCUlJT19JQk5BXzAgICAvKiBBbHNvIEJURSBub3RpZmljYXRpb24gMCAqLwotI2RlZmluZSBJSU9fQlRFX0lOVF8wCQlJSU9fSUJJQV8wICAgLyogQWxzbyBCVEUgaW50ZXJydXB0IDAgKi8KLSNkZWZpbmUgSUlPX0JURV9PRkZfMAkJMAkgICAgIC8qIEJhc2Ugb2Zmc2V0IGZyb20gQlRFIDAgcmVncy4gKi8KLSNkZWZpbmUgSUlPX0JURV9PRkZfMQlJSU9fSUJMU18xIC0gSUlPX0lCTFNfMCAvKiBPZmZzZXQgZnJvbSBiYXNlIHRvIEJURSAxICovCi0KLS8qIEJURSByZWdpc3RlciBvZmZzZXRzIGZyb20gYmFzZSAqLwotI2RlZmluZSBCVEVPRkZfU1RBVAkJMAotI2RlZmluZSBCVEVPRkZfU1JDCQkoSUlPX0JURV9TUkNfMCAtIElJT19CVEVfU1RBVF8wKQotI2RlZmluZSBCVEVPRkZfREVTVAkJKElJT19CVEVfREVTVF8wIC0gSUlPX0JURV9TVEFUXzApCi0jZGVmaW5lIEJURU9GRl9DVFJMCQkoSUlPX0JURV9DVFJMXzAgLSBJSU9fQlRFX1NUQVRfMCkKLSNkZWZpbmUgQlRFT0ZGX05PVElGWQkJKElJT19CVEVfTk9USUZZXzAgLSBJSU9fQlRFX1NUQVRfMCkKLSNkZWZpbmUgQlRFT0ZGX0lOVAkJKElJT19CVEVfSU5UXzAgLSBJSU9fQlRFX1NUQVRfMCkKLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB1c2UgdGhlIG5hbWVzIGRlZmluZWQgaW4gdGhlIElPIGludGVyZmFjZQotICogZG9jdW1lbnQgZm9yIGVhc2Ugb2YgcmVmZXJlbmNlLiAgV2hlbiBwb3NzaWJsZSwgc29mdHdhcmUgc2hvdWxkCi0gKiBnZW5lcmFsbHkgdXNlIHRoZSBsb25nZXIgYnV0IGNsZWFyZXIgbmFtZXMgZGVmaW5lZCBhYm92ZS4KLSAqLwotCi0jZGVmaW5lIElJT19CQVNFCTB4NDAwMDAwCi0jZGVmaW5lIElJT19CQVNFX0JURTAJMHg0MTAwMDAKLSNkZWZpbmUgSUlPX0JBU0VfQlRFMQkweDQyMDAwMAotI2RlZmluZSBJSU9fQkFTRV9QRVJGCTB4NDMwMDAwCi0jZGVmaW5lIElJT19QRVJGX0NOVAkweDQzMDAwOAotCi0jZGVmaW5lIElPX1BFUkZfU0VUUwkzMgotCi0jZGVmaW5lIElJT19XSUQJCTB4NDAwMDAwCS8qIFdpZGdldCBpZGVudGlmaWNhdGlvbiAqLwotI2RlZmluZSBJSU9fV1NUQVQJMHg0MDAwMDgJLyogV2lkZ2V0IHN0YXR1cyAqLwotI2RlZmluZSBJSU9fV0NSCQkweDQwMDAyMAkvKiBXaWRnZXQgY29udHJvbCAqLwotCi0jZGVmaW5lCUlJT19XU1RBVF9FQ1JBWlkJKDFVTEwgPDwgMzIpCS8qIEh1YiBnb25lIGNyYXp5ICovCi0jZGVmaW5lCUlJT19XU1RBVF9UWFJFVFJZCSgxVUxMIDw8IDkpCS8qIEh1YiBUeCBSZXRyeSB0aW1lb3V0ICovCi0jZGVmaW5lCUlJT19XU1RBVF9UWFJFVFJZX01BU0sJKDB4N0YpCi0jZGVmaW5lCUlJT19XU1RBVF9UWFJFVFJZX1NIRlQJKDE2KQotI2RlZmluZQlJSU9fV1NUQVRfVFhSRVRSWV9DTlQodykJKCgodykgPj4gSUlPX1dTVEFUX1RYUkVUUllfU0hGVCkgJiBcCi0JCQkJCSAgSUlPX1dTVEFUX1RYUkVUUllfTUFTSykKLQotI2RlZmluZSBJSU9fSUxBUFIJMHg0MDAxMDAJLyogTG9jYWwgQWNjZXNzIFByb3RlY3Rpb24gKi8KLSNkZWZpbmUgSUlPX0lMQVBPCTB4NDAwMTA4CS8qIFByb3RlY3Rpb24gb3ZlcnJpZGUgKi8KLSNkZWZpbmUgSUlPX0lPV0EJMHg0MDAxMTAJLyogb3V0Ym91bmQgd2lkZ2V0IGFjY2VzcyAqLwotI2RlZmluZSBJSU9fSUlXQQkweDQwMDExOAkvKiBpbmJvdW5kIHdpZGdldCBhY2Nlc3MgKi8KLSNkZWZpbmUgSUlPX0lJREVNCTB4NDAwMTIwCS8qIEluYm91bmQgRGV2aWNlIEVycm9yIE1hc2sgKi8KLSNkZWZpbmUgSUlPX0lMQ1NSCTB4NDAwMTI4CS8qIExMUCBjb250cm9sIGFuZCBzdGF0dXMgKi8KLSNkZWZpbmUgSUlPX0lMTFIJMHg0MDAxMzAJLyogTExQIExvZyAqLwotI2RlZmluZSBJSU9fSUlEU1IJMHg0MDAxMzgJLyogSW50ZXJydXB0IGRlc3RpbmF0aW9uICovCi0KLSNkZWZpbmUgSUlPX0lJQlVTRVJSCTB4MTQwMDIwOAkvKiBSZWFkcyBoZXJlIGNhdXNlIGEgYnVzIGVycm9yLiAqLwotCi0vKiBJTyBJbnRlcnJ1cHQgRGVzdGluYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUlPX0lJRFNSX1NFTlRfU0hJRlQJMjgKLSNkZWZpbmUgSUlPX0lJRFNSX1NFTlRfTUFTSwkweDEwMDAwMDAwCi0jZGVmaW5lIElJT19JSURTUl9FTkJfU0hJRlQJMjQKLSNkZWZpbmUgSUlPX0lJRFNSX0VOQl9NQVNLCTB4MDEwMDAwMDAKLSNkZWZpbmUgSUlPX0lJRFNSX05PREVfU0hJRlQJOAotI2RlZmluZSBJSU9fSUlEU1JfTk9ERV9NQVNLCTB4MDAwMGZmMDAKLSNkZWZpbmUgSUlPX0lJRFNSX0xWTF9TSElGVAkwCi0jZGVmaW5lIElJT19JSURTUl9MVkxfTUFTSwkweDAwMDAwMDNmCi0KLQotLyogR0ZYIEZsb3cgQ29udHJvbCBOb2RlL1dpZGdldCBSZWdpc3RlciAqLwotI2RlZmluZSBJSU9fSUdGWF8wCTB4NDAwMTQwCS8qIGdmeCBub2RlL3dpZGdldCByZWdpc3RlciAwICovCi0jZGVmaW5lIElJT19JR0ZYXzEJMHg0MDAxNDgJLyogZ2Z4IG5vZGUvd2lkZ2V0IHJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUgSUlPX0lHRlhfV19OVU1fQklUUwk0CS8qIHNpemUgb2Ygd2lkZ2V0IG51bSBmaWVsZCAqLwotI2RlZmluZSBJSU9fSUdGWF9XX05VTV9NQVNLCSgoMTw8SUlPX0lHRlhfV19OVU1fQklUUyktMSkKLSNkZWZpbmUgSUlPX0lHRlhfV19OVU1fU0hJRlQJMAotI2RlZmluZSBJSU9fSUdGWF9OX05VTV9CSVRTCTkJLyogc2l6ZSBvZiBub2RlIG51bSBmaWVsZCAqLwotI2RlZmluZSBJSU9fSUdGWF9OX05VTV9NQVNLCSgoMTw8SUlPX0lHRlhfTl9OVU1fQklUUyktMSkKLSNkZWZpbmUgSUlPX0lHRlhfTl9OVU1fU0hJRlQJNAotI2RlZmluZSBJSU9fSUdGWF9QX05VTV9CSVRTCTEJLyogc2l6ZSBvZiBwcm9jZXNzb3IgbnVtIGZpZWxkICovCi0jZGVmaW5lIElJT19JR0ZYX1BfTlVNX01BU0sJKCgxPDxJSU9fSUdGWF9QX05VTV9CSVRTKS0xKQotI2RlZmluZSBJSU9fSUdGWF9QX05VTV9TSElGVAkxNgotI2RlZmluZSBJSU9fSUdGWF9WTERfQklUUwkxCS8qIHNpemUgb2YgdmFsaWQgZmllbGQgKi8KLSNkZWZpbmUgSUlPX0lHRlhfVkxEX01BU0sJKCgxPDxJSU9fSUdGWF9WTERfQklUUyktMSkKLSNkZWZpbmUgSUlPX0lHRlhfVkxEX1NISUZUCTIwCi0jZGVmaW5lIElJT19JR0ZYX0lOSVQod2lkZ2V0LCBub2RlLCBjcHUsIHZhbGlkKQkJCQkoXAotCSgoKHdpZGdldCkgJiBJSU9fSUdGWF9XX05VTV9NQVNLKSA8PCBJSU9fSUdGWF9XX05VTV9TSElGVCkgfAkgXAotCSgoKG5vZGUpICAgJiBJSU9fSUdGWF9OX05VTV9NQVNLKSA8PCBJSU9fSUdGWF9OX05VTV9TSElGVCkgfAkgXAotCSgoKGNwdSkgICAgJiBJSU9fSUdGWF9QX05VTV9NQVNLKSA8PCBJSU9fSUdGWF9QX05VTV9TSElGVCkgfAkgXAotCSgoKHZhbGlkKSAgJiBJSU9fSUdGWF9WTERfTUFTSykgICA8PCBJSU9fSUdGWF9WTERfU0hJRlQpCSApCi0KLS8qIFNjcmF0Y2ggcmVnaXN0ZXJzIChub3QgYWxsIGJpdHMgYXZhaWxhYmxlKSAqLwotI2RlZmluZSBJSU9fU0NSQVRDSF9SRUcwCTB4NDAwMTUwCi0jZGVmaW5lCUlJT19TQ1JBVENIX1JFRzEJMHg0MDAxNTgKLSNkZWZpbmUgSUlPX1NDUkFUQ0hfTUFTSwkweDAwMDAwMDBmMDBmMTFmZmYKLQotI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzAJMHgwMDAwMDAwODAwMDAwMDAwCi0jZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfMQkweDAwMDAwMDA0MDAwMDAwMDAKLSNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF8yCTB4MDAwMDAwMDIwMDAwMDAwMAotI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzMJMHgwMDAwMDAwMTAwMDAwMDAwCi0jZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfNAkweDAwMDAwMDAwMDA4MDAwMDAKLSNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF81CTB4MDAwMDAwMDAwMDQwMDAwMAotI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzYJMHgwMDAwMDAwMDAwMjAwMDAwCi0jZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfNwkweDAwMDAwMDAwMDAxMDAwMDAKLSNkZWZpbmUgSUlPX1NDUkFUQ0hfQklUMF84CTB4MDAwMDAwMDAwMDAxMDAwMAotI2RlZmluZSBJSU9fU0NSQVRDSF9CSVQwXzkJMHgwMDAwMDAwMDAwMDAxMDAwCi0jZGVmaW5lIElJT19TQ1JBVENIX0JJVDBfUgkweDAwMDAwMDAwMDAwMDBmZmYKLQotLyogSU8gVHJhbnNsYXRpb24gVGFibGUgRW50cmllcyAqLwotI2RlZmluZSBJSU9fTlVNX0lUVEVTCTcJCS8qIElUVEVzIG51bWJlcmVkIDAuLjYgKi8KLQkJCQkJLyogSHcgbWFudWFscyBudW1iZXIgdGhlbSAxLi43ISAqLwotCi0vKgotICogQXMgYSBwZXJtYW5lbnQgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIFBJIHNpZGUgb2YgdGhlIGh1Yiwgd2UndmUKLSAqIHJlZGVmaW5lZCBiaWcgd2luZG93IDcgYXMgc21hbGwgd2luZG93IDAuCi0gKi8KLSNkZWZpbmUgSFVCX05VTV9CSUdfV0lORE9XCUlJT19OVU1fSVRURVMgLSAxCi0KLS8qCi0gKiBVc2UgdGhlIHRvcCBiaWcgd2luZG93IGFzIGEgc3Vycm9nYXRlIGZvciB0aGUgZmlyc3Qgc21hbGwgd2luZG93Ci0gKi8KLSNkZWZpbmUgU1dJTjBfQklHV0lOCQlIVUJfTlVNX0JJR19XSU5ET1cKLQotI2RlZmluZSBJTENTUl9XQVJNX1JFU0VUCTB4MTAwCi0vKgotICogVGhlIElPIExMUCBjb250cm9sIHN0YXR1cyByZWdpc3RlciBhbmQgd2lkZ2V0IGNvbnRyb2wgcmVnaXN0ZXIKLSAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotdHlwZWRlZiB1bmlvbiBodWJpaV93aWRfdSB7Ci0JdTY0CXdpZF9yZWdfdmFsdWU7Ci0Jc3RydWN0IHsKLQkJdTY0IAl3aWRfcnN2ZDogCTMyLAkvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAJd2lkX3Jldl9udW06CSA0LAkvKiByZXZpc2lvbiBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgICAJd2lkX3BhcnRfbnVtOgkxNiwJLyogdGhlIHdpZGdldCB0eXBlOiBodWI9YzEwMSAqLwotICAgICAgICAgICAgICAgICAgIAl3aWRfbWZnX251bToJMTEsCS8qIE1hbnVmYWN0dXJlciBpZCAoSUJNKSAqLwotICAgICAgICAgICAgICAgICAgIAl3aWRfcnN2ZDE6CSAxOwkvKiBSZXNlcnZlZCAqLwotICAgICAgICB9IHdpZF9maWVsZHNfczsKLX0gaHViaWlfd2lkX3Q7Ci0KLQotdHlwZWRlZiB1bmlvbiBodWJpaV93Y3JfdSB7Ci0JdTY0CXdjcl9yZWdfdmFsdWU7Ci0Jc3RydWN0IHsKLQkJdTY0IAl3Y3JfcnN2ZDogCTQxLAkvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAJd2NyX2VfdGhyZXNoOgkgNSwJLyogZWxhc3RpY2l0eSB0aHJlc2hvbGQgKi8KLQkJCXdjcl9kaXJfY29uOgkgMSwJLyogd2lkZ2V0IGRpcmVjdCBjb25uZWN0ICovCi0gICAgICAgICAgICAgICAgICAgCXdjcl9mX2JhZF9wa3Q6CSAxLAkvKiBGb3JjZSBiYWQgbGxwIHBrdCBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAJd2NyX3hiYXJfY3JkOgkgMywJLyogTExQIGNyb3NzYmFyIGNyZWRpdCAqLwotICAgICAgICAgICAgICAgICAgIAl3Y3JfcnN2ZDE6CSA4LAkvKiBSZXNlcnZlZCAqLwotCQkJd2NyX3RhZ19tb2RlOiAgICAxLAkvKiBUYWcgbW9kZSAqLwotICAgICAgICAgICAgICAgICAgIAl3Y3Jfd2lkZ2V0X2lkOgkgNDsJLyogTExQIGNyb3NzYmFyIGNyZWRpdCAqLwotICAgICAgICB9IHdjcl9maWVsZHNfczsKLX0gaHViaWlfd2NyX3Q7Ci0KLSNkZWZpbmUJaXdjcl9kaXJfY29uCXdjcl9maWVsZHNfcy53Y3JfZGlyX2NvbgotCi10eXBlZGVmIHVuaW9uIGh1YmlpX3dzdGF0X3UgewotCXU2NCAgICAgIHJlZ192YWx1ZTsKLQlzdHJ1Y3QgewotCQl1NjQJcnN2ZDE6CQkzMSwKLQkJCWNyYXp5OgkJIDEsCS8qIENyYXp5IGJpdAkJKi8KLQkJCXJzdmQyOgkJIDgsCi0JCQlsbHBfdHhfY250OgkgOCwgCS8qIExMUCBYbWl0IHJldHJ5IGNvdW50ZXIgKi8KLQkJCXJzdmQzOgkJIDYsCi0JCQl0eF9tYXhfcnRyeToJIDEsCS8qIExMUCBSZXRyeSBUaW1lb3V0IFNpZ25hbCAqLwotCQkJcnN2ZDQ6CQkgMiwKLQkJCXh0X3RhaWxfdG86CSAxLAkvKiBYdGFsayBUYWlsIFRpbWVvdXQJKi8KLQkJCXh0X2NyZF90bzoJIDEsCS8qIFh0YWxrIENyZWRpdCBUaW1lb3V0CSovCi0JCQlwZW5kaW5nOgkgNDsJLyogUGVuZGluZyBSZXF1ZXN0cwkqLwotCX0gd3N0YXRfZmllbGRzX3M7Ci19IGh1YmlpX3dzdGF0X3Q7Ci0KLQotdHlwZWRlZiB1bmlvbiBodWJpaV9pbGNzcl91IHsKLQl1NjQJaWNzcl9yZWdfdmFsdWU7Ci0Jc3RydWN0IHsKLQkJdTY0IAlpY3NyX3JzdmQ6IAkyMiwJLyogdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgCWljc3JfbWF4X2J1cnN0OgkxMCwJLyogbWF4IGJ1cnN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpY3NyX3JzdmQ0OgkgNiwJLyogcmVzZXJ2ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAJaWNzcl9tYXhfcmV0cnk6CTEwLAkvKiBtYXggcmV0cnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGljc3JfcnN2ZDM6CSAyLAkvKiByZXNlcnZlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWNzcl9sbmtfc3RhdDoJIDIsCS8qIGxpbmsgc3RhdHVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpY3NyX2JtODoJIDEsCS8qIEJpdCBtb2RlIDggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGljc3JfbGxwX2VuOgkgMSwJLyogTExQIGVuYWJsZSBiaXQgKi8KLSAgICAgICAgICAgICAgICAgCWljc3JfcnN2ZDI6CSAxLCAgICAgLyogcmVzZXJ2ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGljc3Jfd3JtX3Jlc2V0OgkgMSwJLyogV2FybSByZXNldCBiaXQgKi8KLQkJCWljc3JfcnN2ZDE6CSAyLAkvKiBEYXRhIHJlYWR5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWNzcl9udWxsX3RvOgkgNjsJLyogTnVsbCB0aW1lb3V0ICAgKi8KLQotICAgICAgICB9IGljc3JfZmllbGRzX3M7Ci19IGh1YmlpX2lsY3NyX3Q7Ci0KLQotdHlwZWRlZiB1bmlvbiBodWJpaV9pb3dhX3UgewotCXU2NAlpb3dhX3JlZ192YWx1ZTsKLQlzdHJ1Y3QgewotCQl1NjQgCWlvd2FfcnN2ZDogCTQ4LAkvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgCWlvd2Ffd3hvYWM6CSA4LAkvKiB4dGFsayB3aWRnZXQgYWNjZXNzIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAJaW93YV9yc3ZkMToJIDcsCS8qIHh0YWxrIHdpZGdldCBhY2Nlc3MgYml0cyAqLwotICAgICAgICAgICAgICAgICAgCWlvd2FfdzBvYWM6CSAxOwkvKiB4dGFsayB3aWRnZXQgYWNjZXNzIGJpdHMgKi8KLSAgICAgICAgfSBpb3dhX2ZpZWxkc19zOwotfSBodWJpaV9pb3dhX3Q7Ci0KLXR5cGVkZWYgdW5pb24gaHViaWlfaWl3YV91IHsKLQl1NjQJaWl3YV9yZWdfdmFsdWU7Ci0Jc3RydWN0IHsKLQkJdTY0IAlpaXdhX3JzdmQ6IAk0OCwJLyogdW51c2VkICovCi0JCQlpaXdhX3d4aWFjOgkgOCwJLyogaHViIHdpZCBhY2Nlc3MgYml0cyAqLwotCQkJaWl3YV9yc3ZkMToJIDcsCS8qIHJlc2VydmVkICovCi0JCQlpaXdhX3cwaWFjOgkgMTsJLyogaHViIHdpZDAgYWNjZXNzICovCi0gICAgICAgIH0gaWl3YV9maWVsZHNfczsKLX0gaHViaWlfaWl3YV90OwotCi10eXBlZGVmIHVuaW9uCWh1YmlpX2lsbHJfdSB7Ci0JdTY0CWlsbHJfcmVnX3ZhbHVlOwotCXN0cnVjdCB7Ci0JCXU2NCAJaWxscl9yc3ZkOiAJMzIsCS8qIHVudXNlZCAqLwotCQkJaWxscl9jYl9jbnQ6CTE2LAkvKiBjaGVja2JpdCBlcnJvciBjb3VudCAqLwotICAgICAgICAgICAgICAgICAgIAlpbGxyX3NuX2NudDoJMTY7CS8qIHNlcXVlbmNlIG51bWJlciBjb3VudCAqLwotICAgICAgICB9IGlsbHJfZmllbGRzX3M7Ci19IGh1YmlpX2lsbHJfdDsKLQotLyogVGhlIHN0cnVjdHVyZXMgYmVsb3cgYXJlIGRlZmluZWQgdG8gZXh0cmFjdCBhbmQgbW9kaWZ5IHRoZSBpaQotcGVyZm9ybWFuY2UgcmVnaXN0ZXJzICovCi0KLS8qIGlvX3BlcmZfc2VsIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgd2hhdCB0ZXN0cyB3aWxsIGJlCi0gICBwZXJmb3JtZWQgKi8KLXR5cGVkZWYgdW5pb24gaW9fcGVyZl9zZWwgewotCXU2NCBwZXJmX3NlbF9yZWc7Ci0Jc3RydWN0IHsKLQkJdTY0IAlwZXJmX3JzdmQgIDogNDgsCi0JCQlwZXJmX2ljY3QgIDogIDgsCi0JCSAJcGVyZl9pcHByMSA6ICA0LAotCQkJcGVyZl9pcHByMCA6ICA0OwotCX0gcGVyZl9zZWxfYml0czsKLX0gaW9fcGVyZl9zZWxfdDsKLQotLyogaW9fcGVyZl9jbnQgaXMgdG8gZXh0cmFjdCB0aGUgY291bnQgZnJvbSB0aGUgaHViIHJlZ2lzdGVycy4gRHVlIHRvCi0gICBoYXJkd2FyZSBwcm9ibGVtcyB0aGVyZSBpcyBvbmx5IG9uZSBjb3VudGVyLCBub3QgdHdvLiAqLwotCi10eXBlZGVmIHVuaW9uIGlvX3BlcmZfY250IHsKLQl1NjQJcGVyZl9jbnQ7Ci0Jc3RydWN0IHsKLQkJdTY0CXBlcmZfcnN2ZDEgOiAzMiwKLQkJCXBlcmZfcnN2ZDIgOiAxMiwKLQkJCXBlcmZfY250ICAgOiAyMDsKLQl9IHBlcmZfY250X2JpdHM7Ci19IGlvX3BlcmZfY250X3Q7Ci0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLQotI2RlZmluZSBMTktfU1RBVF9XT1JLSU5HCTB4MgotCi0jZGVmaW5lIElJT19MTFBfQ0JfTUFYCTB4ZmZmZgotI2RlZmluZSBJSU9fTExQX1NOX01BWAkweGZmZmYKLQotLyogSU8gUFJCIEVudHJpZXMgKi8KLSNkZWZpbmUJSUlPX05VTV9JUFJCUwkoOSkKLSNkZWZpbmUgSUlPX0lPUFJCXzAJMHg0MDAxOTgJLyogUFJCIGVudHJ5IDAgKi8KLSNkZWZpbmUgSUlPX0lPUFJCXzgJMHg0MDAxYTAJLyogUFJCIGVudHJ5IDggKi8KLSNkZWZpbmUgSUlPX0lPUFJCXzkJMHg0MDAxYTgJLyogUFJCIGVudHJ5IDkgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0EJMHg0MDAxYjAJLyogUFJCIGVudHJ5IGEgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0IJMHg0MDAxYjgJLyogUFJCIGVudHJ5IGIgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0MJMHg0MDAxYzAJLyogUFJCIGVudHJ5IGMgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0QJMHg0MDAxYzgJLyogUFJCIGVudHJ5IGQgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0UJMHg0MDAxZDAJLyogUFJCIGVudHJ5IGUgKi8KLSNkZWZpbmUgSUlPX0lPUFJCX0YJMHg0MDAxZDgJLyogUFJCIGVudHJ5IGYgKi8KLQotCi0jZGVmaW5lIElJT19JWENDCTB4NDAwMWUwCS8qIENyb3NzdGFsayBjcmVkaXQgY291bnQgdGltZW91dCAqLwotI2RlZmluZSBJSU9fSVhUQ0MJSUlPX0lYQ0MKLSNkZWZpbmUgSUlPX0lNRU0JMHg0MDAxZTgJLyogTWlzY2VsbGFuZW91cyBFbmFibGUgTWFzayAqLwotI2RlZmluZSBJSU9fSVhUVAkweDQwMDFmMAkvKiBDcm9zc3RhbGsgdGFpbCB0aW1lb3V0ICovCi0jZGVmaW5lIElJT19JRUNMUgkweDQwMDFmOAkvKiBJTyBlcnJvciBjbGVhciAqLwotI2RlZmluZSBJSU9fSUJDTiAgICAgICAgMHg0MDAyMDAgICAgICAgIC8qIElPIEJURSBDUkIgY291bnQgKi8KLQotLyoKLSAqIElJT19JTUVNIFJlZ2lzdGVyIGZpZWxkcy4KLSAqLwotI2RlZmluZSBJSU9fSU1FTV9XMEVTRCAgMHgxICAgICAgICAgICAgIC8qIFdpZGdldCAwIHNodXQgZG93biBkdWUgdG8gZXJyb3IgKi8KLSNkZWZpbmUgSUlPX0lNRU1fQjBFU0QgICgxIDw8IDQpICAgICAgICAvKiBCVEUgMCBzaHV0IGRvd24gZHVlIHRvIGVycm9yICovCi0jZGVmaW5lIElJT19JTUVNX0IxRVNEICAoMSA8PCA4KSAgICAgICAgLyogQlRFIDEgU2h1dCBkb3duIGR1ZSB0byBlcnJvciAqLwotCi0vKiBQSU8gUmVhZCBhZGRyZXNzIFRhYmxlIEVudHJpZXMgKi8KLSNkZWZpbmUgSUlPX0lQQ0EJMHg0MDAzMDAJLyogUFJCIENvdW50ZXIgYWRqdXN0ICovCi0jZGVmaW5lIElJT19OVU1fUFJURVMJOAkJLyogVG90YWwgbnVtYmVyIG9mIFBSQiB0YWJsZSBlbnRyaWVzICovCi0jZGVmaW5lIElJT19QUlRFXzAJMHg0MDAzMDgJLyogUElPIFJlYWQgYWRkcmVzcyB0YWJsZSBlbnRyeSAwICovCi0jZGVmaW5lIElJT19QUlRFKF94KQkoSUlPX1BSVEVfMCArICg4ICogKF94KSkpCi0jZGVmaW5lCUlJT19XSURQUlRFKHgpCUlJT19QUlRFKCgoeCkgLSA4KSkgLyogd2lkZ2V0IElEIHRvIGl0cyBQUlRFIG51bSAqLwotI2RlZmluZSBJSU9fSVBEUgkweDQwMDM4OAkvKiBQSU8gdGFibGUgZW50cnkgZGVhbGxvY2F0aW9uICovCi0jZGVmaW5lIElJT19JQ0RSCTB4NDAwMzkwCS8qIENSQiBFbnRyeSBEZWFsbG9jYXRpb24gKi8KLSNkZWZpbmUgSUlPX0lGRFIJMHg0MDAzOTgJLyogSU9RIEZJRk8gRGVwdGggKi8KLSNkZWZpbmUgSUlPX0lJQVAJMHg0MDAzYTAJLyogSUlRIEFyYml0cmF0aW9uIFBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgSUlPX0lNTVIJSUlPX0lJQVAKLSNkZWZpbmUgSUlPX0lDTVIJMHg0MDAzYTgJLyogQ1JCIE1hbmFnZW1lbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUlPX0lDQ1IJMHg0MDAzYjAJLyogQ1JCIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSUlPX0lDVE8JMHg0MDAzYjgJLyogQ1JCIFRpbWUgT3V0IFJlZ2lzdGVyICovCi0jZGVmaW5lIElJT19JQ1RQCTB4NDAwM2MwCS8qIENSQiBUaW1lIE91dCBQcmVzY2FsYXIgKi8KLQotCi0vKgotICogSUNNUiByZWdpc3RlciBmaWVsZHMKLSAqLwotI2RlZmluZSBJSU9fSUNNUl9QQ19WTERfU0hGVAkzNgotI2RlZmluZSBJSU9fSUNNUl9QQ19WTERfTUFTSwkoMHg3ZmZmVUwgPDwgSUlPX0lDTVJfUENfVkxEX1NIRlQpCi0KLSNkZWZpbmUgSUlPX0lDTVJfQ1JCX1ZMRF9TSEZUCTIwCi0jZGVmaW5lIElJT19JQ01SX0NSQl9WTERfTUFTSwkoMHg3ZmZmVUwgPDwgSUlPX0lDTVJfQ1JCX1ZMRF9TSEZUKQotCi0jZGVmaW5lIElJT19JQ01SX0ZDX0NOVF9TSEZUCTE2Ci0jZGVmaW5lIElJT19JQ01SX0ZDX0NOVF9NQVNLCSgweGYgPDwgSUlPX0lDTVJfRkNfQ05UX1NIRlQpCi0KLSNkZWZpbmUgSUlPX0lDTVJfQ19DTlRfU0hGVAk0Ci0jZGVmaW5lIElJT19JQ01SX0NfQ05UX01BU0sJKDB4ZiA8PCBJSU9fSUNNUl9DX0NOVF9TSEZUKQotCi0jZGVmaW5lIElJT19JQ01SX1BfQ05UX1NIRlQJMAotI2RlZmluZSBJSU9fSUNNUl9QX0NOVF9NQVNLCSgweGYgPDwgSUlPX0lDTVJfUF9DTlRfU0hGVCkKLQotI2RlZmluZSBJSU9fSUNNUl9QUkVDSVNFCSgxVUwgPDwgNTIpCi0jZGVmaW5lIElJT19JQ01SX0NMUl9SUFBECSgxVUwgPDwgMTMpCi0jZGVmaW5lIElJT19JQ01SX0NMUl9SUVBECSgxVUwgPDwgMTIpCi0KLS8qCi0gKiBJSU8gUElPIERlYWxsb2NhdGlvbiByZWdpc3RlciBmaWVsZCBtYXNrcyA6IChJSU9fSVBEUikKLSAqLwotI2RlZmluZQlJSU9fSVBEUl9QTkQJKDEgPDwgNCkKLQotLyoKLSAqIElJTyBDUkIgZGVhbGxvY2F0aW9uIHJlZ2lzdGVyIGZpZWxkIG1hc2tzOiAoSUlPX0lDRFIpCi0gKi8KLSNkZWZpbmUJSUlPX0lDRFJfUE5ECSgxIDw8IDQpCi0KLS8qCi0gKiBJSU8gQ1JCIGNvbnRyb2wgcmVnaXN0ZXIgRmllbGRzOiBJSU9fSUNDUgotICovCi0jZGVmaW5lCUlJT19JQ0NSX1BFTkRJTkcJKDB4MTAwMDApCi0jZGVmaW5lCUlJT19JQ0NSX0NNRF9NQVNLCSgweEZGKQotI2RlZmluZQlJSU9fSUNDUl9DTURfU0hGVAkoNykKLSNkZWZpbmUJSUlPX0lDQ1JfQ01EX05PUAkoMHgwKQkvKiBObyBPcCAqLwotI2RlZmluZQlJSU9fSUNDUl9DTURfV0FLRQkoMHgxMDApIC8qIFJlYWN0aXZhdGUgQ1JCIGVudHJ5IGFuZCBwcm9jZXNzICovCi0jZGVmaW5lCUlJT19JQ0NSX0NNRF9USU1FT1VUCSgweDIwMCkJLyogTWFrZSBDUkIgdGltZW91dCAmIG1hcmsgaW52YWxpZCAqLwotI2RlZmluZQlJSU9fSUNDUl9DTURfRUpFQ1QJKDB4NDAwKQkvKiBDb250ZW50cyBvZiBlbnRyeSB3cml0dGVuIHRvIG1lbW9yeQotCQkJCQkgKiB2aWEgYSBXQgotCQkJCQkgKi8KLSNkZWZpbmUJSUlPX0lDQ1JfQ01EX0ZMVVNICSgweDgwMCkKLQotLyoKLSAqIENSQiBtYW5pcHVsYXRpb24gbWFjcm9zCi0gKglUaGUgQ1JCIG1hY3JvcyBhcmUgc2xpZ2h0bHkgY29tcGxpY2F0ZWQsIHNpbmNlIHRoZXJlIGFyZSB1cCB0bwotICogCWZvdXIgcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIENSQiBlbnRyeS4KLSAqLwotI2RlZmluZSBJSU9fTlVNX0NSQlMJCTE1CS8qIE51bWJlciBvZiBDUkJzICovCi0jZGVmaW5lIElJT19OVU1fTk9STUFMX0NSQlMgICAgIDEyCS8qIE51bWJlciBvZiByZWd1bGFyIENSQiBlbnRyaWVzICovCi0jZGVmaW5lIElJT19OVU1fUENfQ1JCUyAJNAkvKiBOdW1iZXIgb2YgcGFydGlhbCBjYWNoZSBDUkJzICovCi0jZGVmaW5lIElJT19JQ1JCX09GRlNFVAkJOAotI2RlZmluZSBJSU9fSUNSQl8wCQkweDQwMDQwMAotLyogWFhYIC0gVGhpcyBpcyBub3cgdHVuZWFibGU6Ci0JI2RlZmluZSBJSU9fRklSU1RfUENfRU5UUlkgMTIKLSAqLwotCi0jZGVmaW5lIElJT19JQ1JCX0EoX3gpCShJSU9fSUNSQl8wICsgKDQgKiBJSU9fSUNSQl9PRkZTRVQgKiAoX3gpKSkKLSNkZWZpbmUgSUlPX0lDUkJfQihfeCkgIChJSU9fSUNSQl9BKF94KSArIDEqSUlPX0lDUkJfT0ZGU0VUKQotI2RlZmluZSBJSU9fSUNSQl9DKF94KQkoSUlPX0lDUkJfQShfeCkgKyAyKklJT19JQ1JCX09GRlNFVCkKLSNkZWZpbmUgSUlPX0lDUkJfRChfeCkgIChJSU9fSUNSQl9BKF94KSArIDMqSUlPX0lDUkJfT0ZGU0VUKQotCi0vKiBYWFggLSBJQlVFIHJlZ2lzdGVyIGNvbWluZyBmb3IgSHViIDIgKi8KLQotLyoKLSAqCi0gKiBDUkIgUmVnaXN0ZXIgZGVzY3JpcHRpb24uCi0gKgotICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORwotICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORwotICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORwotICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORwotICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORyAqIFdBUk5JTkcgKiBXQVJOSU5HICogV0FSTklORwotICoKLSAqIE1hbnkgb2YgdGhlIGZpZWxkcyBpbiBDUkIgYXJlIHN0YXR1cyBiaXRzIHVzZWQgYnkgaGFyZHdhcmUKLSAqIGZvciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2wuIEl0J3MgdmVyeSBkYW5nZXJvdXMgdG8KLSAqIG1lc3MgYXJvdW5kIHdpdGggdGhlIENSQiByZWdpc3RlcnMuCi0gKgotICogSXQncyBPSyB0byByZWFkIHRoZSBDUkIgcmVnaXN0ZXJzIGFuZCB0cnkgdG8gbWFrZSBzZW5zZSBvdXQgb2YgdGhlCi0gKiBmaWVsZHMgaW4gQ1JCLgotICoKLSAqIFVwZGF0aW5nIENSQiByZXF1aXJlcyBhbGwgYWN0aXZpdGllcyBpbiBIdWIgSUlPIHRvIGJlIHF1aWVzY2VkLgotICogb3RoZXJ3aXNlLCBhIHdyaXRlIHRvIENSQiBjb3VsZCBjb3JydXB0IG90aGVyIENSQiBlbnRyaWVzLgotICogQ1JCcyBhcmUgaGVyZSBvbmx5IGFzIGEgYmFjayBkb29yIHBlZWsgdG8gaHViIElJTydzIHN0YXR1cy4KLSAqIFF1aWVzY2luZyBpbXBsaWVzICBubyBkbWFzIG5vIFBJT3MKLSAqIGVpdGhlciBkaXJlY3RseSBmcm9tIHRoZSBjcHUgb3IgZnJvbSBzbjBuZXQuCi0gKiB0aGlzIGlzIG5vdCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgZG9uZSBlYXNpbHkuIFNvLCBBVk9JRCB1cGRhdGluZwotICogQ1JCcy4KLSAqLwotCi0vKgotICogRmllbGRzIGluIENSQiBSZWdpc3RlciBBCi0gKi8KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi10eXBlZGVmIHVuaW9uIGljcmJhX3UgewotCXU2NAlyZWdfdmFsdWU7Ci0Jc3RydWN0IHsKLQkJdTY0IAlyZXN2ZDogCTYsCi0JCQlzdGFsbF9idGUwOiAxLAkvKiBTdGFsbCBCVEUgMCAqLwotCQkJc3RhbGxfYnRlMTogMSwJLyogU3RhbGwgQlRFIDEgKi8KLQkJCWVycm9yOgkxLAkvKiBDUkIgaGFzIGFuIGVycm9yCSovCi0JCQllY29kZToJMywJLyogRXJyb3IgQ29kZSAJCSovCi0JCQlsbmV0dWNlOiAxLAkvKiBTTjBuZXQgVW5jb3JyZWN0YWJsZSBlcnJvciAqLwotCQkJbWFyazoJMSwJLyogQ1JCIEhhcyBiZWVuIG1hcmtlZCAJKi8KLQkJCXhlcnI6CTEsCS8qIEVycm9yIGJpdCBzZXQgaW4geHRhbGsgaGVhZGVyICovCi0JCQlzaWRuOgk0LAkvKiBTSUROIGZpZWxkIGZyb20geHRhbGsJKi8KLQkJCXRudW06IAk1LAkvKiBUTlVNIGZpZWxkIGluIHh0YWxrCQkqLwotCQkJYWRkcjoJMzgsCS8qIEFkZHJlc3Mgb2YgcmVxdWVzdAkqLwotCQkJdmFsaWQ6CTEsCS8qIFZhbGlkIHN0YXR1cwkJKi8KLQkJCWlvdzoJMTsJLyogSU8gV3JpdGUgb3BlcmF0aW9uCSovCi0JfSBpY3JiYV9maWVsZHNfczsKLX0gaWNyYmFfdDsKLQotLyogVGhpcyBpcyBhbiBhbHRlcm5hdGUgdHlwZWRlZiBmb3IgdGhlIEhVQjEgQ1JCIEEgaW4gb3JkZXIgdG8gYWxsb3cKLSAgIHJ1bnRpbWUgc2VsZWN0aW9uIG9mIHRoZSBmb3JtYXQgYmFzZWQgb24gdGhlIFJFVl9JRCBmaWVsZCBvZiB0aGUKLSAgIE5JX1NUQVRVU19SRVZfSUQgcmVnaXN0ZXIuICovCi10eXBlZGVmIHVuaW9uIGgxX2ljcmJhX3UgewotCXU2NAlyZWdfdmFsdWU7Ci0KLQlzdHJ1Y3QgewotCQl1NjQgCXJlc3ZkOiAJNiwKLQkJCXVudXNlZDoJMSwJLyogVW51c2VkIGJ1dCBSVyEhCSovCi0JCQllcnJvcjoJMSwJLyogQ1JCIGhhcyBhbiBlcnJvcgkqLwotCQkJZWNvZGU6CTQsCS8qIEVycm9yIENvZGUgCQkqLwotCQkJbG5ldHVjZTogMSwJLyogU04wbmV0IFVuY29ycmVjdGFibGUgZXJyb3IgKi8KLQkJCW1hcms6CTEsCS8qIENSQiBIYXMgYmVlbiBtYXJrZWQgCSovCi0JCQl4ZXJyOgkxLAkvKiBFcnJvciBiaXQgc2V0IGluIHh0YWxrIGhlYWRlciAqLwotCQkJc2lkbjoJNCwJLyogU0lETiBmaWVsZCBmcm9tIHh0YWxrCSovCi0JCQl0bnVtOiAJNSwJLyogVE5VTSBmaWVsZCBpbiB4dGFsawkJKi8KLQkJCWFkZHI6CTM4LAkvKiBBZGRyZXNzIG9mIHJlcXVlc3QJKi8KLQkJCXZhbGlkOgkxLAkvKiBWYWxpZCBzdGF0dXMJCSovCi0JCQlpb3c6CTE7CS8qIElPIFdyaXRlIG9wZXJhdGlvbgkqLwotCX0gaDFfaWNyYmFfZmllbGRzX3M7Ci19IGgxX2ljcmJhX3Q7Ci0KLS8qIFhYWCAtIElzIHRoaXMgc3RpbGwgcmlnaHQ/ICBDaGVjayB0aGUgc3BlYy4gKi8KLSNkZWZpbmUgSUNSQk5fQV9DRVJSX1NIRlQJNTQKLSNkZWZpbmUgSUNSQk5fQV9FUlJfTUFTSwkweDNmZgotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0jZGVmaW5lCUlJT19JQ1JCX0FERFJfU0hGVAkyCS8qIFNoaWZ0IHRvIGdldCBwcm9wZXIgYWRkcmVzcyAqLwotCi0vKgotICogdmFsdWVzIGZvciAiZWNvZGUiIGZpZWxkCi0gKi8KLSNkZWZpbmUJSUlPX0lDUkJfRUNPREVfREVSUgkwCS8qIERpcmVjdG9yeSBlcnJvciBkdWUgdG8gSUlPIGFjY2VzcyAqLwotI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9QRVJSCTEJLyogUG9pc29uIGVycm9yIG9uIElPIGFjY2VzcyAqLwotI2RlZmluZQlJSU9fSUNSQl9FQ09ERV9XRVJSCTIJLyogV3JpdGUgZXJyb3IgYnkgSUlPIGFjY2VzcwotCQkJCQkgKiBlLmcuIFdJTlYgdG8gYSBSZWFkIG9ubHkgbGluZS4KLQkJCQkJICovCi0jZGVmaW5lCUlJT19JQ1JCX0VDT0RFX0FFUlIJMwkvKiBBY2Nlc3MgZXJyb3IgY2F1c2VkIGJ5IElJTyBhY2Nlc3MgKi8KLSNkZWZpbmUJSUlPX0lDUkJfRUNPREVfUFdFUlIJNAkvKiBFcnJvciBvbiBwYXJ0aWFsIHdyaXRlCSovCi0jZGVmaW5lCUlJT19JQ1JCX0VDT0RFX1BSRVJSCTUJLyogRXJyb3Igb24gcGFydGlhbCByZWFkCSovCi0jZGVmaW5lCUlJT19JQ1JCX0VDT0RFX1RPVVQJNgkvKiBDUkIgdGltZW91dCBiZWZvcmUgZGVhbGxvY2F0aW5nICovCi0jZGVmaW5lCUlJT19JQ1JCX0VDT0RFX1hURVJSCTcJLyogSW5jb21pbmcgeHRhbGsgcGt0IGhhZCBlcnJvciBiaXQgKi8KLQotCi0KLS8qCi0gKiBGaWVsZHMgaW4gQ1JCIFJlZ2lzdGVyIEIKLSAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KLXR5cGVkZWYgdW5pb24gaWNyYmJfdSB7Ci0JdTY0CXJlZ192YWx1ZTsKLQlzdHJ1Y3QgewotCSAgICB1NjQJcnN2ZDE6CTUsCi0JCWJ0ZW51bToJMSwJLyogQlRFIHRvIHdoaWNoIGVudHJ5IGJlbG9uZ3MgdG8gKi8KLQkJY29odHJhbnM6IDEsCS8qIENvaGVyZW50IHRyYW5zYWN0aW9uCSovCi0JCXh0c2l6ZToJMiwJLyogWHRhbGsgb3BlcmF0aW9uIHNpemUKLQkJCQkgKiAwOiBEb3VibGUgV29yZAotCQkJCSAqIDE6IDMyIEJ5dGVzLgotCQkJCSAqIDI6IDEyOCBCeXRlcywKLQkJCQkgKiAzOiBSZXNlcnZlZC4KLQkJCQkgKi8KLQkJc3Jjbm9kZTogOSwJLyogU291cmNlIE5vZGUgSUQJCSovCi0JCXNyY2luaXQ6IDIsCS8qIFNvdXJjZSBJbml0aWF0b3I6Ci0JCQkJICogU2VlIGJlbG93IGZvciBmaWVsZCB2YWx1ZXMuCi0JCQkJICovCi0JCXVzZW9sZDoJMSwJLyogVXNlIE9MRCBjb21tYW5kIGZvciBwcm9jZXNzaW5nICovCi0JCWltc2d0eXBlOiAyLAkvKiBJbmNvbWluZyBtZXNzYWdlIHR5cGUKLQkJCQkgKiBzZWUgYmVsb3cgZm9yIGZpZWxkIHZhbHVlcwotCQkJCSAqLwotCQlpbXNnOiAJOCwJLyogSW5jb21pbmcgbWVzc2FnZSAJKi8KLQkJaW5pdGF0b3I6IDMsCS8qIEluaXRpYXRvciBvZiBvcmlnaW5hbCByZXF1ZXN0Ci0JCQkJICogU2VlIGJlbG93IGZvciBmaWVsZCB2YWx1ZXMuCi0JCQkJICovCi0JCXJlcXR5cGU6IDUsCS8qIElkZW50aWZpZXMgdHlwZSBvZiByZXF1ZXN0Ci0JCQkJICogU2VlIGJlbG93IGZvciBmaWVsZCB2YWx1ZXMuCi0JCQkJICovCi0JCXJzdmQyOgk3LAotCQlhY2tjbnQ6CTExLAkvKiBJbnZhbGlkYXRlIGFjayBjb3VudAkqLwotCQlyZXNwOgkxLAkvKiBkYXRhIHJlc3BvbnNlICBnaXZlbiB0byBwcm9jZXNzb3IgKi8KLQkJYWNrOiAJMSwJLyogaW5kaWNhdGVzIGRhdGEgYWNrIHJlY2VpdmVkIAkqLwotCQlob2xkOgkxLAkvKiBlbnRyeSBpcyBnYXRoZXJpbmcgaW52YWwgYWNrcyAqLwotCQl3Yl9wZW5kOjEsCS8qIHdhaXRpbmcgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZSAqLwotCQlpbnR2bjogCTEsCS8qIEludGVydmVudGlvbiAqLwotCQlzdGFsbF9pYjogMSwJLyogU3RhbGwgSWJ1ZiAoZnJvbSBjcm9zc3RhbGspICovCi0JCXN0YWxsX2ludHI6IDE7CS8qIFN0YWxsIGludGVybmFsIGludGVycnVwdHMgKi8KLQl9IGljcmJiX2ZpZWxkX3M7Ci19IGljcmJiX3Q7Ci0KLS8qIFRoaXMgaXMgYW4gYWx0ZXJuYXRlIHR5cGVkZWYgZm9yIHRoZSBIVUIxIENSQiBCIGluIG9yZGVyIHRvIGFsbG93Ci0gICBydW50aW1lIHNlbGVjdGlvbiBvZiB0aGUgZm9ybWF0IGJhc2VkIG9uIHRoZSBSRVZfSUQgZmllbGQgb2YgdGhlCi0gICBOSV9TVEFUVVNfUkVWX0lEIHJlZ2lzdGVyLiAqLwotdHlwZWRlZiB1bmlvbiBoMV9pY3JiYl91IHsKLQl1NjQJcmVnX3ZhbHVlOwotCXN0cnVjdCB7Ci0JCXU2NAlyc3ZkMToJNSwKLQkJCWJ0ZW51bToJMSwJLyogQlRFIHRvIHdoaWNoIGVudHJ5IGJlbG9uZ3MgdG8gKi8KLQkJCWNvaHRyYW5zOiAxLAkvKiBDb2hlcmVudCB0cmFuc2FjdGlvbgkqLwotCQkJeHRzaXplOgkyLAkvKiBYdGFsayBvcGVyYXRpb24gc2l6ZQotCQkJCQkgKiAwOiBEb3VibGUgV29yZAotCQkJCQkgKiAxOiAzMiBCeXRlcy4KLQkJCQkJICogMjogMTI4IEJ5dGVzLAotCQkJCQkgKiAzOiBSZXNlcnZlZC4KLQkJCQkJICovCi0JCQlzcmNub2RlOiA5LAkvKiBTb3VyY2UgTm9kZSBJRAkJKi8KLQkJCXNyY2luaXQ6IDIsCS8qIFNvdXJjZSBJbml0aWF0b3I6Ci0JCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgotCQkJCQkgKi8KLQkJCXVzZW9sZDoJMSwJLyogVXNlIE9MRCBjb21tYW5kIGZvciBwcm9jZXNzaW5nICovCi0JCQlpbXNndHlwZTogMiwJLyogSW5jb21pbmcgbWVzc2FnZSB0eXBlCi0JCQkJCSAqIHNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzCi0JCQkJCSAqLwotCQkJaW1zZzogCTgsCS8qIEluY29taW5nIG1lc3NhZ2UgCSovCi0JCQlpbml0YXRvcjogMywJLyogSW5pdGlhdG9yIG9mIG9yaWdpbmFsIHJlcXVlc3QKLQkJCQkJICogU2VlIGJlbG93IGZvciBmaWVsZCB2YWx1ZXMuCi0JCQkJCSAqLwotCQkJcnN2ZDI6IAkxLAotCQkJcGNhY2hlOiAxLAkvKiBlbnRyeSBiZWxvbmdzIHRvIHBhcnRpYWwgY2FjaGUgKi8KLQkJCXJlcXR5cGU6IDUsCS8qIElkZW50aWZpZXMgdHlwZSBvZiByZXF1ZXN0Ci0JCQkJCSAqIFNlZSBiZWxvdyBmb3IgZmllbGQgdmFsdWVzLgotCQkJCQkgKi8KLQkJCXN0bF9pYjoJMSwJLyogc3RhbGwgSWJ1cyBjb21pbmcgZnJvbSB4dGFsawkqLwotCQkJc3RsX2ludHI6IDEsCS8qIFN0YWxsIGludGVybmFsIGludGVycnVwdHMgKi8KLQkJCXN0bF9idGUwOiAxLAkvKiBTdGFsbCBCVEUgMCAJKi8KLQkJCXN0bF9idGUxOiAxLAkvKiBTdGFsbCBCVEUgMQkqLwotCQkJaW50cnZuOgkxLAkvKiBSZXEgd2FzIHRhcmdldCBvZiBpbnRlcnZlbnRpb24gKi8KLQkJCWFja2NudDoJMTEsCS8qIEludmFsaWRhdGUgYWNrIGNvdW50CSovCi0JCQlyZXNwOgkxLAkvKiBkYXRhIHJlc3BvbnNlICBnaXZlbiB0byBwcm9jZXNzb3IgKi8KLQkJCWFjazogCTEsCS8qIGluZGljYXRlcyBkYXRhIGFjayByZWNlaXZlZCAJKi8KLQkJCWhvbGQ6CTEsCS8qIGVudHJ5IGlzIGdhdGhlcmluZyBpbnZhbCBhY2tzICovCi0JCQl3Yl9wZW5kOjEsCS8qIHdhaXRpbmcgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZSAqLwotCQkJc2xlZXA6IAkxLAkvKiB4dGFsayByZXEgc2xlZXBpbmcgdGlsbCBJTy1zeW5jICovCi0JCQlwbmRfcmVwbHk6IDEsCS8qIHJlcGxpZXMgbm90IGlzc2VkIGR1ZSB0byBJT1EgZnVsbCAqLwotCQkJcG5kX3JlcTogMTsJLyogcmVxcyBub3QgaXNzdWVkIGR1ZSB0byBJT1EgZnVsbCAqLwotCX0gaDFfaWNyYmJfZmllbGRfczsKLX0gaDFfaWNyYmJfdDsKLQotCi0jZGVmaW5lCWJfaW1zZ3R5cGUJaWNyYmJfZmllbGRfcy5pbXNndHlwZQotI2RlZmluZQliX2J0ZW51bQlpY3JiYl9maWVsZF9zLmJ0ZW51bQotI2RlZmluZQliX2NvaHRyYW5zCWljcmJiX2ZpZWxkX3MuY29odHJhbnMKLSNkZWZpbmUJYl94dHNpemUJaWNyYmJfZmllbGRfcy54dHNpemUKLSNkZWZpbmUJYl9zcmNub2RlCWljcmJiX2ZpZWxkX3Muc3Jjbm9kZQotI2RlZmluZQliX3NyY2luaXQJaWNyYmJfZmllbGRfcy5zcmNpbml0Ci0jZGVmaW5lCWJfaW1zZ3R5cGUJaWNyYmJfZmllbGRfcy5pbXNndHlwZQotI2RlZmluZQliX2ltc2cJCWljcmJiX2ZpZWxkX3MuaW1zZwotI2RlZmluZQliX2luaXRpYXRvcglpY3JiYl9maWVsZF9zLmluaXRpYXRvcgotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogdmFsdWVzIGZvciBmaWVsZCB4dHNpemUKLSAqLwotI2RlZmluZQlJSU9fSUNSQl9YVFNJWkVfRFcJMAkvKiBYdGFsayBvcGVyYXRpb24gc2l6ZSBpcyA4IGJ5dGVzICAqLwotI2RlZmluZQlJSU9fSUNSQl9YVFNJWkVfMzIJMQkvKiBYdGFsayBvcGVyYXRpb24gc2l6ZSBpcyAzMiBieXRlcyAqLwotI2RlZmluZQlJSU9fSUNSQl9YVFNJWkVfMTI4CTIJLyogWHRhbGsgb3BlcmF0aW9uIHNpemUgaXMgMTI4IGJ5dGVzICovCi0KLS8qCi0gKiB2YWx1ZXMgZm9yIGZpZWxkIHNyY2luaXQKLSAqLwotI2RlZmluZQlJSU9fSUNSQl9QUk9DMAkJMAkvKiBTb3VyY2Ugb2YgcmVxdWVzdCBpcyBQcm9jIDAgKi8KLSNkZWZpbmUJSUlPX0lDUkJfUFJPQzEJCTEJLyogU291cmNlIG9mIHJlcXVlc3QgaXMgUHJvYyAxICovCi0jZGVmaW5lCUlJT19JQ1JCX0dCX1JFUQkJMgkvKiBTb3VyY2UgaXMgR3VyYW50ZWVkIEJXIHJlcXVlc3QgKi8KLSNkZWZpbmUJSUlPX0lDUkJfSU9fUkVRCQkzCS8qIFNvdXJjZSBpcyBOb3JtYWwgSU8gcmVxdWVzdAkqLwotCi0vKgotICogVmFsdWVzIGZvciBmaWVsZCBpbXNndHlwZQotICovCi0jZGVmaW5lCUlJT19JQ1JCX0lNU0dUX1hUQUxLCTAJLyogSW5jb21pbmcgTWVlc3NhZ2UgZnJvbSBYdGFsawkqLwotI2RlZmluZQlJSU9fSUNSQl9JTVNHVF9CVEUJMQkvKiBJbmNvbWluZyBtZXNzYWdlIGZyb20gQlRFIAkqLwotI2RlZmluZQlJSU9fSUNSQl9JTVNHVF9TTjBORVQJMgkvKiBJbmNvbWluZyBtZXNzYWdlIGZyb20gU04wIG5ldCAqLwotI2RlZmluZQlJSU9fSUNSQl9JTVNHVF9DUkIJMwkvKiBJbmNvbWluZyBtZXNzYWdlIGZyb20gQ1JCID8/PyAgKi8KLQotLyoKLSAqIHZhbHVlcyBmb3IgZmllbGQgaW5pdGlhdG9yLgotICovCi0jZGVmaW5lCUlJT19JQ1JCX0lOSVRfWFRBTEsJMAkvKiBNZXNzYWdlIG9yaWdpbmF0ZWQgaW4geHRhbGsJKi8KLSNkZWZpbmUJSUlPX0lDUkJfSU5JVF9CVEUwCTB4MQkvKiBNZXNzYWdlIG9yaWdpbmF0ZWQgaW4gQlRFIDAJKi8KLSNkZWZpbmUJSUlPX0lDUkJfSU5JVF9TTjBORVQJMHgyCS8qIE1lc3NhZ2Ugb3JpZ2luYXRlZCBpbiBTTjBuZXQgKi8KLSNkZWZpbmUJSUlPX0lDUkJfSU5JVF9DUkIJMHgzCS8qIE1lc3NhZ2Ugb3JpZ2luYXRlZCBpbiBDUkIgPyAJKi8KLSNkZWZpbmUJSUlPX0lDUkJfSU5JVF9CVEUxCTB4NQkvKiBNRXNzYWdlIG9yaWdpbmF0ZWQgaW4gQlRFIDEJKi8KLQotLyoKLSAqIFZhbHVlcyBmb3IgZmllbGQgcmVxdHlwZS4KLSAqLwotLyogWFhYIC0gTmVlZCB0byBmaXggdGhpcyBmb3IgSHViIDIgKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX0RXUkQJMAkvKiBSZXF1ZXN0IHR5cGUgZG91YmxlIHdvcmQJKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX1FDTFJECTEJLyogUmVxdWVzdCBpcyBRcnRyIENhY2VoIGxpbmUgUmQgKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX0JMS1JECTIJLyogUmVxdWVzdCBpcyBibG9jayByZWFkCSovCi0jZGVmaW5lCUlJT19JQ1JCX1JFUV9SU0hVCTYJLyogUmVxdWVzdCBpcyBCVEUgYmxvY2sgcmVhZAkqLwotI2RlZmluZQlJSU9fSUNSQl9SRVFfUkVYVQk3CS8qIHJlcXVlc3QgaXMgQlRFIEV4Y2wgUmVhZAkqLwotI2RlZmluZQlJSU9fSUNSQl9SRVFfUkRFWAk4CS8qIFJlcXVlc3QgaXMgUmVhZCBFeGNsdXNpdmUJKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX1dJTkMJOQkvKiBSZXF1ZXN0IGlzIFdyaXRlIEludmFsaWRhdGUgCSovCi0jZGVmaW5lCUlJT19JQ1JCX1JFUV9CV0lOVgkxMAkvKiBSZXF1ZXN0IGlzIEJURSBXaW52CQkqLwotI2RlZmluZQlJSU9fSUNSQl9SRVFfUElPUkQJMTEJLyogUmVxdWVzdCBpcyBQSU8gcmVhZAkJKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX1BJT1dSCTEyCS8qIFJlcXVlc3QgaXMgUElPIFdyaXRlIAkqLwotI2RlZmluZQlJSU9fSUNSQl9SRVFfUFJETQkxMwkvKiBSZXF1ZXN0IGlzIEZldGNoJk9wCQkqLwotI2RlZmluZQlJSU9fSUNSQl9SRVFfUFdSTQkxNAkvKiBSZXF1ZXN0IGlzIFN0b3JlICZPcAkJKi8KLSNkZWZpbmUJSUlPX0lDUkJfUkVRX1BUUFdSCTE1CS8qIFJlcXVlc3QgaXMgUGVlciB0byBwZWVyCSovCi0jZGVmaW5lCUlJT19JQ1JCX1JFUV9XQgkJMTYJLyogUmVxdWVzdCBpcyBXcml0ZSBiYWNrCSovCi0jZGVmaW5lCUlJT19JQ1JCX1JFUV9ERVgJMTcJLyogUmV0YWluZWQgREVYIENhY2hlIGxpbmUJKi8KLQotLyoKLSAqIEZpZWxkcyBpbiBDUkIgUmVnaXN0ZXIgQwotICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLXR5cGVkZWYgdW5pb24gaWNyYmNfcyB7Ci0JdTY0CXJlZ192YWx1ZTsKLQlzdHJ1Y3QgewotCQl1NjQJcnN2ZDoJNiwKLQkJCXNsZWVwOgkxLAotCQkJcHJpY250OiA0LAkvKiBQcmlvcml0eSBjb3VudCBzZW50IHdpdGggUmVhZCByZXEgKi8KLQkJCXByaXBzYzogNCwJLyogUHJpb3JpdHkgUHJlIHNjYWxhciAJKi8KLQkJCWJ0ZW9wOgkxLAkvKiBCVEUgT3BlcmF0aW9uIAkqLwotCQkJcHVzaF9iZTogMzQsCS8qIFB1c2ggYWRkcmVzcyBCeXRlIGVuYWJsZQotCQkJCQkgKiBIb2xkcyBwdXNoIGFkZHIsIGlmIENSQiBpcyBmb3IgQlRFCi0JCQkJCSAqIElmIENSQiBiZWxvbmdzIHRvIFBhcnRpYWwgY2FjaGUsCi0JCQkJCSAqIHRoaXMgY29udGFpbnMgYnl0ZSBlbmFibGVzIGJpdHMKLQkJCQkJICogKFs0Nzo0Nl0gPSAwKQotCQkJCQkgKi8KLQkJCXN1cHBsOgkxMSwJLyogU3VwcGxlbWVudGFsIGZpZWxkCSovCi0JCQliYXJyb3A6IDEsCS8qIEJhcnJpZXIgT3AgYml0IHNldCBpbiB4dGFsayByZXEgKi8KLQkJCWRvcmVzcDogMSwJLyogWHRhbGsgcmVxIG5lZWRzIGEgcmVzcG9uc2UgCSovCi0JCQlnYnI6CTE7CS8qIEdCUiBiaXQgc2V0IGluIHh0YWxrIHBhY2tldCAJKi8KLQl9IGljcmJjX2ZpZWxkX3M7Ci19IGljcmJjX3Q7Ci0KLSNkZWZpbmUJY19wcmljbnQJaWNyYmNfZmllbGRfcy5wcmljbnQKLSNkZWZpbmUJY19wcmlwc2MJaWNyYmNfZmllbGRfcy5wcmlwc2MKLSNkZWZpbmUJY19idGVvcAkJaWNyYmNfZmllbGRfcy5idGVvcAotI2RlZmluZQljX2J0ZWFkZHIJaWNyYmNfZmllbGRfcy5wdXNoX2JlCS8qIHB1c2hfYmUgZmllbGQgaGFzIDIgbmFtZXMgKi8KLSNkZWZpbmUgY19iZW5hYmxlIAlpY3JiY19maWVsZF9zLnB1c2hfYmUJLyogcHVzaF9iZSBmaWVsZCBoYXMgMiBuYW1lcyAqLwotI2RlZmluZQljX3N1cHBsCQlpY3JiY19maWVsZF9zLnN1cHBsCi0jZGVmaW5lCWNfYmFycm9wCWljcmJjX2ZpZWxkX3MuYmFycm9wCi0jZGVmaW5lCWNfZG9yZXNwCWljcmJjX2ZpZWxkX3MuZG9yZXNwCi0jZGVmaW5lCWNfZ2JyCWljcmJjX2ZpZWxkX3MuZ2JyCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogRmllbGRzIGluIENSQiBSZWdpc3RlciBECi0gKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLXR5cGVkZWYgdW5pb24gaWNyYmRfcyB7Ci0JdTY0CXJlZ192YWx1ZTsKLQlzdHJ1Y3QgewotCSAgICB1NjQJcnN2ZDoJMzgsCi0JCXRvdXR2bGQ6IDEsCS8qIFRpbWVvdXQgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgQ1JCICovCi0JCWN0eHR2bGQ6IDEsCS8qIENvbnRleHQgZmllbGQgYmVsb3cgaXMgdmFsaWQJKi8KLQkJcnN2ZDI6CTEsCi0JCWNvbnRleHQ6IDE1LCAJLyogQml0IHZlY3RvcjoKLQkJCQkgKiBIYXMgYSBiaXQgc2V0IGZvciBlYWNoIENSQiBlbnRyeQotCQkJCSAqIHdoaWNoIG5lZWRzIHRvIGJlIGRlYWxsb2NhdGVkCi0JCQkJICogYmVmb3JlIHRoaXMgQ1JCIGVudHJ5IGlzIHByb2Nlc3NlZC4KLQkJCQkgKiBTZXQgb25seSBmb3IgYmFycmllciBvcGVyYXRpb25zLgotCQkJCSAqLwotCQl0aW1lb3V0OiA4OwkvKiBUaW1lb3V0IFVwcGVyIDggYml0cwkqLwotCX0gaWNyYmRfZmllbGRfczsKLX0gaWNyYmRfdDsKLQotI2RlZmluZQlpY3JiZF90b3V0dmxkCWljcmJkX2ZpZWxkX3MudG91dHZsZAotI2RlZmluZQlpY3JiZF9jdHh0dmxkCWljcmJkX2ZpZWxkX3MuY3R4dHZsZAotI2RlZmluZQlpY3JiZF9jb250ZXh0CWljcmJkX2ZpZWxkX3MuY29udGV4dAotCi0KLXR5cGVkZWYgdW5pb24gaHViaWlfaWZkcl91IHsKLQl1NjQJaGlfaWZkcl92YWx1ZTsKLQlzdHJ1Y3QgewotCQl1NjQJaWZkcl9yc3ZkOgk0OSwKLQkgICAgICAgICAgICAgICAgaWZkcl9tYXhycDoJIDcsCi0JICAgICAgICAgICAgICAgIGlmZHJfcnN2ZDE6CSAxLAotICAgICAgICAgICAgICAgICAgICAgIAlpZmRyX21heHJxOgkgNzsKLQl9IGhpX2lmZHJfZmllbGRzOwotfSBodWJpaV9pZmRyX3Q7Ci0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLS8qCi0gKiBIYXJkd2FyZSBkZXNpZ25lZCBuYW1lcyBmb3IgdGhlIEJURSBjb250cm9sIHJlZ2lzdGVycy4KLSAqLwotI2RlZmluZSBJSU9fSUJMU18wCTB4NDEwMDAwCS8qIEJURSBsZW5ndGgvc3RhdHVzIDAgKi8KLSNkZWZpbmUgSUlPX0lCU0FfMAkweDQxMDAwOAkvKiBCVEUgc291cmNlIGFkZHJlc3MgMCAqLwotI2RlZmluZSBJSU9fSUJEQV8wCTB4NDEwMDEwCS8qIEJURSBkZXN0aW5hdGlvbiBhZGRyZXNzIDAgKi8KLSNkZWZpbmUgSUlPX0lCQ1RfMAkweDQxMDAxOAkvKiBCVEUgY29udHJvbC90ZXJtaW5hdGUgMCAqLwotI2RlZmluZSBJSU9fSUJOQV8wCTB4NDEwMDIwCS8qIEJURSBub3RpZmljYXRpb24gYWRkcmVzcyAwICovCi0jZGVmaW5lIElJT19JQk5SXzAJSUlPX0lCTkFfMAotI2RlZmluZSBJSU9fSUJJQV8wCTB4NDEwMDI4CS8qIEJURSBpbnRlcnJ1cHQgYWRkcmVzcyAwICovCi0KLSNkZWZpbmUgSUlPX0lCTFNfMQkweDQyMDAwMAkvKiBCVEUgbGVuZ3RoL3N0YXR1cyAxICovCi0jZGVmaW5lIElJT19JQlNBXzEJMHg0MjAwMDgJLyogQlRFIHNvdXJjZSBhZGRyZXNzIDEgKi8KLSNkZWZpbmUgSUlPX0lCREFfMQkweDQyMDAxMAkvKiBCVEUgZGVzdGluYXRpb24gYWRkcmVzcyAxICovCi0jZGVmaW5lIElJT19JQkNUXzEJMHg0MjAwMTgJLyogQlRFIGNvbnRyb2wvdGVybWluYXRlIDEgKi8KLSNkZWZpbmUgSUlPX0lCTkFfMQkweDQyMDAyMAkvKiBCVEUgbm90aWZpY2F0aW9uIGFkZHJlc3MgMSAqLwotI2RlZmluZSBJSU9fSUJOUl8xCUlJT19JQk5BXzEKLSNkZWZpbmUgSUlPX0lCSUFfMQkweDQyMDAyOAkvKiBCVEUgaW50ZXJydXB0IGFkZHJlc3MgMSAqLwotCi0vKgotICogTW9yZSBtaXNjZWxsYW5lb3VzIHJlZ2lzdGVycwotICovCi0jZGVmaW5lIElJT19JUENSCTB4NDMwMDAwCS8qIFBlcmZvcm1hbmNlIENvbnRyb2wgKi8KLSNkZWZpbmUgSUlPX0lQUFIJMHg0MzAwMDgJLyogUGVyZm9ybWFuY2UgUHJvZmlsaW5nICovCi0KLS8qCi0gKiBJTyBFcnJvciBDbGVhciByZWdpc3RlciBiaXQgZmllbGQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBJRUNMUl9CVEUxCQkoMSA8PCAxOCkgIC8qIGNsZWFyIGJ0ZSBlcnJvciAxID8/PyAqLwotI2RlZmluZSBJRUNMUl9CVEUwCQkoMSA8PCAxNykgIC8qIGNsZWFyIGJ0ZSBlcnJvciAwID8/PyAqLwotI2RlZmluZSBJRUNMUl9DUkFaWQkJKDEgPDwgMTYpICAvKiBjbGVhciBjcmF6eSBiaXQgaW4gd3N0YXQgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9GCQkoMSA8PCAxNSkgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0YgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9FCQkoMSA8PCAxNCkgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0UgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9ECQkoMSA8PCAxMykgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0QgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9DCQkoMSA8PCAxMikgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0MgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9CCQkoMSA8PCAxMSkgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0IgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl9BCQkoMSA8PCAxMCkgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCX0EgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl85CQkoMSA8PCA5KSAgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCXzkgcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl84CQkoMSA8PCA4KSAgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCXzggcmVnICovCi0jZGVmaW5lIElFQ0xSX1BSQl8wCQkoMSA8PCAwKSAgIC8qIGNsZWFyIGVyciBiaXQgaW4gUFJCXzAgcmVnICovCi0KLS8qCi0gKiBJTyBQSU8gUmVhZCBUYWJsZSBFbnRyeSBmb3JtYXQKLSAqLwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi10eXBlZGVmIHVuaW9uIGlwcnRlX2EgewotCXU2NAllbnRyeTsKLQlzdHJ1Y3QgewotCSAgICB1NjQJcnN2ZDEgICAgIDogNywgIC8qIFJlc2VydmVkIGZpZWxkIAkJKi8KLQkJdmFsaWQgICAgIDogMSwJLyogTWFwcyB0byBhIHRpbWVvdXQgZW50cnkJKi8KLQkJcnN2ZDIgICAgIDogMSwKLQkJc3Jjbm9kZSAgIDogOSwJLyogTm9kZSB3aGljaCBkaWQgdGhpcyBQSU8JKi8KLQkJaW5pdGlhdG9yIDogMiwJLyogSWYgVDVBIG9yIFQ1QiBvciBJTyAJCSovCi0JCXJzdmQzICAgICA6IDMsCi0JCWFkZHIgICAgICA6IDM4LAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIFBJTwkqLwotCQlyc3ZkNCAgICAgOiAzOwotCX0gaXBydGVfZmllbGRzOwotfSBpcHJ0ZV9hX3Q7Ci0KLSNkZWZpbmUJaXBydGVfdmFsaWQJaXBydGVfZmllbGRzLnZhbGlkCi0jZGVmaW5lCWlwcnRlX3RpbWVvdXQJaXBydGVfZmllbGRzLnRpbWVvdXQKLSNkZWZpbmUJaXBydGVfc3Jjbm9kZQlpcHJ0ZV9maWVsZHMuc3Jjbm9kZQotI2RlZmluZQlpcHJ0ZV9pbml0CWlwcnRlX2ZpZWxkcy5pbml0aWF0b3IKLSNkZWZpbmUJaXBydGVfYWRkcglpcHJ0ZV9maWVsZHMuYWRkcgotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0jZGVmaW5lCUlQUlRFX0FERFJTSEZUCTMKLQotLyoKLSAqIEh1YiBJSU8gUFJCIFJlZ2lzdGVyIGZvcm1hdC4KLSAqLwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotLyoKLSAqIE5vdGU6IEZpZWxkcyBibmFrY3RyLCBhbmFrY3RyLCB4dGFsa2N0cm1vZGUsIG92ZmxvdyBmaWVsZHMgYXJlCi0gKiAiU3RhdHVzIiBmaWVsZHMsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2Ugb2YgY2xlYW4gdXAgYWZ0ZXIgZXJyb3JzLgotICovCi0KLXR5cGVkZWYgdW5pb24gaXByYl91IHsKLQl1NjQJcmVnX3ZhbHVlOwotCXN0cnVjdCB7Ci0JICAgIHU2NAlyc3ZkMToJMTUsCi0JCWVycm9yOgkxLAkvKiBXaWRnZXQgcmN2ZCB3ciByZXNwIHBrdCB3LyBlcnJvciAqLwotCQlvdmZsb3c6CTUsCS8qIE92ZXIgZmxvdyBjb3VudC4gcGVyZiBtZWFzdXJlbWVudCAqLwotCQlmaXJlX2FuZF9mb3JnZXQ6IDEsIC8qIExhdW5jaCBXcml0ZSB3aXRob3V0IHJlc3BvbnNlICovCi0JCW1vZGU6CTIsCS8qIFdpZGdldCBvcGVyYXRpb24gTW9kZQkqLwotCQlyc3ZkMjoJMiwKLQkJYm5ha2N0cjogMTQsCi0JCXJzdmQzOiAJMiwKLQkJYW5ha2N0cjogMTQsCi0JCXh0YWxrY3RyOiA4OwotCX0gaXByYl9maWVsZHNfczsKLX0gaXByYl90OwotCi0jZGVmaW5lIGlwcmJfcmVndmFsCXJlZ192YWx1ZQotCi0jZGVmaW5lCWlwcmJfZXJyb3IJaXByYl9maWVsZHNfcy5lcnJvcgotI2RlZmluZQlpcHJiX292ZmxvdwlpcHJiX2ZpZWxkc19zLm92ZmxvdwotI2RlZmluZQlpcHJiX2ZmCQlpcHJiX2ZpZWxkc19zLmZpcmVfYW5kX2ZvcmdldAotI2RlZmluZQlpcHJiX21vZGUJaXByYl9maWVsZHNfcy5tb2RlCi0jZGVmaW5lCWlwcmJfYm5ha2N0cglpcHJiX2ZpZWxkc19zLmJuYWtjdHIKLSNkZWZpbmUJaXByYl9hbmFrY3RyCWlwcmJfZmllbGRzX3MuYW5ha2N0cgotI2RlZmluZQlpcHJiX3h0YWxrY3RyCWlwcmJfZmllbGRzX3MueHRhbGtjdHIKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotLyoKLSAqIHZhbHVlcyBmb3IgbW9kZSBmaWVsZCBpbiBpcHJiX3QuCi0gKiBGb3IgZGV0YWlscyBvZiB0aGUgbWVhbmluZ3Mgb2YgTkFLIGFuZCBBY2NlcHQsIHJlZmVyIHRoZSBQSU8gZmxvdwotICogZG9jdW1lbnQKLSAqLwotI2RlZmluZQlJUFJCX01PREVfTk9STUFMCSgwKQotI2RlZmluZQlJUFJCX01PREVfQ09MTEVDVF9BCSgxKQkvKiBQUkIgaW4gY29sbGVjdCBBIG1vZGUgKi8KLSNkZWZpbmUJSVBSQl9NT0RFX1NFUlZJQ0VfQQkoMikJLyogTkFLIEIgYW5kIEFjY2VwdCBBICovCi0jZGVmaW5lCUlQUkJfTU9ERV9TRVJWSUNFX0IJKDMpCS8qIE5BSyBBIGFuZCBBY2NlcHQgQiAqLwotCi0vKgotICogSU8gQ1JCIGVudHJ5IENfQSB0byBFX0EgOiBQYXJ0aWFsIChjYWNoZSkgQ1JCUwotICovCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotdHlwZWRlZiB1bmlvbiBpY3JicF9hIHsKLQl1NjQgICBpcF9yZWc7CSAgICAvKiB0aGUgZW50aXJlIHJlZ2lzdGVyIHZhbHVlCSovCi0Jc3RydWN0IHsKLQkgICAgIHU2NCBlcnJvcjoJMSwgIC8qICAgIDYzLCBlcnJvciBvY2N1cnJlZAkJKi8KLQkJbG5fdWNlOgkxLCAgLyogICAgNjI6IHVuY29ycmVjdGFibGUgbWVtb3J5IAkqLwotCQlsbl9hZToJMSwgIC8qICAgIDYxOiBwcm90ZWN0aW9uIHZpb2xhdGlvbiAJKi8KLQkJbG5fd2VycjoxLCAgLyogICAgNjA6IHdyaXRlIGFjY2VzcyBlcnJvciAJKi8KLQkJbG5fYWVycjoxLCAgLyogICAgNTk6IHNuMG5ldDogQWRkcmVzcyBlcnJvcgkqLwotCQlsbl9wZXJyOjEsICAvKiAgICA1ODogc24wbmV0OiBwb2lzb24gZXJyb3IJKi8KLQkJdGltZW91dDoxLCAgLyogICAgNTc6IENSQiB0aW1lZCBvdXQJCSovCi0JCWxfYmRwa3Q6MSwgIC8qICAgIDU2OiB0cnVuY2F0ZWQgcGt0IG9uIHNuMG5ldAkqLwotCQljX2JkcGt0OjEsICAvKiAgICA1NTogdHJ1bmNhdGVkIHBrdCBvbiB4dGFsawkqLwotCQljX2VycjoJMSwgIC8qICAgIDU0OiBpbmNvbWluZyB4dGFsayByZXEsIGVyciBzZXQqLwotCQlyc3ZkMTogMTIsICAvKiA1My00MjogcmVzZXJ2ZWQJCQkqLwotCQl2YWxpZDoJMSwgIC8qICAgIDQxOiBWYWxpZCBzdGF0dXMJCSovCi0JCXNpZG46CTQsICAvKiA0MC0zNzogU0lETiBmaWVsZCBvZiB4dGFsayBycXN0CSovCi0JCXRudW06CTUsICAvKiAzNi0zMjogVE5VTSBvZiB4dGFsayByZXF1ZXN0CSovCi0JCWJvOgkxLCAgLyogICAgMzE6IGJhcnJpZXIgb3Agc2V0IGluIHh0YWxrIHJxc3QqLwotCQlyZXNwcnFkOjEsICAvKiAgICAzMDogeHRhbGsgcnFzdCByZXF1aXJlcyByZXNwb25zZSovCi0JCWdicjoJMSwgIC8qICAgIDI5OiBnYnIgYml0IHNldCBpbiB4dGFsayBycXN0CSovCi0JCXNpemU6CTIsICAvKiAyOC0yNzogc2l6ZSBvZiB4dGFsayByZXF1ZXN0CSovCi0JCWV4Y2w6CTQsICAvKiAyNi0yMzogZXhjbHVzaXZlIGJpdChzKQkJKi8KLQkJc3RhbGw6CTMsICAvKiAyMi0yMDogc3RhbGwgKHh0YWxrLCBidGUgMC8xKQkqLwotCQlpbnR2bjoJMSwgIC8qICAgIDE5OiBycXN0IHRhcmdldCBvZiBpbnRlcnZlbnRpb24qLwotCQlyZXNwOgkxLCAgLyogICAgMTg6IERhdGEgcmVzcG9uc2UgZ2l2ZW4gdG8gdDUJKi8KLQkJYWNrOgkxLCAgLyogICAgMTc6IERhdGEgYWNrIHJlY2VpdmVkLgkqLwotCQlob2xkOgkxLCAgLyogICAgMTY6IGNyYiBnYXRoZXJpbmcgaW52YWxpZGF0ZSBhY2tzKi8KLQkJd2I6CTEsICAvKiAgICAxNTogd3JpdGViYWNrIHBlbmRpbmcuCSovCi0JCWFja19jbnQ6MTEsIC8qIDE0LTA0OiBjb3VudGVyIG9mIGludmFsaWRhdGUgYWNrcyovCi0JCXRzY2FsZXI6NDsgIC8qIDAzLTAwOiBUaW1lb3V0IHByZXNjYWxlcgkJKi8KLQl9IGlwX2ZtdDsKLX0gaWNyYnBfYV90OwotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogQSBjb3VwbGUgb2YgZGVmaW5lcyB0byBnbyB3aXRoIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCi0gKi8KLSNkZWZpbmUgSUNSQlBfQV9DRVJSX1NIRlQJNTQKLSNkZWZpbmUgSUNSQlBfQV9FUlJfTUFTSwkweDNmZgotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotdHlwZWRlZiB1bmlvbiBodWJpaV9pZHNyIHsKLQl1NjQgaWluX3JlZzsKLQlzdHJ1Y3QgewotCQl1NjQgcnN2ZDEgOiAzNSwKLQkgICAgICAgICAgICBpc2VudCA6IDEsCi0JICAgICAgICAgICAgcnN2ZDIgOiAzLAotCSAgICAgICAgICAgIGllbmFibGU6IDEsCi0JICAgICAgICAgICAgcnN2ZCAgOiA3LAotCSAgICAgICAgICAgIG5vZGUgIDogOSwKLQkgICAgICAgICAgICByc3ZkNCA6IDEsCi0JICAgICAgICAgICAgbGV2ZWwgOiA3OwotCX0gaWluX2ZtdDsKLX0gaHViaWlfaWRzcl90OwotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotLyoKLSAqIElPIEJURSBMZW5ndGgvU3RhdHVzIChJSU9fSUJMUykgcmVnaXN0ZXIgYml0IGZpZWxkIGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgSUJMU19CVVNZCQkoMHgxIDw8IDIwKQotI2RlZmluZSBJQkxTX0VSUk9SX1NIRlQJCTE2Ci0jZGVmaW5lIElCTFNfRVJST1IJCSgweDEgPDwgSUJMU19FUlJPUl9TSEZUKQotI2RlZmluZSBJQkxTX0xFTkdUSF9NQVNLCTB4ZmZmZgotCi0vKgotICogSU8gQlRFIENvbnRyb2wvVGVybWluYXRlIHJlZ2lzdGVyIChJQkNUKSByZWdpc3RlciBiaXQgZmllbGQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBJQkNUX1BPSVNPTgkJKDB4MSA8PCA4KQotI2RlZmluZSBJQkNUX05PVElGWQkJKDB4MSA8PCA0KQotI2RlZmluZSBJQkNUX1pGSUxfTU9ERQkJKDB4MSA8PCAwKQotCi0vKgotICogSU8gQlRFIEludGVycnVwdCBBZGRyZXNzIFJlZ2lzdGVyIChJQklBKSByZWdpc3RlciBiaXQgZmllbGQgZGVmaW5pdGlvbnMKLSAqLwotI2RlZmluZSBJQklBX0xFVkVMX1NIRlQJCTE2Ci0jZGVmaW5lIElCSUFfTEVWRUxfTUFTSwkJKDB4N2YgPDwgSUJJQV9MRVZFTF9TSEZUKQotI2RlZmluZSBJQklBX05PREVfSURfU0hGVAkwCi0jZGVmaW5lIElCSUFfTk9ERV9JRF9NQVNLCSgweDFmZikKLQotLyoKLSAqIE1pc2NlbGxhbmVvdXMgaHViIGNvbnN0YW50cwotICovCi0KLS8qIE51bWJlciBvZiB3aWRnZXRzIHN1cHBvcnRlZCBieSBodWIgKi8KLSNkZWZpbmUgSFVCX05VTV9XSURHRVQJCTkKLSNkZWZpbmUgSFVCX1dJREdFVF9JRF9NSU4JMHg4Ci0jZGVmaW5lIEhVQl9XSURHRVRfSURfTUFYCTB4ZgotCi0jZGVmaW5lIEhVQl9XSURHRVRfUEFSVF9OVU0JMHhjMTAxCi0jZGVmaW5lIE1BWF9IVUJTX1BFUl9YQk9XCTIKLQotLyoKLSAqIEdldCBhIGh1YidzIHdpZGdldCBpZCBmcm9tIHdpZGdldCBjb250cm9sIHJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgSUlPX1dDUl9XSURfR0VUKG5hc2lkKQkoUkVNT1RFX0hVQl9MKG5hc2lkLCBJSUlfV0NSKSAmIDB4ZikKLSNkZWZpbmUgSUlPX1dTVF9FUlJPUl9NQVNLCShVSU5UNjRfQ0FTVCAxIDw8IDMyKSAvKiBXaWRnZXQgc3RhdHVzIGVycm9yICovCi0KLS8qCi0gKiBOdW1iZXIgb2YgY3JlZGl0cyBIdWIgd2lkZ2V0IGhhcyB3aGlsZSBzZW5kaW5nIHJlcS9yZXNwb25zZSB0bwotICogeGJvdy4KLSAqIFZhbHVlIG9mIDMgaXMgcmVxdWlyZWQgYnkgWGJvdyAxLjEKLSAqIFdlIG1heSBiZSBhYmxlIHRvIGluY3JlYXNlIHRoaXMgdG8gNCB3aXRoIFhib3cgMS4yLgotICovCi0jZGVmaW5lICAgICAgIEhVQklJX1hCT1dfQ1JFRElUICAgICAgIDMKLSNkZWZpbmUJICAgICAgSFVCSUlfWEJPV19SRVYyX0NSRURJVCAgNAotCi0jZW5kaWYgLyogX0FTTV9TR0lfU05fU04wX0hVQklPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4OTcwMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMDYgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqLwotI2lmbmRlZiBfQVNNX1NQSU5MT0NLX0gKLSNkZWZpbmUgX0FTTV9TUElOTE9DS19ICi0KLSNpbmNsdWRlIDxhc20vYmFycmllci5oPgotI2luY2x1ZGUgPGFzbS93YXIuaD4KLQotLyoKLSAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKLSAqLwotCi0jZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpICAgICAgICgoeCktPmxvY2sgIT0gMCkKLSNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKLSNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfd2FpdCh4KSBcCi0JZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoKHgpLT5sb2NrKQotCi0vKgotICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncwotICogb24gdGhlIGxvY2FsIHByb2Nlc3Nvciwgb25lIGRvZXMgbm90LgotICoKLSAqIFdlIG1ha2Ugbm8gZmFpcm5lc3MgYXNzdW1wdGlvbnMuICBUaGV5IGhhdmUgYSBjb3N0LgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX2xvY2sJXG4iCi0JCSIxOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCWJuZXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgbGkJJTEsIDEJCQkJCVxuIgotCQkiCXNjCSUxLCAlMAkJCQkJXG4iCi0JCSIJYmVxemwJJTEsIDFiCQkJCQlcbiIKLQkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJOiAiPW0iIChsb2NrLT5sb2NrKSwgIj0mciIgKHRtcCkKLQkJOiAibSIgKGxvY2stPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfc3Bpbl9sb2NrCVxuIgotCQkiMToJbGwJJTEsICUyCQkJCQlcbiIKLQkJIglibmV6CSUxLCAyZgkJCQkJXG4iCi0JCSIJIGxpCSUxLCAxCQkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXoJJTEsIDJmCQkJCQlcbiIKLQkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCi0JCSIyOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCWJuZXoJJTEsIDJiCQkJCQlcbiIKLQkJIgkgbGkJJTEsIDEJCQkJCVxuIgotCQkiCWIJMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJIgkucHJldmlvdXMJCQkJCVxuIgotCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCi0JCTogIj1tIiAobG9jay0+bG9jayksICI9JnIiICh0bXApCi0JCTogIm0iIChsb2NrLT5sb2NrKQotCQk6ICJtZW1vcnkiKTsKLQl9Ci0KLQlzbXBfbGxzY19tYigpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCi17Ci0Jc21wX21iKCk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfc3Bpbl91bmxvY2sJXG4iCi0JIglzdwkkMCwgJTAJCQkJCVxuIgotCSIJLnNldFx0cmVvcmRlcgkJCQkJXG4iCi0JOiAiPW0iIChsb2NrLT5sb2NrKQotCTogIm0iIChsb2NrLT5sb2NrKQotCTogIm1lbW9yeSIpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JdW5zaWduZWQgaW50IHRlbXAsIHJlczsKLQotCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19zcGluX3RyeWxvY2sJXG4iCi0JCSIxOglsbAklMCwgJTMJCQkJCVxuIgotCQkiCW9yaQklMiwgJTAsIDEJCQkJXG4iCi0JCSIJc2MJJTIsICUxCQkJCQlcbiIKLQkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJIglhbmRpCSUyLCAlMCwgMQkJCQlcbiIKLQkJIgkuc2V0CXJlb3JkZXIiCi0JCTogIj0mciIgKHRlbXApLCAiPW0iIChsb2NrLT5sb2NrKSwgIj0mciIgKHJlcykKLQkJOiAibSIgKGxvY2stPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfc3Bpbl90cnlsb2NrCVxuIgotCQkiMToJbGwJJTAsICUzCQkJCQlcbiIKLQkJIglvcmkJJTIsICUwLCAxCQkJCVxuIgotCQkiCXNjCSUyLCAlMQkJCQkJXG4iCi0JCSIJYmVxegklMiwgMmYJCQkJCVxuIgotCQkiCSBhbmRpCSUyLCAlMCwgMQkJCQlcbiIKLQkJIgkuc3Vic2VjdGlvbiAyCQkJCQlcbiIKLQkJIjI6CWIJMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJIgkucHJldmlvdXMJCQkJCVxuIgotCQkiCS5zZXQJcmVvcmRlciIKLQkJOiAiPSZyIiAodGVtcCksICI9bSIgKGxvY2stPmxvY2spLCAiPSZyIiAocmVzKQotCQk6ICJtIiAobG9jay0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfQotCi0Jc21wX2xsc2NfbWIoKTsKLQotCXJldHVybiByZXMgPT0gMDsKLX0KLQotLyoKLSAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzIGJ1dCBvbmx5IG9uZSB3cml0ZXIuCi0gKgotICogTk9URSEgaXQgaXMgcXVpdGUgY29tbW9uIHRvIGhhdmUgcmVhZGVycyBpbiBpbnRlcnJ1cHRzIGJ1dCBubyBpbnRlcnJ1cHQKLSAqIHdyaXRlcnMuIEZvciB0aG9zZSBjaXJjdW1zdGFuY2VzIHdlIGNhbiAibWl4IiBpcnEtc2FmZSBsb2NrcyAtIGFueSB3cml0ZXIKLSAqIG5lZWRzIHRvIGdldCBhIGlycS1zYWZlIHdyaXRlLWxvY2ssIGJ1dCByZWFkZXJzIGNhbiBnZXQgbm9uLWlycXNhZmUKLSAqIHJlYWQtbG9ja3MuCi0gKi8KLQotLyoKLSAqIHJlYWRfY2FuX2xvY2sgLSB3b3VsZCByZWFkX3RyeWxvY2soKSBzdWNjZWVkPwotICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCi0gKi8KLSNkZWZpbmUgX19yYXdfcmVhZF9jYW5fbG9jayhydykJKChydyktPmxvY2sgPj0gMCkKLQotLyoKLSAqIHdyaXRlX2Nhbl9sb2NrIC0gd291bGQgd3JpdGVfdHJ5bG9jaygpIHN1Y2NlZWQ/Ci0gKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KLSAqLwotI2RlZmluZSBfX3Jhd193cml0ZV9jYW5fbG9jayhydykJKCEocncpLT5sb2NrKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF9sb2NrKHJhd19yd2xvY2tfdCAqcncpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX2xvY2sJXG4iCi0JCSIxOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCWJsdHoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCi0JCSIJc2MJJTEsICUwCQkJCQlcbiIKLQkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKLQkJOiAibSIgKHJ3LT5sb2NrKQotCQk6ICJtZW1vcnkiKTsKLQl9IGVsc2UgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3JlYWRfbG9jawlcbiIKLQkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCi0JCSIJYmx0egklMSwgMmYJCQkJCVxuIgotCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCi0JCSIyOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCWJsdHoJJTEsIDJiCQkJCQlcbiIKLQkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCi0JCSIJYgkxYgkJCQkJXG4iCi0JCSIJIG5vcAkJCQkJCVxuIgotCQkiCS5wcmV2aW91cwkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCi0JCTogIm0iIChydy0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfQotCi0Jc21wX2xsc2NfbWIoKTsKLX0KLQotLyogTm90ZSB0aGUgdXNlIG9mIHN1Yiwgbm90IHN1YnUgd2hpY2ggd2lsbCBtYWtlIHRoZSBrZXJuZWwgZGllIHdpdGggYW4KLSAgIG92ZXJmbG93IGV4Y2VwdGlvbiBpZiB3ZSBldmVyIHRyeSB0byB1bmxvY2sgYW4gcndsb2NrIHRoYXQgaXMgYWxyZWFkeQotICAgdW5sb2NrZWQgb3IgaXMgYmVpbmcgaGVsZCBieSBhIHdyaXRlci4gICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0Jc21wX2xsc2NfbWIoKTsKLQotCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIxOglsbAklMSwgJTIJCSMgX19yYXdfcmVhZF91bmxvY2sJXG4iCi0JCSIJc3ViCSUxLCAxCQkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCi0JCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQotCQk6ICJtIiAocnctPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF91bmxvY2sJXG4iCi0JCSIxOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCXN1YgklMSwgMQkJCQkJXG4iCi0JCSIJc2MJJTEsICUwCQkJCQlcbiIKLQkJIgliZXF6CSUxLCAyZgkJCQkJXG4iCi0JCSIJIG5vcAkJCQkJCVxuIgotCQkiCS5zdWJzZWN0aW9uIDIJCQkJCVxuIgotCQkiMjoJYgkxYgkJCQkJXG4iCi0JCSIJIG5vcAkJCQkJCVxuIgotCQkiCS5wcmV2aW91cwkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCi0JCTogIm0iIChydy0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfd3JpdGVfbG9jawlcbiIKLQkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCi0JCSIJYm5legklMSwgMWIJCQkJCVxuIgotCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCi0JCSIJIG5vcAkJCQkJCVxuIgotCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCi0JCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQotCQk6ICJtIiAocnctPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfd3JpdGVfbG9jawlcbiIKLQkJIjE6CWxsCSUxLCAlMgkJCQkJXG4iCi0JCSIJYm5legklMSwgMmYJCQkJCVxuIgotCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXoJJTEsIDJmCQkJCQlcbiIKLQkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCi0JCSIyOglsbAklMSwgJTIJCQkJCVxuIgotCQkiCWJuZXoJJTEsIDJiCQkJCQlcbiIKLQkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCi0JCSIJYgkxYgkJCQkJXG4iCi0JCSIJIG5vcAkJCQkJCVxuIgotCQkiCS5wcmV2aW91cwkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCi0JCTogIm0iIChydy0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfQotCi0Jc21wX2xsc2NfbWIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQotewotCXNtcF9tYigpOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIgkJCQkjIF9fcmF3X3dyaXRlX3VubG9jawlcbiIKLQkiCXN3CSQwLCAlMAkJCQkJXG4iCi0JOiAiPW0iIChydy0+bG9jaykKLQk6ICJtIiAocnctPmxvY2spCi0JOiAibWVtb3J5Iik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0JaW50IHJldDsKLQotCWlmIChSMTAwMDBfTExTQ19XQVIpIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX3RyeWxvY2sJXG4iCi0JCSIJbGkJJTIsIDAJCQkJCVxuIgotCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKLQkJIglibHR6CSUxLCAyZgkJCQkJXG4iCi0JCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgotCQkiCXNjCSUxLCAlMAkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJX19XRUFLX0xMU0NfTUIKLQkJIglsaQklMiwgMQkJCQkJXG4iCi0JCSIyOgkJCQkJCQlcbiIKLQkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApLCAiPSZyIiAocmV0KQotCQk6ICJtIiAocnctPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF90cnlsb2NrCVxuIgotCQkiCWxpCSUyLCAwCQkJCQlcbiIKLQkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCi0JCSIJYmx0egklMSwgMmYJCQkJCVxuIgotCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKLQkJIglzYwklMSwgJTAJCQkJCVxuIgotCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgbm9wCQkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJX19XRUFLX0xMU0NfTUIKLQkJIglsaQklMiwgMQkJCQkJXG4iCi0JCSIyOgkJCQkJCQlcbiIKLQkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApLCAiPSZyIiAocmV0KQotCQk6ICJtIiAocnctPmxvY2spCi0JCTogIm1lbW9yeSIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCWludCByZXQ7Ci0KLQlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfd3JpdGVfdHJ5bG9jawlcbiIKLQkJIglsaQklMiwgMAkJCQkJXG4iCi0JCSIxOglsbAklMSwgJTMJCQkJCVxuIgotCQkiCWJuZXoJJTEsIDJmCQkJCQlcbiIKLQkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCi0JCSIJc2MJJTEsICUwCQkJCQlcbiIKLQkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCSBub3AJCQkJCQlcbiIKLQkJX19XRUFLX0xMU0NfTUIKLQkJIglsaQklMiwgMQkJCQkJXG4iCi0JCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIjI6CQkJCQkJCVxuIgotCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCi0JCTogIm0iIChydy0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfSBlbHNlIHsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd193cml0ZV90cnlsb2NrCVxuIgotCQkiCWxpCSUyLCAwCQkJCQlcbiIKLQkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCi0JCSIJYm5legklMSwgMmYJCQkJCVxuIgotCQkiCWx1aQklMSwgMHg4MDAwCQkJCVxuIgotCQkiCXNjCSUxLCAlMAkJCQkJXG4iCi0JCSIJYmVxegklMSwgM2YJCQkJCVxuIgotCQkiCSBsaQklMiwgMQkJCQkJXG4iCi0JCSIyOgkJCQkJCQlcbiIKLQkJX19XRUFLX0xMU0NfTUIKLQkJIgkuc3Vic2VjdGlvbiAyCQkJCQlcbiIKLQkJIjM6CWIJMWIJCQkJCVxuIgotCQkiCSBsaQklMiwgMAkJCQkJXG4iCi0JCSIJLnByZXZpb3VzCQkJCQlcbiIKLQkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgotCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCi0JCTogIm0iIChydy0+bG9jaykKLQkJOiAibWVtb3J5Iik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotCi0jZGVmaW5lIF9yYXdfc3Bpbl9yZWxheChsb2NrKQljcHVfcmVsYXgoKQotI2RlZmluZSBfcmF3X3JlYWRfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKLSNkZWZpbmUgX3Jhd193cml0ZV9yZWxheChsb2NrKQljcHVfcmVsYXgoKQotCi0jZW5kaWYgLyogX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjZjNTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9ja190eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NQSU5MT0NLX1RZUEVTX0gKLSNkZWZpbmUgX0FTTV9TUElOTE9DS19UWVBFU19ICi0KLSNpZm5kZWYgX19MSU5VWF9TUElOTE9DS19UWVBFU19ICi0jIGVycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkiCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotfSByYXdfc3BpbmxvY2tfdDsKLQotI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOwotfSByYXdfcndsb2NrX3Q7Ci0KLSNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFlMWFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc3RhY2tmcmFtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTksIDIwMDEgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgUGF1bCBNLiBBbnRvaW5lLgotICogQ29weXJpZ2h0IChDKSAxOTk5IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwNyAgTWFjaWVqIFcuIFJvenlja2kKLSAqLwotI2lmbmRlZiBfQVNNX1NUQUNLRlJBTUVfSAotI2RlZmluZSBfQVNNX1NUQUNLRlJBTUVfSAotCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotCi0vKgotICogRm9yIFNNVEMga2VybmVsLCBnbG9iYWwgSUUgc2hvdWxkIGJlIGxlZnQgc2V0LCBhbmQgaW50ZXJydXB0cwotICogY29udHJvbGxlZCBleGNsdXNpdmVseSB2aWEgSVhNVC4KLSAqLwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLSNkZWZpbmUgU1RBVE1BU0sgMHgxZQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQotI2RlZmluZSBTVEFUTUFTSyAweDNmCi0jZWxzZQotI2RlZmluZSBTVEFUTUFTSyAweDFmCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLSNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQotCQkubWFjcm8JU0FWRV9BVAotCQkuc2V0CXB1c2gKLQkJLnNldAlub2F0Ci0JCUxPTkdfUwkkMSwgUFRfUjEoc3ApCi0JCS5zZXQJcG9wCi0JCS5lbmRtCi0KLQkJLm1hY3JvCVNBVkVfVEVNUAotI2lmZGVmIENPTkZJR19DUFVfSEFTX1NNQVJUTUlQUwotCQltZmxoeHUJdjEKLQkJTE9OR19TCXYxLCBQVF9MTyhzcCkKLQkJbWZsaHh1CXYxCi0JCUxPTkdfUwl2MSwgUFRfSEkoc3ApCi0JCW1mbGh4dQl2MQotCQlMT05HX1MJdjEsIFBUX0FDWChzcCkKLSNlbHNlCi0JCW1maGkJdjEKLQkJTE9OR19TCXYxLCBQVF9ISShzcCkKLQkJbWZsbwl2MQotCQlMT05HX1MJdjEsIFBUX0xPKHNwKQotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzMyQklUCi0JCUxPTkdfUwkkOCwgUFRfUjgoc3ApCi0JCUxPTkdfUwkkOSwgUFRfUjkoc3ApCi0jZW5kaWYKLQkJTE9OR19TCSQxMCwgUFRfUjEwKHNwKQotCQlMT05HX1MJJDExLCBQVF9SMTEoc3ApCi0JCUxPTkdfUwkkMTIsIFBUX1IxMihzcCkKLQkJTE9OR19TCSQxMywgUFRfUjEzKHNwKQotCQlMT05HX1MJJDE0LCBQVF9SMTQoc3ApCi0JCUxPTkdfUwkkMTUsIFBUX1IxNShzcCkKLQkJTE9OR19TCSQyNCwgUFRfUjI0KHNwKQotCQkuZW5kbQotCi0JCS5tYWNybwlTQVZFX1NUQVRJQwotCQlMT05HX1MJJDE2LCBQVF9SMTYoc3ApCi0JCUxPTkdfUwkkMTcsIFBUX1IxNyhzcCkKLQkJTE9OR19TCSQxOCwgUFRfUjE4KHNwKQotCQlMT05HX1MJJDE5LCBQVF9SMTkoc3ApCi0JCUxPTkdfUwkkMjAsIFBUX1IyMChzcCkKLQkJTE9OR19TCSQyMSwgUFRfUjIxKHNwKQotCQlMT05HX1MJJDIyLCBQVF9SMjIoc3ApCi0JCUxPTkdfUwkkMjMsIFBUX1IyMyhzcCkKLQkJTE9OR19TCSQzMCwgUFRfUjMwKHNwKQotCQkuZW5kbQotCi0jaWZkZWYgQ09ORklHX1NNUAotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLSNkZWZpbmUgUFRFQkFTRV9TSElGVAkxOQkvKiBUQ0JJTkQgKi8KLSNlbHNlCi0jZGVmaW5lIFBURUJBU0VfU0hJRlQJMjMJLyogQ09OVEVYVCAqLwotI2VuZGlmCi0JCS5tYWNybwlnZXRfc2F2ZWRfc3AJLyogU01QIHZhcmlhdGlvbiAqLwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJbWZjMAlrMCwgQ1AwX1RDQklORAotI2Vsc2UKLQkJTUZDMAlrMCwgQ1AwX0NPTlRFWFQKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHXzMyQklUKSB8fCBkZWZpbmVkKEtCVUlMRF82NEJJVF9TWU0zMikKLQkJbHVpCWsxLCAlaGkoa2VybmVsc3ApCi0jZWxzZQotCQlsdWkJazEsICVoaWdoZXN0KGtlcm5lbHNwKQotCQlkYWRkaXUJazEsICVoaWdoZXIoa2VybmVsc3ApCi0JCWRzbGwJazEsIDE2Ci0JCWRhZGRpdQlrMSwgJWhpKGtlcm5lbHNwKQotCQlkc2xsCWsxLCAxNgotI2VuZGlmCi0JCUxPTkdfU1JMCWswLCBQVEVCQVNFX1NISUZUCi0JCUxPTkdfQUREVQlrMSwgazAKLQkJTE9OR19MCWsxLCAlbG8oa2VybmVsc3ApKGsxKQotCQkuZW5kbQotCi0JCS5tYWNybwlzZXRfc2F2ZWRfc3Agc3RhY2twIHRlbXAgdGVtcDIKLSNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCi0JCW1mYzAJXHRlbXAsIENQMF9UQ0JJTkQKLSNlbHNlCi0JCU1GQzAJXHRlbXAsIENQMF9DT05URVhUCi0jZW5kaWYKLQkJTE9OR19TUkwJXHRlbXAsIFBURUJBU0VfU0hJRlQKLQkJTE9OR19TCVxzdGFja3AsIGtlcm5lbHNwKFx0ZW1wKQotCQkuZW5kbQotI2Vsc2UKLQkJLm1hY3JvCWdldF9zYXZlZF9zcAkvKiBVbmlwcm9jZXNzb3IgdmFyaWF0aW9uICovCi0jaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpIHx8IGRlZmluZWQoS0JVSUxEXzY0QklUX1NZTTMyKQotCQlsdWkJazEsICVoaShrZXJuZWxzcCkKLSNlbHNlCi0JCWx1aQlrMSwgJWhpZ2hlc3Qoa2VybmVsc3ApCi0JCWRhZGRpdQlrMSwgJWhpZ2hlcihrZXJuZWxzcCkKLQkJZHNsbAlrMSwgazEsIDE2Ci0JCWRhZGRpdQlrMSwgJWhpKGtlcm5lbHNwKQotCQlkc2xsCWsxLCBrMSwgMTYKLSNlbmRpZgotCQlMT05HX0wJazEsICVsbyhrZXJuZWxzcCkoazEpCi0JCS5lbmRtCi0KLQkJLm1hY3JvCXNldF9zYXZlZF9zcCBzdGFja3AgdGVtcCB0ZW1wMgotCQlMT05HX1MJXHN0YWNrcCwga2VybmVsc3AKLQkJLmVuZG0KLSNlbmRpZgotCi0JCS5tYWNybwlTQVZFX1NPTUUKLQkJLnNldAlwdXNoCi0JCS5zZXQJbm9hdAotCQkuc2V0CXJlb3JkZXIKLQkJbWZjMAlrMCwgQ1AwX1NUQVRVUwotCQlzbGwJazAsIDMJCS8qIGV4dHJhY3QgY3UwIGJpdCAqLwotCQkuc2V0CW5vcmVvcmRlcgotCQlibHR6CWswLCA4ZgotCQkgbW92ZQlrMSwgc3AKLQkJLnNldAlyZW9yZGVyCi0JCS8qIENhbGxlZCBmcm9tIHVzZXIgbW9kZSwgbmV3IHN0YWNrLiAqLwotCQlnZXRfc2F2ZWRfc3AKLSNpZm5kZWYgQ09ORklHX0NQVV9EQURESV9XT1JLQVJPVU5EUwotODoJCW1vdmUJazAsIHNwCi0JCVBUUl9TVUJVIHNwLCBrMSwgUFRfU0laRQotI2Vsc2UKLQkJLnNldAlhdD1rMAotODoJCVBUUl9TVUJVIGsxLCBQVF9TSVpFCi0JCS5zZXQJbm9hdAotCQltb3ZlCWswLCBzcAotCQltb3ZlCXNwLCBrMQotI2VuZGlmCi0JCUxPTkdfUwlrMCwgUFRfUjI5KHNwKQotCQlMT05HX1MJJDMsIFBUX1IzKHNwKQotCQkvKgotCQkgKiBZb3UgbWlnaHQgdGhpbmsgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBzYXZlICQwLAotCQkgKiBidXQgdGhlIEZQVSBlbXVsYXRvciBhbmQgZ2RiIHJlbW90ZSBkZWJ1ZyBzdHViCi0JCSAqIG5lZWQgaXQgdG8gb3BlcmF0ZSBjb3JyZWN0bHkKLQkJICovCi0JCUxPTkdfUwkkMCwgUFRfUjAoc3ApCi0JCW1mYzAJdjEsIENQMF9TVEFUVVMKLQkJTE9OR19TCSQyLCBQVF9SMihzcCkKLQkJTE9OR19TCXYxLCBQVF9TVEFUVVMoc3ApCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkvKgotCQkgKiBJZGVhbGx5LCB0aGVzZSBpbnN0cnVjdGlvbnMgd291bGQgYmUgc2h1ZmZsZWQgaW4KLQkJICogdG8gY292ZXIgdGhlIHBpcGVsaW5lIGRlbGF5LgotCQkgKi8KLQkJLnNldAltaXBzMzIKLQkJbWZjMAl2MSwgQ1AwX1RDU1RBVFVTCi0JCS5zZXQJbWlwczAKLQkJTE9OR19TCXYxLCBQVF9UQ1NUQVRVUyhzcCkKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCUxPTkdfUwkkNCwgUFRfUjQoc3ApCi0JCW1mYzAJdjEsIENQMF9DQVVTRQotCQlMT05HX1MJJDUsIFBUX1I1KHNwKQotCQlMT05HX1MJdjEsIFBUX0NBVVNFKHNwKQotCQlMT05HX1MJJDYsIFBUX1I2KHNwKQotCQlNRkMwCXYxLCBDUDBfRVBDCi0JCUxPTkdfUwkkNywgUFRfUjcoc3ApCi0jaWZkZWYgQ09ORklHXzY0QklUCi0JCUxPTkdfUwkkOCwgUFRfUjgoc3ApCi0JCUxPTkdfUwkkOSwgUFRfUjkoc3ApCi0jZW5kaWYKLQkJTE9OR19TCXYxLCBQVF9FUEMoc3ApCi0JCUxPTkdfUwkkMjUsIFBUX1IyNShzcCkKLQkJTE9OR19TCSQyOCwgUFRfUjI4KHNwKQotCQlMT05HX1MJJDMxLCBQVF9SMzEoc3ApCi0JCW9yaQkkMjgsIHNwLCBfVEhSRUFEX01BU0sKLQkJeG9yaQkkMjgsIF9USFJFQURfTUFTSwotCQkuc2V0CXBvcAotCQkuZW5kbQotCi0JCS5tYWNybwlTQVZFX0FMTAotCQlTQVZFX1NPTUUKLQkJU0FWRV9BVAotCQlTQVZFX1RFTVAKLQkJU0FWRV9TVEFUSUMKLQkJLmVuZG0KLQotCQkubWFjcm8JUkVTVE9SRV9BVAotCQkuc2V0CXB1c2gKLQkJLnNldAlub2F0Ci0JCUxPTkdfTAkkMSwgIFBUX1IxKHNwKQotCQkuc2V0CXBvcAotCQkuZW5kbQotCi0JCS5tYWNybwlSRVNUT1JFX1RFTVAKLSNpZmRlZiBDT05GSUdfQ1BVX0hBU19TTUFSVE1JUFMKLQkJTE9OR19MCSQyNCwgUFRfQUNYKHNwKQotCQltdGxoeAkkMjQKLQkJTE9OR19MCSQyNCwgUFRfSEkoc3ApCi0JCW10bGh4CSQyNAotCQlMT05HX0wJJDI0LCBQVF9MTyhzcCkKLQkJbXRsaHgJJDI0Ci0jZWxzZQotCQlMT05HX0wJJDI0LCBQVF9MTyhzcCkKLQkJbXRsbwkkMjQKLQkJTE9OR19MCSQyNCwgUFRfSEkoc3ApCi0JCW10aGkJJDI0Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfMzJCSVQKLQkJTE9OR19MCSQ4LCBQVF9SOChzcCkKLQkJTE9OR19MCSQ5LCBQVF9SOShzcCkKLSNlbmRpZgotCQlMT05HX0wJJDEwLCBQVF9SMTAoc3ApCi0JCUxPTkdfTAkkMTEsIFBUX1IxMShzcCkKLQkJTE9OR19MCSQxMiwgUFRfUjEyKHNwKQotCQlMT05HX0wJJDEzLCBQVF9SMTMoc3ApCi0JCUxPTkdfTAkkMTQsIFBUX1IxNChzcCkKLQkJTE9OR19MCSQxNSwgUFRfUjE1KHNwKQotCQlMT05HX0wJJDI0LCBQVF9SMjQoc3ApCi0JCS5lbmRtCi0KLQkJLm1hY3JvCVJFU1RPUkVfU1RBVElDCi0JCUxPTkdfTAkkMTYsIFBUX1IxNihzcCkKLQkJTE9OR19MCSQxNywgUFRfUjE3KHNwKQotCQlMT05HX0wJJDE4LCBQVF9SMTgoc3ApCi0JCUxPTkdfTAkkMTksIFBUX1IxOShzcCkKLQkJTE9OR19MCSQyMCwgUFRfUjIwKHNwKQotCQlMT05HX0wJJDIxLCBQVF9SMjEoc3ApCi0JCUxPTkdfTAkkMjIsIFBUX1IyMihzcCkKLQkJTE9OR19MCSQyMywgUFRfUjIzKHNwKQotCQlMT05HX0wJJDMwLCBQVF9SMzAoc3ApCi0JCS5lbmRtCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfUjMwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9UWDM5WFgpCi0KLQkJLm1hY3JvCVJFU1RPUkVfU09NRQotCQkuc2V0CXB1c2gKLQkJLnNldAlyZW9yZGVyCi0JCS5zZXQJbm9hdAotCQltZmMwCWEwLCBDUDBfU1RBVFVTCi0JCWxpCXYxLCAweGZmMDAKLQkJb3JpCWEwLCBTVEFUTUFTSwotCQl4b3JpCWEwLCBTVEFUTUFTSwotCQltdGMwCWEwLCBDUDBfU1RBVFVTCi0JCWFuZAlhMCwgdjEKLQkJTE9OR19MCXYwLCBQVF9TVEFUVVMoc3ApCi0JCW5vcgl2MSwgJDAsIHYxCi0JCWFuZAl2MCwgdjEKLQkJb3IJdjAsIGEwCi0JCW10YzAJdjAsIENQMF9TVEFUVVMKLQkJTE9OR19MCSQzMSwgUFRfUjMxKHNwKQotCQlMT05HX0wJJDI4LCBQVF9SMjgoc3ApCi0JCUxPTkdfTAkkMjUsIFBUX1IyNShzcCkKLQkJTE9OR19MCSQ3LCAgUFRfUjcoc3ApCi0JCUxPTkdfTAkkNiwgIFBUX1I2KHNwKQotCQlMT05HX0wJJDUsICBQVF9SNShzcCkKLQkJTE9OR19MCSQ0LCAgUFRfUjQoc3ApCi0JCUxPTkdfTAkkMywgIFBUX1IzKHNwKQotCQlMT05HX0wJJDIsICBQVF9SMihzcCkKLQkJLnNldAlwb3AKLQkJLmVuZG0KLQotCQkubWFjcm8JUkVTVE9SRV9TUF9BTkRfUkVUCi0JCS5zZXQJcHVzaAotCQkuc2V0CW5vcmVvcmRlcgotCQlMT05HX0wJazAsIFBUX0VQQyhzcCkKLQkJTE9OR19MCXNwLCBQVF9SMjkoc3ApCi0JCWpyCWswCi0JCSByZmUKLQkJLnNldAlwb3AKLQkJLmVuZG0KLQotI2Vsc2UKLQkJLm1hY3JvCVJFU1RPUkVfU09NRQotCQkuc2V0CXB1c2gKLQkJLnNldAlyZW9yZGVyCi0JCS5zZXQJbm9hdAotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJLnNldAltaXBzMzJyMgotCQkvKgotCQkgKiBUaGlzIG1heSBub3QgcmVhbGx5IGJlIG5lY2Vzc2FyeSBpZiBpbnRzIGFyZSBhbHJlYWR5Ci0JCSAqIGluaGliaXRlZCBoZXJlLgotCQkgKi8KLQkJbWZjMAl2MCwgQ1AwX1RDU1RBVFVTCi0JCW9yaQl2MCwgVENTVEFUVVNfSVhNVAotCQltdGMwCXYwLCBDUDBfVENTVEFUVVMKLQkJX2VoYgotCQlETVQJNQkJCQkjIGRtdCBhMQotCQlqYWwJbWlwc19paGIKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCW1mYzAJYTAsIENQMF9TVEFUVVMKLQkJb3JpCWEwLCBTVEFUTUFTSwotCQl4b3JpCWEwLCBTVEFUTUFTSwotCQltdGMwCWEwLCBDUDBfU1RBVFVTCi0JCWxpCXYxLCAweGZmMDAKLQkJYW5kCWEwLCB2MQotCQlMT05HX0wJdjAsIFBUX1NUQVRVUyhzcCkKLQkJbm9yCXYxLCAkMCwgdjEKLQkJYW5kCXYwLCB2MQotCQlvcgl2MCwgYTAKLQkJbXRjMAl2MCwgQ1AwX1NUQVRVUwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLS8qCi0gKiBPbmx5IGFmdGVyIEVYTC9FUkwgaGF2ZSBiZWVuIHJlc3RvcmVkIHRvIHN0YXR1cyBjYW4gd2UKLSAqIHJlc3RvcmUgVENTdGF0dXMuSVhNVC4KLSAqLwotCQlMT05HX0wJdjEsIFBUX1RDU1RBVFVTKHNwKQotCQlfZWhiCi0JCW1mYzAJdjAsIENQMF9UQ1NUQVRVUwotCQlhbmRpCXYxLCBUQ1NUQVRVU19JWE1UCi0JCS8qIFdlIGtub3cgdGhhdCBUQ1N0YXR1YS5JWE1UIHNob3VsZCBiZSBzZXQgZnJvbSBhYm92ZSAqLwotCQl4b3JpCXYwLCB2MCwgVENTVEFUVVNfSVhNVAotCQlvcgl2MCwgdjAsIHYxCi0JCW10YzAJdjAsIENQMF9UQ1NUQVRVUwotCQlfZWhiCi0JCWFuZGkJYTEsIGExLCBWUEVDT05UUk9MX1RFCi0JCWJlcXoJYTEsIDFmCi0JCWVtdAotMToKLQkJLnNldAltaXBzMAotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KLQkJTE9OR19MCXYxLCBQVF9FUEMoc3ApCi0JCU1UQzAJdjEsIENQMF9FUEMKLQkJTE9OR19MCSQzMSwgUFRfUjMxKHNwKQotCQlMT05HX0wJJDI4LCBQVF9SMjgoc3ApCi0JCUxPTkdfTAkkMjUsIFBUX1IyNShzcCkKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQkJTE9OR19MCSQ4LCBQVF9SOChzcCkKLQkJTE9OR19MCSQ5LCBQVF9SOShzcCkKLSNlbmRpZgotCQlMT05HX0wJJDcsICBQVF9SNyhzcCkKLQkJTE9OR19MCSQ2LCAgUFRfUjYoc3ApCi0JCUxPTkdfTAkkNSwgIFBUX1I1KHNwKQotCQlMT05HX0wJJDQsICBQVF9SNChzcCkKLQkJTE9OR19MCSQzLCAgUFRfUjMoc3ApCi0JCUxPTkdfTAkkMiwgIFBUX1IyKHNwKQotCQkuc2V0CXBvcAotCQkuZW5kbQotCi0JCS5tYWNybwlSRVNUT1JFX1NQX0FORF9SRVQKLQkJTE9OR19MCXNwLCBQVF9SMjkoc3ApCi0JCS5zZXQJbWlwczMKLQkJZXJldAotCQkuc2V0CW1pcHMwCi0JCS5lbmRtCi0KLSNlbmRpZgotCi0JCS5tYWNybwlSRVNUT1JFX1NQCi0JCUxPTkdfTAlzcCwgUFRfUjI5KHNwKQotCQkuZW5kbQotCi0JCS5tYWNybwlSRVNUT1JFX0FMTAotCQlSRVNUT1JFX1RFTVAKLQkJUkVTVE9SRV9TVEFUSUMKLQkJUkVTVE9SRV9BVAotCQlSRVNUT1JFX1NPTUUKLQkJUkVTVE9SRV9TUAotCQkuZW5kbQotCi0JCS5tYWNybwlSRVNUT1JFX0FMTF9BTkRfUkVUCi0JCVJFU1RPUkVfVEVNUAotCQlSRVNUT1JFX1NUQVRJQwotCQlSRVNUT1JFX0FUCi0JCVJFU1RPUkVfU09NRQotCQlSRVNUT1JFX1NQX0FORF9SRVQKLQkJLmVuZG0KLQotLyoKLSAqIE1vdmUgdG8ga2VybmVsIG1vZGUgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLSAqIFNldCBjcDAgZW5hYmxlIGJpdCBhcyBzaWduIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUga2VybmVsIHN0YWNrCi0gKi8KLQkJLm1hY3JvCUNMSQotI2lmICFkZWZpbmVkKENPTkZJR19NSVBTX01UX1NNVEMpCi0JCW1mYzAJdDAsIENQMF9TVEFUVVMKLQkJbGkJdDEsIFNUMF9DVTAgfCBTVEFUTUFTSwotCQlvcgl0MCwgdDEKLQkJeG9yaQl0MCwgU1RBVE1BU0sKLQkJbXRjMAl0MCwgQ1AwX1NUQVRVUwotI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQkvKgotCQkgKiBGb3IgU01UQywgd2UgbmVlZCB0byBzZXQgcHJpdmlsZWdlCi0JCSAqIGFuZCBkaXNhYmxlIGludGVycnVwdHMgb25seSBmb3IgdGhlCi0JCSAqIGN1cnJlbnQgVEMsIHVzaW5nIHRoZSBUQ1N0YXR1cyByZWdpc3Rlci4KLQkJICovCi0JCW1mYzAJdDAsIENQMF9UQ1NUQVRVUwotCQkvKiBGb3J0dW5hdGVseSBDVSAwIGlzIGluIHRoZSBzYW1lIHBsYWNlIGluIGJvdGggcmVnaXN0ZXJzICovCi0JCS8qIFNldCBUQ1UwLCBUTVgsIFRLU1UgKGZvciBsYXRlciBpbnZlcnNpb24pIGFuZCBJWE1UICovCi0JCWxpCXQxLCBTVDBfQ1UwIHwgMHgwODAwMWMwMAotCQlvcgl0MCwgdDEKLQkJLyogQ2xlYXIgVEtTVSwgbGVhdmUgSVhNVCAqLwotCQl4b3JpCXQwLCAweDAwMDAxODAwCi0JCW10YzAJdDAsIENQMF9UQ1NUQVRVUwotCQlfZWhiCi0JCS8qIFdlIG5lZWQgdG8gbGVhdmUgdGhlIGdsb2JhbCBJRSBiaXQgc2V0LCBidXQgY2xlYXIgRVhMLi4uKi8KLQkJbWZjMAl0MCwgQ1AwX1NUQVRVUwotCQlvcmkJdDAsIFNUMF9FWEwgfCBTVDBfRVJMCi0JCXhvcmkJdDAsIFNUMF9FWEwgfCBTVDBfRVJMCi0JCW10YzAJdDAsIENQMF9TVEFUVVMKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JCWlycV9kaXNhYmxlX2hhemFyZAotCQkuZW5kbQotCi0vKgotICogTW92ZSB0byBrZXJuZWwgbW9kZSBhbmQgZW5hYmxlIGludGVycnVwdHMuCi0gKiBTZXQgY3AwIGVuYWJsZSBiaXQgYXMgc2lnbiB0aGF0IHdlJ3JlIHJ1bm5pbmcgb24gdGhlIGtlcm5lbCBzdGFjawotICovCi0JCS5tYWNybwlTVEkKLSNpZiAhZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQotCQltZmMwCXQwLCBDUDBfU1RBVFVTCi0JCWxpCXQxLCBTVDBfQ1UwIHwgU1RBVE1BU0sKLQkJb3IJdDAsIHQxCi0JCXhvcmkJdDAsIFNUQVRNQVNLICYgfjEKLQkJbXRjMAl0MCwgQ1AwX1NUQVRVUwotI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQkvKgotCQkgKiBGb3IgU01UQywgd2UgbmVlZCB0byBzZXQgcHJpdmlsZWdlCi0JCSAqIGFuZCBlbmFibGUgaW50ZXJydXB0cyBvbmx5IGZvciB0aGUKLQkJICogY3VycmVudCBUQywgdXNpbmcgdGhlIFRDU3RhdHVzIHJlZ2lzdGVyLgotCQkgKi8KLQkJX2VoYgotCQltZmMwCXQwLCBDUDBfVENTVEFUVVMKLQkJLyogRm9ydHVuYXRlbHkgQ1UgMCBpcyBpbiB0aGUgc2FtZSBwbGFjZSBpbiBib3RoIHJlZ2lzdGVycyAqLwotCQkvKiBTZXQgVENVMCwgVEtTVSAoZm9yIGxhdGVyIGludmVyc2lvbikgYW5kIElYTVQgKi8KLQkJbGkJdDEsIFNUMF9DVTAgfCAweDA4MDAxYzAwCi0JCW9yCXQwLCB0MQotCQkvKiBDbGVhciBUS1NVICphbmQqIElYTVQgKi8KLQkJeG9yaQl0MCwgMHgwMDAwMWMwMAotCQltdGMwCXQwLCBDUDBfVENTVEFUVVMKLQkJX2VoYgotCQkvKiBXZSBuZWVkIHRvIGxlYXZlIHRoZSBnbG9iYWwgSUUgYml0IHNldCwgYnV0IGNsZWFyIEVYTC4uLiovCi0JCW1mYzAJdDAsIENQMF9TVEFUVVMKLQkJb3JpCXQwLCBTVDBfRVhMCi0JCXhvcmkJdDAsIFNUMF9FWEwKLQkJbXRjMAl0MCwgQ1AwX1NUQVRVUwotCQkvKiBpcnFfZW5hYmxlX2hhemFyZCBiZWxvdyBzaG91bGQgZXhwYW5kIHRvIEVIQiBmb3IgMjRLLzM0SyBjcHVzICovCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQlpcnFfZW5hYmxlX2hhemFyZAotCQkuZW5kbQotCi0vKgotICogSnVzdCBtb3ZlIHRvIGtlcm5lbCBtb2RlIGFuZCBsZWF2ZSBpbnRlcnJ1cHRzIGFzIHRoZXkgYXJlLiAgTm90ZQotICogZm9yIHRoZSBSMzAwMCB0aGlzIG1lYW5zIGNvcHlpbmcgdGhlIHByZXZpb3VzIGVuYWJsZSBmcm9tIElFcC4KLSAqIFNldCBjcDAgZW5hYmxlIGJpdCBhcyBzaWduIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUga2VybmVsIHN0YWNrCi0gKi8KLQkJLm1hY3JvCUtNT0RFCi0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQkvKgotCQkgKiBUaGlzIGdldHMgYmFyb3F1ZSBpbiBTTVRDLiAgV2Ugd2FudCB0bwotCQkgKiBwcm90ZWN0IHRoZSBub24tYXRvbWljIGNsZWFyaW5nIG9mIEVYTAotCQkgKiB3aXRoIERNVC9FTVQsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHRha2UKLQkJICogYW4gaW50ZXJydXB0IHdoaWxlIERNVCBpcyBzdGlsbCBpbiBlZmZlY3QuCi0JCSAqLwotCi0JCS8qIEtNT0RFIGdldHMgaW52b2tlZCBmcm9tIGJvdGggcmVvcmRlciBhbmQgbm9yZW9yZGVyIGNvZGUgKi8KLQkJLnNldAlwdXNoCi0JCS5zZXQJbWlwczMycjIKLQkJLnNldAlub3Jlb3JkZXIKLQkJbWZjMAl2MCwgQ1AwX1RDU1RBVFVTCi0JCWFuZGkJdjEsIHYwLCBUQ1NUQVRVU19JWE1UCi0JCW9yaQl2MCwgVENTVEFUVVNfSVhNVAotCQltdGMwCXYwLCBDUDBfVENTVEFUVVMKLQkJX2VoYgotCQlETVQJMgkJCQkjIGRtdAl2MAotCQkvKgotCQkgKiBXZSBkb24ndCBrbm93IGEgcHJpb3JpIGlmIHJhIGlzICJsaXZlIgotCQkgKi8KLQkJbW92ZQl0MCwgcmEKLQkJamFsCW1pcHNfaWhiCi0JCW5vcAkvKiBkZWxheSBzbG90ICovCi0JCW1vdmUJcmEsIHQwCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQltZmMwCXQwLCBDUDBfU1RBVFVTCi0JCWxpCXQxLCBTVDBfQ1UwIHwgKFNUQVRNQVNLICYgfjEpCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQotCQlhbmRpCXQyLCB0MCwgU1QwX0lFUAotCQlzcmwJdDIsIDIKLQkJb3IJdDAsIHQyCi0jZW5kaWYKLQkJb3IJdDAsIHQxCi0JCXhvcmkJdDAsIFNUQVRNQVNLICYgfjEKLQkJbXRjMAl0MCwgQ1AwX1NUQVRVUwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKLQkJX2VoYgotCQlhbmRpCXYwLCB2MCwgVlBFQ09OVFJPTF9URQotCQliZXF6CXYwLCAyZgotCQlub3AJLyogZGVsYXkgc2xvdCAqLwotCQllbXQKLTI6Ci0JCW1mYzAJdjAsIENQMF9UQ1NUQVRVUwotCQkvKiBDbGVhciBJWE1ULCB0aGVuIE9SIGluIHByZXZpb3VzIHZhbHVlICovCi0JCW9yaQl2MCwgVENTVEFUVVNfSVhNVAotCQl4b3JpCXYwLCBUQ1NUQVRVU19JWE1UCi0JCW9yCXYwLCB2MSwgdjAKLQkJbXRjMAl2MCwgQ1AwX1RDU1RBVFVTCi0JCS8qCi0JCSAqIGlycV9kaXNhYmxlX2hhemFyZCBiZWxvdyBzaG91bGQgZXhwYW5kIHRvIEVIQgotCQkgKiBvbiAyNEsvMzRLIENQVVMKLQkJICovCi0JCS5zZXQgcG9wCi0jZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwotCQlpcnFfZGlzYWJsZV9oYXphcmQKLQkJLmVuZG0KLQotI2VuZGlmIC8qIF9BU01fU1RBQ0tGUkFNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NGVkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMywgMDYgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgUGF1bCBNLiBBbnRvaW5lCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcwotICogS2V2aW4gRC4gS2lzc2VsbCwga2V2aW5rQG1pcHMub3JnIGFuZCBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KLSAqIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgotICovCi0jaWZuZGVmIF9BU01fU1lTVEVNX0gKLSNkZWZpbmUgX0FTTV9TWVNURU1fSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgotCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KLSNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+Ci0jaW5jbHVkZSA8YXNtL2RzcC5oPgotI2luY2x1ZGUgPGFzbS93YXIuaD4KLQotCi0vKgotICogc3dpdGNoX3RvKG4pIHNob3VsZCBzd2l0Y2ggdGFza3MgdG8gdGFzayBuciBuLCBmaXJzdAotICogY2hlY2tpbmcgdGhhdCBuIGlzbid0IHRoZSBjdXJyZW50IHRhc2ssIGluIHdoaWNoIGNhc2UgaXQgZG9lcyBub3RoaW5nLgotICovCi1leHRlcm4gYXNtbGlua2FnZSB2b2lkICpyZXN1bWUodm9pZCAqbGFzdCwgdm9pZCAqbmV4dCwgdm9pZCAqbmV4dF90aSk7Ci0KLXN0cnVjdCB0YXNrX3N0cnVjdDsKLQotI2lmZGVmIENPTkZJR19NSVBTX01UX0ZQQUZGCi0KLS8qCi0gKiBIYW5kbGUgdGhlIHNjaGVkdWxlciByZXN1bWUgZW5kIG9mIEZQVSBhZmZpbml0eSBtYW5hZ2VtZW50LiAgV2UgZG8gdGhpcwotICogaW5saW5lIHRvIHRyeSB0byBrZWVwIHRoZSBvdmVyaGVhZCBkb3duLiBJZiB3ZSBoYXZlIGJlZW4gZm9yY2VkIHRvIHJ1biBvbgotICogYSAiQ1BVIiB3aXRoIGFuIEZQVSBiZWNhdXNlIG9mIGEgcHJldmlvdXMgaGlnaCBsZXZlbCBvZiBGUCBjb21wdXRhdGlvbiwKLSAqIGJ1dCBkaWQgbm90IGFjdHVhbGx5IHVzZSB0aGUgRlBVIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgdGltZS1zbGljZSAoQ1UxCi0gKiBpc24ndCBzZXQpLCB3ZSB1bmRvIHRoZSByZXN0cmljdGlvbiBvbiBjcHVzX2FsbG93ZWQuCi0gKgotICogV2UncmUgbm90IGNhbGxpbmcgc2V0X2NwdXNfYWxsb3dlZCgpIGhlcmUsIGJlY2F1c2Ugd2UgaGF2ZSBubyBuZWVkIHRvCi0gKiBmb3JjZSBwcm9tcHQgbWlncmF0aW9uIC0gd2UncmUgYWxyZWFkeSBzd2l0Y2hpbmcgdGhlIGN1cnJlbnQgQ1BVIHRvIGEKLSAqIGRpZmZlcmVudCB0aHJlYWQuCi0gKi8KLQotI2RlZmluZSBfX21pcHNfbXRfZnBhZmZfc3dpdGNoX3RvKHByZXYpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXN0cnVjdCB0aHJlYWRfaW5mbyAqX19wcmV2X3RpID0gdGFza190aHJlYWRfaW5mbyhwcmV2KTsJCVwKLQkJCQkJCQkJCVwKLQlpZiAoY3B1X2hhc19mcHUgJiYJCQkJCQlcCi0JICAgIHRlc3RfdGlfdGhyZWFkX2ZsYWcoX19wcmV2X3RpLCBUSUZfRlBVQk9VTkQpICYmCQlcCi0JICAgICghKEtTVEtfU1RBVFVTKHByZXYpICYgU1QwX0NVMSkpKSB7CQkJCVwKLQkJY2xlYXJfdGlfdGhyZWFkX2ZsYWcoX19wcmV2X3RpLCBUSUZfRlBVQk9VTkQpOwkJXAotCQlwcmV2LT5jcHVzX2FsbG93ZWQgPSBwcmV2LT50aHJlYWQudXNlcl9jcHVzX2FsbG93ZWQ7CVwKLQl9CQkJCQkJCQlcCi0JbmV4dC0+dGhyZWFkLmVtdWxhdGVkX2ZwID0gMDsJCQkJCVwKLX0gd2hpbGUoMCkKLQotI2Vsc2UKLSNkZWZpbmUgX19taXBzX210X2ZwYWZmX3N3aXRjaF90byhwcmV2KSBkbyB7ICh2b2lkKSAocHJldik7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JX19taXBzX210X2ZwYWZmX3N3aXRjaF90byhwcmV2KTsJCQkJXAotCWlmIChjcHVfaGFzX2RzcCkJCQkJCQlcCi0JCV9fc2F2ZV9kc3AocHJldik7CQkJCQlcCi0JKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQsIHRhc2tfdGhyZWFkX2luZm8obmV4dCkpOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKGNwdV9oYXNfZHNwKQkJCQkJCVwKLQkJX19yZXN0b3JlX2RzcChjdXJyZW50KTsJCQkJCVwKLQlpZiAoY3B1X2hhc191c2VybG9jYWwpCQkJCQkJXAotCQl3cml0ZV9jMF91c2VybG9jYWwoY3VycmVudF90aHJlYWRfaW5mbygpLT50cF92YWx1ZSk7CVwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3hjaGdfdTMyKHZvbGF0aWxlIGludCAqIG0sIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JX191MzIgcmV0dmFsOwotCi0JaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKLQkJdW5zaWduZWQgbG9uZyBkdW1teTsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKLQkJIjE6CWxsCSUwLCAlMwkJCSMgeGNoZ191MzIJXG4iCi0JCSIJLnNldAltaXBzMAkJCQkJXG4iCi0JCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKLQkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKLQkJIglzYwklMiwgJTEJCQkJCVxuIgotCQkiCWJlcXpsCSUyLCAxYgkJCQkJXG4iCi0JCSIJLnNldAltaXBzMAkJCQkJXG4iCi0JCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQotCQk6ICJSIiAoKm0pLCAiSnIiICh2YWwpCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSBpZiAoY3B1X2hhc19sbHNjKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCi0JCSIxOglsbAklMCwgJTMJCQkjIHhjaGdfdTMyCVxuIgotCQkiCS5zZXQJbWlwczAJCQkJCVxuIgotCQkiCW1vdmUJJTIsICV6NAkJCQkJXG4iCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCi0JCSIJc2MJJTIsICUxCQkJCQlcbiIKLQkJIgliZXF6CSUyLCAyZgkJCQkJXG4iCi0JCSIJLnN1YnNlY3Rpb24gMgkJCQkJXG4iCi0JCSIyOgliCTFiCQkJCQlcbiIKLQkJIgkucHJldmlvdXMJCQkJCVxuIgotCQkiCS5zZXQJbWlwczAJCQkJCVxuIgotCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKLQkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQotCQk6ICJtZW1vcnkiKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXJldHZhbCA9ICptOwotCQkqbSA9IHZhbDsKLQkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJLyogaW1wbGllcyBtZW1vcnkgYmFycmllciAgKi8KLQl9Ci0KLQlzbXBfbGxzY19tYigpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2lmZGVmIENPTkZJR182NEJJVAotc3RhdGljIGlubGluZSBfX3U2NCBfX3hjaGdfdTY0KHZvbGF0aWxlIF9fdTY0ICogbSwgX191NjQgdmFsKQotewotCV9fdTY0IHJldHZhbDsKLQotCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCi0JCSIxOglsbGQJJTAsICUzCQkJIyB4Y2hnX3U2NAlcbiIKLQkJIgltb3ZlCSUyLCAlejQJCQkJCVxuIgotCQkiCXNjZAklMiwgJTEJCQkJCVxuIgotCQkiCWJlcXpsCSUyLCAxYgkJCQkJXG4iCi0JCSIJLnNldAltaXBzMAkJCQkJXG4iCi0JCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQotCQk6ICJSIiAoKm0pLCAiSnIiICh2YWwpCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSBpZiAoY3B1X2hhc19sbHNjKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIJLnNldAltaXBzMwkJCQkJXG4iCi0JCSIxOglsbGQJJTAsICUzCQkJIyB4Y2hnX3U2NAlcbiIKLQkJIgltb3ZlCSUyLCAlejQJCQkJCVxuIgotCQkiCXNjZAklMiwgJTEJCQkJCVxuIgotCQkiCWJlcXoJJTIsIDJmCQkJCQlcbiIKLQkJIgkuc3Vic2VjdGlvbiAyCQkJCQlcbiIKLQkJIjI6CWIJMWIJCQkJCVxuIgotCQkiCS5wcmV2aW91cwkJCQkJXG4iCi0JCSIJLnNldAltaXBzMAkJCQkJXG4iCi0JCTogIj0mciIgKHJldHZhbCksICI9bSIgKCptKSwgIj0mciIgKGR1bW15KQotCQk6ICJSIiAoKm0pLCAiSnIiICh2YWwpCi0JCTogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJcmV0dmFsID0gKm07Ci0JCSptID0gdmFsOwotCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkvKiBpbXBsaWVzIG1lbW9yeSBiYXJyaWVyICAqLwotCX0KLQotCXNtcF9sbHNjX21iKCk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotI2Vsc2UKLWV4dGVybiBfX3U2NCBfX3hjaGdfdTY0X3Vuc3VwcG9ydGVkX29uXzMyYml0X2tlcm5lbHModm9sYXRpbGUgX191NjQgKiBtLCBfX3U2NCB2YWwpOwotI2RlZmluZSBfX3hjaGdfdTY0IF9feGNoZ191NjRfdW5zdXBwb3J0ZWRfb25fMzJiaXRfa2VybmVscwotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBleGlzdCwgc28geW91J2xsIGdldCBhIGxpbmtlciBlcnJvcgotICAgaWYgc29tZXRoaW5nIHRyaWVzIHRvIGRvIGFuIGludmFsaWQgeGNoZygpLiAgKi8KLWV4dGVybiB2b2lkIF9feGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcih2b2lkKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKiBwdHIsIGludCBzaXplKQotewotCXN3aXRjaCAoc2l6ZSkgewotCWNhc2UgNDoKLQkJcmV0dXJuIF9feGNoZ191MzIocHRyLCB4KTsKLQljYXNlIDg6Ci0JCXJldHVybiBfX3hjaGdfdTY0KHB0ciwgeCk7Ci0JfQotCV9feGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcigpOwotCXJldHVybiB4OwotfQotCi0jZGVmaW5lIHhjaGcocHRyLCB4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpKQotCi1leHRlcm4gdm9pZCBzZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIHZvaWQgc2V0X3VuY2FjaGVkX2hhbmRsZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLQotdHlwZWRlZiB2b2lkICgqdmlfaGFuZGxlcl90KSh2b2lkKTsKLWV4dGVybiB2b2lkICpzZXRfdmlfaGFuZGxlcihpbnQgbiwgdmlfaGFuZGxlcl90IGFkZHIpOwotCi1leHRlcm4gdm9pZCAqc2V0X2V4Y2VwdF92ZWN0b3IoaW50IG4sIHZvaWQgKmFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZWJhc2U7Ci1leHRlcm4gdm9pZCBwZXJfY3B1X3RyYXBfaW5pdCh2b2lkKTsKLQotLyoKLSAqIFNlZSBpbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oOyBwcmV2ZW50cyBkZWFkbG9jayBvbiBTTVAKLSAqIHN5c3RlbXMuCi0gKi8KLSNkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKTsKLQotI2VuZGlmIC8qIF9BU01fU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvdGhyZWFkX2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDYwNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3RocmVhZF9pbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyogdGhyZWFkX2luZm8uaDogTUlQUyBsb3ctbGV2ZWwgdGhyZWFkIGluZm9ybWF0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyICBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICogLSBJbmNvcnBvcmF0aW5nIHN1Z2dlc3Rpb25zIG1hZGUgYnkgTGludXMgVG9ydmFsZHMgYW5kIERhdmUgTWlsbGVyCi0gKi8KLQotI2lmbmRlZiBfQVNNX1RIUkVBRF9JTkZPX0gKLSNkZWZpbmUgX0FTTV9USFJFQURfSU5GT19ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQotLyoKLSAqIGxvdyBsZXZlbCB0YXNrIGRhdGEgdGhhdCBlbnRyeS5TIG5lZWRzIGltbWVkaWF0ZSBhY2Nlc3MgdG8KLSAqIC0gdGhpcyBzdHJ1Y3Qgc2hvdWxkIGZpdCBlbnRpcmVseSBpbnNpZGUgb2Ygb25lIGNhY2hlIGxpbmUKLSAqIC0gdGhpcyBzdHJ1Y3Qgc2hhcmVzIHRoZSBzdXBlcnZpc29yIHN0YWNrIHBhZ2VzCi0gKiAtIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgY2hhbmdlZCwgdGhlIGFzc2VtYmx5IGNvbnN0YW50cwotICogICBtdXN0IGFsc28gYmUgY2hhbmdlZAotICovCi1zdHJ1Y3QgdGhyZWFkX2luZm8gewotCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCi0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KLQl1bnNpZ25lZCBsb25nCQl0cF92YWx1ZTsJLyogdGhyZWFkIHBvaW50ZXIgKi8KLQlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCi0JaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gQlVHICovCi0KLQltbV9zZWdtZW50X3QJCWFkZHJfbGltaXQ7CS8qIHRocmVhZCBhZGRyZXNzIHNwYWNlOgotCQkJCQkJICAgMC0weEJGRkZGRkZGIGZvciB1c2VyLXRoZWFkCi0JCQkJCQkgICAwLTB4RkZGRkZGRkYgZm9yIGtlcm5lbC10aHJlYWQKLQkJCQkJCSovCi0Jc3RydWN0IHJlc3RhcnRfYmxvY2sJcmVzdGFydF9ibG9jazsKLQlzdHJ1Y3QgcHRfcmVncwkJKnJlZ3M7Ci19OwotCi0vKgotICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqCi0gKiBwcmVlbXB0X2NvdW50IG5lZWRzIHRvIGJlIDEgaW5pdGlhbGx5LCB1bnRpbCB0aGUgc2NoZWR1bGVyIGlzIGZ1bmN0aW9uYWwuCi0gKi8KLSNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAotewkJCQkJCVwKLQkudGFzawkJPSAmdHNrLAkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAotCS5mbGFncwkJPSBfVElGX0ZJWEFERSwJCVwKLQkuY3B1CQk9IDAsCQkJXAotCS5wcmVlbXB0X2NvdW50CT0gMSwJCQlcCi0JLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQlcCi0JLnJlc3RhcnRfYmxvY2sJPSB7CQkJXAotCQkuZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGwsCVwKLQl9LAkJCQkJXAotfQotCi0jZGVmaW5lIGluaXRfdGhyZWFkX2luZm8JKGluaXRfdGhyZWFkX3VuaW9uLnRocmVhZF9pbmZvKQotI2RlZmluZSBpbml0X3N0YWNrCQkoaW5pdF90aHJlYWRfdW5pb24uc3RhY2spCi0KLS8qIEhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDLiAgKi8KLXJlZ2lzdGVyIHN0cnVjdCB0aHJlYWRfaW5mbyAqX19jdXJyZW50X3RocmVhZF9pbmZvIF9fYXNtX18oIiQyOCIpOwotI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkgIF9fY3VycmVudF90aHJlYWRfaW5mbwotCi0vKiB0aHJlYWQgaW5mb3JtYXRpb24gYWxsb2NhdGlvbiAqLwotI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpICYmIGRlZmluZWQoQ09ORklHXzMyQklUKQotI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMSkKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQotI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUiAoMikKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfOEtCCi0jZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSICgxKQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BBR0VfU0laRV8xNktCCi0jZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSICgwKQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BBR0VfU0laRV82NEtCCi0jZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgVEhSRUFEX1NJWkUgKFBBR0VfU0laRSA8PCBUSFJFQURfU0laRV9PUkRFUikKLSNkZWZpbmUgVEhSRUFEX01BU0sgKFRIUkVBRF9TSVpFIC0gMVVMKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1RIUkVBRF9JTkZPX0FMTE9DQVRPUgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCi0jZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykJCQkJCVwKLSh7CQkJCQkJCQlcCi0Jc3RydWN0IHRocmVhZF9pbmZvICpyZXQ7CQkJCVwKLQkJCQkJCQkJXAotCXJldCA9IGt6YWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpOwkJCVwKLQkJCQkJCQkJXAotCXJldDsJCQkJCQkJXAotfSkKLSNlbHNlCi0jZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykga21hbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKLSNlbmRpZgotCi0jZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8oaW5mbykga2ZyZWUoaW5mbykKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotI2RlZmluZSBQUkVFTVBUX0FDVElWRQkJMHgxMDAwMDAwMAotCi0vKgotICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzCi0gKiAtIHRoZXNlIGFyZSBwcm9jZXNzIHN0YXRlIGZsYWdzIHRoYXQgdmFyaW91cyBhc3NlbWJseSBmaWxlcyBtYXkgbmVlZCB0bwotICogICBhY2Nlc3MKLSAqIC0gcGVuZGluZyB3b3JrLXRvLWJlLWRvbmUgZmxhZ3MgYXJlIGluIExTVwotICogLSBvdGhlciBmbGFncyBpbiBNU1cKLSAqLwotI2RlZmluZSBUSUZfU0lHUEVORElORwkJMQkvKiBzaWduYWwgcGVuZGluZyAqLwotI2RlZmluZSBUSUZfTkVFRF9SRVNDSEVECTIJLyogcmVzY2hlZHVsaW5nIG5lY2Vzc2FyeSAqLwotI2RlZmluZSBUSUZfU1lTQ0FMTF9BVURJVAkzCS8qIHN5c2NhbGwgYXVkaXRpbmcgYWN0aXZlICovCi0jZGVmaW5lIFRJRl9TRUNDT01QCQk0CS8qIHNlY3VyZSBjb21wdXRpbmcgKi8KLSNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk5CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KLSNkZWZpbmUgVElGX1VTRURGUFUJCTE2CS8qIEZQVSB3YXMgdXNlZCBieSB0aGlzIHRhc2sgdGhpcyBxdWFudHVtIChTTVApICovCi0jZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNwkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwotI2RlZmluZSBUSUZfTUVNRElFCQkxOAotI2RlZmluZSBUSUZfRlJFRVpFCQkxOQotI2RlZmluZSBUSUZfRklYQURFCQkyMAkvKiBGaXggYWRkcmVzcyBlcnJvcnMgaW4gc29mdHdhcmUgKi8KLSNkZWZpbmUgVElGX0xPR0FERQkJMjEJLyogTG9nIGFkZHJlc3MgZXJyb3JzIHRvIHN5c2xvZyAqLwotI2RlZmluZSBUSUZfMzJCSVRfUkVHUwkJMjIJLyogYWxzbyBpbXBsaWVzIDE2LzMyIGZwcnMgKi8KLSNkZWZpbmUgVElGXzMyQklUX0FERFIJCTIzCS8qIDMyLWJpdCBhZGRyZXNzIHNwYWNlIChvMzIvbjMyKSAqLwotI2RlZmluZSBUSUZfRlBVQk9VTkQJCTI0CS8qIHRocmVhZCBib3VuZCB0byBGUFUtZnVsbCBDUFUgc2V0ICovCi0jZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTMxCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCi0KLSNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKLSNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCi0jZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQotI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDE8PFRJRl9TWVNDQUxMX0FVRElUKQotI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKLSNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCi0jZGVmaW5lIF9USUZfVVNFREZQVQkJKDE8PFRJRl9VU0VERlBVKQotI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCi0jZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKLSNkZWZpbmUgX1RJRl9GSVhBREUJCSgxPDxUSUZfRklYQURFKQotI2RlZmluZSBfVElGX0xPR0FERQkJKDE8PFRJRl9MT0dBREUpCi0jZGVmaW5lIF9USUZfMzJCSVRfUkVHUwkJKDE8PFRJRl8zMkJJVF9SRUdTKQotI2RlZmluZSBfVElGXzMyQklUX0FERFIJCSgxPDxUSUZfMzJCSVRfQUREUikKLSNkZWZpbmUgX1RJRl9GUFVCT1VORAkJKDE8PFRJRl9GUFVCT1VORCkKLQotLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwotI2RlZmluZSBfVElGX1dPUktfTUFTSwkJKDB4MDAwMGZmZWYgJiB+X1RJRl9TRUNDT01QKQotLyogd29yayB0byBkbyBvbiBhbnkgcmV0dXJuIHRvIHUtc3BhY2UgKi8KLSNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJKDB4ODAwMGZmZmYgJiB+X1RJRl9TRUNDT01QKQotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0FTTV9USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvZ2VuZXJpYy5oIGIvaW5jbHVkZS9hc20tbWlwcy90eHg5L2dlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxY2NmOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvZ2VuZXJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9nZW5lcmljLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX0FTTV9UWFg5X0dFTkVSSUNfSAotI2RlZmluZSBfX0FTTV9UWFg5X0dFTkVSSUNfSAotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiBmb3Igc3RydWN0IHJlc291cmNlICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgdHh4OV9jZV9yZXNbXTsKLSNkZWZpbmUgVFhYOV9DRShuKQkodW5zaWduZWQgbG9uZykodHh4OV9jZV9yZXNbKG4pXS5zdGFydCkKLWV4dGVybiB1bnNpZ25lZCBpbnQgdHh4OV9wY29kZTsKLWV4dGVybiBjaGFyIHR4eDlfcGNvZGVfc3RyWzhdOwotdm9pZCB0eHg5X3JlZ19yZXNfaW5pdCh1bnNpZ25lZCBpbnQgcGNvZGUsIHVuc2lnbmVkIGxvbmcgYmFzZSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgdHh4OV9tYXN0ZXJfY2xvY2s7Ci1leHRlcm4gdW5zaWduZWQgaW50IHR4eDlfY3B1X2Nsb2NrOwotZXh0ZXJuIHVuc2lnbmVkIGludCB0eHg5X2didXNfY2xvY2s7Ci0jZGVmaW5lIFRYWDlfSU1DTEsJKHR4eDlfZ2J1c19jbG9jayAvIDIpCi0KLWV4dGVybiBpbnQgdHh4OV9jY2ZnX3RvZW9uOwotc3RydWN0IHVhcnRfcG9ydDsKLWludCBlYXJseV9zZXJpYWxfdHh4OV9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLQotc3RydWN0IHBjaV9kZXY7Ci1zdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgewotCWNvbnN0IGNoYXIgKnN5c3RlbTsKLQl2b2lkICgqcHJvbV9pbml0KSh2b2lkKTsKLQl2b2lkICgqbWVtX3NldHVwKSh2b2lkKTsKLQl2b2lkICgqaXJxX3NldHVwKSh2b2lkKTsKLQl2b2lkICgqdGltZV9pbml0KSh2b2lkKTsKLQl2b2lkICgqYXJjaF9pbml0KSh2b2lkKTsKLQl2b2lkICgqZGV2aWNlX2luaXQpKHZvaWQpOwotI2lmZGVmIENPTkZJR19QQ0kKLQlpbnQgKCpwY2lfbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKLSNlbmRpZgotfTsKLWV4dGVybiBzdHJ1Y3QgdHh4OV9ib2FyZF92ZWMgKnR4eDlfYm9hcmRfdmVjOwotZXh0ZXJuIGludCAoKnR4eDlfaXJxX2Rpc3BhdGNoKShpbnQgcGVuZGluZyk7Ci12b2lkIHByb21faW5pdF9jbWRsaW5lKHZvaWQpOwotY2hhciAqcHJvbV9nZXRjbWRsaW5lKHZvaWQpOwotdm9pZCB0eHg5X3dkdF9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZSk7Ci12b2lkIHR4eDlfc3BpX2luaXQoaW50IGJ1c2lkLCB1bnNpZ25lZCBsb25nIGJhc2UsIGludCBpcnEpOwotdm9pZCB0eHg5X2V0aGFkZHJfaW5pdCh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGNoYXIgKmV0aGFkZHIpOwotdm9pZCB0eHg5X3Npb19pbml0KHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIsIGludCBpcnEsCi0JCSAgIHVuc2lnbmVkIGludCBsaW5lLCB1bnNpZ25lZCBpbnQgc2NsaywgaW50IG5vY3RzKTsKLXZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYyk7Ci0jaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwotZXh0ZXJuIHZvaWQgKCp0eHg5X3Byb21fcHV0Y2hhcikoY2hhciBjKTsKLXZvaWQgdHh4OV9zaW9fcHV0Y2hhcl9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZWFkZHIpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCB0eHg5X3Npb19wdXRjaGFyX2luaXQodW5zaWduZWQgbG9uZyBiYXNlYWRkcikKLXsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19BU01fVFhYOV9HRU5FUklDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9yYnR4NDkyNy5oIGIvaW5jbHVkZS9hc20tbWlwcy90eHg5L3JidHg0OTI3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2VjOTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90eHg5L3JidHg0OTI3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogQ29weXJpZ2h0IDIwMDEtMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCi0gKiAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCi0gKiAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgotICogIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKLSAqICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaWZuZGVmIF9fQVNNX1RYWDlfUkJUWDQ5MjdfSAotI2RlZmluZSBfX0FTTV9UWFg5X1JCVFg0OTI3X0gKLQotI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkyNy5oPgotCi0jZGVmaW5lIFJCVFg0OTI3X1BDSU1FTQkJMHgwODAwMDAwMAotI2RlZmluZSBSQlRYNDkyN19QQ0lNRU1fU0laRQkweDA4MDAwMDAwCi0jZGVmaW5lIFJCVFg0OTI3X1BDSUlPCQkweDE2MDAwMDAwCi0jZGVmaW5lIFJCVFg0OTI3X1BDSUlPX1NJWkUJMHgwMTAwMDAwMAotCi0jZGVmaW5lIFJCVFg0OTI3X0lNQVNLX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwMjAwMCkKLSNkZWZpbmUgUkJUWDQ5MjdfSU1TVEFUX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwMjAwNikKLSNkZWZpbmUgUkJUWDQ5MjdfU09GVFJFU0VUX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwZjAwMCkKLSNkZWZpbmUgUkJUWDQ5MjdfU09GVFJFU0VUTE9DS19BRERSCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMGYwMDIpCi0jZGVmaW5lIFJCVFg0OTI3X1BDSVJFU0VUX0FERFIJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAwZjAwNikKLSNkZWZpbmUgUkJUWDQ5MjdfQlJBTVJUQ19CQVNFCShJT19CQVNFICsgVFhYOV9DRSgyKSArIDB4MDAwMTAwMDApCi0jZGVmaW5lIFJCVFg0OTI3X0VUSEVSX0JBU0UJKElPX0JBU0UgKyBUWFg5X0NFKDIpICsgMHgwMDAyMDAwMCkKLQotLyogRXRoZXJuZXQgcG9ydCBhZGRyZXNzICovCi0jZGVmaW5lIFJCVFg0OTI3X0VUSEVSX0FERFIJKFJCVFg0OTI3X0VUSEVSX0JBU0UgKyAweDI4MCkKLQotI2RlZmluZSByYnR4NDkyN19pbWFza19hZGRyCSgoX191OCBfX2lvbWVtICopUkJUWDQ5MjdfSU1BU0tfQUREUikKLSNkZWZpbmUgcmJ0eDQ5MjdfaW1zdGF0X2FkZHIJKChfX3U4IF9faW9tZW0gKilSQlRYNDkyN19JTVNUQVRfQUREUikKLSNkZWZpbmUgcmJ0eDQ5Mjdfc29mdHJlc2V0X2FkZHIJKChfX3U4IF9faW9tZW0gKilSQlRYNDkyN19TT0ZUUkVTRVRfQUREUikKLSNkZWZpbmUgcmJ0eDQ5Mjdfc29mdHJlc2V0bG9ja19hZGRyCVwKLQkJCQkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X1NPRlRSRVNFVExPQ0tfQUREUikKLSNkZWZpbmUgcmJ0eDQ5MjdfcGNpcmVzZXRfYWRkcgkoKF9fdTggX19pb21lbSAqKVJCVFg0OTI3X1BDSVJFU0VUX0FERFIpCi0KLS8qIGJpdHMgZm9yIElTVEFUL0lNQVNLL0lNU1RBVCAqLwotI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUQJMAotI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUMJMQotI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUIJMgotI2RlZmluZSBSQlRYNDkyN19JTlRCX1BDSUEJMwotI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUQJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lEKQotI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUMJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lDKQotI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUIJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lCKQotI2RlZmluZSBSQlRYNDkyN19JTlRGX1BDSUEJKDEgPDwgUkJUWDQ5MjdfSU5UQl9QQ0lBKQotCi0jZGVmaW5lIFJCVFg0OTI3X05SX0lSUV9JT0MJOAkvKiBJT0MgKi8KLQotI2RlZmluZSBSQlRYNDkyN19JUlFfSU9DCShUWFg5X0lSUV9CQVNFICsgVFg0OTI3X05VTV9JUikKLSNkZWZpbmUgUkJUWDQ5MjdfSVJRX0lPQ19QQ0lECShSQlRYNDkyN19JUlFfSU9DICsgUkJUWDQ5MjdfSU5UQl9QQ0lEKQotI2RlZmluZSBSQlRYNDkyN19JUlFfSU9DX1BDSUMJKFJCVFg0OTI3X0lSUV9JT0MgKyBSQlRYNDkyN19JTlRCX1BDSUMpCi0jZGVmaW5lIFJCVFg0OTI3X0lSUV9JT0NfUENJQgkoUkJUWDQ5MjdfSVJRX0lPQyArIFJCVFg0OTI3X0lOVEJfUENJQikKLSNkZWZpbmUgUkJUWDQ5MjdfSVJRX0lPQ19QQ0lBCShSQlRYNDkyN19JUlFfSU9DICsgUkJUWDQ5MjdfSU5UQl9QQ0lBKQotCi0jZGVmaW5lIFJCVFg0OTI3X0lSUV9JT0NJTlQJKFRYWDlfSVJRX0JBU0UgKyBUWDQ5MjdfSVJfSU5UKDEpKQotCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBSQlRYNDkyN19JU0FfSU9fT0ZGU0VUIFJCVFg0OTI3X1BDSUlPCi0jZWxzZQotI2RlZmluZSBSQlRYNDkyN19JU0FfSU9fT0ZGU0VUIDAKLSNlbmRpZgotCi0jZGVmaW5lIFJCVFg0OTI3X1JUTF84MDE5X0JBU0UgKFJCVFg0OTI3X0VUSEVSX0FERFIgLSBtaXBzX2lvX3BvcnRfYmFzZSkKLSNkZWZpbmUgUkJUWDQ5MjdfUlRMXzgwMTlfSVJRICAoVFhYOV9JUlFfQkFTRSArIFRYNDkyN19JUl9JTlQoMykpCi0KLXZvaWQgcmJ0eDQ5MjdfcHJvbV9pbml0KHZvaWQpOwotdm9pZCByYnR4NDkyN19pcnFfc2V0dXAodm9pZCk7Ci1zdHJ1Y3QgcGNpX2RldjsKLWludCByYnR4NDkyN19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwotCi0jZW5kaWYgLyogX19BU01fVFhYOV9SQlRYNDkyN19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvc21zY19mZGMzN204MXguaCBiL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9zbXNjX2ZkYzM3bTgxeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmUxNjFkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvc21zY19mZGMzN204MXguaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBJbnRlcmZhY2UgZm9yIHNtc2MgZmRjNDhtODF4IFN1cGVyIElPIGNoaXAKLSAqCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gc291cmNlQG12aXN0YS5jb20KLSAqCi0gKiAyMDAxLTIwMDMgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogTWFuaXNoIExhY2h3YW5pLCBtbGFjaHdhbmlAbXZpc3RhLmNvbQotICovCi0KLSNpZm5kZWYgX1NNU0NfRkRDMzdNODFYX0hfCi0jZGVmaW5lIF9TTVNDX0ZEQzM3TTgxWF9IXwotCi0vKiBDb21tb24gUmVnaXN0ZXJzICovCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19JTkRFWCAgMHgwMAotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfREFUQSAgIDB4MDEKLSNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORiAgICAgICAgICAweDAyCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0lOREVYICAgICAgICAgMHgwMwotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9ETlVNICAgICAgICAgIDB4MDcKLSNkZWZpbmUgU01TQ19GREMzN004MVhfRElEICAgICAgICAgICAweDIwCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0RSRVYgICAgICAgICAgMHgyMQotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9QQ05UICAgICAgICAgIDB4MjIKLSNkZWZpbmUgU01TQ19GREMzN004MVhfUE1HVCAgICAgICAgICAweDIzCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX09TQyAgICAgICAgICAgMHgyNAotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GUEEwICAgICAgIDB4MjYKLSNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORlBBMSAgICAgICAweDI3Ci0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1Q0ICAgICAgICAgMHgyQgotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUNSAgICAgICAgIDB4MkMKLSNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDEgICAgICAgICAweDJECi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1QyICAgICAgICAgMHgyRQotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUMyAgICAgICAgIDB4MkYKLQotLyogTG9naWNhbCBkZXZpY2UgbnVtYmVycyAqLwotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9GREQgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgU01TQ19GREMzN004MVhfUEFSQUxMRUwgICAgICAweDAzCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX1NFUklBTDEgICAgICAgMHgwNAotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9TRVJJQUwyICAgICAgIDB4MDUKLSNkZWZpbmUgU01TQ19GREMzN004MVhfS0JEICAgICAgICAgICAweDA3Ci0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0FVWElPICAgICAgICAgMHgwOAotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9OT05FICAgICAgICAgIDB4ZmYKLQotLyogTG9naWNhbCBkZXZpY2UgQ29uZmlnIFJlZ2lzdGVycyAqLwotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9BQ1RJVkUgICAgICAgIDB4MzAKLSNkZWZpbmUgU01TQ19GREMzN004MVhfQkFTRUFERFIwICAgICAweDYwCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0JBU0VBRERSMSAgICAgMHg2MQotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9JTlQgICAgICAgICAgIDB4NzAKLSNkZWZpbmUgU01TQ19GREMzN004MVhfSU5UMiAgICAgICAgICAweDcyCi0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0xEQ1JfRjAgICAgICAgMHhGMAotCi0vKiBDaGlwIENvbmZpZyBWYWx1ZXMgKi8KLSNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORklHX0VOVEVSICAweDU1Ci0jZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19FWElUICAgMHhhYQotI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DSElQX0lEICAgICAgIDB4NGQKLQotdW5zaWduZWQgbG9uZyBzbXNjX2ZkYzM3bTgxeF9pbml0KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLXZvaWQgc21zY19mZGMzN204MXhfY29uZmlnX2JlZyh2b2lkKTsKLQotdm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfZW5kKHZvaWQpOwotCi12b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19zZXQodTggcmVnLCB1OCB2YWwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9zcGkuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS9zcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYjJhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvc3BpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogRGVmaW5pdGlvbnMgZm9yIFRYNDkzNy9UWDQ5MzggU1BJCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgotICoKLSAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKLSAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqCi0gKiBTdXBwb3J0IGZvciBUWDQ5MzggaW4gMi42IC0gTWFuaXNoIExhY2h3YW5pIChtbGFjaHdhbmlAbXZpc3RhLmNvbSkKLSAqLwotI2lmbmRlZiBfX0FTTV9UWFg5X1NQSV9ICi0jZGVmaW5lIF9fQVNNX1RYWDlfU1BJX0gKLQotZXh0ZXJuIGludCBzcGlfZWVwcm9tX3JlZ2lzdGVyKGludCBjaGlwaWQpOwotZXh0ZXJuIGludCBzcGlfZWVwcm9tX3JlYWQoaW50IGNoaXBpZCwgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9UWFg5X1NQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvdHgzOTI3LmggYi9pbmNsdWRlL2FzbS1taXBzL3R4eDkvdHgzOTI3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2RlYjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90eHg5L3R4MzkyNy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgVG9zaGliYSBDb3Jwb3JhdGlvbgotICovCi0jaWZuZGVmIF9fQVNNX1RYWDlfVFgzOTI3X0gKLSNkZWZpbmUgX19BU01fVFhYOV9UWDM5MjdfSAotCi0jZGVmaW5lIFRYMzkyN19SRUdfQkFTRQkweGZmZmUwMDAwVUwKLSNkZWZpbmUgVFgzOTI3X1JFR19TSVpFCTB4MDAwMTAwMDAKLSNkZWZpbmUgVFgzOTI3X1NEUkFNQ19SRUcJKFRYMzkyN19SRUdfQkFTRSArIDB4ODAwMCkKLSNkZWZpbmUgVFgzOTI3X1JPTUNfUkVHCQkoVFgzOTI3X1JFR19CQVNFICsgMHg5MDAwKQotI2RlZmluZSBUWDM5MjdfRE1BX1JFRwkJKFRYMzkyN19SRUdfQkFTRSArIDB4YjAwMCkKLSNkZWZpbmUgVFgzOTI3X0lSQ19SRUcJCShUWDM5MjdfUkVHX0JBU0UgKyAweGMwMDApCi0jZGVmaW5lIFRYMzkyN19QQ0lDX1JFRwkJKFRYMzkyN19SRUdfQkFTRSArIDB4ZDAwMCkKLSNkZWZpbmUgVFgzOTI3X0NDRkdfUkVHCQkoVFgzOTI3X1JFR19CQVNFICsgMHhlMDAwKQotI2RlZmluZSBUWDM5MjdfTlJfVE1SCTMKLSNkZWZpbmUgVFgzOTI3X1RNUl9SRUcoY2gpCShUWDM5MjdfUkVHX0JBU0UgKyAweGYwMDAgKyAoY2gpICogMHgxMDApCi0jZGVmaW5lIFRYMzkyN19OUl9TSU8JMgotI2RlZmluZSBUWDM5MjdfU0lPX1JFRyhjaCkJKFRYMzkyN19SRUdfQkFTRSArIDB4ZjMwMCArIChjaCkgKiAweDEwMCkKLSNkZWZpbmUgVFgzOTI3X1BJT19SRUcJCShUWDM5MjdfUkVHX0JBU0UgKyAweGY1MDApCi0KLXN0cnVjdCB0eDM5Mjdfc2RyYW1jX3JlZyB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjcls4XTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRyWzNdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY21kOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc21yc1syXTsKLX07Ci0KLXN0cnVjdCB0eDM5Mjdfcm9tY19yZWcgewotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY3JbOF07Ci19OwotCi1zdHJ1Y3QgdHgzOTI3X2RtYV9yZWcgewotCXN0cnVjdCB0eDM5MjdfZG1hX2NoX3JlZyB7Ci0JCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY2hhOwotCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNhcjsKLQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkYXI7Ci0JCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY250cjsKLQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzYWlyOwotCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGRhaXI7Ci0JCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY2NyOwotCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNzcjsKLQl9IGNoWzRdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGJyWzhdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGRocjsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG1jcjsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVudXNlZDA7Ci19OwotCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0jaWZkZWYgX19CSUdfRU5ESUFOCi0jZGVmaW5lIGVuZGlhbl9kZWZfczIoZTEsIGUyKQlcCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTEsIGUyCi0jZGVmaW5lIGVuZGlhbl9kZWZfc2IyKGUxLCBlMiwgZTMpCVwKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBlMTt2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGUyLCBlMwotI2RlZmluZSBlbmRpYW5fZGVmX2IycyhlMSwgZTIsIGUzKQlcCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBlMSwgZTI7dm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTMKLSNkZWZpbmUgZW5kaWFuX2RlZl9iNChlMSwgZTIsIGUzLCBlNCkJXAotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZTEsIGUyLCBlMywgZTQKLSNlbHNlCi0jZGVmaW5lIGVuZGlhbl9kZWZfczIoZTEsIGUyKQlcCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTIsIGUxCi0jZGVmaW5lIGVuZGlhbl9kZWZfc2IyKGUxLCBlMiwgZTMpCVwKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGUzLCBlMjt2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBlMQotI2RlZmluZSBlbmRpYW5fZGVmX2IycyhlMSwgZTIsIGUzKQlcCi0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZTM7dm9sYXRpbGUgdW5zaWduZWQgY2hhciBlMiwgZTEKLSNkZWZpbmUgZW5kaWFuX2RlZl9iNChlMSwgZTIsIGUzLCBlNCkJXAotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZTQsIGUzLCBlMiwgZTEKLSNlbmRpZgotCi1zdHJ1Y3QgdHgzOTI3X3BjaWNfcmVnIHsKLQllbmRpYW5fZGVmX3MyKGRpZCwgdmlkKTsKLQllbmRpYW5fZGVmX3MyKHBjaXN0YXQsIHBjaWNtZCk7Ci0JZW5kaWFuX2RlZl9iNChjYywgc2NjLCBycGxpLCByaWQpOwotCWVuZGlhbl9kZWZfYjQodW51c2VkMCwgaHQsIG1sdCwgY2xzKTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlvYmE7CQkvKiArMTAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG1iYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVudXNlZDFbNV07Ci0JZW5kaWFuX2RlZl9zMihzdmlkLCBzc3ZpZCk7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQyOwkJLyogKzMwICovCi0JZW5kaWFuX2RlZl9zYjIodW51c2VkMywgdW51c2VkNCwgY2FwcHRyKTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVudXNlZDU7Ci0JZW5kaWFuX2RlZl9iNChtbCwgbWcsIGlwLCBpbCk7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQ2OwkJLyogKzQwICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpc3RhdDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlpbTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHJydDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVudXNlZDdbM107CQkvKiArNTAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlwYm1tYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlwYmlvbWE7CQkvKiArNjAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlsYm1tYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlsYmlvbWE7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQ4WzldOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGM7CQkvKiArOTAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRzdGF0OwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGltOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGNjbWQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwY2lycnQ7CQkvKiArYTAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBjaXJydF9jbWQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwY2lycmR0OwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdW51c2VkOVszXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRsYm9hcDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRsYmlhcDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRsYm1tYTsJCS8qICtjMCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGxiaW9tYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNjX21zZzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNjX2JlOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGJsOwkJLyogK2QwICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQxMFszXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHB3bW5nOwkJLyogK2UwICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwd21uZ3M7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1bnVzZWQxMVs2XTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHJlcV90cmFjZTsJCS8qICsxMDAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBiYXBtYzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBiYXBtczsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBiYXBtaW07Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBibTsJCS8qICsxMTAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNwY2licnM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjcGNpYmdzOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGJhY3M7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpb2JhczsJCS8qICsxMjAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG1iYXM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYmM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYnN0YXQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsYmltOwkJLyogKzEzMCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGNpc3RhdGltOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaWNhOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaWNkOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaWlhZHA7CQkvKiArMTQwICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpc2NkcDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG1tYXM7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpb21hczsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGlwY2lhZGRyOwkJLyogKzE1MCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgaXBjaWRhdGE7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcGNpYmU7Ci19OwotCi1zdHJ1Y3QgdHgzOTI3X2NjZmdfcmVnIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNjZmc7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjcmlyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcGNmZzsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRlYXI7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBwZGNyOwotfTsKLQotLyoKLSAqIFNEUkFNQwotICovCi0KLS8qCi0gKiBST01DCi0gKi8KLQotLyoKLSAqIERNQQotICovCi0vKiBiaXRzIGZvciBNQ1IgKi8KLSNkZWZpbmUgVFgzOTI3X0RNQV9NQ1JfRUlTKGNoKQkoMHgxMDAwMDAwMDw8KGNoKSkKLSNkZWZpbmUgVFgzOTI3X0RNQV9NQ1JfRElTKGNoKQkoMHgwMTAwMDAwMDw8KGNoKSkKLSNkZWZpbmUgVFgzOTI3X0RNQV9NQ1JfUlNGSUYJMHgwMDAwMDA4MAotI2RlZmluZSBUWDM5MjdfRE1BX01DUl9GSUZVTShjaCkJKDB4MDAwMDAwMDg8PChjaCkpCi0jZGVmaW5lIFRYMzkyN19ETUFfTUNSX0xFCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFgzOTI3X0RNQV9NQ1JfUlBSVAkweDAwMDAwMDAyCi0jZGVmaW5lIFRYMzkyN19ETUFfTUNSX01TVEVOCTB4MDAwMDAwMDEKLQotLyogYml0cyBmb3IgQ0NSbiAqLwotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9EQklOSAkweDA0MDAwMDAwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1NCSU5ICTB4MDIwMDAwMDAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfQ0hSU1QJMHgwMTAwMDAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9SVkJZVEUJMHgwMDgwMDAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9BQ0tQT0wJMHgwMDQwMDAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9SRVFQTAkweDAwMjAwMDAwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0VHUkVRCTB4MDAxMDAwMDAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfQ0hETgkweDAwMDgwMDAwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0ROQ1RMCTB4MDAwNjAwMDAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfRVhUUlEJMHgwMDAxMDAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9JTlRSUUQJMHgwMDAwZTAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9JTlRFTkUJMHgwMDAwMTAwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9JTlRFTkMJMHgwMDAwMDgwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9JTlRFTlQJMHgwMDAwMDQwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9DSE5FTgkweDAwMDAwMjAwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGQUNUCTB4MDAwMDAxMDAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfU05PUAkweDAwMDAwMDgwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX0RTVElOQwkweDAwMDAwMDQwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1NSQ0lOQwkweDAwMDAwMDIwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGU1oob3JkZXIpCSgoKG9yZGVyKSA8PCAyKSAmIDB4MDAwMDAwMWMpCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGU1pfMVcJVFgzOTI3X0RNQV9DQ1JfWEZTWigyKQotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9YRlNaXzRXCVRYMzkyN19ETUFfQ0NSX1hGU1ooNCkKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfWEZTWl84VwlUWDM5MjdfRE1BX0NDUl9YRlNaKDUpCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX1hGU1pfMTZXCVRYMzkyN19ETUFfQ0NSX1hGU1ooNikKLSNkZWZpbmUgVFgzOTI3X0RNQV9DQ1JfWEZTWl8zMlcJVFgzOTI3X0RNQV9DQ1JfWEZTWig3KQotI2RlZmluZSBUWDM5MjdfRE1BX0NDUl9NRU1JTwkweDAwMDAwMDAyCi0jZGVmaW5lIFRYMzkyN19ETUFfQ0NSX09ORUFECTB4MDAwMDAwMDEKLQotLyogYml0cyBmb3IgQ1NSbiAqLwotI2RlZmluZSBUWDM5MjdfRE1BX0NTUl9DSE5BQ1QJMHgwMDAwMDEwMAotI2RlZmluZSBUWDM5MjdfRE1BX0NTUl9BQkNIQwkweDAwMDAwMDgwCi0jZGVmaW5lIFRYMzkyN19ETUFfQ1NSX05DSE5DCTB4MDAwMDAwNDAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfTlRSTkZDCTB4MDAwMDAwMjAKLSNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfRVhURE4JMHgwMDAwMDAxMAotI2RlZmluZSBUWDM5MjdfRE1BX0NTUl9DRkVSUgkweDAwMDAwMDA4Ci0jZGVmaW5lIFRYMzkyN19ETUFfQ1NSX0NIRVJSCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfREVTRVJSCTB4MDAwMDAwMDIKLSNkZWZpbmUgVFgzOTI3X0RNQV9DU1JfU09SRVJSCTB4MDAwMDAwMDEKLQotLyoKLSAqIElSQwotICovCi0jZGVmaW5lIFRYMzkyN19JUl9JTlQwCTAKLSNkZWZpbmUgVFgzOTI3X0lSX0lOVDEJMQotI2RlZmluZSBUWDM5MjdfSVJfSU5UMgkyCi0jZGVmaW5lIFRYMzkyN19JUl9JTlQzCTMKLSNkZWZpbmUgVFgzOTI3X0lSX0lOVDQJNAotI2RlZmluZSBUWDM5MjdfSVJfSU5UNQk1Ci0jZGVmaW5lIFRYMzkyN19JUl9TSU8wCTYKLSNkZWZpbmUgVFgzOTI3X0lSX1NJTzEJNwotI2RlZmluZSBUWDM5MjdfSVJfU0lPKGNoKQkoNiArIChjaCkpCi0jZGVmaW5lIFRYMzkyN19JUl9ETUEJOAotI2RlZmluZSBUWDM5MjdfSVJfUElPCTkKLSNkZWZpbmUgVFgzOTI3X0lSX1BDSQkxMAotI2RlZmluZSBUWDM5MjdfSVJfVE1SKGNoKQkoMTMgKyAoY2gpKQotI2RlZmluZSBUWDM5MjdfTlVNX0lSCTE2Ci0KLS8qCi0gKiBQQ0lDCi0gKi8KLS8qIGJpdHMgZm9yIFBDSUNNRCAqLwotLyogc2VlIFBDSV9DT01NQU5EX1hYWCBpbiBsaW51eC9wY2kuaCAqLwotCi0vKiBiaXRzIGZvciBQQ0lTVEFUICovCi0vKiBzZWUgUENJX1NUQVRVU19YWFggaW4gbGludXgvcGNpLmggKi8KLSNkZWZpbmUgUENJX1NUQVRVU19ORVdfQ0FQCTB4MDAxMAotCi0vKiBiaXRzIGZvciBJU1RBVC9JSU0gKi8KLSNkZWZpbmUgVFgzOTI3X1BDSUNfSUlNX0FMTAkweDAwMDAxNjAwCi0KLS8qIGJpdHMgZm9yIFRDICovCi0jZGVmaW5lIFRYMzkyN19QQ0lDX1RDX09GMTZFCTB4MDAwMDAwMjAKLSNkZWZpbmUgVFgzOTI3X1BDSUNfVENfSUY4RQkweDAwMDAwMDEwCi0jZGVmaW5lIFRYMzkyN19QQ0lDX1RDX09GOEUJMHgwMDAwMDAwOAotCi0vKiBiaXRzIGZvciBUU1RBVC9USU0gKi8KLSNkZWZpbmUgVFgzOTI3X1BDSUNfVElNX0FMTAkweDAwMDNmZmZmCi0KLS8qIGJpdHMgZm9yIElPQkEvTUJBICovCi0vKiBzZWUgUENJX0JBU0VfQUREUkVTU19YWFggaW4gbGludXgvcGNpLmggKi8KLQotLyogYml0cyBmb3IgUEJBUE1DICovCi0jZGVmaW5lIFRYMzkyN19QQ0lDX1BCQVBNQ19SUEJBCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFgzOTI3X1BDSUNfUEJBUE1DX1BCQUVOCTB4MDAwMDAwMDIKLSNkZWZpbmUgVFgzOTI3X1BDSUNfUEJBUE1DX0JNQ0VOCTB4MDAwMDAwMDEKLQotLyogYml0cyBmb3IgTEJTVEFUL0xCSU0gKi8KLSNkZWZpbmUgVFgzOTI3X1BDSUNfTEJJTV9BTEwJMHgwMDAwMDAzZQotCi0vKiBiaXRzIGZvciBQQ0lTVEFUSU0gKHNlZSBhbHNvIFBDSV9TVEFUVVNfWFhYIGluIGxpbnV4L3BjaS5oICovCi0jZGVmaW5lIFRYMzkyN19QQ0lDX1BDSVNUQVRJTV9BTEwJMHgwMDAwZjkwMAotCi0vKiBiaXRzIGZvciBMQkMgKi8KLSNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX0lCU0UJMHgwMDAwNDAwMAotI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfVElCU0UJMHgwMDAwMjAwMAotI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfVE1GQlNFCTB4MDAwMDEwMDAKLSNkZWZpbmUgVFgzOTI3X1BDSUNfTEJDX0hSU1QJMHgwMDAwMDgwMAotI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfU1JTVAkweDAwMDAwNDAwCi0jZGVmaW5lIFRYMzkyN19QQ0lDX0xCQ19FUENBRAkweDAwMDAwMjAwCi0jZGVmaW5lIFRYMzkyN19QQ0lDX0xCQ19NU0RTRQkweDAwMDAwMTAwCi0jZGVmaW5lIFRYMzkyN19QQ0lDX0xCQ19DUlIJMHgwMDAwMDA4MAotI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfSUxNREUJMHgwMDAwMDA0MAotI2RlZmluZSBUWDM5MjdfUENJQ19MQkNfSUxJREUJMHgwMDAwMDAyMAotCi0jZGVmaW5lIFRYMzkyN19QQ0lDX0lEU0VMX0FEX1RPX1NMT1QoYWQpCSgoYWQpIC0gMTEpCi0jZGVmaW5lIFRYMzkyN19QQ0lDX01BWF9ERVZOVQlUWDM5MjdfUENJQ19JRFNFTF9BRF9UT19TTE9UKDMyKQotCi0vKgotICogQ0NGRwotICovCi0vKiBDQ0ZHIDogQ2hpcCBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX1RMQk9GRgkweDAwMDIwMDAwCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX0JFT1cJMHgwMDAxMDAwMAotI2RlZmluZSBUWDM5MjdfQ0NGR19XUgkweDAwMDA4MDAwCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX1RPRQkweDAwMDA0MDAwCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX1BDSVhBUkIJMHgwMDAwMjAwMAotI2RlZmluZSBUWDM5MjdfQ0NGR19QQ0kzCTB4MDAwMDEwMDAKLSNkZWZpbmUgVFgzOTI3X0NDRkdfUFNOUAkweDAwMDAwODAwCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX1BQUkkJMHgwMDAwMDQwMAotI2RlZmluZSBUWDM5MjdfQ0NGR19QTExNCTB4MDAwMDAwMzAKLSNkZWZpbmUgVFgzOTI3X0NDRkdfRU5ESUFOCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFgzOTI3X0NDRkdfSEFMVAkweDAwMDAwMDAyCi0jZGVmaW5lIFRYMzkyN19DQ0ZHX0FDRUhPTEQJMHgwMDAwMDAwMQotCi0vKiBQQ0ZHIDogUGluIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgVFgzOTI3X1BDRkdfU1lTQ0xLRU4JMHgwODAwMDAwMAotI2RlZmluZSBUWDM5MjdfUENGR19TRFJDTEtFTl9BTEwJMHgwN2MwMDAwMAotI2RlZmluZSBUWDM5MjdfUENGR19TRFJDTEtFTihjaCkJKDB4MDA0MDAwMDA8PChjaCkpCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1BDSUNMS0VOX0FMTAkweDAwM2MwMDAwCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1BDSUNMS0VOKGNoKQkoMHgwMDA0MDAwMDw8KGNoKSkKLSNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMQUxMCTB4MDAwM2ZmZmYKLSNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMQ1MJMHgwMDAyMDAwMAotI2RlZmluZSBUWDM5MjdfUENGR19TRUxEU0YJMHgwMDAxMDAwMAotI2RlZmluZSBUWDM5MjdfUENGR19TRUxTSU9DX0FMTAkweDAwMDBjMDAwCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTFNJT0MoY2gpCSgweDAwMDA0MDAwPDwoY2gpKQotI2RlZmluZSBUWDM5MjdfUENGR19TRUxTSU9fQUxMCTB4MDAwMDMwMDAKLSNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMU0lPKGNoKQkoMHgwMDAwMTAwMDw8KGNoKSkKLSNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMVE1SX0FMTAkweDAwMDAwZTAwCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTFRNUihjaCkJKDB4MDAwMDAyMDA8PChjaCkpCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTERPTkUJMHgwMDAwMDEwMAotI2RlZmluZSBUWDM5MjdfUENGR19JTlRETUFfQUxMCTB4MDAwMDAwZjAKLSNkZWZpbmUgVFgzOTI3X1BDRkdfSU5URE1BKGNoKQkoMHgwMDAwMDAxMDw8KGNoKSkKLSNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMRE1BX0FMTAkweDAwMDAwMDBmCi0jZGVmaW5lIFRYMzkyN19QQ0ZHX1NFTERNQShjaCkJKDB4MDAwMDAwMDE8PChjaCkpCi0KLSNkZWZpbmUgdHgzOTI3X3NkcmFtY3B0cgkoKHN0cnVjdCB0eDM5Mjdfc2RyYW1jX3JlZyAqKVRYMzkyN19TRFJBTUNfUkVHKQotI2RlZmluZSB0eDM5Mjdfcm9tY3B0cgkJKChzdHJ1Y3QgdHgzOTI3X3JvbWNfcmVnICopVFgzOTI3X1JPTUNfUkVHKQotI2RlZmluZSB0eDM5MjdfZG1hcHRyCQkoKHN0cnVjdCB0eDM5MjdfZG1hX3JlZyAqKVRYMzkyN19ETUFfUkVHKQotI2RlZmluZSB0eDM5MjdfcGNpY3B0cgkJKChzdHJ1Y3QgdHgzOTI3X3BjaWNfcmVnICopVFgzOTI3X1BDSUNfUkVHKQotI2RlZmluZSB0eDM5MjdfY2NmZ3B0cgkJKChzdHJ1Y3QgdHgzOTI3X2NjZmdfcmVnICopVFgzOTI3X0NDRkdfUkVHKQotI2RlZmluZSB0eDM5Mjdfc2lvcHRyKGNoKQkoKHN0cnVjdCB0eHg5Mjdfc2lvX3JlZyAqKVRYMzkyN19TSU9fUkVHKGNoKSkKLSNkZWZpbmUgdHgzOTI3X3Bpb3B0cgkJKChzdHJ1Y3QgdHh4OV9waW9fcmVnIF9faW9tZW0gKilUWDM5MjdfUElPX1JFRykKLQotI2RlZmluZSBUWDM5MjdfUkVWX1BDT0RFKCkJKHR4MzkyN19jY2ZncHRyLT5jcmlyID4+IDE2KQotI2RlZmluZSBUWDM5MjdfUk9NQ19CQShjaCkJKHR4MzkyN19yb21jcHRyLT5jclsoY2gpXSAmIDB4ZmZmMDAwMDApCi0jZGVmaW5lIFRYMzkyN19ST01DX1NJWkUoY2gpCVwKLQkoMHgwMDEwMDAwMCA8PCAoKHR4MzkyN19yb21jcHRyLT5jclsoY2gpXSA+PiA4KSAmIDB4ZikpCi0KLXZvaWQgdHgzOTI3X3dkdF9pbml0KHZvaWQpOwotdm9pZCB0eDM5Mjdfc2V0dXAodm9pZCk7Ci12b2lkIHR4MzkyN190aW1lX2luaXQodW5zaWduZWQgaW50IGV2dF90bXJuciwgdW5zaWduZWQgaW50IHNyY190bXJucik7Ci12b2lkIHR4MzkyN19zaW9faW5pdCh1bnNpZ25lZCBpbnQgc2NsaywgdW5zaWduZWQgaW50IGN0c19tYXNrKTsKLXN0cnVjdCBwY2lfY29udHJvbGxlcjsKLXZvaWQgdHgzOTI3X3BjaWNfc2V0dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpjaGFubmVsLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzZHJhbV9zaXplLCBpbnQgZXh0YXJiKTsKLXZvaWQgdHgzOTI3X3NldHVwX3BjaWVycl9pcnEodm9pZCk7Ci12b2lkIHR4MzkyN19pcnFfaW5pdCh2b2lkKTsKLQotI2VuZGlmIC8qIF9fQVNNX1RYWDlfVFgzOTI3X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS90eDQ5MjcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS90eDQ5MjcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1ZjY1MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvdHg0OTI3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAotICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUwotICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKLSAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCi0gKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2lmbmRlZiBfX0FTTV9UWFg5X1RYNDkyN19ICi0jZGVmaW5lIF9fQVNNX1RYWDlfVFg0OTI3X0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vdHh4OWlycS5oPgotI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkyN3BjaWMuaD4KLQotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBUWDQ5MjdfUkVHX0JBU0UJMHhmZmZmZmZmZmZmMWYwMDAwVUwKLSNlbHNlCi0jZGVmaW5lIFRYNDkyN19SRUdfQkFTRQkweGZmMWYwMDAwVUwKLSNlbmRpZgotI2RlZmluZSBUWDQ5MjdfUkVHX1NJWkUJMHgwMDAxMDAwMAotCi0jZGVmaW5lIFRYNDkyN19TRFJBTUNfUkVHCShUWDQ5MjdfUkVHX0JBU0UgKyAweDgwMDApCi0jZGVmaW5lIFRYNDkyN19FQlVTQ19SRUcJKFRYNDkyN19SRUdfQkFTRSArIDB4OTAwMCkKLSNkZWZpbmUgVFg0OTI3X1BDSUNfUkVHCQkoVFg0OTI3X1JFR19CQVNFICsgMHhkMDAwKQotI2RlZmluZSBUWDQ5MjdfQ0NGR19SRUcJCShUWDQ5MjdfUkVHX0JBU0UgKyAweGUwMDApCi0jZGVmaW5lIFRYNDkyN19JUkNfUkVHCQkoVFg0OTI3X1JFR19CQVNFICsgMHhmNjAwKQotI2RlZmluZSBUWDQ5MjdfTlJfVE1SCTMKLSNkZWZpbmUgVFg0OTI3X1RNUl9SRUcoY2gpCShUWDQ5MjdfUkVHX0JBU0UgKyAweGYwMDAgKyAoY2gpICogMHgxMDApCi0jZGVmaW5lIFRYNDkyN19OUl9TSU8JMgotI2RlZmluZSBUWDQ5MjdfU0lPX1JFRyhjaCkJKFRYNDkyN19SRUdfQkFTRSArIDB4ZjMwMCArIChjaCkgKiAweDEwMCkKLSNkZWZpbmUgVFg0OTI3X1BJT19SRUcJCShUWDQ5MjdfUkVHX0JBU0UgKyAweGY1MDApCi0KLSNkZWZpbmUgVFg0OTI3X0lSX0lOVChuKQkoMiArIChuKSkKLSNkZWZpbmUgVFg0OTI3X0lSX1NJTyhuKQkoOCArIChuKSkKLSNkZWZpbmUgVFg0OTI3X0lSX1BDSUMJCTE2Ci0jZGVmaW5lIFRYNDkyN19OVU1fSVJfVE1SCTMKLSNkZWZpbmUgVFg0OTI3X0lSX1RNUihuKQkoMTcgKyAobikpCi0jZGVmaW5lIFRYNDkyN19JUl9QQ0lFUlIJMjIKLSNkZWZpbmUgVFg0OTI3X05VTV9JUgkzMgotCi0jZGVmaW5lIFRYNDkyN19JUkNfSU5UCTIJLyogSVBbMl0gaW4gU3RhdHVzIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgVFg0OTI3X05VTV9QSU8JMTYKLQotc3RydWN0IHR4NDkyN19zZHJhbWNfcmVnIHsKLQl1NjQgY3JbNF07Ci0JdTY0IHVudXNlZDBbNF07Ci0JdTY0IHRyOwotCXU2NCB1bnVzZWQxWzJdOwotCXU2NCBjbWQ7Ci19OwotCi1zdHJ1Y3QgdHg0OTI3X2VidXNjX3JlZyB7Ci0JdTY0IGNyWzhdOwotfTsKLQotc3RydWN0IHR4NDkyN19jY2ZnX3JlZyB7Ci0JdTY0IGNjZmc7Ci0JdTY0IGNyaXI7Ci0JdTY0IHBjZmc7Ci0JdTY0IHRvZWE7Ci0JdTY0IGNsa2N0cjsKLQl1NjQgdW51c2VkMDsKLQl1NjQgZ2FyYmM7Ci0JdTY0IHVudXNlZDE7Ci0JdTY0IHVudXNlZDI7Ci0JdTY0IHJhbXA7Ci19OwotCi0vKgotICogQ0NGRwotICovCi0vKiBDQ0ZHIDogQ2hpcCBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX1dEUlNUCTB4MDAwMDAyMDAwMDAwMDAwMFVMTAotI2RlZmluZSBUWDQ5MjdfQ0NGR19XRFJFWEVOCTB4MDAwMDAxMDAwMDAwMDAwMFVMTAotI2RlZmluZSBUWDQ5MjdfQ0NGR19CQ0ZHX01BU0sJMHgwMDAwMDBmZjAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX1RJTlRESVMJMHgwMTAwMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19QQ0k2NgkweDAwODAwMDAwCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX1BDSU1PREUJMHgwMDQwMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFX01BU0sJMHgwMDBlMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFXzgJKDB4MCA8PCAxNykKLSNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV8xMgkoMHgxIDw8IDE3KQotI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFXzE2CSgweDIgPDwgMTcpCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX0RJVk1PREVfMTAJKDB4MyA8PCAxNykKLSNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV8yCSgweDQgPDwgMTcpCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX0RJVk1PREVfMwkoMHg1IDw8IDE3KQotI2RlZmluZSBUWDQ5MjdfQ0NGR19ESVZNT0RFXzQJKDB4NiA8PCAxNykKLSNkZWZpbmUgVFg0OTI3X0NDRkdfRElWTU9ERV8yXzUJKDB4NyA8PCAxNykKLSNkZWZpbmUgVFg0OTI3X0NDRkdfQkVPVwkweDAwMDEwMDAwCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX1dSCTB4MDAwMDgwMDAKLSNkZWZpbmUgVFg0OTI3X0NDRkdfVE9FCTB4MDAwMDQwMDAKLSNkZWZpbmUgVFg0OTI3X0NDRkdfUENJQVJCCTB4MDAwMDIwMDAKLSNkZWZpbmUgVFg0OTI3X0NDRkdfUENJRElWTU9ERV9NQVNLCTB4MDAwMDE4MDAKLSNkZWZpbmUgVFg0OTI3X0NDRkdfUENJRElWTU9ERV8yXzUJMHgwMDAwMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19QQ0lESVZNT0RFXzMJMHgwMDAwMDgwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19QQ0lESVZNT0RFXzUJMHgwMDAwMTAwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19QQ0lESVZNT0RFXzYJMHgwMDAwMTgwMAotI2RlZmluZSBUWDQ5MjdfQ0NGR19TWVNTUF9NQVNLCTB4MDAwMDAwYzAKLSNkZWZpbmUgVFg0OTI3X0NDRkdfRU5ESUFOCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFg0OTI3X0NDRkdfSEFMVAkweDAwMDAwMDAyCi0jZGVmaW5lIFRYNDkyN19DQ0ZHX0FDRUhPTEQJMHgwMDAwMDAwMQotI2RlZmluZSBUWDQ5MjdfQ0NGR19XMUNCSVRTCShUWDQ5MjdfQ0NGR19XRFJTVCB8IFRYNDkyN19DQ0ZHX0JFT1cpCi0KLS8qIFBDRkcgOiBQaW4gQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBUWDQ5MjdfUENGR19TRENMS0RMWV9NQVNLCTB4MzAwMDAwMDAKLSNkZWZpbmUgVFg0OTI3X1BDRkdfU0RDTEtETFkoZCkJKChkKTw8MjgpCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX1NZU0NMS0VOCTB4MDgwMDAwMDAKLSNkZWZpbmUgVFg0OTI3X1BDRkdfU0RDTEtFTl9BTEwJMHgwNzgwMDAwMAotI2RlZmluZSBUWDQ5MjdfUENGR19TRENMS0VOKGNoKQkoMHgwMDgwMDAwMDw8KGNoKSkKLSNkZWZpbmUgVFg0OTI3X1BDRkdfUENJQ0xLRU5fQUxMCTB4MDAzZjAwMDAKLSNkZWZpbmUgVFg0OTI3X1BDRkdfUENJQ0xLRU4oY2gpCSgweDAwMDEwMDAwPDwoY2gpKQotI2RlZmluZSBUWDQ5MjdfUENGR19TRUwyCTB4MDAwMDAyMDAKLSNkZWZpbmUgVFg0OTI3X1BDRkdfU0VMMQkweDAwMDAwMTAwCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTF9BTEwJMHgwMDAwMDBmZgotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwwX01BU0sJMHgwMDAwMDAwMwotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwxX01BU0sJMHgwMDAwMDAwYwotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwyX01BU0sJMHgwMDAwMDAzMAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwzX01BU0sJMHgwMDAwMDBjMAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwwX0RSUTAJMHgwMDAwMDAwMAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwwX1NJTzEJMHgwMDAwMDAwMQotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwwX0FDTDAJMHgwMDAwMDAwMgotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwwX0FDTDIJMHgwMDAwMDAwMwotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwxX0RSUTEJMHgwMDAwMDAwMAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwxX1NJTzEJMHgwMDAwMDAwNAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwxX0FDTDEJMHgwMDAwMDAwOAotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwxX0FDTDMJMHgwMDAwMDAwYwotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwyX0RSUTIJMHgwMDAwMDAwMAkvKiBTRUwyPTAgKi8KLSNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMl9TSU8wCTB4MDAwMDAwMTAJLyogU0VMMj0wICovCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDJfQUNMMQkweDAwMDAwMDAwCS8qIFNFTDI9MSAqLwotI2RlZmluZSBUWDQ5MjdfUENGR19ETUFTRUwyX0FDTDIJMHgwMDAwMDAyMAkvKiBTRUwyPTEgKi8KLSNkZWZpbmUgVFg0OTI3X1BDRkdfRE1BU0VMMl9BQ0wwCTB4MDAwMDAwMzAJLyogU0VMMj0xICovCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDNfRFJRMwkweDAwMDAwMDAwCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDNfU0lPMAkweDAwMDAwMDQwCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDNfQUNMMwkweDAwMDAwMDgwCi0jZGVmaW5lIFRYNDkyN19QQ0ZHX0RNQVNFTDNfQUNMMQkweDAwMDAwMGMwCi0KLS8qIENMS0NUUiA6IENsb2NrIENvbnRyb2wgKi8KLSNkZWZpbmUgVFg0OTI3X0NMS0NUUl9BQ0xDS0QJMHgwMjAwMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1BJT0NLRAkweDAxMDAwMDAwCi0jZGVmaW5lIFRYNDkyN19DTEtDVFJfRE1BQ0tECTB4MDA4MDAwMDAKLSNkZWZpbmUgVFg0OTI3X0NMS0NUUl9QQ0lDS0QJMHgwMDQwMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1RNMENLRAkweDAwMTAwMDAwCi0jZGVmaW5lIFRYNDkyN19DTEtDVFJfVE0xQ0tECTB4MDAwODAwMDAKLSNkZWZpbmUgVFg0OTI3X0NMS0NUUl9UTTJDS0QJMHgwMDA0MDAwMAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1NJTzBDS0QJMHgwMDAyMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1NJTzFDS0QJMHgwMDAxMDAwMAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX0FDTFJTVAkweDAwMDAwMjAwCi0jZGVmaW5lIFRYNDkyN19DTEtDVFJfUElPUlNUCTB4MDAwMDAxMDAKLSNkZWZpbmUgVFg0OTI3X0NMS0NUUl9ETUFSU1QJMHgwMDAwMDA4MAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1BDSVJTVAkweDAwMDAwMDQwCi0jZGVmaW5lIFRYNDkyN19DTEtDVFJfVE0wUlNUCTB4MDAwMDAwMTAKLSNkZWZpbmUgVFg0OTI3X0NMS0NUUl9UTTFSU1QJMHgwMDAwMDAwOAotI2RlZmluZSBUWDQ5MjdfQ0xLQ1RSX1RNMlJTVAkweDAwMDAwMDA0Ci0jZGVmaW5lIFRYNDkyN19DTEtDVFJfU0lPMFJTVAkweDAwMDAwMDAyCi0jZGVmaW5lIFRYNDkyN19DTEtDVFJfU0lPMVJTVAkweDAwMDAwMDAxCi0KLSNkZWZpbmUgdHg0OTI3X3NkcmFtY3B0ciBcCi0JCSgoc3RydWN0IHR4NDkyN19zZHJhbWNfcmVnIF9faW9tZW0gKilUWDQ5MjdfU0RSQU1DX1JFRykKLSNkZWZpbmUgdHg0OTI3X3BjaWNwdHIgXAotCQkoKHN0cnVjdCB0eDQ5MjdfcGNpY19yZWcgX19pb21lbSAqKVRYNDkyN19QQ0lDX1JFRykKLSNkZWZpbmUgdHg0OTI3X2NjZmdwdHIgXAotCQkoKHN0cnVjdCB0eDQ5MjdfY2NmZ19yZWcgX19pb21lbSAqKVRYNDkyN19DQ0ZHX1JFRykKLSNkZWZpbmUgdHg0OTI3X2VidXNjcHRyIFwKLQkJKChzdHJ1Y3QgdHg0OTI3X2VidXNjX3JlZyBfX2lvbWVtICopVFg0OTI3X0VCVVNDX1JFRykKLSNkZWZpbmUgdHg0OTI3X3Bpb3B0cgkJKChzdHJ1Y3QgdHh4OV9waW9fcmVnIF9faW9tZW0gKilUWDQ5MjdfUElPX1JFRykKLQotI2RlZmluZSBUWDQ5MjdfUkVWX1BDT0RFKCkJXAotCSgoX191MzIpX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jcmlyKSA+PiAxNikKLQotI2RlZmluZSBUWDQ5MjdfU0RSQU1DX0NSKGNoKQlfX3Jhd19yZWFkcSgmdHg0OTI3X3NkcmFtY3B0ci0+Y3JbKGNoKV0pCi0jZGVmaW5lIFRYNDkyN19TRFJBTUNfQkEoY2gpCSgoVFg0OTI3X1NEUkFNQ19DUihjaCkgPj4gNDkpIDw8IDIxKQotI2RlZmluZSBUWDQ5MjdfU0RSQU1DX1NJWkUoY2gpCVwKLQkoKCgoVFg0OTI3X1NEUkFNQ19DUihjaCkgPj4gMzMpICYgMHg3ZmZmKSArIDEpIDw8IDIxKQotCi0jZGVmaW5lIFRYNDkyN19FQlVTQ19DUihjaCkJX19yYXdfcmVhZHEoJnR4NDkyN19lYnVzY3B0ci0+Y3JbKGNoKV0pCi0jZGVmaW5lIFRYNDkyN19FQlVTQ19CQShjaCkJKChUWDQ5MjdfRUJVU0NfQ1IoY2gpID4+IDQ4KSA8PCAyMCkKLSNkZWZpbmUgVFg0OTI3X0VCVVNDX1NJWkUoY2gpCVwKLQkoMHgwMDEwMDAwMCA8PCAoKHVuc2lnbmVkIGxvbmcpKFRYNDkyN19FQlVTQ19DUihjaCkgPj4gOCkgJiAweGYpKQotCi0vKiB1dGlsaXRpZXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0eHg5X2NsZWFyNjQoX191NjQgX19pb21lbSAqYWRyLCBfX3U2NCBiaXRzKQotewotI2lmZGVmIENPTkZJR18zMkJJVAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotI2VuZGlmCi0JX19fX3Jhd193cml0ZXEoX19fX3Jhd19yZWFkcShhZHIpICYgfmJpdHMsIGFkcik7Ci0jaWZkZWYgQ09ORklHXzMyQklUCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmCi19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdHh4OV9zZXQ2NChfX3U2NCBfX2lvbWVtICphZHIsIF9fdTY0IGJpdHMpCi17Ci0jaWZkZWYgQ09ORklHXzMyQklUCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0jZW5kaWYKLQlfX19fcmF3X3dyaXRlcShfX19fcmF3X3JlYWRxKGFkcikgfCBiaXRzLCBhZHIpOwotI2lmZGVmIENPTkZJR18zMkJJVAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLSNlbmRpZgotfQotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBpbnRlcnJ1cHQgc2FmZS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0eDQ5MjdfY2NmZ19jbGVhcihfX3U2NCBiaXRzKQotewotCV9fX19yYXdfd3JpdGVxKF9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jY2ZnKQotCQkgICAgICAgJiB+KFRYNDkyN19DQ0ZHX1cxQ0JJVFMgfCBiaXRzKSwKLQkJICAgICAgICZ0eDQ5MjdfY2NmZ3B0ci0+Y2NmZyk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdHg0OTI3X2NjZmdfc2V0KF9fdTY0IGJpdHMpCi17Ci0JX19fX3Jhd193cml0ZXEoKF9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jY2ZnKQotCQkJJiB+VFg0OTI3X0NDRkdfVzFDQklUUykgfCBiaXRzLAotCQkgICAgICAgJnR4NDkyN19jY2ZncHRyLT5jY2ZnKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0eDQ5MjdfY2NmZ19jaGFuZ2UoX191NjQgY2hhbmdlLCBfX3U2NCBuZXcpCi17Ci0JX19fX3Jhd193cml0ZXEoKF9fX19yYXdfcmVhZHEoJnR4NDkyN19jY2ZncHRyLT5jY2ZnKQotCQkJJiB+KFRYNDkyN19DQ0ZHX1cxQ0JJVFMgfCBjaGFuZ2UpKSB8Ci0JCSAgICAgICBuZXcsCi0JCSAgICAgICAmdHg0OTI3X2NjZmdwdHItPmNjZmcpOwotfQotCi11bnNpZ25lZCBpbnQgdHg0OTI3X2dldF9tZW1fc2l6ZSh2b2lkKTsKLXZvaWQgdHg0OTI3X3dkdF9pbml0KHZvaWQpOwotdm9pZCB0eDQ5Mjdfc2V0dXAodm9pZCk7Ci12b2lkIHR4NDkyN190aW1lX2luaXQodW5zaWduZWQgaW50IHRtcm5yKTsKLXZvaWQgdHg0OTI3X3Npb19pbml0KHVuc2lnbmVkIGludCBzY2xrLCB1bnNpZ25lZCBpbnQgY3RzX21hc2spOwotaW50IHR4NDkyN19yZXBvcnRfcGNpY2xrKHZvaWQpOwotaW50IHR4NDkyN19wY2ljbGs2Nl9zZXR1cCh2b2lkKTsKLXZvaWQgdHg0OTI3X3NldHVwX3BjaWVycl9pcnEodm9pZCk7Ci12b2lkIHR4NDkyN19pcnFfaW5pdCh2b2lkKTsKLQotI2VuZGlmIC8qIF9fQVNNX1RYWDlfVFg0OTI3X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS90eDQ5MzguaCBiL2luY2x1ZGUvYXNtLW1pcHMvdHh4OS90eDQ5MzguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NWQ0Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R4eDkvdHg0OTM4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIERlZmluaXRpb25zIGZvciBUWDQ5MzcvVFg0OTM4Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCi0gKgotICogMjAwMy0yMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcwotICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICoKLSAqIFN1cHBvcnQgZm9yIFRYNDkzOCBpbiAyLjYgLSBNYW5pc2ggTGFjaHdhbmkgKG1sYWNod2FuaUBtdmlzdGEuY29tKQotICovCi0jaWZuZGVmIF9fQVNNX1RYWDlfVFg0OTM4X0gKLSNkZWZpbmUgX19BU01fVFhYOV9UWDQ5MzhfSAotCi0vKiBzb21lIGNvbnRyb2xsZXJzIGFyZSBjb21wYXRpYmxlIHdpdGggNDkyNyAqLwotI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkyNy5oPgotCi0jaWZkZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIFRYNDkzOF9SRUdfQkFTRQkweGZmZmZmZmZmZmYxZjAwMDBVTCAvKiA9PSBUWDQ5MzdfUkVHX0JBU0UgKi8KLSNlbHNlCi0jZGVmaW5lIFRYNDkzOF9SRUdfQkFTRQkweGZmMWYwMDAwVUwgLyogPT0gVFg0OTM3X1JFR19CQVNFICovCi0jZW5kaWYKLSNkZWZpbmUgVFg0OTM4X1JFR19TSVpFCTB4MDAwMTAwMDAgLyogPT0gVFg0OTM3X1JFR19TSVpFICovCi0KLS8qIE5ERk1DLCBTUkFNQywgUENJQzEsIFNQSUM6IFRYNDkzOCBvbmx5ICovCi0jZGVmaW5lIFRYNDkzOF9OREZNQ19SRUcJKFRYNDkzOF9SRUdfQkFTRSArIDB4NTAwMCkKLSNkZWZpbmUgVFg0OTM4X1NSQU1DX1JFRwkoVFg0OTM4X1JFR19CQVNFICsgMHg2MDAwKQotI2RlZmluZSBUWDQ5MzhfUENJQzFfUkVHCShUWDQ5MzhfUkVHX0JBU0UgKyAweDcwMDApCi0jZGVmaW5lIFRYNDkzOF9TRFJBTUNfUkVHCShUWDQ5MzhfUkVHX0JBU0UgKyAweDgwMDApCi0jZGVmaW5lIFRYNDkzOF9FQlVTQ19SRUcJKFRYNDkzOF9SRUdfQkFTRSArIDB4OTAwMCkKLSNkZWZpbmUgVFg0OTM4X0RNQV9SRUcoY2gpCShUWDQ5MzhfUkVHX0JBU0UgKyAweGIwMDAgKyAoY2gpICogMHg4MDApCi0jZGVmaW5lIFRYNDkzOF9QQ0lDX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZDAwMCkKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhlMDAwKQotI2RlZmluZSBUWDQ5MzhfTlJfVE1SCTMKLSNkZWZpbmUgVFg0OTM4X1RNUl9SRUcoY2gpCSgoVFg0OTM4X1JFR19CQVNFICsgMHhmMDAwKSArIChjaCkgKiAweDEwMCkKLSNkZWZpbmUgVFg0OTM4X05SX1NJTwkyCi0jZGVmaW5lIFRYNDkzOF9TSU9fUkVHKGNoKQkoKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjMwMCkgKyAoY2gpICogMHgxMDApCi0jZGVmaW5lIFRYNDkzOF9QSU9fUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhmNTAwKQotI2RlZmluZSBUWDQ5MzhfSVJDX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjYwMCkKLSNkZWZpbmUgVFg0OTM4X0FDTENfUkVHCQkoVFg0OTM4X1JFR19CQVNFICsgMHhmNzAwKQotI2RlZmluZSBUWDQ5MzhfU1BJX1JFRwkJKFRYNDkzOF9SRUdfQkFTRSArIDB4ZjgwMCkKLQotc3RydWN0IHR4NDkzOF9zcmFtY19yZWcgewotCXU2NCBjcjsKLX07Ci0KLXN0cnVjdCB0eDQ5MzhfY2NmZ19yZWcgewotCXU2NCBjY2ZnOwotCXU2NCBjcmlyOwotCXU2NCBwY2ZnOwotCXU2NCB0b2VhOwotCXU2NCBjbGtjdHI7Ci0JdTY0IHVudXNlZDA7Ci0JdTY0IGdhcmJjOwotCXU2NCB1bnVzZWQxOwotCXU2NCB1bnVzZWQyOwotCXU2NCByYW1wOwotCXU2NCB1bnVzZWQzOwotCXU2NCBqbXBhZHI7Ci19OwotCi0vKgotICogSVJDCi0gKi8KLQotI2RlZmluZSBUWDQ5MzhfSVJfRUNDRVJSCTAKLSNkZWZpbmUgVFg0OTM4X0lSX1dUT0VSUgkxCi0jZGVmaW5lIFRYNDkzOF9OVU1fSVJfSU5UCTYKLSNkZWZpbmUgVFg0OTM4X0lSX0lOVChuKQkoMiArIChuKSkKLSNkZWZpbmUgVFg0OTM4X05VTV9JUl9TSU8JMgotI2RlZmluZSBUWDQ5MzhfSVJfU0lPKG4pCSg4ICsgKG4pKQotI2RlZmluZSBUWDQ5MzhfTlVNX0lSX0RNQQk0Ci0jZGVmaW5lIFRYNDkzOF9JUl9ETUEoY2gsIG4pCSgoY2ggPyAyNyA6IDEwKSArIChuKSkgLyogMTAtMTMsIDI3LTMwICovCi0jZGVmaW5lIFRYNDkzOF9JUl9QSU8JMTQKLSNkZWZpbmUgVFg0OTM4X0lSX1BETUFDCTE1Ci0jZGVmaW5lIFRYNDkzOF9JUl9QQ0lDCTE2Ci0jZGVmaW5lIFRYNDkzOF9OVU1fSVJfVE1SCTMKLSNkZWZpbmUgVFg0OTM4X0lSX1RNUihuKQkoMTcgKyAobikpCi0jZGVmaW5lIFRYNDkzOF9JUl9OREZNQwkyMQotI2RlZmluZSBUWDQ5MzhfSVJfUENJRVJSCTIyCi0jZGVmaW5lIFRYNDkzOF9JUl9QQ0lQTUUJMjMKLSNkZWZpbmUgVFg0OTM4X0lSX0FDTEMJMjQKLSNkZWZpbmUgVFg0OTM4X0lSX0FDTENQTUUJMjUKLSNkZWZpbmUgVFg0OTM4X0lSX1BDSUMxCTI2Ci0jZGVmaW5lIFRYNDkzOF9JUl9TUEkJMzEKLSNkZWZpbmUgVFg0OTM4X05VTV9JUgkzMgotLyogbXVsdGlwbGV4ICovCi0jZGVmaW5lIFRYNDkzOF9JUl9FVEgwCVRYNDkzOF9JUl9JTlQoNCkKLSNkZWZpbmUgVFg0OTM4X0lSX0VUSDEJVFg0OTM4X0lSX0lOVCgzKQotCi0jZGVmaW5lIFRYNDkzOF9JUkNfSU5UCTIJLyogSVBbMl0gaW4gU3RhdHVzIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgVFg0OTM4X05VTV9QSU8JMTYKLQotLyoKLSAqIENDRkcKLSAqLwotLyogQ0NGRyA6IENoaXAgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBUWDQ5MzhfQ0NGR19XRFJTVAkweDAwMDAwMjAwMDAwMDAwMDBVTEwKLSNkZWZpbmUgVFg0OTM4X0NDRkdfV0RSRVhFTgkweDAwMDAwMTAwMDAwMDAwMDBVTEwKLSNkZWZpbmUgVFg0OTM4X0NDRkdfQkNGR19NQVNLCTB4MDAwMDAwZmYwMDAwMDAwMFVMTAotI2RlZmluZSBUWDQ5MzhfQ0NGR19USU5URElTCTB4MDEwMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUENJNjYJMHgwMDgwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lNT0RFCTB4MDA0MDAwMDAKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUENJMV82NgkweDAwMjAwMDAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfTUFTSwkweDAwMWUwMDAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfMgkoMHg0IDw8IDE3KQotI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzJfNQkoMHhmIDw8IDE3KQotI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzMJKDB4NSA8PCAxNykKLSNkZWZpbmUgVFg0OTM4X0NDRkdfRElWTU9ERV80CSgweDYgPDwgMTcpCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfNF81CSgweGQgPDwgMTcpCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfOAkoMHgwIDw8IDE3KQotI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzEwCSgweGIgPDwgMTcpCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0RJVk1PREVfMTIJKDB4MSA8PCAxNykKLSNkZWZpbmUgVFg0OTM4X0NDRkdfRElWTU9ERV8xNgkoMHgyIDw8IDE3KQotI2RlZmluZSBUWDQ5MzhfQ0NGR19ESVZNT0RFXzE4CSgweDkgPDwgMTcpCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX0JFT1cJMHgwMDAxMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0NGR19XUgkweDAwMDA4MDAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1RPRQkweDAwMDA0MDAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSUFSQgkweDAwMDAyMDAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfTUFTSwkweDAwMDAxYzAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfNAkoMHgxIDw8IDEwKQotI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzRfNQkoMHgzIDw8IDEwKQotI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzUJKDB4NSA8PCAxMCkKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUENJRElWTU9ERV81XzUJKDB4NyA8PCAxMCkKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUENJRElWTU9ERV84CSgweDAgPDwgMTApCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfOQkoMHgyIDw8IDEwKQotI2RlZmluZSBUWDQ5MzhfQ0NGR19QQ0lESVZNT0RFXzEwCSgweDQgPDwgMTApCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1BDSURJVk1PREVfMTEJKDB4NiA8PCAxMCkKLSNkZWZpbmUgVFg0OTM4X0NDRkdfUENJMURNRAkweDAwMDAwMTAwCi0jZGVmaW5lIFRYNDkzOF9DQ0ZHX1NZU1NQX01BU0sJMHgwMDAwMDBjMAotI2RlZmluZSBUWDQ5MzhfQ0NGR19FTkRJQU4JMHgwMDAwMDAwNAotI2RlZmluZSBUWDQ5MzhfQ0NGR19IQUxUCTB4MDAwMDAwMDIKLSNkZWZpbmUgVFg0OTM4X0NDRkdfQUNFSE9MRAkweDAwMDAwMDAxCi0KLS8qIFBDRkcgOiBQaW4gQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBUWDQ5MzhfUENGR19FVEgwX1NFTAkweDgwMDAwMDAwMDAwMDAwMDBVTEwKLSNkZWZpbmUgVFg0OTM4X1BDRkdfRVRIMV9TRUwJMHg0MDAwMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0FUQV9TRUwJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0lTQV9TRUwJMHgxMDAwMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX1NQSV9TRUwJMHgwODAwMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX05ERl9TRUwJMHgwNDAwMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX1NEQ0xLRExZX01BU0sJMHgzMDAwMDAwMAotI2RlZmluZSBUWDQ5MzhfUENGR19TRENMS0RMWShkKQkoKGQpPDwyOCkKLSNkZWZpbmUgVFg0OTM4X1BDRkdfU1lTQ0xLRU4JMHgwODAwMDAwMAotI2RlZmluZSBUWDQ5MzhfUENGR19TRENMS0VOX0FMTAkweDA3ODAwMDAwCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX1NEQ0xLRU4oY2gpCSgweDAwODAwMDAwPDwoY2gpKQotI2RlZmluZSBUWDQ5MzhfUENGR19QQ0lDTEtFTl9BTEwJMHgwMDNmMDAwMAotI2RlZmluZSBUWDQ5MzhfUENGR19QQ0lDTEtFTihjaCkJKDB4MDAwMTAwMDA8PChjaCkpCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX1NFTDIJMHgwMDAwMDIwMAotI2RlZmluZSBUWDQ5MzhfUENGR19TRUwxCTB4MDAwMDAxMDAKLSNkZWZpbmUgVFg0OTM4X1BDRkdfRE1BU0VMX0FMTAkweDAwMDAwMDBmCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDBfRFJRMAkweDAwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDBfU0lPMQkweDAwMDAwMDAxCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDFfRFJRMQkweDAwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDFfU0lPMQkweDAwMDAwMDAyCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDJfRFJRMgkweDAwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDJfU0lPMAkweDAwMDAwMDA0Ci0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDNfRFJRMwkweDAwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9QQ0ZHX0RNQVNFTDNfU0lPMAkweDAwMDAwMDA4Ci0KLS8qIENMS0NUUiA6IENsb2NrIENvbnRyb2wgKi8KLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9OREZDS0QJMHgwMDAxMDAwMDAwMDAwMDAwVUxMCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfTkRGUlNUCTB4MDAwMDAwMDEwMDAwMDAwMFVMTAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0VUSDFDS0QJMHg4MDAwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0VUSDBDS0QJMHg0MDAwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1NQSUNLRAkweDIwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfU1JBTUNLRAkweDEwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfUENJQzFDS0QJMHgwODAwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0RNQTFDS0QJMHgwNDAwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0FDTENLRAkweDAyMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfUElPQ0tECTB4MDEwMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9ETUFDS0QJMHgwMDgwMDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1BDSUNLRAkweDAwNDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfVE0wQ0tECTB4MDAxMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9UTTFDS0QJMHgwMDA4MDAwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1RNMkNLRAkweDAwMDQwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfU0lPMENLRAkweDAwMDIwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfU0lPMUNLRAkweDAwMDEwMDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfRVRIMVJTVAkweDAwMDA4MDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfRVRIMFJTVAkweDAwMDA0MDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfU1BJUlNUCTB4MDAwMDIwMDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TUkFNUlNUCTB4MDAwMDEwMDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9QQ0lDMVJTVAkweDAwMDAwODAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfRE1BMVJTVAkweDAwMDAwNDAwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfQUNMUlNUCTB4MDAwMDAyMDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9QSU9SU1QJMHgwMDAwMDEwMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX0RNQVJTVAkweDAwMDAwMDgwCi0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfUENJUlNUCTB4MDAwMDAwNDAKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9UTTBSU1QJMHgwMDAwMDAxMAotI2RlZmluZSBUWDQ5MzhfQ0xLQ1RSX1RNMVJTVAkweDAwMDAwMDA4Ci0jZGVmaW5lIFRYNDkzOF9DTEtDVFJfVE0yUlNUCTB4MDAwMDAwMDQKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TSU8wUlNUCTB4MDAwMDAwMDIKLSNkZWZpbmUgVFg0OTM4X0NMS0NUUl9TSU8xUlNUCTB4MDAwMDAwMDEKLQotLyoKLSAqIERNQQotICovCi0vKiBiaXRzIGZvciBNQ1IgKi8KLSNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfRUlTKGNoKQkoMHgxMDAwMDAwMDw8KGNoKSkKLSNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfRElTKGNoKQkoMHgwMTAwMDAwMDw8KGNoKSkKLSNkZWZpbmUgVFg0OTM4X0RNQV9NQ1JfUlNGSUYJMHgwMDAwMDA4MAotI2RlZmluZSBUWDQ5MzhfRE1BX01DUl9GSUZVTShjaCkJKDB4MDAwMDAwMDg8PChjaCkpCi0jZGVmaW5lIFRYNDkzOF9ETUFfTUNSX1JQUlQJMHgwMDAwMDAwMgotI2RlZmluZSBUWDQ5MzhfRE1BX01DUl9NU1RFTgkweDAwMDAwMDAxCi0KLS8qIGJpdHMgZm9yIENDUm4gKi8KLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU1NQ0hOCTB4MjAwMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfVVNFWEZTWgkweDEwMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0xFCTB4MDgwMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfREJJTkgJMHgwNDAwMDAwMAotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9TQklOSAkweDAyMDAwMDAwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0NIUlNUCTB4MDEwMDAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfUlZCWVRFCTB4MDA4MDAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfQUNLUE9MCTB4MDA0MDAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfUkVRUEwJMHgwMDIwMDAwMAotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9FR1JFUQkweDAwMTAwMDAwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0NIRE4JMHgwMDA4MDAwMAotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9ETkNUTAkweDAwMDYwMDAwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX0VYVFJRCTB4MDAwMTAwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5UUlFECTB4MDAwMGUwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5FCTB4MDAwMDEwMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5DCTB4MDAwMDA4MDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfSU5URU5UCTB4MDAwMDA0MDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfQ0hORU4JMHgwMDAwMDIwMAotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRkFDVAkweDAwMDAwMTAwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1NNUENITgkweDAwMDAwMDIwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1oob3JkZXIpCSgoKG9yZGVyKSA8PCAyKSAmIDB4MDAwMDAwMWMpCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfMVcJVFg0OTM4X0RNQV9DQ1JfWEZTWigyKQotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRlNaXzJXCVRYNDkzOF9ETUFfQ0NSX1hGU1ooMykKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfWEZTWl80VwlUWDQ5MzhfRE1BX0NDUl9YRlNaKDQpCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfOFcJVFg0OTM4X0RNQV9DQ1JfWEZTWig1KQotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9YRlNaXzE2VwlUWDQ5MzhfRE1BX0NDUl9YRlNaKDYpCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ0NSX1hGU1pfMzJXCVRYNDkzOF9ETUFfQ0NSX1hGU1ooNykKLSNkZWZpbmUgVFg0OTM4X0RNQV9DQ1JfTUVNSU8JMHgwMDAwMDAwMgotI2RlZmluZSBUWDQ5MzhfRE1BX0NDUl9TTkdBRAkweDAwMDAwMDAxCi0KLS8qIGJpdHMgZm9yIENTUm4gKi8KLSNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0hORU4JMHgwMDAwMDQwMAotI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9TVExYRkVSCTB4MDAwMDAyMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0hOQUNUCTB4MDAwMDAxMDAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQUJDSEMJMHgwMDAwMDA4MAotI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9OQ0hOQwkweDAwMDAwMDQwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX05UUk5GQwkweDAwMDAwMDIwCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX0VYVEROCTB4MDAwMDAwMTAKLSNkZWZpbmUgVFg0OTM4X0RNQV9DU1JfQ0ZFUlIJMHgwMDAwMDAwOAotI2RlZmluZSBUWDQ5MzhfRE1BX0NTUl9DSEVSUgkweDAwMDAwMDA0Ci0jZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX0RFU0VSUgkweDAwMDAwMDAyCi0jZGVmaW5lIFRYNDkzOF9ETUFfQ1NSX1NPUkVSUgkweDAwMDAwMDAxCi0KLSNkZWZpbmUgdHg0OTM4X3NkcmFtY3B0cgl0eDQ5Mjdfc2RyYW1jcHRyCi0jZGVmaW5lIHR4NDkzOF9lYnVzY3B0cgkJdHg0OTI3X2VidXNjcHRyCi0jZGVmaW5lIHR4NDkzOF9wY2ljcHRyCQl0eDQ5MjdfcGNpY3B0cgotI2RlZmluZSB0eDQ5MzhfcGNpYzFwdHIgXAotCQkoKHN0cnVjdCB0eDQ5MjdfcGNpY19yZWcgX19pb21lbSAqKVRYNDkzOF9QQ0lDMV9SRUcpCi0jZGVmaW5lIHR4NDkzOF9jY2ZncHRyIFwKLQkJKChzdHJ1Y3QgdHg0OTM4X2NjZmdfcmVnIF9faW9tZW0gKilUWDQ5MzhfQ0NGR19SRUcpCi0jZGVmaW5lIHR4NDkzOF9waW9wdHIJCSgoc3RydWN0IHR4eDlfcGlvX3JlZyBfX2lvbWVtICopVFg0OTM4X1BJT19SRUcpCi0jZGVmaW5lIHR4NDkzOF9zcmFtY3B0ciBcCi0JCSgoc3RydWN0IHR4NDkzOF9zcmFtY19yZWcgX19pb21lbSAqKVRYNDkzOF9TUkFNQ19SRUcpCi0KLQotI2RlZmluZSBUWDQ5MzhfUkVWX1BDT0RFKCkJXAotCSgoX191MzIpX19yYXdfcmVhZHEoJnR4NDkzOF9jY2ZncHRyLT5jcmlyKSA+PiAxNikKLQotI2RlZmluZSB0eDQ5MzhfY2NmZ19jbGVhcihiaXRzKQl0eDQ5MjdfY2NmZ19jbGVhcihiaXRzKQotI2RlZmluZSB0eDQ5MzhfY2NmZ19zZXQoYml0cykJdHg0OTI3X2NjZmdfc2V0KGJpdHMpCi0jZGVmaW5lIHR4NDkzOF9jY2ZnX2NoYW5nZShjaGFuZ2UsIG5ldykJdHg0OTI3X2NjZmdfY2hhbmdlKGNoYW5nZSwgbmV3KQotCi0jZGVmaW5lIFRYNDkzOF9TRFJBTUNfQ1IoY2gpCVRYNDkyN19TRFJBTUNfQ1IoY2gpCi0jZGVmaW5lIFRYNDkzOF9TRFJBTUNfQkEoY2gpCVRYNDkyN19TRFJBTUNfQkEoY2gpCi0jZGVmaW5lIFRYNDkzOF9TRFJBTUNfU0laRShjaCkJVFg0OTI3X1NEUkFNQ19TSVpFKGNoKQotCi0jZGVmaW5lIFRYNDkzOF9FQlVTQ19DUihjaCkJVFg0OTI3X0VCVVNDX0NSKGNoKQotI2RlZmluZSBUWDQ5MzhfRUJVU0NfQkEoY2gpCVRYNDkyN19FQlVTQ19CQShjaCkKLSNkZWZpbmUgVFg0OTM4X0VCVVNDX1NJWkUoY2gpCVRYNDkyN19FQlVTQ19TSVpFKGNoKQotCi0jZGVmaW5lIHR4NDkzOF9nZXRfbWVtX3NpemUoKSB0eDQ5MjdfZ2V0X21lbV9zaXplKCkKLXZvaWQgdHg0OTM4X3dkdF9pbml0KHZvaWQpOwotdm9pZCB0eDQ5Mzhfc2V0dXAodm9pZCk7Ci12b2lkIHR4NDkzOF90aW1lX2luaXQodW5zaWduZWQgaW50IHRtcm5yKTsKLXZvaWQgdHg0OTM4X3Npb19pbml0KHVuc2lnbmVkIGludCBzY2xrLCB1bnNpZ25lZCBpbnQgY3RzX21hc2spOwotdm9pZCB0eDQ5Mzhfc3BpX2luaXQoaW50IGJ1c2lkKTsKLXZvaWQgdHg0OTM4X2V0aGFkZHJfaW5pdCh1bnNpZ25lZCBjaGFyICphZGRyMCwgdW5zaWduZWQgY2hhciAqYWRkcjEpOwotaW50IHR4NDkzOF9yZXBvcnRfcGNpY2xrKHZvaWQpOwotdm9pZCB0eDQ5MzhfcmVwb3J0X3BjaTFjbGsodm9pZCk7Ci1pbnQgdHg0OTM4X3BjaWNsazY2X3NldHVwKHZvaWQpOwotc3RydWN0IHBjaV9kZXY7Ci1pbnQgdHg0OTM4X3BjaWMxX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCk7Ci12b2lkIHR4NDkzOF9zZXR1cF9wY2llcnJfaXJxKHZvaWQpOwotdm9pZCB0eDQ5MzhfaXJxX2luaXQodm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1taXBzL3VhY2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1MjNkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3VhY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAwMywgMDQgYnkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQotICovCi0jaWZuZGVmIF9BU01fVUFDQ0VTU19ICi0jZGVmaW5lIF9BU01fVUFDQ0VTU19ICi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdWFjY2Vzcy5oPgotCi0vKgotICogVGhlIGZzIHZhbHVlIGRldGVybWluZXMgd2hldGhlciBhcmd1bWVudCB2YWxpZGl0eSBjaGVja2luZyBzaG91bGQgYmUKLSAqIHBlcmZvcm1lZCBvciBub3QuICBJZiBnZXRfZnMoKSA9PSBVU0VSX0RTLCBjaGVja2luZyBpcyBwZXJmb3JtZWQsIHdpdGgKLSAqIGdldF9mcygpID09IEtFUk5FTF9EUywgY2hlY2tpbmcgaXMgYnlwYXNzZWQuCi0gKgotICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhlc2UgbWFjcm9zIGFyZSBncm9zc2x5IG1pc25hbWVkLgotICovCi0jaWZkZWYgQ09ORklHXzMyQklUCi0KLSNkZWZpbmUgX19VQV9MSU1JVAkweDgwMDAwMDAwVUwKLQotI2RlZmluZSBfX1VBX0FERFIJIi53b3JkIgotI2RlZmluZSBfX1VBX0xBCQkibGEiCi0jZGVmaW5lIF9fVUFfQUREVQkiYWRkdSIKLSNkZWZpbmUgX19VQV90MAkJIiQ4IgotI2RlZmluZSBfX1VBX3QxCQkiJDkiCi0KLSNlbmRpZiAvKiBDT05GSUdfMzJCSVQgKi8KLQotI2lmZGVmIENPTkZJR182NEJJVAotCi0jZGVmaW5lIF9fVUFfTElNSVQJKC0gVEFTS19TSVpFKQotCi0jZGVmaW5lIF9fVUFfQUREUgkiLmR3b3JkIgotI2RlZmluZSBfX1VBX0xBCQkiZGxhIgotI2RlZmluZSBfX1VBX0FERFUJImRhZGR1IgotI2RlZmluZSBfX1VBX3QwCQkiJDEyIgotI2RlZmluZSBfX1VBX3QxCQkiJDEzIgotCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KLS8qCi0gKiBVU0VSX0RTIGlzIGEgYml0bWFzayB0aGF0IGhhcyB0aGUgYml0cyBzZXQgdGhhdCBtYXkgbm90IGJlIHNldCBpbiBhIHZhbGlkCi0gKiB1c2Vyc3BhY2UgYWRkcmVzcy4gIE5vdGUgdGhhdCB3ZSBsaW1pdCAzMi1iaXQgdXNlcnNwYWNlIHRvIDB4N2ZmZjgwMDAgYnV0Ci0gKiB0aGUgYXJpdGhtZXRpYyB3ZSdyZSBkb2luZyBvbmx5IHdvcmtzIGlmIHRoZSBsaW1pdCBpcyBhIHBvd2VyIG9mIHR3bywgc28KLSAqIHdlIHVzZSAweDgwMDAwMDAwIGhlcmUgb24gMzItYml0IGtlcm5lbHMuICBJZiBhIHByb2Nlc3MgcGFzc2VzIGFuIGludmFsaWQKLSAqIGFkZHJlc3MgaW4gdGhpcyByYW5nZSBpdCdzIHRoZSBwcm9jZXNzJ3MgcHJvYmxlbSwgbm90IG91cnMgOi0pCi0gKi8KLQotI2RlZmluZSBLRVJORUxfRFMJKChtbV9zZWdtZW50X3QpIHsgMFVMIH0pCi0jZGVmaW5lIFVTRVJfRFMJCSgobW1fc2VnbWVudF90KSB7IF9fVUFfTElNSVQgfSkKLQotI2RlZmluZSBWRVJJRllfUkVBRCAgICAwCi0jZGVmaW5lIFZFUklGWV9XUklURSAgIDEKLQotI2RlZmluZSBnZXRfZHMoKQkoS0VSTkVMX0RTKQotI2RlZmluZSBnZXRfZnMoKQkoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0KQotI2RlZmluZSBzZXRfZnMoeCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCA9ICh4KSkKLQotI2RlZmluZSBzZWdtZW50X2VxKGEsIGIpCSgoYSkuc2VnID09IChiKS5zZWcpCi0KLQotLyoKLSAqIElzIGEgYWRkcmVzcyB2YWxpZD8gVGhpcyBkb2VzIGEgc3RyYWlnaGZvcndhcmQgY2FsY3VsYXRpb24gcmF0aGVyCi0gKiB0aGFuIHRlc3RzLgotICoKLSAqIEFkZHJlc3MgdmFsaWQgaWY6Ci0gKiAgLSAiYWRkciIgZG9lc24ndCBoYXZlIGFueSBoaWdoLWJpdHMgc2V0Ci0gKiAgLSBBTkQgInNpemUiIGRvZXNuJ3QgaGF2ZSBhbnkgaGlnaC1iaXRzIHNldAotICogIC0gQU5EICJhZGRyK3NpemUiIGRvZXNuJ3QgaGF2ZSBhbnkgaGlnaC1iaXRzIHNldAotICogIC0gT1Igd2UgYXJlIGluIGtlcm5lbCBtb2RlLgotICoKLSAqIF9fdWFfc2l6ZSgpIGlzIGEgdHJpY2sgdG8gYXZvaWQgcnVudGltZSBjaGVja2luZyBvZiBwb3NpdGl2ZSBjb25zdGFudAotICogc2l6ZXM7IGZvciB0aG9zZSB3ZSBhbHJlYWR5IGtub3cgYXQgY29tcGlsZSB0aW1lIHRoYXQgdGhlIHNpemUgaXMgb2suCi0gKi8KLSNkZWZpbmUgX191YV9zaXplKHNpemUpCQkJCQkJCVwKLQkoKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpICYmIChzaWduZWQgbG9uZykgKHNpemUpID4gMCkgPyAwIDogKHNpemUpKQotCi0vKgotICogYWNjZXNzX29rOiAtIENoZWNrcyBpZiBhIHVzZXIgc3BhY2UgcG9pbnRlciBpcyB2YWxpZAotICogQHR5cGU6IFR5cGUgb2YgYWNjZXNzOiAlVkVSSUZZX1JFQUQgb3IgJVZFUklGWV9XUklURS4gIE5vdGUgdGhhdAotICogICAgICAgICVWRVJJRllfV1JJVEUgaXMgYSBzdXBlcnNldCBvZiAlVkVSSUZZX1JFQUQgLSBpZiBpdCBpcyBzYWZlCi0gKiAgICAgICAgdG8gd3JpdGUgdG8gYSBibG9jaywgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcmVhZCBmcm9tIGl0LgotICogQGFkZHI6IFVzZXIgc3BhY2UgcG9pbnRlciB0byBzdGFydCBvZiBibG9jayB0byBjaGVjawotICogQHNpemU6IFNpemUgb2YgYmxvY2sgdG8gY2hlY2sKLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIENoZWNrcyBpZiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSBpcyB2YWxpZC4KLSAqCi0gKiBSZXR1cm5zIHRydWUgKG5vbnplcm8pIGlmIHRoZSBtZW1vcnkgYmxvY2sgbWF5IGJlIHZhbGlkLCBmYWxzZSAoemVybykKLSAqIGlmIGl0IGlzIGRlZmluaXRlbHkgaW52YWxpZC4KLSAqCi0gKiBOb3RlIHRoYXQsIGRlcGVuZGluZyBvbiBhcmNoaXRlY3R1cmUsIHRoaXMgZnVuY3Rpb24gcHJvYmFibHkganVzdAotICogY2hlY2tzIHRoYXQgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIHVzZXIgc3BhY2UgcmFuZ2UgLSBhZnRlciBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uLCBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyBtYXkgc3RpbGwgcmV0dXJuIC1FRkFVTFQuCi0gKi8KLQotI2RlZmluZSBfX2FjY2Vzc19tYXNrIGdldF9mcygpLnNlZwotCi0jZGVmaW5lIF9fYWNjZXNzX29rKGFkZHIsIHNpemUsIG1hc2spCQkJCQlcCi0JKCgoc2lnbmVkIGxvbmcpKChtYXNrKSAmICgoYWRkcikgfCAoKGFkZHIpICsgKHNpemUpKSB8IF9fdWFfc2l6ZShzaXplKSkpKSA9PSAwKQotCi0jZGVmaW5lIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKQkJCQkJXAotCWxpa2VseShfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksIChzaXplKSwgX19hY2Nlc3NfbWFzaykpCi0KLS8qCi0gKiBwdXRfdXNlcjogLSBXcml0ZSBhIHNpbXBsZSB2YWx1ZSBpbnRvIHVzZXIgc3BhY2UuCi0gKiBAeDogICBWYWx1ZSB0byBjb3B5IHRvIHVzZXIgc3BhY2UuCi0gKiBAcHRyOiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogVGhpcyBtYWNybyBjb3BpZXMgYSBzaW5nbGUgc2ltcGxlIHZhbHVlIGZyb20ga2VybmVsIHNwYWNlIHRvIHVzZXIKLSAqIHNwYWNlLiAgSXQgc3VwcG9ydHMgc2ltcGxlIHR5cGVzIGxpa2UgY2hhciBhbmQgaW50LCBidXQgbm90IGxhcmdlcgotICogZGF0YSB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgb3IgYXJyYXlzLgotICoKLSAqIEBwdHIgbXVzdCBoYXZlIHBvaW50ZXItdG8tc2ltcGxlLXZhcmlhYmxlIHR5cGUsIGFuZCBAeCBtdXN0IGJlIGFzc2lnbmFibGUKLSAqIHRvIHRoZSByZXN1bHQgb2YgZGVyZWZlcmVuY2luZyBAcHRyLgotICoKLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciAtRUZBVUxUIG9uIGVycm9yLgotICovCi0jZGVmaW5lIHB1dF91c2VyKHgscHRyKQlcCi0JX19wdXRfdXNlcl9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKLQotLyoKLSAqIGdldF91c2VyOiAtIEdldCBhIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UuCi0gKiBAeDogICBWYXJpYWJsZSB0byBzdG9yZSByZXN1bHQuCi0gKiBAcHRyOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIFRoaXMgbWFjcm8gY29waWVzIGEgc2luZ2xlIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsCi0gKiBzcGFjZS4gIEl0IHN1cHBvcnRzIHNpbXBsZSB0eXBlcyBsaWtlIGNoYXIgYW5kIGludCwgYnV0IG5vdCBsYXJnZXIKLSAqIGRhdGEgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIG9yIGFycmF5cy4KLSAqCi0gKiBAcHRyIG11c3QgaGF2ZSBwb2ludGVyLXRvLXNpbXBsZS12YXJpYWJsZSB0eXBlLCBhbmQgdGhlIHJlc3VsdCBvZgotICogZGVyZWZlcmVuY2luZyBAcHRyIG11c3QgYmUgYXNzaWduYWJsZSB0byBAeCB3aXRob3V0IGEgY2FzdC4KLSAqCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLUVGQVVMVCBvbiBlcnJvci4KLSAqIE9uIGVycm9yLCB0aGUgdmFyaWFibGUgQHggaXMgc2V0IHRvIHplcm8uCi0gKi8KLSNkZWZpbmUgZ2V0X3VzZXIoeCxwdHIpIFwKLQlfX2dldF91c2VyX2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQotCi0vKgotICogX19wdXRfdXNlcjogLSBXcml0ZSBhIHNpbXBsZSB2YWx1ZSBpbnRvIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB4OiAgIFZhbHVlIHRvIGNvcHkgdG8gdXNlciBzcGFjZS4KLSAqIEBwdHI6IERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBUaGlzIG1hY3JvIGNvcGllcyBhIHNpbmdsZSBzaW1wbGUgdmFsdWUgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlcgotICogc3BhY2UuICBJdCBzdXBwb3J0cyBzaW1wbGUgdHlwZXMgbGlrZSBjaGFyIGFuZCBpbnQsIGJ1dCBub3QgbGFyZ2VyCi0gKiBkYXRhIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBvciBhcnJheXMuCi0gKgotICogQHB0ciBtdXN0IGhhdmUgcG9pbnRlci10by1zaW1wbGUtdmFyaWFibGUgdHlwZSwgYW5kIEB4IG11c3QgYmUgYXNzaWduYWJsZQotICogdG8gdGhlIHJlc3VsdCBvZiBkZXJlZmVyZW5jaW5nIEBwdHIuCi0gKgotICogQ2FsbGVyIG11c3QgY2hlY2sgdGhlIHBvaW50ZXIgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzCi0gKiBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLUVGQVVMVCBvbiBlcnJvci4KLSAqLwotI2RlZmluZSBfX3B1dF91c2VyKHgscHRyKSBcCi0JX19wdXRfdXNlcl9ub2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQotCi0vKgotICogX19nZXRfdXNlcjogLSBHZXQgYSBzaW1wbGUgdmFyaWFibGUgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCi0gKiBAeDogICBWYXJpYWJsZSB0byBzdG9yZSByZXN1bHQuCi0gKiBAcHRyOiBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIFRoaXMgbWFjcm8gY29waWVzIGEgc2luZ2xlIHNpbXBsZSB2YXJpYWJsZSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsCi0gKiBzcGFjZS4gIEl0IHN1cHBvcnRzIHNpbXBsZSB0eXBlcyBsaWtlIGNoYXIgYW5kIGludCwgYnV0IG5vdCBsYXJnZXIKLSAqIGRhdGEgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIG9yIGFycmF5cy4KLSAqCi0gKiBAcHRyIG11c3QgaGF2ZSBwb2ludGVyLXRvLXNpbXBsZS12YXJpYWJsZSB0eXBlLCBhbmQgdGhlIHJlc3VsdCBvZgotICogZGVyZWZlcmVuY2luZyBAcHRyIG11c3QgYmUgYXNzaWduYWJsZSB0byBAeCB3aXRob3V0IGEgY2FzdC4KLSAqCi0gKiBDYWxsZXIgbXVzdCBjaGVjayB0aGUgcG9pbnRlciB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAqIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciAtRUZBVUxUIG9uIGVycm9yLgotICogT24gZXJyb3IsIHRoZSB2YXJpYWJsZSBAeCBpcyBzZXQgdG8gemVyby4KLSAqLwotI2RlZmluZSBfX2dldF91c2VyKHgscHRyKSBcCi0JX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQotCi1zdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIGJ1ZlsxMDBdOyB9OwotI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0IF9fdXNlciAqKSh4KSkKLQotLyoKLSAqIFl1Y2suICBXZSBuZWVkIHR3byB2YXJpYW50cywgb25lIGZvciA2NGJpdCBvcGVyYXRpb24gYW5kIG9uZQotICogZm9yIDMyIGJpdCBtb2RlIGFuZCBvbGQgaXJvbi4KLSAqLwotI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBfX0dFVF9VU0VSX0RXKHZhbCwgcHRyKSBfX2dldF91c2VyX2FzbV9sbDMyKHZhbCwgcHRyKQotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9fR0VUX1VTRVJfRFcodmFsLCBwdHIpIF9fZ2V0X3VzZXJfYXNtKHZhbCwgImxkIiwgcHRyKQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIF9fZ2V0X3VzZXJfdW5rbm93bih2b2lkKTsKLQotI2RlZmluZSBfX2dldF91c2VyX2NvbW1vbih2YWwsIHNpemUsIHB0cikJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMTogX19nZXRfdXNlcl9hc20odmFsLCAibGIiLCBwdHIpOyBicmVhazsJCQlcCi0JY2FzZSAyOiBfX2dldF91c2VyX2FzbSh2YWwsICJsaCIsIHB0cik7IGJyZWFrOwkJCVwKLQljYXNlIDQ6IF9fZ2V0X3VzZXJfYXNtKHZhbCwgImx3IiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgODogX19HRVRfVVNFUl9EVyh2YWwsIHB0cik7IGJyZWFrOwkJCQlcCi0JZGVmYXVsdDogX19nZXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwkJCQlcCi0JfQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX2dldF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCQlcCi0oewkJCQkJCQkJCVwKLQlsb25nIF9fZ3VfZXJyOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19nZXRfdXNlcl9jb21tb24oKHgpLCBzaXplLCBwdHIpOwkJCQlcCi0JX19ndV9lcnI7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LCBwdHIsIHNpemUpCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlsb25nIF9fZ3VfZXJyID0gLUVGQVVMVDsJCQkJCVwKLQljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICogX19ndV9wdHIgPSAocHRyKTsJCVwKLQkJCQkJCQkJCVwKLQlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgIF9fZ3VfcHRyLCBzaXplKSkpCQlcCi0JCV9fZ2V0X3VzZXJfY29tbW9uKCh4KSwgc2l6ZSwgX19ndV9wdHIpOwkJCVwKLQkJCQkJCQkJCVwKLQlfX2d1X2VycjsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX2dldF91c2VyX2FzbSh2YWwsIGluc24sIGFkZHIpCQkJCQlcCi17CQkJCQkJCQkJXAotCWxvbmcgX19ndV90bXA7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CSIgaW5zbiAiCSUxLCAlMwkJCQlcbiIJXAotCSIyOgkJCQkJCQlcbiIJXAotCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIgkJCQlcbiIJXAotCSIzOglsaQklMCwgJTQJCQkJCVxuIglcCi0JIglqCTJiCQkJCQlcbiIJXAotCSIJLnByZXZpb3VzCQkJCQlcbiIJXAotCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIgkJCVxuIglcCi0JIgkiX19VQV9BRERSICJcdDFiLCAzYgkJCQlcbiIJXAotCSIJLnByZXZpb3VzCQkJCQlcbiIJXAotCTogIj1yIiAoX19ndV9lcnIpLCAiPXIiIChfX2d1X3RtcCkJCQkJXAotCTogIjAiICgwKSwgIm8iIChfX20oYWRkcikpLCAiaSIgKC1FRkFVTFQpKTsJCQlcCi0JCQkJCQkJCQlcCi0JKHZhbCkgPSAoX190eXBlb2ZfXygqKGFkZHIpKSkgX19ndV90bXA7CQkJCVwKLX0KLQotLyoKLSAqIEdldCBhIGxvbmcgbG9uZyA2NCB1c2luZyAzMiBiaXQgcmVnaXN0ZXJzLgotICovCi0jZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2xsMzIodmFsLCBhZGRyKQkJCQkJXAotewkJCQkJCQkJCVwKLQl1bmlvbiB7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgbG9uZwlsOwkJCQlcCi0JCV9fdHlwZW9mX18oKihhZGRyKSkJdDsJCQkJXAotCX0gX19ndV90bXA7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CWx3CSUxLCAoJTMpCQkJCVxuIglcCi0JIjI6CWx3CSVEMSwgNCglMykJCQkJXG4iCVwKLQkiMzoJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCi0JIjQ6CWxpCSUwLCAlNAkJCQkJXG4iCVwKLQkiCW1vdmUJJTEsICQwCQkJCQlcbiIJXAotCSIJbW92ZQklRDEsICQwCQkJCQlcbiIJXAotCSIJagkzYgkJCQkJXG4iCVwKLQkiCS5wcmV2aW91cwkJCQkJXG4iCVwKLQkiCS5zZWN0aW9uCV9fZXhfdGFibGUsXCJhXCIJCVxuIglcCi0JIgkiIF9fVUFfQUREUiAiCTFiLCA0YgkJCQlcbiIJXAotCSIJIiBfX1VBX0FERFIgIgkyYiwgNGIJCQkJXG4iCVwKLQkiCS5wcmV2aW91cwkJCQkJXG4iCVwKLQk6ICI9ciIgKF9fZ3VfZXJyKSwgIj0mciIgKF9fZ3VfdG1wLmwpCQkJCVwKLQk6ICIwIiAoMCksICJyIiAoYWRkciksICJpIiAoLUVGQVVMVCkpOwkJCQlcCi0JCQkJCQkJCQlcCi0JKHZhbCkgPSBfX2d1X3RtcC50OwkJCQkJCVwKLX0KLQotLyoKLSAqIFl1Y2suICBXZSBuZWVkIHR3byB2YXJpYW50cywgb25lIGZvciA2NGJpdCBvcGVyYXRpb24gYW5kIG9uZQotICogZm9yIDMyIGJpdCBtb2RlIGFuZCBvbGQgaXJvbi4KLSAqLwotI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBfX1BVVF9VU0VSX0RXKHB0cikgX19wdXRfdXNlcl9hc21fbGwzMihwdHIpCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgX19QVVRfVVNFUl9EVyhwdHIpIF9fcHV0X3VzZXJfYXNtKCJzZCIsIHB0cikKLSNlbmRpZgotCi0jZGVmaW5lIF9fcHV0X3VzZXJfbm9jaGVjayh4LCBwdHIsIHNpemUpCQkJCVwKLSh7CQkJCQkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX3B1X3ZhbDsJCQkJCVwKLQlsb25nIF9fcHVfZXJyID0gMDsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19wdV92YWwgPSAoeCk7CQkJCQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMTogX19wdXRfdXNlcl9hc20oInNiIiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgMjogX19wdXRfdXNlcl9hc20oInNoIiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgNDogX19wdXRfdXNlcl9hc20oInN3IiwgcHRyKTsgYnJlYWs7CQkJXAotCWNhc2UgODogX19QVVRfVVNFUl9EVyhwdHIpOyBicmVhazsJCQkJXAotCWRlZmF1bHQ6IF9fcHV0X3VzZXJfdW5rbm93bigpOyBicmVhazsJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3B1X2VycjsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBfX3B1dF91c2VyX2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX3VzZXIgKl9fcHVfYWRkciA9IChwdHIpOwkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19wdV92YWwgPSAoeCk7CQkJCVwKLQlsb25nIF9fcHVfZXJyID0gLUVGQVVMVDsJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICBfX3B1X2FkZHIsIHNpemUpKSkgewlcCi0JCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKLQkJY2FzZSAxOiBfX3B1dF91c2VyX2FzbSgic2IiLCBfX3B1X2FkZHIpOyBicmVhazsJCVwKLQkJY2FzZSAyOiBfX3B1dF91c2VyX2FzbSgic2giLCBfX3B1X2FkZHIpOyBicmVhazsJCVwKLQkJY2FzZSA0OiBfX3B1dF91c2VyX2FzbSgic3ciLCBfX3B1X2FkZHIpOyBicmVhazsJCVwKLQkJY2FzZSA4OiBfX1BVVF9VU0VSX0RXKF9fcHVfYWRkcik7IGJyZWFrOwkJXAotCQlkZWZhdWx0OiBfX3B1dF91c2VyX3Vua25vd24oKTsgYnJlYWs7CQkJXAotCQl9CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JX19wdV9lcnI7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19wdXRfdXNlcl9hc20oaW5zbiwgcHRyKQkJCQkJXAotewkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CSIgaW5zbiAiCSV6MiwgJTMJCSMgX19wdXRfdXNlcl9hc21cbiIJXAotCSIyOgkJCQkJCQlcbiIJXAotCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIgkJCVxuIglcCi0JIjM6CWxpCSUwLCAlNAkJCQkJXG4iCVwKLQkiCWoJMmIJCQkJCVxuIglcCi0JIgkucHJldmlvdXMJCQkJCVxuIglcCi0JIgkuc2VjdGlvbglfX2V4X3RhYmxlLFwiYVwiCQlcbiIJXAotCSIJIiBfX1VBX0FERFIgIgkxYiwgM2IJCQkJXG4iCVwKLQkiCS5wcmV2aW91cwkJCQkJXG4iCVwKLQk6ICI9ciIgKF9fcHVfZXJyKQkJCQkJCVwKLQk6ICIwIiAoMCksICJKciIgKF9fcHVfdmFsKSwgIm8iIChfX20ocHRyKSksCQkJXAotCSAgImkiICgtRUZBVUxUKSk7CQkJCQkJXAotfQotCi0jZGVmaW5lIF9fcHV0X3VzZXJfYXNtX2xsMzIocHRyKQkJCQkJXAotewkJCQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIjE6CXN3CSUyLCAoJTMpCSMgX19wdXRfdXNlcl9hc21fbGwzMglcbiIJXAotCSIyOglzdwklRDIsIDQoJTMpCQkJCVxuIglcCi0JIjM6CQkJCQkJCVxuIglcCi0JIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiCQkJXG4iCVwKLQkiNDoJbGkJJTAsICU0CQkJCQlcbiIJXAotCSIJagkzYgkJCQkJXG4iCVwKLQkiCS5wcmV2aW91cwkJCQkJXG4iCVwKLQkiCS5zZWN0aW9uCV9fZXhfdGFibGUsXCJhXCIJCVxuIglcCi0JIgkiIF9fVUFfQUREUiAiCTFiLCA0YgkJCQlcbiIJXAotCSIJIiBfX1VBX0FERFIgIgkyYiwgNGIJCQkJXG4iCVwKLQkiCS5wcmV2aW91cyIJCQkJCQlcCi0JOiAiPXIiIChfX3B1X2VycikJCQkJCQlcCi0JOiAiMCIgKDApLCAiciIgKF9fcHVfdmFsKSwgInIiIChwdHIpLAkJCQlcCi0JICAiaSIgKC1FRkFVTFQpKTsJCQkJCQlcCi19Ci0KLWV4dGVybiB2b2lkIF9fcHV0X3VzZXJfdW5rbm93bih2b2lkKTsKLQotLyoKLSAqIFdlJ3JlIGdlbmVyYXRpbmcganVtcCB0byBzdWJyb3V0aW5lcyB3aGljaCB3aWxsIGJlIG91dHNpZGUgdGhlIHJhbmdlIG9mCi0gKiBqdW1wIGluc3RydWN0aW9ucwotICovCi0jaWZkZWYgTU9EVUxFCi0jZGVmaW5lIF9fTU9EVUxFX0pBTChkZXN0aW5hdGlvbikJCQkJCVwKLQkiLnNldFx0bm9hdFxuXHQiCQkJCQkJXAotCV9fVUFfTEEgIlx0JDEsICIgI2Rlc3RpbmF0aW9uICJcblx0IiAJCQkJXAotCSJqYWxyXHQkMVxuXHQiCQkJCQkJCVwKLQkiLnNldFx0YXRcblx0IgotI2Vsc2UKLSNkZWZpbmUgX19NT0RVTEVfSkFMKGRlc3RpbmF0aW9uKQkJCQkJXAotCSJqYWxcdCIgI2Rlc3RpbmF0aW9uICJcblx0IgotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX0NQVV9EQURESV9XT1JLQVJPVU5EUwotI2RlZmluZSBEQURESV9TQ1JBVENIICIkMCIKLSNlbHNlCi0jZGVmaW5lIERBRERJX1NDUkFUQ0ggIiQzIgotI2VuZGlmCi0KLWV4dGVybiBzaXplX3QgX19jb3B5X3VzZXIodm9pZCAqX190bywgY29uc3Qgdm9pZCAqX19mcm9tLCBzaXplX3QgX19uKTsKLQotI2RlZmluZSBfX2ludm9rZV9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJCVwKLSh7CQkJCQkJCQkJXAotCXJlZ2lzdGVyIHZvaWQgX191c2VyICpfX2N1X3RvX3IgX19hc21fXygiJDQiKTsJCQlcCi0JcmVnaXN0ZXIgY29uc3Qgdm9pZCAqX19jdV9mcm9tX3IgX19hc21fXygiJDUiKTsJCQlcCi0JcmVnaXN0ZXIgbG9uZyBfX2N1X2xlbl9yIF9fYXNtX18oIiQ2Iik7CQkJCVwKLQkJCQkJCQkJCVwKLQlfX2N1X3RvX3IgPSAodG8pOwkJCQkJCVwKLQlfX2N1X2Zyb21fciA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW5fciA9IChuKTsJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCV9fTU9EVUxFX0pBTChfX2NvcHlfdXNlcikJCQkJCVwKLQk6ICIrciIgKF9fY3VfdG9fciksICIrciIgKF9fY3VfZnJvbV9yKSwgIityIiAoX19jdV9sZW5fcikJXAotCToJCQkJCQkJCVwKLQk6ICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTUiLCAiJDI0IiwgIiQzMSIsCQlcCi0JICBEQURESV9TQ1JBVENILCAibWVtb3J5Iik7CQkJCQlcCi0JX19jdV9sZW5fcjsJCQkJCQkJXAotfSkKLQotLyoKLSAqIF9fY29weV90b191c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGludG8gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgotICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KLSAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIENvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKLSAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KLSAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgotICovCi0jZGVmaW5lIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJCQkJXAotKHsJCQkJCQkJCQlcCi0Jdm9pZCBfX3VzZXIgKl9fY3VfdG87CQkJCQkJXAotCWNvbnN0IHZvaWQgKl9fY3VfZnJvbTsJCQkJCQlcCi0JbG9uZyBfX2N1X2xlbjsJCQkJCQkJXAotCQkJCQkJCQkJXAotCW1pZ2h0X3NsZWVwKCk7CQkJCQkJCVwKLQlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAotCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sIF9fY3VfbGVuKTsJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi1leHRlcm4gc2l6ZV90IF9fY29weV91c2VyX2luYXRvbWljKHZvaWQgKl9fdG8sIGNvbnN0IHZvaWQgKl9fZnJvbSwgc2l6ZV90IF9fbik7Ci0KLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCQkJCVwKLSh7CQkJCQkJCQkJXAotCXZvaWQgX191c2VyICpfX2N1X3RvOwkJCQkJCVwKLQljb25zdCB2b2lkICpfX2N1X2Zyb207CQkJCQkJXAotCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAotCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sIF9fY3VfbGVuKTsJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCQkJCVwKLSh7CQkJCQkJCQkJXAotCXZvaWQgKl9fY3VfdG87CQkJCQkJCVwKLQljb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tOwkJCQkJXAotCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAotCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKF9fY3VfdG8sIF9fY3VfZnJvbSwJXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdV9sZW4pOwkJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi0vKgotICogY29weV90b191c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGludG8gdXNlciBzcGFjZS4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCi0gKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCi0gKgotICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KLSAqCi0gKiBDb3B5IGRhdGEgZnJvbSBrZXJuZWwgc3BhY2UgdG8gdXNlciBzcGFjZS4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCi0gKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KLSAqLwotI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCi0oewkJCQkJCQkJCVwKLQl2b2lkIF9fdXNlciAqX19jdV90bzsJCQkJCQlcCi0JY29uc3Qgdm9pZCAqX19jdV9mcm9tOwkJCQkJCVwKLQlsb25nIF9fY3VfbGVuOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JbWlnaHRfc2xlZXAoKTsJCQkJCQkJXAotCV9fY3VfdG8gPSAodG8pOwkJCQkJCQlcCi0JX19jdV9mcm9tID0gKGZyb20pOwkJCQkJCVwKLQlfX2N1X2xlbiA9IChuKTsJCQkJCQkJXAotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBfX2N1X3RvLCBfX2N1X2xlbikpCQkJXAotCQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfdG9fdXNlcihfX2N1X3RvLCBfX2N1X2Zyb20sCVwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdV9sZW4pOwkJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJCQlcCi0oewkJCQkJCQkJCVwKLQlyZWdpc3RlciB2b2lkICpfX2N1X3RvX3IgX19hc21fXygiJDQiKTsJCQkJXAotCXJlZ2lzdGVyIGNvbnN0IHZvaWQgX191c2VyICpfX2N1X2Zyb21fciBfX2FzbV9fKCIkNSIpOwkJXAotCXJlZ2lzdGVyIGxvbmcgX19jdV9sZW5fciBfX2FzbV9fKCIkNiIpOwkJCQlcCi0JCQkJCQkJCQlcCi0JX19jdV90b19yID0gKHRvKTsJCQkJCQlcCi0JX19jdV9mcm9tX3IgPSAoZnJvbSk7CQkJCQkJXAotCV9fY3VfbGVuX3IgPSAobik7CQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiLnNldFx0bm9yZW9yZGVyXG5cdCIJCQkJCQlcCi0JX19NT0RVTEVfSkFMKF9fY29weV91c2VyKQkJCQkJXAotCSIuc2V0XHRub2F0XG5cdCIJCQkJCQlcCi0JX19VQV9BRERVICJcdCQxLCAlMSwgJTJcblx0IgkJCQkJXAotCSIuc2V0XHRhdFxuXHQiCQkJCQkJCVwKLQkiLnNldFx0cmVvcmRlciIJCQkJCQkJXAotCTogIityIiAoX19jdV90b19yKSwgIityIiAoX19jdV9mcm9tX3IpLCAiK3IiIChfX2N1X2xlbl9yKQlcCi0JOgkJCQkJCQkJXAotCTogIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxNSIsICIkMjQiLCAiJDMxIiwJCVwKLQkgIERBRERJX1NDUkFUQ0gsICJtZW1vcnkiKTsJCQkJCVwKLQlfX2N1X2xlbl9yOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9faW52b2tlX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkJCVwKLSh7CQkJCQkJCQkJXAotCXJlZ2lzdGVyIHZvaWQgKl9fY3VfdG9fciBfX2FzbV9fKCIkNCIpOwkJCQlcCi0JcmVnaXN0ZXIgY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbV9yIF9fYXNtX18oIiQ1Iik7CQlcCi0JcmVnaXN0ZXIgbG9uZyBfX2N1X2xlbl9yIF9fYXNtX18oIiQ2Iik7CQkJCVwKLQkJCQkJCQkJCVwKLQlfX2N1X3RvX3IgPSAodG8pOwkJCQkJCVwKLQlfX2N1X2Zyb21fciA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW5fciA9IChuKTsJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIuc2V0XHRub3Jlb3JkZXJcblx0IgkJCQkJCVwKLQlfX01PRFVMRV9KQUwoX19jb3B5X3VzZXJfaW5hdG9taWMpCQkJCVwKLQkiLnNldFx0bm9hdFxuXHQiCQkJCQkJXAotCV9fVUFfQUREVSAiXHQkMSwgJTEsICUyXG5cdCIJCQkJCVwKLQkiLnNldFx0YXRcblx0IgkJCQkJCQlcCi0JIi5zZXRcdHJlb3JkZXIiCQkJCQkJCVwKLQk6ICIrciIgKF9fY3VfdG9fciksICIrciIgKF9fY3VfZnJvbV9yKSwgIityIiAoX19jdV9sZW5fcikJXAotCToJCQkJCQkJCVwKLQk6ICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTUiLCAiJDI0IiwgIiQzMSIsCQlcCi0JICBEQURESV9TQ1JBVENILCAibWVtb3J5Iik7CQkJCQlcCi0JX19jdV9sZW5fcjsJCQkJCQkJXAotfSkKLQotLyoKLSAqIF9fY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCi0gKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UuICBDYWxsZXIgbXVzdCBjaGVjawotICogdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgotICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCi0gKgotICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAotICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KLSAqLwotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJCQkJXAotKHsJCQkJCQkJCQlcCi0Jdm9pZCAqX19jdV90bzsJCQkJCQkJXAotCWNvbnN0IHZvaWQgX191c2VyICpfX2N1X2Zyb207CQkJCQlcCi0JbG9uZyBfX2N1X2xlbjsJCQkJCQkJXAotCQkJCQkJCQkJXAotCW1pZ2h0X3NsZWVwKCk7CQkJCQkJCVwKLQlfX2N1X3RvID0gKHRvKTsJCQkJCQkJXAotCV9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCi0JX19jdV9sZW4gPSAobik7CQkJCQkJCVwKLQlfX2N1X2xlbiA9IF9faW52b2tlX2NvcHlfZnJvbV91c2VyKF9fY3VfdG8sIF9fY3VfZnJvbSwJCVwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3VfbGVuKTsJCQlcCi0JX19jdV9sZW47CQkJCQkJCVwKLX0pCi0KLS8qCi0gKiBjb3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHVzZXIgc3BhY2UuCi0gKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLgotICogQGZyb206IFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5LgotICoKLSAqIENvbnRleHQ6IFVzZXIgY29udGV4dCBvbmx5LiAgVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuCi0gKgotICogQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UuCi0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgotICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCi0gKgotICogSWYgc29tZSBkYXRhIGNvdWxkIG5vdCBiZSBjb3BpZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBwYWQgdGhlIGNvcGllZAotICogZGF0YSB0byB0aGUgcmVxdWVzdGVkIHNpemUgdXNpbmcgemVybyBieXRlcy4KLSAqLwotI2RlZmluZSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXZvaWQgKl9fY3VfdG87CQkJCQkJCVwKLQljb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tOwkJCQkJXAotCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQltaWdodF9zbGVlcCgpOwkJCQkJCQlcCi0JX19jdV90byA9ICh0byk7CQkJCQkJCVwKLQlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAotCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19jdV9mcm9tLCBfX2N1X2xlbikpCQlcCi0JCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdV9sZW4pOwkJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fY29weV9pbl91c2VyKHRvLCBmcm9tLCBuKQlfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQotCi0jZGVmaW5lIGNvcHlfaW5fdXNlcih0bywgZnJvbSwgbikJCQkJCVwKLSh7CQkJCQkJCQkJXAotCXZvaWQgX191c2VyICpfX2N1X3RvOwkJCQkJCVwKLQljb25zdCB2b2lkIF9fdXNlciAqX19jdV9mcm9tOwkJCQkJXAotCWxvbmcgX19jdV9sZW47CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQltaWdodF9zbGVlcCgpOwkJCQkJCQlcCi0JX19jdV90byA9ICh0byk7CQkJCQkJCVwKLQlfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAotCV9fY3VfbGVuID0gKG4pOwkJCQkJCQlcCi0JaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fY3VfZnJvbSwgX19jdV9sZW4pICYmCVwKLQkgICAgICAgICAgIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIF9fY3VfdG8sIF9fY3VfbGVuKSkpCQlcCi0JCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywgX19jdV9mcm9tLAlcCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdV9sZW4pOwkJXAotCV9fY3VfbGVuOwkJCQkJCQlcCi19KQotCi0vKgotICogX19jbGVhcl91c2VyOiAtIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgotICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8uCi0gKgotICogWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKLSAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNsZWFyZWQuCi0gKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KLSAqLwotc3RhdGljIGlubGluZSBfX2tlcm5lbF9zaXplX3QKLV9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqYWRkciwgX19rZXJuZWxfc2l6ZV90IHNpemUpCi17Ci0JX19rZXJuZWxfc2l6ZV90IHJlczsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQkibW92ZVx0JDUsICQwXG5cdCIKLQkJIm1vdmVcdCQ2LCAlMlxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX2J6ZXJvKQotCQkibW92ZVx0JTAsICQ2IgotCQk6ICI9ciIgKHJlcykKLQkJOiAiciIgKGFkZHIpLCAiciIgKHNpemUpCi0JCTogIiQ0IiwgIiQ1IiwgIiQ2IiwgX19VQV90MCwgX19VQV90MSwgIiQzMSIpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotI2RlZmluZSBjbGVhcl91c2VyKGFkZHIsbikJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQl2b2lkIF9fdXNlciAqIF9fY2xfYWRkciA9IChhZGRyKTsJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19jbF9zaXplID0gKG4pOwkJCQkJXAotCWlmIChfX2NsX3NpemUgJiYgYWNjZXNzX29rKFZFUklGWV9XUklURSwJCQlcCi0JCSgodW5zaWduZWQgbG9uZykoX19jbF9hZGRyKSksIF9fY2xfc2l6ZSkpCQlcCi0JCV9fY2xfc2l6ZSA9IF9fY2xlYXJfdXNlcihfX2NsX2FkZHIsIF9fY2xfc2l6ZSk7CQlcCi0JX19jbF9zaXplOwkJCQkJCQlcCi19KQotCi0vKgotICogX19zdHJuY3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLCB3aXRoIGxlc3MgY2hlY2tpbmcuCi0gKiBAZHN0OiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4gIFRoaXMgYnVmZmVyIG11c3QgYmUgYXQKLSAqICAgICAgICAgbGVhc3QgQGNvdW50IGJ5dGVzIGxvbmcuCi0gKiBAc3JjOiAgIFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQGNvdW50OiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4KLSAqCi0gKiBDb3BpZXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UgdG8ga2VybmVsIHNwYWNlLgotICogQ2FsbGVyIG11c3QgY2hlY2sgdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIGFjY2Vzc19vaygpIGJlZm9yZSBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZwotICogTlVMKS4KLSAqCi0gKiBJZiBhY2Nlc3MgdG8gdXNlcnNwYWNlIGZhaWxzLCByZXR1cm5zIC1FRkFVTFQgKHNvbWUgZGF0YSBtYXkgaGF2ZSBiZWVuCi0gKiBjb3BpZWQpLgotICoKLSAqIElmIEBjb3VudCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBjb3BpZXMgQGNvdW50IGJ5dGVzCi0gKiBhbmQgcmV0dXJucyBAY291bnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgbG9uZwotX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpfX3RvLCBjb25zdCBjaGFyIF9fdXNlciAqX19mcm9tLCBsb25nIF9fbGVuKQotewotCWxvbmcgcmVzOwotCi0JbWlnaHRfc2xlZXAoKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJIm1vdmVcdCQ0LCAlMVxuXHQiCi0JCSJtb3ZlXHQkNSwgJTJcblx0IgotCQkibW92ZVx0JDYsICUzXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3RybmNweV9mcm9tX3VzZXJfbm9jaGVja19hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAoX190byksICJyIiAoX19mcm9tKSwgInIiIChfX2xlbikKLQkJOiAiJDIiLCAiJDMiLCAiJDQiLCAiJDUiLCAiJDYiLCBfX1VBX3QwLCAiJDMxIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqIHN0cm5jcHlfZnJvbV91c2VyOiAtIENvcHkgYSBOVUwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCi0gKiBAZHN0OiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4gIFRoaXMgYnVmZmVyIG11c3QgYmUgYXQKLSAqICAgICAgICAgbGVhc3QgQGNvdW50IGJ5dGVzIGxvbmcuCi0gKiBAc3JjOiAgIFNvdXJjZSBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQGNvdW50OiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5LCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4KLSAqCi0gKiBDb3BpZXMgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UgdG8ga2VybmVsIHNwYWNlLgotICoKLSAqIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZwotICogTlVMKS4KLSAqCi0gKiBJZiBhY2Nlc3MgdG8gdXNlcnNwYWNlIGZhaWxzLCByZXR1cm5zIC1FRkFVTFQgKHNvbWUgZGF0YSBtYXkgaGF2ZSBiZWVuCi0gKiBjb3BpZWQpLgotICoKLSAqIElmIEBjb3VudCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBjb3BpZXMgQGNvdW50IGJ5dGVzCi0gKiBhbmQgcmV0dXJucyBAY291bnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgbG9uZwotc3RybmNweV9mcm9tX3VzZXIoY2hhciAqX190bywgY29uc3QgY2hhciBfX3VzZXIgKl9fZnJvbSwgbG9uZyBfX2xlbikKLXsKLQlsb25nIHJlczsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQkibW92ZVx0JDUsICUyXG5cdCIKLQkJIm1vdmVcdCQ2LCAlM1xuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5jcHlfZnJvbV91c2VyX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChfX3RvKSwgInIiIChfX2Zyb20pLCAiciIgKF9fbGVuKQotCQk6ICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsIF9fVUFfdDAsICIkMzEiLCAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKiBSZXR1cm5zOiAwIGlmIGJhZCwgc3RyaW5nIGxlbmd0aCsxIChtZW1vcnkgc2l6ZSkgb2Ygc3RyaW5nIGlmIG9rICovCi1zdGF0aWMgaW5saW5lIGxvbmcgX19zdHJsZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcykKLXsKLQlsb25nIHJlczsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJtb3ZlXHQkNCwgJTFcblx0IgotCQlfX01PRFVMRV9KQUwoX19zdHJsZW5fdXNlcl9ub2NoZWNrX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChzKQotCQk6ICIkMiIsICIkNCIsIF9fVUFfdDAsICIkMzEiKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KLSAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgotICoKLSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KLSAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgotICoKLSAqIElmIHRoZXJlIGlzIGEgbGltaXQgb24gdGhlIGxlbmd0aCBvZiBhIHZhbGlkIHN0cmluZywgeW91IG1heSB3aXNoIHRvCi0gKiBjb25zaWRlciB1c2luZyBzdHJubGVuX3VzZXIoKSBpbnN0ZWFkLgotICovCi1zdGF0aWMgaW5saW5lIGxvbmcgc3RybGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMpCi17Ci0JbG9uZyByZXM7Ci0KLQltaWdodF9zbGVlcCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJX19NT0RVTEVfSkFMKF9fc3RybGVuX3VzZXJfYXNtKQotCQkibW92ZVx0JTAsICQyIgotCQk6ICI9ciIgKHJlcykKLQkJOiAiciIgKHMpCi0JCTogIiQyIiwgIiQ0IiwgX19VQV90MCwgIiQzMSIpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogUmV0dXJuczogMCBpZiBiYWQsIHN0cmluZyBsZW5ndGgrMSAobWVtb3J5IHNpemUpIG9mIHN0cmluZyBpZiBvayAqLwotc3RhdGljIGlubGluZSBsb25nIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCi17Ci0JbG9uZyByZXM7Ci0KLQltaWdodF9zbGVlcCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9ub2NoZWNrX2FzbSkKLQkJIm1vdmVcdCUwLCAkMiIKLQkJOiAiPXIiIChyZXMpCi0JCTogInIiIChzKSwgInIiIChuKQotCQk6ICIkMiIsICIkNCIsICIkNSIsIF9fVUFfdDAsICIkMzEiKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KLSAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KLSAqCi0gKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgotICoKLSAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgotICoKLSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KLSAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgotICoKLSAqIElmIHRoZXJlIGlzIGEgbGltaXQgb24gdGhlIGxlbmd0aCBvZiBhIHZhbGlkIHN0cmluZywgeW91IG1heSB3aXNoIHRvCi0gKiBjb25zaWRlciB1c2luZyBzdHJubGVuX3VzZXIoKSBpbnN0ZWFkLgotICovCi1zdGF0aWMgaW5saW5lIGxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCi17Ci0JbG9uZyByZXM7Ci0KLQltaWdodF9zbGVlcCgpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkibW92ZVx0JDQsICUxXG5cdCIKLQkJIm1vdmVcdCQ1LCAlMlxuXHQiCi0JCV9fTU9EVUxFX0pBTChfX3N0cm5sZW5fdXNlcl9hc20pCi0JCSJtb3ZlXHQlMCwgJDIiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAocyksICJyIiAobikKLQkJOiAiJDIiLCAiJDQiLCAiJDUiLCBfX1VBX3QwLCAiJDMxIik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5Ci17Ci0JdW5zaWduZWQgbG9uZyBpbnNuOwotCXVuc2lnbmVkIGxvbmcgbmV4dGluc247Ci19OwotCi1leHRlcm4gaW50IGZpeHVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KLSNlbmRpZiAvKiBfQVNNX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9lbGYuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZWxmLmgKaW5kZXggMjU2YTcwNC4uYmYwOWY4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2VsZi5oCkBAIC0xNDEsNyArMTQxLDcgQEAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4KSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvYS5vdXQuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9hLm91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjA0ZTM0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9hLm91dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBfX1BBUklTQ19BX09VVF9IX18KLSNkZWZpbmUgX19QQVJJU0NfQV9PVVRfSF9fCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGludCBhX2luZm87CQkvKiBVc2UgbWFjcm9zIE5fTUFHSUMsIGV0YyBmb3IgYWNjZXNzICovCi0gIHVuc2lnbmVkIGFfdGV4dDsJCS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2VudHJ5OwkJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLX07Ci0KLSNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQotCi0jZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZWxmLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZWxmLmgKaW5kZXggZDBhNGE4Mi4uN2ZhNjc1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9lbGYuaApAQCAtMjM2LDcgKzIzNiw3IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoIlBBUklTQ1wwIikKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBcCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgXAogCWN1cnJlbnQtPnBlcnNvbmFsaXR5ID0gUEVSX0xJTlVYOyBcCiAJY3VycmVudC0+dGhyZWFkLm1hcF9iYXNlID0gREVGQVVMVF9NQVBfQkFTRTsgXAogCWN1cnJlbnQtPnRocmVhZC50YXNrX3NpemUgPSBERUZBVUxUX1RBU0tfU0laRSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc2VjdGlvbnMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zZWN0aW9ucy5oCmluZGV4IGZkZDQzZWMuLjlkMTNjMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zZWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zZWN0aW9ucy5oCkBAIC00LDQgKzQsOSBAQAogLyogbm90aGluZyB0byBzZWUsIG1vdmUgYWxvbmcgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogCisjaWZkZWYgQ09ORklHXzY0QklUCisjdW5kZWYgZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcgordm9pZCAqZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcih2b2lkICopOworI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3NpZ2luZm8uaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zaWdpbmZvLmgKaW5kZXggZDQ5MDlmNS4uZDcwMzQ3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3NpZ2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc2lnaW5mby5oCkBAIC0zLDExICszLDYgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KIAotLyoKLSAqIFNJR1RSQVAgc2lfY29kZXMKLSAqLwotI2RlZmluZSBUUkFQX0JSQU5DSAkoX19TSV9GQVVMVHwzKQkvKiBwcm9jZXNzIHRha2VuIGJyYW5jaCB0cmFwICovCi0jZGVmaW5lIFRSQVBfSFdCS1BUCShfX1NJX0ZBVUxUfDQpCS8qIGhhcmR3YXJlIGJyZWFrcG9pbnQgb3Igd2F0Y2hwb2ludCAqLwogI3VuZGVmIE5TSUdUUkFQCiAjZGVmaW5lIE5TSUdUUkFQCTQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3N0YXRmcy5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3N0YXRmcy5oCmluZGV4IDFkMmI4MTMuLjMyNGJlYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zdGF0ZnMuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc3RhdGZzLmgKQEAgLTEsNTggKzEsNyBAQAogI2lmbmRlZiBfUEFSSVNDX1NUQVRGU19ICiAjZGVmaW5lIF9QQVJJU0NfU1RBVEZTX0gKIAotI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXR5cGVkZWYgX19rZXJuZWxfZnNpZF90CWZzaWRfdDsKLQotI2VuZGlmCi0KLS8qCi0gKiBJdCBhcHBlYXJzIHRoYXQgUEFSSVNDIGNvdWxkIGJlIDY0IF9vcl8gMzIgYml0LgotICogNjQtYml0IGZpZWxkcyBtdXN0IGJlIGV4cGxpY2l0bHkgNjQtYml0IGluIHN0YXRmczY0LgotICovCi1zdHJ1Y3Qgc3RhdGZzIHsKLQlsb25nIGZfdHlwZTsKLQlsb25nIGZfYnNpemU7Ci0JbG9uZyBmX2Jsb2NrczsKLQlsb25nIGZfYmZyZWU7Ci0JbG9uZyBmX2JhdmFpbDsKLQlsb25nIGZfZmlsZXM7Ci0JbG9uZyBmX2ZmcmVlOwotCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7Ci0JbG9uZyBmX25hbWVsZW47Ci0JbG9uZyBmX2Zyc2l6ZTsKLQlsb25nIGZfc3BhcmVbNV07Ci19OwotCi1zdHJ1Y3Qgc3RhdGZzNjQgewotCWxvbmcgZl90eXBlOwotCWxvbmcgZl9ic2l6ZTsKLQlfX3U2NCBmX2Jsb2NrczsKLQlfX3U2NCBmX2JmcmVlOwotCV9fdTY0IGZfYmF2YWlsOwotCV9fdTY0IGZfZmlsZXM7Ci0JX191NjQgZl9mZnJlZTsKLQlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOwotCWxvbmcgZl9uYW1lbGVuOwotCWxvbmcgZl9mcnNpemU7Ci0JbG9uZyBmX3NwYXJlWzVdOwotfTsKLQotc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCB7Ci0JX191MzIgZl90eXBlOwotCV9fdTMyIGZfYnNpemU7Ci0JX191NjQgZl9ibG9ja3M7Ci0JX191NjQgZl9iZnJlZTsKLQlfX3U2NCBmX2JhdmFpbDsKLQlfX3U2NCBmX2ZpbGVzOwotCV9fdTY0IGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlfX3UzMiBmX25hbWVsZW47Ci0JX191MzIgZl9mcnNpemU7Ci0JX191MzIgZl9zcGFyZVs1XTsKLX07CisjZGVmaW5lIF9fc3RhdGZzX3dvcmQgbG9uZworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS11bS9kbWEtbWFwcGluZy5oCmluZGV4IGYwZWU0ZmIuLjkwZmM3MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vZG1hLW1hcHBpbmcuaApAQCAtMTE4LDQgKzExOCwxMSBAQAogCUJVRygpOwogfQogCitzdGF0aWMgaW5saW5lIGludAorZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vZWxmLWkzODYuaCBiL2luY2x1ZGUvYXNtLXVtL2VsZi1pMzg2LmgKaW5kZXggMjNkNjg5My4uZDBkYTlkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vZWxmLWkzODYuaAorKysgYi9pbmNsdWRlL2FzbS11bS9lbGYtaTM4Ni5oCkBAIC04Niw3ICs4Niw3IEBACiBleHRlcm4gY2hhciAqIGVsZl9hdXhfcGxhdGZvcm07CiAjZGVmaW5lIEVMRl9QTEFURk9STSAoZWxmX2F1eF9wbGF0Zm9ybSkKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgZG8geyB9IHdoaWxlICgwKQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB2c3lzY2FsbF9laGRyOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnN5c2NhbGxfZW5kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vZWxmLXBwYy5oIGIvaW5jbHVkZS9hc20tdW0vZWxmLXBwYy5oCmluZGV4IGQzYjkwYjcuLmFmOTQ2M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2VsZi1wcGMuaAorKysgYi9pbmNsdWRlL2FzbS11bS9lbGYtcHBjLmgKQEAgLTUsNyArNSw3IEBACiBleHRlcm4gbG9uZyBlbGZfYXV4X2h3Y2FwOwogI2RlZmluZSBFTEZfSFdDQVAgKGVsZl9hdXhfaHdjYXApCiAKLSNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgZG8gOyB3aGlsZSgwKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIDsgd2hpbGUoMCkKIAogI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRSA0MDk2CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2VsZi14ODZfNjQuaCBiL2luY2x1ZGUvYXNtLXVtL2VsZi14ODZfNjQuaAppbmRleCAzYjJkNTIyLi42ZThhOTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9lbGYteDg2XzY0LmgKKysrIGIvaW5jbHVkZS9hc20tdW0vZWxmLXg4Nl82NC5oCkBAIC0xMTQsNiArMTE0LDYgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0gIng4Nl82NCIKIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBkbyA7IHdoaWxlKDApCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgZG8gOyB3aGlsZSgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC1jb3JlLmggYi9pbmNsdWRlL2FzbS14ODYvYS5vdXQtY29yZS5oCmluZGV4IDcxNDIwN2EuLmY1NzA1NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC1jb3JlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2Eub3V0LWNvcmUuaApAQCAtOSw4ICs5LDggQEAKICAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBfQVNNX0FfT1VUX0NPUkVfSAotI2RlZmluZSBfQVNNX0FfT1VUX0NPUkVfSAorI2lmbmRlZiBBU01fWDg2X19BX09VVF9DT1JFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQV9PVVRfQ09SRV9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtNzAsNCArNzAsNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfQVNNX0FfT1VUX0NPUkVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0FfT1VUX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2Eub3V0LmggYi9pbmNsdWRlL2FzbS14ODYvYS5vdXQuaAppbmRleCA0Njg0Zjk3Li4wOTQ4NzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYS5vdXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYS5vdXQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQV9PVVRfSAotI2RlZmluZSBfQVNNX1g4Nl9BX09VVF9ICisjaWZuZGVmIEFTTV9YODZfX0FfT1VUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQV9PVVRfSAogCiBzdHJ1Y3QgZXhlYwogewpAQCAtMTcsNCArMTcsNCBAQAogI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQogI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9BX09VVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hY3BpLmgKaW5kZXggNjM1ZDc2NC4uMzkyZTE3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYWNwaS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9BQ1BJX0gKLSNkZWZpbmUgX0FTTV9YODZfQUNQSV9ICisjaWZuZGVmIEFTTV9YODZfX0FDUElfSAorI2RlZmluZSBBU01fWDg2X19BQ1BJX0gKIAogLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEgUGF1bCBEaWVmZW5iYXVnaCA8cGF1bC5zLmRpZWZlbmJhdWdoQGludGVsLmNvbT4KQEAgLTE0MCw2ICsxNDAsOCBAQAogCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PSAweDA1ICYmCiAJICAgIGJvb3RfY3B1X2RhdGEueDg2X21hc2sgPCAweDBBKQogCQlyZXR1cm4gMTsKKwllbHNlIGlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQU1EQzFFKSkKKwkJcmV0dXJuIDE7CiAJZWxzZQogCQlyZXR1cm4gbWF4X2NzdGF0ZTsKIH0KQEAgLTE3Myw0ICsxNzUsNCBAQAogCiAjZGVmaW5lIGFjcGlfdW5sYXp5X3RsYih4KQlsZWF2ZV9tbSh4KQogCi0jZW5kaWYgLypfX1g4Nl9BU01fQUNQSV9IKi8KKyNlbmRpZiAvKiBBU01fWDg2X19BQ1BJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hZ3AuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hZ3AuaAppbmRleCBlNDAwNGE5Li4zNjE3ZmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYWdwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2FncC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9BR1BfSAotI2RlZmluZSBfQVNNX1g4Nl9BR1BfSAorI2lmbmRlZiBBU01fWDg2X19BR1BfSAorI2RlZmluZSBBU01fWDg2X19BR1BfSAogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMzIsNCArMzIsNCBAQAogI2RlZmluZSBmcmVlX2dhdHRfcGFnZXModGFibGUsIG9yZGVyKQlcCiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykodGFibGUpLCAob3JkZXIpKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19BR1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2FsdGVybmF0aXZlLmggYi9pbmNsdWRlL2FzbS14ODYvYWx0ZXJuYXRpdmUuaAppbmRleCBmNmFhMThlLi4yMmQzYzk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYWx0ZXJuYXRpdmUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYWx0ZXJuYXRpdmUuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQUxURVJOQVRJVkVfSAotI2RlZmluZSBfQVNNX1g4Nl9BTFRFUk5BVElWRV9ICisjaWZuZGVmIEFTTV9YODZfX0FMVEVSTkFUSVZFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQUxURVJOQVRJVkVfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KQEAgLTE4MCw0ICsxODAsNCBAQAogZXh0ZXJuIHZvaWQgKnRleHRfcG9rZSh2b2lkICphZGRyLCBjb25zdCB2b2lkICpvcGNvZGUsIHNpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgKnRleHRfcG9rZV9lYXJseSh2b2lkICphZGRyLCBjb25zdCB2b2lkICpvcGNvZGUsIHNpemVfdCBsZW4pOwogCi0jZW5kaWYgLyogX0FTTV9YODZfQUxURVJOQVRJVkVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0FMVEVSTkFUSVZFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hbWRfaW9tbXUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hbWRfaW9tbXUuaAppbmRleCAzMGExMjA0Li4wNDFkMGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYW1kX2lvbW11LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2FtZF9pb21tdS5oCkBAIC0xNywxNiArMTcsMTkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKLSNpZm5kZWYgX0FTTV9YODZfQU1EX0lPTU1VX0gKLSNkZWZpbmUgX0FTTV9YODZfQU1EX0lPTU1VX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQU1EX0lPTU1VX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQU1EX0lPTU1VX0gKKworI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCiAjaWZkZWYgQ09ORklHX0FNRF9JT01NVQogZXh0ZXJuIGludCBhbWRfaW9tbXVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKTsKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9kZXRlY3Qodm9pZCk7CitleHRlcm4gaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGFtZF9pb21tdV9pbml0KHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhbWRfaW9tbXVfZGV0ZWN0KHZvaWQpIHsgfQogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0FNRF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYW1kX2lvbW11X3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODYvYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggZGNjODEyMC4uYjMwODU4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2FtZF9pb21tdV90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hbWRfaW9tbXVfdHlwZXMuaApAQCAtMTcsOCArMTcsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2lmbmRlZiBfX0FNRF9JT01NVV9UWVBFU19IX18KLSNkZWZpbmUgX19BTURfSU9NTVVfVFlQRVNfSF9fCisjaWZuZGVmIEFTTV9YODZfX0FNRF9JT01NVV9UWVBFU19ICisjZGVmaW5lIEFTTV9YODZfX0FNRF9JT01NVV9UWVBFU19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTM3LDYgKzM3LDcgQEAKIC8qIENhcGFiaWxpdHkgb2Zmc2V0cyB1c2VkIGJ5IHRoZSBkcml2ZXIgKi8KICNkZWZpbmUgTU1JT19DQVBfSERSX09GRlNFVAkweDAwCiAjZGVmaW5lIE1NSU9fUkFOR0VfT0ZGU0VUCTB4MGMKKyNkZWZpbmUgTU1JT19NSVNDX09GRlNFVAkweDEwCiAKIC8qIE1hc2tzLCBzaGlmdHMgYW5kIG1hY3JvcyB0byBwYXJzZSB0aGUgZGV2aWNlIHJhbmdlIGNhcGFiaWxpdHkgKi8KICNkZWZpbmUgTU1JT19SQU5HRV9MRF9NQVNLCTB4ZmYwMDAwMDAKQEAgLTQ4LDYgKzQ5LDcgQEAKICNkZWZpbmUgTU1JT19HRVRfTEQoeCkgICgoKHgpICYgTU1JT19SQU5HRV9MRF9NQVNLKSA+PiBNTUlPX1JBTkdFX0xEX1NISUZUKQogI2RlZmluZSBNTUlPX0dFVF9GRCh4KSAgKCgoeCkgJiBNTUlPX1JBTkdFX0ZEX01BU0spID4+IE1NSU9fUkFOR0VfRkRfU0hJRlQpCiAjZGVmaW5lIE1NSU9fR0VUX0JVUyh4KSAoKCh4KSAmIE1NSU9fUkFOR0VfQlVTX01BU0spID4+IE1NSU9fUkFOR0VfQlVTX1NISUZUKQorI2RlZmluZSBNTUlPX01TSV9OVU0oeCkJKCh4KSAmIDB4MWYpCiAKIC8qIEZsYWcgbWFza3MgZm9yIHRoZSBBTUQgSU9NTVUgZXhjbHVzaW9uIHJhbmdlICovCiAjZGVmaW5lIE1NSU9fRVhDTF9FTkFCTEVfTUFTSyAweDAxVUxMCkBAIC02OSw2ICs3MSwyNSBAQAogLyogTU1JTyBzdGF0dXMgYml0cyAqLwogI2RlZmluZSBNTUlPX1NUQVRVU19DT01fV0FJVF9JTlRfTUFTSwkweDA0CiAKKy8qIGV2ZW50IGxvZ2dpbmcgY29uc3RhbnRzICovCisjZGVmaW5lIEVWRU5UX0VOVFJZX1NJWkUJMHgxMAorI2RlZmluZSBFVkVOVF9UWVBFX1NISUZUCTI4CisjZGVmaW5lIEVWRU5UX1RZUEVfTUFTSwkJMHhmCisjZGVmaW5lIEVWRU5UX1RZUEVfSUxMX0RFVgkweDEKKyNkZWZpbmUgRVZFTlRfVFlQRV9JT19GQVVMVAkweDIKKyNkZWZpbmUgRVZFTlRfVFlQRV9ERVZfVEFCX0VSUgkweDMKKyNkZWZpbmUgRVZFTlRfVFlQRV9QQUdFX1RBQl9FUlIJMHg0CisjZGVmaW5lIEVWRU5UX1RZUEVfSUxMX0NNRAkweDUKKyNkZWZpbmUgRVZFTlRfVFlQRV9DTURfSEFSRF9FUlIJMHg2CisjZGVmaW5lIEVWRU5UX1RZUEVfSU9UTEJfSU5WX1RPCTB4NworI2RlZmluZSBFVkVOVF9UWVBFX0lOVl9ERVZfUkVRCTB4OAorI2RlZmluZSBFVkVOVF9ERVZJRF9NQVNLCTB4ZmZmZgorI2RlZmluZSBFVkVOVF9ERVZJRF9TSElGVAkwCisjZGVmaW5lIEVWRU5UX0RPTUlEX01BU0sJMHhmZmZmCisjZGVmaW5lIEVWRU5UX0RPTUlEX1NISUZUCTAKKyNkZWZpbmUgRVZFTlRfRkxBR1NfTUFTSwkweGZmZgorI2RlZmluZSBFVkVOVF9GTEFHU19TSElGVAkweDEwCisKIC8qIGZlYXR1cmUgY29udHJvbCBiaXRzICovCiAjZGVmaW5lIENPTlRST0xfSU9NTVVfRU4gICAgICAgIDB4MDBVTEwKICNkZWZpbmUgQ09OVFJPTF9IVF9UVU5fRU4gICAgICAgMHgwMVVMTApAQCAtMTA5LDYgKzEzMCw4IEBACiAjZGVmaW5lIERFVl9FTlRSWV9OTUlfUEFTUyAgICAgIDB4YmEKICNkZWZpbmUgREVWX0VOVFJZX0xJTlQwX1BBU1MgICAgMHhiZQogI2RlZmluZSBERVZfRU5UUllfTElOVDFfUEFTUyAgICAweGJmCisjZGVmaW5lIERFVl9FTlRSWV9NT0RFX01BU0sJMHgwNworI2RlZmluZSBERVZfRU5UUllfTU9ERV9TSElGVAkweDA5CiAKIC8qIGNvbnN0YW50cyB0byBjb25maWd1cmUgdGhlIGNvbW1hbmQgYnVmZmVyICovCiAjZGVmaW5lIENNRF9CVUZGRVJfU0laRSAgICA4MTkyCkBAIC0xMTYsNiArMTM5LDEwIEBACiAjZGVmaW5lIE1NSU9fQ01EX1NJWkVfU0hJRlQgNTYKICNkZWZpbmUgTU1JT19DTURfU0laRV81MTIgKDB4OVVMTCA8PCBNTUlPX0NNRF9TSVpFX1NISUZUKQogCisvKiBjb25zdGFudHMgZm9yIGV2ZW50IGJ1ZmZlciBoYW5kbGluZyAqLworI2RlZmluZSBFVlRfQlVGRkVSX1NJWkUJCTgxOTIgLyogNTEyIGVudHJpZXMgKi8KKyNkZWZpbmUgRVZUX0xFTl9NQVNLCQkoMHg5VUxMIDw8IDU2KQorCiAjZGVmaW5lIFBBR0VfTU9ERV8xX0xFVkVMIDB4MDEKICNkZWZpbmUgUEFHRV9NT0RFXzJfTEVWRUwgMHgwMgogI2RlZmluZSBQQUdFX01PREVfM19MRVZFTCAweDAzCkBAIC0xMzQsNiArMTYxLDcgQEAKICNkZWZpbmUgSU9NTVVfTUFQX1NJWkVfTDMgKDFVTEwgPDwgMzkpCiAKICNkZWZpbmUgSU9NTVVfUFRFX1AgICgxVUxMIDw8IDApCisjZGVmaW5lIElPTU1VX1BURV9UViAoMVVMTCA8PCAxKQogI2RlZmluZSBJT01NVV9QVEVfVSAgKDFVTEwgPDwgNTkpCiAjZGVmaW5lIElPTU1VX1BURV9GQyAoMVVMTCA8PCA2MCkKICNkZWZpbmUgSU9NTVVfUFRFX0lSICgxVUxMIDw8IDYxKQpAQCAtMTU5LDYgKzE4Nyw5IEBACiAKICNkZWZpbmUgTUFYX0RPTUFJTl9JRCA2NTUzNgogCisvKiBGSVhNRTogbW92ZSB0aGlzIG1hY3JvIHRvIDxsaW51eC9wY2kuaD4gKi8KKyNkZWZpbmUgUENJX0JVUyh4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCisKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBnZW5lcmljIGRhdGEgZm9yICBJT01NVSBwcm90ZWN0aW9uIGRvbWFpbnMKICAqIGluZGVwZW5kZW50IG9mIHRoZWlyIHVzZS4KQEAgLTE5Niw2ICsyMjcsMTUgQEAKIAkgKiBqdXN0IGNhbGN1bGF0ZSBpdHMgYWRkcmVzcyBpbiBjb25zdGFudCB0aW1lLgogCSAqLwogCXU2NCAqKnB0ZV9wYWdlczsKKworCS8qIFRoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIFRMQiBuZWVkcyB0byBiZSBmbHVzaGVkICovCisJYm9vbCBuZWVkX2ZsdXNoOworCisJLyoKKwkgKiBpZiB0aGlzIGlzIGEgcHJlYWxsb2NhdGVkIGRvbWFpbiwga2VlcCB0aGUgZGV2aWNlIGZvciB3aGljaCBpdCB3YXMKKwkgKiBwcmVhbGxvY2F0ZWQgaW4gdGhpcyB2YXJpYWJsZQorCSAqLworCXUxNiB0YXJnZXRfZGV2OwogfTsKIAogLyoKQEAgLTIwOCw4ICsyNDgsOSBAQAogCS8qIGxvY2tzIHRoZSBhY2Nlc3NlcyB0byB0aGUgaGFyZHdhcmUgKi8KIAlzcGlubG9ja190IGxvY2s7CiAKLQkvKiBkZXZpY2UgaWQgb2YgdGhpcyBJT01NVSAqLwotCXUxNiBkZXZpZDsKKwkvKiBQb2ludGVyIHRvIFBDSSBkZXZpY2Ugb2YgdGhpcyBJT01NVSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKIAkvKgogCSAqIENhcGFiaWxpdHkgcG9pbnRlci4gVGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBJT01NVSBwZXIgUENJCiAJICogZGV2aWNlIGZ1bmN0aW9uIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIEFNRCBJT01NVSBjYXBhYmlsaXR5CkBAIC0yMjUsNiArMjY2LDkgQEAKIAkvKiBjYXBhYmlsaXRpZXMgb2YgdGhhdCBJT01NVSByZWFkIGZyb20gQUNQSSAqLwogCXUzMiBjYXA7CiAKKwkvKiBwY2kgZG9tYWluIG9mIHRoaXMgSU9NTVUgKi8KKwl1MTYgcGNpX3NlZzsKKwogCS8qIGZpcnN0IGRldmljZSB0aGlzIElPTU1VIGhhbmRsZXMuIHJlYWQgZnJvbSBQQ0kgKi8KIAl1MTYgZmlyc3RfZGV2aWNlOwogCS8qIGxhc3QgZGV2aWNlIHRoaXMgSU9NTVUgaGFuZGxlcy4gcmVhZCBmcm9tIFBDSSAqLwpAQCAtMjQwLDkgKzI4NCwxOSBAQAogCS8qIHNpemUgb2YgY29tbWFuZCBidWZmZXIgKi8KIAl1MzIgY21kX2J1Zl9zaXplOwogCisJLyogZXZlbnQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCXU4ICpldnRfYnVmOworCS8qIHNpemUgb2YgZXZlbnQgYnVmZmVyICovCisJdTMyIGV2dF9idWZfc2l6ZTsKKwkvKiBNU0kgbnVtYmVyIGZvciBldmVudCBpbnRlcnJ1cHQgKi8KKwl1MTYgZXZ0X21zaV9udW07CisKIAkvKiBpZiBvbmUsIHdlIG5lZWQgdG8gc2VuZCBhIGNvbXBsZXRpb24gd2FpdCBjb21tYW5kICovCiAJaW50IG5lZWRfc3luYzsKIAorCS8qIHRydWUgaWYgaW50ZXJydXB0cyBmb3IgdGhpcyBJT01NVSBhcmUgYWxyZWFkeSBlbmFibGVkICovCisJYm9vbCBpbnRfZW5hYmxlZDsKKwogCS8qIGRlZmF1bHQgZG1hX29wcyBkb21haW4gZm9yIHRoYXQgSU9NTVUgKi8KIAlzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRlZmF1bHRfZG9tOwogfTsKQEAgLTMyMiw2ICszNzYsMTIgQEAKIC8qIHdpbGwgYmUgMSBpZiBkZXZpY2UgaXNvbGF0aW9uIGlzIGVuYWJsZWQgKi8KIGV4dGVybiBpbnQgYW1kX2lvbW11X2lzb2xhdGU7CiAKKy8qCisgKiBJZiB0cnVlLCB0aGUgYWRkcmVzc2VzIHdpbGwgYmUgZmx1c2hlZCBvbiB1bm1hcCB0aW1lLCBub3Qgd2hlbgorICogdGhleSBhcmUgcmV1c2VkCisgKi8KK2V4dGVybiBib29sIGFtZF9pb21tdV91bm1hcF9mbHVzaDsKKwogLyogdGFrZXMgYSBQQ0kgZGV2aWNlIGlkIGFuZCBwcmludHMgaXQgb3V0IGluIGEgcmVhZGFibGUgZm9ybSAqLwogc3RhdGljIGlubGluZSB2b2lkIHByaW50X2RldmlkKHUxNiBkZXZpZCwgaW50IG5sKQogewpAQCAtMzQxLDQgKzQwMSw0IEBACiAJcmV0dXJuICgoKHUxNilidXMpIDw8IDgpIHwgZGV2Zm47CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0FNRF9JT01NVV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2L2FwaWMuaAppbmRleCAxMzNjOTk4Li5kNzZhMDgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hcGljLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0FQSUNfSAotI2RlZmluZSBfQVNNX1g4Nl9BUElDX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQVBJQ19ICisjZGVmaW5lIEFTTV9YODZfX0FQSUNfSAogCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtOSw2ICs5LDggQEAKICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CiAKICNkZWZpbmUgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMJMQogCkBAIC00NywxNSArNDksMTggQEAKICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNlbHNlCi0jZGVmaW5lIGFwaWNfd3JpdGUgbmF0aXZlX2FwaWNfd3JpdGUKLSNkZWZpbmUgYXBpY19yZWFkIG5hdGl2ZV9hcGljX3JlYWQKICNkZWZpbmUgc2V0dXBfYm9vdF9jbG9jayBzZXR1cF9ib290X0FQSUNfY2xvY2sKICNkZWZpbmUgc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrIHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrCiAjZW5kaWYKIAogZXh0ZXJuIGludCBpc192c21wX2JveCh2b2lkKTsKK2V4dGVybiB2b2lkIHhhcGljX3dhaXRfaWNyX2lkbGUodm9pZCk7CitleHRlcm4gdTMyIHNhZmVfeGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKTsKK2V4dGVybiB1NjQgeGFwaWNfaWNyX3JlYWQodm9pZCk7CitleHRlcm4gdm9pZCB4YXBpY19pY3Jfd3JpdGUodTMyLCB1MzIpOworZXh0ZXJuIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50KTsKIAotc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9hcGljX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1MzIgdikKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfYXBpY19tZW1fd3JpdGUodTMyIHJlZywgdTMyIHYpCiB7CiAJdm9sYXRpbGUgdTMyICphZGRyID0gKHZvbGF0aWxlIHUzMiAqKShBUElDX0JBU0UgKyByZWcpOwogCkBAIC02NCwyMSArNjksNzIgQEAKIAkJICAgICAgIEFTTV9PVVRQVVQyKCIwIiAodiksICJtIiAoKmFkZHIpKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIG5hdGl2ZV9hcGljX3JlYWQodW5zaWduZWQgbG9uZyByZWcpCitzdGF0aWMgaW5saW5lIHUzMiBuYXRpdmVfYXBpY19tZW1fcmVhZCh1MzIgcmVnKQogewogCXJldHVybiAqKCh2b2xhdGlsZSB1MzIgKikoQVBJQ19CQVNFICsgcmVnKSk7CiB9CiAKLWV4dGVybiB2b2lkIGFwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKTsKLWV4dGVybiB1MzIgc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUodm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2FwaWNfbXNyX3dyaXRlKHUzMiByZWcsIHUzMiB2KQoreworCWlmIChyZWcgPT0gQVBJQ19ERlIgfHwgcmVnID09IEFQSUNfSUQgfHwgcmVnID09IEFQSUNfTERSIHx8CisJICAgIHJlZyA9PSBBUElDX0xWUikKKwkJcmV0dXJuOworCisJd3Jtc3IoQVBJQ19CQVNFX01TUiArIChyZWcgPj4gNCksIHYsIDApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBuYXRpdmVfYXBpY19tc3JfcmVhZCh1MzIgcmVnKQoreworCXUzMiBsb3csIGhpZ2g7CisKKwlpZiAocmVnID09IEFQSUNfREZSKQorCQlyZXR1cm4gLTE7CisKKwlyZG1zcihBUElDX0JBU0VfTVNSICsgKHJlZyA+PiA0KSwgbG93LCBoaWdoKTsKKwlyZXR1cm4gbG93OworfQorCisjaWZuZGVmIENPTkZJR19YODZfMzIKK2V4dGVybiBpbnQgeDJhcGljLCB4MmFwaWNfcHJlZW5hYmxlZDsKK2V4dGVybiB2b2lkIGNoZWNrX3gyYXBpYyh2b2lkKTsKK2V4dGVybiB2b2lkIGVuYWJsZV94MmFwaWModm9pZCk7CitleHRlcm4gdm9pZCBlbmFibGVfSVJfeDJhcGljKHZvaWQpOworZXh0ZXJuIHZvaWQgeDJhcGljX2ljcl93cml0ZSh1MzIgbG93LCB1MzIgaWQpOworI2VuZGlmCisKK3N0cnVjdCBhcGljX29wcyB7CisJdTMyICgqcmVhZCkodTMyIHJlZyk7CisJdm9pZCAoKndyaXRlKSh1MzIgcmVnLCB1MzIgdik7CisJdTY0ICgqaWNyX3JlYWQpKHZvaWQpOworCXZvaWQgKCppY3Jfd3JpdGUpKHUzMiBsb3csIHUzMiBoaWdoKTsKKwl2b2lkICgqd2FpdF9pY3JfaWRsZSkodm9pZCk7CisJdTMyICgqc2FmZV93YWl0X2ljcl9pZGxlKSh2b2lkKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgYXBpY19vcHMgKmFwaWNfb3BzOworCisjZGVmaW5lIGFwaWNfcmVhZCAoYXBpY19vcHMtPnJlYWQpCisjZGVmaW5lIGFwaWNfd3JpdGUgKGFwaWNfb3BzLT53cml0ZSkKKyNkZWZpbmUgYXBpY19pY3JfcmVhZCAoYXBpY19vcHMtPmljcl9yZWFkKQorI2RlZmluZSBhcGljX2ljcl93cml0ZSAoYXBpY19vcHMtPmljcl93cml0ZSkKKyNkZWZpbmUgYXBpY193YWl0X2ljcl9pZGxlIChhcGljX29wcy0+d2FpdF9pY3JfaWRsZSkKKyNkZWZpbmUgc2FmZV9hcGljX3dhaXRfaWNyX2lkbGUgKGFwaWNfb3BzLT5zYWZlX3dhaXRfaWNyX2lkbGUpCisKIGV4dGVybiBpbnQgZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2tfeDJBUElDX2lycSh2b2lkKQoreworCS8qIERvY3Mgc2F5IHVzZSAwIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworCW5hdGl2ZV9hcGljX21zcl93cml0ZShBUElDX0VPSSwgMCk7Cit9CisjZW5kaWYKKworCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNrX0FQSUNfaXJxKHZvaWQpCiB7CiAJLyoKLQkgKiBhY2tfQVBJQ19pcnEoKSBhY3R1YWxseSBnZXRzIGNvbXBpbGVkIGFzIGEgc2luZ2xlIGluc3RydWN0aW9uOgotCSAqIC0gYSBzaW5nbGUgcm13IG9uIFBlbnRpdW0vODI0ODlEWAotCSAqIC0gYSBzaW5nbGUgd3JpdGUgb24gUDYrIGNvcmVzIChDT05GSUdfWDg2X0dPT0RfQVBJQykKKwkgKiBhY2tfQVBJQ19pcnEoKSBhY3R1YWxseSBnZXRzIGNvbXBpbGVkIGFzIGEgc2luZ2xlIGluc3RydWN0aW9uCiAJICogLi4uIHl1bW1pZS4KIAkgKi8KIApAQCAtMTI4LDQgKzE4NCw0IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKLSNlbmRpZiAvKiBfX0FTTV9BUElDX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODYvYXBpY2RlZi5oCmluZGV4IDZiOTAwOGMuLmI5MjJjODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2FwaWNkZWYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQVBJQ0RFRl9ICi0jZGVmaW5lIF9BU01fWDg2X0FQSUNERUZfSAorI2lmbmRlZiBBU01fWDg2X19BUElDREVGX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQVBJQ0RFRl9ICiAKIC8qCiAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgSW50ZWwgQVBJQ3MuIChsb2NhbCBBUElDLCBJT0FQSUMsIGV0Yy4pCkBAIC0xMDUsNiArMTA1LDcgQEAKICNkZWZpbmUJQVBJQ19UTUlDVAkweDM4MAogI2RlZmluZQlBUElDX1RNQ0NUCTB4MzkwCiAjZGVmaW5lCUFQSUNfVERDUgkweDNFMAorI2RlZmluZSBBUElDX1NFTEZfSVBJCTB4M0YwCiAjZGVmaW5lCQlBUElDX1REUl9ESVZfVE1CQVNFCSgxIDw8IDIpCiAjZGVmaW5lCQlBUElDX1REUl9ESVZfMQkJMHhCCiAjZGVmaW5lCQlBUElDX1REUl9ESVZfMgkJMHgwCkBAIC0xMjgsNiArMTI5LDggQEAKICNkZWZpbmUJQVBJQ19FSUxWVDMgICAgIDB4NTMwCiAKICNkZWZpbmUgQVBJQ19CQVNFIChmaXhfdG9fdmlydChGSVhfQVBJQ19CQVNFKSkKKyNkZWZpbmUgQVBJQ19CQVNFX01TUgkweDgwMAorI2RlZmluZSBYMkFQSUNfRU5BQkxFCSgxVUwgPDwgMTApCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGRlZmluZSBNQVhfSU9fQVBJQ1MgNjQKQEAgLTQxMSw0ICs0MTQsNCBAQAogI2Vsc2UKICAjZGVmaW5lIEJBRF9BUElDSUQgMHhGRkZGdQogI2VuZGlmCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19BUElDREVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hcmNoX2hvb2tzLmggYi9pbmNsdWRlL2FzbS14ODYvYXJjaF9ob29rcy5oCmluZGV4IDg0MTE3NTAuLmRlNDU5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9hcmNoX2hvb2tzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2FyY2hfaG9va3MuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9BUkNIX0hPT0tTX0gKLSNkZWZpbmUgX0FTTV9BUkNIX0hPT0tTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQVJDSF9IT09LU19ICisjZGVmaW5lIEFTTV9YODZfX0FSQ0hfSE9PS1NfSAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKQEAgLTEyLDggKzEyLDYgQEAKIC8qIHRoZXNlIGFyZW4ndCBhcmNoIGhvb2tzLCB0aGV5IGFyZSBnZW5lcmljIHJvdXRpbmVzCiAgKiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBob29rcyAqLwogZXh0ZXJuIHZvaWQgaW5pdF9JU0FfaXJxcyh2b2lkKTsKLWV4dGVybiB2b2lkIGFwaWNfaW50cl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgc21wX2ludHJfaW5pdCh2b2lkKTsKIGV4dGVybiBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAogLyogdGhlc2UgYXJlIHRoZSBkZWZpbmVkIGhvb2tzICovCkBAIC0yNSw0ICsyMyw0IEBACiBleHRlcm4gdm9pZCB0aW1lX2luaXRfaG9vayh2b2lkKTsKIGV4dGVybiB2b2lkIG1jYV9ubWlfaG9vayh2b2lkKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fQVJDSF9IT09LU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYXNtLmggYi9pbmNsdWRlL2FzbS14ODYvYXNtLmgKaW5kZXggOTcyMjAzMi4uZTEzNTVmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2FzbS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hc20uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQVNNX0gKLSNkZWZpbmUgX0FTTV9YODZfQVNNX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQVNNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQVNNX0gKIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogIyBkZWZpbmUgX19BU01fRk9STSh4KQl4CkBAIC0yMCwxNyArMjAsMjIgQEAKIAogI2RlZmluZSBfQVNNX1BUUglfX0FTTV9TRUwoLmxvbmcsIC5xdWFkKQogI2RlZmluZSBfQVNNX0FMSUdOCV9fQVNNX1NFTCguYmFsaWduIDQsIC5iYWxpZ24gOCkKLSNkZWZpbmUgX0FTTV9NT1ZfVUwJX19BU01fU0laRShtb3YpCiAKKyNkZWZpbmUgX0FTTV9NT1YJX19BU01fU0laRShtb3YpCiAjZGVmaW5lIF9BU01fSU5DCV9fQVNNX1NJWkUoaW5jKQogI2RlZmluZSBfQVNNX0RFQwlfX0FTTV9TSVpFKGRlYykKICNkZWZpbmUgX0FTTV9BREQJX19BU01fU0laRShhZGQpCiAjZGVmaW5lIF9BU01fU1VCCV9fQVNNX1NJWkUoc3ViKQogI2RlZmluZSBfQVNNX1hBREQJX19BU01fU0laRSh4YWRkKQorCiAjZGVmaW5lIF9BU01fQVgJCV9fQVNNX1JFRyhheCkKICNkZWZpbmUgX0FTTV9CWAkJX19BU01fUkVHKGJ4KQogI2RlZmluZSBfQVNNX0NYCQlfX0FTTV9SRUcoY3gpCiAjZGVmaW5lIF9BU01fRFgJCV9fQVNNX1JFRyhkeCkKKyNkZWZpbmUgX0FTTV9TUAkJX19BU01fUkVHKHNwKQorI2RlZmluZSBfQVNNX0JQCQlfX0FTTV9SRUcoYnApCisjZGVmaW5lIF9BU01fU0kJCV9fQVNNX1JFRyhzaSkKKyNkZWZpbmUgX0FTTV9ESQkJX19BU01fUkVHKGRpKQogCiAvKiBFeGNlcHRpb24gdGFibGUgZW50cnkgKi8KICMgZGVmaW5lIF9BU01fRVhUQUJMRShmcm9tLHRvKSBcCkBAIC0zOSw0ICs0NCw0IEBACiAJX0FTTV9QVFIgI2Zyb20gIiwiICN0byAiXG4iIFwKIAkiIC5wcmV2aW91c1xuIgogCi0jZW5kaWYgLyogX0FTTV9YODZfQVNNX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19BU01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2F0b21pY18zMi5oIGIvaW5jbHVkZS9hc20teDg2L2F0b21pY18zMi5oCmluZGV4IDIxYTQ4MjUuLjE0ZDNmMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9hdG9taWNfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYXRvbWljXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVJDSF9JMzg2X0FUT01JQ19fCi0jZGVmaW5lIF9fQVJDSF9JMzg2X0FUT01JQ19fCisjaWZuZGVmIEFTTV9YODZfX0FUT01JQ18zMl9ICisjZGVmaW5lIEFTTV9YODZfX0FUT01JQ18zMl9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI1Niw0ICsyNTYsNCBAQAogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy5oPgotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fQVRPTUlDXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9hdG9taWNfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hdG9taWNfNjQuaAppbmRleCA5MWM3ZDAzLi4yY2IyMThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYXRvbWljXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2F0b21pY182NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FSQ0hfWDg2XzY0X0FUT01JQ19fCi0jZGVmaW5lIF9fQVJDSF9YODZfNjRfQVRPTUlDX18KKyNpZm5kZWYgQVNNX1g4Nl9fQVRPTUlDXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fQVRPTUlDXzY0X0gKIAogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+CkBAIC00NzAsNCArNDcwLDQgQEAKICNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJYmFycmllcigpCiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdG9taWMuaD4KLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0FUT01JQ182NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS14ODYvYXV4dmVjLmgKaW5kZXggODdmNWU2ZC4uMTJjN2NhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2F1eHZlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hdXh2ZWMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQVVYVkVDX0gKLSNkZWZpbmUgX0FTTV9YODZfQVVYVkVDX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQVVYVkVDX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQVVYVkVDX0gKIC8qCiAgKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGluIDAtMTcsIGxlYXZlIHNvbWUgcm9vbQogICogZm9yIG1vcmUgb2YgdGhlbSwgc3RhcnQgdGhlIHg4Ni1zcGVjaWZpYyBvbmVzIGF0IDMyLgpAQCAtOSw0ICs5LDQgQEAKICNlbmRpZgogI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYmlnc21wL2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9iaWdzbXAvYXBpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWNkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvYmlnc21wL2FwaWMuaApAQCAtMCwwICsxLDE0NCBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNfSAorI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNfSAorCisjZGVmaW5lIHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpIChwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSkpCisjZGVmaW5lIGVzcl9kaXNhYmxlICgxKQorCitzdGF0aWMgaW5saW5lIGludCBhcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKK3sKKwlyZXR1cm4gKDEpOworfQorCisvKiBSb3VuZCByb2JpbiB0aGUgaXJxcyBhbW91bmcgdGhlIG9ubGluZSBjcHVzICovCitzdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNwdSA9IE5SX0NQVVM7CisJZG8geworCQlpZiAoY3B1ID49IE5SX0NQVVMpCisJCQljcHUgPSBmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApOworCQllbHNlCisJCQljcHUgPSBuZXh0X2NwdShjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwl9IHdoaWxlIChjcHUgPj0gTlJfQ1BVUyk7CisJcmV0dXJuIGNwdW1hc2tfb2ZfY3B1KGNwdSk7Cit9CisKKyN1bmRlZiBBUElDX0RFU1RfTE9HSUNBTAorI2RlZmluZSBBUElDX0RFU1RfTE9HSUNBTAkwCisjZGVmaW5lIFRBUkdFVF9DUFVTCQkodGFyZ2V0X2NwdXMoKSkKKyNkZWZpbmUgQVBJQ19ERlJfVkFMVUUJCShBUElDX0RGUl9GTEFUKQorI2RlZmluZSBJTlRfREVMSVZFUllfTU9ERQkoZGVzdF9GaXhlZCkKKyNkZWZpbmUgSU5UX0RFU1RfTU9ERQkJKDApICAgIC8qIHBoeXMgZGVsaXZlcnkgdG8gdGFyZ2V0IHByb2MgKi8KKyNkZWZpbmUgTk9fQkFMQU5DRV9JUlEJCSgwKQorI2RlZmluZSBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAorCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190IGJpdG1hcCwgaW50IGFwaWNpZCkKK3sKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2hlY2tfYXBpY2lkX3ByZXNlbnQoaW50IGJpdCkKK3sKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2FsY3VsYXRlX2xkcihpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgdmFsLCBpZDsKKwl2YWwgPSBhcGljX3JlYWQoQVBJQ19MRFIpICYgfkFQSUNfTERSX01BU0s7CisJaWQgPSB4YXBpY19waHlzX3RvX2xvZ19hcGljaWQoY3B1KTsKKwl2YWwgfD0gU0VUX0FQSUNfTE9HSUNBTF9JRChpZCk7CisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgbG9naWNhbCBkZXN0aW5hdGlvbiBJRC4KKyAqCisgKiBJbnRlbCByZWNvbW1lbmRzIHRvIHNldCBERlIsIExEUiBhbmQgVFBSIGJlZm9yZSBlbmFibGluZworICogYW4gQVBJQy4gIFNlZSBlLmcuICJBUC0zODggODI0ODlEWCBVc2VyJ3MgTWFudWFsIiAoSW50ZWwKKyAqIGRvY3VtZW50IG51bWJlciAyOTIxMTYpLiAgU28gaGVyZSBpdCBnb2VzLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2FwaWNfbGRyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWFwaWNfd3JpdGUoQVBJQ19ERlIsIEFQSUNfREZSX1ZBTFVFKTsKKwl2YWwgPSBjYWxjdWxhdGVfbGRyKGNwdSk7CisJYXBpY193cml0ZShBUElDX0xEUiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2FwaWNfcm91dGluZyh2b2lkKQoreworCXByaW50aygiRW5hYmxpbmcgQVBJQyBtb2RlOiAgJXMuICBVc2luZyAlZCBJL08gQVBJQ3NcbiIsCisJCSJQaHlzZmxhdCIsIG5yX2lvYXBpY3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdWx0aV90aW1lcl9jaGVjayhpbnQgYXBpYywgaW50IGlycSkKK3sKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGljaWRfdG9fbm9kZShpbnQgbG9naWNhbF9hcGljaWQpCit7CisJcmV0dXJuIGFwaWNpZF8yX25vZGVbaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCldOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCit7CisJaWYgKG1wc19jcHUgPCBOUl9DUFVTKQorCQlyZXR1cm4gKGludCkgcGVyX2NwdSh4ODZfYmlvc19jcHVfYXBpY2lkLCBtcHNfY3B1KTsKKworCXJldHVybiBCQURfQVBJQ0lEOworfQorCitzdGF0aWMgaW5saW5lIHBoeXNpZF9tYXNrX3QgYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBwaHlzX2FwaWNpZCkKK3sKKwlyZXR1cm4gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKHBoeXNfYXBpY2lkKTsKK30KKworZXh0ZXJuIHU4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW107CisvKiBNYXBwaW5nIGZyb20gY3B1IG51bWJlciB0byBsb2dpY2FsIGFwaWNpZCAqLworc3RhdGljIGlubGluZSBpbnQgY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCit7CisJaWYgKGNwdSA+PSBOUl9DUFVTKQorCQlyZXR1cm4gQkFEX0FQSUNJRDsKKwlyZXR1cm4gY3B1X3BoeXNpY2FsX2lkKGNwdSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBpb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCBwaHlzX21hcCkKK3sKKwkvKiBGb3IgY2x1c3RlcmVkIHdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KKwlyZXR1cm4gcGh5c2lkc19wcm9tb3RlKDB4RkZMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3BvcnRpb19yZW1hcCh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2FwaWNfbW9kZSh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQpCit7CisJcmV0dXJuICgxKTsKK30KKworLyogQXMgd2UgYXJlIHVzaW5nIHNpbmdsZSBDUFUgYXMgZGVzdGluYXRpb24sIHBpY2sgb25seSBvbmUgQ1BVIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKK3sKKwlpbnQgY3B1OworCWludCBhcGljaWQ7CQorCisJY3B1ID0gZmlyc3RfY3B1KGNwdW1hc2spOworCWFwaWNpZCA9IGNwdV90b19sb2dpY2FsX2FwaWNpZChjcHUpOworCXJldHVybiBhcGljaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBoeXNfcGtnX2lkKHUzMiBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQoreworCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKK30KKworI2VuZGlmIC8qIF9fQVNNX01BQ0hfQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYmlnc21wL2FwaWNkZWYuaCBiL2luY2x1ZGUvYXNtLXg4Ni9iaWdzbXAvYXBpY2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmMzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvYmlnc21wL2FwaWNkZWYuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQVNNX01BQ0hfQVBJQ0RFRl9ICisjZGVmaW5lIF9fQVNNX01BQ0hfQVBJQ0RFRl9ICisKKyNkZWZpbmUJCUFQSUNfSURfTUFTSwkJKDB4RkY8PDI0KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlyZXR1cm4gKCgoeCk+PjI0KSYweEZGKTsKK30KKworI2RlZmluZQkJR0VUX0FQSUNfSUQoeCkJZ2V0X2FwaWNfaWQoeCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1iaWdzbXAvbWFjaF9pcGkuaCBiL2luY2x1ZGUvYXNtLXg4Ni9iaWdzbXAvaXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXg4Ni9tYWNoLWJpZ3NtcC9tYWNoX2lwaS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS14ODYvYmlnc21wL2lwaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYmlvc19lYmRhLmggYi9pbmNsdWRlL2FzbS14ODYvYmlvc19lYmRhLmgKaW5kZXggMDAzM2U1MC4uNzliNGI4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Jpb3NfZWJkYS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9iaW9zX2ViZGEuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX01BQ0hfQklPU19FQkRBX0gKLSNkZWZpbmUgX01BQ0hfQklPU19FQkRBX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQklPU19FQkRBX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQklPU19FQkRBX0gKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0xNiw0ICsxNiwyMSBAQAogCiB2b2lkIHJlc2VydmVfZWJkYV9yZWdpb24odm9pZCk7CiAKLSNlbmRpZiAvKiBfTUFDSF9CSU9TX0VCREFfSCAqLworI2lmZGVmIENPTkZJR19YODZfQ0hFQ0tfQklPU19DT1JSVVBUSU9OCisvKgorICogVGhpcyBpcyBvYnZpb3VzbHkgbm90IGEgZ3JlYXQgcGxhY2UgZm9yIHRoaXMsIGJ1dCB3ZSB3YW50IHRvIGJlCisgKiBhYmxlIHRvIHNjYXR0ZXIgaXQgYXJvdW5kIGFueXdoZXJlIGluIHRoZSBrZXJuZWwuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2Jpb3NfY29ycnVwdGlvbih2b2lkKTsKK3ZvaWQgc3RhcnRfcGVyaW9kaWNfY2hlY2tfZm9yX2NvcnJ1cHRpb24odm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2Zvcl9iaW9zX2NvcnJ1cHRpb24odm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3BlcmlvZGljX2NoZWNrX2Zvcl9jb3JydXB0aW9uKHZvaWQpCit7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFTTV9YODZfX0JJT1NfRUJEQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYml0b3BzLmggYi9pbmNsdWRlL2FzbS14ODYvYml0b3BzLmgKaW5kZXggY2ZiMmI2NC4uNDUxYTc0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9iaXRvcHMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQklUT1BTX0gKLSNkZWZpbmUgX0FTTV9YODZfQklUT1BTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQklUT1BTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQklUT1BTX0gKIAogLyoKICAqIENvcHlyaWdodCAxOTkyLCBMaW51cyBUb3J2YWxkcy4KQEAgLTQyNCwxNiArNDI0LDYgQEAKIAogI3VuZGVmIEFERFIKIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXRfc3RyaW5nKHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwKLQkJdW5zaWduZWQgbG9uZyBpLCBpbnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgZW5kID0gaSArIGxlbjsKLQl3aGlsZSAoaSA8IGVuZCkgewotCQlfX3NldF9iaXQoaSwgYml0bWFwKTsKLQkJaSsrOwotCX0KLX0KLQogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgpAQCAtNDU4LDQgKzQ0OCw0IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL21pbml4Lmg+CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYJLyogX0FTTV9YODZfQklUT1BTX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2Jvb3QuaCBiL2luY2x1ZGUvYXNtLXg4Ni9ib290LmgKaW5kZXggMmZhZWQ3ZS4uMWQ2M2JkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Jvb3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYm9vdC5oCkBAIC0xLDEwICsxLDggQEAKLSNpZm5kZWYgX0FTTV9CT09UX0gKLSNkZWZpbmUgX0FTTV9CT09UX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQk9PVF9ICisjZGVmaW5lIEFTTV9YODZfX0JPT1RfSAogCiAvKiBEb24ndCB0b3VjaCB0aGVzZSwgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4gKi8KLSNkZWZpbmUgREVGX0lOSVRTRUcJMHg5MDAwCiAjZGVmaW5lIERFRl9TWVNTRUcJMHgxMDAwCi0jZGVmaW5lIERFRl9TRVRVUFNFRwkweDkwMjAKICNkZWZpbmUgREVGX1NZU1NJWkUJMHg3RjAwCiAKIC8qIEludGVybmFsIHN2Z2Egc3RhcnR1cCBjb25zdGFudHMgKi8KQEAgLTI1LDQgKzIzLDQgQEAKICNkZWZpbmUgQk9PVF9TVEFDS19TSVpFCTB4MTAwMAogI2VuZGlmCiAKLSNlbmRpZiAvKiBfQVNNX0JPT1RfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0JPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2Jvb3RwYXJhbS5oIGIvaW5jbHVkZS9hc20teDg2L2Jvb3RwYXJhbS5oCmluZGV4IGFlMjJiZGYuLmNjZjAyN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9ib290cGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvYm9vdHBhcmFtLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fQk9PVFBBUkFNX0gKLSNkZWZpbmUgX0FTTV9CT09UUEFSQU1fSAorI2lmbmRlZiBBU01fWDg2X19CT09UUEFSQU1fSAorI2RlZmluZSBBU01fWDg2X19CT09UUEFSQU1fSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgpAQCAtMTA4LDQgKzEwOCw0IEBACiAJX191OCAgX3BhZDlbMjc2XTsJCQkJLyogMHhlZWMgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLSNlbmRpZiAvKiBfQVNNX0JPT1RQQVJBTV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fQk9PVFBBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9idWcuaCBiL2luY2x1ZGUvYXNtLXg4Ni9idWcuaAppbmRleCBiNjlhYTY0Li45MWFkNDNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2J1Zy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9CVUdfSAotI2RlZmluZSBfQVNNX1g4Nl9CVUdfSAorI2lmbmRlZiBBU01fWDg2X19CVUdfSAorI2RlZmluZSBBU01fWDg2X19CVUdfSAogCiAjaWZkZWYgQ09ORklHX0JVRwogI2RlZmluZSBIQVZFX0FSQ0hfQlVHCkBAIC0zNiw0ICszNiw0IEBACiAjZW5kaWYgLyogIUNPTkZJR19CVUcgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2J1Zy5oPgotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9idWdzLmggYi9pbmNsdWRlL2FzbS14ODYvYnVncy5oCmluZGV4IDAyMWNiZGQuLmRjNjA0OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9idWdzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2J1Z3MuaApAQCAtMSw3ICsxLDEyIEBACi0jaWZuZGVmIF9BU01fWDg2X0JVR1NfSAotI2RlZmluZSBfQVNNX1g4Nl9CVUdTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQlVHU19ICisjZGVmaW5lIEFTTV9YODZfX0JVR1NfSAogCiBleHRlcm4gdm9pZCBjaGVja19idWdzKHZvaWQpOwotaW50IHBwcm9fd2l0aF9yYW1fYnVnKHZvaWQpOwogCi0jZW5kaWYgLyogX0FTTV9YODZfQlVHU19IICovCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVUF9JTlRFTCkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzMyKQoraW50IHBwcm9fd2l0aF9yYW1fYnVnKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHBwcm9fd2l0aF9yYW1fYnVnKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogQVNNX1g4Nl9fQlVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS14ODYvYnl0ZW9yZGVyLmgKaW5kZXggZTAyYWUyZC4uNzIyZjI3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9ieXRlb3JkZXIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQllURU9SREVSX0gKLSNkZWZpbmUgX0FTTV9YODZfQllURU9SREVSX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQllURU9SREVSX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQllURU9SREVSX0gKIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC03OCw0ICs3OCw0IEBACiAKICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCi0jZW5kaWYgLyogX0FTTV9YODZfQllURU9SREVSX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2NhY2hlLmggYi9pbmNsdWRlL2FzbS14ODYvY2FjaGUuaAppbmRleCAxZTBiYWM4Li5lYTNmMWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvY2FjaGUuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FSQ0hfWDg2X0NBQ0hFX0gKLSNkZWZpbmUgX0FSQ0hfWDg2X0NBQ0hFX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQ0FDSEVfSAorI2RlZmluZSBBU01fWDg2X19DQUNIRV9ICiAKIC8qIEwxIGNhY2hlIGxpbmUgc2l6ZSAqLwogI2RlZmluZSBMMV9DQUNIRV9TSElGVAkoQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVCkKQEAgLTE3LDQgKzE3LDQgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS14ODYvY2FjaGVmbHVzaC5oCmluZGV4IGY0YzBhYjUuLjY4ODQwZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2NhY2hlZmx1c2guaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfQ0FDSEVGTFVTSF9ICi0jZGVmaW5lIF9BU01fWDg2X0NBQ0hFRkxVU0hfSAorI2lmbmRlZiBBU01fWDg2X19DQUNIRUZMVVNIX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQ0FDSEVGTFVTSF9ICiAKIC8qIEtlZXAgaW5jbHVkZXMgdGhlIHNhbWUgYWNyb3NzIGFyY2hlcy4gICovCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTI0LDYgKzI0LDggQEAKICNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQlcCiAJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCiAKKyNkZWZpbmUgUEdfbm9uX1dCCQkJCVBHX2FyY2hfMQorUEFHRUZMQUcoTm9uV0IsIG5vbl9XQikKIAogLyoKICAqIFRoZSBzZXRfbWVtb3J5XyogQVBJIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB2YXJpb3VzIGF0dHJpYnV0ZXMgb2YgYSB2aXJ0dWFsCkBAIC02Niw2ICs2OCw5IEBACiBpbnQgc2V0X21lbW9yeV9ucCh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcyk7CiBpbnQgc2V0X21lbW9yeV80ayh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcyk7CiAKK2ludCBzZXRfbWVtb3J5X2FycmF5X3VjKHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBhZGRyaW5hcnJheSk7CitpbnQgc2V0X21lbW9yeV9hcnJheV93Yih1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgYWRkcmluYXJyYXkpOworCiAvKgogICogRm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBBUElzLCBhIGZldyBmdW5jdGlvbnMKICAqIGFyZSBwcm92aWRlZCB0aGF0IHdvcmsgb24gYSAic3RydWN0IHBhZ2UiLgpAQCAtOTYsOCArMTAxLDYgQEAKIAogdm9pZCBjbGZsdXNoX2NhY2hlX3JhbmdlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBzaXplKTsKIAotdm9pZCBjcGFfaW5pdCh2b2lkKTsKLQogI2lmZGVmIENPTkZJR19ERUJVR19ST0RBVEEKIHZvaWQgbWFya19yb2RhdGFfcm8odm9pZCk7CiBleHRlcm4gY29uc3QgaW50IHJvZGF0YV90ZXN0X2RhdGE7CkBAIC0xMTIsNCArMTE1LDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9jYWxnYXJ5LmggYi9pbmNsdWRlL2FzbS14ODYvY2FsZ2FyeS5oCmluZGV4IDY3ZjYwNDAuLjkzM2ZkMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9jYWxnYXJ5LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2NhbGdhcnkuaApAQCAtMjEsOCArMjEsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2lmbmRlZiBfQVNNX1g4Nl82NF9DQUxHQVJZX0gKLSNkZWZpbmUgX0FTTV9YODZfNjRfQ0FMR0FSWV9ICisjaWZuZGVmIEFTTV9YODZfX0NBTEdBUllfSAorI2RlZmluZSBBU01fWDg2X19DQUxHQVJZX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC02OSw0ICs2OSw0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGV0ZWN0X2NhbGdhcnkodm9pZCkgeyByZXR1cm47IH0KICNlbmRpZgogCi0jZW5kaWYgLyogX0FTTV9YODZfNjRfQ0FMR0FSWV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fQ0FMR0FSWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvY2hlY2tzdW1fMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV8zMi5oCmluZGV4IDUyYmJiMGQuLmQwNDFlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV8zMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfSTM4Nl9DSEVDS1NVTV9ICi0jZGVmaW5lIF9JMzg2X0NIRUNLU1VNX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQ0hFQ0tTVU1fMzJfSAorI2RlZmluZSBBU01fWDg2X19DSEVDS1NVTV8zMl9ICiAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KIApAQCAtMTg2LDQgKzE4Niw0IEBACiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwogfQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19DSEVDS1NVTV8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvY2hlY2tzdW1fNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV82NC5oCmluZGV4IDhiZDg2MWMuLjExMGY0MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9jaGVja3N1bV82NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfWDg2XzY0X0NIRUNLU1VNX0gKLSNkZWZpbmUgX1g4Nl82NF9DSEVDS1NVTV9ICisjaWZuZGVmIEFTTV9YODZfX0NIRUNLU1VNXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fQ0hFQ0tTVU1fNjRfSAogCiAvKgogICogQ2hlY2tzdW1zIGZvciB4ODYtNjQKQEAgLTE4OCw0ICsxODgsNCBAQAogCXJldHVybiBhOwogfQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19DSEVDS1NVTV82NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvY21weGNoZ18zMi5oIGIvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfMzIuaAppbmRleCBiZjVhNjlkLi4wNjIyZTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY21weGNoZ18zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9jbXB4Y2hnXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0NNUFhDSEdfSAotI2RlZmluZSBfX0FTTV9DTVBYQ0hHX0gKKyNpZm5kZWYgQVNNX1g4Nl9fQ01QWENIR18zMl9ICisjZGVmaW5lIEFTTV9YODZfX0NNUFhDSEdfMzJfSAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+IC8qIGZvciBMT0NLX1BSRUZJWCAqLwogCkBAIC0zNDEsNCArMzQxLDQgQEAKIAogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0NNUFhDSEdfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jbXB4Y2hnXzY0LmgKaW5kZXggMTc0NjNjYy4uNjNjMWE1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvY21weGNoZ182NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9DTVBYQ0hHX0gKLSNkZWZpbmUgX19BU01fQ01QWENIR19ICisjaWZuZGVmIEFTTV9YODZfX0NNUFhDSEdfNjRfSAorI2RlZmluZSBBU01fWDg2X19DTVBYQ0hHXzY0X0gKIAogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPiAvKiBQcm92aWRlcyBMT0NLX1BSRUZJWCAqLwogCkBAIC0xODIsNCArMTgyLDQgQEAKIAljbXB4Y2hnX2xvY2FsKChwdHIpLCAobyksIChuKSk7CQkJCQlcCiB9KQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19DTVBYQ0hHXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jb21wYXQuaAppbmRleCAxNzkzYWMzLi42NzMyYjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2NvbXBhdC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl82NF9DT01QQVRfSAotI2RlZmluZSBfQVNNX1g4Nl82NF9DT01QQVRfSAorI2lmbmRlZiBBU01fWDg2X19DT01QQVRfSAorI2RlZmluZSBBU01fWDg2X19DT01QQVRfSAogCiAvKgogICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvbXBhdGliaWxpdHkgdHlwZXMKQEAgLTIxNSw0ICsyMTUsNCBAQAogCXJldHVybiBjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX0NPTVBBVDsKIH0KIAotI2VuZGlmIC8qIF9BU01fWDg2XzY0X0NPTVBBVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9jcHUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jcHUuaAppbmRleCA3M2YyZWE4Li44M2ExMTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY3B1LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2NwdS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0kzODZfQ1BVX0hfCi0jZGVmaW5lIF9BU01fSTM4Nl9DUFVfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fQ1BVX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQ1BVX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtMTcsNCArMTcsNCBAQAogI2VuZGlmCiAKIERFQ0xBUkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSk7Ci0jZW5kaWYgLyogX0FTTV9JMzg2X0NQVV9IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX0NQVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20teDg2L2NwdWZlYXR1cmUuaAppbmRleCA3NjJmNmE2Li5hZGZlYWU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY3B1ZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9jcHVmZWF0dXJlLmgKQEAgLTEsMTIgKzEsMTggQEAKIC8qCiAgKiBEZWZpbmVzIHg4NiBDUFUgZmVhdHVyZSBiaXRzCiAgKi8KLSNpZm5kZWYgX0FTTV9YODZfQ1BVRkVBVFVSRV9ICi0jZGVmaW5lIF9BU01fWDg2X0NQVUZFQVRVUkVfSAorI2lmbmRlZiBBU01fWDg2X19DUFVGRUFUVVJFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQ1BVRkVBVFVSRV9ICiAKICNpbmNsdWRlIDxhc20vcmVxdWlyZWQtZmVhdHVyZXMuaD4KIAotI2RlZmluZSBOQ0FQSU5UUwk4CS8qIE4gMzItYml0IHdvcmRzIHdvcnRoIG9mIGluZm8gKi8KKyNkZWZpbmUgTkNBUElOVFMJOQkvKiBOIDMyLWJpdCB3b3JkcyB3b3J0aCBvZiBpbmZvICovCisKKy8qCisgKiBOb3RlOiBJZiB0aGUgY29tbWVudCBiZWdpbnMgd2l0aCBhIHF1b3RlZCBzdHJpbmcsIHRoYXQgc3RyaW5nIGlzIHVzZWQKKyAqIGluIC9wcm9jL2NwdWluZm8gaW5zdGVhZCBvZiB0aGUgbWFjcm8gbmFtZS4gIElmIHRoZSBzdHJpbmcgaXMgIiIsCisgKiB0aGlzIGZlYXR1cmUgYml0IGlzIG5vdCBkaXNwbGF5ZWQgaW4gL3Byb2MvY3B1aW5mbyBhdCBhbGwuCisgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVkeCksIHdvcmQgMCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9GUFUJCSgwKjMyKyAwKSAvKiBPbmJvYXJkIEZQVSAqLwpAQCAtMTQsNyArMjAsNyBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9ERQkJKDAqMzIrIDIpIC8qIERlYnVnZ2luZyBFeHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BTRQkJKDAqMzIrIDMpIC8qIFBhZ2UgU2l6ZSBFeHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQwkJKDAqMzIrIDQpIC8qIFRpbWUgU3RhbXAgQ291bnRlciAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9NU1IJCSgwKjMyKyA1KSAvKiBNb2RlbC1TcGVjaWZpYyBSZWdpc3RlcnMsIFJETVNSLCBXUk1TUiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NU1IJCSgwKjMyKyA1KSAvKiBNb2RlbC1TcGVjaWZpYyBSZWdpc3RlcnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFFCQkoMCozMisgNikgLyogUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb25zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01DRQkJKDAqMzIrIDcpIC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYOAkJKDAqMzIrIDgpIC8qIENNUFhDSEc4IGluc3RydWN0aW9uICovCkBAIC0yMywyMiArMjksMjMgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfTVRSUgkoMCozMisxMikgLyogTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXJzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BHRQkJKDAqMzIrMTMpIC8qIFBhZ2UgR2xvYmFsIEVuYWJsZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NQ0EJCSgwKjMyKzE0KSAvKiBNYWNoaW5lIENoZWNrIEFyY2hpdGVjdHVyZSAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9DTU9WCSgwKjMyKzE1KSAvKiBDTU9WIGluc3RydWN0aW9uIChGQ01PVkNDIGFuZCBGQ09NSSB0b28gaWYgRlBVIHByZXNlbnQpICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0NNT1YJKDAqMzIrMTUpIC8qIENNT1YgaW5zdHJ1Y3Rpb25zICovCisJCQkJCSAgLyogKHBsdXMgRkNNT1ZjYywgRkNPTUkgd2l0aCBGUFUpICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BBVAkJKDAqMzIrMTYpIC8qIFBhZ2UgQXR0cmlidXRlIFRhYmxlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BTRTM2CSgwKjMyKzE3KSAvKiAzNi1iaXQgUFNFcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9QTgkJKDAqMzIrMTgpIC8qIFByb2Nlc3NvciBzZXJpYWwgbnVtYmVyICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0NMRkxTSAkoMCozMisxOSkgLyogU3VwcG9ydHMgdGhlIENMRkxVU0ggaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfRFMJCSgwKjMyKzIxKSAvKiBEZWJ1ZyBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMU0gJKDAqMzIrMTkpIC8qICJjbGZsdXNoIiBDTEZMVVNIIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0RTCQkoMCozMisyMSkgLyogImR0cyIgRGVidWcgU3RvcmUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNQSQkoMCozMisyMikgLyogQUNQSSB2aWEgTVNSICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01NWAkJKDAqMzIrMjMpIC8qIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9GWFNSCSgwKjMyKzI0KSAvKiBGWFNBVkUgYW5kIEZYUlNUT1IgaW5zdHJ1Y3Rpb25zIChmYXN0IHNhdmUgYW5kIHJlc3RvcmUgKi8KLQkJCQkJICAvKiBvZiBGUFUgY29udGV4dCksIGFuZCBDUjQuT1NGWFNSIGF2YWlsYWJsZSAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9YTU0JCSgwKjMyKzI1KSAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTIJKDAqMzIrMjYpIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMtMiAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9TRUxGU05PT1AJKDAqMzIrMjcpIC8qIENQVSBzZWxmIHNub29wICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU1IJKDAqMzIrMjQpIC8qIEZYU0FWRS9GWFJTVE9SLCBDUjQuT1NGWFNSICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTQkJKDAqMzIrMjUpIC8qICJzc2UiICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTIJKDAqMzIrMjYpIC8qICJzc2UyIiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TRUxGU05PT1AJKDAqMzIrMjcpIC8qICJzcyIgQ1BVIHNlbGYgc25vb3AgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfSFQJCSgwKjMyKzI4KSAvKiBIeXBlci1UaHJlYWRpbmcgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNDCQkoMCozMisyOSkgLyogQXV0b21hdGljIGNsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNDCQkoMCozMisyOSkgLyogInRtIiBBdXRvbWF0aWMgY2xvY2sgY29udHJvbCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9JQTY0CSgwKjMyKzMwKSAvKiBJQS02NCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEJFCQkoMCozMiszMSkgLyogUGVuZGluZyBCcmVhayBFbmFibGUgKi8KIAogLyogQU1ELWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDgwMDAwMDAxLCB3b3JkIDEgKi8KIC8qIERvbid0IGR1cGxpY2F0ZSBmZWF0dXJlIGZsYWdzIHdoaWNoIGFyZSByZWR1bmRhbnQgd2l0aCBJbnRlbCEgKi8KQEAgLTQ2LDcgKzUzLDggQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfTVAJCSgxKjMyKzE5KSAvKiBNUCBDYXBhYmxlLiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9OWAkJKDEqMzIrMjApIC8qIEV4ZWN1dGUgRGlzYWJsZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NTVhFWFQJKDEqMzIrMjIpIC8qIEFNRCBNTVggZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9HQlBBR0VTCSgxKjMyKzI2KSAvKiBHQiBwYWdlcyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9GWFNSX09QVAkoMSozMisyNSkgLyogRlhTQVZFL0ZYUlNUT1Igb3B0aW1pemF0aW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9HQlBBR0VTCSgxKjMyKzI2KSAvKiAicGRwZTFnYiIgR0IgcGFnZXMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUkRUU0NQCSgxKjMyKzI3KSAvKiBSRFRTQ1AgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTE0JCSgxKjMyKzI5KSAvKiBMb25nIE1vZGUgKHg4Ni02NCkgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfM0ROT1dFWFQJKDEqMzIrMzApIC8qIEFNRCAzRE5vdyEgZXh0ZW5zaW9ucyAqLwpAQCAtNjQsNTEgKzcyLDc5IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NZUklYX0FSUgkoMyozMisgMikgLyogQ3lyaXggQVJScyAoPSBNVFJScykgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0VOVEFVUl9NQ1IJKDMqMzIrIDMpIC8qIENlbnRhdXIgTUNScyAoPSBNVFJScykgKi8KIC8qIGNwdSB0eXBlcyBmb3Igc3BlY2lmaWMgdHVuaW5nczogKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfSzgJCSgzKjMyKyA0KSAvKiBPcHRlcm9uLCBBdGhsb242NCAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9LNwkJKDMqMzIrIDUpIC8qIEF0aGxvbiAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9QMwkJKDMqMzIrIDYpIC8qIFAzICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1A0CQkoMyozMisgNykgLyogUDQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSzgJCSgzKjMyKyA0KSAvKiAiIiBPcHRlcm9uLCBBdGhsb242NCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9LNwkJKDMqMzIrIDUpIC8qICIiIEF0aGxvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QMwkJKDMqMzIrIDYpIC8qICIiIFAzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1A0CQkoMyozMisgNykgLyogIiIgUDQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDICgzKjMyKyA4KSAvKiBUU0MgdGlja3MgYXQgYSBjb25zdGFudCByYXRlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1VQCQkoMyozMisgOSkgLyogc21wIGtlcm5lbCBydW5uaW5nIG9uIHVwICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLICgzKjMyKzEwKSAvKiBGWFNBVkUgbGVha3MgRk9QL0ZJUC9GT1AgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTQVZFX0xFQUsgKDMqMzIrMTApIC8qICIiIEZYU0FWRSBsZWFrcyBGT1AvRklQL0ZPUCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04gKDMqMzIrMTEpIC8qIEludGVsIEFyY2hpdGVjdHVyYWwgUGVyZk1vbiAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9QRUJTCSgzKjMyKzEyKSAgLyogUHJlY2lzZS1FdmVudCBCYXNlZCBTYW1wbGluZyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9CVFMJCSgzKjMyKzEzKSAgLyogQnJhbmNoIFRyYWNlIFN0b3JlICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1NZU0NBTEwzMgkoMyozMisxNCkgIC8qIHN5c2NhbGwgaW4gaWEzMiB1c2Vyc3BhY2UgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfU1lTRU5URVIzMgkoMyozMisxNSkgIC8qIHN5c2VudGVyIGluIGlhMzIgdXNlcnNwYWNlICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1JFUF9HT09ECSgzKjMyKzE2KSAvKiByZXAgbWljcm9jb2RlIHdvcmtzIHdlbGwgb24gdGhpcyBDUFUgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDICgzKjMyKzE3KSAvKiBNZmVuY2Ugc3luY2hyb25pemVzIFJEVFNDICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyAoMyozMisxOCkgLyogTGZlbmNlIHN5bmNocm9uaXplcyBSRFRTQyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV8xMUFQCSgzKjMyKzE5KSAgLyogQmFkIGxvY2FsIEFQSUMgYWthIDExQVAgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTk9QTAkoMyozMisyMCkgLyogVGhlIE5PUEwgKDBGIDFGKSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEVCUwkoMyozMisxMikgLyogUHJlY2lzZS1FdmVudCBCYXNlZCBTYW1wbGluZyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9CVFMJCSgzKjMyKzEzKSAvKiBCcmFuY2ggVHJhY2UgU3RvcmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU1lTQ0FMTDMyCSgzKjMyKzE0KSAvKiAiIiBzeXNjYWxsIGluIGlhMzIgdXNlcnNwYWNlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NZU0VOVEVSMzIJKDMqMzIrMTUpIC8qICIiIHN5c2VudGVyIGluIGlhMzIgdXNlcnNwYWNlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1JFUF9HT09ECSgzKjMyKzE2KSAvKiByZXAgbWljcm9jb2RlIHdvcmtzIHdlbGwgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDICgzKjMyKzE3KSAvKiAiIiBNZmVuY2Ugc3luY2hyb25pemVzIFJEVFNDICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyAoMyozMisxOCkgLyogIiIgTGZlbmNlIHN5bmNocm9uaXplcyBSRFRTQyAqLworI2RlZmluZSBYODZfRkVBVFVSRV8xMUFQCSgzKjMyKzE5KSAvKiAiIiBCYWQgbG9jYWwgQVBJQyBha2EgMTFBUCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9OT1BMCSgzKjMyKzIwKSAvKiBUaGUgTk9QTCAoMEYgMUYpIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BTURDMUUJKDMqMzIrMjEpIC8qIEFNRCBDMUUgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRPUE9MT0dZCSgzKjMyKzIxKSAvKiBjcHUgdG9wb2xvZ3kgZW51bSBleHRlbnNpb25zICovCiAKIC8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxIChlY3gpLCB3b3JkIDQgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMwkoNCozMisgMCkgLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy0zICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX01XQUlUCSg0KjMyKyAzKSAvKiBNb25pdG9yL013YWl0IHN1cHBvcnQgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfRFNDUEwJKDQqMzIrIDQpIC8qIENQTCBRdWFsaWZpZWQgRGVidWcgU3RvcmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMwkoNCozMisgMCkgLyogInBuaSIgU1NFLTMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUENMTVVMUURRCSg0KjMyKyAxKSAvKiBQQ0xNVUxRRFEgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRFRFUzY0CSg0KjMyKyAyKSAvKiA2NC1iaXQgRGVidWcgU3RvcmUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfTVdBSVQJKDQqMzIrIDMpIC8qICJtb25pdG9yIiBNb25pdG9yL013YWl0IHN1cHBvcnQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRFNDUEwJKDQqMzIrIDQpIC8qICJkc19jcGwiIENQTCBRdWFsLiBEZWJ1ZyBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9WTVgJCSg0KjMyKyA1KSAvKiBIYXJkd2FyZSB2aXJ0dWFsaXphdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TTVgJCSg0KjMyKyA2KSAvKiBTYWZlciBtb2RlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0VTVAkJKDQqMzIrIDcpIC8qIEVuaGFuY2VkIFNwZWVkU3RlcCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9UTTIJCSg0KjMyKyA4KSAvKiBUaGVybWFsIE1vbml0b3IgMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TU1NFMwkoNCozMisgOSkgLyogU3VwcGxlbWVudGFsIFNTRS0zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NJRAkJKDQqMzIrMTApIC8qIENvbnRleHQgSUQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRk1BCQkoNCozMisxMikgLyogRnVzZWQgbXVsdGlwbHktYWRkICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYMTYJKDQqMzIrMTMpIC8qIENNUFhDSEcxNkIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRQUgkoNCozMisxNCkgLyogU2VuZCBUYXNrIFByaW9yaXR5IE1lc3NhZ2VzICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BEQ00JKDQqMzIrMTUpIC8qIFBlcmZvcm1hbmNlIENhcGFiaWxpdGllcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9EQ0EJCSg0KjMyKzE4KSAvKiBEaXJlY3QgQ2FjaGUgQWNjZXNzICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTRfMgkoNCozMisyMCkgLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy00LjIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8xCSg0KjMyKzE5KSAvKiAic3NlNF8xIiBTU0UtNC4xICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTRfMgkoNCozMisyMCkgLyogInNzZTRfMiIgU1NFLTQuMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YMkFQSUMJKDQqMzIrMjEpIC8qIHgyQVBJQyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BRVMJCSg0KjMyKzI1KSAvKiBBRVMgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hTQVZFCSg0KjMyKzI2KSAvKiBYU0FWRS9YUlNUT1IvWFNFVEJWL1hHRVRCViAqLworI2RlZmluZSBYODZfRkVBVFVSRV9PU1hTQVZFCSg0KjMyKzI3KSAvKiAiIiBYU0FWRSBlbmFibGVkIGluIHRoZSBPUyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlgJCSg0KjMyKzI4KSAvKiBBZHZhbmNlZCBWZWN0b3IgRXh0ZW5zaW9ucyAqLwogCiAvKiBWSUEvQ3lyaXgvQ2VudGF1ci1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHhDMDAwMDAwMSwgd29yZCA1ICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1hTVE9SRQkoNSozMisgMikgLyogb24tQ1BVIFJORyBwcmVzZW50ICh4c3RvcmUgaW5zbikgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNUT1JFX0VOCSg1KjMyKyAzKSAvKiBvbi1DUFUgUk5HIGVuYWJsZWQgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfWENSWVBUCSg1KjMyKyA2KSAvKiBvbi1DUFUgY3J5cHRvICh4Y3J5cHQgaW5zbikgKi8KLSNkZWZpbmUgWDg2X0ZFQVRVUkVfWENSWVBUX0VOCSg1KjMyKyA3KSAvKiBvbi1DUFUgY3J5cHRvIGVuYWJsZWQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNUT1JFCSg1KjMyKyAyKSAvKiAicm5nIiBSTkcgcHJlc2VudCAoeHN0b3JlKSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YU1RPUkVfRU4JKDUqMzIrIDMpIC8qICJybmdfZW4iIFJORyBlbmFibGVkICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hDUllQVAkoNSozMisgNikgLyogImFjZSIgb24tQ1BVIGNyeXB0byAoeGNyeXB0KSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9YQ1JZUFRfRU4JKDUqMzIrIDcpIC8qICJhY2VfZW4iIG9uLUNQVSBjcnlwdG8gZW5hYmxlZCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BQ0UyCSg1KjMyKyA4KSAvKiBBZHZhbmNlZCBDcnlwdG9ncmFwaHkgRW5naW5lIHYyICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDRTJfRU4JKDUqMzIrIDkpIC8qIEFDRSB2MiBlbmFibGVkICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1BIRQkJKDUqMzIrIDEwKSAvKiBQYWRMb2NrIEhhc2ggRW5naW5lICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1BIRV9FTgkoNSozMisgMTEpIC8qIFBIRSBlbmFibGVkICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX1BNTQkJKDUqMzIrIDEyKSAvKiBQYWRMb2NrIE1vbnRnb21lcnkgTXVsdGlwbGllciAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9QTU1fRU4JKDUqMzIrIDEzKSAvKiBQTU0gZW5hYmxlZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QSEUJCSg1KjMyKzEwKSAvKiBQYWRMb2NrIEhhc2ggRW5naW5lICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1BIRV9FTgkoNSozMisxMSkgLyogUEhFIGVuYWJsZWQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE1NCQkoNSozMisxMikgLyogUGFkTG9jayBNb250Z29tZXJ5IE11bHRpcGxpZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE1NX0VOCSg1KjMyKzEzKSAvKiBQTU0gZW5hYmxlZCAqLwogCiAvKiBNb3JlIGV4dGVuZGVkIEFNRCBmbGFnczogQ1BVSUQgbGV2ZWwgMHg4MDAwMDAwMSwgZWN4LCB3b3JkIDYgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTEFIRl9MTQkoNiozMisgMCkgLyogTEFIRi9TQUhGIGluIGxvbmcgbW9kZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9DTVBfTEVHQUNZCSg2KjMyKyAxKSAvKiBJZiB5ZXMgSHlwZXJUaHJlYWRpbmcgbm90IHZhbGlkICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX0lCUwkJKDYqMzIrIDEwKSAvKiBJbnN0cnVjdGlvbiBCYXNlZCBTYW1wbGluZyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9TVk0JCSg2KjMyKyAyKSAvKiBTZWN1cmUgdmlydHVhbCBtYWNoaW5lICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0VYVEFQSUMJKDYqMzIrIDMpIC8qIEV4dGVuZGVkIEFQSUMgc3BhY2UgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1I4X0xFR0FDWQkoNiozMisgNCkgLyogQ1I4IGluIDMyLWJpdCBtb2RlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FCTQkJKDYqMzIrIDUpIC8qIEFkdmFuY2VkIGJpdCBtYW5pcHVsYXRpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfU1NFNEEJKDYqMzIrIDYpIC8qIFNTRS00QSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NSVNBTElHTlNTRSAoNiozMisgNykgLyogTWlzYWxpZ25lZCBTU0UgbW9kZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV8zRE5PV1BSRUZFVENIICg2KjMyKyA4KSAvKiAzRE5vdyBwcmVmZXRjaCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfT1NWVwkoNiozMisgOSkgLyogT1MgVmlzaWJsZSBXb3JrYXJvdW5kICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0lCUwkJKDYqMzIrMTApIC8qIEluc3RydWN0aW9uIEJhc2VkIFNhbXBsaW5nICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NTRTUJKDYqMzIrMTEpIC8qIFNTRS01ICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NLSU5JVAkoNiozMisxMikgLyogU0tJTklUL1NUR0kgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1dEVAkJKDYqMzIrMTMpIC8qIFdhdGNoZG9nIHRpbWVyICovCiAKIC8qCiAgKiBBdXhpbGlhcnkgZmxhZ3M6IExpbnV4IGRlZmluZWQgLSBGb3IgZmVhdHVyZXMgc2NhdHRlcmVkIGluIHZhcmlvdXMKQEAgLTExNiw2ICsxNTIsMTMgQEAKICAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9JREEJCSg3KjMyKyAwKSAvKiBJbnRlbCBEeW5hbWljIEFjY2VsZXJhdGlvbiAqLwogCisvKiBWaXJ0dWFsaXphdGlvbiBmbGFnczogTGludXggZGVmaW5lZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9UUFJfU0hBRE9XICAoOCozMisgMCkgLyogSW50ZWwgVFBSIFNoYWRvdyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9WTk1JICAgICAgICAoOCozMisgMSkgLyogSW50ZWwgVmlydHVhbCBOTUkgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRkxFWFBSSU9SSVRZICg4KjMyKyAyKSAvKiBJbnRlbCBGbGV4UHJpb3JpdHkgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRVBUICAgICAgICAgKDgqMzIrIDMpIC8qIEludGVsIEV4dGVuZGVkIFBhZ2UgVGFibGUgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfVlBJRCAgICAgICAgKDgqMzIrIDQpIC8qIEludGVsIFZpcnR1YWwgUHJvY2Vzc29yIElEICovCisKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMTQ5LDcgKzE5Miw3IEBACiB9IHdoaWxlICgwKQogI2RlZmluZSBzZXR1cF9mb3JjZV9jcHVfY2FwKGJpdCkgZG8geyBcCiAJc2V0X2NwdV9jYXAoJmJvb3RfY3B1X2RhdGEsIGJpdCk7CVwKLQljbGVhcl9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKWNsZWFyZWRfY3B1X2NhcHMpOyAJXAorCWNsZWFyX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopY2xlYXJlZF9jcHVfY2Fwcyk7CVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgY3B1X2hhc19mcHUJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9GUFUpCkBAIC0xOTAsNyArMjMzLDEwIEBACiAjZGVmaW5lIGNwdV9oYXNfZ2JwYWdlcwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0dCUEFHRVMpCiAjZGVmaW5lIGNwdV9oYXNfYXJjaF9wZXJmbW9uCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pCiAjZGVmaW5lIGNwdV9oYXNfcGF0CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUEFUKQorI2RlZmluZSBjcHVfaGFzX3htbTRfMQkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTRfMSkKICNkZWZpbmUgY3B1X2hhc194bW00XzIJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9YTU00XzIpCisjZGVmaW5lIGNwdV9oYXNfeDJhcGljCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWDJBUElDKQorI2RlZmluZSBjcHVfaGFzX3hzYXZlCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWFNBVkUpCiAKICNpZiBkZWZpbmVkKENPTkZJR19YODZfSU5WTFBHKSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCiAjIGRlZmluZSBjcHVfaGFzX2ludmxwZwkJMQpAQCAtMjIyLDQgKzI2OCw0IEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykgKi8KIAotI2VuZGlmIC8qIF9BU01fWDg2X0NQVUZFQVRVUkVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0NQVUZFQVRVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2N1cnJlbnQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9jdXJyZW50LmgKaW5kZXggNzUxNWMxOS4uYTg2M2VhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2N1cnJlbnQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvY3VycmVudC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfWDg2X0NVUlJFTlRfSAotI2RlZmluZSBfWDg2X0NVUlJFTlRfSAorI2lmbmRlZiBBU01fWDg2X19DVVJSRU5UX0gKKyNkZWZpbmUgQVNNX1g4Nl9fQ1VSUkVOVF9ICiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KQEAgLTM2LDQgKzM2LDQgQEAKIAogI2RlZmluZSBjdXJyZW50IGdldF9jdXJyZW50KCkKIAotI2VuZGlmIC8qIFg4Nl9DVVJSRU5UX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19DVVJSRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9kZWJ1Z3JlZy5oIGIvaW5jbHVkZS9hc20teDg2L2RlYnVncmVnLmgKaW5kZXggYzYzNDRkNS4uZWNiNjkwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2RlYnVncmVnLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2RlYnVncmVnLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0RFQlVHUkVHX0gKLSNkZWZpbmUgX0FTTV9YODZfREVCVUdSRUdfSAorI2lmbmRlZiBBU01fWDg2X19ERUJVR1JFR19ICisjZGVmaW5lIEFTTV9YODZfX0RFQlVHUkVHX0gKIAogCiAvKiBJbmRpY2F0ZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBmb3IgYSBudW1iZXIgb2YgdGhlIHNwZWNpZmljCkBAIC02Nyw0ICs2Nyw0IEBACiAjZGVmaW5lIERSX0xPQ0FMX1NMT1dET1dOICgweDEwMCkgICAvKiBMb2NhbCBzbG93IHRoZSBwaXBlbGluZSAqLwogI2RlZmluZSBEUl9HTE9CQUxfU0xPV0RPV04gKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0RFQlVHUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9kZWxheS5oIGIvaW5jbHVkZS9hc20teDg2L2RlbGF5LmgKaW5kZXggNDA5YTY0OS4uOGEwZGE5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2RlbGF5LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0RFTEFZX0gKLSNkZWZpbmUgX0FTTV9YODZfREVMQVlfSAorI2lmbmRlZiBBU01fWDg2X19ERUxBWV9ICisjZGVmaW5lIEFTTV9YODZfX0RFTEFZX0gKIAogLyoKICAqIENvcHlyaWdodCAoQykgMTk5MyBMaW51cyBUb3J2YWxkcwpAQCAtMjgsNCArMjgsNCBAQAogCiB2b2lkIHVzZV90c2NfZGVsYXkodm9pZCk7CiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9ERUxBWV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fREVMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2Rlc2MuaCBiL2luY2x1ZGUvYXNtLXg4Ni9kZXNjLmgKaW5kZXggYTQ0YzRkYy4uZjA2YWRhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Rlc2MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZGVzYy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0RFU0NfSF8KLSNkZWZpbmUgX0FTTV9ERVNDX0hfCisjaWZuZGVmIEFTTV9YODZfX0RFU0NfSAorI2RlZmluZSBBU01fWDg2X19ERVNDX0gKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vZGVzY19kZWZzLmg+CkBAIC0yNCw2ICsyNCwxMSBAQAogCWRlc2MtPmQgPSBpbmZvLT5zZWdfMzJiaXQ7CiAJZGVzYy0+ZyA9IGluZm8tPmxpbWl0X2luX3BhZ2VzOwogCWRlc2MtPmJhc2UyID0gKGluZm8tPmJhc2VfYWRkciAmIDB4ZmYwMDAwMDApID4+IDI0OworCS8qCisJICogRG9uJ3QgYWxsb3cgc2V0dGluZyBvZiB0aGUgbG0gYml0LiBJdCBpcyB1c2VsZXNzIGFueXdheQorCSAqIGJlY2F1c2UgNjRiaXQgc3lzdGVtIGNhbGxzIHJlcXVpcmUgX19VU0VSX0NTOgorCSAqLworCWRlc2MtPmwgPSAwOwogfQogCiBleHRlcm4gc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjcjsKQEAgLTk3LDcgKzEwMiwxNSBAQAogCW5hdGl2ZV93cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBkZXNjLCB0eXBlKQogI2RlZmluZSB3cml0ZV9pZHRfZW50cnkoZHQsIGVudHJ5LCBnKQkJXAogCW5hdGl2ZV93cml0ZV9pZHRfZW50cnkoZHQsIGVudHJ5LCBnKQotI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19sZHQoc3RydWN0IGRlc2Nfc3RydWN0ICpsZHQsIHVuc2lnbmVkIGVudHJpZXMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9mcmVlX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcykKK3sKK30KKyNlbmRpZgkvKiBDT05GSUdfUEFSQVZJUlQgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV93cml0ZV9pZHRfZW50cnkoZ2F0ZV9kZXNjICppZHQsIGludCBlbnRyeSwKIAkJCQkJICBjb25zdCBnYXRlX2Rlc2MgKmdhdGUpCkBAIC0zMzgsMjIgKzM1MSwxOCBAQAogCV9zZXRfZ2F0ZShuLCBHQVRFX0lOVEVSUlVQVCwgYWRkciwgMHgzLCAwLCBfX0tFUk5FTF9DUyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3lzdGVtX3RyYXBfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdm9pZCAqYWRkcikKK3sKKwlCVUdfT04oKHVuc2lnbmVkKW4gPiAweEZGKTsKKwlfc2V0X2dhdGUobiwgR0FURV9UUkFQLCBhZGRyLCAweDMsIDAsIF9fS0VSTkVMX0NTKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNldF90cmFwX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCiB7CiAJQlVHX09OKCh1bnNpZ25lZCluID4gMHhGRik7CiAJX3NldF9nYXRlKG4sIEdBVEVfVFJBUCwgYWRkciwgMCwgMCwgX19LRVJORUxfQ1MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N5c3RlbV9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQotewotCUJVR19PTigodW5zaWduZWQpbiA+IDB4RkYpOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQlfc2V0X2dhdGUobiwgR0FURV9UUkFQLCBhZGRyLCAweDMsIDAsIF9fS0VSTkVMX0NTKTsKLSNlbHNlCi0JX3NldF9nYXRlKG4sIEdBVEVfSU5URVJSVVBULCBhZGRyLCAweDMsIDAsIF9fS0VSTkVMX0NTKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rhc2tfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGdkdF9lbnRyeSkKIHsKIAlCVUdfT04oKHVuc2lnbmVkKW4gPiAweEZGKTsKQEAgLTM2Niw3ICszNzUsNyBAQAogCV9zZXRfZ2F0ZShuLCBHQVRFX0lOVEVSUlVQVCwgYWRkciwgMCwgaXN0LCBfX0tFUk5FTF9DUyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3lzdGVtX2dhdGVfaXN0KGludCBuLCB2b2lkICphZGRyLCB1bnNpZ25lZCBpc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N5c3RlbV9pbnRyX2dhdGVfaXN0KGludCBuLCB2b2lkICphZGRyLCB1bnNpZ25lZCBpc3QpCiB7CiAJQlVHX09OKCh1bnNpZ25lZCluID4gMHhGRik7CiAJX3NldF9nYXRlKG4sIEdBVEVfSU5URVJSVVBULCBhZGRyLCAweDMsIGlzdCwgX19LRVJORUxfQ1MpOwpAQCAtMzk3LDQgKzQwNiw0IEBACiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fREVTQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZGVzY19kZWZzLmggYi9pbmNsdWRlL2FzbS14ODYvZGVzY19kZWZzLmgKaW5kZXggZjdiYWNmMy4uYjg4MWRiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Rlc2NfZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9kZXNjX2RlZnMuaApAQCAtMSw2ICsxLDYgQEAKIC8qIFdyaXR0ZW4gMjAwMCBieSBBbmRpIEtsZWVuICovCi0jaWZuZGVmIF9fQVJDSF9ERVNDX0RFRlNfSAotI2RlZmluZSBfX0FSQ0hfREVTQ19ERUZTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fREVTQ19ERUZTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fREVTQ19ERUZTX0gKIAogLyoKICAqIFNlZ21lbnQgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIHVzYWJsZSBmcm9tIGJvdGggeDg2XzY0IGFuZCBpMzg2CkBAIC05Miw0ICs5Miw0IEBACiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0RFU0NfREVGU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS14ODYvZGV2aWNlLmgKaW5kZXggM2MwMzRmNC4uMWJlY2UwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9kZXZpY2UuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfREVWSUNFX0gKLSNkZWZpbmUgX0FTTV9YODZfREVWSUNFX0gKKyNpZm5kZWYgQVNNX1g4Nl9fREVWSUNFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fREVWSUNFX0gKIAogc3RydWN0IGRldl9hcmNoZGF0YSB7CiAjaWZkZWYgQ09ORklHX0FDUEkKQEAgLTEzLDQgKzEzLDQgQEAKICNlbmRpZgogfTsKIAotI2VuZGlmIC8qIF9BU01fWDg2X0RFVklDRV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9kaXY2NC5oIGIvaW5jbHVkZS9hc20teDg2L2RpdjY0LmgKaW5kZXggOWEyZDY0NC4uZjk1MzBmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2RpdjY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0RJVjY0X0gKLSNkZWZpbmUgX0FTTV9YODZfRElWNjRfSAorI2lmbmRlZiBBU01fWDg2X19ESVY2NF9ICisjZGVmaW5lIEFTTV9YODZfX0RJVjY0X0gKIAogI2lmZGVmIENPTkZJR19YODZfMzIKIApAQCAtNTcsNCArNTcsNCBAQAogIyBpbmNsdWRlIDxhc20tZ2VuZXJpYy9kaXY2NC5oPgogI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KIAotI2VuZGlmIC8qIF9BU01fWDg2X0RJVjY0X0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19ESVY2NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXg4Ni9kbWEtbWFwcGluZy5oCmluZGV4IGFkOWNkNmQuLjIxOWMzM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9kbWEtbWFwcGluZy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0RNQV9NQVBQSU5HX0hfCi0jZGVmaW5lIF9BU01fRE1BX01BUFBJTkdfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fRE1BX01BUFBJTkdfSAorI2RlZmluZSBBU01fWDg2X19ETUFfTUFQUElOR19ICiAKIC8qCiAgKiBJT01NVSBpbnRlcmZhY2UuIFNlZSBEb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dCBhbmQgRE1BLUFQSS50eHQgZm9yCkBAIC05LDEyICs5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3dpb3RsYi5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1jb2hlcmVudC5oPgogCiBleHRlcm4gZG1hX2FkZHJfdCBiYWRfZG1hX2FkZHJlc3M7CiBleHRlcm4gaW50IGlvbW11X21lcmdlOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgZmFsbGJhY2tfZGV2OworZXh0ZXJuIHN0cnVjdCBkZXZpY2UgeDg2X2RtYV9mYWxsYmFja19kZXY7CiBleHRlcm4gaW50IHBhbmljX29uX292ZXJmbG93OwotZXh0ZXJuIGludCBmb3JjZV9pb21tdTsKIAogc3RydWN0IGRtYV9tYXBwaW5nX29wcyB7CiAJaW50ICAgICAgICAgICAgICgqbWFwcGluZ19lcnJvcikoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMjUsOSArMjUsNiBAQAogCQkJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCWRtYV9hZGRyX3QgICAgICAoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwdHIsCiAJCQkJc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOwotCS8qIGxpa2UgbWFwX3NpbmdsZSwgYnV0IGRvZXNuJ3QgY2hlY2sgdGhlIGRldmljZSBtYXNrICovCi0JZG1hX2FkZHJfdCAgICAgICgqbWFwX3NpbXBsZSkoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHB0ciwKLQkJCQlzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7CiAJdm9pZCAgICAgICAgICAgICgqdW5tYXBfc2luZ2xlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKIAkJCQlzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7CiAJdm9pZCAgICAgICAgICAgICgqc3luY19zaW5nbGVfZm9yX2NwdSkoc3RydWN0IGRldmljZSAqaHdkZXYsCkBAIC02OCw3ICs2NSw3IEBACiAJCXJldHVybiBkbWFfb3BzOwogCWVsc2UKIAkJcmV0dXJuIGRldi0+YXJjaGRhdGEuZG1hX29wczsKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0RNQV9NQVBQSU5HX0ggKi8KIH0KIAogLyogTWFrZSBzdXJlIHdlIGtlZXAgdGhlIHNhbWUgYmVoYXZpb3VyICovCkBAIC04NywxNyArODQsMTQgQEAKIAogI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCiAjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCi0KLXZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZyk7Ci0KLXZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKLQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKQkoMSkKIAogZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7CiBleHRlcm4gaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKIAorZXh0ZXJuIHZvaWQgKmRtYV9nZW5lcmljX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJCWRtYV9hZGRyX3QgKmRtYV9hZGRyLCBnZnBfdCBmbGFnKTsKKwogc3RhdGljIGlubGluZSBkbWFfYWRkcl90CiBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgaW50IGRpcmVjdGlvbikKQEAgLTI0Nyw3ICsyNDEsNjggQEAKIAlyZXR1cm4gYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplOwogfQogCi0jZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpCSgxKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRtYV9hbGxvY19jb2hlcmVudF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSAgICBnZnBfdCBnZnApCit7CisJdW5zaWduZWQgbG9uZyBkbWFfbWFzayA9IDA7CiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtY29oZXJlbnQuaD4KKwlkbWFfbWFzayA9IGRldi0+Y29oZXJlbnRfZG1hX21hc2s7CisJaWYgKCFkbWFfbWFzaykKKwkJZG1hX21hc2sgPSAoZ2ZwICYgR0ZQX0RNQSkgPyBETUFfMjRCSVRfTUFTSyA6IERNQV8zMkJJVF9NQVNLOworCisJcmV0dXJuIGRtYV9tYXNrOworfQorCitzdGF0aWMgaW5saW5lIGdmcF90IGRtYV9hbGxvY19jb2hlcmVudF9nZnBfZmxhZ3Moc3RydWN0IGRldmljZSAqZGV2LCBnZnBfdCBnZnApCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXVuc2lnbmVkIGxvbmcgZG1hX21hc2sgPSBkbWFfYWxsb2NfY29oZXJlbnRfbWFzayhkZXYsIGdmcCk7CisKKwlpZiAoZG1hX21hc2sgPD0gRE1BXzMyQklUX01BU0sgJiYgIShnZnAgJiBHRlBfRE1BKSkKKwkJZ2ZwIHw9IEdGUF9ETUEzMjsKKyNlbmRpZgorICAgICAgIHJldHVybiBnZnA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwKKwkJZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisJdm9pZCAqbWVtb3J5OworCisJZ2ZwICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX0RNQTMyKTsKKworCWlmIChkbWFfYWxsb2NfZnJvbV9jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsICZtZW1vcnkpKQorCQlyZXR1cm4gbWVtb3J5OworCisJaWYgKCFkZXYpIHsKKwkJZGV2ID0gJng4Nl9kbWFfZmFsbGJhY2tfZGV2OworCQlnZnAgfD0gR0ZQX0RNQTsKKwl9CisKKwlpZiAoIWlzX2RldmljZV9kbWFfY2FwYWJsZShkZXYpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghb3BzLT5hbGxvY19jb2hlcmVudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gb3BzLT5hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGRtYV9oYW5kbGUsCisJCQkJICAgZG1hX2FsbG9jX2NvaGVyZW50X2dmcF9mbGFncyhkZXYsIGdmcCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGJ1cykKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOyAgICAgICAvKiBmb3IgcG9ydGFiaWxpdHkgKi8KKworCWlmIChkbWFfcmVsZWFzZV9mcm9tX2NvaGVyZW50KGRldiwgZ2V0X29yZGVyKHNpemUpLCB2YWRkcikpCisJCXJldHVybjsKKworCWlmIChvcHMtPmZyZWVfY29oZXJlbnQpCisJCW9wcy0+ZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIHZhZGRyLCBidXMpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9kbWEuaCBiL2luY2x1ZGUvYXNtLXg4Ni9kbWEuaAppbmRleCBjYTEwOThhLi5jOWY3YTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2RtYS5oCkBAIC01LDggKzUsOCBAQAogICogYW5kIEpvaG4gQm95ZCwgTm92LiAxOTkyLgogICovCiAKLSNpZm5kZWYgX0FTTV9YODZfRE1BX0gKLSNkZWZpbmUgX0FTTV9YODZfRE1BX0gKKyNpZm5kZWYgQVNNX1g4Nl9fRE1BX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRE1BX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CS8qIEFuZCBzcGlubG9ja3MgKi8KICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG5lZWQgYnl0ZSBJTyAqLwpAQCAtMzE1LDQgKzMxNSw0IEBACiAjZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5CSgwKQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9ETUFfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZG1pLmggYi9pbmNsdWRlL2FzbS14ODYvZG1pLmgKaW5kZXggNThhODY1Ny4uMWNmZjZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2RtaS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9kbWkuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfRE1JX0gKLSNkZWZpbmUgX0FTTV9YODZfRE1JX0gKKyNpZm5kZWYgQVNNX1g4Nl9fRE1JX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRE1JX0gKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0yMyw0ICsyMyw0IEBACiAjZGVmaW5lIGRtaV9pb3JlbWFwIGVhcmx5X2lvcmVtYXAKICNkZWZpbmUgZG1pX2lvdW5tYXAgZWFybHlfaW91bm1hcAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19ETUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2RzLmggYi9pbmNsdWRlL2FzbS14ODYvZHMuaAppbmRleCA3ODgxMzY4Li5jM2M5NTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZHMuaApAQCAtMiw3MSArMiwyMzcgQEAKICAqIERlYnVnIFN0b3JlIChEUykgc3VwcG9ydAogICoKICAqIFRoaXMgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBoYXJkd2FyZSdzIERlYnVnIFN0b3JlCi0gKiBmZWF0dXJlIHRoYXQgaXMgdXNlZCBmb3IgbGFzdCBicmFuY2ggcmVjb3JkaW5nIChMQlIpIGFuZAorICogZmVhdHVyZSB0aGF0IGlzIHVzZWQgZm9yIGJyYW5jaCB0cmFjZSBzdG9yZSAoQlRTKSBhbmQKICAqIHByZWNpc2UtZXZlbnQgYmFzZWQgc2FtcGxpbmcgKFBFQlMpLgogICoKLSAqIERpZmZlcmVudCBhcmNoaXRlY3R1cmVzIHVzZSBhIGRpZmZlcmVudCBEUyBsYXlvdXQvcG9pbnRlciBzaXplLgotICogVGhlIGJlbG93IGZ1bmN0aW9ucyB0aGVyZWZvcmUgd29yayBvbiBhIHZvaWQqLgorICogSXQgbWFuYWdlczoKKyAqIC0gcGVyLXRocmVhZCBhbmQgcGVyLWNwdSBhbGxvY2F0aW9uIG9mIEJUUyBhbmQgUEVCUworICogLSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gKG9wdGlvbmFsKQorICogLSBidWZmZXIgb3ZlcmZsb3cgaGFuZGxpbmcKKyAqIC0gYnVmZmVyIGFjY2VzcworICoKKyAqIEl0IGFzc3VtZXM6CisgKiAtIGdldF90YXNrX3N0cnVjdCBvbiBhbGwgcGFyYW1ldGVyIHRhc2tzCisgKiAtIGN1cnJlbnQgaXMgYWxsb3dlZCB0byB0cmFjZSBwYXJhbWV0ZXIgdGFza3MKICAqCiAgKgotICogU2luY2UgdGhlcmUgaXMgbm8gdXNlciBmb3IgUEVCUywgeWV0LCBvbmx5IExCUiAob3IgYnJhbmNoCi0gKiB0cmFjZSBzdG9yZSwgQlRTKSBpcyBzdXBwb3J0ZWQuCi0gKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIERlYyAyMDA3CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDctMjAwOAogICovCiAKLSNpZm5kZWYgX0FTTV9YODZfRFNfSAotI2RlZmluZSBfQVNNX1g4Nl9EU19ICisjaWZuZGVmIEFTTV9YODZfX0RTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRFNfSAorCisjaWZkZWYgQ09ORklHX1g4Nl9EUwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLXN0cnVjdCBjcHVpbmZvX3g4NjsKIAorc3RydWN0IHRhc2tfc3RydWN0OwogCi0vKiBhIGJyYW5jaCB0cmFjZSByZWNvcmQgZW50cnkKKy8qCisgKiBSZXF1ZXN0IEJUUyBvciBQRUJTCiAgKgotICogSW4gb3JkZXIgdG8gdW5pZnkgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHZhcmlvdXMgcHJvY2Vzc29yIHZlcnNpb25zLAotICogd2UgdXNlIHRoZSBiZWxvdyBkYXRhIHN0cnVjdHVyZSBmb3IgYWxsIHByb2Nlc3NvcnMuCisgKiBEdWUgdG8gYWxpZ25lbWVudCBjb25zdHJhaW50cywgdGhlIGFjdHVhbCBidWZmZXIgbWF5IGJlIHNsaWdodGx5CisgKiBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBvciBwcm92aWRlZCBidWZmZXIuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3M7IC1FZXJybm8gb3RoZXJ3aXNlCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gcmVxdWVzdCByZWNvcmRpbmcgZm9yOworICogICAgICAgTlVMTCBmb3IgcGVyLWNwdSByZWNvcmRpbmcgb24gdGhlIGN1cnJlbnQgY3B1CisgKiBiYXNlOiB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGUgKG5vbi1wYWdlYWJsZSkgYnVmZmVyOworICogICAgICAgTlVMTCBpZiBidWZmZXIgYWxsb2NhdGlvbiByZXF1ZXN0ZWQKKyAqIHNpemU6IHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgb3IgcHJvdmlkZWQgYnVmZmVyCisgKiBvdmZsOiBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGJ1ZmZlciBvdmVyZmxvdzsKKyAqICAgICAgIE5VTEwgaWYgY3ljbGljIGJ1ZmZlciByZXF1ZXN0ZWQKICAqLwotZW51bSBidHNfcXVhbGlmaWVyIHsKLQlCVFNfSU5WQUxJRCA9IDAsCi0JQlRTX0JSQU5DSCwKLQlCVFNfVEFTS19BUlJJVkVTLAotCUJUU19UQVNLX0RFUEFSVFMKK3R5cGVkZWYgdm9pZCAoKmRzX292ZmxfY2FsbGJhY2tfdCkoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIGludCBkc19yZXF1ZXN0X2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJICBkc19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCk7CitleHRlcm4gaW50IGRzX3JlcXVlc3RfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJICAgZHNfb3ZmbF9jYWxsYmFja190IG92ZmwpOworCisvKgorICogUmVsZWFzZSBCVFMgb3IgUEVCUyByZXNvdXJjZXMKKyAqCisgKiBGcmVlcyBidWZmZXJzIGFsbG9jYXRlZCBvbiBkc19yZXF1ZXN0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyAtRWVycm5vIG90aGVyd2lzZQorICoKKyAqIHRhc2s6IHRoZSB0YXNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGZvcjsKKyAqICAgICAgIE5VTEwgdG8gcmVsZWFzZSByZXNvdXJjZXMgZm9yIHRoZSBjdXJyZW50IGNwdQorICovCitleHRlcm4gaW50IGRzX3JlbGVhc2VfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gaW50IGRzX3JlbGVhc2VfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCisvKgorICogUmV0dXJuIHRoZSAoYXJyYXkpIGluZGV4IG9mIHRoZSB3cml0ZSBwb2ludGVyLgorICogKGFzc3VtaW5nIGFuIGFycmF5IG9mIEJUUy9QRUJTIHJlY29yZHMpCisgKgorICogUmV0dXJucyAtRWVycm5vIG9uIGVycm9yCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKiBwb3MgKG91dCk6IGlmIG5vdCBOVUxMLCB3aWxsIGhvbGQgdGhlIHJlc3VsdAorICovCitleHRlcm4gaW50IGRzX2dldF9idHNfaW5kZXgoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzaXplX3QgKnBvcyk7CitleHRlcm4gaW50IGRzX2dldF9wZWJzX2luZGV4KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc2l6ZV90ICpwb3MpOworCisvKgorICogUmV0dXJuIHRoZSAoYXJyYXkpIGluZGV4IG9uZSByZWNvcmQgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICogKGFzc3VtaW5nIGFuIGFycmF5IG9mIEJUUy9QRUJTIHJlY29yZHMpCisgKgorICogUmV0dXJucyAtRWVycm5vIG9uIGVycm9yCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKiBwb3MgKG91dCk6IGlmIG5vdCBOVUxMLCB3aWxsIGhvbGQgdGhlIHJlc3VsdAorICovCitleHRlcm4gaW50IGRzX2dldF9idHNfZW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc2l6ZV90ICpwb3MpOworZXh0ZXJuIGludCBkc19nZXRfcGVic19lbmQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzaXplX3QgKnBvcyk7CisKKy8qCisgKiBQcm92aWRlIGEgcG9pbnRlciB0byB0aGUgQlRTL1BFQlMgcmVjb3JkIGF0IHBhcmFtZXRlciBpbmRleC4KKyAqIChhc3N1bWluZyBhbiBhcnJheSBvZiBCVFMvUEVCUyByZWNvcmRzKQorICoKKyAqIFRoZSBwb2ludGVyIHBvaW50cyBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIuIFRoZSB1c2VyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY29weWluZyB0aGUgcmVjb3JkLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgYSBzaW5nbGUgcmVjb3JkIG9uIHN1Y2Nlc3M7IC1FZXJybm8gb24gZXJyb3IKKyAqCisgKiB0YXNrOiB0aGUgdGFzayB0byBhY2Nlc3M7CisgKiAgICAgICBOVUxMIHRvIGFjY2VzcyB0aGUgY3VycmVudCBjcHUKKyAqIGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCByZWNvcmQKKyAqIHJlY29yZCAob3V0KTogcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIHJlY29yZAorICovCitleHRlcm4gaW50IGRzX2FjY2Vzc19idHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJIHNpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnJlY29yZCk7CitleHRlcm4gaW50IGRzX2FjY2Vzc19wZWJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCSAgc2l6ZV90IGluZGV4LCBjb25zdCB2b2lkICoqcmVjb3JkKTsKKworLyoKKyAqIFdyaXRlIG9uZSBvciBtb3JlIEJUUy9QRUJTIHJlY29yZHMgYXQgdGhlIHdyaXRlIHBvaW50ZXIgaW5kZXggYW5kCisgKiBhZHZhbmNlIHRoZSB3cml0ZSBwb2ludGVyLgorICoKKyAqIElmIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHJlY29yZCBzaXplLCB0cmFpbGluZyBieXRlcyBhcmUKKyAqIHplcm9lZCBvdXQuCisgKgorICogTWF5IHJlc3VsdCBpbiBvbmUgb3IgbW9yZSBvdmVyZmxvdyBub3RpZmljYXRpb25zLgorICoKKyAqIElmIGNhbGxlZCBkdXJpbmcgb3ZlcmZsb3cgaGFuZGxpbmcsIHRoYXQgaXMsIHdpdGggaW5kZXggPj0KKyAqIGludGVycnVwdCB0aHJlc2hvbGQsIHRoZSB3cml0ZSB3aWxsIHdyYXAgYXJvdW5kLgorICoKKyAqIEFuIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBnaXZlbiBpZiBhbmQgd2hlbiB0aGUgaW50ZXJydXB0CisgKiB0aHJlc2hvbGQgaXMgcmVhY2hlZCBkdXJpbmcgb3IgYWZ0ZXIgdGhlIHdyaXRlLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC1FZXJybm8uCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKiBidWZmZXI6IHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIHNpemU6IHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqLworZXh0ZXJuIGludCBkc193cml0ZV9idHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IGRzX3dyaXRlX3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKgorICogU2FtZSBhcyBkc193cml0ZV9idHMvcGVicywgYnV0IG9taXQgb3duZXJzaGlwIGNoZWNrcy4KKyAqCisgKiBUaGlzIGlzIG5lZWRlZCB0byBoYXZlIHNvbWUgb3RoZXIgdGFzayB0aGFuIHRoZSBvd25lciBvZiB0aGUKKyAqIEJUUy9QRUJTIGJ1ZmZlciBvciB0aGUgcGFyYW1ldGVyIHRhc2sgaXRzZWxmIHdyaXRlIGludG8gdGhlCisgKiByZXNwZWN0aXZlIGJ1ZmZlci4KKyAqLworZXh0ZXJuIGludCBkc191bmNoZWNrZWRfd3JpdGVfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworZXh0ZXJuIGludCBkc191bmNoZWNrZWRfd3JpdGVfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKy8qCisgKiBSZXNldCB0aGUgd3JpdGUgcG9pbnRlciBvZiB0aGUgQlRTL1BFQlMgYnVmZmVyLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyAtRWVycm5vIG9uIGVycm9yCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKi8KK2V4dGVybiBpbnQgZHNfcmVzZXRfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gaW50IGRzX3Jlc2V0X3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKKworLyoKKyAqIENsZWFyIHRoZSBCVFMvUEVCUyBidWZmZXIgYW5kIHJlc2V0IHRoZSB3cml0ZSBwb2ludGVyLgorICogVGhlIGVudGlyZSBidWZmZXIgd2lsbCBiZSB6ZXJvZWQgb3V0LgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyAtRWVycm5vIG9uIGVycm9yCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKi8KK2V4dGVybiBpbnQgZHNfY2xlYXJfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gaW50IGRzX2NsZWFyX3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKKworLyoKKyAqIFByb3ZpZGUgdGhlIFBFQlMgY291bnRlciByZXNldCB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzczsgLUVlcnJubyBvbiBlcnJvcgorICoKKyAqIHRhc2s6IHRoZSB0YXNrIHRvIGFjY2VzczsKKyAqICAgICAgIE5VTEwgdG8gYWNjZXNzIHRoZSBjdXJyZW50IGNwdQorICogdmFsdWUgKG91dCk6IHRoZSBjb3VudGVyIHJlc2V0IHZhbHVlCisgKi8KK2V4dGVybiBpbnQgZHNfZ2V0X3BlYnNfcmVzZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1NjQgKnZhbHVlKTsKKworLyoKKyAqIFNldCB0aGUgUEVCUyBjb3VudGVyIHJlc2V0IHZhbHVlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyAtRWVycm5vIG9uIGVycm9yCisgKgorICogdGFzazogdGhlIHRhc2sgdG8gYWNjZXNzOworICogICAgICAgTlVMTCB0byBhY2Nlc3MgdGhlIGN1cnJlbnQgY3B1CisgKiB2YWx1ZTogdGhlIG5ldyBjb3VudGVyIHJlc2V0IHZhbHVlCisgKi8KK2V4dGVybiBpbnQgZHNfc2V0X3BlYnNfcmVzZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1NjQgdmFsdWUpOworCisvKgorICogSW5pdGlhbGl6YXRpb24KKyAqLworc3RydWN0IGNwdWluZm9feDg2OworZXh0ZXJuIHZvaWQgX19jcHVpbml0IGRzX2luaXRfaW50ZWwoc3RydWN0IGNwdWluZm9feDg2ICopOworCisKKworLyoKKyAqIFRoZSBEUyBjb250ZXh0IC0gcGFydCBvZiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdC4KKyAqLworc3RydWN0IGRzX2NvbnRleHQgeworCS8qIHBvaW50ZXIgdG8gdGhlIERTIGNvbmZpZ3VyYXRpb247IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBICovCisJdW5zaWduZWQgY2hhciAqZHM7CisJLyogdGhlIG93bmVyIG9mIHRoZSBCVFMgYW5kIFBFQlMgY29uZmlndXJhdGlvbiwgcmVzcGVjdGl2ZWx5ICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpvd25lclsyXTsKKwkvKiBidWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIGZvciBCVFMgYW5kIFBFQlMgKi8KKwlkc19vdmZsX2NhbGxiYWNrX3QgY2FsbGJhY2tbMl07CisJLyogdGhlIG9yaWdpbmFsIGJ1ZmZlciBhZGRyZXNzICovCisJdm9pZCAqYnVmZmVyWzJdOworCS8qIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIHBhZ2VzIGZvciBvbi1yZXF1ZXN0IGFsbG9jYXRlZCBidWZmZXJzICovCisJdW5zaWduZWQgaW50IHBhZ2VzWzJdOworCS8qIHVzZSBjb3VudCAqLworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJLyogYSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGxvY2F0aW9uIGluc2lkZSB0aGUgdGhyZWFkX3N0cnVjdAorCSAqIG9yIHRoZSBwZXJfY3B1IGNvbnRleHQgYXJyYXkgKi8KKwlzdHJ1Y3QgZHNfY29udGV4dCAqKnRoaXM7CisJLyogYSBwb2ludGVyIHRvIHRoZSB0YXNrIG93bmluZyB0aGlzIGNvbnRleHQsIG9yIE5VTEwsIGlmIHRoZQorCSAqIGNvbnRleHQgaXMgb3duZWQgYnkgYSBjcHUgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiB9OwogCi1zdHJ1Y3QgYnRzX3N0cnVjdCB7Ci0JdTY0IHF1YWxpZmllcjsKLQl1bmlvbiB7Ci0JCS8qIEJUU19CUkFOQ0ggKi8KLQkJc3RydWN0IHsKLQkJCXU2NCBmcm9tX2lwOwotCQkJdTY0IHRvX2lwOwotCQl9IGxicjsKLQkJLyogQlRTX1RBU0tfQVJSSVZFUyBvcgotCQkgICBCVFNfVEFTS19ERVBBUlRTICovCi0JCXU2NCBqaWZmaWVzOwotCX0gdmFyaWFudDsKLX07CisvKiBjYWxsZWQgYnkgZXhpdF90aHJlYWQoKSB0byBmcmVlIGxlZnRvdmVyIGNvbnRleHRzICovCitleHRlcm4gdm9pZCBkc19mcmVlKHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0KTsKIAotLyogT3ZlcmZsb3cgaGFuZGxpbmcgbWVjaGFuaXNtcyAqLwotI2RlZmluZSBEU19PX1NJR05BTAkxIC8qIHNlbmQgb3ZlcmZsb3cgc2lnbmFsICovCi0jZGVmaW5lIERTX09fV1JBUAkyIC8qIHdyYXAgYXJvdW5kICovCisjZWxzZSAvKiBDT05GSUdfWDg2X0RTICovCiAKLWV4dGVybiBpbnQgZHNfYWxsb2NhdGUodm9pZCAqKiwgc2l6ZV90KTsKLWV4dGVybiBpbnQgZHNfZnJlZSh2b2lkICoqKTsKLWV4dGVybiBpbnQgZHNfZ2V0X2J0c19zaXplKHZvaWQgKik7Ci1leHRlcm4gaW50IGRzX2dldF9idHNfZW5kKHZvaWQgKik7Ci1leHRlcm4gaW50IGRzX2dldF9idHNfaW5kZXgodm9pZCAqKTsKLWV4dGVybiBpbnQgZHNfc2V0X292ZXJmbG93KHZvaWQgKiwgaW50KTsKLWV4dGVybiBpbnQgZHNfZ2V0X292ZXJmbG93KHZvaWQgKik7Ci1leHRlcm4gaW50IGRzX2NsZWFyKHZvaWQgKik7Ci1leHRlcm4gaW50IGRzX3JlYWRfYnRzKHZvaWQgKiwgaW50LCBzdHJ1Y3QgYnRzX3N0cnVjdCAqKTsKLWV4dGVybiBpbnQgZHNfd3JpdGVfYnRzKHZvaWQgKiwgY29uc3Qgc3RydWN0IGJ0c19zdHJ1Y3QgKik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkc19kZWJ1Z2N0bF9tYXNrKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19jcHVpbml0IGRzX2luaXRfaW50ZWwoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKKyNkZWZpbmUgZHNfaW5pdF9pbnRlbChjb25maWcpIGRvIHt9IHdoaWxlICgwKQogCi0jZW5kaWYgLyogX0FTTV9YODZfRFNfSCAqLworI2VuZGlmIC8qIENPTkZJR19YODZfRFMgKi8KKyNlbmRpZiAvKiBBU01fWDg2X19EU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZHdhcmYyLmggYi9pbmNsdWRlL2FzbS14ODYvZHdhcmYyLmgKaW5kZXggNzM4YmI5Zi4uMjFkMWJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2R3YXJmMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9kd2FyZjIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0RXQVJGMl9ICi0jZGVmaW5lIF9EV0FSRjJfSAorI2lmbmRlZiBBU01fWDg2X19EV0FSRjJfSAorI2RlZmluZSBBU01fWDg2X19EV0FSRjJfSAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI3dhcm5pbmcgImFzbS9kd2FyZjIuaCBzaG91bGQgYmUgb25seSBpbmNsdWRlZCBpbiBwdXJlIGFzc2VtYmx5IGZpbGVzIgpAQCAtNTgsNCArNTgsNCBAQAogCiAjZW5kaWYKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fRFdBUkYyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9lODIwLmggYi9pbmNsdWRlL2FzbS14ODYvZTgyMC5oCmluZGV4IDE2YTMxZTIuLjVhYmJkZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9lODIwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2U4MjAuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19BU01fRTgyMF9ICi0jZGVmaW5lIF9fQVNNX0U4MjBfSAorI2lmbmRlZiBBU01fWDg2X19FODIwX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRTgyMF9ICiAjZGVmaW5lIEU4MjBNQVAJMHgyZDAJCS8qIG91ciBtYXAgKi8KICNkZWZpbmUgRTgyME1BWAkxMjgJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIEU4MjBNQVAgKi8KIApAQCAtNDMsNiArNDMsNyBAQAogI2RlZmluZSBFODIwX1JFU0VSVkVECTIKICNkZWZpbmUgRTgyMF9BQ1BJCTMKICNkZWZpbmUgRTgyMF9OVlMJNAorI2RlZmluZSBFODIwX1VOVVNBQkxFCTUKIAogLyogcmVzZXJ2ZWQgUkFNIHVzZWQgYnkga2VybmVsIGl0c2VsZiAqLwogI2RlZmluZSBFODIwX1JFU0VSVkVEX0tFUk4gICAgICAgIDEyOApAQCAtNjQsNiArNjUsNyBAQAogZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjA7CiBleHRlcm4gc3RydWN0IGU4MjBtYXAgZTgyMF9zYXZlZDsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydDsKIGV4dGVybiBpbnQgZTgyMF9hbnlfbWFwcGVkKHU2NCBzdGFydCwgdTY0IGVuZCwgdW5zaWduZWQgdHlwZSk7CiBleHRlcm4gaW50IGU4MjBfYWxsX21hcHBlZCh1NjQgc3RhcnQsIHU2NCBlbmQsIHVuc2lnbmVkIHR5cGUpOwogZXh0ZXJuIHZvaWQgZTgyMF9hZGRfcmVnaW9uKHU2NCBzdGFydCwgdTY0IHNpemUsIGludCB0eXBlKTsKQEAgLTEyMCw2ICsxMjIsNyBAQAogZXh0ZXJuIHU2NCBlODIwX2hvbGVfc2l6ZSh1NjQgc3RhcnQsIHU2NCBlbmQpOwogZXh0ZXJuIHZvaWQgZmluaXNoX2U4MjBfcGFyc2luZyh2b2lkKTsKIGV4dGVybiB2b2lkIGU4MjBfcmVzZXJ2ZV9yZXNvdXJjZXModm9pZCk7CitleHRlcm4gdm9pZCBlODIwX3Jlc2VydmVfcmVzb3VyY2VzX2xhdGUodm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9tZW1vcnlfbWFwKHZvaWQpOwogZXh0ZXJuIGNoYXIgKmRlZmF1bHRfbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CiBleHRlcm4gY2hhciAqbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CkBAIC0xNDAsNCArMTQzLDQgQEAKICNkZWZpbmUgSElHSF9NRU1PUlkJKDEwMjQqMTAyNCkKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZiAgLyogX19BU01fRTgyMF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fRTgyMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZWRhYy5oIGIvaW5jbHVkZS9hc20teDg2L2VkYWMuaAppbmRleCBhODA4OGY2Li45NDkzYzViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZWRhYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9lZGFjLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0VEQUNfSAotI2RlZmluZSBfQVNNX1g4Nl9FREFDX0gKKyNpZm5kZWYgQVNNX1g4Nl9fRURBQ19ICisjZGVmaW5lIEFTTV9YODZfX0VEQUNfSAogCiAvKiBFQ0MgYXRvbWljLCBETUEsIFNNUCBhbmQgaW50ZXJydXB0IHNhZmUgc2NydWIgZnVuY3Rpb24gKi8KIApAQCAtMTUsNCArMTUsNCBAQAogCQlhc20gdm9sYXRpbGUoImxvY2s7IGFkZGwgJDAsICUwIjo6Im0iICgqdmlydF9hZGRyKSk7CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0VEQUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2VmaS5oIGIvaW5jbHVkZS9hc20teDg2L2VmaS5oCmluZGV4IGQ0ZjJiMGEuLmVkMmRlMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9lZmkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZWZpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0VGSV9ICi0jZGVmaW5lIF9BU01fWDg2X0VGSV9ICisjaWZuZGVmIEFTTV9YODZfX0VGSV9ICisjZGVmaW5lIEFTTV9YODZfX0VGSV9ICiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAKQEAgLTk0LDQgKzk0LDQgQEAKIGV4dGVybiB2b2lkIGVmaV9jYWxsX3BoeXNfcHJlbG9nKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWZpX2NhbGxfcGh5c19lcGlsb2codm9pZCk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0VGSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZWxmLmggYi9pbmNsdWRlL2FzbS14ODYvZWxmLmgKaW5kZXggN2JlNDczMy4uMjZiYzE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9lbGYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfRUxGX0gKLSNkZWZpbmUgX0FTTV9YODZfRUxGX0gKKyNpZm5kZWYgQVNNX1g4Nl9fRUxGX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRUxGX0gKIAogLyoKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCkBAIC0xNDgsOCArMTQ4LDkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2lhMzJfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaXAsIHUzMiBzcCkKIHsKLQlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVmcyIgOjogInIiICgwKSk7Ci0JYXNtIHZvbGF0aWxlKCJtb3ZsICUwLCUlZXM7IG1vdmwgJTAsJSVkcyIgOiA6ICJyIiAoX19VU0VSMzJfRFMpKTsKKwlsb2Fkc2VnbWVudChmcywgMCk7CisJbG9hZHNlZ21lbnQoZHMsIF9fVVNFUjMyX0RTKTsKKwlsb2Fkc2VnbWVudChlcywgX19VU0VSMzJfRFMpOwogCWxvYWRfZ3NfaW5kZXgoMCk7CiAJcmVncy0+aXAgPSBpcDsKIAlyZWdzLT5zcCA9IHNwOwpAQCAtMTg1LDcgKzE4Niw3IEBACiAJc2V0X2ZzKFVTRVJfRFMpOwkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIENPTVBBVF9TRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQkJXAorI2RlZmluZSBDT01QQVRfU0VUX1BFUlNPTkFMSVRZKGV4KQkJCVwKIGRvIHsJCQkJCQkJXAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSkJCQlcCiAJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9BQklfUEVORElORyk7CVwKQEAgLTI2Niw3ICsyNjcsNyBAQAogICAgRm9yIHRoZSBtb21lbnQsIHdlIGhhdmUgb25seSBvcHRpbWl6YXRpb25zIGZvciB0aGUgSW50ZWwgZ2VuZXJhdGlvbnMsCiAgICBidXQgdGhhdCBjb3VsZCBjaGFuZ2UuLi4gKi8KIAotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHlfNjRiaXQoKQorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eV82NGJpdCgpCiAKIC8qCiAgKiBBbiBleGVjdXRhYmxlIGZvciB3aGljaCBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMoKSByZXR1cm5zIFRSVUUgd2lsbApAQCAtMzMyLDQgKzMzMyw0IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZW1lcmdlbmN5LXJlc3RhcnQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9lbWVyZ2VuY3ktcmVzdGFydC5oCmluZGV4IDhlNmFlZjEuLjE5MGQwZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9lbWVyZ2VuY3ktcmVzdGFydC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9lbWVyZ2VuY3ktcmVzdGFydC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0VNRVJHRU5DWV9SRVNUQVJUX0gKLSNkZWZpbmUgX0FTTV9FTUVSR0VOQ1lfUkVTVEFSVF9ICisjaWZuZGVmIEFTTV9YODZfX0VNRVJHRU5DWV9SRVNUQVJUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fRU1FUkdFTkNZX1JFU1RBUlRfSAogCiBlbnVtIHJlYm9vdF90eXBlIHsKIAlCT09UX1RSSVBMRSA9ICd0JywKQEAgLTE1LDQgKzE1LDQgQEAKIAogZXh0ZXJuIHZvaWQgbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydCh2b2lkKTsKIAotI2VuZGlmIC8qIF9BU01fRU1FUkdFTkNZX1JFU1RBUlRfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0VNRVJHRU5DWV9SRVNUQVJUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9lczcwMDAvYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2L2VzNzAwMC9hcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlNTBjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9lczcwMDAvYXBpYy5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9fQVNNX0VTNzAwMF9BUElDX0gKKyNkZWZpbmUgX19BU01fRVM3MDAwX0FQSUNfSAorCisjZGVmaW5lIHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpIHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgY3B1KQorI2RlZmluZSBlc3JfZGlzYWJsZSAoMSkKKworc3RhdGljIGlubGluZSBpbnQgYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCit7CisJICAgICAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQoreworI2lmIGRlZmluZWQgQ09ORklHX0VTNzAwMF9DTFVTVEVSRURfQVBJQworCXJldHVybiBDUFVfTUFTS19BTEw7CisjZWxzZQorCXJldHVybiBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworI2VuZGlmCit9CisjZGVmaW5lIFRBUkdFVF9DUFVTCSh0YXJnZXRfY3B1cygpKQorCisjaWYgZGVmaW5lZCBDT05GSUdfRVM3MDAwX0NMVVNURVJFRF9BUElDCisjZGVmaW5lIEFQSUNfREZSX1ZBTFVFCQkoQVBJQ19ERlJfQ0xVU1RFUikKKyNkZWZpbmUgSU5UX0RFTElWRVJZX01PREUJKGRlc3RfTG93ZXN0UHJpbykKKyNkZWZpbmUgSU5UX0RFU1RfTU9ERQkJKDEpICAgIC8qIGxvZ2ljYWwgZGVsaXZlcnkgYnJvYWRjYXN0IHRvIGFsbCBwcm9jcyAqLworI2RlZmluZSBOT19CQUxBTkNFX0lSUQkJKDEpCisjdW5kZWYgIFdBS0VfU0VDT05EQVJZX1ZJQV9JTklUCisjZGVmaW5lIFdBS0VfU0VDT05EQVJZX1ZJQV9NSVAKKyNlbHNlCisjZGVmaW5lIEFQSUNfREZSX1ZBTFVFCQkoQVBJQ19ERlJfRkxBVCkKKyNkZWZpbmUgSU5UX0RFTElWRVJZX01PREUJKGRlc3RfRml4ZWQpCisjZGVmaW5lIElOVF9ERVNUX01PREUJCSgwKSAgICAvKiBwaHlzIGRlbGl2ZXJ5IHRvIHRhcmdldCBwcm9jcyAqLworI2RlZmluZSBOT19CQUxBTkNFX0lSUQkJKDApCisjdW5kZWYgIEFQSUNfREVTVF9MT0dJQ0FMCisjZGVmaW5lIEFQSUNfREVTVF9MT0dJQ0FMCTB4MAorI2RlZmluZSBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190IGJpdG1hcCwgaW50IGFwaWNpZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQoreworCXJldHVybiBwaHlzaWRfaXNzZXQoYml0LCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Cit9CisKKyNkZWZpbmUgYXBpY2lkX2NsdXN0ZXIoYXBpY2lkKSAoYXBpY2lkICYgMHhGMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9sZHIoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCWlkID0geGFwaWNfcGh5c190b19sb2dfYXBpY2lkKGNwdSk7CisJcmV0dXJuIChTRVRfQVBJQ19MT0dJQ0FMX0lEKGlkKSk7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gSUQuCisgKgorICogSW50ZWwgcmVjb21tZW5kcyB0byBzZXQgREZSLCBMZFIgYW5kIFRQUiBiZWZvcmUgZW5hYmxpbmcKKyAqIGFuIEFQSUMuICBTZWUgZS5nLiAiQVAtMzg4IDgyNDg5RFggVXNlcidzIE1hbnVhbCIgKEludGVsCisgKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hcGljX2xkcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9WQUxVRSk7CisJdmFsID0gY2FsY3VsYXRlX2xkcihjcHUpOworCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Cit9CisKKyNpZm5kZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAorZXh0ZXJuIHZvaWQgZW5hYmxlX2FwaWNfbW9kZSh2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gaW50IGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKK3sKKwlpbnQgYXBpYyA9IHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcmludGsoIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiAgVXNpbmcgJWQgSS9PIEFQSUNzLCB0YXJnZXQgY3B1cyAlbHhcbiIsCisJCShhcGljX3ZlcnNpb25bYXBpY10gPT0gMHgxNCkgPworCQkiUGh5c2ljYWwgQ2x1c3RlciIgOiAiTG9naWNhbCBDbHVzdGVyIiwgbnJfaW9hcGljcywgY3B1c19hZGRyKFRBUkdFVF9DUFVTKVswXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG11bHRpX3RpbWVyX2NoZWNrKGludCBhcGljLCBpbnQgaXJxKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGljaWRfdG9fbm9kZShpbnQgbG9naWNhbF9hcGljaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQoreworCWlmICghbXBzX2NwdSkKKwkJcmV0dXJuIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKKwllbHNlIGlmIChtcHNfY3B1IDwgTlJfQ1BVUykKKwkJcmV0dXJuIChpbnQpIHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgbXBzX2NwdSk7CisJZWxzZQorCQlyZXR1cm4gQkFEX0FQSUNJRDsKK30KKworc3RhdGljIGlubGluZSBwaHlzaWRfbWFza190IGFwaWNpZF90b19jcHVfcHJlc2VudChpbnQgcGh5c19hcGljaWQpCit7CisJc3RhdGljIGludCBpZCA9IDA7CisJcGh5c2lkX21hc2tfdCBtYXNrOworCW1hc2sgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoaWQpOworCSsraWQ7CisJcmV0dXJuIG1hc2s7Cit9CisKK2V4dGVybiB1OCBjcHVfMl9sb2dpY2FsX2FwaWNpZFtdOworLyogTWFwcGluZyBmcm9tIGNwdSBudW1iZXIgdG8gbG9naWNhbCBhcGljaWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19TTVAKKyAgICAgICBpZiAoY3B1ID49IE5SX0NQVVMpCisJICAgICAgIHJldHVybiBCQURfQVBJQ0lEOworICAgICAgIHJldHVybiAoaW50KWNwdV8yX2xvZ2ljYWxfYXBpY2lkW2NwdV07CisjZWxzZQorCXJldHVybiBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHBoeXNpZF9tYXNrX3QgaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNpZF9tYXNrX3QgcGh5c19tYXApCit7CisJLyogRm9yIGNsdXN0ZXJlZCB3ZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCisJcmV0dXJuIHBoeXNpZHNfcHJvbW90ZSgweGZmKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcG9ydGlvX3JlbWFwKHZvaWQpCit7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudChpbnQgY3B1X3BoeXNpY2FsX2FwaWNpZCkKK3sKKwlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVfbWFza190b19hcGljaWQoY3B1bWFza190IGNwdW1hc2spCit7CisJaW50IG51bV9iaXRzX3NldDsKKwlpbnQgY3B1c19mb3VuZCA9IDA7CisJaW50IGNwdTsKKwlpbnQgYXBpY2lkOworCisJbnVtX2JpdHNfc2V0ID0gY3B1c193ZWlnaHQoY3B1bWFzayk7CisJLyogUmV0dXJuIGlkIHRvIGFsbCAqLworCWlmIChudW1fYml0c19zZXQgPT0gTlJfQ1BVUykKKyNpZiBkZWZpbmVkIENPTkZJR19FUzcwMDBfQ0xVU1RFUkVEX0FQSUMKKwkJcmV0dXJuIDB4RkY7CisjZWxzZQorCQlyZXR1cm4gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKDApOworI2VuZGlmCisJLyoKKwkgKiBUaGUgY3B1cyBpbiB0aGUgbWFzayBtdXN0IGFsbCBiZSBvbiB0aGUgYXBpYyBjbHVzdGVyLiAgSWYgYXJlIG5vdAorCSAqIG9uIHRoZSBzYW1lIGFwaWNpZCBjbHVzdGVyIHJldHVybiBkZWZhdWx0IHZhbHVlIG9mIFRBUkdFVF9DUFVTLgorCSAqLworCWNwdSA9IGZpcnN0X2NwdShjcHVtYXNrKTsKKwlhcGljaWQgPSBjcHVfdG9fbG9naWNhbF9hcGljaWQoY3B1KTsKKwl3aGlsZSAoY3B1c19mb3VuZCA8IG51bV9iaXRzX3NldCkgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1bWFzaykpIHsKKwkJCWludCBuZXdfYXBpY2lkID0gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7CisJCQlpZiAoYXBpY2lkX2NsdXN0ZXIoYXBpY2lkKSAhPQorCQkJCQlhcGljaWRfY2x1c3RlcihuZXdfYXBpY2lkKSl7CisJCQkJcHJpbnRrICgiJXM6IE5vdCBhIHZhbGlkIG1hc2shXG4iLCBfX2Z1bmNfXyk7CisjaWYgZGVmaW5lZCBDT05GSUdfRVM3MDAwX0NMVVNURVJFRF9BUElDCisJCQkJcmV0dXJuIDB4RkY7CisjZWxzZQorCQkJCXJldHVybiBjcHVfdG9fbG9naWNhbF9hcGljaWQoMCk7CisjZW5kaWYKKwkJCX0KKwkJCWFwaWNpZCA9IG5ld19hcGljaWQ7CisJCQljcHVzX2ZvdW5kKys7CisJCX0KKwkJY3B1Kys7CisJfQorCXJldHVybiBhcGljaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBoeXNfcGtnX2lkKHUzMiBjcHVpZF9hcGljLCBpbnQgaW5kZXhfbXNiKQoreworCXJldHVybiBjcHVpZF9hcGljID4+IGluZGV4X21zYjsKK30KKworI2VuZGlmIC8qIF9fQVNNX0VTNzAwMF9BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9lczcwMDAvYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L2VzNzAwMC9hcGljZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyMzRhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9lczcwMDAvYXBpY2RlZi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19BU01fRVM3MDAwX0FQSUNERUZfSAorI2RlZmluZSBfX0FTTV9FUzcwMDBfQVBJQ0RFRl9ICisKKyNkZWZpbmUJCUFQSUNfSURfTUFTSwkJKDB4RkY8PDI0KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlyZXR1cm4gKCgoeCk+PjI0KSYweEZGKTsKK30KKworI2RlZmluZQkJR0VUX0FQSUNfSUQoeCkJZ2V0X2FwaWNfaWQoeCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZXM3MDAwL2lwaS5oIGIvaW5jbHVkZS9hc20teDg2L2VzNzAwMC9pcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJhOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L2VzNzAwMC9pcGkuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9fQVNNX0VTNzAwMF9JUElfSAorI2RlZmluZSBfX0FTTV9FUzcwMDBfSVBJX0gKKwordm9pZCBzZW5kX0lQSV9tYXNrX3NlcXVlbmNlKGNwdW1hc2tfdCBtYXNrLCBpbnQgdmVjdG9yKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX21hc2soY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpCit7CisJc2VuZF9JUElfbWFza19zZXF1ZW5jZShtYXNrLCB2ZWN0b3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQoreworCWNwdW1hc2tfdCBtYXNrID0gY3B1X29ubGluZV9tYXA7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgbWFzayk7CisJaWYgKCFjcHVzX2VtcHR5KG1hc2spKQorCQlzZW5kX0lQSV9tYXNrKG1hc2ssIHZlY3Rvcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKK3sKKwlzZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFwLCB2ZWN0b3IpOworfQorCisjZW5kaWYgLyogX19BU01fRVM3MDAwX0lQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZXM3MDAwL21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9lczcwMDAvbXBwYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNWEzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvZXM3MDAwL21wcGFyc2UuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9fQVNNX0VTNzAwMF9NUFBBUlNFX0gKKyNkZWZpbmUgX19BU01fRVM3MDAwX01QUEFSU0VfSAorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCitleHRlcm4gaW50IHBhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0cik7CitleHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKTsKK2V4dGVybiB2b2lkIHVubWFwX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nIG9lbV9hZGRyKTsKK2V4dGVybiB2b2lkIHNldHVwX3VuaXN5cyh2b2lkKTsKKworI2lmbmRlZiBDT05GSUdfWDg2X0dFTkVSSUNBUkNICitleHRlcm4gaW50IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpOworZXh0ZXJuIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAorCQkJCWNoYXIgKnByb2R1Y3RpZCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ1BJCisKK3N0YXRpYyBpbmxpbmUgaW50IGVzNzAwMF9jaGVja19kc2R0KHZvaWQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX0RTRFQsIDAsICZoZWFkZXIpKSAmJgorCSAgICAhc3RybmNtcChoZWFkZXIub2VtX2lkLCAiVU5JU1lTIiwgNikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9NQUNIX01QUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2VzNzAwMC93YWtlY3B1LmggYi9pbmNsdWRlL2FzbS14ODYvZXM3MDAwL3dha2VjcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZjNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L2VzNzAwMC93YWtlY3B1LmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBfX0FTTV9FUzcwMDBfV0FLRUNQVV9ICisjZGVmaW5lIF9fQVNNX0VTNzAwMF9XQUtFQ1BVX0gKKworLyoKKyAqIFRoaXMgZmlsZSBjb3BlcyB3aXRoIG1hY2hpbmVzIHRoYXQgd2FrZXVwIHNlY29uZGFyeSBDUFVzIGJ5IHRoZQorICogSU5JVCwgSU5JVCwgU1RBUlRVUCBzZXF1ZW5jZS4KKyAqLworCisjaWZkZWYgQ09ORklHX0VTNzAwMF9DTFVTVEVSRURfQVBJQworI2RlZmluZSBXQUtFX1NFQ09OREFSWV9WSUFfTUlQCisjZWxzZQorI2RlZmluZSBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAorI2VuZGlmCisKKyNpZmRlZiBXQUtFX1NFQ09OREFSWV9WSUFfTUlQCitleHRlcm4gaW50IGVzNzAwMF9zdGFydF9jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApOworc3RhdGljIGlubGluZSBpbnQKK3dha2V1cF9zZWNvbmRhcnlfY3B1KGludCBwaHlzX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9laXApCit7CisJaW50IGJvb3RfZXJyb3IgPSAwOworCWJvb3RfZXJyb3IgPSBlczcwMDBfc3RhcnRfY3B1KHBoeXNfYXBpY2lkLCBzdGFydF9laXApOworCXJldHVybiBib290X2Vycm9yOworfQorI2VuZGlmCisKKyNkZWZpbmUgVFJBTVBPTElORV9MT1cgcGh5c190b192aXJ0KDB4NDY3KQorI2RlZmluZSBUUkFNUE9MSU5FX0hJR0ggcGh5c190b192aXJ0KDB4NDY5KQorCisjZGVmaW5lIGJvb3RfY3B1X2FwaWNpZCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKKworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2luaXRfZGVhc3NlcnQoYXRvbWljX3QgKmRlYXNzZXJ0KQoreworI2lmZGVmIFdBS0VfU0VDT05EQVJZX1ZJQV9JTklUCisJd2hpbGUgKCFhdG9taWNfcmVhZChkZWFzc2VydCkpCisJCWNwdV9yZWxheCgpOworI2VuZGlmCisJcmV0dXJuOworfQorCisvKiBOb3RoaW5nIHRvIGRvIGZvciBtb3N0IHBsYXRmb3Jtcywgc2luY2UgY2xlYXJlZCBieSB0aGUgSU5JVCBjeWNsZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYyh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfTk1JX3ZlY3Rvcih1bnNpZ25lZCBzaG9ydCAqaGlnaCwgdW5zaWduZWQgc2hvcnQgKmxvdykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfTk1JX3ZlY3Rvcih1bnNpZ25lZCBzaG9ydCAqaGlnaCwgdW5zaWduZWQgc2hvcnQgKmxvdykKK3sKK30KKworI2lmIEFQSUNfREVCVUcKKyAjZGVmaW5lIGlucXVpcmVfcmVtb3RlX2FwaWMoYXBpY2lkKSBfX2lucXVpcmVfcmVtb3RlX2FwaWMoYXBpY2lkKQorI2Vsc2UKKyAjZGVmaW5lIGlucXVpcmVfcmVtb3RlX2FwaWMoYXBpY2lkKSB7fQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9NQUNIX1dBS0VDUFVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2ZiLmggYi9pbmNsdWRlL2FzbS14ODYvZmIuaAppbmRleCA1MzAxODQ2Li5hY2EzOGRiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2ZiLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2ZiLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0ZCX0gKLSNkZWZpbmUgX0FTTV9YODZfRkJfSAorI2lmbmRlZiBBU01fWDg2X19GQl9ICisjZGVmaW5lIEFTTV9YODZfX0ZCX0gKIAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTE4LDQgKzE4LDQgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9BU01fWDg2X0ZCX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19GQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZml4bWFwLmggYi9pbmNsdWRlL2FzbS14ODYvZml4bWFwLmgKaW5kZXggNDRkNGY4Mi4uNzhlMzNhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2ZpeG1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXAuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9GSVhNQVBfSAotI2RlZmluZSBfQVNNX0ZJWE1BUF9ICisjaWZuZGVmIEFTTV9YODZfX0ZJWE1BUF9ICisjZGVmaW5lIEFTTV9YODZfX0ZJWE1BUF9ICiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGluY2x1ZGUgImZpeG1hcF8zMi5oIgpAQCAtNjUsNCArNjUsNCBAQAogCUJVR19PTih2YWRkciA+PSBGSVhBRERSX1RPUCB8fCB2YWRkciA8IEZJWEFERFJfU1RBUlQpOwogCXJldHVybiBfX3ZpcnRfdG9fZml4KHZhZGRyKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0ZJWE1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzMyLmgKaW5kZXggZjFhYzJiMi4uODg0NDAwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2ZpeG1hcF8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfMzIuaApAQCAtMTAsOCArMTAsOCBAQAogICogU3VwcG9ydCBvZiBCSUdNRU0gYWRkZWQgYnkgR2VyaGFyZCBXaWNoZXJ0LCBTaWVtZW5zIEFHLCBKdWx5IDE5OTkKICAqLwogCi0jaWZuZGVmIF9BU01fRklYTUFQXzMyX0gKLSNkZWZpbmUgX0FTTV9GSVhNQVBfMzJfSAorI2lmbmRlZiBBU01fWDg2X19GSVhNQVBfMzJfSAorI2RlZmluZSBBU01fWDg2X19GSVhNQVBfMzJfSAogCiAKIC8qIHVzZWQgYnkgdm1hbGxvYy5jLCB2c3lzY2FsbC5sZHMuUy4KQEAgLTk0LDEwICs5NCwxMCBAQAogCSAqIGNhbiBoYXZlIGEgc2luZ2xlIHBnZCBlbnRyeSBhbmQgYSBzaW5nbGUgcHRlIHRhYmxlOgogCSAqLwogI2RlZmluZSBOUl9GSVhfQlRNQVBTCQk2NAotI2RlZmluZSBGSVhfQlRNQVBTX05FU1RJTkcJNAorI2RlZmluZSBGSVhfQlRNQVBTX1NMT1RTCTQKIAlGSVhfQlRNQVBfRU5EID0gX19lbmRfb2ZfcGVybWFuZW50X2ZpeGVkX2FkZHJlc3NlcyArIDI1NiAtCiAJCQkoX19lbmRfb2ZfcGVybWFuZW50X2ZpeGVkX2FkZHJlc3NlcyAmIDI1NSksCi0JRklYX0JUTUFQX0JFR0lOID0gRklYX0JUTUFQX0VORCArIE5SX0ZJWF9CVE1BUFMqRklYX0JUTUFQU19ORVNUSU5HIC0gMSwKKwlGSVhfQlRNQVBfQkVHSU4gPSBGSVhfQlRNQVBfRU5EICsgTlJfRklYX0JUTUFQUypGSVhfQlRNQVBTX1NMT1RTIC0gMSwKIAlGSVhfV1BfVEVTVCwKICNpZmRlZiBDT05GSUdfQUNQSQogCUZJWF9BQ1BJX0JFR0lOLApAQCAtMTIwLDQgKzEyMCw0IEBACiAjZGVmaW5lIEZJWEFERFJfQk9PVF9TVEFSVAkoRklYQUREUl9UT1AgLSBfX0ZJWEFERFJfQk9PVF9TSVpFKQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fRklYTUFQXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9maXhtYXBfNjQuaAppbmRleCAwMGYzZDc0Li5kYWI0NzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZml4bWFwXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2ZpeG1hcF82NC5oCkBAIC04LDggKzgsOCBAQAogICogQ29weXJpZ2h0IChDKSAxOTk4IEluZ28gTW9sbmFyCiAgKi8KIAotI2lmbmRlZiBfQVNNX0ZJWE1BUF82NF9ICi0jZGVmaW5lIF9BU01fRklYTUFQXzY0X0gKKyNpZm5kZWYgQVNNX1g4Nl9fRklYTUFQXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fRklYTUFQXzY0X0gKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CkBAIC00OSw2ICs0OSw3IEBACiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAJRklYX1BBUkFWSVJUX0JPT1RNQVAsCiAjZW5kaWYKKwlfX2VuZF9vZl9wZXJtYW5lbnRfZml4ZWRfYWRkcmVzc2VzLAogI2lmZGVmIENPTkZJR19BQ1BJCiAJRklYX0FDUElfQkVHSU4sCiAJRklYX0FDUElfRU5EID0gRklYX0FDUElfQkVHSU4gKyBGSVhfQUNQSV9QQUdFUyAtIDEsCkBAIC01NiwxOSArNTcsMTggQEAKICNpZmRlZiBDT05GSUdfUFJPVklERV9PSENJMTM5NF9ETUFfSU5JVAogCUZJWF9PSENJMTM5NF9CQVNFLAogI2VuZGlmCi0JX19lbmRfb2ZfcGVybWFuZW50X2ZpeGVkX2FkZHJlc3NlcywKIAkvKgogCSAqIDI1NiB0ZW1wb3JhcnkgYm9vdC10aW1lIG1hcHBpbmdzLCB1c2VkIGJ5IGVhcmx5X2lvcmVtYXAoKSwKIAkgKiBiZWZvcmUgaW9yZW1hcCgpIGlzIGZ1bmN0aW9uYWwuCiAJICoKLQkgKiBXZSByb3VuZCBpdCB1cCB0byB0aGUgbmV4dCA1MTIgcGFnZXMgYm91bmRhcnkgc28gdGhhdCB3ZQorCSAqIFdlIHJvdW5kIGl0IHVwIHRvIHRoZSBuZXh0IDI1NiBwYWdlcyBib3VuZGFyeSBzbyB0aGF0IHdlCiAJICogY2FuIGhhdmUgYSBzaW5nbGUgcGdkIGVudHJ5IGFuZCBhIHNpbmdsZSBwdGUgdGFibGU6CiAJICovCiAjZGVmaW5lIE5SX0ZJWF9CVE1BUFMJCTY0Ci0jZGVmaW5lIEZJWF9CVE1BUFNfTkVTVElORwk0Ci0JRklYX0JUTUFQX0VORCA9IF9fZW5kX29mX3Blcm1hbmVudF9maXhlZF9hZGRyZXNzZXMgKyA1MTIgLQotCQkJKF9fZW5kX29mX3Blcm1hbmVudF9maXhlZF9hZGRyZXNzZXMgJiA1MTEpLAotCUZJWF9CVE1BUF9CRUdJTiA9IEZJWF9CVE1BUF9FTkQgKyBOUl9GSVhfQlRNQVBTKkZJWF9CVE1BUFNfTkVTVElORyAtIDEsCisjZGVmaW5lIEZJWF9CVE1BUFNfU0xPVFMJNAorCUZJWF9CVE1BUF9FTkQgPSBfX2VuZF9vZl9wZXJtYW5lbnRfZml4ZWRfYWRkcmVzc2VzICsgMjU2IC0KKwkJCShfX2VuZF9vZl9wZXJtYW5lbnRfZml4ZWRfYWRkcmVzc2VzICYgMjU1KSwKKwlGSVhfQlRNQVBfQkVHSU4gPSBGSVhfQlRNQVBfRU5EICsgTlJfRklYX0JUTUFQUypGSVhfQlRNQVBTX1NMT1RTIC0gMSwKIAlfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMKIH07CiAKQEAgLTgwLDQgKzgwLDQgQEAKICNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUCSgodW5zaWduZWQgbG9uZylWU1lTQ0FMTDMyX1ZTWVNDQUxMKQogI2RlZmluZSBGSVhBRERSX1VTRVJfRU5ECShGSVhBRERSX1VTRVJfU1RBUlQgKyBQQUdFX1NJWkUpCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0ZJWE1BUF82NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS14ODYvZmxvcHB5LmgKaW5kZXggZGJlODJhNS4uN2Q4M2EzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9mbG9wcHkuaApAQCAtNyw4ICs3LDggQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUKICAqLwotI2lmbmRlZiBfQVNNX1g4Nl9GTE9QUFlfSAotI2RlZmluZSBfQVNNX1g4Nl9GTE9QUFlfSAorI2lmbmRlZiBBU01fWDg2X19GTE9QUFlfSAorI2RlZmluZSBBU01fWDg2X19GTE9QUFlfSAogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCkBAIC0yNzgsNCArMjc4LDQgQEAKIAogI2RlZmluZSBFWFRSQV9GTE9QUFlfUEFSQU1TCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9GTE9QUFlfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0ZMT1BQWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZnRyYWNlLmggYi9pbmNsdWRlL2FzbS14ODYvZnRyYWNlLmgKaW5kZXggNWM2OGIzMi4uYmUwZTAwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9mdHJhY2UuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfRlRSQUNFCi0jZGVmaW5lIF9BU01fWDg2X0ZUUkFDRQorI2lmbmRlZiBBU01fWDg2X19GVFJBQ0VfSAorI2RlZmluZSBBU01fWDg2X19GVFJBQ0VfSAogCiAjaWZkZWYgQ09ORklHX0ZUUkFDRQogI2RlZmluZSBNQ09VTlRfQUREUgkJKChsb25nKShtY291bnQpKQpAQCAtMTEsNCArMTEsNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX0ZUUkFDRSAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfRlRSQUNFICovCisjZW5kaWYgLyogQVNNX1g4Nl9fRlRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9mdXRleC5oIGIvaW5jbHVkZS9hc20teDg2L2Z1dGV4LmgKaW5kZXggZTdhNzZiMy4uMDZiOTI0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2Z1dGV4LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9YODZfRlVURVhfSAorI2lmbmRlZiBBU01fWDg2X19GVVRFWF9ICisjZGVmaW5lIEFTTV9YODZfX0ZVVEVYX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjUsNyArMjUsNyBAQAogCWFzbSB2b2xhdGlsZSgiMTpcdG1vdmwJJTIsICUwXG4iCQkJXAogCQkgICAgICJcdG1vdmxcdCUwLCAlM1xuIgkJCQlcCiAJCSAgICAgIlx0IiBpbnNuICJcbiIJCQkJXAotCQkgICAgICIyOlx0bG9jazsgY21weGNoZ2wgJTMsICUyXG4iCQlcCisJCSAgICAgIjI6XHQiIExPQ0tfUFJFRklYICJjbXB4Y2hnbCAlMywgJTJcbiIJXAogCQkgICAgICJcdGpuelx0MWJcbiIJCQkJXAogCQkgICAgICIzOlx0LnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAogCQkgICAgICI0Olx0bW92XHQlNSwgJTFcbiIJCQlcCkBAIC02NCw3ICs2NCw3IEBACiAJCV9fZnV0ZXhfYXRvbWljX29wMSgieGNoZ2wgJTAsICUyIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfQUREOgotCQlfX2Z1dGV4X2F0b21pY19vcDEoImxvY2s7IHhhZGRsICUwLCAlMiIsIHJldCwgb2xkdmFsLAorCQlfX2Z1dGV4X2F0b21pY19vcDEoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMiIsIHJldCwgb2xkdmFsLAogCQkJCSAgIHVhZGRyLCBvcGFyZyk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfT1I6CkBAIC0xMjIsNyArMTIyLDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JYXNtIHZvbGF0aWxlKCIxOlx0bG9jazsgY21weGNoZ2wgJTMsICUxXG4iCisJYXNtIHZvbGF0aWxlKCIxOlx0IiBMT0NLX1BSRUZJWCAiY21weGNoZ2wgJTMsICUxXG4iCiAJCSAgICAgIjI6XHQuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIgogCQkgICAgICIzOlx0bW92ICAgICAlMiwgJTBcbiIKIAkJICAgICAiXHRqbXAgICAgIDJiXG4iCkBAIC0xMzcsNCArMTM3LDQgQEAKIH0KIAogI2VuZGlmCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19GVVRFWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZ2FydC5oIGIvaW5jbHVkZS9hc20teDg2L2dhcnQuaAppbmRleCAzZjYyYTgzLi42MDVlZGIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZ2FydC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9nYXJ0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2NjRfR0FSVF9ICi0jZGVmaW5lIF9BU01fWDg2NjRfR0FSVF9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fR0FSVF9ICisjZGVmaW5lIEFTTV9YODZfX0dBUlRfSAogCiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KIApAQCAtMjksNiArMjksOCBAQAogI2RlZmluZSBBTUQ2NF9HQVJUQ0FDSEVDVEwJMHg5YwogI2RlZmluZSBBTUQ2NF9HQVJURU4JCSgxPDwwKQogCitleHRlcm4gaW50IGFncF9hbWQ2NF9pbml0KHZvaWQpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2dhcnRfdHJhbnNsYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldiwgdTY0IGFkZHIpCiB7CiAJdTMyIHRtcCwgY3RsOwpAQCAtNTIsMTUgKzU0LDE1IEBACiAJCXJldHVybiAwOwogCiAJaWYgKGFwZXJfYmFzZSArIGFwZXJfc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXBlcnR1cmUgYmV5b25kIDRHQi4gSWdub3JpbmcuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBlcnR1cmUgYmV5b25kIDRHQi4gSWdub3JpbmcuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChlODIwX2FueV9tYXBwZWQoYXBlcl9iYXNlLCBhcGVyX2Jhc2UgKyBhcGVyX3NpemUsIEU4MjBfUkFNKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFwZXJ0dXJlIHBvaW50aW5nIHRvIGU4MjAgUkFNLiBJZ25vcmluZy5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJBcGVydHVyZSBwb2ludGluZyB0byBlODIwIFJBTS4gSWdub3JpbmcuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChhcGVyX3NpemUgPCBtaW5fc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIgIkFwZXJ0dXJlIHRvbyBzbWFsbCAoJWQgTUIpIHRoYW4gKCVkIE1CKVxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBlcnR1cmUgdG9vIHNtYWxsICglZCBNQikgdGhhbiAoJWQgTUIpXG4iLAogCQkJCSBhcGVyX3NpemU+PjIwLCBtaW5fc2l6ZT4+MjApOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02OCw0ICs3MCw0IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0dBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2dlbmFwaWNfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9nZW5hcGljXzMyLmgKaW5kZXggNzU0ZDYzNS4uMzQyODBmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2dlbmFwaWNfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZ2VuYXBpY18zMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0dFTkFQSUNfSAotI2RlZmluZSBfQVNNX0dFTkFQSUNfSCAxCisjaWZuZGVmIEFTTV9YODZfX0dFTkFQSUNfMzJfSAorI2RlZmluZSBBU01fWDg2X19HRU5BUElDXzMyX0gKIAogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KIApAQCAtMTIxLDQgKzEyMSw0IEBACiAjZGVmaW5lIHV2X3N5c3RlbV9pbml0KCkJCWRvIHt9IHdoaWxlICgwKQogCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0dFTkFQSUNfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2dlbmFwaWNfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9nZW5hcGljXzY0LmgKaW5kZXggYTQ3ZDYzMS4uZWQ2YTQ4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2dlbmFwaWNfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZ2VuYXBpY182NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0dFTkFQSUNfSAotI2RlZmluZSBfQVNNX0dFTkFQSUNfSCAxCisjaWZuZGVmIEFTTV9YODZfX0dFTkFQSUNfNjRfSAorI2RlZmluZSBBU01fWDg2X19HRU5BUElDXzY0X0gKIAogLyoKICAqIENvcHlyaWdodCAyMDA0IEphbWVzIENsZXZlcmRvbiwgSUJNLgpAQCAtMTQsNiArMTQsNyBAQAogCiBzdHJ1Y3QgZ2VuYXBpYyB7CiAJY2hhciAqbmFtZTsKKwlpbnQgKCphY3BpX21hZHRfb2VtX2NoZWNrKShjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCk7CiAJdTMyIGludF9kZWxpdmVyeV9tb2RlOwogCXUzMiBpbnRfZGVzdF9tb2RlOwogCWludCAoKmFwaWNfaWRfcmVnaXN0ZXJlZCkodm9pZCk7CkBAIC0yNCwxNyArMjUsMjQgQEAKIAl2b2lkICgqc2VuZF9JUElfbWFzaykoY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpOwogCXZvaWQgKCpzZW5kX0lQSV9hbGxidXRzZWxmKShpbnQgdmVjdG9yKTsKIAl2b2lkICgqc2VuZF9JUElfYWxsKShpbnQgdmVjdG9yKTsKKwl2b2lkICgqc2VuZF9JUElfc2VsZikoaW50IHZlY3Rvcik7CiAJLyogKi8KIAl1bnNpZ25lZCBpbnQgKCpjcHVfbWFza190b19hcGljaWQpKGNwdW1hc2tfdCBjcHVtYXNrKTsKIAl1bnNpZ25lZCBpbnQgKCpwaHlzX3BrZ19pZCkoaW50IGluZGV4X21zYik7CisJdW5zaWduZWQgaW50ICgqZ2V0X2FwaWNfaWQpKHVuc2lnbmVkIGxvbmcgeCk7CisJdW5zaWduZWQgbG9uZyAoKnNldF9hcGljX2lkKSh1bnNpZ25lZCBpbnQgaWQpOworCXVuc2lnbmVkIGxvbmcgYXBpY19pZF9tYXNrOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBnZW5hcGljICpnZW5hcGljOwogCiBleHRlcm4gc3RydWN0IGdlbmFwaWMgYXBpY19mbGF0OwogZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfcGh5c2ZsYXQ7CitleHRlcm4gc3RydWN0IGdlbmFwaWMgYXBpY194MmFwaWNfY2x1c3RlcjsKK2V4dGVybiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX3gyYXBpY19waHlzOwogZXh0ZXJuIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKiwgY2hhciAqKTsKIAorZXh0ZXJuIHZvaWQgYXBpY19zZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpOwogZW51bSB1dl9zeXN0ZW1fdHlwZSB7VVZfTk9ORSwgVVZfTEVHQUNZX0FQSUMsIFVWX1gyQVBJQywgVVZfTk9OX1VOSVFVRV9BUElDfTsKIGV4dGVybiBlbnVtIHV2X3N5c3RlbV90eXBlIGdldF91dl9zeXN0ZW1fdHlwZSh2b2lkKTsKIGV4dGVybiBpbnQgaXNfdXZfc3lzdGVtKHZvaWQpOwpAQCAtNDcsNCArNTUsNCBAQAogCiBleHRlcm4gdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0dFTkFQSUNfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2dlb2RlLmggYi9pbmNsdWRlL2FzbS14ODYvZ2VvZGUuaAppbmRleCAyYzFjZGEwLi4zZjM0NDRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZ2VvZGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZ2VvZGUuaApAQCAtNyw4ICs3LDggQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpZm5kZWYgX0FTTV9HRU9ERV9IXwotI2RlZmluZSBfQVNNX0dFT0RFX0hfCisjaWZuZGVmIEFTTV9YODZfX0dFT0RFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fR0VPREVfSAogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0yNTAsNCArMjUwLDQgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG1mZ3B0X3RpbWVyX3NldHVwKHZvaWQpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19HRU9ERV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvZ3Bpby5oIGIvaW5jbHVkZS9hc20teDg2L2dwaW8uaAppbmRleCBjNGM5MWIzLi40OTdmYjk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9ncGlvLmgKQEAgLTUzLDQgKzUzLDQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19HUElPTElCICovCiAKLSNlbmRpZiAvKiBfQVNNX0kzODZfR1BJT19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fR1BJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaGFyZGlycV8zMi5oIGIvaW5jbHVkZS9hc20teDg2L2hhcmRpcnFfMzIuaAppbmRleCA0Zjg1ZjBmLi43MDBmZTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaGFyZGlycV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9oYXJkaXJxXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0hBUkRJUlFfSAotI2RlZmluZSBfX0FTTV9IQVJESVJRX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSEFSRElSUV8zMl9ICisjZGVmaW5lIEFTTV9YODZfX0hBUkRJUlFfMzJfSAogCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpAQCAtMjUsNCArMjUsNCBAQAogdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpbmNsdWRlIDxsaW51eC9pcnFfY3B1c3RhdC5oPgogCi0jZW5kaWYgLyogX19BU01fSEFSRElSUV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSEFSRElSUV8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaGFyZGlycV82NC5oIGIvaW5jbHVkZS9hc20teDg2L2hhcmRpcnFfNjQuaAppbmRleCA5NWQ1ZTA5Li5mOGJkMjkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaGFyZGlycV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9oYXJkaXJxXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0hBUkRJUlFfSAotI2RlZmluZSBfX0FTTV9IQVJESVJRX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSEFSRElSUV82NF9ICisjZGVmaW5lIEFTTV9YODZfX0hBUkRJUlFfNjRfSAogCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpAQCAtMjAsNCArMjAsNCBAQAogCiBleHRlcm4gdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIAotI2VuZGlmIC8qIF9fQVNNX0hBUkRJUlFfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0hBUkRJUlFfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2hpZ2htZW0uaCBiL2luY2x1ZGUvYXNtLXg4Ni9oaWdobWVtLmgKaW5kZXggNDUxNGIxNi4uYmMzZjZhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaGlnaG1lbS5oCkBAIC0xNSw4ICsxNSw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CiAgKi8KIAotI2lmbmRlZiBfQVNNX0hJR0hNRU1fSAotI2RlZmluZSBfQVNNX0hJR0hNRU1fSAorI2lmbmRlZiBBU01fWDg2X19ISUdITUVNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSElHSE1FTV9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTc5LDQgKzc5LDQgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmIC8qIF9BU01fSElHSE1FTV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSElHSE1FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaHBldC5oIGIvaW5jbHVkZS9hc20teDg2L2hwZXQuaAppbmRleCA4MmYxYWM2Li5jYmJiYjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaHBldC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9ocGV0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIEFTTV9YODZfSFBFVF9ICi0jZGVmaW5lIEFTTV9YODZfSFBFVF9ICisjaWZuZGVmIEFTTV9YODZfX0hQRVRfSAorI2RlZmluZSBBU01fWDg2X19IUEVUX0gKIAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCiAKQEAgLTkwLDQgKzkwLDQgQEAKICNkZWZpbmUgaHBldF9yZWFkbChhKSAwCiAKICNlbmRpZgotI2VuZGlmIC8qIEFTTV9YODZfSFBFVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSFBFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaHVnZXRsYi5oIGIvaW5jbHVkZS9hc20teDg2L2h1Z2V0bGIuaAppbmRleCA0MzlhOWFjLi4wYjdlYzVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9odWdldGxiLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0hVR0VUTEJfSAotI2RlZmluZSBfQVNNX1g4Nl9IVUdFVExCX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSFVHRVRMQl9ICisjZGVmaW5lIEFTTV9YODZfX0hVR0VUTEJfSAogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApAQCAtOTAsNCArOTAsNCBAQAogewogfQogCi0jZW5kaWYgLyogX0FTTV9YODZfSFVHRVRMQl9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSFVHRVRMQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS14ODYvaHdfaXJxLmgKaW5kZXggZWRkMGI5NS4uNTBmNmUwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9od19pcnEuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9IV19JUlFfSAotI2RlZmluZSBfQVNNX0hXX0lSUV9ICisjaWZuZGVmIEFTTV9YODZfX0hXX0lSUV9ICisjZGVmaW5lIEFTTV9YODZfX0hXX0lSUV9ICiAKIC8qCiAgKiAoQykgMTk5MiwgMTk5MyBMaW51cyBUb3J2YWxkcywgKEMpIDE5OTcgSW5nbyBNb2xuYXIKQEAgLTY0LDcgKzY0LDYgQEAKIGV4dGVybiB2b2lkIGluaXRfVklTV1NfQVBJQ19pcnFzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0dXBfSU9fQVBJQyh2b2lkKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfSU9fQVBJQyh2b2lkKTsKLWV4dGVybiB2b2lkIHByaW50X0lPX0FQSUModm9pZCk7CiBleHRlcm4gaW50IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGludCBidXMsIGludCBzbG90LCBpbnQgZm4pOwogZXh0ZXJuIHZvaWQgc2V0dXBfaW9hcGljX2Rlc3Qodm9pZCk7CiAKQEAgLTczLDcgKzcyLDkgQEAKICNlbmRpZgogCiAvKiBJUEkgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogZXh0ZXJuIHZvaWQgc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKTsKKyNlbmRpZgogZXh0ZXJuIHZvaWQgc2VuZF9JUEkoaW50IGRlc3QsIGludCB2ZWN0b3IpOwogCiAvKiBTdGF0aXN0aWNzICovCkBAIC05Myw2ICs5NCwyNiBAQAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBxaWNfZW5hYmxlX2lycV9pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHFpY19jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCh2b2lkKTsKIAorLyogU01QICovCitleHRlcm4gdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorZXh0ZXJuIHZvaWQgc21wX3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHNtcF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CisjZWxzZQorZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzbXBfZXJyb3JfaW50ZXJydXB0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl9TTVAKK2V4dGVybiB2b2lkIHNtcF9yZXNjaGVkdWxlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorZXh0ZXJuIHZvaWQgc21wX2ludmFsaWRhdGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOworI2Vsc2UKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc21wX2ludmFsaWRhdGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOworI2VuZGlmCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19YODZfMzIKIGV4dGVybiB2b2lkICgqY29uc3QgaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKTsKICNlbHNlCkBAIC0xMTIsNCArMTMzLDQgQEAKIAogI2VuZGlmIC8qICFBU1NFTUJMWV8gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fSFdfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9oeXBlcnRyYW5zcG9ydC5oIGIvaW5jbHVkZS9hc20teDg2L2h5cGVydHJhbnNwb3J0LmgKaW5kZXggZDJiYmQyMy4uY2MwMTFhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2h5cGVydHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2h5cGVydHJhbnNwb3J0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIEFTTV9IWVBFUlRSQU5TUE9SVF9ICi0jZGVmaW5lIEFTTV9IWVBFUlRSQU5TUE9SVF9ICisjaWZuZGVmIEFTTV9YODZfX0hZUEVSVFJBTlNQT1JUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSFlQRVJUUkFOU1BPUlRfSAogCiAvKgogICogQ29uc3RhbnRzIGZvciB4ODYgSHlwZXJ0cmFuc3BvcnQgSW50ZXJydXB0cy4KQEAgLTQyLDQgKzQyLDQgQEAKICNkZWZpbmUgSFRfSVJRX0hJR0hfREVTVF9JRCh2KQkJCQkJCVwKIAkoKCgodikgPj4gOCkgPDwgSFRfSVJRX0hJR0hfREVTVF9JRF9TSElGVCkgJiBIVF9JUlFfSElHSF9ERVNUX0lEX01BU0spCiAKLSNlbmRpZiAvKiBBU01fSFlQRVJUUkFOU1BPUlRfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0hZUEVSVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pMzg3LmggYi9pbmNsdWRlL2FzbS14ODYvaTM4Ny5oCmluZGV4IDU2ZDAwZTMuLjliYTg2MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pMzg3LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2kzODcuaApAQCAtNyw4ICs3LDggQEAKICAqIHg4Ni02NCB3b3JrIGJ5IEFuZGkgS2xlZW4gMjAwMgogICovCiAKLSNpZm5kZWYgX0FTTV9YODZfSTM4N19ICi0jZGVmaW5lIF9BU01fWDg2X0kzODdfSAorI2lmbmRlZiBBU01fWDg2X19JMzg3X0gKKyNkZWZpbmUgQVNNX1g4Nl9fSTM4N19ICiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CkBAIC0xOSwyMyArMTksMzIgQEAKICNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91c2VyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20veHNhdmUuaD4KIAorZXh0ZXJuIHVuc2lnbmVkIGludCBzaWdfeHN0YXRlX3NpemU7CiBleHRlcm4gdm9pZCBmcHVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG14Y3NyX2ZlYXR1cmVfbWFza19pbml0KHZvaWQpOwogZXh0ZXJuIGludCBpbml0X2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF90aHJlYWRfeHN0YXRlKHZvaWQpOworZXh0ZXJuIGludCBkdW1wX2ZwdShzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCAqKTsKIAogZXh0ZXJuIHVzZXJfcmVnc2V0X2FjdGl2ZV9mbiBmcHJlZ3NfYWN0aXZlLCB4ZnByZWdzX2FjdGl2ZTsKIGV4dGVybiB1c2VyX3JlZ3NldF9nZXRfZm4gZnByZWdzX2dldCwgeGZwcmVnc19nZXQsIGZwcmVnc19zb2Z0X2dldDsKIGV4dGVybiB1c2VyX3JlZ3NldF9zZXRfZm4gZnByZWdzX3NldCwgeGZwcmVnc19zZXQsIGZwcmVnc19zb2Z0X3NldDsKIAorZXh0ZXJuIHN0cnVjdCBfZnB4X3N3X2J5dGVzIGZ4X3N3X3Jlc2VydmVkOwogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgorZXh0ZXJuIHVuc2lnbmVkIGludCBzaWdfeHN0YXRlX2lhMzJfc2l6ZTsKK2V4dGVybiBzdHJ1Y3QgX2ZweF9zd19ieXRlcyBmeF9zd19yZXNlcnZlZF9pYTMyOwogc3RydWN0IF9mcHN0YXRlX2lhMzI7Ci1leHRlcm4gaW50IHNhdmVfaTM4N19pYTMyKHN0cnVjdCBfZnBzdGF0ZV9pYTMyIF9fdXNlciAqYnVmKTsKLWV4dGVybiBpbnQgcmVzdG9yZV9pMzg3X2lhMzIoc3RydWN0IF9mcHN0YXRlX2lhMzIgX191c2VyICpidWYpOworc3RydWN0IF94c3RhdGVfaWEzMjsKK2V4dGVybiBpbnQgc2F2ZV9pMzg3X3hzdGF0ZV9pYTMyKHZvaWQgX191c2VyICpidWYpOworZXh0ZXJuIGludCByZXN0b3JlX2kzODdfeHN0YXRlX2lhMzIodm9pZCBfX3VzZXIgKmJ1Zik7CiAjZW5kaWYKIAorI2RlZmluZSBYODdfRlNXX0VTICgxIDw8IDcpCS8qIEV4Y2VwdGlvbiBTdW1tYXJ5ICovCisKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAKIC8qIElnbm9yZSBkZWxheWVkIGV4Y2VwdGlvbnMgZnJvbSB1c2VyIHNwYWNlICovCkBAIC00Niw3ICs1NSw3IEBACiAJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAyYikpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2ZwdV9jaGVja2luZyhzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeCkKK3N0YXRpYyBpbmxpbmUgaW50IGZ4cnN0b3JfY2hlY2tpbmcoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCAqZngpCiB7CiAJaW50IGVycjsKIApAQCAtNjYsMTUgKzc1LDMxIEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2RlZmluZSBYODdfRlNXX0VTICgxIDw8IDcpCS8qIEV4Y2VwdGlvbiBTdW1tYXJ5ICovCitzdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2ZwdV9jaGVja2luZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkKKwkJcmV0dXJuIHhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT54c2F2ZSk7CisJZWxzZQorCQlyZXR1cm4gZnhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmUpOworfQogCiAvKiBBTUQgQ1BVcyBkb24ndCBzYXZlL3Jlc3RvcmUgRkRQL0ZJUC9GT1AgdW5sZXNzIGFuIGV4Y2VwdGlvbgogICAgaXMgcGVuZGluZy4gQ2xlYXIgdGhlIHg4NyBzdGF0ZSBoZXJlIGJ5IHNldHRpbmcgaXQgdG8gZml4ZWQKICAgIHZhbHVlcy4gVGhlIGtlcm5lbCBkYXRhIHNlZ21lbnQgY2FuIGJlIHNvbWV0aW1lcyAwIGFuZCBzb21ldGltZXMKICAgIG5ldyB1c2VyIHZhbHVlLiBCb3RoIHNob3VsZCBiZSBvay4KICAgIFVzZSB0aGUgUERBIGFzIHNhZmUgYWRkcmVzcyBiZWNhdXNlIGl0IHNob3VsZCBiZSBhbHJlYWR5IGluIEwxLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2ZwdV9zdGF0ZShzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9mcHVfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CisJc3RydWN0IHhzYXZlX3N0cnVjdCAqeHN0YXRlID0gJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmU7CisJc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCAqZnggPSAmdHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmU7CisKKwkvKgorCSAqIHhzYXZlIGhlYWRlciBtYXkgaW5kaWNhdGUgdGhlIGluaXQgc3RhdGUgb2YgdGhlIEZQLgorCSAqLworCWlmICgodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkgJiYKKwkgICAgISh4c3RhdGUtPnhzYXZlX2hkci54c3RhdGVfYnYgJiBYU1RBVEVfRlApKQorCQlyZXR1cm47CisKIAlpZiAodW5saWtlbHkoZngtPnN3ZCAmIFg4N19GU1dfRVMpKQogCQlhc20gdm9sYXRpbGUoImZuY2xleCIpOwogCWFsdGVybmF0aXZlX2lucHV0KEFTTV9OT1A4IEFTTV9OT1AyLApAQCAtODMsNyArMTA4LDcgQEAKIAkJCSAgWDg2X0ZFQVRVUkVfRlhTQVZFX0xFQUspOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzYXZlX2kzODdfY2hlY2tpbmcoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCBfX3VzZXIgKmZ4KQorc3RhdGljIGlubGluZSBpbnQgZnhzYXZlX3VzZXIoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCBfX3VzZXIgKmZ4KQogewogCWludCBlcnI7CiAKQEAgLTEwNyw3ICsxMzIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3NhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitzdGF0aWMgaW5saW5lIHZvaWQgZnhzYXZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCS8qIFVzaW5nICJyZXg2NDsgZnhzYXZlICUwIiBpcyBicm9rZW4gYmVjYXVzZSwgaWYgdGhlIG1lbW9yeSBvcGVyYW5kCiAJICAgdXNlcyBhbnkgZXh0ZW5kZWQgcmVnaXN0ZXJzIGZvciBhZGRyZXNzaW5nLCBhIHNlY29uZCBSRVggcHJlZml4CkBAIC0xMzIsNyArMTU3LDE2IEBACiAJCQkgICAgIDogIj1tIiAodHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmUpCiAJCQkgICAgIDogImNkYVNEYiIgKCZ0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSkpOwogI2VuZGlmCi0JY2xlYXJfZnB1X3N0YXRlKCZ0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfWFNBVkUpCisJCXhzYXZlKHRzayk7CisJZWxzZQorCQlmeHNhdmUodHNrKTsKKworCWNsZWFyX2ZwdV9zdGF0ZSh0c2spOwogCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICY9IH5UU19VU0VERlBVOwogfQogCkBAIC0xNDcsNiArMTgxLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKKwlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkgeworCQl4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUpOworCQlyZXR1cm47CisJfQogCS8qCiAJICogVGhlICJub3AiIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBpbnN0cnVjdGlvbnMgdGhlIHNhbWUKIAkgKiBsZW5ndGguCkBAIC0xNzIsNiArMjEwLDI3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfWFNBVkUpIHsKKwkJc3RydWN0IHhzYXZlX3N0cnVjdCAqeHN0YXRlID0gJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmU7CisJCXN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4ID0gJnRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlOworCisJCXhzYXZlKHRzayk7CisKKwkJLyoKKwkJICogeHNhdmUgaGVhZGVyIG1heSBpbmRpY2F0ZSB0aGUgaW5pdCBzdGF0ZSBvZiB0aGUgRlAuCisJCSAqLworCQlpZiAoISh4c3RhdGUtPnhzYXZlX2hkci54c3RhdGVfYnYgJiBYU1RBVEVfRlApKQorCQkJZ290byBlbmQ7CisKKwkJaWYgKHVubGlrZWx5KGZ4LT5zd2QgJiBYODdfRlNXX0VTKSkKKwkJCWFzbSB2b2xhdGlsZSgiZm5jbGV4Iik7CisKKwkJLyoKKwkJICogd2UgY2FuIGRvIGEgc2ltcGxlIHJldHVybiBoZXJlIG9yIGJlIHBhcmFub2lkIDopCisJCSAqLworCQlnb3RvIGNsZWFyX3N0YXRlOworCX0KKwogCS8qIFVzZSBtb3JlIG5vcHMgdGhhbiBzdHJpY3RseSBuZWVkZWQgaW4gY2FzZSB0aGUgY29tcGlsZXIKIAkgICB2YXJpZXMgY29kZSAqLwogCWFsdGVybmF0aXZlX2lucHV0KApAQCAtMTgxLDYgKzI0MCw3IEBACiAJCVg4Nl9GRUFUVVJFX0ZYU1IsCiAJCVtmeF0gIm0iICh0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSksCiAJCVtmc3ddICJtIiAodHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmUuc3dkKSA6ICJtZW1vcnkiKTsKK2NsZWFyX3N0YXRlOgogCS8qIEFNRCBLNy9LOCBDUFVzIGRvbid0IHNhdmUvcmVzdG9yZSBGRFAvRklQL0ZPUCB1bmxlc3MgYW4gZXhjZXB0aW9uCiAJICAgaXMgcGVuZGluZy4gIENsZWFyIHRoZSB4ODcgc3RhdGUgaGVyZSBieSBzZXR0aW5nIGl0IHRvIGZpeGVkCiAJICAgdmFsdWVzLiBzYWZlX2FkZHJlc3MgaXMgYSByYW5kb20gdmFyaWFibGUgdGhhdCBzaG91bGQgYmUgaW4gTDEgKi8KQEAgLTE5MCwxNiArMjUwLDE3IEBACiAJCSJmaWxkbCAlW2FkZHJdIiwgCS8qIHNldCBGP1AgdG8gZGVmaW5lZCB2YWx1ZSAqLwogCQlYODZfRkVBVFVSRV9GWFNBVkVfTEVBSywKIAkJW2FkZHJdICJtIiAoc2FmZV9hZGRyZXNzKSk7CitlbmQ6CiAJdGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJj0gflRTX1VTRURGUFU7CiB9CiAKKyNlbmRpZgkvKiBDT05GSUdfWDg2XzY0ICovCisKIC8qCiAgKiBTaWduYWwgZnJhbWUgaGFuZGxlcnMuLi4KICAqLwotZXh0ZXJuIGludCBzYXZlX2kzODcoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmKTsKLWV4dGVybiBpbnQgcmVzdG9yZV9pMzg3KHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1Zik7Ci0KLSNlbmRpZgkvKiBDT05GSUdfWDg2XzY0ICovCitleHRlcm4gaW50IHNhdmVfaTM4N194c3RhdGUodm9pZCBfX3VzZXIgKmJ1Zik7CitleHRlcm4gaW50IHJlc3RvcmVfaTM4N194c3RhdGUodm9pZCBfX3VzZXIgKmJ1Zik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VubGF6eV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CkBAIC0zMzYsNCArMzk3LDQgQEAKIAl9CiB9CiAKLSNlbmRpZgkvKiBfQVNNX1g4Nl9JMzg3X0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19JMzg3X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pODI1My5oIGIvaW5jbHVkZS9hc20teDg2L2k4MjUzLmgKaW5kZXggYjUxYzA0OC4uMTVhNWI1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2k4MjUzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2k4MjUzLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0k4MjUzX0hfXwotI2RlZmluZSBfX0FTTV9JODI1M19IX18KKyNpZm5kZWYgQVNNX1g4Nl9fSTgyNTNfSAorI2RlZmluZSBBU01fWDg2X19JODI1M19ICiAKIC8qIGk4MjUzQSBQSVQgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFBJVF9NT0RFCQkweDQzCkBAIC0xNSw0ICsxNSw0IEBACiAjZGVmaW5lIGluYl9waXQJCWluYl9wCiAjZGVmaW5lIG91dGJfcGl0CW91dGJfcAogCi0jZW5kaWYJLyogX19BU01fSTgyNTNfSF9fICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSTgyNTNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2k4MjU5LmggYi9pbmNsdWRlL2FzbS14ODYvaTgyNTkuaAppbmRleCAyZjk4ZGY5Li4yM2MxYjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaTgyNTkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaTgyNTkuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19BU01fSTgyNTlfSF9fCi0jZGVmaW5lIF9fQVNNX0k4MjU5X0hfXworI2lmbmRlZiBBU01fWDg2X19JODI1OV9ICisjZGVmaW5lIEFTTV9YODZfX0k4MjU5X0gKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKQEAgLTU3LDQgKzU3LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBpODI1OUFfY2hpcDsKIAotI2VuZGlmCS8qIF9fQVNNX0k4MjU5X0hfXyAqLworZXh0ZXJuIHZvaWQgbWFza184MjU5QSh2b2lkKTsKK2V4dGVybiB2b2lkIHVubWFza184MjU5QSh2b2lkKTsKKworI2VuZGlmIC8qIEFTTV9YODZfX0k4MjU5X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pYTMyLmggYi9pbmNsdWRlL2FzbS14ODYvaWEzMi5oCmluZGV4IDU1ZDNhYmUuLmY5MzJmN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pYTMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lhMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfNjRfSUEzMl9ICi0jZGVmaW5lIF9BU01fWDg2XzY0X0lBMzJfSAorI2lmbmRlZiBBU01fWDg2X19JQTMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSUEzMl9ICiAKIAogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgpAQCAtMTY3LDQgKzE2Nyw0IEBACiAKICNlbmRpZiAvKiAhQ09ORklHX0lBMzJfU1VQUE9SVCAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19JQTMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pYTMyX3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teDg2L2lhMzJfdW5pc3RkLmgKaW5kZXggNjFjZWE5ZS4uZGJkODg3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lhMzJfdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lhMzJfdW5pc3RkLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2XzY0X0lBMzJfVU5JU1REX0hfCi0jZGVmaW5lIF9BU01fWDg2XzY0X0lBMzJfVU5JU1REX0hfCisjaWZuZGVmIEFTTV9YODZfX0lBMzJfVU5JU1REX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSUEzMl9VTklTVERfSAogCiAvKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzIG9mIHRoZSBpYTMyIHBvcnQsCkBAIC0xNSw0ICsxNSw0IEBACiAjZGVmaW5lIF9fTlJfaWEzMl9zaWdyZXR1cm4JMTE5CiAjZGVmaW5lIF9fTlJfaWEzMl9ydF9zaWdyZXR1cm4JMTczCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl82NF9JQTMyX1VOSVNURF9IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX0lBMzJfVU5JU1REX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pZGxlLmggYi9pbmNsdWRlL2FzbS14ODYvaWRsZS5oCmluZGV4IGQyNDBlNWIuLmJhYTNmNzgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaWRsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pZGxlLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2XzY0X0lETEVfSAotI2RlZmluZSBfQVNNX1g4Nl82NF9JRExFX0ggMQorI2lmbmRlZiBBU01fWDg2X19JRExFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSURMRV9ICiAKICNkZWZpbmUgSURMRV9TVEFSVCAxCiAjZGVmaW5lIElETEVfRU5EIDIKQEAgLTEwLDQgKzEwLDYgQEAKIHZvaWQgZW50ZXJfaWRsZSh2b2lkKTsKIHZvaWQgZXhpdF9pZGxlKHZvaWQpOwogCi0jZW5kaWYKK3ZvaWQgYzFlX3JlbW92ZV9jcHUoaW50IGNwdSk7CisKKyNlbmRpZiAvKiBBU01fWDg2X19JRExFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pbnRlbF9hcmNoX3BlcmZtb24uaCBiL2luY2x1ZGUvYXNtLXg4Ni9pbnRlbF9hcmNoX3BlcmZtb24uaAppbmRleCBmYTBmZDA2Li4wN2MwM2M2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaW50ZWxfYXJjaF9wZXJmbW9uLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2ludGVsX2FyY2hfcGVyZm1vbi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSAotI2RlZmluZSBfQVNNX1g4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSAorI2lmbmRlZiBBU01fWDg2X19JTlRFTF9BUkNIX1BFUkZNT05fSAorI2RlZmluZSBBU01fWDg2X19JTlRFTF9BUkNIX1BFUkZNT05fSAogCiAjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAJCTB4YzEKICNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMQkJMHhjMgpAQCAtMjgsNCArMjgsNCBAQAogCXVuc2lnbmVkIGludCBmdWxsOwogfTsKIAotI2VuZGlmIC8qIF9BU01fWDg2X0lOVEVMX0FSQ0hfUEVSRk1PTl9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSU5URUxfQVJDSF9QRVJGTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pby5oIGIvaW5jbHVkZS9hc20teDg2L2lvLmgKaW5kZXggMGY5NTRkYy4uYTIzM2Y4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lvLmgKQEAgLTEsMjQgKzEsMTAgQEAKLSNpZm5kZWYgX0FTTV9YODZfSU9fSAotI2RlZmluZSBfQVNNX1g4Nl9JT19ICisjaWZuZGVmIEFTTV9YODZfX0lPX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSU9fSAogCiAjZGVmaW5lIEFSQ0hfSEFTX0lPUkVNQVBfV0MKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKLS8qCi0gKiBlYXJseV9pb3JlbWFwKCkgYW5kIGVhcmx5X2lvdW5tYXAoKSBhcmUgZm9yIHRlbXBvcmFyeSBlYXJseSBib290LXRpbWUKLSAqIG1hcHBpbmdzLCBiZWZvcmUgdGhlIHJlYWwgaW9yZW1hcCgpIGlzIGZ1bmN0aW9uYWwuCi0gKiBBIGJvb3QtdGltZSBtYXBwaW5nIGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvIGF0IG1vc3QgMTYgcGFnZXMuCi0gKi8KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCBlYXJseV9pb3JlbWFwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBlYXJseV9pb3JlbWFwX2NsZWFyKHZvaWQpOwotZXh0ZXJuIHZvaWQgZWFybHlfaW9yZW1hcF9yZXNldCh2b2lkKTsKLWV4dGVybiB2b2lkICplYXJseV9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgZWFybHlfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqZml4X2lvcmVtYXAodW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMpOwotI2VuZGlmCi0KICNkZWZpbmUgYnVpbGRfbW1pb19yZWFkKG5hbWUsIHNpemUsIHR5cGUsIHJlZywgYmFycmllcikgXAogc3RhdGljIGlubGluZSB0eXBlIG5hbWUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSBcCiB7IHR5cGUgcmV0OyBhc20gdm9sYXRpbGUoIm1vdiIgc2l6ZSAiICUxLCUwIjpyZWcgKHJldCkgXApAQCAtNzMsNiArNTksOCBAQAogI2RlZmluZSB3cml0ZXEgd3JpdGVxCiAjZW5kaWYKIAorZXh0ZXJuIGludCBpb21tdV9iaW9fbWVyZ2U7CisKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGluY2x1ZGUgImlvXzMyLmgiCiAjZWxzZQpAQCAtOTUsOCArODMsOSBAQAogZXh0ZXJuIHZvaWQgZWFybHlfaW9yZW1hcF9jbGVhcih2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2lvcmVtYXBfcmVzZXQodm9pZCk7CiBleHRlcm4gdm9pZCAqZWFybHlfaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkICplYXJseV9tZW1yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGVhcmx5X2lvdW5tYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIF9faW9tZW0gKmZpeF9pb3JlbWFwKHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbG9uZyBwaHlzKTsKIAogCi0jZW5kaWYgLyogX0FTTV9YODZfSU9fSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pb18zMi5oIGIvaW5jbHVkZS9hc20teDg2L2lvXzMyLmgKaW5kZXggZTg3NmQ4OS4uNGY3ZDg3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lvXzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lvXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fSU9fSAotI2RlZmluZSBfQVNNX0lPX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSU9fMzJfSAorI2RlZmluZSBBU01fWDg2X19JT18zMl9ICiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtMjgxLDQgKzI4MSw0IEBACiBCVUlMRElPKHcsIHcsIHNob3J0KQogQlVJTERJTyhsLCAsIGludCkKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fSU9fMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2lvXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvaW9fNjQuaAppbmRleCAyMjk5NWM1Li5lZTZlMDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaW9fNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaW9fNjQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9JT19ICi0jZGVmaW5lIF9BU01fSU9fSAorI2lmbmRlZiBBU01fWDg2X19JT182NF9ICisjZGVmaW5lIEFTTV9YODZfX0lPXzY0X0gKIAogCiAvKgpAQCAtMTY1LDkgKzE2NSw2IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb21hcC5oPgogCi1leHRlcm4gdm9pZCAqZWFybHlfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gdm9pZCBlYXJseV9pb3VubWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KIC8qCiAgKiBUaGlzIG9uZSBtYXBzIGhpZ2ggYWRkcmVzcyBkZXZpY2UgbWVtb3J5IGFuZCB0dXJucyBvZmYgY2FjaGluZyBmb3IgdGhhdCBhcmVhLgogICogaXQncyB1c2VmdWwgaWYgc29tZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgaW4gc3VjaCBhbiBhcmVhIGFuZCB3cml0ZSBjb21iaW5pbmcKQEAgLTIzNSw3ICsyMzIsNiBAQAogCiAjZGVmaW5lIGZsdXNoX3dyaXRlX2J1ZmZlcnMoKQogCi1leHRlcm4gaW50IGlvbW11X2Jpb19tZXJnZTsKICNkZWZpbmUgQklPX1ZNRVJHRV9CT1VOREFSWSBpb21tdV9iaW9fbWVyZ2UKIAogLyoKQEAgLTI0NSw0ICsyNDEsNCBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19JT182NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaW9fYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2L2lvX2FwaWMuaAppbmRleCAxNGY4MmJiLi44ZWM2OGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaW9fYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pb19hcGljLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0lPX0FQSUNfSAotI2RlZmluZSBfX0FTTV9JT19BUElDX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSU9fQVBJQ19ICisjZGVmaW5lIEFTTV9YODZfX0lPX0FQSUNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CkBAIC0xMDcsNiArMTA3LDIwIEBACiAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCitzdHJ1Y3QgSVJfSU9fQVBJQ19yb3V0ZV9lbnRyeSB7CisJX191NjQJdmVjdG9yCQk6IDgsCisJCXplcm8JCTogMywKKwkJaW5kZXgyCQk6IDEsCisJCWRlbGl2ZXJ5X3N0YXR1cyA6IDEsCisJCXBvbGFyaXR5CTogMSwKKwkJaXJyCQk6IDEsCisJCXRyaWdnZXIJCTogMSwKKwkJbWFzawkJOiAxLAorCQlyZXNlcnZlZAk6IDMxLAorCQlmb3JtYXQJCTogMSwKKwkJaW5kZXgJCTogMTU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCiAvKgpAQCAtMTgzLDEwICsxOTcsMTYgQEAKIGV4dGVybiBpbnQgKCppb2FwaWNfcmVudW1iZXJfaXJxKShpbnQgaW9hcGljLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIGlvYXBpY19pbml0X21hcHBpbmdzKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorZXh0ZXJuIGludCBzYXZlX21hc2tfSU9fQVBJQ19zZXR1cCh2b2lkKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfSU9fQVBJQ19zZXR1cCh2b2lkKTsKK2V4dGVybiB2b2lkIHJlaW5pdF9pbnRyX3JlbWFwcGVkX0lPX0FQSUMoaW50KTsKKyNlbmRpZgorCiAjZWxzZSAgLyogIUNPTkZJR19YODZfSU9fQVBJQyAqLwogI2RlZmluZSBpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAwCiBzdGF0aWMgY29uc3QgaW50IHRpbWVyX3Rocm91Z2hfODI1OSA9IDA7CiBzdGF0aWMgaW5saW5lIHZvaWQgaW9hcGljX2luaXRfbWFwcGluZ3Modm9pZCkgeyB9CiAjZW5kaWYKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fSU9fQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS14ODYvaW9jdGxzLmgKaW5kZXggYzBjMzM4Yi4uMDY3NTJhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pb2N0bHMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfSU9DVExTX0gKLSNkZWZpbmUgX0FTTV9YODZfSU9DVExTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSU9DVExTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSU9DVExTX0gKIAogI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgogCkBAIC01MSw5ICs1MSwxNSBAQAogI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywgMHgyQiwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywgMHgyQywgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywgMHgyRCwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUSU9DR1JTNDg1CTB4NTQyRQorI2RlZmluZSBUSU9DU1JTNDg1CTB4NTQyRgogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywgMHgzMCwgdW5zaWduZWQgaW50KQogCQkJCS8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywgMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCisjZGVmaW5lIFRDR0VUWAkJMHg1NDMyIC8qIFNZUzUgVENHRVRYIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVENTRVRYCQkweDU0MzMKKyNkZWZpbmUgVENTRVRYRgkJMHg1NDM0CisjZGVmaW5lIFRDU0VUWFcJCTB4NTQzNQogCiAjZGVmaW5lIEZJT05DTEVYCTB4NTQ1MAogI2RlZmluZSBGSU9DTEVYCQkweDU0NTEKQEAgLTg1LDQgKzkxLDQgQEAKIAogI2RlZmluZSBUSU9DU0VSX1RFTVQgICAgMHgwMQkvKiBUcmFuc21pdHRlciBwaHlzaWNhbGx5IGVtcHR5ICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0lPQ1RMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaW9tbXUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9pb21tdS5oCmluZGV4IDVmODg4Y2MuLjk2MWU3NDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pb21tdS5oCkBAIC0xLDEzICsxLDE0IEBACi0jaWZuZGVmIF9BU01fWDg2NjRfSU9NTVVfSAotI2RlZmluZSBfQVNNX1g4NjY0X0lPTU1VX0ggMQorI2lmbmRlZiBBU01fWDg2X19JT01NVV9ICisjZGVmaW5lIEFTTV9YODZfX0lPTU1VX0gKIAogZXh0ZXJuIHZvaWQgcGNpX2lvbW11X3NodXRkb3duKHZvaWQpOwogZXh0ZXJuIHZvaWQgbm9faW9tbXVfaW5pdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIG5vbW11X2RtYV9vcHM7CiBleHRlcm4gaW50IGZvcmNlX2lvbW11LCBub19pb21tdTsKIGV4dGVybiBpbnQgaW9tbXVfZGV0ZWN0ZWQ7CitleHRlcm4gaW50IGRtYXJfZGlzYWJsZWQ7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvbW11X251bV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlvbW11X25yX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwogCiAjaWZkZWYgQ09ORklHX0dBUlRfSU9NTVUKIGV4dGVybiBpbnQgZ2FydF9pb21tdV9hcGVydHVyZTsKQEAgLTQyLDQgKzQzLDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19JT01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaXBjYnVmLmggYi9pbmNsdWRlL2FzbS14ODYvaXBjYnVmLmgKaW5kZXggZWU2NzhmZC4uOTEwMzA0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lwY2J1Zi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pcGNidWYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfSVBDQlVGX0gKLSNkZWZpbmUgX0FTTV9YODZfSVBDQlVGX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSVBDQlVGX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSVBDQlVGX0gKIAogLyoKICAqIFRoZSBpcGM2NF9wZXJtIHN0cnVjdHVyZSBmb3IgeDg2IGFyY2hpdGVjdHVyZS4KQEAgLTI1LDQgKzI1LDQgQEAKIAl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CiB9OwogCi0jZW5kaWYgLyogX0FTTV9YODZfSVBDQlVGX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2lwaS5oIGIvaW5jbHVkZS9hc20teDg2L2lwaS5oCmluZGV4IGJiMWMwOWYuLjMwYTY5MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaXBpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0lQSV9ICi0jZGVmaW5lIF9fQVNNX0lQSV9ICisjaWZuZGVmIEFTTV9YODZfX0lQSV9ICisjZGVmaW5lIEFTTV9YODZfX0lQSV9ICiAKIC8qCiAgKiBDb3B5cmlnaHQgMjAwNCBKYW1lcyBDbGV2ZXJkb24sIElCTS4KQEAgLTQ5LDYgKzQ5LDEyIEBACiAJcmV0dXJuIFNFVF9BUElDX0RFU1RfRklFTEQobWFzayk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3hhcGljX3dhaXRfaWNyX2lkbGUodm9pZCkKK3sKKwl3aGlsZSAobmF0aXZlX2FwaWNfbWVtX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3NlbmRfSVBJX3Nob3J0Y3V0KHVuc2lnbmVkIGludCBzaG9ydGN1dCwgaW50IHZlY3RvciwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGRlc3QpCiB7CkBAIC02NCw3ICs3MCw3IEBACiAJLyoKIAkgKiBXYWl0IGZvciBpZGxlLgogCSAqLwotCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCV9feGFwaWNfd2FpdF9pY3JfaWRsZSgpOwogCiAJLyoKIAkgKiBObyBuZWVkIHRvIHRvdWNoIHRoZSB0YXJnZXQgY2hpcCBmaWVsZApAQCAtNzQsNyArODAsNyBAQAogCS8qCiAJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCiAJICovCi0JYXBpY193cml0ZShBUElDX0lDUiwgY2ZnKTsKKwluYXRpdmVfYXBpY19tZW1fd3JpdGUoQVBJQ19JQ1IsIGNmZyk7CiB9CiAKIC8qCkBAIC05MiwxMyArOTgsMTMgQEAKIAlpZiAodW5saWtlbHkodmVjdG9yID09IE5NSV9WRUNUT1IpKQogCQlzYWZlX2FwaWNfd2FpdF9pY3JfaWRsZSgpOwogCWVsc2UKLQkJYXBpY193YWl0X2ljcl9pZGxlKCk7CisJCV9feGFwaWNfd2FpdF9pY3JfaWRsZSgpOwogCiAJLyoKIAkgKiBwcmVwYXJlIHRhcmdldCBjaGlwIGZpZWxkCiAJICovCiAJY2ZnID0gX19wcmVwYXJlX0lDUjIobWFzayk7Ci0JYXBpY193cml0ZShBUElDX0lDUjIsIGNmZyk7CisJbmF0aXZlX2FwaWNfbWVtX3dyaXRlKEFQSUNfSUNSMiwgY2ZnKTsKIAogCS8qCiAJICogcHJvZ3JhbSB0aGUgSUNSCkBAIC0xMDgsNyArMTE0LDcgQEAKIAkvKgogCSAqIFNlbmQgdGhlIElQSS4gVGhlIHdyaXRlIHRvIEFQSUNfSUNSIGZpcmVzIHRoaXMgb2ZmLgogCSAqLwotCWFwaWNfd3JpdGUoQVBJQ19JQ1IsIGNmZyk7CisJbmF0aXZlX2FwaWNfbWVtX3dyaXRlKEFQSUNfSUNSLCBjZmcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfbWFza19zZXF1ZW5jZShjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKQEAgLTEyOSw0ICsxMzUsNCBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2VuZGlmIC8qIF9fQVNNX0lQSV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSVBJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pcnEuaCBiL2luY2x1ZGUvYXNtLXg4Ni9pcnEuaAppbmRleCAxYTI5MjU3Li4xZTVmMjkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lycS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0lSUV9ICi0jZGVmaW5lIF9BU01fSVJRX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSVJRX0gKKyNkZWZpbmUgQVNNX1g4Nl9fSVJRX0gKIC8qCiAgKgkoQykgMTk5MiwgMTk5MyBMaW51cyBUb3J2YWxkcywgKEMpIDE5OTcgSW5nbyBNb2xuYXIKICAqCkBAIC00Nyw0ICs0Nyw0IEBACiAvKiBJbnRlcnJ1cHQgdmVjdG9yIG1hbmFnZW1lbnQgKi8KIGV4dGVybiBERUNMQVJFX0JJVE1BUCh1c2VkX3ZlY3RvcnMsIE5SX1ZFQ1RPUlMpOwogCi0jZW5kaWYgLyogX0FTTV9JUlFfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvaXJxX3JlZ3NfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9pcnFfcmVnc18zMi5oCmluZGV4IDMzNjhiMjAuLjMxNmEzYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pcnFfcmVnc18zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pcnFfcmVnc18zMi5oCkBAIC00LDggKzQsOCBAQAogICoKICAqIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KICAqLwotI2lmbmRlZiBfQVNNX0kzODZfSVJRX1JFR1NfSAotI2RlZmluZSBfQVNNX0kzODZfSVJRX1JFR1NfSAorI2lmbmRlZiBBU01fWDg2X19JUlFfUkVHU18zMl9ICisjZGVmaW5lIEFTTV9YODZfX0lSUV9SRUdTXzMyX0gKIAogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KIApAQCAtMjYsNCArMjYsNCBAQAogCXJldHVybiBvbGRfcmVnczsKIH0KIAotI2VuZGlmIC8qIF9BU01fSTM4Nl9JUlFfUkVHU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSVJRX1JFR1NfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2lycV9yZW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXg4Ni9pcnFfcmVtYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyNDJjNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9pcnFfcmVtYXBwaW5nLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9BU01fSVJRX1JFTUFQUElOR19ICisjZGVmaW5lIF9BU01fSVJRX1JFTUFQUElOR19ICisKK2V4dGVybiBpbnQgeDJhcGljOworCisjZGVmaW5lIElSVEVfREVTVChkZXN0KSAoKHgyYXBpYykgPyBkZXN0IDogZGVzdCA8PCA4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9pcnFfdmVjdG9ycy5oIGIvaW5jbHVkZS9hc20teDg2L2lycV92ZWN0b3JzLmgKaW5kZXggYTQ4YzdmMi4uYzVkMmQ3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2lycV92ZWN0b3JzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2lycV92ZWN0b3JzLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fSVJRX1ZFQ1RPUlNfSAotI2RlZmluZSBfQVNNX0lSUV9WRUNUT1JTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fSVJRX1ZFQ1RPUlNfSAorI2RlZmluZSBBU01fWDg2X19JUlFfVkVDVE9SU19ICiAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAKQEAgLTE3OSw0ICsxNzksNCBAQAogI2RlZmluZSBWSUNfQ1BVX0JPT1RfRVJSQVRBX0NQSQkJKFZJQ19DUElfTEVWRUwwICsgOCkKIAogCi0jZW5kaWYgLyogX0FTTV9JUlFfVkVDVE9SU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fSVJRX1ZFQ1RPUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2lycWZsYWdzLmggYi9pbmNsdWRlL2FzbS14ODYvaXJxZmxhZ3MuaAppbmRleCA0MjRhY2I0Li4yYmRhYjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvaXJxZmxhZ3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaXJxZmxhZ3MuaApAQCAtMTY2LDI3ICsxNjYsNiBAQAogCXJldHVybiByYXdfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncyk7CiB9CiAKLS8qCi0gKiBtYWtlcyB0aGUgdHJhY2VkIGhhcmRpcnEgc3RhdGUgbWF0Y2ggd2l0aCB0aGUgbWFjaGluZSBzdGF0ZQotICoKLSAqIHNob3VsZCBiZSBhIHJhcmVseSB1c2VkIGZ1bmN0aW9uLCBvbmx5IGluIHBsYWNlcyB3aGVyZSBpdHMKLSAqIG90aGVyd2lzZSBpbXBvc3NpYmxlIHRvIGtub3cgdGhlIGlycSBzdGF0ZSwgbGlrZSBpbiB0cmFwcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX2hhcmRpcnFzX2ZpeHVwX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JaWYgKHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkKLQkJdHJhY2VfaGFyZGlycXNfb2ZmKCk7Ci0JZWxzZQotCQl0cmFjZV9oYXJkaXJxc19vbigpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfaGFyZGlycXNfZml4dXAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gX19yYXdfbG9jYWxfc2F2ZV9mbGFncygpOwotCi0JdHJhY2VfaGFyZGlycXNfZml4dXBfZmxhZ3MoZmxhZ3MpOwotfQotCiAjZWxzZQogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2lzdC5oIGIvaW5jbHVkZS9hc20teDg2L2lzdC5oCmluZGV4IDZlYzZjZWUuLjM1YTJmZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9pc3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvaXN0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fSVNUX0gKLSNkZWZpbmUgX0FTTV9JU1RfSAorI2lmbmRlZiBBU01fWDg2X19JU1RfSAorI2RlZmluZSBBU01fWDg2X19JU1RfSAogCiAvKgogICogSW5jbHVkZSBmaWxlIGZvciB0aGUgaW50ZXJmYWNlIHRvIElTVCBCSU9TCkBAIC0zMSw0ICszMSw0IEBACiBleHRlcm4gc3RydWN0IGlzdF9pbmZvIGlzdF9pbmZvOwogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwotI2VuZGlmCS8qIF9BU01fSVNUX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19JU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2s4LmggYi9pbmNsdWRlL2FzbS14ODYvazguaAppbmRleCA0NTJlMmI2Li4yYmJhZjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvazguaAorKysgYi9pbmNsdWRlL2FzbS14ODYvazguaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9LOF9ICi0jZGVmaW5lIF9BU01fSzhfSCAxCisjaWZuZGVmIEFTTV9YODZfX0s4X0gKKyNkZWZpbmUgQVNNX1g4Nl9fSzhfSAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKQEAgLTEyLDQgKzEyLDQgQEAKIGV4dGVybiB2b2lkIGs4X2ZsdXNoX2dhcnRzKHZvaWQpOwogZXh0ZXJuIGludCBrOF9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fSzhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2tkZWJ1Zy5oIGIvaW5jbHVkZS9hc20teDg2L2tkZWJ1Zy5oCmluZGV4IDk2NjUxYmIuLmZiYmFiNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS14ODYva2RlYnVnLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X0tERUJVR19ICi0jZGVmaW5lIF9BU01fWDg2X0tERUJVR19ICisjaWZuZGVmIEFTTV9YODZfX0tERUJVR19ICisjZGVmaW5lIEFTTV9YODZfX0tERUJVR19ICiAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCkBAIC0yNywxMiArMjcsMTEgQEAKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosbG9uZyk7CiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX2RpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwogZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgX19zaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqLCBpbnQgYWxsKTsKIGV4dGVybiB2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwKTsKLWV4dGVybiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKTsKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvb3BzX2JlZ2luKHZvaWQpOwogZXh0ZXJuIHZvaWQgb29wc19lbmQodW5zaWduZWQgbG9uZywgc3RydWN0IHB0X3JlZ3MgKiwgaW50IHNpZ25yKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fS0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9rZXhlYy5oIGIvaW5jbHVkZS9hc20teDg2L2tleGVjLmgKaW5kZXggNDI0NmFiNy4uZWEwOTYwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2tleGVjLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2tleGVjLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9LRVhFQ19ICi0jZGVmaW5lIF9LRVhFQ19ICisjaWZuZGVmIEFTTV9YODZfX0tFWEVDX0gKKyNkZWZpbmUgQVNNX1g4Nl9fS0VYRUNfSAogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogIyBkZWZpbmUgUEFfQ09OVFJPTF9QQUdFCTAKQEAgLTE3Miw0ICsxNzIsNCBAQAogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZiAvKiBfS0VYRUNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9rZ2RiLmggYi9pbmNsdWRlL2FzbS14ODYva2dkYi5oCmluZGV4IDQ4NGM0NzUuLmQyODM4NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9rZ2RiLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2tnZGIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9LR0RCX0hfCi0jZGVmaW5lIF9BU01fS0dEQl9IXworI2lmbmRlZiBBU01fWDg2X19LR0RCX0gKKyNkZWZpbmUgQVNNX1g4Nl9fS0dEQl9ICiAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBBbWl0IFMuIEthbGUKQEAgLTM5LDEyICszOSwxMyBAQAogCUdEQl9GUywJCQkvKiAxNCAqLwogCUdEQl9HUywJCQkvKiAxNSAqLwogfTsKKyNkZWZpbmUgTlVNUkVHQllURVMJCSgoR0RCX0dTKzEpKjQpCiAjZWxzZSAvKiAhIENPTkZJR19YODZfMzIgKi8KLWVudW0gcmVnbmFtZXMgeworZW51bSByZWduYW1lczY0IHsKIAlHREJfQVgsCQkJLyogMCAqLwotCUdEQl9EWCwJCQkvKiAxICovCisJR0RCX0JYLAkJCS8qIDEgKi8KIAlHREJfQ1gsCQkJLyogMiAqLwotCUdEQl9CWCwJCQkvKiAzICovCisJR0RCX0RYLAkJCS8qIDMgKi8KIAlHREJfU0ksCQkJLyogNCAqLwogCUdEQl9ESSwJCQkvKiA1ICovCiAJR0RCX0JQLAkJCS8qIDYgKi8KQEAgLTU4LDE4ICs1OSwxNSBAQAogCUdEQl9SMTQsCQkvKiAxNCAqLwogCUdEQl9SMTUsCQkvKiAxNSAqLwogCUdEQl9QQywJCQkvKiAxNiAqLwotCUdEQl9QUywJCQkvKiAxNyAqLwogfTsKLSNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCiAKLS8qCi0gKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcmVnaXN0ZXJzOgotICovCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotIyBkZWZpbmUgTlVNUkVHQllURVMJCTY0Ci0jZWxzZQotIyBkZWZpbmUgTlVNUkVHQllURVMJCSgoR0RCX1BTKzEpKjgpCi0jZW5kaWYKK2VudW0gcmVnbmFtZXMzMiB7CisJR0RCX1BTID0gMzQsCisJR0RCX0NTLAorCUdEQl9TUywKK307CisjZGVmaW5lIE5VTVJFR0JZVEVTCQkoKEdEQl9TUysxKSo0KQorI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfa2dkYl9icmVha3BvaW50KHZvaWQpCiB7CkBAIC03OCw0ICs3Niw0IEBACiAjZGVmaW5lIEJSRUFLX0lOU1RSX1NJWkUJMQogI2RlZmluZSBDQUNIRV9GTFVTSF9JU19TQUZFCTEKIAotI2VuZGlmCQkJCS8qIF9BU01fS0dEQl9IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX0tHREJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2ttYXBfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9rbWFwX3R5cGVzLmgKaW5kZXggNWY0MTc0MS4uODlmNDQ0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2ttYXBfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYva21hcF90eXBlcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9LTUFQX1RZUEVTX0gKLSNkZWZpbmUgX0FTTV9YODZfS01BUF9UWVBFU19ICisjaWZuZGVmIEFTTV9YODZfX0tNQVBfVFlQRVNfSAorI2RlZmluZSBBU01fWDg2X19LTUFQX1RZUEVTX0gKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfSElHSE1FTSkKICMgZGVmaW5lIEQobikgX19LTV9GRU5DRV8jI24gLApAQCAtMjYsNCArMjYsNCBAQAogCiAjdW5kZWYgRAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19LTUFQX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS14ODYva3Byb2Jlcy5oCmluZGV4IDU0OTgwYjAuLjhhMDc0OGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2twcm9iZXMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9LUFJPQkVTX0gKLSNkZWZpbmUgX0FTTV9LUFJPQkVTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fS1BST0JFU19ICisjZGVmaW5lIEFTTV9YODZfX0tQUk9CRVNfSAogLyoKICAqICBLZXJuZWwgUHJvYmVzIChLUHJvYmVzKQogICoKQEAgLTgyLDE2ICs4Miw3IEBACiAJc3RydWN0IHByZXZfa3Byb2JlIHByZXZfa3Byb2JlOwogfTsKIAotLyogdHJhcDMvMSBhcmUgaW50ciBnYXRlcyBmb3Iga3Byb2Jlcy4gIFNvLCByZXN0b3JlIHRoZSBzdGF0dXMgb2YgSUYsCi0gKiBpZiBuZWNlc3NhcnksIGJlZm9yZSBleGVjdXRpbmcgdGhlIG9yaWdpbmFsIGludDMvMSAodHJhcCkgaGFuZGxlci4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfaW50ZXJydXB0cyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpZiAocmVncy0+ZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci19Ci0KIGV4dGVybiBpbnQga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpOwogZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7Ci0jZW5kaWYJCQkJLyogX0FTTV9LUFJPQkVTX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9rdm0uaCBiL2luY2x1ZGUvYXNtLXg4Ni9rdm0uaAppbmRleCA2ZjE4NDA4Li5iYTBkZDc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYva3ZtLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2t2bS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0xJTlVYX0tWTV9YODZfSAotI2RlZmluZSBfX0xJTlVYX0tWTV9YODZfSAorI2lmbmRlZiBBU01fWDg2X19LVk1fSAorI2RlZmluZSBBU01fWDg2X19LVk1fSAogCiAvKgogICogS1ZNIHg4NiBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwpAQCAtMjA4LDI2ICsyMDgsNCBAQAogc3RydWN0IGt2bV9waXRfc3RhdGUgewogCXN0cnVjdCBrdm1fcGl0X2NoYW5uZWxfc3RhdGUgY2hhbm5lbHNbM107CiB9OwotCi0jZGVmaW5lIEtWTV9UUkNfSU5KX1ZJUlEgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwMikKLSNkZWZpbmUgS1ZNX1RSQ19SRURFTElWRVJfRVZUICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDAzKQotI2RlZmluZSBLVk1fVFJDX1BFTkRfSU5UUiAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDQpCi0jZGVmaW5lIEtWTV9UUkNfSU9fUkVBRCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNSkKLSNkZWZpbmUgS1ZNX1RSQ19JT19XUklURSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA2KQotI2RlZmluZSBLVk1fVFJDX0NSX1JFQUQgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDcpCi0jZGVmaW5lIEtWTV9UUkNfQ1JfV1JJVEUgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwOCkKLSNkZWZpbmUgS1ZNX1RSQ19EUl9SRUFEICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA5KQotI2RlZmluZSBLVk1fVFJDX0RSX1dSSVRFICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEEpCi0jZGVmaW5lIEtWTV9UUkNfTVNSX1JFQUQgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwQikKLSNkZWZpbmUgS1ZNX1RSQ19NU1JfV1JJVEUgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBDKQotI2RlZmluZSBLVk1fVFJDX0NQVUlEICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEQpCi0jZGVmaW5lIEtWTV9UUkNfSU5UUiAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwRSkKLSNkZWZpbmUgS1ZNX1RSQ19OTUkgICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBGKQotI2RlZmluZSBLVk1fVFJDX1ZNTUNBTEwgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTApCi0jZGVmaW5lIEtWTV9UUkNfSExUICAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMSkKLSNkZWZpbmUgS1ZNX1RSQ19DTFRTICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDEyKQotI2RlZmluZSBLVk1fVFJDX0xNU1cgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTMpCi0jZGVmaW5lIEtWTV9UUkNfQVBJQ19BQ0NFU1MgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxNCkKLSNkZWZpbmUgS1ZNX1RSQ19URFBfRkFVTFQgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE1KQotCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19LVk1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2t2bV9ob3N0LmggYi9pbmNsdWRlL2FzbS14ODYva3ZtX2hvc3QuaAppbmRleCBjMmUzNGMyLi40MTFmYjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYva3ZtX2hvc3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYva3ZtX2hvc3QuaApAQCAtMSw0ICsxLDQgQEAKLSMvKgorLyoKICAqIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgZHJpdmVyIGZvciBMaW51eAogICoKICAqIFRoaXMgaGVhZGVyIGRlZmluZXMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGludGVyZmFjZXMsIHg4NiB2ZXJzaW9uCkBAIC04LDggKzgsOCBAQAogICoKICAqLwogCi0jaWZuZGVmIEFTTV9LVk1fSE9TVF9ICi0jZGVmaW5lIEFTTV9LVk1fSE9TVF9ICisjaWZuZGVmIEFTTV9YODZfX0tWTV9IT1NUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fS1ZNX0hPU1RfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNTcsNiArNTcsMTAgQEAKICNkZWZpbmUgS1ZNX1BBR0VTX1BFUl9IUEFHRSAoS1ZNX0hQQUdFX1NJWkUgLyBQQUdFX1NJWkUpCiAKICNkZWZpbmUgREVfVkVDVE9SIDAKKyNkZWZpbmUgREJfVkVDVE9SIDEKKyNkZWZpbmUgQlBfVkVDVE9SIDMKKyNkZWZpbmUgT0ZfVkVDVE9SIDQKKyNkZWZpbmUgQlJfVkVDVE9SIDUKICNkZWZpbmUgVURfVkVDVE9SIDYKICNkZWZpbmUgTk1fVkVDVE9SIDcKICNkZWZpbmUgREZfVkVDVE9SIDgKQEAgLTY1LDYgKzY5LDcgQEAKICNkZWZpbmUgU1NfVkVDVE9SIDEyCiAjZGVmaW5lIEdQX1ZFQ1RPUiAxMwogI2RlZmluZSBQRl9WRUNUT1IgMTQKKyNkZWZpbmUgTUZfVkVDVE9SIDE2CiAjZGVmaW5lIE1DX1ZFQ1RPUiAxOAogCiAjZGVmaW5lIFNFTEVDVE9SX1RJX01BU0sgKDEgPDwgMikKQEAgLTg5LDcgKzk0LDcgQEAKIHN0cnVjdCBrdm1fdmNwdTsKIHN0cnVjdCBrdm07CiAKLWVudW0geworZW51bSBrdm1fcmVnIHsKIAlWQ1BVX1JFR1NfUkFYID0gMCwKIAlWQ1BVX1JFR1NfUkNYID0gMSwKIAlWQ1BVX1JFR1NfUkRYID0gMiwKQEAgLTEwOCw2ICsxMTMsNyBAQAogCVZDUFVfUkVHU19SMTQgPSAxNCwKIAlWQ1BVX1JFR1NfUjE1ID0gMTUsCiAjZW5kaWYKKwlWQ1BVX1JFR1NfUklQLAogCU5SX1ZDUFVfUkVHUwogfTsKIApAQCAtMTg5LDEwICsxOTUsMjAgQEAKIAkJCQkgICAgKi8KIAlpbnQgbXVsdGltYXBwZWQ7ICAgICAgICAgLyogTW9yZSB0aGFuIG9uZSBwYXJlbnRfcHRlPyAqLwogCWludCByb290X2NvdW50OyAgICAgICAgICAvKiBDdXJyZW50bHkgc2VydmluZyBhcyBhY3RpdmUgcm9vdCAqLworCWJvb2wgdW5zeW5jOworCWJvb2wgdW5zeW5jX2NoaWxkcmVuOwogCXVuaW9uIHsKIAkJdTY0ICpwYXJlbnRfcHRlOyAgICAgICAgICAgICAgIC8qICFtdWx0aW1hcHBlZCAqLwogCQlzdHJ1Y3QgaGxpc3RfaGVhZCBwYXJlbnRfcHRlczsgLyogbXVsdGltYXBwZWQsIGt2bV9wdGVfY2hhaW4gKi8KIAl9OworCURFQ0xBUkVfQklUTUFQKHVuc3luY19jaGlsZF9iaXRtYXAsIDUxMik7Cit9OworCitzdHJ1Y3Qga3ZtX3B2X21tdV9vcF9idWZmZXIgeworCXZvaWQgKnB0cjsKKwl1bnNpZ25lZCBsZW47CisJdW5zaWduZWQgcHJvY2Vzc2VkOworCWNoYXIgYnVmWzUxMl0gX19hbGlnbmVkKHNpemVvZihsb25nKSk7CiB9OwogCiAvKgpAQCAtMjA3LDYgKzIyMyw5IEBACiAJZ3BhX3QgKCpndmFfdG9fZ3BhKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSk7CiAJdm9pZCAoKnByZWZldGNoX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2UpOworCWludCAoKnN5bmNfcGFnZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKTsKKwl2b2lkICgqaW52bHBnKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSk7CiAJaHBhX3Qgcm9vdF9ocGE7CiAJaW50IHJvb3RfbGV2ZWw7CiAJaW50IHNoYWRvd19yb290X2xldmVsOwpAQCAtMjE5LDggKzIzOCwxMyBAQAogCWludCBpbnRlcnJ1cHRfd2luZG93X29wZW47CiAJdW5zaWduZWQgbG9uZyBpcnFfc3VtbWFyeTsgLyogYml0IHZlY3RvcjogMSBwZXIgd29yZCBpbiBpcnFfcGVuZGluZyAqLwogCURFQ0xBUkVfQklUTUFQKGlycV9wZW5kaW5nLCBLVk1fTlJfSU5URVJSVVBUUyk7Ci0JdW5zaWduZWQgbG9uZyByZWdzW05SX1ZDUFVfUkVHU107IC8qIGZvciByc3A6IHZjcHVfbG9hZF9yc3BfcmlwKCkgKi8KLQl1bnNpZ25lZCBsb25nIHJpcDsgICAgICAvKiBuZWVkcyB2Y3B1X2xvYWRfcnNwX3JpcCgpICovCisJLyoKKwkgKiByaXAgYW5kIHJlZ3MgYWNjZXNzZXMgbXVzdCBnbyB0aHJvdWdoCisJICoga3ZtX3tyZWdpc3RlcixyaXB9X3tyZWFkLHdyaXRlfSBmdW5jdGlvbnMuCisJICovCisJdW5zaWduZWQgbG9uZyByZWdzW05SX1ZDUFVfUkVHU107CisJdTMyIHJlZ3NfYXZhaWw7CisJdTMyIHJlZ3NfZGlydHk7CiAKIAl1bnNpZ25lZCBsb25nIGNyMDsKIAl1bnNpZ25lZCBsb25nIGNyMjsKQEAgLTIzNyw2ICsyNjEsOSBAQAogCWJvb2wgdHByX2FjY2Vzc19yZXBvcnRpbmc7CiAKIAlzdHJ1Y3Qga3ZtX21tdSBtbXU7CisJLyogb25seSBuZWVkZWQgaW4ga3ZtX3B2X21tdV9vcCgpIHBhdGgsIGJ1dCBpdCdzIGhvdCBzbworCSAqIHB1dCBpdCBoZXJlIHRvIGF2b2lkIGFsbG9jYXRpb24gKi8KKwlzdHJ1Y3Qga3ZtX3B2X21tdV9vcF9idWZmZXIgbW11X29wX2J1ZmZlcjsKIAogCXN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSBtbXVfcHRlX2NoYWluX2NhY2hlOwogCXN0cnVjdCBrdm1fbW11X21lbW9yeV9jYWNoZSBtbXVfcm1hcF9kZXNjX2NhY2hlOwpAQCAtMjY5LDYgKzI5NiwxMSBAQAogCQl1MzIgZXJyb3JfY29kZTsKIAl9IGV4Y2VwdGlvbjsKIAorCXN0cnVjdCBrdm1fcXVldWVkX2ludGVycnVwdCB7CisJCWJvb2wgcGVuZGluZzsKKwkJdTggbnI7CisJfSBpbnRlcnJ1cHQ7CisKIAlzdHJ1Y3QgewogCQlpbnQgYWN0aXZlOwogCQl1OCBzYXZlX2lvcGw7CkBAIC0yOTQsNiArMzI2LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqdGltZV9wYWdlOwogCiAJYm9vbCBubWlfcGVuZGluZzsKKwlib29sIG5taV9pbmplY3RlZDsKIAogCXU2NCBtdHJyWzB4MTAwXTsKIH07CkBAIC0zMTYsOSArMzQ5LDEyIEBACiAJICogSGFzaCB0YWJsZSBvZiBzdHJ1Y3Qga3ZtX21tdV9wYWdlLgogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX21tdV9wYWdlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFzc2lnbmVkX2Rldl9oZWFkOworCXN0cnVjdCBkbWFyX2RvbWFpbiAqaW50ZWxfaW9tbXVfZG9tYWluOwogCXN0cnVjdCBrdm1fcGljICp2cGljOwogCXN0cnVjdCBrdm1faW9hcGljICp2aW9hcGljOwogCXN0cnVjdCBrdm1fcGl0ICp2cGl0OworCXN0cnVjdCBobGlzdF9oZWFkIGlycV9hY2tfbm90aWZpZXJfbGlzdDsKIAogCWludCByb3VuZF9yb2Jpbl9wcmV2X3ZjcHU7CiAJdW5zaWduZWQgaW50IHRzc19hZGRyOwpAQCAtMzM4LDYgKzM3NCw3IEBACiAJdTMyIG1tdV9mbG9vZGVkOwogCXUzMiBtbXVfcmVjeWNsZWQ7CiAJdTMyIG1tdV9jYWNoZV9taXNzOworCXUzMiBtbXVfdW5zeW5jOwogCXUzMiByZW1vdGVfdGxiX2ZsdXNoOwogCXUzMiBscGFnZXM7CiB9OwpAQCAtMzY0LDYgKzQwMSw3IEBACiAJdTMyIGluc25fZW11bGF0aW9uOwogCXUzMiBpbnNuX2VtdWxhdGlvbl9mYWlsOwogCXUzMiBoeXBlcmNhbGxzOworCXUzMiBpcnFfaW5qZWN0aW9uczsKIH07CiAKIHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlIHsKQEAgLTQxNCw4ICs0NTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgKCpnZXRfZHIpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGRyKTsKIAl2b2lkICgqc2V0X2RyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKIAkJICAgICAgIGludCAqZXhjZXB0aW9uKTsKLQl2b2lkICgqY2FjaGVfcmVncykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLQl2b2lkICgqZGVjYWNoZV9yZWdzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCpjYWNoZV9yZWcpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZW51bSBrdm1fcmVnIHJlZyk7CiAJdW5zaWduZWQgbG9uZyAoKmdldF9yZmxhZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnNldF9yZmxhZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByZmxhZ3MpOwogCkBAIC01MjgsNiArNTY1LDggQEAKIHZvaWQga3ZtX2luamVjdF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjIsCiAJCQkgICB1MzIgZXJyb3JfY29kZSk7CiAKK3ZvaWQga3ZtX3BpY19zZXRfaXJxKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKTsKKwogdm9pZCBrdm1faW5qZWN0X25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiB2b2lkIGZ4X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTU1MCwxMiArNTg5LDE0IEBACiB2b2lkIF9fa3ZtX21tdV9mcmVlX3NvbWVfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fbW11X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX21tdV91bmxvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX21tdV9zeW5jX3Jvb3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIGludCBrdm1fZW11bGF0ZV9oeXBlcmNhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogaW50IGt2bV9maXhfaHlwZXJjYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIGludCBrdm1fbW11X3BhZ2VfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiBlcnJvcl9jb2RlKTsKK3ZvaWQga3ZtX21tdV9pbnZscGcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEpOwogCiB2b2lkIGt2bV9lbmFibGVfdGRwKHZvaWQpOwogdm9pZCBrdm1fZGlzYWJsZV90ZHAodm9pZCk7CkBAIC02ODYsMzMgKzcyNyw2IEBACiAJVEFTS19TV0lUQ0hfR0FURSA9IDMsCiB9OwogCi0jZGVmaW5lIEtWTVRSQUNFXzVEKGV2dCwgdmNwdSwgZDEsIGQyLCBkMywgZDQsIGQ1LCBuYW1lKSBcCi0JdHJhY2VfbWFyayhrdm1fdHJhY2VfIyNuYW1lLCAiJXUgJXAgJXUgJXUgJXUgJXUgJXUgJXUiLCBLVk1fVFJDXyMjZXZ0LCBcCi0JCQkJCQl2Y3B1LCA1LCBkMSwgZDIsIGQzLCBkNCwgZDUpCi0jZGVmaW5lIEtWTVRSQUNFXzREKGV2dCwgdmNwdSwgZDEsIGQyLCBkMywgZDQsIG5hbWUpIFwKLQl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKLQkJCQkJCXZjcHUsIDQsIGQxLCBkMiwgZDMsIGQ0LCAwKQotI2RlZmluZSBLVk1UUkFDRV8zRChldnQsIHZjcHUsIGQxLCBkMiwgZDMsIG5hbWUpIFwKLQl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKLQkJCQkJCXZjcHUsIDMsIGQxLCBkMiwgZDMsIDAsIDApCi0jZGVmaW5lIEtWTVRSQUNFXzJEKGV2dCwgdmNwdSwgZDEsIGQyLCBuYW1lKSBcCi0JdHJhY2VfbWFyayhrdm1fdHJhY2VfIyNuYW1lLCAiJXUgJXAgJXUgJXUgJXUgJXUgJXUgJXUiLCBLVk1fVFJDXyMjZXZ0LCBcCi0JCQkJCQl2Y3B1LCAyLCBkMSwgZDIsIDAsIDAsIDApCi0jZGVmaW5lIEtWTVRSQUNFXzFEKGV2dCwgdmNwdSwgZDEsIG5hbWUpIFwKLQl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKLQkJCQkJCXZjcHUsIDEsIGQxLCAwLCAwLCAwLCAwKQotI2RlZmluZSBLVk1UUkFDRV8wRChldnQsIHZjcHUsIG5hbWUpIFwKLQl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKLQkJCQkJCXZjcHUsIDAsIDAsIDAsIDAsIDAsIDApCi0KLSNpZmRlZiBDT05GSUdfNjRCSVQKLSMgZGVmaW5lIEtWTV9FWF9FTlRSWSAiLnF1YWQiCi0jIGRlZmluZSBLVk1fRVhfUFVTSCAicHVzaHEiCi0jZWxzZQotIyBkZWZpbmUgS1ZNX0VYX0VOVFJZICIubG9uZyIKLSMgZGVmaW5lIEtWTV9FWF9QVVNIICJwdXNobCIKLSNlbmRpZgotCiAvKgogICogSGFyZHdhcmUgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBtYXkgZmF1bHQgaWYgYQogICogcmVib290IHR1cm5zIG9mZiB2aXJ0dWFsaXphdGlvbiB3aGlsZSBwcm9jZXNzZXMgYXJlIHJ1bm5pbmcuCkBAIC03MjQsMTUgKzczOCwxNSBAQAogCSI2NjY6ICIgaW5zbiAiXG5cdCIgXAogCSIucHVzaHNlY3Rpb24gLmZpeHVwLCBcImF4XCIgXG4iIFwKIAkiNjY3OiBcblx0IiBcCi0JS1ZNX0VYX1BVU0ggIiAkNjY2YiBcblx0IiBcCisJX19BU01fU0laRShwdXNoKSAiICQ2NjZiIFxuXHQiCSAgICAgIFwKIAkiam1wIGt2bV9oYW5kbGVfZmF1bHRfb25fcmVib290IFxuXHQiIFwKIAkiLnBvcHNlY3Rpb24gXG5cdCIgXAogCSIucHVzaHNlY3Rpb24gX19leF90YWJsZSwgXCJhXCIgXG5cdCIgXAotCUtWTV9FWF9FTlRSWSAiIDY2NmIsIDY2N2IgXG5cdCIgXAorCV9BU01fUFRSICIgNjY2YiwgNjY3YiBcblx0IiBcCiAJIi5wb3BzZWN0aW9uIgogCiAjZGVmaW5lIEtWTV9BUkNIX1dBTlRfTU1VX05PVElGSUVSCiBpbnQga3ZtX3VubWFwX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKTsKIGludCBrdm1fYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fS1ZNX0hPU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2t2bV9wYXJhLmggYi9pbmNsdWRlL2FzbS14ODYva3ZtX3BhcmEuaAppbmRleCA3NmYzOTIxLi4zMDA1NGZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYva3ZtX3BhcmEuaAorKysgYi9pbmNsdWRlL2FzbS14ODYva3ZtX3BhcmEuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19YODZfS1ZNX1BBUkFfSAotI2RlZmluZSBfX1g4Nl9LVk1fUEFSQV9ICisjaWZuZGVmIEFTTV9YODZfX0tWTV9QQVJBX0gKKyNkZWZpbmUgQVNNX1g4Nl9fS1ZNX1BBUkFfSAogCiAvKiBUaGlzIENQVUlEIHJldHVybnMgdGhlIHNpZ25hdHVyZSAnS1ZNS1ZNS1ZNJyBpbiBlYngsIGVjeCwgYW5kIGVkeC4gIEl0CiAgKiBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCBhIFZNIGlzIHJ1bm5pbmcgdW5kZXIgS1ZNLgpAQCAtMTQ0LDQgKzE0NCw0IEBACiAKICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19LVk1fUEFSQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYva3ZtX3g4Nl9lbXVsYXRlLmggYi9pbmNsdWRlL2FzbS14ODYva3ZtX3g4Nl9lbXVsYXRlLmgKaW5kZXggNGU4YzFlNC4uZTJkOWIwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2t2bV94ODZfZW11bGF0ZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9rdm1feDg2X2VtdWxhdGUuaApAQCAtOCw4ICs4LDggQEAKICAqIEZyb206IHhlbi11bnN0YWJsZSAxMDY3NjphZjk4MDlmNTFmODFhM2M0M2YyNzZmMDBjODFhNTJlZjU1OGFmZGE0CiAgKi8KIAotI2lmbmRlZiBfX1g4Nl9FTVVMQVRFX0hfXwotI2RlZmluZSBfX1g4Nl9FTVVMQVRFX0hfXworI2lmbmRlZiBBU01fWDg2X19LVk1fWDg2X0VNVUxBVEVfSAorI2RlZmluZSBBU01fWDg2X19LVk1fWDg2X0VNVUxBVEVfSAogCiBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dDsKIApAQCAtMTgxLDQgKzE4MSw0IEBACiBpbnQgeDg2X2VtdWxhdGVfaW5zbihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKIAkJICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMpOwogCi0jZW5kaWYJCQkJLyogX19YODZfRU1VTEFURV9IX18gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19LVk1fWDg2X0VNVUxBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2xkdC5oIGIvaW5jbHVkZS9hc20teDg2L2xkdC5oCmluZGV4IDIwYzU5NzIuLmE1MjI4NTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9sZHQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbGR0LmgKQEAgLTMsOCArMyw4IEBACiAgKgogICogRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIHdpdGggdGhlIG1vZGlmeV9sZHQgc3lzdGVtIGNhbGwuCiAgKi8KLSNpZm5kZWYgX0FTTV9YODZfTERUX0gKLSNkZWZpbmUgX0FTTV9YODZfTERUX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTERUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTERUX0gKIAogLyogTWF4aW11bSBudW1iZXIgb2YgTERUIGVudHJpZXMgc3VwcG9ydGVkLiAqLwogI2RlZmluZSBMRFRfRU5UUklFUwk4MTkyCkBAIC0zNyw0ICszNyw0IEBACiAjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERQkyCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19MRFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2xndWVzdC5oIGIvaW5jbHVkZS9hc20teDg2L2xndWVzdC5oCmluZGV4IGJlNGE3MjQuLjc1MDVlOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9sZ3Vlc3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbGd1ZXN0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9YODZfTEdVRVNUX0gKLSNkZWZpbmUgX1g4Nl9MR1VFU1RfSAorI2lmbmRlZiBBU01fWDg2X19MR1VFU1RfSAorI2RlZmluZSBBU01fWDg2X19MR1VFU1RfSAogCiAjZGVmaW5lIEdEVF9FTlRSWV9MR1VFU1RfQ1MJMTAKICNkZWZpbmUgR0RUX0VOVFJZX0xHVUVTVF9EUwkxMQpAQCAtOTEsNCArOTEsNCBAQAogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX0xHVUVTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbGd1ZXN0X2hjYWxsLmggYi9pbmNsdWRlL2FzbS14ODYvbGd1ZXN0X2hjYWxsLmgKaW5kZXggYTMyNDFmMi4uOGYwMzRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2xndWVzdF9oY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9sZ3Vlc3RfaGNhbGwuaApAQCAtMSw2ICsxLDYgQEAKIC8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBsZ3Vlc3QgaHlwZXJjYWxscyAqLwotI2lmbmRlZiBfWDg2X0xHVUVTVF9IQ0FMTF9ICi0jZGVmaW5lIF9YODZfTEdVRVNUX0hDQUxMX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTEdVRVNUX0hDQUxMX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTEdVRVNUX0hDQUxMX0gKIAogI2RlZmluZSBMSENBTExfRkxVU0hfQVNZTkMJMAogI2RlZmluZSBMSENBTExfTEdVRVNUX0lOSVQJMQpAQCAtNjgsNCArNjgsNCBAQAogfTsKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLSNlbmRpZgkvKiBfSTM4Nl9MR1VFU1RfSENBTExfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0xHVUVTVF9IQ0FMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbGlua2FnZS5oIGIvaW5jbHVkZS9hc20teDg2L2xpbmthZ2UuaAppbmRleCA2NGU0NDRmLi40MmQ4YjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9saW5rYWdlLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX0xJTktBR0VfSAotI2RlZmluZSBfX0FTTV9MSU5LQUdFX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTElOS0FHRV9ICisjZGVmaW5lIEFTTV9YODZfX0xJTktBR0VfSAogCiAjdW5kZWYgbm90cmFjZQogI2RlZmluZSBub3RyYWNlIF9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKQpAQCAtNTcsNSArNTcsNSBAQAogI2RlZmluZSBfX0FMSUdOX1NUUiAiLmFsaWduIDE2LDB4OTAiCiAjZW5kaWYKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTElOS0FHRV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9sb2NhbC5oIGIvaW5jbHVkZS9hc20teDg2L2xvY2FsLmgKaW5kZXggMzMwYTcyNC4uYWU5MTk5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L2xvY2FsLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BUkNIX0xPQ0FMX0gKLSNkZWZpbmUgX0FSQ0hfTE9DQUxfSAorI2lmbmRlZiBBU01fWDg2X19MT0NBTF9ICisjZGVmaW5lIEFTTV9YODZfX0xPQ0FMX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCkBAIC0yMzIsNCArMjMyLDQgQEAKICNkZWZpbmUgX19jcHVfbG9jYWxfYWRkKGksIGwpCWNwdV9sb2NhbF9hZGQoKGkpLCAobCkpCiAjZGVmaW5lIF9fY3B1X2xvY2FsX3N1YihpLCBsKQljcHVfbG9jYWxfc3ViKChpKSwgKGwpKQogCi0jZW5kaWYgLyogX0FSQ0hfTE9DQUxfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX0xPQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWJpZ3NtcC9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWJpZ3NtcC9tYWNoX2FwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiOWRjNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1iaWdzbXAvbWFjaF9hcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNfSAotI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNfSAotCi0jZGVmaW5lIHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpIChwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIGNwdSkpCi0jZGVmaW5lIGVzcl9kaXNhYmxlICgxKQotCi1zdGF0aWMgaW5saW5lIGludCBhcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKLXsKLQlyZXR1cm4gKDEpOwotfQotCi0vKiBSb3VuZCByb2JpbiB0aGUgaXJxcyBhbW91bmcgdGhlIG9ubGluZSBjcHVzICovCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQoteyAKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHUgPSBOUl9DUFVTOwotCWRvIHsKLQkJaWYgKGNwdSA+PSBOUl9DUFVTKQotCQkJY3B1ID0gZmlyc3RfY3B1KGNwdV9vbmxpbmVfbWFwKTsKLQkJZWxzZQotCQkJY3B1ID0gbmV4dF9jcHUoY3B1LCBjcHVfb25saW5lX21hcCk7Ci0JfSB3aGlsZSAoY3B1ID49IE5SX0NQVVMpOwotCXJldHVybiBjcHVtYXNrX29mX2NwdShjcHUpOwotfQotCi0jdW5kZWYgQVBJQ19ERVNUX0xPR0lDQUwKLSNkZWZpbmUgQVBJQ19ERVNUX0xPR0lDQUwgCTAKLSNkZWZpbmUgVEFSR0VUX0NQVVMJCSh0YXJnZXRfY3B1cygpKQotI2RlZmluZSBBUElDX0RGUl9WQUxVRQkJKEFQSUNfREZSX0ZMQVQpCi0jZGVmaW5lIElOVF9ERUxJVkVSWV9NT0RFCShkZXN0X0ZpeGVkKQotI2RlZmluZSBJTlRfREVTVF9NT0RFCQkoMCkgICAgLyogcGh5cyBkZWxpdmVyeSB0byB0YXJnZXQgcHJvYyAqLwotI2RlZmluZSBOT19CQUxBTkNFX0lSUQkJKDApCi0jZGVmaW5lIFdBS0VfU0VDT05EQVJZX1ZJQV9JTklUCi0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoZWNrX2FwaWNpZF91c2VkKHBoeXNpZF9tYXNrX3QgYml0bWFwLCBpbnQgYXBpY2lkKQotewotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQotewotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjYWxjdWxhdGVfbGRyKGludCBjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWwsIGlkOwotCXZhbCA9IGFwaWNfcmVhZChBUElDX0xEUikgJiB+QVBJQ19MRFJfTUFTSzsKLQlpZCA9IHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpOwotCXZhbCB8PSBTRVRfQVBJQ19MT0dJQ0FMX0lEKGlkKTsKLQlyZXR1cm4gdmFsOwotfQotCi0vKgotICogU2V0IHVwIHRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIElELgotICoKLSAqIEludGVsIHJlY29tbWVuZHMgdG8gc2V0IERGUiwgTERSIGFuZCBUUFIgYmVmb3JlIGVuYWJsaW5nCi0gKiBhbiBBUElDLiAgU2VlIGUuZy4gIkFQLTM4OCA4MjQ4OURYIFVzZXIncyBNYW51YWwiIChJbnRlbAotICogZG9jdW1lbnQgbnVtYmVyIDI5MjExNikuICBTbyBoZXJlIGl0IGdvZXMuLi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGluaXRfYXBpY19sZHIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JYXBpY193cml0ZShBUElDX0RGUiwgQVBJQ19ERlJfVkFMVUUpOwotCXZhbCA9IGNhbGN1bGF0ZV9sZHIoY3B1KTsKLQlhcGljX3dyaXRlKEFQSUNfTERSLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpCi17Ci0JcHJpbnRrKCJFbmFibGluZyBBUElDIG1vZGU6ICAlcy4gIFVzaW5nICVkIEkvTyBBUElDc1xuIiwKLQkJIlBoeXNmbGF0IiwgbnJfaW9hcGljcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG11bHRpX3RpbWVyX2NoZWNrKGludCBhcGljLCBpbnQgaXJxKQotewotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkKLXsKLQlyZXR1cm4gYXBpY2lkXzJfbm9kZVtoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKV07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAobXBzX2NwdSA8IE5SX0NQVVMpCi0JCXJldHVybiAoaW50KSBwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOwotCi0JcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBhcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkKQotewotCXJldHVybiBwaHlzaWRfbWFza19vZl9waHlzaWQocGh5c19hcGljaWQpOwotfQotCi1leHRlcm4gdTggY3B1XzJfbG9naWNhbF9hcGljaWRbXTsKLS8qIE1hcHBpbmcgZnJvbSBjcHUgbnVtYmVyIHRvIGxvZ2ljYWwgYXBpY2lkICovCi1zdGF0aWMgaW5saW5lIGludCBjcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKLXsKLQlpZiAoY3B1ID49IE5SX0NQVVMpCi0JCXJldHVybiBCQURfQVBJQ0lEOwotCXJldHVybiBjcHVfcGh5c2ljYWxfaWQoY3B1KTsKLX0KLQotc3RhdGljIGlubGluZSBwaHlzaWRfbWFza190IGlvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190IHBoeXNfbWFwKQotewotCS8qIEZvciBjbHVzdGVyZWQgd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgeWV0IC0gaGFjayAqLwotCXJldHVybiBwaHlzaWRzX3Byb21vdGUoMHhGRkwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcG9ydGlvX3JlbWFwKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfYXBpY19tb2RlKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkKLXsKLQlyZXR1cm4gKDEpOwotfQotCi0vKiBBcyB3ZSBhcmUgdXNpbmcgc2luZ2xlIENQVSBhcyBkZXN0aW5hdGlvbiwgcGljayBvbmx5IG9uZSBDUFUgaGVyZSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1X21hc2tfdG9fYXBpY2lkKGNwdW1hc2tfdCBjcHVtYXNrKQotewotCWludCBjcHU7Ci0JaW50IGFwaWNpZDsJCi0KLQljcHUgPSBmaXJzdF9jcHUoY3B1bWFzayk7Ci0JYXBpY2lkID0gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7Ci0JcmV0dXJuIGFwaWNpZDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgcGh5c19wa2dfaWQodTMyIGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCi17Ci0JcmV0dXJuIGNwdWlkX2FwaWMgPj4gaW5kZXhfbXNiOwotfQotCi0jZW5kaWYgLyogX19BU01fTUFDSF9BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWJpZ3NtcC9tYWNoX2FwaWNkZWYuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWJpZ3NtcC9tYWNoX2FwaWNkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YWI1YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1iaWdzbXAvbWFjaF9hcGljZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfQVBJQ0RFRl9ICi0jZGVmaW5lIF9fQVNNX01BQ0hfQVBJQ0RFRl9ICi0KLSNkZWZpbmUJCUFQSUNfSURfTUFTSwkJKDB4RkY8PDI0KQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkgCi17IAotCXJldHVybiAoKCh4KT4+MjQpJjB4RkYpOwotfSAKLQotI2RlZmluZQkJR0VUX0FQSUNfSUQoeCkJZ2V0X2FwaWNfaWQoeCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L2FwbS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9hcG0uaAppbmRleCA5ODlmMzRjLi4yYWE2MWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L2FwbS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvYXBtLmgKQEAgLTMsOCArMyw4IEBACiAgKiAgU3BsaXQgb3V0IGZyb20gYXBtLmMgYnkgT3NhbXUgVG9taXRhIDx0b21pdGFAY2luZXQuY28uanA+CiAgKi8KIAotI2lmbmRlZiBfQVNNX0FQTV9ICi0jZGVmaW5lIF9BU01fQVBNX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTUFDSF9ERUZBVUxUX19BUE1fSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0RFRkFVTFRfX0FQTV9ICiAKICNpZmRlZiBBUE1fWkVST19TRUdTCiAjCWRlZmluZSBBUE1fRE9fWkVST19TRUdTIFwKQEAgLTcwLDQgKzcwLDQgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNlbmRpZiAvKiBfQVNNX0FQTV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fTUFDSF9ERUZBVUxUX19BUE1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF9hcGljLmgKaW5kZXggZjMyMjZiOS4uMmEzMzBhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfYXBpYy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNfSAotI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfQVBJQ19ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9BUElDX0gKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCkBAIC0zMCw2ICszMCw4IEBACiAjZGVmaW5lIGNwdV9tYXNrX3RvX2FwaWNpZCAoZ2VuYXBpYy0+Y3B1X21hc2tfdG9fYXBpY2lkKQogI2RlZmluZSBwaHlzX3BrZ19pZAkoZ2VuYXBpYy0+cGh5c19wa2dfaWQpCiAjZGVmaW5lIHZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbiAgICAoZ2VuYXBpYy0+dmVjdG9yX2FsbG9jYXRpb25fZG9tYWluKQorI2RlZmluZSByZWFkX2FwaWNfaWQoKSAgKEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSkpCisjZGVmaW5lIHNlbmRfSVBJX3NlbGYgKGdlbmFwaWMtPnNlbmRfSVBJX3NlbGYpCiBleHRlcm4gdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCk7CiAjZWxzZQogI2RlZmluZSBJTlRfREVMSVZFUllfTU9ERSBkZXN0X0xvd2VzdFByaW8KQEAgLTU0LDcgKzU2LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCiB7Ci0JcmV0dXJuIHBoeXNpZF9pc3NldChHRVRfQVBJQ19JRChyZWFkX2FwaWNfaWQoKSksIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwlyZXR1cm4gcGh5c2lkX2lzc2V0KHJlYWRfYXBpY19pZCgpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKQEAgLTEzOCw0ICsxNDAsNCBAQAogfQogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCi0jZW5kaWYgLyogX19BU01fTUFDSF9BUElDX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX2FwaWNkZWYuaAppbmRleCBlNGIyOWJhLi4wYzJkNDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfYXBpY2RlZi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF9hcGljZGVmLmgKQEAgLTEsMTIgKzEsMTIgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9BUElDREVGX0gKLSNkZWZpbmUgX19BU01fTUFDSF9BUElDREVGX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTUFDSF9ERUZBVUxUX19NQUNIX0FQSUNERUZfSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfQVBJQ0RFRl9ICiAKICNpbmNsdWRlIDxhc20vYXBpYy5oPgogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotI2RlZmluZQlBUElDX0lEX01BU0sJCSgweEZGdTw8MjQpCi0jZGVmaW5lIEdFVF9BUElDX0lEKHgpICAgICAgICAgICgoKHgpPj4yNCkmMHhGRnUpCi0jZGVmaW5lCVNFVF9BUElDX0lEKHgpCQkoKCh4KTw8MjQpKQorI2RlZmluZQlBUElDX0lEX01BU0sJCShnZW5hcGljLT5hcGljX2lkX21hc2spCisjZGVmaW5lIEdFVF9BUElDX0lEKHgpCQkoZ2VuYXBpYy0+Z2V0X2FwaWNfaWQoeCkpCisjZGVmaW5lCVNFVF9BUElDX0lEKHgpCQkoZ2VuYXBpYy0+c2V0X2FwaWNfaWQoeCkpCiAjZWxzZQogI2RlZmluZQkJQVBJQ19JRF9NQVNLCQkoMHhGPDwyNCkKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KSAKQEAgLTIxLDQgKzIxLDQgQEAKICNkZWZpbmUJCUdFVF9BUElDX0lEKHgpCWdldF9hcGljX2lkKHgpCiAjZW5kaWYKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTUFDSF9ERUZBVUxUX19NQUNIX0FQSUNERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oCmluZGV4IGJlMzIzMzYuLjY3NGJjN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfaXBpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfSVBJX0gKLSNkZWZpbmUgX19BU01fTUFDSF9JUElfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfSVBJX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTUFDSF9ERUZBVUxUX19NQUNIX0lQSV9ICiAKIC8qIEF2b2lkIGluY2x1ZGUgaGVsbCAqLwogI2RlZmluZSBOTUlfVkVDVE9SIDB4MDIKQEAgLTYxLDQgKzYxLDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19BU01fTUFDSF9JUElfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9JUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF9tcHBhcnNlLmgKaW5kZXggZDE0MTA4NS4uOWMzODFmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX21wcGFyc2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX01QUEFSU0VfSAotI2RlZmluZSBfX0FTTV9NQUNIX01QUEFSU0VfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfTVBQQVJTRV9ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9NUFBBUlNFX0gKIAogc3RhdGljIGlubGluZSBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwgCiAJCWNoYXIgKnByb2R1Y3RpZCkKQEAgLTE0LDQgKzE0LDQgQEAKIH0KIAogCi0jZW5kaWYgLyogX19BU01fTUFDSF9NUFBBUlNFX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfTVBQQVJTRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfbXBzcGVjLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfbXBzcGVjLmgKaW5kZXggNTFjOWE5Ny4uZDc3NjQ2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF9tcHNwZWMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9NUFNQRUNfSAotI2RlZmluZSBfX0FTTV9NQUNIX01QU1BFQ19ICisjaWZuZGVmIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9NUFNQRUNfSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfTVBTUEVDX0gKIAogI2RlZmluZSBNQVhfSVJRX1NPVVJDRVMgMjU2CiAKQEAgLTksNCArOSw0IEBACiAjZGVmaW5lIE1BWF9NUF9CVVNTRVMgMzIKICNlbmRpZgogCi0jZW5kaWYgLyogX19BU01fTUFDSF9NUFNQRUNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9NUFNQRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX3RpbWVyLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdGltZXIuaAppbmRleCA0Yjc2ZTUzLi45OTBiMTU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdGltZXIuaApAQCAtMTAsOCArMTAsOCBAQAogICogZGlyZWN0bHkgYmVjYXVzZSBvZiB0aGUgYXdrd2FyZCA4LWJpdCBhY2Nlc3MgbWVjaGFuaXNtIG9mIHRoZSA4MkM1NAogICogZGV2aWNlLgogICovCi0jaWZuZGVmIF9NQUNIX1RJTUVSX0gKLSNkZWZpbmUgX01BQ0hfVElNRVJfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfVElNRVJfSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfVElNRVJfSAogCiAjZGVmaW5lIENBTElCUkFURV9USU1FX01TRUMgMzAgLyogMzAgbXNlY3MgKi8KICNkZWZpbmUgQ0FMSUJSQVRFX0xBVENICVwKQEAgLTQ1LDQgKzQ1LDQgQEAKIAkqY291bnRfcCA9IGNvdW50OwogfQogCi0jZW5kaWYgLyogIV9NQUNIX1RJTUVSX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX3RyYXBzLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdHJhcHMuaAppbmRleCAyZmU3NzA1Li5mZjg3NzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdHJhcHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfdHJhcHMuaApAQCAtMiwxNyArMiwxMSBAQAogICogIE1hY2hpbmUgc3BlY2lmaWMgTk1JIGhhbmRsaW5nIGZvciBnZW5lcmljLgogICogIFNwbGl0IG91dCBmcm9tIHRyYXBzLmMgYnkgT3NhbXUgVG9taXRhIDx0b21pdGFAY2luZXQuY28uanA+CiAgKi8KLSNpZm5kZWYgX01BQ0hfVFJBUFNfSAotI2RlZmluZSBfTUFDSF9UUkFQU19ICisjaWZuZGVmIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9UUkFQU19ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9UUkFQU19ICiAKICNpbmNsdWRlIDxhc20vbWMxNDY4MThydGMuaD4KIAotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX21lbV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbikKLXsKLQlyZWFzb24gPSAocmVhc29uICYgMHhmKSB8IDQ7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X25taV9yZWFzb24odm9pZCkKIHsKIAlyZXR1cm4gaW5iKDB4NjEpOwpAQCAtMzYsNCArMzAsNCBAQAogCQl1bmxvY2tfY21vcygpOwogfQogCi0jZW5kaWYgLyogIV9NQUNIX1RSQVBTX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfVFJBUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX3dha2VjcHUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWRlZmF1bHQvbWFjaF93YWtlY3B1LmgKaW5kZXggM2ViYjE3OC4uMzYxYjgxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZGVmYXVsdC9tYWNoX3dha2VjcHUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1kZWZhdWx0L21hY2hfd2FrZWNwdS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX1dBS0VDUFVfSAotI2RlZmluZSBfX0FTTV9NQUNIX1dBS0VDUFVfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0RFRkFVTFRfX01BQ0hfV0FLRUNQVV9ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9XQUtFQ1BVX0gKIAogLyogCiAgKiBUaGlzIGZpbGUgY29wZXMgd2l0aCBtYWNoaW5lcyB0aGF0IHdha2V1cCBzZWNvbmRhcnkgQ1BVcyBieSB0aGUKQEAgLTM5LDQgKzM5LDQgQEAKICAjZGVmaW5lIGlucXVpcmVfcmVtb3RlX2FwaWMoYXBpY2lkKSB7fQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX0FTTV9NQUNIX1dBS0VDUFVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfREVGQVVMVF9fTUFDSF9XQUtFQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWVzNzAwMC9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWVzNzAwMC9tYWNoX2FwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzZmRmOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1lczcwMDAvbWFjaF9hcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNfSAotI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNfSAotCi0jZGVmaW5lIHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpIHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgY3B1KQotI2RlZmluZSBlc3JfZGlzYWJsZSAoMSkKLQotc3RhdGljIGlubGluZSBpbnQgYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCi17Ci0JICAgICAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQoteyAKLSNpZiBkZWZpbmVkIENPTkZJR19FUzcwMDBfQ0xVU1RFUkVEX0FQSUMKLQlyZXR1cm4gQ1BVX01BU0tfQUxMOwotI2Vsc2UKLQlyZXR1cm4gY3B1bWFza19vZl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLSNlbmRpZgotfQotI2RlZmluZSBUQVJHRVRfQ1BVUwkodGFyZ2V0X2NwdXMoKSkKLQotI2lmIGRlZmluZWQgQ09ORklHX0VTNzAwMF9DTFVTVEVSRURfQVBJQwotI2RlZmluZSBBUElDX0RGUl9WQUxVRQkJKEFQSUNfREZSX0NMVVNURVIpCi0jZGVmaW5lIElOVF9ERUxJVkVSWV9NT0RFCShkZXN0X0xvd2VzdFByaW8pCi0jZGVmaW5lIElOVF9ERVNUX01PREUJCSgxKSAgICAvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgcHJvY3MgKi8KLSNkZWZpbmUgTk9fQkFMQU5DRV9JUlEgCQkoMSkKLSN1bmRlZiAgV0FLRV9TRUNPTkRBUllfVklBX0lOSVQKLSNkZWZpbmUgV0FLRV9TRUNPTkRBUllfVklBX01JUAotI2Vsc2UKLSNkZWZpbmUgQVBJQ19ERlJfVkFMVUUJCShBUElDX0RGUl9GTEFUKQotI2RlZmluZSBJTlRfREVMSVZFUllfTU9ERQkoZGVzdF9GaXhlZCkKLSNkZWZpbmUgSU5UX0RFU1RfTU9ERQkJKDApICAgIC8qIHBoeXMgZGVsaXZlcnkgdG8gdGFyZ2V0IHByb2NzICovCi0jZGVmaW5lIE5PX0JBTEFOQ0VfSVJRIAkJKDApCi0jdW5kZWYgIEFQSUNfREVTVF9MT0dJQ0FMCi0jZGVmaW5lIEFQSUNfREVTVF9MT0dJQ0FMCTB4MAotI2RlZmluZSBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190IGJpdG1hcCwgaW50IGFwaWNpZCkKLXsgCi0JcmV0dXJuIDA7Ci19IAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoZWNrX2FwaWNpZF9wcmVzZW50KGludCBiaXQpIAotewotCXJldHVybiBwaHlzaWRfaXNzZXQoYml0LCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci19Ci0KLSNkZWZpbmUgYXBpY2lkX2NsdXN0ZXIoYXBpY2lkKSAoYXBpY2lkICYgMHhGMCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9sZHIoaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGlkOwotCWlkID0geGFwaWNfcGh5c190b19sb2dfYXBpY2lkKGNwdSk7Ci0JcmV0dXJuIChTRVRfQVBJQ19MT0dJQ0FMX0lEKGlkKSk7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gSUQuCi0gKgotICogSW50ZWwgcmVjb21tZW5kcyB0byBzZXQgREZSLCBMZFIgYW5kIFRQUiBiZWZvcmUgZW5hYmxpbmcKLSAqIGFuIEFQSUMuICBTZWUgZS5nLiAiQVAtMzg4IDgyNDg5RFggVXNlcidzIE1hbnVhbCIgKEludGVsCi0gKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hcGljX2xkcih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9WQUxVRSk7Ci0JdmFsID0gY2FsY3VsYXRlX2xkcihjcHUpOwotCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Ci19Ci0KLSNpZm5kZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAotZXh0ZXJuIHZvaWQgZW5hYmxlX2FwaWNfbW9kZSh2b2lkKTsKLSNlbmRpZgotCi1leHRlcm4gaW50IGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKLXsKLQlpbnQgYXBpYyA9IHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlwcmludGsoIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiAgVXNpbmcgJWQgSS9PIEFQSUNzLCB0YXJnZXQgY3B1cyAlbHhcbiIsCi0JCShhcGljX3ZlcnNpb25bYXBpY10gPT0gMHgxNCkgPyAKLQkJIlBoeXNpY2FsIENsdXN0ZXIiIDogIkxvZ2ljYWwgQ2x1c3RlciIsIG5yX2lvYXBpY3MsIGNwdXNfYWRkcihUQVJHRVRfQ1BVUylbMF0pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtdWx0aV90aW1lcl9jaGVjayhpbnQgYXBpYywgaW50IGlycSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXBpY2lkX3RvX25vZGUoaW50IGxvZ2ljYWxfYXBpY2lkKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAoIW1wc19jcHUpCi0JCXJldHVybiBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7Ci0JZWxzZSBpZiAobXBzX2NwdSA8IE5SX0NQVVMpCi0JCXJldHVybiAoaW50KSBwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBhcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IHBoeXNfYXBpY2lkKQotewotCXN0YXRpYyBpbnQgaWQgPSAwOwotCXBoeXNpZF9tYXNrX3QgbWFzazsKLQltYXNrID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGlkKTsKLQkrK2lkOwotCXJldHVybiBtYXNrOwotfQotCi1leHRlcm4gdTggY3B1XzJfbG9naWNhbF9hcGljaWRbXTsKLS8qIE1hcHBpbmcgZnJvbSBjcHUgbnVtYmVyIHRvIGxvZ2ljYWwgYXBpY2lkICovCi1zdGF0aWMgaW5saW5lIGludCBjcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0gICAgICAgaWYgKGNwdSA+PSBOUl9DUFVTKQotCSAgICAgICByZXR1cm4gQkFEX0FQSUNJRDsKLSAgICAgICByZXR1cm4gKGludCljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdOwotI2Vsc2UKLQlyZXR1cm4gbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBwaHlzaWRfbWFza190IGlvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190IHBoeXNfbWFwKQotewotCS8qIEZvciBjbHVzdGVyZWQgd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgeWV0IC0gaGFjayAqLwotCXJldHVybiBwaHlzaWRzX3Byb21vdGUoMHhmZik7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3BvcnRpb19yZW1hcCh2b2lkKQotewotfQotCi1leHRlcm4gdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IGNwdV9waHlzaWNhbF9hcGljaWQpCi17Ci0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQocmVhZF9hcGljX2lkKCkpOwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKLXsKLQlpbnQgbnVtX2JpdHNfc2V0OwotCWludCBjcHVzX2ZvdW5kID0gMDsKLQlpbnQgY3B1OwotCWludCBhcGljaWQ7CQotCi0JbnVtX2JpdHNfc2V0ID0gY3B1c193ZWlnaHQoY3B1bWFzayk7Ci0JLyogUmV0dXJuIGlkIHRvIGFsbCAqLwotCWlmIChudW1fYml0c19zZXQgPT0gTlJfQ1BVUykKLSNpZiBkZWZpbmVkIENPTkZJR19FUzcwMDBfQ0xVU1RFUkVEX0FQSUMKLQkJcmV0dXJuIDB4RkY7Ci0jZWxzZQotCQlyZXR1cm4gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKDApOwotI2VuZGlmCi0JLyogCi0JICogVGhlIGNwdXMgaW4gdGhlIG1hc2sgbXVzdCBhbGwgYmUgb24gdGhlIGFwaWMgY2x1c3Rlci4gIElmIGFyZSBub3QgCi0JICogb24gdGhlIHNhbWUgYXBpY2lkIGNsdXN0ZXIgcmV0dXJuIGRlZmF1bHQgdmFsdWUgb2YgVEFSR0VUX0NQVVMuIAotCSAqLwotCWNwdSA9IGZpcnN0X2NwdShjcHVtYXNrKTsKLQlhcGljaWQgPSBjcHVfdG9fbG9naWNhbF9hcGljaWQoY3B1KTsKLQl3aGlsZSAoY3B1c19mb3VuZCA8IG51bV9iaXRzX3NldCkgewotCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1bWFzaykpIHsKLQkJCWludCBuZXdfYXBpY2lkID0gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7Ci0JCQlpZiAoYXBpY2lkX2NsdXN0ZXIoYXBpY2lkKSAhPSAKLQkJCQkJYXBpY2lkX2NsdXN0ZXIobmV3X2FwaWNpZCkpewotCQkJCXByaW50ayAoIiVzOiBOb3QgYSB2YWxpZCBtYXNrIVxuIixfX0ZVTkNUSU9OX18pOwotI2lmIGRlZmluZWQgQ09ORklHX0VTNzAwMF9DTFVTVEVSRURfQVBJQwotCQkJCXJldHVybiAweEZGOwotI2Vsc2UKLQkJCQlyZXR1cm4gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKDApOwotI2VuZGlmCi0JCQl9Ci0JCQlhcGljaWQgPSBuZXdfYXBpY2lkOwotCQkJY3B1c19mb3VuZCsrOwotCQl9Ci0JCWNwdSsrOwotCX0KLQlyZXR1cm4gYXBpY2lkOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBwaHlzX3BrZ19pZCh1MzIgY3B1aWRfYXBpYywgaW50IGluZGV4X21zYikKLXsKLQlyZXR1cm4gY3B1aWRfYXBpYyA+PiBpbmRleF9tc2I7Ci19Ci0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0FQSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfYXBpY2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYjVhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWVzNzAwMC9tYWNoX2FwaWNkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9BUElDREVGX0gKLSNkZWZpbmUgX19BU01fTUFDSF9BUElDREVGX0gKLQotI2RlZmluZQkJQVBJQ19JRF9NQVNLCQkoMHhGRjw8MjQpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KSAKLXsgCi0JcmV0dXJuICgoKHgpPj4yNCkmMHhGRik7Ci19IAotCi0jZGVmaW5lCQlHRVRfQVBJQ19JRCh4KQlnZXRfYXBpY19pZCh4KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWVzNzAwMC9tYWNoX2lwaS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfaXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjFiZDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfaXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfSVBJX0gKLSNkZWZpbmUgX19BU01fTUFDSF9JUElfSAotCi12b2lkIHNlbmRfSVBJX21hc2tfc2VxdWVuY2UoY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfbWFzayhjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKLXsKLQlzZW5kX0lQSV9tYXNrX3NlcXVlbmNlKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCi17Ci0JY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKLQlpZiAoIWNwdXNfZW1wdHkobWFzaykpCi0JCXNlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCXNlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXAsIHZlY3Rvcik7Ci19Ci0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0lQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1lczcwMDAvbWFjaF9tcHBhcnNlLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1lczcwMDAvbWFjaF9tcHBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjZkMzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfbXBwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX01QUEFSU0VfSAotI2RlZmluZSBfX0FTTV9NQUNIX01QUEFSU0VfSAotCi0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotCi1leHRlcm4gaW50IHBhcnNlX3VuaXN5c19vZW0gKGNoYXIgKm9lbXB0cik7Ci1leHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKTsKLWV4dGVybiB2b2lkIHNldHVwX3VuaXN5cyh2b2lkKTsKLQotI2lmbmRlZiBDT05GSUdfWDg2X0dFTkVSSUNBUkNICi1leHRlcm4gaW50IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpOwotZXh0ZXJuIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQkJCWNoYXIgKnByb2R1Y3RpZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BQ1BJCi0KLXN0YXRpYyBpbmxpbmUgaW50IGVzNzAwMF9jaGVja19kc2R0KHZvaWQpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX0RTRFQsIDAsICZoZWFkZXIpKSAmJgotCSAgICAhc3RybmNtcChoZWFkZXIub2VtX2lkLCAiVU5JU1lTIiwgNikpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX01QUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfd2FrZWNwdS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZXM3MDAwL21hY2hfd2FrZWNwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGZmNTgzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWVzNzAwMC9tYWNoX3dha2VjcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9XQUtFQ1BVX0gKLSNkZWZpbmUgX19BU01fTUFDSF9XQUtFQ1BVX0gKLQotLyogCi0gKiBUaGlzIGZpbGUgY29wZXMgd2l0aCBtYWNoaW5lcyB0aGF0IHdha2V1cCBzZWNvbmRhcnkgQ1BVcyBieSB0aGUKLSAqIElOSVQsIElOSVQsIFNUQVJUVVAgc2VxdWVuY2UuCi0gKi8KLQotI2lmZGVmIENPTkZJR19FUzcwMDBfQ0xVU1RFUkVEX0FQSUMKLSNkZWZpbmUgV0FLRV9TRUNPTkRBUllfVklBX01JUAotI2Vsc2UKLSNkZWZpbmUgV0FLRV9TRUNPTkRBUllfVklBX0lOSVQKLSNlbmRpZgotCi0jaWZkZWYgV0FLRV9TRUNPTkRBUllfVklBX01JUAotZXh0ZXJuIGludCBlczcwMDBfc3RhcnRfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZWlwKTsKLXN0YXRpYyBpbmxpbmUgaW50Ci13YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQotewotCWludCBib290X2Vycm9yID0gMDsKLQlib290X2Vycm9yID0gZXM3MDAwX3N0YXJ0X2NwdShwaHlzX2FwaWNpZCwgc3RhcnRfZWlwKTsKLQlyZXR1cm4gYm9vdF9lcnJvcjsKLX0KLSNlbmRpZgotCi0jZGVmaW5lIFRSQU1QT0xJTkVfTE9XIHBoeXNfdG9fdmlydCgweDQ2NykKLSNkZWZpbmUgVFJBTVBPTElORV9ISUdIIHBoeXNfdG9fdmlydCgweDQ2OSkKLQotI2RlZmluZSBib290X2NwdV9hcGljaWQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9pbml0X2RlYXNzZXJ0KGF0b21pY190ICpkZWFzc2VydCkKLXsKLSNpZmRlZiBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAotCXdoaWxlICghYXRvbWljX3JlYWQoZGVhc3NlcnQpKQotCQljcHVfcmVsYXgoKTsKLSNlbmRpZgotCXJldHVybjsKLX0KLQotLyogTm90aGluZyB0byBkbyBmb3IgbW9zdCBwbGF0Zm9ybXMsIHNpbmNlIGNsZWFyZWQgYnkgdGhlIElOSVQgY3ljbGUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWModm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX05NSV92ZWN0b3IodW5zaWduZWQgc2hvcnQgKmhpZ2gsIHVuc2lnbmVkIHNob3J0ICpsb3cpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX05NSV92ZWN0b3IodW5zaWduZWQgc2hvcnQgKmhpZ2gsIHVuc2lnbmVkIHNob3J0ICpsb3cpCi17Ci19Ci0KLSNpZiBBUElDX0RFQlVHCi0gI2RlZmluZSBpbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCkgX19pbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCkKLSNlbHNlCi0gI2RlZmluZSBpbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCkge30KLSNlbmRpZgotCi0jZW5kaWYgLyogX19BU01fTUFDSF9XQUtFQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvZ3Bpby5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9ncGlvLmgKaW5kZXggNTMwNWRjYi4uNmNlMGY3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9ncGlvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9ncGlvLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfR0VORVJJQ19HUElPX0gKLSNkZWZpbmUgX19BU01fTUFDSF9HRU5FUklDX0dQSU9fSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0dFTkVSSUNfX0dQSU9fSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0dFTkVSSUNfX0dQSU9fSAogCiBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOwpAQCAtMTIsNCArMTIsNCBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPiAgICAgICAgICAgLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KIAotI2VuZGlmIC8qIF9fQVNNX01BQ0hfR0VORVJJQ19HUElPX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX0dFTkVSSUNfX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9pcnFfdmVjdG9yc19saW1pdHMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvaXJxX3ZlY3RvcnNfbGltaXRzLmgKaW5kZXggODkwY2UzZi4uZjc4NzBlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9pcnFfdmVjdG9yc19saW1pdHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL2lycV92ZWN0b3JzX2xpbWl0cy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX0lSUV9WRUNUT1JTX0xJTUlUU19ICi0jZGVmaW5lIF9BU01fSVJRX1ZFQ1RPUlNfTElNSVRTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19JUlFfVkVDVE9SU19MSU1JVFNfSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0dFTkVSSUNfX0lSUV9WRUNUT1JTX0xJTUlUU19ICiAKIC8qCiAgKiBGb3IgU3VtbWl0IG9yIGdlbmVyaWMgKGkuZS4gaW5zdGFsbGVyKSBrZXJuZWxzLCB3ZSBoYXZlIGxvdHMgb2YgSS9PIEFQSUNzLApAQCAtMTEsNCArMTEsNCBAQAogI2RlZmluZSBOUl9JUlFTCTIyNAogI2RlZmluZSBOUl9JUlFfVkVDVE9SUwkxMDI0CiAKLSNlbmRpZiAvKiBfQVNNX0lSUV9WRUNUT1JTX0xJTUlUU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19JUlFfVkVDVE9SU19MSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljLmgKaW5kZXggNmVmZjM0My4uNWQwMTBjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL21hY2hfYXBpYy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNfSAotI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0dFTkVSSUNfX01BQ0hfQVBJQ19ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9BUElDX0gKIAogI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAKQEAgLTI5LDQgKzI5LDQgQEAKIAogZXh0ZXJuIHZvaWQgZ2VuZXJpY19iaWdzbXBfcHJvYmUodm9pZCk7CiAKLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0FQSUNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL21hY2hfYXBpY2RlZi5oCmluZGV4IDI4ZWQ5ODkuLjE2NTdmMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX2FwaWNkZWYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0dFTkFQSUNfTUFDSF9BUElDREVGX0gKLSNkZWZpbmUgX0dFTkFQSUNfTUFDSF9BUElDREVGX0ggMQorI2lmbmRlZiBBU01fWDg2X19NQUNIX0dFTkVSSUNfX01BQ0hfQVBJQ0RFRl9ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9BUElDREVGX0gKIAogI2lmbmRlZiBBUElDX0RFRklOSVRJT04KICNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgpAQCAtOCw0ICs4LDQgQEAKICNkZWZpbmUgQVBJQ19JRF9NQVNLIChnZW5hcGljLT5hcGljX2lkX21hc2spCiAjZW5kaWYKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19NQUNIX0FQSUNERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX2lwaS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX2lwaS5oCmluZGV4IDQ0MWIwZmUuLmY2NzQzM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9pcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL21hY2hfaXBpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9NQUNIX0lQSV9ICi0jZGVmaW5lIF9NQUNIX0lQSV9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19NQUNIX0lQSV9ICisjZGVmaW5lIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9JUElfSAogCiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KIApAQCAtNyw0ICs3LDQgQEAKICNkZWZpbmUgc2VuZF9JUElfYWxsYnV0c2VsZiAoZ2VuYXBpYy0+c2VuZF9JUElfYWxsYnV0c2VsZikKICNkZWZpbmUgc2VuZF9JUElfYWxsIChnZW5hcGljLT5zZW5kX0lQSV9hbGwpCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9JUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9tcHBhcnNlLmgKaW5kZXggNTg2Y2FkYi4uMzExNTU2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX21wcGFyc2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL21hY2hfbXBwYXJzZS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfTUFDSF9NUFBBUlNFX0gKLSNkZWZpbmUgX01BQ0hfTVBQQVJTRV9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19NQUNIX01QUEFSU0VfSAorI2RlZmluZSBBU01fWDg2X19NQUNIX0dFTkVSSUNfX01BQ0hfTVBQQVJTRV9ICiAKIAogZXh0ZXJuIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLApAQCAtNyw0ICs3LDQgQEAKIAogZXh0ZXJuIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19NQUNIX01QUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX21wc3BlYy5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtZ2VuZXJpYy9tYWNoX21wc3BlYy5oCmluZGV4IGM4M2MxMjAuLjYwNjFiMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLWdlbmVyaWMvbWFjaF9tcHNwZWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1nZW5lcmljL21hY2hfbXBzcGVjLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfTVBTUEVDX0gKLSNkZWZpbmUgX19BU01fTUFDSF9NUFNQRUNfSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX0dFTkVSSUNfX01BQ0hfTVBTUEVDX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTUFDSF9HRU5FUklDX19NQUNIX01QU1BFQ19ICiAKICNkZWZpbmUgTUFYX0lSUV9TT1VSQ0VTIDI1NgogCkBAIC05LDQgKzksNCBAQAogCiBleHRlcm4gdm9pZCBudW1hcV9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAogCQkJCWNoYXIgKnByb2R1Y3RpZCk7Ci0jZW5kaWYgLyogX19BU01fTUFDSF9NUFNQRUNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01BQ0hfR0VORVJJQ19fTUFDSF9NUFNQRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtbnVtYXEvbWFjaF9hcGljLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX2FwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwMjQ2NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX2FwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfQVBJQ19ICi0jZGVmaW5lIF9fQVNNX01BQ0hfQVBJQ19ICi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotCi0jZGVmaW5lIEFQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQotCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQotewotCXJldHVybiBDUFVfTUFTS19BTEw7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0NQVVMgKHRhcmdldF9jcHVzKCkpCi0KLSNkZWZpbmUgTk9fQkFMQU5DRV9JUlEgKDEpCi0jZGVmaW5lIGVzcl9kaXNhYmxlICgxKQotCi0jZGVmaW5lIElOVF9ERUxJVkVSWV9NT0RFIGRlc3RfTG93ZXN0UHJpbwotI2RlZmluZSBJTlRfREVTVF9NT0RFIDAgICAgIC8qIHBoeXNpY2FsIGRlbGl2ZXJ5IG9uIExPQ0FMIHF1YWQgKi8KLSAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfdXNlZChwaHlzaWRfbWFza190IGJpdG1hcCwgaW50IGFwaWNpZCkKLXsKLQlyZXR1cm4gcGh5c2lkX2lzc2V0KGFwaWNpZCwgYml0bWFwKTsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KQotewotCXJldHVybiBwaHlzaWRfaXNzZXQoYml0LCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci19Ci0jZGVmaW5lIGFwaWNpZF9jbHVzdGVyKGFwaWNpZCkgKGFwaWNpZCAmIDB4RjApCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hcGljX2xkcih2b2lkKQotewotCS8qIEFscmVhZHkgZG9uZSBpbiBOVU1BLVEgZmlybXdhcmUgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2FwaWNfcm91dGluZyh2b2lkKQotewotCXByaW50aygiRW5hYmxpbmcgQVBJQyBtb2RlOiAgJXMuICBVc2luZyAlZCBJL08gQVBJQ3NcbiIsCi0JCSJOVU1BLVEiLCBucl9pb2FwaWNzKTsKLX0KLQotLyoKLSAqIFNraXAgYWRkaW5nIHRoZSB0aW1lciBpbnQgb24gc2Vjb25kYXJ5IG5vZGVzLCB3aGljaCBjYXVzZXMKLSAqIGEgc21hbGwgYnV0IHBhaW5mdWwgcmlmdCBpbiB0aGUgdGltZS1zcGFjZSBjb250aW51dW0uCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG11bHRpX3RpbWVyX2NoZWNrKGludCBhcGljLCBpbnQgaXJxKQotewotCXJldHVybiBhcGljICE9IDAgJiYgaXJxID09IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBpb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCBwaHlzX21hcCkKLXsKLQkvKiBXZSBkb24ndCBoYXZlIGEgZ29vZCB3YXkgdG8gZG8gdGhpcyB5ZXQgLSBoYWNrICovCi0JcmV0dXJuIHBoeXNpZHNfcHJvbW90ZSgweEZVTCk7Ci19Ci0KLS8qIE1hcHBpbmcgZnJvbSBjcHUgbnVtYmVyIHRvIGxvZ2ljYWwgYXBpY2lkICovCi1leHRlcm4gdTggY3B1XzJfbG9naWNhbF9hcGljaWRbXTsKLXN0YXRpYyBpbmxpbmUgaW50IGNwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQotewotICAgICAgIGlmIChjcHUgPj0gTlJfQ1BVUykKLQkgICAgICAgcmV0dXJuIEJBRF9BUElDSUQ7Ci0JcmV0dXJuIChpbnQpY3B1XzJfbG9naWNhbF9hcGljaWRbY3B1XTsKLX0KLQotLyoKLSAqIFN1cHBvcnRpbmcgb3ZlciA2MCBjcHVzIG9uIE5VTUEtUSByZXF1aXJlcyBhIGxvY2FsaXR5LWRlcGVuZGVudAotICogY3B1IHRvIEFQSUMgSUQgcmVsYXRpb24gdG8gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCB0aGUgaW50ZWxsaWdlbnQKLSAqIG1vZGUgb2YgdGhlIGNsdXN0ZXIgY29udHJvbGxlci4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQotewotCWlmIChtcHNfY3B1IDwgNjApCi0JCXJldHVybiAoKG1wc19jcHUgPj4gMikgPDwgNCkgfCAoMSA8PCAobXBzX2NwdSAmIDB4MykpOwotCWVsc2UKLQkJcmV0dXJuIEJBRF9BUElDSUQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkgCi17Ci0JcmV0dXJuIGxvZ2ljYWxfYXBpY2lkID4+IDQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBhcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IGxvZ2ljYWxfYXBpY2lkKQotewotCWludCBub2RlID0gYXBpY2lkX3RvX25vZGUobG9naWNhbF9hcGljaWQpOwotCWludCBjcHUgPSBfX2Zmcyhsb2dpY2FsX2FwaWNpZCAmIDB4Zik7Ci0KLQlyZXR1cm4gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGNwdSArIDQqbm9kZSk7Ci19Ci0KLWV4dGVybiB2b2lkICp4cXVhZF9wb3J0aW87Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9wb3J0aW9fcmVtYXAodm9pZCkKLXsKLQlpbnQgbnVtX3F1YWRzID0gbnVtX29ubGluZV9ub2RlcygpOwotCi0JaWYgKG51bV9xdWFkcyA8PSAxKQotICAgICAgIAkJcmV0dXJuOwotCi0JcHJpbnRrKCJSZW1hcHBpbmcgY3Jvc3MtcXVhZCBwb3J0IEkvTyBmb3IgJWQgcXVhZHNcbiIsIG51bV9xdWFkcyk7Ci0JeHF1YWRfcG9ydGlvID0gaW9yZW1hcChYUVVBRF9QT1JUSU9fQkFTRSwgbnVtX3F1YWRzKlhRVUFEX1BPUlRJT19RVUFEKTsKLQlwcmludGsoInhxdWFkX3BvcnRpbyB2YWRkciAweCUwOGx4LCBsZW4gJTA4bHhcbiIsCi0JCSh1X2xvbmcpIHhxdWFkX3BvcnRpbywgKHVfbG9uZykgbnVtX3F1YWRzKlhRVUFEX1BPUlRJT19RVUFEKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudChpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKQotewotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfYXBpY19tb2RlKHZvaWQpCi17Ci19Ci0KLS8qCi0gKiBXZSB1c2UgcGh5c2ljYWwgYXBpY2lkcyBoZXJlLCBub3QgbG9naWNhbCwgc28ganVzdCByZXR1cm4gdGhlIGRlZmF1bHQKLSAqIHBoeXNpY2FsIGJyb2FkY2FzdCB0byBzdG9wIHBlb3BsZSBmcm9tIGJyZWFraW5nIHVzCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKLXsKLQlyZXR1cm4gKGludCkgMHhGOwotfQotCi0vKiBObyBOVU1BLVEgYm94IGhhcyBhIEhUIENQVSwgYnV0IGl0IGNhbid0IGh1cnQgdG8gdXNlIHRoZSBkZWZhdWx0IGNvZGUuICovCi1zdGF0aWMgaW5saW5lIHUzMiBwaHlzX3BrZ19pZCh1MzIgY3B1aWRfYXBpYywgaW50IGluZGV4X21zYikKLXsKLQlyZXR1cm4gY3B1aWRfYXBpYyA+PiBpbmRleF9tc2I7Ci19Ci0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0FQSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtbnVtYXEvbWFjaF9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX2FwaWNkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0MzlkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX2FwaWNkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9BUElDREVGX0gKLSNkZWZpbmUgX19BU01fTUFDSF9BUElDREVGX0gKLQotCi0jZGVmaW5lIEFQSUNfSURfTUFTSyAoMHhGPDwyNCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCi17Ci0JICAgICAgICByZXR1cm4gKCgoeCk+PjI0KSYweDBGKTsKLX0KLQotI2RlZmluZSAgICAgICAgIEdFVF9BUElDX0lEKHgpICBnZXRfYXBpY19pZCh4KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfaXBpLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX2lwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA0NDQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfaXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfSVBJX0gKLSNkZWZpbmUgX19BU01fTUFDSF9JUElfSAotCi12b2lkIHNlbmRfSVBJX21hc2tfc2VxdWVuY2UoY3B1bWFza190LCBpbnQgdmVjdG9yKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX21hc2soY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpCi17Ci0Jc2VuZF9JUElfbWFza19zZXF1ZW5jZShtYXNrLCB2ZWN0b3IpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQotewotCWNwdW1hc2tfdCBtYXNrID0gY3B1X29ubGluZV9tYXA7Ci0JY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgbWFzayk7Ci0KLQlpZiAoIWNwdXNfZW1wdHkobWFzaykpCi0JCXNlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQotewotCXNlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXAsIHZlY3Rvcik7Ci19Ci0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0lQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfbXBwYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZhZWY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfbXBwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfTVBQQVJTRV9ICi0jZGVmaW5lIF9fQVNNX01BQ0hfTVBQQVJTRV9ICi0KLWV4dGVybiB2b2lkIG51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCi0JCQkJY2hhciAqcHJvZHVjdGlkKTsKLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfTVBQQVJTRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1udW1hcS9tYWNoX3dha2VjcHUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfd2FrZWNwdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUzMDA0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLW51bWFxL21hY2hfd2FrZWNwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX1dBS0VDUFVfSAotI2RlZmluZSBfX0FTTV9NQUNIX1dBS0VDUFVfSAotCi0vKiBUaGlzIGZpbGUgY29wZXMgd2l0aCBtYWNoaW5lcyB0aGF0IHdha2V1cCBzZWNvbmRhcnkgQ1BVcyBieSBOTUlzICovCi0KLSNkZWZpbmUgV0FLRV9TRUNPTkRBUllfVklBX05NSQotCi0jZGVmaW5lIFRSQU1QT0xJTkVfTE9XIHBoeXNfdG9fdmlydCgweDgpCi0jZGVmaW5lIFRSQU1QT0xJTkVfSElHSCBwaHlzX3RvX3ZpcnQoMHhhKQotCi0jZGVmaW5lIGJvb3RfY3B1X2FwaWNpZCBib290X2NwdV9sb2dpY2FsX2FwaWNpZAotCi0vKiBXZSBkb24ndCBkbyBhbnl0aGluZyBoZXJlIGJlY2F1c2Ugd2UgdXNlIE5NSSdzIHRvIGJvb3QgaW5zdGVhZCAqLwotc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2luaXRfZGVhc3NlcnQoYXRvbWljX3QgKmRlYXNzZXJ0KQotewotfQotCi0vKgotICogQmVjYXVzZSB3ZSB1c2UgTk1JcyByYXRoZXIgdGhhbiB0aGUgSU5JVC1TVEFSVFVQIHNlcXVlbmNlIHRvCi0gKiBib290c3RyYXAgdGhlIENQVXMsIHRoZSBBUElDIG1heSBiZSBpbiBhIHdlaXJkIHN0YXRlLiBLaWNrIGl0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljKHZvaWQpCi17Ci0JY2xlYXJfbG9jYWxfQVBJQygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfTk1JX3ZlY3Rvcih1bnNpZ25lZCBzaG9ydCAqaGlnaCwgdW5zaWduZWQgc2hvcnQgKmxvdykKLXsKLQlwcmludGsoIlN0b3JpbmcgTk1JIHZlY3RvclxuIik7Ci0JKmhpZ2ggPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBUUkFNUE9MSU5FX0hJR0gpOwotCSpsb3cgPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBUUkFNUE9MSU5FX0xPVyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX05NSV92ZWN0b3IodW5zaWduZWQgc2hvcnQgKmhpZ2gsIHVuc2lnbmVkIHNob3J0ICpsb3cpCi17Ci0JcHJpbnRrKCJSZXN0b3JpbmcgTk1JIHZlY3RvclxuIik7Ci0JKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgVFJBTVBPTElORV9ISUdIKSA9ICpoaWdoOwotCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIFRSQU1QT0xJTkVfTE9XKSA9ICpsb3c7Ci19Ci0KLSNkZWZpbmUgaW5xdWlyZV9yZW1vdGVfYXBpYyhhcGljaWQpIHt9Ci0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX1dBS0VDUFVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtcmRjMzIxeC9ncGlvLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1yZGMzMjF4L2dwaW8uaAppbmRleCBhY2NlMGI3Li45NGI2Y2RmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1yZGMzMjF4L2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1yZGMzMjF4L2dwaW8uaApAQCAtMSw1ICsxLDcgQEAKLSNpZm5kZWYgX1JEQzMyMVhfR1BJT19ICi0jZGVmaW5lIF9SREMzMjFYX0dQSU9fSAorI2lmbmRlZiBBU01fWDg2X19NQUNIX1JEQzMyMVhfX0dQSU9fSAorI2RlZmluZSBBU01fWDg2X19NQUNIX1JEQzMyMVhfX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKIGV4dGVybiBpbnQgcmRjX2dwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pOwogZXh0ZXJuIHZvaWQgcmRjX2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CkBAIC0xOCw2ICsyMCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKIHsKKwltaWdodF9zbGVlcCgpOwogCXJkY19ncGlvX2ZyZWUoZ3Bpbyk7CiB9CiAKQEAgLTU0LDQgKzU3LDQgQEAKIC8qIEZvciBjYW5zbGVlcCAqLwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAotI2VuZGlmIC8qIF9SREMzMjFYX0dQSU9fSF8gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQUNIX1JEQzMyMVhfX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfYXBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDdlMmFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLXN1bW1pdC9tYWNoX2FwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfQVBJQ19ICi0jZGVmaW5lIF9fQVNNX01BQ0hfQVBJQ19ICi0KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0KLSNkZWZpbmUgZXNyX2Rpc2FibGUgKDEpCi0jZGVmaW5lIE5PX0JBTEFOQ0VfSVJRICgwKQotCi0vKiBJbiBjbHVzdGVyZWQgbW9kZSwgdGhlIGhpZ2ggbmliYmxlIG9mIEFQSUMgSUQgaXMgYSBjbHVzdGVyIG51bWJlci4KLSAqIFRoZSBsb3cgbmliYmxlIGlzIGEgNC1iaXQgYml0bWFwLiAqLwotI2RlZmluZSBYQVBJQ19ERVNUX0NQVVNfU0hJRlQJNAotI2RlZmluZSBYQVBJQ19ERVNUX0NQVVNfTUFTSwkoKDF1IDw8IFhBUElDX0RFU1RfQ1BVU19TSElGVCkgLSAxKQotI2RlZmluZSBYQVBJQ19ERVNUX0NMVVNURVJfTUFTSwkoWEFQSUNfREVTVF9DUFVTX01BU0sgPDwgWEFQSUNfREVTVF9DUFVTX1NISUZUKQotCi0jZGVmaW5lIEFQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQotCi1zdGF0aWMgaW5saW5lIGNwdW1hc2tfdCB0YXJnZXRfY3B1cyh2b2lkKQotewotCS8qIENQVV9NQVNLX0FMTCAoMHhmZikgaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aAotCSAqIGRlc3RfTG93ZXN0UHJpbyBtb2RlIGxvZ2ljYWwgY2x1c3RlcmVkIGFwaWMgaW50ZXJydXB0IHJvdXRpbmcKLQkgKiBKdXN0IHN0YXJ0IG9uIGNwdSAwLiAgSVJRIGJhbGFuY2luZyB3aWxsIHNwcmVhZCBsb2FkCi0JICovCi0JcmV0dXJuIGNwdW1hc2tfb2ZfY3B1KDApOwotfSAKLSNkZWZpbmUgVEFSR0VUX0NQVVMJKHRhcmdldF9jcHVzKCkpCi0KLSNkZWZpbmUgSU5UX0RFTElWRVJZX01PREUgKGRlc3RfTG93ZXN0UHJpbykKLSNkZWZpbmUgSU5UX0RFU1RfTU9ERSAxICAgICAvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgcHJvY3MgKi8KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoZWNrX2FwaWNpZF91c2VkKHBoeXNpZF9tYXNrX3QgYml0bWFwLCBpbnQgYXBpY2lkKQotewotCXJldHVybiAwOwotfSAKLQotLyogd2UgZG9uJ3QgdXNlIHRoZSBwaHlzX2NwdV9wcmVzZW50X21hcCB0byBpbmRpY2F0ZSBhcGljaWQgcHJlc2VuY2UgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjaGVja19hcGljaWRfcHJlc2VudChpbnQgYml0KSAKLXsKLQlyZXR1cm4gMTsKLX0KLQotI2RlZmluZSBhcGljaWRfY2x1c3RlcihhcGljaWQpICgoYXBpY2lkKSAmIFhBUElDX0RFU1RfQ0xVU1RFUl9NQVNLKQotCi1leHRlcm4gdTggY3B1XzJfbG9naWNhbF9hcGljaWRbXTsKLQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfYXBpY19sZHIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHZhbCwgaWQ7Ci0JaW50IGNvdW50ID0gMDsKLQl1OCBteV9pZCA9ICh1OCloYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQl1OCBteV9jbHVzdGVyID0gKHU4KWFwaWNpZF9jbHVzdGVyKG15X2lkKTsKLSNpZmRlZiBDT05GSUdfU01QCi0JdTggbGlkOwotCWludCBpOwotCi0JLyogQ3JlYXRlIGxvZ2ljYWwgQVBJQyBJRHMgYnkgY291bnRpbmcgQ1BVcyBhbHJlYWR5IGluIGNsdXN0ZXIuICovCi0JZm9yIChjb3VudCA9IDAsIGkgPSBOUl9DUFVTOyAtLWkgPj0gMDsgKSB7Ci0JCWxpZCA9IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW2ldOwotCQlpZiAobGlkICE9IEJBRF9BUElDSUQgJiYgYXBpY2lkX2NsdXN0ZXIobGlkKSA9PSBteV9jbHVzdGVyKQotCQkJKytjb3VudDsKLQl9Ci0jZW5kaWYKLQkvKiBXZSBvbmx5IGhhdmUgYSA0IHdpZGUgYml0bWFwIGluIGNsdXN0ZXIgbW9kZS4gIElmIGEgZGVyYW5nZWQKLQkgKiBCSU9TIHB1dHMgNSBDUFVzIGluIG9uZSBBUElDIGNsdXN0ZXIsIHdlJ3JlIGhvc2VkLiAqLwotCUJVR19PTihjb3VudCA+PSBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpOwotCWlkID0gbXlfY2x1c3RlciB8ICgxVUwgPDwgY291bnQpOwotCWFwaWNfd3JpdGUoQVBJQ19ERlIsIEFQSUNfREZSX1ZBTFVFKTsKLQl2YWwgPSBhcGljX3JlYWQoQVBJQ19MRFIpICYgfkFQSUNfTERSX01BU0s7Ci0JdmFsIHw9IFNFVF9BUElDX0xPR0lDQUxfSUQoaWQpOwotCWFwaWNfd3JpdGUoQVBJQ19MRFIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG11bHRpX3RpbWVyX2NoZWNrKGludCBhcGljLCBpbnQgaXJxKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2FwaWNfcm91dGluZyh2b2lkKQotewotCXByaW50aygiRW5hYmxpbmcgQVBJQyBtb2RlOiAgU3VtbWl0LiAgVXNpbmcgJWQgSS9PIEFQSUNzXG4iLAotCQkJCQkJbnJfaW9hcGljcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JcmV0dXJuIGFwaWNpZF8yX25vZGVbaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCldOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKiBNYXBwaW5nIGZyb20gY3B1IG51bWJlciB0byBsb2dpY2FsIGFwaWNpZCAqLwotc3RhdGljIGlubGluZSBpbnQgY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotICAgICAgIGlmIChjcHUgPj0gTlJfQ1BVUykKLQkgICAgICAgcmV0dXJuIEJBRF9BUElDSUQ7Ci0JcmV0dXJuIChpbnQpY3B1XzJfbG9naWNhbF9hcGljaWRbY3B1XTsKLSNlbHNlCi0JcmV0dXJuIGxvZ2ljYWxfc21wX3Byb2Nlc3Nvcl9pZCgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKLXsKLQlpZiAobXBzX2NwdSA8IE5SX0NQVVMpCi0JCXJldHVybiAoaW50KXBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgbXBzX2NwdSk7Ci0JZWxzZQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLX0KLQotc3RhdGljIGlubGluZSBwaHlzaWRfbWFza190IGlvYXBpY19waHlzX2lkX21hcChwaHlzaWRfbWFza190IHBoeXNfaWRfbWFwKQotewotCS8qIEZvciBjbHVzdGVyZWQgd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgeWV0IC0gaGFjayAqLwotCXJldHVybiBwaHlzaWRzX3Byb21vdGUoMHgwRik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBhcGljaWRfdG9fY3B1X3ByZXNlbnQoaW50IGFwaWNpZCkKLXsKLQlyZXR1cm4gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGFwaWNpZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9wb3J0aW9fcmVtYXAodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudChpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2FwaWNfbW9kZSh2b2lkKQotewotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVfbWFza190b19hcGljaWQoY3B1bWFza190IGNwdW1hc2spCi17Ci0JaW50IG51bV9iaXRzX3NldDsKLQlpbnQgY3B1c19mb3VuZCA9IDA7Ci0JaW50IGNwdTsKLQlpbnQgYXBpY2lkOwkKLQotCW51bV9iaXRzX3NldCA9IGNwdXNfd2VpZ2h0KGNwdW1hc2spOwotCS8qIFJldHVybiBpZCB0byBhbGwgKi8KLQlpZiAobnVtX2JpdHNfc2V0ID09IE5SX0NQVVMpCi0JCXJldHVybiAoaW50KSAweEZGOwotCS8qIAotCSAqIFRoZSBjcHVzIGluIHRoZSBtYXNrIG11c3QgYWxsIGJlIG9uIHRoZSBhcGljIGNsdXN0ZXIuICBJZiBhcmUgbm90IAotCSAqIG9uIHRoZSBzYW1lIGFwaWNpZCBjbHVzdGVyIHJldHVybiBkZWZhdWx0IHZhbHVlIG9mIFRBUkdFVF9DUFVTLiAKLQkgKi8KLQljcHUgPSBmaXJzdF9jcHUoY3B1bWFzayk7Ci0JYXBpY2lkID0gY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7Ci0Jd2hpbGUgKGNwdXNfZm91bmQgPCBudW1fYml0c19zZXQpIHsKLQkJaWYgKGNwdV9pc3NldChjcHUsIGNwdW1hc2spKSB7Ci0JCQlpbnQgbmV3X2FwaWNpZCA9IGNwdV90b19sb2dpY2FsX2FwaWNpZChjcHUpOwotCQkJaWYgKGFwaWNpZF9jbHVzdGVyKGFwaWNpZCkgIT0gCi0JCQkJCWFwaWNpZF9jbHVzdGVyKG5ld19hcGljaWQpKXsKLQkJCQlwcmludGsgKCIlczogTm90IGEgdmFsaWQgbWFzayFcbiIsX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gMHhGRjsKLQkJCX0KLQkJCWFwaWNpZCA9IGFwaWNpZCB8IG5ld19hcGljaWQ7Ci0JCQljcHVzX2ZvdW5kKys7Ci0JCX0KLQkJY3B1Kys7Ci0JfQotCXJldHVybiBhcGljaWQ7Ci19Ci0KLS8qIGNwdWlkIHJldHVybnMgdGhlIHZhbHVlIGxhdGNoZWQgaW4gdGhlIEhXIGF0IHJlc2V0LCBub3QgdGhlIEFQSUMgSUQKLSAqIHJlZ2lzdGVyJ3MgdmFsdWUuICBGb3IgYW55IGJveCB3aG9zZSBCSU9TIGNoYW5nZXMgQVBJQyBJRHMsIGxpa2UKLSAqIGNsdXN0ZXJlZCBBUElDIHN5c3RlbXMsIHdlIG11c3QgdXNlIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZC4KLSAqCi0gKiBTZWUgSW50ZWwncyBJQS0zMiBTVyBEZXYncyBNYW51YWwgVm9sMiB1bmRlciBDUFVJRC4KLSAqLwotc3RhdGljIGlubGluZSB1MzIgcGh5c19wa2dfaWQodTMyIGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCi17Ci0JcmV0dXJuIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpID4+IGluZGV4X21zYjsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1zdW1taXQvbWFjaF9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1zdW1taXQvbWFjaF9hcGljZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGFiNWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfYXBpY2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9NQUNIX0FQSUNERUZfSAotI2RlZmluZSBfX0FTTV9NQUNIX0FQSUNERUZfSAotCi0jZGVmaW5lCQlBUElDX0lEX01BU0sJCSgweEZGPDwyNCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpIAoteyAKLQlyZXR1cm4gKCgoeCk+PjI0KSYweEZGKTsKLX0gCi0KLSNkZWZpbmUJCUdFVF9BUElDX0lEKHgpCWdldF9hcGljX2lkKHgpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfaXBpLmggYi9pbmNsdWRlL2FzbS14ODYvbWFjaC1zdW1taXQvbWFjaF9pcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwNGM1My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbWFjaC1zdW1taXQvbWFjaF9pcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpZm5kZWYgX19BU01fTUFDSF9JUElfSAotI2RlZmluZSBfX0FTTV9NQUNIX0lQSV9ICi0KLXZvaWQgc2VuZF9JUElfbWFza19zZXF1ZW5jZShjcHVtYXNrX3QgbWFzaywgaW50IHZlY3Rvcik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9tYXNrKGNwdW1hc2tfdCBtYXNrLCBpbnQgdmVjdG9yKQotewotCXNlbmRfSVBJX21hc2tfc2VxdWVuY2UobWFzaywgdmVjdG9yKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKLXsKLQljcHVtYXNrX3QgbWFzayA9IGNwdV9vbmxpbmVfbWFwOwotCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIG1hc2spOwotCi0JaWYgKCFjcHVzX2VtcHR5KG1hc2spKQotCQlzZW5kX0lQSV9tYXNrKG1hc2ssIHZlY3Rvcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKLXsKLQlzZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFwLCB2ZWN0b3IpOwotfQotCi0jZW5kaWYgLyogX19BU01fTUFDSF9JUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oIGIvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY1OTE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYWNoLXN1bW1pdC9tYWNoX21wcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX01BQ0hfTVBQQVJTRV9ICi0jZGVmaW5lIF9fQVNNX01BQ0hfTVBQQVJTRV9ICi0KLSNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KLSNpbmNsdWRlIDxhc20vdHNjLmg+Ci0KLWV4dGVybiBpbnQgdXNlX2N5Y2xvbmU7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X1NVTU1JVF9OVU1BCi1leHRlcm4gdm9pZCBzZXR1cF9zdW1taXQodm9pZCk7Ci0jZWxzZQotI2RlZmluZSBzZXR1cF9zdW1taXQoKQl7fQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sIAotCQljaGFyICpwcm9kdWN0aWQpCi17Ci0JaWYgKCFzdHJuY21wKG9lbSwgIklCTSBFTlNXIiwgOCkgJiYgCi0JCQkoIXN0cm5jbXAocHJvZHVjdGlkLCAiVklHSUwgU01QIiwgOSkgCi0JCQkgfHwgIXN0cm5jbXAocHJvZHVjdGlkLCAiRVhBIiwgMykKLQkJCSB8fCAhc3RybmNtcChwcm9kdWN0aWQsICJSVVRITEVTUyBTTVAiLCAxMikpKXsKLQkJbWFya190c2NfdW5zdGFibGUoIlN1bW1pdCBiYXNlZCBzeXN0ZW0iKTsKLQkJdXNlX2N5Y2xvbmUgPSAxOyAvKmVuYWJsZSBjeWNsb25lLXRpbWVyKi8KLQkJc2V0dXBfc3VtbWl0KCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogSG9vayBmcm9tIGdlbmVyaWMgQUNQSSB0YWJsZXMuYyAqLwotc3RhdGljIGlubGluZSBpbnQgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKLXsKLQlpZiAoIXN0cm5jbXAob2VtX2lkLCAiSUJNIiwgMykgJiYKLQkgICAgKCFzdHJuY21wKG9lbV90YWJsZV9pZCwgIlNFUlZJR0lMIiwgOCkKLQkgICAgIHx8ICFzdHJuY21wKG9lbV90YWJsZV9pZCwgIkVYQSIsIDMpKSl7Ci0JCW1hcmtfdHNjX3Vuc3RhYmxlKCJTdW1taXQgYmFzZWQgc3lzdGVtIik7Ci0JCXVzZV9jeWNsb25lID0gMTsgLyplbmFibGUgY3ljbG9uZS10aW1lciovCi0JCXNldHVwX3N1bW1pdCgpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCByaW9fdGFibGVfaGRyIHsKLQl1bnNpZ25lZCBjaGFyIHZlcnNpb247ICAgICAgLyogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAzIGFkZHMgY2hhc3Npc19udW0gJiBXUF9pbmRleCAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBjaGFyIG51bV9zY2FsX2RldjsgLyogIyBvZiBTY2FsYWJpbGl0eSBkZXZpY2VzIChUd2lzdGVycyBmb3IgVmlnaWwpICAgKi8KLQl1bnNpZ25lZCBjaGFyIG51bV9yaW9fZGV2OyAgLyogIyBvZiBSSU8gSS9PIGRldmljZXMgKEN5Y2xvbmVzIGFuZCBXaW5uaXBlZ3MpICAgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBzY2FsX2RldGFpbCB7Ci0JdW5zaWduZWQgY2hhciBub2RlX2lkOyAgICAgIC8qIFNjYWxhYmlsaXR5IE5vZGUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZyBDQkFSOyAgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MG5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MHBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0MW5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkYgPSBOb25lICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MXBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0Mm5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkYgPSBOb25lICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MnBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBjaGFzc2lzX251bTsgIC8qIDEgYmFzZWQgQ2hhc3NpcyBudW1iZXIgKDEgPSBib290IG5vZGUpICAgICAgICAgICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgcmlvX2RldGFpbCB7Ci0JdW5zaWduZWQgY2hhciBub2RlX2lkOyAgICAgIC8qIFJJTyBOb2RlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgbG9uZyBCQkFSOyAgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciB0eXBlOyAgICAgICAgIC8qIFR5cGUgb2YgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBvd25lcl9pZDsgICAgIC8qIEZvciBXUEVHOiBOb2RlIElEIG9mIEN5Y2xvbmUgdGhhdCBvd25zIHRoaXMgV1BFRyovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBOb2RlIElEIG9mIFR3aXN0ZXIgdGhhdCBvd25zIHRoaXMgQ1lDICovCi0JdW5zaWduZWQgY2hhciBwb3J0MG5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MHBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBwb3J0MW5vZGU7ICAgIC8qIE5vZGUgSUQgcG9ydCBjb25uZWN0ZWQgdG86IDB4RkY9Tm9uZSAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBwb3J0MXBvcnQ7ICAgIC8qIFBvcnQgbnVtIHBvcnQgY29ubmVjdGVkIHRvOiAwLDEsMiwgb3IgMHhGRj1Ob25lICovCi0JdW5zaWduZWQgY2hhciBmaXJzdF9zbG90OyAgIC8qIEZvciBXUEVHOiBMb3dlc3Qgc2xvdCBudW1iZXIgYmVsb3cgdGhpcyBXUEVHICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBzdGF0dXM7ICAgICAgIC8qIEZvciBXUEVHOiBCaXQgMCA9IDEgOiB0aGUgWEFQSUMgaXMgdXNlZCAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICA9IDAgOiB0aGUgWEFQSUMgaXMgbm90IHVzZWQsIGllOiovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgaW50cyBmd2RlZCB0byBhbm90aGVyIFhBUElDICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICBCaXRzMTo3IFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBCaXRzMDo3IFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBXUF9pbmRleDsgICAgIC8qIEZvciBXUEVHOiBXUEVHIGluc3RhbmNlIGluZGV4IC0gbG93ZXIgb25lcyBoYXZlICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICBsb3dlciBzbG90IG51bWJlcnMvUENJIGJ1cyBudW1iZXJzICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBDWUM6ICBObyBtZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgY2hhciBjaGFzc2lzX251bTsgIC8qIDEgYmFzZWQgQ2hhc3NpcyBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBMb29rT3V0IFdQRUdzIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4cGFuc2lvbiBDaGFzc2lzICMsIGVudW1lcmF0ZWQgZnJvbSBCb290ICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vZGUgV1BFRyBleHRlcm5hbCBwb3J0LCB0aGVuIEJvb3QgTm9kZSBDWUMgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHBvcnQsIHRoZW4gTmV4dCBWaWdpbCBjaGFzc2lzIFdQRUcgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHBvcnQsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoYXJlZCBMb29rb3V0cyBoYXZlIG9ubHkgMSBjaGFzc2lzIG51bWJlciAodGhlICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IG9uZSBhc3NpZ25lZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLXR5cGVkZWYgZW51bSB7Ci0JQ29tcGF0VHdpc3RlciA9IDAsICAvKiBDb21wYXRpYmlsaXR5IFR3aXN0ZXIgICAgICAgICAgICAgICAqLwotCUFsdFR3aXN0ZXIgICAgPSAxLCAgLyogQWx0ZXJuYXRlIFR3aXN0ZXIgb2YgaW50ZXJuYWwgOC13YXkgKi8KLQlDb21wYXRDeWNsb25lID0gMiwgIC8qIENvbXBhdGliaWxpdHkgQ3ljbG9uZSAgICAgICAgICAgICAgICovCi0JQWx0Q3ljbG9uZSAgICA9IDMsICAvKiBBbHRlcm5hdGUgQ3ljbG9uZSBvZiBpbnRlcm5hbCA4LXdheSAqLwotCUNvbXBhdFdQRUcgICAgPSA0LCAgLyogQ29tcGF0aWJpbGl0eSBXUEVHICAgICAgICAgICAgICAgICAgKi8KLQlBbHRXUEVHICAgICAgID0gNSwgIC8qIFNlY29uZCBQbGFuYXIgV1BFRyAgICAgICAgICAgICAgICAgICovCi0JTG9va091dEFXUEVHICA9IDYsICAvKiBMb29rT3V0IFdQRUcgICAgICAgICAgICAgICAgICAgICAgICAqLwotCUxvb2tPdXRCV1BFRyAgPSA3LCAgLyogTG9va091dCBXUEVHICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gbm9kZV90eXBlOwotCi1zdGF0aWMgaW5saW5lIGludCBpc19XUEVHKHN0cnVjdCByaW9fZGV0YWlsICpyaW8pewotCXJldHVybiAocmlvLT50eXBlID09IENvbXBhdFdQRUcgfHwgcmlvLT50eXBlID09IEFsdFdQRUcgfHwKLQkJcmlvLT50eXBlID09IExvb2tPdXRBV1BFRyB8fCByaW8tPnR5cGUgPT0gTG9va091dEJXUEVHKTsKLX0KLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfTVBQQVJTRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWF0aF9lbXUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tYXRoX2VtdS5oCmluZGV4IDliZjRhZTkuLjU3NjhkOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tYXRoX2VtdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tYXRoX2VtdS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfSTM4Nl9NQVRIX0VNVV9ICi0jZGVmaW5lIF9JMzg2X01BVEhfRU1VX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTUFUSF9FTVVfSAorI2RlZmluZSBBU01fWDg2X19NQVRIX0VNVV9ICiAKIC8qIFRoaXMgc3RydWN0dXJlIG1hdGNoZXMgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBzYXZlZCB0byB0aGUgc3RhY2sKICAgIGZvbGxvd2luZyBhIGRldmljZS1ub3QtcHJlc2VudCBpbnRlcnJ1cHQsIHBhcnQgb2YgaXQgc2F2ZWQKQEAgLTI4LDQgKzI4LDQgQEAKIAlsb25nIF9fX3ZtODZfZnM7CiAJbG9uZyBfX192bTg2X2dzOwogfTsKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01BVEhfRU1VX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tYzE0NjgxOHJ0Yy5oIGIvaW5jbHVkZS9hc20teDg2L21jMTQ2ODE4cnRjLmgKaW5kZXggZGFmMWNjZC4uYTk5NWYzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21jMTQ2ODE4cnRjLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21jMTQ2ODE4cnRjLmgKQEAgLTEsOCArMSw4IEBACiAvKgogICogTWFjaGluZSBkZXBlbmRlbnQgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgUlRDIHJlZ2lzdGVycy4KICAqLwotI2lmbmRlZiBfQVNNX01DMTQ2ODE4UlRDX0gKLSNkZWZpbmUgX0FTTV9NQzE0NjgxOFJUQ19ICisjaWZuZGVmIEFTTV9YODZfX01DMTQ2ODE4UlRDX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTUMxNDY4MThSVENfSAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTAxLDQgKzEwMSw0IEBACiAKICNkZWZpbmUgUlRDX0lSUSA4CiAKLSNlbmRpZiAvKiBfQVNNX01DMTQ2ODE4UlRDX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NQzE0NjgxOFJUQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWNhLmggYi9pbmNsdWRlL2FzbS14ODYvbWNhLmgKaW5kZXggMDlhZGYyZS4uNjBkMWVkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21jYS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tY2EuaApAQCAtMSw4ICsxLDggQEAKIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KIAogLyogUGxhdGZvcm0gc3BlY2lmaWMgTUNBIGRlZmluZXMgKi8KLSNpZm5kZWYgX0FTTV9NQ0FfSAotI2RlZmluZSBfQVNNX01DQV9ICisjaWZuZGVmIEFTTV9YODZfX01DQV9ICisjZGVmaW5lIEFTTV9YODZfX01DQV9ICiAKIC8qIE1heGltYWwgbnVtYmVyIG9mIE1DQSBzbG90cyAtIGFjdHVhbGx5LCBzb21lIG1hY2hpbmVzIGhhdmUgbGVzcywgYnV0CiAgKiB0aGV5IGFsbCBoYXZlIHN1ZmZpY2llbnQgbnVtYmVyIG9mIFBPUyByZWdpc3RlcnMgdG8gY292ZXIgOC4KQEAgLTQwLDQgKzQwLDQgQEAKICAqLwogI2RlZmluZSBNQ0FfTlVNQURBUFRFUlMgKE1DQV9NQVhfU0xPVF9OUiszKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19NQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21jYV9kbWEuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tY2FfZG1hLmgKaW5kZXggYzNkY2E2ZS4uNDlmMjJiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21jYV9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbWNhX2RtYS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBNQ0FfRE1BX0gKLSNkZWZpbmUgTUNBX0RNQV9ICisjaWZuZGVmIEFTTV9YODZfX01DQV9ETUFfSAorI2RlZmluZSBBU01fWDg2X19NQ0FfRE1BX0gKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMTk4LDQgKzE5OCw0IEBACiAJb3V0Yihtb2RlLCBNQ0FfRE1BX1JFR19FWEUpOwogfQogCi0jZW5kaWYgLyogTUNBX0RNQV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fTUNBX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWNlLmggYi9pbmNsdWRlL2FzbS14ODYvbWNlLmgKaW5kZXggNTMxZWFhNS4uMDM2MTMzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21jZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tY2UuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfTUNFX0gKLSNkZWZpbmUgX0FTTV9YODZfTUNFX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTUNFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTUNFX0gKIAogI2lmZGVmIF9feDg2XzY0X18KIApAQCAtMTI3LDQgKzEyNyw0IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01DRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbWljcm9jb2RlLmggYi9pbmNsdWRlL2FzbS14ODYvbWljcm9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNzkzYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9taWNyb2NvZGUuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIEFTTV9YODZfX01JQ1JPQ09ERV9ICisjZGVmaW5lIEFTTV9YODZfX01JQ1JPQ09ERV9ICisKK3N0cnVjdCBjcHVfc2lnbmF0dXJlIHsKKwl1bnNpZ25lZCBpbnQgc2lnOworCXVuc2lnbmVkIGludCBwZjsKKwl1bnNpZ25lZCBpbnQgcmV2OworfTsKKworc3RydWN0IGRldmljZTsKKworc3RydWN0IG1pY3JvY29kZV9vcHMgeworCWludCAgKCpyZXF1ZXN0X21pY3JvY29kZV91c2VyKSAoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCWludCAgKCpyZXF1ZXN0X21pY3JvY29kZV9mdykgKGludCBjcHUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CisKKwl2b2lkICgqYXBwbHlfbWljcm9jb2RlKSAoaW50IGNwdSk7CisKKwlpbnQgICgqY29sbGVjdF9jcHVfaW5mbykgKGludCBjcHUsIHN0cnVjdCBjcHVfc2lnbmF0dXJlICpjc2lnKTsKKwl2b2lkICgqbWljcm9jb2RlX2ZpbmlfY3B1KSAoaW50IGNwdSk7Cit9OworCitzdHJ1Y3QgdWNvZGVfY3B1X2luZm8geworCXN0cnVjdCBjcHVfc2lnbmF0dXJlIGNwdV9zaWc7CisJaW50IHZhbGlkOworCXZvaWQgKm1jOworfTsKK2V4dGVybiBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gdWNvZGVfY3B1X2luZm9bXTsKKworI2lmZGVmIENPTkZJR19NSUNST0NPREVfSU5URUwKK2V4dGVybiBzdHJ1Y3QgbWljcm9jb2RlX29wcyAqIF9faW5pdCBpbml0X2ludGVsX21pY3JvY29kZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaWNyb2NvZGVfb3BzICogX19pbml0IGluaXRfaW50ZWxfbWljcm9jb2RlKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX01JQ1JPQ09ERV9JTlRFTCAqLworCisjaWZkZWYgQ09ORklHX01JQ1JPQ09ERV9BTUQKK2V4dGVybiBzdHJ1Y3QgbWljcm9jb2RlX29wcyAqIF9faW5pdCBpbml0X2FtZF9taWNyb2NvZGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWljcm9jb2RlX29wcyAqIF9faW5pdCBpbml0X2FtZF9taWNyb2NvZGUodm9pZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQVNNX1g4Nl9fTUlDUk9DT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tbWFuLmggYi9pbmNsdWRlL2FzbS14ODYvbW1hbi5oCmluZGV4IDkwYmM0MTAuLjRlZjI4ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tbWFuLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21tYW4uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfTU1BTl9ICi0jZGVmaW5lIF9BU01fWDg2X01NQU5fSAorI2lmbmRlZiBBU01fWDg2X19NTUFOX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTU1BTl9ICiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLmg+CiAKQEAgLTE3LDQgKzE3LDQgQEAKICNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogbG9jayBhbGwgY3VycmVudCBtYXBwaW5ncyAqLwogI2RlZmluZSBNQ0xfRlVUVVJFCTIJCS8qIGxvY2sgYWxsIGZ1dHVyZSBtYXBwaW5ncyAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfTU1BTl9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fTU1BTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbW1jb25maWcuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tbWNvbmZpZy5oCmluZGV4IGUyOTNhYjguLmZiNzliMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tbWNvbmZpZy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tbWNvbmZpZy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX01NQ09ORklHX0gKLSNkZWZpbmUgX0FTTV9NTUNPTkZJR19ICisjaWZuZGVmIEFTTV9YODZfX01NQ09ORklHX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTU1DT05GSUdfSAogCiAjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRwogZXh0ZXJuIHZvaWQgX19jcHVpbml0IGZhbTEwaF9jaGVja19lbmFibGVfbW1jZmcodm9pZCk7CkBAIC05LDQgKzksNCBAQAogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2VuYWJsZV9hbWRfbW1jb25mX2RtaSh2b2lkKSB7IH0KICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19NTUNPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbW11LmggYi9pbmNsdWRlL2FzbS14ODYvbW11LmgKaW5kZXggMDBlODg2Ny4uOWQ1YWZmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tbXUuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfTU1VX0gKLSNkZWZpbmUgX0FTTV9YODZfTU1VX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTU1VX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTU1VX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTcsMTQgKzcsOSBAQAogLyoKICAqIFRoZSB4ODYgZG9lc24ndCBoYXZlIGEgbW11IGNvbnRleHQsIGJ1dAogICogd2UgcHV0IHRoZSBzZWdtZW50IGluZm9ybWF0aW9uIGhlcmUuCi0gKgotICogY3B1X3ZtX21hc2sgaXMgdXNlZCB0byBvcHRpbWl6ZSBsZHQgZmx1c2hpbmcuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl2b2lkICpsZHQ7Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXJ3bG9ja190IGxkdGxvY2s7Ci0jZW5kaWYKIAlpbnQgc2l6ZTsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAl2b2lkICp2ZHNvOwpAQCAtMjgsNCArMjMsNCBAQAogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9NTVVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tbXVfY29udGV4dC5oCmluZGV4IGZhYzU3MDEuLjhlYzk0MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tbXVfY29udGV4dC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9YODZfTU1VX0NPTlRFWFRfSAotI2RlZmluZSBfX0FTTV9YODZfTU1VX0NPTlRFWFRfSAorI2lmbmRlZiBBU01fWDg2X19NTVVfQ09OVEVYVF9ICisjZGVmaW5lIEFTTV9YODZfX01NVV9DT05URVhUX0gKIAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMzQsNCArMzQsNCBAQAogfSB3aGlsZSAoMCk7CiAKIAotI2VuZGlmIC8qIF9fQVNNX1g4Nl9NTVVfQ09OVEVYVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fTU1VX0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21tdV9jb250ZXh0XzMyLmggYi9pbmNsdWRlL2FzbS14ODYvbW11X2NvbnRleHRfMzIuaAppbmRleCA4MjRmYzU3Li5jY2U2ZjZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbW11X2NvbnRleHRfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbW11X2NvbnRleHRfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19JMzg2X1NDSEVEX0gKLSNkZWZpbmUgX19JMzg2X1NDSEVEX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTU1VX0NPTlRFWFRfMzJfSAorI2RlZmluZSBBU01fWDg2X19NTVVfQ09OVEVYVF8zMl9ICiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CkBAIC01Myw0ICs1Myw0IEBACiAjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLCBtbSkJCQlcCiAJYXNtKCJtb3ZsICUwLCUlZ3MiOiA6InIiICgwKSk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01NVV9DT05URVhUXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tbXVfY29udGV4dF82NC5oIGIvaW5jbHVkZS9hc20teDg2L21tdV9jb250ZXh0XzY0LmgKaW5kZXggYzcwMDA2My4uMjY3NTg2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21tdV9jb250ZXh0XzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21tdV9jb250ZXh0XzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fWDg2XzY0X01NVV9DT05URVhUX0gKLSNkZWZpbmUgX19YODZfNjRfTU1VX0NPTlRFWFRfSAorI2lmbmRlZiBBU01fWDg2X19NTVVfQ09OVEVYVF82NF9ICisjZGVmaW5lIEFTTV9YODZfX01NVV9DT05URVhUXzY0X0gKIAogI2luY2x1ZGUgPGFzbS9wZGEuaD4KIApAQCAtNTEsNCArNTEsNCBAQAogCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWZzIjo6InIiKDApKTsJXAogfSB3aGlsZSAoMCkKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTU1VX0NPTlRFWFRfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21teC5oIGIvaW5jbHVkZS9hc20teDg2L21teC5oCmluZGV4IDk0MDg4MTIuLjJlNzI5OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tbXguaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbW14LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fTU1YX0gKLSNkZWZpbmUgX0FTTV9NTVhfSAorI2lmbmRlZiBBU01fWDg2X19NTVhfSAorI2RlZmluZSBBU01fWDg2X19NTVhfSAogCiAvKgogICoJTU1YIDNEbm93ISBoZWxwZXIgb3BlcmF0aW9ucwpAQCAtMTEsNCArMTEsNCBAQAogZXh0ZXJuIHZvaWQgbW14X2NsZWFyX3BhZ2Uodm9pZCAqcGFnZSk7CiBleHRlcm4gdm9pZCBtbXhfY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTU1YX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tbXpvbmVfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tbXpvbmVfMzIuaAppbmRleCA1ODYyZTY0Li4xMjFiNjVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbW16b25lXzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L21tem9uZV8zMi5oCkBAIC0zLDggKzMsOCBAQAogICoKICAqLwogCi0jaWZuZGVmIF9BU01fTU1aT05FX0hfCi0jZGVmaW5lIF9BU01fTU1aT05FX0hfCisjaWZuZGVmIEFTTV9YODZfX01NWk9ORV8zMl9ICisjZGVmaW5lIEFTTV9YODZfX01NWk9ORV8zMl9ICiAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAKQEAgLTEzMSw0ICsxMzEsNCBAQAogfSkKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCi0jZW5kaWYgLyogX0FTTV9NTVpPTkVfSF8gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NTVpPTkVfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21tem9uZV82NC5oIGIvaW5jbHVkZS9hc20teDg2L21tem9uZV82NC5oCmluZGV4IDU5NGJkMGQuLjY0ODBmMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tbXpvbmVfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbW16b25lXzY0LmgKQEAgLTEsMTMgKzEsMTMgQEAKIC8qIEs4IE5VTUEgc3VwcG9ydCAqLwogLyogQ29weXJpZ2h0IDIwMDIsMjAwMyBieSBBbmRpIEtsZWVuLCBTdVNFIExhYnMgKi8KIC8qIDIuNSBWZXJzaW9uIGxvb3NlbHkgYmFzZWQgb24gdGhlIE5VTUFRIENvZGUgYnkgUGF0IEdhdWdoZW4uICovCi0jaWZuZGVmIF9BU01fWDg2XzY0X01NWk9ORV9ICi0jZGVmaW5lIF9BU01fWDg2XzY0X01NWk9ORV9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fTU1aT05FXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fTU1aT05FXzY0X0gKIAogCiAjaWZkZWYgQ09ORklHX05VTUEKIAotI2RlZmluZSBWSVJUVUFMX0JVR19PTih4KQorI2luY2x1ZGUgPGxpbnV4L21tZGVidWcuaD4KIAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIApAQCAtMjksNyArMjksNiBAQAogewogCXVuc2lnbmVkIG5pZDsKIAlWSVJUVUFMX0JVR19PTighbWVtbm9kZW1hcCk7Ci0JVklSVFVBTF9CVUdfT04oKGFkZHIgPj4gbWVtbm9kZV9zaGlmdCkgPj0gbWVtbm9kZW1hcHNpemUpOwogCW5pZCA9IG1lbW5vZGVtYXBbYWRkciA+PiBtZW1ub2RlX3NoaWZ0XTsKIAlWSVJUVUFMX0JVR19PTihuaWQgPj0gTUFYX05VTU5PREVTIHx8ICFub2RlX2RhdGFbbmlkXSk7CiAJcmV0dXJuIG5pZDsKQEAgLTQ5LDQgKzQ4LDQgQEAKICNlbmRpZgogCiAjZW5kaWYKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01NWk9ORV82NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbW9kdWxlLmggYi9pbmNsdWRlL2FzbS14ODYvbW9kdWxlLmgKaW5kZXggYmZlZGIyNC4uODY0ZjIwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tb2R1bGUuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9NT0RVTEVfSAotI2RlZmluZSBfQVNNX01PRFVMRV9ICisjaWZuZGVmIEFTTV9YODZfX01PRFVMRV9ICisjZGVmaW5lIEFTTV9YODZfX01PRFVMRV9ICiAKIC8qIHg4Nl8zMi82NCBhcmUgc2ltcGxlICovCiBzdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMge307CkBAIC01Miw4ICs1Miw2IEBACiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiRUZGSUNFT04gIgogI2VsaWYgZGVmaW5lZCBDT05GSUdfTVdJTkNISVBDNgogI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIldJTkNISVBDNiAiCi0jZWxpZiBkZWZpbmVkIENPTkZJR19NV0lOQ0hJUDIKLSNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJXSU5DSElQMiAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19NV0lOQ0hJUDNECiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiV0lOQ0hJUDNEICIKICNlbGlmIGRlZmluZWQgQ09ORklHX01DWVJJWElJSQpAQCAtNzksNCArNzcsNCBAQAogIyBkZWZpbmUgTU9EVUxFX0FSQ0hfVkVSTUFHSUMgTU9EVUxFX1BST0NfRkFNSUxZIE1PRFVMRV9TVEFDS1NJWkUKICNlbmRpZgogCi0jZW5kaWYgLyogX0FTTV9NT0RVTEVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS14ODYvbXBzcGVjLmgKaW5kZXggYjY5OTVlNS4uYmUyMjQxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tcHNwZWMuaApAQCAtMSwxNSArMSwxNiBAQAotI2lmbmRlZiBfQU1fWDg2X01QU1BFQ19ICi0jZGVmaW5lIF9BTV9YODZfTVBTUEVDX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTVBTUEVDX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTVBTUEVDX0gKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9tcHNwZWNfZGVmLmg+CiAKK2V4dGVybiBpbnQgYXBpY192ZXJzaW9uW01BWF9BUElDU107CisKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjaW5jbHVkZSA8bWFjaF9tcHNwZWMuaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGludCBkZWZfdG9fYmlnc21wOwotZXh0ZXJuIGludCBhcGljX3ZlcnNpb25bTUFYX0FQSUNTXTsKIGV4dGVybiB1OCBhcGljaWRfMl9ub2RlW107CiBleHRlcm4gaW50IHBpY19tb2RlOwogCkBAIC0xNDEsNCArMTQyLDQgQEAKIAogZXh0ZXJuIHBoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01QU1BFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbXBzcGVjX2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L21wc3BlY19kZWYuaAppbmRleCAzOGQxZTczLi43OTE2NmIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbXBzcGVjX2RlZi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tcHNwZWNfZGVmLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01QU1BFQ19ERUZfSAotI2RlZmluZSBfX0FTTV9NUFNQRUNfREVGX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTVBTUEVDX0RFRl9ICisjZGVmaW5lIEFTTV9YODZfX01QU1BFQ19ERUZfSAogCiAvKgogICogU3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBTTVAgbWFjaGluZXMgZm9sbG93aW5nIHRoZQpAQCAtMTc3LDQgKzE3Nyw0IEBACiAJTVBfQlVTX1BDSSwKIAlNUF9CVVNfTUNBLAogfTsKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01QU1BFQ19ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20teDg2L21zZ2J1Zi5oCmluZGV4IDdlNGU5NDguLjFiNTM4YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tc2didWYuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbXNnYnVmLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X01TR0JVRl9ICi0jZGVmaW5lIF9BU01fWDg2X01TR0JVRl9ICisjaWZuZGVmIEFTTV9YODZfX01TR0JVRl9ICisjZGVmaW5lIEFTTV9YODZfX01TR0JVRl9ICiAKIC8qCiAgKiBUaGUgbXNxaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIGkzODYgYXJjaGl0ZWN0dXJlLgpAQCAtMzYsNCArMzYsNCBAQAogCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKIH07CiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9NU0dCVUZfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbXNpZGVmLmggYi9pbmNsdWRlL2FzbS14ODYvbXNpZGVmLmgKaW5kZXggMjk2ZjI5Yy4uZWQ5MTkwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21zaWRlZi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tc2lkZWYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgQVNNX01TSURFRl9ICi0jZGVmaW5lIEFTTV9NU0lERUZfSAorI2lmbmRlZiBBU01fWDg2X19NU0lERUZfSAorI2RlZmluZSBBU01fWDg2X19NU0lERUZfSAogCiAvKgogICogQ29uc3RhbnRzIGZvciBJbnRlbCBBUElDIGJhc2VkIE1TSSBtZXNzYWdlcy4KQEAgLTQ4LDQgKzQ4LDggQEAKICNkZWZpbmUgIE1TSV9BRERSX0RFU1RfSUQoZGVzdCkJCSgoKGRlc3QpIDw8IE1TSV9BRERSX0RFU1RfSURfU0hJRlQpICYgXAogCQkJCQkgTVNJX0FERFJfREVTVF9JRF9NQVNLKQogCi0jZW5kaWYgLyogQVNNX01TSURFRl9IICovCisjZGVmaW5lIE1TSV9BRERSX0lSX0VYVF9JTlQJCSgxIDw8IDQpCisjZGVmaW5lIE1TSV9BRERSX0lSX1NIVgkJCSgxIDw8IDMpCisjZGVmaW5lIE1TSV9BRERSX0lSX0lOREVYMShpbmRleCkJKChpbmRleCAmIDB4ODAwMCkgPj4gMTMpCisjZGVmaW5lIE1TSV9BRERSX0lSX0lOREVYMihpbmRleCkJKChpbmRleCAmIDB4N2ZmZikgPDwgNSkKKyNlbmRpZiAvKiBBU01fWDg2X19NU0lERUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21zci1pbmRleC5oIGIvaW5jbHVkZS9hc20teDg2L21zci1pbmRleC5oCmluZGV4IDQ0YmNlNzcuLmRhYmQxMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tc3ItaW5kZXguaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbXNyLWluZGV4LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01TUl9JTkRFWF9ICi0jZGVmaW5lIF9fQVNNX01TUl9JTkRFWF9ICisjaWZuZGVmIEFTTV9YODZfX01TUl9JTkRFWF9ICisjZGVmaW5lIEFTTV9YODZfX01TUl9JTkRFWF9ICiAKIC8qIENQVSBtb2RlbCBzcGVjaWZpYyByZWdpc3RlciAoTVNSKSBudW1iZXJzICovCiAKQEAgLTE3Niw2ICsxNzYsMTAgQEAKICNkZWZpbmUgTVNSX0lBMzJfVFNDCQkJMHgwMDAwMDAxMAogI2RlZmluZSBNU1JfSUEzMl9QTEFURk9STV9JRAkJMHgwMDAwMDAxNwogI2RlZmluZSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTgkJMHgwMDAwMDAyYQorI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wgICAgICAgIDB4MDAwMDAwM2EKKworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfTE9DS0VECQkoMTw8MCkKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRUQJKDE8PDIpCiAKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0UJCTB4MDAwMDAwMWIKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQlNQCQkoMTw8OCkKQEAgLTMxMCw0ICszMTQsMTkgQEAKIC8qIEdlb2RlIGRlZmluZWQgTVNScyAqLwogI2RlZmluZSBNU1JfR0VPREVfQlVTQ09OVF9DT05GMAkJMHgwMDAwMTkwMAogCi0jZW5kaWYgLyogX19BU01fTVNSX0lOREVYX0ggKi8KKy8qIEludGVsIFZUIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0JBU0lDICAgICAgICAgICAgICAweDAwMDAwNDgwCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QSU5CQVNFRF9DVExTICAgICAgMHgwMDAwMDQ4MQorI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMgICAgIDB4MDAwMDA0ODIKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VYSVRfQ1RMUyAgICAgICAgICAweDAwMDAwNDgzCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FTlRSWV9DVExTICAgICAgICAgMHgwMDAwMDQ4NAorI2RlZmluZSBNU1JfSUEzMl9WTVhfTUlTQyAgICAgICAgICAgICAgIDB4MDAwMDA0ODUKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSMF9GSVhFRDAgICAgICAgICAweDAwMDAwNDg2CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9DUjBfRklYRUQxICAgICAgICAgMHgwMDAwMDQ4NworI2RlZmluZSBNU1JfSUEzMl9WTVhfQ1I0X0ZJWEVEMCAgICAgICAgIDB4MDAwMDA0ODgKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0NSNF9GSVhFRDEgICAgICAgICAweDAwMDAwNDg5CisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9WTUNTX0VOVU0gICAgICAgICAgMHgwMDAwMDQ4YQorI2RlZmluZSBNU1JfSUEzMl9WTVhfUFJPQ0JBU0VEX0NUTFMyICAgIDB4MDAwMDA0OGIKKyNkZWZpbmUgTVNSX0lBMzJfVk1YX0VQVF9WUElEX0NBUCAgICAgICAweDAwMDAwNDhjCisKKyNlbmRpZiAvKiBBU01fWDg2X19NU1JfSU5ERVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21zci5oIGIvaW5jbHVkZS9hc20teDg2L21zci5oCmluZGV4IDIzNjJjZmQuLjUzMGFmMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9tc3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbXNyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX1g4Nl9NU1JfSF8KLSNkZWZpbmUgX19BU01fWDg2X01TUl9IXworI2lmbmRlZiBBU01fWDg2X19NU1JfSAorI2RlZmluZSBBU01fWDg2X19NU1JfSAogCiAjaW5jbHVkZSA8YXNtL21zci1pbmRleC5oPgogCkBAIC02Myw2ICs2MywyMiBAQAogCXJldHVybiBFQVhfRURYX1ZBTCh2YWwsIGxvdywgaGlnaCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIG5hdGl2ZV9yZWFkX21zcl9hbWRfc2FmZSh1bnNpZ25lZCBpbnQgbXNyLAorCQkJCQkJICAgICAgaW50ICplcnIpCit7CisJREVDTEFSRV9BUkdTKHZhbCwgbG93LCBoaWdoKTsKKworCWFzbSB2b2xhdGlsZSgiMjogcmRtc3IgOyB4b3IgJTAsJTBcbiIKKwkJICAgICAiMTpcblx0IgorCQkgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG5cdCIKKwkJICAgICAiMzogIG1vdiAlMywlMCA7IGptcCAxYlxuXHQiCisJCSAgICAgIi5wcmV2aW91c1xuXHQiCisJCSAgICAgX0FTTV9FWFRBQkxFKDJiLCAzYikKKwkJICAgICA6ICI9ciIgKCplcnIpLCBFQVhfRURYX1JFVCh2YWwsIGxvdywgaGlnaCkKKwkJICAgICA6ICJjIiAobXNyKSwgIkQiICgweDljNWEyMDNhKSwgImkiICgtRUZBVUxUKSk7CisJcmV0dXJuIEVBWF9FRFhfVkFMKHZhbCwgbG93LCBoaWdoKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV93cml0ZV9tc3IodW5zaWduZWQgaW50IG1zciwKIAkJCQkgICAgdW5zaWduZWQgbG93LCB1bnNpZ25lZCBoaWdoKQogewpAQCAtMTU4LDYgKzE3NCwxMyBAQAogCSpwID0gbmF0aXZlX3JlYWRfbXNyX3NhZmUobXNyLCAmZXJyKTsKIAlyZXR1cm4gZXJyOwogfQorc3RhdGljIGlubGluZSBpbnQgcmRtc3JsX2FtZF9zYWZlKHVuc2lnbmVkIG1zciwgdW5zaWduZWQgbG9uZyBsb25nICpwKQoreworCWludCBlcnI7CisKKwkqcCA9IG5hdGl2ZV9yZWFkX21zcl9hbWRfc2FmZShtc3IsICZlcnIpOworCXJldHVybiBlcnI7Cit9CiAKICNkZWZpbmUgcmR0c2NsKGxvdykJCQkJCQlcCiAJKChsb3cpID0gKHUzMiluYXRpdmVfcmVhZF90c2MoKSkKQEAgLTIyMSw0ICsyNDQsNCBAQAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19NU1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L210cnIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9tdHJyLmgKaW5kZXggYTY5YTAxYS4uMjNhN2Y4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L210cnIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbXRyci5oCkBAIC0yMCw4ICsyMCw4IEBACiAgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgogICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KICovCi0jaWZuZGVmIF9BU01fWDg2X01UUlJfSAotI2RlZmluZSBfQVNNX1g4Nl9NVFJSX0gKKyNpZm5kZWYgQVNNX1g4Nl9fTVRSUl9ICisjZGVmaW5lIEFTTV9YODZfX01UUlJfSAogCiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMTcwLDQgKzE3MCw0IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZiAgLyogIF9BU01fWDg2X01UUlJfSCAgKi8KKyNlbmRpZiAvKiBBU01fWDg2X19NVFJSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tdXRleF8zMi5oIGIvaW5jbHVkZS9hc20teDg2L211dGV4XzMyLmgKaW5kZXggNzNlOTI4ZS4uMjVjMTZkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L211dGV4XzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L211dGV4XzMyLmgKQEAgLTYsOCArNiw4IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KICAqLwotI2lmbmRlZiBfQVNNX01VVEVYX0gKLSNkZWZpbmUgX0FTTV9NVVRFWF9ICisjaWZuZGVmIEFTTV9YODZfX01VVEVYXzMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTVVURVhfMzJfSAogCiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CiAKQEAgLTEyMiw0ICsxMjIsNCBAQAogI2VuZGlmCiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX01VVEVYXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9tdXRleF82NC5oIGIvaW5jbHVkZS9hc20teDg2L211dGV4XzY0LmgKaW5kZXggZjNmYWU5Yi4uOTE4YmEyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L211dGV4XzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L211dGV4XzY0LmgKQEAgLTYsOCArNiw4IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KICAqLwotI2lmbmRlZiBfQVNNX01VVEVYX0gKLSNkZWZpbmUgX0FTTV9NVVRFWF9ICisjaWZuZGVmIEFTTV9YODZfX01VVEVYXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fTVVURVhfNjRfSAogCiAvKioKICAqIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayAtIGRlY3JlbWVudCBhbmQgY2FsbCBmdW5jdGlvbiBpZiBuZWdhdGl2ZQpAQCAtOTcsNCArOTcsNCBAQAogCQlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fTVVURVhfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L25taS5oIGIvaW5jbHVkZS9hc20teDg2L25taS5oCmluZGV4IDIxZjhkMDIuLmE1M2Y4MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9ubWkuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbm1pLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X05NSV9IXwotI2RlZmluZSBfQVNNX1g4Nl9OTUlfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fTk1JX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTk1JX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMTUsMTAgKzE1LDYgQEAKICAqLwogaW50IGRvX25taV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSk7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci1leHRlcm4gdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqKTsKLSNlbmRpZgotCiBleHRlcm4gdm9pZCBkaWVfbm1pKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBkb19wYW5pYyk7CiBleHRlcm4gaW50IGNoZWNrX25taV93YXRjaGRvZyh2b2lkKTsKIGV4dGVybiBpbnQgbm1pX3dhdGNoZG9nX2VuYWJsZWQ7CkBAIC0zNCw2ICszMCw3IEBACiBleHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7CiBleHRlcm4gaW50IG5taV93YXRjaGRvZ190aWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCByZWFzb24pOworZXh0ZXJuIHZvaWQgY3B1X25taV9zZXRfd2RfZW5hYmxlZCh2b2lkKTsKIAogZXh0ZXJuIGF0b21pY190IG5taV9hY3RpdmU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5taV93YXRjaGRvZzsKQEAgLTgxLDQgKzc4LDQgQEAKIHZvaWQgc3RvcF9ubWkodm9pZCk7CiB2b2lkIHJlc3RhcnRfbm1pKHZvaWQpOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19OTUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L25vcHMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9ub3BzLmgKaW5kZXggYWQwYmVkZC4uYWU3NDI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L25vcHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbm9wcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX05PUFNfSAotI2RlZmluZSBfQVNNX05PUFNfSCAxCisjaWZuZGVmIEFTTV9YODZfX05PUFNfSAorI2RlZmluZSBBU01fWDg2X19OT1BTX0gKIAogLyogRGVmaW5lIG5vcHMgZm9yIHVzZSB3aXRoIGFsdGVybmF0aXZlKCkgKi8KIApAQCAtMTE1LDQgKzExNSw0IEBACiAKICNkZWZpbmUgQVNNX05PUF9NQVggOAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19OT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9udW1hXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvbnVtYV8zMi5oCmluZGV4IDIyMGQ3YjcuLjQ0Y2IwNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9udW1hXzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L251bWFfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfMzJfTlVNQV9ICi0jZGVmaW5lIF9BU01fWDg2XzMyX05VTUFfSCAxCisjaWZuZGVmIEFTTV9YODZfX05VTUFfMzJfSAorI2RlZmluZSBBU01fWDg2X19OVU1BXzMyX0gKIAogZXh0ZXJuIGludCBweG1fdG9fbmlkKGludCBweG0pOwogZXh0ZXJuIHZvaWQgbnVtYV9yZW1vdmVfY3B1KGludCBjcHUpOwpAQCAtOCw0ICs4LDQgQEAKIGV4dGVybiB2b2lkIHNldF9oaWdobWVtX3BhZ2VzX2luaXQodm9pZCk7CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9BU01fWDg2XzMyX05VTUFfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX05VTUFfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L251bWFfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9udW1hXzY0LmgKaW5kZXggMzgzMDA5NC4uMTVjOTkwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L251bWFfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbnVtYV82NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4NjY0X05VTUFfSAotI2RlZmluZSBfQVNNX1g4NjY0X05VTUFfSCAxCisjaWZuZGVmIEFTTV9YODZfX05VTUFfNjRfSAorI2RlZmluZSBBU01fWDg2X19OVU1BXzY0X0gKIAogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KQEAgLTQwLDQgKzQwLDQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBudW1hX3JlbW92ZV9jcHUoaW50IGNwdSkJCXsgfQogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX05VTUFfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L251bWFxLmggYi9pbmNsdWRlL2FzbS14ODYvbnVtYXEuaAppbmRleCAzNGI5MmQ1Li4xMjRiZjdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvbnVtYXEuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvbnVtYXEuaApAQCAtMjMsOCArMjMsOCBAQAogICogU2VuZCBmZWVkYmFjayB0byA8Z29uZUB1cy5pYm0uY29tPgogICovCiAKLSNpZm5kZWYgTlVNQVFfSAotI2RlZmluZSBOVU1BUV9ICisjaWZuZGVmIEFTTV9YODZfX05VTUFRX0gKKyNkZWZpbmUgQVNNX1g4Nl9fTlVNQVFfSAogCiAjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQogCkBAIC0xNjUsNSArMTY1LDUgQEAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfWDg2X05VTUFRICovCi0jZW5kaWYgLyogTlVNQVFfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX05VTUFRX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L251bWFxL2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS9hcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNDRiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS9hcGljLmgKQEAgLTAsMCArMSwxMzggQEAKKyNpZm5kZWYgX19BU01fTlVNQVFfQVBJQ19ICisjZGVmaW5lIF9fQVNNX05VTUFRX0FQSUNfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKworI2RlZmluZSBBUElDX0RGUl9WQUxVRQkoQVBJQ19ERlJfQ0xVU1RFUikKKworc3RhdGljIGlubGluZSBjcHVtYXNrX3QgdGFyZ2V0X2NwdXModm9pZCkKK3sKKwlyZXR1cm4gQ1BVX01BU0tfQUxMOworfQorCisjZGVmaW5lIFRBUkdFVF9DUFVTICh0YXJnZXRfY3B1cygpKQorCisjZGVmaW5lIE5PX0JBTEFOQ0VfSVJRICgxKQorI2RlZmluZSBlc3JfZGlzYWJsZSAoMSkKKworI2RlZmluZSBJTlRfREVMSVZFUllfTU9ERSBkZXN0X0xvd2VzdFByaW8KKyNkZWZpbmUgSU5UX0RFU1RfTU9ERSAwICAgICAvKiBwaHlzaWNhbCBkZWxpdmVyeSBvbiBMT0NBTCBxdWFkICovCisgCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2hlY2tfYXBpY2lkX3VzZWQocGh5c2lkX21hc2tfdCBiaXRtYXAsIGludCBhcGljaWQpCit7CisJcmV0dXJuIHBoeXNpZF9pc3NldChhcGljaWQsIGJpdG1hcCk7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2hlY2tfYXBpY2lkX3ByZXNlbnQoaW50IGJpdCkKK3sKKwlyZXR1cm4gcGh5c2lkX2lzc2V0KGJpdCwgcGh5c19jcHVfcHJlc2VudF9tYXApOworfQorI2RlZmluZSBhcGljaWRfY2x1c3RlcihhcGljaWQpIChhcGljaWQgJiAweEYwKQorCitzdGF0aWMgaW5saW5lIGludCBhcGljX2lkX3JlZ2lzdGVyZWQodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfYXBpY19sZHIodm9pZCkKK3sKKwkvKiBBbHJlYWR5IGRvbmUgaW4gTlVNQS1RIGZpcm13YXJlICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKK3sKKwlwcmludGsoIkVuYWJsaW5nIEFQSUMgbW9kZTogICVzLiAgVXNpbmcgJWQgSS9PIEFQSUNzXG4iLAorCQkiTlVNQS1RIiwgbnJfaW9hcGljcyk7Cit9CisKKy8qCisgKiBTa2lwIGFkZGluZyB0aGUgdGltZXIgaW50IG9uIHNlY29uZGFyeSBub2Rlcywgd2hpY2ggY2F1c2VzCisgKiBhIHNtYWxsIGJ1dCBwYWluZnVsIHJpZnQgaW4gdGhlIHRpbWUtc3BhY2UgY29udGludXVtLgorICovCitzdGF0aWMgaW5saW5lIGludCBtdWx0aV90aW1lcl9jaGVjayhpbnQgYXBpYywgaW50IGlycSkKK3sKKwlyZXR1cm4gYXBpYyAhPSAwICYmIGlycSA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIHBoeXNpZF9tYXNrX3QgaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNpZF9tYXNrX3QgcGh5c19tYXApCit7CisJLyogV2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGRvIHRoaXMgeWV0IC0gaGFjayAqLworCXJldHVybiBwaHlzaWRzX3Byb21vdGUoMHhGVUwpOworfQorCisvKiBNYXBwaW5nIGZyb20gY3B1IG51bWJlciB0byBsb2dpY2FsIGFwaWNpZCAqLworZXh0ZXJuIHU4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW107CitzdGF0aWMgaW5saW5lIGludCBjcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKK3sKKyAgICAgICBpZiAoY3B1ID49IE5SX0NQVVMpCisJICAgICAgIHJldHVybiBCQURfQVBJQ0lEOworCXJldHVybiAoaW50KWNwdV8yX2xvZ2ljYWxfYXBpY2lkW2NwdV07Cit9CisKKy8qCisgKiBTdXBwb3J0aW5nIG92ZXIgNjAgY3B1cyBvbiBOVU1BLVEgcmVxdWlyZXMgYSBsb2NhbGl0eS1kZXBlbmRlbnQKKyAqIGNwdSB0byBBUElDIElEIHJlbGF0aW9uIHRvIHByb3Blcmx5IGludGVyYWN0IHdpdGggdGhlIGludGVsbGlnZW50CisgKiBtb2RlIG9mIHRoZSBjbHVzdGVyIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9wcmVzZW50X3RvX2FwaWNpZChpbnQgbXBzX2NwdSkKK3sKKwlpZiAobXBzX2NwdSA8IDYwKQorCQlyZXR1cm4gKChtcHNfY3B1ID4+IDIpIDw8IDQpIHwgKDEgPDwgKG1wc19jcHUgJiAweDMpKTsKKwllbHNlCisJCXJldHVybiBCQURfQVBJQ0lEOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGljaWRfdG9fbm9kZShpbnQgbG9naWNhbF9hcGljaWQpIAoreworCXJldHVybiBsb2dpY2FsX2FwaWNpZCA+PiA0OworfQorCitzdGF0aWMgaW5saW5lIHBoeXNpZF9tYXNrX3QgYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBsb2dpY2FsX2FwaWNpZCkKK3sKKwlpbnQgbm9kZSA9IGFwaWNpZF90b19ub2RlKGxvZ2ljYWxfYXBpY2lkKTsKKwlpbnQgY3B1ID0gX19mZnMobG9naWNhbF9hcGljaWQgJiAweGYpOworCisJcmV0dXJuIHBoeXNpZF9tYXNrX29mX3BoeXNpZChjcHUgKyA0Km5vZGUpOworfQorCitleHRlcm4gdm9pZCAqeHF1YWRfcG9ydGlvOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfcG9ydGlvX3JlbWFwKHZvaWQpCit7CisJaW50IG51bV9xdWFkcyA9IG51bV9vbmxpbmVfbm9kZXMoKTsKKworCWlmIChudW1fcXVhZHMgPD0gMSkKKyAgICAgICAJCXJldHVybjsKKworCXByaW50aygiUmVtYXBwaW5nIGNyb3NzLXF1YWQgcG9ydCBJL08gZm9yICVkIHF1YWRzXG4iLCBudW1fcXVhZHMpOworCXhxdWFkX3BvcnRpbyA9IGlvcmVtYXAoWFFVQURfUE9SVElPX0JBU0UsIG51bV9xdWFkcypYUVVBRF9QT1JUSU9fUVVBRCk7CisJcHJpbnRrKCJ4cXVhZF9wb3J0aW8gdmFkZHIgMHglMDhseCwgbGVuICUwOGx4XG4iLAorCQkodV9sb25nKSB4cXVhZF9wb3J0aW8sICh1X2xvbmcpIG51bV9xdWFkcypYUVVBRF9QT1JUSU9fUVVBRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkKK3sKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2FwaWNfbW9kZSh2b2lkKQoreworfQorCisvKgorICogV2UgdXNlIHBoeXNpY2FsIGFwaWNpZHMgaGVyZSwgbm90IGxvZ2ljYWwsIHNvIGp1c3QgcmV0dXJuIHRoZSBkZWZhdWx0CisgKiBwaHlzaWNhbCBicm9hZGNhc3QgdG8gc3RvcCBwZW9wbGUgZnJvbSBicmVha2luZyB1cworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVfbWFza190b19hcGljaWQoY3B1bWFza190IGNwdW1hc2spCit7CisJcmV0dXJuIChpbnQpIDB4RjsKK30KKworLyogTm8gTlVNQS1RIGJveCBoYXMgYSBIVCBDUFUsIGJ1dCBpdCBjYW4ndCBodXJ0IHRvIHVzZSB0aGUgZGVmYXVsdCBjb2RlLiAqLworc3RhdGljIGlubGluZSB1MzIgcGh5c19wa2dfaWQodTMyIGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCit7CisJcmV0dXJuIGNwdWlkX2FwaWMgPj4gaW5kZXhfbXNiOworfQorCisjZW5kaWYgLyogX19BU01fTlVNQVFfQVBJQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbnVtYXEvYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L251bWFxL2FwaWNkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDEyYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L251bWFxL2FwaWNkZWYuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fQVNNX05VTUFRX0FQSUNERUZfSAorI2RlZmluZSBfX0FTTV9OVU1BUV9BUElDREVGX0gKKworCisjZGVmaW5lIEFQSUNfSURfTUFTSyAoMHhGPDwyNCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCit7CisJICAgICAgICByZXR1cm4gKCgoeCk+PjI0KSYweDBGKTsKK30KKworI2RlZmluZSAgICAgICAgIEdFVF9BUElDX0lEKHgpICBnZXRfYXBpY19pZCh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS9pcGkuaCBiL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS9pcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU1ODhkMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS9pcGkuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fQVNNX05VTUFRX0lQSV9ICisjZGVmaW5lIF9fQVNNX05VTUFRX0lQSV9ICisKK3ZvaWQgc2VuZF9JUElfbWFza19zZXF1ZW5jZShjcHVtYXNrX3QsIGludCB2ZWN0b3IpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfbWFzayhjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKK3sKKwlzZW5kX0lQSV9tYXNrX3NlcXVlbmNlKG1hc2ssIHZlY3Rvcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCit7CisJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKworCWlmICghY3B1c19lbXB0eShtYXNrKSkKKwkJc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCit7CisJc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hcCwgdmVjdG9yKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX05VTUFRX0lQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbnVtYXEvbXBwYXJzZS5oIGIvaW5jbHVkZS9hc20teDg2L251bWFxL21wcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIyOTJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L251bWFxL21wcGFyc2UuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19BU01fTlVNQVFfTVBQQVJTRV9ICisjZGVmaW5lIF9fQVNNX05VTUFRX01QUEFSU0VfSAorCitleHRlcm4gdm9pZCBudW1hcV9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAorCQkJCWNoYXIgKnByb2R1Y3RpZCk7CisKKyNlbmRpZiAvKiBfX0FTTV9OVU1BUV9NUFBBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9udW1hcS93YWtlY3B1LmggYi9pbmNsdWRlL2FzbS14ODYvbnVtYXEvd2FrZWNwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzdiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvbnVtYXEvd2FrZWNwdS5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX19BU01fTlVNQVFfV0FLRUNQVV9ICisjZGVmaW5lIF9fQVNNX05VTUFRX1dBS0VDUFVfSAorCisvKiBUaGlzIGZpbGUgY29wZXMgd2l0aCBtYWNoaW5lcyB0aGF0IHdha2V1cCBzZWNvbmRhcnkgQ1BVcyBieSBOTUlzICovCisKKyNkZWZpbmUgV0FLRV9TRUNPTkRBUllfVklBX05NSQorCisjZGVmaW5lIFRSQU1QT0xJTkVfTE9XIHBoeXNfdG9fdmlydCgweDgpCisjZGVmaW5lIFRSQU1QT0xJTkVfSElHSCBwaHlzX3RvX3ZpcnQoMHhhKQorCisjZGVmaW5lIGJvb3RfY3B1X2FwaWNpZCBib290X2NwdV9sb2dpY2FsX2FwaWNpZAorCisvKiBXZSBkb24ndCBkbyBhbnl0aGluZyBoZXJlIGJlY2F1c2Ugd2UgdXNlIE5NSSdzIHRvIGJvb3QgaW5zdGVhZCAqLworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfZm9yX2luaXRfZGVhc3NlcnQoYXRvbWljX3QgKmRlYXNzZXJ0KQoreworfQorCisvKgorICogQmVjYXVzZSB3ZSB1c2UgTk1JcyByYXRoZXIgdGhhbiB0aGUgSU5JVC1TVEFSVFVQIHNlcXVlbmNlIHRvCisgKiBib290c3RyYXAgdGhlIENQVXMsIHRoZSBBUElDIG1heSBiZSBpbiBhIHdlaXJkIHN0YXRlLiBLaWNrIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc21wX2NhbGxpbl9jbGVhcl9sb2NhbF9hcGljKHZvaWQpCit7CisJY2xlYXJfbG9jYWxfQVBJQygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfTk1JX3ZlY3Rvcih1bnNpZ25lZCBzaG9ydCAqaGlnaCwgdW5zaWduZWQgc2hvcnQgKmxvdykKK3sKKwlwcmludGsoIlN0b3JpbmcgTk1JIHZlY3RvclxuIik7CisJKmhpZ2ggPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBUUkFNUE9MSU5FX0hJR0gpOworCSpsb3cgPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBUUkFNUE9MSU5FX0xPVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX05NSV92ZWN0b3IodW5zaWduZWQgc2hvcnQgKmhpZ2gsIHVuc2lnbmVkIHNob3J0ICpsb3cpCit7CisJcHJpbnRrKCJSZXN0b3JpbmcgTk1JIHZlY3RvclxuIik7CisJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgVFJBTVBPTElORV9ISUdIKSA9ICpoaWdoOworCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIFRSQU1QT0xJTkVfTE9XKSA9ICpsb3c7Cit9CisKKyNkZWZpbmUgaW5xdWlyZV9yZW1vdGVfYXBpYyhhcGljaWQpIHt9CisKKyNlbmRpZiAvKiBfX0FTTV9OVU1BUV9XQUtFQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9vbHBjLmggYi9pbmNsdWRlL2FzbS14ODYvb2xwYy5oCmluZGV4IDk3ZDQ3MTMuLmQ3MzI4YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9vbHBjLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L29scGMuaApAQCAtMSw3ICsxLDcgQEAKIC8qIE9MUEMgbWFjaGluZSBzcGVjaWZpYyBkZWZpbml0aW9ucyAqLwogCi0jaWZuZGVmIEFTTV9PTFBDX0hfCi0jZGVmaW5lIEFTTV9PTFBDX0hfCisjaWZuZGVmIEFTTV9YODZfX09MUENfSAorI2RlZmluZSBBU01fWDg2X19PTFBDX0gKIAogI2luY2x1ZGUgPGFzbS9nZW9kZS5oPgogCkBAIC0xMjksNCArMTI5LDQgQEAKICNkZWZpbmUgT0xQQ19HUElPX0xJRAkJZ2VvZGVfZ3BpbygyNikKICNkZWZpbmUgT0xQQ19HUElPX0VDU0NJCQlnZW9kZV9ncGlvKDI3KQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19PTFBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODYvcGFnZS5oCmluZGV4IDQ5OTgyMTEuLmQ0ZjFkNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BhZ2UuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfUEFHRV9ICi0jZGVmaW5lIF9BU01fWDg2X1BBR0VfSAorI2lmbmRlZiBBU01fWDg2X19QQUdFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEFHRV9ICiAKICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCkBAIC01Nyw2ICs1Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCB7IHBncHJvdHZhbF90IHBncHJvdDsgfSBwZ3Byb3RfdDsKIAogZXh0ZXJuIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBhZ2Vucik7CitleHRlcm4gaW50IHBhZ2VyYW5nZV9pc19yYW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIGludCBkZXZtZW1faXNfYWxsb3dlZCh1bnNpZ25lZCBsb25nIHBhZ2Vucik7CiBleHRlcm4gdm9pZCBtYXBfZGV2bWVtKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCSAgICAgICBwZ3Byb3RfdCB2bWFfcHJvdCk7CkBAIC0xNzgsNiArMTc5LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfUEFSQVZJUlQgKi8KIAogI2RlZmluZSBfX3BhKHgpCQlfX3BoeXNfYWRkcigodW5zaWduZWQgbG9uZykoeCkpCisjZGVmaW5lIF9fcGFfbm9kZWJ1Zyh4KQlfX3BoeXNfYWRkcl9ub2RlYnVnKCh1bnNpZ25lZCBsb25nKSh4KSkKIC8qIF9fcGFfc3ltYm9sIHNob3VsZCBiZSB1c2VkIGZvciBDIHZpc2libGUgc3ltYm9scy4KICAgIFRoaXMgc2VlbXMgdG8gYmUgdGhlIG9mZmljaWFsIGdjYyBibGVzc2VkIHdheSB0byBkbyBzdWNoIGFyaXRobWV0aWMuICovCiAjZGVmaW5lIF9fcGFfc3ltYm9sKHgpCV9fcGEoX19waHlzX3JlbG9jX2hpZGUoKHVuc2lnbmVkIGxvbmcpKHgpKSkKQEAgLTE4Nyw5ICsxODksMTQgQEAKICNkZWZpbmUgX19ib290X3ZhKHgpCQlfX3ZhKHgpCiAjZGVmaW5lIF9fYm9vdF9wYSh4KQkJX19wYSh4KQogCisvKgorICogdmlydF90b19wYWdlKGthZGRyKSByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciBpZiBhbmQgb25seSBpZgorICogdmlydF9hZGRyX3ZhbGlkKGthZGRyKSByZXR1cm5zIHRydWUuCisgKi8KICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBwZm5fdG9fa2FkZHIocGZuKSAgICAgIF9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKK2V4dGVybiBib29sIF9fdmlydF9hZGRyX3ZhbGlkKHVuc2lnbmVkIGxvbmcga2FkZHIpOworI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCV9fdmlydF9hZGRyX3ZhbGlkKCh1bnNpZ25lZCBsb25nKSAoa2FkZHIpKQogCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAKQEAgLTE5OSw0ICsyMDYsNCBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEgMQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwotI2VuZGlmCS8qIF9BU01fWDg2X1BBR0VfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BhZ2VfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzMyLmgKaW5kZXggYWI4NTI4Ny4uYmRmNWRiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BhZ2VfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGFnZV8zMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9QQUdFXzMyX0gKLSNkZWZpbmUgX0FTTV9YODZfUEFHRV8zMl9ICisjaWZuZGVmIEFTTV9YODZfX1BBR0VfMzJfSAorI2RlZmluZSBBU01fWDg2X19QQUdFXzMyX0gKIAogLyoKICAqIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcC4KQEAgLTIwLDYgKzIwLDEyIEBACiAjZW5kaWYKICNkZWZpbmUgVEhSRUFEX1NJWkUgCShQQUdFX1NJWkUgPDwgVEhSRUFEX09SREVSKQogCisjZGVmaW5lIFNUQUNLRkFVTFRfU1RBQ0sgMAorI2RlZmluZSBET1VCTEVGQVVMVF9TVEFDSyAxCisjZGVmaW5lIE5NSV9TVEFDSyAwCisjZGVmaW5lIERFQlVHX1NUQUNLIDAKKyNkZWZpbmUgTUNFX1NUQUNLIDAKKyNkZWZpbmUgTl9FWENFUFRJT05fU1RBQ0tTIDEKIAogI2lmZGVmIENPTkZJR19YODZfUEFFCiAvKiA0ND0zMisxMiwgdGhlIGxpbWl0IHdlIGNhbiBmaXQgaW50byBhbiB1bnNpZ25lZCBsb25nIHBmbiAqLwpAQCAtMzMsNyArMzksNiBAQAogdHlwZWRlZiB1NjQJcHVkdmFsX3Q7CiB0eXBlZGVmIHU2NAlwZ2R2YWxfdDsKIHR5cGVkZWYgdTY0CXBncHJvdHZhbF90OwotdHlwZWRlZiB1NjQJcGh5c19hZGRyX3Q7CiAKIHR5cGVkZWYgdW5pb24gewogCXN0cnVjdCB7CkBAIC01NCw3ICs1OSw2IEBACiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcJcHVkdmFsX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcJcGdkdmFsX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcJcGdwcm90dmFsX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJcGh5c19hZGRyX3Q7CiAKIHR5cGVkZWYgdW5pb24gewogCXB0ZXZhbF90IHB0ZTsKQEAgLTczLDcgKzc3LDEyIEBACiAjZW5kaWYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgX19waHlzX2FkZHIoeCkJCSgoeCkgLSBQQUdFX09GRlNFVCkKKyNkZWZpbmUgX19waHlzX2FkZHJfbm9kZWJ1Zyh4KQkoKHgpIC0gUEFHRV9PRkZTRVQpCisjaWZkZWYgQ09ORklHX0RFQlVHX1ZJUlRVQUwKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9fcGh5c19hZGRyKHVuc2lnbmVkIGxvbmcpOworI2Vsc2UKKyNkZWZpbmUgX19waHlzX2FkZHIoeCkJCV9fcGh5c19hZGRyX25vZGVidWcoeCkKKyNlbmRpZgogI2RlZmluZSBfX3BoeXNfcmVsb2NfaGlkZSh4KQlSRUxPQ19ISURFKCh4KSwgMCkKIAogI2lmZGVmIENPTkZJR19GTEFUTUVNCkBAIC04OSwxMyArOTgsMTEgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgX19WTUFMTE9DX1JFU0VSVkU7CiBleHRlcm4gaW50IHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OwogCi0jZGVmaW5lIFZNQUxMT0NfUkVTRVJWRQkJKCh1bnNpZ25lZCBsb25nKV9fVk1BTExPQ19SRVNFUlZFKQotI2RlZmluZSBNQVhNRU0JCQkoLV9fUEFHRV9PRkZTRVQgLSBfX1ZNQUxMT0NfUkVTRVJWRSkKLQogZXh0ZXJuIHZvaWQgZmluZF9sb3dfcGZuX3JhbmdlKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5pdF9tZW1vcnlfbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJCQkgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIHZvaWQgaW5pdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3Iodm9pZCk7CiAKIApAQCAtMTI2LDQgKzEzMyw0IEBACiAjZW5kaWYJLyogQ09ORklHX1g4Nl8zRE5PVyAqLwogI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmIC8qIF9BU01fWDg2X1BBR0VfMzJfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBR0VfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BhZ2VfNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzY0LmgKaW5kZXggYzY5MTZjOC4uNDkzODBiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BhZ2VfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGFnZV82NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfWDg2XzY0X1BBR0VfSAotI2RlZmluZSBfWDg2XzY0X1BBR0VfSAorI2lmbmRlZiBBU01fWDg2X19QQUdFXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEFHRV82NF9ICiAKICNkZWZpbmUgUEFHRVRBQkxFX0xFVkVMUwk0CiAKQEAgLTc5LDcgKzc5LDYgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwdWR2YWxfdDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwZ2R2YWxfdDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZwlwZ3Byb3R2YWxfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlwaHlzX2FkZHJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogCkBAIC05MSw2ICs5MCw3IEBACiAJCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIGV4dGVybiB2b2lkIGluaXRtZW1faW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKK2V4dGVybiB2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9leHRyYV9tYXBwaW5nX3VjKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGluaXRfZXh0cmFfbWFwcGluZ193Yih1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CkBAIC0xMDIsNCArMTAyLDQgQEAKICNlbmRpZgogCiAKLSNlbmRpZiAvKiBfWDg2XzY0X1BBR0VfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBR0VfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BhcmFtLmggYi9pbmNsdWRlL2FzbS14ODYvcGFyYW0uaAppbmRleCA2ZjBkMDQyLi4wMDA5Y2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGFyYW0uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfUEFSQU1fSAotI2RlZmluZSBfQVNNX1g4Nl9QQVJBTV9ICisjaWZuZGVmIEFTTV9YODZfX1BBUkFNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEFSQU1fSAogCiAjaWZkZWYgX19LRVJORUxfXwogIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCkBAIC0xOSw0ICsxOSw0IEBACiAKICNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JNjQJLyogbWF4IGxlbmd0aCBvZiBob3N0bmFtZSAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfUEFSQU1fSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wYXJhdmlydC5oIGIvaW5jbHVkZS9hc20teDg2L3BhcmF2aXJ0LmgKaW5kZXggZmJiZGU5M2YuLjhkNmFlMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wYXJhdmlydC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wYXJhdmlydC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9QQVJBVklSVF9ICi0jZGVmaW5lIF9fQVNNX1BBUkFWSVJUX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUEFSQVZJUlRfSAorI2RlZmluZSBBU01fWDg2X19QQVJBVklSVF9ICiAvKiBWYXJpb3VzIGluc3RydWN0aW9ucyBvbiB4ODYgbmVlZCB0byBiZSByZXBsYWNlZCBmb3IKICAqIHBhcmEtdmlydHVhbGl6YXRpb246IHRob3NlIGhvb2tzIGFyZSBkZWZpbmVkIGhlcmUuICovCiAKQEAgLTEyNCw2ICsxMjQsOSBAQAogCQkJCWludCBlbnRyeW51bSwgY29uc3Qgdm9pZCAqZGVzYywgaW50IHNpemUpOwogCXZvaWQgKCp3cml0ZV9pZHRfZW50cnkpKGdhdGVfZGVzYyAqLAogCQkJCWludCBlbnRyeW51bSwgY29uc3QgZ2F0ZV9kZXNjICpnYXRlKTsKKwl2b2lkICgqYWxsb2NfbGR0KShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcyk7CisJdm9pZCAoKmZyZWVfbGR0KShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcyk7CisKIAl2b2lkICgqbG9hZF9zcDApKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0KTsKIAogCXZvaWQgKCpzZXRfaW9wbF9tYXNrKSh1bnNpZ25lZCBtYXNrKTsKQEAgLTEzNyw2ICsxNDAsNyBAQAogCiAJLyogTVNSLCBQTUMgYW5kIFRTUiBvcGVyYXRpb25zLgogCSAgIGVyciA9IDAvLUVGQVVMVC4gIHdybXNyIHJldHVybnMgMC8tRUZBVUxULiAqLworCXU2NCAoKnJlYWRfbXNyX2FtZCkodW5zaWduZWQgaW50IG1zciwgaW50ICplcnIpOwogCXU2NCAoKnJlYWRfbXNyKSh1bnNpZ25lZCBpbnQgbXNyLCBpbnQgKmVycik7CiAJaW50ICgqd3JpdGVfbXNyKSh1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhpZ2gpOwogCkBAIC0yMDAsMTIgKzIwNCw2IEBACiAKIHN0cnVjdCBwdl9hcGljX29wcyB7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JLyoKLQkgKiBEaXJlY3QgQVBJQyBvcGVyYXRpb25zLCBwcmluY2lwYWxseSBmb3IgVk1JLiAgSWRlYWxseQotCSAqIHRoZXNlIHNob3VsZG4ndCBiZSBpbiB0aGlzIGludGVyZmFjZS4KLQkgKi8KLQl2b2lkICgqYXBpY193cml0ZSkodW5zaWduZWQgbG9uZyByZWcsIHUzMiB2KTsKLQl1MzIgKCphcGljX3JlYWQpKHVuc2lnbmVkIGxvbmcgcmVnKTsKIAl2b2lkICgqc2V0dXBfYm9vdF9jbG9jaykodm9pZCk7CiAJdm9pZCAoKnNldHVwX3NlY29uZGFyeV9jbG9jaykodm9pZCk7CiAKQEAgLTI1NywxMyArMjU1LDEzIEBACiAJICogSG9va3MgZm9yIGFsbG9jYXRpbmcvcmVsZWFzaW5nIHBhZ2V0YWJsZSBwYWdlcyB3aGVuIHRoZXkncmUKIAkgKiBhdHRhY2hlZCB0byBhIHBhZ2V0YWJsZQogCSAqLwotCXZvaWQgKCphbGxvY19wdGUpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgcGZuKTsKLQl2b2lkICgqYWxsb2NfcG1kKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIHBmbik7Ci0Jdm9pZCAoKmFsbG9jX3BtZF9jbG9uZSkodTMyIHBmbiwgdTMyIGNsb25lcGZuLCB1MzIgc3RhcnQsIHUzMiBjb3VudCk7Ci0Jdm9pZCAoKmFsbG9jX3B1ZCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBwZm4pOwotCXZvaWQgKCpyZWxlYXNlX3B0ZSkodTMyIHBmbik7Ci0Jdm9pZCAoKnJlbGVhc2VfcG1kKSh1MzIgcGZuKTsKLQl2b2lkICgqcmVsZWFzZV9wdWQpKHUzMiBwZm4pOworCXZvaWQgKCphbGxvY19wdGUpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbik7CisJdm9pZCAoKmFsbG9jX3BtZCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKTsKKwl2b2lkICgqYWxsb2NfcG1kX2Nsb25lKSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBjbG9uZXBmbiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisJdm9pZCAoKmFsbG9jX3B1ZCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKTsKKwl2b2lkICgqcmVsZWFzZV9wdGUpKHVuc2lnbmVkIGxvbmcgcGZuKTsKKwl2b2lkICgqcmVsZWFzZV9wbWQpKHVuc2lnbmVkIGxvbmcgcGZuKTsKKwl2b2lkICgqcmVsZWFzZV9wdWQpKHVuc2lnbmVkIGxvbmcgcGZuKTsKIAogCS8qIFBhZ2V0YWJsZSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCiAJdm9pZCAoKnNldF9wdGUpKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOwpAQCAtMzMwLDYgKzMyOCw3IEBACiAJaW50ICgqc3Bpbl9pc19sb2NrZWQpKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2spOwogCWludCAoKnNwaW5faXNfY29udGVuZGVkKShzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKTsKIAl2b2lkICgqc3Bpbl9sb2NrKShzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrKTsKKwl2b2lkICgqc3Bpbl9sb2NrX2ZsYWdzKShzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAlpbnQgKCpzcGluX3RyeWxvY2spKHN0cnVjdCByYXdfc3BpbmxvY2sgKmxvY2spOwogCXZvaWQgKCpzcGluX3VubG9jaykoc3RydWN0IHJhd19zcGlubG9jayAqbG9jayk7CiB9OwpAQCAtNzI2LDYgKzcyNSwxMCBAQAogewogCXJldHVybiBQVk9QX0NBTEwyKHU2NCwgcHZfY3B1X29wcy5yZWFkX21zciwgbXNyLCBlcnIpOwogfQorc3RhdGljIGlubGluZSB1NjQgcGFyYXZpcnRfcmVhZF9tc3JfYW1kKHVuc2lnbmVkIG1zciwgaW50ICplcnIpCit7CisJcmV0dXJuIFBWT1BfQ0FMTDIodTY0LCBwdl9jcHVfb3BzLnJlYWRfbXNyX2FtZCwgbXNyLCBlcnIpOworfQogc3RhdGljIGlubGluZSBpbnQgcGFyYXZpcnRfd3JpdGVfbXNyKHVuc2lnbmVkIG1zciwgdW5zaWduZWQgbG93LCB1bnNpZ25lZCBoaWdoKQogewogCXJldHVybiBQVk9QX0NBTEwzKGludCwgcHZfY3B1X29wcy53cml0ZV9tc3IsIG1zciwgbG93LCBoaWdoKTsKQEAgLTc3MSw2ICs3NzQsMTMgQEAKIAkqcCA9IHBhcmF2aXJ0X3JlYWRfbXNyKG1zciwgJmVycik7CiAJcmV0dXJuIGVycjsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHJkbXNybF9hbWRfc2FmZSh1bnNpZ25lZCBtc3IsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcCkKK3sKKwlpbnQgZXJyOworCisJKnAgPSBwYXJhdmlydF9yZWFkX21zcl9hbWQobXNyLCAmZXJyKTsKKwlyZXR1cm4gZXJyOworfQogCiBzdGF0aWMgaW5saW5lIHU2NCBwYXJhdmlydF9yZWFkX3RzYyh2b2lkKQogewpAQCAtODI0LDYgKzgzNCwxNiBAQAogCShhdXgpID0gX19hdXg7CQkJCQlcCiB9IHdoaWxlICgwKQogCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfbGR0KHN0cnVjdCBkZXNjX3N0cnVjdCAqbGR0LCB1bnNpZ25lZCBlbnRyaWVzKQoreworCVBWT1BfVkNBTEwyKHB2X2NwdV9vcHMuYWxsb2NfbGR0LCBsZHQsIGVudHJpZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfZnJlZV9sZHQoc3RydWN0IGRlc2Nfc3RydWN0ICpsZHQsIHVuc2lnbmVkIGVudHJpZXMpCit7CisJUFZPUF9WQ0FMTDIocHZfY3B1X29wcy5mcmVlX2xkdCwgbGR0LCBlbnRyaWVzKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGxvYWRfVFJfZGVzYyh2b2lkKQogewogCVBWT1BfVkNBTEwwKHB2X2NwdV9vcHMubG9hZF90cl9kZXNjKTsKQEAgLTg5OCwxOSArOTE4LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotLyoKLSAqIEJhc2ljIGZ1bmN0aW9ucyBhY2Nlc3NpbmcgQVBJQ3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcGljX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1MzIgdikKLXsKLQlQVk9QX1ZDQUxMMihwdl9hcGljX29wcy5hcGljX3dyaXRlLCByZWcsIHYpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBhcGljX3JlYWQodW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuIFBWT1BfQ0FMTDEodW5zaWduZWQgbG9uZywgcHZfYXBpY19vcHMuYXBpY19yZWFkLCByZWcpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfYm9vdF9jbG9jayh2b2lkKQogewogCVBWT1BfVkNBTEwwKHB2X2FwaWNfb3BzLnNldHVwX2Jvb3RfY2xvY2spOwpAQCAtOTkzLDM1ICsxMDAwLDM1IEBACiAJUFZPUF9WQ0FMTDIocHZfbW11X29wcy5wZ2RfZnJlZSwgbW0sIHBnZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIHBmbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9hbGxvY19wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCVBWT1BfVkNBTEwyKHB2X21tdV9vcHMuYWxsb2NfcHRlLCBtbSwgcGZuKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3B0ZSh1bnNpZ25lZCBwZm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfcmVsZWFzZV9wdGUodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJUFZPUF9WQ0FMTDEocHZfbW11X29wcy5yZWxlYXNlX3B0ZSwgcGZuKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X2FsbG9jX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgcGZuKQorc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X2FsbG9jX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJUFZPUF9WQ0FMTDIocHZfbW11X29wcy5hbGxvY19wbWQsIG1tLCBwZm4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcG1kX2Nsb25lKHVuc2lnbmVkIHBmbiwgdW5zaWduZWQgY2xvbmVwZm4sCi0JCQkJCSAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfYWxsb2NfcG1kX2Nsb25lKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIGNsb25lcGZuLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlQVk9QX1ZDQUxMNChwdl9tbXVfb3BzLmFsbG9jX3BtZF9jbG9uZSwgcGZuLCBjbG9uZXBmbiwgc3RhcnQsIGNvdW50KTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3BtZCh1bnNpZ25lZCBwZm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcGFyYXZpcnRfcmVsZWFzZV9wbWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJUFZPUF9WQ0FMTDEocHZfbW11X29wcy5yZWxlYXNlX3BtZCwgcGZuKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X2FsbG9jX3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgcGZuKQorc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X2FsbG9jX3B1ZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJUFZPUF9WQ0FMTDIocHZfbW11X29wcy5hbGxvY19wdWQsIG1tLCBwZm4pOwogfQotc3RhdGljIGlubGluZSB2b2lkIHBhcmF2aXJ0X3JlbGVhc2VfcHVkKHVuc2lnbmVkIHBmbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJhdmlydF9yZWxlYXNlX3B1ZCh1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlQVk9QX1ZDQUxMMShwdl9tbXVfb3BzLnJlbGVhc2VfcHVkLCBwZm4pOwogfQpAQCAtMTQwMSw2ICsxNDA4LDEyIEBACiAJUFZPUF9WQ0FMTDEocHZfbG9ja19vcHMuc3Bpbl9sb2NrLCBsb2NrKTsKIH0KIAorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhzdHJ1Y3QgcmF3X3NwaW5sb2NrICpsb2NrLAorCQkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCVBWT1BfVkNBTEwyKHB2X2xvY2tfb3BzLnNwaW5fbG9ja19mbGFncywgbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2soc3RydWN0IHJhd19zcGlubG9jayAqbG9jaykKIHsKIAlyZXR1cm4gUFZPUF9DQUxMMShpbnQsIHB2X2xvY2tfb3BzLnNwaW5fdHJ5bG9jaywgbG9jayk7CkBAIC0xNjM0LDQgKzE2NDcsNCBAQAogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogQ09ORklHX1BBUkFWSVJUICovCi0jZW5kaWYJLyogX19BU01fUEFSQVZJUlRfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBUkFWSVJUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wYXJwb3J0LmggYi9pbmNsdWRlL2FzbS14ODYvcGFycG9ydC5oCmluZGV4IDNjNGZmZWIuLjJlM2RkYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wYXJwb3J0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BhcnBvcnQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfUEFSUE9SVF9ICi0jZGVmaW5lIF9BU01fWDg2X1BBUlBPUlRfSAorI2lmbmRlZiBBU01fWDg2X19QQVJQT1JUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEFSUE9SVF9ICiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBhcnBvcnRfcGNfZmluZF9pc2FfcG9ydHMoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKTsKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBhcnBvcnRfcGNfZmluZF9ub25wY2lfcG9ydHMoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKQpAQCAtNyw0ICs3LDQgQEAKIAlyZXR1cm4gcGFycG9ydF9wY19maW5kX2lzYV9wb3J0cyhhdXRvaXJxLCBhdXRvZG1hKTsKIH0KIAotI2VuZGlmIC8qIF9BU01fWDg2X1BBUlBPUlRfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BBUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BhdC5oIGIvaW5jbHVkZS9hc20teDg2L3BhdC5oCmluZGV4IDdlZGM0NzMuLjQ4MmMzZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGF0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fUEFUX0gKLSNkZWZpbmUgX0FTTV9QQVRfSAorI2lmbmRlZiBBU01fWDg2X19QQVRfSAorI2RlZmluZSBBU01fWDg2X19QQVRfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApAQCAtMTksNCArMTksNCBAQAogCiBleHRlcm4gdm9pZCBwYXRfZGlzYWJsZShjaGFyICpyZWFzb24pOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BjaS1kaXJlY3QuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wY2ktZGlyZWN0LmgKaW5kZXggODBjNzc1ZC4uZGE0MmJlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BjaS1kaXJlY3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGNpLWRpcmVjdC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBBU01fUENJX0RJUkVDVF9ICi0jZGVmaW5lIEFTTV9QQ0lfRElSRUNUX0ggMQorI2lmbmRlZiBBU01fWDg2X19QQ0lfRElSRUNUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUENJX0RJUkVDVF9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCkBAIC0xOCw0ICsxOCw0IEBACiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9lYXJseV9kdW1wX3JlZ3M7CiBleHRlcm4gdm9pZCBlYXJseV9kdW1wX3BjaV9kZXZpY2UodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jKTsKIGV4dGVybiB2b2lkIGVhcmx5X2R1bXBfcGNpX2RldmljZXModm9pZCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19QQ0lfRElSRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wY2kuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wY2kuaAppbmRleCAyZGIxNGNmLi42MDI1ODMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BjaS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX3g4Nl9QQ0lfSAotI2RlZmluZSBfX3g4Nl9QQ0lfSAorI2lmbmRlZiBBU01fWDg2X19QQ0lfSAorI2RlZmluZSBBU01fWDg2X19QQ0lfSAogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4gLyogZm9yIHN0cnVjdCBwYWdlICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTExMSw0ICsxMTEsNCBAQAogfQogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1BDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGNpXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvcGNpXzMyLmgKaW5kZXggYTUwZDQ2OC4uM2YyMjg4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BjaV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wY2lfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19pMzg2X1BDSV9ICi0jZGVmaW5lIF9faTM4Nl9QQ0lfSAorI2lmbmRlZiBBU01fWDg2X19QQ0lfMzJfSAorI2RlZmluZSBBU01fWDg2X19QQ0lfMzJfSAogCiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0zMSw0ICszMSw0IEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAKLSNlbmRpZiAvKiBfX2kzODZfUENJX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QQ0lfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BjaV82NC5oIGIvaW5jbHVkZS9hc20teDg2L3BjaV82NC5oCmluZGV4IGYzMzAyMzQuLmY3MmUxMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wY2lfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGNpXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9feDg2NjRfUENJX0gKLSNkZWZpbmUgX194ODY2NF9QQ0lfSAorI2lmbmRlZiBBU01fWDg2X19QQ0lfNjRfSAorI2RlZmluZSBBU01fWDg2X19QQ0lfNjRfSAogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC02Myw0ICs2Myw0IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZiAvKiBfX3g4NjY0X1BDSV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUENJXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wZGEuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZGEuaAppbmRleCBiMzRlOWE3Li44MDg2MGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGRhLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BkYS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBYODZfNjRfUERBX0gKLSNkZWZpbmUgWDg2XzY0X1BEQV9ICisjaWZuZGVmIEFTTV9YODZfX1BEQV9ICisjZGVmaW5lIEFTTV9YODZfX1BEQV9ICiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CkBAIC0xMzQsNCArMTM0LDQgQEAKIAogI2RlZmluZSBQREFfU1RBQ0tPRkZTRVQgKDUqOCkKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fUERBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wZXJjcHUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZXJjcHUuaAppbmRleCBmNjQzYTNhOS4uZTEwYTFkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZXJjcHUuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfUEVSQ1BVX0hfCi0jZGVmaW5lIF9BU01fWDg2X1BFUkNQVV9IXworI2lmbmRlZiBBU01fWDg2X19QRVJDUFVfSAorI2RlZmluZSBBU01fWDg2X19QRVJDUFVfSAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC0yMTUsNCArMjE1LDQgQEAKIAogI2VuZGlmCS8qICFDT05GSUdfU01QICovCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9QRVJDUFVfSF8gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QRVJDUFVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jLmgKaW5kZXggZDYzZWE0My4uM2NkMjNhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGdhbGxvYy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9QR0FMTE9DX0gKLSNkZWZpbmUgX0FTTV9YODZfUEdBTExPQ19ICisjaWZuZGVmIEFTTV9YODZfX1BHQUxMT0NfSAorI2RlZmluZSBBU01fWDg2X19QR0FMTE9DX0gKIAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgkJLyogZm9yIHN0cnVjdCBwYWdlICovCkBAIC0xMTEsNCArMTExLDQgQEAKICNlbmRpZgkvKiBQQUdFVEFCTEVfTEVWRUxTID4gMyAqLwogI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPiAyICovCiAKLSNlbmRpZgkvKiBfQVNNX1g4Nl9QR0FMTE9DX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlLTJsZXZlbC1kZWZzLmggYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0ybGV2ZWwtZGVmcy5oCmluZGV4IDBmNzFjOWYuLjdlYzQ4ZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlLTJsZXZlbC1kZWZzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGUtMmxldmVsLWRlZnMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0kzODZfUEdUQUJMRV8yTEVWRUxfREVGU19ICi0jZGVmaW5lIF9JMzg2X1BHVEFCTEVfMkxFVkVMX0RFRlNfSAorI2lmbmRlZiBBU01fWDg2X19QR1RBQkxFXzJMRVZFTF9ERUZTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEdUQUJMRV8yTEVWRUxfREVGU19ICiAKICNkZWZpbmUgU0hBUkVEX0tFUk5FTF9QTUQJMAogCkBAIC0xNyw0ICsxNyw0IEBACiAKICNkZWZpbmUgUFRSU19QRVJfUFRFCTEwMjQKIAotI2VuZGlmIC8qIF9JMzg2X1BHVEFCTEVfMkxFVkVMX0RFRlNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BHVEFCTEVfMkxFVkVMX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BndGFibGUtMmxldmVsLmggYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0ybGV2ZWwuaAppbmRleCA0NmJjNTJjLi44MTc2MjA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0ybGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0ybGV2ZWwuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0kzODZfUEdUQUJMRV8yTEVWRUxfSAotI2RlZmluZSBfSTM4Nl9QR1RBQkxFXzJMRVZFTF9ICisjaWZuZGVmIEFTTV9YODZfX1BHVEFCTEVfMkxFVkVMX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEdUQUJMRV8yTEVWRUxfSAogCiAjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgKGUpLnB0ZV9sb3cpCkBAIC01Myw5ICs1Myw3IEBACiAjZGVmaW5lIG5hdGl2ZV9wdGVwX2dldF9hbmRfY2xlYXIoeHApIG5hdGl2ZV9sb2NhbF9wdGVwX2dldF9hbmRfY2xlYXIoeHApCiAjZW5kaWYKIAotI2RlZmluZSBwdGVfcGFnZSh4KQkJcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKICNkZWZpbmUgcHRlX25vbmUoeCkJCSghKHgpLnB0ZV9sb3cpCi0jZGVmaW5lIHB0ZV9wZm4oeCkJCShwdGVfdmFsKHgpID4+IFBBR0VfU0hJRlQpCiAKIC8qCiAgKiBCaXRzIDAsIDYgYW5kIDcgYXJlIHRha2VuLCBzcGxpdCB1cCB0aGUgMjkgYml0cyBvZiBvZmZzZXQKQEAgLTc4LDQgKzc2LDQgQEAKICNkZWZpbmUgX19wdGVfdG9fc3dwX2VudHJ5KHB0ZSkJCSgoc3dwX2VudHJ5X3QpIHsgKHB0ZSkucHRlX2xvdyB9KQogI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoeCkJCSgocHRlX3QpIHsgLnB0ZSA9ICh4KS52YWwgfSkKIAotI2VuZGlmIC8qIF9JMzg2X1BHVEFCTEVfMkxFVkVMX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QR1RBQkxFXzJMRVZFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0zbGV2ZWwtZGVmcy5oIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGUtM2xldmVsLWRlZnMuaAppbmRleCA0NDhhYzk1Li5jMDVmZTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0zbGV2ZWwtZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlLTNsZXZlbC1kZWZzLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9JMzg2X1BHVEFCTEVfM0xFVkVMX0RFRlNfSAotI2RlZmluZSBfSTM4Nl9QR1RBQkxFXzNMRVZFTF9ERUZTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUEdUQUJMRV8zTEVWRUxfREVGU19ICisjZGVmaW5lIEFTTV9YODZfX1BHVEFCTEVfM0xFVkVMX0RFRlNfSAogCiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAjZGVmaW5lIFNIQVJFRF9LRVJORUxfUE1ECShwdl9pbmZvLnNoYXJlZF9rZXJuZWxfcG1kKQpAQCAtMjUsNCArMjUsNCBAQAogICovCiAjZGVmaW5lIFBUUlNfUEVSX1BURQk1MTIKIAotI2VuZGlmIC8qIF9JMzg2X1BHVEFCTEVfM0xFVkVMX0RFRlNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BHVEFCTEVfM0xFVkVMX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BndGFibGUtM2xldmVsLmggYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0zbGV2ZWwuaAppbmRleCAxMDUwNTdmLi43NWY0Mjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0zbGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS0zbGV2ZWwuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0kzODZfUEdUQUJMRV8zTEVWRUxfSAotI2RlZmluZSBfSTM4Nl9QR1RBQkxFXzNMRVZFTF9ICisjaWZuZGVmIEFTTV9YODZfX1BHVEFCTEVfM0xFVkVMX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEdUQUJMRV8zTEVWRUxfSAogCiAvKgogICogSW50ZWwgUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24gKFBBRSkgTW9kZSAtIHRocmVlLWxldmVsIHBhZ2UKQEAgLTE1MSwxOCArMTUxLDExIEBACiAJcmV0dXJuIGEucHRlX2xvdyA9PSBiLnB0ZV9sb3cgJiYgYS5wdGVfaGlnaCA9PSBiLnB0ZV9oaWdoOwogfQogCi0jZGVmaW5lIHB0ZV9wYWdlKHgpCXBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9ub25lKHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gIXB0ZS5wdGVfbG93ICYmICFwdGUucHRlX2hpZ2g7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfcGZuKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKLX0KLQogLyoKICAqIEJpdHMgMCwgNiBhbmQgNyBhcmUgdGFrZW4gaW4gdGhlIGxvdyBwYXJ0IG9mIHRoZSBwdGUsCiAgKiBwdXQgdGhlIDMyIGJpdHMgb2Ygb2Zmc2V0IGludG8gdGhlIGhpZ2ggcGFydC4KQEAgLTE3OSw0ICsxNzIsNCBAQAogI2RlZmluZSBfX3B0ZV90b19zd3BfZW50cnkocHRlKQkJKChzd3BfZW50cnlfdCl7IChwdGUpLnB0ZV9oaWdoIH0pCiAjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkJKChwdGVfdCl7IHsgLnB0ZV9oaWdoID0gKHgpLnZhbCB9IH0pCiAKLSNlbmRpZiAvKiBfSTM4Nl9QR1RBQkxFXzNMRVZFTF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUEdUQUJMRV8zTEVWRUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlLmgKaW5kZXggMDRjYWEyZi4uODhhNTNiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9QR1RBQkxFX0gKLSNkZWZpbmUgX0FTTV9YODZfUEdUQUJMRV9ICisjaWZuZGVmIEFTTV9YODZfX1BHVEFCTEVfSAorI2RlZmluZSBBU01fWDg2X19QR1RBQkxFX0gKIAogI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMAogCkBAIC0xNSwxMCArMTUsMTEgQEAKICNkZWZpbmUgX1BBR0VfQklUX1BBVAkJNwkvKiBvbiA0S0IgcGFnZXMgKi8KICNkZWZpbmUgX1BBR0VfQklUX0dMT0JBTAk4CS8qIEdsb2JhbCBUTEIgZW50cnkgUFBybysgKi8KICNkZWZpbmUgX1BBR0VfQklUX1VOVVNFRDEJOQkvKiBhdmFpbGFibGUgZm9yIHByb2dyYW1tZXIgKi8KLSNkZWZpbmUgX1BBR0VfQklUX1VOVVNFRDIJMTAKKyNkZWZpbmUgX1BBR0VfQklUX0lPTUFQCQkxMAkvKiBmbGFnIHVzZWQgdG8gaW5kaWNhdGUgSU8gbWFwcGluZyAqLwogI2RlZmluZSBfUEFHRV9CSVRfVU5VU0VEMwkxMQogI2RlZmluZSBfUEFHRV9CSVRfUEFUX0xBUkdFCTEyCS8qIE9uIDJNQiBvciAxR0IgcGFnZXMgKi8KICNkZWZpbmUgX1BBR0VfQklUX1NQRUNJQUwJX1BBR0VfQklUX1VOVVNFRDEKKyNkZWZpbmUgX1BBR0VfQklUX0NQQV9URVNUCV9QQUdFX0JJVF9VTlVTRUQxCiAjZGVmaW5lIF9QQUdFX0JJVF9OWCAgICAgICAgICAgNjMgICAgICAgLyogTm8gZXhlY3V0ZTogb25seSB2YWxpZCBhZnRlciBjcHVpZCBjaGVjayAqLwogCiAjZGVmaW5lIF9QQUdFX1BSRVNFTlQJKF9BVChwdGV2YWxfdCwgMSkgPDwgX1BBR0VfQklUX1BSRVNFTlQpCkBAIC0zMSwxMSArMzIsMTIgQEAKICNkZWZpbmUgX1BBR0VfUFNFCShfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9QU0UpCiAjZGVmaW5lIF9QQUdFX0dMT0JBTAkoX0FUKHB0ZXZhbF90LCAxKSA8PCBfUEFHRV9CSVRfR0xPQkFMKQogI2RlZmluZSBfUEFHRV9VTlVTRUQxCShfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9VTlVTRUQxKQotI2RlZmluZSBfUEFHRV9VTlVTRUQyCShfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9VTlVTRUQyKQorI2RlZmluZSBfUEFHRV9JT01BUAkoX0FUKHB0ZXZhbF90LCAxKSA8PCBfUEFHRV9CSVRfSU9NQVApCiAjZGVmaW5lIF9QQUdFX1VOVVNFRDMJKF9BVChwdGV2YWxfdCwgMSkgPDwgX1BBR0VfQklUX1VOVVNFRDMpCiAjZGVmaW5lIF9QQUdFX1BBVAkoX0FUKHB0ZXZhbF90LCAxKSA8PCBfUEFHRV9CSVRfUEFUKQogI2RlZmluZSBfUEFHRV9QQVRfTEFSR0UgKF9BVChwdGV2YWxfdCwgMSkgPDwgX1BBR0VfQklUX1BBVF9MQVJHRSkKICNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkoX0FUKHB0ZXZhbF90LCAxKSA8PCBfUEFHRV9CSVRfU1BFQ0lBTCkKKyNkZWZpbmUgX1BBR0VfQ1BBX1RFU1QJKF9BVChwdGV2YWxfdCwgMSkgPDwgX1BBR0VfQklUX0NQQV9URVNUKQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfUEFFKQpAQCAtOTcsNiArOTksMTEgQEAKICNkZWZpbmUgX19QQUdFX0tFUk5FTF9MQVJHRV9OT0NBQ0hFCShfX1BBR0VfS0VSTkVMIHwgX1BBR0VfQ0FDSEVfVUMgfCBfUEFHRV9QU0UpCiAjZGVmaW5lIF9fUEFHRV9LRVJORUxfTEFSR0VfRVhFQwkoX19QQUdFX0tFUk5FTF9FWEVDIHwgX1BBR0VfUFNFKQogCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfSU8JCShfX1BBR0VfS0VSTkVMIHwgX1BBR0VfSU9NQVApCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfSU9fTk9DQUNIRQkoX19QQUdFX0tFUk5FTF9OT0NBQ0hFIHwgX1BBR0VfSU9NQVApCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfSU9fVUNfTUlOVVMJKF9fUEFHRV9LRVJORUxfVUNfTUlOVVMgfCBfUEFHRV9JT01BUCkKKyNkZWZpbmUgX19QQUdFX0tFUk5FTF9JT19XQwkJKF9fUEFHRV9LRVJORUxfV0MgfCBfUEFHRV9JT01BUCkKKwogI2RlZmluZSBQQUdFX0tFUk5FTAkJCV9fcGdwcm90KF9fUEFHRV9LRVJORUwpCiAjZGVmaW5lIFBBR0VfS0VSTkVMX1JPCQkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9STykKICNkZWZpbmUgUEFHRV9LRVJORUxfRVhFQwkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9FWEVDKQpAQCAtMTExLDYgKzExOCwxMSBAQAogI2RlZmluZSBQQUdFX0tFUk5FTF9WU1lTQ0FMTAkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9WU1lTQ0FMTCkKICNkZWZpbmUgUEFHRV9LRVJORUxfVlNZU0NBTExfTk9DQUNIRQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX1ZTWVNDQUxMX05PQ0FDSEUpCiAKKyNkZWZpbmUgUEFHRV9LRVJORUxfSU8JCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0lPKQorI2RlZmluZSBQQUdFX0tFUk5FTF9JT19OT0NBQ0hFCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0lPX05PQ0FDSEUpCisjZGVmaW5lIFBBR0VfS0VSTkVMX0lPX1VDX01JTlVTCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0lPX1VDX01JTlVTKQorI2RlZmluZSBQQUdFX0tFUk5FTF9JT19XQwkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9JT19XQykKKwogLyogICAgICAgICB4d3IgKi8KICNkZWZpbmUgX19QMDAwCVBBR0VfTk9ORQogI2RlZmluZSBfX1AwMDEJUEFHRV9SRUFET05MWQpAQCAtMTMwLDYgKzE0MiwyMiBAQAogI2RlZmluZSBfX1MxMTAJUEFHRV9TSEFSRURfRVhFQwogI2RlZmluZSBfX1MxMTEJUEFHRV9TSEFSRURfRVhFQwogCisvKgorICogZWFybHkgaWRlbnRpdHkgbWFwcGluZyAgcHRlIGF0dHJpYiBtYWNyb3MuCisgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIF9fUEFHRV9LRVJORUxfSURFTlRfTEFSR0VfRVhFQwlfX1BBR0VfS0VSTkVMX0xBUkdFX0VYRUMKKyNlbHNlCisvKgorICogRm9yIFBERV9JREVOVF9BVFRSIGluY2x1ZGUgVVNFUiBiaXQuIEFzIHRoZSBQREUgYW5kIFBURSBwcm90ZWN0aW9uCisgKiBiaXRzIGFyZSBjb21iaW5lZCwgdGhpcyB3aWxsIGFsb3cgdXNlciB0byBhY2Nlc3MgdGhlIGhpZ2ggYWRkcmVzcyBtYXBwZWQKKyAqIFZEU08gaW4gdGhlIHByZXNlbmNlIG9mIENPTkZJR19DT01QQVRfVkRTTworICovCisjZGVmaW5lIFBURV9JREVOVF9BVFRSCSAweDAwMwkJLyogUFJFU0VOVCtSVyAqLworI2RlZmluZSBQREVfSURFTlRfQVRUUgkgMHgwNjcJCS8qIFBSRVNFTlQrUlcrVVNFUitESVJUWStBQ0NFU1NFRCAqLworI2RlZmluZSBQR0RfSURFTlRfQVRUUgkgMHgwMDEJCS8qIFBSRVNFTlQgKG5vIG90aGVyIGF0dHJpYnV0ZXMpICovCisjZW5kaWYKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoKQEAgLTE4Myw5ICsyMTEsMTYgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcHRlX3NwZWNpYWwocHRlX3QgcHRlKQogewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9TUEVDSUFMOworCXJldHVybiBwdGVfZmxhZ3MocHRlKSAmIF9QQUdFX1NQRUNJQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfcGZuKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKK30KKworI2RlZmluZSBwdGVfcGFnZShwdGUpCXBmbl90b19wYWdlKHB0ZV9wZm4ocHRlKSkKKwogc3RhdGljIGlubGluZSBpbnQgcG1kX2xhcmdlKHBtZF90IHB0ZSkKIHsKIAlyZXR1cm4gKHBtZF92YWwocHRlKSAmIChfUEFHRV9QU0UgfCBfUEFHRV9QUkVTRU5UKSkgPT0KQEAgLTMxMyw2ICszNDgsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9wYWdldGFibGVfc2V0dXBfZG9uZShwZ2RfdCAqYmFzZSkge30KICNlbmRpZgogCitleHRlcm4gaW50IGFyY2hfcmVwb3J0X21lbWluZm8oY2hhciAqcGFnZSk7CisKICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNlbHNlICAvKiAhQ09ORklHX1BBUkFWSVJUICovCkBAIC01MjEsNCArNTU4LDQgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZgkvKiBfQVNNX1g4Nl9QR1RBQkxFX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QR1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV8zMi5oCmluZGV4IDVjM2IyNjUuLjhkZTcwMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlXzMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGVfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0kzODZfUEdUQUJMRV9ICi0jZGVmaW5lIF9JMzg2X1BHVEFCTEVfSAorI2lmbmRlZiBBU01fWDg2X19QR1RBQkxFXzMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUEdUQUJMRV8zMl9ICiAKIAogLyoKQEAgLTMxLDYgKzMxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19wZ3RfY2FjaGUodm9pZCkgeyB9CiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwogCitleHRlcm4gdm9pZCBzZXRfcG1kX3Bmbih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBwZ3Byb3RfdCk7CiAKIC8qCiAgKiBUaGUgTGludXggeDg2IHBhZ2luZyBhcmNoaXRlY3R1cmUgaXMgJ2NvbXBpbGUtdGltZSBkdWFsLW1vZGUnLCBpdApAQCAtNTYsOCArNTcsNyBAQAogICogYXJlYSBmb3IgdGhlIHNhbWUgcmVhc29uLiA7KQogICovCiAjZGVmaW5lIFZNQUxMT0NfT0ZGU0VUCSg4ICogMTAyNCAqIDEwMjQpCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQJKCgodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSArIDIgKiBWTUFMTE9DX09GRlNFVCAtIDEpIFwKLQkJCSAmIH4oVk1BTExPQ19PRkZTRVQgLSAxKSkKKyNkZWZpbmUgVk1BTExPQ19TVEFSVAkoKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkgKyBWTUFMTE9DX09GRlNFVCkKICNpZmRlZiBDT05GSUdfWDg2X1BBRQogI2RlZmluZSBMQVNUX1BLTUFQIDUxMgogI2Vsc2UKQEAgLTczLDYgKzczLDggQEAKICMgZGVmaW5lIFZNQUxMT0NfRU5ECShGSVhBRERSX1NUQVJUIC0gMiAqIFBBR0VfU0laRSkKICNlbmRpZgogCisjZGVmaW5lIE1BWE1FTQkoVk1BTExPQ19FTkQgLSBQQUdFX09GRlNFVCAtIF9fVk1BTExPQ19SRVNFUlZFKQorCiAvKgogICogRGVmaW5lIHRoaXMgaWYgdGhpbmdzIHdvcmsgZGlmZmVyZW50bHkgb24gYW4gaTM4NiBhbmQgYW4gaTQ4NjoKICAqIGl0IHdpbGwgKG9uIGFuIGk0ODYpIHdhcm4gYWJvdXQga2VybmVsIG1lbW9yeSBhY2Nlc3NlcyB0aGF0IGFyZQpAQCAtMTg2LDQgKzE4OCw0IEBACiAjZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCVwKIAlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQogCi0jZW5kaWYgLyogX0kzODZfUEdUQUJMRV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUEdUQUJMRV8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV82NC5oIGIvaW5jbHVkZS9hc20teDg2L3BndGFibGVfNjQuaAppbmRleCA1NDkxNDRkLi5mZGU5NzcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGd0YWJsZV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ3RhYmxlXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9YODZfNjRfUEdUQUJMRV9ICi0jZGVmaW5lIF9YODZfNjRfUEdUQUJMRV9ICisjaWZuZGVmIEFTTV9YODZfX1BHVEFCTEVfNjRfSAorI2RlZmluZSBBU01fWDg2X19QR1RBQkxFXzY0X0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpAQCAtMTc1LDggKzE3NSw2IEBACiAjZGVmaW5lIHB0ZV9wcmVzZW50KHgpCShwdGVfdmFsKCh4KSkgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FKSkKIAogI2RlZmluZSBwYWdlc190b19tYih4KQkoKHgpID4+ICgyMCAtIFBBR0VfU0hJRlQpKSAgIC8qIEZJWE1FOiBpcyB0aGlzIHJpZ2h0PyAqLwotI2RlZmluZSBwdGVfcGFnZSh4KQlwZm5fdG9fcGFnZShwdGVfcGZuKCh4KSkpCi0jZGVmaW5lIHB0ZV9wZm4oeCkJKChwdGVfdmFsKCh4KSkgJiBfX1BIWVNJQ0FMX01BU0spID4+IFBBR0VfU0hJRlQpCiAKIC8qCiAgKiBNYWNybyB0byBtYXJrIGEgcGFnZSBwcm90ZWN0aW9uIHZhbHVlIGFzICJ1bmNhY2hlYWJsZSIuCkBAIC0yODQsNCArMjgyLDQgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZiAvKiBfWDg2XzY0X1BHVEFCTEVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BHVEFCTEVfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Bvc2l4X3R5cGVzXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaAppbmRleCBiMDMxZWZkLi43MGNmMmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19BUkNIX0kzODZfUE9TSVhfVFlQRVNfSAotI2RlZmluZSBfX0FSQ0hfSTM4Nl9QT1NJWF9UWVBFU19ICisjaWZuZGVmIEFTTV9YODZfX1BPU0lYX1RZUEVTXzMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUE9TSVhfVFlQRVNfMzJfSAogCiAvKgogICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCkBAIC04Miw0ICs4Miw0IEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1BPU0lYX1RZUEVTXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wb3NpeF90eXBlc182NC5oIGIvaW5jbHVkZS9hc20teDg2L3Bvc2l4X3R5cGVzXzY0LmgKaW5kZXggZDY2MjRjOS4uMzg4YjRlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Bvc2l4X3R5cGVzXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3Bvc2l4X3R5cGVzXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2XzY0X1BPU0lYX1RZUEVTX0gKLSNkZWZpbmUgX0FTTV9YODZfNjRfUE9TSVhfVFlQRVNfSAorI2lmbmRlZiBBU01fWDg2X19QT1NJWF9UWVBFU182NF9ICisjZGVmaW5lIEFTTV9YODZfX1BPU0lYX1RZUEVTXzY0X0gKIAogLyoKICAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bwpAQCAtMTE2LDQgKzExNiw0IEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1BPU0lYX1RZUEVTXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wcmN0bC5oIGIvaW5jbHVkZS9hc20teDg2L3ByY3RsLmgKaW5kZXggNTI5NTJhZC4uZTdhZTM0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3ByY3RsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3ByY3RsLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIFg4Nl82NF9QUkNUTF9ICi0jZGVmaW5lIFg4Nl82NF9QUkNUTF9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fUFJDVExfSAorI2RlZmluZSBBU01fWDg2X19QUkNUTF9ICiAKICNkZWZpbmUgQVJDSF9TRVRfR1MgMHgxMDAxCiAjZGVmaW5lIEFSQ0hfU0VUX0ZTIDB4MTAwMgpAQCAtNyw0ICs3LDQgQEAKICNkZWZpbmUgQVJDSF9HRVRfR1MgMHgxMDA0CiAKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Byb2Nlc3Nvci1jeXJpeC5oIGIvaW5jbHVkZS9hc20teDg2L3Byb2Nlc3Nvci1jeXJpeC5oCmluZGV4IDk3NTY4YWQuLjExOThmMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3ItY3lyaXguaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcHJvY2Vzc29yLWN5cml4LmgKQEAgLTI4LDMgKzI4LDExIEBACiAJb3V0YihyZWcsIDB4MjIpOwogCW91dGIoZGF0YSwgMHgyMyk7CiB9CisKKyNkZWZpbmUgZ2V0Q3g4Nl9vbGQocmVnKSAoeyBvdXRiKChyZWcpLCAweDIyKTsgaW5iKDB4MjMpOyB9KQorCisjZGVmaW5lIHNldEN4ODZfb2xkKHJlZywgZGF0YSkgZG8geyBcCisJb3V0YigocmVnKSwgMHgyMik7IFwKKwlvdXRiKChkYXRhKSwgMHgyMyk7IFwKK30gd2hpbGUgKDApCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3ItZmxhZ3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3ItZmxhZ3MuaAppbmRleCBlZmYyZWNkLi5kYzVmMDcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcHJvY2Vzc29yLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3Byb2Nlc3Nvci1mbGFncy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9JMzg2X1BST0NFU1NPUl9GTEFHU19ICi0jZGVmaW5lIF9fQVNNX0kzODZfUFJPQ0VTU09SX0ZMQUdTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUFJPQ0VTU09SX0ZMQUdTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUFJPQ0VTU09SX0ZMQUdTX0gKIC8qIFZhcmlvdXMgZmxhZ3MgZGVmaW5lZDogY2FuIGJlIGluY2x1ZGVkIGZyb20gYXNzZW1ibGVyLiAqLwogCiAvKgpAQCAtNTksNiArNTksNyBAQAogI2RlZmluZSBYODZfQ1I0X09TRlhTUgkweDAwMDAwMjAwIC8qIGVuYWJsZSBmYXN0IEZQVSBzYXZlIGFuZCByZXN0b3JlICovCiAjZGVmaW5lIFg4Nl9DUjRfT1NYTU1FWENQVCAweDAwMDAwNDAwIC8qIGVuYWJsZSB1bm1hc2tlZCBTU0UgZXhjZXB0aW9ucyAqLwogI2RlZmluZSBYODZfQ1I0X1ZNWEUJMHgwMDAwMjAwMCAvKiBlbmFibGUgVk1YIHZpcnR1YWxpemF0aW9uICovCisjZGVmaW5lIFg4Nl9DUjRfT1NYU0FWRSAweDAwMDQwMDAwIC8qIGVuYWJsZSB4c2F2ZSBhbmQgeHJlc3RvcmUgKi8KIAogLyoKICAqIHg4Ni02NCBUYXNrIFByaW9yaXR5IFJlZ2lzdGVyLCBDUjgKQEAgLTk2LDQgKzk3LDQgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNlbmRpZgkvKiBfX0FTTV9JMzg2X1BST0NFU1NPUl9GTEFHU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUFJPQ0VTU09SX0ZMQUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3IuaAppbmRleCA0ZGYzZTJmLi5lZTdjYmIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3Byb2Nlc3Nvci5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9YODZfUFJPQ0VTU09SX0gKLSNkZWZpbmUgX19BU01fWDg2X1BST0NFU1NPUl9ICisjaWZuZGVmIEFTTV9YODZfX1BST0NFU1NPUl9ICisjZGVmaW5lIEFTTV9YODZfX1BST0NFU1NPUl9ICiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2NfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9ub3BzLmg+CisjaW5jbHVkZSA8YXNtL2RzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KQEAgLTc1LDExICs3NiwxMSBAQAogCWludAkJCSB4ODZfdGxic2l6ZTsKIAlfX3U4CQkJeDg2X3ZpcnRfYml0czsKIAlfX3U4CQkJeDg2X3BoeXNfYml0czsKKyNlbmRpZgogCS8qIENQVUlEIHJldHVybmVkIGNvcmUgaWQgYml0czogKi8KIAlfX3U4CQkJeDg2X2NvcmVpZF9iaXRzOwogCS8qIE1heCBleHRlbmRlZCBDUFVJRCBmdW5jdGlvbiBzdXBwb3J0ZWQ6ICovCiAJX191MzIJCQlleHRlbmRlZF9jcHVpZF9sZXZlbDsKLSNlbmRpZgogCS8qIE1heGltdW0gc3VwcG9ydGVkIENQVUlEIGxldmVsLCAtMT1ubyBDUFVJRDogKi8KIAlpbnQJCQljcHVpZF9sZXZlbDsKIAlfX3UzMgkJCXg4Nl9jYXBhYmlsaXR5W05DQVBJTlRTXTsKQEAgLTE0MCw2ICsxNDEsOCBAQAogI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhCWJvb3RfY3B1X2RhdGEKICNlbmRpZgogCitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3A7CisKIHN0YXRpYyBpbmxpbmUgaW50IGhsdF93b3JrcyhpbnQgY3B1KQogewogI2lmZGVmIENPTkZJR19YODZfMzIKQEAgLTE1Myw2ICsxNTYsOCBAQAogCiBleHRlcm4gdm9pZCBjcHVfZGV0ZWN0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiAKK2V4dGVybiBzdHJ1Y3QgcHRfcmVncyAqaWRsZV9yZWdzKHN0cnVjdCBwdF9yZWdzICopOworCiBleHRlcm4gdm9pZCBlYXJseV9jcHVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGlkZW50aWZ5X2Jvb3RfY3B1KHZvaWQpOwogZXh0ZXJuIHZvaWQgaWRlbnRpZnlfc2Vjb25kYXJ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CkBAIC0xNjEsMTEgKzE2Niw4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGluaXRfaW50ZWxfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgbnVtX2NhY2hlX2xlYXZlczsKIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9IVCkgfHwgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorZXh0ZXJuIHZvaWQgZGV0ZWN0X2V4dGVuZGVkX3RvcG9sb2d5KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiBleHRlcm4gdm9pZCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgZGV0ZWN0X2h0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykge30KLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2NwdWlkKHVuc2lnbmVkIGludCAqZWF4LCB1bnNpZ25lZCBpbnQgKmVieCwKIAkJCQl1bnNpZ25lZCBpbnQgKmVjeCwgdW5zaWduZWQgaW50ICplZHgpCkBAIC0zMjIsNyArMzI0LDEyIEBACiAJLyogMTYqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyA9IDI1NiBieXRlczoJCQkqLwogCXUzMgkJCXhtbV9zcGFjZVs2NF07CiAKLQl1MzIJCQlwYWRkaW5nWzI0XTsKKwl1MzIJCQlwYWRkaW5nWzEyXTsKKworCXVuaW9uIHsKKwkJdTMyCQlwYWRkaW5nMVsxMl07CisJCXUzMgkJc3dfcmVzZXJ2ZWRbMTJdOworCX07CiAKIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKIApAQCAtMzQ2LDEwICszNTMsMjMgQEAKIAl1MzIJCQllbnRyeV9laXA7CiB9OwogCitzdHJ1Y3QgeHNhdmVfaGRyX3N0cnVjdCB7CisJdTY0IHhzdGF0ZV9idjsKKwl1NjQgcmVzZXJ2ZWQxWzJdOworCXU2NCByZXNlcnZlZDJbNV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgeHNhdmVfc3RydWN0IHsKKwlzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0IGkzODc7CisJc3RydWN0IHhzYXZlX2hkcl9zdHJ1Y3QgeHNhdmVfaGRyOworCS8qIG5ldyBwcm9jZXNzb3Igc3RhdGUgZXh0ZW5zaW9ucyB3aWxsIGdvIGhlcmUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCAoNjQpKSk7CisKIHVuaW9uIHRocmVhZF94c3RhdGUgewogCXN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdAlmc2F2ZTsKIAlzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0CWZ4c2F2ZTsKIAlzdHJ1Y3QgaTM4N19zb2Z0X3N0cnVjdAkJc29mdDsKKwlzdHJ1Y3QgeHNhdmVfc3RydWN0CQl4c2F2ZTsKIH07CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC00MTEsOSArNDMxLDE0IEBACiAJdW5zaWduZWQJCWlvX2JpdG1hcF9tYXg7CiAvKiBNU1JfSUEzMl9ERUJVR0NUTE1TUiB2YWx1ZSB0byBzd2l0Y2ggaW4gaWYgVElGX0RFQlVHQ1RMTVNSIGlzIHNldC4gICovCiAJdW5zaWduZWQgbG9uZwlkZWJ1Z2N0bG1zcjsKLS8qIERlYnVnIFN0b3JlIC0gaWYgbm90IDAgcG9pbnRzIHRvIGEgRFMgU2F2ZSBBcmVhIGNvbmZpZ3VyYXRpb247Ci0gKiAgICAgICAgICAgICAgIGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBICovCi0JdW5zaWduZWQgbG9uZwlkc19hcmVhX21zcjsKKyNpZmRlZiBDT05GSUdfWDg2X0RTCisvKiBEZWJ1ZyBTdG9yZSBjb250ZXh0OyBzZWUgaW5jbHVkZS9hc20teDg2L2RzLmg7IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBICovCisJc3RydWN0IGRzX2NvbnRleHQJKmRzX2N0eDsKKyNlbmRpZiAvKiBDT05GSUdfWDg2X0RTICovCisjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCisvKiB0aGUgc2lnbmFsIHRvIHNlbmQgb24gYSBidHMgYnVmZmVyIG92ZXJmbG93ICovCisJdW5zaWduZWQgaW50CWJ0c19vdmZsX3NpZ25hbDsKKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BUUkFDRV9CVFMgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuYXRpdmVfZ2V0X2RlYnVncmVnKGludCByZWdubykKQEAgLTU2MSw0MSArNTg2LDYgQEAKIAl3cml0ZV9jcjQoY3I0KTsKIH0KIAotc3RydWN0IG1pY3JvY29kZV9oZWFkZXIgewotCXVuc2lnbmVkIGludAkJaGRydmVyOwotCXVuc2lnbmVkIGludAkJcmV2OwotCXVuc2lnbmVkIGludAkJZGF0ZTsKLQl1bnNpZ25lZCBpbnQJCXNpZzsKLQl1bnNpZ25lZCBpbnQJCWNrc3VtOwotCXVuc2lnbmVkIGludAkJbGRydmVyOwotCXVuc2lnbmVkIGludAkJcGY7Ci0JdW5zaWduZWQgaW50CQlkYXRhc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCXRvdGFsc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCXJlc2VydmVkWzNdOwotfTsKLQotc3RydWN0IG1pY3JvY29kZSB7Ci0Jc3RydWN0IG1pY3JvY29kZV9oZWFkZXIJaGRyOwotCXVuc2lnbmVkIGludAkJYml0c1swXTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG1pY3JvY29kZQltaWNyb2NvZGVfdDsKLXR5cGVkZWYgc3RydWN0IG1pY3JvY29kZV9oZWFkZXIJbWljcm9jb2RlX2hlYWRlcl90OwotCi0vKiBtaWNyb2NvZGUgZm9ybWF0IGlzIGV4dGVuZGVkIGZyb20gcHJlc2NvdHQgcHJvY2Vzc29ycyAqLwotc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSB7Ci0JdW5zaWduZWQgaW50CQlzaWc7Ci0JdW5zaWduZWQgaW50CQlwZjsKLQl1bnNpZ25lZCBpbnQJCWNrc3VtOwotfTsKLQotc3RydWN0IGV4dGVuZGVkX3NpZ3RhYmxlIHsKLQl1bnNpZ25lZCBpbnQJCWNvdW50OwotCXVuc2lnbmVkIGludAkJY2tzdW07Ci0JdW5zaWduZWQgaW50CQlyZXNlcnZlZFszXTsKLQlzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlIHNpZ3NbMF07Ci19OwotCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZwkJc2VnOwogfSBtbV9zZWdtZW50X3Q7CkBAIC05NDMsNCArOTMzLDQgQEAKIGV4dGVybiBpbnQgZ2V0X3RzY19tb2RlKHVuc2lnbmVkIGxvbmcgYWRyKTsKIGV4dGVybiBpbnQgc2V0X3RzY19tb2RlKHVuc2lnbmVkIGludCB2YWwpOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Byb3RvLmggYi9pbmNsdWRlL2FzbS14ODYvcHJvdG8uaAppbmRleCAzZGQ0NThjLi42ZTg5ZThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcHJvdG8uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODY2NF9QUk9UT19ICi0jZGVmaW5lIF9BU01fWDg2NjRfUFJPVE9fSCAxCisjaWZuZGVmIEFTTV9YODZfX1BST1RPX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUFJPVE9fSAogCiAjaW5jbHVkZSA8YXNtL2xkdC5oPgogCkBAIC0yOSw0ICsyOSw0IEBACiAjZGVmaW5lIHJvdW5kX3VwKHgsIHkpICgoKHgpICsgKHkpIC0gMSkgJiB+KCh5KSAtIDEpKQogI2RlZmluZSByb3VuZF9kb3duKHgsIHkpICgoeCkgJiB+KCh5KSAtIDEpKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19QUk9UT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcHRyYWNlLWFiaS5oIGIvaW5jbHVkZS9hc20teDg2L3B0cmFjZS1hYmkuaAppbmRleCA3MmU3YjlkLi40Mjk4Yjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcHRyYWNlLWFiaS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wdHJhY2UtYWJpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9BQklfSAotI2RlZmluZSBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUFRSQUNFX0FCSV9ICisjZGVmaW5lIEFTTV9YODZfX1BUUkFDRV9BQklfSAogCiAjaWZkZWYgX19pMzg2X18KIApAQCAtODAsOCArODAsOSBAQAogCiAjZGVmaW5lIFBUUkFDRV9TSU5HTEVCTE9DSwkzMwkvKiByZXN1bWUgZXhlY3V0aW9uIHVudGlsIG5leHQgYnJhbmNoICovCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCisjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qIGNvbmZpZ3VyYXRpb24vc3RhdHVzIHN0cnVjdHVyZSB1c2VkIGluIFBUUkFDRV9CVFNfQ09ORklHIGFuZApAQCAtOTcsMjAgKzk4LDIwIEBACiAJLyogYWN0dWFsIHNpemUgb2YgYnRzX3N0cnVjdCBpbiBieXRlcyAqLwogCV9fdTMyIGJ0c19zaXplOwogfTsKLSNlbmRpZgorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIFBUUkFDRV9CVFNfT19UUkFDRQkweDEgLyogYnJhbmNoIHRyYWNlICovCiAjZGVmaW5lIFBUUkFDRV9CVFNfT19TQ0hFRAkweDIgLyogc2NoZWR1bGluZyBldmVudHMgdy8gamlmZmllcyAqLwogI2RlZmluZSBQVFJBQ0VfQlRTX09fU0lHTkFMICAgICAweDQgLyogc2VuZCBTSUc8c2lnbmFsPiBvbiBidWZmZXIgb3ZlcmZsb3cKIAkJCQkgICAgICAgaW5zdGVhZCBvZiB3cmFwcGluZyBhcm91bmQgKi8KLSNkZWZpbmUgUFRSQUNFX0JUU19PX0NVVF9TSVpFCTB4OCAvKiBjdXQgcmVxdWVzdGVkIHNpemUgdG8gbWF4IGF2YWlsYWJsZQotCQkJCSAgICAgICBpbnN0ZWFkIG9mIGZhaWxpbmcgKi8KKyNkZWZpbmUgUFRSQUNFX0JUU19PX0FMTE9DCTB4OCAvKiAocmUpYWxsb2NhdGUgYnVmZmVyICovCiAKICNkZWZpbmUgUFRSQUNFX0JUU19DT05GSUcJNDAKIC8qIENvbmZpZ3VyZSBicmFuY2ggdHJhY2UgcmVjb3JkaW5nLgogICAgQUREUiBwb2ludHMgdG8gYSBzdHJ1Y3QgcHRyYWNlX2J0c19jb25maWcuCiAgICBEQVRBIGdpdmVzIHRoZSBzaXplIG9mIHRoYXQgYnVmZmVyLgotICAgQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCwgaWZmIHRoZSBzaXplIGNoYW5nZXMuCisgICBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkLCBpZiByZXF1ZXN0ZWQgaW4gdGhlIGZsYWdzLgorICAgQW4gb3ZlcmZsb3cgc2lnbmFsIG1heSBvbmx5IGJlIHJlcXVlc3RlZCBmb3IgbmV3IGJ1ZmZlcnMuCiAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KICovCiAjZGVmaW5lIFBUUkFDRV9CVFNfU1RBVFVTCTQxCkBAIC0xMTksNyArMTIwLDcgQEAKICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogKi8KICNkZWZpbmUgUFRSQUNFX0JUU19TSVpFCQk0MgotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIEJUUyByZWNvcmRzLgorLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIEJUUyByZWNvcmRzIGZvciBkcmFpbmluZy4KICAgIERBVEEgYW5kIEFERFIgYXJlIGlnbm9yZWQuCiAqLwogI2RlZmluZSBQVFJBQ0VfQlRTX0dFVAkJNDMKQEAgLTEzOSw1ICsxNDAsNiBAQAogICAgQlRTIHJlY29yZHMgYXJlIHJlYWQgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0LgogICAgUmV0dXJucyBudW1iZXIgb2YgQlRTIHJlY29yZHMgZHJhaW5lZC4KICovCisjZW5kaWYgLyogQ09ORklHX1g4Nl9QVFJBQ0VfQlRTICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1BUUkFDRV9BQklfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3B0cmFjZS5oIGIvaW5jbHVkZS9hc20teDg2L3B0cmFjZS5oCmluZGV4IDhhNzFkYjguLmEyMDI1NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcHRyYWNlLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9ICi0jZGVmaW5lIF9BU01fWDg2X1BUUkFDRV9ICisjaWZuZGVmIEFTTV9YODZfX1BUUkFDRV9ICisjZGVmaW5lIEFTTV9YODZfX1BUUkFDRV9ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgkvKiBGb3IgX191c2VyICovCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS1hYmkuaD4KQEAgLTEyNywyNiArMTI3LDU5IEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qICFfX2kzODZfXyAqLwogCisKKyNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKKy8qIGEgYnJhbmNoIHRyYWNlIHJlY29yZCBlbnRyeQorICoKKyAqIEluIG9yZGVyIHRvIHVuaWZ5IHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB2YXJpb3VzIHByb2Nlc3NvciB2ZXJzaW9ucywKKyAqIHdlIHVzZSB0aGUgYmVsb3cgZGF0YSBzdHJ1Y3R1cmUgZm9yIGFsbCBwcm9jZXNzb3JzLgorICovCitlbnVtIGJ0c19xdWFsaWZpZXIgeworCUJUU19JTlZBTElEID0gMCwKKwlCVFNfQlJBTkNILAorCUJUU19UQVNLX0FSUklWRVMsCisJQlRTX1RBU0tfREVQQVJUUworfTsKKworc3RydWN0IGJ0c19zdHJ1Y3QgeworCV9fdTY0IHF1YWxpZmllcjsKKwl1bmlvbiB7CisJCS8qIEJUU19CUkFOQ0ggKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IGZyb21faXA7CisJCQlfX3U2NCB0b19pcDsKKwkJfSBsYnI7CisJCS8qIEJUU19UQVNLX0FSUklWRVMgb3IKKwkJICAgQlRTX1RBU0tfREVQQVJUUyAqLworCQlfX3U2NCBqaWZmaWVzOworCX0gdmFyaWFudDsKK307CisjZW5kaWYgLyogQ09ORklHX1g4Nl9QVFJBQ0VfQlRTICovCisKICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIHRoZSBEUyBCVFMgc3RydWN0IGlzIHVzZWQgZm9yIHB0cmFjZSBhcyB3ZWxsICovCi0jaW5jbHVkZSA8YXNtL2RzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCitzdHJ1Y3QgY3B1aW5mb194ODY7CiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKKyNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKK2V4dGVybiB2b2lkIF9fY3B1aW5pdCBwdHJhY2VfYnRzX2luaXRfaW50ZWwoc3RydWN0IGNwdWluZm9feDg2ICopOwogZXh0ZXJuIHZvaWQgcHRyYWNlX2J0c190YWtlX3RpbWVzdGFtcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZW51bSBidHNfcXVhbGlmaWVyKTsKKyNlbHNlCisjZGVmaW5lIHB0cmFjZV9idHNfaW5pdF9pbnRlbChjb25maWcpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcKIGNvbnZlcnRfaXBfdG9fbGluZWFyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQotI2lmZGVmIENPTkZJR19YODZfMzIKIGV4dGVybiB2b2lkIHNlbmRfc2lndHJhcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgaW50IGVycm9yX2NvZGUpOwotI2Vsc2UKKwkJCSBpbnQgZXJyb3JfY29kZSwgaW50IHNpX2NvZGUpOwogdm9pZCBzaWduYWxfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgX191c2VyICpmcmFtZSwgY2hhciAqd2hlcmUpOwotI2VuZGlmCisKK2V4dGVybiBsb25nIHN5c2NhbGxfdHJhY2VfZW50ZXIoc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCBzeXNjYWxsX3RyYWNlX2xlYXZlKHN0cnVjdCBwdF9yZWdzICopOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVnc19yZXR1cm5fdmFsdWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0yMTMsNiArMjQ2LDExIEBACiAJcmV0dXJuIHJlZ3MtPmJwOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXNlcl9zdGFja19wb2ludGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiByZWdzLT5zcDsKK30KKwogLyoKICAqIFRoZXNlIGFyZSBkZWZpbmVkIGFzIHBlciBsaW51eC9wdHJhY2UuaCwgd2hpY2ggc2VlLgogICovCkBAIC0yMzksNCArMjc3LDQgQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wdmNsb2NrLWFiaS5oIGIvaW5jbHVkZS9hc20teDg2L3B2Y2xvY2stYWJpLmgKaW5kZXggNjg1N2Y4NC4uZWRiM2I0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3B2Y2xvY2stYWJpLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3B2Y2xvY2stYWJpLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1BWQ0xPQ0tfQUJJX0hfCi0jZGVmaW5lIF9BU01fWDg2X1BWQ0xPQ0tfQUJJX0hfCisjaWZuZGVmIEFTTV9YODZfX1BWQ0xPQ0tfQUJJX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUFZDTE9DS19BQklfSAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoKQEAgLTM5LDQgKzM5LDQgQEAKIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0jZW5kaWYgLyogX0FTTV9YODZfUFZDTE9DS19BQklfSF8gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19QVkNMT0NLX0FCSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcHZjbG9jay5oIGIvaW5jbHVkZS9hc20teDg2L3B2Y2xvY2suaAppbmRleCA4NWIxYmJhLi5hZDI5ZTI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcHZjbG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wdmNsb2NrLmgKQEAgLTEsMTMgKzEsMTQgQEAKLSNpZm5kZWYgX0FTTV9YODZfUFZDTE9DS19IXwotI2RlZmluZSBfQVNNX1g4Nl9QVkNMT0NLX0hfCisjaWZuZGVmIEFTTV9YODZfX1BWQ0xPQ0tfSAorI2RlZmluZSBBU01fWDg2X19QVkNMT0NLX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8YXNtL3B2Y2xvY2stYWJpLmg+CiAKIC8qIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgeGVuIGFuZCBrdm0gcHYgY2xvY2sgc291cmNlcyAqLwogY3ljbGVfdCBwdmNsb2NrX2Nsb2Nrc291cmNlX3JlYWQoc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnNyYyk7Cit1bnNpZ25lZCBsb25nIHB2Y2xvY2tfdHNjX2toeihzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqc3JjKTsKIHZvaWQgcHZjbG9ja19yZWFkX3dhbGxjbG9jayhzdHJ1Y3QgcHZjbG9ja193YWxsX2Nsb2NrICp3YWxsLAogCQkJICAgIHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICp2Y3B1LAogCQkJICAgIHN0cnVjdCB0aW1lc3BlYyAqdHMpOwogCi0jZW5kaWYgLyogX0FTTV9YODZfUFZDTE9DS19IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX1BWQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3JlYm9vdC5oIGIvaW5jbHVkZS9hc20teDg2L3JlYm9vdC5oCmluZGV4IDIwNmYzNTUuLjFjMmYwY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9yZWJvb3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcmVib290LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fUkVCT09UX0gKLSNkZWZpbmUgX0FTTV9SRUJPT1RfSAorI2lmbmRlZiBBU01fWDg2X19SRUJPT1RfSAorI2RlZmluZSBBU01fWDg2X19SRUJPT1RfSAogCiBzdHJ1Y3QgcHRfcmVnczsKIApAQCAtMTgsNCArMTgsNCBAQAogdm9pZCBuYXRpdmVfbWFjaGluZV9zaHV0ZG93bih2b2lkKTsKIHZvaWQgbWFjaGluZV9yZWFsX3Jlc3RhcnQoY29uc3QgdW5zaWduZWQgY2hhciAqY29kZSwgaW50IGxlbmd0aCk7CiAKLSNlbmRpZgkvKiBfQVNNX1JFQk9PVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9yZWJvb3RfZml4dXBzLmggYi9pbmNsdWRlL2FzbS14ODYvcmVib290X2ZpeHVwcy5oCmluZGV4IDBjYjdkODcuLjJjMjk4N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9yZWJvb3RfZml4dXBzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3JlYm9vdF9maXh1cHMuaApAQCAtMSw2ICsxLDYgQEAKLSNpZm5kZWYgX0xJTlVYX1JFQk9PVF9GSVhVUFNfSAotI2RlZmluZSBfTElOVVhfUkVCT09UX0ZJWFVQU19ICisjaWZuZGVmIEFTTV9YODZfX1JFQk9PVF9GSVhVUFNfSAorI2RlZmluZSBBU01fWDg2X19SRUJPT1RfRklYVVBTX0gKIAogZXh0ZXJuIHZvaWQgbWFjaF9yZWJvb3RfZml4dXBzKHZvaWQpOwogCi0jZW5kaWYgLyogX0xJTlVYX1JFQk9PVF9GSVhVUFNfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1JFQk9PVF9GSVhVUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3JlcXVpcmVkLWZlYXR1cmVzLmggYi9pbmNsdWRlL2FzbS14ODYvcmVxdWlyZWQtZmVhdHVyZXMuaAppbmRleCBhZGVjODg3Li5hMDFjNGUzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3JlcXVpcmVkLWZlYXR1cmVzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3JlcXVpcmVkLWZlYXR1cmVzLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fUkVRVUlSRURfRkVBVFVSRVNfSAotI2RlZmluZSBfQVNNX1JFUVVJUkVEX0ZFQVRVUkVTX0ggMQorI2lmbmRlZiBBU01fWDg2X19SRVFVSVJFRF9GRUFUVVJFU19ICisjZGVmaW5lIEFTTV9YODZfX1JFUVVJUkVEX0ZFQVRVUkVTX0gKIAogLyogRGVmaW5lIG1pbmltdW0gQ1BVSUQgZmVhdHVyZSBzZXQgZm9yIGtlcm5lbCBUaGVzZSBiaXRzIGFyZSBjaGVja2VkCiAgICByZWFsbHkgZWFybHkgdG8gYWN0dWFsbHkgZGlzcGxheSBhIHZpc2libGUgZXJyb3IgbWVzc2FnZSBiZWZvcmUgdGhlCkBAIC00MSw2ICs0MSwxMiBAQAogIyBkZWZpbmUgTkVFRF8zRE5PVwkwCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9QNl9OT1ApIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKKyMgZGVmaW5lIE5FRURfTk9QTAkoMTw8KFg4Nl9GRUFUVVJFX05PUEwgJiAzMSkpCisjZWxzZQorIyBkZWZpbmUgTkVFRF9OT1BMCTAKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2RlZmluZSBORUVEX1BTRQkwCiAjZGVmaW5lIE5FRURfTVNSCSgxPDwoWDg2X0ZFQVRVUkVfTVNSICYgMzEpKQpAQCAtNjcsMTAgKzczLDEwIEBACiAjZGVmaW5lIFJFUVVJUkVEX01BU0sxCShORUVEX0xNfE5FRURfM0ROT1cpCiAKICNkZWZpbmUgUkVRVUlSRURfTUFTSzIJMAotI2RlZmluZSBSRVFVSVJFRF9NQVNLMwkwCisjZGVmaW5lIFJFUVVJUkVEX01BU0szCShORUVEX05PUEwpCiAjZGVmaW5lIFJFUVVJUkVEX01BU0s0CTAKICNkZWZpbmUgUkVRVUlSRURfTUFTSzUJMAogI2RlZmluZSBSRVFVSVJFRF9NQVNLNgkwCiAjZGVmaW5lIFJFUVVJUkVEX01BU0s3CTAKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fUkVRVUlSRURfRkVBVFVSRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Jlc3VtZS10cmFjZS5oIGIvaW5jbHVkZS9hc20teDg2L3Jlc3VtZS10cmFjZS5oCmluZGV4IDhkOWYwYjQuLmUzOTM3NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9yZXN1bWUtdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcmVzdW1lLXRyYWNlLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1JFU1VNRV9UUkFDRV9ICi0jZGVmaW5lIF9BU01fWDg2X1JFU1VNRV9UUkFDRV9ICisjaWZuZGVmIEFTTV9YODZfX1JFU1VNRV9UUkFDRV9ICisjZGVmaW5lIEFTTV9YODZfX1JFU1VNRV9UUkFDRV9ICiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAKQEAgLTcsNyArNyw3IEBACiBkbyB7CQkJCQkJCQlcCiAJaWYgKHBtX3RyYWNlX2VuYWJsZWQpIHsJCQkJCVwKIAkJY29uc3Qgdm9pZCAqdHJhY2VkYXRhOwkJCQlcCi0JCWFzbSB2b2xhdGlsZShfQVNNX01PVl9VTCAiICQxZiwlMFxuIgkJXAorCQlhc20gdm9sYXRpbGUoX0FTTV9NT1YgIiAkMWYsJTBcbiIJCVwKIAkJCSAgICAgIi5zZWN0aW9uIC50cmFjZWRhdGEsXCJhXCJcbiIJXAogCQkJICAgICAiMTpcdC53b3JkICVjMVxuXHQiCQlcCiAJCQkgICAgIF9BU01fUFRSICIgJWMyXG4iCQkJXApAQCAtMTgsNCArMTgsNCBAQAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fUkVTVU1FX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9yaW8uaCBiL2luY2x1ZGUvYXNtLXg4Ni9yaW8uaAppbmRleCBjOTQ0OGJkLi41ZTEyNTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcmlvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3Jpby5oCkBAIC01LDggKzUsOCBAQAogICogQXV0aG9yOiBMYXVyZW50IFZpdmllciA8TGF1cmVudC5WaXZpZXJAYnVsbC5uZXQ+CiAgKi8KIAotI2lmbmRlZiBfX0FTTV9SSU9fSAotI2RlZmluZSBfX0FTTV9SSU9fSAorI2lmbmRlZiBBU01fWDg2X19SSU9fSAorI2RlZmluZSBBU01fWDg2X19SSU9fSAogCiAjZGVmaW5lIFJJT19UQUJMRV9WRVJTSU9OCTMKIApAQCAtNjAsNCArNjAsNCBAQAogCUFMVF9DQUxHQVJZCT0gNSwJLyogU2Vjb25kIFBsYW5hciBDYWxnYXJ5ICAgICAgKi8KIH07CiAKLSNlbmRpZiAvKiBfX0FTTV9SSU9fSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1JJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcndsb2NrLmggYi9pbmNsdWRlL2FzbS14ODYvcndsb2NrLmgKaW5kZXggNmE4YzBkNi4uNDhhMzEwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3J3bG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9yd2xvY2suaApAQCAtMSw4ICsxLDggQEAKLSNpZm5kZWYgX0FTTV9YODZfUldMT0NLX0gKLSNkZWZpbmUgX0FTTV9YODZfUldMT0NLX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUldMT0NLX0gKKyNkZWZpbmUgQVNNX1g4Nl9fUldMT0NLX0gKIAogI2RlZmluZSBSV19MT0NLX0JJQVMJCSAweDAxMDAwMDAwCiAKIC8qIEFjdHVhbCBjb2RlIGlzIGluIGFzbS9zcGlubG9jay5oIG9yIGluIGFyY2gveDg2L2xpYi9yd2xvY2suUyAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfUldMT0NLX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19SV0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3J3c2VtLmggYi9pbmNsdWRlL2FzbS14ODYvcndzZW0uaAppbmRleCA3NTBmMmEzLi4zZmYzMDE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcndzZW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcndzZW0uaApAQCAtMjksOCArMjksOCBAQAogICogZnJvbnQsIHRoZW4gdGhleSdsbCBhbGwgYmUgd29rZW4gdXAsIGJ1dCBubyBvdGhlciByZWFkZXJzIHdpbGwgYmUuCiAgKi8KIAotI2lmbmRlZiBfSTM4Nl9SV1NFTV9ICi0jZGVmaW5lIF9JMzg2X1JXU0VNX0gKKyNpZm5kZWYgQVNNX1g4Nl9fUldTRU1fSAorI2RlZmluZSBBU01fWDg2X19SV1NFTV9ICiAKICNpZm5kZWYgX0xJTlVYX1JXU0VNX0gKICNlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgYXNtL3J3c2VtLmggZGlyZWN0bHksIHVzZSBsaW51eC9yd3NlbS5oIGluc3RlYWQiCkBAIC0yNjIsNCArMjYyLDQgQEAKIH0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfSTM4Nl9SV1NFTV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fUldTRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NjYXR0ZXJsaXN0LmggYi9pbmNsdWRlL2FzbS14ODYvc2NhdHRlcmxpc3QuaAppbmRleCBjMDQzMjA2Li5lZTQ4Zjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2NhdHRlcmxpc3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2NhdHRlcmxpc3QuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfU0NBVFRFUkxJU1RfSAotI2RlZmluZSBfQVNNX1g4Nl9TQ0FUVEVSTElTVF9ICisjaWZuZGVmIEFTTV9YODZfX1NDQVRURVJMSVNUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU0NBVFRFUkxJU1RfSAogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKQEAgLTMwLDQgKzMwLDQgQEAKICMgZGVmaW5lIHNnX2RtYV9sZW4oc2cpCQkoKHNnKS0+ZG1hX2xlbmd0aCkKICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19TQ0FUVEVSTElTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc2VjY29tcF8zMi5oIGIvaW5jbHVkZS9hc20teDg2L3NlY2NvbXBfMzIuaAppbmRleCAzNmU3MWM1Li5jZjlhYjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2VjY29tcF8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zZWNjb21wXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fU0VDQ09NUF9ICi0jZGVmaW5lIF9BU01fU0VDQ09NUF9ICisjaWZuZGVmIEFTTV9YODZfX1NFQ0NPTVBfMzJfSAorI2RlZmluZSBBU01fWDg2X19TRUNDT01QXzMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAKQEAgLTE0LDQgKzE0LDQgQEAKICNkZWZpbmUgX19OUl9zZWNjb21wX2V4aXQgX19OUl9leGl0CiAjZGVmaW5lIF9fTlJfc2VjY29tcF9zaWdyZXR1cm4gX19OUl9zaWdyZXR1cm4KIAotI2VuZGlmIC8qIF9BU01fU0VDQ09NUF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fU0VDQ09NUF8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc2VjY29tcF82NC5oIGIvaW5jbHVkZS9hc20teDg2L3NlY2NvbXBfNjQuaAppbmRleCA3NmNmZTY5Li4wMzI3NGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2VjY29tcF82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zZWNjb21wXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fU0VDQ09NUF9ICi0jZGVmaW5lIF9BU01fU0VDQ09NUF9ICisjaWZuZGVmIEFTTV9YODZfX1NFQ0NPTVBfNjRfSAorI2RlZmluZSBBU01fWDg2X19TRUNDT01QXzY0X0gKIAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAKQEAgLTIyLDQgKzIyLDQgQEAKICNkZWZpbmUgX19OUl9zZWNjb21wX2V4aXRfMzIgX19OUl9pYTMyX2V4aXQKICNkZWZpbmUgX19OUl9zZWNjb21wX3NpZ3JldHVybl8zMiBfX05SX2lhMzJfc2lncmV0dXJuCiAKLSNlbmRpZiAvKiBfQVNNX1NFQ0NPTVBfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1NFQ0NPTVBfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NlZ21lbnQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zZWdtZW50LmgKaW5kZXggNjQ2NDUyZS4uNWQ2ZTY5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3NlZ21lbnQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2VnbWVudC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TRUdNRU5UX0hfCi0jZGVmaW5lIF9BU01fWDg2X1NFR01FTlRfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fU0VHTUVOVF9ICisjZGVmaW5lIEFTTV9YODZfX1NFR01FTlRfSAogCiAvKiBDb25zdHJ1Y3RvciBmb3IgYSBjb252ZW50aW9uYWwgc2VnbWVudCBHRFQgKG9yIExEVCkgZW50cnkgKi8KIC8qIFRoaXMgaXMgYSBtYWNybyBzbyBpdCBjYW4gYmUgdXNlZCBpbiBpbml0aWFsaXplcnMgKi8KQEAgLTEzMSwxMiArMTMxLDYgQEAKICAqIE1hdGNoaW5nIHJ1bGVzIGZvciBjZXJ0YWluIHR5cGVzIG9mIHNlZ21lbnRzLgogICovCiAKLS8qIE1hdGNoZXMgb25seSBfX0tFUk5FTF9DUywgaWdub3JpbmcgUG5QIC8gVVNFUiAvIEFQTSBzZWdtZW50cyAqLwotI2RlZmluZSBTRUdNRU5UX0lTX0tFUk5FTF9DT0RFKHgpICgoKHgpICYgMHhmYykgPT0gR0RUX0VOVFJZX0tFUk5FTF9DUyAqIDgpCi0KLS8qIE1hdGNoZXMgX19LRVJORUxfQ1MgYW5kIF9fVVNFUl9DUyAodGhleSBtdXN0IGJlIDIgZW50cmllcyBhcGFydCkgKi8KLSNkZWZpbmUgU0VHTUVOVF9JU19GTEFUX0NPREUoeCkgICgoKHgpICYgMHhlYykgPT0gR0RUX0VOVFJZX0tFUk5FTF9DUyAqIDgpCi0KIC8qIE1hdGNoZXMgUE5QX0NTMzIgYW5kIFBOUF9DUzE2ICh0aGV5IG11c3QgYmUgY29uc2VjdXRpdmUpICovCiAjZGVmaW5lIFNFR01FTlRfSVNfUE5QX0NPREUoeCkgICAoKCh4KSAmIDB4ZjQpID09IEdEVF9FTlRSWV9QTlBCSU9TX0JBU0UgKiA4KQogCkBAIC0yMTIsNCArMjA2LDQgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1NFR01FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NlbWJ1Zi5oIGIvaW5jbHVkZS9hc20teDg2L3NlbWJ1Zi5oCmluZGV4IGVlNTBjODAuLjgxZjA2YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zZW1idWYuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2VtYnVmLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NFTUJVRl9ICi0jZGVmaW5lIF9BU01fWDg2X1NFTUJVRl9ICisjaWZuZGVmIEFTTV9YODZfX1NFTUJVRl9ICisjZGVmaW5lIEFTTV9YODZfX1NFTUJVRl9ICiAKIC8qCiAgKiBUaGUgc2VtaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHg4NiBhcmNoaXRlY3R1cmUuCkBAIC0yMSw0ICsyMSw0IEBACiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7CiB9OwogCi0jZW5kaWYgLyogX0FTTV9YODZfU0VNQlVGX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NlcmlhbC5oIGIvaW5jbHVkZS9hc20teDg2L3NlcmlhbC5oCmluZGV4IDYyOGM4MDEuLjMwMzY2MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2VyaWFsLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NFUklBTF9ICi0jZGVmaW5lIF9BU01fWDg2X1NFUklBTF9ICisjaWZuZGVmIEFTTV9YODZfX1NFUklBTF9ICisjZGVmaW5lIEFTTV9YODZfX1NFUklBTF9ICiAKIC8qCiAgKiBUaGlzIGFzc3VtZXMgeW91IGhhdmUgYSAxLjg0MzIgTUh6IGNsb2NrIGZvciB5b3VyIFVBUlQuCkBAIC0yNiw0ICsyNiw0IEBACiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9TRVJJQUxfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zZXR1cC5oCmluZGV4IGEwN2M2ZjEuLjExYjZjYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zZXR1cC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TRVRVUF9ICi0jZGVmaW5lIF9BU01fWDg2X1NFVFVQX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU0VUVVBfSAorI2RlZmluZSBBU01fWDg2X19TRVRVUF9ICiAKICNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgMjA0OAogCkBAIC0zOCw5ICszOCwxMSBAQAogCXZvaWQgKCptcGNfb2VtX3BjaV9idXMpKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbSk7CiAJdm9pZCAoKnNtcF9yZWFkX21wY19vZW0pKHN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKm9lbXRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgb2Vtc2l6ZSk7CisJaW50ICgqc2V0dXBfaW9hcGljX2lkcykodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IHg4Nl9xdWlya3MgKng4Nl9xdWlya3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzYXZlZF92aWRlb19tb2RlOwogCiAjaWZuZGVmIENPTkZJR19QQVJBVklSVAogI2RlZmluZSBwYXJhdmlydF9wb3N0X2FsbG9jYXRvcl9pbml0KCkJZG8ge30gd2hpbGUgKDApCkBAIC0xMDAsNCArMTAyLDQgQEAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9TRVRVUF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NobWJ1Zi5oIGIvaW5jbHVkZS9hc20teDg2L3NobWJ1Zi5oCmluZGV4IGI1MTQxM2IuLmY1MWFlYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zaG1idWYuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2htYnVmLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NITUJVRl9ICi0jZGVmaW5lIF9BU01fWDg2X1NITUJVRl9ICisjaWZuZGVmIEFTTV9YODZfX1NITUJVRl9ICisjZGVmaW5lIEFTTV9YODZfX1NITUJVRl9ICiAKIC8qCiAgKiBUaGUgc2htaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIHg4NiBhcmNoaXRlY3R1cmUuCkBAIC00OCw0ICs0OCw0IEBACiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7CiB9OwogCi0jZW5kaWYgLyogX0FTTV9YODZfU0hNQlVGX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19TSE1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NobXBhcmFtLmggYi9pbmNsdWRlL2FzbS14ODYvc2htcGFyYW0uaAppbmRleCAwODgwY2YwLi5hODNhMWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2htcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2htcGFyYW0uaApAQCAtMSw2ICsxLDYgQEAKLSNpZm5kZWYgX0FTTV9YODZfU0hNUEFSQU1fSAotI2RlZmluZSBfQVNNX1g4Nl9TSE1QQVJBTV9ICisjaWZuZGVmIEFTTV9YODZfX1NITVBBUkFNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU0hNUEFSQU1fSAogCiAjZGVmaW5lIFNITUxCQSBQQUdFX1NJWkUJIC8qIGF0dGFjaCBhZGRyIGEgbXVsdGlwbGUgb2YgdGhpcyAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfU0hNUEFSQU1fSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1NITVBBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS14ODYvc2lnY29udGV4dC5oCmluZGV4IDJmOWM4ODQuLmVlODEzZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zaWdjb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NpZ2NvbnRleHQuaApAQCAtMSw5ICsxLDQzIEBACi0jaWZuZGVmIF9BU01fWDg2X1NJR0NPTlRFWFRfSAotI2RlZmluZSBfQVNNX1g4Nl9TSUdDT05URVhUX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU0lHQ09OVEVYVF9ICisjZGVmaW5lIEFTTV9YODZfX1NJR0NPTlRFWFRfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAorI2RlZmluZSBGUF9YU1RBVEVfTUFHSUMxCTB4NDY1MDU4NTNVCisjZGVmaW5lIEZQX1hTVEFURV9NQUdJQzIJMHg0NjUwNTg0NVUKKyNkZWZpbmUgRlBfWFNUQVRFX01BR0lDMl9TSVpFCXNpemVvZihGUF9YU1RBVEVfTUFHSUMyKQorCisvKgorICogYnl0ZXMgNDY0Li41MTEgaW4gdGhlIGN1cnJlbnQgNTEyYnl0ZSBsYXlvdXQgb2YgZnhzYXZlL2Z4cnN0b3IgZnJhbWUKKyAqIGFyZSByZXNlcnZlZCBmb3IgU1cgdXNhZ2UuIE9uIGNwdSdzIHN1cHBvcnRpbmcgeHNhdmUveHJzdG9yLCB0aGVzZSBieXRlcworICogYXJlIHVzZWQgdG8gZXh0ZW5kZWQgdGhlIGZwc3RhdGUgcG9pbnRlciBpbiB0aGUgc2lnY29udGV4dCwgd2hpY2ggbm93CisgKiBpbmNsdWRlcyB0aGUgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24gYWxvbmcgd2l0aCBmcHN0YXRlIGluZm9ybWF0aW9uLgorICoKKyAqIFByZXNlbmNlIG9mIEZQX1hTVEFURV9NQUdJQzEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIFNXIHJlc2VydmVkCisgKiBhcmVhIGFuZCBGUF9YU1RBVEVfTUFHSUMyIGF0IHRoZSBlbmQgb2YgbWVtb3J5IGxheW91dAorICogKGV4dGVuZGVkX3NpemUgLSBGUF9YU1RBVEVfTUFHSUMyX1NJWkUpIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlCisgKiBleHRlbmRlZCBzdGF0ZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWVtb3J5IGxheW91dCBwb2ludGVkIGJ5IHRoZSBmcHN0YXRlCisgKiBwb2ludGVyIGluIHNpZ2NvbnRleHQuCisgKi8KK3N0cnVjdCBfZnB4X3N3X2J5dGVzIHsKKwlfX3UzMiBtYWdpYzE7CQkvKiBGUF9YU1RBVEVfTUFHSUMxICovCisJX191MzIgZXh0ZW5kZWRfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiB0aGUgbGF5b3V0IHJlZmVycmVkIGJ5CisJCQkJICogZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LgorCQkJCSAqLworCV9fdTY0IHhzdGF0ZV9idjsKKwkJCQkvKiBmZWF0dXJlIGJpdCBtYXNrIChpbmNsdWRpbmcgZnAvc3NlL2V4dGVuZGVkCisJCQkJICogc3RhdGUpIHRoYXQgaXMgcHJlc2VudCBpbiB0aGUgbWVtb3J5CisJCQkJICogbGF5b3V0LgorCQkJCSAqLworCV9fdTMyIHhzdGF0ZV9zaXplOwkvKiBhY3R1YWwgeHNhdmUgc3RhdGUgc2l6ZSwgYmFzZWQgb24gdGhlCisJCQkJICogZmVhdHVyZXMgc2F2ZWQgaW4gdGhlIGxheW91dC4KKwkJCQkgKiAnZXh0ZW5kZWRfc2l6ZScgd2lsbCBiZSBncmVhdGVyIHRoYW4KKwkJCQkgKiAneHN0YXRlX3NpemUnLgorCQkJCSAqLworCV9fdTMyIHBhZGRpbmdbN107CS8qICBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKICNpZmRlZiBfX2kzODZfXwogLyoKICAqIEFzIGRvY3VtZW50ZWQgaW4gdGhlIGlCQ1MyIHN0YW5kYXJkLi4KQEAgLTUzLDcgKzg3LDEzIEBACiAJdW5zaWduZWQgbG9uZwlyZXNlcnZlZDsKIAlzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsJLyogRlhTUiBGUFUgcmVnIGRhdGEgaXMgaWdub3JlZCAqLwogCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07Ci0JdW5zaWduZWQgbG9uZwlwYWRkaW5nWzU2XTsKKwl1bnNpZ25lZCBsb25nCXBhZGRpbmcxWzQ0XTsKKworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZwlwYWRkaW5nMlsxMl07CisJCXN0cnVjdCBfZnB4X3N3X2J5dGVzIHN3X3Jlc2VydmVkOyAvKiByZXByZXNlbnRzIHRoZSBleHRlbmRlZAorCQkJCQkJICAgKiBzdGF0ZSBpbmZvICovCisJfTsKIH07CiAKICNkZWZpbmUgWDg2X0ZYU1JfTUFHSUMJCTB4MDAwMApAQCAtNzksNyArMTE5LDE1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHNwX2F0X3NpZ25hbDsKIAl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7Ci0Jc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnBzdGF0ZTsKKworCS8qCisJICogZnBzdGF0ZSBpcyByZWFsbHkgKHN0cnVjdCBfZnBzdGF0ZSAqKSBvciAoc3RydWN0IF94c3RhdGUgKikKKwkgKiBkZXBlbmRpbmcgb24gdGhlIEZQX1hTVEFURV9NQUdJQzEgZW5jb2RlZCBpbiB0aGUgU1cgcmVzZXJ2ZWQKKwkgKiBieXRlcyBvZiAoc3RydWN0IF9mcHN0YXRlKSBhbmQgRlBfWFNUQVRFX01BR0lDMiBwcmVzZW50IGF0IHRoZSBlbmQKKwkgKiBvZiBleHRlbmRlZCBtZW1vcnkgbGF5b3V0LiBTZWUgY29tbWVudHMgYXQgdGhlIGRlZmludGlvbiBvZgorCSAqIChzdHJ1Y3QgX2ZweF9zd19ieXRlcykKKwkgKi8KKwl2b2lkIF9fdXNlciAqZnBzdGF0ZTsJCS8qIHplcm8gd2hlbiBubyBGUFUvZXh0ZW5kZWQgY29udGV4dCAqLwogCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKIAl1bnNpZ25lZCBsb25nIGNyMjsKIH07CkBAIC0xMzAsNyArMTc4LDEyIEBACiAJX191MzIJbXhjc3JfbWFzazsKIAlfX3UzMglzdF9zcGFjZVszMl07CS8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnICovCiAJX191MzIJeG1tX3NwYWNlWzY0XTsJLyogMTYqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyAgKi8KLQlfX3UzMglyZXNlcnZlZDJbMjRdOworCV9fdTMyCXJlc2VydmVkMlsxMl07CisJdW5pb24geworCQlfX3UzMglyZXNlcnZlZDNbMTJdOworCQlzdHJ1Y3QgX2ZweF9zd19ieXRlcyBzd19yZXNlcnZlZDsgLyogcmVwcmVzZW50cyB0aGUgZXh0ZW5kZWQKKwkJCQkJCSAgICogc3RhdGUgaW5mb3JtYXRpb24gKi8KKwl9OwogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTE2MSw3ICsyMTQsMTUgQEAKIAl1bnNpZ25lZCBsb25nIHRyYXBubzsKIAl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CiAJdW5zaWduZWQgbG9uZyBjcjI7Ci0Jc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnBzdGF0ZTsJLyogemVybyB3aGVuIG5vIEZQVSBjb250ZXh0ICovCisKKwkvKgorCSAqIGZwc3RhdGUgaXMgcmVhbGx5IChzdHJ1Y3QgX2Zwc3RhdGUgKikgb3IgKHN0cnVjdCBfeHN0YXRlICopCisJICogZGVwZW5kaW5nIG9uIHRoZSBGUF9YU1RBVEVfTUFHSUMxIGVuY29kZWQgaW4gdGhlIFNXIHJlc2VydmVkCisJICogYnl0ZXMgb2YgKHN0cnVjdCBfZnBzdGF0ZSkgYW5kIEZQX1hTVEFURV9NQUdJQzIgcHJlc2VudCBhdCB0aGUgZW5kCisJICogb2YgZXh0ZW5kZWQgbWVtb3J5IGxheW91dC4gU2VlIGNvbW1lbnRzIGF0IHRoZSBkZWZpbnRpb24gb2YKKwkgKiAoc3RydWN0IF9mcHhfc3dfYnl0ZXMpCisJICovCisJdm9pZCBfX3VzZXIgKmZwc3RhdGU7CQkvKiB6ZXJvIHdoZW4gbm8gRlBVL2V4dGVuZGVkIGNvbnRleHQgKi8KIAl1bnNpZ25lZCBsb25nIHJlc2VydmVkMVs4XTsKIH07CiAjZWxzZSAvKiBfX0tFUk5FTF9fICovCkBAIC0yMDIsNCArMjYzLDIyIEBACiAKICNlbmRpZiAvKiAhX19pMzg2X18gKi8KIAotI2VuZGlmCitzdHJ1Y3QgX3hzYXZlX2hkciB7CisJX191NjQgeHN0YXRlX2J2OworCV9fdTY0IHJlc2VydmVkMVsyXTsKKwlfX3U2NCByZXNlcnZlZDJbNV07Cit9OworCisvKgorICogRXh0ZW5kZWQgc3RhdGUgcG9pbnRlZCBieSB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSBzaWdjb250ZXh0LgorICogSW4gYWRkaXRpb24gdG8gdGhlIGZwc3RhdGUsIGluZm9ybWF0aW9uIGVuY29kZWQgaW4gdGhlIHhzdGF0ZV9oZHIKKyAqIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXIgZXh0ZW5kZWQgc3RhdGUgaW5mb3JtYXRpb24KKyAqIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yIGFuZCBPUy4KKyAqLworc3RydWN0IF94c3RhdGUgeworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworCXN0cnVjdCBfeHNhdmVfaGRyIHhzdGF0ZV9oZHI7CisJLyogbmV3IHByb2Nlc3NvciBzdGF0ZSBleHRlbnNpb25zIGdvIGhlcmUgKi8KK307CisKKyNlbmRpZiAvKiBBU01fWDg2X19TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zaWdjb250ZXh0MzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zaWdjb250ZXh0MzIuaAppbmRleCA1N2E5Njg2Li44YzM0NzAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2lnY29udGV4dDMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NpZ2NvbnRleHQzMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfU0lHQ09OVEVYVDMyX0gKLSNkZWZpbmUgX1NJR0NPTlRFWFQzMl9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fU0lHQ09OVEVYVDMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU0lHQ09OVEVYVDMyX0gKIAogLyogc2lnbmFsIGNvbnRleHQgZm9yIDMyYml0IHByb2dyYW1zLiAqLwogCkBAIC00MCw3ICs0MCwxMSBAQAogCV9fdTMyCXJlc2VydmVkOwogCXN0cnVjdCBfZnB4cmVnCV9meHNyX3N0WzhdOwogCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CS8qIEl0J3MgYWN0dWFsbHkgMTYgKi8KLQlfX3UzMglwYWRkaW5nWzU2XTsKKwlfX3UzMglwYWRkaW5nWzQ0XTsKKwl1bmlvbiB7CisJCV9fdTMyIHBhZGRpbmcyWzEyXTsKKwkJc3RydWN0IF9mcHhfc3dfYnl0ZXMgc3dfcmVzZXJ2ZWQ7CisJfTsKIH07CiAKIHN0cnVjdCBzaWdjb250ZXh0X2lhMzIgewpAQCAtNjgsNCArNzIsNCBAQAogICAgICAgIHVuc2lnbmVkIGludCBjcjI7CiB9OwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19TSUdDT05URVhUMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NpZ2luZm8uaCBiL2luY2x1ZGUvYXNtLXg4Ni9zaWdpbmZvLmgKaW5kZXggYTQ3N2JlYS4uODA4YmRmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3NpZ2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc2lnaW5mby5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TSUdJTkZPX0gKLSNkZWZpbmUgX0FTTV9YODZfU0lHSU5GT19ICisjaWZuZGVmIEFTTV9YODZfX1NJR0lORk9fSAorI2RlZmluZSBBU01fWDg2X19TSUdJTkZPX0gKIAogI2lmZGVmIF9feDg2XzY0X18KICMgZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCkBAIC03LDQgKzcsNCBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19TSUdJTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zaWduYWwuaAppbmRleCA2ZGFjNDkzLi42NWFjYzgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NpZ25hbC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TSUdOQUxfSAotI2RlZmluZSBfQVNNX1g4Nl9TSUdOQUxfSAorI2lmbmRlZiBBU01fWDg2X19TSUdOQUxfSAorI2RlZmluZSBBU01fWDg2X19TSUdOQUxfSAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xNDAsNiArMTQwLDkgQEAKIHN0cnVjdCBrX3NpZ2FjdGlvbiB7CiAJc3RydWN0IHNpZ2FjdGlvbiBzYTsKIH07CisKK2V4dGVybiB2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKiwgdm9pZCAqLCBfX3UzMik7CisKICMgZWxzZSAvKiBfX0tFUk5FTF9fICovCiAvKiBIZXJlIHdlIG11c3QgY2F0ZXIgdG8gbGliY3MgdGhhdCBwb2tlIGFib3V0IGluIGtlcm5lbCBoZWFkZXJzLiAgKi8KIApAQCAtMjU2LDQgKzI1OSw0IEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NtcC5oIGIvaW5jbHVkZS9hc20teDg2L3NtcC5oCmluZGV4IDNjODc3ZjcuLmE2YWZjMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc21wLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NNUF9IXwotI2RlZmluZSBfQVNNX1g4Nl9TTVBfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fU01QX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU01QX0gKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTM0LDYgKzM0LDkgQEAKIERFQ0xBUkVfUEVSX0NQVShjcHVtYXNrX3QsIGNwdV9zaWJsaW5nX21hcCk7CiBERUNMQVJFX1BFUl9DUFUoY3B1bWFza190LCBjcHVfY29yZV9tYXApOwogREVDTEFSRV9QRVJfQ1BVKHUxNiwgY3B1X2xsY19pZCk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorREVDTEFSRV9QRVJfQ1BVKGludCwgY3B1X251bWJlcik7CisjZW5kaWYKIAogREVDTEFSRV9FQVJMWV9QRVJfQ1BVKHUxNiwgeDg2X2NwdV90b19hcGljaWQpOwogREVDTEFSRV9FQVJMWV9QRVJfQ1BVKHUxNiwgeDg2X2Jpb3NfY3B1X2FwaWNpZCk7CkBAIC00NywxMiArNTAsMTYgQEAKIHN0cnVjdCBzbXBfb3BzIHsKIAl2b2lkICgqc21wX3ByZXBhcmVfYm9vdF9jcHUpKHZvaWQpOwogCXZvaWQgKCpzbXBfcHJlcGFyZV9jcHVzKSh1bnNpZ25lZCBtYXhfY3B1cyk7Ci0JaW50ICgqY3B1X3VwKSh1bnNpZ25lZCBjcHUpOwogCXZvaWQgKCpzbXBfY3B1c19kb25lKSh1bnNpZ25lZCBtYXhfY3B1cyk7CiAKIAl2b2lkICgqc21wX3NlbmRfc3RvcCkodm9pZCk7CiAJdm9pZCAoKnNtcF9zZW5kX3Jlc2NoZWR1bGUpKGludCBjcHUpOwogCisJaW50ICgqY3B1X3VwKSh1bnNpZ25lZCBjcHUpOworCWludCAoKmNwdV9kaXNhYmxlKSh2b2lkKTsKKwl2b2lkICgqY3B1X2RpZSkodW5zaWduZWQgaW50IGNwdSk7CisJdm9pZCAoKnBsYXlfZGVhZCkodm9pZCk7CisKIAl2b2lkICgqc2VuZF9jYWxsX2Z1bmNfaXBpKShjcHVtYXNrX3QgbWFzayk7CiAJdm9pZCAoKnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkpKGludCBjcHUpOwogfTsKQEAgLTkxLDYgKzk4LDIxIEBACiAJcmV0dXJuIHNtcF9vcHMuY3B1X3VwKGNwdSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK3sKKwlyZXR1cm4gc21wX29wcy5jcHVfZGlzYWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJc21wX29wcy5jcHVfZGllKGNwdSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF5X2RlYWQodm9pZCkKK3sKKwlzbXBfb3BzLnBsYXlfZGVhZCgpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KQogewogCXNtcF9vcHMuc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOwpAQCAtMTA2LDE1ICsxMjgsMjAgQEAKIAlzbXBfb3BzLnNlbmRfY2FsbF9mdW5jX2lwaShtYXNrKTsKIH0KIAordm9pZCBjcHVfZGlzYWJsZV9jb21tb24odm9pZCk7CiB2b2lkIG5hdGl2ZV9zbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKTsKIHZvaWQgbmF0aXZlX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKTsKIHZvaWQgbmF0aXZlX3NtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKTsKIGludCBuYXRpdmVfY3B1X3VwKHVuc2lnbmVkIGludCBjcHVudW0pOworaW50IG5hdGl2ZV9jcHVfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgbmF0aXZlX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIG5hdGl2ZV9wbGF5X2RlYWQodm9pZCk7Cit2b2lkIHBsYXlfZGVhZF9jb21tb24odm9pZCk7CisKIHZvaWQgbmF0aXZlX3NlbmRfY2FsbF9mdW5jX2lwaShjcHVtYXNrX3QgbWFzayk7CiB2b2lkIG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19zaW5nbGVfaXBpKGludCBjcHUpOwogCi1leHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBwcmVmaWxsX3Bvc3NpYmxlX21hcCh2b2lkKTsKIAogdm9pZCBzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKTsKICNkZWZpbmUgY3B1X3BoeXNpY2FsX2lkKGNwdSkJcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KQpAQCAtMTI0LDE1ICsxNTEsMTEgQEAKIHsKIAlyZXR1cm4gY3B1c193ZWlnaHQoY3B1X2NhbGxvdXRfbWFwKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQotZXh0ZXJuIHZvaWQgcHJlZmlsbF9wb3NzaWJsZV9tYXAodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHByZWZpbGxfcG9zc2libGVfbWFwKHZvaWQpCiB7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIGV4dGVybiB1bnNpZ25lZCBkaXNhYmxlZF9jcHVzIF9fY3B1aW5pdGRhdGE7CiAKQEAgLTE0Miw3ICsxNjUsNiBAQAogICogZnJvbSB0aGUgaW5pdGlhbCBzdGFydHVwLiBXZSBtYXAgQVBJQ19CQVNFIHZlcnkgZWFybHkgaW4gcGFnZV9zZXR1cCgpLAogICogc28gdGhpcyBpcyBjb3JyZWN0IGluIHRoZSB4ODYgY2FzZS4KICAqLwotREVDTEFSRV9QRVJfQ1BVKGludCwgY3B1X251bWJlcik7CiAjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKHg4Nl9yZWFkX3BlcmNwdShjcHVfbnVtYmVyKSkKIGV4dGVybiBpbnQgc2FmZV9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOwogCkBAIC0xNjUsMzAgKzE4NywzMyBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAKKyNpZm5kZWYgQ09ORklHX1g4Nl82NAogc3RhdGljIGlubGluZSBpbnQgbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCiB7CiAJLyogd2UgZG9uJ3Qgd2FudCB0byBtYXJrIHRoaXMgYWNjZXNzIHZvbGF0aWxlIC0gYmFkIGNvZGUgZ2VuZXJhdGlvbiAqLwogCXJldHVybiBHRVRfQVBJQ19MT0dJQ0FMX0lEKCoodTMyICopKEFQSUNfQkFTRSArIEFQSUNfTERSKSk7CiB9CiAKLSNpZm5kZWYgQ09ORklHX1g4Nl82NAorI2luY2x1ZGUgPG1hY2hfYXBpY2RlZi5oPgogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9hcGljX2lkKHZvaWQpCiB7Ci0JcmV0dXJuICoodTMyICopKEFQSUNfQkFTRSArIEFQSUNfSUQpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSAqKHUzMiAqKShBUElDX0JBU0UgKyBBUElDX0lEKTsKKworCXJldHVybiBHRVRfQVBJQ19JRChyZWcpOwogfQotI2Vsc2UKLWV4dGVybiB1bnNpZ25lZCBpbnQgcmVhZF9hcGljX2lkKHZvaWQpOwogI2VuZGlmCiAKIAotIyBpZmRlZiBBUElDX0RFRklOSVRJT04KKyMgaWYgZGVmaW5lZChBUElDX0RFRklOSVRJT04pIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIGV4dGVybiBpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOwogIyBlbHNlCi0jICBpbmNsdWRlIDxtYWNoX2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxtYWNoX2FwaWNkZWYuaD4KIHN0YXRpYyBpbmxpbmUgaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQogewogCS8qIHdlIGRvbid0IHdhbnQgdG8gbWFyayB0aGlzIGFjY2VzcyB2b2xhdGlsZSAtIGJhZCBjb2RlIGdlbmVyYXRpb24gKi8KLQlyZXR1cm4gR0VUX0FQSUNfSUQocmVhZF9hcGljX2lkKCkpOworCXJldHVybiByZWFkX2FwaWNfaWQoKTsKIH0KICMgZW5kaWYgLyogQVBJQ19ERUZJTklUSU9OICovCiAKQEAgLTIwMCw5ICsyMjUsNSBAQAogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLWV4dGVybiB2b2lkIGNwdV91bmluaXQodm9pZCk7Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU01QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zb2NrZXQuaAppbmRleCA4MGFmOWM0Li5kYjczMjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NvY2tldC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1NPQ0tFVF9ICi0jZGVmaW5lIF9BU01fU09DS0VUX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU09DS0VUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU09DS0VUX0gKIAogI2luY2x1ZGUgPGFzbS9zb2NraW9zLmg+CiAKQEAgLTU0LDQgKzU0LDQgQEAKIAogI2RlZmluZSBTT19NQVJLCQkJMzYKIAotI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zb2NraW9zLmgKaW5kZXggNDljYzcyYi4uYTAwNjcwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc29ja2lvcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TT0NLSU9TX0gKLSNkZWZpbmUgX0FTTV9YODZfU09DS0lPU19ICisjaWZuZGVmIEFTTV9YODZfX1NPQ0tJT1NfSAorI2RlZmluZSBBU01fWDg2X19TT0NLSU9TX0gKIAogLyogU29ja2V0LWxldmVsIEkvTyBjb250cm9sIGNhbGxzLiAqLwogI2RlZmluZSBGSU9TRVRPV04JMHg4OTAxCkBAIC0xMCw0ICsxMCw0IEBACiAjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCiAjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9TT0NLSU9TX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zcGFyc2VtZW0uaCBiL2luY2x1ZGUvYXNtLXg4Ni9zcGFyc2VtZW0uaAppbmRleCA5YmQ0OGIwLi4zOGY4ZTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc3BhcnNlbWVtLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NwYXJzZW1lbS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TUEFSU0VNRU1fSAotI2RlZmluZSBfQVNNX1g4Nl9TUEFSU0VNRU1fSAorI2lmbmRlZiBBU01fWDg2X19TUEFSU0VNRU1fSAorI2RlZmluZSBBU01fWDg2X19TUEFSU0VNRU1fSAogCiAjaWZkZWYgQ09ORklHX1NQQVJTRU1FTQogLyoKQEAgLTMxLDQgKzMxLDQgQEAKICNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTSAqLwotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1BBUlNFTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20teDg2L3NwaW5sb2NrLmgKaW5kZXggZTM5Yzc5MC4uMTU3ZmY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3NwaW5sb2NrLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9YODZfU1BJTkxPQ0tfSF8KLSNkZWZpbmUgX1g4Nl9TUElOTE9DS19IXworI2lmbmRlZiBBU01fWDg2X19TUElOTE9DS19ICisjZGVmaW5lIEFTTV9YODZfX1NQSU5MT0NLX0gKIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcndsb2NrLmg+CkBAIC0yMSw4ICsyMSwxMCBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogIyBkZWZpbmUgTE9DS19QVFJfUkVHICJhIgorIyBkZWZpbmUgUkVHX1BUUl9NT0RFICJrIgogI2Vsc2UKICMgZGVmaW5lIExPQ0tfUFRSX1JFRyAiRCIKKyMgZGVmaW5lIFJFR19QVFJfTU9ERSAicSIKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSAmJiBcCkBAIC01NCwxOSArNTYsNyBAQAogICogbXVjaCBiZXR3ZWVuIHRoZW0gaW4gcGVyZm9ybWFuY2UgdGhvdWdoLCBlc3BlY2lhbGx5IGFzIGxvY2tzIGFyZSBvdXQgb2YgbGluZS4KICAqLwogI2lmIChOUl9DUFVTIDwgMjU2KQotc3RhdGljIGlubGluZSBpbnQgX190aWNrZXRfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnNsb2NrKTsKLQotCXJldHVybiAoKCh0bXAgPj4gOCkgJiAweGZmKSAhPSAodG1wICYgMHhmZikpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlpbnQgdG1wID0gQUNDRVNTX09OQ0UobG9jay0+c2xvY2spOwotCi0JcmV0dXJuICgoKHRtcCA+PiA4KSAtIHRtcCkgJiAweGZmKSA+IDE7Ci19CisjZGVmaW5lIFRJQ0tFVF9TSElGVCA4CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF9zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7CkBAIC04OSwxOSArNzksMTcgQEAKIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX190aWNrZXRfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCWludCB0bXA7Ci0Jc2hvcnQgbmV3OworCWludCB0bXAsIG5ldzsKIAotCWFzbSB2b2xhdGlsZSgibW92dyAlMiwldzBcblx0IgorCWFzbSB2b2xhdGlsZSgibW92endsICUyLCAlMFxuXHQiCiAJCSAgICAgImNtcGIgJWgwLCViMFxuXHQiCisJCSAgICAgImxlYWwgMHgxMDAoJSIgUkVHX1BUUl9NT0RFICIwKSwgJTFcblx0IgogCQkgICAgICJqbmUgMWZcblx0IgotCQkgICAgICJtb3Z3ICV3MCwldzFcblx0IgotCQkgICAgICJpbmNiICVoMVxuXHQiCi0JCSAgICAgImxvY2sgOyBjbXB4Y2hndyAldzEsJTJcblx0IgorCQkgICAgIExPQ0tfUFJFRklYICJjbXB4Y2hndyAldzEsJTJcblx0IgogCQkgICAgICIxOiIKIAkJICAgICAic2V0ZSAlYjFcblx0IgogCQkgICAgICJtb3Z6YmwgJWIxLCUwXG5cdCIKLQkJICAgICA6ICI9JmEiICh0bXApLCAiPVEiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICI9JmEiICh0bXApLCAiPSZxIiAobmV3KSwgIittIiAobG9jay0+c2xvY2spCiAJCSAgICAgOgogCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwogCkBAIC0xMTYsMjYgKzEwNCwxNCBAQAogCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IF9fdGlja2V0X3NwaW5faXNfbG9ja2VkKHJhd19zcGlubG9ja190ICpsb2NrKQotewotCWludCB0bXAgPSBBQ0NFU1NfT05DRShsb2NrLT5zbG9jayk7Ci0KLQlyZXR1cm4gKCgodG1wID4+IDE2KSAmIDB4ZmZmZikgIT0gKHRtcCAmIDB4ZmZmZikpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlpbnQgdG1wID0gQUNDRVNTX09OQ0UobG9jay0+c2xvY2spOwotCi0JcmV0dXJuICgoKHRtcCA+PiAxNikgLSB0bXApICYgMHhmZmZmKSA+IDE7Ci19CisjZGVmaW5lIFRJQ0tFVF9TSElGVCAxNgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWludCBpbmMgPSAweDAwMDEwMDAwOwogCWludCB0bXA7CiAKLQlhc20gdm9sYXRpbGUoImxvY2sgOyB4YWRkbCAlMCwgJTFcbiIKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMVxuIgogCQkgICAgICJtb3Z6d2wgJXcwLCAlMlxuXHQiCiAJCSAgICAgInNocmwgJDE2LCAlMFxuXHQiCiAJCSAgICAgIjE6XHQiCkBAIC0xNDYsNyArMTIyLDcgQEAKIAkJICAgICAvKiBkb24ndCBuZWVkIGxmZW5jZSBoZXJlLCBiZWNhdXNlIGxvYWRzIGFyZSBpbi1vcmRlciAqLwogCQkgICAgICJqbXAgMWJcbiIKIAkJICAgICAiMjoiCi0JCSAgICAgOiAiK1EiIChpbmMpLCAiK20iIChsb2NrLT5zbG9jayksICI9ciIgKHRtcCkKKwkJICAgICA6ICIrciIgKGluYyksICIrbSIgKGxvY2stPnNsb2NrKSwgIj0mciIgKHRtcCkKIAkJICAgICA6CiAJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CiB9CkBAIC0xNjAsMTMgKzEzNiwxMyBAQAogCQkgICAgICJtb3ZsICUwLCUxXG5cdCIKIAkJICAgICAicm9sbCAkMTYsICUwXG5cdCIKIAkJICAgICAiY21wbCAlMCwlMVxuXHQiCisJCSAgICAgImxlYWwgMHgwMDAxMDAwMCglIiBSRUdfUFRSX01PREUgIjApLCAlMVxuXHQiCiAJCSAgICAgImpuZSAxZlxuXHQiCi0JCSAgICAgImFkZGwgJDB4MDAwMTAwMDAsICUxXG5cdCIKLQkJICAgICAibG9jayA7IGNtcHhjaGdsICUxLCUyXG5cdCIKKwkJICAgICBMT0NLX1BSRUZJWCAiY21weGNoZ2wgJTEsJTJcblx0IgogCQkgICAgICIxOiIKIAkJICAgICAic2V0ZSAlYjFcblx0IgogCQkgICAgICJtb3Z6YmwgJWIxLCUwXG5cdCIKLQkJICAgICA6ICI9JmEiICh0bXApLCAiPXIiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICI9JmEiICh0bXApLCAiPSZxIiAobmV3KSwgIittIiAobG9jay0+c2xvY2spCiAJCSAgICAgOgogCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwogCkBAIC0xODIsNyArMTU4LDE5IEBACiB9CiAjZW5kaWYKIAotI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX190aWNrZXRfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJaW50IHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnNsb2NrKTsKKworCXJldHVybiAhISgoKHRtcCA+PiBUSUNLRVRfU0hJRlQpIF4gdG1wKSAmICgoMSA8PCBUSUNLRVRfU0hJRlQpIC0gMSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgdG1wID0gQUNDRVNTX09OQ0UobG9jay0+c2xvY2spOworCisJcmV0dXJuICgoKHRtcCA+PiBUSUNLRVRfU0hJRlQpIC0gdG1wKSAmICgoMSA8PCBUSUNLRVRfU0hJRlQpIC0gMSkpID4gMTsKK30KIAogI2lmZGVmIENPTkZJR19QQVJBVklSVAogLyoKQEAgLTI3Miw2ICsyNjAsMTMgQEAKIHsKIAlfX3RpY2tldF9zcGluX3VubG9jayhsb2NrKTsKIH0KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhyYXdfc3BpbmxvY2tfdCAqbG9jaywKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlfX3Jhd19zcGluX2xvY2sobG9jayk7Cit9CisKICNlbmRpZgkvKiBDT05GSUdfUEFSQVZJUlQgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQocmF3X3NwaW5sb2NrX3QgKmxvY2spCkBAIC0zNjYsNCArMzYxLDQgQEAKICNkZWZpbmUgX3Jhd19yZWFkX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCiAjZGVmaW5lIF9yYXdfd3JpdGVfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODYvc3BpbmxvY2tfdHlwZXMuaAppbmRleCAwNmMwNzFjLi42YWE5YjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc3BpbmxvY2tfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3BpbmxvY2tfdHlwZXMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAotI2RlZmluZSBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjaWZuZGVmIEFTTV9YODZfX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU1BJTkxPQ0tfVFlQRVNfSAogCiAjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAogIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgpAQCAtMTcsNCArMTcsNCBAQAogCiAjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgUldfTE9DS19CSUFTIH0KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1BJTkxPQ0tfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3NyYXQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zcmF0LmgKaW5kZXggNzc0YzkxOS4uNTM2M2U0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3NyYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3JhdC5oCkBAIC0yNCw4ICsyNCw4IEBACiAgKiBTZW5kIGZlZWRiYWNrIHRvIFBhdCBHYXVnaGVuIDxnb25lQHVzLmlibS5jb20+CiAgKi8KIAotI2lmbmRlZiBfQVNNX1NSQVRfSF8KLSNkZWZpbmUgX0FTTV9TUkFUX0hfCisjaWZuZGVmIEFTTV9YODZfX1NSQVRfSAorI2RlZmluZSBBU01fWDg2X19TUkFUX0gKIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIGV4dGVybiBpbnQgZ2V0X21lbWNmZ19mcm9tX3NyYXQodm9pZCk7CkBAIC0zNiw0ICszNiw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9BU01fU1JBVF9IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX1NSQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N0YWNrdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zdGFja3RyYWNlLmgKaW5kZXggMzBmODI1Mi4uZjQzNTE3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3N0YWNrdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3RhY2t0cmFjZS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1NUQUNLVFJBQ0VfSAotI2RlZmluZSBfQVNNX1NUQUNLVFJBQ0VfSCAxCisjaWZuZGVmIEFTTV9YODZfX1NUQUNLVFJBQ0VfSAorI2RlZmluZSBBU01fWDg2X19TVEFDS1RSQUNFX0gKIAogZXh0ZXJuIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7CiAKQEAgLTE4LDQgKzE4LDQgQEAKIAkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCiAJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1RBQ0tUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3RhdC5oIGIvaW5jbHVkZS9hc20teDg2L3N0YXQuaAppbmRleCA1YzIyZGNiLi4xZTEyMGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc3RhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zdGF0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NUQVRfSAotI2RlZmluZSBfQVNNX1g4Nl9TVEFUX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU1RBVF9ICisjZGVmaW5lIEFTTV9YODZfX1NUQVRfSAogCiAjZGVmaW5lIFNUQVRfSEFWRV9OU0VDIDEKIApAQCAtMTExLDQgKzExMSw0IEBACiAjZW5kaWYKIH07CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N0YXRmcy5oIGIvaW5jbHVkZS9hc20teDg2L3N0YXRmcy5oCmluZGV4IDdjNjUxYWEuLmNhNWRjMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zdGF0ZnMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3RhdGZzLmgKQEAgLTEsNjMgKzEsMTIgQEAKLSNpZm5kZWYgX0FTTV9YODZfU1RBVEZTX0gKLSNkZWZpbmUgX0FTTV9YODZfU1RBVEZTX0gKLQotI2lmZGVmIF9faTM4Nl9fCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc3RhdGZzLmg+Ci0jZWxzZQotCi0jaWZuZGVmIF9fS0VSTkVMX1NUUklDVF9OQU1FUwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotdHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QJZnNpZF90OwotCi0jZW5kaWYKKyNpZm5kZWYgQVNNX1g4Nl9fU1RBVEZTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU1RBVEZTX0gKIAogLyoKLSAqIFRoaXMgaXMgdWdseSAtLSB3ZSdyZSBhbHJlYWR5IDY0LWJpdCBjbGVhbiwgc28ganVzdCBkdXBsaWNhdGUgdGhlCi0gKiBkZWZpbml0aW9ucy4KKyAqIFdlIG5lZWQgY29tcGF0X3N0YXRmczY0IHRvIGJlIHBhY2tlZCwgYmVjYXVzZSB0aGUgaTM4NiBBQkkgd29uJ3QKKyAqIGFkZCBwYWRkaW5nIGF0IHRoZSBlbmQgdG8gYnJpbmcgaXQgdG8gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzLCBidXQKKyAqIHRoZSB4ODZfNjQgQUJJIHdpbGwuCiAgKi8KLXN0cnVjdCBzdGF0ZnMgewotCWxvbmcgZl90eXBlOwotCWxvbmcgZl9ic2l6ZTsKLQlsb25nIGZfYmxvY2tzOwotCWxvbmcgZl9iZnJlZTsKLQlsb25nIGZfYmF2YWlsOwotCWxvbmcgZl9maWxlczsKLQlsb25nIGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlsb25nIGZfbmFtZWxlbjsKLQlsb25nIGZfZnJzaXplOwotCWxvbmcgZl9zcGFyZVs1XTsKLX07CisjZGVmaW5lIEFSQ0hfUEFDS19DT01QQVRfU1RBVEZTNjQgX19hdHRyaWJ1dGVfXygocGFja2VkLGFsaWduZWQoNCkpKQogCi1zdHJ1Y3Qgc3RhdGZzNjQgewotCWxvbmcgZl90eXBlOwotCWxvbmcgZl9ic2l6ZTsKLQlsb25nIGZfYmxvY2tzOwotCWxvbmcgZl9iZnJlZTsKLQlsb25nIGZfYmF2YWlsOwotCWxvbmcgZl9maWxlczsKLQlsb25nIGZfZmZyZWU7Ci0JX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKLQlsb25nIGZfbmFtZWxlbjsKLQlsb25nIGZfZnJzaXplOwotCWxvbmcgZl9zcGFyZVs1XTsKLX07Ci0KLXN0cnVjdCBjb21wYXRfc3RhdGZzNjQgewotCV9fdTMyIGZfdHlwZTsKLQlfX3UzMiBmX2JzaXplOwotCV9fdTY0IGZfYmxvY2tzOwotCV9fdTY0IGZfYmZyZWU7Ci0JX191NjQgZl9iYXZhaWw7Ci0JX191NjQgZl9maWxlczsKLQlfX3U2NCBmX2ZmcmVlOwotCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7Ci0JX191MzIgZl9uYW1lbGVuOwotCV9fdTMyIGZfZnJzaXplOwotCV9fdTMyIGZfc3BhcmVbNV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogIV9faTM4Nl9fICovCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zdGF0ZnMuaD4KKyNlbmRpZiAvKiBBU01fWDg2X19TVEFURlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N0cmluZ18zMi5oIGIvaW5jbHVkZS9hc20teDg2L3N0cmluZ18zMi5oCmluZGV4IDE5MzU3OGMuLjQ4Nzg0M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zdHJpbmdfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3RyaW5nXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9JMzg2X1NUUklOR19IXwotI2RlZmluZSBfSTM4Nl9TVFJJTkdfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fU1RSSU5HXzMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU1RSSU5HXzMyX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMzIzLDQgKzMyMyw0IEBACiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1NUUklOR18zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3RyaW5nXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvc3RyaW5nXzY0LmgKaW5kZXggNTJiNWFiMy4uYTJhZGQxMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zdHJpbmdfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3RyaW5nXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9YODZfNjRfU1RSSU5HX0hfCi0jZGVmaW5lIF9YODZfNjRfU1RSSU5HX0hfCisjaWZuZGVmIEFTTV9YODZfX1NUUklOR182NF9ICisjZGVmaW5lIEFTTV9YODZfX1NUUklOR182NF9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTU3LDQgKzU3LDQgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1RSSU5HXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2L3N1bW1pdC9hcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0YjAwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvYXBpYy5oCkBAIC0wLDAgKzEsMTg1IEBACisjaWZuZGVmIF9fQVNNX1NVTU1JVF9BUElDX0gKKyNkZWZpbmUgX19BU01fU1VNTUlUX0FQSUNfSAorCisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjZGVmaW5lIGVzcl9kaXNhYmxlICgxKQorI2RlZmluZSBOT19CQUxBTkNFX0lSUSAoMCkKKworLyogSW4gY2x1c3RlcmVkIG1vZGUsIHRoZSBoaWdoIG5pYmJsZSBvZiBBUElDIElEIGlzIGEgY2x1c3RlciBudW1iZXIuCisgKiBUaGUgbG93IG5pYmJsZSBpcyBhIDQtYml0IGJpdG1hcC4gKi8KKyNkZWZpbmUgWEFQSUNfREVTVF9DUFVTX1NISUZUCTQKKyNkZWZpbmUgWEFQSUNfREVTVF9DUFVTX01BU0sJKCgxdSA8PCBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpIC0gMSkKKyNkZWZpbmUgWEFQSUNfREVTVF9DTFVTVEVSX01BU0sJKFhBUElDX0RFU1RfQ1BVU19NQVNLIDw8IFhBUElDX0RFU1RfQ1BVU19TSElGVCkKKworI2RlZmluZSBBUElDX0RGUl9WQUxVRQkoQVBJQ19ERlJfQ0xVU1RFUikKKworc3RhdGljIGlubGluZSBjcHVtYXNrX3QgdGFyZ2V0X2NwdXModm9pZCkKK3sKKwkvKiBDUFVfTUFTS19BTEwgKDB4ZmYpIGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIHdpdGgKKwkgKiBkZXN0X0xvd2VzdFByaW8gbW9kZSBsb2dpY2FsIGNsdXN0ZXJlZCBhcGljIGludGVycnVwdCByb3V0aW5nCisJICogSnVzdCBzdGFydCBvbiBjcHUgMC4gIElSUSBiYWxhbmNpbmcgd2lsbCBzcHJlYWQgbG9hZAorCSAqLworCXJldHVybiBjcHVtYXNrX29mX2NwdSgwKTsKK30KKyNkZWZpbmUgVEFSR0VUX0NQVVMJKHRhcmdldF9jcHVzKCkpCisKKyNkZWZpbmUgSU5UX0RFTElWRVJZX01PREUgKGRlc3RfTG93ZXN0UHJpbykKKyNkZWZpbmUgSU5UX0RFU1RfTU9ERSAxICAgICAvKiBsb2dpY2FsIGRlbGl2ZXJ5IGJyb2FkY2FzdCB0byBhbGwgcHJvY3MgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoZWNrX2FwaWNpZF91c2VkKHBoeXNpZF9tYXNrX3QgYml0bWFwLCBpbnQgYXBpY2lkKQoreworCXJldHVybiAwOworfQorCisvKiB3ZSBkb24ndCB1c2UgdGhlIHBoeXNfY3B1X3ByZXNlbnRfbWFwIHRvIGluZGljYXRlIGFwaWNpZCBwcmVzZW5jZSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoZWNrX2FwaWNpZF9wcmVzZW50KGludCBiaXQpCit7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgYXBpY2lkX2NsdXN0ZXIoYXBpY2lkKSAoKGFwaWNpZCkgJiBYQVBJQ19ERVNUX0NMVVNURVJfTUFTSykKKworZXh0ZXJuIHU4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW107CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2FwaWNfbGRyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIGlkOworCWludCBjb3VudCA9IDA7CisJdTggbXlfaWQgPSAodTgpaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJdTggbXlfY2x1c3RlciA9ICh1OClhcGljaWRfY2x1c3RlcihteV9pZCk7CisjaWZkZWYgQ09ORklHX1NNUAorCXU4IGxpZDsKKwlpbnQgaTsKKworCS8qIENyZWF0ZSBsb2dpY2FsIEFQSUMgSURzIGJ5IGNvdW50aW5nIENQVXMgYWxyZWFkeSBpbiBjbHVzdGVyLiAqLworCWZvciAoY291bnQgPSAwLCBpID0gTlJfQ1BVUzsgLS1pID49IDA7ICkgeworCQlsaWQgPSBjcHVfMl9sb2dpY2FsX2FwaWNpZFtpXTsKKwkJaWYgKGxpZCAhPSBCQURfQVBJQ0lEICYmIGFwaWNpZF9jbHVzdGVyKGxpZCkgPT0gbXlfY2x1c3RlcikKKwkJCSsrY291bnQ7CisJfQorI2VuZGlmCisJLyogV2Ugb25seSBoYXZlIGEgNCB3aWRlIGJpdG1hcCBpbiBjbHVzdGVyIG1vZGUuICBJZiBhIGRlcmFuZ2VkCisJICogQklPUyBwdXRzIDUgQ1BVcyBpbiBvbmUgQVBJQyBjbHVzdGVyLCB3ZSdyZSBob3NlZC4gKi8KKwlCVUdfT04oY291bnQgPj0gWEFQSUNfREVTVF9DUFVTX1NISUZUKTsKKwlpZCA9IG15X2NsdXN0ZXIgfCAoMVVMIDw8IGNvdW50KTsKKwlhcGljX3dyaXRlKEFQSUNfREZSLCBBUElDX0RGUl9WQUxVRSk7CisJdmFsID0gYXBpY19yZWFkKEFQSUNfTERSKSAmIH5BUElDX0xEUl9NQVNLOworCXZhbCB8PSBTRVRfQVBJQ19MT0dJQ0FMX0lEKGlkKTsKKwlhcGljX3dyaXRlKEFQSUNfTERSLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdWx0aV90aW1lcl9jaGVjayhpbnQgYXBpYywgaW50IGlycSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9hcGljX3JvdXRpbmcodm9pZCkKK3sKKwlwcmludGsoIkVuYWJsaW5nIEFQSUMgbW9kZTogIFN1bW1pdC4gIFVzaW5nICVkIEkvTyBBUElDc1xuIiwKKwkJCQkJCW5yX2lvYXBpY3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcGljaWRfdG9fbm9kZShpbnQgbG9naWNhbF9hcGljaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXJldHVybiBhcGljaWRfMl9ub2RlW2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyogTWFwcGluZyBmcm9tIGNwdSBudW1iZXIgdG8gbG9naWNhbCBhcGljaWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQoreworI2lmZGVmIENPTkZJR19TTVAKKyAgICAgICBpZiAoY3B1ID49IE5SX0NQVVMpCisJICAgICAgIHJldHVybiBCQURfQVBJQ0lEOworCXJldHVybiAoaW50KWNwdV8yX2xvZ2ljYWxfYXBpY2lkW2NwdV07CisjZWxzZQorCXJldHVybiBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCit7CisJaWYgKG1wc19jcHUgPCBOUl9DUFVTKQorCQlyZXR1cm4gKGludClwZXJfY3B1KHg4Nl9iaW9zX2NwdV9hcGljaWQsIG1wc19jcHUpOworCWVsc2UKKwkJcmV0dXJuIEJBRF9BUElDSUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGh5c2lkX21hc2tfdCBpb2FwaWNfcGh5c19pZF9tYXAocGh5c2lkX21hc2tfdCBwaHlzX2lkX21hcCkKK3sKKwkvKiBGb3IgY2x1c3RlcmVkIHdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBkbyB0aGlzIHlldCAtIGhhY2sgKi8KKwlyZXR1cm4gcGh5c2lkc19wcm9tb3RlKDB4MEYpOworfQorCitzdGF0aWMgaW5saW5lIHBoeXNpZF9tYXNrX3QgYXBpY2lkX3RvX2NwdV9wcmVzZW50KGludCBhcGljaWQpCit7CisJcmV0dXJuIHBoeXNpZF9tYXNrX29mX3BoeXNpZCgwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3BvcnRpb19yZW1hcCh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19waHlzX2FwaWNpZF9wcmVzZW50KGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfYXBpY19tb2RlKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKK3sKKwlpbnQgbnVtX2JpdHNfc2V0OworCWludCBjcHVzX2ZvdW5kID0gMDsKKwlpbnQgY3B1OworCWludCBhcGljaWQ7CisKKwludW1fYml0c19zZXQgPSBjcHVzX3dlaWdodChjcHVtYXNrKTsKKwkvKiBSZXR1cm4gaWQgdG8gYWxsICovCisJaWYgKG51bV9iaXRzX3NldCA9PSBOUl9DUFVTKQorCQlyZXR1cm4gKGludCkgMHhGRjsKKwkvKgorCSAqIFRoZSBjcHVzIGluIHRoZSBtYXNrIG11c3QgYWxsIGJlIG9uIHRoZSBhcGljIGNsdXN0ZXIuICBJZiBhcmUgbm90CisJICogb24gdGhlIHNhbWUgYXBpY2lkIGNsdXN0ZXIgcmV0dXJuIGRlZmF1bHQgdmFsdWUgb2YgVEFSR0VUX0NQVVMuCisJICovCisJY3B1ID0gZmlyc3RfY3B1KGNwdW1hc2spOworCWFwaWNpZCA9IGNwdV90b19sb2dpY2FsX2FwaWNpZChjcHUpOworCXdoaWxlIChjcHVzX2ZvdW5kIDwgbnVtX2JpdHNfc2V0KSB7CisJCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVtYXNrKSkgeworCQkJaW50IG5ld19hcGljaWQgPSBjcHVfdG9fbG9naWNhbF9hcGljaWQoY3B1KTsKKwkJCWlmIChhcGljaWRfY2x1c3RlcihhcGljaWQpICE9CisJCQkJCWFwaWNpZF9jbHVzdGVyKG5ld19hcGljaWQpKXsKKwkJCQlwcmludGsgKCIlczogTm90IGEgdmFsaWQgbWFzayFcbiIsIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gMHhGRjsKKwkJCX0KKwkJCWFwaWNpZCA9IGFwaWNpZCB8IG5ld19hcGljaWQ7CisJCQljcHVzX2ZvdW5kKys7CisJCX0KKwkJY3B1Kys7CisJfQorCXJldHVybiBhcGljaWQ7Cit9CisKKy8qIGNwdWlkIHJldHVybnMgdGhlIHZhbHVlIGxhdGNoZWQgaW4gdGhlIEhXIGF0IHJlc2V0LCBub3QgdGhlIEFQSUMgSUQKKyAqIHJlZ2lzdGVyJ3MgdmFsdWUuICBGb3IgYW55IGJveCB3aG9zZSBCSU9TIGNoYW5nZXMgQVBJQyBJRHMsIGxpa2UKKyAqIGNsdXN0ZXJlZCBBUElDIHN5c3RlbXMsIHdlIG11c3QgdXNlIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZC4KKyAqCisgKiBTZWUgSW50ZWwncyBJQS0zMiBTVyBEZXYncyBNYW51YWwgVm9sMiB1bmRlciBDUFVJRC4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcGh5c19wa2dfaWQodTMyIGNwdWlkX2FwaWMsIGludCBpbmRleF9tc2IpCit7CisJcmV0dXJuIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpID4+IGluZGV4X21zYjsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NVTU1JVF9BUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20teDg2L3N1bW1pdC9hcGljZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYmNhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvYXBpY2RlZi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19BU01fU1VNTUlUX0FQSUNERUZfSAorI2RlZmluZSBfX0FTTV9TVU1NSVRfQVBJQ0RFRl9ICisKKyNkZWZpbmUJCUFQSUNfSURfTUFTSwkJKDB4RkY8PDI0KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlyZXR1cm4gKHg+PjI0KSYweEZGOworfQorCisjZGVmaW5lCQlHRVRfQVBJQ19JRCh4KQlnZXRfYXBpY19pZCh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvaXBpLmggYi9pbmNsdWRlL2FzbS14ODYvc3VtbWl0L2lwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYmQxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3VtbWl0L2lwaS5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX19BU01fU1VNTUlUX0lQSV9ICisjZGVmaW5lIF9fQVNNX1NVTU1JVF9JUElfSAorCit2b2lkIHNlbmRfSVBJX21hc2tfc2VxdWVuY2UoY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfbWFzayhjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKK3sKKwlzZW5kX0lQSV9tYXNrX3NlcXVlbmNlKG1hc2ssIHZlY3Rvcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCit7CisJY3B1bWFza190IG1hc2sgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXNrKTsKKworCWlmICghY3B1c19lbXB0eShtYXNrKSkKKwkJc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCit7CisJc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hcCwgdmVjdG9yKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NVTU1JVF9JUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L2lycV92ZWN0b3JzX2xpbWl0cy5oIGIvaW5jbHVkZS9hc20teDg2L3N1bW1pdC9pcnFfdmVjdG9yc19saW1pdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teDg2L21hY2gtc3VtbWl0L2lycV92ZWN0b3JzX2xpbWl0cy5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS14ODYvc3VtbWl0L2lycV92ZWN0b3JzX2xpbWl0cy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3VtbWl0L21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zdW1taXQvbXBwYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2NlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3VtbWl0L21wcGFyc2UuaApAQCAtMCwwICsxLDEwOSBAQAorI2lmbmRlZiBfX0FTTV9TVU1NSVRfTVBQQVJTRV9ICisjZGVmaW5lIF9fQVNNX1NVTU1JVF9NUFBBUlNFX0gKKworI2luY2x1ZGUgPGFzbS90c2MuaD4KKworZXh0ZXJuIGludCB1c2VfY3ljbG9uZTsKKworI2lmZGVmIENPTkZJR19YODZfU1VNTUlUX05VTUEKK2V4dGVybiB2b2lkIHNldHVwX3N1bW1pdCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHNldHVwX3N1bW1pdCgpCXt9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKKwkJY2hhciAqcHJvZHVjdGlkKQoreworCWlmICghc3RybmNtcChvZW0sICJJQk0gRU5TVyIsIDgpICYmCisJCQkoIXN0cm5jbXAocHJvZHVjdGlkLCAiVklHSUwgU01QIiwgOSkKKwkJCSB8fCAhc3RybmNtcChwcm9kdWN0aWQsICJFWEEiLCAzKQorCQkJIHx8ICFzdHJuY21wKHByb2R1Y3RpZCwgIlJVVEhMRVNTIFNNUCIsIDEyKSkpeworCQltYXJrX3RzY191bnN0YWJsZSgiU3VtbWl0IGJhc2VkIHN5c3RlbSIpOworCQl1c2VfY3ljbG9uZSA9IDE7IC8qZW5hYmxlIGN5Y2xvbmUtdGltZXIqLworCQlzZXR1cF9zdW1taXQoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBIb29rIGZyb20gZ2VuZXJpYyBBQ1BJIHRhYmxlcy5jICovCitzdGF0aWMgaW5saW5lIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQoreworCWlmICghc3RybmNtcChvZW1faWQsICJJQk0iLCAzKSAmJgorCSAgICAoIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiU0VSVklHSUwiLCA4KQorCSAgICAgfHwgIXN0cm5jbXAob2VtX3RhYmxlX2lkLCAiRVhBIiwgMykpKXsKKwkJbWFya190c2NfdW5zdGFibGUoIlN1bW1pdCBiYXNlZCBzeXN0ZW0iKTsKKwkJdXNlX2N5Y2xvbmUgPSAxOyAvKmVuYWJsZSBjeWNsb25lLXRpbWVyKi8KKwkJc2V0dXBfc3VtbWl0KCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHJpb190YWJsZV9oZHIgeworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsgICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGRhdGEgc3RydWN0dXJlICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uIDMgYWRkcyBjaGFzc2lzX251bSAmIFdQX2luZGV4ICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgbnVtX3NjYWxfZGV2OyAvKiAjIG9mIFNjYWxhYmlsaXR5IGRldmljZXMgKFR3aXN0ZXJzIGZvciBWaWdpbCkgICAqLworCXVuc2lnbmVkIGNoYXIgbnVtX3Jpb19kZXY7ICAvKiAjIG9mIFJJTyBJL08gZGV2aWNlcyAoQ3ljbG9uZXMgYW5kIFdpbm5pcGVncykgICAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjYWxfZGV0YWlsIHsKKwl1bnNpZ25lZCBjaGFyIG5vZGVfaWQ7ICAgICAgLyogU2NhbGFiaWxpdHkgTm9kZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIENCQVI7ICAgICAgICAgLyogQWRkcmVzcyBvZiAxTUIgcmVnaXN0ZXIgc3BhY2UgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQwbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQxbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRiA9IE5vbmUgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQybm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRiA9IE5vbmUgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQycG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYXNzaXNfbnVtOyAgLyogMSBiYXNlZCBDaGFzc2lzIG51bWJlciAoMSA9IGJvb3Qgbm9kZSkgICAgICAgICAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCByaW9fZGV0YWlsIHsKKwl1bnNpZ25lZCBjaGFyIG5vZGVfaWQ7ICAgICAgLyogUklPIE5vZGUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIEJCQVI7ICAgICAgICAgLyogQWRkcmVzcyBvZiAxTUIgcmVnaXN0ZXIgc3BhY2UgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHR5cGU7ICAgICAgICAgLyogVHlwZSBvZiBkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIG93bmVyX2lkOyAgICAgLyogRm9yIFdQRUc6IE5vZGUgSUQgb2YgQ3ljbG9uZSB0aGF0IG93bnMgdGhpcyBXUEVHKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIE5vZGUgSUQgb2YgVHdpc3RlciB0aGF0IG93bnMgdGhpcyBDWUMgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQwbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQxbm9kZTsgICAgLyogTm9kZSBJRCBwb3J0IGNvbm5lY3RlZCB0bzogMHhGRj1Ob25lICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAweEZGPU5vbmUgKi8KKwl1bnNpZ25lZCBjaGFyIGZpcnN0X3Nsb3Q7ICAgLyogRm9yIFdQRUc6IExvd2VzdCBzbG90IG51bWJlciBiZWxvdyB0aGlzIFdQRUcgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsgICAgICAgLyogRm9yIFdQRUc6IEJpdCAwID0gMSA6IHRoZSBYQVBJQyBpcyB1c2VkICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgID0gMCA6IHRoZSBYQVBJQyBpcyBub3QgdXNlZCwgaWU6Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICBpbnRzIGZ3ZGVkIHRvIGFub3RoZXIgWEFQSUMgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIEJpdHMxOjcgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIEJpdHMwOjcgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIFdQX2luZGV4OyAgICAgLyogRm9yIFdQRUc6IFdQRUcgaW5zdGFuY2UgaW5kZXggLSBsb3dlciBvbmVzIGhhdmUgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIGxvd2VyIHNsb3QgbnVtYmVycy9QQ0kgYnVzIG51bWJlcnMgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIENZQzogIE5vIG1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYXNzaXNfbnVtOyAgLyogMSBiYXNlZCBDaGFzc2lzIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIExvb2tPdXQgV1BFR3MgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhwYW5zaW9uIENoYXNzaXMgIywgZW51bWVyYXRlZCBmcm9tIEJvb3QgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9kZSBXUEVHIGV4dGVybmFsIHBvcnQsIHRoZW4gQm9vdCBOb2RlIENZQyAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgcG9ydCwgdGhlbiBOZXh0IFZpZ2lsIGNoYXNzaXMgV1BFRyAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0ZXJuYWwgcG9ydCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hhcmVkIExvb2tvdXRzIGhhdmUgb25seSAxIGNoYXNzaXMgbnVtYmVyICh0aGUgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3Qgb25lIGFzc2lnbmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKwordHlwZWRlZiBlbnVtIHsKKwlDb21wYXRUd2lzdGVyID0gMCwgIC8qIENvbXBhdGliaWxpdHkgVHdpc3RlciAgICAgICAgICAgICAgICovCisJQWx0VHdpc3RlciAgICA9IDEsICAvKiBBbHRlcm5hdGUgVHdpc3RlciBvZiBpbnRlcm5hbCA4LXdheSAqLworCUNvbXBhdEN5Y2xvbmUgPSAyLCAgLyogQ29tcGF0aWJpbGl0eSBDeWNsb25lICAgICAgICAgICAgICAgKi8KKwlBbHRDeWNsb25lICAgID0gMywgIC8qIEFsdGVybmF0ZSBDeWNsb25lIG9mIGludGVybmFsIDgtd2F5ICovCisJQ29tcGF0V1BFRyAgICA9IDQsICAvKiBDb21wYXRpYmlsaXR5IFdQRUcgICAgICAgICAgICAgICAgICAqLworCUFsdFdQRUcgICAgICAgPSA1LCAgLyogU2Vjb25kIFBsYW5hciBXUEVHICAgICAgICAgICAgICAgICAgKi8KKwlMb29rT3V0QVdQRUcgID0gNiwgIC8qIExvb2tPdXQgV1BFRyAgICAgICAgICAgICAgICAgICAgICAgICovCisJTG9va091dEJXUEVHICA9IDcsICAvKiBMb29rT3V0IFdQRUcgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBub2RlX3R5cGU7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX1dQRUcoc3RydWN0IHJpb19kZXRhaWwgKnJpbyl7CisJcmV0dXJuIChyaW8tPnR5cGUgPT0gQ29tcGF0V1BFRyB8fCByaW8tPnR5cGUgPT0gQWx0V1BFRyB8fAorCQlyaW8tPnR5cGUgPT0gTG9va091dEFXUEVHIHx8IHJpby0+dHlwZSA9PSBMb29rT3V0QldQRUcpOworfQorCisjZW5kaWYgLyogX19BU01fU1VNTUlUX01QUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N1c3BlbmRfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zdXNwZW5kXzMyLmgKaW5kZXggODY3NWM2Ny4uYWNiNmQ0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3N1c3BlbmRfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3VzcGVuZF8zMi5oCkBAIC0zLDggKzMsOCBAQAogICogQmFzZWQgb24gY29kZQogICogQ29weXJpZ2h0IDIwMDEgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4KICAqLwotI2lmbmRlZiBfX0FTTV9YODZfMzJfU1VTUEVORF9ICi0jZGVmaW5lIF9fQVNNX1g4Nl8zMl9TVVNQRU5EX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU1VTUEVORF8zMl9ICisjZGVmaW5lIEFTTV9YODZfX1NVU1BFTkRfMzJfSAogCiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgpAQCAtNDgsNCArNDgsNCBAQAogZXh0ZXJuIGludCBhY3BpX3NhdmVfc3RhdGVfbWVtKHZvaWQpOwogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX0FTTV9YODZfMzJfU1VTUEVORF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fU1VTUEVORF8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3VzcGVuZF82NC5oIGIvaW5jbHVkZS9hc20teDg2L3N1c3BlbmRfNjQuaAppbmRleCBkYzMyNjJiLi5jZjgyMWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc3VzcGVuZF82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zdXNwZW5kXzY0LmgKQEAgLTMsOCArMyw4IEBACiAgKiBCYXNlZCBvbiBjb2RlCiAgKiBDb3B5cmlnaHQgMjAwMSBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgogICovCi0jaWZuZGVmIF9fQVNNX1g4Nl82NF9TVVNQRU5EX0gKLSNkZWZpbmUgX19BU01fWDg2XzY0X1NVU1BFTkRfSAorI2lmbmRlZiBBU01fWDg2X19TVVNQRU5EXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fU1VTUEVORF82NF9ICiAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CkBAIC00OSw0ICs0OSw0IEBACiBleHRlcm4gY2hhciBjb3JlX3Jlc3RvcmVfY29kZTsKIGV4dGVybiBjaGFyIHJlc3RvcmVfcmVnaXN0ZXJzOwogCi0jZW5kaWYgLyogX19BU01fWDg2XzY0X1NVU1BFTkRfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1NVU1BFTkRfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N3aW90bGIuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zd2lvdGxiLmgKaW5kZXggMjczMGIzNS4uMWUyMGFkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3dpb3RsYi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1NXSU9UTEJfSAotI2RlZmluZSBfQVNNX1NXSU9UTEJfSCAxCisjaWZuZGVmIEFTTV9YODZfX1NXSU9UTEJfSAorI2RlZmluZSBBU01fWDg2X19TV0lPVExCX0gKIAogI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgogCkBAIC01NSw0ICs1NSw0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfbWFya19jbGVhbih2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkge30KIAotI2VuZGlmIC8qIF9BU01fU1dJT1RMQl9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fU1dJT1RMQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3luY19iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zeW5jX2JpdG9wcy5oCmluZGV4IGI0N2ExZDAuLmI2ODliZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zeW5jX2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zeW5jX2JpdG9wcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfSTM4Nl9TWU5DX0JJVE9QU19ICi0jZGVmaW5lIF9JMzg2X1NZTkNfQklUT1BTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fU1lOQ19CSVRPUFNfSAorI2RlZmluZSBBU01fWDg2X19TWU5DX0JJVE9QU19ICiAKIC8qCiAgKiBDb3B5cmlnaHQgMTk5MiwgTGludXMgVG9ydmFsZHMuCkBAIC0xMjcsNCArMTI3LDQgQEAKIAogI3VuZGVmIEFERFIKIAotI2VuZGlmIC8qIF9JMzg2X1NZTkNfQklUT1BTX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19TWU5DX0JJVE9QU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvc3lzY2FsbC5oIGIvaW5jbHVkZS9hc20teDg2L3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM0N2RjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L3N5c2NhbGwuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIEFjY2VzcyB0byB1c2VyIHN5c3RlbSBjYWxsIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIFNlZSBhc20tZ2VuZXJpYy9zeXNjYWxsLmggZm9yIGRlc2NyaXB0aW9ucyBvZiB3aGF0IHdlIG11c3QgZG8gaGVyZS4KKyAqLworCisjaWZuZGVmIF9BU01fU1lTQ0FMTF9ICisjZGVmaW5lIF9BU01fU1lTQ0FMTF9ICTEKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9ucihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIFdlIGFsd2F5cyBzaWduLWV4dGVuZCBhIC0xIHZhbHVlIGJlaW5nIHNldCBoZXJlLAorCSAqIHNvIHRoaXMgaXMgYWx3YXlzIGVpdGhlciAtMUwgb3IgYSBzeXNjYWxsIG51bWJlci4KKwkgKi8KKwlyZXR1cm4gcmVncy0+b3JpZ19heDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfcm9sbGJhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdzLT5heCA9IHJlZ3MtPm9yaWdfYXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9lcnJvcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGVycm9yID0gcmVncy0+YXg7CisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJLyoKKwkgKiBUU19DT01QQVQgaXMgc2V0IGZvciAzMi1iaXQgc3lzY2FsbCBlbnRyaWVzIGFuZCB0aGVuCisJICogcmVtYWlucyBzZXQgdW50aWwgd2UgcmV0dXJuIHRvIHVzZXIgbW9kZS4KKwkgKi8KKwlpZiAodGFza190aHJlYWRfaW5mbyh0YXNrKS0+c3RhdHVzICYgVFNfQ09NUEFUKQorCQkvKgorCQkgKiBTaWduLWV4dGVuZCB0aGUgdmFsdWUgc28gKGludCktRUZPTyBiZWNvbWVzIChsb25nKS1FRk9PCisJCSAqIGFuZCB3aWxsIG1hdGNoIGNvcnJlY3RseSBpbiBjb21wYXJpc29ucy4KKwkJICovCisJCWVycm9yID0gKGxvbmcpIChpbnQpIGVycm9yOworI2VuZGlmCisJcmV0dXJuIElTX0VSUl9WQUxVRShlcnJvcikgPyBlcnJvciA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzeXNjYWxsX2dldF9yZXR1cm5fdmFsdWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPmF4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgaW50IGVycm9yLCBsb25nIHZhbCkKK3sKKwlyZWdzLT5heCA9IChsb25nKSBlcnJvciA/OiB2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX2dldF9hcmd1bWVudHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSB1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IG4sCisJCQkJCSB1bnNpZ25lZCBsb25nICphcmdzKQoreworCUJVR19PTihpICsgbiA+IDYpOworCW1lbWNweShhcmdzLCAmcmVncy0+YnggKyBpLCBuICogc2l6ZW9mKGFyZ3NbMF0pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfc2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFyZ3MpCit7CisJQlVHX09OKGkgKyBuID4gNik7CisJbWVtY3B5KCZyZWdzLT5ieCArIGksIGFyZ3MsIG4gKiBzaXplb2YoYXJnc1swXSkpOworfQorCisjZWxzZQkgLyogQ09ORklHX1g4Nl82NCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9nZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgdW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKyMgaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJaWYgKHRhc2tfdGhyZWFkX2luZm8odGFzayktPnN0YXR1cyAmIFRTX0NPTVBBVCkKKwkJc3dpdGNoIChpICsgbikgeworCQljYXNlIDY6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQkqYXJncysrID0gcmVncy0+YnA7CisJCWNhc2UgNToKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCSphcmdzKysgPSByZWdzLT5kaTsKKwkJY2FzZSA0OgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJKmFyZ3MrKyA9IHJlZ3MtPnNpOworCQljYXNlIDM6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQkqYXJncysrID0gcmVncy0+ZHg7CisJCWNhc2UgMjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCSphcmdzKysgPSByZWdzLT5jeDsKKwkJY2FzZSAxOgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJKmFyZ3MrKyA9IHJlZ3MtPmJ4OworCQljYXNlIDA6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9CisJZWxzZQorIyBlbmRpZgorCQlzd2l0Y2ggKGkgKyBuKSB7CisJCWNhc2UgNjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCSphcmdzKysgPSByZWdzLT5yOTsKKwkJY2FzZSA1OgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJKmFyZ3MrKyA9IHJlZ3MtPnI4OworCQljYXNlIDQ6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQkqYXJncysrID0gcmVncy0+cjEwOworCQljYXNlIDM6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQkqYXJncysrID0gcmVncy0+ZHg7CisJCWNhc2UgMjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCSphcmdzKysgPSByZWdzLT5zaTsKKwkJY2FzZSAxOgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJKmFyZ3MrKyA9IHJlZ3MtPmRpOworCQljYXNlIDA6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3NldF9hcmd1bWVudHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSB1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IG4sCisJCQkJCSBjb25zdCB1bnNpZ25lZCBsb25nICphcmdzKQoreworIyBpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKwlpZiAodGFza190aHJlYWRfaW5mbyh0YXNrKS0+c3RhdHVzICYgVFNfQ09NUEFUKQorCQlzd2l0Y2ggKGkgKyBuKSB7CisJCWNhc2UgNjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCXJlZ3MtPmJwID0gKmFyZ3MrKzsKKwkJY2FzZSA1OgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJcmVncy0+ZGkgPSAqYXJncysrOworCQljYXNlIDQ6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQlyZWdzLT5zaSA9ICphcmdzKys7CisJCWNhc2UgMzoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCXJlZ3MtPmR4ID0gKmFyZ3MrKzsKKwkJY2FzZSAyOgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJcmVncy0+Y3ggPSAqYXJncysrOworCQljYXNlIDE6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQlyZWdzLT5ieCA9ICphcmdzKys7CisJCWNhc2UgMDoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJZWxzZQorIyBlbmRpZgorCQlzd2l0Y2ggKGkgKyBuKSB7CisJCWNhc2UgNjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCXJlZ3MtPnI5ID0gKmFyZ3MrKzsKKwkJY2FzZSA1OgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJcmVncy0+cjggPSAqYXJncysrOworCQljYXNlIDQ6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQlyZWdzLT5yMTAgPSAqYXJncysrOworCQljYXNlIDM6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCQlyZWdzLT5keCA9ICphcmdzKys7CisJCWNhc2UgMjoKKwkJCWlmICghbi0tKSBicmVhazsKKwkJCXJlZ3MtPnNpID0gKmFyZ3MrKzsKKwkJY2FzZSAxOgorCQkJaWYgKCFuLS0pIGJyZWFrOworCQkJcmVncy0+ZGkgPSAqYXJncysrOworCQljYXNlIDA6CisJCQlpZiAoIW4tLSkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorfQorCisjZW5kaWYJLyogQ09ORklHX1g4Nl8zMiAqLworCisjZW5kaWYJLyogX0FTTV9TWVNDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zeXNjYWxscy5oIGIvaW5jbHVkZS9hc20teDg2L3N5c2NhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4MDNkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9zeXNjYWxscy5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBzeXNjYWxscy5oIC0gTGludXggc3lzY2FsbCBpbnRlcmZhY2VzIChhcmNoLXNwZWNpZmljKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKYXN3aW5kZXIgU2luZ2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9BU01fWDg2X1NZU0NBTExTX0gKKyNkZWZpbmUgX0FTTV9YODZfU1lTQ0FMTFNfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworLyogQ29tbW9uIGluIFg4Nl8zMiBhbmQgWDg2XzY0ICovCisvKiBrZXJuZWwvaW9wb3J0LmMgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wZXJtKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7CisKKy8qIFg4Nl8zMiBvbmx5ICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorLyoga2VybmVsL3Byb2Nlc3NfMzIuYyAqLworYXNtbGlua2FnZSBpbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MpOworYXNtbGlua2FnZSBpbnQgc3lzX2Nsb25lKHN0cnVjdCBwdF9yZWdzKTsKK2FzbWxpbmthZ2UgaW50IHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyk7Cithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzKTsKKworLyoga2VybmVsL3NpZ25hbF8zMi5jICovCithc21saW5rYWdlIGludCBzeXNfc2lnc3VzcGVuZChpbnQsIGludCwgb2xkX3NpZ3NldF90KTsKK2FzbWxpbmthZ2UgaW50IHN5c19zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKiwKKwkJCSAgICAgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICopOworYXNtbGlua2FnZSBpbnQgc3lzX3NpZ2FsdHN0YWNrKHVuc2lnbmVkIGxvbmcpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19zaWdyZXR1cm4odW5zaWduZWQgbG9uZyk7Cithc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcpOworCisvKiBrZXJuZWwvaW9wb3J0LmMgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wbCh1bnNpZ25lZCBsb25nKTsKKworLyoga2VybmVsL2xkdC5jICovCithc21saW5rYWdlIGludCBzeXNfbW9kaWZ5X2xkdChpbnQsIHZvaWQgX191c2VyICosIHVuc2lnbmVkIGxvbmcpOworCisvKiBrZXJuZWwvc3lzX2kzODZfMzIuYyAqLworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3N0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q7Cithc21saW5rYWdlIGludCBvbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqKTsKK3N0cnVjdCBzZWxfYXJnX3N0cnVjdDsKK2FzbWxpbmthZ2UgaW50IG9sZF9zZWxlY3Qoc3RydWN0IHNlbF9hcmdfc3RydWN0IF9fdXNlciAqKTsKK2FzbWxpbmthZ2UgaW50IHN5c19pcGModWludCwgaW50LCBpbnQsIGludCwgdm9pZCBfX3VzZXIgKiwgbG9uZyk7CitzdHJ1Y3Qgb2xkX3V0c25hbWU7Cithc21saW5rYWdlIGludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lIF9fdXNlciAqKTsKK3N0cnVjdCBvbGRvbGRfdXRzbmFtZTsKK2FzbWxpbmthZ2UgaW50IHN5c19vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICopOworCisvKiBrZXJuZWwvdGxzLmMgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKik7Cithc21saW5rYWdlIGludCBzeXNfZ2V0X3RocmVhZF9hcmVhKHN0cnVjdCB1c2VyX2Rlc2MgX191c2VyICopOworCisvKiBrZXJuZWwvdm04Nl8zMi5jICovCithc21saW5rYWdlIGludCBzeXNfdm04Nm9sZChzdHJ1Y3QgcHRfcmVncyk7Cithc21saW5rYWdlIGludCBzeXNfdm04NihzdHJ1Y3QgcHRfcmVncyk7CisKKyNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KKworLyogWDg2XzY0IG9ubHkgKi8KKy8qIGtlcm5lbC9wcm9jZXNzXzY0LmMgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2xvbmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkJCSAgdm9pZCBfX3VzZXIgKiwgdm9pZCBfX3VzZXIgKiwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGxvbmcgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICopOworYXNtbGlua2FnZSBsb25nIHN5c19leGVjdmUoY2hhciBfX3VzZXIgKiwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKiwKKwkJCSAgIGNoYXIgX191c2VyICogX191c2VyICosCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoga2VybmVsL2lvcG9ydC5jICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvcGwodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoga2VybmVsL3NpZ25hbF82NC5jICovCithc21saW5rYWdlIGxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICosIHN0YWNrX3QgX191c2VyICosCisJCQkJc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoga2VybmVsL3N5c194ODZfNjQuYyAqLworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgbmV3X3V0c25hbWU7Cithc21saW5rYWdlIGxvbmcgc3lzX3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKik7CisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCisjZW5kaWYgLyogX0FTTV9YODZfU1lTQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3N5c3RlbS5oIGIvaW5jbHVkZS9hc20teDg2L3N5c3RlbS5oCmluZGV4IDk4M2NlMzcuLmIyMGM4OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvc3lzdGVtLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1NZU1RFTV9IXwotI2RlZmluZSBfQVNNX1g4Nl9TWVNURU1fSF8KKyNpZm5kZWYgQVNNX1g4Nl9fU1lTVEVNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fU1lTVEVNX0gKIAogI2luY2x1ZGUgPGFzbS9hc20uaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgpAQCAtNjQsNyArNjQsMTAgQEAKIAkJICAgICAgIAkJCQkJCQlcCiAJCSAgICAgICAvKiByZWdwYXJtIHBhcmFtZXRlcnMgZm9yIF9fc3dpdGNoX3RvKCk6ICovCVwKIAkJICAgICAgIFtwcmV2XSAgICAgImEiIChwcmV2KSwJCQkJXAotCQkgICAgICAgW25leHRdICAgICAiZCIgKG5leHQpKTsJCQkJXAorCQkgICAgICAgW25leHRdICAgICAiZCIgKG5leHQpCQkJCVwKKwkJCQkJCQkJCVwKKwkJICAgICA6IC8qIHJlbG9hZGVkIHNlZ21lbnQgcmVnaXN0ZXJzICovCQkJXAorCQkJIm1lbW9yeSIpOwkJCQkJXAogfSB3aGlsZSAoMCkKIAogLyoKQEAgLTQxOSw0ICs0MjIsNCBAQAogCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKIH0KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9zeXN0ZW1fNjQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9zeXN0ZW1fNjQuaAppbmRleCA5N2ZhMjUxLi41YWVkYjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvc3lzdGVtXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3N5c3RlbV82NC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX0FTTV9TWVNURU1fSAotI2RlZmluZSBfX0FTTV9TWVNURU1fSAorI2lmbmRlZiBBU01fWDg2X19TWVNURU1fNjRfSAorI2RlZmluZSBBU01fWDg2X19TWVNURU1fNjRfSAogCiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vY21weGNoZy5oPgpAQCAtMTksNCArMTksNCBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fU1lTVEVNXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90Y2UuaCBiL2luY2x1ZGUvYXNtLXg4Ni90Y2UuaAppbmRleCBiMWE0ZWEwLi5lNzkzMmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdGNlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RjZS5oCkBAIC0yMSw4ICsyMSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqLwogCi0jaWZuZGVmIF9BU01fWDg2XzY0X1RDRV9ICi0jZGVmaW5lIF9BU01fWDg2XzY0X1RDRV9ICisjaWZuZGVmIEFTTV9YODZfX1RDRV9ICisjZGVmaW5lIEFTTV9YODZfX1RDRV9ICiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3BlY2lmaWVkX3RhYmxlX3NpemU7CiBzdHJ1Y3QgaW9tbXVfdGFibGU7CkBAIC00NSw0ICs0NSw0IEBACiBleHRlcm4gdm9pZCBfX2luaXQgZnJlZV90Y2VfdGFibGUodm9pZCAqdGJsKTsKIGV4dGVybiBpbnQgX19pbml0IGJ1aWxkX3RjZV90YWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmJiYXIpOwogCi0jZW5kaWYgLyogX0FTTV9YODZfNjRfVENFX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19UQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS14ODYvdGVybWJpdHMuaAppbmRleCBhZjFiNzBlLi4zZDAwZGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdGVybWJpdHMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfVEVSTUJJVFNfSAotI2RlZmluZSBfQVNNX1g4Nl9URVJNQklUU19ICisjaWZuZGVmIEFTTV9YODZfX1RFUk1CSVRTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVEVSTUJJVFNfSAogCiAjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KIApAQCAtMTk1LDQgKzE5NSw0IEBACiAjZGVmaW5lCVRDU0FEUkFJTgkxCiAjZGVmaW5lCVRDU0FGTFVTSAkyCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9URVJNQklUU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVEVSTUJJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni90ZXJtaW9zLmgKaW5kZXggZjcyOTU2My4uZTIzNWRiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdGVybWlvcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9URVJNSU9TX0gKLSNkZWZpbmUgX0FTTV9YODZfVEVSTUlPU19ICisjaWZuZGVmIEFTTV9YODZfX1RFUk1JT1NfSAorI2RlZmluZSBBU01fWDg2X19URVJNSU9TX0gKIAogI2luY2x1ZGUgPGFzbS90ZXJtYml0cy5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KQEAgLTExMCw0ICsxMTAsNCBAQAogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYgLyogX0FTTV9YODZfVEVSTUlPU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVEVSTUlPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdGhlcm1fdGhyb3QuaCBiL2luY2x1ZGUvYXNtLXg4Ni90aGVybV90aHJvdC5oCmluZGV4IDM5OWJmNjAuLjFjN2Y1N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni90aGVybV90aHJvdC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni90aGVybV90aHJvdC5oCkBAIC0xLDkgKzEsOSBAQAotI2lmbmRlZiBfX0FTTV9JMzg2X1RIRVJNX1RIUk9UX0hfXwotI2RlZmluZSBfX0FTTV9JMzg2X1RIRVJNX1RIUk9UX0hfXyAxCisjaWZuZGVmIEFTTV9YODZfX1RIRVJNX1RIUk9UX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVEhFUk1fVEhST1RfSAogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBleHRlcm4gYXRvbWljX3QgdGhlcm1fdGhyb3RfZW47CiBpbnQgdGhlcm1fdGhyb3RfcHJvY2VzcyhpbnQgY3Vycik7CiAKLSNlbmRpZiAvKiBfX0FTTV9JMzg2X1RIRVJNX1RIUk9UX0hfXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX1RIRVJNX1RIUk9UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20teDg2L3RocmVhZF9pbmZvLmgKaW5kZXggZGEwYTY3NS4uM2Y0ZTUyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RocmVhZF9pbmZvLmgKQEAgLTQsOCArNCw4IEBACiAgKiAtIEluY29ycG9yYXRpbmcgc3VnZ2VzdGlvbnMgbWFkZSBieSBMaW51cyBUb3J2YWxkcyBhbmQgRGF2ZSBNaWxsZXIKICAqLwogCi0jaWZuZGVmIF9BU01fWDg2X1RIUkVBRF9JTkZPX0gKLSNkZWZpbmUgX0FTTV9YODZfVEhSRUFEX0lORk9fSAorI2lmbmRlZiBBU01fWDg2X19USFJFQURfSU5GT19ICisjZGVmaW5lIEFTTV9YODZfX1RIUkVBRF9JTkZPX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTcxLDYgKzcxLDcgQEAKICAqIFdhcm5pbmc6IGxheW91dCBvZiBMU1cgaXMgaGFyZGNvZGVkIGluIGVudHJ5LlMKICAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkwCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCisjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogY2FsbGJhY2sgYmVmb3JlIHJldHVybmluZyB0byB1c2VyICovCiAjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCiAjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk0CS8qIHJlZW5hYmxlIHNpbmdsZXN0ZXAgb24gdXNlciByZXR1cm4qLwpAQCAtOTMsNiArOTQsNyBAQAogI2RlZmluZSBUSUZfQlRTX1RSQUNFX1RTCTI3ICAgICAgLyogcmVjb3JkIHNjaGVkdWxpbmcgZXZlbnQgdGltZXN0YW1wcyAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKKyNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxIDw8IFRJRl9OT1RJRllfUkVTVU1FKQogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxIDw8IFRJRl9TSUdQRU5ESU5HKQogI2RlZmluZSBfVElGX1NJTkdMRVNURVAJCSgxIDw8IFRJRl9TSU5HTEVTVEVQKQogI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMSA8PCBUSUZfTkVFRF9SRVNDSEVEKQpAQCAtMTMzLDcgKzEzNSw3IEBACiAKIC8qIE9ubHkgdXNlZCBmb3IgNjQgYml0ICovCiAjZGVmaW5lIF9USUZfRE9fTk9USUZZX01BU0sJCQkJCQlcCi0JKF9USUZfU0lHUEVORElOR3xfVElGX01DRV9OT1RJRlkpCisJKF9USUZfU0lHUEVORElOR3xfVElGX01DRV9OT1RJRll8X1RJRl9OT1RJRllfUkVTVU1FKQogCiAvKiBmbGFncyB0byBjaGVjayBpbiBfX3N3aXRjaF90bygpICovCiAjZGVmaW5lIF9USUZfV09SS19DVFhTVwkJCQkJCQlcCkBAIC0yMzksNiArMjQxLDcgQEAKICNkZWZpbmUgVFNfUE9MTElORwkJMHgwMDA0CS8qIHRydWUgaWYgaW4gaWRsZSBsb29wCiAJCQkJCSAgIGFuZCBub3Qgc2xlZXBpbmcgKi8KICNkZWZpbmUgVFNfUkVTVE9SRV9TSUdNQVNLCTB4MDAwOAkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCisjZGVmaW5lIFRTX1hTQVZFCQkweDAwMTAJLyogVXNlIHhzYXZlL3hyc3RvciAqLwogCiAjZGVmaW5lIHRza19pc19wb2xsaW5nKHQpICh0YXNrX3RocmVhZF9pbmZvKHQpLT5zdGF0dXMgJiBUU19QT0xMSU5HKQogCkBAIC0yNTgsNCArMjYxLDQgQEAKIGV4dGVybiBpbnQgYXJjaF9kdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpkc3QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3JjKTsKICNkZWZpbmUgYXJjaF90YXNrX2NhY2hlX2luaXQgYXJjaF90YXNrX2NhY2hlX2luaXQKICNlbmRpZgotI2VuZGlmIC8qIF9BU01fWDg2X1RIUkVBRF9JTkZPX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdGltZS5oIGIvaW5jbHVkZS9hc20teDg2L3RpbWUuaAppbmRleCBhMTdmYTQ3Li4zZTcyNGVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni90aW1lLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01YODZfVElNRV9ICi0jZGVmaW5lIF9BU01YODZfVElNRV9ICisjaWZuZGVmIEFTTV9YODZfX1RJTUVfSAorI2RlZmluZSBBU01fWDg2X19USU1FX0gKIAogZXh0ZXJuIHZvaWQgaHBldF90aW1lX2luaXQodm9pZCk7CiAKQEAgLTQ2LDYgKzQ2LDggQEAKIAogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHRpbWVfaW5pdCh2b2lkKTsKKwogI2lmZGVmIENPTkZJR19QQVJBVklSVAogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgogI2Vsc2UgLyogIUNPTkZJR19QQVJBVklSVCAqLwpAQCAtNTgsNCArNjAsNCBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2luaXQgY2FsaWJyYXRlX2NwdSh2b2lkKTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVElNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdGltZXIuaCBiL2luY2x1ZGUvYXNtLXg4Ni90aW1lci5oCmluZGV4IGZiMmE0ZGQuLmQwYmFiY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni90aW1lci5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNaTM4Nl9USU1FUl9ICi0jZGVmaW5lIF9BU01pMzg2X1RJTUVSX0gKKyNpZm5kZWYgQVNNX1g4Nl9fVElNRVJfSAorI2RlZmluZSBBU01fWDg2X19USU1FUl9ICiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CkBAIC05LDkgKzksMTIgQEAKIHVuc2lnbmVkIGxvbmcgbG9uZyBuYXRpdmVfc2NoZWRfY2xvY2sodm9pZCk7CiB1bnNpZ25lZCBsb25nIG5hdGl2ZV9jYWxpYnJhdGVfdHNjKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1g4Nl8zMgogZXh0ZXJuIGludCB0aW1lcl9hY2s7Ci1leHRlcm4gaW50IG5vX3RpbWVyX2NoZWNrOwogZXh0ZXJuIGludCByZWNhbGlicmF0ZV9jcHVfa2h6KHZvaWQpOworI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KKworZXh0ZXJuIGludCBub190aW1lcl9jaGVjazsKIAogI2lmbmRlZiBDT05GSUdfUEFSQVZJUlQKICNkZWZpbmUgY2FsaWJyYXRlX3RzYygpIG5hdGl2ZV9jYWxpYnJhdGVfdHNjKCkKQEAgLTYwLDQgKzYzLDQgQEAKIAlyZXR1cm4gbnM7CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90aW1leC5oIGIvaW5jbHVkZS9hc20teDg2L3RpbWV4LmgKaW5kZXggNDNlNWE3OC4uZDFjZTI0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3RpbWV4LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RpbWV4LmgKQEAgLTEsNiArMSw2IEBACiAvKiB4ODYgYXJjaGl0ZWN0dXJlIHRpbWV4IHNwZWNpZmljYXRpb25zICovCi0jaWZuZGVmIF9BU01fWDg2X1RJTUVYX0gKLSNkZWZpbmUgX0FTTV9YODZfVElNRVhfSAorI2lmbmRlZiBBU01fWDg2X19USU1FWF9ICisjZGVmaW5lIEFTTV9YODZfX1RJTUVYX0gKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+CkBAIC0xNiw0ICsxNiw0IEBACiAKICNkZWZpbmUgQVJDSF9IQVNfUkVBRF9DVVJSRU5UX1RJTUVSCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90bGIuaCBiL2luY2x1ZGUvYXNtLXg4Ni90bGIuaAppbmRleCBlNGU5ZTJkLi5kYjM2ZTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdGxiLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RsYi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9UTEJfSAotI2RlZmluZSBfQVNNX1g4Nl9UTEJfSAorI2lmbmRlZiBBU01fWDg2X19UTEJfSAorI2RlZmluZSBBU01fWDg2X19UTEJfSAogCiAjZGVmaW5lIHRsYl9zdGFydF92bWEodGxiLCB2bWEpIGRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgdGxiX2VuZF92bWEodGxiLCB2bWEpIGRvIHsgfSB3aGlsZSAoMCkKQEAgLTgsNCArOCw0IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy90bGIuaD4KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVExCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20teDg2L3RsYmZsdXNoLmgKaW5kZXggMzVjNzZjZS4uM2NkZDA4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RsYmZsdXNoLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2X1RMQkZMVVNIX0gKLSNkZWZpbmUgX0FTTV9YODZfVExCRkxVU0hfSAorI2lmbmRlZiBBU01fWDg2X19UTEJGTFVTSF9ICisjZGVmaW5lIEFTTV9YODZfX1RMQkZMVVNIX0gKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTExOSw2ICsxMTksMTAgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2xhenlfdGxic3RhdGUodm9pZCkKK3sKK30KKwogI2Vsc2UgIC8qIFNNUCAqLwogCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpAQCAtMTUxLDYgKzE1NSwxMiBAQAogCWNoYXIgX19jYWNoZWxpbmVfcGFkZGluZ1tMMV9DQUNIRV9CWVRFUy04XTsKIH07CiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHRsYl9zdGF0ZSwgY3B1X3RsYnN0YXRlKTsKKwordm9pZCByZXNldF9sYXp5X3RsYnN0YXRlKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9sYXp5X3RsYnN0YXRlKHZvaWQpCit7Cit9CiAjZW5kaWYKIAogI2VuZGlmCS8qIFNNUCAqLwpAQCAtMTY1LDQgKzE3NSw0IEBACiAJZmx1c2hfdGxiX2FsbCgpOwogfQogCi0jZW5kaWYgLyogX0FTTV9YODZfVExCRkxVU0hfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1RMQkZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20teDg2L3RvcG9sb2d5LmgKaW5kZXggOTBhYzc3MS4uN2VjYTliYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3RvcG9sb2d5LmgKQEAgLTIyLDggKzIyLDggQEAKICAqCiAgKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgogICovCi0jaWZuZGVmIF9BU01fWDg2X1RPUE9MT0dZX0gKLSNkZWZpbmUgX0FTTV9YODZfVE9QT0xPR1lfSAorI2lmbmRlZiBBU01fWDg2X19UT1BPTE9HWV9ICisjZGVmaW5lIEFTTV9YODZfX1RPUE9MT0dZX0gKIAogI2lmZGVmIENPTkZJR19YODZfMzIKICMgaWZkZWYgQ09ORklHX1g4Nl9IVApAQCAtMjU1LDQgKzI1NSw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9BU01fWDg2X1RPUE9MT0dZX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19UT1BPTE9HWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdHJhbXBvbGluZS5oIGIvaW5jbHVkZS9hc20teDg2L3RyYW1wb2xpbmUuaAppbmRleCBiMTU2YjA4Li4wNDA2YmJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdHJhbXBvbGluZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni90cmFtcG9saW5lLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fVFJBTVBPTElORV9IRUFERVIKLSNkZWZpbmUgX19UUkFNUE9MSU5FX0hFQURFUgorI2lmbmRlZiBBU01fWDg2X19UUkFNUE9MSU5FX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVFJBTVBPTElORV9ICiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTE4LDQgKzE4LDQgQEAKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCi0jZW5kaWYgLyogX19UUkFNUE9MSU5FX0hFQURFUiAqLworI2VuZGlmIC8qIEFTTV9YODZfX1RSQU1QT0xJTkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3RyYXBzLmggYi9pbmNsdWRlL2FzbS14ODYvdHJhcHMuaAppbmRleCBhNGI2NWE3Li42YzNkYzJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdHJhcHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdHJhcHMuaApAQCAtMSw3ICsxLDE0IEBACi0jaWZuZGVmIF9BU01fWDg2X1RSQVBTX0gKLSNkZWZpbmUgX0FTTV9YODZfVFJBUFNfSAorI2lmbmRlZiBBU01fWDg2X19UUkFQU19ICisjZGVmaW5lIEFTTV9YODZfX1RSQVBTX0gKIAotLyogQ29tbW9uIGluIFg4Nl8zMiBhbmQgWDg2XzY0ICovCisjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjZGVmaW5lIGRvdHJhcGxpbmthZ2UKKyNlbHNlCisjZGVmaW5lIGRvdHJhcGxpbmthZ2UgYXNtbGlua2FnZQorI2VuZGlmCisKIGFzbWxpbmthZ2Ugdm9pZCBkaXZpZGVfZXJyb3Iodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgZGVidWcodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgbm1pKHZvaWQpOwpAQCAtMTAsNTcgKzE3LDY1IEBACiBhc21saW5rYWdlIHZvaWQgYm91bmRzKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIGludmFsaWRfb3Aodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgZGV2aWNlX25vdF9hdmFpbGFibGUodm9pZCk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorYXNtbGlua2FnZSB2b2lkIGRvdWJsZV9mYXVsdCh2b2lkKTsKKyNlbmRpZgogYXNtbGlua2FnZSB2b2lkIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX1RTUyh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBzZWdtZW50X25vdF9wcmVzZW50KHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIHN0YWNrX3NlZ21lbnQodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgZ2VuZXJhbF9wcm90ZWN0aW9uKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIHBhZ2VfZmF1bHQodm9pZCk7Ci1hc21saW5rYWdlIHZvaWQgY29wcm9jZXNzb3JfZXJyb3Iodm9pZCk7Ci1hc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKLWFzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBjb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7CiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKIGFzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19YODZfTUNFICovCithc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKIAotdm9pZCBkb19kaXZpZGVfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci12b2lkIGRvX292ZXJmbG93KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotdm9pZCBkb19ib3VuZHMoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci12b2lkIGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLXZvaWQgZG9faW52YWxpZF9UU1Moc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci12b2lkIGRvX3NlZ21lbnRfbm90X3ByZXNlbnQoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci12b2lkIGRvX3N0YWNrX3NlZ21lbnQoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Ci12b2lkIGRvX2FsaWdubWVudF9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLXZvaWQgZG9faW52YWxpZF9vcChzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLXZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotdm9pZCBkb19ubWkoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Citkb3RyYXBsaW5rYWdlIHZvaWQgZG9fZGl2aWRlX2Vycm9yKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19pbnQzKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX292ZXJmbG93KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX2JvdW5kcyhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19pbnZhbGlkX29wKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX2RldmljZV9ub3RfYXZhaWxhYmxlKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19pbnZhbGlkX1RTUyhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19zZWdtZW50X25vdF9wcmVzZW50KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX3N0YWNrX3NlZ21lbnQoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7Citkb3RyYXBsaW5rYWdlIHZvaWQgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworZG90cmFwbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZyk7Citkb3RyYXBsaW5rYWdlIHZvaWQgZG9fc3B1cmlvdXNfaW50ZXJydXB0X2J1ZyhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19hbGlnbm1lbnRfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKK2RvdHJhcGxpbmthZ2Ugdm9pZCBkb19tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOworI2VuZGlmCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9fc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCitkb3RyYXBsaW5rYWdlIHZvaWQgZG9faXJldF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc2lfY29kZSh1bnNpZ25lZCBsb25nIGNvbmRpdGlvbikKK3sKKwlpZiAoY29uZGl0aW9uICYgRFJfU1RFUCkKKwkJcmV0dXJuIFRSQVBfVFJBQ0U7CisJZWxzZSBpZiAoY29uZGl0aW9uICYgKERSX1RSQVAwfERSX1RSQVAxfERSX1RSQVAyfERSX1RSQVAzKSkKKwkJcmV0dXJuIFRSQVBfSFdCS1BUOworCWVsc2UKKwkJcmV0dXJuIFRSQVBfQlJLUFQ7Cit9CiAKIGV4dGVybiBpbnQgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pOwogZXh0ZXJuIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCi0KLXZvaWQgZG9faXJldF9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLXZvaWQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLXZvaWQgZG9fZGVidWcoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CiB2b2lkIG1hdGhfZXJyb3Iodm9pZCBfX3VzZXIgKik7Ci12b2lkIGRvX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotdm9pZCBkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnKHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwogdW5zaWduZWQgbG9uZyBwYXRjaF9lc3BmaXhfZGVzYyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGFzbWxpbmthZ2Ugdm9pZCBtYXRoX2VtdWxhdGUobG9uZyk7CisjZW5kaWYKIAotI2Vsc2UgLyogQ09ORklHX1g4Nl8zMiAqLwotCi1hc21saW5rYWdlIHZvaWQgZG91YmxlX2ZhdWx0KHZvaWQpOwotCi1hc21saW5rYWdlIHZvaWQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLWFzbWxpbmthZ2Ugdm9pZCBkb19zdGFja19zZWdtZW50KHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotYXNtbGlua2FnZSB2b2lkIGRvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcpOwotYXNtbGlua2FnZSB2b2lkIGRvX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICopOwotYXNtbGlua2FnZSB2b2lkIGRvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKik7Ci1hc21saW5rYWdlIHZvaWQgZG9fc3B1cmlvdXNfaW50ZXJydXB0X2J1ZyhzdHJ1Y3QgcHRfcmVncyAqKTsKLQotI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KLSNlbmRpZiAvKiBfQVNNX1g4Nl9UUkFQU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVFJBUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3RzYy5oIGIvaW5jbHVkZS9hc20teDg2L3RzYy5oCmluZGV4IGNiNmY2ZWUuLmFkMGY1YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni90c2MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdHNjLmgKQEAgLTEsOCArMSw4IEBACiAvKgogICogeDg2IFRTQyByZWxhdGVkIGZ1bmN0aW9ucwogICovCi0jaWZuZGVmIF9BU01fWDg2X1RTQ19ICi0jZGVmaW5lIF9BU01fWDg2X1RTQ19ICisjaWZuZGVmIEFTTV9YODZfX1RTQ19ICisjZGVmaW5lIEFTTV9YODZfX1RTQ19ICiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKQEAgLTU5LDQgKzU5LDQgQEAKIAogZXh0ZXJuIGludCBub3RzY19zZXR1cChjaGFyICopOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19UU0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODYvdHlwZXMuaAppbmRleCAxYWM4MGNkLi5lNzhiNTJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdHlwZXMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfVFlQRVNfSAotI2RlZmluZSBfQVNNX1g4Nl9UWVBFU19ICisjaWZuZGVmIEFTTV9YODZfX1RZUEVTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVFlQRVNfSAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KIApAQCAtMzMsNCArMzMsNCBAQAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni91YWNjZXNzLmgKaW5kZXggNWY3MDJkMS4uNDhlYmMwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdWFjY2Vzcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1VBQ0NFU19IXwotI2RlZmluZSBfQVNNX1VBQ0NFU19IXworI2lmbmRlZiBBU01fWDg2X19VQUNDRVNTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVUFDQ0VTU19ICiAvKgogICogVXNlciBzcGFjZSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucwogICovCkBAIC00NTAsNSArNDUwLDUgQEAKICMgaW5jbHVkZSAidWFjY2Vzc182NC5oIgogI2VuZGlmCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1VBQ0NFU1NfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdWFjY2Vzc18zMi5oIGIvaW5jbHVkZS9hc20teDg2L3VhY2Nlc3NfMzIuaAppbmRleCA2ZmRlZjM5Li42YjViNTdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdWFjY2Vzc18zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91YWNjZXNzXzMyLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9faTM4Nl9VQUNDRVNTX0gKLSNkZWZpbmUgX19pMzg2X1VBQ0NFU1NfSAorI2lmbmRlZiBBU01fWDg2X19VQUNDRVNTXzMyX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVUFDQ0VTU18zMl9ICiAKIC8qCiAgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCkBAIC0yMTUsNCArMjE1LDQgQEAKIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgdW5zaWduZWQgbG9uZyBsZW4pOwogdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIHVuc2lnbmVkIGxvbmcgbGVuKTsKIAotI2VuZGlmIC8qIF9faTM4Nl9VQUNDRVNTX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19VQUNDRVNTXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni91YWNjZXNzXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvdWFjY2Vzc182NC5oCmluZGV4IDUxNWQ0ZGMuLmM5NmMxZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni91YWNjZXNzXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3VhY2Nlc3NfNjQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19YODZfNjRfVUFDQ0VTU19ICi0jZGVmaW5lIF9fWDg2XzY0X1VBQ0NFU1NfSAorI2lmbmRlZiBBU01fWDg2X19VQUNDRVNTXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fVUFDQ0VTU182NF9ICiAKIC8qCiAgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAvKgpAQCAtMTk4LDQgKzE5OSw0IEBACiB1bnNpZ25lZCBsb25nCiBjb3B5X3VzZXJfaGFuZGxlX3RhaWwoY2hhciAqdG8sIGNoYXIgKmZyb20sIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgemVyb3Jlc3QpOwogCi0jZW5kaWYgLyogX19YODZfNjRfVUFDQ0VTU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVUFDQ0VTU182NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdWNvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXg4Ni91Y29udGV4dC5oCmluZGV4IDUwYTc5ZjcuLjg5ZWFhNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni91Y29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91Y29udGV4dC5oCkBAIC0xLDUgKzEsMTEgQEAKLSNpZm5kZWYgX0FTTV9YODZfVUNPTlRFWFRfSAotI2RlZmluZSBfQVNNX1g4Nl9VQ09OVEVYVF9ICisjaWZuZGVmIEFTTV9YODZfX1VDT05URVhUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVUNPTlRFWFRfSAorCisjZGVmaW5lIFVDX0ZQX1hTVEFURQkweDEJLyogaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiBleHRlbmRlZCBzdGF0ZQorCQkJCSAqIGluZm9ybWF0aW9uIGluIHRoZSBtZW1vcnkgbGF5b3V0IHBvaW50ZWQKKwkJCQkgKiBieSB0aGUgZnBzdGF0ZSBwb2ludGVyIGluIHRoZSB1Y29udGV4dCdzCisJCQkJICogc2lnY29udGV4dCBzdHJ1Y3QgKHVjX21jb250ZXh0KS4KKwkJCQkgKi8KIAogc3RydWN0IHVjb250ZXh0IHsKIAl1bnNpZ25lZCBsb25nCSAgdWNfZmxhZ3M7CkBAIC05LDQgKzE1LDQgQEAKIAlzaWdzZXRfdAkgIHVjX3NpZ21hc2s7CS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLwogfTsKIAotI2VuZGlmIC8qIF9BU01fWDg2X1VDT05URVhUX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19VQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS14ODYvdW5hbGlnbmVkLmgKaW5kZXggYTdiZDQxNi4uNTlkY2RlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3VuYWxpZ25lZC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91bmFsaWduZWQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfVU5BTElHTkVEX0gKLSNkZWZpbmUgX0FTTV9YODZfVU5BTElHTkVEX0gKKyNpZm5kZWYgQVNNX1g4Nl9fVU5BTElHTkVEX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVU5BTElHTkVEX0gKIAogLyoKICAqIFRoZSB4ODYgY2FuIGRvIHVuYWxpZ25lZCBhY2Nlc3NlcyBpdHNlbGYuCkBAIC0xMSw0ICsxMSw0IEBACiAjZGVmaW5lIGdldF91bmFsaWduZWQgX19nZXRfdW5hbGlnbmVkX2xlCiAjZGVmaW5lIHB1dF91bmFsaWduZWQgX19wdXRfdW5hbGlnbmVkX2xlCiAKLSNlbmRpZiAvKiBfQVNNX1g4Nl9VTkFMSUdORURfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1VOQUxJR05FRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdW5pc3RkXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvdW5pc3RkXzMyLmgKaW5kZXggZDczOTQ2Ny4uMDE3ZjRhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3VuaXN0ZF8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91bmlzdGRfMzIuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9JMzg2X1VOSVNURF9IXwotI2RlZmluZSBfQVNNX0kzODZfVU5JU1REX0hfCisjaWZuZGVmIEFTTV9YODZfX1VOSVNURF8zMl9ICisjZGVmaW5lIEFTTV9YODZfX1VOSVNURF8zMl9ICiAKIC8qCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMuCkBAIC0zNzYsNCArMzc2LDQgQEAKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwotI2VuZGlmIC8qIF9BU01fSTM4Nl9VTklTVERfSF8gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19VTklTVERfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3VuaXN0ZF82NC5oIGIvaW5jbHVkZS9hc20teDg2L3VuaXN0ZF82NC5oCmluZGV4IDNhMzQxZDcuLmFjZTgzZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni91bmlzdGRfNjQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdW5pc3RkXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9BU01fWDg2XzY0X1VOSVNURF9IXwotI2RlZmluZSBfQVNNX1g4Nl82NF9VTklTVERfSF8KKyNpZm5kZWYgQVNNX1g4Nl9fVU5JU1REXzY0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fVU5JU1REXzY0X0gKIAogI2lmbmRlZiBfX1NZU0NBTEwKICNkZWZpbmUgX19TWVNDQUxMKGEsIGIpCkBAIC02OTAsNCArNjkwLDQgQEAKICNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKQogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmIC8qIF9BU01fWDg2XzY0X1VOSVNURF9IXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX1VOSVNURF82NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdW53aW5kLmggYi9pbmNsdWRlL2FzbS14ODYvdW53aW5kLmgKaW5kZXggOGIwNjRiZC4uYTIxNTE1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Vud2luZC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91bndpbmQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0FTTV9YODZfVU5XSU5EX0gKLSNkZWZpbmUgX0FTTV9YODZfVU5XSU5EX0gKKyNpZm5kZWYgQVNNX1g4Nl9fVU5XSU5EX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVU5XSU5EX0gKIAogI2RlZmluZSBVTldfUEMoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwVUwpCiAjZGVmaW5lIFVOV19TUChmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKQEAgLTEwLDQgKzEwLDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIF9BU01fWDg2X1VOV0lORF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni91c2VyMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni91c2VyMzIuaAppbmRleCBhM2Q5MTAwLi5hYTY2YzE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdXNlcjMyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3VzZXIzMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBVU0VSMzJfSAotI2RlZmluZSBVU0VSMzJfSCAxCisjaWZuZGVmIEFTTV9YODZfX1VTRVIzMl9ICisjZGVmaW5lIEFTTV9YODZfX1VTRVIzMl9ICiAKIC8qIElBMzIgY29tcGF0aWJsZSB1c2VyIHN0cnVjdHVyZXMgZm9yIHB0cmFjZS4KICAqIFRoZXNlIHNob3VsZCBiZSB1c2VkIGZvciAzMmJpdCBjb3JlZHVtcHMgdG9vLiAqLwpAQCAtNjcsNCArNjcsNCBAQAogfTsKIAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19VU0VSMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3VzZXJfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni91c2VyXzMyLmgKaW5kZXggZDZlNTFlZC4uZTBmZTJmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3VzZXJfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdXNlcl8zMi5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfSTM4Nl9VU0VSX0gKLSNkZWZpbmUgX0kzODZfVVNFUl9ICisjaWZuZGVmIEFTTV9YODZfX1VTRVJfMzJfSAorI2RlZmluZSBBU01fWDg2X19VU0VSXzMyX0gKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAvKiBDb3JlIGZpbGUgZm9ybWF0OiBUaGUgY29yZSBmaWxlIGlzIHdyaXR0ZW4gaW4gc3VjaCBhIHdheSB0aGF0IGdkYgpAQCAtMTI4LDQgKzEyOCw0IEBACiAjZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSICh1LnN0YXJ0X2NvZGUpCiAjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQogCi0jZW5kaWYgLyogX0kzODZfVVNFUl9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVVNFUl8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdXNlcl82NC5oIGIvaW5jbHVkZS9hc20teDg2L3VzZXJfNjQuaAppbmRleCA2MDM3YjYzLi4zOGI1Nzk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdXNlcl82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91c2VyXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9YODZfNjRfVVNFUl9ICi0jZGVmaW5lIF9YODZfNjRfVVNFUl9ICisjaWZuZGVmIEFTTV9YODZfX1VTRVJfNjRfSAorI2RlZmluZSBBU01fWDg2X19VU0VSXzY0X0gKIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xMzQsNCArMTM0LDQgQEAKICNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgKHUuc3RhcnRfY29kZSkKICNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCiAKLSNlbmRpZiAvKiBfWDg2XzY0X1VTRVJfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1VTRVJfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3V2L2Jpb3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni91di9iaW9zLmgKaW5kZXggYWE3MzM2Mi4uN2NkNmQ3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3V2L2Jpb3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdXYvYmlvcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9CSU9TX0gKLSNkZWZpbmUgX0FTTV9YODZfQklPU19ICisjaWZuZGVmIEFTTV9YODZfX1VWX19CSU9TX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVVZfX0JJT1NfSAogCiAvKgogICogQklPUyBsYXllciBkZWZpbml0aW9ucy4KQEAgLTY1LDQgKzY1LDQgQEAKIAkJICAgdW5zaWduZWQgbG9uZyAqZHJpZnRfaW5mbyk7CiBleHRlcm4gY29uc3QgY2hhciAqeDg2X2Jpb3Nfc3RyZXJyb3IobG9uZyBzdGF0dXMpOwogCi0jZW5kaWYgLyogX0FTTV9YODZfQklPU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVVZfX0JJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3V2L3V2X2JhdS5oIGIvaW5jbHVkZS9hc20teDg2L3V2L3V2X2JhdS5oCmluZGV4IDYxMGI2YjMuLjc3MTUzZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni91di91dl9iYXUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdXYvdXZfYmF1LmgKQEAgLTgsOCArOCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKLSNpZm5kZWYgX19BU01fWDg2X1VWX0JBVV9fCi0jZGVmaW5lIF9fQVNNX1g4Nl9VVl9CQVVfXworI2lmbmRlZiBBU01fWDg2X19VVl9fVVZfQkFVX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVVZfX1VWX0JBVV9ICiAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNkZWZpbmUgQklUU1BFUkJZVEUgOApAQCAtMzI5LDQgKzMyOSw0IEBACiBleHRlcm4gdm9pZCB1dl9iYXVfbWVzc2FnZV9pbnRyMSh2b2lkKTsKIGV4dGVybiB2b2lkIHV2X2JhdV90aW1lb3V0X2ludHIxKHZvaWQpOwogCi0jZW5kaWYgLyogX19BU01fWDg2X1VWX0JBVV9fICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVVZfX1VWX0JBVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdXYvdXZfaHViLmggYi9pbmNsdWRlL2FzbS14ODYvdXYvdXZfaHViLmgKaW5kZXggYTRlZjI2ZS4uYmRiNWIwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3V2L3V2X2h1Yi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91di91dl9odWIuaApAQCAtOCw4ICs4LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCi0jaWZuZGVmIF9fQVNNX1g4Nl9VVl9IVUJfSF9fCi0jZGVmaW5lIF9fQVNNX1g4Nl9VVl9IVUJfSF9fCisjaWZuZGVmIEFTTV9YODZfX1VWX19VVl9IVUJfSAorI2RlZmluZSBBU01fWDg2X19VVl9fVVZfSFVCX0gKIAogI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KQEAgLTM1MCw1ICszNTAsNSBAQAogCXJldHVybiB1dl9wb3NzaWJsZV9ibGFkZXM7CiB9CiAKLSNlbmRpZiAvKiBfX0FTTV9YODZfVVZfSFVCX18gKi8KKyNlbmRpZiAvKiBBU01fWDg2X19VVl9fVVZfSFVCX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3V2L3V2X21tcnMuaCBiL2luY2x1ZGUvYXNtLXg4Ni91di91dl9tbXJzLmgKaW5kZXggMTUxZmQ3Zi4uOGIwM2Q4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3V2L3V2X21tcnMuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdXYvdXZfbW1ycy5oCkBAIC04LDggKzgsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKLSNpZm5kZWYgX19BU01fWDg2X1VWX01NUlNfXwotI2RlZmluZSBfX0FTTV9YODZfVVZfTU1SU19fCisjaWZuZGVmIEFTTV9YODZfX1VWX19VVl9NTVJTX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVVZfX1VWX01NUlNfSAogCiAjZGVmaW5lIFVWX01NUl9FTkFCTEUJCSgxVUwgPDwgNjMpCiAKQEAgLTEyOTIsNCArMTI5Miw0IEBACiB9OwogCiAKLSNlbmRpZiAvKiBfX0FTTV9YODZfVVZfTU1SU19fICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVVZfX1VWX01NUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Zkc28uaCBiL2luY2x1ZGUvYXNtLXg4Ni92ZHNvLmgKaW5kZXggOGUxOGZiOC4uNGFiMzIwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Zkc28uaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdmRzby5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl9WRFNPX0gKLSNkZWZpbmUgX0FTTV9YODZfVkRTT19ICTEKKyNpZm5kZWYgQVNNX1g4Nl9fVkRTT19ICisjZGVmaW5lIEFTTV9YODZfX1ZEU09fSAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogZXh0ZXJuIGNvbnN0IGNoYXIgVkRTTzY0X1BSRUxJTktbXTsKQEAgLTQ0LDQgKzQ0LDQgQEAKIGV4dGVybiBjb25zdCBjaGFyIHZkc28zMl9zeXNjYWxsX3N0YXJ0LCB2ZHNvMzJfc3lzY2FsbF9lbmQ7CiBleHRlcm4gY29uc3QgY2hhciB2ZHNvMzJfc3lzZW50ZXJfc3RhcnQsIHZkc28zMl9zeXNlbnRlcl9lbmQ7CiAKLSNlbmRpZgkvKiBhc20teDg2L3Zkc28uaCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1ZEU09fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3ZnYS5oIGIvaW5jbHVkZS9hc20teDg2L3ZnYS5oCmluZGV4IDBjY2Y4MDQuLmI5ZTQ5M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92Z2EuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdmdhLmgKQEAgLTQsOCArNCw4IEBACiAgKgkoYykgMTk5OCBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KICAqLwogCi0jaWZuZGVmIF9MSU5VWF9BU01fVkdBX0hfCi0jZGVmaW5lIF9MSU5VWF9BU01fVkdBX0hfCisjaWZuZGVmIEFTTV9YODZfX1ZHQV9ICisjZGVmaW5lIEFTTV9YODZfX1ZHQV9ICiAKIC8qCiAgKglPbiB0aGUgUEMsIHdlIGNhbiBqdXN0IHJlY2FsY3VsYXRlIGFkZHJlc3NlcyBhbmQgdGhlbgpAQCAtMTcsNCArMTcsNCBAQAogI2RlZmluZSB2Z2FfcmVhZGIoeCkgKCooeCkpCiAjZGVmaW5lIHZnYV93cml0ZWIoeCwgeSkgKCooeSkgPSAoeCkpCiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1ZHQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdmd0b2QuaCBiL2luY2x1ZGUvYXNtLXg4Ni92Z3RvZC5oCmluZGV4IDMzMDFmMDkuLjM4ZmQxMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92Z3RvZC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni92Z3RvZC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1ZHVE9EX0gKLSNkZWZpbmUgX0FTTV9WR1RPRF9IIDEKKyNpZm5kZWYgQVNNX1g4Nl9fVkdUT0RfSAorI2RlZmluZSBBU01fWDg2X19WR1RPRF9ICiAKICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgpAQCAtMjYsNCArMjYsNCBAQAogX19zZWN0aW9uX3ZzeXNjYWxsX2d0b2RfZGF0YTsKIGV4dGVybiBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhIHZzeXNjYWxsX2d0b2RfZGF0YTsKIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVkdUT0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Zpc3dzL2NvYmFsdC5oIGIvaW5jbHVkZS9hc20teDg2L3Zpc3dzL2NvYmFsdC5oCmluZGV4IDk5NTI1ODguLjk2MjdhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92aXN3cy9jb2JhbHQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdmlzd3MvY29iYWx0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fSTM4Nl9TR0lfQ09CQUxUX0gKLSNkZWZpbmUgX19JMzg2X1NHSV9DT0JBTFRfSAorI2lmbmRlZiBBU01fWDg2X19WSVNXU19fQ09CQUxUX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVklTV1NfX0NPQkFMVF9ICiAKICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAKQEAgLTEyMiw0ICsxMjIsNCBAQAogCiBleHRlcm4gY2hhciB2aXN3c19ib2FyZF9yZXY7CiAKLSNlbmRpZiAvKiBfX0kzODZfU0dJX0NPQkFMVF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVklTV1NfX0NPQkFMVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdmlzd3MvbGl0aGl1bS5oIGIvaW5jbHVkZS9hc20teDg2L3Zpc3dzL2xpdGhpdW0uaAppbmRleCBkZmNkNGYwLi5iMzZkM2IzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdmlzd3MvbGl0aGl1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni92aXN3cy9saXRoaXVtLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fSTM4Nl9TR0lfTElUSElVTV9ICi0jZGVmaW5lIF9fSTM4Nl9TR0lfTElUSElVTV9ICisjaWZuZGVmIEFTTV9YODZfX1ZJU1dTX19MSVRISVVNX0gKKyNkZWZpbmUgQVNNX1g4Nl9fVklTV1NfX0xJVEhJVU1fSAogCiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogCkBAIC00OSw1ICs0OSw1IEBACiAJcmV0dXJuICooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKExJX1BDSUJfVkFERFIrcmVnKSk7CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIEFTTV9YODZfX1ZJU1dTX19MSVRISVVNX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Zpc3dzL3BpaXg0LmggYi9pbmNsdWRlL2FzbS14ODYvdmlzd3MvcGlpeDQuaAppbmRleCA4M2VhNGY0Li42MWM5MzgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdmlzd3MvcGlpeDQuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdmlzd3MvcGlpeDQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19JMzg2X1NHSV9QSUlYX0gKLSNkZWZpbmUgX19JMzg2X1NHSV9QSUlYX0gKKyNpZm5kZWYgQVNNX1g4Nl9fVklTV1NfX1BJSVg0X0gKKyNkZWZpbmUgQVNNX1g4Nl9fVklTV1NfX1BJSVg0X0gKIAogLyoKICAqIFBJSVg0IGFzIHVzZWQgb24gU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbnMKQEAgLTEwNCw0ICsxMDQsNCBAQAogICovCiAjZGVmaW5lCVBJSVhfR1BJX1NUUENMSwkJMHg0CS8vIFNUUENMSyBzaWduYWwgcm91dGVkIGJhY2sgaW4KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVklTV1NfX1BJSVg0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni92bTg2LmggYi9pbmNsdWRlL2FzbS14ODYvdm04Ni5oCmluZGV4IDVjZTM1MTMuLjk5OGJkMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92bTg2LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3ZtODYuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX0xJTlVYX1ZNODZfSAotI2RlZmluZSBfTElOVVhfVk04Nl9ICisjaWZuZGVmIEFTTV9YODZfX1ZNODZfSAorI2RlZmluZSBBU01fWDg2X19WTTg2X0gKIAogLyoKICAqIEknbSBndWVzc2luZyBhdCB0aGUgVklGL1ZJUCBmbGFnIHVzYWdlLCBidXQgaG9wZSB0aGF0IHRoaXMgaXMgaG93CkBAIC0yMDUsNCArMjA1LDQgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmCisjZW5kaWYgLyogQVNNX1g4Nl9fVk04Nl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdm1pX3RpbWUuaCBiL2luY2x1ZGUvYXNtLXg4Ni92bWlfdGltZS5oCmluZGV4IGMzMTE4YzMuLmIyZDM5ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92bWlfdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni92bWlfdGltZS5oCkBAIC0yMiw4ICsyMiw4IEBACiAgKgogICovCiAKLSNpZm5kZWYgX19WTUlfVElNRV9ICi0jZGVmaW5lIF9fVk1JX1RJTUVfSAorI2lmbmRlZiBBU01fWDg2X19WTUlfVElNRV9ICisjZGVmaW5lIEFTTV9YODZfX1ZNSV9USU1FX0gKIAogLyoKICAqIFJhdyBWTUkgY2FsbCBpbmRpY2VzIGZvciB0aW1lciBmdW5jdGlvbnMKQEAgLTk1LDQgKzk1LDQgQEAKIAogI2RlZmluZSBDT05GSUdfVk1JX0FMQVJNX0haCTEwMAogCi0jZW5kaWYKKyNlbmRpZiAvKiBBU01fWDg2X19WTUlfVElNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdnN5c2NhbGwuaCBiL2luY2x1ZGUvYXNtLXg4Ni92c3lzY2FsbC5oCmluZGV4IDZiNjZmZjkuLmRjZDQ2ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni92c3lzY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni92c3lzY2FsbC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfQVNNX1g4Nl82NF9WU1lTQ0FMTF9IXwotI2RlZmluZSBfQVNNX1g4Nl82NF9WU1lTQ0FMTF9IXworI2lmbmRlZiBBU01fWDg2X19WU1lTQ0FMTF9ICisjZGVmaW5lIEFTTV9YODZfX1ZTWVNDQUxMX0gKIAogZW51bSB2c3lzY2FsbF9udW0gewogCV9fTlJfdmdldHRpbWVvZmRheSwKQEAgLTQxLDQgKzQxLDQgQEAKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2VuZGlmIC8qIF9BU01fWDg2XzY0X1ZTWVNDQUxMX0hfICovCisjZW5kaWYgLyogQVNNX1g4Nl9fVlNZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hjci5oIGIvaW5jbHVkZS9hc20teDg2L3hjci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2JhNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L3hjci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA4IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBhc20teDg2L3hjci5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBlWHRlbmRlZCBDb250cm9sIFJlZ2lzdGVyIGluc3RydWN0aW9ucworICovCisKKyNpZm5kZWYgX0FTTV9YODZfWENSX0gKKyNkZWZpbmUgX0FTTV9YODZfWENSX0gKKworI2RlZmluZSBYQ1JfWEZFQVRVUkVfRU5BQkxFRF9NQVNLCTB4MDAwMDAwMDAKKworI2lmZGVmIF9fS0VSTkVMX18KKyMgaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RhdGljIGlubGluZSB1NjQgeGdldGJ2KHUzMiBpbmRleCkKK3sKKwl1MzIgZWF4LCBlZHg7CisKKwlhc20gdm9sYXRpbGUoIi5ieXRlIDB4MGYsMHgwMSwweGQwIiAvKiB4Z2V0YnYgKi8KKwkJICAgICA6ICI9YSIgKGVheCksICI9ZCIgKGVkeCkKKwkJICAgICA6ICJjIiAoaW5kZXgpKTsKKwlyZXR1cm4gZWF4ICsgKCh1NjQpZWR4IDw8IDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhzZXRidih1MzIgaW5kZXgsIHU2NCB2YWx1ZSkKK3sKKwl1MzIgZWF4ID0gdmFsdWU7CisJdTMyIGVkeCA9IHZhbHVlID4+IDMyOworCisJYXNtIHZvbGF0aWxlKCIuYnl0ZSAweDBmLDB4MDEsMHhkMSIgLyogeHNldGJ2ICovCisJCSAgICAgOiA6ICJhIiAoZWF4KSwgImQiIChlZHgpLCAiYyIgKGluZGV4KSk7Cit9CisKKyMgZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0FTTV9YODZfWENSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vZXZlbnRzLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL2V2ZW50cy5oCmluZGV4IDhkZWQ3NDcuLjgxNTFmNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9ldmVudHMuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19YRU5fRVZFTlRTX0gKLSNkZWZpbmUgX19YRU5fRVZFTlRTX0gKKyNpZm5kZWYgQVNNX1g4Nl9fWEVOX19FVkVOVFNfSAorI2RlZmluZSBBU01fWDg2X19YRU5fX0VWRU5UU19ICiAKIGVudW0gaXBpX3ZlY3RvciB7CiAJWEVOX1JFU0NIRURVTEVfVkVDVE9SLApAQCAtMjEsNCArMjEsNCBAQAogCWRvX0lSUShyZWdzKTsKIH0KIAotI2VuZGlmIC8qIF9fWEVOX0VWRU5UU19IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fWEVOX19FVkVOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9ncmFudF90YWJsZS5oIGIvaW5jbHVkZS9hc20teDg2L3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDI0NDRkNDUuLmM0YmFhYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vZ3JhbnRfdGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL2dyYW50X3RhYmxlLmgKQEAgLTEsNyArMSw3IEBACi0jaWZuZGVmIF9fWEVOX0dSQU5UX1RBQkxFX0gKLSNkZWZpbmUgX19YRU5fR1JBTlRfVEFCTEVfSAorI2lmbmRlZiBBU01fWDg2X19YRU5fX0dSQU5UX1RBQkxFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fWEVOX19HUkFOVF9UQUJMRV9ICiAKICNkZWZpbmUgeGVuX2FsbG9jX3ZtX2FyZWEoc2l6ZSkJYWxsb2Nfdm1fYXJlYShzaXplKQogI2RlZmluZSB4ZW5fZnJlZV92bV9hcmVhKGFyZWEpCWZyZWVfdm1fYXJlYShhcmVhKQogCi0jZW5kaWYgLyogX19YRU5fR1JBTlRfVEFCTEVfSCAqLworI2VuZGlmIC8qIEFTTV9YODZfX1hFTl9fR1JBTlRfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcmNhbGwuaCBiL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaHlwZXJjYWxsLmgKaW5kZXggOTFjYjdmZC4uNDRmNDI1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcmNhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL2h5cGVyY2FsbC5oCkBAIC0zMCw4ICszMCw4IEBACiAgKiBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAotI2lmbmRlZiBfX0hZUEVSQ0FMTF9IX18KLSNkZWZpbmUgX19IWVBFUkNBTExfSF9fCisjaWZuZGVmIEFTTV9YODZfX1hFTl9fSFlQRVJDQUxMX0gKKyNkZWZpbmUgQVNNX1g4Nl9fWEVOX19IWVBFUkNBTExfSAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTUyNCw0ICs1MjQsNCBAQAogCW1jbC0+YXJnc1sxXSA9IGVzcDsKIH0KIAotI2VuZGlmIC8qIF9fSFlQRVJDQUxMX0hfXyAqLworI2VuZGlmIC8qIEFTTV9YODZfX1hFTl9fSFlQRVJDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaHlwZXJ2aXNvci5oIGIvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcnZpc29yLmgKaW5kZXggMDRlZTA2MS4uNDQ1YTI0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcnZpc29yLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9oeXBlcnZpc29yLmgKQEAgLTMwLDggKzMwLDggQEAKICAqIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCi0jaWZuZGVmIF9fSFlQRVJWSVNPUl9IX18KLSNkZWZpbmUgX19IWVBFUlZJU09SX0hfXworI2lmbmRlZiBBU01fWDg2X19YRU5fX0hZUEVSVklTT1JfSAorI2RlZmluZSBBU01fWDg2X19YRU5fX0hZUEVSVklTT1JfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTU0LDcgKzU0LDYgQEAKIC8qIGFyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyAqLwogZXh0ZXJuIHN0cnVjdCBzaGFyZWRfaW5mbyAqSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIGV4dGVybiBzdHJ1Y3Qgc3RhcnRfaW5mbyAqeGVuX3N0YXJ0X2luZm87Ci0jZGVmaW5lIGlzX2luaXRpYWxfeGVuZG9tYWluKCkgKHhlbl9zdGFydF9pbmZvLT5mbGFncyAmIFNJRl9JTklURE9NQUlOKQogCiAvKiBhcmNoL2kzODYvbWFjaC14ZW4vZXZ0Y2huLmMgKi8KIC8qIEZvcmNlIGEgcHJvcGVyIGV2ZW50LWNoYW5uZWwgY2FsbGJhY2sgZnJvbSBYZW4uICovCkBAIC02Nyw2ICs2NiwxNyBAQAogI2RlZmluZSBNVUxUSV9VVk1GTEFHU19JTkRFWCAzCiAjZGVmaW5lIE1VTFRJX1VWTURPTUlEX0lOREVYIDQKIAotI2RlZmluZSBpc19ydW5uaW5nX29uX3hlbigpCSh4ZW5fc3RhcnRfaW5mbyA/IDEgOiAwKQorZW51bSB4ZW5fZG9tYWluX3R5cGUgeworCVhFTl9OQVRJVkUsCisJWEVOX1BWX0RPTUFJTiwKKwlYRU5fSFZNX0RPTUFJTiwKK307CiAKLSNlbmRpZiAvKiBfX0hZUEVSVklTT1JfSF9fICovCitleHRlcm4gZW51bSB4ZW5fZG9tYWluX3R5cGUgeGVuX2RvbWFpbl90eXBlOworCisjZGVmaW5lIHhlbl9kb21haW4oKQkJKHhlbl9kb21haW5fdHlwZSAhPSBYRU5fTkFUSVZFKQorI2RlZmluZSB4ZW5fcHZfZG9tYWluKCkJCSh4ZW5fZG9tYWluX3R5cGUgPT0gWEVOX1BWX0RPTUFJTikKKyNkZWZpbmUgeGVuX2luaXRpYWxfZG9tYWluKCkJKHhlbl9wdl9kb21haW4oKSAmJiB4ZW5fc3RhcnRfaW5mby0+ZmxhZ3MgJiBTSUZfSU5JVERPTUFJTikKKyNkZWZpbmUgeGVuX2h2bV9kb21haW4oKQkoeGVuX2RvbWFpbl90eXBlID09IFhFTl9IVk1fRE9NQUlOKQorCisjZW5kaWYgLyogQVNNX1g4Nl9fWEVOX19IWVBFUlZJU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL2ludGVyZmFjZS5oCmluZGV4IDlkODEwZjIuLmQwNzdiYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3hlbi9pbnRlcmZhY2UuaApAQCAtNiw4ICs2LDggQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCwgSyBBIEZyYXNlcgogICovCiAKLSNpZm5kZWYgX19BU01fWDg2X1hFTl9JTlRFUkZBQ0VfSAotI2RlZmluZSBfX0FTTV9YODZfWEVOX0lOVEVSRkFDRV9ICisjaWZuZGVmIEFTTV9YODZfX1hFTl9fSU5URVJGQUNFX0gKKyNkZWZpbmUgQVNNX1g4Nl9fWEVOX19JTlRFUkZBQ0VfSAogCiAjaWZkZWYgX19YRU5fXwogI2RlZmluZSBfX0RFRklORV9HVUVTVF9IQU5ETEUobmFtZSwgdHlwZSkgXApAQCAtMTcyLDQgKzE3Miw0IEBACiAjZGVmaW5lIFhFTl9DUFVJRCAgICAgICAgICBYRU5fRU1VTEFURV9QUkVGSVggImNwdWlkIgogI2VuZGlmCiAKLSNlbmRpZgkvKiBfX0FTTV9YODZfWEVOX0lOVEVSRkFDRV9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fWEVOX19JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9pbnRlcmZhY2VfMzIuaCBiL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlXzMyLmgKaW5kZXggZDhhYzQxZC4uMDgxNjdlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3hlbi9pbnRlcmZhY2VfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL2ludGVyZmFjZV8zMi5oCkBAIC02LDggKzYsOCBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LCBLIEEgRnJhc2VyCiAgKi8KIAotI2lmbmRlZiBfX0FTTV9YODZfWEVOX0lOVEVSRkFDRV8zMl9ICi0jZGVmaW5lIF9fQVNNX1g4Nl9YRU5fSU5URVJGQUNFXzMyX0gKKyNpZm5kZWYgQVNNX1g4Nl9fWEVOX19JTlRFUkZBQ0VfMzJfSAorI2RlZmluZSBBU01fWDg2X19YRU5fX0lOVEVSRkFDRV8zMl9ICiAKIAogLyoKQEAgLTk0LDQgKzk0LDQgQEAKICNkZWZpbmUgeGVuX3Bmbl90b19jcjMocGZuKSAoKCh1bnNpZ25lZCkocGZuKSA8PCAxMikgfCAoKHVuc2lnbmVkKShwZm4pID4+IDIwKSkKICNkZWZpbmUgeGVuX2NyM190b19wZm4oY3IzKSAoKCh1bnNpZ25lZCkoY3IzKSA+PiAxMikgfCAoKHVuc2lnbmVkKShjcjMpIDw8IDIwKSkKIAotI2VuZGlmCS8qIF9fQVNNX1g4Nl9YRU5fSU5URVJGQUNFXzMyX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19YRU5fX0lOVEVSRkFDRV8zMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYveGVuL2ludGVyZmFjZV82NC5oIGIvaW5jbHVkZS9hc20teDg2L3hlbi9pbnRlcmZhY2VfNjQuaAppbmRleCA4NDIyNjZjLi4wNDZjMGYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYveGVuL2ludGVyZmFjZV82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni94ZW4vaW50ZXJmYWNlXzY0LmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX1g4Nl9YRU5fSU5URVJGQUNFXzY0X0gKLSNkZWZpbmUgX19BU01fWDg2X1hFTl9JTlRFUkZBQ0VfNjRfSAorI2lmbmRlZiBBU01fWDg2X19YRU5fX0lOVEVSRkFDRV82NF9ICisjZGVmaW5lIEFTTV9YODZfX1hFTl9fSU5URVJGQUNFXzY0X0gKIAogLyoKICAqIDY0LWJpdCBzZWdtZW50IHNlbGVjdG9ycwpAQCAtMTU2LDQgKzE1Niw0IEBACiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAKLSNlbmRpZgkvKiBfX0FTTV9YODZfWEVOX0lOVEVSRkFDRV82NF9IICovCisjZW5kaWYgLyogQVNNX1g4Nl9fWEVOX19JTlRFUkZBQ0VfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hlbi9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODYveGVuL3BhZ2UuaAppbmRleCA3YjM4MzVkLi5kNWVhZGEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYveGVuL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODYveGVuL3BhZ2UuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19YRU5fUEFHRV9ICi0jZGVmaW5lIF9fWEVOX1BBR0VfSAorI2lmbmRlZiBBU01fWDg2X19YRU5fX1BBR0VfSAorI2RlZmluZSBBU01fWDg2X19YRU5fX1BBR0VfSAogCiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAKQEAgLTc2LDEzICs3NiwxMyBAQAogc3RhdGljIGlubGluZSB4bWFkZHJfdCBwaHlzX3RvX21hY2hpbmUoeHBhZGRyX3QgcGh5cykKIHsKIAl1bnNpZ25lZCBvZmZzZXQgPSBwaHlzLnBhZGRyICYgflBBR0VfTUFTSzsKLQlyZXR1cm4gWE1BRERSKFBGTl9QSFlTKCh1NjQpcGZuX3RvX21mbihQRk5fRE9XTihwaHlzLnBhZGRyKSkpIHwgb2Zmc2V0KTsKKwlyZXR1cm4gWE1BRERSKFBGTl9QSFlTKHBmbl90b19tZm4oUEZOX0RPV04ocGh5cy5wYWRkcikpKSB8IG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgeHBhZGRyX3QgbWFjaGluZV90b19waHlzKHhtYWRkcl90IG1hY2hpbmUpCiB7CiAJdW5zaWduZWQgb2Zmc2V0ID0gbWFjaGluZS5tYWRkciAmIH5QQUdFX01BU0s7Ci0JcmV0dXJuIFhQQUREUihQRk5fUEhZUygodTY0KW1mbl90b19wZm4oUEZOX0RPV04obWFjaGluZS5tYWRkcikpKSB8IG9mZnNldCk7CisJcmV0dXJuIFhQQUREUihQRk5fUEhZUyhtZm5fdG9fcGZuKFBGTl9ET1dOKG1hY2hpbmUubWFkZHIpKSkgfCBvZmZzZXQpOwogfQogCiAvKgpAQCAtMTYyLDQgKzE2Miw0IEBACiB2b2lkIG1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkodm9pZCAqdmFkZHIpOwogdm9pZCBtYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZSh2b2lkICp2YWRkcik7CiAKLSNlbmRpZiAvKiBfX1hFTl9QQUdFX0ggKi8KKyNlbmRpZiAvKiBBU01fWDg2X19YRU5fX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3hzYXZlLmggYi9pbmNsdWRlL2FzbS14ODYveHNhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGU5YTFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2L3hzYXZlLmgKQEAgLTAsMCArMSwxMTggQEAKKyNpZm5kZWYgX19BU01fWDg2X1hTQVZFX0gKKyNkZWZpbmUgX19BU01fWDg2X1hTQVZFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisKKyNkZWZpbmUgWFNUQVRFX0ZQCTB4MQorI2RlZmluZSBYU1RBVEVfU1NFCTB4MgorCisjZGVmaW5lIFhTVEFURV9GUFNTRQkoWFNUQVRFX0ZQIHwgWFNUQVRFX1NTRSkKKworI2RlZmluZSBGWFNBVkVfU0laRQk1MTIKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZmVhdHVyZXMgdGhhdCB0aGUgT1MgY2FuIGhhbmRsZSBjdXJyZW50bHkuCisgKi8KKyNkZWZpbmUgWENOVFhUX01BU0sJKFhTVEFURV9GUCB8IFhTVEFURV9TU0UpCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIFJFWF9QUkVGSVgJIjB4NDgsICIKKyNlbHNlCisjZGVmaW5lIFJFWF9QUkVGSVgKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgaW50IHhzdGF0ZV9zaXplOworZXh0ZXJuIHU2NCBwY250eHRfbWFzazsKK2V4dGVybiBzdHJ1Y3QgeHNhdmVfc3RydWN0ICppbml0X3hzdGF0ZV9idWY7CisKK2V4dGVybiB2b2lkIHhzYXZlX2NudHh0X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB4c2F2ZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBpbml0X2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKK2V4dGVybiBpbnQgY2hlY2tfZm9yX3hzdGF0ZShzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0IF9fdXNlciAqYnVmLAorCQkJICAgIHZvaWQgX191c2VyICpmcHN0YXRlLAorCQkJICAgIHN0cnVjdCBfZnB4X3N3X2J5dGVzICpzdyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHhyc3Rvcl9jaGVja2luZyhzdHJ1Y3QgeHNhdmVfc3RydWN0ICpmeCkKK3sKKwlpbnQgZXJyOworCisJYXNtIHZvbGF0aWxlKCIxOiAuYnl0ZSAiIFJFWF9QUkVGSVggIjB4MGYsMHhhZSwweDJmXG5cdCIKKwkJICAgICAiMjpcbiIKKwkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkgICAgICIzOiAgbW92bCAkLTEsJVtlcnJdXG4iCisJCSAgICAgIiAgICBqbXAgIDJiXG4iCisJCSAgICAgIi5wcmV2aW91c1xuIgorCQkgICAgIF9BU01fRVhUQUJMRSgxYiwgM2IpCisJCSAgICAgOiBbZXJyXSAiPXIiIChlcnIpCisJCSAgICAgOiAiRCIgKGZ4KSwgIm0iICgqZngpLCAiYSIgKC0xKSwgImQiICgtMSksICIwIiAoMCkKKwkJICAgICA6ICJtZW1vcnkiKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhzYXZlX3VzZXIoc3RydWN0IHhzYXZlX3N0cnVjdCBfX3VzZXIgKmJ1ZikKK3sKKwlpbnQgZXJyOworCV9fYXNtX18gX192b2xhdGlsZV9fKCIxOiAuYnl0ZSAiIFJFWF9QUkVGSVggIjB4MGYsMHhhZSwweDI3XG4iCisJCQkgICAgICIyOlxuIgorCQkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkJICAgICAiMzogIG1vdmwgJC0xLCVbZXJyXVxuIgorCQkJICAgICAiICAgIGptcCAgMmJcbiIKKwkJCSAgICAgIi5wcmV2aW91c1xuIgorCQkJICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkJICAgICBfQVNNX0FMSUdOICJcbiIKKwkJCSAgICAgX0FTTV9QVFIgIjFiLDNiXG4iCisJCQkgICAgICIucHJldmlvdXMiCisJCQkgICAgIDogW2Vycl0gIj1yIiAoZXJyKQorCQkJICAgICA6ICJEIiAoYnVmKSwgImEiICgtMSksICJkIiAoLTEpLCAiMCIgKDApCisJCQkgICAgIDogIm1lbW9yeSIpOworCWlmICh1bmxpa2VseShlcnIpICYmIF9fY2xlYXJfdXNlcihidWYsIHhzdGF0ZV9zaXplKSkKKwkJZXJyID0gLUVGQVVMVDsKKwkvKiBObyBuZWVkIHRvIGNsZWFyIGhlcmUgYmVjYXVzZSB0aGUgY2FsbGVyIGNsZWFycyBVU0VEX01BVEggKi8KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCB4cmVzdG9yZV91c2VyKHN0cnVjdCB4c2F2ZV9zdHJ1Y3QgX191c2VyICpidWYsIHU2NCBtYXNrKQoreworCWludCBlcnI7CisJc3RydWN0IHhzYXZlX3N0cnVjdCAqeHN0YXRlID0gKChfX2ZvcmNlIHN0cnVjdCB4c2F2ZV9zdHJ1Y3QgKilidWYpOworCXUzMiBsbWFzayA9IG1hc2s7CisJdTMyIGhtYXNrID0gbWFzayA+PiAzMjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIxOiAuYnl0ZSAiIFJFWF9QUkVGSVggIjB4MGYsMHhhZSwweDJmXG4iCisJCQkgICAgICIyOlxuIgorCQkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkJICAgICAiMzogIG1vdmwgJC0xLCVbZXJyXVxuIgorCQkJICAgICAiICAgIGptcCAgMmJcbiIKKwkJCSAgICAgIi5wcmV2aW91c1xuIgorCQkJICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkJICAgICBfQVNNX0FMSUdOICJcbiIKKwkJCSAgICAgX0FTTV9QVFIgIjFiLDNiXG4iCisJCQkgICAgICIucHJldmlvdXMiCisJCQkgICAgIDogW2Vycl0gIj1yIiAoZXJyKQorCQkJICAgICA6ICJEIiAoeHN0YXRlKSwgImEiIChsbWFzayksICJkIiAoaG1hc2spLCAiMCIgKDApCisJCQkgICAgIDogIm1lbW9yeSIpOwkvKiBtZW1vcnkgcmVxdWlyZWQ/ICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhyc3Rvcl9zdGF0ZShzdHJ1Y3QgeHNhdmVfc3RydWN0ICpmeCwgdTY0IG1hc2spCit7CisJdTMyIGxtYXNrID0gbWFzazsKKwl1MzIgaG1hc2sgPSBtYXNrID4+IDMyOworCisJYXNtIHZvbGF0aWxlKCIuYnl0ZSAiIFJFWF9QUkVGSVggIjB4MGYsMHhhZSwweDJmXG5cdCIKKwkJICAgICA6IDogIkQiIChmeCksICJtIiAoKmZ4KSwgImEiIChsbWFzayksICJkIiAoaG1hc2spCisJCSAgICAgOiAgICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhzYXZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCS8qIFRoaXMsIGhvd2V2ZXIsIHdlIGNhbiB3b3JrIGFyb3VuZCBieSBmb3JjaW5nIHRoZSBjb21waWxlciB0byBzZWxlY3QKKwkgICBhbiBhZGRyZXNzaW5nIG1vZGUgdGhhdCBkb2Vzbid0IHJlcXVpcmUgZXh0ZW5kZWQgcmVnaXN0ZXJzLiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAiIFJFWF9QUkVGSVggIjB4MGYsMHhhZSwweDI3IgorCQkJICAgICA6IDogIkQiICgmKHRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUpKSwKKwkJCQkgImEiICgtMSksICJkIigtMSkgOiAibWVtb3J5Iik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hLm91dC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2Eub3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjEzNzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2Eub3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2Eub3V0LmgKLSAqCi0gKiBEdW1teSBhLm91dCBmaWxlLiBYdGVuc2EgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYS5vdXQgZm9ybWF0LCBidXQgdGhlIGtlcm5lbAotICogc2VlbXMgdG8gZGVwZW5kIG9uIGl0LgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfQV9PVVRfSAotI2RlZmluZSBfWFRFTlNBX0FfT1VUX0gKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87Ci0gIHVuc2lnbmVkIGFfdGV4dDsKLSAgdW5zaWduZWQgYV9kYXRhOwotICB1bnNpZ25lZCBhX2JzczsKLSAgdW5zaWduZWQgYV9zeW1zOwotICB1bnNpZ25lZCBhX2VudHJ5OwotICB1bnNpZ25lZCBhX3Ryc2l6ZTsKLSAgdW5zaWduZWQgYV9kcnNpemU7Ci19OwotCi0jZW5kaWYgLyogX1hURU5TQV9BX09VVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZWxmLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvZWxmLmgKaW5kZXggY2E2ZTUxMC4uYzNmNTNlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaApAQCAtMTg5LDcgKzE4OSw3IEBACiAjZW5kaWYKIH0gZWxmX3h0cmVnc190OwogCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWF8zMkJJVCkKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9pbnRlcm5hbC9ybmcuaCBiL2luY2x1ZGUvY3J5cHRvL2ludGVybmFsL3JuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Njk3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9pbnRlcm5hbC9ybmcuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogUk5HOiBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAgYWxnb3JpdGhtcyB1bmRlciB0aGUgY3J5cHRvIEFQSQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOZWlsIEhvcm1hbiA8bmhvcm1hbkB0dXhkcml2ZXIuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0NSWVBUT19JTlRFUk5BTF9STkdfSAorI2RlZmluZSBfQ1JZUFRPX0lOVEVSTkFMX1JOR19ICisKKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3JuZy5oPgorCitleHRlcm4gY29uc3Qgc3RydWN0IGNyeXB0b190eXBlIGNyeXB0b19ybmdfdHlwZTsKKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fcm5nX2N0eChzdHJ1Y3QgY3J5cHRvX3JuZyAqdGZtKQoreworCXJldHVybiBjcnlwdG9fdGZtX2N0eCgmdGZtLT5iYXNlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9pbnRlcm5hbC9za2NpcGhlci5oIGIvaW5jbHVkZS9jcnlwdG8vaW50ZXJuYWwvc2tjaXBoZXIuaAppbmRleCBjY2MzMmJhLi4yYmE0MmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NyeXB0by9pbnRlcm5hbC9za2NpcGhlci5oCisrKyBiL2luY2x1ZGUvY3J5cHRvL2ludGVybmFsL3NrY2lwaGVyLmgKQEAgLTE1LDcgKzE1LDYgQEAKIAogI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2tjaXBoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IHJ0YXR0cjsKQEAgLTY1LDExICs2NCw2IEBACiBpbnQgc2tjaXBoZXJfZ2VuaXZfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIHZvaWQgc2tjaXBoZXJfZ2VuaXZfZXhpdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIAotaW50IF9faW5pdCBlc2VxaXZfbW9kdWxlX2luaXQodm9pZCk7Ci12b2lkIF9fZXhpdCBlc2VxaXZfbW9kdWxlX2V4aXQodm9pZCk7Ci1pbnQgX19pbml0IGNoYWluaXZfbW9kdWxlX2luaXQodm9pZCk7Ci12b2lkIGNoYWluaXZfbW9kdWxlX2V4aXQodm9pZCk7Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpza2NpcGhlcl9nZW5pdl9jaXBoZXIoCiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpnZW5pdikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3JuZy5oIGIvaW5jbHVkZS9jcnlwdG8vcm5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzZjliOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY3J5cHRvL3JuZy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBSTkc6IFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yICBhbGdvcml0aG1zIHVuZGVyIHRoZSBjcnlwdG8gQVBJCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE5laWwgSG9ybWFuIDxuaG9ybWFuQHR1eGRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfQ1JZUFRPX1JOR19ICisjZGVmaW5lIF9DUllQVE9fUk5HX0gKKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCitleHRlcm4gc3RydWN0IGNyeXB0b19ybmcgKmNyeXB0b19kZWZhdWx0X3JuZzsKKworaW50IGNyeXB0b19nZXRfZGVmYXVsdF9ybmcodm9pZCk7Cit2b2lkIGNyeXB0b19wdXRfZGVmYXVsdF9ybmcodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19ybmcgKl9fY3J5cHRvX3JuZ19jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX3JuZyAqKXRmbTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3JuZyAqY3J5cHRvX2FsbG9jX3JuZyhjb25zdCBjaGFyICphbGdfbmFtZSwKKwkJCQkJCSAgdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOworCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX1JORzsKKwltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9NQVNLOworCisJcmV0dXJuIF9fY3J5cHRvX3JuZ19jYXN0KGNyeXB0b19hbGxvY19iYXNlKGFsZ19uYW1lLCB0eXBlLCBtYXNrKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19ybmdfdGZtKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0pCit7CisJcmV0dXJuICZ0Zm0tPmJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJuZ19hbGcgKmNyeXB0b19ybmdfYWxnKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0pCit7CisJcmV0dXJuICZjcnlwdG9fcm5nX3RmbSh0Zm0pLT5fX2NydF9hbGctPmNyYV9ybmc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJuZ190Zm0gKmNyeXB0b19ybmdfY3J0KHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0pCit7CisJcmV0dXJuICZjcnlwdG9fcm5nX3RmbSh0Zm0pLT5jcnRfcm5nOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfcm5nKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0pCit7CisJY3J5cHRvX2ZyZWVfdGZtKGNyeXB0b19ybmdfdGZtKHRmbSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fcm5nX2dldF9ieXRlcyhzdHJ1Y3QgY3J5cHRvX3JuZyAqdGZtLAorCQkJCSAgICAgICB1OCAqcmRhdGEsIHVuc2lnbmVkIGludCBkbGVuKQoreworCXJldHVybiBjcnlwdG9fcm5nX2NydCh0Zm0pLT5ybmdfZ2VuX3JhbmRvbSh0Zm0sIHJkYXRhLCBkbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX3JuZ19yZXNldChzdHJ1Y3QgY3J5cHRvX3JuZyAqdGZtLAorCQkJCSAgIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbikKK3sKKwlyZXR1cm4gY3J5cHRvX3JuZ19jcnQodGZtKS0+cm5nX3Jlc2V0KHRmbSwgc2VlZCwgc2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ybmdfc2VlZHNpemUoc3RydWN0IGNyeXB0b19ybmcgKnRmbSkKK3sKKwlyZXR1cm4gY3J5cHRvX3JuZ19hbGcodGZtKS0+c2VlZHNpemU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCBiNjhlYzA5Li5iZjlhY2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMTA3LDYgKzEwNyw3IEBACiBoZWFkZXIteSArPSBsaW1pdHMuaAogaGVhZGVyLXkgKz0gbWFnaWMuaAogaGVhZGVyLXkgKz0gbWFqb3IuaAoraGVhZGVyLXkgKz0gbWFwX3RvXzdzZWdtZW50LmgKIGhlYWRlci15ICs9IG1hdHJveGZiLmgKIGhlYWRlci15ICs9IG1leWUuaAogaGVhZGVyLXkgKz0gbWluaXhfZnMuaApAQCAtMTI2LDYgKzEyNyw3IEBACiBoZWFkZXIteSArPSBwZmtleXYyLmgKIGhlYWRlci15ICs9IHBnLmgKIGhlYWRlci15ICs9IHBoYW50b20uaAoraGVhZGVyLXkgKz0gcGhvbmV0LmgKIGhlYWRlci15ICs9IHBrdF9jbHMuaAogaGVhZGVyLXkgKz0gcGt0X3NjaGVkLmgKIGhlYWRlci15ICs9IHBvc2l4X3R5cGVzLmgKQEAgLTE4MCw2ICsxODIsNyBAQAogdW5pZmRlZi15ICs9IGF1dG9fZnMuaAogdW5pZmRlZi15ICs9IGF1eHZlYy5oCiB1bmlmZGVmLXkgKz0gYmluZm10cy5oCit1bmlmZGVmLXkgKz0gYmxrdHJhY2VfYXBpLmgKIHVuaWZkZWYteSArPSBjYXBhYmlsaXR5LmgKIHVuaWZkZWYteSArPSBjYXBpLmgKIHVuaWZkZWYteSArPSBjY2lzc19pb2N0bC5oCkBAIC0yMzIsNiArMjM1LDcgQEAKIHVuaWZkZWYteSArPSBpZl9mcmFkLmgKIHVuaWZkZWYteSArPSBpZl9sdGFsay5oCiB1bmlmZGVmLXkgKz0gaWZfbGluay5oCit1bmlmZGVmLXkgKz0gaWZfcGhvbmV0LmgKIHVuaWZkZWYteSArPSBpZl9wcHBvbDJ0cC5oCiB1bmlmZGVmLXkgKz0gaWZfcHBwb3guaAogdW5pZmRlZi15ICs9IGlmX3RyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWlvLmggYi9pbmNsdWRlL2xpbnV4L2Fpby5oCmluZGV4IDA5YjI3NmMuLmY2YjhjZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9haW8uaApAQCAtMjA0LDEyICsyMDQsMjEgQEAKIC8qIHByb3RvdHlwZXMgKi8KIGV4dGVybiB1bnNpZ25lZCBhaW9fbWF4X3NpemU7CiAKKyNpZmRlZiBDT05GSUdfQUlPCiBleHRlcm4gc3NpemVfdCB3YWl0X29uX3N5bmNfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKTsKIGV4dGVybiBpbnQgYWlvX3B1dF9yZXEoc3RydWN0IGtpb2NiICppb2NiKTsKIGV4dGVybiB2b2lkIGtpY2tfaW9jYihzdHJ1Y3Qga2lvY2IgKmlvY2IpOwogZXh0ZXJuIGludCBhaW9fY29tcGxldGUoc3RydWN0IGtpb2NiICppb2NiLCBsb25nIHJlcywgbG9uZyByZXMyKTsKIHN0cnVjdCBtbV9zdHJ1Y3Q7CiBleHRlcm4gdm9pZCBleGl0X2FpbyhzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzc2l6ZV90IHdhaXRfb25fc3luY19raW9jYihzdHJ1Y3Qga2lvY2IgKmlvY2IpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGFpb19wdXRfcmVxKHN0cnVjdCBraW9jYiAqaW9jYikgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGtpY2tfaW9jYihzdHJ1Y3Qga2lvY2IgKmlvY2IpIHsgfQorc3RhdGljIGlubGluZSBpbnQgYWlvX2NvbXBsZXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgbG9uZyByZXMsIGxvbmcgcmVzMikgeyByZXR1cm4gMDsgfQorc3RydWN0IG1tX3N0cnVjdDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBleGl0X2FpbyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkgeyB9CisjZW5kaWYgLyogQ09ORklHX0FJTyAqLwogCiAjZGVmaW5lIGlvX3dhaXRfdG9fa2lvY2Iod2FpdCkgY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCBraW9jYiwga2lfd2FpdCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdGEuaCBiL2luY2x1ZGUvbGludXgvYXRhLmgKaW5kZXggMWNlMTljMS4uYTUzMzE4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0YS5oCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIF9fTElOVVhfQVRBX0hfXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qIGRlZmluZXMgb25seSBmb3IgdGhlIGNvbnN0YW50cyB3aGljaCBkb24ndCB3b3JrIHdlbGwgYXMgZW51bXMgKi8KICNkZWZpbmUgQVRBX0RNQV9CT1VOREFSWQkweGZmZmZVTApAQCAtODgsNiArODksNyBAQAogCUFUQV9JRF9ETEYJCT0gMTI4LAogCUFUQV9JRF9DU0ZPCQk9IDEyOSwKIAlBVEFfSURfQ0ZBX1BPV0VSCT0gMTYwLAorCUFUQV9JRF9ST1RfU1BFRUQJPSAyMTcsCiAJQVRBX0lEX1BJTzQJCT0gKDEgPDwgMSksCiAKIAlBVEFfSURfU0VSTk9fTEVOCT0gMjAsCkBAIC01NTcsNiArNTU5LDE1IEBACiAJcmV0dXJuIGlkW0FUQV9JRF9DT01NQU5EX1NFVF8yXSAmICgxIDw8IDEyKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXRhX2lkX2ZsdXNoX2VuYWJsZWQoY29uc3QgdTE2ICppZCkKK3sKKwlpZiAoYXRhX2lkX2hhc19mbHVzaChpZCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChpZFtBVEFfSURfQ1NGX0RFRkFVTFRdICYgMHhDMDAwKSAhPSAweDQwMDApCisJCXJldHVybiAwOworCXJldHVybiBpZFtBVEFfSURfQ0ZTX0VOQUJMRV8yXSAmICgxIDw8IDEyKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXRhX2lkX2hhc19mbHVzaF9leHQoY29uc3QgdTE2ICppZCkKIHsKIAlpZiAoKGlkW0FUQV9JRF9DT01NQU5EX1NFVF8yXSAmIDB4QzAwMCkgIT0gMHg0MDAwKQpAQCAtNTY0LDYgKzU3NSwxOSBAQAogCXJldHVybiBpZFtBVEFfSURfQ09NTUFORF9TRVRfMl0gJiAoMSA8PCAxMyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9mbHVzaF9leHRfZW5hYmxlZChjb25zdCB1MTYgKmlkKQoreworCWlmIChhdGFfaWRfaGFzX2ZsdXNoX2V4dChpZCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChpZFtBVEFfSURfQ1NGX0RFRkFVTFRdICYgMHhDMDAwKSAhPSAweDQwMDApCisJCXJldHVybiAwOworCS8qCisJICogc29tZSBNYXh0b3IgZGlza3MgaGF2ZSBiaXQgMTMgZGVmaW5lZCBpbmNvcnJlY3RseQorCSAqIHNvIGNoZWNrIGJpdCAxMCB0b28KKwkgKi8KKwlyZXR1cm4gKGlkW0FUQV9JRF9DRlNfRU5BQkxFXzJdICYgMHgyNDAwKSA9PSAweDI0MDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9oYXNfbGJhNDgoY29uc3QgdTE2ICppZCkKIHsKIAlpZiAoKGlkW0FUQV9JRF9DT01NQU5EX1NFVF8yXSAmIDB4QzAwMCkgIT0gMHg0MDAwKQpAQCAtNTczLDYgKzU5NywxNSBAQAogCXJldHVybiBpZFtBVEFfSURfQ09NTUFORF9TRVRfMl0gJiAoMSA8PCAxMCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9sYmE0OF9lbmFibGVkKGNvbnN0IHUxNiAqaWQpCit7CisJaWYgKGF0YV9pZF9oYXNfbGJhNDgoaWQpID09IDApCisJCXJldHVybiAwOworCWlmICgoaWRbQVRBX0lEX0NTRl9ERUZBVUxUXSAmIDB4QzAwMCkgIT0gMHg0MDAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaWRbQVRBX0lEX0NGU19FTkFCTEVfMl0gJiAoMSA8PCAxMCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9ocGFfZW5hYmxlZChjb25zdCB1MTYgKmlkKQogewogCS8qIFllcyBjaGlsZHJlbiwgd29yZCA4MyB2YWxpZCBiaXRzIGNvdmVyIHdvcmQgODIgZGF0YSAqLwpAQCAtNjQ0LDcgKzY3NywxNSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhdGFfaWRfaXNfc2F0YShjb25zdCB1MTYgKmlkKQogewotCXJldHVybiBhdGFfaWRfbWFqb3JfdmVyc2lvbihpZCkgPj0gNSAmJiBpZFtBVEFfSURfSFdfQ09ORklHXSA9PSAwOworCS8qCisJICogU2VlIGlmIHdvcmQgOTMgaXMgMCBBTkQgZHJpdmUgaXMgYXQgbGVhc3QgQVRBLTUgY29tcGF0aWJsZQorCSAqIHZlcmlmeWluZyB0aGF0IHdvcmQgODAgYnkgY2FzdGluZyBpdCB0byBhIHNpZ25lZCB0eXBlIC0tCisJICogdGhpcyB0cmljayBhbGxvd3MgdXMgdG8gZmlsdGVyIG91dCB0aGUgcmVzZXJ2ZWQgdmFsdWVzIG9mCisJICogMHgwMDAwIGFuZCAweGZmZmYgYWxvbmcgd2l0aCB0aGUgZWFybGllciBBVEEgcmV2aXNpb25zLi4uCisJICovCisJaWYgKGlkW0FUQV9JRF9IV19DT05GSUddID09IDAgJiYgKHNob3J0KWlkW0FUQV9JRF9NQUpPUl9WRVJdID49IDB4MDAyMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9oYXNfdHBtKGNvbnN0IHUxNiAqaWQpCkBAIC02NjcsNiArNzA4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9oYXNfdW5sb2FkKGNvbnN0IHUxNiAqaWQpCit7CisJaWYgKGF0YV9pZF9tYWpvcl92ZXJzaW9uKGlkKSA+PSA3ICYmCisJICAgIChpZFtBVEFfSURfQ0ZTU0VdICYgMHhDMDAwKSA9PSAweDQwMDAgJiYKKwkgICAgaWRbQVRBX0lEX0NGU1NFXSAmICgxIDw8IDEzKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9jdXJyZW50X2Noc192YWxpZChjb25zdCB1MTYgKmlkKQogewogCS8qIEZvciBBVEEtMSBkZXZpY2VzLCBpZiB0aGUgSU5JVElBTElaRSBERVZJQ0UgUEFSQU1FVEVSUyBjb21tYW5kCkBAIC02OTEsNiArNzQxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9pZF9pc19zc2QoY29uc3QgdTE2ICppZCkKK3sKKwlyZXR1cm4gaWRbQVRBX0lEX1JPVF9TUEVFRF0gPT0gMHgwMTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXRhX2RyaXZlXzQwd2lyZShjb25zdCB1MTYgKmRldl9pZCkKIHsKIAlpZiAoYXRhX2lkX2lzX3NhdGEoZGV2X2lkKSkKQEAgLTcyNyw2ICs3ODIsNzYgQEAKIAlyZXR1cm4gYXRhX2lkX21ham9yX3ZlcnNpb24oZGV2X2lkKSA+PSA3ICYmIChkZXZfaWRbNjJdICYgMHg4MDAwKTsKIH0KIAorLyoKKyAqIGF0YV9pZF9pc19sYmFfY2FwYWNpdHlfb2soKSBwZXJmb3JtcyBhIHNhbml0eSBjaGVjayBvbgorICogdGhlIGNsYWltZWQgTEJBIGNhcGFjaXR5IHZhbHVlIGZvciB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnMgMSBpZiBMQkEgY2FwYWNpdHkgbG9va3Mgc2Vuc2libGUsIDAgb3RoZXJ3aXNlLgorICoKKyAqIEl0IGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggZGV2aWNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBhdGFfaWRfaXNfbGJhX2NhcGFjaXR5X29rKHUxNiAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBsYmFfc2VjdHMsIGNoc19zZWN0cywgaGVhZCwgdGFpbDsKKworCS8qIE5vIG5vbi1MQkEgaW5mbyAuLiBzbyB2YWxpZCEgKi8KKwlpZiAoaWRbQVRBX0lEX0NZTFNdID09IDApCisJCXJldHVybiAxOworCisJbGJhX3NlY3RzID0gYXRhX2lkX3UzMihpZCwgQVRBX0lEX0xCQV9DQVBBQ0lUWSk7CisKKwkvKgorCSAqIFRoZSBBVEEgc3BlYyB0ZWxscyBsYXJnZSBkcml2ZXMgdG8gcmV0dXJuCisJICogQy9IL1MgPSAxNjM4My8xNi82MyBpbmRlcGVuZGVudCBvZiB0aGVpciBzaXplLgorCSAqIFNvbWUgZHJpdmVzIGNhbiBiZSBqdW1wZXJlZCB0byB1c2UgMTUgaGVhZHMgaW5zdGVhZCBvZiAxNi4KKwkgKiBTb21lIGRyaXZlcyBjYW4gYmUganVtcGVyZWQgdG8gdXNlIDQwOTIgY3lscyBpbnN0ZWFkIG9mIDE2MzgzLgorCSAqLworCWlmICgoaWRbQVRBX0lEX0NZTFNdID09IDE2MzgzIHx8CisJICAgICAoaWRbQVRBX0lEX0NZTFNdID09IDQwOTIgJiYgaWRbQVRBX0lEX0NVUl9DWUxTXSA9PSAxNjM4MykpICYmCisJICAgIGlkW0FUQV9JRF9TRUNUT1JTXSA9PSA2MyAmJgorCSAgICAoaWRbQVRBX0lEX0hFQURTXSA9PSAxNSB8fCBpZFtBVEFfSURfSEVBRFNdID09IDE2KSAmJgorCSAgICAobGJhX3NlY3RzID49IDE2MzgzICogNjMgKiBpZFtBVEFfSURfSEVBRFNdKSkKKwkJcmV0dXJuIDE7CisKKwljaHNfc2VjdHMgPSBpZFtBVEFfSURfQ1lMU10gKiBpZFtBVEFfSURfSEVBRFNdICogaWRbQVRBX0lEX1NFQ1RPUlNdOworCisJLyogcGVyZm9ybSBhIHJvdWdoIHNhbml0eSBjaGVjayBvbiBsYmFfc2VjdHM6IHdpdGhpbiAxMCUgaXMgT0sgKi8KKwlpZiAobGJhX3NlY3RzIC0gY2hzX3NlY3RzIDwgY2hzX3NlY3RzLzEwKQorCQlyZXR1cm4gMTsKKworCS8qIHNvbWUgZHJpdmVzIGhhdmUgdGhlIHdvcmQgb3JkZXIgcmV2ZXJzZWQgKi8KKwloZWFkID0gKGxiYV9zZWN0cyA+PiAxNikgJiAweGZmZmY7CisJdGFpbCA9IGxiYV9zZWN0cyAmIDB4ZmZmZjsKKwlsYmFfc2VjdHMgPSBoZWFkIHwgKHRhaWwgPDwgMTYpOworCisJaWYgKGxiYV9zZWN0cyAtIGNoc19zZWN0cyA8IGNoc19zZWN0cy8xMCkgeworCQkqKF9fbGUzMiAqKSZpZFtBVEFfSURfTEJBX0NBUEFDSVRZXSA9IF9fY3B1X3RvX2xlMzIobGJhX3NlY3RzKTsKKwkJcmV0dXJuIDE7CS8qIExCQSBjYXBhY2l0eSBpcyAobm93KSBnb29kICovCisJfQorCisJcmV0dXJuIDA7CS8qIExCQSBjYXBhY2l0eSB2YWx1ZSBtYXkgYmUgYmFkICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfaWRfdG9faGRfZHJpdmVpZCh1MTYgKmlkKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIGFjY2Vzc2VkIGluIHN0cnVjdCBoZF9kcml2ZWlkIGFzIDgtYml0IHZhbHVlcyAqLworCWlkW0FUQV9JRF9NQVhfTVVMVFNFQ1RdCSA9IF9fY3B1X3RvX2xlMTYoaWRbQVRBX0lEX01BWF9NVUxUU0VDVF0pOworCWlkW0FUQV9JRF9DQVBBQklMSVRZXQkgPSBfX2NwdV90b19sZTE2KGlkW0FUQV9JRF9DQVBBQklMSVRZXSk7CisJaWRbQVRBX0lEX09MRF9QSU9fTU9ERVNdID0gX19jcHVfdG9fbGUxNihpZFtBVEFfSURfT0xEX1BJT19NT0RFU10pOworCWlkW0FUQV9JRF9PTERfRE1BX01PREVTXSA9IF9fY3B1X3RvX2xlMTYoaWRbQVRBX0lEX09MRF9ETUFfTU9ERVNdKTsKKwlpZFtBVEFfSURfTVVMVFNFQ1RdCSA9IF9fY3B1X3RvX2xlMTYoaWRbQVRBX0lEX01VTFRTRUNUXSk7CisKKwkvKiBhcyAzMi1iaXQgdmFsdWVzICovCisJKih1MzIgKikmaWRbQVRBX0lEX0xCQV9DQVBBQ0lUWV0gPSBhdGFfaWRfdTMyKGlkLCBBVEFfSURfTEJBX0NBUEFDSVRZKTsKKwkqKHUzMiAqKSZpZFtBVEFfSURfU1BHXQkJID0gYXRhX2lkX3UzMihpZCwgQVRBX0lEX1NQRyk7CisKKwkvKiBhcyA2NC1iaXQgdmFsdWUgKi8KKwkqKHU2NCAqKSZpZFtBVEFfSURfTEJBX0NBUEFDSVRZXzJdID0KKwkJYXRhX2lkX3U2NChpZCwgQVRBX0lEX0xCQV9DQVBBQ0lUWV8yKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19tdWx0aV90YXNrZmlsZShzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKIHsKIAlyZXR1cm4gKHRmLT5jb21tYW5kID09IEFUQV9DTURfUkVBRF9NVUxUSSkgfHwKQEAgLTc0NSw3ICs4NzAsNyBAQAogc3RhdGljIGlubGluZSBpbnQgbGJhXzI4X29rKHU2NCBibG9jaywgdTMyIG5fYmxvY2spCiB7CiAJLyogY2hlY2sgdGhlIGVuZGluZyBibG9jayBudW1iZXIgKi8KLQlyZXR1cm4gKChibG9jayArIG5fYmxvY2sgLSAxKSA8ICgodTY0KTEgPDwgMjgpKSAmJiAobl9ibG9jayA8PSAyNTYpOworCXJldHVybiAoKGJsb2NrICsgbl9ibG9jaykgPCAoKHU2NCkxIDw8IDI4KSkgJiYgKG5fYmxvY2sgPD0gMjU2KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbGJhXzQ4X29rKHU2NCBibG9jaywgdTMyIG5fYmxvY2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkMDVjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4IElhbiBLZW50IDxyYXZlbkB0aGVtYXcubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKKyNkZWZpbmUgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQVVUT0ZTX0RFVklDRV9OQU1FCQkiYXV0b2ZzIgorCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NQUpPUgkxCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NSU5PUgkwCisKKyNkZWZpbmUgQVVUT0ZTX0RFVklEX0xFTgkJMTYKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX1NJWkUJCXNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworLyoKKyAqIEFuIGlvY3RsIGludGVyZmFjZSBmb3IgYXV0b2ZzIG1vdW50IHBvaW50IGNvbnRyb2wuCisgKi8KKworLyoKKyAqIEFsbCB0aGUgaW9jdGxzIHVzZSB0aGlzIHN0cnVjdHVyZS4KKyAqIFdoZW4gc2VuZGluZyBhIHBhdGggc2l6ZSBtdXN0IGFjY291bnQgZm9yIHRoZSB0b3RhbCBsZW5ndGgKKyAqIG9mIHRoZSBjaHVuayBvZiBtZW1vcnkgb3RoZXJ3aXNlIGlzIGlzIHRoZSBzaXplIG9mIHRoZQorICogc3RydWN0dXJlLgorICovCisKK3N0cnVjdCBhdXRvZnNfZGV2X2lvY3RsIHsKKwlfX3UzMiB2ZXJfbWFqb3I7CisJX191MzIgdmVyX21pbm9yOworCV9fdTMyIHNpemU7CQkvKiB0b3RhbCBzaXplIG9mIGRhdGEgcGFzc2VkIGluCisJCQkJICogaW5jbHVkaW5nIHRoaXMgc3RydWN0ICovCisJX19zMzIgaW9jdGxmZDsJCS8qIGF1dG9tb3VudCBjb21tYW5kIGZkICovCisKKwlfX3UzMiBhcmcxOwkJLyogQ29tbWFuZCBwYXJhbWV0ZXJzICovCisJX191MzIgYXJnMjsKKworCWNoYXIgcGF0aFswXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2F1dG9mc19kZXZfaW9jdGwoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKmluKQoreworCWluLT52ZXJfbWFqb3IgPSBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUFKT1I7CisJaW4tPnZlcl9taW5vciA9IEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NSU5PUjsKKwlpbi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCk7CisJaW4tPmlvY3RsZmQgPSAtMTsKKwlpbi0+YXJnMSA9IDA7CisJaW4tPmFyZzIgPSAwOworCXJldHVybjsKK30KKworLyoKKyAqIElmIHlvdSBjaGFuZ2UgdGhpcyBtYWtlIHN1cmUgeW91IG1ha2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlCisgKiB0byBhdXRvZnMtZGV2LWlvY3RsLmM6bG9va3VwX2lvY3RsKCkKKyAqLworZW51bSB7CisJLyogR2V0IHZhcmlvdXMgdmVyc2lvbiBpbmZvICovCisJQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX0NNRCA9IDB4NzEsCisJQVVUT0ZTX0RFVl9JT0NUTF9QUk9UT1ZFUl9DTUQsCisJQVVUT0ZTX0RFVl9JT0NUTF9QUk9UT1NVQlZFUl9DTUQsCisKKwkvKiBPcGVuIG1vdW50IGlvY3RsIGZkICovCisJQVVUT0ZTX0RFVl9JT0NUTF9PUEVOTU9VTlRfQ01ELAorCisJLyogQ2xvc2UgbW91bnQgaW9jdGwgZmQgKi8KKwlBVVRPRlNfREVWX0lPQ1RMX0NMT1NFTU9VTlRfQ01ELAorCisJLyogTW91bnQvZXhwaXJlIHN0YXR1cyByZXR1cm5zICovCisJQVVUT0ZTX0RFVl9JT0NUTF9SRUFEWV9DTUQsCisJQVVUT0ZTX0RFVl9JT0NUTF9GQUlMX0NNRCwKKworCS8qIEFjdGl2YXRlL2RlYWN0aXZhdGUgYXV0b2ZzIG1vdW50ICovCisJQVVUT0ZTX0RFVl9JT0NUTF9TRVRQSVBFRkRfQ01ELAorCUFVVE9GU19ERVZfSU9DVExfQ0FUQVRPTklDX0NNRCwKKworCS8qIEV4cGlyeSB0aW1lb3V0ICovCisJQVVUT0ZTX0RFVl9JT0NUTF9USU1FT1VUX0NNRCwKKworCS8qIEdldCBtb3VudCBsYXN0IHJlcXVlc3RpbmcgdWlkIGFuZCBnaWQgKi8KKwlBVVRPRlNfREVWX0lPQ1RMX1JFUVVFU1RFUl9DTUQsCisKKwkvKiBDaGVjayBmb3IgZWxpZ2libGUgZXhwaXJlIGNhbmRpZGF0ZXMgKi8KKwlBVVRPRlNfREVWX0lPQ1RMX0VYUElSRV9DTUQsCisKKwkvKiBSZXF1ZXN0IGJ1c3kgc3RhdHVzICovCisJQVVUT0ZTX0RFVl9JT0NUTF9BU0tVTU9VTlRfQ01ELAorCisJLyogQ2hlY2sgaWYgcGF0aCBpcyBhIG1vdW50cG9pbnQgKi8KKwlBVVRPRlNfREVWX0lPQ1RMX0lTTU9VTlRQT0lOVF9DTUQsCit9OworCisjZGVmaW5lIEFVVE9GU19JT0NUTCAweDkzCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OIFwKKwlfSU9XUihBVVRPRlNfSU9DVEwsIFwKKwkgICAgICBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX1BST1RPVkVSIFwKKwlfSU9XUihBVVRPRlNfSU9DVEwsIFwKKwkgICAgICBBVVRPRlNfREVWX0lPQ1RMX1BST1RPVkVSX0NNRCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9QUk9UT1NVQlZFUiBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9QUk9UT1NVQlZFUl9DTUQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKQorCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfT1BFTk1PVU5UIFwKKwlfSU9XUihBVVRPRlNfSU9DVEwsIFwKKwkgICAgICBBVVRPRlNfREVWX0lPQ1RMX09QRU5NT1VOVF9DTUQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKQorCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfQ0xPU0VNT1VOVCBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9DTE9TRU1PVU5UX0NNRCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9SRUFEWSBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9SRUFEWV9DTUQsIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsKQorCisjZGVmaW5lIEFVVE9GU19ERVZfSU9DVExfRkFJTCBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9GQUlMX0NNRCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9TRVRQSVBFRkQgXAorCV9JT1dSKEFVVE9GU19JT0NUTCwgXAorCSAgICAgIEFVVE9GU19ERVZfSU9DVExfU0VUUElQRUZEX0NNRCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9DQVRBVE9OSUMgXAorCV9JT1dSKEFVVE9GU19JT0NUTCwgXAorCSAgICAgIEFVVE9GU19ERVZfSU9DVExfQ0FUQVRPTklDX0NNRCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpCisKKyNkZWZpbmUgQVVUT0ZTX0RFVl9JT0NUTF9USU1FT1VUIFwKKwlfSU9XUihBVVRPRlNfSU9DVEwsIFwKKwkgICAgICBBVVRPRlNfREVWX0lPQ1RMX1RJTUVPVVRfQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX1JFUVVFU1RFUiBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9SRVFVRVNURVJfQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0VYUElSRSBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9FWFBJUkVfQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0FTS1VNT1VOVCBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9BU0tVTU9VTlRfQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0lTTU9VTlRQT0lOVCBcCisJX0lPV1IoQVVUT0ZTX0lPQ1RMLCBcCisJICAgICAgQVVUT0ZTX0RFVl9JT0NUTF9JU01PVU5UUE9JTlRfQ01ELCBzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkKKworI2VuZGlmCS8qIF9MSU5VWF9BVVRPX0RFVl9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmggYi9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKaW5kZXggYjc4NWM2Zi4uMjI1MzcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXV0b19mczQuaApAQCAtMjMsMTIgKzIzLDE3IEBACiAjZGVmaW5lIEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTgkzCiAjZGVmaW5lIEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTgk1CiAKLSNkZWZpbmUgQVVUT0ZTX1BST1RPX1NVQlZFUlNJT04JCTAKKyNkZWZpbmUgQVVUT0ZTX1BST1RPX1NVQlZFUlNJT04JCTEKIAogLyogTWFzayBmb3IgZXhwaXJlIGJlaGF2aW91ciAqLwogI2RlZmluZSBBVVRPRlNfRVhQX0lNTUVESUFURQkJMQogI2RlZmluZSBBVVRPRlNfRVhQX0xFQVZFUwkJMgogCisjZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTB4MDAwMAorI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMHgwMDAxCisjZGVmaW5lIEFVVE9GU19UWVBFX0RJUkVDVAkJMHgwMDAyCisjZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJMHgwMDA0CisKIC8qIERhZW1vbiBub3RpZmljYXRpb24gcGFja2V0IHR5cGVzICovCiBlbnVtIGF1dG9mc19ub3RpZnkgewogCU5GWV9OT05FLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaAppbmRleCA4MjZmNjIzLi43Mzk0YjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaApAQCAtMzYsNiArMzYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHA7IC8qIGN1cnJlbnQgdG9wIG9mIG1lbSAqLwogCXVuc2lnbmVkIGludCBzaF9iYW5nOjEsCiAJCSAgICAgbWlzY19iYW5nOjE7CisjaWZkZWYgX19hbHBoYV9fCisJdW5zaWduZWQgaW50IHRhc286MTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCByZWN1cnNpb25fZGVwdGg7CiAJc3RydWN0IGZpbGUgKiBmaWxlOwogCWludCBlX3VpZCwgZV9naWQ7CiAJa2VybmVsX2NhcF90IGNhcF9wb3N0X2V4ZWNfcGVybWl0dGVkOwpAQCAtNTgsNiArNjIsNyBAQAogI2RlZmluZSBCSU5QUk1fRkxBR1NfRVhFQ0ZEX0JJVCAxCiAjZGVmaW5lIEJJTlBSTV9GTEFHU19FWEVDRkQgKDEgPDwgQklOUFJNX0ZMQUdTX0VYRUNGRF9CSVQpCiAKKyNkZWZpbmUgQklOUFJNX01BWF9SRUNVUlNJT04gNAogCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgdG8gbG9hZCB0aGUgYmluYXJ5IGZvcm1hdHMgdGhhdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggMDkzM2ExNC4uZmY1YjRjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC0yNiwyMSArMjYsOCBAQAogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiAKLS8qIFBsYXRmb3JtcyBtYXkgc2V0IHRoaXMgdG8gdGVhY2ggdGhlIEJJTyBsYXllciBhYm91dCBJT01NVSBoYXJkd2FyZS4gKi8KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2lmIGRlZmluZWQoQklPX1ZNRVJHRV9NQVhfU0laRSkgJiYgZGVmaW5lZChCSU9fVk1FUkdFX0JPVU5EQVJZKQotI2RlZmluZSBCSU9WRUNfVklSVF9TVEFSVF9TSVpFKHgpIChidmVjX3RvX3BoeXMoeCkgJiAoQklPX1ZNRVJHRV9CT1VOREFSWSAtIDEpKQotI2RlZmluZSBCSU9WRUNfVklSVF9PVkVSU0laRSh4KQkoKHgpID4gQklPX1ZNRVJHRV9NQVhfU0laRSkKLSNlbHNlCi0jZGVmaW5lIEJJT1ZFQ19WSVJUX1NUQVJUX1NJWkUoeCkJMAotI2RlZmluZSBCSU9WRUNfVklSVF9PVkVSU0laRSh4KQkJMAotI2VuZGlmCi0KLSNpZm5kZWYgQklPX1ZNRVJHRV9CT1VOREFSWQotI2RlZmluZSBCSU9fVk1FUkdFX0JPVU5EQVJZCTAKLSNlbmRpZgotCiAjZGVmaW5lIEJJT19ERUJVRwogCiAjaWZkZWYgQklPX0RFQlVHCkBAIC04OCwyNSArNzUsMTQgQEAKIAkvKiBOdW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhpcyBCSU8gYWZ0ZXIKIAkgKiBwaHlzaWNhbCBhZGRyZXNzIGNvYWxlc2NpbmcgaXMgcGVyZm9ybWVkLgogCSAqLwotCXVuc2lnbmVkIHNob3J0CQliaV9waHlzX3NlZ21lbnRzOwotCi0JLyogTnVtYmVyIG9mIHNlZ21lbnRzIGFmdGVyIHBoeXNpY2FsIGFuZCBETUEgcmVtYXBwaW5nCi0JICogaGFyZHdhcmUgY29hbGVzY2luZyBpcyBwZXJmb3JtZWQuCi0JICovCi0JdW5zaWduZWQgc2hvcnQJCWJpX2h3X3NlZ21lbnRzOworCXVuc2lnbmVkIGludAkJYmlfcGh5c19zZWdtZW50czsKIAogCXVuc2lnbmVkIGludAkJYmlfc2l6ZTsJLyogcmVzaWR1YWwgSS9PIGNvdW50ICovCiAKLQkvKgotCSAqIFRvIGtlZXAgdHJhY2sgb2YgdGhlIG1heCBodyBzaXplLCB3ZSBhY2NvdW50IGZvciB0aGUKLQkgKiBzaXplcyBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgdmlydHVhbGx5IG1lcmdlYWJsZSBzZWdtZW50cwotCSAqIGluIHRoaXMgYmlvCi0JICovCi0JdW5zaWduZWQgaW50CQliaV9od19mcm9udF9zaXplOwotCXVuc2lnbmVkIGludAkJYmlfaHdfYmFja19zaXplOwotCiAJdW5zaWduZWQgaW50CQliaV9tYXhfdmVjczsJLyogbWF4IGJ2bF92ZWNzIHdlIGNhbiBob2xkICovCiAKKwl1bnNpZ25lZCBpbnQJCWJpX2NvbXBfY3B1OwkvKiBjb21wbGV0aW9uIENQVSAqLworCiAJc3RydWN0IGJpb192ZWMJCSpiaV9pb192ZWM7CS8qIHRoZSBhY3R1YWwgdmVjIGxpc3QgKi8KIAogCWJpb19lbmRfaW9fdAkJKmJpX2VuZF9pbzsKQEAgLTEyNiwxMSArMTAyLDE0IEBACiAjZGVmaW5lIEJJT19VUFRPREFURQkwCS8qIG9rIGFmdGVyIEkvTyBjb21wbGV0aW9uICovCiAjZGVmaW5lIEJJT19SV19CTE9DSwkxCS8qIFJXX0FIRUFEIHNldCwgYW5kIHJlYWQvd3JpdGUgd291bGQgYmxvY2sgKi8KICNkZWZpbmUgQklPX0VPRgkJMgkvKiBvdXQtb3V0LWJvdW5kcyBlcnJvciAqLwotI2RlZmluZSBCSU9fU0VHX1ZBTElECTMJLyogbnJfaHdfc2VnIHZhbGlkICovCisjZGVmaW5lIEJJT19TRUdfVkFMSUQJMwkvKiBiaV9waHlzX3NlZ21lbnRzIHZhbGlkICovCiAjZGVmaW5lIEJJT19DTE9ORUQJNAkvKiBkb2Vzbid0IG93biBkYXRhICovCiAjZGVmaW5lIEJJT19CT1VOQ0VECTUJLyogYmlvIGlzIGEgYm91bmNlIGJpbyAqLwogI2RlZmluZSBCSU9fVVNFUl9NQVBQRUQgNgkvKiBjb250YWlucyB1c2VyIHBhZ2VzICovCiAjZGVmaW5lIEJJT19FT1BOT1RTVVBQCTcJLyogbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBCSU9fQ1BVX0FGRklORQk4CS8qIGNvbXBsZXRlIGJpbyBvbiBzYW1lIENQVSBhcyBzdWJtaXR0ZWQgKi8KKyNkZWZpbmUgQklPX05VTExfTUFQUEVEIDkJLyogY29udGFpbnMgaW52YWxpZCB1c2VyIHBhZ2VzICovCisjZGVmaW5lIEJJT19GU19JTlRFR1JJVFkgMTAJLyogZnMgb3ducyBpbnRlZ3JpdHkgZGF0YSwgbm90IGJsb2NrIGxheWVyICovCiAjZGVmaW5lIGJpb19mbGFnZ2VkKGJpbywgZmxhZykJKChiaW8pLT5iaV9mbGFncyAmICgxIDw8IChmbGFnKSkpCiAKIC8qCkBAIC0xNDQsMTggKzEyMywzMSBAQAogLyoKICAqIGJpbyBiaV9ydyBmbGFncwogICoKLSAqIGJpdCAwIC0tIHJlYWQgKG5vdCBzZXQpIG9yIHdyaXRlIChzZXQpCisgKiBiaXQgMCAtLSBkYXRhIGRpcmVjdGlvbgorICoJSWYgbm90IHNldCwgYmlvIGlzIGEgcmVhZCBmcm9tIGRldmljZS4gSWYgc2V0LCBpdCdzIGEgd3JpdGUgdG8gZGV2aWNlLgogICogYml0IDEgLS0gcnctYWhlYWQgd2hlbiBzZXQKICAqIGJpdCAyIC0tIGJhcnJpZXIKKyAqCUluc2VydCBhIHNlcmlhbGl6YXRpb24gcG9pbnQgaW4gdGhlIElPIHF1ZXVlLCBmb3JjaW5nIHByZXZpb3VzbHkKKyAqCXN1Ym1pdHRlZCBJTyB0byBiZSBjb21wbGV0ZWQgYmVmb3JlIHRoaXMgb2VuIGlzIGlzc3VlZC4KICAqIGJpdCAzIC0tIGZhaWwgZmFzdCwgZG9uJ3Qgd2FudCBsb3cgbGV2ZWwgZHJpdmVyIHJldHJpZXMKICAqIGJpdCA0IC0tIHN5bmNocm9ub3VzIEkvTyBoaW50OiB0aGUgYmxvY2sgbGF5ZXIgd2lsbCB1bnBsdWcgaW1tZWRpYXRlbHkKKyAqCU5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGluZGljYXRlIHRoYXQgdGhlIElPIGl0c2VsZiBpcyBzeW5jLCBqdXN0CisgKgl0aGF0IHRoZSBibG9jayBsYXllciB3aWxsIG5vdCBwb3N0cG9uZSBpc3N1ZSBvZiB0aGlzIElPIGJ5IHBsdWdnaW5nLgorICogYml0IDUgLS0gbWV0YWRhdGEgcmVxdWVzdAorICoJVXNlZCBmb3IgdHJhY2luZyB0byBkaWZmZXJlbnRpYXRlIG1ldGFkYXRhIGFuZCBkYXRhIElPLiBNYXkgYWxzbworICoJZ2V0IHNvbWUgcHJlZmVyZW50aWFsIHRyZWF0bWVudCBpbiB0aGUgSU8gc2NoZWR1bGVyCisgKiBiaXQgNiAtLSBkaXNjYXJkIHNlY3RvcnMKKyAqCUluZm9ybXMgdGhlIGxvd2VyIGxldmVsIGRldmljZSB0aGF0IHRoaXMgcmFuZ2Ugb2Ygc2VjdG9ycyBpcyBubyBsb25nZXIKKyAqCXVzZWQgYnkgdGhlIGZpbGUgc3lzdGVtIGFuZCBtYXkgdGh1cyBiZSBmcmVlZCBieSB0aGUgZGV2aWNlLiBVc2VkCisgKglmb3IgZmxhc2ggYmFzZWQgc3RvcmFnZS4KICAqLwotI2RlZmluZSBCSU9fUlcJCTAKLSNkZWZpbmUgQklPX1JXX0FIRUFECTEKKyNkZWZpbmUgQklPX1JXCQkwCS8qIE11c3QgbWF0Y2ggUlcgaW4gcmVxIGZsYWdzIChibGtkZXYuaCkgKi8KKyNkZWZpbmUgQklPX1JXX0FIRUFECTEJLyogTXVzdCBtYXRjaCBGQUlMRkFTVCBpbiByZXEgZmxhZ3MgKi8KICNkZWZpbmUgQklPX1JXX0JBUlJJRVIJMgogI2RlZmluZSBCSU9fUldfRkFJTEZBU1QJMwogI2RlZmluZSBCSU9fUldfU1lOQwk0CiAjZGVmaW5lIEJJT19SV19NRVRBCTUKKyNkZWZpbmUgQklPX1JXX0RJU0NBUkQJNgogCiAvKgogICogdXBwZXIgMTYgYml0cyBvZiBiaV9ydyBkZWZpbmUgdGhlIGlvIHByaW9yaXR5IG9mIHRoaXMgYmlvCkBAIC0xODUsMTQgKzE3NywxNSBAQAogI2RlZmluZSBiaW9fZmFpbGZhc3QoYmlvKQkoKGJpbyktPmJpX3J3ICYgKDEgPDwgQklPX1JXX0ZBSUxGQVNUKSkKICNkZWZpbmUgYmlvX3J3X2FoZWFkKGJpbykJKChiaW8pLT5iaV9ydyAmICgxIDw8IEJJT19SV19BSEVBRCkpCiAjZGVmaW5lIGJpb19yd19tZXRhKGJpbykJKChiaW8pLT5iaV9ydyAmICgxIDw8IEJJT19SV19NRVRBKSkKLSNkZWZpbmUgYmlvX2VtcHR5X2JhcnJpZXIoYmlvKQkoYmlvX2JhcnJpZXIoYmlvKSAmJiAhKGJpbyktPmJpX3NpemUpCisjZGVmaW5lIGJpb19kaXNjYXJkKGJpbykJKChiaW8pLT5iaV9ydyAmICgxIDw8IEJJT19SV19ESVNDQVJEKSkKKyNkZWZpbmUgYmlvX2VtcHR5X2JhcnJpZXIoYmlvKQkoYmlvX2JhcnJpZXIoYmlvKSAmJiAhYmlvX2hhc19kYXRhKGJpbykgJiYgIWJpb19kaXNjYXJkKGJpbykpCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJpb19jdXJfc2VjdG9ycyhzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaWYgKGJpby0+YmlfdmNudCkKIAkJcmV0dXJuIGJpb19pb3ZlYyhiaW8pLT5idl9sZW4gPj4gOTsKLQotCXJldHVybiAwOworCWVsc2UgLyogZGF0YWxlc3MgcmVxdWVzdHMgc3VjaCBhcyBkaXNjYXJkICovCisJCXJldHVybiBiaW8tPmJpX3NpemUgPj4gOTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpiaW9fZGF0YShzdHJ1Y3QgYmlvICpiaW8pCkBAIC0yMzYsOCArMjI5LDYgQEAKIAkoKGJ2ZWNfdG9fcGh5cygodmVjMSkpICsgKHZlYzEpLT5idl9sZW4pID09IGJ2ZWNfdG9fcGh5cygodmVjMikpKQogI2VuZGlmCiAKLSNkZWZpbmUgQklPVkVDX1ZJUlRfTUVSR0VBQkxFKHZlYzEsIHZlYzIpCVwKLQkoKCgoYnZlY190b19waHlzKCh2ZWMxKSkgKyAodmVjMSktPmJ2X2xlbikgfCBidmVjX3RvX3BoeXMoKHZlYzIpKSkgJiAoQklPX1ZNRVJHRV9CT1VOREFSWSAtIDEpKSA9PSAwKQogI2RlZmluZSBfX0JJT19TRUdfQk9VTkRBUlkoYWRkcjEsIGFkZHIyLCBtYXNrKSBcCiAJKCgoYWRkcjEpIHwgKG1hc2spKSA9PSAoKChhZGRyMikgLSAxKSB8IChtYXNrKSkpCiAjZGVmaW5lIEJJT1ZFQ19TRUdfQk9VTkRBUlkocSwgYjEsIGIyKSBcCkBAIC0zMTksMTUgKzMxMCwxNCBAQAogCWF0b21pY190CQkJY250OwogCWludAkJCQllcnJvcjsKIH07Ci1leHRlcm4gc3RydWN0IGJpb19wYWlyICpiaW9fc3BsaXQoc3RydWN0IGJpbyAqYmksIG1lbXBvb2xfdCAqcG9vbCwKLQkJCQkgIGludCBmaXJzdF9zZWN0b3JzKTsKLWV4dGVybiBtZW1wb29sX3QgKmJpb19zcGxpdF9wb29sOworZXh0ZXJuIHN0cnVjdCBiaW9fcGFpciAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpLCBpbnQgZmlyc3Rfc2VjdG9ycyk7CiBleHRlcm4gdm9pZCBiaW9fcGFpcl9yZWxlYXNlKHN0cnVjdCBiaW9fcGFpciAqZGJpbyk7CiAKIGV4dGVybiBzdHJ1Y3QgYmlvX3NldCAqYmlvc2V0X2NyZWF0ZShpbnQsIGludCk7CiBleHRlcm4gdm9pZCBiaW9zZXRfZnJlZShzdHJ1Y3QgYmlvX3NldCAqKTsKIAogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19hbGxvYyhnZnBfdCwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgYmlvICpiaW9fa21hbGxvYyhnZnBfdCwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgYmlvICpiaW9fYWxsb2NfYmlvc2V0KGdmcF90LCBpbnQsIHN0cnVjdCBiaW9fc2V0ICopOwogZXh0ZXJuIHZvaWQgYmlvX3B1dChzdHJ1Y3QgYmlvICopOwogZXh0ZXJuIHZvaWQgYmlvX2ZyZWUoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvX3NldCAqKTsKQEAgLTMzNSw3ICszMjUsNiBAQAogZXh0ZXJuIHZvaWQgYmlvX2VuZGlvKHN0cnVjdCBiaW8gKiwgaW50KTsKIHN0cnVjdCByZXF1ZXN0X3F1ZXVlOwogZXh0ZXJuIGludCBiaW9fcGh5c19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgYmlvICopOwotZXh0ZXJuIGludCBiaW9faHdfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IGJpbyAqKTsKIAogZXh0ZXJuIHZvaWQgX19iaW9fY2xvbmUoc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvICopOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jbG9uZShzdHJ1Y3QgYmlvICosIGdmcF90KTsKQEAgLTM0NiwxMiArMzM1LDE0IEBACiBleHRlcm4gaW50IGJpb19hZGRfcGNfcGFnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgYmlvICosIHN0cnVjdCBwYWdlICosCiAJCQkgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IGJpb19nZXRfbnJfdmVjcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOworZXh0ZXJuIHNlY3Rvcl90IGJpb19zZWN0b3Jfb2Zmc2V0KHN0cnVjdCBiaW8gKiwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX21hcF91c2VyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKLQkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQsIGludCk7CisJCQkJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBpbnQsIGdmcF90KTsKIHN0cnVjdCBzZ19pb3ZlYzsKK3N0cnVjdCBycV9tYXBfZGF0YTsKIGV4dGVybiBzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXJfaW92KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCiAJCQkJICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKLQkJCQkgICAgc3RydWN0IHNnX2lvdmVjICosIGludCwgaW50KTsKKwkJCQkgICAgc3RydWN0IHNnX2lvdmVjICosIGludCwgaW50LCBnZnBfdCk7CiBleHRlcm4gdm9pZCBiaW9fdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICopOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19tYXBfa2VybihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB2b2lkICosIHVuc2lnbmVkIGludCwKIAkJCQlnZnBfdCk7CkBAIC0zNTksMTUgKzM1MCwyNSBAQAogCQkJCSBnZnBfdCwgaW50KTsKIGV4dGVybiB2b2lkIGJpb19zZXRfcGFnZXNfZGlydHkoc3RydWN0IGJpbyAqYmlvKTsKIGV4dGVybiB2b2lkIGJpb19jaGVja19wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pOwotZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBpbnQpOwotZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXJfaW92KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBzZ19pb3ZlYyAqLAotCQkJCSAgICAgaW50LCBpbnQpOworZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJxX21hcF9kYXRhICosCisJCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgaW50LCBnZnBfdCk7CitleHRlcm4gc3RydWN0IGJpbyAqYmlvX2NvcHlfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKKwkJCQkgICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqLCBzdHJ1Y3Qgc2dfaW92ZWMgKiwKKwkJCQkgICAgIGludCwgaW50LCBnZnBfdCk7CiBleHRlcm4gaW50IGJpb191bmNvcHlfdXNlcihzdHJ1Y3QgYmlvICopOwogdm9pZCB6ZXJvX2ZpbGxfYmlvKHN0cnVjdCBiaW8gKmJpbyk7CiBleHRlcm4gc3RydWN0IGJpb192ZWMgKmJ2ZWNfYWxsb2NfYnMoZ2ZwX3QsIGludCwgdW5zaWduZWQgbG9uZyAqLCBzdHJ1Y3QgYmlvX3NldCAqKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYnZlY19ucl92ZWNzKHVuc2lnbmVkIHNob3J0IGlkeCk7CiAKIC8qCisgKiBBbGxvdyBxdWV1ZXIgdG8gc3BlY2lmeSBhIGNvbXBsZXRpb24gQ1BVIGZvciB0aGlzIGJpbworICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmlvX3NldF9jb21wbGV0aW9uX2NwdShzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBjcHUpCit7CisJYmlvLT5iaV9jb21wX2NwdSA9IGNwdTsKK30KKworLyoKICAqIGJpb19zZXQgaXMgdXNlZCB0byBhbGxvdyBvdGhlciBwb3J0aW9ucyBvZiB0aGUgSU8gc3lzdGVtIHRvCiAgKiBhbGxvY2F0ZSB0aGVpciBvd24gcHJpdmF0ZSBtZW1vcnkgcG9vbHMgZm9yIGJpbyBhbmQgaW92ZWMgc3RydWN0dXJlcy4KICAqIFRoZXNlIG1lbW9yeSBwb29scyBpbiB0dXJuIGFsbCBhbGxvY2F0ZSBmcm9tIHRoZSBiaW9fc2xhYgpAQCAtNDQ1LDYgKzQ0NiwxNCBAQAogCV9fYmlvX2ttYXBfaXJxKChiaW8pLCAoYmlvKS0+YmlfaWR4LCAoZmxhZ3MpKQogI2RlZmluZSBiaW9fa3VubWFwX2lycShidWYsZmxhZ3MpCV9fYmlvX2t1bm1hcF9pcnEoYnVmLCBmbGFncykKIAorLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhpcyBiaW8gY2FycmllcyBhbnkgZGF0YSBvciBub3QuIEEgTlVMTCBiaW8gaXMgYWxsb3dlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYmlvX2hhc19kYXRhKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlyZXR1cm4gYmlvICYmIGJpby0+YmlfaW9fdmVjICE9IE5VTEw7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lOVEVHUklUWSkKIAogI2RlZmluZSBiaXBfdmVjX2lkeChiaXAsIGlkeCkJKCYoYmlwLT5iaXBfdmVjWyhpZHgpXSkpCkBAIC00NTgsMTQgKzQ2Nyw3IEBACiAjZGVmaW5lIGJpcF9mb3JfZWFjaF92ZWMoYnZsLCBiaXAsIGkpCQkJCQlcCiAJX19iaXBfZm9yX2VhY2hfdmVjKGJ2bCwgYmlwLCBpLCAoYmlwKS0+YmlwX2lkeCkKIAotc3RhdGljIGlubGluZSBpbnQgYmlvX2ludGVncml0eShzdHJ1Y3QgYmlvICpiaW8pCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkpCi0JcmV0dXJuIGJpby0+YmlfaW50ZWdyaXR5ICE9IE5VTEw7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19CisjZGVmaW5lIGJpb19pbnRlZ3JpdHkoYmlvKSAoYmlvLT5iaV9pbnRlZ3JpdHkgIT0gTlVMTCkKIAogZXh0ZXJuIHN0cnVjdCBiaW9faW50ZWdyaXR5X3BheWxvYWQgKmJpb19pbnRlZ3JpdHlfYWxsb2NfYmlvc2V0KHN0cnVjdCBiaW8gKiwgZ2ZwX3QsIHVuc2lnbmVkIGludCwgc3RydWN0IGJpb19zZXQgKik7CiBleHRlcm4gc3RydWN0IGJpb19pbnRlZ3JpdHlfcGF5bG9hZCAqYmlvX2ludGVncml0eV9hbGxvYyhzdHJ1Y3QgYmlvICosIGdmcF90LCB1bnNpZ25lZCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggNDQ3MTBkNy4uYTkyZDllNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC0xNiw3ICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvYnNnLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIApAQCAtNTQsNyArNTYsNiBAQAogCVJFUV9UWVBFX1BNX1NVU1BFTkQsCQkvKiBzdXNwZW5kIHJlcXVlc3QgKi8KIAlSRVFfVFlQRV9QTV9SRVNVTUUsCQkvKiByZXN1bWUgcmVxdWVzdCAqLwogCVJFUV9UWVBFX1BNX1NIVVRET1dOLAkJLyogc2h1dGRvd24gcmVxdWVzdCAqLwotCVJFUV9UWVBFX0ZMVVNILAkJCS8qIGZsdXNoIHJlcXVlc3QgKi8KIAlSRVFfVFlQRV9TUEVDSUFMLAkJLyogZHJpdmVyIGRlZmluZWQgdHlwZSAqLwogCVJFUV9UWVBFX0xJTlVYX0JMT0NLLAkJLyogZ2VuZXJpYyBibG9jayBsYXllciBtZXNzYWdlICovCiAJLyoKQEAgLTc2LDE5ICs3NywxOCBAQAogICoKICAqLwogZW51bSB7Ci0JLyoKLQkgKiBqdXN0IGV4YW1wbGVzIGZvciBub3cKLQkgKi8KIAlSRVFfTEJfT1BfRUpFQ1QJPSAweDQwLAkJLyogZWplY3QgcmVxdWVzdCAqLwotCVJFUV9MQl9PUF9GTFVTSCA9IDB4NDEsCQkvKiBmbHVzaCBkZXZpY2UgKi8KKwlSRVFfTEJfT1BfRkxVU0ggPSAweDQxLAkJLyogZmx1c2ggcmVxdWVzdCAqLworCVJFUV9MQl9PUF9ESVNDQVJEID0gMHg0MiwJLyogZGlzY2FyZCBzZWN0b3JzICovCiB9OwogCiAvKgotICogcmVxdWVzdCB0eXBlIG1vZGlmaWVkIGJpdHMuIGZpcnN0IHRocmVlIGJpdHMgbWF0Y2ggQklPX1JXKiBiaXRzLCBpbXBvcnRhbnQKKyAqIHJlcXVlc3QgdHlwZSBtb2RpZmllZCBiaXRzLiBmaXJzdCB0d28gYml0cyBtYXRjaCBCSU9fUlcqIGJpdHMsIGltcG9ydGFudAogICovCiBlbnVtIHJxX2ZsYWdfYml0cyB7CiAJX19SRVFfUlcsCQkvKiBub3Qgc2V0LCByZWFkLiBzZXQsIHdyaXRlICovCiAJX19SRVFfRkFJTEZBU1QsCQkvKiBubyBsb3cgbGV2ZWwgZHJpdmVyIHJldHJpZXMgKi8KKwlfX1JFUV9ESVNDQVJELAkJLyogcmVxdWVzdCB0byBkaXNjYXJkIHNlY3RvcnMgKi8KIAlfX1JFUV9TT1JURUQsCQkvKiBlbGV2YXRvciBrbm93cyBhYm91dCB0aGlzIHJlcXVlc3QgKi8KIAlfX1JFUV9TT0ZUQkFSUklFUiwJLyogbWF5IG5vdCBiZSBwYXNzZWQgYnkgaW9zY2hlZHVsZXIgKi8KIAlfX1JFUV9IQVJEQkFSUklFUiwJLyogbWF5IG5vdCBiZSBwYXNzZWQgYnkgZHJpdmUgZWl0aGVyICovCkBAIC0xMTEsNiArMTExLDcgQEAKIH07CiAKICNkZWZpbmUgUkVRX1JXCQkoMSA8PCBfX1JFUV9SVykKKyNkZWZpbmUgUkVRX0RJU0NBUkQJKDEgPDwgX19SRVFfRElTQ0FSRCkKICNkZWZpbmUgUkVRX0ZBSUxGQVNUCSgxIDw8IF9fUkVRX0ZBSUxGQVNUKQogI2RlZmluZSBSRVFfU09SVEVECSgxIDw8IF9fUkVRX1NPUlRFRCkKICNkZWZpbmUgUkVRX1NPRlRCQVJSSUVSCSgxIDw8IF9fUkVRX1NPRlRCQVJSSUVSKQpAQCAtMTQwLDEyICsxNDEsMTQgQEAKICAqLwogc3RydWN0IHJlcXVlc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgZG9uZWxpc3Q7CisJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgY3NkOworCWludCBjcHU7CiAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAogCXVuc2lnbmVkIGludCBjbWRfZmxhZ3M7CiAJZW51bSBycV9jbWRfdHlwZV9iaXRzIGNtZF90eXBlOworCXVuc2lnbmVkIGxvbmcgYXRvbWljX2ZsYWdzOwogCiAJLyogTWFpbnRhaW4gYmlvIHRyYXZlcnNhbCBzdGF0ZSBmb3IgcGFydCBieSBwYXJ0IEkvTyBzdWJtaXNzaW9uLgogCSAqIGhhcmRfKiBhcmUgYmxvY2sgbGF5ZXIgaW50ZXJuYWxzLCBubyBkcml2ZXIgc2hvdWxkIHRvdWNoIHRoZW0hCkBAIC0xOTAsMTMgKzE5Myw2IEBACiAJICovCiAJdW5zaWduZWQgc2hvcnQgbnJfcGh5c19zZWdtZW50czsKIAotCS8qIE51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBhZGRyK2xlbiBwYWlycyBhZnRlcgotCSAqIHBoeXNpY2FsIGFuZCBETUEgcmVtYXBwaW5nIGhhcmR3YXJlIGNvYWxlc2NpbmcgaXMgcGVyZm9ybWVkLgotCSAqIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBlbnRyaWVzIHRoZSBkcml2ZXIKLQkgKiB3aWxsIGFjdHVhbGx5IGhhdmUgdG8gZGVhbCB3aXRoIGFmdGVyIERNQSBtYXBwaW5nIGlzIGRvbmUuCi0JICovCi0JdW5zaWduZWQgc2hvcnQgbnJfaHdfc2VnbWVudHM7Ci0KIAl1bnNpZ25lZCBzaG9ydCBpb3ByaW87CiAKIAl2b2lkICpzcGVjaWFsOwpAQCAtMjIwLDYgKzIxNiw4IEBACiAJdm9pZCAqZGF0YTsKIAl2b2lkICpzZW5zZTsKIAorCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmU7CisJc3RydWN0IGxpc3RfaGVhZCB0aW1lb3V0X2xpc3Q7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAJaW50IHJldHJpZXM7CiAKQEAgLTIzMyw2ICsyMzEsMTEgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqbmV4dF9ycTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVxX2dldF9pb3ByaW8oc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlyZXR1cm4gcmVxLT5pb3ByaW87Cit9CisKIC8qCiAgKiBTdGF0ZSBpbmZvcm1hdGlvbiBjYXJyaWVkIGZvciBSRVFfVFlQRV9QTV9TVVNQRU5EIGFuZCBSRVFfVFlQRV9QTV9SRVNVTUUKICAqIHJlcXVlc3RzLiBTb21lIHN0ZXAgdmFsdWVzIGNvdWxkIGV2ZW50dWFsbHkgYmUgbWFkZSBnZW5lcmljLgpAQCAtMjUyLDYgKzI1NSw3IEBACiB0eXBlZGVmIGludCAobWFrZV9yZXF1ZXN0X2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CiB0eXBlZGVmIGludCAocHJlcF9ycV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkICh1bnBsdWdfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK3R5cGVkZWYgaW50IChwcmVwYXJlX2Rpc2NhcmRfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAogc3RydWN0IGJpb192ZWM7CiBzdHJ1Y3QgYnZlY19tZXJnZV9kYXRhIHsKQEAgLTI2NSw2ICsyNjksMTUgQEAKIHR5cGVkZWYgdm9pZCAocHJlcGFyZV9mbHVzaF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkIChzb2Z0aXJxX2RvbmVfZm4pKHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiBpbnQgKGRtYV9kcmFpbl9uZWVkZWRfZm4pKHN0cnVjdCByZXF1ZXN0ICopOwordHlwZWRlZiBpbnQgKGxsZF9idXN5X2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworCitlbnVtIGJsa19laF90aW1lcl9yZXR1cm4geworCUJMS19FSF9OT1RfSEFORExFRCwKKwlCTEtfRUhfSEFORExFRCwKKwlCTEtfRUhfUkVTRVRfVElNRVIsCit9OworCit0eXBlZGVmIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiAocnFfdGltZWRfb3V0X2ZuKShzdHJ1Y3QgcmVxdWVzdCAqKTsKIAogZW51bSBibGtfcXVldWVfc3RhdGUgewogCVF1ZXVlX2Rvd24sCkBAIC0zMDcsMTAgKzMyMCwxMyBAQAogCW1ha2VfcmVxdWVzdF9mbgkJKm1ha2VfcmVxdWVzdF9mbjsKIAlwcmVwX3JxX2ZuCQkqcHJlcF9ycV9mbjsKIAl1bnBsdWdfZm4JCSp1bnBsdWdfZm47CisJcHJlcGFyZV9kaXNjYXJkX2ZuCSpwcmVwYXJlX2Rpc2NhcmRfZm47CiAJbWVyZ2VfYnZlY19mbgkJKm1lcmdlX2J2ZWNfZm47CiAJcHJlcGFyZV9mbHVzaF9mbgkqcHJlcGFyZV9mbHVzaF9mbjsKIAlzb2Z0aXJxX2RvbmVfZm4JCSpzb2Z0aXJxX2RvbmVfZm47CisJcnFfdGltZWRfb3V0X2ZuCQkqcnFfdGltZWRfb3V0X2ZuOwogCWRtYV9kcmFpbl9uZWVkZWRfZm4JKmRtYV9kcmFpbl9uZWVkZWQ7CisJbGxkX2J1c3lfZm4JCSpsbGRfYnVzeV9mbjsKIAogCS8qCiAJICogRGlzcGF0Y2ggcXVldWUgc29ydGluZwpAQCAtMzg1LDYgKzQwMSwxMCBAQAogCXVuc2lnbmVkIGludAkJbnJfc29ydGVkOwogCXVuc2lnbmVkIGludAkJaW5fZmxpZ2h0OwogCisJdW5zaWduZWQgaW50CQlycV90aW1lb3V0OworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVvdXQ7CisJc3RydWN0IGxpc3RfaGVhZAl0aW1lb3V0X2xpc3Q7CisKIAkvKgogCSAqIHNnIHN0dWZmCiAJICovCkBAIC00MjEsNiArNDQxLDEwIEBACiAjZGVmaW5lIFFVRVVFX0ZMQUdfRUxWU1dJVENICTgJLyogZG9uJ3QgdXNlIGVsZXZhdG9yLCBqdXN0IGRvIEZJRk8gKi8KICNkZWZpbmUgUVVFVUVfRkxBR19CSURJCQk5CS8qIHF1ZXVlIHN1cHBvcnRzIGJpZGkgcmVxdWVzdHMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT01FUkdFUyAgICAxMAkvKiBkaXNhYmxlIG1lcmdlIGF0dGVtcHRzICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9DT01QICAgMTEJLyogZm9yY2UgY29tcGxldGUgb24gc2FtZSBDUFUgKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19GQUlMX0lPICAgICAxMgkvKiBmYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19TVEFDS0FCTEUgICAxMwkvKiBzdXBwb3J0cyByZXF1ZXN0IHN0YWNraW5nICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfTk9OUk9UICAgICAgMTQJLyogbm9uLXJvdGF0aW9uYWwgZGV2aWNlIChTU0QpICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2lzX2xvY2tlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKQEAgLTUyNiw3ICs1NTAsMTAgQEAKICNkZWZpbmUgYmxrX3F1ZXVlX3RhZ2dlZChxKQl0ZXN0X2JpdChRVUVVRV9GTEFHX1FVRVVFRCwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5lIGJsa19xdWV1ZV9zdG9wcGVkKHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfU1RPUFBFRCwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5lIGJsa19xdWV1ZV9ub21lcmdlcyhxKQl0ZXN0X2JpdChRVUVVRV9GTEFHX05PTUVSR0VTLCAmKHEpLT5xdWV1ZV9mbGFncykKKyNkZWZpbmUgYmxrX3F1ZXVlX25vbnJvdChxKQl0ZXN0X2JpdChRVUVVRV9GTEFHX05PTlJPVCwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5lIGJsa19xdWV1ZV9mbHVzaGluZyhxKQkoKHEpLT5vcmRzZXEpCisjZGVmaW5lIGJsa19xdWV1ZV9zdGFja2FibGUocSkJXAorCXRlc3RfYml0KFFVRVVFX0ZMQUdfU1RBQ0tBQkxFLCAmKHEpLT5xdWV1ZV9mbGFncykKIAogI2RlZmluZSBibGtfZnNfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX0ZTKQogI2RlZmluZSBibGtfcGNfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX0JMT0NLX1BDKQpAQCAtNTM2LDE2ICs1NjMsMTggQEAKICNkZWZpbmUgYmxrX25vcmV0cnlfcmVxdWVzdChycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9GQUlMRkFTVCkKICNkZWZpbmUgYmxrX3JxX3N0YXJ0ZWQocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfU1RBUlRFRCkKIAotI2RlZmluZSBibGtfYWNjb3VudF9ycShycSkJKGJsa19ycV9zdGFydGVkKHJxKSAmJiBibGtfZnNfcmVxdWVzdChycSkpCisjZGVmaW5lIGJsa19hY2NvdW50X3JxKHJxKQkoYmxrX3JxX3N0YXJ0ZWQocnEpICYmIChibGtfZnNfcmVxdWVzdChycSkgfHwgYmxrX2Rpc2NhcmRfcnEocnEpKSkgCiAKICNkZWZpbmUgYmxrX3BtX3N1c3BlbmRfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX1BNX1NVU1BFTkQpCiAjZGVmaW5lIGJsa19wbV9yZXN1bWVfcmVxdWVzdChycSkJKChycSktPmNtZF90eXBlID09IFJFUV9UWVBFX1BNX1JFU1VNRSkKICNkZWZpbmUgYmxrX3BtX3JlcXVlc3QocnEpCVwKIAkoYmxrX3BtX3N1c3BlbmRfcmVxdWVzdChycSkgfHwgYmxrX3BtX3Jlc3VtZV9yZXF1ZXN0KHJxKSkKIAorI2RlZmluZSBibGtfcnFfY3B1X3ZhbGlkKHJxKQkoKHJxKS0+Y3B1ICE9IC0xKQogI2RlZmluZSBibGtfc29ydGVkX3JxKHJxKQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX1NPUlRFRCkKICNkZWZpbmUgYmxrX2JhcnJpZXJfcnEocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfSEFSREJBUlJJRVIpCiAjZGVmaW5lIGJsa19mdWFfcnEocnEpCQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX0ZVQSkKKyNkZWZpbmUgYmxrX2Rpc2NhcmRfcnEocnEpCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfRElTQ0FSRCkKICNkZWZpbmUgYmxrX2JpZGlfcnEocnEpCQkoKHJxKS0+bmV4dF9ycSAhPSBOVUxMKQogI2RlZmluZSBibGtfZW1wdHlfYmFycmllcihycSkJKGJsa19iYXJyaWVyX3JxKHJxKSAmJiBibGtfZnNfcmVxdWVzdChycSkgJiYgIShycSktPmhhcmRfbnJfc2VjdG9ycykKIC8qIHJxLT5xdWV1ZWxpc3Qgb2YgZGVxdWV1ZWQgcmVxdWVzdCBtdXN0IGJlIGxpc3RfZW1wdHkoKSAqLwpAQCAtNTkyLDcgKzYyMSw4IEBACiAjZGVmaW5lIFJRX05PTUVSR0VfRkxBR1MJXAogCShSRVFfTk9NRVJHRSB8IFJFUV9TVEFSVEVEIHwgUkVRX0hBUkRCQVJSSUVSIHwgUkVRX1NPRlRCQVJSSUVSKQogI2RlZmluZSBycV9tZXJnZWFibGUocnEpCVwKLQkoISgocnEpLT5jbWRfZmxhZ3MgJiBSUV9OT01FUkdFX0ZMQUdTKSAmJiBibGtfZnNfcmVxdWVzdCgocnEpKSkKKwkoISgocnEpLT5jbWRfZmxhZ3MgJiBSUV9OT01FUkdFX0ZMQUdTKSAmJiBcCisJIChibGtfZGlzY2FyZF9ycShycSkgfHwgYmxrX2ZzX3JlcXVlc3QoKHJxKSkpKQogCiAvKgogICogcS0+cHJlcF9ycV9mbiByZXR1cm4gdmFsdWVzCkBAIC02MzcsNiArNjY3LDEyIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCitzdHJ1Y3QgcnFfbWFwX2RhdGEgeworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJaW50IHBhZ2Vfb3JkZXI7CisJaW50IG5yX2VudHJpZXM7Cit9OworCiBzdHJ1Y3QgcmVxX2l0ZXJhdG9yIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgYmlvICpiaW87CkBAIC02NjQsNiArNzAwLDEwIEBACiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmJsa19nZXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpbnQsIGdmcF90KTsKIGV4dGVybiB2b2lkIGJsa19pbnNlcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIGludCBibGtfcnFfY2hlY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOworZXh0ZXJuIGludCBibGtfbGxkX2J1c3koc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIGludCBibGtfaW5zZXJ0X2Nsb25lZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgICAgc3RydWN0IHJlcXVlc3QgKnJxKTsKIGV4dGVybiB2b2lkIGJsa19wbHVnX2RldmljZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIGJsa19wbHVnX2RldmljZV91bmxvY2tlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIGV4dGVybiBpbnQgYmxrX3JlbW92ZV9wbHVnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwpAQCAtNzA1LDExICs3NDUsMTQgQEAKIGV4dGVybiB2b2lkIF9fYmxrX3J1bl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIGJsa19ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gdm9pZCBibGtfc3RhcnRfcXVldWVpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7Ci1leHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosCisJCQkgICBzdHJ1Y3QgcnFfbWFwX2RhdGEgKiwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZywKKwkJCSAgIGdmcF90KTsKIGV4dGVybiBpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqKTsKIGV4dGVybiBpbnQgYmxrX3JxX21hcF9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwgdW5zaWduZWQgaW50LCBnZnBfdCk7CiBleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwKLQkJCSAgICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKiwgaW50LCB1bnNpZ25lZCBpbnQpOworCQkJICAgICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqLCBzdHJ1Y3Qgc2dfaW92ZWMgKiwgaW50LAorCQkJICAgICAgIHVuc2lnbmVkIGludCwgZ2ZwX3QpOwogZXh0ZXJuIGludCBibGtfZXhlY3V0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAogCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBnZW5kaXNrICosCkBAIC03NTAsMTIgKzc5MywxNSBAQAogZXh0ZXJuIGludCBibGtfZW5kX2JpZGlfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwKIAkJCQl1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsIHVuc2lnbmVkIGludCBiaWRpX2J5dGVzKTsKIGV4dGVybiB2b2lkIGVuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICosIGludCk7Ci1leHRlcm4gdm9pZCBlbmRfcXVldWVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKLWV4dGVybiB2b2lkIGVuZF9kZXF1ZXVlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gaW50IGJsa19lbmRfcmVxdWVzdF9jYWxsYmFjayhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwKIAkJCQl1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsCiAJCQkJaW50IChkcnZfY2FsbGJhY2spKHN0cnVjdCByZXF1ZXN0ICopKTsKIGV4dGVybiB2b2lkIGJsa19jb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQgX19ibGtfY29tcGxldGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqKTsKK2V4dGVybiB2b2lkIGJsa19hYm9ydF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQgYmxrX2Fib3J0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworZXh0ZXJuIHZvaWQgYmxrX3VwZGF0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9ieXRlcyk7CiAKIC8qCiAgKiBibGtfZW5kX3JlcXVlc3QoKSB0YWtlcyBieXRlcyBpbnN0ZWFkIG9mIHNlY3RvcnMgYXMgYSBjb21wbGV0ZSBzaXplLgpAQCAtNzkwLDEyICs4MzYsMTYgQEAKIGV4dGVybiBpbnQgYmxrX3F1ZXVlX2RtYV9kcmFpbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCSAgICAgICBkbWFfZHJhaW5fbmVlZGVkX2ZuICpkbWFfZHJhaW5fbmVlZGVkLAogCQkJICAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2xsZF9idXN5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBsbGRfYnVzeV9mbiAqZm4pOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfcHJlcF9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBwcmVwX3JxX2ZuICpwZm4pOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgbWVyZ2VfYnZlY19mbiAqKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfdXBkYXRlX2RtYV9hbGlnbm1lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc29mdGlycV9kb25lX2ZuICopOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3NldF9kaXNjYXJkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHByZXBhcmVfZGlzY2FyZF9mbiAqKTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9ycV90aW1lZF9vdXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgcnFfdGltZWRfb3V0X2ZuICopOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwogZXh0ZXJuIGludCBibGtfcXVldWVfb3JkZXJlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCwgcHJlcGFyZV9mbHVzaF9mbiAqKTsKIGV4dGVybiBpbnQgYmxrX2RvX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiopOwpAQCAtODM3LDE0ICs4ODcsMjIgQEAKIH0KIAogZXh0ZXJuIGludCBibGtkZXZfaXNzdWVfZmx1c2goc3RydWN0IGJsb2NrX2RldmljZSAqLCBzZWN0b3JfdCAqKTsKK2V4dGVybiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJCXNlY3Rvcl90IHNlY3Rvciwgc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90KTsKKworc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHNlY3Rvcl90IGJsb2NrLCBzZWN0b3JfdCBucl9ibG9ja3MpCit7CisJYmxvY2sgPDw9IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCW5yX2Jsb2NrcyA8PD0gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CisJcmV0dXJuIGJsa2Rldl9pc3N1ZV9kaXNjYXJkKHNiLT5zX2JkZXYsIGJsb2NrLCBucl9ibG9ja3MsIEdGUF9LRVJORUwpOworfQogCiAvKgogKiBjb21tYW5kIGZpbHRlciBmdW5jdGlvbnMKICovCiBleHRlcm4gaW50IGJsa192ZXJpZnlfY29tbWFuZChzdHJ1Y3QgYmxrX2NtZF9maWx0ZXIgKmZpbHRlciwKIAkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNtZCwgaW50IGhhc193cml0ZV9wZXJtKTsKLWV4dGVybiBpbnQgYmxrX3JlZ2lzdGVyX2ZpbHRlcihzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7Ci1leHRlcm4gdm9pZCBibGtfdW5yZWdpc3Rlcl9maWx0ZXIoc3RydWN0IGdlbmRpc2sgKmRpc2spOwogZXh0ZXJuIHZvaWQgYmxrX3NldF9jbWRfZmlsdGVyX2RlZmF1bHRzKHN0cnVjdCBibGtfY21kX2ZpbHRlciAqZmlsdGVyKTsKIAogI2RlZmluZSBNQVhfUEhZU19TRUdNRU5UUyAxMjgKQEAgLTg3Niw2ICs5MzQsMTMgQEAKIAlyZXR1cm4gcSA/IHEtPmRtYV9hbGlnbm1lbnQgOiA1MTE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJsa19ycV9hbGlnbmVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB2b2lkICphZGRyLAorCQkJCSB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBhbGlnbm1lbnQgPSBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpIHwgcS0+ZG1hX3BhZF9tYXNrOworCXJldHVybiAhKCh1bnNpZ25lZCBsb25nKWFkZHIgJiBhbGlnbm1lbnQpICYmICEobGVuICYgYWxpZ25tZW50KTsKK30KKwogLyogYXNzdW1lcyBzaXplID4gMjU2ICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBibGtzaXplX2JpdHModW5zaWduZWQgaW50IHNpemUpCiB7CkBAIC05MDIsNyArOTY3LDcgQEAKIH0KIAogc3RydWN0IHdvcmtfc3RydWN0OwotaW50IGtibG9ja2Rfc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IGtibG9ja2Rfc2NoZWR1bGVfd29yayhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQga2Jsb2NrZF9mbHVzaF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKICNkZWZpbmUgTU9EVUxFX0FMSUFTX0JMT0NLREVWKG1ham9yLG1pbm9yKSBcCkBAIC05NDcsNDkgKzEwMTIsMTkgQEAKIAogZXh0ZXJuIGludCBibGtfaW50ZWdyaXR5X3JlZ2lzdGVyKHN0cnVjdCBnZW5kaXNrICosIHN0cnVjdCBibGtfaW50ZWdyaXR5ICopOwogZXh0ZXJuIHZvaWQgYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKHN0cnVjdCBnZW5kaXNrICopOwotZXh0ZXJuIGludCBibGtfaW50ZWdyaXR5X2NvbXBhcmUoc3RydWN0IGJsb2NrX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOworZXh0ZXJuIGludCBibGtfaW50ZWdyaXR5X2NvbXBhcmUoc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IGdlbmRpc2sgKik7CiBleHRlcm4gaW50IGJsa19ycV9tYXBfaW50ZWdyaXR5X3NnKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqKTsKIGV4dGVybiBpbnQgYmxrX3JxX2NvdW50X2ludGVncml0eV9zZyhzdHJ1Y3QgcmVxdWVzdCAqKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBibGtfaW50ZWdyaXR5X3R1cGxlX3NpemUoc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpKQotewotCWlmIChiaSkKLQkJcmV0dXJuIGJpLT50dXBsZV9zaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJkZXZfZ2V0X2ludGVncml0eShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQorc3RhdGljIGlubGluZQorc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJkZXZfZ2V0X2ludGVncml0eShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCXJldHVybiBiZGV2LT5iZF9kaXNrLT5pbnRlZ3JpdHk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJkZXZfZ2V0X3RhZ19zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBibGtfaW50ZWdyaXR5ICpibGtfZ2V0X2ludGVncml0eShzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKLQlzdHJ1Y3QgYmxrX2ludGVncml0eSAqYmkgPSBiZGV2X2dldF9pbnRlZ3JpdHkoYmRldik7Ci0KLQlpZiAoYmkpCi0JCXJldHVybiBiaS0+dGFnX3NpemU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmRldl9pbnRlZ3JpdHlfZW5hYmxlZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgcncpCi17Ci0Jc3RydWN0IGJsa19pbnRlZ3JpdHkgKmJpID0gYmRldl9nZXRfaW50ZWdyaXR5KGJkZXYpOwotCi0JaWYgKGJpID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JaWYgKHJ3ID09IFJFQUQgJiYgYmktPnZlcmlmeV9mbiAhPSBOVUxMICYmCi0JICAgIChiaS0+ZmxhZ3MgJiBJTlRFR1JJVFlfRkxBR19SRUFEKSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAocncgPT0gV1JJVEUgJiYgYmktPmdlbmVyYXRlX2ZuICE9IE5VTEwgJiYKLQkgICAgKGJpLT5mbGFncyAmIElOVEVHUklUWV9GTEFHX1dSSVRFKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGlzay0+aW50ZWdyaXR5OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBibGtfaW50ZWdyaXR5X3JxKHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTEwMDYsNyArMTA0MSw3IEBACiAjZGVmaW5lIGJsa19ycV9jb3VudF9pbnRlZ3JpdHlfc2coYSkJCSgwKQogI2RlZmluZSBibGtfcnFfbWFwX2ludGVncml0eV9zZyhhLCBiKQkJKDApCiAjZGVmaW5lIGJkZXZfZ2V0X2ludGVncml0eShhKQkJCSgwKQotI2RlZmluZSBiZGV2X2dldF90YWdfc2l6ZShhKQkJCSgwKQorI2RlZmluZSBibGtfZ2V0X2ludGVncml0eShhKQkJCSgwKQogI2RlZmluZSBibGtfaW50ZWdyaXR5X2NvbXBhcmUoYSwgYikJCSgwKQogI2RlZmluZSBibGtfaW50ZWdyaXR5X3JlZ2lzdGVyKGEsIGIpCQkoMCkKICNkZWZpbmUgYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKGEpCQlkbyB7IH0gd2hpbGUgKDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaCBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKaW5kZXggZDA4NGI4ZC4uM2EzMWViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCkBAIC0xLDggKzEsMTAgQEAKICNpZm5kZWYgQkxLVFJBQ0VfSAogI2RlZmluZSBCTEtUUkFDRV9ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVsYXkuaD4KKyNlbmRpZgogCiAvKgogICogVHJhY2UgY2F0ZWdvcmllcwpAQCAtMjEsNiArMjMsNyBAQAogCUJMS19UQ19OT1RJRlkJPSAxIDw8IDEwLAkvKiBzcGVjaWFsIG1lc3NhZ2UgKi8KIAlCTEtfVENfQUhFQUQJPSAxIDw8IDExLAkvKiByZWFkYWhlYWQgKi8KIAlCTEtfVENfTUVUQQk9IDEgPDwgMTIsCS8qIG1ldGFkYXRhICovCisJQkxLX1RDX0RJU0NBUkQJPSAxIDw8IDEzLAkvKiBkaXNjYXJkIHJlcXVlc3RzICovCiAKIAlCTEtfVENfRU5ECT0gMSA8PCAxNSwJLyogb25seSAxNi1iaXRzLCByZW1pbmRlciAqLwogfTsKQEAgLTQ3LDYgKzUwLDcgQEAKIAlfX0JMS19UQV9TUExJVCwJCQkvKiBiaW8gd2FzIHNwbGl0ICovCiAJX19CTEtfVEFfQk9VTkNFLAkJLyogYmlvIHdhcyBib3VuY2VkICovCiAJX19CTEtfVEFfUkVNQVAsCQkJLyogYmlvIHdhcyByZW1hcHBlZCAqLworCV9fQkxLX1RBX0FCT1JULAkJCS8qIHJlcXVlc3QgYWJvcnRlZCAqLwogfTsKIAogLyoKQEAgLTc3LDYgKzgxLDcgQEAKICNkZWZpbmUgQkxLX1RBX1NQTElUCQkoX19CTEtfVEFfU1BMSVQpCiAjZGVmaW5lIEJMS19UQV9CT1VOQ0UJCShfX0JMS19UQV9CT1VOQ0UpCiAjZGVmaW5lIEJMS19UQV9SRU1BUAkJKF9fQkxLX1RBX1JFTUFQIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQorI2RlZmluZSBCTEtfVEFfQUJPUlQJCShfX0JMS19UQV9BQk9SVCB8IEJMS19UQ19BQ1QoQkxLX1RDX1FVRVVFKSkKIAogI2RlZmluZSBCTEtfVE5fUFJPQ0VTUwkJKF9fQkxLX1ROX1BST0NFU1MgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQogI2RlZmluZSBCTEtfVE5fVElNRVNUQU1QCShfX0JMS19UTl9USU1FU1RBTVAgfCBCTEtfVENfQUNUKEJMS19UQ19OT1RJRlkpKQpAQCAtODksMTcgKzk0LDE3IEBACiAgKiBUaGUgdHJhY2UgaXRzZWxmCiAgKi8KIHN0cnVjdCBibGtfaW9fdHJhY2UgewotCXUzMiBtYWdpYzsJCS8qIE1BR0lDIDw8IDggfCB2ZXJzaW9uICovCi0JdTMyIHNlcXVlbmNlOwkJLyogZXZlbnQgbnVtYmVyICovCi0JdTY0IHRpbWU7CQkvKiBpbiBtaWNyb3NlY29uZHMgKi8KLQl1NjQgc2VjdG9yOwkJLyogZGlzayBvZmZzZXQgKi8KLQl1MzIgYnl0ZXM7CQkvKiB0cmFuc2ZlciBsZW5ndGggKi8KLQl1MzIgYWN0aW9uOwkJLyogd2hhdCBoYXBwZW5lZCAqLwotCXUzMiBwaWQ7CQkvKiB3aG8gZGlkIGl0ICovCi0JdTMyIGRldmljZTsJCS8qIGRldmljZSBudW1iZXIgKi8KLQl1MzIgY3B1OwkJLyogb24gd2hhdCBjcHUgZGlkIGl0IGhhcHBlbiAqLwotCXUxNiBlcnJvcjsJCS8qIGNvbXBsZXRpb24gZXJyb3IgKi8KLQl1MTYgcGR1X2xlbjsJCS8qIGxlbmd0aCBvZiBkYXRhIGFmdGVyIHRoaXMgdHJhY2UgKi8KKwlfX3UzMiBtYWdpYzsJCS8qIE1BR0lDIDw8IDggfCB2ZXJzaW9uICovCisJX191MzIgc2VxdWVuY2U7CQkvKiBldmVudCBudW1iZXIgKi8KKwlfX3U2NCB0aW1lOwkJLyogaW4gbWljcm9zZWNvbmRzICovCisJX191NjQgc2VjdG9yOwkJLyogZGlzayBvZmZzZXQgKi8KKwlfX3UzMiBieXRlczsJCS8qIHRyYW5zZmVyIGxlbmd0aCAqLworCV9fdTMyIGFjdGlvbjsJCS8qIHdoYXQgaGFwcGVuZWQgKi8KKwlfX3UzMiBwaWQ7CQkvKiB3aG8gZGlkIGl0ICovCisJX191MzIgZGV2aWNlOwkJLyogZGV2aWNlIG51bWJlciAqLworCV9fdTMyIGNwdTsJCS8qIG9uIHdoYXQgY3B1IGRpZCBpdCBoYXBwZW4gKi8KKwlfX3UxNiBlcnJvcjsJCS8qIGNvbXBsZXRpb24gZXJyb3IgKi8KKwlfX3UxNiBwZHVfbGVuOwkJLyogbGVuZ3RoIG9mIGRhdGEgYWZ0ZXIgdGhpcyB0cmFjZSAqLwogfTsKIAogLyoKQEAgLTExNyw2ICsxMjIsMjMgQEAKIAlCbGt0cmFjZV9zdG9wcGVkLAogfTsKIAorI2RlZmluZSBCTEtUUkFDRV9CREVWX1NJWkUJMzIKKworLyoKKyAqIFVzZXIgc2V0dXAgc3RydWN0dXJlIHBhc3NlZCB3aXRoIEJMS1RSQUNFU1RBUlQKKyAqLworc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwIHsKKwljaGFyIG5hbWVbQkxLVFJBQ0VfQkRFVl9TSVpFXTsJLyogb3V0cHV0ICovCisJX191MTYgYWN0X21hc2s7CQkJLyogaW5wdXQgKi8KKwlfX3UzMiBidWZfc2l6ZTsJCQkvKiBpbnB1dCAqLworCV9fdTMyIGJ1Zl9ucjsJCQkvKiBpbnB1dCAqLworCV9fdTY0IHN0YXJ0X2xiYTsKKwlfX3U2NCBlbmRfbGJhOworCV9fdTMyIHBpZDsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JT19UUkFDRSkKIHN0cnVjdCBibGtfdHJhY2UgewogCWludCB0cmFjZV9zdGF0ZTsKIAlzdHJ1Y3QgcmNoYW4gKnJjaGFuOwpAQCAtMTMzLDIxICsxNTUsNiBAQAogCWF0b21pY190IGRyb3BwZWQ7CiB9OwogCi0vKgotICogVXNlciBzZXR1cCBzdHJ1Y3R1cmUgcGFzc2VkIHdpdGggQkxLVFJBQ0VTVEFSVAotICovCi1zdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgewotCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsJLyogb3V0cHV0ICovCi0JdTE2IGFjdF9tYXNrOwkJCS8qIGlucHV0ICovCi0JdTMyIGJ1Zl9zaXplOwkJCS8qIGlucHV0ICovCi0JdTMyIGJ1Zl9ucjsJCQkvKiBpbnB1dCAqLwotCXU2NCBzdGFydF9sYmE7Ci0JdTY0IGVuZF9sYmE7Ci0JdTMyIHBpZDsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JT19UUkFDRSkKIGV4dGVybiBpbnQgYmxrX3RyYWNlX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdW5zaWduZWQsIGNoYXIgX191c2VyICopOwogZXh0ZXJuIHZvaWQgYmxrX3RyYWNlX3NodXRkb3duKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogZXh0ZXJuIHZvaWQgX19ibGtfYWRkX3RyYWNlKHN0cnVjdCBibGtfdHJhY2UgKiwgc2VjdG9yX3QsIGludCwgaW50LCB1MzIsIGludCwgaW50LCB2b2lkICopOwpAQCAtMTk1LDYgKzIwMiw5IEBACiAJaWYgKGxpa2VseSghYnQpKQogCQlyZXR1cm47CiAKKwlpZiAoYmxrX2Rpc2NhcmRfcnEocnEpKQorCQlydyB8PSAoMSA8PCBCSU9fUldfRElTQ0FSRCk7CisKIAlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7CiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfUEMpOwogCQlfX2Jsa19hZGRfdHJhY2UoYnQsIDAsIHJxLT5kYXRhX2xlbiwgcncsIHdoYXQsIHJxLT5lcnJvcnMsIHNpemVvZihycS0+Y21kKSwgcnEtPmNtZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAppbmRleCBjOThkZDdjLi4zMDkzNGU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKQEAgLTMyNiw3ICszMjYsOCBAQAogCSAqLwogCXZvaWQgKCptbV9vd25lcl9jaGFuZ2VkKShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkJCXN0cnVjdCBjZ3JvdXAgKm9sZCwKLQkJCQkJc3RydWN0IGNncm91cCAqbmV3KTsKKwkJCQkJc3RydWN0IGNncm91cCAqbmV3LAorCQkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCWludCBzdWJzeXNfaWQ7CiAJaW50IGFjdGl2ZTsKIAlpbnQgZGlzYWJsZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay5oIGIvaW5jbHVkZS9saW51eC9jbGsuaAppbmRleCA1Y2E4YzZmLi43Nzg3NzczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsay5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xrLmgKQEAgLTM1LDYgKzM1LDggQEAKICAqIGNsa19nZXQgbWF5IHJldHVybiBkaWZmZXJlbnQgY2xvY2sgcHJvZHVjZXJzIGRlcGVuZGluZyBvbiBAZGV2LikKICAqCiAgKiBEcml2ZXJzIG11c3QgYXNzdW1lIHRoYXQgdGhlIGNsb2NrIHNvdXJjZSBpcyBub3QgZW5hYmxlZC4KKyAqCisgKiBjbGtfZ2V0IHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGludGVycnVwdCBjb250ZXh0LgogICovCiBzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpOwogCkBAIC03Niw2ICs3OCw4IEBACiAgKiBOb3RlOiBkcml2ZXJzIG11c3QgZW5zdXJlIHRoYXQgYWxsIGNsa19lbmFibGUgY2FsbHMgbWFkZSBvbiB0aGlzCiAgKiBjbG9jayBzb3VyY2UgYXJlIGJhbGFuY2VkIGJ5IGNsa19kaXNhYmxlIGNhbGxzIHByaW9yIHRvIGNhbGxpbmcKICAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogY2xrX3B1dCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQgY29udGV4dC4KICAqLwogdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsayk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKaW5kZXggYzMzYjBkYy4uZWQzYTVkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKQEAgLTEyNyw2ICsxMjcsOCBAQAogZXh0ZXJuIGludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKIAkJCQkgICAgIGt0aW1lX3QgZXhwaXJlcywga3RpbWVfdCBub3cpOwogCitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19oYW5kbGVfbm9vcChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKIGV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NudDMyX3RvXzYzLmggYi9pbmNsdWRlL2xpbnV4L2NudDMyX3RvXzYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwZjk1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY250MzJfdG9fNjMuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogIEV4dGVuZCBhIDMyLWJpdCBjb3VudGVyIHRvIDYzIGJpdHMKKyAqCisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJRGVjZW1iZXIgMywgMjAwNgorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0NOVDMyX1RPXzYzX0hfXworI2RlZmluZSBfX0xJTlVYX0NOVDMyX1RPXzYzX0hfXworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogdGhpcyBpcyB1c2VkIG9ubHkgdG8gZ2l2ZSBnY2MgYSBjbHVlIGFib3V0IGdvb2QgY29kZSBnZW5lcmF0aW9uICovCit1bmlvbiBjbnQzMl90b182MyB7CisJc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwkJdTMyIGxvLCBoaTsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCQl1MzIgaGksIGxvOworI2VuZGlmCisJfTsKKwl1NjQgdmFsOworfTsKKworCisvKioKKyAqIGNudDMyX3RvXzYzIC0gRXhwYW5kIGEgMzItYml0IGNvdW50ZXIgdG8gYSA2My1iaXQgY291bnRlcgorICogQGNudF9sbzogVGhlIGxvdyBwYXJ0IG9mIHRoZSBjb3VudGVyCisgKgorICogTWFueSBoYXJkd2FyZSBjbG9jayBjb3VudGVycyBhcmUgb25seSAzMiBiaXRzIHdpZGUgYW5kIHRoZXJlZm9yZSBoYXZlCisgKiBhIHJlbGF0aXZlbHkgc2hvcnQgcGVyaW9kIG1ha2luZyB3cmFwLWFyb3VuZHMgcmF0aGVyIGZyZXF1ZW50LiAgVGhpcworICogaXMgYSBwcm9ibGVtIHdoZW4gaW1wbGVtZW50aW5nIHNjaGVkX2Nsb2NrKCkgZm9yIGV4YW1wbGUsIHdoZXJlIGEgNjQtYml0CisgKiBub24td3JhcHBpbmcgbW9ub3RvbmljIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIHJldHVybmVkLgorICoKKyAqIFRvIG92ZXJjb21lIHRoYXQgbGltaXRhdGlvbiwgbGV0J3MgZXh0ZW5kIGEgMzItYml0IGNvdW50ZXIgdG8gNjMgYml0cworICogaW4gYSBjb21wbGV0ZWx5IGxvY2sgZnJlZSBmYXNoaW9uLiBCaXRzIDAgdG8gMzEgb2YgdGhlIGNsb2NrIGFyZSBwcm92aWRlZAorICogYnkgdGhlIGhhcmR3YXJlIHdoaWxlIGJpdHMgMzIgdG8gNjIgYXJlIHN0b3JlZCBpbiBtZW1vcnkuICBUaGUgdG9wIGJpdCBpbgorICogbWVtb3J5IGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgaGFyZHdhcmUgY2xvY2sgaGFsZi1wZXJpb2QuICBXaGVuCisgKiB0aGUgdG9wIGJpdCBvZiBib3RoIGNvdW50ZXJzIChoYXJkd2FyZSBhbmQgaW4gbWVtb3J5KSBkaWZmZXIgdGhlbiB0aGUKKyAqIG1lbW9yeSBpcyB1cGRhdGVkIHdpdGggYSBuZXcgdmFsdWUsIGluY3JlbWVudGluZyBpdCB3aGVuIHRoZSBoYXJkd2FyZQorICogY291bnRlciB3cmFwcyBhcm91bmQuCisgKgorICogQmVjYXVzZSBhIHdvcmQgc3RvcmUgaW4gbWVtb3J5IGlzIGF0b21pYyB0aGVuIHRoZSBpbmNyZW1lbnRlZCB2YWx1ZSB3aWxsCisgKiBhbHdheXMgYmUgaW4gc3luY2ggd2l0aCB0aGUgdG9wIGJpdCBpbmRpY2F0aW5nIHRvIGFueSBwb3RlbnRpYWwgY29uY3VycmVudAorICogcmVhZGVyIGlmIHRoZSB2YWx1ZSBpbiBtZW1vcnkgaXMgdXAgdG8gZGF0ZSBvciBub3Qgd2l0aCByZWdhcmRzIHRvIHRoZQorICogbmVlZGVkIGluY3JlbWVudC4gIEFuZCBhbnkgcmFjZSBpbiB1cGRhdGluZyB0aGUgdmFsdWUgaW4gbWVtb3J5IGlzIGhhcm1sZXNzCisgKiBhcyB0aGUgc2FtZSB2YWx1ZSB3b3VsZCBzaW1wbHkgYmUgc3RvcmVkIG1vcmUgdGhhbiBvbmNlLgorICoKKyAqIFRoZSBvbmx5IHJlc3RyaWN0aW9uIGZvciB0aGUgYWxnb3JpdGhtIHRvIHdvcmsgcHJvcGVybHkgaXMgdGhhdCB0aGlzCisgKiBjb2RlIG11c3QgYmUgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSBwZXIgZWFjaCBoYWxmIHBlcmlvZCBvZiB0aGUgMzItYml0CisgKiBjb3VudGVyIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgc3RhdGUgYml0IGluIG1lbW9yeS4gVGhpcyBpcyB1c3VhbGx5IG5vdCBhCisgKiBwcm9ibGVtIGluIHByYWN0aWNlLCBidXQgaWYgaXQgaXMgdGhlbiBhIGtlcm5lbCB0aW1lciBjb3VsZCBiZSBzY2hlZHVsZWQKKyAqIHRvIG1hbmFnZSBmb3IgdGhpcyBjb2RlIHRvIGJlIGV4ZWN1dGVkIG9mdGVuIGVub3VnaC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHRvcCBiaXQgKGJpdCA2MykgaW4gdGhlIHJldHVybmVkIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkCisgKiBhcyBnYXJiYWdlLiAgSXQgaXMgbm90IGNsZWFyZWQgaGVyZSBiZWNhdXNlIGNhbGxlcnMgYXJlIGxpa2VseSB0byB1c2UgYQorICogbXVsdGlwbGllciBvbiB0aGUgcmV0dXJuZWQgdmFsdWUgd2hpY2ggY2FuIGdldCByaWQgb2YgdGhlIHRvcCBiaXQKKyAqIGltcGxpY2l0bHkgYnkgbWFraW5nIHRoZSBtdWx0aXBsaWVyIGV2ZW4sIHRoZXJlZm9yZSBzYXZpbmcgb24gYSBydW50aW1lCisgKiBjbGVhci1iaXQgaW5zdHJ1Y3Rpb24uIE90aGVyd2lzZSBjYWxsZXIgbXVzdCByZW1lbWJlciB0byBjbGVhciB0aGUgdG9wCisgKiBiaXQgZXhwbGljaXRseS4KKyAqLworI2RlZmluZSBjbnQzMl90b182MyhjbnRfbG8pIFwKKyh7IFwKKwlzdGF0aWMgdm9sYXRpbGUgdTMyIF9fbV9jbnRfaGk7IFwKKwl1bmlvbiBjbnQzMl90b182MyBfX3g7IFwKKwlfX3guaGkgPSBfX21fY250X2hpOyBcCisJX194LmxvID0gKGNudF9sbyk7IFwKKwlpZiAodW5saWtlbHkoKHMzMikoX194LmhpIF4gX194LmxvKSA8IDApKSBcCisJCV9fbV9jbnRfaGkgPSBfX3guaGkgPSAoX194LmhpIF4gMHg4MDAwMDAwMCkgKyAoX194LmhpID4+IDMxKTsgXAorCV9feC52YWw7IFwKK30pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggY2Y4ZDExYy4uZjA2MWExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC03OCw3ICs3OCw2IEBACiAJY29tcGF0X3NpZ3NldF93b3JkCXNpZ1tfQ09NUEFUX05TSUdfV09SRFNdOwogfSBjb21wYXRfc2lnc2V0X3Q7CiAKLWV4dGVybiBpbnQgY3BfY29tcGF0X3N0YXQoc3RydWN0IGtzdGF0ICosIHN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKik7CiBleHRlcm4gaW50IGdldF9jb21wYXRfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwogZXh0ZXJuIGludCBwdXRfY29tcGF0X3RpbWVzcGVjKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKTsKIApAQCAtMjM1LDYgKzIzNCwxMSBAQAogZXh0ZXJuIGludCBwdXRfY29tcGF0X2l0aW1lcnNwZWMoc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqZHN0LAogCQkJCSBjb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyAqc3JjKTsKIAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAorCQlzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eik7Cithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZXR0aW1lb2ZkYXkoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHYsCisJCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KTsKKwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfYWRqdGltZXgoc3RydWN0IGNvbXBhdF90aW1leCBfX3VzZXIgKnV0cCk7CiAKIGV4dGVybiBpbnQgY29tcGF0X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKaW5kZXggYzhiZDJkYS4uODMyMjE0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaApAQCAtMTkwLDcgKzE5MCw5IEBACiAgKiBBQ0NFU1NfT05DRSgpIGluIGRpZmZlcmVudCBDIHN0YXRlbWVudHMuCiAgKgogICogVGhpcyBtYWNybyBkb2VzIGFic29sdXRlbHkgLW5vdGhpbmctIHRvIHByZXZlbnQgdGhlIENQVSBmcm9tIHJlb3JkZXJpbmcsCi0gKiBtZXJnaW5nLCBvciByZWZldGNoaW5nIGFic29sdXRlbHkgYW55dGhpbmcgYXQgYW55IHRpbWUuCisgKiBtZXJnaW5nLCBvciByZWZldGNoaW5nIGFic29sdXRlbHkgYW55dGhpbmcgYXQgYW55IHRpbWUuICBJdHMgbWFpbiBpbnRlbmRlZAorICogdXNlIGlzIHRvIG1lZGlhdGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3MtbGV2ZWwgY29kZSBhbmQgaXJxL05NSQorICogaGFuZGxlcnMsIGFsbCBydW5uaW5nIG9uIHRoZSBzYW1lIENQVS4KICAqLwogI2RlZmluZSBBQ0NFU1NfT05DRSh4KSAoKih2b2xhdGlsZSB0eXBlb2YoeCkgKikmKHgpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBsZXRpb24uaCBiL2luY2x1ZGUvbGludXgvY29tcGxldGlvbi5oCmluZGV4IDAyZWY4ODMuLjRhNmI2MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGxldGlvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGxldGlvbi5oCkBAIC0xMCw2ICsxMCwxOCBAQAogCiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCisvKioKKyAqIHN0cnVjdCBjb21wbGV0aW9uIC0gc3RydWN0dXJlIHVzZWQgdG8gbWFpbnRhaW4gc3RhdGUgZm9yIGEgImNvbXBsZXRpb24iCisgKgorICogVGhpcyBpcyB0aGUgb3BhcXVlIHN0cnVjdHVyZSB1c2VkIHRvIG1haW50YWluIHRoZSBzdGF0ZSBmb3IgYSAiY29tcGxldGlvbiIuCisgKiBDb21wbGV0aW9ucyBjdXJyZW50bHkgdXNlIGEgRklGTyB0byBxdWV1ZSB0aHJlYWRzIHRoYXQgaGF2ZSB0byB3YWl0IGZvcgorICogdGhlICJjb21wbGV0aW9uIiBldmVudC4KKyAqCisgKiBTZWUgYWxzbzogIGNvbXBsZXRlKCksIHdhaXRfZm9yX2NvbXBsZXRpb24oKSAoYW5kIGZyaWVuZHMgX3RpbWVvdXQsCisgKiBfaW50ZXJydXB0aWJsZSwgX2ludGVycnVwdGlibGVfdGltZW91dCwgYW5kIF9raWxsYWJsZSksIGluaXRfY29tcGxldGlvbigpLAorICogYW5kIG1hY3JvcyBERUNMQVJFX0NPTVBMRVRJT04oKSwgREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soKSwgYW5kCisgKiBJTklUX0NPTVBMRVRJT04oKS4KKyAqLwogc3RydWN0IGNvbXBsZXRpb24gewogCXVuc2lnbmVkIGludCBkb25lOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CkBAIC0yMSw2ICszMywxNCBAQAogI2RlZmluZSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSX09OU1RBQ0sod29yaykgXAogCSh7IGluaXRfY29tcGxldGlvbigmd29yayk7IHdvcms7IH0pCiAKKy8qKgorICogREVDTEFSRV9DT01QTEVUSU9OOiAtIGRlY2xhcmUgYW5kIGluaXRpYWxpemUgYSBjb21wbGV0aW9uIHN0cnVjdHVyZQorICogQHdvcms6ICBpZGVudGlmaWVyIGZvciB0aGUgY29tcGxldGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIG1hY3JvIGRlY2xhcmVzIGFuZCBpbml0aWFsaXplcyBhIGNvbXBsZXRpb24gc3RydWN0dXJlLiBHZW5lcmFsbHkgdXNlZAorICogZm9yIHN0YXRpYyBkZWNsYXJhdGlvbnMuIFlvdSBzaG91bGQgdXNlIHRoZSBfT05TVEFDSyB2YXJpYW50IGZvciBhdXRvbWF0aWMKKyAqIHZhcmlhYmxlcy4KKyAqLwogI2RlZmluZSBERUNMQVJFX0NPTVBMRVRJT04od29yaykgXAogCXN0cnVjdCBjb21wbGV0aW9uIHdvcmsgPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSKHdvcmspCiAKQEAgLTI5LDYgKzQ5LDEzIEBACiAgKiBjb21wbGV0aW9ucyAtIHNvIHdlIHVzZSB0aGUgX09OU1RBQ0soKSB2YXJpYW50IGZvciB0aG9zZSB0aGF0CiAgKiBhcmUgb24gdGhlIGtlcm5lbCBzdGFjazoKICAqLworLyoqCisgKiBERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSzogLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgY29tcGxldGlvbiBzdHJ1Y3R1cmUKKyAqIEB3b3JrOiAgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBsZXRpb24gc3RydWN0dXJlCisgKgorICogVGhpcyBtYWNybyBkZWNsYXJlcyBhbmQgaW5pdGlhbGl6ZXMgYSBjb21wbGV0aW9uIHN0cnVjdHVyZSBvbiB0aGUga2VybmVsCisgKiBzdGFjay4KKyAqLwogI2lmZGVmIENPTkZJR19MT0NLREVQCiAjIGRlZmluZSBERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3b3JrKSBcCiAJc3RydWN0IGNvbXBsZXRpb24gd29yayA9IENPTVBMRVRJT05fSU5JVElBTElaRVJfT05TVEFDSyh3b3JrKQpAQCAtMzYsNiArNjMsMTMgQEAKICMgZGVmaW5lIERFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdvcmspIERFQ0xBUkVfQ09NUExFVElPTih3b3JrKQogI2VuZGlmCiAKKy8qKgorICogaW5pdF9jb21wbGV0aW9uOiAtIEluaXRpYWxpemUgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY29tcGxldGlvbgorICogQHg6ICBjb21wbGV0aW9uIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIGluaXRpYWxpemVkCisgKgorICogVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgY3JlYXRlZCBjb21wbGV0aW9uCisgKiBzdHJ1Y3R1cmUuCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2NvbXBsZXRpb24oc3RydWN0IGNvbXBsZXRpb24gKngpCiB7CiAJeC0+ZG9uZSA9IDA7CkBAIC01NSw2ICs4OSwxMyBAQAogZXh0ZXJuIHZvaWQgY29tcGxldGUoc3RydWN0IGNvbXBsZXRpb24gKik7CiBleHRlcm4gdm9pZCBjb21wbGV0ZV9hbGwoc3RydWN0IGNvbXBsZXRpb24gKik7CiAKKy8qKgorICogSU5JVF9DT01QTEVUSU9OOiAtIHJlaW5pdGlhbGl6ZSBhIGNvbXBsZXRpb24gc3RydWN0dXJlCisgKiBAeDogIGNvbXBsZXRpb24gc3RydWN0dXJlIHRvIGJlIHJlaW5pdGlhbGl6ZWQKKyAqCisgKiBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIHJlaW5pdGlhbGl6ZSBhIGNvbXBsZXRpb24gc3RydWN0dXJlIHNvIGl0IGNhbgorICogYmUgcmV1c2VkLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGFmdGVyIGNvbXBsZXRlX2FsbCgpIGlzIHVzZWQuCisgKi8KICNkZWZpbmUgSU5JVF9DT01QTEVUSU9OKHgpCSgoeCkuZG9uZSA9IDApCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlX3N0cnVjdC5oIGIvaW5jbHVkZS9saW51eC9jb25zb2xlX3N0cnVjdC5oCmluZGV4IGIwM2Y4MGEuLmQ3MWY3YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29uc29sZV9zdHJ1Y3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGVfc3RydWN0LmgKQEAgLTUzLDcgKzUzLDYgQEAKIAl1bnNpZ25lZCBzaG9ydAl2Y19oaV9mb250X21hc2s7CS8qIFsjXSBBdHRyaWJ1dGUgc2V0IGZvciB1cHBlciAyNTYgY2hhcnMgb2YgZm9udCBvciAwIGlmIG5vdCBzdXBwb3J0ZWQgKi8KIAlzdHJ1Y3QgY29uc29sZV9mb250IHZjX2ZvbnQ7CQkvKiBDdXJyZW50IFZDIGZvbnQgc2V0ICovCiAJdW5zaWduZWQgc2hvcnQJdmNfdmlkZW9fZXJhc2VfY2hhcjsJLyogQmFja2dyb3VuZCBlcmFzZSBjaGFyYWN0ZXIgKi8KLQl1bnNpZ25lZCBzaG9ydAl2Y19zY3JsX2VyYXNlX2NoYXI7CS8qIEVyYXNlIGNoYXJhY3RlciBmb3Igc2Nyb2xsICovCiAJLyogVlQgdGVybWluYWwgZGF0YSAqLwogCXVuc2lnbmVkIGludAl2Y19zdGF0ZTsJCS8qIEVzY2FwZSBzZXF1ZW5jZSBwYXJzZXIgc3RhdGUgKi8KIAl1bnNpZ25lZCBpbnQJdmNfbnBhcix2Y19wYXJbTlBBUl07CS8qIFBhcmFtZXRlcnMgb2YgY3VycmVudCBlc2NhcGUgc2VxdWVuY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IGQ3ZmFmODguLmMyNzQ3YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtNjksNiArNjksNyBAQAogI2VuZGlmCiAKIGludCBjcHVfdXAodW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIG5vdGlmeV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSk7CiBleHRlcm4gdm9pZCBjcHVfaG90cGx1Z19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY3B1X21hcHNfdXBkYXRlX2JlZ2luKHZvaWQpOwogZXh0ZXJuIHZvaWQgY3B1X21hcHNfdXBkYXRlX2RvbmUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDZmZDU2NjguLjFlZTYwOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC0xODcsNyArMTg3LDggQEAKIAkJCQkgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pOwogCiAKLWV4dGVybiBpbnQgX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworZXh0ZXJuIGludCBfX2NwdWZyZXFfZHJpdmVyX2dldGF2ZyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KTsKIAogaW50IGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmdvdmVybm9yKTsKIHZvaWQgY3B1ZnJlcV91bnJlZ2lzdGVyX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpnb3Zlcm5vcik7CkBAIC0yMjYsNyArMjI3LDkgQEAKIAl1bnNpZ25lZCBpbnQJKCpnZXQpCSh1bnNpZ25lZCBpbnQgY3B1KTsKIAogCS8qIG9wdGlvbmFsICovCi0JdW5zaWduZWQgaW50ICgqZ2V0YXZnKQkodW5zaWduZWQgaW50IGNwdSk7CisJdW5zaWduZWQgaW50ICgqZ2V0YXZnKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJIHVuc2lnbmVkIGludCBjcHUpOworCiAJaW50CSgqZXhpdCkJCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CiAJaW50CSgqc3VzcGVuZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZyk7CiAJaW50CSgqcmVzdW1lKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaCBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKaW5kZXggZThmNDUwYy4uMjY5MTkyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHJlYnVpbGRfc2NoZWRfZG9tYWlucyh2b2lkKQogewotCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKDAsIE5VTEwsIE5VTEwpOworCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKDEsIE5VTEwsIE5VTEwpOwogfQogCiAjZW5kaWYgLyogIUNPTkZJR19DUFVTRVRTICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaAppbmRleCBjNDNkYzQ3Li4zZDIzMTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCisrKyBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwOAogI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfSEFTSAkJMHgwMDAwMDAwOQogI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQUhBU0gJCTB4MDAwMDAwMGEKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX1JORwkJMHgwMDAwMDAwYwogCiAjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9IQVNIX01BU0sJMHgwMDAwMDAwZQogI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQUhBU0hfTUFTSwkweDAwMDAwMDBjCkBAIC02MSw2ICs2MiwxNCBAQAogI2RlZmluZSBDUllQVE9fQUxHX0dFTklWCQkweDAwMDAwMjAwCiAKIC8qCisgKiBTZXQgaWYgdGhlIGFsZ29yaXRobSBoYXMgcGFzc2VkIGF1dG9tYXRlZCBydW4tdGltZSB0ZXN0aW5nLiAgTm90ZSB0aGF0CisgKiBpZiB0aGVyZSBpcyBubyBydW4tdGltZSB0ZXN0aW5nIGZvciBhIGdpdmVuIGFsZ29yaXRobSBpdCBpcyBjb25zaWRlcmVkCisgKiB0byBoYXZlIHBhc3NlZC4KKyAqLworCisjZGVmaW5lIENSWVBUT19BTEdfVEVTVEVECQkweDAwMDAwNDAwCisKKy8qCiAgKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAgKi8KICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMApAQCAtMTA1LDYgKzExNCw3IEBACiBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlcjsKIHN0cnVjdCBjcnlwdG9faGFzaDsKIHN0cnVjdCBjcnlwdG9fYWhhc2g7CitzdHJ1Y3QgY3J5cHRvX3JuZzsKIHN0cnVjdCBjcnlwdG9fdGZtOwogc3RydWN0IGNyeXB0b190eXBlOwogc3RydWN0IGFlYWRfZ2l2Y3J5cHRfcmVxdWVzdDsKQEAgLTI5MCw2ICszMDAsMTUgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGludCBzbGVuLCB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwogfTsKIAorc3RydWN0IHJuZ19hbGcgeworCWludCAoKnJuZ19tYWtlX3JhbmRvbSkoc3RydWN0IGNyeXB0b19ybmcgKnRmbSwgdTggKnJkYXRhLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkbGVuKTsKKwlpbnQgKCpybmdfcmVzZXQpKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbik7CisKKwl1bnNpZ25lZCBpbnQgc2VlZHNpemU7Cit9OworCisKICNkZWZpbmUgY3JhX2FibGtjaXBoZXIJY3JhX3UuYWJsa2NpcGhlcgogI2RlZmluZSBjcmFfYWVhZAljcmFfdS5hZWFkCiAjZGVmaW5lIGNyYV9ibGtjaXBoZXIJY3JhX3UuYmxrY2lwaGVyCkBAIC0yOTgsNiArMzE3LDcgQEAKICNkZWZpbmUgY3JhX2hhc2gJY3JhX3UuaGFzaAogI2RlZmluZSBjcmFfYWhhc2gJY3JhX3UuYWhhc2gKICNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCisjZGVmaW5lIGNyYV9ybmcJCWNyYV91LnJuZwogCiBzdHJ1Y3QgY3J5cHRvX2FsZyB7CiAJc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKQEAgLTMyNSw2ICszNDUsNyBAQAogCQlzdHJ1Y3QgaGFzaF9hbGcgaGFzaDsKIAkJc3RydWN0IGFoYXNoX2FsZyBhaGFzaDsKIAkJc3RydWN0IGNvbXByZXNzX2FsZyBjb21wcmVzczsKKwkJc3RydWN0IHJuZ19hbGcgcm5nOwogCX0gY3JhX3U7CiAKIAlpbnQgKCpjcmFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CkBAIC00MzAsNiArNDUxLDEyIEBACiAJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CiB9OwogCitzdHJ1Y3Qgcm5nX3RmbSB7CisJaW50ICgqcm5nX2dlbl9yYW5kb20pKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpyZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBkbGVuKTsKKwlpbnQgKCpybmdfcmVzZXQpKHN0cnVjdCBjcnlwdG9fcm5nICp0Zm0sIHU4ICpzZWVkLCB1bnNpZ25lZCBpbnQgc2xlbik7Cit9OworCiAjZGVmaW5lIGNydF9hYmxrY2lwaGVyCWNydF91LmFibGtjaXBoZXIKICNkZWZpbmUgY3J0X2FlYWQJY3J0X3UuYWVhZAogI2RlZmluZSBjcnRfYmxrY2lwaGVyCWNydF91LmJsa2NpcGhlcgpAQCAtNDM3LDYgKzQ2NCw3IEBACiAjZGVmaW5lIGNydF9oYXNoCWNydF91Lmhhc2gKICNkZWZpbmUgY3J0X2FoYXNoCWNydF91LmFoYXNoCiAjZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcworI2RlZmluZSBjcnRfcm5nCQljcnRfdS5ybmcKIAogc3RydWN0IGNyeXB0b190Zm0gewogCkBAIC00NTAsNiArNDc4LDcgQEAKIAkJc3RydWN0IGhhc2hfdGZtIGhhc2g7CiAJCXN0cnVjdCBhaGFzaF90Zm0gYWhhc2g7CiAJCXN0cnVjdCBjb21wcmVzc190Zm0gY29tcHJlc3M7CisJCXN0cnVjdCBybmdfdGZtIHJuZzsKIAl9IGNydF91OwogCQogCXN0cnVjdCBjcnlwdG9fYWxnICpfX2NydF9hbGc7CkBAIC00ODEsNiArNTEwLDEwIEBACiAJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKIH07CiAKK3N0cnVjdCBjcnlwdG9fcm5nIHsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSBiYXNlOworfTsKKwogZW51bSB7CiAJQ1JZUFRPQV9VTlNQRUMsCiAJQ1JZUFRPQV9BTEcsCkBAIC01MTUsNiArNTQ4LDggQEAKIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfYmFzZShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKIHZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogCitpbnQgYWxnX3Rlc3QoY29uc3QgY2hhciAqZHJpdmVyLCBjb25zdCBjaGFyICphbGcsIHUzMiB0eXBlLCB1MzIgbWFzayk7CisKIC8qCiAgKiBUcmFuc2Zvcm0gaGVscGVycyB3aGljaCBxdWVyeSB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggYTkwMjIyZS4uMDhkNzgzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTEzLDcgKzEzLDYgQEAKIAogc3RydWN0IGRtX3RhcmdldDsKIHN0cnVjdCBkbV90YWJsZTsKLXN0cnVjdCBkbV9kZXY7CiBzdHJ1Y3QgbWFwcGVkX2RldmljZTsKIHN0cnVjdCBiaW9fdmVjOwogCkBAIC04NCw2ICs4MywxMiBAQAogICovCiB2b2lkIGRtX3NldF9kZXZpY2VfbGltaXRzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIAorc3RydWN0IGRtX2RldiB7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgbW9kZTsKKwljaGFyIG5hbWVbMTZdOworfTsKKwogLyoKICAqIENvbnN0cnVjdG9ycyBzaG91bGQgY2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gZW5zdXJlIGRlc3RpbmF0aW9uIGRldmljZXMKICAqIGFyZSBvcGVuZWQvY2xvc2VkIGNvcnJlY3RseS4KQEAgLTIwMiw2ICsyMDcsNyBAQAogc3RydWN0IGdlbmRpc2sgKmRtX2Rpc2soc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIGludCBkbV9zdXNwZW5kZWQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIGludCBkbV9ub2ZsdXNoX3N1c3BlbmRpbmcoc3RydWN0IGRtX3RhcmdldCAqdGkpOwordW5pb24gbWFwX2luZm8gKmRtX2dldF9tYXBpbmZvKHN0cnVjdCBiaW8gKmJpbyk7CiAKIC8qCiAgKiBHZW9tZXRyeSBmdW5jdGlvbnMuCkBAIC0yMzIsNiArMjM4LDExIEBACiBpbnQgZG1fdGFibGVfY29tcGxldGUoc3RydWN0IGRtX3RhYmxlICp0KTsKIAogLyoKKyAqIFVucGx1ZyBhbGwgZGV2aWNlcyBpbiBhIHRhYmxlLgorICovCit2b2lkIGRtX3RhYmxlX3VucGx1Z19hbGwoc3RydWN0IGRtX3RhYmxlICp0KTsKKworLyoKICAqIFRhYmxlIHJlZmVyZW5jZSBjb3VudGluZy4KICAqLwogc3RydWN0IGRtX3RhYmxlICpkbV9nZXRfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKQEAgLTI1Niw2ICsyNjcsMTEgQEAKICAqLwogaW50IGRtX3N3YXBfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBzdHJ1Y3QgZG1fdGFibGUgKnQpOwogCisvKgorICogQSB3cmFwcGVyIGFyb3VuZCB2bWFsbG9jLgorICovCit2b2lkICpkbV92Y2FsbG9jKHVuc2lnbmVkIGxvbmcgbm1lbWIsIHVuc2lnbmVkIGxvbmcgZWxlbV9zaXplKTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTWFjcm9zLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggNGQ4MzcyZC4uOTg3ZjU5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC05MCw2ICs5MCw5IEBACiAJCQkJICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqc3RhcnQsIHZvaWQgKmRhdGEsCiAJCQkJICBpbnQgKCpmbikoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgdm9pZCAqKSk7CiAKK3ZvaWQgYnVzX3NvcnRfYnJlYWR0aGZpcnN0KHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJICAgaW50ICgqY29tcGFyZSkoY29uc3Qgc3RydWN0IGRldmljZSAqYSwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpiKSk7CiAvKgogICogQnVzIG5vdGlmaWVyczogR2V0IG5vdGlmaWVkIG9mIGFkZGl0aW9uL3JlbW92YWwgb2YgZGV2aWNlcwogICogYW5kIGJpbmRpbmcvdW5iaW5kaW5nIG9mIGRyaXZlcnMgdG8gZGV2aWNlcy4KQEAgLTE5OSw2ICsyMDIsMTEgQEAKIAlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqcDsKIH07CiAKK3N0cnVjdCBjbGFzc19kZXZfaXRlciB7CisJc3RydWN0IGtsaXN0X2l0ZXIJCWtpOworCWNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZQkqdHlwZTsKK307CisKIGV4dGVybiBzdHJ1Y3Qga29iamVjdCAqc3lzZnNfZGV2X2Jsb2NrX2tvYmo7CiBleHRlcm4gc3RydWN0IGtvYmplY3QgKnN5c2ZzX2Rldl9jaGFyX2tvYmo7CiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX2NsYXNzX3JlZ2lzdGVyKHN0cnVjdCBjbGFzcyAqY2xhc3MsCkBAIC0yMTMsNiArMjIxLDEzIEBACiAJX19jbGFzc19yZWdpc3RlcihjbGFzcywgJl9fa2V5KTsJXAogfSkKIAorZXh0ZXJuIHZvaWQgY2xhc3NfZGV2X2l0ZXJfaW5pdChzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIsCisJCQkJc3RydWN0IGNsYXNzICpjbGFzcywKKwkJCQlzdHJ1Y3QgZGV2aWNlICpzdGFydCwKKwkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUpOworZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKmNsYXNzX2Rldl9pdGVyX25leHQoc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyKTsKK2V4dGVybiB2b2lkIGNsYXNzX2Rldl9pdGVyX2V4aXQoc3RydWN0IGNsYXNzX2Rldl9pdGVyICppdGVyKTsKKwogZXh0ZXJuIGludCBjbGFzc19mb3JfZWFjaF9kZXZpY2Uoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGRldmljZSAqc3RhcnQsCiAJCQkJIHZvaWQgKmRhdGEsCiAJCQkJIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpKTsKQEAgLTM5Niw3ICs0MTEsNyBAQAogCXNwaW5sb2NrX3QJCWRldnJlc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJZGV2cmVzX2hlYWQ7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IGtsaXN0X25vZGUJa25vZGVfY2xhc3M7CiAJc3RydWN0IGNsYXNzCQkqY2xhc3M7CiAJZGV2X3QJCQlkZXZ0OwkvKiBkZXZfdCwgY3JlYXRlcyB0aGUgc3lzZnMgImRldiIgKi8KIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCSoqZ3JvdXBzOwkvKiBvcHRpb25hbCBncm91cHMgKi8KQEAgLTQ5MCw3ICs1MDUsNiBAQAogCQkJCSAgICBkZXZfdCBkZXZ0LCB2b2lkICpkcnZkYXRhLAogCQkJCSAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIAkJCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNSwgNikpKTsKLSNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9kcnZkYXRhCWRldmljZV9jcmVhdGUKIGV4dGVybiB2b2lkIGRldmljZV9kZXN0cm95KHN0cnVjdCBjbGFzcyAqY2xzLCBkZXZfdCBkZXZ0KTsKIAogLyoKQEAgLTUzOSw3ICs1NTMsMTEgQEAKICNkZWZpbmUgZGV2X2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKIAlkZXZfcHJpbnRrKEtFUk5fSU5GTyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKIAotI2lmZGVmIERFQlVHCisjaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCisjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIC4uLikgZG8geyBcCisJZHluYW1pY19kZXZfZGJnKGRldiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKTsgXAorCX0gd2hpbGUgKDApCisjZWxpZiBkZWZpbmVkKERFQlVHKQogI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCiAJZGV2X3ByaW50ayhLRVJOX0RFQlVHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQogI2Vsc2UKQEAgLTU1NSw2ICs1NzMsMTQgQEAKIAkoeyBpZiAoMCkgZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZvcm1hdCwgIyNhcmcpOyAwOyB9KQogI2VuZGlmCiAKKy8qCisgKiBkZXZfV0FSTigpIGFjdHMgbGlrZSBkZXZfcHJpbnRrKCksIGJ1dCB3aXRoIHRoZSBrZXkgZGlmZmVyZW5jZQorICogb2YgdXNpbmcgYSBXQVJOL1dBUk5fT04gdG8gZ2V0IHRoZSBtZXNzYWdlIG91dCwgaW5jbHVkaW5nIHRoZQorICogZmlsZS9saW5lIGluZm9ybWF0aW9uIGFuZCBhIGJhY2t0cmFjZS4KKyAqLworI2RlZmluZSBkZXZfV0FSTihkZXYsIGZvcm1hdCwgYXJnLi4uKSBcCisJV0FSTigxLCAiRGV2aWNlOiAlc1xuIiBmb3JtYXQsIGRldl9kcml2ZXJfc3RyaW5nKGRldiksICMjIGFyZyk7CisKIC8qIENyZWF0ZSBhbGlhcywgc28gSSBjYW4gYmUgYXV0b2xvYWRlZC4gKi8KICNkZWZpbmUgTU9EVUxFX0FMSUFTX0NIQVJERVYobWFqb3IsbWlub3IpIFwKIAlNT0RVTEVfQUxJQVMoImNoYXItbWFqb3ItIiBfX3N0cmluZ2lmeShtYWpvcikgIi0iIF9fc3RyaW5naWZ5KG1pbm9yKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2cHRzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2RldnB0c19mcy5oCmluZGV4IDE1NDc2OWMuLjVjZTBlNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2cHRzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZwdHNfZnMuaApAQCAtMTcsMjAgKzE3LDMxIEBACiAKICNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKIAotaW50IGRldnB0c19uZXdfaW5kZXgodm9pZCk7Ci12b2lkIGRldnB0c19raWxsX2luZGV4KGludCBpZHgpOwotaW50IGRldnB0c19wdHlfbmV3KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOyAgICAgIC8qIG1rbm9kIGluIGRldnB0cyAqLwotc3RydWN0IHR0eV9zdHJ1Y3QgKmRldnB0c19nZXRfdHR5KGludCBudW1iZXIpOwkgLyogZ2V0IHR0eSBzdHJ1Y3R1cmUgKi8KLXZvaWQgZGV2cHRzX3B0eV9raWxsKGludCBudW1iZXIpOwkJIC8qIHVubGluayAqLworaW50IGRldnB0c19uZXdfaW5kZXgoc3RydWN0IGlub2RlICpwdG14X2lub2RlKTsKK3ZvaWQgZGV2cHRzX2tpbGxfaW5kZXgoc3RydWN0IGlub2RlICpwdG14X2lub2RlLCBpbnQgaWR4KTsKKy8qIG1rbm9kIGluIGRldnB0cyAqLworaW50IGRldnB0c19wdHlfbmV3KHN0cnVjdCBpbm9kZSAqcHRteF9pbm9kZSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisvKiBnZXQgdHR5IHN0cnVjdHVyZSAqLworc3RydWN0IHR0eV9zdHJ1Y3QgKmRldnB0c19nZXRfdHR5KHN0cnVjdCBpbm9kZSAqcHRzX2lub2RlLCBpbnQgbnVtYmVyKTsKKy8qIHVubGluayAqLwordm9pZCBkZXZwdHNfcHR5X2tpbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKICNlbHNlCiAKIC8qIER1bW15IHN0dWJzIGluIHRoZSBuby1wdHkgY2FzZSAqLwotc3RhdGljIGlubGluZSBpbnQgZGV2cHRzX25ld19pbmRleCh2b2lkKSB7IHJldHVybiAtRUlOVkFMOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGV2cHRzX2tpbGxfaW5kZXgoaW50IGlkeCkgeyB9Ci1zdGF0aWMgaW5saW5lIGludCBkZXZwdHNfcHR5X25ldyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSB7IHJldHVybiAtRUlOVkFMOyB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCB0dHlfc3RydWN0ICpkZXZwdHNfZ2V0X3R0eShpbnQgbnVtYmVyKSB7IHJldHVybiBOVUxMOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGV2cHRzX3B0eV9raWxsKGludCBudW1iZXIpIHsgfQorc3RhdGljIGlubGluZSBpbnQgZGV2cHRzX25ld19pbmRleChzdHJ1Y3QgaW5vZGUgKnB0bXhfaW5vZGUpIHsgcmV0dXJuIC1FSU5WQUw7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZwdHNfa2lsbF9pbmRleChzdHJ1Y3QgaW5vZGUgKnB0bXhfaW5vZGUsIGludCBpZHgpIHsgfQorc3RhdGljIGlubGluZSBpbnQgZGV2cHRzX3B0eV9uZXcoc3RydWN0IGlub2RlICpwdG14X2lub2RlLAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCB0dHlfc3RydWN0ICpkZXZwdHNfZ2V0X3R0eShzdHJ1Y3QgaW5vZGUgKnB0c19pbm9kZSwKKwkJaW50IG51bWJlcikKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXZwdHNfcHR5X2tpbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgeyB9CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RsbS5oIGIvaW5jbHVkZS9saW51eC9kbG0uaAppbmRleCAyMDNhMDI1Li5iOWNkMzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RsbS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGxtLmgKQEAgLTIsNyArMiw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgogKiogIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiogIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoqCiAqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCiAqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTY1LDkgKzY1LDEyIEBACiAJY2hhciAqCSBzYl9sdmJwdHI7CiB9OwogCisvKiBkbG1fbmV3X2xvY2tzcGFjZSgpIGZsYWdzICovCisKICNkZWZpbmUgRExNX0xTRkxfTk9ESVIJCTB4MDAwMDAwMDEKICNkZWZpbmUgRExNX0xTRkxfVElNRVdBUk4JMHgwMDAwMDAwMgogI2RlZmluZSBETE1fTFNGTF9GUyAgICAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgRExNX0xTRkxfTkVXRVhDTCAgICAgCTB4MDAwMDAwMDgKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbG1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaAppbmRleCBjNjAzNDUwLi4zMDYwNzgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RsbV9kZXZpY2UuaApAQCAtMjYsNyArMjYsNyBAQAogLyogVmVyc2lvbiBvZiB0aGUgZGV2aWNlIGludGVyZmFjZSAqLwogI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUFKT1IgNgogI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fUEFUQ0ggMAorI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fUEFUQ0ggMQogCiAvKiBzdHJ1Y3QgcGFzc2VkIHRvIHRoZSBsb2NrIHdyaXRlICovCiBzdHJ1Y3QgZGxtX2xvY2tfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCA5NTJlMGY4Li5iYTkxMTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCkBAIC00OCw2ICs0OCwxMSBAQAogCXJldHVybiBkZXYtPmRtYV9tYXNrICE9IE5VTEwgJiYgKmRldi0+ZG1hX21hc2sgIT0gRE1BX01BU0tfTk9ORTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfYnVmZmVyX2RtYV9jYXBhYmxlKHU2NCBtYXNrLCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBhZGRyICsgc2l6ZSA8PSBtYXNrOworfQorCiAjaWZkZWYgQ09ORklHX0hBU19ETUEKICNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KICNlbHNlCkBAIC01OCw2ICs2MywxMyBAQAogI2RlZmluZSBkbWFfc3luY19zaW5nbGUJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1CiAjZGVmaW5lIGRtYV9zeW5jX3NnCQlkbWFfc3luY19zZ19mb3JfY3B1CiAKK3N0YXRpYyBpbmxpbmUgdTY0IGRtYV9nZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldiAmJiBkZXYtPmRtYV9tYXNrICYmICpkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gKmRldi0+ZG1hX21hc2s7CisJcmV0dXJuIERNQV8zMkJJVF9NQVNLOworfQorCiBleHRlcm4gdTY0IGRtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkbWFfZ2V0X21heF9zZWdfc2l6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaApAQCAtMCwwICsxLDE1NyBAQAorI2lmbmRlZiBfRE1BX1JFTUFQUElOR19ICisjZGVmaW5lIF9ETUFfUkVNQVBQSU5HX0gKKworLyoKKyAqIFdlIG5lZWQgYSBmaXhlZCBQQUdFX1NJWkUgb2YgNEsgaXJyZXNwZWN0aXZlIG9mCisgKiBhcmNoIFBBR0VfU0laRSBmb3IgSU9NTVUgcGFnZSB0YWJsZXMuCisgKi8KKyNkZWZpbmUgUEFHRV9TSElGVF80SwkJKDEyKQorI2RlZmluZSBQQUdFX1NJWkVfNEsJCSgxVUwgPDwgUEFHRV9TSElGVF80SykKKyNkZWZpbmUgUEFHRV9NQVNLXzRLCQkoKCh1NjQpLTEpIDw8IFBBR0VfU0hJRlRfNEspCisjZGVmaW5lIFBBR0VfQUxJR05fNEsoYWRkcikJKCgoYWRkcikgKyBQQUdFX1NJWkVfNEsgLSAxKSAmIFBBR0VfTUFTS180SykKKworI2RlZmluZSBJT1ZBX1BGTihhZGRyKQkJKChhZGRyKSA+PiBQQUdFX1NISUZUXzRLKQorI2RlZmluZSBETUFfMzJCSVRfUEZOCQlJT1ZBX1BGTihETUFfMzJCSVRfTUFTSykKKyNkZWZpbmUgRE1BXzY0QklUX1BGTgkJSU9WQV9QRk4oRE1BXzY0QklUX01BU0spCisKKworLyoKKyAqIDA6IFByZXNlbnQKKyAqIDEtMTE6IFJlc2VydmVkCisgKiAxMi02MzogQ29udGV4dCBQdHIgKDEyIC0gKGhhdy0xKSkKKyAqIDY0LTEyNzogUmVzZXJ2ZWQKKyAqLworc3RydWN0IHJvb3RfZW50cnkgeworCXU2NAl2YWw7CisJdTY0CXJzdmQxOworfTsKKyNkZWZpbmUgUk9PVF9FTlRSWV9OUiAoUEFHRV9TSVpFXzRLL3NpemVvZihzdHJ1Y3Qgcm9vdF9lbnRyeSkpCitzdGF0aWMgaW5saW5lIGJvb2wgcm9vdF9wcmVzZW50KHN0cnVjdCByb290X2VudHJ5ICpyb290KQoreworCXJldHVybiAocm9vdC0+dmFsICYgMSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Jvb3RfcHJlc2VudChzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdCkKK3sKKwlyb290LT52YWwgfD0gMTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcm9vdF92YWx1ZShzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlyb290LT52YWwgfD0gdmFsdWUgJiBQQUdFX01BU0tfNEs7Cit9CisKK3N0cnVjdCBjb250ZXh0X2VudHJ5Oworc3RhdGljIGlubGluZSBzdHJ1Y3QgY29udGV4dF9lbnRyeSAqCitnZXRfY29udGV4dF9hZGRyX2Zyb21fcm9vdChzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBjb250ZXh0X2VudHJ5ICopCisJCShyb290X3ByZXNlbnQocm9vdCk/cGh5c190b192aXJ0KAorCQlyb290LT52YWwgJiBQQUdFX01BU0tfNEspOgorCQlOVUxMKTsKK30KKworLyoKKyAqIGxvdyA2NCBiaXRzOgorICogMDogcHJlc2VudAorICogMTogZmF1bHQgcHJvY2Vzc2luZyBkaXNhYmxlCisgKiAyLTM6IHRyYW5zbGF0aW9uIHR5cGUKKyAqIDEyLTYzOiBhZGRyZXNzIHNwYWNlIHJvb3QKKyAqIGhpZ2ggNjQgYml0czoKKyAqIDAtMjogYWRkcmVzcyB3aWR0aAorICogMy02OiBhdmFsCisgKiA4LTIzOiBkb21haW4gaWQKKyAqLworc3RydWN0IGNvbnRleHRfZW50cnkgeworCXU2NCBsbzsKKwl1NjQgaGk7Cit9OworI2RlZmluZSBjb250ZXh0X3ByZXNlbnQoYykgKChjKS5sbyAmIDEpCisjZGVmaW5lIGNvbnRleHRfZmF1bHRfZGlzYWJsZShjKSAoKChjKS5sbyA+PiAxKSAmIDEpCisjZGVmaW5lIGNvbnRleHRfdHJhbnNsYXRpb25fdHlwZShjKSAoKChjKS5sbyA+PiAyKSAmIDMpCisjZGVmaW5lIGNvbnRleHRfYWRkcmVzc19yb290KGMpICgoYykubG8gJiBQQUdFX01BU0tfNEspCisjZGVmaW5lIGNvbnRleHRfYWRkcmVzc193aWR0aChjKSAoKGMpLmhpICYgIDcpCisjZGVmaW5lIGNvbnRleHRfZG9tYWluX2lkKGMpICgoKGMpLmhpID4+IDgpICYgKCgxIDw8IDE2KSAtIDEpKQorCisjZGVmaW5lIGNvbnRleHRfc2V0X3ByZXNlbnQoYykgZG8geyhjKS5sbyB8PSAxO30gd2hpbGUgKDApCisjZGVmaW5lIGNvbnRleHRfc2V0X2ZhdWx0X2VuYWJsZShjKSBcCisJZG8geyhjKS5sbyAmPSAoKCh1NjQpLTEpIDw8IDIpIHwgMTt9IHdoaWxlICgwKQorI2RlZmluZSBjb250ZXh0X3NldF90cmFuc2xhdGlvbl90eXBlKGMsIHZhbCkgXAorCWRvIHsgXAorCQkoYykubG8gJj0gKCgodTY0KS0xKSA8PCA0KSB8IDM7IFwKKwkJKGMpLmxvIHw9ICgodmFsKSAmIDMpIDw8IDI7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBDT05URVhUX1RUX01VTFRJX0xFVkVMIDAKKyNkZWZpbmUgY29udGV4dF9zZXRfYWRkcmVzc19yb290KGMsIHZhbCkgXAorCWRvIHsoYykubG8gfD0gKHZhbCkgJiBQQUdFX01BU0tfNEs7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29udGV4dF9zZXRfYWRkcmVzc193aWR0aChjLCB2YWwpIGRvIHsoYykuaGkgfD0gKHZhbCkgJiA3O30gd2hpbGUgKDApCisjZGVmaW5lIGNvbnRleHRfc2V0X2RvbWFpbl9pZChjLCB2YWwpIFwKKwlkbyB7KGMpLmhpIHw9ICgodmFsKSAmICgoMSA8PCAxNikgLSAxKSkgPDwgODt9IHdoaWxlICgwKQorI2RlZmluZSBjb250ZXh0X2NsZWFyX2VudHJ5KGMpIGRvIHsoYykubG8gPSAwOyAoYykuaGkgPSAwO30gd2hpbGUgKDApCisKKy8qCisgKiAwOiByZWFkYWJsZQorICogMTogd3JpdGFibGUKKyAqIDItNjogcmVzZXJ2ZWQKKyAqIDc6IHN1cGVyIHBhZ2UKKyAqIDgtMTE6IGF2YWlsYWJsZQorICogMTItNjM6IEhvc3QgcGh5c2NpYWwgYWRkcmVzcworICovCitzdHJ1Y3QgZG1hX3B0ZSB7CisJdTY0IHZhbDsKK307CisjZGVmaW5lIGRtYV9jbGVhcl9wdGUocCkJZG8geyhwKS52YWwgPSAwO30gd2hpbGUgKDApCisKKyNkZWZpbmUgRE1BX1BURV9SRUFEICgxKQorI2RlZmluZSBETUFfUFRFX1dSSVRFICgyKQorCisjZGVmaW5lIGRtYV9zZXRfcHRlX3JlYWRhYmxlKHApIGRvIHsocCkudmFsIHw9IERNQV9QVEVfUkVBRDt9IHdoaWxlICgwKQorI2RlZmluZSBkbWFfc2V0X3B0ZV93cml0YWJsZShwKSBkbyB7KHApLnZhbCB8PSBETUFfUFRFX1dSSVRFO30gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9zZXRfcHRlX3Byb3QocCwgcHJvdCkgXAorCQlkbyB7KHApLnZhbCA9ICgocCkudmFsICYgfjMpIHwgKChwcm90KSAmIDMpOyB9IHdoaWxlICgwKQorI2RlZmluZSBkbWFfcHRlX2FkZHIocCkgKChwKS52YWwgJiBQQUdFX01BU0tfNEspCisjZGVmaW5lIGRtYV9zZXRfcHRlX2FkZHIocCwgYWRkcikgZG8ge1wKKwkJKHApLnZhbCB8PSAoKGFkZHIpICYgUEFHRV9NQVNLXzRLKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZG1hX3B0ZV9wcmVzZW50KHApICgoKHApLnZhbCAmIDMpICE9IDApCisKK3N0cnVjdCBpbnRlbF9pb21tdTsKKworc3RydWN0IGRtYXJfZG9tYWluIHsKKwlpbnQJaWQ7CQkJLyogZG9tYWluIGlkICovCisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsJLyogYmFjayBwb2ludGVyIHRvIG93bmluZyBpb21tdSAqLworCisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOyAJLyogYWxsIGRldmljZXMnIGxpc3QgKi8KKwlzdHJ1Y3QgaW92YV9kb21haW4gaW92YWQ7CS8qIGlvdmEncyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbiAqLworCisJc3RydWN0IGRtYV9wdGUJKnBnZDsJCS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCXNwaW5sb2NrX3QJbWFwcGluZ19sb2NrOwkvKiBwYWdlIHRhYmxlIGxvY2sgKi8KKwlpbnQJCWdhdzsJCS8qIG1heCBndWVzdCBhZGRyZXNzIHdpZHRoICovCisKKwkvKiBhZGp1c3RlZCBndWVzdCBhZGRyZXNzIHdpZHRoLCAwIGlzIGxldmVsIDIgMzAtYml0ICovCisJaW50CQlhZ2F3OworCisjZGVmaW5lIERPTUFJTl9GTEFHX01VTFRJUExFX0RFVklDRVMgMQorCWludAkJZmxhZ3M7Cit9OworCisvKiBQQ0kgZG9tYWluLWRldmljZSByZWxhdGlvbnNoaXAgKi8KK3N0cnVjdCBkZXZpY2VfZG9tYWluX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogbGluayB0byBkb21haW4gc2libGluZ3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbDsgLyogbGluayB0byBnbG9iYWwgbGlzdCAqLworCXU4IGJ1czsJCQkvKiBQQ0kgYnVzIG51bWVyICovCisJdTggZGV2Zm47CQkvKiBQQ0kgZGV2Zm4gbnVtYmVyICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsgLyogaXQncyBOVUxMIGZvciBQQ0lFLXRvLVBDSSBicmlkZ2UgKi8KKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbjsgLyogcG9pbnRlciB0byBkb21haW4gKi8KK307CisKK2V4dGVybiBpbnQgaW5pdF9kbWFycyh2b2lkKTsKK2V4dGVybiB2b2lkIGZyZWVfZG1hcl9pb21tdShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKKworZXh0ZXJuIGludCBkbWFyX2Rpc2FibGVkOworCisjaWZuZGVmIENPTkZJR19ETUFSX0dGWF9XQQorc3RhdGljIGlubGluZSB2b2lkIGlvbW11X3ByZXBhcmVfZ2Z4X21hcHBpbmcodm9pZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogIUNPTkZJR19ETUFSX0dGWF9XQSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hci5oIGIvaW5jbHVkZS9saW51eC9kbWFyLmgKaW5kZXggNTZjNzNiOC4uYzM2MGM1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFyLmgKQEAgLTI1LDkgKzI1LDk5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KIAotI2lmZGVmIENPTkZJR19ETUFSCisjaWYgZGVmaW5lZChDT05GSUdfRE1BUikgfHwgZGVmaW5lZChDT05GSUdfSU5UUl9SRU1BUCkKIHN0cnVjdCBpbnRlbF9pb21tdTsKIAorc3RydWN0IGRtYXJfZHJoZF91bml0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIGRyaGQgdW5pdHMJKi8KKwlzdHJ1Y3QgIGFjcGlfZG1hcl9oZWFkZXIgKmhkcjsJLyogQUNQSSBoZWFkZXIJCSovCisJdTY0CXJlZ19iYXNlX2FkZHI7CQkvKiByZWdpc3RlciBiYXNlIGFkZHJlc3MqLworCXN0cnVjdAlwY2lfZGV2ICoqZGV2aWNlczsgCS8qIHRhcmdldCBkZXZpY2UgYXJyYXkJKi8KKwlpbnQJZGV2aWNlc19jbnQ7CQkvKiB0YXJnZXQgZGV2aWNlIGNvdW50CSovCisJdTgJaWdub3JlZDoxOyAJCS8qIGlnbm9yZSBkcmhkCQkqLworCXU4CWluY2x1ZGVfYWxsOjE7CisJc3RydWN0IGludGVsX2lvbW11ICppb21tdTsKK307CisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRtYXJfZHJoZF91bml0czsKKworI2RlZmluZSBmb3JfZWFjaF9kcmhkX3VuaXQoZHJoZCkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJoZCwgJmRtYXJfZHJoZF91bml0cywgbGlzdCkKKworZXh0ZXJuIGludCBkbWFyX3RhYmxlX2luaXQodm9pZCk7CitleHRlcm4gaW50IGVhcmx5X2RtYXJfZGV0ZWN0KHZvaWQpOworZXh0ZXJuIGludCBkbWFyX2Rldl9zY29wZV9pbml0KHZvaWQpOworCisvKiBJbnRlbCBJT01NVSBkZXRlY3Rpb24gKi8KK2V4dGVybiB2b2lkIGRldGVjdF9pbnRlbF9pb21tdSh2b2lkKTsKKworCitleHRlcm4gaW50IHBhcnNlX2lvYXBpY3NfdW5kZXJfaXIodm9pZCk7CitleHRlcm4gaW50IGFsbG9jX2lvbW11KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGV0ZWN0X2ludGVsX2lvbW11KHZvaWQpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFyX3RhYmxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZiAvKiAhQ09ORklHX0RNQVIgJiYgIUNPTkZJR19JTlRSX1JFTUFQICovCisKKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorZXh0ZXJuIGludCBpbnRyX3JlbWFwcGluZ19lbmFibGVkOworZXh0ZXJuIGludCBlbmFibGVfaW50cl9yZW1hcHBpbmcoaW50KTsKKworc3RydWN0IGlydGUgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0CXByZXNlbnQgCTogMSwKKwkJCQlmcGQJCTogMSwKKwkJCQlkc3RfbW9kZQk6IDEsCisJCQkJcmVkaXJfaGludAk6IDEsCisJCQkJdHJpZ2dlcl9tb2RlCTogMSwKKwkJCQlkbHZyeV9tb2RlCTogMywKKwkJCQlhdmFpbAkJOiA0LAorCQkJCV9fcmVzZXJ2ZWRfMQk6IDQsCisJCQkJdmVjdG9yCQk6IDgsCisJCQkJX19yZXNlcnZlZF8yCTogOCwKKwkJCQlkZXN0X2lkCQk6IDMyOworCQl9OworCQlfX3U2NCBsb3c7CisJfTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0CXNpZAkJOiAxNiwKKwkJCQlzcQkJOiAyLAorCQkJCXN2dAkJOiAyLAorCQkJCV9fcmVzZXJ2ZWRfMwk6IDQ0OworCQl9OworCQlfX3U2NCBoaWdoOworCX07Cit9OworZXh0ZXJuIGludCBnZXRfaXJ0ZShpbnQgaXJxLCBzdHJ1Y3QgaXJ0ZSAqZW50cnkpOworZXh0ZXJuIGludCBtb2RpZnlfaXJ0ZShpbnQgaXJxLCBzdHJ1Y3QgaXJ0ZSAqaXJ0ZV9tb2RpZmllZCk7CitleHRlcm4gaW50IGFsbG9jX2lydGUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IGlycSwgdTE2IGNvdW50KTsKK2V4dGVybiBpbnQgc2V0X2lydGVfaXJxKGludCBpcnEsIHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUsIHUxNiBpbmRleCwKKyAgIAkJCXUxNiBzdWJfaGFuZGxlKTsKK2V4dGVybiBpbnQgbWFwX2lycV90b19pcnRlX2hhbmRsZShpbnQgaXJxLCB1MTYgKnN1Yl9oYW5kbGUpOworZXh0ZXJuIGludCBjbGVhcl9pcnRlX2lycShpbnQgaXJxLCBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB1MTYgaW5kZXgpOworZXh0ZXJuIGludCBmbHVzaF9pcnRlKGludCBpcnEpOworZXh0ZXJuIGludCBmcmVlX2lydGUoaW50IGlycSk7CisKK2V4dGVybiBpbnQgaXJxX3JlbWFwcGVkKGludCBpcnEpOworZXh0ZXJuIHN0cnVjdCBpbnRlbF9pb21tdSAqbWFwX2Rldl90b19pcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgaW50ZWxfaW9tbXUgKm1hcF9pb2FwaWNfdG9faXIoaW50IGFwaWMpOworI2Vsc2UKKyNkZWZpbmUgaXJxX3JlbWFwcGVkKGlycSkJCSgwKQorI2RlZmluZSBlbmFibGVfaW50cl9yZW1hcHBpbmcobW9kZSkJKC0xKQorI2RlZmluZSBpbnRyX3JlbWFwcGluZ19lbmFibGVkCQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RNQVIKIGV4dGVybiBjb25zdCBjaGFyICpkbWFyX2dldF9mYXVsdF9yZWFzb24odTggZmF1bHRfcmVhc29uKTsKIAogLyogQ2FuJ3QgdXNlIHRoZSBjb21tb24gTVNJIGludGVycnVwdCBmdW5jdGlvbnMKQEAgLTQwLDQ3ICsxMzAsMzAgQEAKIGV4dGVybiBpbnQgZG1hcl9zZXRfaW50ZXJydXB0KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpOwogZXh0ZXJuIGludCBhcmNoX3NldHVwX2RtYXJfbXNpKHVuc2lnbmVkIGludCBpcnEpOwogCi0vKiBJbnRlbCBJT01NVSBkZXRlY3Rpb24gYW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgZGV0ZWN0X2ludGVsX2lvbW11KHZvaWQpOwotZXh0ZXJuIGludCBpbnRlbF9pb21tdV9pbml0KHZvaWQpOwotCi1leHRlcm4gaW50IGRtYXJfdGFibGVfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgZWFybHlfZG1hcl9kZXRlY3Qodm9pZCk7Ci0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGRtYXJfZHJoZF91bml0czsKK2V4dGVybiBpbnQgaW9tbXVfZGV0ZWN0ZWQsIG5vX2lvbW11OwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZG1hcl9ybXJyX3VuaXRzOwotCi1zdHJ1Y3QgZG1hcl9kcmhkX3VuaXQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3Qgb2YgZHJoZCB1bml0cwkqLwotCXU2NAlyZWdfYmFzZV9hZGRyOwkJLyogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzKi8KLQlzdHJ1Y3QJcGNpX2RldiAqKmRldmljZXM7IAkvKiB0YXJnZXQgZGV2aWNlIGFycmF5CSovCi0JaW50CWRldmljZXNfY250OwkJLyogdGFyZ2V0IGRldmljZSBjb3VudAkqLwotCXU4CWlnbm9yZWQ6MTsgCQkvKiBpZ25vcmUgZHJoZAkJKi8KLQl1OAlpbmNsdWRlX2FsbDoxOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7Ci19OwotCiBzdHJ1Y3QgZG1hcl9ybXJyX3VuaXQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3Qgb2Ygcm1yciB1bml0cwkqLworCXN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICpoZHI7CS8qIEFDUEkgaGVhZGVyCQkqLwogCXU2NAliYXNlX2FkZHJlc3M7CQkvKiByZXNlcnZlZCBiYXNlIGFkZHJlc3MqLwogCXU2NAllbmRfYWRkcmVzczsJCS8qIHJlc2VydmVkIGVuZCBhZGRyZXNzICovCiAJc3RydWN0IHBjaV9kZXYgKipkZXZpY2VzOwkvKiB0YXJnZXQgZGV2aWNlcyAqLwogCWludAlkZXZpY2VzX2NudDsJCS8qIHRhcmdldCBkZXZpY2UgY291bnQgKi8KIH07CiAKLSNkZWZpbmUgZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIFwKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRyaGQsICZkbWFyX2RyaGRfdW5pdHMsIGxpc3QpCiAjZGVmaW5lIGZvcl9lYWNoX3JtcnJfdW5pdHMocm1ycikgXAogCWxpc3RfZm9yX2VhY2hfZW50cnkocm1yciwgJmRtYXJfcm1ycl91bml0cywgbGlzdCkKKy8qIEludGVsIERNQVIgIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBpbnRlbF9pb21tdV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBkbWFyX2Rpc2FibGVkOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBkZXRlY3RfaW50ZWxfaW9tbXUodm9pZCkKLXsKLQlyZXR1cm47Ci19CiBzdGF0aWMgaW5saW5lIGludCBpbnRlbF9pb21tdV9pbml0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKwlyZXR1cm4gZG1hcl9kZXZfc2NvcGVfaW5pdCgpOworI2Vsc2UKIAlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgogfQotCiAjZW5kaWYgLyogIUNPTkZJR19ETUFSICovCiAjZW5kaWYgLyogX19ETUFSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWkuaCBiL2luY2x1ZGUvbGludXgvZG1pLmgKaW5kZXggMmEwNjNiNi4uZTUwODRlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtaS5oCkBAIC0yLDI5ICsyLDkgQEAKICNkZWZpbmUgX19ETUlfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKLWVudW0gZG1pX2ZpZWxkIHsKLQlETUlfTk9ORSwKLQlETUlfQklPU19WRU5ET1IsCi0JRE1JX0JJT1NfVkVSU0lPTiwKLQlETUlfQklPU19EQVRFLAotCURNSV9TWVNfVkVORE9SLAotCURNSV9QUk9EVUNUX05BTUUsCi0JRE1JX1BST0RVQ1RfVkVSU0lPTiwKLQlETUlfUFJPRFVDVF9TRVJJQUwsCi0JRE1JX1BST0RVQ1RfVVVJRCwKLQlETUlfQk9BUkRfVkVORE9SLAotCURNSV9CT0FSRF9OQU1FLAotCURNSV9CT0FSRF9WRVJTSU9OLAotCURNSV9CT0FSRF9TRVJJQUwsCi0JRE1JX0JPQVJEX0FTU0VUX1RBRywKLQlETUlfQ0hBU1NJU19WRU5ET1IsCi0JRE1JX0NIQVNTSVNfVFlQRSwKLQlETUlfQ0hBU1NJU19WRVJTSU9OLAotCURNSV9DSEFTU0lTX1NFUklBTCwKLQlETUlfQ0hBU1NJU19BU1NFVF9UQUcsCi0JRE1JX1NUUklOR19NQVgsCi19OworLyogZW51bSBkbWlfZmllbGQgaXMgaW4gbW9kX2RldmljZXRhYmxlLmggKi8KIAogZW51bSBkbWlfZGV2aWNlX3R5cGUgewogCURNSV9ERVZfVFlQRV9BTlkgPSAwLApAQCAtNDgsMjMgKzI4LDYgQEAKIAl1MTYgaGFuZGxlOwogfTsKIAotLyoKLSAqCURNSSBjYWxsYmFja3MgZm9yIHByb2JsZW0gYm9hcmRzCi0gKi8KLXN0cnVjdCBkbWlfc3RybWF0Y2ggewotCXU4IHNsb3Q7Ci0JY2hhciAqc3Vic3RyOwotfTsKLQotc3RydWN0IGRtaV9zeXN0ZW1faWQgewotCWludCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqKTsKLQljb25zdCBjaGFyICppZGVudDsKLQlzdHJ1Y3QgZG1pX3N0cm1hdGNoIG1hdGNoZXNbNF07Ci0Jdm9pZCAqZHJpdmVyX2RhdGE7Ci19OwotCi0jZGVmaW5lIERNSV9NQVRDSChhLCBiKQl7IGEsIGIgfQotCiBzdHJ1Y3QgZG1pX2RldmljZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCB0eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kczEyODYuaCBiL2luY2x1ZGUvbGludXgvZHMxMjg2LmgKaW5kZXggZDg5ODk4Ni4uNDVlYTBhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kczEyODYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RzMTI4Ni5oCkBAIC04LDggKzgsNiBAQAogI2lmbmRlZiBfX0xJTlVYX0RTMTI4Nl9ICiAjZGVmaW5lIF9fTElOVVhfRFMxMjg2X0gKIAotI2luY2x1ZGUgPGFzbS9kczEyODYuaD4KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHJlZ2lzdGVyIHN1bW1hcnkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCBiL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKaW5kZXggYzhjYmQ5MC4uNmU0YWNlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCkBAIC02Miw2ICs2Miw3IEBACiAJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPCQk9IDB4MTAwMDAwLAogCUZFX0NBTl84VlNCCQkJPSAweDIwMDAwMCwKIAlGRV9DQU5fMTZWU0IJCQk9IDB4NDAwMDAwLAorCUZFX0hBU19FWFRFTkRFRF9DQVBTCQk9IDB4ODAwMDAwLCAgIC8vIFdlIG5lZWQgbW9yZSBiaXRzcGFjZSBmb3IgbmV3ZXIgQVBJcywgaW5kaWNhdGUgdGhpcy4KIAlGRV9ORUVEU19CRU5ESU5HCQk9IDB4MjAwMDAwMDAsIC8vIG5vdCBzdXBwb3J0ZWQgYW55bW9yZSwgZG9uJ3QgdXNlIChmcm9udGVuZCByZXF1aXJlcyBmcmVxdWVuY3kgYmVuZGluZykKIAlGRV9DQU5fUkVDT1ZFUgkJCT0gMHg0MDAwMDAwMCwgLy8gZnJvbnRlbmQgY2FuIHJlY292ZXIgZnJvbSBhIGNhYmxlIHVucGx1ZyBhdXRvbWF0aWNhbGx5CiAJRkVfQ0FOX01VVEVfVFMJCQk9IDB4ODAwMDAwMDAgIC8vIGZyb250ZW5kIGNhbiBzdG9wIHNwdXJpb3VzIFRTIGRhdGEgb3V0cHV0CkBAIC0xNDcsNyArMTQ4LDkgQEAKIAlGRUNfNl83LAogCUZFQ183XzgsCiAJRkVDXzhfOSwKLQlGRUNfQVVUTworCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCiB9IGZlX2NvZGVfcmF0ZV90OwogCiAKQEAgLTE2MCw3ICsxNjMsMTAgQEAKIAlRQU1fMjU2LAogCVFBTV9BVVRPLAogCVZTQl84LAotCVZTQl8xNgorCVZTQl8xNiwKKwlQU0tfOCwKKwlBUFNLXzE2LAorCURRUFNLLAogfSBmZV9tb2R1bGF0aW9uX3Q7CiAKIHR5cGVkZWYgZW51bSBmZV90cmFuc21pdF9tb2RlIHsKQEAgLTIzOSw2ICsyNDUsMTA2IEBACiAJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHBhcmFtZXRlcnM7CiB9OwogCisvKiBTMkFQSSBDb21tYW5kcyAqLworI2RlZmluZSBEVFZfVU5ERUZJTkVECQkwCisjZGVmaW5lIERUVl9UVU5FCQkxCisjZGVmaW5lIERUVl9DTEVBUgkJMgorI2RlZmluZSBEVFZfRlJFUVVFTkNZCQkzCisjZGVmaW5lIERUVl9NT0RVTEFUSU9OCQk0CisjZGVmaW5lIERUVl9CQU5EV0lEVEhfSFoJNQorI2RlZmluZSBEVFZfSU5WRVJTSU9OCQk2CisjZGVmaW5lIERUVl9ESVNFUUNfTUFTVEVSCTcKKyNkZWZpbmUgRFRWX1NZTUJPTF9SQVRFCQk4CisjZGVmaW5lIERUVl9JTk5FUl9GRUMJCTkKKyNkZWZpbmUgRFRWX1ZPTFRBR0UJCTEwCisjZGVmaW5lIERUVl9UT05FCQkxMQorI2RlZmluZSBEVFZfUElMT1QJCTEyCisjZGVmaW5lIERUVl9ST0xMT0ZGCQkxMworI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZCTE0CisKKy8qIEJhc2ljIGVudW1lcmF0aW9uIHNldCBmb3IgcXVlcnlpbmcgdW5saW1pdGVkIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWV9DT1VOVAkxNQorI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWQkxNgorI2RlZmluZSBEVFZfREVMSVZFUllfU1lTVEVNCTE3CisKKyNkZWZpbmUgRFRWX0FQSV9WRVJTSU9OCQkJCTM1CisjZGVmaW5lIERUVl9BUElfVkVSU0lPTgkJCQkzNQorI2RlZmluZSBEVFZfQ09ERV9SQVRFX0hQCQkJMzYKKyNkZWZpbmUgRFRWX0NPREVfUkFURV9MUAkJCTM3CisjZGVmaW5lIERUVl9HVUFSRF9JTlRFUlZBTAkJCTM4CisjZGVmaW5lIERUVl9UUkFOU01JU1NJT05fTU9ERQkJCTM5CisjZGVmaW5lIERUVl9ISUVSQVJDSFkJCQkJNDAKKworI2RlZmluZSBEVFZfTUFYX0NPTU1BTkQJCQkJRFRWX0hJRVJBUkNIWQorCit0eXBlZGVmIGVudW0gZmVfcGlsb3QgeworCVBJTE9UX09OLAorCVBJTE9UX09GRiwKKwlQSUxPVF9BVVRPLAorfSBmZV9waWxvdF90OworCit0eXBlZGVmIGVudW0gZmVfcm9sbG9mZiB7CisJUk9MTE9GRl8zNSwgLyogSW1wbGllZCB2YWx1ZSBpbiBEVkItUywgZGVmYXVsdCBmb3IgRFZCLVMyICovCisJUk9MTE9GRl8yMCwKKwlST0xMT0ZGXzI1LAorCVJPTExPRkZfQVVUTywKK30gZmVfcm9sbG9mZl90OworCit0eXBlZGVmIGVudW0gZmVfZGVsaXZlcnlfc3lzdGVtIHsKKwlTWVNfVU5ERUZJTkVELAorCVNZU19EVkJDX0FOTkVYX0FDLAorCVNZU19EVkJDX0FOTkVYX0IsCisJU1lTX0RWQlQsCisJU1lTX0RWQlMsCisJU1lTX0RWQlMyLAorCVNZU19EVkJILAorCVNZU19JU0RCVCwKKwlTWVNfSVNEQlMsCisJU1lTX0lTREJDLAorCVNZU19BVFNDLAorCVNZU19BVFNDTUgsCisJU1lTX0RNQlRILAorCVNZU19DTU1CLAorCVNZU19EQUIsCit9IGZlX2RlbGl2ZXJ5X3N5c3RlbV90OworCitzdHJ1Y3QgZHR2X2NtZHNfaCB7CisJY2hhcgkqbmFtZTsJCS8qIEEgZGlzcGxheSBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKworCV9fdTMyCWNtZDsJCS8qIEEgdW5pcXVlIElEICovCisKKwkvKiBGbGFncyAqLworCV9fdTMyCXNldDoxOwkJLyogRWl0aGVyIGEgc2V0IG9yIGdldCBwcm9wZXJ0eSAqLworCV9fdTMyCWJ1ZmZlcjoxOwkvKiBEb2VzIHRoaXMgcHJvcGVydHkgdXNlIHRoZSBidWZmZXI/ICovCisJX191MzIJcmVzZXJ2ZWQ6MzA7CS8qIEFsaWduICovCit9OworCitzdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKKwlfX3UzMiBjbWQ7CisJX191MzIgcmVzZXJ2ZWRbM107CisJdW5pb24geworCQlfX3UzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJX191OCBkYXRhWzMyXTsKKwkJCV9fdTMyIGxlbjsKKwkJCV9fdTMyIHJlc2VydmVkMVszXTsKKwkJCXZvaWQgKnJlc2VydmVkMjsKKwkJfSBidWZmZXI7CisJfSB1OworCWludCByZXN1bHQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbnVtIG9mIHByb3BlcnRpZXMgY2Fubm90IGV4Y2VlZCBEVFZfSU9DVExfTUFYX01TR1MgcGVyIGlvY3RsICovCisjZGVmaW5lIERUVl9JT0NUTF9NQVhfTVNHUyA2NAorCitzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgeworCV9fdTMyIG51bTsKKwlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKK307CisKKyNkZWZpbmUgRkVfU0VUX1BST1BFUlRZCQkgICBfSU9XKCdvJywgODIsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKKyNkZWZpbmUgRkVfR0VUX1BST1BFUlRZCQkgICBfSU9SKCdvJywgODMsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKKwogCiAvKioKICAqIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbCBkaXNhYmxlIGFueSB6aWd6YWdnaW5nIG9yIG90aGVyICJub3JtYWwiIHR1bmluZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCmluZGV4IDEyNmUwYzIuLjI1YjgyM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpZm5kZWYgX0RWQlZFUlNJT05fSF8KICNkZWZpbmUgX0RWQlZFUlNJT05fSF8KIAotI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gMwotI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMgorI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gNQorI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMAogCiAjZW5kaWYgLypfRFZCVkVSU0lPTl9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfcHJpbnRrLmggYi9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfcHJpbnRrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1MjhkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZHluYW1pY19wcmludGsuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIF9EWU5BTUlDX1BSSU5US19ICisjZGVmaW5lIF9EWU5BTUlDX1BSSU5US19ICisKKyNkZWZpbmUgRFlOQU1JQ19ERUJVR19IQVNIX0JJVFMgNgorI2RlZmluZSBERUJVR19IQVNIX1RBQkxFX1NJWkUgKDEgPDwgRFlOQU1JQ19ERUJVR19IQVNIX0JJVFMpCisKKyNkZWZpbmUgVFlQRV9CT09MRUFOIDEKKworI2RlZmluZSBEWU5BTUlDX0VOQUJMRURfQUxMIDAKKyNkZWZpbmUgRFlOQU1JQ19FTkFCTEVEX05PTkUgMQorI2RlZmluZSBEWU5BTUlDX0VOQUJMRURfU09NRSAyCisKK2V4dGVybiBpbnQgZHluYW1pY19lbmFibGVkOworCisvKiBkeW5hbWljX3ByaW50a19lbmFibGVkLCBhbmQgZHluYW1pY19wcmludGtfZW5hYmxlZDIgYXJlIGJpdG1hc2tzIGluIHdoaWNoCisgKiBiaXQgbiBpcyBzZXQgdG8gMSBpZiBhbnkgbW9kbmFtZSBoYXNoZXMgaW50byB0aGUgYnVja2V0IG4sIDAgb3RoZXJ3aXNlLiBUaGV5CisgKiB1c2UgaW5kZXBlbmRlbnQgaGFzaCBmdW5jdGlvbnMsIHRvIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGZhbHNlIHBvc2l0aXZlcy4KKyAqLworZXh0ZXJuIGxvbmcgbG9uZyBkeW5hbWljX3ByaW50a19lbmFibGVkOworZXh0ZXJuIGxvbmcgbG9uZyBkeW5hbWljX3ByaW50a19lbmFibGVkMjsKKworc3RydWN0IG1vZF9kZWJ1ZyB7CisJY2hhciAqbW9kbmFtZTsKKwljaGFyICpsb2dpY2FsX21vZG5hbWU7CisJY2hhciAqZmxhZ19uYW1lczsKKwlpbnQgdHlwZTsKKwlpbnQgaGFzaDsKKwlpbnQgaGFzaDI7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKworaW50IHJlZ2lzdGVyX2R5bmFtaWNfZGVidWdfbW9kdWxlKGNoYXIgKm1vZF9uYW1lLCBpbnQgdHlwZSwgY2hhciAqc2hhcmVfbmFtZSwKKwkJCQkJY2hhciAqZmxhZ3MsIGludCBoYXNoLCBpbnQgaGFzaDIpOworCisjaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCitleHRlcm4gaW50IHVucmVnaXN0ZXJfZHluYW1pY19kZWJ1Z19tb2R1bGUoY2hhciAqbW9kX25hbWUpOworZXh0ZXJuIGludCBfX2R5bmFtaWNfZGJnX2VuYWJsZWRfaGVscGVyKGNoYXIgKm1vZG5hbWUsIGludCB0eXBlLAorCQkJCQlpbnQgdmFsdWUsIGludCBoYXNoKTsKKworI2RlZmluZSBfX2R5bmFtaWNfZGJnX2VuYWJsZWQobW9kdWxlLCB0eXBlLCB2YWx1ZSwgbGV2ZWwsIGhhc2gpICAoewkgICAgIFwKKwlpbnQgX19yZXQgPSAwOwkJCQkJCQkgICAgIFwKKwlpZiAodW5saWtlbHkoKGR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgJiAoMUxMIDw8IERFQlVHX0hBU0gpKSAmJgkgICAgIFwKKwkJCShkeW5hbWljX3ByaW50a19lbmFibGVkMiAmICgxTEwgPDwgREVCVUdfSEFTSDIpKSkpICAgXAorCQkJX19yZXQgPSBfX2R5bmFtaWNfZGJnX2VuYWJsZWRfaGVscGVyKG1vZHVsZSwgdHlwZSwgICBcCisJCQkJCQkJCXZhbHVlLCBoYXNoKTtcCisJX19yZXQ7IH0pCisKKyNkZWZpbmUgZHluYW1pY19wcl9kZWJ1ZyhmbXQsIC4uLikgZG8gewkJCQkJICAgIFwKKwlzdGF0aWMgY2hhciBtb2RfbmFtZVtdCQkJCQkJICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3ZlcmJvc2Vfc3RyaW5ncyIpKSkJCQkgICAgXAorCSA9IEtCVUlMRF9NT0ROQU1FOwkJCQkJCSAgICBcCisJc3RhdGljIHN0cnVjdCBtb2RfZGVidWcgZGVzY3JpcHRvcgkJCQkgICAgXAorCV9fdXNlZAkJCQkJCQkJICAgIFwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3ZlcmJvc2UiKSwgYWxpZ25lZCg4KSkpID0JCSAgICBcCisJeyBtb2RfbmFtZSwgbW9kX25hbWUsIE5VTEwsIFRZUEVfQk9PTEVBTiwgREVCVUdfSEFTSCwgREVCVUdfSEFTSDIgfTtcCisJaWYgKF9fZHluYW1pY19kYmdfZW5hYmxlZChLQlVJTERfTU9ETkFNRSwgVFlQRV9CT09MRUFOLAkJICAgIFwKKwkJCQkJCTAsIDAsIERFQlVHX0hBU0gpKQkgICAgXAorCQlwcmludGsoS0VSTl9ERUJVRyBLQlVJTERfTU9ETkFNRSAiOiIgZm10LAkJICAgIFwKKwkJCQkjI19fVkFfQVJHU19fKTsJCQkJICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGR5bmFtaWNfZGV2X2RiZyhkZXYsIGZvcm1hdCwgLi4uKSBkbyB7CQkJCSAgICBcCisJc3RhdGljIGNoYXIgbW9kX25hbWVbXQkJCQkJCSAgICBcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX192ZXJib3NlX3N0cmluZ3MiKSkpCQkJICAgIFwKKwkgPSBLQlVJTERfTU9ETkFNRTsJCQkJCQkgICAgXAorCXN0YXRpYyBzdHJ1Y3QgbW9kX2RlYnVnIGRlc2NyaXB0b3IJCQkJICAgIFwKKwlfX3VzZWQJCQkJCQkJCSAgICBcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX192ZXJib3NlIiksIGFsaWduZWQoOCkpKSA9CQkgICAgXAorCXsgbW9kX25hbWUsIG1vZF9uYW1lLCBOVUxMLCBUWVBFX0JPT0xFQU4sIERFQlVHX0hBU0gsIERFQlVHX0hBU0gyIH07XAorCWlmIChfX2R5bmFtaWNfZGJnX2VuYWJsZWQoS0JVSUxEX01PRE5BTUUsIFRZUEVfQk9PTEVBTiwJCSAgICBcCisJCQkJCQkwLCAwLCBERUJVR19IQVNIKSkJICAgIFwKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LAkJCSAgICBcCisJCQkJCUtCVUlMRF9NT0ROQU1FICI6ICIgZm9ybWF0LAkgICAgXAorCQkJCQkjI19fVkFfQVJHU19fKTsJCQkgICAgXAorCX0gd2hpbGUgKDApCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IHVucmVnaXN0ZXJfZHluYW1pY19kZWJ1Z19tb2R1bGUoY29uc3QgY2hhciAqbW9kX25hbWUpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBfX2R5bmFtaWNfZGJnX2VuYWJsZWRfaGVscGVyKGNoYXIgKm1vZG5hbWUsIGludCB0eXBlLAorCQkJCQkJaW50IHZhbHVlLCBpbnQgaGFzaCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBfX2R5bmFtaWNfZGJnX2VuYWJsZWQobW9kdWxlLCB0eXBlLCB2YWx1ZSwgbGV2ZWwsIGhhc2gpICAoeyAwOyB9KQorI2RlZmluZSBkeW5hbWljX3ByX2RlYnVnKGZtdCwgLi4uKSAgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBkeW5hbWljX2Rldl9kYmcoZGV2LCBmb3JtYXQsIC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCA2Mzk2MjRiLi45MmY2ZjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC0xMTIsNiArMTEyLDcgQEAKIGV4dGVybiBpbnQgZWx2X3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIGV4dGVybiB2b2lkIGVsdl91bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIGV4dGVybiBpbnQgZWx2X21heV9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZWx2X2Fib3J0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogZXh0ZXJuIHZvaWQgZWx2X2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIGludCBlbHZfc2V0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgZ2ZwX3QpOwogZXh0ZXJuIHZvaWQgZWx2X3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwpAQCAtMTczLDE1ICsxNzQsMTUgQEAKICNkZWZpbmUgcmJfZW50cnlfcnEobm9kZSkJcmJfZW50cnkoKG5vZGUpLCBzdHJ1Y3QgcmVxdWVzdCwgcmJfbm9kZSkKIAogLyoKLSAqIEhhY2sgdG8gcmV1c2UgdGhlIGRvbmVsaXN0IGxpc3RfaGVhZCBhcyB0aGUgZmlmbyB0aW1lIGhvbGRlciB3aGlsZQorICogSGFjayB0byByZXVzZSB0aGUgY3NkLmxpc3QgbGlzdF9oZWFkIGFzIHRoZSBmaWZvIHRpbWUgaG9sZGVyIHdoaWxlCiAgKiB0aGUgcmVxdWVzdCBpcyBpbiB0aGUgaW8gc2NoZWR1bGVyLiBTYXZlcyBhbiB1bnNpZ25lZCBsb25nIGluIHJxLgogICovCi0jZGVmaW5lIHJxX2ZpZm9fdGltZShycSkJKCh1bnNpZ25lZCBsb25nKSAocnEpLT5kb25lbGlzdC5uZXh0KQotI2RlZmluZSBycV9zZXRfZmlmb190aW1lKHJxLGV4cCkJKChycSktPmRvbmVsaXN0Lm5leHQgPSAodm9pZCAqKSAoZXhwKSkKKyNkZWZpbmUgcnFfZmlmb190aW1lKHJxKQkoKHVuc2lnbmVkIGxvbmcpIChycSktPmNzZC5saXN0Lm5leHQpCisjZGVmaW5lIHJxX3NldF9maWZvX3RpbWUocnEsZXhwKQkoKHJxKS0+Y3NkLmxpc3QubmV4dCA9ICh2b2lkICopIChleHApKQogI2RlZmluZSBycV9lbnRyeV9maWZvKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKICNkZWZpbmUgcnFfZmlmb19jbGVhcihycSkJZG8gewkJXAogCWxpc3RfZGVsX2luaXQoJihycSktPnF1ZXVlbGlzdCk7CVwKLQlJTklUX0xJU1RfSEVBRCgmKHJxKS0+ZG9uZWxpc3QpOwlcCisJSU5JVF9MSVNUX0hFQUQoJihycSktPmNzZC5saXN0KTsJXAogCX0gd2hpbGUgKDApCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZi5oIGIvaW5jbHVkZS9saW51eC9lbGYuaAppbmRleCBlZGMzZGFjLi4wYjYxY2E0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZi5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxmLmgKQEAgLTM2MCw2ICszNjAsNyBAQAogI2RlZmluZSBOVF9QUENfU1BFCTB4MTAxCQkvKiBQb3dlclBDIFNQRS9FVlIgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE5UX1BQQ19WU1gJMHgxMDIJCS8qIFBvd2VyUEMgVlNYIHJlZ2lzdGVycyAqLwogI2RlZmluZSBOVF8zODZfVExTCTB4MjAwCQkvKiBpMzg2IFRMUyBzbG90cyAoc3RydWN0IHVzZXJfZGVzYykgKi8KKyNkZWZpbmUgTlRfMzg2X0lPUEVSTQkweDIwMQkJLyogeDg2IGlvIHBlcm1pc3Npb24gYml0bWFwICgxPWRlbnkpICovCiAKIAogLyogTm90ZSBoZWFkZXIgaW4gYSBQVF9OT1RFIHNlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKaW5kZXggMmVmZTdiOC4uNzhjNzc1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpZmRlZiBFWFQyRlNfREVCVUcKICMJZGVmaW5lIGV4dDJfZGVidWcoZiwgYS4uLikJeyBcCiAJCQkJCXByaW50ayAoIkVYVDItZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsIFwKLQkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgXAorCQkJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKIAkJCQkgIAlwcmludGsgKGYsICMjIGEpOyBcCiAJCQkJCX0KICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCmluZGV4IDgwMTcxZWUuLjE1OWQ5YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC00Myw3ICs0Myw3IEBACiAjZGVmaW5lIGV4dDNfZGVidWcoZiwgYS4uLikJCQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlwcmludGsgKEtFUk5fREVCVUcgIkVYVDMtZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsCVwKLQkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsJCVwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwkJXAogCQlwcmludGsgKEtFUk5fREVCVUcgZiwgIyMgYSk7CQkJCVwKIAl9IHdoaWxlICgwKQogI2Vsc2UKQEAgLTgzNyw2ICs4MzcsOCBAQAogZXh0ZXJuIHZvaWQgZXh0M19zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZXh0M19nZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqKTsKIGV4dGVybiB2b2lkIGV4dDNfc2V0X2FvcHMoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50IGV4dDNfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pOwogCiAvKiBpb2N0bC5jICovCiBleHRlcm4gaW50IGV4dDNfaW9jdGwgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCkBAIC04NjksNyArODcxLDcgQEAKICNkZWZpbmUgZXh0M19zdGRfZXJyb3Ioc2IsIGVycm5vKQkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJaWYgKChlcnJubykpCQkJCQkJXAotCQlfX2V4dDNfc3RkX2Vycm9yKChzYiksIF9fRlVOQ1RJT05fXywgKGVycm5vKSk7CVwKKwkJX19leHQzX3N0ZF9lcnJvcigoc2IpLCBfX2Z1bmNfXywgKGVycm5vKSk7CVwKIH0gd2hpbGUgKDApCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmgKaW5kZXggOGM0M2IxMy4uY2Y4MmQ1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaApAQCAtMTM3LDE3ICsxMzcsMTcgQEAKIAkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAogI2RlZmluZSBleHQzX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpIFwKLQlfX2V4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoX19GVU5DVElPTl9fLCAoaGFuZGxlKSwgKGJoKSkKKwlfX2V4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQogI2RlZmluZSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSBcCi0JX19leHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQorCV9fZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQogI2RlZmluZSBleHQzX2pvdXJuYWxfcmV2b2tlKGhhbmRsZSwgYmxvY2tuciwgYmgpIFwKLQlfX2V4dDNfam91cm5hbF9yZXZva2UoX19GVU5DVElPTl9fLCAoaGFuZGxlKSwgKGJsb2NrbnIpLCAoYmgpKQorCV9fZXh0M19qb3VybmFsX3Jldm9rZShfX2Z1bmNfXywgKGhhbmRsZSksIChibG9ja25yKSwgKGJoKSkKICNkZWZpbmUgZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpIFwKLQlfX2V4dDNfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQorCV9fZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKICNkZWZpbmUgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpIFwKLQlfX2V4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQorCV9fZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKICNkZWZpbmUgZXh0M19qb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoKSBcCi0JX19leHQzX2pvdXJuYWxfZm9yZ2V0KF9fRlVOQ1RJT05fXywgKGhhbmRsZSksIChiaCkpCisJX19leHQzX2pvdXJuYWxfZm9yZ2V0KF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKIAogaW50IGV4dDNfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCkBAIC0xNjAsNyArMTYwLDcgQEAKIH0KIAogI2RlZmluZSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpIFwKLQlfX2V4dDNfam91cm5hbF9zdG9wKF9fRlVOQ1RJT05fXywgKGhhbmRsZSkpCisJX19leHQzX2pvdXJuYWxfc3RvcChfX2Z1bmNfXywgKGhhbmRsZSkpCiAKIHN0YXRpYyBpbmxpbmUgaGFuZGxlX3QgKmV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZC5oIGIvaW5jbHVkZS9saW51eC9mZC5oCmluZGV4IGI2YmQ0MWQuLmY1ZDE5NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZkLmgKQEAgLTE1LDEwICsxNSwxNiBAQAogCQkJc2VjdCwJCS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCiAJCQloZWFkLAkJLyogbnIgb2YgaGVhZHMgKi8KIAkJCXRyYWNrLAkJLyogbnIgb2YgdHJhY2tzICovCi0JCQlzdHJldGNoOwkvKiAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCisJCQlzdHJldGNoOwkvKiBiaXQgMCAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCisJCQkJCS8qIGJpdCAxICE9IDAgbWVhbnMgc3dhcCBzaWRlcyAqLworCQkJCQkvKiBiaXRzIDIuLjkgZ2l2ZSB0aGUgZmlyc3Qgc2VjdG9yICovCisJCQkJCS8qICBudW1iZXIgKHRoZSBMU0IgaXMgZmxpcHBlZCkgKi8KICNkZWZpbmUgRkRfU1RSRVRDSCAxCiAjZGVmaW5lIEZEX1NXQVBTSURFUyAyCiAjZGVmaW5lIEZEX1pFUk9CQVNFRCA0CisjZGVmaW5lIEZEX1NFQ1RCQVNFTUFTSyAweDNGQworI2RlZmluZSBGRF9NS1NFQ1RCQVNFKHMpICgoKHMpIF4gMSkgPDwgMikKKyNkZWZpbmUgRkRfU0VDVEJBU0UoZmxvcHB5KSAoKCgoZmxvcHB5KS0+c3RyZXRjaCAmIEZEX1NFQ1RCQVNFTUFTSykgPj4gMikgXiAxKQogCiAJdW5zaWduZWQgY2hhcglnYXAsCQkvKiBnYXAxIHNpemUgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWVtYXAuaCBiL2luY2x1ZGUvbGludXgvZmllbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxZGVjYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZmllbWFwLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEZTX0lPQ19GSUVNQVAgaW9jdGwgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogU29tZSBwb3J0aW9ucyBjb3B5cmlnaHQgKEMpIDIwMDcgQ2x1c3RlciBGaWxlIFN5c3RlbXMsIEluYworICoKKyAqIEF1dGhvcnM6IE1hcmsgRmFzaGVoIDxtZmFzaGVoQHN1c2UuY29tPgorICogICAgICAgICAgS2FscGFrIFNoYWggPGthbHBhay5zaGFoQHN1bi5jb20+CisgKiAgICAgICAgICBBbmRyZWFzIERpbGdlciA8YWRpbGdlckBzdW4uY29tPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZJRU1BUF9ICisjZGVmaW5lIF9MSU5VWF9GSUVNQVBfSAorCitzdHJ1Y3QgZmllbWFwX2V4dGVudCB7CisJX191NjQgZmVfbG9naWNhbDsgIC8qIGxvZ2ljYWwgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGUgc3RhcnQgb2YKKwkJCSAgICAqIHRoZSBleHRlbnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCisJX191NjQgZmVfcGh5c2ljYWw7IC8qIHBoeXNpY2FsIG9mZnNldCBpbiBieXRlcyBmb3IgdGhlIHN0YXJ0CisJCQkgICAgKiBvZiB0aGUgZXh0ZW50IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGlzayAqLworCV9fdTY0IGZlX2xlbmd0aDsgICAvKiBsZW5ndGggaW4gYnl0ZXMgZm9yIHRoaXMgZXh0ZW50ICovCisJX191NjQgZmVfcmVzZXJ2ZWQ2NFsyXTsKKwlfX3UzMiBmZV9mbGFnczsgICAgLyogRklFTUFQX0VYVEVOVF8qIGZsYWdzIGZvciB0aGlzIGV4dGVudCAqLworCV9fdTMyIGZlX3Jlc2VydmVkWzNdOworfTsKKworc3RydWN0IGZpZW1hcCB7CisJX191NjQgZm1fc3RhcnQ7CQkvKiBsb2dpY2FsIG9mZnNldCAoaW5jbHVzaXZlKSBhdAorCQkJCSAqIHdoaWNoIHRvIHN0YXJ0IG1hcHBpbmcgKGluKSAqLworCV9fdTY0IGZtX2xlbmd0aDsJLyogbG9naWNhbCBsZW5ndGggb2YgbWFwcGluZyB3aGljaAorCQkJCSAqIHVzZXJzcGFjZSB3YW50cyAoaW4pICovCisJX191MzIgZm1fZmxhZ3M7CQkvKiBGSUVNQVBfRkxBR18qIGZsYWdzIGZvciByZXF1ZXN0IChpbi9vdXQpICovCisJX191MzIgZm1fbWFwcGVkX2V4dGVudHM7LyogbnVtYmVyIG9mIGV4dGVudHMgdGhhdCB3ZXJlIG1hcHBlZCAob3V0KSAqLworCV9fdTMyIGZtX2V4dGVudF9jb3VudDsgIC8qIHNpemUgb2YgZm1fZXh0ZW50cyBhcnJheSAoaW4pICovCisJX191MzIgZm1fcmVzZXJ2ZWQ7CisJc3RydWN0IGZpZW1hcF9leHRlbnQgZm1fZXh0ZW50c1swXTsgLyogYXJyYXkgb2YgbWFwcGVkIGV4dGVudHMgKG91dCkgKi8KK307CisKKyNkZWZpbmUgRklFTUFQX01BWF9PRkZTRVQJKH4wVUxMKQorCisjZGVmaW5lIEZJRU1BUF9GTEFHX1NZTkMJMHgwMDAwMDAwMSAvKiBzeW5jIGZpbGUgZGF0YSBiZWZvcmUgbWFwICovCisjZGVmaW5lIEZJRU1BUF9GTEFHX1hBVFRSCTB4MDAwMDAwMDIgLyogbWFwIGV4dGVuZGVkIGF0dHJpYnV0ZSB0cmVlICovCisKKyNkZWZpbmUgRklFTUFQX0ZMQUdTX0NPTVBBVAkoRklFTUFQX0ZMQUdfU1lOQyB8IEZJRU1BUF9GTEFHX1hBVFRSKQorCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfTEFTVAkJMHgwMDAwMDAwMSAvKiBMYXN0IGV4dGVudCBpbiBmaWxlLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX1VOS05PV04JCTB4MDAwMDAwMDIgLyogRGF0YSBsb2NhdGlvbiB1bmtub3duLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0RFTEFMTE9DCQkweDAwMDAwMDA0IC8qIExvY2F0aW9uIHN0aWxsIHBlbmRpbmcuCisJCQkJCQkgICAgKiBTZXRzIEVYVEVOVF9VTktOT1dOLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0VOQ09ERUQJCTB4MDAwMDAwMDggLyogRGF0YSBjYW4gbm90IGJlIHJlYWQKKwkJCQkJCSAgICAqIHdoaWxlIGZzIGlzIHVubW91bnRlZCAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0RBVEFfRU5DUllQVEVECTB4MDAwMDAwODAgLyogRGF0YSBpcyBlbmNyeXB0ZWQgYnkgZnMuCisJCQkJCQkgICAgKiBTZXRzIEVYVEVOVF9OT19CWVBBU1MuICovCisjZGVmaW5lIEZJRU1BUF9FWFRFTlRfTk9UX0FMSUdORUQJMHgwMDAwMDEwMCAvKiBFeHRlbnQgb2Zmc2V0cyBtYXkgbm90IGJlCisJCQkJCQkgICAgKiBibG9jayBhbGlnbmVkLiAqLworI2RlZmluZSBGSUVNQVBfRVhURU5UX0RBVEFfSU5MSU5FCTB4MDAwMDAyMDAgLyogRGF0YSBtaXhlZCB3aXRoIG1ldGFkYXRhLgorCQkJCQkJICAgICogU2V0cyBFWFRFTlRfTk9UX0FMSUdORUQuKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9EQVRBX1RBSUwJCTB4MDAwMDA0MDAgLyogTXVsdGlwbGUgZmlsZXMgaW4gYmxvY2suCisJCQkJCQkgICAgKiBTZXRzIEVYVEVOVF9OT1RfQUxJR05FRC4qLworI2RlZmluZSBGSUVNQVBfRVhURU5UX1VOV1JJVFRFTgkJMHgwMDAwMDgwMCAvKiBTcGFjZSBhbGxvY2F0ZWQsIGJ1dAorCQkJCQkJICAgICogbm8gZGF0YSAoaS5lLiB6ZXJvKS4gKi8KKyNkZWZpbmUgRklFTUFQX0VYVEVOVF9NRVJHRUQJCTB4MDAwMDEwMDAgLyogRmlsZSBkb2VzIG5vdCBuYXRpdmVseQorCQkJCQkJICAgICogc3VwcG9ydCBleHRlbnRzLiBSZXN1bHQKKwkJCQkJCSAgICAqIG1lcmdlZCBmb3IgZWZmaWNpZW5jeS4gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9GSUVNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maXJld2lyZS1jZGV2LmggYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaAppbmRleCAwZjBlMjcxLi40ZDA3OGU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaApAQCAtMTU0LDggKzE1NCwxMyBAQAogICogQHJlcXVlc3Q6ICAgICAgIFZhbGlkIGlmIEBjb21tb24udHlwZSA9PSAlRldfQ0RFVl9FVkVOVF9SRVFVRVNUCiAgKiBAaXNvX2ludGVycnVwdDogVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFQKICAqCi0gKiBDb252ZW5pZW5jZSB1bmlvbiBmb3IgdXNlcnNwYWNlIHVzZS4gIEV2ZW50cyBjb3VsZCBiZSByZWFkKDIpIGludG8gYSBjaGFyCi0gKiBidWZmZXIgYW5kIHRoZW4gY2FzdCB0byB0aGlzIHVuaW9uIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKiBDb252ZW5pZW5jZSB1bmlvbiBmb3IgdXNlcnNwYWNlIHVzZS4gIEV2ZW50cyBjb3VsZCBiZSByZWFkKDIpIGludG8gYW4KKyAqIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBjaGFyIGJ1ZmZlciBhbmQgdGhlbiBjYXN0IHRvIHRoaXMgdW5pb24gZm9yIGZ1cnRoZXIKKyAqIHByb2Nlc3NpbmcuICBOb3RlIHRoYXQgZm9yIGEgcmVxdWVzdCwgcmVzcG9uc2Ugb3IgaXNvX2ludGVycnVwdCBldmVudCwKKyAqIHRoZSBkYXRhW10gb3IgaGVhZGVyW10gbWF5IG1ha2UgdGhlIHNpemUgb2YgdGhlIGZ1bGwgZXZlbnQgbGFyZ2VyIHRoYW4KKyAqIHNpemVvZih1bmlvbiBmd19jZGV2X2V2ZW50KS4gIEFsc28gbm90ZSB0aGF0IGlmIHlvdSBhdHRlbXB0IHRvIHJlYWQoMikKKyAqIGFuIGV2ZW50IGludG8gYSBidWZmZXIgdGhhdCBpcyBub3QgbGFyZ2UgZW5vdWdoIGZvciBpdCwgdGhlIGRhdGEgdGhhdCBkb2VzCisgKiBub3QgZml0IHdpbGwgYmUgZGlzY2FyZGVkIHNvIHRoYXQgdGhlIG5leHQgcmVhZCgyKSB3aWxsIHJldHVybiBhIG5ldyBldmVudC4KICAqLwogdW5pb24gZndfY2Rldl9ldmVudCB7CiAJc3RydWN0IGZ3X2NkZXZfZXZlbnRfY29tbW9uIGNvbW1vbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCA1ODBiNTEzLi5hNmE2MjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC04Niw3ICs4Niw5IEBACiAjZGVmaW5lIFJFQURfTUVUQQkoUkVBRCB8ICgxIDw8IEJJT19SV19NRVRBKSkKICNkZWZpbmUgV1JJVEVfU1lOQwkoV1JJVEUgfCAoMSA8PCBCSU9fUldfU1lOQykpCiAjZGVmaW5lIFNXUklURV9TWU5DCShTV1JJVEUgfCAoMSA8PCBCSU9fUldfU1lOQykpCi0jZGVmaW5lIFdSSVRFX0JBUlJJRVIJKCgxIDw8IEJJT19SVykgfCAoMSA8PCBCSU9fUldfQkFSUklFUikpCisjZGVmaW5lIFdSSVRFX0JBUlJJRVIJKFdSSVRFIHwgKDEgPDwgQklPX1JXX0JBUlJJRVIpKQorI2RlZmluZSBESVNDQVJEX05PQkFSUklFUiAoMSA8PCBCSU9fUldfRElTQ0FSRCkKKyNkZWZpbmUgRElTQ0FSRF9CQVJSSUVSICgoMSA8PCBCSU9fUldfRElTQ0FSRCkgfCAoMSA8PCBCSU9fUldfQkFSUklFUikpCiAKICNkZWZpbmUgU0VMX0lOCQkxCiAjZGVmaW5lIFNFTF9PVVQJCTIKQEAgLTIyMiw2ICsyMjQsNyBAQAogI2RlZmluZSBCTEtUUkFDRVNUQVJUIF9JTygweDEyLDExNikKICNkZWZpbmUgQkxLVFJBQ0VTVE9QIF9JTygweDEyLDExNykKICNkZWZpbmUgQkxLVFJBQ0VURUFSRE9XTiBfSU8oMHgxMiwxMTgpCisjZGVmaW5lIEJMS0RJU0NBUkQgX0lPKDB4MTIsMTE5KQogCiAjZGVmaW5lIEJNQVBfSU9DVEwgMQkJLyogb2Jzb2xldGUgLSBrZXB0IGZvciBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIEZJQk1BUAkgICBfSU8oMHgwMCwxKQkvKiBibWFwIGFjY2VzcyAqLwpAQCAtMjMxLDYgKzIzNCw3IEBACiAjZGVmaW5lCUZTX0lPQ19TRVRGTEFHUwkJCV9JT1coJ2YnLCAyLCBsb25nKQogI2RlZmluZQlGU19JT0NfR0VUVkVSU0lPTgkJX0lPUigndicsIDEsIGxvbmcpCiAjZGVmaW5lCUZTX0lPQ19TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgbG9uZykKKyNkZWZpbmUgRlNfSU9DX0ZJRU1BUAkJCV9JT1dSKCdmJywgMTEsIHN0cnVjdCBmaWVtYXApCiAjZGVmaW5lIEZTX0lPQzMyX0dFVEZMQUdTCQlfSU9SKCdmJywgMSwgaW50KQogI2RlZmluZSBGU19JT0MzMl9TRVRGTEFHUwkJX0lPVygnZicsIDIsIGludCkKICNkZWZpbmUgRlNfSU9DMzJfR0VUVkVSU0lPTgkJX0lPUigndicsIDEsIGludCkKQEAgLTI5MSw2ICsyOTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTk0Miw2ICs5NDcsMTQgQEAKIAlpbnQgKCpmbF9jaGFuZ2UpKHN0cnVjdCBmaWxlX2xvY2sgKiosIGludCk7CiB9OwogCitzdHJ1Y3QgbG9ja19tYW5hZ2VyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCit2b2lkIGxvY2tzX3N0YXJ0X2dyYWNlKHN0cnVjdCBsb2NrX21hbmFnZXIgKik7Cit2b2lkIGxvY2tzX2VuZF9ncmFjZShzdHJ1Y3QgbG9ja19tYW5hZ2VyICopOworaW50IGxvY2tzX2luX2dyYWNlKHZvaWQpOworCiAvKiB0aGF0IHdpbGwgZGllIC0gd2UgbmVlZCBpdCBmb3IgbmZzX2xvY2tfaW5mbyAqLwogI2luY2x1ZGUgPGxpbnV4L25mc19mc19pLmg+CiAKQEAgLTk4Myw2ICs5OTYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAKK2V4dGVybiB2b2lkIHNlbmRfc2lnaW8oc3RydWN0IGZvd25fc3RydWN0ICpmb3duLCBpbnQgZmQsIGludCBiYW5kKTsKKworLyogZnMvc3luYy5jICovCitleHRlcm4gaW50IGRvX3N5bmNfbWFwcGluZ19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IG9mZnNldCwKKwkJCWxvZmZfdCBlbmRieXRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0ZJTEVfTE9DS0lORwogZXh0ZXJuIGludCBmY250bF9nZXRsayhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZmxvY2sgX191c2VyICopOwogZXh0ZXJuIGludCBmY250bF9zZXRsayh1bnNpZ25lZCBpbnQsIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwKIAkJCXN0cnVjdCBmbG9jayBfX3VzZXIgKik7CkBAIC05OTMsMTQgKzEwMTMsOSBAQAogCQkJc3RydWN0IGZsb2NrNjQgX191c2VyICopOwogI2VuZGlmCiAKLWV4dGVybiB2b2lkIHNlbmRfc2lnaW8oc3RydWN0IGZvd25fc3RydWN0ICpmb3duLCBpbnQgZmQsIGludCBiYW5kKTsKIGV4dGVybiBpbnQgZmNudGxfc2V0bGVhc2UodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBmY250bF9nZXRsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKLS8qIGZzL3N5bmMuYyAqLwotZXh0ZXJuIGludCBkb19zeW5jX21hcHBpbmdfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBvZmZzZXQsCi0JCQlsb2ZmX3QgZW5kYnl0ZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKLQogLyogZnMvbG9ja3MuYyAqLwogZXh0ZXJuIHZvaWQgbG9ja3NfaW5pdF9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gdm9pZCBsb2Nrc19jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwpAQCAtMTAyMyw2ICsxMDM4LDM3IEBACiBleHRlcm4gaW50IGxvY2tfbWF5X3JlYWQoc3RydWN0IGlub2RlICosIGxvZmZfdCBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gaW50IGxvY2tfbWF5X3dyaXRlKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9uczsKKyNlbHNlIC8qICFDT05GSUdfRklMRV9MT0NLSU5HICovCisjZGVmaW5lIGZjbnRsX2dldGxrKGEsIGIpICh7IC1FSU5WQUw7IH0pCisjZGVmaW5lIGZjbnRsX3NldGxrKGEsIGIsIGMsIGQpICh7IC1FQUNDRVM7IH0pCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorI2RlZmluZSBmY250bF9nZXRsazY0KGEsIGIpICh7IC1FSU5WQUw7IH0pCisjZGVmaW5lIGZjbnRsX3NldGxrNjQoYSwgYiwgYywgZCkgKHsgLUVBQ0NFUzsgfSkKKyNlbmRpZgorI2RlZmluZSBmY250bF9zZXRsZWFzZShhLCBiLCBjKSAoeyAwOyB9KQorI2RlZmluZSBmY250bF9nZXRsZWFzZShhKSAoeyAwOyB9KQorI2RlZmluZSBsb2Nrc19pbml0X2xvY2soYSkgKHsgfSkKKyNkZWZpbmUgX19sb2Nrc19jb3B5X2xvY2soYSwgYikgKHsgfSkKKyNkZWZpbmUgbG9ja3NfY29weV9sb2NrKGEsIGIpICh7IH0pCisjZGVmaW5lIGxvY2tzX3JlbW92ZV9wb3NpeChhLCBiKSAoeyB9KQorI2RlZmluZSBsb2Nrc19yZW1vdmVfZmxvY2soYSkgKHsgfSkKKyNkZWZpbmUgcG9zaXhfdGVzdF9sb2NrKGEsIGIpICh7IDA7IH0pCisjZGVmaW5lIHBvc2l4X2xvY2tfZmlsZShhLCBiLCBjKSAoeyAtRU5PTENLOyB9KQorI2RlZmluZSBwb3NpeF9sb2NrX2ZpbGVfd2FpdChhLCBiKSAoeyAtRU5PTENLOyB9KQorI2RlZmluZSBwb3NpeF91bmJsb2NrX2xvY2soYSwgYikgKC1FTk9FTlQpCisjZGVmaW5lIHZmc190ZXN0X2xvY2soYSwgYikgKHsgMDsgfSkKKyNkZWZpbmUgdmZzX2xvY2tfZmlsZShhLCBiLCBjLCBkKSAoLUVOT0xDSykKKyNkZWZpbmUgdmZzX2NhbmNlbF9sb2NrKGEsIGIpICh7IDA7IH0pCisjZGVmaW5lIGZsb2NrX2xvY2tfZmlsZV93YWl0KGEsIGIpICh7IC1FTk9MQ0s7IH0pCisjZGVmaW5lIF9fYnJlYWtfbGVhc2UoYSwgYikgKHsgMDsgfSkKKyNkZWZpbmUgbGVhc2VfZ2V0X210aW1lKGEsIGIpICh7IH0pCisjZGVmaW5lIGdlbmVyaWNfc2V0bGVhc2UoYSwgYiwgYykgKHsgLUVJTlZBTDsgfSkKKyNkZWZpbmUgdmZzX3NldGxlYXNlKGEsIGIsIGMpICh7IC1FSU5WQUw7IH0pCisjZGVmaW5lIGxlYXNlX21vZGlmeShhLCBiKSAoeyAtRUlOVkFMOyB9KQorI2RlZmluZSBsb2NrX21heV9yZWFkKGEsIGIsIGMpICh7IDE7IH0pCisjZGVmaW5lIGxvY2tfbWF5X3dyaXRlKGEsIGIsIGMpICh7IDE7IH0pCisjZW5kaWYgLyogIUNPTkZJR19GSUxFX0xPQ0tJTkcgKi8KKwogCiBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCB7CiAJaW50CW1hZ2ljOwpAQCAtMTE3OSw2ICsxMjI1LDIwIEBACiBleHRlcm4gaW50IGZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqLCBpbnQpOwogCiAvKgorICogVkZTIEZTX0lPQ19GSUVNQVAgaGVscGVyIGRlZmluaXRpb25zLgorICovCitzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZmlfZmxhZ3M7CQkvKiBGbGFncyBhcyBwYXNzZWQgZnJvbSB1c2VyICovCisJdW5zaWduZWQgaW50IGZpX2V4dGVudHNfbWFwcGVkOwkvKiBOdW1iZXIgb2YgbWFwcGVkIGV4dGVudHMgKi8KKwl1bnNpZ25lZCBpbnQgZmlfZXh0ZW50c19tYXg7CS8qIFNpemUgb2YgZmllbWFwX2V4dGVudCBhcnJheSAqLworCXN0cnVjdCBmaWVtYXBfZXh0ZW50ICpmaV9leHRlbnRzX3N0YXJ0OyAvKiBTdGFydCBvZiBmaWVtYXBfZXh0ZW50CisJCQkJCQkgKiBhcnJheSAqLworfTsKK2ludCBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICppbmZvLCB1NjQgbG9naWNhbCwKKwkJCSAgICB1NjQgcGh5cywgdTY0IGxlbiwgdTMyIGZsYWdzKTsKK2ludCBmaWVtYXBfY2hlY2tfZmxhZ3Moc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTMyIGZzX2ZsYWdzKTsKKworLyoKICAqIEZpbGUgdHlwZXMKICAqCiAgKiBOT1RFISBUaGVzZSBtYXRjaCBiaXRzIDEyLi4xNSBvZiBzdGF0LnN0X21vZGUKQEAgLTEyODcsNiArMTM0Nyw4IEBACiAJdm9pZCAoKnRydW5jYXRlX3JhbmdlKShzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90LCBsb2ZmX3QpOwogCWxvbmcgKCpmYWxsb2NhdGUpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAogCQkJICBsb2ZmX3QgbGVuKTsKKwlpbnQgKCpmaWVtYXApKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICosIHU2NCBzdGFydCwKKwkJICAgICAgdTY0IGxlbik7CiB9OwogCiBzdHJ1Y3Qgc2VxX2ZpbGU7CkBAIC0xNTU0LDkgKzE2MTYsMTIgQEAKIC8qIC9zeXMvZnMgKi8KIGV4dGVybiBzdHJ1Y3Qga29iamVjdCAqZnNfa29iajsKIAorZXh0ZXJuIGludCByd192ZXJpZnlfYXJlYShpbnQsIHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QpOworCiAjZGVmaW5lIEZMT0NLX1ZFUklGWV9SRUFEICAxCiAjZGVmaW5lIEZMT0NLX1ZFUklGWV9XUklURSAyCiAKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiBleHRlcm4gaW50IGxvY2tzX21hbmRhdG9yeV9sb2NrZWQoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBsb2Nrc19tYW5kYXRvcnlfYXJlYShpbnQsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIHNpemVfdCk7CiAKQEAgLTE1ODcsOCArMTY1Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbnQgcndfdmVyaWZ5X2FyZWEoaW50LCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90KTsKLQogc3RhdGljIGlubGluZSBpbnQgbG9ja3NfdmVyaWZ5X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSAgICBsb2ZmX3Qgc2l6ZSkKQEAgLTE2MDksNiArMTY3MiwxNSBAQAogCQlyZXR1cm4gX19icmVha19sZWFzZShpbm9kZSwgbW9kZSk7CiAJcmV0dXJuIDA7CiB9CisjZWxzZSAvKiAhQ09ORklHX0ZJTEVfTE9DS0lORyAqLworI2RlZmluZSBsb2Nrc19tYW5kYXRvcnlfbG9ja2VkKGEpICh7IDA7IH0pCisjZGVmaW5lIGxvY2tzX21hbmRhdG9yeV9hcmVhKGEsIGIsIGMsIGQsIGUpICh7IDA7IH0pCisjZGVmaW5lIF9fbWFuZGF0b3J5X2xvY2soYSkgKHsgMDsgfSkKKyNkZWZpbmUgbWFuZGF0b3J5X2xvY2soYSkgKHsgMDsgfSkKKyNkZWZpbmUgbG9ja3NfdmVyaWZ5X2xvY2tlZChhKSAoeyAwOyB9KQorI2RlZmluZSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoYSwgYiwgYykgKHsgMDsgfSkKKyNkZWZpbmUgYnJlYWtfbGVhc2UoYSwgYikgKHsgMDsgfSkKKyNlbmRpZiAvKiBDT05GSUdfRklMRV9MT0NLSU5HICovCiAKIC8qIGZzL29wZW4uYyAqLwogCkBAIC0xNjgyLDYgKzE3NTQsNyBAQAogCiAvKiBmcy9ibG9ja19kZXYuYyAqLwogI2RlZmluZSBCREVWTkFNRV9TSVpFCTMyCS8qIExhcmdlc3Qgc3RyaW5nIGZvciBhIGJsb2NrZGV2IGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgQkRFVlRfU0laRQkxMAkvKiBMYXJnZXN0IHN0cmluZyBmb3IgTUFKOk1JTiBmb3IgYmxrZGV2ICovCiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKICNkZWZpbmUgQkxLREVWX01BSk9SX0hBU0hfU0laRQkyNTUKQEAgLTE3MTgsNiArMTc5MSw5IEBACiAgKi8KICNkZWZpbmUgYmlvX2RhdGFfZGlyKGJpbykJKChiaW8pLT5iaV9ydyAmIDEpCiAKK2V4dGVybiB2b2lkIGNoZWNrX2Rpc2tfc2l6ZV9jaGFuZ2Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssCisJCQkJICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CitleHRlcm4gaW50IHJldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqKTsKIGV4dGVybiBpbnQgY2hlY2tfZGlza19jaGFuZ2Uoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKIGV4dGVybiBpbnQgX19pbnZhbGlkYXRlX2RldmljZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOwogZXh0ZXJuIGludCBpbnZhbGlkYXRlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqLCBpbnQpOwpAQCAtMTk4MCw2ICsyMDU2LDkgQEAKIAogZXh0ZXJuIGludCBkb192ZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZ2VuZXJpY19ibG9ja19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLCB1NjQgc3RhcnQsCisJCQkJdTY0IGxlbiwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jayk7CiAKIGV4dGVybiB2b2lkIGdldF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyk7CiBleHRlcm4gdm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oIGIvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCmluZGV4IGY2NGUyOWMuLjBjZDgyNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKQEAgLTE0NiwxMCArMTQ2LDExIEBACiAJbXV0ZXhfdW5sb2NrKCZnYW1lcG9ydC0+ZHJ2X211dGV4KTsKIH0KIAotdm9pZCBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQoraW50IF9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydiwKKwkJCQlzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpOworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGdhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYpCiB7Ci0JX19nYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoZHJ2LCBUSElTX01PRFVMRSk7CisJcmV0dXJuIF9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKIH0KIAogdm9pZCBnYW1lcG9ydF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5oZC5oIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCmluZGV4IGJlNGY1ZTUuLjIwNmNkZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKQEAgLTExLDEyICsxMSwxNSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiAKLSNkZWZpbmUga29ial90b19kZXYoaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBkZXZpY2UsIGtvYmopCi0jZGVmaW5lIGRldl90b19kaXNrKGRldmljZSkgY29udGFpbmVyX29mKGRldmljZSwgc3RydWN0IGdlbmRpc2ssIGRldikKLSNkZWZpbmUgZGV2X3RvX3BhcnQoZGV2aWNlKSBjb250YWluZXJfb2YoZGV2aWNlLCBzdHJ1Y3QgaGRfc3RydWN0LCBkZXYpCisjZGVmaW5lIGtvYmpfdG9fZGV2KGspCQljb250YWluZXJfb2YoKGspLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQorI2RlZmluZSBkZXZfdG9fZGlzayhkZXZpY2UpCWNvbnRhaW5lcl9vZigoZGV2aWNlKSwgc3RydWN0IGdlbmRpc2ssIHBhcnQwLl9fZGV2KQorI2RlZmluZSBkZXZfdG9fcGFydChkZXZpY2UpCWNvbnRhaW5lcl9vZigoZGV2aWNlKSwgc3RydWN0IGhkX3N0cnVjdCwgX19kZXYpCisjZGVmaW5lIGRpc2tfdG9fZGV2KGRpc2spCSgmKGRpc2spLT5wYXJ0MC5fX2RldikKKyNkZWZpbmUgcGFydF90b19kZXYocGFydCkJKCYoKHBhcnQpLT5fX2RldikpCiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgcGFydF90eXBlOwogZXh0ZXJuIHN0cnVjdCBrb2JqZWN0ICpibG9ja19kZXByOwpAQCAtNTUsNiArNTgsOSBAQAogCVVOSVhXQVJFX1BBUlRJVElPTiA9IDB4NjMsCS8qIFNhbWUgYXMgR05VX0hVUkQgYW5kIFNDTyBVbml4ICovCiB9OwogCisjZGVmaW5lIERJU0tfTUFYX1BBUlRTCQkJMjU2CisjZGVmaW5lIERJU0tfTkFNRV9MRU4JCQkzMgorCiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KQEAgLTg3LDcgKzkzLDcgQEAKIHN0cnVjdCBoZF9zdHJ1Y3QgewogCXNlY3Rvcl90IHN0YXJ0X3NlY3Q7CiAJc2VjdG9yX3QgbnJfc2VjdHM7Ci0Jc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGRldmljZSBfX2RldjsKIAlzdHJ1Y3Qga29iamVjdCAqaG9sZGVyX2RpcjsKIAlpbnQgcG9saWN5LCBwYXJ0bm87CiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCkBAIC0xMDAsNiArMTA2LDcgQEAKICNlbHNlCiAJc3RydWN0IGRpc2tfc3RhdHMgZGtzdGF0czsKICNlbmRpZgorCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKIH07CiAKICNkZWZpbmUgR0VOSERfRkxfUkVNT1ZBQkxFCQkJMQpAQCAtMTA4LDEwMCArMTE1LDE0OCBAQAogI2RlZmluZSBHRU5IRF9GTF9DRAkJCQk4CiAjZGVmaW5lIEdFTkhEX0ZMX1VQCQkJCTE2CiAjZGVmaW5lIEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPCTMyCi0jZGVmaW5lIEdFTkhEX0ZMX0ZBSUwJCQkJNjQKKyNkZWZpbmUgR0VOSERfRkxfRVhUX0RFVlQJCQk2NCAvKiBhbGxvdyBleHRlbmRlZCBkZXZ0ICovCisKKyNkZWZpbmUgQkxLX1NDU0lfTUFYX0NNRFMJKDI1NikKKyNkZWZpbmUgQkxLX1NDU0lfQ01EX1BFUl9MT05HCShCTEtfU0NTSV9NQVhfQ01EUyAvIChzaXplb2YobG9uZykgKiA4KSkKKworc3RydWN0IGJsa19zY3NpX2NtZF9maWx0ZXIgeworCXVuc2lnbmVkIGxvbmcgcmVhZF9va1tCTEtfU0NTSV9DTURfUEVSX0xPTkddOworCXVuc2lnbmVkIGxvbmcgd3JpdGVfb2tbQkxLX1NDU0lfQ01EX1BFUl9MT05HXTsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworfTsKKworc3RydWN0IGRpc2tfcGFydF90YmwgeworCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwlpbnQgbGVuOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnRbXTsKK307CiAKIHN0cnVjdCBnZW5kaXNrIHsKKwkvKiBtYWpvciwgZmlyc3RfbWlub3IgYW5kIG1pbm9ycyBhcmUgaW5wdXQgcGFyYW1ldGVycyBvbmx5LAorCSAqIGRvbid0IHVzZSBkaXJlY3RseS4gIFVzZSBkaXNrX2RldnQoKSBhbmQgZGlza19tYXhfcGFydHMoKS4KKwkgKi8KIAlpbnQgbWFqb3I7CQkJLyogbWFqb3IgbnVtYmVyIG9mIGRyaXZlciAqLwogCWludCBmaXJzdF9taW5vcjsKIAlpbnQgbWlub3JzOyAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIG1pbm9ycywgPTEgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGlza3MgdGhhdCBjYW4ndCBiZSBwYXJ0aXRpb25lZC4gKi8KLQljaGFyIGRpc2tfbmFtZVszMl07CQkvKiBuYW1lIG9mIG1ham9yIGRyaXZlciAqLwotCXN0cnVjdCBoZF9zdHJ1Y3QgKipwYXJ0OwkvKiBbaW5kZXhlZCBieSBtaW5vcl0gKi8KKworCWNoYXIgZGlza19uYW1lW0RJU0tfTkFNRV9MRU5dOwkvKiBuYW1lIG9mIG1ham9yIGRyaXZlciAqLworCisJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gcGFydGl0aW9ucyBpbmRleGVkIGJ5IHBhcnRuby4KKwkgKiBQcm90ZWN0ZWQgd2l0aCBtYXRjaGluZyBiZGV2IGxvY2sgYnV0IHN0YXQgYW5kIG90aGVyCisJICogbm9uLWNyaXRpY2FsIGFjY2Vzc2VzIHVzZSBSQ1UuICBBbHdheXMgYWNjZXNzIHRocm91Z2gKKwkgKiBoZWxwZXJzLgorCSAqLworCXN0cnVjdCBkaXNrX3BhcnRfdGJsICpwYXJ0X3RibDsKKwlzdHJ1Y3QgaGRfc3RydWN0IHBhcnQwOworCiAJc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zICpmb3BzOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIAl2b2lkICpwcml2YXRlX2RhdGE7Ci0Jc2VjdG9yX3QgY2FwYWNpdHk7CiAKIAlpbnQgZmxhZ3M7CiAJc3RydWN0IGRldmljZSAqZHJpdmVyZnNfZGV2OyAgLy8gRklYTUU6IHJlbW92ZQotCXN0cnVjdCBkZXZpY2UgZGV2OwotCXN0cnVjdCBrb2JqZWN0ICpob2xkZXJfZGlyOwogCXN0cnVjdCBrb2JqZWN0ICpzbGF2ZV9kaXI7CiAKIAlzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqcmFuZG9tOwotCWludCBwb2xpY3k7CiAKIAlhdG9taWNfdCBzeW5jX2lvOwkJLyogUkFJRCAqLwotCXVuc2lnbmVkIGxvbmcgc3RhbXA7Ci0JaW50IGluX2ZsaWdodDsKLSNpZmRlZglDT05GSUdfU01QCi0Jc3RydWN0IGRpc2tfc3RhdHMgKmRrc3RhdHM7Ci0jZWxzZQotCXN0cnVjdCBkaXNrX3N0YXRzIGRrc3RhdHM7Ci0jZW5kaWYKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXN5bmNfbm90aWZ5OwogI2lmZGVmICBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkKIAlzdHJ1Y3QgYmxrX2ludGVncml0eSAqaW50ZWdyaXR5OwogI2VuZGlmCisJaW50IG5vZGVfaWQ7CiB9OwogCi0vKiAKLSAqIE1hY3JvcyB0byBvcGVyYXRlIG9uIHBlcmNwdSBkaXNrIHN0YXRpc3RpY3M6Ci0gKgotICogVGhlIF9fIHZhcmlhbnRzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBjcml0aWNhbCBzZWN0aW9ucy4gVGhlIGZ1bGwKLSAqIHZhcmlhbnRzIGRpc2FibGUvZW5hYmxlIHByZWVtcHRpb24uCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGhkX3N0cnVjdCAqZ2V0X3BhcnQoc3RydWN0IGdlbmRpc2sgKmdlbmRpc2twLAotCQkJCQkgc2VjdG9yX3Qgc2VjdG9yKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuZGlzayAqcGFydF90b19kaXNrKHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCiB7Ci0Jc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgZ2VuZGlza3AtPm1pbm9ycyAtIDE7IGkrKykgewotCQlwYXJ0ID0gZ2VuZGlza3AtPnBhcnRbaV07Ci0JCWlmIChwYXJ0ICYmIHBhcnQtPnN0YXJ0X3NlY3QgPD0gc2VjdG9yCi0JCSAgICAmJiBzZWN0b3IgPCBwYXJ0LT5zdGFydF9zZWN0ICsgcGFydC0+bnJfc2VjdHMpCi0JCQlyZXR1cm4gcGFydDsKKwlpZiAobGlrZWx5KHBhcnQpKSB7CisJCWlmIChwYXJ0LT5wYXJ0bm8pCisJCQlyZXR1cm4gZGV2X3RvX2Rpc2socGFydF90b19kZXYocGFydCktPnBhcmVudCk7CisJCWVsc2UKKwkJCXJldHVybiBkZXZfdG9fZGlzayhwYXJ0X3RvX2RldihwYXJ0KSk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGludCBkaXNrX21heF9wYXJ0cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9FWFRfREVWVCkKKwkJcmV0dXJuIERJU0tfTUFYX1BBUlRTOworCXJldHVybiBkaXNrLT5taW5vcnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkaXNrX3BhcnRpdGlvbmFibGUoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJcmV0dXJuIGRpc2tfbWF4X3BhcnRzKGRpc2spID4gMTsKK30KKworc3RhdGljIGlubGluZSBkZXZfdCBkaXNrX2RldnQoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJcmV0dXJuIGRpc2tfdG9fZGV2KGRpc2spLT5kZXZ0OworfQorCitzdGF0aWMgaW5saW5lIGRldl90IHBhcnRfZGV2dChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCXJldHVybiBwYXJ0X3RvX2RldihwYXJ0KS0+ZGV2dDsKK30KKworZXh0ZXJuIHN0cnVjdCBoZF9zdHJ1Y3QgKmRpc2tfZ2V0X3BhcnQoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pOworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlza19wdXRfcGFydChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCWlmIChsaWtlbHkocGFydCkpCisJCXB1dF9kZXZpY2UocGFydF90b19kZXYocGFydCkpOworfQorCisvKgorICogU21hcnRlciBwYXJ0aXRpb24gaXRlcmF0b3Igd2l0aG91dCBjb250ZXh0IGxpbWl0cy4KKyAqLworI2RlZmluZSBESVNLX1BJVEVSX1JFVkVSU0UJKDEgPDwgMCkgLyogaXRlcmF0ZSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgRElTS19QSVRFUl9JTkNMX0VNUFRZCSgxIDw8IDEpIC8qIGluY2x1ZGUgMC1zaXplZCBwYXJ0cyAqLworI2RlZmluZSBESVNLX1BJVEVSX0lOQ0xfUEFSVDAJKDEgPDwgMikgLyogaW5jbHVkZSBwYXJ0aXRpb24gMCAqLworCitzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgeworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3QgaGRfc3RydWN0CSpwYXJ0OworCWludAkJCWlkeDsKKwl1bnNpZ25lZCBpbnQJCWZsYWdzOworfTsKKworZXh0ZXJuIHZvaWQgZGlza19wYXJ0X2l0ZXJfaW5pdChzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgKnBpdGVyLAorCQkJCSBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgaGRfc3RydWN0ICpkaXNrX3BhcnRfaXRlcl9uZXh0KHN0cnVjdCBkaXNrX3BhcnRfaXRlciAqcGl0ZXIpOworZXh0ZXJuIHZvaWQgZGlza19wYXJ0X2l0ZXJfZXhpdChzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgKnBpdGVyKTsKKworZXh0ZXJuIHN0cnVjdCBoZF9zdHJ1Y3QgKmRpc2tfbWFwX3NlY3Rvcl9yY3Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssCisJCQkJCSAgICAgc2VjdG9yX3Qgc2VjdG9yKTsKKworLyoKKyAqIE1hY3JvcyB0byBvcGVyYXRlIG9uIHBlcmNwdSBkaXNrIHN0YXRpc3RpY3M6CisgKgorICoge2Rpc2t8cGFydHxhbGx9X3N0YXRfe2FkZHxzdWJ8aW5jfGRlY30oKSBtb2RpZnkgdGhlIHN0YXQgY291bnRlcnMKKyAqIGFuZCBzaG91bGQgYmUgY2FsbGVkIGJldHdlZW4gZGlza19zdGF0X2xvY2soKSBhbmQKKyAqIGRpc2tfc3RhdF91bmxvY2soKS4KKyAqCisgKiBwYXJ0X3N0YXRfcmVhZCgpIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUuCisgKgorICogcGFydF9zdGF0X3thZGR8c2V0X2FsbH0oKSBhbmQge2luaXR8ZnJlZX1fcGFydF9zdGF0cyBhcmUgZm9yCisgKiBpbnRlcm5hbCB1c2Ugb25seS4KKyAqLwogI2lmZGVmCUNPTkZJR19TTVAKLSNkZWZpbmUgX19kaXNrX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpIAlcCi0JKHBlcl9jcHVfcHRyKGdlbmRpc2twLT5ka3N0YXRzLCBzbXBfcHJvY2Vzc29yX2lkKCkpLT5maWVsZCArPSBhZGRuZCkKKyNkZWZpbmUgcGFydF9zdGF0X2xvY2soKQkoeyByY3VfcmVhZF9sb2NrKCk7IGdldF9jcHUoKTsgfSkKKyNkZWZpbmUgcGFydF9zdGF0X3VubG9jaygpCWRvIHsgcHV0X2NwdSgpOyByY3VfcmVhZF91bmxvY2soKTsgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBkaXNrX3N0YXRfcmVhZChnZW5kaXNrcCwgZmllbGQpCQkJCQlcCi0oewkJCQkJCQkJCVwKLQl0eXBlb2YoZ2VuZGlza3AtPmRrc3RhdHMtPmZpZWxkKSByZXMgPSAwOwkJCVwKLQlpbnQgaTsJCQkJCQkJCVwKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkJCQkJCVwKLQkJcmVzICs9IHBlcl9jcHVfcHRyKGdlbmRpc2twLT5ka3N0YXRzLCBpKS0+ZmllbGQ7CVwKLQlyZXM7CQkJCQkJCQlcCi19KQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlza19zdGF0X3NldF9hbGwoc3RydWN0IGdlbmRpc2sgKmdlbmRpc2twLCBpbnQgdmFsdWUpCXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQltZW1zZXQocGVyX2NwdV9wdHIoZ2VuZGlza3AtPmRrc3RhdHMsIGkpLCB2YWx1ZSwKLQkJCQlzaXplb2Yoc3RydWN0IGRpc2tfc3RhdHMpKTsKLX0JCQotCi0jZGVmaW5lIF9fcGFydF9zdGF0X2FkZChwYXJ0LCBmaWVsZCwgYWRkbmQpCQkJCVwKLQkocGVyX2NwdV9wdHIocGFydC0+ZGtzdGF0cywgc21wX3Byb2Nlc3Nvcl9pZCgpKS0+ZmllbGQgKz0gYWRkbmQpCi0KLSNkZWZpbmUgX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIHBhcnQsIGZpZWxkLCBhZGRuZCwgc2VjdG9yKQlcCi0oewkJCQkJCQkJXAotCWlmIChwYXJ0KQkJCQkJCVwKLQkJX19wYXJ0X3N0YXRfYWRkKHBhcnQsIGZpZWxkLCBhZGRuZCk7CQlcCi0JX19kaXNrX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpOwkJXAotfSkKKyNkZWZpbmUgX19wYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgZmllbGQsIGFkZG5kKQkJCVwKKwkocGVyX2NwdV9wdHIoKHBhcnQpLT5ka3N0YXRzLCAoY3B1KSktPmZpZWxkICs9IChhZGRuZCkpCiAKICNkZWZpbmUgcGFydF9zdGF0X3JlYWQocGFydCwgZmllbGQpCQkJCQlcCiAoewkJCQkJCQkJCVwKLQl0eXBlb2YocGFydC0+ZGtzdGF0cy0+ZmllbGQpIHJlcyA9IDA7CQkJCVwKKwl0eXBlb2YoKHBhcnQpLT5ka3N0YXRzLT5maWVsZCkgcmVzID0gMDsJCQkJXAogCWludCBpOwkJCQkJCQkJXAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQkJCQkJXAotCQlyZXMgKz0gcGVyX2NwdV9wdHIocGFydC0+ZGtzdGF0cywgaSktPmZpZWxkOwkJXAorCQlyZXMgKz0gcGVyX2NwdV9wdHIoKHBhcnQpLT5ka3N0YXRzLCBpKS0+ZmllbGQ7CQlcCiAJcmVzOwkJCQkJCQkJXAogfSkKIApAQCAtMjEzLDEwOCArMjY4LDYgQEAKIAkJbWVtc2V0KHBlcl9jcHVfcHRyKHBhcnQtPmRrc3RhdHMsIGkpLCB2YWx1ZSwKIAkJCQlzaXplb2Yoc3RydWN0IGRpc2tfc3RhdHMpKTsKIH0KLQkJCQkKLSNlbHNlIC8qICFDT05GSUdfU01QICovCi0jZGVmaW5lIF9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKSBcCi0JCQkJKGdlbmRpc2twLT5ka3N0YXRzLmZpZWxkICs9IGFkZG5kKQotI2RlZmluZSBkaXNrX3N0YXRfcmVhZChnZW5kaXNrcCwgZmllbGQpCShnZW5kaXNrcC0+ZGtzdGF0cy5maWVsZCkKLQotc3RhdGljIGlubGluZSB2b2lkIGRpc2tfc3RhdF9zZXRfYWxsKHN0cnVjdCBnZW5kaXNrICpnZW5kaXNrcCwgaW50IHZhbHVlKQotewotCW1lbXNldCgmZ2VuZGlza3AtPmRrc3RhdHMsIHZhbHVlLCBzaXplb2YgKHN0cnVjdCBkaXNrX3N0YXRzKSk7Ci19Ci0KLSNkZWZpbmUgX19wYXJ0X3N0YXRfYWRkKHBhcnQsIGZpZWxkLCBhZGRuZCkgXAotCShwYXJ0LT5ka3N0YXRzLmZpZWxkICs9IGFkZG5kKQotCi0jZGVmaW5lIF9fYWxsX3N0YXRfYWRkKGdlbmRpc2twLCBwYXJ0LCBmaWVsZCwgYWRkbmQsIHNlY3RvcikJXAotKHsJCQkJCQkJCVwKLQlpZiAocGFydCkJCQkJCQlcCi0JCXBhcnQtPmRrc3RhdHMuZmllbGQgKz0gYWRkbmQ7CQkJXAotCV9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKTsJCVwKLX0pCi0KLSNkZWZpbmUgcGFydF9zdGF0X3JlYWQocGFydCwgZmllbGQpCShwYXJ0LT5ka3N0YXRzLmZpZWxkKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFydF9zdGF0X3NldF9hbGwoc3RydWN0IGhkX3N0cnVjdCAqcGFydCwgaW50IHZhbHVlKQotewotCW1lbXNldCgmcGFydC0+ZGtzdGF0cywgdmFsdWUsIHNpemVvZihzdHJ1Y3QgZGlza19zdGF0cykpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi0jZGVmaW5lIGRpc2tfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCBhZGRuZCkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCXByZWVtcHRfZGlzYWJsZSgpOwkJCQlcCi0JCV9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKTsJXAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX2Rpc2tfc3RhdF9kZWMoZ2VuZGlza3AsIGZpZWxkKSBfX2Rpc2tfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtMSkKLSNkZWZpbmUgZGlza19zdGF0X2RlYyhnZW5kaXNrcCwgZmllbGQpIGRpc2tfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtMSkKLQotI2RlZmluZSBfX2Rpc2tfc3RhdF9pbmMoZ2VuZGlza3AsIGZpZWxkKSBfX2Rpc2tfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAxKQotI2RlZmluZSBkaXNrX3N0YXRfaW5jKGdlbmRpc2twLCBmaWVsZCkgZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIDEpCi0KLSNkZWZpbmUgX19kaXNrX3N0YXRfc3ViKGdlbmRpc2twLCBmaWVsZCwgc3VibmQpIFwKLQkJX19kaXNrX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgLXN1Ym5kKQotI2RlZmluZSBkaXNrX3N0YXRfc3ViKGdlbmRpc2twLCBmaWVsZCwgc3VibmQpIFwKLQkJZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC1zdWJuZCkKLQotI2RlZmluZSBwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpCQlcCi0JZG8gewkJCQkJCVwKLQkJcHJlZW1wdF9kaXNhYmxlKCk7CQkJXAotCQlfX3BhcnRfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCBhZGRuZCk7XAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fcGFydF9zdGF0X2RlYyhnZW5kaXNrcCwgZmllbGQpIF9fcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC0xKQotI2RlZmluZSBwYXJ0X3N0YXRfZGVjKGdlbmRpc2twLCBmaWVsZCkgcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC0xKQotCi0jZGVmaW5lIF9fcGFydF9zdGF0X2luYyhnZW5kaXNrcCwgZmllbGQpIF9fcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIDEpCi0jZGVmaW5lIHBhcnRfc3RhdF9pbmMoZ2VuZGlza3AsIGZpZWxkKSBwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgMSkKLQotI2RlZmluZSBfX3BhcnRfc3RhdF9zdWIoZ2VuZGlza3AsIGZpZWxkLCBzdWJuZCkgXAotCQlfX3BhcnRfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtc3VibmQpCi0jZGVmaW5lIHBhcnRfc3RhdF9zdWIoZ2VuZGlza3AsIGZpZWxkLCBzdWJuZCkgXAotCQlwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgLXN1Ym5kKQotCi0jZGVmaW5lIGFsbF9zdGF0X2FkZChnZW5kaXNrcCwgcGFydCwgZmllbGQsIGFkZG5kLCBzZWN0b3IpCVwKLQlkbyB7CQkJCQkJCVwKLQkJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCVwKLQkJX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIHBhcnQsIGZpZWxkLCBhZGRuZCwgc2VjdG9yKTsJXAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX2FsbF9zdGF0X2RlYyhnZW5kaXNrcCwgZmllbGQsIHNlY3RvcikgXAotCQlfX2FsbF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC0xLCBzZWN0b3IpCi0jZGVmaW5lIGFsbF9zdGF0X2RlYyhnZW5kaXNrcCwgZmllbGQsIHNlY3RvcikgXAotCQlhbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtMSwgc2VjdG9yKQotCi0jZGVmaW5lIF9fYWxsX3N0YXRfaW5jKGdlbmRpc2twLCBwYXJ0LCBmaWVsZCwgc2VjdG9yKSBcCi0JCV9fYWxsX3N0YXRfYWRkKGdlbmRpc2twLCBwYXJ0LCBmaWVsZCwgMSwgc2VjdG9yKQotI2RlZmluZSBhbGxfc3RhdF9pbmMoZ2VuZGlza3AsIHBhcnQsIGZpZWxkLCBzZWN0b3IpIFwKLQkJYWxsX3N0YXRfYWRkKGdlbmRpc2twLCBwYXJ0LCBmaWVsZCwgMSwgc2VjdG9yKQotCi0jZGVmaW5lIF9fYWxsX3N0YXRfc3ViKGdlbmRpc2twLCBwYXJ0LCBmaWVsZCwgc3VibmQsIHNlY3RvcikgXAotCQlfX2FsbF9zdGF0X2FkZChnZW5kaXNrcCwgcGFydCwgZmllbGQsIC1zdWJuZCwgc2VjdG9yKQotI2RlZmluZSBhbGxfc3RhdF9zdWIoZ2VuZGlza3AsIHBhcnQsIGZpZWxkLCBzdWJuZCwgc2VjdG9yKSBcCi0JCWFsbF9zdGF0X2FkZChnZW5kaXNrcCwgcGFydCwgZmllbGQsIC1zdWJuZCwgc2VjdG9yKQotCi0vKiBJbmxpbmVzIHRvIGFsbG9jIGFuZCBmcmVlIGRpc2sgc3RhdHMgaW4gc3RydWN0IGdlbmRpc2sgKi8KLSNpZmRlZiAgQ09ORklHX1NNUAotc3RhdGljIGlubGluZSBpbnQgaW5pdF9kaXNrX3N0YXRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCWRpc2stPmRrc3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGRpc2tfc3RhdHMpOwotCWlmICghZGlzay0+ZGtzdGF0cykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2Rpc2tfc3RhdHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCi17Ci0JZnJlZV9wZXJjcHUoZGlzay0+ZGtzdGF0cyk7Ci19CiAKIHN0YXRpYyBpbmxpbmUgaW50IGluaXRfcGFydF9zdGF0cyhzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQogewpAQCAtMzI5LDE0ICsyODIsMTggQEAKIAlmcmVlX3BlcmNwdShwYXJ0LT5ka3N0YXRzKTsKIH0KIAotI2Vsc2UJLyogQ09ORklHX1NNUCAqLwotc3RhdGljIGlubGluZSBpbnQgaW5pdF9kaXNrX3N0YXRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCXJldHVybiAxOwotfQorI2Vsc2UgLyogIUNPTkZJR19TTVAgKi8KKyNkZWZpbmUgcGFydF9zdGF0X2xvY2soKQkoeyByY3VfcmVhZF9sb2NrKCk7IDA7IH0pCisjZGVmaW5lIHBhcnRfc3RhdF91bmxvY2soKQlyY3VfcmVhZF91bmxvY2soKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9kaXNrX3N0YXRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQorI2RlZmluZSBfX3BhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBmaWVsZCwgYWRkbmQpCQkJCVwKKwkoKHBhcnQpLT5ka3N0YXRzLmZpZWxkICs9IGFkZG5kKQorCisjZGVmaW5lIHBhcnRfc3RhdF9yZWFkKHBhcnQsIGZpZWxkKQkoKHBhcnQpLT5ka3N0YXRzLmZpZWxkKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFydF9zdGF0X3NldF9hbGwoc3RydWN0IGhkX3N0cnVjdCAqcGFydCwgaW50IHZhbHVlKQogeworCW1lbXNldCgmcGFydC0+ZGtzdGF0cywgdmFsdWUsIHNpemVvZihzdHJ1Y3QgZGlza19zdGF0cykpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpbml0X3BhcnRfc3RhdHMoc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKQEAgLTM0NywzNyArMzA0LDcxIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9wYXJ0X3N0YXRzKHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCiB7CiB9Ci0jZW5kaWYJLyogQ09ORklHX1NNUCAqLworCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisjZGVmaW5lIHBhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBmaWVsZCwgYWRkbmQpCWRvIHsJCQlcCisJX19wYXJ0X3N0YXRfYWRkKChjcHUpLCAocGFydCksIGZpZWxkLCBhZGRuZCk7CQkJXAorCWlmICgocGFydCktPnBhcnRubykJCQkJCQlcCisJCV9fcGFydF9zdGF0X2FkZCgoY3B1KSwgJnBhcnRfdG9fZGlzaygocGFydCkpLT5wYXJ0MCwJXAorCQkJCWZpZWxkLCBhZGRuZCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgcGFydF9zdGF0X2RlYyhjcHUsIGdlbmRpc2twLCBmaWVsZCkJCQkJXAorCXBhcnRfc3RhdF9hZGQoY3B1LCBnZW5kaXNrcCwgZmllbGQsIC0xKQorI2RlZmluZSBwYXJ0X3N0YXRfaW5jKGNwdSwgZ2VuZGlza3AsIGZpZWxkKQkJCQlcCisJcGFydF9zdGF0X2FkZChjcHUsIGdlbmRpc2twLCBmaWVsZCwgMSkKKyNkZWZpbmUgcGFydF9zdGF0X3N1YihjcHUsIGdlbmRpc2twLCBmaWVsZCwgc3VibmQpCQkJXAorCXBhcnRfc3RhdF9hZGQoY3B1LCBnZW5kaXNrcCwgZmllbGQsIC1zdWJuZCkKKworc3RhdGljIGlubGluZSB2b2lkIHBhcnRfaW5jX2luX2ZsaWdodChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCXBhcnQtPmluX2ZsaWdodCsrOworCWlmIChwYXJ0LT5wYXJ0bm8pCisJCXBhcnRfdG9fZGlzayhwYXJ0KS0+cGFydDAuaW5fZmxpZ2h0Kys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0X2RlY19pbl9mbGlnaHQoc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKK3sKKwlwYXJ0LT5pbl9mbGlnaHQtLTsKKwlpZiAocGFydC0+cGFydG5vKQorCQlwYXJ0X3RvX2Rpc2socGFydCktPnBhcnQwLmluX2ZsaWdodC0tOworfQogCiAvKiBkcml2ZXJzL2Jsb2NrL2xsX3J3X2Jsay5jICovCi1leHRlcm4gdm9pZCBkaXNrX3JvdW5kX3N0YXRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKLWV4dGVybiB2b2lkIHBhcnRfcm91bmRfc3RhdHMoc3RydWN0IGhkX3N0cnVjdCAqcGFydCk7CitleHRlcm4gdm9pZCBwYXJ0X3JvdW5kX3N0YXRzKGludCBjcHUsIHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpOwogCiAvKiBkcml2ZXJzL2Jsb2NrL2dlbmhkLmMgKi8KIGV4dGVybiBpbnQgZ2V0X2Jsa2Rldl9saXN0KGNoYXIgKiwgaW50KTsKIGV4dGVybiB2b2lkIGFkZF9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIGV4dGVybiB2b2lkIGRlbF9nZW5kaXNrKHN0cnVjdCBnZW5kaXNrICpncCk7CiBleHRlcm4gdm9pZCB1bmxpbmtfZ2VuZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZ3ApOwotZXh0ZXJuIHN0cnVjdCBnZW5kaXNrICpnZXRfZ2VuZGlzayhkZXZfdCBkZXYsIGludCAqcGFydCk7CitleHRlcm4gc3RydWN0IGdlbmRpc2sgKmdldF9nZW5kaXNrKGRldl90IGRldiwgaW50ICpwYXJ0bm8pOworZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZ2V0X2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pOwogCiBleHRlcm4gdm9pZCBzZXRfZGV2aWNlX3JvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBmbGFnKTsKIGV4dGVybiB2b2lkIHNldF9kaXNrX3JvKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgZmxhZyk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9kaXNrX3JvKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXJldHVybiBkaXNrLT5wYXJ0MC5wb2xpY3k7Cit9CisKIC8qIGRyaXZlcnMvY2hhci9yYW5kb20uYyAqLwogZXh0ZXJuIHZvaWQgYWRkX2Rpc2tfcmFuZG9tbmVzcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CiBleHRlcm4gdm9pZCByYW5kX2luaXRpYWxpemVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CiAKIHN0YXRpYyBpbmxpbmUgc2VjdG9yX3QgZ2V0X3N0YXJ0X3NlY3Qoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKLQlyZXR1cm4gYmRldi0+YmRfY29udGFpbnMgPT0gYmRldiA/IDAgOiBiZGV2LT5iZF9wYXJ0LT5zdGFydF9zZWN0OworCXJldHVybiBiZGV2LT5iZF9wYXJ0LT5zdGFydF9zZWN0OwogfQogc3RhdGljIGlubGluZSBzZWN0b3JfdCBnZXRfY2FwYWNpdHkoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JcmV0dXJuIGRpc2stPmNhcGFjaXR5OworCXJldHVybiBkaXNrLT5wYXJ0MC5ucl9zZWN0czsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2FwYWNpdHkoc3RydWN0IGdlbmRpc2sgKmRpc2ssIHNlY3Rvcl90IHNpemUpCiB7Ci0JZGlzay0+Y2FwYWNpdHkgPSBzaXplOworCWRpc2stPnBhcnQwLm5yX3NlY3RzID0gc2l6ZTsKIH0KIAogI2lmZGVmIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04KQEAgLTUyNyw5ICs1MTgsMTIgQEAKICNkZWZpbmUgQUREUEFSVF9GTEFHX1JBSUQJMQogI2RlZmluZSBBRERQQVJUX0ZMQUdfV0hPTEVESVNLCTIKIAotZXh0ZXJuIGRldl90IGJsa19sb29rdXBfZGV2dChjb25zdCBjaGFyICpuYW1lLCBpbnQgcGFydCk7Ci1leHRlcm4gY2hhciAqZGlza19uYW1lIChzdHJ1Y3QgZ2VuZGlzayAqaGQsIGludCBwYXJ0LCBjaGFyICpidWYpOworZXh0ZXJuIGludCBibGtfYWxsb2NfZGV2dChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0LCBkZXZfdCAqZGV2dCk7CitleHRlcm4gdm9pZCBibGtfZnJlZV9kZXZ0KGRldl90IGRldnQpOworZXh0ZXJuIGRldl90IGJsa19sb29rdXBfZGV2dChjb25zdCBjaGFyICpuYW1lLCBpbnQgcGFydG5vKTsKK2V4dGVybiBjaGFyICpkaXNrX25hbWUgKHN0cnVjdCBnZW5kaXNrICpoZCwgaW50IHBhcnRubywgY2hhciAqYnVmKTsKIAorZXh0ZXJuIGludCBkaXNrX2V4cGFuZF9wYXJ0X3RibChzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IHRhcmdldCk7CiBleHRlcm4gaW50IHJlc2Nhbl9wYXJ0aXRpb25zKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGFkZF9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKiwgaW50LCBzZWN0b3JfdCwgc2VjdG9yX3QsIGludCk7CiBleHRlcm4gdm9pZCBkZWxldGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICosIGludCk7CkBAIC01NDYsMTYgKzU0MCwyMyBAQAogCQkJdm9pZCAqZGF0YSk7CiBleHRlcm4gdm9pZCBibGtfdW5yZWdpc3Rlcl9yZWdpb24oZGV2X3QgZGV2dCwgdW5zaWduZWQgbG9uZyByYW5nZSk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrX2RldmljZSAqYmRnZXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgaW50IGluZGV4KQotewotCXJldHVybiBiZGdldChNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpICsgaW5kZXgpOwotfQorZXh0ZXJuIHNzaXplX3QgcGFydF9zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CitleHRlcm4gc3NpemVfdCBwYXJ0X3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKyNpZmRlZiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QKK2V4dGVybiBzc2l6ZV90IHBhcnRfZmFpbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworZXh0ZXJuIHNzaXplX3QgcGFydF9mYWlsX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisjZW5kaWYgLyogQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUICovCiAKICNlbHNlIC8qIENPTkZJR19CTE9DSyAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRrX2FsbF9wYXJ0aXRpb25zKHZvaWQpIHsgfQogCi1zdGF0aWMgaW5saW5lIGRldl90IGJsa19sb29rdXBfZGV2dChjb25zdCBjaGFyICpuYW1lLCBpbnQgcGFydCkKK3N0YXRpYyBpbmxpbmUgZGV2X3QgYmxrX2xvb2t1cF9kZXZ0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBwYXJ0bm8pCiB7CiAJZGV2X3QgZGV2dCA9IE1LREVWKDAsIDApOwogCXJldHVybiBkZXZ0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oIGIvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oCmluZGV4IGMzYzE5ZjkuLjE0ZDBkZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZzMl9vbmRpc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmgKQEAgLTExOCw3ICsxMTgsMTEgQEAKIAogCWNoYXIgc2JfbG9ja3Byb3RvW0dGUzJfTE9DS05BTUVfTEVOXTsKIAljaGFyIHNiX2xvY2t0YWJsZVtHRlMyX0xPQ0tOQU1FX0xFTl07Ci0JLyogSW4gZ2ZzMSwgcXVvdGEgYW5kIGxpY2Vuc2UgZGlub2RlcyBmb2xsb3dlZCAqLworCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDM7IC8qIFdhcyBxdW90YSBpbm9kZSBpbiBnZnMxICovCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDQ7IC8qIFdhcyBsaWNlbmNlIGlub2RlIGluIGdmczEgKi8KKyNkZWZpbmUgR0ZTMl9IQVNfVVVJRCAxCisJX191OCBzYl91dWlkWzE2XTsgLyogVGhlIFVVSUQsIG1heWJlIDAgZm9yIGJhY2t3YXJkcyBjb21wYXQgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW8uaCBiL2luY2x1ZGUvbGludXgvZ3Bpby5oCmluZGV4IDczMGEyMGIuLmUxMGM0OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpby5oCkBAIC04LDYgKzgsNyBAQAogCiAjZWxzZQogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCkBAIC0zMiw2ICszMyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKIHsKKwltaWdodF9zbGVlcCgpOworCiAJLyogR1BJTyBjYW4gbmV2ZXIgaGF2ZSBiZWVuIHJlcXVlc3RlZCAqLwogCVdBUk5fT04oMSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvaW5jbHVkZS9saW51eC9oaWQuaAppbmRleCBhYzRlNjc4Li5mMTNiY2EyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlkLmgKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+IC8qIGhpZF9kZXZpY2VfaWQgKi8KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yNDYsNiArMjQ3LDE5IEBACiAjZGVmaW5lIEhJRF9GRUFUVVJFX1JFUE9SVAkyCiAKIC8qCisgKiBISUQgY29ubmVjdCByZXF1ZXN0cworICovCisKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElESU5QVVQJCTB4MDEKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElESU5QVVRfRk9SQ0UJMHgwMgorI2RlZmluZSBISURfQ09OTkVDVF9ISURSQVcJCTB4MDQKKyNkZWZpbmUgSElEX0NPTk5FQ1RfSElEREVWCQkweDA4CisjZGVmaW5lIEhJRF9DT05ORUNUX0hJRERFVl9GT1JDRQkweDEwCisjZGVmaW5lIEhJRF9DT05ORUNUX0ZGCQkJMHgyMAorI2RlZmluZSBISURfQ09OTkVDVF9ERUZBVUxUCShISURfQ09OTkVDVF9ISURJTlBVVHxISURfQ09OTkVDVF9ISURSQVd8IFwKKwkJSElEX0NPTk5FQ1RfSElEREVWfEhJRF9DT05ORUNUX0ZGKQorCisvKgogICogSElEIGRldmljZSBxdWlya3MuCiAgKi8KIApAQCAtMjU2LDQ4ICsyNzAsMTEgQEAKIAogI2RlZmluZSBISURfUVVJUktfSU5WRVJUCQkJMHgwMDAwMDAwMQogI2RlZmluZSBISURfUVVJUktfTk9UT1VDSAkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRQkJCTB4MDAwMDAwMDQKICNkZWZpbmUgSElEX1FVSVJLX05PR0VUCQkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgSElEX1FVSVJLX0hJRERFVgkJCTB4MDAwMDAwMTAKICNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDAwMDAwMjAKICNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwMDAwMDA0MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNwkJMHgwMDAwMDA4MAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgwMDAwMDEwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MDAwMDAyMDAKLSNkZWZpbmUgSElEX1FVSVJLX01JR0hUWU1PVVNFCQkJMHgwMDAwMDQwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfSEFTX0ZOCQkJMHgwMDAwMDgwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfRk5fT04JCQkweDAwMDAxMDAwCi0jZGVmaW5lIEhJRF9RVUlSS19JTlZFUlRfSFdIRUVMCQkJMHgwMDAwMjAwMAotI2RlZmluZSBISURfUVVJUktfQVBQTEVfSVNPX0tFWUJPQVJECQkweDAwMDA0MDAwCi0jZGVmaW5lIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUwkJMHgwMDAwODAwMAogI2RlZmluZSBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUwkJMHgwMDAxMDAwMAotI2RlZmluZSBISURfUVVJUktfSUdOT1JFX01PVVNFCQkJMHgwMDAyMDAwMAotI2RlZmluZSBISURfUVVJUktfU09OWV9QUzNfQ09OVFJPTExFUgkJMHgwMDA0MDAwMAotI2RlZmluZSBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUwkJMHgwMDA4MDAwMAotI2RlZmluZSBISURfUVVJUktfUkVTRVRfTEVEUwkJCTB4MDAxMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0hJRElOUFVUCQkJMHgwMDIwMDAwMAotI2RlZmluZSBISURfUVVJUktfTE9HSVRFQ0hfSUdOT1JFX0RPVUJMRURfV0hFRUwJMHgwMDQwMDAwMAotI2RlZmluZSBISURfUVVJUktfTE9HSVRFQ0hfRVhQQU5ERURfS0VZTUFQCTB4MDA4MDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRV9ISURJTlBVVAkJMHgwMTAwMDAwMAotI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfQjgJCTB4MDIwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0hXSEVFTF9XSEVFTF9JTlZFUlQJCTB4MDQwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX01JQ1JPU09GVF9LRVlTCQkweDA4MDAwMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19GVUxMU1BFRURfSU5URVJWQUwJCTB4MTAwMDAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0FQUExFX05VTUxPQ0tfRU1VTEFUSU9OCTB4MjAwMDAwMDAKLQotLyoKLSAqIFNlcGFyYXRlIHF1aXJrcyBmb3IgcnVudGltZSByZXBvcnQgZGVzY3JpcHRvciBmaXh1cAotICovCi0KLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX0NZTU9USU9OCQkweDAwMDAwMDAxCi0jZGVmaW5lIEhJRF9RVUlSS19SREVTQ19MT0dJVEVDSAkJMHgwMDAwMDAwMgotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU1dBUFBFRF9NSU5fTUFYCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEhJRF9RVUlSS19SREVTQ19QRVRBTFlOWAkJMHgwMDAwMDAwOAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfTUFDQk9PS19KSVMJCTB4MDAwMDAwMTAKLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX0JVVFRPTl9DT05TVU1FUgkJMHgwMDAwMDAyMAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU0FNU1VOR19SRU1PVEUJCTB4MDAwMDAwNDAKLSNkZWZpbmUgSElEX1FVSVJLX1JERVNDX01JQ1JPU09GVF9SRUNWXzEwMjgJMHgwMDAwMDA4MAotI2RlZmluZSBISURfUVVJUktfUkRFU0NfU1VOUExVU19XREVTS1RPUAkweDAwMDAwMTAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpAQCAtNDExLDEyICszODgsMjEgQEAKIHN0cnVjdCBoaWRfY29udHJvbF9maWZvIHsKIAl1bnNpZ25lZCBjaGFyIGRpcjsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWNoYXIgKnJhd19yZXBvcnQ7Cit9OworCitzdHJ1Y3QgaGlkX291dHB1dF9maWZvIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWNoYXIgKnJhd19yZXBvcnQ7CiB9OwogCiAjZGVmaW5lIEhJRF9DTEFJTUVEX0lOUFVUCTEKICNkZWZpbmUgSElEX0NMQUlNRURfSElEREVWCTIKICNkZWZpbmUgSElEX0NMQUlNRURfSElEUkFXCTQKIAorI2RlZmluZSBISURfU1RBVF9BRERFRAkJMQorI2RlZmluZSBISURfU1RBVF9QQVJTRUQJCTIKKwogI2RlZmluZSBISURfQ1RSTF9SVU5OSU5HCTEKICNkZWZpbmUgSElEX09VVF9SVU5OSU5HCQkyCiAjZGVmaW5lIEhJRF9JTl9SVU5OSU5HCQkzCkBAIC00MzEsMjIgKzQxNywyOCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogfTsKIAorc3RydWN0IGhpZF9kcml2ZXI7CitzdHJ1Y3QgaGlkX2xsX2RyaXZlcjsKKwogc3RydWN0IGhpZF9kZXZpY2UgewkJCQkJCQkvKiBkZXZpY2UgcmVwb3J0IGRlc2NyaXB0b3IgKi8KLQkgX191OCAqcmRlc2M7CisJX191OCAqcmRlc2M7CiAJdW5zaWduZWQgcnNpemU7CiAJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2xsZWN0aW9uOwkJCQkvKiBMaXN0IG9mIEhJRCBjb2xsZWN0aW9ucyAqLwogCXVuc2lnbmVkIGNvbGxlY3Rpb25fc2l6ZTsJCQkJCS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgaGlkX2NvbGxlY3Rpb25zICovCiAJdW5zaWduZWQgbWF4Y29sbGVjdGlvbjsJCQkJCQkvKiBOdW1iZXIgb2YgcGFyc2VkIGNvbGxlY3Rpb25zICovCiAJdW5zaWduZWQgbWF4YXBwbGljYXRpb247CQkJCQkvKiBOdW1iZXIgb2YgYXBwbGljYXRpb25zICovCi0JdW5zaWduZWQgc2hvcnQgYnVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVUyBJRCAqLwotCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZW5kb3IgSUQgKi8KLQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZHVjdCBJRCAqLwotCXVuc2lnbmVkIHZlcnNpb247CQkJCQkJLyogSElEIHZlcnNpb24gKi8KKwlfX3UxNiBidXM7CQkJCQkJCS8qIEJVUyBJRCAqLworCV9fdTMyIHZlbmRvcjsJCQkJCQkJLyogVmVuZG9yIElEICovCisJX191MzIgcHJvZHVjdDsJCQkJCQkJLyogUHJvZHVjdCBJRCAqLworCV9fdTMyIHZlcnNpb247CQkJCQkJCS8qIEhJRCB2ZXJzaW9uICovCiAJdW5zaWduZWQgY291bnRyeTsJCQkJCQkvKiBISUQgY291bnRyeSAqLwogCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gcmVwb3J0X2VudW1bSElEX1JFUE9SVF9UWVBFU107CiAKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkJCQkJLyogZGV2aWNlICovCisJc3RydWN0IGRldmljZSBkZXY7CQkJCQkJLyogZGV2aWNlICovCisJc3RydWN0IGhpZF9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgaGlkX2xsX2RyaXZlciAqbGxfZHJpdmVyOwogCisJdW5zaWduZWQgaW50IHN0YXR1czsJCQkJCQkvKiBzZWUgU1RBVCBmbGFncyBhYm92ZSAqLwogCXVuc2lnbmVkIGNsYWltZWQ7CQkJCQkJLyogQ2xhaW1lZCBieSBoaWRpbnB1dCwgaGlkZGV2PyAqLwogCXVuc2lnbmVkIHF1aXJrczsJCQkJCQkvKiBWYXJpb3VzIHF1aXJrcyB0aGUgZGV2aWNlIGNhbiBwdWxsIG9uIHVzICovCiAKQEAgLTQ2MiwyNiArNDU0LDI5IEBACiAKIAl2b2lkICpkcml2ZXJfZGF0YTsKIAotCV9fczMyIGRlbGF5ZWRfdmFsdWU7CQkJCQkJLyogRm9yIEE0IFRlY2ggbWljZSBod2hlZWwgcXVpcmsgKi8KLQotCS8qIGRldmljZS1zcGVjaWZpYyBmdW5jdGlvbiBwb2ludGVycyAqLwotCWludCAoKmhpZGlucHV0X2lucHV0X2V2ZW50KSAoc3RydWN0IGlucHV0X2RldiAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgaW50KTsKLQlpbnQgKCpoaWRfb3BlbikgKHN0cnVjdCBoaWRfZGV2aWNlICopOwotCXZvaWQgKCpoaWRfY2xvc2UpIChzdHJ1Y3QgaGlkX2RldmljZSAqKTsKKwkvKiB0ZW1wb3JhcnkgaGlkX2ZmIGhhbmRsaW5nICh1bnRpbCBtb3ZlZCB0byB0aGUgZHJpdmVycykgKi8KKwlpbnQgKCpmZl9pbml0KShzdHJ1Y3QgaGlkX2RldmljZSAqKTsKIAogCS8qIGhpZGRldiBldmVudCBoYW5kbGVyICovCisJaW50ICgqaGlkZGV2X2Nvbm5lY3QpKHN0cnVjdCBoaWRfZGV2aWNlICosIHVuc2lnbmVkIGludCk7CiAJdm9pZCAoKmhpZGRldl9oaWRfZXZlbnQpIChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKIAkJCQkgIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOwogCXZvaWQgKCpoaWRkZXZfcmVwb3J0X2V2ZW50KSAoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGhpZF9yZXBvcnQgKik7CiAKIAkvKiBoYW5kbGVyIGZvciByYXcgb3V0cHV0IGRhdGEsIHVzZWQgYnkgaGlkcmF3ICovCiAJaW50ICgqaGlkX291dHB1dF9yYXdfcmVwb3J0KSAoc3RydWN0IGhpZF9kZXZpY2UgKiwgX191OCAqLCBzaXplX3QpOwotI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCi0JdW5zaWduZWQgbG9uZyBhcHBsZV9wcmVzc2VkX2ZuW0JJVFNfVE9fTE9OR1MoS0VZX0NOVCldOwotCXVuc2lnbmVkIGxvbmcgcGJfcHJlc3NlZF9udW1sb2NrW0JJVFNfVE9fTE9OR1MoS0VZX0NOVCldOwotI2VuZGlmCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgKmhpZF9nZXRfZHJ2ZGF0YShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZoZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkX3NldF9kcnZkYXRhKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCB2b2lkICpkYXRhKQoreworCWRldl9zZXRfZHJ2ZGF0YSgmaGRldi0+ZGV2LCBkYXRhKTsKK30KKwogI2RlZmluZSBISURfR0xPQkFMX1NUQUNLX1NJWkUgNAogI2RlZmluZSBISURfQ09MTEVDVElPTl9TVEFDS19TSVpFIDQKIApAQCAtNTEwLDYgKzUwNSwxMDcgQEAKIAlzdHJ1Y3QgaGlkX2NsYXNzX2Rlc2NyaXB0b3IgZGVzY1sxXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisjZGVmaW5lIEhJRF9ERVZJQ0UoYiwgdmVuLCBwcm9kKSBcCisJLmJ1cyA9IChiKSwgXAorCS52ZW5kb3IgPSAodmVuKSwgLnByb2R1Y3QgPSAocHJvZCkKKworI2RlZmluZSBISURfVVNCX0RFVklDRSh2ZW4sIHByb2QpCUhJRF9ERVZJQ0UoQlVTX1VTQiwgdmVuLCBwcm9kKQorI2RlZmluZSBISURfQkxVRVRPT1RIX0RFVklDRSh2ZW4sIHByb2QpCUhJRF9ERVZJQ0UoQlVTX0JMVUVUT09USCwgdmVuLCBwcm9kKQorCisjZGVmaW5lIEhJRF9SRVBPUlRfSUQocmVwKSBcCisJLnJlcG9ydF90eXBlID0gKHJlcCkKKyNkZWZpbmUgSElEX1VTQUdFX0lEKHVoaWQsIHV0eXBlLCB1Y29kZSkgXAorCS51c2FnZV9oaWQgPSAodWhpZCksIC51c2FnZV90eXBlID0gKHV0eXBlKSwgLnVzYWdlX2NvZGUgPSAodWNvZGUpCisvKiB3ZSBkb24ndCB3YW50IHRvIGNhdGNoIHR5cGVzIGFuZCBjb2RlcyBlcXVhbCB0byAwICovCisjZGVmaW5lIEhJRF9URVJNSU5BVE9SCQkoSElEX0FOWV9JRCAtIDEpCisKK3N0cnVjdCBoaWRfcmVwb3J0X2lkIHsKKwlfX3UzMiByZXBvcnRfdHlwZTsKK307CitzdHJ1Y3QgaGlkX3VzYWdlX2lkIHsKKwlfX3UzMiB1c2FnZV9oaWQ7CisJX191MzIgdXNhZ2VfdHlwZTsKKwlfX3UzMiB1c2FnZV9jb2RlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaGlkX2RyaXZlcgorICogQG5hbWU6IGRyaXZlciBuYW1lIChlLmcuICJGb290ZWNoX2Jhci13aGVlbCIpCisgKiBAaWRfdGFibGU6IHdoaWNoIGRldmljZXMgaXMgdGhpcyBkcml2ZXIgZm9yIChtdXN0IGJlIG5vbi1OVUxMIGZvciBwcm9iZQorICogCSAgICAgIHRvIGJlIGNhbGxlZCkKKyAqIEBwcm9iZTogbmV3IGRldmljZSBpbnNlcnRlZAorICogQHJlbW92ZTogZGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYgbm90IGEgaG90LXBsdWcgY2FwYWJsZSBkcml2ZXIpCisgKiBAcmVwb3J0X3RhYmxlOiBvbiB3aGljaCByZXBvcnRzIHRvIGNhbGwgcmF3X2V2ZW50IChOVUxMIG1lYW5zIGFsbCkKKyAqIEByYXdfZXZlbnQ6IGlmIHJlcG9ydCBpbiByZXBvcnRfdGFibGUsIHRoaXMgaG9vayBpcyBjYWxsZWQgKE5VTEwgbWVhbnMgbm9wKQorICogQHVzYWdlX3RhYmxlOiBvbiB3aGljaCBldmVudHMgdG8gY2FsbCBldmVudCAoTlVMTCBtZWFucyBhbGwpCisgKiBAZXZlbnQ6IGlmIHVzYWdlIGluIHVzYWdlX3RhYmxlLCB0aGlzIGhvb2sgaXMgY2FsbGVkIChOVUxMIG1lYW5zIG5vcCkKKyAqIEByZXBvcnRfZml4dXA6IGNhbGxlZCBiZWZvcmUgcmVwb3J0IGRlc2NyaXB0b3IgcGFyc2luZyAoTlVMTCBtZWFucyBub3ApCisgKiBAaW5wdXRfbWFwcGluZzogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBiZWZvcmUgbWFwcGluZyBhbiB1c2FnZQorICogQGlucHV0X21hcHBlZDogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBhZnRlciBtYXBwaW5nIGFuIHVzYWdlCisgKgorICogcmF3X2V2ZW50IGFuZCBldmVudCBzaG91bGQgcmV0dXJuIDAgb24gbm8gYWN0aW9uIHBlcmZvcm1lZCwgMSB3aGVuIG5vCisgKiBmdXJ0aGVyIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgYW5kIG5lZ2F0aXZlIG9uIGVycm9yCisgKgorICogaW5wdXRfbWFwcGluZyBzaGFsbCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSB0byBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHVzYWdlCisgKiAoZS5nLiBkb3VibGVkIG9yIGludmFsaWQgdXNhZ2UpLCB6ZXJvIHRvIGNvbnRpbnVlIHdpdGggcGFyc2luZyBvZiB0aGlzCisgKiB1c2FnZSBieSBnZW5lcmljIGNvZGUgKG5vIHNwZWNpYWwgaGFuZGxpbmcgbmVlZGVkKSBvciBwb3NpdGl2ZSB0byBza2lwCisgKiBnZW5lcmljIHBhcnNpbmcgKG5lZWRlZCBzcGVjaWFsIGhhbmRsaW5nIHdoaWNoIHdhcyBkb25lIGluIHRoZSBob29rIGFscmVhZHkpCisgKiBpbnB1dF9tYXBwZWQgc2hhbGwgcmV0dXJuIG5lZ2F0aXZlIHRvIGluZm9ybSB0aGUgbGF5ZXIgdGhhdCB0aGlzIHVzYWdlCisgKiBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvciB6ZXJvIHRvIG5vdGlmeSB0aGF0CisgKiBubyBwcm9jZXNzaW5nIHdhcyBwZXJmb3JtZWQgYW5kIHNob3VsZCBiZSBkb25lIGluIGEgZ2VuZXJpYyBtYW5uZXIKKyAqIEJvdGggdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBOVUxMIHdoaWNoIG1lYW5zIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHJldHVybmluZworICogemVybyBmcm9tIHRoZW0uCisgKi8KK3N0cnVjdCBoaWRfZHJpdmVyIHsKKwljaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZF90YWJsZTsKKworCWludCAoKnByb2JlKShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpOworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBoaWRfZGV2aWNlICpkZXYpOworCisJY29uc3Qgc3RydWN0IGhpZF9yZXBvcnRfaWQgKnJlcG9ydF90YWJsZTsKKwlpbnQgKCpyYXdfZXZlbnQpKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LAorCQkJdTggKmRhdGEsIGludCBzaXplKTsKKwljb25zdCBzdHJ1Y3QgaGlkX3VzYWdlX2lkICp1c2FnZV90YWJsZTsKKwlpbnQgKCpldmVudCkoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAorCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKTsKKworCXZvaWQgKCpyZXBvcnRfZml4dXApKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpidWYsCisJCQl1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKwlpbnQgKCppbnB1dF9tYXBwaW5nKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCk7CisJaW50ICgqaW5wdXRfbWFwcGVkKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCB1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCk7CisvKiBwcml2YXRlOiAqLworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKK307CisKKy8qKgorICogaGlkX2xsX2RyaXZlciAtIGxvdyBsZXZlbCBkcml2ZXIgY2FsbGJhY2tzCisgKiBAc3RhcnQ6IGNhbGxlZCBvbiBwcm9iZSB0byBzdGFydCB0aGUgZGV2aWNlCisgKiBAc3RvcDogY2FsbGVkIG9uIHJlbW92ZQorICogQG9wZW46IGNhbGxlZCBieSBpbnB1dCBsYXllciBvbiBvcGVuCisgKiBAY2xvc2U6IGNhbGxlZCBieSBpbnB1dCBsYXllciBvbiBjbG9zZQorICogQGhpZGlucHV0X2lucHV0X2V2ZW50OiBldmVudCBpbnB1dCBldmVudCAoZS5nLiBmZiBvciBsZWRzKQorICogQHBhcnNlOiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBvbmNlIHRvIHBhcnNlIHRoZSBkZXZpY2UgZGF0YSwKKyAqCSAgIHNob3VsZG4ndCBhbGxvY2F0ZSBhbnl0aGluZyB0byBub3QgbGVhayBtZW1vcnkKKyAqLworc3RydWN0IGhpZF9sbF9kcml2ZXIgeworCWludCAoKnN0YXJ0KShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKworCWludCAoKm9wZW4pKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKwl2b2lkICgqY2xvc2UpKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKworCWludCAoKmhpZGlucHV0X2lucHV0X2V2ZW50KSAoc3RydWN0IGlucHV0X2RldiAqaWRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKTsKKworCWludCAoKnBhcnNlKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7Cit9OworCiAvKiBBcHBsaWNhdGlvbnMgZnJvbSBISUQgVXNhZ2UgVGFibGVzIDQvOC85OSBWZXJzaW9uIDEuMSAqLwogLyogV2UgaWdub3JlIGEgZmV3IGlucHV0IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3Qgd2lkZWx5IHVzZWQgKi8KICNkZWZpbmUgSVNfSU5QVVRfQVBQTElDQVRJT04oYSkgKCgoYSA+PSAweDAwMDEwMDAwKSAmJiAoYSA8PSAweDAwMDEwMDA4KSkgfHwgKGEgPT0gMHgwMDAxMDA4MCkgfHwgKGEgPT0gMHgwMDBjMDAwMSkgfHwgKGEgPT0gMHgwMDBkMDAwMikpCkBAIC01MjAsNDMgKzYxNiwxNTcgQEAKIGV4dGVybiBpbnQgaGlkX2RlYnVnOwogI2VuZGlmCiAKK2V4dGVybiBpbnQgaGlkX2FkZF9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBoaWRfZGVzdHJveV9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKik7CisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIF9faGlkX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqLAorCQlzdHJ1Y3QgbW9kdWxlICosIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICpkcml2ZXIpCit7CisJcmV0dXJuIF9faGlkX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7Cit9CitleHRlcm4gdm9pZCBoaWRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKik7CisKIGV4dGVybiB2b2lkIGhpZGlucHV0X2hpZF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICosIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOwogZXh0ZXJuIHZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpOwotZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOworZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCBmb3JjZSk7CiBleHRlcm4gdm9pZCBoaWRpbnB1dF9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOwogCiBpbnQgaGlkX3NldF9maWVsZChzdHJ1Y3QgaGlkX2ZpZWxkICosIHVuc2lnbmVkLCBfX3MzMik7CiBpbnQgaGlkX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqLCBpbnQgdHlwZSwgdTggKiwgaW50LCBpbnQpOwogaW50IGhpZGlucHV0X2ZpbmRfZmllbGQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBzdHJ1Y3QgaGlkX2ZpZWxkICoqZmllbGQpOwotaW50IGhpZGlucHV0X21hcHBpbmdfcXVpcmtzKHN0cnVjdCBoaWRfdXNhZ2UgKiwgc3RydWN0IGlucHV0X2RldiAqLCB1bnNpZ25lZCBsb25nICoqLCBpbnQgKik7Ci1pbnQgaGlkaW5wdXRfZXZlbnRfcXVpcmtzKHN0cnVjdCBoaWRfZGV2aWNlICosIHN0cnVjdCBoaWRfZmllbGQgKiwgc3RydWN0IGhpZF91c2FnZSAqLCBfX3MzMik7Ci1pbnQgaGlkaW5wdXRfYXBwbGVfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGlucHV0X2RldiAqLCBzdHJ1Y3QgaGlkX3VzYWdlICosIF9fczMyKTsKIHZvaWQgaGlkX291dHB1dF9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgX191OCAqZGF0YSk7Ci12b2lkIGhpZF9mcmVlX2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlKTsKLXN0cnVjdCBoaWRfZGV2aWNlICpoaWRfcGFyc2VfcmVwb3J0KF9fdTggKnN0YXJ0LCB1bnNpZ25lZCBzaXplKTsKK3N0cnVjdCBoaWRfZGV2aWNlICpoaWRfYWxsb2NhdGVfZGV2aWNlKHZvaWQpOworaW50IGhpZF9wYXJzZV9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCAqc3RhcnQsIHVuc2lnbmVkIHNpemUpOworaW50IGhpZF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCBjb25uZWN0X21hc2spOworCisvKioKKyAqIGhpZF9tYXBfdXNhZ2UgLSBtYXAgdXNhZ2UgaW5wdXQgYml0cworICoKKyAqIEBoaWRpbnB1dDogaGlkaW5wdXQgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqIEB1c2FnZTogdXNhZ2UgdG8gZmlsbCBpbgorICogQGJpdDogcG9pbnRlciB0byBpbnB1dC0+e31iaXQgKG91dCBwYXJhbWV0ZXIpCisgKiBAbWF4OiBtYXhpbWFsIHZhbGlkIHVzYWdlLT5jb2RlIHRvIGNvbnNpZGVyIGxhdGVyIChvdXQgcGFyYW1ldGVyKQorICogQHR5cGU6IGlucHV0IGV2ZW50IHR5cGUgKEVWX0tFWSwgRVZfUkVMLCAuLi4pCisgKiBAYzogY29kZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGlzIHVzYWdlIGFuZCB0eXBlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRfbWFwX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgsCisJCV9fdTggdHlwZSwgX191MTYgYykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGhpZGlucHV0LT5pbnB1dDsKKworCXVzYWdlLT50eXBlID0gdHlwZTsKKwl1c2FnZS0+Y29kZSA9IGM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVWX0FCUzoKKwkJKmJpdCA9IGlucHV0LT5hYnNiaXQ7CisJCSptYXggPSBBQlNfTUFYOworCQlicmVhazsKKwljYXNlIEVWX1JFTDoKKwkJKmJpdCA9IGlucHV0LT5yZWxiaXQ7CisJCSptYXggPSBSRUxfTUFYOworCQlicmVhazsKKwljYXNlIEVWX0tFWToKKwkJKmJpdCA9IGlucHV0LT5rZXliaXQ7CisJCSptYXggPSBLRVlfTUFYOworCQlicmVhazsKKwljYXNlIEVWX0xFRDoKKwkJKmJpdCA9IGlucHV0LT5sZWRiaXQ7CisJCSptYXggPSBMRURfTUFYOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaGlkX21hcF91c2FnZV9jbGVhciAtIG1hcCB1c2FnZSBpbnB1dCBiaXRzIGFuZCBjbGVhciB0aGUgaW5wdXQgYml0CisgKgorICogVGhlIHNhbWUgYXMgaGlkX21hcF91c2FnZSwgZXhjZXB0IHRoZSBAYyBiaXQgaXMgYWxzbyBjbGVhcmVkIGluIHN1cHBvcnRlZAorICogYml0cyAoQGJpdCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRfbWFwX3VzYWdlX2NsZWFyKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LAorCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgsCisJCV9fdTggdHlwZSwgX191MTYgYykKK3sKKwloaWRfbWFwX3VzYWdlKGhpZGlucHV0LCB1c2FnZSwgYml0LCBtYXgsIHR5cGUsIGMpOworCWNsZWFyX2JpdChjLCAqYml0KTsKK30KKworLyoqCisgKiBoaWRfcGFyc2UgLSBwYXJzZSBIVyByZXBvcnRzCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBDYWxsIHRoaXMgZnJvbSBwcm9iZSBhZnRlciB5b3Ugc2V0IHVwIHRoZSBkZXZpY2UgKGlmIG5lZWRlZCkuIFlvdXIKKyAqIHJlcG9ydF9maXh1cCB3aWxsIGJlIGNhbGxlZCAoaWYgbm9uLU5VTEwpIGFmdGVyIHJlYWRpbmcgcmF3IHJlcG9ydCBmcm9tCisgKiBkZXZpY2UgYmVmb3JlIHBhc3NpbmcgaXQgdG8gaGlkIGxheWVyIGZvciByZWFsIHBhcnNpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfcGFyc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJaW50IHJldDsKKworCWlmIChoZGV2LT5zdGF0dXMgJiBISURfU1RBVF9QQVJTRUQpCisJCXJldHVybiAwOworCisJcmV0ID0gaGRldi0+bGxfZHJpdmVyLT5wYXJzZShoZGV2KTsKKwlpZiAoIXJldCkKKwkJaGRldi0+c3RhdHVzIHw9IEhJRF9TVEFUX1BBUlNFRDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGlkX2h3X3N0YXJ0IC0gc3RhcnQgdW5kZXJsYXlpbmcgSFcKKyAqCisgKiBAaGRldjogaGlkIGRldmljZQorICogQGNvbm5lY3RfbWFzazogd2hpY2ggb3V0cHV0cyB0byBjb25uZWN0LCBzZWUgSElEX0NPTk5FQ1RfKgorICoKKyAqIENhbGwgdGhpcyBpbiBwcm9iZSBmdW5jdGlvbiAqYWZ0ZXIqIGhpZF9wYXJzZS4gVGhpcyB3aWxsIHNldHVwIEhXIGJ1ZmZlcnMKKyAqIGFuZCBzdGFydCB0aGUgZGV2aWNlIChpZiBub3QgZGVmZmVyZWQgdG8gZGV2aWNlIG9wZW4pLiBoaWRfaHdfc3RvcCBtdXN0IGJlCisgKiBjYWxsZWQgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBoaWRfaHdfc3RhcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCXVuc2lnbmVkIGludCBjb25uZWN0X21hc2spCit7CisJaW50IHJldCA9IGhkZXYtPmxsX2RyaXZlci0+c3RhcnQoaGRldik7CisJaWYgKHJldCB8fCAhY29ubmVjdF9tYXNrKQorCQlyZXR1cm4gcmV0OworCXJldCA9IGhpZF9jb25uZWN0KGhkZXYsIGNvbm5lY3RfbWFzayk7CisJaWYgKHJldCkKKwkJaGRldi0+bGxfZHJpdmVyLT5zdG9wKGhkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaGlkX2h3X3N0b3AgLSBzdG9wIHVuZGVybGF5aW5nIEhXCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkIGZyb20gcmVtb3ZlIGZ1bmN0aW9uIG9yIGZyb20gcHJvYmUgd2hlbiBzb21ldGhpbmcKKyAqIGZhaWxlZCBhbmQgaGlkX2h3X3N0YXJ0IHdhcyBjYWxsZWQgYWxyZWFkeS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZF9od19zdG9wKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWhkZXYtPmxsX2RyaXZlci0+c3RvcChoZGV2KTsKK30KKwordm9pZCBoaWRfcmVwb3J0X3Jhd19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBpbnQgdHlwZSwgdTggKmRhdGEsIGludCBzaXplLAorCQlpbnQgaW50ZXJydXB0KTsKKworZXh0ZXJuIGludCBoaWRfZ2VuZXJpY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaGlkX2dlbmVyaWNfZXhpdCh2b2lkKTsKIAogLyogSElEIHF1aXJrcyBBUEkgKi8KIHUzMiB1c2JoaWRfbG9va3VwX3F1aXJrKGNvbnN0IHUxNiBpZFZlbmRvciwgY29uc3QgdTE2IGlkUHJvZHVjdCk7CiBpbnQgdXNiaGlkX3F1aXJrc19pbml0KGNoYXIgKipxdWlya3NfcGFyYW0pOwogdm9pZCB1c2JoaWRfcXVpcmtzX2V4aXQodm9pZCk7Ci12b2lkIHVzYmhpZF9maXh1cF9yZXBvcnRfZGVzY3JpcHRvcihjb25zdCB1MTYsIGNvbnN0IHUxNiwgY2hhciAqLCB1bnNpZ25lZCwgY2hhciAqKik7Cit2b2lkIHVzYmhpZF9zZXRfbGVkcyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIAotI2lmZGVmIENPTkZJR19ISURfRkYKLWludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLQotaW50IGhpZF9sZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX2xnMmZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX3BsZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLWludCBoaWRfdG1mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwotaW50IGhpZF96cGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CiAjaWZkZWYgQ09ORklHX0hJRF9QSUQKIGludCBoaWRfcGlkZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBoaWRfcGlkZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtRU5PREVWOyB9Ci0jZW5kaWYKLQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGhpZF9mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CisjZGVmaW5lIGhpZF9waWRmZl9pbml0IE5VTEwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hJRF9ERUJVRwpAQCAtNTcyLDEwICs3ODIsMjMgQEAKIAlyZXR1cm4gMDsKIH0KICNkZWZpbmUgZGJnX2hpZF9saW5lIGRiZ19oaWQKLSNlbmRpZgorI2VuZGlmIC8qIEhJRF9ERUJVRyAqLwogCiAjZGVmaW5lIGVycl9oaWQoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCiAJCV9fRklMRV9fICwgIyMgYXJnKQotI2VuZGlmCisjZW5kaWYgLyogSElEX0ZGICovCisKKyNpZmRlZiBDT05GSUdfSElEX0NPTVBBVAorI2RlZmluZSBISURfQ09NUEFUX0xPQURfRFJJVkVSKG5hbWUpCVwKK3ZvaWQgaGlkX2NvbXBhdF8jI25hbWUodm9pZCkgeyB9CVwKK0VYUE9SVF9TWU1CT0woaGlkX2NvbXBhdF8jI25hbWUpCisjZWxzZQorI2RlZmluZSBISURfQ09NUEFUX0xPQURfRFJJVkVSKG5hbWUpCisjZW5kaWYgLyogSElEX0NPTVBBVCAqLworI2RlZmluZSBISURfQ09NUEFUX0NBTExfRFJJVkVSKG5hbWUpCWRvIHsJXAorCWV4dGVybiB2b2lkIGhpZF9jb21wYXRfIyNuYW1lKHZvaWQpOwlcCisJaGlkX2NvbXBhdF8jI25hbWUoKTsJCQlcCit9IHdoaWxlICgwKQorCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWRkZXYuaCBiL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKaW5kZXggYTQxNmI5MC4uYzc2MGFlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWRkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZGRldi5oCkBAIC0xODIsMjYgKzE4MiwyOCBAQAogLyogVG8gdHJhdmVyc2UgdGhlIGlucHV0IHJlcG9ydCBkZXNjcmlwdG9yIGluZm8gZm9yIGEgSElEIGRldmljZSwgcGVyZm9ybSB0aGUgCiAgKiBmb2xsb3dpbmc6CiAgKgotICogIHJpbmZvLnJlcG9ydF90eXBlID0gSElEX1JFUE9SVF9UWVBFX0lOUFVUOwotICogIHJpbmZvLnJlcG9ydF9pZCA9IEhJRF9SRVBPUlRfSURfRklSU1Q7Ci0gKiAgcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICogcmluZm8ucmVwb3J0X3R5cGUgPSBISURfUkVQT1JUX1RZUEVfSU5QVVQ7CisgKiByaW5mby5yZXBvcnRfaWQgPSBISURfUkVQT1JUX0lEX0ZJUlNUOworICogcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOwogICoKLSAqICB3aGlsZSAocmV0ID49IDApIHsKLSAqICAgICAgZm9yIChpID0gMDsgaSA8IHJpbmZvLm51bV9maWVsZHM7IGkrKykgeyAKLSAqCSAgICBmaW5mby5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOwotICogICAgICAgICAgZmluZm8ucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOwotICogICAgICAgICAgZmluZm8uZmllbGRfaW5kZXggPSBpOwotICogICAgICAgICAgaW9jdGwoZmQsIEhJRElPQ0dGSUVMRElORk8sICZmaW5mbyk7Ci0gKiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmluZm8ubWF4dXNhZ2U7IGorKykgewotICogICAgICAgICAgICAgIHVyZWYuZmllbGRfaW5kZXggPSBpOwotICoJCXVyZWYudXNhZ2VfaW5kZXggPSBqOwotICoJCWlvY3RsKGZkLCBISURJT0NHVUNPREUsICZ1cmVmKTsKLSAqCQlpb2N0bChmZCwgSElESU9DR1VTQUdFLCAmdXJlZik7Ci0gKiAgICAgICAgICB9Ci0gKgl9Ci0gKglyaW5mby5yZXBvcnRfaWQgfD0gSElEX1JFUE9SVF9JRF9ORVhUOwotICoJcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOwotICogIH0KKyAqIHdoaWxlIChyZXQgPj0gMCkgeworICogCWZvciAoaSA9IDA7IGkgPCByaW5mby5udW1fZmllbGRzOyBpKyspIHsKKyAqIAkJZmluZm8ucmVwb3J0X3R5cGUgPSByaW5mby5yZXBvcnRfdHlwZTsKKyAqIAkJZmluZm8ucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOworICogCQlmaW5mby5maWVsZF9pbmRleCA9IGk7CisgKiAJCWlvY3RsKGZkLCBISURJT0NHRklFTERJTkZPLCAmZmluZm8pOworICogCQlmb3IgKGogPSAwOyBqIDwgZmluZm8ubWF4dXNhZ2U7IGorKykgeworICogCQkJdXJlZi5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOworICogCQkJdXJlZi5yZXBvcnRfaWQgPSByaW5mby5yZXBvcnRfaWQ7CisgKiAJCQl1cmVmLmZpZWxkX2luZGV4ID0gaTsKKyAqIAkJCXVyZWYudXNhZ2VfaW5kZXggPSBqOworICogCQkJaW9jdGwoZmQsIEhJRElPQ0dVQ09ERSwgJnVyZWYpOworICogCQkJaW9jdGwoZmQsIEhJRElPQ0dVU0FHRSwgJnVyZWYpOworICogCQl9CisgKiAJfQorICogCXJpbmZvLnJlcG9ydF9pZCB8PSBISURfUkVQT1JUX0lEX05FWFQ7CisgKiAJcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICogfQogICovCiAKIApAQCAtMjE3LDcgKzIxOSw3IEBACiBzdHJ1Y3QgaGlkX3JlcG9ydDsKIAogI2lmZGVmIENPTkZJR19VU0JfSElEREVWCi1pbnQgaGlkZGV2X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKik7CitpbnQgaGlkZGV2X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IGZvcmNlKTsKIHZvaWQgaGlkZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKik7CiB2b2lkIGhpZGRldl9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCiAJCSAgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSk7CkBAIC0yMjUsNyArMjI3LDkgQEAKIGludCBfX2luaXQgaGlkZGV2X2luaXQodm9pZCk7CiB2b2lkIGhpZGRldl9leGl0KHZvaWQpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGhpZGRldl9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGludCBoaWRkZXZfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLAorCQl1bnNpZ25lZCBpbnQgZm9yY2UpCit7IHJldHVybiAtMTsgfQogc3RhdGljIGlubGluZSB2b2lkIGhpZGRldl9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGhpZGRldl9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCiAJCSAgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkgeyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hwZXQuaCBiL2luY2x1ZGUvbGludXgvaHBldC5oCmluZGV4IDJkYzI5Y2UuLjc5ZjYzYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHBldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaHBldC5oCkBAIC0zNyw2ICszNyw3IEBACiAjZGVmaW5lCWhwZXRfY29tcGFyZQlfdTEuX2hwZXRfY29tcGFyZQogCiAjZGVmaW5lCUhQRVRfTUFYX1RJTUVSUwkoMzIpCisjZGVmaW5lCUhQRVRfTUFYX0lSUQkoMzIpCiAKIC8qCiAgKiBIUEVUIGdlbmVyYWwgY2FwYWJpbGl0aWVzIHJlZ2lzdGVyCkBAIC02NCw3ICs2NSw3IEBACiAgKi8KIAogI2RlZmluZQlUbl9JTlRfUk9VVEVfQ0FQX01BU0sJCSgweGZmZmZmZmZmMDAwMDAwMDBVTEwpCi0jZGVmaW5lCVRuX0lOSV9ST1VURV9DQVBfU0hJRlQJCSgzMlVMKQorI2RlZmluZQlUbl9JTlRfUk9VVEVfQ0FQX1NISUZUCQkoMzJVTCkKICNkZWZpbmUJVG5fRlNCX0lOVF9ERUxDQVBfTUFTSwkJKDB4ODAwMFVMKQogI2RlZmluZQlUbl9GU0JfSU5UX0RFTENBUF9TSElGVAkJKDE1KQogI2RlZmluZQlUbl9GU0JfRU5fQ05GX01BU0sJCSgweDQwMDBVTCkKQEAgLTkxLDIzICs5MiwxNCBAQAogICogZXhwb3J0ZWQgaW50ZXJmYWNlcwogICovCiAKLXN0cnVjdCBocGV0X3Rhc2sgewotCXZvaWQgKCpodF9mdW5jKSAodm9pZCAqKTsKLQl2b2lkICpodF9kYXRhOwotCXZvaWQgKmh0X29wYXF1ZTsKLX07Ci0KIHN0cnVjdCBocGV0X2RhdGEgewogCXVuc2lnbmVkIGxvbmcgaGRfcGh5c19hZGRyZXNzOwogCXZvaWQgX19pb21lbSAqaGRfYWRkcmVzczsKIAl1bnNpZ25lZCBzaG9ydCBoZF9uaXJxczsKLQl1bnNpZ25lZCBzaG9ydCBoZF9mbGFnczsKIAl1bnNpZ25lZCBpbnQgaGRfc3RhdGU7CS8qIHRpbWVyIGFsbG9jYXRlZCAqLwogCXVuc2lnbmVkIGludCBoZF9pcnFbSFBFVF9NQVhfVElNRVJTXTsKIH07CiAKLSNkZWZpbmUJSFBFVF9EQVRBX1BMQVRGT1JNCTB4MDAwMQkvKiBwbGF0Zm9ybSBjYWxsIHRvIGhwZXRfYWxsb2MgKi8KLQogc3RhdGljIGlubGluZSB2b2lkIGhwZXRfcmVzZXJ2ZV90aW1lcihzdHJ1Y3QgaHBldF9kYXRhICpoZCwgaW50IHRpbWVyKQogewogCWhkLT5oZF9zdGF0ZSB8PSAoMSA8PCB0aW1lcik7CkBAIC0xMjUsNyArMTE3LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBoaV90aW1lcjsKIH07CiAKLSNkZWZpbmUJSFBFVF9JTkZPX1BFUklPRElDCTB4MDAwMQkvKiB0aW1lciBpcyBwZXJpb2RpYyAqLworI2RlZmluZSBIUEVUX0lORk9fUEVSSU9ESUMJMHgwMDEwCS8qIHBlcmlvZGljLWNhcGFibGUgY29tcGFyYXRvciAqLwogCiAjZGVmaW5lCUhQRVRfSUVfT04JX0lPKCdoJywgMHgwMSkJLyogaW50ZXJydXB0IG9uICovCiAjZGVmaW5lCUhQRVRfSUVfT0ZGCV9JTygnaCcsIDB4MDIpCS8qIGludGVycnVwdCBvZmYgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggMWU2ZjczMS4uY2IyNWMxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTQ5LDE0ICs0OSwyMiBAQAogICoJSFJUSU1FUl9DQl9JUlFTQUZFOgkJQ2FsbGJhY2sgbWF5IHJ1biBpbiBoYXJkaXJxIGNvbnRleHQKICAqCUhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJUOglDYWxsYmFjayBtYXkgcnVuIGluIGhhcmRpcnEgY29udGV4dCBhbmQKICAqCQkJCQlkb2VzIG5vdCByZXN0YXJ0IHRoZSB0aW1lcgotICoJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE6CUNhbGxiYWNrIG11c3QgcnVuIGluIGhhcmRpcnEgY29udGV4dAotICoJCQkJCVNwZWNpYWwgbW9kZSBmb3IgdGljayBlbXVsdGF0aW9uCisgKglIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVOglDYWxsYmFjayBtdXN0IHJ1biBpbiBoYXJkaXJxIGNvbnRleHQKKyAqCQkJCQlTcGVjaWFsIG1vZGUgZm9yIHRpY2sgZW11bGF0aW9uIGFuZAorICoJCQkJCXNjaGVkdWxlciB0aW1lci4gU3VjaCB0aW1lcnMgYXJlIHBlcgorICoJCQkJCWNwdSBhbmQgbm90IGFsbG93ZWQgdG8gYmUgbWlncmF0ZWQgb24KKyAqCQkJCQljcHUgdW5wbHVnLgorICoJSFJUSU1FUl9DQl9JUlFTQUZFX1VOTE9DS0VEOglDYWxsYmFjayBzaG91bGQgcnVuIGluIGhhcmRpcnEgY29udGV4dAorICoJCQkJCXdpdGggdGltZXItPmJhc2UgbG9jayB1bmxvY2tlZAorICoJCQkJCXVzZWQgZm9yIHRpbWVycyB3aGljaCBjYWxsIHdha2V1cCB0bworICoJCQkJCWF2b2lkIGxvY2sgb3JkZXIgcHJvYmxlbXMgd2l0aCBycS0+bG9jawogICovCiBlbnVtIGhydGltZXJfY2JfbW9kZSB7CiAJSFJUSU1FUl9DQl9TT0ZUSVJRLAogCUhSVElNRVJfQ0JfSVJRU0FGRSwKIAlIUlRJTUVSX0NCX0lSUVNBRkVfTk9fUkVTVEFSVCwKLQlIUlRJTUVSX0NCX0lSUVNBRkVfTk9fU09GVElSUSwKKwlIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVLAorCUhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRCwKIH07CiAKIC8qCkBAIC02OSw5ICs3NywxMCBAQAogICogMHgwMgkJY2FsbGJhY2sgZnVuY3Rpb24gcnVubmluZwogICogMHgwNAkJY2FsbGJhY2sgcGVuZGluZyAoaGlnaCByZXNvbHV0aW9uIG1vZGUpCiAgKgotICogU3BlY2lhbCBjYXNlOgorICogU3BlY2lhbCBjYXNlczoKICAqIDB4MDMJCWNhbGxiYWNrIGZ1bmN0aW9uIHJ1bm5pbmcgYW5kIGVucXVldWVkCiAgKgkJKHdhcyByZXF1ZXVlZCBvbiBhbm90aGVyIENQVSkKKyAqIDB4MDkJCXRpbWVyIHdhcyBtaWdyYXRlZCBvbiBDUFUgaG90dW5wbHVnCiAgKiBUaGUgImNhbGxiYWNrIGZ1bmN0aW9uIHJ1bm5pbmcgYW5kIGVucXVldWVkIiBzdGF0dXMgaXMgb25seSBwb3NzaWJsZSBvbgogICogU01QLiBJdCBoYXBwZW5zIGZvciBleGFtcGxlIHdoZW4gYSBwb3NpeCB0aW1lciBleHBpcmVkIGFuZCB0aGUgY2FsbGJhY2sKICAqIHF1ZXVlZCBhIHNpZ25hbC4gQmV0d2VlbiBkcm9wcGluZyB0aGUgbG9jayB3aGljaCBwcm90ZWN0cyB0aGUgcG9zaXggdGltZXIKQEAgLTg5LDYgKzk4LDcgQEAKICNkZWZpbmUgSFJUSU1FUl9TVEFURV9FTlFVRVVFRAkweDAxCiAjZGVmaW5lIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sJMHgwMgogI2RlZmluZSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcJMHgwNAorI2RlZmluZSBIUlRJTUVSX1NUQVRFX01JR1JBVEUJMHgwOAogCiAvKioKICAqIHN0cnVjdCBocnRpbWVyIC0gdGhlIGJhc2ljIGhydGltZXIgc3RydWN0dXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaAppbmRleCBiZjM0YzVmLi40OTM0MzViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKQEAgLTQxLDcgKzQxLDYgQEAKICNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTcxMTAJMjIJLyogdmlkZW8gZGVjb2RlcgkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTUyNDkJMjQJLyogU0FBNTI0OSBhbmQgY29tcGF0aWJsZXMJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1BDRjg1ODMJMjUJLyogcmVhbCB0aW1lIGNsb2NrCQkqLwotI2RlZmluZSBJMkNfRFJJVkVSSURfU0FCMzAzNgkyNgkvKiBTQUIzMDM2IHR1bmVyCQkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVERBNzQzMgkyNwkvKiBTdGVyZW8gc291bmQgcHJvY2Vzc29yCSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9UVk1JWEVSICAgIDI4ICAgICAgLyogTWl4ZXIgZHJpdmVyIGZvciB0diBjYXJkcyAgICAqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVFZBVURJTyAgICAyOSAgICAgIC8qIEdlbmVyaWMgVFYgc291bmQgZHJpdmVyICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJvLmggYi9pbmNsdWRlL2xpbnV4L2kyby5oCmluZGV4IDc1YWU2ZDguLjRjNGU1N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMm8uaApAQCAtNTcwLDcgKzU3MCw2IEBACiAjZW5kaWYKIAlzcGlubG9ja190IGxvY2s7CS8qIGxvY2sgZm9yIGNvbnRyb2xsZXIKIAkJCQkgICBjb25maWd1cmF0aW9uICovCi0KIAl2b2lkICpkcml2ZXJfZGF0YVtJMk9fTUFYX0RSSVZFUlNdOwkvKiBzdG9yYWdlIGZvciBkcml2ZXJzICovCiB9OwogCkBAIC02OTEsMjg5ICs2OTAsMjIgQEAKIH07CiAjZW5kaWYKIAotLyoqCi0gKglpMm9fc2dfdGFibGVzaXplIC0gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIFNHTAotICoJQGM6IEkyTyBjb250cm9sbGVyIGZvciB3aGljaCB0aGUgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGRvbmUKLSAqCUBib2R5X3NpemU6IG1heGltdW0gYm9keSBzaXplIHVzZWQgZm9yIG1lc3NhZ2UgaW4gMzItYml0IHdvcmRzLgotICoKLSAqCVJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgU0cgZWxlbWVudHMgaW4gYSBTRyBsaXN0LgotICovCi1zdGF0aWMgaW5saW5lIHUxNiBpMm9fc2dfdGFibGVzaXplKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTE2IGJvZHlfc2l6ZSkKLXsKLQlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwotCXUxNiBzZ19jb3VudCA9Ci0JICAgIChzYi0+aW5ib3VuZF9mcmFtZV9zaXplIC0gc2l6ZW9mKHN0cnVjdCBpMm9fbWVzc2FnZSkgLyA0KSAtCi0JICAgIGJvZHlfc2l6ZTsKLQotCWlmIChjLT5wYWVfc3VwcG9ydCkgewotCQkvKgotCQkgKiBmb3IgNjQtYml0IGEgU0cgYXR0cmlidXRlIGVsZW1lbnQgbXVzdCBiZSBhZGRlZCBhbmQgZWFjaAotCQkgKiBTRyBlbGVtZW50IG5lZWRzIDEyIGJ5dGVzIGluc3RlYWQgb2YgOC4KLQkJICovCi0JCXNnX2NvdW50IC09IDI7Ci0JCXNnX2NvdW50IC89IDM7Ci0JfSBlbHNlCi0JCXNnX2NvdW50IC89IDI7Ci0KLQlpZiAoYy0+c2hvcnRfcmVxICYmIChzZ19jb3VudCA+IDgpKQotCQlzZ19jb3VudCA9IDg7Ci0KLQlyZXR1cm4gc2dfY291bnQ7Ci19OwotCi0vKioKLSAqCWkyb19kbWFfbWFwX3NpbmdsZSAtIE1hcCBwb2ludGVyIHRvIGNvbnRyb2xsZXIgYW5kIGZpbGwgaW4gSTJPIG1lc3NhZ2UuCi0gKglAYzogSTJPIGNvbnRyb2xsZXIKLSAqCUBwdHI6IHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggc2hvdWxkIGJlIG1hcHBlZAotICoJQHNpemU6IHNpemUgb2YgZGF0YSBpbiBieXRlcwotICoJQGRpcmVjdGlvbjogRE1BX1RPX0RFVklDRSAvIERNQV9GUk9NX0RFVklDRQotICoJQHNnX3B0cjogcG9pbnRlciB0byB0aGUgU0cgbGlzdCBpbnNpZGUgdGhlIEkyTyBtZXNzYWdlCi0gKgotICoJVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBuZWNlc3NhcnkgRE1BIGhhbmRsaW5nIGFuZCBhbHNvIHdyaXRlcyB0aGUgSTJPCi0gKglTR0wgZWxlbWVudHMgaW50byB0aGUgSTJPIG1lc3NhZ2UuIEZvciBkZXRhaWxzIG9uIERNQSBoYW5kbGluZyBzZWUgYWxzbwotICoJZG1hX21hcF9zaW5nbGUoKS4gVGhlIHBvaW50ZXIgc2dfcHRyIHdpbGwgb25seSBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUKLSAqCVNHIGxpc3QgaWYgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gKgotICoJUmV0dXJucyBETUEgYWRkcmVzcyB3aGljaCBtdXN0IGJlIGNoZWNrZWQgZm9yIGZhaWx1cmVzIHVzaW5nCi0gKglkbWFfbWFwcGluZ19lcnJvcigpLgotICovCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgaTJvX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdm9pZCAqcHRyLAorZXh0ZXJuIHUxNiBpMm9fc2dfdGFibGVzaXplKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTE2IGJvZHlfc2l6ZSk7CitleHRlcm4gZG1hX2FkZHJfdCBpMm9fZG1hX21hcF9zaW5nbGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB2b2lkICpwdHIsCiAJCQkJCSAgICBzaXplX3Qgc2l6ZSwKIAkJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKLQkJCQkJICAgIHUzMiAqKiBzZ19wdHIpCi17Ci0JdTMyIHNnX2ZsYWdzOwotCXUzMiAqbXB0ciA9ICpzZ19wdHI7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQotCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JY2FzZSBETUFfVE9fREVWSUNFOgotCQlzZ19mbGFncyA9IDB4ZDQwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX0ZST01fREVWSUNFOgotCQlzZ19mbGFncyA9IDB4ZDAwMDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmMtPnBkZXYtPmRldiwgcHRyLCBzaXplLCBkaXJlY3Rpb24pOwotCWlmICghZG1hX21hcHBpbmdfZXJyb3IoJmMtPnBkZXYtPmRldiwgZG1hX2FkZHIpKSB7Ci0jaWZkZWYgQ09ORklHX0kyT19FWFRfQURBUFRFQ19ETUE2NAotCQlpZiAoKHNpemVvZihkbWFfYWRkcl90KSA+IDQpICYmIGMtPnBhZV9zdXBwb3J0KSB7Ci0JCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoMHg3QzAyMDAwMik7Ci0JCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoUEFHRV9TSVpFKTsKLQkJfQotI2VuZGlmCi0KLQkJKm1wdHIrKyA9IGNwdV90b19sZTMyKHNnX2ZsYWdzIHwgc2l6ZSk7Ci0JCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2xvdyhkbWFfYWRkcikpOwotI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUNfRE1BNjQKLQkJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkKLQkJCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2hpZ2goZG1hX2FkZHIpKTsKLSNlbmRpZgotCQkqc2dfcHRyID0gbXB0cjsKLQl9Ci0JcmV0dXJuIGRtYV9hZGRyOwotfTsKLQotLyoqCi0gKglpMm9fZG1hX21hcF9zZyAtIE1hcCBhIFNHIExpc3QgdG8gY29udHJvbGxlciBhbmQgZmlsbCBpbiBJMk8gbWVzc2FnZS4KLSAqCUBjOiBJMk8gY29udHJvbGxlcgotICoJQHNnOiBTRyBsaXN0IHRvIGJlIG1hcHBlZAotICoJQHNnX2NvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFNHIGxpc3QKLSAqCUBkaXJlY3Rpb246IERNQV9UT19ERVZJQ0UgLyBETUFfRlJPTV9ERVZJQ0UKLSAqCUBzZ19wdHI6IHBvaW50ZXIgdG8gdGhlIFNHIGxpc3QgaW5zaWRlIHRoZSBJMk8gbWVzc2FnZQotICoKLSAqCVRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IERNQSBoYW5kbGluZyBhbmQgYWxzbyB3cml0ZXMgdGhlIEkyTwotICoJU0dMIGVsZW1lbnRzIGludG8gdGhlIEkyTyBtZXNzYWdlLiBGb3IgZGV0YWlscyBvbiBETUEgaGFuZGxpbmcgc2VlIGFsc28KLSAqCWRtYV9tYXBfc2coKS4gVGhlIHBvaW50ZXIgc2dfcHRyIHdpbGwgb25seSBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgU0cKLSAqCWxpc3QgaWYgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gKgotICoJUmV0dXJucyAwIG9uIGZhaWx1cmUgb3IgMSBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX21hcF9zZyhzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCisJCQkJCSAgICB1MzIgKiogc2dfcHRyKTsKK2V4dGVybiBpbnQgaTJvX2RtYV9tYXBfc2coc3RydWN0IGkyb19jb250cm9sbGVyICpjLAogCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc2dfY291bnQsCiAJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKLQkJCQkgdTMyICoqIHNnX3B0cikKLXsKLQl1MzIgc2dfZmxhZ3M7Ci0JdTMyICptcHRyID0gKnNnX3B0cjsKLQotCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JY2FzZSBETUFfVE9fREVWSUNFOgotCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX0ZST01fREVWSUNFOgotCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCXNnX2NvdW50ID0gZG1hX21hcF9zZygmYy0+cGRldi0+ZGV2LCBzZywgc2dfY291bnQsIGRpcmVjdGlvbik7Ci0JaWYgKCFzZ19jb3VudCkKLQkJcmV0dXJuIDA7Ci0KLSNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0Ci0JaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkgewotCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoMHg3QzAyMDAwMik7Ci0JCSptcHRyKysgPSBjcHVfdG9fbGUzMihQQUdFX1NJWkUpOwotCX0KLSNlbmRpZgotCi0Jd2hpbGUgKHNnX2NvdW50LS0gPiAwKSB7Ci0JCWlmICghc2dfY291bnQpCi0JCQlzZ19mbGFncyB8PSAweEMwMDAwMDAwOwotCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoc2dfZmxhZ3MgfCBzZ19kbWFfbGVuKHNnKSk7Ci0JCSptcHRyKysgPSBjcHVfdG9fbGUzMihpMm9fZG1hX2xvdyhzZ19kbWFfYWRkcmVzcyhzZykpKTsKLSNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0Ci0JCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgYy0+cGFlX3N1cHBvcnQpCi0JCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoaTJvX2RtYV9oaWdoKHNnX2RtYV9hZGRyZXNzKHNnKSkpOwotI2VuZGlmCi0JCXNnID0gc2dfbmV4dChzZyk7Ci0JfQotCSpzZ19wdHIgPSBtcHRyOwotCi0JcmV0dXJuIDE7Ci19OwotCi0vKioKLSAqCWkyb19kbWFfYWxsb2MgLSBBbGxvY2F0ZSBETUEgbWVtb3J5Ci0gKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCi0gKglAYWRkcjogaTJvX2RtYSBzdHJ1Y3Qgd2hpY2ggc2hvdWxkIGdldCB0aGUgRE1BIGJ1ZmZlcgotICoJQGxlbjogbGVuZ3RoIG9mIHRoZSBuZXcgRE1BIG1lbW9yeQotICoJQGdmcF9tYXNrOiBHRlAgbWFzawotICoKLSAqCUFsbG9jYXRlIGEgY29oZXJlbnQgRE1BIG1lbW9yeSBhbmQgd3JpdGUgdGhlIHBvaW50ZXJzIGludG8gYWRkci4KLSAqCi0gKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRU5PTUVNIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGkyb19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkciwKLQkJCQlzaXplX3QgbGVuLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlpbnQgZG1hXzY0ID0gMDsKLQotCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgKHBkZXYtPmRtYV9tYXNrID09IERNQV82NEJJVF9NQVNLKSkgewotCQlkbWFfNjQgPSAxOwotCQlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhZGRyLT52aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgbGVuLCAmYWRkci0+cGh5cywgZ2ZwX21hc2spOwotCi0JaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBkbWFfNjQpCi0JCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogdW5hYmxlIHRvIHNldCA2NC1iaXQgRE1BIik7Ci0KLQlpZiAoIWFkZHItPnZpcnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtc2V0KGFkZHItPnZpcnQsIDAsIGxlbik7Ci0JYWRkci0+bGVuID0gbGVuOwotCi0JcmV0dXJuIDA7Ci19OwotCi0vKioKLSAqCWkyb19kbWFfZnJlZSAtIEZyZWUgRE1BIG1lbW9yeQotICoJQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlIG9mIHRoZSBJMk8gY29udHJvbGxlcgotICoJQGFkZHI6IGkyb19kbWEgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBETUEgYnVmZmVyCi0gKgotICoJRnJlZSBhIGNvaGVyZW50IERNQSBtZW1vcnkgYW5kIHNldCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYWRkciB0byBOVUxMLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTJvX2RtYV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIpCi17Ci0JaWYgKGFkZHItPnZpcnQpIHsKLQkJaWYgKGFkZHItPnBoeXMpCi0JCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkZHItPmxlbiwgYWRkci0+dmlydCwKLQkJCQkJICBhZGRyLT5waHlzKTsKLQkJZWxzZQotCQkJa2ZyZWUoYWRkci0+dmlydCk7Ci0JCWFkZHItPnZpcnQgPSBOVUxMOwotCX0KLX07Ci0KLS8qKgotICoJaTJvX2RtYV9yZWFsbG9jIC0gUmVhbGxvYyBETUEgbWVtb3J5Ci0gKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCi0gKglAYWRkcjogcG9pbnRlciB0byBhIGkyb19kbWEgc3RydWN0IERNQSBidWZmZXIKLSAqCUBsZW46IG5ldyBsZW5ndGggb2YgbWVtb3J5Ci0gKglAZ2ZwX21hc2s6IEdGUCBtYXNrCi0gKgotICoJSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBhbGxvY2F0ZWQgaW4gdGhlIGFkZHIsIGZyZWUgaXQgZmlyc3QuIElmIGxlbiA+IDAKLSAqCXRoYW4gdHJ5IHRvIGFsbG9jYXRlIGl0IGFuZCB3cml0ZSB0aGUgYWRkcmVzc2VzIGJhY2sgdG8gdGhlIGFkZHIKLSAqCXN0cnVjdHVyZS4gSWYgbGVuID09IDAgc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gTlVMTC4KLSAqCi0gKglSZXR1cm5zIHRoZSAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX3JlYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkciwKLQkJCQkgIHNpemVfdCBsZW4sIGdmcF90IGdmcF9tYXNrKQotewotCWkyb19kbWFfZnJlZShkZXYsIGFkZHIpOwotCi0JaWYgKGxlbikKLQkJcmV0dXJuIGkyb19kbWFfYWxsb2MoZGV2LCBhZGRyLCBsZW4sIGdmcF9tYXNrKTsKLQotCXJldHVybiAwOwotfTsKLQotLyoKLSAqCWkyb19wb29sX2FsbG9jIC0gQWxsb2NhdGUgYW4gc2xhYiBjYWNoZSBhbmQgbWVtcG9vbAotICoJQG1lbXBvb2w6IHBvaW50ZXIgdG8gc3RydWN0IGkyb19wb29sIHRvIHdyaXRlIGRhdGEgaW50by4KLSAqCUBuYW1lOiBuYW1lIHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgY2FjaGUKLSAqCUBzaXplOiBzaXplIG9mIGVhY2ggb2JqZWN0Ci0gKglAbWluX25yOiBtaW5pbXVtIG51bWJlciBvZiBvYmplY3RzCi0gKgotICoJRmlyc3QgYWxsb2NhdGVzIGEgc2xhYiBjYWNoZSB3aXRoIG5hbWUgYW5kIHNpemUuIFRoZW4gYWxsb2NhdGVzIGEKLSAqCW1lbXBvb2wgd2hpY2ggdXNlcyB0aGUgc2xhYiBjYWNoZSBmb3IgYWxsb2NhdGlvbiBhbmQgZnJlZWluZy4KLSAqCi0gKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGkyb19wb29sX2FsbG9jKHN0cnVjdCBpMm9fcG9vbCAqcG9vbCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgc2l6ZV90IHNpemUsIGludCBtaW5fbnIpCi17Ci0JcG9vbC0+bmFtZSA9IGttYWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwb29sLT5uYW1lKQotCQlnb3RvIGV4aXQ7Ci0Jc3RyY3B5KHBvb2wtPm5hbWUsIG5hbWUpOwotCi0JcG9vbC0+c2xhYiA9Ci0JICAgIGttZW1fY2FjaGVfY3JlYXRlKHBvb2wtPm5hbWUsIHNpemUsIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCFwb29sLT5zbGFiKQotCQlnb3RvIGZyZWVfbmFtZTsKLQotCXBvb2wtPm1lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2wobWluX25yLCBwb29sLT5zbGFiKTsKLQlpZiAoIXBvb2wtPm1lbXBvb2wpCi0JCWdvdG8gZnJlZV9zbGFiOwotCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGZyZWVfc2xhYjoKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kocG9vbC0+c2xhYik7Ci0KLSAgICAgIGZyZWVfbmFtZToKLQlrZnJlZShwb29sLT5uYW1lKTsKLQotICAgICAgZXhpdDoKLQlyZXR1cm4gLUVOT01FTTsKLX07Ci0KLS8qCi0gKglpMm9fcG9vbF9mcmVlIC0gRnJlZSBzbGFiIGNhY2hlIGFuZCBtZW1wb29sIGFnYWluCi0gKglAbWVtcG9vbDogcG9pbnRlciB0byBzdHJ1Y3QgaTJvX3Bvb2wgd2hpY2ggc2hvdWxkIGJlIGZyZWVkCi0gKgotICoJTm90ZSB0aGF0IHlvdSBoYXZlIHRvIHJldHVybiBhbGwgb2JqZWN0cyB0byB0aGUgbWVtcG9vbCBhZ2FpbiBiZWZvcmUKLSAqCWNhbGxpbmcgaTJvX3Bvb2xfZnJlZSgpLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTJvX3Bvb2xfZnJlZShzdHJ1Y3QgaTJvX3Bvb2wgKnBvb2wpCi17Ci0JbWVtcG9vbF9kZXN0cm95KHBvb2wtPm1lbXBvb2wpOwotCWttZW1fY2FjaGVfZGVzdHJveShwb29sLT5zbGFiKTsKLQlrZnJlZShwb29sLT5uYW1lKTsKLX07Ci0KKwkJCQkgdTMyICoqIHNnX3B0cik7CitleHRlcm4gaW50IGkyb19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkciwgc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBpMm9fZG1hX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkcik7CitleHRlcm4gaW50IGkyb19kbWFfcmVhbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpMm9fZG1hICphZGRyLAorCQkJCQkJCQlzaXplX3QgbGVuKTsKK2V4dGVybiBpbnQgaTJvX3Bvb2xfYWxsb2Moc3RydWN0IGkyb19wb29sICpwb29sLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBzaXplX3Qgc2l6ZSwgaW50IG1pbl9ucik7CitleHRlcm4gdm9pZCBpMm9fcG9vbF9mcmVlKHN0cnVjdCBpMm9fcG9vbCAqcG9vbCk7CiAvKiBJMk8gZHJpdmVyIChPU00pIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBpMm9fZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBpMm9fZHJpdmVyICopOwogZXh0ZXJuIHZvaWQgaTJvX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpMm9fZHJpdmVyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pY21wdjYuaCBiL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKaW5kZXggMDMwNjc0NC4uYTkzYThkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pY21wdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCkBAIC00MCwxNiArNDAsMTggQEAKICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNtcHY2X25kX3JhIHsKIAkJCV9fdTgJCWhvcF9saW1pdDsKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQkJCV9fdTgJCXJlc2VydmVkOjQsCisJCQlfX3U4CQlyZXNlcnZlZDozLAogCQkJCQlyb3V0ZXJfcHJlZjoyLAorCQkJCQlob21lX2FnZW50OjEsCiAJCQkJCW90aGVyOjEsCiAJCQkJCW1hbmFnZWQ6MTsKIAogI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCiAJCQlfX3U4CQltYW5hZ2VkOjEsCiAJCQkJCW90aGVyOjEsCisJCQkJCWhvbWVfYWdlbnQ6MSwKIAkJCQkJcm91dGVyX3ByZWY6MiwKLQkJCQkJcmVzZXJ2ZWQ6NDsKKwkJCQkJcmVzZXJ2ZWQ6MzsKICNlbHNlCiAjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRlLmggYi9pbmNsdWRlL2xpbnV4L2lkZS5oCmluZGV4IDE1MjQ4MjkuLmM0N2UzNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZGUuaApAQCAtOCw3ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVBQ1BJCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjZW5kaWYKQEAgLTQ3LDEyICs0OCw2IEBACiAjZGVmaW5lIEVSUk9SX1JFU0VUCTMJLyogUmVzZXQgY29udHJvbGxlciBldmVyeSA0dGggcmV0cnkgKi8KICNkZWZpbmUgRVJST1JfUkVDQUwJMQkvKiBSZWNhbGlicmF0ZSBldmVyeSAybmQgcmV0cnkgKi8KIAotLyoKLSAqIHN0YXRlIGZsYWdzCi0gKi8KLQotI2RlZmluZSBETUFfUElPX1JFVFJZCTEJLyogcmV0cnlpbmcgaW4gUElPICovCi0KICNkZWZpbmUgSFdJRihkcml2ZSkJCSgoaWRlX2h3aWZfdCAqKSgoZHJpdmUpLT5od2lmKSkKICNkZWZpbmUgSFdHUk9VUChkcml2ZSkJCSgoaWRlX2h3Z3JvdXBfdCAqKShIV0lGKGRyaXZlKS0+aHdncm91cCkpCiAKQEAgLTg3LDEyICs4MiwxMyBAQAogfTsKIAogI2RlZmluZSBPS19TVEFUKHN0YXQsZ29vZCxiYWQpCSgoKHN0YXQpJigoZ29vZCl8KGJhZCkpKT09KGdvb2QpKQotI2RlZmluZSBCQURfUl9TVEFUCQkoQlVTWV9TVEFUICAgfCBFUlJfU1RBVCkKLSNkZWZpbmUgQkFEX1dfU1RBVAkJKEJBRF9SX1NUQVQgIHwgV1JFUlJfU1RBVCkKLSNkZWZpbmUgQkFEX1NUQVQJCShCQURfUl9TVEFUICB8IERSUV9TVEFUKQotI2RlZmluZSBEUklWRV9SRUFEWQkJKFJFQURZX1NUQVQgIHwgU0VFS19TVEFUKQogCi0jZGVmaW5lIEJBRF9DUkMJCQkoQUJSVF9FUlIgICAgfCBJQ1JDX0VSUikKKyNkZWZpbmUgQkFEX1JfU1RBVAkoQVRBX0JVU1kgfCBBVEFfRVJSKQorI2RlZmluZSBCQURfV19TVEFUCShCQURfUl9TVEFUIHwgQVRBX0RGKQorI2RlZmluZSBCQURfU1RBVAkoQkFEX1JfU1RBVCB8IEFUQV9EUlEpCisjZGVmaW5lIERSSVZFX1JFQURZCShBVEFfRFJEWSB8IEFUQV9EU0MpCisKKyNkZWZpbmUgQkFEX0NSQwkJKEFUQV9BQk9SVEVEIHwgQVRBX0lDUkMpCiAKICNkZWZpbmUgU0FUQV9OUl9QT1JUUwkJKDMpCS8qIDE2IHBvc3NpYmxlID8/ICovCiAKQEAgLTEyNSwyNCArMTIxLDQzIEBACiAjZGVmaW5lIFBBUlROX0JJVFMJNgkvKiBudW1iZXIgb2YgbWlub3IgZGV2IGJpdHMgZm9yIHBhcnRpdGlvbnMgKi8KICNkZWZpbmUgTUFYX0RSSVZFUwkyCS8qIHBlciBpbnRlcmZhY2U7IDIgYXNzdW1lZCBieSBsb3RzIG9mIGNvZGUgKi8KICNkZWZpbmUgU0VDVE9SX1NJWkUJNTEyCi0jZGVmaW5lIFNFQ1RPUl9XT1JEUwkoU0VDVE9SX1NJWkUgLyA0KQkvKiBudW1iZXIgb2YgMzJiaXQgd29yZHMgcGVyIHNlY3RvciAqLworCiAjZGVmaW5lIElERV9MQVJHRV9TRUVLKGIxLGIyLHQpCSgoKGIxKSA+IChiMikgKyAodCkpIHx8ICgoYjIpID4gKGIxKSArICh0KSkpCiAKIC8qCiAgKiBUaW1lb3V0cyBmb3IgdmFyaW91cyBvcGVyYXRpb25zOgogICovCi0jZGVmaW5lIFdBSVRfRFJRCShIWi8xMCkJCS8qIDEwMG1zZWMgLSBzcGVjIGFsbG93cyB1cCB0byAyMG1zICovCi0jZGVmaW5lIFdBSVRfUkVBRFkJKDUqSFopCQkvKiA1c2VjIC0gc29tZSBsYXB0b3BzIGFyZSB2ZXJ5IHNsb3cgKi8KLSNkZWZpbmUgV0FJVF9QSURFTlRJRlkJKDEwKkhaKQkvKiAxMHNlYyAgLSBzaG91bGQgYmUgbGVzcyB0aGFuIDNtcyAoPyksIGlmIGFsbCBBVEFQSSBDRCBpcyBjbG9zZWQgYXQgYm9vdCAqLwotI2RlZmluZSBXQUlUX1dPUlNUQ0FTRQkoMzAqSFopCS8qIDMwc2VjICAtIHdvcnN0IGNhc2Ugd2hlbiBzcGlubmluZyB1cCAqLwotI2RlZmluZSBXQUlUX0NNRAkoMTAqSFopCS8qIDEwc2VjICAtIG1heGltdW0gd2FpdCBmb3IgYW4gSVJRIHRvIGhhcHBlbiAqLwotI2RlZmluZSBXQUlUX01JTl9TTEVFUAkoMipIWi8xMDApCS8qIDIwbXNlYyAtIG1pbmltdW0gc2xlZXAgdGltZSAqLworZW51bSB7CisJLyogc3BlYyBhbGxvd3MgdXAgdG8gMjBtcyAqLworCVdBSVRfRFJRCT0gSFogLyAxMCwJLyogMTAwbXMgKi8KKwkvKiBzb21lIGxhcHRvcHMgYXJlIHZlcnkgc2xvdyAqLworCVdBSVRfUkVBRFkJPSA1ICogSFosCS8qIDVzICovCisJLyogc2hvdWxkIGJlIGxlc3MgdGhhbiAzbXMgKD8pLCBpZiBhbGwgQVRBUEkgQ0QgaXMgY2xvc2VkIGF0IGJvb3QgKi8KKwlXQUlUX1BJREVOVElGWQk9IDEwICogSFosCS8qIDEwcyAqLworCS8qIHdvcnN0IGNhc2Ugd2hlbiBzcGlubmluZyB1cCAqLworCVdBSVRfV09SU1RDQVNFCT0gMzAgKiBIWiwJLyogMzBzICovCisJLyogbWF4aW11bSB3YWl0IGZvciBhbiBJUlEgdG8gaGFwcGVuICovCisJV0FJVF9DTUQJPSAxMCAqIEhaLAkvKiAxMHMgKi8KKwkvKiBTb21lIGRyaXZlcyByZXF1aXJlIGEgbG9uZ2VyIElSUSB0aW1lb3V0LiAqLworCVdBSVRfRkxPUFBZX0NNRAk9IDUwICogSFosCS8qIDUwcyAqLworCS8qCisJICogU29tZSBkcml2ZXMgKGZvciBleGFtcGxlLCBTZWFnYXRlIFNUVDM0MDFBIFRyYXZhbikgcmVxdWlyZSBhIHZlcnkKKwkgKiBsb25nIHRpbWVvdXQsIGJlY2F1c2UgdGhleSBkb24ndCByZXR1cm4gYW4gaW50ZXJydXB0IG9yIGNsZWFyIHRoZWlyCisJICogQlNZIGJpdCB1bnRpbCBhZnRlciB0aGUgY29tbWFuZCBjb21wbGV0ZXMgKGV2ZW4gcmV0ZW5zaW9uIGNvbW1hbmRzKS4KKwkgKi8KKwlXQUlUX1RBUEVfQ01ECT0gOTAwICogSFosCS8qIDkwMHMgKi8KKwkvKiBtaW5pbXVtIHNsZWVwIHRpbWUgKi8KKwlXQUlUX01JTl9TTEVFUAk9IEhaIC8gNTAsCS8qIDIwbXMgKi8KK307CiAKIC8qCiAgKiBPcCBjb2RlcyBmb3Igc3BlY2lhbCByZXF1ZXN0cyB0byBiZSBoYW5kbGVkIGJ5IGlkZV9zcGVjaWFsX3JxKCkuCiAgKiBWYWx1ZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAweDIwIHRvIDB4M2YuCiAgKi8KICNkZWZpbmUgUkVRX0RSSVZFX1JFU0VUCQkweDIwCisjZGVmaW5lIFJFUV9ERVZTRVRfRVhFQwkJMHgyMQorI2RlZmluZSBSRVFfUEFSS19IRUFEUwkJMHgyMgorI2RlZmluZSBSRVFfVU5QQVJLX0hFQURTCTB4MjMKIAogLyoKICAqIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgYW5kIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgc3RhdHVzCkBAIC0yNDksOCArMjY0LDYgQEAKICAqIHNldF9nZW9tZXRyeQk6IHJlc3BlY2lmeSBkcml2ZSBnZW9tZXRyeQogICogcmVjYWxpYnJhdGUJOiBzZWVrIHRvIGN5bCAwCiAgKiBzZXRfbXVsdG1vZGUJOiBzZXQgbXVsdG1vZGUgY291bnQKLSAqIHNldF90dW5lCTogdHVuZSBpbnRlcmZhY2UgZm9yIGRyaXZlCi0gKiBzZXJ2aWNlZAk6IHNlcnZpY2UgY29tbWFuZAogICogcmVzZXJ2ZWQJOiB1bnVzZWQKICAqLwogdHlwZWRlZiB1bmlvbiB7CkBAIC0yNTksNDMgKzI3MiwxMSBAQAogCQl1bnNpZ25lZCBzZXRfZ2VvbWV0cnkJOiAxOwogCQl1bnNpZ25lZCByZWNhbGlicmF0ZQk6IDE7CiAJCXVuc2lnbmVkIHNldF9tdWx0bW9kZQk6IDE7Ci0JCXVuc2lnbmVkIHNldF90dW5lCTogMTsKLQkJdW5zaWduZWQgc2VydmljZWQJOiAxOwotCQl1bnNpZ25lZCByZXNlcnZlZAk6IDM7CisJCXVuc2lnbmVkIHJlc2VydmVkCTogNTsKIAl9IGI7CiB9IHNwZWNpYWxfdDsKIAogLyoKLSAqIEFUQS1JREUgU2VsZWN0IFJlZ2lzdGVyLCBha2EgRGV2aWNlLUhlYWQKLSAqCi0gKiBoZWFkCQk6IGFsd2F5cyB6ZXJvcyBoZXJlCi0gKiB1bml0CQk6IGRyaXZlIHNlbGVjdCBudW1iZXI6IDAvMQotICogYml0NQkJOiBhbHdheXMgMQotICogbGJhCQk6IHVzaW5nIExCQSBpbnN0ZWFkIG9mIENIUwotICogYml0NwkJOiBhbHdheXMgMQotICovCi10eXBlZGVmIHVuaW9uIHsKLQl1bnNpZ25lZCBhbGwJCQk6IDg7Ci0Jc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQkJdW5zaWduZWQgaGVhZAkJOiA0OwotCQl1bnNpZ25lZCB1bml0CQk6IDE7Ci0JCXVuc2lnbmVkIGJpdDUJCTogMTsKLQkJdW5zaWduZWQgbGJhCQk6IDE7Ci0JCXVuc2lnbmVkIGJpdDcJCTogMTsKLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCQl1bnNpZ25lZCBiaXQ3CQk6IDE7Ci0JCXVuc2lnbmVkIGxiYQkJOiAxOwotCQl1bnNpZ25lZCBiaXQ1CQk6IDE7Ci0JCXVuc2lnbmVkIHVuaXQJCTogMTsKLQkJdW5zaWduZWQgaGVhZAkJOiA0OwotI2Vsc2UKLSNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKLSNlbmRpZgotCX0gYjsKLX0gc2VsZWN0X3QsIGF0YV9zZWxlY3RfdDsKLQotLyoKICAqIFN0YXR1cyByZXR1cm5lZCBmcm9tIHZhcmlvdXMgaWRlXyBmdW5jdGlvbnMKICAqLwogdHlwZWRlZiBlbnVtIHsKQEAgLTMwMyw2MzMgKzI4NCw2IEBACiAJaWRlX3N0YXJ0ZWQsCS8qIGEgZHJpdmUgb3BlcmF0aW9uIHdhcyBzdGFydGVkLCBoYW5kbGVyIHdhcyBzZXQgKi8KIH0gaWRlX3N0YXJ0c3RvcF90OwogCi1zdHJ1Y3QgaWRlX2RyaXZlcl9zOwotc3RydWN0IGlkZV9zZXR0aW5nc19zOwotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSURFQUNQSQotc3RydWN0IGlkZV9hY3BpX2RyaXZlX2xpbms7Ci1zdHJ1Y3QgaWRlX2FjcGlfaHdpZl9saW5rOwotI2VuZGlmCi0KLS8qIEFUQVBJIGRldmljZSBmbGFncyAqLwotZW51bSB7Ci0JSURFX0FGTEFHX0RSUV9JTlRFUlJVUFQJCT0gKDEgPDwgMCksCi0JSURFX0FGTEFHX01FRElBX0NIQU5HRUQJCT0gKDEgPDwgMSksCi0KLQkvKiBpZGUtY2QgKi8KLQkvKiBEcml2ZSBjYW5ub3QgbG9jayB0aGUgZG9vci4gKi8KLQlJREVfQUZMQUdfTk9fRE9PUkxPQ0sJCT0gKDEgPDwgMiksCi0JLyogRHJpdmUgY2Fubm90IGVqZWN0IHRoZSBkaXNjLiAqLwotCUlERV9BRkxBR19OT19FSkVDVAkJPSAoMSA8PCAzKSwKLQkvKiBEcml2ZSBpcyBhIHByZSBBVEFQSSAxLjIgZHJpdmUuICovCi0JSURFX0FGTEFHX1BSRV9BVEFQSTEyCQk9ICgxIDw8IDQpLAotCS8qIFRPQyBhZGRyZXNzZXMgYXJlIGluIEJDRC4gKi8KLQlJREVfQUZMQUdfVE9DQUREUl9BU19CQ0QJPSAoMSA8PCA1KSwKLQkvKiBUT0MgdHJhY2sgbnVtYmVycyBhcmUgaW4gQkNELiAqLwotCUlERV9BRkxBR19UT0NUUkFDS1NfQVNfQkNECT0gKDEgPDwgNiksCi0JLyoKLQkgKiBEcml2ZSBkb2VzIG5vdCBwcm92aWRlIGRhdGEgaW4gbXVsdGlwbGVzIG9mIFNFQ1RPUl9TSVpFCi0JICogd2hlbiBtb3JlIHRoYW4gb25lIGludGVycnVwdCBpcyBuZWVkZWQuCi0JICovCi0JSURFX0FGTEFHX0xJTUlUX05GUkFNRVMJCT0gKDEgPDwgNyksCi0JLyogU2Vla2luZyBpbiBwcm9ncmVzcy4gKi8KLQlJREVfQUZMQUdfU0VFS0lORwkJPSAoMSA8PCA4KSwKLQkvKiBTYXZlZCBUT0MgaW5mb3JtYXRpb24gaXMgY3VycmVudC4gKi8KLQlJREVfQUZMQUdfVE9DX1ZBTElECQk9ICgxIDw8IDkpLAotCS8qIFdlIHRoaW5rIHRoYXQgdGhlIGRyaXZlIGRvb3IgaXMgbG9ja2VkLiAqLwotCUlERV9BRkxBR19ET09SX0xPQ0tFRAkJPSAoMSA8PCAxMCksCi0JLyogU0VUX0NEX1NQRUVEIGNvbW1hbmQgaXMgdW5zdXBwb3J0ZWQuICovCi0JSURFX0FGTEFHX05PX1NQRUVEX1NFTEVDVAk9ICgxIDw8IDExKSwKLQlJREVfQUZMQUdfVkVSVE9TXzMwMF9TU0QJPSAoMSA8PCAxMiksCi0JSURFX0FGTEFHX1ZFUlRPU182MDBfRVNECT0gKDEgPDwgMTMpLAotCUlERV9BRkxBR19TQU5ZT18zQ0QJCT0gKDEgPDwgMTQpLAotCUlERV9BRkxBR19GVUxMX0NBUFNfUEFHRQk9ICgxIDw8IDE1KSwKLQlJREVfQUZMQUdfUExBWV9BVURJT19PSwkJPSAoMSA8PCAxNiksCi0JSURFX0FGTEFHX0xFX1NQRUVEX0ZJRUxEUwk9ICgxIDw8IDE3KSwKLQotCS8qIGlkZS1mbG9wcHkgKi8KLQkvKiBGb3JtYXQgaW4gcHJvZ3Jlc3MgKi8KLQlJREVfQUZMQUdfRk9STUFUX0lOX1BST0dSRVNTCT0gKDEgPDwgMTgpLAotCS8qIEF2b2lkIGNvbW1hbmRzIG5vdCBzdXBwb3J0ZWQgaW4gQ2xpayBkcml2ZSAqLwotCUlERV9BRkxBR19DTElLX0RSSVZFCQk9ICgxIDw8IDE5KSwKLQkvKiBSZXF1aXJlcyBCSCBhbGdvcml0aG0gZm9yIHBhY2tldHMgKi8KLQlJREVfQUZMQUdfWklQX0RSSVZFCQk9ICgxIDw8IDIwKSwKLQotCS8qIGlkZS10YXBlICovCi0JSURFX0FGTEFHX0lHTk9SRV9EU0MJCT0gKDEgPDwgMjEpLAotCS8qIDAgV2hlbiB0aGUgdGFwZSBwb3NpdGlvbiBpcyB1bmtub3duICovCi0JSURFX0FGTEFHX0FERFJFU1NfVkFMSUQJCT0gKDEgPDwJMjIpLAotCS8qIERldmljZSBhbHJlYWR5IG9wZW5lZCAqLwotCUlERV9BRkxBR19CVVNZCQkJPSAoMSA8PCAyMyksCi0JLyogQXR0ZW1wdCB0byBhdXRvLWRldGVjdCB0aGUgY3VycmVudCB1c2VyIGJsb2NrIHNpemUgKi8KLQlJREVfQUZMQUdfREVURUNUX0JTCQk9ICgxIDw8IDI0KSwKLQkvKiBDdXJyZW50bHkgb24gYSBmaWxlbWFyayAqLwotCUlERV9BRkxBR19GSUxFTUFSSwkJPSAoMSA8PCAyNSksCi0JLyogMCA9IG5vIHRhcGUgaXMgbG9hZGVkLCBzbyB3ZSBkb24ndCByZXdpbmQgYWZ0ZXIgZWplY3RpbmcgKi8KLQlJREVfQUZMQUdfTUVESVVNX1BSRVNFTlQJPSAoMSA8PCAyNikKLX07Ci0KLXN0cnVjdCBpZGVfZHJpdmVfcyB7Ci0JY2hhcgkJbmFtZVs0XTsJLyogZHJpdmUgbmFtZSwgc3VjaCBhcyAiaGRhIiAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgZHJpdmVyX3JlcVsxMF07CS8qIHJlcXVlc3RzIHNwZWNpZmljIGRyaXZlciAqLwotCi0Jc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCi0KLQlzdHJ1Y3QgcmVxdWVzdAkJKnJxOwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgaWRlX2RyaXZlX3MgCSpuZXh0OwkvKiBjaXJjdWxhciBsaXN0IG9mIGh3Z3JvdXAgZHJpdmVzICovCi0Jdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBleHRyYSBkcml2ZXIgZGF0YSAqLwotCXN0cnVjdCBoZF9kcml2ZWlkCSppZDsJLyogZHJpdmUgbW9kZWwgaWRlbnRpZmljYXRpb24gaW5mbyAqLwotI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsJLyogL3Byb2MvaWRlLyBkaXJlY3RvcnkgZW50cnkgKi8KLQlzdHJ1Y3QgaWRlX3NldHRpbmdzX3MgKnNldHRpbmdzOy8qIC9wcm9jL2lkZS8gZHJpdmUgc2V0dGluZ3MgKi8KLSNlbmRpZgotCXN0cnVjdCBod2lmX3MJCSpod2lmOwkvKiBhY3R1YWxseSAoaWRlX2h3aWZfdCAqKSAqLwotCi0JdW5zaWduZWQgbG9uZyBzbGVlcDsJCS8qIHNsZWVwIHVudGlsIHRoaXMgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcgc2VydmljZV9zdGFydDsJLyogdGltZSB3ZSBzdGFydGVkIGxhc3QgcmVxdWVzdCAqLwotCXVuc2lnbmVkIGxvbmcgc2VydmljZV90aW1lOwkvKiBzZXJ2aWNlIHRpbWUgb2YgbGFzdCByZXF1ZXN0ICovCi0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwkJLyogbWF4IHRpbWUgdG8gd2FpdCBmb3IgaXJxICovCi0KLQlzcGVjaWFsX3QJc3BlY2lhbDsJLyogc3BlY2lhbCBhY3Rpb24gZmxhZ3MgKi8KLQlzZWxlY3RfdAlzZWxlY3Q7CQkvKiBiYXNpYyBkcml2ZS9oZWFkIHNlbGVjdCByZWcgdmFsdWUgKi8KLQotCXU4CWtlZXBfc2V0dGluZ3M7CQkvKiByZXN0b3JlIHNldHRpbmdzIGFmdGVyIGRyaXZlIHJlc2V0ICovCi0JdTgJdXNpbmdfZG1hOwkJLyogZGlzayBpcyB1c2luZyBkbWEgZm9yIHJlYWQvd3JpdGUgKi8KLQl1OAlyZXRyeV9waW87CQkvKiByZXRyeWluZyBkbWEgY2FwYWJsZSBob3N0IGluIHBpbyAqLwotCXU4CXN0YXRlOwkJCS8qIHJldHJ5IHN0YXRlICovCi0JdTgJd2FpdGluZ19mb3JfZG1hOwkvKiBkbWEgY3VycmVudGx5IGluIHByb2dyZXNzICovCi0JdTgJdW5tYXNrOwkJCS8qIG9rYXkgdG8gdW5tYXNrIG90aGVyIGlycXMgKi8KLQl1OAlub2ZsdXNoOwkJLyogZG9uJ3QgYXR0ZW1wdCBmbHVzaGVzICovCi0JdTgJZHNjX292ZXJsYXA7CQkvKiBEU0Mgb3ZlcmxhcCAqLwotCXU4CW5pY2UxOwkJCS8qIGdpdmUgcG90ZW50aWFsIGV4Y2VzcyBiYW5kd2lkdGggKi8KLQotCXVuc2lnbmVkIHByZXNlbnQJOiAxOwkvKiBkcml2ZSBpcyBwaHlzaWNhbGx5IHByZXNlbnQgKi8KLQl1bnNpZ25lZCBkZWFkCQk6IDE7CS8qIGRldmljZSBlamVjdGVkIGhpbnQgKi8KLQl1bnNpZ25lZCBpZF9yZWFkCTogMTsJLyogMT1pZCByZWFkIGZyb20gZGlzayAwID0gc3ludGhldGljICovCi0JdW5zaWduZWQgbm9wcm9iZSAJOiAxOwkvKiBmcm9tOiAgaGR4PW5vcHJvYmUgKi8KLQl1bnNpZ25lZCByZW1vdmFibGUJOiAxOwkvKiAxIGlmIG5lZWQgdG8gZG8gY2hlY2tfbWVkaWFfY2hhbmdlICovCi0JdW5zaWduZWQgYXR0YWNoCQk6IDE7CS8qIG5lZWRlZCBmb3IgcmVtb3ZhYmxlIGRldmljZXMgKi8KLQl1bnNpZ25lZCBmb3JjZWRfZ2VvbQk6IDE7CS8qIDEgaWYgaGR4PWMsaCxzIHdhcyBnaXZlbiBhdCBib290ICovCi0JdW5zaWduZWQgbm9fdW5tYXNrCTogMTsJLyogZGlzYWxsb3cgc2V0dGluZyB1bm1hc2sgYml0ICovCi0JdW5zaWduZWQgbm9faW9fMzJiaXQJOiAxOwkvKiBkaXNhbGxvdyBlbmFibGluZyAzMmJpdCBJL08gKi8KLQl1bnNpZ25lZCBhdGFwaV9vdmVybGFwCTogMTsJLyogQVRBUEkgb3ZlcmxhcCAobm90IHN1cHBvcnRlZCkgKi8KLQl1bnNpZ25lZCBkb29ybG9ja2luZwk6IDE7CS8qIGZvciByZW1vdmFibGUgb25seTogZG9vciBsb2NrL3VubG9jayB3b3JrcyAqLwotCXVuc2lnbmVkIG5vZG1hCQk6IDE7CS8qIGRpc2FsbG93IERNQSAqLwotCXVuc2lnbmVkIHJlbWFwXzBfdG9fMQk6IDE7CS8qIDA9bm9yZW1hcCwgMT1yZW1hcCAwLT4xIChmb3IgRVpEcml2ZSkgKi8KLQl1bnNpZ25lZCBibG9ja2VkICAgICAgICA6IDE7CS8qIDE9cG93ZXJtYW5hZ21lbnQgdG9sZCB1cyBub3QgdG8gZG8gYW55dGhpbmcsIHNvIHNsZWVwIG5pY2VseSAqLwotCXVuc2lnbmVkIHNjc2kJCTogMTsJLyogMD1kZWZhdWx0LCAxPWlkZS1zY3NpIGVtdWxhdGlvbiAqLwotCXVuc2lnbmVkIHNsZWVwaW5nCTogMTsJLyogMT1zbGVlcGluZyAmIHNsZWVwIGZpZWxkIHZhbGlkICovCi0JdW5zaWduZWQgcG9zdF9yZXNldAk6IDE7Ci0JdW5zaWduZWQgdWRtYTMzX3dhcm5lZAk6IDE7Ci0KLQl1OAlhZGRyZXNzaW5nOwkvKiAwPTI4LWJpdCwgMT00OC1iaXQsIDI9NDgtYml0IGRvaW5nIDI4LWJpdCAqLwotICAgICAgICB1OAlxdWlya19saXN0OwkvKiBjb25zaWRlcmVkIHF1aXJreSwgc2V0IGZvciBhIHNwZWNpZmljIGhvc3QgKi8KLSAgICAgICAgdTgJaW5pdF9zcGVlZDsJLyogdHJhbnNmZXIgcmF0ZSBzZXQgYXQgYm9vdCAqLwotICAgICAgICB1OAljdXJyZW50X3NwZWVkOwkvKiBjdXJyZW50IHRyYW5zZmVyIHJhdGUgc2V0ICovCi0JdTgJZGVzaXJlZF9zcGVlZDsJLyogZGVzaXJlZCB0cmFuc2ZlciByYXRlIHNldCAqLwotICAgICAgICB1OAlkbjsJCS8qIG5vdyB3aWRlIHNwcmVhZCB1c2UgKi8KLSAgICAgICAgdTgJd2NhY2hlOwkJLyogc3RhdHVzIG9mIHdyaXRlIGNhY2hlICovCi0JdTgJYWNvdXN0aWM7CS8qIGFjb3VzdGljIG1hbmFnZW1lbnQgKi8KLQl1OAltZWRpYTsJCS8qIGRpc2ssIGNkcm9tLCB0YXBlLCBmbG9wcHksIC4uLiAqLwotCXU4CXJlYWR5X3N0YXQ7CS8qIG1pbiBzdGF0dXMgdmFsdWUgZm9yIGRyaXZlIHJlYWR5ICovCi0JdTgJbXVsdF9jb3VudDsJLyogY3VycmVudCBtdWx0aXBsZSBzZWN0b3Igc2V0dGluZyAqLwotCXU4CW11bHRfcmVxOwkvKiByZXF1ZXN0ZWQgbXVsdGlwbGUgc2VjdG9yIHNldHRpbmcgKi8KLQl1OAl0dW5lX3JlcTsJLyogcmVxdWVzdGVkIGRyaXZlIHR1bmluZyBzZXR0aW5nICovCi0JdTgJaW9fMzJiaXQ7CS8qIDA9MTYtYml0LCAxPTMyLWJpdCwgMi8zPTMyYml0K3N5bmMgKi8KLQl1OAliYWRfd3N0YXQ7CS8qIHVzZWQgZm9yIGlnbm9yaW5nIFdSRVJSX1NUQVQgKi8KLQl1OAlub3dlcnI7CQkvKiB1c2VkIGZvciBpZ25vcmluZyBXUkVSUl9TVEFUICovCi0JdTgJc2VjdDA7CQkvKiBvZmZzZXQgb2YgZmlyc3Qgc2VjdG9yIGZvciBETTY6RERPICovCi0JdTgJaGVhZDsJCS8qICJyZWFsIiBudW1iZXIgb2YgaGVhZHMgKi8KLQl1OAlzZWN0OwkJLyogInJlYWwiIHNlY3RvcnMgcGVyIHRyYWNrICovCi0JdTgJYmlvc19oZWFkOwkvKiBCSU9TL2ZkaXNrL0xJTE8gbnVtYmVyIG9mIGhlYWRzICovCi0JdTgJYmlvc19zZWN0OwkvKiBCSU9TL2ZkaXNrL0xJTE8gc2VjdG9ycyBwZXIgdHJhY2sgKi8KLQotCXVuc2lnbmVkIGludAliaW9zX2N5bDsJLyogQklPUy9mZGlzay9MSUxPIG51bWJlciBvZiBjeWxzICovCi0JdW5zaWduZWQgaW50CWN5bDsJCS8qICJyZWFsIiBudW1iZXIgb2YgY3lscyAqLwotCXVuc2lnbmVkIGludAlkcml2ZV9kYXRhOwkvKiB1c2VkIGJ5IHNldF9waW9fbW9kZS9zZWxlY3Rwcm9jICovCi0JdW5zaWduZWQgaW50CWZhaWx1cmVzOwkvKiBjdXJyZW50IGZhaWx1cmUgY291bnQgKi8KLQl1bnNpZ25lZCBpbnQJbWF4X2ZhaWx1cmVzOwkvKiBtYXhpbXVtIGFsbG93ZWQgZmFpbHVyZSBjb3VudCAqLwotCXU2NAkJcHJvYmVkX2NhcGFjaXR5Oy8qIGluaXRpYWwgcmVwb3J0ZWQgbWVkaWEgY2FwYWNpdHkgKGlkZS1jZCBvbmx5IGN1cnJlbnRseSkgKi8KLQotCXU2NAkJY2FwYWNpdHk2NDsJLyogdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgKi8KLQotCWludAkJbHVuOwkJLyogbG9naWNhbCB1bml0ICovCi0JaW50CQljcmNfY291bnQ7CS8qIGNyYyBjb3VudGVyIHRvIHJlZHVjZSBkcml2ZSBzcGVlZCAqLwotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKLQlzdHJ1Y3QgaWRlX2FjcGlfZHJpdmVfbGluayAqYWNwaWRhdGE7Ci0jZW5kaWYKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGRldmljZQlnZW5kZXY7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZ2VuZGV2X3JlbF9jb21wOwkvKiB0byBkZWFsIHdpdGggZGV2aWNlIHJlbGVhc2UoKSAqLwotCi0JLyogY2FsbGJhY2sgZm9yIHBhY2tldCBjb21tYW5kcyAqLwotCXZvaWQgKCpwY19jYWxsYmFjaykoc3RydWN0IGlkZV9kcml2ZV9zICopOwotCi0JdW5zaWduZWQgbG9uZyBhdGFwaV9mbGFnczsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGlkZV9kcml2ZV9zIGlkZV9kcml2ZV90OwotCi0jZGVmaW5lIHRvX2lkZV9kZXZpY2UoZGV2KWNvbnRhaW5lcl9vZihkZXYsIGlkZV9kcml2ZV90LCBnZW5kZXYpCi0KLSNkZWZpbmUgSURFX0NISVBTRVRfUENJX01BU0sJXAotICAgICgoMTw8aWRlX3BjaSl8KDE8PGlkZV9jbWQ2NDYpfCgxPDxpZGVfYWxpMTR4eCkpCi0jZGVmaW5lIElERV9DSElQU0VUX0lTX1BDSShjKQkoKElERV9DSElQU0VUX1BDSV9NQVNLID4+IChjKSkgJiAxKQotCi1zdHJ1Y3QgaWRlX3Rhc2tfczsKLXN0cnVjdCBpZGVfcG9ydF9pbmZvOwotCi1zdHJ1Y3QgaWRlX3RwX29wcyB7Ci0Jdm9pZAkoKmV4ZWNfY29tbWFuZCkoc3RydWN0IGh3aWZfcyAqLCB1OCk7Ci0JdTgJKCpyZWFkX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKLQl1OAkoKnJlYWRfYWx0c3RhdHVzKShzdHJ1Y3QgaHdpZl9zICopOwotCXU4CSgqcmVhZF9zZmZfZG1hX3N0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKLQotCXZvaWQJKCpzZXRfaXJxKShzdHJ1Y3QgaHdpZl9zICosIGludCk7Ci0KLQl2b2lkCSgqdGZfbG9hZCkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV90YXNrX3MgKik7Ci0Jdm9pZAkoKnRmX3JlYWQpKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfdGFza19zICopOwotCi0Jdm9pZAkoKmlucHV0X2RhdGEpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCk7Ci0Jdm9pZAkoKm91dHB1dF9kYXRhKShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkICosCi0JCQkgICAgICAgdW5zaWduZWQgaW50KTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyBkZWZhdWx0X3RwX29wczsKLQotLyoqCi0gKiBzdHJ1Y3QgaWRlX3BvcnRfb3BzIC0gSURFIHBvcnQgb3BlcmF0aW9ucwotICoKLSAqIEBpbml0X2RldjoJCWhvc3Qgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gb2YgYSBkZXZpY2UKLSAqIEBzZXRfcGlvX21vZGU6CXJvdXRpbmUgdG8gcHJvZ3JhbSBob3N0IGZvciBQSU8gbW9kZQotICogQHNldF9kbWFfbW9kZToJcm91dGluZSB0byBwcm9ncmFtIGhvc3QgZm9yIERNQSBtb2RlCi0gKiBAc2VsZWN0cHJvYzoJCXR3ZWFrcyBoYXJkd2FyZSB0byBzZWxlY3QgZHJpdmUKLSAqIEByZXNldF9wb2xsOgkJY2hpcHNldCBwb2xsaW5nIGJhc2VkIG9uIGhiYSBzcGVjaWZpY3MKLSAqIEBwcmVfcmVzZXQ6CQljaGlwc2V0IHNwZWNpZmljIGNoYW5nZXMgdG8gZGVmYXVsdCBmb3IgZGV2aWNlLWhiYSByZXNldHMKLSAqIEByZXNldHByb2M6CQlyb3V0aW5lIHRvIHJlc2V0IGNvbnRyb2xsZXIgYWZ0ZXIgYSBkaXNrIHJlc2V0Ci0gKiBAbWFza3Byb2M6CQlzcGVjaWFsIGhvc3QgbWFza2luZyBmb3IgZHJpdmUgc2VsZWN0aW9uCi0gKiBAcXVpcmtwcm9jOgkJY2hlY2sgaG9zdCdzIGRyaXZlIHF1aXJrIGxpc3QKLSAqCi0gKiBAbWRtYV9maWx0ZXI6CWZpbHRlciBNRE1BIG1vZGVzCi0gKiBAdWRtYV9maWx0ZXI6CWZpbHRlciBVRE1BIG1vZGVzCi0gKgotICogQGNhYmxlX2RldGVjdDoJZGV0ZWN0IGNhYmxlIHR5cGUKLSAqLwotc3RydWN0IGlkZV9wb3J0X29wcyB7Ci0Jdm9pZAkoKmluaXRfZGV2KShpZGVfZHJpdmVfdCAqKTsKLQl2b2lkCSgqc2V0X3Bpb19tb2RlKShpZGVfZHJpdmVfdCAqLCBjb25zdCB1OCk7Ci0Jdm9pZAkoKnNldF9kbWFfbW9kZSkoaWRlX2RyaXZlX3QgKiwgY29uc3QgdTgpOwotCXZvaWQJKCpzZWxlY3Rwcm9jKShpZGVfZHJpdmVfdCAqKTsKLQlpbnQJKCpyZXNldF9wb2xsKShpZGVfZHJpdmVfdCAqKTsKLQl2b2lkCSgqcHJlX3Jlc2V0KShpZGVfZHJpdmVfdCAqKTsKLQl2b2lkCSgqcmVzZXRwcm9jKShpZGVfZHJpdmVfdCAqKTsKLQl2b2lkCSgqbWFza3Byb2MpKGlkZV9kcml2ZV90ICosIGludCk7Ci0Jdm9pZAkoKnF1aXJrcHJvYykoaWRlX2RyaXZlX3QgKik7Ci0KLQl1OAkoKm1kbWFfZmlsdGVyKShpZGVfZHJpdmVfdCAqKTsKLQl1OAkoKnVkbWFfZmlsdGVyKShpZGVfZHJpdmVfdCAqKTsKLQotCXU4CSgqY2FibGVfZGV0ZWN0KShzdHJ1Y3QgaHdpZl9zICopOwotfTsKLQotc3RydWN0IGlkZV9kbWFfb3BzIHsKLQl2b2lkCSgqZG1hX2hvc3Rfc2V0KShzdHJ1Y3QgaWRlX2RyaXZlX3MgKiwgaW50KTsKLQlpbnQJKCpkbWFfc2V0dXApKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKLQl2b2lkCSgqZG1hX2V4ZWNfY21kKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKiwgdTgpOwotCXZvaWQJKCpkbWFfc3RhcnQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKLQlpbnQJKCpkbWFfZW5kKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7Ci0JaW50CSgqZG1hX3Rlc3RfaXJxKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7Ci0Jdm9pZAkoKmRtYV9sb3N0X2lycSkoc3RydWN0IGlkZV9kcml2ZV9zICopOwotCXZvaWQJKCpkbWFfdGltZW91dCkoc3RydWN0IGlkZV9kcml2ZV9zICopOwotfTsKLQotc3RydWN0IGlkZV9ob3N0OwotCi10eXBlZGVmIHN0cnVjdCBod2lmX3MgewotCXN0cnVjdCBod2lmX3MgKm5leHQ7CQkvKiBmb3IgbGlua2VkLWxpc3QgaW4gaWRlX2h3Z3JvdXBfdCAqLwotCXN0cnVjdCBod2lmX3MgKm1hdGU7CQkvKiBvdGhlciBod2lmIGZyb20gc2FtZSBQQ0kgY2hpcCAqLwotCXN0cnVjdCBod2dyb3VwX3MgKmh3Z3JvdXA7CS8qIGFjdHVhbGx5IChpZGVfaHdncm91cF90ICopICovCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwkvKiAvcHJvYy9pZGUvIGRpcmVjdG9yeSBlbnRyeSAqLwotCi0Jc3RydWN0IGlkZV9ob3N0ICpob3N0OwotCi0JY2hhciBuYW1lWzZdOwkJCS8qIG5hbWUgb2YgaW50ZXJmYWNlLCBlZy4gImlkZTAiICovCi0KLQlzdHJ1Y3QgaWRlX2lvX3BvcnRzCWlvX3BvcnRzOwotCi0JdW5zaWduZWQgbG9uZwlzYXRhX3NjcltTQVRBX05SX1BPUlRTXTsKLQotCWlkZV9kcml2ZV90CWRyaXZlc1tNQVhfRFJJVkVTXTsJLyogZHJpdmUgaW5mbyAqLwotCi0JdTggbWFqb3I7CS8qIG91ciBtYWpvciBudW1iZXIgKi8KLQl1OCBpbmRleDsJLyogMCBmb3IgaWRlMDsgMSBmb3IgaWRlMTsgLi4uICovCi0JdTggY2hhbm5lbDsJLyogZm9yIGR1YWwtcG9ydCBjaGlwczogMD1wcmltYXJ5LCAxPXNlY29uZGFyeSAqLwotCXU4IGJ1c19zdGF0ZTsJLyogcG93ZXIgc3RhdGUgb2YgdGhlIElERSBidXMgKi8KLQotCXUzMiBob3N0X2ZsYWdzOwotCi0JdTggcGlvX21hc2s7Ci0KLQl1OCB1bHRyYV9tYXNrOwotCXU4IG13ZG1hX21hc2s7Ci0JdTggc3dkbWFfbWFzazsKLQotCXU4IGNibDsJCS8qIGNhYmxlIHR5cGUgKi8KLQotCWh3aWZfY2hpcHNldF90IGNoaXBzZXQ7CS8qIHN1Yi1tb2R1bGUgZm9yIHR1bmluZy4uICovCi0KLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0KLQlpZGVfYWNrX2ludHJfdCAqYWNrX2ludHI7Ci0KLQl2b2lkICgqcndfZGlzaykoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci0KLQljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcwkJKnRwX29wczsKLQljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzCSpwb3J0X29wczsKLQljb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMJKmRtYV9vcHM7Ci0KLQl2b2lkICgqaWRlX2RtYV9jbGVhcl9pcnEpKGlkZV9kcml2ZV90ICpkcml2ZSk7Ci0KLQkvKiBkbWEgcGh5c2ljYWwgcmVnaW9uIGRlc2NyaXB0b3IgdGFibGUgKGNwdSB2aWV3KSAqLwotCXVuc2lnbmVkIGludAkqZG1hdGFibGVfY3B1OwotCS8qIGRtYSBwaHlzaWNhbCByZWdpb24gZGVzY3JpcHRvciB0YWJsZSAoZG1hIHZpZXcpICovCi0JZG1hX2FkZHJfdAlkbWF0YWJsZV9kbWE7Ci0JLyogU2NhdHRlci1nYXRoZXIgbGlzdCB1c2VkIHRvIGJ1aWxkIHRoZSBhYm92ZSAqLwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfdGFibGU7Ci0JaW50IHNnX21heF9uZW50czsJCS8qIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gaXQgKi8KLQlpbnQgc2dfbmVudHM7CQkJLyogQ3VycmVudCBudW1iZXIgb2YgZW50cmllcyBpbiBpdCAqLwotCWludCBzZ19kbWFfZGlyZWN0aW9uOwkJLyogZG1hIHRyYW5zZmVyIGRpcmVjdGlvbiAqLwotCi0JLyogZGF0YSBwaGFzZSBvZiB0aGUgYWN0aXZlIGNvbW1hbmQgKGN1cnJlbnRseSBvbmx5IHZhbGlkIGZvciBQSU8vRE1BKSAqLwotCWludAkJZGF0YV9waGFzZTsKLQotCXVuc2lnbmVkIGludCBuc2VjdDsKLQl1bnNpZ25lZCBpbnQgbmxlZnQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpjdXJzZzsKLQl1bnNpZ25lZCBpbnQgY3Vyc2dfb2ZzOwotCi0JaW50CQlycXNpemU7CQkvKiBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdCAqLwotCWludAkJaXJxOwkJLyogb3VyIGlycSBudW1iZXIgKi8KLQotCXVuc2lnbmVkIGxvbmcJZG1hX2Jhc2U7CS8qIGJhc2UgYWRkciBmb3IgZG1hIHBvcnRzICovCi0KLQl1bnNpZ25lZCBsb25nCWNvbmZpZ19kYXRhOwkvKiBmb3IgdXNlIGJ5IGNoaXBzZXQtc3BlY2lmaWMgY29kZSAqLwotCXVuc2lnbmVkIGxvbmcJc2VsZWN0X2RhdGE7CS8qIGZvciB1c2UgYnkgY2hpcHNldC1zcGVjaWZpYyBjb2RlICovCi0KLQl1bnNpZ25lZCBsb25nCWV4dHJhX2Jhc2U7CS8qIGV4dHJhIGFkZHIgZm9yIGRtYSBwb3J0cyAqLwotCXVuc2lnbmVkCWV4dHJhX3BvcnRzOwkvKiBudW1iZXIgb2YgZXh0cmEgZG1hIHBvcnRzICovCi0KLQl1bnNpZ25lZAlwcmVzZW50ICAgIDogMTsJLyogdGhpcyBpbnRlcmZhY2UgZXhpc3RzICovCi0JdW5zaWduZWQJc2VyaWFsaXplZCA6IDE7CS8qIHNlcmlhbGl6ZWQgYWxsIGNoYW5uZWwgb3BlcmF0aW9uICovCi0JdW5zaWduZWQJc2hhcmluZ19pcnE6IDE7CS8qIDEgPSBzaGFyaW5nIGlycSB3aXRoIGFub3RoZXIgaHdpZiAqLwotCXVuc2lnbmVkCXNnX21hcHBlZCAgOiAxOwkvKiBzZ190YWJsZSBhbmQgc2dfbmVudHMgYXJlIHJlYWR5ICovCi0KLQlzdHJ1Y3QgZGV2aWNlCQlnZW5kZXY7Ci0Jc3RydWN0IGRldmljZQkJKnBvcnRkZXY7Ci0KLQlzdHJ1Y3QgY29tcGxldGlvbiBnZW5kZXZfcmVsX2NvbXA7IC8qIFRvIGRlYWwgd2l0aCBkZXZpY2UgcmVsZWFzZSgpICovCi0KLQl2b2lkCQkqaHdpZl9kYXRhOwkvKiBleHRyYSBod2lmIGRhdGEgKi8KLQotCXVuc2lnbmVkIGRtYTsKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKLQlzdHJ1Y3QgaWRlX2FjcGlfaHdpZl9saW5rICphY3BpZGF0YTsKLSNlbmRpZgotfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wIGlkZV9od2lmX3Q7Ci0KLXN0cnVjdCBpZGVfaG9zdCB7Ci0JaWRlX2h3aWZfdAkqcG9ydHNbTUFYX0hXSUZTXTsKLQl1bnNpZ25lZCBpbnQJbl9wb3J0czsKLQlzdHJ1Y3QgZGV2aWNlCSpkZXZbMl07Ci0JdW5zaWduZWQgbG9uZwlob3N0X2ZsYWdzOwotCXZvaWQJCSpob3N0X3ByaXY7Ci19OwotCi0vKgotICogIGludGVybmFsIGlkZSBpbnRlcnJ1cHQgaGFuZGxlciB0eXBlCi0gKi8KLXR5cGVkZWYgaWRlX3N0YXJ0c3RvcF90IChpZGVfaGFuZGxlcl90KShpZGVfZHJpdmVfdCAqKTsKLXR5cGVkZWYgaW50IChpZGVfZXhwaXJ5X3QpKGlkZV9kcml2ZV90ICopOwotCi0vKiB1c2VkIGJ5IGlkZS1jZCwgaWRlLWZsb3BweSwgZXRjLiAqLwotdHlwZWRlZiB2b2lkICh4ZmVyX2Z1bmNfdCkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKnJxLCB2b2lkICosIHVuc2lnbmVkKTsKLQotdHlwZWRlZiBzdHJ1Y3QgaHdncm91cF9zIHsKLQkJLyogaXJxIGhhbmRsZXIsIGlmIGFjdGl2ZSAqLwotCWlkZV9zdGFydHN0b3BfdAkoKmhhbmRsZXIpKGlkZV9kcml2ZV90ICopOwotCi0JCS8qIEJPT0w6IHByb3RlY3RzIGFsbCBmaWVsZHMgYmVsb3cgKi8KLQl2b2xhdGlsZSBpbnQgYnVzeTsKLQkJLyogQk9PTDogd2FrZSB1cyB1cCBvbiB0aW1lciBleHBpcnkgKi8KLQl1bnNpZ25lZCBpbnQgc2xlZXBpbmcJOiAxOwotCQkvKiBCT09MOiBwb2xsaW5nIGFjdGl2ZSAmIHBvbGxfdGltZW91dCBmaWVsZCB2YWxpZCAqLwotCXVuc2lnbmVkIGludCBwb2xsaW5nCTogMTsKLQotCQkvKiBjdXJyZW50IGRyaXZlICovCi0JaWRlX2RyaXZlX3QgKmRyaXZlOwotCQkvKiBwdHIgdG8gY3VycmVudCBod2lmIGluIGxpbmtlZC1saXN0ICovCi0JaWRlX2h3aWZfdCAqaHdpZjsKLQotCQkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJLyogZmFpbHNhZmUgdGltZXIgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQkJLyogdGltZW91dCB2YWx1ZSBkdXJpbmcgbG9uZyBwb2xscyAqLwotCXVuc2lnbmVkIGxvbmcgcG9sbF90aW1lb3V0OwotCQkvKiBxdWVyaWVkIHVwb24gdGltZW91dHMgKi8KLQlpbnQgKCpleHBpcnkpKGlkZV9kcml2ZV90ICopOwotCi0JaW50IHJlcV9nZW47Ci0JaW50IHJlcV9nZW5fdGltZXI7Ci19IGlkZV9od2dyb3VwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGlkZV9kcml2ZXJfcyBpZGVfZHJpdmVyX3Q7Ci0KLWV4dGVybiBzdHJ1Y3QgbXV0ZXggaWRlX3NldHRpbmdfbXR4OwotCi1pbnQgc2V0X2lvXzMyYml0KGlkZV9kcml2ZV90ICosIGludCk7Ci1pbnQgc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICosIGludCk7Ci1pbnQgc2V0X3VzaW5nX2RtYShpZGVfZHJpdmVfdCAqLCBpbnQpOwotCi0vKiBBVEFQSSBwYWNrZXQgY29tbWFuZCBmbGFncyAqLwotZW51bSB7Ci0JLyogc2V0IHdoZW4gYW4gZXJyb3IgaXMgY29uc2lkZXJlZCBub3JtYWwgLSBubyByZXRyeSAoaWRlLXRhcGUpICovCi0JUENfRkxBR19BQk9SVAkJCT0gKDEgPDwgMCksCi0JUENfRkxBR19TVVBQUkVTU19FUlJPUgkJPSAoMSA8PCAxKSwKLQlQQ19GTEFHX1dBSVRfRk9SX0RTQwkJPSAoMSA8PCAyKSwKLQlQQ19GTEFHX0RNQV9PSwkJCT0gKDEgPDwgMyksCi0JUENfRkxBR19ETUFfSU5fUFJPR1JFU1MJCT0gKDEgPDwgNCksCi0JUENfRkxBR19ETUFfRVJST1IJCT0gKDEgPDwgNSksCi0JUENfRkxBR19XUklUSU5HCQkJPSAoMSA8PCA2KSwKLQkvKiBjb21tYW5kIHRpbWVkIG91dCAqLwotCVBDX0ZMQUdfVElNRURPVVQJCT0gKDEgPDwgNyksCi19OwotCi1zdHJ1Y3QgaWRlX2F0YXBpX3BjIHsKLQkvKiBhY3R1YWwgcGFja2V0IGJ5dGVzICovCi0JdTggY1sxMl07Ci0JLyogaW5jcmVtZW50ZWQgb24gZWFjaCByZXRyeSAqLwotCWludCByZXRyaWVzOwotCWludCBlcnJvcjsKLQotCS8qIGJ5dGVzIHRvIHRyYW5zZmVyICovCi0JaW50IHJlcV94ZmVyOwotCS8qIGJ5dGVzIGFjdHVhbGx5IHRyYW5zZmVycmVkICovCi0JaW50IHhmZXJyZWQ7Ci0KLQkvKiBkYXRhIGJ1ZmZlciAqLwotCXU4ICpidWY7Ci0JLyogY3VycmVudCBidWZmZXIgcG9zaXRpb24gKi8KLQl1OCAqY3VyX3BvczsKLQlpbnQgYnVmX3NpemU7Ci0JLyogbWlzc2luZy9hdmFpbGFibGUgZGF0YSBvbiB0aGUgY3VycmVudCBidWZmZXIgKi8KLQlpbnQgYl9jb3VudDsKLQotCS8qIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QgKi8KLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiB0aG9zZSBhcmUgbW9yZSBvciBsZXNzIGRyaXZlci1zcGVjaWZpYyBhbmQgc29tZSBvZiB0aGVtIGFyZSBzdWJqZWN0Ci0JICogdG8gY2hhbmdlL3JlbW92YWwgbGF0ZXIuCi0JICovCi0JdTggcGNfYnVmWzI1Nl07Ci0KLQkvKiBpZGV0YXBlIG9ubHkgKi8KLQlzdHJ1Y3QgaWRldGFwZV9iaCAqYmg7Ci0JY2hhciAqYl9kYXRhOwotCi0JLyogaWRlc2NzaSBvbmx5IGZvciBub3cgKi8KLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXVuc2lnbmVkIGludCBzZ19jbnQ7Ci0KLQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZDsKLQl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci0KLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci19OwotCi0jaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCi0vKgotICogY29uZmlndXJhYmxlIGRyaXZlIHNldHRpbmdzCi0gKi8KLQotI2RlZmluZSBUWVBFX0lOVAkwCi0jZGVmaW5lIFRZUEVfQllURQkxCi0jZGVmaW5lIFRZUEVfU0hPUlQJMgotCi0jZGVmaW5lIFNFVFRJTkdfUkVBRAkoMSA8PCAwKQotI2RlZmluZSBTRVRUSU5HX1dSSVRFCSgxIDw8IDEpCi0jZGVmaW5lIFNFVFRJTkdfUlcJKFNFVFRJTkdfUkVBRCB8IFNFVFRJTkdfV1JJVEUpCi0KLXR5cGVkZWYgaW50IChpZGVfcHJvY3NldF90KShpZGVfZHJpdmVfdCAqLCBpbnQpOwotdHlwZWRlZiBzdHJ1Y3QgaWRlX3NldHRpbmdzX3MgewotCWNoYXIJCQkqbmFtZTsKLQlpbnQJCQlydzsKLQlpbnQJCQlkYXRhX3R5cGU7Ci0JaW50CQkJbWluOwotCWludAkJCW1heDsKLQlpbnQJCQltdWxfZmFjdG9yOwotCWludAkJCWRpdl9mYWN0b3I7Ci0Jdm9pZAkJCSpkYXRhOwotCWlkZV9wcm9jc2V0X3QJCSpzZXQ7Ci0JaW50CQkJYXV0b19yZW1vdmU7Ci0Jc3RydWN0IGlkZV9zZXR0aW5nc19zCSpuZXh0OwotfSBpZGVfc2V0dGluZ3NfdDsKLQotaW50IGlkZV9hZGRfc2V0dGluZyhpZGVfZHJpdmVfdCAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIHZvaWQgKiwgaWRlX3Byb2NzZXRfdCAqc2V0KTsKLQotLyoKLSAqIC9wcm9jL2lkZSBpbnRlcmZhY2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JbW9kZV90CQltb2RlOwotCXJlYWRfcHJvY190CSpyZWFkX3Byb2M7Ci0Jd3JpdGVfcHJvY190CSp3cml0ZV9wcm9jOwotfSBpZGVfcHJvY19lbnRyeV90OwotCi12b2lkIHByb2NfaWRlX2NyZWF0ZSh2b2lkKTsKLXZvaWQgcHJvY19pZGVfZGVzdHJveSh2b2lkKTsKLXZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfcHJvY19wb3J0X3JlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kZXZpY2UoaWRlX2RyaXZlX3QgKik7Ci12b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICopOwotdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOwotdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqLCBpZGVfZHJpdmVyX3QgKik7Ci0KLXZvaWQgaWRlX2FkZF9nZW5lcmljX3NldHRpbmdzKGlkZV9kcml2ZV90ICopOwotCi1yZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2NhcGFjaXR5OwotcmVhZF9wcm9jX3QgcHJvY19pZGVfcmVhZF9nZW9tZXRyeTsKLQotLyoKLSAqIFN0YW5kYXJkIGV4aXQgc3R1ZmY6Ci0gKi8KLSNkZWZpbmUgUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbikgXAotewkJCQkJXAotCWxlbiAtPSBvZmY7CQkJXAotCWlmIChsZW4gPCBjb3VudCkgewkJXAotCQkqZW9mID0gMTsJCVwKLQkJaWYgKGxlbiA8PSAwKQkJXAotCQkJcmV0dXJuIDA7CVwKLQl9IGVsc2UJCQkJXAotCQlsZW4gPSBjb3VudDsJCVwKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwkJXAotCXJldHVybiBsZW47CQkJXAotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jX2lkZV9jcmVhdGUodm9pZCkgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jX2lkZV9kZXN0cm95KHZvaWQpIHsgOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICpod2lmKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQotc3RhdGljIGlubGluZSB2b2lkIGlkZV9hZGRfZ2VuZXJpY19zZXR0aW5ncyhpZGVfZHJpdmVfdCAqZHJpdmUpIHsgOyB9Ci0jZGVmaW5lIFBST0NfSURFX1JFQURfUkVUVVJOKHBhZ2Usc3RhcnQsb2ZmLGNvdW50LGVvZixsZW4pIHJldHVybiAwOwotI2VuZGlmCi0KLS8qCi0gKiBQb3dlciBNYW5hZ2VtZW50IHN0ZXAgdmFsdWUgKHJxLT5wbS0+cG1fc3RlcCkuCi0gKgotICogVGhlIHN0ZXAgdmFsdWUgc3RhcnRzIGF0IDAgKGlkZV9wbV9zdGF0ZV9zdGFydF9zdXNwZW5kKSBmb3IgYQotICogc3VzcGVuZCBvcGVyYXRpb24gb3IgMTAwMCAoaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZSkgZm9yIGEKLSAqIHJlc3VtZSBvcGVyYXRpb24uCi0gKgotICogRm9yIGVhY2ggc3RlcCwgdGhlIGNvcmUgY2FsbHMgdGhlIHN1YmRyaXZlciBzdGFydF9wb3dlcl9zdGVwKCkgZmlyc3QuCi0gKiBUaGlzIGNhbiByZXR1cm46Ci0gKgktIGlkZV9zdG9wcGVkIDoJSW4gdGhpcyBjYXNlLCB0aGUgY29yZSBjYWxscyB1cyBiYWNrIGFnYWluIHVubGVzcwotICoJCQlzdGVwIGhhdmUgYmVlbiBzZXQgdG8gaWRlX3Bvd2VyX3N0YXRlX2NvbXBsZXRlZC4KLSAqCS0gaWRlX3N0YXJ0ZWQgOglJbiB0aGlzIGNhc2UsIHRoZSBjaGFubmVsIGlzIGxlZnQgYnVzeSB1bnRpbCBhbgotICoJCQlhc3luYyBldmVudCAoaW50ZXJydXB0KSBvY2N1cnMuCi0gKiBUeXBpY2FsbHksIHN0YXJ0X3Bvd2VyX3N0ZXAoKSB3aWxsIGlzc3VlIGEgdGFza2ZpbGUgcmVxdWVzdCB3aXRoCi0gKiBkb19yd190YXNrZmlsZSgpLgotICoKLSAqIFVwb24gcmVjZXB0aW9uIG9mIHRoZSBpbnRlcnJ1cHQsIHRoZSBjb3JlIHdpbGwgY2FsbCBjb21wbGV0ZV9wb3dlcl9zdGVwKCkKLSAqIHdpdGggdGhlIGVycm9yIGNvZGUgaWYgYW55LiBUaGlzIHJvdXRpbmUgc2hvdWxkIHVwZGF0ZSB0aGUgc3RlcCB2YWx1ZQotICogYW5kIHJldHVybi4gSXQgc2hvdWxkIG5vdCBzdGFydCBhIG5ldyByZXF1ZXN0LiBUaGUgY29yZSB3aWxsIGNhbGwKLSAqIHN0YXJ0X3Bvd2VyX3N0ZXAgZm9yIHRoZSBuZXcgc3RlcCB2YWx1ZSwgdW5sZXNzIHN0ZXAgaGF2ZSBiZWVuIHNldCB0bwotICogaWRlX3Bvd2VyX3N0YXRlX2NvbXBsZXRlZC4KLSAqCi0gKiBTdWJkcml2ZXJzIGFyZSBleHBlY3RlZCB0byBkZWZpbmUgdGhlaXIgb3duIGFkZGl0aW9uYWwgcG93ZXIKLSAqIHN0ZXBzIGZyb20gMS4uOTk5IGZvciBzdXNwZW5kIGFuZCBmcm9tIDEwMDEuLjE5OTkgZm9yIHJlc3VtZSwKLSAqIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gKi8KLQotZW51bSB7Ci0JaWRlX3BtX3N0YXRlX2NvbXBsZXRlZAkJPSAtMSwKLQlpZGVfcG1fc3RhdGVfc3RhcnRfc3VzcGVuZAk9IDAsCi0JaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZQk9IDEwMDAsCi19OwotCi0vKgotICogU3ViZHJpdmVycyBzdXBwb3J0LgotICoKLSAqIFRoZSBnZW5kcml2ZXIub3duZXIgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgbW9kdWxlIG93bmVyIG9mIHRoaXMgZHJpdmVyLgotICogVGhlIGdlbmRyaXZlci5uYW1lIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIKLSAqLwotc3RydWN0IGlkZV9kcml2ZXJfcyB7Ci0JY29uc3QgY2hhcgkJCSp2ZXJzaW9uOwotCXU4CQkJCW1lZGlhOwotCXVuc2lnbmVkIHN1cHBvcnRzX2RzY19vdmVybGFwCTogMTsKLQlpZGVfc3RhcnRzdG9wX3QJKCpkb19yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzZWN0b3JfdCk7Ci0JaW50CQkoKmVuZF9yZXF1ZXN0KShpZGVfZHJpdmVfdCAqLCBpbnQsIGludCk7Ci0JaWRlX3N0YXJ0c3RvcF90CSgqZXJyb3IpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdTgsIHU4KTsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglnZW5fZHJpdmVyOwotCWludAkJKCpwcm9iZSkoaWRlX2RyaXZlX3QgKik7Ci0Jdm9pZAkJKCpyZW1vdmUpKGlkZV9kcml2ZV90ICopOwotCXZvaWQJCSgqcmVzdW1lKShpZGVfZHJpdmVfdCAqKTsKLQl2b2lkCQkoKnNodXRkb3duKShpZGVfZHJpdmVfdCAqKTsKLSNpZmRlZiBDT05GSUdfSURFX1BST0NfRlMKLQlpZGVfcHJvY19lbnRyeV90CSpwcm9jOwotI2VuZGlmCi19OwotCi0jZGVmaW5lIHRvX2lkZV9kcml2ZXIoZHJ2KSBjb250YWluZXJfb2YoZHJ2LCBpZGVfZHJpdmVyX3QsIGdlbl9kcml2ZXIpCi0KLWludCBpZGVfZGV2aWNlX2dldChpZGVfZHJpdmVfdCAqKTsKLXZvaWQgaWRlX2RldmljZV9wdXQoaWRlX2RyaXZlX3QgKik7Ci0KLWludCBnZW5lcmljX2lkZV9pb2N0bChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKLQotZXh0ZXJuIGludCBpZGVfdmxiX2NsazsKLWV4dGVybiBpbnQgaWRlX3BjaV9jbGs7Ci0KLWV4dGVybiBpbnQgaWRlX2VuZF9yZXF1ZXN0IChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSwgaW50IG5yc2Vjcyk7Ci1pbnQgaWRlX2VuZF9kZXF1ZXVlZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLAotCQkJICAgICBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKTsKLQotZXh0ZXJuIHZvaWQgaWRlX3NldF9oYW5kbGVyIChpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9oYW5kbGVyX3QgKmhhbmRsZXIsIHVuc2lnbmVkIGludCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSk7Ci0KLXZvaWQgaWRlX2V4ZWN1dGVfY29tbWFuZChpZGVfZHJpdmVfdCAqLCB1OCwgaWRlX2hhbmRsZXJfdCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgaWRlX2V4cGlyeV90ICopOwotCi12b2lkIGlkZV9leGVjdXRlX3BrdF9jbWQoaWRlX2RyaXZlX3QgKik7Ci0KLXZvaWQgaWRlX3BhZF90cmFuc2ZlcihpZGVfZHJpdmVfdCAqLCBpbnQsIGludCk7Ci0KLWlkZV9zdGFydHN0b3BfdCBfX2lkZV9lcnJvcihpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB1OCwgdTgpOwotCi1pZGVfc3RhcnRzdG9wX3QgaWRlX2Vycm9yIChpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IGNoYXIgKm1zZywgYnl0ZSBzdGF0KTsKLQotZXh0ZXJuIHZvaWQgaWRlX2ZpeF9kcml2ZWlkKHN0cnVjdCBoZF9kcml2ZWlkICopOwotCi1leHRlcm4gdm9pZCBpZGVfZml4c3RyaW5nKHU4ICosIGNvbnN0IGludCwgY29uc3QgaW50KTsKLQotaW50IGlkZV93YWl0X3N0YXQoaWRlX3N0YXJ0c3RvcF90ICosIGlkZV9kcml2ZV90ICosIHU4LCB1OCwgdW5zaWduZWQgbG9uZyk7Ci0KLWV4dGVybiBpZGVfc3RhcnRzdG9wX3QgaWRlX2RvX3Jlc2V0IChpZGVfZHJpdmVfdCAqKTsKLQotZXh0ZXJuIHZvaWQgaWRlX2RvX2RyaXZlX2NtZChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLQotZXh0ZXJuIHZvaWQgaWRlX2VuZF9kcml2ZV9jbWQoaWRlX2RyaXZlX3QgKiwgdTgsIHU4KTsKLQogZW51bSB7CiAJSURFX1RGTEFHX0xCQTQ4CQkJPSAoMSA8PCAwKSwKIAlJREVfVEZMQUdfRkxBR0dFRAkJPSAoMSA8PCAyKSwKQEAgLTEwMzQsNiArMzg4LDgwMCBAQAogCXZvaWQJCQkqc3BlY2lhbDsJLyogdmFsaWRfdCBnZW5lcmFsbHkgKi8KIH0gaWRlX3Rhc2tfdDsKIAorLyogQVRBUEkgcGFja2V0IGNvbW1hbmQgZmxhZ3MgKi8KK2VudW0geworCS8qIHNldCB3aGVuIGFuIGVycm9yIGlzIGNvbnNpZGVyZWQgbm9ybWFsIC0gbm8gcmV0cnkgKGlkZS10YXBlKSAqLworCVBDX0ZMQUdfQUJPUlQJCQk9ICgxIDw8IDApLAorCVBDX0ZMQUdfU1VQUFJFU1NfRVJST1IJCT0gKDEgPDwgMSksCisJUENfRkxBR19XQUlUX0ZPUl9EU0MJCT0gKDEgPDwgMiksCisJUENfRkxBR19ETUFfT0sJCQk9ICgxIDw8IDMpLAorCVBDX0ZMQUdfRE1BX0lOX1BST0dSRVNTCQk9ICgxIDw8IDQpLAorCVBDX0ZMQUdfRE1BX0VSUk9SCQk9ICgxIDw8IDUpLAorCVBDX0ZMQUdfV1JJVElORwkJCT0gKDEgPDwgNiksCisJLyogY29tbWFuZCB0aW1lZCBvdXQgKi8KKwlQQ19GTEFHX1RJTUVET1VUCQk9ICgxIDw8IDcpLAorfTsKKworLyoKKyAqIFdpdGggZWFjaCBwYWNrZXQgY29tbWFuZCwgd2UgYWxsb2NhdGUgYSBidWZmZXIgb2YgSURFX1BDX0JVRkZFUl9TSVpFIGJ5dGVzLgorICogVGhpcyBpcyB1c2VkIGZvciBzZXZlcmFsIHBhY2tldCBjb21tYW5kcyAobm90IGZvciBSRUFEL1dSSVRFIGNvbW1hbmRzKS4KKyAqLworI2RlZmluZSBJREVfUENfQlVGRkVSX1NJWkUJMjU2CisKK3N0cnVjdCBpZGVfYXRhcGlfcGMgeworCS8qIGFjdHVhbCBwYWNrZXQgYnl0ZXMgKi8KKwl1OCBjWzEyXTsKKwkvKiBpbmNyZW1lbnRlZCBvbiBlYWNoIHJldHJ5ICovCisJaW50IHJldHJpZXM7CisJaW50IGVycm9yOworCisJLyogYnl0ZXMgdG8gdHJhbnNmZXIgKi8KKwlpbnQgcmVxX3hmZXI7CisJLyogYnl0ZXMgYWN0dWFsbHkgdHJhbnNmZXJyZWQgKi8KKwlpbnQgeGZlcnJlZDsKKworCS8qIGRhdGEgYnVmZmVyICovCisJdTggKmJ1ZjsKKwkvKiBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbiAqLworCXU4ICpjdXJfcG9zOworCWludCBidWZfc2l6ZTsKKwkvKiBtaXNzaW5nL2F2YWlsYWJsZSBkYXRhIG9uIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCWludCBiX2NvdW50OworCisJLyogdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdCAqLworCXN0cnVjdCByZXF1ZXN0ICpycTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIHRob3NlIGFyZSBtb3JlIG9yIGxlc3MgZHJpdmVyLXNwZWNpZmljIGFuZCBzb21lIG9mIHRoZW0gYXJlIHN1YmplY3QKKwkgKiB0byBjaGFuZ2UvcmVtb3ZhbCBsYXRlci4KKwkgKi8KKwl1OCBwY19idWZbSURFX1BDX0JVRkZFUl9TSVpFXTsKKworCS8qIGlkZXRhcGUgb25seSAqLworCXN0cnVjdCBpZGV0YXBlX2JoICpiaDsKKwljaGFyICpiX2RhdGE7CisKKwkvKiBpZGVzY3NpIG9ubHkgZm9yIG5vdyAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IHNnX2NudDsKKworCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21kOworCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKKworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKK307CisKK3N0cnVjdCBpZGVfZGV2c2V0Oworc3RydWN0IGlkZV9kcml2ZXJfczsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKK3N0cnVjdCBpZGVfYWNwaV9kcml2ZV9saW5rOworc3RydWN0IGlkZV9hY3BpX2h3aWZfbGluazsKKyNlbmRpZgorCisvKiBBVEFQSSBkZXZpY2UgZmxhZ3MgKi8KK2VudW0geworCUlERV9BRkxBR19EUlFfSU5URVJSVVBUCQk9ICgxIDw8IDApLAorCUlERV9BRkxBR19NRURJQV9DSEFOR0VECQk9ICgxIDw8IDEpLAorCS8qIERyaXZlIGNhbm5vdCBsb2NrIHRoZSBkb29yLiAqLworCUlERV9BRkxBR19OT19ET09STE9DSwkJPSAoMSA8PCAyKSwKKworCS8qIGlkZS1jZCAqLworCS8qIERyaXZlIGNhbm5vdCBlamVjdCB0aGUgZGlzYy4gKi8KKwlJREVfQUZMQUdfTk9fRUpFQ1QJCT0gKDEgPDwgMyksCisJLyogRHJpdmUgaXMgYSBwcmUgQVRBUEkgMS4yIGRyaXZlLiAqLworCUlERV9BRkxBR19QUkVfQVRBUEkxMgkJPSAoMSA8PCA0KSwKKwkvKiBUT0MgYWRkcmVzc2VzIGFyZSBpbiBCQ0QuICovCisJSURFX0FGTEFHX1RPQ0FERFJfQVNfQkNECT0gKDEgPDwgNSksCisJLyogVE9DIHRyYWNrIG51bWJlcnMgYXJlIGluIEJDRC4gKi8KKwlJREVfQUZMQUdfVE9DVFJBQ0tTX0FTX0JDRAk9ICgxIDw8IDYpLAorCS8qCisJICogRHJpdmUgZG9lcyBub3QgcHJvdmlkZSBkYXRhIGluIG11bHRpcGxlcyBvZiBTRUNUT1JfU0laRQorCSAqIHdoZW4gbW9yZSB0aGFuIG9uZSBpbnRlcnJ1cHQgaXMgbmVlZGVkLgorCSAqLworCUlERV9BRkxBR19MSU1JVF9ORlJBTUVTCQk9ICgxIDw8IDcpLAorCS8qIFNlZWtpbmcgaW4gcHJvZ3Jlc3MuICovCisJSURFX0FGTEFHX1NFRUtJTkcJCT0gKDEgPDwgOCksCisJLyogU2F2ZWQgVE9DIGluZm9ybWF0aW9uIGlzIGN1cnJlbnQuICovCisJSURFX0FGTEFHX1RPQ19WQUxJRAkJPSAoMSA8PCA5KSwKKwkvKiBXZSB0aGluayB0aGF0IHRoZSBkcml2ZSBkb29yIGlzIGxvY2tlZC4gKi8KKwlJREVfQUZMQUdfRE9PUl9MT0NLRUQJCT0gKDEgPDwgMTApLAorCS8qIFNFVF9DRF9TUEVFRCBjb21tYW5kIGlzIHVuc3VwcG9ydGVkLiAqLworCUlERV9BRkxBR19OT19TUEVFRF9TRUxFQ1QJPSAoMSA8PCAxMSksCisJSURFX0FGTEFHX1ZFUlRPU18zMDBfU1NECT0gKDEgPDwgMTIpLAorCUlERV9BRkxBR19WRVJUT1NfNjAwX0VTRAk9ICgxIDw8IDEzKSwKKwlJREVfQUZMQUdfU0FOWU9fM0NECQk9ICgxIDw8IDE0KSwKKwlJREVfQUZMQUdfRlVMTF9DQVBTX1BBR0UJPSAoMSA8PCAxNSksCisJSURFX0FGTEFHX1BMQVlfQVVESU9fT0sJCT0gKDEgPDwgMTYpLAorCUlERV9BRkxBR19MRV9TUEVFRF9GSUVMRFMJPSAoMSA8PCAxNyksCisKKwkvKiBpZGUtZmxvcHB5ICovCisJLyogRm9ybWF0IGluIHByb2dyZXNzICovCisJSURFX0FGTEFHX0ZPUk1BVF9JTl9QUk9HUkVTUwk9ICgxIDw8IDE4KSwKKwkvKiBBdm9pZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkIGluIENsaWsgZHJpdmUgKi8KKwlJREVfQUZMQUdfQ0xJS19EUklWRQkJPSAoMSA8PCAxOSksCisJLyogUmVxdWlyZXMgQkggYWxnb3JpdGhtIGZvciBwYWNrZXRzICovCisJSURFX0FGTEFHX1pJUF9EUklWRQkJPSAoMSA8PCAyMCksCisJLyogV3JpdGUgcHJvdGVjdCAqLworCUlERV9BRkxBR19XUAkJCT0gKDEgPDwgMjEpLAorCS8qIFN1cHBvcnRzIGZvcm1hdCBwcm9ncmVzcyByZXBvcnQgKi8KKwlJREVfQUZMQUdfU1JGUAkJCT0gKDEgPDwgMjIpLAorCisJLyogaWRlLXRhcGUgKi8KKwlJREVfQUZMQUdfSUdOT1JFX0RTQwkJPSAoMSA8PCAyMyksCisJLyogMCBXaGVuIHRoZSB0YXBlIHBvc2l0aW9uIGlzIHVua25vd24gKi8KKwlJREVfQUZMQUdfQUREUkVTU19WQUxJRAkJPSAoMSA8PAkyNCksCisJLyogRGV2aWNlIGFscmVhZHkgb3BlbmVkICovCisJSURFX0FGTEFHX0JVU1kJCQk9ICgxIDw8IDI1KSwKKwkvKiBBdHRlbXB0IHRvIGF1dG8tZGV0ZWN0IHRoZSBjdXJyZW50IHVzZXIgYmxvY2sgc2l6ZSAqLworCUlERV9BRkxBR19ERVRFQ1RfQlMJCT0gKDEgPDwgMjYpLAorCS8qIEN1cnJlbnRseSBvbiBhIGZpbGVtYXJrICovCisJSURFX0FGTEFHX0ZJTEVNQVJLCQk9ICgxIDw8IDI3KSwKKwkvKiAwID0gbm8gdGFwZSBpcyBsb2FkZWQsIHNvIHdlIGRvbid0IHJld2luZCBhZnRlciBlamVjdGluZyAqLworCUlERV9BRkxBR19NRURJVU1fUFJFU0VOVAk9ICgxIDw8IDI4KSwKKworCUlERV9BRkxBR19OT19BVVRPQ0xPU0UJCT0gKDEgPDwgMjkpLAorfTsKKworLyogZGV2aWNlIGZsYWdzICovCitlbnVtIHsKKwkvKiByZXN0b3JlIHNldHRpbmdzIGFmdGVyIGRldmljZSByZXNldCAqLworCUlERV9ERkxBR19LRUVQX1NFVFRJTkdTCQk9ICgxIDw8IDApLAorCS8qIGRldmljZSBpcyB1c2luZyBETUEgZm9yIHJlYWQvd3JpdGUgKi8KKwlJREVfREZMQUdfVVNJTkdfRE1BCQk9ICgxIDw8IDEpLAorCS8qIG9rYXkgdG8gdW5tYXNrIG90aGVyIElSUXMgKi8KKwlJREVfREZMQUdfVU5NQVNLCQk9ICgxIDw8IDIpLAorCS8qIGRvbid0IGF0dGVtcHQgZmx1c2hlcyAqLworCUlERV9ERkxBR19OT0ZMVVNICQk9ICgxIDw8IDMpLAorCS8qIERTQyBvdmVybGFwICovCisJSURFX0RGTEFHX0RTQ19PVkVSTEFQCQk9ICgxIDw8IDQpLAorCS8qIGdpdmUgcG90ZW50aWFsIGV4Y2VzcyBiYW5kd2lkdGggKi8KKwlJREVfREZMQUdfTklDRTEJCQk9ICgxIDw8IDUpLAorCS8qIGRldmljZSBpcyBwaHlzaWNhbGx5IHByZXNlbnQgKi8KKwlJREVfREZMQUdfUFJFU0VOVAkJPSAoMSA8PCA2KSwKKwkvKiBkZXZpY2UgZWplY3RlZCBoaW50ICovCisJSURFX0RGTEFHX0RFQUQJCQk9ICgxIDw8IDcpLAorCS8qIGlkIHJlYWQgZnJvbSBkZXZpY2UgKHN5bnRoZXRpYyBpZiBub3Qgc2V0KSAqLworCUlERV9ERkxBR19JRF9SRUFECQk9ICgxIDw8IDgpLAorCUlERV9ERkxBR19OT1BST0JFCQk9ICgxIDw8IDkpLAorCS8qIG5lZWQgdG8gZG8gY2hlY2tfbWVkaWFfY2hhbmdlKCkgKi8KKwlJREVfREZMQUdfUkVNT1ZBQkxFCQk9ICgxIDw8IDEwKSwKKwkvKiBuZWVkZWQgZm9yIHJlbW92YWJsZSBkZXZpY2VzICovCisJSURFX0RGTEFHX0FUVEFDSAkJPSAoMSA8PCAxMSksCisJSURFX0RGTEFHX0ZPUkNFRF9HRU9NCQk9ICgxIDw8IDEyKSwKKwkvKiBkaXNhbGxvdyBzZXR0aW5nIHVubWFzayBiaXQgKi8KKwlJREVfREZMQUdfTk9fVU5NQVNLCQk9ICgxIDw8IDEzKSwKKwkvKiBkaXNhbGxvdyBlbmFibGluZyAzMi1iaXQgSS9PICovCisJSURFX0RGTEFHX05PX0lPXzMyQklUCQk9ICgxIDw8IDE0KSwKKwkvKiBmb3IgcmVtb3ZhYmxlIG9ubHk6IGRvb3IgbG9jay91bmxvY2sgd29ya3MgKi8KKwlJREVfREZMQUdfRE9PUkxPQ0tJTkcJCT0gKDEgPDwgMTUpLAorCS8qIGRpc2FsbG93IERNQSAqLworCUlERV9ERkxBR19OT0RNQQkJCT0gKDEgPDwgMTYpLAorCS8qIHBvd2VybWFuYWdtZW50IHRvbGQgdXMgbm90IHRvIGRvIGFueXRoaW5nLCBzbyBzbGVlcCBuaWNlbHkgKi8KKwlJREVfREZMQUdfQkxPQ0tFRAkJPSAoMSA8PCAxNyksCisJLyogaWRlLXNjc2kgZW11bGF0aW9uICovCisJSURFX0RGTEFHX1NDU0kJCQk9ICgxIDw8IDE4KSwKKwkvKiBzbGVlcGluZyAmIHNsZWVwIGZpZWxkIHZhbGlkICovCisJSURFX0RGTEFHX1NMRUVQSU5HCQk9ICgxIDw8IDE5KSwKKwlJREVfREZMQUdfUE9TVF9SRVNFVAkJPSAoMSA8PCAyMCksCisJSURFX0RGTEFHX1VETUEzM19XQVJORUQJCT0gKDEgPDwgMjEpLAorCUlERV9ERkxBR19MQkE0OAkJCT0gKDEgPDwgMjIpLAorCS8qIHN0YXR1cyBvZiB3cml0ZSBjYWNoZSAqLworCUlERV9ERkxBR19XQ0FDSEUJCT0gKDEgPDwgMjMpLAorCS8qIHVzZWQgZm9yIGlnbm9yaW5nIEFUQV9ERiAqLworCUlERV9ERkxBR19OT1dFUlIJCT0gKDEgPDwgMjQpLAorCS8qIHJldHJ5aW5nIGluIFBJTyAqLworCUlERV9ERkxBR19ETUFfUElPX1JFVFJZCQk9ICgxIDw8IDI1KSwKKwlJREVfREZMQUdfTEJBCQkJPSAoMSA8PCAyNiksCisJLyogZG9uJ3QgdW5sb2FkIGhlYWRzICovCisJSURFX0RGTEFHX05PX1VOTE9BRAkJPSAoMSA8PCAyNyksCisJLyogaGVhZHMgdW5sb2FkZWQsIHBsZWFzZSBkb24ndCByZXNldCBwb3J0ICovCisJSURFX0RGTEFHX1BBUktFRAkJPSAoMSA8PCAyOCkKK307CisKK3N0cnVjdCBpZGVfZHJpdmVfcyB7CisJY2hhcgkJbmFtZVs0XTsJLyogZHJpdmUgbmFtZSwgc3VjaCBhcyAiaGRhIiAqLworICAgICAgICBjaGFyICAgICAgICAgICAgZHJpdmVyX3JlcVsxMF07CS8qIHJlcXVlc3RzIHNwZWNpZmljIGRyaXZlciAqLworCisJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCisKKwlzdHJ1Y3QgcmVxdWVzdAkJKnJxOwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KKwlzdHJ1Y3QgaWRlX2RyaXZlX3MgCSpuZXh0OwkvKiBjaXJjdWxhciBsaXN0IG9mIGh3Z3JvdXAgZHJpdmVzICovCisJdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBleHRyYSBkcml2ZXIgZGF0YSAqLworCXUxNgkJCSppZDsJLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLworI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsJLyogL3Byb2MvaWRlLyBkaXJlY3RvcnkgZW50cnkgKi8KKwljb25zdCBzdHJ1Y3QgaWRlX3Byb2NfZGV2c2V0ICpzZXR0aW5nczsgLyogL3Byb2MvaWRlLyBkcml2ZSBzZXR0aW5ncyAqLworI2VuZGlmCisJc3RydWN0IGh3aWZfcwkJKmh3aWY7CS8qIGFjdHVhbGx5IChpZGVfaHdpZl90ICopICovCisKKwl1bnNpZ25lZCBsb25nIGRldl9mbGFnczsKKworCXVuc2lnbmVkIGxvbmcgc2xlZXA7CQkvKiBzbGVlcCB1bnRpbCB0aGlzIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIHNlcnZpY2Vfc3RhcnQ7CS8qIHRpbWUgd2Ugc3RhcnRlZCBsYXN0IHJlcXVlc3QgKi8KKwl1bnNpZ25lZCBsb25nIHNlcnZpY2VfdGltZTsJLyogc2VydmljZSB0aW1lIG9mIGxhc3QgcmVxdWVzdCAqLworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsJCS8qIG1heCB0aW1lIHRvIHdhaXQgZm9yIGlycSAqLworCisJc3BlY2lhbF90CXNwZWNpYWw7CS8qIHNwZWNpYWwgYWN0aW9uIGZsYWdzICovCisKKwl1OAlzZWxlY3Q7CQkJLyogYmFzaWMgZHJpdmUvaGVhZCBzZWxlY3QgcmVnIHZhbHVlICovCisJdTgJcmV0cnlfcGlvOwkJLyogcmV0cnlpbmcgZG1hIGNhcGFibGUgaG9zdCBpbiBwaW8gKi8KKwl1OAl3YWl0aW5nX2Zvcl9kbWE7CS8qIGRtYSBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KKwl1OAlkbWE7CQkJLyogYXRhcGkgZG1hIGZsYWcgKi8KKworICAgICAgICB1OAlxdWlya19saXN0OwkvKiBjb25zaWRlcmVkIHF1aXJreSwgc2V0IGZvciBhIHNwZWNpZmljIGhvc3QgKi8KKyAgICAgICAgdTgJaW5pdF9zcGVlZDsJLyogdHJhbnNmZXIgcmF0ZSBzZXQgYXQgYm9vdCAqLworICAgICAgICB1OAljdXJyZW50X3NwZWVkOwkvKiBjdXJyZW50IHRyYW5zZmVyIHJhdGUgc2V0ICovCisJdTgJZGVzaXJlZF9zcGVlZDsJLyogZGVzaXJlZCB0cmFuc2ZlciByYXRlIHNldCAqLworICAgICAgICB1OAlkbjsJCS8qIG5vdyB3aWRlIHNwcmVhZCB1c2UgKi8KKwl1OAlhY291c3RpYzsJLyogYWNvdXN0aWMgbWFuYWdlbWVudCAqLworCXU4CW1lZGlhOwkJLyogZGlzaywgY2Ryb20sIHRhcGUsIGZsb3BweSwgLi4uICovCisJdTgJcmVhZHlfc3RhdDsJLyogbWluIHN0YXR1cyB2YWx1ZSBmb3IgZHJpdmUgcmVhZHkgKi8KKwl1OAltdWx0X2NvdW50OwkvKiBjdXJyZW50IG11bHRpcGxlIHNlY3RvciBzZXR0aW5nICovCisJdTgJbXVsdF9yZXE7CS8qIHJlcXVlc3RlZCBtdWx0aXBsZSBzZWN0b3Igc2V0dGluZyAqLworCXU4CWlvXzMyYml0OwkvKiAwPTE2LWJpdCwgMT0zMi1iaXQsIDIvMz0zMmJpdCtzeW5jICovCisJdTgJYmFkX3dzdGF0OwkvKiB1c2VkIGZvciBpZ25vcmluZyBBVEFfREYgKi8KKwl1OAloZWFkOwkJLyogInJlYWwiIG51bWJlciBvZiBoZWFkcyAqLworCXU4CXNlY3Q7CQkvKiAicmVhbCIgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1OAliaW9zX2hlYWQ7CS8qIEJJT1MvZmRpc2svTElMTyBudW1iZXIgb2YgaGVhZHMgKi8KKwl1OAliaW9zX3NlY3Q7CS8qIEJJT1MvZmRpc2svTElMTyBzZWN0b3JzIHBlciB0cmFjayAqLworCisJLyogZGVsYXkgdGhpcyBsb25nIGJlZm9yZSBzZW5kaW5nIHBhY2tldCBjb21tYW5kICovCisJdTggcGNfZGVsYXk7CisKKwl1bnNpZ25lZCBpbnQJYmlvc19jeWw7CS8qIEJJT1MvZmRpc2svTElMTyBudW1iZXIgb2YgY3lscyAqLworCXVuc2lnbmVkIGludAljeWw7CQkvKiAicmVhbCIgbnVtYmVyIG9mIGN5bHMgKi8KKwl1bnNpZ25lZCBpbnQJZHJpdmVfZGF0YTsJLyogdXNlZCBieSBzZXRfcGlvX21vZGUvc2VsZWN0cHJvYyAqLworCXVuc2lnbmVkIGludAlmYWlsdXJlczsJLyogY3VycmVudCBmYWlsdXJlIGNvdW50ICovCisJdW5zaWduZWQgaW50CW1heF9mYWlsdXJlczsJLyogbWF4aW11bSBhbGxvd2VkIGZhaWx1cmUgY291bnQgKi8KKwl1NjQJCXByb2JlZF9jYXBhY2l0eTsvKiBpbml0aWFsIHJlcG9ydGVkIG1lZGlhIGNhcGFjaXR5IChpZGUtY2Qgb25seSBjdXJyZW50bHkpICovCisKKwl1NjQJCWNhcGFjaXR5NjQ7CS8qIHRvdGFsIG51bWJlciBvZiBzZWN0b3JzICovCisKKwlpbnQJCWx1bjsJCS8qIGxvZ2ljYWwgdW5pdCAqLworCWludAkJY3JjX2NvdW50OwkvKiBjcmMgY291bnRlciB0byByZWR1Y2UgZHJpdmUgc3BlZWQgKi8KKworCXVuc2lnbmVkIGxvbmcJZGVidWdfbWFzazsJLyogZGVidWdnaW5nIGxldmVscyBzd2l0Y2ggKi8KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKKwlzdHJ1Y3QgaWRlX2FjcGlfZHJpdmVfbGluayAqYWNwaWRhdGE7CisjZW5kaWYKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRldmljZQlnZW5kZXY7CisJc3RydWN0IGNvbXBsZXRpb24gZ2VuZGV2X3JlbF9jb21wOwkvKiB0byBkZWFsIHdpdGggZGV2aWNlIHJlbGVhc2UoKSAqLworCisJLyogY3VycmVudCBwYWNrZXQgY29tbWFuZCAqLworCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjOworCisJLyogY2FsbGJhY2sgZm9yIHBhY2tldCBjb21tYW5kcyAqLworCXZvaWQgKCpwY19jYWxsYmFjaykoc3RydWN0IGlkZV9kcml2ZV9zICosIGludCk7CisKKwl2b2lkICgqcGNfdXBkYXRlX2J1ZmZlcnMpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICopOworCWludCAgKCpwY19pb19idWZmZXJzKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKiwgc3RydWN0IGlkZV9hdGFwaV9wYyAqLAorCQkJICAgICAgdW5zaWduZWQgaW50LCBpbnQpOworCisJdW5zaWduZWQgbG9uZyBhdGFwaV9mbGFnczsKKworCXN0cnVjdCBpZGVfYXRhcGlfcGMgcmVxdWVzdF9zZW5zZV9wYzsKKwlzdHJ1Y3QgcmVxdWVzdCByZXF1ZXN0X3NlbnNlX3JxOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaWRlX2RyaXZlX3MgaWRlX2RyaXZlX3Q7CisKKyNkZWZpbmUgdG9faWRlX2RldmljZShkZXYpCQljb250YWluZXJfb2YoZGV2LCBpZGVfZHJpdmVfdCwgZ2VuZGV2KQorCisjZGVmaW5lIHRvX2lkZV9kcnYob2JqLCBjb250X3R5cGUpCVwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY29udF90eXBlLCBrcmVmKQorCisjZGVmaW5lIGlkZV9kcnZfZyhkaXNrLCBjb250X3R5cGUpCVwKKwljb250YWluZXJfb2YoKGRpc2spLT5wcml2YXRlX2RhdGEsIHN0cnVjdCBjb250X3R5cGUsIGRyaXZlcikKKworc3RydWN0IGlkZV9wb3J0X2luZm87CisKK3N0cnVjdCBpZGVfdHBfb3BzIHsKKwl2b2lkCSgqZXhlY19jb21tYW5kKShzdHJ1Y3QgaHdpZl9zICosIHU4KTsKKwl1OAkoKnJlYWRfc3RhdHVzKShzdHJ1Y3QgaHdpZl9zICopOworCXU4CSgqcmVhZF9hbHRzdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CisJdTgJKCpyZWFkX3NmZl9kbWFfc3RhdHVzKShzdHJ1Y3QgaHdpZl9zICopOworCisJdm9pZAkoKnNldF9pcnEpKHN0cnVjdCBod2lmX3MgKiwgaW50KTsKKworCXZvaWQJKCp0Zl9sb2FkKShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX3Rhc2tfcyAqKTsKKwl2b2lkCSgqdGZfcmVhZCkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV90YXNrX3MgKik7CisKKwl2b2lkCSgqaW5wdXRfZGF0YSkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCAqLAorCQkJICAgICAgdW5zaWduZWQgaW50KTsKKwl2b2lkCSgqb3V0cHV0X2RhdGEpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzIGRlZmF1bHRfdHBfb3BzOworCisvKioKKyAqIHN0cnVjdCBpZGVfcG9ydF9vcHMgLSBJREUgcG9ydCBvcGVyYXRpb25zCisgKgorICogQGluaXRfZGV2OgkJaG9zdCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBvZiBhIGRldmljZQorICogQHNldF9waW9fbW9kZToJcm91dGluZSB0byBwcm9ncmFtIGhvc3QgZm9yIFBJTyBtb2RlCisgKiBAc2V0X2RtYV9tb2RlOglyb3V0aW5lIHRvIHByb2dyYW0gaG9zdCBmb3IgRE1BIG1vZGUKKyAqIEBzZWxlY3Rwcm9jOgkJdHdlYWtzIGhhcmR3YXJlIHRvIHNlbGVjdCBkcml2ZQorICogQHJlc2V0X3BvbGw6CQljaGlwc2V0IHBvbGxpbmcgYmFzZWQgb24gaGJhIHNwZWNpZmljcworICogQHByZV9yZXNldDoJCWNoaXBzZXQgc3BlY2lmaWMgY2hhbmdlcyB0byBkZWZhdWx0IGZvciBkZXZpY2UtaGJhIHJlc2V0cworICogQHJlc2V0cHJvYzoJCXJvdXRpbmUgdG8gcmVzZXQgY29udHJvbGxlciBhZnRlciBhIGRpc2sgcmVzZXQKKyAqIEBtYXNrcHJvYzoJCXNwZWNpYWwgaG9zdCBtYXNraW5nIGZvciBkcml2ZSBzZWxlY3Rpb24KKyAqIEBxdWlya3Byb2M6CQljaGVjayBob3N0J3MgZHJpdmUgcXVpcmsgbGlzdAorICogQGNsZWFyX2lycToJCWNsZWFyIElSUQorICoKKyAqIEBtZG1hX2ZpbHRlcjoJZmlsdGVyIE1ETUEgbW9kZXMKKyAqIEB1ZG1hX2ZpbHRlcjoJZmlsdGVyIFVETUEgbW9kZXMKKyAqCisgKiBAY2FibGVfZGV0ZWN0OglkZXRlY3QgY2FibGUgdHlwZQorICovCitzdHJ1Y3QgaWRlX3BvcnRfb3BzIHsKKwl2b2lkCSgqaW5pdF9kZXYpKGlkZV9kcml2ZV90ICopOworCXZvaWQJKCpzZXRfcGlvX21vZGUpKGlkZV9kcml2ZV90ICosIGNvbnN0IHU4KTsKKwl2b2lkCSgqc2V0X2RtYV9tb2RlKShpZGVfZHJpdmVfdCAqLCBjb25zdCB1OCk7CisJdm9pZAkoKnNlbGVjdHByb2MpKGlkZV9kcml2ZV90ICopOworCWludAkoKnJlc2V0X3BvbGwpKGlkZV9kcml2ZV90ICopOworCXZvaWQJKCpwcmVfcmVzZXQpKGlkZV9kcml2ZV90ICopOworCXZvaWQJKCpyZXNldHByb2MpKGlkZV9kcml2ZV90ICopOworCXZvaWQJKCptYXNrcHJvYykoaWRlX2RyaXZlX3QgKiwgaW50KTsKKwl2b2lkCSgqcXVpcmtwcm9jKShpZGVfZHJpdmVfdCAqKTsKKwl2b2lkCSgqY2xlYXJfaXJxKShpZGVfZHJpdmVfdCAqKTsKKworCXU4CSgqbWRtYV9maWx0ZXIpKGlkZV9kcml2ZV90ICopOworCXU4CSgqdWRtYV9maWx0ZXIpKGlkZV9kcml2ZV90ICopOworCisJdTgJKCpjYWJsZV9kZXRlY3QpKHN0cnVjdCBod2lmX3MgKik7Cit9OworCitzdHJ1Y3QgaWRlX2RtYV9vcHMgeworCXZvaWQJKCpkbWFfaG9zdF9zZXQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCBpbnQpOworCWludAkoKmRtYV9zZXR1cCkoc3RydWN0IGlkZV9kcml2ZV9zICopOworCXZvaWQJKCpkbWFfZXhlY19jbWQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCB1OCk7CisJdm9pZAkoKmRtYV9zdGFydCkoc3RydWN0IGlkZV9kcml2ZV9zICopOworCWludAkoKmRtYV9lbmQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKKwlpbnQJKCpkbWFfdGVzdF9pcnEpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKKwl2b2lkCSgqZG1hX2xvc3RfaXJxKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7CisJdm9pZAkoKmRtYV90aW1lb3V0KShzdHJ1Y3QgaWRlX2RyaXZlX3MgKik7Cit9OworCitzdHJ1Y3QgaWRlX2hvc3Q7CisKK3R5cGVkZWYgc3RydWN0IGh3aWZfcyB7CisJc3RydWN0IGh3aWZfcyAqbmV4dDsJCS8qIGZvciBsaW5rZWQtbGlzdCBpbiBpZGVfaHdncm91cF90ICovCisJc3RydWN0IGh3aWZfcyAqbWF0ZTsJCS8qIG90aGVyIGh3aWYgZnJvbSBzYW1lIFBDSSBjaGlwICovCisJc3RydWN0IGh3Z3JvdXBfcyAqaHdncm91cDsJLyogYWN0dWFsbHkgKGlkZV9od2dyb3VwX3QgKikgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CS8qIC9wcm9jL2lkZS8gZGlyZWN0b3J5IGVudHJ5ICovCisKKwlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3Q7CisKKwljaGFyIG5hbWVbNl07CQkJLyogbmFtZSBvZiBpbnRlcmZhY2UsIGVnLiAiaWRlMCIgKi8KKworCXN0cnVjdCBpZGVfaW9fcG9ydHMJaW9fcG9ydHM7CisKKwl1bnNpZ25lZCBsb25nCXNhdGFfc2NyW1NBVEFfTlJfUE9SVFNdOworCisJaWRlX2RyaXZlX3QJZHJpdmVzW01BWF9EUklWRVNdOwkvKiBkcml2ZSBpbmZvICovCisKKwl1OCBtYWpvcjsJLyogb3VyIG1ham9yIG51bWJlciAqLworCXU4IGluZGV4OwkvKiAwIGZvciBpZGUwOyAxIGZvciBpZGUxOyAuLi4gKi8KKwl1OCBjaGFubmVsOwkvKiBmb3IgZHVhbC1wb3J0IGNoaXBzOiAwPXByaW1hcnksIDE9c2Vjb25kYXJ5ICovCisKKwl1MzIgaG9zdF9mbGFnczsKKworCXU4IHBpb19tYXNrOworCisJdTggdWx0cmFfbWFzazsKKwl1OCBtd2RtYV9tYXNrOworCXU4IHN3ZG1hX21hc2s7CisKKwl1OCBjYmw7CQkvKiBjYWJsZSB0eXBlICovCisKKwlod2lmX2NoaXBzZXRfdCBjaGlwc2V0OwkvKiBzdWItbW9kdWxlIGZvciB0dW5pbmcuLiAqLworCisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWRlX2Fja19pbnRyX3QgKmFja19pbnRyOworCisJdm9pZCAoKnJ3X2Rpc2spKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOworCisJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMJCSp0cF9vcHM7CisJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcwkqcG9ydF9vcHM7CisJY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzCSpkbWFfb3BzOworCisJLyogZG1hIHBoeXNpY2FsIHJlZ2lvbiBkZXNjcmlwdG9yIHRhYmxlIChjcHUgdmlldykgKi8KKwl1bnNpZ25lZCBpbnQJKmRtYXRhYmxlX2NwdTsKKwkvKiBkbWEgcGh5c2ljYWwgcmVnaW9uIGRlc2NyaXB0b3IgdGFibGUgKGRtYSB2aWV3KSAqLworCWRtYV9hZGRyX3QJZG1hdGFibGVfZG1hOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgUFJEIHRhYmxlIGVudHJpZXMgKi8KKwlpbnQgcHJkX21heF9uZW50czsKKwkvKiBQUkQgZW50cnkgc2l6ZSBpbiBieXRlcyAqLworCWludCBwcmRfZW50X3NpemU7CisKKwkvKiBTY2F0dGVyLWdhdGhlciBsaXN0IHVzZWQgdG8gYnVpbGQgdGhlIGFib3ZlICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ190YWJsZTsKKwlpbnQgc2dfbWF4X25lbnRzOwkJLyogTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiBpdCAqLworCWludCBzZ19uZW50czsJCQkvKiBDdXJyZW50IG51bWJlciBvZiBlbnRyaWVzIGluIGl0ICovCisJaW50IHNnX2RtYV9kaXJlY3Rpb247CQkvKiBkbWEgdHJhbnNmZXIgZGlyZWN0aW9uICovCisKKwkvKiBkYXRhIHBoYXNlIG9mIHRoZSBhY3RpdmUgY29tbWFuZCAoY3VycmVudGx5IG9ubHkgdmFsaWQgZm9yIFBJTy9ETUEpICovCisJaW50CQlkYXRhX3BoYXNlOworCisJc3RydWN0IGlkZV90YXNrX3MgdGFzazsJCS8qIGN1cnJlbnQgY29tbWFuZCAqLworCisJdW5zaWduZWQgaW50IG5zZWN0OworCXVuc2lnbmVkIGludCBubGVmdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmN1cnNnOworCXVuc2lnbmVkIGludCBjdXJzZ19vZnM7CisKKwlpbnQJCXJxc2l6ZTsJCS8qIG1heCBzZWN0b3JzIHBlciByZXF1ZXN0ICovCisJaW50CQlpcnE7CQkvKiBvdXIgaXJxIG51bWJlciAqLworCisJdW5zaWduZWQgbG9uZwlkbWFfYmFzZTsJLyogYmFzZSBhZGRyIGZvciBkbWEgcG9ydHMgKi8KKworCXVuc2lnbmVkIGxvbmcJY29uZmlnX2RhdGE7CS8qIGZvciB1c2UgYnkgY2hpcHNldC1zcGVjaWZpYyBjb2RlICovCisJdW5zaWduZWQgbG9uZwlzZWxlY3RfZGF0YTsJLyogZm9yIHVzZSBieSBjaGlwc2V0LXNwZWNpZmljIGNvZGUgKi8KKworCXVuc2lnbmVkIGxvbmcJZXh0cmFfYmFzZTsJLyogZXh0cmEgYWRkciBmb3IgZG1hIHBvcnRzICovCisJdW5zaWduZWQJZXh0cmFfcG9ydHM7CS8qIG51bWJlciBvZiBleHRyYSBkbWEgcG9ydHMgKi8KKworCXVuc2lnbmVkCXByZXNlbnQgICAgOiAxOwkvKiB0aGlzIGludGVyZmFjZSBleGlzdHMgKi8KKwl1bnNpZ25lZAlzZXJpYWxpemVkIDogMTsJLyogc2VyaWFsaXplZCBhbGwgY2hhbm5lbCBvcGVyYXRpb24gKi8KKwl1bnNpZ25lZAlzaGFyaW5nX2lycTogMTsJLyogMSA9IHNoYXJpbmcgaXJxIHdpdGggYW5vdGhlciBod2lmICovCisJdW5zaWduZWQJc2dfbWFwcGVkICA6IDE7CS8qIHNnX3RhYmxlIGFuZCBzZ19uZW50cyBhcmUgcmVhZHkgKi8KKworCXN0cnVjdCBkZXZpY2UJCWdlbmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqcG9ydGRldjsKKworCXN0cnVjdCBjb21wbGV0aW9uIGdlbmRldl9yZWxfY29tcDsgLyogVG8gZGVhbCB3aXRoIGRldmljZSByZWxlYXNlKCkgKi8KKworCXZvaWQJCSpod2lmX2RhdGE7CS8qIGV4dHJhIGh3aWYgZGF0YSAqLworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFQUNQSQorCXN0cnVjdCBpZGVfYWNwaV9od2lmX2xpbmsgKmFjcGlkYXRhOworI2VuZGlmCit9IF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAgaWRlX2h3aWZfdDsKKworI2RlZmluZSBNQVhfSE9TVF9QT1JUUyA0CisKK3N0cnVjdCBpZGVfaG9zdCB7CisJaWRlX2h3aWZfdAkqcG9ydHNbTUFYX0hPU1RfUE9SVFNdOworCXVuc2lnbmVkIGludAluX3BvcnRzOworCXN0cnVjdCBkZXZpY2UJKmRldlsyXTsKKwl1bnNpZ25lZCBpbnQJKCppbml0X2NoaXBzZXQpKHN0cnVjdCBwY2lfZGV2ICopOworCXVuc2lnbmVkIGxvbmcJaG9zdF9mbGFnczsKKwl2b2lkCQkqaG9zdF9wcml2OworfTsKKworLyoKKyAqICBpbnRlcm5hbCBpZGUgaW50ZXJydXB0IGhhbmRsZXIgdHlwZQorICovCit0eXBlZGVmIGlkZV9zdGFydHN0b3BfdCAoaWRlX2hhbmRsZXJfdCkoaWRlX2RyaXZlX3QgKik7Cit0eXBlZGVmIGludCAoaWRlX2V4cGlyeV90KShpZGVfZHJpdmVfdCAqKTsKKworLyogdXNlZCBieSBpZGUtY2QsIGlkZS1mbG9wcHksIGV0Yy4gKi8KK3R5cGVkZWYgdm9pZCAoeGZlcl9mdW5jX3QpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqLCB1bnNpZ25lZCk7CisKK3R5cGVkZWYgc3RydWN0IGh3Z3JvdXBfcyB7CisJCS8qIGlycSBoYW5kbGVyLCBpZiBhY3RpdmUgKi8KKwlpZGVfc3RhcnRzdG9wX3QJKCpoYW5kbGVyKShpZGVfZHJpdmVfdCAqKTsKKworCQkvKiBCT09MOiBwcm90ZWN0cyBhbGwgZmllbGRzIGJlbG93ICovCisJdm9sYXRpbGUgaW50IGJ1c3k7CisJCS8qIEJPT0w6IHdha2UgdXMgdXAgb24gdGltZXIgZXhwaXJ5ICovCisJdW5zaWduZWQgaW50IHNsZWVwaW5nCTogMTsKKwkJLyogQk9PTDogcG9sbGluZyBhY3RpdmUgJiBwb2xsX3RpbWVvdXQgZmllbGQgdmFsaWQgKi8KKwl1bnNpZ25lZCBpbnQgcG9sbGluZwk6IDE7CisKKwkJLyogY3VycmVudCBkcml2ZSAqLworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwkJLyogcHRyIHRvIGN1cnJlbnQgaHdpZiBpbiBsaW5rZWQtbGlzdCAqLworCWlkZV9od2lmX3QgKmh3aWY7CisKKwkJLyogY3VycmVudCByZXF1ZXN0ICovCisJc3RydWN0IHJlcXVlc3QgKnJxOworCisJCS8qIGZhaWxzYWZlIHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCS8qIHRpbWVvdXQgdmFsdWUgZHVyaW5nIGxvbmcgcG9sbHMgKi8KKwl1bnNpZ25lZCBsb25nIHBvbGxfdGltZW91dDsKKwkJLyogcXVlcmllZCB1cG9uIHRpbWVvdXRzICovCisJaW50ICgqZXhwaXJ5KShpZGVfZHJpdmVfdCAqKTsKKworCWludCByZXFfZ2VuOworCWludCByZXFfZ2VuX3RpbWVyOworfSBpZGVfaHdncm91cF90OworCit0eXBlZGVmIHN0cnVjdCBpZGVfZHJpdmVyX3MgaWRlX2RyaXZlcl90OworCitleHRlcm4gc3RydWN0IG11dGV4IGlkZV9zZXR0aW5nX210eDsKKworLyoKKyAqIGNvbmZpZ3VyYWJsZSBkcml2ZSBzZXR0aW5ncworICovCisKKyNkZWZpbmUgRFNfU1lOQwkoMSA8PCAwKQorCitzdHJ1Y3QgaWRlX2RldnNldCB7CisJaW50CQkoKmdldCkoaWRlX2RyaXZlX3QgKik7CisJaW50CQkoKnNldCkoaWRlX2RyaXZlX3QgKiwgaW50KTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7Cit9OworCisjZGVmaW5lIF9fREVWU0VUKF9mbGFncywgX2dldCwgX3NldCkgeyBcCisJLmZsYWdzCT0gX2ZsYWdzLCBcCisJLmdldAk9IF9nZXQsCVwKKwkuc2V0CT0gX3NldCwJXAorfQorCisjZGVmaW5lIGlkZV9kZXZzZXRfZ2V0KG5hbWUsIGZpZWxkKSBcCitzdGF0aWMgaW50IGdldF8jI25hbWUoaWRlX2RyaXZlX3QgKmRyaXZlKSBcCit7IFwKKwlyZXR1cm4gZHJpdmUtPmZpZWxkOyBcCit9CisKKyNkZWZpbmUgaWRlX2RldnNldF9zZXQobmFtZSwgZmllbGQpIFwKK3N0YXRpYyBpbnQgc2V0XyMjbmFtZShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBhcmcpIFwKK3sgXAorCWRyaXZlLT5maWVsZCA9IGFyZzsgXAorCXJldHVybiAwOyBcCit9CisKKyNkZWZpbmUgaWRlX2RldnNldF9nZXRfZmxhZyhuYW1lLCBmbGFnKSBcCitzdGF0aWMgaW50IGdldF8jI25hbWUoaWRlX2RyaXZlX3QgKmRyaXZlKSBcCit7IFwKKwlyZXR1cm4gISEoZHJpdmUtPmRldl9mbGFncyAmIGZsYWcpOyBcCit9CisKKyNkZWZpbmUgaWRlX2RldnNldF9zZXRfZmxhZyhuYW1lLCBmbGFnKSBcCitzdGF0aWMgaW50IHNldF8jI25hbWUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKSBcCit7IFwKKwlpZiAoYXJnKSBcCisJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gZmxhZzsgXAorCWVsc2UgXAorCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5mbGFnOyBcCisJcmV0dXJuIDA7IFwKK30KKworI2RlZmluZSBfX0lERV9ERVZTRVQoX25hbWUsIF9mbGFncywgX2dldCwgX3NldCkgXAorY29uc3Qgc3RydWN0IGlkZV9kZXZzZXQgaWRlX2RldnNldF8jI19uYW1lID0gXAorCV9fREVWU0VUKF9mbGFncywgX2dldCwgX3NldCkKKworI2RlZmluZSBJREVfREVWU0VUKF9uYW1lLCBfZmxhZ3MsIF9nZXQsIF9zZXQpIFwKK3N0YXRpYyBfX0lERV9ERVZTRVQoX25hbWUsIF9mbGFncywgX2dldCwgX3NldCkKKworI2RlZmluZSBpZGVfZGV2c2V0X3J3KF9uYW1lLCBfZnVuYykgXAorSURFX0RFVlNFVChfbmFtZSwgMCwgZ2V0XyMjX2Z1bmMsIHNldF8jI19mdW5jKQorCisjZGVmaW5lIGlkZV9kZXZzZXRfdyhfbmFtZSwgX2Z1bmMpIFwKK0lERV9ERVZTRVQoX25hbWUsIDAsIE5VTEwsIHNldF8jI19mdW5jKQorCisjZGVmaW5lIGlkZV9leHRfZGV2c2V0X3J3KF9uYW1lLCBfZnVuYykgXAorX19JREVfREVWU0VUKF9uYW1lLCAwLCBnZXRfIyNfZnVuYywgc2V0XyMjX2Z1bmMpCisKKyNkZWZpbmUgaWRlX2V4dF9kZXZzZXRfcndfc3luYyhfbmFtZSwgX2Z1bmMpIFwKK19fSURFX0RFVlNFVChfbmFtZSwgRFNfU1lOQywgZ2V0XyMjX2Z1bmMsIHNldF8jI19mdW5jKQorCisjZGVmaW5lIGlkZV9kZWNsX2RldnNldChfbmFtZSkgXAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZGVfZGV2c2V0IGlkZV9kZXZzZXRfIyNfbmFtZQorCitpZGVfZGVjbF9kZXZzZXQoaW9fMzJiaXQpOworaWRlX2RlY2xfZGV2c2V0KGtlZXBzZXR0aW5ncyk7CitpZGVfZGVjbF9kZXZzZXQocGlvX21vZGUpOworaWRlX2RlY2xfZGV2c2V0KHVubWFza2lycSk7CitpZGVfZGVjbF9kZXZzZXQodXNpbmdfZG1hKTsKKworI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUworLyoKKyAqIC9wcm9jL2lkZSBpbnRlcmZhY2UKKyAqLworCisjZGVmaW5lIGlkZV9kZXZzZXRfcndfZmllbGQoX25hbWUsIF9maWVsZCkgXAoraWRlX2RldnNldF9nZXQoX25hbWUsIF9maWVsZCk7IFwKK2lkZV9kZXZzZXRfc2V0KF9uYW1lLCBfZmllbGQpOyBcCitJREVfREVWU0VUKF9uYW1lLCBEU19TWU5DLCBnZXRfIyNfbmFtZSwgc2V0XyMjX25hbWUpCisKKyNkZWZpbmUgaWRlX2RldnNldF9yd19mbGFnKF9uYW1lLCBfZmllbGQpIFwKK2lkZV9kZXZzZXRfZ2V0X2ZsYWcoX25hbWUsIF9maWVsZCk7IFwKK2lkZV9kZXZzZXRfc2V0X2ZsYWcoX25hbWUsIF9maWVsZCk7IFwKK0lERV9ERVZTRVQoX25hbWUsIERTX1NZTkMsIGdldF8jI19uYW1lLCBzZXRfIyNfbmFtZSkKKworc3RydWN0IGlkZV9wcm9jX2RldnNldCB7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJY29uc3Qgc3RydWN0IGlkZV9kZXZzZXQJKnNldHRpbmc7CisJaW50CQkJbWluLCBtYXg7CisJaW50CQkJKCptdWxmKShpZGVfZHJpdmVfdCAqKTsKKwlpbnQJCQkoKmRpdmYpKGlkZV9kcml2ZV90ICopOworfTsKKworI2RlZmluZSBfX0lERV9QUk9DX0RFVlNFVChfbmFtZSwgX21pbiwgX21heCwgX211bGYsIF9kaXZmKSB7IFwKKwkubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgXAorCS5zZXR0aW5nID0gJmlkZV9kZXZzZXRfIyNfbmFtZSwgXAorCS5taW4gPSBfbWluLCBcCisJLm1heCA9IF9tYXgsIFwKKwkubXVsZiA9IF9tdWxmLCBcCisJLmRpdmYgPSBfZGl2ZiwgXAorfQorCisjZGVmaW5lIElERV9QUk9DX0RFVlNFVChfbmFtZSwgX21pbiwgX21heCkgXAorX19JREVfUFJPQ19ERVZTRVQoX25hbWUsIF9taW4sIF9tYXgsIE5VTEwsIE5VTEwpCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyCSpuYW1lOworCW1vZGVfdAkJbW9kZTsKKwlyZWFkX3Byb2NfdAkqcmVhZF9wcm9jOworCXdyaXRlX3Byb2NfdAkqd3JpdGVfcHJvYzsKK30gaWRlX3Byb2NfZW50cnlfdDsKKwordm9pZCBwcm9jX2lkZV9jcmVhdGUodm9pZCk7Cit2b2lkIHByb2NfaWRlX2Rlc3Ryb3kodm9pZCk7Cit2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqKTsKK3ZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKik7Cit2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICopOwordm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqKTsKK3ZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICosIGlkZV9kcml2ZXJfdCAqKTsKK3ZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOworCityZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2NhcGFjaXR5OworcmVhZF9wcm9jX3QgcHJvY19pZGVfcmVhZF9nZW9tZXRyeTsKKworLyoKKyAqIFN0YW5kYXJkIGV4aXQgc3R1ZmY6CisgKi8KKyNkZWZpbmUgUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbikgXAorewkJCQkJXAorCWxlbiAtPSBvZmY7CQkJXAorCWlmIChsZW4gPCBjb3VudCkgewkJXAorCQkqZW9mID0gMTsJCVwKKwkJaWYgKGxlbiA8PSAwKQkJXAorCQkJcmV0dXJuIDA7CVwKKwl9IGVsc2UJCQkJXAorCQlsZW4gPSBjb3VudDsJCVwKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOwkJXAorCXJldHVybiBsZW47CQkJXAorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jX2lkZV9jcmVhdGUodm9pZCkgeyA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jX2lkZV9kZXN0cm95KHZvaWQpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfcG9ydChpZGVfaHdpZl90ICpod2lmKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikgeyA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikgeyA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQorI2RlZmluZSBQUk9DX0lERV9SRUFEX1JFVFVSTihwYWdlLHN0YXJ0LG9mZixjb3VudCxlb2YsbGVuKSByZXR1cm4gMDsKKyNlbmRpZgorCitlbnVtIHsKKwkvKiBlbnRlci9leGl0IGZ1bmN0aW9ucyAqLworCUlERV9EQkdfRlVOQyA9CQkJKDEgPDwgMCksCisJLyogc2Vuc2Uga2V5L2FzYyBoYW5kbGluZyAqLworCUlERV9EQkdfU0VOU0UgPQkJCSgxIDw8IDEpLAorCS8qIHBhY2tldCBjb21tYW5kcyBoYW5kbGluZyAqLworCUlERV9EQkdfUEMgPQkJCSgxIDw8IDIpLAorCS8qIHJlcXVlc3QgaGFuZGxpbmcgKi8KKwlJREVfREJHX1JRID0JCQkoMSA8PCAzKSwKKwkvKiBkcml2ZXIgcHJvYmluZy9zZXR1cCAqLworCUlERV9EQkdfUFJPQkUgPQkJCSgxIDw8IDQpLAorfTsKKworLyogRFJWX05BTUUgaGFzIHRvIGJlIGRlZmluZWQgaW4gdGhlIGRyaXZlciBiZWZvcmUgdXNpbmcgdGhlIG1hY3JvIGJlbG93ICovCisjZGVmaW5lIF9faWRlX2RlYnVnX2xvZyhsdmwsIGZtdCwgYXJncy4uLikJCQlcCit7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGRyaXZlLT5kZWJ1Z19tYXNrICYgbHZsKSkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIjogIiBmbXQsICMjIGFyZ3MpOwlcCit9CisKKy8qCisgKiBQb3dlciBNYW5hZ2VtZW50IHN0YXRlIG1hY2hpbmUgKHJxLT5wbS0+cG1fc3RlcCkuCisgKgorICogRm9yIGVhY2ggc3RlcCwgdGhlIGNvcmUgY2FsbHMgaWRlX3N0YXJ0X3Bvd2VyX3N0ZXAoKSBmaXJzdC4KKyAqIFRoaXMgY2FuIHJldHVybjoKKyAqCS0gaWRlX3N0b3BwZWQgOglJbiB0aGlzIGNhc2UsIHRoZSBjb3JlIGNhbGxzIHVzIGJhY2sgYWdhaW4gdW5sZXNzCisgKgkJCXN0ZXAgaGF2ZSBiZWVuIHNldCB0byBpZGVfcG93ZXJfc3RhdGVfY29tcGxldGVkLgorICoJLSBpZGVfc3RhcnRlZCA6CUluIHRoaXMgY2FzZSwgdGhlIGNoYW5uZWwgaXMgbGVmdCBidXN5IHVudGlsIGFuCisgKgkJCWFzeW5jIGV2ZW50IChpbnRlcnJ1cHQpIG9jY3Vycy4KKyAqIFR5cGljYWxseSwgaWRlX3N0YXJ0X3Bvd2VyX3N0ZXAoKSB3aWxsIGlzc3VlIGEgdGFza2ZpbGUgcmVxdWVzdCB3aXRoCisgKiBkb19yd190YXNrZmlsZSgpLgorICoKKyAqIFVwb24gcmVjZXB0aW9uIG9mIHRoZSBpbnRlcnJ1cHQsIHRoZSBjb3JlIHdpbGwgY2FsbCBpZGVfY29tcGxldGVfcG93ZXJfc3RlcCgpCisgKiB3aXRoIHRoZSBlcnJvciBjb2RlIGlmIGFueS4gVGhpcyByb3V0aW5lIHNob3VsZCB1cGRhdGUgdGhlIHN0ZXAgdmFsdWUKKyAqIGFuZCByZXR1cm4uIEl0IHNob3VsZCBub3Qgc3RhcnQgYSBuZXcgcmVxdWVzdC4gVGhlIGNvcmUgd2lsbCBjYWxsCisgKiBpZGVfc3RhcnRfcG93ZXJfc3RlcCgpIGZvciB0aGUgbmV3IHN0ZXAgdmFsdWUsIHVubGVzcyBzdGVwIGhhdmUgYmVlbgorICogc2V0IHRvIElERV9QTV9DT01QTEVURUQuCisgKi8KK2VudW0geworCUlERV9QTV9TVEFSVF9TVVNQRU5ELAorCUlERV9QTV9GTFVTSF9DQUNIRQk9IElERV9QTV9TVEFSVF9TVVNQRU5ELAorCUlERV9QTV9TVEFOREJZLAorCisJSURFX1BNX1NUQVJUX1JFU1VNRSwKKwlJREVfUE1fUkVTVE9SRV9QSU8JPSBJREVfUE1fU1RBUlRfUkVTVU1FLAorCUlERV9QTV9JRExFLAorCUlERV9QTV9SRVNUT1JFX0RNQSwKKworCUlERV9QTV9DT01QTEVURUQsCit9OworCisvKgorICogU3ViZHJpdmVycyBzdXBwb3J0LgorICoKKyAqIFRoZSBnZW5kcml2ZXIub3duZXIgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgbW9kdWxlIG93bmVyIG9mIHRoaXMgZHJpdmVyLgorICogVGhlIGdlbmRyaXZlci5uYW1lIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgdGhpcyBkcml2ZXIKKyAqLworc3RydWN0IGlkZV9kcml2ZXJfcyB7CisJY29uc3QgY2hhcgkJCSp2ZXJzaW9uOworCWlkZV9zdGFydHN0b3BfdAkoKmRvX3JlcXVlc3QpKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHNlY3Rvcl90KTsKKwlpbnQJCSgqZW5kX3JlcXVlc3QpKGlkZV9kcml2ZV90ICosIGludCwgaW50KTsKKwlpZGVfc3RhcnRzdG9wX3QJKCplcnJvcikoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKnJxLCB1OCwgdTgpOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWdlbl9kcml2ZXI7CisJaW50CQkoKnByb2JlKShpZGVfZHJpdmVfdCAqKTsKKwl2b2lkCQkoKnJlbW92ZSkoaWRlX2RyaXZlX3QgKik7CisJdm9pZAkJKCpyZXN1bWUpKGlkZV9kcml2ZV90ICopOworCXZvaWQJCSgqc2h1dGRvd24pKGlkZV9kcml2ZV90ICopOworI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUworCWlkZV9wcm9jX2VudHJ5X3QJCSpwcm9jOworCWNvbnN0IHN0cnVjdCBpZGVfcHJvY19kZXZzZXQJKnNldHRpbmdzOworI2VuZGlmCit9OworCisjZGVmaW5lIHRvX2lkZV9kcml2ZXIoZHJ2KSBjb250YWluZXJfb2YoZHJ2LCBpZGVfZHJpdmVyX3QsIGdlbl9kcml2ZXIpCisKK2ludCBpZGVfZGV2aWNlX2dldChpZGVfZHJpdmVfdCAqKTsKK3ZvaWQgaWRlX2RldmljZV9wdXQoaWRlX2RyaXZlX3QgKik7CisKK3N0cnVjdCBpZGVfaW9jdGxfZGV2c2V0IHsKKwl1bnNpZ25lZCBpbnQJZ2V0X2lvY3RsOworCXVuc2lnbmVkIGludAlzZXRfaW9jdGw7CisJY29uc3Qgc3RydWN0IGlkZV9kZXZzZXQgKnNldHRpbmc7Cit9OworCitpbnQgaWRlX3NldHRpbmdfaW9jdGwoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCBpZGVfaW9jdGxfZGV2c2V0ICopOworCitpbnQgZ2VuZXJpY19pZGVfaW9jdGwoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkgICAgICB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyk7CisKK2V4dGVybiBpbnQgaWRlX3ZsYl9jbGs7CitleHRlcm4gaW50IGlkZV9wY2lfY2xrOworCitleHRlcm4gaW50IGlkZV9lbmRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucnNlY3MpOworaW50IGlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJCSAgICAgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdG9ycyk7CisKK2V4dGVybiB2b2lkIGlkZV9zZXRfaGFuZGxlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLCB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpOworCit2b2lkIGlkZV9leGVjdXRlX2NvbW1hbmQoaWRlX2RyaXZlX3QgKiwgdTgsIGlkZV9oYW5kbGVyX3QgKiwgdW5zaWduZWQgaW50LAorCQkJIGlkZV9leHBpcnlfdCAqKTsKKwordm9pZCBpZGVfZXhlY3V0ZV9wa3RfY21kKGlkZV9kcml2ZV90ICopOworCit2b2lkIGlkZV9wYWRfdHJhbnNmZXIoaWRlX2RyaXZlX3QgKiwgaW50LCBpbnQpOworCitpZGVfc3RhcnRzdG9wX3QgX19pZGVfZXJyb3IoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdTgsIHU4KTsKKworaWRlX3N0YXJ0c3RvcF90IGlkZV9lcnJvciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICptc2csIGJ5dGUgc3RhdCk7CisKK3ZvaWQgaWRlX2ZpeF9kcml2ZWlkKHUxNiAqKTsKKworZXh0ZXJuIHZvaWQgaWRlX2ZpeHN0cmluZyh1OCAqLCBjb25zdCBpbnQsIGNvbnN0IGludCk7CisKK2ludCBpZGVfYnVzeV9zbGVlcChpZGVfaHdpZl90ICosIHVuc2lnbmVkIGxvbmcsIGludCk7CisKK2ludCBpZGVfd2FpdF9zdGF0KGlkZV9zdGFydHN0b3BfdCAqLCBpZGVfZHJpdmVfdCAqLCB1OCwgdTgsIHVuc2lnbmVkIGxvbmcpOworCitleHRlcm4gaWRlX3N0YXJ0c3RvcF90IGlkZV9kb19yZXNldCAoaWRlX2RyaXZlX3QgKik7CisKK2V4dGVybiBpbnQgaWRlX2RldnNldF9leGVjdXRlKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpZGVfZGV2c2V0ICpzZXR0aW5nLCBpbnQgYXJnKTsKKworZXh0ZXJuIHZvaWQgaWRlX2RvX2RyaXZlX2NtZChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKKworZXh0ZXJuIHZvaWQgaWRlX2VuZF9kcml2ZV9jbWQoaWRlX2RyaXZlX3QgKiwgdTgsIHU4KTsKKwogdm9pZCBpZGVfdGZfZHVtcChjb25zdCBjaGFyICosIHN0cnVjdCBpZGVfdGFza2ZpbGUgKik7CiAKIHZvaWQgaWRlX2V4ZWNfY29tbWFuZChpZGVfaHdpZl90ICosIHU4KTsKQEAgLTEwNDksNiArMTE5Nyw4IEBACiB2b2lkIGlkZV9pbnB1dF9kYXRhKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKIHZvaWQgaWRlX291dHB1dF9kYXRhKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKIAoraW50IGlkZV9pb19idWZmZXJzKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfYXRhcGlfcGMgKiwgdW5zaWduZWQgaW50LCBpbnQpOworCiBleHRlcm4gdm9pZCBTRUxFQ1RfRFJJVkUoaWRlX2RyaXZlX3QgKik7CiB2b2lkIFNFTEVDVF9NQVNLKGlkZV9kcml2ZV90ICosIGludCk7CiAKQEAgLTEwNTksMTYgKzEyMDksNDYgQEAKIAogdm9pZCBpZGVfcGt0Y21kX3RmX2xvYWQoaWRlX2RyaXZlX3QgKiwgdTMyLCB1MTYsIHU4KTsKIAotaWRlX3N0YXJ0c3RvcF90IGlkZV9wY19pbnRyKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsCi0JaWRlX2hhbmRsZXJfdCAqaGFuZGxlciwgdW5zaWduZWQgaW50IHRpbWVvdXQsIGlkZV9leHBpcnlfdCAqZXhwaXJ5LAotCXZvaWQgKCp1cGRhdGVfYnVmZmVycykoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9hdGFwaV9wYyAqKSwKLQl2b2lkICgqcmV0cnlfcGMpKGlkZV9kcml2ZV90ICopLCB2b2lkICgqZHNjX2hhbmRsZSkoaWRlX2RyaXZlX3QgKiksCi0Jdm9pZCAoKmlvX2J1ZmZlcnMpKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfYXRhcGlfcGMgKiwgdW5zaWduZWQgaW50LAotCQkJICAgaW50KSk7Ci1pZGVfc3RhcnRzdG9wX3QgaWRlX3RyYW5zZmVyX3BjKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfYXRhcGlfcGMgKiwKLQkJCQlpZGVfaGFuZGxlcl90ICosIHVuc2lnbmVkIGludCwgaWRlX2V4cGlyeV90ICopOwotaWRlX3N0YXJ0c3RvcF90IGlkZV9pc3N1ZV9wYyhpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICosCi0JCQkgICAgIGlkZV9oYW5kbGVyX3QgKiwgdW5zaWduZWQgaW50LCBpZGVfZXhwaXJ5X3QgKik7CitpbnQgaWRlX2NoZWNrX2F0YXBpX2RldmljZShpZGVfZHJpdmVfdCAqLCBjb25zdCBjaGFyICopOworCit2b2lkIGlkZV9pbml0X3BjKHN0cnVjdCBpZGVfYXRhcGlfcGMgKik7CisKKy8qIERpc2sgaGVhZCBwYXJraW5nICovCitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgaWRlX3Bhcmtfd3E7Citzc2l6ZV90IGlkZV9wYXJrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKTsKK3NzaXplX3QgaWRlX3Bhcmtfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qCisgKiBTcGVjaWFsIHJlcXVlc3RzIGZvciBpZGUtdGFwZSBibG9jayBkZXZpY2Ugc3RyYXRlZ3kgcm91dGluZS4KKyAqCisgKiBJbiBvcmRlciB0byBzZXJ2aWNlIGEgY2hhcmFjdGVyIGRldmljZSBjb21tYW5kLCB3ZSBhZGQgc3BlY2lhbCByZXF1ZXN0cyB0bworICogdGhlIHRhaWwgb2Ygb3VyIGJsb2NrIGRldmljZSByZXF1ZXN0IHF1ZXVlIGFuZCB3YWl0IGZvciB0aGVpciBjb21wbGV0aW9uLgorICovCitlbnVtIHsKKwlSRVFfSURFVEFQRV9QQzEJCT0gKDEgPDwgMCksIC8qIHBhY2tldCBjb21tYW5kIChmaXJzdCBzdGFnZSkgKi8KKwlSRVFfSURFVEFQRV9QQzIJCT0gKDEgPDwgMSksIC8qIHBhY2tldCBjb21tYW5kIChzZWNvbmQgc3RhZ2UpICovCisJUkVRX0lERVRBUEVfUkVBRAk9ICgxIDw8IDIpLAorCVJFUV9JREVUQVBFX1dSSVRFCT0gKDEgPDwgMyksCit9OworCitpbnQgaWRlX3F1ZXVlX3BjX3RhaWwoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IGlkZV9hdGFwaV9wYyAqKTsKKworaW50IGlkZV9kb190ZXN0X3VuaXRfcmVhZHkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKik7CitpbnQgaWRlX2RvX3N0YXJ0X3N0b3AoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgaW50KTsKK2ludCBpZGVfc2V0X21lZGlhX2xvY2soaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgaW50KTsKK3ZvaWQgaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICopOwordm9pZCBpZGVfcmV0cnlfcGMoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpZGVfc2NzaV9nZXRfdGltZW91dChzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYykKK3sKKwlyZXR1cm4gbWF4X3QodW5zaWduZWQgbG9uZywgV0FJVF9DTUQsIHBjLT50aW1lb3V0IC0gamlmZmllcyk7Cit9CisKK2ludCBpZGVfc2NzaV9leHBpcnkoaWRlX2RyaXZlX3QgKik7CisKK2lkZV9zdGFydHN0b3BfdCBpZGVfaXNzdWVfcGMoaWRlX2RyaXZlX3QgKiwgdW5zaWduZWQgaW50LCBpZGVfZXhwaXJ5X3QgKik7CiAKIGlkZV9zdGFydHN0b3BfdCBkb19yd190YXNrZmlsZShpZGVfZHJpdmVfdCAqLCBpZGVfdGFza190ICopOwogCkBAIC0xMDc4LDggKzEyNTgsNiBAQAogaW50IGlkZV9ub19kYXRhX3Rhc2tmaWxlKGlkZV9kcml2ZV90ICosIGlkZV90YXNrX3QgKik7CiAKIGludCBpZGVfdGFza2ZpbGVfaW9jdGwoaWRlX2RyaXZlX3QgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLWludCBpZGVfY21kX2lvY3RsKGlkZV9kcml2ZV90ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci1pbnQgaWRlX3Rhc2tfaW9jdGwoaWRlX2RyaXZlX3QgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAogZXh0ZXJuIGludCBpZGVfZHJpdmVpZF91cGRhdGUoaWRlX2RyaXZlX3QgKik7CiBleHRlcm4gaW50IGlkZV9jb25maWdfZHJpdmVfc3BlZWQoaWRlX2RyaXZlX3QgKiwgdTgpOwpAQCAtMTA5MCw3ICsxMjY4LDYgQEAKIAogZXh0ZXJuIHZvaWQgaWRlX3N0YWxsX3F1ZXVlKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIAotZXh0ZXJuIGludCBpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoaWRlX2RyaXZlX3QgKik7CiBleHRlcm4gdm9pZCBpZGVfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGlycXJldHVybl90IGlkZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKQEAgLTEyMjcsNiArMTQwNCwxNCBAQAogCQkgICAgIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICosIHZvaWQgKik7CiB2b2lkIGlkZV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOwogCisjaWZkZWYgQ09ORklHX1BNCitpbnQgaWRlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICosIHBtX21lc3NhZ2VfdCk7CitpbnQgaWRlX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKik7CisjZWxzZQorI2RlZmluZSBpZGVfcGNpX3N1c3BlbmQgTlVMTAorI2RlZmluZSBpZGVfcGNpX3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogdm9pZCBpZGVfbWFwX3NnKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogdm9pZCBpZGVfaW5pdF9zZ19jbWQoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKQEAgLTEyMzgsOSArMTQyMywxMCBAQAogCWNvbnN0IGNoYXIgKmlkX2Zpcm13YXJlOwogfTsKIAotaW50IGlkZV9pbl9kcml2ZV9saXN0KHN0cnVjdCBoZF9kcml2ZWlkICosIGNvbnN0IHN0cnVjdCBkcml2ZV9saXN0X2VudHJ5ICopOworaW50IGlkZV9pbl9kcml2ZV9saXN0KHUxNiAqLCBjb25zdCBzdHJ1Y3QgZHJpdmVfbGlzdF9lbnRyeSAqKTsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERURNQQoraW50IGlkZV9kbWFfZ29vZF9kcml2ZShpZGVfZHJpdmVfdCAqKTsKIGludCBfX2lkZV9kbWFfYmFkX2RyaXZlKGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9pZF9kbWFfYnVnKGlkZV9kcml2ZV90ICopOwogCkBAIC0xMjU4LDI1ICsxNDQ0LDI5IEBACiB2b2lkIGlkZV9jaGVja19kbWFfY3JjKGlkZV9kcml2ZV90ICopOwogaWRlX3N0YXJ0c3RvcF90IGlkZV9kbWFfaW50cihpZGVfZHJpdmVfdCAqKTsKIAoraW50IGlkZV9hbGxvY2F0ZV9kbWFfZW5naW5lKGlkZV9od2lmX3QgKik7Cit2b2lkIGlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaWRlX2h3aWZfdCAqKTsKKwogaW50IGlkZV9idWlsZF9zZ2xpc3QoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiB2b2lkIGlkZV9kZXN0cm95X2RtYXRhYmxlKGlkZV9kcml2ZV90ICopOwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1NGRgoraW50IGNvbmZpZ19kcml2ZV9mb3JfZG1hKGlkZV9kcml2ZV90ICopOwogZXh0ZXJuIGludCBpZGVfYnVpbGRfZG1hdGFibGUoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci1pbnQgaWRlX2FsbG9jYXRlX2RtYV9lbmdpbmUoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3JlbGVhc2VfZG1hX2VuZ2luZShpZGVfaHdpZl90ICopOwotCiB2b2lkIGlkZV9kbWFfaG9zdF9zZXQoaWRlX2RyaXZlX3QgKiwgaW50KTsKIGV4dGVybiBpbnQgaWRlX2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqKTsKIHZvaWQgaWRlX2RtYV9leGVjX2NtZChpZGVfZHJpdmVfdCAqLCB1OCk7CiBleHRlcm4gdm9pZCBpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICopOwotZXh0ZXJuIGludCBfX2lkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICopOworaW50IGlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKik7Ci1leHRlcm4gdm9pZCBpZGVfZG1hX2xvc3RfaXJxKGlkZV9kcml2ZV90ICopOwotZXh0ZXJuIHZvaWQgaWRlX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICopOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBzZmZfZG1hX29wczsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjb25maWdfZHJpdmVfZm9yX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUpIHsgcmV0dXJuIDA7IH0KICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUFfU0ZGICovCiAKK3ZvaWQgaWRlX2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqKTsKK3ZvaWQgaWRlX2RtYV90aW1lb3V0KGlkZV9kcml2ZV90ICopOworCiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaWRlX2lkX2RtYV9idWcoaWRlX2RyaXZlX3QgKmRyaXZlKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHU4IGlkZV9maW5kX2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpIHsgcmV0dXJuIDA7IH0KQEAgLTEyODcsMTEgKzE0NzcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGlkZV9kbWFfdmVyYm9zZShpZGVfZHJpdmVfdCAqZHJpdmUpIHsgOyB9CiBzdGF0aWMgaW5saW5lIGludCBpZGVfc2V0X2RtYShpZGVfZHJpdmVfdCAqZHJpdmUpIHsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfY2hlY2tfZG1hX2NyYyhpZGVfZHJpdmVfdCAqZHJpdmUpIHsgOyB9Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFRE1BICovCi0KLSNpZm5kZWYgQ09ORklHX0JMS19ERVZfSURFRE1BX1NGRgogc3RhdGljIGlubGluZSB2b2lkIGlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaWRlX2h3aWZfdCAqaHdpZikgeyA7IH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lERURNQSAqLwogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFQUNQSQogZXh0ZXJuIGludCBpZGVfYWNwaV9leGVjX3RmcyhpZGVfZHJpdmVfdCAqZHJpdmUpOwpAQCAtMTMxOSw3ICsxNTA2LDYgQEAKIAogdm9pZCBpZGVfcG9ydF9hcHBseV9wYXJhbXMoaWRlX2h3aWZfdCAqKTsKIAotc3RydWN0IGlkZV9ob3N0ICppZGVfaG9zdF9hbGxvY19hbGwoY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKiwgaHdfcmVnc190ICoqKTsKIHN0cnVjdCBpZGVfaG9zdCAqaWRlX2hvc3RfYWxsb2MoY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gKiwgaHdfcmVnc190ICoqKTsKIHZvaWQgaWRlX2hvc3RfZnJlZShzdHJ1Y3QgaWRlX2hvc3QgKik7CiBpbnQgaWRlX2hvc3RfcmVnaXN0ZXIoc3RydWN0IGlkZV9ob3N0ICosIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICosCkBAIC0xMzQ1LDI0ICsxNTMxLDYgQEAKIGV4dGVybiB2b2lkIGlkZV90b2dnbGVfYm91bmNlKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG9uKTsKIGV4dGVybiBpbnQgaWRlX3NldF94ZmVyX3JhdGUoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCByYXRlKTsKIAotc3RhdGljIGlubGluZSBpbnQgaWRlX2Rldl9oYXNfaW9yZHkoc3RydWN0IGhkX2RyaXZlaWQgKmlkKQotewotCXJldHVybiAoKGlkLT5maWVsZF92YWxpZCAmIDIpICYmIChpZC0+Y2FwYWJpbGl0eSAmIDgpKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpZGVfZGV2X2lzX3NhdGEoc3RydWN0IGhkX2RyaXZlaWQgKmlkKQotewotCS8qCi0JICogU2VlIGlmIHdvcmQgOTMgaXMgMCBBTkQgZHJpdmUgaXMgYXQgbGVhc3QgQVRBLTUgY29tcGF0aWJsZQotCSAqIHZlcmlmeWluZyB0aGF0IHdvcmQgODAgYnkgY2FzdGluZyBpdCB0byBhIHNpZ25lZCB0eXBlIC0tCi0JICogdGhpcyB0cmljayBhbGxvd3MgdXMgdG8gZmlsdGVyIG91dCB0aGUgcmVzZXJ2ZWQgdmFsdWVzIG9mCi0JICogMHgwMDAwIGFuZCAweGZmZmYgYWxvbmcgd2l0aCB0aGUgZWFybGllciBBVEEgcmV2aXNpb25zLi4uCi0JICovCi0JaWYgKGlkLT5od19jb25maWcgPT0gMCAmJiAoc2hvcnQpaWQtPm1ham9yX3Jldl9udW0gPj0gMHgwMDIwKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQogdTY0IGlkZV9nZXRfbGJhX2FkZHIoc3RydWN0IGlkZV90YXNrZmlsZSAqLCBpbnQpOwogdTggaWRlX2R1bXBfc3RhdHVzKGlkZV9kcml2ZV90ICosIGNvbnN0IGNoYXIgKiwgdTgpOwogCkBAIC0xNDM0LDEzICsxNjAyLDYgQEAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaWRlX2J1c190eXBlOwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqaWRlX3BvcnRfY2xhc3M7CiAKLS8qIGNoZWNrIGlmIENBQ0hFIEZMVVNIIChFWFQpIGNvbW1hbmQgaXMgc3VwcG9ydGVkIChiaXRzIGRlZmluZWQgaW4gQVRBLTYpICovCi0jZGVmaW5lIGlkZV9pZF9oYXNfZmx1c2hfY2FjaGUoaWQpCSgoaWQpLT5jZnNfZW5hYmxlXzIgJiAweDMwMDApCi0KLS8qIHNvbWUgTWF4dG9yIGRpc2tzIGhhdmUgYml0IDEzIGRlZmluZWQgaW5jb3JyZWN0bHkgc28gY2hlY2sgYml0IDEwIHRvbyAqLwotI2RlZmluZSBpZGVfaWRfaGFzX2ZsdXNoX2NhY2hlX2V4dChpZCkJXAotCSgoKGlkKS0+Y2ZzX2VuYWJsZV8yICYgMHgyNDAwKSA9PSAweDI0MDApCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfZHVtcF9pZGVudGlmeSh1OCAqaWQpCiB7CiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDIsIGlkLCA1MTIsIDApOwpAQCAtMTQ1MSwxMCArMTYxMiwxMCBAQAogCXJldHVybiBod2lmLT5kZXYgPyBkZXZfdG9fbm9kZShod2lmLT5kZXYpIDogLTE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaWRlX2RyaXZlX3QgKmlkZV9nZXRfcGFpcmVkX2RyaXZlKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyBpbmxpbmUgaWRlX2RyaXZlX3QgKmlkZV9nZXRfcGFpcl9kZXYoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfZHJpdmVfdCAqcGVlciA9ICZkcml2ZS0+aHdpZi0+ZHJpdmVzWyhkcml2ZS0+ZG4gXiAxKSAmIDFdOwogCi0JcmV0dXJuICZod2lmLT5kcml2ZXNbKGRyaXZlLT5kbiBeIDEpICYgMV07CisJcmV0dXJuIChwZWVyLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPyBwZWVyIDogTlVMTDsKIH0KICNlbmRpZiAvKiBfSURFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmggYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCmluZGV4IDdmNGRmN2MuLjE0MTI2YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaApAQCAtNDcxLDYgKzQ3MSwxMSBAQAogCXU4IGVhZGRyM1s2XTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBNZXNoIGZsYWdzICovCisjZGVmaW5lIE1FU0hfRkxBR1NfQUVfQTQgCTB4MQorI2RlZmluZSBNRVNIX0ZMQUdTX0FFX0E1X0E2CTB4MgorI2RlZmluZSBNRVNIX0ZMQUdTX1BTX0RFRVAJMHg0CisKIC8qKgogICogc3RydWN0IGllZWU4MDIxMV9xdWlldF9pZQogICoKQEAgLTY0Myw2ICs2NDgsOSBAQAogCX0gdTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBtZ210IGhlYWRlciArIDEgYnl0ZSBjYXRlZ29yeSBjb2RlICovCisjZGVmaW5lIElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFjdGlvbi51KQorCiAKIC8qIENvbnRyb2wgZnJhbWVzICovCiBzdHJ1Y3QgaWVlZTgwMjExX3J0cyB7CkBAIC03MDgsMTIgKzcxNiwxMyBAQAogCiAvKiA4MDIuMTFuIEhUIGNhcGFiaWxpdGllcyBtYXNrcyAqLwogI2RlZmluZSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSAkJMHgwMDAyCi0jZGVmaW5lIElFRUU4MDIxMV9IVF9DQVBfTUlNT19QUwkJMHgwMDBDCisjZGVmaW5lIElFRUU4MDIxMV9IVF9DQVBfU01fUFMJCQkweDAwMEMKICNkZWZpbmUgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxECQkweDAwMTAKICNkZWZpbmUgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAJCQkweDAwMjAKICNkZWZpbmUgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAJCQkweDAwNDAKICNkZWZpbmUgSUVFRTgwMjExX0hUX0NBUF9ERUxBWV9CQQkJMHgwNDAwCiAjZGVmaW5lIElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVCQkweDA4MDAKKyNkZWZpbmUgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDAJCTB4MTAwMAogLyogODAyLjExbiBIVCBjYXBhYmlsaXR5IEFNUERVIHNldHRpbmdzICovCiAjZGVmaW5lIElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfRkFDVE9SCQkweDAzCiAjZGVmaW5lIElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWQkJMHgxQwpAQCAtNzM2LDExICs3NDUsMjYgQEAKICNkZWZpbmUgSUVFRTgwMjExX0hUX0lFX05PTl9HRl9TVEFfUFJTTlQJMHgwMDA0CiAjZGVmaW5lIElFRUU4MDIxMV9IVF9JRV9OT05fSFRfU1RBX1BSU05UCTB4MDAxMAogCi0vKiBNSU1PIFBvd2VyIFNhdmUgTW9kZXMgKi8KLSNkZWZpbmUgV0xBTl9IVF9DQVBfTUlNT19QU19TVEFUSUMJMAotI2RlZmluZSBXTEFOX0hUX0NBUF9NSU1PX1BTX0RZTkFNSUMJMQotI2RlZmluZSBXTEFOX0hUX0NBUF9NSU1PX1BTX0lOVkFMSUQJMgotI2RlZmluZSBXTEFOX0hUX0NBUF9NSU1PX1BTX0RJU0FCTEVECTMKKy8qIGJsb2NrLWFjayBwYXJhbWV0ZXJzICovCisjZGVmaW5lIElFRUU4MDIxMV9BRERCQV9QQVJBTV9QT0xJQ1lfTUFTSyAweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLIDB4MDAzQworI2RlZmluZSBJRUVFODAyMTFfQUREQkFfUEFSQU1fQlVGX1NJWkVfTUFTSyAweEZGQTAKKyNkZWZpbmUgSUVFRTgwMjExX0RFTEJBX1BBUkFNX1RJRF9NQVNLIDB4RjAwMAorI2RlZmluZSBJRUVFODAyMTFfREVMQkFfUEFSQU1fSU5JVElBVE9SX01BU0sgMHgwODAwCisKKy8qCisgKiBBLVBNRFUgYnVmZmVyIHNpemVzCisgKiBBY2NvcmRpbmcgdG8gSUVFRTgwMi4xMW4gc3BlYyBzaXplIHZhcmllcyBmcm9tIDhLIHRvIDY0SyAoaW4gcG93ZXJzIG9mIDIpCisgKi8KKyNkZWZpbmUgSUVFRTgwMjExX01JTl9BTVBEVV9CVUYgMHg4CisjZGVmaW5lIElFRUU4MDIxMV9NQVhfQU1QRFVfQlVGIDB4NDAKKworCisvKiBTcGF0aWFsIE11bHRpcGxleGluZyBQb3dlciBTYXZlIE1vZGVzICovCisjZGVmaW5lIFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQwkwCisjZGVmaW5lIFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUMJMQorI2RlZmluZSBXTEFOX0hUX0NBUF9TTV9QU19JTlZBTElECTIKKyNkZWZpbmUgV0xBTl9IVF9DQVBfU01fUFNfRElTQUJMRUQJMwogCiAvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCiAjZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWYuaCBiL2luY2x1ZGUvbGludXgvaWYuaAppbmRleCA1YzlkMWZhLi42NTI0Njg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZi5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4JCS8qIGZvciAiX191c2VyIiBldCBhbCAgICAgICAgICAgKi8KIAogI2RlZmluZQlJRk5BTVNJWgkxNgorI2RlZmluZQlJRkFMSUFTWgkyNTYKICNpbmNsdWRlIDxsaW51eC9oZGxjL2lvY3RsLmg+CiAKIC8qIFN0YW5kYXJkIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5mbGFncykuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKaW5kZXggZTE1N2MxMy4uN2YzYzczNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgogICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgotICoJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCUFsYW4gQ294LCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNTYsNiArNTYsNyBAQAogI2RlZmluZSBFVEhfUF9ESUFHICAgICAgMHg2MDA1ICAgICAgICAgIC8qIERFQyBEaWFnbm9zdGljcyAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRVRIX1BfQ1VTVCAgICAgIDB4NjAwNiAgICAgICAgICAvKiBERUMgQ3VzdG9tZXIgdXNlICAgICAgICAgICAgICovCiAjZGVmaW5lIEVUSF9QX1NDQSAgICAgICAweDYwMDcgICAgICAgICAgLyogREVDIFN5c3RlbXMgQ29tbXMgQXJjaCAgICAgICAqLworI2RlZmluZSBFVEhfUF9URUIJMHg2NTU4CQkvKiBUcmFucyBFdGhlciBCcmlkZ2luZwkJKi8KICNkZWZpbmUgRVRIX1BfUkFSUCAgICAgIDB4ODAzNQkJLyogUmV2ZXJzZSBBZGRyIFJlcyBwYWNrZXQJKi8KICNkZWZpbmUgRVRIX1BfQVRBTEsJMHg4MDlCCQkvKiBBcHBsZXRhbGsgRERQCQkqLwogI2RlZmluZSBFVEhfUF9BQVJQCTB4ODBGMwkJLyogQXBwbGV0YWxrIEFBUlAJCSovCkBAIC03NCw4ICs3NSwxMCBAQAogI2RlZmluZSBFVEhfUF9BVE1GQVRFCTB4ODg4NAkJLyogRnJhbWUtYmFzZWQgQVRNIFRyYW5zcG9ydAogCQkJCQkgKiBvdmVyIEV0aGVybmV0CiAJCQkJCSAqLworI2RlZmluZSBFVEhfUF9QQUUJMHg4ODhFCQkvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLwogI2RlZmluZSBFVEhfUF9BT0UJMHg4OEEyCQkvKiBBVEEgb3ZlciBFdGhlcm5ldAkJKi8KICNkZWZpbmUgRVRIX1BfVElQQwkweDg4Q0EJCS8qIFRJUEMgCQkJKi8KKyNkZWZpbmUgRVRIX1BfRURTQQkweERBREEJCS8qIEV0aGVydHlwZSBEU0EgWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KIAogLyoKICAqCU5vbiBESVggdHlwZXMuIFdvbid0IGNsYXNoIGZvciAxNTAwIHR5cGVzLgpAQCAtOTksNiArMTAyLDkgQEAKICNkZWZpbmUgRVRIX1BfRUNPTkVUCTB4MDAxOAkJLyogQWNvcm4gRWNvbmV0CQkJKi8KICNkZWZpbmUgRVRIX1BfSERMQwkweDAwMTkJCS8qIEhETEMgZnJhbWVzCQkJKi8KICNkZWZpbmUgRVRIX1BfQVJDTkVUCTB4MDAxQQkJLyogMUEgZm9yIEFyY05ldCA6LSkgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9EU0EJMHgwMDFCCQkvKiBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaC4JKi8KKyNkZWZpbmUgRVRIX1BfVFJBSUxFUgkweDAwMUMJCS8qIFRyYWlsZXIgc3dpdGNoIHRhZ2dpbmcJKi8KKyNkZWZpbmUgRVRIX1BfUEhPTkVUCTB4MDBGNQkJLyogTm9raWEgUGhvbmV0IGZyYW1lcyAgICAgICAgICAqLwogCiAvKgogICoJVGhpcyBpcyBhbiBFdGhlcm5ldCBmcmFtZSBoZWFkZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2ZkZGkuaCBiL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oCmluZGV4IGFlNzdkYWUuLjQ1ZGUxMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oCkBAIC0xMiw3ICsxMiw3IEBACiAgKgkJaWZfZmRkaS5oIGlzIGJhc2VkIG9uIHByZXZpb3VzIGlmX2V0aGVyLmggYW5kIGlmX3RyLmggd29yayBieQogICoJCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KICAqCQkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+Ci0gKgkJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQkJU3RldmUgV2hpdGVob3VzZSwgPGd3N3JybUBlZXNoYWNrMy5zd2FuLmFjLnVrPgogICoJCQlQZXRlciBEZSBTY2hyaWp2ZXIsIDxzdHVkMTFAY2M0Lmt1bGV1dmVuLmFjLmJlPgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaCBiL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaAppbmRleCA5NGQzMWNhLi5mMGYyMzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9oaXBwaS5oCkBAIC05LDcgKzksNyBAQAogICoKICAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+Ci0gKgkJQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkJU3RldmUgV2hpdGVob3VzZSwgPGd3N3JybUBlZXNoYWNrMy5zd2FuLmFjLnVrPgogICoJCUplcyBTb3JlbnNlbiwgPEplcy5Tb3JlbnNlbkBjZXJuLmNoPgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKaW5kZXggODRjMzQ5Mi4uZjkwMzJjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTc5LDYgKzc5LDcgQEAKIAlJRkxBX0xJTktJTkZPLAogI2RlZmluZSBJRkxBX0xJTktJTkZPIElGTEFfTElOS0lORk8KIAlJRkxBX05FVF9OU19QSUQsCisJSUZMQV9JRkFMSUFTLAogCV9fSUZMQV9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfcGhvbmV0LmggYi9pbmNsdWRlL2xpbnV4L2lmX3Bob25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDAzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3Bob25ldC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBGaWxlOiBpZl9waG9uZXQuaAorICoKKyAqIFBob25ldCBpbnRlcmZhY2Uga2VybmVsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisjaWZuZGVmIExJTlVYX0lGX1BIT05FVF9ICisjZGVmaW5lIExJTlVYX0lGX1BIT05FVF9ICisKKyNkZWZpbmUgUEhPTkVUX01JTl9NVFUJCTYJLyogcG5fbGVuZ3RoID0gMCAqLworI2RlZmluZSBQSE9ORVRfTUFYX01UVQkJNjU1NDEJLyogcG5fbGVuZ3RoID0gMHhmZmZmICovCisjZGVmaW5lIFBIT05FVF9ERVZfTVRVCQlQSE9ORVRfTUFYX01UVQorCisjaWZkZWYgX19LRVJORUxfXworZXh0ZXJuIHN0cnVjdCBoZWFkZXJfb3BzIHBob25ldF9oZWFkZXJfb3BzOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaCBiL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKaW5kZXggZDRlZmU0MC4uYWVhYjJjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfSUZfVFVOTkVMX0hfCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAKICNkZWZpbmUgU0lPQ0dFVFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDApCiAjZGVmaW5lIFNJT0NBRERUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQpAQCAtNDcsNCArNDgsMjIgQEAKIC8qIFBSTCBmbGFncyAqLwogI2RlZmluZQlQUkxfREVGQVVMVAkJMHgwMDAxCiAKK2VudW0KK3sKKwlJRkxBX0dSRV9VTlNQRUMsCisJSUZMQV9HUkVfTElOSywKKwlJRkxBX0dSRV9JRkxBR1MsCisJSUZMQV9HUkVfT0ZMQUdTLAorCUlGTEFfR1JFX0lLRVksCisJSUZMQV9HUkVfT0tFWSwKKwlJRkxBX0dSRV9MT0NBTCwKKwlJRkxBX0dSRV9SRU1PVEUsCisJSUZMQV9HUkVfVFRMLAorCUlGTEFfR1JFX1RPUywKKwlJRkxBX0dSRV9QTVRVRElTQywKKwlfX0lGTEFfR1JFX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9HUkVfTUFYCShfX0lGTEFfR1JFX01BWCAtIDEpCisKICNlbmRpZiAvKiBfSUZfVFVOTkVMX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDdiYjNjMDkuLmY3MzRhMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0yLDcgKzIsNyBAQAogICoJTGludXggTkVUMzoJSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCAgW0lHTVBdCiAgKgogICoJQXV0aG9yczoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJRXh0ZW5kZWQgdG8gdGFsayB0aGUgQlNEIGV4dGVuZGVkIElHTVAgcHJvdG9jb2wgb2YgbXJvdXRlZCAzLjYKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luLmggYi9pbmNsdWRlL2xpbnV4L2luLmgKaW5kZXggNDA2NTMxMy4uZGI0NThiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW4uaApAQCAtNzUsNiArNzUsNyBAQAogI2RlZmluZSBJUF9JUFNFQ19QT0xJQ1kJMTYKICNkZWZpbmUgSVBfWEZSTV9QT0xJQ1kJMTcKICNkZWZpbmUgSVBfUEFTU1NFQwkxOAorI2RlZmluZSBJUF9UUkFOU1BBUkVOVAkxOQogCiAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBJUF9SRUNWUkVUT1BUUwlJUF9SRVRPUFRTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvaW5ldGRldmljZS5oCmluZGV4IGM2ZjUxYWQuLjA2ZmNkYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5ldGRldmljZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAJc3RydWN0IGluX2lmYWRkcgkqaWZhX2xpc3Q7CS8qIElQIGlmYWRkciBjaGFpbgkJKi8KIAlyd2xvY2tfdAkJbWNfbGlzdF9sb2NrOwogCXN0cnVjdCBpcF9tY19saXN0CSptY19saXN0OwkvKiBJUCBtdWx0aWNhc3QgZmlsdGVyIGNoYWluICAgICovCisJaW50CQkJbWNfY291bnQ7CSAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5zdGFsbGVkIG1jYXN0cwkqLwogCXNwaW5sb2NrX3QJCW1jX3RvbWJfbG9jazsKIAlzdHJ1Y3QgaXBfbWNfbGlzdAkqbWNfdG9tYjsKIAl1bnNpZ25lZCBsb25nCQltcl92MV9zZWVuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCA5MzUzOGI2Li5hZDYzODI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMjMzLDkgKzIzMyw2IEBACiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoKHNpemVvZihsb25nKSkpKSkJXAogCQk9IHsgX19zZXR1cF9zdHJfIyN1bmlxdWVfaWQsIGZuLCBlYXJseSB9CiAKLSNkZWZpbmUgX19zZXR1cF9udWxsX3BhcmFtKHN0ciwgdW5pcXVlX2lkKQkJCVwKLQlfX3NldHVwX3BhcmFtKHN0ciwgdW5pcXVlX2lkLCBOVUxMLCAwKQotCiAjZGVmaW5lIF9fc2V0dXAoc3RyLCBmbikJCQkJCVwKIAlfX3NldHVwX3BhcmFtKHN0ciwgZm4sIGZuLCAwKQogCkBAIC0yOTYsNyArMjkzLDYgQEAKIAl2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpIF9fYXR0cmlidXRlX18oKGFsaWFzKCNleGl0Zm4pKSk7CiAKICNkZWZpbmUgX19zZXR1cF9wYXJhbShzdHIsIHVuaXF1ZV9pZCwgZm4pCS8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgX19zZXR1cF9udWxsX3BhcmFtKHN0ciwgdW5pcXVlX2lkKSAJLyogbm90aGluZyAqLwogI2RlZmluZSBfX3NldHVwKHN0ciwgZnVuYykgCQkJLyogbm90aGluZyAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCBhNTgwMmM5Li5iODZmYjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC01NzcsOSArNTc3LDIyIEBACiAjZGVmaW5lIEtFWV9CUkxfRE9UOQkJMHgxZjkKICNkZWZpbmUgS0VZX0JSTF9ET1QxMAkJMHgxZmEKIAorI2RlZmluZSBLRVlfTlVNRVJJQ18wCQkweDIwMAkvKiB1c2VkIGJ5IHBob25lcywgcmVtb3RlIGNvbnRyb2xzLCAqLworI2RlZmluZSBLRVlfTlVNRVJJQ18xCQkweDIwMQkvKiBhbmQgb3RoZXIga2V5cGFkcyAqLworI2RlZmluZSBLRVlfTlVNRVJJQ18yCQkweDIwMgorI2RlZmluZSBLRVlfTlVNRVJJQ18zCQkweDIwMworI2RlZmluZSBLRVlfTlVNRVJJQ180CQkweDIwNAorI2RlZmluZSBLRVlfTlVNRVJJQ181CQkweDIwNQorI2RlZmluZSBLRVlfTlVNRVJJQ182CQkweDIwNgorI2RlZmluZSBLRVlfTlVNRVJJQ183CQkweDIwNworI2RlZmluZSBLRVlfTlVNRVJJQ184CQkweDIwOAorI2RlZmluZSBLRVlfTlVNRVJJQ185CQkweDIwOQorI2RlZmluZSBLRVlfTlVNRVJJQ19TVEFSCTB4MjBhCisjZGVmaW5lIEtFWV9OVU1FUklDX1BPVU5ECTB4MjBiCisKIC8qIFdlIGF2b2lkIGxvdyBjb21tb24ga2V5cyBpbiBtb2R1bGUgYWxpYXNlcyBzbyB0aGV5IGRvbid0IGdldCBodWdlLiAqLwogI2RlZmluZSBLRVlfTUlOX0lOVEVSRVNUSU5HCUtFWV9NVVRFCi0jZGVmaW5lIEtFWV9NQVgJCQkweDFmZgorI2RlZmluZSBLRVlfTUFYCQkJMHgyZmYKICNkZWZpbmUgS0VZX0NOVAkJCShLRVlfTUFYKzEpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVsLWlvbW11LmggYi9pbmNsdWRlL2xpbnV4L2ludGVsLWlvbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMTdmMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZWwtaW9tbXUuaApAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEFzaG9rIFJhaiA8YXNob2sucmFqQGludGVsLmNvbT4KKyAqIEF1dGhvcjogQW5pbCBTIEtlc2hhdmFtdXJ0aHkgPGFuaWwucy5rZXNoYXZhbXVydGh5QGludGVsLmNvbT4KKyAqLworCisjaWZuZGVmIF9JTlRFTF9JT01NVV9IXworI2RlZmluZSBfSU5URUxfSU9NTVVfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW92YS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hX3JlbWFwcGluZy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKy8qCisgKiBJbnRlbCBJT01NVSByZWdpc3RlciBzcGVjaWZpY2F0aW9uIHBlciB2ZXJzaW9uIDEuMCBwdWJsaWMgc3BlYy4KKyAqLworCisjZGVmaW5lCURNQVJfVkVSX1JFRwkweDAJLyogQXJjaCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGlzIElPTU1VICovCisjZGVmaW5lCURNQVJfQ0FQX1JFRwkweDgJLyogSGFyZHdhcmUgc3VwcG9ydGVkIGNhcGFiaWxpdGllcyAqLworI2RlZmluZQlETUFSX0VDQVBfUkVHCTB4MTAJLyogRXh0ZW5kZWQgY2FwYWJpbGl0aWVzIHN1cHBvcnRlZCAqLworI2RlZmluZQlETUFSX0dDTURfUkVHCTB4MTgJLyogR2xvYmFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BUl9HU1RTX1JFRwkweDFjCS8qIEdsb2JhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BUl9SVEFERFJfUkVHCTB4MjAJLyogUm9vdCBlbnRyeSB0YWJsZSAqLworI2RlZmluZQlETUFSX0NDTURfUkVHCTB4MjgJLyogQ29udGV4dCBjb21tYW5kIHJlZyAqLworI2RlZmluZQlETUFSX0ZTVFNfUkVHCTB4MzQJLyogRmF1bHQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCURNQVJfRkVDVExfUkVHCTB4MzgJLyogRmF1bHQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlETUFSX0ZFREFUQV9SRUcJMHgzYwkvKiBGYXVsdCBldmVudCBpbnRlcnJ1cHQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZQlETUFSX0ZFQUREUl9SRUcJMHg0MAkvKiBGYXVsdCBldmVudCBpbnRlcnJ1cHQgYWRkciByZWdpc3RlciAqLworI2RlZmluZQlETUFSX0ZFVUFERFJfUkVHIDB4NDQJLyogVXBwZXIgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZQlETUFSX0FGTE9HX1JFRwkweDU4CS8qIEFkdmFuY2VkIEZhdWx0IGNvbnRyb2wgKi8KKyNkZWZpbmUJRE1BUl9QTUVOX1JFRwkweDY0CS8qIEVuYWJsZSBQcm90ZWN0ZWQgTWVtb3J5IFJlZ2lvbiAqLworI2RlZmluZQlETUFSX1BMTUJBU0VfUkVHIDB4NjgJLyogUE1SUiBMb3cgYWRkciAqLworI2RlZmluZQlETUFSX1BMTUxJTUlUX1JFRyAweDZjCS8qIFBNUlIgbG93IGxpbWl0ICovCisjZGVmaW5lCURNQVJfUEhNQkFTRV9SRUcgMHg3MAkvKiBwbXJyIGhpZ2ggYmFzZSBhZGRyICovCisjZGVmaW5lCURNQVJfUEhNTElNSVRfUkVHIDB4NzgJLyogcG1yciBoaWdoIGxpbWl0ICovCisjZGVmaW5lIERNQVJfSVFIX1JFRwkweDgwCS8qIEludmFsaWRhdGlvbiBxdWV1ZSBoZWFkIHJlZ2lzdGVyICovCisjZGVmaW5lIERNQVJfSVFUX1JFRwkweDg4CS8qIEludmFsaWRhdGlvbiBxdWV1ZSB0YWlsIHJlZ2lzdGVyICovCisjZGVmaW5lIERNQVJfSVFBX1JFRwkweDkwCS8qIEludmFsaWRhdGlvbiBxdWV1ZSBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIERNQVJfSUNTX1JFRwkweDk4CS8qIEludmFsaWRhdGlvbiBjb21wbGV0ZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BUl9JUlRBX1JFRwkweGI4ICAgIC8qIEludGVycnVwdCByZW1hcHBpbmcgdGFibGUgYWRkciByZWdpc3RlciAqLworCisjZGVmaW5lIE9GRlNFVF9TVFJJREUJCSg5KQorLyoKKyNkZWZpbmUgZG1hcl9yZWFkbChkbWFyLCByZWcpIHJlYWRsKGRtYXIgKyByZWcpCisjZGVmaW5lIGRtYXJfcmVhZHEoZG1hciwgcmVnKSAoeyBcCisJCXUzMiBsbywgaGk7IFwKKwkJbG8gPSByZWFkbChkbWFyICsgcmVnKTsgXAorCQloaSA9IHJlYWRsKGRtYXIgKyByZWcgKyA0KTsgXAorCQkoKCh1NjQpIGhpKSA8PCAzMikgKyBsbzsgfSkKKyovCitzdGF0aWMgaW5saW5lIHU2NCBkbWFyX3JlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgbG8sIGhpOworCWxvID0gcmVhZGwoYWRkcik7CisJaGkgPSByZWFkbChhZGRyICsgNCk7CisJcmV0dXJuICgoKHU2NCkgaGkpIDw8IDMyKSArIGxvOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hcl93cml0ZXEodm9pZCBfX2lvbWVtICphZGRyLCB1NjQgdmFsKQoreworCXdyaXRlbCgodTMyKXZhbCwgYWRkcik7CisJd3JpdGVsKCh1MzIpKHZhbCA+PiAzMiksIGFkZHIgKyA0KTsKK30KKworI2RlZmluZSBETUFSX1ZFUl9NQUpPUih2KQkJKCgodikgJiAweGYwKSA+PiA0KQorI2RlZmluZSBETUFSX1ZFUl9NSU5PUih2KQkJKCh2KSAmIDB4MGYpCisKKy8qCisgKiBEZWNvZGluZyBDYXBhYmlsaXR5IFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgY2FwX3JlYWRfZHJhaW4oYykJKCgoYykgPj4gNTUpICYgMSkKKyNkZWZpbmUgY2FwX3dyaXRlX2RyYWluKGMpCSgoKGMpID4+IDU0KSAmIDEpCisjZGVmaW5lIGNhcF9tYXhfYW1hc2tfdmFsKGMpCSgoKGMpID4+IDQ4KSAmIDB4M2YpCisjZGVmaW5lIGNhcF9udW1fZmF1bHRfcmVncyhjKQkoKCgoYykgPj4gNDApICYgMHhmZikgKyAxKQorI2RlZmluZSBjYXBfcGdzZWxfaW52KGMpCSgoKGMpID4+IDM5KSAmIDEpCisKKyNkZWZpbmUgY2FwX3N1cGVyX3BhZ2VfdmFsKGMpCSgoKGMpID4+IDM0KSAmIDB4ZikKKyNkZWZpbmUgY2FwX3N1cGVyX29mZnNldChjKQkoKChmaW5kX2ZpcnN0X2JpdCgmY2FwX3N1cGVyX3BhZ2VfdmFsKGMpLCA0KSkgXAorCQkJCQkqIE9GRlNFVF9TVFJJREUpICsgMjEpCisKKyNkZWZpbmUgY2FwX2ZhdWx0X3JlZ19vZmZzZXQoYykJKCgoKGMpID4+IDI0KSAmIDB4M2ZmKSAqIDE2KQorI2RlZmluZSBjYXBfbWF4X2ZhdWx0X3JlZ19vZmZzZXQoYykgXAorCShjYXBfZmF1bHRfcmVnX29mZnNldChjKSArIGNhcF9udW1fZmF1bHRfcmVncyhjKSAqIDE2KQorCisjZGVmaW5lIGNhcF96bHIoYykJCSgoKGMpID4+IDIyKSAmIDEpCisjZGVmaW5lIGNhcF9pc29jaChjKQkJKCgoYykgPj4gMjMpICYgMSkKKyNkZWZpbmUgY2FwX21nYXcoYykJCSgoKChjKSA+PiAxNikgJiAweDNmKSArIDEpCisjZGVmaW5lIGNhcF9zYWdhdyhjKQkJKCgoYykgPj4gOCkgJiAweDFmKQorI2RlZmluZSBjYXBfY2FjaGluZ19tb2RlKGMpCSgoKGMpID4+IDcpICYgMSkKKyNkZWZpbmUgY2FwX3BobXIoYykJCSgoKGMpID4+IDYpICYgMSkKKyNkZWZpbmUgY2FwX3BsbXIoYykJCSgoKGMpID4+IDUpICYgMSkKKyNkZWZpbmUgY2FwX3J3YmYoYykJCSgoKGMpID4+IDQpICYgMSkKKyNkZWZpbmUgY2FwX2FmbChjKQkJKCgoYykgPj4gMykgJiAxKQorI2RlZmluZSBjYXBfbmRvbXMoYykJCSgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgKDQgKyAyICogKChjKSAmIDB4NykpKQorLyoKKyAqIEV4dGVuZGVkIENhcGFiaWxpdHkgUmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIGVjYXBfbmlvdGxiX2l1bml0cyhlKQkoKCgoZSkgPj4gMjQpICYgMHhmZikgKyAxKQorI2RlZmluZSBlY2FwX2lvdGxiX29mZnNldChlKSAJKCgoKGUpID4+IDgpICYgMHgzZmYpICogMTYpCisjZGVmaW5lIGVjYXBfbWF4X2lvdGxiX29mZnNldChlKSBcCisJKGVjYXBfaW90bGJfb2Zmc2V0KGUpICsgZWNhcF9uaW90bGJfaXVuaXRzKGUpICogMTYpCisjZGVmaW5lIGVjYXBfY29oZXJlbnQoZSkJKChlKSAmIDB4MSkKKyNkZWZpbmUgZWNhcF9xaXMoZSkJCSgoZSkgJiAweDIpCisjZGVmaW5lIGVjYXBfZWltX3N1cHBvcnQoZSkJKChlID4+IDQpICYgMHgxKQorI2RlZmluZSBlY2FwX2lyX3N1cHBvcnQoZSkJKChlID4+IDMpICYgMHgxKQorI2RlZmluZSBlY2FwX21heF9oYW5kbGVfbWFzayhlKSAoKGUgPj4gMjApICYgMHhmKQorCisKKy8qIElPVExCX1JFRyAqLworI2RlZmluZSBETUFfVExCX0dMT0JBTF9GTFVTSCAoKCh1NjQpMSkgPDwgNjApCisjZGVmaW5lIERNQV9UTEJfRFNJX0ZMVVNIICgoKHU2NCkyKSA8PCA2MCkKKyNkZWZpbmUgRE1BX1RMQl9QU0lfRkxVU0ggKCgodTY0KTMpIDw8IDYwKQorI2RlZmluZSBETUFfVExCX0lJUkcodHlwZSkgKCh0eXBlID4+IDYwKSAmIDcpCisjZGVmaW5lIERNQV9UTEJfSUFJRyh2YWwpICgoKHZhbCkgPj4gNTcpICYgNykKKyNkZWZpbmUgRE1BX1RMQl9SRUFEX0RSQUlOICgoKHU2NCkxKSA8PCA0OSkKKyNkZWZpbmUgRE1BX1RMQl9XUklURV9EUkFJTiAoKCh1NjQpMSkgPDwgNDgpCisjZGVmaW5lIERNQV9UTEJfRElEKGlkKQkoKCh1NjQpKChpZCkgJiAweGZmZmYpKSA8PCAzMikKKyNkZWZpbmUgRE1BX1RMQl9JVlQgKCgodTY0KTEpIDw8IDYzKQorI2RlZmluZSBETUFfVExCX0lIX05PTkxFQUYgKCgodTY0KTEpIDw8IDYpCisjZGVmaW5lIERNQV9UTEJfTUFYX1NJWkUgKDB4M2YpCisKKy8qIElOVkFMSURfREVTQyAqLworI2RlZmluZSBETUFfSURfVExCX0dMT0JBTF9GTFVTSAkoKCh1NjQpMSkgPDwgMykKKyNkZWZpbmUgRE1BX0lEX1RMQl9EU0lfRkxVU0gJKCgodTY0KTIpIDw8IDMpCisjZGVmaW5lIERNQV9JRF9UTEJfUFNJX0ZMVVNICSgoKHU2NCkzKSA8PCAzKQorI2RlZmluZSBETUFfSURfVExCX1JFQURfRFJBSU4JKCgodTY0KTEpIDw8IDcpCisjZGVmaW5lIERNQV9JRF9UTEJfV1JJVEVfRFJBSU4JKCgodTY0KTEpIDw8IDYpCisjZGVmaW5lIERNQV9JRF9UTEJfRElEKGlkKQkoKCh1NjQpKChpZCAmIDB4ZmZmZikgPDwgMTYpKSkKKyNkZWZpbmUgRE1BX0lEX1RMQl9JSF9OT05MRUFGCSgoKHU2NCkxKSA8PCA2KQorI2RlZmluZSBETUFfSURfVExCX0FERFIoYWRkcikJKGFkZHIpCisjZGVmaW5lIERNQV9JRF9UTEJfQUREUl9NQVNLKG1hc2spCShtYXNrKQorCisvKiBQTUVOX1JFRyAqLworI2RlZmluZSBETUFfUE1FTl9FUE0gKCgodTMyKTEpPDwzMSkKKyNkZWZpbmUgRE1BX1BNRU5fUFJTICgoKHUzMikxKTw8MCkKKworLyogR0NNRF9SRUcgKi8KKyNkZWZpbmUgRE1BX0dDTURfVEUgKCgodTMyKTEpIDw8IDMxKQorI2RlZmluZSBETUFfR0NNRF9TUlRQICgoKHUzMikxKSA8PCAzMCkKKyNkZWZpbmUgRE1BX0dDTURfU0ZMICgoKHUzMikxKSA8PCAyOSkKKyNkZWZpbmUgRE1BX0dDTURfRUFGTCAoKCh1MzIpMSkgPDwgMjgpCisjZGVmaW5lIERNQV9HQ01EX1dCRiAoKCh1MzIpMSkgPDwgMjcpCisjZGVmaW5lIERNQV9HQ01EX1FJRSAoKCh1MzIpMSkgPDwgMjYpCisjZGVmaW5lIERNQV9HQ01EX1NJUlRQICgoKHUzMikxKSA8PCAyNCkKKyNkZWZpbmUgRE1BX0dDTURfSVJFICgoKHUzMikgMSkgPDwgMjUpCisKKy8qIEdTVFNfUkVHICovCisjZGVmaW5lIERNQV9HU1RTX1RFUyAoKCh1MzIpMSkgPDwgMzEpCisjZGVmaW5lIERNQV9HU1RTX1JUUFMgKCgodTMyKTEpIDw8IDMwKQorI2RlZmluZSBETUFfR1NUU19GTFMgKCgodTMyKTEpIDw8IDI5KQorI2RlZmluZSBETUFfR1NUU19BRkxTICgoKHUzMikxKSA8PCAyOCkKKyNkZWZpbmUgRE1BX0dTVFNfV0JGUyAoKCh1MzIpMSkgPDwgMjcpCisjZGVmaW5lIERNQV9HU1RTX1FJRVMgKCgodTMyKTEpIDw8IDI2KQorI2RlZmluZSBETUFfR1NUU19JUlRQUyAoKCh1MzIpMSkgPDwgMjQpCisjZGVmaW5lIERNQV9HU1RTX0lSRVMgKCgodTMyKTEpIDw8IDI1KQorCisvKiBDQ01EX1JFRyAqLworI2RlZmluZSBETUFfQ0NNRF9JQ0MgKCgodTY0KTEpIDw8IDYzKQorI2RlZmluZSBETUFfQ0NNRF9HTE9CQUxfSU5WTCAoKCh1NjQpMSkgPDwgNjEpCisjZGVmaW5lIERNQV9DQ01EX0RPTUFJTl9JTlZMICgoKHU2NCkyKSA8PCA2MSkKKyNkZWZpbmUgRE1BX0NDTURfREVWSUNFX0lOVkwgKCgodTY0KTMpIDw8IDYxKQorI2RlZmluZSBETUFfQ0NNRF9GTShtKSAoKCh1NjQpKChtKSAmIDB4MykpIDw8IDMyKQorI2RlZmluZSBETUFfQ0NNRF9NQVNLX05PQklUIDAKKyNkZWZpbmUgRE1BX0NDTURfTUFTS18xQklUIDEKKyNkZWZpbmUgRE1BX0NDTURfTUFTS18yQklUIDIKKyNkZWZpbmUgRE1BX0NDTURfTUFTS18zQklUIDMKKyNkZWZpbmUgRE1BX0NDTURfU0lEKHMpICgoKHU2NCkoKHMpICYgMHhmZmZmKSkgPDwgMTYpCisjZGVmaW5lIERNQV9DQ01EX0RJRChkKSAoKHU2NCkoKGQpICYgMHhmZmZmKSkKKworLyogRkVDVExfUkVHICovCisjZGVmaW5lIERNQV9GRUNUTF9JTSAoKCh1MzIpMSkgPDwgMzEpCisKKy8qIEZTVFNfUkVHICovCisjZGVmaW5lIERNQV9GU1RTX1BQRiAoKHUzMikyKQorI2RlZmluZSBETUFfRlNUU19QRk8gKCh1MzIpMSkKKyNkZWZpbmUgZG1hX2ZzdHNfZmF1bHRfcmVjb3JkX2luZGV4KHMpICgoKHMpID4+IDgpICYgMHhmZikKKworLyogRlJDRF9SRUcsIDMyIGJpdHMgYWNjZXNzICovCisjZGVmaW5lIERNQV9GUkNEX0YgKCgodTMyKTEpIDw8IDMxKQorI2RlZmluZSBkbWFfZnJjZF90eXBlKGQpICgoZCA+PiAzMCkgJiAxKQorI2RlZmluZSBkbWFfZnJjZF9mYXVsdF9yZWFzb24oYykgKGMgJiAweGZmKQorI2RlZmluZSBkbWFfZnJjZF9zb3VyY2VfaWQoYykgKGMgJiAweGZmZmYpCisjZGVmaW5lIGRtYV9mcmNkX3BhZ2VfYWRkcihkKSAoZCAmICgoKHU2NCktMSkgPDwgMTIpKSAvKiBsb3cgNjQgYml0ICovCisKKyNkZWZpbmUgRE1BUl9PUEVSQVRJT05fVElNRU9VVCAoKGN5Y2xlc190KSB0c2Nfa2h6KjEwKjEwMDApIC8qIDEwc2VjICovCisKKyNkZWZpbmUgSU9NTVVfV0FJVF9PUChpb21tdSwgb2Zmc2V0LCBvcCwgY29uZCwgc3RzKSBcCit7XAorCWN5Y2xlc190IHN0YXJ0X3RpbWUgPSBnZXRfY3ljbGVzKCk7XAorCXdoaWxlICgxKSB7XAorCQlzdHMgPSBvcCAoaW9tbXUtPnJlZyArIG9mZnNldCk7XAorCQlpZiAoY29uZClcCisJCQlicmVhaztcCisJCWlmIChETUFSX09QRVJBVElPTl9USU1FT1VUIDwgKGdldF9jeWNsZXMoKSAtIHN0YXJ0X3RpbWUpKVwKKwkJCXBhbmljKCJETUFSIGhhcmR3YXJlIGlzIG1hbGZ1bmN0aW9uaW5nXG4iKTtcCisJCWNwdV9yZWxheCgpO1wKKwl9XAorfQorCisjZGVmaW5lIFFJX0xFTkdUSAkyNTYJLyogcXVldWUgbGVuZ3RoICovCisKK2VudW0geworCVFJX0ZSRUUsCisJUUlfSU5fVVNFLAorCVFJX0RPTkUKK307CisKKyNkZWZpbmUgUUlfQ0NfVFlQRQkJMHgxCisjZGVmaW5lIFFJX0lPVExCX1RZUEUJCTB4MgorI2RlZmluZSBRSV9ESU9UTEJfVFlQRQkJMHgzCisjZGVmaW5lIFFJX0lFQ19UWVBFCQkweDQKKyNkZWZpbmUgUUlfSVdEX1RZUEUJCTB4NQorCisjZGVmaW5lIFFJX0lFQ19TRUxFQ1RJVkUJKCgodTY0KTEpIDw8IDQpCisjZGVmaW5lIFFJX0lFQ19JSURFWChpZHgpCSgoKHU2NCkoaWR4ICYgMHhmZmZmKSA8PCAzMikpCisjZGVmaW5lIFFJX0lFQ19JTShtKQkJKCgodTY0KShtICYgMHgxZikgPDwgMjcpKQorCisjZGVmaW5lIFFJX0lXRF9TVEFUVVNfREFUQShkKQkoKCh1NjQpZCkgPDwgMzIpCisjZGVmaW5lIFFJX0lXRF9TVEFUVVNfV1JJVEUJKCgodTY0KTEpIDw8IDUpCisKK3N0cnVjdCBxaV9kZXNjIHsKKwl1NjQgbG93LCBoaWdoOworfTsKKworc3RydWN0IHFfaW52YWwgeworCXNwaW5sb2NrX3QgICAgICBxX2xvY2s7CisJc3RydWN0IHFpX2Rlc2MgICpkZXNjOyAgICAgICAgICAvKiBpbnZhbGlkYXRpb24gcXVldWUgKi8KKwlpbnQgICAgICAgICAgICAgKmRlc2Nfc3RhdHVzOyAgIC8qIGRlc2Mgc3RhdHVzICovCisJaW50ICAgICAgICAgICAgIGZyZWVfaGVhZDsgICAgICAvKiBmaXJzdCBmcmVlIGVudHJ5ICovCisJaW50ICAgICAgICAgICAgIGZyZWVfdGFpbDsgICAgICAvKiBsYXN0IGZyZWUgZW50cnkgKi8KKwlpbnQgICAgICAgICAgICAgZnJlZV9jbnQ7Cit9OworCisjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKKy8qIDFNQiAtIG1heGltdW0gcG9zc2libGUgaW50ZXJydXB0IHJlbWFwcGluZyB0YWJsZSBzaXplICovCisjZGVmaW5lIElOVFJfUkVNQVBfUEFHRV9PUkRFUgk4CisjZGVmaW5lIElOVFJfUkVNQVBfVEFCTEVfUkVHX1NJWkUJMHhmCisKKyNkZWZpbmUgSU5UUl9SRU1BUF9UQUJMRV9FTlRSSUVTCTY1NTM2CisKK3N0cnVjdCBpcl90YWJsZSB7CisJc3RydWN0IGlydGUgKmJhc2U7Cit9OworI2VuZGlmCisKK3N0cnVjdCBpbnRlbF9pb21tdSB7CisJdm9pZCBfX2lvbWVtCSpyZWc7IC8qIFBvaW50ZXIgdG8gaGFyZHdhcmUgcmVncywgdmlydHVhbCBhZGRyICovCisJdTY0CQljYXA7CisJdTY0CQllY2FwOworCWludAkJc2VnOworCXUzMgkJZ2NtZDsgLyogSG9sZHMgVEUsIEVBRkwuIERvbid0IG5lZWQgU1JUUCwgU0ZMLCBXQkYgKi8KKwlzcGlubG9ja190CXJlZ2lzdGVyX2xvY2s7IC8qIHByb3RlY3QgcmVnaXN0ZXIgaGFuZGxpbmcgKi8KKwlpbnQJCXNlcV9pZDsJLyogc2VxdWVuY2UgaWQgb2YgdGhlIGlvbW11ICovCisKKyNpZmRlZiBDT05GSUdfRE1BUgorCXVuc2lnbmVkIGxvbmcgCSpkb21haW5faWRzOyAvKiBiaXRtYXAgb2YgZG9tYWlucyAqLworCXN0cnVjdCBkbWFyX2RvbWFpbiAqKmRvbWFpbnM7IC8qIHB0ciB0byBkb21haW5zICovCisJc3BpbmxvY2tfdAlsb2NrOyAvKiBwcm90ZWN0IGNvbnRleHQsIGRvbWFpbiBpZHMgKi8KKwlzdHJ1Y3Qgcm9vdF9lbnRyeSAqcm9vdF9lbnRyeTsgLyogdmlydHVhbCBhZGRyZXNzICovCisKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGNoYXIgbmFtZVs3XTsgICAgLyogRGV2aWNlIE5hbWUgKi8KKwlzdHJ1Y3QgbXNpX21zZyBzYXZlZF9tc2c7CisJc3RydWN0IHN5c19kZXZpY2Ugc3lzZGV2OworI2VuZGlmCisJc3RydWN0IHFfaW52YWwgICpxaTsgICAgICAgICAgICAvKiBRdWV1ZWQgaW52YWxpZGF0aW9uIGluZm8gKi8KKyNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorCXN0cnVjdCBpcl90YWJsZSAqaXJfdGFibGU7CS8qIEludGVycnVwdCByZW1hcHBpbmcgaW5mbyAqLworI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21tdV9mbHVzaF9jYWNoZSgKKwlzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11LCB2b2lkICphZGRyLCBpbnQgc2l6ZSkKK3sKKwlpZiAoIWVjYXBfY29oZXJlbnQoaW9tbXUtPmVjYXApKQorCQljbGZsdXNoX2NhY2hlX3JhbmdlKGFkZHIsIHNpemUpOworfQorCitleHRlcm4gc3RydWN0IGRtYXJfZHJoZF91bml0ICogZG1hcl9maW5kX21hdGNoZWRfZHJoZF91bml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCitleHRlcm4gaW50IGFsbG9jX2lvbW11KHN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZCk7CitleHRlcm4gdm9pZCBmcmVlX2lvbW11KHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpOworZXh0ZXJuIGludCBkbWFyX2VuYWJsZV9xaShzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKK2V4dGVybiB2b2lkIHFpX2dsb2JhbF9pZWMoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CisKK2V4dGVybiB2b2lkIHFpX3N1Ym1pdF9zeW5jKHN0cnVjdCBxaV9kZXNjICpkZXNjLCBzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKKwordm9pZCBpbnRlbF9pb21tdV9kb21haW5fZXhpdChzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbik7CitzdHJ1Y3QgZG1hcl9kb21haW4gKmludGVsX2lvbW11X2RvbWFpbl9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitpbnQgaW50ZWxfaW9tbXVfY29udGV4dF9tYXBwaW5nKHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLAorCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2ludCBpbnRlbF9pb21tdV9wYWdlX21hcHBpbmcoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4sIGRtYV9hZGRyX3QgaW92YSwKKwkJCSAgICAgdTY0IGhwYSwgc2l6ZV90IHNpemUsIGludCBwcm90KTsKK3ZvaWQgaW50ZWxfaW9tbXVfZGV0YWNoX2RldihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdTggYnVzLCB1OCBkZXZmbik7CitzdHJ1Y3QgZG1hcl9kb21haW4gKmludGVsX2lvbW11X2ZpbmRfZG9tYWluKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3U2NCBpbnRlbF9pb21tdV9pb3ZhX3RvX3BmbihzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgdTY0IGlvdmEpOworCisjaWZkZWYgQ09ORklHX0RNQVIKK2ludCBpbnRlbF9pb21tdV9mb3VuZCh2b2lkKTsKKyNlbHNlIC8qIENPTkZJR19ETUFSICovCitzdGF0aWMgaW5saW5lIGludCBpbnRlbF9pb21tdV9mb3VuZCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19ETUFSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNThmZjRlNy4uNTRiMzYyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC0yNTIsNiArMjUyLDggQEAKIAlIUlRJTUVSX1NPRlRJUlEsCiAjZW5kaWYKIAlSQ1VfU09GVElSUSwgCS8qIFByZWZlcmFibGUgUkNVIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3Qgc29mdGlycSAqLworCisJTlJfU09GVElSUVMKIH07CiAKIC8qIHNvZnRpcnEgbWFzayBhbmQgYWN0aXZlIGZpZWxkcyBtb3ZlZCB0byBpcnFfY3B1c3RhdF90IGluCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvbW11LWhlbHBlci5oIGIvaW5jbHVkZS9saW51eC9pb21tdS1oZWxwZXIuaAppbmRleCBjOTc1Y2FmLi4zYjA2OGU1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb21tdS1oZWxwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvbW11LWhlbHBlci5oCkBAIC0xLDYgKzEsMjAgQEAKKyNpZm5kZWYgX0xJTlVYX0lPTU1VX0hFTFBFUl9ICisjZGVmaW5lIF9MSU5VWF9JT01NVV9IRUxQRVJfSAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW9tbXVfZGV2aWNlX21heF9pbmRleCh1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJCSAgIHU2NCBkbWFfbWFzaykKK3sKKwlpZiAoc2l6ZSArIG9mZnNldCA+IGRtYV9tYXNrKQorCQlyZXR1cm4gZG1hX21hc2sgLSBvZmZzZXQgKyAxOworCWVsc2UKKwkJcmV0dXJuIHNpemU7Cit9CisKIGV4dGVybiBpbnQgaW9tbXVfaXNfc3Bhbl9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBuciwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgc2hpZnQsCiAJCQkJICB1bnNpZ25lZCBsb25nIGJvdW5kYXJ5X3NpemUpOworZXh0ZXJuIHZvaWQgaW9tbXVfYXJlYV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgbG9uZyBpLCBpbnQgbGVuKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvbW11X2FyZWFfYWxsb2ModW5zaWduZWQgbG9uZyAqbWFwLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IG5yLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2hpZnQsCkBAIC04LDMgKzIyLDggQEAKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduX21hc2spOwogZXh0ZXJuIHZvaWQgaW9tbXVfYXJlYV9mcmVlKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbnIpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBpb21tdV9udW1fcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW9fcGFnZV9zaXplKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCA4ZDNiN2E5Li4wNDFlOTVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTM0LDcgKzM0LDggQEAKICAqLwogI2RlZmluZSBJT1JFU09VUkNFX0JJVFMJCTB4MDAwMDAwZmYJLyogQnVzLXNwZWNpZmljIGJpdHMgKi8KIAotI2RlZmluZSBJT1JFU09VUkNFX0lPCQkweDAwMDAwMTAwCS8qIFJlc291cmNlIHR5cGUgKi8KKyNkZWZpbmUgSU9SRVNPVVJDRV9UWVBFX0JJVFMJMHgwMDAwMGYwMAkvKiBSZXNvdXJjZSB0eXBlICovCisjZGVmaW5lIElPUkVTT1VSQ0VfSU8JCTB4MDAwMDAxMDAKICNkZWZpbmUgSU9SRVNPVVJDRV9NRU0JCTB4MDAwMDAyMDAKICNkZWZpbmUgSU9SRVNPVVJDRV9JUlEJCTB4MDAwMDA0MDAKICNkZWZpbmUgSU9SRVNPVVJDRV9ETUEJCTB4MDAwMDA4MDAKQEAgLTEwOCw2ICsxMDksOSBAQAogCiBleHRlcm4gaW50IHJlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldyk7CiBleHRlcm4gaW50IHJlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpuZXcpOworZXh0ZXJuIHZvaWQgcmVzZXJ2ZV9yZWdpb25fd2l0aF9zcGxpdChzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCisJCQkgICAgIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IGVuZCwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gaW50IGluc2VydF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwgc3RydWN0IHJlc291cmNlICpuZXcpOwogZXh0ZXJuIHZvaWQgaW5zZXJ0X3Jlc291cmNlX2V4cGFuZF90b19maXQoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldyk7CiBleHRlcm4gaW50IGFsbG9jYXRlX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpuZXcsCkBAIC0xMjMsNiArMTI3LDEwIEBACiB7CiAJcmV0dXJuIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CiB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfdHlwZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sKKwlyZXR1cm4gcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVFlQRV9CSVRTOworfQogCiAvKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgd2l0aCBhbGxvY2F0aW9uICovCiAjZGVmaW5lIHJlcXVlc3RfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJX19yZXF1ZXN0X3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSkKQEAgLTE1OSwxMyArMTY3LDE0IEBACiAJCQkJc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHJlc291cmNlX3NpemVfdCBzdGFydCwKIAkJCQlyZXNvdXJjZV9zaXplX3QgbiwgY29uc3QgY2hhciAqbmFtZSk7CiAKLSNkZWZpbmUgZGV2bV9yZWxlYXNlX3JlZ2lvbihzdGFydCxuKSBcCisjZGVmaW5lIGRldm1fcmVsZWFzZV9yZWdpb24oZGV2LCBzdGFydCwgbikgXAogCV9fZGV2bV9yZWxlYXNlX3JlZ2lvbihkZXYsICZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSkKLSNkZWZpbmUgZGV2bV9yZWxlYXNlX21lbV9yZWdpb24oc3RhcnQsbikgXAorI2RlZmluZSBkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihkZXYsIHN0YXJ0LCBuKSBcCiAJX19kZXZtX3JlbGVhc2VfcmVnaW9uKGRldiwgJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobikpCiAKIGV4dGVybiB2b2lkIF9fZGV2bV9yZWxlYXNlX3JlZ2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LAogCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3Qgbik7CitleHRlcm4gaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2socmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfTElOVVhfSU9QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdmEuaCBiL2luY2x1ZGUvbGludXgvaW92YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3BjaS9pb3ZhLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvaW92YS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwX3ZzLmggYi9pbmNsdWRlL2xpbnV4L2lwX3ZzLmgKaW5kZXggZWM2ZWI0OS4uMGY0MzRhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBfdnMuaApAQCAtMjQyLDQgKzI0MiwxNjQgQEAKIAlpbnQJCQlzeW5jaWQ7CiB9OwogCisvKgorICoKKyAqIElQVlMgR2VuZXJpYyBOZXRsaW5rIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqLworCisvKiBHZW5lcmljIE5ldGxpbmsgZmFtaWx5IGluZm8gKi8KKworI2RlZmluZSBJUFZTX0dFTkxfTkFNRQkJIklQVlMiCisjZGVmaW5lIElQVlNfR0VOTF9WRVJTSU9OCTB4MQorCitzdHJ1Y3QgaXBfdnNfZmxhZ3MgeworCV9fYmUzMiBmbGFnczsKKwlfX2JlMzIgbWFzazsKK307CisKKy8qIEdlbmVyaWMgTmV0bGluayBjb21tYW5kIGF0dHJpYnV0ZXMgKi8KK2VudW0geworCUlQVlNfQ01EX1VOU1BFQyA9IDAsCisKKwlJUFZTX0NNRF9ORVdfU0VSVklDRSwJCS8qIGFkZCBzZXJ2aWNlICovCisJSVBWU19DTURfU0VUX1NFUlZJQ0UsCQkvKiBtb2RpZnkgc2VydmljZSAqLworCUlQVlNfQ01EX0RFTF9TRVJWSUNFLAkJLyogZGVsZXRlIHNlcnZpY2UgKi8KKwlJUFZTX0NNRF9HRVRfU0VSVklDRSwJCS8qIGdldCBzZXJ2aWNlIGluZm8gKi8KKworCUlQVlNfQ01EX05FV19ERVNULAkJLyogYWRkIGRlc3RpbmF0aW9uICovCisJSVBWU19DTURfU0VUX0RFU1QsCQkvKiBtb2RpZnkgZGVzdGluYXRpb24gKi8KKwlJUFZTX0NNRF9ERUxfREVTVCwJCS8qIGRlbGV0ZSBkZXN0aW5hdGlvbiAqLworCUlQVlNfQ01EX0dFVF9ERVNULAkJLyogZ2V0IGRlc3RpbmF0aW9uIGluZm8gKi8KKworCUlQVlNfQ01EX05FV19EQUVNT04sCQkvKiBzdGFydCBzeW5jIGRhZW1vbiAqLworCUlQVlNfQ01EX0RFTF9EQUVNT04sCQkvKiBzdG9wIHN5bmMgZGFlbW9uICovCisJSVBWU19DTURfR0VUX0RBRU1PTiwJCS8qIGdldCBzeW5jIGRhZW1vbiBzdGF0dXMgKi8KKworCUlQVlNfQ01EX1NFVF9DT05GSUcsCQkvKiBzZXQgY29uZmlnIHNldHRpbmdzICovCisJSVBWU19DTURfR0VUX0NPTkZJRywJCS8qIGdldCBjb25maWcgc2V0dGluZ3MgKi8KKworCUlQVlNfQ01EX1NFVF9JTkZPLAkJLyogb25seSB1c2VkIGluIEdFVF9JTkZPIHJlcGx5ICovCisJSVBWU19DTURfR0VUX0lORk8sCQkvKiBnZXQgZ2VuZXJhbCBJUFZTIGluZm8gKi8KKworCUlQVlNfQ01EX1pFUk8sCQkJLyogemVybyBhbGwgY291bnRlcnMgYW5kIHN0YXRzICovCisJSVBWU19DTURfRkxVU0gsCQkJLyogZmx1c2ggc2VydmljZXMgYW5kIGRlc3RzICovCisKKwlfX0lQVlNfQ01EX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19DTURfTUFYIChfX0lQVlNfQ01EX01BWCAtIDEpCisKKy8qIEF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgZmlyc3QgbGV2ZWwgb2YgY29tbWFuZHMgKi8KK2VudW0geworCUlQVlNfQ01EX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0NNRF9BVFRSX1NFUlZJQ0UsCQkvKiBuZXN0ZWQgc2VydmljZSBhdHRyaWJ1dGUgKi8KKwlJUFZTX0NNRF9BVFRSX0RFU1QsCQkvKiBuZXN0ZWQgZGVzdGluYXRpb24gYXR0cmlidXRlICovCisJSVBWU19DTURfQVRUUl9EQUVNT04sCQkvKiBuZXN0ZWQgc3luYyBkYWVtb24gYXR0cmlidXRlICovCisJSVBWU19DTURfQVRUUl9USU1FT1VUX1RDUCwJLyogVENQIGNvbm5lY3Rpb24gdGltZW91dCAqLworCUlQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1BfRklOLAkvKiBUQ1AgRklOIHdhaXQgdGltZW91dCAqLworCUlQVlNfQ01EX0FUVFJfVElNRU9VVF9VRFAsCS8qIFVEUCB0aW1lb3V0ICovCisJX19JUFZTX0NNRF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19DTURfQVRUUl9NQVggKF9fSVBWU19TVkNfQVRUUl9NQVggLSAxKQorCisvKgorICogQXR0cmlidXRlcyB1c2VkIHRvIGRlc2NyaWJlIGEgc2VydmljZQorICoKKyAqIFVzZWQgaW5zaWRlIG5lc3RlZCBhdHRyaWJ1dGUgSVBWU19DTURfQVRUUl9TRVJWSUNFCisgKi8KK2VudW0geworCUlQVlNfU1ZDX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX1NWQ19BVFRSX0FGLAkJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwlJUFZTX1NWQ19BVFRSX1BST1RPQ09MLAkJLyogdmlydHVhbCBzZXJ2aWNlIHByb3RvY29sICovCisJSVBWU19TVkNfQVRUUl9BRERSLAkJLyogdmlydHVhbCBzZXJ2aWNlIGFkZHJlc3MgKi8KKwlJUFZTX1NWQ19BVFRSX1BPUlQsCQkvKiB2aXJ0dWFsIHNlcnZpY2UgcG9ydCAqLworCUlQVlNfU1ZDX0FUVFJfRldNQVJLLAkJLyogZmlyZXdhbGwgbWFyayBvZiBzZXJ2aWNlICovCisKKwlJUFZTX1NWQ19BVFRSX1NDSEVEX05BTUUsCS8qIG5hbWUgb2Ygc2NoZWR1bGVyICovCisJSVBWU19TVkNfQVRUUl9GTEFHUywJCS8qIHZpcnR1YWwgc2VydmljZSBmbGFncyAqLworCUlQVlNfU1ZDX0FUVFJfVElNRU9VVCwJCS8qIHBlcnNpc3RlbnQgdGltZW91dCAqLworCUlQVlNfU1ZDX0FUVFJfTkVUTUFTSywJCS8qIHBlcnNpc3RlbnQgbmV0bWFzayAqLworCisJSVBWU19TVkNfQVRUUl9TVEFUUywJCS8qIG5lc3RlZCBhdHRyaWJ1dGUgZm9yIHNlcnZpY2Ugc3RhdHMgKi8KKwlfX0lQVlNfU1ZDX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX1NWQ19BVFRSX01BWCAoX19JUFZTX1NWQ19BVFRSX01BWCAtIDEpCisKKy8qCisgKiBBdHRyaWJ1dGVzIHVzZWQgdG8gZGVzY3JpYmUgYSBkZXN0aW5hdGlvbiAocmVhbCBzZXJ2ZXIpCisgKgorICogVXNlZCBpbnNpZGUgbmVzdGVkIGF0dHJpYnV0ZSBJUFZTX0NNRF9BVFRSX0RFU1QKKyAqLworZW51bSB7CisJSVBWU19ERVNUX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0RFU1RfQVRUUl9BRERSLAkJLyogcmVhbCBzZXJ2ZXIgYWRkcmVzcyAqLworCUlQVlNfREVTVF9BVFRSX1BPUlQsCQkvKiByZWFsIHNlcnZlciBwb3J0ICovCisKKwlJUFZTX0RFU1RfQVRUUl9GV0RfTUVUSE9ELAkvKiBmb3J3YXJkaW5nIG1ldGhvZCAqLworCUlQVlNfREVTVF9BVFRSX1dFSUdIVCwJCS8qIGRlc3RpbmF0aW9uIHdlaWdodCAqLworCisJSVBWU19ERVNUX0FUVFJfVV9USFJFU0gsCS8qIHVwcGVyIHRocmVzaG9sZCAqLworCUlQVlNfREVTVF9BVFRSX0xfVEhSRVNILAkvKiBsb3dlciB0aHJlc2hvbGQgKi8KKworCUlQVlNfREVTVF9BVFRSX0FDVElWRV9DT05OUywJLyogYWN0aXZlIGNvbm5lY3Rpb25zICovCisJSVBWU19ERVNUX0FUVFJfSU5BQ1RfQ09OTlMsCS8qIGluYWN0aXZlIGNvbm5lY3Rpb25zICovCisJSVBWU19ERVNUX0FUVFJfUEVSU0lTVF9DT05OUywJLyogcGVyc2lzdGVudCBjb25uZWN0aW9ucyAqLworCisJSVBWU19ERVNUX0FUVFJfU1RBVFMsCQkvKiBuZXN0ZWQgYXR0cmlidXRlIGZvciBkZXN0IHN0YXRzICovCisJX19JUFZTX0RFU1RfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfREVTVF9BVFRSX01BWCAoX19JUFZTX0RFU1RfQVRUUl9NQVggLSAxKQorCisvKgorICogQXR0cmlidXRlcyBkZXNjcmliaW5nIGEgc3luYyBkYWVtb24KKyAqCisgKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlIElQVlNfQ01EX0FUVFJfREFFTU9OCisgKi8KK2VudW0geworCUlQVlNfREFFTU9OX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX0RBRU1PTl9BVFRSX1NUQVRFLAkJLyogc3luYyBkYWVtb24gc3RhdGUgKG1hc3Rlci9iYWNrdXApICovCisJSVBWU19EQUVNT05fQVRUUl9NQ0FTVF9JRk4sCS8qIG11bHRpY2FzdCBpbnRlcmZhY2UgbmFtZSAqLworCUlQVlNfREFFTU9OX0FUVFJfU1lOQ19JRCwJLyogU3luY0lEIHdlIGJlbG9uZyB0byAqLworCV9fSVBWU19EQUVNT05fQVRUUl9NQVgsCit9OworCisjZGVmaW5lIElQVlNfREFFTU9OX0FUVFJfTUFYIChfX0lQVlNfREFFTU9OX0FUVFJfTUFYIC0gMSkKKworLyoKKyAqIEF0dHJpYnV0ZXMgdXNlZCB0byBkZXNjcmliZSBzZXJ2aWNlIG9yIGRlc3RpbmF0aW9uIGVudHJ5IHN0YXRpc3RpY3MKKyAqCisgKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlcyBJUFZTX1NWQ19BVFRSX1NUQVRTIGFuZCBJUFZTX0RFU1RfQVRUUl9TVEFUUworICovCitlbnVtIHsKKwlJUFZTX1NUQVRTX0FUVFJfVU5TUEVDID0gMCwKKwlJUFZTX1NUQVRTX0FUVFJfQ09OTlMsCQkvKiBjb25uZWN0aW9ucyBzY2hlZHVsZWQgKi8KKwlJUFZTX1NUQVRTX0FUVFJfSU5QS1RTLAkJLyogaW5jb21pbmcgcGFja2V0cyAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRQS1RTLAkvKiBvdXRnb2luZyBwYWNrZXRzICovCisJSVBWU19TVEFUU19BVFRSX0lOQllURVMsCS8qIGluY29taW5nIGJ5dGVzICovCisJSVBWU19TVEFUU19BVFRSX09VVEJZVEVTLAkvKiBvdXRnb2luZyBieXRlcyAqLworCisJSVBWU19TVEFUU19BVFRSX0NQUywJCS8qIGN1cnJlbnQgY29ubmVjdGlvbiByYXRlICovCisJSVBWU19TVEFUU19BVFRSX0lOUFBTLAkJLyogY3VycmVudCBpbiBwYWNrZXQgcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9PVVRQUFMsCQkvKiBjdXJyZW50IG91dCBwYWNrZXQgcmF0ZSAqLworCUlQVlNfU1RBVFNfQVRUUl9JTkJQUywJCS8qIGN1cnJlbnQgaW4gYnl0ZSByYXRlICovCisJSVBWU19TVEFUU19BVFRSX09VVEJQUywJCS8qIGN1cnJlbnQgb3V0IGJ5dGUgcmF0ZSAqLworCV9fSVBWU19TVEFUU19BVFRSX01BWCwKK307CisKKyNkZWZpbmUgSVBWU19TVEFUU19BVFRSX01BWCAoX19JUFZTX1NUQVRTX0FUVFJfTUFYIC0gMSkKKworLyogQXR0cmlidXRlcyB1c2VkIGluIHJlc3BvbnNlIHRvIElQVlNfQ01EX0dFVF9JTkZPIGNvbW1hbmQgKi8KK2VudW0geworCUlQVlNfSU5GT19BVFRSX1VOU1BFQyA9IDAsCisJSVBWU19JTkZPX0FUVFJfVkVSU0lPTiwJCS8qIElQVlMgdmVyc2lvbiBudW1iZXIgKi8KKwlJUFZTX0lORk9fQVRUUl9DT05OX1RBQl9TSVpFLAkvKiBzaXplIG9mIGNvbm5lY3Rpb24gaGFzaCB0YWJsZSAqLworCV9fSVBWU19JTkZPX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBJUFZTX0lORk9fQVRUUl9NQVggKF9fSVBWU19JTkZPX0FUVFJfTUFYIC0gMSkKKwogI2VuZGlmCS8qIF9JUF9WU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA4Y2NiNDYyLi44ZDk0MTFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgSVJRX01PVkVfUEVORElORwkweDAwMjAwMDAwCS8qIG5lZWQgdG8gcmUtdGFyZ2V0IElSUSBkZXN0aW5hdGlvbiAqLwogI2RlZmluZSBJUlFfTk9fQkFMQU5DSU5HCTB4MDA0MDAwMDAJLyogSVJRIGlzIGV4Y2x1ZGVkIGZyb20gYmFsYW5jaW5nICovCiAjZGVmaW5lIElSUV9TUFVSSU9VU19ESVNBQkxFRAkweDAwODAwMDAwCS8qIElSUSB3YXMgZGlzYWJsZWQgYnkgdGhlIHNwdXJpb3VzIHRyYXAgKi8KKyNkZWZpbmUgSVJRX01PVkVfUENOVFhUCTB4MDEwMDAwMDAJLyogSVJRIG1pZ3JhdGlvbiBmcm9tIHByb2Nlc3MgY29udGV4dCAqLwogCiAjaWZkZWYgQ09ORklHX0lSUV9QRVJfQ1BVCiAjIGRlZmluZSBDSEVDS19JUlFfUEVSX0NQVSh2YXIpICgodmFyKSAmIElSUV9QRVJfQ1BVKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pc2RuX3BwcC5oIGIvaW5jbHVkZS9saW51eC9pc2RuX3BwcC5oCmluZGV4IDg2ODdhN2QuLjRjMjE4ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lzZG5fcHBwLmgKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIGludCBtcF9tcnJ1OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RydWN0IHNrX2J1ZmYgKiBmcmFnczsJLyogZnJhZ21lbnRzIHNsIGxpc3QgLS0gdXNlIHNrYi0+bmV4dCAqLworICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZyYWdzOwkvKiBmcmFnbWVudHMgc2wgbGlzdCAqLwogICBsb25nIGZyYW1lczsJCQkvKiBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBmcmFtZSBsaXN0ICovCiAgIHVuc2lnbmVkIGludCBzZXE7CQkvKiBsYXN0IHByb2Nlc3NlZCBwYWNrZXQgc2VxICM6IGFueSBwYWNrZXRzCiAgIAkJCQkgKiB3aXRoIHNtYWxsZXIgc2VxICMgd2lsbCBiZSBkcm9wcGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2l2dHYuaCBiL2luY2x1ZGUvbGludXgvaXZ0di5oCmluZGV4IDE3Y2E2NGIuLmYyNzIwMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXZ0di5oCisrKyBiL2luY2x1ZGUvbGludXgvaXZ0di5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKIC8qIGl2dHYga25vd3Mgc2V2ZXJhbCBkaXN0aW5jdCBvdXRwdXQgbW9kZXM6IE1QRUcgc3RyZWFtaW5nLAogICAgWVVWIHN0cmVhbWluZywgWVVWIHVwZGF0ZXMgdGhyb3VnaCB1c2VyIERNQSBhbmQgdGhlIHBhc3N0aHJvdWdoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZC5oIGIvaW5jbHVkZS9saW51eC9qYmQuaAppbmRleCAwN2E5YjUyLi43ZWJiY2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkLmgKQEAgLTYxLDcgKzYxLDcgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCWlmICgobikgPD0gam91cm5hbF9lbmFibGVfZGVidWcpIHsJCQlcCiAJCQlwcmludGsgKEtFUk5fREVCVUcgIiglcywgJWQpOiAlczogIiwJCVwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7CVwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsJXAogCQkJcHJpbnRrIChmLCAjIyBhKTsJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtOTg0LDcgKzk4NCw3IEBACiAKICNkZWZpbmUgamJkX0VOT1NZUygpIFwKIGRvIHsJCQkJCQkJCSAgICAgICAgICAgXAotCXByaW50ayAoS0VSTl9FUlIgIkpCRCB1bmltcGxlbWVudGVkIGZ1bmN0aW9uICVzXG4iLCBfX0ZVTkNUSU9OX18pOyBcCisJcHJpbnRrIChLRVJOX0VSUiAiSkJEIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXNcbiIsIF9fZnVuY19fKTsgXAogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CQkJICAgICAgICAgICBcCiAJc2NoZWR1bGUoKTsJCQkJCQkgICAgICAgICAgIFwKIH0gd2hpbGUgKDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IDNkZDIwOTAuLjQ2M2Q2ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC02MSw3ICs2MSw3IEBACiAJZG8gewkJCQkJCQkJXAogCQlpZiAoKG4pIDw9IGpiZDJfam91cm5hbF9lbmFibGVfZGVidWcpIHsJCQlcCiAJCQlwcmludGsgKEtFUk5fREVCVUcgIiglcywgJWQpOiAlczogIiwJCVwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7CVwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsJXAogCQkJcHJpbnRrIChmLCAjIyBhKTsJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtODUwLDcgKzg1MCw4IEBACiAJICovCiAJc3RydWN0IGJsb2NrX2RldmljZQkqal9kZXY7CiAJaW50CQkJal9ibG9ja3NpemU7Ci0JdW5zaWduZWQgbG9uZyBsb25nCQlqX2Jsa19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBsb25nCWpfYmxrX29mZnNldDsKKwljaGFyCQkJal9kZXZuYW1lW0JERVZOQU1FX1NJWkUrMjRdOwogCiAJLyoKIAkgKiBEZXZpY2Ugd2hpY2ggaG9sZHMgdGhlIGNsaWVudCBmcy4gIEZvciBpbnRlcm5hbCBqb3VybmFsIHRoaXMgd2lsbCBiZQpAQCAtOTY2LDYgKzk2Nyw5IEBACiAjZGVmaW5lIEpCRDJfRkxVU0hFRAkweDAwOAkvKiBUaGUgam91cm5hbCBzdXBlcmJsb2NrIGhhcyBiZWVuIGZsdXNoZWQgKi8KICNkZWZpbmUgSkJEMl9MT0FERUQJMHgwMTAJLyogVGhlIGpvdXJuYWwgc3VwZXJibG9jayBoYXMgYmVlbiBsb2FkZWQgKi8KICNkZWZpbmUgSkJEMl9CQVJSSUVSCTB4MDIwCS8qIFVzZSBJREUgYmFycmllcnMgKi8KKyNkZWZpbmUgSkJEMl9BQk9SVF9PTl9TWU5DREFUQV9FUlIJMHgwNDAJLyogQWJvcnQgdGhlIGpvdXJuYWwgb24gZmlsZQorCQkJCQkJICogZGF0YSB3cml0ZSBlcnJvciBpbiBvcmRlcmVkCisJCQkJCQkgKiBtb2RlICovCiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBqb3VybmFsaW5nIHRyYW5zYWN0aW9uIGFuZCBidWZmZXIKQEAgLTEwNTksNyArMTA2Myw3IEBACiAJCSAgIChqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9jcmVhdGUgICAgIChqb3VybmFsX3QgKik7CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9sb2FkICAgICAgIChqb3VybmFsX3QgKmpvdXJuYWwpOwotZXh0ZXJuIHZvaWQJICAgamJkMl9qb3VybmFsX2Rlc3Ryb3kgICAgKGpvdXJuYWxfdCAqKTsKK2V4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2Rlc3Ryb3kgICAgKGpvdXJuYWxfdCAqKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX3JlY292ZXIgICAgKGpvdXJuYWxfdCAqam91cm5hbCk7CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF93aXBlICAgICAgIChqb3VybmFsX3QgKiwgaW50KTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX3NraXBfcmVjb3ZlcnkJKGpvdXJuYWxfdCAqKTsKQEAgLTExMzksNyArMTE0Myw3IEBACiAKICNkZWZpbmUgamJkX0VOT1NZUygpIFwKIGRvIHsJCQkJCQkJCSAgICAgICAgICAgXAotCXByaW50ayAoS0VSTl9FUlIgIkpCRCB1bmltcGxlbWVudGVkIGZ1bmN0aW9uICVzXG4iLCBfX0ZVTkNUSU9OX18pOyBcCisJcHJpbnRrIChLRVJOX0VSUiAiSkJEIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXNcbiIsIF9fZnVuY19fKTsgXAogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CQkJICAgICAgICAgICBcCiAJc2NoZWR1bGUoKTsJCQkJCQkgICAgICAgICAgIFwKIH0gd2hpbGUgKDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2pvdXJuYWwtaGVhZC5oIGIvaW5jbHVkZS9saW51eC9qb3VybmFsLWhlYWQuaAppbmRleCA4YTYyZDFlLi5iYjcwZWJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2pvdXJuYWwtaGVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvam91cm5hbC1oZWFkLmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogYnVmZmVyX2hlYWQgZmllbGRzIGZvciBKQkQKICAqCi0gKiAyNyBNYXkgMjAwMSBBbmRyZXcgTW9ydG9uIDxha3BtQGRpZ2VvLmNvbT4KKyAqIDI3IE1heSAyMDAxIEFuZHJldyBNb3J0b24KICAqCUNyZWF0ZWQgLSBwdWxsZWQgb3V0IG9mIGZzLmgKICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKaW5kZXggYjk2MTQ0OC4uZjNmZTM0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCisrKyBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaApAQCAtOTMsMTIgKzkzLDEwIEBACiB9CiAKIC8qCi0gKiBQcmV0dHktcHJpbnQgYSBmdW5jdGlvbiBwb2ludGVyLgotICoKLSAqIGlhNjQgYW5kIHBwYzY0IGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSByZWFsbHkgZnVuY3Rpb24gZGVzY3JpcHRvcnMsCi0gKiB3aGljaCBjb250YWluIGEgcG9pbnRlciB0aGUgcmVhbCBhZGRyZXNzLgorICogUHJldHR5LXByaW50IGEgZnVuY3Rpb24gcG9pbnRlci4gIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4KKyAqIFBsZWFzZSB1c2UgdGhlICIlcEYiIHZzcHJpbnRmIGZvcm1hdCBpbnN0ZWFkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZm5fZGVzY3JpcHRvcl9zeW1ib2woY29uc3QgY2hhciAqZm10LCB2b2lkICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fZGVwcmVjYXRlZCBwcmludF9mbl9kZXNjcmlwdG9yX3N5bWJvbChjb25zdCBjaGFyICpmbXQsIHZvaWQgKmFkZHIpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfUFBDNjQpCiAJYWRkciA9ICoodm9pZCAqKilhZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggMjY1MWY4MC4uNjgwMzMxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVjaGVjay5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2R5bmFtaWNfcHJpbnRrLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KIApAQCAtMTgyLDcgKzE4Myw3IEBACiAKIGV4dGVybiBpbnQgZ2V0X29wdGlvbihjaGFyICoqc3RyLCBpbnQgKnBpbnQpOwogZXh0ZXJuIGNoYXIgKmdldF9vcHRpb25zKGNvbnN0IGNoYXIgKnN0ciwgaW50IG5pbnRzLCBpbnQgKmludHMpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtZW1wYXJzZShjaGFyICpwdHIsIGNoYXIgKipyZXRwdHIpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtZW1wYXJzZShjb25zdCBjaGFyICpwdHIsIGNoYXIgKipyZXRwdHIpOwogCiBleHRlcm4gaW50IGNvcmVfa2VybmVsX3RleHQodW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiBpbnQgX19rZXJuZWxfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CkBAIC0yMTMsNiArMjE0LDkgQEAKIAkJeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZgogCitleHRlcm4gaW50IHByaW50a19uZWVkc19jcHUoaW50IGNwdSk7CitleHRlcm4gdm9pZCBwcmludGtfdGljayh2b2lkKTsKKwogZXh0ZXJuIHZvaWQgYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCiAJZWFybHlfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIApAQCAtMjM1LDkgKzIzOSwxMCBAQAogZXh0ZXJuIGludCBwYW5pY190aW1lb3V0OwogZXh0ZXJuIGludCBwYW5pY19vbl9vb3BzOwogZXh0ZXJuIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7Ci1leHRlcm4gaW50IHRhaW50ZWQ7CiBleHRlcm4gY29uc3QgY2hhciAqcHJpbnRfdGFpbnRlZCh2b2lkKTsKLWV4dGVybiB2b2lkIGFkZF90YWludCh1bnNpZ25lZCk7CitleHRlcm4gdm9pZCBhZGRfdGFpbnQodW5zaWduZWQgZmxhZyk7CitleHRlcm4gaW50IHRlc3RfdGFpbnQodW5zaWduZWQgZmxhZyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfdGFpbnQodm9pZCk7CiBleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIAogLyogVmFsdWVzIHVzZWQgZm9yIHN5c3RlbV9zdGF0ZSAqLwpAQCAtMjUwLDE2ICsyNTUsMTYgQEAKIAlTWVNURU1fU1VTUEVORF9ESVNLLAogfSBzeXN0ZW1fc3RhdGU7CiAKLSNkZWZpbmUgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFCSgxPDwwKQotI2RlZmluZSBUQUlOVF9GT1JDRURfTU9EVUxFCQkoMTw8MSkKLSNkZWZpbmUgVEFJTlRfVU5TQUZFX1NNUAkJKDE8PDIpCi0jZGVmaW5lIFRBSU5UX0ZPUkNFRF9STU1PRAkJKDE8PDMpCi0jZGVmaW5lIFRBSU5UX01BQ0hJTkVfQ0hFQ0sJCSgxPDw0KQotI2RlZmluZSBUQUlOVF9CQURfUEFHRQkJCSgxPDw1KQotI2RlZmluZSBUQUlOVF9VU0VSCQkJKDE8PDYpCi0jZGVmaW5lIFRBSU5UX0RJRQkJCSgxPDw3KQotI2RlZmluZSBUQUlOVF9PVkVSUklEREVOX0FDUElfVEFCTEUJKDE8PDgpCi0jZGVmaW5lIFRBSU5UX1dBUk4JCQkoMTw8OSkKKyNkZWZpbmUgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFCTAKKyNkZWZpbmUgVEFJTlRfRk9SQ0VEX01PRFVMRQkJMQorI2RlZmluZSBUQUlOVF9VTlNBRkVfU01QCQkyCisjZGVmaW5lIFRBSU5UX0ZPUkNFRF9STU1PRAkJMworI2RlZmluZSBUQUlOVF9NQUNISU5FX0NIRUNLCQk0CisjZGVmaW5lIFRBSU5UX0JBRF9QQUdFCQkJNQorI2RlZmluZSBUQUlOVF9VU0VSCQkJNgorI2RlZmluZSBUQUlOVF9ESUUJCQk3CisjZGVmaW5lIFRBSU5UX09WRVJSSURERU5fQUNQSV9UQUJMRQk4CisjZGVmaW5lIFRBSU5UX1dBUk4JCQk5CiAKIGV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCkgX19jb2xkOwogCkBAIC0zMDMsOCArMzA4LDEyIEBACiAjZGVmaW5lIHByX2luZm8oZm10LCBhcmcuLi4pIFwKIAlwcmludGsoS0VSTl9JTkZPIGZtdCwgIyNhcmcpCiAKLSNpZmRlZiBERUJVRwogLyogSWYgeW91IGFyZSB3cml0aW5nIGEgZHJpdmVyLCBwbGVhc2UgdXNlIGRldl9kYmcgaW5zdGVhZCAqLworI2lmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKQorI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgZG8geyBcCisJZHluYW1pY19wcl9kZWJ1ZyhmbXQsICMjX19WQV9BUkdTX18pOyBcCisJfSB3aGlsZSAoMCkKKyNlbGlmIGRlZmluZWQoREVCVUcpCiAjZGVmaW5lIHByX2RlYnVnKGZtdCwgYXJnLi4uKSBcCiAJcHJpbnRrKEtFUk5fREVCVUcgZm10LCAjI2FyZykKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleS5oIGIvaW5jbHVkZS9saW51eC9rZXkuaAppbmRleCBjNDVjOTYyLi4xYjcwZTM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tleS5oCisrKyBiL2luY2x1ZGUvbGludXgva2V5LmgKQEAgLTI5OSw2ICsyOTksNyBAQAogI2RlZmluZSBrZXlfdmFsaWRhdGUoaykJCQkwCiAjZGVmaW5lIGtleV9zZXJpYWwoaykJCQkwCiAjZGVmaW5lIGtleV9nZXQoaykgCQkJKHsgTlVMTDsgfSkKKyNkZWZpbmUga2V5X3Jldm9rZShrKQkJCWRvIHsgfSB3aGlsZSgwKQogI2RlZmluZSBrZXlfcHV0KGspCQkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGtleV9yZWZfcHV0KGspCQkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIG1ha2Vfa2V5X3JlZihrLCBwKQkJCSh7IE5VTEw7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmggYi9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKaW5kZXggMDZjMzM4ZS4uOGVhOThkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2xpc3QuaApAQCAtMzgsNyArMzgsNyBAQAogCQkgICAgICAgdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikpOwogCiBzdHJ1Y3Qga2xpc3Rfbm9kZSB7Ci0Jc3RydWN0IGtsaXN0CQkqbl9rbGlzdDsKKwl2b2lkCQkJKm5fa2xpc3Q7CS8qIG5ldmVyIGFjY2VzcyBkaXJlY3RseSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbl9ub2RlOwogCXN0cnVjdCBrcmVmCQluX3JlZjsKIAlzdHJ1Y3QgY29tcGxldGlvbgluX3JlbW92ZWQ7CkBAIC01Nyw3ICs1Nyw2IEBACiAKIHN0cnVjdCBrbGlzdF9pdGVyIHsKIAlzdHJ1Y3Qga2xpc3QJCSppX2tsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJKmlfaGVhZDsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZQkqaV9jdXI7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ttb2QuaCBiL2luY2x1ZGUvbGludXgva21vZC5oCmluZGV4IGExYTkxNTcuLjkyMjEzYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva21vZC5oCisrKyBiL2luY2x1ZGUvbGludXgva21vZC5oCkBAIC05OSw0ICs5OSw3IEBACiBleHRlcm4gaW50IGNhbGxfdXNlcm1vZGVoZWxwZXJfcGlwZShjaGFyICpwYXRoLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSwKIAkJCQkgICAgc3RydWN0IGZpbGUgKipmaWxwKTsKIAorZXh0ZXJuIGludCB1c2VybW9kZWhlbHBlcl9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgdXNlcm1vZGVoZWxwZXJfZW5hYmxlKHZvaWQpOworCiAjZW5kaWYgLyogX19MSU5VWF9LTU9EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggNzBhMzA2NS4uNzk3ZmNkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC0zMTEsMjIgKzMxMSwzMyBAQAogCiAvKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgc2luZ2xlIHRyYWNlIGJ1ZmZlciByZWNvcmQuICovCiBzdHJ1Y3Qga3ZtX3RyYWNlX3JlYyB7Ci0JX191MzIgZXZlbnQ6Mjg7Ci0JX191MzIgZXh0cmFfdTMyOjM7Ci0JX191MzIgY3ljbGVfaW46MTsKKwkvKiB2YXJpYWJsZSByZWNfdmFsCisJICogaXMgc3BsaXQgaW50bzoKKwkgKiBiaXRzIDAgLSAyNyAgLT4gZXZlbnQgaWQKKwkgKiBiaXRzIDI4IC0zMCAgLT4gbnVtYmVyIG9mIGV4dHJhIGRhdGEgYXJncyBvZiBzaXplIHUzMgorCSAqIGJpdHMgMzEgICAgICAtPiBiaW5hcnkgaW5kaWNhdG9yIGZvciBpZiB0c2MgaXMgaW4gcmVjb3JkCisJICovCisJX191MzIgcmVjX3ZhbDsKIAlfX3UzMiBwaWQ7CiAJX191MzIgdmNwdV9pZDsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQlfX3U2NCBjeWNsZV91NjQ7CisJCQlfX3U2NCB0aW1lc3RhbXA7CiAJCQlfX3UzMiBleHRyYV91MzJbS1ZNX1RSQ19FWFRSQV9NQVhdOwotCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGN5Y2xlOworCQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHRpbWVzdGFtcDsKIAkJc3RydWN0IHsKIAkJCV9fdTMyIGV4dHJhX3UzMltLVk1fVFJDX0VYVFJBX01BWF07Ci0JCX0gbm9jeWNsZTsKKwkJfSBub3RpbWVzdGFtcDsKIAl9IHU7CiB9OwogCisjZGVmaW5lIFRSQUNFX1JFQ19FVkVOVF9JRCh2YWwpIFwKKwkJKDB4MGZmZmZmZmYgJiAodmFsKSkKKyNkZWZpbmUgVFJBQ0VfUkVDX05VTV9EQVRBX0FSR1ModmFsKSBcCisJCSgweDcwMDAwMDAwICYgKCh2YWwpIDw8IDI4KSkKKyNkZWZpbmUgVFJBQ0VfUkVDX1RDUyh2YWwpIFwKKwkJKDB4ODAwMDAwMDAgJiAoKHZhbCkgPDwgMzEpKQorCiAjZGVmaW5lIEtWTUlPIDB4QUUKIAogLyoKQEAgLTM3Miw2ICszODMsMTAgQEAKICNkZWZpbmUgS1ZNX0NBUF9NUF9TVEFURSAxNAogI2RlZmluZSBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPIDE1CiAjZGVmaW5lIEtWTV9DQVBfU1lOQ19NTVUgMTYgIC8qIENoYW5nZXMgdG8gaG9zdCBtbWFwIGFyZSByZWZsZWN0ZWQgaW4gZ3Vlc3QgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19YODYpfHxkZWZpbmVkKENPTkZJR19JQTY0KQorI2RlZmluZSBLVk1fQ0FQX0RFVklDRV9BU1NJR05NRU5UIDE3CisjZW5kaWYKKyNkZWZpbmUgS1ZNX0NBUF9JT01NVSAxOAogCiAvKgogICogaW9jdGxzIGZvciBWTSBmZHMKQEAgLTQwMSw2ICs0MTYsMTAgQEAKIAkJCV9JT1coS1ZNSU8sICAweDY3LCBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUpCiAjZGVmaW5lIEtWTV9VTlJFR0lTVEVSX0NPQUxFU0NFRF9NTUlPIFwKIAkJCV9JT1coS1ZNSU8sICAweDY4LCBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUpCisjZGVmaW5lIEtWTV9BU1NJR05fUENJX0RFVklDRSBfSU9SKEtWTUlPLCAweDY5LCBcCisJCQkJICAgc3RydWN0IGt2bV9hc3NpZ25lZF9wY2lfZGV2KQorI2RlZmluZSBLVk1fQVNTSUdOX0lSUSBfSU9SKEtWTUlPLCAweDcwLCBcCisJCQkgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCiAKIC8qCiAgKiBpb2N0bHMgZm9yIHZjcHUgZmRzCkBAIC00NDAsNCArNDU5LDQ1IEBACiAjZGVmaW5lIEtWTV9HRVRfTVBfU1RBVEUgICAgICAgICAgX0lPUihLVk1JTywgIDB4OTgsIHN0cnVjdCBrdm1fbXBfc3RhdGUpCiAjZGVmaW5lIEtWTV9TRVRfTVBfU1RBVEUgICAgICAgICAgX0lPVyhLVk1JTywgIDB4OTksIHN0cnVjdCBrdm1fbXBfc3RhdGUpCiAKKyNkZWZpbmUgS1ZNX1RSQ19JTkpfVklSUSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDAyKQorI2RlZmluZSBLVk1fVFJDX1JFREVMSVZFUl9FVlQgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDMpCisjZGVmaW5lIEtWTV9UUkNfUEVORF9JTlRSICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNCkKKyNkZWZpbmUgS1ZNX1RSQ19JT19SRUFEICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA1KQorI2RlZmluZSBLVk1fVFJDX0lPX1dSSVRFICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDYpCisjZGVmaW5lIEtWTV9UUkNfQ1JfUkVBRCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwNykKKyNkZWZpbmUgS1ZNX1RSQ19DUl9XUklURSAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDA4KQorI2RlZmluZSBLVk1fVFJDX0RSX1JFQUQgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MDkpCisjZGVmaW5lIEtWTV9UUkNfRFJfV1JJVEUgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwQSkKKyNkZWZpbmUgS1ZNX1RSQ19NU1JfUkVBRCAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBCKQorI2RlZmluZSBLVk1fVFJDX01TUl9XUklURSAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEMpCisjZGVmaW5lIEtWTV9UUkNfQ1BVSUQgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgwRCkKKyNkZWZpbmUgS1ZNX1RSQ19JTlRSICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDBFKQorI2RlZmluZSBLVk1fVFJDX05NSSAgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MEYpCisjZGVmaW5lIEtWTV9UUkNfVk1NQ0FMTCAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMCkKKyNkZWZpbmUgS1ZNX1RSQ19ITFQgICAgICAgICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDExKQorI2RlZmluZSBLVk1fVFJDX0NMVFMgICAgICAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTIpCisjZGVmaW5lIEtWTV9UUkNfTE1TVyAgICAgICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxMykKKyNkZWZpbmUgS1ZNX1RSQ19BUElDX0FDQ0VTUyAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE0KQorI2RlZmluZSBLVk1fVFJDX1REUF9GQVVMVCAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTUpCisjZGVmaW5lIEtWTV9UUkNfR1RMQl9XUklURSAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxNikKKyNkZWZpbmUgS1ZNX1RSQ19TVExCX1dSSVRFICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE3KQorI2RlZmluZSBLVk1fVFJDX1NUTEJfSU5WQUwgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTgpCisjZGVmaW5lIEtWTV9UUkNfUFBDX0lOU1RSICAgICAgICAoS1ZNX1RSQ19IQU5ETEVSICsgMHgxOSkKKworc3RydWN0IGt2bV9hc3NpZ25lZF9wY2lfZGV2IHsKKwlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CisJX191MzIgYnVzbnI7CisJX191MzIgZGV2Zm47CisJX191MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSB7CisJX191MzIgYXNzaWduZWRfZGV2X2lkOworCV9fdTMyIGhvc3RfaXJxOworCV9fdTMyIGd1ZXN0X2lycTsKKwlfX3UzMiBmbGFnczsKK307CisKKyNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VCSgxIDw8IDApCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCmluZGV4IDg1MjVhZmMuLjM4MzNjNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKQEAgLTM0LDYgKzM0LDggQEAKICNkZWZpbmUgS1ZNX1JFUV9NTVVfUkVMT0FEICAgICAgICAgMwogI2RlZmluZSBLVk1fUkVRX1RSSVBMRV9GQVVMVCAgICAgICA0CiAjZGVmaW5lIEtWTV9SRVFfUEVORElOR19USU1FUiAgICAgIDUKKyNkZWZpbmUgS1ZNX1JFUV9VTkhBTFQgICAgICAgICAgICAgNgorI2RlZmluZSBLVk1fUkVRX01NVV9TWU5DICAgICAgICAgICA3CiAKIHN0cnVjdCBrdm1fdmNwdTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqa3ZtX3ZjcHVfY2FjaGU7CkBAIC0yNzksMTIgKzI4MSw2OCBAQAogCiBzdHJ1Y3QgIGt2bSAqa3ZtX2FyY2hfY3JlYXRlX3ZtKHZvaWQpOwogdm9pZCBrdm1fYXJjaF9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSk7Cit2b2lkIGt2bV9mcmVlX2FsbF9hc3NpZ25lZF9kZXZpY2VzKHN0cnVjdCBrdm0gKmt2bSk7CiAKIGludCBrdm1fY3B1X2dldF9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2KTsKIGludCBrdm1fY3B1X2hhc19pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2KTsKIGludCBrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV92Y3B1X2tpY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAoraW50IGt2bV9pc19tbWlvX3BmbihwZm5fdCBwZm4pOworCitzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpbms7CisJdW5zaWduZWQgZ3NpOworCXZvaWQgKCppcnFfYWNrZWQpKHN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciAqa2lhbik7Cit9OworCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgeworCXN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciBhY2tfbm90aWZpZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGludGVycnVwdF93b3JrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgYXNzaWduZWRfZGV2X2lkOworCWludCBob3N0X2J1c25yOworCWludCBob3N0X2RldmZuOworCWludCBob3N0X2lycTsKKwlpbnQgZ3Vlc3RfaXJxOworCWludCBpcnFfcmVxdWVzdGVkOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IGt2bSAqa3ZtOworfTsKK3ZvaWQga3ZtX3NldF9pcnEoc3RydWN0IGt2bSAqa3ZtLCBpbnQgaXJxLCBpbnQgbGV2ZWwpOwordm9pZCBrdm1fbm90aWZ5X2Fja2VkX2lycShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGdzaSk7Cit2b2lkIGt2bV9yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgICBzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW4pOwordm9pZCBrdm1fdW5yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgICAgIHN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciAqa2lhbik7CisKKyNpZmRlZiBDT05GSUdfRE1BUgoraW50IGt2bV9pb21tdV9tYXBfcGFnZXMoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBiYXNlX2dmbiwKKwkJCXVuc2lnbmVkIGxvbmcgbnBhZ2VzKTsKK2ludCBrdm1faW9tbXVfbWFwX2d1ZXN0KHN0cnVjdCBrdm0gKmt2bSwKKwkJCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYXNzaWduZWRfZGV2KTsKK2ludCBrdm1faW9tbXVfdW5tYXBfZ3Vlc3Qoc3RydWN0IGt2bSAqa3ZtKTsKKyNlbHNlIC8qIENPTkZJR19ETUFSICovCitzdGF0aWMgaW5saW5lIGludCBrdm1faW9tbXVfbWFwX3BhZ2VzKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgICAgICBnZm5fdCBiYXNlX2dmbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQga3ZtX2lvbW11X21hcF9ndWVzdChzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsCisJCQkJICAgICAgKmFzc2lnbmVkX2RldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSBpbnQga3ZtX2lvbW11X3VubWFwX2d1ZXN0KHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfRE1BUiAqLworCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2d1ZXN0X2VudGVyKHZvaWQpCiB7CiAJYWNjb3VudF9zeXN0ZW1fdnRpbWUoY3VycmVudCk7CkBAIC0zMDcsNiArMzY1LDExIEBACiAJcmV0dXJuIChncGFfdClnZm4gPDwgUEFHRV9TSElGVDsKIH0KIAorc3RhdGljIGlubGluZSBocGFfdCBwZm5fdG9faHBhKHBmbl90IHBmbikKK3sKKwlyZXR1cm4gKGhwYV90KXBmbiA8PCBQQUdFX1NISUZUOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX21pZ3JhdGVfdGltZXJzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzZXRfYml0KEtWTV9SRVFfTUlHUkFURV9USU1FUiwgJnZjcHUtPnJlcXVlc3RzKTsKQEAgLTMyNiw2ICszODksMjUgQEAKIGV4dGVybiBzdHJ1Y3Qga3ZtX3N0YXRzX2RlYnVnZnNfaXRlbSBkZWJ1Z2ZzX2VudHJpZXNbXTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICprdm1fZGVidWdmc19kaXI7CiAKKyNkZWZpbmUgS1ZNVFJBQ0VfNUQoZXZ0LCB2Y3B1LCBkMSwgZDIsIGQzLCBkNCwgZDUsIG5hbWUpIFwKKwl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKKwkJCQkJCXZjcHUsIDUsIGQxLCBkMiwgZDMsIGQ0LCBkNSkKKyNkZWZpbmUgS1ZNVFJBQ0VfNEQoZXZ0LCB2Y3B1LCBkMSwgZDIsIGQzLCBkNCwgbmFtZSkgXAorCXRyYWNlX21hcmsoa3ZtX3RyYWNlXyMjbmFtZSwgIiV1ICVwICV1ICV1ICV1ICV1ICV1ICV1IiwgS1ZNX1RSQ18jI2V2dCwgXAorCQkJCQkJdmNwdSwgNCwgZDEsIGQyLCBkMywgZDQsIDApCisjZGVmaW5lIEtWTVRSQUNFXzNEKGV2dCwgdmNwdSwgZDEsIGQyLCBkMywgbmFtZSkgXAorCXRyYWNlX21hcmsoa3ZtX3RyYWNlXyMjbmFtZSwgIiV1ICVwICV1ICV1ICV1ICV1ICV1ICV1IiwgS1ZNX1RSQ18jI2V2dCwgXAorCQkJCQkJdmNwdSwgMywgZDEsIGQyLCBkMywgMCwgMCkKKyNkZWZpbmUgS1ZNVFJBQ0VfMkQoZXZ0LCB2Y3B1LCBkMSwgZDIsIG5hbWUpIFwKKwl0cmFjZV9tYXJrKGt2bV90cmFjZV8jI25hbWUsICIldSAlcCAldSAldSAldSAldSAldSAldSIsIEtWTV9UUkNfIyNldnQsIFwKKwkJCQkJCXZjcHUsIDIsIGQxLCBkMiwgMCwgMCwgMCkKKyNkZWZpbmUgS1ZNVFJBQ0VfMUQoZXZ0LCB2Y3B1LCBkMSwgbmFtZSkgXAorCXRyYWNlX21hcmsoa3ZtX3RyYWNlXyMjbmFtZSwgIiV1ICVwICV1ICV1ICV1ICV1ICV1ICV1IiwgS1ZNX1RSQ18jI2V2dCwgXAorCQkJCQkJdmNwdSwgMSwgZDEsIDAsIDAsIDAsIDApCisjZGVmaW5lIEtWTVRSQUNFXzBEKGV2dCwgdmNwdSwgbmFtZSkgXAorCXRyYWNlX21hcmsoa3ZtX3RyYWNlXyMjbmFtZSwgIiV1ICVwICV1ICV1ICV1ICV1ICV1ICV1IiwgS1ZNX1RSQ18jI2V2dCwgXAorCQkJCQkJdmNwdSwgMCwgMCwgMCwgMCwgMCwgMCkKKwogI2lmZGVmIENPTkZJR19LVk1fVFJBQ0UKIGludCBrdm1fdHJhY2VfaW9jdGwodW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZyk7CiB2b2lkIGt2bV90cmFjZV9jbGVhbnVwKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sY2QuaCBiL2luY2x1ZGUvbGludXgvbGNkLmgKaW5kZXggMTczZmViYS4uYzY3ZmVjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sY2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xjZC5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKIC8qIE5vdGVzIG9uIGxvY2tpbmc6CiAgKgpAQCAtNDUsNiArNDYsOCBAQAogCWludCAoKmdldF9jb250cmFzdCkoc3RydWN0IGxjZF9kZXZpY2UgKik7CiAJLyogU2V0IExDRCBwYW5lbCBjb250cmFzdCAqLwogICAgICAgICBpbnQgKCpzZXRfY29udHJhc3QpKHN0cnVjdCBsY2RfZGV2aWNlICosIGludCBjb250cmFzdCk7CisJLyogU2V0IExDRCBwYW5lbCBtb2RlIChyZXNvbHV0aW9ucyAuLi4pICovCisJaW50ICgqc2V0X21vZGUpKHN0cnVjdCBsY2RfZGV2aWNlICosIHN0cnVjdCBmYl92aWRlb21vZGUgKik7CiAJLyogQ2hlY2sgaWYgZ2l2ZW4gZnJhbWVidWZmZXIgZGV2aWNlIGlzIHRoZSBvbmUgTENEIGlzIGJvdW5kIHRvOwogCSAgIHJldHVybiAwIGlmIG5vdCwgIT0wIGlmIGl0IGlzLiBJZiBOVUxMLCBsY2QgYWx3YXlzIG1hdGNoZXMgdGhlIGZiLiAqLwogCWludCAoKmNoZWNrX2ZiKShzdHJ1Y3QgbGNkX2RldmljZSAqLCBzdHJ1Y3QgZmJfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IDIyNWJmYzUuLjk0N2NmODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtMTQ2LDYgKzE0Niw3IEBACiAJQVRBX0RGTEFHX1NQVU5ET1dOCT0gKDEgPDwgMTQpLCAvKiBYWFg6IGZvciBzcGluZG93bl9jb21wYXQgKi8KIAlBVEFfREZMQUdfU0xFRVBJTkcJPSAoMSA8PCAxNSksIC8qIGRldmljZSBpcyBzbGVlcGluZyAqLwogCUFUQV9ERkxBR19EVUJJT1VTX1hGRVIJPSAoMSA8PCAxNiksIC8qIGRhdGEgdHJhbnNmZXIgbm90IHZlcmlmaWVkICovCisJQVRBX0RGTEFHX05PX1VOTE9BRAk9ICgxIDw8IDE3KSwgLyogZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCB1bmxvYWQgKi8KIAlBVEFfREZMQUdfSU5JVF9NQVNLCT0gKDEgPDwgMjQpIC0gMSwKIAogCUFUQV9ERkxBR19ERVRBQ0gJPSAoMSA8PCAyNCksCkBAIC0yNDQsNiArMjQ1LDcgQEAKIAlBVEFfVE1PVVRfQk9PVAkJPSAzMDAwMCwJLyogaGV1cmlzdGljICovCiAJQVRBX1RNT1VUX0JPT1RfUVVJQ0sJPSAgNzAwMCwJLyogaGV1cmlzdGljICovCiAJQVRBX1RNT1VUX0lOVEVSTkFMX1FVSUNLID0gNTAwMCwKKwlBVEFfVE1PVVRfTUFYX1BBUksJPSAzMDAwMCwKIAogCS8qIEZJWE1FOiBHb1ZhdWx0IG5lZWRzIDJzIGJ1dCB3ZSBjYW4ndCBhZmZvcmQgdGhhdCB3aXRob3V0CiAJICogcGFyYWxsZWwgcHJvYmluZy4gIDgwMG1zIGlzIGVub3VnaCBmb3IgaVZEUiBkaXNrCkBAIC0zMTksOCArMzIxLDExIEBACiAJQVRBX0VIX1JFU0VUCQk9IEFUQV9FSF9TT0ZUUkVTRVQgfCBBVEFfRUhfSEFSRFJFU0VULAogCUFUQV9FSF9FTkFCTEVfTElOSwk9ICgxIDw8IDMpLAogCUFUQV9FSF9MUE0JCT0gKDEgPDwgNCksICAvKiBsaW5rIHBvd2VyIG1hbmFnZW1lbnQgYWN0aW9uICovCisJQVRBX0VIX1BBUksJCT0gKDEgPDwgNSksIC8qIHVubG9hZCBoZWFkcyBhbmQgc3RvcCBJL08gKi8KIAotCUFUQV9FSF9QRVJERVZfTUFTSwk9IEFUQV9FSF9SRVZBTElEQVRFLAorCUFUQV9FSF9QRVJERVZfTUFTSwk9IEFUQV9FSF9SRVZBTElEQVRFIHwgQVRBX0VIX1BBUkssCisJQVRBX0VIX0FMTF9BQ1RJT05TCT0gQVRBX0VIX1JFVkFMSURBVEUgfCBBVEFfRUhfUkVTRVQgfAorCQkJCSAgQVRBX0VIX0VOQUJMRV9MSU5LIHwgQVRBX0VIX0xQTSwKIAogCS8qIGF0YV9laF9pbmZvLT5mbGFncyAqLwogCUFUQV9FSElfSE9UUExVR0dFRAk9ICgxIDw8IDApLCAgLyogY291bGQgaGF2ZSBiZWVuIGhvdHBsdWdnZWQgKi8KQEAgLTQ1Miw2ICs0NTcsNyBAQAogCU1FRElVTV9QT1dFUiwKIH07CiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfbGlua19wb3dlcl9tYW5hZ2VtZW50X3BvbGljeTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl91bmxvYWRfaGVhZHM7CiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZW1fbWVzc2FnZV90eXBlOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2VtX21lc3NhZ2U7CiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfc3dfYWN0aXZpdHk7CkBAIC01NTQsOCArNTYwLDggQEAKIHN0cnVjdCBhdGFfZGV2aWNlIHsKIAlzdHJ1Y3QgYXRhX2xpbmsJCSpsaW5rOwogCXVuc2lnbmVkIGludAkJZGV2bm87CQkvKiAwIG9yIDEgKi8KLQl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIEFUQV9ERkxBR194eHggKi8KIAl1bnNpZ25lZCBpbnQJCWhvcmthZ2U7CS8qIExpc3Qgb2YgYnJva2VuIGZlYXR1cmVzICovCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBBVEFfREZMQUdfeHh4ICovCiAJc3RydWN0IHNjc2lfZGV2aWNlCSpzZGV2OwkJLyogYXR0YWNoZWQgU0NTSSBkZXZpY2UgKi8KICNpZmRlZiBDT05GSUdfQVRBX0FDUEkKIAlhY3BpX2hhbmRsZQkJYWNwaV9oYW5kbGU7CkBAIC01NjQsNiArNTcwLDcgQEAKIAkvKiBuX3NlY3RvciBpcyB1c2VkIGFzIENMRUFSX09GRlNFVCwgcmVhZCBjb21tZW50IGFib3ZlIENMRUFSX09GRlNFVCAqLwogCXU2NAkJCW5fc2VjdG9yczsJLyogc2l6ZSBvZiBkZXZpY2UsIGlmIEFUQSAqLwogCXVuc2lnbmVkIGludAkJY2xhc3M7CQkvKiBBVEFfREVWX3h4eCAqLworCXVuc2lnbmVkIGxvbmcJCXVucGFya19kZWFkbGluZTsKIAogCXU4CQkJcGlvX21vZGU7CiAJdTgJCQlkbWFfbW9kZTsKQEAgLTYyMSw2ICs2MjgsNyBAQAogCQkJCQkgICAgICAgW0FUQV9FSF9DTURfVElNRU9VVF9UQUJMRV9TSVpFXTsKIAl1bnNpZ25lZCBpbnQJCWNsYXNzZXNbQVRBX01BWF9ERVZJQ0VTXTsKIAl1bnNpZ25lZCBpbnQJCWRpZF9wcm9iZV9tYXNrOworCXVuc2lnbmVkIGludAkJdW5sb2FkZWRfbWFzazsKIAl1bnNpZ25lZCBpbnQJCXNhdmVkX25jcV9lbmFibGVkOwogCXU4CQkJc2F2ZWRfeGZlcl9tb2RlW0FUQV9NQVhfREVWSUNFU107CiAJLyogdGltZXN0YW1wIGZvciB0aGUgbGFzdCByZXNldCBhdHRlbXB0IG9yIHN1Y2Nlc3MgKi8KQEAgLTY4OCw3ICs2OTYsOCBAQAogCXVuc2lnbmVkIGludAkJcWNfYWN0aXZlOwogCWludAkJCW5yX2FjdGl2ZV9saW5rczsgLyogI2xpbmtzIHdpdGggYWN0aXZlIHFjcyAqLwogCi0Jc3RydWN0IGF0YV9saW5rCQlsaW5rOwkvKiBob3N0IGRlZmF1bHQgbGluayAqLworCXN0cnVjdCBhdGFfbGluawkJbGluazsJCS8qIGhvc3QgZGVmYXVsdCBsaW5rICovCisJc3RydWN0IGF0YV9saW5rCQkqc2xhdmVfbGluazsJLyogc2VlIGF0YV9zbGF2ZV9saW5rX2luaXQoKSAqLwogCiAJaW50CQkJbnJfcG1wX2xpbmtzOwkvKiBuciBvZiBhdmFpbGFibGUgUE1QIGxpbmtzICovCiAJc3RydWN0IGF0YV9saW5rCQkqcG1wX2xpbms7CS8qIGFycmF5IG9mIFBNUCBsaW5rcyAqLwpAQCAtNzA5LDYgKzcxOCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAllaF9kb25lX3E7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJZWhfd2FpdF9xOwogCWludAkJCWVoX3RyaWVzOworCXN0cnVjdCBjb21wbGV0aW9uCXBhcmtfcmVxX3BlbmRpbmc7CiAKIAlwbV9tZXNzYWdlX3QJCXBtX21lc2c7CiAJaW50CQkJKnBtX3Jlc3VsdDsKQEAgLTc3Miw4ICs3ODIsOCBAQAogCS8qCiAJICogT3B0aW9uYWwgZmVhdHVyZXMKIAkgKi8KLQlpbnQgICgqc2NyX3JlYWQpKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiAqdmFsKTsKLQlpbnQgICgqc2NyX3dyaXRlKShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKKwlpbnQgICgqc2NyX3JlYWQpKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyICp2YWwpOworCWludCAgKCpzY3Jfd3JpdGUpKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiAJdm9pZCAoKnBtcF9hdHRhY2gpKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCXZvaWQgKCpwbXBfZGV0YWNoKShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAlpbnQgICgqZW5hYmxlX3BtKShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBlbnVtIGxpbmtfcG0gcG9saWN5KTsKQEAgLTg5NSw2ICs5MDUsNyBAQAogZXh0ZXJuIHN0cnVjdCBhdGFfaG9zdCAqYXRhX2hvc3RfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbWF4X3BvcnRzKTsKIGV4dGVybiBzdHJ1Y3QgYXRhX2hvc3QgKmF0YV9ob3N0X2FsbG9jX3BpbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksIGludCBuX3BvcnRzKTsKK2V4dGVybiBpbnQgYXRhX3NsYXZlX2xpbmtfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX2hvc3Rfc3RhcnQoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKIGV4dGVybiBpbnQgYXRhX2hvc3RfcmVnaXN0ZXIoc3RydWN0IGF0YV9ob3N0ICpob3N0LAogCQkJICAgICBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQpOwpAQCAtOTIwLDggKzkzMSw4IEBACiBleHRlcm4gaW50IHNhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcmVnLCB1MzIgKnZhbCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyIHZhbCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3dyaXRlX2ZsdXNoKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyIHZhbCk7Ci1leHRlcm4gaW50IGF0YV9saW5rX29ubGluZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmspOwotZXh0ZXJuIGludCBhdGFfbGlua19vZmZsaW5lKHN0cnVjdCBhdGFfbGluayAqbGluayk7CitleHRlcm4gYm9vbCBhdGFfbGlua19vbmxpbmUoc3RydWN0IGF0YV9saW5rICpsaW5rKTsKK2V4dGVybiBib29sIGF0YV9saW5rX29mZmxpbmUoc3RydWN0IGF0YV9saW5rICpsaW5rKTsKICNpZmRlZiBDT05GSUdfUE0KIGV4dGVybiBpbnQgYXRhX2hvc3Rfc3VzcGVuZChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHBtX21lc3NhZ2VfdCBtZXNnKTsKIGV4dGVybiB2b2lkIGF0YV9ob3N0X3Jlc3VtZShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwpAQCAtMTA5OCw2ICsxMTA5LDcgQEAKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9iYXNlX3BvcnRfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNhdGFfcG9ydF9vcHM7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0YV9jb21tb25fc2Rldl9hdHRyc1tdOwogCiAjZGVmaW5lIEFUQV9CQVNFX1NIVChkcnZfbmFtZSkJCQkJCVwKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwJCQlcCkBAIC0xMTEyLDcgKzExMjQsOCBAQAogCS5wcm9jX25hbWUJCT0gZHJ2X25hbWUsCQkJXAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCVwKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAlcCi0JLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtCisJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAkJXAorCS5zZGV2X2F0dHJzCQk9IGF0YV9jb21tb25fc2Rldl9hdHRycwogCiAjZGVmaW5lIEFUQV9OQ1FfU0hUKGRydl9uYW1lKQkJCQkJXAogCUFUQV9CQVNFX1NIVChkcnZfbmFtZSksCQkJCQlcCkBAIC0xMTM0LDcgKzExNDcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhdGFfaXNfaG9zdF9saW5rKGNvbnN0IHN0cnVjdCBhdGFfbGluayAqbGluaykKIHsKLQlyZXR1cm4gbGluayA9PSAmbGluay0+YXAtPmxpbms7CisJcmV0dXJuIGxpbmsgPT0gJmxpbmstPmFwLT5saW5rIHx8IGxpbmsgPT0gbGluay0+YXAtPnNsYXZlX2xpbms7CiB9CiAjZWxzZSAvKiBDT05GSUdfU0FUQV9QTVAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBzYXRhX3BtcF9zdXBwb3J0ZWQoc3RydWN0IGF0YV9wb3J0ICphcCkKQEAgLTExNjcsNyArMTE4MCw3IEBACiAJcHJpbnRrKCIlc2F0YSV1OiAiZm10LCBsdiwgKGFwKS0+cHJpbnRfaWQgLCAjI2FyZ3MpCiAKICNkZWZpbmUgYXRhX2xpbmtfcHJpbnRrKGxpbmssIGx2LCBmbXQsIGFyZ3MuLi4pIGRvIHsgXAotCWlmIChzYXRhX3BtcF9hdHRhY2hlZCgobGluayktPmFwKSkgXAorCWlmIChzYXRhX3BtcF9hdHRhY2hlZCgobGluayktPmFwKSB8fCAobGluayktPmFwLT5zbGF2ZV9saW5rKQlcCiAJCXByaW50aygiJXNhdGEldS4lMDJ1OiAiZm10LCBsdiwgKGxpbmspLT5hcC0+cHJpbnRfaWQsCVwKIAkJICAgICAgIChsaW5rKS0+cG1wICwgIyNhcmdzKTsgXAogCWVsc2UgXApAQCAtMTI2NSwzNCArMTI3OCwxNyBAQAogCXJldHVybiBhdGFfdGFnX3ZhbGlkKGxpbmstPmFjdGl2ZV90YWcpIHx8IGxpbmstPnNhY3RpdmU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGF0YV9saW5rICphdGFfcG9ydF9maXJzdF9saW5rKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JaWYgKHNhdGFfcG1wX2F0dGFjaGVkKGFwKSkKLQkJcmV0dXJuIGFwLT5wbXBfbGluazsKLQlyZXR1cm4gJmFwLT5saW5rOwotfQorZXh0ZXJuIHN0cnVjdCBhdGFfbGluayAqX19hdGFfcG9ydF9uZXh0X2xpbmsoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkJICAgICBzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssCisJCQkJCSAgICAgYm9vbCBkZXZfb25seSk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGF0YV9saW5rICphdGFfcG9ydF9uZXh0X2xpbmsoc3RydWN0IGF0YV9saW5rICpsaW5rKQotewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKLQotCWlmIChhdGFfaXNfaG9zdF9saW5rKGxpbmspKSB7Ci0JCWlmICghc2F0YV9wbXBfYXR0YWNoZWQoYXApKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBhcC0+cG1wX2xpbms7Ci0JfQotCi0JaWYgKCsrbGluayA8IGFwLT5ucl9wbXBfbGlua3MgKyBhcC0+cG1wX2xpbmspCi0JCXJldHVybiBsaW5rOwotCXJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIF9fYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaywgYXApIFwKLQlmb3IgKChsaykgPSAmKGFwKS0+bGluazsgKGxrKTsgKGxrKSA9IGF0YV9wb3J0X25leHRfbGluayhsaykpCisjZGVmaW5lIF9fYXRhX3BvcnRfZm9yX2VhY2hfbGluayhsaW5rLCBhcCkgXAorCWZvciAoKGxpbmspID0gX19hdGFfcG9ydF9uZXh0X2xpbmsoKGFwKSwgTlVMTCwgZmFsc2UpOyAobGluayk7IFwKKwkgICAgIChsaW5rKSA9IF9fYXRhX3BvcnRfbmV4dF9saW5rKChhcCksIChsaW5rKSwgZmFsc2UpKQogCiAjZGVmaW5lIGF0YV9wb3J0X2Zvcl9lYWNoX2xpbmsobGluaywgYXApIFwKLQlmb3IgKChsaW5rKSA9IGF0YV9wb3J0X2ZpcnN0X2xpbmsoYXApOyAobGluayk7IFwKLQkgICAgIChsaW5rKSA9IGF0YV9wb3J0X25leHRfbGluayhsaW5rKSkKKwlmb3IgKChsaW5rKSA9IF9fYXRhX3BvcnRfbmV4dF9saW5rKChhcCksIE5VTEwsIHRydWUpOyAobGluayk7IFwKKwkgICAgIChsaW5rKSA9IF9fYXRhX3BvcnRfbmV4dF9saW5rKChhcCksIChsaW5rKSwgdHJ1ZSkpCiAKICNkZWZpbmUgYXRhX2xpbmtfZm9yX2VhY2hfZGV2KGRldiwgbGluaykgXAogCWZvciAoKGRldikgPSAobGluayktPmRldmljZTsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAppbmRleCAzZDI1YmNkLi5lNTg3MmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaApAQCAtMjcsNyArMjcsNiBAQAogCQkJCQkJc3RydWN0IG5mc19maCAqLAogCQkJCQkJc3RydWN0IGZpbGUgKiopOwogCXZvaWQJCQkoKmZjbG9zZSkoc3RydWN0IGZpbGUgKik7Ci0JdW5zaWduZWQgbG9uZwkJKCpnZXRfZ3JhY2VfcGVyaW9kKSh2b2lkKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcgKglubG1zdmNfb3BzOwpAQCAtNTMsMTUgKzUyLDcgQEAKIAogZXh0ZXJuIGludAlubG1jbG50X3Byb2Moc3RydWN0IG5sbV9ob3N0ICpob3N0LCBpbnQgY21kLAogCQkJCQlzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7Ci1leHRlcm4gaW50CWxvY2tkX3VwKGludCBwcm90byk7CitleHRlcm4gaW50CWxvY2tkX3VwKHZvaWQpOwogZXh0ZXJuIHZvaWQJbG9ja2RfZG93bih2b2lkKTsKIAotdW5zaWduZWQgbG9uZyBnZXRfbmZzX2dyYWNlX3BlcmlvZCh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19ORlNEX1Y0Ci11bnNpZ25lZCBsb25nIGdldF9uZnM0X2dyYWNlX3BlcmlvZCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpIHtyZXR1cm4gMDt9Ci0jZW5kaWYKLQogI2VuZGlmIC8qIExJTlVYX0xPQ0tEX0JJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IGRiYjg3YWIuLmI1NmQ1YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTEyLDYgKzEyLDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgpAQCAtMzgsOCArNDAsOSBAQAogICovCiBzdHJ1Y3QgbmxtX2hvc3QgewogCXN0cnVjdCBobGlzdF9ub2RlCWhfaGFzaDsJCS8qIGRvdWJseSBsaW5rZWQgbGlzdCAqLwotCXN0cnVjdCBzb2NrYWRkcl9pbgloX2FkZHI7CQkvKiBwZWVyIGFkZHJlc3MgKi8KLQlzdHJ1Y3Qgc29ja2FkZHJfaW4JaF9zYWRkcjsJLyogb3VyIGFkZHJlc3MgKG9wdGlvbmFsKSAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCWhfYWRkcjsJCS8qIHBlZXIgYWRkcmVzcyAqLworCXNpemVfdAkJCWhfYWRkcmxlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQloX3NyY2FkZHI7CS8qIG91ciBhZGRyZXNzIChvcHRpb25hbCkgKi8KIAlzdHJ1Y3QgcnBjX2NsbnQJKgloX3JwY2NsbnQ7CS8qIFJQQyBjbGllbnQgdG8gdGFsayB0byBwZWVyICovCiAJY2hhciAqCQkJaF9uYW1lOwkJLyogcmVtb3RlIGhvc3RuYW1lICovCiAJdTMyCQkJaF92ZXJzaW9uOwkvKiBpbnRlcmZhY2UgdmVyc2lvbiAqLwpAQCAtNjEsMTggKzY0LDU2IEBACiAJc3RydWN0IGxpc3RfaGVhZAloX2dyYW50ZWQ7CS8qIExvY2tzIGluIEdSQU5URUQgc3RhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfcmVjbGFpbTsJLyogTG9ja3MgaW4gUkVDTEFJTSBzdGF0ZSAqLwogCXN0cnVjdCBuc21faGFuZGxlICoJaF9uc21oYW5kbGU7CS8qIE5TTSBzdGF0dXMgaGFuZGxlICovCisKKwljaGFyCQkJaF9hZGRyYnVmWzQ4XSwJLyogYWRkcmVzcyBleWVjYXRjaGVycyAqLworCQkJCWhfc3JjYWRkcmJ1Zls0OF07CiB9OwogCiBzdHJ1Y3QgbnNtX2hhbmRsZSB7CiAJc3RydWN0IGxpc3RfaGVhZAlzbV9saW5rOwogCWF0b21pY190CQlzbV9jb3VudDsKIAljaGFyICoJCQlzbV9uYW1lOwotCXN0cnVjdCBzb2NrYWRkcl9pbglzbV9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCXNtX2FkZHI7CisJc2l6ZV90CQkJc21fYWRkcmxlbjsKIAl1bnNpZ25lZCBpbnQJCXNtX21vbml0b3JlZCA6IDEsCiAJCQkJc21fc3RpY2t5IDogMTsJLyogZG9uJ3QgdW5tb25pdG9yICovCisJY2hhcgkJCXNtX2FkZHJidWZbNDhdOwkvKiBhZGRyZXNzIGV5ZWNhdGNoZXIgKi8KIH07CiAKIC8qCisgKiBSaWdvcm91cyB0eXBlIGNoZWNraW5nIG9uIHNvY2thZGRyIHR5cGUgY29udmVyc2lvbnMKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5sbV9hZGRyX2luKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZob3N0LT5oX2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyICpubG1fYWRkcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9hZGRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbiAqbmxtX3NyY2FkZHJfaW4oY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luICopJmhvc3QtPmhfc3JjYWRkcjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5sbV9zcmNhZGRyKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSZob3N0LT5oX3NyY2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyX2luICpuc21fYWRkcl9pbihjb25zdCBzdHJ1Y3QgbnNtX2hhbmRsZSAqaGFuZGxlKQoreworCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luICopJmhhbmRsZS0+c21fYWRkcjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5zbV9hZGRyKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpoYW5kbGUpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmaGFuZGxlLT5zbV9hZGRyOworfQorCisvKgogICogTWFwIGFuIGZsX293bmVyX3QgaW50byBhIHVuaXF1ZSAzMi1iaXQgInBpZCIKICAqLwogc3RydWN0IG5sbV9sb2Nrb3duZXIgewpAQCAtMTY2LDcgKzIwNyw4IEBACiBzdHJ1Y3QgbmxtX3dhaXQgKiBubG1jbG50X3ByZXBhcmVfYmxvY2soc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CiB2b2lkCQkgIG5sbWNsbnRfZmluaXNoX2Jsb2NrKHN0cnVjdCBubG1fd2FpdCAqYmxvY2spOwogaW50CQkgIG5sbWNsbnRfYmxvY2soc3RydWN0IG5sbV93YWl0ICpibG9jaywgc3RydWN0IG5sbV9ycXN0ICpyZXEsIGxvbmcgdGltZW91dCk7Ci1fX2JlMzIJCSAgbmxtY2xudF9ncmFudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqKTsKK19fYmUzMgkJICBubG1jbG50X2dyYW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCQljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spOwogdm9pZAkJICBubG1jbG50X3JlY292ZXJ5KHN0cnVjdCBubG1faG9zdCAqKTsKIGludAkJICBubG1jbG50X3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiB2b2lkCQkgIG5sbWNsbnRfbmV4dF9jb29raWUoc3RydWN0IG5sbV9jb29raWUgKik7CkBAIC0xNzQsMTIgKzIxNiwxNCBAQAogLyoKICAqIEhvc3QgY2FjaGUKICAqLwotc3RydWN0IG5sbV9ob3N0ICAqbmxtY2xudF9sb29rdXBfaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwKLQkJCQkJaW50IHByb3RvLCB1MzIgdmVyc2lvbiwKK3N0cnVjdCBubG1faG9zdCAgKm5sbWNsbnRfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCWNvbnN0IHNpemVfdCBzYWxlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkJCWNvbnN0IHUzMiB2ZXJzaW9uLAorCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSk7CitzdHJ1Y3QgbmxtX2hvc3QgICpubG1zdmNfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJCXVuc2lnbmVkIGludCBob3N0bmFtZV9sZW4pOwotc3RydWN0IG5sbV9ob3N0ICAqbmxtc3ZjX2xvb2t1cF9ob3N0KHN0cnVjdCBzdmNfcnFzdCAqLCBjb25zdCBjaGFyICosCi0JCQkJCXVuc2lnbmVkIGludCk7CisJCQkJCWNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pOwogc3RydWN0IHJwY19jbG50ICogbmxtX2JpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9yZWJpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiBzdHJ1Y3QgbmxtX2hvc3QgKiBubG1fZ2V0X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwpAQCAtMjAxLDcgKzI0NSw3IEBACiAgKi8KIF9fYmUzMgkJICBubG1zdmNfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkgICAgICBzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9sb2NrICosIGludCwKLQkJCSAgICAgIHN0cnVjdCBubG1fY29va2llICopOworCQkJICAgICAgc3RydWN0IG5sbV9jb29raWUgKiwgaW50KTsKIF9fYmUzMgkJICBubG1zdmNfdW5sb2NrKHN0cnVjdCBubG1fZmlsZSAqLCBzdHJ1Y3QgbmxtX2xvY2sgKik7CiBfX2JlMzIJCSAgbmxtc3ZjX3Rlc3Rsb2NrKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKIAkJCXN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgbmxtX2xvY2sgKiwKQEAgLTIzMywxNSArMjc3LDgyIEBACiAJcmV0dXJuIGZpbGUtPmZfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIH0KIAotLyoKLSAqIENvbXBhcmUgdHdvIGhvc3QgYWRkcmVzc2VzIChuZWVkcyBtb2RpZnlpbmcgZm9yIGlwdjYpCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5sbV9jbXBfYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjEsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4yKQorc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0NChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKIHsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisJcmV0dXJuIChzaW4tPnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfTE9PUEJBQ0spKSAmJgorCQkJKG50b2hzKHNpbi0+c2luX3BvcnQpIDwgMTAyNCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKK3N0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOworCXJldHVybiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTE9PUEJBQ0spICYmCisJCQkobnRvaHMoc2luNi0+c2luNl9wb3J0KSA8IDEwMjQpOworfQorI2Vsc2UJLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCitzdGF0aWMgaW5saW5lIGludCBfX25sbV9wcml2aWxlZ2VkX3JlcXVlc3Q2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXJldHVybiAwOworfQorI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSAqLworCisvKgorICogRW5zdXJlIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcm9tIGxvY2FsIHByaXZpbGVnZWQgY2FsbGVycy4KKyAqCisgKiBSZXR1cm4gVFJVRSBpZiBzZW5kZXIgaXMgbG9jYWwgYW5kIGlzIGNvbm5lY3RpbmcgdmlhIGEgcHJpdmlsZWdlZCBwb3J0OworICogb3RoZXJ3aXNlIHJldHVybiBGQUxTRS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmxtX3ByaXZpbGVnZWRfcmVxdWVzdGVyKGNvbnN0IHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAgPSBzdmNfYWRkcihycXN0cCk7CisKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0NChzYXApOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBfX25sbV9wcml2aWxlZ2VkX3JlcXVlc3Q2KHNhcCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX25sbV9jbXBfYWRkcjQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAxLAorCQkJCSAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAyKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luMSA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXAxOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luMiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXAyOwogCXJldHVybiBzaW4xLT5zaW5fYWRkci5zX2FkZHIgPT0gc2luMi0+c2luX2FkZHIuc19hZGRyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfX25sbV9jbXBfYWRkcjYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAxLAorCQkJCSAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAyKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjEgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDE7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luMiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwMjsKKwlyZXR1cm4gaXB2Nl9hZGRyX2VxdWFsKCZzaW4xLT5zaW42X2FkZHIsICZzaW4yLT5zaW42X2FkZHIpOworfQorCisvKgorICogQ29tcGFyZSB0d28gaG9zdCBhZGRyZXNzZXMKKyAqCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZTsgb3RoZXJ3aXNlIEZBTFNFLgorICovCitzdGF0aWMgaW5saW5lIGludCBubG1fY21wX2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMikKK3sKKwlpZiAoc2FwMS0+c2FfZmFtaWx5ID09IHNhcDItPnNhX2ZhbWlseSkgeworCQlzd2l0Y2ggKHNhcDEtPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlyZXR1cm4gX19ubG1fY21wX2FkZHI0KHNhcDEsIHNhcDIpOworCQljYXNlIEFGX0lORVQ2OgorCQkJcmV0dXJuIF9fbmxtX2NtcF9hZGRyNihzYXAxLCBzYXAyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIENvbXBhcmUgdHdvIE5MTSBsb2Nrcy4KICAqIFdoZW4gdGhlIHNlY29uZCBsb2NrIGlzIG9mIHR5cGUgRl9VTkxDSywgdGhpcyBhY3RzIGxpa2UgYSB3aWxkY2FyZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCmluZGV4IGRmMThmYTAuLmQ2YjNhODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaApAQCAtODEsOCArODEsNiBAQAogCXVuc2lnbmVkIGludAlsZW47CiAJdTMyCQlzdGF0ZTsKIAlfX2JlMzIJCWFkZHI7Ci0JX19iZTMyCQl2ZXJzOwotCV9fYmUzMgkJcHJvdG87CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCmluZGV4IDFmYTBjMmMuLmY3ZjNmZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFnaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKQEAgLTYsNiArNiwxMCBAQAogI2RlZmluZSBBRlNfU1VQRVJfTUFHSUMgICAgICAgICAgICAgICAgMHg1MzQ2NDE0RgogI2RlZmluZSBBVVRPRlNfU1VQRVJfTUFHSUMJMHgwMTg3CiAjZGVmaW5lIENPREFfU1VQRVJfTUFHSUMJMHg3Mzc1NzI0NQorI2RlZmluZSBERUJVR0ZTX01BR0lDICAgICAgICAgIDB4NjQ2MjY3MjAKKyNkZWZpbmUgU1lTRlNfTUFHSUMJCTB4NjI2NTY1NzIKKyNkZWZpbmUgU0VDVVJJVFlGU19NQUdJQwkweDczNjM2NjczCisjZGVmaW5lIFRNUEZTX01BR0lDCQkweDAxMDIxOTk0CiAjZGVmaW5lIEVGU19TVVBFUl9NQUdJQwkJMHg0MTRBNTMKICNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQwkweEVGNTMKICNkZWZpbmUgRVhUM19TVVBFUl9NQUdJQwkweEVGNTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFqb3IuaCBiL2luY2x1ZGUvbGludXgvbWFqb3IuaAppbmRleCA1M2Q1ZmFmLi44ODI0OTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21ham9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9tYWpvci5oCkBAIC0xNzAsNCArMTcwLDYgQEAKIAogI2RlZmluZSBWSU9UQVBFX01BSk9SCQkyMzAKIAorI2RlZmluZSBCTE9DS19FWFRfTUFKT1IJCTI1OQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmggYi9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjg0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlbmsgVmVyZ29uZXQgPEhlbmsuVmVyZ29uZXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBNQVBfVE9fN1NFR01FTlRfSAorI2RlZmluZSBNQVBfVE9fN1NFR01FTlRfSAorCisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgdHJhbnNsYXRpb24gcHJpbWl0aXZlcyBhbmQgdGFibGVzIGZvciB0aGUgY29udmVyc2lvbgorICogb2YgKEFTQ0lJKSBjaGFyYWN0ZXJzIHRvIGEgNy1zZWdtZW50cyBub3RhdGlvbi4KKyAqCisgKiBUaGUgNyBzZWdtZW50J3Mgd2lraXBlZGlhIG5vdGF0aW9uIGJlbG93IGlzIHVzZWQgYXMgc3RhbmRhcmQuCisgKiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2V2ZW5fc2VnbWVudF9kaXNwbGF5CisgKgorICogTm90YXRpb246CSstYS0rCisgKgkJZiAgIGIKKyAqCQkrLWctKworICoJCWUgICBjCisgKgkJKy1kLSsKKyAqCisgKiBVc2FnZToKKyAqCisgKiAgIFJlZ2lzdGVyIGEgbWFwIHZhcmlhYmxlLCBhbmQgZmlsbCBpdCB3aXRoIGEgY2hhcmFjdGVyIHNldDoKKyAqCXN0YXRpYyBTRUc3X0RFRkFVTFRfTUFQKG1hcF9zZWc3KTsKKyAqCisgKgorICogICBUaGVuIHVzZSBmb3IgY29udmVyc2lvbjoKKyAqCXNlZzcgPSBtYXBfdG9fc2VnNygmbWFwX3NlZzcsIHNvbWVfY2hhcik7CisgKgkuLi4KKyAqCisgKiBJbiBkZXZpY2UgZHJpdmVycyBpdCBpcyByZWNvbW1lbmRlZCwgaWYgcmVxdWlyZWQsIHRvIG1ha2UgdGhlIGNoYXIgbWFwCisgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgc3lzZnMgaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorICoKKyAqIHN0YXRpYyBzc2l6ZV90IHNob3dfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CisgKgltZW1jcHkoYnVmLCAmbWFwX3NlZzcsIHNpemVvZihtYXBfc2VnNykpOworICoJcmV0dXJuIHNpemVvZihtYXBfc2VnNyk7CisgKiB9CisgKiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjbnQpIHsKKyAqCWlmKGNudCAhPSBzaXplb2YobWFwX3NlZzcpKQorICoJCXJldHVybiAtRUlOVkFMOworICoJbWVtY3B5KCZtYXBfc2VnNywgYnVmLCBjbnQpOworICoJcmV0dXJuIGNudDsKKyAqIH0KKyAqIHN0YXRpYyBERVZJQ0VfQVRUUihtYXBfc2VnNywgUEVSTVNfUlcsIHNob3dfbWFwLCBzdG9yZV9tYXApOworICoKKyAqIEhpc3Rvcnk6CisgKiAyMDA1LTA1LTMxCVJGQyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisKKyNkZWZpbmUgQklUX1NFRzdfQQkJMAorI2RlZmluZSBCSVRfU0VHN19CCQkxCisjZGVmaW5lIEJJVF9TRUc3X0MJCTIKKyNkZWZpbmUgQklUX1NFRzdfRAkJMworI2RlZmluZSBCSVRfU0VHN19FCQk0CisjZGVmaW5lIEJJVF9TRUc3X0YJCTUKKyNkZWZpbmUgQklUX1NFRzdfRwkJNgorI2RlZmluZSBCSVRfU0VHN19SRVNFUlZFRAk3CisKK3N0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwIHsKKwl1bnNpZ25lZCBjaGFyCXRhYmxlWzEyOF07Cit9OworCitzdGF0aWMgaW5saW5lIGludCBtYXBfdG9fc2VnNyhzdHJ1Y3Qgc2VnN19jb252ZXJzaW9uX21hcCAqbWFwLCBpbnQgYykKK3sKKwlyZXR1cm4gYyA+PSAwICYmIGMgPCBzaXplb2YobWFwLT50YWJsZSkgPyBtYXAtPnRhYmxlW2NdIDogLUVJTlZBTDsKK30KKworI2RlZmluZSBTRUc3X0NPTlZFUlNJT05fTUFQKF9uYW1lLCBfbWFwKQlcCisJc3RydWN0IHNlZzdfY29udmVyc2lvbl9tYXAgX25hbWUgPSB7IC50YWJsZSA9IHsgX21hcCB9IH0KKworLyoKKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhIGZhY2lsaXR5IHRoYXQgYWxsb3dzIHVzZXIgc3BhY2UgdG8gcmVkZWZpbmUKKyAqIGN1c3RvbSBjaGFyYWN0ZXIgc2V0cyBmb3IgTENEIGRldmljZXMuIFBsZWFzZSB1c2UgYSBzeXNmcyBpbnRlcmZhY2UKKyAqIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworI2RlZmluZSBNQVBfVE9fU0VHN19TWVNGU19GSUxFCSJtYXBfc2VnNyIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX1NFRzcobCxhLGIsYyxkLGUsZixnKQlcCisgICAgICAoCWE8PEJJVF9TRUc3X0EgfAliPDxCSVRfU0VHN19CIHwJYzw8QklUX1NFRzdfQyB8CWQ8PEJJVF9TRUc3X0QgfAlcCisJZTw8QklUX1NFRzdfRSB8CWY8PEJJVF9TRUc3X0YgfAlnPDxCSVRfU0VHN19HICkKKworI2RlZmluZSBfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKworI2RlZmluZSBfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJyEnLDAsMCwwLDAsMSwxLDApLCBfU0VHNygnIicsMCwxLDAsMCwwLDEsMCksIF9TRUc3KCcjJywwLDEsMSwwLDEsMSwwKSxcCisgX1NFRzcoJyQnLDEsMCwxLDEsMCwxLDEpLCBfU0VHNygnJScsMCwwLDEsMCwwLDEsMCksIF9TRUc3KCcmJywxLDAsMSwxLDEsMSwxKSxcCisgX1NFRzcoJ1wnJywwLDAsMCwwLDAsMSwwKSxfU0VHNygnKCcsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCcpJywxLDEsMSwxLDAsMCwwKSxcCisgX1NFRzcoJyonLDAsMSwxLDAsMSwxLDEpLCBfU0VHNygnKycsMCwxLDEsMCwwLDAsMSksIF9TRUc3KCcsJywwLDAsMCwwLDEsMCwwKSxcCisgX1NFRzcoJy0nLDAsMCwwLDAsMCwwLDEpLCBfU0VHNygnLicsMCwwLDAsMCwxLDAsMCksIF9TRUc3KCcvJywwLDEsMCwwLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzQ4XzU3X0FTQ0lJX1NFRzdfTlVNRVJJQwkJXAorIF9TRUc3KCcwJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJzEnLDAsMSwxLDAsMCwwLDApLCBfU0VHNygnMicsMSwxLDAsMSwxLDAsMSksXAorIF9TRUc3KCczJywxLDEsMSwxLDAsMCwxKSwgX1NFRzcoJzQnLDAsMSwxLDAsMCwxLDEpLCBfU0VHNygnNScsMSwwLDEsMSwwLDEsMSksXAorIF9TRUc3KCc2JywxLDAsMSwxLDEsMSwxKSwgX1NFRzcoJzcnLDEsMSwxLDAsMCwwLDApLCBfU0VHNygnOCcsMSwxLDEsMSwxLDEsMSksXAorIF9TRUc3KCc5JywxLDEsMSwxLDAsMSwxKSwKKworI2RlZmluZSBfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJzonLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnOycsMCwwLDAsMSwwLDAsMSksIF9TRUc3KCc8JywxLDAsMCwwLDAsMSwxKSxcCisgX1NFRzcoJz0nLDAsMCwwLDEsMCwwLDEpLCBfU0VHNygnPicsMSwxLDAsMCwwLDAsMSksIF9TRUc3KCc/JywxLDEsMSwwLDAsMSwwKSxcCisgX1NFRzcoJ0AnLDEsMSwwLDEsMSwxLDEpLAorCisjZGVmaW5lIF9NQVBfNjVfOTBfQVNDSUlfU0VHN19BTFBIQV9VUFBSCVwKKyBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdCJywxLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ0MnLDEsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnRCcsMSwxLDEsMSwxLDEsMCksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKKyBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdIJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0knLDAsMSwxLDAsMCwwLDApLFwKKyBfU0VHNygnSicsMCwxLDEsMSwwLDAsMCksIF9TRUc3KCdLJywwLDEsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCdOJywxLDEsMSwwLDEsMSwwKSwgX1NFRzcoJ08nLDEsMSwxLDEsMSwxLDApLFwKKyBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdRJywxLDEsMSwxLDEsMSwwKSwgX1NFRzcoJ1InLDEsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ1UnLDAsMSwxLDEsMSwxLDApLFwKKyBfU0VHNygnVicsMCwxLDEsMSwxLDEsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygnWScsMCwxLDEsMCwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzkxXzk2X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisgX1NFRzcoJ1snLDEsMCwwLDEsMSwxLDApLCBfU0VHNygnXFwnLDAsMCwxLDAsMCwxLDEpLF9TRUc3KCddJywxLDEsMSwxLDAsMCwwKSxcCisgX1NFRzcoJ14nLDEsMSwwLDAsMCwxLDApLCBfU0VHNygnXycsMCwwLDAsMSwwLDAsMCksIF9TRUc3KCdgJywwLDEsMCwwLDAsMCwwKSwKKworI2RlZmluZSBfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKyBfU0VHNygnQScsMSwxLDEsMCwxLDEsMSksIF9TRUc3KCdiJywwLDAsMSwxLDEsMSwxKSwgX1NFRzcoJ2MnLDAsMCwwLDEsMSwwLDEpLFwKKyBfU0VHNygnZCcsMCwxLDEsMSwxLDAsMSksIF9TRUc3KCdFJywxLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ0YnLDEsMCwwLDAsMSwxLDEpLFwKKyBfU0VHNygnRycsMSwxLDEsMSwwLDEsMSksIF9TRUc3KCdoJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ2knLDAsMCwxLDAsMCwwLDApLFwKKyBfU0VHNygnaicsMCwwLDEsMSwwLDAsMCksIF9TRUc3KCdrJywwLDAsMSwwLDEsMSwxKSwgX1NFRzcoJ0wnLDAsMCwwLDEsMSwxLDApLFwKKyBfU0VHNygnTScsMSwxLDEsMCwxLDEsMCksIF9TRUc3KCduJywwLDAsMSwwLDEsMCwxKSwgX1NFRzcoJ28nLDAsMCwxLDEsMSwwLDEpLFwKKyBfU0VHNygnUCcsMSwxLDAsMCwxLDEsMSksIF9TRUc3KCdxJywxLDEsMSwwLDAsMSwxKSwgX1NFRzcoJ3InLDAsMCwwLDAsMSwwLDEpLFwKKyBfU0VHNygnUycsMSwwLDEsMSwwLDEsMSksIF9TRUc3KCdUJywwLDAsMCwxLDEsMSwxKSwgX1NFRzcoJ3UnLDAsMCwxLDEsMSwwLDApLFwKKyBfU0VHNygndicsMCwwLDEsMSwxLDAsMCksIF9TRUc3KCdXJywwLDEsMSwxLDEsMSwxKSwgX1NFRzcoJ1gnLDAsMSwxLDAsMSwxLDEpLFwKKyBfU0VHNygneScsMCwxLDEsMSwwLDEsMSksIF9TRUc3KCdaJywxLDEsMCwxLDEsMCwxKSwKKworI2RlZmluZSBfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKyBfU0VHNygneycsMSwwLDAsMSwxLDEsMCksIF9TRUc3KCd8JywwLDAsMCwwLDEsMSwwKSwgX1NFRzcoJ30nLDEsMSwxLDEsMCwwLDApLFwKKyBfU0VHNygnficsMSwwLDAsMCwwLDAsMCksCisKKy8qIE1hcHMgKi8KKworLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSB2aXNpYmxlIGNoYXJhY3RlcmlzdGljcworICogb2YgdGhlIEFTQ0lJIHN5bWJvbCwgbG93ZXJjYXNlIGFuZCB1cHBlcmNhc2UgbGV0dGVycyBtYXkgZGlmZmVyIGluCisgKiBwcmVzZW50YXRpb24gb24gdGhlIGRpc3BsYXkuCisgKi8KKyNkZWZpbmUgTUFQX0FTQ0lJN1NFR19BTFBIQU5VTQkJCVwKKwlfTUFQXzBfMzJfQVNDSUlfU0VHN19OT05fUFJJTlRBQkxFCVwKKwlfTUFQXzMzXzQ3X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF80OF81N19BU0NJSV9TRUc3X05VTUVSSUMJCVwKKwlfTUFQXzU4XzY0X0FTQ0lJX1NFRzdfU1lNQk9MCQlcCisJX01BUF82NV85MF9BU0NJSV9TRUc3X0FMUEhBX1VQUFIJXAorCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKwlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKKworLyogVGhpcyBzZXQgdHJpZXMgdG8gbWFwIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBzeW1ib2xpYyBjaGFyYWN0ZXJpc3RpY3MKKyAqIG9mIHRoZSBBU0NJSSBjaGFyYWN0ZXIgZm9yIG1heGltdW0gZGlzY3JpbWluYXRpb24uCisgKiBGb3Igbm93IHRoaXMgbWVhbnMgYWxsIGFscGhhIGNoYXJzIGFyZSBpbiBsb3dlciBjYXNlIHJlcHJlc2VudGF0aW9ucy4KKyAqIChUaGlzIGZvciBleGFtcGxlIGZhY2lsaXRhdGVzIHRoZSB1c2Ugb2YgaGV4IG51bWJlcnMgd2l0aCB1cHBlcmNhc2UgaW5wdXQuKQorICovCisjZGVmaW5lIE1BUF9BU0NJSTdTRUdfQUxQSEFOVU1fTEMJCQlcCisJX01BUF8wXzMyX0FTQ0lJX1NFRzdfTk9OX1BSSU5UQUJMRQlcCisJX01BUF8zM180N19BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfNDhfNTdfQVNDSUlfU0VHN19OVU1FUklDCQlcCisJX01BUF81OF82NF9BU0NJSV9TRUc3X1NZTUJPTAkJXAorCV9NQVBfOTdfMTIyX0FTQ0lJX1NFRzdfQUxQSEFfTE9XRVIJXAorCV9NQVBfOTFfOTZfQVNDSUlfU0VHN19TWU1CT0wJCVwKKwlfTUFQXzk3XzEyMl9BU0NJSV9TRUc3X0FMUEhBX0xPV0VSCVwKKwlfTUFQXzEyM18xMjZfQVNDSUlfU0VHN19TWU1CT0wKKworI2RlZmluZSBTRUc3X0RFRkFVTFRfTUFQKF9uYW1lKQkJXAorCVNFRzdfQ09OVkVSU0lPTl9NQVAoX25hbWUsTUFQX0FTQ0lJN1NFR19BTFBIQU5VTSkKKworI2VuZGlmCS8qIE1BUF9UT183U0VHTUVOVF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtc3RpY2suaCBiL2luY2x1ZGUvbGludXgvbWVtc3RpY2suaAppbmRleCBhOWY5OThhLi5kMGMzN2U2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXN0aWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1zdGljay5oCkBAIC0yMSwzMCArMjEsMzAgQEAKIHN0cnVjdCBtc19zdGF0dXNfcmVnaXN0ZXIgewogCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7CiAJdW5zaWduZWQgY2hhciBpbnRlcnJ1cHQ7Ci0jZGVmaW5lIE1FTVNUSUNLX0lOVF9DTUROQUsgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIE1FTVNUSUNLX0lOVF9JT1JFUSAgICAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIE1FTVNUSUNLX0lOVF9JT0JSRVEgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1FTVNUSUNLX0lOVF9CUkVRICAgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIE1FTVNUSUNLX0lOVF9FUlIgICAgICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIE1FTVNUSUNLX0lOVF9DRUQgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIE1FTVNUSUNLX0lOVF9DTUROQUsgMHgwMQorI2RlZmluZSBNRU1TVElDS19JTlRfSU9SRVEgIDB4MDgKKyNkZWZpbmUgTUVNU1RJQ0tfSU5UX0lPQlJFUSAweDEwCisjZGVmaW5lIE1FTVNUSUNLX0lOVF9CUkVRICAgMHgyMAorI2RlZmluZSBNRU1TVElDS19JTlRfRVJSICAgIDB4NDAKKyNkZWZpbmUgTUVNU1RJQ0tfSU5UX0NFRCAgICAweDgwCiAKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czA7Ci0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfV1AgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfU0wgICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfQkYgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfQkUgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfRkIwICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfTUIgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfV1AgIDB4MDEKKyNkZWZpbmUgTUVNU1RJQ0tfU1RBVFVTMF9TTCAgMHgwMgorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX0JGICAweDEwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzBfQkUgIDB4MjAKKyNkZWZpbmUgTUVNU1RJQ0tfU1RBVFVTMF9GQjAgMHg0MAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX01CICAweDgwCiAKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czE7Ci0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNGRyAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRkdFUiAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNFWCAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRVhFUiAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNEVCAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRFRFUiAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRkJJICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfTUIgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNGRyAweDAxCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRkdFUiAweDAyCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNFWCAweDA0CisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRVhFUiAweDA4CisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfVUNEVCAweDEwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRFRFUiAweDIwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfRkIxICAweDQwCisjZGVmaW5lIE1FTVNUSUNLX1NUQVRVUzFfTUIgICAweDgwCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbXNfaWRfcmVnaXN0ZXIgewpAQCAtNTYsMzIgKzU2LDMyIEBACiAKIHN0cnVjdCBtc19wYXJhbV9yZWdpc3RlciB7CiAJdW5zaWduZWQgY2hhciBzeXN0ZW07Ci0jZGVmaW5lIE1FTVNUSUNLX1NZU19BVEVOIDB4YzAKLSNkZWZpbmUgTUVNU1RJQ0tfU1lTX0JBTUQgMHg4MAogI2RlZmluZSBNRU1TVElDS19TWVNfUEFNICAweDA4CisjZGVmaW5lIE1FTVNUSUNLX1NZU19CQU1EIDB4ODAKIAogCXVuc2lnbmVkIGNoYXIgYmxvY2tfYWRkcmVzc19tc2I7CiAJdW5zaWduZWQgc2hvcnQgYmxvY2tfYWRkcmVzczsKIAl1bnNpZ25lZCBjaGFyIGNwOwotI2RlZmluZSBNRU1TVElDS19DUF9CTE9DSyAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBNRU1TVElDS19DUF9QQUdFICAgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBNRU1TVElDS19DUF9FWFRSQSAgICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBNRU1TVElDS19DUF9PVkVSV1JJVEUgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBNRU1TVElDS19DUF9CTE9DSyAgICAgMHgwMAorI2RlZmluZSBNRU1TVElDS19DUF9QQUdFICAgICAgMHgyMAorI2RlZmluZSBNRU1TVElDS19DUF9FWFRSQSAgICAgMHg0MAorI2RlZmluZSBNRU1TVElDS19DUF9PVkVSV1JJVEUgMHg4MAogCiAJdW5zaWduZWQgY2hhciBwYWdlX2FkZHJlc3M7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbXNfZXh0cmFfZGF0YV9yZWdpc3RlciB7CiAJdW5zaWduZWQgY2hhciAgb3ZlcndyaXRlX2ZsYWc7Ci0jZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9VUERBVEEgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9QQUdFICAgICAgICAgMHgwMDYwCi0jZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9CTE9DSyAgICAgICAgMHgwMDgwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9VRFNUICAweDEwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9QR1NUMSAweDIwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9QR1NUMCAweDQwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9CS1NUICAweDgwCiAKIAl1bnNpZ25lZCBjaGFyICBtYW5hZ2VtZW50X2ZsYWc7Ci0jZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfU1lTVEVNICAgICAgMHgwMDA0Ci0jZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfVFJBTlNfVEFCTEUgMHgwMDA4Ci0jZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfQ09QWSAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfQUNDRVNTICAgICAgMHgwMDIwCisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfU1lTRkxHIDB4MDQKKyNkZWZpbmUgTUVNU1RJQ0tfTUFOQUdFTUVOVF9BVEZMRyAgMHgwOAorI2RlZmluZSBNRU1TVElDS19NQU5BR0VNRU5UX1NDTVMxICAweDEwCisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfU0NNUzAgIDB4MjAKIAogCXVuc2lnbmVkIHNob3J0IGxvZ2ljYWxfYWRkcmVzczsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC05Niw5ICs5Niw5IEBACiAKIHN0cnVjdCBtc3Byb19wYXJhbV9yZWdpc3RlciB7CiAJdW5zaWduZWQgY2hhciAgc3lzdGVtOwotI2RlZmluZSBNRU1TVElDS19TWVNfU0VSSUFMIDB4ODAKICNkZWZpbmUgTUVNU1RJQ0tfU1lTX1BBUjQgICAweDAwCiAjZGVmaW5lIE1FTVNUSUNLX1NZU19QQVI4ICAgMHg0MAorI2RlZmluZSBNRU1TVElDS19TWVNfU0VSSUFMIDB4ODAKIAogCXVuc2lnbmVkIHNob3J0IGRhdGFfY291bnQ7CiAJdW5zaWduZWQgaW50ICAgZGF0YV9hZGRyZXNzOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJdW5zaWduZWQgY2hhciB3X2xlbmd0aDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLWVudW0geworZW51bSBtZW1zdGlja190cGMgewogCU1TX1RQQ19SRUFEX01HX1NUQVRVUyAgID0gMHgwMSwKIAlNU19UUENfUkVBRF9MT05HX0RBVEEgICA9IDB4MDIsCiAJTVNfVFBDX1JFQURfU0hPUlRfREFUQSAgPSAweDAzLApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJTVNfVFBDX1NFVF9DTUQgICAgICAgICAgPSAweDBlCiB9OwogCi1lbnVtIHsKK2VudW0gbWVtc3RpY2tfY29tbWFuZCB7CiAJTVNfQ01EX0JMT0NLX0VORCAgICAgICA9IDB4MzMsCiAJTVNfQ01EX1JFU0VUICAgICAgICAgICA9IDB4M2MsCiAJTVNfQ01EX0JMT0NLX1dSSVRFICAgICA9IDB4NTUsCkBAIC0yMDEsOCArMjAxLDYgQEAKIAogLyoqKiBEcml2ZXIgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zICoqKi8KIAotI2RlZmluZSBNRU1TVElDS19QQVJUX1NISUZUIDMKLQogZW51bSBtZW1zdGlja19wYXJhbSB7IE1FTVNUSUNLX1BPV0VSID0gMSwgTUVNU1RJQ0tfSU5URVJGQUNFIH07CiAKICNkZWZpbmUgTUVNU1RJQ0tfUE9XRVJfT0ZGIDAKQEAgLTIxNSwyNCArMjEzLDI3IEBACiBzdHJ1Y3QgbWVtc3RpY2tfaG9zdDsKIHN0cnVjdCBtZW1zdGlja19kcml2ZXI7CiAKK3N0cnVjdCBtZW1zdGlja19kZXZpY2VfaWQgeworCXVuc2lnbmVkIGNoYXIgbWF0Y2hfZmxhZ3M7CiAjZGVmaW5lIE1FTVNUSUNLX01BVENIX0FMTCAgICAgICAgICAgIDB4MDEKIAorCXVuc2lnbmVkIGNoYXIgdHlwZTsKICNkZWZpbmUgTUVNU1RJQ0tfVFlQRV9MRUdBQ1kgICAgICAgICAgMHhmZgogI2RlZmluZSBNRU1TVElDS19UWVBFX0RVTyAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIE1FTVNUSUNLX1RZUEVfUFJPICAgICAgICAgICAgIDB4MDEKIAorCXVuc2lnbmVkIGNoYXIgY2F0ZWdvcnk7CiAjZGVmaW5lIE1FTVNUSUNLX0NBVEVHT1JZX1NUT1JBR0UgICAgIDB4ZmYKICNkZWZpbmUgTUVNU1RJQ0tfQ0FURUdPUllfU1RPUkFHRV9EVU8gMHgwMAorI2RlZmluZSBNRU1TVElDS19DQVRFR09SWV9JTyAgICAgICAgICAweDAxCisjZGVmaW5lIE1FTVNUSUNLX0NBVEVHT1JZX0lPX1BSTyAgICAgIDB4MTAKIAotI2RlZmluZSBNRU1TVElDS19DTEFTU19HRU5FUklDICAgICAgICAweGZmCi0jZGVmaW5lIE1FTVNUSUNLX0NMQVNTX0dFTkVSSUNfRFVPICAgIDB4MDAKLQotCi1zdHJ1Y3QgbWVtc3RpY2tfZGV2aWNlX2lkIHsKLQl1bnNpZ25lZCBjaGFyIG1hdGNoX2ZsYWdzOwotCXVuc2lnbmVkIGNoYXIgdHlwZTsKLQl1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OwogCXVuc2lnbmVkIGNoYXIgY2xhc3M7CisjZGVmaW5lIE1FTVNUSUNLX0NMQVNTX0ZMQVNIICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgTUVNU1RJQ0tfQ0xBU1NfRFVPICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNRU1TVElDS19DTEFTU19ST00gICAgICAgICAgICAweDAxCisjZGVmaW5lIE1FTVNUSUNLX0NMQVNTX1JPICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUVNU1RJQ0tfQ0xBU1NfV1AgICAgICAgICAgICAgMHgwMwogfTsKIAogc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgewpAQCAtMzE5LDkgKzMyMCw5IEBACiB2b2lkIG1lbXN0aWNrX3Jlc3VtZV9ob3N0KHN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0KTsKIAogdm9pZCBtZW1zdGlja19pbml0X3JlcV9zZyhzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqbXJxLCB1bnNpZ25lZCBjaGFyIHRwYywKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyk7CisJCQkgIGNvbnN0IHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOwogdm9pZCBtZW1zdGlja19pbml0X3JlcShzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqbXJxLCB1bnNpZ25lZCBjaGFyIHRwYywKLQkJICAgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCk7CisJCSAgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgpOwogaW50IG1lbXN0aWNrX25leHRfcmVxKHN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0LAogCQkgICAgICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSk7CiB2b2lkIG1lbXN0aWNrX25ld19yZXEoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oIGIvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oCmluZGV4IGVjNjEyZTYuLjUxNmQ5NTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90bWlvLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIE1GRF9UTUlPX0gKICNkZWZpbmUgTUZEX1RNSU9fSAogCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKwogI2RlZmluZSB0bWlvX2lvcmVhZDgoYWRkcikgcmVhZGIoYWRkcikKICNkZWZpbmUgdG1pb19pb3JlYWQxNihhZGRyKSByZWFkdyhhZGRyKQogI2RlZmluZSB0bWlvX2lvcmVhZDE2X3JlcChyLCBiLCBsKSByZWFkc3cociwgYiwgbCkKQEAgLTI1LDQgKzI3LDIxIEBACiAJdW5zaWduZWQgaW50CQludW1fcGFydGl0aW9uczsKIH07CiAKKyNkZWZpbmUgRkJJT19UTUlPX0FDQ19XUklURQkweDdDNjM5MzAwCisjZGVmaW5lIEZCSU9fVE1JT19BQ0NfU1lOQwkweDdDNjM5MzAxCisKK3N0cnVjdCB0bWlvX2ZiX2RhdGEgeworCWludAkJCSgqbGNkX3NldF9wb3dlcikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZmJfZGV2LAorCQkJCQkJCQlib29sIG9uKTsKKwlpbnQJCQkoKmxjZF9tb2RlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpmYl9kZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpOworCWludAkJCW51bV9tb2RlczsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlCSptb2RlczsKKworCS8qIGluIG1tOiBzaXplIG9mIHNjcmVlbiAqLworCWludAkJCWhlaWdodDsKKwlpbnQJCQl3aWR0aDsKK307CisKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvYXVkaW8uaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2JiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvYXVkaW8uaApAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqIGF1ZGlvLmggIC0tICBBdWRpbyBEcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX0FVRElPX0hfCisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9BVURJT19IXworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgV004MzUwX0NMT0NLX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgV004MzUwX0NMT0NLX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgV004MzUwX0ZMTF9DT05UUk9MXzEgICAgICAgICAgICAgICAgICAgIDB4MkEKKyNkZWZpbmUgV004MzUwX0ZMTF9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgIDB4MkIKKyNkZWZpbmUgV004MzUwX0ZMTF9DT05UUk9MXzMgICAgICAgICAgICAgICAgICAgIDB4MkMKKyNkZWZpbmUgV004MzUwX0ZMTF9DT05UUk9MXzQgICAgICAgICAgICAgICAgICAgIDB4MkQKKyNkZWZpbmUgV004MzUwX0RBQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgV004MzUwX0RBQ19ESUdJVEFMX1ZPTFVNRV9MICAgICAgICAgICAgIDB4MzIKKyNkZWZpbmUgV004MzUwX0RBQ19ESUdJVEFMX1ZPTFVNRV9SICAgICAgICAgICAgIDB4MzMKKyNkZWZpbmUgV004MzUwX0RBQ19MUl9SQVRFICAgICAgICAgICAgICAgICAgICAgIDB4MzUKKyNkZWZpbmUgV004MzUwX0RBQ19DTE9DS19DT05UUk9MICAgICAgICAgICAgICAgIDB4MzYKKyNkZWZpbmUgV004MzUwX0RBQ19NVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0EKKyNkZWZpbmUgV004MzUwX0RBQ19NVVRFX1ZPTFVNRSAgICAgICAgICAgICAgICAgIDB4M0IKKyNkZWZpbmUgV004MzUwX0RBQ19TSURFICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MKKyNkZWZpbmUgV004MzUwX0FEQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgV004MzUwX0FEQ19ESUdJVEFMX1ZPTFVNRV9MICAgICAgICAgICAgIDB4NDIKKyNkZWZpbmUgV004MzUwX0FEQ19ESUdJVEFMX1ZPTFVNRV9SICAgICAgICAgICAgIDB4NDMKKyNkZWZpbmUgV004MzUwX0FEQ19ESVZJREVSICAgICAgICAgICAgICAgICAgICAgIDB4NDQKKyNkZWZpbmUgV004MzUwX0FEQ19MUl9SQVRFICAgICAgICAgICAgICAgICAgICAgIDB4NDYKKyNkZWZpbmUgV004MzUwX0lOUFVUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgV004MzUwX0lOM19JTlBVVF9DT05UUk9MICAgICAgICAgICAgICAgIDB4NDkKKyNkZWZpbmUgV004MzUwX01JQ19CSUFTX0NPTlRST0wgICAgICAgICAgICAgICAgIDB4NEEKKyNkZWZpbmUgV004MzUwX09VVFBVVF9DT05UUk9MICAgICAgICAgICAgICAgICAgIDB4NEMKKyNkZWZpbmUgV004MzUwX0pBQ0tfREVURUNUICAgICAgICAgICAgICAgICAgICAgIDB4NEQKKyNkZWZpbmUgV004MzUwX0FOVElfUE9QX0NPTlRST0wgICAgICAgICAgICAgICAgIDB4NEUKKyNkZWZpbmUgV004MzUwX0xFRlRfSU5QVVRfVk9MVU1FICAgICAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSAgICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgV004MzUwX0xFRlRfTUlYRVJfQ09OVFJPTCAgICAgICAgICAgICAgIDB4NTgKKyNkZWZpbmUgV004MzUwX1JJR0hUX01JWEVSX0NPTlRST0wgICAgICAgICAgICAgIDB4NTkKKyNkZWZpbmUgV004MzUwX09VVDNfTUlYRVJfQ09OVFJPTCAgICAgICAgICAgICAgIDB4NUMKKyNkZWZpbmUgV004MzUwX09VVDRfTUlYRVJfQ09OVFJPTCAgICAgICAgICAgICAgIDB4NUQKKyNkZWZpbmUgV004MzUwX09VVFBVVF9MRUZUX01JWEVSX1ZPTFVNRSAgICAgICAgIDB4NjAKKyNkZWZpbmUgV004MzUwX09VVFBVVF9SSUdIVF9NSVhFUl9WT0xVTUUgICAgICAgIDB4NjEKKyNkZWZpbmUgV004MzUwX0lOUFVUX01JWEVSX1ZPTFVNRV9MICAgICAgICAgICAgIDB4NjIKKyNkZWZpbmUgV004MzUwX0lOUFVUX01JWEVSX1ZPTFVNRV9SICAgICAgICAgICAgIDB4NjMKKyNkZWZpbmUgV004MzUwX0lOUFVUX01JWEVSX1ZPTFVNRSAgICAgICAgICAgICAgIDB4NjQKKyNkZWZpbmUgV004MzUwX0xPVVQxX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4NjgKKyNkZWZpbmUgV004MzUwX1JPVVQxX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4NjkKKyNkZWZpbmUgV004MzUwX0xPVVQyX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4NkEKKyNkZWZpbmUgV004MzUwX1JPVVQyX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4NkIKKyNkZWZpbmUgV004MzUwX0JFRVBfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgIDB4NkYKKyNkZWZpbmUgV004MzUwX0FJX0ZPUk1BVElORyAgICAgICAgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgV004MzUwX0FEQ19EQUNfQ09NUCAgICAgICAgICAgICAgICAgICAgIDB4NzEKKyNkZWZpbmUgV004MzUwX0FJX0FEQ19DT05UUk9MICAgICAgICAgICAgICAgICAgIDB4NzIKKyNkZWZpbmUgV004MzUwX0FJX0RBQ19DT05UUk9MICAgICAgICAgICAgICAgICAgIDB4NzMKKyNkZWZpbmUgV004MzUwX0FJRl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzQKKyNkZWZpbmUgV004MzUwX0pBQ0tfUElOX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4RTcKKworLyogQml0IHZhbHVlcyBmb3IgUjA4ICgweDA4KSAqLworI2RlZmluZSBXTTgzNTBfQ09ERUNfSVNFTF8xXzUgICAgICAgICAgICAgICAgICAgMAkvKiB4MS41ICovCisjZGVmaW5lIFdNODM1MF9DT0RFQ19JU0VMXzFfMCAgICAgICAgICAgICAgICAgICAxCS8qIHgxLjAgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0lTRUxfMF83NSAgICAgICAgICAgICAgICAgIDIJLyogeDAuNzUgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0lTRUxfMF81ICAgICAgICAgICAgICAgICAgIDMJLyogeDAuNSAqLworCisjZGVmaW5lIFdNODM1MF9WTUlEX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9WTUlEXzUwMEsgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9WTUlEXzEwMEsgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9WTUlEXzEwSyAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKy8qCisgKiBSNDAgKDB4MjgpIC0gQ2xvY2sgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004MzUwX1RPQ0xLX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTUNMS19TRUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9NQ0xLX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGMAorI2RlZmluZSBXTTgzNTBfT1BDTEtfRElWX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDA3CisKKy8qCisgKiBSNDEgKDB4MjkpIC0gQ2xvY2sgQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004MzUwX0xSQ19BRENfU0VMICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTUNMS19ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNDIgKDB4MkEpIC0gRkxMIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODM1MF9GTExfRElUSEVSX1dJRFRIX01BU0sgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX0ZMTF9ESVRIRVJfSFAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfRkxMX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAgMHgwNzAwCisjZGVmaW5lIFdNODM1MF9GTExfUlNQX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDAwRjAKKyNkZWZpbmUgV004MzUwX0ZMTF9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNworCisvKgorICogUjQzICgweDJCKSAtIEZMTCBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzNTBfRkxMX1JBVElPX01BU0sgICAgICAgICAgICAgICAgICAgMHhGODAwCisjZGVmaW5lIFdNODM1MF9GTExfTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAzRkYKKworLyoKKyAqIFI0NCAoMHgyQykgLSBGTEwgQ29udHJvbCAzCisgKi8KKyNkZWZpbmUgV004MzUwX0ZMTF9LX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRgorCisvKgorICogUjQ1ICgweDJEKSAtIEZMTCBDb250cm9sIDQKKyAqLworI2RlZmluZSBXTTgzNTBfRkxMX0ZSQUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9GTExfU0xPV19MT0NLX1JFRiAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0ZMTF9DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKgorICogUjQ4ICgweDMwKSAtIERBQyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ19NT05PICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQUlGX0xSQ0xLUkFURSAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9ERUVNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RBQ0xfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfREFDUl9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNTAgKDB4MzIpIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwKKyAqLworI2RlZmluZSBXTTgzNTBfREFDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQUNMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYKKworLyoKKyAqIFI1MSAoMHgzMykgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUgorICovCisjZGVmaW5lIFdNODM1MF9EQUNfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0RBQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRgorCisvKgorICogUjUzICgweDM1KSAtIERBQyBMUiBSYXRlCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ0xSQ19FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfREFDTFJDX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0ZGCisKKy8qCisgKiBSNTQgKDB4MzYpIC0gREFDIENsb2NrIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREFDQ0xLX1BPTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9EQUNfQ0xLRElWX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDcKKworLyoKKyAqIFI1OCAoMHgzQSkgLSBEQUMgTXV0ZQorICovCisjZGVmaW5lIFdNODM1MF9EQUNfTVVURV9FTkEgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKworLyoKKyAqIFI1OSAoMHgzQikgLSBEQUMgTXV0ZSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfREFDX01VVEVNT0RFICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9EQUNfTVVURVJBVEUgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0RBQ19TQl9GSUxUICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisvKgorICogUjYwICgweDNDKSAtIERBQyBTaWRlCisgKi8KKyNkZWZpbmUgV004MzUwX0FEQ19UT19EQUNMX01BU0sgICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTgzNTBfQURDX1RPX0RBQ1JfTUFTSyAgICAgICAgICAgICAgICAgMHgwQzAwCisKKy8qCisgKiBSNjQgKDB4NDApIC0gQURDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfQURDX0hQRl9DVVRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9BRENMX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0FEQ1JfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjY2ICgweDQyKSAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMCisgKi8KKyNkZWZpbmUgV004MzUwX0FEQ19WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQURDTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGCisKKy8qCisgKiBSNjcgKDB4NDMpIC0gQURDIERpZ2l0YWwgVm9sdW1lIFIKKyAqLworI2RlZmluZSBXTTgzNTBfQURDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9BRENSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYKKworLyoKKyAqIFI2OCAoMHg0NCkgLSBBREMgRGl2aWRlcgorICovCisjZGVmaW5lIFdNODM1MF9BRENMX0RBQ19TVk9MX01BU0sgICAgICAgICAgICAgICAweDBGMDAKKyNkZWZpbmUgV004MzUwX0FEQ1JfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGMAorI2RlZmluZSBXTTgzNTBfQURDQ0xLX1BPTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9BRENfQ0xLRElWX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDcKKworLyoKKyAqIFI3MCAoMHg0NikgLSBBREMgTFIgUmF0ZQorICovCisjZGVmaW5lIFdNODM1MF9BRENMUkNfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0FEQ0xSQ19SQVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDdGRgorCisvKgorICogUjcyICgweDQ4KSAtIElucHV0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfSU4yUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTjFSTl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lOMVJQX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU4yTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTjFMTl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lOMUxQX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjczICgweDQ5KSAtIElOMyBJbnB1dCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0lOM1JfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfSU4zTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisKKy8qCisgKiBSNzQgKDB4NEEpIC0gTWljIEJpYXMgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9NSUNCU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX01DRFRIUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxQworI2RlZmluZSBXTTgzNTBfTUNEU0NUSFJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8qCisgKiBSNzYgKDB4NEMpIC0gT3V0cHV0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfT1VUNF9WUk9JICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9PVVQzX1ZST0kgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX09VVDJfVlJPSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfT1VUMV9WUk9JICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9PVVQyX0ZCICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX09VVDFfRkIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjc3ICgweDREKSAtIEphY2sgRGV0ZWN0CisgKi8KKyNkZWZpbmUgV004MzUwX0pETF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfSkRSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisKKy8qCisgKiBSNzggKDB4NEUpIC0gQW50aSBQb3AgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9BTlRJX1BPUF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RJU19PUF9MTjRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDBDMAorI2RlZmluZSBXTTgzNTBfRElTX09QX0xOM19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9ESVNfT1BfT1VUMl9NQVNLICAgICAgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgV004MzUwX0RJU19PUF9PVVQxX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKgorICogUjgwICgweDUwKSAtIExlZnQgSW5wdXQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX0lOTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfSU5MX1pDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lOTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDBGQworCisvKgorICogUjgxICgweDUxKSAtIFJpZ2h0IElucHV0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9JTlJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0lOUl9aQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwRkMKKworLyoKKyAqIFI4OCAoMHg1OCkgLSBMZWZ0IE1peGVyIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREFDUl9UT19NSVhPVVRMICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQUNMX1RPX01JWE9VVEwgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lOM0xfVE9fTUlYT1VUTCAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU5SX1RPX01JWE9VVEwgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTkxfVE9fTUlYT1VUTCAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI4OSAoMHg1OSkgLSBSaWdodCBNaXhlciBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ1JfVE9fTUlYT1VUUiAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREFDTF9UT19NSVhPVVRSICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9JTjNSX1RPX01JWE9VVFIgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0lOUl9UT19NSVhPVVRSICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSU5MX1RPX01JWE9VVFIgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSOTIgKDB4NUMpIC0gT1VUMyBNaXhlciBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0RBQ0xfVE9fT1VUMyAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfTUlYSU5MX1RPX09VVDMgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9PVVQ0X1RPX09VVDMgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX01JWE9VVExfVE9fT1VUMyAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjkzICgweDVEKSAtIE9VVDQgTWl4ZXIgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQUNSX1RPX09VVDQgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RBQ0xfVE9fT1VUNCAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfT1VUNF9BVFROICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9NSVhJTlJfVE9fT1VUNCAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX09VVDNfVE9fT1VUNCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfTUlYT1VUUl9UT19PVVQ0ICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9NSVhPVVRMX1RPX09VVDQgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI5NiAoMHg2MCkgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF9NQVNLICAgICAgICAgICAgMHgwRTAwCisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MX1NISUZUICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MDBFMAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MX1NISUZUICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfTUFTSyAgICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgMQorCisvKiBCaXQgdmFsdWVzIGZvciBSOTYgKDB4NjApICovCisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfTTEyREIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF9NOURCICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MX002REIgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfTTNEQiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU4zTF9NSVhPVVRMX1ZPTF8wREIgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTjNMX01JWE9VVExfVk9MXzNEQiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYT1VUTF9WT0xfNkRCICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfT0ZGICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MX005REIgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfTTZEQiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF9NM0RCICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVExfVk9MXzBEQiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUTF9WT0xfM0RCICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRMX1ZPTF82REIgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfT0ZGICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MX005REIgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfTTZEQiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF9NM0RCICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVExfVk9MXzBEQiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUTF9WT0xfM0RCICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRMX1ZPTF82REIgICAgICAgICAgICAgICAgICAgNworCisvKgorICogUjk3ICgweDYxKSAtIE91dHB1dCBSaWdodCBNaXhlciBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF9NQVNLICAgICAgICAgICAgMHhFMDAwCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MX1NISUZUICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MDBFMAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MX1NISUZUICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfTUFTSyAgICAgICAgICAgICAweDAwMEUKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgMQorCisvKiBCaXQgdmFsdWVzIGZvciBSOTYgKDB4NjApICovCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfTTEyREIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF9NOURCICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MX002REIgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfTTNEQiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU4zUl9NSVhPVVRSX1ZPTF8wREIgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTjNSX01JWE9VVFJfVk9MXzNEQiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOM1JfTUlYT1VUUl9WT0xfNkRCICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfT0ZGICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MX005REIgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfTTZEQiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF9NM0RCICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU5SX01JWE9VVFJfVk9MXzBEQiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTlJfTUlYT1VUUl9WT0xfM0RCICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOUl9NSVhPVVRSX1ZPTF82REIgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfT0ZGICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9NMTJEQiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MX005REIgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfTTZEQiAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF9NM0RCICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfSU5MX01JWE9VVFJfVk9MXzBEQiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9JTkxfTUlYT1VUUl9WT0xfM0RCICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX0lOTF9NSVhPVVRSX1ZPTF82REIgICAgICAgICAgICAgICAgICAgNworCisvKgorICogUjk4ICgweDYyKSAtIElucHV0IE1peGVyIFZvbHVtZSBMCisgKi8KKyNkZWZpbmUgV004MzUwX0lOM0xfTUlYSU5MX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MEUwMAorI2RlZmluZSBXTTgzNTBfSU4yTF9NSVhJTkxfVk9MX01BU0sgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFdNODM1MF9JTkxfTUlYSU5MX1ZPTCAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFI5OSAoMHg2MykgLSBJbnB1dCBNaXhlciBWb2x1bWUgUgorICovCisjZGVmaW5lIFdNODM1MF9JTjNSX01JWElOUl9WT0xfTUFTSyAgICAgICAgICAgICAweEUwMDAKKyNkZWZpbmUgV004MzUwX0lOMlJfTUlYSU5SX1ZPTF9NQVNLICAgICAgICAgICAgIDB4MDBFMAorI2RlZmluZSBXTTgzNTBfSU5SX01JWElOUl9WT0wgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTAwICgweDY0KSAtIElucHV0IE1peGVyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9PVVQ0X01JWElOX0RTVCAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX09VVDRfTUlYSU5fVk9MX01BU0sgICAgICAgICAgICAgIDB4MDAwRQorCisvKgorICogUjEwNCAoMHg2OCkgLSBMT1VUMSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfT1VUMUxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9PVVQxTF9aQyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX09VVDFfVlUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfT1VUMUxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZDCisjZGVmaW5lIFdNODM1MF9PVVQxTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxMDUgKDB4NjkpIC0gUk9VVDEgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX09VVDFSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfT1VUMVJfWkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9PVVQxX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX09VVDFSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGQworI2RlZmluZSBXTTgzNTBfT1VUMVJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMTA2ICgweDZBKSAtIExPVVQyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODM1MF9PVVQyTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX09VVDJMX1pDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfT1VUMl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9PVVQyTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkMKKworLyoKKyAqIFIxMDcgKDB4NkIpIC0gUk9VVDIgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004MzUwX09VVDJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfT1VUMlJfWkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9PVVQyUl9JTlYgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX09VVDJSX0lOVl9NVVRFICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfT1VUMl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9PVVQyUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkMKKworLyoKKyAqIFIxMTEgKDB4NkYpIC0gQkVFUCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTgzNTBfSU4zUl9PVVQyUl9WT0xfTUFTSyAgICAgICAgICAgICAgMHgwMEUwCisKKy8qCisgKiBSMTEyICgweDcwKSAtIEFJIEZvcm1hdGluZworICovCisjZGVmaW5lIFdNODM1MF9BSUZfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0FJRl9UUkkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQUlGX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9BSUZfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDBDMDAKKyNkZWZpbmUgV004MzUwX0FJRl9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorCisvKgorICogUjExMyAoMHg3MSkgLSBBREMgREFDIENPTVAKKyAqLworI2RlZmluZSBXTTgzNTBfREFDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9EQUNfQ09NUE1PREUgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0FEQ19DT01QICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQURDX0NPTVBNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMTQgKDB4NzIpIC0gQUkgQURDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfQUlGQURDX1BEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9BSUZBRENMX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0FJRkFEQ1JfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQUlGQURDX1RETV9DSEFOICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9BSUZBRENfVERNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKworLyoKKyAqIFIxMTUgKDB4NzMpIC0gQUkgREFDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfQkNMS19NU1RSICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9BSUZEQUNfUEQgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0RBQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfREFDUl9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9BSUZEQUNfVERNX0NIQU4gICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0FJRkRBQ19URE0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfREFDX0JPT1NUX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8qCisgKiBSMTE2ICgweDc0KSAtIEFJRiBUZXN0CisgKi8KKyNkZWZpbmUgV004MzUwX0NPREVDX0JZUCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfQUlGQURDX1dSX1RTVCAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9BSUZBRENfUkRfVFNUICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0FJRkRBQ19XUl9UU1QgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfQUlGREFDX1JEX1RTVCAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9BSUZBRENfQVNZTiAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0FJRkRBQ19BU1lOICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorCisvKgorICogUjIzMSAoMHhFNykgLSBKYWNrIFN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9KQUNLX1JfTFZMICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKworLyoKKyAqIFdNODM1MCBQbGF0Zm9ybSBzZXR1cAorICovCisjZGVmaW5lIFdNODM1MF9TX0NVUlZFX05PTkUJCQkweDAKKyNkZWZpbmUgV004MzUwX1NfQ1VSVkVfRkFTVAkJCTB4MQorI2RlZmluZSBXTTgzNTBfU19DVVJWRV9NRURJVU0JCQkweDIKKyNkZWZpbmUgV004MzUwX1NfQ1VSVkVfU0xPVwkJCTB4MworCisjZGVmaW5lIFdNODM1MF9ESVNDSEFSR0VfT0ZGCQkJMHgwCisjZGVmaW5lIFdNODM1MF9ESVNDSEFSR0VfRkFTVAkJCTB4MQorI2RlZmluZSBXTTgzNTBfRElTQ0hBUkdFX01FRElVTQkJCTB4MgorI2RlZmluZSBXTTgzNTBfRElTQ0hBUkdFX1NMT1cJCQkweDMKKworI2RlZmluZSBXTTgzNTBfVElFX09GRl81MDBSCQkJMHgwCisjZGVmaW5lIFdNODM1MF9USUVfT0ZGXzMwSwkJCTB4MQorCisvKgorICogQ2xvY2sgc291cmNlcyAmIGRpcmVjdGlvbnMKKyAqLworI2RlZmluZSBXTTgzNTBfU1lTQ0xLCQkJCTAKKworI2RlZmluZSBXTTgzNTBfTUNMS19TRUxfUExMX01DTEsJCTAKKyNkZWZpbmUgV004MzUwX01DTEtfU0VMX1BMTF9EQUMJCQkxCisjZGVmaW5lIFdNODM1MF9NQ0xLX1NFTF9QTExfQURDCQkJMgorI2RlZmluZSBXTTgzNTBfTUNMS19TRUxfUExMXzMySwkJCTMKKyNkZWZpbmUgV004MzUwX01DTEtfU0VMX01DTEsJCQk1CisKKyNkZWZpbmUgV004MzUwX01DTEtfRElSX09VVAkJCTAKKyNkZWZpbmUgV004MzUwX01DTEtfRElSX0lOCQkJMQorCisvKiBjbG9jayBkaXZpZGVyIGlkJ3MgKi8KKyNkZWZpbmUgV004MzUwX0FEQ19DTEtESVYJCQkwCisjZGVmaW5lIFdNODM1MF9EQUNfQ0xLRElWCQkJMQorI2RlZmluZSBXTTgzNTBfQkNMS19DTEtESVYJCQkyCisjZGVmaW5lIFdNODM1MF9PUENMS19DTEtESVYJCQkzCisjZGVmaW5lIFdNODM1MF9UT19DTEtESVYJCQk0CisjZGVmaW5lIFdNODM1MF9TWVNfQ0xLRElWCQkJNQorI2RlZmluZSBXTTgzNTBfREFDTFJfQ0xLRElWCQkJNgorI2RlZmluZSBXTTgzNTBfQURDTFJfQ0xLRElWCQkJNworCisvKiBBREMgY2xvY2sgZGl2aWRlcnMgKi8KKyNkZWZpbmUgV004MzUwX0FEQ0RJVl8xCQkJCTB4MAorI2RlZmluZSBXTTgzNTBfQURDRElWXzFfNQkJCTB4MQorI2RlZmluZSBXTTgzNTBfQURDRElWXzIJCQkJMHgyCisjZGVmaW5lIFdNODM1MF9BRENESVZfMwkJCQkweDMKKyNkZWZpbmUgV004MzUwX0FEQ0RJVl80CQkJCTB4NAorI2RlZmluZSBXTTgzNTBfQURDRElWXzVfNQkJCTB4NQorI2RlZmluZSBXTTgzNTBfQURDRElWXzYJCQkJMHg2CisKKy8qIEFEQyBjbG9jayBkaXZpZGVycyAqLworI2RlZmluZSBXTTgzNTBfREFDRElWXzEJCQkJMHgwCisjZGVmaW5lIFdNODM1MF9EQUNESVZfMV81CQkJMHgxCisjZGVmaW5lIFdNODM1MF9EQUNESVZfMgkJCQkweDIKKyNkZWZpbmUgV004MzUwX0RBQ0RJVl8zCQkJCTB4MworI2RlZmluZSBXTTgzNTBfREFDRElWXzQJCQkJMHg0CisjZGVmaW5lIFdNODM1MF9EQUNESVZfNV81CQkJMHg1CisjZGVmaW5lIFdNODM1MF9EQUNESVZfNgkJCQkweDYKKworLyogQkNMSyBjbG9jayBkaXZpZGVycyAqLworI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMQkJCSgweDAgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzFfNQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzIJCQkoMHgyIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8zCQkJKDB4MyA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfNAkJCSgweDQgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzVfNQkJCSgweDUgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzYJCQkoMHg2IDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl84CQkJKDB4NyA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMTEJCQkoMHg4IDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8xMgkJCSgweDkgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzE2CQkJKDB4YSA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfMjIJCQkoMHhiIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl8yNAkJCSgweGMgPDwgNCkKKyNkZWZpbmUgV004MzUwX0JDTEtfRElWXzMyCQkJKDB4ZCA8PCA0KQorI2RlZmluZSBXTTgzNTBfQkNMS19ESVZfNDQJCQkoMHhlIDw8IDQpCisjZGVmaW5lIFdNODM1MF9CQ0xLX0RJVl80OAkJCSgweGYgPDwgNCkKKworLyogU3lzIChNQ0xLKSBjbG9jayBkaXZpZGVycyAqLworI2RlZmluZSBXTTgzNTBfTUNMS19ESVZfMQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgV004MzUwX01DTEtfRElWXzIJCQkoMHgxIDw8IDgpCisKKy8qIE9QIGNsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfMQkJCTB4MAorI2RlZmluZSBXTTgzNTBfT1BDTEtfRElWXzIJCQkweDEKKyNkZWZpbmUgV004MzUwX09QQ0xLX0RJVl8zCQkJMHgyCisjZGVmaW5lIFdNODM1MF9PUENMS19ESVZfNAkJCTB4MworI2RlZmluZSBXTTgzNTBfT1BDTEtfRElWXzVfNQkJCTB4NAorI2RlZmluZSBXTTgzNTBfT1BDTEtfRElWXzYJCQkweDUKKworLyogREFJIElEICovCisjZGVmaW5lIFdNODM1MF9ISUZJX0RBSQkJCQkwCisKKy8qCisgKiBBdWRpbyBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MCQkzOQorI2RlZmluZSBXTTgzNTBfSVJRX0NPREVDX0pDS19ERVRfUgkJNDAKKyNkZWZpbmUgV004MzUwX0lSUV9DT0RFQ19NSUNTQ0QJCQk0MQorI2RlZmluZSBXTTgzNTBfSVJRX0NPREVDX01JQ0QJCQk0MgorCitzdHJ1Y3Qgd204MzUwX2NvZGVjIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvbXBhcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTM3ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvbXBhcmF0b3IuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGNvbXBhcmF0b3IuaCAgLS0gIENvbXBhcmF0b3IgQXV4IEFEQyBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9DT01QQVJBVE9SX0hfCisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9DT01QQVJBVE9SX0hfCisKKy8qCisgKiBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIFdNODM1MF9ESUdJVElTRVJfQ09OVFJPTF8xICAgICAgICAgICAgICAweDkwCisjZGVmaW5lIFdNODM1MF9ESUdJVElTRVJfQ09OVFJPTF8yICAgICAgICAgICAgICAweDkxCisjZGVmaW5lIFdNODM1MF9BVVgxX1JFQURCQUNLICAgICAgICAgICAgICAgICAgICAweDk4CisjZGVmaW5lIFdNODM1MF9BVVgyX1JFQURCQUNLICAgICAgICAgICAgICAgICAgICAweDk5CisjZGVmaW5lIFdNODM1MF9BVVgzX1JFQURCQUNLICAgICAgICAgICAgICAgICAgICAweDlBCisjZGVmaW5lIFdNODM1MF9BVVg0X1JFQURCQUNLICAgICAgICAgICAgICAgICAgICAweDlCCisjZGVmaW5lIFdNODM1MF9DSElQX1RFTVBfUkVBREJBQ0sgICAgICAgICAgICAgICAweDlGCisjZGVmaW5lIFdNODM1MF9HRU5FUklDX0NPTVBBUkFUT1JfQ09OVFJPTCAgICAgICAweEEzCisjZGVmaW5lIFdNODM1MF9HRU5FUklDX0NPTVBBUkFUT1JfMSAgICAgICAgICAgICAweEE0CisjZGVmaW5lIFdNODM1MF9HRU5FUklDX0NPTVBBUkFUT1JfMiAgICAgICAgICAgICAweEE1CisjZGVmaW5lIFdNODM1MF9HRU5FUklDX0NPTVBBUkFUT1JfMyAgICAgICAgICAgICAweEE2CisjZGVmaW5lIFdNODM1MF9HRU5FUklDX0NPTVBBUkFUT1JfNCAgICAgICAgICAgICAweEE3CisKKy8qCisgKiBSMTQ0ICgweDkwKSAtIERpZ2l0aXNlciBDb250cm9sICgxKQorICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfQ1RDICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19QT0xMICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0VMOCAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUw3ICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1NFTDYgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0VMNSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUw0ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1NFTDMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0VMMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TRUwxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE0NSAoMHg5MSkgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX01BU0tNT0RFX01BU0sgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfQ1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDA3MDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19DQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfQVVYX1JCTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9BVVhBRENfV0FJVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNTIgKDB4OTgpIC0gQVVYMSBSZWFkYmFjaworICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0NBTEUxX01BU0sgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19SRUYxICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEExX01BU0sgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTUzICgweDk5KSAtIEFVWDIgUmVhZGJhY2sKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX1NDQUxFMl9NQVNLICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfUkVGMiAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBMl9NQVNLICAgICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE1NCAoMHg5QSkgLSBBVVgzIFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19TQ0FMRTNfTUFTSyAgICAgICAgICAgICAgIDB4NjAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX1JFRjMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQTNfTUFTSyAgICAgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNTUgKDB4OUIpIC0gQVVYNCBSZWFkYmFjaworICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfU0NBTEU0X01BU0sgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19SRUY0ICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEE0X01BU0sgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTU2ICgweDlDKSAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBX1VTQl9NQVNLICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE1NyAoMHg5RCkgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYQURDX0RBVEFfTElORV9NQVNLICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTU4ICgweDlFKSAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjaworICovCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQV9CQVRUX01BU0sgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNTkgKDB4OUYpIC0gQ2hpcCBUZW1wIFJlYWRiYWNrCisgKi8KKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQVRBX0NISVBURU1QX01BU0sgICAgICAgIDB4MEZGRgorCisvKgorICogUjE2MyAoMHhBMykgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQ01QNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDTVAzX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfRENNUDJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9EQ01QMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNjQgKDB4QTQpIC0gR2VuZXJpYyBjb21wYXJhdG9yIDEKKyAqLworI2RlZmluZSBXTTgzNTBfRENNUDFfU1JDU0VMX01BU0sgICAgICAgICAgICAgICAgMHhFMDAwCisjZGVmaW5lIFdNODM1MF9EQ01QMV9HVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RDTVAxX1RIUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogUjE2NSAoMHhBNSkgLSBHZW5lcmljIGNvbXBhcmF0b3IgMgorICovCisjZGVmaW5lIFdNODM1MF9EQ01QMl9TUkNTRUxfTUFTSyAgICAgICAgICAgICAgICAweEUwMDAKKyNkZWZpbmUgV004MzUwX0RDTVAyX0dUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfRENNUDJfVEhSX01BU0sgICAgICAgICAgICAgICAgICAgMHgwRkZGCisKKy8qCisgKiBSMTY2ICgweEE2KSAtIEdlbmVyaWMgY29tcGFyYXRvciAzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDTVAzX1NSQ1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4RTAwMAorI2RlZmluZSBXTTgzNTBfRENNUDNfR1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9EQ01QM19USFJfTUFTSyAgICAgICAgICAgICAgICAgICAweDBGRkYKKworLyoKKyAqIFIxNjcgKDB4QTcpIC0gR2VuZXJpYyBjb21wYXJhdG9yIDQKKyAqLworI2RlZmluZSBXTTgzNTBfRENNUDRfU1JDU0VMX01BU0sgICAgICAgICAgICAgICAgMHhFMDAwCisjZGVmaW5lIFdNODM1MF9EQ01QNF9HVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RDTVA0X1RIUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MEZGRgorCisvKgorICogSW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBXTTgzNTBfSVJRX0FVWEFEQ19EQVRBUkRZCQkxNgorI2RlZmluZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDQJCTE3CisjZGVmaW5lIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMwkJMTgKKyNkZWZpbmUgV004MzUwX0lSUV9BVVhBRENfRENPTVAyCQkxOQorI2RlZmluZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDEJCTIwCisjZGVmaW5lIFdNODM1MF9JUlFfU1lTX0hZU1RfQ09NUF9GQUlMCQkyMQorI2RlZmluZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTE1CQkyMgorI2RlZmluZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTQwCQkyMworCisvKgorICogVVNCLzIsIExJTkUgJiBCQVRUID0gKChWUlRDICogMikgLyA0MDk1KSkgKiAxMGU2IHVWCisgKiBXaGVyZSBWUlRDID0gMi43IFYKKyAqLworI2RlZmluZSBXTTgzNTBfQVVYX0NPRUZGCQkJMTMxOQorCisjZGVmaW5lIFdNODM1MF9BVVhBRENfQVVYMQkJCTAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19BVVgyCQkJMQorI2RlZmluZSBXTTgzNTBfQVVYQURDX0FVWDMJCQkyCisjZGVmaW5lIFdNODM1MF9BVVhBRENfQVVYNAkJCTMKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19VU0IJCQk0CisjZGVmaW5lIFdNODM1MF9BVVhBRENfTElORQkJCTUKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19CQVRUCQkJNgorI2RlZmluZSBXTTgzNTBfQVVYQURDX1RFTVAJCQk3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViZjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb3JlLmgKQEAgLTAsMCArMSw2MzEgQEAKKy8qCisgKiBjb3JlLmggIC0tICBDb3JlIERyaXZlciBmb3IgV29sZnNvbiBXTTgzNTAgUE1JQworICoKKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfQ09SRV9IXworI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfQ09SRV9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3BtaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC93ZHQuaD4KKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTgzNTBfUkVTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTgzNTBfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTgzNTBfU1lTVEVNX0hJQkVSTkFURSAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTgzNTBfSU5URVJGQUNFX0NPTlRST0wgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF8xICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF8yICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF8zICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF80ICAgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF81ICAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF82ICAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBXTTgzNTBfUE9XRVJfTUdNVF83ICAgICAgICAgICAgICAgICAgICAgMHgwRQorCisjZGVmaW5lIFdNODM1MF9TWVNURU1fSU5URVJSVVBUUyAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIFdNODM1MF9JTlRfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIFdNODM1MF9JTlRfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAgICAweDFBCisjZGVmaW5lIFdNODM1MF9QT1dFUl9VUF9JTlRfU1RBVFVTICAgICAgICAgICAgICAweDFCCisjZGVmaW5lIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVMgICAgICAgICAweDFDCisjZGVmaW5lIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVUyAgICAgICAgICAweDFECisjZGVmaW5lIFdNODM1MF9HUElPX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAweDFFCisjZGVmaW5lIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVMgICAgICAgICAgICAweDFGCisjZGVmaW5lIFdNODM1MF9TWVNURU1fSU5URVJSVVBUU19NQVNLICAgICAgICAgICAweDIwCisjZGVmaW5lIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSyAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSyAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIFdNODM1MF9QT1dFUl9VUF9JTlRfU1RBVFVTX01BU0sgICAgICAgICAweDIzCisjZGVmaW5lIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSyAgICAweDI0CisjZGVmaW5lIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVU19NQVNLICAgICAweDI1CisjZGVmaW5lIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSyAgICAgICAgICAgICAweDI2CisjZGVmaW5lIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSyAgICAgICAweDI3CisKKyNkZWZpbmUgV004MzUwX01BWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDB4RkYKKworLyoKKyAqIEZpZWxkIERlZmluaXRpb25zLgorICovCisKKy8qCisgKiBSMCAoMHgwMCkgLSBSZXNldC9JRAorICovCisjZGVmaW5lIFdNODM1MF9TV19SRVNFVF9DSElQX0lEX01BU0sgICAgICAgICAgICAweEZGRkYKKworLyoKKyAqIFIxICgweDAxKSAtIElECisgKi8KKyNkZWZpbmUgV004MzUwX0NISVBfUkVWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBXTTgzNTBfQ09ORl9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwQzAwCisjZGVmaW5lIFdNODM1MF9DVVNUX0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwRkYKKworLyoKKyAqIFIzICgweDAzKSAtIFN5c3RlbSBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hJUF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9QT1dFUkNZQ0xFICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX1ZDQ19GQVVMVF9PViAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfUkVHX1JTVEJfVElNRV9NQVNLICAgICAgICAgICAgICAgMHgwQzAwCisjZGVmaW5lIFdNODM1MF9CR19TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX01FTV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQ0hJUF9TRVRfVVAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9PTl9ERUJfVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX09OX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSVJRX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSNCAoMHgwNCkgLSBTeXN0ZW0gQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004MzUwX1VTQl9TVVNQRU5EXzhNQSAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfVVNCX1NVU1BFTkQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9VU0JfTVNUUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX1VTQl9NU1RSX1NSQyAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfVVNCXzUwME1BICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9VU0JfTk9MSU0gICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKworLyoKKyAqIFI1ICgweDA1KSAtIFN5c3RlbSBIaWJlcm5hdGUKKyAqLworI2RlZmluZSBXTTgzNTBfSElCRVJOQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9XRE9HX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX1JFR19ISUJfU1RBUlRVUF9TRVEgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfUkVHX1JFU0VUX0hJQl9NT0RFICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9SU1RfSElCX01PREUgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lSUV9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfTUVNUlNUX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9QQ0NPTVBfSElCX01PREUgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX1RFTVBNT05fSElCX01PREUgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjYgKDB4MDYpIC0gSW50ZXJmYWNlIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfVVNFX0RFVl9QSU5TICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9VU0VfREVWX1BJTlNfTUFTSyAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX1VTRV9ERVZfUElOU19TSElGVCAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBXTTgzNTBfREVWX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIFdNODM1MF9ERVZfQUREUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV004MzUwX0NPTkZJR19ET05FICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQ09ORklHX0RPTkVfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DT05GSUdfRE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX1JFQ09ORklHX0FUX09OICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfUkVDT05GSUdfQVRfT05fTUFTSyAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9SRUNPTkZJR19BVF9PTl9TSElGVCAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV004MzUwX0FVVE9JTkMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfQVVUT0lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9BVVRPSU5DX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX0FSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQVJBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9BUkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1NQSV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfU1BJX0NGR19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9TUElfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1NQSV80V0lSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfU1BJXzRXSVJFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9TUElfNFdJUkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1NQSV8zV0lSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfU1BJXzNXSVJFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9TUElfM1dJUkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogQml0IHZhbHVlcyBmb3IgUjA2ICgweDA2KSAqLworI2RlZmluZSBXTTgzNTBfVVNFX0RFVl9QSU5TX1BSSU1BUlkgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9VU0VfREVWX1BJTlNfREVWICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfREVWX0FERFJfMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9ERVZfQUREUl8zNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RFVl9BRERSXzNDICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfREVWX0FERFJfM0UgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgV004MzUwX0NPTkZJR19ET05FX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfQ09ORklHX0RPTkVfRE9ORSAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX1JFQ09ORklHX0FUX09OX09GRiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfUkVDT05GSUdfQVRfT05fT04gICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX0FVVE9JTkNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfQVVUT0lOQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX0FSQV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfQVJBX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX1NQSV9DRkdfQ01PUyAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfU1BJX0NGR19PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX1NQSV80V0lSRV8zV0lSRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfU1BJXzRXSVJFXzRXSVJFICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX1NQSV8zV0lSRV9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfU1BJXzNXSVJFX1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qCisgKiBSOCAoMHgwOCkgLSBQb3dlciBtZ210ICgxKQorICovCisjZGVmaW5lIFdNODM1MF9DT0RFQ19JU0VMX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX1ZCVUZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfT1VUUFVUX0RSQUlOX0VOICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9NSUNfREVUX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0JJQVNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfTUlDQkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9WTUlERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1ZNSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBXTTgzNTBfVk1JRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSOSAoMHgwOSkgLSBQb3dlciBtZ210ICgyKQorICovCisjZGVmaW5lIFdNODM1MF9JTjNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lOM0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfSU5SX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9JTkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX01JWElOUl9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfTUlYSU5MX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9PVVQ0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX09VVDNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfTUlYT1VUUl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9NSVhPVVRMX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMCAoMHgwQSkgLSBQb3dlciBtZ210ICgzKQorICovCisjZGVmaW5lIFdNODM1MF9JTjNSX1RPX09VVDJSICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX09VVDJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfT1VUMkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9PVVQxUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX09VVDFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjExICgweDBCKSAtIFBvd2VyIG1nbXQgKDQpCisgKi8KKyNkZWZpbmUgV004MzUwX1NZU0NMS19FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfQURDX0hQRl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9GTExfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0ZMTF9PU0NfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfVE9DTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQUNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RBQ0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfQURDUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9BRENMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKworLyoKKyAqIFIxMiAoMHgwQykgLSBQb3dlciBtZ210ICg1KQorICovCisjZGVmaW5lIFdNODM1MF9DT0RFQ19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX1JUQ19USUNLX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfT1NDMzJLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9DSEdfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0FDQ19ERVRfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9EQ01QNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDTVAzX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfRENNUDJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9EQ01QMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMyAoMHgwRCkgLSBQb3dlciBtZ210ICg2KQorICovCisjZGVmaW5lIFdNODM1MF9MU19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0xETzRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfTERPM19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0xETzFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfREM2X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9EQzVfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0RDNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfREMzX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9EQzJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0RDMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE0ICgweDBFKSAtIFBvd2VyIG1nbXQgKDcpCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfQ1MxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjQgKDB4MTgpIC0gU3lzdGVtIEludGVycnVwdHMKKyAqLworI2RlZmluZSBXTTgzNTBfT0NfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9VVl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX1BVVE9fSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfQ1NfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9FWFRfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0NPREVDX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfR1BfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1JUQ19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfU1lTX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9DSEdfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1VTQl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfV0tVUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjUgKDB4MTkpIC0gSW50ZXJydXB0IFN0YXR1cyAxCisgKi8KKyNkZWZpbmUgV004MzUwX0NIR19CQVRfSE9UX0VJTlQgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX0JBVF9DT0xEX0VJTlQgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9DSEdfQkFUX0ZBSUxfRUlOVCAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NIR19UT19FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX0VORF9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9DSEdfU1RBUlRfRUlOVCAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0NIR19GQVNUX1JEWV9FSU5UICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfUlRDX1BFUl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9SVENfU0VDX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1fRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzNQOV9FSU5UICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9DSEdfVkJBVFRfTFRfM1AxX0VJTlQgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0NIR19WQkFUVF9MVF8yUDg1X0VJTlQgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjI2ICgweDFBKSAtIEludGVycnVwdCBTdGF0dXMgMgorICovCisjZGVmaW5lIFdNODM1MF9DUzFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NTMl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfVVNCX0xJTUlUX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfREFUQVJEWV9FSU5UICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQ09NUDRfRUlOVCAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfQVVYQURDX0RDT01QM19FSU5UICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9BVVhBRENfRENPTVAyX0VJTlQgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0FVWEFEQ19EQ09NUDFfRUlOVCAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfU1lTX0hZU1RfQ09NUF9GQUlMX0VJTlQgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9TWVNfQ0hJUF9HVDExNV9FSU5UICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1NZU19DSElQX0dUMTQwX0VJTlQgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfU1lTX1dET0dfVE9fRUlOVCAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjcgKDB4MUIpIC0gUG93ZXIgVXAgSW50ZXJydXB0IFN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9QVVRPX0xETzRfRUlOVCAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX1BVVE9fTERPM19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfUFVUT19MRE8yX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9QVVRPX0xETzFfRUlOVCAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1BVVE9fREM2X0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfUFVUT19EQzVfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9QVVRPX0RDNF9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX1BVVE9fREMzX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfUFVUT19EQzJfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9QVVRPX0RDMV9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyOCAoMHgxQykgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfVVZfTERPNF9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9VVl9MRE8zX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX1VWX0xETzJfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfVVZfTERPMV9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9VVl9EQzZfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX1VWX0RDNV9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfVVZfREM0X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9VVl9EQzNfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX1VWX0RDMl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfVVZfREMxX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjkgKDB4MUQpIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfT0NfTFNfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKy8qCisgKiBSMzAgKDB4MUUpIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjMxICgweDFGKSAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9FWFRfVVNCX0ZCX0VJTlQgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0VYVF9XQUxMX0ZCX0VJTlQgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfRVhUX0JBVF9GQl9FSU5UICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9DT0RFQ19KQ0tfREVUX0xfRUlOVCAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0NPREVDX0pDS19ERVRfUl9FSU5UICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfQ09ERUNfTUlDU0NEX0VJTlQgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9DT0RFQ19NSUNEX0VJTlQgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1dLVVBfT0ZGX1NUQVRFX0VJTlQgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfV0tVUF9ISUJfU1RBVEVfRUlOVCAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9XS1VQX0NPTlZfRkFVTFRfRUlOVCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX1dLVVBfV0RPR19SU1RfRUlOVCAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfV0tVUF9HUF9QV1JfT05fRUlOVCAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9XS1VQX09OS0VZX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX1dLVVBfR1BfV0FLRVVQX0VJTlQgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjMyICgweDIwKSAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sKKyAqLworI2RlZmluZSBXTTgzNTBfSU1fT0NfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9JTV9VVl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU1fU1BBUkVfSU5UICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9DU19JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lNX0VYVF9JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU1fQ09ERUNfSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9JTV9HUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0lNX0FVWEFEQ19JTlQgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfSU1fUlRDX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9JTV9TWVNfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0lNX0NIR19JTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU1fVVNCX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX0lOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIzMyAoMHgyMSkgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzaworICovCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfQkFUX0hPVF9FSU5UICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0lNX0NIR19CQVRfQ09MRF9FSU5UICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX0JBVF9GQUlMX0VJTlQgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfVE9fRUlOVCAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0lNX0NIR19FTkRfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX1NUQVJUX0VJTlQgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfRkFTVF9SRFlfRUlOVCAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lNX1JUQ19QRVJfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfSU1fUlRDX1NFQ19FSU5UICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9JTV9SVENfQUxNX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0lNX0NIR19WQkFUVF9MVF8zUDlfRUlOVCAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzNQMV9FSU5UICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTV9DSEdfVkJBVFRfTFRfMlA4NV9FSU5UICAgICAgICAweDAwMDEKKworLyoKKyAqIFIzNCAoMHgyMikgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzaworICovCisjZGVmaW5lIFdNODM1MF9JTV9TUEFSRTJfRUlOVCAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0lNX1NQQVJFMV9FSU5UICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfSU1fQ1MxX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9JTV9DUzJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0lNX1VTQl9MSU1JVF9FSU5UICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfSU1fQVVYQURDX0RBVEFSRFlfRUlOVCAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTV9BVVhBRENfRENPTVA0X0VJTlQgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0lNX0FVWEFEQ19EQ09NUDNfRUlOVCAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfSU1fQVVYQURDX0RDT01QMl9FSU5UICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9JTV9BVVhBRENfRENPTVAxX0VJTlQgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lNX1NZU19IWVNUX0NPTVBfRkFJTF9FSU5UICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU1fU1lTX0NISVBfR1QxMTVfRUlOVCAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9TWVNfQ0hJUF9HVDE0MF9FSU5UICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX1NZU19XRE9HX1RPX0VJTlQgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjM1ICgweDIzKSAtIFBvd2VyIFVwIEludGVycnVwdCBTdGF0dXMgTWFzaworICovCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0xETzRfRUlOVCAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fTERPM19FSU5UICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19MRE8yX0VJTlQgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0xETzFfRUlOVCAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fREM2X0VJTlQgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19EQzVfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0RDNF9FSU5UICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0lNX1BVVE9fREMzX0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU1fUFVUT19EQzJfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTV9QVVRPX0RDMV9FSU5UICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIzNiAoMHgyNCkgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgTWFzaworICovCisjZGVmaW5lIFdNODM1MF9JTV9VVl9MRE80X0VJTlQgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0lNX1VWX0xETzNfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfSU1fVVZfTERPMl9FSU5UICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9JTV9VVl9MRE8xX0VJTlQgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0lNX1VWX0RDNl9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfSU1fVVZfREM1X0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9JTV9VVl9EQzRfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0lNX1VWX0RDM19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfSU1fVVZfREMyX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9JTV9VVl9EQzFfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIzNyAoMHgyNSkgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX09DX0xTX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorCisvKgorICogUjM4ICgweDI2KSAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX0dQMTJfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfSU1fR1AxMV9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9JTV9HUDEwX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0lNX0dQOV9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfSU1fR1A4X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9JTV9HUDdfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0lNX0dQNl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfSU1fR1A1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9JTV9HUDRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0lNX0dQM19FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfSU1fR1AyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9JTV9HUDFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0lNX0dQMF9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjM5ICgweDI3KSAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyBNYXNrCisgKi8KKyNkZWZpbmUgV004MzUwX0lNX0VYVF9VU0JfRkJfRUlOVCAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfSU1fRVhUX1dBTExfRkJfRUlOVCAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9JTV9FWFRfQkFUX0ZCX0VJTlQgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0lNX0NPREVDX0pDS19ERVRfTF9FSU5UICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfSU1fQ09ERUNfSkNLX0RFVF9SX0VJTlQgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9JTV9DT0RFQ19NSUNTQ0RfRUlOVCAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0lNX0NPREVDX01JQ0RfRUlOVCAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfSU1fV0tVUF9PRkZfU1RBVEVfRUlOVCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX0hJQl9TVEFURV9FSU5UICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0lNX1dLVVBfQ09OVl9GQVVMVF9FSU5UICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfSU1fV0tVUF9XRE9HX1JTVF9FSU5UICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9JTV9XS1VQX0dQX1BXUl9PTl9FSU5UICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0lNX1dLVVBfT05LRVlfRUlOVCAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfSU1fV0tVUF9HUF9XQUtFVVBfRUlOVCAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMjIwICgweERDKSAtIFJBTSBCSVNUIDEKKyAqLworI2RlZmluZSBXTTgzNTBfUkVBRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9UU1RSQU1fQ0xLICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1RTVFJBTV9DTEtfRU5BICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfU1RBUlRTRVEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9SRUFEX1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0NPVU5UX0RJUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfVFNUUkFNX01PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lIFdNODM1MF9UU1RSQU1fRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIyMjUgKDB4RTEpIC0gRENEQy9MRE8gc3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0xTX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9MRE8zX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzJfU1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfTERPMV9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQzZfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RDNV9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfREM0X1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQzNfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0RDMl9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfREMxX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qIFdNODM1MCB3YWtlIHVwIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX09GRl9TVEFURQkJNDMKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX0hJQl9TVEFURQkJNDQKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX0NPTlZfRkFVTFQJCTQ1CisjZGVmaW5lIFdNODM1MF9JUlFfV0tVUF9XRE9HX1JTVAkJNDYKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX0dQX1BXUl9PTgkJNDcKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX09OS0VZCQkJNDgKKyNkZWZpbmUgV004MzUwX0lSUV9XS1VQX0dQX1dBS0VVUAkJNDkKKworLyogd204MzUwIGNoaXAgcmV2aXNpb25zICovCisjZGVmaW5lIFdNODM1MF9SRVZfRQkJCQkweDQKKyNkZWZpbmUgV004MzUwX1JFVl9GCQkJCTB4NQorI2RlZmluZSBXTTgzNTBfUkVWX0cJCQkJMHg2CisKKyNkZWZpbmUgV004MzUwX05VTV9JUlEJCQkJNjMKKworc3RydWN0IHdtODM1MF9yZWdfYWNjZXNzIHsKKwl1MTYgcmVhZGFibGU7CQkvKiBNYXNrIG9mIHJlYWRhYmxlIGJpdHMgKi8KKwl1MTYgd3JpdGFibGU7CQkvKiBNYXNrIG9mIHdyaXRhYmxlIGJpdHMgKi8KKwl1MTYgdm9sOwkJLyogTWFzayBvZiB2b2xhdGlsZSBiaXRzICovCit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCB3bTgzNTBfcmVnX2FjY2VzcyB3bTgzNTBfcmVnX2lvX21hcFtdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTBfbW9kZTBfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUwX21vZGUxX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MF9tb2RlMl9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTBfbW9kZTNfZGVmYXVsdHNbXTsKKworc3RydWN0IHdtODM1MDsKKworc3RydWN0IHdtODM1MF9pcnEgeworCXZvaWQgKCpoYW5kbGVyKSAoc3RydWN0IHdtODM1MCAqLCBpbnQsIHZvaWQgKik7CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCB3bTgzNTAgeworCWludCByZXY7CQkvKiBjaGlwIHJldmlzaW9uICovCisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkvKiBkZXZpY2UgSU8gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50OworCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldmljZTsKKwl9OworCWludCAoKnJlYWRfZGV2KShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGNoYXIgcmVnLCBpbnQgc2l6ZSwgdm9pZCAqZGVzdCk7CisJaW50ICgqd3JpdGVfZGV2KShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGNoYXIgcmVnLCBpbnQgc2l6ZSwKKwkJCSB2b2lkICpzcmMpOworCXUxNiAqcmVnX2NhY2hlOworCisJLyogSW50ZXJydXB0IGhhbmRsaW5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IGlycV93b3JrOworCXN0cnVjdCBtdXRleCBpcnFfbXV0ZXg7IC8qIElSUSB0YWJsZSBtdXRleCAqLworCXN0cnVjdCB3bTgzNTBfaXJxIGlycVtXTTgzNTBfTlVNX0lSUV07CisJaW50IGNoaXBfaXJxOworCisJLyogQ2xpZW50IGRldmljZXMgKi8KKwlzdHJ1Y3Qgd204MzUwX2NvZGVjIGNvZGVjOworCXN0cnVjdCB3bTgzNTBfZ3BpbyBncGlvOworCXN0cnVjdCB3bTgzNTBfcG1pYyBwbWljOworCXN0cnVjdCB3bTgzNTBfcG93ZXIgcG93ZXI7CisJc3RydWN0IHdtODM1MF9ydGMgcnRjOworCXN0cnVjdCB3bTgzNTBfd2R0IHdkdDsKK307CisKKy8qKgorICogRGF0YSB0byBiZSBzdXBwbGllZCBieSB0aGUgcGxhdGZvcm0gdG8gaW5pdGlhbGlzZSB0aGUgV004MzUwLgorICoKKyAqIEBpbml0OiBGdW5jdGlvbiBjYWxsZWQgZHVyaW5nIGRyaXZlciBpbml0aWFsaXNhdGlvbi4gIFNob3VsZCBiZQorICogICAgICAgIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHRvIGNvbmZpZ3VyZSBHUElPIGZ1bmN0aW9ucyBhbmQgc2ltaWxhci4KKyAqLworc3RydWN0IHdtODM1MF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCppbml0KShzdHJ1Y3Qgd204MzUwICp3bTgzNTApOworfTsKKworCisvKgorICogV004MzUwIGRldmljZSBpbml0aWFsaXNhdGlvbiBhbmQgZXhpdC4KKyAqLworaW50IHdtODM1MF9kZXZpY2VfaW5pdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCisJCSAgICAgICBzdHJ1Y3Qgd204MzUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKK3ZvaWQgd204MzUwX2RldmljZV9leGl0KHN0cnVjdCB3bTgzNTAgKndtODM1MCk7CisKKy8qCisgKiBXTTgzNTAgZGV2aWNlIElPCisgKi8KK2ludCB3bTgzNTBfY2xlYXJfYml0cyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIHUxNiByZWcsIHUxNiBtYXNrKTsKK2ludCB3bTgzNTBfc2V0X2JpdHMoc3RydWN0IHdtODM1MCAqd204MzUwLCB1MTYgcmVnLCB1MTYgbWFzayk7Cit1MTYgd204MzUwX3JlZ19yZWFkKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHJlZyk7CitpbnQgd204MzUwX3JlZ193cml0ZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCByZWcsIHUxNiB2YWwpOworaW50IHdtODM1MF9yZWdfbG9jayhzdHJ1Y3Qgd204MzUwICp3bTgzNTApOworaW50IHdtODM1MF9yZWdfdW5sb2NrKHN0cnVjdCB3bTgzNTAgKndtODM1MCk7CitpbnQgd204MzUwX2Jsb2NrX3JlYWQoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgcmVnLCBpbnQgc2l6ZSwgdTE2ICpkZXN0KTsKK2ludCB3bTgzNTBfYmxvY2tfd3JpdGUoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgcmVnLCBpbnQgc2l6ZSwgdTE2ICpzcmMpOworCisvKgorICogV004MzUwIGludGVybmFsIGludGVycnVwdHMKKyAqLworaW50IHdtODM1MF9yZWdpc3Rlcl9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxLAorCQkJdm9pZCAoKmhhbmRsZXIpIChzdHJ1Y3Qgd204MzUwICosIGludCwgdm9pZCAqKSwKKwkJCXZvaWQgKmRhdGEpOworaW50IHdtODM1MF9mcmVlX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEpOworaW50IHdtODM1MF9tYXNrX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEpOworaW50IHdtODM1MF91bm1hc2tfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDkxZThmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2dwaW8uaApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIGdwaW8uaCAgLS0gIEdQSU8gRHJpdmVyIGZvciBXb2xmc29uIFdNODM1MCBQTUlDCisgKgorICogQ29weXJpZ2h0IDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9HUElPX0hfCisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9HUElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworLyoKKyAqIEdQSU8gUmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFdNODM1MF9HUElPX0RFQk9VTkNFICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFdNODM1MF9HUElPX1BJTl9QVUxMX1VQX0NPTlRST0wgICAgICAgICAweDgxCisjZGVmaW5lIFdNODM1MF9HUElPX1BVTExfRE9XTl9DT05UUk9MICAgICAgICAgICAweDgyCisjZGVmaW5lIFdNODM1MF9HUElPX0lOVF9NT0RFICAgICAgICAgICAgICAgICAgICAweDgzCisjZGVmaW5lIFdNODM1MF9HUElPX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDg1CisjZGVmaW5lIFdNODM1MF9HUElPX0NPTkZJR1VSQVRJT05fSV9PICAgICAgICAgICAweDg2CisjZGVmaW5lIFdNODM1MF9HUElPX1BJTl9QT0xBUklUWV9UWVBFICAgICAgICAgICAweDg3CisjZGVmaW5lIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8xICAgICAgICAgICAweDhDCisjZGVmaW5lIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8yICAgICAgICAgICAweDhECisjZGVmaW5lIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF8zICAgICAgICAgICAweDhFCisjZGVmaW5lIFdNODM1MF9HUElPX0ZVTkNUSU9OX1NFTEVDVF80ICAgICAgICAgICAweDhGCisKKy8qCisgKiBHUElPIEZ1bmN0aW9ucworICovCisjZGVmaW5lIFdNODM1MF9HUElPMF9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMF9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzBfUFdSX09OX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMF9QV1JfT05fT1VUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMF9MRE9fRU5fSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8wX1ZSVENfT1VUCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMF9MUFdSMV9JTgkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzBfUE9SX0JfT1VUCQkJMHgzCisKKyNkZWZpbmUgV004MzUwX0dQSU8xX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMV9QV1JfT05fSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8xX0RPX0NPTkZfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8xX0xET19FTl9JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzFfUkVTRVRfT1VUCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMV9MUFdSMl9JTgkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzFfTUVNUlNUX09VVAkJCTB4MworCisjZGVmaW5lIFdNODM1MF9HUElPMl9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMl9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzJfUFdSX09OX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMl9QV1JfT05fT1VUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMl9XQUtFX1VQX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMl9WUlRDX09VVAkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzJfMzJLSFpfSU4JCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU8yXzMyS0haX09VVAkJCTB4MworCisjZGVmaW5lIFdNODM1MF9HUElPM19HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPM19HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzNfUFdSX09OX0lOCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPM19QX0NMS19PVVQJCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8zX0xET19FTl9JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzNfVlJUQ19PVVQJCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8zX1BXUl9PRkZfSU4JCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU8zXzMyS0haX09VVAkJCTB4MworCisjZGVmaW5lIFdNODM1MF9HUElPNF9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPNF9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzRfTVJfSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU80X01FTV9SU1RfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU80X0ZMQVNIX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPNF9BREFfT1VUCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPNF9ISUJFUk5BVEVfSU4JCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzRfRkxBU0hfT1VUCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPNF9NSUNERVRfT1VUCQkJMHg0CisjZGVmaW5lIFdNODM1MF9HUElPNF9NSUNTSFRfT1VUCQkJMHg1CisKKyNkZWZpbmUgV004MzUwX0dQSU81X0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU81X0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPNV9MUFdSMV9JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzVfUF9DTEtfT1VUCQkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPNV9BRENMUkNMS19JTgkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPNV9BRENMUkNMS19PVVQJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzVfSElCRVJOQVRFX0lOCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU81XzMyS0haX09VVAkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzVfTUlDREVUX09VVAkJCTB4NAorI2RlZmluZSBXTTgzNTBfR1BJTzVfTUlDU0hUX09VVAkJCTB4NQorI2RlZmluZSBXTTgzNTBfR1BJTzVfQURBX09VVAkJCTB4NgorI2RlZmluZSBXTTgzNTBfR1BJTzVfT1BDTEtfT1VUCQkJMHg3CisKKyNkZWZpbmUgV004MzUwX0dQSU82X0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU82X0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPNl9MUFdSMl9JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzZfTUVNUlNUX09VVAkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzZfRkxBU0hfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU82X0FEQV9PVVQJCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU82X0hJQkVSTkFURV9JTgkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPNl9SVENfT1VUCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPNl9NSUNERVRfT1VUCQkJMHg0CisjZGVmaW5lIFdNODM1MF9HUElPNl9NSUNTSFRfT1VUCQkJMHg1CisjZGVmaW5lIFdNODM1MF9HUElPNl9BRENMUkNMS0JfT1VUCQkweDYKKyNkZWZpbmUgV004MzUwX0dQSU82X1NET1VUX09VVAkJCTB4NworCisjZGVmaW5lIFdNODM1MF9HUElPN19HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPN19HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzdfTFBXUjNfSU4JCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU83X1BfQ0xLX09VVAkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzdfTUFTS19JTgkJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzdfVkNDX0ZBVUxUX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPN19ISUJFUk5BVEVfSU4JCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzdfQkFUVF9GQVVMVF9PVVQJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzdfTUlDREVUX09VVAkJCTB4NAorI2RlZmluZSBXTTgzNTBfR1BJTzdfTUlDU0hUX09VVAkJCTB4NQorI2RlZmluZSBXTTgzNTBfR1BJTzdfQURBX09VVAkJCTB4NgorI2RlZmluZSBXTTgzNTBfR1BJTzdfQ1NCX0lOCQkJMHg3CisKKyNkZWZpbmUgV004MzUwX0dQSU84X0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU84X0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPOF9NUl9JTgkJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzhfVkNDX0ZBVUxUX09VVAkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPOF9BRENCQ0xLX0lOCQkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPOF9BRENCQ0xLX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPOF9QV1JfT0ZGX0lOCQkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPOF9CQVRUX0ZBVUxUX09VVAkJMHgzCisjZGVmaW5lIFdNODM1MF9HUElPOF9BTFRTQ0xfSU4JCQkweGYKKworI2RlZmluZSBXTTgzNTBfR1BJTzlfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzlfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU85X0hFQVJUQkVBVF9JTgkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPOV9WQ0NfRkFVTFRfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU85X01BU0tfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU85X0xJTkVfR1RfQkFUVF9PVVQJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzlfUFdSX09GRl9JTgkJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzlfQkFUVF9GQVVMVF9PVVQJCTB4MworI2RlZmluZSBXTTgzNTBfR1BJTzlfQUxUU0RBX09VVAkJCTB4ZgorCisjZGVmaW5lIFdNODM1MF9HUElPMTBfR1BJT19JTgkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzEwX0dQSU9fT1VUCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMTBfSVNJTktDX09VVAkJMHgxCisjZGVmaW5lIFdNODM1MF9HUElPMTBfUFdSX09GRl9JTgkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMTBfTElORV9HVF9CQVRUX09VVAkJMHgyCisjZGVmaW5lIFdNODM1MF9HUElPMTBfQ0hEX0lORF9JTgkJMHgzCisKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9HUElPX0lOCQkJMHgwCisjZGVmaW5lIFdNODM1MF9HUElPMTFfR1BJT19PVVQJCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9JU0lOS0RfT1VUCQkweDEKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9XQUtFVVBfSU4JCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9MSU5FX0dUX0JBVFRfT1VUCQkweDIKKyNkZWZpbmUgV004MzUwX0dQSU8xMV9DSERfSU5EX0lOCQkweDMKKworI2RlZmluZSBXTTgzNTBfR1BJTzEyX0dQSU9fSU4JCQkweDAKKyNkZWZpbmUgV004MzUwX0dQSU8xMl9HUElPX09VVAkJCTB4MAorI2RlZmluZSBXTTgzNTBfR1BJTzEyX0lTSU5LRV9PVVQJCTB4MQorI2RlZmluZSBXTTgzNTBfR1BJTzEyX0xJTkVfR1RfQkFUVF9PVVQJCTB4MgorI2RlZmluZSBXTTgzNTBfR1BJTzEyX0xJTkVfRU5fT1VUCQkweDMKKyNkZWZpbmUgV004MzUwX0dQSU8xMl8zMktIWl9PVVQJCQkweDQKKworI2RlZmluZSBXTTgzNTBfR1BJT19ESVJfSU4JCQkwCisjZGVmaW5lIFdNODM1MF9HUElPX0RJUl9PVVQJCQkxCisjZGVmaW5lIFdNODM1MF9HUElPX0FDVElWRV9MT1cJCQkwCisjZGVmaW5lIFdNODM1MF9HUElPX0FDVElWRV9ISUdICQkJMQorI2RlZmluZSBXTTgzNTBfR1BJT19QVUxMX05PTkUJCQkwCisjZGVmaW5lIFdNODM1MF9HUElPX1BVTExfVVAJCQkxCisjZGVmaW5lIFdNODM1MF9HUElPX1BVTExfRE9XTgkJCTIKKyNkZWZpbmUgV004MzUwX0dQSU9fSU5WRVJUX09GRgkJCTAKKyNkZWZpbmUgV004MzUwX0dQSU9fSU5WRVJUX09OCQkJMQorI2RlZmluZSBXTTgzNTBfR1BJT19ERUJPVU5DRV9PRkYJCTAKKyNkZWZpbmUgV004MzUwX0dQSU9fREVCT1VOQ0VfT04JCQkxCisKKy8qCisgKiBSMTI4ICgweDgwKSAtIEdQSU8gRGVib3VuY2UKKyAqLworI2RlZmluZSBXTTgzNTBfR1AxMl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9HUDExX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0dQMTBfREIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfR1A5X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9HUDhfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0dQN19EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfR1A2X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9HUDVfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0dQNF9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfR1AzX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9HUDJfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0dQMV9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfR1AwX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTI5ICgweDgxKSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMzAgKDB4ODIpIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfUEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMzEgKDB4ODMpIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZQorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxMzMgKDB4ODUpIC0gR1BJTyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0dQX0RCVElNRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBDMAorCisvKgorICogUjEzNCAoMHg4NikgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykKKyAqLworI2RlZmluZSBXTTgzNTBfR1AxMl9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9HUDExX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgV004MzUwX0dQMTBfRElSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfR1A5X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9HUDhfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0dQN19ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfR1A2X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9HUDVfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0dQNF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfR1AzX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9HUDJfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0dQMV9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfR1AwX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTM1ICgweDg3KSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZQorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0dQMTFfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfR1AxMF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9HUDlfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0dQOF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfR1A3X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFdNODM1MF9HUDZfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0dQNV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfR1A0X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFdNODM1MF9HUDNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0dQMl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfR1AxX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdNODM1MF9HUDBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFIxNDAgKDB4OEMpIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMQorICovCisjZGVmaW5lIFdNODM1MF9HUDNfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEYwMDAKKyNkZWZpbmUgV004MzUwX0dQMl9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfR1AxX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lIFdNODM1MF9HUDBfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIFIxNDEgKDB4OEQpIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMgorICovCisjZGVmaW5lIFdNODM1MF9HUDdfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEYwMDAKKyNkZWZpbmUgV004MzUwX0dQNl9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfR1A1X0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lIFdNODM1MF9HUDRfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIFIxNDIgKDB4OEUpIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMworICovCisjZGVmaW5lIFdNODM1MF9HUDExX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAweEYwMDAKKyNkZWZpbmUgV004MzUwX0dQMTBfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfR1A5X0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lIFdNODM1MF9HUDhfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIFIxNDMgKDB4OEYpIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNAorICovCisjZGVmaW5lIFdNODM1MF9HUDEyX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIFIyMzAgKDB4RTYpIC0gR1BJTyBQaW4gU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfTFZMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCitzdHJ1Y3Qgd204MzUwOworCitpbnQgd204MzUwX2dwaW9fY29uZmlnKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGdwaW8sIGludCBkaXIsIGludCBmdW5jLAorCQkgICAgICAgaW50IHBvbCwgaW50IHB1bGwsIGludCBpbnZlcnQsIGludCBkZWJvdW5jZSk7CisKK3N0cnVjdCB3bTgzNTBfZ3BpbyB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKK307CisKKy8qCisgKiBHUElPIEludGVycnVwdHMKKyAqLworI2RlZmluZSBXTTgzNTBfSVJRX0dQSU8oeCkgICAgICAgICAgICAgICAgICAgICAgKDUwICsgeCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3BtaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI2OWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3BtaWMuaApAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIHBtaWMuaCAgLS0gIFBvd2VyIE1hbmFnbWVudCBEcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX1BNSUNfSAorI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfUE1JQ19ICisKKy8qCisgKiBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKworI2RlZmluZSBXTTgzNTBfQ1VSUkVOVF9TSU5LX0RSSVZFUl9BICAgICAgICAgICAgMHhBQworI2RlZmluZSBXTTgzNTBfQ1NBX0ZMQVNIX0NPTlRST0wgICAgICAgICAgICAgICAgMHhBRAorI2RlZmluZSBXTTgzNTBfQ1VSUkVOVF9TSU5LX0RSSVZFUl9CICAgICAgICAgICAgMHhBRQorI2RlZmluZSBXTTgzNTBfQ1NCX0ZMQVNIX0NPTlRST0wgICAgICAgICAgICAgICAgMHhBRgorI2RlZmluZSBXTTgzNTBfRENEQ19MRE9fUkVRVUVTVEVEICAgICAgICAgICAgICAgMHhCMAorI2RlZmluZSBXTTgzNTBfRENEQ19BQ1RJVkVfT1BUSU9OUyAgICAgICAgICAgICAgMHhCMQorI2RlZmluZSBXTTgzNTBfRENEQ19TTEVFUF9PUFRJT05TICAgICAgICAgICAgICAgMHhCMgorI2RlZmluZSBXTTgzNTBfUE9XRVJfQ0hFQ0tfQ09NUEFSQVRPUiAgICAgICAgICAgMHhCMworI2RlZmluZSBXTTgzNTBfRENEQzFfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhCNAorI2RlZmluZSBXTTgzNTBfRENEQzFfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhCNQorI2RlZmluZSBXTTgzNTBfRENEQzFfTE9XX1BPV0VSICAgICAgICAgICAgICAgICAgMHhCNgorI2RlZmluZSBXTTgzNTBfRENEQzJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhCNworI2RlZmluZSBXTTgzNTBfRENEQzJfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhCOAorI2RlZmluZSBXTTgzNTBfRENEQzNfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhCQQorI2RlZmluZSBXTTgzNTBfRENEQzNfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhCQgorI2RlZmluZSBXTTgzNTBfRENEQzNfTE9XX1BPV0VSICAgICAgICAgICAgICAgICAgMHhCQworI2RlZmluZSBXTTgzNTBfRENEQzRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhCRAorI2RlZmluZSBXTTgzNTBfRENEQzRfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhCRQorI2RlZmluZSBXTTgzNTBfRENEQzRfTE9XX1BPV0VSICAgICAgICAgICAgICAgICAgMHhCRgorI2RlZmluZSBXTTgzNTBfRENEQzVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSBXTTgzNTBfRENEQzVfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhDMQorI2RlZmluZSBXTTgzNTBfRENEQzZfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHhDMworI2RlZmluZSBXTTgzNTBfRENEQzZfVElNRU9VVFMgICAgICAgICAgICAgICAgICAgMHhDNAorI2RlZmluZSBXTTgzNTBfRENEQzZfTE9XX1BPV0VSICAgICAgICAgICAgICAgICAgMHhDNQorI2RlZmluZSBXTTgzNTBfTElNSVRfU1dJVENIX0NPTlRST0wgICAgICAgICAgICAgMHhDNworI2RlZmluZSBXTTgzNTBfTERPMV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHhDOAorI2RlZmluZSBXTTgzNTBfTERPMV9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAgMHhDOQorI2RlZmluZSBXTTgzNTBfTERPMV9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAgMHhDQQorI2RlZmluZSBXTTgzNTBfTERPMl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHhDQgorI2RlZmluZSBXTTgzNTBfTERPMl9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAgMHhDQworI2RlZmluZSBXTTgzNTBfTERPMl9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAgMHhDRAorI2RlZmluZSBXTTgzNTBfTERPM19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHhDRQorI2RlZmluZSBXTTgzNTBfTERPM19USU1FT1VUUyAgICAgICAgICAgICAgICAgICAgMHhDRgorI2RlZmluZSBXTTgzNTBfTERPM19MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAgMHhEMAorI2RlZmluZSBXTTgzNTBfTERPNF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHhEMQorI2RlZmluZSBXTTgzNTBfTERPNF9USU1FT1VUUyAgICAgICAgICAgICAgICAgICAgMHhEMgorI2RlZmluZSBXTTgzNTBfTERPNF9MT1dfUE9XRVIgICAgICAgICAgICAgICAgICAgMHhEMworI2RlZmluZSBXTTgzNTBfVkNDX0ZBVUxUX01BU0tTICAgICAgICAgICAgICAgICAgMHhENworI2RlZmluZSBXTTgzNTBfTUFJTl9CQU5ER0FQX0NPTlRST0wgICAgICAgICAgICAgMHhEOAorI2RlZmluZSBXTTgzNTBfT1NDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHhEOQorI2RlZmluZSBXTTgzNTBfUlRDX1RJQ0tfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHhEQQorI2RlZmluZSBXTTgzNTBfU0VDVVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQgorI2RlZmluZSBXTTgzNTBfUkFNX0JJU1RfMSAgICAgICAgICAgICAgICAgICAgICAgMHhEQworI2RlZmluZSBXTTgzNTBfRENEQ19MRE9fU1RBVFVTICAgICAgICAgICAgICAgICAgMHhFMQorI2RlZmluZSBXTTgzNTBfR1BJT19QSU5fU1RBVFVTICAgICAgICAgICAgICAgICAgMHhFNgorCisjZGVmaW5lIFdNODM1MF9EQ0RDMV9GT1JDRV9QV00gICAgICAgICAgICAgICAgICAweEY4CisjZGVmaW5lIFdNODM1MF9EQ0RDM19GT1JDRV9QV00gICAgICAgICAgICAgICAgICAweEZBCisjZGVmaW5lIFdNODM1MF9EQ0RDNF9GT1JDRV9QV00gICAgICAgICAgICAgICAgICAweEZCCisjZGVmaW5lIFdNODM1MF9EQ0RDNl9GT1JDRV9QV00gICAgICAgICAgICAgICAgICAweEZECisKKy8qCisgKiBSMTcyICgweEFDKSAtIEN1cnJlbnQgU2luayBEcml2ZXIgQQorICovCisjZGVmaW5lIFdNODM1MF9DUzFfSElCX01PREUgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0NTMV9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQ1MxX0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdNODM1MF9DUzFfSVNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YKKyNkZWZpbmUgV004MzUwX0NTMV9JU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBCaXQgdmFsdWVzIGZvciBSMTcyICgweEFDKSAqLworI2RlZmluZSBXTTgzNTBfQ1MxX0hJQl9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9DUzFfSElCX01PREVfTEVBVkUgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfQ1MxX0lTRUxfMjIwTSAgICAgICAgICAgICAgICAgICAgICAweDNGCisKKy8qCisgKiBSMTczICgweEFEKSAtIENTQSBGbGFzaCBjb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMV9GTEFTSF9NT0RFICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfQ1MxX1RSSUdTUkMgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9DUzFfRFJJVkUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NTMV9GTEFTSF9EVVJfTUFTSyAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfQ1MxX09GRl9SQU1QX01BU0sgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9DUzFfT05fUkFNUF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDMKKworLyoKKyAqIFIxNzQgKDB4QUUpIC0gQ3VycmVudCBTaW5rIERyaXZlciBCCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMl9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfQ1MyX0lTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDNGCisKKy8qCisgKiBSMTc1ICgweEFGKSAtIENTQiBGbGFzaCBjb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0NTMl9GTEFTSF9NT0RFICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfQ1MyX1RSSUdTUkMgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9DUzJfRFJJVkUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NTMl9GTEFTSF9EVVJfTUFTSyAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfQ1MyX09GRl9SQU1QX01BU0sgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9DUzJfT05fUkFNUF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDMKKworLyoKKyAqIFIxNzYgKDB4QjApIC0gRENEQy9MRE8gcmVxdWVzdGVkCisgKi8KKyNkZWZpbmUgV004MzUwX0xTX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfTERPMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9EQzZfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0RDNV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfREM0X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQzNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0RDMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfREMxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTc3ICgweEIxKSAtIERDREMgQWN0aXZlIG9wdGlvbnMKKyAqLworI2RlZmluZSBXTTgzNTBfUFVUT19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9QV1JVUF9ERUxBWV9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDNl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfREM0X0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9EQzNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0RDMV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjE3OCAoMHhCMikgLSBEQ0RDIFNsZWVwIG9wdGlvbnMKKyAqLworI2RlZmluZSBXTTgzNTBfREM2X1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9EQzRfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgV004MzUwX0RDM19TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBXTTgzNTBfREMxX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTc5ICgweEIzKSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IKKyAqLworI2RlZmluZSBXTTgzNTBfUENDTVBfRVJSQUNUICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9QQ0NNUF9SQUlMICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX1BDQ01QX09GRl9USFJfTUFTSyAgICAgICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBXTTgzNTBfUENDTVBfT05fVEhSX01BU0sgICAgICAgICAgICAgICAgMHgwMDA3CisKKy8qCisgKiBSMTgwICgweEI0KSAtIERDREMxIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREMxX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9EQzFfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgV004MzUwX0RDMV9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjE4MSAoMHhCNSkgLSBEQ0RDMSBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9EQzFfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0RDMV9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfREMxX0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9EQzFfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0RDMV9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfREMxX1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9EQzFfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjE4MSAoMHhCNSkgKi8KKyNkZWZpbmUgV004MzUwX0RDMV9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMxX0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzFfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxODIgKDB4QjYpIC0gRENEQzEgTG93IFBvd2VyCisgKi8KKyNkZWZpbmUgV004MzUwX0RDMV9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBXTTgzNTBfREMxX0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9EQzFfVklNR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKworLyoKKyAqIFIxODMgKDB4QjcpIC0gRENEQzIgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0RDMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfREMyX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzJfSElCX01PREUgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfVFJJR19TSElGVCAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfREMyX0lMSU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9EQzJfSUxJTV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0RDMl9JTElNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfREMyX1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFdNODM1MF9EQzJfUk1QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0RDMl9GQlNSQ19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBXTTgzNTBfREMyX0ZCU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxODMgKDB4QjcpICovCisjZGVmaW5lIFdNODM1MF9EQzJfTU9ERV9CT09TVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDMl9NT0RFX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX01PREVfQUNUSVZFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX1RSSUdfTk9ORSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDMl9ISUJfVFJJR19MUFdSMSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREMyX0hJQl9UUklHX0xQV1IyICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9EQzJfSElCX1RSSUdfTFBXUjMgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBXTTgzNTBfREMyX0lMSU1fSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzJfSUxJTV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfREMyX1JNUF8zMFYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzJfUk1QXzIwViAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDMl9STVBfMTBWICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfREMyX1JNUF81ViAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgV004MzUwX0RDMl9GQlNSQ19GQjIgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMyX0ZCU1JDX0lTSU5LQSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzJfRkJTUkNfSVNJTktCICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0RDMl9GQlNSQ19VU0IgICAgICAgICAgICAgICAgICAgICAgICAgMworCisvKgorICogUjE4NCAoMHhCOCkgLSBEQ0RDMiBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9EQzJfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0RDMl9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfREMyX0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9EQzJfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0RDMl9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfREMyX1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxODQgKDB4QjgpICovCisjZGVmaW5lIFdNODM1MF9EQzJfRVJSQUNUX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDMl9FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREMyX0VSUkFDVF9TSFVURE9XTl9TWVMgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMTg2ICgweEJBKSAtIERDREMzIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREMzX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9EQzNfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgV004MzUwX0RDM19WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjE4NyAoMHhCQikgLSBEQ0RDMyBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9EQzNfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0RDM19FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfREMzX0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9EQzNfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0RDM19TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfREMzX1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9EQzNfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjE4NyAoMHhCQikgKi8KKyNkZWZpbmUgV004MzUwX0RDM19FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREMzX0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzNfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKy8qCisgKiBSMTg4ICgweEJDKSAtIERDREMzIExvdyBQb3dlcgorICovCisjZGVmaW5lIFdNODM1MF9EQzNfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgV004MzUwX0RDM19ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfREMzX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGCisKKy8qCisgKiBSMTg5ICgweEJEKSAtIERDREM0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfREM0X09QRkxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9EQzRfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgV004MzUwX0RDNF9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjE5MCAoMHhCRSkgLSBEQ0RDNCBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9EQzRfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0RDNF9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfREM0X0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9EQzRfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0RDNF9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfREM0X1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9EQzRfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjE5MCAoMHhCRSkgKi8KKyNkZWZpbmUgV004MzUwX0RDNF9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREM0X0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzRfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxOTEgKDB4QkYpIC0gRENEQzQgTG93IFBvd2VyCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNF9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBXTTgzNTBfREM0X0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9EQzRfVklNR19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YKKworLyoKKyAqIFIxOTIgKDB4QzApIC0gRENEQzUgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0RDNV9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfREM1X01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzVfSElCX01PREUgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfVFJJR19TSElGVCAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfREM1X0lMSU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9EQzVfSUxJTV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgV004MzUwX0RDNV9JTElNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfREM1X1JNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFdNODM1MF9EQzVfUk1QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX0RDNV9GQlNSQ19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBXTTgzNTBfREM1X0ZCU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxOTIgKDB4QzApICovCisjZGVmaW5lIFdNODM1MF9EQzVfTU9ERV9CT09TVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDNV9NT0RFX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX01PREVfQUNUSVZFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX1RSSUdfTk9ORSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0RDNV9ISUJfVFJJR19MUFdSMSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfREM1X0hJQl9UUklHX0xQV1IyICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9EQzVfSElCX1RSSUdfTFBXUjMgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBXTTgzNTBfREM1X0lMSU1fSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzVfSUxJTV9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfREM1X1JNUF8zMFYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzVfUk1QXzIwViAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNV9STVBfMTBWICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfREM1X1JNUF81ViAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgV004MzUwX0RDNV9GQlNSQ19GQjIgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREM1X0ZCU1JDX0lTSU5LQSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzVfRkJTUkNfSVNJTktCICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX0RDNV9GQlNSQ19VU0IgICAgICAgICAgICAgICAgICAgICAgICAgMworCisvKgorICogUjE5MyAoMHhDMSkgLSBEQ0RDNSBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9EQzVfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0RDNV9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfREM1X0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9EQzVfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0RDNV9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfREM1X1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9EQzVfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjE5MyAoMHhDMSkgKi8KKyNkZWZpbmUgV004MzUwX0RDNV9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfREM1X0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9EQzVfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIxOTUgKDB4QzMpIC0gRENEQzYgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9EQzZfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0RDNl9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfREM2X1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMTk2ICgweEM0KSAtIERDREM2IFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDNl9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfREM2X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9EQzZfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0RDNl9FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfREM2X1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9EQzZfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0RDNl9TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMTk2ICgweEM0KSAqLworI2RlZmluZSBXTTgzNTBfREM2X0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9EQzZfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0RDNl9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjE5NyAoMHhDNSkgLSBEQ0RDNiBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfREM2X0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNODM1MF9EQzZfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0RDNl9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorCisvKgorICogUjE5OSAoMHhDNykgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9MU19FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0xTX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfTFNfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9MU19FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0xTX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfTFNfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdNODM1MF9MU19ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0xTX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfTFNfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9MU19ISUJfUFJPVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0xTX0hJQl9QUk9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfTFNfSElCX1BST1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9MU19QUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgV004MzUwX0xTX1BST1RfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBXTTgzNTBfTFNfUFJPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIxOTkgKDB4QzcpICovCisjZGVmaW5lIFdNODM1MF9MU19FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfTFNfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0xTX0VSUkFDVF9TSFVURE9XTl9TWVMgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMjAwICgweEM4KSAtIExETzEgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9MRE8xX1NXSSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0xETzFfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfTERPMV9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGCisjZGVmaW5lIFdNODM1MF9MRE8xX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqIFIyMDEgKDB4QzkpIC0gTERPMSBUaW1lb3V0cworICovCisjZGVmaW5lIFdNODM1MF9MRE8xX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgV004MzUwX0xETzFfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBXTTgzNTBfTERPMV9FTlNMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgzQzAwCisjZGVmaW5lIFdNODM1MF9MRE8xX0VOU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX0xETzFfU0RTTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDNDMAorI2RlZmluZSBXTTgzNTBfTERPMV9VVlRPX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9MRE8xX1NEU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjIwMSAoMHhDOSkgKi8KKyNkZWZpbmUgV004MzUwX0xETzFfRVJSQUNUX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0xETzFfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0xETzFfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIyMDIgKDB4Q0EpIC0gTERPMSBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfTERPMV9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9MRE8xX0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0xETzFfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfTERPMV9ISUJfTU9ERV9ESVMJCSgweDEgPDwgMTIpCisKKworLyoKKyAqIFIyMDMgKDB4Q0IpIC0gTERPMiBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzJfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTERPMl9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYKKyNkZWZpbmUgV004MzUwX0xETzJfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjIwNCAoMHhDQykgLSBMRE8yIFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzJfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfTERPMl9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9MRE8yX0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0xETzJfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfTERPMl9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9MRE8yX1NEU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYKKworLyogQml0IHZhbHVlcyBmb3IgUjIwNCAoMHhDQykgKi8KKyNkZWZpbmUgV004MzUwX0xETzJfRVJSQUNUX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX0xETzJfRVJSQUNUX1NIVVRET1dOX0NPTlYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX0xETzJfRVJSQUNUX1NIVVRET1dOX1NZUyAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFIyMDUgKDB4Q0QpIC0gTERPMiBMb3cgUG93ZXIKKyAqLworI2RlZmluZSBXTTgzNTBfTERPMl9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX0hJQl9UUklHX01BU0sgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgV004MzUwX0xETzJfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorCisvKgorICogUjIwNiAoMHhDRSkgLSBMRE8zIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfTERPM19TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9MRE8zX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0xETzNfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfTERPM19WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMjA3ICgweENGKSAtIExETzMgVGltZW91dHMKKyAqLworI2RlZmluZSBXTTgzNTBfTERPM19FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX0xETzNfRU5TTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4M0MwMAorI2RlZmluZSBXTTgzNTBfTERPM19FTlNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFdNODM1MF9MRE8zX1NEU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDAzQzAKKyNkZWZpbmUgV004MzUwX0xETzNfVVZUT19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBXTTgzNTBfTERPM19TRFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICA2CisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMDcgKDB4Q0YpICovCisjZGVmaW5lIFdNODM1MF9MRE8zX0VSUkFDVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9MRE8zX0VSUkFDVF9TSFVURE9XTl9DT05WICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9MRE8zX0VSUkFDVF9TSFVURE9XTl9TWVMgICAgICAgICAgICAgICAyCisKKy8qCisgKiBSMjA4ICgweEQwKSAtIExETzMgTG93IFBvd2VyCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzNfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTgzNTBfTERPM19ISUJfVFJJR19NQVNLICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIFdNODM1MF9MRE8zX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYKKworLyoKKyAqIFIyMDkgKDB4RDEpIC0gTERPNCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzRfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9MRE80X1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYKKyNkZWZpbmUgV004MzUwX0xETzRfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogUjIxMCAoMHhEMikgLSBMRE80IFRpbWVvdXRzCisgKi8KKyNkZWZpbmUgV004MzUwX0xETzRfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBXTTgzNTBfTERPNF9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFdNODM1MF9MRE80X0VOU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDNDMDAKKyNkZWZpbmUgV004MzUwX0xETzRfRU5TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfTERPNF9TRFNMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwM0MwCisjZGVmaW5lIFdNODM1MF9MRE80X1VWVE9fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgV004MzUwX0xETzRfU0RTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNgorCisvKiBCaXQgdmFsdWVzIGZvciBSMjEwICgweEQyKSAqLworI2RlZmluZSBXTTgzNTBfTERPNF9FUlJBQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfTERPNF9FUlJBQ1RfU0hVVERPV05fQ09OViAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfTERPNF9FUlJBQ1RfU0hVVERPV05fU1lTICAgICAgICAgICAgICAgMgorCisvKgorICogUjIxMSAoMHhEMykgLSBMRE80IExvdyBQb3dlcgorICovCisjZGVmaW5lIFdNODM1MF9MRE80X0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgV004MzUwX0xETzRfSElCX1RSSUdfTUFTSyAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBXTTgzNTBfTERPNF9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGCisKKy8qCisgKiBSMjE1ICgweEQ3KSAtIFZDQ19GQVVMVCBNYXNrcworICovCisjZGVmaW5lIFdNODM1MF9MU19GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX0xETzRfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfTERPM19GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9MRE8yX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgV004MzUwX0xETzFfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfREM2X0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9EQzVfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0RDNF9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfREMzX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9EQzJfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0RDMV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKgorICogUjIxNiAoMHhEOCkgLSBNYWluIEJhbmRnYXAgQ29udHJvbAorICovCisjZGVmaW5lIFdNODM1MF9NQkdfTE9BRF9GVVNFUyAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgV004MzUwX01CR19GVVNFX1dQUkVQICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfTUJHX0ZVU0VfV1JJVEUgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9NQkdfRlVTRV9UUklNX01BU0sgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgV004MzUwX01CR19UUklNX1NSQyAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBXTTgzNTBfTUJHX1VTRVJfVFJJTV9NQVNLICAgICAgICAgICAgICAgMHgwMDFGCisKKy8qCisgKiBSMjE3ICgweEQ5KSAtIE9TQyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX09TQ19MT0FEX0ZVU0VTICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfT1NDX0ZVU0VfV1BSRVAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9PU0NfRlVTRV9XUklURSAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX09TQ19GVVNFX1RSSU1fTUFTSyAgICAgICAgICAgICAgIDB4MEYwMAorI2RlZmluZSBXTTgzNTBfT1NDX1RSSU1fU1JDICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9PU0NfVVNFUl9UUklNX01BU0sgICAgICAgICAgICAgICAweDAwMEYKKworLyoKKyAqIFIyNDggKDB4RjgpIC0gRENEQzEgRm9yY2UgUFdNCisgKi8KKyNkZWZpbmUgV004MzUwX0RDREMxX0ZPUkNFX1BXTV9FTkEgICAgICAgICAgICAgIDB4MDAxMAorCisvKgorICogUjI1MCAoMHhGQSkgLSBEQ0RDMyBGb3JjZSBQV00KKyAqLworI2RlZmluZSBXTTgzNTBfRENEQzNfRk9SQ0VfUFdNX0VOQSAgICAgICAgICAgICAgMHgwMDEwCisKKy8qCisgKiBSMjUxICgweEZCKSAtIERDREM0IEZvcmNlIFBXTQorICovCisjZGVmaW5lIFdNODM1MF9EQ0RDNF9GT1JDRV9QV01fRU5BICAgICAgICAgICAgICAweDAwMTAKKworLyoKKyAqIFIyNTMgKDB4RkQpIC0gRENEQzEgRm9yY2UgUFdNCisgKi8KKyNkZWZpbmUgV004MzUwX0RDREM2X0ZPUkNFX1BXTV9FTkEgICAgICAgICAgICAgIDB4MDAxMAorCisvKgorICogRENEQydzCisgKi8KKyNkZWZpbmUgV004MzUwX0RDRENfMQkJCQkwCisjZGVmaW5lIFdNODM1MF9EQ0RDXzIJCQkJMQorI2RlZmluZSBXTTgzNTBfRENEQ18zCQkJCTIKKyNkZWZpbmUgV004MzUwX0RDRENfNAkJCQkzCisjZGVmaW5lIFdNODM1MF9EQ0RDXzUJCQkJNAorI2RlZmluZSBXTTgzNTBfRENEQ182CQkJCTUKKworLyogRENEQyBtb2RlcyAqLworI2RlZmluZSBXTTgzNTBfRENEQ19BQ1RJVkVfU1RBTkRCWQkJMAorI2RlZmluZSBXTTgzNTBfRENEQ19BQ1RJVkVfUFVMU0UJCTEKKyNkZWZpbmUgV004MzUwX0RDRENfU0xFRVBfTk9STUFMCQkwCisjZGVmaW5lIFdNODM1MF9EQ0RDX1NMRUVQX0xPVwkJCTEKKworLyogRENEQyBMb3cgcG93ZXIgKEhpYmVybmF0ZSkgbW9kZSAqLworI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9DVVIJCSgwIDw8IDEyKQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9JTUFHRQkJKDEgPDwgMTIpCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9NT0RFX1NUQU5EQlkJCSgyIDw8IDEyKQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9MRE8JCSg0IDw8IDEyKQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9MRE9fSU0JCSg1IDw8IDEyKQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9ESVMJCSg3IDw8IDEyKQorI2RlZmluZSBXTTgzNTBfRENEQ19ISUJfTU9ERV9NQVNLCQkoNyA8PCAxMikKKworLyogRENEQyBMb3cgUG93ZXIgKEhpYmVybmF0ZSkgc2lnbmFsICovCisjZGVmaW5lIFdNODM1MF9EQ0RDX0hJQl9TSUdfUkVHCQkJKDAgPDwgOCkKKyNkZWZpbmUgV004MzUwX0RDRENfSElCX1NJR19MUFdSMQkJKDEgPDwgOCkKKyNkZWZpbmUgV004MzUwX0RDRENfSElCX1NJR19MUFdSMgkJKDIgPDwgOCkKKyNkZWZpbmUgV004MzUwX0RDRENfSElCX1NJR19MUFdSMwkJKDMgPDwgOCkKKworLyogTERPIExvdyBwb3dlciAoSGliZXJuYXRlKSBtb2RlICovCisjZGVmaW5lIFdNODM1MF9MRE9fSElCX01PREVfSU1BR0UJCSgwIDw8IDApCisjZGVmaW5lIFdNODM1MF9MRE9fSElCX01PREVfRElTCQkJKDEgPDwgMCkKKworLyogTERPIExvdyBQb3dlciAoSGliZXJuYXRlKSBzaWduYWwgKi8KKyNkZWZpbmUgV004MzUwX0xET19ISUJfU0lHX1JFRwkJCSgwIDw8IDgpCisjZGVmaW5lIFdNODM1MF9MRE9fSElCX1NJR19MUFdSMQkJKDEgPDwgOCkKKyNkZWZpbmUgV004MzUwX0xET19ISUJfU0lHX0xQV1IyCQkoMiA8PCA4KQorI2RlZmluZSBXTTgzNTBfTERPX0hJQl9TSUdfTFBXUjMJCSgzIDw8IDgpCisKKy8qCisgKiBMRE9zCisgKi8KKyNkZWZpbmUgV004MzUwX0xET18xCQkJCTYKKyNkZWZpbmUgV004MzUwX0xET18yCQkJCTcKKyNkZWZpbmUgV004MzUwX0xET18zCQkJCTgKKyNkZWZpbmUgV004MzUwX0xET180CQkJCTkKKworLyoKKyAqIElTSU5LcworICovCisjZGVmaW5lIFdNODM1MF9JU0lOS19BCQkJCTEwCisjZGVmaW5lIFdNODM1MF9JU0lOS19CCQkJCTExCisKKyNkZWZpbmUgV004MzUwX0lTSU5LX01PREVfQk9PU1QJCQkwCisjZGVmaW5lIFdNODM1MF9JU0lOS19NT0RFX1NXSVRDSAkJMQorI2RlZmluZSBXTTgzNTBfSVNJTktfSUxJTV9OT1JNQUwJCTAKKyNkZWZpbmUgV004MzUwX0lTSU5LX0lMSU1fTE9XCQkJMQorCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9ESVNBQkxFCQkwCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9FTkFCTEUJCTEKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX1RSSUdfQklUCQkwCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9UUklHX0dQSU8JCTEKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX01PREVfRU4JCSgxIDw8IDEzKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfTU9ERV9ESVMJCSgwIDw8IDEzKQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfRFVSXzMyTVMJCSgwIDw8IDgpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9EVVJfNjRNUwkJKDEgPDwgOCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX0RVUl85Nk1TCQkoMiA8PCA4KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfRFVSXzEwMjRNUwkJKDMgPDwgOCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09OX0lOU1RBTlQJCSgwIDw8IDQpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9PTl8wXzI1UwkJKDEgPDwgNCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09OXzBfNTBTCQkoMiA8PCA0KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT05fMV8wMFMJCSgzIDw8IDQpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9PTl8xXzk1UwkJKDEgPDwgNCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09OXzNfOTFTCQkoMiA8PCA0KQorI2RlZmluZSBXTTgzNTBfSVNJTktfRkxBU0hfT05fN184MFMJCSgzIDw8IDQpCisjZGVmaW5lIFdNODM1MF9JU0lOS19GTEFTSF9PRkZfSU5TVEFOVAkJKDAgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl8wXzI1UwkJKDEgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl8wXzUwUwkJKDIgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl8xXzAwUwkJKDMgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl8xXzk1UwkJKDEgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl8zXzkxUwkJKDIgPDwgMCkKKyNkZWZpbmUgV004MzUwX0lTSU5LX0ZMQVNIX09GRl83XzgwUwkJKDMgPDwgMCkKKworLyoKKyAqIFJlZ3VsYXRvciBJbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIFdNODM1MF9JUlFfQ1MxCQkJCTEzCisjZGVmaW5lIFdNODM1MF9JUlFfQ1MyCQkJCTE0CisjZGVmaW5lIFdNODM1MF9JUlFfVVZfTERPNAkJCTI1CisjZGVmaW5lIFdNODM1MF9JUlFfVVZfTERPMwkJCTI2CisjZGVmaW5lIFdNODM1MF9JUlFfVVZfTERPMgkJCTI3CisjZGVmaW5lIFdNODM1MF9JUlFfVVZfTERPMQkJCTI4CisjZGVmaW5lIFdNODM1MF9JUlFfVVZfREM2CQkJMjkKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9EQzUJCQkzMAorI2RlZmluZSBXTTgzNTBfSVJRX1VWX0RDNAkJCTMxCisjZGVmaW5lIFdNODM1MF9JUlFfVVZfREMzCQkJMzIKKyNkZWZpbmUgV004MzUwX0lSUV9VVl9EQzIJCQkzMworI2RlZmluZSBXTTgzNTBfSVJRX1VWX0RDMQkJCTM0CisjZGVmaW5lIFdNODM1MF9JUlFfT0NfTFMJCQkzNQorCisjZGVmaW5lIE5VTV9XTTgzNTBfUkVHVUxBVE9SUwkJCTEyCisKK3N0cnVjdCB3bTgzNTA7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGE7CisKK3N0cnVjdCB3bTgzNTBfcG1pYyB7CisJLyogSVNJTksgdG8gRENEQyBtYXBwaW5nICovCisJaW50IGlzaW5rX0FfZGNkYzsKKwlpbnQgaXNpbmtfQl9kY2RjOworCisJLyogaGliZXJuYXRlIGNvbmZpZ3MgKi8KKwl1MTYgZGNkYzFfaGliX21vZGU7CisJdTE2IGRjZGMzX2hpYl9tb2RlOworCXUxNiBkY2RjNF9oaWJfbW9kZTsKKwl1MTYgZGNkYzZfaGliX21vZGU7CisKKwkvKiByZWd1bGF0b3IgZGV2aWNlcyAqLworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZbTlVNX1dNODM1MF9SRUdVTEFUT1JTXTsKK307CisKK2ludCB3bTgzNTBfcmVnaXN0ZXJfcmVndWxhdG9yKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IHJlZywKKwkJCSAgICAgIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0ZGF0YSk7CisKKy8qCisgKiBBZGRpdGlvbmFsIERDREMgY29udHJvbCBub3Qgc3VwcG9ydGVkIHZpYSByZWd1bGF0b3IgQVBJCisgKi8KK2ludCB3bTgzNTBfZGNkY19zZXRfc2xvdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBkY2RjLCB1MTYgc3RhcnQsCisJCQkgdTE2IHN0b3AsIHUxNiBmYXVsdCk7CitpbnQgd204MzUwX2RjZGMyNV9zZXRfbW9kZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBkY2RjLCB1MTYgbW9kZSwKKwkJCSAgIHUxNiBpbGltLCB1MTYgcmFtcCwgdTE2IGZlZWRiYWNrKTsKKworLyoKKyAqIEFkZGl0aW9uYWwgTERPIGNvbnRyb2wgbm90IHN1cHBvcnRlZCB2aWEgcmVndWxhdG9yIEFQSQorICovCitpbnQgd204MzUwX2xkb19zZXRfc2xvdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBsZG8sIHUxNiBzdGFydCwgdTE2IHN0b3ApOworCisvKgorICogQWRkaXRpb25hbCBJU0lOSyBjb250cm9sIG5vdCBzdXBwb3J0ZWQgdmlhIHJlZ3VsYXRvciBBUEkKKyAqLworaW50IHdtODM1MF9pc2lua19zZXRfZmxhc2goc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXNpbmssIHUxNiBtb2RlLAorCQkJICAgdTE2IHRyaWdnZXIsIHUxNiBkdXJhdGlvbiwgdTE2IG9uX3JhbXAsCisJCQkgICB1MTYgb2ZmX3JhbXAsIHUxNiBkcml2ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3J0Yy5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGE2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcnRjLmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBydGMuaCAgLS0gIFJUQyBkcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfUlRDX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX1JUQ19ICisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX1NFQ09ORFNfTUlOVVRFUyAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTgzNTBfUlRDX0hPVVJTX0RBWSAgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBXTTgzNTBfUlRDX0RBVEVfTU9OVEggICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBXTTgzNTBfUlRDX1lFQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBXTTgzNTBfQUxBUk1fU0VDT05EU19NSU5VVEVTICAgICAgICAgICAgMHgxNAorI2RlZmluZSBXTTgzNTBfQUxBUk1fSE9VUlNfREFZICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBXTTgzNTBfQUxBUk1fREFURV9NT05USCAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBXTTgzNTBfUlRDX1RJTUVfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHgxNworCisvKgorICogUjE2ICgweDEwKSAtIFJUQyBTZWNvbmRzL01pbnV0ZXMKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX01JTlNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg3RjAwCisjZGVmaW5lIFdNODM1MF9SVENfTUlOU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19TRUNTX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RgorI2RlZmluZSBXTTgzNTBfUlRDX1NFQ1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMTcgKDB4MTEpIC0gUlRDIEhvdXJzL0RheQorICovCisjZGVmaW5lIFdNODM1MF9SVENfREFZX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA3MDAKKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX0hQTV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9SVENfSFBNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19IUlNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfUlRDX0hSU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMSAoMHgxNSkgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfU1VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9NT04gICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9SVENfREFZX1RVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfV0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX0RBWV9USFUgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9SVENfREFZX0ZSSSAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX1JUQ19EQVlfU0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFdNODM1MF9SVENfSFBNX0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19IUE1fUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKgorICogUjE4ICgweDEyKSAtIFJUQyBEYXRlL01vbnRoCisgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfREFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YKKyNkZWZpbmUgV004MzUwX1JUQ19EQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBCaXQgdmFsdWVzIGZvciBSMjIgKDB4MTYpICovCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfRkVCICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfUlRDX01USF9NQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0FQUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfTUFZICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9KVU4gICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pVTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfQVVHICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9TRVAgICAgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX09DVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfTk9WICAgICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9ERUMgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pBTl9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfRkVCX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTTgzNTBfUlRDX01USF9NQVJfQkNEICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0FQUl9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfTUFZX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9KVU5fQkNEICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX0pVTF9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfQVVHX0JDRCAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTgzNTBfUlRDX01USF9TRVBfQkNEICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFdNODM1MF9SVENfTVRIX09DVF9CQ0QgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgV004MzUwX1JUQ19NVEhfTk9WX0JDRCAgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBXTTgzNTBfUlRDX01USF9ERUNfQkNEICAgICAgICAgICAgICAgICAgICAweDEyCisKKy8qCisgKiBSMTkgKDB4MTMpIC0gUlRDIFllYXIKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX1lIVU5EUkVEU19NQVNLICAgICAgICAgICAgICAgMHgzRjAwCisjZGVmaW5lIFdNODM1MF9SVENfWUhVTkRSRURTX1NISUZUICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19ZVU5JVFNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDBGRgorI2RlZmluZSBXTTgzNTBfUlRDX1lVTklUU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiBSMjAgKDB4MTQpIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzCisgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NSU5TX01BU0sgICAgICAgICAgICAgICAgIDB4N0YwMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1JTlNfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfQUxNU0VDU19NQVNLICAgICAgICAgICAgICAgICAweDAwN0YKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRUNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBCaXQgdmFsdWVzIGZvciBSMjAgKDB4MTQpICovCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTUlOU19ET05UX0NBUkUgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRUNTX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAtMQorCisvKgorICogUjIxICgweDE1KSAtIEFsYXJtIEhvdXJzL0RheQorICovCisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX01BU0sgICAgICAgICAgICAgICAgICAweDBGMDAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhQTV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNSFBNX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1IUlNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxRgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhSU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMSAoMHgxNSkgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9TVU4gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX01PTiAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfVFVFICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9XRUQgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9SVENfQUxNREFZX1RIVSAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVlfRlJJICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBWV9TQVQgICAgICAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1IUE1fQU0gICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTUhQTV9QTSAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1IUlNfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAtMQorCisvKgorICogUjIyICgweDE2KSAtIEFsYXJtIERhdGUvTW9udGgKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9NQVNLICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVRFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAzRgorI2RlZmluZSBXTTgzNTBfUlRDX0FMTURBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEJpdCB2YWx1ZXMgZm9yIFIyMiAoMHgxNikgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19BTE1EQVRFX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAtMQorCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSkFOICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9GRUIgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX01BUiAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfQVBSICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9NQVkgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0pVTiAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSlVMICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9BVUcgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX1NFUCAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfT0NUICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9OT1YgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0RFQyAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSkFOX0JDRCAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9GRUJfQkNEICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX01BUl9CQ0QgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfQVBSX0JDRCAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9NQVlfQkNEICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0pVTl9CQ0QgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfSlVMX0JDRCAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9BVUdfQkNEICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX1NFUF9CQ0QgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1NVEhfT0NUX0JDRCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTU1USF9OT1ZfQkNEICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFdNODM1MF9SVENfQUxNTVRIX0RFQ19CQ0QgICAgICAgICAgICAgICAgIDB4MTIKKworLyoKKyAqIFIyMyAoMHgxNykgLSBSVEMgVGltZSBDb250cm9sCisgKi8KKyNkZWZpbmUgV004MzUwX1JUQ19CQ0QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTgzNTBfUlRDX0JDRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9SVENfQkNEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgV004MzUwX1JUQ18xMkhSICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBXTTgzNTBfUlRDXzEySFJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9SVENfMTJIUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgV004MzUwX1JUQ19EU1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBXTTgzNTBfUlRDX0RTVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFdNODM1MF9SVENfRFNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgV004MzUwX1JUQ19TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBXTTgzNTBfUlRDX1NFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9SVENfU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgV004MzUwX1JUQ19TVFMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBXTTgzNTBfUlRDX1NUU19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFdNODM1MF9SVENfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNFVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX1JUQ19BTE1TVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNUU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MAorI2RlZmluZSBXTTgzNTBfUlRDX1BJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV004MzUwX1JUQ19EU1cgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRgorI2RlZmluZSBXTTgzNTBfUlRDX0RTV19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIFdNODM1MF9SVENfRFNXX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogQml0IHZhbHVlcyBmb3IgUjIzICgweDE3KSAqLworI2RlZmluZSBXTTgzNTBfUlRDX0JDRF9CSU5BUlkgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfQkNEX0JDRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDXzEySFJfMjRIUiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfMTJIUl8xMkhSICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX0RTVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfRFNUX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX1NFVF9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfU0VUX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX1NUU19SVU5OSU5HICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfU1RTX1NUT1BQRUQgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNFVF9SVU4gICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU0VUX1NFVCAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX0FMTVNUU19SVU5OSU5HICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfQUxNU1RTX1NUT1BQRUQgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBXTTgzNTBfUlRDX1BJTlRfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9TRUNTICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UX01JTlMgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBXTTgzNTBfUlRDX1BJTlRfSFJTICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdNODM1MF9SVENfUElOVF9EQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV004MzUwX1JUQ19QSU5UX01USFMgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIFdNODM1MF9SVENfRFNXX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfMUhaICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBXTTgzNTBfUlRDX0RTV18ySFogICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzRIWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfOEhaICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXTTgzNTBfUlRDX0RTV18xNkhaICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzMySFogICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfNjRIWiAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBXTTgzNTBfUlRDX0RTV18xMjhIWiAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFdNODM1MF9SVENfRFNXXzI1NkhaICAgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgV004MzUwX1JUQ19EU1dfNTEySFogICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBXTTgzNTBfUlRDX0RTV18xMDI0SFogICAgICAgICAgICAgICAgICAgICAgIDExCisKKy8qCisgKiBSMjE4ICgweERBKSAtIFJUQyBUaWNrIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTgzNTBfUlRDX1RJQ0tTVFMgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNODM1MF9SVENfQ0xLU1JDICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX1JUQ19UUklNX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDNGRgorCisvKgorICogUlRDIEludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgV004MzUwX0lSUV9SVENfUEVSCQkJNworI2RlZmluZSBXTTgzNTBfSVJRX1JUQ19TRUMJCQk4CisjZGVmaW5lIFdNODM1MF9JUlFfUlRDX0FMTQkJCTkKKworc3RydWN0IHdtODM1MF9ydGMgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9zdXBwbHkuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9zdXBwbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhmM2NkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogc3VwcGx5LmggIC0tICBQb3dlciBTdXBwbHkgRHJpdmVyIGZvciBXb2xmc29uIFdNODM1MCBQTUlDCisgKgorICogQ29weXJpZ2h0IDIwMDcgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODM1MF9TVVBQTFlfSF8KKyNkZWZpbmUgX19MSU5VWF9NRkRfV004MzUwX1NVUFBMWV9IXworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qCisgKiBDaGFyZ2VyIHJlZ2lzdGVycworICovCisjZGVmaW5lIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8xICAgICAgICAweEE4CisjZGVmaW5lIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8yICAgICAgICAweEE5CisjZGVmaW5lIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8zICAgICAgICAweEFBCisKKy8qCisgKiBSMTY4ICgweEE4KSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hHX0VOQV9SMTY4ICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9DSEdfVEhSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgV004MzUwX0NIR19FT0NfU0VMX01BU0sgICAgICAgICAgICAgICAgIDB4MUMwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1RSSUNLTEVfVEVNUF9DSE9LRSAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdNODM1MF9DSEdfVFJJQ0tMRV9VU0JfQ0hPS0UgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgV004MzUwX0NIR19SRUNPVkVSX1QgICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBXTTgzNTBfQ0hHX0VORF9BQ1QgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFdNODM1MF9DSEdfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgV004MzUwX0NIR19GQVNUX1VTQl9USFJPVFRMRSAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfQ0hHX05UQ19NT04gICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODM1MF9DSEdfQkFUVF9IT1RfTU9OICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgV004MzUwX0NIR19CQVRUX0NPTERfTU9OICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBXTTgzNTBfQ0hHX0NISVBfVEVNUF9NT04gICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBSMTY5ICgweEE5KSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hHX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdNODM1MF9DSEdfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgV004MzUwX0NIR19TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1RJTUVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIFdNODM1MF9DSEdfTUFTS19XQUxMX0ZCICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFX1NFTCAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfQ0hHX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9DSEdfSVNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMEYKKyNkZWZpbmUgV004MzUwX0NIR19TVFNfT0ZGICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBXTTgzNTBfQ0hHX1NUU19UUklDS0xFICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFdNODM1MF9DSEdfU1RTX0ZBU1QgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKworLyoKKyAqIFIxNzAgKDB4QUEpIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMworICovCisjZGVmaW5lIFdNODM1MF9DSEdfVEhST1RUTEVfVF9NQVNLICAgICAgICAgICAgICAweDAwNjAKKyNkZWZpbmUgV004MzUwX0NIR19TTUFSVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBXTTgzNTBfQ0hHX1RJTUVSX0FESlRfTUFTSyAgICAgICAgICAgICAgMHgwMDBGCisKKy8qCisgKiBDaGFyZ2VyIEludGVycnVwdHMKKyAqLworI2RlZmluZSBXTTgzNTBfSVJRX0NIR19CQVRfSE9UCQkJMAorI2RlZmluZSBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRAkJCTEKKyNkZWZpbmUgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwJCQkyCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX1RPCQkJMworI2RlZmluZSBXTTgzNTBfSVJRX0NIR19FTkQJCQk0CisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX1NUQVJUCQkJNQorI2RlZmluZSBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWQkJCTYKKyNkZWZpbmUgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5CQkxMAorI2RlZmluZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDEJCTExCisjZGVmaW5lIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODUJCTEyCisKKy8qCisgKiBDaGFyZ2VyIFBvbGljeQorICovCisjZGVmaW5lIFdNODM1MF9DSEdfVFJJQ0tMRV81MG1BCQkJKDAgPDwgNikKKyNkZWZpbmUgV004MzUwX0NIR19UUklDS0xFXzEwMG1BCQkoMSA8PCA2KQorI2RlZmluZSBXTTgzNTBfQ0hHXzRfMDVWCQkJKDAgPDwgNCkKKyNkZWZpbmUgV004MzUwX0NIR180XzEwVgkJCSgxIDw8IDQpCisjZGVmaW5lIFdNODM1MF9DSEdfNF8xNVYJCQkoMiA8PCA0KQorI2RlZmluZSBXTTgzNTBfQ0hHXzRfMjBWCQkJKDMgPDwgNCkKKyNkZWZpbmUgV004MzUwX0NIR19GQVNUX0xJTUlUX21BKHgpCQkoKHggLyA1MCkgJiAweGYpCisjZGVmaW5lIFdNODM1MF9DSEdfRU9DX21BKHgpCQkJKCgoeCAtIDEwKSAmIDB4NykgPDwgMTApCisjZGVmaW5lIFdNODM1MF9DSEdfVFJJQ0tMRV8zXzFWCQkJKDAgPDwgMTMpCisjZGVmaW5lIFdNODM1MF9DSEdfVFJJQ0tMRV8zXzlWCQkJKDEgPDwgMTMpCisKKy8qCisgKiBTdXBwbHkgUmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFdNODM1MF9VU0JfVk9MVEFHRV9SRUFEQkFDSyAgICAgICAgICAgICAweDlDCisjZGVmaW5lIFdNODM1MF9MSU5FX1ZPTFRBR0VfUkVBREJBQ0sgICAgICAgICAgICAweDlECisjZGVmaW5lIFdNODM1MF9CQVRUX1ZPTFRBR0VfUkVBREJBQ0sgICAgICAgICAgICAweDlFCisKKy8qCisgKiBTdXBwbHkgSW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBXTTgzNTBfSVJRX1VTQl9MSU1JVAkJCTE1CisjZGVmaW5lIFdNODM1MF9JUlFfRVhUX1VTQl9GQgkJCTM2CisjZGVmaW5lIFdNODM1MF9JUlFfRVhUX1dBTExfRkIJCQkzNworI2RlZmluZSBXTTgzNTBfSVJRX0VYVF9CQVRfRkIJCQkzOAorCitzdHJ1Y3Qgd204MzUwX3Bvd2VyIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvd2R0LmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvd2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMzViNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC93ZHQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogd2R0LmggIC0tICBXYXRjaGRvZyBEcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTgzNTBfV0RUX0hfCisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODM1MF9XRFRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIFdNODM1MF9XRE9HX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX1dET0dfREVCVUcgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfV0RPR19NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIFdNODM1MF9XRE9HX1RPX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDcKKworI2RlZmluZSBXTTgzNTBfSVJRX1NZU19XRE9HX1RPCQkJMjQKKworc3RydWN0IHdtODM1MF93ZHQgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODQwMC1hdWRpby5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLWF1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NDBlMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODQwMC1hdWRpby5oCkBAIC0wLDAgKzEsMTE4NiBAQAorLyoKKyAqIHdtODQwMCBwcml2YXRlIGRlZmluaXRpb25zIGZvciBhdWRpbworICoKKyAqIENvcHlyaWdodCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1dNODQwMF9BVURJT19ICisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODQwMF9BVURJT19ICisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204NDAwLWF1ZGlvLmg+CisKKy8qCisgKiBSMiAoMHgwMikgLSBQb3dlciBNYW5hZ2VtZW50ICgxKQorICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENPREVDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDT0RFQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogQ09ERUNfRU5BICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENPREVDX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBTWVNDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9TWVNDTEtfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NZU0NMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogU1lTQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTWVNDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfTUlYX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFNQS19NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfTUlYX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFNQS19NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfTUlYX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIFNQS19NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfTUlYX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQS19NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFNQS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogU1BLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfU1BLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBTUEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9TUEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUM19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDNfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUM19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUM19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogT1VUNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogT1VUNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogT1VUNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX09VVDRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPVVRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTE9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPVVRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTE9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPVVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogTE9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPVVRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPVVRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUk9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPVVRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUk9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPVVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogUk9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPVVRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9VVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFCSUFTX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTUlDMUJJQVNfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxQklBU19FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQzFCSUFTX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMUJJQVNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBNSUMxQklBU19FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFCSUFTX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDMUJJQVNfRU5BICovCisjZGVmaW5lIFdNODQwMF9WTUlEX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDYgIC8qIFZNSURfTU9ERSAtIFsyOjFdICovCisjZGVmaW5lIFdNODQwMF9WTUlEX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZNSURfTU9ERSAtIFsyOjFdICovCisjZGVmaW5lIFdNODQwMF9WTUlEX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFZNSURfTU9ERSAtIFsyOjFdICovCisjZGVmaW5lIFdNODQwMF9WUkVGX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZSRUZfRU5BICovCisjZGVmaW5lIFdNODQwMF9WUkVGX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZSRUZfRU5BICovCisjZGVmaW5lIFdNODQwMF9WUkVGX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFZSRUZfRU5BICovCisjZGVmaW5lIFdNODQwMF9WUkVGX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZSRUZfRU5BICovCisKKy8qCisgKiBSMyAoMHgwMykgLSBQb3dlciBNYW5hZ2VtZW50ICgyKQorICovCisjZGVmaW5lIFdNODQwMF9GTExfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBGTExfRU5BICovCisjZGVmaW5lIFdNODQwMF9GTExfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogVFNIVVRfRU5BICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFRTSFVUX0VOQSAqLworI2RlZmluZSBXTTg0MDBfVFNIVVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBUU0hVVF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RTSFVUX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVFNIVVRfRU5BICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9PUERJUyAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFRTSFVUX09QRElTICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9PUERJU19NQVNLICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFRTSFVUX09QRElTICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9PUERJU19TSElGVCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIFRTSFVUX09QRElTICovCisjZGVmaW5lIFdNODQwMF9UU0hVVF9PUERJU19XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRTSFVUX09QRElTICovCisjZGVmaW5lIFdNODQwMF9PUENMS19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9QQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1BDTEtfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX09QQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogT1BDTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9PUENMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9QQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBBSU5MX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBBSU5MX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBBSU5MX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSU5MX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBSU5SX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBSU5SX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBSU5SX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQUlOUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSU5SX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMzRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU4zNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xJTjM0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElOMzRfRU5BICovCisjZGVmaW5lIFdNODQwMF9MSU4zNF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMzRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU4zNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xJTjEyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTElOMTJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MSU4xMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJTjEyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTElOMTJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xJTjEyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTElOMTJfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4zNF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfUklOMzRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSSU4zNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JJTjM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUklOMzRfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4zNF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJTjM0X0VOQSAqLworI2RlZmluZSBXTTg0MDBfUklOMTJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JJTjEyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUklOMTJfRU5BICovCisjZGVmaW5lIFdNODQwMF9SSU4xMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFJJTjEyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUklOMTJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSU4xMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQURDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDUl9FTkEgKi8KKworLyoKKyAqIFI0ICgweDA0KSAtIFBvd2VyIE1hbmFnZW1lbnQgKDMpCisgKi8KKyNkZWZpbmUgV004NDAwX0xPTl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogTE9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9OX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBMT05fRU5BICovCisjZGVmaW5lIFdNODQwMF9MT05fRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIExPTl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPTl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMT1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExPUF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPUF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogTE9QX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST05fRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFJPTl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPTl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogUk9OX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9OX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDExICAvKiBST05fRU5BICovCisjZGVmaW5lIFdNODQwMF9ST05fRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPTl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogUk9QX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBST1BfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST1BfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIFJPUF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTE9QR0FfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT1BHQV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExPUEdBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUk9QR0FfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST1BHQV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJPUEdBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBST1BHQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QR0FfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT01JWF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTE9NSVhfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMT01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xPTUlYX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTE9NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9MT01JWF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9NSVhfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBST01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1JPTUlYX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUk9NSVhfRU5BICovCisjZGVmaW5lIFdNODQwMF9ST01JWF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFJPTUlYX0VOQSAqLworI2RlZmluZSBXTTg0MDBfUk9NSVhfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST01JWF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREFDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogREFDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogREFDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDUl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDUl9FTkEgKi8KKworLyoKKyAqIFI1ICgweDA1KSAtIEF1ZGlvIEludGVyZmFjZSAoMSkKKyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDTF9TUkMgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBSUZBRENMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDTF9TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBSUZBRENMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDTF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBBSUZBRENMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDTF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZBRENMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDUl9TUkMgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBBSUZBRENSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDUl9TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBBSUZBRENSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDUl9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBBSUZBRENSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDUl9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZBRENSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDX1RETSAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZBRENfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNX01BU0sgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRkFEQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkFEQ19URE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGQURDX1RETSAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDX1RETV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZBRENfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNX0NIQU4gICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfQUlGQURDX1RETV9DSEFOX01BU0sgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUZBRENfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004NDAwX0FJRkFEQ19URE1fQ0hBTl9TSElGVCAgICAgICAgICAgICAgICAxMiAgLyogQUlGQURDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9BSUZBRENfVERNX0NIQU5fV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFJRkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfQUlGX0JDTEtfSU5WICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBSUZfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9CQ0xLX0lOVl9NQVNLICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQUlGX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODQwMF9BSUZfQkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJRl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX0JDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS19JTlYgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLX0lOVl9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUZfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODQwMF9BSUZfTFJDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRl9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg0MDBfQUlGX1dMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUZfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg0MDBfQUlGX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBBSUZfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg0MDBfQUlGX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUZfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg0MDBfQUlGX1dMXzE2QklUUwkJCSgwIDw8IDUpCisjZGVmaW5lIFdNODQwMF9BSUZfV0xfMjBCSVRTCQkJKDEgPDwgNSkKKyNkZWZpbmUgV004NDAwX0FJRl9XTF8yNEJJVFMJCQkoMiA8PCA1KQorI2RlZmluZSBXTTg0MDBfQUlGX1dMXzMyQklUUwkJCSgzIDw8IDUpCisjZGVmaW5lIFdNODQwMF9BSUZfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTggIC8qIEFJRl9GTVQgLSBbNDozXSAqLworI2RlZmluZSBXTTg0MDBfQUlGX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBSUZfRk1UIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGX0ZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODQwMF9BSUZfRk1UX1JJR0hUSgkJCSgwIDw8IDMpCisjZGVmaW5lIFdNODQwMF9BSUZfRk1UX0xFRlRKCQkJKDEgPDwgMykKKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfSTJTCQkJKDIgPDwgMykKKyNkZWZpbmUgV004NDAwX0FJRl9GTVRfRFNQCQkJKDMgPDwgMykKKworLyoKKyAqIFI2ICgweDA2KSAtIEF1ZGlvIEludGVyZmFjZSAoMikKKyAqLworI2RlZmluZSBXTTg0MDBfREFDTF9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEQUNMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDTF9TUkNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEQUNMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDTF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBEQUNMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDTF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNMX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDUl9TUkMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEQUNSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDUl9TUkNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEQUNSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDUl9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBEQUNSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfREFDUl9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNSX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQUlGREFDX1RETSAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZEQUNfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNX01BU0sgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRkRBQ19URE0gKi8KKyNkZWZpbmUgV004NDAwX0FJRkRBQ19URE1fU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGREFDX1RETSAqLworI2RlZmluZSBXTTg0MDBfQUlGREFDX1RETV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZEQUNfVERNICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNX0NIQU4gICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRkRBQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfQUlGREFDX1RETV9DSEFOX01BU0sgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUZEQUNfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004NDAwX0FJRkRBQ19URE1fQ0hBTl9TSElGVCAgICAgICAgICAgICAgICAxMiAgLyogQUlGREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODQwMF9BSUZEQUNfVERNX0NIQU5fV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFJRkRBQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg0MDBfREFDX0JPT1NUX01BU0sgICAgICAgICAgICAgICAgICAgMHgwQzAwICAvKiBEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODQwMF9EQUNfQk9PU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIERBQ19CT09TVCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ19CT09TVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogREFDX0JPT1NUIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQUNfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQUNfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEQUNfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBNT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19DT01QTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ09NUE1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDMgIC8qIERBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREFDX0NPTVBNT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODQwMF9BRENfQ09NUE1PREVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg0MDBfQURDX0NPTVBNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODQwMF9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExPT1BCQUNLICovCisjZGVmaW5lIFdNODQwMF9MT09QQkFDS19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExPT1BCQUNLICovCisjZGVmaW5lIFdNODQwMF9MT09QQkFDS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExPT1BCQUNLICovCisjZGVmaW5lIFdNODQwMF9MT09QQkFDS19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPT1BCQUNLICovCisKKy8qCisgKiBSNyAoMHgwNykgLSBDbG9ja2luZyAoMSkKKyAqLworI2RlZmluZSBXTTg0MDBfVE9DTEtfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBUT0NMS19SQVRFICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19SQVRFX01BU0sgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFRPQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX1RPQ0xLX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNSAgLyogVE9DTEtfUkFURSAqLworI2RlZmluZSBXTTg0MDBfVE9DTEtfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBUT0NMS19SQVRFICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfVE9DTEtfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBUT0NMS19FTkEgKi8KKyNkZWZpbmUgV004NDAwX1RPQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogVE9DTEtfRU5BICovCisjZGVmaW5lIFdNODQwMF9UT0NMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg0MDBfT1BDTEtESVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxRTAwICAvKiBPUENMS0RJViAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg0MDBfT1BDTEtESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPUENMS0RJViAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg0MDBfT1BDTEtESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBPUENMS0RJViAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg0MDBfRENMS0RJVl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMUMwICAvKiBEQ0xLRElWIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0RDTEtESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogRENMS0RJViAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9EQ0xLRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERDTEtESVYgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfQkNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFFICAvKiBCQ0xLX0RJViAtIFs0OjFdICovCisjZGVmaW5lIFdNODQwMF9CQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJDTEtfRElWIC0gWzQ6MV0gKi8KKyNkZWZpbmUgV004NDAwX0JDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQkNMS19ESVYgLSBbNDoxXSAqLworCisvKgorICogUjggKDB4MDgpIC0gQ2xvY2tpbmcgKDIpCisgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfU1JDICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTUNMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTUNMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogTUNMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUNMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX1NZU0NMS19TUkMgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogU1lTQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfU1lTQ0xLX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBTWVNDTEtfU1JDICovCisjZGVmaW5lIFdNODQwMF9TWVNDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIFNZU0NMS19TUkMgKi8KKyNkZWZpbmUgV004NDAwX1NZU0NMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1lTQ0xLX1NSQyAqLworI2RlZmluZSBXTTg0MDBfQ0xLX0ZPUkNFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBDTEtfRk9SQ0UgKi8KKyNkZWZpbmUgV004NDAwX0NMS19GT1JDRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQ0xLX0ZPUkNFICovCisjZGVmaW5lIFdNODQwMF9DTEtfRk9SQ0VfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIENMS19GT1JDRSAqLworI2RlZmluZSBXTTg0MDBfQ0xLX0ZPUkNFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDTEtfRk9SQ0UgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfRElWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MTgwMCAgLyogTUNMS19ESVYgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNODQwMF9NQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIE1DTEtfRElWIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTg0MDBfTUNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNQ0xLX0RJViAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV004NDAwX01DTEtfSU5WICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfSU5WX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogTUNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX01DTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUNMS19JTlYgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19DTEtESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDBFMCAgLyogQURDX0NMS0RJViAtIFs3OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENfQ0xLRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFEQ19DTEtESVYgLSBbNzo1XSAqLworI2RlZmluZSBXTTg0MDBfQURDX0NMS0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBRENfQ0xLRElWIC0gWzc6NV0gKi8KKyNkZWZpbmUgV004NDAwX0RBQ19DTEtESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxQyAgLyogREFDX0NMS0RJViAtIFs0OjJdICovCisjZGVmaW5lIFdNODQwMF9EQUNfQ0xLRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERBQ19DTEtESVYgLSBbNDoyXSAqLworI2RlZmluZSBXTTg0MDBfREFDX0NMS0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQUNfQ0xLRElWIC0gWzQ6Ml0gKi8KKworLyoKKyAqIFI5ICgweDA5KSAtIEF1ZGlvIEludGVyZmFjZSAoMykKKyAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIxICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBSUZfTVNUUjEgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9NU1RSMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQUlGX01TVFIxICovCisjZGVmaW5lIFdNODQwMF9BSUZfTVNUUjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIEFJRl9NU1RSMSAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIxX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfTVNUUjEgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9NU1RSMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQUlGX01TVFIyICovCisjZGVmaW5lIFdNODQwMF9BSUZfTVNUUjJfTUFTSyAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEFJRl9NU1RSMiAqLworI2RlZmluZSBXTTg0MDBfQUlGX01TVFIyX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBBSUZfTVNUUjIgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9NU1RSMl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGX01TVFIyICovCisjZGVmaW5lIFdNODQwMF9BSUZfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRl9TRUwgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQUlGX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUZfU0VMICovCisjZGVmaW5lIFdNODQwMF9BSUZfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9TRUwgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xSQ19ESVIgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQURDTFJDX0RJUiAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX0RJUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBRENMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9BRENMUkNfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIEFEQ0xSQ19ESVIgKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xSQ19ESVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDTFJDX0RJUiAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0ZGICAvKiBBRENMUkNfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENMUkNfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg0MDBfQURDTFJDX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgIDExICAvKiBBRENMUkNfUkFURSAtIFsxMDowXSAqLworCisvKgorICogUjEwICgweDBBKSAtIEF1ZGlvIEludGVyZmFjZSAoNCkKKyAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0dQSU8xICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBBTFJDR1BJTzEgKi8KKyNkZWZpbmUgV004NDAwX0FMUkNHUElPMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQUxSQ0dQSU8xICovCisjZGVmaW5lIFdNODQwMF9BTFJDR1BJTzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIEFMUkNHUElPMSAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0dQSU8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBTFJDR1BJTzEgKi8KKyNkZWZpbmUgV004NDAwX0FMUkNCR1BJTzYgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQUxSQ0JHUElPNiAqLworI2RlZmluZSBXTTg0MDBfQUxSQ0JHUElPNl9NQVNLICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBBTFJDQkdQSU82ICovCisjZGVmaW5lIFdNODQwMF9BTFJDQkdQSU82X1NISUZUICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIEFMUkNCR1BJTzYgKi8KKyNkZWZpbmUgV004NDAwX0FMUkNCR1BJTzZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUxSQ0JHUElPNiAqLworI2RlZmluZSBXTTg0MDBfQUlGX1RSSVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZfVFJJUyAqLworI2RlZmluZSBXTTg0MDBfQUlGX1RSSVNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZfVFJJUyAqLworI2RlZmluZSBXTTg0MDBfQUlGX1RSSVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUZfVFJJUyAqLworI2RlZmluZSBXTTg0MDBfQUlGX1RSSVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfVFJJUyAqLworI2RlZmluZSBXTTg0MDBfREFDTFJDX0RJUiAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBEQUNMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfRElSX01BU0sgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIERBQ0xSQ19ESVIgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xSQ19ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMSAgLyogREFDTFJDX0RJUiAqLworI2RlZmluZSBXTTg0MDBfREFDTFJDX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNMUkNfRElSICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDA3RkYgIC8qIERBQ0xSQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ0xSQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNMUkNfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgMTEgIC8qIERBQ0xSQ19SQVRFIC0gWzEwOjBdICovCisKKy8qCisgKiBSMTEgKDB4MEIpIC0gREFDIENUUkwKKyAqLworI2RlZmluZSBXTTg0MDBfREFDX1NETUNMS19SQVRFICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQUNfU0RNQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19TRE1DTEtfUkFURV9NQVNLICAgICAgICAgICAgIDB4MjAwMCAgLyogREFDX1NETUNMS19SQVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfU0RNQ0xLX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgMTMgIC8qIERBQ19TRE1DTEtfUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX1NETUNMS19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBEQUNfU0RNQ0xLX1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS1JBVEUgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQUlGX0xSQ0xLUkFURSAqLworI2RlZmluZSBXTTg0MDBfQUlGX0xSQ0xLUkFURV9NQVNLICAgICAgICAgICAgICAgMHgwNDAwICAvKiBBSUZfTFJDTEtSQVRFICovCisjZGVmaW5lIFdNODQwMF9BSUZfTFJDTEtSQVRFX1NISUZUICAgICAgICAgICAgICAgICAgMTAgIC8qIEFJRl9MUkNMS1JBVEUgKi8KKyNkZWZpbmUgV004NDAwX0FJRl9MUkNMS1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGX0xSQ0xLUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBEQUNfTU9OTyAqLworI2RlZmluZSBXTTg0MDBfREFDX01PTk9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBEQUNfTU9OTyAqLworI2RlZmluZSBXTTg0MDBfREFDX01PTk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBEQUNfTU9OTyAqLworI2RlZmluZSBXTTg0MDBfREFDX01PTk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfTU9OTyAqLworI2RlZmluZSBXTTg0MDBfREFDX1NCX0ZJTFQgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfU0JfRklMVCAqLworI2RlZmluZSBXTTg0MDBfREFDX1NCX0ZJTFRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfU0JfRklMVCAqLworI2RlZmluZSBXTTg0MDBfREFDX1NCX0ZJTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQUNfU0JfRklMVCAqLworI2RlZmluZSBXTTg0MDBfREFDX1NCX0ZJTFRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfU0JfRklMVCAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVSQVRFICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQUNfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFUkFURV9NQVNLICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURVJBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDcgIC8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVSQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogREFDX01VVEVNT0RFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURU1PREVfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAgIC8qIERBQ19NVVRFTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREFDX01VVEVNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICA2ICAvKiBEQUNfTVVURU1PREUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19NVVRFTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDX01VVEVNT0RFICovCisjZGVmaW5lIFdNODQwMF9ERUVNUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAgIC8qIERFRU1QIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004NDAwX0RFRU1QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogREVFTVAgLSBbNTo0XSAqLworI2RlZmluZSBXTTg0MDBfREVFTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBERUVNUCAtIFs1OjRdICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19NVVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19NVVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERBQ19NVVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19NVVRFICovCisjZGVmaW5lIFdNODQwMF9EQUNMX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNMX0RBVElOVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNMX0RBVElOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNMX0RBVElOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNSX0RBVElOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERBQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNSX0RBVElOVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERBQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNSX0RBVElOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERBQ1JfREFUSU5WICovCisjZGVmaW5lIFdNODQwMF9EQUNSX0RBVElOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JfREFUSU5WICovCisKKy8qCisgKiBSMTIgKDB4MEMpIC0gTGVmdCBEQUMgRGlnaXRhbCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDX1ZVICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ0xfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogREFDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfREFDTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ0xfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMyAoMHgwRCkgLSBSaWdodCBEQUMgRGlnaXRhbCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDX1ZVICovCisjZGVmaW5lIFdNODQwMF9EQUNfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ19WVSAqLworI2RlZmluZSBXTTg0MDBfREFDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfVlUgKi8KKyNkZWZpbmUgV004NDAwX0RBQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogREFDUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfREFDUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9EQUNSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxNCAoMHgwRSkgLSBEaWdpdGFsIFNpZGUgVG9uZQorICovCisjZGVmaW5lIFdNODQwMF9BRENMX0RBQ19TVk9MX01BU0sgICAgICAgICAgICAgICAweDFFMDAgIC8qICAgQURDTF9EQUNfU1ZPTCAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQUNfU1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICA5ICAvKiAgIEFEQ0xfREFDX1NWT0wgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfREFDX1NWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogICBBRENMX0RBQ19TVk9MIC0gWzEyOjldICovCisjZGVmaW5lIFdNODQwMF9BRENSX0RBQ19TVk9MX01BU0sgICAgICAgICAgICAgICAweDAxRTAgIC8qIEFEQ1JfREFDX1NWT0wgLSBbODo1XSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQUNfU1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICA1ICAvKiBBRENSX0RBQ19TVk9MIC0gWzg6NV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfREFDX1NWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogQURDUl9EQUNfU1ZPTCAtIFs4OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENfVE9fREFDTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIEFEQ19UT19EQUNMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19UT19EQUNMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogQURDX1RPX0RBQ0wgLSBbMzoyXSAqLworI2RlZmluZSBXTTg0MDBfQURDX1RPX0RBQ0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfVE9fREFDTCAtIFszOjJdICovCisjZGVmaW5lIFdNODQwMF9BRENfVE9fREFDUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFEQ19UT19EQUNSIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19UT19EQUNSX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQURDX1RPX0RBQ1IgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfQURDX1RPX0RBQ1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfVE9fREFDUiAtIFsxOjBdICovCisKKy8qCisgKiBSMTUgKDB4MEYpIC0gQURDIENUUkwKKyAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQURDX0hQRl9DVVRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBBRENfSFBGX0NVVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODQwMF9BRENfSFBGX0NVVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFEQ19IUEZfQ1VUIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ19IUEZfQ1VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogQURDX0hQRl9DVVQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQVRJTlZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQVRJTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDTF9EQVRJTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQVRJTlZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQVRJTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg0MDBfQURDUl9EQVRJTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENSX0RBVElOViAqLworCisvKgorICogUjE2ICgweDEwKSAtIExlZnQgQURDIERpZ2l0YWwgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFEQ19WVSAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIEFEQ0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ0xfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQURDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfQURDTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTcgKDB4MTEpIC0gUmlnaHQgQURDIERpZ2l0YWwgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFEQ19WVSAqLworI2RlZmluZSBXTTg0MDBfQURDX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENfVlUgKi8KKyNkZWZpbmUgV004NDAwX0FEQ19WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX1ZVICovCisjZGVmaW5lIFdNODQwMF9BRENSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIEFEQ1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0FEQ1JfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQURDUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfQURDUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMjQgKDB4MTgpIC0gTGVmdCBMaW5lIElucHV0IDEmMiBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfSVBWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9MSTEyTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTEyTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTEyTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTEyTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9MSTEyWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfTEkxMlpDX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSTEyWkMgKi8KKyNkZWZpbmUgV004NDAwX0xJMTJaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTEkxMlpDICovCisjZGVmaW5lIFdNODQwMF9MSTEyWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfTElOMTJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBMSU4xMlZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MSU4xMlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExJTjEyVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTjEyVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTElOMTJWT0wgLSBbNDowXSAqLworCisvKgorICogUjI1ICgweDE5KSAtIExlZnQgTGluZSBJbnB1dCAzJjQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX0lQVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfTEkzNE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfTEkzNE1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfTEkzNE1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBMSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfTEkzNE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSTM0TVVURSAqLworI2RlZmluZSBXTTg0MDBfTEkzNFpDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX0xJMzRaQ19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTEkzNFpDICovCisjZGVmaW5lIFdNODQwMF9MSTM0WkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExJMzRaQyAqLworI2RlZmluZSBXTTg0MDBfTEkzNFpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX0xJTjM0Vk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogTElOMzRWT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTElOMzRWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSU4zNFZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MSU4zNFZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExJTjM0Vk9MIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyNiAoMHgxQSkgLSBSaWdodCBMaW5lIElucHV0IDEmMiBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfSVBWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9SSTEyTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9SSTEyTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9SSTEyTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9SSTEyTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJMTJNVVRFICovCisjZGVmaW5lIFdNODQwMF9SSTEyWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfUkkxMlpDX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBSSTEyWkMgKi8KKyNkZWZpbmUgV004NDAwX1JJMTJaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogUkkxMlpDICovCisjZGVmaW5lIFdNODQwMF9SSTEyWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJMTJaQyAqLworI2RlZmluZSBXTTg0MDBfUklOMTJWT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBSSU4xMlZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9SSU4xMlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJJTjEyVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JJTjEyVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUklOMTJWT0wgLSBbNDowXSAqLworCisvKgorICogUjI3ICgweDFCKSAtIFJpZ2h0IExpbmUgSW5wdXQgMyY0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9JUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX0lQVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSVBWVSAqLworI2RlZmluZSBXTTg0MDBfSVBWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJUFZVICovCisjZGVmaW5lIFdNODQwMF9JUFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElQVlUgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkkzNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUkkzNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUkkzNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkkzNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRaQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUkkzNFpDICovCisjZGVmaW5lIFdNODQwMF9SSTM0WkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJJMzRaQyAqLworI2RlZmluZSBXTTg0MDBfUkkzNFpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBSSTM0WkMgKi8KKyNkZWZpbmUgV004NDAwX1JJMzRaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkkzNFpDICovCisjZGVmaW5lIFdNODQwMF9SSU4zNFZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIFJJTjM0Vk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JJTjM0Vk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUklOMzRWT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfUklOMzRWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSSU4zNFZPTCAtIFs0OjBdICovCisKKy8qCisgKiBSMjggKDB4MUMpIC0gTGVmdCBPdXRwdXQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX09QVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfTE9aQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1pDICovCisjZGVmaW5lIFdNODQwMF9MT1pDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9aQyAqLworI2RlZmluZSBXTTg0MDBfTE9aQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1pDICovCisjZGVmaW5lIFdNODQwMF9MT1VUVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIExPVVRWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfTE9VVFZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMT1VUVk9MIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xPVVRWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9VVFZPTCAtIFs2OjBdICovCisKKy8qCisgKiBSMjkgKDB4MUQpIC0gUmlnaHQgT3V0cHV0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9PUFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX1JPWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUk9aQyAqLworI2RlZmluZSBXTTg0MDBfUk9aQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBST1pDICovCisjZGVmaW5lIFdNODQwMF9ST1pDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJPWkMgKi8KKyNkZWZpbmUgV004NDAwX1JPWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9aQyAqLworI2RlZmluZSBXTTg0MDBfUk9VVFZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBST1VUVk9MIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JPVVRWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUk9VVFZPTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9ST1VUVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJPVVRWT0wgLSBbNjowXSAqLworCisvKgorICogUjMwICgweDFFKSAtIExpbmUgT3V0cHV0cyBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfTE9OTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMT05NVVRFICovCisjZGVmaW5lIFdNODQwMF9MT05NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPTk1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE9OTVVURSAqLworI2RlZmluZSBXTTg0MDBfTE9OTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT05NVVRFICovCisjZGVmaW5lIFdNODQwMF9MT1BNVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExPUE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPUE1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTE9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfTE9QTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMT1BNVVRFICovCisjZGVmaW5lIFdNODQwMF9MT1BNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExPUE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPQVRUTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE9BVFROICovCisjZGVmaW5lIFdNODQwMF9MT0FUVE5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExPQVRUTiAqLworI2RlZmluZSBXTTg0MDBfTE9BVFROX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMT0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX0xPQVRUTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9BVFROICovCisjZGVmaW5lIFdNODQwMF9ST05NVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFJPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JPTk1VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk9OTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9OTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBST05NVVRFICovCisjZGVmaW5lIFdNODQwMF9ST05NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPTk1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JPUE1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUk9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9QTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBST1BNVVRFICovCisjZGVmaW5lIFdNODQwMF9ST1BNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPUE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX1JPUE1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QTVVURSAqLworI2RlZmluZSBXTTg0MDBfUk9BVFROICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBST0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX1JPQVRUTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUk9BVFROICovCisjZGVmaW5lIFdNODQwMF9ST0FUVE5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJPQVRUTiAqLworI2RlZmluZSBXTTg0MDBfUk9BVFROX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST0FUVE4gKi8KKworLyoKKyAqIFIzMSAoMHgxRikgLSBPdXQzLzQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX09VVDNNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDNNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDNNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDNNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM01VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDNBVFROICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogT1VUM0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDNBVFROX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogT1VUM0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDNBVFROX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogT1VUM0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDNBVFROX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0FUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDRNVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogT1VUNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDRNVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogT1VUNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDRNVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDRNVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNE1VVEUgKi8KKyNkZWZpbmUgV004NDAwX09VVDRBVFROICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogT1VUNEFUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDRBVFROX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogT1VUNEFUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDRBVFROX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNEFUVE4gKi8KKyNkZWZpbmUgV004NDAwX09VVDRBVFROX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNEFUVE4gKi8KKworLyoKKyAqIFIzMiAoMHgyMCkgLSBMZWZ0IE9QR0EgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004NDAwX09QVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FaQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMT1BHQVpDICovCisjZGVmaW5lIFdNODQwMF9MT1BHQVpDX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTE9QR0FaQyAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1BHQVpDICovCisjZGVmaW5lIFdNODQwMF9MT1BHQVZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIExPUEdBVk9MIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTE9QR0FWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfTE9QR0FWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBMT1BHQVZPTCAtIFs2OjBdICovCisKKy8qCisgKiBSMzMgKDB4MjEpIC0gUmlnaHQgT1BHQSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg0MDBfT1BWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9PUFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9QVlUgKi8KKyNkZWZpbmUgV004NDAwX09QVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1BWVSAqLworI2RlZmluZSBXTTg0MDBfT1BWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPUFZVICovCisjZGVmaW5lIFdNODQwMF9ST1BHQVpDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogUk9QR0FaQyAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBST1BHQVpDICovCisjZGVmaW5lIFdNODQwMF9ST1BHQVpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJPUEdBWkMgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogUk9QR0FWT0wgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfUk9QR0FWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBST1BHQVZPTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9ST1BHQVZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJPUEdBVk9MIC0gWzY6MF0gKi8KKworLyoKKyAqIFIzNCAoMHgyMikgLSBTcGVha2VyIFZvbHVtZQorICovCisjZGVmaW5lIFdNODQwMF9TUEtBVFROX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIFNQS0FUVE4gLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfU1BLQVRUTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBTUEtBVFROIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NDAwX1NQS0FUVE5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogU1BLQVRUTiAtIFsxOjBdICovCisKKy8qCisgKiBSMzUgKDB4MjMpIC0gQ2xhc3NEMQorICovCisjZGVmaW5lIFdNODQwMF9DRE1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENETU9ERSAqLworI2RlZmluZSBXTTg0MDBfQ0RNT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBDRE1PREUgKi8KKyNkZWZpbmUgV004NDAwX0NETU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQ0RNT0RFICovCisjZGVmaW5lIFdNODQwMF9DRE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENETU9ERSAqLworI2RlZmluZSBXTTg0MDBfQ0xBU1NEX0NMS19TRUwgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBDTEFTU0RfQ0xLX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQ0xBU1NEX0NMS19TRUxfTUFTSyAgICAgICAgICAgICAgMHgwMDgwICAvKiBDTEFTU0RfQ0xLX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQ0xBU1NEX0NMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICA3ICAvKiBDTEFTU0RfQ0xLX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQ0xBU1NEX0NMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBDTEFTU0RfQ0xLX1NFTCAqLworI2RlZmluZSBXTTg0MDBfQ0RfU1JDVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBDRF9TUkNUUkwgKi8KKyNkZWZpbmUgV004NDAwX0NEX1NSQ1RSTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQ0RfU1JDVFJMICovCisjZGVmaW5lIFdNODQwMF9DRF9TUkNUUkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIENEX1NSQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfQ0RfU1JDVFJMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDRF9TUkNUUkwgKi8KKyNkZWZpbmUgV004NDAwX1NQS05PUE9QICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogU1BLTk9QT1AgKi8KKyNkZWZpbmUgV004NDAwX1NQS05PUE9QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogU1BLTk9QT1AgKi8KKyNkZWZpbmUgV004NDAwX1NQS05PUE9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogU1BLTk9QT1AgKi8KKyNkZWZpbmUgV004NDAwX1NQS05PUE9QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLTk9QT1AgKi8KKyNkZWZpbmUgV004NDAwX0RCTEVSQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogREJMRVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RCTEVSQVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogREJMRVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RCTEVSQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogREJMRVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0RCTEVSQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREJMRVJBVEUgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BURVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTE9PUFRFU1QgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BURVNUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTE9PUFRFU1QgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BURVNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTE9PUFRFU1QgKi8KKyNkZWZpbmUgV004NDAwX0xPT1BURVNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9PUFRFU1QgKi8KKyNkZWZpbmUgV004NDAwX0hBTEZBQkJJQVMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSEFMRkFCQklBUyAqLworI2RlZmluZSBXTTg0MDBfSEFMRkFCQklBU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBIQUxGQUJCSUFTICovCisjZGVmaW5lIFdNODQwMF9IQUxGQUJCSUFTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEhBTEZBQkJJQVMgKi8KKyNkZWZpbmUgV004NDAwX0hBTEZBQkJJQVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogSEFMRkFCQklBUyAqLworI2RlZmluZSBXTTg0MDBfVFJJREVMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBUUklERUwgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfVFJJREVMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBUUklERUwgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfVFJJREVMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBUUklERUwgLSBbMTowXSAqLworCisvKgorICogUjM3ICgweDI1KSAtIENsYXNzRDMKKyAqLworI2RlZmluZSBXTTg0MDBfRENHQUlOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBEQ0dBSU4gLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfRENHQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQ0dBSU4gLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfRENHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQ0dBSU4gLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfQUNHQUlOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBQ0dBSU4gLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfQUNHQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBQ0dBSU4gLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfQUNHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBQ0dBSU4gLSBbMjowXSAqLworCisvKgorICogUjM5ICgweDI3KSAtIElucHV0IE1peGVyMQorICovCisjZGVmaW5lIFdNODQwMF9BSU5MTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIEFJTkxNT0RFIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NDAwX0FJTkxNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlOTE1PREUgLSBbMzoyXSAqLworI2RlZmluZSBXTTg0MDBfQUlOTE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSU5MTU9ERSAtIFszOjJdICovCisjZGVmaW5lIFdNODQwMF9BSU5STU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFJTlJNT0RFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NDAwX0FJTlJNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlOUk1PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg0MDBfQUlOUk1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSU5STU9ERSAtIFsxOjBdICovCisKKy8qCisgKiBSNDAgKDB4MjgpIC0gSW5wdXQgTWl4ZXIyCisgKi8KKyNkZWZpbmUgV004NDAwX0xNUDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTE1QNCAqLworI2RlZmluZSBXTTg0MDBfTE1QNF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMTVA0ICovCisjZGVmaW5lIFdNODQwMF9MTVA0X1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExNUDQgKi8KKyNkZWZpbmUgV004NDAwX0xNUDRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1QNCAqLworI2RlZmluZSBXTTg0MDBfTE1OMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMTU4zICovCisjZGVmaW5lIFdNODQwMF9MTU4zX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExNTjMgKi8KKyNkZWZpbmUgV004NDAwX0xNTjNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTE1OMyAqLworI2RlZmluZSBXTTg0MDBfTE1OM19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTU4zICovCisjZGVmaW5lIFdNODQwMF9MTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExNUDIgKi8KKyNkZWZpbmUgV004NDAwX0xNUDJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTE1QMiAqLworI2RlZmluZSBXTTg0MDBfTE1QMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMTVAyICovCisjZGVmaW5lIFdNODQwMF9MTVAyX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExNUDIgKi8KKyNkZWZpbmUgV004NDAwX0xNTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE1OMSAqLworI2RlZmluZSBXTTg0MDBfTE1OMV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMTU4xICovCisjZGVmaW5lIFdNODQwMF9MTU4xX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExNTjEgKi8KKyNkZWZpbmUgV004NDAwX0xNTjFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1OMSAqLworI2RlZmluZSBXTTg0MDBfUk1QNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBSTVA0ICovCisjZGVmaW5lIFdNODQwMF9STVA0X01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFJNUDQgKi8KKyNkZWZpbmUgV004NDAwX1JNUDRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUk1QNCAqLworI2RlZmluZSBXTTg0MDBfUk1QNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTVA0ICovCisjZGVmaW5lIFdNODQwMF9STU4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFJNTjMgKi8KKyNkZWZpbmUgV004NDAwX1JNTjNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk1OMyAqLworI2RlZmluZSBXTTg0MDBfUk1OM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBSTU4zICovCisjZGVmaW5lIFdNODQwMF9STU4zX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNTjMgKi8KKyNkZWZpbmUgV004NDAwX1JNUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUk1QMiAqLworI2RlZmluZSBXTTg0MDBfUk1QMl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSTVAyICovCisjZGVmaW5lIFdNODQwMF9STVAyX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNUDIgKi8KKyNkZWZpbmUgV004NDAwX1JNUDJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk1QMiAqLworI2RlZmluZSBXTTg0MDBfUk1OMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSTU4xICovCisjZGVmaW5lIFdNODQwMF9STU4xX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJNTjEgKi8KKyNkZWZpbmUgV004NDAwX1JNTjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUk1OMSAqLworI2RlZmluZSBXTTg0MDBfUk1OMV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTU4xICovCisKKy8qCisgKiBSNDEgKDB4MjkpIC0gSW5wdXQgTWl4ZXIzCisgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTDM0TU5CICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEwzNE1OQiAqLworI2RlZmluZSBXTTg0MDBfTDM0TU5CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBMMzRNTkIgKi8KKyNkZWZpbmUgV004NDAwX0wzNE1OQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTDM0TU5CICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEwzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJTVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEwzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEwzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMzRNTkJTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEwzNE1OQlNUICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEwxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMMTJNTkIgKi8KKyNkZWZpbmUgV004NDAwX0wxMk1OQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTDEyTU5CICovCisjZGVmaW5lIFdNODQwMF9MMTJNTkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEwxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfTDEyTU5CU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMMTJNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfTERCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBMREJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfTERCVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMREJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfTERCVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMREJWT0wgLSBbMjowXSAqLworCisvKgorICogUjQyICgweDJBKSAtIElucHV0IE1peGVyNAorICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFIzNE1OQiAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBSMzRNTkIgKi8KKyNkZWZpbmUgV004NDAwX1IzNE1OQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogUjM0TU5CICovCisjZGVmaW5lIFdNODQwMF9SMzRNTkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFIzNE1OQiAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBSMzRNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBSMzRNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBSMzRNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjM0TU5CU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSMzRNTkJTVCAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSMTJNTkIgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUjEyTU5CICovCisjZGVmaW5lIFdNODQwMF9SMTJNTkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFIxMk1OQiAqLworI2RlZmluZSBXTTg0MDBfUjEyTU5CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSMTJNTkIgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQlNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUjEyTU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQlNUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUjEyTU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQlNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUjEyTU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX1IxMk1OQlNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUjEyTU5CU1QgKi8KKyNkZWZpbmUgV004NDAwX1JEQlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogUkRCVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JEQlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUkRCVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JEQlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkRCVk9MIC0gWzI6MF0gKi8KKworLyoKKyAqIFI0MyAoMHgyQikgLSBJbnB1dCBNaXhlcjUKKyAqLworI2RlZmluZSBXTTg0MDBfTEkyQlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMUMwICAvKiBMSTJCVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX0xJMkJWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTEkyQlZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MSTJCVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExJMkJWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfTFI0QlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBMUjRCVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xSNEJWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFI0QlZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MUjRCVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSNEJWT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfTEw0QlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBMTDRCVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xMNEJWT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEw0QlZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MTDRCVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExMNEJWT0wgLSBbMjowXSAqLworCisvKgorICogUjQ0ICgweDJDKSAtIElucHV0IE1peGVyNgorICovCisjZGVmaW5lIFdNODQwMF9SSTJCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIFJJMkJWT0wgLSBbODo2XSAqLworI2RlZmluZSBXTTg0MDBfUkkyQlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBSSTJCVk9MIC0gWzg6Nl0gKi8KKyNkZWZpbmUgV004NDAwX1JJMkJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkkyQlZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9STDRCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIFJMNEJWT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfUkw0QlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTDRCVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JMNEJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkw0QlZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9SUjRCVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIFJSNEJWT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUlI0QlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSUjRCVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JSNEJWT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUlI0QlZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDUgKDB4MkQpIC0gT3V0cHV0IE1peGVyMQorICovCisjZGVmaW5lIFdNODQwMF9MUkJMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExSQkxPICovCisjZGVmaW5lIFdNODQwMF9MUkJMT19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExSQkxPICovCisjZGVmaW5lIFdNODQwMF9MUkJMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExSQkxPICovCisjZGVmaW5lIFdNODQwMF9MUkJMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExSQkxPICovCisjZGVmaW5lIFdNODQwMF9MTEJMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExMQkxPICovCisjZGVmaW5lIFdNODQwMF9MTEJMT19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExMQkxPICovCisjZGVmaW5lIFdNODQwMF9MTEJMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExMQkxPICovCisjZGVmaW5lIFdNODQwMF9MTEJMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExMQkxPICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExSSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTFJJM0xPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMUkkzTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSSTNMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTFJJM0xPICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExSSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTExJM0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMTEkzTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMSTNMT19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTExJM0xPICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExMSTNMTyAqLworI2RlZmluZSBXTTg0MDBfTExJM0xPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTEkzTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTFIxMkxPICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIExSMTJMTyAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMUjEyTE8gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFIxMkxPICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExMMTJMTyAqLworI2RlZmluZSBXTTg0MDBfTEwxMkxPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMTDEyTE8gKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTEwxMkxPICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExMMTJMTyAqLworI2RlZmluZSBXTTg0MDBfTERMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMRExPICovCisjZGVmaW5lIFdNODQwMF9MRExPX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExETE8gKi8KKyNkZWZpbmUgV004NDAwX0xETE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERMTyAqLworI2RlZmluZSBXTTg0MDBfTERMT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRExPICovCisKKy8qCisgKiBSNDYgKDB4MkUpIC0gT3V0cHV0IE1peGVyMgorICovCisjZGVmaW5lIFdNODQwMF9STEJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJMQlJPICovCisjZGVmaW5lIFdNODQwMF9STEJST19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJMQlJPICovCisjZGVmaW5lIFdNODQwMF9STEJST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFJMQlJPICovCisjZGVmaW5lIFdNODQwMF9STEJST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJMQlJPICovCisjZGVmaW5lIFdNODQwMF9SUkJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJSQlJPICovCisjZGVmaW5lIFdNODQwMF9SUkJST19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJSQlJPICovCisjZGVmaW5lIFdNODQwMF9SUkJST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJSQlJPICovCisjZGVmaW5lIFdNODQwMF9SUkJST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJSQlJPICovCisjZGVmaW5lIFdNODQwMF9STEkzUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJMSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUkxJM1JPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSTEkzUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMSTNST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUkxJM1JPICovCisjZGVmaW5lIFdNODQwMF9STEkzUk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJMSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUlJJM1JPICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSUkkzUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSSTNST19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUlJJM1JPICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFJSSTNSTyAqLworI2RlZmluZSBXTTg0MDBfUlJJM1JPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSUkkzUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUkwxMlJPICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFJMMTJSTyAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTDEyUk8gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkwxMlJPICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIFJSMTJSTyAqLworI2RlZmluZSBXTTg0MDBfUlIxMlJPX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBSUjEyUk8gKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUlIxMlJPICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJSMTJSTyAqLworI2RlZmluZSBXTTg0MDBfUkRSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSRFJPICovCisjZGVmaW5lIFdNODQwMF9SRFJPX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJEUk8gKi8KKyNkZWZpbmUgV004NDAwX1JEUk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUkRSTyAqLworI2RlZmluZSBXTTg0MDBfUkRST19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRFJPICovCisKKy8qCisgKiBSNDcgKDB4MkYpIC0gT3V0cHV0IE1peGVyMworICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIExMSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExMSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MTEkzTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExMSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIExSMTJMT1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSMTJMT1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSMTJMT1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIExMMTJMT1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExMMTJMT1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExMMTJMT1ZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDggKDB4MzApIC0gT3V0cHV0IE1peGVyNAorICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIFJSSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJSSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9SUkkzUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJSSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIFJMMTJST1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMMTJST1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMMTJST1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIFJSMTJST1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJSMTJST1ZPTCAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJSMTJST1ZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNDkgKDB4MzEpIC0gT3V0cHV0IE1peGVyNQorICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIExSSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExSSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MUkkzTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExSSTNMT1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9MUkJMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIExSQkxPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX0xSQkxPVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTFJCTE9WT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfTFJCTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMUkJMT1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9MTEJMT1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIExMQkxPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xMQkxPVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTExCTE9WT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfTExCTE9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBMTEJMT1ZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNTAgKDB4MzIpIC0gT3V0cHV0IE1peGVyNgorICovCisjZGVmaW5lIFdNODQwMF9STEkzUk9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxQzAgIC8qIFJMSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9STEkzUk9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFJMSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9STEkzUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFJMSTNST1ZPTCAtIFs4OjZdICovCisjZGVmaW5lIFdNODQwMF9STEJST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIFJMQlJPVk9MIC0gWzU6M10gKi8KKyNkZWZpbmUgV004NDAwX1JMQlJPVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogUkxCUk9WT0wgLSBbNTozXSAqLworI2RlZmluZSBXTTg0MDBfUkxCUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTEJST1ZPTCAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9SUkJST1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIFJSQlJPVk9MIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004NDAwX1JSQlJPVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlJCUk9WT0wgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfUlJCUk9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSUkJST1ZPTCAtIFsyOjBdICovCisKKy8qCisgKiBSNTEgKDB4MzMpIC0gT3V0My80IE1peGVyCisgKi8KKyNkZWZpbmUgV004NDAwX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MCAgLyogVlNFTCAtIFs4OjddICovCisjZGVmaW5lIFdNODQwMF9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFZTRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg0MDBfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBWU0VMIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NDAwX0xJNE8zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTEk0TzMgKi8KKyNkZWZpbmUgV004NDAwX0xJNE8zX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTEk0TzMgKi8KKyNkZWZpbmUgV004NDAwX0xJNE8zX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTEk0TzMgKi8KKyNkZWZpbmUgV004NDAwX0xJNE8zX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEk0TzMgKi8KKyNkZWZpbmUgV004NDAwX0xQR0FPMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTFBHQU8zICovCisjZGVmaW5lIFdNODQwMF9MUEdBTzNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExQR0FPMyAqLworI2RlZmluZSBXTTg0MDBfTFBHQU8zX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMUEdBTzMgKi8KKyNkZWZpbmUgV004NDAwX0xQR0FPM19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFBHQU8zICovCisjZGVmaW5lIFdNODQwMF9SSTRPNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJJNE80ICovCisjZGVmaW5lIFdNODQwMF9SSTRPNF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJJNE80ICovCisjZGVmaW5lIFdNODQwMF9SSTRPNF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJNE80ICovCisjZGVmaW5lIFdNODQwMF9SSTRPNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJJNE80ICovCisjZGVmaW5lIFdNODQwMF9SUEdBTzQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJQR0FPNCAqLworI2RlZmluZSBXTTg0MDBfUlBHQU80X01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSUEdBTzQgKi8KKyNkZWZpbmUgV004NDAwX1JQR0FPNF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlBHQU80ICovCisjZGVmaW5lIFdNODQwMF9SUEdBTzRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJQR0FPNCAqLworCisvKgorICogUjUyICgweDM0KSAtIExpbmUgTWl4ZXIxCisgKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTExPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MTE9QR0FMT05fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExMT1BHQUxPTiAqLworI2RlZmluZSBXTTg0MDBfTExPUEdBTE9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBMTE9QR0FMT04gKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTExPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MUk9QR0FMT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExST1BHQUxPTiAqLworI2RlZmluZSBXTTg0MDBfTFJPUEdBTE9OX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMUk9QR0FMT04gKi8KKyNkZWZpbmUgV004NDAwX0xST1BHQUxPTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTFJPUEdBTE9OICovCisjZGVmaW5lIFdNODQwMF9MUk9QR0FMT05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExST1BHQUxPTiAqLworI2RlZmluZSBXTTg0MDBfTE9QTE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBMT1BMT04gKi8KKyNkZWZpbmUgV004NDAwX0xPUExPTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE9QTE9OICovCisjZGVmaW5lIFdNODQwMF9MT1BMT05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIExPUExPTiAqLworI2RlZmluZSBXTTg0MDBfTE9QTE9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMT1BMT04gKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogTFIxMkxPUCAqLworI2RlZmluZSBXTTg0MDBfTFIxMkxPUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMUjEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MUjEyTE9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExSMTJMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xSMTJMT1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFIxMkxPUCAqLworI2RlZmluZSBXTTg0MDBfTEwxMkxPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMTDEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MTDEyTE9QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExMMTJMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xMMTJMT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEwxMkxPUCAqLworI2RlZmluZSBXTTg0MDBfTEwxMkxPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMTDEyTE9QICovCisjZGVmaW5lIFdNODQwMF9MTE9QR0FMT1AgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExMT1BHQUxPUCAqLworI2RlZmluZSBXTTg0MDBfTExPUEdBTE9QX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMTE9QR0FMT1AgKi8KKyNkZWZpbmUgV004NDAwX0xMT1BHQUxPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTExPUEdBTE9QICovCisjZGVmaW5lIFdNODQwMF9MTE9QR0FMT1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExMT1BHQUxPUCAqLworCisvKgorICogUjUzICgweDM1KSAtIExpbmUgTWl4ZXIyCisgKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUlJPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9SUk9QR0FST05fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJST1BHQVJPTiAqLworI2RlZmluZSBXTTg0MDBfUlJPUEdBUk9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBSUk9QR0FST04gKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlJPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9STE9QR0FST04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFJMT1BHQVJPTiAqLworI2RlZmluZSBXTTg0MDBfUkxPUEdBUk9OX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBSTE9QR0FST04gKi8KKyNkZWZpbmUgV004NDAwX1JMT1BHQVJPTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUkxPUEdBUk9OICovCisjZGVmaW5lIFdNODQwMF9STE9QR0FST05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJMT1BHQVJPTiAqLworI2RlZmluZSBXTTg0MDBfUk9QUk9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBST1BST04gKi8KKyNkZWZpbmUgV004NDAwX1JPUFJPTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUk9QUk9OICovCisjZGVmaW5lIFdNODQwMF9ST1BST05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFJPUFJPTiAqLworI2RlZmluZSBXTTg0MDBfUk9QUk9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBST1BST04gKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1AgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUkwxMlJPUCAqLworI2RlZmluZSBXTTg0MDBfUkwxMlJPUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBSTDEyUk9QICovCisjZGVmaW5lIFdNODQwMF9STDEyUk9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFJMMTJST1AgKi8KKyNkZWZpbmUgV004NDAwX1JMMTJST1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkwxMlJPUCAqLworI2RlZmluZSBXTTg0MDBfUlIxMlJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSUjEyUk9QICovCisjZGVmaW5lIFdNODQwMF9SUjEyUk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFJSMTJST1AgKi8KKyNkZWZpbmUgV004NDAwX1JSMTJST1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlIxMlJPUCAqLworI2RlZmluZSBXTTg0MDBfUlIxMlJPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSUjEyUk9QICovCisjZGVmaW5lIFdNODQwMF9SUk9QR0FST1AgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFJST1BHQVJPUCAqLworI2RlZmluZSBXTTg0MDBfUlJPUEdBUk9QX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBSUk9QR0FST1AgKi8KKyNkZWZpbmUgV004NDAwX1JST1BHQVJPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUlJPUEdBUk9QICovCisjZGVmaW5lIFdNODQwMF9SUk9QR0FST1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJST1BHQVJPUCAqLworCisvKgorICogUjU0ICgweDM2KSAtIFNwZWFrZXIgTWl4ZXIKKyAqLworI2RlZmluZSBXTTg0MDBfTEIyU1BLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xCMlNQS19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTEIyU1BLICovCisjZGVmaW5lIFdNODQwMF9MQjJTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExCMlNQSyAqLworI2RlZmluZSBXTTg0MDBfTEIyU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JCMlNQSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogUkIyU1BLICovCisjZGVmaW5lIFdNODQwMF9SQjJTUEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFJCMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkIyU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBSQjJTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JCMlNQS19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkIyU1BLICovCisjZGVmaW5lIFdNODQwMF9MSTJTUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfTEkyU1BLX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBMSTJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xJMlNQS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTEkyU1BLICovCisjZGVmaW5lIFdNODQwMF9MSTJTUEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkkyU1BLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSSTJTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JJMlNQS19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogUkkyU1BLICovCisjZGVmaW5lIFdNODQwMF9SSTJTUEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFJJMlNQSyAqLworI2RlZmluZSBXTTg0MDBfUkkyU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSTJTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBU1BLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTE9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBU1BLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTE9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTE9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xPUEdBU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBU1BLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBU1BLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUk9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUk9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JPUEdBU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUk9QR0FTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xEU1BLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xEU1BLX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xEU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERTUEsgKi8KKyNkZWZpbmUgV004NDAwX0xEU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JEU1BLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUkRTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JEU1BLX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogUkRTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JEU1BLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUkRTUEsgKi8KKyNkZWZpbmUgV004NDAwX1JEU1BLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkRTUEsgKi8KKworLyoKKyAqIFI1NSAoMHgzNykgLSBBZGRpdGlvbmFsIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg0MDBfVlJPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBWUk9JICovCisjZGVmaW5lIFdNODQwMF9WUk9JX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZST0kgKi8KKyNkZWZpbmUgV004NDAwX1ZST0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogVlJPSSAqLworI2RlZmluZSBXTTg0MDBfVlJPSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBWUk9JICovCisKKy8qCisgKiBSNTYgKDB4MzgpIC0gQW50aVBPUDEKKyAqLworI2RlZmluZSBXTTg0MDBfRElTX0xMSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBESVNfTExJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19MTElORV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogRElTX0xMSU5FICovCisjZGVmaW5lIFdNODQwMF9ESVNfTExJTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIERJU19MTElORSAqLworI2RlZmluZSBXTTg0MDBfRElTX0xMSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBESVNfTExJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19STElORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRElTX1JMSU5FICovCisjZGVmaW5lIFdNODQwMF9ESVNfUkxJTkVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERJU19STElORSAqLworI2RlZmluZSBXTTg0MDBfRElTX1JMSU5FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBESVNfUkxJTkUgKi8KKyNkZWZpbmUgV004NDAwX0RJU19STElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRElTX1JMSU5FICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERJU19PVVQzICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUM19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERJU19PVVQzICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERJU19PVVQzICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUM19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19PVVQzICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERJU19PVVQ0ICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUNF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERJU19PVVQ0ICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUNF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERJU19PVVQ0ICovCisjZGVmaW5lIFdNODQwMF9ESVNfT1VUNF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19PVVQ0ICovCisjZGVmaW5lIFdNODQwMF9ESVNfTE9VVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERJU19MT1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfTE9VVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERJU19MT1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfTE9VVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19MT1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfTE9VVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19MT1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfUk9VVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERJU19ST1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfUk9VVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERJU19ST1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfUk9VVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERJU19ST1VUICovCisjZGVmaW5lIFdNODQwMF9ESVNfUk9VVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJU19ST1VUICovCisKKy8qCisgKiBSNTcgKDB4MzkpIC0gQW50aVBPUDIKKyAqLworI2RlZmluZSBXTTg0MDBfU09GVFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBTT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX1NPRlRTVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU09GVFNUICovCisjZGVmaW5lIFdNODQwMF9TT0ZUU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFNPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfU09GVFNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX0JVRklPRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQlVGSU9FTiAqLworI2RlZmluZSBXTTg0MDBfQlVGSU9FTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBCVUZJT0VOICovCisjZGVmaW5lIFdNODQwMF9CVUZJT0VOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEJVRklPRU4gKi8KKyNkZWZpbmUgV004NDAwX0JVRklPRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQlVGSU9FTiAqLworI2RlZmluZSBXTTg0MDBfQlVGRENPUEVOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBCVUZEQ09QRU4gKi8KKyNkZWZpbmUgV004NDAwX0JVRkRDT1BFTl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQlVGRENPUEVOICovCisjZGVmaW5lIFdNODQwMF9CVUZEQ09QRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEJVRkRDT1BFTiAqLworI2RlZmluZSBXTTg0MDBfQlVGRENPUEVOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCVUZEQ09QRU4gKi8KKyNkZWZpbmUgV004NDAwX1BPQkNUUkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUE9CQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfUE9CQ1RSTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODQwMF9QT0JDVFJMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBPQkNUUkwgKi8KKyNkZWZpbmUgV004NDAwX1BPQkNUUkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUE9CQ1RSTCAqLworI2RlZmluZSBXTTg0MDBfVk1JRFRPRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBWTUlEVE9HICovCisjZGVmaW5lIFdNODQwMF9WTUlEVE9HX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZNSURUT0cgKi8KKyNkZWZpbmUgV004NDAwX1ZNSURUT0dfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogVk1JRFRPRyAqLworI2RlZmluZSBXTTg0MDBfVk1JRFRPR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBWTUlEVE9HICovCisKKy8qCisgKiBSNTggKDB4M0EpIC0gTUlDQklBUworICovCisjZGVmaW5lIFdNODQwMF9NQ0RTQ1RIX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwQzAgIC8qIE1DRFNDVEggLSBbNzo2XSAqLworI2RlZmluZSBXTTg0MDBfTUNEU0NUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBNQ0RTQ1RIIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004NDAwX01DRFNDVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUNEU0NUSCAtIFs3OjZdICovCisjZGVmaW5lIFdNODQwMF9NQ0RUSFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMzggIC8qIE1DRFRIUiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9NQ0RUSFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1DRFRIUiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9NQ0RUSFJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1DRFRIUiAtIFs1OjNdICovCisjZGVmaW5lIFdNODQwMF9NQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIE1DRCAqLworI2RlZmluZSBXTTg0MDBfTUNEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBNQ0QgKi8KKyNkZWZpbmUgV004NDAwX01DRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUNEICovCisjZGVmaW5lIFdNODQwMF9NQ0RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1DRCAqLworI2RlZmluZSBXTTg0MDBfTUJTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQlNFTCAqLworI2RlZmluZSBXTTg0MDBfTUJTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQlNFTCAqLworI2RlZmluZSBXTTg0MDBfTUJTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNQlNFTCAqLworI2RlZmluZSBXTTg0MDBfTUJTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQlNFTCAqLworCisvKgorICogUjYwICgweDNDKSAtIEZMTCBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTg0MDBfRkxMX1JFRl9GUkVRICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBGTExfUkVGX0ZSRVEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9SRUZfRlJFUV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogRkxMX1JFRl9GUkVRICovCisjZGVmaW5lIFdNODQwMF9GTExfUkVGX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIgIC8qIEZMTF9SRUZfRlJFUSAqLworI2RlZmluZSBXTTg0MDBfRkxMX1JFRl9GUkVRX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfUkVGX0ZSRVEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MEMwMCAgLyogRkxMX0NMS19TUkMgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODQwMF9GTExfQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEZMTF9DTEtfU1JDIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0NMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBGTExfQ0xLX1NSQyAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFDX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PU0NfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PU0NfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PU0NfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PU0NfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9DVFJMX1JBVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDBFMCAgLyogRkxMX0NUUkxfUkFURSAtIFs3OjVdICovCisjZGVmaW5lIFdNODQwMF9GTExfQ1RSTF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgIDUgIC8qIEZMTF9DVFJMX1JBVEUgLSBbNzo1XSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0NUUkxfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfQ1RSTF9SQVRFIC0gWzc6NV0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogRkxMX0ZSQVRJTyAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9GUkFUSU8gLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0ZSQVRJT19XSURUSCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBGTExfRlJBVElPIC0gWzQ6MF0gKi8KKworLyoKKyAqIFI2MSAoMHgzRCkgLSBGTEwgQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9LX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9LX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9LX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKworLyoKKyAqIFI2MiAoMHgzRSkgLSBGTEwgQ29udHJvbCAzCisgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDNGRiAgLyogRkxMX04gLSBbOTowXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEZMTF9OIC0gWzk6MF0gKi8KKworLyoKKyAqIFI2MyAoMHgzRikgLSBGTEwgQ29udHJvbCA0CisgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9UUktfR0FJTl9NQVNLICAgICAgICAgICAgICAgIDB4MDA3OCAgLyogRkxMX1RSS19HQUlOIC0gWzY6M10gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9UUktfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMX1RSS19HQUlOIC0gWzY6M10gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9UUktfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgNCAgLyogRkxMX1RSS19HQUlOIC0gWzY6M10gKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogRkxMX09VVERJViAtIFsyOjBdICovCisjZGVmaW5lIFdNODQwMF9GTExfT1VURElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9PVVRESVYgLSBbMjowXSAqLworI2RlZmluZSBXTTg0MDBfRkxMX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfT1VURElWIC0gWzI6MF0gKi8KKwordm9pZCB3bTg0MDBfcmVzZXRfY29kZWNfcmVnX2NhY2hlKHN0cnVjdCB3bTg0MDAgKndtODQwMCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLXByaXZhdGUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODQwMC1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhYjRlOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODQwMC1wcml2YXRlLmgKQEAgLTAsMCArMSw5MzYgQEAKKy8qCisgKiB3bTg0MDAgcHJpdmF0ZSBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9XTTg0MDBfUFJJVl9ICisjZGVmaW5lIF9fTElOVVhfTUZEX1dNODQwMF9QUklWX0gKKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTg0MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIFdNODQwMF9SRUdJU1RFUl9DT1VOVCAweDU1CisKK3N0cnVjdCB3bTg0MDAgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWludCAoKnJlYWRfZGV2KSh2b2lkICpkYXRhLCBjaGFyIHJlZywgaW50IGNvdW50LCB1MTYgKmRzdCk7CisJaW50ICgqd3JpdGVfZGV2KSh2b2lkICpkYXRhLCBjaGFyIHJlZywgaW50IGNvdW50LCBjb25zdCB1MTYgKnNyYyk7CisKKwlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwl2b2lkICppb19kYXRhOworCisJdTE2IHJlZ19jYWNoZVtXTTg0MDBfUkVHSVNURVJfQ09VTlRdOworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWd1bGF0b3JzWzZdOworfTsKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTg0MDBfUkVTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTg0MDBfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTg0MDBfUE9XRVJfTUFOQUdFTUVOVF8xICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTTg0MDBfUE9XRVJfTUFOQUdFTUVOVF8yICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTTg0MDBfUE9XRVJfTUFOQUdFTUVOVF8zICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTg0MDBfQVVESU9fSU5URVJGQUNFXzEgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTg0MDBfQVVESU9fSU5URVJGQUNFXzIgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTg0MDBfQ0xPQ0tJTkdfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBXTTg0MDBfQ0xPQ0tJTkdfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTg0MDBfQVVESU9fSU5URVJGQUNFXzMgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBXTTg0MDBfQVVESU9fSU5URVJGQUNFXzQgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBXTTg0MDBfREFDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBXTTg0MDBfTEVGVF9EQUNfRElHSVRBTF9WT0xVTUUgICAgICAgICAgMHgwQworI2RlZmluZSBXTTg0MDBfUklHSFRfREFDX0RJR0lUQUxfVk9MVU1FICAgICAgICAgMHgwRAorI2RlZmluZSBXTTg0MDBfRElHSVRBTF9TSURFX1RPTkUgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBXTTg0MDBfQURDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBXTTg0MDBfTEVGVF9BRENfRElHSVRBTF9WT0xVTUUgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTg0MDBfUklHSFRfQURDX0RJR0lUQUxfVk9MVU1FICAgICAgICAgMHgxMQorI2RlZmluZSBXTTg0MDBfR1BJT19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBXTTg0MDBfR1BJTzFfR1BJTzIgICAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBXTTg0MDBfR1BJTzNfR1BJTzQgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBXTTg0MDBfR1BJTzVfR1BJTzYgICAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBXTTg0MDBfR1BJT0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBXTTg0MDBfR1BJT19QT0wgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBXTTg0MDBfTEVGVF9MSU5FX0lOUFVUXzFfMl9WT0xVTUUgICAgICAgMHgxOAorI2RlZmluZSBXTTg0MDBfTEVGVF9MSU5FX0lOUFVUXzNfNF9WT0xVTUUgICAgICAgMHgxOQorI2RlZmluZSBXTTg0MDBfUklHSFRfTElORV9JTlBVVF8xXzJfVk9MVU1FICAgICAgMHgxQQorI2RlZmluZSBXTTg0MDBfUklHSFRfTElORV9JTlBVVF8zXzRfVk9MVU1FICAgICAgMHgxQgorI2RlZmluZSBXTTg0MDBfTEVGVF9PVVRQVVRfVk9MVU1FICAgICAgICAgICAgICAgMHgxQworI2RlZmluZSBXTTg0MDBfUklHSFRfT1VUUFVUX1ZPTFVNRSAgICAgICAgICAgICAgMHgxRAorI2RlZmluZSBXTTg0MDBfTElORV9PVVRQVVRTX1ZPTFVNRSAgICAgICAgICAgICAgMHgxRQorI2RlZmluZSBXTTg0MDBfT1VUM180X1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgMHgxRgorI2RlZmluZSBXTTg0MDBfTEVGVF9PUEdBX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTg0MDBfUklHSFRfT1BHQV9WT0xVTUUgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBXTTg0MDBfU1BFQUtFUl9WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBXTTg0MDBfQ0xBU1NEMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBXTTg0MDBfQ0xBU1NEMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVIxICAgICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVIyICAgICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVIzICAgICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVI0ICAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVI1ICAgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBXTTg0MDBfSU5QVVRfTUlYRVI2ICAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSMSAgICAgICAgICAgICAgICAgICAgMHgyRAorI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSMiAgICAgICAgICAgICAgICAgICAgMHgyRQorI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSMyAgICAgICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSNCAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSNSAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBXTTg0MDBfT1VUUFVUX01JWEVSNiAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTg0MDBfT1VUM180X01JWEVSICAgICAgICAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBXTTg0MDBfTElORV9NSVhFUjEgICAgICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBXTTg0MDBfTElORV9NSVhFUjIgICAgICAgICAgICAgICAgICAgICAgMHgzNQorI2RlZmluZSBXTTg0MDBfU1BFQUtFUl9NSVhFUiAgICAgICAgICAgICAgICAgICAgMHgzNgorI2RlZmluZSBXTTg0MDBfQURESVRJT05BTF9DT05UUk9MICAgICAgICAgICAgICAgMHgzNworI2RlZmluZSBXTTg0MDBfQU5USVBPUDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOAorI2RlZmluZSBXTTg0MDBfQU5USVBPUDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOQorI2RlZmluZSBXTTg0MDBfTUlDQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQQorI2RlZmluZSBXTTg0MDBfRkxMX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBXTTg0MDBfRkxMX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgICAgMHgzRAorI2RlZmluZSBXTTg0MDBfRkxMX0NPTlRST0xfMyAgICAgICAgICAgICAgICAgICAgMHgzRQorI2RlZmluZSBXTTg0MDBfRkxMX0NPTlRST0xfNCAgICAgICAgICAgICAgICAgICAgMHgzRgorI2RlZmluZSBXTTg0MDBfTERPMV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg0MQorI2RlZmluZSBXTTg0MDBfTERPMl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg0MgorI2RlZmluZSBXTTg0MDBfTERPM19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBXTTg0MDBfTERPNF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBXTTg0MDBfRENEQzFfQ09OVFJPTF8xICAgICAgICAgICAgICAgICAgMHg0NgorI2RlZmluZSBXTTg0MDBfRENEQzFfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgMHg0NworI2RlZmluZSBXTTg0MDBfRENEQzJfQ09OVFJPTF8xICAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBXTTg0MDBfRENEQzJfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgMHg0OQorI2RlZmluZSBXTTg0MDBfSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHg0QgorI2RlZmluZSBXTTg0MDBfUE1fR0VORVJBTCAgICAgICAgICAgICAgICAgICAgICAgMHg0QworI2RlZmluZSBXTTg0MDBfUE1fU0hVVERPV05fQ09OVFJPTCAgICAgICAgICAgICAgMHg0RQorI2RlZmluZSBXTTg0MDBfSU5URVJSVVBUX1NUQVRVU18xICAgICAgICAgICAgICAgMHg0RgorI2RlZmluZSBXTTg0MDBfSU5URVJSVVBUX1NUQVRVU18xX01BU0sgICAgICAgICAgMHg1MAorI2RlZmluZSBXTTg0MDBfSU5URVJSVVBUX0xFVkVMUyAgICAgICAgICAgICAgICAgMHg1MQorI2RlZmluZSBXTTg0MDBfU0hVVERPV05fUkVBU09OICAgICAgICAgICAgICAgICAgMHg1MgorI2RlZmluZSBXTTg0MDBfTElORV9DSVJDVUlUUyAgICAgICAgICAgICAgICAgICAgMHg1NAorCisvKgorICogRmllbGQgRGVmaW5pdGlvbnMuCisgKi8KKworLyoKKyAqIFIwICgweDAwKSAtIFJlc2V0L0lECisgKi8KKyNkZWZpbmUgV004NDAwX1NXX1JFU0VUX0NISVBfSURfTUFTSyAgICAgICAgICAgIDB4RkZGRiAgLyogU1dfUkVTRVQvQ0hJUF9JRCAtIFsxNTowXSAqLworI2RlZmluZSBXTTg0MDBfU1dfUkVTRVRfQ0hJUF9JRF9TSElGVCAgICAgICAgICAgICAgICAwICAvKiBTV19SRVNFVC9DSElQX0lEIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODQwMF9TV19SRVNFVF9DSElQX0lEX1dJRFRIICAgICAgICAgICAgICAgMTYgIC8qIFNXX1JFU0VUL0NISVBfSUQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxICgweDAxKSAtIElECisgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfUkVWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NzAwMCAgLyogQ0hJUF9SRVYgLSBbMTQ6MTJdICovCisjZGVmaW5lIFdNODQwMF9DSElQX1JFVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIENISVBfUkVWIC0gWzE0OjEyXSAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9SRVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBDSElQX1JFViAtIFsxNDoxMl0gKi8KKworLyoKKyAqIFIxOCAoMHgxMikgLSBHUElPIENUUkwgMQorICovCisjZGVmaW5lIFdNODQwMF9JUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElSUSAqLworI2RlZmluZSBXTTg0MDBfSVJRX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBJUlEgKi8KKyNkZWZpbmUgV004NDAwX0lSUV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogSVJRICovCisjZGVmaW5lIFdNODQwMF9JUlFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElSUSAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBURU1QT0sgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogVEVNUE9LICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIFRFTVBPSyAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBURU1QT0sgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUlDMVNIUlQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUlDMVNIUlQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogTUlDMVNIUlQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDMVNIUlQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTUlDMURFVCAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBNSUMxREVUICovCisjZGVmaW5lIFdNODQwMF9NSUMxREVUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE1JQzFERVQgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDMURFVCAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfTENLICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEZMTF9MQ0sgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogRkxMX0xDSyAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfTENLICovCisjZGVmaW5lIFdNODQwMF9HUElPX1NUQVRVU19NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIEdQSU9fU1RBVFVTIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU9fU1RBVFVTX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1BJT19TVEFUVVMgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJT19TVEFUVVNfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBHUElPX1NUQVRVUyAtIFs3OjBdICovCisKKy8qCisgKiBSMTkgKDB4MTMpIC0gR1BJTzEgJiBHUElPMgorICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9ERUJfRU5BICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQSU8yX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0RFQl9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4ODAwMCAgLyogR1BJTzJfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDE1ICAvKiBHUElPMl9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9ERUJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8yX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0lSUV9FTkEgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogR1BJTzJfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUElPMl9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTQgIC8qIEdQSU8yX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzJfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUElPMl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUElPMl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBHUElPMl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMl9QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBHUElPMl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBHUElPMl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBHUElPMl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMl9QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzJfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwRjAwICAvKiBHUElPMl9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU8yX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1BJTzJfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPMl9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU8yX1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfREVCX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUElPMV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQSU8xX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX0RFQl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogR1BJTzFfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfREVCX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPMV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9JUlFfRU5BICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQSU8xX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJTzFfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzFfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBHUElPMV9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPMV9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8xX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BVICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1BJTzFfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BVX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1BJTzFfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1BJTzFfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzFfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJTzFfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1BJTzFfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzFfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzFfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogR1BJTzFfU0VMIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1BJTzFfU0VMIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU8xX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzFfU0VMIC0gWzM6MF0gKi8KKworLyoKKyAqIFIyMCAoMHgxNCkgLSBHUElPMyAmIEdQSU80CisgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X0RFQl9FTkEgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogR1BJTzRfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfREVCX0VOQV9NQVNLICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUElPNF9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9ERUJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTUgIC8qIEdQSU80X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzRfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUElPNF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9JUlFfRU5BX01BU0sgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQSU80X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAxNCAgLyogR1BJTzRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEdQSU80X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEdQSU80X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQSU80X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU80X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEdQSU80X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEdQSU80X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIEdQSU80X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU80X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNF9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEdQSU80X1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzRfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBHUElPNF9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU80X1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1BJTzRfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPM19ERUJfRU5BICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQSU8zX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0RFQl9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1BJTzNfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICA3ICAvKiBHUElPM19ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPM19ERUJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU8zX0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0lSUV9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJTzNfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUElPM19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPM19JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQSU8zX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU8zX0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzNfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUElPM19QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUElPM19QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBHUElPM19QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPM19QVSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUElPM19QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUElPM19QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPM19QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPM19QRCAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBHUElPM19TRUwgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUElPM19TRUwgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzNfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPM19TRUwgLSBbMzowXSAqLworCisvKgorICogUjIxICgweDE1KSAtIEdQSU81ICYgR1BJTzYKKyAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfREVCX0VOQSAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUElPNl9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQSU82X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X0RFQl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAxNSAgLyogR1BJTzZfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfREVCX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNl9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9JUlFfRU5BICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQSU82X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4NDAwMCAgLyogR1BJTzZfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDE0ICAvKiBHUElPNl9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU82X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BVICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BJTzZfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BVX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BJTzZfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogR1BJTzZfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzZfUFUgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogR1BJTzZfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogR1BJTzZfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogR1BJTzZfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzZfUEQgKi8KKyNkZWZpbmUgV004NDAwX0dQSU82X1NFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MEYwMCAgLyogR1BJTzZfU0VMIC0gWzExOjhdICovCisjZGVmaW5lIFdNODQwMF9HUElPNl9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQSU82X1NFTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzZfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUElPNl9TRUwgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X0RFQl9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1BJTzVfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfREVCX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUElPNV9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9ERUJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEdQSU81X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogR1BJTzVfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUElPNV9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9JUlFfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQSU81X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSU81X0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogR1BJTzVfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJTzVfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBHUElPNV9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQSU81X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQSU81X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQSU81X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU81X1BVICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSU81X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSU81X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU81X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSU81X1BEICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEdQSU81X1NFTCAtIFszOjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQSU81X1NFTCAtIFszOjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPNV9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSU81X1NFTCAtIFszOjBdICovCisKKy8qCisgKiBSMjIgKDB4MTYpIC0gR1BJT0NUUkwgMgorICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFRFTVBPS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAweDA4MDAgIC8qIFRFTVBPS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTEgIC8qIFRFTVBPS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIFRFTVBPS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9JUlFfRU5BICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIE1JQzFTSFJUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX0lSUV9FTkFfTUFTSyAgICAgICAgICAgIDB4MDQwMCAgLyogTUlDMVNIUlRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgIDEwICAvKiBNSUMxU0hSVF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIE1JQzFTSFJUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfSVJRX0VOQSAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTUlDMURFVF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9NSUMxREVUX0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAweDAyMDAgIC8qIE1JQzFERVRfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTUlDMURFVF9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICA5ICAvKiBNSUMxREVUX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogTUlDMURFVF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLX0lSUV9FTkEgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEZMTF9MQ0tfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfRkxMX0xDS19JUlFfRU5BX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBGTExfTENLX0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfSVJRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogRkxMX0xDS19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9GTExfTENLX0lSUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9MQ0tfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9ERUJfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUEk4X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfREVCX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1BJOF9ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0RFQl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDcgIC8qIEdQSThfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9ERUJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBHUEk4X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfSVJRX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1BJOF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0lSUV9FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQSThfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJOF9JUlFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICA2ICAvKiBHUEk4X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSThfSVJRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJOF9JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSThfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQSThfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQSThfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk4X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSThfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0RFQl9FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQSTdfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19ERUJfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUEk3X0RFQl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfREVCX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogR1BJN19ERUJfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0RFQl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQSTdfREVCX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19JUlFfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUEk3X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfSVJRX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1BJN19JUlFfRU5BICovCisjZGVmaW5lIFdNODQwMF9HUEk3X0lSUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDIgIC8qIEdQSTdfSVJRX0VOQSAqLworI2RlZmluZSBXTTg0MDBfR1BJN19JUlFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBHUEk3X0lSUV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1BJN19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1BJN19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1BJN19FTkEgKi8KKyNkZWZpbmUgV004NDAwX0dQSTdfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BJN19FTkEgKi8KKworLyoKKyAqIFIyMyAoMHgxNykgLSBHUElPX1BPTAorICovCisjZGVmaW5lIFdNODQwMF9JUlFfSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElSUV9JTlYgKi8KKyNkZWZpbmUgV004NDAwX0lSUV9JTlZfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSVJRX0lOViAqLworI2RlZmluZSBXTTg0MDBfSVJRX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBJUlFfSU5WICovCisjZGVmaW5lIFdNODQwMF9JUlFfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElSUV9JTlYgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19QT0wgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogVEVNUE9LX1BPTCAqLworI2RlZmluZSBXTTg0MDBfVEVNUE9LX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBURU1QT0tfUE9MICovCisjZGVmaW5lIFdNODQwMF9URU1QT0tfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIFRFTVBPS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX1RFTVBPS19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogVEVNUE9LX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfUE9MICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBNSUMxU0hSVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFTSFJUX1BPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTUlDMVNIUlRfUE9MICovCisjZGVmaW5lIFdNODQwMF9NSUMxU0hSVF9QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMTAgIC8qIE1JQzFTSFJUX1BPTCAqLworI2RlZmluZSBXTTg0MDBfTUlDMVNIUlRfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUMxU0hSVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfUE9MICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTUlDMURFVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfUE9MX01BU0sgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTUlDMURFVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgOSAgLyogTUlDMURFVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX01JQzFERVRfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDMURFVF9QT0wgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfUE9MICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX0xDS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfUE9MX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRkxMX0xDS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogRkxMX0xDS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX0ZMTF9MQ0tfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0xDS19QT0wgKi8KKyNkZWZpbmUgV004NDAwX0dQSU9fUE9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogR1BJT19QT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg0MDBfR1BJT19QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUElPX1BPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODQwMF9HUElPX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQSU9fUE9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI2NSAoMHg0MSkgLSBMRE8gMSBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogTERPMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPMV9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfU1dJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPMV9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfU1dJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogTERPMV9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfU1dJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTERPMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9PUEZMVF9NQVNLICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE8xX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8xX09QRkxUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIExETzFfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfT1BGTFRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE8xX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE8xX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBMRE8xX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBMRE8xX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8xX0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogTERPMV9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPMV9ISUJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8xX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAweDAzRTAgIC8qIExETzFfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZJTUdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzFfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZJTUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzFfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIExETzFfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExETzFfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1ZTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzFfVlNFTCAtIFs0OjBdICovCisKKy8qCisgKiBSNjYgKDB4NDIpIC0gTERPIDIgQ29udHJvbAorICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIExETzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIExETzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIExETzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1NXSSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIExETzJfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1NXSV9NQVNLICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIExETzJfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1NXSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIExETzJfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1NXSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfU1dJICovCisjZGVmaW5lIFdNODQwMF9MRE8yX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExETzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfT1BGTFRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTERPMl9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9PUEZMVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBMRE8yX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8yX09QRkxUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRVJSQUNUICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogTERPMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRVJSQUNUX01BU0sgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogTERPMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAxMSAgLyogTERPMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfRVJSQUNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfSElCX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTERPMl9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgMHgwNDAwICAvKiBMRE8yX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8yX0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgMTAgIC8qIExETzJfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfSElCX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgMHgwM0UwICAvKiBMRE8yX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WSU1HX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8yX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WSU1HX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8yX1ZJTUcgLSBbOTo1XSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBMRE8yX1ZTRUwgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMRE8yX1ZTRUwgLSBbNDowXSAqLworI2RlZmluZSBXTTg0MDBfTERPMl9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8yX1ZTRUwgLSBbNDowXSAqLworCisvKgorICogUjY3ICgweDQzKSAtIExETyAzIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg0MDBfTERPM19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8zX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8zX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPM19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBMRE8zX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPM19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8zX0VOQSAqLworI2RlZmluZSBXTTg0MDBfTERPM19TV0kgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE8zX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPM19TV0lfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMRE8zX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPM19TV0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBMRE8zX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPM19TV0lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8zX1NXSSAqLworI2RlZmluZSBXTTg0MDBfTERPM19PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE8zX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX09QRkxUX01BU0sgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIExETzNfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfT1BGTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMiAgLyogTERPM19PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPM19PUEZMVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8zX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VSUkFDVCAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzNfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIExETzNfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTEgIC8qIExETzNfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzNfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MDQwMCAgLyogTERPM19ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPM19ISUJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgIDEwICAvKiBMRE8zX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE8zX0hJQl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVklNR19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDNFMCAgLyogTERPM19WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVklNR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPM19WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVklNR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPM19WSU1HIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRiAgLyogTERPM19WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTERPM19WU0VMIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTERPM19WU0VMIC0gWzQ6MF0gKi8KKworLyoKKyAqIFI2OCAoMHg0NCkgLSBMRE8gNCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogTERPNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPNF9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfU1dJICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPNF9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfU1dJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTERPNF9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfU1dJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogTERPNF9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfU1dJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPNF9TV0kgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfT1BGTFQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogTERPNF9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9PUEZMVF9NQVNLICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBMRE80X09QRkxUICovCisjZGVmaW5lIFdNODQwMF9MRE80X09QRkxUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIExETzRfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfT1BGTFRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPNF9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE80X0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBMRE80X0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBMRE80X0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBMRE80X0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE80X0hJQl9NT0RFX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIExETzRfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogTERPNF9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfTERPNF9ISUJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBMRE80X0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAweDAzRTAgIC8qIExETzRfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZJTUdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzRfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZJTUdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzRfVklNRyAtIFs5OjVdICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIExETzRfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExETzRfVlNFTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODQwMF9MRE80X1ZTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExETzRfVlNFTCAtIFs0OjBdICovCisKKy8qCisgKiBSNzAgKDB4NDYpIC0gRENEQzEgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogREMxX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEQzFfRU5BICovCisjZGVmaW5lIFdNODQwMF9EQzFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIERDMV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMxX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEQzFfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzFfQUNUSVZFX01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIERDMV9BQ1RJVkUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9BQ1RJVkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogREMxX0FDVElWRSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVElWRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzFfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIERDMV9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMxX1NMRUVQX01BU0sgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzFfU0xFRVAgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9TTEVFUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogREMxX1NMRUVQICovCisjZGVmaW5lIFdNODQwMF9EQzFfU0xFRVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMV9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMxX09QRkxUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBEQzFfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PUEZMVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREMxX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9EQzFfT1BGTFRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIERDMV9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfREMxX09QRkxUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREMxX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMxX0VSUkFDVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBEQzFfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9EQzFfRVJSQUNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIERDMV9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMxX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMxX0hJQl9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBEQzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9ISUJfTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogREMxX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9EQzFfSElCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgMTAgIC8qIERDMV9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREMxX0hJQl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9TT0ZUU1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDMwMCAgLyogREMxX1NPRlRTVCAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzFfU09GVFNUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERDMV9TT0ZUU1QgLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMxX1NPRlRTVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEQzFfU09GVFNUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PVl9QUk9UICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMxX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PVl9QUk9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMxX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PVl9QUk9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMxX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9PVl9QUk9UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMxX09WX1BST1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9WU0VMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogREMxX1ZTRUwgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfREMxX1ZTRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQzFfVlNFTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzFfVlNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIERDMV9WU0VMIC0gWzY6MF0gKi8KKworLyoKKyAqIFI3MSAoMHg0NykgLSBEQ0RDMSBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTg0MDBfREMxX0ZSQ19QV00gICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzFfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0ZSQ19QV01fTUFTSyAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzFfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0ZSQ19QV01fU0hJRlQgICAgICAgICAgICAgICAgICAgIDEzICAvKiBEQzFfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0ZSQ19QV01fV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfRlJDX1BXTSAqLworI2RlZmluZSBXTTg0MDBfREMxX1NUQllfTElNX01BU0sgICAgICAgICAgICAgICAgMHgwMzAwICAvKiBEQzFfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMxX1NUQllfTElNX1NISUZUICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQzFfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMxX1NUQllfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgICAyICAvKiBEQzFfU1RCWV9MSU0gLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVF9MSU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzFfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVF9MSU1fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEQzFfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgICA3ICAvKiBEQzFfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMxX0FDVF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfQUNUX0xJTSAqLworI2RlZmluZSBXTTg0MDBfREMxX1ZJTUdfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBEQzFfVklNRyAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzFfVklNR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERDMV9WSU1HIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMV9WSU1HX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMxX1ZJTUcgLSBbNjowXSAqLworCisvKgorICogUjcyICgweDQ4KSAtIERDREMyIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODQwMF9EQzJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIERDMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogREMyX0VOQSAqLworI2RlZmluZSBXTTg0MDBfREMyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBEQzJfRU5BICovCisjZGVmaW5lIFdNODQwMF9EQzJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMl9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogREMyX0FDVElWRSAqLworI2RlZmluZSBXTTg0MDBfREMyX0FDVElWRV9NQVNLICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEQzJfQUNUSVZFICovCisjZGVmaW5lIFdNODQwMF9EQzJfQUNUSVZFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTQgIC8qIERDMl9BQ1RJVkUgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RJVkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0FDVElWRSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBEQzJfU0xFRVAgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TTEVFUF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogREMyX1NMRUVQICovCisjZGVmaW5lIFdNODQwMF9EQzJfU0xFRVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIERDMl9TTEVFUCAqLworI2RlZmluZSBXTTg0MDBfREMyX1NMRUVQX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzJfU0xFRVAgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PUEZMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREMyX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1BGTFRfTUFTSyAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIERDMl9PUEZMVCAqLworI2RlZmluZSBXTTg0MDBfREMyX09QRkxUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBEQzJfT1BGTFQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9PUEZMVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX09QRkxUICovCisjZGVmaW5lIFdNODQwMF9EQzJfRVJSQUNUICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIERDMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREMyX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfREMyX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDExICAvKiBEQzJfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9EQzJfRVJSQUNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMl9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9ISUJfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogREMyX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9EQzJfSElCX01PREVfTUFTSyAgICAgICAgICAgICAgICAweDA0MDAgIC8qIERDMl9ISUJfTU9ERSAqLworI2RlZmluZSBXTTg0MDBfREMyX0hJQl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgIDEwICAvKiBEQzJfSElCX01PREUgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9ISUJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0hJQl9NT0RFICovCisjZGVmaW5lIFdNODQwMF9EQzJfU09GVFNUX01BU0sgICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIERDMl9TT0ZUU1QgLSBbOTo4XSAqLworI2RlZmluZSBXTTg0MDBfREMyX1NPRlRTVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQzJfU09GVFNUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TT0ZUU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMiAgLyogREMyX1NPRlRTVCAtIFs5OjhdICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1ZfUFJPVCAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERDMl9PVl9QUk9UICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1ZfUFJPVF9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERDMl9PVl9QUk9UICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1ZfUFJPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIERDMl9PVl9QUk9UICovCisjZGVmaW5lIFdNODQwMF9EQzJfT1ZfUFJPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERDMl9PVl9QUk9UICovCisjZGVmaW5lIFdNODQwMF9EQzJfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwN0YgIC8qIERDMl9WU0VMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREMyX1ZTRUwgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfREMyX1ZTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBEQzJfVlNFTCAtIFs2OjBdICovCisKKy8qCisgKiBSNzMgKDB4NDkpIC0gRENEQzIgQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9GUkNfUFdNICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogREMyX0ZSQ19QV00gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9GUkNfUFdNX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogREMyX0ZSQ19QV00gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9GUkNfUFdNX1NISUZUICAgICAgICAgICAgICAgICAgICAxMyAgLyogREMyX0ZSQ19QV00gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9GUkNfUFdNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0ZSQ19QV00gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TVEJZX0xJTV9NQVNLICAgICAgICAgICAgICAgIDB4MDMwMCAgLyogREMyX1NUQllfTElNIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TVEJZX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAgOCAgLyogREMyX1NUQllfTElNIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9TVEJZX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogREMyX1NUQllfTElNIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RfTElNICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMyX0FDVF9MSU0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RfTElNX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogREMyX0FDVF9MSU0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RfTElNX1NISUZUICAgICAgICAgICAgICAgICAgICAgNyAgLyogREMyX0FDVF9MSU0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9BQ1RfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX0FDVF9MSU0gKi8KKyNkZWZpbmUgV004NDAwX0RDMl9WSU1HX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogREMyX1ZJTUcgLSBbNjowXSAqLworI2RlZmluZSBXTTg0MDBfREMyX1ZJTUdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQzJfVklNRyAtIFs2OjBdICovCisjZGVmaW5lIFdNODQwMF9EQzJfVklNR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIERDMl9WSU1HIC0gWzY6MF0gKi8KKworLyoKKyAqIFI3NSAoMHg0QikgLSBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBXTTg0MDBfQVVUT0lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBVVRPSU5DICovCisjZGVmaW5lIFdNODQwMF9BVVRPSU5DX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFVVE9JTkMgKi8KKyNkZWZpbmUgV004NDAwX0FVVE9JTkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQVVUT0lOQyAqLworI2RlZmluZSBXTTg0MDBfQVVUT0lOQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBVVRPSU5DICovCisjZGVmaW5lIFdNODQwMF9BUkFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFSQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX0FSQV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQVJBX0VOQSAqLworI2RlZmluZSBXTTg0MDBfQVJBX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBUkFfRU5BICovCisjZGVmaW5lIFdNODQwMF9BUkFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFSQV9FTkEgKi8KKyNkZWZpbmUgV004NDAwX1NQSV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogU1BJX0NGRyAqLworI2RlZmluZSBXTTg0MDBfU1BJX0NGR19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTUElfQ0ZHICovCisjZGVmaW5lIFdNODQwMF9TUElfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQSV9DRkcgKi8KKyNkZWZpbmUgV004NDAwX1NQSV9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BJX0NGRyAqLworCisvKgorICogUjc2ICgweDRDKSAtIFBNIEdFTkVSQUwKKyAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNUICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDT0RFQ19TT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NPRlRTVF9NQVNLICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ09ERUNfU09GVFNUICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TT0ZUU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgMTUgIC8qIENPREVDX1NPRlRTVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBDT0RFQ19TT0ZUU1QgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NPRlRTRCAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogQ09ERUNfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TT0ZUU0RfTUFTSyAgICAgICAgICAgICAgICAweDQwMDAgIC8qIENPREVDX1NPRlRTRCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU09GVFNEX1NISUZUICAgICAgICAgICAgICAgICAgIDE0ICAvKiBDT0RFQ19TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NPRlRTRF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQ09ERUNfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DSElQX1NPRlRTRCAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIENISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DSElQX1NPRlRTRF9NQVNLICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIENISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DSElQX1NPRlRTRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIENISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9DSElQX1NPRlRTRF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAxX1BPTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERTTEVFUDFfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAxX1BPTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERTTEVFUDFfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAxX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERTTEVFUDFfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAxX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERTTEVFUDFfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAyX1BPTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTTEVFUDJfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAyX1BPTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTTEVFUDJfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAyX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERTTEVFUDJfUE9MICovCisjZGVmaW5lIFdNODQwMF9EU0xFRVAyX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERTTEVFUDJfUE9MICovCisjZGVmaW5lIFdNODQwMF9QV1JfU1RBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIFBXUl9TVEFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9QV1JfU1RBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBXUl9TVEFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNODQwMF9QV1JfU1RBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFBXUl9TVEFURSAtIFsxOjBdICovCisKKy8qCisgKiBSNzggKDB4NEUpIC0gUE0gU2h1dGRvd24gQ29udHJvbAorICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VSUkFDVCAgICAgICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VSUkFDVF9NQVNLICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgIDkgIC8qIENISVBfR1QxNTBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxNTBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VSUkFDVCAgICAgICAgICAgICAgICAweDAxMDAgIC8qIENISVBfR1QxMTVfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VSUkFDVF9NQVNLICAgICAgICAgICAweDAxMDAgIC8qIENISVBfR1QxMTVfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgIDggIC8qIENISVBfR1QxMTVfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VSUkFDVF9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxMTVfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9FUlJBQ1QgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJTkVfQ01QX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfRVJSQUNUX01BU0sgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FX0NNUF9FUlJBQ1QgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VSUkFDVF9TSElGVCAgICAgICAgICAgICAgICAgNyAgLyogTElORV9DTVBfRVJSQUNUICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIExJTkVfQ01QX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FUlJBQ1QgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FUlJBQ1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FUlJBQ1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICA2ICAvKiBVVkxPX0VSUkFDVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FUlJBQ1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBVVkxPX0VSUkFDVCAqLworCisvKgorICogUjc5ICgweDRGKSAtIEludGVycnVwdCBTdGF0dXMgMQorICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0NJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9DSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNSUNEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX01JQ0RfQ0lOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogTUlDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9NSUNEX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0NJTlQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBNSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBNSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBNSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNTQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0NJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBKRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBKRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBKRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRExfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0NJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBKRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0NJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBKRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBKRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0NJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBKRFJfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9FSU5UICAgICAgICAgICAgICAgMHgwODAwICAvKiBDT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NPREVDX1NFUV9FTkRfRUlOVF9NQVNLICAgICAgICAgIDB4MDgwMCAgLyogQ09ERUNfU0VRX0VORF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DT0RFQ19TRVFfRU5EX0VJTlRfU0hJRlQgICAgICAgICAgICAgMTEgIC8qIENPREVDX1NFUV9FTkRfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBDT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NERUxfVE9fRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9DREVMX1RPX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDA0MDAgIC8qIENERUxfVE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDEwICAvKiBDREVMX1RPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NERUxfVE9fRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VJTlQgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIENISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9FSU5UX01BU0sgICAgICAgICAgICAgMHgwMjAwICAvKiBDSElQX0dUMTUwX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxNTBfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgOSAgLyogQ0hJUF9HVDE1MF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTUwX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIENISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9FSU5UICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBDSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0NISVBfR1QxMTVfRUlOVF9NQVNLICAgICAgICAgICAgIDB4MDEwMCAgLyogQ0hJUF9HVDExNV9FSU5UICovCisjZGVmaW5lIFdNODQwMF9DSElQX0dUMTE1X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDggIC8qIENISVBfR1QxMTVfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBDSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FX0NNUF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTkVfQ01QX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBVVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogVVZMT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9VVkxPX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIFVWTE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfVVZMT19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBVVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9FSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNSAgLyogREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9FSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNCAgLyogREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMxX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDggIC8qIExETzRfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPNF9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAzICAvKiBMRE80X1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzRfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPM19VVl9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMRE8zX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzNfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMiAgLyogTERPM19VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9VVl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzJfVVZfRUlOVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMl9VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBMRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTERPMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExETzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfTERPMV9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBMRE8xX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0xETzFfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9VVl9FSU5UICovCisKKy8qCisgKiBSODAgKDB4NTApIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sKKyAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDRF9DSU5UICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBJTV9NSUNEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ0RfQ0lOVF9NQVNLICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogSU1fTUlDRF9DSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9NSUNEX0NJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMTUgIC8qIElNX01JQ0RfQ0lOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTUlDRF9DSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9NSUNEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ1NDRF9DSU5UICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogSU1fTUlDU0NEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ1NDRF9DSU5UX01BU0sgICAgICAgICAgICAgIDB4NDAwMCAgLyogSU1fTUlDU0NEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ1NDRF9DSU5UX1NISUZUICAgICAgICAgICAgICAgICAxNCAgLyogSU1fTUlDU0NEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX01JQ1NDRF9DSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogSU1fTUlDU0NEX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pETF9DSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU1fSkRMX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pETF9DSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU1fSkRMX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pETF9DSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAxMyAgLyogSU1fSkRMX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pETF9DSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU1fSkRMX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pEUl9DSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSU1fSkRSX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pEUl9DSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSU1fSkRSX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pEUl9DSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAxMiAgLyogSU1fSkRSX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0pEUl9DSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU1fSkRSX0NJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NPREVDX1NFUV9FTkRfRUlOVCAgICAgICAgICAgIDB4MDgwMCAgLyogSU1fQ09ERUNfU0VRX0VORF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DT0RFQ19TRVFfRU5EX0VJTlRfTUFTSyAgICAgICAweDA4MDAgIC8qIElNX0NPREVDX1NFUV9FTkRfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ09ERUNfU0VRX0VORF9FSU5UX1NISUZUICAgICAgICAgIDExICAvKiBJTV9DT0RFQ19TRVFfRU5EX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NPREVDX1NFUV9FTkRfRUlOVF9XSURUSCAgICAgICAgICAgMSAgLyogSU1fQ09ERUNfU0VRX0VORF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DREVMX1RPX0VJTlQgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIElNX0NERUxfVE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0RFTF9UT19FSU5UX01BU0sgICAgICAgICAgICAgMHgwNDAwICAvKiBJTV9DREVMX1RPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NERUxfVE9fRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxMCAgLyogSU1fQ0RFTF9UT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DREVMX1RPX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElNX0NERUxfVE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDE1MF9FSU5UICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTV9DSElQX0dUMTUwX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NISVBfR1QxNTBfRUlOVF9NQVNLICAgICAgICAgIDB4MDIwMCAgLyogSU1fQ0hJUF9HVDE1MF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DSElQX0dUMTUwX0VJTlRfU0hJRlQgICAgICAgICAgICAgIDkgIC8qIElNX0NISVBfR1QxNTBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDE1MF9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DSElQX0dUMTUwX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NISVBfR1QxMTVfRUlOVCAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU1fQ0hJUF9HVDExNV9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9DSElQX0dUMTE1X0VJTlRfTUFTSyAgICAgICAgICAweDAxMDAgIC8qIElNX0NISVBfR1QxMTVfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fQ0hJUF9HVDExNV9FSU5UX1NISUZUICAgICAgICAgICAgICA4ICAvKiBJTV9DSElQX0dUMTE1X0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0NISVBfR1QxMTVfRUlOVF9XSURUSCAgICAgICAgICAgICAgMSAgLyogSU1fQ0hJUF9HVDExNV9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MSU5FX0NNUF9FSU5UICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElNX0xJTkVfQ01QX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xJTkVfQ01QX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDA4MCAgLyogSU1fTElORV9DTVBfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTElORV9DTVBfRUlOVF9TSElGVCAgICAgICAgICAgICAgICA3ICAvKiBJTV9MSU5FX0NNUF9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MSU5FX0NNUF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0xJTkVfQ01QX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX1VWTE9fRUlOVCAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU1fVVZMT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9VVkxPX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElNX1VWTE9fRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fVVZMT19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICA2ICAvKiBJTV9VVkxPX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX1VWTE9fRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU1fVVZMT19FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzJfVVZfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0RDMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzJfVVZfRUlOVF9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0RDMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzJfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIElNX0RDMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzJfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0RDMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzFfVVZfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0RDMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzFfVVZfRUlOVF9NQVNLICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0RDMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzFfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDQgIC8qIElNX0RDMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9EQzFfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0RDMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE80X1VWX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElNX0xETzRfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPNF9VVl9FSU5UX01BU0sgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9MRE80X1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzRfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMyAgLyogSU1fTERPNF9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE80X1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElNX0xETzRfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPM19VVl9FSU5UICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9MRE8zX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzNfVVZfRUlOVF9NQVNLICAgICAgICAgICAgIDB4MDAwNCAgLyogSU1fTERPM19VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8zX1VWX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDIgIC8qIElNX0xETzNfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPM19VVl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBJTV9MRE8zX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzJfVVZfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU1fTERPMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8yX1VWX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0xETzJfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPMl9VVl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAxICAvKiBJTV9MRE8yX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzJfVVZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogSU1fTERPMl9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8xX1VWX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0xETzFfVVZfRUlOVCAqLworI2RlZmluZSBXTTg0MDBfSU1fTERPMV9VVl9FSU5UX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9MRE8xX1VWX0VJTlQgKi8KKyNkZWZpbmUgV004NDAwX0lNX0xETzFfVVZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogSU1fTERPMV9VVl9FSU5UICovCisjZGVmaW5lIFdNODQwMF9JTV9MRE8xX1VWX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElNX0xETzFfVVZfRUlOVCAqLworCisvKgorICogUjgxICgweDUxKSAtIEludGVycnVwdCBMZXZlbHMKKyAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNSUNEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNSUNEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBNSUNEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDRF9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0xWTCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBNSUNTQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9NSUNTQ0RfTFZMX01BU0sgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIE1JQ1NDRF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX01JQ1NDRF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNCAgLyogTUlDU0NEX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTUlDU0NEX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNTQ0RfTFZMICovCisjZGVmaW5lIFdNODQwMF9KRExfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEpETF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pETF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSkRMX0xWTCAqLworI2RlZmluZSBXTTg0MDBfSkRMX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBKRExfTFZMICovCisjZGVmaW5lIFdNODQwMF9KRExfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEpETF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pEUl9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogSkRSX0xWTCAqLworI2RlZmluZSBXTTg0MDBfSkRSX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBKRFJfTFZMICovCisjZGVmaW5lIFdNODQwMF9KRFJfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIEpEUl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0pEUl9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSkRSX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9MVkwgICAgICAgICAgICAgICAgMHgwODAwICAvKiBDT0RFQ19TRVFfRU5EX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9MVkxfTUFTSyAgICAgICAgICAgMHgwODAwICAvKiBDT0RFQ19TRVFfRU5EX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9MVkxfU0hJRlQgICAgICAgICAgICAgIDExICAvKiBDT0RFQ19TRVFfRU5EX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ09ERUNfU0VRX0VORF9MVkxfV0lEVEggICAgICAgICAgICAgICAxICAvKiBDT0RFQ19TRVFfRU5EX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19MVkwgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBDREVMX1RPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19MVkxfTUFTSyAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBDREVMX1RPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEwICAvKiBDREVMX1RPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0RFTF9UT19MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBDREVMX1RPX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9MVkwgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBDSElQX0dUMTUwX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9MVkxfTUFTSyAgICAgICAgICAgICAgMHgwMjAwICAvKiBDSElQX0dUMTUwX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICA5ICAvKiBDSElQX0dUMTUwX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDE1MF9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBDSElQX0dUMTUwX0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9MVkwgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBDSElQX0dUMTE1X0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9MVkxfTUFTSyAgICAgICAgICAgICAgMHgwMTAwICAvKiBDSElQX0dUMTE1X0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBDSElQX0dUMTE1X0xWTCAqLworI2RlZmluZSBXTTg0MDBfQ0hJUF9HVDExNV9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBDSElQX0dUMTE1X0xWTCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfTFZMICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FX0NNUF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX0xWTF9NQVNLICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElORV9DTVBfTFZMICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTkVfQ01QX0xWTCAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU5FX0NNUF9MVkwgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fTFZMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogVVZMT19MVkwgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogVVZMT19MVkwgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogVVZMT19MVkwgKi8KKyNkZWZpbmUgV004NDAwX1VWTE9fTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVVZMT19MVkwgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9MVkwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogREMyX1VWX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMyX1VWX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEQzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9EQzJfVVZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIERDMl9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0RDMl9VVl9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogREMyX1VWX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEQzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9EQzFfVVZfTFZMX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERDMV9VVl9MVkwgKi8KKyNkZWZpbmUgV004NDAwX0RDMV9VVl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNCAgLyogREMxX1VWX0xWTCAqLworI2RlZmluZSBXTTg0MDBfREMxX1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIExETzRfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0xWTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIExETzRfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExETzRfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE80X1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzRfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExETzNfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0xWTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExETzNfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExETzNfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8zX1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzNfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExETzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0xWTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExETzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8yX1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzJfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0xWTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExETzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0xWTF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExETzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExETzFfVVZfTFZMICovCisjZGVmaW5lIFdNODQwMF9MRE8xX1VWX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExETzFfVVZfTFZMICovCisKKy8qCisgKiBSODIgKDB4NTIpIC0gU2h1dGRvd24gUmVhc29uCisgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX1NPRlRTRCAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogU0RSX0NISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9TT0ZUU0RfTUFTSyAgICAgICAgICAgICAweDIwMDAgIC8qIFNEUl9DSElQX1NPRlRTRCAqLworI2RlZmluZSBXTTg0MDBfU0RSX0NISVBfU09GVFNEX1NISUZUICAgICAgICAgICAgICAgIDEzICAvKiBTRFJfQ0hJUF9TT0ZUU0QgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9DSElQX1NPRlRTRF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0NISVBfU09GVFNEICovCisjZGVmaW5lIFdNODQwMF9TRFJfTlBETiAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFNEUl9OUEROICovCisjZGVmaW5lIFdNODQwMF9TRFJfTlBETl9NQVNLICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIFNEUl9OUEROICovCisjZGVmaW5lIFdNODQwMF9TRFJfTlBETl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIFNEUl9OUEROICovCisjZGVmaW5lIFdNODQwMF9TRFJfTlBETl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9OUEROICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDE1MCAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIFNEUl9DSElQX0dUMTUwICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDE1MF9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIFNEUl9DSElQX0dUMTUwICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDE1MF9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIFNEUl9DSElQX0dUMTUwICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDE1MF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9DSElQX0dUMTUwICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDExNSAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNEUl9DSElQX0dUMTE1ICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDExNV9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIFNEUl9DSElQX0dUMTE1ICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDExNV9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIFNEUl9DSElQX0dUMTE1ICovCisjZGVmaW5lIFdNODQwMF9TRFJfQ0hJUF9HVDExNV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9DSElQX0dUMTE1ICovCisjZGVmaW5lIFdNODQwMF9TRFJfTElORV9DTVAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFNEUl9MSU5FX0NNUCAqLworI2RlZmluZSBXTTg0MDBfU0RSX0xJTkVfQ01QX01BU0sgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBTRFJfTElORV9DTVAgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MSU5FX0NNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgNyAgLyogU0RSX0xJTkVfQ01QICovCisjZGVmaW5lIFdNODQwMF9TRFJfTElORV9DTVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9MSU5FX0NNUCAqLworI2RlZmluZSBXTTg0MDBfU0RSX1VWTE8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBTRFJfVVZMTyAqLworI2RlZmluZSBXTTg0MDBfU0RSX1VWTE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBTRFJfVVZMTyAqLworI2RlZmluZSBXTTg0MDBfU0RSX1VWTE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBTRFJfVVZMTyAqLworI2RlZmluZSBXTTg0MDBfU0RSX1VWTE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfVVZMTyAqLworI2RlZmluZSBXTTg0MDBfU0RSX0RDMl9VViAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBTRFJfREMyX1VWICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMyX1VWX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFNEUl9EQzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9EQzJfVVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogU0RSX0RDMl9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0RDMl9VVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTRFJfREMyX1VWICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMxX1VWICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFNEUl9EQzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9EQzFfVVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogU0RSX0RDMV9VViAqLworI2RlZmluZSBXTTg0MDBfU0RSX0RDMV9VVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBTRFJfREMxX1VWICovCisjZGVmaW5lIFdNODQwMF9TRFJfREMxX1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNEUl9EQzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE80X1VWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogU0RSX0xETzRfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE80X1VWX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogU0RSX0xETzRfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE80X1VWX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogU0RSX0xETzRfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE80X1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xETzRfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8zX1VWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogU0RSX0xETzNfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8zX1VWX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogU0RSX0xETzNfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8zX1VWX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogU0RSX0xETzNfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8zX1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xETzNfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8yX1VWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogU0RSX0xETzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8yX1VWX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogU0RSX0xETzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8yX1VWX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xETzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8yX1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xETzJfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8xX1VWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogU0RSX0xETzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8xX1VWX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogU0RSX0xETzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8xX1VWX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogU0RSX0xETzFfVVYgKi8KKyNkZWZpbmUgV004NDAwX1NEUl9MRE8xX1VWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogU0RSX0xETzFfVVYgKi8KKworLyoKKyAqIFI4NCAoMHg1NCkgLSBMaW5lIENpcmN1aXRzCisgKi8KKyNkZWZpbmUgV004NDAwX0JHX0xJTkVfQ09NUCAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQkdfTElORV9DT01QICovCisjZGVmaW5lIFdNODQwMF9CR19MSU5FX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEJHX0xJTkVfQ09NUCAqLworI2RlZmluZSBXTTg0MDBfQkdfTElORV9DT01QX1NISUZUICAgICAgICAgICAgICAgICAgIDE1ICAvKiBCR19MSU5FX0NPTVAgKi8KKyNkZWZpbmUgV004NDAwX0JHX0xJTkVfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQkdfTElORV9DT01QICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9WVEhJX01BU0sgICAgICAgICAgICAgICAweDAwRjAgIC8qIExJTkVfQ01QX1ZUSEkgLSBbNzo0XSAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfVlRISV9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBMSU5FX0NNUF9WVEhJIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX1ZUSElfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogTElORV9DTVBfVlRISSAtIFs3OjRdICovCisjZGVmaW5lIFdNODQwMF9MSU5FX0NNUF9WVEhEX01BU0sgICAgICAgICAgICAgICAweDAwMEYgIC8qIExJTkVfQ01QX1ZUSEQgLSBbMzowXSAqLworI2RlZmluZSBXTTg0MDBfTElORV9DTVBfVlRIRF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBMSU5FX0NNUF9WVEhEIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004NDAwX0xJTkVfQ01QX1ZUSERfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogTElORV9DTVBfVlRIRCAtIFszOjBdICovCisKK3UxNiB3bTg0MDBfcmVnX3JlYWQoc3RydWN0IHdtODQwMCAqd204NDAwLCB1OCByZWcpOworaW50IHdtODQwMF9ibG9ja19yZWFkKHN0cnVjdCB3bTg0MDAgKndtODQwMCwgdTggcmVnLCBpbnQgY291bnQsIHUxNiAqZGF0YSk7CitpbnQgd204NDAwX3NldF9iaXRzKHN0cnVjdCB3bTg0MDAgKndtODQwMCwgdTggcmVnLCB1MTYgbWFzaywgdTE2IHZhbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTg0MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDZiNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204NDAwLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIHdtODQwMCBjbGllbnQgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfV004NDAwX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfV004NDAwX0gKKworI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisKKyNkZWZpbmUgV004NDAwX0xETzEgIDAKKyNkZWZpbmUgV004NDAwX0xETzIgIDEKKyNkZWZpbmUgV004NDAwX0xETzMgIDIKKyNkZWZpbmUgV004NDAwX0xETzQgIDMKKyNkZWZpbmUgV004NDAwX0RDREMxIDQKKyNkZWZpbmUgV004NDAwX0RDREMyIDUKKworc3RydWN0IHdtODQwMF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCpwbGF0Zm9ybV9pbml0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfTsKKworaW50IHdtODQwMF9yZWdpc3Rlcl9yZWd1bGF0b3Ioc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLAorCQkJICAgICAgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKaW5kZXggNjU1ZWEwZC4uYjJmOTQ0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaApAQCAtMTQxLDYgKzE0MSwxMCBAQAogCU1MWDRfU1RBVF9SQVRFX09GRlNFVAk9IDUKIH07CiAKK2VudW0geworCU1MWDRfTVRUX0ZMQUdfUFJFU0VOVAkJPSAxCit9OworCiBzdGF0aWMgaW5saW5lIHU2NCBtbHg0X2Z3X3Zlcih1NjQgbWFqb3IsIHU2NCBtaW5vciwgdTY0IHN1Ym1pbm9yKQogewogCXJldHVybiAobWFqb3IgPDwgMzIpIHwgKG1pbm9yIDw8IDE2KSB8IHN1Ym1pbm9yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDcyYTE1ZGMuLmM2MWJhMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW1kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgpAQCAtMjE5LDEyICsyMjAsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1ZNCi0jZGVmaW5lIFZNX0JVR19PTihjb25kKSBCVUdfT04oY29uZCkKLSNlbHNlCi0jZGVmaW5lIFZNX0JVR19PTihjb25kaXRpb24pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KIC8qCiAgKiBNZXRob2RzIHRvIG1vZGlmeSB0aGUgcGFnZSB1c2FnZSBjb3VudC4KICAqCkBAIC05MTksNyArOTE0LDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTU1VICYmICFfX0FSQ0hfSEFTXzRMRVZFTF9IQUNLICovCiAKLSNpZiBOUl9DUFVTID49IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUworI2lmIFVTRV9TUExJVF9QVExPQ0tTCiAvKgogICogV2UgdHVjayBhIHNwaW5sb2NrIHRvIGd1YXJkIGVhY2ggcGFnZXRhYmxlIHBhZ2UgaW50byBpdHMgc3RydWN0IHBhZ2UsCiAgKiBhdCBwYWdlLT5wcml2YXRlLCB3aXRoIEJVSUxEX0JVR19PTiB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIHdpbGwgbm90CkBAIC05MzIsMTQgKzkyNywxNCBAQAogfSB3aGlsZSAoMCkKICNkZWZpbmUgcHRlX2xvY2tfZGVpbml0KHBhZ2UpCSgocGFnZSktPm1hcHBpbmcgPSBOVUxMKQogI2RlZmluZSBwdGVfbG9ja3B0cihtbSwgcG1kKQkoeyh2b2lkKShtbSk7IF9fcHRlX2xvY2twdHIocG1kX3BhZ2UoKihwbWQpKSk7fSkKLSNlbHNlCisjZWxzZQkvKiAhVVNFX1NQTElUX1BUTE9DS1MgKi8KIC8qCiAgKiBXZSB1c2UgbW0tPnBhZ2VfdGFibGVfbG9jayB0byBndWFyZCBhbGwgcGFnZXRhYmxlIHBhZ2VzIG9mIHRoZSBtbS4KICAqLwogI2RlZmluZSBwdGVfbG9ja19pbml0KHBhZ2UpCWRvIHt9IHdoaWxlICgwKQogI2RlZmluZSBwdGVfbG9ja19kZWluaXQocGFnZSkJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIHB0ZV9sb2NrcHRyKG1tLCBwbWQpCSh7KHZvaWQpKHBtZCk7ICYobW0pLT5wYWdlX3RhYmxlX2xvY2s7fSkKLSNlbmRpZiAvKiBOUl9DUFVTIDwgQ09ORklHX1NQTElUX1BUTE9DS19DUFVTICovCisjZW5kaWYgLyogVVNFX1NQTElUX1BUTE9DS1MgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIHBndGFibGVfcGFnZV9jdG9yKHN0cnVjdCBwYWdlICpwYWdlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IGJmMzM0MTMuLjlkNDlmYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKQEAgLTIxLDExICsyMSwxMyBAQAogCiBzdHJ1Y3QgYWRkcmVzc19zcGFjZTsKIAotI2lmIE5SX0NQVVMgPj0gQ09ORklHX1NQTElUX1BUTE9DS19DUFVTCisjZGVmaW5lIFVTRV9TUExJVF9QVExPQ0tTCShOUl9DUFVTID49IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUykKKworI2lmIFVTRV9TUExJVF9QVExPQ0tTCiB0eXBlZGVmIGF0b21pY19sb25nX3QgbW1fY291bnRlcl90OwotI2Vsc2UgIC8qIE5SX0NQVVMgPCBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVMgKi8KKyNlbHNlICAvKiAhVVNFX1NQTElUX1BUTE9DS1MgKi8KIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb3VudGVyX3Q7Ci0jZW5kaWYgLyogTlJfQ1BVUyA8IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUyAqLworI2VuZGlmIC8qICFVU0VfU1BMSVRfUFRMT0NLUyAqLwogCiAvKgogICogRWFjaCBwaHlzaWNhbCBwYWdlIGluIHRoZSBzeXN0ZW0gaGFzIGEgc3RydWN0IHBhZ2UgYXNzb2NpYXRlZCB3aXRoCkBAIC02NSw3ICs2Nyw3IEBACiAJCQkJCQkgKiBzZWUgUEFHRV9NQVBQSU5HX0FOT04gYmVsb3cuCiAJCQkJCQkgKi8KIAkgICAgfTsKLSNpZiBOUl9DUFVTID49IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUworI2lmIFVTRV9TUExJVF9QVExPQ0tTCiAJICAgIHNwaW5sb2NrX3QgcHRsOwogI2VuZGlmCiAJICAgIHN0cnVjdCBrbWVtX2NhY2hlICpzbGFiOwkvKiBTTFVCOiBQb2ludGVyIHRvIHNsYWIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCA5YzI4OGM5Li5iZGU4OTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC02NSw3ICs2NSw3IEBACiAJICogICAtRU5PU1lTIHdoZW4gbm90IHN1cHBvcnRlZCAoZXF1YWwgdG8gTlVMTCBjYWxsYmFjaykKIAkgKiAgIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgd2hlbiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkCiAJICoKLQkgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgZ2V0X3JvIGNhbGxiYWNrIHNob3VsZCBiZToKKwkgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgZ2V0X2NkIGNhbGxiYWNrIHNob3VsZCBiZToKIAkgKiAgIDAgZm9yIGEgYWJzZW50IGNhcmQKIAkgKiAgIDEgZm9yIGEgcHJlc2VudCBjYXJkCiAJICogICAtRU5PU1lTIHdoZW4gbm90IHN1cHBvcnRlZCAoZXF1YWwgdG8gTlVMTCBjYWxsYmFjaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9tbWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbW1kZWJ1Zy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgTElOVVhfTU1fREVCVUdfSAorI2RlZmluZSBMSU5VWF9NTV9ERUJVR19IIDEKKworI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisKKyNpZmRlZiBDT05GSUdfREVCVUdfVk0KKyNkZWZpbmUgVk1fQlVHX09OKGNvbmQpIEJVR19PTihjb25kKQorI2Vsc2UKKyNkZWZpbmUgVk1fQlVHX09OKGNvbmQpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RFQlVHX1ZJUlRVQUwKKyNkZWZpbmUgVklSVFVBTF9CVUdfT04oY29uZCkgQlVHX09OKGNvbmQpCisjZWxzZQorI2RlZmluZSBWSVJUVUFMX0JVR19PTihjb25kKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCA0NDNiYzdjLi40MjgzMjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTc1MSw4ICs3NTEsOSBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV4dCB6b25lIGF0IG9yIGJlbG93IGEgZ2l2ZW4gem9uZSBpbmRleCB0aGF0IGlzCiAgKiB3aXRoaW4gdGhlIGFsbG93ZWQgbm9kZW1hc2sgdXNpbmcgYSBjdXJzb3IgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUKLSAqIHNlYXJjaC4gVGhlIHpvbmVyZWYgcmV0dXJuZWQgaXMgYSBjdXJzb3IgdGhhdCBpcyB1c2VkIGFzIHRoZSBuZXh0IHN0YXJ0aW5nCi0gKiBwb2ludCBmb3IgZnV0dXJlIGNhbGxzIHRvIG5leHRfem9uZXNfem9uZWxpc3QoKS4KKyAqIHNlYXJjaC4gVGhlIHpvbmVyZWYgcmV0dXJuZWQgaXMgYSBjdXJzb3IgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHpvbmUKKyAqIGJlaW5nIGV4YW1pbmVkLiBJdCBzaG91bGQgYmUgYWR2YW5jZWQgYnkgb25lIGJlZm9yZSBjYWxsaW5nCisgKiBuZXh0X3pvbmVzX3pvbmVsaXN0IGFnYWluLgogICovCiBzdHJ1Y3Qgem9uZXJlZiAqbmV4dF96b25lc196b25lbGlzdChzdHJ1Y3Qgem9uZXJlZiAqeiwKIAkJCQkJZW51bSB6b25lX3R5cGUgaGlnaGVzdF96b25laWR4LApAQCAtNzY4LDkgKzc2OSw4IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCB6b25lIGF0IG9yIGJlbG93IGEgZ2l2ZW4gem9uZSBpbmRleCB0aGF0IGlzCiAgKiB3aXRoaW4gdGhlIGFsbG93ZWQgbm9kZW1hc2suIFRoZSB6b25lcmVmIHJldHVybmVkIGlzIGEgY3Vyc29yIHRoYXQgY2FuIGJlCi0gKiB1c2VkIHRvIGl0ZXJhdGUgdGhlIHpvbmVsaXN0IHdpdGggbmV4dF96b25lc196b25lbGlzdC4gVGhlIGN1cnNvciBzaG91bGQKLSAqIG5vdCBiZSB1c2VkIGJ5IHRoZSBjYWxsZXIgYXMgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSB6b25lCi0gKiByZXR1cm5lZC4KKyAqIHVzZWQgdG8gaXRlcmF0ZSB0aGUgem9uZWxpc3Qgd2l0aCBuZXh0X3pvbmVzX3pvbmVsaXN0IGJ5IGFkdmFuY2luZyBpdCBieQorICogb25lIGJlZm9yZSBjYWxsaW5nLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lcmVmICpmaXJzdF96b25lc196b25lbGlzdChzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAogCQkJCQllbnVtIHpvbmVfdHlwZSBoaWdoZXN0X3pvbmVpZHgsCkBAIC03OTUsNyArNzk1LDcgQEAKICNkZWZpbmUgZm9yX2VhY2hfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCB6bGlzdCwgaGlnaGlkeCwgbm9kZW1hc2spIFwKIAlmb3IgKHogPSBmaXJzdF96b25lc196b25lbGlzdCh6bGlzdCwgaGlnaGlkeCwgbm9kZW1hc2ssICZ6b25lKTsJXAogCQl6b25lOwkJCQkJCQlcCi0JCXogPSBuZXh0X3pvbmVzX3pvbmVsaXN0KHosIGhpZ2hpZHgsIG5vZGVtYXNrLCAmem9uZSkpCVwKKwkJeiA9IG5leHRfem9uZXNfem9uZWxpc3QoKyt6LCBoaWdoaWR4LCBub2RlbWFzaywgJnpvbmUpKQlcCiAKIC8qKgogICogZm9yX2VhY2hfem9uZV96b25lbGlzdCAtIGhlbHBlciBtYWNybyB0byBpdGVyYXRlIG92ZXIgdmFsaWQgem9uZXMgaW4gYSB6b25lbGlzdCBhdCBvciBiZWxvdyBhIGdpdmVuIHpvbmUgaW5kZXgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCmluZGV4IGM0ZGI1ODIuLmViNzFiNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaApAQCAtMTMxLDYgKzEzMSwxNiBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUwkweDAxMDAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfUFJPVE9DT0wJMHgwMjAwCiAKKyNkZWZpbmUgSElEX0FOWV9JRAkJCQkofjApCisKK3N0cnVjdCBoaWRfZGV2aWNlX2lkIHsKKwlfX3UxNiBidXM7CisJX191MzIgdmVuZG9yOworCV9fdTMyIHByb2R1Y3Q7CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGEKKwkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2Yoa2VybmVsX3Vsb25nX3QpKSkpOworfTsKKwogLyogczM5MCBDQ1cgZGV2aWNlcyAqLwogc3RydWN0IGNjd19kZXZpY2VfaWQgewogCV9fdTE2CW1hdGNoX2ZsYWdzOwkvKiB3aGljaCBmaWVsZHMgdG8gbWF0Y2ggYWdhaW5zdCAqLwpAQCAtMjc0LDcgKzI4NCw3IEBACiAvKiBJbnB1dCAqLwogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfRVZfTUFYCQkweDFmCiAjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9LRVlfTUlOX0lOVEVSRVNUSU5HCTB4NzEKLSNkZWZpbmUgSU5QVVRfREVWSUNFX0lEX0tFWV9NQVgJCTB4MWZmCisjZGVmaW5lIElOUFVUX0RFVklDRV9JRF9LRVlfTUFYCQkweDJmZgogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfUkVMX01BWAkJMHgwZgogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfQUJTX01BWAkJMHgzZgogI2RlZmluZSBJTlBVVF9ERVZJQ0VfSURfTVNDX01BWAkJMHgwNwpAQCAtMzg4LDUgKzM5OCw1MiBAQAogCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2Yoa2VybmVsX3Vsb25nX3QpKSkpOwogfTsKIAorLyogZG1pICovCitlbnVtIGRtaV9maWVsZCB7CisJRE1JX05PTkUsCisJRE1JX0JJT1NfVkVORE9SLAorCURNSV9CSU9TX1ZFUlNJT04sCisJRE1JX0JJT1NfREFURSwKKwlETUlfU1lTX1ZFTkRPUiwKKwlETUlfUFJPRFVDVF9OQU1FLAorCURNSV9QUk9EVUNUX1ZFUlNJT04sCisJRE1JX1BST0RVQ1RfU0VSSUFMLAorCURNSV9QUk9EVUNUX1VVSUQsCisJRE1JX0JPQVJEX1ZFTkRPUiwKKwlETUlfQk9BUkRfTkFNRSwKKwlETUlfQk9BUkRfVkVSU0lPTiwKKwlETUlfQk9BUkRfU0VSSUFMLAorCURNSV9CT0FSRF9BU1NFVF9UQUcsCisJRE1JX0NIQVNTSVNfVkVORE9SLAorCURNSV9DSEFTU0lTX1RZUEUsCisJRE1JX0NIQVNTSVNfVkVSU0lPTiwKKwlETUlfQ0hBU1NJU19TRVJJQUwsCisJRE1JX0NIQVNTSVNfQVNTRVRfVEFHLAorCURNSV9TVFJJTkdfTUFYLAorfTsKKworc3RydWN0IGRtaV9zdHJtYXRjaCB7CisJdW5zaWduZWQgY2hhciBzbG90OworCWNoYXIgc3Vic3RyWzc5XTsKK307CisKKyNpZm5kZWYgX19LRVJORUxfXworc3RydWN0IGRtaV9zeXN0ZW1faWQgeworCWtlcm5lbF91bG9uZ190IGNhbGxiYWNrOworCWtlcm5lbF91bG9uZ190IGlkZW50OworCXN0cnVjdCBkbWlfc3RybWF0Y2ggbWF0Y2hlc1s0XTsKKwlrZXJuZWxfdWxvbmdfdCBkcml2ZXJfZGF0YQorCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2Yoa2VybmVsX3Vsb25nX3QpKSkpOworfTsKKyNlbHNlCitzdHJ1Y3QgZG1pX3N5c3RlbV9pZCB7CisJaW50ICgqY2FsbGJhY2spKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICopOworCWNvbnN0IGNoYXIgKmlkZW50OworCXN0cnVjdCBkbWlfc3RybWF0Y2ggbWF0Y2hlc1s0XTsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisjZW5kaWYKKworI2RlZmluZSBETUlfTUFUQ0goYSwgYikJeyBhLCBiIH0KIAogI2VuZGlmIC8qIExJTlVYX01PRF9ERVZJQ0VUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCA2OGUwOTU1Li5hNDE1NTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTM0NSw3ICszNDUsNiBAQAogCS8qIFJlZmVyZW5jZSBjb3VudHMgKi8KIAlzdHJ1Y3QgbW9kdWxlX3JlZiByZWZbTlJfQ1BVU107CiAjZW5kaWYKLQogfTsKICNpZm5kZWYgTU9EVUxFX0FSQ0hfSU5JVAogI2RlZmluZSBNT0RVTEVfQVJDSF9JTklUIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vdW50LmggYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKaW5kZXggMzBhMWQ2My4uY2FiMmE4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW91bnQuaApAQCAtNSw4ICs1LDYgQEAKICAqCiAgKiBBdXRob3I6ICBNYXJjbyB2YW4gV2llcmluZ2VuIDxtdndAcGxhbmV0cy5lbG0ubmV0PgogICoKLSAqIFZlcnNpb246ICRJZDogbW91bnQuaCx2IDIuMCAxOTk2LzExLzE3IDE2OjQ4OjE0IG12dyBFeHAgbXZ3ICQKLSAqCiAgKi8KICNpZm5kZWYgX0xJTlVYX01PVU5UX0gKICNkZWZpbmUgX0xJTlVYX01PVU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2Jsa3RyYW5zLmggYi9pbmNsdWRlL2xpbnV4L210ZC9ibGt0cmFucy5oCmluZGV4IDMxMGU2MTYuLjhiNGFhMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2Jsa3RyYW5zLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvYmxrdHJhbnMuaApAQCAtNDEsNiArNDEsOCBAQAogCQkgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY2hhciAqYnVmZmVyKTsKIAlpbnQgKCp3cml0ZXNlY3QpKHN0cnVjdCBtdGRfYmxrdHJhbnNfZGV2ICpkZXYsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBibG9jaywgY2hhciAqYnVmZmVyKTsKKwlpbnQgKCpkaXNjYXJkKShzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiAqZGV2LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9jaywgdW5zaWduZWQgbnJfYmxvY2tzKTsKIAogCS8qIEJsb2NrIGxheWVyIGlvY3RscyAqLwogCWludCAoKmdldGdlbykoc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdjY0M3h4X2V0aC5oIGIvaW5jbHVkZS9saW51eC9tdjY0M3h4X2V0aC5oCmluZGV4IDEyMDc4NTcuLmNiYmJlOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXY2NDN4eF9ldGguaAorKysgYi9pbmNsdWRlL2xpbnV4L212NjQzeHhfZXRoLmgKQEAgLTE3LDkgKzE3LDE0IEBACiAKIHN0cnVjdCBtdjY0M3h4X2V0aF9zaGFyZWRfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbwkqZHJhbTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpzaGFyZWRfc21pOwogCXVuc2lnbmVkIGludAkJdF9jbGs7CiB9OwogCisjZGVmaW5lIE1WNjQzWFhfRVRIX1BIWV9BRERSX0RFRkFVTFQJMAorI2RlZmluZSBNVjY0M1hYX0VUSF9QSFlfQUREUih4KQkJKDB4ODAgfCAoeCkpCisjZGVmaW5lIE1WNjQzWFhfRVRIX1BIWV9OT05FCQkweGZmCisKIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIHsKIAkvKgogCSAqIFBvaW50ZXIgYmFjayB0byBvdXIgcGFyZW50IGluc3RhbmNlLCBhbmQgb3VyIHBvcnQgbnVtYmVyLgpAQCAtMzAsOCArMzUsNiBAQAogCS8qCiAJICogV2hldGhlciBhIFBIWSBpcyBwcmVzZW50LCBhbmQgaWYgeWVzLCBhdCB3aGljaCBhZGRyZXNzLgogCSAqLwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnNoYXJlZF9zbWk7Ci0JaW50CQkJZm9yY2VfcGh5X2FkZHI7CiAJaW50CQkJcGh5X2FkZHI7CiAKIAkvKgpAQCAtNDksMTAgKzUyLDEwIEBACiAJaW50CQkJZHVwbGV4OwogCiAJLyoKLQkgKiBXaGljaCBSWC9UWCBxdWV1ZXMgdG8gdXNlLgorCSAqIEhvdyBtYW55IFJYL1RYIHF1ZXVlcyB0byB1c2UuCiAJICovCi0JaW50CQkJcnhfcXVldWVfbWFzazsKLQlpbnQJCQl0eF9xdWV1ZV9tYXNrOworCWludAkJCXJ4X3F1ZXVlX2NvdW50OworCWludAkJCXR4X3F1ZXVlX2NvdW50OwogCiAJLyoKIAkgKiBPdmVycmlkZSBkZWZhdWx0IFJYL1RYIHF1ZXVlIHNpemVzIGlmIG5vbnplcm8uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCA0ODhjNTZlLi42NDg3NTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTExLDcgKzExLDcgQEAKICAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KICAqCQlDb3JleSBNaW55YXJkIDx3Zi1yY2ghbWlueWFyZEByZWxheS5FVS5uZXQ+CiAgKgkJRG9uYWxkIEouIEJlY2tlciwgPGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdj4KLSAqCQlBbGFuIENveCwgPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQlCam9ybiBFa3dhbGwuIDxiajBybkBibG94LnNlPgogICogICAgICAgICAgICAgIFBla2thIFJpaWtvbmVuIDxwcmlpa29uZUBwb3NlaWRvbi5wc3B0LmZpPgogICoKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L2RzYS5oPgogCiBzdHJ1Y3Qgdmxhbl9ncm91cDsKIHN0cnVjdCBldGh0b29sX29wczsKQEAgLTQ3MSw2ICs0NzIsOCBAQAogCWNoYXIJCQluYW1lW0lGTkFNU0laXTsKIAkvKiBkZXZpY2UgbmFtZSBoYXNoIGNoYWluICovCiAJc3RydWN0IGhsaXN0X25vZGUJbmFtZV9obGlzdDsKKwkvKiBzbm1wIGFsaWFzICovCisJY2hhciAJCQkqaWZhbGlhczsKIAogCS8qCiAJICoJSS9PIHNwZWNpZmljIGZpZWxkcwpAQCAtNjA1LDYgKzYwOCw5IEBACiAKIAkvKiBQcm90b2NvbCBzcGVjaWZpYyBwb2ludGVycyAqLwogCQorI2lmZGVmIENPTkZJR19ORVRfRFNBCisJdm9pZAkJCSpkc2FfcHRyOwkvKiBkc2Egc3BlY2lmaWMgZGF0YSAqLworI2VuZGlmCiAJdm9pZCAJCQkqYXRhbGtfcHRyOwkvKiBBcHBsZVRhbGsgbGluayAJKi8KIAl2b2lkCQkJKmlwX3B0cjsJLyogSVB2NCBzcGVjaWZpYyBkYXRhCSovICAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAqZG5fcHRyOyAgICAgICAgLyogREVDbmV0IHNwZWNpZmljIGRhdGEgKi8KQEAgLTc5Niw2ICs4MDIsMjYgQEAKICNlbmRpZgogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbmV0ZGV2X3VzZXNfZHNhX3RhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfRFNBCisJaWYgKGRldi0+ZHNhX3B0ciAhPSBOVUxMKQorCQlyZXR1cm4gZHNhX3VzZXNfZHNhX3RhZ3MoZGV2LT5kc2FfcHRyKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZXRkZXZfdXNlc190cmFpbGVyX3RhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUgorCWlmIChkZXYtPmRzYV9wdHIgIT0gTlVMTCkKKwkJcmV0dXJuIGRzYV91c2VzX3RyYWlsZXJfdGFncyhkZXYtPmRzYV9wdHIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKgluZXRkZXZfcHJpdiAtIGFjY2VzcyBuZXR3b3JrIGRldmljZSBwcml2YXRlIGRhdGEKICAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCkBAIC0xMjIzLDcgKzEyNDksOCBAQAogZXh0ZXJuIGludAkJZGV2X2V0aHRvb2woc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaWZyZXEgKik7CiBleHRlcm4gdW5zaWduZWQJCWRldl9nZXRfZmxhZ3MoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKik7CiBleHRlcm4gaW50CQlkZXZfY2hhbmdlX2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkKTsKLWV4dGVybiBpbnQJCWRldl9jaGFuZ2VfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBjaGFyICopOworZXh0ZXJuIGludAkJZGV2X2NoYW5nZV9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50CQlkZXZfc2V0X2FsaWFzKHN0cnVjdCBuZXRfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBpbnQJCWRldl9jaGFuZ2VfbmV0X25hbWVzcGFjZShzdHJ1Y3QgbmV0X2RldmljZSAqLAogCQkJCQkJIHN0cnVjdCBuZXQgKiwgY29uc3QgY2hhciAqKTsKIGV4dGVybiBpbnQJCWRldl9zZXRfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CkBAIC0xNjY3LDcgKzE2OTQsNyBAQAogZXh0ZXJuIGludCBuZXRkZXZfY2xhc3NfY3JlYXRlX2ZpbGUoc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqY2xhc3NfYXR0cik7CiBleHRlcm4gdm9pZCBuZXRkZXZfY2xhc3NfcmVtb3ZlX2ZpbGUoc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqY2xhc3NfYXR0cik7CiAKLWV4dGVybiBjaGFyICpuZXRkZXZfZHJpdmVybmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWZmZXIsIGludCBsZW4pOworZXh0ZXJuIGNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CiAKIGV4dGVybiB2b2lkIGxpbmt3YXRjaF9ydW5fcXVldWUodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IDBjNWViN2UuLjQ4Y2ZlNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtNSwxMyArNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtNTIsNiArNTAsMTYgQEAKIAlORl9JTkVUX05VTUhPT0tTCiB9OwogCitlbnVtIHsKKwlORlBST1RPX1VOU1BFQyA9ICAwLAorCU5GUFJPVE9fSVBWNCAgID0gIDIsCisJTkZQUk9UT19BUlAgICAgPSAgMywKKwlORlBST1RPX0JSSURHRSA9ICA3LAorCU5GUFJPVE9fSVBWNiAgID0gMTAsCisJTkZQUk9UT19ERUNORVQgPSAxMiwKKwlORlBST1RPX05VTVBST1RPLAorfTsKKwogdW5pb24gbmZfaW5ldF9hZGRyIHsKIAlfX3UzMgkJYWxsWzRdOwogCV9fYmUzMgkJaXA7CkBAIC05Miw4ICsxMDAsOCBAQAogCS8qIFVzZXIgZmlsbHMgaW4gZnJvbSBoZXJlIGRvd24uICovCiAJbmZfaG9va2ZuICpob29rOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCWludCBwZjsKLQlpbnQgaG9va251bTsKKwl1X2ludDhfdCBwZjsKKwl1bnNpZ25lZCBpbnQgaG9va251bTsKIAkvKiBIb29rcyBhcmUgb3JkZXJlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkuICovCiAJaW50IHByaW9yaXR5OwogfTsKQEAgLTEwMiw3ICsxMTAsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAotCWludCBwZjsKKwl1X2ludDhfdCBwZjsKIAogCS8qIE5vbi1pbmNsdXNpdmUgcmFuZ2VzOiB1c2UgMC8wL05VTEwgdG8gbmV2ZXIgZ2V0IGNhbGxlZC4gKi8KIAlpbnQgc2V0X29wdG1pbjsKQEAgLTEzOCw5ICsxNDYsOSBAQAogZXh0ZXJuIHN0cnVjdCBjdGxfcGF0aCBuZl9uZXRfaXB2NF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGhbXTsKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG5mX2hvb2tzW05QUk9UT11bTkZfTUFYX0hPT0tTXTsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG5mX2hvb2tzW05GUFJPVE9fTlVNUFJPVE9dW05GX01BWF9IT09LU107CiAKLWludCBuZl9ob29rX3Nsb3coaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCBuZl9ob29rX3Nsb3codV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAogCQkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksIGludCB0aHJlc2gpOwogCkBAIC0xNTEsNyArMTU5LDcgQEAKICAqCW9rZm4gbXVzdCBiZSBpbnZva2VkIGJ5IHRoZSBjYWxsZXIgaW4gdGhpcyBjYXNlLiAgQW55IG90aGVyIHJldHVybgogICoJdmFsdWUgaW5kaWNhdGVzIHRoZSBwYWNrZXQgaGFzIGJlZW4gY29uc3VtZWQgYnkgdGhlIGhvb2suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2tfdGhyZXNoKGludCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCitzdGF0aWMgaW5saW5lIGludCBuZl9ob29rX3RocmVzaCh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKQEAgLTE2Nyw3ICsxNzUsNyBAQAogCXJldHVybiBuZl9ob29rX3Nsb3cocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CkBAIC0yMTIsMTQgKzIyMCwxNCBAQAogCU5GX0hPT0tfVEhSRVNIKHBmLCBob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4sIElOVF9NSU4pCiAKIC8qIENhbGwgc2V0c29ja29wdCgpICovCi1pbnQgbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IG9wdHZhbCwgY2hhciBfX3VzZXIgKm9wdCwgCitpbnQgbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLCBpbnQgb3B0dmFsLCBjaGFyIF9fdXNlciAqb3B0LAogCQkgIGludCBsZW4pOwotaW50IG5mX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgcGYsIGludCBvcHR2YWwsIGNoYXIgX191c2VyICpvcHQsCitpbnQgbmZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLCBpbnQgb3B0dmFsLCBjaGFyIF9fdXNlciAqb3B0LAogCQkgIGludCAqbGVuKTsKIAotaW50IGNvbXBhdF9uZl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IHBmLCBpbnQgb3B0dmFsLAoraW50IGNvbXBhdF9uZl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgdV9pbnQ4X3QgcGYsIGludCBvcHR2YWwsCiAJCWNoYXIgX191c2VyICpvcHQsIGludCBsZW4pOwotaW50IGNvbXBhdF9uZl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IHBmLCBpbnQgb3B0dmFsLAoraW50IGNvbXBhdF9uZl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgdV9pbnQ4X3QgcGYsIGludCBvcHR2YWwsCiAJCWNoYXIgX191c2VyICpvcHQsIGludCAqbGVuKTsKIAogLyogQ2FsbCB0aGlzIGJlZm9yZSBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgcGFja2V0OiBlbnN1cmVzIGl0IGlzCkBAIC0yNDcsNyArMjU1LDcgQEAKIAlpbnQJCXJvdXRlX2tleV9zaXplOwogfTsKIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKm5mX2FmaW5mb1tOUFJPVE9dOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKm5mX2FmaW5mb1tORlBST1RPX05VTVBST1RPXTsKIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IG5mX2FmaW5mbyAqbmZfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCiB7CiAJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZShuZl9hZmluZm9bZmFtaWx5XSk7CkBAIC0yOTIsNyArMzAwLDcgQEAKIGV4dGVybiB2b2lkICgqaXBfbmF0X2RlY29kZV9zZXNzaW9uKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgZmxvd2kgKik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotbmZfbmF0X2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpCituZl9uYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCwgdV9pbnQ4X3QgZmFtaWx5KQogewogI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAJdm9pZCAoKmRlY29kZWZuKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgZmxvd2kgKik7CkBAIC0zMTUsNyArMzIzLDcgQEAKICNlbHNlIC8qICFDT05GSUdfTkVURklMVEVSICovCiAjZGVmaW5lIE5GX0hPT0socGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbikgKG9rZm4pKHNrYikKICNkZWZpbmUgTkZfSE9PS19DT05EKHBmLCBob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4sIGNvbmQpIChva2ZuKShza2IpCi1zdGF0aWMgaW5saW5lIGludCBuZl9ob29rX3RocmVzaChpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLAorc3RhdGljIGlubGluZSBpbnQgbmZfaG9va190aHJlc2godV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCiAJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCkBAIC0zMjQsNyArMzMyLDcgQEAKIHsKIAlyZXR1cm4gb2tmbihza2IpOwogfQotc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CkBAIC0zMzIsNyArMzQwLDkgQEAKIH0KIHN0cnVjdCBmbG93aTsKIHN0YXRpYyBpbmxpbmUgdm9pZAotbmZfbmF0X2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpIHt9CituZl9uYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCwgdV9pbnQ4X3QgZmFtaWx5KQoreworfQogI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUiovCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCkBAIC0zNDMsNTYgKzM1Myw1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfYXR0YWNoKHN0cnVjdCBza19idWZmICpuZXcsIHN0cnVjdCBza19idWZmICpza2IpIHt9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpuZl9wcmVfcm91dGluZ19uZXQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCi17Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJldHVybiBpbi0+bmRfbmV0OwotI2Vsc2UKLQlyZXR1cm4gJmluaXRfbmV0OwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqbmZfbG9jYWxfaW5fbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQotewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlyZXR1cm4gaW4tPm5kX25ldDsKLSNlbHNlCi0JcmV0dXJuICZpbml0X25ldDsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKm5mX2ZvcndhcmRfbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCi17Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCUJVR19PTihpbi0+bmRfbmV0ICE9IG91dC0+bmRfbmV0KTsKLQlyZXR1cm4gaW4tPm5kX25ldDsKLSNlbHNlCi0JcmV0dXJuICZpbml0X25ldDsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKm5mX2xvY2FsX291dF9uZXQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQotewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlyZXR1cm4gb3V0LT5uZF9uZXQ7Ci0jZWxzZQotCXJldHVybiAmaW5pdF9uZXQ7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpuZl9wb3N0X3JvdXRpbmdfbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCkKLXsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0JcmV0dXJuIG91dC0+bmRfbmV0OwotI2Vsc2UKLQlyZXR1cm4gJmluaXRfbmV0OwotI2VuZGlmCi19Ci0KICNlbmRpZiAvKl9fS0VSTkVMX18qLwogI2VuZGlmIC8qX19MSU5VWF9ORVRGSUxURVJfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKaW5kZXggM2FmZjUxMy4uNWE4YWY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZApAQCAtMzIsNiArMzIsNyBAQAogaGVhZGVyLXkgKz0geHRfcGt0dHlwZS5oCiBoZWFkZXIteSArPSB4dF9yYXRlZXN0LmgKIGhlYWRlci15ICs9IHh0X3JlYWxtLmgKK2hlYWRlci15ICs9IHh0X3JlY2VudC5oCiBoZWFkZXIteSArPSB4dF9zY3RwLmgKIGhlYWRlci15ICs9IHh0X3N0YXRlLmgKIGhlYWRlci15ICs9IHh0X3N0YXRpc3RpYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKaW5kZXggNTM1ZTQyMTkuLjJhMTBlZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKQEAgLTg3LDcgKzg3LDcgQEAKIC8qIGRlbGV0ZSBrZXltYXAgZW50cmllcyAqLwogdm9pZCBuZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm4gKmN0KTsKIAotZXh0ZXJuIHZvaWQgbmZfY3RfZ3JlX2tleW1hcF9mbHVzaCh2b2lkKTsKK2V4dGVybiB2b2lkIG5mX2N0X2dyZV9rZXltYXBfZmx1c2goc3RydWN0IG5ldCAqbmV0KTsKIGV4dGVybiB2b2lkIG5mX25hdF9uZWVkX2dyZSh2b2lkKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKaW5kZXggMGQ4NDI0ZjcuLjdkOGUwNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCkBAIC03OCw2ICs3OCw5IEBACiAJCQkgIGludCBlY2hvKTsKIGV4dGVybiBpbnQgbmZuZXRsaW5rX3VuaWNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHBpZCwgaW50IGZsYWdzKTsKIAorZXh0ZXJuIHZvaWQgbmZubF9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZubF91bmxvY2sodm9pZCk7CisKICNkZWZpbmUgTU9EVUxFX0FMSUFTX05GTkxfU1VCU1lTKHN1YnN5cykgXAogCU1PRFVMRV9BTElBUygibmZuZXRsaW5rLXN1YnN5cy0iIF9fc3RyaW5naWZ5KHN1YnN5cykpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCmluZGV4IDIzMjYyOTYuLmJlNDFiNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaApAQCAtMTczLDYgKzE3Myw5OCBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKKy8qKgorICogc3RydWN0IHh0X21hdGNoX3BhcmFtIC0gcGFyYW1ldGVycyBmb3IgbWF0Y2ggZXh0ZW5zaW9ucycgbWF0Y2ggZnVuY3Rpb25zCisgKgorICogQGluOgkJaW5wdXQgbmV0ZGV2aWNlCisgKiBAb3V0OglvdXRwdXQgbmV0ZGV2aWNlCisgKiBAbWF0Y2g6CXN0cnVjdCB4dF9tYXRjaCB0aHJvdWdoIHdoaWNoIHRoaXMgZnVuY3Rpb24gd2FzIGludm9rZWQKKyAqIEBtYXRjaGluZm86CXBlci1tYXRjaCBkYXRhCisgKiBAZnJhZ29mZjoJcGFja2V0IGlzIGEgZnJhZ21lbnQsIHRoaXMgaXMgdGhlIGRhdGEgb2Zmc2V0CisgKiBAdGhvZmY6CXBvc2l0aW9uIG9mIHRyYW5zcG9ydCBoZWFkZXIgcmVsYXRpdmUgdG8gc2tiLT5kYXRhCisgKiBAaG90ZHJvcDoJZHJvcCBwYWNrZXQgaWYgd2UgaGFkIGluc3BlY3Rpb24gcHJvYmxlbXMKKyAqIEBmYW1pbHk6CUFjdHVhbCBORlBST1RPXyogdGhyb3VnaCB3aGljaCB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZAorICogCQkoaGVscGZ1bCB3aGVuIG1hdGNoLT5mYW1pbHkgPT0gTkZQUk9UT19VTlNQRUMpCisgKi8KK3N0cnVjdCB4dF9tYXRjaF9wYXJhbSB7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCAqb3V0OworCWNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgdm9pZCAqbWF0Y2hpbmZvOworCWludCBmcmFnb2ZmOworCXVuc2lnbmVkIGludCB0aG9mZjsKKwlib29sICpob3Rkcm9wOworCXVfaW50OF90IGZhbWlseTsKK307CisKKy8qKgorICogc3RydWN0IHh0X210Y2hrX3BhcmFtIC0gcGFyYW1ldGVycyBmb3IgbWF0Y2ggZXh0ZW5zaW9ucycKKyAqIGNoZWNrZW50cnkgZnVuY3Rpb25zCisgKgorICogQHRhYmxlOgl0YWJsZSB0aGUgcnVsZSBpcyB0cmllZCB0byBiZSBpbnNlcnRlZCBpbnRvCisgKiBAZW50cnlpbmZvOgl0aGUgZmFtaWx5LXNwZWNpZmljIHJ1bGUgZGF0YQorICogCQkoc3RydWN0IGlwdF9pcCwgaXA2dF9pcCwgZWJ0X2VudHJ5KQorICogQG1hdGNoOglzdHJ1Y3QgeHRfbWF0Y2ggdGhyb3VnaCB3aGljaCB0aGlzIGZ1bmN0aW9uIHdhcyBpbnZva2VkCisgKiBAbWF0Y2hpbmZvOglwZXItbWF0Y2ggZGF0YQorICogQGhvb2tfbWFzazoJdmlhIHdoaWNoIGhvb2tzIHRoZSBuZXcgcnVsZSBpcyByZWFjaGFibGUKKyAqLworc3RydWN0IHh0X210Y2hrX3BhcmFtIHsKKwljb25zdCBjaGFyICp0YWJsZTsKKwljb25zdCB2b2lkICplbnRyeWluZm87CisJY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwl2b2lkICptYXRjaGluZm87CisJdW5zaWduZWQgaW50IGhvb2tfbWFzazsKKwl1X2ludDhfdCBmYW1pbHk7Cit9OworCisvKiBNYXRjaCBkZXN0cnVjdG9yIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCB4dF9tdGR0b3JfcGFyYW0geworCWNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CisJdm9pZCAqbWF0Y2hpbmZvOworCXVfaW50OF90IGZhbWlseTsKK307CisKKy8qKgorICogc3RydWN0IHh0X3RhcmdldF9wYXJhbSAtIHBhcmFtZXRlcnMgZm9yIHRhcmdldCBleHRlbnNpb25zJyB0YXJnZXQgZnVuY3Rpb25zCisgKgorICogQGhvb2tudW06CWhvb2sgdGhyb3VnaCB3aGljaCB0aGlzIHRhcmdldCB3YXMgaW52b2tlZAorICogQHRhcmdldDoJc3RydWN0IHh0X3RhcmdldCB0aHJvdWdoIHdoaWNoIHRoaXMgZnVuY3Rpb24gd2FzIGludm9rZWQKKyAqIEB0YXJnaW5mbzoJcGVyLXRhcmdldCBkYXRhCisgKgorICogT3RoZXIgZmllbGRzIHNlZSBhYm92ZS4KKyAqLworc3RydWN0IHh0X3RhcmdldF9wYXJhbSB7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCAqb3V0OworCXVuc2lnbmVkIGludCBob29rbnVtOworCWNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwljb25zdCB2b2lkICp0YXJnaW5mbzsKKwl1X2ludDhfdCBmYW1pbHk7Cit9OworCisvKioKKyAqIHN0cnVjdCB4dF90Z2Noa19wYXJhbSAtIHBhcmFtZXRlcnMgZm9yIHRhcmdldCBleHRlbnNpb25zJworICogY2hlY2tlbnRyeSBmdW5jdGlvbnMKKyAqCisgKiBAZW50cnlpbmZvOgl0aGUgZmFtaWx5LXNwZWNpZmljIHJ1bGUgZGF0YQorICogCQkoc3RydWN0IGlwdF9lbnRyeSwgaXA2dF9lbnRyeSwgYXJwdF9lbnRyeSwgZWJ0X2VudHJ5KQorICoKKyAqIE90aGVyIGZpZWxkcyBzZWUgYWJvdmUuCisgKi8KK3N0cnVjdCB4dF90Z2Noa19wYXJhbSB7CisJY29uc3QgY2hhciAqdGFibGU7CisJdm9pZCAqZW50cnlpbmZvOworCWNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwl2b2lkICp0YXJnaW5mbzsKKwl1bnNpZ25lZCBpbnQgaG9va19tYXNrOworCXVfaW50OF90IGZhbWlseTsKK307CisKKy8qIFRhcmdldCBkZXN0cnVjdG9yIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCB4dF90Z2R0b3JfcGFyYW0geworCWNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKKwl2b2lkICp0YXJnaW5mbzsKKwl1X2ludDhfdCBmYW1pbHk7Cit9OworCiBzdHJ1Y3QgeHRfbWF0Y2gKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0xODUsMjQgKzI3NywxMyBAQAogCSAgIG5vbi1saW5lYXIgc2tiLCB1c2luZyBza2JfaGVhZGVyX3BvaW50ZXIgYW5kCiAJICAgc2tiX2lwX21ha2Vfd3JpdGFibGUuICovCiAJYm9vbCAoKm1hdGNoKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JCSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJICAgICAgaW50IG9mZnNldCwKLQkJICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCSAgICAgIGJvb2wgKmhvdGRyb3ApOworCQkgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKik7CiAKIAkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi0JLyogU2hvdWxkIHJldHVybiB0cnVlIG9yIGZhbHNlLiAqLwotCWJvb2wgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICBjb25zdCB2b2lkICppcCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JCQkgICB2b2lkICptYXRjaGluZm8sCi0JCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKTsKKwlib29sICgqY2hlY2tlbnRyeSkoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICopOwogCiAJLyogQ2FsbGVkIHdoZW4gZW50cnkgb2YgdGhpcyB0eXBlIGRlbGV0ZWQuICovCi0Jdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbyk7CisJdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF9tdGR0b3JfcGFyYW0gKik7CiAKIAkvKiBDYWxsZWQgd2hlbiB1c2Vyc3BhY2UgYWxpZ24gZGlmZmVycyBmcm9tIGtlcm5lbCBzcGFjZSBvbmUgKi8KIAl2b2lkICgqY29tcGF0X2Zyb21fdXNlcikodm9pZCAqZHN0LCB2b2lkICpzcmMpOwpAQCAtMjM1LDI0ICszMTYsMTYgQEAKIAkgICBtdXN0IG5vdyBoYW5kbGUgbm9uLWxpbmVhciBza2JzLCB1c2luZyBza2JfY29weV9iaXRzIGFuZAogCSAgIHNrYl9pcF9tYWtlX3dyaXRhYmxlLiAqLwogCXVuc2lnbmVkIGludCAoKnRhcmdldCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pOworCQkJICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKik7CiAKIAkvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGU6CiAgICAgICAgICAgIGhvb2tfbWFzayBpcyBhIGJpdG1hc2sgb2YgaG9va3MgZnJvbSB3aGljaCBpdCBjYW4gYmUKICAgICAgICAgICAgY2FsbGVkLiAqLwogCS8qIFNob3VsZCByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLQlib29sICgqY2hlY2tlbnRyeSkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgY29uc3Qgdm9pZCAqZW50cnksCi0JCQkgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgICB2b2lkICp0YXJnaW5mbywKLQkJCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spOworCWJvb2wgKCpjaGVja2VudHJ5KShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKik7CiAKIAkvKiBDYWxsZWQgd2hlbiBlbnRyeSBvZiB0aGlzIHR5cGUgZGVsZXRlZC4gKi8KLQl2b2lkICgqZGVzdHJveSkoY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbyk7CisJdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF90Z2R0b3JfcGFyYW0gKik7CiAKIAkvKiBDYWxsZWQgd2hlbiB1c2Vyc3BhY2UgYWxpZ24gZGlmZmVycyBmcm9tIGtlcm5lbCBzcGFjZSBvbmUgKi8KIAl2b2lkICgqY29tcGF0X2Zyb21fdXNlcikodm9pZCAqZHN0LCB2b2lkICpzcmMpOwpAQCAtMjkyLDcgKzM2NSw3IEBACiAJLyogU2V0IHRoaXMgdG8gVEhJU19NT0RVTEUgaWYgeW91IGFyZSBhIG1vZHVsZSwgb3RoZXJ3aXNlIE5VTEwgKi8KIAlzdHJ1Y3QgbW9kdWxlICptZTsKIAotCWludCBhZjsJCS8qIGFkZHJlc3MvcHJvdG9jb2wgZmFtaWx5ICovCisJdV9pbnQ4X3QgYWY7CQkvKiBhZGRyZXNzL3Byb3RvY29sIGZhbWlseSAqLwogfTsKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CkBAIC0zMjgsMTIgKzQwMSwxMCBAQAogZXh0ZXJuIGludCB4dF9yZWdpc3Rlcl9tYXRjaGVzKHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHVuc2lnbmVkIGludCBuKTsKIGV4dGVybiB2b2lkIHh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB1bnNpZ25lZCBpbnQgbik7CiAKLWV4dGVybiBpbnQgeHRfY2hlY2tfbWF0Y2goY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdW5zaWduZWQgc2hvcnQgZmFtaWx5LAotCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqdGFibGUsIHVuc2lnbmVkIGludCBob29rLAotCQkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgaW50IGludl9wcm90byk7Ci1leHRlcm4gaW50IHh0X2NoZWNrX3RhcmdldChjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHVuc2lnbmVkIHNob3J0IGZhbWlseSwKLQkJCSAgIHVuc2lnbmVkIGludCBzaXplLCBjb25zdCBjaGFyICp0YWJsZSwgdW5zaWduZWQgaW50IGhvb2ssCi0JCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgaW50IGludl9wcm90byk7CitleHRlcm4gaW50IHh0X2NoZWNrX21hdGNoKHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqLAorCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwgdV9pbnQ4X3QgcHJvdG8sIGJvb2wgaW52X3Byb3RvKTsKK2V4dGVybiBpbnQgeHRfY2hlY2tfdGFyZ2V0KHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqLAorCQkJICAgdW5zaWduZWQgaW50IHNpemUsIHVfaW50OF90IHByb3RvLCBib29sIGludl9wcm90byk7CiAKIGV4dGVybiBzdHJ1Y3QgeHRfdGFibGUgKnh0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkJICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLApAQCAtMzQ2LDE5ICs0MTcsMTkgQEAKIAkJCQkJICAgICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCQkJCSAgICAgIGludCAqZXJyb3IpOwogCi1leHRlcm4gc3RydWN0IHh0X21hdGNoICp4dF9maW5kX21hdGNoKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pOwotZXh0ZXJuIHN0cnVjdCB4dF90YXJnZXQgKnh0X2ZpbmRfdGFyZ2V0KGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pOwotZXh0ZXJuIHN0cnVjdCB4dF90YXJnZXQgKnh0X3JlcXVlc3RfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCAKK2V4dGVybiBzdHJ1Y3QgeHRfbWF0Y2ggKnh0X2ZpbmRfbWF0Y2godTggYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKTsKK2V4dGVybiBzdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9maW5kX3RhcmdldCh1OCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pOworZXh0ZXJuIHN0cnVjdCB4dF90YXJnZXQgKnh0X3JlcXVlc3RfZmluZF90YXJnZXQodTggYWYsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQl1OCByZXZpc2lvbik7Ci1leHRlcm4gaW50IHh0X2ZpbmRfcmV2aXNpb24oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50IHRhcmdldCwKLQkJCSAgICBpbnQgKmVycik7CitleHRlcm4gaW50IHh0X2ZpbmRfcmV2aXNpb24odTggYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAorCQkJICAgIGludCB0YXJnZXQsIGludCAqZXJyKTsKIAotZXh0ZXJuIHN0cnVjdCB4dF90YWJsZSAqeHRfZmluZF90YWJsZV9sb2NrKHN0cnVjdCBuZXQgKm5ldCwgaW50IGFmLAorZXh0ZXJuIHN0cnVjdCB4dF90YWJsZSAqeHRfZmluZF90YWJsZV9sb2NrKHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgYWYsCiAJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgeHRfdGFibGVfdW5sb2NrKHN0cnVjdCB4dF90YWJsZSAqdCk7CiAKLWV4dGVybiBpbnQgeHRfcHJvdG9faW5pdChzdHJ1Y3QgbmV0ICpuZXQsIGludCBhZik7Ci1leHRlcm4gdm9pZCB4dF9wcm90b19maW5pKHN0cnVjdCBuZXQgKm5ldCwgaW50IGFmKTsKK2V4dGVybiBpbnQgeHRfcHJvdG9faW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50OF90IGFmKTsKK2V4dGVybiB2b2lkIHh0X3Byb3RvX2Zpbmkoc3RydWN0IG5ldCAqbmV0LCB1X2ludDhfdCBhZik7CiAKIGV4dGVybiBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqeHRfYWxsb2NfdGFibGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSk7CiBleHRlcm4gdm9pZCB4dF9mcmVlX3RhYmxlX2luZm8oc3RydWN0IHh0X3RhYmxlX2luZm8gKmluZm8pOwpAQCAtNDIzLDEyICs0OTQsMTIgQEAKICNkZWZpbmUgQ09NUEFUX1hUX0FMSUdOKHMpICgoKHMpICsgKF9fYWxpZ25vZl9fKHN0cnVjdCBjb21wYXRfeHRfY291bnRlcnMpLTEpKSBcCiAJCSYgfihfX2FsaWdub2ZfXyhzdHJ1Y3QgY29tcGF0X3h0X2NvdW50ZXJzKS0xKSkKIAotZXh0ZXJuIHZvaWQgeHRfY29tcGF0X2xvY2soaW50IGFmKTsKLWV4dGVybiB2b2lkIHh0X2NvbXBhdF91bmxvY2soaW50IGFmKTsKK2V4dGVybiB2b2lkIHh0X2NvbXBhdF9sb2NrKHVfaW50OF90IGFmKTsKK2V4dGVybiB2b2lkIHh0X2NvbXBhdF91bmxvY2sodV9pbnQ4X3QgYWYpOwogCi1leHRlcm4gaW50IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KGludCBhZiwgdW5zaWduZWQgaW50IG9mZnNldCwgc2hvcnQgZGVsdGEpOwotZXh0ZXJuIHZvaWQgeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoaW50IGFmKTsKLWV4dGVybiBzaG9ydCB4dF9jb21wYXRfY2FsY19qdW1wKGludCBhZiwgdW5zaWduZWQgaW50IG9mZnNldCk7CitleHRlcm4gaW50IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KHVfaW50OF90IGFmLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaG9ydCBkZWx0YSk7CitleHRlcm4gdm9pZCB4dF9jb21wYXRfZmx1c2hfb2Zmc2V0cyh1X2ludDhfdCBhZik7CitleHRlcm4gc2hvcnQgeHRfY29tcGF0X2NhbGNfanVtcCh1X2ludDhfdCBhZiwgdW5zaWduZWQgaW50IG9mZnNldCk7CiAKIGV4dGVybiBpbnQgeHRfY29tcGF0X21hdGNoX29mZnNldChjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoKTsKIGV4dGVybiBpbnQgeHRfY29tcGF0X21hdGNoX2Zyb21fdXNlcihzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UUFJPWFkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RQUk9YWS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmU4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UUFJPWFkuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9YVF9UUFJPWFlfSF90YXJnZXQKKyNkZWZpbmUgX1hUX1RQUk9YWV9IX3RhcmdldAorCisvKiBUUFJPWFkgdGFyZ2V0IGlzIGNhcGFibGUgb2YgbWFya2luZyB0aGUgcGFja2V0IHRvIHBlcmZvcm0KKyAqIHJlZGlyZWN0aW9uLiBXZSBjYW4gZ2V0IHJpZCBvZiB0aGF0IHdoZW5ldmVyIHdlIGdldCBzdXBwb3J0IGZvcgorICogbXV0bGlwbGUgdGFyZ2V0cyBpbiB0aGUgc2FtZSBydWxlLiAqLworc3RydWN0IHh0X3Rwcm94eV90YXJnZXRfaW5mbyB7CisJdV9pbnQzMl90IG1hcmtfbWFzazsKKwl1X2ludDMyX3QgbWFya192YWx1ZTsKKwlfX2JlMzIgbGFkZHI7CisJX19iZTE2IGxwb3J0OworfTsKKworI2VuZGlmIC8qIF9YVF9UUFJPWFlfSF90YXJnZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlY2VudC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcmVjZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmZWI4MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlY2VudC5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX0xJTlVYX05FVEZJTFRFUl9YVF9SRUNFTlRfSAorI2RlZmluZSBfTElOVVhfTkVURklMVEVSX1hUX1JFQ0VOVF9IIDEKKworZW51bSB7CisJWFRfUkVDRU5UX0NIRUNLICAgID0gMSA8PCAwLAorCVhUX1JFQ0VOVF9TRVQgICAgICA9IDEgPDwgMSwKKwlYVF9SRUNFTlRfVVBEQVRFICAgPSAxIDw8IDIsCisJWFRfUkVDRU5UX1JFTU9WRSAgID0gMSA8PCAzLAorCVhUX1JFQ0VOVF9UVEwgICAgICA9IDEgPDwgNCwKKworCVhUX1JFQ0VOVF9TT1VSQ0UgICA9IDAsCisJWFRfUkVDRU5UX0RFU1QgICAgID0gMSwKKworCVhUX1JFQ0VOVF9OQU1FX0xFTiA9IDIwMCwKK307CisKK3N0cnVjdCB4dF9yZWNlbnRfbXRpbmZvIHsKKwl1X2ludDMyX3Qgc2Vjb25kczsKKwl1X2ludDMyX3QgaGl0X2NvdW50OworCXVfaW50OF90IGNoZWNrX3NldDsKKwl1X2ludDhfdCBpbnZlcnQ7CisJY2hhciBuYW1lW1hUX1JFQ0VOVF9OQU1FX0xFTl07CisJdV9pbnQ4X3Qgc2lkZTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfTkVURklMVEVSX1hUX1JFQ0VOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCmluZGV4IDg5MmY1YjcuLmQ0NWUyOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCkBAIC0zMSw2ICszMSw5IEBACiAgKiBUaGUgNCBsc2IgYXJlIG1vcmUgdGhhbiBlbm91Z2ggdG8gc3RvcmUgdGhlIHZlcmRpY3QuICovCiAjZGVmaW5lIEVCVF9WRVJESUNUX0JJVFMgMHgwMDAwMDAwRgogCitzdHJ1Y3QgeHRfbWF0Y2g7CitzdHJ1Y3QgeHRfdGFyZ2V0OworCiBzdHJ1Y3QgZWJ0X2NvdW50ZXIKIHsKIAl1aW50NjRfdCBwY250OwpAQCAtMTIxLDcgKzEyNCw3IEBACiB7CiAJdW5pb24gewogCQljaGFyIG5hbWVbRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwotCQlzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaDsKKwkJc3RydWN0IHh0X21hdGNoICptYXRjaDsKIAl9IHU7CiAJLyogc2l6ZSBvZiBkYXRhICovCiAJdW5zaWduZWQgaW50IG1hdGNoX3NpemU7CkBAIC0xMzIsNyArMTM1LDcgQEAKIHsKIAl1bmlvbiB7CiAJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Ci0JCXN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcjsKKwkJc3RydWN0IHh0X3RhcmdldCAqd2F0Y2hlcjsKIAl9IHU7CiAJLyogc2l6ZSBvZiBkYXRhICovCiAJdW5zaWduZWQgaW50IHdhdGNoZXJfc2l6ZTsKQEAgLTE0Myw3ICsxNDYsNyBAQAogewogCXVuaW9uIHsKIAkJY2hhciBuYW1lW0VCVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKLQkJc3RydWN0IGVidF90YXJnZXQgKnRhcmdldDsKKwkJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OwogCX0gdTsKIAkvKiBzaXplIG9mIGRhdGEgKi8KIAl1bnNpZ25lZCBpbnQgdGFyZ2V0X3NpemU7CkBAIC0yMDcsMTQgKzIxMCwxNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljb25zdCBjaGFyIG5hbWVbRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwotCS8qIDAgPT0gaXQgbWF0Y2hlcyAqLwotCWludCAoKm1hdGNoKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hkYXRhLAotCSAgIHVuc2lnbmVkIGludCBkYXRhbGVuKTsKLQkvKiAwID09IGxldCBpdCBpbiAqLwotCWludCAoKmNoZWNrKShjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLQkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICptYXRjaGRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKTsKLQl2b2lkICgqZGVzdHJveSkodm9pZCAqbWF0Y2hkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbik7CisJYm9vbCAoKm1hdGNoKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCisJCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCWJvb2wgKmhvdGRyb3ApOworCWJvb2wgKCpjaGVja2VudHJ5KShjb25zdCBjaGFyICp0YWJsZSwgY29uc3Qgdm9pZCAqZW50cnksCisJCWNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKKwkJdW5zaWduZWQgaW50IGhvb2tfbWFzayk7CisJdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbyk7CisJdW5zaWduZWQgaW50IG1hdGNoc2l6ZTsKKwl1X2ludDhfdCByZXZpc2lvbjsKKwl1X2ludDhfdCBmYW1pbHk7CiAJc3RydWN0IG1vZHVsZSAqbWU7CiB9OwogCkBAIC0yMjIsMTMgKzIyOCwxNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljb25zdCBjaGFyIG5hbWVbRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwotCXZvaWQgKCp3YXRjaGVyKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9va25yLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICBjb25zdCB2b2lkICp3YXRjaGVyZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pOwotCS8qIDAgPT0gbGV0IGl0IGluICovCi0JaW50ICgqY2hlY2spKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKndhdGNoZXJkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbik7Ci0Jdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKndhdGNoZXJkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbik7CisJdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCXVuc2lnbmVkIGludCBob29rX251bSwgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCQljb25zdCB2b2lkICp0YXJnaW5mbyk7CisJYm9vbCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlLCBjb25zdCB2b2lkICplbnRyeSwKKwkJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKKwkJdW5zaWduZWQgaW50IGhvb2tfbWFzayk7CisJdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8pOworCXVuc2lnbmVkIGludCB0YXJnZXRzaXplOworCXVfaW50OF90IHJldmlzaW9uOworCXVfaW50OF90IGZhbWlseTsKIAlzdHJ1Y3QgbW9kdWxlICptZTsKIH07CiAKQEAgLTIzNiwxNCArMjQ2LDE4IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNvbnN0IGNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Ci0JLyogcmV0dXJucyBvbmUgb2YgdGhlIHN0YW5kYXJkIHZlcmRpY3RzICovCi0JaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9va25yLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICBjb25zdCB2b2lkICp0YXJnZXRkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbik7Ci0JLyogMCA9PSBsZXQgaXQgaW4gKi8KLQlpbnQgKCpjaGVjaykoY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCi0JICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqdGFyZ2V0ZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pOwotCXZvaWQgKCpkZXN0cm95KSh2b2lkICp0YXJnZXRkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbik7CisJLyogcmV0dXJucyBvbmUgb2YgdGhlIHN0YW5kYXJkIEVCVF8qIHZlcmRpY3RzICovCisJdW5zaWduZWQgaW50ICgqdGFyZ2V0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCXVuc2lnbmVkIGludCBob29rX251bSwgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCQljb25zdCB2b2lkICp0YXJnaW5mbyk7CisJYm9vbCAoKmNoZWNrZW50cnkpKGNvbnN0IGNoYXIgKnRhYmxlLCBjb25zdCB2b2lkICplbnRyeSwKKwkJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKKwkJdW5zaWduZWQgaW50IGhvb2tfbWFzayk7CisJdm9pZCAoKmRlc3Ryb3kpKGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8pOworCXVuc2lnbmVkIGludCB0YXJnZXRzaXplOworCXVfaW50OF90IHJldmlzaW9uOworCXVfaW50OF90IGZhbWlseTsKIAlzdHJ1Y3QgbW9kdWxlICptZTsKIH07CiAKQEAgLTI4OCwxMiArMzAyLDYgQEAKIAkJICAgICB+KF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSktMSkpCiBleHRlcm4gaW50IGVidF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgZWJ0X3RhYmxlICp0YWJsZSk7CiBleHRlcm4gdm9pZCBlYnRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgZWJ0X3RhYmxlICp0YWJsZSk7Ci1leHRlcm4gaW50IGVidF9yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaCk7Ci1leHRlcm4gdm9pZCBlYnRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgZWJ0X21hdGNoICptYXRjaCk7Ci1leHRlcm4gaW50IGVidF9yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcik7Ci1leHRlcm4gdm9pZCBlYnRfdW5yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcik7Ci1leHRlcm4gaW50IGVidF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGVidF90YXJnZXQgKnRhcmdldCk7Ci1leHRlcm4gdm9pZCBlYnRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGVidF90YXJnZXQgKnRhcmdldCk7CiBleHRlcm4gdW5zaWduZWQgaW50IGVidF9kb190YWJsZSh1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgIHN0cnVjdCBlYnRfdGFibGUgKnRhYmxlKTsKQEAgLTMwMiw5ICszMTAsOSBAQAogI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKGluZm8tPmludmZsYWdzICYgaW52ZmxnKSkKIC8qIFRydWUgaWYgdGhlIGhvb2sgbWFzayBkZW5vdGVzIHRoYXQgdGhlIHJ1bGUgaXMgaW4gYSBiYXNlIGNoYWluLAogICogdXNlZCBpbiB0aGUgY2hlY2soKSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQkFTRV9DSEFJTiAoaG9va21hc2sgJiAoMSA8PCBORl9CUl9OVU1IT09LUykpCisjZGVmaW5lIEJBU0VfQ0hBSU4gKHBhci0+aG9va19tYXNrICYgKDEgPDwgTkZfQlJfTlVNSE9PS1MpKQogLyogQ2xlYXIgdGhlIGJpdCBpbiB0aGUgaG9vayBtYXNrIHRoYXQgdGVsbHMgaWYgdGhlIHJ1bGUgaXMgb24gYSBiYXNlIGNoYWluICovCi0jZGVmaW5lIENMRUFSX0JBU0VfQ0hBSU5fQklUIChob29rbWFzayAmPSB+KDEgPDwgTkZfQlJfTlVNSE9PS1MpKQorI2RlZmluZSBDTEVBUl9CQVNFX0NIQUlOX0JJVCAocGFyLT5ob29rX21hc2sgJj0gfigxIDw8IE5GX0JSX05VTUhPT0tTKSkKIC8qIFRydWUgaWYgdGhlIHRhcmdldCBpcyBub3QgYSBzdGFuZGFyZCB0YXJnZXQgKi8KICNkZWZpbmUgSU5WQUxJRF9UQVJHRVQgKGluZm8tPnRhcmdldCA8IC1OVU1fU1RBTkRBUkRfVEFSR0VUUyB8fCBpbmZvLT50YXJnZXQgPj0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVjZW50LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaAppbmRleCA2NTA4YTQ1Li5kNjM2Y2NhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaApAQCAtMSwyNyArMSwyMSBAQAogI2lmbmRlZiBfSVBUX1JFQ0VOVF9ICiAjZGVmaW5lIF9JUFRfUkVDRU5UX0gKIAotI2RlZmluZSBSRUNFTlRfTkFNRQkiaXB0X3JlY2VudCIKLSNkZWZpbmUgUkVDRU5UX1ZFUgkidjAuMy4xIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9yZWNlbnQuaD4KIAotI2RlZmluZSBJUFRfUkVDRU5UX0NIRUNLICAxCi0jZGVmaW5lIElQVF9SRUNFTlRfU0VUICAgIDIKLSNkZWZpbmUgSVBUX1JFQ0VOVF9VUERBVEUgNAotI2RlZmluZSBJUFRfUkVDRU5UX1JFTU9WRSA4Ci0jZGVmaW5lIElQVF9SRUNFTlRfVFRMICAgMTYKKyNkZWZpbmUgaXB0X3JlY2VudF9pbmZvIHh0X3JlY2VudF9tdGluZm8KIAotI2RlZmluZSBJUFRfUkVDRU5UX1NPVVJDRSAwCi0jZGVmaW5lIElQVF9SRUNFTlRfREVTVCAgIDEKK2VudW0geworCUlQVF9SRUNFTlRfQ0hFQ0sgICAgPSBYVF9SRUNFTlRfQ0hFQ0ssCisJSVBUX1JFQ0VOVF9TRVQgICAgICA9IFhUX1JFQ0VOVF9TRVQsCisJSVBUX1JFQ0VOVF9VUERBVEUgICA9IFhUX1JFQ0VOVF9VUERBVEUsCisJSVBUX1JFQ0VOVF9SRU1PVkUgICA9IFhUX1JFQ0VOVF9SRU1PVkUsCisJSVBUX1JFQ0VOVF9UVEwgICAgICA9IFhUX1JFQ0VOVF9UVEwsCiAKLSNkZWZpbmUgSVBUX1JFQ0VOVF9OQU1FX0xFTiAyMDAKKwlJUFRfUkVDRU5UX1NPVVJDRSAgID0gWFRfUkVDRU5UX1NPVVJDRSwKKwlJUFRfUkVDRU5UX0RFU1QgICAgID0gWFRfUkVDRU5UX0RFU1QsCiAKLXN0cnVjdCBpcHRfcmVjZW50X2luZm8gewotCXVfaW50MzJfdCAgIHNlY29uZHM7Ci0JdV9pbnQzMl90ICAgaGl0X2NvdW50OwotCXVfaW50OF90ICAgIGNoZWNrX3NldDsKLQl1X2ludDhfdCAgICBpbnZlcnQ7Ci0JY2hhciAgICAgICAgbmFtZVtJUFRfUkVDRU5UX05BTUVfTEVOXTsKLQl1X2ludDhfdCAgICBzaWRlOworCUlQVF9SRUNFTlRfTkFNRV9MRU4gPSBYVF9SRUNFTlRfTkFNRV9MRU4sCiB9OwogCiAjZW5kaWYgLypfSVBUX1JFQ0VOVF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDc4YTU5MjIuLmFjOGQwMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMTM3LDcgKzEzNyw3IEBACiAJdW5zaWduZWQgbG9uZwkJYXR0cnRpbWVvX3RpbWVzdGFtcDsKIAlfX3U2NAkJCWNoYW5nZV9hdHRyOwkJLyogdjQgb25seSAqLwogCi0JdW5zaWduZWQgbG9uZwkJbGFzdF91cGRhdGVkOworCXVuc2lnbmVkIGxvbmcJCWF0dHJfZ2VuY291bnQ7CiAJLyogIkdlbmVyYXRpb24gY291bnRlciIgZm9yIHRoZSBhdHRyaWJ1dGUgY2FjaGUuIFRoaXMgaXMKIAkgKiBidW1wZWQgd2hlbmV2ZXIgd2UgdXBkYXRlIHRoZSBtZXRhZGF0YSBvbiB0aGUKIAkgKiBzZXJ2ZXIuCkBAIC0yMDAsMTEgKzIwMCwxMCBAQAogLyoKICAqIEJpdCBvZmZzZXRzIGluIGZsYWdzIGZpZWxkCiAgKi8KLSNkZWZpbmUgTkZTX0lOT19SRVZBTElEQVRJTkcJKDApCQkvKiByZXZhbGlkYXRpbmcgYXR0cnMgKi8KLSNkZWZpbmUgTkZTX0lOT19BRFZJU0VfUkRQTFVTCSgxKQkJLyogYWR2aXNlIHJlYWRkaXJwbHVzICovCi0jZGVmaW5lIE5GU19JTk9fU1RBTEUJCSgyKQkJLyogcG9zc2libGUgc3RhbGUgaW5vZGUgKi8KLSNkZWZpbmUgTkZTX0lOT19BQ0xfTFJVX1NFVAkoMykJCS8qIElub2RlIGlzIG9uIHRoZSBMUlUgbGlzdCAqLwotI2RlZmluZSBORlNfSU5PX01PVU5UUE9JTlQJKDQpCQkvKiBpbm9kZSBpcyByZW1vdGUgbW91bnRwb2ludCAqLworI2RlZmluZSBORlNfSU5PX0FEVklTRV9SRFBMVVMJKDApCQkvKiBhZHZpc2UgcmVhZGRpcnBsdXMgKi8KKyNkZWZpbmUgTkZTX0lOT19TVEFMRQkJKDEpCQkvKiBwb3NzaWJsZSBzdGFsZSBpbm9kZSAqLworI2RlZmluZSBORlNfSU5PX0FDTF9MUlVfU0VUCSgyKQkJLyogSW5vZGUgaXMgb24gdGhlIExSVSBsaXN0ICovCisjZGVmaW5lIE5GU19JTk9fTU9VTlRQT0lOVAkoMykJCS8qIGlub2RlIGlzIHJlbW90ZSBtb3VudHBvaW50ICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mc19pbm9kZSAqTkZTX0koY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTM0NSwxNSArMzQ0LDExIEBACiBleHRlcm4gdm9pZCBwdXRfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KTsKIGV4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqbmZzX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgaW50IG1vZGUpOwogZXh0ZXJuIHU2NCBuZnNfY29tcGF0X3VzZXJfaW5vNjQodTY0IGZpbGVpZCk7CitleHRlcm4gdm9pZCBuZnNfZmF0dHJfaW5pdChzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cik7CiAKIC8qIGxpbnV4L25ldC9pcHY0L2lwY29uZmlnLmM6IHRyaW1zIGlwIGFkZHIgb2ZmIGZyb250IG9mIG5hbWUsIHRvby4gKi8KIGV4dGVybiBfX2JlMzIgcm9vdF9uZnNfcGFyc2VfYWRkcihjaGFyICpuYW1lKTsgLypfX2luaXQqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZzX2ZhdHRyX2luaXQoc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCi17Ci0JZmF0dHItPnZhbGlkID0gMDsKLQlmYXR0ci0+dGltZV9zdGFydCA9IGppZmZpZXM7Ci19CitleHRlcm4gdW5zaWduZWQgbG9uZyBuZnNfaW5jX2F0dHJfZ2VuZXJhdGlvbl9jb3VudGVyKHZvaWQpOwogCiAvKgogICogbGludXgvZnMvbmZzL2ZpbGUuYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggYzliZWFjZC4uNGU0NzdhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC0xMTksNyArMTE5LDYgQEAKIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiAKIAlhdG9taWNfdCBhY3RpdmU7IC8qIEtlZXAgdHJhY2Ugb2YgYW55IGFjdGl2aXR5IHRvIHRoaXMgc2VydmVyICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgYWN0aXZlX3dxOyAgLyogV2FpdCBmb3IgYW55IGFjdGl2aXR5IHRvIHN0b3AgICovCiAKIAkvKiBtb3VudGQtcmVsYXRlZCBtb3VudCBvcHRpb25zICovCiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJbW91bnRkX2FkZHJlc3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19tb3VudC5oIGIvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaAppbmRleCBkZjdjNmI3Li42NTQ5YTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKQEAgLTY1LDQgKzY1LDggQEAKICNkZWZpbmUgTkZTX01PVU5UX1VOU0hBUkVECTB4ODAwMAkvKiA1ICovCiAjZGVmaW5lIE5GU19NT1VOVF9GTEFHTUFTSwkweEZGRkYKIAorLyogVGhlIGZvbGxvd2luZyBhcmUgZm9yIGludGVybmFsIHVzZSBvbmx5ICovCisjZGVmaW5lIE5GU19NT1VOVF9MT09LVVBfQ0FDSEVfTk9ORUcJMHgxMDAwMAorI2RlZmluZSBORlNfTU9VTlRfTE9PS1VQX0NBQ0hFX05PTkUJMHgyMDAwMAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKaW5kZXggOGM3N2MxMS4uYzFjMzFhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKQEAgLTM2LDYgKzM2LDcgQEAKIAlfX3UzMgkJCW5saW5rOwogCV9fdTMyCQkJdWlkOwogCV9fdTMyCQkJZ2lkOworCWRldl90CQkJcmRldjsKIAlfX3U2NAkJCXNpemU7CiAJdW5pb24gewogCQlzdHJ1Y3QgewpAQCAtNDYsNyArNDcsNiBAQAogCQkJX191NjQJdXNlZDsKIAkJfSBuZnMzOwogCX0gZHU7Ci0JZGV2X3QJCQlyZGV2OwogCXN0cnVjdCBuZnNfZnNpZAkJZnNpZDsKIAlfX3U2NAkJCWZpbGVpZDsKIAlzdHJ1Y3QgdGltZXNwZWMJCWF0aW1lOwpAQCAtNTYsNiArNTYsNyBAQAogCV9fdTY0CQkJY2hhbmdlX2F0dHI7CS8qIE5GU3Y0IGNoYW5nZSBhdHRyaWJ1dGUgKi8KIAlfX3U2NAkJCXByZV9jaGFuZ2VfYXR0cjsvKiBwcmUtb3AgTkZTdjQgY2hhbmdlIGF0dHJpYnV0ZSAqLwogCXVuc2lnbmVkIGxvbmcJCXRpbWVfc3RhcnQ7CisJdW5zaWduZWQgbG9uZwkJZ2VuY291bnQ7CiB9OwogCiAjZGVmaW5lIE5GU19BVFRSX1dDQwkJMHgwMDAxCQkvKiBwcmUtb3AgV0NDIGRhdGEgICAgKi8KQEAgLTY3MiwxNiArNjczLDE2IEBACiAJc3RydWN0IG5mc19mYXR0ciAqCQluZXdfZmF0dHI7CiB9OwogCi0jZGVmaW5lIE5GUzRfU0VUQ0xJRU5USURfTkFNRUxFTgkoNTYpCisjZGVmaW5lIE5GUzRfU0VUQ0xJRU5USURfTkFNRUxFTgkoMTI3KQogc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgewogCWNvbnN0IG5mczRfdmVyaWZpZXIgKgkJc2NfdmVyaWZpZXI7CiAJdW5zaWduZWQgaW50CQkJc2NfbmFtZV9sZW47Ci0JY2hhcgkJCQlzY19uYW1lW05GUzRfU0VUQ0xJRU5USURfTkFNRUxFTl07CisJY2hhcgkJCQlzY19uYW1lW05GUzRfU0VUQ0xJRU5USURfTkFNRUxFTiArIDFdOwogCXUzMgkJCQlzY19wcm9nOwogCXVuc2lnbmVkIGludAkJCXNjX25ldGlkX2xlbjsKLQljaGFyCQkJCXNjX25ldGlkW1JQQ0JJTkRfTUFYTkVUSURMRU5dOworCWNoYXIJCQkJc2NfbmV0aWRbUlBDQklORF9NQVhORVRJRExFTiArIDFdOwogCXVuc2lnbmVkIGludAkJCXNjX3VhZGRyX2xlbjsKLQljaGFyCQkJCXNjX3VhZGRyW1JQQ0JJTkRfTUFYVUFERFJMRU5dOworCWNoYXIJCQkJc2NfdWFkZHJbUlBDQklORF9NQVhVQUREUkxFTiArIDFdOwogCXUzMgkJCQlzY19jYl9pZGVudDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDEwOGY0N2UuLjIxMjY5NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBORlNEX01BWV9MT0NLCQkzMgogI2RlZmluZSBORlNEX01BWV9PV05FUl9PVkVSUklERQk2NAogI2RlZmluZSBORlNEX01BWV9MT0NBTF9BQ0NFU1MJMTI4IC8qIElSSVggZG9pbmcgbG9jYWwgYWNjZXNzIGNoZWNrIG9uIGRldmljZSBzcGVjaWFsIGZpbGUqLworI2RlZmluZSBORlNEX01BWV9CWVBBU1NfR1NTX09OX1JPT1QgMjU2CiAKICNkZWZpbmUgTkZTRF9NQVlfQ1JFQVRFCQkoTkZTRF9NQVlfRVhFQ3xORlNEX01BWV9XUklURSkKICNkZWZpbmUgTkZTRF9NQVlfUkVNT1ZFCQkoTkZTRF9NQVlfRVhFQ3xORlNEX01BWV9XUklURXxORlNEX01BWV9UUlVOQykKQEAgLTEyNSw3ICsxMjYsNyBAQAogX19iZTMyCQluZnNkX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCSAgICAgbG9mZl90ICosIHN0cnVjdCByZWFkZGlyX2NkICosIGZpbGxkaXJfdCk7CiBfX2JlMzIJCW5mc2Rfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCi0JCQkJc3RydWN0IGtzdGF0ZnMgKik7CisJCQkJc3RydWN0IGtzdGF0ZnMgKiwgaW50IGFjY2Vzcyk7CiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBfX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19leHBvcnQgKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKaW5kZXggMmJlN2M2My4uOWJhZDY1NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCkBAIC04OSw2ICs4OSwyMiBAQAogICogQE5MODAyMTFfQ01EX0RFTF9QQVRIOiBSZW1vdmUgYSBtZXNoIHBhdGggaWRlbnRpZmllZCBieSAlTkw4MDIxMV9BVFRSX01BQwogICoJb3IsIGlmIG5vIE1BQyBhZGRyZXNzIGdpdmVuLCBhbGwgbWVzaCBwYXRocywgb24gdGhlIGludGVyZmFjZSBpZGVudGlmaWVkCiAgKglieSAlTkw4MDIxMV9BVFRSX0lGSU5ERVguCisgKiBATkw4MDIxMV9DTURfU0VUX0JTUzogU2V0IEJTUyBhdHRyaWJ1dGVzIGZvciBCU1MgaWRlbnRpZmllZCBieQorICoJJU5MODAyMTFfQVRUUl9JRklOREVYLgorICoKKyAqIEBOTDgwMjExX0NNRF9TRVRfUkVHOiBTZXQgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4gQ1JEQSBzZW5kcyB0aGlzIGNvbW1hbmQKKyAqCWFmdGVyIGJlaW5nIHF1ZXJpZWQgYnkgdGhlIGtlcm5lbC4gQ1JEQSByZXBsaWVzIGJ5IHNlbmRpbmcgYSByZWd1bGF0b3J5CisgKglkb21haW4gc3RydWN0dXJlIHdoaWNoIGNvbnNpc3RzIG9mICVOTDgwMjExX0FUVFJfUkVHX0FMUEhBIHNldCB0byBvdXIKKyAqCWN1cnJlbnQgYWxwaGEyIGlmIGl0IGZvdW5kIGEgbWF0Y2guIEl0IGFsc28gcHJvdmlkZXMKKyAqIAlOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1MsIGFuZCBhIHNldCBvZiByZWd1bGF0b3J5IHJ1bGVzLiBFYWNoCisgKiAJcmVndWxhdG9yeSBydWxlIGlzIGEgbmVzdGVkIHNldCBvZiBhdHRyaWJ1dGVzICBnaXZlbiBieQorICogCSVOTDgwMjExX0FUVFJfUkVHX1JVTEVfRlJFUV9bU1RBUlR8RU5EXSBhbmQKKyAqIAklTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXIHdpdGggYW4gYXR0YWNoZWQgcG93ZXIgcnVsZSBnaXZlbiBieQorICogCSVOTDgwMjExX0FUVFJfUkVHX1JVTEVfUE9XRVJfTUFYX0FOVF9HQUlOIGFuZAorICogCSVOTDgwMjExX0FUVFJfUkVHX1JVTEVfUE9XRVJfTUFYX0VJUlAuCisgKiBATkw4MDIxMV9DTURfUkVRX1NFVF9SRUc6IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKiAJdG8gdGhlIHRoZSBzcGVjaWZpZWQgSVNPL0lFQyAzMTY2LTEgYWxwaGEyIGNvdW50cnkgY29kZS4gVGhlIGNvcmUgd2lsbAorICogCXN0b3JlIHRoaXMgYXMgYSB2YWxpZCByZXF1ZXN0IGFuZCB0aGVuIHF1ZXJ5IHVzZXJzcGFjZSBmb3IgaXQuCiAgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKQEAgLTEyNywxMyArMTQzLDIzIEBACiAJTkw4MDIxMV9DTURfTkVXX01QQVRILAogCU5MODAyMTFfQ01EX0RFTF9NUEFUSCwKIAotCS8qIGFkZCBjb21tYW5kcyBoZXJlICovCisJTkw4MDIxMV9DTURfU0VUX0JTUywKKworCU5MODAyMTFfQ01EX1NFVF9SRUcsCisJTkw4MDIxMV9DTURfUkVRX1NFVF9SRUcsCisKKwkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KIAogCS8qIHVzZWQgdG8gZGVmaW5lIE5MODAyMTFfQ01EX01BWCBiZWxvdyAqLwogCV9fTkw4MDIxMV9DTURfQUZURVJfTEFTVCwKIAlOTDgwMjExX0NNRF9NQVggPSBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QgLSAxCiB9OwogCisvKgorICogQWxsb3cgdXNlciBzcGFjZSBwcm9ncmFtcyB0byB1c2UgI2lmZGVmIG9uIG5ldyBjb21tYW5kcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9DTURfU0VUX0JTUyBOTDgwMjExX0NNRF9TRVRfQlNTCiAKIC8qKgogICogZW51bSBubDgwMjExX2F0dHJzIC0gbmw4MDIxMSBuZXRsaW5rIGF0dHJpYnV0ZXMKQEAgLTE4OCwxMCArMjE0LDM0IEBACiAgKiAJaW5mbyBnaXZlbiBmb3IgJU5MODAyMTFfQ01EX0dFVF9NUEFUSCwgbmVzdGVkIGF0dHJpYnV0ZSBkZXNjcmliZWQgYXQKICAqCSZlbnVtIG5sODAyMTFfbXBhdGhfaW5mby4KICAqCi0gKgogICogQE5MODAyMTFfQVRUUl9NTlRSX0ZMQUdTOiBmbGFncywgbmVzdGVkIGVsZW1lbnQgd2l0aCBOTEFfRkxBRyBhdHRyaWJ1dGVzIG9mCiAgKiAgICAgICZlbnVtIG5sODAyMTFfbW50cl9mbGFncy4KICAqCisgKiBATkw4MDIxMV9BVFRSX1JFR19BTFBIQTI6IGFuIElTTy0zMTY2LWFscGhhMiBjb3VudHJ5IGNvZGUgZm9yIHdoaWNoIHRoZQorICogCWN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gc2hvdWxkIGJlIHNldCB0byBvciBpcyBhbHJlYWR5IHNldCB0by4KKyAqIAlGb3IgZXhhbXBsZSwgJ0NSJywgZm9yIENvc3RhIFJpY2EuIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgYnkgdGhlIGtlcm5lbAorICogCXRvIHF1ZXJ5IHRoZSBDUkRBIHRvIHJldHJpZXZlIG9uZSByZWd1bGF0b3J5IGRvbWFpbi4gVGhpcyBhdHRyaWJ1dGUgY2FuCisgKiAJYWxzbyBiZSB1c2VkIGJ5IHVzZXJzcGFjZSB0byBxdWVyeSB0aGUga2VybmVsIGZvciB0aGUgY3VycmVudGx5IHNldAorICogCXJlZ3VsYXRvcnkgZG9tYWluLiBXZSBjaG9zZSBhbiBhbHBoYTIgYXMgdGhhdCBpcyBhbHNvIHVzZWQgYnkgdGhlCisgKiAJSUVFRS04MDIuMTFkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudCB0byBpZGVudGlmeSBhIGNvdW50cnkuCisgKiAJVXNlcnMgY2FuIGFsc28gc2ltcGx5IGFzayB0aGUgd2lyZWxlc3MgY29yZSB0byBzZXQgcmVndWxhdG9yeSBkb21haW4KKyAqIAl0byBhIHNwZWNpZmljIGFscGhhMi4KKyAqIEBOTDgwMjExX0FUVFJfUkVHX1JVTEVTOiBhIG5lc3RlZCBhcnJheSBvZiByZWd1bGF0b3J5IGRvbWFpbiByZWd1bGF0b3J5CisgKglydWxlcy4KKyAqCisgKiBATkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVDogd2hldGhlciBDVFMgcHJvdGVjdGlvbiBpcyBlbmFibGVkICh1OCwgMCBvciAxKQorICogQE5MODAyMTFfQVRUUl9CU1NfU0hPUlRfUFJFQU1CTEU6IHdoZXRoZXIgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZAorICoJKHU4LCAwIG9yIDEpCisgKiBATkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUU6IHdoZXRoZXIgc2hvcnQgc2xvdCB0aW1lIGVuYWJsZWQKKyAqCSh1OCwgMCBvciAxKQorICoKKyAqIEBOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWTogSFQgQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiBlbGVtZW50IChmcm9tCisgKglhc3NvY2lhdGlvbiByZXF1ZXN0IHdoZW4gdXNlZCB3aXRoIE5MODAyMTFfQ01EX05FV19TVEFUSU9OKQorICoKKyAqIEBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVM6IG5lc3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBhbGwKKyAqCXN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZXMsIGVhY2ggYSBmbGFnIGF0dHJpYnV0ZSB3aXRoIHRoZSBudW1iZXIKKyAqCW9mIHRoZSBpbnRlcmZhY2UgbW9kZS4KKyAqCiAgKiBATkw4MDIxMV9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTIzNSwxNiArMjg1LDM1IEBACiAJTkw4MDIxMV9BVFRSX01QQVRIX05FWFRfSE9QLAogCU5MODAyMTFfQVRUUl9NUEFUSF9JTkZPLAogCisJTkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVCwKKwlOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFLAorCU5MODAyMTFfQVRUUl9CU1NfU0hPUlRfU0xPVF9USU1FLAorCisJTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFksCisKKwlOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMsCisKKwlOTDgwMjExX0FUVFJfUkVHX0FMUEhBMiwKKwlOTDgwMjExX0FUVFJfUkVHX1JVTEVTLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULAogCU5MODAyMTFfQVRUUl9NQVggPSBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUIC0gMQogfTsKIAorLyoKKyAqIEFsbG93IHVzZXIgc3BhY2UgcHJvZ3JhbXMgdG8gdXNlICNpZmRlZiBvbiBuZXcgYXR0cmlidXRlcyBieSBkZWZpbmluZyB0aGVtCisgKiBoZXJlCisgKi8KKyNkZWZpbmUgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFkgTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFkKKwogI2RlZmluZSBOTDgwMjExX01BWF9TVVBQX1JBVEVTCQkJMzIKKyNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SRUdfUlVMRVMJCTMyCiAjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9FTkNSX0tFWQkwCiAjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZCTE2CiAjZGVmaW5lIE5MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZCTI0CisjZGVmaW5lIE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4JCTI2CiAKIC8qKgogICogZW51bSBubDgwMjExX2lmdHlwZSAtICh2aXJ0dWFsKSBpbnRlcmZhY2UgdHlwZXMKQEAgLTQzNiw2ICs1MDUsNjYgQEAKIH07CiAKIC8qKgorICogZW51bSBubDgwMjExX3JlZ19ydWxlX2F0dHIgLSByZWd1bGF0b3J5IHJ1bGUgYXR0cmlidXRlcworICogQE5MODAyMTFfQVRUUl9SRUdfUlVMRV9GTEFHUzogYSBzZXQgb2YgZmxhZ3Mgd2hpY2ggc3BlY2lmeSBhZGRpdGlvbmFsCisgKiAJY29uc2lkZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlLiBUaGVzZSBhcmUgdGhlCisgKiAJJmVudW0gbmw4MDIxMV9yZWdfcnVsZV9mbGFncy4KKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVDogc3RhcnRpbmcgZnJlcXVlbmNyeSBmb3IgdGhlIHJlZ3VsYXRvcnkKKyAqIAlydWxlIGluIEtIei4gVGhpcyBpcyBub3QgYSBjZW50ZXIgb2YgZnJlcXVlbmN5IGJ1dCBhbiBhY3R1YWwgcmVndWxhdG9yeQorICogCWJhbmQgZWRnZS4KKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9FTkQ6IGVuZGluZyBmcmVxdWVuY3kgZm9yIHRoZSByZWd1bGF0b3J5IHJ1bGUKKyAqIAlpbiBLSHouIFRoaXMgaXMgbm90IGEgY2VudGVyIGEgZnJlcXVlbmN5IGJ1dCBhbiBhY3R1YWwgcmVndWxhdG9yeQorICogCWJhbmQgZWRnZS4KKyAqIEBOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9NQVhfQlc6IG1heGltdW0gYWxsb3dlZCBiYW5kd2lkdGggZm9yIHRoaXMKKyAqIAlmcmVxdWVuY3kgcmFuZ2UsIGluIEtIei4KKyAqIEBOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfQU5UX0dBSU46IHRoZSBtYXhpbXVtIGFsbG93ZWQgYW50ZW5uYSBnYWluCisgKiAJZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlLiBUaGUgdmFsdWUgaXMgaW4gbUJpICgxMDAgKiBkQmkpLgorICogCUlmIHlvdSBkb24ndCBoYXZlIG9uZSB0aGVuIGRvbid0IHNlbmQgdGhpcy4KKyAqIEBOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfRUlSUDogdGhlIG1heGltdW0gYWxsb3dlZCBFSVJQIGZvcgorICogCWEgZ2l2ZW4gZnJlcXVlbmN5IHJhbmdlLiBUaGUgdmFsdWUgaXMgaW4gbUJtICgxMDAgKiBkQm0pLgorICovCitlbnVtIG5sODAyMTFfcmVnX3J1bGVfYXR0ciB7CisJX19OTDgwMjExX1JFR19SVUxFX0FUVFJfSU5WQUxJRCwKKwlOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1MsCisKKwlOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVCwKKwlOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9FTkQsCisJTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfTUFYX0JXLAorCisJTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOLAorCU5MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX1JFR19SVUxFX0FUVFJfQUZURVJfTEFTVCwKKwlOTDgwMjExX1JFR19SVUxFX0FUVFJfTUFYID0gX19OTDgwMjExX1JFR19SVUxFX0FUVFJfQUZURVJfTEFTVCAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzIC0gcmVndWxhdG9yeSBydWxlIGZsYWdzCisgKgorICogQE5MODAyMTFfUlJGX05PX09GRE06IE9GRE0gbW9kdWxhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX05PX0NDSzogQ0NLIG1vZHVsYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19JTkRPT1I6IGluZG9vciBvcGVyYXRpb24gbm90IGFsbG93ZWQKKyAqIEBOTDgwMjExX1JSRl9OT19PVVRET09SOiBvdXRkb29yIG9wZXJhdGlvbiBub3QgYWxsb3dlZAorICogQE5MODAyMTFfUlJGX0RGUzogREZTIHN1cHBvcnQgaXMgcmVxdWlyZWQgdG8gYmUgdXNlZAorICogQE5MODAyMTFfUlJGX1BUUF9PTkxZOiB0aGlzIGlzIG9ubHkgZm9yIFBvaW50IFRvIFBvaW50IGxpbmtzCisgKiBATkw4MDIxMV9SUkZfUFRNUF9PTkxZOiB0aGlzIGlzIG9ubHkgZm9yIFBvaW50IFRvIE11bHRpIFBvaW50IGxpbmtzCisgKiBATkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOOiBwYXNzaXZlIHNjYW4gaXMgcmVxdWlyZWQKKyAqIEBOTDgwMjExX1JSRl9OT19JQlNTOiBubyBJQlNTIGlzIGFsbG93ZWQKKyAqLworZW51bSBubDgwMjExX3JlZ19ydWxlX2ZsYWdzIHsKKwlOTDgwMjExX1JSRl9OT19PRkRNCQk9IDE8PDAsCisJTkw4MDIxMV9SUkZfTk9fQ0NLCQk9IDE8PDEsCisJTkw4MDIxMV9SUkZfTk9fSU5ET09SCQk9IDE8PDIsCisJTkw4MDIxMV9SUkZfTk9fT1VURE9PUgkJPSAxPDwzLAorCU5MODAyMTFfUlJGX0RGUwkJCT0gMTw8NCwKKwlOTDgwMjExX1JSRl9QVFBfT05MWQkJPSAxPDw1LAorCU5MODAyMTFfUlJGX1BUTVBfT05MWQkJPSAxPDw2LAorCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTgk9IDE8PDcsCisJTkw4MDIxMV9SUkZfTk9fSUJTUwkJPSAxPDw4LAorfTsKKworLyoqCiAgKiBlbnVtIG5sODAyMTFfbW50cl9mbGFncyAtIG1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncwogICoKICAqIE1vbml0b3IgY29uZmlndXJhdGlvbiBmbGFncy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbm90aWZpZXIuaCBiL2luY2x1ZGUvbGludXgvbm90aWZpZXIuaAppbmRleCBkYTI2OThiLi5iODZmYTJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25vdGlmaWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ub3RpZmllci5oCkBAIC0yMTMsOSArMjEzLDE2IEBACiAjZGVmaW5lIENQVV9ET1dOX0ZBSUxFRAkJMHgwMDA2IC8qIENQVSAodW5zaWduZWQpdiBOT1QgZ29pbmcgZG93biAqLwogI2RlZmluZSBDUFVfREVBRAkJMHgwMDA3IC8qIENQVSAodW5zaWduZWQpdiBkZWFkICovCiAjZGVmaW5lIENQVV9EWUlORwkJMHgwMDA4IC8qIENQVSAodW5zaWduZWQpdiBub3QgcnVubmluZyBhbnkgdGFzaywKLQkJCQkgICAgICAgICogbm90IGhhbmRsaW5nIGludGVycnVwdHMsIHNvb24gZGVhZCAqLworCQkJCQkqIG5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBzb29uIGRlYWQuCisJCQkJCSogQ2FsbGVkIG9uIHRoZSBkeWluZyBjcHUsIGludGVycnVwdHMKKwkJCQkJKiBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gTXVzdCBub3QKKwkJCQkJKiBzbGVlcCwgbXVzdCBub3QgZmFpbCAqLwogI2RlZmluZSBDUFVfUE9TVF9ERUFECQkweDAwMDkgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQsIGNwdV9ob3RwbHVnCiAJCQkJCSogbG9jayBpcyBkcm9wcGVkICovCisjZGVmaW5lIENQVV9TVEFSVElORwkJMHgwMDBBIC8qIENQVSAodW5zaWduZWQpdiBzb29uIHJ1bm5pbmcuCisJCQkJCSogQ2FsbGVkIG9uIHRoZSBuZXcgY3B1LCBqdXN0IGJlZm9yZQorCQkJCQkqIGVuYWJsaW5nIGludGVycnVwdHMuIE11c3Qgbm90IHNsZWVwLAorCQkJCQkqIG11c3Qgbm90IGZhaWwgKi8KIAogLyogVXNlZCBmb3IgQ1BVIGhvdHBsdWcgZXZlbnRzIG9jY3VyaW5nIHdoaWxlIHRhc2tzIGFyZSBmcm96ZW4gZHVlIHRvIGEgc3VzcGVuZAogICogb3BlcmF0aW9uIGluIHByb2dyZXNzCkBAIC0yMjksNiArMjM2LDcgQEAKICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTgkoQ1BVX0RPV05fRkFJTEVEIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RFQURfRlJPWkVOCQkoQ1BVX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQogI2RlZmluZSBDUFVfRFlJTkdfRlJPWkVOCShDUFVfRFlJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQorI2RlZmluZSBDUFVfU1RBUlRJTkdfRlJPWkVOCShDUFVfU1RBUlRJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQogCiAvKiBIaWJlcm5hdGlvbiBhbmQgc3VzcGVuZCBldmVudHMgKi8KICNkZWZpbmUgUE1fSElCRVJOQVRJT05fUFJFUEFSRQkweDAwMDEgLyogR29pbmcgdG8gaGliZXJuYXRlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggNzk4ODZhZC4uZTI0ODhmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtNzEsNSArNzEsOCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX25vZGUoCiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBpbnQgb2ZfbW9kYWxpYXNfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGNoYXIgKm1vZGFsaWFzLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgb2ZfcGFyc2VfcGhhbmRsZXNfd2l0aF9hcmdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJY29uc3QgY2hhciAqbGlzdF9uYW1lLCBjb25zdCBjaGFyICpjZWxsc19uYW1lLCBpbnQgaW5kZXgsCisJc3RydWN0IGRldmljZV9ub2RlICoqb3V0X25vZGUsIGNvbnN0IHZvaWQgKipvdXRfYXJncyk7CiAKICNlbmRpZiAvKiBfTElOVVhfT0ZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCmluZGV4IDA0MWJiMzEuLmJjYjhmNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb3Byb2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L29wcm9maWxlLmgKQEAgLTM2LDYgKzM2LDggQEAKICNkZWZpbmUgWEVOX0VOVEVSX1NXSVRDSF9DT0RFCQkxMAogI2RlZmluZSBTUFVfUFJPRklMSU5HX0NPREUJCTExCiAjZGVmaW5lIFNQVV9DVFhfU1dJVENIX0NPREUJCTEyCisjZGVmaW5lIElCU19GRVRDSF9DT0RFCQkJMTMKKyNkZWZpbmUgSUJTX09QX0NPREUJCQkxNAogCiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CiBzdHJ1Y3QgZGVudHJ5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYXJwb3J0LmggYi9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAppbmRleCA2YTBkN2NkLi5lMWY4M2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhcnBvcnQuaApAQCAtMSw1ICsxLDMgQEAKLS8qICRJZDogcGFycG9ydC5oLHYgMS4xIDE5OTgvMDUvMTcgMTA6NTc6NTIgYW5kcmVhIEV4cCBhbmRyZWEgJCAqLwotCiAvKgogICogQW55IHBhcnQgb2YgdGhpcyBwcm9ncmFtIG1heSBiZSB1c2VkIGluIGRvY3VtZW50cyBsaWNlbnNlZCB1bmRlcgogICogdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IgYW55IGxhdGVyIHZlcnNpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFyc2VyLmggYi9pbmNsdWRlL2xpbnV4L3BhcnNlci5oCmluZGV4IDdkY2QwNTAuLmVhMjI4MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFyc2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYXJzZXIuaApAQCAtMjUsNyArMjUsNyBAQAogCWNoYXIgKnRvOwogfSBzdWJzdHJpbmdfdDsKIAotaW50IG1hdGNoX3Rva2VuKGNoYXIgKiwgbWF0Y2hfdGFibGVfdCB0YWJsZSwgc3Vic3RyaW5nX3QgYXJnc1tdKTsKK2ludCBtYXRjaF90b2tlbihjaGFyICosIGNvbnN0IG1hdGNoX3RhYmxlX3QgdGFibGUsIHN1YnN0cmluZ190IGFyZ3NbXSk7CiBpbnQgbWF0Y2hfaW50KHN1YnN0cmluZ190ICosIGludCAqcmVzdWx0KTsKIGludCBtYXRjaF9vY3RhbChzdWJzdHJpbmdfdCAqLCBpbnQgKnJlc3VsdCk7CiBpbnQgbWF0Y2hfaGV4KHN1YnN0cmluZ190ICosIGludCAqcmVzdWx0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IGMwZTE0MDAuLjk4ZGM2MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNTM0LDcgKzUzNCw3IEBACiAjaWZkZWYgQ09ORklHX1BDSV9MRUdBQ1kKIHN0cnVjdCBwY2lfZGV2IF9fZGVwcmVjYXRlZCAqcGNpX2ZpbmRfZGV2aWNlKHVuc2lnbmVkIGludCB2ZW5kb3IsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IGRldmljZSwKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CisJCQkJCSAgICAgc3RydWN0IHBjaV9kZXYgKmZyb20pOwogc3RydWN0IHBjaV9kZXYgX19kZXByZWNhdGVkICpwY2lfZmluZF9zbG90KHVuc2lnbmVkIGludCBidXMsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBkZXZmbik7CiAjZW5kaWYgLyogQ09ORklHX1BDSV9MRUdBQ1kgKi8KQEAgLTU1MCw3ICs1NTAsNyBAQAogCQkJCXN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X3N1YnN5cyh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogCQkJCXVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCi0JCQkJY29uc3Qgc3RydWN0IHBjaV9kZXYgKmZyb20pOworCQkJCXN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X3Nsb3Qoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuKTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2J1c19hbmRfc2xvdCh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pOwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfY2xhc3ModW5zaWduZWQgaW50IGNsYXNzLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CkBAIC04MTYsNyArODE2LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqcGNpX2ZpbmRfZGV2aWNlKHVuc2lnbmVkIGludCB2ZW5kb3IsCiAJCQkJCSAgICAgIHVuc2lnbmVkIGludCBkZXZpY2UsCi0JCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpmcm9tKQorCQkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqZnJvbSkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTgzOCw3ICs4MzgsNyBAQAogCQkJCQkgICAgIHVuc2lnbmVkIGludCBkZXZpY2UsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IHNzX3ZlbmRvciwKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3NfZGV2aWNlLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpmcm9tKQorCQkJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpmcm9tKQogewogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBmMTYyNGIzLi44ZWRkZGMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtNDk3LDYgKzQ5NywxNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9LOF9OQl9BRERSTUFQCTB4MTEwMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9LOF9OQl9NRU1DVEwJMHgxMTAyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01JU0MJMHgxMTAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9IVAkweDEyMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX01BUAkweDEyMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0RSQU0JMHgxMjAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NSVNDCTB4MTIwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xMEhfTkJfTElOSwkweDEyMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTFIX05CX0hUCTB4MTMwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfTUFQCTB4MTMwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfRFJBTQkweDEzMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTFIX05CX01JU0MJMHgxMzAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzExSF9OQl9MSU5LCTB4MTMwNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRQkJMHgyMDAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFX0hPTUUJMHgyMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX1NDU0kJCTB4MjAyMApAQCAtNTc3LDYgKzU4Nyw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFUUk9YX0cyMDBfUENJCTB4MDUyMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BVFJPWF9HMjAwX0FHUAkweDA1MjEKICNkZWZpbmUJUENJX0RFVklDRV9JRF9NQVRST1hfRzQwMAkweDA1MjUKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9NQVRST1hfRzIwMEVWX1BDSQkweDA1MzAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfRzU1MAkweDI1MjcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVRST1hfVklBCTB4NDUzNgogCkBAIC0xNDExLDYgKzE0MjIsOCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VJQ09OX01BRVNUUkFRX1UJMHhlMDEzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRUlDT05fTUFFU1RSQVAJMHhlMDE0CiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVNDTwkJMHgxMTM3CisKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9aSUFURUNICQkweDExMzgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9aSUFURUNIXzU1NTBfSEMJMHg1NTUwCiAgCkBAIC0xNTIxLDcgKzE1MzQsOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q2NDI2MAkweDY0MzAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVJWRUxMX01WNjQzNjAJMHg2NDYwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9NVjY0NDYwCTB4NjQ4MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfQ0FGRV9TRAkweDQxMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVJWRUxMXzg4QUxQMDFfTkFORAkweDQxMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVJWRUxMXzg4QUxQMDFfU0QJMHg0MTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF84OEFMUDAxX0NDSUMJMHg0MTAyCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WMwkJMHgxMWIwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVjNfVjk2MAkJMHgwMDAxCkBAIC0yMjEzLDYgKzIyMjgsNyBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVRUQU5TSUMJCTB4MTk2OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUVEFOU0lDX0wxCTB4MTA0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUVEFOU0lDX0wyCTB4MjA0OAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSk1JQ1JPTgkJMHgxOTdCCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjAJMHgyMzYwCkBAIC0yMjQ0LDYgKzIyNjAsMTYgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF8zRExBQlNfUEVSTUVESUEyCTB4MDAwNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19QRVJNRURJQTJWCTB4MDAwOQogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUWEVOCQkweDQwNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OWDIwMzFfMTBHWFNSCTB4MDAwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMjAzMV8xMEdDWDQJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyMDMxXzRHQ1UJMHgwMDAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyMDMxX0lNRVoJMHgwMDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyMDMxX0hNRVoJMHgwMDA1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyMDMxX1hHX01HTVQJMHgwMDI0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyMDMxX1hHX01HTVQyCTB4MDAyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMzAzMQkJMHgwMTAwCisKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BS1MJCTB4NDE2YwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FLU19BTEFERElOQ0FSRAkweDAxMDAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKaW5kZXggZmFjMzMzNy4uOWYyYTM3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCkBAIC0yMywxMiArMjMsMTkgQEAKIAlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXyhTSEFSRURfQUxJR05FRF9TRUNUSU9OKSkpCQlcCiAJUEVSX0NQVV9BVFRSSUJVVEVTIF9fdHlwZW9mX18odHlwZSkgcGVyX2NwdV9fIyNuYW1lCQlcCiAJX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcAorCisjZGVmaW5lIERFRklORV9QRVJfQ1BVX1BBR0VfQUxJR05FRCh0eXBlLCBuYW1lKQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEucGVyY3B1LnBhZ2VfYWxpZ25lZCIpKSkJXAorCVBFUl9DUFVfQVRUUklCVVRFUyBfX3R5cGVvZl9fKHR5cGUpIHBlcl9jcHVfXyMjbmFtZQogI2Vsc2UKICNkZWZpbmUgREVGSU5FX1BFUl9DUFUodHlwZSwgbmFtZSkJCQkJCVwKIAlQRVJfQ1BVX0FUVFJJQlVURVMgX190eXBlb2ZfXyh0eXBlKSBwZXJfY3B1X18jI25hbWUKIAogI2RlZmluZSBERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRCh0eXBlLCBuYW1lKQkJICAgICAgXAogCURFRklORV9QRVJfQ1BVKHR5cGUsIG5hbWUpCisKKyNkZWZpbmUgREVGSU5FX1BFUl9DUFVfUEFHRV9BTElHTkVEKHR5cGUsIG5hbWUpCQkgICAgICBcCisJREVGSU5FX1BFUl9DUFUodHlwZSwgbmFtZSkKICNlbmRpZgogCiAjZGVmaW5lIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTCh2YXIpIEVYUE9SVF9TWU1CT0wocGVyX2NwdV9fIyN2YXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKaW5kZXggMjA4Mzg4OC4uOTAwN2NjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaApAQCAtMzUsNyArMzUsNyBAQAogdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIHZvaWQgcGVyY3B1X2NvdW50ZXJfc2V0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKIHZvaWQgX19wZXJjcHVfY291bnRlcl9hZGQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQsIHMzMiBiYXRjaCk7Ci1zNjQgX19wZXJjcHVfY291bnRlcl9zdW0oc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIGludCBzZXQpOworczY0IF9fcGVyY3B1X2NvdW50ZXJfc3VtKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2FkZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKIHsKQEAgLTQ0LDE5ICs0NCwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHM2NCBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7Ci0JczY0IHJldCA9IF9fcGVyY3B1X2NvdW50ZXJfc3VtKGZiYywgMCk7CisJczY0IHJldCA9IF9fcGVyY3B1X2NvdW50ZXJfc3VtKGZiYyk7CiAJcmV0dXJuIHJldCA8IDAgPyAwIDogcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHM2NCBwZXJjcHVfY291bnRlcl9zdW1fYW5kX3NldChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKLXsKLQlyZXR1cm4gX19wZXJjcHVfY291bnRlcl9zdW0oZmJjLCAxKTsKLX0KLQotCiBzdGF0aWMgaW5saW5lIHM2NCBwZXJjcHVfY291bnRlcl9zdW0oc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7Ci0JcmV0dXJuIF9fcGVyY3B1X2NvdW50ZXJfc3VtKGZiYywgMCk7CisJcmV0dXJuIF9fcGVyY3B1X2NvdW50ZXJfc3VtKGZiYyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3JlYWQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCmluZGV4IDcwMDcyNWQuLjAxYjI2MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCkBAIC0yMjYsNiArMjI2LDE1IEBACiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NlY19jdHgpID0gOCAqLwogCisvKiBVc2VkIGJ5IE1JR1JBVEUgdG8gcGFzcyBhZGRyZXNzZXMgSUtFIHdpbGwgdXNlIHRvIHBlcmZvcm0KKyAqIG5lZ290aWF0aW9uIHdpdGggdGhlIHBlZXIgKi8KK3N0cnVjdCBzYWRiX3hfa21hZGRyZXNzIHsKKwl1aW50MTZfdAlzYWRiX3hfa21hZGRyZXNzX2xlbjsKKwl1aW50MTZfdAlzYWRiX3hfa21hZGRyZXNzX2V4dHR5cGU7CisJdWludDMyX3QJc2FkYl94X2ttYWRkcmVzc19yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9rbWFkZHJlc3MpID09IDggKi8KKwogLyogTWVzc2FnZSB0eXBlcyAqLwogI2RlZmluZSBTQURCX1JFU0VSVkVECQkwCiAjZGVmaW5lIFNBREJfR0VUU1BJCQkxCkBAIC0zNDYsNyArMzU1LDkgQEAKICNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9EUE9SVAkJMjIKICNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9PQQkJMjMKICNkZWZpbmUgU0FEQl9YX0VYVF9TRUNfQ1RYCQkyNAotI2RlZmluZSBTQURCX0VYVF9NQVgJCQkyNAorLyogVXNlZCB3aXRoIE1JR1JBVEUgdG8gcGFzcyBAIHRvIElLRSBmb3IgbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgU0FEQl9YX0VYVF9LTUFERFJFU1MJCTI1CisjZGVmaW5lIFNBREJfRVhUX01BWAkJCTI1CiAKIC8qIElkZW50aXR5IEV4dGVuc2lvbiB2YWx1ZXMgKi8KICNkZWZpbmUgU0FEQl9JREVOVFRZUEVfUkVTRVJWRUQJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZm4uaCBiL2luY2x1ZGUvbGludXgvcGZuLmgKaW5kZXggYmIwMWY4Yi4uNzY0NjYzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bmbi5oCkBAIC0xLDkgKzEsMTMgQEAKICNpZm5kZWYgX0xJTlVYX1BGTl9IXwogI2RlZmluZSBfTElOVVhfUEZOX0hfCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCiAjZGVmaW5lIFBGTl9BTElHTih4KQkoKCh1bnNpZ25lZCBsb25nKSh4KSArIChQQUdFX1NJWkUgLSAxKSkgJiBQQUdFX01BU0spCiAjZGVmaW5lIFBGTl9VUCh4KQkoKCh4KSArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBQRk5fRE9XTih4KQkoKHgpID4+IFBBR0VfU0hJRlQpCi0jZGVmaW5lIFBGTl9QSFlTKHgpCSgoeCkgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgUEZOX1BIWVMoeCkJKChwaHlzX2FkZHJfdCkoeCkgPDwgUEFHRV9TSElGVCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bob25ldC5oIGIvaW5jbHVkZS9saW51eC9waG9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYwOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9waG9uZXQuaApAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBmaWxlIHBob25ldC5oCisgKgorICogUGhvbmV0IHNvY2tldHMga2VybmVsIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBMSU5VWF9QSE9ORVRfSAorI2RlZmluZSBMSU5VWF9QSE9ORVRfSAorCisvKiBBdXRvbWF0aWMgcHJvdG9jb2wgc2VsZWN0aW9uICovCisjZGVmaW5lIFBOX1BST1RPX1RSQU5TUE9SVAkwCisvKiBQaG9uZXQgZGF0YWdyYW0gc29ja2V0ICovCisjZGVmaW5lIFBOX1BST1RPX1BIT05FVAkJMQorLyogUGhvbmV0IHBpcGUgKi8KKyNkZWZpbmUgUE5fUFJPVE9fUElQRQkJMgorI2RlZmluZSBQSE9ORVRfTlBST1RPCQkzCisKKy8qIFNvY2tldCBvcHRpb25zIGZvciBTT0xfUE5QSVBFIGxldmVsICovCisjZGVmaW5lIFBOUElQRV9FTkNBUAkJMQorI2RlZmluZSBQTlBJUEVfSUZJTkRFWAkJMgorCisjZGVmaW5lIFBOQUREUl9BTlkJCTAKKyNkZWZpbmUgUE5QT1JUX1JFU09VUkNFX1JPVVRJTkcJMAorCisvKiBWYWx1ZXMgZm9yIFBOUElQRV9FTkNBUCBvcHRpb24gKi8KKyNkZWZpbmUgUE5QSVBFX0VOQ0FQX05PTkUJMAorI2RlZmluZSBQTlBJUEVfRU5DQVBfSVAJCTEKKworLyogaW9jdGxzICovCisjZGVmaW5lIFNJT0NQTkdFVE9CSkVDVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAwKQorCisvKiBQaG9uZXQgcHJvdG9jb2wgaGVhZGVyICovCitzdHJ1Y3QgcGhvbmV0aGRyIHsKKwlfX3U4CXBuX3JkZXY7CisJX191OAlwbl9zZGV2OworCV9fdTgJcG5fcmVzOworCV9fYmUxNglwbl9sZW5ndGg7CisJX191OAlwbl9yb2JqOworCV9fdTgJcG5fc29iajsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIENvbW1vbiBQaG9uZXQgcGF5bG9hZCBoZWFkZXIgKi8KK3N0cnVjdCBwaG9uZXRtc2cgeworCV9fdTgJcG5fdHJhbnNfaWQ7CS8qIHRyYW5zYWN0aW9uIElEICovCisJX191OAlwbl9tc2dfaWQ7CS8qIG1lc3NhZ2UgdHlwZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTgJcG5fc3VibXNnX2lkOwkvKiBtZXNzYWdlIHN1YnR5cGUgKi8KKwkJCV9fdTgJcG5fZGF0YVs1XTsKKwkJfSBiYXNlOworCQlzdHJ1Y3QgeworCQkJX191MTYJcG5fZV9yZXNfaWQ7CS8qIGV4dGVuZGVkIHJlc291cmNlIElEICovCisJCQlfX3U4CXBuX2Vfc3VibXNnX2lkOwkvKiBtZXNzYWdlIHN1YnR5cGUgKi8KKwkJCV9fdTgJcG5fZV9kYXRhWzNdOworCQl9IGV4dDsKKwl9IHBuX21zZ191OworfTsKKyNkZWZpbmUgUE5fQ09NTU9OX01FU1NBR0UJMHhGMAorI2RlZmluZSBQTl9QUkVGSVgJCTB4RTAgLyogcmVzb3VyY2UgZm9yIGV4dGVuZGVkIG1lc3NhZ2VzICovCisjZGVmaW5lIHBuX3N1Ym1zZ19pZAkJcG5fbXNnX3UuYmFzZS5wbl9zdWJtc2dfaWQKKyNkZWZpbmUgcG5fZV9zdWJtc2dfaWQJCXBuX21zZ191LmV4dC5wbl9lX3N1Ym1zZ19pZAorI2RlZmluZSBwbl9lX3Jlc19pZAkJcG5fbXNnX3UuZXh0LnBuX2VfcmVzX2lkCisjZGVmaW5lIHBuX2RhdGEJCQlwbl9tc2dfdS5iYXNlLnBuX2RhdGEKKyNkZWZpbmUgcG5fZV9kYXRhCQlwbl9tc2dfdS5leHQucG5fZV9kYXRhCisKKy8qIGRhdGEgZm9yIHVucmVhY2hhYmxlIGVycm9ycyAqLworI2RlZmluZSBQTl9DT01NX1NFUlZJQ0VfTk9UX0lERU5USUZJRURfUkVTUAkweDAxCisjZGVmaW5lIFBOX0NPTU1fSVNBX0VOVElUWV9OT1RfUkVBQ0hBQkxFX1JFU1AJMHgxNAorI2RlZmluZSBwbl9vcmlnX21zZ19pZAkJcG5fZGF0YVswXQorI2RlZmluZSBwbl9zdGF0dXMJCXBuX2RhdGFbMV0KKyNkZWZpbmUgcG5fZV9vcmlnX21zZ19pZAlwbl9lX2RhdGFbMF0KKyNkZWZpbmUgcG5fZV9zdGF0dXMJCXBuX2VfZGF0YVsxXQorCisvKiBQaG9uZXQgc29ja2V0IGFkZHJlc3Mgc3RydWN0dXJlICovCitzdHJ1Y3Qgc29ja2FkZHJfcG4geworCXNhX2ZhbWlseV90IHNwbl9mYW1pbHk7CisJX191OCBzcG5fb2JqOworCV9fdTggc3BuX2RldjsKKwlfX3U4IHNwbl9yZXNvdXJjZTsKKwlfX3U4IHNwbl96ZXJvW3NpemVvZihzdHJ1Y3Qgc29ja2FkZHIpIC0gc2l6ZW9mKHNhX2ZhbWlseV90KSAtIDNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgX191MTYgcG5fb2JqZWN0KF9fdTggYWRkciwgX191MTYgcG9ydCkKK3sKKwlyZXR1cm4gKGFkZHIgPDwgOCkgfCAocG9ydCAmIDB4M2ZmKTsKK30KKworc3RhdGljIGlubGluZSBfX3U4IHBuX29iaihfX3UxNiBoYW5kbGUpCit7CisJcmV0dXJuIGhhbmRsZSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBwbl9kZXYoX191MTYgaGFuZGxlKQoreworCXJldHVybiBoYW5kbGUgPj4gODsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBwbl9wb3J0KF9fdTE2IGhhbmRsZSkKK3sKKwlyZXR1cm4gaGFuZGxlICYgMHgzZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBwbl9hZGRyKF9fdTE2IGhhbmRsZSkKK3sKKwlyZXR1cm4gKGhhbmRsZSA+PiA4KSAmIDB4ZmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbl9zb2NrYWRkcl9zZXRfYWRkcihzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbiwgX191OCBhZGRyKQoreworCXNwbi0+c3BuX2RldiAmPSAweDAzOworCXNwbi0+c3BuX2RldiB8PSBhZGRyICYgMHhmYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBuX3NvY2thZGRyX3NldF9wb3J0KHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLCBfX3UxNiBwb3J0KQoreworCXNwbi0+c3BuX2RldiAmPSAweGZjOworCXNwbi0+c3BuX2RldiB8PSAocG9ydCA+PiA4KSAmIDB4MDM7CisJc3BuLT5zcG5fb2JqID0gcG9ydCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbl9zb2NrYWRkcl9zZXRfb2JqZWN0KHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLAorCQkJCQkJX191MTYgaGFuZGxlKQoreworCXNwbi0+c3BuX2RldiA9IHBuX2RldihoYW5kbGUpOworCXNwbi0+c3BuX29iaiA9IHBuX29iaihoYW5kbGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG5fc29ja2FkZHJfc2V0X3Jlc291cmNlKHN0cnVjdCBzb2NrYWRkcl9wbiAqc3BuLAorCQkJCQkJX191OCByZXNvdXJjZSkKK3sKKwlzcG4tPnNwbl9yZXNvdXJjZSA9IHJlc291cmNlOworfQorCitzdGF0aWMgaW5saW5lIF9fdTggcG5fc29ja2FkZHJfZ2V0X2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpzcG4pCit7CisJcmV0dXJuIHNwbi0+c3BuX2RldiAmIDB4ZmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgcG5fc29ja2FkZHJfZ2V0X3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpzcG4pCit7CisJcmV0dXJuICgoc3BuLT5zcG5fZGV2ICYgMHgwMykgPDwgOCkgfCBzcG4tPnNwbl9vYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgcG5fc29ja2FkZHJfZ2V0X29iamVjdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbikKK3sKKwlyZXR1cm4gcG5fb2JqZWN0KHNwbi0+c3BuX2Rldiwgc3BuLT5zcG5fb2JqKTsKK30KKworc3RhdGljIGlubGluZSBfX3U4IHBuX3NvY2thZGRyX2dldF9yZXNvdXJjZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNwbikKK3sKKwlyZXR1cm4gc3BuLT5zcG5fcmVzb3VyY2U7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5LmgKaW5kZXggNzIyNGM0MC4uNzdjNGVkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS5oCkBAIC05OSw3ICs5OSwxNCBAQAogCSAqLwogCXN0cnVjdCBtdXRleCBtZGlvX2xvY2s7CiAKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50OworCWVudW0geworCQlNRElPQlVTX0FMTE9DQVRFRCA9IDEsCisJCU1ESU9CVVNfUkVHSVNURVJFRCwKKwkJTURJT0JVU19VTlJFR0lTVEVSRUQsCisJCU1ESU9CVVNfUkVMRUFTRUQsCisJfSBzdGF0ZTsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKIAogCS8qIGxpc3Qgb2YgYWxsIFBIWXMgb24gYnVzICovCiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9tYXBbUEhZX01BWF9BRERSXTsKQEAgLTExMyw2ICsxMjAsMTYgQEAKIAkgKi8KIAlpbnQgKmlycTsKIH07CisjZGVmaW5lIHRvX21paV9idXMoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBtaWlfYnVzLCBkZXYpCisKK3N0cnVjdCBtaWlfYnVzICptZGlvYnVzX2FsbG9jKHZvaWQpOworaW50IG1kaW9idXNfcmVnaXN0ZXIoc3RydWN0IG1paV9idXMgKmJ1cyk7Cit2b2lkIG1kaW9idXNfdW5yZWdpc3RlcihzdHJ1Y3QgbWlpX2J1cyAqYnVzKTsKK3ZvaWQgbWRpb2J1c19mcmVlKHN0cnVjdCBtaWlfYnVzICpidXMpOworc3RydWN0IHBoeV9kZXZpY2UgKm1kaW9idXNfc2NhbihzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkcik7CitpbnQgbWRpb2J1c19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCB1MTYgcmVnbnVtKTsKK2ludCBtZGlvYnVzX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCB1MTYgcmVnbnVtLCB1MTYgdmFsKTsKKwogCiAjZGVmaW5lIFBIWV9JTlRFUlJVUFRfRElTQUJMRUQJMHgwCiAjZGVmaW5lIFBIWV9JTlRFUlJVUFRfRU5BQkxFRAkweDgwMDAwMDAwCkBAIC0zOTEsOCArNDA4LDM1IEBACiAJaW50ICgqcnVuKShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIH07CiAKLWludCBwaHlfcmVhZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MTYgcmVnbnVtKTsKLWludCBwaHlfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTE2IHJlZ251bSwgdTE2IHZhbCk7CisvKioKKyAqIHBoeV9yZWFkIC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYSBnaXZlbiBQSFkgcmVnaXN0ZXIKKyAqIEBwaHlkZXY6IHRoZSBwaHlfZGV2aWNlIHN0cnVjdAorICogQHJlZ251bTogcmVnaXN0ZXIgbnVtYmVyIHRvIHJlYWQKKyAqCisgKiBOT1RFOiBNVVNUIE5PVCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwKKyAqIGJlY2F1c2UgdGhlIGJ1cyByZWFkL3dyaXRlIGZ1bmN0aW9ucyBtYXkgd2FpdCBmb3IgYW4gaW50ZXJydXB0CisgKiB0byBjb25jbHVkZSB0aGUgb3BlcmF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCBwaHlfcmVhZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MTYgcmVnbnVtKQoreworCXJldHVybiBtZGlvYnVzX3JlYWQocGh5ZGV2LT5idXMsIHBoeWRldi0+YWRkciwgcmVnbnVtKTsKK30KKworLyoqCisgKiBwaHlfd3JpdGUgLSBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3Igd3JpdGluZyBhIGdpdmVuIFBIWSByZWdpc3RlcgorICogQHBoeWRldjogdGhlIHBoeV9kZXZpY2Ugc3RydWN0CisgKiBAcmVnbnVtOiByZWdpc3RlciBudW1iZXIgdG8gd3JpdGUKKyAqIEB2YWw6IHZhbHVlIHRvIHdyaXRlIHRvIEByZWdudW0KKyAqCisgKiBOT1RFOiBNVVNUIE5PVCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwKKyAqIGJlY2F1c2UgdGhlIGJ1cyByZWFkL3dyaXRlIGZ1bmN0aW9ucyBtYXkgd2FpdCBmb3IgYW4gaW50ZXJydXB0CisgKiB0byBjb25jbHVkZSB0aGUgb3BlcmF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCBwaHlfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTE2IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlyZXR1cm4gbWRpb2J1c193cml0ZShwaHlkZXYtPmJ1cywgcGh5ZGV2LT5hZGRyLCByZWdudW0sIHZhbCk7Cit9CisKIGludCBnZXRfcGh5X2lkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCB1MzIgKnBoeV9pZCk7CiBzdHJ1Y3QgcGh5X2RldmljZSogZ2V0X3BoeV9kZXZpY2Uoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIpOwogaW50IHBoeV9jbGVhcl9pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CkBAIC00MDgsOCArNDUyLDYgQEAKIHZvaWQgcGh5X3N0b3Aoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiBpbnQgcGh5X3N0YXJ0X2FuZWcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiAKLWludCBtZGlvYnVzX3JlZ2lzdGVyKHN0cnVjdCBtaWlfYnVzICpidXMpOwotdm9pZCBtZGlvYnVzX3VucmVnaXN0ZXIoc3RydWN0IG1paV9idXMgKmJ1cyk7CiB2b2lkIHBoeV9zYW5pdGl6ZV9zZXR0aW5ncyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKIGludCBwaHlfc3RvcF9pbnRlcnJ1cHRzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogaW50IHBoeV9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggMWFmODJjNC4uZDgyZmU4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTg0LDEyICs4NCw2IEBACiAJcmV0dXJuIHRzay0+bnNwcm94eS0+cGlkX25zOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza19jaGlsZF9yZWFwZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JQlVHX09OKHRzayAhPSBjdXJyZW50KTsKLQlyZXR1cm4gdHNrLT5uc3Byb3h5LT5waWRfbnMtPmNoaWxkX3JlYXBlcjsKLX0KLQogdm9pZCBwaWRoYXNoX2luaXQodm9pZCk7CiB2b2lkIHBpZG1hcF9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAppbmRleCBlNWRlNDIxLi41ZDkyMWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKQEAgLTEyMyw2ICsxMjMsMTMgQEAKIAlfX3U4CXByaW9tYXBbVENfUFJJT19NQVgrMV07CS8qIE1hcDogbG9naWNhbCBwcmlvcml0eSAtPiBQUklPIGJhbmQgKi8KIH07CiAKKy8qIE1VTFRJUSBzZWN0aW9uICovCisKK3N0cnVjdCB0Y19tdWx0aXFfcW9wdCB7CisJX191MTYJYmFuZHM7CQkJLyogTnVtYmVyIG9mIGJhbmRzICovCisJX191MTYJbWF4X2JhbmRzOwkJLyogTWF4aW11bSBudW1iZXIgb2YgcXVldWVzICovCit9OworCiAvKiBUQkYgc2VjdGlvbiAqLwogCiBzdHJ1Y3QgdGNfdGJmX3FvcHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCmluZGV4IDk1YWMyMWEuLjRiOGNjNmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaApAQCAtMzcsNiArMzcsOCBAQAogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShjb25zdCBjaGFyICosIGludCBpZCwKIAkJCQkJc3RydWN0IHJlc291cmNlICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoc3RydWN0IGRldmljZSAqLAorCQljb25zdCBjaGFyICosIGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCk7CiBleHRlcm4gaW50IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA0ZGNjZTU0Li40MmRlNDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC00MTksNyArNDE5LDcgQEAKIAogI2RlZmluZSBzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZm4sIHJldCkJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCV9fc3VzcGVuZF9yZXBvcnRfcmVzdWx0KF9fRlVOQ1RJT05fXywgZm4sIHJldCk7CQlcCisJCV9fc3VzcGVuZF9yZXBvcnRfcmVzdWx0KF9fZnVuY19fLCBmbiwgcmV0KTsJCVwKIAl9IHdoaWxlICgwKQogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BucC5oIGIvaW5jbHVkZS9saW51eC9wbnAuaAppbmRleCAxY2U1NGI2Li41M2I3MGZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BucC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG5wLmgKQEAgLTIxLDcgKzIxLDE2IEBACiAvKgogICogUmVzb3VyY2UgTWFuYWdlbWVudAogICovCi1zdHJ1Y3QgcmVzb3VyY2UgKnBucF9nZXRfcmVzb3VyY2Uoc3RydWN0IHBucF9kZXYgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworI2lmZGVmIENPTkZJR19QTlAKK3N0cnVjdCByZXNvdXJjZSAqcG5wX2dldF9yZXNvdXJjZShzdHJ1Y3QgcG5wX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIHR5cGUsCisJCQkJdW5zaWduZWQgaW50IG51bSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKnBucF9nZXRfcmVzb3VyY2Uoc3RydWN0IHBucF9kZXYgKmRldiwKKwkJCXVuc2lnbmVkIGxvbmcgdHlwZSwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBwbnBfcmVzb3VyY2VfdmFsaWQoc3RydWN0IHJlc291cmNlICpyZXMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCmluZGV4IGZiNjE4NTAuLjI3ZDUzNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19mcy5oCkBAIC0xMzksNyArMTM5LDYgQEAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpwcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2tjb3JlX29wZXJhdGlvbnM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcGNfaHRhYl9vcGVyYXRpb25zOwogCiBleHRlcm4gaW50IHBpZF9uc19wcmVwYXJlX3Byb2Moc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKIGV4dGVybiB2b2lkIHBpZF9uc19yZWxlYXNlX3Byb2Moc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKaW5kZXggN2U3MDg3Mi4uNTcwMDQ1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKQEAgLTM1LDcgKzM1LDkgQEAKIGV4dGVybiBpbnQgcHJvZl9vbiBfX3JlYWRfbW9zdGx5OwogCiAvKiBpbml0IGJhc2ljIGtlcm5lbCBwcm9maWxlciAqLwotdm9pZCBfX2luaXQgcHJvZmlsZV9pbml0KHZvaWQpOworaW50IHByb2ZpbGVfaW5pdCh2b2lkKTsKK2ludCBwcm9maWxlX3NldHVwKGNoYXIgKnN0cik7CitpbnQgY3JlYXRlX3Byb2NfcHJvZmlsZSh2b2lkKTsKIHZvaWQgcHJvZmlsZV90aWNrKGludCB0eXBlKTsKIAogLyoKQEAgLTg0LDkgKzg2LDkgQEAKIAogI2RlZmluZSBwcm9mX29uIDAKIAotc3RhdGljIGlubGluZSB2b2lkIHByb2ZpbGVfaW5pdCh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgcHJvZmlsZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJvZmlsZV90aWNrKGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9wb3J0aW9ucy5oIGIvaW5jbHVkZS9saW51eC9wcm9wb3J0aW9ucy5oCmluZGV4IDVhZmMxYjIuLmNmNzkzYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvcG9ydGlvbnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb3BvcnRpb25zLmgKQEAgLTEwNCw4ICsxMDQsOCBAQAogCSAqIHNuYXBzaG90IG9mIHRoZSBsYXN0IHNlZW4gZ2xvYmFsIHN0YXRlCiAJICogYW5kIGEgbG9jayBwcm90ZWN0aW5nIHRoaXMgc3RhdGUKIAkgKi8KLQlpbnQgc2hpZnQ7CiAJdW5zaWduZWQgbG9uZyBwZXJpb2Q7CisJaW50IHNoaWZ0OwogCXNwaW5sb2NrX3QgbG9jazsJCS8qIHByb3RlY3QgdGhlIHNuYXBzaG90IHN0YXRlICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3RhLmggYi9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKaW5kZXggMzc2YTA1MC4uNDA0MDFiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xdW90YS5oCisrKyBiL2luY2x1ZGUvbGludXgvcXVvdGEuaApAQCAtMjgsOCArMjgsNiBAQAogICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogICogU1VDSCBEQU1BR0UuCi0gKgotICogVmVyc2lvbjogJElkOiBxdW90YS5oLHYgMi4wIDE5OTYvMTEvMTcgMTY6NDg6MTQgbXZ3IEV4cCBtdncgJAogICovCiAKICNpZm5kZWYgX0xJTlVYX1FVT1RBXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oIGIvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCmluZGV4IGNhNmI5YjUuLmE1NThhNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKQEAgLTMsOSArMyw2IEBACiAgKiBtYWNyb3MgZXhwYW5kIHRvIHRoZSByaWdodCBzb3VyY2UtY29kZS4KICAqCiAgKiBBdXRob3I6ICBNYXJjbyB2YW4gV2llcmluZ2VuIDxtdndAcGxhbmV0cy5lbG0ubmV0PgotICoKLSAqIFZlcnNpb246ICRJZDogcXVvdGFvcHMuaCx2IDEuMiAxOTk4LzAxLzE1IDE2OjIyOjI2IGVjZCBFeHAgJAotICoKICAqLwogI2lmbmRlZiBfTElOVVhfUVVPVEFPUFNfCiAjZGVmaW5lIF9MSU5VWF9RVU9UQU9QU18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9saW5lYXIuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9saW5lYXIuaAppbmRleCA3ZTM3NTExLi5mMzhiOWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbGluZWFyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL2xpbmVhci5oCkBAIC01LDggKzUsOCBAQAogCiBzdHJ1Y3QgZGV2X2luZm8gewogCW1ka19yZGV2X3QJKnJkZXY7Ci0Jc2VjdG9yX3QJc2l6ZTsKLQlzZWN0b3JfdAlvZmZzZXQ7CisJc2VjdG9yX3QJbnVtX3NlY3RvcnM7CisJc2VjdG9yX3QJc3RhcnRfc2VjdG9yOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgZGV2X2luZm8gZGV2X2luZm9fdDsKQEAgLTE1LDkgKzE1LDExIEBACiB7CiAJc3RydWN0IGxpbmVhcl9wcml2YXRlX2RhdGEgKnByZXY7CS8qIGVhcmxpZXIgdmVyc2lvbiAqLwogCWRldl9pbmZvX3QJCSoqaGFzaF90YWJsZTsKLQlzZWN0b3JfdAkJaGFzaF9zcGFjaW5nOworCXNlY3Rvcl90CQlzcGFjaW5nOwogCXNlY3Rvcl90CQlhcnJheV9zZWN0b3JzOwotCWludAkJCXByZXNoaWZ0OyAvKiBzaGlmdCBiZWZvcmUgZGl2aWRpbmcgYnkgaGFzaF9zcGFjaW5nICovCisJaW50CQkJc2VjdG9yX3NoaWZ0OwkvKiBzaGlmdCBiZWZvcmUgZGl2aWRpbmcKKwkJCQkJCSAqIGJ5IHNwYWNpbmcKKwkJCQkJCSAqLwogCWRldl9pbmZvX3QJCWRpc2tzWzBdOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWQuaAppbmRleCBkYzBlM2ZjLi44MmJlYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWQuaApAQCAtMTksMjcgKzE5LDcgQEAKICNkZWZpbmUgX01EX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+Ci0jaW5jbHVkZSA8bGludXgvYmlvLmg+CiAKIC8qCiAgKiAnbWRfcC5oJyBob2xkcyB0aGUgJ3BoeXNpY2FsJyBsYXlvdXQgb2YgUkFJRCBkZXZpY2VzCkBAIC03NCwxOSArNTQsMTcgQEAKIAogZXh0ZXJuIGludCBtZHBfbWFqb3I7CiAKLWV4dGVybiBpbnQgcmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkgKHN0cnVjdCBtZGtfcGVyc29uYWxpdHkgKnApOwotZXh0ZXJuIGludCB1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5IChzdHJ1Y3QgbWRrX3BlcnNvbmFsaXR5ICpwKTsKLWV4dGVybiBtZGtfdGhyZWFkX3QgKiBtZF9yZWdpc3Rlcl90aHJlYWQgKHZvaWQgKCpydW4pIChtZGRldl90ICptZGRldiksCitleHRlcm4gaW50IHJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KHN0cnVjdCBtZGtfcGVyc29uYWxpdHkgKnApOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KHN0cnVjdCBtZGtfcGVyc29uYWxpdHkgKnApOworZXh0ZXJuIG1ka190aHJlYWRfdCAqIG1kX3JlZ2lzdGVyX3RocmVhZCh2b2lkICgqcnVuKSAobWRkZXZfdCAqbWRkZXYpLAogCQkJCW1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIG1kX3VucmVnaXN0ZXJfdGhyZWFkIChtZGtfdGhyZWFkX3QgKnRocmVhZCk7CitleHRlcm4gdm9pZCBtZF91bnJlZ2lzdGVyX3RocmVhZChtZGtfdGhyZWFkX3QgKnRocmVhZCk7CiBleHRlcm4gdm9pZCBtZF93YWtldXBfdGhyZWFkKG1ka190aHJlYWRfdCAqdGhyZWFkKTsKIGV4dGVybiB2b2lkIG1kX2NoZWNrX3JlY292ZXJ5KG1kZGV2X3QgKm1kZGV2KTsKIGV4dGVybiB2b2lkIG1kX3dyaXRlX3N0YXJ0KG1kZGV2X3QgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaSk7CiBleHRlcm4gdm9pZCBtZF93cml0ZV9lbmQobWRkZXZfdCAqbWRkZXYpOwotZXh0ZXJuIHZvaWQgbWRfaGFuZGxlX3NhZmVtb2RlKG1kZGV2X3QgKm1kZGV2KTsKIGV4dGVybiB2b2lkIG1kX2RvbmVfc3luYyhtZGRldl90ICptZGRldiwgaW50IGJsb2NrcywgaW50IG9rKTsKLWV4dGVybiB2b2lkIG1kX2Vycm9yIChtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldik7Ci1leHRlcm4gdm9pZCBtZF91bnBsdWdfbWRkZXYobWRkZXZfdCAqbWRkZXYpOworZXh0ZXJuIHZvaWQgbWRfZXJyb3IobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpOwogCiBleHRlcm4gdm9pZCBtZF9zdXBlcl93cml0ZShtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldiwKIAkJCSAgIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsIHN0cnVjdCBwYWdlICpwYWdlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFtZnMuaCBiL2luY2x1ZGUvbGludXgvcmFtZnMuaAppbmRleCBiMTYwZmIxOC4uMzdhYWYyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYW1mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFtZnMuaApAQCAtNiw2ICs2LDcgQEAKIAkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOwogCiAjaWZuZGVmIENPTkZJR19NTVUKK2V4dGVybiBpbnQgcmFtZnNfbm9tbXVfZXhwYW5kX2Zvcl9tYXBwaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBuZXdzaXplKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJhbWZzX25vbW11X2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgbG9uZyBsZW4sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdWNsYXNzaWMuaCBiL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCmluZGV4IDRhYjg0MzYuLjVmODliNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1Y2xhc3NpYy5oCkBAIC00MCwxMiArNDAsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogCisjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKKyNkZWZpbmUgUkNVX1NFQ09ORFNfVElMTF9TVEFMTF9DSEVDSwkoIDMgKiBIWikgLyogZm9yIHJjcC0+amlmZmllc19zdGFsbCAqLworI2RlZmluZSBSQ1VfU0VDT05EU19USUxMX1NUQUxMX1JFQ0hFQ0sJKDMwICogSFopIC8qIGZvciByY3AtPmppZmZpZXNfc3RhbGwgKi8KKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KIAogLyogR2xvYmFsIGNvbnRyb2wgdmFyaWFibGVzIGZvciByY3VwZGF0ZSBjYWxsYmFjayBtZWNoYW5pc20uICovCiBzdHJ1Y3QgcmN1X2N0cmxibGsgewogCWxvbmcJY3VyOwkJLyogQ3VycmVudCBiYXRjaCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICovCiAJbG9uZwljb21wbGV0ZWQ7CS8qIE51bWJlciBvZiB0aGUgbGFzdCBjb21wbGV0ZWQgYmF0Y2ggICAgICAgICAqLwotCWludAluZXh0X3BlbmRpbmc7CS8qIElzIHRoZSBuZXh0IGJhdGNoIGFscmVhZHkgd2FpdGluZz8gICAgICAgICAqLworCWxvbmcJcGVuZGluZzsJLyogTnVtYmVyIG9mIHRoZSBsYXN0IHBlbmRpbmcgYmF0Y2ggICAgICAgICAgICovCisjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKKwl1bnNpZ25lZCBsb25nIGdwX3N0YXJ0OwkvKiBUaW1lIGF0IHdoaWNoIEdQIHN0YXJ0ZWQgaW4gamlmZmllcy4gKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfc3RhbGw7CisJCQkJLyogVGltZSBhdCB3aGljaCB0byBjaGVjayBmb3IgQ1BVIHN0YWxscy4gKi8KKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KIAogCWludAlzaWduYWxlZDsKIApAQCAtNjYsMTEgKzc1LDcgQEAKIAlyZXR1cm4gKGEgLSBiKSA+IDA7CiB9CiAKLS8qCi0gKiBQZXItQ1BVIGRhdGEgZm9yIFJlYWQtQ29weSBVUGRhdGUuCi0gKiBueHRsaXN0IC0gbmV3IGNhbGxiYWNrcyBhcmUgYWRkZWQgaGVyZQotICogY3VybGlzdCAtIGN1cnJlbnQgYmF0Y2ggZm9yIHdoaWNoIHF1aWVzY2VudCBjeWNsZSBzdGFydGVkIGlmIGFueQotICovCisvKiBQZXItQ1BVIGRhdGEgZm9yIFJlYWQtQ29weSBVUGRhdGUuICovCiBzdHJ1Y3QgcmN1X2RhdGEgewogCS8qIDEpIHF1aWVzY2VudCBzdGF0ZSBoYW5kbGluZyA6ICovCiAJbG9uZwkJcXVpZXNjYmF0Y2g7ICAgICAvKiBCYXRjaCAjIGZvciBncmFjZSBwZXJpb2QgKi8KQEAgLTc4LDEyICs4MywyNCBAQAogCWludAkJcXNfcGVuZGluZzsJIC8qIGNvcmUgd2FpdHMgZm9yIHF1aWVzYyBzdGF0ZSAqLwogCiAJLyogMikgYmF0Y2ggaGFuZGxpbmcgKi8KLQlsb25nICAJICAgICAgIAliYXRjaDsgICAgICAgICAgIC8qIEJhdGNoICMgZm9yIGN1cnJlbnQgUkNVIGJhdGNoICovCisJLyoKKwkgKiBpZiBueHRsaXN0IGlzIG5vdCBOVUxMLCB0aGVuOgorCSAqIGJhdGNoOgorCSAqCVRoZSBiYXRjaCAjIGZvciB0aGUgbGFzdCBlbnRyeSBvZiBueHRsaXN0CisJICogWypueHR0YWlsWzFdLCBOVUxMID0gKm54dHRhaWxbMl0pOgorCSAqCUVudHJpZXMgdGhhdCBiYXRjaCAjIDw9IGJhdGNoCisJICogWypueHR0YWlsWzBdLCAqbnh0dGFpbFsxXSk6CisJICoJRW50cmllcyB0aGF0IGJhdGNoICMgPD0gYmF0Y2ggLSAxCisJICogW254dGxpc3QsICpueHR0YWlsWzBdKToKKwkgKglFbnRyaWVzIHRoYXQgYmF0Y2ggIyA8PSBiYXRjaCAtIDIKKwkgKglUaGUgZ3JhY2UgcGVyaW9kIGZvciB0aGVzZSBlbnRyaWVzIGhhcyBjb21wbGV0ZWQsIGFuZAorCSAqCXRoZSBvdGhlciBncmFjZS1wZXJpb2QtY29tcGxldGVkIGVudHJpZXMgbWF5IGJlIG1vdmVkCisJICoJaGVyZSB0ZW1wb3JhcmlseSBpbiByY3VfcHJvY2Vzc19jYWxsYmFja3MoKS4KKwkgKi8KKwlsb25nICAJICAgICAgIAliYXRjaDsKIAlzdHJ1Y3QgcmN1X2hlYWQgKm54dGxpc3Q7Ci0Jc3RydWN0IHJjdV9oZWFkICoqbnh0dGFpbDsKKwlzdHJ1Y3QgcmN1X2hlYWQgKipueHR0YWlsWzNdOwogCWxvbmcgICAgICAgICAgICBxbGVuOyAJIAkgLyogIyBvZiBxdWV1ZWQgY2FsbGJhY2tzICovCi0Jc3RydWN0IHJjdV9oZWFkICpjdXJsaXN0OwotCXN0cnVjdCByY3VfaGVhZCAqKmN1cnRhaWw7CiAJc3RydWN0IHJjdV9oZWFkICpkb25lbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgKipkb25ldGFpbDsKIAlsb25nCQlibGltaXQ7CQkgLyogVXBwZXIgbGltaXQgb24gYSBwcm9jZXNzZWQgYmF0Y2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1bGlzdC5oIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKaW5kZXggZWI0NDQzYy4uZTY0OWJkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VsaXN0LmgKQEAgLTE5OCwyMCArMTk4LDYgQEAKIAlhdC0+cHJldiA9IGxhc3Q7CiB9CiAKLS8qKgotICogbGlzdF9mb3JfZWFjaF9yY3UJLQlpdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsaXN0Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCi0gKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KLSAqCi0gKiBUaGlzIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZSBtYXkgc2FmZWx5IHJ1biBjb25jdXJyZW50bHkgd2l0aAotICogdGhlIF9yY3UgbGlzdC1tdXRhdGlvbiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkKLSAqIGFzIGxvbmcgYXMgdGhlIHRyYXZlcnNhbCBpcyBndWFyZGVkIGJ5IHJjdV9yZWFkX2xvY2soKS4KLSAqLwotI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKLQlmb3IgKHBvcyA9IHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpOyBcCi0JCXByZWZldGNoKHBvcy0+bmV4dCksIHBvcyAhPSAoaGVhZCk7IFwKLQkJcG9zID0gcmN1X2RlcmVmZXJlbmNlKHBvcy0+bmV4dCkpCi0KICNkZWZpbmUgX19saXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKIAlmb3IgKHBvcyA9IHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpOyBcCiAJCXBvcyAhPSAoaGVhZCk7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCBlOGI0MDM5Li44NmYxZjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC0xMzMsNiArMTMzLDI2IEBACiAjZGVmaW5lIHJjdV9yZWFkX3VubG9ja19iaCgpIF9fcmN1X3JlYWRfdW5sb2NrX2JoKCkKIAogLyoqCisgKiByY3VfcmVhZF9sb2NrX3NjaGVkIC0gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgUkNVLWNsYXNzaWMgY3JpdGljYWwgc2VjdGlvbgorICoKKyAqIFNob3VsZCBiZSB1c2VkIHdpdGggZWl0aGVyCisgKiAtIHN5bmNocm9uaXplX3NjaGVkKCkKKyAqIG9yCisgKiAtIGNhbGxfcmN1X3NjaGVkKCkgYW5kIHJjdV9iYXJyaWVyX3NjaGVkKCkKKyAqIG9uIHRoZSB3cml0ZS1zaWRlIHRvIGluc3VyZSBwcm9wZXIgc3luY2hyb25pemF0aW9uLgorICovCisjZGVmaW5lIHJjdV9yZWFkX2xvY2tfc2NoZWQoKSBwcmVlbXB0X2Rpc2FibGUoKQorCisvKgorICogcmN1X3JlYWRfdW5sb2NrX3NjaGVkIC0gbWFya3MgdGhlIGVuZCBvZiBhIFJDVS1jbGFzc2ljIGNyaXRpY2FsIHNlY3Rpb24KKyAqCisgKiBTZWUgcmN1X3JlYWRfbG9ja19zY2hlZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSByY3VfcmVhZF91bmxvY2tfc2NoZWQoKSBwcmVlbXB0X2VuYWJsZSgpCisKKworCisvKioKICAqIHJjdV9kZXJlZmVyZW5jZSAtIGZldGNoIGFuIFJDVS1wcm90ZWN0ZWQgcG9pbnRlciBpbiBhbgogICogUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLiAgVGhpcyBwb2ludGVyIG1heSBsYXRlcgogICogYmUgc2FmZWx5IGRlcmVmZXJlbmNlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cHJlZW1wdC5oIGIvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKaW5kZXggMDk2N2YwMy4uM2UwNWMwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKQEAgLTU3LDcgKzU3LDEzIEBACiAJcmRzc3AtPnNjaGVkX3FzKys7CiB9CiAjZGVmaW5lIHJjdV9iaF9xc2N0cl9pbmMoY3B1KQotI2RlZmluZSBjYWxsX3JjdV9iaChoZWFkLCByY3UpIGNhbGxfcmN1KGhlYWQsIHJjdSkKKworLyoKKyAqIFNvbWVvbmUgbWlnaHQgd2FudCB0byBwYXNzIGNhbGxfcmN1X2JoIGFzIGEgZnVuY3Rpb24gcG9pbnRlci4KKyAqIFNvIHRoaXMgbmVlZHMgdG8ganVzdCBiZSBhIHJlbmFtZSBhbmQgbm90IGEgbWFjcm8gZnVuY3Rpb24uCisgKiAgKG5vIHBhcmVudGhlc2VzKQorICovCisjZGVmaW5lIGNhbGxfcmN1X2JoCSAJY2FsbF9yY3UKIAogLyoqCiAgKiBjYWxsX3JjdV9zY2hlZCAtIFF1ZXVlIFJDVSBjYWxsYmFjayBmb3IgaW52b2NhdGlvbiBhZnRlciBzY2hlZCBncmFjZSBwZXJpb2QuCkBAIC0xMTEsNyArMTE3LDYgQEAKIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbjsKIAogI2lmZGVmIENPTkZJR19OT19IWgotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCByY3VfZHludGlja19zY2hlZCwgcmN1X2R5bnRpY2tfc2NoZWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2VudGVyX25vaHoodm9pZCkKIHsKQEAgLTEyNiw4ICsxMzEsOCBAQAogewogCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKHJzLCAxMCAqIEhaLCAxKTsKIAotCXNtcF9tYigpOyAvKiBDUFVzIHNlZWluZyArKyBtdXN0IHNlZSBsYXRlciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KIAlfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrX3NjaGVkKS5keW50aWNrcysrOworCXNtcF9tYigpOyAvKiBDUFVzIHNlZWluZyArKyBtdXN0IHNlZSBsYXRlciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KIAlXQVJOX09OX1JBVEVMSU1JVCghKF9fZ2V0X2NwdV92YXIocmN1X2R5bnRpY2tfc2NoZWQpLmR5bnRpY2tzICYgMHgxKSwKIAkJCQkmcnMpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCAxZDcxMmM3Li5lMzdkODA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtMTgsOCArMTgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCi1zdHJ1Y3QgcmVndWxhdG9yX2NvbnN0cmFpbnRzOwogc3RydWN0IHJlZ3VsYXRvcl9kZXY7CitzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YTsKIAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX29wcyAtIHJlZ3VsYXRvciBvcGVyYXRpb25zLgpAQCAtNTEsNyArNTEsNyBAQAogCQkJCQkgIGludCBvdXRwdXRfdVYsIGludCBsb2FkX3VBKTsKIAogCS8qIHRoZSBvcGVyYXRpb25zIGJlbG93IGFyZSBmb3IgY29uZmlndXJhdGlvbiBvZiByZWd1bGF0b3Igc3RhdGUgd2hlbgotCSAqIGl0J3MgcGFyZW50IFBNSUMgZW50ZXJzIGEgZ2xvYmFsIFNUQU5CWS9ISUJFUk5BVEUgc3RhdGUgKi8KKwkgKiBpdHMgcGFyZW50IFBNSUMgZW50ZXJzIGEgZ2xvYmFsIFNUQU5EQlkvSElCRVJOQVRFIHN0YXRlICovCiAKIAkvKiBzZXQgcmVndWxhdG9yIHN1c3BlbmQgdm9sdGFnZSAqLwogCWludCAoKnNldF9zdXNwZW5kX3ZvbHRhZ2UpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLCBpbnQgdVYpOwpAQCAtODUsMTUgKzg1LDE3IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCi0KIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3JfcmVnaXN0ZXIoc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpyZWd1bGF0b3JfZGVzYywKLQkJCQkJICB2b2lkICpyZWdfZGF0YSk7CisJc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkcml2ZXJfZGF0YSk7CiB2b2lkIHJlZ3VsYXRvcl91bnJlZ2lzdGVyKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIAogaW50IHJlZ3VsYXRvcl9ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSk7CiAKIHZvaWQgKnJkZXZfZ2V0X2RydmRhdGEoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOworc3RydWN0IGRldmljZSAqcmRldl9nZXRfZGV2KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIGludCByZGV2X2dldF9pZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiAKK3ZvaWQgKnJlZ3VsYXRvcl9nZXRfaW5pdF9kcnZkYXRhKHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfaW5pdF9kYXRhKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKaW5kZXggMTFlNzM3ZC4uYzZkNjkzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaApAQCAtODksMTUgKzg5LDMzIEBACiAJdW5zaWduZWQgYXBwbHlfdVY6MTsJLyogYXBwbHkgdVYgY29uc3RyYWludCBpZmYgbWluID09IG1heCAqLwogfTsKIAotaW50IHJlZ3VsYXRvcl9zZXRfc3VwcGx5KGNvbnN0IGNoYXIgKnJlZ3VsYXRvciwgY29uc3QgY2hhciAqcmVndWxhdG9yX3N1cHBseSk7CisvKioKKyAqIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IC0gc3VwcGx5IC0+IGRldmljZSBtYXBwaW5nCisgKgorICogVGhpcyBtYXBzIGEgc3VwcGx5IG5hbWUgdG8gYSBkZXZpY2UuCisgKi8KK3N0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIGNvbnN1bWVyICovCisJY29uc3QgY2hhciAqc3VwcGx5OwkvKiBjb25zdW1lciBzdXBwbHkgLSBlLmcuICJ2Y2MiICovCit9OwogCi1jb25zdCBjaGFyICpyZWd1bGF0b3JfZ2V0X3N1cHBseShjb25zdCBjaGFyICpyZWd1bGF0b3IpOworLyoqCisgKiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAtIHJlZ3VsYXRvciBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBkYXRhLgorICoKKyAqIEluaXRpYWxpc2F0aW9uIGNvbnN0cmFpbnRzLCBvdXIgc3VwcGx5IGFuZCBjb25zdW1lcnMgc3VwcGxpZXMuCisgKi8KK3N0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpzdXBwbHlfcmVndWxhdG9yX2RldjsgLyogb3IgTlVMTCBmb3IgTElORSAqLwogCi1pbnQgcmVndWxhdG9yX3NldF9tYWNoaW5lX2NvbnN0cmFpbnRzKGNvbnN0IGNoYXIgKnJlZ3VsYXRvciwKLQlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqY29uc3RyYWludHMpOworCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzOwogCi1pbnQgcmVndWxhdG9yX3NldF9kZXZpY2Vfc3VwcGx5KGNvbnN0IGNoYXIgKnJlZ3VsYXRvciwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJCWNvbnN0IGNoYXIgKnN1cHBseSk7CisJaW50IG51bV9jb25zdW1lcl9zdXBwbGllczsKKwlzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAqY29uc3VtZXJfc3VwcGxpZXM7CisKKwkvKiBvcHRpb25hbCByZWd1bGF0b3IgbWFjaGluZSBzcGVjaWZpYyBpbml0ICovCisJaW50ICgqcmVndWxhdG9yX2luaXQpKHZvaWQgKmRyaXZlcl9kYXRhKTsKKwl2b2lkICpkcml2ZXJfZGF0YTsJLyogY29yZSBkb2VzIG5vdCB0b3VjaCB0aGlzICovCit9OwogCiBpbnQgcmVndWxhdG9yX3N1c3BlbmRfcHJlcGFyZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKaW5kZXggZTk5NjNhZi4uYmM1MTE0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApAQCAtODcsNyArODcsNyBAQAogaWYoICEoIGNvbmQgKSApIAkJCQkJCQkJXAogICByZWlzZXJmc19wYW5pYyggTlVMTCwgInJlaXNlcmZzWyVpXTogYXNzZXJ0aW9uICIgc2NvbmQgIiBmYWlsZWQgYXQgIglcCiAJCSAgX19GSUxFX18gIjolaTolczogIiBmb3JtYXQgIlxuIiwJCVwKLQkJICBpbl9pbnRlcnJ1cHQoKSA/IC0xIDogdGFza19waWRfbnIoY3VycmVudCksIF9fTElORV9fICwgX19GVU5DVElPTl9fICwgIyNhcmdzICkKKwkJICBpbl9pbnRlcnJ1cHQoKSA/IC0xIDogdGFza19waWRfbnIoY3VycmVudCksIF9fTElORV9fICwgX19mdW5jX18gLCAjI2FyZ3MgKQogCiAjZGVmaW5lIFJBU1NFUlQoY29uZCwgZm9ybWF0LCBhcmdzLi4uKSBfX1JBU1NFUlQoY29uZCwgI2NvbmQsIGZvcm1hdCwgIyNhcmdzKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jma2lsbC5oIGIvaW5jbHVkZS9saW51eC9yZmtpbGwuaAppbmRleCA3NDFkMWE2Li40Y2Q2NGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Jma2lsbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmZraWxsLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIAlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEID0gMCwJLyogUmFkaW8gb3V0cHV0IGJsb2NrZWQgKi8KIAlSRktJTExfU1RBVEVfVU5CTE9DS0VEICAgID0gMSwJLyogUmFkaW8gb3V0cHV0IGFsbG93ZWQgKi8KIAlSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEID0gMiwJLyogT3V0cHV0IGJsb2NrZWQsIG5vbi1vdmVycmlkZWFibGUgKi8KKwlSRktJTExfU1RBVEVfTUFYLAkJLyogbWFya2VyIGZvciBsYXN0IHZhbGlkIHN0YXRlICovCiB9OwogCiAvKgpAQCAtMTEwLDEyICsxMTEsMTQgQEAKIH07CiAjZGVmaW5lIHRvX3Jma2lsbChkKQljb250YWluZXJfb2YoZCwgc3RydWN0IHJma2lsbCwgZGV2KQogCi1zdHJ1Y3QgcmZraWxsICpyZmtpbGxfYWxsb2NhdGUoc3RydWN0IGRldmljZSAqcGFyZW50LCBlbnVtIHJma2lsbF90eXBlIHR5cGUpOworc3RydWN0IHJma2lsbCAqIF9fbXVzdF9jaGVjayByZmtpbGxfYWxsb2NhdGUoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgIGVudW0gcmZraWxsX3R5cGUgdHlwZSk7CiB2b2lkIHJma2lsbF9mcmVlKHN0cnVjdCByZmtpbGwgKnJma2lsbCk7Ci1pbnQgcmZraWxsX3JlZ2lzdGVyKHN0cnVjdCByZmtpbGwgKnJma2lsbCk7CitpbnQgX19tdXN0X2NoZWNrIHJma2lsbF9yZWdpc3RlcihzdHJ1Y3QgcmZraWxsICpyZmtpbGwpOwogdm9pZCByZmtpbGxfdW5yZWdpc3RlcihzdHJ1Y3QgcmZraWxsICpyZmtpbGwpOwogCiBpbnQgcmZraWxsX2ZvcmNlX3N0YXRlKHN0cnVjdCByZmtpbGwgKnJma2lsbCwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpOworaW50IHJma2lsbF9zZXRfZGVmYXVsdChlbnVtIHJma2lsbF90eXBlIHR5cGUsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKTsKIAogLyoqCiAgKiByZmtpbGxfc3RhdGVfY29tcGxlbWVudCAtIHJldHVybiBjb21wbGVtZW50YXIgc3RhdGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oIGIvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKaW5kZXggZThjN2MyMS4uNmZjOTYxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKKysrIGIvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKQEAgLTE4LDQwICsxOCw0NyBAQAogLyoKICAqIE00OFQ1OSBSZWdpc3RlciBPZmZzZXQKICAqLwotI2RlZmluZSBNNDhUNTlfWUVBUgkJMHgxZmZmCi0jZGVmaW5lIE00OFQ1OV9NT05USAkJMHgxZmZlCi0jZGVmaW5lIE00OFQ1OV9NREFZCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIE00OFQ1OV9XREFZCQkweDFmZmMJLyogRGF5IG9mIFdlZWsgKi8KKyNkZWZpbmUgTTQ4VDU5X1lFQVIJCTB4ZgorI2RlZmluZSBNNDhUNTlfTU9OVEgJCTB4ZQorI2RlZmluZSBNNDhUNTlfTURBWQkJMHhkCS8qIERheSBvZiBNb250aCAqLworI2RlZmluZSBNNDhUNTlfV0RBWQkJMHhjCS8qIERheSBvZiBXZWVrICovCiAjZGVmaW5lIE00OFQ1OV9XREFZX0NCCQkJMHgyMAkvKiBDZW50dXJ5IEJpdCAqLwogI2RlZmluZSBNNDhUNTlfV0RBWV9DRUIJCQkweDEwCS8qIENlbnR1cnkgRW5hYmxlIEJpdCAqLwotI2RlZmluZSBNNDhUNTlfSE9VUgkJMHgxZmZiCi0jZGVmaW5lIE00OFQ1OV9NSU4JCTB4MWZmYQotI2RlZmluZSBNNDhUNTlfU0VDCQkweDFmZjkKLSNkZWZpbmUgTTQ4VDU5X0NOVEwJCTB4MWZmOAorI2RlZmluZSBNNDhUNTlfSE9VUgkJMHhiCisjZGVmaW5lIE00OFQ1OV9NSU4JCTB4YQorI2RlZmluZSBNNDhUNTlfU0VDCQkweDkKKyNkZWZpbmUgTTQ4VDU5X0NOVEwJCTB4OAogI2RlZmluZSBNNDhUNTlfQ05UTF9SRUFECQkweDQwCiAjZGVmaW5lIE00OFQ1OV9DTlRMX1dSSVRFCQkweDgwCi0jZGVmaW5lIE00OFQ1OV9XQVRDSERPRwkJMHgxZmY3Ci0jZGVmaW5lIE00OFQ1OV9JTlRSCQkweDFmZjYKKyNkZWZpbmUgTTQ4VDU5X1dBVENIRE9HCQkweDcKKyNkZWZpbmUgTTQ4VDU5X0lOVFIJCTB4NgogI2RlZmluZSBNNDhUNTlfSU5UUl9BRkUJCQkweDgwCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KICNkZWZpbmUgTTQ4VDU5X0lOVFJfQUJFCQkJMHgyMAotI2RlZmluZSBNNDhUNTlfQUxBUk1fREFURQkweDFmZjUKLSNkZWZpbmUgTTQ4VDU5X0FMQVJNX0hPVVIJMHgxZmY0Ci0jZGVmaW5lIE00OFQ1OV9BTEFSTV9NSU4JMHgxZmYzCi0jZGVmaW5lIE00OFQ1OV9BTEFSTV9TRUMJMHgxZmYyCi0jZGVmaW5lIE00OFQ1OV9VTlVTRUQJCTB4MWZmMQotI2RlZmluZSBNNDhUNTlfRkxBR1MJCTB4MWZmMAorI2RlZmluZSBNNDhUNTlfQUxBUk1fREFURQkweDUKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX0hPVVIJMHg0CisjZGVmaW5lIE00OFQ1OV9BTEFSTV9NSU4JMHgzCisjZGVmaW5lIE00OFQ1OV9BTEFSTV9TRUMJMHgyCisjZGVmaW5lIE00OFQ1OV9VTlVTRUQJCTB4MQorI2RlZmluZSBNNDhUNTlfRkxBR1MJCTB4MAogI2RlZmluZSBNNDhUNTlfRkxBR1NfV0RUCQkweDgwCS8qIHdhdGNoZG9nIHRpbWVyIGV4cGlyZWQgKi8KICNkZWZpbmUgTTQ4VDU5X0ZMQUdTX0FGCQkJMHg0MAkvKiBhbGFybSAqLwogI2RlZmluZSBNNDhUNTlfRkxBR1NfQkYJCQkweDEwCS8qIGxvdyBiYXR0ZXJ5ICovCiAKLSNkZWZpbmUgTTQ4VDU5X05WUkFNX1NJWkUJMHgxZmYwCisjZGVmaW5lIE00OFQ1OVJUQ19UWVBFX000OFQ1OQkwIC8qIHRvIGtlZXAgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBNNDhUNTlSVENfVFlQRV9NNDhUMDIJMQorI2RlZmluZSBNNDhUNTlSVENfVFlQRV9NNDhUMDgJMgogCiBzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSB7Ci0JLyogVGhlIG1ldGhvZCB0byBhY2Nlc3MgTTQ4VDU5IHJlZ2lzdGVycywKLQkgKiBOT1RFOiBUaGUgJ29mcycgc2hvdWxkIGJlIDB4MDB+MHgxZmZmCi0JICovCisJLyogVGhlIG1ldGhvZCB0byBhY2Nlc3MgTTQ4VDU5IHJlZ2lzdGVycyAqLwogCXZvaWQgKCp3cml0ZV9ieXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMsIHU4IHZhbCk7CiAJdW5zaWduZWQgY2hhciAoKnJlYWRfYnl0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKTsKKworCWludCB0eXBlOyAvKiBSVEMgbW9kZWwgKi8KKworCS8qIGlvYWRkciBtYXBwZWQgZXh0ZXJuYWxseSAqLworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCS8qIG9mZnNldCB0byBSVEMgcmVnaXN0ZXJzLCBhdXRvbWF0aWNhbGx5IHNldCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogfTsKIAogI2VuZGlmIC8qIF9MSU5VWF9SVENfTTQ4VDU5X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0bXV0ZXguaCBiL2luY2x1ZGUvbGludXgvcnRtdXRleC5oCmluZGV4IDM4MmJiNzkuLmYxOWIwMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRtdXRleC5oCisrKyBiL2luY2x1ZGUvbGludXgvcnRtdXRleC5oCkBAIC01NCw3ICs1NCw3IEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKICMgZGVmaW5lIF9fREVCVUdfUlRfTVVURVhfSU5JVElBTElaRVIobXV0ZXhuYW1lKSBcCiAJLCAubmFtZSA9ICNtdXRleG5hbWUsIC5maWxlID0gX19GSUxFX18sIC5saW5lID0gX19MSU5FX18KLSMgZGVmaW5lIHJ0X211dGV4X2luaXQobXV0ZXgpCQkJX19ydF9tdXRleF9pbml0KG11dGV4LCBfX0ZVTkNUSU9OX18pCisjIGRlZmluZSBydF9tdXRleF9pbml0KG11dGV4KQkJCV9fcnRfbXV0ZXhfaW5pdChtdXRleCwgX19mdW5jX18pCiAgZXh0ZXJuIHZvaWQgcnRfbXV0ZXhfZGVidWdfdGFza19mcmVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKICNlbHNlCiAjIGRlZmluZSBfX0RFQlVHX1JUX01VVEVYX0lOSVRJQUxJWkVSKG11dGV4bmFtZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmluZGV4IGNhNjQzYjEuLjJiM2Q1MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtNTgyLDYgKzU4MiwxMCBAQAogI2RlZmluZSBSVE5MR1JQX0lQVjZfUlVMRQlSVE5MR1JQX0lQVjZfUlVMRQogCVJUTkxHUlBfTkRfVVNFUk9QVCwKICNkZWZpbmUgUlROTEdSUF9ORF9VU0VST1BUCVJUTkxHUlBfTkRfVVNFUk9QVAorCVJUTkxHUlBfUEhPTkVUX0lGQUREUiwKKyNkZWZpbmUgUlROTEdSUF9QSE9ORVRfSUZBRERSCVJUTkxHUlBfUEhPTkVUX0lGQUREUgorCVJUTkxHUlBfUEhPTkVUX1JPVVRFLAorI2RlZmluZSBSVE5MR1JQX1BIT05FVF9ST1VURQlSVE5MR1JQX1BIT05FVF9ST1VURQogCV9fUlROTEdSUF9NQVgKIH07CiAjZGVmaW5lIFJUTkxHUlBfTUFYCShfX1JUTkxHUlBfTUFYIC0gMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBkY2MwM2ZkLi5kZTUzYzEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0zNTIsNyArMzUyLDcgQEAKIGV4dGVybiB2b2lkIGFyY2hfdW5tYXBfYXJlYShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgYXJjaF91bm1hcF9hcmVhX3RvcGRvd24oc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKIAotI2lmIE5SX0NQVVMgPj0gQ09ORklHX1NQTElUX1BUTE9DS19DUFVTCisjaWYgVVNFX1NQTElUX1BUTE9DS1MKIC8qCiAgKiBUaGUgbW0gY291bnRlcnMgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgaXRzIHBhZ2VfdGFibGVfbG9jaywKICAqIHNvIG11c3QgYmUgaW5jcmVtZW50ZWQgYXRvbWljYWxseS4KQEAgLTM2Myw3ICszNjMsNyBAQAogI2RlZmluZSBpbmNfbW1fY291bnRlcihtbSwgbWVtYmVyKSBhdG9taWNfbG9uZ19pbmMoJihtbSktPl8jI21lbWJlcikKICNkZWZpbmUgZGVjX21tX2NvdW50ZXIobW0sIG1lbWJlcikgYXRvbWljX2xvbmdfZGVjKCYobW0pLT5fIyNtZW1iZXIpCiAKLSNlbHNlICAvKiBOUl9DUFVTIDwgQ09ORklHX1NQTElUX1BUTE9DS19DUFVTICovCisjZWxzZSAgLyogIVVTRV9TUExJVF9QVExPQ0tTICovCiAvKgogICogVGhlIG1tIGNvdW50ZXJzIGFyZSBwcm90ZWN0ZWQgYnkgaXRzIHBhZ2VfdGFibGVfbG9jaywKICAqIHNvIGNhbiBiZSBpbmNyZW1lbnRlZCBkaXJlY3RseS4KQEAgLTM3NCw3ICszNzQsNyBAQAogI2RlZmluZSBpbmNfbW1fY291bnRlcihtbSwgbWVtYmVyKSAobW0pLT5fIyNtZW1iZXIrKwogI2RlZmluZSBkZWNfbW1fY291bnRlcihtbSwgbWVtYmVyKSAobW0pLT5fIyNtZW1iZXItLQogCi0jZW5kaWYgLyogTlJfQ1BVUyA8IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUyAqLworI2VuZGlmIC8qICFVU0VfU1BMSVRfUFRMT0NLUyAqLwogCiAjZGVmaW5lIGdldF9tbV9yc3MobW0pCQkJCQlcCiAJKGdldF9tbV9jb3VudGVyKG1tLCBmaWxlX3JzcykgKyBnZXRfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpKQpAQCAtNDUxLDggKzQ1MSw4IEBACiAJICogLSBldmVyeW9uZSBleGNlcHQgZ3JvdXBfZXhpdF90YXNrIGlzIHN0b3BwZWQgZHVyaW5nIHNpZ25hbCBkZWxpdmVyeQogCSAqICAgb2YgZmF0YWwgc2lnbmFscywgZ3JvdXBfZXhpdF90YXNrIHByb2Nlc3NlcyB0aGUgc2lnbmFsLgogCSAqLwotCXN0cnVjdCB0YXNrX3N0cnVjdAkqZ3JvdXBfZXhpdF90YXNrOwogCWludAkJCW5vdGlmeV9jb3VudDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmdyb3VwX2V4aXRfdGFzazsKIAogCS8qIHRocmVhZCBncm91cCBzdG9wIHN1cHBvcnQsIG92ZXJsb2FkcyBncm91cF9leGl0X2NvZGUgdG9vICovCiAJaW50CQkJZ3JvdXBfc3RvcF9jb3VudDsKQEAgLTgyNCw2ICs4MjQsOSBAQAogCXVuc2lnbmVkIGludCB0dHd1X21vdmVfYWZmaW5lOwogCXVuc2lnbmVkIGludCB0dHd1X21vdmVfYmFsYW5jZTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRworCWNoYXIgKm5hbWU7CisjZW5kaWYKIH07CiAKIGV4dGVybiB2b2lkIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKGludCBuZG9tc19uZXcsIGNwdW1hc2tfdCAqZG9tc19uZXcsCkBAIC04OTcsNyArOTAwLDcgQEAKIAl2b2lkICgqeWllbGRfdGFzaykgKHN0cnVjdCBycSAqcnEpOwogCWludCAgKCpzZWxlY3RfdGFza19ycSkoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc3luYyk7CiAKLQl2b2lkICgqY2hlY2tfcHJlZW1wdF9jdXJyKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKwl2b2lkICgqY2hlY2tfcHJlZW1wdF9jdXJyKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc3luYyk7CiAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiAoKnBpY2tfbmV4dF90YXNrKSAoc3RydWN0IHJxICpycSk7CiAJdm9pZCAoKnB1dF9wcmV2X3Rhc2spIChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpAQCAtMTAxMCw4ICsxMDEzLDggQEAKIAogc3RydWN0IHNjaGVkX3J0X2VudGl0eSB7CiAJc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKLQl1bnNpZ25lZCBpbnQgdGltZV9zbGljZTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IHRpbWVfc2xpY2U7CiAJaW50IG5yX2NwdXNfYWxsb3dlZDsKIAogCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKmJhY2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggODBjNGQwMC4uZjVjNGE1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMTU2MCwxMSArMTU2MCw2IEBACiBleHRlcm4gaW50IHNlY3VyaXR5X2luaXQodm9pZCk7CiBleHRlcm4gaW50IHNlY3VyaXR5X21vZHVsZV9lbmFibGUoc3RydWN0IHNlY3VyaXR5X29wZXJhdGlvbnMgKm9wcyk7CiBleHRlcm4gaW50IHJlZ2lzdGVyX3NlY3VyaXR5KHN0cnVjdCBzZWN1cml0eV9vcGVyYXRpb25zICpvcHMpOwotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnNlY3VyaXR5ZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCi0JCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB2b2lkICpkYXRhLAotCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpOwotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnNlY3VyaXR5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpOwotZXh0ZXJuIHZvaWQgc2VjdXJpdHlmc19yZW1vdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIAogLyogU2VjdXJpdHkgb3BlcmF0aW9ucyAqLwogaW50IHNlY3VyaXR5X3B0cmFjZV9tYXlfYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGludCBtb2RlKTsKQEAgLTI0MjQsMjUgKzI0MTksNiBAQAogCXJldHVybiBjYXBfbmV0bGlua19yZWN2KHNrYiwgY2FwKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICpzZWN1cml0eWZzX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50KQotewotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKnNlY3VyaXR5ZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJCW1vZGVfdCBtb2RlLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LAotCQkJCQkJdm9pZCAqZGF0YSwKLQkJCQkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eWZzX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eCh1MzIgc2VjaWQsIGNoYXIgKipzZWNkYXRhLCB1MzIgKnNlY2xlbikKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0yODA2LDUgKzI3ODIsMzUgQEAKICNlbmRpZiAvKiBDT05GSUdfU0VDVVJJVFkgKi8KICNlbmRpZiAvKiBDT05GSUdfQVVESVQgKi8KIAorI2lmZGVmIENPTkZJR19TRUNVUklUWUZTCisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpzZWN1cml0eWZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpzZWN1cml0eWZzX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50KTsKK2V4dGVybiB2b2lkIHNlY3VyaXR5ZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CisKKyNlbHNlIC8qIENPTkZJR19TRUNVUklUWUZTICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqc2VjdXJpdHlmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqc2VjdXJpdHlmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICAgIG1vZGVfdCBtb2RlLAorCQkJCQkJICAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJCSAgICB2b2lkICpkYXRhLAorCQkJCQkJICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eWZzX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7fQorCisjZW5kaWYKKwogI2VuZGlmIC8qICEgX19MSU5VWF9TRUNVUklUWV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCmluZGV4IGRlYjcxNDMxLi4xZWE4ZDkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKQEAgLTE3Myw2ICsxNzMsMjIgQEAKIAlpbnQgcmVzZXJ2ZWRbOV07CiB9OwogCisvKgorICogU2VyaWFsIGludGVyZmFjZSBmb3IgY29udHJvbGxpbmcgUlM0ODUgc2V0dGluZ3Mgb24gY2hpcHMgd2l0aCBzdWl0YWJsZQorICogc3VwcG9ydC4gU2V0IHdpdGggVElPQ1NSUzQ4NSBhbmQgZ2V0IHdpdGggVElPQ0dSUzQ4NSBpZiBzdXBwb3J0ZWQgYnkgeW91cgorICogcGxhdGZvcm0uIFRoZSBzZXQgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmV3IHN0YXRlLCB3aXRoIGFueSB1bnN1cHBvcnRlZCBiaXRzCisgKiByZXZlcnRlZCBhcHByb3ByaWF0ZWx5LgorICovCisKK3N0cnVjdCBzZXJpYWxfcnM0ODUgeworCV9fdTMyCWZsYWdzOwkJCS8qIFJTNDg1IGZlYXR1cmUgZmxhZ3MgKi8KKyNkZWZpbmUgU0VSX1JTNDg1X0VOQUJMRUQJCSgxIDw8IDApCisjZGVmaW5lIFNFUl9SUzQ4NV9SVFNfT05fU0VORAkJKDEgPDwgMSkKKyNkZWZpbmUgU0VSX1JTNDg1X1JUU19BRlRFUl9TRU5ECSgxIDw8IDIpCisJX191MzIJZGVsYXlfcnRzX2JlZm9yZV9zZW5kOwkvKiBNaWxsaXNlY29uZHMgKi8KKwlfX3UzMglwYWRkaW5nWzZdOwkJLyogTWVtb3J5IGlzIGNoZWFwLCBuZXcgc3RydWN0cworCQkJCQkgICBhcmUgYSByb3lhbCBQSVRBIC4uICovCit9OwogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggM2IyZjZjMC4uZTI3ZjIxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMjQxLDcgKzI0MSw3IEBACiAKIHN0cnVjdCB1YXJ0X3BvcnQgewogCXNwaW5sb2NrX3QJCWxvY2s7CQkJLyogcG9ydCBsb2NrICovCi0JdW5zaWduZWQgaW50CQlpb2Jhc2U7CQkJLyogaW4vb3V0W2J3bF0gKi8KKwl1bnNpZ25lZCBsb25nCQlpb2Jhc2U7CQkJLyogaW4vb3V0W2J3bF0gKi8KIAl1bnNpZ25lZCBjaGFyIF9faW9tZW0JKm1lbWJhc2U7CQkvKiByZWFkL3dyaXRlW2J3bF0gKi8KIAl1bnNpZ25lZCBpbnQJCWlycTsJCQkvKiBpcnEgbnVtYmVyICovCiAJdW5zaWduZWQgaW50CQl1YXJ0Y2xrOwkJLyogYmFzZSB1YXJ0IGNsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA5MDk5MjM3Li4yNzI1ZjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTE0Niw4ICsxNDYsMTQgQEAKIAl1bnNpZ25lZCBzaG9ydAlnc29fc2VnczsKIAl1bnNpZ25lZCBzaG9ydCAgZ3NvX3R5cGU7CiAJX19iZTMyICAgICAgICAgIGlwNl9mcmFnX2lkOworI2lmZGVmIENPTkZJR19IQVNfRE1BCisJdW5zaWduZWQgaW50CW51bV9kbWFfbWFwczsKKyNlbmRpZgogCXN0cnVjdCBza19idWZmCSpmcmFnX2xpc3Q7CiAJc2tiX2ZyYWdfdAlmcmFnc1tNQVhfU0tCX0ZSQUdTXTsKKyNpZmRlZiBDT05GSUdfSEFTX0RNQQorCWRtYV9hZGRyX3QJZG1hX21hcHNbTUFYX1NLQl9GUkFHUyArIDFdOworI2VuZGlmCiB9OwogCiAvKiBXZSBkaXZpZGUgZGF0YXJlZiBpbnRvIHR3byBoYWx2ZXMuICBUaGUgaGlnaGVyIDE2IGJpdHMgaG9sZCByZWZlcmVuY2VzCkBAIC0zNTMsNiArMzU5LDE0IEBACiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKKyNpZmRlZiBDT05GSUdfSEFTX0RNQQorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CitleHRlcm4gaW50IHNrYl9kbWFfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CitleHRlcm4gdm9pZCBza2JfZG1hX3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKKyNlbmRpZgorCiBleHRlcm4gdm9pZCBrZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gdm9pZAkgICAgICAgX19rZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKl9fYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLApAQCAtMzY5LDYgKzM4Myw4IEBACiAJcmV0dXJuIF9fYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5LCAxLCAtMSk7CiB9CiAKK2V4dGVybiBpbnQgc2tiX3JlY3ljbGVfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNrYl9zaXplKTsKKwogZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfbW9ycGgoc3RydWN0IHNrX2J1ZmYgKmRzdCwgc3RydWN0IHNrX2J1ZmYgKnNyYyk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBnZnBfdCBwcmlvcml0eSk7CkBAIC00NTksNiArNDc1LDM3IEBACiB9CiAKIC8qKgorICoJc2tiX3F1ZXVlX2lzX2xhc3QgLSBjaGVjayBpZiBza2IgaXMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHF1ZXVlCisgKglAbGlzdDogcXVldWUgaGVhZAorICoJQHNrYjogYnVmZmVyCisgKgorICoJUmV0dXJucyB0cnVlIGlmIEBza2IgaXMgdGhlIGxhc3QgYnVmZmVyIG9uIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgc2tiX3F1ZXVlX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChza2ItPm5leHQgPT0gKHN0cnVjdCBza19idWZmICopIGxpc3QpOworfQorCisvKioKKyAqCXNrYl9xdWV1ZV9uZXh0IC0gcmV0dXJuIHRoZSBuZXh0IHBhY2tldCBpbiB0aGUgcXVldWUKKyAqCUBsaXN0OiBxdWV1ZSBoZWFkCisgKglAc2tiOiBjdXJyZW50IGJ1ZmZlcgorICoKKyAqCVJldHVybiB0aGUgbmV4dCBwYWNrZXQgaW4gQGxpc3QgYWZ0ZXIgQHNrYi4gIEl0IGlzIG9ubHkgdmFsaWQgdG8KKyAqCWNhbGwgdGhpcyBpZiBza2JfcXVldWVfaXNfbGFzdCgpIGV2YWx1YXRlcyB0byBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3F1ZXVlX25leHQoY29uc3Qgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFRoaXMgQlVHX09OIG1heSBzZWVtIHNldmVyZSwgYnV0IGlmIHdlIGp1c3QgcmV0dXJuIHRoZW4gd2UKKwkgKiBhcmUgZ29pbmcgdG8gZGVyZWZlcmVuY2UgZ2FyYmFnZS4KKwkgKi8KKwlCVUdfT04oc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSk7CisJcmV0dXJuIHNrYi0+bmV4dDsKK30KKworLyoqCiAgKglza2JfZ2V0IC0gcmVmZXJlbmNlIGJ1ZmZlcgogICoJQHNrYjogYnVmZmVyIHRvIHJlZmVyZW5jZQogICoKQEAgLTY0Niw2ICs2OTMsMjIgQEAKIAlyZXR1cm4gbGlzdF8tPnFsZW47CiB9CiAKKy8qKgorICoJX19za2JfcXVldWVfaGVhZF9pbml0IC0gaW5pdGlhbGl6ZSBub24tc3BpbmxvY2sgcG9ydGlvbnMgb2Ygc2tfYnVmZl9oZWFkCisgKglAbGlzdDogcXVldWUgdG8gaW5pdGlhbGl6ZQorICoKKyAqCVRoaXMgaW5pdGlhbGl6ZXMgb25seSB0aGUgbGlzdCBhbmQgcXVldWUgbGVuZ3RoIGFzcGVjdHMgb2YKKyAqCWFuIHNrX2J1ZmZfaGVhZCBvYmplY3QuICBUaGlzIGFsbG93cyB0byBpbml0aWFsaXplIHRoZSBsaXN0CisgKglhc3BlY3RzIG9mIGFuIHNrX2J1ZmZfaGVhZCB3aXRob3V0IHJlaW5pdGlhbGl6aW5nIHRoaW5ncyBsaWtlCisgKgl0aGUgc3BpbmxvY2suICBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBvbi1zdGFjayBza19idWZmX2hlYWQKKyAqCW9iamVjdHMgd2hlcmUgdGhlIHNwaW5sb2NrIGlzIGtub3duIHRvIG5vdCBiZSB1c2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19za2JfcXVldWVfaGVhZF9pbml0KHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCit7CisJbGlzdC0+cHJldiA9IGxpc3QtPm5leHQgPSAoc3RydWN0IHNrX2J1ZmYgKilsaXN0OworCWxpc3QtPnFsZW4gPSAwOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3BsaXQgb3V0IGxvY2sgY2xhc3MgZm9yIGVhY2ggaW52b2NhdGlvbjsKICAqIHRoaXMgaXMgbmVlZGVkIGZvciBub3cgc2luY2UgYSB3aG9sZSBsb3Qgb2YgdXNlcnMgb2YgdGhlIHNrYi1xdWV1ZQpAQCAtNjU3LDggKzcyMCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3F1ZXVlX2hlYWRfaW5pdChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQogewogCXNwaW5fbG9ja19pbml0KCZsaXN0LT5sb2NrKTsKLQlsaXN0LT5wcmV2ID0gbGlzdC0+bmV4dCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKWxpc3Q7Ci0JbGlzdC0+cWxlbiA9IDA7CisJX19za2JfcXVldWVfaGVhZF9pbml0KGxpc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3F1ZXVlX2hlYWRfaW5pdF9jbGFzcyhzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LApAQCAtNjg1LDYgKzc0Nyw4MyBAQAogCWxpc3QtPnFsZW4rKzsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3F1ZXVlX3NwbGljZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwcmV2LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpuZXh0KQoreworCXN0cnVjdCBza19idWZmICpmaXJzdCA9IGxpc3QtPm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3QgPSBsaXN0LT5wcmV2OworCisJZmlyc3QtPnByZXYgPSBwcmV2OworCXByZXYtPm5leHQgPSBmaXJzdDsKKworCWxhc3QtPm5leHQgPSBuZXh0OworCW5leHQtPnByZXYgPSBsYXN0OworfQorCisvKioKKyAqCXNrYl9xdWV1ZV9zcGxpY2UgLSBqb2luIHR3byBza2IgbGlzdHMsIHRoaXMgaXMgZGVzaWduZWQgZm9yIHN0YWNrcworICoJQGxpc3Q6IHRoZSBuZXcgbGlzdCB0byBhZGQKKyAqCUBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcXVldWVfc3BsaWNlKGNvbnN0IHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCisJCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmhlYWQpCit7CisJaWYgKCFza2JfcXVldWVfZW1wdHkobGlzdCkpIHsKKwkJX19za2JfcXVldWVfc3BsaWNlKGxpc3QsIChzdHJ1Y3Qgc2tfYnVmZiAqKSBoZWFkLCBoZWFkLT5uZXh0KTsKKwkJaGVhZC0+cWxlbiArPSBsaXN0LT5xbGVuOworCX0KK30KKworLyoqCisgKglza2JfcXVldWVfc3BsaWNlIC0gam9pbiB0d28gc2tiIGxpc3RzIGFuZCByZWluaXRpYWxpc2UgdGhlIGVtcHRpZWQgbGlzdAorICoJQGxpc3Q6IHRoZSBuZXcgbGlzdCB0byBhZGQKKyAqCUBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0CisgKgorICoJVGhlIGxpc3QgYXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3F1ZXVlX3NwbGljZV9pbml0KHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpoZWFkKQoreworCWlmICghc2tiX3F1ZXVlX2VtcHR5KGxpc3QpKSB7CisJCV9fc2tiX3F1ZXVlX3NwbGljZShsaXN0LCAoc3RydWN0IHNrX2J1ZmYgKikgaGVhZCwgaGVhZC0+bmV4dCk7CisJCWhlYWQtPnFsZW4gKz0gbGlzdC0+cWxlbjsKKwkJX19za2JfcXVldWVfaGVhZF9pbml0KGxpc3QpOworCX0KK30KKworLyoqCisgKglza2JfcXVldWVfc3BsaWNlX3RhaWwgLSBqb2luIHR3byBza2IgbGlzdHMsIGVhY2ggbGlzdCBiZWluZyBhIHF1ZXVlCisgKglAbGlzdDogdGhlIG5ldyBsaXN0IHRvIGFkZAorICoJQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNrYl9xdWV1ZV9zcGxpY2VfdGFpbChjb25zdCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCQkgc3RydWN0IHNrX2J1ZmZfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eShsaXN0KSkgeworCQlfX3NrYl9xdWV1ZV9zcGxpY2UobGlzdCwgaGVhZC0+cHJldiwgKHN0cnVjdCBza19idWZmICopIGhlYWQpOworCQloZWFkLT5xbGVuICs9IGxpc3QtPnFsZW47CisJfQorfQorCisvKioKKyAqCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbCAtIGpvaW4gdHdvIHNrYiBsaXN0cyBhbmQgcmVpbml0aWFsaXNlIHRoZSBlbXB0aWVkIGxpc3QKKyAqCUBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkCisgKglAaGVhZDogdGhlIHBsYWNlIHRvIGFkZCBpdCBpbiB0aGUgZmlyc3QgbGlzdAorICoKKyAqCUVhY2ggb2YgdGhlIGxpc3RzIGlzIGEgcXVldWUuCisgKglUaGUgbGlzdCBhdCBAbGlzdCBpcyByZWluaXRpYWxpc2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpoZWFkKQoreworCWlmICghc2tiX3F1ZXVlX2VtcHR5KGxpc3QpKSB7CisJCV9fc2tiX3F1ZXVlX3NwbGljZShsaXN0LCBoZWFkLT5wcmV2LCAoc3RydWN0IHNrX2J1ZmYgKikgaGVhZCk7CisJCWhlYWQtPnFsZW4gKz0gbGlzdC0+cWxlbjsKKwkJX19za2JfcXVldWVfaGVhZF9pbml0KGxpc3QpOworCX0KK30KKwogLyoqCiAgKglfX3NrYl9xdWV1ZV9hZnRlciAtIHF1ZXVlIGEgYnVmZmVyIGF0IHRoZSBsaXN0IGhlYWQKICAqCUBsaXN0OiBsaXN0IHRvIHVzZQpAQCAtODI5LDYgKzk2OCw5IEBACiAJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGkgKyAxOwogfQogCitleHRlcm4gdm9pZCBza2JfYWRkX3J4X2ZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGksIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgIGludCBvZmYsIGludCBzaXplKTsKKwogI2RlZmluZSBTS0JfUEFHRV9BU1NFUlQoc2tiKSAJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCiAjZGVmaW5lIFNLQl9GUkFHX0FTU0VSVChza2IpIAlCVUdfT04oc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpCiAjZGVmaW5lIFNLQl9MSU5FQVJfQVNTRVJUKHNrYikgIEJVR19PTihza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC0xMjQzLDYgKzEzODUsMjYgQEAKIAlyZXR1cm4gX19uZXRkZXZfYWxsb2Nfc2tiKGRldiwgbGVuZ3RoLCBHRlBfQVRPTUlDKTsKIH0KIAorZXh0ZXJuIHN0cnVjdCBwYWdlICpfX25ldGRldl9hbGxvY19wYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGdmcF90IGdmcF9tYXNrKTsKKworLyoqCisgKgluZXRkZXZfYWxsb2NfcGFnZSAtIGFsbG9jYXRlIGEgcGFnZSBmb3IgcHMtcnggb24gYSBzcGVjaWZpYyBkZXZpY2UKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHJlY2VpdmUgb24KKyAqCisgKiAJQWxsb2NhdGUgYSBuZXcgcGFnZSBub2RlIGxvY2FsIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICoKKyAqIAklTlVMTCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBmcmVlIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqbmV0ZGV2X2FsbG9jX3BhZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19uZXRkZXZfYWxsb2NfcGFnZShkZXYsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0ZGV2X2ZyZWVfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX2ZyZWVfcGFnZShwYWdlKTsKK30KKwogLyoqCiAgKglza2JfY2xvbmVfd3JpdGFibGUgLSBpcyB0aGUgaGVhZGVyIG9mIGEgY2xvbmUgd3JpdGFibGUKICAqCUBza2I6IGJ1ZmZlciB0byBjaGVjawpAQCAtMTQzNCw2ICsxNTk2LDE1IEBACiAJCSAgICAgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKShxdWV1ZSk7CQkJCVwKIAkJICAgICBza2IgPSB0bXAsIHRtcCA9IHNrYi0+bmV4dCkKIAorI2RlZmluZSBza2JfcXVldWVfd2Fsa19mcm9tKHF1ZXVlLCBza2IpCQkJCQkJXAorCQlmb3IgKDsgcHJlZmV0Y2goc2tiLT5uZXh0KSwgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikocXVldWUpKTsJXAorCQkgICAgIHNrYiA9IHNrYi0+bmV4dCkKKworI2RlZmluZSBza2JfcXVldWVfd2Fsa19mcm9tX3NhZmUocXVldWUsIHNrYiwgdG1wKQkJCQlcCisJCWZvciAodG1wID0gc2tiLT5uZXh0OwkJCQkJCVwKKwkJICAgICBza2IgIT0gKHN0cnVjdCBza19idWZmICopKHF1ZXVlKTsJCQkJXAorCQkgICAgIHNrYiA9IHRtcCwgdG1wID0gc2tiLT5uZXh0KQorCiAjZGVmaW5lIHNrYl9xdWV1ZV9yZXZlcnNlX3dhbGsocXVldWUsIHNrYikgXAogCQlmb3IgKHNrYiA9IChxdWV1ZSktPnByZXY7CQkJCQlcCiAJCSAgICAgcHJlZmV0Y2goc2tiLT5wcmV2KSwgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikocXVldWUpKTsJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbWIuaCBiL2luY2x1ZGUvbGludXgvc21iLmgKaW5kZXggY2FhNDNiMi4uODJmZWZkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtYi5oCkBAIC0xMSw3ICsxMSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNlbmRpZgogCiBlbnVtIHNtYl9wcm90b2NvbCB7IAogCVNNQl9QUk9UT0NPTF9OT05FLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21jOTF4LmggYi9pbmNsdWRlL2xpbnV4L3NtYzkxeC5oCmluZGV4IDM4MjdiOTIuLmJjMjFkYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21jOTF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9zbWM5MXguaApAQCAtMTYsOCArMTYsMTkgQEAKIAogI2RlZmluZSBTTUM5MVhfVVNFX0RNQQkJKDEgPDwgNikKIAorI2RlZmluZSBSUENfTEVEXzEwMF8xMAkoMHgwMCkJLyogTEVEID0gMTAwTWJwcyBPUidzIHdpdGggMTBNYnBzIGxpbmsgZGV0ZWN0ICovCisjZGVmaW5lIFJQQ19MRURfUkVTCSgweDAxKQkvKiBMRUQgPSBSZXNlcnZlZCAqLworI2RlZmluZSBSUENfTEVEXzEwCSgweDAyKQkvKiBMRUQgPSAxME1icHMgbGluayBkZXRlY3QgKi8KKyNkZWZpbmUgUlBDX0xFRF9GRAkoMHgwMykJLyogTEVEID0gRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBSUENfTEVEX1RYX1JYCSgweDA0KQkvKiBMRUQgPSBUWCBvciBSWCBwYWNrZXQgb2NjdXJyZWQgKi8KKyNkZWZpbmUgUlBDX0xFRF8xMDAJKDB4MDUpCS8qIExFRCA9IDEwME1icHMgbGluayBkZWN0ZWN0ICovCisjZGVmaW5lIFJQQ19MRURfVFgJKDB4MDYpCS8qIExFRCA9IFRYIHBhY2tldCBvY2N1cnJlZCAqLworI2RlZmluZSBSUENfTEVEX1JYCSgweDA3KQkvKiBMRUQgPSBSWCBwYWNrZXQgb2NjdXJyZWQgKi8KKwogc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGxlZGE7CisJdW5zaWduZWQgY2hhciBsZWRiOwogfTsKIAogI2VuZGlmIC8qIF9fU01DOTFYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggZGM1MDg2Zi4uMjBmYzRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0xOTAsNyArMTkwLDggQEAKICNkZWZpbmUgQUZfSVVDVgkJMzIJLyogSVVDViBzb2NrZXRzCQkJKi8KICNkZWZpbmUgQUZfUlhSUEMJMzMJLyogUnhSUEMgc29ja2V0cyAJCSovCiAjZGVmaW5lIEFGX0lTRE4JCTM0CS8qIG1JU0ROIHNvY2tldHMgCQkqLwotI2RlZmluZSBBRl9NQVgJCTM1CS8qIEZvciBub3cuLiAqLworI2RlZmluZSBBRl9QSE9ORVQJMzUJLyogUGhvbmV0IHNvY2tldHMJCSovCisjZGVmaW5lIEFGX01BWAkJMzYJLyogRm9yIG5vdy4uICovCiAKIC8qIFByb3RvY29sIGZhbWlsaWVzLCBzYW1lIGFzIGFkZHJlc3MgZmFtaWxpZXMuICovCiAjZGVmaW5lIFBGX1VOU1BFQwlBRl9VTlNQRUMKQEAgLTIyNyw2ICsyMjgsNyBAQAogI2RlZmluZSBQRl9JVUNWCQlBRl9JVUNWCiAjZGVmaW5lIFBGX1JYUlBDCUFGX1JYUlBDCiAjZGVmaW5lIFBGX0lTRE4JCUFGX0lTRE4KKyNkZWZpbmUgUEZfUEhPTkVUCUFGX1BIT05FVAogI2RlZmluZSBQRl9NQVgJCUFGX01BWAogCiAvKiBNYXhpbXVtIHF1ZXVlIGxlbmd0aCBzcGVjaWZpYWJsZSBieSBsaXN0ZW4uICAqLwpAQCAtMjk1LDYgKzI5Nyw3IEBACiAjZGVmaW5lIFNPTF9SWFJQQwkyNzIKICNkZWZpbmUgU09MX1BQUE9MMlRQCTI3MwogI2RlZmluZSBTT0xfQkxVRVRPT1RICTI3NAorI2RlZmluZSBTT0xfUE5QSVBFCTI3NQogCiAvKiBJUFggb3B0aW9ucyAqLwogI2RlZmluZSBJUFhfVFlQRQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmggYi9pbmNsdWRlL2xpbnV4L3NwaS9hZHM3ODQ2LmgKaW5kZXggZGFmNzQ0MC4uMDVlYWIyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvYWRzNzg0Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2Fkczc4NDYuaApAQCAtNDMsNiArNDMsOSBAQAogCXUxNglkZWJvdW5jZV90b2w7CQkvKiB0b2xlcmFuY2UgdXNlZCBmb3IgZmlsdGVyaW5nICovCiAJdTE2CWRlYm91bmNlX3JlcDsJCS8qIGFkZGl0aW9uYWwgY29uc2VjdXRpdmUgZ29vZCByZWFkaW5ncwogCQkJCQkgKiByZXF1aXJlZCBhZnRlciB0aGUgZmlyc3QgdHdvICovCisJaW50CWdwaW9fcGVuZG93bjsJCS8qIHRoZSBHUElPIHVzZWQgdG8gZGVjaWRlIHRoZSBwZW5kb3duCisJCQkJCSAqIHN0YXRlIGlmIGdldF9wZW5kb3duX3N0YXRlID09IE5VTEwKKwkJCQkJICovCiAJaW50CSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOwogCWludAkoKmZpbHRlcl9pbml0KQkoc3RydWN0IGFkczc4NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCiAJCQkJIHZvaWQgKipmaWx0ZXJfZGF0YSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9jb3JnaV9sY2QuaCBiL2luY2x1ZGUvbGludXgvc3BpL2NvcmdpX2xjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTJiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9jb3JnaV9sY2QuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fTElOVVhfU1BJX0NPUkdJX0xDRF9ICisjZGVmaW5lIF9fTElOVVhfU1BJX0NPUkdJX0xDRF9ICisKKyNkZWZpbmUgQ09SR0lfTENEX01PREVfUVZHQQkxCisjZGVmaW5lIENPUkdJX0xDRF9NT0RFX1ZHQQkyCisKK3N0cnVjdCBjb3JnaV9sY2RfcGxhdGZvcm1fZGF0YSB7CisJaW50CWluaXRfbW9kZTsKKwlpbnQJbWF4X2ludGVuc2l0eTsKKwlpbnQJZGVmYXVsdF9pbnRlbnNpdHk7CisJaW50CWxpbWl0X21hc2s7CisKKwlpbnQJZ3Bpb19iYWNrbGlnaHRfb247CS8qIC0xIGlmIG4vYSAqLworCWludAlncGlvX2JhY2tsaWdodF9jb250OwkvKiAtMSBpZiBuL2EgKi8KKworCXZvaWQgKCpub3RpZnkpKGludCBpbnRlbnNpdHkpOworCXZvaWQgKCpraWNrX2JhdHRlcnkpKHZvaWQpOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJX0NPUkdJX0xDRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9vcmlvbl9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL29yaW9uX3NwaS5oCmluZGV4IGI0ZDlmYTYuLmRlY2Y2ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL29yaW9uX3NwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL29yaW9uX3NwaS5oCkBAIC0xMSw2ICsxMSw3IEBACiAKIHN0cnVjdCBvcmlvbl9zcGlfaW5mbyB7CiAJdTMyCXRjbGs7CQkvKiBubyA8bGludXgvY2xrLmg+IHN1cHBvcnQgeWV0ICovCisJdTMyCWVuYWJsZV9jbG9ja19maXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3NiL3NzYl9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2JfcmVncy5oCmluZGV4IGViYWQwYmEuLjk5YTBmOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3NiL3NzYl9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiX3JlZ3MuaApAQCAtMjQ1LDggKzI0NSw2IEBACiAKIC8qIFNQUk9NIFJldmlzaW9uIDMgKGluaGVyaXRzIG1vc3QgZGF0YSBmcm9tIHJldiAyKSAqLwogI2RlZmluZSBTU0JfU1BST00zX0lMME1BQwkJMHgxMDRBCS8qIDYgYnl0ZXMgTUFDIGFkZHJlc3MgZm9yIDgwMi4xMWIvZyAqLwotI2RlZmluZSBTU0JfU1BST00zX0VUME1BQwkJMHgxMDUwCS8qIDYgYnl0ZXMgTUFDIGFkZHJlc3MgZm9yIEV0aGVybmV0ID8/ICovCi0jZGVmaW5lIFNTQl9TUFJPTTNfRVQxTUFDCQkweDEwNTAJLyogNiBieXRlcyBNQUMgYWRkcmVzcyBmb3IgODAyLjExYSA/PyAqLwogI2RlZmluZSBTU0JfU1BST00zX09GRE1BUE8JCTB4MTAyQwkvKiBBLVBIWSBPRkRNIE1pZCBQb3dlciBPZmZzZXQgKDQgYnl0ZXMsIEJpZ0VuZGlhbikgKi8KICNkZWZpbmUgU1NCX1NQUk9NM19PRkRNQUxQTwkJMHgxMDMwCS8qIEEtUEhZIE9GRE0gTG93IFBvd2VyIE9mZnNldCAoNCBieXRlcywgQmlnRW5kaWFuKSAqLwogI2RlZmluZSBTU0JfU1BST00zX09GRE1BSFBPCQkweDEwMzQJLyogQS1QSFkgT0ZETSBIaWdoIFBvd2VyIE9mZnNldCAoNCBieXRlcywgQmlnRW5kaWFuKSAqLwpAQCAtMjY3LDggKzI2NSw2IEBACiAKIC8qIFNQUk9NIFJldmlzaW9uIDQgKi8KICNkZWZpbmUgU1NCX1NQUk9NNF9JTDBNQUMJCTB4MTA0QwkvKiA2IGJ5dGUgTUFDIGFkZHJlc3MgZm9yIGEvYi9nL24gKi8KLSNkZWZpbmUgU1NCX1NQUk9NNF9FVDBNQUMJCTB4MTAxOAkvKiA2IGJ5dGVzIE1BQyBhZGRyZXNzIGZvciBFdGhlcm5ldCA/PyAqLwotI2RlZmluZSBTU0JfU1BST000X0VUMU1BQwkJMHgxMDE4CS8qIDYgYnl0ZXMgTUFDIGFkZHJlc3MgZm9yIDgwMi4xMWEgPz8gKi8KICNkZWZpbmUgU1NCX1NQUk9NNF9FVEhQSFkJCTB4MTA1QQkvKiBFdGhlcm5ldCBQSFkgc2V0dGluZ3MgPz8gKi8KICNkZWZpbmUgIFNTQl9TUFJPTTRfRVRIUEhZX0VUMEEJCTB4MDAxRgkvKiBNSUkgQWRkcmVzcyBmb3IgZW5ldDAgKi8KICNkZWZpbmUgIFNTQl9TUFJPTTRfRVRIUEhZX0VUMUEJCTB4MDNFMAkvKiBNSUkgQWRkcmVzcyBmb3IgZW5ldDEgKi8KQEAgLTMxNiw2ICszMTIsMjEgQEAKICNkZWZpbmUgU1NCX1NQUk9NNF9QQTFCMQkJMHgxMDkwCiAjZGVmaW5lIFNTQl9TUFJPTTRfUEExQjIJCTB4MTA5MgogCisvKiBTUFJPTSBSZXZpc2lvbiA1IChpbmhlcml0cyBtb3N0IGRhdGEgZnJvbSByZXYgNCkgKi8KKyNkZWZpbmUgU1NCX1NQUk9NNV9CRkxMTwkJMHgxMDRBCS8qIEJvYXJkZmxhZ3MgKGxvdyAxNiBiaXRzKSAqLworI2RlZmluZSBTU0JfU1BST001X0JGTEhJCQkweDEwNEMgIC8qIEJvYXJkIEZsYWdzIEhpICovCisjZGVmaW5lIFNTQl9TUFJPTTVfSUwwTUFDCQkweDEwNTIJLyogNiBieXRlIE1BQyBhZGRyZXNzIGZvciBhL2IvZy9uICovCisjZGVmaW5lIFNTQl9TUFJPTTVfQ0NPREUJCTB4MTA0NAkvKiBDb3VudHJ5IENvZGUgKDIgYnl0ZXMpICovCisjZGVmaW5lIFNTQl9TUFJPTTVfR1BJT0EJCTB4MTA3NgkvKiBHZW4uIFB1cnBvc2UgSU8gIyAwIGFuZCAxICovCisjZGVmaW5lICBTU0JfU1BST001X0dQSU9BX1AwCQkweDAwRkYJLyogUGluIDAgKi8KKyNkZWZpbmUgIFNTQl9TUFJPTTVfR1BJT0FfUDEJCTB4RkYwMAkvKiBQaW4gMSAqLworI2RlZmluZSAgU1NCX1NQUk9NNV9HUElPQV9QMV9TSElGVAk4CisjZGVmaW5lIFNTQl9TUFJPTTVfR1BJT0IJCTB4MTA3OAkvKiBHZW4uIFB1cnBvc2UgSU8gIyAyIGFuZCAzICovCisjZGVmaW5lICBTU0JfU1BST001X0dQSU9CX1AyCQkweDAwRkYJLyogUGluIDIgKi8KKyNkZWZpbmUgIFNTQl9TUFJPTTVfR1BJT0JfUDMJCTB4RkYwMAkvKiBQaW4gMyAqLworI2RlZmluZSAgU1NCX1NQUk9NNV9HUElPQl9QM19TSElGVAk4CisKKwogLyogVmFsdWVzIGZvciBTU0JfU1BST00xX0JJTkZfQ0NPREUgKi8KIGVudW0gewogCVNTQl9TUFJPTTFDQ09ERV9XT1JMRCA9IDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0YWNrdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oCmluZGV4IDVkYTk3OTQuLmIxMDZmZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX0xJTlVYX1NUQUNLVFJBQ0VfSAogI2RlZmluZSBfX0xJTlVYX1NUQUNLVFJBQ0VfSAogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKICNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQogc3RydWN0IHN0YWNrX3RyYWNlIHsKIAl1bnNpZ25lZCBpbnQgbnJfZW50cmllcywgbWF4X2VudHJpZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0cmluZ19oZWxwZXJzLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZ19oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlYjJmNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3RyaW5nX2hlbHBlcnMuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MSU5VWF9TVFJJTkdfSEVMUEVSU19IXworI2RlZmluZSBfTElOVVhfU1RSSU5HX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIERlc2NyaXB0aW9ucyBvZiB0aGUgdHlwZXMgb2YgdW5pdHMgdG8KKyAqIHByaW50IGluICovCitlbnVtIHN0cmluZ19zaXplX3VuaXRzIHsKKwlTVFJJTkdfVU5JVFNfMTAsCS8qIHVzZSBwb3dlcnMgb2YgMTBeMyAoc3RhbmRhcmQgU0kpICovCisJU1RSSU5HX1VOSVRTXzIsCQkvKiB1c2UgYmluYXJ5IHBvd2VycyBvZiAyXjEwICovCit9OworCitpbnQgc3RyaW5nX2dldF9zaXplKHU2NCBzaXplLCBlbnVtIHN0cmluZ19zaXplX3VuaXRzIHVuaXRzLAorCQkgICAgY2hhciAqYnVmLCBpbnQgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKaW5kZXggZTViZmUwMS4uNmYwZWUxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAJY29uc3Qgc3RydWN0IHJwY190aW1lb3V0ICp0aW1lb3V0OwogCWNoYXIJCQkqc2VydmVybmFtZTsKIAlzdHJ1Y3QgcnBjX3Byb2dyYW0JKnByb2dyYW07CisJdTMyCQkJcHJvZ251bWJlcjsJLyogb3ZlcnJpZGVzIHByb2dyYW0tPm51bWJlciAqLwogCXUzMgkJCXZlcnNpb247CiAJcnBjX2F1dGhmbGF2b3JfdAlhdXRoZmxhdm9yOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwpAQCAtMTI0LDEwICsxMjUsMTAgQEAKIHZvaWQJCXJwY19zaHV0ZG93bl9jbGllbnQoc3RydWN0IHJwY19jbG50ICopOwogdm9pZAkJcnBjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBycGNfY2xudCAqKTsKIAotaW50CQlycGNiX3JlZ2lzdGVyKHUzMiwgdTMyLCBpbnQsIHVuc2lnbmVkIHNob3J0LCBpbnQgKik7CitpbnQJCXJwY2JfcmVnaXN0ZXIodTMyLCB1MzIsIGludCwgdW5zaWduZWQgc2hvcnQpOwogaW50CQlycGNiX3Y0X3JlZ2lzdGVyKGNvbnN0IHUzMiBwcm9ncmFtLCBjb25zdCB1MzIgdmVyc2lvbiwKIAkJCQkgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyZXNzLAotCQkJCSBjb25zdCBjaGFyICpuZXRpZCwgaW50ICpyZXN1bHQpOworCQkJCSBjb25zdCBjaGFyICpuZXRpZCk7CiBpbnQJCXJwY2JfZ2V0cG9ydF9zeW5jKHN0cnVjdCBzb2NrYWRkcl9pbiAqLCB1MzIsIHUzMiwgaW50KTsKIHZvaWQJCXJwY2JfZ2V0cG9ydF9hc3luYyhzdHJ1Y3QgcnBjX3Rhc2sgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKaW5kZXggZGM2OTA2OC4uM2FmZTdmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKQEAgLTY2LDYgKzY2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXN2X3RlbXBzb2NrczsJLyogYWxsIHRlbXBvcmFyeSBzb2NrZXRzICovCiAJaW50CQkJc3ZfdG1wY250OwkvKiBjb3VudCBvZiB0ZW1wb3Jhcnkgc29ja2V0cyAqLwogCXN0cnVjdCB0aW1lcl9saXN0CXN2X3RlbXB0aW1lcjsJLyogdGltZXIgZm9yIGFnaW5nIHRlbXBvcmFyeSBzb2NrZXRzICovCisJc2FfZmFtaWx5X3QJCXN2X2ZhbWlseTsJLyogbGlzdGVuZXIncyBhZGRyZXNzIGZhbWlseSAqLwogCiAJY2hhciAqCQkJc3ZfbmFtZTsJLyogc2VydmljZSBuYW1lICovCiAKQEAgLTI2NSwxNyArMjY2LDE3IEBACiAvKgogICogUmlnb3JvdXMgdHlwZSBjaGVja2luZyBvbiBzb2NrYWRkciB0eXBlIGNvbnZlcnNpb25zCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyX2luICpzdmNfYWRkcl9pbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3QpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3ZjX2FkZHJfaW4oY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0KQogewogCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luICopICZycXN0LT5ycV9hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnN2Y19hZGRyX2luNihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3QpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnN2Y19hZGRyX2luNihjb25zdCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3QpCiB7CiAJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZycXN0LT5ycV9hZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkciAqc3ZjX2FkZHIoc3RydWN0IHN2Y19ycXN0ICpycXN0KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKnN2Y19hZGRyKGNvbnN0IHN0cnVjdCBzdmNfcnFzdCAqcnFzdCkKIHsKIAlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSAmcnFzdC0+cnFfYWRkcjsKIH0KQEAgLTM4MSwxOCArMzgyLDIwIEBACiAvKgogICogRnVuY3Rpb24gcHJvdG90eXBlcy4KICAqLwotc3RydWN0IHN2Y19zZXJ2ICogIHN2Y19jcmVhdGUoc3RydWN0IHN2Y19wcm9ncmFtICosIHVuc2lnbmVkIGludCwKLQkJCSAgICAgIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2KikpOworc3RydWN0IHN2Y19zZXJ2ICpzdmNfY3JlYXRlKHN0cnVjdCBzdmNfcHJvZ3JhbSAqLCB1bnNpZ25lZCBpbnQsIHNhX2ZhbWlseV90LAorCQkJICAgIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICopKTsKIHN0cnVjdCBzdmNfcnFzdCAqc3ZjX3ByZXBhcmVfdGhyZWFkKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKIAkJCQkJc3RydWN0IHN2Y19wb29sICpwb29sKTsKIHZvaWQJCSAgIHN2Y19leGl0X3RocmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CiBzdHJ1Y3Qgc3ZjX3NlcnYgKiAgc3ZjX2NyZWF0ZV9wb29sZWQoc3RydWN0IHN2Y19wcm9ncmFtICosIHVuc2lnbmVkIGludCwKLQkJCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2KiksIHN2Y190aHJlYWRfZm4sCi0JCQlzdHJ1Y3QgbW9kdWxlICopOworCQkJc2FfZmFtaWx5X3QsIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICopLAorCQkJc3ZjX3RocmVhZF9mbiwgc3RydWN0IG1vZHVsZSAqKTsKIGludAkJICAgc3ZjX3NldF9udW1fdGhyZWFkcyhzdHJ1Y3Qgc3ZjX3NlcnYgKiwgc3RydWN0IHN2Y19wb29sICosIGludCk7CiB2b2lkCQkgICBzdmNfZGVzdHJveShzdHJ1Y3Qgc3ZjX3NlcnYgKik7CiBpbnQJCSAgIHN2Y19wcm9jZXNzKHN0cnVjdCBzdmNfcnFzdCAqKTsKLWludAkJICAgc3ZjX3JlZ2lzdGVyKHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsIHVuc2lnbmVkIHNob3J0KTsKK2ludAkJICAgc3ZjX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBzdmNfc2VydiAqLCBjb25zdCB1bnNpZ25lZCBzaG9ydCwKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCk7CisKIHZvaWQJCSAgIHN2Y193YWtlX3VwKHN0cnVjdCBzdmNfc2VydiAqKTsKIHZvaWQJCSAgIHN2Y19yZXNlcnZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCBzcGFjZSk7CiBzdHJ1Y3Qgc3ZjX3Bvb2wgKiAgc3ZjX3Bvb2xfZm9yX2NwdShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3JkbWEuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y19yZG1hLmgKaW5kZXggZGMwNWI1NC4uYzE0ZmU4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3JkbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfcmRtYS5oCkBAIC03Miw2ICs3Miw3IEBACiAgKi8KIHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0IHsKIAlzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqcmVhZF9oZHI7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXI7CiAJaW50IGhkcl9jb3VudDsKIAlzdHJ1Y3QgeGRyX2J1ZiBhcmc7CiAJc3RydWN0IGxpc3RfaGVhZCBkdG9fcTsKQEAgLTEwMywxNiArMTA0LDMwIEBACiAJaW50IHN0YXJ0OwkJLyogc2dlIG5vIGZvciB0aGlzIGNodW5rICovCiAJaW50IGNvdW50OwkJLyogc2dlIGNvdW50IGZvciB0aGlzIGNodW5rICovCiB9Oworc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgeworCXN0cnVjdCBpYl9tciAqbXI7CisJdm9pZCAqa3ZhOworCXN0cnVjdCBpYl9mYXN0X3JlZ19wYWdlX2xpc3QgKnBhZ2VfbGlzdDsKKwlpbnQgcGFnZV9saXN0X2xlbjsKKwl1bnNpZ25lZCBsb25nIGFjY2Vzc19mbGFnczsKKwl1bnNpZ25lZCBsb25nIG1hcF9sZW47CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCXN0cnVjdCBsaXN0X2hlYWQgZnJtcl9saXN0OworfTsKIHN0cnVjdCBzdmNfcmRtYV9yZXFfbWFwIHsKKwlzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqZnJtcjsKIAl1bnNpZ25lZCBsb25nIGNvdW50OwogCXVuaW9uIHsKIAkJc3RydWN0IGt2ZWMgc2dlW1JQQ1NWQ19NQVhQQUdFU107CiAJCXN0cnVjdCBzdmNfcmRtYV9jaHVua19zZ2UgY2hbUlBDU1ZDX01BWFBBR0VTXTsKIAl9OwogfTsKLQorI2RlZmluZSBSRE1BQ1RYVF9GX0ZBU1RfVU5SRUcJMQogI2RlZmluZSBSRE1BQ1RYVF9GX0xBU1RfQ1RYVAkyCiAKKyNkZWZpbmUJU1ZDUkRNQV9ERVZDQVBfRkFTVF9SRUcJCTEJLyogZmFzdCBtciByZWdpc3RyYXRpb24gKi8KKyNkZWZpbmUJU1ZDUkRNQV9ERVZDQVBfUkVBRF9XX0lOVgkyCS8qIHJlYWQgdy8gaW52YWxpZGF0ZSAqLworCiBzdHJ1Y3Qgc3ZjeHBydF9yZG1hIHsKIAlzdHJ1Y3Qgc3ZjX3hwcnQgICAgICBzY194cHJ0OwkJLyogU1ZDIHRyYW5zcG9ydCBzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgcmRtYV9jbV9pZCAgICAqc2NfY21faWQ7CQkvKiBSRE1BIGNvbm5lY3Rpb24gaWQgKi8KQEAgLTEzNiw2ICsxNTEsMTEgQEAKIAlzdHJ1Y3QgaWJfY3EgICAgICAgICAqc2NfcnFfY3E7CiAJc3RydWN0IGliX2NxICAgICAgICAgKnNjX3NxX2NxOwogCXN0cnVjdCBpYl9tciAgICAgICAgICpzY19waHlzX21yOwkvKiBNUiBmb3Igc2VydmVyIG1lbW9yeSAqLworCXUzMgkJICAgICBzY19kZXZfY2FwczsJLyogZGlzdGlsbGVkIGRldmljZSBjYXBzICovCisJdTMyCQkgICAgIHNjX2RtYV9sa2V5OwkvKiBsb2NhbCBkbWEga2V5ICovCisJdW5zaWduZWQgaW50CSAgICAgc2NfZnJtcl9wZ19saXN0X2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICBzY19mcm1yX3E7CisJc3BpbmxvY2tfdAkgICAgIHNjX2ZybXJfcV9sb2NrOwogCiAJc3BpbmxvY2tfdAkgICAgIHNjX2xvY2s7CQkvKiB0cmFuc3BvcnQgbG9jayAqLwogCkBAIC0xOTIsOCArMjEyLDEzIEBACiBleHRlcm4gaW50IHN2Y19yZG1hX2NyZWF0ZV9saXN0ZW4oc3RydWN0IHN2Y19zZXJ2ICosIGludCwgc3RydWN0IHNvY2thZGRyICopOwogZXh0ZXJuIHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICpzdmNfcmRtYV9nZXRfY29udGV4dChzdHJ1Y3Qgc3ZjeHBydF9yZG1hICopOwogZXh0ZXJuIHZvaWQgc3ZjX3JkbWFfcHV0X2NvbnRleHQoc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKiwgaW50KTsKK2V4dGVybiB2b2lkIHN2Y19yZG1hX3VubWFwX2RtYShzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqY3R4dCk7CiBleHRlcm4gc3RydWN0IHN2Y19yZG1hX3JlcV9tYXAgKnN2Y19yZG1hX2dldF9yZXFfbWFwKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ZjX3JkbWFfcHV0X3JlcV9tYXAoc3RydWN0IHN2Y19yZG1hX3JlcV9tYXAgKik7CitleHRlcm4gaW50IHN2Y19yZG1hX2Zhc3RyZWcoc3RydWN0IHN2Y3hwcnRfcmRtYSAqLCBzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqKTsKK2V4dGVybiBzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqc3ZjX3JkbWFfZ2V0X2ZybXIoc3RydWN0IHN2Y3hwcnRfcmRtYSAqKTsKK2V4dGVybiB2b2lkIHN2Y19yZG1hX3B1dF9mcm1yKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKiwKKwkJCSAgICAgIHN0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yICopOwogZXh0ZXJuIHZvaWQgc3ZjX3NxX3JlYXAoc3RydWN0IHN2Y3hwcnRfcmRtYSAqKTsKIGV4dGVybiB2b2lkIHN2Y19ycV9yZWFwKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKik7CiBleHRlcm4gc3RydWN0IHN2Y194cHJ0X2NsYXNzIHN2Y19yZG1hX2NsYXNzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3Zjc29jay5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3Zjc29jay5oCmluZGV4IDhjZmY2OTYuLjQ4M2UxMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNzb2NrLmgKQEAgLTM5LDEwICszOSw3IEBACiB2b2lkCQlzdmNfZHJvcChzdHJ1Y3Qgc3ZjX3Jxc3QgKik7CiB2b2lkCQlzdmNfc29ja191cGRhdGVfYnVmcyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpOwogaW50CQlzdmNfc29ja19uYW1lcyhjaGFyICpidWYsIHN0cnVjdCBzdmNfc2VydiAqc2VydiwgY2hhciAqdG9jbG9zZSk7Ci1pbnQJCXN2Y19hZGRzb2NrKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKLQkJCSAgICBpbnQgZmQsCi0JCQkgICAgY2hhciAqbmFtZV9yZXR1cm4sCi0JCQkgICAgaW50ICpwcm90byk7CitpbnQJCXN2Y19hZGRzb2NrKHN0cnVjdCBzdmNfc2VydiAqc2VydiwgaW50IGZkLCBjaGFyICpuYW1lX3JldHVybik7CiB2b2lkCQlzdmNfaW5pdF94cHJ0X3NvY2sodm9pZCk7CiB2b2lkCQlzdmNfY2xlYW51cF94cHJ0X3NvY2sodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hwcnRyZG1hLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0cmRtYS5oCmluZGV4IDRkZTU2YjEuLjU0YTM3OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hwcnRyZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveHBydHJkbWEuaApAQCAtNjYsOSArNjYsNiBAQAogCiAjZGVmaW5lIFJQQ1JETUFfSU5MSU5FX1BBRF9USFJFU0ggICg1MTIpLyogcGF5bG9hZCB0aHJlc2hvbGQgdG8gcGFkIChieXRlcykgKi8KIAotI2RlZmluZSBSRE1BX1JFU09MVkVfVElNRU9VVAkoNSpIWikJLyogVEJEIDUgc2Vjb25kcyAqLwotI2RlZmluZSBSRE1BX0NPTk5FQ1RfUkVUUllfTUFYCSgyKQkvKiByZXRyaWVzIGlmIG5vIGxpc3RlbmVyIGJhY2tsb2cgKi8KLQogLyogbWVtb3J5IHJlZ2lzdHJhdGlvbiBzdHJhdGVnaWVzICovCiAjZGVmaW5lIFJQQ1JETUFfUEVSU0lTVEVOVF9SRUdJU1RSQVRJT04gKDEpCiAKQEAgLTc4LDYgKzc1LDcgQEAKIAlSUENSRE1BX01FTVdJTkRPV1MsCiAJUlBDUkRNQV9NRU1XSU5ET1dTX0FTWU5DLAogCVJQQ1JETUFfTVRIQ0FGTVIsCisJUlBDUkRNQV9GUk1SLAogCVJQQ1JETUFfQUxMUEhZU0lDQUwsCiAJUlBDUkRNQV9MQVNUCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmggYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMThlYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKQEAgLTAsMCArMSw4MyBAQAorI2lmbmRlZiBfX0xJTlVYX1NXSU9UTEJfSAorI2RlZmluZSBfX0xJTlVYX1NXSU9UTEJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGRldmljZTsKK3N0cnVjdCBkbWFfYXR0cnM7CitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKK2V4dGVybiB2b2lkCitzd2lvdGxiX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkCisqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCisJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncyk7CisKK2V4dGVybiB2b2lkCitzd2lvdGxiX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAorCQkgICAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKKworZXh0ZXJuIGRtYV9hZGRyX3QKK3N3aW90bGJfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcik7CisKK2V4dGVybiB2b2lkCitzd2lvdGxiX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7CisKK2V4dGVybiBkbWFfYWRkcl90Citzd2lvdGxiX21hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCQkgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpOworCitleHRlcm4gdm9pZAorc3dpb3RsYl91bm1hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpOworCitleHRlcm4gaW50Citzd2lvdGxiX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCSAgICAgICBpbnQgZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK3N3aW90bGJfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJIGludCBkaXJlY3Rpb24pOworCitleHRlcm4gaW50Citzd2lvdGxiX21hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZWxlbXMsCisJCSAgICAgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpOworCitleHRlcm4gdm9pZAorc3dpb3RsYl91bm1hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCSAgICAgICBpbnQgbmVsZW1zLCBpbnQgZGlyLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycyk7CisKK2V4dGVybiB2b2lkCitzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOworCitleHRlcm4gdm9pZAorc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQlpbnQgbmVsZW1zLCBpbnQgZGlyKTsKKworZXh0ZXJuIHZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7CisKK2V4dGVybiB2b2lkCitzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgIGludCBuZWxlbXMsIGludCBkaXIpOworCitleHRlcm4gdm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKKworZXh0ZXJuIHZvaWQKK3N3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIGludCBkaXIpOworCitleHRlcm4gaW50Citzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKKworZXh0ZXJuIGludAorc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NXSU9UTEJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggZDA0MzdmMy4uMzlkNDcxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC05NzIsNyArOTcyLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgY3RsX3RhYmxlIGN0bF90YWJsZTsKIAotdHlwZWRlZiBpbnQgY3RsX2hhbmRsZXIgKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK3R5cGVkZWYgaW50IGN0bF9oYW5kbGVyIChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggMzdmYTI0MS4uYjMzMGUyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtNzgsNiArNzgsOCBAQAogCXNzaXplX3QJKCpzdG9yZSkoc3RydWN0IGtvYmplY3QgKixzdHJ1Y3QgYXR0cmlidXRlICosY29uc3QgY2hhciAqLCBzaXplX3QpOwogfTsKIAorc3RydWN0IHN5c2ZzX2RpcmVudDsKKwogI2lmZGVmIENPTkZJR19TWVNGUwogCiBpbnQgc3lzZnNfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IGtvYmplY3QgKmtvYmosIHZvaWQgKCpmdW5jKSh2b2lkICopLApAQCAtMTE3LDkgKzExOSwxNCBAQAogdm9pZCBzeXNmc19yZW1vdmVfZmlsZV9mcm9tX2dyb3VwKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqZ3JvdXApOwogCi12b2lkIHN5c2ZzX25vdGlmeShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqZGlyLCBjaGFyICphdHRyKTsKLQotZXh0ZXJuIGludCBfX211c3RfY2hlY2sgc3lzZnNfaW5pdCh2b2lkKTsKK3ZvaWQgc3lzZnNfbm90aWZ5KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmF0dHIpOwordm9pZCBzeXNmc19ub3RpZnlfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKK3N0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldF9kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqcGFyZW50X3NkLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpOworc3RydWN0IHN5c2ZzX2RpcmVudCAqc3lzZnNfZ2V0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKK3ZvaWQgc3lzZnNfcHV0KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKK3ZvaWQgc3lzZnNfcHJpbnRrX2xhc3RfZmlsZSh2b2lkKTsKK2ludCBfX211c3RfY2hlY2sgc3lzZnNfaW5pdCh2b2lkKTsKIAogI2Vsc2UgLyogQ09ORklHX1NZU0ZTICovCiAKQEAgLTIyMiw3ICsyMjksMjQgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX25vdGlmeShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqZGlyLCBjaGFyICphdHRyKQorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX25vdGlmeShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3QgY2hhciAqZGlyLAorCQkJCWNvbnN0IGNoYXIgKmF0dHIpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfbm90aWZ5X2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldF9kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqcGFyZW50X3NkLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNmc19wdXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CiB9CiAKQEAgLTIzMSw2ICsyNTUsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX3ByaW50a19sYXN0X2ZpbGUodm9pZCkKK3sKK30KKwogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCiAjZW5kaWYgLyogX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZy5oIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmcuaAppbmRleCA1ZTg4YWZjLi5iZGY4NTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGFza19pb19hY2NvdW50aW5nLmgKQEAgLTUsNyArNSw3IEBACiAgKiBEb24ndCBpbmNsdWRlIHRoaXMgaGVhZGVyIGZpbGUgZGlyZWN0bHkgLSBpdCBpcyBkZXNpZ25lZCB0byBiZSBkcmFnZ2VkIGluIHZpYQogICogc2NoZWQuaC4KICAqCi0gKiBCbGFtZSBha3BtQG9zZGwub3JnIGZvciBhbGwgdGhpcy4KKyAqIEJsYW1lIEFuZHJldyBNb3J0b24gZm9yIGFsbCB0aGlzLgogICovCiAKIHN0cnVjdCB0YXNrX2lvX2FjY291bnRpbmcgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y19hY3QvS2J1aWxkIGIvaW5jbHVkZS9saW51eC90Y19hY3QvS2J1aWxkCmluZGV4IDZkYWMwZDcuLjc2OTkwOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNfYWN0L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L3RjX2FjdC9LYnVpbGQKQEAgLTMsMyArMyw0IEBACiBoZWFkZXIteSArPSB0Y19taXJyZWQuaAogaGVhZGVyLXkgKz0gdGNfcGVkaXQuaAogaGVhZGVyLXkgKz0gdGNfbmF0LmgKK2hlYWRlci15ICs9IHRjX3NrYmVkaXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oIGIvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfc2tiZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNGU0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19za2JlZGl0LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIER1eWNrIDxhbGV4YW5kZXIuaC5kdXlja0BpbnRlbC5jb20+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1RDX1NLQkVESVRfSAorI2RlZmluZSBfX0xJTlVYX1RDX1NLQkVESVRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0tCRURJVCAxMQorCisjZGVmaW5lIFNLQkVESVRfRl9QUklPUklUWQkJMHgxCisjZGVmaW5lIFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HCQkweDIKKworc3RydWN0IHRjX3NrYmVkaXQgeworCXRjX2dlbjsKK307CisKK2VudW0geworCVRDQV9TS0JFRElUX1VOU1BFQywKKwlUQ0FfU0tCRURJVF9UTSwKKwlUQ0FfU0tCRURJVF9QQVJNUywKKwlUQ0FfU0tCRURJVF9QUklPUklUWSwKKwlUQ0FfU0tCRURJVF9RVUVVRV9NQVBQSU5HLAorCV9fVENBX1NLQkVESVRfTUFYCit9OworI2RlZmluZSBUQ0FfU0tCRURJVF9NQVggKF9fVENBX1NLQkVESVRfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCAyZTI1NTczLi5mZTc3ZTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTMxMiw4ICszMTIsMTEgQEAKIAl1MzIJcmV0cmFuc19vdXQ7CS8qIFJldHJhbnNtaXR0ZWQgcGFja2V0cyBvdXQJCSovCiAKIAl1MTYJdXJnX2RhdGE7CS8qIFNhdmVkIG9jdGV0IG9mIE9PQiBkYXRhIGFuZCBjb250cm9sIGZsYWdzICovCi0JdTgJdXJnX21vZGU7CS8qIEluIHVyZ2VudCBtb2RlCQkqLwogCXU4CWVjbl9mbGFnczsJLyogRUNOIHN0YXR1cyBiaXRzLgkJCSovCisJdTgJcmVvcmRlcmluZzsJLyogUGFja2V0IHJlb3JkZXJpbmcgbWV0cmljLgkJKi8KKwl1MzIJc25kX3VwOwkJLyogVXJnZW50IHBvaW50ZXIJCSovCisKKwl1OAlrZWVwYWxpdmVfcHJvYmVzOyAvKiBudW0gb2YgYWxsb3dlZCBrZWVwIGFsaXZlIHByb2JlcwkqLwogLyoKICAqICAgICAgT3B0aW9ucyByZWNlaXZlZCAodXN1YWxseSBvbiBsYXN0IHBhY2tldCwgc29tZSBvbmx5IG9uIFNZTiBwYWNrZXRzKS4KICAqLwpAQCAtMzQyLDcgKzM0NSw2IEBACiAJc3RydWN0IHNrX2J1ZmYqIGxvc3Rfc2tiX2hpbnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNjb3JlYm9hcmRfc2tiX2hpbnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnJldHJhbnNtaXRfc2tiX2hpbnQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKmZvcndhcmRfc2tiX2hpbnQ7CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCW91dF9vZl9vcmRlcl9xdWV1ZTsgLyogT3V0IG9mIG9yZGVyIHNlZ21lbnRzIGdvIGhlcmUgKi8KIApAQCAtMzU4LDEyICszNjAsMTAgQEAKIAkJCQkJICovCiAKIAlpbnQgICAgIGxvc3RfY250X2hpbnQ7Ci0JaW50ICAgICByZXRyYW5zbWl0X2NudF9oaW50OworCXUzMiAgICAgcmV0cmFuc21pdF9oaWdoOwkvKiBMLWJpdHMgbWF5IGJlIG9uIHVwIHRvIHRoaXMgc2Vxbm8gKi8KIAogCXUzMglsb3N0X3JldHJhbnNfbG93OwkvKiBTZW50IHNlcSBhZnRlciBhbnkgcnhtaXQgKGxvd2VzdCkgKi8KIAotCXU4CXJlb3JkZXJpbmc7CS8qIFBhY2tldCByZW9yZGVyaW5nIG1ldHJpYy4JCSovCi0JdTgJa2VlcGFsaXZlX3Byb2JlczsgLyogbnVtIG9mIGFsbG93ZWQga2VlcCBhbGl2ZSBwcm9iZXMJKi8KIAl1MzIJcHJpb3Jfc3N0aHJlc2g7IC8qIHNzdGhyZXNoIHNhdmVkIGF0IHJlY292ZXJ5IHN0YXJ0CSovCiAJdTMyCWhpZ2hfc2VxOwkvKiBzbmRfbnh0IGF0IG9uc2V0IG9mIGNvbmdlc3Rpb24JKi8KIApAQCAtMzc1LDggKzM3NSw2IEBACiAJdTMyCXRvdGFsX3JldHJhbnM7CS8qIFRvdGFsIHJldHJhbnNtaXRzIGZvciBlbnRpcmUgY29ubmVjdGlvbiAqLwogCiAJdTMyCXVyZ19zZXE7CS8qIFNlcSBvZiByZWNlaXZlZCB1cmdlbnQgcG9pbnRlciAqLwotCXUzMglzbmRfdXA7CQkvKiBVcmdlbnQgcG9pbnRlcgkJKi8KLQogCXVuc2lnbmVkIGludAkJa2VlcGFsaXZlX3RpbWU7CSAgLyogdGltZSBiZWZvcmUga2VlcCBhbGl2ZSB0YWtlcyBwbGFjZSAqLwogCXVuc2lnbmVkIGludAkJa2VlcGFsaXZlX2ludHZsOyAgLyogdGltZSBpbnRlcnZhbCBiZXR3ZWVuIGtlZXAgYWxpdmUgcHJvYmVzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGVsZXBob255LmggYi9pbmNsdWRlL2xpbnV4L3RlbGVwaG9ueS5oCmluZGV4IDBkMGNmMmEuLjViMmI2MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGVsZXBob255LmgKKysrIGIvaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaApAQCAtMjgsMTAgKzI4LDYgQEAKICAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gSEFTIE5PIE9CTElHQVRJT04KICAqIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KICAqCi0gKiBWZXJzaW9uOiAgICAgICAkUmV2aXNpb246IDQuMiAkCi0gKgotICogJElkOiB0ZWxlcGhvbnkuaCx2IDQuMiAyMDAxLzA4LzA2IDA3OjA5OjQzIGNyYWlncyBFeHAgJAotICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBURUxFUEhPTllfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZXJtaW9zLmggYi9pbmNsdWRlL2xpbnV4L3Rlcm1pb3MuaAppbmRleCA0Nzg2NjI4Li4yYWNkMGMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Rlcm1pb3MuaApAQCAtNCw0ICs0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdGVybWlvcy5oPgogCisjZGVmaW5lIE5GRgk1CisKK3N0cnVjdCB0ZXJtaW94Cit7CisJX191MTYJeF9oZmxhZzsKKwlfX3UxNgl4X2NmbGFnOworCV9fdTE2CXhfcmZsYWdbTkZGXTsKKwlfX3UxNgl4X3NmbGFnOworfTsKKworI2RlZmluZQlSVFNYT0ZGCQkweDAwMDEJCS8qIFJUUyBmbG93IGNvbnRyb2wgb24gaW5wdXQgKi8KKyNkZWZpbmUJQ1RTWE9OCQkweDAwMDIJCS8qIENUUyBmbG93IGNvbnRyb2wgb24gb3V0cHV0ICovCisjZGVmaW5lCURUUlhPRkYJCTB4MDAwNAkJLyogRFRSIGZsb3cgY29udHJvbCBvbiBpbnB1dCAqLworI2RlZmluZSBEU1JYT04JCTB4MDAwOAkJLyogRENEIGZsb3cgY29udHJvbCBvbiBvdXRwdXQgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpY2suaCBiL2luY2x1ZGUvbGludXgvdGljay5oCmluZGV4IDhjZjhjZmUuLjk4OTIxYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGljay5oCisrKyBiL2luY2x1ZGUvbGludXgvdGljay5oCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gbGVuOwogfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9zdG9wX2lkbGUoaW50IGNwdSkgeyB9Ci1zdGF0aWMgaW5saW5lIHU2NCBnZXRfY3B1X2lkbGVfdGltZV91cyhpbnQgY3B1LCB1NjQgKnVudXNlZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB1NjQgZ2V0X2NwdV9pZGxlX3RpbWVfdXMoaW50IGNwdSwgdTY0ICp1bnVzZWQpIHsgcmV0dXJuIC0xOyB9CiAjIGVuZGlmIC8qICFOT19IWiAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggNzI2OTc2NC4uYzkxMWVmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTI5LDYgKzI5LDggQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAorZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKIC8qIFBhcmFtZXRlcnMgdXNlZCB0byBjb252ZXJ0IHRoZSB0aW1lc3BlYyB2YWx1ZXM6ICovCiAjZGVmaW5lIE1TRUNfUEVSX1NFQwkxMDAwTAogI2RlZmluZSBVU0VDX1BFUl9NU0VDCTEwMDBMCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eS5oIGIvaW5jbHVkZS9saW51eC90dHkuaAppbmRleCAwY2JlYzc0Li4zYjgxMjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTIzLDcgKzIzLDcgQEAKICAqLwogI2RlZmluZSBOUl9VTklYOThfUFRZX0RFRkFVTFQJNDA5NiAgICAgIC8qIERlZmF1bHQgbWF4aW11bSBmb3IgVW5peDk4IHB0eXMgKi8KICNkZWZpbmUgTlJfVU5JWDk4X1BUWV9NQVgJKDEgPDwgTUlOT1JCSVRTKSAvKiBBYnNvbHV0ZSBsaW1pdCAqLwotI2RlZmluZSBOUl9MRElTQ1MJCTE4CisjZGVmaW5lIE5SX0xESVNDUwkJMTkKIAogLyogbGluZSBkaXNjaXBsaW5lcyAqLwogI2RlZmluZSBOX1RUWQkJMApAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBOX0hDSQkJMTUJLyogQmx1ZXRvb3RoIEhDSSBVQVJUICovCiAjZGVmaW5lIE5fR0lHQVNFVF9NMTAxCTE2CS8qIFNpZW1lbnMgR2lnYXNldCBNMTAxIHNlcmlhbCBERUNUIGFkYXB0ZXIgKi8KICNkZWZpbmUgTl9TTENBTgkJMTcJLyogU2VyaWFsIC8gVVNCIHNlcmlhbCBDQU4gQWRhcHRvcnMgKi8KKyNkZWZpbmUgTl9QUFMJCTE4CS8qIFB1bHNlIHBlciBTZWNvbmQgKi8KIAogLyoKICAqIFRoaXMgY2hhcmFjdGVyIGlzIHRoZSBzYW1lIGFzIF9QT1NJWF9WRElTQUJMRTogaXQgY2Fubm90IGJlIHVzZWQgYXMKQEAgLTE4MSw2ICsxODIsNyBAQAogCiBzdHJ1Y3QgdHR5X3BvcnQgewogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CQkvKiBCYWNrIHBvaW50ZXIgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogTG9jayBwcm90ZWN0aW5nIHR0eSBmaWVsZCAqLwogCWludAkJCWJsb2NrZWRfb3BlbjsJLyogV2FpdGluZyB0byBvcGVuICovCiAJaW50CQkJY291bnQ7CQkvKiBVc2FnZSBjb3VudCAqLwogCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsJLyogT3BlbiB3YWl0ZXJzICovCkBAIC0yMDgsNiArMjEwLDcgQEAKIAogc3RydWN0IHR0eV9zdHJ1Y3QgewogCWludAltYWdpYzsKKwlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CiAJY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zICpvcHM7CiAJaW50IGluZGV4OwpAQCAtMjE3LDYgKzIyMCw3IEBACiAJc3BpbmxvY2tfdCBjdHJsX2xvY2s7CiAJLyogVGVybWlvcyB2YWx1ZXMgYXJlIHByb3RlY3RlZCBieSB0aGUgdGVybWlvcyBtdXRleCAqLwogCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywgKnRlcm1pb3NfbG9ja2VkOworCXN0cnVjdCB0ZXJtaW94ICp0ZXJtaW94OwkvKiBNYXkgYmUgTlVMTCBmb3IgdW5zdXBwb3J0ZWQgKi8KIAljaGFyIG5hbWVbNjRdOwogCXN0cnVjdCBwaWQgKnBncnA7CQkvKiBQcm90ZWN0ZWQgYnkgY3RybCBsb2NrICovCiAJc3RydWN0IHBpZCAqc2Vzc2lvbjsKQEAgLTMxMCw2ICszMTQsMjUgQEAKIGV4dGVybiB2b2lkIGNvbnNvbGVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgdmNzX2luaXQodm9pZCk7CiAKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKnR0eV9jbGFzczsKKworLyoqCisgKgl0dHlfa3JlZl9nZXQJCS0JZ2V0IGEgdHR5IHJlZmVyZW5jZQorICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVJldHVybiBhIG5ldyByZWZlcmVuY2UgdG8gYSB0dHkgb2JqZWN0LiBUaGUgY2FsbGVyIG11c3QgaG9sZAorICoJc3VmZmljaWVudCBsb2Nrcy9jb3VudHMgdG8gZW5zdXJlIHRoYXQgdGhlaXIgZXhpc3RpbmcgcmVmZXJlbmNlIGNhbm5vdAorICoJZ28gYXdheQorICovCisKK2V4dGVybiBpbmxpbmUgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9rcmVmX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICh0dHkpCisJCWtyZWZfZ2V0KCZ0dHktPmtyZWYpOworCXJldHVybiB0dHk7Cit9CitleHRlcm4gdm9pZCB0dHlfa3JlZl9wdXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKIGV4dGVybiBpbnQgdHR5X3BhcmFub2lhX2NoZWNrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICBjb25zdCBjaGFyICpyb3V0aW5lKTsKIGV4dGVybiBjaGFyICp0dHlfbmFtZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyICpidWYpOwpAQCAtMzMzLDEzICszNTYsMTUgQEAKIGV4dGVybiB2b2lkIHR0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIGludCB0dHlfZG9fcmVzaXplKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwKIAkJCQkJCXN0cnVjdCB3aW5zaXplICp3cyk7Ci0KK2V4dGVybiB2b2lkIHR0eV9zaHV0ZG93bihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHR0eV9mcmVlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gaW50IGlzX2N1cnJlbnRfcGdycF9vcnBoYW5lZCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcGlkICp0dHlfZ2V0X3BncnAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gaW50IGlzX2lnbm9yZWQoaW50IHNpZyk7CiBleHRlcm4gaW50IHR0eV9zaWduYWwoaW50IHNpZywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCB0dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIHZvaWQgdHR5X3ZoYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCB0dHlfdmhhbmd1cF9zZWxmKHZvaWQpOwogZXh0ZXJuIHZvaWQgdHR5X3VuaGFuZ3VwKHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gdm9pZCBkb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CkBAIC0zNDcsNiArMzcyLDkgQEAKIGV4dGVybiB2b2lkIGRpc2Fzc29jaWF0ZV9jdHR5KGludCBwcml2KTsKIGV4dGVybiB2b2lkIG5vX3R0eSh2b2lkKTsKIGV4dGVybiB2b2lkIHR0eV9mbGlwX2J1ZmZlcl9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgdHR5X2J1ZmZlcl9mcmVlX2FsbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHR0eV9idWZmZXJfZmx1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCB0dHlfYnVmZmVyX2luaXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gc3BlZWRfdCB0dHlfZ2V0X2JhdWRfcmF0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiBzcGVlZF90IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MpOwogZXh0ZXJuIHNwZWVkX3QgdHR5X3Rlcm1pb3NfaW5wdXRfYmF1ZF9yYXRlKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcyk7CkBAIC0zNzIsNiArNDAwLDE1IEBACiBleHRlcm4gZGV2X3QgdHR5X2Rldm51bShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIHByb2NfY2xlYXJfdHR5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKmdldF9jdXJyZW50X3R0eSh2b2lkKTsKK2V4dGVybiB2b2lkIHR0eV9kZWZhdWx0X2ZvcHMoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcyk7CitleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKmFsbG9jX3R0eV9zdHJ1Y3Qodm9pZCk7CitleHRlcm4gdm9pZCBmcmVlX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCBpbml0aWFsaXplX3R0eV9zdHJ1Y3Qoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGlkeCk7CitleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9pbml0X2RldihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaWR4LAorCQkJCQkJCQlpbnQgZmlyc3Rfb2spOworZXh0ZXJuIHZvaWQgdHR5X3JlbGVhc2VfZGV2KHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgdHR5X2luaXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCB0dHlfbXV0ZXg7CiAKQEAgLTM4Miw2ICs0MTksOCBAQAogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfaW5pdChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIGludCB0dHlfcG9ydF9hbGxvY194bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfZnJlZV94bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOworZXh0ZXJuIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlfcG9ydF90dHlfZ2V0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CitleHRlcm4gdm9pZCB0dHlfcG9ydF90dHlfc2V0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKIGV4dGVybiBpbnQgdHR5X3JlZ2lzdGVyX2xkaXNjKGludCBkaXNjLCBzdHJ1Y3QgdHR5X2xkaXNjX29wcyAqbmV3X2xkaXNjKTsKIGV4dGVybiBpbnQgdHR5X3VucmVnaXN0ZXJfbGRpc2MoaW50IGRpc2MpOwpAQCAtNDI3LDcgKzQ2Niw3IEBACiAjZW5kaWYKIAogLyogdHR5X2lvY3RsLmMgKi8KLWV4dGVybiBpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCitleHRlcm4gaW50IG5fdHR5X2lvY3RsX2hlbHBlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogLyogc2VyaWFsLmMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKaW5kZXggMTZkMjc5NC4uNzg0MTZiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKQEAgLTcsNiArNywyOCBAQAogICogZGVmaW5lZDsgdW5sZXNzIG5vdGVkIG90aGVyd2lzZSwgdGhleSBhcmUgb3B0aW9uYWwsIGFuZCBjYW4gYmUKICAqIGZpbGxlZCBpbiB3aXRoIGEgbnVsbCBwb2ludGVyLgogICoKKyAqIHN0cnVjdCB0dHlfc3RydWN0ICogKCpsb29rdXApKHN0cnVjdCB0dHlfZHJpdmVyICpzZWxmLCBpbnQgaWR4KQorICoKKyAqCVJldHVybiB0aGUgdHR5IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIGlkeCwgTlVMTCBpZiB0aGVyZSBpcyBub3QKKyAqCW9uZSBjdXJyZW50bHkgaW4gdXNlIGFuZCBhbiBFUlJfUFRSIHZhbHVlIG9uIGVycm9yLiBDYWxsZWQgdW5kZXIKKyAqCXR0eV9tdXRleCAoZm9yIG5vdyEpCisgKgorICoJT3B0aW9uYWwgbWV0aG9kLiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byB1c2UgdGhlIHR0eXMgYXJyYXkKKyAqCisgKiBpbnQgKCppbnN0YWxsKShzdHJ1Y3QgdHR5X2RyaXZlciAqc2VsZiwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKKyAqCisgKglJbnN0YWxsIGEgbmV3IHR0eSBpbnRvIHRoZSB0dHkgZHJpdmVyIGludGVybmFsIHRhYmxlcy4gVXNlZCBpbgorICoJY29uanVuY3Rpb24gd2l0aCBsb29rdXAgYW5kIHJlbW92ZSBtZXRob2RzLgorICoKKyAqCU9wdGlvbmFsIG1ldGhvZC4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gdXNlIHRoZSB0dHlzIGFycmF5CisgKgorICogdm9pZCAoKnJlbW92ZSkoc3RydWN0IHR0eV9kcml2ZXIgKnNlbGYsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCisgKgorICoJUmVtb3ZlIGEgY2xvc2VkIHR0eSBmcm9tIHRoZSB0dHkgZHJpdmVyIGludGVybmFsIHRhYmxlcy4gVXNlZCBpbgorICoJY29uanVuY3Rpb24gd2l0aCBsb29rdXAgYW5kIHJlbW92ZSBtZXRob2RzLgorICoKKyAqCU9wdGlvbmFsIG1ldGhvZC4gRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gdXNlIHRoZSB0dHlzIGFycmF5CisgKgogICogaW50ICAoKm9wZW4pKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogICoKICAqIAlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYSBwYXJ0aWN1bGFyIHR0eSBkZXZpY2UgaXMgb3BlbmVkLgpAQCAtMjEsNiArNDMsMTEgQEAKICAqCiAgKglSZXF1aXJlZCBtZXRob2QuCiAgKgorICogdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CisgKgorICogCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIHBhcnRpY3VsYXIgdHR5IGRldmljZSBpcyBjbG9zZWQgZm9yCisgKgl0aGUgbGFzdCB0aW1lIGZyZWVpbmcgdXAgdGhlIHJlc291cmNlcy4KKyAqCiAgKiBpbnQgKCp3cml0ZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCiAgKiAJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiAgKgpAQCAtMTgwLDYgKzIwNywxNCBAQAogICoJbm90IGZvcmNlIGVycm9ycyBoZXJlIGlmIHRoZXkgYXJlIG5vdCByZXNpemFibGUgb2JqZWN0cyAoZWcgYSBzZXJpYWwKICAqCWxpbmUpLiBTZWUgdHR5X2RvX3Jlc2l6ZSgpIGlmIHlvdSBuZWVkIHRvIHdyYXAgdGhlIHN0YW5kYXJkIG1ldGhvZAogICoJaW4geW91ciBvd24gbG9naWMgLSB0aGUgdXN1YWwgY2FzZS4KKyAqCisgKiB2b2lkICgqc2V0X3Rlcm1pb3gpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW94ICpuZXcpOworICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgcmVjZWl2ZXMgYSB0ZXJtaW94IGJhc2VkIGlvY3RsLiBQYXNzZXMgZG93bgorICoJdGhlIHJlcXVlc3RlZCBkYXRhIGZyb20gdXNlciBzcGFjZS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZAorICoJdW5sZXNzIHRoZSB0dHkgYWxzbyBoYXMgYSB2YWxpZCB0dHktPnRlcm1pb3ggcG9pbnRlci4KKyAqCisgKglPcHRpb25hbDogQ2FsbGVkIHVuZGVyIHRoZSB0ZXJtaW9zIGxvY2sKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTE5MCw4ICsyMjUsMTMgQEAKIHN0cnVjdCB0dHlfZHJpdmVyOwogCiBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgeworCXN0cnVjdCB0dHlfc3RydWN0ICogKCpsb29rdXApKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaWR4KTsKKwlpbnQgICgqaW5zdGFsbCkoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAJaW50ICAoKm9wZW4pKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogCXZvaWQgKCpjbG9zZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAlpbnQgICgqd3JpdGUpKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAogCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiAJaW50ICAoKnB1dF9jaGFyKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKQEAgLTIyMCw2ICsyNjAsNyBAQAogCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKIAlpbnQgKCpyZXNpemUpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwKIAkJCQlzdHJ1Y3Qgd2luc2l6ZSAqd3MpOworCWludCAoKnNldF90ZXJtaW94KShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlveCAqdG5ldyk7CiAjaWZkZWYgQ09ORklHX0NPTlNPTEVfUE9MTAogCWludCAoKnBvbGxfaW5pdCkoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGxpbmUsIGNoYXIgKm9wdGlvbnMpOwogCWludCAoKnBvbGxfZ2V0X2NoYXIpKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBsaW5lKTsKQEAgLTIyOSw2ICsyNzAsNyBAQAogCiBzdHJ1Y3QgdHR5X2RyaXZlciB7CiAJaW50CW1hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIGZvciB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCBrcmVmIGtyZWY7CS8qIFJlZmVyZW5jZSBtYW5hZ2VtZW50ICovCiAJc3RydWN0IGNkZXYgY2RldjsKIAlzdHJ1Y3QgbW9kdWxlCSpvd25lcjsKIAljb25zdCBjaGFyCSpkcml2ZXJfbmFtZTsKQEAgLTI0Miw3ICsyODQsNiBAQAogCXNob3J0CXN1YnR5cGU7CS8qIHN1YnR5cGUgb2YgdHR5IGRyaXZlciAqLwogCXN0cnVjdCBrdGVybWlvcyBpbml0X3Rlcm1pb3M7IC8qIEluaXRpYWwgdGVybWlvcyAqLwogCWludAlmbGFnczsJCS8qIHR0eSBkcml2ZXIgZmxhZ3MgKi8KLQlpbnQJcmVmY291bnQ7CS8qIGZvciBsb2FkYWJsZSB0dHkgZHJpdmVycyAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsgLyogL3Byb2MgZnMgZW50cnkgKi8KIAlzdHJ1Y3QgdHR5X2RyaXZlciAqb3RoZXI7IC8qIG9ubHkgdXNlZCBmb3IgdGhlIFBUWSBkcml2ZXIgKi8KIApAQCAtMjY0LDEyICszMDUsMTkgQEAKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdHR5X2RyaXZlcnM7CiAKLXN0cnVjdCB0dHlfZHJpdmVyICphbGxvY190dHlfZHJpdmVyKGludCBsaW5lcyk7Ci12b2lkIHB1dF90dHlfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpOwotdm9pZCB0dHlfc2V0X29wZXJhdGlvbnMoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKK2V4dGVybiBzdHJ1Y3QgdHR5X2RyaXZlciAqYWxsb2NfdHR5X2RyaXZlcihpbnQgbGluZXMpOworZXh0ZXJuIHZvaWQgcHV0X3R0eV9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcik7CitleHRlcm4gdm9pZCB0dHlfc2V0X29wZXJhdGlvbnMoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKIAkJCWNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyAqb3ApOwogZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICp0dHlfZmluZF9wb2xsaW5nX2RyaXZlcihjaGFyICpuYW1lLCBpbnQgKmxpbmUpOwogCitleHRlcm4gdm9pZCB0dHlfZHJpdmVyX2tyZWZfcHV0KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGlubGluZSBzdHJ1Y3QgdHR5X2RyaXZlciAqdHR5X2RyaXZlcl9rcmVmX2dldChzdHJ1Y3QgdHR5X2RyaXZlciAqZCkKK3sKKwlrcmVmX2dldCgmZC0+a3JlZik7CisJcmV0dXJuIGQ7Cit9CisKIC8qIHR0eSBkcml2ZXIgbWFnaWMgbnVtYmVyICovCiAjZGVmaW5lIFRUWV9EUklWRVJfTUFHSUMJCTB4NTQwMgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggZDRhOWNlNi4uZjI0ZjdiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMTkxLDEyICsxOTEsMTQgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIGdmcF90OwogCi0jaWZkZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAotdHlwZWRlZiB1NjQgcmVzb3VyY2Vfc2l6ZV90OworI2lmZGVmIENPTkZJR19QSFlTX0FERFJfVF82NEJJVAordHlwZWRlZiB1NjQgcGh5c19hZGRyX3Q7CiAjZWxzZQotdHlwZWRlZiB1MzIgcmVzb3VyY2Vfc2l6ZV90OwordHlwZWRlZiB1MzIgcGh5c19hZGRyX3Q7CiAjZW5kaWYKIAordHlwZWRlZiBwaHlzX2FkZHJfdCByZXNvdXJjZV9zaXplX3Q7CisKIHN0cnVjdCB1c3RhdCB7CiAJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOwogCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWNiMTQwMC5oIGIvaW5jbHVkZS9saW51eC91Y2IxNDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwNDczYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdWNiMTQwMC5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyBmb3I6CisgKiAgUGhpbGlwcyBVQ0IxNDAwIGRyaXZlcgorICoKKyAqIEJhc2VkIG9uIHVjYjE0MDBfdHM6CisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJU2VwdGVtYmVyIDI1LCAyMDA2CisgKiAgQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogU3BsaXRpbmcgZG9uZSBieTogTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KKyAqIElmIHNvbWV0aGluZyBkb2VzbnQgd29yayBhbmQgaXQgd29ya2VkIGJlZm9yZSBzcGxpdGluZywgZS1tYWlsIG1lLAorICogZG9udCBib3RoZXIgTmljb2xhcyBwbGVhc2UgOy0pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB1Y2IxeDAwLSouYyBjb3B5cmlnaHRlZCBieSBSdXNzZWxsIEtpbmcKKyAqIGNvdmVyaW5nIHRoZSBVQ0IxMTAwLCBVQ0IxMjAwIGFuZCBVQ0IxMzAwLi4gIFN1cHBvcnQgZm9yIHRoZSBVQ0IxNDAwIGhhcworICogYmVlbiBtYWRlIHNlcGFyYXRlIGZyb20gdWNiMXgwMC1jb3JlL3VjYjF4MDAtdHMgb24gUnVzc2VsbCdzIHJlcXVlc3QuCisgKi8KKworI2lmbmRlZiBfTElOVVhfX1VDQjE0MDBfSAorI2RlZmluZSBfTElOVVhfX1VDQjE0MDBfSAorCisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qCisgKiBVQ0IxNDAwIEFDLWxpbmsgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBVQ0JfSU9fREFUQQkJMHg1YQorI2RlZmluZSBVQ0JfSU9fRElSCQkweDVjCisjZGVmaW5lIFVDQl9JRV9SSVMJCTB4NWUKKyNkZWZpbmUgVUNCX0lFX0ZBTAkJMHg2MAorI2RlZmluZSBVQ0JfSUVfU1RBVFVTCQkweDYyCisjZGVmaW5lIFVDQl9JRV9DTEVBUgkJMHg2MgorI2RlZmluZSBVQ0JfSUVfQURDCQkoMSA8PCAxMSkKKyNkZWZpbmUgVUNCX0lFX1RTUFgJCSgxIDw8IDEyKQorCisjZGVmaW5lIFVDQl9UU19DUgkJMHg2NAorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9QT1cJKDEgPDwgMCkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfUE9XCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9UU19DUl9UU01ZX1BPVwkoMSA8PCAyKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWV9QT1cJKDEgPDwgMykKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVhfR05ECSgxIDw8IDQpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BYX0dORAkoMSA8PCA1KQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWV9HTkQJKDEgPDwgNikKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFlfR05ECSgxIDw8IDcpCisjZGVmaW5lIFVDQl9UU19DUl9NT0RFX0lOVAkoMCA8PCA4KQorI2RlZmluZSBVQ0JfVFNfQ1JfTU9ERV9QUkVTCSgxIDw8IDgpCisjZGVmaW5lIFVDQl9UU19DUl9NT0RFX1BPUwkoMiA8PCA4KQorI2RlZmluZSBVQ0JfVFNfQ1JfQklBU19FTkEJKDEgPDwgMTEpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BYX0xPVwkoMSA8PCAxMikKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVhfTE9XCSgxIDw8IDEzKQorCisjZGVmaW5lIFVDQl9BRENfQ1IJCTB4NjYKKyNkZWZpbmUgVUNCX0FEQ19TWU5DX0VOQQkoMSA8PCAwKQorI2RlZmluZSBVQ0JfQURDX1ZSRUZCWVBfQ09OCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTUFgJKDAgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNNWAkoMSA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9UU1BZCSgyIDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTTVkJKDMgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQwCQkoNCA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9BRDEJCSg1IDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX0FEMgkJKDYgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQzCQkoNyA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0VYVF9SRUYJCSgxIDw8IDUpCisjZGVmaW5lIFVDQl9BRENfU1RBUlQJCSgxIDw8IDcpCisjZGVmaW5lIFVDQl9BRENfRU5BCQkoMSA8PCAxNSkKKworI2RlZmluZSBVQ0JfQURDX0RBVEEJCTB4NjgKKyNkZWZpbmUgVUNCX0FEQ19EQVRfVkFMSUQJKDEgPDwgMTUpCisjZGVmaW5lIFVDQl9BRENfREFUX01BU0sJMHgzZmYKKworI2RlZmluZSBVQ0JfSUQJCQkweDdlCisjZGVmaW5lIFVDQl9JRF8xNDAwICAgICAgICAgICAgIDB4NDMwNAorCitzdHJ1Y3QgdWNiMTQwMF90cyB7CisJc3RydWN0IGlucHV0X2RldgkqdHNfaWRldjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRzX3Rhc2s7CisJaW50CQkJaWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJdHNfd2FpdDsKKwl1bnNpZ25lZCBpbnQJCXRzX3Jlc3RhcnQ6MTsKKwlpbnQJCQlpcnE7CisJdW5zaWduZWQgaW50CQlpcnFfcGVuZGluZzsJLyogbm90IGJpdCBmaWVsZCBzaGFyZWQgKi8KKwlzdHJ1Y3Qgc25kX2FjOTcJCSphYzk3OworfTsKKworc3RydWN0IHVjYjE0MDAgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnVjYjE0MDBfdHM7Cit9OworCitzdGF0aWMgaW5saW5lIHUxNiB1Y2IxNDAwX3JlZ19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IHJlZykKK3sKKwlyZXR1cm4gYWM5Ny0+YnVzLT5vcHMtPnJlYWQoYWM5NywgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfcmVnX3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IHJlZywgdTE2IHZhbCkKK3sKKwlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiB1Y2IxNDAwX2dwaW9fZ2V0X3ZhbHVlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IGdwaW8pCit7CisJcmV0dXJuIHVjYjE0MDBfcmVnX3JlYWQoYWM5NywgVUNCX0lPX0RBVEEpICYgKDEgPDwgZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxNDAwX2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IGdwaW8sCisJCQkJCQl1MTYgdmFsKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKGFjOTcsIFVDQl9JT19EQVRBLCB2YWwgPworCQkJdWNiMTQwMF9yZWdfcmVhZChhYzk3LCBVQ0JfSU9fREFUQSkgfCAoMSA8PCBncGlvKSA6CisJCQl1Y2IxNDAwX3JlZ19yZWFkKGFjOTcsIFVDQl9JT19EQVRBKSAmIH4oMSA8PCBncGlvKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHVjYjE0MDBfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IGdwaW8pCit7CisJcmV0dXJuIHVjYjE0MDBfcmVnX3JlYWQoYWM5NywgVUNCX0lPX0RJUikgJiAoMSA8PCBncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfZ3Bpb19zZXRfZGlyZWN0aW9uKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IGdwaW8sCisJCQkJCQl1MTYgZGlyKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKGFjOTcsIFVDQl9JT19ESVIsIGRpciA/CisJCQl1Y2IxNDAwX3JlZ19yZWFkKGFjOTcsIFVDQl9JT19ESVIpIHwgKDEgPDwgZ3BpbykgOgorCQkJdWNiMTQwMF9yZWdfcmVhZChhYzk3LCBVQ0JfSU9fRElSKSAmIH4oMSA8PCBncGlvKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1Y2IxNDAwX2FkY19lbmFibGUoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCXVjYjE0MDBfcmVnX3dyaXRlKGFjOTcsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1Y2IxNDAwX2FkY19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdTE2IGFkY19jaGFubmVsLAorCQkJCQlpbnQgYWRjc3luYykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKGFkY3N5bmMpCisJCWFkY19jaGFubmVsIHw9IFVDQl9BRENfU1lOQ19FTkE7CisKKwl1Y2IxNDAwX3JlZ193cml0ZShhYzk3LCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IGFkY19jaGFubmVsKTsKKwl1Y2IxNDAwX3JlZ193cml0ZShhYzk3LCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IGFkY19jaGFubmVsIHwKKwkJCQlVQ0JfQURDX1NUQVJUKTsKKworCXdoaWxlICghKCh2YWwgPSB1Y2IxNDAwX3JlZ19yZWFkKGFjOTcsIFVDQl9BRENfREFUQSkpCisJCQkmIFVDQl9BRENfREFUX1ZBTElEKSkKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisKKwlyZXR1cm4gdmFsICYgVUNCX0FEQ19EQVRfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfYWRjX2Rpc2FibGUoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCXVjYjE0MDBfcmVnX3dyaXRlKGFjOTcsIFVDQl9BRENfQ1IsIDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2VoY2lfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9laGNpX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODhlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9laGNpX2RlZi5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0VIQ0lfREVGX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfRUhDSV9ERUZfSAorCisvKiBFSENJIHJlZ2lzdGVyIGludGVyZmFjZSwgY29ycmVzcG9uZHMgdG8gRUhDSSBSZXZpc2lvbiAwLjk1IHNwZWNpZmljYXRpb24gKi8KKworLyogU2VjdGlvbiAyLjIgSG9zdCBDb250cm9sbGVyIENhcGFiaWxpdHkgUmVnaXN0ZXJzICovCitzdHJ1Y3QgZWhjaV9jYXBzIHsKKwkvKiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCBhcyA4IGFuZCAxNiBiaXQgcmVnaXN0ZXJzLAorCSAqIGJ1dCBzb21lIGhvc3RzIGNhbid0IHBlcmZvcm0gOCBvciAxNiBiaXQgUENJIGFjY2Vzc2VzLgorCSAqLworCXUzMgkJaGNfY2FwYmFzZTsKKyNkZWZpbmUgSENfTEVOR1RIKHApCQkoKChwKT4+MDApJjB4MDBmZikJLyogYml0cyA3OjAgKi8KKyNkZWZpbmUgSENfVkVSU0lPTihwKQkJKCgocCk+PjE2KSYweGZmZmYpCS8qIGJpdHMgMzE6MTYgKi8KKwl1MzIJCWhjc19wYXJhbXM7ICAgICAvKiBIQ1NQQVJBTVMgLSBvZmZzZXQgMHg0ICovCisjZGVmaW5lIEhDU19ERUJVR19QT1JUKHApCSgoKHApPj4yMCkmMHhmKQkvKiBiaXRzIDIzOjIwLCBkZWJ1ZyBwb3J0PyAqLworI2RlZmluZSBIQ1NfSU5ESUNBVE9SKHApCSgocCkmKDEgPDwgMTYpKQkvKiB0cnVlOiBoYXMgcG9ydCBpbmRpY2F0b3JzICovCisjZGVmaW5lIEhDU19OX0NDKHApCQkoKChwKT4+MTIpJjB4ZikJLyogYml0cyAxNToxMiwgI2NvbXBhbmlvbiBIQ3MgKi8KKyNkZWZpbmUgSENTX05fUENDKHApCQkoKChwKT4+OCkmMHhmKQkvKiBiaXRzIDExOjgsIHBvcnRzIHBlciBDQyAqLworI2RlZmluZSBIQ1NfUE9SVFJPVVRFRChwKQkoKHApJigxIDw8IDcpKQkvKiB0cnVlOiBwb3J0IHJvdXRpbmcgKi8KKyNkZWZpbmUgSENTX1BQQyhwKQkJKChwKSYoMSA8PCA0KSkJLyogdHJ1ZTogcG9ydCBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEhDU19OX1BPUlRTKHApCQkoKChwKT4+MCkmMHhmKQkvKiBiaXRzIDM6MCwgcG9ydHMgb24gSEMgKi8KKworCXUzMgkJaGNjX3BhcmFtczsgICAgICAvKiBIQ0NQQVJBTVMgLSBvZmZzZXQgMHg4ICovCisjZGVmaW5lIEhDQ19FWFRfQ0FQUyhwKQkJKCgocCk+PjgpJjB4ZmYpCS8qIGZvciBwY2kgZXh0ZW5kZWQgY2FwcyAqLworI2RlZmluZSBIQ0NfSVNPQ19DQUNIRShwKSAgICAgICAoKHApJigxIDw8IDcpKSAgLyogdHJ1ZTogY2FuIGNhY2hlIGlzb2MgZnJhbWUgKi8KKyNkZWZpbmUgSENDX0lTT0NfVEhSRVMocCkgICAgICAgKCgocCk+PjQpJjB4NykgIC8qIGJpdHMgNjo0LCB1ZnJhbWVzIGNhY2hlZCAqLworI2RlZmluZSBIQ0NfQ0FOUEFSSyhwKQkJKChwKSYoMSA8PCAyKSkgIC8qIHRydWU6IGNhbiBwYXJrIG9uIGFzeW5jIHFoICovCisjZGVmaW5lIEhDQ19QR01fRlJBTUVMSVNUTEVOKHApICgocCkmKDEgPDwgMSkpICAvKiB0cnVlOiBwZXJpb2RpY19zaXplIGNoYW5nZXMqLworI2RlZmluZSBIQ0NfNjRCSVRfQUREUihwKSAgICAgICAoKHApJigxKSkgICAgICAgLyogdHJ1ZTogY2FuIHVzZSA2NC1iaXQgYWRkciAqLworCXU4CQlwb3J0cm91dGUgWzhdOwkgLyogbmliYmxlcyBmb3Igcm91dGluZyAtIG9mZnNldCAweEMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qIFNlY3Rpb24gMi4zIEhvc3QgQ29udHJvbGxlciBPcGVyYXRpb25hbCBSZWdpc3RlcnMgKi8KK3N0cnVjdCBlaGNpX3JlZ3MgeworCisJLyogVVNCQ01EOiBvZmZzZXQgMHgwMCAqLworCXUzMgkJY29tbWFuZDsKKy8qIDIzOjE2IGlzIHIvdyBpbnRyIHJhdGUsIGluIG1pY3JvZnJhbWVzOyBkZWZhdWx0ICI4IiA9PSAxL21zZWMgKi8KKyNkZWZpbmUgQ01EX1BBUksJKDE8PDExKQkJLyogZW5hYmxlICJwYXJrIiBvbiBhc3luYyBxaCAqLworI2RlZmluZSBDTURfUEFSS19DTlQoYykJKCgoYyk+PjgpJjMpCS8qIGhvdyBtYW55IHRyYW5zZmVycyB0byBwYXJrIGZvciAqLworI2RlZmluZSBDTURfTFJFU0VUCSgxPDw3KQkJLyogcGFydGlhbCByZXNldCAobm8gcG9ydHMsIGV0YykgKi8KKyNkZWZpbmUgQ01EX0lBQUQJKDE8PDYpCQkvKiAiZG9vcmJlbGwiIGludGVycnVwdCBhc3luYyBhZHZhbmNlICovCisjZGVmaW5lIENNRF9BU0UJCSgxPDw1KQkJLyogYXN5bmMgc2NoZWR1bGUgZW5hYmxlICovCisjZGVmaW5lIENNRF9QU0UJCSgxPDw0KQkJLyogcGVyaW9kaWMgc2NoZWR1bGUgZW5hYmxlICovCisvKiAzOjIgaXMgcGVyaW9kaWMgZnJhbWUgbGlzdCBzaXplICovCisjZGVmaW5lIENNRF9SRVNFVAkoMTw8MSkJCS8qIHJlc2V0IEhDIG5vdCBidXMgKi8KKyNkZWZpbmUgQ01EX1JVTgkJKDE8PDApCQkvKiBzdGFydC9zdG9wIEhDICovCisKKwkvKiBVU0JTVFM6IG9mZnNldCAweDA0ICovCisJdTMyCQlzdGF0dXM7CisjZGVmaW5lIFNUU19BU1MJCSgxPDwxNSkJCS8qIEFzeW5jIFNjaGVkdWxlIFN0YXR1cyAqLworI2RlZmluZSBTVFNfUFNTCQkoMTw8MTQpCQkvKiBQZXJpb2RpYyBTY2hlZHVsZSBTdGF0dXMgKi8KKyNkZWZpbmUgU1RTX1JFQ0wJKDE8PDEzKQkJLyogUmVjbGFtYXRpb24gKi8KKyNkZWZpbmUgU1RTX0hBTFQJKDE8PDEyKQkJLyogTm90IHJ1bm5pbmcgKGFueSByZWFzb24pICovCisvKiBzb21lIGJpdHMgcmVzZXJ2ZWQgKi8KKwkvKiB0aGVzZSBTVFNfKiBmbGFncyBhcmUgYWxzbyBpbnRyX2VuYWJsZSBiaXRzIChVU0JJTlRSKSAqLworI2RlZmluZSBTVFNfSUFBCQkoMTw8NSkJCS8qIEludGVycnVwdGVkIG9uIGFzeW5jIGFkdmFuY2UgKi8KKyNkZWZpbmUgU1RTX0ZBVEFMCSgxPDw0KQkJLyogc3VjaCBhcyBzb21lIFBDSSBhY2Nlc3MgZXJyb3JzICovCisjZGVmaW5lIFNUU19GTFIJCSgxPDwzKQkJLyogZnJhbWUgbGlzdCByb2xsZWQgb3ZlciAqLworI2RlZmluZSBTVFNfUENECQkoMTw8MikJCS8qIHBvcnQgY2hhbmdlIGRldGVjdCAqLworI2RlZmluZSBTVFNfRVJSCQkoMTw8MSkJCS8qICJlcnJvciIgY29tcGxldGlvbiAob3ZlcmZsb3csIC4uLikgKi8KKyNkZWZpbmUgU1RTX0lOVAkJKDE8PDApCQkvKiAibm9ybWFsIiBjb21wbGV0aW9uIChzaG9ydCwgLi4uKSAqLworCisJLyogVVNCSU5UUjogb2Zmc2V0IDB4MDggKi8KKwl1MzIJCWludHJfZW5hYmxlOworCisJLyogRlJJTkRFWDogb2Zmc2V0IDB4MEMgKi8KKwl1MzIJCWZyYW1lX2luZGV4OwkvKiBjdXJyZW50IG1pY3JvZnJhbWUgbnVtYmVyICovCisJLyogQ1RSTERTU0VHTUVOVDogb2Zmc2V0IDB4MTAgKi8KKwl1MzIJCXNlZ21lbnQ7CS8qIGFkZHJlc3MgYml0cyA2MzozMiBpZiBuZWVkZWQgKi8KKwkvKiBQRVJJT0RJQ0xJU1RCQVNFOiBvZmZzZXQgMHgxNCAqLworCXUzMgkJZnJhbWVfbGlzdDsJLyogcG9pbnRzIHRvIHBlcmlvZGljIGxpc3QgKi8KKwkvKiBBU1lOQ0xJU1RBRERSOiBvZmZzZXQgMHgxOCAqLworCXUzMgkJYXN5bmNfbmV4dDsJLyogYWRkcmVzcyBvZiBuZXh0IGFzeW5jIHF1ZXVlIGhlYWQgKi8KKworCXUzMgkJcmVzZXJ2ZWQgWzldOworCisJLyogQ09ORklHRkxBRzogb2Zmc2V0IDB4NDAgKi8KKwl1MzIJCWNvbmZpZ3VyZWRfZmxhZzsKKyNkZWZpbmUgRkxBR19DRgkJKDE8PDApCQkvKiB0cnVlOiB3ZSdsbCBzdXBwb3J0ICJoaWdoIHNwZWVkIiAqLworCisJLyogUE9SVFNDOiBvZmZzZXQgMHg0NCAqLworCXUzMgkJcG9ydF9zdGF0dXMgWzBdOwkvKiB1cCB0byBOX1BPUlRTICovCisvKiAzMToyMyByZXNlcnZlZCAqLworI2RlZmluZSBQT1JUX1dLT0NfRQkoMTw8MjIpCQkvKiB3YWtlIG9uIG92ZXJjdXJyZW50IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tESVNDX0UJKDE8PDIxKQkJLyogd2FrZSBvbiBkaXNjb25uZWN0IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tDT05OX0UJKDE8PDIwKQkJLyogd2FrZSBvbiBjb25uZWN0IChlbmFibGUpICovCisvKiAxOToxNiBmb3IgcG9ydCB0ZXN0aW5nICovCisjZGVmaW5lIFBPUlRfTEVEX09GRgkoMDw8MTQpCisjZGVmaW5lIFBPUlRfTEVEX0FNQkVSCSgxPDwxNCkKKyNkZWZpbmUgUE9SVF9MRURfR1JFRU4JKDI8PDE0KQorI2RlZmluZSBQT1JUX0xFRF9NQVNLCSgzPDwxNCkKKyNkZWZpbmUgUE9SVF9PV05FUgkoMTw8MTMpCQkvKiB0cnVlOiBjb21wYW5pb24gaGMgb3ducyB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9QT1dFUgkoMTw8MTIpCQkvKiB0cnVlOiBoYXMgcG93ZXIgKHNlZSBQUEMpICovCisjZGVmaW5lIFBPUlRfVVNCMTEoeCkgKCgoeCkmKDM8PDEwKSkgPT0gKDE8PDEwKSkJLyogVVNCIDEuMSBkZXZpY2UgKi8KKy8qIDExOjEwIGZvciBkZXRlY3RpbmcgbG93c3BlZWQgZGV2aWNlcyAocmVzZXQgdnMgcmVsZWFzZSBvd25lcnNoaXApICovCisvKiA5IHJlc2VydmVkICovCisjZGVmaW5lIFBPUlRfUkVTRVQJKDE8PDgpCQkvKiByZXNldCBwb3J0ICovCisjZGVmaW5lIFBPUlRfU1VTUEVORAkoMTw8NykJCS8qIHN1c3BlbmQgcG9ydCAqLworI2RlZmluZSBQT1JUX1JFU1VNRQkoMTw8NikJCS8qIHJlc3VtZSBpdCAqLworI2RlZmluZSBQT1JUX09DQwkoMTw8NSkJCS8qIG92ZXIgY3VycmVudCBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9PQwkJKDE8PDQpCQkvKiBvdmVyIGN1cnJlbnQgYWN0aXZlICovCisjZGVmaW5lIFBPUlRfUEVDCSgxPDwzKQkJLyogcG9ydCBlbmFibGUgY2hhbmdlICovCisjZGVmaW5lIFBPUlRfUEUJCSgxPDwyKQkJLyogcG9ydCBlbmFibGUgKi8KKyNkZWZpbmUgUE9SVF9DU0MJKDE8PDEpCQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9DT05ORUNUCSgxPDwwKQkJLyogZGV2aWNlIGNvbm5lY3RlZCAqLworI2RlZmluZSBQT1JUX1JXQ19CSVRTICAgKFBPUlRfQ1NDIHwgUE9SVF9QRUMgfCBQT1JUX09DQykKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQk1PREUJCTB4NjgJCS8qIFVTQiBEZXZpY2UgbW9kZSAqLworI2RlZmluZSBVU0JNT0RFX1NESVMJKDE8PDMpCQkvKiBTdHJlYW0gZGlzYWJsZSAqLworI2RlZmluZSBVU0JNT0RFX0JFCSgxPDwyKQkJLyogQkUvTEUgZW5kaWFubmVzcyBzZWxlY3QgKi8KKyNkZWZpbmUgVVNCTU9ERV9DTV9IQwkoMzw8MCkJCS8qIGhvc3QgY29udHJvbGxlciBtb2RlICovCisjZGVmaW5lIFVTQk1PREVfQ01fSURMRQkoMDw8MCkJCS8qIGlkbGUgc3RhdGUgKi8KKworLyogQXBwZW5kaXggQywgRGVidWcgcG9ydCAuLi4gaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHNwZWNpYWwgImRlYnVnIGRldmljZXMiCisgKiB0aGF0IGNhbiBoZWxwIGlmIHRoZXJlJ3Mgbm8gc2VyaWFsIGNvbnNvbGUuICAobm9uc3RhbmRhcmQgZW51bWVyYXRpb24uKQorICovCitzdHJ1Y3QgZWhjaV9kYmdfcG9ydCB7CisJdTMyCWNvbnRyb2w7CisjZGVmaW5lIERCR1BfT1dORVIJKDE8PDMwKQorI2RlZmluZSBEQkdQX0VOQUJMRUQJKDE8PDI4KQorI2RlZmluZSBEQkdQX0RPTkUJKDE8PDE2KQorI2RlZmluZSBEQkdQX0lOVVNFCSgxPDwxMCkKKyNkZWZpbmUgREJHUF9FUlJDT0RFKHgpCSgoKHgpPj43KSYweDA3KQorIwlkZWZpbmUgREJHUF9FUlJfQkFECTEKKyMJZGVmaW5lIERCR1BfRVJSX1NJR05BTAkyCisjZGVmaW5lIERCR1BfRVJST1IJKDE8PDYpCisjZGVmaW5lIERCR1BfR08JCSgxPDw1KQorI2RlZmluZSBEQkdQX09VVAkoMTw8NCkKKyNkZWZpbmUgREJHUF9MRU4oeCkJKCgoeCk+PjApJjB4MGYpCisJdTMyCXBpZHM7CisjZGVmaW5lIERCR1BfUElEX0dFVCh4KQkJKCgoeCk+PjE2KSYweGZmKQorI2RlZmluZSBEQkdQX1BJRF9TRVQoZGF0YSwgdG9rKQkoKChkYXRhKTw8OCl8KHRvaykpCisJdTMyCWRhdGEwMzsKKwl1MzIJZGF0YTQ3OworCXUzMglhZGRyZXNzOworI2RlZmluZSBEQkdQX0VQQUREUihkZXYsIGVwKQkoKChkZXYpPDw4KXwoZXApKQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9FSENJX0RFRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCAzMDNkOTNmLi5kNGIwMzAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTkxMCw2ICs5MTAsOCBAQAogCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xID0gMCwKIAlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiA9IDEsCiAJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMgPSAyLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQUMgICAgID0gMywKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUMzICAgICA9IDQsCiB9OwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMikKIGVudW0gdjRsMl9tcGVnX2F1ZGlvX2wxX2JpdHJhdGUgewpAQCAtOTg4LDEyICs5OTAsMzYgQEAKIAlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2ID0gMSwKIH07CiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FBQ19CSVRSQVRFCQkoVjRMMl9DSURfTVBFR19CQVNFKzExMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19BQzNfQklUUkFURQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTEpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19hYzNfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80MEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDhLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzU2SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfODBLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzk2SyAgPSA2LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMTJLID0gNywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTI4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzE2MEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xOTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzIyNEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMjBLID0gMTMsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzM4NEsgPSAxNCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDQ4SyA9IDE1LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81MTJLID0gMTYsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzU3NksgPSAxNywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjQwSyA9IDE4LAorfTsKIAogLyogIE1QRUcgdmlkZW8gKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQogZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgewotCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgPSAwLAotCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIgPSAxLAorCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yICAgICA9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMgPSAyLAogfTsKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKIGVudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Z0X2tlcm4uaCBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCmluZGV4IDFjYmQwYTcuLjJmMTExMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCisrKyBiL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oCkBAIC05Niw3ICs5Niw3IEBACiB2b2lkIHJlc2V0X3ZjKHN0cnVjdCB2Y19kYXRhICp2Yyk7CiBleHRlcm4gaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LAogCQkJICAgICBpbnQgZGVmbHQpOwotaW50IHZ0eV9pbml0KHZvaWQpOworaW50IHZ0eV9pbml0KGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmNvbnNvbGVfZm9wcyk7CiAKIC8qCiAgKiB2Y19zY3JlZW4uYyBzaGFyZXMgdGhpcyB0ZW1wb3JhcnkgYnVmZmVyIHdpdGggdGhlIGNvbnNvbGUgd3JpdGUgY29kZSBzbyB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhaXQuaCBiL2luY2x1ZGUvbGludXgvd2FpdC5oCmluZGV4IDAwODExNDcuLmVmNjA5ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2FpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvd2FpdC5oCkBAIC0xMDgsMTUgKzEwOCw2IEBACiAJcmV0dXJuICFsaXN0X2VtcHR5KCZxLT50YXNrX2xpc3QpOwogfQogCi0vKgotICogVXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN5bmMgYW5kIGFzeW5jIGlvIHdhaXQgY29udGV4dDoKLSAqIHN5bmMgaS9vIHR5cGljYWxseSBzcGVjaWZpZXMgYSBOVUxMIHdhaXQgcXVldWUgZW50cnkgb3IgYSB3YWl0Ci0gKiBxdWV1ZSBlbnRyeSBib3VuZCB0byBhIHRhc2sgKGN1cnJlbnQgdGFzaykgdG8gd2FrZSB1cC4KLSAqIGFpbyBzcGVjaWZpZXMgYSB3YWl0IHF1ZXVlIGVudHJ5IHdpdGggYW4gYXN5bmMgbm90aWZpY2F0aW9uCi0gKiBjYWxsYmFjayByb3V0aW5lLCBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB0YXNrLgotICovCi0jZGVmaW5lIGlzX3N5bmNfd2FpdCh3YWl0KQkoISh3YWl0KSB8fCAoKHdhaXQpLT5wcml2YXRlKSkKLQogZXh0ZXJuIHZvaWQgYWRkX3dhaXRfcXVldWUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCk7CiBleHRlcm4gdm9pZCBhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCk7CiBleHRlcm4gdm9pZCByZW1vdmVfd2FpdF9xdWV1ZSh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd205N3h4X2JhdHQuaCBiL2luY2x1ZGUvbGludXgvd205N3h4X2JhdHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjgxZDFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC93bTk3eHhfYmF0dC5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX0xJTlVYX1dNOTdYWF9CQVRfSAorI2RlZmluZSBfTElOVVhfV005N1hYX0JBVF9ICisKKyNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KKworc3RydWN0IHdtOTd4eF9iYXR0X2luZm8geworCWludAliYXR0X2F1eDsKKwlpbnQJdGVtcF9hdXg7CisJaW50CWNoYXJnZV9ncGlvOworCWludAltaW5fdm9sdGFnZTsKKwlpbnQJbWF4X3ZvbHRhZ2U7CisJaW50CWJhdHRfZGl2OworCWludAliYXR0X211bHQ7CisJaW50CXRlbXBfZGl2OworCWludAl0ZW1wX211bHQ7CisJaW50CWJhdHRfdGVjaDsKKwljaGFyCSpiYXR0X25hbWU7Cit9OworCisjaWZkZWYgQ09ORklHX0JBVFRFUllfV005N1hYCit2b2lkIF9faW5pdCB3bTk3eHhfYmF0X3NldF9wZGF0YShzdHJ1Y3Qgd205N3h4X2JhdHRfaW5mbyAqZGF0YSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHdtOTd4eF9iYXRfc2V0X3BkYXRhKHN0cnVjdCB3bTk3eHhfYmF0dF9pbmZvICpkYXRhKSB7fQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94ZnJtLmggYi9pbmNsdWRlL2xpbnV4L3hmcm0uaAppbmRleCBmYjBjMjE1Li40YmMxZTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMjc5LDYgKzI3OSw3IEBACiAJWEZSTUFfUE9MSUNZX1RZUEUsCS8qIHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqLwogCVhGUk1BX01JR1JBVEUsCiAJWEZSTUFfQUxHX0FFQUQsCQkvKiBzdHJ1Y3QgeGZybV9hbGdvX2FlYWQgKi8KKwlYRlJNQV9LTUFERFJFU1MsICAgICAgICAvKiBzdHJ1Y3QgeGZybV91c2VyX2ttYWRkcmVzcyAqLwogCV9fWEZSTUFfTUFYCiAKICNkZWZpbmUgWEZSTUFfTUFYIChfX1hGUk1BX01BWCAtIDEpCkBAIC00MTUsNiArNDE2LDE1IEBACiAJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKIH07CiAKKy8qIFVzZWQgYnkgTUlHUkFURSB0byBwYXNzIGFkZHJlc3NlcyBJS0Ugc2hvdWxkIHVzZSB0byBwZXJmb3JtCisgKiBTQSBuZWdvdGlhdGlvbiB3aXRoIHRoZSBwZWVyICovCitzdHJ1Y3QgeGZybV91c2VyX2ttYWRkcmVzcyB7CisJeGZybV9hZGRyZXNzX3QgICAgICAgICAgICAgICAgICBsb2NhbDsKKwl4ZnJtX2FkZHJlc3NfdCAgICAgICAgICAgICAgICAgIHJlbW90ZTsKKwlfX3UzMgkJCQlyZXNlcnZlZDsKKwlfX3UxNgkJCQlmYW1pbHk7Cit9OworCiBzdHJ1Y3QgeGZybV91c2VyX21pZ3JhdGUgewogCXhmcm1fYWRkcmVzc190CQkJb2xkX2RhZGRyOwogCXhmcm1fYWRkcmVzc190CQkJb2xkX3NhZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tYXRoLWVtdS9vcC0yLmggYi9pbmNsdWRlL21hdGgtZW11L29wLTIuaAppbmRleCBlMTkzZmIwLi40ZjI2ZWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21hdGgtZW11L29wLTIuaAorKysgYi9pbmNsdWRlL21hdGgtZW11L29wLTIuaApAQCAtMjUsNyArMjUsNyBAQAogI2lmbmRlZiBfX01BVEhfRU1VX09QXzJfSF9fCiAjZGVmaW5lIF9fTUFUSF9FTVVfT1BfMl9IX18KIAotI2RlZmluZSBfRlBfRlJBQ19ERUNMXzIoWCkJX0ZQX1dfVFlQRSBYIyNfZjAsIFgjI19mMQorI2RlZmluZSBfRlBfRlJBQ19ERUNMXzIoWCkJX0ZQX1dfVFlQRSBYIyNfZjAgPSAwLCBYIyNfZjEgPSAwCiAjZGVmaW5lIF9GUF9GUkFDX0NPUFlfMihELFMpCShEIyNfZjAgPSBTIyNfZjAsIEQjI19mMSA9IFMjI19mMSkKICNkZWZpbmUgX0ZQX0ZSQUNfU0VUXzIoWCxJKQlfX0ZQX0ZSQUNfU0VUXzIoWCwgSSkKICNkZWZpbmUgX0ZQX0ZSQUNfSElHSF8yKFgpCShYIyNfZjEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21hdGgtZW11L29wLWNvbW1vbi5oIGIvaW5jbHVkZS9tYXRoLWVtdS9vcC1jb21tb24uaAppbmRleCBiYjQ2ZTc2Li5jYzFlYzM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21hdGgtZW11L29wLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWF0aC1lbXUvb3AtY29tbW9uLmgKQEAgLTczLDcgKzczLDcgQEAKIAlYIyNfYyA9IEZQX0NMU19OQU47CQkJCQkJXAogCS8qIENoZWNrIGZvciBzaWduYWxpbmcgTmFOICovCQkJCQlcCiAJaWYgKCEoX0ZQX0ZSQUNfSElHSF9SQVdfIyNmcyhYKSAmIF9GUF9RTkFOQklUXyMjZnMpKQkJXAotCSAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTlZBTElEKTsJCQkJXAorCSAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTlZBTElEIHwgRlBfRVhfSU5WQUxJRF9TTkFOKTsJCVwKICAgICAgIH0JCQkJCQkJCQlcCiAgICAgYnJlYWs7CQkJCQkJCQlcCiAgIH0JCQkJCQkJCQlcCkBAIC0zMjQsNyArMzI0LDcgQEAKIAlfRlBfRlJBQ19TRVRfIyN3YyhSLCBfRlBfTkFORlJBQ18jI2ZzKTsJCQkJICAgICBcCiAJUiMjX3MgPSBfRlBfTkFOU0lHTl8jI2ZzOwkJCQkJICAgICBcCiAJUiMjX2MgPSBGUF9DTFNfTkFOOwkJCQkJCSAgICAgXAotCUZQX1NFVF9FWENFUFRJT04oRlBfRVhfSU5WQUxJRCk7CQkJCSAgICAgXAorCUZQX1NFVF9FWENFUFRJT04oRlBfRVhfSU5WQUxJRCB8IEZQX0VYX0lOVkFMSURfSVNJKTsJCSAgICAgXAogCWJyZWFrOwkJCQkJCQkJICAgICBcCiAgICAgICB9CQkJCQkJCQkJICAgICBcCiAgICAgLyogRkFMTFRIUlUgKi8JCQkJCQkJICAgICBcCkBAIC00MzEsNyArNDMxLDcgQEAKICAgICBSIyNfcyA9IF9GUF9OQU5TSUdOXyMjZnM7CQkJCVwKICAgICBSIyNfYyA9IEZQX0NMU19OQU47CQkJCQlcCiAgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoUiwgX0ZQX05BTkZSQUNfIyNmcyk7CQlcCi0gICAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTlZBTElEKTsJCQlcCisgICAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTlZBTElEIHwgRlBfRVhfSU5WQUxJRF9JTVopO1wKICAgICBicmVhazsJCQkJCQlcCiAJCQkJCQkJXAogICBkZWZhdWx0OgkJCQkJCVwKQEAgLTQ5MCwxMSArNDkwLDE1IEBACiAgICAgYnJlYWs7CQkJCQkJXAogCQkJCQkJCVwKICAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX0lORixGUF9DTFNfSU5GKToJCVwKKyAgICBSIyNfcyA9IF9GUF9OQU5TSUdOXyMjZnM7CQkJCVwKKyAgICBSIyNfYyA9IEZQX0NMU19OQU47CQkJCQlcCisgICAgX0ZQX0ZSQUNfU0VUXyMjd2MoUiwgX0ZQX05BTkZSQUNfIyNmcyk7CQlcCisgICAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTlZBTElEIHwgRlBfRVhfSU5WQUxJRF9JREkpO1wKICAgY2FzZSBfRlBfQ0xTX0NPTUJJTkUoRlBfQ0xTX1pFUk8sRlBfQ0xTX1pFUk8pOglcCiAgICAgUiMjX3MgPSBfRlBfTkFOU0lHTl8jI2ZzOwkJCQlcCiAgICAgUiMjX2MgPSBGUF9DTFNfTkFOOwkJCQkJXAogICAgIF9GUF9GUkFDX1NFVF8jI3djKFIsIF9GUF9OQU5GUkFDXyMjZnMpOwkJXAotICAgIEZQX1NFVF9FWENFUFRJT04oRlBfRVhfSU5WQUxJRCk7CQkJXAorICAgIEZQX1NFVF9FWENFUFRJT04oRlBfRVhfSU5WQUxJRCB8IEZQX0VYX0lOVkFMSURfWkRaKTtcCiAgICAgYnJlYWs7CQkJCQkJXAogCQkJCQkJCVwKICAgZGVmYXVsdDoJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL21hdGgtZW11L3NvZnQtZnAuaCBiL2luY2x1ZGUvbWF0aC1lbXUvc29mdC1mcC5oCmluZGV4IGE2Zjg3M2IuLjNmMjg0YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWF0aC1lbXUvc29mdC1mcC5oCisrKyBiL2luY2x1ZGUvbWF0aC1lbXUvc29mdC1mcC5oCkBAIC01MSw2ICs1MSwyNSBAQAogI2lmbmRlZiBGUF9FWF9JTlZBTElECiAjZGVmaW5lIEZQX0VYX0lOVkFMSUQJCTAKICNlbmRpZgorI2lmbmRlZiBGUF9FWF9JTlZBTElEX1NOQU4KKyNkZWZpbmUgRlBfRVhfSU5WQUxJRF9TTkFOCTAKKyNlbmRpZgorLyogaW5mIC0gaW5mICovCisjaWZuZGVmIEZQX0VYX0lOVkFMSURfSVNJCisjZGVmaW5lIEZQX0VYX0lOVkFMSURfSVNJCTAKKyNlbmRpZgorLyogaW5mIC8gaW5mICovCisjaWZuZGVmIEZQX0VYX0lOVkFMSURfSURJCisjZGVmaW5lIEZQX0VYX0lOVkFMSURfSURJCTAKKyNlbmRpZgorLyogMCAvIDAgKi8KKyNpZm5kZWYgRlBfRVhfSU5WQUxJRF9aRFoKKyNkZWZpbmUgRlBfRVhfSU5WQUxJRF9aRFoJMAorI2VuZGlmCisvKiBpbmYgKiAwICovCisjaWZuZGVmIEZQX0VYX0lOVkFMSURfSU1aCisjZGVmaW5lIEZQX0VYX0lOVkFMSURfSU1aCTAKKyNlbmRpZgogI2lmbmRlZiBGUF9FWF9PVkVSRkxPVwogI2RlZmluZSBGUF9FWF9PVkVSRkxPVwkJMAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaAppbmRleCBiOGU4YWE5Li4zOGYyZDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNkZWZpbmUgSVJfVFlQRV9SQzUgICAgIDEKICNkZWZpbmUgSVJfVFlQRV9QRCAgICAgIDIgLyogUHVsc2UgZGlzdGFuY2UgZW5jb2RlZCBJUiAqLwpAQCAtODUsNiArODYsMTAgQEAKIAl1MzIgY29kZTsJCQkvKiByYXcgY29kZSB1bmRlciBjb25zdHJ1Y3Rpb24gKi8KIAlzdHJ1Y3QgdGltZXZhbCBiYXNlX3RpbWU7CS8qIHRpbWUgb2YgbGFzdCBzZWVuIGNvZGUgKi8KIAlpbnQgYWN0aXZlOwkJCS8qIGJ1aWxkaW5nIHJhdyBjb2RlICovCisKKwkvKiBORUMgZGVjb2RpbmcgKi8KKwl1MzIJCQluZWNfZ3BpbzsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICB0bGV0OwogfTsKIAogdm9pZCBpcl9pbnB1dF9pbml0KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgc3RydWN0IGlyX2lucHV0X3N0YXRlICppciwKQEAgLTEwNSw2ICsxMTAsNyBAQAogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2VtcHR5W0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVybWVkaWFbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJtZWRpYV9kdmJ0W0lSX0tFWVRBQl9TSVpFXTsKK2V4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hdmVybWVkaWFfbTEzNWFbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2FwYWNfdmlld2NvbXBbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3BpeGVsdmlld1tJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGl4ZWx2aWV3X25ld1tJUl9LRVlUQUJfU0laRV07CkBAIC0xMzksNiArMTQ1LDcgQEAKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19idWRnZXRfY2lfb2xkW0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19hc3VzX3BjMzlbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2VuY29yZV9lbmx0dltJUl9LRVlUQUJfU0laRV07CitleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW5jb3JlX2VubHR2MltJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfdHRfMTUwMFtJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZnVzaW9uaGR0dl9tY2VbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2JlaG9sZFtJUl9LRVlUQUJfU0laRV07CkBAIC0xNDcsNyArMTU0LDkgQEAKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19nZW5pdXNfdHZnb19hMTFtY2VbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bvd2VyY29sb3JfcmVhbF9hbmdlbFtJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYXZlcm1lZGlhX2ExNmRbSVJfS0VZVEFCX1NJWkVdOwotCitleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW5jb3JlX2VubHR2X2ZtNTNbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3JlYWxfYXVkaW9fMjIwXzMyX2tleXNbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX21zaV90dmFueXdoZXJlX3BsdXNbSVJfS0VZVEFCX1NJWkVdOwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NhYTcxMTUuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNzExNS5oCmluZGV4IGY2NzdkZmIuLmJhYjIxMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNzExNS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2FhNzExNS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICBzYWE3MTE1LmggLSBkZWZpbml0aW9uIGZvciBzYWE3MTEzLzQvNSBpbnB1dHMgYW5kIGZyZXF1ZW5jeSBmbGFncworICAgIHNhYTcxMTUuaCAtIGRlZmluaXRpb24gZm9yIHNhYTcxMTEvMy80LzUgaW5wdXRzIGFuZCBmcmVxdWVuY3kgZmxhZ3MKIAogICAgIENvcHlyaWdodCAoQykgMjAwNiBIYW5zIFZlcmt1aWwgKGh2ZXJrdWlsQHhzNGFsbC5ubCkKIApAQCAtMjEsMTMgKzIxLDEzIEBACiAjaWZuZGVmIF9TQUE3MTE1X0hfCiAjZGVmaW5lIF9TQUE3MTE1X0hfCiAKLS8qIFNBQTcxMTMvNC81IEhXIGlucHV0cyAqLworLyogU0FBNzExMS8zLzQvNSBIVyBpbnB1dHMgKi8KICNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEUwIDAKICNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEUxIDEKICNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEUyIDIKICNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEUzIDMKLSNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEU0IDQgLyogbm90IGF2YWlsYWJsZSBmb3IgdGhlIHNhYTcxMTMgKi8KLSNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEU1IDUgLyogbm90IGF2YWlsYWJsZSBmb3IgdGhlIHNhYTcxMTMgKi8KKyNkZWZpbmUgU0FBNzExNV9DT01QT1NJVEU0IDQgLyogbm90IGF2YWlsYWJsZSBmb3IgdGhlIHNhYTcxMTEvMyAqLworI2RlZmluZSBTQUE3MTE1X0NPTVBPU0lURTUgNSAvKiBub3QgYXZhaWxhYmxlIGZvciB0aGUgc2FhNzExMS8zICovCiAjZGVmaW5lIFNBQTcxMTVfU1ZJREVPMCAgICA2CiAjZGVmaW5lIFNBQTcxMTVfU1ZJREVPMSAgICA3CiAjZGVmaW5lIFNBQTcxMTVfU1ZJREVPMiAgICA4CkBAIC00Miw4ICs0MiwxNSBAQAogI2RlZmluZSBTQUE3MTE1X0ZSRVFfRkxfQ0dDRElWICgxIDw8IDEpCSAgIC8qIFNBIDNBWzZdLCBDR0NESVYsIFNBQTcxMTUgb25seSAqLwogI2RlZmluZSBTQUE3MTE1X0ZSRVFfRkxfQVBMTCAgICgxIDw8IDIpCSAgIC8qIFNBIDNBWzNdLCBBUExMLCBTQUE3MTE0LzUgb25seSAqLwogCi0jZGVmaW5lIFNBQTcxMTVfSVBPUlRfT04gICAgMQotI2RlZmluZSBTQUE3MTE1X0lQT1JUX09GRiAgIDAKKyNkZWZpbmUgU0FBNzExNV9JUE9SVF9PTiAgICAJMQorI2RlZmluZSBTQUE3MTE1X0lQT1JUX09GRiAgIAkwCisKKy8qIFNBQTcxMTEgc3BlY2lmaWMgb3V0cHV0IGZsYWdzICovCisjZGVmaW5lIFNBQTcxMTFfVkJJX0JZUEFTUyAJMgorI2RlZmluZSBTQUE3MTExX0ZNVF9ZVVY0MjIgICAgICAweDAwCisjZGVmaW5lIFNBQTcxMTFfRk1UX1JHQiAJMHg0MAorI2RlZmluZSBTQUE3MTExX0ZNVF9DQ0lSIAkweDgwCisjZGVmaW5lIFNBQTcxMTFfRk1UX1lVVjQxMSAJMHhjMAogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAppbmRleCAyZjY4ZjRjLi5jNWE2ZTIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaApAQCAtMjQsMTMgKzI0LDEzIEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2FhNzE0Nl9kZWJ1ZzsKIAotLy8jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIigweCUwOHgpKDB4JTA4eCkgJXM6ICVzKCk6ICIsKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixSUFNfQUREUjApKSksKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixJRVIpKSksS0JVSUxEX01PRE5BTUUsX19GVU5DVElPTl9fKQorLy8jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIigweCUwOHgpKDB4JTA4eCkgJXM6ICVzKCk6ICIsKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixSUFNfQUREUjApKSksKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixJRVIpKSksS0JVSUxEX01PRE5BTUUsX19mdW5jX18pCiAKICNpZm5kZWYgREVCVUdfVkFSSUFCTEUKIAkjZGVmaW5lIERFQlVHX1ZBUklBQkxFIHNhYTcxNDZfZGVidWcKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIiVzOiAlcygpOiAiLEtCVUlMRF9NT0ROQU1FLF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgREVCVUdfUFJPTE9HIHByaW50aygiJXM6ICVzKCk6ICIsS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fKQogI2RlZmluZSBJTkZPKHgpIHsgcHJpbnRrKCIlczogIixLQlVJTERfTU9ETkFNRSk7IHByaW50ayB4OyB9CiAKICNkZWZpbmUgRVJSKHgpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmggYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAppbmRleCAyMzRhNDcxLi5iNWRiZWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAorKysgYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaApAQCAtNSw4ICs1LDYgQEAKIAogc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsgLyogU09DQU1fLi4uICovCi0Jdm9pZCAoKmVuYWJsZV9jYW1lcmEpKHZvaWQpOwotCXZvaWQgKCpkaXNhYmxlX2NhbWVyYSkodm9pZCk7CiB9OwogCiAjZW5kaWYgLyogX19BU01fU0hfTU9CSUxFX0NFVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKaW5kZXggZDU0OGRlMy4uYzVkZTdiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKQEAgLTgzLDYgKzgzLDkgQEAKIAlpbnQgYnVzX2lkOwogCS8qIEdQSU8gbnVtYmVyIHRvIHN3aXRjaCBiZXR3ZWVuIDggYW5kIDEwIGJpdCBtb2RlcyAqLwogCXVuc2lnbmVkIGludCBncGlvOworCS8qIE9wdGlvbmFsIGNhbGxiYWNrcyB0byBwb3dlciBvbiBvciBvZmYgYW5kIHJlc2V0IHRoZSBzZW5zb3IgKi8KKwlpbnQgKCpwb3dlcikoc3RydWN0IGRldmljZSAqLCBpbnQpOworCWludCAoKnJlc2V0KShzdHJ1Y3QgZGV2aWNlICopOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnRvX3NvY19jYW1lcmFfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAppbmRleCA3NzA2OGZjLi42N2MxZjUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3R1bmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICNkZWZpbmUgVFVORVJfVERBOTg4NyAgICAgICAgICAgICAgICAgICA3NCAgICAgIC8qIFRoaXMgdHVuZXIgc2hvdWxkIGJlIHVzZWQgb25seSBpbnRlcm5hbGx5ICovCiAjZGVmaW5lIFRVTkVSX1RFQTU3NjEJCQk3NQkvKiBPbmx5IEZNIFJhZGlvIFR1bmVyICovCiAjZGVmaW5lIFRVTkVSX1hDNTAwMAkJCTc2CS8qIFhjZWl2ZSBTaWxpY29uIFR1bmVyICovCisjZGVmaW5lIFRVTkVSX1RDTF9NRjAyR0lQXzVOCQk3NwkvKiBUQ0wgTUYwMkdJUF81TiAqLwogCiAvKiB0diBjYXJkIHNwZWNpZmljICovCiAjZGVmaW5lIFREQTk4ODdfUFJFU0VOVCAJCSgxPDwwKQpAQCAtMTc4LDcgKzE3OSw3IEBACiAJdW5zaWduZWQgaW50CXR5cGU7ICAgLyogVHVuZXIgdHlwZSAqLwogCXVuc2lnbmVkIGludAltb2RlX21hc2s7ICAvKiBBbGxvd2VkIHR1bmVyIG1vZGVzICovCiAJdW5zaWduZWQgaW50CWNvbmZpZzsgLyogY29uZmlndXJhaW9uIGZvciBtb3JlIGNvbXBsZXggdHVuZXJzICovCi0JaW50ICgqdHVuZXJfY2FsbGJhY2spICh2b2lkICpkZXYsIGludCBjb21tYW5kLGludCBhcmcpOworCWludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tcG9uZW50LCBpbnQgY21kLCBpbnQgYXJnKTsKIH07CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAppbmRleCA0MWI1MDliLi5kNzNhOGU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKQEAgLTcyLDYgKzcyLDEwIEBACiAJLyogbW9kdWxlIGNzNTM0NToganVzdCBpZGVudCA1MzQ1ICovCiAJVjRMMl9JREVOVF9DUzUzNDUgPSA1MzQ1LAogCisJLyogbW9kdWxlIHNhYTY3NTJoczogcmVzZXJ2ZWQgcmFuZ2UgNjc1MC02NzU5ICovCisJVjRMMl9JREVOVF9TQUE2NzUySFMgPSA2NzUyLAorCVY0TDJfSURFTlRfU0FBNjc1MkhTX0FDMyA9IDY3NTMsCisKIAkvKiBtb2R1bGUgd204NzM5OiBqdXN0IGlkZW50IDg3MzkgKi8KIAlWNEwyX0lERU5UX1dNODczOSA9IDg3MzksCiAKQEAgLTE2MSw2ICsxNjUsNyBAQAogCS8qIE1pY3JvbiBDTU9TIHNlbnNvciBjaGlwczogNDUwMDAtNDUwOTkgKi8KIAlWNEwyX0lERU5UX01UOU0wMDFDMTJTVAkJPSA0NTAwMCwKIAlWNEwyX0lERU5UX01UOU0wMDFDMTJTVE0JPSA0NTAwNSwKKwlWNEwyX0lERU5UX01UOU0xMTEJCT0gNDUwMDcsCiAJVjRMMl9JREVOVF9NVDlWMDIySVg3QVRDCT0gNDUwMTAsIC8qIE5vIHdheSB0byBkZXRlY3QgIm5vcm1hbCIgSTc3QVR4ICovCiAJVjRMMl9JREVOVF9NVDlWMDIySVg3QVRNCT0gNDUwMTUsIC8qIGFuZCAibGVhZCBmcmVlIiBJQTdBVHggY2hpcHMgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKaW5kZXggMDdkM2E5YS4uMmY4NzE5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaApAQCAtNzYsMTEgKzc2LDE0IEBACiAKIGludCB2NGwyX2N0cmxfY2hlY2soc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCiAJCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKTsKK2NvbnN0IGNoYXIgKnY0bDJfY3RybF9nZXRfbmFtZSh1MzIgaWQpOwogY29uc3QgY2hhciAqKnY0bDJfY3RybF9nZXRfbWVudSh1MzIgaWQpOwogaW50IHY0bDJfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKTsKIGludCB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCk7CiBpbnQgdjRsMl9jdHJsX3F1ZXJ5X21lbnUoc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbWVudSwKIAkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCwgY29uc3QgY2hhciAqKm1lbnVfaXRlbXMpOworI2RlZmluZSBWNEwyX0NUUkxfTUVOVV9JRFNfRU5EICgweGZmZmZmZmZmKQoraW50IHY0bDJfY3RybF9xdWVyeV9tZW51X3ZhbGlkX2l0ZW1zKHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIGNvbnN0IHUzMiAqaWRzKTsKIHUzMiB2NGwyX2N0cmxfbmV4dChjb25zdCB1MzIgKiBjb25zdCAqY3RybF9jbGFzc2VzLCB1MzIgaWQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjIsMTggKzIyNSwyMiBAQAogICAgQW4gZXh0cmEgZmxhZ3MgZmllbGQgYWxsb3dzIGRldmljZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHJlZ2FyZGluZwogICAgY2xvY2sgZnJlcXVlbmN5IGRpdmlkZXJzLCBldGMuIElmIG5vdCB1c2VkLCB0aGVuIHNldCBmbGFncyB0byAwLgogICAgSWYgdGhlIGZyZXF1ZW5jeSBpcyBub3Qgc3VwcG9ydGVkLCB0aGVuIC1FSU5WQUwgaXMgcmV0dXJuZWQuICovCi0jZGVmaW5lIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEgCV9JT1cgKCdkJywgMTEzLCBzdHJ1Y3QgdjRsMl9jcnlzdGFsX2ZyZXEpCisjZGVmaW5lIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEgCV9JT1coJ2QnLCAxMTMsIHN0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSkKIAogLyogSW5pdGlhbGl6ZSB0aGUgc2Vuc29yIHJlZ2lzdG9ycyB0byBzb21lIHNvcnQgb2YgcmVhc29uYWJsZQogICAgZGVmYXVsdCB2YWx1ZXMuICovCi0jZGVmaW5lIFZJRElPQ19JTlRfSU5JVAkJCV9JT1cgKCdkJywgMTE0LCB1MzIpCisjZGVmaW5lIFZJRElPQ19JTlRfSU5JVAkJCV9JT1coJ2QnLCAxMTQsIHUzMikKIAogLyogU2V0IHY0bDJfc3RkX2lkIGZvciB2aWRlbyBPVVRQVVQgZGV2aWNlcy4gVGhpcyBpcyBpZ25vcmVkIGJ5CiAgICB2aWRlbyBpbnB1dCBkZXZpY2VzLiAqLwotI2RlZmluZSBWSURJT0NfSU5UX1NfU1REX09VVFBVVAkJX0lPVyAgKCdkJywgMTE1LCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX0lOVF9TX1NURF9PVVRQVVQJCV9JT1coJ2QnLCAxMTUsIHY0bDJfc3RkX2lkKQogCiAvKiBHZXQgdjRsMl9zdGRfaWQgZm9yIHZpZGVvIE9VVFBVVCBkZXZpY2VzLiBUaGlzIGlzIGlnbm9yZWQgYnkKICAgIHZpZGVvIGlucHV0IGRldmljZXMuICovCi0jZGVmaW5lIFZJRElPQ19JTlRfR19TVERfT1VUUFVUCQlfSU9XICAoJ2QnLCAxMTYsIHY0bDJfc3RkX2lkKQorI2RlZmluZSBWSURJT0NfSU5UX0dfU1REX09VVFBVVAkJX0lPVygnZCcsIDExNiwgdjRsMl9zdGRfaWQpCisKKy8qIFNldCBHUElPIHBpbnMuIFZlcnkgc2ltcGxlIHJpZ2h0IG5vdywgbWlnaHQgbmVlZCB0byBiZSBleHRlbmRlZCB3aXRoCisgICBhIHY0bDJfZ3BpbyBzdHJ1Y3QgaWYgYSBkaXJlY3Rpb24gaXMgYWxzbyBuZWVkZWQuICovCisjZGVmaW5lIFZJRElPQ19JTlRfU19HUElPCQlfSU9XKCdkJywgMTE3LCB1MzIpCiAKICNlbmRpZiAvKiBWNEwyX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCmluZGV4IDI3NDVlMWEuLmEwYTZiNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKQEAgLTksMzAgKzksMjAgQEAKICNpZm5kZWYgX1Y0TDJfREVWX0gKICNkZWZpbmUgX1Y0TDJfREVWX0gKIAotI2RlZmluZSBPQlNPTEVURV9ERVZEQVRBIDEgLyogdG8gYmUgcmVtb3ZlZCBzb29uICovCi0KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPiAvKiBuZWVkIF9fdXNlciAqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjZGVmaW5lIFZJREVPX01BSk9SCTgxCi0vKiBNaW5vciBkZXZpY2UgYWxsb2NhdGlvbiAqLwotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9HUkFCQkVSX01JTiAgIDAKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NQVggIDYzCi0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1JBRElPX01JTiAgICA2NAotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9SQURJT19NQVggICAxMjcKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVlRYX01JTiAgICAgMTkyCi0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZUWF9NQVggICAgIDIyMwotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WQklfTUlOICAgICAyMjQKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVkJJX01BWCAgICAgMjU1CiAKICNkZWZpbmUgVkZMX1RZUEVfR1JBQkJFUgkwCiAjZGVmaW5lIFZGTF9UWVBFX1ZCSQkJMQogI2RlZmluZSBWRkxfVFlQRV9SQURJTwkJMgogI2RlZmluZSBWRkxfVFlQRV9WVFgJCTMKKyNkZWZpbmUgVkZMX1RZUEVfTUFYCQk0CiAKIHN0cnVjdCB2NGwyX2lvY3RsX2NhbGxiYWNrczsKIApAQCAtNDksMTIgKzM5LDE1IEBACiAKIAkvKiBzeXNmcyAqLwogCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogdjRsIGRldmljZSAqLworCXN0cnVjdCBjZGV2IGNkZXY7CQkvKiBjaGFyYWN0ZXIgZGV2aWNlICovCisJdm9pZCAoKmNkZXZfcmVsZWFzZSkoc3RydWN0IGtvYmplY3QgKmtvYmopOwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsJCS8qIGRldmljZSBwYXJlbnQgKi8KIAogCS8qIGRldmljZSBpbmZvICovCiAJY2hhciBuYW1lWzMyXTsKIAlpbnQgdmZsX3R5cGU7CiAJaW50IG1pbm9yOworCXUxNiBudW07CiAJLyogYXR0cmlidXRlIHRvIGRpZmZlcmVudGlhdGUgbXVsdGlwbGUgaW5kaWNlcyBvbiBvbmUgcGh5c2ljYWwgZGV2aWNlICovCiAJaW50IGluZGV4OwogCkBAIC02OSw1MCArNjIsNTAgQEAKIAogCS8qIGlvY3RsIGNhbGxiYWNrcyAqLwogCWNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyAqaW9jdGxfb3BzOwotCi0jaWZkZWYgT0JTT0xFVEVfREVWREFUQSAvKiB0byBiZSByZW1vdmVkIHNvb24gKi8KLQkvKiBkZXYtPmRyaXZlcl9kYXRhIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIHNvbWUgZGF5LgotCSAqIFVzZSB0aGUgdmlkZW9fe2dldHxzZXR9X2RydmRhdGEoKSBoZWxwZXIgZnVuY3Rpb25zLAotCSAqIHNvIHRoZSBzd2l0Y2ggb3ZlciB3aWxsIGJlIHRyYW5zcGFyZW50IGZvciB5b3UuCi0JICogT3IgdXNlIHtwY2l8dXNifV97Z2V0fHNldH1fZHJ2ZGF0YSgpIGRpcmVjdGx5LiAqLwotCXZvaWQgKnByaXY7Ci0jZW5kaWYKLQotCS8qIGZvciB2aWRlb2Rldi5jIGludGVybmFsIHVzYWdlIC0tIHBsZWFzZSBkb24ndCB0b3VjaCAqLwotCWludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlb19leGNsdXNpdmVfe29wZW58Y2xvc2V9IC4uLiAqLwotCXN0cnVjdCBtdXRleCBsb2NrOyAgICAgICAgICAgICAvKiAuLi4gaGVscGVyIGZ1bmN0aW9uIHVzZXMgdGhlc2UgICAqLwogfTsKIAotLyogQ2xhc3MtZGV2IHRvIHZpZGVvLWRldmljZSAqLworLyogZGV2IHRvIHZpZGVvLWRldmljZSAqLwogI2RlZmluZSB0b192aWRlb19kZXZpY2UoY2QpIGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgZGV2KQogCi0vKiBWZXJzaW9uIDIgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsIGludCB0eXBlLCBpbnQgbnIpOwotaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZV9pbmRleChzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsIGludCB0eXBlLCBpbnQgbnIsCi0JCQkJCWludCBpbmRleCk7Ci12b2lkIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKik7CisvKiBSZWdpc3RlciBhbmQgdW5yZWdpc3RlciBkZXZpY2VzLiBOb3RlIHRoYXQgaWYgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxzLAorICAgdGhlIHJlbGVhc2UoKSBjYWxsYmFjayBvZiB0aGUgdmlkZW9fZGV2aWNlIHN0cnVjdHVyZSBpcyAqbm90KiBjYWxsZWQsIHNvCisgICB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGFueSBkYXRhLiBVc3VhbGx5IHRoYXQgbWVhbnMgdGhhdAorICAgeW91IGNhbGwgdmlkZW9fZGV2aWNlX3JlbGVhc2UoKSBvbiBmYWlsdXJlLiAqLworaW50IF9fbXVzdF9jaGVjayB2aWRlb19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLCBpbnQgdHlwZSwgaW50IG5yKTsKK2ludCBfX211c3RfY2hlY2sgdmlkZW9fcmVnaXN0ZXJfZGV2aWNlX2luZGV4KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwKKwkJCQkJCWludCB0eXBlLCBpbnQgbnIsIGludCBpbmRleCk7Cit2b2lkIHZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CiAKLS8qIGhlbHBlciBmdW5jdGlvbnMgdG8gYWxsb2MgLyByZWxlYXNlIHN0cnVjdCB2aWRlb19kZXZpY2UsIHRoZQotICAgbGF0ZXIgY2FuIGJlIHVzZWQgZm9yIHZpZGVvX2RldmljZS0+cmVsZWFzZSgpICovCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlICp2aWRlb19kZXZpY2VfYWxsb2Modm9pZCk7CisvKiBoZWxwZXIgZnVuY3Rpb25zIHRvIGFsbG9jL3JlbGVhc2Ugc3RydWN0IHZpZGVvX2RldmljZSwgdGhlCisgICBsYXR0ZXIgY2FuIGFsc28gYmUgdXNlZCBmb3IgdmlkZW9fZGV2aWNlLT5yZWxlYXNlKCkuICovCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICogX19tdXN0X2NoZWNrIHZpZGVvX2RldmljZV9hbGxvYyh2b2lkKTsKKworLyogdGhpcyByZWxlYXNlIGZ1bmN0aW9uIGZyZWVzIHRoZSB2ZmQgcG9pbnRlciAqLwogdm9pZCB2aWRlb19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpOwogCi0jaWZkZWYgT0JTT0xFVEVfREVWREFUQSAvKiB0byBiZSByZW1vdmVkIHNvb24gKi8KKy8qIHRoaXMgcmVsZWFzZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHVzZSB3aGVuIHRoZSB2aWRlb19kZXZpY2UgaXMgYQorICAgc3RhdGljIGdsb2JhbCBzdHJ1Y3QuIE5vdGUgdGhhdCBoYXZpbmcgYSBzdGF0aWMgdmlkZW9fZGV2aWNlIGlzCisgICBhIGR1YmlvdXMgY29uc3RydWN0aW9uIGF0IGJlc3QuICovCit2b2lkIHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7CisKIC8qIGhlbHBlciBmdW5jdGlvbnMgdG8gYWNjZXNzIGRyaXZlciBwcml2YXRlIGRhdGEuICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKnZpZGVvX2dldF9kcnZkYXRhKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gZGV2LT5wcml2OworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHZpZGVvX3NldF9kcnZkYXRhKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlkZXYtPnByaXYgPSBkYXRhOworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGRhdGEpOwogfQogCi0vKiBPYnNvbGV0ZSBzdHVmZiAtIFN0aWxsIG5lZWRlZCBmb3IgcmFkaW8gZGV2aWNlcyBhbmQgb2Jzb2xldGUgZHJpdmVycyAqLwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UqIHZpZGVvX2RldmRhdGEoc3RydWN0IGZpbGUqKTsKLWV4dGVybiBpbnQgdmlkZW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotZXh0ZXJuIGludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci0jZW5kaWYKK3N0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldmRhdGEoc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiBDb21iaW5lIHZpZGVvX2dldF9kcnZkYXRhIGFuZCB2aWRlb19kZXZkYXRhIGFzIHRoaXMgaXMKKyAgIHVzZWQgdmVyeSBvZnRlbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqdmlkZW9fZHJ2ZGF0YShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Cit9CiAKICNlbmRpZiAvKiBfVjRMMl9ERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAppbmRleCBkYzY0MDQ2Li4wYmVmMDNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaApAQCAtMzksMTEgKzM5LDYgQEAKIAkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwogCWludCAoKnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0KSAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwotI2lmIDEKLQkvKiBkZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gMi42LjI4ICovCi0JaW50ICgqdmlkaW9jX2VudW1fZm10X3ZiaV9jYXApICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZik7Ci0jZW5kaWYKIAlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvOXAvOXAuaCBiL2luY2x1ZGUvbmV0LzlwLzlwLmgKaW5kZXggYjNkM2UyNy4uZmIxNjNlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvOXAvOXAuaAorKysgYi9pbmNsdWRlL25ldC85cC85cC5oCkBAIC02MSw3ICs2MSw3IEBACiBkbyB7ICBcCiAJaWYgKChwOV9kZWJ1Z19sZXZlbCAmIGxldmVsKSA9PSBsZXZlbCkgXAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIi0tICVzICglZCk6ICIgXAotCQlmb3JtYXQgLCBfX0ZVTkNUSU9OX18sIHRhc2tfcGlkX25yKGN1cnJlbnQpICwgIyMgYXJnKTsgXAorCQlmb3JtYXQgLCBfX2Z1bmNfXywgdGFza19waWRfbnIoY3VycmVudCkgLCAjIyBhcmcpOyBcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFBSSU5UX0ZDQUxMX0VSUk9SKHMsIGZjYWxsKSBQOV9EUFJJTlRLKFA5X0RFQlVHX0VSUk9SLCAgIFwKQEAgLTc2LDcgKzc2LDcgQEAKICNkZWZpbmUgUDlfRVBSSU5USyhsZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKIGRvIHsgXAogCXByaW50ayhsZXZlbCAiOXA6ICVzICglZCk6ICIgXAotCQlmb3JtYXQgLCBfX0ZVTkNUSU9OX18sIHRhc2tfcGlkX25yKGN1cnJlbnQpLCAjIyBhcmcpOyBcCisJCWZvcm1hdCAsIF9fZnVuY19fLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgIyMgYXJnKTsgXAogfSB3aGlsZSAoMCkKIAogLyoqCkBAIC01OTYsNCArNTk2LDUgQEAKIGludCBwOV9lcnJvcl9pbml0KHZvaWQpOwogaW50IHA5X2VycnN0cjJlcnJubyhjaGFyICosIGludCk7CiBpbnQgcDlfdHJhbnNfZmRfaW5pdCh2b2lkKTsKK3ZvaWQgcDlfdHJhbnNfZmRfZXhpdCh2b2lkKTsKICNlbmRpZiAvKiBORVRfOVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvOXAvdHJhbnNwb3J0LmggYi9pbmNsdWRlL25ldC85cC90cmFuc3BvcnQuaAppbmRleCAwZGIzYTQwLi4zY2E3MzcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC85cC90cmFuc3BvcnQuaAorKysgYi9pbmNsdWRlL25ldC85cC90cmFuc3BvcnQuaApAQCAtMjYsNiArMjYsOCBAQAogI2lmbmRlZiBORVRfOVBfVFJBTlNQT1JUX0gKICNkZWZpbmUgTkVUXzlQX1RSQU5TUE9SVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogLyoqCiAgKiBlbnVtIHA5X3RyYW5zX3N0YXR1cyAtIGRpZmZlcmVudCBzdGF0ZXMgb2YgdW5kZXJseWluZyB0cmFuc3BvcnRzCiAgKiBAQ29ubmVjdGVkOiB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCBoZWFsdGh5CkBAIC05MSw5ICs5MywxMiBAQAogCWludCBtYXhzaXplOwkJLyogbWF4IG1lc3NhZ2Ugc2l6ZSBvZiB0cmFuc3BvcnQgKi8KIAlpbnQgZGVmOwkJLyogdGhpcyB0cmFuc3BvcnQgc2hvdWxkIGJlIGRlZmF1bHQgKi8KIAlzdHJ1Y3QgcDlfdHJhbnMgKiAoKmNyZWF0ZSkoY29uc3QgY2hhciAqLCBjaGFyICosIGludCwgdW5zaWduZWQgY2hhcik7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCiB2b2lkIHY5ZnNfcmVnaXN0ZXJfdHJhbnMoc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqbSk7Ci1zdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX21hdGNoX3RyYW5zKGNvbnN0IHN1YnN0cmluZ190ICpuYW1lKTsKLXN0cnVjdCBwOV90cmFuc19tb2R1bGUgKnY5ZnNfZGVmYXVsdF90cmFucyh2b2lkKTsKK3ZvaWQgdjlmc191bnJlZ2lzdGVyX3RyYW5zKHN0cnVjdCBwOV90cmFuc19tb2R1bGUgKm0pOworc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqdjlmc19nZXRfdHJhbnNfYnlfbmFtZShjb25zdCBzdWJzdHJpbmdfdCAqbmFtZSk7CitzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX2dldF9kZWZhdWx0X3RyYW5zKHZvaWQpOwordm9pZCB2OWZzX3B1dF90cmFucyhzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICptKTsKICNlbmRpZiAvKiBORVRfOVBfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAppbmRleCA2Zjg0MThiLi45OTZkMTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCkBAIC01NCw4ICs1NCw4IEBACiAjZGVmaW5lIFNPTF9SRkNPTU0JMTgKIAogI2RlZmluZSBCVF9JTkZPKGZtdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICJCbHVldG9vdGg6ICIgZm10ICJcbiIgLCAjIyBhcmcpCi0jZGVmaW5lIEJUX0RCRyhmbXQsIGFyZy4uLikgIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJnKQotI2RlZmluZSBCVF9FUlIoZm10LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICIlczogIiBmbXQgIlxuIiAsIF9fRlVOQ1RJT05fXyAsICMjIGFyZykKKyNkZWZpbmUgQlRfREJHKGZtdCwgYXJnLi4uKSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm10ICJcbiIgLCBfX2Z1bmNfXyAsICMjIGFyZykKKyNkZWZpbmUgQlRfRVJSKGZtdCwgYXJnLi4uKSAgcHJpbnRrKEtFUk5fRVJSICAiJXM6ICIgZm10ICJcbiIgLCBfX2Z1bmNfXyAsICMjIGFyZykKIAogLyogQ29ubmVjdGlvbiBhbmQgc29ja2V0IHN0YXRlcyAqLwogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCmluZGV4IGNiZjc1MTAuLjQ2YTQzYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCkBAIC0zMjUsNyArMzI1LDggQEAKIHZvaWQgaGNpX2Nvbm5faGFzaF9mbHVzaChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIGhjaV9jb25uX2NoZWNrX3BlbmRpbmcoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogCi1zdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKnNyYyk7CitzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCwgX191OCBhdXRoX3R5cGUpOworaW50IGhjaV9jb25uX2NoZWNrX2xpbmtfbW9kZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogaW50IGhjaV9jb25uX2F1dGgoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIGludCBoY2lfY29ubl9lbmNyeXB0KHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiBpbnQgaGNpX2Nvbm5fY2hhbmdlX2xpbmtfa2V5KHN0cnVjdCBoY2lfY29ubiAqY29ubik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCBlMDA3NTA4Li4wZTg1ZWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTE1Miw2ICsxNTIsNyBAQAogCXUxNiBhaWQ7CiAJdTggc3VwcG9ydGVkX3JhdGVzX2xlbjsKIAl1OCBwbGlua19hY3Rpb247CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGE7CiB9OwogCiAvKioKQEAgLTI2OCw2ICsyNjksODMgQEAKIAl1OCBmbGFnczsKIH07CiAKKy8qKgorICogc3RydWN0IGJzc19wYXJhbWV0ZXJzIC0gQlNTIHBhcmFtZXRlcnMKKyAqCisgKiBVc2VkIHRvIGNoYW5nZSBCU1MgcGFyYW1ldGVycyAobWFpbmx5IGZvciBBUCBtb2RlKS4KKyAqCisgKiBAdXNlX2N0c19wcm90OiBXaGV0aGVyIHRvIHVzZSBDVFMgcHJvdGVjdGlvbgorICoJKDAgPSBubywgMSA9IHllcywgLTEgPSBkbyBub3QgY2hhbmdlKQorICogQHVzZV9zaG9ydF9wcmVhbWJsZTogV2hldGhlciB0aGUgdXNlIG9mIHNob3J0IHByZWFtYmxlcyBpcyBhbGxvd2VkCisgKgkoMCA9IG5vLCAxID0geWVzLCAtMSA9IGRvIG5vdCBjaGFuZ2UpCisgKiBAdXNlX3Nob3J0X3Nsb3RfdGltZTogV2hldGhlciB0aGUgdXNlIG9mIHNob3J0IHNsb3QgdGltZSBpcyBhbGxvd2VkCisgKgkoMCA9IG5vLCAxID0geWVzLCAtMSA9IGRvIG5vdCBjaGFuZ2UpCisgKi8KK3N0cnVjdCBic3NfcGFyYW1ldGVycyB7CisJaW50IHVzZV9jdHNfcHJvdDsKKwlpbnQgdXNlX3Nob3J0X3ByZWFtYmxlOworCWludCB1c2Vfc2hvcnRfc2xvdF90aW1lOworfTsKKworLyoqCisgKiBlbnVtIHJlZ19zZXRfYnkgLSBJbmRpY2F0ZXMgd2hvIGlzIHRyeWluZyB0byBzZXQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluCisgKiBAUkVHRE9NX1NFVF9CWV9JTklUOiByZWd1bGF0b3J5IGRvbWFpbiB3YXMgc2V0IGJ5IGluaXRpYWxpemF0aW9uLiBXZSB3aWxsIGJlCisgKiAJdXNpbmcgYSBzdGF0aWMgd29ybGQgcmVndWxhdG9yeSBkb21haW4gYnkgZGVmYXVsdC4KKyAqIEBSRUdET01fU0VUX0JZX0NPUkU6IENvcmUgcXVlcmllZCBDUkRBIGZvciBhIGR5bmFtaWMgd29ybGQgcmVndWxhdG9yeSBkb21haW4uCisgKiBAUkVHRE9NX1NFVF9CWV9VU0VSOiBVc2VyIGFza2VkIHRoZSB3aXJlbGVzcyBjb3JlIHRvIHNldCB0aGUKKyAqIAlyZWd1bGF0b3J5IGRvbWFpbi4KKyAqIEBSRUdET01fU0VUX0JZX0RSSVZFUjogYSB3aXJlbGVzcyBkcml2ZXJzIGhhcyBoaW50ZWQgdG8gdGhlIHdpcmVsZXNzIGNvcmUKKyAqCWl0IHRoaW5rcyBpdHMga25vd3MgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHdlIHNob3VsZCBiZSBpbi4KKyAqIEBSRUdET01fU0VUX0JZX0NPVU5UUllfSUU6IHRoZSB3aXJlbGVzcyBjb3JlIGhhcyByZWNlaXZlZCBhbiA4MDIuMTEgY291bnRyeQorICoJaW5mb3JtYXRpb24gZWxlbWVudCB3aXRoIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaXQgdGhpbmtzIHdlCisgKglzaG91bGQgY29uc2lkZXIuCisgKi8KK2VudW0gcmVnX3NldF9ieSB7CisJUkVHRE9NX1NFVF9CWV9JTklULAorCVJFR0RPTV9TRVRfQllfQ09SRSwKKwlSRUdET01fU0VUX0JZX1VTRVIsCisJUkVHRE9NX1NFVF9CWV9EUklWRVIsCisJUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFLAorfTsKKworc3RydWN0IGllZWU4MDIxMV9mcmVxX3JhbmdlIHsKKwl1MzIgc3RhcnRfZnJlcV9raHo7CisJdTMyIGVuZF9mcmVxX2toejsKKwl1MzIgbWF4X2JhbmR3aWR0aF9raHo7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3Bvd2VyX3J1bGUgeworCXUzMiBtYXhfYW50ZW5uYV9nYWluOworCXUzMiBtYXhfZWlycDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgeworCXN0cnVjdCBpZWVlODAyMTFfZnJlcV9yYW5nZSBmcmVxX3JhbmdlOworCXN0cnVjdCBpZWVlODAyMTFfcG93ZXJfcnVsZSBwb3dlcl9ydWxlOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHsKKwl1MzIgbl9yZWdfcnVsZXM7CisJY2hhciBhbHBoYTJbMl07CisJc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSByZWdfcnVsZXNbXTsKK307CisKKyNkZWZpbmUgTUhaX1RPX0tIWihmcmVxKSAoZnJlcSAqIDEwMDApCisjZGVmaW5lIEtIWl9UT19NSFooZnJlcSkgKGZyZXEgLyAxMDAwKQorI2RlZmluZSBEQklfVE9fTUJJKGdhaW4pIChnYWluICogMTAwKQorI2RlZmluZSBNQklfVE9fREJJKGdhaW4pIChnYWluIC8gMTAwKQorI2RlZmluZSBEQk1fVE9fTUJNKGdhaW4pIChnYWluICogMTAwKQorI2RlZmluZSBNQk1fVE9fREJNKGdhaW4pIChnYWluIC8gMTAwKQorCisjZGVmaW5lIFJFR19SVUxFKHN0YXJ0LCBlbmQsIGJ3LCBnYWluLCBlaXJwLCByZWdfZmxhZ3MpIHsgXAorCS5mcmVxX3JhbmdlLnN0YXJ0X2ZyZXFfa2h6ID0gKHN0YXJ0KSAqIDEwMDAsIFwKKwkuZnJlcV9yYW5nZS5lbmRfZnJlcV9raHogPSAoZW5kKSAqIDEwMDAsIFwKKwkuZnJlcV9yYW5nZS5tYXhfYmFuZHdpZHRoX2toeiA9IChidykgKiAxMDAwLCBcCisJLnBvd2VyX3J1bGUubWF4X2FudGVubmFfZ2FpbiA9IChnYWluKSAqIDEwMCwgXAorCS5wb3dlcl9ydWxlLm1heF9laXJwID0gKGVpcnApICogMTAwLCBcCisJLmZsYWdzID0gcmVnX2ZsYWdzLCBcCisJfQogCiAvKiBmcm9tIG5ldC93aXJlbGVzcy5oICovCiBzdHJ1Y3Qgd2lwaHk7CkBAIC0yODUsMTEgKzM2MywxMyBAQAogICogd2lyZWxlc3MgZXh0ZW5zaW9ucyBidXQgdGhpcyBpcyBzdWJqZWN0IHRvIHJlZXZhbHVhdGlvbiBhcyBzb29uIGFzIHRoaXMKICAqIGNvZGUgaXMgdXNlZCBtb3JlIHdpZGVseSBhbmQgd2UgaGF2ZSBhIGZpcnN0IHVzZXIgd2l0aG91dCB3ZXh0LgogICoKLSAqIEBhZGRfdmlydHVhbF9pbnRmOiBjcmVhdGUgYSBuZXcgdmlydHVhbCBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICogQGFkZF92aXJ0dWFsX2ludGY6IGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lLAorICoJbXVzdCBzZXQgdGhlIHN0cnVjdCB3aXJlbGVzc19kZXYncyBpZnR5cGUuCiAgKgogICogQGRlbF92aXJ0dWFsX2ludGY6IHJlbW92ZSB0aGUgdmlydHVhbCBpbnRlcmZhY2UgZGV0ZXJtaW5lZCBieSBpZmluZGV4LgogICoKLSAqIEBjaGFuZ2VfdmlydHVhbF9pbnRmOiBjaGFuZ2UgdHlwZSBvZiB2aXJ0dWFsIGludGVyZmFjZQorICogQGNoYW5nZV92aXJ0dWFsX2ludGY6IGNoYW5nZSB0eXBlL2NvbmZpZ3VyYXRpb24gb2YgdmlydHVhbCBpbnRlcmZhY2UsCisgKglrZWVwIHRoZSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2J3MgaWZ0eXBlIHVwZGF0ZWQuCiAgKgogICogQGFkZF9rZXk6IGFkZCBhIGtleSB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBAbWFjX2FkZHIgd2lsbCBiZSAlTlVMTAogICoJd2hlbiBhZGRpbmcgYSBncm91cCBrZXkuCkBAIC0zMTgsNiArMzk4LDggQEAKICAqIEBjaGFuZ2Vfc3RhdGlvbjogTW9kaWZ5IGEgZ2l2ZW4gc3RhdGlvbi4KICAqCiAgKiBAc2V0X21lc2hfY2ZnOiBzZXQgbWVzaCBwYXJhbWV0ZXJzIChieSBub3csIGp1c3QgbWVzaCBpZCkKKyAqCisgKiBAY2hhbmdlX2JzczogTW9kaWZ5IHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gQlNTLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKIAlpbnQJKCphZGRfdmlydHVhbF9pbnRmKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLApAQCAtMzcwLDYgKzQ1Miw5IEBACiAJaW50CSgqZHVtcF9tcGF0aCkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBpbnQgaWR4LCB1OCAqZHN0LCB1OCAqbmV4dF9ob3AsCiAJCQkgICAgICAgc3RydWN0IG1wYXRoX2luZm8gKnBpbmZvKTsKKworCWludAkoKmNoYW5nZV9ic3MpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgYnNzX3BhcmFtZXRlcnMgKnBhcmFtcyk7CiB9OwogCiAjZW5kaWYgLyogX19ORVRfQ0ZHODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCmluZGV4IGE2YmI5NDUuLjk5MDk3NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKQEAgLTQwLDExICs0MCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9uZXRsYWJlbC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogLyoga25vd24gZG9pIHZhbHVlcyAqLwogI2RlZmluZSBDSVBTT19WNF9ET0lfVU5LTk9XTiAgICAgICAgICAweDAwMDAwMDAwCiAKLS8qIHRhZyB0eXBlcyAqLworLyogc3RhbmRhcmQgdGFnIHR5cGVzICovCiAjZGVmaW5lIENJUFNPX1Y0X1RBR19JTlZBTElEICAgICAgICAgIDAKICNkZWZpbmUgQ0lQU09fVjRfVEFHX1JCSVRNQVAgICAgICAgICAgMQogI2RlZmluZSBDSVBTT19WNF9UQUdfRU5VTSAgICAgICAgICAgICAyCkBAIC01MiwxMCArNTMsMTQgQEAKICNkZWZpbmUgQ0lQU09fVjRfVEFHX1BCSVRNQVAgICAgICAgICAgNgogI2RlZmluZSBDSVBTT19WNF9UQUdfRlJFRUZPUk0gICAgICAgICA3CiAKKy8qIG5vbi1zdGFuZGFyZCB0YWcgdHlwZXMgKHRhZ3MgPiAxMjcpICovCisjZGVmaW5lIENJUFNPX1Y0X1RBR19MT0NBTCAgICAgICAgICAgIDEyOAorCiAvKiBkb2kgbWFwcGluZyB0eXBlcyAqLwogI2RlZmluZSBDSVBTT19WNF9NQVBfVU5LTk9XTiAgICAgICAgICAwCi0jZGVmaW5lIENJUFNPX1Y0X01BUF9TVEQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0lQU09fVjRfTUFQX1RSQU5TICAgICAgICAgICAgMQogI2RlZmluZSBDSVBTT19WNF9NQVBfUEFTUyAgICAgICAgICAgICAyCisjZGVmaW5lIENJUFNPX1Y0X01BUF9MT0NBTCAgICAgICAgICAgIDMKIAogLyogbGltaXRzICovCiAjZGVmaW5lIENJUFNPX1Y0X01BWF9SRU1fTFZMUyAgICAgICAgIDI1NQpAQCAtNzksMTAgKzg0LDkgQEAKIAl9IG1hcDsKIAl1OCB0YWdzW0NJUFNPX1Y0X1RBR19NQVhDTlRdOwogCi0JdTMyIHZhbGlkOworCWF0b21pY190IHJlZmNvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCXN0cnVjdCBsaXN0X2hlYWQgZG9tX2xpc3Q7CiB9OwogCiAvKiBTdGFuZGFyZCBDSVBTTyBtYXBwaW5nIHRhYmxlICovCkBAIC0xMjgsMjUgKzEzMiwyNiBAQAogCiAjaWZkZWYgQ09ORklHX05FVExBQkVMCiBpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKTsKLWludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksCi0JCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvLAotCQkJdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IHJjdV9oZWFkICogaGVhZCkpOwordm9pZCBjaXBzb192NF9kb2lfZnJlZShzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKTsKK2ludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogc3RydWN0IGNpcHNvX3Y0X2RvaSAqY2lwc29fdjRfZG9pX2dldGRlZih1MzIgZG9pKTsKK3ZvaWQgY2lwc29fdjRfZG9pX3B1dGRlZihzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKTsKIGludCBjaXBzb192NF9kb2lfd2Fsayh1MzIgKnNraXBfY250LAogCQkgICAgIGludCAoKmNhbGxiYWNrKSAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwgdm9pZCAqYXJnKSwKIAkgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKLWludCBjaXBzb192NF9kb2lfZG9taHNoX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLCBjb25zdCBjaGFyICpkb21haW4pOwotaW50IGNpcHNvX3Y0X2RvaV9kb21oc2hfcmVtb3ZlKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCi0JCQkgICAgICAgY29uc3QgY2hhciAqZG9tYWluKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaXBzb192NF9kb2lfZnJlZShzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKQoreworCXJldHVybjsKK30KKwogc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfZG9pX3JlbW92ZSh1MzIgZG9pLAotCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvLAotCQkJCSAgICB2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgcmN1X2hlYWQgKiBoZWFkKSkKKwkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCXJldHVybiAwOwogfQpAQCAtMjA2LDEwICsyMTEsMTUgQEAKIGludCBjaXBzb192NF9zb2NrX3NldGF0dHIoc3RydWN0IHNvY2sgKnNrLAogCQkJICBjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAogCQkJICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKK3ZvaWQgY2lwc29fdjRfc29ja19kZWxhdHRyKHN0cnVjdCBzb2NrICpzayk7CiBpbnQgY2lwc29fdjRfc29ja19nZXRhdHRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7CitpbnQgY2lwc29fdjRfc2tidWZmX3NldGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOworaW50IGNpcHNvX3Y0X3NrYnVmZl9kZWxhdHRyKHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGNpcHNvX3Y0X3NrYnVmZl9nZXRhdHRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7Ci1pbnQgY2lwc29fdjRfdmFsaWRhdGUodW5zaWduZWQgY2hhciAqKm9wdGlvbik7CitpbnQgY2lwc29fdjRfdmFsaWRhdGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqKm9wdGlvbik7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGNpcHNvX3Y0X2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBpbnQgZXJyb3IsCkBAIC0yMjUsMTkgKzIzNSwzNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2lwc29fdjRfc29ja19kZWxhdHRyKHN0cnVjdCBzb2NrICpzaykKK3sKK30KKwogc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfc29ja19nZXRhdHRyKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfc2tidWZmX3NldGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNpcHNvX3Y0X3NrYnVmZl9kZWxhdHRyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNpcHNvX3Y0X3NrYnVmZl9nZXRhdHRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfdmFsaWRhdGUodW5zaWduZWQgY2hhciAqKm9wdGlvbikKK3N0YXRpYyBpbmxpbmUgaW50IGNpcHNvX3Y0X3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgKipvcHRpb24pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTk3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9kc2EuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogaW5jbHVkZS9uZXQvZHNhLmggLSBEcml2ZXIgZm9yIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgc3dpdGNoIGNoaXBzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTkVUX0RTQV9ICisjZGVmaW5lIF9fTElOVVhfTkVUX0RTQV9ICisKKyNkZWZpbmUgRFNBX01BWF9QT1JUUwkxMgorCitzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgeworCS8qCisJICogUmVmZXJlbmNlIHRvIGEgTGludXggbmV0d29yayBpbnRlcmZhY2UgdGhhdCBjb25uZWN0cworCSAqIHRvIHRoZSBzd2l0Y2ggY2hpcC4KKwkgKi8KKwlzdHJ1Y3QgZGV2aWNlCSpuZXRkZXY7CisKKwkvKgorCSAqIEhvdyB0byBhY2Nlc3MgdGhlIHN3aXRjaCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycywgYW5kCisJICogdGhlIG5hbWVzIG9mIHRoZSBzd2l0Y2ggcG9ydHMgKHVzZSAiY3B1IiB0byBkZXNpZ25hdGUKKwkgKiB0aGUgc3dpdGNoIHBvcnQgdGhhdCB0aGUgY3B1IGlzIGNvbm5lY3RlZCB0bykuCisJICovCisJc3RydWN0IGRldmljZQkqbWlpX2J1czsKKwlpbnQJCXN3X2FkZHI7CisJY2hhcgkJKnBvcnRfbmFtZXNbRFNBX01BWF9QT1JUU107Cit9OworCitleHRlcm4gYm9vbCBkc2FfdXNlc19kc2FfdGFncyh2b2lkICpkc2FfcHRyKTsKK2V4dGVybiBib29sIGRzYV91c2VzX3RyYWlsZXJfdGFncyh2b2lkICpkc2FfcHRyKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2Zsb3cuaCBiL2luY2x1ZGUvbmV0L2Zsb3cuaAppbmRleCAyMjhiMjQ3Li5iNDVhNWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mbG93LmgKKysrIGIvaW5jbHVkZS9uZXQvZmxvdy5oCkBAIC00Nyw2ICs0Nyw4IEBACiAjZGVmaW5lIGZsNF9zY29wZQlubF91LmlwNF91LnNjb3BlCiAKIAlfX3U4CXByb3RvOworCV9fdTgJZmxhZ3M7CisjZGVmaW5lIEZMT1dJX0ZMQUdfQU5ZU1JDIDB4MDEKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlfX2JlMTYJc3BvcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCmluZGV4IGIzMTM5OWUuLjkzYTU2ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0xMTQsNyArMTE0LDcgQEAKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIGRvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKICAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJWMgJXMgIiBmbXQsIFwKLSAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQogc3RhdGljIGlubGluZSBib29sIGllZWU4MDIxMV9yYXRlbGltaXRfZGVidWcodTMyIGxldmVsKQogewogCXJldHVybiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgbGV2ZWwpICYmIG5ldF9yYXRlbGltaXQoKTsKQEAgLTE5MCwxMCArMTkwLDYgQEAKICNlbmRpZgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8qIG5ldyBkcml2ZXIgQVBJICovCiAKLSNpZm5kZWYgRVRIX1BfUEFFCi0jZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUJLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KLSNlbmRpZgkJCQkvKiBFVEhfUF9QQUUgKi8KLQogI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNwkvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCiAKICNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmggYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKaW5kZXggZTQ4OTg5Zi4uZjc0NjY1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaApAQCAtOTEsNiArOTEsMjEgQEAKIAlyZXR1cm4gaW5ldDZfbG9va3VwX2xpc3RlbmVyKG5ldCwgaGFzaGluZm8sIGRhZGRyLCBobnVtLCBkaWYpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpfX2luZXQ2X2xvb2t1cF9za2Ioc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICBjb25zdCBfX2JlMTYgc3BvcnQsCisJCQkJCSAgICAgIGNvbnN0IF9fYmUxNiBkcG9ydCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAodW5saWtlbHkoc2sgPSBza2Jfc3RlYWxfc29jayhza2IpKSkKKwkJcmV0dXJuIHNrOworCWVsc2UgcmV0dXJuIF9faW5ldDZfbG9va3VwKGRldl9uZXQoc2tiLT5kc3QtPmRldiksIGhhc2hpbmZvLAorCQkJCSAgICZpcHY2X2hkcihza2IpLT5zYWRkciwgc3BvcnQsCisJCQkJICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBudG9ocyhkcG9ydCksCisJCQkJICAgaW5ldDZfaWlmKHNrYikpOworfQorCiBleHRlcm4gc3RydWN0IHNvY2sgKmluZXQ2X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywKIAkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3QgX19iZTE2IHNwb3J0LAogCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBjb25zdCBfX2JlMTYgZHBvcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaAppbmRleCAyZmY1NDVhLi4wM2NmZmQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKQEAgLTUxLDEyICs1MSwxNCBAQAogCQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CiAJaW50CSAgICAoKmdldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCiAJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworI2lmZGVmIENPTkZJR19DT01QQVQKIAlpbnQJICAgICgqY29tcGF0X3NldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywKIAkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOwogCWludAkgICAgKCpjb21wYXRfZ2V0c29ja29wdCkoc3RydWN0IHNvY2sgKnNrLAogCQkJCWludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKKyNlbmRpZgogCXZvaWQJICAgICgqYWRkcjJzb2NrYWRkcikoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKik7CiAJaW50CSAgICAoKmJpbmRfY29uZmxpY3QpKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0Yik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCmluZGV4IGJiNjE5ZDguLjVjYzE4MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCkBAIC0xNiw2ICsxNiw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yOCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvaGFzaC5oPgogCkBAIC0zNzEsNiArMzczLDIyIEBACiAJcmV0dXJuIHNrOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpfX2luZXRfbG9va3VwX3NrYihzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICBjb25zdCBfX2JlMTYgc3BvcnQsCisJCQkJCSAgICAgY29uc3QgX19iZTE2IGRwb3J0KQoreworCXN0cnVjdCBzb2NrICpzazsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCisJaWYgKHVubGlrZWx5KHNrID0gc2tiX3N0ZWFsX3NvY2soc2tiKSkpCisJCXJldHVybiBzazsKKwllbHNlCisJCXJldHVybiBfX2luZXRfbG9va3VwKGRldl9uZXQoc2tiLT5kc3QtPmRldiksIGhhc2hpbmZvLAorCQkJCSAgICAgaXBoLT5zYWRkciwgc3BvcnQsCisJCQkJICAgICBpcGgtPmRhZGRyLCBkcG9ydCwgaW5ldF9paWYoc2tiKSk7Cit9CisKIGV4dGVybiBpbnQgX19pbmV0X2hhc2hfY29ubmVjdChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKmRlYXRoX3JvdywKIAkJc3RydWN0IHNvY2sgKnNrLCB1MzIgcG9ydF9vZmZzZXQsCiAJCWludCAoKmNoZWNrX2VzdGFibGlzaGVkKShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKaW5kZXggNjQzZTI2Yi4uZGUwZWNjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxuZXQvZmxvdy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3JlcXVlc3Rfc29jay5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9oYXNoLmg+CiAKIC8qKiBzdHJ1Y3QgaXBfb3B0aW9ucyAtIElQIE9wdGlvbnMKQEAgLTYyLDggKzYxLDggQEAKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrCXJlcTsKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIAl1MTYJCQlpbmV0Nl9yc2tfb2Zmc2V0OwotCS8qIDIgYnl0ZXMgaG9sZSwgdHJ5IHRvIHBhY2sgKi8KICNlbmRpZgorCV9fYmUxNgkJCWxvY19wb3J0OwogCV9fYmUzMgkJCWxvY19hZGRyOwogCV9fYmUzMgkJCXJtdF9hZGRyOwogCV9fYmUxNgkJCXJtdF9wb3J0OwpAQCAtNzMsNyArNzIsOCBAQAogCQkJCXNhY2tfb2sJICAgOiAxLAogCQkJCXdzY2FsZV9vayAgOiAxLAogCQkJCWVjbl9vawkgICA6IDEsCi0JCQkJYWNrZWQJICAgOiAxOworCQkJCWFja2VkCSAgIDogMSwKKwkJCQlub19zcmNjaGVjazogMTsKIAlzdHJ1Y3QgaXBfb3B0aW9ucwkqb3B0OwogfTsKIApAQCAtMTI5LDcgKzEyOSw4IEBACiAJCQkJaXNfaWNzazoxLAogCQkJCWZyZWViaW5kOjEsCiAJCQkJaGRyaW5jbDoxLAotCQkJCW1jX2xvb3A6MTsKKwkJCQltY19sb29wOjEsCisJCQkJdHJhbnNwYXJlbnQ6MTsKIAlpbnQJCQltY19pbmRleDsKIAlfX2JlMzIJCQltY19hZGRyOwogCXN0cnVjdCBpcF9tY19zb2NrbGlzdAkqbWNfbGlzdDsKQEAgLTE5NCwxMiArMTk1LDYgQEAKIAlyZXR1cm4gaW5ldF9laGFzaGZuKG5ldCwgbGFkZHIsIGxwb3J0LCBmYWRkciwgZnBvcnQpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfaWlmKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIHNrYi0+cnRhYmxlLT5ydF9paWY7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3Rfc29jayAqaW5ldF9yZXFza19hbGxvYyhzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyAqb3BzKQogewogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSA9IHJlcXNrX2FsbG9jKG9wcyk7CkBAIC0yMTAsNCArMjA1LDkgQEAKIAlyZXR1cm4gcmVxOwogfQogCitzdGF0aWMgaW5saW5lIF9fdTggaW5ldF9za19mbG93aV9mbGFncyhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIGluZXRfc2soc2spLT50cmFuc3BhcmVudCA/IEZMT1dJX0ZMQUdfQU5ZU1JDIDogMDsKK30KKwogI2VuZGlmCS8qIF9JTkVUX1NPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAppbmRleCA5NWM2NjBjLi44MGU0OTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaApAQCAtMTI4LDcgKzEyOCw4IEBACiAJX19iZTE2CQkJdHdfZHBvcnQ7CiAJX191MTYJCQl0d19udW07CiAJLyogQW5kIHRoZXNlIGFyZSBvdXJzLiAqLwotCV9fdTgJCQl0d19pcHY2b25seToxOworCV9fdTgJCQl0d19pcHY2b25seToxLAorCQkJCXR3X3RyYW5zcGFyZW50OjE7CiAJLyogMTUgYml0cyBob2xlLCB0cnkgdG8gcGFjayAqLwogCV9fdTE2CQkJdHdfaXB2Nl9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZwkJdHdfdHRkOwpAQCAtMjA4LDYgKzIwOSw5IEBACiBleHRlcm4gdm9pZCBpbmV0X3R3c2tfZGVzY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKIAkJCQkgc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICp0d2RyKTsKIAorZXh0ZXJuIHZvaWQgaW5ldF90d3NrX3B1cmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAorCQkJICAgIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkciwgaW50IGZhbWlseSk7CisKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBuZXQgKnR3c2tfbmV0KGNvbnN0IHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3c2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCAyNTBlNmVmLi5iYzAyNmVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvc25tcC5oPgorI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAKIHN0cnVjdCBzb2NrOwogCkBAIC0xNDAsMTIgKzE0MSwyMCBAQAogCiBzdHJ1Y3QgaXBfcmVwbHlfYXJnIHsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMV07ICAgCisJaW50CSAgICBmbGFnczsKIAlfX3dzdW0gCSAgICBjc3VtOwogCWludAkgICAgY3N1bW9mZnNldDsgLyogdTE2IG9mZnNldCBvZiBjc3VtIGluIGlvdlswXS5pb3ZfYmFzZSAqLwogCQkJCS8qIC0xIGlmIG5vdCBuZWVkZWQgKi8gCiAJaW50CSAgICBib3VuZF9kZXZfaWY7CiB9OyAKIAorI2RlZmluZSBJUF9SRVBMWV9BUkdfTk9TUkNDSEVDSyAxCisKK3N0YXRpYyBpbmxpbmUgX191OCBpcF9yZXBseV9hcmdfZmxvd2lfZmxhZ3MoY29uc3Qgc3RydWN0IGlwX3JlcGx5X2FyZyAqYXJnKQoreworCXJldHVybiAoYXJnLT5mbGFncyAmIElQX1JFUExZX0FSR19OT1NSQ0NIRUNLKSA/IEZMT1dJX0ZMQUdfQU5ZU1JDIDogMDsKK30KKwogdm9pZCBpcF9zZW5kX3JlcGx5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3JlcGx5X2FyZyAqYXJnLAogCQkgICB1bnNpZ25lZCBpbnQgbGVuKTsgCiAKQEAgLTE2OSw2ICsxNzgsMTAgQEAKIGV4dGVybiBpbnQgc25tcF9taWJfaW5pdCh2b2lkICpwdHJbMl0sIHNpemVfdCBtaWJzaXplKTsKIGV4dGVybiB2b2lkIHNubXBfbWliX2ZyZWUodm9pZCAqcHRyWzJdKTsKIAorZXh0ZXJuIHN0cnVjdCBsb2NhbF9wb3J0cyB7CisJc2VxbG9ja190CWxvY2s7CisJaW50CQlyYW5nZVsyXTsKK30gc3lzY3RsX2xvY2FsX3BvcnRzOwogZXh0ZXJuIHZvaWQgaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShpbnQgKmxvdywgaW50ICpoaWdoKTsKIAogZXh0ZXJuIGludCBzeXNjdGxfaXBfZGVmYXVsdF90dGw7CkBAIC0zODMsNyArMzk2LDcgQEAKIGludCBpcHY0X2RvaW50X2FuZF9mbHVzaChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAogCQkJIHN0cnVjdCBmaWxlKiBmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKLWludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA3MzEyYzNkLi5mZTlmY2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTIxLDExICsyMSwxMDQgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CQkvKiBmb3IgdW5pb24gbmZfaW5ldF9hZGRyICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CQkJLyogZm9yIHN0cnVjdCBpcHY2aGRyICovCisjaW5jbHVkZSA8bmV0L2lwdjYuaD4JCQkvKiBmb3IgaXB2Nl9hZGRyX2NvcHkgKi8KKworc3RydWN0IGlwX3ZzX2lwaGRyIHsKKwlpbnQgbGVuOworCV9fdTggcHJvdG9jb2w7CisJdW5pb24gbmZfaW5ldF9hZGRyIHNhZGRyOworCXVuaW9uIG5mX2luZXRfYWRkciBkYWRkcjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXBfdnNfZmlsbF9pcGhkcihpbnQgYWYsIGNvbnN0IHZvaWQgKm5oLCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaGRyKQoreworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKGFmID09IEFGX0lORVQ2KSB7CisJCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcGggPSBuaDsKKwkJaXBoZHItPmxlbiA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCWlwaGRyLT5wcm90b2NvbCA9IGlwaC0+bmV4dGhkcjsKKwkJaXB2Nl9hZGRyX2NvcHkoJmlwaGRyLT5zYWRkci5pbjYsICZpcGgtPnNhZGRyKTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmlwaGRyLT5kYWRkci5pbjYsICZpcGgtPmRhZGRyKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBuaDsKKwkJaXBoZHItPmxlbiA9IGlwaC0+aWhsICogNDsKKwkJaXBoZHItPnByb3RvY29sID0gaXBoLT5wcm90b2NvbDsKKwkJaXBoZHItPnNhZGRyLmlwID0gaXBoLT5zYWRkcjsKKwkJaXBoZHItPmRhZGRyLmlwID0gaXBoLT5kYWRkcjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19hZGRyX2NvcHkoaW50IGFmLCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRzdCwKKwkJCQkgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnNyYykKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJaXB2Nl9hZGRyX2NvcHkoJmRzdC0+aW42LCAmc3JjLT5pbjYpOworCWVsc2UKKyNlbmRpZgorCWRzdC0+aXAgPSBzcmMtPmlwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcF92c19hZGRyX2VxdWFsKGludCBhZiwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICphLAorCQkJCSAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYikKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmYS0+aW42LCAmYi0+aW42KTsKKyNlbmRpZgorCXJldHVybiBhLT5pcCA9PSBiLT5pcDsKK30KIAogI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRwogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogCiBleHRlcm4gaW50IGlwX3ZzX2dldF9kZWJ1Z19sZXZlbCh2b2lkKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICppcF92c19kYmdfYWRkcihpbnQgYWYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCisJCQkJCSBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmFkZHIsCisJCQkJCSBpbnQgKmlkeCkKK3sKKwlpbnQgbGVuOworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKGFmID09IEFGX0lORVQ2KQorCQlsZW4gPSBzbnByaW50ZigmYnVmWyppZHhdLCBidWZfbGVuIC0gKmlkeCwgIlsiIE5JUDZfRk1UICJdIiwKKwkJCSAgICAgICBOSVA2KGFkZHItPmluNikpICsgMTsKKwllbHNlCisjZW5kaWYKKwkJbGVuID0gc25wcmludGYoJmJ1ZlsqaWR4XSwgYnVmX2xlbiAtICppZHgsIE5JUFFVQURfRk1ULAorCQkJICAgICAgIE5JUFFVQUQoYWRkci0+aXApKSArIDE7CisKKwkqaWR4ICs9IGxlbjsKKwlCVUdfT04oKmlkeCA+IGJ1Zl9sZW4gKyAxKTsKKwlyZXR1cm4gJmJ1ZlsqaWR4IC0gbGVuXTsKK30KKworI2RlZmluZSBJUF9WU19EQkdfQlVGKGxldmVsLCBtc2cuLi4pCQkJXAorICAgIGRvIHsJCQkJCQlcCisJICAgIGNoYXIgaXBfdnNfZGJnX2J1ZlsxNjBdOwkJCVwKKwkgICAgaW50IGlwX3ZzX2RiZ19pZHggPSAwOwkJCVwKKwkgICAgaWYgKGxldmVsIDw9IGlwX3ZzX2dldF9kZWJ1Z19sZXZlbCgpKQlcCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiSVBWUzogIiBtc2cpOwlcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSVBfVlNfRVJSX0JVRihtc2cuLi4pCQkJCVwKKyAgICBkbyB7CQkJCQkJXAorCSAgICBjaGFyIGlwX3ZzX2RiZ19idWZbMTYwXTsJCQlcCisJICAgIGludCBpcF92c19kYmdfaWR4ID0gMDsJCQlcCisJICAgIHByaW50ayhLRVJOX0VSUiAiSVBWUzogIiBtc2cpOwkJXAorICAgIH0gd2hpbGUgKDApCisKKy8qIE9ubHkgdXNlIGZyb20gd2l0aGluIElQX1ZTX0RCR19CVUYoKSBvciBJUF9WU19FUlJfQlVGIG1hY3JvcyAqLworI2RlZmluZSBJUF9WU19EQkdfQUREUihhZiwgYWRkcikJCQlcCisgICAgaXBfdnNfZGJnX2FkZHIoYWYsIGlwX3ZzX2RiZ19idWYsCQkJXAorCQkgICBzaXplb2YoaXBfdnNfZGJnX2J1ZiksIGFkZHIsCQlcCisJCSAgICZpcF92c19kYmdfaWR4KQorCiAjZGVmaW5lIElQX1ZTX0RCRyhsZXZlbCwgbXNnLi4uKQkJCVwKICAgICBkbyB7CQkJCQkJXAogCSAgICBpZiAobGV2ZWwgPD0gaXBfdnNfZ2V0X2RlYnVnX2xldmVsKCkpCVwKQEAgLTQ4LDYgKzE0MSw4IEBACiAJCXBwLT5kZWJ1Z19wYWNrZXQocHAsIHNrYiwgb2ZzLCBtc2cpOwlcCiAgICAgfSB3aGlsZSAoMCkKICNlbHNlCS8qIE5PIERFQlVHR0lORyBhdCBBTEwgKi8KKyNkZWZpbmUgSVBfVlNfREJHX0JVRihsZXZlbCwgbXNnLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIElQX1ZTX0VSUl9CVUYobXNnLi4uKSAgZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIElQX1ZTX0RCRyhsZXZlbCwgbXNnLi4uKSAgZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIElQX1ZTX0RCR19STChtc2cuLi4pICBkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgSVBfVlNfREJHX1BLVChsZXZlbCwgcHAsIHNrYiwgb2ZzLCBtc2cpCQlkbyB7fSB3aGlsZSAoMCkKQEAgLTcwLDEzICsxNjUsMTMgQEAKICAgICBkbyB7CQkJCQkJCQlcCiAJICAgIGlmIChsZXZlbCA8PSBpcF92c19nZXRfZGVidWdfbGV2ZWwoKSkJCQlcCiAJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiRW50ZXI6ICVzLCAlcyBsaW5lICVpXG4iLAlcCi0JCQkgICBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7CQlcCisJCQkgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsJCVwKICAgICB9IHdoaWxlICgwKQogI2RlZmluZSBMZWF2ZUZ1bmN0aW9uKGxldmVsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSAgICBpZiAobGV2ZWwgPD0gaXBfdnNfZ2V0X2RlYnVnX2xldmVsKCkpICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiTGVhdmU6ICVzLCAlcyBsaW5lICVpXG4iLCAgICBcCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICBcCisJCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgRW50ZXJGdW5jdGlvbihsZXZlbCkgICBkbyB7fSB3aGlsZSAoMCkKQEAgLTE2MCwyNyArMjU1LDEwIEBACiAKIHN0cnVjdCBpcF92c19zdGF0cwogewotCV9fdTMyICAgICAgICAgICAgICAgICAgIGNvbm5zOyAgICAgICAgICAvKiBjb25uZWN0aW9ucyBzY2hlZHVsZWQgKi8KLQlfX3UzMiAgICAgICAgICAgICAgICAgICBpbnBrdHM7ICAgICAgICAgLyogaW5jb21pbmcgcGFja2V0cyAqLwotCV9fdTMyICAgICAgICAgICAgICAgICAgIG91dHBrdHM7ICAgICAgICAvKiBvdXRnb2luZyBwYWNrZXRzICovCi0JX191NjQgICAgICAgICAgICAgICAgICAgaW5ieXRlczsgICAgICAgIC8qIGluY29taW5nIGJ5dGVzICovCi0JX191NjQgICAgICAgICAgICAgICAgICAgb3V0Ynl0ZXM7ICAgICAgIC8qIG91dGdvaW5nIGJ5dGVzICovCi0KLQlfX3UzMgkJCWNwczsJCS8qIGN1cnJlbnQgY29ubmVjdGlvbiByYXRlICovCi0JX191MzIJCQlpbnBwczsJCS8qIGN1cnJlbnQgaW4gcGFja2V0IHJhdGUgKi8KLQlfX3UzMgkJCW91dHBwczsJCS8qIGN1cnJlbnQgb3V0IHBhY2tldCByYXRlICovCi0JX191MzIJCQlpbmJwczsJCS8qIGN1cnJlbnQgaW4gYnl0ZSByYXRlICovCi0JX191MzIJCQlvdXRicHM7CQkvKiBjdXJyZW50IG91dCBieXRlIHJhdGUgKi8KLQotCS8qCi0JICogRG9uJ3QgYWRkIGFueXRoaW5nIGJlZm9yZSB0aGUgbG9jaywgYmVjYXVzZSB3ZSB1c2UgbWVtY3B5KCkgdG8gY29weQotCSAqIHRoZSBtZW1iZXJzIGJlZm9yZSB0aGUgbG9jayB0byBzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciBpbgotCSAqIGlwX3ZzX2N0bC5jLgotCSAqLworCXN0cnVjdCBpcF92c19zdGF0c191c2VyCXVzdGF0czsgICAgICAgICAvKiBzdGF0aXN0aWNzICovCisJc3RydWN0IGlwX3ZzX2VzdGltYXRvcgllc3Q7CQkvKiBlc3RpbWF0b3IgKi8KIAogCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7ICAgICAgICAgICAvKiBzcGluIGxvY2sgKi8KLQotCXN0cnVjdCBpcF92c19lc3RpbWF0b3IJZXN0OwkJLyogZXN0aW1hdG9yICovCiB9OwogCiBzdHJ1Y3QgZHN0X2VudHJ5OwpAQCAtMjAyLDIxICsyODAsMjMgQEAKIAogCXZvaWQgKCpleGl0KShzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKTsKIAotCWludCAoKmNvbm5fc2NoZWR1bGUpKHN0cnVjdCBza19idWZmICpza2IsCisJaW50ICgqY29ubl9zY2hlZHVsZSkoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAogCQkJICAgICBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKTsKIAogCXN0cnVjdCBpcF92c19jb25uICoKLQkoKmNvbm5faW5fZ2V0KShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSgqY29ubl9pbl9nZXQpKGludCBhZiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgICAgICAgY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBwcm90b19vZmYsCiAJCSAgICAgICBpbnQgaW52ZXJzZSk7CiAKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqCi0JKCpjb25uX291dF9nZXQpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJKCpjb25uX291dF9nZXQpKGludCBhZiwKKwkJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcGgsCisJCQljb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwKIAkJCXVuc2lnbmVkIGludCBwcm90b19vZmYsCiAJCQlpbnQgaW52ZXJzZSk7CiAKQEAgLTIyNiw3ICszMDYsOCBAQAogCWludCAoKmRuYXRfaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApOwogCi0JaW50ICgqY3N1bV9jaGVjaykoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCk7CisJaW50ICgqY3N1bV9jaGVjaykoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKTsKIAogCWNvbnN0IGNoYXIgKigqc3RhdGVfbmFtZSkoaW50IHN0YXRlKTsKIApAQCAtMjU5LDkgKzM0MCwxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGNfbGlzdDsgICAgICAgICAvKiBoYXNoZWQgbGlzdCBoZWFkcyAqLwogCiAJLyogUHJvdG9jb2wsIGFkZHJlc3NlcyBhbmQgcG9ydCBudW1iZXJzICovCi0JX19iZTMyICAgICAgICAgICAgICAgICAgIGNhZGRyOyAgICAgICAgICAvKiBjbGllbnQgYWRkcmVzcyAqLwotCV9fYmUzMiAgICAgICAgICAgICAgICAgICB2YWRkcjsgICAgICAgICAgLyogdmlydHVhbCBhZGRyZXNzICovCi0JX19iZTMyICAgICAgICAgICAgICAgICAgIGRhZGRyOyAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJdTE2ICAgICAgICAgICAgICAgICAgICAgIGFmOwkJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwl1bmlvbiBuZl9pbmV0X2FkZHIgICAgICAgY2FkZHI7ICAgICAgICAgIC8qIGNsaWVudCBhZGRyZXNzICovCisJdW5pb24gbmZfaW5ldF9hZGRyICAgICAgIHZhZGRyOyAgICAgICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1bmlvbiBuZl9pbmV0X2FkZHIgICAgICAgZGFkZHI7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KIAlfX2JlMTYgICAgICAgICAgICAgICAgICAgY3BvcnQ7CiAJX19iZTE2ICAgICAgICAgICAgICAgICAgIHZwb3J0OwogCV9fYmUxNiAgICAgICAgICAgICAgICAgICBkcG9ydDsKQEAgLTMwNSw2ICszODcsNDUgQEAKIAogCiAvKgorICoJRXh0ZW5kZWQgaW50ZXJuYWwgdmVyc2lvbnMgb2Ygc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciBhbmQKKyAqCWlwX3ZzX2Rlc3RfdXNlciBmb3IgSVB2NiBzdXBwb3J0LgorICoKKyAqCVdlIG5lZWQgdGhlc2UgdG8gY29udmVuaWVudGx5IHBhc3MgYXJvdW5kIHNlcnZpY2UgYW5kIGRlc3RpbmF0aW9uCisgKglvcHRpb25zLCBidXQgdW5mb3J0dW5hdGVseSwgd2UgYWxzbyBuZWVkIHRvIGtlZXAgdGhlIG9sZCBkZWZpbml0aW9ucyB0bworICoJbWFpbnRhaW4gdXNlcnNwYWNlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB0aGUgc2V0c29ja29wdCBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXJfa2VybiB7CisJLyogdmlydHVhbCBzZXJ2aWNlIGFkZHJlc3NlcyAqLworCXUxNgkJCWFmOworCXUxNgkJCXByb3RvY29sOworCXVuaW9uIG5mX2luZXRfYWRkcglhZGRyOwkJLyogdmlydHVhbCBpcCBhZGRyZXNzICovCisJdTE2CQkJcG9ydDsKKwl1MzIJCQlmd21hcms7CQkvKiBmaXJ3YWxsIG1hcmsgb2Ygc2VydmljZSAqLworCisJLyogdmlydHVhbCBzZXJ2aWNlIG9wdGlvbnMgKi8KKwljaGFyCQkJKnNjaGVkX25hbWU7CisJdW5zaWduZWQJCWZsYWdzOwkJLyogdmlydHVhbCBzZXJ2aWNlIGZsYWdzICovCisJdW5zaWduZWQJCXRpbWVvdXQ7CS8qIHBlcnNpc3RlbnQgdGltZW91dCBpbiBzZWMgKi8KKwl1MzIJCQluZXRtYXNrOwkvKiBwZXJzaXN0ZW50IG5ldG1hc2sgKi8KK307CisKKworc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcl9rZXJuIHsKKwkvKiBkZXN0aW5hdGlvbiBzZXJ2ZXIgYWRkcmVzcyAqLworCXVuaW9uIG5mX2luZXRfYWRkcglhZGRyOworCXUxNgkJCXBvcnQ7CisKKwkvKiByZWFsIHNlcnZlciBvcHRpb25zICovCisJdW5zaWduZWQJCWNvbm5fZmxhZ3M7CS8qIGNvbm5lY3Rpb24gZmxhZ3MgKi8KKwlpbnQJCQl3ZWlnaHQ7CQkvKiBkZXN0aW5hdGlvbiB3ZWlnaHQgKi8KKworCS8qIHRocmVzaG9sZHMgZm9yIGFjdGl2ZSBjb25uZWN0aW9ucyAqLworCXUzMgkJCXVfdGhyZXNob2xkOwkvKiB1cHBlciB0aHJlc2hvbGQgKi8KKwl1MzIJCQlsX3RocmVzaG9sZDsJLyogbG93ZXIgdGhyZXNob2xkICovCit9OworCisKKy8qCiAgKglUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpcnR1YWwgc2VydmljZSBvZmZlcmVkIHRvIHRoZSBuZXQKICAqCWFuZCB0aGUgZm9yd2FyZGluZyBlbnRyaWVzCiAgKi8KQEAgLTMxNCw4ICs0MzUsOSBAQAogCWF0b21pY190CQlyZWZjbnQ7ICAgLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KIAlhdG9taWNfdAkJdXNlY250OyAgIC8qIHVzZSBjb3VudGVyICovCiAKKwl1MTYJCQlhZjsgICAgICAgLyogYWRkcmVzcyBmYW1pbHkgKi8KIAlfX3UxNgkJCXByb3RvY29sOyAvKiB3aGljaCBwcm90b2NvbCAoVENQL1VEUCkgKi8KLQlfX2JlMzIJCQlhZGRyOwkgIC8qIElQIGFkZHJlc3MgZm9yIHZpcnR1YWwgc2VydmljZSAqLworCXVuaW9uIG5mX2luZXRfYWRkcglhZGRyOwkgIC8qIElQIGFkZHJlc3MgZm9yIHZpcnR1YWwgc2VydmljZSAqLwogCV9fYmUxNgkJCXBvcnQ7CSAgLyogcG9ydCBudW1iZXIgZm9yIHRoZSBzZXJ2aWNlICovCiAJX191MzIgICAgICAgICAgICAgICAgICAgZndtYXJrOyAgIC8qIGZpcmV3YWxsIG1hcmsgb2YgdGhlIHNlcnZpY2UgKi8KIAl1bnNpZ25lZAkJZmxhZ3M7CSAgLyogc2VydmljZSBzdGF0dXMgZmxhZ3MgKi8KQEAgLTM0Miw3ICs0NjQsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbl9saXN0OyAgIC8qIGZvciB0aGUgZGVzdHMgaW4gdGhlIHNlcnZpY2UgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWRfbGlzdDsgICAvKiBmb3IgdGFibGUgd2l0aCBhbGwgdGhlIGRlc3RzICovCiAKLQlfX2JlMzIJCQlhZGRyOwkJLyogSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyICovCisJdTE2CQkJYWY7CQkvKiBhZGRyZXNzIGZhbWlseSAqLworCXVuaW9uIG5mX2luZXRfYWRkcglhZGRyOwkJLyogSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyICovCiAJX19iZTE2CQkJcG9ydDsJCS8qIHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgKi8KIAl2b2xhdGlsZSB1bnNpZ25lZAlmbGFnczsJCS8qIGRlc3Qgc3RhdHVzIGZsYWdzICovCiAJYXRvbWljX3QJCWNvbm5fZmxhZ3M7CS8qIGZsYWdzIHRvIGNvcHkgdG8gY29ubiAqLwpAQCAtMzY2LDcgKzQ4OSw3IEBACiAJLyogZm9yIHZpcnR1YWwgc2VydmljZSAqLwogCXN0cnVjdCBpcF92c19zZXJ2aWNlCSpzdmM7CQkvKiBzZXJ2aWNlIGl0IGJlbG9uZ3MgdG8gKi8KIAlfX3UxNgkJCXByb3RvY29sOwkvKiB3aGljaCBwcm90b2NvbCAoVENQL1VEUCkgKi8KLQlfX2JlMzIJCQl2YWRkcjsJCS8qIHZpcnR1YWwgSVAgYWRkcmVzcyAqLworCXVuaW9uIG5mX2luZXRfYWRkcgl2YWRkcjsJCS8qIHZpcnR1YWwgSVAgYWRkcmVzcyAqLwogCV9fYmUxNgkJCXZwb3J0OwkJLyogdmlydHVhbCBwb3J0IG51bWJlciAqLwogCV9fdTMyCQkJdmZ3bWFyazsJLyogZmlyZXdhbGwgbWFyayBvZiBzZXJ2aWNlICovCiB9OwpAQCAtMzgwLDYgKzUwMyw5IEBACiAJY2hhcgkJCSpuYW1lOwkJLyogc2NoZWR1bGVyIG5hbWUgKi8KIAlhdG9taWNfdAkJcmVmY250OwkJLyogcmVmZXJlbmNlIGNvdW50ZXIgKi8KIAlzdHJ1Y3QgbW9kdWxlCQkqbW9kdWxlOwkvKiBUSElTX01PRFVMRS9OVUxMICovCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpbnQJCQlzdXBwb3J0c19pcHY2OwkvKiBzY2hlZHVsZXIgaGFzIElQdjYgc3VwcG9ydCAqLworI2VuZGlmCiAKIAkvKiBzY2hlZHVsZXIgaW5pdGlhbGl6aW5nIHNlcnZpY2UgKi8KIAlpbnQgKCppbml0X3NlcnZpY2UpKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpOwpAQCAtNDc5LDE2ICs2MDUsOCBAQAogI2lmbmRlZiBDT05GSUdfSVBfVlNfVEFCX0JJVFMKICNkZWZpbmUgQ09ORklHX0lQX1ZTX1RBQl9CSVRTICAgMTIKICNlbmRpZgotLyogbWFrZSBzdXJlIHRoYXQgSVBfVlNfQ09OTl9UQUJfQklUUyBpcyBsb2NhdGVkIGluIFs4LCAyMF0gKi8KLSNpZiBDT05GSUdfSVBfVlNfVEFCX0JJVFMgPCA4Ci0jZGVmaW5lIElQX1ZTX0NPTk5fVEFCX0JJVFMJOAotI2VuZGlmCi0jaWYgQ09ORklHX0lQX1ZTX1RBQl9CSVRTID4gMjAKLSNkZWZpbmUgSVBfVlNfQ09OTl9UQUJfQklUUwkyMAotI2VuZGlmCi0jaWYgOCA8PSBDT05GSUdfSVBfVlNfVEFCX0JJVFMgJiYgQ09ORklHX0lQX1ZTX1RBQl9CSVRTIDw9IDIwCisKICNkZWZpbmUgSVBfVlNfQ09OTl9UQUJfQklUUwlDT05GSUdfSVBfVlNfVEFCX0JJVFMKLSNlbmRpZgogI2RlZmluZSBJUF9WU19DT05OX1RBQl9TSVpFICAgICAoMSA8PCBJUF9WU19DT05OX1RBQl9CSVRTKQogI2RlZmluZSBJUF9WU19DT05OX1RBQl9NQVNLICAgICAoSVBfVlNfQ09OTl9UQUJfU0laRSAtIDEpCiAKQEAgLTUwMCwxMSArNjE4LDE2IEBACiB9OwogCiBleHRlcm4gc3RydWN0IGlwX3ZzX2Nvbm4gKmlwX3ZzX2Nvbm5faW5fZ2V0Ci0oaW50IHByb3RvY29sLCBfX2JlMzIgc19hZGRyLCBfX2JlMTYgc19wb3J0LCBfX2JlMzIgZF9hZGRyLCBfX2JlMTYgZF9wb3J0KTsKKyhpbnQgYWYsIGludCBwcm90b2NvbCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpzX2FkZHIsIF9fYmUxNiBzX3BvcnQsCisgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkX2FkZHIsIF9fYmUxNiBkX3BvcnQpOworCiBleHRlcm4gc3RydWN0IGlwX3ZzX2Nvbm4gKmlwX3ZzX2N0X2luX2dldAotKGludCBwcm90b2NvbCwgX19iZTMyIHNfYWRkciwgX19iZTE2IHNfcG9ydCwgX19iZTMyIGRfYWRkciwgX19iZTE2IGRfcG9ydCk7CisoaW50IGFmLCBpbnQgcHJvdG9jb2wsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqc19hZGRyLCBfX2JlMTYgc19wb3J0LAorIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZF9hZGRyLCBfX2JlMTYgZF9wb3J0KTsKKwogZXh0ZXJuIHN0cnVjdCBpcF92c19jb25uICppcF92c19jb25uX291dF9nZXQKLShpbnQgcHJvdG9jb2wsIF9fYmUzMiBzX2FkZHIsIF9fYmUxNiBzX3BvcnQsIF9fYmUzMiBkX2FkZHIsIF9fYmUxNiBkX3BvcnQpOworKGludCBhZiwgaW50IHByb3RvY29sLCBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnNfYWRkciwgX19iZTE2IHNfcG9ydCwKKyBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRfYWRkciwgX19iZTE2IGRfcG9ydCk7CiAKIC8qIHB1dCBiYWNrIHRoZSBjb25uIHdpdGhvdXQgcmVzdGFydGluZyBpdHMgdGltZXIgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lwX3ZzX2Nvbm5fcHV0KHN0cnVjdCBpcF92c19jb25uICpjcCkKQEAgLTUxNSw4ICs2MzgsOSBAQAogZXh0ZXJuIHZvaWQgaXBfdnNfY29ubl9maWxsX2Nwb3J0KHN0cnVjdCBpcF92c19jb25uICpjcCwgX19iZTE2IGNwb3J0KTsKIAogZXh0ZXJuIHN0cnVjdCBpcF92c19jb25uICoKLWlwX3ZzX2Nvbm5fbmV3KGludCBwcm90bywgX19iZTMyIGNhZGRyLCBfX2JlMTYgY3BvcnQsIF9fYmUzMiB2YWRkciwgX19iZTE2IHZwb3J0LAotCSAgICAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwgdW5zaWduZWQgZmxhZ3MsCitpcF92c19jb25uX25ldyhpbnQgYWYsIGludCBwcm90bywgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpjYWRkciwgX19iZTE2IGNwb3J0LAorCSAgICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnZhZGRyLCBfX2JlMTYgdnBvcnQsCisJICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZGFkZHIsIF9fYmUxNiBkcG9ydCwgdW5zaWduZWQgZmxhZ3MsCiAJICAgICAgIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KTsKIGV4dGVybiB2b2lkIGlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApOwogCkBAIC01MzIsMjQgKzY1NiwzMiBAQAogewogCXN0cnVjdCBpcF92c19jb25uICpjdGxfY3AgPSBjcC0+Y29udHJvbDsKIAlpZiAoIWN0bF9jcCkgewotCQlJUF9WU19FUlIoInJlcXVlc3QgY29udHJvbCBERUwgZm9yIHVuY29udHJvbGxlZDogIgotCQkJICAiJWQuJWQuJWQuJWQ6JWQgdG8gJWQuJWQuJWQuJWQ6JWRcbiIsCi0JCQkgIE5JUFFVQUQoY3AtPmNhZGRyKSxudG9ocyhjcC0+Y3BvcnQpLAotCQkJICBOSVBRVUFEKGNwLT52YWRkciksbnRvaHMoY3AtPnZwb3J0KSk7CisJCUlQX1ZTX0VSUl9CVUYoInJlcXVlc3QgY29udHJvbCBERUwgZm9yIHVuY29udHJvbGxlZDogIgorCQkJICAgICAgIiVzOiVkIHRvICVzOiVkXG4iLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3AtPmFmLCAmY3AtPmNhZGRyKSwKKwkJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+dmFkZHIpLAorCQkJICAgICAgbnRvaHMoY3AtPnZwb3J0KSk7CisKIAkJcmV0dXJuOwogCX0KIAotCUlQX1ZTX0RCRyg3LCAiREVMZXRpbmcgY29udHJvbCBmb3I6ICIKLQkJICAiY3AuZHN0PSVkLiVkLiVkLiVkOiVkIGN0bF9jcC5kc3Q9JWQuJWQuJWQuJWQ6JWRcbiIsCi0JCSAgTklQUVVBRChjcC0+Y2FkZHIpLG50b2hzKGNwLT5jcG9ydCksCi0JCSAgTklQUVVBRChjdGxfY3AtPmNhZGRyKSxudG9ocyhjdGxfY3AtPmNwb3J0KSk7CisJSVBfVlNfREJHX0JVRig3LCAiREVMZXRpbmcgY29udHJvbCBmb3I6ICIKKwkJICAgICAgImNwLmRzdD0lczolZCBjdGxfY3AuZHN0PSVzOiVkXG4iLAorCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+Y2FkZHIpLAorCQkgICAgICBudG9ocyhjcC0+Y3BvcnQpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjdGxfY3AtPmNhZGRyKSwKKwkJICAgICAgbnRvaHMoY3RsX2NwLT5jcG9ydCkpOwogCiAJY3AtPmNvbnRyb2wgPSBOVUxMOwogCWlmIChhdG9taWNfcmVhZCgmY3RsX2NwLT5uX2NvbnRyb2wpID09IDApIHsKLQkJSVBfVlNfRVJSKCJCVUcgY29udHJvbCBERUwgd2l0aCBuPTAgOiAiCi0JCQkgICIlZC4lZC4lZC4lZDolZCB0byAlZC4lZC4lZC4lZDolZFxuIiwKLQkJCSAgTklQUVVBRChjcC0+Y2FkZHIpLG50b2hzKGNwLT5jcG9ydCksCi0JCQkgIE5JUFFVQUQoY3AtPnZhZGRyKSxudG9ocyhjcC0+dnBvcnQpKTsKKwkJSVBfVlNfRVJSX0JVRigiQlVHIGNvbnRyb2wgREVMIHdpdGggbj0wIDogIgorCQkJICAgICAgIiVzOiVkIHRvICVzOiVkXG4iLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3AtPmFmLCAmY3AtPmNhZGRyKSwKKwkJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+dmFkZHIpLAorCQkJICAgICAgbnRvaHMoY3AtPnZwb3J0KSk7CisKIAkJcmV0dXJuOwogCX0KIAlhdG9taWNfZGVjKCZjdGxfY3AtPm5fY29udHJvbCk7CkBAIC01NTksMTcgKzY5MSwyMiBAQAogaXBfdnNfY29udHJvbF9hZGQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3RsX2NwKQogewogCWlmIChjcC0+Y29udHJvbCkgewotCQlJUF9WU19FUlIoInJlcXVlc3QgY29udHJvbCBBREQgZm9yIGFscmVhZHkgY29udHJvbGxlZDogIgotCQkJICAiJWQuJWQuJWQuJWQ6JWQgdG8gJWQuJWQuJWQuJWQ6JWRcbiIsCi0JCQkgIE5JUFFVQUQoY3AtPmNhZGRyKSxudG9ocyhjcC0+Y3BvcnQpLAotCQkJICBOSVBRVUFEKGNwLT52YWRkciksbnRvaHMoY3AtPnZwb3J0KSk7CisJCUlQX1ZTX0VSUl9CVUYoInJlcXVlc3QgY29udHJvbCBBREQgZm9yIGFscmVhZHkgY29udHJvbGxlZDogIgorCQkJICAgICAgIiVzOiVkIHRvICVzOiVkXG4iLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3AtPmFmLCAmY3AtPmNhZGRyKSwKKwkJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+dmFkZHIpLAorCQkJICAgICAgbnRvaHMoY3AtPnZwb3J0KSk7CisKIAkJaXBfdnNfY29udHJvbF9kZWwoY3ApOwogCX0KIAotCUlQX1ZTX0RCRyg3LCAiQUREaW5nIGNvbnRyb2wgZm9yOiAiCi0JCSAgImNwLmRzdD0lZC4lZC4lZC4lZDolZCBjdGxfY3AuZHN0PSVkLiVkLiVkLiVkOiVkXG4iLAotCQkgIE5JUFFVQUQoY3AtPmNhZGRyKSxudG9ocyhjcC0+Y3BvcnQpLAotCQkgIE5JUFFVQUQoY3RsX2NwLT5jYWRkciksbnRvaHMoY3RsX2NwLT5jcG9ydCkpOworCUlQX1ZTX0RCR19CVUYoNywgIkFERGluZyBjb250cm9sIGZvcjogIgorCQkgICAgICAiY3AuZHN0PSVzOiVkIGN0bF9jcC5kc3Q9JXM6JWRcbiIsCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT5jYWRkciksCisJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmN0bF9jcC0+Y2FkZHIpLAorCQkgICAgICBudG9ocyhjdGxfY3AtPmNwb3J0KSk7CiAKIAljcC0+Y29udHJvbCA9IGN0bF9jcDsKIAlhdG9taWNfaW5jKCZjdGxfY3AtPm5fY29udHJvbCk7CkBAIC02NDcsNyArNzg0LDggQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3RsX3BhdGggbmV0X3ZzX2N0bF9wYXRoW107CiAKIGV4dGVybiBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqCi1pcF92c19zZXJ2aWNlX2dldChfX3UzMiBmd21hcmssIF9fdTE2IHByb3RvY29sLCBfX2JlMzIgdmFkZHIsIF9fYmUxNiB2cG9ydCk7CitpcF92c19zZXJ2aWNlX2dldChpbnQgYWYsIF9fdTMyIGZ3bWFyaywgX191MTYgcHJvdG9jb2wsCisJCSAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp2YWRkciwgX19iZTE2IHZwb3J0KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX3NlcnZpY2VfcHV0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCiB7CkBAIC02NTUsMTQgKzc5MywxNiBAQAogfQogCiBleHRlcm4gc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfbG9va3VwX3JlYWxfc2VydmljZShfX3UxNiBwcm90b2NvbCwgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpOworaXBfdnNfbG9va3VwX3JlYWxfc2VydmljZShpbnQgYWYsIF9fdTE2IHByb3RvY29sLAorCQkJICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRhZGRyLCBfX2JlMTYgZHBvcnQpOworCiBleHRlcm4gaW50IGlwX3ZzX3VzZV9jb3VudF9pbmModm9pZCk7CiBleHRlcm4gdm9pZCBpcF92c191c2VfY291bnRfZGVjKHZvaWQpOwogZXh0ZXJuIGludCBpcF92c19jb250cm9sX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBpcF92c19jb250cm9sX2NsZWFudXAodm9pZCk7CiBleHRlcm4gc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfZmluZF9kZXN0KF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0LAotCQkgX19iZTMyIHZhZGRyLCBfX2JlMTYgdnBvcnQsIF9fdTE2IHByb3RvY29sKTsKK2lwX3ZzX2ZpbmRfZGVzdChpbnQgYWYsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZGFkZHIsIF9fYmUxNiBkcG9ydCwKKwkJY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp2YWRkciwgX19iZTE2IHZwb3J0LCBfX3UxNiBwcm90b2NvbCk7CiBleHRlcm4gc3RydWN0IGlwX3ZzX2Rlc3QgKmlwX3ZzX3RyeV9iaW5kX2Rlc3Qoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKTsKIAogCkBAIC02ODMsNiArODIzLDggQEAKIC8qCiAgKiAgICAgIElQVlMgcmF0ZSBlc3RpbWF0b3IgcHJvdG90eXBlcyAoZnJvbSBpcF92c19lc3QuYykKICAqLworZXh0ZXJuIGludCBpcF92c19lc3RpbWF0b3JfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlwX3ZzX2VzdGltYXRvcl9jbGVhbnVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBfdnNfbmV3X2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKTsKIGV4dGVybiB2b2lkIGlwX3ZzX2tpbGxfZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpOwogZXh0ZXJuIHZvaWQgaXBfdnNfemVyb19lc3RpbWF0b3Ioc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cyk7CkBAIC03MDQsNiArODQ2LDE5IEBACiAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBpbnQgb2Zmc2V0KTsKIGV4dGVybiB2b2lkIGlwX3ZzX2RzdF9yZXNldChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCk7CiAKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorZXh0ZXJuIGludCBpcF92c19ieXBhc3NfeG1pdF92NgorKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCk7CitleHRlcm4gaW50IGlwX3ZzX25hdF94bWl0X3Y2Cisoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKTsKK2V4dGVybiBpbnQgaXBfdnNfdHVubmVsX3htaXRfdjYKKyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApOworZXh0ZXJuIGludCBpcF92c19kcl94bWl0X3Y2Cisoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKTsKK2V4dGVybiBpbnQgaXBfdnNfaWNtcF94bWl0X3Y2Cisoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorIGludCBvZmZzZXQpOworI2VuZGlmCiAKIC8qCiAgKglUaGlzIGlzIGEgc2ltcGxlIG1lY2hhbmlzbSB0byBpZ25vcmUgcGFja2V0cyB3aGVuCkBAIC03NDgsNyArOTAzLDEyIEBACiB9CiAKIGV4dGVybiB2b2lkIGlwX3ZzX25hdF9pY21wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCXN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcik7CisJCQkgICBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXIpOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK2V4dGVybiB2b2lkIGlwX3ZzX25hdF9pY21wX3Y2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCisJCQkgICAgICBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXIpOworI2VuZGlmCiAKIGV4dGVybiBfX3N1bTE2IGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQpOwogCkBAIC03NTksNiArOTE5LDE3IEBACiAJcmV0dXJuIGNzdW1fcGFydGlhbCgoY2hhciAqKSBkaWZmLCBzaXplb2YoZGlmZiksIG9sZHN1bSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorc3RhdGljIGlubGluZSBfX3dzdW0gaXBfdnNfY2hlY2tfZGlmZjE2KGNvbnN0IF9fYmUzMiAqb2xkLCBjb25zdCBfX2JlMzIgKm5ldywKKwkJCQkJX193c3VtIG9sZHN1bSkKK3sKKwlfX2JlMzIgZGlmZls4XSA9IHsgfm9sZFszXSwgfm9sZFsyXSwgfm9sZFsxXSwgfm9sZFswXSwKKwkJCSAgICBuZXdbM10sICBuZXdbMl0sICBuZXdbMV0sICBuZXdbMF0gfTsKKworCXJldHVybiBjc3VtX3BhcnRpYWwoKGNoYXIgKikgZGlmZiwgc2l6ZW9mKGRpZmYpLCBvbGRzdW0pOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgX193c3VtIGlwX3ZzX2NoZWNrX2RpZmYyKF9fYmUxNiBvbGQsIF9fYmUxNiBuZXcsIF9fd3N1bSBvbGRzdW0pCiB7CiAJX19iZTE2IGRpZmZbMl0gPSB7IH5vbGQsIG5ldyB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBpcC5oIGIvaW5jbHVkZS9uZXQvaXBpcC5oCmluZGV4IGE4NWJkYTYuLmZkZjliZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwaXAuaAorKysgYi9pbmNsdWRlL25ldC9pcGlwLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2RlZmluZSBJUFRVTk5FTF9YTUlUKCkgZG8gewkJCQkJCVwKIAlpbnQgZXJyOwkJCQkJCQlcCi0JaW50IHBrdF9sZW4gPSBza2ItPmxlbjsJCQkJCQlcCisJaW50IHBrdF9sZW4gPSBza2ItPmxlbiAtIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CQlcCiAJCQkJCQkJCQlcCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkJCQkJXAogCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+dS5kc3QsIE5VTEwpOwkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggMTEzMDI4Zi4uNmQ1YjU4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtMTEwLDQzICsxMTAsNDIgQEAKIGV4dGVybiBpbnQgc3lzY3RsX21sZF9tYXhfbXNmOwogZXh0ZXJuIHN0cnVjdCBjdGxfcGF0aCBuZXRfaXB2Nl9jdGxfcGF0aFtdOwogCi0jZGVmaW5lIF9ERVZJTkMoc3RhdG5hbWUsIG1vZGlmaWVyLCBpZGV2LCBmaWVsZCkJCQlcCisjZGVmaW5lIF9ERVZJTkMobmV0LCBzdGF0bmFtZSwgbW9kaWZpZXIsIGlkZXYsIGZpZWxkKQkJCVwKICh7CQkJCQkJCQkJXAogCXN0cnVjdCBpbmV0Nl9kZXYgKl9pZGV2ID0gKGlkZXYpOwkJCQlcCiAJaWYgKGxpa2VseShfaWRldiAhPSBOVUxMKSkJCQkJCVwKIAkJU05NUF9JTkNfU1RBVFMjI21vZGlmaWVyKChfaWRldiktPnN0YXRzLnN0YXRuYW1lLCAoZmllbGQpKTsgXAotCVNOTVBfSU5DX1NUQVRTIyNtb2RpZmllcihzdGF0bmFtZSMjX3N0YXRpc3RpY3MsIChmaWVsZCkpOwlcCisJU05NUF9JTkNfU1RBVFMjI21vZGlmaWVyKChuZXQpLT5taWIuc3RhdG5hbWUjI19zdGF0aXN0aWNzLCAoZmllbGQpKTtcCiB9KQogCi0jZGVmaW5lIF9ERVZBREQoc3RhdG5hbWUsIG1vZGlmaWVyLCBpZGV2LCBmaWVsZCwgdmFsKQkJCVwKKyNkZWZpbmUgX0RFVkFERChuZXQsIHN0YXRuYW1lLCBtb2RpZmllciwgaWRldiwgZmllbGQsIHZhbCkJCVwKICh7CQkJCQkJCQkJXAogCXN0cnVjdCBpbmV0Nl9kZXYgKl9pZGV2ID0gKGlkZXYpOwkJCQlcCiAJaWYgKGxpa2VseShfaWRldiAhPSBOVUxMKSkJCQkJCVwKIAkJU05NUF9BRERfU1RBVFMjI21vZGlmaWVyKChfaWRldiktPnN0YXRzLnN0YXRuYW1lLCAoZmllbGQpLCAodmFsKSk7IFwKLQlTTk1QX0FERF9TVEFUUyMjbW9kaWZpZXIoc3RhdG5hbWUjI19zdGF0aXN0aWNzLCAoZmllbGQpLCAodmFsKSk7XAorCVNOTVBfQUREX1NUQVRTIyNtb2RpZmllcigobmV0KS0+bWliLnN0YXRuYW1lIyNfc3RhdGlzdGljcywgKGZpZWxkKSwgKHZhbCkpO1wKIH0pCiAKIC8qIE1JQnMgKi8KLURFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCBpcHN0YXRzX21pYiwgaXB2Nl9zdGF0aXN0aWNzKTsKIAotI2RlZmluZSBJUDZfSU5DX1NUQVRTKGlkZXYsZmllbGQpCV9ERVZJTkMoaXB2NiwgLCBpZGV2LCBmaWVsZCkKLSNkZWZpbmUgSVA2X0lOQ19TVEFUU19CSChpZGV2LGZpZWxkKQlfREVWSU5DKGlwdjYsIF9CSCwgaWRldiwgZmllbGQpCi0jZGVmaW5lIElQNl9BRERfU1RBVFNfQkgoaWRldixmaWVsZCx2YWwpIF9ERVZBREQoaXB2NiwgX0JILCBpZGV2LCBmaWVsZCwgdmFsKQorI2RlZmluZSBJUDZfSU5DX1NUQVRTKG5ldCwgaWRldixmaWVsZCkJCVwKKwkJX0RFVklOQyhuZXQsIGlwdjYsICwgaWRldiwgZmllbGQpCisjZGVmaW5lIElQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LGZpZWxkKQlcCisJCV9ERVZJTkMobmV0LCBpcHY2LCBfQkgsIGlkZXYsIGZpZWxkKQorI2RlZmluZSBJUDZfQUREX1NUQVRTX0JIKG5ldCwgaWRldixmaWVsZCx2YWwpCVwKKwkJX0RFVkFERChuZXQsIGlwdjYsIF9CSCwgaWRldiwgZmllbGQsIHZhbCkKIAotREVDTEFSRV9TTk1QX1NUQVQoc3RydWN0IGljbXB2Nl9taWIsIGljbXB2Nl9zdGF0aXN0aWNzKTsKLURFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCBpY21wdjZtc2dfbWliLCBpY21wdjZtc2dfc3RhdGlzdGljcyk7CisjZGVmaW5lIElDTVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIGZpZWxkKQlcCisJCV9ERVZJTkMobmV0LCBpY21wdjYsICwgaWRldiwgZmllbGQpCisjZGVmaW5lIElDTVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIGZpZWxkKQlcCisJCV9ERVZJTkMobmV0LCBpY21wdjYsIF9CSCwgaWRldiwgZmllbGQpCiAKLSNkZWZpbmUgSUNNUDZfSU5DX1NUQVRTKGlkZXYsIGZpZWxkKQlfREVWSU5DKGljbXB2NiwgLCBpZGV2LCBmaWVsZCkKLSNkZWZpbmUgSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIGZpZWxkKQlfREVWSU5DKGljbXB2NiwgX0JILCBpZGV2LCBmaWVsZCkKLQotI2RlZmluZSBJQ01QNk1TR09VVF9JTkNfU1RBVFMoaWRldiwgZmllbGQpIFwKLQlfREVWSU5DKGljbXB2Nm1zZywgLCBpZGV2LCBmaWVsZCArMjU2KQotI2RlZmluZSBJQ01QNk1TR09VVF9JTkNfU1RBVFNfQkgoaWRldiwgZmllbGQpIFwKLQlfREVWSU5DKGljbXB2Nm1zZywgX0JILCBpZGV2LCBmaWVsZCArMjU2KQotI2RlZmluZSBJQ01QNk1TR0lOX0lOQ19TVEFUUyhpZGV2LCBmaWVsZCkgXAotCSBfREVWSU5DKGljbXB2Nm1zZywgLCBpZGV2LCBmaWVsZCkKLSNkZWZpbmUgSUNNUDZNU0dJTl9JTkNfU1RBVFNfQkgoaWRldiwgZmllbGQpIFwKLQlfREVWSU5DKGljbXB2Nm1zZywgX0JILCBpZGV2LCBmaWVsZCkKKyNkZWZpbmUgSUNNUDZNU0dPVVRfSU5DX1NUQVRTKG5ldCwgaWRldiwgZmllbGQpCQlcCisJX0RFVklOQyhuZXQsIGljbXB2Nm1zZywgLCBpZGV2LCBmaWVsZCArMjU2KQorI2RlZmluZSBJQ01QNk1TR09VVF9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBmaWVsZCkJXAorCV9ERVZJTkMobmV0LCBpY21wdjZtc2csIF9CSCwgaWRldiwgZmllbGQgKzI1NikKKyNkZWZpbmUgSUNNUDZNU0dJTl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBmaWVsZCkJXAorCV9ERVZJTkMobmV0LCBpY21wdjZtc2csIF9CSCwgaWRldiwgZmllbGQpCiAKIHN0cnVjdCBpcDZfcmFfY2hhaW4KIHsKQEAgLTU3Niw2ICs1NzUsOCBAQAogZXh0ZXJuIGludCBpcDZfbWNfbXNmZ2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGdyb3VwX2ZpbHRlciAqZ3NmLAogCQkJIHN0cnVjdCBncm91cF9maWx0ZXIgX191c2VyICpvcHR2YWwsCiAJCQkgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaW5ldDZfaGFzaF9mcmFnKF9fYmUzMiBpZCwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTMyIHJuZCk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogZXh0ZXJuIGludCAgYWM2X3Byb2NfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXJkYS9pcmRhLmggYi9pbmNsdWRlL25ldC9pcmRhL2lyZGEuaAppbmRleCAwODM4NzU1Li43ZTU4MjA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcmRhL2lyZGEuaAorKysgYi9pbmNsdWRlL25ldC9pcmRhL2lyZGEuaApAQCAtNzIsNyArNzIsNyBAQAogI2RlZmluZSBJUkRBX0FTU0VSVChleHByLCBmdW5jKSBcCiBkbyB7IGlmKCEoZXhwcikpIHsgXAogCXByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzOiVzOiVkICVzXG4iLCBcCi0JCV9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXywoI2V4cHIpICk7IFwKKwkJX19GSUxFX18sX19mdW5jX18sX19MSU5FX18sKCNleHByKSApOyBcCiAJZnVuYyB9IH0gd2hpbGUgKDApCiAjZGVmaW5lIElSREFfQVNTRVJUX0xBQkVMKGxhYmVsKQlsYWJlbAogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmggYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCmluZGV4IGZmMTM3ZmQuLmQ4NjExOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaApAQCAtMTU4LDEzICsxNTgsMTcgQEAKICAqCWFsc28gaW1wbGllcyBhIGNoYW5nZSBpbiB0aGUgQUlELgogICogQEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVDogQ1RTIHByb3RlY3Rpb24gY2hhbmdlZAogICogQEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRTogcHJlYW1ibGUgY2hhbmdlZAorICogQEJTU19DSEFOR0VEX0VSUF9TTE9UOiBzbG90IHRpbWluZyBjaGFuZ2VkCiAgKiBAQlNTX0NIQU5HRURfSFQ6IDgwMi4xMW4gcGFyYW1ldGVycyBjaGFuZ2VkCisgKiBAQlNTX0NIQU5HRURfQkFTSUNfUkFURVM6IEJhc2ljIHJhdGVzZXQgY2hhbmdlZAogICovCiBlbnVtIGllZWU4MDIxMV9ic3NfY2hhbmdlIHsKIAlCU1NfQ0hBTkdFRF9BU1NPQwkJPSAxPDwwLAogCUJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVAk9IDE8PDEsCiAJQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFCT0gMTw8MiwKKwlCU1NfQ0hBTkdFRF9FUlBfU0xPVAkJPSAxPDwzLAogCUJTU19DSEFOR0VEX0hUICAgICAgICAgICAgICAgICAgPSAxPDw0LAorCUJTU19DSEFOR0VEX0JBU0lDX1JBVEVTCQk9IDE8PDUsCiB9OwogCiAvKioKQEAgLTE3Nyw2ICsxODEsNyBAQAogICogQGFpZDogYXNzb2NpYXRpb24gSUQgbnVtYmVyLCB2YWxpZCBvbmx5IHdoZW4gQGFzc29jIGlzIHRydWUKICAqIEB1c2VfY3RzX3Byb3Q6IHVzZSBDVFMgcHJvdGVjdGlvbgogICogQHVzZV9zaG9ydF9wcmVhbWJsZTogdXNlIDgwMi4xMWIgc2hvcnQgcHJlYW1ibGUKKyAqIEB1c2Vfc2hvcnRfc2xvdDogdXNlIHNob3J0IHNsb3QgdGltZSAob25seSByZWxldmFudCBmb3IgRVJQKQogICogQGR0aW1fcGVyaW9kOiBudW0gb2YgYmVhY29ucyBiZWZvcmUgdGhlIG5leHQgRFRJTSwgZm9yIFBTTQogICogQHRpbWVzdGFtcDogYmVhY29uIHRpbWVzdGFtcAogICogQGJlYWNvbl9pbnQ6IGJlYWNvbiBpbnRlcnZhbApAQCAtMTg0LDYgKzE4OSw5IEBACiAgKiBAYXNzb2NfaHQ6IGFzc29jaWF0aW9uIGluIEhUIG1vZGUKICAqIEBodF9jb25mOiBodCBjYXBhYmlsaXRpZXMKICAqIEBodF9ic3NfY29uZjogaHQgZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCisgKiBAYmFzaWNfcmF0ZXM6IGJpdG1hcCBvZiBiYXNpYyByYXRlcywgZWFjaCBiaXQgc3RhbmRzIGZvciBhbgorICoJaW5kZXggaW50byB0aGUgcmF0ZSB0YWJsZSBjb25maWd1cmVkIGJ5IHRoZSBkcml2ZXIgaW4KKyAqCXRoZSBjdXJyZW50IGJhbmQuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgewogCS8qIGFzc29jaWF0aW9uIHJlbGF0ZWQgZGF0YSAqLwpAQCAtMTkyLDEwICsyMDAsMTIgQEAKIAkvKiBlcnAgcmVsYXRlZCBkYXRhICovCiAJYm9vbCB1c2VfY3RzX3Byb3Q7CiAJYm9vbCB1c2Vfc2hvcnRfcHJlYW1ibGU7CisJYm9vbCB1c2Vfc2hvcnRfc2xvdDsKIAl1OCBkdGltX3BlcmlvZDsKIAl1MTYgYmVhY29uX2ludDsKIAl1MTYgYXNzb2NfY2FwYWJpbGl0eTsKIAl1NjQgdGltZXN0YW1wOworCXU2NCBiYXNpY19yYXRlczsKIAkvKiBodCByZWxhdGVkIGRhdGEgKi8KIAlib29sIGFzc29jX2h0OwogCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfY29uZjsKQEAgLTI4Miw2ICsyOTIsMjAgQEAKICNkZWZpbmUgSUVFRTgwMjExX1RYX0lORk9fRFJJVkVSX0RBVEFfUFRSUyBcCiAJKElFRUU4MDIxMV9UWF9JTkZPX0RSSVZFUl9EQVRBX1NJWkUgLyBzaXplb2Yodm9pZCAqKSkKIAorLyogbWF4aW11bSBudW1iZXIgb2YgYWx0ZXJuYXRlIHJhdGUgcmV0cnkgc3RhZ2VzICovCisjZGVmaW5lIElFRUU4MDIxMV9UWF9NQVhfQUxUUkFURQkzCisKKy8qKgorICogc3RydWN0IGllZWU4MDIxMV90eF9hbHRyYXRlIC0gYWx0ZXJuYXRlIHJhdGUgc2VsZWN0aW9uL3N0YXR1cworICoKKyAqIEByYXRlX2lkeDogcmF0ZSBpbmRleCB0byBhdHRlbXB0IHRvIHNlbmQgd2l0aAorICogQGxpbWl0OiBudW1iZXIgb2YgcmV0cmllcyBiZWZvcmUgZmFsbGJhY2sKKyAqLworc3RydWN0IGllZWU4MDIxMV90eF9hbHRyYXRlIHsKKwlzOCByYXRlX2lkeDsKKwl1OCBsaW1pdDsKK307CisKIC8qKgogICogc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIC0gc2tiIHRyYW5zbWl0IGluZm9ybWF0aW9uCiAgKgpAQCAtMjkwLDYgKzMxNCw5IEBACiAgKiAgKDIpIGRyaXZlciBpbnRlcm5hbCB1c2UgKGlmIGFwcGxpY2FibGUpCiAgKiAgKDMpIFRYIHN0YXR1cyBpbmZvcm1hdGlvbiAtIGRyaXZlciB0ZWxscyBtYWM4MDIxMSB3aGF0IGhhcHBlbmVkCiAgKgorICogVGhlIFRYIGNvbnRyb2wncyBzdGEgcG9pbnRlciBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgLT50eCBjYWxsLAorICogaXQgbWF5IGJlIE5VTEwuCisgKgogICogQGZsYWdzOiB0cmFuc21pdCBpbmZvIGZsYWdzLCBkZWZpbmVkIGFib3ZlCiAgKiBAYmFuZDogVEJECiAgKiBAdHhfcmF0ZV9pZHg6IFRCRApAQCAtMzE3LDE4ICszNDQsMTkgQEAKIAogCXVuaW9uIHsKIAkJc3RydWN0IHsKKwkJCS8qIE5COiB2aWYgY2FuIGJlIE5VTEwgZm9yIGluamVjdGVkIGZyYW1lcyAqLwogCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKIAkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmh3X2tleTsKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJCQl1bnNpZ25lZCBsb25nIGppZmZpZXM7Ci0JCQl1MTYgYWlkOwotCQkJczggcnRzX2N0c19yYXRlX2lkeCwgYWx0X3JldHJ5X3JhdGVfaWR4OworCQkJczggcnRzX2N0c19yYXRlX2lkeDsKIAkJCXU4IHJldHJ5X2xpbWl0OwotCQkJdTggaWN2X2xlbjsKLQkJCXU4IGl2X2xlbjsKKwkJCXN0cnVjdCBpZWVlODAyMTFfdHhfYWx0cmF0ZSByZXRyaWVzW0lFRUU4MDIxMV9UWF9NQVhfQUxUUkFURV07CiAJCX0gY29udHJvbDsKIAkJc3RydWN0IHsKIAkJCXU2NCBhbXBkdV9hY2tfbWFwOwogCQkJaW50IGFja19zaWduYWw7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2FsdHJhdGUgcmV0cmllc1tJRUVFODAyMTFfVFhfTUFYX0FMVFJBVEUgKyAxXTsKIAkJCXU4IHJldHJ5X2NvdW50OwogCQkJYm9vbCBleGNlc3NpdmVfcmV0cmllczsKIAkJCXU4IGFtcGR1X2Fja19sZW47CkBAIC0zNjMsNiArMzkxLDcgQEAKICAqIEBSWF9GTEFHX1RTRlQ6IFRoZSB0aW1lc3RhbXAgcGFzc2VkIGluIHRoZSBSWCBzdGF0dXMgKEBtYWN0aW1lIGZpZWxkKQogICoJaXMgdmFsaWQuIFRoaXMgaXMgdXNlZnVsIGluIG1vbml0b3IgbW9kZSBhbmQgbmVjZXNzYXJ5IGZvciBiZWFjb24gZnJhbWVzCiAgKgl0byBlbmFibGUgSUJTUyBtZXJnaW5nLgorICogQFJYX0ZMQUdfU0hPUlRQUkU6IFNob3J0IHByZWFtYmxlIHdhcyB1c2VkIGZvciB0aGlzIGZyYW1lCiAgKi8KIGVudW0gbWFjODAyMTFfcnhfZmxhZ3MgewogCVJYX0ZMQUdfTU1JQ19FUlJPUgk9IDE8PDAsCkBAIC0zNzMsNiArNDAyLDcgQEAKIAlSWF9GTEFHX0ZBSUxFRF9GQ1NfQ1JDCT0gMTw8NSwKIAlSWF9GTEFHX0ZBSUxFRF9QTENQX0NSQyA9IDE8PDYsCiAJUlhfRkxBR19UU0ZUCQk9IDE8PDcsCisJUlhfRkxBR19TSE9SVFBSRQk9IDE8PDgKIH07CiAKIC8qKgpAQCAtNDE4LDYgKzQ0OCwxMSBAQAogICogQElFRUU4MDIxMV9DT05GX1BTOiBFbmFibGUgODAyLjExIHBvd2VyIHNhdmUgbW9kZQogICovCiBlbnVtIGllZWU4MDIxMV9jb25mX2ZsYWdzIHsKKwkvKgorCSAqIFRPRE86IElFRUU4MDIxMV9DT05GX1NIT1JUX1NMT1RfVElNRSB3aWxsIGJlIHJlbW92ZWQgb25jZSBkcml2ZXJzCisJICogaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byB1c2UgYnNzX2luZm9fY2hhbmdlZCgpIGZvciBzbG90IHRpbWUKKwkgKiBjb25maWd1cmF0aW9uCisJICovCiAJSUVFRTgwMjExX0NPTkZfU0hPUlRfU0xPVF9USU1FCT0gKDE8PDApLAogCUlFRUU4MDIxMV9DT05GX1JBRElPVEFQCQk9ICgxPDwxKSwKIAlJRUVFODAyMTFfQ09ORl9TVVBQT1JUX0hUX01PREUJPSAoMTw8MiksCkBAIC00NjEsMzMgKzQ5Niw2IEBACiB9OwogCiAvKioKLSAqIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzIC0gdHlwZXMgb2YgODAyLjExIG5ldHdvcmsgaW50ZXJmYWNlcwotICoKLSAqIEBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEOiBpbnZhbGlkIGludGVyZmFjZSB0eXBlLCBub3QgdXNlZAotICoJYnkgbWFjODAyMTEgaXRzZWxmCi0gKiBASUVFRTgwMjExX0lGX1RZUEVfQVA6IGludGVyZmFjZSBpbiBBUCBtb2RlLgotICogQElFRUU4MDIxMV9JRl9UWVBFX01HTVQ6IHNwZWNpYWwgaW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggaG9zdGFwCi0gKglkYWVtb24uIERyaXZlcnMgc2hvdWxkIG5ldmVyIHNlZSB0aGlzIHR5cGUuCi0gKiBASUVFRTgwMjExX0lGX1RZUEVfU1RBOiBpbnRlcmZhY2UgaW4gU1RBIChjbGllbnQpIG1vZGUuCi0gKiBASUVFRTgwMjExX0lGX1RZUEVfSUJTUzogaW50ZXJmYWNlIGluIElCU1MgKGFkLWhvYykgbW9kZS4KLSAqIEBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOiBpbnRlcmZhY2UgaW4gbW9uaXRvciAocmZtb24pIG1vZGUuCi0gKiBASUVFRTgwMjExX0lGX1RZUEVfV0RTOiBpbnRlcmZhY2UgaW4gV0RTIG1vZGUuCi0gKiBASUVFRTgwMjExX0lGX1RZUEVfVkxBTjogVkxBTiBpbnRlcmZhY2UgYm91bmQgdG8gYW4gQVAsIGRyaXZlcnMKLSAqCXdpbGwgbmV2ZXIgc2VlIHRoaXMgdHlwZS4KLSAqIEBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOiA4MDIuMTFzIG1lc2ggcG9pbnQKLSAqLwotZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgewotCUlFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQsCi0JSUVFRTgwMjExX0lGX1RZUEVfQVAsCi0JSUVFRTgwMjExX0lGX1RZUEVfU1RBLAotCUlFRUU4MDIxMV9JRl9UWVBFX0lCU1MsCi0JSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVCwKLQlJRUVFODAyMTFfSUZfVFlQRV9NTlRSLAotCUlFRUU4MDIxMV9JRl9UWVBFX1dEUywKLQlJRUVFODAyMTFfSUZfVFlQRV9WTEFOLAotfTsKLQotLyoqCiAgKiBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAtIHBlci1pbnRlcmZhY2UgZGF0YQogICoKICAqIERhdGEgaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgY29udGludWFsbHkgcHJlc2VudCBmb3IgZHJpdmVyCkBAIC00OTgsNyArNTA2LDcgQEAKICAqCXNpemVvZih2b2lkICopLgogICovCiBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiB7Ci0JZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgdHlwZTsKKwllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGU7CiAJLyogbXVzdCBiZSBsYXN0ICovCiAJdTggZHJ2X3ByaXZbMF0gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oc2l6ZW9mKHZvaWQgKikpKSk7CiB9OwpAQCAtNTA2LDcgKzUxNCw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaWVlZTgwMjExX3ZpZl9pc19tZXNoKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKLQlyZXR1cm4gdmlmLT50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQ7CisJcmV0dXJuIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOwogI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtNTE3LDcgKzUyNSw3IEBACiAgKiBAdmlmOiBwb2ludGVyIHRvIGEgZHJpdmVyLXVzZSBwZXItaW50ZXJmYWNlIHN0cnVjdHVyZS4gVGhlIHBvaW50ZXIKICAqCWl0c2VsZiBpcyBhbHNvIHVzZWQgZm9yIHZhcmlvdXMgZnVuY3Rpb25zIGluY2x1ZGluZwogICoJaWVlZTgwMjExX2JlYWNvbl9nZXQoKSBhbmQgaWVlZTgwMjExX2dldF9idWZmZXJlZF9iYygpLgotICogQHR5cGU6IG9uZSBvZiAmZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgY29uc3RhbnRzLiBEZXRlcm1pbmVzIHRoZSB0eXBlIG9mCisgKiBAdHlwZTogb25lIG9mICZlbnVtIG5sODAyMTFfaWZ0eXBlIGNvbnN0YW50cy4gRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZgogICoJYWRkZWQvcmVtb3ZlZCBpbnRlcmZhY2UuCiAgKiBAbWFjX2FkZHI6IHBvaW50ZXIgdG8gTUFDIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4gVGhpcyBwb2ludGVyIGlzIHZhbGlkCiAgKgl1bnRpbCB0aGUgaW50ZXJmYWNlIGlzIHJlbW92ZWQgKGkuZS4gaXQgY2Fubm90IGJlIHVzZWQgYWZ0ZXIKQEAgLTUzMyw3ICs1NDEsNyBAQAogICogaW4gcHVyZSBtb25pdG9yIG1vZGUuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mIHsKLQllbnVtIGllZWU4MDIxMV9pZl90eXBlcyB0eXBlOworCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwogCXZvaWQgKm1hY19hZGRyOwogfTsKQEAgLTYzNywxMCArNjQ1LDEzIEBACiAgKiAJLSBUZW1wb3JhbCBFbmNyeXB0aW9uIEtleSAoMTI4IGJpdHMpCiAgKiAJLSBUZW1wb3JhbCBBdXRoZW50aWNhdG9yIFR4IE1JQyBLZXkgKDY0IGJpdHMpCiAgKiAJLSBUZW1wb3JhbCBBdXRoZW50aWNhdG9yIFJ4IE1JQyBLZXkgKDY0IGJpdHMpCi0gKgorICogQGljdl9sZW46IEZJWE1FCisgKiBAaXZfbGVuOiBGSVhNRQogICovCiBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mIHsKIAllbnVtIGllZWU4MDIxMV9rZXlfYWxnIGFsZzsKKwl1OCBpY3ZfbGVuOworCXU4IGl2X2xlbjsKIAl1OCBod19rZXlfaWR4OwogCXU4IGZsYWdzOwogCXM4IGtleWlkeDsKQEAgLTY2Miw2ICs2NzMsMzMgQEAKIH07CiAKIC8qKgorICogc3RydWN0IGllZWU4MDIxMV9zdGEgLSBzdGF0aW9uIHRhYmxlIGVudHJ5CisgKgorICogQSBzdGF0aW9uIHRhYmxlIGVudHJ5IHJlcHJlc2VudHMgYSBzdGF0aW9uIHdlIGFyZSBwb3NzaWJseQorICogY29tbXVuaWNhdGluZyB3aXRoLiBTaW5jZSBzdGF0aW9ucyBhcmUgUkNVLW1hbmFnZWQgaW4KKyAqIG1hYzgwMjExLCBhbnkgaWVlZTgwMjExX3N0YSBwb2ludGVyIHlvdSBnZXQgYWNjZXNzIHRvIG11c3QKKyAqIGVpdGhlciBiZSBwcm90ZWN0ZWQgYnkgcmN1X3JlYWRfbG9jaygpIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSwKKyAqIG9yIHlvdSBtdXN0IHRha2UgZ29vZCBjYXJlIHRvIG5vdCB1c2Ugc3VjaCBhIHBvaW50ZXIgYWZ0ZXIgYQorICogY2FsbCB0byB5b3VyIHN0YV9ub3RpZnkgY2FsbGJhY2sgdGhhdCByZW1vdmVkIGl0LgorICoKKyAqIEBhZGRyOiBNQUMgYWRkcmVzcworICogQGFpZDogQUlEIHdlIGFzc2lnbmVkIHRvIHRoZSBzdGF0aW9uIGlmIHdlJ3JlIGFuIEFQCisgKiBAc3VwcF9yYXRlczogQml0bWFwIG9mIHN1cHBvcnRlZCByYXRlcyAocGVyIGJhbmQpCisgKiBAaHRfaW5mbzogSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBCisgKiBAZHJ2X3ByaXY6IGRhdGEgYXJlYSBmb3IgZHJpdmVyIHVzZSwgd2lsbCBhbHdheXMgYmUgYWxpZ25lZCB0bworICoJc2l6ZW9mKHZvaWQgKiksIHNpemUgaXMgZGV0ZXJtaW5lZCBpbiBodyBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGllZWU4MDIxMV9zdGEgeworCXU2NCBzdXBwX3JhdGVzW0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXU4IGFkZHJbRVRIX0FMRU5dOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9odF9pbmZvIGh0X2luZm87CisKKwkvKiBtdXN0IGJlIGxhc3QgKi8KKwl1OCBkcnZfcHJpdlswXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2Yodm9pZCAqKSkpKTsKK307CisKKy8qKgogICogZW51bSBzdGFfbm90aWZ5X2NtZCAtIHN0YSBub3RpZnkgY29tbWFuZAogICoKICAqIFVzZWQgd2l0aCB0aGUgc3RhX25vdGlmeSgpIGNhbGxiYWNrIGluICZzdHJ1Y3QgaWVlZTgwMjExX29wcywgdGhpcwpAQCAtODA1LDYgKzg0MywxMSBAQAogICoKICAqIEB2aWZfZGF0YV9zaXplOiBzaXplIChpbiBieXRlcykgb2YgdGhlIGRydl9wcml2IGRhdGEgYXJlYQogICoJd2l0aGluICZzdHJ1Y3QgaWVlZTgwMjExX3ZpZi4KKyAqIEBzdGFfZGF0YV9zaXplOiBzaXplIChpbiBieXRlcykgb2YgdGhlIGRydl9wcml2IGRhdGEgYXJlYQorICoJd2l0aGluICZzdHJ1Y3QgaWVlZTgwMjExX3N0YS4KKyAqCisgKiBAbWF4X2FsdHJhdGVzOiBtYXhpbXVtIG51bWJlciBvZiBhbHRlcm5hdGUgcmF0ZSByZXRyeSBzdGFnZXMKKyAqIEBtYXhfYWx0cmF0ZV90cmllczogbWF4aW11bSBudW1iZXIgb2YgdHJpZXMgZm9yIGVhY2ggc3RhZ2UKICAqLwogc3RydWN0IGllZWU4MDIxMV9odyB7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mIGNvbmY7CkBAIC04MTYsMTIgKzg1OSwxNyBAQAogCXVuc2lnbmVkIGludCBleHRyYV90eF9oZWFkcm9vbTsKIAlpbnQgY2hhbm5lbF9jaGFuZ2VfdGltZTsKIAlpbnQgdmlmX2RhdGFfc2l6ZTsKKwlpbnQgc3RhX2RhdGFfc2l6ZTsKIAl1MTYgcXVldWVzOwogCXUxNiBhbXBkdV9xdWV1ZXM7CiAJdTE2IG1heF9saXN0ZW5faW50ZXJ2YWw7CiAJczggbWF4X3NpZ25hbDsKKwl1OCBtYXhfYWx0cmF0ZXM7CisJdTggbWF4X2FsdHJhdGVfdHJpZXM7CiB9OwogCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICp3aXBoeV90b19odyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKKwogLyoqCiAgKiBTRVRfSUVFRTgwMjExX0RFViAtIHNldCBkZXZpY2UgZm9yIDgwMi4xMSBoYXJkd2FyZQogICoKQEAgLTg3NCwxMSArOTIyLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9yYXRlICoKIGllZWU4MDIxMV9nZXRfYWx0X3JldHJ5X3JhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqYykKKwkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpjLCBpbnQgaWR4KQogewotCWlmIChjLT5jb250cm9sLmFsdF9yZXRyeV9yYXRlX2lkeCA8IDApCisJaWYgKGMtPmNvbnRyb2wucmV0cmllc1tpZHhdLnJhdGVfaWR4IDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICZody0+d2lwaHktPmJhbmRzW2MtPmJhbmRdLT5iaXRyYXRlc1tjLT5jb250cm9sLmFsdF9yZXRyeV9yYXRlX2lkeF07CisJcmV0dXJuICZody0+d2lwaHktPmJhbmRzW2MtPmJhbmRdLT5iaXRyYXRlc1tjLT5jb250cm9sLnJldHJpZXNbaWR4XS5yYXRlX2lkeF07CiB9CiAKIC8qKgpAQCAtMTA5Nyw3ICsxMTQ1LDcgQEAKICAqCVRoaXMgY2FsbGJhY2sgbXVzdCBiZSBpbXBsZW1lbnRlZCBhbmQgYXRvbWljLgogICoKICAqIEBzZXRfdGltOiBTZXQgVElNIGJpdC4gbWFjODAyMTEgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGEgVElNIGJpdAotICogCW11c3QgYmUgc2V0IG9yIGNsZWFyZWQgZm9yIGEgZ2l2ZW4gQUlELiBNdXN0IGJlIGF0b21pYy4KKyAqIAltdXN0IGJlIHNldCBvciBjbGVhcmVkIGZvciBhIGdpdmVuIFNUQS4gTXVzdCBiZSBhdG9taWMuCiAgKgogICogQHNldF9rZXk6IFNlZSB0aGUgc2VjdGlvbiAiSGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJhdGlvbiIKICAqCVRoaXMgY2FsbGJhY2sgY2FuIHNsZWVwLCBhbmQgaXMgb25seSBjYWxsZWQgYmV0d2VlbiBhZGRfaW50ZXJmYWNlCkBAIC0xMTExLDcgKzExNTksOSBAQAogICogQGh3X3NjYW46IEFzayB0aGUgaGFyZHdhcmUgdG8gc2VydmljZSB0aGUgc2NhbiByZXF1ZXN0LCBubyBuZWVkIHRvIHN0YXJ0CiAgKgl0aGUgc2NhbiBzdGF0ZSBtYWNoaW5lIGluIHN0YWNrLiBUaGUgc2NhbiBtdXN0IGhvbm91ciB0aGUgY2hhbm5lbAogICoJY29uZmlndXJhdGlvbiBkb25lIGJ5IHRoZSByZWd1bGF0b3J5IGFnZW50IGluIHRoZSB3aXBoeSdzIHJlZ2lzdGVyZWQKLSAqCWJhbmRzLgorICoJYmFuZHMuIFdoZW4gdGhlIHNjYW4gZmluaXNoZXMsIGllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZCgpIG11c3QgYmUKKyAqCWNhbGxlZDsgbm90ZSB0aGF0IGl0IGFsc28gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgc2NhbiBjYW5ub3QgZmluaXNoCisgKgliZWNhdXNlIHRoZSBoYXJkd2FyZSBpcyB0dXJuZWQgb2ZmISBBbnl0aGluZyBlbHNlIGlzIGEgYnVnIQogICoKICAqIEBnZXRfc3RhdHM6IHJldHVybiBsb3ctbGV2ZWwgc3RhdGlzdGljcwogICoKQEAgLTExMzEsNyArMTE4MSw3IEBACiAgKglvZiBhc3NvY2FpdGVkIHN0YXRpb24gb3IgQVAuCiAgKgogICogQGNvbmZfdHg6IENvbmZpZ3VyZSBUWCBxdWV1ZSBwYXJhbWV0ZXJzIChFRENGIChhaWZzLCBjd19taW4sIGN3X21heCksCi0gKglidXJzdGluZykgZm9yIGEgaGFyZHdhcmUgVFggcXVldWUuIE11c3QgYmUgYXRvbWljLgorICoJYnVyc3RpbmcpIGZvciBhIGhhcmR3YXJlIFRYIHF1ZXVlLgogICoKICAqIEBnZXRfdHhfc3RhdHM6IEdldCBzdGF0aXN0aWNzIG9mIHRoZSBjdXJyZW50IFRYIHF1ZXVlIHN0YXR1cy4gVGhpcyBpcyB1c2VkCiAgKgl0byBnZXQgbnVtYmVyIG9mIGN1cnJlbnRseSBxdWV1ZWQgcGFja2V0cyAocXVldWUgbGVuZ3RoKSwgbWF4aW11bSBxdWV1ZQpAQCAtMTE4MSw3ICsxMjMxLDggQEAKIAkJCQkgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCiAJCQkJIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCiAJCQkJIGludCBtY19jb3VudCwgc3RydWN0IGRldl9hZGRyX2xpc3QgKm1jX2xpc3QpOwotCWludCAoKnNldF90aW0pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgYWlkLCBpbnQgc2V0KTsKKwlpbnQgKCpzZXRfdGltKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgICAgIGJvb2wgc2V0KTsKIAlpbnQgKCpzZXRfa2V5KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCiAJCSAgICAgICBjb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOwpAQCAtMTE5OCw3ICsxMjQ5LDcgQEAKIAlpbnQgKCpzZXRfcmV0cnlfbGltaXQpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgIHUzMiBzaG9ydF9yZXRyeSwgdTMyIGxvbmdfcmV0cik7CiAJdm9pZCAoKnN0YV9ub3RpZnkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJZW51bSBzdGFfbm90aWZ5X2NtZCwgY29uc3QgdTggKmFkZHIpOworCQkJZW51bSBzdGFfbm90aWZ5X2NtZCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiAJaW50ICgqY29uZl90eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZSwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOwogCWludCAoKmdldF90eF9zdGF0cykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0xMjA4LDcgKzEyNTksNyBAQAogCWludCAoKnR4X2xhc3RfYmVhY29uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJaW50ICgqYW1wZHVfYWN0aW9uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCi0JCQkgICAgY29uc3QgdTggKmFkZHIsIHUxNiB0aWQsIHUxNiAqc3NuKTsKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbik7CiB9OwogCiAvKioKQEAgLTE1NTcsMTYgKzE2MDgsNiBAQAogdW5zaWduZWQgaW50IGllZWU4MDIxMV9nZXRfaGRybGVuX2Zyb21fc2tiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOwogCiAvKioKLSAqIGllZWU4MDIxMV9nZXRfaGRybGVuIC0gZ2V0IGhlYWRlciBsZW5ndGggZnJvbSBmcmFtZSBjb250cm9sCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSA4MDIuMTEgaGVhZGVyIGxlbmd0aCBpbiBieXRlcyAobm90IGluY2x1ZGluZwotICogZW5jcnlwdGlvbiBoZWFkZXJzLikKLSAqCi0gKiBAZmM6IHRoZSBmcmFtZSBjb250cm9sIGZpZWxkIChpbiBDUFUgZW5kaWFubmVzcykKLSAqLwotaW50IGllZWU4MDIxMV9nZXRfaGRybGVuKHUxNiBmYyk7Ci0KLS8qKgogICogaWVlZTgwMjExX2hkcmxlbiAtIGdldCBoZWFkZXIgbGVuZ3RoIGluIGJ5dGVzIGZyb20gZnJhbWUgY29udHJvbAogICogQGZjOiBmcmFtZSBjb250cm9sIGZpZWxkIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0CiAgKi8KQEAgLTE2MDgsNiArMTY0OSwxNiBAQAogdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHF1ZXVlKTsKIAogLyoqCisgKiBpZWVlODAyMTFfcXVldWVfc3RvcHBlZCAtIHRlc3Qgc3RhdHVzIG9mIHRoZSBxdWV1ZQorICogQGh3OiBwb2ludGVyIGFzIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCisgKiBAcXVldWU6IHF1ZXVlIG51bWJlciAoY291bnRlZCBmcm9tIHplcm8pLgorICoKKyAqIERyaXZlcnMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgbmV0aWZfc3RvcF9xdWV1ZS4KKyAqLworCitpbnQgaWVlZTgwMjExX3F1ZXVlX3N0b3BwZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGludCBxdWV1ZSk7CisKKy8qKgogICogaWVlZTgwMjExX3N0b3BfcXVldWVzIC0gc3RvcCBhbGwgcXVldWVzCiAgKiBAaHc6IHBvaW50ZXIgYXMgb2J0YWluZWQgZnJvbSBpZWVlODAyMTFfYWxsb2NfaHcoKS4KICAqCkBAIC0xNzU4LDQgKzE4MDksODUgQEAKICAqLwogdm9pZCBpZWVlODAyMTFfbm90aWZ5X21hYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgZW51bSBpZWVlODAyMTFfbm90aWZpY2F0aW9uX3R5cGVzICBub3RpZl90eXBlKTsKKworLyoqCisgKiBpZWVlODAyMTFfZmluZF9zdGEgLSBmaW5kIGEgc3RhdGlvbgorICoKKyAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpCisgKiBAYWRkcjogc3RhdGlvbidzIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHVuZGVyIFJDVSBsb2NrIGFuZCB0aGUKKyAqIHJlc3VsdGluZyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgdW5kZXIgUkNVIGxvY2sgYXMgd2VsbC4KKyAqLworc3RydWN0IGllZWU4MDIxMV9zdGEgKmllZWU4MDIxMV9maW5kX3N0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIGNvbnN0IHU4ICphZGRyKTsKKworCisvKiBSYXRlIGNvbnRyb2wgQVBJICovCisvKioKKyAqIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAtIHJhdGUgaW5mb3JtYXRpb24gZm9yL2Zyb20gcmF0ZSBjb250cm9sIGFsZ29yaXRobXMKKyAqCisgKiBAcmF0ZV9pZHg6IHNlbGVjdGVkIHRyYW5zbWlzc2lvbiByYXRlIGluZGV4CisgKiBAbm9uZXJwX2lkeDogTm9uLUVSUCByYXRlIHRvIHVzZSBpbnN0ZWFkIGlmIEVSUCBjYW5ub3QgYmUgdXNlZAorICogQHByb2JlX2lkeDogcmF0ZSBmb3IgcHJvYmluZyAob3IgLTEpCisgKiBAbWF4X3JhdGVfaWR4OiBtYXhpbXVtIHJhdGUgaW5kZXggdGhhdCBjYW4gYmUgdXNlZCwgdGhpcyBpcworICoJaW5wdXQgdG8gdGhlIGFsZ29yaXRobSBhbmQgd2lsbCBiZSBlbmZvcmNlZAorICovCitzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24geworCXM4IHJhdGVfaWR4LCBub25lcnBfaWR4LCBwcm9iZV9pZHgsIG1heF9yYXRlX2lkeDsKK307CisKK3N0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHsKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICooKmFsbG9jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRlbnRyeSAqZGVidWdmc2Rpcik7CisJdm9pZCAoKmNsZWFyKSh2b2lkICpwcml2KTsKKwl2b2lkICgqZnJlZSkodm9pZCAqcHJpdik7CisKKwl2b2lkICooKmFsbG9jX3N0YSkodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgZ2ZwX3QgZ2ZwKTsKKwl2b2lkICgqcmF0ZV9pbml0KSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEpOworCXZvaWQgKCpmcmVlX3N0YSkodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSB2b2lkICpwcml2X3N0YSk7CisKKwl2b2lkICgqdHhfc3RhdHVzKSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworCXZvaWQgKCpnZXRfcmF0ZSkodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24gKnNlbCk7CisKKwl2b2lkICgqYWRkX3N0YV9kZWJ1Z2ZzKSh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpOworCXZvaWQgKCpyZW1vdmVfc3RhX2RlYnVnZnMpKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHJhdGVfc3VwcG9ydGVkKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCQkgaW50IGluZGV4KQoreworCXJldHVybiAoc3RhID09IE5VTEwgfHwgc3RhLT5zdXBwX3JhdGVzW2JhbmRdICYgQklUKGluZGV4KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczgKK3JhdGVfbG93ZXN0X2luZGV4KHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykKKwkJaWYgKHJhdGVfc3VwcG9ydGVkKHN0YSwgc2JhbmQtPmJhbmQsIGkpKQorCQkJcmV0dXJuIGk7CisKKwkvKiB3YXJuIHdoZW4gd2UgY2Fubm90IGZpbmQgYSByYXRlLiAqLworCVdBUk5fT04oMSk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcihzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyAqb3BzKTsKK3ZvaWQgaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzICpvcHMpOworCiAjZW5kaWYgLyogTUFDODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmRpc2MuaCBiL2luY2x1ZGUvbmV0L25kaXNjLmgKaW5kZXggYTAxYjdjNC4uMTFkZDAxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmRpc2MuaAorKysgYi9pbmNsdWRlL25ldC9uZGlzYy5oCkBAIC0xMjksOSArMTI5LDggQEAKIAkJCQkJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJCQkJCSAgIHNpemVfdCAqbGVucCwKIAkJCQkJCQkgICBsb2ZmX3QgKnBwb3MpOwotaW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsIGludCBfX3VzZXIgKm5hbWUsCi0JCQkJIGludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLAotCQkJCSBzaXplX3QgX191c2VyICpvbGRsZW5wLAoraW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsCisJCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaAppbmRleCBhOGViNDNjLi43MDgwMDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCkBAIC0xNiw2ICsxNiw5IEBACiAjaW5jbHVkZSA8bmV0L25ldG5zL2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZGNjcC5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy94X3RhYmxlcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvbmV0bnMvY29ubnRyYWNrLmg+CisjZW5kaWYKIAogc3RydWN0IHByb2NfZGlyX2VudHJ5Owogc3RydWN0IG5ldF9kZXZpY2U7CkBAIC02Nyw2ICs3MCw5IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJc3RydWN0IG5ldG5zX3h0CQl4dDsKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisJc3RydWN0IG5ldG5zX2N0CQljdDsKKyNlbmRpZgogI2VuZGlmCiAJc3RydWN0IG5ldF9nZW5lcmljCSpnZW47CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfZGVmcmFnX2lwdjQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2RlZnJhZ19pcHY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwMGVhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2RlZnJhZ19pcHY0LmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9ORl9ERUZSQUdfSVBWNF9ICisjZGVmaW5lIF9ORl9ERUZSQUdfSVBWNF9ICisKK2V4dGVybiB2b2lkIG5mX2RlZnJhZ19pcHY0X2VuYWJsZSh2b2lkKTsKKworI2VuZGlmIC8qIF9ORl9ERUZSQUdfSVBWNF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggMDc0MWFkNS4uYjc2YTg2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMTIzLDcgKzEyMyw5IEBACiAKIAkvKiBFeHRlbnNpb25zICovCiAJc3RydWN0IG5mX2N0X2V4dCAqZXh0OwotCisjaWZkZWYgQ09ORklHX05FVF9OUworCXN0cnVjdCBuZXQgKmN0X25ldDsKKyNlbmRpZgogCXN0cnVjdCByY3VfaGVhZCByY3U7CiB9OwogCkBAIC0xNDcsNiArMTQ5LDE3IEBACiAvKiBnZXQgbWFzdGVyIGNvbm50cmFjayB2aWEgbWFzdGVyIGV4cGVjdGF0aW9uICovCiAjZGVmaW5lIG1hc3Rlcl9jdChjb25udHIpIChjb25udHItPm1hc3RlcikKIAorZXh0ZXJuIHN0cnVjdCBuZXQgaW5pdF9uZXQ7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqbmZfY3RfbmV0KGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKyNpZmRlZiBDT05GSUdfTkVUX05TCisJcmV0dXJuIGN0LT5jdF9uZXQ7CisjZWxzZQorCXJldHVybiAmaW5pdF9uZXQ7CisjZW5kaWYKK30KKwogLyogQWx0ZXIgcmVwbHkgdHVwbGUgKG1heWJlIGFsdGVyIGhlbHBlcikuICovCiBleHRlcm4gdm9pZAogbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBuZl9jb25uICpjdCwKQEAgLTE4MiwxMSArMTk1LDExIEBACiAJCQkJIHVuc2lnbmVkIGludCBzaXplKTsKIAogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCi1fX25mX2Nvbm50cmFja19maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKK19fbmZfY29ubnRyYWNrX2ZpbmQoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CiAKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgbmZfY29ubiAqY3QpOwogCi1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZmx1c2godm9pZCk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZmx1c2goc3RydWN0IG5ldCAqbmV0KTsKIAogZXh0ZXJuIGJvb2wgbmZfY3RfZ2V0X3R1cGxlcHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBuaG9mZiwgdV9pbnQxNl90IGwzbnVtLApAQCAtMjQ4LDEwICsyNjEsMTEgQEAKIAogLyogSXRlcmF0ZSBvdmVyIGFsbCBjb25udHJhY2tzOiBpZiBpdGVyIHJldHVybnMgdHJ1ZSwgaXQncyBkZWxldGVkLiAqLwogZXh0ZXJuIHZvaWQKLW5mX2N0X2l0ZXJhdGVfY2xlYW51cChpbnQgKCppdGVyKShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOworbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCwgaW50ICgqaXRlcikoc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19mcmVlKHN0cnVjdCBuZl9jb25uICpjdCk7CiBleHRlcm4gc3RydWN0IG5mX2Nvbm4gKgotbmZfY29ubnRyYWNrX2FsbG9jKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcsCituZl9jb25udHJhY2tfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAorCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnLAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXBsLAogCQkgICBnZnBfdCBnZnApOwogCkBAIC0yNzMsMTYgKzI4NywxNCBAQAogCiBleHRlcm4gaW50IG5mX2Nvbm50cmFja19zZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLWV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2NoZWNrc3VtOwotZXh0ZXJuIGF0b21pY190IG5mX2Nvbm50cmFja19jb3VudDsKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX21heDsKIAotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwotI2RlZmluZSBORl9DVF9TVEFUX0lOQyhjb3VudCkgKF9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX3N0YXQpLmNvdW50KyspCi0jZGVmaW5lIE5GX0NUX1NUQVRfSU5DX0FUT01JQyhjb3VudCkJCQlcCisjZGVmaW5lIE5GX0NUX1NUQVRfSU5DKG5ldCwgY291bnQpCVwKKwkocGVyX2NwdV9wdHIoKG5ldCktPmN0LnN0YXQsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpLT5jb3VudCsrKQorI2RlZmluZSBORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBjb3VudCkJCVwKIGRvIHsJCQkJCQkJXAogCWxvY2FsX2JoX2Rpc2FibGUoKTsJCQkJXAotCV9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX3N0YXQpLmNvdW50Kys7CVwKKwlwZXJfY3B1X3B0cigobmV0KS0+Y3Quc3RhdCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSktPmNvdW50Kys7CVwKIAlsb2NhbF9iaF9lbmFibGUoKTsJCQkJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAppbmRleCA1ZDVhZTU1Li4wM2UyMThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaApAQCAtOCw2ICs4LDcgQEAKIAogI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0FDQ1RfSAogI2RlZmluZSBfTkZfQ09OTlRSQUNLX0FDQ1RfSAorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CkBAIC0xOCw4ICsxOSw2IEBACiAJdV9pbnQ2NF90IGJ5dGVzOwogfTsKIAotZXh0ZXJuIGludCBuZl9jdF9hY2N0OwotCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3QgbmZfY29ubl9jb3VudGVyICpuZl9jb25uX2FjY3RfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CkBAIC0yOSw5ICsyOCwxMCBAQAogc3RhdGljIGlubGluZQogc3RydWN0IG5mX2Nvbm5fY291bnRlciAqbmZfY3RfYWNjdF9leHRfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZ2ZwX3QgZ2ZwKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJc3RydWN0IG5mX2Nvbm5fY291bnRlciAqYWNjdDsKIAotCWlmICghbmZfY3RfYWNjdCkKKwlpZiAoIW5ldC0+Y3Quc3lzY3RsX2FjY3QpCiAJCXJldHVybiBOVUxMOwogCiAJYWNjdCA9IG5mX2N0X2V4dF9hZGQoY3QsIE5GX0NUX0VYVF9BQ0NULCBnZnApOwpAQCAtNDUsNyArNDUsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludAogc2VxX3ByaW50X2FjY3Qoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIGludCBkaXIpOwogCi1leHRlcm4gaW50IG5mX2Nvbm50cmFja19hY2N0X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfYWNjdF9maW5pKHZvaWQpOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfYWNjdF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfYWNjdF9maW5pKHN0cnVjdCBuZXQgKm5ldCk7CiAKICNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0FDQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAppbmRleCBhODE3NzEyLi5lNzhhZmU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaApAQCAtMjAsMTIgKzIwLDEzIEBACiAvKiBUaGlzIGhlYWRlciBpcyB1c2VkIHRvIHNoYXJlIGNvcmUgZnVuY3Rpb25hbGl0eSBiZXR3ZWVuIHRoZQogICAgc3RhbmRhbG9uZSBjb25uZWN0aW9uIHRyYWNraW5nIG1vZHVsZSwgYW5kIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyJ3MgdXNlCiAgICBvZiBjb25uZWN0aW9uIHRyYWNraW5nLiAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaW4oaW50IHBmLAorZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaW4oc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgICB1X2ludDhfdCBwZiwKIAkJCQkgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOwogCi1leHRlcm4gaW50IG5mX2Nvbm50cmFja19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cChzdHJ1Y3QgbmV0ICpuZXQpOwogCiBleHRlcm4gaW50IG5mX2Nvbm50cmFja19wcm90b19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3Byb3RvX2Zpbmkodm9pZCk7CkBAIC00OCw3ICs0OSw3IEBACiAKIC8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKK25mX2Nvbm50cmFja19maW5kX2dldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKIAogZXh0ZXJuIGludCBfX25mX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICpza2IpOwogCkBAIC03MSw4ICs3Miw2IEBACiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnByb3RvKTsKIAotZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkICpuZl9jb25udHJhY2tfaGFzaDsKIGV4dGVybiBzcGlubG9ja190IG5mX2Nvbm50cmFja19sb2NrIDsKLWV4dGVybiBzdHJ1Y3QgaGxpc3RfaGVhZCB1bmNvbmZpcm1lZDsKIAogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaAppbmRleCBmMGI5MDc4Li4xMjg1ZmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CiAKICNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUwpAQCAtMTUsOSArMTYsNiBAQAogCXN0cnVjdCBuZl9jb25uICpjdDsKIAl1bnNpZ25lZCBpbnQgZXZlbnRzOwogfTsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSwgbmZfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLSNkZWZpbmUgQ09OTlRSQUNLX0VDQUNIRSh4KQkoX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKS54KQogCiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19jaGFpbjsKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpAQCAtMjUsMTcgKzIzLDE2IEBACiAKIGV4dGVybiB2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOwogZXh0ZXJuIHZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCk7Ci1leHRlcm4gdm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKTsKK2V4dGVybiB2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKXNrYi0+bmZjdDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JZWNhY2hlID0gJl9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSk7CisJZWNhY2hlID0gcGVyX2NwdV9wdHIobmV0LT5jdC5lY2FjaGUsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmIChjdCAhPSBlY2FjaGUtPmN0KQogCQlfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoY3QpOwogCWVjYWNoZS0+ZXZlbnRzIHw9IGV2ZW50OwpAQCAtNjAsMTYgKzU3LDI4IEBACiAJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2N0X2V4cGVjdF9jaGFpbiwgZXZlbnQsIGV4cCk7CiB9CiAKK2V4dGVybiBpbnQgbmZfY29ubnRyYWNrX2VjYWNoZV9pbml0KHN0cnVjdCBuZXQgKm5ldCk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZWNhY2hlX2Zpbmkoc3RydWN0IG5ldCAqbmV0KTsKKwogI2Vsc2UgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQorCQkJCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0KSB7fQogc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudChlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCiAJCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KSB7fQogc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCiAJCQkJICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCkge30KKworc3RhdGljIGlubGluZSBpbnQgbmZfY29ubnRyYWNrX2VjYWNoZV9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19lY2FjaGVfZmluaShzdHJ1Y3QgbmV0ICpuZXQpCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KIAogI2VuZGlmIC8qX05GX0NPTk5UUkFDS19FQ0FDSEVfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaAppbmRleCBkZmRmNGI0Li4zN2E3ZmMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmgKQEAgLTYsNyArNiw2IEBACiAjZGVmaW5lIF9ORl9DT05OVFJBQ0tfRVhQRUNUX0gKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogCi1leHRlcm4gc3RydWN0IGhsaXN0X2hlYWQgKm5mX2N0X2V4cGVjdF9oYXNoOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9leHBlY3RfaHNpemU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2V4cGVjdF9tYXg7CiAKQEAgLTU2LDYgKzU1LDE1IEBACiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqbmZfY3RfZXhwX25ldChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworI2lmZGVmIENPTkZJR19ORVRfTlMKKwlyZXR1cm4gZXhwLT5tYXN0ZXItPmN0X25ldDsJLyogYnkgZGVmaW5pdGlvbiAqLworI2Vsc2UKKwlyZXR1cm4gJmluaXRfbmV0OworI2VuZGlmCit9CisKIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0X3BvbGljeQogewogCXVuc2lnbmVkIGludAltYXhfZXhwZWN0ZWQ7CkBAIC02NywxNyArNzUsMTcgQEAKICNkZWZpbmUgTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVAkweDEKICNkZWZpbmUgTkZfQ1RfRVhQRUNUX0lOQUNUSVZFCTB4MgogCi1pbnQgbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHZvaWQpOwotdm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X2Zpbmkodm9pZCk7CitpbnQgbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHN0cnVjdCBuZXQgKm5ldCk7Cit2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfZmluaShzdHJ1Y3QgbmV0ICpuZXQpOwogCiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCi1fX25mX2N0X2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKK19fbmZfY3RfZXhwZWN0X2ZpbmQoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CiAKIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLW5mX2N0X2V4cGVjdF9maW5kX2dldChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CituZl9jdF9leHBlY3RfZmluZF9nZXQoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CiAKIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLW5mX2N0X2ZpbmRfZXhwZWN0YXRpb24oY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOworbmZfY3RfZmluZF9leHBlY3RhdGlvbihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKIAogdm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOwogdm9pZCBuZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKHN0cnVjdCBuZl9jb25uICpjdCk7CkBAIC04Niw3ICs5NCw3IEBACiAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW4gZXhwZWN0YXRpb246IHRoaXMgaXMgbWFuZGF0b3J5IGJlZm9yZSBjYWxsaW5nCiAgICBuZl9jdF9leHBlY3RfcmVsYXRlZC4gIFlvdSB3aWxsIGhhdmUgdG8gY2FsbCBwdXQgYWZ0ZXJ3YXJkcy4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpuZl9jdF9leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1lKTsKLXZvaWQgbmZfY3RfZXhwZWN0X2luaXQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKiwgdW5zaWduZWQgaW50LCBpbnQsCit2b2lkIG5mX2N0X2V4cGVjdF9pbml0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICosIHVuc2lnbmVkIGludCwgdV9pbnQ4X3QsCiAJCSAgICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKiwKIAkJICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqLAogCQkgICAgICAgdV9pbnQ4X3QsIGNvbnN0IF9fYmUxNiAqLCBjb25zdCBfX2JlMTYgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCmluZGV4IDcyM2RmOWQuLjdmMmY0M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCkBAIC0zOSw3ICszOSw3IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgaW50IHBmLAorCQkgICAgICB1X2ludDhfdCBwZiwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOwogCiAJLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZDsKQEAgLTUwLDkgKzUwLDkgQEAKIAkvKiBDYWxsZWQgd2hlbiBhIGNvbm50cmFjayBlbnRyeSBpcyBkZXN0cm95ZWQgKi8KIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mX2Nvbm4gKmN0KTsKIAotCWludCAoKmVycm9yKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwlpbnQgKCplcnJvcikoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKIAkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JCSAgICAgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSk7CisJCSAgICAgdV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rbnVtKTsKIAogCS8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiBSZXR1cm4gbGlrZSBzZXFfKiAqLwogCWludCAoKnByaW50X3R1cGxlKShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCkBAIC0xMTcsMjAgKzExNywxOSBAQAogCQkJCSAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mX2N0X3BvcnRfbmxhX3BvbGljeVtdOwogCi0vKiBMb2cgaW52YWxpZCBwYWNrZXRzICovCi1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X2xvZ19pbnZhbGlkOwotCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogI2lmZGVmIERFQlVHX0lOVkFMSURfUEFDS0VUUwotI2RlZmluZSBMT0dfSU5WQUxJRChwcm90bykgXAotCShuZl9jdF9sb2dfaW52YWxpZCA9PSAocHJvdG8pIHx8IG5mX2N0X2xvZ19pbnZhbGlkID09IElQUFJPVE9fUkFXKQorI2RlZmluZSBMT0dfSU5WQUxJRChuZXQsIHByb3RvKQkJCQlcCisJKChuZXQpLT5jdC5zeXNjdGxfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fAlcCisJIChuZXQpLT5jdC5zeXNjdGxfbG9nX2ludmFsaWQgPT0gSVBQUk9UT19SQVcpCiAjZWxzZQotI2RlZmluZSBMT0dfSU5WQUxJRChwcm90bykgXAotCSgobmZfY3RfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fCBuZl9jdF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykgXAorI2RlZmluZSBMT0dfSU5WQUxJRChuZXQsIHByb3RvKQkJCQlcCisJKCgobmV0KS0+Y3Quc3lzY3RsX2xvZ19pbnZhbGlkID09IChwcm90bykgfHwJXAorCSAgKG5ldCktPmN0LnN5c2N0bF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykJXAogCSAmJiBuZXRfcmF0ZWxpbWl0KCkpCiAjZW5kaWYKICNlbHNlCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSAwCisjZGVmaW5lIExPR19JTlZBTElEKG5ldCwgcHJvdG8pIDAKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKICNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfUFJPVE9DT0xfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKaW5kZXggOGM2YjVhZS4uNzE4MmMwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaApAQCAtMjgsNyArMjgsNyBAQAogCX0gdTsKIH07CiAKLXR5cGVkZWYgdm9pZCBuZl9sb2dmbih1bnNpZ25lZCBpbnQgcGYsCit0eXBlZGVmIHZvaWQgbmZfbG9nZm4odV9pbnQ4X3QgcGYsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAogCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCkBAIC00MywxMiArNDMsMTIgQEAKIH07CiAKIC8qIEZ1bmN0aW9uIHRvIHJlZ2lzdGVyL3VucmVnaXN0ZXIgbG9nIGZ1bmN0aW9uLiAqLwotaW50IG5mX2xvZ19yZWdpc3RlcihpbnQgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcik7CitpbnQgbmZfbG9nX3JlZ2lzdGVyKHVfaW50OF90IHBmLCBjb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwogdm9pZCBuZl9sb2dfdW5yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwotdm9pZCBuZl9sb2dfdW5yZWdpc3Rlcl9wZihpbnQgcGYpOwordm9pZCBuZl9sb2dfdW5yZWdpc3Rlcl9wZih1X2ludDhfdCBwZik7CiAKIC8qIENhbGxzIHRoZSByZWdpc3RlcmVkIGJhY2tlbmQgbG9nZ2luZyBmdW5jdGlvbiAqLwotdm9pZCBuZl9sb2dfcGFja2V0KGludCBwZiwKK3ZvaWQgbmZfbG9nX3BhY2tldCh1X2ludDhfdCBwZiwKIAkJICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCSAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmgKaW5kZXggZjI5ZWViOS4uNTg2ODQwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmgKQEAgLTI1LDQgKzI1LDEyIEBACiAJZWxzZQogCQlyZXR1cm4gdGVzdF9iaXQoSVBTX0RTVF9OQVRfRE9ORV9CSVQsICZjdC0+c3RhdHVzKTsKIH0KKworc3RydWN0IG5sYXR0cjsKKworZXh0ZXJuIGludAorKCpuZm5ldGxpbmtfcGFyc2VfbmF0X3NldHVwX2hvb2spKHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXAsCisJCQkJICBzdHJ1Y3QgbmxhdHRyICphdHRyKTsKKwogI2VuZGlmIC8qIF9ORl9OQVRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5oCmluZGV4IGQwMzAwNDQuLjI1MmZkMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5oCkBAIC04LDcgKzgsNyBAQAogCXVuc2lnbmVkIGludAkJaWQ7CiAKIAlzdHJ1Y3QgbmZfaG9va19vcHMJKmVsZW07Ci0JaW50CQkJcGY7CisJdV9pbnQ4X3QJCXBmOwogCXVuc2lnbmVkIGludAkJaG9vazsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqaW5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UJKm91dGRldjsKQEAgLTI0LDkgKzI0LDkgQEAKIAljaGFyCQkJKm5hbWU7CiB9OwogCi1leHRlcm4gaW50IG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoaW50IHBmLAorZXh0ZXJuIGludCBuZl9yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKHVfaW50OF90IHBmLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX3F1ZXVlX2hhbmRsZXIgKnFoKTsKLWV4dGVybiBpbnQgbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKGludCBwZiwKK2V4dGVybiBpbnQgbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKHVfaW50OF90IHBmLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciAqcWgpOwogZXh0ZXJuIHZvaWQgbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVycyhjb25zdCBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciAqcWgpOwogZXh0ZXJuIHZvaWQgbmZfcmVpbmplY3Qoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgaW50IHZlcmRpY3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdHByb3h5X2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhiNDZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfTkZfVFBST1hZX0NPUkVfSAorI2RlZmluZSBfTkZfVFBST1hZX0NPUkVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworLyogbG9vayB1cCBhbmQgZ2V0IGEgcmVmZXJlbmNlIHRvIGEgbWF0Y2hpbmcgc29ja2V0ICovCitleHRlcm4gc3RydWN0IHNvY2sgKgorbmZfdHByb3h5X2dldF9zb2NrX3Y0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgdTggcHJvdG9jb2wsCisJCSAgICAgIGNvbnN0IF9fYmUzMiBzYWRkciwgY29uc3QgX19iZTMyIGRhZGRyLAorCQkgICAgICBjb25zdCBfX2JlMTYgc3BvcnQsIGNvbnN0IF9fYmUxNiBkcG9ydCwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBib29sIGxpc3RlbmluZyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZfdHByb3h5X3B1dF9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBUSU1FX1dBSVQgaW5ldCBzb2NrZXRzIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSAqLworCWlmICgoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVENQKSAmJiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpKQorCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOworCWVsc2UKKwkJc29ja19wdXQoc2spOworfQorCisvKiBhc3NpZ24gYSBzb2NrZXQgdG8gdGhlIHNrYiAtLSBjb25zdW1lcyBzayAqLworaW50CituZl90cHJveHlfYXNzaWduX3NvY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oIGIvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAppbmRleCBlNGQyZDZiLi4xN2M0NDJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKQEAgLTksNyArOSw3IEBACiAgKi8KIAogLyoKLSAqIChjKSBDb3B5cmlnaHQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4sIDIwMDYKKyAqIChjKSBDb3B5cmlnaHQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4sIDIwMDYsIDIwMDgKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC03Miw4ICs3MiwxMCBAQAogLyogTmV0TGFiZWwgTkVUTElOSyBwcm90b2NvbCB2ZXJzaW9uCiAgKiAgMTogaW5pdGlhbCB2ZXJzaW9uCiAgKiAgMjogYWRkZWQgc3RhdGljIGxhYmVscyBmb3IgdW5sYWJlbGVkIGNvbm5lY3Rpb25zCisgKiAgMzogbmV0d29yayBzZWxlY3RvcnMgYWRkZWQgdG8gdGhlIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZyBhbmQgdGhlCisgKiAgICAgQ0lQU09fVjRfTUFQX0xPQ0FMIENJUFNPIG1hcHBpbmcgd2FzIGFkZGVkCiAgKi8KLSNkZWZpbmUgTkVUTEJMX1BST1RPX1ZFUlNJT04gICAgICAgICAgICAyCisjZGVmaW5lIE5FVExCTF9QUk9UT19WRVJTSU9OICAgICAgICAgICAgMwogCiAvKiBOZXRMYWJlbCBORVRMSU5LIHR5cGVzL2ZhbWlsaWVzICovCiAjZGVmaW5lIE5FVExCTF9OTFRZUEVfTk9ORSAgICAgICAgICAgICAgMApAQCAtODcsNiArODksOCBAQAogI2RlZmluZSBORVRMQkxfTkxUWVBFX0NJUFNPVjZfTkFNRSAgICAgICJOTEJMX0NJUFNPdjYiCiAjZGVmaW5lIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEICAgICAgICAgNQogI2RlZmluZSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRF9OQU1FICAgICJOTEJMX1VOTEJMIgorI2RlZmluZSBORVRMQkxfTkxUWVBFX0FERFJTRUxFQ1QgICAgICAgIDYKKyNkZWZpbmUgTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUX05BTUUgICAiTkxCTF9BRFJTRUwiCiAKIC8qCiAgKiBOZXRMYWJlbCAtIEtlcm5lbCBBUEkgZm9yIGFjY2Vzc2luZyB0aGUgbmV0d29yayBwYWNrZXQgbGFiZWwgbWFwcGluZ3MuCkBAIC0yMDAsNyArMjA0LDcgQEAKIAl1MzIgdHlwZTsKIAljaGFyICpkb21haW47CiAJc3RydWN0IG5ldGxibF9sc21fY2FjaGUgKmNhY2hlOwotCXVuaW9uIHsKKwlzdHJ1Y3QgewogCQlzdHJ1Y3QgewogCQkJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdDsKIAkJCXUzMiBsdmw7CkBAIC0zNTIsMTIgKzM1Niw5IEBACiBpbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBpbnQgbmV0bGJsX2NmZ191bmxibF9hZGRfbWFwKGNvbnN0IGNoYXIgKmRvbWFpbiwKIAkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAotCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBpbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKIAkJCSAgICAgICBjb25zdCBjaGFyICpkb21haW4sCiAJCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2RlbCh1MzIgZG9pLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIAogLyoKICAqIExTTSBzZWN1cml0eSBhdHRyaWJ1dGUgb3BlcmF0aW9ucwpAQCAtMzgwLDEyICszODEsMTkgQEAKIGludCBuZXRsYmxfZW5hYmxlZCh2b2lkKTsKIGludCBuZXRsYmxfc29ja19zZXRhdHRyKHN0cnVjdCBzb2NrICpzaywKIAkJCWNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOwordm9pZCBuZXRsYmxfc29ja19kZWxhdHRyKHN0cnVjdCBzb2NrICpzayk7CiBpbnQgbmV0bGJsX3NvY2tfZ2V0YXR0cihzdHJ1Y3Qgc29jayAqc2ssCiAJCQlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKK2ludCBuZXRsYmxfY29ubl9zZXRhdHRyKHN0cnVjdCBzb2NrICpzaywKKwkJCXN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCWNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOworaW50IG5ldGxibF9za2J1ZmZfc2V0YXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICB1MTYgZmFtaWx5LAorCQkJICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKIGludCBuZXRsYmxfc2tidWZmX2dldGF0dHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgdTE2IGZhbWlseSwKIAkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7Ci12b2lkIG5ldGxibF9za2J1ZmZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnJvcik7Cit2b2lkIG5ldGxibF9za2J1ZmZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnJvciwgaW50IGdhdGV3YXkpOwogCiAvKgogICogTFNNIGxhYmVsIG1hcHBpbmcgY2FjaGUgb3BlcmF0aW9ucwpAQCAtNDA0LDIyICs0MTIsMTIgQEAKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKLQkJCQkJIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19CiBzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkX21hcChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwKIAkJCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCXJldHVybiAtRU5PU1lTOwogfQotc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2RlbCh1MzIgZG9pLAotCQkJCQkgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXAsCiAJCQkJICAgICAgdTMyIG9mZnNldCkKQEAgLTQ1NiwxOCArNDU0LDM1IEBACiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CitzdGF0aWMgaW5saW5lIHZvaWQgbmV0bGJsX3NvY2tfZGVsYXR0cihzdHJ1Y3Qgc29jayAqc2spCit7Cit9CiBzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc29ja19nZXRhdHRyKHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewogCXJldHVybiAtRU5PU1lTOwogfQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2Nvbm5fc2V0YXR0cihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2tidWZmX3NldGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICB1MTYgZmFtaWx5LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CiBzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2tidWZmX2dldGF0dHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJdTE2IGZhbWlseSwKIAkJCQkJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2tidWZmX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyb3IpCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0bGJsX3NrYnVmZl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIGludCBlcnJvciwKKwkJCQkgICAgIGludCBnYXRld2F5KQogewogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaAppbmRleCAxODAyNGI4Li4zNjQzYmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCkBAIC0xMTksOSArMTE5LDYgQEAKICAqIE5lc3RlZCBBdHRyaWJ1dGVzIENvbnN0cnVjdGlvbjoKICAqICAgbmxhX25lc3Rfc3RhcnQoc2tiLCB0eXBlKQkJc3RhcnQgYSBuZXN0ZWQgYXR0cmlidXRlCiAgKiAgIG5sYV9uZXN0X2VuZChza2IsIG5sYSkJCWZpbmFsaXplIGEgbmVzdGVkIGF0dHJpYnV0ZQotICogICBubGFfbmVzdF9jb21wYXRfc3RhcnQoc2tiLCB0eXBlLAlzdGFydCBhIG5lc3RlZCBjb21wYXQgYXR0cmlidXRlCi0gKgkJCSAgIGxlbiwgZGF0YSkKLSAqICAgbmxhX25lc3RfY29tcGF0X2VuZChza2IsIHR5cGUpCWZpbmFsaXplIGEgbmVzdGVkIGNvbXBhdCBhdHRyaWJ1dGUKICAqICAgbmxhX25lc3RfY2FuY2VsKHNrYiwgbmxhKQkJY2FuY2VsIG5lc3RlZCBhdHRyaWJ1dGUgY29uc3RydWN0aW9uCiAgKgogICogQXR0cmlidXRlIExlbmd0aCBDYWxjdWxhdGlvbnM6CkBAIC0xNTYsNyArMTUzLDYgQEAKICAqICAgbmxhX2ZpbmRfbmVzdGVkKCkJCQlmaW5kIGF0dHJpYnV0ZSBpbiBuZXN0ZWQgYXR0cmlidXRlcwogICogICBubGFfcGFyc2UoKQkJCXBhcnNlIGFuZCB2YWxpZGF0ZSBzdHJlYW0gb2YgYXR0cnMKICAqICAgbmxhX3BhcnNlX25lc3RlZCgpCQkJcGFyc2UgbmVzdGVkIGF0dHJpYnVldHMKLSAqICAgbmxhX3BhcnNlX25lc3RlZF9jb21wYXQoKQkJcGFyc2UgbmVzdGVkIGNvbXBhdCBhdHRyaWJ1dGVzCiAgKiAgIG5sYV9mb3JfZWFjaF9hdHRyKCkJCWxvb3Agb3ZlciBhbGwgYXR0cmlidXRlcwogICogICBubGFfZm9yX2VhY2hfbmVzdGVkKCkJCWxvb3Agb3ZlciB0aGUgbmVzdGVkIGF0dHJpYnV0ZXMKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzAyLDcgKzY5OCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5sYV9vayhjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEsIGludCByZW1haW5pbmcpCiB7Ci0JcmV0dXJuIHJlbWFpbmluZyA+PSBzaXplb2YoKm5sYSkgJiYKKwlyZXR1cm4gcmVtYWluaW5nID49IChpbnQpIHNpemVvZigqbmxhKSAmJgogCSAgICAgICBubGEtPm5sYV9sZW4gPj0gc2l6ZW9mKCpubGEpICYmCiAJICAgICAgIG5sYS0+bmxhX2xlbiA8PSByZW1haW5pbmc7CiB9CkBAIC03NTIsMzkgKzc0OCw2IEBACiB9CiAKIC8qKgotICogbmxhX3BhcnNlX25lc3RlZF9jb21wYXQgLSBwYXJzZSBuZXN0ZWQgY29tcGF0IGF0dHJpYnV0ZXMKLSAqIEB0YjogZGVzdGluYXRpb24gYXJyYXkgd2l0aCBtYXh0eXBlKzEgZWxlbWVudHMKLSAqIEBtYXh0eXBlOiBtYXhpbXVtIGF0dHJpYnV0ZSB0eXBlIHRvIGJlIGV4cGVjdGVkCi0gKiBAbmxhOiBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgbmVzdGVkIGF0dHJpYnV0ZXMKLSAqIEBkYXRhOiBwb2ludGVyIHRvIHBvaW50IHRvIGNvbnRhaW5lZCBzdHJ1Y3R1cmUKLSAqIEBsZW46IGxlbmd0aCBvZiBjb250YWluZWQgc3RydWN0dXJlCi0gKiBAcG9saWN5OiB2YWxpZGF0aW9uIHBvbGljeQotICoKLSAqIFBhcnNlIGEgbmVzdGVkIGNvbXBhdCBhdHRyaWJ1dGUuIFRoZSBjb21wYXQgYXR0cmlidXRlIGNvbnRhaW5zIGEgc3RydWN0dXJlCi0gKiBhbmQgb3B0aW9uYWxseSBhIHNldCBvZiBuZXN0ZWQgYXR0cmlidXRlcy4gT24gc3VjY2VzcyB0aGUgZGF0YSBwb2ludGVyCi0gKiBwb2ludHMgdG8gdGhlIG5lc3RlZCBkYXRhIGFuZCB0YiBjb250YWlucyB0aGUgcGFyc2VkIGF0dHJpYnV0ZXMKLSAqIChzZWUgbmxhX3BhcnNlKS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19ubGFfcGFyc2VfbmVzdGVkX2NvbXBhdChzdHJ1Y3QgbmxhdHRyICp0YltdLCBpbnQgbWF4dHlwZSwKLQkJCQkJICAgIHN0cnVjdCBubGF0dHIgKm5sYSwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5ICpwb2xpY3ksCi0JCQkJCSAgICBpbnQgbGVuKQotewotCWludCBuZXN0ZWRfbGVuID0gbmxhX2xlbihubGEpIC0gTkxBX0FMSUdOKGxlbik7Ci0KLQlpZiAobmVzdGVkX2xlbiA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChuZXN0ZWRfbGVuID49IG5sYV9hdHRyX3NpemUoMCkpCi0JCXJldHVybiBubGFfcGFyc2UodGIsIG1heHR5cGUsIG5sYV9kYXRhKG5sYSkgKyBOTEFfQUxJR04obGVuKSwKLQkJCQkgbmVzdGVkX2xlbiwgcG9saWN5KTsKLQltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgbmxhdHRyICopICogKG1heHR5cGUgKyAxKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgbmxhX3BhcnNlX25lc3RlZF9jb21wYXQodGIsIG1heHR5cGUsIG5sYSwgcG9saWN5LCBkYXRhLCBsZW4pIFwKLSh7CWRhdGEgPSBubGFfbGVuKG5sYSkgPj0gbGVuID8gbmxhX2RhdGEobmxhKSA6IE5VTEw7IFwKLQlfX25sYV9wYXJzZV9uZXN0ZWRfY29tcGF0KHRiLCBtYXh0eXBlLCBubGEsIHBvbGljeSwgbGVuKTsgfSkKLS8qKgogICogbmxhX3B1dF91OCAtIEFkZCBhIHU4IG5ldGxpbmsgYXR0cmlidXRlIHRvIGEgc29ja2V0IGJ1ZmZlcgogICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byBhZGQgYXR0cmlidXRlIHRvCiAgKiBAYXR0cnR5cGU6IGF0dHJpYnV0ZSB0eXBlCkBAIC0xMDMxLDUxICs5OTQsNiBAQAogfQogCiAvKioKLSAqIG5sYV9uZXN0X2NvbXBhdF9zdGFydCAtIFN0YXJ0IGEgbmV3IGxldmVsIG9mIG5lc3RlZCBjb21wYXQgYXR0cmlidXRlcwotICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byBhZGQgYXR0cmlidXRlcyB0bwotICogQGF0dHJ0eXBlOiBhdHRyaWJ1dGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBhdHRybGVuOiBsZW5ndGggb2Ygc3RydWN0dXJlCi0gKiBAZGF0YTogcG9pbnRlciB0byBzdHJ1Y3R1cmUKLSAqCi0gKiBTdGFydCBhIG5lc3RlZCBjb21wYXQgYXR0cmlidXRlIHRoYXQgY29udGFpbnMgYm90aCBhIHN0cnVjdHVyZSBhbmQKLSAqIGEgc2V0IG9mIG5lc3RlZCBhdHRyaWJ1dGVzLgotICoKLSAqIFJldHVybnMgdGhlIGNvbnRhaW5lciBhdHRyaWJ1dGUKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmxhdHRyICpubGFfbmVzdF9jb21wYXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sCi0JCQkJCQkgICBjb25zdCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBubGF0dHIgKnN0YXJ0ID0gKHN0cnVjdCBubGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7Ci0KLQlpZiAobmxhX3B1dChza2IsIGF0dHJ0eXBlLCBhdHRybGVuLCBkYXRhKSA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChubGFfbmVzdF9zdGFydChza2IsIGF0dHJ0eXBlKSA9PSBOVUxMKSB7Ci0JCW5sbXNnX3RyaW0oc2tiLCBzdGFydCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3RhcnQ7Ci19Ci0KLS8qKgotICogbmxhX25lc3RfY29tcGF0X2VuZCAtIEZpbmFsaXplIG5lc3Rpbmcgb2YgY29tcGF0IGF0dHJpYnV0ZXMKLSAqIEBza2I6IHNvY2tldCBidWZmZXIgdGhlIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbgotICogQHN0YXJ0OiBjb250YWluZXIgYXR0cmlidXRlCi0gKgotICogQ29ycmVjdHMgdGhlIGNvbnRhaW5lciBhdHRyaWJ1dGUgaGVhZGVyIHRvIGluY2x1ZGUgdGhlIGFsbAotICogYXBwZW5lZGVkIGF0dHJpYnV0ZXMuCi0gKgotICogUmV0dXJucyB0aGUgdG90YWwgZGF0YSBsZW5ndGggb2YgdGhlIHNrYi4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgbmxhX25lc3RfY29tcGF0X2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmxhdHRyICpzdGFydCkKLXsKLQlzdHJ1Y3QgbmxhdHRyICpuZXN0ID0gKHZvaWQgKilzdGFydCArIE5MTVNHX0FMSUdOKHN0YXJ0LT5ubGFfbGVuKTsKLQotCXN0YXJ0LT5ubGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHVuc2lnbmVkIGNoYXIgKilzdGFydDsKLQlyZXR1cm4gbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7Ci19Ci0KLS8qKgogICogbmxhX25lc3RfY2FuY2VsIC0gQ2FuY2VsIG5lc3Rpbmcgb2YgYXR0cmlidXRlcwogICogQHNrYjogc29ja2V0IGJ1ZmZlciB0aGUgbWVzc2FnZSBpcyBzdG9yZWQgaW4KICAqIEBzdGFydDogY29udGFpbmVyIGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRucy9jb25udHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ5OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfX05FVE5TX0NPTk5UUkFDS19ICisjZGVmaW5lIF9fTkVUTlNfQ09OTlRSQUNLX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKK3N0cnVjdCBjdGxfdGFibGVfaGVhZGVyOworc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGU7CisKK3N0cnVjdCBuZXRuc19jdCB7CisJYXRvbWljX3QJCWNvdW50OworCXVuc2lnbmVkIGludAkJZXhwZWN0X2NvdW50OworCXN0cnVjdCBobGlzdF9oZWFkCSpoYXNoOworCXN0cnVjdCBobGlzdF9oZWFkCSpleHBlY3RfaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAl1bmNvbmZpcm1lZDsKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgKnN0YXQ7CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOworI2VuZGlmCisJaW50CQkJc3lzY3RsX2FjY3Q7CisJaW50CQkJc3lzY3RsX2NoZWNrc3VtOworCXVuc2lnbmVkIGludAkJc3lzY3RsX2xvZ19pbnZhbGlkOyAvKiBMb2cgaW52YWxpZCBwYWNrZXRzICovCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyCSpzeXNjdGxfaGVhZGVyOworCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyCSphY2N0X3N5c2N0bF9oZWFkZXI7CisjZW5kaWYKKwlpbnQJCQloYXNoX3ZtYWxsb2M7CisJaW50CQkJZXhwZWN0X3ZtYWxsb2M7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKaW5kZXggYTZlZDgzOC4uZWNlMWM5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaApAQCAtMzgsNiArMzgsOSBAQAogCXN0cnVjdCB4dF90YWJsZQkJKmlwdGFibGVfcmF3OwogCXN0cnVjdCB4dF90YWJsZQkJKmFycHRhYmxlX2ZpbHRlcjsKIAlzdHJ1Y3QgeHRfdGFibGUJCSppcHRhYmxlX3NlY3VyaXR5OworCXN0cnVjdCB4dF90YWJsZQkJKm5hdF90YWJsZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkqbmF0X2J5c291cmNlOworCWludAkJCW5hdF92bWFsbG9jZWQ7CiAjZW5kaWYKIAogCWludCBzeXNjdGxfaWNtcF9lY2hvX2lnbm9yZV9hbGw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9taWIuaCBiL2luY2x1ZGUvbmV0L25ldG5zL21pYi5oCmluZGV4IDQ0OTE0NzYuLjEwY2I3YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL21pYi5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL21pYi5oCkBAIC0xMSw2ICsxMSwxNSBAQAogCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdGlzdGljcyk7CiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcF9taWIsIGljbXBfc3RhdGlzdGljcyk7CiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcG1zZ19taWIsIGljbXBtc2dfc3RhdGlzdGljcyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0X2RldnNubXA2OworCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0c19pbjYpOworCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdHNfaW42KTsKKwlERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpcHN0YXRzX21pYiwgaXB2Nl9zdGF0aXN0aWNzKTsKKwlERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpY21wdjZfbWliLCBpY21wdjZfc3RhdGlzdGljcyk7CisJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcHY2bXNnX21pYiwgaWNtcHY2bXNnX3N0YXRpc3RpY3MpOworI2VuZGlmCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3Bob25ldC9ncHJzLmggYi9pbmNsdWRlL25ldC9waG9uZXQvZ3Bycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOGRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9waG9uZXQvZ3Bycy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBGaWxlOiBwZXBfZ3Bycy5oCisgKgorICogR1BSUyBvdmVyIFBob25ldCBwaXBlIGVuZCBwb2ludCBzb2NrZXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogQXV0aG9yOiBSw6ltaSBEZW5pcy1Db3VybW9udCA8cmVtaS5kZW5pcy1jb3VybW9udEBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgTkVUX1BIT05FVF9HUFJTX0gKKyNkZWZpbmUgTkVUX1BIT05FVF9HUFJTX0gKKworc3RydWN0IHNvY2s7CitzdHJ1Y3Qgc2tfYnVmZjsKKworaW50IHBlcF93cml0ZWFibGUoc3RydWN0IHNvY2sgKnNrKTsKK2ludCBwZXBfd3JpdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0cnVjdCBza19idWZmICpwZXBfcmVhZChzdHJ1Y3Qgc29jayAqc2spOworCitpbnQgZ3Byc19hdHRhY2goc3RydWN0IHNvY2sgKnNrKTsKK3ZvaWQgZ3Byc19kZXRhY2goc3RydWN0IHNvY2sgKnNrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9waG9uZXQvcGVwLmggYi9pbmNsdWRlL25ldC9waG9uZXQvcGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNzkzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3Bob25ldC9wZXAuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIEZpbGU6IHBlcC5oCisgKgorICogUGhvbmV0IFBpcGUgRW5kIFBvaW50IHNvY2tldHMgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgTkVUX1BIT05FVF9QRVBfSAorI2RlZmluZSBORVRfUEhPTkVUX1BFUF9ICisKK3N0cnVjdCBwZXBfc29jayB7CisJc3RydWN0IHBuX3NvY2sJCXBuX3NrOworCisJLyogWFhYOiB1bmlvbi1pZnkgbGlzdGVuaW5nIHZzIGNvbm5lY3RlZCBzdHVmZiA/ICovCisJLyogTGlzdGVuaW5nIHNvY2tldCBzdHVmZjogKi8KKwlzdHJ1Y3QgaGxpc3RfaGVhZAlhY2txOworCXN0cnVjdCBobGlzdF9oZWFkCWhsaXN0OworCisJLyogQ29ubmVjdGVkIHNvY2tldCBzdHVmZjogKi8KKwlzdHJ1Y3Qgc29jawkJKmxpc3RlbmVyOworCXN0cnVjdCBza19idWZmX2hlYWQJY3RybHJlcV9xdWV1ZTsKKyNkZWZpbmUgUE5QSVBFX0NUUkxSRVFfTUFYCTEwCisJaW50CQkJaWZpbmRleDsKKwl1MTYJCQlwZWVyX3R5cGU7CS8qIHBlZXIgdHlwZS9zdWJ0eXBlICovCisJdTgJCQlwaXBlX2hhbmRsZTsKKworCXU4CQkJcnhfY3JlZGl0czsKKwl1OAkJCXR4X2NyZWRpdHM7CisJdTgJCQlyeF9mYzsJLyogUlggZmxvdyBjb250cm9sICovCisJdTgJCQl0eF9mYzsJLyogVFggZmxvdyBjb250cm9sICovCisJdTgJCQlpbml0X2VuYWJsZTsJLyogYXV0by1lbmFibGUgYXQgY3JlYXRpb24gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBlcF9zb2NrICpwZXBfc2soc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiAoc3RydWN0IHBlcF9zb2NrICopc2s7Cit9CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHBob25ldF9zdHJlYW1fb3BzOworCisvKiBQaXBlIHByb3RvY29sIGRlZmluaXRpb25zICovCitzdHJ1Y3QgcG5waXBlaGRyIHsKKwl1OAkJCXV0aWQ7IC8qIHRyYW5zYWN0aW9uIElEICovCisJdTgJCQltZXNzYWdlX2lkOworCXU4CQkJcGlwZV9oYW5kbGU7CisJdW5pb24geworCQl1OAkJc3RhdGVfYWZ0ZXJfY29ubmVjdDsJLyogY29ubmVjdCByZXF1ZXN0ICovCisJCXU4CQlzdGF0ZV9hZnRlcl9yZXNldDsJLyogcmVzZXQgcmVxdWVzdCAqLworCQl1OAkJZXJyb3JfY29kZTsJCS8qIGFueSByZXNwb25zZSAqLworCQl1OAkJcGVwX3R5cGU7CQkvKiBzdGF0dXMgaW5kaWNhdGlvbiAqLworCQl1OAkJZGF0YVsxXTsKKwl9OworfTsKKyNkZWZpbmUgb3RoZXJfcGVwX3R5cGUJCWRhdGFbMV0KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5waXBlaGRyICpwbnBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgcG5waXBlaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKworI2RlZmluZSBNQVhfUE5QSVBFX0hFQURFUiAoTUFYX1BIT05FVF9IRUFERVIgKyA0KQorCitlbnVtIHsKKwlQTlNfUElQRV9EQVRBID0gMHgyMCwKKworCVBOU19QRVBfQ09OTkVDVF9SRVEgPSAweDQwLAorCVBOU19QRVBfQ09OTkVDVF9SRVNQLAorCVBOU19QRVBfRElTQ09OTkVDVF9SRVEsCisJUE5TX1BFUF9ESVNDT05ORUNUX1JFU1AsCisJUE5TX1BFUF9SRVNFVF9SRVEsCisJUE5TX1BFUF9SRVNFVF9SRVNQLAorCVBOU19QRVBfRU5BQkxFX1JFUSwKKwlQTlNfUEVQX0VOQUJMRV9SRVNQLAorCVBOU19QRVBfQ1RSTF9SRVEsCisJUE5TX1BFUF9DVFJMX1JFU1AsCisJUE5TX1BFUF9ESVNBQkxFX1JFUSA9IDB4NEMsCisJUE5TX1BFUF9ESVNBQkxFX1JFU1AsCisKKwlQTlNfUEVQX1NUQVRVU19JTkQgPSAweDYwLAorCVBOU19QSVBFX0NSRUFURURfSU5ELAorCVBOU19QSVBFX1JFU0VUX0lORCA9IDB4NjMsCisJUE5TX1BJUEVfRU5BQkxFRF9JTkQsCisJUE5TX1BJUEVfUkVESVJFQ1RFRF9JTkQsCisJUE5TX1BJUEVfRElTQUJMRURfSU5EID0gMHg2NiwKK307CisKKyNkZWZpbmUgUE5fUElQRV9JTlZBTElEX0hBTkRMRQkweGZmCisjZGVmaW5lIFBOX1BFUF9UWVBFX0NPTU1PTgkweDAwCisKKy8qIFBob25ldCBwaXBlIHN0YXR1cyBpbmRpY2F0aW9uICovCitlbnVtIHsKKwlQTl9QRVBfSU5EX0ZMT1dfQ09OVFJPTCwKKwlQTl9QRVBfSU5EX0lEX01DRkNfR1JBTlRfQ1JFRElUUywKK307CisKKy8qIFBob25ldCBwaXBlIGVycm9yIGNvZGVzICovCitlbnVtIHsKKwlQTl9QSVBFX05PX0VSUk9SLAorCVBOX1BJUEVfRVJSX0lOVkFMSURfUEFSQU0sCisJUE5fUElQRV9FUlJfSU5WQUxJRF9IQU5ETEUsCisJUE5fUElQRV9FUlJfSU5WQUxJRF9DVFJMX0lELAorCVBOX1BJUEVfRVJSX05PVF9BTExPV0VELAorCVBOX1BJUEVfRVJSX1BFUF9JTl9VU0UsCisJUE5fUElQRV9FUlJfT1ZFUkxPQUQsCisJUE5fUElQRV9FUlJfREVWX0RJU0NPTk5FQ1RFRCwKKwlQTl9QSVBFX0VSUl9USU1FT1VULAorCVBOX1BJUEVfRVJSX0FMTF9QSVBFU19JTl9VU0UsCisJUE5fUElQRV9FUlJfR0VORVJBTCwKKwlQTl9QSVBFX0VSUl9OT1RfU1VQUE9SVEVELAorfTsKKworLyogUGhvbmV0IHBpcGUgc3RhdGVzICovCitlbnVtIHsKKwlQTl9QSVBFX0RJU0FCTEUsCisJUE5fUElQRV9FTkFCTEUsCit9OworCisvKiBQaG9uZXQgcGlwZSBzdWItYmxvY2sgdHlwZXMgKi8KK2VudW0geworCVBOX1BJUEVfU0JfQ1JFQVRFX1JFUV9QRVBfU1VCX1RZUEUsCisJUE5fUElQRV9TQl9DT05ORUNUX1JFUV9QRVBfU1VCX1RZUEUsCisJUE5fUElQRV9TQl9SRURJUkVDVF9SRVFfUEVQX1NVQl9UWVBFLAorCVBOX1BJUEVfU0JfTkVHT1RJQVRFRF9GQywKKwlQTl9QSVBFX1NCX1JFUVVJUkVEX0ZDX1RYLAorCVBOX1BJUEVfU0JfUFJFRkVSUkVEX0ZDX1JYLAorfTsKKworLyogUGhvbmV0IHBpcGUgZmxvdyBjb250cm9sIG1vZGVscyAqLworZW51bSB7CisJUE5fTk9fRkxPV19DT05UUk9MLAorCVBOX0xFR0FDWV9GTE9XX0NPTlRST0wsCisJUE5fT05FX0NSRURJVF9GTE9XX0NPTlRST0wsCisJUE5fTVVMVElfQ1JFRElUX0ZMT1dfQ09OVFJPTCwKK307CisKKyNkZWZpbmUgcG5fZmxvd19zYWZlKGZjKSAoKGZjKSA+PiAxKQorCisvKiBQaG9uZXQgcGlwZSBmbG93IGNvbnRyb2wgc3RhdGVzICovCitlbnVtIHsKKwlQRVBfSU5EX0VNUFRZLAorCVBFUF9JTkRfQlVTWSwKKwlQRVBfSU5EX1JFQURZLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9waG9uZXQvcGhvbmV0LmggYi9pbmNsdWRlL25ldC9waG9uZXQvcGhvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3Bob25ldC9waG9uZXQuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIEZpbGU6IGFmX3Bob25ldC5oCisgKgorICogUGhvbmV0IHNvY2tldHMga2VybmVsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFGX1BIT05FVF9ICisjZGVmaW5lIEFGX1BIT05FVF9ICisKKy8qCisgKiBUaGUgbG93ZXIgbGF5ZXJzIG1heSBub3QgcmVxdWlyZSBtb3JlIHNwYWNlLCBldmVyLiBNYWtlIHN1cmUgaXQncworICogZW5vdWdoLgorICovCisjZGVmaW5lIE1BWF9QSE9ORVRfSEVBREVSCTgKKworLyoKKyAqIEV2ZXJ5IFBob25ldCogc29ja2V0IGhhcyB0aGlzIHN0cnVjdHVyZSBmaXJzdCBpbiBpdHMKKyAqIHByb3RvY29sLXNwZWNpZmljIHN0cnVjdHVyZSB1bmRlciBuYW1lIGMuCisgKi8KK3N0cnVjdCBwbl9zb2NrIHsKKwlzdHJ1Y3Qgc29jawlzazsKKwl1MTYJCXNvYmplY3Q7CisJdTgJCXJlc291cmNlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5fc29jayAqcG5fc2soc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiAoc3RydWN0IHBuX3NvY2sgKilzazsKK30KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcGhvbmV0X2RncmFtX29wczsKKworc3RydWN0IHNvY2sgKnBuX2ZpbmRfc29ja19ieV9zYShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcG4gKnNhKTsKK3ZvaWQgcGhvbmV0X2dldF9sb2NhbF9wb3J0X3JhbmdlKGludCAqbWluLCBpbnQgKm1heCk7Cit2b2lkIHBuX3NvY2tfaGFzaChzdHJ1Y3Qgc29jayAqc2spOwordm9pZCBwbl9zb2NrX3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spOworaW50IHBuX3NvY2tfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzcG9ydCk7CisKK2ludCBwbl9za2Jfc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiAqdGFyZ2V0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGhvbmV0aGRyICpwbl9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBwaG9uZXRoZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGhvbmV0bXNnICpwbl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBwaG9uZXRtc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorCisvKgorICogR2V0IHRoZSBvdGhlciBwYXJ0eSdzIHNvY2thZGRyIGZyb20gcmVjZWl2ZWQgc2tiLiBUaGUgc2tiIGJlZ2lucworICogd2l0aCBhIFBob25ldCBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcG5fc2tiX2dldF9zcmNfc29ja2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2thZGRyX3BuICpzYSkKK3sKKwlzdHJ1Y3QgcGhvbmV0aGRyICpwaCA9IHBuX2hkcihza2IpOworCXUxNiBvYmogPSBwbl9vYmplY3QocGgtPnBuX3NkZXYsIHBoLT5wbl9zb2JqKTsKKworCXNhLT5zcG5fZmFtaWx5ID0gQUZfUEhPTkVUOworCXBuX3NvY2thZGRyX3NldF9vYmplY3Qoc2EsIG9iaik7CisJcG5fc29ja2FkZHJfc2V0X3Jlc291cmNlKHNhLCBwaC0+cG5fcmVzKTsKKwltZW1zZXQoc2EtPnNwbl96ZXJvLCAwLCBzaXplb2Yoc2EtPnNwbl96ZXJvKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcG5fc2tiX2dldF9kc3Rfc29ja2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2thZGRyX3BuICpzYSkKK3sKKwlzdHJ1Y3QgcGhvbmV0aGRyICpwaCA9IHBuX2hkcihza2IpOworCXUxNiBvYmogPSBwbl9vYmplY3QocGgtPnBuX3JkZXYsIHBoLT5wbl9yb2JqKTsKKworCXNhLT5zcG5fZmFtaWx5ID0gQUZfUEhPTkVUOworCXBuX3NvY2thZGRyX3NldF9vYmplY3Qoc2EsIG9iaik7CisJcG5fc29ja2FkZHJfc2V0X3Jlc291cmNlKHNhLCBwaC0+cG5fcmVzKTsKKwltZW1zZXQoc2EtPnNwbl96ZXJvLCAwLCBzaXplb2Yoc2EtPnNwbl96ZXJvKSk7Cit9CisKKy8qIFByb3RvY29scyBpbiBQaG9uZXQgcHJvdG9jb2wgZmFtaWx5LiAqLworc3RydWN0IHBob25ldF9wcm90b2NvbCB7CisJY29uc3Qgc3RydWN0IHByb3RvX29wcwkqb3BzOworCXN0cnVjdCBwcm90bwkJKnByb3Q7CisJaW50CQkJc29ja190eXBlOworfTsKKworaW50IHBob25ldF9wcm90b19yZWdpc3RlcihpbnQgcHJvdG9jb2wsIHN0cnVjdCBwaG9uZXRfcHJvdG9jb2wgKnBwKTsKK3ZvaWQgcGhvbmV0X3Byb3RvX3VucmVnaXN0ZXIoaW50IHByb3RvY29sLCBzdHJ1Y3QgcGhvbmV0X3Byb3RvY29sICpwcCk7CisKK2ludCBwaG9uZXRfc3lzY3RsX2luaXQodm9pZCk7Cit2b2lkIHBob25ldF9zeXNjdGxfZXhpdCh2b2lkKTsKK3ZvaWQgcGhvbmV0X25ldGxpbmtfcmVnaXN0ZXIodm9pZCk7CitpbnQgaXNpX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBpc2lfdW5yZWdpc3Rlcih2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9waG9uZXQvcG5fZGV2LmggYi9pbmNsdWRlL25ldC9waG9uZXQvcG5fZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkMmE4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3Bob25ldC9wbl9kZXYuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogRmlsZTogcG5fZGV2LmgKKyAqCisgKiBQaG9uZXQgbmV0d29yayBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgUE5fREVWX0gKKyNkZWZpbmUgUE5fREVWX0gKKworc3RydWN0IHBob25ldF9kZXZpY2VfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK2V4dGVybiBzdHJ1Y3QgcGhvbmV0X2RldmljZV9saXN0IHBuZGV2czsKKworc3RydWN0IHBob25ldF9kZXZpY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCURFQ0xBUkVfQklUTUFQKGFkZHJzLCA2NCk7Cit9OworCit2b2lkIHBob25ldF9kZXZpY2VfaW5pdCh2b2lkKTsKK3ZvaWQgcGhvbmV0X2RldmljZV9leGl0KHZvaWQpOworc3RydWN0IG5ldF9kZXZpY2UgKnBob25ldF9kZXZpY2VfZ2V0KHN0cnVjdCBuZXQgKm5ldCk7CisKK2ludCBwaG9uZXRfYWRkcmVzc19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcik7CitpbnQgcGhvbmV0X2FkZHJlc3NfZGVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOwordTggcGhvbmV0X2FkZHJlc3NfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOworaW50IHBob25ldF9hZGRyZXNzX2xvb2t1cCh1OCBhZGRyKTsKKworI2RlZmluZSBQTl9OT19BRERSCTB4ZmYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaCBiL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCmluZGV4IGI3ODZhNWIuLjQwODJmMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oCkBAIC05MCwxMCArOTAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcWRpc2NfcnVuKHN0cnVjdCBRZGlzYyAqcSkKIHsKLQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBxLT5kZXZfcXVldWU7Ci0KLQlpZiAoIW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChfX1FESVNDX1NUQVRFX1JVTk5JTkcsICZxLT5zdGF0ZSkpCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KF9fUURJU0NfU1RBVEVfUlVOTklORywgJnEtPnN0YXRlKSkKIAkJX19xZGlzY19ydW4ocSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3JvdXRlLmggYi9pbmNsdWRlL25ldC9yb3V0ZS5oCmluZGV4IDRmMGQ4YzEuLjRlOGNhZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JvdXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvcm91dGUuaApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvaW5ldHBlZXIuaD4KICNpbmNsdWRlIDxuZXQvZmxvdy5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luX3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KQEAgLTE2MSw2ICsxNjEsMTAgQEAKIAogCWludCBlcnI7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOworCisJaWYgKGluZXRfc2soc2spLT50cmFuc3BhcmVudCkKKwkJZmwuZmxhZ3MgfD0gRkxPV0lfRkxBR19BTllTUkM7CisKIAlpZiAoIWRzdCB8fCAhc3JjKSB7CiAJCWVyciA9IF9faXBfcm91dGVfb3V0cHV0X2tleShuZXQsIHJwLCAmZmwpOwogCQlpZiAoZXJyKQpAQCAtMjA0LDQgKzIwOCw5IEBACiAJcmV0dXJuIHJ0LT5wZWVyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpbmV0X2lpZihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnJ0YWJsZS0+cnRfaWlmOworfQorCiAjZW5kaWYJLyogX1JPVVRFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IGU1NTY5NjIuLjNmZTQ5ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtNTMsNiArNTMsNyBAQAogCWF0b21pY190CQlyZWZjbnQ7CiAJdW5zaWduZWQgbG9uZwkJc3RhdGU7CiAJc3RydWN0IHNrX2J1ZmYJCSpnc29fc2tiOworCXN0cnVjdCBza19idWZmX2hlYWQJcmVxdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXE7CiAJc3RydWN0IG5ldGRldl9xdWV1ZQkqZGV2X3F1ZXVlOwogCXN0cnVjdCBRZGlzYwkJKm5leHRfc2NoZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaAppbmRleCBjMzJkZGYwLi5iMDViMDU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKQEAgLTI2MSw3ICsyNjEsOSBAQAogICogbXVzdCBiZSBsZXNzIHRoYW4gNjU1MzUgKDJeMTYgLSAxKSwgb3Igd2Ugd2lsbCBoYXZlIG92ZXJmbG93CiAgKiBwcm9ibGVtcyBjcmVhdGluZyBTQUNLJ3MuCiAgKi8KLSNkZWZpbmUgU0NUUF9UU05fTUFQX1NJWkUgMjA0OAorI2RlZmluZSBTQ1RQX1RTTl9NQVBfSU5JVElBTCBCSVRTX1BFUl9MT05HCisjZGVmaW5lIFNDVFBfVFNOX01BUF9JTkNSRU1FTlQgU0NUUF9UU05fTUFQX0lOSVRJQUwKKyNkZWZpbmUgU0NUUF9UU05fTUFQX1NJWkUgNDA5NgogI2RlZmluZSBTQ1RQX1RTTl9NQVhfR0FQICA2NTUzNQogCiAvKiBXZSB3aWxsIG5vdCByZWNvcmQgbW9yZSB0aGFuIHRoaXMgbWFueSBkdXBsaWNhdGUgVFNOcyBiZXR3ZWVuIHR3bwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCAxN2I5MzJiLi5lZDcxYjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtMzAzLDcgKzMwMyw3IEBACiAjZGVmaW5lIFNDVFBfQVNTRVJUKGV4cHIsIHN0ciwgZnVuYykgXAogCWlmICghKGV4cHIpKSB7IFwKIAkJU0NUUF9ERUJVR19QUklOVEsoIkFzc2VydGlvbiBGYWlsZWQ6ICVzKCVzKSBhdCAlczolczolZFxuIiwgXAotCQkJc3RyLCAoI2V4cHIpLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwkJCXN0ciwgKCNleHByKSwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXyk7IFwKIAkJZnVuYzsgXAogCX0KIApAQCAtNDA2LDEwICs0MDYsNyBAQAogCiAvKiBBIG1hY3JvIHRvIHdhbGsgYSBsaXN0IG9mIHNrYnMuICAqLwogI2RlZmluZSBzY3RwX3NrYl9mb3JfZWFjaChwb3MsIGhlYWQsIHRtcCkgXAotZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7XAotICAgICB0bXAgPSAocG9zKS0+bmV4dCwgcG9zICE9ICgoc3RydWN0IHNrX2J1ZmYgKikoaGVhZCkpO1wKLSAgICAgcG9zID0gdG1wKQotCisJc2tiX3F1ZXVlX3dhbGtfc2FmZShoZWFkLCBwb3MsIHRtcCkKIAogLyogQSBoZWxwZXIgdG8gYXBwZW5kIGFuIGVudGlyZSBza2IgbGlzdCAobGlzdCkgdG8gYW5vdGhlciAoaGVhZCkuICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF9za2JfbGlzdF90YWlsKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCkBAIC00MjAsMTAgKzQxNyw3IEBACiAJc2N0cF9zcGluX2xvY2tfaXJxc2F2ZSgmaGVhZC0+bG9jaywgZmxhZ3MpOwogCXNjdHBfc3Bpbl9sb2NrKCZsaXN0LT5sb2NrKTsKIAotCWxpc3Rfc3BsaWNlKChzdHJ1Y3QgbGlzdF9oZWFkICopbGlzdCwgKHN0cnVjdCBsaXN0X2hlYWQgKiloZWFkLT5wcmV2KTsKLQotCWhlYWQtPnFsZW4gKz0gbGlzdC0+cWxlbjsKLQlsaXN0LT5xbGVuID0gMDsKKwlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdChsaXN0LCBoZWFkKTsKIAogCXNjdHBfc3Bpbl91bmxvY2soJmxpc3QtPmxvY2spOwogCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGVhZC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCmluZGV4IDI0ODExNzMuLjAyOWE1NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKQEAgLTIyNyw2ICsyMjcsOSBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICosCiAJCQkJICAgY29uc3QgX191OCAqLAogCQkJCSAgIGNvbnN0IHNpemVfdCApOworc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV92aW9sYXRpb25fcGFyYW1sZW4oY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAorCQkJCSAgIHN0cnVjdCBzY3RwX3BhcmFtaGRyICopOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9oZWFydGJlYXQoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqLAogCQkJCSAgY29uc3Qgdm9pZCAqcGF5bG9hZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggYWIxYzQ3Mi4uOTY2MWQ3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTczMSwyMCArNzMxLDIzIEBACiAJICovCiAJc3RydWN0IHNrX2J1ZmYgKmF1dGhfY2h1bms7CiAKLQlfX3U4IHJ0dF9pbl9wcm9ncmVzczsJLyogSXMgdGhpcyBjaHVuayB1c2VkIGZvciBSVFQgY2FsY3VsYXRpb24/ICovCi0JX191OCByZXNlbnQ7CQkvKiBIYXMgdGhpcyBjaHVuayBldmVyIGJlZW4gcmV0cmFuc21pdHRlZC4gKi8KLQlfX3U4IGhhc190c247CQkvKiBEb2VzIHRoaXMgY2h1bmsgaGF2ZSBhIFRTTiB5ZXQ/ICovCi0JX191OCBoYXNfc3NuOwkJLyogRG9lcyB0aGlzIGNodW5rIGhhdmUgYSBTU04geWV0PyAqLwotCV9fdTggc2luZ2xldG9uOwkJLyogV2FzIHRoaXMgdGhlIG9ubHkgY2h1bmsgaW4gdGhlIHBhY2tldD8gKi8KLQlfX3U4IGVuZF9vZl9wYWNrZXQ7CS8qIFdhcyB0aGlzIHRoZSBsYXN0IGNodW5rIGluIHRoZSBwYWNrZXQ/ICovCi0JX191OCBlY25fY2VfZG9uZTsJLyogSGF2ZSB3ZSBwcm9jZXNzZWQgdGhlIEVDTiBDRSBiaXQ/ICovCi0JX191OCBwZGlzY2FyZDsJCS8qIERpc2NhcmQgdGhlIHdob2xlIHBhY2tldCBub3c/ICovCi0JX191OCB0c25fZ2FwX2Fja2VkOwkvKiBJcyB0aGlzIGNodW5rIGFja2VkIGJ5IGEgR0FQIEFDSz8gKi8KLQlfX3M4IGZhc3RfcmV0cmFuc21pdDsJIC8qIElzIHRoaXMgY2h1bmsgZmFzdCByZXRyYW5zbWl0dGVkPyAqLwotCV9fdTggdHNuX21pc3NpbmdfcmVwb3J0OyAvKiBEYXRhIGNodW5rIG1pc3NpbmcgY291bnRlci4gKi8KLQlfX3U4IGRhdGFfYWNjZXB0ZWQ7IAkvKiBBdCBsZWFzdCAxIGNodW5rIGluIHRoaXMgcGFja2V0IGFjY2VwdGVkICovCi0JX191OCBhdXRoOwkJLyogSU46IHdhcyBhdXRoJ2VkIHwgT1VUOiBuZWVkcyBhdXRoICovCi0JX191OCBoYXNfYXNjb25mOwkvKiBJTjogaGF2ZSBzZWVuIGFuIGFzY29uZiBiZWZvcmUgKi8KKyNkZWZpbmUgU0NUUF9DQU5fRlJUWCAweDAKKyNkZWZpbmUgU0NUUF9ORUVEX0ZSVFggMHgxCisjZGVmaW5lIFNDVFBfRE9OVF9GUlRYIDB4MgorCV9fdTE2CXJ0dF9pbl9wcm9ncmVzczoxLAkvKiBUaGlzIGNodW5rIHVzZWQgZm9yIFJUVCBjYWxjPyAqLworCQlyZXNlbnQ6MSwJCS8qIEhhcyB0aGlzIGNodW5rIGV2ZXIgYmVlbiByZXNlbnQuICovCisJCWhhc190c246MSwJCS8qIERvZXMgdGhpcyBjaHVuayBoYXZlIGEgVFNOIHlldD8gKi8KKwkJaGFzX3NzbjoxLAkJLyogRG9lcyB0aGlzIGNodW5rIGhhdmUgYSBTU04geWV0PyAqLworCQlzaW5nbGV0b246MSwJCS8qIE9ubHkgY2h1bmsgaW4gdGhlIHBhY2tldD8gKi8KKwkJZW5kX29mX3BhY2tldDoxLAkvKiBMYXN0IGNodW5rIGluIHRoZSBwYWNrZXQ/ICovCisJCWVjbl9jZV9kb25lOjEsCQkvKiBIYXZlIHdlIHByb2Nlc3NlZCB0aGUgRUNOIENFIGJpdD8gKi8KKwkJcGRpc2NhcmQ6MSwJCS8qIERpc2NhcmQgdGhlIHdob2xlIHBhY2tldCBub3c/ICovCisJCXRzbl9nYXBfYWNrZWQ6MSwJLyogSXMgdGhpcyBjaHVuayBhY2tlZCBieSBhIEdBUCBBQ0s/ICovCisJCWRhdGFfYWNjZXB0ZWQ6MSwJLyogQXQgbGVhc3QgMSBjaHVuayBhY2NlcHRlZCAqLworCQlhdXRoOjEsCQkJLyogSU46IHdhcyBhdXRoJ2VkIHwgT1VUOiBuZWVkcyBhdXRoICovCisJCWhhc19hc2NvbmY6MSwJCS8qIElOOiBoYXZlIHNlZW4gYW4gYXNjb25mIGJlZm9yZSAqLworCQl0c25fbWlzc2luZ19yZXBvcnQ6MiwJLyogRGF0YSBjaHVuayBtaXNzaW5nIGNvdW50ZXIuICovCisJCWZhc3RfcmV0cmFuc21pdDoyOwkvKiBJcyB0aGlzIGNodW5rIGZhc3QgcmV0cmFuc21pdHRlZD8gKi8KIH07CiAKIHZvaWQgc2N0cF9jaHVua19ob2xkKHN0cnVjdCBzY3RwX2NodW5rICopOwpAQCAtMTIyNSw3ICsxMjI4LDcgQEAKIAogc2N0cF9zY29wZV90IHNjdHBfc2NvcGUoY29uc3QgdW5pb24gc2N0cF9hZGRyICopOwogaW50IHNjdHBfaW5fc2NvcGUoY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLCBjb25zdCBzY3RwX3Njb3BlX3Qgc2NvcGUpOwotaW50IHNjdHBfaXNfYW55KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkcik7CitpbnQgc2N0cF9pc19hbnkoc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOwogaW50IHNjdHBfYWRkcl9pc192YWxpZChjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOwogCiAKQEAgLTE1NDIsNyArMTU0NSw2IEBACiAJCSAqIGluIHRzbl9tYXAtLXdlIGdldCBpdCBieSBjYWxsaW5nIHNjdHBfdHNubWFwX2dldF9jdHNuKCkuCiAJCSAqLwogCQlzdHJ1Y3Qgc2N0cF90c25tYXAgdHNuX21hcDsKLQkJX191OCBfbWFwW3NjdHBfdHNubWFwX3N0b3JhZ2Vfc2l6ZShTQ1RQX1RTTl9NQVBfU0laRSldOwogCiAJCS8qIEFjayBTdGF0ZSAgIDogVGhpcyBmbGFnIGluZGljYXRlcyBpZiB0aGUgbmV4dCByZWNlaXZlZAogCQkgKiAgICAgICAgICAgICA6IHBhY2tldCBpcyB0byBiZSByZXNwb25kZWQgdG8gd2l0aCBhCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3Rzbm1hcC5oIGIvaW5jbHVkZS9uZXQvc2N0cC90c25tYXAuaAppbmRleCAwOTkyMTFiLi40YWFiYzVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3Rzbm1hcC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdHNubWFwLmgKQEAgLTYwLDE4ICs2MCw3IEBACiAJICogSXQgcG9pbnRzIGF0IG9uZSBvZiB0aGUgdHdvIGJ1ZmZlcnMgd2l0aCB3aGljaCB3ZSB3aWxsCiAJICogcGluZy1wb25nIGJldHdlZW4uCiAJICovCi0JX191OCAqdHNuX21hcDsKLQotCS8qIFRoaXMgbWFya3MgdGhlIHRzbiB3aGljaCBvdmVyZmxvd3MgdGhlIHRzbl9tYXAsIHdoZW4gdGhlCi0JICogY3VtdWxhdGl2ZSBhY2sgcG9pbnQgcmVhY2hlcyB0aGlzIHBvaW50IHdlIGtub3cgd2UgY2FuIHN3aXRjaAotCSAqIG1hcHMgKHRzbl9tYXAgYW5kIG92ZXJmbG93X21hcCBzd2FwKS4KLQkgKi8KLQlfX3UzMiBvdmVyZmxvd190c247Ci0KLQkvKiBUaGlzIGlzIHRoZSBvdmVyZmxvdyBhcnJheSBmb3IgdHNuX21hcC4KLQkgKiBJdCBwb2ludHMgYXQgb25lIG9mIHRoZSBvdGhlciBwaW5nLXBvbmcgYnVmZmVycy4KLQkgKi8KLQlfX3U4ICpvdmVyZmxvd19tYXA7CisJdW5zaWduZWQgbG9uZyAqdHNuX21hcDsKIAogCS8qIFRoaXMgaXMgdGhlIFRTTiBhdCB0c25fbWFwWzBdLiAgKi8KIAlfX3UzMiBiYXNlX3RzbjsKQEAgLTg5LDE1ICs3OCwxNSBAQAogCSAqLwogCV9fdTMyIGN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKIAorCS8qIFRoaXMgaXMgdGhlIGhpZ2hlc3QgVFNOIHdlJ3ZlIG1hcmtlZC4gICovCisJX191MzIgbWF4X3Rzbl9zZWVuOworCiAJLyogVGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgVFNOcyB3ZSBjYW4gdHJhY2suICBUaGlzIGNvcnJlc3BvbmRzCiAJICogdG8gdGhlIHNpemUgb2YgdHNuX21hcC4gICBOb3RlOiB0aGUgb3ZlcmZsb3dfbWFwIGFsbG93cyB1cyB0bwogCSAqIHBvdGVudGlhbGx5IHRyYWNrIG1vcmUgdGhhbiB0aGlzIHF1YW50aXR5LgogCSAqLwogCV9fdTE2IGxlbjsKIAotCS8qIFRoaXMgaXMgdGhlIGhpZ2hlc3QgVFNOIHdlJ3ZlIG1hcmtlZC4gICovCi0JX191MzIgbWF4X3Rzbl9zZWVuOwotCiAJLyogRGF0YSBjaHVua3MgcGVuZGluZyByZWNlaXB0LiB1c2VkIGJ5IFNDVFBfU1RBVFVTIHNvY2tvcHQgKi8KIAlfX3UxNiBwZW5kaW5nX2RhdGE7CiAKQEAgLTEwNSwyOSArOTQsMTkgQEAKIAkgKiBldmVyeSBTQUNLLiAgU3RvcmUgdXAgdG8gU0NUUF9NQVhfRFVQX1RTTlMgd29ydGggb2YKIAkgKiBpbmZvcm1hdGlvbi4KIAkgKi8KLQlfX2JlMzIgZHVwX3RzbnNbU0NUUF9NQVhfRFVQX1RTTlNdOwogCV9fdTE2IG51bV9kdXBfdHNuczsKLQotCS8qIFJlY29yZCBnYXAgYWNrIGJsb2NrIGluZm9ybWF0aW9uIGhlcmUuICAqLwotCXN0cnVjdCBzY3RwX2dhcF9hY2tfYmxvY2sgZ2Fic1tTQ1RQX01BWF9HQUJTXTsKLQotCWludCBtYWxsb2NlZDsKLQotCV9fdTggcmF3X21hcFswXTsKKwlfX2JlMzIgZHVwX3RzbnNbU0NUUF9NQVhfRFVQX1RTTlNdOwogfTsKIAogc3RydWN0IHNjdHBfdHNubWFwX2l0ZXIgewogCV9fdTMyIHN0YXJ0OwogfTsKIAotLyogVGhpcyBtYWNybyBhc3Npc3RzIGluIGNyZWF0aW9uIG9mIGV4dGVybmFsIHN0b3JhZ2UgZm9yIHZhcmlhYmxlIGxlbmd0aAotICogaW50ZXJuYWwgYnVmZmVycy4gIFdlIGRvdWJsZSBhbGxvY2F0ZSBzbyB0aGUgb3ZlcmZsb3cgbWFwIHdvcmtzLgotICovCi0jZGVmaW5lIHNjdHBfdHNubWFwX3N0b3JhZ2Vfc2l6ZShjb3VudCkgKHNpemVvZihfX3U4KSAqIChjb3VudCkgKiAyKQotCiAvKiBJbml0aWFsaXplIGEgYmxvY2sgb2YgbWVtb3J5IGFzIGEgdHNubWFwLiAgKi8KIHN0cnVjdCBzY3RwX3Rzbm1hcCAqc2N0cF90c25tYXBfaW5pdChzdHJ1Y3Qgc2N0cF90c25tYXAgKiwgX191MTYgbGVuLAotCQkJCSAgICAgX191MzIgaW5pdGlhbF90c24pOworCQkJCSAgICAgX191MzIgaW5pdGlhbF90c24sIGdmcF90IGdmcCk7CisKK3ZvaWQgc2N0cF90c25tYXBfZnJlZShzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCk7CiAKIC8qIFRlc3QgdGhlIHRyYWNraW5nIHN0YXRlIG9mIHRoaXMgVFNOLgogICogUmV0dXJuczoKQEAgLTEzOCw3ICsxMTcsNyBAQAogaW50IHNjdHBfdHNubWFwX2NoZWNrKGNvbnN0IHN0cnVjdCBzY3RwX3Rzbm1hcCAqLCBfX3UzMiB0c24pOwogCiAvKiBNYXJrIHRoaXMgVFNOIGFzIHNlZW4uICAqLwotdm9pZCBzY3RwX3Rzbm1hcF9tYXJrKHN0cnVjdCBzY3RwX3Rzbm1hcCAqLCBfX3UzMiB0c24pOworaW50IHNjdHBfdHNubWFwX21hcmsoc3RydWN0IHNjdHBfdHNubWFwICosIF9fdTMyIHRzbik7CiAKIC8qIE1hcmsgdGhpcyBUU04gYW5kIGFsbCBsb3dlciBhcyBzZWVuLiAqLwogdm9pZCBzY3RwX3Rzbm1hcF9za2lwKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCBfX3UzMiB0c24pOwpAQCAtMTY5LDI0ICsxNDgsMTYgQEAKIH0KIAogLyogSG93IG1hbnkgZ2FwIGFjayBibG9ja3MgZG8gd2UgaGF2ZSByZWNvcmRlZD8gKi8KLV9fdTE2IHNjdHBfdHNubWFwX251bV9nYWJzKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwKTsKK19fdTE2IHNjdHBfdHNubWFwX251bV9nYWJzKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLAorCQkJICAgc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayAqZ2Ficyk7CiAKIC8qIFJlZnJlc2ggdGhlIGNvdW50IG9uIHBlbmRpbmcgZGF0YS4gKi8KIF9fdTE2IHNjdHBfdHNubWFwX3BlbmRpbmcoc3RydWN0IHNjdHBfdHNubWFwICptYXApOwogCi0vKiBSZXR1cm4gcG9pbnRlciB0byBnYXAgYWNrIGJsb2NrcyBhcyBuZWVkZWQgYnkgU0FDSy4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayAqc2N0cF90c25tYXBfZ2V0X2dhYnMoc3RydWN0IHNjdHBfdHNubWFwICptYXApCi17Ci0JcmV0dXJuIG1hcC0+Z2FiczsKLX0KLQogLyogSXMgdGhlcmUgYSBnYXAgaW4gdGhlIFRTTiBtYXA/ICAqLwogc3RhdGljIGlubGluZSBpbnQgc2N0cF90c25tYXBfaGFzX2dhcChjb25zdCBzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKIHsKLQlpbnQgaGFzX2dhcDsKLQotCWhhc19nYXAgPSAobWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgIT0gbWFwLT5tYXhfdHNuX3NlZW4pOwotCXJldHVybiBoYXNfZ2FwOworCXJldHVybiAobWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgIT0gbWFwLT5tYXhfdHNuX3NlZW4pOwogfQogCiAvKiBNYXJrIGEgZHVwbGljYXRlIFRTTi4gIE5vdGU6ICBsaW1pdCB0aGUgc3RvcmFnZSBvZiBkdXBsaWNhdGUgVFNOCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggMDZjNTI1OS4uYWRhNTBjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtNDgyLDYgKzQ4MiwxMSBAQAogCXNrYi0+bmV4dCA9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNrX2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2stPnNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOworfQorCiAjZGVmaW5lIHNrX3dhaXRfZXZlbnQoX19zaywgX190aW1lbywgX19jb25kaXRpb24pCQkJXAogCSh7CWludCBfX3JjOwkJCQkJCVwKIAkJcmVsZWFzZV9zb2NrKF9fc2spOwkJCQkJXApAQCAtNTMyLDYgKzUzNyw3IEBACiAJaW50CQkJKCpnZXRzb2Nrb3B0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgCiAJCQkJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCAKIAkJCQkJaW50IF9fdXNlciAqb3B0aW9uKTsgIAkgCisjaWZkZWYgQ09ORklHX0NPTVBBVAogCWludAkJCSgqY29tcGF0X3NldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJaW50IGxldmVsLAogCQkJCQlpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwKQEAgLTU0MCw2ICs1NDYsNyBAQAogCQkJCQlpbnQgbGV2ZWwsCiAJCQkJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLAogCQkJCQlpbnQgX191c2VyICpvcHRpb24pOworI2VuZGlmCiAJaW50CQkJKCpzZW5kbXNnKShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKIAlpbnQJCQkoKnJlY3Ztc2cpKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLApAQCAtMTMyMiw2ICsxMzI5LDE4IEBACiAJc29ja19uZXRfc2V0KHNrLCBob2xkX25ldChuZXQpKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqc2tiX3N0ZWFsX3NvY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodW5saWtlbHkoc2tiLT5zaykpIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKworCQlza2ItPmRlc3RydWN0b3IgPSBOVUxMOworCQlza2ItPnNrID0gTlVMTDsKKwkJcmV0dXJuIHNrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogZXh0ZXJuIHZvaWQgc29ja19lbmFibGVfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gaW50IHNvY2tfZ2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNvY2tfZ2V0X3RpbWVzdGFtcG5zKHN0cnVjdCBzb2NrICosIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfc2tiZWRpdC5oIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYmVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWJiM2VkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYmVkaXQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogQXV0aG9yOiBBbGV4YW5kZXIgRHV5Y2sgPGFsZXhhbmRlci5oLmR1eWNrQGludGVsLmNvbT4KKyAqLworCisjaWZuZGVmIF9fTkVUX1RDX1NLQkVESVRfSAorI2RlZmluZSBfX05FVF9UQ19TS0JFRElUX0gKKworI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CisKK3N0cnVjdCB0Y2Zfc2tiZWRpdCB7CisJc3RydWN0IHRjZl9jb21tb24JY29tbW9uOworCXUzMgkJCWZsYWdzOworCXUzMiAgICAgCQlwcmlvcml0eTsKKwl1MTYJCQlxdWV1ZV9tYXBwaW5nOworfTsKKyNkZWZpbmUgdG9fc2tiZWRpdChwYykgXAorCWNvbnRhaW5lcl9vZihwYywgc3RydWN0IHRjZl9za2JlZGl0LCBjb21tb24pCisKKyNlbmRpZiAvKiBfX05FVF9UQ19TS0JFRElUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggODk4MzM4Ni4uNDM4MDE0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTQ3Miw2ICs0NzIsOCBAQAogCiAvKiB0Y3BfaW5wdXQuYyAqLwogZXh0ZXJuIHZvaWQgdGNwX2N3bmRfYXBwbGljYXRpb25fbGltaXRlZChzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgdGNwX3NrYl9tYXJrX2xvc3RfdW5jb25kX3ZlcmlmeShzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIHRjcF90aW1lci5jICovCiBleHRlcm4gdm9pZCB0Y3BfaW5pdF94bWl0X3RpbWVycyhzdHJ1Y3Qgc29jayAqKTsKQEAgLTg5NCw3ICs4OTYsNyBAQAogCQkJQlVHX09OKHNvY2tfb3duZWRfYnlfdXNlcihzaykpOwogCiAJCQl3aGlsZSAoKHNrYjEgPSBfX3NrYl9kZXF1ZXVlKCZ0cC0+dWNvcHkucHJlcXVldWUpKSAhPSBOVUxMKSB7Ci0JCQkJc2stPnNrX2JhY2tsb2dfcmN2KHNrLCBza2IxKTsKKwkJCQlza19iYWNrbG9nX3Jjdihzaywgc2tiMSk7CiAJCQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BQUkVRVUVVRURST1BQRUQpOwogCQkJfQogCkBAIC05NzQsNiArOTc2LDcgQEAKIAlpcmVxLT5hY2tlZCA9IDA7CiAJaXJlcS0+ZWNuX29rID0gMDsKIAlpcmVxLT5ybXRfcG9ydCA9IHRjcF9oZHIoc2tiKS0+c291cmNlOworCWlyZXEtPmxvY19wb3J0ID0gdGNwX2hkcihza2IpLT5kZXN0OwogfQogCiBleHRlcm4gdm9pZCB0Y3BfZW50ZXJfbWVtb3J5X3ByZXNzdXJlKHN0cnVjdCBzb2NrICpzayk7CkBAIC0xMDM5LDEzICsxMDQyLDEyIEBACiB7CiAJdHAtPmxvc3Rfc2tiX2hpbnQgPSBOVUxMOwogCXRwLT5zY29yZWJvYXJkX3NrYl9oaW50ID0gTlVMTDsKLQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IE5VTEw7Ci0JdHAtPmZvcndhcmRfc2tiX2hpbnQgPSBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NsZWFyX2FsbF9yZXRyYW5zX2hpbnRzKHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7CiAJdGNwX2NsZWFyX3JldHJhbnNfaGludHNfcGFydGlhbCh0cCk7CisJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBOVUxMOwogfQogCiAvKiBNRDUgU2lnbmF0dXJlICovCkBAIC0xMTgwLDQ5ICsxMTgyLDQ1IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnRjcF93cml0ZV9xdWV1ZV9oZWFkKHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7Ci0JaWYgKHNrYiA9PSAoc3RydWN0IHNrX2J1ZmYgKikgJnNrLT5za193cml0ZV9xdWV1ZSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNrYjsKKwlyZXR1cm4gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnRjcF93cml0ZV9xdWV1ZV90YWlsKHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLnByZXY7Ci0JaWYgKHNrYiA9PSAoc3RydWN0IHNrX2J1ZmYgKikgJnNrLT5za193cml0ZV9xdWV1ZSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNrYjsKKwlyZXR1cm4gc2tiX3BlZWtfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3dyaXRlX3F1ZXVlX25leHQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBza2ItPm5leHQ7CisJcmV0dXJuIHNrYl9xdWV1ZV9uZXh0KCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CiB9CiAKICNkZWZpbmUgdGNwX2Zvcl93cml0ZV9xdWV1ZShza2IsIHNrKQkJCQkJXAotCQlmb3IgKHNrYiA9IChzayktPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CQkJXAotCQkgICAgIChza2IgIT0gKHN0cnVjdCBza19idWZmICopJihzayktPnNrX3dyaXRlX3F1ZXVlKTsJXAotCQkgICAgIHNrYiA9IHNrYi0+bmV4dCkKKwlza2JfcXVldWVfd2FsaygmKHNrKS0+c2tfd3JpdGVfcXVldWUsIHNrYikKIAogI2RlZmluZSB0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykJCQkJXAotCQlmb3IgKDsgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmKHNrKS0+c2tfd3JpdGVfcXVldWUpO1wKLQkJICAgICBza2IgPSBza2ItPm5leHQpCisJc2tiX3F1ZXVlX3dhbGtfZnJvbSgmKHNrKS0+c2tfd3JpdGVfcXVldWUsIHNrYikKIAogI2RlZmluZSB0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb21fc2FmZShza2IsIHRtcCwgc2spCQkJXAotCQlmb3IgKHRtcCA9IHNrYi0+bmV4dDsJCQkJCVwKLQkJICAgICAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSYoc2spLT5za193cml0ZV9xdWV1ZSk7CVwKLQkJICAgICBza2IgPSB0bXAsIHRtcCA9IHNrYi0+bmV4dCkKKwlza2JfcXVldWVfd2Fsa19mcm9tX3NhZmUoJihzayktPnNrX3dyaXRlX3F1ZXVlLCBza2IsIHRtcCkKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIHNrLT5za19zZW5kX2hlYWQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCB0Y3Bfc2tiX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9xdWV1ZV9pc19sYXN0KCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfYWR2YW5jZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrLT5za19zZW5kX2hlYWQgPSBza2ItPm5leHQ7Ci0JaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZSkKKwlpZiAodGNwX3NrYl9pc19sYXN0KHNrLCBza2IpKQogCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKKwllbHNlCisJCXNrLT5za19zZW5kX2hlYWQgPSB0Y3Bfd3JpdGVfcXVldWVfbmV4dChzaywgc2tiKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9jaGVja19zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3VubGlua2VkKQpAQCAtMTI2NywxMiArMTI2NSwxMiBAQAogCV9fc2tiX3F1ZXVlX2FmdGVyKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYiwgYnVmZik7CiB9CiAKLS8qIEluc2VydCBza2IgYmV0d2VlbiBwcmV2IGFuZCBuZXh0IG9uIHRoZSB3cml0ZSBxdWV1ZSBvZiBzay4gICovCisvKiBJbnNlcnQgbmV3IGJlZm9yZSBza2Igb24gdGhlIHdyaXRlIHF1ZXVlIG9mIHNrLiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfaW5zZXJ0X3dyaXRlX3F1ZXVlX2JlZm9yZShzdHJ1Y3Qgc2tfYnVmZiAqbmV3LAogCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkJICBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JX19za2JfaW5zZXJ0KG5ldywgc2tiLT5wcmV2LCBza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworCV9fc2tiX3F1ZXVlX2JlZm9yZSgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IsIG5ldyk7CiAKIAlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2IpCiAJCXNrLT5za19zZW5kX2hlYWQgPSBuZXc7CkBAIC0xMjgzLDEyICsxMjgxLDYgQEAKIAlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGNwX3NrYl9pc19sYXN0KGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB0Y3Bfd3JpdGVfcXVldWVfZW1wdHkoc3RydWN0IHNvY2sgKnNrKQogewogCXJldHVybiBza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHAuaCBiL2luY2x1ZGUvbmV0L3VkcC5oCmluZGV4IGFkZGNkYzYuLjFlMjA1MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC0xNDgsMTAgKzE0OCw5IEBACiAJCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKIAkJCQkgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSk7CiAKLURFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBfc3RhdHNfaW42KTsKLQotLyogVURQLUxpdGUgZG9lcyBub3QgaGF2ZSBhIHN0YW5kYXJkaXplZCBNSUIgeWV0LCBzbyB3ZSBpbmhlcml0IGZyb20gVURQICovCi1ERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwbGl0ZV9zdGF0c19pbjYpOworZXh0ZXJuIHN0cnVjdCBzb2NrICp1ZHA0X2xpYl9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgc2FkZHIsIF9fYmUxNiBzcG9ydCwKKwkJCQkgICAgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQsCisJCQkJICAgIGludCBkaWYpOwogCiAvKgogICogCVNOTVAgc3RhdGlzdGljcyBmb3IgVURQIGFuZCBVRFAtTGl0ZQpAQCAtMTYzLDEyICsxNjIsMTQgQEAKIAlpZiAoaXNfdWRwbGl0ZSkgU05NUF9JTkNfU1RBVFNfQkgoKG5ldCktPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MsIGZpZWxkKTsgICAgICAgICBcCiAJZWxzZQkJU05NUF9JTkNfU1RBVFNfQkgoKG5ldCktPm1pYi51ZHBfc3RhdGlzdGljcywgZmllbGQpOyAgICB9ICB3aGlsZSgwKQogCi0jZGVmaW5lIFVEUDZfSU5DX1NUQVRTX0JIKG5ldCwgZmllbGQsIGlzX3VkcGxpdGUpIAkgICAgZG8geyAodm9pZCluZXQ7ICBcCi0JaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX0JIKHVkcGxpdGVfc3RhdHNfaW42LCBmaWVsZCk7ICAgICAgICAgXAotCWVsc2UJCVNOTVBfSU5DX1NUQVRTX0JIKHVkcF9zdGF0c19pbjYsIGZpZWxkKTsgICAgfSB3aGlsZSgwKQotI2RlZmluZSBVRFA2X0lOQ19TVEFUU19VU0VSKG5ldCwgZmllbGQsIGlzX3VkcGxpdGUpCSAgICBkbyB7ICh2b2lkKW5ldDsgICAgXAotCWlmIChpc191ZHBsaXRlKSBTTk1QX0lOQ19TVEFUU19VU0VSKHVkcGxpdGVfc3RhdHNfaW42LCBmaWVsZCk7ICAgICAgICAgXAotCWVsc2UJCVNOTVBfSU5DX1NUQVRTX1VTRVIodWRwX3N0YXRzX2luNiwgZmllbGQpOyAgICB9IHdoaWxlKDApCisjZGVmaW5lIFVEUDZfSU5DX1NUQVRTX0JIKG5ldCwgZmllbGQsIGlzX3VkcGxpdGUpIAkgICAgZG8geyBcCisJaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX0JIKChuZXQpLT5taWIudWRwbGl0ZV9zdGF0c19pbjYsIGZpZWxkKTtcCisJZWxzZQkJU05NUF9JTkNfU1RBVFNfQkgoKG5ldCktPm1pYi51ZHBfc3RhdHNfaW42LCBmaWVsZCk7ICBcCit9IHdoaWxlKDApCisjZGVmaW5lIFVEUDZfSU5DX1NUQVRTX1VTRVIobmV0LCBmaWVsZCwgX19saXRlKQkJICAgIGRvIHsgXAorCWlmIChfX2xpdGUpIFNOTVBfSU5DX1NUQVRTX1VTRVIoKG5ldCktPm1pYi51ZHBsaXRlX3N0YXRzX2luNiwgZmllbGQpOyAgXAorCWVsc2UJICAgIFNOTVBfSU5DX1NUQVRTX1VTRVIoKG5ldCktPm1pYi51ZHBfc3RhdHNfaW42LCBmaWVsZCk7ICAgICAgXAorfSB3aGlsZSgwKQogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAjZGVmaW5lIFVEUFhfSU5DX1NUQVRTX0JIKHNrLCBmaWVsZCkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvd2lyZWxlc3MuaCBiL2luY2x1ZGUvbmV0L3dpcmVsZXNzLmgKaW5kZXggOTMyNGY4ZC4uNzIxZWZiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvd2lyZWxlc3MuaAorKysgYi9pbmNsdWRlL25ldC93aXJlbGVzcy5oCkBAIC02MCw2ICs2MCw3IEBACiAgKiB3aXRoIGNmZzgwMjExLgogICoKICAqIEBjZW50ZXJfZnJlcTogY2VudGVyIGZyZXF1ZW5jeSBpbiBNSHoKKyAqIEBtYXhfYmFuZHdpZHRoOiBtYXhpbXVtIGFsbG93ZWQgYmFuZHdpZHRoIGZvciB0aGlzIGNoYW5uZWwsIGluIE1IegogICogQGh3X3ZhbHVlOiBoYXJkd2FyZS1zcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIGNoYW5uZWwKICAqIEBmbGFnczogY2hhbm5lbCBmbGFncyBmcm9tICZlbnVtIGllZWU4MDIxMV9jaGFubmVsX2ZsYWdzLgogICogQG9yaWdfZmxhZ3M6IGNoYW5uZWwgZmxhZ3MgYXQgcmVnaXN0cmF0aW9uIHRpbWUsIHVzZWQgYnkgcmVndWxhdG9yeQpAQCAtNzMsNiArNzQsNyBAQAogc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHsKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAJdTE2IGNlbnRlcl9mcmVxOworCXU4IG1heF9iYW5kd2lkdGg7CiAJdTE2IGh3X3ZhbHVlOwogCXUzMiBmbGFnczsKIAlpbnQgbWF4X2FudGVubmFfZ2FpbjsKQEAgLTE3OCw2ICsxODAsNyBAQAogICogc3RydWN0IHdpcGh5IC0gd2lyZWxlc3MgaGFyZHdhcmUgZGVzY3JpcHRpb24KICAqIEBpZHg6IHRoZSB3aXBoeSBpbmRleCBhc3NpZ25lZCB0byB0aGlzIGl0ZW0KICAqIEBjbGFzc19kZXY6IHRoZSBjbGFzcyBkZXZpY2UgcmVwcmVzZW50aW5nIC9zeXMvY2xhc3MvaWVlZTgwMjExLzx3aXBoeS1uYW1lPgorICogQHJlZ19ub3RpZmllcjogdGhlIGRyaXZlcidzIHJlZ3VsYXRvcnkgbm90aWZpY2F0aW9uIGNhbGxiYWNrCiAgKi8KIHN0cnVjdCB3aXBoeSB7CiAJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLwpAQCAtMTg1LDYgKzE4OCw5IEBACiAJLyogcGVybWFuZW50IE1BQyBhZGRyZXNzICovCiAJdTggcGVybV9hZGRyW0VUSF9BTEVOXTsKIAorCS8qIFN1cHBvcnRlZCBpbnRlcmZhY2UgbW9kZXMsIE9SIHRvZ2V0aGVyIEJJVChOTDgwMjExX0lGVFlQRV8uLi4pICovCisJdTE2IGludGVyZmFjZV9tb2RlczsKKwogCS8qIElmIG11bHRpcGxlIHdpcGh5cyBhcmUgcmVnaXN0ZXJlZCBhbmQgeW91J3JlIGhhbmRlZCBlLmcuCiAJICogYSByZWd1bGFyIG5ldGRldiB3aXRoIGFzc2lnbmVkIGllZWU4MDIxMV9wdHIsIHlvdSB3b24ndAogCSAqIGtub3cgd2hldGhlciBpdCBwb2ludHMgdG8gYSB3aXBoeSB5b3VyIGRyaXZlciBoYXMgcmVnaXN0ZXJlZApAQCAtMTk0LDYgKzIwMCw5IEBACiAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKIAorCS8qIExldHMgdXMgZ2V0IGJhY2sgdGhlIHdpcGh5IG9uIHRoZSBjYWxsYmFjayAqLworCWludCAoKnJlZ19ub3RpZmllcikoc3RydWN0IHdpcGh5ICp3aXBoeSwgZW51bSByZWdfc2V0X2J5IHNldGJ5KTsKKwogCS8qIGZpZWxkcyBiZWxvdyBhcmUgcmVhZC1vbmx5LCBhc3NpZ25lZCBieSBjZmc4MDIxMSAqLwogCiAJLyogdGhlIGl0ZW0gaW4gL3N5cy9jbGFzcy9pZWVlODAyMTEvIHBvaW50cyB0byB0aGlzLApAQCAtMjE0LDkgKzIyMywxMSBAQAogICogdGhlIG5ldGRldi4pCiAgKgogICogQHdpcGh5OiBwb2ludGVyIHRvIGhhcmR3YXJlIGRlc2NyaXB0aW9uCisgKiBAaWZ0eXBlOiBpbnRlcmZhY2UgdHlwZQogICovCiBzdHJ1Y3Qgd2lyZWxlc3NfZGV2IHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCWVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlOwogCiAJLyogcHJpdmF0ZSB0byB0aGUgZ2VuZXJpYyB3aXJlbGVzcyBjb2RlICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMzE5LDcgKzMzMCw2IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKl9faWVlZTgwMjExX2dldF9jaGFubmVsKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJCQkJIGludCBmcmVxKTsKLQogLyoqCiAgKiBpZWVlODAyMTFfZ2V0X2NoYW5uZWwgLSBnZXQgY2hhbm5lbCBzdHJ1Y3QgZnJvbSB3aXBoeSBmb3Igc3BlY2lmaWVkIGZyZXF1ZW5jeQogICovCkBAIC0zMjgsNCArMzM4LDU3IEBACiB7CiAJcmV0dXJuIF9faWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKIH0KKworLyoqCisgKiBfX3JlZ3VsYXRvcnlfaGludCAtIGhpbnQgdG8gdGhlIHdpcmVsZXNzIGNvcmUgYSByZWd1bGF0b3J5IGRvbWFpbgorICogQHdpcGh5OiBpZiBhIGRyaXZlciBpcyBwcm92aWRpbmcgdGhlIGhpbnQgdGhpcyBpcyB0aGUgZHJpdmVyJ3MgdmVyeQorICogCW93biAmc3RydWN0IHdpcGh5CisgKiBAYWxwaGEyOiB0aGUgSVNPL0lFQyAzMTY2IGFscGhhMiBiZWluZyBjbGFpbWVkIHRoZSByZWd1bGF0b3J5IGRvbWFpbgorICogCXNob3VsZCBiZSBpbi4gSWYgQHJkIGlzIHNldCB0aGlzIHNob3VsZCBiZSBOVUxMCisgKiBAcmQ6IGEgY29tcGxldGUgcmVndWxhdG9yeSBkb21haW4sIGlmIHBhc3NlZCB0aGUgY2FsbGVyIG5lZWQgbm90IHdvcnJ5CisgKiAJYWJvdXQgZnJlZWluZyBpdAorICoKKyAqIFRoZSBXaXJlbGVzcyBzdWJzeXN0ZW0gY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGhpbnQgdG8gdGhlIHdpcmVsZXNzIGNvcmUKKyAqIHdoYXQgaXQgYmVsaWV2ZXMgc2hvdWxkIGJlIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluIGJ5CisgKiBnaXZpbmcgaXQgYW4gSVNPL0lFQyAzMTY2IGFscGhhMiBjb3VudHJ5IGNvZGUgaXQga25vd3MgaXRzIHJlZ3VsYXRvcnkKKyAqIGRvbWFpbiBzaG91bGQgYmUgaW4gb3IgYnkgcHJvdmlkaW5nIGEgY29tcGxldGVseSBidWlsZCByZWd1bGF0b3J5IGRvbWFpbi4KKyAqCisgKiBSZXR1cm5zIC1FQUxSRUFEWSBpZiAqYSByZWd1bGF0b3J5IGRvbWFpbiogaGFzIGFscmVhZHkgYmVlbiBzZXQuIE5vdGUgdGhhdAorICogdGhpcyBjb3VsZCBiZSBieSBhbm90aGVyIGRyaXZlci4gSXQgaXMgc2FmZSBmb3IgZHJpdmVycyB0byBjb250aW51ZSBpZgorICogLUVBTFJFQURZIGlzIHJldHVybmVkLCBpZiBkcml2ZXJzIGFyZSBub3QgY2FwYWJsZSBvZiB3b3JsZCByb2FtaW5nIHRoZXkKKyAqIHNob3VsZCBub3QgcmVnaXN0ZXIgbW9yZSBjaGFubmVscyB0aGFuIHRoZXkgc3VwcG9ydC4gUmlnaHQgbm93IHdlIG9ubHkKKyAqIHN1cHBvcnQgbGlzdGVuaW5nIHRvIHRoZSBmaXJzdCBkcml2ZXIgaGludC4gSWYgdGhlIGRyaXZlciBpcyBjYXBhYmxlCisgKiBvZiB3b3JsZCByb2FtaW5nIGJ1dCB3YW50cyB0byByZXNwZWN0IGl0cyBvd24gRUVQUk9NIG1hcHBpbmdzIGZvcgorICogc3BlY2lmaWMgcmVndWxhdG9yeSBkb21haW5zIGl0IHNob3VsZCByZWdpc3RlciB0aGUgQHJlZ19ub3RpZmllciBjYWxsYmFjaworICogb24gdGhlICZzdHJ1Y3Qgd2lwaHkuIFJldHVybnMgMCBpZiB0aGUgaGludCB3ZW50IHRocm91Z2ggZmluZSBvciB0aHJvdWdoIGFuCisgKiBpbnRlcnNlY3Rpb24gb3BlcmF0aW9uLiBPdGhlcndpc2UgYSBzdGFuZGFyZCBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorICoKKyAqLworZXh0ZXJuIGludCBfX3JlZ3VsYXRvcnlfaGludChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlbnVtIHJlZ19zZXRfYnkgc2V0X2J5LAorCQljb25zdCBjaGFyICphbHBoYTIsIHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCk7CisvKioKKyAqIHJlZ3VsYXRvcnlfaGludCAtIGRyaXZlciBoaW50IHRvIHRoZSB3aXJlbGVzcyBjb3JlIGEgcmVndWxhdG9yeSBkb21haW4KKyAqIEB3aXBoeTogdGhlIGRyaXZlcidzIHZlcnkgb3duICZzdHJ1Y3Qgd2lwaHkKKyAqIEBhbHBoYTI6IHRoZSBJU08vSUVDIDMxNjYgYWxwaGEyIHRoZSBkcml2ZXIgY2xhaW1zIGl0cyByZWd1bGF0b3J5IGRvbWFpbgorICogCXNob3VsZCBiZSBpbi4gSWYgQHJkIGlzIHNldCB0aGlzIHNob3VsZCBiZSBOVUxMLiBOb3RlIHRoYXQgaWYgeW91CisgKiAJc2V0IHRoaXMgdG8gTlVMTCB5b3Ugc2hvdWxkIHN0aWxsIHNldCByZC0+YWxwaGEyIHRvIHNvbWUgYWNjZXB0ZWQKKyAqIAlhbHBoYTIuCisgKiBAcmQ6IGEgY29tcGxldGUgcmVndWxhdG9yeSBkb21haW4gcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4gSWYgcGFzc2VkCisgKiAJdGhlIGRyaXZlciBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGZyZWVpbmcgaXQuCisgKgorICogV2lyZWxlc3MgZHJpdmVycyBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gaGludCB0byB0aGUgd2lyZWxlc3MgY29yZQorICogd2hhdCBpdCBiZWxpZXZlcyBzaG91bGQgYmUgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4gYnkKKyAqIGdpdmluZyBpdCBhbiBJU08vSUVDIDMxNjYgYWxwaGEyIGNvdW50cnkgY29kZSBpdCBrbm93cyBpdHMgcmVndWxhdG9yeQorICogZG9tYWluIHNob3VsZCBiZSBpbiBvciBieSBwcm92aWRpbmcgYSBjb21wbGV0ZWx5IGJ1aWxkIHJlZ3VsYXRvcnkgZG9tYWluLgorICogSWYgdGhlIGRyaXZlciBwcm92aWRlcyBhbiBJU08vSUVDIDMxNjYgYWxwaGEyIHVzZXJzcGFjZSB3aWxsIGJlIHF1ZXJpZWQKKyAqIGZvciBhIHJlZ3VsYXRvcnkgZG9tYWluIHN0cnVjdHVyZSBmb3IgdGhlIHJlc3BlY3RpdmUgY291bnRyeS4gSWYKKyAqIGEgcmVndWxhdG9yeSBkb21haW4gaXMgYnVpbGQgYW5kIHBhc3NlZCB5b3Ugc2hvdWxkIHNldCB0aGUgYWxwaGEyCisgKiBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHNldCBpdCB0byB0aGUgc3BlY2lhbCB2YWx1ZSBvZiAiOTkiIHdoaWNoIHRlbGxzCisgKiB0aGUgd2lyZWxlc3MgY29yZSBpdCBpcyB1bmtub3duLiBJZiB5b3UgcGFzcyBhIGJ1aWx0IHJlZ3VsYXRvcnkgZG9tYWluCisgKiBhbmQgd2UgcmV0dXJuIG5vbiB6ZXJvIHlvdSBhcmUgaW4gY2hhcmdlIG9mIGtmcmVlKCknaW5nIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogU2VlIF9fcmVndWxhdG9yeV9oaW50KCkgZG9jdW1lbnRhdGlvbiBmb3IgcG9zc2libGUgcmV0dXJuIHZhbHVlcy4KKyAqLworZXh0ZXJuIGludCByZWd1bGF0b3J5X2hpbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJY29uc3QgY2hhciAqYWxwaGEyLCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpOwogI2VuZGlmIC8qIF9fTkVUX1dJUkVMRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCAyOTMzZDc0Ny4uMTFjODkwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveGZybS5oCisrKyBiL2luY2x1ZGUvbmV0L3hmcm0uaApAQCAtMTE3LDEyICsxMTcsMjMgQEAKICAgICAgIG1ldHJpY3MuIFBsdXMsIGl0IHdpbGwgYmUgbWFkZSB2aWEgc2stPnNrX2RzdF9jYWNoZS4gU29sdmVkLgogICovCiAKK3N0cnVjdCB4ZnJtX3N0YXRlX3dhbGsgeworCXN0cnVjdCBsaXN0X2hlYWQJYWxsOworCXU4CQkJc3RhdGU7CisJdW5pb24geworCQl1OAkJZHlpbmc7CisJCXU4CQlwcm90bzsKKwl9OworCXUzMgkJCXNlcTsKK307CisKIC8qIEZ1bGwgZGVzY3JpcHRpb24gb2Ygc3RhdGUgb2YgdHJhbnNmb3JtZXIuICovCiBzdHJ1Y3QgeGZybV9zdGF0ZQogewotCS8qIE5vdGU6IGJ5ZHN0IGlzIHJlLXVzZWQgZHVyaW5nIGdjICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhbGw7Ci0Jc3RydWN0IGhsaXN0X25vZGUJYnlkc3Q7CisJdW5pb24geworCQlzdHJ1Y3QgaGxpc3Rfbm9kZQlnY2xpc3Q7CisJCXN0cnVjdCBobGlzdF9ub2RlCWJ5ZHN0OworCX07CiAJc3RydWN0IGhsaXN0X25vZGUJYnlzcmM7CiAJc3RydWN0IGhsaXN0X25vZGUJYnlzcGk7CiAKQEAgLTEzNCwxMiArMTQ1LDggQEAKIAogCXUzMgkJCWdlbmlkOwogCi0JLyogS2V5IG1hbmdlciBiaXRzICovCi0Jc3RydWN0IHsKLQkJdTgJCXN0YXRlOwotCQl1OAkJZHlpbmc7Ci0JCXUzMgkJc2VxOwotCX0ga207CisJLyogS2V5IG1hbmFnZXIgYml0cyAqLworCXN0cnVjdCB4ZnJtX3N0YXRlX3dhbGsJa207CiAKIAkvKiBQYXJhbWV0ZXJzIG9mIHRoaXMgc3RhdGUuICovCiAJc3RydWN0IHsKQEAgLTQ0NywxMCArNDU0LDIwIEBACiAKICNkZWZpbmUgWEZSTV9NQVhfREVQVEgJCTYKIAorc3RydWN0IHhmcm1fcG9saWN5X3dhbGtfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQJYWxsOworCXU4CQkJZGVhZDsKK307CisKK3N0cnVjdCB4ZnJtX3BvbGljeV93YWxrIHsKKwlzdHJ1Y3QgeGZybV9wb2xpY3lfd2Fsa19lbnRyeSB3YWxrOworCXU4IHR5cGU7CisJdTMyIHNlcTsKK307CisKIHN0cnVjdCB4ZnJtX3BvbGljeQogewogCXN0cnVjdCB4ZnJtX3BvbGljeQkqbmV4dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWJ5dHlwZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieWRzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieWlkeDsKIApAQCAtNDY1LDE3ICs0ODIsMjMgQEAKIAlzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcgbGZ0OwogCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1ciBjdXJsZnQ7CiAJc3RydWN0IGRzdF9lbnRyeSAgICAgICAqYnVuZGxlczsKLQl1MTYJCQlmYW1pbHk7CisJc3RydWN0IHhmcm1fcG9saWN5X3dhbGtfZW50cnkgd2FsazsKIAl1OAkJCXR5cGU7CiAJdTgJCQlhY3Rpb247CiAJdTgJCQlmbGFnczsKLQl1OAkJCWRlYWQ7CiAJdTgJCQl4ZnJtX25yOwotCS8qIFhYWCAxIGJ5dGUgaG9sZSwgdHJ5IHRvIHBhY2sgKi8KKwl1MTYJCQlmYW1pbHk7CiAJc3RydWN0IHhmcm1fc2VjX2N0eAkqc2VjdXJpdHk7CiAJc3RydWN0IHhmcm1fdG1wbCAgICAgICAJeGZybV92ZWNbWEZSTV9NQVhfREVQVEhdOwogfTsKIAorc3RydWN0IHhmcm1fa21hZGRyZXNzIHsKKwl4ZnJtX2FkZHJlc3NfdCAgICAgICAgICBsb2NhbDsKKwl4ZnJtX2FkZHJlc3NfdCAgICAgICAgICByZW1vdGU7CisJdTMyCQkJcmVzZXJ2ZWQ7CisJdTE2CQkJZmFtaWx5OworfTsKKwogc3RydWN0IHhmcm1fbWlncmF0ZSB7CiAJeGZybV9hZGRyZXNzX3QJCW9sZF9kYWRkcjsKIAl4ZnJtX2FkZHJlc3NfdAkJb2xkX3NhZGRyOwpAQCAtNTE1LDcgKzUzOCw3IEBACiAJaW50CQkJKCpuZXdfbWFwcGluZykoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIF9fYmUxNiBzcG9ydCk7CiAJaW50CQkJKCpub3RpZnlfcG9saWN5KShzdHJ1Y3QgeGZybV9wb2xpY3kgKngsIGludCBkaXIsIHN0cnVjdCBrbV9ldmVudCAqYyk7CiAJaW50CQkJKCpyZXBvcnQpKHU4IHByb3RvLCBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB4ZnJtX2FkZHJlc3NfdCAqYWRkcik7Ci0JaW50CQkJKCptaWdyYXRlKShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcyk7CisJaW50CQkJKCptaWdyYXRlKShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcywgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKTsKIH07CiAKIGV4dGVybiBpbnQgeGZybV9yZWdpc3Rlcl9rbShzdHJ1Y3QgeGZybV9tZ3IgKmttKTsKQEAgLTEyNDMsMTggKzEyNjYsNiBAQAogCWludCBwcmlvcml0eTsKIH07CiAKLXN0cnVjdCB4ZnJtX3N0YXRlX3dhbGsgewotCXN0cnVjdCB4ZnJtX3N0YXRlICpzdGF0ZTsKLQlpbnQgY291bnQ7Ci0JdTggcHJvdG87Ci19OwotCi1zdHJ1Y3QgeGZybV9wb2xpY3lfd2FsayB7Ci0Jc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3k7Ci0JaW50IGNvdW50OwotCXU4IHR5cGUsIGN1cl90eXBlOwotfTsKLQogZXh0ZXJuIHZvaWQgeGZybV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeGZybTRfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHhmcm1fc3RhdGVfaW5pdCh2b2lkKTsKQEAgLTEyNzksMjMgKzEyOTAsMTAgQEAKIGV4dGVybiBpbnQgeGZybV9wcm9jX2luaXQodm9pZCk7CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIHhmcm1fc3RhdGVfd2Fsa19pbml0KHN0cnVjdCB4ZnJtX3N0YXRlX3dhbGsgKndhbGssIHU4IHByb3RvKQotewotCXdhbGstPnByb3RvID0gcHJvdG87Ci0Jd2Fsay0+c3RhdGUgPSBOVUxMOwotCXdhbGstPmNvdW50ID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHhmcm1fc3RhdGVfd2Fsa19kb25lKHN0cnVjdCB4ZnJtX3N0YXRlX3dhbGsgKndhbGspCi17Ci0JaWYgKHdhbGstPnN0YXRlICE9IE5VTEwpIHsKLQkJeGZybV9zdGF0ZV9wdXQod2Fsay0+c3RhdGUpOwotCQl3YWxrLT5zdGF0ZSA9IE5VTEw7Ci0JfQotfQotCitleHRlcm4gdm9pZCB4ZnJtX3N0YXRlX3dhbGtfaW5pdChzdHJ1Y3QgeGZybV9zdGF0ZV93YWxrICp3YWxrLCB1OCBwcm90byk7CiBleHRlcm4gaW50IHhmcm1fc3RhdGVfd2FsayhzdHJ1Y3QgeGZybV9zdGF0ZV93YWxrICp3YWxrLAogCQkJICAgaW50ICgqZnVuYykoc3RydWN0IHhmcm1fc3RhdGUgKiwgaW50LCB2b2lkKiksIHZvaWQgKik7CitleHRlcm4gdm9pZCB4ZnJtX3N0YXRlX3dhbGtfZG9uZShzdHJ1Y3QgeGZybV9zdGF0ZV93YWxrICp3YWxrKTsKIGV4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9zdGF0ZV9hbGxvYyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9zdGF0ZV9maW5kKHhmcm1fYWRkcmVzc190ICpkYWRkciwgeGZybV9hZGRyZXNzX3QgKnNhZGRyLCAKIAkJCQkJICBzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV90bXBsICp0bXBsLApAQCAtMTQxOSwyNCArMTQxNywxMCBAQAogCiBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2FsbG9jKGdmcF90IGdmcCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3BvbGljeV93YWxrX2luaXQoc3RydWN0IHhmcm1fcG9saWN5X3dhbGsgKndhbGssIHU4IHR5cGUpCi17Ci0Jd2Fsay0+Y3VyX3R5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47Ci0Jd2Fsay0+dHlwZSA9IHR5cGU7Ci0Jd2Fsay0+cG9saWN5ID0gTlVMTDsKLQl3YWxrLT5jb3VudCA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3BvbGljeV93YWxrX2RvbmUoc3RydWN0IHhmcm1fcG9saWN5X3dhbGsgKndhbGspCi17Ci0JaWYgKHdhbGstPnBvbGljeSAhPSBOVUxMKSB7Ci0JCXhmcm1fcG9sX3B1dCh3YWxrLT5wb2xpY3kpOwotCQl3YWxrLT5wb2xpY3kgPSBOVUxMOwotCX0KLX0KLQorZXh0ZXJuIHZvaWQgeGZybV9wb2xpY3lfd2Fsa19pbml0KHN0cnVjdCB4ZnJtX3BvbGljeV93YWxrICp3YWxrLCB1OCB0eXBlKTsKIGV4dGVybiBpbnQgeGZybV9wb2xpY3lfd2FsayhzdHJ1Y3QgeGZybV9wb2xpY3lfd2FsayAqd2FsaywKIAlpbnQgKCpmdW5jKShzdHJ1Y3QgeGZybV9wb2xpY3kgKiwgaW50LCBpbnQsIHZvaWQqKSwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIHhmcm1fcG9saWN5X3dhbGtfZG9uZShzdHJ1Y3QgeGZybV9wb2xpY3lfd2FsayAqd2Fsayk7CiBpbnQgeGZybV9wb2xpY3lfaW5zZXJ0KGludCBkaXIsIHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5LCBpbnQgZXhjbCk7CiBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2J5c2VsX2N0eCh1OCB0eXBlLCBpbnQgZGlyLAogCQkJCQkgIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsCkBAIC0xNDU1LDEyICsxNDM5LDE0IEBACiAKICNpZmRlZiBDT05GSUdfWEZSTV9NSUdSQVRFCiBleHRlcm4gaW50IGttX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAotCQkgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMpOworCQkgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMsCisJCSAgICAgIHN0cnVjdCB4ZnJtX2ttYWRkcmVzcyAqayk7CiBleHRlcm4gc3RydWN0IHhmcm1fc3RhdGUgKiB4ZnJtX21pZ3JhdGVfc3RhdGVfZmluZChzdHJ1Y3QgeGZybV9taWdyYXRlICptKTsKIGV4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fc3RhdGVfbWlncmF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKIAkJCQkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSk7CiBleHRlcm4gaW50IHhmcm1fbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCi0JCQlzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMpOworCQkJc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzLAorCQkJc3RydWN0IHhmcm1fa21hZGRyZXNzICprKTsKICNlbmRpZgogCiBleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3Qga21fd2FpdHE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmggYi9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmgKaW5kZXggYWQ2ZTI3OC4uYjQxNzk4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY2lzY29kZS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2Npc2NvZGUuaApAQCAtMTE5LDcgKzExOSw3IEBACiAKICNkZWZpbmUgTUFORklEX1RPU0hJQkEJCQkweDAwOTgKIAotI2RlZmluZSBNQU5GSURfVU5HRVJNQU5OIDB4MDJjMAorI2RlZmluZSBNQU5GSURfVU5HRVJNQU5OCQkweDAyYzAKIAogI2RlZmluZSBNQU5GSURfWElSQ09NCQkJMHgwMTA1CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2Npc3RwbC5oIGIvaW5jbHVkZS9wY21jaWEvY2lzdHBsLmgKaW5kZXggZTJlMTBjMS4uY2ZkZDVhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY2lzdHBsLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvY2lzdHBsLmgKQEAgLTU3Myw0NCArNTczLDYgQEAKICNkZWZpbmUgVFVQTEVfUkVUVVJOX0xJTksJMHgwMQogI2RlZmluZSBUVVBMRV9SRVRVUk5fQ09NTU9OCTB4MDIKIAotLyogRm9yIFZhbGlkYXRlQ0lTICovCi10eXBlZGVmIHN0cnVjdCBjaXNpbmZvX3QgewotICAgIHVfaW50CUNoYWluczsKLX0gY2lzaW5mb190OwotCiAjZGVmaW5lIENJU1RQTF9NQVhfQ0lTX1NJWkUJMHgyMDAKIAotLyogRm9yIFJlcGxhY2VDSVMgKi8KLXR5cGVkZWYgc3RydWN0IGNpc2R1bXBfdCB7Ci0gICAgdV9pbnQJTGVuZ3RoOwotICAgIGNpc2RhdGFfdAlEYXRhW0NJU1RQTF9NQVhfQ0lTX1NJWkVdOwotfSBjaXNkdW1wX3Q7Ci0KLQotaW50IHBjbWNpYV9yZXBsYWNlX2NpcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgY2lzZHVtcF90ICpjaXMpOwotCi0vKiBkb24ndCB1c2Ugb3V0c2lkZSBvZiBQQ01DSUEgY29yZSB5ZXQgKi8KLWludCBwY2NhcmRfZ2V0X25leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jLCB0dXBsZV90ICp0dXBsZSk7Ci1pbnQgcGNjYXJkX2dldF9maXJzdF90dXBsZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmN0aW9uLCB0dXBsZV90ICp0dXBsZSk7Ci1pbnQgcGNjYXJkX2dldF90dXBsZV9kYXRhKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB0dXBsZV90ICp0dXBsZSk7Ci1pbnQgcGNjYXJkX3BhcnNlX3R1cGxlKHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSk7Ci0KLWludCBwY2NhcmRfdmFsaWRhdGVfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIHVuc2lnbmVkIGludCAqY291bnQpOwotCi0vKiAuLi4gYnV0IHVzZSB0aGVzZSB3cmFwcGVycyBpbnN0ZWFkICovCi0jZGVmaW5lIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocF9kZXYsIHR1cGxlKSBcCi0JCXBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIHR1cGxlKQotCi0jZGVmaW5lIHBjbWNpYV9nZXRfbmV4dF90dXBsZShwX2RldiwgdHVwbGUpIFwKLQkJcGNjYXJkX2dldF9uZXh0X3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLCB0dXBsZSkKLQotI2RlZmluZSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEocF9kZXYsIHR1cGxlKSBcCi0JCXBjY2FyZF9nZXRfdHVwbGVfZGF0YShwX2Rldi0+c29ja2V0LCB0dXBsZSkKLQotI2RlZmluZSBwY21jaWFfcGFyc2VfdHVwbGUocF9kZXYsIHR1cGxlLCBwYXJzZSkgXAotCQlwY2NhcmRfcGFyc2VfdHVwbGUodHVwbGUsIHBhcnNlKQotCi0jZGVmaW5lIHBjbWNpYV92YWxpZGF0ZV9jaXMocF9kZXYsIGluZm8pIFwKLQkJcGNjYXJkX3ZhbGlkYXRlX2NpcyhwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgaW5mbykKLQogI2VuZGlmIC8qIExJTlVYX0NJU1RQTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jcy5oIGIvaW5jbHVkZS9wY21jaWEvY3MuaAppbmRleCA0NWQ4NGIyLi45MDQ0NjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9jcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKQEAgLTI4LDcyICsyOCwxNiBAQAogI2RlZmluZSBDU19XUklURQkyCiAKIC8qIGZvciBBZGp1c3RSZXNvdXJjZUluZm8gKi8KLXR5cGVkZWYgc3RydWN0IGFkanVzdF90IHsKLSAgICB1X2ludAlBY3Rpb247Ci0gICAgdV9pbnQJUmVzb3VyY2U7Ci0gICAgdV9pbnQJQXR0cmlidXRlczsKLSAgICB1bmlvbiB7Ci0Jc3RydWN0IG1lbW9yeSB7Ci0JICAgIHVfbG9uZwlCYXNlOwotCSAgICB1X2xvbmcJU2l6ZTsKLQl9IG1lbW9yeTsKLQlzdHJ1Y3QgaW8gewotCSAgICBpb2FkZHJfdAlCYXNlUG9ydDsKLQkgICAgaW9hZGRyX3QJTnVtUG9ydHM7Ci0JICAgIHVfaW50CUlPQWRkckxpbmVzOwotCX0gaW87Ci0Jc3RydWN0IGlycSB7Ci0JICAgIHVfaW50CUlSUTsKLQl9IGlycTsKLSAgICB9IHJlc291cmNlOwotfSBhZGp1c3RfdDsKLQogLyogQWN0aW9uIGZpZWxkICovCiAjZGVmaW5lIFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFCQkxCiAjZGVmaW5lIEFERF9NQU5BR0VEX1JFU09VUkNFCQkyCi0jZGVmaW5lIEdFVF9GSVJTVF9NQU5BR0VEX1JFU09VUkNFCTMKLSNkZWZpbmUgR0VUX05FWFRfTUFOQUdFRF9SRVNPVVJDRQk0Ci0vKiBSZXNvdXJjZSBmaWVsZCAqLwotI2RlZmluZSBSRVNfTUVNT1JZX1JBTkdFCQkxCi0jZGVmaW5lIFJFU19JT19SQU5HRQkJCTIKLSNkZWZpbmUgUkVTX0lSUQkJCQkzCi0vKiBBdHRyaWJ1dGUgZmllbGQgKi8KLSNkZWZpbmUgUkVTX0lSUV9UWVBFCQkJMHgwMwotI2RlZmluZSBSRVNfSVJRX1RZUEVfRVhDTFVTSVZFCQkwCi0jZGVmaW5lIFJFU19JUlFfVFlQRV9USU1FCQkxCi0jZGVmaW5lIFJFU19JUlFfVFlQRV9EWU5BTUlDCQkyCi0jZGVmaW5lIFJFU19JUlFfQ1NDCQkJMHgwNAotI2RlZmluZSBSRVNfU0hBUkVECQkJMHgwOAotI2RlZmluZSBSRVNfUkVTRVJWRUQJCQkweDEwCi0jZGVmaW5lIFJFU19BTExPQ0FURUQJCQkweDIwCi0jZGVmaW5lIFJFU19SRU1PVkVECQkJMHg0MAorCiAKIHR5cGVkZWYgc3RydWN0IGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UJKmNsaWVudF9oYW5kbGU7CiAJdm9pZAkJCSpjbGllbnRfZGF0YTsKIH0gZXZlbnRfY2FsbGJhY2tfYXJnc190OwogCi0vKiBmb3IgR2V0Q29uZmlndXJhdGlvbkluZm8gKi8KLXR5cGVkZWYgc3RydWN0IGNvbmZpZ19pbmZvX3QgewotICAgIHVfY2hhcglGdW5jdGlvbjsKLSAgICB1X2ludAlBdHRyaWJ1dGVzOwotICAgIHVfaW50CVZjYywgVnBwMSwgVnBwMjsKLSAgICB1X2ludAlJbnRUeXBlOwotICAgIHVfaW50CUNvbmZpZ0Jhc2U7Ci0gICAgdV9jaGFyCVN0YXR1cywgUGluLCBDb3B5LCBPcHRpb24sIEV4dFN0YXR1czsKLSAgICB1X2ludAlQcmVzZW50OwotICAgIHVfaW50CUNhcmRWYWx1ZXM7Ci0gICAgdV9pbnQJQXNzaWduZWRJUlE7Ci0gICAgdV9pbnQJSVJRQXR0cmlidXRlczsKLSAgICBpb2FkZHJfdAlCYXNlUG9ydDE7Ci0gICAgaW9hZGRyX3QJTnVtUG9ydHMxOwotICAgIHVfaW50CUF0dHJpYnV0ZXMxOwotICAgIGlvYWRkcl90CUJhc2VQb3J0MjsKLSAgICBpb2FkZHJfdAlOdW1Qb3J0czI7Ci0gICAgdV9pbnQJQXR0cmlidXRlczI7Ci0gICAgdV9pbnQJSU9BZGRyTGluZXM7Ci19IGNvbmZpZ19pbmZvX3Q7Ci0KIC8qIEZvciBDYXJkVmFsdWVzIGZpZWxkICovCiAjZGVmaW5lIENWX09QVElPTl9WQUxVRQkJMHgwMQogI2RlZmluZSBDVl9TVEFUVVNfVkFMVUUJCTB4MDIKQEAgLTI1NywyMiArMjAxLDYgQEAKICNkZWZpbmUgV0lOX0JBUl9NQVNLCQkweGUwMDAKICNkZWZpbmUgV0lOX0JBUl9TSElGVAkJMTMKIAotLyogQXR0cmlidXRlcyBmb3IgUmVnaXN0ZXJDbGllbnQgLS0gVU5VU0VEIC0tICovCi0jZGVmaW5lIElORk9fTUFTVEVSX0NMSUVOVAkweDAxCi0jZGVmaW5lIElORk9fSU9fQ0xJRU5UCQkweDAyCi0jZGVmaW5lIElORk9fTVREX0NMSUVOVAkJMHgwNAotI2RlZmluZSBJTkZPX01FTV9DTElFTlQJCTB4MDgKLSNkZWZpbmUgTUFYX05VTV9DTElFTlRTCQkzCi0KLSNkZWZpbmUgSU5GT19DQVJEX1NIQVJFCQkweDEwCi0jZGVmaW5lIElORk9fQ0FSRF9FWENMCQkweDIwCi0KLXR5cGVkZWYgc3RydWN0IGNzX3N0YXR1c190IHsKLSAgICB1X2NoYXIJRnVuY3Rpb247Ci0gICAgZXZlbnRfdCAJQ2FyZFN0YXRlOwotICAgIGV2ZW50X3QJU29ja2V0U3RhdGU7Ci19IGNzX3N0YXR1c190OwotCiB0eXBlZGVmIHN0cnVjdCBlcnJvcl9pbmZvX3QgewogICAgIGludAkJZnVuYzsKICAgICBpbnQJCXJldGNvZGU7CkBAIC0zMDgsOTUgKzIzNiw0IEBACiAjZGVmaW5lIENTX0VWRU5UXzNWQ0FSRAkJCTB4MjAwMDAwCiAjZGVmaW5lIENTX0VWRU5UX1hWQ0FSRAkJCTB4NDAwMDAwCiAKLS8qIFJldHVybiBjb2RlcyAqLwotI2RlZmluZSBDU19TVUNDRVNTCQkweDAwCi0jZGVmaW5lIENTX0JBRF9BREFQVEVSCQkweDAxCi0jZGVmaW5lIENTX0JBRF9BVFRSSUJVVEUJMHgwMgotI2RlZmluZSBDU19CQURfQkFTRQkJMHgwMwotI2RlZmluZSBDU19CQURfRURDCQkweDA0Ci0jZGVmaW5lIENTX0JBRF9JUlEJCTB4MDYKLSNkZWZpbmUgQ1NfQkFEX09GRlNFVAkJMHgwNwotI2RlZmluZSBDU19CQURfUEFHRQkJMHgwOAotI2RlZmluZSBDU19SRUFEX0ZBSUxVUkUJCTB4MDkKLSNkZWZpbmUgQ1NfQkFEX1NJWkUJCTB4MGEKLSNkZWZpbmUgQ1NfQkFEX1NPQ0tFVAkJMHgwYgotI2RlZmluZSBDU19CQURfVFlQRQkJMHgwZAotI2RlZmluZSBDU19CQURfVkNDCQkweDBlCi0jZGVmaW5lIENTX0JBRF9WUFAJCTB4MGYKLSNkZWZpbmUgQ1NfQkFEX1dJTkRPVwkJMHgxMQotI2RlZmluZSBDU19XUklURV9GQUlMVVJFCTB4MTIKLSNkZWZpbmUgQ1NfTk9fQ0FSRAkJMHgxNAotI2RlZmluZSBDU19VTlNVUFBPUlRFRF9GVU5DVElPTgkweDE1Ci0jZGVmaW5lIENTX1VOU1VQUE9SVEVEX01PREUJMHgxNgotI2RlZmluZSBDU19CQURfU1BFRUQJCTB4MTcKLSNkZWZpbmUgQ1NfQlVTWQkJCTB4MTgKLSNkZWZpbmUgQ1NfR0VORVJBTF9GQUlMVVJFCTB4MTkKLSNkZWZpbmUgQ1NfV1JJVEVfUFJPVEVDVEVECTB4MWEKLSNkZWZpbmUgQ1NfQkFEX0FSR19MRU5HVEgJMHgxYgotI2RlZmluZSBDU19CQURfQVJHUwkJMHgxYwotI2RlZmluZSBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRAkweDFkCi0jZGVmaW5lIENTX0lOX1VTRQkJMHgxZQotI2RlZmluZSBDU19OT19NT1JFX0lURU1TCTB4MWYKLSNkZWZpbmUgQ1NfT1VUX09GX1JFU09VUkNFCTB4MjAKLSNkZWZpbmUgQ1NfQkFEX0hBTkRMRQkJMHgyMQotCi0jZGVmaW5lIENTX0JBRF9UVVBMRQkJMHg0MAotCi0jaWZkZWYgX19LRVJORUxfXwotCi0vKgotICogIFRoZSBtYWluIENhcmQgU2VydmljZXMgZW50cnkgcG9pbnQKLSAqLwotCi1lbnVtIHNlcnZpY2UgewotICAgIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgQWRkU29ja2V0U2VydmljZXMsCi0gICAgQWRqdXN0UmVzb3VyY2VJbmZvLCBDaGVja0VyYXNlUXVldWUsIENsb3NlTWVtb3J5LCBDb3B5TWVtb3J5LAotICAgIERlcmVnaXN0ZXJDbGllbnQsIERlcmVnaXN0ZXJFcmFzZVF1ZXVlLCBHZXRDYXJkU2VydmljZXNJbmZvLAotICAgIEdldENsaWVudEluZm8sIEdldENvbmZpZ3VyYXRpb25JbmZvLCBHZXRFdmVudE1hc2ssCi0gICAgR2V0Rmlyc3RDbGllbnQsIEdldEZpcnN0UGFydGlvbiwgR2V0Rmlyc3RSZWdpb24sIEdldEZpcnN0VHVwbGUsCi0gICAgR2V0TmV4dENsaWVudCwgR2V0TmV4dFBhcnRpdGlvbiwgR2V0TmV4dFJlZ2lvbiwgR2V0TmV4dFR1cGxlLAotICAgIEdldFN0YXR1cywgR2V0VHVwbGVEYXRhLCBNYXBMb2dTb2NrZXQsIE1hcExvZ1dpbmRvdywgTWFwTWVtUGFnZSwKLSAgICBNYXBQaHlTb2NrZXQsIE1hcFBoeVdpbmRvdywgTW9kaWZ5Q29uZmlndXJhdGlvbiwgTW9kaWZ5V2luZG93LAotICAgIE9wZW5NZW1vcnksIFBhcnNlVHVwbGUsIFJlYWRNZW1vcnksIFJlZ2lzdGVyQ2xpZW50LAotICAgIFJlZ2lzdGVyRXJhc2VRdWV1ZSwgUmVnaXN0ZXJNVEQsIFJlZ2lzdGVyVGltZXIsCi0gICAgUmVsZWFzZUNvbmZpZ3VyYXRpb24sIFJlbGVhc2VFeGNsdXNpdmUsIFJlbGVhc2VJTywgUmVsZWFzZUlSUSwKLSAgICBSZWxlYXNlU29ja2V0TWFzaywgUmVsZWFzZVdpbmRvdywgUmVwbGFjZVNvY2tldFNlcnZpY2VzLAotICAgIFJlcXVlc3RDb25maWd1cmF0aW9uLCBSZXF1ZXN0RXhjbHVzaXZlLCBSZXF1ZXN0SU8sIFJlcXVlc3RJUlEsCi0gICAgUmVxdWVzdFNvY2tldE1hc2ssIFJlcXVlc3RXaW5kb3csIFJlc2V0Q2FyZCwgUmV0dXJuU1NFbnRyeSwKLSAgICBTZXRFdmVudE1hc2ssIFNldFJlZ2lvbiwgVmFsaWRhdGVDSVMsIFZlbmRvclNwZWNpZmljLAotICAgIFdyaXRlTWVtb3J5LCBCaW5kRGV2aWNlLCBCaW5kTVRELCBSZXBvcnRFcnJvciwKLSAgICBTdXNwZW5kQ2FyZCwgUmVzdW1lQ2FyZCwgRWplY3RDYXJkLCBJbnNlcnRDYXJkLCBSZXBsYWNlQ0lTLAotICAgIEdldEZpcnN0V2luZG93LCBHZXROZXh0V2luZG93LCBHZXRNZW1QYWdlCi19OwotCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldDsKLQotaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNvbmZfcmVnX3QgKnJlZyk7Ci1pbnQgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjb25maWdfaW5mb190ICpjb25maWcpOwotaW50IHBjbWNpYV9nZXRfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX21hcF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKTsKLWludCBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBtb2Rjb25mX3QgKm1vZCk7Ci1pbnQgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHdpbmRvd19oYW5kbGVfdCB3aW4pOwotaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjb25maWdfcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKTsKLWludCBwY21jaWFfcmVxdWVzdF9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KHN0cnVjdCBwY21jaWFfZGV2aWNlICoqcF9kZXYsIHdpbl9yZXFfdCAqcmVxLCB3aW5kb3dfaGFuZGxlX3QgKndoKTsKLWludCBwY21jaWFfc3VzcGVuZF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwotaW50IHBjbWNpYV9yZXN1bWVfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKLWludCBwY21jaWFfZWplY3RfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKLWludCBwY21jaWFfaW5zZXJ0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7Ci1pbnQgcGNjYXJkX3Jlc2V0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7Ci0KLXN0cnVjdCBwY21jaWFfZGV2aWNlICogcGNtY2lhX2Rldl9wcmVzZW50KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7Ci12b2lkIHBjbWNpYV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOwotCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHBjbWNpYV9nZXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwotdm9pZCBwY21jaWFfcHV0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKLQotLyogY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgcGNtY2lhX3Jlc2V0X2NhcmQocF9kZXYsIHJlcSkgXAotCQlwY2NhcmRfcmVzZXRfY2FyZChwX2Rldi0+c29ja2V0KQotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX0xJTlVYX0NTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmggYi9pbmNsdWRlL3BjbWNpYS9jc190eXBlcy5oCmluZGV4IGY0MDJhMGYuLjMxNTk2NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaApAQCAtMjEsMTQgKzIxLDYgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fYXZyMzJfXykgfHwgXAotCWRlZmluZWQoX19iZmluX18pCi0vKiBUaGlzIChpb2FkZHJfdCkgaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgJiBoZW5jZSBjYW5ub3QgYmUgY2hhbmdlZC4gKi8KLXR5cGVkZWYgdV9pbnQgICBpb2FkZHJfdDsKLSNlbHNlCi10eXBlZGVmIHVfc2hvcnQJaW9hZGRyX3Q7Ci0jZW5kaWYKLQogdHlwZWRlZiB1X3Nob3J0CXNvY2tldF90OwogdHlwZWRlZiB1X2ludAlldmVudF90OwogdHlwZWRlZiB1X2NoYXIJY2lzZGF0YV90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvZGV2aWNlX2lkLmggYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaAppbmRleCBlMDRlMGIwLi5jMzNlYTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaApAQCAtMSwxMCArMSwxOSBAQAogLyoKLSAqIENvcHlyaWdodCAoMjAwMy0yMDA0KSAJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgotICoJCQkJRGF2aWQgV29vZGhvdXNlCisgKiBkZXZpY2VfaWQuaCAtLSBQQ01DSUEgZHJpdmVyIG1hdGNoaW5nIGhlbHBlcnMKICAqCi0gKiBMaWNlbnNlOiBHUEwgdjIKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogKEMpIDIwMDMgLSAyMDA0CURhdmlkIFdvb2Rob3VzZQorICogKEMpIDIwMDMgLSAyMDA0CURvbWluaWsgQnJvZG93c2tpCiAgKi8KIAorI2lmbmRlZiBfTElOVVhfUENNQ0lBX0RFVklDRV9JRF9ICisjZGVmaW5lIF9MSU5VWF9QQ01DSUFfREVWSUNFX0lEX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKwogI2RlZmluZSBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRChtYW5mLCBjYXJkKSB7IFwKIAkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKIAkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwgXApAQCAtMjU2LDMgKzI2NSw2IEBACiAKIAogI2RlZmluZSBQQ01DSUFfREVWSUNFX05VTEwgeyAubWF0Y2hfZmxhZ3MgPSAwLCB9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0xJTlVYX1BDTUNJQV9ERVZJQ0VfSURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvZHMuaCBiL2luY2x1ZGUvcGNtY2lhL2RzLmgKaW5kZXggYjMxNjAyNy4uYTJiZTgwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvZHMuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9kcy5oCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiAoQykgMTk5OQkJRGF2aWQgQS4gSGluZHMKLSAqIChDKSAyMDAzIC0gMjAwNAlEb21pbmlrIEJyb2Rvd3NraQorICogKEMpIDIwMDMgLSAyMDA4CURvbWluaWsgQnJvZG93c2tpCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRFNfSApAQCAtMjMsMTA4ICsyMywyMSBAQAogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9kZXZpY2VfaWQuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgdHVwbGVfcGFyc2VfdCB7Ci0gICAgdHVwbGVfdAkJdHVwbGU7Ci0gICAgY2lzZGF0YV90CQlkYXRhWzI1NV07Ci0gICAgY2lzcGFyc2VfdAkJcGFyc2U7Ci19IHR1cGxlX3BhcnNlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHdpbl9pbmZvX3QgewotICAgIHdpbmRvd19oYW5kbGVfdAloYW5kbGU7Ci0gICAgd2luX3JlcV90CQl3aW5kb3c7Ci0gICAgbWVtcmVxX3QJCW1hcDsKLX0gd2luX2luZm9fdDsKLSAgICAKLXR5cGVkZWYgc3RydWN0IGJpbmRfaW5mb190IHsKLSAgICBkZXZfaW5mb190CQlkZXZfaW5mbzsKLSAgICB1X2NoYXIJCWZ1bmN0aW9uOwotICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICppbnN0YW5jZTsKLSAgICBjaGFyCQluYW1lW0RFVl9OQU1FX0xFTl07Ci0gICAgdV9zaG9ydAkJbWFqb3IsIG1pbm9yOwotICAgIHZvaWQJCSpuZXh0OwotfSBiaW5kX2luZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgbXRkX2luZm9fdCB7Ci0gICAgZGV2X2luZm9fdAkJZGV2X2luZm87Ci0gICAgdV9pbnQJCUF0dHJpYnV0ZXM7Ci0gICAgdV9pbnQJCUNhcmRPZmZzZXQ7Ci19IG10ZF9pbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHJlZ2lvbl9pbmZvX3QgewotICAgIHVfaW50CQlBdHRyaWJ1dGVzOwotICAgIHVfaW50CQlDYXJkT2Zmc2V0OwotICAgIHVfaW50CQlSZWdpb25TaXplOwotICAgIHVfaW50CQlBY2Nlc3NTcGVlZDsKLSAgICB1X2ludAkJQmxvY2tTaXplOwotICAgIHVfaW50CQlQYXJ0TXVsdGlwbGU7Ci0gICAgdV9jaGFyCQlKZWRlY01mciwgSmVkZWNJbmZvOwotICAgIG1lbW9yeV9oYW5kbGVfdAluZXh0OwotfSByZWdpb25faW5mb190OwotI2RlZmluZSBSRUdJT05fVFlQRQkJMHgwMDAxCi0jZGVmaW5lIFJFR0lPTl9UWVBFX0NNCQkweDAwMDAKLSNkZWZpbmUgUkVHSU9OX1RZUEVfQU0JCTB4MDAwMQotI2RlZmluZSBSRUdJT05fUFJFRkVUQ0gJCTB4MDAwOAotI2RlZmluZSBSRUdJT05fQ0FDSEVBQkxFCTB4MDAxMAotI2RlZmluZSBSRUdJT05fQkFSX01BU0sJCTB4ZTAwMAotI2RlZmluZSBSRUdJT05fQkFSX1NISUZUCTEzCi0KLXR5cGVkZWYgdW5pb24gZHNfaW9jdGxfYXJnX3QgewotICAgIGFkanVzdF90CQlhZGp1c3Q7Ci0gICAgY29uZmlnX2luZm9fdAljb25maWc7Ci0gICAgdHVwbGVfdAkJdHVwbGU7Ci0gICAgdHVwbGVfcGFyc2VfdAl0dXBsZV9wYXJzZTsKLSAgICBjbGllbnRfcmVxX3QJY2xpZW50X3JlcTsKLSAgICBjc19zdGF0dXNfdAkJc3RhdHVzOwotICAgIGNvbmZfcmVnX3QJCWNvbmZfcmVnOwotICAgIGNpc2luZm9fdAkJY2lzaW5mbzsKLSAgICByZWdpb25faW5mb190CXJlZ2lvbjsKLSAgICBiaW5kX2luZm9fdAkJYmluZF9pbmZvOwotICAgIG10ZF9pbmZvX3QJCW10ZF9pbmZvOwotICAgIHdpbl9pbmZvX3QJCXdpbl9pbmZvOwotICAgIGNpc2R1bXBfdAkJY2lzZHVtcDsKLX0gZHNfaW9jdGxfYXJnX3Q7Ci0KLSNkZWZpbmUgRFNfQURKVVNUX1JFU09VUkNFX0lORk8JCV9JT1dSKCdkJywgMiwgYWRqdXN0X3QpCi0jZGVmaW5lIERTX0dFVF9DT05GSUdVUkFUSU9OX0lORk8JX0lPV1IoJ2QnLCAzLCBjb25maWdfaW5mb190KQotI2RlZmluZSBEU19HRVRfRklSU1RfVFVQTEUJCV9JT1dSKCdkJywgNCwgdHVwbGVfdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfVFVQTEUJCV9JT1dSKCdkJywgNSwgdHVwbGVfdCkKLSNkZWZpbmUgRFNfR0VUX1RVUExFX0RBVEEJCV9JT1dSKCdkJywgNiwgdHVwbGVfcGFyc2VfdCkKLSNkZWZpbmUgRFNfUEFSU0VfVFVQTEUJCQlfSU9XUignZCcsIDcsIHR1cGxlX3BhcnNlX3QpCi0jZGVmaW5lIERTX1JFU0VUX0NBUkQJCQlfSU8gICgnZCcsIDgpCi0jZGVmaW5lIERTX0dFVF9TVEFUVVMJCQlfSU9XUignZCcsIDksIGNzX3N0YXR1c190KQotI2RlZmluZSBEU19BQ0NFU1NfQ09ORklHVVJBVElPTl9SRUdJU1RFUiBfSU9XUignZCcsIDEwLCBjb25mX3JlZ190KQotI2RlZmluZSBEU19WQUxJREFURV9DSVMJCQlfSU9SICgnZCcsIDExLCBjaXNpbmZvX3QpCi0jZGVmaW5lIERTX1NVU1BFTkRfQ0FSRAkJCV9JTyAgKCdkJywgMTIpCi0jZGVmaW5lIERTX1JFU1VNRV9DQVJECQkJX0lPICAoJ2QnLCAxMykKLSNkZWZpbmUgRFNfRUpFQ1RfQ0FSRAkJCV9JTyAgKCdkJywgMTQpCi0jZGVmaW5lIERTX0lOU0VSVF9DQVJECQkJX0lPICAoJ2QnLCAxNSkKLSNkZWZpbmUgRFNfR0VUX0ZJUlNUX1JFR0lPTgkJX0lPV1IoJ2QnLCAxNiwgcmVnaW9uX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfUkVHSU9OCQlfSU9XUignZCcsIDE3LCByZWdpb25faW5mb190KQotI2RlZmluZSBEU19SRVBMQUNFX0NJUwkJCV9JT1dSKCdkJywgMTgsIGNpc2R1bXBfdCkKLSNkZWZpbmUgRFNfR0VUX0ZJUlNUX1dJTkRPVwkJX0lPUiAoJ2QnLCAxOSwgd2luX2luZm9fdCkKLSNkZWZpbmUgRFNfR0VUX05FWFRfV0lORE9XCQlfSU9XUignZCcsIDIwLCB3aW5faW5mb190KQotI2RlZmluZSBEU19HRVRfTUVNX1BBR0UJCQlfSU9XUignZCcsIDIxLCB3aW5faW5mb190KQotCi0jZGVmaW5lIERTX0JJTkRfUkVRVUVTVAkJCV9JT1dSKCdkJywgNjAsIGJpbmRfaW5mb190KQotI2RlZmluZSBEU19HRVRfREVWSUNFX0lORk8JCV9JT1dSKCdkJywgNjEsIGJpbmRfaW5mb190KSAKLSNkZWZpbmUgRFNfR0VUX05FWFRfREVWSUNFCQlfSU9XUignZCcsIDYyLCBiaW5kX2luZm9fdCkgCi0jZGVmaW5lIERTX1VOQklORF9SRVFVRVNUCQlfSU9XICgnZCcsIDYzLCBiaW5kX2luZm9fdCkKLSNkZWZpbmUgRFNfQklORF9NVEQJCQlfSU9XUignZCcsIDY0LCBtdGRfaW5mb190KQotCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogCi10eXBlZGVmIHN0cnVjdCBkZXZfbm9kZV90IHsKLSAgICBjaGFyCQlkZXZfbmFtZVtERVZfTkFNRV9MRU5dOwotICAgIHVfc2hvcnQJCW1ham9yLCBtaW5vcjsKLSAgICBzdHJ1Y3QgZGV2X25vZGVfdAkqbmV4dDsKLX0gZGV2X25vZGVfdDsKLQotCisvKgorICogUENNQ0lBIGRldmljZSBkcml2ZXJzICgxNi1iaXQgY2FyZHMgb25seTsgMzItYml0IGNhcmRzIHJlcXVpcmUgQ2FyZEJ1cworICogYS5rLmEuIFBDSSBkcml2ZXJzCisgKi8KIHN0cnVjdCBwY21jaWFfc29ja2V0Oworc3RydWN0IHBjbWNpYV9kZXZpY2U7CiBzdHJ1Y3QgY29uZmlnX3Q7CiAKKy8qIGR5bmFtaWMgZGV2aWNlIElEcyBmb3IgUENNQ0lBIGRldmljZSBkcml2ZXJzLiBTZWUKKyAqIERvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci50eHQgZm9yIGRldGFpbHMuCisqLwogc3RydWN0IHBjbWNpYV9keW5pZHMgewogCXNwaW5sb2NrX3QJCWxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwpAQCAtMTQ3LDYgKzYwLDE0IEBACiBpbnQgcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqZHJpdmVyKTsKIHZvaWQgcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY21jaWFfZHJpdmVyICpkcml2ZXIpOwogCisvKiBTb21lIGRyaXZlcnMgdXNlIGRldl9ub2RlX3QgdG8gc3RvcmUgY2hhciBvciBibG9jayBkZXZpY2UgaW5mb3JtYXRpb24uCisgKiBEb24ndCB1c2UgdGhpcyBpbiBuZXcgZHJpdmVycywgdGhvdWdoLgorICovCit0eXBlZGVmIHN0cnVjdCBkZXZfbm9kZV90IHsKKwljaGFyCQkJZGV2X25hbWVbREVWX05BTUVfTEVOXTsKKwl1X3Nob3J0CQkJbWFqb3IsIG1pbm9yOworCXN0cnVjdCBkZXZfbm9kZV90CSpuZXh0OworfSBkZXZfbm9kZV90OwogCiBzdHJ1Y3QgcGNtY2lhX2RldmljZSB7CiAJLyogdGhlIHNvY2tldCBhbmQgdGhlIGRldmljZV9ubyBbZm9yIG11bHRpZnVuY3Rpb24gZGV2aWNlc10KQEAgLTIxNiwxMCArMTM3LDMwNCBAQAogI2RlZmluZSB0b19wY21jaWFfZGV2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgZGV2KQogI2RlZmluZSB0b19wY21jaWFfZHJ2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KQogCisvKiBkZXByZWNhdGVkIC0tIGRvbid0IHVzZSEgKi8KICNkZWZpbmUgaGFuZGxlX3RvX2RldihoYW5kbGUpIChoYW5kbGUtPmRldikKIAotLyogZXJyb3IgcmVwb3J0aW5nICovCi12b2lkIGNzX2Vycm9yKHN0cnVjdCBwY21jaWFfZGV2aWNlICpoYW5kbGUsIGludCBmdW5jLCBpbnQgcmV0KTsKKworLyogKGRlcHJlY2F0ZWQpIGVycm9yIHJlcG9ydGluZyBieSBQQ01DSUEgZGV2aWNlcy4gVXNlIGRldl9wcmludGsoKQorICogb3IgZGV2X2RiZygpIGRpcmVjdGx5IGluIHRoZSBkcml2ZXIsIHdpdGhvdXQgcmVmZXJyaW5nIHRvIHBjbWNpYV9lcnJvcl9mdW5jKCkKKyAqIGFuZC9vciBwY21jaWFfZXJyb3JfcmV0KCkgZm9yIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGdvIGF3YXkgc29vbi4KKyAqLworZW51bSBzZXJ2aWNlIHsKKyAgICBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIEFkZFNvY2tldFNlcnZpY2VzLAorICAgIEFkanVzdFJlc291cmNlSW5mbywgQ2hlY2tFcmFzZVF1ZXVlLCBDbG9zZU1lbW9yeSwgQ29weU1lbW9yeSwKKyAgICBEZXJlZ2lzdGVyQ2xpZW50LCBEZXJlZ2lzdGVyRXJhc2VRdWV1ZSwgR2V0Q2FyZFNlcnZpY2VzSW5mbywKKyAgICBHZXRDbGllbnRJbmZvLCBHZXRDb25maWd1cmF0aW9uSW5mbywgR2V0RXZlbnRNYXNrLAorICAgIEdldEZpcnN0Q2xpZW50LCBHZXRGaXJzdFBhcnRpb24sIEdldEZpcnN0UmVnaW9uLCBHZXRGaXJzdFR1cGxlLAorICAgIEdldE5leHRDbGllbnQsIEdldE5leHRQYXJ0aXRpb24sIEdldE5leHRSZWdpb24sIEdldE5leHRUdXBsZSwKKyAgICBHZXRTdGF0dXMsIEdldFR1cGxlRGF0YSwgTWFwTG9nU29ja2V0LCBNYXBMb2dXaW5kb3csIE1hcE1lbVBhZ2UsCisgICAgTWFwUGh5U29ja2V0LCBNYXBQaHlXaW5kb3csIE1vZGlmeUNvbmZpZ3VyYXRpb24sIE1vZGlmeVdpbmRvdywKKyAgICBPcGVuTWVtb3J5LCBQYXJzZVR1cGxlLCBSZWFkTWVtb3J5LCBSZWdpc3RlckNsaWVudCwKKyAgICBSZWdpc3RlckVyYXNlUXVldWUsIFJlZ2lzdGVyTVRELCBSZWdpc3RlclRpbWVyLAorICAgIFJlbGVhc2VDb25maWd1cmF0aW9uLCBSZWxlYXNlRXhjbHVzaXZlLCBSZWxlYXNlSU8sIFJlbGVhc2VJUlEsCisgICAgUmVsZWFzZVNvY2tldE1hc2ssIFJlbGVhc2VXaW5kb3csIFJlcGxhY2VTb2NrZXRTZXJ2aWNlcywKKyAgICBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgUmVxdWVzdEV4Y2x1c2l2ZSwgUmVxdWVzdElPLCBSZXF1ZXN0SVJRLAorICAgIFJlcXVlc3RTb2NrZXRNYXNrLCBSZXF1ZXN0V2luZG93LCBSZXNldENhcmQsIFJldHVyblNTRW50cnksCisgICAgU2V0RXZlbnRNYXNrLCBTZXRSZWdpb24sIFZhbGlkYXRlQ0lTLCBWZW5kb3JTcGVjaWZpYywKKyAgICBXcml0ZU1lbW9yeSwgQmluZERldmljZSwgQmluZE1URCwgUmVwb3J0RXJyb3IsCisgICAgU3VzcGVuZENhcmQsIFJlc3VtZUNhcmQsIEVqZWN0Q2FyZCwgSW5zZXJ0Q2FyZCwgUmVwbGFjZUNJUywKKyAgICBHZXRGaXJzdFdpbmRvdywgR2V0TmV4dFdpbmRvdywgR2V0TWVtUGFnZQorfTsKK2NvbnN0IGNoYXIgKnBjbWNpYV9lcnJvcl9mdW5jKGludCBmdW5jKTsKK2NvbnN0IGNoYXIgKnBjbWNpYV9lcnJvcl9yZXQoaW50IHJldCk7CisKKyNkZWZpbmUgY3NfZXJyb3IocF9kZXYsIGZ1bmMsIHJldCkJCQlcCisJewkJCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBfZGV2LT5kZXYsCVwKKwkJCSAgICIlcyA6ICVzXG4iLAkJCVwKKwkJCSAgIHBjbWNpYV9lcnJvcl9mdW5jKGZ1bmMpLAlcCisJCQkgICBwY21jaWFfZXJyb3JfcmV0KHJldCkpOwlcCisJfQorCisvKiBDSVMgYWNjZXNzLgorICogVXNlIHRoZSBwY21jaWFfKiB2ZXJzaW9ucyBpbiBQQ01DSUEgZHJpdmVycworICovCitpbnQgcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSk7CisKK2ludCBwY2NhcmRfZ2V0X2ZpcnN0X3R1cGxlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkgICB0dXBsZV90ICp0dXBsZSk7CisjZGVmaW5lIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocF9kZXYsIHR1cGxlKSBcCisJCXBjY2FyZF9nZXRfZmlyc3RfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIHR1cGxlKQorCitpbnQgcGNjYXJkX2dldF9uZXh0X3R1cGxlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkgIHR1cGxlX3QgKnR1cGxlKTsKKyNkZWZpbmUgcGNtY2lhX2dldF9uZXh0X3R1cGxlKHBfZGV2LCB0dXBsZSkgXAorCQlwY2NhcmRfZ2V0X25leHRfdHVwbGUocF9kZXYtPnNvY2tldCwgcF9kZXYtPmZ1bmMsIHR1cGxlKQorCitpbnQgcGNjYXJkX2dldF90dXBsZV9kYXRhKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB0dXBsZV90ICp0dXBsZSk7CisjZGVmaW5lIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwX2RldiwgdHVwbGUpIFwKKwkJcGNjYXJkX2dldF90dXBsZV9kYXRhKHBfZGV2LT5zb2NrZXQsIHR1cGxlKQorCisKKy8qIGxvb3AgQ0lTIGVudHJpZXMgZm9yIHZhbGlkIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBwY21jaWFfbG9vcF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkgICAgICAgaW50CSgqY29uZl9jaGVjaykJKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCQkJCSBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiwKKwkJCQkJCSBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpkZmx0LAorCQkJCQkJIHVuc2lnbmVkIGludCB2Y2MsCisJCQkJCQkgdm9pZCAqcHJpdl9kYXRhKSwKKwkJICAgICAgIHZvaWQgKnByaXZfZGF0YSk7CisKKy8qIGlzIHRoZSBkZXZpY2Ugc3RpbGwgdGhlcmU/ICovCitzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2Rldl9wcmVzZW50KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CisKKy8qIGxvdy1sZXZlbCBpbnRlcmZhY2UgcmVzZXQgKi8KK2ludCBwY21jaWFfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKKworLyogQ0lTIGNvbmZpZyAqLworaW50IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJCSBjb25mX3JlZ190ICpyZWcpOworCisvKiBkZXZpY2UgY29uZmlndXJhdGlvbiAqLworaW50IHBjbWNpYV9yZXF1ZXN0X2lvKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaW9fcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3RfaXJxKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgaXJxX3JlcV90ICpyZXEpOworaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAorCQkJCSBjb25maWdfcmVxX3QgKnJlcSk7CisKK2ludCBwY21jaWFfcmVxdWVzdF93aW5kb3coc3RydWN0IHBjbWNpYV9kZXZpY2UgKipwX2Rldiwgd2luX3JlcV90ICpyZXEsCisJCQkgIHdpbmRvd19oYW5kbGVfdCAqd2gpOworaW50IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyh3aW5kb3dfaGFuZGxlX3Qgd2luKTsKKworaW50IHBjbWNpYV9nZXRfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX21hcF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKTsKKworaW50IHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIG1vZGNvbmZfdCAqbW9kKTsKK3ZvaWQgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworCisvKiBCZWxvdywgdGhlcmUgYXJlIG9ubHkgZGVmaW5pdGlvbnMgd2hpY2ggYXJlIHVzZWQgYnkKKyAqIC0gdGhlIFBDTUNJQSBpb2N0bAorICogLSBkZXByZWNhdGVkIFBDTUNJQSB1c2Vyc3BhY2UgdG9vbHMgb25seQorICoKKyAqIGhlcmUgYmUgZHJhZ29ucyAuLi4gaGVyZSBiZSBkcmFnb25zIC4uLiBoZXJlIGJlIGRyYWdvbnMgLi4uIGhlcmUgYmUgZHJhZworICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ01DSUFfSU9DVEwpIHx8ICFkZWZpbmVkKF9fS0VSTkVMX18pCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQoX19hdnIzMl9fKSB8fCBcCisJZGVmaW5lZChfX2JmaW5fXykKKy8qIFRoaXMgKGlvYWRkcl90KSBpcyBleHBvc2VkIHRvIHVzZXJzcGFjZSAmIGhlbmNlIGNhbm5vdCBiZSBjaGFuZ2VkLiAqLwordHlwZWRlZiB1X2ludCAgIGlvYWRkcl90OworI2Vsc2UKK3R5cGVkZWYgdV9zaG9ydAlpb2FkZHJfdDsKKyNlbmRpZgorCisvKiBmb3IgQWRqdXN0UmVzb3VyY2VJbmZvICovCit0eXBlZGVmIHN0cnVjdCBhZGp1c3RfdCB7CisJdV9pbnQJCQlBY3Rpb247CisJdV9pbnQJCQlSZXNvdXJjZTsKKwl1X2ludAkJCUF0dHJpYnV0ZXM7CisJdW5pb24geworCQlzdHJ1Y3QgbWVtb3J5IHsKKwkJCXVfbG9uZwkJQmFzZTsKKwkJCXVfbG9uZwkJU2l6ZTsKKwkJfSBtZW1vcnk7CisJCXN0cnVjdCBpbyB7CisJCQlpb2FkZHJfdAlCYXNlUG9ydDsKKwkJCWlvYWRkcl90CU51bVBvcnRzOworCQkJdV9pbnQJCUlPQWRkckxpbmVzOworCQl9IGlvOworCQlzdHJ1Y3QgaXJxIHsKKwkJCXVfaW50CQlJUlE7CisJCX0gaXJxOworCX0gcmVzb3VyY2U7Cit9IGFkanVzdF90OworCisvKiBBY3Rpb24gZmllbGQgKi8KKyNkZWZpbmUgUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0UJCTEKKyNkZWZpbmUgQUREX01BTkFHRURfUkVTT1VSQ0UJCTIKKyNkZWZpbmUgR0VUX0ZJUlNUX01BTkFHRURfUkVTT1VSQ0UJMworI2RlZmluZSBHRVRfTkVYVF9NQU5BR0VEX1JFU09VUkNFCTQKKy8qIFJlc291cmNlIGZpZWxkICovCisjZGVmaW5lIFJFU19NRU1PUllfUkFOR0UJCTEKKyNkZWZpbmUgUkVTX0lPX1JBTkdFCQkJMgorI2RlZmluZSBSRVNfSVJRCQkJCTMKKy8qIEF0dHJpYnV0ZSBmaWVsZCAqLworI2RlZmluZSBSRVNfSVJRX1RZUEUJCQkweDAzCisjZGVmaW5lIFJFU19JUlFfVFlQRV9FWENMVVNJVkUJCTAKKyNkZWZpbmUgUkVTX0lSUV9UWVBFX1RJTUUJCTEKKyNkZWZpbmUgUkVTX0lSUV9UWVBFX0RZTkFNSUMJCTIKKyNkZWZpbmUgUkVTX0lSUV9DU0MJCQkweDA0CisjZGVmaW5lIFJFU19TSEFSRUQJCQkweDA4CisjZGVmaW5lIFJFU19SRVNFUlZFRAkJCTB4MTAKKyNkZWZpbmUgUkVTX0FMTE9DQVRFRAkJCTB4MjAKKyNkZWZpbmUgUkVTX1JFTU9WRUQJCQkweDQwCisKKwordHlwZWRlZiBzdHJ1Y3QgdHVwbGVfcGFyc2VfdCB7CisJdHVwbGVfdAkJCXR1cGxlOworCWNpc2RhdGFfdAkJZGF0YVsyNTVdOworCWNpc3BhcnNlX3QJCXBhcnNlOworfSB0dXBsZV9wYXJzZV90OworCit0eXBlZGVmIHN0cnVjdCB3aW5faW5mb190IHsKKwl3aW5kb3dfaGFuZGxlX3QJCWhhbmRsZTsKKwl3aW5fcmVxX3QJCXdpbmRvdzsKKwltZW1yZXFfdAkJbWFwOworfSB3aW5faW5mb190OworCit0eXBlZGVmIHN0cnVjdCBiaW5kX2luZm9fdCB7CisJZGV2X2luZm9fdAkJZGV2X2luZm87CisJdV9jaGFyCQkJZnVuY3Rpb247CisJc3RydWN0IHBjbWNpYV9kZXZpY2UJKmluc3RhbmNlOworCWNoYXIJCQluYW1lW0RFVl9OQU1FX0xFTl07CisJdV9zaG9ydAkJCW1ham9yLCBtaW5vcjsKKwl2b2lkCQkJKm5leHQ7Cit9IGJpbmRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtdGRfaW5mb190IHsKKwlkZXZfaW5mb190ICAgICAJCWRldl9pbmZvOworCXVfaW50CQkJQXR0cmlidXRlczsKKwl1X2ludAkJCUNhcmRPZmZzZXQ7Cit9IG10ZF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJlZ2lvbl9pbmZvX3QgeworCXVfaW50CQkJQXR0cmlidXRlczsKKwl1X2ludAkJCUNhcmRPZmZzZXQ7CisJdV9pbnQJCQlSZWdpb25TaXplOworCXVfaW50CQkJQWNjZXNzU3BlZWQ7CisJdV9pbnQJCQlCbG9ja1NpemU7CisJdV9pbnQJCQlQYXJ0TXVsdGlwbGU7CisJdV9jaGFyCQkJSmVkZWNNZnIsIEplZGVjSW5mbzsKKwltZW1vcnlfaGFuZGxlX3QJCW5leHQ7Cit9IHJlZ2lvbl9pbmZvX3Q7CisKKyNkZWZpbmUgUkVHSU9OX1RZUEUJCTB4MDAwMQorI2RlZmluZSBSRUdJT05fVFlQRV9DTQkJMHgwMDAwCisjZGVmaW5lIFJFR0lPTl9UWVBFX0FNCQkweDAwMDEKKyNkZWZpbmUgUkVHSU9OX1BSRUZFVENICQkweDAwMDgKKyNkZWZpbmUgUkVHSU9OX0NBQ0hFQUJMRQkweDAwMTAKKyNkZWZpbmUgUkVHSU9OX0JBUl9NQVNLCQkweGUwMDAKKyNkZWZpbmUgUkVHSU9OX0JBUl9TSElGVAkxMworCisvKiBGb3IgUmVwbGFjZUNJUyAqLwordHlwZWRlZiBzdHJ1Y3QgY2lzZHVtcF90IHsKKwl1X2ludAkJCUxlbmd0aDsKKwljaXNkYXRhX3QJCURhdGFbQ0lTVFBMX01BWF9DSVNfU0laRV07Cit9IGNpc2R1bXBfdDsKKworLyogZm9yIEdldENvbmZpZ3VyYXRpb25JbmZvICovCit0eXBlZGVmIHN0cnVjdCBjb25maWdfaW5mb190IHsKKwl1X2NoYXIJCQlGdW5jdGlvbjsKKwl1X2ludAkJCUF0dHJpYnV0ZXM7CisJdV9pbnQJCQlWY2MsIFZwcDEsIFZwcDI7CisJdV9pbnQJCQlJbnRUeXBlOworCXVfaW50CQkJQ29uZmlnQmFzZTsKKwl1X2NoYXIJCQlTdGF0dXMsIFBpbiwgQ29weSwgT3B0aW9uLCBFeHRTdGF0dXM7CisJdV9pbnQJCQlQcmVzZW50OworCXVfaW50CQkJQ2FyZFZhbHVlczsKKwl1X2ludAkJCUFzc2lnbmVkSVJROworCXVfaW50CQkJSVJRQXR0cmlidXRlczsKKwlpb2FkZHJfdAkJQmFzZVBvcnQxOworCWlvYWRkcl90CQlOdW1Qb3J0czE7CisJdV9pbnQJCQlBdHRyaWJ1dGVzMTsKKwlpb2FkZHJfdAkJQmFzZVBvcnQyOworCWlvYWRkcl90CQlOdW1Qb3J0czI7CisJdV9pbnQJCQlBdHRyaWJ1dGVzMjsKKwl1X2ludAkJCUlPQWRkckxpbmVzOworfSBjb25maWdfaW5mb190OworCisvKiBGb3IgVmFsaWRhdGVDSVMgKi8KK3R5cGVkZWYgc3RydWN0IGNpc2luZm9fdCB7CisJdV9pbnQJCQlDaGFpbnM7Cit9IGNpc2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgY3Nfc3RhdHVzX3QgeworCXVfY2hhcgkJCUZ1bmN0aW9uOworCWV2ZW50X3QgCQlDYXJkU3RhdGU7CisJZXZlbnRfdAkJCVNvY2tldFN0YXRlOworfSBjc19zdGF0dXNfdDsKKwordHlwZWRlZiB1bmlvbiBkc19pb2N0bF9hcmdfdCB7CisJYWRqdXN0X3QJCWFkanVzdDsKKwljb25maWdfaW5mb190CQljb25maWc7CisJdHVwbGVfdAkJCXR1cGxlOworCXR1cGxlX3BhcnNlX3QJCXR1cGxlX3BhcnNlOworCWNsaWVudF9yZXFfdAkJY2xpZW50X3JlcTsKKwljc19zdGF0dXNfdAkJc3RhdHVzOworCWNvbmZfcmVnX3QJCWNvbmZfcmVnOworCWNpc2luZm9fdAkJY2lzaW5mbzsKKwlyZWdpb25faW5mb190CQlyZWdpb247CisJYmluZF9pbmZvX3QJCWJpbmRfaW5mbzsKKwltdGRfaW5mb190CQltdGRfaW5mbzsKKwl3aW5faW5mb190CQl3aW5faW5mbzsKKwljaXNkdW1wX3QJCWNpc2R1bXA7Cit9IGRzX2lvY3RsX2FyZ190OworCisjZGVmaW5lIERTX0FESlVTVF9SRVNPVVJDRV9JTkZPCQkJX0lPV1IoJ2QnLCAgMiwgYWRqdXN0X3QpCisjZGVmaW5lIERTX0dFVF9DT05GSUdVUkFUSU9OX0lORk8JCV9JT1dSKCdkJywgIDMsIGNvbmZpZ19pbmZvX3QpCisjZGVmaW5lIERTX0dFVF9GSVJTVF9UVVBMRQkJCV9JT1dSKCdkJywgIDQsIHR1cGxlX3QpCisjZGVmaW5lIERTX0dFVF9ORVhUX1RVUExFCQkJX0lPV1IoJ2QnLCAgNSwgdHVwbGVfdCkKKyNkZWZpbmUgRFNfR0VUX1RVUExFX0RBVEEJCQlfSU9XUignZCcsICA2LCB0dXBsZV9wYXJzZV90KQorI2RlZmluZSBEU19QQVJTRV9UVVBMRQkJCQlfSU9XUignZCcsICA3LCB0dXBsZV9wYXJzZV90KQorI2RlZmluZSBEU19SRVNFVF9DQVJECQkJCV9JTyAgKCdkJywgIDgpCisjZGVmaW5lIERTX0dFVF9TVEFUVVMJCQkJX0lPV1IoJ2QnLCAgOSwgY3Nfc3RhdHVzX3QpCisjZGVmaW5lIERTX0FDQ0VTU19DT05GSUdVUkFUSU9OX1JFR0lTVEVSCV9JT1dSKCdkJywgMTAsIGNvbmZfcmVnX3QpCisjZGVmaW5lIERTX1ZBTElEQVRFX0NJUwkJCQlfSU9SICgnZCcsIDExLCBjaXNpbmZvX3QpCisjZGVmaW5lIERTX1NVU1BFTkRfQ0FSRAkJCQlfSU8gICgnZCcsIDEyKQorI2RlZmluZSBEU19SRVNVTUVfQ0FSRAkJCQlfSU8gICgnZCcsIDEzKQorI2RlZmluZSBEU19FSkVDVF9DQVJECQkJCV9JTyAgKCdkJywgMTQpCisjZGVmaW5lIERTX0lOU0VSVF9DQVJECQkJCV9JTyAgKCdkJywgMTUpCisjZGVmaW5lIERTX0dFVF9GSVJTVF9SRUdJT04JCQlfSU9XUignZCcsIDE2LCByZWdpb25faW5mb190KQorI2RlZmluZSBEU19HRVRfTkVYVF9SRUdJT04JCQlfSU9XUignZCcsIDE3LCByZWdpb25faW5mb190KQorI2RlZmluZSBEU19SRVBMQUNFX0NJUwkJCQlfSU9XUignZCcsIDE4LCBjaXNkdW1wX3QpCisjZGVmaW5lIERTX0dFVF9GSVJTVF9XSU5ET1cJCQlfSU9SICgnZCcsIDE5LCB3aW5faW5mb190KQorI2RlZmluZSBEU19HRVRfTkVYVF9XSU5ET1cJCQlfSU9XUignZCcsIDIwLCB3aW5faW5mb190KQorI2RlZmluZSBEU19HRVRfTUVNX1BBR0UJCQkJX0lPV1IoJ2QnLCAyMSwgd2luX2luZm9fdCkKKworI2RlZmluZSBEU19CSU5EX1JFUVVFU1QJCQkJX0lPV1IoJ2QnLCA2MCwgYmluZF9pbmZvX3QpCisjZGVmaW5lIERTX0dFVF9ERVZJQ0VfSU5GTwkJCV9JT1dSKCdkJywgNjEsIGJpbmRfaW5mb190KQorI2RlZmluZSBEU19HRVRfTkVYVF9ERVZJQ0UJCQlfSU9XUignZCcsIDYyLCBiaW5kX2luZm9fdCkKKyNkZWZpbmUgRFNfVU5CSU5EX1JFUVVFU1QJCQlfSU9XICgnZCcsIDYzLCBiaW5kX2luZm9fdCkKKyNkZWZpbmUgRFNfQklORF9NVEQJCQkJX0lPV1IoJ2QnLCA2NCwgbXRkX2luZm9fdCkKKworCisvKiB1c2VkIGluIHVzZXJzcGFjZSBvbmx5ICovCisjZGVmaW5lIENTX0lOX1VTRQkJCTB4MWUKKworI2RlZmluZSBJTkZPX01BU1RFUl9DTElFTlQJMHgwMQorI2RlZmluZSBJTkZPX0lPX0NMSUVOVAkJMHgwMgorI2RlZmluZSBJTkZPX01URF9DTElFTlQJCTB4MDQKKyNkZWZpbmUgSU5GT19NRU1fQ0xJRU5UCQkweDA4CisjZGVmaW5lIE1BWF9OVU1fQ0xJRU5UUwkJMworCisjZGVmaW5lIElORk9fQ0FSRF9TSEFSRQkJMHgxMAorI2RlZmluZSBJTkZPX0NBUkRfRVhDTAkJMHgyMAorCisKKyNlbmRpZiAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKENPTkZJR19QQ01DSUFfSU9DVEwpICovCisKICNlbmRpZiAvKiBfTElOVVhfRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvc3MuaCBiL2luY2x1ZGUvcGNtY2lhL3NzLmgKaW5kZXggZWQ5MTlkZC4uOWI0YWM5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvc3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9zcy5oCkBAIC01MywxMCArNTMsMTAgQEAKIAogLyogZm9yIEdldFNvY2tldCwgU2V0U29ja2V0ICovCiB0eXBlZGVmIHN0cnVjdCBzb2NrZXRfc3RhdGVfdCB7Ci0gICAgdV9pbnQJZmxhZ3M7Ci0gICAgdV9pbnQJY3NjX21hc2s7Ci0gICAgdV9jaGFyCVZjYywgVnBwOwotICAgIHVfY2hhcglpb19pcnE7CisJdV9pbnQJZmxhZ3M7CisJdV9pbnQJY3NjX21hc2s7CisJdV9jaGFyCVZjYywgVnBwOworCXVfY2hhcglpb19pcnE7CiB9IHNvY2tldF9zdGF0ZV90OwogCiBleHRlcm4gc29ja2V0X3N0YXRlX3QgZGVhZF9zb2NrZXQ7CkBAIC04Niw3OSArODYsMjIgQEAKICNkZWZpbmUgSE9PS19QT1dFUl9QUkUJMHgwMQogI2RlZmluZSBIT09LX1BPV0VSX1BPU1QJMHgwMgogCi0KIHR5cGVkZWYgc3RydWN0IHBjY2FyZF9pb19tYXAgewotICAgIHVfY2hhcgltYXA7Ci0gICAgdV9jaGFyCWZsYWdzOwotICAgIHVfc2hvcnQJc3BlZWQ7Ci0gICAgdV9pbnQJc3RhcnQsIHN0b3A7CisJdV9jaGFyCW1hcDsKKwl1X2NoYXIJZmxhZ3M7CisJdV9zaG9ydAlzcGVlZDsKKwl1X2ludAlzdGFydCwgc3RvcDsKIH0gcGNjYXJkX2lvX21hcDsKIAogdHlwZWRlZiBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgewotICAgIHVfY2hhcgltYXA7Ci0gICAgdV9jaGFyCWZsYWdzOwotICAgIHVfc2hvcnQJc3BlZWQ7Ci0gICAgdV9sb25nCXN0YXRpY19zdGFydDsKLSAgICB1X2ludAljYXJkX3N0YXJ0OwotICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVfY2hhcgkJbWFwOworCXVfY2hhcgkJZmxhZ3M7CisJdV9zaG9ydAkJc3BlZWQ7CisJdV9sb25nCQlzdGF0aWNfc3RhcnQ7CisJdV9pbnQJCWNhcmRfc3RhcnQ7CisJc3RydWN0IHJlc291cmNlCSpyZXM7CiB9IHBjY2FyZF9tZW1fbWFwOwogCi10eXBlZGVmIHN0cnVjdCBjYl9icmlkZ2VfbWFwIHsKLSAgICB1X2NoYXIJbWFwOwotICAgIHVfY2hhcglmbGFnczsKLSAgICB1X2ludAlzdGFydCwgc3RvcDsKLX0gY2JfYnJpZGdlX21hcDsKLQotLyoKLSAqIFNvY2tldCBvcGVyYXRpb25zLgotICovCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldDsKLQotc3RydWN0IHBjY2FyZF9vcGVyYXRpb25zIHsKLQlpbnQgKCppbml0KShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jayk7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2spOwotCWludCAoKmdldF9zdGF0dXMpKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCB1X2ludCAqdmFsdWUpOwotCWludCAoKnNldF9zb2NrZXQpKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpOwotCWludCAoKnNldF9pb19tYXApKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGNjYXJkX2lvX21hcCAqaW8pOwotCWludCAoKnNldF9tZW1fbWFwKShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pOwotfTsKLQotc3RydWN0IHBjY2FyZF9yZXNvdXJjZV9vcHMgewotCWludAkoKnZhbGlkYXRlX21lbSkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci0JaW50CSgqYWRqdXN0X2lvX3JlZ2lvbikJKHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCQkgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAotCQkJCQkgdW5zaWduZWQgbG9uZyByX2VuZCwKLQkJCQkJIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLQlzdHJ1Y3QgcmVzb3VyY2UqICgqZmluZF9pbykJKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgYWxpZ24sCi0JCQkJCSBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci0Jc3RydWN0IHJlc291cmNlKiAoKmZpbmRfbWVtKQkodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIG51bSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgYWxpZ24sIGludCBsb3csCi0JCQkJCSBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci0JaW50CSgqYWRkX2lvKQkJKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLAotCQkJCQkgdW5zaWduZWQgaW50IGFjdGlvbiwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgcl9zdGFydCwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgcl9lbmQpOwotCWludAkoKmFkZF9tZW0pCQkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJCSB1bnNpZ25lZCBpbnQgYWN0aW9uLAotCQkJCQkgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAotCQkJCQkgdW5zaWduZWQgbG9uZyByX2VuZCk7Ci0JaW50CSgqaW5pdCkJCQkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwotCXZvaWQJKCpleGl0KQkJCShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci19OwotLyogU1NfQ0FQX1NUQVRJQ19NQVAgKi8KLWV4dGVybiBzdHJ1Y3QgcGNjYXJkX3Jlc291cmNlX29wcyBwY2NhcmRfc3RhdGljX29wczsKLS8qICFTU19DQVBfU1RBVElDX01BUCAqLwotZXh0ZXJuIHN0cnVjdCBwY2NhcmRfcmVzb3VyY2Vfb3BzIHBjY2FyZF9ub25zdGF0aWNfb3BzOwotCi0vKiBzdGF0aWMgbWVtLCBkeW5hbWljIElPIHNvY2tldHMgKi8KLWV4dGVybiBzdHJ1Y3QgcGNjYXJkX3Jlc291cmNlX29wcyBwY2NhcmRfaW9keW5fb3BzOwotCi0vKgotICogIENhbGxzIHRvIHNldCB1cCBsb3ctbGV2ZWwgIlNvY2tldCBTZXJ2aWNlcyIgZHJpdmVycwotICovCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldDsKLQogdHlwZWRlZiBzdHJ1Y3QgaW9fd2luZG93X3QgewogCXVfaW50CQkJSW5Vc2UsIENvbmZpZzsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7CkBAIC0xNzksMTAgKzEyMiwyNSBAQAogLyogTWF4aW11bSBudW1iZXIgb2YgbWVtb3J5IHdpbmRvd3MgcGVyIHNvY2tldCAqLwogI2RlZmluZSBNQVhfV0lOIDQKIAorCisvKgorICogU29ja2V0IG9wZXJhdGlvbnMuCisgKi8KK3N0cnVjdCBwY21jaWFfc29ja2V0Oworc3RydWN0IHBjY2FyZF9yZXNvdXJjZV9vcHM7CiBzdHJ1Y3QgY29uZmlnX3Q7CiBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrOwogc3RydWN0IHVzZXJfaW5mb190OwogCitzdHJ1Y3QgcGNjYXJkX29wZXJhdGlvbnMgeworCWludCAoKmluaXQpKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CisJaW50ICgqZ2V0X3N0YXR1cykoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVfaW50ICp2YWx1ZSk7CisJaW50ICgqc2V0X3NvY2tldCkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHNvY2tldF9zdGF0ZV90ICpzdGF0ZSk7CisJaW50ICgqc2V0X2lvX21hcCkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHN0cnVjdCBwY2NhcmRfaW9fbWFwICppbyk7CisJaW50ICgqc2V0X21lbV9tYXApKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm1lbSk7Cit9OworCiBzdHJ1Y3QgcGNtY2lhX3NvY2tldCB7CiAJc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKIAlzcGlubG9ja190CQkJbG9jazsKQEAgLTE5OSw4ICsxNTcsOCBAQAogCWlvX3dpbmRvd190CQkJaW9bTUFYX0lPX1dJTl07CiAJd2luZG93X3QJCQl3aW5bTUFYX1dJTl07CiAJc3RydWN0IGxpc3RfaGVhZAkJY2lzX2NhY2hlOwotCXVfaW50CQkJCWZha2VfY2lzX2xlbjsKLQljaGFyCQkJCSpmYWtlX2NpczsKKwlzaXplX3QJCQkJZmFrZV9jaXNfbGVuOworCXU4CQkJCSpmYWtlX2NpczsKIAogCXN0cnVjdCBsaXN0X2hlYWQJCXNvY2tldF9saXN0OwogCXN0cnVjdCBjb21wbGV0aW9uCQlzb2NrZXRfcmVsZWFzZWQ7CkBAIC0yMTgsMTIgKzE3NiwxMiBAQAogCXN0cnVjdCBwY2lfZGV2ICoJCWNiX2RldjsKIAogCi0JLyogc29ja2V0IHNldHVwIGlzIGRvbmUgc28gcmVzb3VyY2VzIHNob3VsZCBiZSBhYmxlIHRvIGJlIGFsbG9jYXRlZC4gT25seQotCSAqIGlmIHNldCB0byAxLCBjYWxscyB0byBmaW5kX3tpbyxtZW19X3JlZ2lvbiBhcmUgaGFuZGxlZCwgYW5kIGluc2VydGlvbgotCSAqIGV2ZW50cyBhcmUgYWN0dWFsbHkgbWFuYWdlZCBieSB0aGUgUENNQ0lBIGxheWVyLiovCisJLyogc29ja2V0IHNldHVwIGlzIGRvbmUgc28gcmVzb3VyY2VzIHNob3VsZCBiZSBhYmxlIHRvIGJlIGFsbG9jYXRlZC4KKwkgKiBPbmx5IGlmIHNldCB0byAxLCBjYWxscyB0byBmaW5kX3tpbyxtZW19X3JlZ2lvbiBhcmUgaGFuZGxlZCwgYW5kCisJICogaW5zZXJ0aW8gZXZlbnRzIGFyZSBhY3R1YWxseSBtYW5hZ2VkIGJ5IHRoZSBQQ01DSUEgbGF5ZXIuKi8KIAl1OAkJCQlyZXNvdXJjZV9zZXR1cF9kb25lOjE7CiAKLQkvKiBpcyBzZXQgdG8gb25lIGlmIHJlc291cmNlIHNldHVwIGlzIGRvbmUgdXNpbmcgYWRqdXN0X3Jlc291cmNlX2luZm8oKSAqLworCS8qIEl0J3Mgb2xkIGlmIHJlc291cmNlIHNldHVwIGlzIGRvbmUgdXNpbmcgYWRqdXN0X3Jlc291cmNlX2luZm8oKSAqLwogCXU4CQkJCXJlc291cmNlX3NldHVwX29sZDoxOwogCXU4CQkJCXJlc291cmNlX3NldHVwX25ldzoxOwogCkBAIC0yMzYsNzUgKzE5NCwxMDEgQEAKIAogCS8qIFpvb20gdmlkZW8gYmVoYXZpb3VyIGlzIHNvIGNoaXAgc3BlY2lmaWMgaXRzIG5vdCB3b3J0aCBhZGRpbmcKIAkgICB0aGlzIHRvIF9vcHMgKi8KLQl2b2lkIAkJCQkoKnpvb21fdmlkZW8pKHN0cnVjdCBwY21jaWFfc29ja2V0ICosIGludCk7CisJdm9pZCAJCQkJKCp6b29tX3ZpZGVvKShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqLAorCQkJCQkJICAgICAgaW50KTsKIAogCS8qIHNvIGlzIHBvd2VyIGhvb2sgKi8KIAlpbnQgKCpwb3dlcl9ob29rKShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgaW50IG9wZXJhdGlvbik7Ci0jaWZkZWYgQ09ORklHX0NBUkRCVVMKKwogCS8qIGFsbG93cyB0dW5pbmcgdGhlIENCIGJyaWRnZSBiZWZvcmUgbG9hZGluZyBkcml2ZXIgZm9yIHRoZSBDQiBjYXJkICovCisjaWZkZWYgQ09ORklHX0NBUkRCVVMKIAl2b2lkICgqdHVuZV9icmlkZ2UpKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKICNlbmRpZgogCiAJLyogc3RhdGUgdGhyZWFkICovCi0Jc3RydWN0IG11dGV4CQkJc2t0X211dGV4OwkvKiBwcm90ZWN0cyBzb2NrZXQgaC93IHN0YXRlICovCi0KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJCSp0aHJlYWQ7CiAJc3RydWN0IGNvbXBsZXRpb24JCXRocmVhZF9kb25lOwotCXNwaW5sb2NrX3QJCQl0aHJlYWRfbG9jazsJLyogcHJvdGVjdHMgdGhyZWFkX2V2ZW50cyAqLwogCXVuc2lnbmVkIGludAkJCXRocmVhZF9ldmVudHM7CisJLyogcHJvdGVjdHMgc29ja2V0IGgvdyBzdGF0ZSAqLworCXN0cnVjdCBtdXRleAkJCXNrdF9tdXRleDsKKwkvKiBwcm90ZWN0cyB0aHJlYWRfZXZlbnRzICovCisJc3BpbmxvY2tfdAkJCXRocmVhZF9sb2NrOwogCiAJLyogcGNtY2lhICgxNi1iaXQpICovCiAJc3RydWN0IHBjbWNpYV9jYWxsYmFjawkJKmNhbGxiYWNrOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19QQ01DSUFfTU9EVUxFKQotCXN0cnVjdCBsaXN0X2hlYWQJCWRldmljZXNfbGlzdDsJLyogIFBDTUNJQSBkZXZpY2VzICovCi0JdTgJCQkJZGV2aWNlX2NvdW50OwkvKiB0aGUgbnVtYmVyIG9mIGRldmljZXMsIHVzZWQKLQkJCQkJCQkgKiBvbmx5IGludGVybmFsbHkgYW5kIHN1YmplY3QKLQkJCQkJCQkgKiB0byBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KKwkvKiBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHJlZmVyIHRvIDE2LWJpdCBQQ01DSUEgZGV2aWNlcyBpbnNlcnRlZAorCSAqIGludG8gdGhlIHNvY2tldCAqLworCXN0cnVjdCBsaXN0X2hlYWQJCWRldmljZXNfbGlzdDsKIAorCS8qIHRoZSBudW1iZXIgb2YgZGV2aWNlcywgdXNlZCBvbmx5IGludGVybmFsbHkgYW5kIHN1YmplY3QgdG8KKwkgKiBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KKwl1OAkJCQlkZXZpY2VfY291bnQ7CisKKwkvKiAxNi1iaXQgc3RhdGU6ICovCiAJc3RydWN0IHsKLQkJdTgJCQlwcmVzZW50OjEsCS8qIFBDTUNJQSBjYXJkIGlzIHByZXNlbnQgaW4gc29ja2V0ICovCi0JCQkJCWJ1c3k6MSwJCS8qICJtYXN0ZXIiIGlvY3RsIGlzIHVzZWQgKi8KLQkJCQkJZGVhZDoxLAkJLyogcGNtY2lhIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZCAqLwotCQkJCQlkZXZpY2VfYWRkX3BlbmRpbmc6MSwgLyogYSBtdWx0aWZ1bmN0aW9uLWRldmljZQotCQkJCQkJCSAgICAgICAqIGFkZCBldmVudCBpcyBwZW5kaW5nICovCi0JCQkJCW1mY19wZmM6MSwJLyogdGhlIHBlbmRpbmcgZXZlbnQgYWRkcyBhIG1mYyAoMSkgb3IgcGZjICgwKSAqLwotCQkJCQlyZXNlcnZlZDozOwotCX0gCQkJCXBjbWNpYV9zdGF0ZTsKKwkJLyogUENNQ0lBIGNhcmQgaXMgcHJlc2VudCBpbiBzb2NrZXQgKi8KKwkJdTgJCQlwcmVzZW50OjE7CisJCS8qICJtYXN0ZXIiIGlvY3RsIGlzIHVzZWQgKi8KKwkJdTgJCQlidXN5OjE7CisJCS8qIHBjbWNpYSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQgKi8KKwkJdTgJCQlkZWFkOjE7CisJCS8qIGEgbXVsdGlmdW5jdGlvbi1kZXZpY2UgYWRkIGV2ZW50IGlzIHBlbmRpbmcgKi8KKwkJdTgJCQlkZXZpY2VfYWRkX3BlbmRpbmc6MTsKKwkJLyogdGhlIHBlbmRpbmcgZXZlbnQgYWRkcyBhIG1mYyAoMSkgb3IgcGZjICgwKSAqLworCQl1OAkJCW1mY19wZmM6MTsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdAkJZGV2aWNlX2FkZDsJLyogZm9yIGFkZGluZyBmdXJ0aGVyIHBzZXVkby1tdWx0aWZ1bmN0aW9uCi0JCQkJCQkJICogZGV2aWNlcyAqLworCQl1OAkJCXJlc2VydmVkOjM7CisJfSBwY21jaWFfc3RhdGU7CisKKworCS8qIGZvciBhZGRpbmcgZnVydGhlciBwc2V1ZG8tbXVsdGlmdW5jdGlvbiBkZXZpY2VzICovCisJc3RydWN0IHdvcmtfc3RydWN0CQlkZXZpY2VfYWRkOwogCiAjaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAogCXN0cnVjdCB1c2VyX2luZm9fdAkJKnVzZXI7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJCXF1ZXVlOwotI2VuZGlmCi0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUENNQ0lBX0lPQ1RMICovCisjZW5kaWYgLyogQ09ORklHX1BDTUNJQSAqLwogCiAJLyogY2FyZGJ1cyAoMzItYml0KSAqLwogI2lmZGVmIENPTkZJR19DQVJEQlVTCiAJc3RydWN0IHJlc291cmNlICoJCWNiX2Npc19yZXM7CiAJdm9pZCBfX2lvbWVtCQkJKmNiX2Npc192aXJ0OwotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0NBUkRCVVMgKi8KIAogCS8qIHNvY2tldCBkZXZpY2UgKi8KIAlzdHJ1Y3QgZGV2aWNlCQkJZGV2OwotCXZvaWQJCQkJKmRyaXZlcl9kYXRhOwkvKiBkYXRhIGludGVybmFsIHRvIHRoZSBzb2NrZXQgZHJpdmVyICovCi0KKwkvKiBkYXRhIGludGVybmFsIHRvIHRoZSBzb2NrZXQgZHJpdmVyICovCisJdm9pZAkJCQkqZHJpdmVyX2RhdGE7CiB9OwogCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHBjbWNpYV9nZXRfc29ja2V0X2J5X25yKHVuc2lnbmVkIGludCBucik7CiAKLQotCi1leHRlcm4gdm9pZCBwY21jaWFfcGFyc2VfZXZlbnRzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIGludCBldmVudHMpOwotZXh0ZXJuIGludCBwY21jaWFfcmVnaXN0ZXJfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQpOwotZXh0ZXJuIHZvaWQgcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQpOwotCi1leHRlcm4gc3RydWN0IGNsYXNzIHBjbWNpYV9zb2NrZXRfY2xhc3M7CisvKiBzb2NrZXQgZHJpdmVycyBtdXN0IGRlZmluZSB0aGUgcmVzb3VyY2Ugb3BlcmF0aW9ucyB0eXBlIHRoZXkgdXNlLiBUaGVyZQorICogYXJlIHRocmVlIG9wdGlvbnM6CisgKiAtIHBjY2FyZF9zdGF0aWNfb3BzCQlpb21lbSBhbmQgaW9wb3J0IGFyZWFzIGFyZSBhc3NpZ25lZCBzdGF0aWNhbGx5CisgKiAtIHBjY2FyZF9pb2R5bl9vcHMJCWlvbWVtIGFyZWFzIGlzIGFzc2lnbmVkIHN0YXRpY2FsbHksIGlvcG9ydAorICoJCQkJYXJlYXMgZHluYW1pY2FsbHkKKyAqIC0gcGNjYXJkX25vbnN0YXRpY19vcHMJaW9tZW0gYW5kIGlvcG9ydCBhcmVhcyBhcmUgYXNzaWduZWQgZHluYW1pY2FsbHkuCisgKgkJCQlJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgdXNlCisgKgkJCQkic2VsZWN0IFBDQ0FSRF9OT05TVEFUSUMiIGluIEtjb25maWcuCisgKi8KK2V4dGVybiBzdHJ1Y3QgcGNjYXJkX3Jlc291cmNlX29wcyBwY2NhcmRfc3RhdGljX29wczsKK2V4dGVybiBzdHJ1Y3QgcGNjYXJkX3Jlc291cmNlX29wcyBwY2NhcmRfaW9keW5fb3BzOworZXh0ZXJuIHN0cnVjdCBwY2NhcmRfcmVzb3VyY2Vfb3BzIHBjY2FyZF9ub25zdGF0aWNfb3BzOwogCiAvKiBzb2NrZXQgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZXNlIGNhbGxiYWNrcyBpbiB0aGVpciAuZHJ2IHN0cnVjdCAqLwogZXh0ZXJuIGludCBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGV4dGVybiBpbnQgcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKKy8qIHNvY2tldCBkcml2ZXJzIHVzZSB0aGlzIGNhbGxiYWNrIGluIHRoZWlyIElSUSBoYW5kbGVyICovCitleHRlcm4gdm9pZCBwY21jaWFfcGFyc2VfZXZlbnRzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQsCisJCQkJdW5zaWduZWQgaW50IGV2ZW50cyk7CisKKy8qIHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIGEgc29ja2V0ICovCitleHRlcm4gaW50IHBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldCk7CitleHRlcm4gdm9pZCBwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldCk7CisKKwogI2VuZGlmIC8qIF9MSU5VWF9TU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2kuaAppbmRleCA1YzQwY2M1Li4xOTJmODcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTMwOSw2ICszMDksMjAgQEAKIH07CiAKIC8qCisgKiBUaGUgV2VsbCBLbm93biBMVU5TIChTQU0tMykgaW4gb3VyIGludCByZXByZXNlbnRhdGlvbiBvZiBhIExVTgorICovCisjZGVmaW5lIFNDU0lfV19MVU5fQkFTRSAweGMxMDAKKyNkZWZpbmUgU0NTSV9XX0xVTl9SRVBPUlRfTFVOUyAoU0NTSV9XX0xVTl9CQVNFICsgMSkKKyNkZWZpbmUgU0NTSV9XX0xVTl9BQ0NFU1NfQ09OVFJPTCAoU0NTSV9XX0xVTl9CQVNFICsgMikKKyNkZWZpbmUgU0NTSV9XX0xVTl9UQVJHRVRfTE9HX1BBR0UgKFNDU0lfV19MVU5fQkFTRSArIDMpCisKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfaXNfd2x1bih1bnNpZ25lZCBpbnQgbHVuKQoreworCXJldHVybiAobHVuICYgMHhmZjAwKSA9PSBTQ1NJX1dfTFVOX0JBU0U7Cit9CisKKworLyoKICAqICBNRVNTQUdFIENPREVTCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCmluZGV4IGY5ZjZlNzkuLjg1NWJmOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKQEAgLTc1LDcgKzc1LDYgQEAKIAogCWludCByZXRyaWVzOwogCWludCBhbGxvd2VkOwotCWludCB0aW1lb3V0X3Blcl9jb21tYW5kOwogCiAJdW5zaWduZWQgY2hhciBwcm90X29wOwogCXVuc2lnbmVkIGNoYXIgcHJvdF90eXBlOwpAQCAtODYsNyArODUsNiBAQAogCS8qIFRoZXNlIGVsZW1lbnRzIGRlZmluZSB0aGUgb3BlcmF0aW9uIHdlIGFyZSBhYm91dCB0byBwZXJmb3JtICovCiAJdW5zaWduZWQgY2hhciAqY21uZDsKIAotCXN0cnVjdCB0aW1lcl9saXN0IGVoX3RpbWVvdXQ7CS8qIFVzZWQgdG8gdGltZSBvdXQgdGhlIGNvbW1hbmQuICovCiAKIAkvKiBUaGVzZSBlbGVtZW50cyBkZWZpbmUgdGhlIG9wZXJhdGlvbiB3ZSB1bHRpbWF0ZWx5IHdhbnQgdG8gcGVyZm9ybSAqLwogCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyIHNkYjsKQEAgLTEzOSw3ICsxMzcsNiBAQAogZXh0ZXJuIHZvaWQgX19zY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHNjc2lfY21uZCAqLAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKik7CiBleHRlcm4gdm9pZCBzY3NpX2ZpbmlzaF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7Ci1leHRlcm4gdm9pZCBzY3NpX3JlcV9hYm9ydF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogZXh0ZXJuIHZvaWQgKnNjc2lfa21hcF9hdG9taWNfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IHNnX2NvdW50LAogCQkJCSBzaXplX3QgKm9mZnNldCwgc2l6ZV90ICpsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZGV2aWNlLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAppbmRleCA4MGIyZTkzLi5iNDllNzI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaApAQCAtNDIsOSArNDIsMTEgQEAKIAkJCQkgKiBvcmlnaW5hdGUgaW4gdGhlIG1pZC1sYXllcikgKi8KIAlTREVWX09GRkxJTkUsCQkvKiBEZXZpY2Ugb2ZmbGluZWQgKGJ5IGVycm9yIGhhbmRsaW5nIG9yCiAJCQkJICogdXNlciByZXF1ZXN0ICovCi0JU0RFVl9CTE9DSywJCS8qIERldmljZSBibG9ja2VkIGJ5IHNjc2kgbGxkLiAgTm8gc2NzaSAKLQkJCQkgKiBjb21tYW5kcyBmcm9tIHVzZXIgb3IgbWlkbGF5ZXIgc2hvdWxkIGJlIGlzc3VlZAotCQkJCSAqIHRvIHRoZSBzY3NpIGxsZC4gKi8KKwlTREVWX0JMT0NLLAkJLyogRGV2aWNlIGJsb2NrZWQgYnkgc2NzaSBsbGQuICBObworCQkJCSAqIHNjc2kgY29tbWFuZHMgZnJvbSB1c2VyIG9yIG1pZGxheWVyCisJCQkJICogc2hvdWxkIGJlIGlzc3VlZCB0byB0aGUgc2NzaQorCQkJCSAqIGxsZC4gKi8KKwlTREVWX0NSRUFURURfQkxPQ0ssCS8qIHNhbWUgYXMgYWJvdmUgYnV0IGZvciBjcmVhdGVkIGRldmljZXMgKi8KIH07CiAKIGVudW0gc2NzaV9kZXZpY2VfZXZlbnQgewpAQCAtMzg0LDEwICszODYsMjMgQEAKICNkZWZpbmUgc2NtZF9pZChzY21kKSBzZGV2X2lkKChzY21kKS0+ZGV2aWNlKQogI2RlZmluZSBzY21kX2NoYW5uZWwoc2NtZCkgc2Rldl9jaGFubmVsKChzY21kKS0+ZGV2aWNlKQogCisvKgorICogY2hlY2tzIGZvciBwb3NpdGlvbnMgb2YgdGhlIFNDU0kgc3RhdGUgbWFjaGluZQorICovCiBzdGF0aWMgaW5saW5lIGludCBzY3NpX2RldmljZV9vbmxpbmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXJldHVybiBzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfT0ZGTElORTsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfZGV2aWNlX2Jsb2NrZWQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfQkxPQ0sgfHwKKwkJc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0NSRUFURURfQkxPQ0s7Cit9CitzdGF0aWMgaW5saW5lIGludCBzY3NpX2RldmljZV9jcmVhdGVkKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlyZXR1cm4gc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0NSRUFURUQgfHwKKwkJc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0NSRUFURURfQkxPQ0s7Cit9CiAKIC8qIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhlIFNDU0kgcGFyYW1ldGVycyAqLwogc3RhdGljIGlubGluZSBpbnQgc2NzaV9kZXZpY2Vfc3luYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKaW5kZXggNDRhNTVkMS4uZDEyM2NhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaApAQCAtNDMsMTMgKzQzLDYgQEAKICNkZWZpbmUgRElTQUJMRV9DTFVTVEVSSU5HIDAKICNkZWZpbmUgRU5BQkxFX0NMVVNURVJJTkcgMQogCi1lbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuIHsKLQlFSF9OT1RfSEFORExFRCwKLQlFSF9IQU5ETEVELAotCUVIX1JFU0VUX1RJTUVSLAotfTsKLQotCiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTM0Nyw3ICszNDAsNyBAQAogCSAqCiAJICogU3RhdHVzOiBPUFRJT05BTAogCSAqLwotCWVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gKCogZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOworCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiAoKmVoX3RpbWVkX291dCkoc3RydWN0IHNjc2lfY21uZCAqKTsKIAogCS8qCiAJICogTmFtZSBvZiBwcm9jIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfbmV0bGluay5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfbmV0bGluay5oCmluZGV4IDhjMTQ3MGMuLjUzNjc1MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX25ldGxpbmsuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9uZXRsaW5rLmgKQEAgLTIyLDYgKzIyLDkgQEAKICNpZm5kZWYgU0NTSV9ORVRMSU5LX0gKICNkZWZpbmUgU0NTSV9ORVRMSU5LX0gKIAorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworCiAvKgogICogVGhpcyBmaWxlIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGJ5IGJvdGgga2VybmVsIGFuZCB1c2VyIHNwYWNlCiAgKi8KQEAgLTU1LDcgKzU4LDQxIEBACiAjZGVmaW5lIFNDU0lfTkxfVFJBTlNQT1JUX0ZDCQkJMQogI2RlZmluZSBTQ1NJX05MX01BWF9UUkFOU1BPUlRTCQkJMgogCi0vKiBzY3NpX25sX2hkci0+bXNndHlwZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gZWFjaCB0cmFuc3BvcnQgKi8KKy8qIFRyYW5zcG9ydC1iYXNlZCBzY3NpX25sX2hkci0+bXNndHlwZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gZWFjaCB0cmFuc3BvcnQgKi8KKworLyoKKyAqIEdFTkVSSUMgU0NTSSBzY3NpX25sX2hkci0+bXNndHlwZSBWYWx1ZXMKKyAqLworCS8qIGtlcm5lbCAtPiB1c2VyICovCisjZGVmaW5lIFNDU0lfTkxfU0hPU1RfVkVORE9SCQkJMHgwMDAxCisJLyogdXNlciAtPiBrZXJuZWwgKi8KKy8qIFNDU0lfTkxfU0hPU1RfVkVORE9SIG1zZ3R5cGUgaXMga2VybmVsLT51c2VyIGFuZCB1c2VyLT5rZXJuZWwgKi8KKworCisvKgorICogTWVzc2FnZSBTdHJ1Y3R1cmVzIDoKKyAqLworCisvKiBtYWNybyB0byByb3VuZCB1cCBtZXNzYWdlIGxlbmd0aHMgdG8gOGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgU0NTSV9OTF9NU0dBTElHTihsZW4pCQkoKChsZW4pICsgNykgJiB+NykKKworCisvKgorICogU0NTSSBIT1NUIFZlbmRvciBVbmlxdWUgbWVzc2FnZXMgOgorICogICBTQ1NJX05MX1NIT1NUX1ZFTkRPUgorICoKKyAqIE5vdGU6IFRoZSBWZW5kb3IgVW5pcXVlIG1lc3NhZ2UgcGF5bG9hZCB3aWxsIGJlZ2luIGRpcmVjdGx5IGFmdGVyCisgKiAJIHRoaXMgc3RydWN0dXJlLCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQgcGVyIHZtc2dfZGF0YWxlbi4KKyAqCisgKiBOb3RlOiBXaGVuIHNwZWNpZnlpbmcgdmVuZG9yX2lkLCBiZSBzdXJlIHRvIHJlYWQgdGhlIFZlbmRvciBUeXBlIGFuZCBJRAorICogICBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYmVsb3cKKyAqLworc3RydWN0IHNjc2lfbmxfaG9zdF92ZW5kb3JfbXNnIHsKKwlzdHJ1Y3Qgc2NzaV9ubF9oZHIgc25saDsJCS8qIG11c3QgYmUgMXN0IGVsZW1lbnQgISAqLworCXVpbnQ2NF90IHZlbmRvcl9pZDsKKwl1aW50MTZfdCBob3N0X25vOworCXVpbnQxNl90IHZtc2dfZGF0YWxlbjsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YodWludDY0X3QpKSkpOwogCiAKIC8qCkBAIC04Myw1ICsxMjAsMjggQEAKIAl9CiAKIAorI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKy8qIEV4cG9ydGVkIEtlcm5lbCBJbnRlcmZhY2VzICovCitpbnQgc2NzaV9ubF9hZGRfdHJhbnNwb3J0KHU4IHRwb3J0LAorCSBpbnQgKCptc2dfaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKiksCisJdm9pZCAoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopKTsKK3ZvaWQgc2NzaV9ubF9yZW1vdmVfdHJhbnNwb3J0KHU4IHRwb3J0KTsKKworaW50IHNjc2lfbmxfYWRkX2RyaXZlcih1NjQgdmVuZG9yX2lkLCBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpob3N0dCwKKwlpbnQgKCpubG1zZ19oYW5kbGVyKShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdm9pZCAqcGF5bG9hZCwKKwkJCQkgdTMyIGxlbiwgdTMyIHBpZCksCisJdm9pZCAoKm5sZXZ0X2hhbmRsZXIpKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKm5vdGlmeV9wdHIpKTsKK3ZvaWQgc2NzaV9ubF9yZW1vdmVfZHJpdmVyKHU2NCB2ZW5kb3JfaWQpOworCit2b2lkIHNjc2lfbmxfc2VuZF90cmFuc3BvcnRfbXNnKHUzMiBwaWQsIHN0cnVjdCBzY3NpX25sX2hkciAqaGRyKTsKK2ludCBzY3NpX25sX3NlbmRfdmVuZG9yX21zZyh1MzIgcGlkLCB1bnNpZ25lZCBzaG9ydCBob3N0X25vLCB1NjQgdmVuZG9yX2lkLAorCQkJIGNoYXIgKmRhdGFfYnVmLCB1MzIgZGF0YV9sZW4pOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCiAjZW5kaWYgLyogU0NTSV9ORVRMSU5LX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaAppbmRleCA0OTBiZDEzLi4wZGUzMmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnQuaApAQCAtMjEsNiArMjEsNyBAQAogI2RlZmluZSBTQ1NJX1RSQU5TUE9SVF9ICiAKICNpbmNsdWRlIDxsaW51eC90cmFuc3BvcnRfY2xhc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KIApAQCAtNjQsNyArNjUsNyBAQAogCSAqCQkJYmVnaW4gY291bnRpbmcgYWdhaW4KIAkgKiBFSF9OT1RfSEFORExFRAlCZWdpbiBub3JtYWwgZXJyb3IgcmVjb3ZlcnkKIAkgKi8KLQllbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuICgqIGVoX3RpbWVkX291dCkoc3RydWN0IHNjc2lfY21uZCAqKTsKKwllbnVtIGJsa19laF90aW1lcl9yZXR1cm4gKCplaF90aW1lZF9vdXQpKHN0cnVjdCBzY3NpX2NtbmQgKik7CiAKIAkvKgogCSAqIFVzZWQgYXMgY2FsbGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGlfdF9uZXh1cyByZXF1ZXN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCmluZGV4IDg3ODM3M2MuLjIxMDE4YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCkBAIC0xNjcsNiArMTY3LDI2IEBACiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl92cG9ydF8jI19uYW1lID0gCVwKIAlfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQogCisvKgorICogZmNfdnBvcnRfaWRlbnRpZmllcnM6IFRoaXMgc2V0IG9mIGRhdGEgY29udGFpbnMgYWxsIGVsZW1lbnRzCisgKiB0byB1bmlxdWVseSBpZGVudGlmeSBhbmQgaW5zdGFudGlhdGUgYSBGQyB2aXJ0dWFsIHBvcnQuCisgKgorICogTm90ZXM6CisgKiAgIHN5bWJvbGljX25hbWU6IFRoZSBkcml2ZXIgaXMgdG8gYXBwZW5kIHRoZSBzeW1ib2xpY19uYW1lIHN0cmluZyBkYXRhCisgKiAgICAgIHRvIHRoZSBzeW1ib2xpY19ub2RlX25hbWUgZGF0YSB0aGF0IGl0IGdlbmVyYXRlcyBieSBkZWZhdWx0LgorICogICAgICB0aGUgcmVzdWx0aW5nIGNvbWJpbmF0aW9uIHNob3VsZCB0aGVuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3dpdGNoLgorICogICAgICBJdCBpcyBleHBlY3RlZCB0aGF0IHRoaW5ncyBsaWtlIFhlbiBtYXkgc3R1ZmYgYSBWTSB0aXRsZSBpbnRvCisgKiAgICAgIHRoaXMgZmllbGQuCisgKi8KKyNkZWZpbmUgRkNfVlBPUlRfU1lNQk9MSUNfTkFNRUxFTgkJNjQKK3N0cnVjdCBmY192cG9ydF9pZGVudGlmaWVycyB7CisJdTY0IG5vZGVfbmFtZTsKKwl1NjQgcG9ydF9uYW1lOworCXUzMiByb2xlczsKKwlib29sIGRpc2FibGU7CisJZW51bSBmY19wb3J0X3R5cGUgdnBvcnRfdHlwZTsJLyogb25seSBGQ19QT1JUVFlQRV9OUElWIGFsbG93ZWQgKi8KKwljaGFyIHN5bWJvbGljX25hbWVbRkNfVlBPUlRfU1lNQk9MSUNfTkFNRUxFTl07Cit9OwogCiAvKgogICogRkMgVmlydHVhbCBQb3J0IEF0dHJpYnV0ZXMKQEAgLTE5Nyw3ICsyMTcsNiBAQAogICogbWFuYWdlZCBieSB0aGUgdHJhbnNwb3J0IHcvbyBkcml2ZXIgaW50ZXJhY3Rpb24uCiAgKi8KIAotI2RlZmluZSBGQ19WUE9SVF9TWU1CT0xJQ19OQU1FTEVOCQk2NAogc3RydWN0IGZjX3Zwb3J0IHsKIAkvKiBGaXhlZCBBdHRyaWJ1dGVzICovCiAKQEAgLTczMiw2ICs3NTEsOCBAQAogCSAqICAgYmUgc3VyZSB0byByZWFkIHRoZSBWZW5kb3IgVHlwZSBhbmQgSUQgZm9ybWF0dGluZyByZXF1aXJlbWVudHMKIAkgKiAgIHNwZWNpZmllZCBpbiBzY3NpX25ldGxpbmsuaAogCSAqLworc3RydWN0IGZjX3Zwb3J0ICpmY192cG9ydF9jcmVhdGUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCBjaGFubmVsLAorCQlzdHJ1Y3QgZmNfdnBvcnRfaWRlbnRpZmllcnMgKik7CiBpbnQgZmNfdnBvcnRfdGVybWluYXRlKHN0cnVjdCBmY192cG9ydCAqdnBvcnQpOwogCiAjZW5kaWYgLyogU0NTSV9UUkFOU1BPUlRfRkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hZDE4NDguaCBiL2luY2x1ZGUvc291bmQvYWQxODQ4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWViZGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9hZDE4NDguaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0jaWZuZGVmIF9fU09VTkRfQUQxODQ4X0gKLSNkZWZpbmUgX19TT1VORF9BRDE4NDhfSAotCi0vKgotICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KLSAqICBEZWZpbml0aW9ucyBmb3IgQUQxODQ3L0FEMTg0OC9DUzQyNDggY2hpcHMKLSAqCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAicGNtLmgiCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLS8qIElPIHBvcnRzICovCi0KLSNkZWZpbmUgQUQxODQ4UCggY2hpcCwgeCApICggKGNoaXApIC0+IHBvcnQgKyBjX2RfY19BRDE4NDgjI3ggKQotCi0jZGVmaW5lIGNfZF9jX0FEMTg0OFJFR1NFTAkwCi0jZGVmaW5lIGNfZF9jX0FEMTg0OFJFRwkJMQotI2RlZmluZSBjX2RfY19BRDE4NDhTVEFUVVMJMgotI2RlZmluZSBjX2RfY19BRDE4NDhQSU8JCTMKLQotLyogY29kZWMgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgQUQxODQ4X0xFRlRfSU5QVVQJMHgwMAkvKiBsZWZ0IGlucHV0IGNvbnRyb2wgKi8KLSNkZWZpbmUgQUQxODQ4X1JJR0hUX0lOUFVUCTB4MDEJLyogcmlnaHQgaW5wdXQgY29udHJvbCAqLwotI2RlZmluZSBBRDE4NDhfQVVYMV9MRUZUX0lOUFVUCTB4MDIJLyogbGVmdCBBVVgxIGlucHV0IGNvbnRyb2wgKi8KLSNkZWZpbmUgQUQxODQ4X0FVWDFfUklHSFRfSU5QVVQJMHgwMwkvKiByaWdodCBBVVgxIGlucHV0IGNvbnRyb2wgKi8KLSNkZWZpbmUgQUQxODQ4X0FVWDJfTEVGVF9JTlBVVAkweDA0CS8qIGxlZnQgQVVYMiBpbnB1dCBjb250cm9sICovCi0jZGVmaW5lIEFEMTg0OF9BVVgyX1JJR0hUX0lOUFVUCTB4MDUJLyogcmlnaHQgQVVYMiBpbnB1dCBjb250cm9sICovCi0jZGVmaW5lIEFEMTg0OF9MRUZUX09VVFBVVAkweDA2CS8qIGxlZnQgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQUQxODQ4X1JJR0hUX09VVFBVVAkweDA3CS8qIHJpZ2h0IG91dHB1dCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIEFEMTg0OF9EQVRBX0ZPUk1BVAkweDA4CS8qIGNsb2NrIGFuZCBkYXRhIGZvcm1hdCAtIHBsYXliYWNrL2NhcHR1cmUgLSBiaXRzIDctMCBNQ0UgKi8KLSNkZWZpbmUgQUQxODQ4X0lGQUNFX0NUUkwJMHgwOQkvKiBpbnRlcmZhY2UgY29udHJvbCAtIGJpdHMgNy0yIE1DRSAqLwotI2RlZmluZSBBRDE4NDhfUElOX0NUUkwJCTB4MGEJLyogcGluIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUQxODQ4X1RFU1RfSU5JVAkweDBiCS8qIHRlc3QgYW5kIGluaXRpYWxpemF0aW9uICovCi0jZGVmaW5lIEFEMTg0OF9NSVNDX0lORk8JMHgwYwkvKiBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEFEMTg0OF9MT09QQkFDSwkJMHgwZAkvKiBsb29wYmFjayBjb250cm9sICovCi0jZGVmaW5lIEFEMTg0OF9EQVRBX1VQUl9DTlQJMHgwZQkvKiBwbGF5YmFjay9jYXB0dXJlIHVwcGVyIGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQUQxODQ4X0RBVEFfTFdSX0NOVAkweDBmCS8qIHBsYXliYWNrL2NhcHR1cmUgbG93ZXIgYmFzZSBjb3VudCAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3IgY29kZWMgcmVnaXN0ZXIgc2VsZWN0IHBvcnQgLSBDT0RFQ1AoIFJFR1NFTCApICovCi0KLSNkZWZpbmUgQUQxODQ4X0lOSVQJCTB4ODAJLyogQ09ERUMgaXMgaW5pdGlhbGl6aW5nICovCi0jZGVmaW5lIEFEMTg0OF9NQ0UJCTB4NDAJLyogbW9kZSBjaGFuZ2UgZW5hYmxlICovCi0jZGVmaW5lIEFEMTg0OF9UUkQJCTB4MjAJLyogdHJhbnNmZXIgcmVxdWVzdCBkaXNhYmxlICovCi0KLS8qIGRlZmluaXRpb25zIGZvciBjb2RlYyBzdGF0dXMgcmVnaXN0ZXIgLSBDT0RFQ1AoIFNUQVRVUyApICovCi0KLSNkZWZpbmUgQUQxODQ4X0dMT0JBTElSUQkweDAxCS8qIElSUSBpcyBhY3RpdmUgKi8KLQotLyogZGVmaW5pdGlvbnMgZm9yIEFEMTg0OF9MRUZUX0lOUFVUIGFuZCBBRDE4NDhfUklHSFRfSU5QVVQgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgQUQxODQ4X0VOQUJMRV9NSUNfR0FJTgkweDIwCi0KLSNkZWZpbmUgQUQxODQ4X01JWFNfTElORTEJMHgwMAotI2RlZmluZSBBRDE4NDhfTUlYU19BVVgxCTB4NDAKLSNkZWZpbmUgQUQxODQ4X01JWFNfTElORTIJMHg4MAotI2RlZmluZSBBRDE4NDhfTUlYU19BTEwJCTB4YzAKLQotLyogZGVmaW5pdGlvbnMgZm9yIGNsb2NrIGFuZCBkYXRhIGZvcm1hdCByZWdpc3RlciAtIEFEMTg0OF9QTEFZQktfRk9STUFUICovCi0KLSNkZWZpbmUgQUQxODQ4X0xJTkVBUl84CQkweDAwCS8qIDgtYml0IHVuc2lnbmVkIGRhdGEgKi8KLSNkZWZpbmUgQUQxODQ4X0FMQVdfOAkJMHg2MAkvKiA4LWJpdCBBLWxhdyBjb21wYW5kZWQgKi8KLSNkZWZpbmUgQUQxODQ4X1VMQVdfOAkJMHgyMAkvKiA4LWJpdCBVLWxhdyBjb21wYW5kZWQgKi8KLSNkZWZpbmUgQUQxODQ4X0xJTkVBUl8xNgkweDQwCS8qIDE2LWJpdCB0d29zIGNvbXBsZW1lbnQgZGF0YSAtIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgQUQxODQ4X1NURVJFTwkJMHgxMAkvKiBzdGVyZW8gbW9kZSAqLwotLyogYml0cyAzLTEgZGVmaW5lIGZyZXF1ZW5jeSBkaXZpc29yICovCi0jZGVmaW5lIEFEMTg0OF9YVEFMMQkJMHgwMAkvKiAyNC41NzYgY3J5c3RhbCAqLwotI2RlZmluZSBBRDE4NDhfWFRBTDIJCTB4MDEJLyogMTYuOTM0NCBjcnlzdGFsICovCi0KLS8qIGRlZmluaXRpb25zIGZvciBpbnRlcmZhY2UgY29udHJvbCByZWdpc3RlciAtIEFEMTg0OF9JRkFDRV9DVFJMICovCi0KLSNkZWZpbmUgQUQxODQ4X0NBUFRVUkVfUElPCTB4ODAJLyogY2FwdHVyZSBQSU8gZW5hYmxlICovCi0jZGVmaW5lIEFEMTg0OF9QTEFZQkFDS19QSU8JMHg0MAkvKiBwbGF5YmFjayBQSU8gZW5hYmxlICovCi0jZGVmaW5lIEFEMTg0OF9DQUxJQl9NT0RFCTB4MTgJLyogY2FsaWJyYXRpb24gbW9kZSBiaXRzICovCi0jZGVmaW5lIEFEMTg0OF9BVVRPQ0FMSUIJMHgwOAkvKiBhdXRvIGNhbGlicmF0ZSAqLwotI2RlZmluZSBBRDE4NDhfU0lOR0xFX0RNQQkweDA0CS8qIHVzZSBzaW5nbGUgRE1BIGNoYW5uZWwgKi8KLSNkZWZpbmUgQUQxODQ4X0NBUFRVUkVfRU5BQkxFCTB4MDIJLyogY2FwdHVyZSBlbmFibGUgKi8KLSNkZWZpbmUgQUQxODQ4X1BMQVlCQUNLX0VOQUJMRQkweDAxCS8qIHBsYXliYWNrIGVuYWJsZSAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3IgcGluIGNvbnRyb2wgcmVnaXN0ZXIgLSBBRDE4NDhfUElOX0NUUkwgKi8KLQotI2RlZmluZSBBRDE4NDhfSVJRX0VOQUJMRQkweDAyCS8qIGVuYWJsZSBJUlEgKi8KLSNkZWZpbmUgQUQxODQ4X1hDVEwxCQkweDQwCS8qIGV4dGVybmFsIGNvbnRyb2wgIzEgKi8KLSNkZWZpbmUgQUQxODQ4X1hDVEwwCQkweDgwCS8qIGV4dGVybmFsIGNvbnRyb2wgIzAgKi8KLQotLyogZGVmaW5pdGlvbnMgZm9yIHRlc3QgYW5kIGluaXQgcmVnaXN0ZXIgLSBBRDE4NDhfVEVTVF9JTklUICovCi0KLSNkZWZpbmUgQUQxODQ4X0NBTElCX0lOX1BST0dSRVNTIDB4MjAJLyogYXV0byBjYWxpYnJhdGUgaW4gcHJvZ3Jlc3MgKi8KLSNkZWZpbmUgQUQxODQ4X0RNQV9SRVFVRVNUCTB4MTAJLyogRE1BIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgKi8KLQotLyogZGVmaW5lcyBmb3IgY29kZWMubW9kZSAqLwotCi0jZGVmaW5lIEFEMTg0OF9NT0RFX05PTkUJMHgwMDAwCi0jZGVmaW5lIEFEMTg0OF9NT0RFX1BMQVkJMHgwMDAxCi0jZGVmaW5lIEFEMTg0OF9NT0RFX0NBUFRVUkUJMHgwMDAyCi0jZGVmaW5lIEFEMTg0OF9NT0RFX1RJTUVSCTB4MDAwNAotI2RlZmluZSBBRDE4NDhfTU9ERV9PUEVOCShBRDE4NDhfTU9ERV9QTEFZfEFEMTg0OF9NT0RFX0NBUFRVUkV8QUQxODQ4X01PREVfVElNRVIpCi0jZGVmaW5lIEFEMTg0OF9NT0RFX1JVTk5JTkcJMHgwMDEwCi0KLS8qIGRlZmluZXMgZm9yIGNvZGVjLmhhcmR3YXJlICovCi0KLSNkZWZpbmUgQUQxODQ4X0hXX0RFVEVDVAkweDAwMDAJLyogbGV0IEFEMTg0OCBkcml2ZXIgZGV0ZWN0IGNoaXAgKi8KLSNkZWZpbmUgQUQxODQ4X0hXX0FEMTg0NwkweDAwMDEJLyogQUQxODQ3IGNoaXAgKi8KLSNkZWZpbmUgQUQxODQ4X0hXX0FEMTg0OAkweDAwMDIJLyogQUQxODQ4IGNoaXAgKi8KLSNkZWZpbmUgQUQxODQ4X0hXX0NTNDI0OAkweDAwMDMJLyogQ1M0MjQ4IGNoaXAgKi8KLSNkZWZpbmUgQUQxODQ4X0hXX0NNSTgzMzAJMHgwMDA0CS8qIENNSTgzMzAgY2hpcCAqLwotI2RlZmluZSBBRDE4NDhfSFdfVEhJTktQQUQJMHgwMDA1CS8qIFRoaW5rcGFkIDM2MC83NTAvNzU1ICovCi0KLS8qIElCTSBUaGlua3BhZCBzcGVjaWZpYyBzdHVmZiAqLwotI2RlZmluZSBBRDE4NDhfVEhJTktQQURfQ1RMX1BPUlQxCQkweDE1ZTgKLSNkZWZpbmUgQUQxODQ4X1RISU5LUEFEX0NUTF9QT1JUMgkJMHgxNWU5Ci0jZGVmaW5lIEFEMTg0OF9USElOS1BBRF9DUzQyNDhfRU5BQkxFX0JJVAkweDAyCi0KLXN0cnVjdCBzbmRfYWQxODQ4IHsKLQl1bnNpZ25lZCBsb25nIHBvcnQ7CQkvKiBpL28gcG9ydCAqLwotCXN0cnVjdCByZXNvdXJjZSAqcmVzX3BvcnQ7Ci0JaW50IGlycTsJCQkvKiBJUlEgbGluZSAqLwotCWludCBkbWE7CQkJLyogZGF0YSBETUEgKi8KLQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwkJLyogdmVyc2lvbiBvZiBDT0RFQyBjaGlwICovCi0JdW5zaWduZWQgc2hvcnQgbW9kZTsJCS8qIHNlZSB0byBBRDE4NDhfTU9ERV9YWFhYICovCi0JdW5zaWduZWQgc2hvcnQgaGFyZHdhcmU7CS8qIHNlZSB0byBBRDE4NDhfSFdfWFhYWCAqLwotCXVuc2lnbmVkIHNob3J0IHNpbmdsZV9kbWE6MTsJLyogZm9yY2VkIHNpbmdsZSBETUEgbW9kZSAoR1VTIDE2LWJpdCBkYXVnaHRlciBib2FyZCkgb3IgZG1hMSA9PSBkbWEyICovCi0KLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGxheWJhY2tfc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCi0JdW5zaWduZWQgY2hhciBpbWFnZVszMl07CS8qIFNHYWxheHkgbmVlZHMgYW4gYWNjZXNzIHRvIGV4dGVuZGVkIHJlZ2lzdGVycyAqLwotCWludCBtY2VfYml0OwotCWludCBjYWxpYnJhdGVfbXV0ZTsKLQlpbnQgZG1hX3NpemU7Ci0JaW50IHRoaW5rcGFkX2ZsYWc7CQkvKiBUaGlua3BhZCBDUzQyNDggbmVlZHMgc29tZSBleHRyYSBoZWxwICovCi0KLSNpZmRlZiBDT05GSUdfUE0KLQl2b2lkICgqc3VzcGVuZCkoc3RydWN0IHNuZF9hZDE4NDggKmNoaXApOwotCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKTsKLSNlbmRpZgotCi0Jc3BpbmxvY2tfdCByZWdfbG9jazsKLX07Ci0KLS8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotCi12b2lkIHNuZF9hZDE4NDhfb3V0KHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSk7Ci0KLWludCBzbmRfYWQxODQ4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcG9ydCwKLQkJICAgICAgaW50IGlycSwgaW50IGRtYSwKLQkJICAgICAgdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUsCi0JCSAgICAgIHN0cnVjdCBzbmRfYWQxODQ4ICoqIGNoaXApOwotCi1pbnQgc25kX2FkMTg0OF9wY20oc3RydWN0IHNuZF9hZDE4NDggKiBjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKnJwY20pOwotY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzICpzbmRfYWQxODQ4X2dldF9wY21fb3BzKGludCBkaXJlY3Rpb24pOwotaW50IHNuZF9hZDE4NDhfbWl4ZXIoc3RydWN0IHNuZF9hZDE4NDggKiBjaGlwKTsKLQotLyogZXhwb3J0ZWQgbWl4ZXIgc3R1ZmZzICovCi1lbnVtIHsgQUQxODQ4X01JWF9TSU5HTEUsIEFEMTg0OF9NSVhfRE9VQkxFLCBBRDE4NDhfTUlYX0NBUFRVUkUgfTsKLQotI2RlZmluZSBBRDE4NDhfTUlYVkFMX1NJTkdMRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKLQkoKHJlZykgfCAoKHNoaWZ0KSA8PCA4KSB8ICgobWFzaykgPDwgMTYpIHwgKChpbnZlcnQpIDw8IDI0KSkKLSNkZWZpbmUgQUQxODQ4X01JWFZBTF9ET1VCTEUobGVmdF9yZWcsIHJpZ2h0X3JlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1hc2ssIGludmVydCkgXAotCSgobGVmdF9yZWcpIHwgKChyaWdodF9yZWcpIDw8IDgpIHwgKChzaGlmdF9sZWZ0KSA8PCAxNikgfCAoKHNoaWZ0X3JpZ2h0KSA8PCAxOSkgfCAoKG1hc2spIDw8IDI0KSB8ICgoaW52ZXJ0KSA8PCAyMikpCi0KLS8qIGZvciBlYXNlIG9mIHVzZSAqLwotc3RydWN0IGFkMTg0OF9taXhfZWxlbSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgaW5kZXg7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBwcml2YXRlX3ZhbHVlOwotCWNvbnN0IHVuc2lnbmVkIGludCAqdGx2OwotfTsKLQotI2RlZmluZSBBRDE4NDhfU0lOR0xFKHhuYW1lLCB4aW5kZXgsIHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgXAoteyAubmFtZSA9IHhuYW1lLCBcCi0gIC5pbmRleCA9IHhpbmRleCwgXAotICAudHlwZSA9IEFEMTg0OF9NSVhfU0lOR0xFLCBcCi0gIC5wcml2YXRlX3ZhbHVlID0gQUQxODQ4X01JWFZBTF9TSU5HTEUocmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSB9Ci0KLSNkZWZpbmUgQUQxODQ4X1NJTkdMRV9UTFYoeG5hbWUsIHhpbmRleCwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0LCB4dGx2KSBcCi17IC5uYW1lID0geG5hbWUsIFwKLSAgLmluZGV4ID0geGluZGV4LCBcCi0gIC50eXBlID0gQUQxODQ4X01JWF9TSU5HTEUsIFwKLSAgLnByaXZhdGVfdmFsdWUgPSBBRDE4NDhfTUlYVkFMX1NJTkdMRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpLCBcCi0gIC50bHYgPSB4dGx2IH0KLQotI2RlZmluZSBBRDE4NDhfRE9VQkxFKHhuYW1lLCB4aW5kZXgsIGxlZnRfcmVnLCByaWdodF9yZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKLXsgLm5hbWUgPSB4bmFtZSwgXAotICAuaW5kZXggPSB4aW5kZXgsIFwKLSAgLnR5cGUgPSBBRDE4NDhfTUlYX0RPVUJMRSwgXAotICAucHJpdmF0ZV92YWx1ZSA9IEFEMTg0OF9NSVhWQUxfRE9VQkxFKGxlZnRfcmVnLCByaWdodF9yZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIH0KLQotI2RlZmluZSBBRDE4NDhfRE9VQkxFX1RMVih4bmFtZSwgeGluZGV4LCBsZWZ0X3JlZywgcmlnaHRfcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0LCB4dGx2KSBcCi17IC5uYW1lID0geG5hbWUsIFwKLSAgLmluZGV4ID0geGluZGV4LCBcCi0gIC50eXBlID0gQUQxODQ4X01JWF9ET1VCTEUsIFwKLSAgLnByaXZhdGVfdmFsdWUgPSBBRDE4NDhfTUlYVkFMX0RPVUJMRShsZWZ0X3JlZywgcmlnaHRfcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSwgXAotICAudGx2ID0geHRsdiB9Ci0KLWludCBzbmRfYWQxODQ4X2FkZF9jdGxfZWxlbShzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCwgY29uc3Qgc3RydWN0IGFkMTg0OF9taXhfZWxlbSAqYyk7Ci0KLSNlbmRpZiAvKiBfX1NPVU5EX0FEMTg0OF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oIGIvaW5jbHVkZS9zb3VuZC9hc291bmQuaAppbmRleCAzZWFmMTU1Li4yYzRkYzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKQEAgLTkzLDkgKzkzLDEwIEBACiAJU05EUlZfSFdERVBfSUZBQ0VfUENYSFIsCS8qIERpZ2lncmFtIFBDWEhSICovCiAJU05EUlZfSFdERVBfSUZBQ0VfU0JfUkMsCS8qIFNCIEV4dGlneS9BdWRpZ3kyTlggcmVtb3RlIGNvbnRyb2wgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9IREEsCQkvKiBIRC1hdWRpbyAqLworCVNORFJWX0hXREVQX0lGQUNFX1VTQl9TVFJFQU0sCS8qIGRpcmVjdCBhY2Nlc3MgdG8gdXNiIHN0cmVhbSAqLwogCiAJLyogRG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgZm9sbG93aW5nOiAqLwotCVNORFJWX0hXREVQX0lGQUNFX0xBU1QgPSBTTkRSVl9IV0RFUF9JRkFDRV9IREEKKwlTTkRSVl9IV0RFUF9JRkFDRV9MQVNUID0gU05EUlZfSFdERVBfSUZBQ0VfVVNCX1NUUkVBTQogfTsKIAogc3RydWN0IHNuZF9od2RlcF9pbmZvIHsKQEAgLTI5NiwyOSArMjk3LDM5IEBACiAJdW5zaWduZWQgY2hhciByZXNlcnZlZFs2NF07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUuLi4gKi8KIH07CiAKLXR5cGVkZWYgaW50IF9fYml0d2lzZSBzbmRfcGNtX2h3X3BhcmFtX3Q7Ci0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9BQ0NFU1MJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMCkgLyogQWNjZXNzIHR5cGUgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVAkoKF9fZm9yY2Ugc25kX3BjbV9od19wYXJhbV90KSAxKSAvKiBGb3JtYXQgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVAkoKF9fZm9yY2Ugc25kX3BjbV9od19wYXJhbV90KSAyKSAvKiBTdWJmb3JtYXQgKi8KK3R5cGVkZWYgaW50IHNuZF9wY21faHdfcGFyYW1fdDsKKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUwkwCS8qIEFjY2VzcyB0eXBlICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQJMQkvKiBGb3JtYXQgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVAkyCS8qIFN1YmZvcm1hdCAqLwogI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSwlTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTCiAjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0sJU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVAogCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9TQU1QTEVfQklUUwkoKF9fZm9yY2Ugc25kX3BjbV9od19wYXJhbV90KSA4KSAvKiBCaXRzIHBlciBzYW1wbGUgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0ZSQU1FX0JJVFMJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgOSkgLyogQml0cyBwZXIgZnJhbWUgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTCSgoX19mb3JjZSBzbmRfcGNtX2h3X3BhcmFtX3QpIDEwKSAvKiBDaGFubmVscyAqLwotI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURQkJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTEpIC8qIEFwcHJveCByYXRlICovCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRQkoKF9fZm9yY2Ugc25kX3BjbV9od19wYXJhbV90KSAxMikgLyogQXBwcm94IGRpc3RhbmNlIGJldHdlZW4gaW50ZXJydXB0cyBpbiB1cyAqLwotI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTMpIC8qIEFwcHJveCBmcmFtZXMgYmV0d2VlbiBpbnRlcnJ1cHRzICovCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTQpIC8qIEFwcHJveCBieXRlcyBiZXR3ZWVuIGludGVycnVwdHMgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTUpIC8qIEFwcHJveCBpbnRlcnJ1cHRzIHBlciBidWZmZXIgKi8KLSNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9USU1FCSgoX19mb3JjZSBzbmRfcGNtX2h3X3BhcmFtX3QpIDE2KSAvKiBBcHByb3ggZHVyYXRpb24gb2YgYnVmZmVyIGluIHVzICovCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRQkoKF9fZm9yY2Ugc25kX3BjbV9od19wYXJhbV90KSAxNykgLyogU2l6ZSBvZiBidWZmZXIgaW4gZnJhbWVzICovCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTgpIC8qIFNpemUgb2YgYnVmZmVyIGluIGJ5dGVzICovCi0jZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9USUNLX1RJTUUJKChfX2ZvcmNlIHNuZF9wY21faHdfcGFyYW1fdCkgMTkpIC8qIEFwcHJveCB0aWNrIGR1cmF0aW9uIGluIHVzICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9TQU1QTEVfQklUUwk4CS8qIEJpdHMgcGVyIHNhbXBsZSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fRlJBTUVfQklUUwk5CS8qIEJpdHMgcGVyIGZyYW1lICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUwkxMAkvKiBDaGFubmVscyAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURQkJMTEJLyogQXBwcm94IHJhdGUgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FCTEyCS8qIEFwcHJveCBkaXN0YW5jZSBiZXR3ZWVuCisJCQkJCQkgKiBpbnRlcnJ1cHRzIGluIHVzCisJCQkJCQkgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFCTEzCS8qIEFwcHJveCBmcmFtZXMgYmV0d2VlbgorCQkJCQkJICogaW50ZXJydXB0cworCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMJMTQJLyogQXBwcm94IGJ5dGVzIGJldHdlZW4KKwkJCQkJCSAqIGludGVycnVwdHMKKwkJCQkJCSAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUwkxNQkvKiBBcHByb3ggaW50ZXJydXB0cyBwZXIKKwkJCQkJCSAqIGJ1ZmZlcgorCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfVElNRQkxNgkvKiBBcHByb3ggZHVyYXRpb24gb2YgYnVmZmVyCisJCQkJCQkgKiBpbiB1cworCQkJCQkJICovCisjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRQkxNwkvKiBTaXplIG9mIGJ1ZmZlciBpbiBmcmFtZXMgKi8KKyNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUwkxOAkvKiBTaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworI2RlZmluZQlTTkRSVl9QQ01fSFdfUEFSQU1fVElDS19USU1FCTE5CS8qIEFwcHJveCB0aWNrIGR1cmF0aW9uIGluIHVzICovCiAjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9JTlRFUlZBTAlTTkRSVl9QQ01fSFdfUEFSQU1fU0FNUExFX0JJVFMKICNkZWZpbmUJU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfSU5URVJWQUwJU05EUlZfUENNX0hXX1BBUkFNX1RJQ0tfVElNRQogCi0jZGVmaW5lIFNORFJWX1BDTV9IV19QQVJBTVNfTk9SRVNBTVBMRQkJKDE8PDApCS8qIGF2b2lkIHJhdGUgcmVzYW1wbGluZyAqLworI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX05PUkVTQU1QTEUJKDE8PDApCS8qIGF2b2lkIHJhdGUgcmVzYW1wbGluZyAqLwogCiBzdHJ1Y3Qgc25kX2ludGVydmFsIHsKIAl1bnNpZ25lZCBpbnQgbWluLCBtYXg7CkBAIC02OTYsNyArNzA3LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBTTkRSVl9DVExfVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCA1KQorI2RlZmluZSBTTkRSVl9DVExfVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCA2KQogCiBzdHJ1Y3Qgc25kX2N0bF9jYXJkX2luZm8gewogCWludCBjYXJkOwkJCS8qIGNhcmQgbnVtYmVyICovCkBAIC03MDcsOCArNzE4LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGxvbmduYW1lWzgwXTsJLyogbmFtZSArIGluZm8gdGV4dCBhYm91dCBzb3VuZGNhcmQgKi8KIAl1bnNpZ25lZCBjaGFyIHJlc2VydmVkX1sxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgKHdhcyBJRCBvZiBtaXhlcikgKi8KIAl1bnNpZ25lZCBjaGFyIG1peGVybmFtZVs4MF07CS8qIHZpc3VhbCBtaXhlciBpZGVudGlmaWNhdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIgY29tcG9uZW50c1s4MF07CS8qIGNhcmQgY29tcG9uZW50cyAvIGZpbmUgaWRlbnRpZmljYXRpb24sIGRlbGltaXRlZCB3aXRoIG9uZSBzcGFjZSAoQUM5NyBldGMuLikgKi8KLQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzQ4XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAqLworCXVuc2lnbmVkIGNoYXIgY29tcG9uZW50c1sxMjhdOwkvKiBjYXJkIGNvbXBvbmVudHMgLyBmaW5lIGlkZW50aWZpY2F0aW9uLCBkZWxpbWl0ZWQgd2l0aCBvbmUgc3BhY2UgKEFDOTcgZXRjLi4pICovCiB9OwogCiB0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX2N0bF9lbGVtX3R5cGVfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYXNvdW5kZWYuaCBiL2luY2x1ZGUvc291bmQvYXNvdW5kZWYuaAppbmRleCBhNmUwZmFjLi4yMGViZjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZGVmLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hc291bmRlZi5oCkBAIC02MCwzNSArNjAsNTYgQEAKICNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX1VTRVJCSVRTX1VERUYJKDEyPDw0KQkvKiB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KICNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZCTB4N2YKICNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0dFTkVSQUwJCTB4MDAKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0VYUEVSSU1FTlRBTAkweDQwCi0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9NQVNLCTB4MGYKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lECTB4MDgKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfTUFTSyAweDA3Ci0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lECTB4MDQKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfTUFTSyAweDA3Ci0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lECTB4MDIKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfTUFTSyAweDFmCi0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUX0lEIDB4MDYKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19NQVNLCTB4MWYKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19JRAkJMHgxNgotI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMl9NQVNLIDB4MGYKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDJfSUQJMHgwZQogI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfTUFTSwkweDA3CiAjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRAkweDAxCi0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX01BU0sJMHgwNwotI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRAkweDA1Ci0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19NQVNLCTB4MDcKLSNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lECTB4MDMKICNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0lFQzkwOF9DRAkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4MDApCiAjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9OT05fSUVDOTA4X0NECShJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgwOCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01JTklfRElTQwkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4NDgpCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EVkQJCShJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgxOCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0xBU1RFUk9QVF9PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4NzgpCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX01BU0sgMHgwNworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRAkweDAyCiAjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9QQ01fQ09ERVIJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MDApCi0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TQU1QTEVSCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgyMCkKICNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01JWEVSCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgxMCkKICNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1JBVEVfQ09OVkVSVEVSCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDE4KQotI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU1lOVEhFU0laRVIJKElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lEfDB4MDApCi0jZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NSUNST1BIT05FCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDA4KQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU0FNUExFUgkJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MjApCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EU1AJCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDI4KQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9PVEhFUiAoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHg3OCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX01BU0sJMHgwNworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUQJMHgwMwogI2RlZmluZSBJRUM5NThfQUVTMV9DT05fREFUCQkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4MDApCiAjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9WQ1IJCShJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfSUR8MHgwOCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RDQwkJKElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDQwKQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTUFHTkVUSUNfRElTQwkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4MTgpCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4NzgpCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX01BU0sgMHgwNworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRAkweDA0CisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQUJfSkFQQU4JKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4MDApCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9EQUJfRVVST1BFCShJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDA4KQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fREFCX1VTQQkJKElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lEfDB4NjApCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0ZUV0FSRQkoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHg0MCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0lFQzYyMTA1CShJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9JRHwweDIwKQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQlJPQURDQVNUMV9PVEhFUiAoSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfSUR8MHg3OCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDJfTUFTSyAweDBmCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QyX0lECTB4MGUKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfTUFTSwkweDA3CisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lECTB4MDUKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NZTlRIRVNJWkVSCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDAwKQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTUlDUk9QSE9ORQkoSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfSUR8MHgwOCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfT1RIRVIJKElFQzk1OF9BRVMxX0NPTl9NVVNJQ0FMX0lEfDB4NzgpCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfTUFTSwkweDFmCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9BRENfSUQJCTB4MDYKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQwkJKElFQzk1OF9BRVMxX0NPTl9BRENfSUR8MHgwMCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19PVEhFUgkoSUVDOTU4X0FFUzFfQ09OX0FEQ19JRHwweDYwKQorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVF9NQVNLIDB4MWYKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfSUQgMHgxNgorI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVAkoSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfSUR8MHgwMCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfT1RIRVIgKElFQzk1OF9BRVMxX0NPTl9BRENfQ09QWVJJR0hUX0lEfDB4NjApCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9NQVNLCTB4MGYKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lECTB4MDgKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0RJR0lUQUxfUkVDT1JERVJfUExBWUVSIChJRUM5NThfQUVTMV9DT05fU09MSURNRU1fSUR8MHgwMCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX09USEVSCShJRUM5NThfQUVTMV9DT05fU09MSURNRU1fSUR8MHg3MCkKKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0VYUEVSSU1FTlRBTAkweDQwCiAjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTAkoMTw8NykJLyogdGhpcyBiaXRzIGRlcGVuZHMgb24gdGhlIGNhdGVnb3J5IGNvZGUgKi8KICNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1NCSVRTCQkoNzw8MCkJLyogbWFzayAtIHNhbXBsZSBiaXRzICovCiAjZGVmaW5lIElFQzk1OF9BRVMyX1BST19TQklUU18yMAkoMjw8MCkJLyogMjAtYml0IC0gY29vcmRpbmF0aW9uICovCkBAIC0xMDYsOCArMTI3LDE2IEBACiAjZGVmaW5lIElFQzk1OF9BRVMyX0NPTl9DSEFOTkVMX1VOU1BFQwkoMDw8NCkJLyogdW5zcGVjaWZpZWQgKi8KICNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTCQkoMTU8PDApCS8qIG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCiAjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU180NDEwMAkoMDw8MCkJLyogNDQuMWtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfTk9USUQJKDE8PDApCS8qIG5vbiBpbmRpY2F0ZWQgKi8KICNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwCSgyPDwwKQkvKiA0OGtIeiAqLwogI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMzIwMDAJKDM8PDApCS8qIDMya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18yMjA1MAkoNDw8MCkJLyogMjIuMDVrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzI0MDAwCSg2PDwwKQkvKiAyNGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfODgyMDAJKDg8PDApCS8qIDg4LjJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0ZTXzc2ODAwMAkoOTw8MCkJLyogNzY4a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU185NjAwMAkoMTA8PDApCS8qIDk2a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU18xNzY0MDAJKDEyPDwwKQkvKiAxNzYuNGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMTkyMDAwCSgxNDw8MCkJLyogMTkya0h6ICovCiAjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9DTE9DSwkJKDM8PDQpCS8qIG1hc2sgLSBjbG9jayBhY2N1cmFjeSAqLwogI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfMTAwMFBQTQkoMDw8NCkJLyogMTAwMCBwcG0gKi8KICNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzUwUFBNCSgxPDw0KQkvKiA1MCBwcG0gKi8KQEAgLTEyMCw2ICsxNDksMjYgQEAKICNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjNfMTkJKDQ8PDEpCS8qIDIzLWJpdCBvciAxOS1iaXQgKi8KICNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjRfMjAJKDU8PDEpCS8qIDI0LWJpdCBvciAyMC1iaXQgKi8KICNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX1dPUkRMRU5fMjFfMTcJKDY8PDEpCS8qIDIxLWJpdCBvciAxNy1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGUwkJKDE1PDw0KQkvKiBtYXNrIC0gb3JpZ2luYWwgc2FtcGxlIGZyZXF1ZW5jeSAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTX05PVElECSgwPDw0KQkvKiBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTkyMDAwCSgxPDw0KQkvKiAxOTJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18xMjAwMAkoMjw8NCkJLyogMTJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18xNzY0MDAJKDM8PDQpCS8qIDE3Ni40a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfOTYwMDAJKDU8PDQpCS8qIDk2a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfODAwMAkoNjw8NCkJLyogOGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzg4MjAwCSg3PDw0KQkvKiA4OC4ya0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTYwMDAJKDg8PDQpCS8qIDE2a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMjQwMDAJKDk8PDQpCS8qIDI0a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMTEwMjUJKDEwPDw0KQkvKiAxMS4wMjVrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU18yMjA1MAkoMTE8PDQpCS8qIDIyLjA1a0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVM0X0NPTl9PUklHRlNfMzIwMDAJKDEyPDw0KQkvKiAzMmtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTNF9DT05fT1JJR0ZTXzQ4MDAwCSgxMzw8NCkJLyogNDhrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzRfQ09OX09SSUdGU180NDEwMAkoMTU8PDQpCS8qIDQ0LjFrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzVfQ09OX0NHTVNBCQkoMzw8MCkJLyogbWFzayAtIENHTVMtQSAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWUZSRUVMWSAoMDw8MCkJLyogY29weWluZyBpcyBwZXJtaXR0ZWQgd2l0aG91dCByZXN0cmljdGlvbiAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWU9OQ0UJKDE8PDApCS8qIG9uZSBnZW5lcmF0aW9uIG9mIGNvcGllcyBtYXkgYmUgbWFkZSAqLworI2RlZmluZSBJRUM5NThfQUVTNV9DT05fQ0dNU0FfQ09QWU5PTU9SRSAoMjw8MCkJLyogY29uZGl0aW9uIG5vdCBiZSB1c2VkICovCisjZGVmaW5lIElFQzk1OF9BRVM1X0NPTl9DR01TQV9DT1BZTkVWRVIJKDM8PDApCS8qIG5vIGNvcHlpbmcgaXMgcGVybWl0dGVkICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2NvcmUuaCBiL2luY2x1ZGUvc291bmQvY29yZS5oCmluZGV4IDU1OGI5NjIuLjM1NDI0YTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvY29yZS5oCisrKyBiL2luY2x1ZGUvc291bmQvY29yZS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4JCS8qIHN0cnVjdCByd19zZW1hcGhvcmUgKi8KICNpbmNsdWRlIDxsaW51eC9wbS5oPgkJCS8qIHBtX21lc3NhZ2VfdCAqLwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogCiAvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHNvdW5kY2FyZHMgKi8KICNpZmRlZiBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTCkBAIC00Miw5ICs0Myw2IEBACiAjaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IHBjaV9kZXY7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfU0JVUwotc3RydWN0IHNidXNfZGV2OwotI2VuZGlmCiAKIC8qIGRldmljZSBhbGxvY2F0aW9uIHN0dWZmICovCiAKQEAgLTYzLDYgKzYxLDcgQEAKICNkZWZpbmUJU05EUlZfREVWX0lORk8JCSgoX19mb3JjZSBzbmRfZGV2aWNlX3R5cGVfdCkgMHgxMDA2KQogI2RlZmluZQlTTkRSVl9ERVZfQlVTCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwNykKICNkZWZpbmUJU05EUlZfREVWX0NPREVDCQkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MTAwOCkKKyNkZWZpbmUJU05EUlZfREVWX0pBQ0sgICAgICAgICAgKChfX2ZvcmNlIHNuZF9kZXZpY2VfdHlwZV90KSAweDEwMDkpCiAjZGVmaW5lCVNORFJWX0RFVl9MT1dMRVZFTAkoKF9fZm9yY2Ugc25kX2RldmljZV90eXBlX3QpIDB4MjAwMCkKIAogdHlwZWRlZiBpbnQgX19iaXR3aXNlIHNuZF9kZXZpY2Vfc3RhdGVfdDsKQEAgLTExNCw3ICsxMTMsNyBAQAogCWNoYXIgc2hvcnRuYW1lWzMyXTsJCS8qIHNob3J0IG5hbWUgb2YgdGhpcyBzb3VuZGNhcmQgKi8KIAljaGFyIGxvbmduYW1lWzgwXTsJCS8qIG5hbWUgb2YgdGhpcyBzb3VuZGNhcmQgKi8KIAljaGFyIG1peGVybmFtZVs4MF07CQkvKiBtaXhlciBuYW1lICovCi0JY2hhciBjb21wb25lbnRzWzgwXTsJCS8qIGNhcmQgY29tcG9uZW50cyBkZWxpbWl0ZWQgd2l0aAorCWNoYXIgY29tcG9uZW50c1sxMjhdOwkJLyogY2FyZCBjb21wb25lbnRzIGRlbGltaXRlZCB3aXRoCiAJCQkJCQkJCXNwYWNlICovCiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlOwkJLyogdG9wLWxldmVsIG1vZHVsZSAqLwogCkBAIC0zNjYsOCArMzY1LDYgQEAKIAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAotI2RlZmluZSBfX0FTVFJJTkdfXyh4KSAjeAotCiAjaWZkZWYgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USwogLyoqCiAgKiBzbmRfcHJpbnRkIC0gZGVidWcgcHJpbnRrCkBAIC0zODIsMzMgKzM3OSwxNSBAQAogI2RlZmluZSBzbmRfcHJpbnRkKGZtdCwgYXJncy4uLikgXAogCXByaW50ayhmbXQgLCMjYXJncykKICNlbmRpZgotLyoqCi0gKiBzbmRfYXNzZXJ0IC0gcnVuLXRpbWUgYXNzZXJ0aW9uIG1hY3JvCi0gKiBAZXhwcjogZXhwcmVzc2lvbgotICoKLSAqIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSBleHByZXNzaW9uIGluIHJ1bi10aW1lIGFuZCBpbnZva2VzIHRoZSBjb21tYW5kcwotICogZ2l2ZW4gaW4gdGhlIHJlc3QgYXJndW1lbnRzIGlmIHRoZSBhc3NlcnRpb24gaXMgZmFpbGVkLgotICogV2hlbiBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQsIHRoZSBleHByZXNzaW9uIGlzIGV4ZWN1dGVkIGJ1dAotICogbm90IGNoZWNrZWQuCi0gKi8KLSNkZWZpbmUgc25kX2Fzc2VydChleHByLCBhcmdzLi4uKSBkbyB7CQkJCQlcCi0JaWYgKHVubGlrZWx5KCEoZXhwcikpKSB7CQkJCQlcCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkJVRz8gKCVzKVxuIiwgX19BU1RSSU5HX18oZXhwcikpOwlcCi0JCWR1bXBfc3RhY2soKTsJCQkJCQlcCi0JCWFyZ3M7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQogCi0jZGVmaW5lIHNuZF9CVUcoKSBkbyB7CQkJCVwKLQlzbmRfcHJpbnRrKEtFUk5fRVJSICJCVUc/XG4iKTsJCVwKLQlkdW1wX3N0YWNrKCk7CQkJCVwKLX0gd2hpbGUgKDApCisjZGVmaW5lIHNuZF9CVUcoKQkJV0FSTigxLCAiQlVHP1xuIikKKyNkZWZpbmUgc25kX0JVR19PTihjb25kKQlXQVJOKChjb25kKSwgIkJVRz8gKCVzKVxuIiwgX19zdHJpbmdpZnkoY29uZCkpCiAKICNlbHNlIC8qICFDT05GSUdfU05EX0RFQlVHICovCiAKICNkZWZpbmUgc25kX3ByaW50ZChmbXQsIGFyZ3MuLi4pCS8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgc25kX2Fzc2VydChleHByLCBhcmdzLi4uKQkodm9pZCkoZXhwcikKICNkZWZpbmUgc25kX0JVRygpCQkJLyogbm90aGluZyAqLworI2RlZmluZSBzbmRfQlVHX09OKGNvbmQpCSh7Lyoodm9pZCkoY29uZCk7Ki8gMDt9KSAgLyogYWx3YXlzIGZhbHNlICovCiAKICNlbmRpZiAvKiBDT05GSUdfU05EX0RFQlVHICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY3M0MjMxLmggYi9pbmNsdWRlL3NvdW5kL2NzNDIzMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc4NWY5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvY3M0MjMxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotI2lmbmRlZiBfX1NPVU5EX0NTNDIzMV9ICi0jZGVmaW5lIF9fU09VTkRfQ1M0MjMxX0gKLQotLyoKLSAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+Ci0gKiAgRGVmaW5pdGlvbnMgZm9yIENTNDIzMSAmIEludGVyV2F2ZSBjaGlwcyAmIGNvbXBhdGlibGUgY2hpcHMKLSAqCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAiY29udHJvbC5oIgotI2luY2x1ZGUgInBjbS5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0KLSNpbmNsdWRlICJjczQyMzEtcmVncy5oIgotCi0vKiBkZWZpbmVzIGZvciBjb2RlYy5tb2RlICovCi0KLSNkZWZpbmUgQ1M0MjMxX01PREVfTk9ORQkweDAwMDAKLSNkZWZpbmUgQ1M0MjMxX01PREVfUExBWQkweDAwMDEKLSNkZWZpbmUgQ1M0MjMxX01PREVfUkVDT1JECTB4MDAwMgotI2RlZmluZSBDUzQyMzFfTU9ERV9USU1FUgkweDAwMDQKLSNkZWZpbmUgQ1M0MjMxX01PREVfT1BFTgkoQ1M0MjMxX01PREVfUExBWXxDUzQyMzFfTU9ERV9SRUNPUkR8Q1M0MjMxX01PREVfVElNRVIpCi0KLS8qIGRlZmluZXMgZm9yIGNvZGVjLmhhcmR3YXJlICovCi0KLSNkZWZpbmUgQ1M0MjMxX0hXX0RFVEVDVCAgICAgICAgMHgwMDAwCS8qIGxldCBDUzQyMzEgZHJpdmVyIGRldGVjdCBjaGlwICovCi0jZGVmaW5lIENTNDIzMV9IV19ERVRFQ1QzCTB4MDAwMQkvKiBhbGxvdyBtb2RlIDMgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX1RZUEVfTUFTSwkweGZmMDAJLyogdHlwZSBtYXNrICovCi0jZGVmaW5lIENTNDIzMV9IV19DUzQyMzFfTUFTSyAgIDB4MDEwMAkvKiBDUzQyMzEgc2VyaWUgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzMSAgICAgICAgMHgwMTAwCS8qIENTNDIzMSBjaGlwICovCi0jZGVmaW5lIENTNDIzMV9IV19DUzQyMzFBICAgICAgIDB4MDEwMQkvKiBDUzQyMzFBIGNoaXAgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0FEMTg0NQkweDAxMDIJLyogQUQxODQ1IGNoaXAgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzMl9NQVNLICAgMHgwMjAwCS8qIENTNDIzMiBzZXJpZSAoaGFzIGNvbnRyb2wgcG9ydHMpICovCi0jZGVmaW5lIENTNDIzMV9IV19DUzQyMzIgICAgICAgIDB4MDIwMAkvKiBDUzQyMzIgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzMkEgICAgICAgMHgwMjAxCS8qIENTNDIzMkEgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzNgkweDAyMDIJLyogQ1M0MjM2ICovCi0jZGVmaW5lIENTNDIzMV9IV19DUzQyMzZCX01BU0sJMHgwNDAwCS8qIENTNDIzNkIgc2VyaWUgKGhhcyBleHRlbmRlZCBjb250cm9sIHJlZ3MpICovCi0jZGVmaW5lIENTNDIzMV9IV19DUzQyMzUJMHgwNDAwCS8qIENTNDIzNSAtIENyeXN0YWwgQ2xlYXIgKHRtKSBzdGVyZW8gZW5oYW5jZW1lbnQgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzNkIgICAgICAgMHgwNDAxCS8qIENTNDIzNkIgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzN0IgICAgICAgMHgwNDAyCS8qIENTNDIzN0IgLSBTUlMgM0QgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzOEIJMHgwNDAzCS8qIENTNDIzOEIgLSBRU09VTkQgM0QgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX0NTNDIzOQkweDA0MDQJLyogQ1M0MjM5IC0gQ3J5c3RhbCBDbGVhciAodG0pIHN0ZXJlbyBlbmhhbmNlbWVudCAqLwotLyogY29tcGF0aWJsZSwgYnV0IGNsb25lcyAqLwotI2RlZmluZSBDUzQyMzFfSFdfSU5URVJXQVZFICAgICAweDEwMDAJLyogSW50ZXJXYXZlIGNoaXAgKi8KLSNkZWZpbmUgQ1M0MjMxX0hXX09QTDNTQTIgICAgICAgMHgxMTAxCS8qIE9QTDMtU0EyIGNoaXAsIHNpbWlsYXIgdG8gY3M0MjMxICovCi0jZGVmaW5lIENTNDIzMV9IV19PUFRJOTNYIAkweDExMDIJLyogT3B0aSA5MzAvOTMxLzkzMyAqLwotCi0vKiBkZWZpbmVzIGZvciBjb2RlYy5od3NoYXJlICovCi0jZGVmaW5lIENTNDIzMV9IV1NIQVJFX0lSUQkoMTw8MCkKLSNkZWZpbmUgQ1M0MjMxX0hXU0hBUkVfRE1BMQkoMTw8MSkKLSNkZWZpbmUgQ1M0MjMxX0hXU0hBUkVfRE1BMgkoMTw8MikKLQotc3RydWN0IHNuZF9jczQyMzEgewotCXVuc2lnbmVkIGxvbmcgcG9ydDsJCS8qIGJhc2UgaS9vIHBvcnQgKi8KLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19wb3J0OwotCXVuc2lnbmVkIGxvbmcgY3BvcnQ7CQkvKiBjb250cm9sIGJhc2UgaS9vIHBvcnQgKENTNDIzNikgKi8KLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19jcG9ydDsKLQlpbnQgaXJxOwkJCS8qIElSUSBsaW5lICovCi0JaW50IGRtYTE7CQkJLyogcGxheWJhY2sgRE1BICovCi0JaW50IGRtYTI7CQkJLyogcmVjb3JkIERNQSAqLwotCXVuc2lnbmVkIHNob3J0IHZlcnNpb247CQkvKiB2ZXJzaW9uIG9mIENPREVDIGNoaXAgKi8KLQl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogc2VlIHRvIENTNDIzMV9NT0RFX1hYWFggKi8KLQl1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZTsJLyogc2VlIHRvIENTNDIzMV9IV19YWFhYICovCi0JdW5zaWduZWQgc2hvcnQgaHdzaGFyZTsJCS8qIHNoYXJlZCByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBzaG9ydCBzaW5nbGVfZG1hOjEsCS8qIGZvcmNlZCBzaW5nbGUgRE1BIG1vZGUgKEdVUyAxNi1iaXQgZGF1Z2h0ZXIgYm9hcmQpIG9yIGRtYTEgPT0gZG1hMiAqLwotCQkgICAgICAgZWJ1c19mbGFnOjE7CS8qIFNQQVJDOiBFQlVTIHByZXNlbnQgKi8KLQotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGxheWJhY2tfc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF90aW1lciAqdGltZXI7Ci0KLQl1bnNpZ25lZCBjaGFyIGltYWdlWzMyXTsJLyogcmVnaXN0ZXJzIGltYWdlICovCi0JdW5zaWduZWQgY2hhciBlaW1hZ2VbMzJdOwkvKiBleHRlbmRlZCByZWdpc3RlcnMgaW1hZ2UgKi8KLQl1bnNpZ25lZCBjaGFyIGNpbWFnZVsxNl07CS8qIGNvbnRyb2wgcmVnaXN0ZXJzIGltYWdlICovCi0JaW50IG1jZV9iaXQ7Ci0JaW50IGNhbGlicmF0ZV9tdXRlOwotCWludCBzd18zZF9iaXQ7Ci0JdW5zaWduZWQgaW50IHBfZG1hX3NpemU7Ci0JdW5zaWduZWQgaW50IGNfZG1hX3NpemU7Ci0KLQlzcGlubG9ja190IHJlZ19sb2NrOwotCXN0cnVjdCBtdXRleCBtY2VfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0KLQlpbnQgKCpyYXRlX2NvbnN0cmFpbnQpIChzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKLQl2b2lkICgqc2V0X3BsYXliYWNrX2Zvcm1hdCkgKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcywgdW5zaWduZWQgY2hhciBwZGZyKTsKLQl2b2lkICgqc2V0X2NhcHR1cmVfZm9ybWF0KSAoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zLCB1bnNpZ25lZCBjaGFyIGNkZnIpOwotCXZvaWQgKCp0cmlnZ2VyKSAoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHVuc2lnbmVkIGludCB3aGF0LCBpbnQgc3RhcnQpOwotI2lmZGVmIENPTkZJR19QTQotCXZvaWQgKCpzdXNwZW5kKSAoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApOwotCXZvaWQgKCpyZXN1bWUpIChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCk7Ci0jZW5kaWYKLQl2b2lkICpkbWFfcHJpdmF0ZV9kYXRhOwotCWludCAoKmNsYWltX2RtYSkgKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB2b2lkICpkbWFfcHJpdmF0ZV9kYXRhLCBpbnQgZG1hKTsKLQlpbnQgKCpyZWxlYXNlX2RtYSkgKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB2b2lkICpkbWFfcHJpdmF0ZV9kYXRhLCBpbnQgZG1hKTsKLX07Ci0KLS8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotCi12b2lkIHNuZF9jczQyMzFfb3V0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpOwotdW5zaWduZWQgY2hhciBzbmRfY3M0MjMxX2luKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZyk7Ci12b2lkIHNuZF9jczQyMzZfZXh0X291dChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLXVuc2lnbmVkIGNoYXIgc25kX2NzNDIzNl9leHRfaW4oc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnKTsKLXZvaWQgc25kX2NzNDIzMV9tY2VfdXAoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApOwotdm9pZCBzbmRfY3M0MjMxX21jZV9kb3duKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKTsKLQotdm9pZCBzbmRfY3M0MjMxX292ZXJyYW5nZShzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCk7Ci0KLWlycXJldHVybl90IHNuZF9jczQyMzFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLWNvbnN0IGNoYXIgKnNuZF9jczQyMzFfY2hpcF9pZChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCk7Ci0KLWludCBzbmRfY3M0MjMxX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcG9ydCwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBjcG9ydCwKLQkJICAgICAgaW50IGlycSwgaW50IGRtYTEsIGludCBkbWEyLAotCQkgICAgICB1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSwKLQkJICAgICAgdW5zaWduZWQgc2hvcnQgaHdzaGFyZSwKLQkJICAgICAgc3RydWN0IHNuZF9jczQyMzEgKiogcmNoaXApOwotaW50IHNuZF9jczQyMzFfcGNtKHN0cnVjdCBzbmRfY3M0MjMxICogY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF9wY20gKipycGNtKTsKLWludCBzbmRfY3M0MjMxX3RpbWVyKHN0cnVjdCBzbmRfY3M0MjMxICogY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF90aW1lciAqKnJ0aW1lcik7Ci1pbnQgc25kX2NzNDIzMV9taXhlcihzdHJ1Y3Qgc25kX2NzNDIzMSAqIGNoaXApOwotCi1pbnQgc25kX2NzNDIzNl9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAotCQkgICAgICB1bnNpZ25lZCBsb25nIHBvcnQsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgY3BvcnQsCi0JCSAgICAgIGludCBpcnEsIGludCBkbWExLCBpbnQgZG1hMiwKLQkJICAgICAgdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUsCi0JCSAgICAgIHVuc2lnbmVkIHNob3J0IGh3c2hhcmUsCi0JCSAgICAgIHN0cnVjdCBzbmRfY3M0MjMxICoqIHJjaGlwKTsKLWludCBzbmRfY3M0MjM2X3BjbShzdHJ1Y3Qgc25kX2NzNDIzMSAqIGNoaXAsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfcGNtICoqcnBjbSk7Ci1pbnQgc25kX2NzNDIzNl9taXhlcihzdHJ1Y3Qgc25kX2NzNDIzMSAqIGNoaXApOwotCi0vKgotICogIG1peGVyIGxpYnJhcnkKLSAqLwotCi0jZGVmaW5lIENTNDIzMV9TSU5HTEUoeG5hbWUsIHhpbmRleCwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKLSAgLmluZm8gPSBzbmRfY3M0MjMxX2luZm9fc2luZ2xlLCBcCi0gIC5nZXQgPSBzbmRfY3M0MjMxX2dldF9zaW5nbGUsIC5wdXQgPSBzbmRfY3M0MjMxX3B1dF9zaW5nbGUsIFwKLSAgLnByaXZhdGVfdmFsdWUgPSByZWcgfCAoc2hpZnQgPDwgOCkgfCAobWFzayA8PCAxNikgfCAoaW52ZXJ0IDw8IDI0KSB9Ci0KLWludCBzbmRfY3M0MjMxX2luZm9fc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKLWludCBzbmRfY3M0MjMxX2dldF9zaW5nbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfY3M0MjMxX3B1dF9zaW5nbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLQotI2RlZmluZSBDUzQyMzFfRE9VQkxFKHhuYW1lLCB4aW5kZXgsIGxlZnRfcmVnLCByaWdodF9yZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKLXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAotICAuaW5mbyA9IHNuZF9jczQyMzFfaW5mb19kb3VibGUsIFwKLSAgLmdldCA9IHNuZF9jczQyMzFfZ2V0X2RvdWJsZSwgLnB1dCA9IHNuZF9jczQyMzFfcHV0X2RvdWJsZSwgXAotICAucHJpdmF0ZV92YWx1ZSA9IGxlZnRfcmVnIHwgKHJpZ2h0X3JlZyA8PCA4KSB8IChzaGlmdF9sZWZ0IDw8IDE2KSB8IChzaGlmdF9yaWdodCA8PCAxOSkgfCAobWFzayA8PCAyNCkgfCAoaW52ZXJ0IDw8IDIyKSB9Ci0KLWludCBzbmRfY3M0MjMxX2luZm9fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKLWludCBzbmRfY3M0MjMxX2dldF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfY3M0MjMxX3B1dF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLQotI2VuZGlmIC8qIF9fU09VTkRfQ1M0MjMxX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvamFjay5oIGIvaW5jbHVkZS9zb3VuZC9qYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiMmI4YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvamFjay5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgX19TT1VORF9KQUNLX0gKKyNkZWZpbmUgX19TT1VORF9KQUNLX0gKKworLyoKKyAqICBKYWNrIGFic3RyYWN0aW9uIGxheWVyCisgKgorICogIENvcHlyaWdodCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorCitzdHJ1Y3QgaW5wdXRfZGV2OworCisvKioKKyAqIEphY2sgdHlwZXMgd2hpY2ggY2FuIGJlIHJlcG9ydGVkLiAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGFzIGEKKyAqIGJpdG1hc2suCisgKi8KK2VudW0gc25kX2phY2tfdHlwZXMgeworCVNORF9KQUNLX0hFQURQSE9ORQk9IDB4MDAwMSwKKwlTTkRfSkFDS19NSUNST1BIT05FCT0gMHgwMDAyLAorCVNORF9KQUNLX0hFQURTRVQJPSBTTkRfSkFDS19IRUFEUEhPTkUgfCBTTkRfSkFDS19NSUNST1BIT05FLAorfTsKKworc3RydWN0IHNuZF9qYWNrIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IHJlZ2lzdGVyZWQ7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqaWQ7CisJY2hhciBuYW1lWzEwMF07Cit9OworCisjaWZkZWYgQ09ORklHX1NORF9KQUNLCisKK2ludCBzbmRfamFja19uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBjb25zdCBjaGFyICppZCwgaW50IHR5cGUsCisJCSBzdHJ1Y3Qgc25kX2phY2sgKipqYWNrKTsKK3ZvaWQgc25kX2phY2tfc2V0X3BhcmVudChzdHJ1Y3Qgc25kX2phY2sgKmphY2ssIHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7CisKK3ZvaWQgc25kX2phY2tfcmVwb3J0KHN0cnVjdCBzbmRfamFjayAqamFjaywgaW50IHN0YXR1cyk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9qYWNrX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGNvbnN0IGNoYXIgKmlkLCBpbnQgdHlwZSwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2phY2sgKipqYWNrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2phY2tfc2V0X3BhcmVudChzdHJ1Y3Qgc25kX2phY2sgKmphY2ssCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9qYWNrX3JlcG9ydChzdHJ1Y3Qgc25kX2phY2sgKmphY2ssIGludCBzdGF0dXMpCit7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbWVtYWxsb2MuaCBiL2luY2x1ZGUvc291bmQvbWVtYWxsb2MuaAppbmRleCBhZTI5MjFkLi43Y2NjZTk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL21lbWFsbG9jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9tZW1hbGxvYy5oCkBAIC0zNyw3ICszNyw2IEBACiAjaWZuZGVmIHNuZF9kbWFfcGNpX2RhdGEKICNkZWZpbmUgc25kX2RtYV9wY2lfZGF0YShwY2kpCSgmKHBjaSktPmRldikKICNkZWZpbmUgc25kX2RtYV9pc2FfZGF0YSgpCU5VTEwKLSNkZWZpbmUgc25kX2RtYV9zYnVzX2RhdGEoc2J1cykJKChzdHJ1Y3QgZGV2aWNlICopKHNidXMpKQogI2RlZmluZSBzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YSh4KQkoKHN0cnVjdCBkZXZpY2UgKikodW5zaWduZWQgbG9uZykoeCkpCiAjZW5kaWYKIApAQCAtNDksNyArNDgsNiBAQAogI2RlZmluZSBTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTCTEJLyogY29udGludW91cyBuby1ETUEgbWVtb3J5ICovCiAjZGVmaW5lIFNORFJWX0RNQV9UWVBFX0RFVgkJMgkvKiBnZW5lcmljIGRldmljZSBjb250aW51b3VzICovCiAjZGVmaW5lIFNORFJWX0RNQV9UWVBFX0RFVl9TRwkJMwkvKiBnZW5lcmljIGRldmljZSBTRy1idWZmZXIgKi8KLSNkZWZpbmUgU05EUlZfRE1BX1RZUEVfU0JVUwkJNAkvKiBTQlVTIGNvbnRpbnVvdXMgKi8KIAogLyoKICAqIGluZm8gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uCkBAIC02NSw2ICs2MywxMSBAQAogLyoKICAqIFNjYXR0ZXItR2F0aGVyIGdlbmVyaWMgZGV2aWNlIHBhZ2VzCiAgKi8KK3ZvaWQgKnNuZF9tYWxsb2Nfc2didWZfcGFnZXMoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiLAorCQkJICAgICBzaXplX3QgKnJlc19zaXplKTsKK2ludCBzbmRfZnJlZV9zZ2J1Zl9wYWdlcyhzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIpOworCiBzdHJ1Y3Qgc25kX3NnX3BhZ2UgewogCXZvaWQgKmJ1ZjsKIAlkbWFfYWRkcl90IGFkZHI7CkBAIC05Miw5ICs5NSwxOCBAQAogICovCiBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3Qgc25kX3NnYnVmX2dldF9hZGRyKHN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1Ziwgc2l6ZV90IG9mZnNldCkKIHsKLQlyZXR1cm4gc2didWYtPnRhYmxlW29mZnNldCA+PiBQQUdFX1NISUZUXS5hZGRyICsgb2Zmc2V0ICUgUEFHRV9TSVpFOworCWRtYV9hZGRyX3QgYWRkciA9IHNnYnVmLT50YWJsZVtvZmZzZXQgPj4gUEFHRV9TSElGVF0uYWRkcjsKKwlhZGRyICY9IFBBR0VfTUFTSzsKKwlyZXR1cm4gYWRkciArIG9mZnNldCAlIFBBR0VfU0laRTsKIH0KIAorLyoKKyAqIHJldHVybiB0aGUgdmlydHVhbCBhZGRyZXNzIGF0IHRoZSBjb3JyZXNwb25kaW5nIG9mZnNldAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnNuZF9zZ2J1Zl9nZXRfcHRyKHN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1Ziwgc2l6ZV90IG9mZnNldCkKK3sKKwlyZXR1cm4gc2didWYtPnRhYmxlW29mZnNldCA+PiBQQUdFX1NISUZUXS5idWYgKyBvZmZzZXQgJSBQQUdFX1NJWkU7Cit9CiAKIC8qIGFsbG9jYXRlL3JlbGVhc2UgYSBidWZmZXIgKi8KIGludCBzbmRfZG1hX2FsbG9jX3BhZ2VzKGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9taW5vcnMuaCBiL2luY2x1ZGUvc291bmQvbWlub3JzLmgKaW5kZXggNDZiY2QyMC4uYTgxNzk4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9taW5vcnMuaAorKysgYi9pbmNsdWRlL3NvdW5kL21pbm9ycy5oCkBAIC0yMSw2ICsyMSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgU05EUlZfT1NfTUlOT1JTCQkJMjU2CisKICNkZWZpbmUgU05EUlZfTUlOT1JfREVWSUNFUwkJMzIKICNkZWZpbmUgU05EUlZfTUlOT1JfQ0FSRChtaW5vcikJCSgobWlub3IpID4+IDUpCiAjZGVmaW5lIFNORFJWX01JTk9SX0RFVklDRShtaW5vcikJKChtaW5vcikgJiAweDAwMWYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3BjbS5oIGIvaW5jbHVkZS9zb3VuZC9wY20uaAppbmRleCA1MWQ1OGNjLi40MGM1YTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3BjbS5oCisrKyBiL2luY2x1ZGUvc291bmQvcGNtLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgogI2luY2x1ZGUgPHNvdW5kL21lbWFsbG9jLmg+CisjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC04NCw3ICs4NSwxMSBAQAogICoKICAqLwogCi0jZGVmaW5lIFNORFJWX1BDTV9ERVZJQ0VTCQk4CisjaWYgZGVmaW5lZChDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTKQorI2RlZmluZSBTTkRSVl9QQ01fREVWSUNFUwkoU05EUlZfT1NfTUlOT1JTLTIpCisjZWxzZQorI2RlZmluZSBTTkRSVl9QQ01fREVWSUNFUwk4CisjZW5kaWYKIAogI2RlZmluZSBTTkRSVl9QQ01fSU9DVEwxX0ZBTFNFCQkoKHZvaWQgKikwKQogI2RlZmluZSBTTkRSVl9QQ01fSU9DVEwxX1RSVUUJCSgodm9pZCAqKTEpCkBAIC00MTYsNyArNDIxLDcgQEAKIHN0cnVjdCBzbmRfcGNtIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVuc2lnbmVkIGludCBkZXZpY2U7CS8qIGRldmljZSBudW1iZXIgKi8KKwlpbnQgZGV2aWNlOyAvKiBkZXZpY2UgbnVtYmVyICovCiAJdW5zaWduZWQgaW50IGluZm9fZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgZGV2X2NsYXNzOwogCXVuc2lnbmVkIHNob3J0IGRldl9zdWJjbGFzczsKQEAgLTk2OSwxMCArOTc0LDMwIEBACiBpbnQgc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzaXplX3Qgc2l6ZSk7CiBpbnQgc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CiAKLSNkZWZpbmUgc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKSAoKHN1YnN0cmVhbSktPnJ1bnRpbWUtPmRtYV9idWZmZXJfcC0+cHJpdmF0ZV9kYXRhKQotI2RlZmluZSBzbmRfcGNtX3NnYnVmX3BhZ2VzKHNpemUpIHNuZF9zZ2J1Zl9hbGlnbmVkX3BhZ2VzKHNpemUpCi0jZGVmaW5lIHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsb2ZzKSBzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsb2ZzKQotc3RydWN0IHBhZ2UgKnNuZF9wY21fc2didWZfb3BzX3BhZ2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKy8qCisgKiBTRy1idWZmZXIgaGFuZGxpbmcKKyAqLworI2RlZmluZSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pIFwKKwkoKHN1YnN0cmVhbSktPnJ1bnRpbWUtPmRtYV9idWZmZXJfcC0+cHJpdmF0ZV9kYXRhKQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK3NuZF9wY21fc2didWZfZ2V0X2FkZHIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIHVuc2lnbmVkIGludCBvZnMpCit7CisJc3RydWN0IHNuZF9zZ19idWYgKnNnID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKKwlyZXR1cm4gc25kX3NnYnVmX2dldF9hZGRyKHNnLCBvZnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorc25kX3BjbV9zZ2J1Zl9nZXRfcHRyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCB1bnNpZ25lZCBpbnQgb2ZzKQoreworCXN0cnVjdCBzbmRfc2dfYnVmICpzZyA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7CisJcmV0dXJuIHNuZF9zZ2J1Zl9nZXRfcHRyKHNnLCBvZnMpOworfQorCitzdHJ1Y3QgcGFnZSAqc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwordW5zaWduZWQgaW50IHNuZF9wY21fc2didWZfZ2V0X2NodW5rX3NpemUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSAgdW5zaWduZWQgaW50IG9mcywgdW5zaWduZWQgaW50IHNpemUpOwogCiAvKiBoYW5kbGUgbW1hcCBjb3VudGVyIC0gUENNIG1tYXAgY2FsbGJhY2sgc2hvdWxkIGhhbmRsZSB0aGlzIGNvdW50ZXIgcHJvcGVybHkgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfcGNtX21tYXBfZGF0YV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKQEAgLTEwMTAsNCArMTAzNSw2IEBACiAJCQkJCSAoSUVDOTU4X0FFUzFfQ09OX1BDTV9DT0RFUjw8OCl8XAogCQkJCQkgKElFQzk1OF9BRVMzX0NPTl9GU180ODAwMDw8MjQpKQogCisjZGVmaW5lIFBDTV9SVU5USU1FX0NIRUNLKHN1Yikgc25kX0JVR19PTighKHN1YikgfHwgIShzdWIpLT5ydW50aW1lKQorCiAjZW5kaWYgLyogX19TT1VORF9QQ01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9weGEyeHgtbGliLmggYi9pbmNsdWRlL3NvdW5kL3B4YTJ4eC1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQzZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9weGEyeHgtbGliLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBQWEEyWFhfTElCX0gKKyNkZWZpbmUgUFhBMlhYX0xJQl9ICisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisKKy8qIFBDTSAqLworCitzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHsKKwljaGFyICpuYW1lOwkJCS8qIHN0cmVhbSBpZGVudGlmaWVyICovCisJdTMyIGRjbWQ7CQkJLyogRE1BIGRlc2NyaXB0b3IgZGNtZCBmaWVsZCAqLworCXZvbGF0aWxlIHUzMiAqZHJjbXI7CQkvKiB0aGUgRE1BIHJlcXVlc3QgY2hhbm5lbCB0byB1c2UgKi8KKwl1MzIgZGV2X2FkZHI7CQkJLyogZGV2aWNlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSAqLworfTsKKworZXh0ZXJuIGludCBfX3B4YTJ4eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKK2V4dGVybiBpbnQgX19weGEyeHhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOworZXh0ZXJuIGludCBweGEyeHhfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpOworZXh0ZXJuIHNuZF9wY21fdWZyYW1lc190IHB4YTJ4eF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CitleHRlcm4gaW50IF9fcHhhMnh4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKK2V4dGVybiB2b2lkIHB4YTJ4eF9wY21fZG1hX2lycShpbnQgZG1hX2NoLCB2b2lkICpkZXZfaWQpOworZXh0ZXJuIGludCBfX3B4YTJ4eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CitleHRlcm4gaW50IF9fcHhhMnh4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CitleHRlcm4gaW50IHB4YTJ4eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitleHRlcm4gaW50IHB4YTJ4eF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKTsKK2V4dGVybiB2b2lkIHB4YTJ4eF9wY21fZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKKworLyogQUM5NyAqLworCitleHRlcm4gdW5zaWduZWQgc2hvcnQgcHhhMnh4X2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZyk7CitleHRlcm4gdm9pZCBweGEyeHhfYWM5N193cml0ZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgdmFsKTsKKworZXh0ZXJuIGJvb2wgcHhhMnh4X2FjOTdfdHJ5X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KTsKK2V4dGVybiBib29sIHB4YTJ4eF9hYzk3X3RyeV9jb2xkX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5Nyk7CitleHRlcm4gdm9pZCBweGEyeHhfYWM5N19maW5pc2hfcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KTsKKworZXh0ZXJuIGludCBweGEyeHhfYWM5N19od19zdXNwZW5kKHZvaWQpOworZXh0ZXJuIGludCBweGEyeHhfYWM5N19od19yZXN1bWUodm9pZCk7CisKK2V4dGVybiBpbnQgcHhhMnh4X2FjOTdfaHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHB4YTJ4eF9hYzk3X2h3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc2IuaCBiL2luY2x1ZGUvc291bmQvc2IuaAppbmRleCBkMGM5ZWQzLi44NWY5M2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NiLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zYi5oCkBAIC0yNDAsMTEgKzI0MCwxNSBAQAogI2RlZmluZSBTQl9EVDAxOVhfQ0FQX01BSU4JMHgwNwogCiAjZGVmaW5lIFNCX0FMUzQwMDBfTU9OT19JT19DVFJMCTB4NGIKKyNkZWZpbmUgU0JfQUxTNDAwMF9PVVRfTUlYRVJfQ1RSTF8yCTB4NGMKICNkZWZpbmUgU0JfQUxTNDAwMF9NSUNfSU5fR0FJTgkweDRkCisjZGVmaW5lIFNCX0FMUzQwMDBfQU5BTE9HX1JFRlJOQ19WT0xUX0NUUkwgMHg0ZQogI2RlZmluZSBTQl9BTFM0MDAwX0ZNREFDCTB4NGYKICNkZWZpbmUgU0JfQUxTNDAwMF8zRF9TTkRfRlgJMHg1MAogI2RlZmluZSBTQl9BTFM0MDAwXzNEX1RJTUVfREVMQVkJMHg1MQogI2RlZmluZSBTQl9BTFM0MDAwXzNEX0FVVE9fTVVURQkweDUyCisjZGVmaW5lIFNCX0FMUzQwMDBfQU5BTE9HX0JMT0NLX0NUUkwgMHg1MworI2RlZmluZSBTQl9BTFM0MDAwXzNEX0RFTEFZTElORV9QQVRURVJOIDB4NTQKICNkZWZpbmUgU0JfQUxTNDAwMF9RU09VTkQJMHhkYgogCiAvKiBJUlEgc2V0dGluZyBiaXRtYXAgKi8KQEAgLTI1Nyw2ICsyNjEsNyBAQAogI2RlZmluZSBTQl9JUlFUWVBFXzhCSVQJCTB4MDEKICNkZWZpbmUgU0JfSVJRVFlQRV8xNkJJVAkweDAyCiAjZGVmaW5lIFNCX0lSUVRZUEVfTVBVSU4JMHgwNAorI2RlZmluZSBBTFM0S19JUlFUWVBFX0NSMUVfRE1BCTB4MjAKIAogLyogRE1BIHNldHRpbmcgYml0bWFwICovCiAjZGVmaW5lIFNCX0RNQVNFVFVQX0RNQTAJMHgwMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zbmRfd2F2ZWZyb250LmggYi9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaAppbmRleCA5Njg4ZDRiLi5mYTE0OWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX19TT1VORF9TTkRfV0FWRUZST05UX0hfXwogI2RlZmluZSBfX1NPVU5EX1NORF9XQVZFRlJPTlRfSF9fCiAKLSNpbmNsdWRlICJjczQyMzEuaCIKICNpbmNsdWRlICJtcHU0MDEuaCIKICNpbmNsdWRlICJod2RlcC5oIgogI2luY2x1ZGUgInJhd21pZGkuaCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaCBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAppbmRleCBjMWIyNmZjLi5jYTY5OWEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCkBAIC0yNDAsNiArMjQwLDcgQEAKIC8qIGRhcG0gYXVkaW8gcGluIGNvbnRyb2wgYW5kIHN0YXR1cyAqLwogaW50IHNuZF9zb2NfZGFwbV9lbmFibGVfcGluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY2hhciAqcGluKTsKIGludCBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjaGFyICpwaW4pOworaW50IHNuZF9zb2NfZGFwbV9uY19waW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjaGFyICpwaW4pOwogaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNoYXIgKnBpbik7CiBpbnQgc25kX3NvY19kYXBtX3N5bmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2Mtb2Ytc2ltcGxlLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1vZi1zaW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY0ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2Mtb2Ytc2ltcGxlLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIE9GIGhlbHBlcnMgZm9yIEFMU0EgU29DCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKworI2lmbmRlZiBfSU5DTFVERV9TT0NfT0ZfSF8KKyNkZWZpbmUgX0lOQ0xVREVfU09DX09GX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX09GX1NJTVBMRSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19PRl9TSU1QTEVfTU9EVUxFKQorCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworaW50IG9mX3NuZF9zb2NfcmVnaXN0ZXJfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlICpjb2RlY19kZXYsCisJCQkgICAgICB2b2lkICpjb2RlY19kYXRhLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CisKK2ludCBvZl9zbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwKKwkJCQkgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9JTkNMVURFX1NPQ19PRl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggMTg5MGQ4Ny4uYTFlMDM1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC0yNiwxMCArMjYsMTIgQEAKIC8qCiAgKiBDb252ZW5pZW5jZSBrY29udHJvbCBidWlsZGVycwogICovCi0jZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQpICgocmVnKSB8ICgoc2hpZnQpIDw8IDgpIHxcCi0JKChzaGlmdCkgPDwgMTIpIHwgKChtYXgpIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkpCi0jZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUVfRVhUKHJlZywgbWF4LCBpbnZlcnQpICgocmVnKSB8ICgobWF4KSA8PCAxNikgfFwKLQkoKGludmVydCkgPDwgMzEpKQorI2RlZmluZSBTT0NfU0lOR0xFX1ZBTFVFKHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCkgXAorCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCXsucmVnID0geHJlZywgLnNoaWZ0ID0geHNoaWZ0LCAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorI2RlZmluZSBTT0NfU0lOR0xFX1ZBTFVFX0VYVCh4cmVnLCB4bWF4LCB4aW52ZXJ0KSBcCisJKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJey5yZWcgPSB4cmVnLCAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCAuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csXApAQCAtNDMsNjQgKzQ1LDY4IEBACiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX2dldF92b2xzdyxcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQotI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXgsIGludmVydCkgXAorI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCwgeGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAocmVnKSB8ICgoc2hpZnRfbGVmdCkgPDwgOCkgfCBcCi0JCSgoc2hpZnRfcmlnaHQpIDw8IDEyKSB8ICgobWF4KSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KLSNkZWZpbmUgU09DX0RPVUJMRV9SKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCBzaGlmdCwgbWF4LCBpbnZlcnQpIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJCXsucmVnID0geHJlZywgLnNoaWZ0ID0gc2hpZnRfbGVmdCwgLnJzaGlmdCA9IHNoaWZ0X3JpZ2h0LCBcCisJCSAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9IH0KKyNkZWZpbmUgU09DX0RPVUJMRV9SKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCiAJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKLQkucHJpdmF0ZV92YWx1ZSA9IChyZWdfbGVmdCkgfCAoKHNoaWZ0KSA8PCA4KSAgfCBcCi0JCSgobWF4KSA8PCAxMikgfCAoKGludmVydCkgPDwgMjApIHwgKChyZWdfcmlnaHQpIDw8IDI0KSB9Ci0jZGVmaW5lIFNPQ19ET1VCTEVfVExWKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXgsIGludmVydCwgdGx2X2FycmF5KSBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCQl7LnJlZyA9IHJlZ19sZWZ0LCAucnJlZyA9IHJlZ19yaWdodCwgLnNoaWZ0ID0geHNoaWZ0LCBcCisJCS5tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorI2RlZmluZSBTT0NfRE9VQkxFX1RMVih4bmFtZSwgeHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIHhtYXgsIHhpbnZlcnQsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHxcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLFwKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCAuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csIFwKIAkucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKLQkucHJpdmF0ZV92YWx1ZSA9IChyZWcpIHwgKChzaGlmdF9sZWZ0KSA8PCA4KSB8IFwKLQkJKChzaGlmdF9yaWdodCkgPDwgMTIpIHwgKChtYXgpIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkgfQotI2RlZmluZSBTT0NfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCBzaGlmdCwgbWF4LCBpbnZlcnQsIHRsdl9hcnJheSkgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKKwkJey5yZWcgPSB4cmVnLCAuc2hpZnQgPSBzaGlmdF9sZWZ0LCAucnNoaWZ0ID0gc2hpZnRfcmlnaHQsXAorCQkgLm1heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisjZGVmaW5lIFNPQ19ET1VCTEVfUl9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCwgeGludmVydCwgdGx2X2FycmF5KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKIAkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAogCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsIFwKIAkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3dfMnIsIC5wdXQgPSBzbmRfc29jX3B1dF92b2xzd18yciwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHJlZ19sZWZ0KSB8ICgoc2hpZnQpIDw8IDgpICB8IFwKLQkJKChtYXgpIDw8IDEyKSB8ICgoaW52ZXJ0KSA8PCAyMCkgfCAoKHJlZ19yaWdodCkgPDwgMjQpIH0KLSNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHJlZywgbWluLCBtYXgsIHRsdl9hcnJheSkgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKKwkJey5yZWcgPSByZWdfbGVmdCwgLnJyZWcgPSByZWdfcmlnaHQsIC5zaGlmdCA9IHhzaGlmdCwgXAorCQkubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9IH0KKyNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCiAJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwgXAogCS50bHYucCAgPSAodGx2X2FycmF5KSwgXAogCS5pbmZvICAgPSBzbmRfc29jX2luZm9fdm9sc3dfczgsIC5nZXQgPSBzbmRfc29jX2dldF92b2xzd19zOCwgXAogCS5wdXQgICAgPSBzbmRfc29jX3B1dF92b2xzd19zOCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHJlZykgfCAoKChzaWduZWQgY2hhciltYXgpIDw8IDE2KSB8IFwKLQkJCSAoKChzaWduZWQgY2hhciltaW4pIDw8IDI0KSB9Ci0jZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMpIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCisJCXsucmVnID0geHJlZywgLm1pbiA9IHhtaW4sIC5tYXggPSB4bWF4fSB9CisjZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXgsIHh0ZXh0cykgXAogewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAotCS5tYXNrID0geG1hc2ssIC50ZXh0cyA9IHh0ZXh0cyB9Ci0jZGVmaW5lIFNPQ19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpIFwKLQlTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpCi0jZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1hc2ssIHh0ZXh0cykgXAotewkubWFzayA9IHhtYXNrLCAudGV4dHMgPSB4dGV4dHMgfQorCS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMgfQorI2RlZmluZSBTT0NfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWF4LCB4dGV4dHMpIFwKKwlTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXgsIHh0ZXh0cykKKyNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4bWF4LCB4dGV4dHMpIFwKK3sJLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0cyB9CiAjZGVmaW5lIFNPQ19FTlVNKHhuYW1lLCB4ZW51bSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSxcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fZW51bV9kb3VibGUsIFwKIAkuZ2V0ID0gc25kX3NvY19nZXRfZW51bV9kb3VibGUsIC5wdXQgPSBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSwgXAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KLSNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhpbnZlcnQsXAorI2RlZmluZSBTT0NfU0lOR0xFX0VYVCh4bmFtZSwgeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAogCS5nZXQgPSB4aGFuZGxlcl9nZXQsIC5wdXQgPSB4aGFuZGxlcl9wdXQsIFwKLQkucHJpdmF0ZV92YWx1ZSA9IFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeGludmVydCkgfQotI2RlZmluZSBTT0NfU0lOR0xFX0VYVF9UTFYoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhpbnZlcnQsXAorCS5wcml2YXRlX3ZhbHVlID0gU09DX1NJTkdMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIH0KKyNkZWZpbmUgU09DX1NJTkdMRV9FWFRfVExWKHhuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQsXAogCSB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCwgdGx2X2FycmF5KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XApAQCAtMTA4LDcgKzExNCw3IEBACiAJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAogCS5nZXQgPSB4aGFuZGxlcl9nZXQsIC5wdXQgPSB4aGFuZGxlcl9wdXQsIFwKLQkucHJpdmF0ZV92YWx1ZSA9IFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeGludmVydCkgfQorCS5wcml2YXRlX3ZhbHVlID0gU09DX1NJTkdMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX1NJTkdMRV9CT09MX0VYVCh4bmFtZSwgeGRhdGEsIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fYm9vbF9leHQsIFwKQEAgLTQxMCw2ICs0MTYsOCBAQAogCXZvaWQgKmNvbnRyb2xfZGF0YTsgLyogY29kZWMgY29udHJvbCAoaTJjLzN3aXJlKSBkYXRhICovCiAJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKIAlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCWludCAoKmRpc3BsYXlfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGNoYXIgKiwKKwkJCQlzaXplX3QsIHVuc2lnbmVkIGludCk7CiAJaHdfd3JpdGVfdCBod193cml0ZTsKIAlod19yZWFkX3QgaHdfcmVhZDsKIAl2b2lkICpyZWdfY2FjaGU7CkBAIC01MTYsMTMgKzUyNCwxOSBAQAogCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2OwogfTsKIAorLyogbWl4ZXIgY29udHJvbCAqLworc3RydWN0IHNvY19taXhlcl9jb250cm9sIHsKKwlpbnQgbWluLCBtYXg7CisJdW5zaWduZWQgaW50IHJlZywgcnJlZywgc2hpZnQsIHJzaGlmdCwgaW52ZXJ0OworfTsKKwogLyogZW51bWVyYXRlZCBrY29udHJvbCAqLwogc3RydWN0IHNvY19lbnVtIHsKIAl1bnNpZ25lZCBzaG9ydCByZWc7CiAJdW5zaWduZWQgc2hvcnQgcmVnMjsKIAl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CiAJdW5zaWduZWQgY2hhciBzaGlmdF9yOwotCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGludCBtYXg7CiAJY29uc3QgY2hhciAqKnRleHRzOwogCXZvaWQgKmRhcG07CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmggYi9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaAppbmRleCBiNjJjZTNlLi5iNjg3MGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaApAQCAtNDMsNiArNDMsNyBAQAogCXVuc2lnbmVkIGludCBmcmVxX2ZpeHVwOwkvKiBjcnlzdGFsIG9uYm9hcmQgKi8KIAl1bnNpZ25lZCBpbnQgdmFsOwkJLyogaHcgdmFsdWUgKi8KIAl1bnNpZ25lZCBsb25nIGZyZXE7CQkvKiBmcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBsb25nIGluX3VzZTsJCS8qIHNldCBpZiB0aGUgZGV2aWNlIGlzIGluIHVzZSAqLwogCXN0cnVjdCBzbmRfdGVhNTc1eF9vcHMgKm9wczsKIAl2b2lkICpwcml2YXRlX2RhdGE7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmggYi9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaAppbmRleCA2Yjc4YWZmLi40YWFmZWRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaApAQCAtMSwzICsxLDMgQEAKIC8qIGluY2x1ZGUvdmVyc2lvbi5oICovCi0jZGVmaW5lIENPTkZJR19TTkRfVkVSU0lPTiAiMS4wLjE3IgorI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xOHJjMyIKICNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3Z4X2NvcmUuaCBiL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCmluZGV4IDQ4MzA2NTEuLjU0NTYzNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCisrKyBiL2luY2x1ZGUvc291bmQvdnhfY29yZS5oCkBAIC0yMzUsMzcgKzIzNSwzMSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCB2eF90ZXN0X2FuZF9hY2soc3RydWN0IHZ4X2NvcmUgKmNoaXApCiB7Ci0Jc25kX2Fzc2VydChjaGlwLT5vcHMtPnRlc3RfYW5kX2FjaywgcmV0dXJuIC1FTlhJTyk7CiAJcmV0dXJuIGNoaXAtPm9wcy0+dGVzdF9hbmRfYWNrKGNoaXApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdnhfdmFsaWRhdGVfaXJxKHN0cnVjdCB2eF9jb3JlICpjaGlwLCBpbnQgZW5hYmxlKQogewotCXNuZF9hc3NlcnQoY2hpcC0+b3BzLT52YWxpZGF0ZV9pcnEsIHJldHVybik7CiAJY2hpcC0+b3BzLT52YWxpZGF0ZV9pcnEoY2hpcCwgZW5hYmxlKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHNuZF92eF9pbmIoc3RydWN0IHZ4X2NvcmUgKmNoaXAsIGludCByZWcpCiB7Ci0Jc25kX2Fzc2VydChjaGlwLT5vcHMtPmluOCwgcmV0dXJuIDApOwogCXJldHVybiBjaGlwLT5vcHMtPmluOChjaGlwLCByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbmRfdnhfaW5sKHN0cnVjdCB2eF9jb3JlICpjaGlwLCBpbnQgcmVnKQogewotCXNuZF9hc3NlcnQoY2hpcC0+b3BzLT5pbjMyLCByZXR1cm4gMCk7CiAJcmV0dXJuIGNoaXAtPm9wcy0+aW4zMihjaGlwLCByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX3Z4X291dGIoc3RydWN0IHZ4X2NvcmUgKmNoaXAsIGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQogewotCXNuZF9hc3NlcnQoY2hpcC0+b3BzLT5vdXQ4LCByZXR1cm4pOwogCWNoaXAtPm9wcy0+b3V0OChjaGlwLCByZWcsIHZhbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfdnhfb3V0bChzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQlzbmRfYXNzZXJ0KGNoaXAtPm9wcy0+b3V0MzIsIHJldHVybik7CiAJY2hpcC0+b3BzLT5vdXQzMihjaGlwLCByZWcsIHZhbCk7CiB9CiAKQEAgLTI3Niw3ICsyNzAsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdnhfcmVzZXRfZHNwKHN0cnVjdCB2eF9jb3JlICpjaGlwKQogewotCXNuZF9hc3NlcnQoY2hpcC0+b3BzLT5yZXNldF9kc3AsIHJldHVybik7CiAJY2hpcC0+b3BzLT5yZXNldF9kc3AoY2hpcCk7CiB9CiAKQEAgLTMwNCwxNCArMjk3LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdnhfcHNldWRvX2RtYV93cml0ZShzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgICAgICAgc3RydWN0IHZ4X3BpcGUgKnBpcGUsIGludCBjb3VudCkKIHsKLQlzbmRfYXNzZXJ0KGNoaXAtPm9wcy0+ZG1hX3dyaXRlLCByZXR1cm4pOwogCWNoaXAtPm9wcy0+ZG1hX3dyaXRlKGNoaXAsIHJ1bnRpbWUsIHBpcGUsIGNvdW50KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHZ4X3BzZXVkb19kbWFfcmVhZChzdHJ1Y3QgdnhfY29yZSAqY2hpcCwgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgICAgICBzdHJ1Y3QgdnhfcGlwZSAqcGlwZSwgaW50IGNvdW50KQogewotCXNuZF9hc3NlcnQoY2hpcC0+b3BzLT5kbWFfcmVhZCwgcmV0dXJuKTsKIAljaGlwLT5vcHMtPmRtYV9yZWFkKGNoaXAsIHJ1bnRpbWUsIHBpcGUsIGNvdW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC93c3MuaCBiL2luY2x1ZGUvc291bmQvd3NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMWYyMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvd3NzLmgKQEAgLTAsMCArMSwyMzUgQEAKKyNpZm5kZWYgX19TT1VORF9XU1NfSAorI2RlZmluZSBfX1NPVU5EX1dTU19ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogIERlZmluaXRpb25zIGZvciBDUzQyMzEgJiBJbnRlcldhdmUgY2hpcHMgJiBjb21wYXRpYmxlIGNoaXBzCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJwY20uaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCisjaW5jbHVkZSAiY3M0MjMxLXJlZ3MuaCIKKworLyogZGVmaW5lcyBmb3IgY29kZWMubW9kZSAqLworCisjZGVmaW5lIFdTU19NT0RFX05PTkUJMHgwMDAwCisjZGVmaW5lIFdTU19NT0RFX1BMQVkJMHgwMDAxCisjZGVmaW5lIFdTU19NT0RFX1JFQ09SRAkweDAwMDIKKyNkZWZpbmUgV1NTX01PREVfVElNRVIJMHgwMDA0CisjZGVmaW5lIFdTU19NT0RFX09QRU4JKFdTU19NT0RFX1BMQVl8V1NTX01PREVfUkVDT1JEfFdTU19NT0RFX1RJTUVSKQorCisvKiBkZWZpbmVzIGZvciBjb2RlYy5oYXJkd2FyZSAqLworCisjZGVmaW5lIFdTU19IV19ERVRFQ1QgICAgICAgIDB4MDAwMAkvKiBsZXQgQ1M0MjMxIGRyaXZlciBkZXRlY3QgY2hpcCAqLworI2RlZmluZSBXU1NfSFdfREVURUNUMwkweDAwMDEJLyogYWxsb3cgbW9kZSAzICovCisjZGVmaW5lIFdTU19IV19UWVBFX01BU0sJMHhmZjAwCS8qIHR5cGUgbWFzayAqLworI2RlZmluZSBXU1NfSFdfQ1M0MjMxX01BU0sgICAweDAxMDAJLyogQ1M0MjMxIHNlcmllICovCisjZGVmaW5lIFdTU19IV19DUzQyMzEgICAgICAgIDB4MDEwMAkvKiBDUzQyMzEgY2hpcCAqLworI2RlZmluZSBXU1NfSFdfQ1M0MjMxQSAgICAgICAweDAxMDEJLyogQ1M0MjMxQSBjaGlwICovCisjZGVmaW5lIFdTU19IV19BRDE4NDUJMHgwMTAyCS8qIEFEMTg0NSBjaGlwICovCisjZGVmaW5lIFdTU19IV19DUzQyMzJfTUFTSyAgIDB4MDIwMAkvKiBDUzQyMzIgc2VyaWUgKGhhcyBjb250cm9sIHBvcnRzKSAqLworI2RlZmluZSBXU1NfSFdfQ1M0MjMyICAgICAgICAweDAyMDAJLyogQ1M0MjMyICovCisjZGVmaW5lIFdTU19IV19DUzQyMzJBICAgICAgIDB4MDIwMQkvKiBDUzQyMzJBICovCisjZGVmaW5lIFdTU19IV19DUzQyMzYJMHgwMjAyCS8qIENTNDIzNiAqLworI2RlZmluZSBXU1NfSFdfQ1M0MjM2Ql9NQVNLCTB4MDQwMAkvKiBDUzQyMzZCIHNlcmllIChoYXMgZXh0ZW5kZWQgY29udHJvbCByZWdzKSAqLworI2RlZmluZSBXU1NfSFdfQ1M0MjM1CTB4MDQwMAkvKiBDUzQyMzUgLSBDcnlzdGFsIENsZWFyICh0bSkgc3RlcmVvIGVuaGFuY2VtZW50ICovCisjZGVmaW5lIFdTU19IV19DUzQyMzZCICAgICAgIDB4MDQwMQkvKiBDUzQyMzZCICovCisjZGVmaW5lIFdTU19IV19DUzQyMzdCICAgICAgIDB4MDQwMgkvKiBDUzQyMzdCIC0gU1JTIDNEICovCisjZGVmaW5lIFdTU19IV19DUzQyMzhCCTB4MDQwMwkvKiBDUzQyMzhCIC0gUVNPVU5EIDNEICovCisjZGVmaW5lIFdTU19IV19DUzQyMzkJMHgwNDA0CS8qIENTNDIzOSAtIENyeXN0YWwgQ2xlYXIgKHRtKSBzdGVyZW8gZW5oYW5jZW1lbnQgKi8KKyNkZWZpbmUgV1NTX0hXX0FEMTg0OF9NQVNLCTB4MDgwMAkvKiBBRDE4NDggc2VyaWUgKGhhbGYgZHVwbGV4KSAqLworI2RlZmluZSBXU1NfSFdfQUQxODQ3CQkweDA4MDEJLyogQUQxODQ3IGNoaXAgKi8KKyNkZWZpbmUgV1NTX0hXX0FEMTg0OAkJMHgwODAyCS8qIEFEMTg0OCBjaGlwICovCisjZGVmaW5lIFdTU19IV19DUzQyNDgJCTB4MDgwMwkvKiBDUzQyNDggY2hpcCAqLworI2RlZmluZSBXU1NfSFdfQ01JODMzMAkJMHgwODA0CS8qIENNSTgzMzAgY2hpcCAqLworI2RlZmluZSBXU1NfSFdfVEhJTktQQUQJCTB4MDgwNQkvKiBUaGlua3BhZCAzNjAvNzUwLzc1NSAqLworLyogY29tcGF0aWJsZSwgYnV0IGNsb25lcyAqLworI2RlZmluZSBXU1NfSFdfSU5URVJXQVZFICAgICAweDEwMDAJLyogSW50ZXJXYXZlIGNoaXAgKi8KKyNkZWZpbmUgV1NTX0hXX09QTDNTQTIgICAgICAgMHgxMTAxCS8qIE9QTDMtU0EyIGNoaXAsIHNpbWlsYXIgdG8gY3M0MjMxICovCisjZGVmaW5lIFdTU19IV19PUFRJOTNYIAkweDExMDIJLyogT3B0aSA5MzAvOTMxLzkzMyAqLworCisvKiBkZWZpbmVzIGZvciBjb2RlYy5od3NoYXJlICovCisjZGVmaW5lIFdTU19IV1NIQVJFX0lSUQkoMTw8MCkKKyNkZWZpbmUgV1NTX0hXU0hBUkVfRE1BMQkoMTw8MSkKKyNkZWZpbmUgV1NTX0hXU0hBUkVfRE1BMgkoMTw8MikKKworLyogSUJNIFRoaW5rcGFkIHNwZWNpZmljIHN0dWZmICovCisjZGVmaW5lIEFEMTg0OF9USElOS1BBRF9DVExfUE9SVDEJCTB4MTVlOAorI2RlZmluZSBBRDE4NDhfVEhJTktQQURfQ1RMX1BPUlQyCQkweDE1ZTkKKyNkZWZpbmUgQUQxODQ4X1RISU5LUEFEX0NTNDI0OF9FTkFCTEVfQklUCTB4MDIKKworc3RydWN0IHNuZF93c3MgeworCXVuc2lnbmVkIGxvbmcgcG9ydDsJCS8qIGJhc2UgaS9vIHBvcnQgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19wb3J0OworCXVuc2lnbmVkIGxvbmcgY3BvcnQ7CQkvKiBjb250cm9sIGJhc2UgaS9vIHBvcnQgKENTNDIzNikgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19jcG9ydDsKKwlpbnQgaXJxOwkJCS8qIElSUSBsaW5lICovCisJaW50IGRtYTE7CQkJLyogcGxheWJhY2sgRE1BICovCisJaW50IGRtYTI7CQkJLyogcmVjb3JkIERNQSAqLworCXVuc2lnbmVkIHNob3J0IHZlcnNpb247CQkvKiB2ZXJzaW9uIG9mIENPREVDIGNoaXAgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogc2VlIHRvIFdTU19NT0RFX1hYWFggKi8KKwl1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZTsJLyogc2VlIHRvIFdTU19IV19YWFhYICovCisJdW5zaWduZWQgc2hvcnQgaHdzaGFyZTsJCS8qIHNoYXJlZCByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzaW5nbGVfZG1hOjEsCS8qIGZvcmNlZCBzaW5nbGUgRE1BIG1vZGUgKEdVUyAxNi1iaXQgKi8KKwkJCQkJLyogZGF1Z2h0ZXIgYm9hcmQpIG9yIGRtYTEgPT0gZG1hMiAqLworCQkgICAgICAgZWJ1c19mbGFnOjEsCS8qIFNQQVJDOiBFQlVTIHByZXNlbnQgKi8KKwkJICAgICAgIHRoaW5rcGFkX2ZsYWc6MTsJLyogVGhpbmtwYWQgQ1M0MjQ4IG5lZWRzIGV4dHJhIGhlbHAgKi8KKworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGxheWJhY2tfc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9zdWJzdHJlYW07CisJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CisKKwl1bnNpZ25lZCBjaGFyIGltYWdlWzMyXTsJLyogcmVnaXN0ZXJzIGltYWdlICovCisJdW5zaWduZWQgY2hhciBlaW1hZ2VbMzJdOwkvKiBleHRlbmRlZCByZWdpc3RlcnMgaW1hZ2UgKi8KKwl1bnNpZ25lZCBjaGFyIGNpbWFnZVsxNl07CS8qIGNvbnRyb2wgcmVnaXN0ZXJzIGltYWdlICovCisJaW50IG1jZV9iaXQ7CisJaW50IGNhbGlicmF0ZV9tdXRlOworCWludCBzd18zZF9iaXQ7CisJdW5zaWduZWQgaW50IHBfZG1hX3NpemU7CisJdW5zaWduZWQgaW50IGNfZG1hX3NpemU7CisKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXN0cnVjdCBtdXRleCBtY2VfbXV0ZXg7CisJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7CisKKwlpbnQgKCpyYXRlX2NvbnN0cmFpbnQpIChzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKKwl2b2lkICgqc2V0X3BsYXliYWNrX2Zvcm1hdCkgKHN0cnVjdCBzbmRfd3NzICpjaGlwLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIHBkZnIpOworCXZvaWQgKCpzZXRfY2FwdHVyZV9mb3JtYXQpIChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwKKwkJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgY2Rmcik7CisJdm9pZCAoKnRyaWdnZXIpIChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgaW50IHdoYXQsIGludCBzdGFydCk7CisjaWZkZWYgQ09ORklHX1BNCisJdm9pZCAoKnN1c3BlbmQpIChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCk7CisJdm9pZCAoKnJlc3VtZSkgKHN0cnVjdCBzbmRfd3NzICpjaGlwKTsKKyNlbmRpZgorCXZvaWQgKmRtYV9wcml2YXRlX2RhdGE7CisJaW50ICgqY2xhaW1fZG1hKSAoc3RydWN0IHNuZF93c3MgKmNoaXAsCisJCQkgIHZvaWQgKmRtYV9wcml2YXRlX2RhdGEsIGludCBkbWEpOworCWludCAoKnJlbGVhc2VfZG1hKSAoc3RydWN0IHNuZF93c3MgKmNoaXAsCisJCQkgICAgdm9pZCAqZG1hX3ByaXZhdGVfZGF0YSwgaW50IGRtYSk7Cit9OworCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKwordm9pZCBzbmRfd3NzX291dChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3Vuc2lnbmVkIGNoYXIgc25kX3dzc19pbihzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcpOwordm9pZCBzbmRfY3M0MjM2X2V4dF9vdXQoc3RydWN0IHNuZF93c3MgKmNoaXAsCisJCQl1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpOwordW5zaWduZWQgY2hhciBzbmRfY3M0MjM2X2V4dF9pbihzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcpOwordm9pZCBzbmRfd3NzX21jZV91cChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCk7Cit2b2lkIHNuZF93c3NfbWNlX2Rvd24oc3RydWN0IHNuZF93c3MgKmNoaXApOworCit2b2lkIHNuZF93c3Nfb3ZlcnJhbmdlKHN0cnVjdCBzbmRfd3NzICpjaGlwKTsKKworaXJxcmV0dXJuX3Qgc25kX3dzc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworY29uc3QgY2hhciAqc25kX3dzc19jaGlwX2lkKHN0cnVjdCBzbmRfd3NzICpjaGlwKTsKKworaW50IHNuZF93c3NfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwb3J0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNwb3J0LAorCQkgICAgICBpbnQgaXJxLCBpbnQgZG1hMSwgaW50IGRtYTIsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBod3NoYXJlLAorCQkgICAgICBzdHJ1Y3Qgc25kX3dzcyAqKnJjaGlwKTsKK2ludCBzbmRfd3NzX3BjbShzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF9wY20gKipycGNtKTsKK2ludCBzbmRfd3NzX3RpbWVyKHN0cnVjdCBzbmRfd3NzICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3RpbWVyICoqcnRpbWVyKTsKK2ludCBzbmRfd3NzX21peGVyKHN0cnVjdCBzbmRfd3NzICpjaGlwKTsKKworY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzICpzbmRfd3NzX2dldF9wY21fb3BzKGludCBkaXJlY3Rpb24pOworCitpbnQgc25kX2NzNDIzNl9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHBvcnQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY3BvcnQsCisJCSAgICAgIGludCBpcnEsIGludCBkbWExLCBpbnQgZG1hMiwKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGh3c2hhcmUsCisJCSAgICAgIHN0cnVjdCBzbmRfd3NzICoqcmNoaXApOworaW50IHNuZF9jczQyMzZfcGNtKHN0cnVjdCBzbmRfd3NzICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKnJwY20pOworaW50IHNuZF9jczQyMzZfbWl4ZXIoc3RydWN0IHNuZF93c3MgKmNoaXApOworCisvKgorICogIG1peGVyIGxpYnJhcnkKKyAqLworCisjZGVmaW5lIFdTU19TSU5HTEUoeG5hbWUsIHhpbmRleCwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5pbmZvID0gc25kX3dzc19pbmZvX3NpbmdsZSwgXAorICAuZ2V0ID0gc25kX3dzc19nZXRfc2luZ2xlLCBcCisgIC5wdXQgPSBzbmRfd3NzX3B1dF9zaW5nbGUsIFwKKyAgLnByaXZhdGVfdmFsdWUgPSByZWcgfCAoc2hpZnQgPDwgOCkgfCAobWFzayA8PCAxNikgfCAoaW52ZXJ0IDw8IDI0KSB9CisKK2ludCBzbmRfd3NzX2luZm9fc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitpbnQgc25kX3dzc19nZXRfc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF93c3NfcHV0X3NpbmdsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKKworI2RlZmluZSBXU1NfRE9VQkxFKHhuYW1lLCB4aW5kZXgsIGxlZnRfcmVnLCByaWdodF9yZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfd3NzX2luZm9fZG91YmxlLCBcCisgIC5nZXQgPSBzbmRfd3NzX2dldF9kb3VibGUsIFwKKyAgLnB1dCA9IHNuZF93c3NfcHV0X2RvdWJsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9IGxlZnRfcmVnIHwgKHJpZ2h0X3JlZyA8PCA4KSB8IChzaGlmdF9sZWZ0IDw8IDE2KSB8IFwKKwkJICAgKHNoaWZ0X3JpZ2h0IDw8IDE5KSB8IChtYXNrIDw8IDI0KSB8IChpbnZlcnQgPDwgMjIpIH0KKworI2RlZmluZSBXU1NfU0lOR0xFX1RMVih4bmFtZSwgeGluZGV4LCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQsIHh0bHYpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfd3NzX2luZm9fc2luZ2xlLCBcCisgIC5nZXQgPSBzbmRfd3NzX2dldF9zaW5nbGUsIFwKKyAgLnB1dCA9IHNuZF93c3NfcHV0X3NpbmdsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9IHJlZyB8IChzaGlmdCA8PCA4KSB8IChtYXNrIDw8IDE2KSB8IChpbnZlcnQgPDwgMjQpLCBcCisgIC50bHYgPSB7IC5wID0gKHh0bHYpIH0gfQorCisjZGVmaW5lIFdTU19ET1VCTEVfVExWKHhuYW1lLCB4aW5kZXgsIGxlZnRfcmVnLCByaWdodF9yZWcsIFwKKwkJCXNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQsIHh0bHYpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKKyAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfd3NzX2luZm9fZG91YmxlLCBcCisgIC5nZXQgPSBzbmRfd3NzX2dldF9kb3VibGUsIFwKKyAgLnB1dCA9IHNuZF93c3NfcHV0X2RvdWJsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9IGxlZnRfcmVnIHwgKHJpZ2h0X3JlZyA8PCA4KSB8IChzaGlmdF9sZWZ0IDw8IDE2KSB8IFwKKwkJICAgKHNoaWZ0X3JpZ2h0IDw8IDE5KSB8IChtYXNrIDw8IDI0KSB8IChpbnZlcnQgPDwgMjIpLCBcCisgIC50bHYgPSB7IC5wID0gKHh0bHYpIH0gfQorCisKK2ludCBzbmRfd3NzX2luZm9fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitpbnQgc25kX3dzc19nZXRfZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF93c3NfcHV0X2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKKworI2VuZGlmIC8qIF9fU09VTkRfV1NTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vYXRtZWxfbGNkYy5oIGIvaW5jbHVkZS92aWRlby9hdG1lbF9sY2RjLmgKaW5kZXggOTIwYzRlOS4uNmFkODdmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9hdG1lbF9sY2RjLmgKKysrIGIvaW5jbHVkZS92aWRlby9hdG1lbF9sY2RjLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAqLwogI2RlZmluZSBBVE1FTF9MQ0RDX1dJUklOR19CR1IJMAogI2RlZmluZSBBVE1FTF9MQ0RDX1dJUklOR19SR0IJMQorI2RlZmluZSBBVE1FTF9MQ0RDX1dJUklOR19SR0I1NTUJMgogCiAKICAvKiBMQ0QgQ29udHJvbGxlciBpbmZvIGRhdGEgc3RydWN0dXJlLCBzdG9yZWQgaW4gZGV2aWNlIHBsYXRmb3JtX2RhdGEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vY3libGFmYi5oIGIvaW5jbHVkZS92aWRlby9jeWJsYWZiLmgKaW5kZXggNzE3NDQwNS4uZDNjMWQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9jeWJsYWZiLmgKKysrIGIvaW5jbHVkZS92aWRlby9jeWJsYWZiLmgKQEAgLTQsNyArNCw3IEBACiAjZW5kaWYKIAogI2lmIENZQkxBRkJfREVCVUcKLSNkZWZpbmUgZGVidWcoZixhLi4uKQlwcmludGsoIiVzOiIgZiwgIF9fRlVOQ1RJT05fXyAsICMjIGEpOworI2RlZmluZSBkZWJ1ZyhmLGEuLi4pCXByaW50aygiJXM6IiBmLCAgX19mdW5jX18gLCAjIyBhKTsKICNlbHNlCiAjZGVmaW5lIGRlYnVnKGYsYS4uLikKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9tZXRyb25vbWVmYi5oIGIvaW5jbHVkZS92aWRlby9tZXRyb25vbWVmYi5oCmluZGV4IGRhYjA0YjQuLjk4NjNmNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vbWV0cm9ub21lZmIuaAorKysgYi9pbmNsdWRlL3ZpZGVvL21ldHJvbm9tZWZiLmgKQEAgLTEyLDE0ICsxMiw2IEBACiAjaWZuZGVmIF9MSU5VWF9NRVRST05PTUVGQl9IXwogI2RlZmluZSBfTElOVVhfTUVUUk9OT01FRkJfSF8KIAotLyogYWRkcmVzcyBhbmQgY29udHJvbCBkZXNjcmlwdG9ycyB1c2VkIGJ5IG1ldHJvbm9tZSBjb250cm9sbGVyICovCi1zdHJ1Y3QgbWV0cm9tZW1fZGVzYyB7Ci0JdTMyIG1GREFEUjA7Ci0JdTMyIG1GU0FEUjA7Ci0JdTMyIG1GSURSMDsKLQl1MzIgbUxEQ01EMDsKLX07Ci0KIC8qIGNvbW1hbmQgc3RydWN0dXJlIHVzZWQgYnkgbWV0cm9ub21lIGNvbnRyb2xsZXIgKi8KIHN0cnVjdCBtZXRyb21lbV9jbWQgewogCXUxNiBvcGNvZGU7CkBAIC0yOSwzNCArMjEsMzcgQEAKIAogLyogc3RydWN0IHVzZWQgYnkgbWV0cm9ub21lLiBib2FyZCBzcGVjaWZpYyBzdHVmZiBjb21lcyBmcm9tICpib2FyZCAqLwogc3RydWN0IG1ldHJvbm9tZWZiX3BhciB7Ci0JdW5zaWduZWQgY2hhciAqbWV0cm9tZW07Ci0Jc3RydWN0IG1ldHJvbWVtX2Rlc2MgKm1ldHJvbWVtX2Rlc2M7CiAJc3RydWN0IG1ldHJvbWVtX2NtZCAqbWV0cm9tZW1fY21kOwogCXVuc2lnbmVkIGNoYXIgKm1ldHJvbWVtX3dmbTsKIAl1bnNpZ25lZCBjaGFyICptZXRyb21lbV9pbWc7CiAJdTE2ICptZXRyb21lbV9pbWdfY3N1bTsKIAl1MTYgKmNzdW1fdGFibGU7Ci0JaW50IG1ldHJvbWVtc2l6ZTsKIAlkbWFfYWRkcl90IG1ldHJvbWVtX2RtYTsKLQlkbWFfYWRkcl90IG1ldHJvbWVtX2Rlc2NfZG1hOwogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCXN0cnVjdCBtZXRyb25vbWVfYm9hcmQgKmJvYXJkOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwogCXU4IGZyYW1lX2NvdW50OworCWludCBleHRyYV9zaXplOworCWludCBkdDsKIH07CiAKLS8qIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzICovCisvKiBib2FyZCBzcGVjaWZpYyByb3V0aW5lcyBhbmQgZGF0YSAqLwogc3RydWN0IG1ldHJvbm9tZV9ib2FyZCB7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0Jdm9pZCAoKmZyZWVfaXJxKShzdHJ1Y3QgZmJfaW5mbyAqKTsKLQl2b2lkICgqaW5pdF9ncGlvX3JlZ3MpKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKik7Ci0Jdm9pZCAoKmluaXRfbGNkY19yZWdzKShzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICopOwotCXZvaWQgKCpwb3N0X2RtYV9zZXR1cCkoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqKTsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsgLyogdGhlIHBsYXRmb3JtIGRldmljZSAqLwogCXZvaWQgKCpzZXRfcnN0KShzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICosIGludCk7CiAJdm9pZCAoKnNldF9zdGRieSkoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqLCBpbnQpOworCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICopOwogCWludCAoKm1ldF93YWl0X2V2ZW50KShzdHJ1Y3QgbWV0cm9ub21lZmJfcGFyICopOwogCWludCAoKm1ldF93YWl0X2V2ZW50X2ludHIpKHN0cnVjdCBtZXRyb25vbWVmYl9wYXIgKik7CiAJaW50ICgqc2V0dXBfaXJxKShzdHJ1Y3QgZmJfaW5mbyAqKTsKKwlpbnQgKCpzZXR1cF9mYikoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqKTsKKwlpbnQgKCpzZXR1cF9pbykoc3RydWN0IG1ldHJvbm9tZWZiX3BhciAqKTsKKwlpbnQgKCpnZXRfcGFuZWxfdHlwZSkodm9pZCk7CisJdW5zaWduZWQgY2hhciAqbWV0cm9tZW07CisJaW50IGZ3OworCWludCBmaDsKKwlpbnQgd2ZtX3NpemU7CisJc3RydWN0IGZiX2luZm8gKmhvc3RfZmJpbmZvOyAvKiB0aGUgaG9zdCBMQ0QgY29udHJvbGxlcidzIGZiaSAqLwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL25lb21hZ2ljLmggYi9pbmNsdWRlL3ZpZGVvL25lb21hZ2ljLmgKaW5kZXggMzg5MTBkYS4uMDhiNjYzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9uZW9tYWdpYy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vbmVvbWFnaWMuaApAQCAtMTIzLDcgKzEyMyw2IEBACiAKIHN0cnVjdCBuZW9mYl9wYXIgewogCXN0cnVjdCB2Z2FzdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgbXV0ZXggb3Blbl9sb2NrOwogCXVuc2lnbmVkIGludCByZWZfY291bnQ7CiAKIAl1bnNpZ25lZCBjaGFyIE1pc2NPdXRSZWc7CS8qIE1pc2MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vcmFkZW9uLmggYi9pbmNsdWRlL3ZpZGVvL3JhZGVvbi5oCmluZGV4IDA5OWZmYTUuLmQ1ZGNhZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vcmFkZW9uLmgKKysrIGIvaW5jbHVkZS92aWRlby9yYWRlb24uaApAQCAtMzg2LDcgKzM4Niw3IEBACiAjZGVmaW5lIFNDX0JPVFRPTV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTZGMCAgCiAjZGVmaW5lIFNSQ19TQ19CT1RUT01fUklHSFQgICAgICAgICAgICAgICAgICAgIDB4MTZGNCAgCiAjZGVmaW5lIFJCMkRfRFNUQ0FDSEVfTU9ERQkJICAgICAgIDB4MzQyOAotI2RlZmluZSBSQjJEX0RTVENBQ0hFX0NUTFNUQVQJCSAgICAgICAweDM0MkMKKyNkZWZpbmUgUkIyRF9EU1RDQUNIRV9DVExTVEFUX2Jyb2tlbgkgICAgICAgMHgzNDJDIC8qIGRvIG5vdCB1c2UgKi8KICNkZWZpbmUgTFZEU19HRU5fQ05UTAkJCSAgICAgICAweDAyZDAKICNkZWZpbmUgTFZEU19QTExfQ05UTAkJCSAgICAgICAweDAyZDQKICNkZWZpbmUgRlAyX0dFTl9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjg4CkBAIC01MjUsNiArNTI1LDkgQEAKICNkZWZpbmUgQ1JUQ19ESVNQTEFZX0RJUwkJCSAgICgxIDw8IDEwKQogI2RlZmluZSBDUlRDX0NSVF9PTgkJCQkgICAoMSA8PCAxNSkKIAorLyogRFNUQ0FDSEVfTU9ERSBiaXRzIGNvbnN0YW50cyAqLworI2RlZmluZSBSQjJEX0RDX0FVVE9GTFVTSF9FTkFCTEUgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgUkIyRF9EQ19EQ19ESVNBQkxFX0lHTk9SRV9QRSAgICAgICAgICAgICAgICgxIDw8IDE3KQogCiAvKiBEU1RDQUNIRV9DVExTVEFUIGJpdCBjb25zdGFudHMgKi8KICNkZWZpbmUgUkIyRF9EQ19GTFVTSF8yRAkJCSAgICgxIDw8IDApCkBAIC01MzIsNiArNTM1LDkgQEAKICNkZWZpbmUgUkIyRF9EQ19GTFVTSF9BTEwJCQkgICAoUkIyRF9EQ19GTFVTSF8yRCB8IFJCMkRfRENfRlJFRV8yRCkKICNkZWZpbmUgUkIyRF9EQ19CVVNZCQkJCSAgICgxIDw8IDMxKQogCisvKiBEU1RDQUNIRV9NT0RFIGJpdHMgY29uc3RhbnRzICovCisjZGVmaW5lIFJCMkRfRENfQVVUT0ZMVVNIX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBSQjJEX0RDX0RDX0RJU0FCTEVfSUdOT1JFX1BFICAgICAgICAgICAgICAgKDEgPDwgMTcpCiAKIC8qIENSVENfR0VOX0NOVEwgYml0IGNvbnN0YW50cyAqLwogI2RlZmluZSBDUlRDX0RCTF9TQ0FOX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQpAQCAtODYzLDE1ICs4NjksMTAgQEAKICNkZWZpbmUgR01DX0RTVF8xNkJQUF9ZVllVNDIyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBjMDAKICNkZWZpbmUgR01DX0RTVF8zMkJQUF9BWVVWNDQ0ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBlMDAKICNkZWZpbmUgR01DX0RTVF8xNkJQUF9BUkdCNDQ0NCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBmMDAKLSNkZWZpbmUgR01DX1NSQ19NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgR01DX1NSQ19NT05PX0xCS0dEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgR01DX1NSQ19EU1RDT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDAKICNkZWZpbmUgR01DX0JZVEVfT1JERVJfTVNCX1RPX0xTQiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKICNkZWZpbmUgR01DX0JZVEVfT1JERVJfTFNCX1RPX01TQiAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKICNkZWZpbmUgR01DX0RQX0NPTlZFUlNJT05fVEVNUF85MzAwICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKICNkZWZpbmUgR01DX0RQX0NPTlZFUlNJT05fVEVNUF82NTAwICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgR01DX0RQX1NSQ19SRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgR01DX0RQX1NSQ19IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwMDAKICNkZWZpbmUgR01DX0RQX1NSQ19IT1NUX0JZVEVBTElHTiAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKICNkZWZpbmUgR01DXzNEX0ZDTl9FTl9DTFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKICNkZWZpbmUgR01DXzNEX0ZDTl9FTl9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKQEAgLTg4Miw2ICs4ODMsOSBAQAogI2RlZmluZSBHTUNfV1JJVEVfTUFTS19MRUFWRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBHTUNfV1JJVEVfTUFTS19TRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAogI2RlZmluZSBHTUNfQ0xSX0NNUF9DTlRMX0RJUyAgICAgIAkJICAgKDEgPDwgMjgpCisjZGVmaW5lIEdNQ19TUkNfREFUQVRZUEVfTUFTSwkJCSAgICgzIDw8IDEyKQorI2RlZmluZSBHTUNfU1JDX0RBVEFUWVBFX01PTk9fRkdfQkcJCSAgICgwIDw8IDEyKQorI2RlZmluZSBHTUNfU1JDX0RBVEFUWVBFX01PTk9fRkdfTEEJCSAgICgxIDw8IDEyKQogI2RlZmluZSBHTUNfU1JDX0RBVEFUWVBFX0NPTE9SCQkJICAgKDMgPDwgMTIpCiAjZGVmaW5lIFJPUDNfUyAgICAgICAgICAgICAgICAJCQkgICAweDAwY2MwMDAwCiAjZGVmaW5lIFJPUDNfU1JDQ09QWQkJCQkgICAweDAwY2MwMDAwCkBAIC04OTAsNiArODk0LDcgQEAKICNkZWZpbmUgRFBfU1JDX1NPVVJDRV9NQVNLICAgICAgICAJCSAgICg3ICAgIDw8IDI0KQogI2RlZmluZSBHTUNfQlJVU0hfTk9ORSAgICAgICAgICAgIAkJICAgKDE1ICAgPDwgIDQpCiAjZGVmaW5lIERQX1NSQ19TT1VSQ0VfTUVNT1JZCQkJICAgKDIgICAgPDwgMjQpCisjZGVmaW5lIERQX1NSQ19TT1VSQ0VfSE9TVF9EQVRBCQkJICAgKDMgICAgPDwgMjQpCiAjZGVmaW5lIEdNQ19CUlVTSF9TT0xJRENPTE9SCQkJICAgMHgwMDAwMDBkMAogCiAvKiBEUF9NSVggYml0IGNvbnN0YW50cyAqLwpAQCAtOTc1LDYgKzk4MCwxMiBAQAogI2RlZmluZSBESVNQX1BXUl9NQU5fVFZfRU5BQkxFX1JTVCAgICAgICAgICAgICAgICAgKDEgPDwgMjUpCiAjZGVmaW5lIERJU1BfUFdSX01BTl9BVVRPX1BXUlVQX0VOICAgICAgICAgICAgICAgICAoMSA8PCAyNikKIAorLyogUkJCTV9HVUlDTlRMIGNvbnN0YW50cyAqLworI2RlZmluZSBSQkJNX0dVSUNOVExfSE9TVF9EQVRBX1NXQVBfTk9ORQkgICAoMCA8PCAwKQorI2RlZmluZSBSQkJNX0dVSUNOVExfSE9TVF9EQVRBX1NXQVBfMTZCSVQgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUkJCTV9HVUlDTlRMX0hPU1RfREFUQV9TV0FQXzMyQklUCSAgICgyIDw8IDApCisjZGVmaW5lIFJCQk1fR1VJQ05UTF9IT1NUX0RBVEFfU1dBUF9IRFcJCSAgICgzIDw8IDApCisKIC8qIG1hc2tzICovCiAKICNkZWZpbmUgQ09ORklHX01FTVNJWkVfTUFTSwkJMHgxZjAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9zMWQxM3h4eGZiLmggYi9pbmNsdWRlL3ZpZGVvL3MxZDEzeHh4ZmIuaAppbmRleCBjOTlkMjYxLi5mZTQxYjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3MxZDEzeHh4ZmIuaAorKysgYi9pbmNsdWRlL3ZpZGVvL3MxZDEzeHh4ZmIuaApAQCAtMTQsNyArMTQsOCBAQAogI2RlZmluZQlTMUQxM1hYWEZCX0gKIAogI2RlZmluZSBTMURfUEFMRVRURV9TSVpFCQkyNTYKLSNkZWZpbmUgUzFEX0NISVBfUkVWCQkJNwkvKiBleHBlY3RlZCBjaGlwIHJldmlzaW9uIG51bWJlciBmb3IgczFkMTM4MDYgKi8KKyNkZWZpbmUgUzFEMTM1MDZfQ0hJUF9SRVYJCTQJLyogZXhwZWN0ZWQgY2hpcCByZXZpc2lvbiBudW1iZXIgZm9yIHMxZDEzNTA2ICovCisjZGVmaW5lIFMxRDEzODA2X0NISVBfUkVWCQk3CS8qIGV4cGVjdGVkIGNoaXAgcmV2aXNpb24gbnVtYmVyIGZvciBzMWQxMzgwNiAqLwogI2RlZmluZSBTMURfRkJJRAkJCSJTMUQxMzgwNiIKICNkZWZpbmUgUzFEX0RFVklDRU5BTUUJCQkiczFkMTM4MDZmYiIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vYmFsbG9vbi5oIGIvaW5jbHVkZS94ZW4vYmFsbG9vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQzYjBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUveGVuL2JhbGxvb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGJhbGxvb24uaAotICoKLSAqIFhlbiBiYWxsb29uIGRyaXZlciAtIGVuYWJsZXMgcmV0dXJuaW5nL2NsYWltaW5nIG1lbW9yeSB0by9mcm9tIFhlbi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIEIgRHJhZ292aWMKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBNIFdpbGxpYW1zb24sIEsgRnJhc2VyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKLSAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCi0gKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6Ci0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0Ci0gKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAotICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCi0gKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKLSAqIElOIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9fWEVOX0JBTExPT05fSF9fCi0jZGVmaW5lIF9fWEVOX0JBTExPT05fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0jaWYgMAotLyoKLSAqIEluZm9ybSB0aGUgYmFsbG9vbiBkcml2ZXIgdGhhdCBpdCBzaG91bGQgYWxsb3cgc29tZSBzbG9wIGZvciBkZXZpY2UtZHJpdmVyCi0gKiBtZW1vcnkgYWN0aXZpdGllcy4KLSAqLwotdm9pZCBiYWxsb29uX3VwZGF0ZV9kcml2ZXJfYWxsb3dhbmNlKGxvbmcgZGVsdGEpOwotCi0vKiBBbGxvY2F0ZS9mcmVlIGEgc2V0IG9mIGVtcHR5IHBhZ2VzIGluIGxvdyBtZW1vcnkgKGkuZS4sIG5vIFJBTSBtYXBwZWQpLiAqLwotc3RydWN0IHBhZ2UgKiphbGxvY19lbXB0eV9wYWdlc19hbmRfcGFnZXZlYyhpbnQgbnJfcGFnZXMpOwotdm9pZCBmcmVlX2VtcHR5X3BhZ2VzX2FuZF9wYWdldmVjKHN0cnVjdCBwYWdlICoqcGFnZXZlYywgaW50IG5yX3BhZ2VzKTsKLQotdm9pZCBiYWxsb29uX3JlbGVhc2VfZHJpdmVyX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotCi0vKgotICogUHJldmVudCB0aGUgYmFsbG9vbiBkcml2ZXIgZnJvbSBjaGFuZ2luZyB0aGUgbWVtb3J5IHJlc2VydmF0aW9uIGR1cmluZwotICogYSBkcml2ZXIgY3JpdGljYWwgcmVnaW9uLgotICovCi1leHRlcm4gc3BpbmxvY2tfdCBiYWxsb29uX2xvY2s7Ci0jZGVmaW5lIGJhbGxvb25fbG9jayhfX2ZsYWdzKSAgIHNwaW5fbG9ja19pcnFzYXZlKCZiYWxsb29uX2xvY2ssIF9fZmxhZ3MpCi0jZGVmaW5lIGJhbGxvb25fdW5sb2NrKF9fZmxhZ3MpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbGxvb25fbG9jaywgX19mbGFncykKLSNlbmRpZgotCi0jZW5kaWYgLyogX19YRU5fQkFMTE9PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2ZW50cy5oIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKaW5kZXggNDY4MGZmMy4uMGQ1ZjFhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKQEAgLTQ2LDYgKzQ2LDggQEAKIAogLyogQ2xlYXIgYW4gaXJxJ3MgcGVuZGluZyBzdGF0ZSwgaW4gcHJlcGFyYXRpb24gZm9yIHBvbGxpbmcgb24gaXQgKi8KIHZvaWQgeGVuX2NsZWFyX2lycV9wZW5kaW5nKGludCBpcnEpOwordm9pZCB4ZW5fc2V0X2lycV9wZW5kaW5nKGludCBpcnEpOworYm9vbCB4ZW5fdGVzdF9pcnFfcGVuZGluZyhpbnQgaXJxKTsKIAogLyogUG9sbCB3YWl0aW5nIGZvciBhbiBpcnEgdG8gYmVjb21lIHBlbmRpbmcuICBJbiB0aGUgdXN1YWwgY2FzZSwgdGhlCiAgICBpcnEgd2lsbCBiZSBkaXNhYmxlZCBzbyBpdCB3b24ndCBkZWxpdmVyIGFuIGludGVycnVwdC4gKi8KZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBjMTFkYTM4Li41Y2VmZjMyIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC03MTMsNiArNzEzLDE0IEBACiAJICBvcHRpb24gcmVwbGFjZXMgc2htZW0gYW5kIHRtcGZzIHdpdGggdGhlIG11Y2ggc2ltcGxlciByYW1mcyBjb2RlLAogCSAgd2hpY2ggbWF5IGJlIGFwcHJvcHJpYXRlIG9uIHNtYWxsIHN5c3RlbXMgd2l0aG91dCBzd2FwLgogCitjb25maWcgQUlPCisJYm9vbCAiRW5hYmxlIEFJTyBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgUE9TSVggYXN5bmNocm9ub3VzIEkvTyB3aGljaCBtYXkgYnkgdXNlZAorICAgICAgICAgIGJ5IHNvbWUgaGlnaCBwZXJmb3JtYW5jZSB0aHJlYWRlZCBhcHBsaWNhdGlvbnMuIERpc2FibGluZworICAgICAgICAgIHRoaXMgb3B0aW9uIHNhdmVzIGFib3V0IDdrLgorCiBjb25maWcgVk1fRVZFTlRfQ09VTlRFUlMKIAlkZWZhdWx0IHkKIAlib29sICJFbmFibGUgVk0gZXZlbnQgY291bnRlcnMgZm9yIC9wcm9jL3Ztc3RhdCIgaWYgRU1CRURERUQKQEAgLTc3OSwxNiArNzg3LDYgQEAKIAogc291cmNlICJhcmNoL0tjb25maWciCiAKLWNvbmZpZyBQUk9DX1BBR0VfTU9OSVRPUgotIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIFBST0NfRlMgJiYgTU1VCi0JYm9vbCAiRW5hYmxlIC9wcm9jIHBhZ2UgbW9uaXRvcmluZyIgaWYgRU1CRURERUQKLSAJaGVscAotCSAgVmFyaW91cyAvcHJvYyBmaWxlcyBleGlzdCB0byBtb25pdG9yIHByb2Nlc3MgbWVtb3J5IHV0aWxpemF0aW9uOgotCSAgL3Byb2MvcGlkL3NtYXBzLCAvcHJvYy9waWQvY2xlYXJfcmVmcywgL3Byb2MvcGlkL3BhZ2VtYXAsCi0JICAvcHJvYy9rcGFnZWNvdW50LCBhbmQgL3Byb2Mva3BhZ2VmbGFncy4gRGlzYWJsaW5nIHRoZXNlCi0gICAgICAgICAgaW50ZXJmYWNlcyB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUga2VybmVsIGJ5IGFwcHJveGltYXRlbHkgNGtiLgotCiBlbmRtZW51CQkjIEdlbmVyYWwgc2V0dXAKIAogY29uZmlnIEhBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmluZGV4IDM3MTVmZWIuLmQwNTViMTkgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzLmMKKysrIGIvaW5pdC9kb19tb3VudHMuYwpAQCAtMjYzLDYgKzI2MywxMCBAQAogCQlwcmludGsoIlBsZWFzZSBhcHBlbmQgYSBjb3JyZWN0IFwicm9vdD1cIiBib290IG9wdGlvbjsgaGVyZSBhcmUgdGhlIGF2YWlsYWJsZSBwYXJ0aXRpb25zOlxuIik7CiAKIAkJcHJpbnRrX2FsbF9wYXJ0aXRpb25zKCk7CisjaWZkZWYgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUCisJCXByaW50aygiREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgZW5hYmxlZCwgeW91IG5lZWQgdG8gc3BlY2lmeSAiCisJCSAgICAgICAiZXhwbGljaXQgdGV4dHVhbCBuYW1lIGZvciBcInJvb3Q9XCIgYm9vdCBvcHRpb24uXG4iKTsKKyNlbmRpZgogCQlwYW5pYygiVkZTOiBVbmFibGUgdG8gbW91bnQgcm9vdCBmcyBvbiAlcyIsIGIpOwogCX0KIApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfbWQuYyBiL2luaXQvZG9fbW91bnRzX21kLmMKaW5kZXggNjkzZDI0Ni4uNGM4N2VlMSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfbWQuYworKysgYi9pbml0L2RvX21vdW50c19tZC5jCkBAIC0xLDUgKzEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlICJkb19tb3VudHMuaCIKIApAQCAtMTIsNyArMTMsMTIgQEAKICAqIFRoZSBjb2RlIGZvciB0aGF0IGlzIGhlcmUuCiAgKi8KIAotc3RhdGljIGludCBfX2luaXRkYXRhIHJhaWRfbm9hdXRvZGV0ZWN0LCByYWlkX2F1dG9wYXJ0OworI2lmZGVmIENPTkZJR19NRF9BVVRPREVURUNUCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcmFpZF9ub2F1dG9kZXRlY3Q7CisjZWxzZQorc3RhdGljIGludCBfX2luaXRkYXRhIHJhaWRfbm9hdXRvZGV0ZWN0PTE7CisjZW5kaWYKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSByYWlkX2F1dG9wYXJ0OwogCiBzdGF0aWMgc3RydWN0IHsKIAlpbnQgbWlub3I7CkBAIC0yNTIsNiArMjU4LDggQEAKIAogCQlpZiAoIXN0cm5jbXAoc3RyLCAibm9hdXRvZGV0ZWN0Iiwgd2xlbikpCiAJCQlyYWlkX25vYXV0b2RldGVjdCA9IDE7CisJCWlmICghc3RybmNtcChzdHIsICJhdXRvZGV0ZWN0Iiwgd2xlbikpCisJCQlyYWlkX25vYXV0b2RldGVjdCA9IDA7CiAJCWlmIChzdHJuY21wKHN0ciwgInBhcnRpdGlvbmFibGUiLCB3bGVuKT09MCkKIAkJCXJhaWRfYXV0b3BhcnQgPSAxOwogCQlpZiAoc3RybmNtcChzdHIsICJwYXJ0Iiwgd2xlbik9PTApCkBAIC0yNjQsMTcgKzI3MiwzMiBAQAogX19zZXR1cCgicmFpZD0iLCByYWlkX3NldHVwKTsKIF9fc2V0dXAoIm1kPSIsIG1kX3NldHVwKTsKIAorc3RhdGljIHZvaWQgYXV0b2RldGVjdF9yYWlkKHZvaWQpCit7CisJaW50IGZkOworCisJLyoKKwkgKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIGRldGVjdCBhbmQgdXNlIGhhbGYgYSByYWlkIGFycmF5LCB3ZSBuZWVkIHRvCisJICogd2FpdCBmb3IgdGhlIGtub3duIGRldmljZXMgdG8gY29tcGxldGUgdGhlaXIgcHJvYmluZworCSAqLworCXByaW50ayhLRVJOX0lORk8gIm1kOiBXYWl0aW5nIGZvciBhbGwgZGV2aWNlcyB0byBiZSBhdmFpbGFibGUgYmVmb3JlIGF1dG9kZXRlY3RcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm1kOiBJZiB5b3UgZG9uJ3QgdXNlIHJhaWQsIHVzZSByYWlkPW5vYXV0b2RldGVjdFxuIik7CisJd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgPCAwKQorCQltc2xlZXAoMTAwKTsKKwlmZCA9IHN5c19vcGVuKCIvZGV2L21kMCIsIDAsIDApOworCWlmIChmZCA+PSAwKSB7CisJCXN5c19pb2N0bChmZCwgUkFJRF9BVVRPUlVOLCByYWlkX2F1dG9wYXJ0KTsKKwkJc3lzX2Nsb3NlKGZkKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IG1kX3J1bl9zZXR1cCh2b2lkKQogewogCWNyZWF0ZV9kZXYoIi9kZXYvbWQwIiwgTUtERVYoTURfTUFKT1IsIDApKTsKKwogCWlmIChyYWlkX25vYXV0b2RldGVjdCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IFNraXBwaW5nIGF1dG9kZXRlY3Rpb24gb2YgUkFJRCBhcnJheXMuIChyYWlkPW5vYXV0b2RldGVjdClcbiIpOwotCWVsc2UgewotCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9tZDAiLCAwLCAwKTsKLQkJaWYgKGZkID49IDApIHsKLQkJCXN5c19pb2N0bChmZCwgUkFJRF9BVVRPUlVOLCByYWlkX2F1dG9wYXJ0KTsKLQkJCXN5c19jbG9zZShmZCk7Ci0JCX0KLQl9CisJCXByaW50ayhLRVJOX0lORk8gIm1kOiBTa2lwcGluZyBhdXRvZGV0ZWN0aW9uIG9mIFJBSUQgYXJyYXlzLiAocmFpZD1hdXRvZGV0ZWN0IHdpbGwgZm9yY2UpXG4iKTsKKwllbHNlCisJCWF1dG9kZXRlY3RfcmFpZCgpOwogCW1kX3NldHVwX2RyaXZlKCk7CiB9CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19yZC5jIGIvaW5pdC9kb19tb3VudHNfcmQuYwppbmRleCBmZWRlZjkzLi5hN2M3NDhmIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50c19yZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX3JkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAlzeXNfcmVhZChmZCwgYnVmLCBzaXplKTsKIAogCS8qCi0JICogSWYgaXQgbWF0Y2hlcyB0aGUgZ3ppcCBtYWdpYyBudW1iZXJzLCByZXR1cm4gLTEKKwkgKiBJZiBpdCBtYXRjaGVzIHRoZSBnemlwIG1hZ2ljIG51bWJlcnMsIHJldHVybiAwCiAJICovCiAJaWYgKGJ1ZlswXSA9PSAwMzcgJiYgKChidWZbMV0gPT0gMDIxMykgfHwgKGJ1ZlsxXSA9PSAwMjM2KSkpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFCmRpZmYgLS1naXQgYS9pbml0L2luaXRyYW1mcy5jIGIvaW5pdC9pbml0cmFtZnMuYwppbmRleCA2NDRmYzAxLi40ZjViYTc1IDEwMDY0NAotLS0gYS9pbml0L2luaXRyYW1mcy5jCisrKyBiL2luaXQvaW5pdHJhbWZzLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aW1lLmg+CiAKIHN0YXRpYyBfX2luaXRkYXRhIGNoYXIgKm1lc3NhZ2U7CiBzdGF0aWMgdm9pZCBfX2luaXQgZXJyb3IoY2hhciAqeCkKQEAgLTcyLDYgKzczLDQ5IEBACiAJfQogfQogCitzdGF0aWMgbG9uZyBfX2luaXQgZG9fdXRpbWUoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCB0aW1lX3QgbXRpbWUpCit7CisJc3RydWN0IHRpbWVzcGVjIHRbMl07CisKKwl0WzBdLnR2X3NlYyA9IG10aW1lOworCXRbMF0udHZfbnNlYyA9IDA7CisJdFsxXS50dl9zZWMgPSBtdGltZTsKKwl0WzFdLnR2X25zZWMgPSAwOworCisJcmV0dXJuIGRvX3V0aW1lcyhBVF9GRENXRCwgZmlsZW5hbWUsIHQsIEFUX1NZTUxJTktfTk9GT0xMT1cpOworfQorCitzdGF0aWMgX19pbml0ZGF0YSBMSVNUX0hFQUQoZGlyX2xpc3QpOworc3RydWN0IGRpcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWNoYXIgKm5hbWU7CisJdGltZV90IG10aW1lOworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGRpcl9hZGQoY29uc3QgY2hhciAqbmFtZSwgdGltZV90IG10aW1lKQoreworCXN0cnVjdCBkaXJfZW50cnkgKmRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpcl9lbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghZGUpCisJCXBhbmljKCJjYW4ndCBhbGxvY2F0ZSBkaXJfZW50cnkgYnVmZmVyIik7CisJSU5JVF9MSVNUX0hFQUQoJmRlLT5saXN0KTsKKwlkZS0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CisJZGUtPm10aW1lID0gbXRpbWU7CisJbGlzdF9hZGQoJmRlLT5saXN0LCAmZGlyX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZGlyX3V0aW1lKHZvaWQpCit7CisJc3RydWN0IGRpcl9lbnRyeSAqZGUsICp0bXA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlLCB0bXAsICZkaXJfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGUtPmxpc3QpOworCQlkb191dGltZShkZS0+bmFtZSwgZGUtPm10aW1lKTsKKwkJa2ZyZWUoZGUtPm5hbWUpOworCQlrZnJlZShkZSk7CisJfQorfQorCitzdGF0aWMgX19pbml0ZGF0YSB0aW1lX3QgbXRpbWU7CisKIC8qIGNwaW8gaGVhZGVyIHBhcnNpbmcgKi8KIAogc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBpbm8sIG1ham9yLCBtaW5vciwgbmxpbms7CkBAIC05Nyw2ICsxNDEsNyBAQAogCXVpZCA9IHBhcnNlZFsyXTsKIAlnaWQgPSBwYXJzZWRbM107CiAJbmxpbmsgPSBwYXJzZWRbNF07CisJbXRpbWUgPSBwYXJzZWRbNV07CiAJYm9keV9sZW4gPSBwYXJzZWRbNl07CiAJbWFqb3IgPSBwYXJzZWRbN107CiAJbWlub3IgPSBwYXJzZWRbOF07CkBAIC0xMzAsNiArMTc1LDcgQEAKIAljb3VudCAtPSBuOwogfQogCitzdGF0aWMgX19pbml0ZGF0YSBjaGFyICp2Y29sbGVjdGVkOwogc3RhdGljIF9faW5pdGRhdGEgY2hhciAqY29sbGVjdGVkOwogc3RhdGljIF9faW5pdGRhdGEgaW50IHJlbWFpbnM7CiBzdGF0aWMgX19pbml0ZGF0YSBjaGFyICpjb2xsZWN0OwpAQCAtMjcxLDYgKzMxNyw3IEBACiAJCQlpZiAod2ZkID49IDApIHsKIAkJCQlzeXNfZmNob3duKHdmZCwgdWlkLCBnaWQpOwogCQkJCXN5c19mY2htb2Qod2ZkLCBtb2RlKTsKKwkJCQl2Y29sbGVjdGVkID0ga3N0cmR1cChjb2xsZWN0ZWQsIEdGUF9LRVJORUwpOwogCQkJCXN0YXRlID0gQ29weUZpbGU7CiAJCQl9CiAJCX0KQEAgLTI3OCwxMiArMzI1LDE0IEBACiAJCXN5c19ta2Rpcihjb2xsZWN0ZWQsIG1vZGUpOwogCQlzeXNfY2hvd24oY29sbGVjdGVkLCB1aWQsIGdpZCk7CiAJCXN5c19jaG1vZChjb2xsZWN0ZWQsIG1vZGUpOworCQlkaXJfYWRkKGNvbGxlY3RlZCwgbXRpbWUpOwogCX0gZWxzZSBpZiAoU19JU0JMSyhtb2RlKSB8fCBTX0lTQ0hSKG1vZGUpIHx8CiAJCSAgIFNfSVNGSUZPKG1vZGUpIHx8IFNfSVNTT0NLKG1vZGUpKSB7CiAJCWlmIChtYXliZV9saW5rKCkgPT0gMCkgewogCQkJc3lzX21rbm9kKGNvbGxlY3RlZCwgbW9kZSwgcmRldik7CiAJCQlzeXNfY2hvd24oY29sbGVjdGVkLCB1aWQsIGdpZCk7CiAJCQlzeXNfY2htb2QoY29sbGVjdGVkLCBtb2RlKTsKKwkJCWRvX3V0aW1lKGNvbGxlY3RlZCwgbXRpbWUpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMjk0LDYgKzM0Myw4IEBACiAJaWYgKGNvdW50ID49IGJvZHlfbGVuKSB7CiAJCXN5c193cml0ZSh3ZmQsIHZpY3RpbSwgYm9keV9sZW4pOwogCQlzeXNfY2xvc2Uod2ZkKTsKKwkJZG9fdXRpbWUodmNvbGxlY3RlZCwgbXRpbWUpOworCQlrZnJlZSh2Y29sbGVjdGVkKTsKIAkJZWF0KGJvZHlfbGVuKTsKIAkJc3RhdGUgPSBTa2lwSXQ7CiAJCXJldHVybiAwOwpAQCAtMzExLDYgKzM2Miw3IEBACiAJY2xlYW5fcGF0aChjb2xsZWN0ZWQsIDApOwogCXN5c19zeW1saW5rKGNvbGxlY3RlZCArIE5fQUxJR04obmFtZV9sZW4pLCBjb2xsZWN0ZWQpOwogCXN5c19sY2hvd24oY29sbGVjdGVkLCB1aWQsIGdpZCk7CisJZG9fdXRpbWUoY29sbGVjdGVkLCBtdGltZSk7CiAJc3RhdGUgPSBTa2lwSXQ7CiAJbmV4dF9zdGF0ZSA9IFJlc2V0OwogCXJldHVybiAwOwpAQCAtNDY2LDYgKzUxOCw3IEBACiAJCWJ1ZiArPSBpbnB0cjsKIAkJbGVuIC09IGlucHRyOwogCX0KKwlkaXJfdXRpbWUoKTsKIAlrZnJlZSh3aW5kb3cpOwogCWtmcmVlKG5hbWVfYnVmKTsKIAlrZnJlZShzeW1saW5rX2J1Zik7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGY2ZjcwNDIuLjI3ZjZiZjYgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC03MDgsNyArNzA4LDcgQEAKIAlpbnQgcmVzdWx0OwogCiAJaWYgKGluaXRjYWxsX2RlYnVnKSB7Ci0JCXByaW50X2ZuX2Rlc2NyaXB0b3Jfc3ltYm9sKCJjYWxsaW5nICAlc1xuIiwgZm4pOworCQlwcmludGsoImNhbGxpbmcgICVwRiBAICVpXG4iLCBmbiwgdGFza19waWRfbnIoY3VycmVudCkpOwogCQl0MCA9IGt0aW1lX2dldCgpOwogCX0KIApAQCAtNzE4LDggKzcxOCw4IEBACiAJCXQxID0ga3RpbWVfZ2V0KCk7CiAJCWRlbHRhID0ga3RpbWVfc3ViKHQxLCB0MCk7CiAKLQkJcHJpbnRfZm5fZGVzY3JpcHRvcl9zeW1ib2woImluaXRjYWxsICVzIiwgZm4pOwotCQlwcmludGsoIiByZXR1cm5lZCAlZCBhZnRlciAlTGQgbXNlY3NcbiIsIHJlc3VsdCwKKwkJcHJpbnRrKCJpbml0Y2FsbCAlcEYgcmV0dXJuZWQgJWQgYWZ0ZXIgJUxkIG1zZWNzXG4iLAorCQkJZm4sIHJlc3VsdCwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRlbHRhLnR2NjQgPj4gMjApOwogCX0KIApAQCAtNzM3LDggKzczNyw3IEBACiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAl9CiAJaWYgKG1zZ2J1ZlswXSkgewotCQlwcmludF9mbl9kZXNjcmlwdG9yX3N5bWJvbChLRVJOX1dBUk5JTkcgImluaXRjYWxsICVzIiwgZm4pOwotCQlwcmludGsoIiByZXR1cm5lZCB3aXRoICVzXG4iLCBtc2didWYpOworCQlwcmludGsoImluaXRjYWxsICVwRiByZXR1cm5lZCB3aXRoICVzXG4iLCBmbiwgbXNnYnVmKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvaXBjL2lwY19zeXNjdGwuYyBiL2lwYy9pcGNfc3lzY3RsLmMKaW5kZXggNjliYzg1OS4uMGRmZWJjNSAxMDA2NDQKLS0tIGEvaXBjL2lwY19zeXNjdGwuYworKysgYi9pcGMvaXBjX3N5c2N0bC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogLyogVGhlIGdlbmVyaWMgc3lzY3RsIGlwYyBkYXRhIHJvdXRpbmUuICovCi1zdGF0aWMgaW50IHN5c2N0bF9pcGNfZGF0YShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK3N0YXRpYyBpbnQgc3lzY3RsX2lwY19kYXRhKGN0bF90YWJsZSAqdGFibGUsCiAJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CkBAIC0xNjksMTQgKzE2OSwxMyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHN5c2N0bF9pcGNfcmVnaXN0ZXJlZF9kYXRhKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsCi0JCWludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorc3RhdGljIGludCBzeXNjdGxfaXBjX3JlZ2lzdGVyZWRfZGF0YShjdGxfdGFibGUgKnRhYmxlLAorCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCByYzsKIAotCXJjID0gc3lzY3RsX2lwY19kYXRhKHRhYmxlLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwKLQkJbmV3bGVuKTsKKwlyYyA9IHN5c2N0bF9pcGNfZGF0YSh0YWJsZSwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAKIAlpZiAobmV3dmFsICYmIG5ld2xlbiAmJiByYyA+IDApCiAJCS8qCmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggYmYxYmMzNi4uMDgyMTIyNCAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJcmV0dXJuIHNlbXpjbnQ7CiB9CiAKLXZvaWQgZnJlZV91bihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCBmcmVlX3VuKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3Qgc2VtX3VuZG8gKnVuID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBzZW1fdW5kbywgcmN1KTsKIAlrZnJlZSh1bik7CmRpZmYgLS1naXQgYS9rZXJuZWwvYWNjdC5jIGIva2VybmVsL2FjY3QuYwppbmRleCBkZDY4YjkwLi5mNjAwNmE2IDEwMDY0NAotLS0gYS9rZXJuZWwvYWNjdC5jCisrKyBiL2tlcm5lbC9hY2N0LmMKQEAgLTU0OCw3ICs1NDgsNyBAQAogI2VuZGlmCiAKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl0dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKKwl0dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsJLyogU2FmZSBhcyB3ZSBob2xkIHRoZSBzaWdsb2NrICovCiAJYWMuYWNfdHR5ID0gdHR5ID8gb2xkX2VuY29kZV9kZXYodHR5X2Rldm51bSh0dHkpKSA6IDA7CiAJYWMuYWNfdXRpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfdXRpbWUpKSk7CiAJYWMuYWNfc3RpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfc3RpbWUpKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCA1OWNlZGZiLi5jZjViYzJmIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTI0Niw4ICsyNDYsOCBAQAogCXVuc2lnbmVkIG47CiAJaWYgKHVubGlrZWx5KCFjdHgpKQogCQlyZXR1cm4gMDsKLQogCW4gPSBjdHgtPm1ham9yOworCiAJc3dpdGNoIChhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGN0eC0+YXJjaCwgbikpIHsKIAljYXNlIDA6CS8qIG5hdGl2ZSAqLwogCQlpZiAoKG1hc2sgJiBBVURJVF9QRVJNX1dSSVRFKSAmJgpAQCAtMTIwNCwxMyArMTIwNCwxMyBAQAogCQkJCSAoY29udGV4dC0+cmV0dXJuX3ZhbGlkPT1BVURJVFNDX1NVQ0NFU1MpPyJ5ZXMiOiJubyIsCiAJCQkJIGNvbnRleHQtPnJldHVybl9jb2RlKTsKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWlmICh0c2stPnNpZ25hbCAmJiB0c2stPnNpZ25hbC0+dHR5ICYmIHRzay0+c2lnbmFsLT50dHktPm5hbWUpCiAJCXR0eSA9IHRzay0+c2lnbmFsLT50dHktPm5hbWU7CiAJZWxzZQogCQl0dHkgPSAiKG5vbmUpIjsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCiAJYXVkaXRfbG9nX2Zvcm1hdChhYiwKIAkJICAiIGEwPSVseCBhMT0lbHggYTI9JWx4IGEzPSVseCBpdGVtcz0lZCIKIAkJICAiIHBwaWQ9JWQgcGlkPSVkIGF1aWQ9JXUgdWlkPSV1IGdpZD0ldSIKQEAgLTEyMzAsNyArMTIzMCw2IEBACiAJCSAgY29udGV4dC0+ZWdpZCwgY29udGV4dC0+c2dpZCwgY29udGV4dC0+ZnNnaWQsIHR0eSwKIAkJICB0c2stPnNlc3Npb25pZCk7CiAKLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAKIAlhdWRpdF9sb2dfdGFza19pbmZvKGFiLCB0c2spOwogCWlmIChjb250ZXh0LT5maWx0ZXJrZXkpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAuYyBiL2tlcm5lbC9jZ3JvdXAuYwppbmRleCAxMzkzMmFiZC4uOGM2ZTFjMSAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMjczNSwyMSArMjczNSwyNCBAQAogICogQ2FsbGVkIG9uIGV2ZXJ5IGNoYW5nZSB0byBtbS0+b3duZXIuIG1tX2luaXRfb3duZXIoKSBkb2VzIG5vdAogICogaW52b2tlIHRoaXMgcm91dGluZSwgc2luY2UgaXQgYXNzaWducyB0aGUgbW0tPm93bmVyIHRoZSBmaXJzdCB0aW1lCiAgKiBhbmQgZG9lcyBub3QgY2hhbmdlIGl0LgorICoKKyAqIFRoZSBjYWxsYmFja3MgYXJlIGludm9rZWQgd2l0aCBtbWFwX3NlbSBoZWxkIGluIHJlYWQgbW9kZS4KICAqLwogdm9pZCBjZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKIHsKLQlzdHJ1Y3QgY2dyb3VwICpvbGRjZ3JwLCAqbmV3Y2dycDsKKwlzdHJ1Y3QgY2dyb3VwICpvbGRjZ3JwLCAqbmV3Y2dycCA9IE5VTEw7CiAKIAlpZiAobmVlZF9tbV9vd25lcl9jYWxsYmFjaykgewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IENHUk9VUF9TVUJTWVNfQ09VTlQ7IGkrKykgewogCQkJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzID0gc3Vic3lzW2ldOwogCQkJb2xkY2dycCA9IHRhc2tfY2dyb3VwKG9sZCwgc3MtPnN1YnN5c19pZCk7Ci0JCQluZXdjZ3JwID0gdGFza19jZ3JvdXAobmV3LCBzcy0+c3Vic3lzX2lkKTsKKwkJCWlmIChuZXcpCisJCQkJbmV3Y2dycCA9IHRhc2tfY2dyb3VwKG5ldywgc3MtPnN1YnN5c19pZCk7CiAJCQlpZiAob2xkY2dycCA9PSBuZXdjZ3JwKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHNzLT5tbV9vd25lcl9jaGFuZ2VkKQotCQkJCXNzLT5tbV9vd25lcl9jaGFuZ2VkKHNzLCBvbGRjZ3JwLCBuZXdjZ3JwKTsKKwkJCQlzcy0+bW1fb3duZXJfY2hhbmdlZChzcywgb2xkY2dycCwgbmV3Y2dycCwgbmV3KTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCAzMmMyNTRhLi4xNDM5OTBlIDEwMDY0NAotLS0gYS9rZXJuZWwvY29tcGF0LmMKKysrIGIva2VybmVsL2NvbXBhdC5jCkBAIC0yNiw2ICsyNiw2NCBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAorLyoKKyAqIE5vdGUgdGhhdCB0aGUgbmF0aXZlIHNpZGUgaXMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gYSB0aW1lc3BlYywgYmVjYXVzZQorICogdGhhdCdzIHdoYXQgd2Ugd2FudCBhbnl3YXkuCisgKi8KK3N0YXRpYyBpbnQgY29tcGF0X2dldF90aW1ldmFsKHN0cnVjdCB0aW1lc3BlYyAqbywKKwkJc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKK3sKKwlsb25nIHVzZWM7CisKKwlpZiAoZ2V0X3VzZXIoby0+dHZfc2VjLCAmaS0+dHZfc2VjKSB8fAorCSAgICBnZXRfdXNlcih1c2VjLCAmaS0+dHZfdXNlYykpCisJCXJldHVybiAtRUZBVUxUOworCW8tPnR2X25zZWMgPSB1c2VjICogMTAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfcHV0X3RpbWV2YWwoc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqbywKKwkJc3RydWN0IHRpbWV2YWwgKmkpCit7CisJcmV0dXJuIChwdXRfdXNlcihpLT50dl9zZWMsICZvLT50dl9zZWMpIHx8CisJCXB1dF91c2VyKGktPnR2X3VzZWMsICZvLT50dl91c2VjKSkgPyAtRUZBVUxUIDogMDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAorCQlzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKK3sKKwlpZiAodHYpIHsKKwkJc3RydWN0IHRpbWV2YWwga3R2OworCQlkb19nZXR0aW1lb2ZkYXkoJmt0dik7CisJCWlmIChjb21wYXRfcHV0X3RpbWV2YWwodHYsICZrdHYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWlmICh0eikgeworCQlpZiAoY29weV90b191c2VyKHR6LCAmc3lzX3R6LCBzaXplb2Yoc3lzX3R6KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5KHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnR2LAorCQlzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMga3RzOworCXN0cnVjdCB0aW1lem9uZSBrdHo7CisKKwlpZiAodHYpIHsKKwkJaWYgKGNvbXBhdF9nZXRfdGltZXZhbCgma3RzLCB0dikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKHR6KSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigma3R6LCB0eiwgc2l6ZW9mKGt0eikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAma3RzIDogTlVMTCwgdHogPyAma3R6IDogTlVMTCk7Cit9CisKIGludCBnZXRfY29tcGF0X3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqdHMsIGNvbnN0IHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICpjdHMpCiB7CiAJcmV0dXJuICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjdHMsIHNpemVvZigqY3RzKSkgfHwKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCBmMTdlOTg1Li44NmQ0OTA0IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0xOTksMTMgKzE5OSwxNCBAQAogCXN0cnVjdCB0YWtlX2NwdV9kb3duX3BhcmFtICpwYXJhbSA9IF9wYXJhbTsKIAlpbnQgZXJyOwogCi0JcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX0RZSU5HIHwgcGFyYW0tPm1vZCwKLQkJCQlwYXJhbS0+aGNwdSk7CiAJLyogRW5zdXJlIHRoaXMgQ1BVIGRvZXNuJ3QgaGFuZGxlIGFueSBtb3JlIGludGVycnVwdHMuICovCiAJZXJyID0gX19jcHVfZGlzYWJsZSgpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX0RZSU5HIHwgcGFyYW0tPm1vZCwKKwkJCQlwYXJhbS0+aGNwdSk7CisKIAkvKiBGb3JjZSBpZGxlIHRhc2sgdG8gcnVuIGFzIHNvb24gYXMgd2UgeWllbGQ6IGl0IHNob3VsZAogCSAgIGltbWVkaWF0ZWx5IG5vdGljZSBjcHUgaXMgb2ZmbGluZSBhbmQgZGllIHF1aWNrbHkuICovCiAJc2NoZWRfaWRsZV9uZXh0KCk7CkBAIC00NTMsNiArNDU0LDI1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQX1NNUCAqLwogCisvKioKKyAqIG5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KSAtIGNhbGwgdGhlIENQVV9TVEFSVElORyBub3RpZmllcnMKKyAqIEBjcHU6IGNwdSB0aGF0IGp1c3Qgc3RhcnRlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGNwdV9jaGFpbiBub3RpZmllcnMgd2l0aCBDUFVfU1RBUlRJTkcuCisgKiBJdCBtdXN0IGJlIGNhbGxlZCBieSB0aGUgYXJjaCBjb2RlIG9uIHRoZSBuZXcgY3B1LCBiZWZvcmUgdGhlIG5ldyBjcHUKKyAqIGVuYWJsZXMgaW50ZXJydXB0cyBhbmQgYmVmb3JlIHRoZSAiYm9vdCIgY3B1IHJldHVybnMgZnJvbSBfX2NwdV91cCgpLgorICovCit2b2lkIG5vdGlmeV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IENQVV9TVEFSVElORzsKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUF9TTVAKKwlpZiAoY3B1X2lzc2V0KGNwdSwgZnJvemVuX2NwdXMpKQorCQl2YWwgPSBDUFVfU1RBUlRJTkdfRlJPWkVOOworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUF9TTVAgKi8KKwlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCB2YWwsICh2b2lkICopKGxvbmcpY3B1KTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBkNWFiNzljLi5lYWI3YmQ2NiAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtMTQsNiArMTQsOCBAQAogICogIDIwMDMtMTAtMjIgVXBkYXRlcyBieSBTdGVwaGVuIEhlbW1pbmdlci4KICAqICAyMDA0IE1heS1KdWx5IFJld29yayBieSBQYXVsIEphY2tzb24uCiAgKiAgMjAwNiBSZXdvcmsgYnkgUGF1bCBNZW5hZ2UgdG8gdXNlIGdlbmVyaWMgY2dyb3VwcworICogIDIwMDggUmV3b3JrIG9mIHRoZSBzY2hlZHVsZXIgZG9tYWlucyBhbmQgQ1BVIGhvdHBsdWcgaGFuZGxpbmcKKyAqICAgICAgIGJ5IE1heCBLcmFzbnlhbnNreQogICoKICAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CkBAIC0yMzYsOSArMjM4LDExIEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY2FsbGJhY2tfbXV0ZXgpOwogCi0vKiBUaGlzIGlzIHVnbHksIGJ1dCBwcmVzZXJ2ZXMgdGhlIHVzZXJzcGFjZSBBUEkgZm9yIGV4aXN0aW5nIGNwdXNldAorLyoKKyAqIFRoaXMgaXMgdWdseSwgYnV0IHByZXNlcnZlcyB0aGUgdXNlcnNwYWNlIEFQSSBmb3IgZXhpc3RpbmcgY3B1c2V0CiAgKiB1c2Vycy4gSWYgc29tZW9uZSB0cmllcyB0byBtb3VudCB0aGUgImNwdXNldCIgZmlsZXN5c3RlbSwgd2UKLSAqIHNpbGVudGx5IHN3aXRjaCBpdCB0byBtb3VudCAiY2dyb3VwIiBpbnN0ZWFkICovCisgKiBzaWxlbnRseSBzd2l0Y2ggaXQgdG8gbW91bnQgImNncm91cCIgaW5zdGVhZAorICovCiBzdGF0aWMgaW50IGNwdXNldF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICp1bnVzZWRfZGV2X25hbWUsCiAJCQkgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCkBAIC00NzMsMTAgKzQ3Nyw5IEBACiB9CiAKIC8qCi0gKiBIZWxwZXIgcm91dGluZSBmb3IgcmVidWlsZF9zY2hlZF9kb21haW5zKCkuCisgKiBIZWxwZXIgcm91dGluZSBmb3IgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygpLgogICogRG8gY3B1c2V0cyBhLCBiIGhhdmUgb3ZlcmxhcHBpbmcgY3B1c19hbGxvd2VkIG1hc2tzPwogICovCi0KIHN0YXRpYyBpbnQgY3B1c2V0c19vdmVybGFwKHN0cnVjdCBjcHVzZXQgKmEsIHN0cnVjdCBjcHVzZXQgKmIpCiB7CiAJcmV0dXJuIGNwdXNfaW50ZXJzZWN0cyhhLT5jcHVzX2FsbG93ZWQsIGItPmNwdXNfYWxsb3dlZCk7CkBAIC01MTgsMjYgKzUyMSwxNSBAQAogfQogCiAvKgotICogcmVidWlsZF9zY2hlZF9kb21haW5zKCkKKyAqIGdlbmVyYXRlX3NjaGVkX2RvbWFpbnMoKQogICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB0byByZWJ1aWxkIHRoZSBzY2hlZHVsZXIncyBkeW5hbWljCi0gKiBzY2hlZCBkb21haW5zOgotICogLSBpZiB0aGUgZmxhZyAnc2NoZWRfbG9hZF9iYWxhbmNlJyBvZiBhbnkgY3B1c2V0IHdpdGggbm9uLWVtcHR5Ci0gKiAgICdjcHVzJyBjaGFuZ2VzLAotICogLSBvciBpZiB0aGUgJ2NwdXMnIGFsbG93ZWQgY2hhbmdlcyBpbiBhbnkgY3B1c2V0IHdoaWNoIGhhcyB0aGF0Ci0gKiAgIGZsYWcgZW5hYmxlZCwKLSAqIC0gb3IgaWYgdGhlICdzY2hlZF9yZWxheF9kb21haW5fbGV2ZWwnIG9mIGFueSBjcHVzZXQgd2hpY2ggaGFzCi0gKiAgIHRoYXQgZmxhZyBlbmFibGVkIGFuZCB3aXRoIG5vbi1lbXB0eSAnY3B1cycgY2hhbmdlcywKLSAqIC0gb3IgaWYgYW55IGNwdXNldCB3aXRoIG5vbi1lbXB0eSAnY3B1cycgaXMgcmVtb3ZlZCwKLSAqIC0gb3IgaWYgYSBjcHUgZ2V0cyBvZmZsaW5lZC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgYnVpbGRzIGEgcGFydGlhbCBwYXJ0aXRpb24gb2YgdGhlIHN5c3RlbXMgQ1BVcwotICogKHRoZSBzZXQgb2Ygbm9uLW92ZXJsYXBwcGluZyBjcHVtYXNrX3QncyBpbiB0aGUgYXJyYXkgJ3BhcnQnCi0gKiBiZWxvdyksIGFuZCBwYXNzZXMgdGhhdCBwYXJ0aWFsIHBhcnRpdGlvbiB0byB0aGUga2VybmVsL3NjaGVkLmMKLSAqIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkgcm91dGluZSwgd2hpY2ggd2lsbCByZWJ1aWxkIHRoZQotICogc2NoZWR1bGVycyBsb2FkIGJhbGFuY2luZyBkb21haW5zIChzY2hlZCBkb21haW5zKSBhcyBzcGVjaWZpZWQKLSAqIGJ5IHRoYXQgcGFydGlhbCBwYXJ0aXRpb24uICBBICdwYXJ0aWFsIHBhcnRpdGlvbicgaXMgYSBzZXQgb2YKLSAqIG5vbi1vdmVybGFwcGluZyBzdWJzZXRzIHdob3NlIHVuaW9uIGlzIGEgc3Vic2V0IG9mIHRoYXQgc2V0LgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgYSBwYXJ0aWFsIHBhcnRpdGlvbiBvZiB0aGUgc3lzdGVtcyBDUFVzCisgKiBBICdwYXJ0aWFsIHBhcnRpdGlvbicgaXMgYSBzZXQgb2Ygbm9uLW92ZXJsYXBwaW5nIHN1YnNldHMgd2hvc2UKKyAqIHVuaW9uIGlzIGEgc3Vic2V0IG9mIHRoYXQgc2V0LgorICogVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHBhc3NlZCB0byBrZXJuZWwvc2NoZWQuYworICogcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKSByb3V0aW5lLCB3aGljaCB3aWxsIHJlYnVpbGQgdGhlIHNjaGVkdWxlcidzCisgKiBsb2FkIGJhbGFuY2luZyBkb21haW5zIChzY2hlZCBkb21haW5zKSBhcyBzcGVjaWZpZWQgYnkgdGhhdCBwYXJ0aWFsCisgKiBwYXJ0aXRpb24uCiAgKgogICogU2VlICJXaGF0IGlzIHNjaGVkX2xvYWRfYmFsYW5jZSIgaW4gRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAogICogZm9yIGEgYmFja2dyb3VuZCBleHBsYW5hdGlvbiBvZiB0aGlzLgpAQCAtNTQ3LDEzICs1MzksNyBAQAogICogZG9tYWlucyB3aGVuIG9wZXJhdGluZyBpbiB0aGUgc2V2ZXJlIG1lbW9yeSBzaG9ydGFnZSBzaXR1YXRpb25zCiAgKiB0aGF0IGNvdWxkIGNhdXNlIGFsbG9jYXRpb24gZmFpbHVyZXMgYmVsb3cuCiAgKgotICogQ2FsbCB3aXRoIGNncm91cF9tdXRleCBoZWxkLiAgTWF5IHRha2UgY2FsbGJhY2tfbXV0ZXggZHVyaW5nCi0gKiBjYWxsIGR1ZSB0byB0aGUga2ZpZm9fYWxsb2MoKSBhbmQga21hbGxvYygpIGNhbGxzLiAgTWF5IG5lc3QKLSAqIGEgY2FsbCB0byB0aGUgZ2V0X29ubGluZV9jcHVzKCkvcHV0X29ubGluZV9jcHVzKCkgcGFpci4KLSAqIE11c3Qgbm90IGJlIGNhbGxlZCBob2xkaW5nIGNhbGxiYWNrX211dGV4LCBiZWNhdXNlIHdlIG11c3Qgbm90Ci0gKiBjYWxsIGdldF9vbmxpbmVfY3B1cygpIHdoaWxlIGhvbGRpbmcgY2FsbGJhY2tfbXV0ZXguICBFbHNld2hlcmUKLSAqIHRoZSBrZXJuZWwgbmVzdHMgY2FsbGJhY2tfbXV0ZXggaW5zaWRlIGdldF9vbmxpbmVfY3B1cygpIGNhbGxzLgotICogU28gdGhlIHJldmVyc2UgbmVzdGluZyB3b3VsZCByaXNrIGFuIEFCQkEgZGVhZGxvY2suCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNncm91cF9sb2NrIGhlbGQuCiAgKgogICogVGhlIHRocmVlIGtleSBsb2NhbCB2YXJpYWJsZXMgYmVsb3cgYXJlOgogICogICAgcSAgLSBhIGxpbmtlZC1saXN0IHF1ZXVlIG9mIGNwdXNldCBwb2ludGVycywgdXNlZCB0byBpbXBsZW1lbnQgYQpAQCAtNTg4LDEwICs1NzQsMTAgQEAKICAqCWVsZW1lbnQgb2YgdGhlIHBhcnRpdGlvbiAob25lIHNjaGVkIGRvbWFpbikgdG8gYmUgcGFzc2VkIHRvCiAgKglwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygpLgogICovCi0KLXZvaWQgcmVidWlsZF9zY2hlZF9kb21haW5zKHZvaWQpCitzdGF0aWMgaW50IGdlbmVyYXRlX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICoqZG9tYWlucywKKwkJCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqKmF0dHJpYnV0ZXMpCiB7Ci0JTElTVF9IRUFEKHEpOwkJLyogcXVldWUgb2YgY3B1c2V0cyB0byBiZSBzY2FubmVkKi8KKwlMSVNUX0hFQUQocSk7CQkvKiBxdWV1ZSBvZiBjcHVzZXRzIHRvIGJlIHNjYW5uZWQgKi8KIAlzdHJ1Y3QgY3B1c2V0ICpjcDsJLyogc2NhbnMgcSAqLwogCXN0cnVjdCBjcHVzZXQgKipjc2E7CS8qIGFycmF5IG9mIGFsbCBjcHVzZXQgcHRycyAqLwogCWludCBjc247CQkvKiBob3cgbWFueSBjcHVzZXQgcHRycyBpbiBjc2Egc28gZmFyICovCkBAIC02MDEsMjMgKzU4NywyNiBAQAogCWludCBuZG9tczsJCS8qIG51bWJlciBvZiBzY2hlZCBkb21haW5zIGluIHJlc3VsdCAqLwogCWludCBuc2xvdDsJCS8qIG5leHQgZW1wdHkgZG9tc1tdIGNwdW1hc2tfdCBzbG90ICovCiAKLQljc2EgPSBOVUxMOworCW5kb21zID0gMDsKIAlkb21zID0gTlVMTDsKIAlkYXR0ciA9IE5VTEw7CisJY3NhID0gTlVMTDsKIAogCS8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIDk5JSBvZiBzeXN0ZW1zIHdpdGggb25lLCBmdWxsLCBzY2hlZCBkb21haW4gKi8KIAlpZiAoaXNfc2NoZWRfbG9hZF9iYWxhbmNlKCZ0b3BfY3B1c2V0KSkgewotCQluZG9tcyA9IDE7CiAJCWRvbXMgPSBrbWFsbG9jKHNpemVvZihjcHVtYXNrX3QpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkb21zKQotCQkJZ290byByZWJ1aWxkOworCQkJZ290byBkb25lOworCiAJCWRhdHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChkYXR0cikgewogCQkJKmRhdHRyID0gU0RfQVRUUl9JTklUOwogCQkJdXBkYXRlX2RvbWFpbl9hdHRyX3RyZWUoZGF0dHIsICZ0b3BfY3B1c2V0KTsKIAkJfQogCQkqZG9tcyA9IHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkOwotCQlnb3RvIHJlYnVpbGQ7CisKKwkJbmRvbXMgPSAxOworCQlnb3RvIGRvbmU7CiAJfQogCiAJY3NhID0ga21hbGxvYyhudW1iZXJfb2ZfY3B1c2V0cyAqIHNpemVvZihjcCksIEdGUF9LRVJORUwpOwpAQCAtNjgwLDYxICs2NjksMTQxIEBACiAJCX0KIAl9CiAKLQkvKiBDb252ZXJ0IDxjc24sIGNzYT4gdG8gPG5kb21zLCBkb21zPiAqLworCS8qCisJICogTm93IHdlIGtub3cgaG93IG1hbnkgZG9tYWlucyB0byBjcmVhdGUuCisJICogQ29udmVydCA8Y3NuLCBjc2E+IHRvIDxuZG9tcywgZG9tcz4gYW5kIHBvcHVsYXRlIGNwdSBtYXNrcy4KKwkgKi8KIAlkb21zID0ga21hbGxvYyhuZG9tcyAqIHNpemVvZihjcHVtYXNrX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRvbXMpCi0JCWdvdG8gcmVidWlsZDsKKwlpZiAoIWRvbXMpIHsKKwkJbmRvbXMgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBUaGUgcmVzdCBvZiB0aGUgY29kZSwgaW5jbHVkaW5nIHRoZSBzY2hlZHVsZXIsIGNhbiBkZWFsIHdpdGgKKwkgKiBkYXR0cj09TlVMTCBjYXNlLiBObyBuZWVkIHRvIGFib3J0IGlmIGFsbG9jIGZhaWxzLgorCSAqLwogCWRhdHRyID0ga21hbGxvYyhuZG9tcyAqIHNpemVvZihzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIpLCBHRlBfS0VSTkVMKTsKIAogCWZvciAobnNsb3QgPSAwLCBpID0gMDsgaSA8IGNzbjsgaSsrKSB7CiAJCXN0cnVjdCBjcHVzZXQgKmEgPSBjc2FbaV07CisJCWNwdW1hc2tfdCAqZHA7CiAJCWludCBhcG4gPSBhLT5wbjsKIAotCQlpZiAoYXBuID49IDApIHsKLQkJCWNwdW1hc2tfdCAqZHAgPSBkb21zICsgbnNsb3Q7Ci0KLQkJCWlmIChuc2xvdCA9PSBuZG9tcykgewotCQkJCXN0YXRpYyBpbnQgd2FybmluZ3MgPSAxMDsKLQkJCQlpZiAod2FybmluZ3MpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkgInJlYnVpbGRfc2NoZWRfZG9tYWlucyBjb25mdXNlZDoiCi0JCQkJCSAgIiBuc2xvdCAlZCwgbmRvbXMgJWQsIGNzbiAlZCwgaSAlZCwiCi0JCQkJCSAgIiBhcG4gJWRcbiIsCi0JCQkJCSAgbnNsb3QsIG5kb21zLCBjc24sIGksIGFwbik7Ci0JCQkJCXdhcm5pbmdzLS07Ci0JCQkJfQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQljcHVzX2NsZWFyKCpkcCk7Ci0JCQlpZiAoZGF0dHIpCi0JCQkJKihkYXR0ciArIG5zbG90KSA9IFNEX0FUVFJfSU5JVDsKLQkJCWZvciAoaiA9IGk7IGogPCBjc247IGorKykgewotCQkJCXN0cnVjdCBjcHVzZXQgKmIgPSBjc2Fbal07Ci0KLQkJCQlpZiAoYXBuID09IGItPnBuKSB7Ci0JCQkJCWNwdXNfb3IoKmRwLCAqZHAsIGItPmNwdXNfYWxsb3dlZCk7Ci0JCQkJCWItPnBuID0gLTE7Ci0JCQkJCWlmIChkYXR0cikKLQkJCQkJCXVwZGF0ZV9kb21haW5fYXR0cl90cmVlKGRhdHRyCi0JCQkJCQkJCSAgICsgbnNsb3QsIGIpOwotCQkJCX0KLQkJCX0KLQkJCW5zbG90Kys7CisJCWlmIChhcG4gPCAwKSB7CisJCQkvKiBTa2lwIGNvbXBsZXRlZCBwYXJ0aXRpb25zICovCisJCQljb250aW51ZTsKIAkJfQorCisJCWRwID0gZG9tcyArIG5zbG90OworCisJCWlmIChuc2xvdCA9PSBuZG9tcykgeworCQkJc3RhdGljIGludCB3YXJuaW5ncyA9IDEwOworCQkJaWYgKHdhcm5pbmdzKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAicmVidWlsZF9zY2hlZF9kb21haW5zIGNvbmZ1c2VkOiIKKwkJCQkgICIgbnNsb3QgJWQsIG5kb21zICVkLCBjc24gJWQsIGkgJWQsIgorCQkJCSAgIiBhcG4gJWRcbiIsCisJCQkJICBuc2xvdCwgbmRvbXMsIGNzbiwgaSwgYXBuKTsKKwkJCQl3YXJuaW5ncy0tOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQljcHVzX2NsZWFyKCpkcCk7CisJCWlmIChkYXR0cikKKwkJCSooZGF0dHIgKyBuc2xvdCkgPSBTRF9BVFRSX0lOSVQ7CisJCWZvciAoaiA9IGk7IGogPCBjc247IGorKykgeworCQkJc3RydWN0IGNwdXNldCAqYiA9IGNzYVtqXTsKKworCQkJaWYgKGFwbiA9PSBiLT5wbikgeworCQkJCWNwdXNfb3IoKmRwLCAqZHAsIGItPmNwdXNfYWxsb3dlZCk7CisJCQkJaWYgKGRhdHRyKQorCQkJCQl1cGRhdGVfZG9tYWluX2F0dHJfdHJlZShkYXR0ciArIG5zbG90LCBiKTsKKworCQkJCS8qIERvbmUgd2l0aCB0aGlzIHBhcnRpdGlvbiAqLworCQkJCWItPnBuID0gLTE7CisJCQl9CisJCX0KKwkJbnNsb3QrKzsKIAl9CiAJQlVHX09OKG5zbG90ICE9IG5kb21zKTsKIAotcmVidWlsZDoKLQkvKiBIYXZlIHNjaGVkdWxlciByZWJ1aWxkIHNjaGVkIGRvbWFpbnMgKi8KLQlnZXRfb25saW5lX2NwdXMoKTsKLQlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhuZG9tcywgZG9tcywgZGF0dHIpOwotCXB1dF9vbmxpbmVfY3B1cygpOwotCiBkb25lOgogCWtmcmVlKGNzYSk7Ci0JLyogRG9uJ3Qga2ZyZWUoZG9tcykgLS0gcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKSBkb2VzIHRoYXQuICovCi0JLyogRG9uJ3Qga2ZyZWUoZGF0dHIpIC0tIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkgZG9lcyB0aGF0LiAqLworCisJKmRvbWFpbnMgICAgPSBkb21zOworCSphdHRyaWJ1dGVzID0gZGF0dHI7CisJcmV0dXJuIG5kb21zOworfQorCisvKgorICogUmVidWlsZCBzY2hlZHVsZXIgZG9tYWlucy4KKyAqCisgKiBDYWxsIHdpdGggbmVpdGhlciBjZ3JvdXBfbXV0ZXggaGVsZCBub3Igd2l0aGluIGdldF9vbmxpbmVfY3B1cygpLgorICogVGFrZXMgYm90aCBjZ3JvdXBfbXV0ZXggYW5kIGdldF9vbmxpbmVfY3B1cygpLgorICoKKyAqIENhbm5vdCBiZSBkaXJlY3RseSBjYWxsZWQgZnJvbSBjcHVzZXQgY29kZSBoYW5kbGluZyBjaGFuZ2VzCisgKiB0byB0aGUgY3B1c2V0IHBzZXVkby1maWxlc3lzdGVtLCBiZWNhdXNlIGl0IGNhbm5vdCBiZSBjYWxsZWQKKyAqIGZyb20gY29kZSB0aGF0IGFscmVhZHkgaG9sZHMgY2dyb3VwX211dGV4LgorICovCitzdGF0aWMgdm9pZCBkb19yZWJ1aWxkX3NjaGVkX2RvbWFpbnMoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVzZWQpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyOworCWNwdW1hc2tfdCAqZG9tczsKKwlpbnQgbmRvbXM7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKworCS8qIEdlbmVyYXRlIGRvbWFpbiBtYXNrcyBhbmQgYXR0cnMgKi8KKwljZ3JvdXBfbG9jaygpOworCW5kb21zID0gZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygmZG9tcywgJmF0dHIpOworCWNncm91cF91bmxvY2soKTsKKworCS8qIEhhdmUgc2NoZWR1bGVyIHJlYnVpbGQgdGhlIGRvbWFpbnMgKi8KKwlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhuZG9tcywgZG9tcywgYXR0cik7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhyZWJ1aWxkX3NjaGVkX2RvbWFpbnNfd29yaywgZG9fcmVidWlsZF9zY2hlZF9kb21haW5zKTsKKworLyoKKyAqIFJlYnVpbGQgc2NoZWR1bGVyIGRvbWFpbnMsIGFzeW5jaHJvbm91c2x5IHZpYSB3b3JrcXVldWUuCisgKgorICogSWYgdGhlIGZsYWcgJ3NjaGVkX2xvYWRfYmFsYW5jZScgb2YgYW55IGNwdXNldCB3aXRoIG5vbi1lbXB0eQorICogJ2NwdXMnIGNoYW5nZXMsIG9yIGlmIHRoZSAnY3B1cycgYWxsb3dlZCBjaGFuZ2VzIGluIGFueSBjcHVzZXQKKyAqIHdoaWNoIGhhcyB0aGF0IGZsYWcgZW5hYmxlZCwgb3IgaWYgYW55IGNwdXNldCB3aXRoIGEgbm9uLWVtcHR5CisgKiAnY3B1cycgaXMgcmVtb3ZlZCwgdGhlbiBjYWxsIHRoaXMgcm91dGluZSB0byByZWJ1aWxkIHRoZQorICogc2NoZWR1bGVyJ3MgZHluYW1pYyBzY2hlZCBkb21haW5zLgorICoKKyAqIFRoZSByZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKSBhbmQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKQorICogcm91dGluZXMgbXVzdCBuZXN0IGNncm91cF9sb2NrKCkgaW5zaWRlIGdldF9vbmxpbmVfY3B1cygpLAorICogYnV0IHN1Y2ggY3B1c2V0IGNoYW5nZXMgYXMgdGhlc2UgbXVzdCBuZXN0IHRoYXQgbG9ja2luZyB0aGUKKyAqIG90aGVyIHdheSwgaG9sZGluZyBjZ3JvdXBfbG9jaygpIGZvciBtdWNoIG9mIHRoZSBjb2RlLgorICoKKyAqIFNvIGluIG9yZGVyIHRvIGF2b2lkIGFuIEFCQkEgZGVhZGxvY2ssIHRoZSBjcHVzZXQgY29kZSBoYW5kbGluZworICogdGhlc2UgdXNlciBjaGFuZ2VzIGRlbGVnYXRlcyB0aGUgYWN0dWFsIHNjaGVkIGRvbWFpbiByZWJ1aWxkaW5nCisgKiB0byBhIHNlcGFyYXRlIHdvcmtxdWV1ZSB0aHJlYWQsIHdoaWNoIGVuZHMgdXAgcHJvY2Vzc2luZyB0aGUKKyAqIGFib3ZlIGRvX3JlYnVpbGRfc2NoZWRfZG9tYWlucygpIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBhc3luY19yZWJ1aWxkX3NjaGVkX2RvbWFpbnModm9pZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZyZWJ1aWxkX3NjaGVkX2RvbWFpbnNfd29yayk7Cit9CisKKy8qCisgKiBBY2NvbXBsaXNoZXMgdGhlIHNhbWUgc2NoZWR1bGVyIGRvbWFpbiByZWJ1aWxkIGFzIHRoZSBhYm92ZQorICogYXN5bmNfcmVidWlsZF9zY2hlZF9kb21haW5zKCksIGhvd2V2ZXIgaXQgZGlyZWN0bHkgY2FsbHMgdGhlCisgKiByZWJ1aWxkIHJvdXRpbmUgc3luY2hyb25vdXNseSByYXRoZXIgdGhhbiBjYWxsaW5nIGl0IHZpYSBhbgorICogYXN5bmNocm9ub3VzIHdvcmsgdGhyZWFkLgorICoKKyAqIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gY29kZSB0aGF0IGlzIG5vdCBob2xkaW5nCisgKiBjZ3JvdXBfbXV0ZXggKG5vdCBuZXN0ZWQgaW4gYSBjZ3JvdXBfbG9jaygpIGNhbGwuKQorICovCit2b2lkIHJlYnVpbGRfc2NoZWRfZG9tYWlucyh2b2lkKQoreworCWRvX3JlYnVpbGRfc2NoZWRfZG9tYWlucyhOVUxMKTsKIH0KIAogLyoqCkBAIC03NzQsMzcgKzg0MywyNSBAQAogLyoqCiAgKiB1cGRhdGVfdGFza3NfY3B1bWFzayAtIFVwZGF0ZSB0aGUgY3B1bWFza3Mgb2YgdGFza3MgaW4gdGhlIGNwdXNldC4KICAqIEBjczogdGhlIGNwdXNldCBpbiB3aGljaCBlYWNoIHRhc2sncyBjcHVzX2FsbG93ZWQgbWFzayBuZWVkcyB0byBiZSBjaGFuZ2VkCisgKiBAaGVhcDogaWYgTlVMTCwgZGVmZXIgYWxsb2NhdGluZyBoZWFwIG1lbW9yeSB0byBjZ3JvdXBfc2Nhbl90YXNrcygpCiAgKgogICogQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQKICAqCiAgKiBUaGUgY2dyb3VwX3NjYW5fdGFza3MoKSBmdW5jdGlvbiB3aWxsIHNjYW4gYWxsIHRoZSB0YXNrcyBpbiBhIGNncm91cCwKICAqIGNhbGxpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoLgogICoKLSAqIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC1lcnJubyBpZiBub3QuCisgKiBObyByZXR1cm4gdmFsdWUuIEl0J3MgZ3VhcmFudGVlZCB0aGF0IGNncm91cF9zY2FuX3Rhc2tzKCkgYWx3YXlzIHJldHVybnMgMAorICogaWYgQGhlYXAgIT0gTlVMTC4KICAqLwotc3RhdGljIGludCB1cGRhdGVfdGFza3NfY3B1bWFzayhzdHJ1Y3QgY3B1c2V0ICpjcykKK3N0YXRpYyB2b2lkIHVwZGF0ZV90YXNrc19jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBzdHJ1Y3QgcHRyX2hlYXAgKmhlYXApCiB7CiAJc3RydWN0IGNncm91cF9zY2FubmVyIHNjYW47Ci0Jc3RydWN0IHB0cl9oZWFwIGhlYXA7Ci0JaW50IHJldHZhbDsKLQotCS8qCi0JICogY2dyb3VwX3NjYW5fdGFza3MoKSB3aWxsIGluaXRpYWxpemUgaGVhcC0+Z3QgZm9yIHVzLgotCSAqIGhlYXBfaW5pdCgpIGlzIHN0aWxsIG5lZWRlZCBoZXJlIGZvciB3ZSBzaG91bGQgbm90IGNoYW5nZQotCSAqIGNzLT5jcHVzX2FsbG93ZWQgd2hlbiBoZWFwX2luaXQoKSBmYWlscy4KLQkgKi8KLQlyZXR2YWwgPSBoZWFwX2luaXQoJmhlYXAsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCwgTlVMTCk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKIAogCXNjYW4uY2cgPSBjcy0+Y3NzLmNncm91cDsKIAlzY2FuLnRlc3RfdGFzayA9IGNwdXNldF90ZXN0X2NwdW1hc2s7CiAJc2Nhbi5wcm9jZXNzX3Rhc2sgPSBjcHVzZXRfY2hhbmdlX2NwdW1hc2s7Ci0Jc2Nhbi5oZWFwID0gJmhlYXA7Ci0JcmV0dmFsID0gY2dyb3VwX3NjYW5fdGFza3MoJnNjYW4pOwotCi0JaGVhcF9mcmVlKCZoZWFwKTsKLQlyZXR1cm4gcmV0dmFsOworCXNjYW4uaGVhcCA9IGhlYXA7CisJY2dyb3VwX3NjYW5fdGFza3MoJnNjYW4pOwogfQogCiAvKioKQEAgLTgxNCw2ICs4NzEsNyBAQAogICovCiBzdGF0aWMgaW50IHVwZGF0ZV9jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjb25zdCBjaGFyICpidWYpCiB7CisJc3RydWN0IHB0cl9oZWFwIGhlYXA7CiAJc3RydWN0IGNwdXNldCB0cmlhbGNzOwogCWludCByZXR2YWw7CiAJaW50IGlzX2xvYWRfYmFsYW5jZWQ7CkBAIC04NDgsNiArOTA2LDEwIEBACiAJaWYgKGNwdXNfZXF1YWwoY3MtPmNwdXNfYWxsb3dlZCwgdHJpYWxjcy5jcHVzX2FsbG93ZWQpKQogCQlyZXR1cm4gMDsKIAorCXJldHZhbCA9IGhlYXBfaW5pdCgmaGVhcCwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMLCBOVUxMKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCiAJaXNfbG9hZF9iYWxhbmNlZCA9IGlzX3NjaGVkX2xvYWRfYmFsYW5jZSgmdHJpYWxjcyk7CiAKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CkBAIC04NTgsMTIgKzkyMCwxMiBAQAogCSAqIFNjYW4gdGFza3MgaW4gdGhlIGNwdXNldCwgYW5kIHVwZGF0ZSB0aGUgY3B1bWFza3Mgb2YgYW55CiAJICogdGhhdCBuZWVkIGFuIHVwZGF0ZS4KIAkgKi8KLQlyZXR2YWwgPSB1cGRhdGVfdGFza3NfY3B1bWFzayhjcyk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7CisJdXBkYXRlX3Rhc2tzX2NwdW1hc2soY3MsICZoZWFwKTsKKworCWhlYXBfZnJlZSgmaGVhcCk7CiAKIAlpZiAoaXNfbG9hZF9iYWxhbmNlZCkKLQkJcmVidWlsZF9zY2hlZF9kb21haW5zKCk7CisJCWFzeW5jX3JlYnVpbGRfc2NoZWRfZG9tYWlucygpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDkwLDcgKzExNTIsNyBAQAogCWlmICh2YWwgIT0gY3MtPnJlbGF4X2RvbWFpbl9sZXZlbCkgewogCQljcy0+cmVsYXhfZG9tYWluX2xldmVsID0gdmFsOwogCQlpZiAoIWNwdXNfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgJiYgaXNfc2NoZWRfbG9hZF9iYWxhbmNlKGNzKSkKLQkJCXJlYnVpbGRfc2NoZWRfZG9tYWlucygpOworCQkJYXN5bmNfcmVidWlsZF9zY2hlZF9kb21haW5zKCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTMxLDcgKzExOTMsNyBAQAogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCiAJaWYgKGNwdXNfbm9uZW1wdHkgJiYgYmFsYW5jZV9mbGFnX2NoYW5nZWQpCi0JCXJlYnVpbGRfc2NoZWRfZG9tYWlucygpOworCQlhc3luY19yZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ5Miw2ICsxNTU0LDkgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CisKKwkvKiBVbnJlYWNoYWJsZSBidXQgbWFrZXMgZ2NjIGhhcHB5ICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzNjQgY3B1c2V0X3JlYWRfczY0KHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCkKQEAgLTE1MDQsNiArMTU2OSw5IEBACiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQorCisJLyogVW5yZWNoYWJsZSBidXQgbWFrZXMgZ2NjIGhhcHB5ICovCisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTY5MiwxNSArMTc2MCw5IEBACiB9CiAKIC8qCi0gKiBMb2NraW5nIG5vdGUgb24gdGhlIHN0cmFuZ2UgdXBkYXRlX2ZsYWcoKSBjYWxsIGJlbG93OgotICoKICAqIElmIHRoZSBjcHVzZXQgYmVpbmcgcmVtb3ZlZCBoYXMgaXRzIGZsYWcgJ3NjaGVkX2xvYWRfYmFsYW5jZScKICAqIGVuYWJsZWQsIHRoZW4gc2ltdWxhdGUgdHVybmluZyBzY2hlZF9sb2FkX2JhbGFuY2Ugb2ZmLCB3aGljaAotICogd2lsbCBjYWxsIHJlYnVpbGRfc2NoZWRfZG9tYWlucygpLiAgVGhlIGdldF9vbmxpbmVfY3B1cygpCi0gKiBjYWxsIGluIHJlYnVpbGRfc2NoZWRfZG9tYWlucygpIG11c3Qgbm90IGJlIG1hZGUgd2hpbGUgaG9sZGluZwotICogY2FsbGJhY2tfbXV0ZXguICBFbHNld2hlcmUgdGhlIGtlcm5lbCBuZXN0cyBjYWxsYmFja19tdXRleCBpbnNpZGUKLSAqIGdldF9vbmxpbmVfY3B1cygpIGNhbGxzLiAgU28gdGhlIHJldmVyc2UgbmVzdGluZyB3b3VsZCByaXNrIGFuCi0gKiBBQkJBIGRlYWRsb2NrLgorICogd2lsbCBjYWxsIGFzeW5jX3JlYnVpbGRfc2NoZWRfZG9tYWlucygpLgogICovCiAKIHN0YXRpYyB2b2lkIGNwdXNldF9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY29udCkKQEAgLTE3MTksNyArMTc4MSw3IEBACiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBjcHVzZXRfc3Vic3lzID0gewogCS5uYW1lID0gImNwdXNldCIsCiAJLmNyZWF0ZSA9IGNwdXNldF9jcmVhdGUsCi0JLmRlc3Ryb3kgID0gY3B1c2V0X2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBjcHVzZXRfZGVzdHJveSwKIAkuY2FuX2F0dGFjaCA9IGNwdXNldF9jYW5fYXR0YWNoLAogCS5hdHRhY2ggPSBjcHVzZXRfYXR0YWNoLAogCS5wb3B1bGF0ZSA9IGNwdXNldF9wb3B1bGF0ZSwKQEAgLTE4MTEsNyArMTg3Myw3IEBACiB9CiAKIC8qCi0gKiBJZiBjb21tb25fY3B1X21lbV9ob3RwbHVnX3VucGx1ZygpLCBiZWxvdywgdW5wbHVncyBhbnkgQ1BVcworICogSWYgQ1BVIGFuZC9vciBtZW1vcnkgaG90cGx1ZyBoYW5kbGVycywgYmVsb3csIHVucGx1ZyBhbnkgQ1BVcwogICogb3IgbWVtb3J5IG5vZGVzLCB3ZSBuZWVkIHRvIHdhbGsgb3ZlciB0aGUgY3B1c2V0IGhpZXJhcmNoeSwKICAqIHJlbW92aW5nIHRoYXQgQ1BVIG9yIG5vZGUgZnJvbSBhbGwgY3B1c2V0cy4gIElmIHRoaXMgcmVtb3ZlcyB0aGUKICAqIGxhc3QgQ1BVIG9yIG5vZGUgZnJvbSBhIGNwdXNldCwgdGhlbiBtb3ZlIHRoZSB0YXNrcyBpbiB0aGUgZW1wdHkKQEAgLTE4NTksNyArMTkyMSw3IEBACiAgKiB0aGF0IGhhcyB0YXNrcyBhbG9uZyB3aXRoIGFuIGVtcHR5ICdtZW1zJy4gIEJ1dCBpZiB3ZSBkaWQgc2VlIHN1Y2gKICAqIGEgY3B1c2V0LCB3ZSdkIGhhbmRsZSBpdCBqdXN0IGxpa2Ugd2UgZG8gaWYgaXRzICdjcHVzJyB3YXMgZW1wdHkuCiAgKi8KLXN0YXRpYyB2b2lkIHNjYW5fZm9yX2VtcHR5X2NwdXNldHMoY29uc3Qgc3RydWN0IGNwdXNldCAqcm9vdCkKK3N0YXRpYyB2b2lkIHNjYW5fZm9yX2VtcHR5X2NwdXNldHMoc3RydWN0IGNwdXNldCAqcm9vdCkKIHsKIAlMSVNUX0hFQUQocXVldWUpOwogCXN0cnVjdCBjcHVzZXQgKmNwOwkvKiBzY2FucyBjcHVzZXRzIGJlaW5nIHVwZGF0ZWQgKi8KQEAgLTE4OTYsNDIgKzE5NTgsMTMgQEAKIAkJICAgICBub2Rlc19lbXB0eShjcC0+bWVtc19hbGxvd2VkKSkKIAkJCXJlbW92ZV90YXNrc19pbl9lbXB0eV9jcHVzZXQoY3ApOwogCQllbHNlIHsKLQkJCXVwZGF0ZV90YXNrc19jcHVtYXNrKGNwKTsKKwkJCXVwZGF0ZV90YXNrc19jcHVtYXNrKGNwLCBOVUxMKTsKIAkJCXVwZGF0ZV90YXNrc19ub2RlbWFzayhjcCwgJm9sZG1lbXMpOwogCQl9CiAJfQogfQogCiAvKgotICogVGhlIGNwdXNfYWxsb3dlZCBhbmQgbWVtc19hbGxvd2VkIG5vZGVtYXNrcyBpbiB0aGUgdG9wX2NwdXNldCB0cmFjawotICogY3B1X29ubGluZV9tYXAgYW5kIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldLiAgRm9yY2UgdGhlIHRvcCBjcHVzZXQgdG8KLSAqIHRyYWNrIHdoYXQncyBvbmxpbmUgYWZ0ZXIgYW55IENQVSBvciBtZW1vcnkgbm9kZSBob3RwbHVnIG9yIHVucGx1ZyBldmVudC4KLSAqCi0gKiBTaW5jZSB0aGVyZSBhcmUgdHdvIGNhbGxlcnMgb2YgdGhpcyByb3V0aW5lLCBvbmUgZm9yIENQVSBob3RwbHVnCi0gKiBldmVudHMgYW5kIG9uZSBmb3IgbWVtb3J5IG5vZGUgaG90cGx1ZyBldmVudHMsIHdlIGNvdWxkIGhhdmUgY29kZWQKLSAqIHR3byBzZXBhcmF0ZSByb3V0aW5lcyBoZXJlLiAgV2UgY29kZSBpdCBhcyBhIHNpbmdsZSBjb21tb24gcm91dGluZQotICogaW4gb3JkZXIgdG8gbWluaW1pemUgdGV4dCBzaXplLgotICovCi0KLXN0YXRpYyB2b2lkIGNvbW1vbl9jcHVfbWVtX2hvdHBsdWdfdW5wbHVnKGludCByZWJ1aWxkX3NkKQotewotCWNncm91cF9sb2NrKCk7Ci0KLQl0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCA9IGNwdV9vbmxpbmVfbWFwOwotCXRvcF9jcHVzZXQubWVtc19hbGxvd2VkID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07Ci0Jc2Nhbl9mb3JfZW1wdHlfY3B1c2V0cygmdG9wX2NwdXNldCk7Ci0KLQkvKgotCSAqIFNjaGVkdWxlciBkZXN0cm95cyBkb21haW5zIG9uIGhvdHBsdWcgZXZlbnRzLgotCSAqIFJlYnVpbGQgdGhlbSBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5ncy4KLQkgKi8KLQlpZiAocmVidWlsZF9zZCkKLQkJcmVidWlsZF9zY2hlZF9kb21haW5zKCk7Ci0KLQljZ3JvdXBfdW5sb2NrKCk7Ci19Ci0KLS8qCiAgKiBUaGUgdG9wX2NwdXNldCB0cmFja3Mgd2hhdCBDUFVzIGFuZCBNZW1vcnkgTm9kZXMgYXJlIG9ubGluZSwKICAqIHBlcmlvZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1ha2UgY3B1c2V0cyB0cmFuc3BhcmVudAogICogKG9mIG5vIGFmZmVjdCkgb24gc3lzdGVtcyB0aGF0IGFyZSBhY3RpdmVseSB1c2luZyBDUFUgaG90cGx1ZwpAQCAtMTkzOSw0MCArMTk3Miw1MiBAQAogICoKICAqIFRoaXMgcm91dGluZSBlbnN1cmVzIHRoYXQgdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQgdHJhY2tzCiAgKiBjcHVfb25saW5lX21hcCBvbiBlYWNoIENQVSBob3RwbHVnIChjcHVocCkgZXZlbnQuCisgKgorICogQ2FsbGVkIHdpdGhpbiBnZXRfb25saW5lX2NwdXMoKS4gIE5lZWRzIHRvIGNhbGwgY2dyb3VwX2xvY2soKQorICogYmVmb3JlIGNhbGxpbmcgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygpLgogICovCi0KLXN0YXRpYyBpbnQgY3B1c2V0X2hhbmRsZV9jcHVocChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZF9uYiwKK3N0YXRpYyBpbnQgY3B1c2V0X3RyYWNrX29ubGluZV9jcHVzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkX25iLAogCQkJCXVuc2lnbmVkIGxvbmcgcGhhc2UsIHZvaWQgKnVudXNlZF9jcHUpCiB7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyOworCWNwdW1hc2tfdCAqZG9tczsKKwlpbnQgbmRvbXM7CisKIAlzd2l0Y2ggKHBoYXNlKSB7Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKIAljYXNlIENQVV9PTkxJTkU6CiAJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQljb21tb25fY3B1X21lbV9ob3RwbHVnX3VucGx1ZygxKTsKIAkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAJfQogCisJY2dyb3VwX2xvY2soKTsKKwl0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCA9IGNwdV9vbmxpbmVfbWFwOworCXNjYW5fZm9yX2VtcHR5X2NwdXNldHMoJnRvcF9jcHVzZXQpOworCW5kb21zID0gZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygmZG9tcywgJmF0dHIpOworCWNncm91cF91bmxvY2soKTsKKworCS8qIEhhdmUgc2NoZWR1bGVyIHJlYnVpbGQgdGhlIGRvbWFpbnMgKi8KKwlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhuZG9tcywgZG9tcywgYXR0cik7CisKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCiAvKgogICogS2VlcCB0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCB0cmFja2luZyBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXS4KLSAqIENhbGwgdGhpcyByb3V0aW5lIGFueXRpbWUgYWZ0ZXIgeW91IGNoYW5nZQotICogbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0uCi0gKiBTZWUgYWxzbyB0aGUgcHJldmlvdXMgcm91dGluZSBjcHVzZXRfaGFuZGxlX2NwdWhwKCkuCisgKiBDYWxsIHRoaXMgcm91dGluZSBhbnl0aW1lIGFmdGVyIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldIGNoYW5nZXMuCisgKiBTZWUgYWxzbyB0aGUgcHJldmlvdXMgcm91dGluZSBjcHVzZXRfdHJhY2tfb25saW5lX2NwdXMoKS4KICAqLwotCiB2b2lkIGNwdXNldF90cmFja19vbmxpbmVfbm9kZXModm9pZCkKIHsKLQljb21tb25fY3B1X21lbV9ob3RwbHVnX3VucGx1ZygwKTsKKwljZ3JvdXBfbG9jaygpOworCXRvcF9jcHVzZXQubWVtc19hbGxvd2VkID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CisJc2Nhbl9mb3JfZW1wdHlfY3B1c2V0cygmdG9wX2NwdXNldCk7CisJY2dyb3VwX3VubG9jaygpOwogfQogI2VuZGlmCiAKQEAgLTE5ODcsNyArMjAzMiw3IEBACiAJdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQgPSBjcHVfb25saW5lX21hcDsKIAl0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOwogCi0JaG90Y3B1X25vdGlmaWVyKGNwdXNldF9oYW5kbGVfY3B1aHAsIDApOworCWhvdGNwdV9ub3RpZmllcihjcHVzZXRfdHJhY2tfb25saW5lX2NwdXMsIDApOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9kbWEtY29oZXJlbnQuYyBiL2tlcm5lbC9kbWEtY29oZXJlbnQuYwppbmRleCBjMWQ0ZDViLi5mMDEzYTBjIDEwMDY0NAotLS0gYS9rZXJuZWwvZG1hLWNvaGVyZW50LmMKKysrIGIva2VybmVsL2RtYS1jb2hlcmVudC5jCkBAIC0xMjQsNiArMTI0LDcgQEAKIAl9CiAJcmV0dXJuIChtZW0gIT0gTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKGRtYV9hbGxvY19mcm9tX2NvaGVyZW50KTsKIAogLyoqCiAgKiBkbWFfcmVsZWFzZV9mcm9tX2NvaGVyZW50KCkgLSB0cnkgdG8gZnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmcm9tIHBlci1kZXZpY2UgY29oZXJlbnQgbWVtb3J5IHBvb2wKQEAgLTE1MSwzICsxNTIsNCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1hX3JlbGVhc2VfZnJvbV9jb2hlcmVudCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZG1hLmMgYi9rZXJuZWwvZG1hLmMKaW5kZXggZDJjNjBhOC4uZjkwMzE4OSAxMDA2NDQKLS0tIGEva2VybmVsL2RtYS5jCisrKyBiL2tlcm5lbC9kbWEuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogZG1hLmMsdiAxLjcgMTk5NC8xMi8yOCAwMzozNTozMyByb290IEV4cCByb290ICQKKy8qCiAgKiBsaW51eC9rZXJuZWwvZG1hLmM6IEEgRE1BIGNoYW5uZWwgYWxsb2NhdG9yLiBJbnNwaXJlZCBieSBsaW51eC9rZXJuZWwvaXJxLmMuCiAgKgogICogV3JpdHRlbiBieSBIZW5udXMgQmVyZ21hbiwgMTk5Mi4KZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IDE2Mzk1NjQuLjBlZjQ2NzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNTgzLDggKzU4Myw2IEBACiAJICogSWYgdGhlcmUgYXJlIG90aGVyIHVzZXJzIG9mIHRoZSBtbSBhbmQgdGhlIG93bmVyICh1cykgaXMgZXhpdGluZwogCSAqIHdlIG5lZWQgdG8gZmluZCBhIG5ldyBvd25lciB0byB0YWtlIG9uIHRoZSByZXNwb25zaWJpbGl0eS4KIAkgKi8KLQlpZiAoIW1tKQotCQlyZXR1cm4gMDsKIAlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPD0gMSkKIAkJcmV0dXJuIDA7CiAJaWYgKG1tLT5vd25lciAhPSBwKQpAQCAtNjI3LDI5ICs2MjUsMzggQEAKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIGMpOwogCiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCS8qCisJICogV2UgZm91bmQgbm8gb3duZXIgeWV0IG1tX3VzZXJzID4gMTogdGhpcyBpbXBsaWVzIHRoYXQgd2UgYXJlCisJICogbW9zdCBsaWtlbHkgcmFjaW5nIHdpdGggc3dhcG9mZiAodHJ5X3RvX3VudXNlKCkpIG9yIC9wcm9jIG9yCisJICogcHRyYWNlIG9yIHBhZ2UgbWlncmF0aW9uIChnZXRfdGFza19tbSgpKS4gIE1hcmsgb3duZXIgYXMgTlVMTCwKKwkgKiBzbyB0aGF0IHN1YnN5c3RlbXMgY2FuIHVuZGVyc3RhbmQgdGhlIGNhbGxiYWNrIGFuZCB0YWtlIGFjdGlvbi4KKwkgKi8KKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWNncm91cF9tbV9vd25lcl9jYWxsYmFja3MobW0tPm93bmVyLCBOVUxMKTsKKwltbS0+b3duZXIgPSBOVUxMOworCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybjsKIAogYXNzaWduX25ld19vd25lcjoKIAlCVUdfT04oYyA9PSBwKTsKIAlnZXRfdGFza19zdHJ1Y3QoYyk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJLyoKIAkgKiBUaGUgdGFza19sb2NrIHByb3RlY3RzIGMtPm1tIGZyb20gY2hhbmdpbmcuCiAJICogV2UgYWx3YXlzIHdhbnQgbW0tPm93bmVyLT5tbSA9PSBtbQogCSAqLwogCXRhc2tfbG9jayhjKTsKLQkvKgotCSAqIERlbGF5IHJlYWRfdW5sb2NrKCkgdGlsbCB3ZSBoYXZlIHRoZSB0YXNrX2xvY2soKQotCSAqIHRvIGVuc3VyZSB0aGF0IGMgZG9lcyBub3Qgc2xpcCBhd2F5IHVuZGVybmVhdGggdXMKLQkgKi8KLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJaWYgKGMtPm1tICE9IG1tKSB7CiAJCXRhc2tfdW5sb2NrKGMpOworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAkJcHV0X3Rhc2tfc3RydWN0KGMpOwogCQlnb3RvIHJldHJ5OwogCX0KIAljZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKG1tLT5vd25lciwgYyk7CiAJbW0tPm93bmVyID0gYzsKIAl0YXNrX3VubG9jayhjKTsKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlwdXRfdGFza19zdHJ1Y3QoYyk7CiB9CiAjZW5kaWYgLyogQ09ORklHX01NX09XTkVSICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA0MzA4ZDc1Li4zN2IzZTE1IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTgwMiw2ICs4MDIsNyBAQAogCiAJc2lnLT5sZWFkZXIgPSAwOwkvKiBzZXNzaW9uIGxlYWRlcnNoaXAgZG9lc24ndCBpbmhlcml0ICovCiAJc2lnLT50dHlfb2xkX3BncnAgPSBOVUxMOworCXNpZy0+dHR5ID0gTlVMTDsKIAogCXNpZy0+dXRpbWUgPSBzaWctPnN0aW1lID0gc2lnLT5jdXRpbWUgPSBzaWctPmNzdGltZSA9IGNwdXRpbWVfemVybzsKIAlzaWctPmd0aW1lID0gY3B1dGltZV96ZXJvOwpAQCAtODM4LDYgKzgzOSw3IEBACiB2b2lkIF9fY2xlYW51cF9zaWduYWwoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHsKIAlleGl0X3RocmVhZF9ncm91cF9rZXlzKHNpZyk7CisJdHR5X2tyZWZfcHV0KHNpZy0+dHR5KTsKIAlrbWVtX2NhY2hlX2ZyZWUoc2lnbmFsX2NhY2hlcCwgc2lnKTsKIH0KIApAQCAtMTIyOSw3ICsxMjMxLDggQEAKIAkJCQlwLT5uc3Byb3h5LT5waWRfbnMtPmNoaWxkX3JlYXBlciA9IHA7CiAKIAkJCXAtPnNpZ25hbC0+bGVhZGVyX3BpZCA9IHBpZDsKLQkJCXAtPnNpZ25hbC0+dHR5ID0gY3VycmVudC0+c2lnbmFsLT50dHk7CisJCQl0dHlfa3JlZl9wdXQocC0+c2lnbmFsLT50dHkpOworCQkJcC0+c2lnbmFsLT50dHkgPSB0dHlfa3JlZl9nZXQoY3VycmVudC0+c2lnbmFsLT50dHkpOwogCQkJc2V0X3Rhc2tfcGdycChwLCB0YXNrX3BncnBfbnIoY3VycmVudCkpOwogCQkJc2V0X3Rhc2tfc2Vzc2lvbihwLCB0YXNrX3Nlc3Npb25fbnIoY3VycmVudCkpOwogCQkJYXR0YWNoX3BpZChwLCBQSURUWVBFX1BHSUQsIHRhc2tfcGdycChjdXJyZW50KSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAyYmQyMzBiLi41MWVlOTBiIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTY3MiwxMyArNjcyLDE0IEBACiAJCQkgKi8KIAkJCUJVR19PTih0aW1lci0+ZnVuY3Rpb24odGltZXIpICE9IEhSVElNRVJfTk9SRVNUQVJUKTsKIAkJCXJldHVybiAxOwotCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJROgorCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFU6CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFX1VOTE9DS0VEOgogCQkJLyoKIAkJCSAqIFRoaXMgaXMgc29sZWx5IGZvciB0aGUgc2NoZWQgdGljayBlbXVsYXRpb24gd2l0aAogCQkJICogZHluYW1pYyB0aWNrIHN1cHBvcnQgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90CiAJCQkgKiByZXN0YXJ0IHRoZSB0aWNrIHJpZ2h0IG9uIHRoZSBlZGdlIGFuZCBlbmQgdXAgd2l0aAogCQkJICogdGhlIHRpY2sgdGltZXIgaW4gdGhlIHNvZnRpcnEgISBUaGUgY2FsbGluZyBzaXRlCi0JCQkgKiB0YWtlcyBjYXJlIG9mIHRoaXMuCisJCQkgKiB0YWtlcyBjYXJlIG9mIHRoaXMuIEFsc28gdXNlZCBmb3IgaHJ0aW1lciBzbGVlcGVyICEKIAkJCSAqLwogCQkJZGVidWdfaHJ0aW1lcl9kZWFjdGl2YXRlKHRpbWVyKTsKIAkJCXJldHVybiAxOwpAQCAtMTI2Niw3ICsxMjY3LDggQEAKIAl0aW1lcl9zdGF0c19hY2NvdW50X2hydGltZXIodGltZXIpOwogCiAJZm4gPSB0aW1lci0+ZnVuY3Rpb247Ci0JaWYgKHRpbWVyLT5jYl9tb2RlID09IEhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJRKSB7CisJaWYgKHRpbWVyLT5jYl9tb2RlID09IEhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFUgfHwKKwkgICAgdGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9JUlFTQUZFX1VOTE9DS0VEKSB7CiAJCS8qCiAJCSAqIFVzZWQgZm9yIHNjaGVkdWxlciB0aW1lcnMsIGF2b2lkIGxvY2sgaW52ZXJzaW9uIHdpdGgKIAkJICogcnEtPmxvY2sgYW5kIHRhc2tsaXN0X2xvY2suCkBAIC0xNTE3LDcgKzE1MTksNyBAQAogCXNsLT50aW1lci5mdW5jdGlvbiA9IGhydGltZXJfd2FrZXVwOwogCXNsLT50YXNrID0gdGFzazsKICNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCi0Jc2wtPnRpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfTk9fU09GVElSUTsKKwlzbC0+dGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRDsKICNlbmRpZgogfQogCkBAIC0xNjYxLDI5ICsxNjYzLDk1IEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVyX2xpc3Qoc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqb2xkX2Jhc2UsCi0JCQkJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqbmV3X2Jhc2UpCitzdGF0aWMgaW50IG1pZ3JhdGVfaHJ0aW1lcl9saXN0KHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm9sZF9iYXNlLAorCQkJCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlLCBpbnQgZGNwdSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJaW50IHJhaXNlID0gMDsKIAogCXdoaWxlICgobm9kZSA9IHJiX2ZpcnN0KCZvbGRfYmFzZS0+YWN0aXZlKSkpIHsKIAkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CiAJCUJVR19PTihocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKTsKIAkJZGVidWdfaHJ0aW1lcl9kZWFjdGl2YXRlKHRpbWVyKTsKLQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUsIDApOworCisJCS8qCisJCSAqIFNob3VsZCBub3QgaGFwcGVuLiBQZXIgQ1BVIHRpbWVycyBzaG91bGQgYmUKKwkJICogY2FuY2VsZWQgX2JlZm9yZV8gdGhlIG1pZ3JhdGlvbiBjb2RlIGlzIGNhbGxlZAorCQkgKi8KKwkJaWYgKHRpbWVyLT5jYl9tb2RlID09IEhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFUpIHsKKwkJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIG9sZF9iYXNlLAorCQkJCQkgSFJUSU1FUl9TVEFURV9JTkFDVElWRSwgMCk7CisJCQlXQVJOKDEsICJocnRpbWVyICglcCAlcClhY3RpdmUgYnV0IGNwdSAlZCBkZWFkXG4iLAorCQkJICAgICB0aW1lciwgdGltZXItPmZ1bmN0aW9uLCBkY3B1KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogTWFyayBpdCBhcyBTVEFURV9NSUdSQVRFIG5vdCBJTkFDVElWRSBvdGhlcndpc2UgdGhlCisJCSAqIHRpbWVyIGNvdWxkIGJlIHNlZW4gYXMgIWFjdGl2ZSBhbmQganVzdCB2YW5pc2ggYXdheQorCQkgKiB1bmRlciB1cyBvbiBhbm90aGVyIENQVQorCQkgKi8KKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfTUlHUkFURSwgMCk7CiAJCXRpbWVyLT5iYXNlID0gbmV3X2Jhc2U7CiAJCS8qCiAJCSAqIEVucXVldWUgdGhlIHRpbWVyLiBBbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudCBkZXZpY2UKIAkJICovCiAJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIDEpOworCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCQkvKgorCQkgKiBIYXBwZW5zIHdpdGggaGlnaCByZXMgZW5hYmxlZCB3aGVuIHRoZSB0aW1lciB3YXMKKwkJICogYWxyZWFkeSBleHBpcmVkIGFuZCB0aGUgY2FsbGJhY2sgbW9kZSBpcworCQkgKiBIUlRJTUVSX0NCX0lSUVNBRkVfVU5MT0NLRUQgKGhydGltZXJfc2xlZXBlcikuIFRoZQorCQkgKiBlbnF1ZXVlIGNvZGUgZG9lcyBub3QgbW92ZSB0aGVtIHRvIHRoZSBzb2Z0IGlycQorCQkgKiBwZW5kaW5nIGxpc3QgZm9yIHBlcmZvcm1hbmNlL2xhdGVuY3kgcmVhc29ucywgYnV0CisJCSAqIGluIHRoZSBtaWdyYXRpb24gc3RhdGUsIHdlIG5lZWQgdG8gZG8gdGhhdAorCQkgKiBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggYSBzdGFsZSB0aW1lci4KKwkJICovCisJCWlmICh0aW1lci0+c3RhdGUgPT0gSFJUSU1FUl9TVEFURV9NSUdSQVRFKSB7CisJCQl0aW1lci0+c3RhdGUgPSBIUlRJTUVSX1NUQVRFX1BFTkRJTkc7CisJCQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+Y2JfZW50cnksCisJCQkJICAgICAgJm5ld19iYXNlLT5jcHVfYmFzZS0+Y2JfcGVuZGluZyk7CisJCQlyYWlzZSA9IDE7CisJCX0KKyNlbmRpZgorCQkvKiBDbGVhciB0aGUgbWlncmF0aW9uIHN0YXRlIGJpdCAqLworCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfTUlHUkFURTsKIAl9CisJcmV0dXJuIHJhaXNlOwogfQogCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsCisJCQkJICAgc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKm5ld19iYXNlKQoreworCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKwlpbnQgcmFpc2UgPSAwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZvbGRfYmFzZS0+Y2JfcGVuZGluZykpIHsKKwkJdGltZXIgPSBsaXN0X2VudHJ5KG9sZF9iYXNlLT5jYl9wZW5kaW5nLm5leHQsCisJCQkJICAgc3RydWN0IGhydGltZXIsIGNiX2VudHJ5KTsKKworCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCB0aW1lci0+YmFzZSwgSFJUSU1FUl9TVEFURV9QRU5ESU5HLCAwKTsKKwkJdGltZXItPmJhc2UgPSAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbdGltZXItPmJhc2UtPmluZGV4XTsKKwkJbGlzdF9hZGRfdGFpbCgmdGltZXItPmNiX2VudHJ5LCAmbmV3X2Jhc2UtPmNiX3BlbmRpbmcpOworCQlyYWlzZSA9IDE7CisJfQorCXJldHVybiByYWlzZTsKK30KKyNlbHNlCitzdGF0aWMgaW50IG1pZ3JhdGVfaHJ0aW1lcl9wZW5kaW5nKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpvbGRfYmFzZSwKKwkJCQkgICBzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqbmV3X2Jhc2UpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVycyhpbnQgY3B1KQogewogCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpvbGRfYmFzZSwgKm5ld19iYXNlOwotCWludCBpOworCWludCBpLCByYWlzZSA9IDA7CiAKIAlCVUdfT04oY3B1X29ubGluZShjcHUpKTsKIAlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CkBAIC0xNjk2LDE0ICsxNzY0LDIxIEBACiAJc3Bpbl9sb2NrX25lc3RlZCgmb2xkX2Jhc2UtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWZvciAoaSA9IDA7IGkgPCBIUlRJTUVSX01BWF9DTE9DS19CQVNFUzsgaSsrKSB7Ci0JCW1pZ3JhdGVfaHJ0aW1lcl9saXN0KCZvbGRfYmFzZS0+Y2xvY2tfYmFzZVtpXSwKLQkJCQkgICAgICZuZXdfYmFzZS0+Y2xvY2tfYmFzZVtpXSk7CisJCWlmIChtaWdyYXRlX2hydGltZXJfbGlzdCgmb2xkX2Jhc2UtPmNsb2NrX2Jhc2VbaV0sCisJCQkJCSAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbaV0sIGNwdSkpCisJCQlyYWlzZSA9IDE7CiAJfQogCisJaWYgKG1pZ3JhdGVfaHJ0aW1lcl9wZW5kaW5nKG9sZF9iYXNlLCBuZXdfYmFzZSkpCisJCXJhaXNlID0gMTsKKwogCXNwaW5fdW5sb2NrKCZvbGRfYmFzZS0+bG9jayk7CiAJc3Bpbl91bmxvY2soJm5ld19iYXNlLT5sb2NrKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcHV0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisKKwlpZiAocmFpc2UpCisJCWhydGltZXJfcmFpc2Vfc29mdGlycSgpOwogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCAwMzE0MDc0Li42MGM0OWUzIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTg5LDcgKzg5LDE0IEBACiAJc2V0X2JhbGFuY2VfaXJxX2FmZmluaXR5KGlycSwgY3B1bWFzayk7CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQotCXNldF9wZW5kaW5nX2lycShpcnEsIGNwdW1hc2spOworCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfTU9WRV9QQ05UWFQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCX0gZWxzZQorCQlzZXRfcGVuZGluZ19pcnEoaXJxLCBjcHVtYXNrKTsKICNlbHNlCiAJZGVzYy0+YWZmaW5pdHkgPSBjcHVtYXNrOwogCWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsIGNwdW1hc2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2thbGxzeW1zLmMgYi9rZXJuZWwva2FsbHN5bXMuYwppbmRleCAzOGZjMTBhLi41MDcyY2YxIDEwMDY0NAotLS0gYS9rZXJuZWwva2FsbHN5bXMuYworKysgYi9rZXJuZWwva2FsbHN5bXMuYwpAQCAtMjYwLDcgKzI2MCw2IEBACiAJLyogc2VlIGlmIGl0J3MgaW4gYSBtb2R1bGUgKi8KIAlyZXR1cm4gbW9kdWxlX2FkZHJlc3NfbG9va3VwKGFkZHIsIHN5bWJvbHNpemUsIG9mZnNldCwgbW9kbmFtZSwKIAkJCQkgICAgIG5hbWVidWYpOwotCXJldHVybiBOVUxMOwogfQogCiBpbnQgbG9va3VwX3N5bWJvbF9uYW1lKHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqc3ltbmFtZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZXhlYy5jIGIva2VybmVsL2tleGVjLmMKaW5kZXggNTlmM2YwZGYzLi5hZWYyNjUzIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtNzUzLDggKzc1MywxNCBAQAogCQkJKm9sZCA9IGFkZHIgfCAoKm9sZCAmIH5QQUdFX01BU0spOwogCiAJCQkvKiBUaGUgb2xkIHBhZ2UgSSBoYXZlIGZvdW5kIGNhbm5vdCBiZSBhCi0JCQkgKiBkZXN0aW5hdGlvbiBwYWdlLCBzbyByZXR1cm4gaXQuCisJCQkgKiBkZXN0aW5hdGlvbiBwYWdlLCBzbyByZXR1cm4gaXQgaWYgaXQncworCQkJICogZ2ZwX2ZsYWdzIGhvbm9yIHRoZSBvbmVzIHBhc3NlZCBpbi4KIAkJCSAqLworCQkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9ISUdITUVNKSAmJgorCQkJICAgIFBhZ2VIaWdoTWVtKG9sZF9wYWdlKSkgeworCQkJCWtpbWFnZV9mcmVlX3BhZ2VzKG9sZF9wYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWFkZHIgPSBvbGRfYWRkcjsKIAkJCXBhZ2UgPSBvbGRfcGFnZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEva2VybmVsL2tnZGIuYyBiL2tlcm5lbC9rZ2RiLmMKaW5kZXggZWFhMjFmYy4uZTRkY2ZiMiAxMDA2NDQKLS0tIGEva2VybmVsL2tnZGIuYworKysgYi9rZXJuZWwva2dkYi5jCkBAIC00ODgsNyArNDg4LDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJCWlmIChDQUNIRV9GTFVTSF9JU19TQUZFKQotCQkJZmx1c2hfaWNhY2hlX3JhbmdlKGFkZHIsIGFkZHIgKyBsZW5ndGggKyAxKTsKKwkJCWZsdXNoX2ljYWNoZV9yYW5nZShhZGRyLCBhZGRyICsgbGVuZ3RoKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01OTAsNiArNTkwLDcgQEAKIAogCS8qIFNpZ25hbCB0aGUgcHJpbWFyeSBDUFUgdGhhdCB3ZSBhcmUgZG9uZTogKi8KIAlhdG9taWNfc2V0KCZjcHVfaW5fa2dkYltjcHVdLCAwKTsKKwl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJY2xvY2tzb3VyY2VfdG91Y2hfd2F0Y2hkb2coKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC0xNDMyLDYgKzE0MzMsNyBAQAogCSAgICBhdG9taWNfcmVhZCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXApICE9IGNwdSkgewogCiAJCWF0b21pY19zZXQoJmtnZGJfYWN0aXZlLCAtMSk7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAkJY2xvY2tzb3VyY2VfdG91Y2hfd2F0Y2hkb2coKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC0xNDYyLDcgKzE0NjQsNyBAQAogCSAqIEdldCB0aGUgcGFzc2l2ZSBDUFUgbG9jayB3aGljaCB3aWxsIGhvbGQgYWxsIHRoZSBub24tcHJpbWFyeQogCSAqIENQVSBpbiBhIHNwaW4gc3RhdGUgd2hpbGUgdGhlIGRlYnVnZ2VyIGlzIGFjdGl2ZQogCSAqLwotCWlmICgha2dkYl9zaW5nbGVfc3RlcCB8fCAha2dkYl9jb250dGhyZWFkKSB7CisJaWYgKCFrZ2RiX3NpbmdsZV9zdGVwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCiAJCQlhdG9taWNfc2V0KCZwYXNzaXZlX2NwdV93YWl0W2ldLCAxKTsKIAl9CkBAIC0xNDc1LDcgKzE0NzcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIFNpZ25hbCB0aGUgb3RoZXIgQ1BVcyB0byBlbnRlciBrZ2RiX3dhaXQoKSAqLwotCWlmICgoIWtnZGJfc2luZ2xlX3N0ZXAgfHwgIWtnZGJfY29udHRocmVhZCkgJiYga2dkYl9kb19yb3VuZHVwKQorCWlmICgoIWtnZGJfc2luZ2xlX3N0ZXApICYmIGtnZGJfZG9fcm91bmR1cCkKIAkJa2dkYl9yb3VuZHVwX2NwdXMoZmxhZ3MpOwogI2VuZGlmCiAKQEAgLTE0OTQsNyArMTQ5Niw3IEBACiAJa2dkYl9wb3N0X3ByaW1hcnlfY29kZShrcy0+bGludXhfcmVncywga3MtPmV4X3ZlY3Rvciwga3MtPmVycl9jb2RlKTsKIAlrZ2RiX2RlYWN0aXZhdGVfc3dfYnJlYWtwb2ludHMoKTsKIAlrZ2RiX3NpbmdsZV9zdGVwID0gMDsKLQlrZ2RiX2NvbnR0aHJlYWQgPSBOVUxMOworCWtnZGJfY29udHRocmVhZCA9IGN1cnJlbnQ7CiAJZXhjZXB0aW9uX2xldmVsID0gMDsKIAogCS8qIFRhbGsgdG8gZGVidWdnZXIgd2l0aCBnZGJzZXJpYWwgcHJvdG9jb2wgKi8KQEAgLTE1MDgsNyArMTUxMCw3IEBACiAJa2dkYl9pbmZvW2tzLT5jcHVdLnRhc2sgPSBOVUxMOwogCWF0b21pY19zZXQoJmNwdV9pbl9rZ2RiW2tzLT5jcHVdLCAwKTsKIAotCWlmICgha2dkYl9zaW5nbGVfc3RlcCB8fCAha2dkYl9jb250dGhyZWFkKSB7CisJaWYgKCFrZ2RiX3NpbmdsZV9zdGVwKSB7CiAJCWZvciAoaSA9IE5SX0NQVVMtMTsgaSA+PSAwOyBpLS0pCiAJCQlhdG9taWNfc2V0KCZwYXNzaXZlX2NwdV93YWl0W2ldLCAwKTsKIAkJLyoKQEAgLTE1MjQsNiArMTUyNiw3IEBACiBrZ2RiX3Jlc3RvcmU6CiAJLyogRnJlZSBrZ2RiX2FjdGl2ZSAqLwogCWF0b21pY19zZXQoJmtnZGJfYWN0aXZlLCAtMSk7CisJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCWNsb2Nrc291cmNlX3RvdWNoX3dhdGNoZG9nKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCAyNDU2ZDFhLi4zZDNjM2VhIDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJlcXVlc3RfbW9kdWxlKTsKLSNlbmRpZiAvKiBDT05GSUdfS01PRCAqLworI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCiAKIHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAvKgogICogSWYgc2V0LCBjYWxsX3VzZXJtb2RlaGVscGVyX2V4ZWMoKSB3aWxsIGV4aXQgaW1tZWRpYXRlbHkgcmV0dXJuaW5nIC1FQlVTWQogICogKHVzZWQgZm9yIHByZXZlbnRpbmcgdXNlciBsYW5kIHByb2Nlc3NlcyBmcm9tIGJlaW5nIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIKQEAgLTI4OCwzOSArMjg4LDM3IEBACiAgKi8KICNkZWZpbmUgUlVOTklOR19IRUxQRVJTX1RJTUVPVVQJKDUgKiBIWikKIAotc3RhdGljIGludCB1c2VybW9kZWhlbHBlcl9wbV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJCXZvaWQgKmlnbm9yZWQpCisvKioKKyAqIHVzZXJtb2RlaGVscGVyX2Rpc2FibGUgLSBwcmV2ZW50IG5ldyBoZWxwZXJzIGZyb20gYmVpbmcgc3RhcnRlZAorICovCitpbnQgdXNlcm1vZGVoZWxwZXJfZGlzYWJsZSh2b2lkKQogewogCWxvbmcgcmV0dmFsOwogCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkU6Ci0JY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6Ci0JCXVzZXJtb2RlaGVscGVyX2Rpc2FibGVkID0gMTsKLQkJc21wX21iKCk7Ci0JCS8qCi0JCSAqIEZyb20gbm93IG9uIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlYygpIHdvbid0IHN0YXJ0IGFueSBuZXcKLQkJICogaGVscGVycywgc28gaXQgaXMgc3VmZmljaWVudCBpZiBydW5uaW5nX2hlbHBlcnMgdHVybnMgb3V0IHRvCi0JCSAqIGJlIHplcm8gYXQgb25lIHBvaW50IChpdCBtYXkgYmUgaW5jcmVhc2VkIGxhdGVyLCBidXQgdGhhdAotCQkgKiBkb2Vzbid0IG1hdHRlcikuCi0JCSAqLwotCQlyZXR2YWwgPSB3YWl0X2V2ZW50X3RpbWVvdXQocnVubmluZ19oZWxwZXJzX3dhaXRxLAorCXVzZXJtb2RlaGVscGVyX2Rpc2FibGVkID0gMTsKKwlzbXBfbWIoKTsKKwkvKgorCSAqIEZyb20gbm93IG9uIGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlYygpIHdvbid0IHN0YXJ0IGFueSBuZXcKKwkgKiBoZWxwZXJzLCBzbyBpdCBpcyBzdWZmaWNpZW50IGlmIHJ1bm5pbmdfaGVscGVycyB0dXJucyBvdXQgdG8KKwkgKiBiZSB6ZXJvIGF0IG9uZSBwb2ludCAoaXQgbWF5IGJlIGluY3JlYXNlZCBsYXRlciwgYnV0IHRoYXQKKwkgKiBkb2Vzbid0IG1hdHRlcikuCisJICovCisJcmV0dmFsID0gd2FpdF9ldmVudF90aW1lb3V0KHJ1bm5pbmdfaGVscGVyc193YWl0cSwKIAkJCQkJYXRvbWljX3JlYWQoJnJ1bm5pbmdfaGVscGVycykgPT0gMCwKIAkJCQkJUlVOTklOR19IRUxQRVJTX1RJTUVPVVQpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlyZXR1cm4gTk9USUZZX09LOwotCQl9IGVsc2UgewotCQkJdXNlcm1vZGVoZWxwZXJfZGlzYWJsZWQgPSAwOwotCQkJcmV0dXJuIE5PVElGWV9CQUQ7Ci0JCX0KLQljYXNlIFBNX1BPU1RfSElCRVJOQVRJT046Ci0JY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCXVzZXJtb2RlaGVscGVyX2Rpc2FibGVkID0gMDsKLQkJcmV0dXJuIE5PVElGWV9PSzsKLQl9CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gTk9USUZZX0RPTkU7CisJdXNlcm1vZGVoZWxwZXJfZGlzYWJsZWQgPSAwOworCXJldHVybiAtRUFHQUlOOworfQorCisvKioKKyAqIHVzZXJtb2RlaGVscGVyX2VuYWJsZSAtIGFsbG93IG5ldyBoZWxwZXJzIHRvIGJlIHN0YXJ0ZWQgYWdhaW4KKyAqLwordm9pZCB1c2VybW9kZWhlbHBlcl9lbmFibGUodm9pZCkKK3sKKwl1c2VybW9kZWhlbHBlcl9kaXNhYmxlZCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGhlbHBlcl9sb2NrKHZvaWQpCkBAIC0zMzQsMTggKzMzMiwxMiBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZydW5uaW5nX2hlbHBlcnMpKQogCQl3YWtlX3VwKCZydW5uaW5nX2hlbHBlcnNfd2FpdHEpOwogfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9wbV9ub3RpZmllcl9jYWxsYmFjayh2b2lkKQotewotCXBtX25vdGlmaWVyKHVzZXJtb2RlaGVscGVyX3BtX2NhbGxiYWNrLCAwKTsKLX0KLSNlbHNlIC8qIENPTkZJR19QTSAqLworI2Vsc2UgLyogQ09ORklHX1BNX1NMRUVQICovCiAjZGVmaW5lIHVzZXJtb2RlaGVscGVyX2Rpc2FibGVkCTAKIAogc3RhdGljIGlubGluZSB2b2lkIGhlbHBlcl9sb2NrKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgaGVscGVyX3VubG9jayh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX3BtX25vdGlmaWVyX2NhbGxiYWNrKHZvaWQpIHt9Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKIC8qKgogICogY2FsbF91c2VybW9kZWhlbHBlcl9zZXR1cCAtIHByZXBhcmUgdG8gY2FsbCBhIHVzZXJtb2RlIGhlbHBlcgpAQCAtNTE1LDUgKzUwNyw0IEBACiB7CiAJa2hlbHBlcl93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJraGVscGVyIik7CiAJQlVHX09OKCFraGVscGVyX3dxKTsKLQlyZWdpc3Rlcl9wbV9ub3RpZmllcl9jYWxsYmFjaygpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggNzViYzJjZC4uOGI1N2EyNSAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZShobGlzdF9sb2NrLCAqZmxhZ3MpOwogfQogCi12b2lkIGtyZXRwcm9iZV90YWJsZV9sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBrcmV0cHJvYmVfdGFibGVfbG9jayh1bnNpZ25lZCBsb25nIGhhc2gsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCBlNTNiYzMwLi4wOGRkOGVkIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNkZWZpbmUgS0VSTkVMX0FUVFJfUk8oX25hbWUpIFwKQEAgLTUzLDYgKzU0LDM3IEBACiBLRVJORUxfQVRUUl9SVyh1ZXZlbnRfaGVscGVyKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BST0ZJTElORworc3RhdGljIHNzaXplX3QgcHJvZmlsaW5nX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJvZl9vbik7Cit9CitzdGF0aWMgc3NpemVfdCBwcm9maWxpbmdfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisKKwlpZiAocHJvZl9vbikKKwkJcmV0dXJuIC1FRVhJU1Q7CisJLyoKKwkgKiBUaGlzIGV2ZW50dWFsbHkgY2FsbHMgaW50byBnZXRfb3B0aW9uKCkgd2hpY2gKKwkgKiBoYXMgYSB0b24gb2YgY2FsbGVycyBhbmQgaXMgbm90IGNvbnN0LiAgSXQgaXMKKwkgKiBlYXNpZXN0IHRvIGNhc3QgaXQgYXdheSBoZXJlLgorCSAqLworCXByb2ZpbGVfc2V0dXAoKGNoYXIgKilidWYpOworCXJldCA9IHByb2ZpbGVfaW5pdCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY3JlYXRlX3Byb2NfcHJvZmlsZSgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQorS0VSTkVMX0FUVFJfUlcocHJvZmlsaW5nKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0tFWEVDCiBzdGF0aWMgc3NpemVfdCBrZXhlY19sb2FkZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0xMDksNiArMTQxLDkgQEAKIAkmdWV2ZW50X3NlcW51bV9hdHRyLmF0dHIsCiAJJnVldmVudF9oZWxwZXJfYXR0ci5hdHRyLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0ZJTElORworCSZwcm9maWxpbmdfYXR0ci5hdHRyLAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJJmtleGVjX2xvYWRlZF9hdHRyLmF0dHIsCiAJJmtleGVjX2NyYXNoX2xvYWRlZF9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggOWRiMTE5MS4uYjcyMDVmNiAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3RhaW50X21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGZsYWcpCiB7CiAJYWRkX3RhaW50KGZsYWcpOwotCW1vZC0+dGFpbnRzIHw9IGZsYWc7CisJbW9kLT50YWludHMgfD0gKDFVIDw8IGZsYWcpOwogfQogCiAvKgpAQCAtNzg0LDYgKzc4NCw3IEBACiAJbXV0ZXhfbG9jaygmbW9kdWxlX211dGV4KTsKIAkvKiBTdG9yZSB0aGUgbmFtZSBvZiB0aGUgbGFzdCB1bmxvYWRlZCBtb2R1bGUgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgKi8KIAlzdHJsY3B5KGxhc3RfdW5sb2FkZWRfbW9kdWxlLCBtb2QtPm5hbWUsIHNpemVvZihsYXN0X3VubG9hZGVkX21vZHVsZSkpOworCXVucmVnaXN0ZXJfZHluYW1pY19kZWJ1Z19tb2R1bGUobW9kLT5uYW1lKTsKIAlmcmVlX21vZHVsZShtb2QpOwogCiAgb3V0OgpAQCAtOTIzLDcgKzkyNCw3IEBACiBzdGF0aWMgaW50IHRyeV90b19mb3JjZV9sb2FkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqc3ltbmFtZSkKIHsKICNpZmRlZiBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQKLQlpZiAoISh0YWludGVkICYgVEFJTlRfRk9SQ0VEX01PRFVMRSkpCisJaWYgKCF0ZXN0X3RhaW50KFRBSU5UX0ZPUkNFRF9NT0RVTEUpKQogCQlwcmludGsoIiVzOiBubyB2ZXJzaW9uIGZvciBcIiVzXCIgZm91bmQ6IGtlcm5lbCB0YWludGVkLlxuIiwKIAkJICAgICAgIG1vZC0+bmFtZSwgc3ltbmFtZSk7CiAJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX0ZPUkNFRF9NT0RVTEUpOwpAQCAtMTAzMyw3ICsxMDM0LDcgQEAKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKIAlyZXQgPSBmaW5kX3N5bWJvbChuYW1lLCAmb3duZXIsICZjcmMsCi0JCQkgICEobW9kLT50YWludHMgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpLCB0cnVlKTsKKwkJCSAgIShtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpLCB0cnVlKTsKIAlpZiAoIUlTX0VSUl9WQUxVRShyZXQpKSB7CiAJCS8qIHVzZV9tb2R1bGUgY2FuIGZhaWwgZHVlIHRvIE9PTSwKIAkJICAgb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIG9yIHVubG9hZGluZyAqLwpAQCAtMTE3Myw3ICsxMTc0LDcgQEAKIAkJd2hpbGUgKGktLSA+IDApCiAJCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUobm90ZXNfYXR0cnMtPmRpciwKIAkJCQkJICAgICAgJm5vdGVzX2F0dHJzLT5hdHRyc1tpXSk7Ci0JCWtvYmplY3RfZGVsKG5vdGVzX2F0dHJzLT5kaXIpOworCQlrb2JqZWN0X3B1dChub3Rlc19hdHRycy0+ZGlyKTsKIAl9CiAJa2ZyZWUobm90ZXNfYXR0cnMpOwogfQpAQCAtMTYzNCw3ICsxNjM1LDcgQEAKIAkJbGljZW5zZSA9ICJ1bnNwZWNpZmllZCI7CiAKIAlpZiAoIWxpY2Vuc2VfaXNfZ3BsX2NvbXBhdGlibGUobGljZW5zZSkpIHsKLQkJaWYgKCEodGFpbnRlZCAmIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpCisJCWlmICghdGVzdF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1vZHVsZSBsaWNlbnNlICclcycgdGFpbnRzICIKIAkJCQkia2VybmVsLlxuIiwgbW9kLT5uYW1lLCBsaWNlbnNlKTsKIAkJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7CkBAIC0xNzgzLDYgKzE3ODQsMzMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfS0FMTFNZTVMgKi8KIAorI2lmZGVmIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRworc3RhdGljIHZvaWQgZHluYW1pY19wcmludGtfc2V0dXAoRWxmX1NoZHIgKnNlY2hkcnMsIHVuc2lnbmVkIGludCB2ZXJib3NlaW5kZXgpCit7CisJc3RydWN0IG1vZF9kZWJ1ZyAqZGVidWdfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHBvcywgZW5kOworCXVuc2lnbmVkIGludCBudW1fdmVyYm9zZTsKKworCXBvcyA9IHNlY2hkcnNbdmVyYm9zZWluZGV4XS5zaF9hZGRyOworCW51bV92ZXJib3NlID0gc2VjaGRyc1t2ZXJib3NlaW5kZXhdLnNoX3NpemUgLworCQkJCXNpemVvZihzdHJ1Y3QgbW9kX2RlYnVnKTsKKwllbmQgPSBwb3MgKyAobnVtX3ZlcmJvc2UgKiBzaXplb2Yoc3RydWN0IG1vZF9kZWJ1ZykpOworCisJZm9yICg7IHBvcyA8IGVuZDsgcG9zICs9IHNpemVvZihzdHJ1Y3QgbW9kX2RlYnVnKSkgeworCQlkZWJ1Z19pbmZvID0gKHN0cnVjdCBtb2RfZGVidWcgKilwb3M7CisJCXJlZ2lzdGVyX2R5bmFtaWNfZGVidWdfbW9kdWxlKGRlYnVnX2luZm8tPm1vZG5hbWUsCisJCQlkZWJ1Z19pbmZvLT50eXBlLCBkZWJ1Z19pbmZvLT5sb2dpY2FsX21vZG5hbWUsCisJCQlkZWJ1Z19pbmZvLT5mbGFnX25hbWVzLCBkZWJ1Z19pbmZvLT5oYXNoLAorCQkJZGVidWdfaW5mby0+aGFzaDIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZHluYW1pY19wcmludGtfc2V0dXAoRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkJCXVuc2lnbmVkIGludCB2ZXJib3NlaW5kZXgpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHICovCisKIHN0YXRpYyB2b2lkICptb2R1bGVfYWxsb2NfdXBkYXRlX2JvdW5kcyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdm9pZCAqcmV0ID0gbW9kdWxlX2FsbG9jKHNpemUpOwpAQCAtMTgzMSw2ICsxODU5LDcgQEAKICNlbmRpZgogCXVuc2lnbmVkIGludCBtYXJrZXJzaW5kZXg7CiAJdW5zaWduZWQgaW50IG1hcmtlcnNzdHJpbmdzaW5kZXg7CisJdW5zaWduZWQgaW50IHZlcmJvc2VpbmRleDsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAJbG9uZyBlcnIgPSAwOwogCXZvaWQgKnBlcmNwdSA9IE5VTEwsICpwdHIgPSBOVUxMOyAvKiBTdG9wcyBzcHVyaW91cyBnY2Mgd2FybmluZyAqLwpAQCAtMjExNyw2ICsyMTQ2LDcgQEAKIAltYXJrZXJzaW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICJfX21hcmtlcnMiKTsKICAJbWFya2Vyc3N0cmluZ3NpbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywKIAkJCQkJIl9fbWFya2Vyc19zdHJpbmdzIik7CisJdmVyYm9zZWluZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX192ZXJib3NlIik7CiAKIAkvKiBOb3cgZG8gcmVsb2NhdGlvbnMuICovCiAJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7CkBAIC0yMTY3LDYgKzIxOTcsNyBAQAogCQltYXJrZXJfdXBkYXRlX3Byb2JlX3JhbmdlKG1vZC0+bWFya2VycywKIAkJCW1vZC0+bWFya2VycyArIG1vZC0+bnVtX21hcmtlcnMpOwogI2VuZGlmCisJZHluYW1pY19wcmludGtfc2V0dXAoc2VjaGRycywgdmVyYm9zZWluZGV4KTsKIAllcnIgPSBtb2R1bGVfZmluYWxpemUoaGRyLCBzZWNoZHJzLCBtb2QpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGNsZWFudXA7CkBAIC0yNTUyLDkgKzI1ODMsOSBAQAogCSAgICBtb2QtPnN0YXRlID09IE1PRFVMRV9TVEFURV9HT0lORyB8fAogCSAgICBtb2QtPnN0YXRlID09IE1PRFVMRV9TVEFURV9DT01JTkcpIHsKIAkJYnVmW2J4KytdID0gJygnOwotCQlpZiAobW9kLT50YWludHMgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpCisJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpCiAJCQlidWZbYngrK10gPSAnUCc7Ci0JCWlmIChtb2QtPnRhaW50cyAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUpCisJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX0ZPUkNFRF9NT0RVTEUpKQogCQkJYnVmW2J4KytdID0gJ0YnOwogCQkvKgogCQkgKiBUQUlOVF9GT1JDRURfUk1NT0Q6IGNvdWxkIGJlIGFkZGVkLgpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCAxMmM1YTBhLi5mMjkwZThlIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAKIGludCBwYW5pY19vbl9vb3BzOwotaW50IHRhaW50ZWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0YWludGVkX21hc2s7CiBzdGF0aWMgaW50IHBhdXNlX29uX29vcHM7CiBzdGF0aWMgaW50IHBhdXNlX29uX29vcHNfZmxhZzsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGF1c2Vfb25fb29wc19sb2NrKTsKQEAgLTE0Myw2ICsxNDMsMjYgQEAKIAogRVhQT1JUX1NZTUJPTChwYW5pYyk7CiAKKworc3RydWN0IHRudCB7CisJdTggYml0OworCWNoYXIgdHJ1ZTsKKwljaGFyIGZhbHNlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0bnQgdG50c1tdID0geworCXsgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFLCAnUCcsICdHJyB9LAorCXsgVEFJTlRfRk9SQ0VEX01PRFVMRSwgJ0YnLCAnICcgfSwKKwl7IFRBSU5UX1VOU0FGRV9TTVAsICdTJywgJyAnIH0sCisJeyBUQUlOVF9GT1JDRURfUk1NT0QsICdSJywgJyAnIH0sCisJeyBUQUlOVF9NQUNISU5FX0NIRUNLLCAnTScsICcgJyB9LAorCXsgVEFJTlRfQkFEX1BBR0UsICdCJywgJyAnIH0sCisJeyBUQUlOVF9VU0VSLCAnVScsICcgJyB9LAorCXsgVEFJTlRfRElFLCAnRCcsICcgJyB9LAorCXsgVEFJTlRfT1ZFUlJJRERFTl9BQ1BJX1RBQkxFLCAnQScsICcgJyB9LAorCXsgVEFJTlRfV0FSTiwgJ1cnLCAnICcgfSwKK307CisKIC8qKgogICoJcHJpbnRfdGFpbnRlZCAtIHJldHVybiBhIHN0cmluZyB0byByZXByZXNlbnQgdGhlIGtlcm5lbCB0YWludCBzdGF0ZS4KICAqCkBAIC0xNTgsMzIgKzE3OCw0MSBAQAogICoKICAqCVRoZSBzdHJpbmcgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIG5leHQgY2FsbCB0byBwcmludF90YWludCgpLgogICovCi0KIGNvbnN0IGNoYXIgKnByaW50X3RhaW50ZWQodm9pZCkKIHsKLQlzdGF0aWMgY2hhciBidWZbMjBdOwotCWlmICh0YWludGVkKSB7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyVjJWMlYyIsCi0JCQl0YWludGVkICYgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFID8gJ1AnIDogJ0cnLAotCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9NT0RVTEUgPyAnRicgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfVU5TQUZFX1NNUCA/ICdTJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9GT1JDRURfUk1NT0QgPyAnUicgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfTUFDSElORV9DSEVDSyA/ICdNJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9CQURfUEFHRSA/ICdCJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9VU0VSID8gJ1UnIDogJyAnLAotCQkJdGFpbnRlZCAmIFRBSU5UX0RJRSA/ICdEJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9PVkVSUklEREVOX0FDUElfVEFCTEUgPyAnQScgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfV0FSTiA/ICdXJyA6ICcgJyk7Ci0JfQotCWVsc2UKKwlzdGF0aWMgY2hhciBidWZbQVJSQVlfU0laRSh0bnRzKSArIHNpemVvZigiVGFpbnRlZDogIikgKyAxXTsKKworCWlmICh0YWludGVkX21hc2spIHsKKwkJY2hhciAqczsKKwkJaW50IGk7CisKKwkJcyA9IGJ1ZiArIHNwcmludGYoYnVmLCAiVGFpbnRlZDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRudHMpOyBpKyspIHsKKwkJCWNvbnN0IHN0cnVjdCB0bnQgKnQgPSAmdG50c1tpXTsKKwkJCSpzKysgPSB0ZXN0X2JpdCh0LT5iaXQsICZ0YWludGVkX21hc2spID8KKwkJCQkJdC0+dHJ1ZSA6IHQtPmZhbHNlOworCQl9CisJCSpzID0gMDsKKwl9IGVsc2UKIAkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIk5vdCB0YWludGVkIik7CiAJcmV0dXJuKGJ1Zik7CiB9CiAKK2ludCB0ZXN0X3RhaW50KHVuc2lnbmVkIGZsYWcpCit7CisJcmV0dXJuIHRlc3RfYml0KGZsYWcsICZ0YWludGVkX21hc2spOworfQorRVhQT1JUX1NZTUJPTCh0ZXN0X3RhaW50KTsKKwordW5zaWduZWQgbG9uZyBnZXRfdGFpbnQodm9pZCkKK3sKKwlyZXR1cm4gdGFpbnRlZF9tYXNrOworfQorCiB2b2lkIGFkZF90YWludCh1bnNpZ25lZCBmbGFnKQogewogCWRlYnVnX2xvY2tzID0gMDsgLyogY2FuJ3QgdHJ1c3QgdGhlIGludGVncml0eSBvZiB0aGUga2VybmVsIGFueW1vcmUgKi8KLQl0YWludGVkIHw9IGZsYWc7CisJc2V0X2JpdChmbGFnLCAmdGFpbnRlZF9tYXNrKTsKIH0KIEVYUE9SVF9TWU1CT0woYWRkX3RhaW50KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCmluZGV4IGY4NWVmY2QuLmVlMjA0NTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQlyZXR1cm4gdG1yOwogCWlmICh1bmxpa2VseSghKHRtci0+c2lncSA9IHNpZ3F1ZXVlX2FsbG9jKCkpKSkgewogCQlrbWVtX2NhY2hlX2ZyZWUocG9zaXhfdGltZXJzX2NhY2hlLCB0bXIpOwotCQl0bXIgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKIAl9CiAJbWVtc2V0KCZ0bXItPnNpZ3EtPmluZm8sIDAsIHNpemVvZihzaWdpbmZvX3QpKTsKIAlyZXR1cm4gdG1yOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2Rpc2suYyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKaW5kZXggYmJkODVjNi4uMzMxZjk4MyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2Rpc2suYworKysgYi9rZXJuZWwvcG93ZXIvZGlzay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpAQCAtNTIwLDYgKzUyMSwxMCBAQAogCWlmIChlcnJvcikKIAkJZ290byBFeGl0OwogCisJZXJyb3IgPSB1c2VybW9kZWhlbHBlcl9kaXNhYmxlKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIEV4aXQ7CisKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgbWFuYWdlbWVudCBzdHJ1Y3R1cmVzICovCiAJZXJyb3IgPSBjcmVhdGVfYmFzaWNfbWVtb3J5X2JpdG1hcHMoKTsKIAlpZiAoZXJyb3IpCkBAIC01NTgsNiArNTYzLDcgQEAKIAl0aGF3X3Byb2Nlc3NlcygpOwogIEZpbmlzaDoKIAlmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CisJdXNlcm1vZGVoZWxwZXJfZW5hYmxlKCk7CiAgRXhpdDoKIAlwbV9ub3RpZmllcl9jYWxsX2NoYWluKFBNX1BPU1RfSElCRVJOQVRJT04pOwogCXBtX3Jlc3RvcmVfY29uc29sZSgpOwpAQCAtNjM0LDYgKzY0MCwxMCBAQAogCWlmIChlcnJvcikKIAkJZ290byBGaW5pc2g7CiAKKwllcnJvciA9IHVzZXJtb2RlaGVscGVyX2Rpc2FibGUoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gRmluaXNoOworCiAJZXJyb3IgPSBjcmVhdGVfYmFzaWNfbWVtb3J5X2JpdG1hcHMoKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRmluaXNoOwpAQCAtNjU2LDYgKzY2Niw3IEBACiAJdGhhd19wcm9jZXNzZXMoKTsKICBEb25lOgogCWZyZWVfYmFzaWNfbWVtb3J5X2JpdG1hcHMoKTsKKwl1c2VybW9kZWhlbHBlcl9lbmFibGUoKTsKICBGaW5pc2g6CiAJcG1fbm90aWZpZXJfY2FsbF9jaGFpbihQTV9QT1NUX1JFU1RPUkUpOwogCXBtX3Jlc3RvcmVfY29uc29sZSgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggNTQwYjE2Yi4uMTkxMjJjZiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtMjM3LDYgKzIzOCwxMCBAQAogCWlmIChlcnJvcikKIAkJZ290byBGaW5pc2g7CiAKKwllcnJvciA9IHVzZXJtb2RlaGVscGVyX2Rpc2FibGUoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gRmluaXNoOworCiAJaWYgKHN1c3BlbmRfZnJlZXplX3Byb2Nlc3NlcygpKSB7CiAJCWVycm9yID0gLUVBR0FJTjsKIAkJZ290byBUaGF3OwpAQCAtMjU2LDYgKzI2MSw3IEBACiAKICBUaGF3OgogCXN1c3BlbmRfdGhhd19wcm9jZXNzZXMoKTsKKwl1c2VybW9kZWhlbHBlcl9lbmFibGUoKTsKICBGaW5pc2g6CiAJcG1fbm90aWZpZXJfY2FsbF9jaGFpbihQTV9QT1NUX1NVU1BFTkQpOwogCXBtX3Jlc3RvcmVfY29uc29sZSgpOwpAQCAtMzc2LDYgKzM4Miw3IEBACiBzdGF0aWMgdm9pZCBzdXNwZW5kX2ZpbmlzaCh2b2lkKQogewogCXN1c3BlbmRfdGhhd19wcm9jZXNzZXMoKTsKKwl1c2VybW9kZWhlbHBlcl9lbmFibGUoKTsKIAlwbV9ub3RpZmllcl9jYWxsX2NoYWluKFBNX1BPU1RfU1VTUEVORCk7CiAJcG1fcmVzdG9yZV9jb25zb2xlKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuYwppbmRleCBhNjMzMmEzLi4wMDViOTNkIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jCisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmMKQEAgLTIxMiwxMyArMjEyLDIwIEBACiAJY2FzZSBTTkFQU0hPVF9GUkVFWkU6CiAJCWlmIChkYXRhLT5mcm96ZW4pCiAJCQlicmVhazsKKwogCQlwcmludGsoIlN5bmNpbmcgZmlsZXN5c3RlbXMgLi4uICIpOwogCQlzeXNfc3luYygpOwogCQlwcmludGsoImRvbmUuXG4iKTsKIAotCQllcnJvciA9IGZyZWV6ZV9wcm9jZXNzZXMoKTsKKwkJZXJyb3IgPSB1c2VybW9kZWhlbHBlcl9kaXNhYmxlKCk7CiAJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCisJCWVycm9yID0gZnJlZXplX3Byb2Nlc3NlcygpOworCQlpZiAoZXJyb3IpIHsKIAkJCXRoYXdfcHJvY2Vzc2VzKCk7CisJCQl1c2VybW9kZWhlbHBlcl9lbmFibGUoKTsKKwkJfQogCQlpZiAoIWVycm9yKQogCQkJZGF0YS0+ZnJvemVuID0gMTsKIAkJYnJlYWs7CkBAIC0yMjcsNiArMjM0LDcgQEAKIAkJaWYgKCFkYXRhLT5mcm96ZW4gfHwgZGF0YS0+cmVhZHkpCiAJCQlicmVhazsKIAkJdGhhd19wcm9jZXNzZXMoKTsKKwkJdXNlcm1vZGVoZWxwZXJfZW5hYmxlKCk7CiAJCWRhdGEtPmZyb3plbiA9IDA7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggYjUxYjE1Ni4uNjM0MWFmNyAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMTMsNyArMTMsNyBAQAogICogRml4ZWQgU01QIHN5bmNocm9uaXphdGlvbiwgMDgvMDgvOTksIE1hbmZyZWQgU3ByYXVsCiAgKiAgICAgbWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tCiAgKiBSZXdyb3RlIGJpdHMgdG8gZ2V0IHJpZCBvZiBjb25zb2xlX2xvY2sKLSAqCTAxTWFyMDEgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PgorICoJMDFNYXIwMSBBbmRyZXcgTW9ydG9uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTc3LDkgKzU3Nyw2IEBACiAgKiBAZm10OiBmb3JtYXQgc3RyaW5nCiAgKgogICogVGhpcyBpcyBwcmludGsoKS4gIEl0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gIFdlIHdhbnQgaXQgdG8gd29yay4KLSAqIEJlIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgaWYgb29wc19pbl9wcm9ncmVzcyBpcyBub3Qgc2V0LCB3ZSBtaWdodCB0cnkgdG8KLSAqIHdha2Uga2xvZ2QgdXAgd2hpY2ggY291bGQgZGVhZGxvY2sgb24gcnVucXVldWUgbG9jayBpZiBwcmludGsoKSBpcyBjYWxsZWQKLSAqIGZyb20gc2NoZWR1bGVyIGNvZGUuCiAgKgogICogV2UgdHJ5IHRvIGdyYWIgdGhlIGNvbnNvbGVfc2VtLiAgSWYgd2Ugc3VjY2VlZCwgaXQncyBlYXN5IC0gd2UgbG9nIHRoZSBvdXRwdXQgYW5kCiAgKiBjYWxsIHRoZSBjb25zb2xlIGRyaXZlcnMuICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgc2VtYXBob3JlIHdlIHBsYWNlIHRoZSBvdXRwdXQKQEAgLTU5Myw2ICs1OTAsOCBAQAogICoKICAqIFNlZSBhbHNvOgogICogcHJpbnRmKDMpCisgKgorICogU2VlIHRoZSB2c25wcmludGYoKSBkb2N1bWVudGF0aW9uIGZvciBmb3JtYXQgc3RyaW5nIGV4dGVuc2lvbnMgb3ZlciBDOTkuCiAgKi8KIAogYXNtbGlua2FnZSBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQpAQCAtOTgyLDEwICs5ODEsMjUgQEAKIAlyZXR1cm4gY29uc29sZV9sb2NrZWQ7CiB9CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByaW50a19wZW5kaW5nKTsKKwordm9pZCBwcmludGtfdGljayh2b2lkKQoreworCWlmIChfX2dldF9jcHVfdmFyKHByaW50a19wZW5kaW5nKSkgeworCQlfX2dldF9jcHVfdmFyKHByaW50a19wZW5kaW5nKSA9IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9nX3dhaXQpOworCX0KK30KKworaW50IHByaW50a19uZWVkc19jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gcGVyX2NwdShwcmludGtfcGVuZGluZywgY3B1KTsKK30KKwogdm9pZCB3YWtlX3VwX2tsb2dkKHZvaWQpCiB7Ci0JaWYgKCFvb3BzX2luX3Byb2dyZXNzICYmIHdhaXRxdWV1ZV9hY3RpdmUoJmxvZ193YWl0KSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2dfd2FpdCk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmxvZ193YWl0KSkKKwkJX19yYXdfZ2V0X2NwdV92YXIocHJpbnRrX3BlbmRpbmcpID0gMTsKIH0KIAogLyoqCkBAIC0xMjkxLDIyICsxMzA1LDYgQEAKIH0KIGxhdGVfaW5pdGNhbGwoZGlzYWJsZV9ib290X2NvbnNvbGVzKTsKIAotLyoqCi0gKiB0dHlfd3JpdGVfbWVzc2FnZSAtIHdyaXRlIGEgbWVzc2FnZSB0byBhIGNlcnRhaW4gdHR5LCBub3QganVzdCB0aGUgY29uc29sZS4KLSAqIEB0dHk6IHRoZSBkZXN0aW5hdGlvbiB0dHlfc3RydWN0Ci0gKiBAbXNnOiB0aGUgbWVzc2FnZSB0byB3cml0ZQotICoKLSAqIFRoaXMgaXMgdXNlZCBmb3IgbWVzc2FnZXMgdGhhdCBuZWVkIHRvIGJlIHJlZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyB0dHkuCi0gKiBXZSBkb24ndCBwdXQgaXQgaW50byB0aGUgc3lzbG9nIHF1ZXVlIHJpZ2h0IG5vdyBtYXliZSBpbiB0aGUgZnV0dXJlIGlmCi0gKiByZWFsbHkgbmVlZGVkLgotICovCi12b2lkIHR0eV93cml0ZV9tZXNzYWdlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgKm1zZykKLXsKLQlpZiAodHR5ICYmIHR0eS0+b3BzLT53cml0ZSkKLQkJdHR5LT5vcHMtPndyaXRlKHR0eSwgbXNnLCBzdHJsZW4obXNnKSk7Ci0JcmV0dXJuOwotfQotCiAjaWYgZGVmaW5lZCBDT05GSUdfUFJJTlRLCiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBjZDI2YmVkLi5hOWU0MjJkIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTUwLDExICs1MiwxMSBAQAogc3RhdGljIERFRklORV9NVVRFWChwcm9maWxlX2ZsaXBfbXV0ZXgpOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotc3RhdGljIGludCBfX2luaXQgcHJvZmlsZV9zZXR1cChjaGFyICpzdHIpCitpbnQgcHJvZmlsZV9zZXR1cChjaGFyICpzdHIpCiB7Ci0Jc3RhdGljIGNoYXIgX19pbml0ZGF0YSBzY2hlZHN0cltdID0gInNjaGVkdWxlIjsKLQlzdGF0aWMgY2hhciBfX2luaXRkYXRhIHNsZWVwc3RyW10gPSAic2xlZXAiOwotCXN0YXRpYyBjaGFyIF9faW5pdGRhdGEga3Ztc3RyW10gPSAia3ZtIjsKKwlzdGF0aWMgY2hhciBzY2hlZHN0cltdID0gInNjaGVkdWxlIjsKKwlzdGF0aWMgY2hhciBzbGVlcHN0cltdID0gInNsZWVwIjsKKwlzdGF0aWMgY2hhciBrdm1zdHJbXSA9ICJrdm0iOwogCWludCBwYXI7CiAKIAlpZiAoIXN0cm5jbXAoc3RyLCBzbGVlcHN0ciwgc3RybGVuKHNsZWVwc3RyKSkpIHsKQEAgLTEwMCwxNCArMTAyLDMzIEBACiBfX3NldHVwKCJwcm9maWxlPSIsIHByb2ZpbGVfc2V0dXApOwogCiAKLXZvaWQgX19pbml0IHByb2ZpbGVfaW5pdCh2b2lkKQoraW50IHByb2ZpbGVfaW5pdCh2b2lkKQogeworCWludCBidWZmZXJfYnl0ZXM7CiAJaWYgKCFwcm9mX29uKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJLyogb25seSB0ZXh0IGlzIHByb2ZpbGVkICovCiAJcHJvZl9sZW4gPSAoX2V0ZXh0IC0gX3N0ZXh0KSA+PiBwcm9mX3NoaWZ0OwotCXByb2ZfYnVmZmVyID0gYWxsb2NfYm9vdG1lbShwcm9mX2xlbipzaXplb2YoYXRvbWljX3QpKTsKKwlidWZmZXJfYnl0ZXMgPSBwcm9mX2xlbipzaXplb2YoYXRvbWljX3QpOworCWlmICghc2xhYl9pc19hdmFpbGFibGUoKSkgeworCQlwcm9mX2J1ZmZlciA9IGFsbG9jX2Jvb3RtZW0oYnVmZmVyX2J5dGVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJvZl9idWZmZXIgPSBremFsbG9jKGJ1ZmZlcl9ieXRlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2ZfYnVmZmVyKQorCQlyZXR1cm4gMDsKKworCXByb2ZfYnVmZmVyID0gYWxsb2NfcGFnZXNfZXhhY3QoYnVmZmVyX2J5dGVzLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCWlmIChwcm9mX2J1ZmZlcikKKwkJcmV0dXJuIDA7CisKKwlwcm9mX2J1ZmZlciA9IHZtYWxsb2MoYnVmZmVyX2J5dGVzKTsKKwlpZiAocHJvZl9idWZmZXIpCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qIFByb2ZpbGUgZXZlbnQgbm90aWZpY2F0aW9ucyAqLwpAQCAtNTI3LDcgKzU0OCw3IEBACiB7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGNyZWF0ZV9oYXNoX3RhYmxlcyh2b2lkKQorc3RhdGljIGludCBjcmVhdGVfaGFzaF90YWJsZXModm9pZCkKIHsKIAlpbnQgY3B1OwogCkBAIC01NzUsMTQgKzU5NiwxNCBAQAogI2RlZmluZSBjcmVhdGVfaGFzaF90YWJsZXMoKQkJCSh7IDA7IH0pCiAjZW5kaWYKIAotc3RhdGljIGludCBfX2luaXQgY3JlYXRlX3Byb2NfcHJvZmlsZSh2b2lkKQoraW50IGNyZWF0ZV9wcm9jX3Byb2ZpbGUodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogCiAJaWYgKCFwcm9mX29uKQogCQlyZXR1cm4gMDsKIAlpZiAoY3JlYXRlX2hhc2hfdGFibGVzKCkpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJZW50cnkgPSBwcm9jX2NyZWF0ZSgicHJvZmlsZSIsIFNfSVdVU1IgfCBTX0lSVUdPLAogCQkJICAgIE5VTEwsICZwcm9jX3Byb2ZpbGVfb3BlcmF0aW9ucyk7CiAJaWYgKCFlbnRyeSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VjbGFzc2ljLmMgYi9rZXJuZWwvcmN1Y2xhc3NpYy5jCmluZGV4IGFhZDkzY2QuLjM3ZjcyZTU1MSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdWNsYXNzaWMuYworKysgYi9rZXJuZWwvcmN1Y2xhc3NpYy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHJjdV9sb2NrX2tleTsKQEAgLTYwLDEyICs2MSwxNCBAQAogc3RhdGljIHN0cnVjdCByY3VfY3RybGJsayByY3VfY3RybGJsayA9IHsKIAkuY3VyID0gLTMwMCwKIAkuY29tcGxldGVkID0gLTMwMCwKKwkucGVuZGluZyA9IC0zMDAsCiAJLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCgmcmN1X2N0cmxibGsubG9jayksCiAJLmNwdW1hc2sgPSBDUFVfTUFTS19OT05FLAogfTsKIHN0YXRpYyBzdHJ1Y3QgcmN1X2N0cmxibGsgcmN1X2JoX2N0cmxibGsgPSB7CiAJLmN1ciA9IC0zMDAsCiAJLmNvbXBsZXRlZCA9IC0zMDAsCisJLnBlbmRpbmcgPSAtMzAwLAogCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJnJjdV9iaF9jdHJsYmxrLmxvY2spLAogCS5jcHVtYXNrID0gQ1BVX01BU0tfTk9ORSwKIH07CkBAIC04Myw3ICs4NiwxMCBAQAogewogCWludCBjcHU7CiAJY3B1bWFza190IGNwdW1hc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCXNldF9uZWVkX3Jlc2NoZWQoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmNwLT5sb2NrLCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KCFyY3AtPnNpZ25hbGVkKSkgewogCQlyY3AtPnNpZ25hbGVkID0gMTsKIAkJLyoKQEAgLTEwOSw2ICsxMTUsNyBAQAogCQlmb3JfZWFjaF9jcHVfbWFza19ucihjcHUsIGNwdW1hc2spCiAJCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjcC0+bG9jaywgZmxhZ3MpOwogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBmb3JjZV9xdWllc2NlbnRfc3RhdGUoc3RydWN0IHJjdV9kYXRhICpyZHAsCkBAIC0xMTgsNiArMTI1LDEyNiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIF9fY2FsbF9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkLCBzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCwKKwkJc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJbG9uZyBiYXRjaDsKKworCWhlYWQtPm5leHQgPSBOVUxMOworCXNtcF9tYigpOyAvKiBSZWFkIG9mIHJjdS0+Y3VyIG11c3QgaGFwcGVuIGFmdGVyIGFueSBjaGFuZ2UgYnkgY2FsbGVyLiAqLworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIGJhdGNoIG51bWJlciBvZiB0aGlzIGNhbGxiYWNrLgorCSAqCisJICogVXNpbmcgQUNDRVNTX09OQ0UgdG8gYXZvaWQgdGhlIGZvbGxvd2luZyBlcnJvciB3aGVuIGdjYyBlbGltaW5hdGVzCisJICogbG9jYWwgdmFyaWFibGUgImJhdGNoIiBhbmQgZW1pdHMgY29kZXMgbGlrZSB0aGlzOgorCSAqCTEpIHJkcC0+YmF0Y2ggPSByY3AtPmN1ciArIDEgIyBnZXRzIG9sZCB2YWx1ZQorCSAqCS4uLi4uLgorCSAqCTIpcmN1X2JhdGNoX2FmdGVyKHJjcC0+Y3VyICsgMSwgcmRwLT5iYXRjaCkgIyBnZXRzIG5ldyB2YWx1ZQorCSAqIHRoZW4gWypueHR0YWlsWzBdLCAqbnh0dGFpbFsxXSkgbWF5IGNvbnRhaW4gY2FsbGJhY2tzCisJICogdGhhdCBiYXRjaCMgPSByZHAtPmJhdGNoLCBzZWUgdGhlIGNvbW1lbnQgb2Ygc3RydWN0IHJjdV9kYXRhLgorCSAqLworCWJhdGNoID0gQUNDRVNTX09OQ0UocmNwLT5jdXIpICsgMTsKKworCWlmIChyZHAtPm54dGxpc3QgJiYgcmN1X2JhdGNoX2FmdGVyKGJhdGNoLCByZHAtPmJhdGNoKSkgeworCQkvKiBwcm9jZXNzIGNhbGxiYWNrcyAqLworCQlyZHAtPm54dHRhaWxbMF0gPSByZHAtPm54dHRhaWxbMV07CisJCXJkcC0+bnh0dGFpbFsxXSA9IHJkcC0+bnh0dGFpbFsyXTsKKwkJaWYgKHJjdV9iYXRjaF9hZnRlcihiYXRjaCAtIDEsIHJkcC0+YmF0Y2gpKQorCQkJcmRwLT5ueHR0YWlsWzBdID0gcmRwLT5ueHR0YWlsWzJdOworCX0KKworCXJkcC0+YmF0Y2ggPSBiYXRjaDsKKwkqcmRwLT5ueHR0YWlsWzJdID0gaGVhZDsKKwlyZHAtPm54dHRhaWxbMl0gPSAmaGVhZC0+bmV4dDsKKworCWlmICh1bmxpa2VseSgrK3JkcC0+cWxlbiA+IHFoaW1hcmspKSB7CisJCXJkcC0+YmxpbWl0ID0gSU5UX01BWDsKKwkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKHJkcCwgJnJjdV9jdHJsYmxrKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUgorCitzdGF0aWMgdm9pZCByZWNvcmRfZ3Bfc3RhbGxfY2hlY2tfdGltZShzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCkKK3sKKwlyY3AtPmdwX3N0YXJ0ID0gamlmZmllczsKKwlyY3AtPmppZmZpZXNfc3RhbGwgPSBqaWZmaWVzICsgUkNVX1NFQ09ORFNfVElMTF9TVEFMTF9DSEVDSzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfb3RoZXJfY3B1X3N0YWxsKHN0cnVjdCByY3VfY3RybGJsayAqcmNwKQoreworCWludCBjcHU7CisJbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogT25seSBsZXQgb25lIENQVSBjb21wbGFpbiBhYm91dCBvdGhlcnMgcGVyIHRpbWUgaW50ZXJ2YWwuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmNwLT5sb2NrLCBmbGFncyk7CisJZGVsdGEgPSBqaWZmaWVzIC0gcmNwLT5qaWZmaWVzX3N0YWxsOworCWlmIChkZWx0YSA8IDIgfHwgcmNwLT5jdXIgIT0gcmNwLT5jb21wbGV0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmNwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJcmNwLT5qaWZmaWVzX3N0YWxsID0gamlmZmllcyArIFJDVV9TRUNPTkRTX1RJTExfU1RBTExfUkVDSEVDSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIE9LLCB0aW1lIHRvIHJhdCBvbiBvdXIgYnVkZHkuLi4gKi8KKworCXByaW50ayhLRVJOX0VSUiAiUkNVIGRldGVjdGVkIENQVSBzdGFsbHM6Iik7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgcmNwLT5jcHVtYXNrKSkKKwkJCXByaW50aygiICVkIiwgY3B1KTsKKwl9CisJcHJpbnRrKCIgKGRldGVjdGVkIGJ5ICVkLCB0PSVsZCBqaWZmaWVzKVxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCAobG9uZykoamlmZmllcyAtIHJjcC0+Z3Bfc3RhcnQpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY3B1X3N0YWxsKHN0cnVjdCByY3VfY3RybGJsayAqcmNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsoS0VSTl9FUlIgIlJDVSBkZXRlY3RlZCBDUFUgJWQgc3RhbGwgKHQ9JWx1LyVsdSBqaWZmaWVzKVxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcywKKwkJCWppZmZpZXMgLSByY3AtPmdwX3N0YXJ0KTsKKwlkdW1wX3N0YWNrKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJjcC0+bG9jaywgZmxhZ3MpOworCWlmICgobG9uZykoamlmZmllcyAtIHJjcC0+amlmZmllc19zdGFsbCkgPj0gMCkKKwkJcmNwLT5qaWZmaWVzX3N0YWxsID0KKwkJCWppZmZpZXMgKyBSQ1VfU0VDT05EU19USUxMX1NUQUxMX1JFQ0hFQ0s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmNwLT5sb2NrLCBmbGFncyk7CisJc2V0X25lZWRfcmVzY2hlZCgpOyAgLyoga2ljayBvdXJzZWx2ZXMgdG8gZ2V0IHRoaW5ncyBnb2luZy4gKi8KK30KKworc3RhdGljIHZvaWQgY2hlY2tfY3B1X3N0YWxsKHN0cnVjdCByY3VfY3RybGJsayAqcmNwKQoreworCWxvbmcgZGVsdGE7CisKKwlkZWx0YSA9IGppZmZpZXMgLSByY3AtPmppZmZpZXNfc3RhbGw7CisJaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHJjcC0+Y3B1bWFzaykgJiYgZGVsdGEgPj0gMCkgeworCisJCS8qIFdlIGhhdmVuJ3QgY2hlY2tlZCBpbiwgc28gZ28gZHVtcCBzdGFjay4gKi8KKwkJcHJpbnRfY3B1X3N0YWxsKHJjcCk7CisKKwl9IGVsc2UgaWYgKHJjcC0+Y3VyICE9IHJjcC0+Y29tcGxldGVkICYmIGRlbHRhID49IDIpIHsKKworCQkvKiBUaGV5IGhhZCB0d28gc2Vjb25kcyB0byBkdW1wIHN0YWNrLCBzbyBjb21wbGFpbi4gKi8KKwkJcHJpbnRfb3RoZXJfY3B1X3N0YWxsKHJjcCk7CisJfQorfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KKworc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9jdHJsYmxrICpyY3ApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19jcHVfc3RhbGwoc3RydWN0IHJjdV9jdHJsYmxrICpyY3ApCit7Cit9CisKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgKi8KKwogLyoqCiAgKiBjYWxsX3JjdSAtIFF1ZXVlIGFuIFJDVSBjYWxsYmFjayBmb3IgaW52b2NhdGlvbiBhZnRlciBhIGdyYWNlIHBlcmlvZC4KICAqIEBoZWFkOiBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IgcXVldWVpbmcgdGhlIFJDVSB1cGRhdGVzLgpAQCAtMTMzLDE4ICsyNjAsMTAgQEAKIAkJCQl2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpyY3UpKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHJjdV9kYXRhICpyZHA7CiAKIAloZWFkLT5mdW5jID0gZnVuYzsKLQloZWFkLT5uZXh0ID0gTlVMTDsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmRwID0gJl9fZ2V0X2NwdV92YXIocmN1X2RhdGEpOwotCSpyZHAtPm54dHRhaWwgPSBoZWFkOwotCXJkcC0+bnh0dGFpbCA9ICZoZWFkLT5uZXh0OwotCWlmICh1bmxpa2VseSgrK3JkcC0+cWxlbiA+IHFoaW1hcmspKSB7Ci0JCXJkcC0+YmxpbWl0ID0gSU5UX01BWDsKLQkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKHJkcCwgJnJjdV9jdHJsYmxrKTsKLQl9CisJX19jYWxsX3JjdShoZWFkLCAmcmN1X2N0cmxibGssICZfX2dldF9jcHVfdmFyKHJjdV9kYXRhKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2FsbF9yY3UpOwpAQCAtMTY5LDIwICsyODgsMTAgQEAKIAkJCQl2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpyY3UpKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHJjdV9kYXRhICpyZHA7CiAKIAloZWFkLT5mdW5jID0gZnVuYzsKLQloZWFkLT5uZXh0ID0gTlVMTDsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmRwID0gJl9fZ2V0X2NwdV92YXIocmN1X2JoX2RhdGEpOwotCSpyZHAtPm54dHRhaWwgPSBoZWFkOwotCXJkcC0+bnh0dGFpbCA9ICZoZWFkLT5uZXh0OwotCi0JaWYgKHVubGlrZWx5KCsrcmRwLT5xbGVuID4gcWhpbWFyaykpIHsKLQkJcmRwLT5ibGltaXQgPSBJTlRfTUFYOwotCQlmb3JjZV9xdWllc2NlbnRfc3RhdGUocmRwLCAmcmN1X2JoX2N0cmxibGspOwotCX0KLQorCV9fY2FsbF9yY3UoaGVhZCwgJnJjdV9iaF9jdHJsYmxrLCAmX19nZXRfY3B1X3ZhcihyY3VfYmhfZGF0YSkpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNhbGxfcmN1X2JoKTsKQEAgLTIxMSwxMiArMzIwLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYWlzZV9yY3Vfc29mdGlycSh2b2lkKQogewogCXJhaXNlX3NvZnRpcnEoUkNVX1NPRlRJUlEpOwotCS8qCi0JICogVGhlIHNtcF9tYigpIGhlcmUgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBjcHUncwotCSAqIF9fcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgcmVhZHMgdGhlIG1vc3QgcmVjZW50bHkgdXBkYXRlZAotCSAqIHZhbHVlIG9mIHJjdS0+Y3VyLgotCSAqLwotCXNtcF9tYigpOwogfQogCiAvKgpAQCAtMjI1LDYgKzMyOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9kb19iYXRjaChzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCByY3VfaGVhZCAqbmV4dCwgKmxpc3Q7CiAJaW50IGNvdW50ID0gMDsKIApAQCAtMjM5LDkgKzM0Myw5IEBACiAJfQogCXJkcC0+ZG9uZWxpc3QgPSBsaXN0OwogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcmRwLT5xbGVuIC09IGNvdW50OwotCWxvY2FsX2lycV9lbmFibGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJaWYgKHJkcC0+YmxpbWl0ID09IElOVF9NQVggJiYgcmRwLT5xbGVuIDw9IHFsb3dtYXJrKQogCQlyZHAtPmJsaW1pdCA9IGJsaW1pdDsKIApAQCAtMjY5LDYgKzM3Myw3IEBACiAgKiAgIHJjdV9jaGVja19xdWllc2NlbnRfc3RhdGUgY2FsbHMgcmN1X3N0YXJ0X2JhdGNoKDApIHRvIHN0YXJ0IHRoZSBuZXh0IGdyYWNlCiAgKiAgIHBlcmlvZCAoaWYgbmVjZXNzYXJ5KS4KICAqLworCiAvKgogICogUmVnaXN0ZXIgYSBuZXcgYmF0Y2ggb2YgY2FsbGJhY2tzLCBhbmQgc3RhcnQgaXQgdXAgaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vCiAgKiBhY3RpdmUgYmF0Y2ggYW5kIHRoZSBiYXRjaCB0byBiZSByZWdpc3RlcmVkIGhhcyBub3QgYWxyZWFkeSBvY2N1cnJlZC4KQEAgLTI3NiwxNSArMzgxLDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV9zdGFydF9iYXRjaChzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCkKIHsKLQlpZiAocmNwLT5uZXh0X3BlbmRpbmcgJiYKKwlpZiAocmNwLT5jdXIgIT0gcmNwLT5wZW5kaW5nICYmCiAJCQlyY3AtPmNvbXBsZXRlZCA9PSByY3AtPmN1cikgewotCQlyY3AtPm5leHRfcGVuZGluZyA9IDA7Ci0JCS8qCi0JCSAqIG5leHRfcGVuZGluZyA9PSAwIG11c3QgYmUgdmlzaWJsZSBpbgotCQkgKiBfX3JjdV9wcm9jZXNzX2NhbGxiYWNrcygpIGJlZm9yZSBpdCBjYW4gc2VlIG5ldyB2YWx1ZSBvZiBjdXIuCi0JCSAqLwotCQlzbXBfd21iKCk7CiAJCXJjcC0+Y3VyKys7CisJCXJlY29yZF9ncF9zdGFsbF9jaGVja190aW1lKHJjcCk7CiAKIAkJLyoKIAkJICogQWNjZXNzaW5nIG5vaHpfY3B1X21hc2sgYmVmb3JlIGluY3JlbWVudGluZyByY3AtPmN1ciBuZWVkcyBhCkBAIC0zMjIsNiArNDIyLDggQEAKIHN0YXRpYyB2b2lkIHJjdV9jaGVja19xdWllc2NlbnRfc3RhdGUoc3RydWN0IHJjdV9jdHJsYmxrICpyY3AsCiAJCQkJCXN0cnVjdCByY3VfZGF0YSAqcmRwKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlpZiAocmRwLT5xdWllc2NiYXRjaCAhPSByY3AtPmN1cikgewogCQkvKiBzdGFydCBuZXcgZ3JhY2UgcGVyaW9kOiAqLwogCQlyZHAtPnFzX3BlbmRpbmcgPSAxOwpAQCAtMzQ1LDcgKzQ0Nyw3IEBACiAJCXJldHVybjsKIAlyZHAtPnFzX3BlbmRpbmcgPSAwOwogCi0Jc3Bpbl9sb2NrKCZyY3AtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZyY3AtPmxvY2ssIGZsYWdzKTsKIAkvKgogCSAqIHJkcC0+cXVpZXNjYmF0Y2gvcmNwLT5jdXIgYW5kIHRoZSBjcHUgYml0bWFwIGNhbiBjb21lIG91dCBvZiBzeW5jCiAJICogZHVyaW5nIGNwdSBzdGFydHVwLiBJZ25vcmUgdGhlIHF1aWVzY2VudCBzdGF0ZS4KQEAgLTM1Myw3ICs0NTUsNyBAQAogCWlmIChsaWtlbHkocmRwLT5xdWllc2NiYXRjaCA9PSByY3AtPmN1cikpCiAJCWNwdV9xdWlldChyZHAtPmNwdSwgcmNwKTsKIAotCXNwaW5fdW5sb2NrKCZyY3AtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjcC0+bG9jaywgZmxhZ3MpOwogfQogCiAKQEAgLTM2NCwzMyArNDY2LDM4IEBACiAgKiB3aGljaCBpcyBkZWFkIGFuZCBoZW5jZSBub3QgcHJvY2Vzc2luZyBpbnRlcnJ1cHRzLgogICovCiBzdGF0aWMgdm9pZCByY3VfbW92ZV9iYXRjaChzdHJ1Y3QgcmN1X2RhdGEgKnRoaXNfcmRwLCBzdHJ1Y3QgcmN1X2hlYWQgKmxpc3QsCi0JCQkJc3RydWN0IHJjdV9oZWFkICoqdGFpbCkKKwkJCQlzdHJ1Y3QgcmN1X2hlYWQgKip0YWlsLCBsb25nIGJhdGNoKQogewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JKnRoaXNfcmRwLT5ueHR0YWlsID0gbGlzdDsKLQlpZiAobGlzdCkKLQkJdGhpc19yZHAtPm54dHRhaWwgPSB0YWlsOwotCWxvY2FsX2lycV9lbmFibGUoKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxpc3QpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQl0aGlzX3JkcC0+YmF0Y2ggPSBiYXRjaDsKKwkJKnRoaXNfcmRwLT5ueHR0YWlsWzJdID0gbGlzdDsKKwkJdGhpc19yZHAtPm54dHRhaWxbMl0gPSB0YWlsOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX3JjdV9vZmZsaW5lX2NwdShzdHJ1Y3QgcmN1X2RhdGEgKnRoaXNfcmRwLAogCQkJCXN0cnVjdCByY3VfY3RybGJsayAqcmNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKLQkvKiBpZiB0aGUgY3B1IGdvaW5nIG9mZmxpbmUgb3ducyB0aGUgZ3JhY2UgcGVyaW9kCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogaWYgdGhlIGNwdSBnb2luZyBvZmZsaW5lIG93bnMgdGhlIGdyYWNlIHBlcmlvZAogCSAqIHdlIGNhbiBibG9jayBpbmRlZmluaXRlbHkgd2FpdGluZyBmb3IgaXQsIHNvIGZsdXNoCiAJICogaXQgaGVyZQogCSAqLwotCXNwaW5fbG9ja19iaCgmcmNwLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmNwLT5sb2NrLCBmbGFncyk7CiAJaWYgKHJjcC0+Y3VyICE9IHJjcC0+Y29tcGxldGVkKQogCQljcHVfcXVpZXQocmRwLT5jcHUsIHJjcCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJjcC0+bG9jayk7Ci0JcmN1X21vdmVfYmF0Y2godGhpc19yZHAsIHJkcC0+ZG9uZWxpc3QsIHJkcC0+ZG9uZXRhaWwpOwotCXJjdV9tb3ZlX2JhdGNoKHRoaXNfcmRwLCByZHAtPmN1cmxpc3QsIHJkcC0+Y3VydGFpbCk7Ci0JcmN1X21vdmVfYmF0Y2godGhpc19yZHAsIHJkcC0+bnh0bGlzdCwgcmRwLT5ueHR0YWlsKTsKKwlyY3VfbW92ZV9iYXRjaCh0aGlzX3JkcCwgcmRwLT5kb25lbGlzdCwgcmRwLT5kb25ldGFpbCwgcmNwLT5jdXIgKyAxKTsKKwlyY3VfbW92ZV9iYXRjaCh0aGlzX3JkcCwgcmRwLT5ueHRsaXN0LCByZHAtPm54dHRhaWxbMl0sIHJjcC0+Y3VyICsgMSk7CisJc3Bpbl91bmxvY2soJnJjcC0+bG9jayk7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXRoaXNfcmRwLT5xbGVuICs9IHJkcC0+cWxlbjsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCByY3Vfb2ZmbGluZV9jcHUoaW50IGNwdSkKQEAgLTQyMCwzOCArNTI3LDUyIEBACiBzdGF0aWMgdm9pZCBfX3JjdV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCwKIAkJCQkJc3RydWN0IHJjdV9kYXRhICpyZHApCiB7Ci0JaWYgKHJkcC0+Y3VybGlzdCAmJiAhcmN1X2JhdGNoX2JlZm9yZShyY3AtPmNvbXBsZXRlZCwgcmRwLT5iYXRjaCkpIHsKLQkJKnJkcC0+ZG9uZXRhaWwgPSByZHAtPmN1cmxpc3Q7Ci0JCXJkcC0+ZG9uZXRhaWwgPSByZHAtPmN1cnRhaWw7Ci0JCXJkcC0+Y3VybGlzdCA9IE5VTEw7Ci0JCXJkcC0+Y3VydGFpbCA9ICZyZHAtPmN1cmxpc3Q7Ci0JfQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBjb21wbGV0ZWRfc25hcDsKIAotCWlmIChyZHAtPm54dGxpc3QgJiYgIXJkcC0+Y3VybGlzdCkgewotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlyZHAtPmN1cmxpc3QgPSByZHAtPm54dGxpc3Q7Ci0JCXJkcC0+Y3VydGFpbCA9IHJkcC0+bnh0dGFpbDsKLQkJcmRwLT5ueHRsaXN0ID0gTlVMTDsKLQkJcmRwLT5ueHR0YWlsID0gJnJkcC0+bnh0bGlzdDsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmIChyZHAtPm54dGxpc3QpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQljb21wbGV0ZWRfc25hcCA9IEFDQ0VTU19PTkNFKHJjcC0+Y29tcGxldGVkKTsKIAogCQkvKgotCQkgKiBzdGFydCB0aGUgbmV4dCBiYXRjaCBvZiBjYWxsYmFja3MKKwkJICogbW92ZSB0aGUgb3RoZXIgZ3JhY2UtcGVyaW9kLWNvbXBsZXRlZCBlbnRyaWVzIHRvCisJCSAqIFtyZHAtPm54dGxpc3QsICpyZHAtPm54dHRhaWxbMF0pIHRlbXBvcmFyaWx5CiAJCSAqLworCQlpZiAoIXJjdV9iYXRjaF9iZWZvcmUoY29tcGxldGVkX3NuYXAsIHJkcC0+YmF0Y2gpKQorCQkJcmRwLT5ueHR0YWlsWzBdID0gcmRwLT5ueHR0YWlsWzFdID0gcmRwLT5ueHR0YWlsWzJdOworCQllbHNlIGlmICghcmN1X2JhdGNoX2JlZm9yZShjb21wbGV0ZWRfc25hcCwgcmRwLT5iYXRjaCAtIDEpKQorCQkJcmRwLT5ueHR0YWlsWzBdID0gcmRwLT5ueHR0YWlsWzFdOwogCi0JCS8qIGRldGVybWluZSBiYXRjaCBudW1iZXIgKi8KLQkJcmRwLT5iYXRjaCA9IHJjcC0+Y3VyICsgMTsKLQkJLyogc2VlIHRoZSBjb21tZW50IGFuZCBjb3JyZXNwb25kaW5nIHdtYigpIGluCi0JCSAqIHRoZSByY3Vfc3RhcnRfYmF0Y2goKQorCQkvKgorCQkgKiB0aGUgZ3JhY2UgcGVyaW9kIGZvciBlbnRyaWVzIGluCisJCSAqIFtyZHAtPm54dGxpc3QsICpyZHAtPm54dHRhaWxbMF0pIGhhcyBjb21wbGV0ZWQgYW5kCisJCSAqIG1vdmUgdGhlc2UgZW50cmllcyB0byBkb25lbGlzdAogCQkgKi8KLQkJc21wX3JtYigpOworCQlpZiAocmRwLT5ueHR0YWlsWzBdICE9ICZyZHAtPm54dGxpc3QpIHsKKwkJCSpyZHAtPmRvbmV0YWlsID0gcmRwLT5ueHRsaXN0OworCQkJcmRwLT5kb25ldGFpbCA9IHJkcC0+bnh0dGFpbFswXTsKKwkJCXJkcC0+bnh0bGlzdCA9ICpyZHAtPm54dHRhaWxbMF07CisJCQkqcmRwLT5kb25ldGFpbCA9IE5VTEw7CiAKLQkJaWYgKCFyY3AtPm5leHRfcGVuZGluZykgeworCQkJaWYgKHJkcC0+bnh0dGFpbFsxXSA9PSByZHAtPm54dHRhaWxbMF0pCisJCQkJcmRwLT5ueHR0YWlsWzFdID0gJnJkcC0+bnh0bGlzdDsKKwkJCWlmIChyZHAtPm54dHRhaWxbMl0gPT0gcmRwLT5ueHR0YWlsWzBdKQorCQkJCXJkcC0+bnh0dGFpbFsyXSA9ICZyZHAtPm54dGxpc3Q7CisJCQlyZHAtPm54dHRhaWxbMF0gPSAmcmRwLT5ueHRsaXN0OworCQl9CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWlmIChyY3VfYmF0Y2hfYWZ0ZXIocmRwLT5iYXRjaCwgcmNwLT5wZW5kaW5nKSkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczI7CisKIAkJCS8qIGFuZCBzdGFydCBpdC9zY2hlZHVsZSBzdGFydCBpZiBpdCdzIGEgbmV3IGJhdGNoICovCi0JCQlzcGluX2xvY2soJnJjcC0+bG9jayk7Ci0JCQlyY3AtPm5leHRfcGVuZGluZyA9IDE7Ci0JCQlyY3Vfc3RhcnRfYmF0Y2gocmNwKTsKLQkJCXNwaW5fdW5sb2NrKCZyY3AtPmxvY2spOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJjcC0+bG9jaywgZmxhZ3MyKTsKKwkJCWlmIChyY3VfYmF0Y2hfYWZ0ZXIocmRwLT5iYXRjaCwgcmNwLT5wZW5kaW5nKSkgeworCQkJCXJjcC0+cGVuZGluZyA9IHJkcC0+YmF0Y2g7CisJCQkJcmN1X3N0YXJ0X2JhdGNoKHJjcCk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY3AtPmxvY2ssIGZsYWdzMik7CiAJCX0KIAl9CiAKQEAgLTQ2MiwyMSArNTgzLDUzIEBACiAKIHN0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKnVudXNlZCkKIHsKKwkvKgorCSAqIE1lbW9yeSByZWZlcmVuY2VzIGZyb20gYW55IHByaW9yIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMKKwkgKiBleGVjdXRlZCBieSB0aGUgaW50ZXJydXB0ZWQgY29kZSBtdXN0IGJlIHNlZSBiZWZvcmUgYW55IFJDVQorCSAqIGdyYWNlLXBlcmlvZCBtYW51cHVsYXRpb25zIGJlbG93LgorCSAqLworCisJc21wX21iKCk7IC8qIFNlZSBhYm92ZSBibG9jayBjb21tZW50LiAqLworCiAJX19yY3VfcHJvY2Vzc19jYWxsYmFja3MoJnJjdV9jdHJsYmxrLCAmX19nZXRfY3B1X3ZhcihyY3VfZGF0YSkpOwogCV9fcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCZyY3VfYmhfY3RybGJsaywgJl9fZ2V0X2NwdV92YXIocmN1X2JoX2RhdGEpKTsKKworCS8qCisJICogTWVtb3J5IHJlZmVyZW5jZXMgZnJvbSBhbnkgbGF0ZXIgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucworCSAqIGV4ZWN1dGVkIGJ5IHRoZSBpbnRlcnJ1cHRlZCBjb2RlIG11c3QgYmUgc2VlIGFmdGVyIGFueSBSQ1UKKwkgKiBncmFjZS1wZXJpb2QgbWFudXB1bGF0aW9ucyBhYm92ZS4KKwkgKi8KKworCXNtcF9tYigpOyAvKiBTZWUgYWJvdmUgYmxvY2sgY29tbWVudC4gKi8KIH0KIAogc3RhdGljIGludCBfX3JjdV9wZW5kaW5nKHN0cnVjdCByY3VfY3RybGJsayAqcmNwLCBzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKLQkvKiBUaGlzIGNwdSBoYXMgcGVuZGluZyByY3UgZW50cmllcyBhbmQgdGhlIGdyYWNlIHBlcmlvZAotCSAqIGZvciB0aGVtIGhhcyBjb21wbGV0ZWQuCi0JICovCi0JaWYgKHJkcC0+Y3VybGlzdCAmJiAhcmN1X2JhdGNoX2JlZm9yZShyY3AtPmNvbXBsZXRlZCwgcmRwLT5iYXRjaCkpCi0JCXJldHVybiAxOworCS8qIENoZWNrIGZvciBDUFUgc3RhbGxzLCBpZiBlbmFibGVkLiAqLworCWNoZWNrX2NwdV9zdGFsbChyY3ApOwogCi0JLyogVGhpcyBjcHUgaGFzIG5vIHBlbmRpbmcgZW50cmllcywgYnV0IHRoZXJlIGFyZSBuZXcgZW50cmllcyAqLwotCWlmICghcmRwLT5jdXJsaXN0ICYmIHJkcC0+bnh0bGlzdCkKLQkJcmV0dXJuIDE7CisJaWYgKHJkcC0+bnh0bGlzdCkgeworCQlsb25nIGNvbXBsZXRlZF9zbmFwID0gQUNDRVNTX09OQ0UocmNwLT5jb21wbGV0ZWQpOworCisJCS8qCisJCSAqIFRoaXMgY3B1IGhhcyBwZW5kaW5nIHJjdSBlbnRyaWVzIGFuZCB0aGUgZ3JhY2UgcGVyaW9kCisJCSAqIGZvciB0aGVtIGhhcyBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoIXJjdV9iYXRjaF9iZWZvcmUoY29tcGxldGVkX3NuYXAsIHJkcC0+YmF0Y2gpKQorCQkJcmV0dXJuIDE7CisJCWlmICghcmN1X2JhdGNoX2JlZm9yZShjb21wbGV0ZWRfc25hcCwgcmRwLT5iYXRjaCAtIDEpICYmCisJCQkJcmRwLT5ueHR0YWlsWzBdICE9IHJkcC0+bnh0dGFpbFsxXSkKKwkJCXJldHVybiAxOworCQlpZiAocmRwLT5ueHR0YWlsWzBdICE9ICZyZHAtPm54dGxpc3QpCisJCQlyZXR1cm4gMTsKKworCQkvKgorCQkgKiBUaGlzIGNwdSBoYXMgcGVuZGluZyByY3UgZW50cmllcyBhbmQgdGhlIG5ldyBiYXRjaAorCQkgKiBmb3IgdGhlbiBoYXNuJ3QgYmVlbiBzdGFydGVkIG5vciBzY2hlZHVsZWQgc3RhcnQKKwkJICovCisJCWlmIChyY3VfYmF0Y2hfYWZ0ZXIocmRwLT5iYXRjaCwgcmNwLT5wZW5kaW5nKSkKKwkJCXJldHVybiAxOworCX0KIAogCS8qIFRoaXMgY3B1IGhhcyBmaW5pc2hlZCBjYWxsYmFja3MgdG8gaW52b2tlICovCiAJaWYgKHJkcC0+ZG9uZWxpc3QpCkBAIC01MTIsOSArNjY1LDE1IEBACiAJc3RydWN0IHJjdV9kYXRhICpyZHAgPSAmcGVyX2NwdShyY3VfZGF0YSwgY3B1KTsKIAlzdHJ1Y3QgcmN1X2RhdGEgKnJkcF9iaCA9ICZwZXJfY3B1KHJjdV9iaF9kYXRhLCBjcHUpOwogCi0JcmV0dXJuICghIXJkcC0+Y3VybGlzdCB8fCAhIXJkcF9iaC0+Y3VybGlzdCB8fCByY3VfcGVuZGluZyhjcHUpKTsKKwlyZXR1cm4gISFyZHAtPm54dGxpc3QgfHwgISFyZHBfYmgtPm54dGxpc3QgfHwgcmN1X3BlbmRpbmcoY3B1KTsKIH0KIAorLyoKKyAqIFRvcC1sZXZlbCBmdW5jdGlvbiBkcml2aW5nIFJDVSBncmFjZS1wZXJpb2QgZGV0ZWN0aW9uLCBub3JtYWxseQorICogaW52b2tlZCBmcm9tIHRoZSBzY2hlZHVsZXItY2xvY2sgaW50ZXJydXB0LiAgVGhpcyBmdW5jdGlvbiBzaW1wbHkKKyAqIGluY3JlbWVudHMgY291bnRlcnMgdGhhdCBhcmUgcmVhZCBvbmx5IGZyb20gc29mdGlycSBieSB0aGlzIHNhbWUKKyAqIENQVSwgc28gdGhlcmUgYXJlIG5vIG1lbW9yeSBiYXJyaWVycyByZXF1aXJlZC4KKyAqLwogdm9pZCByY3VfY2hlY2tfY2FsbGJhY2tzKGludCBjcHUsIGludCB1c2VyKQogewogCWlmICh1c2VyIHx8CkBAIC01NTgsMTQgKzcxNywxNyBAQAogc3RhdGljIHZvaWQgcmN1X2luaXRfcGVyY3B1X2RhdGEoaW50IGNwdSwgc3RydWN0IHJjdV9jdHJsYmxrICpyY3AsCiAJCQkJCQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJjcC0+bG9jaywgZmxhZ3MpOwogCW1lbXNldChyZHAsIDAsIHNpemVvZigqcmRwKSk7Ci0JcmRwLT5jdXJ0YWlsID0gJnJkcC0+Y3VybGlzdDsKLQlyZHAtPm54dHRhaWwgPSAmcmRwLT5ueHRsaXN0OworCXJkcC0+bnh0dGFpbFswXSA9IHJkcC0+bnh0dGFpbFsxXSA9IHJkcC0+bnh0dGFpbFsyXSA9ICZyZHAtPm54dGxpc3Q7CiAJcmRwLT5kb25ldGFpbCA9ICZyZHAtPmRvbmVsaXN0OwogCXJkcC0+cXVpZXNjYmF0Y2ggPSByY3AtPmNvbXBsZXRlZDsKIAlyZHAtPnFzX3BlbmRpbmcgPSAwOwogCXJkcC0+Y3B1ID0gY3B1OwogCXJkcC0+YmxpbWl0ID0gYmxpbWl0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjcC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X29ubGluZV9jcHUoaW50IGNwdSkKQEAgLTYxMCw2ICs3NzIsOSBAQAogICovCiB2b2lkIF9faW5pdCBfX3JjdV9pbml0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IKKwlwcmludGsoS0VSTl9JTkZPICJSQ1UtYmFzZWQgZGV0ZWN0aW9uIG9mIHN0YWxsZWQgQ1BVcyBpcyBlbmFibGVkLlxuIik7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SICovCiAJcmN1X2NwdV9ub3RpZnkoJnJjdV9uYiwgQ1BVX1VQX1BSRVBBUkUsCiAJCQkodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJLyogUmVnaXN0ZXIgbm90aWZpZXIgZm9yIG5vbi1ib290IENQVXMgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwcmVlbXB0LmMgYi9rZXJuZWwvcmN1cHJlZW1wdC5jCmluZGV4IDI3ODI3OTMuLmNhNGJiYmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwcmVlbXB0LmMKKysrIGIva2VybmVsL3JjdXByZWVtcHQuYwpAQCAtNTksMTQgKzU5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwcmVlbXB0X3RyYWNlLmg+CiAKIC8qCi0gKiBNYWNybyB0aGF0IHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tIHJlb3JkZXJpbmcgYWNjZXNzZXMsIGJ1dCBkb2VzCi0gKiBhYnNvbHV0ZWx5IC1ub3RoaW5nLSB0byBwcmV2ZW50IENQVXMgZnJvbSByZW9yZGVyaW5nLiAgVGhpcyBpcyB1c2VkCi0gKiBvbmx5IHRvIG1lZGlhdGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG1haW5saW5lIGNvZGUgYW5kIGhhcmR3YXJlCi0gKiBpbnRlcnJ1cHQgYW5kIE5NSSBoYW5kbGVycy4KLSAqLwotI2RlZmluZSBBQ0NFU1NfT05DRSh4KSAoKih2b2xhdGlsZSB0eXBlb2YoeCkgKikmKHgpKQotCi0vKgogICogUFJFRU1QVF9SQ1UgZGF0YSBzdHJ1Y3R1cmVzLgogICovCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwcmVlbXB0X3RyYWNlLmMgYi9rZXJuZWwvcmN1cHJlZW1wdF90cmFjZS5jCmluZGV4IDVlZGY4MmMuLjM1YzJkMzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwcmVlbXB0X3RyYWNlLmMKKysrIGIva2VybmVsL3JjdXByZWVtcHRfdHJhY2UuYwpAQCAtMzA4LDExICszMDgsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgcmN1cHJlZW1wdF90cmFjZV9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCW11dGV4X2luaXQoJnJjdXByZWVtcHRfdHJhY2VfbXV0ZXgpOwogCXJjdXByZWVtcHRfdHJhY2VfYnVmID0ga21hbGxvYyhSQ1VQUkVFTVBUX1RSQUNFX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJjdXByZWVtcHRfdHJhY2VfYnVmKQogCQlyZXR1cm4gMTsKLQlyZXR1cm4gcmN1cHJlZW1wdF9kZWJ1Z2ZzX2luaXQoKTsKKwlyZXQgPSByY3VwcmVlbXB0X2RlYnVnZnNfaW5pdCgpOworCWlmIChyZXQpCisJCWtmcmVlKHJjdXByZWVtcHRfdHJhY2VfYnVmKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcmN1cHJlZW1wdF90cmFjZV9jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDAzZDc5NmMuLjQwODlkMTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0zOCwxMCArMzgsNiBAQAogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhyZXNvdXJjZV9sb2NrKTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0KLWVudW0geyBNQVhfSU9SRVNfTEVWRUwgPSA1IH07Ci0KIHN0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnAgPSB2OwpAQCAtNTMsNiArNDksMTAgQEAKIAlyZXR1cm4gcC0+c2libGluZzsKIH0KIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK2VudW0geyBNQVhfSU9SRVNfTEVWRUwgPSA1IH07CisKIHN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiAJX19hY3F1aXJlcyhyZXNvdXJjZV9sb2NrKQogewpAQCAtNTE2LDYgKzUxNiw3MCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBfX3Jlc2VydmVfcmVnaW9uX3dpdGhfc3BsaXQoc3RydWN0IHJlc291cmNlICpyb290LAorCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBlbmQsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJlc291cmNlICpwYXJlbnQgPSByb290OworCXN0cnVjdCByZXNvdXJjZSAqY29uZmxpY3Q7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBremFsbG9jKHNpemVvZigqcmVzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuOworCisJcmVzLT5uYW1lID0gbmFtZTsKKwlyZXMtPnN0YXJ0ID0gc3RhcnQ7CisJcmVzLT5lbmQgPSBlbmQ7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWTsKKworCWZvciAoOzspIHsKKwkJY29uZmxpY3QgPSBfX3JlcXVlc3RfcmVzb3VyY2UocGFyZW50LCByZXMpOworCQlpZiAoIWNvbmZsaWN0KQorCQkJYnJlYWs7CisJCWlmIChjb25mbGljdCAhPSBwYXJlbnQpIHsKKwkJCXBhcmVudCA9IGNvbmZsaWN0OworCQkJaWYgKCEoY29uZmxpY3QtPmZsYWdzICYgSU9SRVNPVVJDRV9CVVNZKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFVoaHVoLCB0aGF0IGRpZG4ndCB3b3JrIG91dC4uICovCisJCWtmcmVlKHJlcyk7CisJCXJlcyA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCWlmICghcmVzKSB7CisJCS8qIGZhaWxlZCwgc3BsaXQgYW5kIHRyeSBhZ2FpbiAqLworCisJCS8qIGNvbmZsaWN0IGNvdmVyZWQgd2hvbGUgYXJlYSAqLworCQlpZiAoY29uZmxpY3QtPnN0YXJ0IDw9IHN0YXJ0ICYmIGNvbmZsaWN0LT5lbmQgPj0gZW5kKQorCQkJcmV0dXJuOworCisJCWlmIChjb25mbGljdC0+c3RhcnQgPiBzdGFydCkKKwkJCV9fcmVzZXJ2ZV9yZWdpb25fd2l0aF9zcGxpdChyb290LCBzdGFydCwgY29uZmxpY3QtPnN0YXJ0LTEsIG5hbWUpOworCQlpZiAoIShjb25mbGljdC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JVU1kpKSB7CisJCQlyZXNvdXJjZV9zaXplX3QgY29tbW9uX3N0YXJ0LCBjb21tb25fZW5kOworCisJCQljb21tb25fc3RhcnQgPSBtYXgoY29uZmxpY3QtPnN0YXJ0LCBzdGFydCk7CisJCQljb21tb25fZW5kID0gbWluKGNvbmZsaWN0LT5lbmQsIGVuZCk7CisJCQlpZiAoY29tbW9uX3N0YXJ0IDwgY29tbW9uX2VuZCkKKwkJCQlfX3Jlc2VydmVfcmVnaW9uX3dpdGhfc3BsaXQocm9vdCwgY29tbW9uX3N0YXJ0LCBjb21tb25fZW5kLCBuYW1lKTsKKwkJfQorCQlpZiAoY29uZmxpY3QtPmVuZCA8IGVuZCkKKwkJCV9fcmVzZXJ2ZV9yZWdpb25fd2l0aF9zcGxpdChyb290LCBjb25mbGljdC0+ZW5kKzEsIGVuZCwgbmFtZSk7CisJfQorCit9CisKK3ZvaWQgcmVzZXJ2ZV9yZWdpb25fd2l0aF9zcGxpdChzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCisJCXJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IGVuZCwKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKwlfX3Jlc2VydmVfcmVnaW9uX3dpdGhfc3BsaXQocm9vdCwgc3RhcnQsIGVuZCwgbmFtZSk7CisJd3JpdGVfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKK30KKwogRVhQT1JUX1NZTUJPTChhZGp1c3RfcmVzb3VyY2UpOwogCiAvKioKQEAgLTU2MiwzMyArNjI2LDM0IEBACiB7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBremFsbG9jKHNpemVvZigqcmVzKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAocmVzKSB7Ci0JCXJlcy0+bmFtZSA9IG5hbWU7Ci0JCXJlcy0+c3RhcnQgPSBzdGFydDsKLQkJcmVzLT5lbmQgPSBzdGFydCArIG4gLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKIAotCQl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKwlyZXMtPm5hbWUgPSBuYW1lOworCXJlcy0+c3RhcnQgPSBzdGFydDsKKwlyZXMtPmVuZCA9IHN0YXJ0ICsgbiAtIDE7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWTsKIAotCQlmb3IgKDs7KSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKmNvbmZsaWN0OworCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwogCi0JCQljb25mbGljdCA9IF9fcmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsIHJlcyk7Ci0JCQlpZiAoIWNvbmZsaWN0KQotCQkJCWJyZWFrOwotCQkJaWYgKGNvbmZsaWN0ICE9IHBhcmVudCkgewotCQkJCXBhcmVudCA9IGNvbmZsaWN0OwotCQkJCWlmICghKGNvbmZsaWN0LT5mbGFncyAmIElPUkVTT1VSQ0VfQlVTWSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQorCWZvciAoOzspIHsKKwkJc3RydWN0IHJlc291cmNlICpjb25mbGljdDsKIAotCQkJLyogVWhodWgsIHRoYXQgZGlkbid0IHdvcmsgb3V0Li4gKi8KLQkJCWtmcmVlKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOworCQljb25mbGljdCA9IF9fcmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsIHJlcyk7CisJCWlmICghY29uZmxpY3QpCiAJCQlicmVhazsKKwkJaWYgKGNvbmZsaWN0ICE9IHBhcmVudCkgeworCQkJcGFyZW50ID0gY29uZmxpY3Q7CisJCQlpZiAoIShjb25mbGljdC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JVU1kpKQorCQkJCWNvbnRpbnVlOwogCQl9Ci0JCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CisKKwkJLyogVWhodWgsIHRoYXQgZGlkbid0IHdvcmsgb3V0Li4gKi8KKwkJa2ZyZWUocmVzKTsKKwkJcmVzID0gTlVMTDsKKwkJYnJlYWs7CiAJfQorCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CiAJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0woX19yZXF1ZXN0X3JlZ2lvbik7CkBAIC03NjMsMyArODI4LDQwIEBACiB9CiAKIF9fc2V0dXAoInJlc2VydmU9IiwgcmVzZXJ2ZV9zZXR1cCk7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIGFkZHIgYW5kIHNpemUgc3BhbnMgbW9yZSB0aGFuIGFueSBzbG90IGluIHRoZQorICogaW9tZW0gcmVzb3VyY2UgdHJlZS4KKyAqLworaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2socmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnAgPSAmaW9tZW1fcmVzb3VyY2U7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGw7CisKKwlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOworCWZvciAocCA9IHAtPmNoaWxkOyBwIDsgcCA9IHJfbmV4dChOVUxMLCBwLCAmbCkpIHsKKwkJLyoKKwkJICogV2UgY2FuIHByb2JhYmx5IHNraXAgdGhlIHJlc291cmNlcyB3aXRob3V0CisJCSAqIElPUkVTT1VSQ0VfSU8gYXR0cmlidXRlPworCQkgKi8KKwkJaWYgKHAtPnN0YXJ0ID49IGFkZHIgKyBzaXplKQorCQkJY29udGludWU7CisJCWlmIChwLT5lbmQgPCBhZGRyKQorCQkJY29udGludWU7CisJCWlmIChwLT5zdGFydCA8PSBhZGRyICYmIChwLT5lbmQgPj0gYWRkciArIHNpemUgLSAxKSkKKwkJCWNvbnRpbnVlOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZXNvdXJjZSBtYXAgc2FuaXR5IGNoZWNrIGNvbmZsaWN0OiAiCisJCSAgICAgICAiMHglbGx4IDB4JWxseCAweCVsbHggMHglbGx4ICVzXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoYWRkciArIHNpemUgLSAxKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c3RhcnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXAtPmVuZCwKKwkJICAgICAgIHAtPm5hbWUpOworCQllcnIgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IGU0NmI1YWYuLmViM2M3MjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC0yMDEsMTQgKzIwMSwxOSBAQAogCWhydGltZXJfaW5pdCgmcnRfYi0+cnRfcGVyaW9kX3RpbWVyLAogCQkJQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlydF9iLT5ydF9wZXJpb2RfdGltZXIuZnVuY3Rpb24gPSBzY2hlZF9ydF9wZXJpb2RfdGltZXI7Ci0JcnRfYi0+cnRfcGVyaW9kX3RpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfTk9fU09GVElSUTsKKwlydF9iLT5ydF9wZXJpb2RfdGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9VTkxPQ0tFRDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnRfYmFuZHdpZHRoX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPj0gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RhcnRfcnRfYmFuZHdpZHRoKHN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IpCiB7CiAJa3RpbWVfdCBub3c7CiAKLQlpZiAocnRfYi0+cnRfcnVudGltZSA9PSBSVU5USU1FX0lORikKKwlpZiAocnRfYmFuZHdpZHRoX2VuYWJsZWQoKSAmJiBydF9iLT5ydF9ydW50aW1lID09IFJVTlRJTUVfSU5GKQogCQlyZXR1cm47CiAKIAlpZiAoaHJ0aW1lcl9hY3RpdmUoJnJ0X2ItPnJ0X3BlcmlvZF90aW1lcikpCkBAIC0yOTcsOSArMzAyLDkgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5LCBpbml0X3NjaGVkX3J0X2VudGl0eSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJ0X3JxLCBpbml0X3J0X3JxKSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogI2VuZGlmIC8qIENPTkZJR19SVF9HUk9VUF9TQ0hFRCAqLwotI2Vsc2UgLyogIUNPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCisjZWxzZSAvKiAhQ09ORklHX1VTRVJfU0NIRUQgKi8KICNkZWZpbmUgcm9vdF90YXNrX2dyb3VwIGluaXRfdGFza19ncm91cAotI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCisjZW5kaWYgLyogQ09ORklHX1VTRVJfU0NIRUQgKi8KIAogLyogdGFza19ncm91cF9sb2NrIHNlcmlhbGl6ZXMgYWRkL3JlbW92ZSBvZiB0YXNrIGdyb3VwcyBhbmQgYWxzbyBjaGFuZ2VzIHRvCiAgKiBhIHRhc2sgZ3JvdXAncyBjcHUgc2hhcmVzLgpAQCAtNjAzLDkgKzYwOCw5IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgcnEsIHJ1bnF1ZXVlcyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19wcmVlbXB0X2N1cnIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3ByZWVtcHRfY3VycihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBzeW5jKQogewotCXJxLT5jdXJyLT5zY2hlZF9jbGFzcy0+Y2hlY2tfcHJlZW1wdF9jdXJyKHJxLCBwKTsKKwlycS0+Y3Vyci0+c2NoZWRfY2xhc3MtPmNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgc3luYyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV9vZihzdHJ1Y3QgcnEgKnJxKQpAQCAtMTA4Niw3ICsxMDkxLDcgQEAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfaHJ0aWNrKHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgaW5pdF9ocnRpY2sodm9pZCkKIHsKIAlob3RjcHVfbm90aWZpZXIoaG90cGx1Z19ocnRpY2ssIDApOwogfQpAQCAtMTEwMSw3ICsxMTA2LDcgQEAKIAlocnRpbWVyX3N0YXJ0KCZycS0+aHJ0aWNrX3RpbWVyLCBuc190b19rdGltZShkZWxheSksIEhSVElNRVJfTU9ERV9SRUwpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X2hydGljayh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGluaXRfaHJ0aWNrKHZvaWQpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwpAQCAtMTExOCw5ICsxMTIzLDkgQEAKIAogCWhydGltZXJfaW5pdCgmcnEtPmhydGlja190aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlycS0+aHJ0aWNrX3RpbWVyLmZ1bmN0aW9uID0gaHJ0aWNrOwotCXJxLT5ocnRpY2tfdGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJROworCXJxLT5ocnRpY2tfdGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9QRVJDUFU7CiB9Ci0jZWxzZQorI2Vsc2UJLyogQ09ORklHX1NDSEVEX0hSVElDSyAqLwogc3RhdGljIGlubGluZSB2b2lkIGhydGlja19jbGVhcihzdHJ1Y3QgcnEgKnJxKQogewogfQpAQCAtMTEzMiw3ICsxMTM3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2hydGljayh2b2lkKQogewogfQotI2VuZGlmCisjZW5kaWYJLyogQ09ORklHX1NDSEVEX0hSVElDSyAqLwogCiAvKgogICogcmVzY2hlZF90YXNrIC0gbWFyayBhIHRhc2sgJ3RvIGJlIHJlc2NoZWR1bGVkIG5vdycuCkBAIC0xMzc5LDYgKzEzODQsNTEgQEAKIAl1cGRhdGVfbG9hZF9zdWIoJnJxLT5sb2FkLCBsb2FkKTsKIH0KIAorI2lmIChkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQpKSB8fCBkZWZpbmVkKENPTkZJR19SVF9HUk9VUF9TQ0hFRCkKK3R5cGVkZWYgaW50ICgqdGdfdmlzaXRvcikoc3RydWN0IHRhc2tfZ3JvdXAgKiwgdm9pZCAqKTsKKworLyoKKyAqIEl0ZXJhdGUgdGhlIGZ1bGwgdHJlZSwgY2FsbGluZyBAZG93biB3aGVuIGZpcnN0IGVudGVyaW5nIGEgbm9kZSBhbmQgQHVwIHdoZW4KKyAqIGxlYXZpbmcgaXQgZm9yIHRoZSBmaW5hbCB0aW1lLgorICovCitzdGF0aWMgaW50IHdhbGtfdGdfdHJlZSh0Z192aXNpdG9yIGRvd24sIHRnX3Zpc2l0b3IgdXAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCwgKmNoaWxkOworCWludCByZXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcGFyZW50ID0gJnJvb3RfdGFza19ncm91cDsKK2Rvd246CisJcmV0ID0gKCpkb3duKShwYXJlbnQsIGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9jazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaGlsZCwgJnBhcmVudC0+Y2hpbGRyZW4sIHNpYmxpbmdzKSB7CisJCXBhcmVudCA9IGNoaWxkOworCQlnb3RvIGRvd247CisKK3VwOgorCQljb250aW51ZTsKKwl9CisJcmV0ID0gKCp1cCkocGFyZW50LCBkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2s7CisKKwljaGlsZCA9IHBhcmVudDsKKwlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwlpZiAocGFyZW50KQorCQlnb3RvIHVwOworb3V0X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGdfbm9wKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc291cmNlX2xvYWQoaW50IGNwdSwgaW50IHR5cGUpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X2xvYWQoaW50IGNwdSwgaW50IHR5cGUpOwpAQCAtMTM5NiwzNyArMTQ0Niw2IEBACiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCi10eXBlZGVmIHZvaWQgKCp0Z192aXNpdG9yKShzdHJ1Y3QgdGFza19ncm91cCAqLCBpbnQsIHN0cnVjdCBzY2hlZF9kb21haW4gKik7Ci0KLS8qCi0gKiBJdGVyYXRlIHRoZSBmdWxsIHRyZWUsIGNhbGxpbmcgQGRvd24gd2hlbiBmaXJzdCBlbnRlcmluZyBhIG5vZGUgYW5kIEB1cCB3aGVuCi0gKiBsZWF2aW5nIGl0IGZvciB0aGUgZmluYWwgdGltZS4KLSAqLwotc3RhdGljIHZvaWQKLXdhbGtfdGdfdHJlZSh0Z192aXNpdG9yIGRvd24sIHRnX3Zpc2l0b3IgdXAsIGludCBjcHUsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQotewotCXN0cnVjdCB0YXNrX2dyb3VwICpwYXJlbnQsICpjaGlsZDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwYXJlbnQgPSAmcm9vdF90YXNrX2dyb3VwOwotZG93bjoKLQkoKmRvd24pKHBhcmVudCwgY3B1LCBzZCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hpbGQsICZwYXJlbnQtPmNoaWxkcmVuLCBzaWJsaW5ncykgewotCQlwYXJlbnQgPSBjaGlsZDsKLQkJZ290byBkb3duOwotCi11cDoKLQkJY29udGludWU7Ci0JfQotCSgqdXApKHBhcmVudCwgY3B1LCBzZCk7Ci0KLQljaGlsZCA9IHBhcmVudDsKLQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKLQlpZiAocGFyZW50KQotCQlnb3RvIHVwOwotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCiBzdGF0aWMgdm9pZCBfX3NldF9zZV9zaGFyZXMoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIHVuc2lnbmVkIGxvbmcgc2hhcmVzKTsKIAogLyoKQEAgLTE0ODUsMTEgKzE1MDQsMTEgQEAKICAqIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBhIGJvdHRvbS11cCBmYXNoaW9uIGJlY2F1c2UgdGhlIHJxIHdlaWdodCBvZiBhCiAgKiBwYXJlbnQgZ3JvdXAgZGVwZW5kcyBvbiB0aGUgc2hhcmVzIG9mIGl0cyBjaGlsZCBncm91cHMuCiAgKi8KLXN0YXRpYyB2b2lkCi10Z19zaGFyZXNfdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3N0YXRpYyBpbnQgdGdfc2hhcmVzX3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIHJxX3dlaWdodCA9IDA7CiAJdW5zaWduZWQgbG9uZyBzaGFyZXMgPSAwOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gZGF0YTsKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2NwdV9tYXNrKGksIHNkLT5zcGFuKSB7CkBAIC0xNTE0LDYgKzE1MzMsOCBAQAogCQlfX3VwZGF0ZV9ncm91cF9zaGFyZXNfY3B1KHRnLCBpLCBzaGFyZXMsIHJxX3dlaWdodCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNTIxLDEwICsxNTQyLDEwIEBACiAgKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gYSB0b3AtZG93biBmYXNoaW9uIGJlY2F1c2UgdGhlIGxvYWQgb2YgYSBjaGlsZAogICogZ3JvdXAgaXMgYSBmcmFjdGlvbiBvZiBpdHMgcGFyZW50cyBsb2FkLgogICovCi1zdGF0aWMgdm9pZAotdGdfbG9hZF9kb3duKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgaW50IGNwdSwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCitzdGF0aWMgaW50IHRnX2xvYWRfZG93bihzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBsb2FkOworCWxvbmcgY3B1ID0gKGxvbmcpZGF0YTsKIAogCWlmICghdGctPnBhcmVudCkgewogCQlsb2FkID0gY3B1X3JxKGNwdSktPmxvYWQud2VpZ2h0OwpAQCAtMTUzNSwxMSArMTU1Niw4IEBACiAJfQogCiAJdGctPmNmc19ycVtjcHVdLT5oX2xvYWQgPSBsb2FkOwotfQogCi1zdGF0aWMgdm9pZAotdGdfbm9wKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgaW50IGNwdSwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCi17CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9zaGFyZXMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCkBAIC0xNTQ5LDcgKzE1NjcsNyBAQAogCiAJaWYgKGVsYXBzZWQgPj0gKHM2NCkodTY0KXN5c2N0bF9zY2hlZF9zaGFyZXNfcmF0ZWxpbWl0KSB7CiAJCXNkLT5sYXN0X3VwZGF0ZSA9IG5vdzsKLQkJd2Fsa190Z190cmVlKHRnX25vcCwgdGdfc2hhcmVzX3VwLCAwLCBzZCk7CisJCXdhbGtfdGdfdHJlZSh0Z19ub3AsIHRnX3NoYXJlc191cCwgc2QpOwogCX0KIH0KIApAQCAtMTU2MCw5ICsxNTc4LDkgQEAKIAlzcGluX2xvY2soJnJxLT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX2hfbG9hZChpbnQgY3B1KQorc3RhdGljIHZvaWQgdXBkYXRlX2hfbG9hZChsb25nIGNwdSkKIHsKLQl3YWxrX3RnX3RyZWUodGdfbG9hZF9kb3duLCB0Z19ub3AsIGNwdSwgTlVMTCk7CisJd2Fsa190Z190cmVlKHRnX2xvYWRfZG93biwgdGdfbm9wLCAodm9pZCAqKWNwdSk7CiB9CiAKICNlbHNlCkBAIC0xOTIwLDExICsxOTM4LDggQEAKIAkJcnVubmluZyA9IHRhc2tfcnVubmluZyhycSwgcCk7CiAJCW9uX3JxID0gcC0+c2Uub25fcnE7CiAJCW5jc3cgPSAwOwotCQlpZiAoIW1hdGNoX3N0YXRlIHx8IHAtPnN0YXRlID09IG1hdGNoX3N0YXRlKSB7Ci0JCQluY3N3ID0gcC0+bml2Y3N3ICsgcC0+bnZjc3c7Ci0JCQlpZiAodW5saWtlbHkoIW5jc3cpKQotCQkJCW5jc3cgPSAxOwotCQl9CisJCWlmICghbWF0Y2hfc3RhdGUgfHwgcC0+c3RhdGUgPT0gbWF0Y2hfc3RhdGUpCisJCQluY3N3ID0gcC0+bnZjc3cgfCBMT05HX01JTjsgLyogc2V0cyBNU0IgKi8KIAkJdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CiAKIAkJLyoKQEAgLTIyODQsNyArMjI5OSw3IEBACiAJdHJhY2VfbWFyayhrZXJuZWxfc2NoZWRfd2FrZXVwLAogCQkicGlkICVkIHN0YXRlICVsZCAjIyBycSAlcCB0YXNrICVwIHJxLT5jdXJyICVwIiwKIAkJcC0+cGlkLCBwLT5zdGF0ZSwgcnEsIHAsIHJxLT5jdXJyKTsKLQljaGVja19wcmVlbXB0X2N1cnIocnEsIHApOworCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgc3luYyk7CiAKIAlwLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yNDE5LDcgKzI0MzQsNyBAQAogCXRyYWNlX21hcmsoa2VybmVsX3NjaGVkX3dha2V1cF9uZXcsCiAJCSJwaWQgJWQgc3RhdGUgJWxkICMjIHJxICVwIHRhc2sgJXAgcnEtPmN1cnIgJXAiLAogCQlwLT5waWQsIHAtPnN0YXRlLCBycSwgcCwgcnEtPmN1cnIpOwotCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCk7CisJY2hlY2tfcHJlZW1wdF9jdXJyKHJxLCBwLCAwKTsKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX3dha2VfdXApCiAJCXAtPnNjaGVkX2NsYXNzLT50YXNrX3dha2VfdXAocnEsIHApOwpAQCAtMjg3OSw3ICsyODk0LDcgQEAKIAkgKiBOb3RlIHRoYXQgaWRsZSB0aHJlYWRzIGhhdmUgYSBwcmlvIG9mIE1BWF9QUklPLCBmb3IgdGhpcyB0ZXN0CiAJICogdG8gYmUgYWx3YXlzIHRydWUgZm9yIHRoZW0uCiAJICovCi0JY2hlY2tfcHJlZW1wdF9jdXJyKHRoaXNfcnEsIHApOworCWNoZWNrX3ByZWVtcHRfY3Vycih0aGlzX3JxLCBwLCAwKTsKIH0KIAogLyoKQEAgLTQ2MjYsNiArNDY0MSwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX193YWtlX3VwX3N5bmMpOwkvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KIAorLyoqCisgKiBjb21wbGV0ZTogLSBzaWduYWxzIGEgc2luZ2xlIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29tcGxldGlvbgorICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIHdpbGwgd2FrZSB1cCBhIHNpbmdsZSB0aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbXBsZXRpb24uIFRocmVhZHMgd2lsbCBiZQorICogYXdha2VuZWQgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHF1ZXVlZC4KKyAqCisgKiBTZWUgYWxzbyBjb21wbGV0ZV9hbGwoKSwgd2FpdF9mb3JfY29tcGxldGlvbigpIGFuZCByZWxhdGVkIHJvdXRpbmVzLgorICovCiB2b2lkIGNvbXBsZXRlKHN0cnVjdCBjb21wbGV0aW9uICp4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00NjM3LDYgKzQ2NjEsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0woY29tcGxldGUpOwogCisvKioKKyAqIGNvbXBsZXRlX2FsbDogLSBzaWduYWxzIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb21wbGV0aW9uCisgKiBAeDogIGhvbGRzIHRoZSBzdGF0ZSBvZiB0aGlzIHBhcnRpY3VsYXIgY29tcGxldGlvbgorICoKKyAqIFRoaXMgd2lsbCB3YWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24gZXZlbnQuCisgKi8KIHZvaWQgY29tcGxldGVfYWxsKHN0cnVjdCBjb21wbGV0aW9uICp4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00NjU3LDEwICs0Njg3LDcgQEAKIAkJd2FpdC5mbGFncyB8PSBXUV9GTEFHX0VYQ0xVU0lWRTsKIAkJX19hZGRfd2FpdF9xdWV1ZV90YWlsKCZ4LT53YWl0LCAmd2FpdCk7CiAJCWRvIHsKLQkJCWlmICgoc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFICYmCi0JCQkgICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB8fAotCQkJICAgIChzdGF0ZSA9PSBUQVNLX0tJTExBQkxFICYmCi0JCQkgICAgIGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkgeworCQkJaWYgKHNpZ25hbF9wZW5kaW5nX3N0YXRlKHN0YXRlLCBjdXJyZW50KSkgewogCQkJCXRpbWVvdXQgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC00Njg4LDEyICs0NzE1LDMxIEBACiAJcmV0dXJuIHRpbWVvdXQ7CiB9CiAKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlvbjogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sKKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgorICogVGhpcyB3YWl0cyB0byBiZSBzaWduYWxlZCBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2suIEl0IGlzIE5PVAorICogaW50ZXJydXB0aWJsZSBhbmQgdGhlcmUgaXMgbm8gdGltZW91dC4KKyAqCisgKiBTZWUgYWxzbyBzaW1pbGFyIHJvdXRpbmVzIChpLmUuIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgpKSB3aXRoIHRpbWVvdXQKKyAqIGFuZCBpbnRlcnJ1cHQgY2FwYWJpbGl0eS4gQWxzbyBzZWUgY29tcGxldGUoKS4KKyAqLwogdm9pZCBfX3NjaGVkIHdhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IGNvbXBsZXRpb24gKngpCiB7CiAJd2FpdF9mb3JfY29tbW9uKHgsIE1BWF9TQ0hFRFVMRV9USU1FT1VULCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiB9CiBFWFBPUlRfU1lNQk9MKHdhaXRfZm9yX2NvbXBsZXRpb24pOwogCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dDogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sgKHcvdGltZW91dCkKKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKiBAdGltZW91dDogIHRpbWVvdXQgdmFsdWUgaW4gamlmZmllcworICoKKyAqIFRoaXMgd2FpdHMgZm9yIGVpdGhlciBhIGNvbXBsZXRpb24gb2YgYSBzcGVjaWZpYyB0YXNrIHRvIGJlIHNpZ25hbGVkIG9yIGZvciBhCisgKiBzcGVjaWZpZWQgdGltZW91dCB0byBleHBpcmUuIFRoZSB0aW1lb3V0IGlzIGluIGppZmZpZXMuIEl0IGlzIG5vdAorICogaW50ZXJydXB0aWJsZS4KKyAqLwogdW5zaWduZWQgbG9uZyBfX3NjaGVkCiB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoc3RydWN0IGNvbXBsZXRpb24gKngsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKQEAgLTQ3MDEsNiArNDc0NywxMyBAQAogfQogRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQpOwogCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZTogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sgKHcvaW50cikKKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgorICogVGhpcyB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQuIEl0IGlzCisgKiBpbnRlcnJ1cHRpYmxlLgorICovCiBpbnQgX19zY2hlZCB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoc3RydWN0IGNvbXBsZXRpb24gKngpCiB7CiAJbG9uZyB0ID0gd2FpdF9mb3JfY29tbW9uKHgsIE1BWF9TQ0hFRFVMRV9USU1FT1VULCBUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtNDcxMCw2ICs0NzYzLDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSk7CiAKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQ6IC0gd2FpdHMgZm9yIGNvbXBsZXRpb24gKHcvKHRvLGludHIpKQorICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqIEB0aW1lb3V0OiAgdGltZW91dCB2YWx1ZSBpbiBqaWZmaWVzCisgKgorICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQgb3IgZm9yIGEKKyAqIHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gSXQgaXMgaW50ZXJydXB0aWJsZS4gVGhlIHRpbWVvdXQgaXMgaW4gamlmZmllcy4KKyAqLwogdW5zaWduZWQgbG9uZyBfX3NjaGVkCiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAqeCwKIAkJCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC00NzE4LDYgKzQ3NzksMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0wod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQpOwogCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGU6IC0gd2FpdHMgZm9yIGNvbXBsZXRpb24gb2YgYSB0YXNrIChraWxsYWJsZSkKKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgorICogVGhpcyB3YWl0cyB0byBiZSBzaWduYWxlZCBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2suIEl0IGNhbiBiZQorICogaW50ZXJydXB0ZWQgYnkgYSBraWxsIHNpZ25hbC4KKyAqLwogaW50IF9fc2NoZWQgd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKIHsKIAlsb25nIHQgPSB3YWl0X2Zvcl9jb21tb24oeCwgTUFYX1NDSEVEVUxFX1RJTUVPVVQsIFRBU0tfS0lMTEFCTEUpOwpAQCAtNTEyMCw3ICs1MTg4LDggQEAKIAkJICogRG8gbm90IGFsbG93IHJlYWx0aW1lIHRhc2tzIGludG8gZ3JvdXBzIHRoYXQgaGF2ZSBubyBydW50aW1lCiAJCSAqIGFzc2lnbmVkLgogCQkgKi8KLQkJaWYgKHJ0X3BvbGljeShwb2xpY3kpICYmIHRhc2tfZ3JvdXAocCktPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lID09IDApCisJCWlmIChydF9iYW5kd2lkdGhfZW5hYmxlZCgpICYmIHJ0X3BvbGljeShwb2xpY3kpICYmCisJCQkJdGFza19ncm91cChwKS0+cnRfYmFuZHdpZHRoLnJ0X3J1bnRpbWUgPT0gMCkKIAkJCXJldHVybiAtRVBFUk07CiAjZW5kaWYKIApAQCAtNTk1Niw3ICs2MDI1LDcgQEAKIAlzZXRfdGFza19jcHUocCwgZGVzdF9jcHUpOwogCWlmIChvbl9ycSkgewogCQlhY3RpdmF0ZV90YXNrKHJxX2Rlc3QsIHAsIDApOwotCQljaGVja19wcmVlbXB0X2N1cnIocnFfZGVzdCwgcCk7CisJCWNoZWNrX3ByZWVtcHRfY3VycihycV9kZXN0LCBwLCAwKTsKIAl9CiBkb25lOgogCXJldCA9IDE7CkBAIC02MjgxLDcgKzYzNTAsNyBAQAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgogc2RfYWxsb2NfY3RsX2RvbWFpbl90YWJsZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeSgxMik7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBzZF9hbGxvY19jdGxfZW50cnkoMTMpOwogCiAJaWYgKHRhYmxlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtNjMwOSw3ICs2Mzc4LDkgQEAKIAkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKIAlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzEwXSwgImZsYWdzIiwgJnNkLT5mbGFncywKIAkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKLQkvKiAmdGFibGVbMTFdIGlzIHRlcm1pbmF0b3IgKi8KKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm5hbWUiLCBzZC0+bmFtZSwKKwkJQ09SRU5BTUVfTUFYX1NJWkUsIDA0NDQsIHByb2NfZG9zdHJpbmcpOworCS8qICZ0YWJsZVsxMl0gaXMgdGVybWluYXRvciAqLwogCiAJcmV0dXJuIHRhYmxlOwogfQpAQCAtNzE5MywxMyArNzI2NCwyMSBAQAogICogTm9uLWlubGluZWQgdG8gcmVkdWNlIGFjY3VtdWxhdGVkIHN0YWNrIHByZXNzdXJlIGluIGJ1aWxkX3NjaGVkX2RvbWFpbnMoKQogICovCiAKKyNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKKyMgZGVmaW5lIFNEX0lOSVRfTkFNRShzZCwgdHlwZSkJCXNkLT5uYW1lID0gI3R5cGUKKyNlbHNlCisjIGRlZmluZSBTRF9JTklUX05BTUUoc2QsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogI2RlZmluZQlTRF9JTklUKHNkLCB0eXBlKQlzZF9pbml0XyMjdHlwZShzZCkKKwogI2RlZmluZSBTRF9JTklUX0ZVTkModHlwZSkJXAogc3RhdGljIG5vaW5saW5lIHZvaWQgc2RfaW5pdF8jI3R5cGUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCVwKIHsJCQkJCQkJCVwKIAltZW1zZXQoc2QsIDAsIHNpemVvZigqc2QpKTsJCQkJXAogCSpzZCA9IFNEXyMjdHlwZSMjX0lOSVQ7CQkJCQlcCiAJc2QtPmxldmVsID0gU0RfTFZfIyN0eXBlOwkJCQlcCisJU0RfSU5JVF9OQU1FKHNkLCB0eXBlKTsJCQkJCVwKIH0KIAogU0RfSU5JVF9GVU5DKENQVSkKQEAgLTc2OTUsMjQgKzc3NzQsMjcgQEAKICAqIGFuZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygpIHdpbGwgZmFsbGJhY2sgdG8gdGhlIHNpbmdsZSBwYXJ0aXRpb24KICAqICdmYWxsYmFja19kb21zJywgaXQgYWxzbyBmb3JjZXMgdGhlIGRvbWFpbnMgdG8gYmUgcmVidWlsdC4KICAqCisgKiBJZiBkb21zX25ldz09TlVMTCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggY3B1X29ubGluZV9tYXAuCisgKiBuZG9tc19uZXc9PTAgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIGRlc3Ryb3lpbmcgZXhpc3RpbmcgZG9tYWlucy4KKyAqIEl0IHdpbGwgbm90IGNyZWF0ZSB0aGUgZGVmYXVsdCBkb21haW4uCisgKgogICogQ2FsbCB3aXRoIGhvdHBsdWcgbG9jayBoZWxkCiAgKi8KIHZvaWQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoaW50IG5kb21zX25ldywgY3B1bWFza190ICpkb21zX25ldywKIAkJCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICpkYXR0cl9uZXcpCiB7Ci0JaW50IGksIGo7CisJaW50IGksIGosIG47CiAKIAltdXRleF9sb2NrKCZzY2hlZF9kb21haW5zX211dGV4KTsKIAogCS8qIGFsd2F5cyB1bnJlZ2lzdGVyIGluIGNhc2Ugd2UgZG9uJ3QgZGVzdHJveSBhbnkgZG9tYWlucyAqLwogCXVucmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCgpOwogCi0JaWYgKGRvbXNfbmV3ID09IE5VTEwpCi0JCW5kb21zX25ldyA9IDA7CisJbiA9IGRvbXNfbmV3ID8gbmRvbXNfbmV3IDogMDsKIAogCS8qIERlc3Ryb3kgZGVsZXRlZCBkb21haW5zICovCiAJZm9yIChpID0gMDsgaSA8IG5kb21zX2N1cjsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBuZG9tc19uZXc7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAJCQlpZiAoY3B1c19lcXVhbChkb21zX2N1cltpXSwgZG9tc19uZXdbal0pCiAJCQkgICAgJiYgZGF0dHJzX2VxdWFsKGRhdHRyX2N1ciwgaSwgZGF0dHJfbmV3LCBqKSkKIAkJCQlnb3RvIG1hdGNoMTsKQEAgLTc3MjUsNyArNzgwNyw2IEBACiAKIAlpZiAoZG9tc19uZXcgPT0gTlVMTCkgewogCQluZG9tc19jdXIgPSAwOwotCQluZG9tc19uZXcgPSAxOwogCQlkb21zX25ldyA9ICZmYWxsYmFja19kb21zOwogCQljcHVzX2FuZG5vdChkb21zX25ld1swXSwgY3B1X29ubGluZV9tYXAsIGNwdV9pc29sYXRlZF9tYXApOwogCQlkYXR0cl9uZXcgPSBOVUxMOwpAQCAtNzc2Miw4ICs3ODQzLDEzIEBACiBpbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQogewogCWdldF9vbmxpbmVfY3B1cygpOworCisJLyogRGVzdHJveSBkb21haW5zIGZpcnN0IHRvIGZvcmNlIHRoZSByZWJ1aWxkICovCisJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoMCwgTlVMTCwgTlVMTCk7CisKIAlyZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKKwogCXJldHVybiAwOwogfQogCkBAIC03ODQ3LDcgKzc5MzMsNyBAQAogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoMCwgTlVMTCwgTlVMTCk7CisJCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKDEsIE5VTEwsIE5VTEwpOwogCQlyZXR1cm4gTk9USUZZX09LOwogCiAJZGVmYXVsdDoKQEAgLTgyMzQsMjAgKzgzMjAsMjUgQEAKICNpZmRlZiBpbl9hdG9taWMKIAlzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2ppZmZ5OwkvKiByYXRlbGltaXRpbmcgKi8KIAotCWlmICgoaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpKSAmJgotCSAgICBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcgJiYgIW9vcHNfaW5fcHJvZ3Jlc3MpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHByZXZfamlmZnkgKyBIWikgJiYgcHJldl9qaWZmeSkKLQkJCXJldHVybjsKLQkJcHJldl9qaWZmeSA9IGppZmZpZXM7Ci0JCXByaW50ayhLRVJOX0VSUiAiQlVHOiBzbGVlcGluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlkIgotCQkJCSIgY29udGV4dCBhdCAlczolZFxuIiwgZmlsZSwgbGluZSk7Ci0JCXByaW50aygiaW5fYXRvbWljKCk6JWQsIGlycXNfZGlzYWJsZWQoKTolZFxuIiwKLQkJCWluX2F0b21pYygpLCBpcnFzX2Rpc2FibGVkKCkpOwotCQlkZWJ1Z19zaG93X2hlbGRfbG9ja3MoY3VycmVudCk7Ci0JCWlmIChpcnFzX2Rpc2FibGVkKCkpCi0JCQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7Ci0JCWR1bXBfc3RhY2soKTsKLQl9CisJaWYgKCghaW5fYXRvbWljKCkgJiYgIWlycXNfZGlzYWJsZWQoKSkgfHwKKwkJICAgIHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORyB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlyZXR1cm47CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHByZXZfamlmZnkgKyBIWikgJiYgcHJldl9qaWZmeSkKKwkJcmV0dXJuOworCXByZXZfamlmZnkgPSBqaWZmaWVzOworCisJcHJpbnRrKEtFUk5fRVJSCisJCSJCVUc6IHNsZWVwaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGludmFsaWQgY29udGV4dCBhdCAlczolZFxuIiwKKwkJCWZpbGUsIGxpbmUpOworCXByaW50ayhLRVJOX0VSUgorCQkiaW5fYXRvbWljKCk6ICVkLCBpcnFzX2Rpc2FibGVkKCk6ICVkLCBwaWQ6ICVkLCBuYW1lOiAlc1xuIiwKKwkJCWluX2F0b21pYygpLCBpcnFzX2Rpc2FibGVkKCksCisJCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0pOworCisJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOworCWlmIChpcnFzX2Rpc2FibGVkKCkpCisJCXByaW50X2lycXRyYWNlX2V2ZW50cyhjdXJyZW50KTsKKwlkdW1wX3N0YWNrKCk7CiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woX19taWdodF9zbGVlcCk7CkBAIC04NzQ1LDc1ICs4ODM2LDk3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b19yYXRpbyh1NjQgcGVyaW9kLCB1NjQgcnVudGltZSkKIHsKIAlpZiAocnVudGltZSA9PSBSVU5USU1FX0lORikKLQkJcmV0dXJuIDFVTEwgPDwgMTY7CisJCXJldHVybiAxVUxMIDw8IDIwOwogCi0JcmV0dXJuIGRpdjY0X3U2NChydW50aW1lIDw8IDE2LCBwZXJpb2QpOworCXJldHVybiBkaXY2NF91NjQocnVudGltZSA8PCAyMCwgcGVyaW9kKTsKIH0KIAotI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRUQKLXN0YXRpYyBpbnQgX19ydF9zY2hlZHVsYWJsZShzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHU2NCBwZXJpb2QsIHU2NCBydW50aW1lKQotewotCXN0cnVjdCB0YXNrX2dyb3VwICp0Z2ksICpwYXJlbnQgPSB0Zy0+cGFyZW50OwotCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAwOwotCi0JaWYgKCFwYXJlbnQpIHsKLQkJaWYgKGdsb2JhbF9ydF9wZXJpb2QoKSA8IHBlcmlvZCkKLQkJCXJldHVybiAwOwotCi0JCXJldHVybiB0b19yYXRpbyhwZXJpb2QsIHJ1bnRpbWUpIDwKLQkJCXRvX3JhdGlvKGdsb2JhbF9ydF9wZXJpb2QoKSwgZ2xvYmFsX3J0X3J1bnRpbWUoKSk7Ci0JfQotCi0JaWYgKGt0aW1lX3RvX25zKHBhcmVudC0+cnRfYmFuZHdpZHRoLnJ0X3BlcmlvZCkgPCBwZXJpb2QpCi0JCXJldHVybiAwOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRnaSwgJnBhcmVudC0+Y2hpbGRyZW4sIHNpYmxpbmdzKSB7Ci0JCWlmICh0Z2kgPT0gdGcpCi0JCQljb250aW51ZTsKLQotCQl0b3RhbCArPSB0b19yYXRpbyhrdGltZV90b19ucyh0Z2ktPnJ0X2JhbmR3aWR0aC5ydF9wZXJpb2QpLAotCQkJCXRnaS0+cnRfYmFuZHdpZHRoLnJ0X3J1bnRpbWUpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiB0b3RhbCArIHRvX3JhdGlvKHBlcmlvZCwgcnVudGltZSkgPD0KLQkJdG9fcmF0aW8oa3RpbWVfdG9fbnMocGFyZW50LT5ydF9iYW5kd2lkdGgucnRfcGVyaW9kKSwKLQkJCQlwYXJlbnQtPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lKTsKLX0KLSNlbGlmIGRlZmluZWQgQ09ORklHX1VTRVJfU0NIRUQKLXN0YXRpYyBpbnQgX19ydF9zY2hlZHVsYWJsZShzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHU2NCBwZXJpb2QsIHU2NCBydW50aW1lKQotewotCXN0cnVjdCB0YXNrX2dyb3VwICp0Z2k7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBnbG9iYWxfcmF0aW8gPQotCQl0b19yYXRpbyhnbG9iYWxfcnRfcGVyaW9kKCksIGdsb2JhbF9ydF9ydW50aW1lKCkpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRnaSwgJnRhc2tfZ3JvdXBzLCBsaXN0KSB7Ci0JCWlmICh0Z2kgPT0gdGcpCi0JCQljb250aW51ZTsKLQotCQl0b3RhbCArPSB0b19yYXRpbyhrdGltZV90b19ucyh0Z2ktPnJ0X2JhbmR3aWR0aC5ydF9wZXJpb2QpLAotCQkJCXRnaS0+cnRfYmFuZHdpZHRoLnJ0X3J1bnRpbWUpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiB0b3RhbCArIHRvX3JhdGlvKHBlcmlvZCwgcnVudGltZSkgPCBnbG9iYWxfcmF0aW87Ci19Ci0jZW5kaWYKLQogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0YXNrbGlzdF9sb2NrIGhlbGQgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRnX2hhc19ydF90YXNrcyhzdHJ1Y3QgdGFza19ncm91cCAqdGcpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKwogCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKIAkJaWYgKHJ0X3Rhc2socCkgJiYgcnRfcnFfb2Zfc2UoJnAtPnJ0KS0+dGcgPT0gdGcpCiAJCQlyZXR1cm4gMTsKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBydF9zY2hlZHVsYWJsZV9kYXRhIHsKKwlzdHJ1Y3QgdGFza19ncm91cCAqdGc7CisJdTY0IHJ0X3BlcmlvZDsKKwl1NjQgcnRfcnVudGltZTsKK307CisKK3N0YXRpYyBpbnQgdGdfc2NoZWR1bGFibGUoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydF9zY2hlZHVsYWJsZV9kYXRhICpkID0gZGF0YTsKKwlzdHJ1Y3QgdGFza19ncm91cCAqY2hpbGQ7CisJdW5zaWduZWQgbG9uZyB0b3RhbCwgc3VtID0gMDsKKwl1NjQgcGVyaW9kLCBydW50aW1lOworCisJcGVyaW9kID0ga3RpbWVfdG9fbnModGctPnJ0X2JhbmR3aWR0aC5ydF9wZXJpb2QpOworCXJ1bnRpbWUgPSB0Zy0+cnRfYmFuZHdpZHRoLnJ0X3J1bnRpbWU7CisKKwlpZiAodGcgPT0gZC0+dGcpIHsKKwkJcGVyaW9kID0gZC0+cnRfcGVyaW9kOworCQlydW50aW1lID0gZC0+cnRfcnVudGltZTsKKwl9CisKKwkvKgorCSAqIENhbm5vdCBoYXZlIG1vcmUgcnVudGltZSB0aGFuIHRoZSBwZXJpb2QuCisJICovCisJaWYgKHJ1bnRpbWUgPiBwZXJpb2QgJiYgcnVudGltZSAhPSBSVU5USU1FX0lORikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIEVuc3VyZSB3ZSBkb24ndCBzdGFydmUgZXhpc3RpbmcgUlQgdGFza3MuCisJICovCisJaWYgKHJ0X2JhbmR3aWR0aF9lbmFibGVkKCkgJiYgIXJ1bnRpbWUgJiYgdGdfaGFzX3J0X3Rhc2tzKHRnKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRvdGFsID0gdG9fcmF0aW8ocGVyaW9kLCBydW50aW1lKTsKKworCS8qCisJICogTm9ib2R5IGNhbiBoYXZlIG1vcmUgdGhhbiB0aGUgZ2xvYmFsIHNldHRpbmcgYWxsb3dzLgorCSAqLworCWlmICh0b3RhbCA+IHRvX3JhdGlvKGdsb2JhbF9ydF9wZXJpb2QoKSwgZ2xvYmFsX3J0X3J1bnRpbWUoKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgc3VtIG9mIG91ciBjaGlsZHJlbidzIHJ1bnRpbWUgc2hvdWxkIG5vdCBleGNlZWQgb3VyIG93bi4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaGlsZCwgJnRnLT5jaGlsZHJlbiwgc2libGluZ3MpIHsKKwkJcGVyaW9kID0ga3RpbWVfdG9fbnMoY2hpbGQtPnJ0X2JhbmR3aWR0aC5ydF9wZXJpb2QpOworCQlydW50aW1lID0gY2hpbGQtPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lOworCisJCWlmIChjaGlsZCA9PSBkLT50ZykgeworCQkJcGVyaW9kID0gZC0+cnRfcGVyaW9kOworCQkJcnVudGltZSA9IGQtPnJ0X3J1bnRpbWU7CisJCX0KKworCQlzdW0gKz0gdG9fcmF0aW8ocGVyaW9kLCBydW50aW1lKTsKKwl9CisKKwlpZiAoc3VtID4gdG90YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19ydF9zY2hlZHVsYWJsZShzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHU2NCBwZXJpb2QsIHU2NCBydW50aW1lKQoreworCXN0cnVjdCBydF9zY2hlZHVsYWJsZV9kYXRhIGRhdGEgPSB7CisJCS50ZyA9IHRnLAorCQkucnRfcGVyaW9kID0gcGVyaW9kLAorCQkucnRfcnVudGltZSA9IHJ1bnRpbWUsCisJfTsKKworCXJldHVybiB3YWxrX3RnX3RyZWUodGdfc2NoZWR1bGFibGUsIHRnX25vcCwgJmRhdGEpOworfQorCiBzdGF0aWMgaW50IHRnX3NldF9iYW5kd2lkdGgoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLAogCQl1NjQgcnRfcGVyaW9kLCB1NjQgcnRfcnVudGltZSkKIHsKQEAgLTg4MjEsMTQgKzg5MzQsOSBAQAogCiAJbXV0ZXhfbG9jaygmcnRfY29uc3RyYWludHNfbXV0ZXgpOwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JaWYgKHJ0X3J1bnRpbWUgPT0gMCAmJiB0Z19oYXNfcnRfdGFza3ModGcpKSB7Ci0JCWVyciA9IC1FQlVTWTsKKwllcnIgPSBfX3J0X3NjaGVkdWxhYmxlKHRnLCBydF9wZXJpb2QsIHJ0X3J1bnRpbWUpOworCWlmIChlcnIpCiAJCWdvdG8gdW5sb2NrOwotCX0KLQlpZiAoIV9fcnRfc2NoZWR1bGFibGUodGcsIHJ0X3BlcmlvZCwgcnRfcnVudGltZSkpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQogCiAJc3Bpbl9sb2NrX2lycSgmdGctPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lX2xvY2spOwogCXRnLT5ydF9iYW5kd2lkdGgucnRfcGVyaW9kID0gbnNfdG9fa3RpbWUocnRfcGVyaW9kKTsKQEAgLTg4OTcsMTYgKzkwMDUsMjUgQEAKIAogc3RhdGljIGludCBzY2hlZF9ydF9nbG9iYWxfY29uc3RyYWludHModm9pZCkKIHsKLQlzdHJ1Y3QgdGFza19ncm91cCAqdGcgPSAmcm9vdF90YXNrX2dyb3VwOwotCXU2NCBydF9ydW50aW1lLCBydF9wZXJpb2Q7CisJdTY0IHJ1bnRpbWUsIHBlcmlvZDsKIAlpbnQgcmV0ID0gMDsKIAotCXJ0X3BlcmlvZCA9IGt0aW1lX3RvX25zKHRnLT5ydF9iYW5kd2lkdGgucnRfcGVyaW9kKTsKLQlydF9ydW50aW1lID0gdGctPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lOworCWlmIChzeXNjdGxfc2NoZWRfcnRfcGVyaW9kIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcnVudGltZSA9IGdsb2JhbF9ydF9ydW50aW1lKCk7CisJcGVyaW9kID0gZ2xvYmFsX3J0X3BlcmlvZCgpOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgb24gdGhlIHN5c2N0bCB2YXJpYWJsZXMuCisJICovCisJaWYgKHJ1bnRpbWUgPiBwZXJpb2QgJiYgcnVudGltZSAhPSBSVU5USU1FX0lORikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZydF9jb25zdHJhaW50c19tdXRleCk7Ci0JaWYgKCFfX3J0X3NjaGVkdWxhYmxlKHRnLCBydF9wZXJpb2QsIHJ0X3J1bnRpbWUpKQotCQlyZXQgPSAtRUlOVkFMOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0ID0gX19ydF9zY2hlZHVsYWJsZShOVUxMLCAwLCAwKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZydF9jb25zdHJhaW50c19tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtODkxNyw2ICs5MDM0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCisJaWYgKHN5c2N0bF9zY2hlZF9ydF9wZXJpb2QgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVmX3J0X2JhbmR3aWR0aC5ydF9ydW50aW1lX2xvY2ssIGZsYWdzKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxID0gJmNwdV9ycShpKS0+cnQ7CkBAIC04OTc3LDcgKzkwOTcsNiBAQAogCiAJaWYgKCFjZ3JwLT5wYXJlbnQpIHsKIAkJLyogVGhpcyBpcyBlYXJseSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHRvcCBjZ3JvdXAgKi8KLQkJaW5pdF90YXNrX2dyb3VwLmNzcy5jZ3JvdXAgPSBjZ3JwOwogCQlyZXR1cm4gJmluaXRfdGFza19ncm91cC5jc3M7CiAJfQogCkBAIC04OTg2LDkgKzkxMDUsNiBAQAogCWlmIChJU19FUlIodGcpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCS8qIEJpbmQgdGhlIGNncm91cCB0byB0YXNrX2dyb3VwIG9iamVjdCB3ZSBqdXN0IGNyZWF0ZWQgKi8KLQl0Zy0+Y3NzLmNncm91cCA9IGNncnA7Ci0KIAlyZXR1cm4gJnRnLT5jc3M7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9jbG9jay5jIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKaW5kZXggZThhYjA5Ni4uODE3ODcyNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2Nsb2NrLmMKKysrIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKQEAgLTExOCwxMyArMTE4LDEzIEBACiAKIAkvKgogCSAqIHNjZC0+Y2xvY2sgPSBjbGFtcChzY2QtPnRpY2tfZ3RvZCArIGRlbHRhLAotCSAqIAkJICAgICAgbWF4KHNjZC0+dGlja19ndG9kLCBzY2QtPmNsb2NrKSwKLQkgKiAJCSAgICAgIHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDKTsKKwkgKgkJICAgICAgbWF4KHNjZC0+dGlja19ndG9kLCBzY2QtPmNsb2NrKSwKKwkgKgkJICAgICAgbWF4KHNjZC0+Y2xvY2ssIHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDKSk7CiAJICovCiAKIAljbG9jayA9IHNjZC0+dGlja19ndG9kICsgZGVsdGE7CiAJbWluX2Nsb2NrID0gd3JhcF9tYXgoc2NkLT50aWNrX2d0b2QsIHNjZC0+Y2xvY2spOwotCW1heF9jbG9jayA9IHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDOworCW1heF9jbG9jayA9IHdyYXBfbWF4KHNjZC0+Y2xvY2ssIHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDKTsKIAogCWNsb2NrID0gd3JhcF9tYXgoY2xvY2ssIG1pbl9jbG9jayk7CiAJY2xvY2sgPSB3cmFwX21pbihjbG9jaywgbWF4X2Nsb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKaW5kZXggYmJlNmIzMS4uYWQ5NThjMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKQEAgLTMzMywxMiArMzMzLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbnVtX3RocmVhZHMgPSAxOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWlmIChsb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpKSB7CiAJCW51bV90aHJlYWRzID0gYXRvbWljX3JlYWQoJnAtPnNpZ25hbC0+Y291bnQpOwogCQl1bmxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncyk7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogCiAJU0VRX3ByaW50ZihtLCAiJXMgKCVkLCAjdGhyZWFkczogJWQpXG4iLCBwLT5jb21tLCBwLT5waWQsIG51bV90aHJlYWRzKTsKIAlTRVFfcHJpbnRmKG0sCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCBmYjg5OTRjLi4xOGZkMTcxIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTQwOSw2NCArNDA5LDYgQEAKIH0KIAogLyoKLSAqIFRoZSBnb2FsIG9mIGNhbGNfZGVsdGFfYXN5bSgpIGlzIHRvIGJlIGFzeW1tZXRyaWNhbGx5IGFyb3VuZCBOSUNFXzBfTE9BRCwgaW4KLSAqIHRoYXQgaXQgZmF2b3VycyA+PTAgb3ZlciA8MC4KLSAqCi0gKiAgIC0yMCAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgfAotICogICAgIDAgLS0tLS0tLS0rLS0tLS0tLQotICogICAgICAgICAgICAgLicKLSAqICAgIDE5ICAgICAuJwotICoKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNhbGNfZGVsdGFfYXN5bSh1bnNpZ25lZCBsb25nIGRlbHRhLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLQlzdHJ1Y3QgbG9hZF93ZWlnaHQgbHcgPSB7Ci0JCS53ZWlnaHQgPSBOSUNFXzBfTE9BRCwKLQkJLmludl93ZWlnaHQgPSAxVUwgPDwgKFdNVUxUX1NISUZULU5JQ0VfMF9TSElGVCkKLQl9OwotCi0JZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCXN0cnVjdCBsb2FkX3dlaWdodCAqc2VfbHcgPSAmc2UtPmxvYWQ7Ci0JCXVuc2lnbmVkIGxvbmcgcncgPSBjZnNfcnFfb2Yoc2UpLT5sb2FkLndlaWdodDsKLQotI2lmZGVmIENPTkZJR19GQUlSX1NDSEVEX0dST1VQCi0JCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IHNlLT5teV9xOwotCQlzdHJ1Y3QgdGFza19ncm91cCAqdGcgPSBOVUxMCi0KLQkJaWYgKGNmc19ycSkKLQkJCXRnID0gY2ZzX3JxLT50ZzsKLQotCQlpZiAodGcgJiYgdGctPnNoYXJlcyA8IE5JQ0VfMF9MT0FEKSB7Ci0JCQkvKgotCQkJICogc2NhbGUgc2hhcmVzIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBiZWVuIGhhZAotCQkJICogdGctPndlaWdodCBiZWVuIE5JQ0VfMF9MT0FEOgotCQkJICoKLQkJCSAqICAgd2VpZ2h0ID0gMTAyNCAqIHNoYXJlcyAvIHRnLT53ZWlnaHQKLQkJCSAqLwotCQkJbHcud2VpZ2h0ICo9IHNlLT5sb2FkLndlaWdodDsKLQkJCWx3LndlaWdodCAvPSB0Zy0+c2hhcmVzOwotCi0JCQlsdy5pbnZfd2VpZ2h0ID0gMDsKLQotCQkJc2VfbHcgPSAmbHc7Ci0JCQlydyArPSBsdy53ZWlnaHQgLSBzZS0+bG9hZC53ZWlnaHQ7Ci0JCX0gZWxzZQotI2VuZGlmCi0KLQkJaWYgKHNlLT5sb2FkLndlaWdodCA8IE5JQ0VfMF9MT0FEKSB7Ci0JCQlzZV9sdyA9ICZsdzsKLQkJCXJ3ICs9IE5JQ0VfMF9MT0FEIC0gc2UtPmxvYWQud2VpZ2h0OwotCQl9Ci0KLQkJZGVsdGEgPSBjYWxjX2RlbHRhX21pbmUoZGVsdGEsIHJ3LCBzZV9sdyk7Ci0JfQotCi0JcmV0dXJuIGRlbHRhOwotfQotCi0vKgogICogVXBkYXRlIHRoZSBjdXJyZW50IHRhc2sncyBydW50aW1lIHN0YXRpc3RpY3MuIFNraXAgY3VycmVudCB0YXNrcyB0aGF0CiAgKiBhcmUgbm90IGluIG91ciBzY2hlZHVsaW5nIGNsYXNzLgogICovCkBAIC01ODYsMTEgKzUyOCwxMiBAQAogCXVwZGF0ZV9sb2FkX2FkZCgmY2ZzX3JxLT5sb2FkLCBzZS0+bG9hZC53ZWlnaHQpOwogCWlmICghcGFyZW50X2VudGl0eShzZSkpCiAJCWluY19jcHVfbG9hZChycV9vZihjZnNfcnEpLCBzZS0+bG9hZC53ZWlnaHQpOwotCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpCisJaWYgKGVudGl0eV9pc190YXNrKHNlKSkgewogCQlhZGRfY2ZzX3Rhc2tfd2VpZ2h0KGNmc19ycSwgc2UtPmxvYWQud2VpZ2h0KTsKKwkJbGlzdF9hZGQoJnNlLT5ncm91cF9ub2RlLCAmY2ZzX3JxLT50YXNrcyk7CisJfQogCWNmc19ycS0+bnJfcnVubmluZysrOwogCXNlLT5vbl9ycSA9IDE7Ci0JbGlzdF9hZGQoJnNlLT5ncm91cF9ub2RlLCAmY2ZzX3JxLT50YXNrcyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC01OTksMTEgKzU0MiwxMiBAQAogCXVwZGF0ZV9sb2FkX3N1YigmY2ZzX3JxLT5sb2FkLCBzZS0+bG9hZC53ZWlnaHQpOwogCWlmICghcGFyZW50X2VudGl0eShzZSkpCiAJCWRlY19jcHVfbG9hZChycV9vZihjZnNfcnEpLCBzZS0+bG9hZC53ZWlnaHQpOwotCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpCisJaWYgKGVudGl0eV9pc190YXNrKHNlKSkgewogCQlhZGRfY2ZzX3Rhc2tfd2VpZ2h0KGNmc19ycSwgLXNlLT5sb2FkLndlaWdodCk7CisJCWxpc3RfZGVsX2luaXQoJnNlLT5ncm91cF9ub2RlKTsKKwl9CiAJY2ZzX3JxLT5ucl9ydW5uaW5nLS07CiAJc2UtPm9uX3JxID0gMDsKLQlsaXN0X2RlbF9pbml0KCZzZS0+Z3JvdXBfbm9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVucXVldWVfc2xlZXBlcihzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQpAQCAtMTA4NSw3ICsxMDI5LDYgQEAKIAkJbG9uZyB3bCwgbG9uZyB3ZykKIHsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9IHRnLT5zZVtjcHVdOwotCWxvbmcgbW9yZV93OwogCiAJaWYgKCF0Zy0+cGFyZW50KQogCQlyZXR1cm4gd2w7CkBAIC0xMDk3LDE4ICsxMDQwLDE3IEBACiAJaWYgKCF3bCAmJiBzY2hlZF9mZWF0KEFTWU1fRUZGX0xPQUQpKQogCQlyZXR1cm4gd2w7CiAKLQkvKgotCSAqIEluc3RlYWQgb2YgdXNpbmcgdGhpcyBpbmNyZW1lbnQsIGFsc28gYWRkIHRoZSBkaWZmZXJlbmNlCi0JICogYmV0d2VlbiB3aGVuIHRoZSBzaGFyZXMgd2VyZSBsYXN0IHVwZGF0ZWQgYW5kIG5vdy4KLQkgKi8KLQltb3JlX3cgPSBzZS0+bXlfcS0+bG9hZC53ZWlnaHQgLSBzZS0+bXlfcS0+cnFfd2VpZ2h0OwotCXdsICs9IG1vcmVfdzsKLQl3ZyArPSBtb3JlX3c7Ci0KIAlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKLSNkZWZpbmUgRChuKSAobGlrZWx5KG4pID8gKG4pIDogMSkKLQogCQlsb25nIFMsIHJ3LCBzLCBhLCBiOworCQlsb25nIG1vcmVfdzsKKworCQkvKgorCQkgKiBJbnN0ZWFkIG9mIHVzaW5nIHRoaXMgaW5jcmVtZW50LCBhbHNvIGFkZCB0aGUgZGlmZmVyZW5jZQorCQkgKiBiZXR3ZWVuIHdoZW4gdGhlIHNoYXJlcyB3ZXJlIGxhc3QgdXBkYXRlZCBhbmQgbm93LgorCQkgKi8KKwkJbW9yZV93ID0gc2UtPm15X3EtPmxvYWQud2VpZ2h0IC0gc2UtPm15X3EtPnJxX3dlaWdodDsKKwkJd2wgKz0gbW9yZV93OworCQl3ZyArPSBtb3JlX3c7CiAKIAkJUyA9IHNlLT5teV9xLT50Zy0+c2hhcmVzOwogCQlzID0gc2UtPm15X3EtPnNoYXJlczsKQEAgLTExMTcsNyArMTA1OSwxMSBAQAogCQlhID0gUyoocncgKyB3bCk7CiAJCWIgPSBTKnJ3ICsgcyp3ZzsKIAotCQl3bCA9IHMqKGEtYikvRChiKTsKKwkJd2wgPSBzKihhLWIpOworCisJCWlmIChsaWtlbHkoYikpCisJCQl3bCAvPSBiOworCiAJCS8qCiAJCSAqIEFzc3VtZSB0aGUgZ3JvdXAgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCB3aWxsCiAJCSAqIHRodXMgYWxyZWFkeSBiZSBhY2NvdW50ZWQgZm9yIGluIHRoZSB3ZWlnaHQuCkBAIC0xMTI2LDcgKzEwNzIsNiBAQAogCQkgKiBhbHRlciB0aGUgZ3JvdXAgd2VpZ2h0LgogCQkgKi8KIAkJd2cgPSAwOwotI3VuZGVmIEQKIAl9CiAKIAlyZXR1cm4gd2w7CkBAIC0xMTQzLDcgKzEwODgsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLXdha2VfYWZmaW5lKHN0cnVjdCBycSAqcnEsIHN0cnVjdCBzY2hlZF9kb21haW4gKnRoaXNfc2QsIHN0cnVjdCBycSAqdGhpc19ycSwKK3dha2VfYWZmaW5lKHN0cnVjdCBzY2hlZF9kb21haW4gKnRoaXNfc2QsIHN0cnVjdCBycSAqdGhpc19ycSwKIAkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJldl9jcHUsIGludCB0aGlzX2NwdSwgaW50IHN5bmMsCiAJICAgIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9hZCwgdW5zaWduZWQgbG9uZyB0aGlzX2xvYWQsCiAJICAgIHVuc2lnbmVkIGludCBpbWJhbGFuY2UpCkBAIC0xMTU4LDYgKzExMDMsMTEgQEAKIAlpZiAoISh0aGlzX3NkLT5mbGFncyAmIFNEX1dBS0VfQUZGSU5FKSB8fCAhc2NoZWRfZmVhdChBRkZJTkVfV0FLRVVQUykpCiAJCXJldHVybiAwOwogCisJaWYgKCFzeW5jICYmIHNjaGVkX2ZlYXQoU1lOQ19XQUtFVVBTKSAmJgorCSAgICBjdXJyLT5zZS5hdmdfb3ZlcmxhcCA8IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdCAmJgorCSAgICBwLT5zZS5hdmdfb3ZlcmxhcCA8IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdCkKKwkJc3luYyA9IDE7CisKIAkvKgogCSAqIElmIHN5bmMgd2FrZXVwIHRoZW4gc3VidHJhY3QgdGhlIChtYXhpbXVtIHBvc3NpYmxlKQogCSAqIGVmZmVjdCBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBmcm9tIHRoZSBsb2FkCkBAIC0xMTgyLDE3ICsxMTMyLDE0IEBACiAJICogYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lIHRoZW4gYXR0cmFjdCB0aGlzIG5ld2x5CiAJICogd29rZW4gdGFzazoKIAkgKi8KLQlpZiAoc3luYyAmJiBiYWxhbmNlZCkgewotCQlpZiAoY3Vyci0+c2UuYXZnX292ZXJsYXAgPCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QgJiYKLQkJICAgIHAtPnNlLmF2Z19vdmVybGFwIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0KQotCQkJcmV0dXJuIDE7Ci0JfQorCWlmIChzeW5jICYmIGJhbGFuY2VkKQorCQlyZXR1cm4gMTsKIAogCXNjaGVkc3RhdF9pbmMocCwgc2UubnJfd2FrZXVwc19hZmZpbmVfYXR0ZW1wdHMpOwogCXRsX3Blcl90YXNrID0gY3B1X2F2Z19sb2FkX3Blcl90YXNrKHRoaXNfY3B1KTsKIAotCWlmICgodGwgPD0gbG9hZCAmJiB0bCArIHRhcmdldF9sb2FkKHByZXZfY3B1LCBpZHgpIDw9IHRsX3Blcl90YXNrKSB8fAotCQkJYmFsYW5jZWQpIHsKKwlpZiAoYmFsYW5jZWQgfHwgKHRsIDw9IGxvYWQgJiYgdGwgKyB0YXJnZXRfbG9hZChwcmV2X2NwdSwgaWR4KSA8PQorCQkJdGxfcGVyX3Rhc2spKSB7CiAJCS8qCiAJCSAqIFRoaXMgZG9tYWluIGhhcyBTRF9XQUtFX0FGRklORSBhbmQKIAkJICogcCBpcyBjYWNoZSBjb2xkIGluIHRoaXMgZG9tYWluLCBhbmQKQEAgLTEyMTEsMTYgKzExNTgsMTcgQEAKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgKnRoaXNfc2QgPSBOVUxMOwogCWludCBwcmV2X2NwdSwgdGhpc19jcHUsIG5ld19jcHU7CiAJdW5zaWduZWQgbG9uZyBsb2FkLCB0aGlzX2xvYWQ7Ci0Jc3RydWN0IHJxICpycSwgKnRoaXNfcnE7CisJc3RydWN0IHJxICp0aGlzX3JxOwogCXVuc2lnbmVkIGludCBpbWJhbGFuY2U7CiAJaW50IGlkeDsKIAogCXByZXZfY3B1CT0gdGFza19jcHUocCk7Ci0JcnEJCT0gdGFza19ycShwKTsKIAl0aGlzX2NwdQk9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl0aGlzX3JxCQk9IGNwdV9ycSh0aGlzX2NwdSk7CiAJbmV3X2NwdQkJPSBwcmV2X2NwdTsKIAorCWlmIChwcmV2X2NwdSA9PSB0aGlzX2NwdSkKKwkJZ290byBvdXQ7CiAJLyoKIAkgKiAndGhpc19zZCcgaXMgdGhlIGZpcnN0IGRvbWFpbiB0aGF0IGJvdGgKIAkgKiB0aGlzX2NwdSBhbmQgcHJldl9jcHUgYXJlIHByZXNlbnQgaW46CkBAIC0xMjQ4LDEzICsxMTk2LDEwIEBACiAJbG9hZCA9IHNvdXJjZV9sb2FkKHByZXZfY3B1LCBpZHgpOwogCXRoaXNfbG9hZCA9IHRhcmdldF9sb2FkKHRoaXNfY3B1LCBpZHgpOwogCi0JaWYgKHdha2VfYWZmaW5lKHJxLCB0aGlzX3NkLCB0aGlzX3JxLCBwLCBwcmV2X2NwdSwgdGhpc19jcHUsIHN5bmMsIGlkeCwKKwlpZiAod2FrZV9hZmZpbmUodGhpc19zZCwgdGhpc19ycSwgcCwgcHJldl9jcHUsIHRoaXNfY3B1LCBzeW5jLCBpZHgsCiAJCQkJICAgICBsb2FkLCB0aGlzX2xvYWQsIGltYmFsYW5jZSkpCiAJCXJldHVybiB0aGlzX2NwdTsKIAotCWlmIChwcmV2X2NwdSA9PSB0aGlzX2NwdSkKLQkJZ290byBvdXQ7Ci0KIAkvKgogCSAqIFN0YXJ0IHBhc3NpdmUgYmFsYW5jaW5nIHdoZW4gaGFsZiB0aGUgaW1iYWxhbmNlX3BjdAogCSAqIGxpbWl0IGlzIHJlYWNoZWQuCkBAIC0xMjgxLDYyICsxMjI2LDIwIEBACiAJICogKyBuaWNlIHRhc2tzLgogCSAqLwogCWlmIChzY2hlZF9mZWF0KEFTWU1fR1JBTikpCi0JCWdyYW4gPSBjYWxjX2RlbHRhX2FzeW0oc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eSwgc2UpOwotCWVsc2UKLQkJZ3JhbiA9IGNhbGNfZGVsdGFfZmFpcihzeXNjdGxfc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5LCBzZSk7CisJCWdyYW4gPSBjYWxjX2RlbHRhX21pbmUoZ3JhbiwgTklDRV8wX0xPQUQsICZzZS0+bG9hZCk7CiAKIAlyZXR1cm4gZ3JhbjsKIH0KIAogLyoKLSAqIFNob3VsZCAnc2UnIHByZWVtcHQgJ2N1cnInLgotICoKLSAqICAgICAgICAgICAgIHxzMQotICogICAgICAgIHxzMgotICogICB8czMKLSAqICAgICAgICAgZwotICogICAgICB8PC0tLT58YwotICoKLSAqICB3KGMsIHMxKSA9IC0xCi0gKiAgdyhjLCBzMikgPSAgMAotICogIHcoYywgczMpID0gIDEKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXdha2V1cF9wcmVlbXB0X2VudGl0eShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpjdXJyLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLQlzNjQgZ3JhbiwgdmRpZmYgPSBjdXJyLT52cnVudGltZSAtIHNlLT52cnVudGltZTsKLQotCWlmICh2ZGlmZiA8IDApCi0JCXJldHVybiAtMTsKLQotCWdyYW4gPSB3YWtldXBfZ3JhbihjdXJyKTsKLQlpZiAodmRpZmYgPiBncmFuKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKiByZXR1cm4gZGVwdGggYXQgd2hpY2ggYSBzY2hlZCBlbnRpdHkgaXMgcHJlc2VudCBpbiB0aGUgaGllcmFyY2h5ICovCi1zdGF0aWMgaW5saW5lIGludCBkZXB0aF9zZShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLQlpbnQgZGVwdGggPSAwOwotCi0JZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKQotCQlkZXB0aCsrOwotCi0JcmV0dXJuIGRlcHRoOwotfQotCi0vKgogICogUHJlZW1wdCB0aGUgY3VycmVudCB0YXNrIHdpdGggYSBuZXdseSB3b2tlbiB0YXNrIGlmIG5lZWRlZDoKICAqLwotc3RhdGljIHZvaWQgY2hlY2tfcHJlZW1wdF93YWtldXAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIHZvaWQgY2hlY2tfcHJlZW1wdF93YWtldXAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgc3luYykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBycS0+Y3VycjsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSB0YXNrX2Nmc19ycShjdXJyKTsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZjdXJyLT5zZSwgKnBzZSA9ICZwLT5zZTsKLQlpbnQgc2VfZGVwdGgsIHBzZV9kZXB0aDsKKwlzNjQgZGVsdGFfZXhlYzsKIAogCWlmICh1bmxpa2VseShydF9wcmlvKHAtPnByaW8pKSkgewogCQl1cGRhdGVfcnFfY2xvY2socnEpOwpAQCAtMTM1MSw2ICsxMjU0LDEzIEBACiAJY2ZzX3JxX29mKHBzZSktPm5leHQgPSBwc2U7CiAKIAkvKgorCSAqIFdlIGNhbiBjb21lIGhlcmUgd2l0aCBUSUZfTkVFRF9SRVNDSEVEIGFscmVhZHkgc2V0IGZyb20gbmV3IHRhc2sKKwkgKiB3YWtlIHVwIHBhdGguCisJICovCisJaWYgKHRlc3RfdHNrX25lZWRfcmVzY2hlZChjdXJyKSkKKwkJcmV0dXJuOworCisJLyoKIAkgKiBCYXRjaCB0YXNrcyBkbyBub3QgcHJlZW1wdCAodGhlaXIgcHJlZW1wdGlvbiBpcyBkcml2ZW4gYnkKIAkgKiB0aGUgdGljayk6CiAJICovCkBAIC0xMzYwLDMzICsxMjcwLDE1IEBACiAJaWYgKCFzY2hlZF9mZWF0KFdBS0VVUF9QUkVFTVBUKSkKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBwcmVlbXB0aW9uIHRlc3QgY2FuIGJlIG1hZGUgYmV0d2VlbiBzaWJsaW5nIGVudGl0aWVzIHdobyBhcmUgaW4gdGhlCi0JICogc2FtZSBjZnNfcnEgaS5lIHdobyBoYXZlIGEgY29tbW9uIHBhcmVudC4gV2FsayB1cCB0aGUgaGllcmFyY2h5IG9mCi0JICogYm90aCB0YXNrcyB1bnRpbCB3ZSBmaW5kIHRoZWlyIGFuY2VzdG9ycyB3aG8gYXJlIHNpYmxpbmdzIG9mIGNvbW1vbgotCSAqIHBhcmVudC4KLQkgKi8KLQotCS8qIEZpcnN0IHdhbGsgdXAgdW50aWwgYm90aCBlbnRpdGllcyBhcmUgYXQgc2FtZSBkZXB0aCAqLwotCXNlX2RlcHRoID0gZGVwdGhfc2Uoc2UpOwotCXBzZV9kZXB0aCA9IGRlcHRoX3NlKHBzZSk7Ci0KLQl3aGlsZSAoc2VfZGVwdGggPiBwc2VfZGVwdGgpIHsKLQkJc2VfZGVwdGgtLTsKLQkJc2UgPSBwYXJlbnRfZW50aXR5KHNlKTsKKwlpZiAoc2NoZWRfZmVhdChXQUtFVVBfT1ZFUkxBUCkgJiYgKHN5bmMgfHwKKwkJCShzZS0+YXZnX292ZXJsYXAgPCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QgJiYKKwkJCSBwc2UtPmF2Z19vdmVybGFwIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0KSkpIHsKKwkJcmVzY2hlZF90YXNrKGN1cnIpOworCQlyZXR1cm47CiAJfQogCi0Jd2hpbGUgKHBzZV9kZXB0aCA+IHNlX2RlcHRoKSB7Ci0JCXBzZV9kZXB0aC0tOwotCQlwc2UgPSBwYXJlbnRfZW50aXR5KHBzZSk7Ci0JfQotCi0Jd2hpbGUgKCFpc19zYW1lX2dyb3VwKHNlLCBwc2UpKSB7Ci0JCXNlID0gcGFyZW50X2VudGl0eShzZSk7Ci0JCXBzZSA9IHBhcmVudF9lbnRpdHkocHNlKTsKLQl9Ci0KLQlpZiAod2FrZXVwX3ByZWVtcHRfZW50aXR5KHNlLCBwc2UpID09IDEpCisJZGVsdGFfZXhlYyA9IHNlLT5zdW1fZXhlY19ydW50aW1lIC0gc2UtPnByZXZfc3VtX2V4ZWNfcnVudGltZTsKKwlpZiAoZGVsdGFfZXhlYyA+IHdha2V1cF9ncmFuKHBzZSkpCiAJCXJlc2NoZWRfdGFzayhjdXJyKTsKIH0KIApAQCAtMTQ0NSwxOSArMTMzNyw5IEBACiAJaWYgKG5leHQgPT0gJmNmc19ycS0+dGFza3MpCiAJCXJldHVybiBOVUxMOwogCi0JLyogU2tpcCBvdmVyIGVudGl0aWVzIHRoYXQgYXJlIG5vdCB0YXNrcyAqLwotCWRvIHsKLQkJc2UgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBzY2hlZF9lbnRpdHksIGdyb3VwX25vZGUpOwotCQluZXh0ID0gbmV4dC0+bmV4dDsKLQl9IHdoaWxlIChuZXh0ICE9ICZjZnNfcnEtPnRhc2tzICYmICFlbnRpdHlfaXNfdGFzayhzZSkpOwotCi0JaWYgKG5leHQgPT0gJmNmc19ycS0+dGFza3MpCi0JCXJldHVybiBOVUxMOwotCi0JY2ZzX3JxLT5iYWxhbmNlX2l0ZXJhdG9yID0gbmV4dDsKLQotCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpCi0JCXAgPSB0YXNrX29mKHNlKTsKKwlzZSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHNjaGVkX2VudGl0eSwgZ3JvdXBfbm9kZSk7CisJcCA9IHRhc2tfb2Yoc2UpOworCWNmc19ycS0+YmFsYW5jZV9pdGVyYXRvciA9IG5leHQtPm5leHQ7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTE1MDcsNyArMTM4OSw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCXVwZGF0ZV9oX2xvYWQoYnVzaWVzdF9jcHUpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZywgJnRhc2tfZ3JvdXBzLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodGcsICZ0YXNrX2dyb3VwcywgbGlzdCkgewogCQlzdHJ1Y3QgY2ZzX3JxICpidXNpZXN0X2Nmc19ycSA9IHRnLT5jZnNfcnFbYnVzaWVzdF9jcHVdOwogCQl1bnNpZ25lZCBsb25nIGJ1c2llc3RfaF9sb2FkID0gYnVzaWVzdF9jZnNfcnEtPmhfbG9hZDsKIAkJdW5zaWduZWQgbG9uZyBidXNpZXN0X3dlaWdodCA9IGJ1c2llc3RfY2ZzX3JxLT5sb2FkLndlaWdodDsKQEAgLTE2MjAsMTAgKzE1MDIsMTAgQEAKIAkJICogJ2N1cnJlbnQnIHdpdGhpbiB0aGUgdHJlZSBiYXNlZCBvbiBpdHMgbmV3IGtleSB2YWx1ZS4KIAkJICovCiAJCXN3YXAoY3Vyci0+dnJ1bnRpbWUsIHNlLT52cnVudGltZSk7CisJCXJlc2NoZWRfdGFzayhycS0+Y3Vycik7CiAJfQogCiAJZW5xdWV1ZV90YXNrX2ZhaXIocnEsIHAsIDApOwotCXJlc2NoZWRfdGFzayhycS0+Y3Vycik7CiB9CiAKIC8qCkBAIC0xNjQyLDcgKzE1MjQsNyBAQAogCQlpZiAocC0+cHJpbyA+IG9sZHByaW8pCiAJCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwogCX0gZWxzZQotCQljaGVja19wcmVlbXB0X2N1cnIocnEsIHApOworCQljaGVja19wcmVlbXB0X2N1cnIocnEsIHAsIDApOwogfQogCiAvKgpAQCAtMTY1OSw3ICsxNTQxLDcgQEAKIAlpZiAocnVubmluZykKIAkJcmVzY2hlZF90YXNrKHJxLT5jdXJyKTsKIAllbHNlCi0JCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCk7CisJCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgMCk7CiB9CiAKIC8qIEFjY291bnQgZm9yIGEgdGFzayBjaGFuZ2luZyBpdHMgcG9saWN5IG9yIGdyb3VwLgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmggYi9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaAppbmRleCA5MzUzY2E3Li43YzllOGY0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaAorKysgYi9rZXJuZWwvc2NoZWRfZmVhdHVyZXMuaApAQCAtMTEsMyArMTEsNCBAQAogU0NIRURfRkVBVChMQl9CSUFTLCAxKQogU0NIRURfRkVBVChMQl9XQUtFVVBfVVBEQVRFLCAxKQogU0NIRURfRkVBVChBU1lNX0VGRl9MT0FELCAxKQorU0NIRURfRkVBVChXQUtFVVBfT1ZFUkxBUCwgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9pZGxldGFzay5jIGIva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMKaW5kZXggM2E0ZjkyZC4uZGVjNGNjYSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMKKysrIGIva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMKQEAgLTE0LDcgKzE0LDcgQEAKIC8qCiAgKiBJZGxlIHRhc2tzIGFyZSB1bmNvbmRpdGlvbmFsbHkgcmVzY2hlZHVsZWQ6CiAgKi8KLXN0YXRpYyB2b2lkIGNoZWNrX3ByZWVtcHRfY3Vycl9pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3N0YXRpYyB2b2lkIGNoZWNrX3ByZWVtcHRfY3Vycl9pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHN5bmMpCiB7CiAJcmVzY2hlZF90YXNrKHJxLT5pZGxlKTsKIH0KQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAocnVubmluZykKIAkJcmVzY2hlZF90YXNrKHJxLT5jdXJyKTsKIAllbHNlCi0JCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCk7CisJCWNoZWNrX3ByZWVtcHRfY3VycihycSwgcCwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW9fY2hhbmdlZF9pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKQEAgLTkzLDcgKzkzLDcgQEAKIAkJaWYgKHAtPnByaW8gPiBvbGRwcmlvKQogCQkJcmVzY2hlZF90YXNrKHJxLT5jdXJyKTsKIAl9IGVsc2UKLQkJY2hlY2tfcHJlZW1wdF9jdXJyKHJxLCBwKTsKKwkJY2hlY2tfcHJlZW1wdF9jdXJyKHJxLCBwLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9ydC5jIGIva2VybmVsL3NjaGVkX3J0LmMKaW5kZXggNTUyMzEwNy4uY2RmNTc0MCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX3J0LmMKKysrIGIva2VybmVsL3NjaGVkX3J0LmMKQEAgLTEwMiwxMiArMTAyLDEyIEBACiAKIHN0YXRpYyB2b2lkIHNjaGVkX3J0X3JxX2VucXVldWUoc3RydWN0IHJ0X3JxICpydF9ycSkKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBycV9vZl9ydF9ycShydF9ycSktPmN1cnI7CiAJc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UgPSBydF9ycS0+cnRfc2U7CiAKLQlpZiAocnRfc2UgJiYgIW9uX3J0X3JxKHJ0X3NlKSAmJiBydF9ycS0+cnRfbnJfcnVubmluZykgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBycV9vZl9ydF9ycShydF9ycSktPmN1cnI7Ci0KLQkJZW5xdWV1ZV9ydF9lbnRpdHkocnRfc2UpOworCWlmIChydF9ycS0+cnRfbnJfcnVubmluZykgeworCQlpZiAocnRfc2UgJiYgIW9uX3J0X3JxKHJ0X3NlKSkKKwkJCWVucXVldWVfcnRfZW50aXR5KHJ0X3NlKTsKIAkJaWYgKHJ0X3JxLT5oaWdoZXN0X3ByaW8gPCBjdXJyLT5wcmlvKQogCQkJcmVzY2hlZF90YXNrKGN1cnIpOwogCX0KQEAgLTIzMSw2ICsyMzEsOSBAQAogI2VuZGlmIC8qIENPTkZJR19SVF9HUk9VUF9TQ0hFRCAqLwogCiAjaWZkZWYgQ09ORklHX1NNUAorLyoKKyAqIFdlIHJhbiBvdXQgb2YgcnVudGltZSwgc2VlIGlmIHdlIGNhbiBib3Jyb3cgc29tZSBmcm9tIG91ciBuZWlnaGJvdXJzLgorICovCiBzdGF0aWMgaW50IGRvX2JhbGFuY2VfcnVudGltZShzdHJ1Y3QgcnRfcnEgKnJ0X3JxKQogewogCXN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IgPSBzY2hlZF9ydF9iYW5kd2lkdGgocnRfcnEpOwpAQCAtMjUwLDkgKzI1MywxOCBAQAogCQkJY29udGludWU7CiAKIAkJc3Bpbl9sb2NrKCZpdGVyLT5ydF9ydW50aW1lX2xvY2spOworCQkvKgorCQkgKiBFaXRoZXIgYWxsIHJxcyBoYXZlIGluZiBydW50aW1lIGFuZCB0aGVyZSdzIG5vdGhpbmcgdG8gc3RlYWwKKwkJICogb3IgX19kaXNhYmxlX3J1bnRpbWUoKSBiZWxvdyBzZXRzIGEgc3BlY2lmaWMgcnEgdG8gaW5mIHRvCisJCSAqIGluZGljYXRlIGl0cyBiZWVuIGRpc2FibGVkIGFuZCBkaXNhbG93IHN0ZWFsaW5nLgorCQkgKi8KIAkJaWYgKGl0ZXItPnJ0X3J1bnRpbWUgPT0gUlVOVElNRV9JTkYpCiAJCQlnb3RvIG5leHQ7CiAKKwkJLyoKKwkJICogRnJvbSBydW5xdWV1ZXMgd2l0aCBzcGFyZSB0aW1lLCB0YWtlIDEvbiBwYXJ0IG9mIHRoZWlyCisJCSAqIHNwYXJlIHRpbWUsIGJ1dCBubyBtb3JlIHRoYW4gb3VyIHBlcmlvZC4KKwkJICovCiAJCWRpZmYgPSBpdGVyLT5ydF9ydW50aW1lIC0gaXRlci0+cnRfdGltZTsKIAkJaWYgKGRpZmYgPiAwKSB7CiAJCQlkaWZmID0gZGl2X3U2NCgodTY0KWRpZmYsIHdlaWdodCk7CkBAIC0yNzQsNiArMjg2LDkgQEAKIAlyZXR1cm4gbW9yZTsKIH0KIAorLyoKKyAqIEVuc3VyZSB0aGlzIFJRIHRha2VzIGJhY2sgYWxsIHRoZSBydW50aW1lIGl0IGxlbmQgdG8gaXRzIG5laWdoYm91cnMuCisgKi8KIHN0YXRpYyB2b2lkIF9fZGlzYWJsZV9ydW50aW1lKHN0cnVjdCBycSAqcnEpCiB7CiAJc3RydWN0IHJvb3RfZG9tYWluICpyZCA9IHJxLT5yZDsKQEAgLTI4OSwxNyArMzA0LDMzIEBACiAKIAkJc3Bpbl9sb2NrKCZydF9iLT5ydF9ydW50aW1lX2xvY2spOwogCQlzcGluX2xvY2soJnJ0X3JxLT5ydF9ydW50aW1lX2xvY2spOworCQkvKgorCQkgKiBFaXRoZXIgd2UncmUgYWxsIGluZiBhbmQgbm9ib2R5IG5lZWRzIHRvIGJvcnJvdywgb3Igd2UncmUKKwkJICogYWxyZWFkeSBkaXNhYmxlZCBhbmQgdGh1cyBoYXZlIG5vdGhpbmcgdG8gZG8sIG9yIHdlIGhhdmUKKwkJICogZXhhY3RseSB0aGUgcmlnaHQgYW1vdW50IG9mIHJ1bnRpbWUgdG8gdGFrZSBvdXQuCisJCSAqLwogCQlpZiAocnRfcnEtPnJ0X3J1bnRpbWUgPT0gUlVOVElNRV9JTkYgfHwKIAkJCQlydF9ycS0+cnRfcnVudGltZSA9PSBydF9iLT5ydF9ydW50aW1lKQogCQkJZ290byBiYWxhbmNlZDsKIAkJc3Bpbl91bmxvY2soJnJ0X3JxLT5ydF9ydW50aW1lX2xvY2spOwogCisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgd2Ugc3RhcnRlZCBvdXQgd2l0aAorCQkgKiBhbmQgd2hhdCB3ZSBjdXJyZW50IGhhdmUsIHRoYXQncyB0aGUgYW1vdW50IG9mIHJ1bnRpbWUKKwkJICogd2UgbGVuZCBhbmQgbm93IGhhdmUgdG8gcmVjbGFpbS4KKwkJICovCiAJCXdhbnQgPSBydF9iLT5ydF9ydW50aW1lIC0gcnRfcnEtPnJ0X3J1bnRpbWU7CiAKKwkJLyoKKwkJICogR3JlZWR5IHJlY2xhaW0sIHRha2UgYmFjayBhcyBtdWNoIGFzIHdlIGNhbi4KKwkJICovCiAJCWZvcl9lYWNoX2NwdV9tYXNrKGksIHJkLT5zcGFuKSB7CiAJCQlzdHJ1Y3QgcnRfcnEgKml0ZXIgPSBzY2hlZF9ydF9wZXJpb2RfcnRfcnEocnRfYiwgaSk7CiAJCQlzNjQgZGlmZjsKIAorCQkJLyoKKwkJCSAqIENhbid0IHJlY2xhaW0gZnJvbSBvdXJzZWx2ZXMgb3IgZGlzYWJsZWQgcnVucXVldWVzLgorCQkJICovCiAJCQlpZiAoaXRlciA9PSBydF9ycSB8fCBpdGVyLT5ydF9ydW50aW1lID09IFJVTlRJTUVfSU5GKQogCQkJCWNvbnRpbnVlOwogCkBAIC0zMTksOCArMzUwLDE2IEBACiAJCX0KIAogCQlzcGluX2xvY2soJnJ0X3JxLT5ydF9ydW50aW1lX2xvY2spOworCQkvKgorCQkgKiBXZSBjYW5ub3QgYmUgbGVmdCB3YW50aW5nIC0gdGhhdCB3b3VsZCBtZWFuIHNvbWUgcnVudGltZQorCQkgKiBsZWFrZWQgb3V0IG9mIHRoZSBzeXN0ZW0uCisJCSAqLwogCQlCVUdfT04od2FudCk7CiBiYWxhbmNlZDoKKwkJLyoKKwkJICogRGlzYWJsZSBhbGwgdGhlIGJvcnJvdyBsb2dpYyBieSBwcmV0ZW5kaW5nIHdlIGhhdmUgaW5mCisJCSAqIHJ1bnRpbWUgLSBpbiB3aGljaCBjYXNlIGJvcnJvd2luZyBkb2Vzbid0IG1ha2Ugc2Vuc2UuCisJCSAqLwogCQlydF9ycS0+cnRfcnVudGltZSA9IFJVTlRJTUVfSU5GOwogCQlzcGluX3VubG9jaygmcnRfcnEtPnJ0X3J1bnRpbWVfbG9jayk7CiAJCXNwaW5fdW5sb2NrKCZydF9iLT5ydF9ydW50aW1lX2xvY2spOwpAQCAtMzQzLDYgKzM4Miw5IEBACiAJaWYgKHVubGlrZWx5KCFzY2hlZHVsZXJfcnVubmluZykpCiAJCXJldHVybjsKIAorCS8qCisJICogUmVzZXQgZWFjaCBydW5xdWV1ZSdzIGJhbmR3aWR0aCBzZXR0aW5ncworCSAqLwogCWZvcl9lYWNoX2xlYWZfcnRfcnEocnRfcnEsIHJxKSB7CiAJCXN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IgPSBzY2hlZF9ydF9iYW5kd2lkdGgocnRfcnEpOwogCkBAIC0zNTAsNiArMzkyLDcgQEAKIAkJc3Bpbl9sb2NrKCZydF9ycS0+cnRfcnVudGltZV9sb2NrKTsKIAkJcnRfcnEtPnJ0X3J1bnRpbWUgPSBydF9iLT5ydF9ydW50aW1lOwogCQlydF9ycS0+cnRfdGltZSA9IDA7CisJCXJ0X3JxLT5ydF90aHJvdHRsZWQgPSAwOwogCQlzcGluX3VubG9jaygmcnRfcnEtPnJ0X3J1bnRpbWVfbG9jayk7CiAJCXNwaW5fdW5sb2NrKCZydF9iLT5ydF9ydW50aW1lX2xvY2spOwogCX0KQEAgLTM4OCw3ICs0MzEsNyBAQAogCWludCBpLCBpZGxlID0gMTsKIAljcHVtYXNrX3Qgc3BhbjsKIAotCWlmIChydF9iLT5ydF9ydW50aW1lID09IFJVTlRJTUVfSU5GKQorCWlmICghcnRfYmFuZHdpZHRoX2VuYWJsZWQoKSB8fCBydF9iLT5ydF9ydW50aW1lID09IFJVTlRJTUVfSU5GKQogCQlyZXR1cm4gMTsKIAogCXNwYW4gPSBzY2hlZF9ydF9wZXJpb2RfbWFzaygpOwpAQCAtNDg2LDYgKzUyOSw5IEBACiAJY3Vyci0+c2UuZXhlY19zdGFydCA9IHJxLT5jbG9jazsKIAljcHVhY2N0X2NoYXJnZShjdXJyLCBkZWx0YV9leGVjKTsKIAorCWlmICghcnRfYmFuZHdpZHRoX2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCiAJZm9yX2VhY2hfc2NoZWRfcnRfZW50aXR5KHJ0X3NlKSB7CiAJCXJ0X3JxID0gcnRfcnFfb2Zfc2UocnRfc2UpOwogCkBAIC03ODMsNyArODI5LDcgQEAKIC8qCiAgKiBQcmVlbXB0IHRoZSBjdXJyZW50IHRhc2sgd2l0aCBhIG5ld2x5IHdva2VuIHRhc2sgaWYgbmVlZGVkOgogICovCi1zdGF0aWMgdm9pZCBjaGVja19wcmVlbXB0X2N1cnJfcnQoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIHZvaWQgY2hlY2tfcHJlZW1wdF9jdXJyX3J0KHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHN5bmMpCiB7CiAJaWYgKHAtPnByaW8gPCBycS0+Y3Vyci0+cHJpbykgewogCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggYzUwNmYyNi4uMzdkNjdhYSAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC00Niw3ICs0Niw3IEBACiBFWFBPUlRfU1lNQk9MKGlycV9zdGF0KTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNvZnRpcnFfYWN0aW9uIHNvZnRpcnFfdmVjWzMyXSBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKK3N0YXRpYyBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gc29mdGlycV92ZWNbTlJfU09GVElSUVNdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tfc3RydWN0ICosIGtzb2Z0aXJxZCk7CiAKQEAgLTIwNSw3ICsyMDUsMTggQEAKIAogCWRvIHsKIAkJaWYgKHBlbmRpbmcgJiAxKSB7CisJCQlpbnQgcHJldl9jb3VudCA9IHByZWVtcHRfY291bnQoKTsKKwogCQkJaC0+YWN0aW9uKGgpOworCisJCQlpZiAodW5saWtlbHkocHJldl9jb3VudCAhPSBwcmVlbXB0X2NvdW50KCkpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJodWgsIGVudGVyZWQgc29mdGlycSAldGQgJXAiCisJCQkJICAgICAgICJ3aXRoIHByZWVtcHRfY291bnQgJTA4eCwiCisJCQkJICAgICAgICIgZXhpdGVkIHdpdGggJTA4eD9cbiIsIGggLSBzb2Z0aXJxX3ZlYywKKwkJCQkgICAgICAgaC0+YWN0aW9uLCBwcmV2X2NvdW50LCBwcmVlbXB0X2NvdW50KCkpOworCQkJCXByZWVtcHRfY291bnQoKSA9IHByZXZfY291bnQ7CisJCQl9CisKIAkJCXJjdV9iaF9xc2N0cl9pbmMoY3B1KTsKIAkJfQogCQloKys7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGxvY2t1cC5jIGIva2VybmVsL3NvZnRsb2NrdXAuYwppbmRleCBjYjgzOGVlLi4zOTUzZTRhIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGxvY2t1cC5jCisrKyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCSAqIElmIHRoZSBzeXN0ZW0gY3Jhc2hlZCBhbHJlYWR5IHRoZW4gYWxsIGJldHMgYXJlIG9mZiwKIAkgKiBkbyBub3QgcmVwb3J0IGV4dHJhIGh1bmcgdGFza3M6CiAJICovCi0JaWYgKCh0YWludGVkICYgVEFJTlRfRElFKSB8fCBkaWRfcGFuaWMpCisJaWYgKHRlc3RfdGFpbnQoVEFJTlRfRElFKSB8fCBkaWRfcGFuaWMpCiAJCXJldHVybjsKIAogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggMWI5NjQwMS4uZmM3MWY5OSAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMTA2MCw5ICsxMDYwLDcgQEAKIAlncm91cF9sZWFkZXItPnNpZ25hbC0+bGVhZGVyID0gMTsKIAlfX3NldF9zcGVjaWFsX3BpZHMoc2lkKTsKIAotCXNwaW5fbG9jaygmZ3JvdXBfbGVhZGVyLT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlncm91cF9sZWFkZXItPnNpZ25hbC0+dHR5ID0gTlVMTDsKLQlzcGluX3VubG9jaygmZ3JvdXBfbGVhZGVyLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlwcm9jX2NsZWFyX3R0eShncm91cF9sZWFkZXIpOwogCiAJZXJyID0gc2Vzc2lvbjsKIG91dDoKQEAgLTEzNTEsOCArMTM0OSwxMCBAQAogCWRvd25fd3JpdGUoJnV0c19zZW0pOwogCWVycm5vID0gLUVGQVVMVDsKIAlpZiAoIWNvcHlfZnJvbV91c2VyKHRtcCwgbmFtZSwgbGVuKSkgewotCQltZW1jcHkodXRzbmFtZSgpLT5ub2RlbmFtZSwgdG1wLCBsZW4pOwotCQl1dHNuYW1lKCktPm5vZGVuYW1lW2xlbl0gPSAwOworCQlzdHJ1Y3QgbmV3X3V0c25hbWUgKnUgPSB1dHNuYW1lKCk7CisKKwkJbWVtY3B5KHUtPm5vZGVuYW1lLCB0bXAsIGxlbik7CisJCW1lbXNldCh1LT5ub2RlbmFtZSArIGxlbiwgMCwgc2l6ZW9mKHUtPm5vZGVuYW1lKSAtIGxlbik7CiAJCWVycm5vID0gMDsKIAl9CiAJdXBfd3JpdGUoJnV0c19zZW0pOwpAQCAtMTM2NCwxNSArMTM2NCwxNyBAQAogYXNtbGlua2FnZSBsb25nIHN5c19nZXRob3N0bmFtZShjaGFyIF9fdXNlciAqbmFtZSwgaW50IGxlbikKIHsKIAlpbnQgaSwgZXJybm87CisJc3RydWN0IG5ld191dHNuYW1lICp1OwogCiAJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWRvd25fcmVhZCgmdXRzX3NlbSk7Ci0JaSA9IDEgKyBzdHJsZW4odXRzbmFtZSgpLT5ub2RlbmFtZSk7CisJdSA9IHV0c25hbWUoKTsKKwlpID0gMSArIHN0cmxlbih1LT5ub2RlbmFtZSk7CiAJaWYgKGkgPiBsZW4pCiAJCWkgPSBsZW47CiAJZXJybm8gPSAwOwotCWlmIChjb3B5X3RvX3VzZXIobmFtZSwgdXRzbmFtZSgpLT5ub2RlbmFtZSwgaSkpCisJaWYgKGNvcHlfdG9fdXNlcihuYW1lLCB1LT5ub2RlbmFtZSwgaSkpCiAJCWVycm5vID0gLUVGQVVMVDsKIAl1cF9yZWFkKCZ1dHNfc2VtKTsKIAlyZXR1cm4gZXJybm87CkBAIC0xMzk3LDggKzEzOTksMTAgQEAKIAlkb3duX3dyaXRlKCZ1dHNfc2VtKTsKIAllcnJubyA9IC1FRkFVTFQ7CiAJaWYgKCFjb3B5X2Zyb21fdXNlcih0bXAsIG5hbWUsIGxlbikpIHsKLQkJbWVtY3B5KHV0c25hbWUoKS0+ZG9tYWlubmFtZSwgdG1wLCBsZW4pOwotCQl1dHNuYW1lKCktPmRvbWFpbm5hbWVbbGVuXSA9IDA7CisJCXN0cnVjdCBuZXdfdXRzbmFtZSAqdSA9IHV0c25hbWUoKTsKKworCQltZW1jcHkodS0+ZG9tYWlubmFtZSwgdG1wLCBsZW4pOworCQltZW1zZXQodS0+ZG9tYWlubmFtZSArIGxlbiwgMCwgc2l6ZW9mKHUtPmRvbWFpbm5hbWUpIC0gbGVuKTsKIAkJZXJybm8gPSAwOwogCX0KIAl1cF93cml0ZSgmdXRzX3NlbSk7CkBAIC0xNDUyLDE0ICsxNDU2LDIyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3JsaW0sIHJsaW0sIHNpemVvZigqcmxpbSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAobmV3X3JsaW0ucmxpbV9jdXIgPiBuZXdfcmxpbS5ybGltX21heCkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJb2xkX3JsaW0gPSBjdXJyZW50LT5zaWduYWwtPnJsaW0gKyByZXNvdXJjZTsKIAlpZiAoKG5ld19ybGltLnJsaW1fbWF4ID4gb2xkX3JsaW0tPnJsaW1fbWF4KSAmJgogCSAgICAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKIAkJcmV0dXJuIC1FUEVSTTsKLQlpZiAocmVzb3VyY2UgPT0gUkxJTUlUX05PRklMRSAmJiBuZXdfcmxpbS5ybGltX21heCA+IHN5c2N0bF9ucl9vcGVuKQotCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHJlc291cmNlID09IFJMSU1JVF9OT0ZJTEUpIHsKKwkJaWYgKG5ld19ybGltLnJsaW1fbWF4ID09IFJMSU1fSU5GSU5JVFkpCisJCQluZXdfcmxpbS5ybGltX21heCA9IHN5c2N0bF9ucl9vcGVuOworCQlpZiAobmV3X3JsaW0ucmxpbV9jdXIgPT0gUkxJTV9JTkZJTklUWSkKKwkJCW5ld19ybGltLnJsaW1fY3VyID0gc3lzY3RsX25yX29wZW47CisJCWlmIChuZXdfcmxpbS5ybGltX21heCA+IHN5c2N0bF9ucl9vcGVuKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAobmV3X3JsaW0ucmxpbV9jdXIgPiBuZXdfcmxpbS5ybGltX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR2YWwgPSBzZWN1cml0eV90YXNrX3NldHJsaW1pdChyZXNvdXJjZSwgJm5ld19ybGltKTsKIAlpZiAocmV0dmFsKQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IDA4ZDZlMWIuLmE3N2IyN2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTEyNSw2ICsxMjUsMTIgQEAKIGNvbmRfc3lzY2FsbChzeXNfdm04Nik7CiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c19pcGMpOwogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfc3lzY3RsKTsKK2NvbmRfc3lzY2FsbChzeXNfZmxvY2spOworY29uZF9zeXNjYWxsKHN5c19pb19zZXR1cCk7Citjb25kX3N5c2NhbGwoc3lzX2lvX2Rlc3Ryb3kpOworY29uZF9zeXNjYWxsKHN5c19pb19zdWJtaXQpOworY29uZF9zeXNjYWxsKHN5c19pb19jYW5jZWwpOworY29uZF9zeXNjYWxsKHN5c19pb19nZXRldmVudHMpOwogCiAvKiBhcmNoLXNwZWNpZmljIHdlYWsgc3lzY2FsbCBlbnRyaWVzICovCiBjb25kX3N5c2NhbGwoc3lzX3BjaWNvbmZpZ19yZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCA1MGVjMDg4Li42MTdkNDFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC04MCw3ICs4MCw2IEBACiBleHRlcm4gaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKIGV4dGVybiBpbnQgcGVyY3B1X3BhZ2VsaXN0X2ZyYWN0aW9uOwogZXh0ZXJuIGludCBjb21wYXRfbG9nOwotZXh0ZXJuIGludCBtYXBzX3Byb3RlY3Q7CiBleHRlcm4gaW50IGxhdGVuY3l0b3BfZW5hYmxlZDsKIGV4dGVybiBpbnQgc3lzY3RsX25yX29wZW5fbWluLCBzeXNjdGxfbnJfb3Blbl9tYXg7CiAjaWZkZWYgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QKQEAgLTk3LDcgKzk2LDcgQEAKIHN0YXRpYyBpbnQgbmVnX29uZSA9IC0xOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTU1VCisjaWYgZGVmaW5lZChDT05GSUdfTU1VKSAmJiBkZWZpbmVkKENPTkZJR19GSUxFX0xPQ0tJTkcpCiBzdGF0aWMgaW50IHR3byA9IDI7CiAjZW5kaWYKIApAQCAtMTE4LDEwICsxMTcsOCBAQAogZXh0ZXJuIGludCBzZ19iaWdfYnVmZjsKICNlbmRpZgogCi0jaWZkZWYgX19zcGFyY19fCi1leHRlcm4gY2hhciByZWJvb3RfY29tbWFuZCBbXTsKLWV4dGVybiBpbnQgc3RvcF9hX2VuYWJsZWQ7Ci1leHRlcm4gaW50IHNjb25zX3B3cm9mZjsKKyNpZmRlZiBDT05GSUdfU1BBUkMKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjZW5kaWYKIAogI2lmZGVmIF9faHBwYV9fCkBAIC0xNTIsNyArMTQ5LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKIHN0YXRpYyBpbnQgcHJvY19kb19jYWRfcGlkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyBpbnQgcHJvY19kb2ludHZlY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CiAjZW5kaWYKIApAQCAtMzgyLDEwICszNzksOSBAQAogI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAogCXsKIAkJLnByb2NuYW1lCT0gInRhaW50ZWQiLAotCQkuZGF0YQkJPSAmdGFpbnRlZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1heGxlbiAJPSBzaXplb2YobG9uZyksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY190YWludCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX3RhaW50LAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTEFURU5DWVRPUApAQCAtNDE1LDcgKzQxMSw3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAotI2lmZGVmIF9fc3BhcmNfXworI2lmZGVmIENPTkZJR19TUEFSQwogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9TUEFSQ19SRUJPT1QsCiAJCS5wcm9jbmFtZQk9ICJyZWJvb3QtY21kIiwKQEAgLTgxMCwxNiArODA2LDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQkJLmN0bF9uYW1lICAgICAgID0gQ1RMX1VOTlVNQkVSRUQsCi0JCS5wcm9jbmFtZSAgICAgICA9ICJtYXBzX3Byb3RlY3QiLAotCQkuZGF0YSAgICAgICAgICAgPSAmbWFwc19wcm90ZWN0LAotCQkubWF4bGVuICAgICAgICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgICAgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciAgID0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLSNlbmRpZgogCXsKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCiAJCS5wcm9jbmFtZQk9ICJwb3dlcm9mZl9jbWQiLApAQCAtMTI2MSw2ICsxMjQ3LDcgQEAKIAkJLmV4dHJhMQkJPSAmbWlub2xkdWlkLAogCQkuZXh0cmEyCQk9ICZtYXhvbGR1aWQsCiAJfSwKKyNpZmRlZiBDT05GSUdfRklMRV9MT0NLSU5HCiAJewogCQkuY3RsX25hbWUJPSBGU19MRUFTRVMsCiAJCS5wcm9jbmFtZQk9ICJsZWFzZXMtZW5hYmxlIiwKQEAgLTEyNjksNiArMTI1Niw3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ROT1RJRlkKIAl7CiAJCS5jdGxfbmFtZQk9IEZTX0RJUl9OT1RJRlksCkBAIC0xMjgwLDYgKzEyNjgsNyBAQAogCX0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTU1VCisjaWZkZWYgQ09ORklHX0ZJTEVfTE9DS0lORwogCXsKIAkJLmN0bF9uYW1lCT0gRlNfTEVBU0VfVElNRSwKIAkJLnByb2NuYW1lCT0gImxlYXNlLWJyZWFrLXRpbWUiLApAQCAtMTI5MSw2ICsxMjgwLDggQEAKIAkJLmV4dHJhMQkJPSAmemVybywKIAkJLmV4dHJhMgkJPSAmdHdvLAogCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUlPCiAJewogCQkucHJvY25hbWUJPSAiYWlvLW5yIiwKIAkJLmRhdGEJCT0gJmFpb19uciwKQEAgLTEzMDUsNiArMTI5Niw3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKIAl9LAorI2VuZGlmIC8qIENPTkZJR19BSU8gKi8KICNpZmRlZiBDT05GSUdfSU5PVElGWV9VU0VSCiAJewogCQkuY3RsX25hbWUJPSBGU19JTk9USUZZLApAQCAtMTUxMCw3ICsxNTAyLDYgQEAKIC8qIFBlcmZvcm0gdGhlIGFjdHVhbCByZWFkL3dyaXRlIG9mIGEgc3lzY3RsIHRhYmxlIGVudHJ5LiAqLwogc3RhdGljIGludCBkb19zeXNjdGxfc3RyYXRlZ3koc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290LAogCQkJc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCi0JCQlpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpAQCAtMTUyNCw4ICsxNTE1LDcgQEAKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICh0YWJsZS0+c3RyYXRlZ3kpIHsKLQkJcmMgPSB0YWJsZS0+c3RyYXRlZ3kodGFibGUsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwKLQkJCQkgICAgIG5ld3ZhbCwgbmV3bGVuKTsKKwkJcmMgPSB0YWJsZS0+c3RyYXRlZ3kodGFibGUsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCQlpZiAocmMgPiAwKQpAQCAtMTUzNSw4ICsxNTI1LDcgQEAKIAkvKiBJZiB0aGVyZSBpcyBubyBzdHJhdGVneSByb3V0aW5lLCBvciBpZiB0aGUgc3RyYXRlZ3kgcmV0dXJucwogCSAqIHplcm8sIHByb2NlZWQgd2l0aCBhdXRvbWF0aWMgci93ICovCiAJaWYgKHRhYmxlLT5kYXRhICYmIHRhYmxlLT5tYXhsZW4pIHsKLQkJcmMgPSBzeXNjdGxfZGF0YSh0YWJsZSwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLAotCQkJCSBuZXd2YWwsIG5ld2xlbik7CisJCXJjID0gc3lzY3RsX2RhdGEodGFibGUsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTE1NjgsNyArMTU1Nyw3IEBACiAJCQkJdGFibGUgPSB0YWJsZS0+Y2hpbGQ7CiAJCQkJZ290byByZXBlYXQ7CiAJCQl9Ci0JCQllcnJvciA9IGRvX3N5c2N0bF9zdHJhdGVneShyb290LCB0YWJsZSwgbmFtZSwgbmxlbiwKKwkJCWVycm9yID0gZG9fc3lzY3RsX3N0cmF0ZWd5KHJvb3QsIHRhYmxlLAogCQkJCQkJICAgb2xkdmFsLCBvbGRsZW5wLAogCQkJCQkJICAgbmV3dmFsLCBuZXdsZW4pOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjIzNyw0OSArMjIyNiwzOSBAQAogCQkgICAgCSAgICBOVUxMLE5VTEwpOwogfQogCi0jZGVmaW5lIE9QX1NFVAkwCi0jZGVmaW5lIE9QX0FORAkxCi0jZGVmaW5lIE9QX09SCTIKLQotc3RhdGljIGludCBkb19wcm9jX2RvaW50dmVjX2JzZXRfY29udihpbnQgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKmx2YWxwLAotCQkJCSAgICAgIGludCAqdmFscCwKLQkJCQkgICAgICBpbnQgd3JpdGUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IG9wID0gKihpbnQgKilkYXRhOwotCWlmICh3cml0ZSkgewotCQlpbnQgdmFsID0gKm5lZ3AgPyAtKmx2YWxwIDogKmx2YWxwOwotCQlzd2l0Y2gob3ApIHsKLQkJY2FzZSBPUF9TRVQ6CSp2YWxwID0gdmFsOyBicmVhazsKLQkJY2FzZSBPUF9BTkQ6CSp2YWxwICY9IHZhbDsgYnJlYWs7Ci0JCWNhc2UgT1BfT1I6CSp2YWxwIHw9IHZhbDsgYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgdmFsID0gKnZhbHA7Ci0JCWlmICh2YWwgPCAwKSB7Ci0JCQkqbmVncCA9IC0xOwotCQkJKmx2YWxwID0gKHVuc2lnbmVkIGxvbmcpLXZhbDsKLQkJfSBlbHNlIHsKLQkJCSpuZWdwID0gMDsKLQkJCSpsdmFscCA9ICh1bnNpZ25lZCBsb25nKXZhbDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoKLSAqCVRhaW50IHZhbHVlcyBjYW4gb25seSBiZSBpbmNyZWFzZWQKKyAqIFRhaW50IHZhbHVlcyBjYW4gb25seSBiZSBpbmNyZWFzZWQKKyAqIFRoaXMgbWVhbnMgd2UgY2FuIHNhZmVseSB1c2UgYSB0ZW1wb3JhcnkuCiAgKi8KLXN0YXRpYyBpbnQgcHJvY19kb2ludHZlY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQgcHJvY190YWludChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlpbnQgb3A7CisJc3RydWN0IGN0bF90YWJsZSB0OworCXVuc2lnbmVkIGxvbmcgdG1wdGFpbnQgPSBnZXRfdGFpbnQoKTsKKwlpbnQgZXJyOwogCiAJaWYgKHdyaXRlICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jb3AgPSBPUF9PUjsKLQlyZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSx3cml0ZSxmaWxwLGJ1ZmZlcixsZW5wLHBwb3MsCi0JCQkJZG9fcHJvY19kb2ludHZlY19ic2V0X2NvbnYsJm9wKTsKKwl0ID0gKnRhYmxlOworCXQuZGF0YSA9ICZ0bXB0YWludDsKKwllcnIgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KCZ0LCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh3cml0ZSkgeworCQkvKgorCQkgKiBQb29yIG1hbidzIGF0b21pYyBvci4gTm90IHdvcnRoIGFkZGluZyBhIHByaW1pdGl2ZQorCQkgKiB0byBldmVyeW9uZSdzIGF0b21pYy5oIGZvciB0aGlzCisJCSAqLworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IEJJVFNfUEVSX0xPTkcgJiYgdG1wdGFpbnQgPj4gaTsgaSsrKSB7CisJCQlpZiAoKHRtcHRhaW50ID4+IGkpICYgMSkKKwkJCQlhZGRfdGFpbnQoaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdHJ1Y3QgZG9fcHJvY19kb2ludHZlY19taW5tYXhfY29udl9wYXJhbSB7CkBAIC0yNzI3LDcgKzI3MDYsNyBAQAogICovCiAKIC8qIFRoZSBnZW5lcmljIHN5c2N0bCBkYXRhIHJvdXRpbmUgKHVzZWQgaWYgbm8gc3RyYXRlZ3kgcm91dGluZSBzdXBwbGllZCkgKi8KLWludCBzeXNjdGxfZGF0YShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX2RhdGEoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCiAJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CkBAIC0yNzYxLDcgKzI3NDAsNyBAQAogfQogCiAvKiBUaGUgZ2VuZXJpYyBzdHJpbmcgc3RyYXRlZ3kgcm91dGluZTogKi8KLWludCBzeXNjdGxfc3RyaW5nKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBzeXNjdGxfc3RyaW5nKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAogCQkgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCSAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTI4MDcsNyArMjc4Niw3IEBACiAgKiBhcmUgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIGFycmF5cwogICogdGFibGUtPmV4dHJhMSBhbmQgdGFibGUtPmV4dHJhMiwgcmVzcGVjdGl2ZWx5LgogICovCi1pbnQgc3lzY3RsX2ludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX2ludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTI4NDMsNyArMjgyMiw3IEBACiB9CiAKIC8qIFN0cmF0ZWd5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgamlmZmllcyB0byBzZWNvbmRzICovIAotaW50IHN5c2N0bF9qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBzeXNjdGxfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTI4NzcsNyArMjg1Niw3IEBACiB9CiAKIC8qIFN0cmF0ZWd5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgamlmZmllcyB0byBzZWNvbmRzICovIAotaW50IHN5c2N0bF9tc19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBzeXNjdGxfbXNfamlmZmllcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTI5MzIsMzUgKzI5MTEsMzUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludCBzeXNjdGxfZGF0YShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX2RhdGEoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCiAJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgc3lzY3RsX3N0cmluZyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitpbnQgc3lzY3RsX3N0cmluZyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKIAkJICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLWludCBzeXNjdGxfaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBzeXNjdGxfaW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAogCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgc3lzY3RsX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAoraW50IHN5c2N0bF9qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAogCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgc3lzY3RsX21zX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAoraW50IHN5c2N0bF9tc19qaWZmaWVzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAogCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvS2NvbmZpZyBiL2tlcm5lbC90aW1lL0tjb25maWcKaW5kZXggOGQ1MzEwNi4uOTVlZDQyOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvS2NvbmZpZworKysgYi9rZXJuZWwvdGltZS9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogIwogY29uZmlnIFRJQ0tfT05FU0hPVAogCWJvb2wKLQlkZWZhdWx0IG4KIAogY29uZmlnIE5PX0haCiAJYm9vbCAiVGlja2xlc3MgU3lzdGVtIChEeW5hbWljIFRpY2tzKSIKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDNkMWUzZTEuLmY4ZDk2ODAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtNzIsNiArNzIsMTYgQEAKIH0KIAogLyoqCisgKiBjbG9ja2V2ZW50c19zaHV0ZG93biAtIHNodXRkb3duIHRoZSBkZXZpY2UgYW5kIGNsZWFyIG5leHRfZXZlbnQKKyAqIEBkZXY6CWRldmljZSB0byBzaHV0ZG93bgorICovCit2b2lkIGNsb2NrZXZlbnRzX3NodXRkb3duKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKK30KKworLyoqCiAgKiBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50IC0gUmVwcm9ncmFtIHRoZSBjbG9jayBldmVudCBkZXZpY2UuCiAgKiBAZXhwaXJlczoJYWJzb2x1dGUgZXhwaXJ5IHRpbWUgKG1vbm90b25pYyBjbG9jaykKICAqCkBAIC0xNzcsNyArMTg3LDcgQEAKIC8qCiAgKiBOb29wIGhhbmRsZXIgd2hlbiB3ZSBzaHV0IGRvd24gYW4gZXZlbnQgZGV2aWNlCiAgKi8KLXN0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2hhbmRsZV9ub29wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3ZvaWQgY2xvY2tldmVudHNfaGFuZGxlX25vb3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQogewogfQogCkBAIC0xOTksNyArMjA5LDYgQEAKIAkgKiByZWxlYXNlZCBsaXN0IGFuZCBkbyBhIG5vdGlmeSBhZGQgbGF0ZXIuCiAJICovCiAJaWYgKG9sZCkgewotCQlvbGQtPmV2ZW50X2hhbmRsZXIgPSBjbG9ja2V2ZW50c19oYW5kbGVfbm9vcDsKIAkJY2xvY2tldmVudHNfc2V0X21vZGUob2xkLCBDTE9DS19FVlRfTU9ERV9VTlVTRUQpOwogCQlsaXN0X2RlbCgmb2xkLT5saXN0KTsKIAkJbGlzdF9hZGQoJm9sZC0+bGlzdCwgJmNsb2NrZXZlbnRzX3JlbGVhc2VkKTsKQEAgLTIwNyw3ICsyMTYsNyBAQAogCiAJaWYgKG5ldykgewogCQlCVUdfT04obmV3LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7Ci0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ldywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQljbG9ja2V2ZW50c19zaHV0ZG93bihuZXcpOwogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9udHAuYyBiL2tlcm5lbC90aW1lL250cC5jCmluZGV4IDRjOGQ4NTQuLjljMTE0YjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL250cC5jCisrKyBiL2tlcm5lbC90aW1lL250cC5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAlpZiAoYWJzKG5vdy50dl9uc2VjIC0gKE5TRUNfUEVSX1NFQyAvIDIpKSA8PSB0aWNrX25zZWMgLyAyKQogCQlmYWlsID0gdXBkYXRlX3BlcnNpc3RlbnRfY2xvY2sobm93KTsKIAotCW5leHQudHZfbnNlYyA9IChOU0VDX1BFUl9TRUMgLyAyKSAtIG5vdy50dl9uc2VjOworCW5leHQudHZfbnNlYyA9IChOU0VDX1BFUl9TRUMgLyAyKSAtIG5vdy50dl9uc2VjIC0gKFRJQ0tfTlNFQyAvIDIpOwogCWlmIChuZXh0LnR2X25zZWMgPD0gMCkKIAkJbmV4dC50dl9uc2VjICs9IE5TRUNfUEVSX1NFQzsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKaW5kZXggMzE0NjNkMy4uY2IwMWNkOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYworKysgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCkBAIC0xNzUsNiArMTc1LDggQEAKICAqLwogc3RhdGljIHZvaWQgdGlja19oYW5kbGVfcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKIHsKKwlrdGltZV90IG5leHQ7CisKIAl0aWNrX2RvX3BlcmlvZGljX2Jyb2FkY2FzdCgpOwogCiAJLyoKQEAgLTE4NSwxMCArMTg3LDEzIEBACiAKIAkvKgogCSAqIFNldHVwIHRoZSBuZXh0IHBlcmlvZCBmb3IgZGV2aWNlcywgd2hpY2ggZG8gbm90IGhhdmUKLQkgKiBwZXJpb2RpYyBtb2RlOgorCSAqIHBlcmlvZGljIG1vZGUuIFdlIHJlYWQgZGV2LT5uZXh0X2V2ZW50IGZpcnN0IGFuZCBhZGQgdG8gaXQKKwkgKiB3aGVuIHRoZSBldmVudCBhbHJhZHkgZXhwaXJlZC4gY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudCgpCisJICogc2V0cyBkZXYtPm5leHRfZXZlbnQgb25seSB3aGVuIHRoZSBldmVudCBpcyByZWFsbHkKKwkgKiBwcm9ncmFtbWVkIHRvIHRoZSBkZXZpY2UuCiAJICovCi0JZm9yICg7OykgewotCQlrdGltZV90IG5leHQgPSBrdGltZV9hZGQoZGV2LT5uZXh0X2V2ZW50LCB0aWNrX3BlcmlvZCk7CisJZm9yIChuZXh0ID0gZGV2LT5uZXh0X2V2ZW50OyA7KSB7CisJCW5leHQgPSBrdGltZV9hZGQobmV4dCwgdGlja19wZXJpb2QpOwogCiAJCWlmICghY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIG5leHQsIGt0aW1lX2dldCgpKSkKIAkJCXJldHVybjsKQEAgLTIwNSw3ICsyMTAsNyBAQAogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjLCAqZGV2OwogCXN0cnVjdCB0aWNrX2RldmljZSAqdGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgKnJlYXNvbiA9IHdoeTsKLQlpbnQgY3B1OworCWludCBjcHUsIGJjX3N0b3BwZWQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogCkBAIC0yMjMsMTQgKzIyOCwxNiBAQAogCWlmICghdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChkZXYpKQogCQlnb3RvIG91dDsKIAorCWJjX3N0b3BwZWQgPSBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spOworCiAJc3dpdGNoICgqcmVhc29uKSB7CiAJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PTjoKIAljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0ZPUkNFOgogCQlpZiAoIWNwdV9pc3NldChjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spKSB7CiAJCQljcHVfc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzayk7Ci0JCQlpZiAodGQtPm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQotCQkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwKLQkJCQkJCSAgICAgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09CisJCQkgICAgVElDS0RFVl9NT0RFX1BFUklPRElDKQorCQkJCWNsb2NrZXZlbnRzX3NodXRkb3duKGRldik7CiAJCX0KIAkJaWYgKCpyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRk9SQ0UpCiAJCQl0aWNrX2Jyb2FkY2FzdF9mb3JjZSA9IDE7CkBAIC0yMzksMTUgKzI0NiwxNyBAQAogCQlpZiAoIXRpY2tfYnJvYWRjYXN0X2ZvcmNlICYmCiAJCSAgICBjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9tYXNrKSkgewogCQkJY3B1X2NsZWFyKGNwdSwgdGlja19icm9hZGNhc3RfbWFzayk7Ci0JCQlpZiAodGQtPm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQorCQkJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09CisJCQkgICAgVElDS0RFVl9NT0RFX1BFUklPRElDKQogCQkJCXRpY2tfc2V0dXBfcGVyaW9kaWMoZGV2LCAwKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQlpZiAoY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKLQkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKLQllbHNlIHsKKwlpZiAoY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkgeworCQlpZiAoIWJjX3N0b3BwZWQpCisJCQljbG9ja2V2ZW50c19zaHV0ZG93bihiYyk7CisJfSBlbHNlIGlmIChiY19zdG9wcGVkKSB7CiAJCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UubW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCiAJCQl0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyhiYyk7CiAJCWVsc2UKQEAgLTI5OCw3ICszMDcsNyBAQAogCiAJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykgewogCQlpZiAoYmMgJiYgY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKLQkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGJjLCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCQljbG9ja2V2ZW50c19zaHV0ZG93bihiYyk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwpAQCAtMzEzLDcgKzMyMiw3IEBACiAKIAliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CiAJaWYgKGJjKQotCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQljbG9ja2V2ZW50c19zaHV0ZG93bihiYyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CiB9CkBAIC0zNjQsMTYgKzM3Myw4IEBACiBzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3NldF9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7Ci0Ja3RpbWVfdCBub3cgPSBrdGltZV9nZXQoKTsKLQlpbnQgcmVzOwogCi0JZm9yKDs7KSB7Ci0JCXJlcyA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIG5vdyk7Ci0JCWlmICghcmVzIHx8ICFmb3JjZSkKLQkJCXJldHVybiByZXM7Ci0JCW5vdyA9IGt0aW1lX2dldCgpOwotCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGJjLT5taW5fZGVsdGFfbnMpKTsKLQl9CisJcmV0dXJuIHRpY2tfZGV2X3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIGZvcmNlKTsKIH0KIAogaW50IHRpY2tfcmVzdW1lX2Jyb2FkY2FzdF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQpAQCAtNDkxLDE0ICs0OTIsNTIgQEAKIAljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOwogfQogCitzdGF0aWMgdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0X25leHRfZXZlbnQoY3B1bWFza190ICptYXNrLCBrdGltZV90IGV4cGlyZXMpCit7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCAqbWFzaykgeworCQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwkJaWYgKHRkLT5ldnRkZXYpCisJCQl0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50ID0gZXhwaXJlczsKKwl9Cit9CisKIC8qKgogICogdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdCAtIHNldHVwIHRoZSBicm9hZGNhc3QgZGV2aWNlCiAgKi8KIHZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKIHsKLQliYy0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0OwotCWNsb2NrZXZlbnRzX3NldF9tb2RlKGJjLCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKLQliYy0+bmV4dF9ldmVudC50djY0ID0gS1RJTUVfTUFYOworCS8qIFNldCBpdCB1cCBvbmx5IG9uY2UgISAqLworCWlmIChiYy0+ZXZlbnRfaGFuZGxlciAhPSB0aWNrX2hhbmRsZV9vbmVzaG90X2Jyb2FkY2FzdCkgeworCQlpbnQgd2FzX3BlcmlvZGljID0gYmMtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM7CisJCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCWNwdW1hc2tfdCBtYXNrOworCisJCWJjLT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfb25lc2hvdF9icm9hZGNhc3Q7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGJjLCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKworCQkvKiBUYWtlIHRoZSBkb190aW1lciB1cGRhdGUgKi8KKwkJdGlja19kb190aW1lcl9jcHUgPSBjcHU7CisKKwkJLyoKKwkJICogV2UgbXVzdCBiZSBjYXJlZnVsIGhlcmUuIFRoZXJlIG1pZ2h0IGJlIG90aGVyIENQVXMKKwkJICogd2FpdGluZyBmb3IgcGVyaW9kaWMgYnJvYWRjYXN0LiBXZSBuZWVkIHRvIHNldCB0aGUKKwkJICogb25lc2hvdF9tYXNrIGJpdHMgZm9yIHRob3NlIGFuZCBwcm9ncmFtIHRoZQorCQkgKiBicm9hZGNhc3QgZGV2aWNlIHRvIGZpcmUuCisJCSAqLworCQltYXNrID0gdGlja19icm9hZGNhc3RfbWFzazsKKwkJY3B1X2NsZWFyKGNwdSwgbWFzayk7CisJCWNwdXNfb3IodGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrLAorCQkJdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrLCBtYXNrKTsKKworCQlpZiAod2FzX3BlcmlvZGljICYmICFjcHVzX2VtcHR5KG1hc2spKSB7CisJCQl0aWNrX2Jyb2FkY2FzdF9pbml0X25leHRfZXZlbnQoJm1hc2ssIHRpY2tfbmV4dF9wZXJpb2QpOworCQkJdGlja19icm9hZGNhc3Rfc2V0X2V2ZW50KHRpY2tfbmV4dF9wZXJpb2QsIDEpOworCQl9IGVsc2UKKwkJCWJjLT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisJfQogfQogCiAvKgpAQCAtNTM4LDQgKzU3NywxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKIH0KIAorLyoKKyAqIENoZWNrLCB3aGV0aGVyIHRoZSBicm9hZGNhc3QgZGV2aWNlIGlzIGluIG9uZSBzaG90IG1vZGUKKyAqLworaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9PTkVTSE9UOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMgYi9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jCmluZGV4IDgwYzQzMzYuLmRmMTI0MzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKKysrIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpAQCAtMzMsNyArMzMsNyBAQAogICovCiBrdGltZV90IHRpY2tfbmV4dF9wZXJpb2Q7CiBrdGltZV90IHRpY2tfcGVyaW9kOwotaW50IHRpY2tfZG9fdGltZXJfY3B1IF9fcmVhZF9tb3N0bHkgPSAtMTsKK2ludCB0aWNrX2RvX3RpbWVyX2NwdSBfX3JlYWRfbW9zdGx5ID0gVElDS19ET19USU1FUl9CT09UOwogREVGSU5FX1NQSU5MT0NLKHRpY2tfZGV2aWNlX2xvY2spOwogCiAvKgpAQCAtMTA5LDcgKzEwOSw4IEBACiAJaWYgKCF0aWNrX2RldmljZV9pc19mdW5jdGlvbmFsKGRldikpCiAJCXJldHVybjsKIAotCWlmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpIHsKKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQykgJiYKKwkgICAgIXRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKCkpIHsKIAkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBzZXE7CkBAIC0xNDgsNyArMTQ5LDcgQEAKIAkJICogSWYgbm8gY3B1IHRvb2sgdGhlIGRvX3RpbWVyIHVwZGF0ZSwgYXNzaWduIGl0IHRvCiAJCSAqIHRoaXMgY3B1OgogCQkgKi8KLQkJaWYgKHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSB7CisJCWlmICh0aWNrX2RvX3RpbWVyX2NwdSA9PSBUSUNLX0RPX1RJTUVSX0JPT1QpIHsKIAkJCXRpY2tfZG9fdGltZXJfY3B1ID0gY3B1OwogCQkJdGlja19uZXh0X3BlcmlvZCA9IGt0aW1lX2dldCgpOwogCQkJdGlja19wZXJpb2QgPSBrdGltZV9zZXQoMCwgTlNFQ19QRVJfU0VDIC8gSFopOwpAQCAtMTYxLDYgKzE2Miw3IEBACiAJfSBlbHNlIHsKIAkJaGFuZGxlciA9IHRkLT5ldnRkZXYtPmV2ZW50X2hhbmRsZXI7CiAJCW5leHRfZXZlbnQgPSB0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50OworCQl0ZC0+ZXZ0ZGV2LT5ldmVudF9oYW5kbGVyID0gY2xvY2tldmVudHNfaGFuZGxlX25vb3A7CiAJfQogCiAJdGQtPmV2dGRldiA9IG5ld2RldjsKQEAgLTI0OCw3ICsyNTAsNyBAQAogCSAqIG5vdCBnaXZlIGl0IGJhY2sgdG8gdGhlIGNsb2NrZXZlbnRzIGxheWVyICEKIAkgKi8KIAlpZiAodGlja19pc19icm9hZGNhc3RfZGV2aWNlKGN1cmRldikpIHsKLQkJY2xvY2tldmVudHNfc2V0X21vZGUoY3VyZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCWNsb2NrZXZlbnRzX3NodXRkb3duKGN1cmRldik7CiAJCWN1cmRldiA9IE5VTEw7CiAJfQogCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShjdXJkZXYsIG5ld2Rldik7CkBAIC0yOTksNyArMzAxLDggQEAKIAlpZiAoKmNwdXAgPT0gdGlja19kb190aW1lcl9jcHUpIHsKIAkJaW50IGNwdSA9IGZpcnN0X2NwdShjcHVfb25saW5lX21hcCk7CiAKLQkJdGlja19kb190aW1lcl9jcHUgPSAoY3B1ICE9IE5SX0NQVVMpID8gY3B1IDogLTE7CisJCXRpY2tfZG9fdGltZXJfY3B1ID0gKGNwdSAhPSBOUl9DUFVTKSA/IGNwdSA6CisJCQlUSUNLX0RPX1RJTUVSX05PTkU7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTMxMCw3ICszMTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGlja19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCWNsb2NrZXZlbnRzX3NldF9tb2RlKHRkLT5ldnRkZXYsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwljbG9ja2V2ZW50c19zaHV0ZG93bih0ZC0+ZXZ0ZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2RldmljZV9sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaCBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaAppbmRleCBmMTNmMmI3Li40NjkyNDg3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmgKKysrIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCkBAIC0xLDYgKzEsMTAgQEAKIC8qCiAgKiB0aWNrIGludGVybmFsIHZhcmlhYmxlIGFuZCBmdW5jdGlvbnMgdXNlZCBieSBsb3cvaGlnaCByZXMgY29kZQogICovCisKKyNkZWZpbmUgVElDS19ET19USU1FUl9OT05FCS0xCisjZGVmaW5lIFRJQ0tfRE9fVElNRVJfQk9PVAktMgorCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHRpY2tfZGV2aWNlLCB0aWNrX2NwdV9kZXZpY2UpOwogZXh0ZXJuIHNwaW5sb2NrX3QgdGlja19kZXZpY2VfbG9jazsKIGV4dGVybiBrdGltZV90IHRpY2tfbmV4dF9wZXJpb2Q7CkBAIC0xMCw2ICsxNCw4IEBACiBleHRlcm4gdm9pZCB0aWNrX3NldHVwX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCk7CiBleHRlcm4gdm9pZCB0aWNrX2hhbmRsZV9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwogCitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19zaHV0ZG93bihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworCiAvKgogICogTk9fSFogLyBoaWdoIHJlc29sdXRpb24gdGltZXIgc2hhcmVkIGNvZGUKICAqLwpAQCAtMTcsNiArMjMsOCBAQAogZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ld2RldiwKIAkJCSAgICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKIAkJCSAgICAgICBrdGltZV90IG5leHRldnQpOworZXh0ZXJuIGludCB0aWNrX2Rldl9wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkgIGt0aW1lX3QgZXhwaXJlcywgaW50IGZvcmNlKTsKIGV4dGVybiBpbnQgdGlja19wcm9ncmFtX2V2ZW50KGt0aW1lX3QgZXhwaXJlcywgaW50IGZvcmNlKTsKIGV4dGVybiB2b2lkIHRpY2tfb25lc2hvdF9ub3RpZnkodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfc3dpdGNoX3RvX29uZXNob3Qodm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKikpOwpAQCAtMjcsNiArMzUsNyBAQAogZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCk7CiBleHRlcm4gdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCk7CiBleHRlcm4gaW50IHRpY2tfcmVzdW1lX2Jyb2FkY2FzdF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKK2V4dGVybiBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9hY3RpdmUodm9pZCk7CiAjIGVsc2UgLyogQlJPQURDQVNUICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKIHsKQEAgLTM1LDYgKzQ0LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KICMgZW5kaWYgLyogIUJST0FEQ0FTVCAqLwogCiAjZWxzZSAvKiAhT05FU0hPVCAqLwpAQCAtNjQsNiArNzQsNyBAQAogewogCXJldHVybiAwOwogfQorc3RhdGljIGlubGluZSBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9hY3RpdmUodm9pZCkgeyByZXR1cm4gMDsgfQogI2VuZGlmIC8qICFUSUNLX09ORVNIT1QgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jIGIva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKaW5kZXggNDUwYzA0OS4uMmU4ZGU2NyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKKysrIGIva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKQEAgLTIzLDIxICsyMyw1MyBAQAogI2luY2x1ZGUgInRpY2staW50ZXJuYWwuaCIKIAogLyoqCisgKiB0aWNrX3Byb2dyYW1fZXZlbnQgaW50ZXJuYWwgd29ya2VyIGZ1bmN0aW9uCisgKi8KK2ludCB0aWNrX2Rldl9wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwga3RpbWVfdCBleHBpcmVzLAorCQkJICAgaW50IGZvcmNlKQoreworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOzspIHsKKwkJaW50IHJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBleHBpcmVzLCBub3cpOworCisJCWlmICghcmV0IHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXQ7CisKKwkJLyoKKwkJICogV2UgdHJpZWQgMiB0aW1lcyB0byBwcm9ncmFtIHRoZSBkZXZpY2Ugd2l0aCB0aGUgZ2l2ZW4KKwkJICogbWluX2RlbHRhX25zLiBJZiB0aGF0J3Mgbm90IHdvcmtpbmcgdGhlbiB3ZSBkb3VibGUgaXQKKwkJICogYW5kIGVtaXQgYSB3YXJuaW5nLgorCQkgKi8KKwkJaWYgKCsraSA+IDIpIHsKKwkJCS8qIEluY3JlYXNlIHRoZSBtaW4uIGRlbHRhIGFuZCB0cnkgYWdhaW4gKi8KKwkJCWlmICghZGV2LT5taW5fZGVsdGFfbnMpCisJCQkJZGV2LT5taW5fZGVsdGFfbnMgPSA1MDAwOworCQkJZWxzZQorCQkJCWRldi0+bWluX2RlbHRhX25zICs9IGRldi0+bWluX2RlbHRhX25zID4+IDE7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQ0U6ICVzIGluY3JlYXNpbmcgbWluX2RlbHRhX25zIHRvICVsdSBuc2VjXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSA/IGRldi0+bmFtZSA6ICI/IiwKKwkJCSAgICAgICBkZXYtPm1pbl9kZWx0YV9ucyA8PCAxKTsKKworCQkJaSA9IDA7CisJCX0KKworCQlub3cgPSBrdGltZV9nZXQoKTsKKwkJZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhub3csIGRldi0+bWluX2RlbHRhX25zKTsKKwl9Cit9CisKKy8qKgogICogdGlja19wcm9ncmFtX2V2ZW50CiAgKi8KIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpLmV2dGRldjsKLQlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOwogCi0Jd2hpbGUgKDEpIHsKLQkJaW50IHJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBleHBpcmVzLCBub3cpOwotCi0JCWlmICghcmV0IHx8ICFmb3JjZSkKLQkJCXJldHVybiByZXQ7Ci0JCW5vdyA9IGt0aW1lX2dldCgpOwotCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGRldi0+bWluX2RlbHRhX25zKSk7Ci0JfQorCXJldHVybiB0aWNrX2Rldl9wcm9ncmFtX2V2ZW50KGRldiwgZXhwaXJlcywgZm9yY2UpOwogfQogCiAvKioKQEAgLTYxLDcgKzkzLDcgQEAKIHsKIAluZXdkZXYtPmV2ZW50X2hhbmRsZXIgPSBoYW5kbGVyOwogCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ld2RldiwgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7Ci0JY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChuZXdkZXYsIG5leHRfZXZlbnQsIGt0aW1lX2dldCgpKTsKKwl0aWNrX2Rldl9wcm9ncmFtX2V2ZW50KG5ld2RldiwgbmV4dF9ldmVudCwgMSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IGIzM2JlNjEuLmE1NDdiZTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KIApAQCAtNzUsNiArNzYsOSBAQAogCQkJCQkJCSAgIGluY3IgKiB0aWNrcyk7CiAJCX0KIAkJZG9fdGltZXIoKyt0aWNrcyk7CisKKwkJLyogS2VlcCB0aGUgdGlja19uZXh0X3BlcmlvZCB2YXJpYWJsZSB1cCB0byBkYXRlICovCisJCXRpY2tfbmV4dF9wZXJpb2QgPSBrdGltZV9hZGQobGFzdF9qaWZmaWVzX3VwZGF0ZSwgdGlja19wZXJpb2QpOwogCX0KIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwogfQpAQCAtMTg3LDkgKzE5MSwxNyBAQAogewogCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpOwogCi0JKmxhc3RfdXBkYXRlX3RpbWUgPSBrdGltZV90b191cyh0cy0+aWRsZV9sYXN0dXBkYXRlKTsKKwlpZiAoIXRpY2tfbm9oel9lbmFibGVkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodHMtPmlkbGVfYWN0aXZlKQorCQkqbGFzdF91cGRhdGVfdGltZSA9IGt0aW1lX3RvX3VzKHRzLT5pZGxlX2xhc3R1cGRhdGUpOworCWVsc2UKKwkJKmxhc3RfdXBkYXRlX3RpbWUgPSBrdGltZV90b191cyhrdGltZV9nZXQoKSk7CisKIAlyZXR1cm4ga3RpbWVfdG9fdXModHMtPmlkbGVfc2xlZXB0aW1lKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9jcHVfaWRsZV90aW1lX3VzKTsKIAogLyoqCiAgKiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzawpAQCAtMjIxLDcgKzIzMyw3IEBACiAJICovCiAJaWYgKHVubGlrZWx5KCFjcHVfb25saW5lKGNwdSkpKSB7CiAJCWlmIChjcHUgPT0gdGlja19kb190aW1lcl9jcHUpCi0JCQl0aWNrX2RvX3RpbWVyX2NwdSA9IC0xOworCQkJdGlja19kb190aW1lcl9jcHUgPSBUSUNLX0RPX1RJTUVSX05PTkU7CiAJfQogCiAJaWYgKHVubGlrZWx5KHRzLT5ub2h6X21vZGUgPT0gTk9IWl9NT0RFX0lOQUNUSVZFKSkKQEAgLTI1OCw3ICsyNzAsNyBAQAogCW5leHRfamlmZmllcyA9IGdldF9uZXh0X3RpbWVyX2ludGVycnVwdChsYXN0X2ppZmZpZXMpOwogCWRlbHRhX2ppZmZpZXMgPSBuZXh0X2ppZmZpZXMgLSBsYXN0X2ppZmZpZXM7CiAKLQlpZiAocmN1X25lZWRzX2NwdShjcHUpKQorCWlmIChyY3VfbmVlZHNfY3B1KGNwdSkgfHwgcHJpbnRrX25lZWRzX2NwdShjcHUpKQogCQlkZWx0YV9qaWZmaWVzID0gMTsKIAkvKgogCSAqIERvIG5vdCBzdG9wIHRoZSB0aWNrLCBpZiB3ZSBhcmUgb25seSBvbmUgb2ZmCkBAIC0zMDMsNyArMzE1LDcgQEAKIAkJICogaW52b2tlZC4KIAkJICovCiAJCWlmIChjcHUgPT0gdGlja19kb190aW1lcl9jcHUpCi0JCQl0aWNrX2RvX3RpbWVyX2NwdSA9IC0xOworCQkJdGlja19kb190aW1lcl9jcHUgPSBUSUNLX0RPX1RJTUVSX05PTkU7CiAKIAkJdHMtPmlkbGVfc2xlZXBzKys7CiAKQEAgLTQ2OCw3ICs0ODAsNyBAQAogCSAqIHRoaXMgZHV0eSwgdGhlbiB0aGUgamlmZmllcyB1cGRhdGUgaXMgc3RpbGwgc2VyaWFsaXplZCBieQogCSAqIHh0aW1lX2xvY2suCiAJICovCi0JaWYgKHVubGlrZWx5KHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSkKKwlpZiAodW5saWtlbHkodGlja19kb190aW1lcl9jcHUgPT0gVElDS19ET19USU1FUl9OT05FKSkKIAkJdGlja19kb190aW1lcl9jcHUgPSBjcHU7CiAKIAkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KQEAgLTU3MCw3ICs1ODIsNyBAQAogCSAqIHRoaXMgZHV0eSwgdGhlbiB0aGUgamlmZmllcyB1cGRhdGUgaXMgc3RpbGwgc2VyaWFsaXplZCBieQogCSAqIHh0aW1lX2xvY2suCiAJICovCi0JaWYgKHVubGlrZWx5KHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSkKKwlpZiAodW5saWtlbHkodGlja19kb190aW1lcl9jcHUgPT0gVElDS19ET19USU1FUl9OT05FKSkKIAkJdGlja19kb190aW1lcl9jcHUgPSBjcHU7CiAjZW5kaWYKIApAQCAtNjIyLDcgKzYzNCw3IEBACiAJICovCiAJaHJ0aW1lcl9pbml0KCZ0cy0+c2NoZWRfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CiAJdHMtPnNjaGVkX3RpbWVyLmZ1bmN0aW9uID0gdGlja19zY2hlZF90aW1lcjsKLQl0cy0+c2NoZWRfdGltZXIuY2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJROworCXRzLT5zY2hlZF90aW1lci5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX1BFUkNQVTsKIAogCS8qIEdldCB0aGUgbmV4dCBwZXJpb2QgKHBlciBjcHUpICovCiAJaHJ0aW1lcl9zZXRfZXhwaXJlcygmdHMtPnNjaGVkX3RpbWVyLCB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCAwM2JjN2YxLi41MTBmZTY5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtOTc4LDYgKzk3OCw3IEBACiAJcnVuX2xvY2FsX3RpbWVycygpOwogCWlmIChyY3VfcGVuZGluZyhjcHUpKQogCQlyY3VfY2hlY2tfY2FsbGJhY2tzKGNwdSwgdXNlcl90aWNrKTsKKwlwcmludGtfdGljaygpOwogCXNjaGVkdWxlcl90aWNrKCk7CiAJcnVuX3Bvc2l4X2NwdV90aW1lcnMocCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYwppbmRleCBiYjk0OGU1Mi4uZGI1OGZiNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogCWhydGltZXJfaW5pdChocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCWhydGltZXItPmZ1bmN0aW9uID0gc3RhY2tfdHJhY2VfdGltZXJfZm47Ci0JaHJ0aW1lci0+Y2JfbW9kZSA9IEhSVElNRVJfQ0JfSVJRU0FGRV9OT19TT0ZUSVJROworCWhydGltZXItPmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfUEVSQ1BVOwogCiAJaHJ0aW1lcl9zdGFydChocnRpbWVyLCBuc190b19rdGltZShzYW1wbGVfcGVyaW9kKSwgSFJUSU1FUl9NT0RFX1JFTCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuYwppbmRleCA4NjVlY2Y1Ny4uMzlkNjE1OSAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYworKysgYi9rZXJuZWwvdXNlci5jCkBAIC0xNjksNyArMTY5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCB1c2VyX3N0cnVjdCwga29iaik7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHNjaGVkX2dyb3VwX3J0X3J1bnRpbWUodXAtPnRnKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBzY2hlZF9ncm91cF9ydF9ydW50aW1lKHVwLT50ZykpOwogfQogCiBzdGF0aWMgc3NpemVfdCBjcHVfcnRfcnVudGltZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTE4MCw3ICsxODAsNyBAQAogCXVuc2lnbmVkIGxvbmcgcnRfcnVudGltZTsKIAlpbnQgcmM7CiAKLQlzc2NhbmYoYnVmLCAiJWx1IiwgJnJ0X3J1bnRpbWUpOworCXNzY2FuZihidWYsICIlbGQiLCAmcnRfcnVudGltZSk7CiAKIAlyYyA9IHNjaGVkX2dyb3VwX3NldF9ydF9ydW50aW1lKHVwLT50ZywgcnRfcnVudGltZSk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKaW5kZXggNGFiOTY1OS4uM2IzNGIzNSAxMDA2NDQKLS0tIGEva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKKysrIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogLyogVGhlIGdlbmVyaWMgc3RyaW5nIHN0cmF0ZWd5IHJvdXRpbmU6ICovCi1zdGF0aWMgaW50IHN5c2N0bF91dHNfc3RyaW5nKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorc3RhdGljIGludCBzeXNjdGxfdXRzX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLAogCQkgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCSAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTY5LDggKzY5LDcgQEAKIAl3cml0ZSA9IG5ld3ZhbCAmJiBuZXdsZW47CiAJbWVtY3B5KCZ1dHNfdGFibGUsIHRhYmxlLCBzaXplb2YodXRzX3RhYmxlKSk7CiAJdXRzX3RhYmxlLmRhdGEgPSBnZXRfdXRzKHRhYmxlLCB3cml0ZSk7Ci0JciA9IHN5c2N0bF9zdHJpbmcoJnV0c190YWJsZSwgbmFtZSwgbmxlbiwKLQkJb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CisJciA9IHN5c2N0bF9zdHJpbmcoJnV0c190YWJsZSwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJcHV0X3V0cyh0YWJsZSwgd3JpdGUsIHV0c190YWJsZS5kYXRhKTsKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC93YWl0LmMgYi9rZXJuZWwvd2FpdC5jCmluZGV4IGMyNzVjNTYuLmNkODcxMzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YWl0LmMKKysrIGIva2VybmVsL3dhaXQuYwpAQCAtNzIsMTIgKzcyLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZ3YWl0LT50YXNrX2xpc3QpKQogCQlfX2FkZF93YWl0X3F1ZXVlKHEsIHdhaXQpOwotCS8qCi0JICogZG9uJ3QgYWx0ZXIgdGhlIHRhc2sgc3RhdGUgaWYgdGhpcyBpcyBqdXN0IGdvaW5nIHRvCi0JICogcXVldWUgYW4gYXN5bmMgd2FpdCBxdWV1ZSBjYWxsYmFjawotCSAqLwotCWlmIChpc19zeW5jX3dhaXQod2FpdCkpCi0JCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChwcmVwYXJlX3RvX3dhaXQpOwpAQCAtOTEsMTIgKzg2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZ3YWl0LT50YXNrX2xpc3QpKQogCQlfX2FkZF93YWl0X3F1ZXVlX3RhaWwocSwgd2FpdCk7Ci0JLyoKLQkgKiBkb24ndCBhbHRlciB0aGUgdGFzayBzdGF0ZSBpZiB0aGlzIGlzIGp1c3QgZ29pbmcgdG8KLSAJICogcXVldWUgYW4gYXN5bmMgd2FpdCBxdWV1ZSBjYWxsYmFjawotCSAqLwotCWlmIChpc19zeW5jX3dhaXQod2FpdCkpCi0JCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCA0MDQ4ZTkyLi43MTRhZmFkIDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC05LDcgKzksNyBAQAogICogRGVyaXZlZCBmcm9tIHRoZSB0YXNrcXVldWUva2V2ZW50ZCBjb2RlIGJ5OgogICoKICAqICAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgotICogICBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisgKiAgIEFuZHJldyBNb3J0b24KICAqICAgS2FpIFBldHprZSA8d3BwQG1hcmllLnBoeXNpay50dS1iZXJsaW4uZGU+CiAgKiAgIFRoZW9kb3JlIFRzJ28gPHR5dHNvQG1pdC5lZHU+CiAgKgpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcgYi9saWIvS2NvbmZpZwppbmRleCBjN2FkN2E1Li44NWNmN2VhIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZworKysgYi9saWIvS2NvbmZpZwpAQCAtOCwxMCArOCwxMCBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBHRU5FUklDX0ZJTkRfRklSU1RfQklUCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAogY29uZmlnIEdFTkVSSUNfRklORF9ORVhUX0JJVAotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBDUkNfQ0NJVFQKIAl0cmlzdGF0ZSAiQ1JDLUNDSVRUIGZ1bmN0aW9ucyIKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggMGI1MDQ4MS4uMzFkNzg0ZCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTQ5NSw2ICs0OTUsMTUgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFQlVHX1ZJUlRVQUwKKwlib29sICJEZWJ1ZyBWTSB0cmFuc2xhdGlvbnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgWDg2CisJaGVscAorCSAgRW5hYmxlIHNvbWUgY29zdGx5IHNhbml0eSBjaGVja3MgaW4gdmlydHVhbCB0byBwYWdlIGNvZGUuIFRoaXMgY2FuCisJICBjYXRjaCBtaXN0YWtlcyB3aXRoIHZpcnRfdG9fcGFnZSgpIGFuZCBmcmllbmRzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgREVCVUdfV1JJVEVDT1VOVAogCWJvb2wgIkRlYnVnIGZpbGVzeXN0ZW0gd3JpdGVycyBjb3VudCIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApAQCAtNTk3LDYgKzYwNiwxOSBAQAogCSAgU2F5IE4gaGVyZSBpZiB5b3Ugd2FudCB0aGUgUkNVIHRvcnR1cmUgdGVzdHMgdG8gc3RhcnQgb25seQogCSAgYWZ0ZXIgYmVpbmcgbWFudWFsbHkgZW5hYmxlZCB2aWEgL3Byb2MuCiAKK2NvbmZpZyBSQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SCisJYm9vbCAiQ2hlY2sgZm9yIHN0YWxsZWQgQ1BVcyBkZWxheWluZyBSQ1UgZ3JhY2UgcGVyaW9kcyIKKwlkZXBlbmRzIG9uIENMQVNTSUNfUkNVCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIFJDVSB0byBwcmludGsgaW5mb3JtYXRpb24gb24gd2hpY2gKKwkgIENQVXMgYXJlIGRlbGF5aW5nIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZCwgYnV0IG9ubHkgd2hlbgorCSAgdGhlIGdyYWNlIHBlcmlvZCBleHRlbmRzIGZvciBleGNlc3NpdmUgdGltZSBwZXJpb2RzLgorCisJICBTYXkgWSBpZiB5b3Ugd2FudCBSQ1UgdG8gcGVyZm9ybSBzdWNoIGNoZWNrcy4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKIGNvbmZpZyBLUFJPQkVTX1NBTklUWV9URVNUCiAJYm9vbCAiS3Byb2JlcyBzYW5pdHkgdGVzdHMiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTYyNCw2ICs2NDYsMjggQEAKIAogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKK2NvbmZpZyBERUJVR19CTE9DS19FWFRfREVWVAorICAgICAgICBib29sICJGb3JjZSBleHRlbmRlZCBibG9jayBkZXZpY2UgbnVtYmVycyBhbmQgc3ByZWFkIHRoZW0iCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZXBlbmRzIG9uIEJMT0NLCisJZGVmYXVsdCBuCisJaGVscAorCSAgQ29udmVudGlvbmFsbHksIGJsb2NrIGRldmljZSBudW1iZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbQorCSAgcHJlZGV0ZXJtaW5lZCBjb250aWd1b3VzIGFyZWEuICBIb3dldmVyLCBleHRlbmRlZCBibG9jayBhcmVhCisJICBtYXkgaW50cm9kdWNlIG5vbi1jb250aWd1b3VzIGJsb2NrIGRldmljZSBudW1iZXJzLiAgVGhpcworCSAgb3B0aW9uIGZvcmNlcyBtb3N0IGJsb2NrIGRldmljZSBudW1iZXJzIHRvIGJlIGFsbG9jYXRlZCBmcm9tCisJICB0aGUgZXh0ZW5kZWQgc3BhY2UgYW5kIHNwcmVhZHMgdGhlbSB0byBkaXNjb3ZlciBrZXJuZWwgb3IKKwkgIHVzZXJsYW5kIGNvZGUgcGF0aHMgd2hpY2ggYXNzdW1lIHByZWRldGVybWluZWQgY29udGlndW91cworCSAgZGV2aWNlIG51bWJlciBhbGxvY2F0aW9uLgorCisJICBOb3RlIHRoYXQgdHVybmluZyBvbiB0aGlzIGRlYnVnIG9wdGlvbiBzaHVmZmxlcyBhbGwgdGhlCisJICBkZXZpY2UgbnVtYmVycyBmb3IgYWxsIElERSBhbmQgU0NTSSBkZXZpY2VzIGluY2x1ZGluZyBsaWJhdGEKKwkgIG9uZXMsIHNvIHJvb3QgcGFydGl0aW9uIHNwZWNpZmllZCB1c2luZyBkZXZpY2UgbnVtYmVyCisJICBkaXJlY3RseSAodmlhIHJkZXYgb3Igcm9vdD1NQUo6TUlOKSB3b24ndCB3b3JrIGFueW1vcmUuCisJICBUZXh0dWFsIGRldmljZSBuYW1lcyAocm9vdD0vZGV2L3NkWG4pIHdpbGwgY29udGludWUgdG8gd29yay4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKIGNvbmZpZyBMS0RUTQogCXRyaXN0YXRlICJMaW51eCBLZXJuZWwgRHVtcCBUZXN0IFRvb2wgTW9kdWxlIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCkBAIC02NjEsMTAgKzcwNSwyMSBAQAogCiBjb25maWcgRkFJTF9NQUtFX1JFUVVFU1QKIAlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZGlzayBJTyIKLQlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTgorCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OICYmIEJMT0NLCiAJaGVscAogCSAgUHJvdmlkZSBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZGlzayBJTy4KIAorY29uZmlnIEZBSUxfSU9fVElNRU9VVAorCWJvb2wgIkZhdWwtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIGZha2luZyBkaXNrIGludGVycnVwdHMiCisJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04gJiYgQkxPQ0sKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IG9uIGVuZCBJTyBoYW5kbGluZy4gVGhpcworCSAgd2lsbCBtYWtlIHRoZSBibG9jayBsYXllciAiZm9yZ2V0IiBhbiBpbnRlcnJ1cHQgYXMgY29uZmlndXJlZCwKKwkgIHRodXMgZXhlcmNpc2luZyB0aGUgZXJyb3IgaGFuZGxpbmcuCisKKwkgIE9ubHkgd29ya3Mgd2l0aCBkcml2ZXJzIHRoYXQgdXNlIHRoZSBnZW5lcmljIHRpbWVvdXQgaGFuZGxpbmcsCisJICBmb3Igb3RoZXJzIGl0IHdvbnQgZG8gYW55dGhpbmcuCisKIGNvbmZpZyBGQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKIAlib29sICJEZWJ1Z2ZzIGVudHJpZXMgZm9yIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMiCiAJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04gJiYgU1lTRlMgJiYgREVCVUdfRlMKQEAgLTc1Miw2ICs4MDcsNjEgQEAKIAogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKK2NvbmZpZyBEWU5BTUlDX1BSSU5US19ERUJVRworCWJvb2wgIkVuYWJsZSBkeW5hbWljIHByaW50aygpIGNhbGwgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBSSU5USworCXNlbGVjdCBQUklOVEtfREVCVUcKKwloZWxwCisKKwkgIENvbXBpbGVzIGRlYnVnIGxldmVsIG1lc3NhZ2VzIGludG8gdGhlIGtlcm5lbCwgd2hpY2ggd291bGQgbm90CisJICBvdGhlcndpc2UgYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuIFRoZXNlIG1lc3NhZ2VzIGNhbiB0aGVuIGJlCisJICBlbmFibGVkL2Rpc2FibGVkIG9uIGEgcGVyIG1vZHVsZSBiYXNpcy4gVGhpcyBtZWNoYW5pc20gaW1wbGljaXRseQorCSAgZW5hYmxlcyBhbGwgcHJfZGVidWcoKSBhbmQgZGV2X2RiZygpIGNhbGxzLiBUaGUgaW1wYWN0IG9mIHRoaXMKKwkgIGNvbXBpbGUgb3B0aW9uIGlzIGEgbGFyZ2VyIGtlcm5lbCB0ZXh0IHNpemUgb2YgYWJvdXQgMiUuCisKKwkgIFVzYWdlOgorCisJICBEeW5hbWljIGRlYnVnZ2luZyBpcyBjb250cm9sbGVkIGJ5IHRoZSBkZWJ1Z2ZzIGZpbGUsCisJICBkeW5hbWljX3ByaW50ay9tb2R1bGVzLiBUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBtb2R1bGVzIHRoYXQKKwkgIGNhbiBiZSBlbmFibGVkLiBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHRoZSBtb2R1bGUgbmFtZSwgZm9sbG93ZWQKKwkgIGJ5IGEgc2V0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIGVuYWJsZWQuIFRoZSBmaXJzdCBmbGFnIGlzIGFsd2F5cyB0aGUKKwkgICdlbmFibGVkJyBmbGFnLiBGb3IgZXhhbXBsZToKKworCQk8bW9kdWxlX25hbWU+IDxlbmFibGVkPTAvMT4KKwkJCQkuCisJCQkJLgorCQkJCS4KKworCSAgPG1vZHVsZV9uYW1lPiA6IE5hbWUgb2YgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZGVidWcgY2FsbCByZXNpZGVzCisJICA8ZW5hYmxlZD0wLzE+IDogd2hldGhlciB0aGUgbWVzc2FnZXMgYXJlIGVuYWJsZWQgb3Igbm90CisKKwkgIEZyb20gYSBsaXZlIHN5c3RlbToKKworCQlzbmRfaGRhX2ludGVsIGVuYWJsZWQ9MAorCQlmaXh1cCBlbmFibGVkPTAKKwkJZHJpdmVyIGVuYWJsZWQ9MAorCisJICBFbmFibGUgYSBtb2R1bGU6CisKKwkgIAkkZWNobyAic2V0IGVuYWJsZWQ9MSA8bW9kdWxlX25hbWU+IiA+IGR5bmFtaWNfcHJpbnRrL21vZHVsZXMKKworCSAgRGlzYWJsZSBhIG1vZHVsZToKKworCSAgCSRlY2hvICJzZXQgZW5hYmxlZD0wIDxtb2R1bGVfbmFtZT4iID4gZHluYW1pY19wcmludGsvbW9kdWxlcworCisJICBFbmFibGUgYWxsIG1vZHVsZXM6CisKKwkJJGVjaG8gInNldCBlbmFibGVkPTEgYWxsIiA+IGR5bmFtaWNfcHJpbnRrL21vZHVsZXMKKworCSAgRGlzYWJsZSBhbGwgbW9kdWxlczoKKworCQkkZWNobyAic2V0IGVuYWJsZWQ9MCBhbGwiID4gZHluYW1pY19wcmludGsvbW9kdWxlcworCisJICBGaW5hbGx5LCBwYXNzaW5nICJkeW5hbWljX3ByaW50ayIgYXQgdGhlIGNvbW1hbmQgbGluZSBlbmFibGVzCisJICBkZWJ1Z2dpbmcgZm9yIGFsbCBtb2R1bGVzLiBUaGlzIG1vZGUgY2FuIGJlIHR1cm5lZCBvZmYgdmlhIHRoZSBhYm92ZQorCSAgZGlzYWJsZSBjb21tYW5kLgorCiBzb3VyY2UgInNhbXBsZXMvS2NvbmZpZyIKIAogc291cmNlICJsaWIvS2NvbmZpZy5rZ2RiIgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IDNiMWY5NGIuLjE2ZmVhYWIgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTE5LDcgKzE5LDggQEAKIGxpYi15CSs9IGtvYmplY3QubyBrcmVmLm8ga2xpc3QubwogCiBvYmoteSArPSBiY2QubyBkaXY2NC5vIHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vIFwKLQkgYnVzdF9zcGlubG9ja3MubyBoZXhkdW1wLm8ga2FzcHJpbnRmLm8gYml0bWFwLm8gc2NhdHRlcmxpc3QubworCSBidXN0X3NwaW5sb2Nrcy5vIGhleGR1bXAubyBrYXNwcmludGYubyBiaXRtYXAubyBzY2F0dGVybGlzdC5vIFwKKwkgc3RyaW5nX2hlbHBlcnMubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19LT0JKRUNUKSx5KQogQ0ZMQUdTX2tvYmplY3QubyArPSAtRERFQlVHCkBAIC04MCw2ICs4MSw4IEBACiAKIG9iai0kKENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LKSArPSBzeXNjYWxsLm8KIAorb2JqLSQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKSArPSBkeW5hbWljX3ByaW50ay5vCisKIGhvc3Rwcm9ncy15CTo9IGdlbl9jcmMzMnRhYmxlCiBjbGVhbi1maWxlcwk6PSBjcmMzMnRhYmxlLmgKIApkaWZmIC0tZ2l0IGEvbGliL2NtZGxpbmUuYyBiL2xpYi9jbWRsaW5lLmMKaW5kZXggNWJhOGE5NC4uZjVmM2FkOCAxMDA2NDQKLS0tIGEvbGliL2NtZGxpbmUuYworKysgYi9saWIvY21kbGluZS5jCkBAIC0xMjYsNyArMTI2LDcgQEAKICAqCW1lZ2FieXRlLCBvciBvbmUgZ2lnYWJ5dGUsIHJlc3BlY3RpdmVseS4KICAqLwogCi11bnNpZ25lZCBsb25nIGxvbmcgbWVtcGFyc2UoY2hhciAqcHRyLCBjaGFyICoqcmV0cHRyKQordW5zaWduZWQgbG9uZyBsb25nIG1lbXBhcnNlKGNvbnN0IGNoYXIgKnB0ciwgY2hhciAqKnJldHB0cikKIHsKIAljaGFyICplbmRwdHI7CS8qIGxvY2FsIHBvaW50ZXIgdG8gZW5kIG9mIHBhcnNlZCBzdHJpbmcgKi8KIApkaWZmIC0tZ2l0IGEvbGliL2R5bmFtaWNfcHJpbnRrLmMgYi9saWIvZHluYW1pY19wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQwZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2R5bmFtaWNfcHJpbnRrLmMKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBsaWIvZHluYW1pY19wcmludGsuYworICoKKyAqIG1ha2UgcHJfZGVidWcoKS9kZXZfZGJnKCkgY2FsbHMgcnVudGltZSBjb25maWd1cmFibGUgYmFzZWQgdXBvbiB0aGVpcgorICogdGhlaXIgc291cmNlIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiwgSmFzb24gQmFyb24gPGpiYXJvbkByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworZXh0ZXJuIHN0cnVjdCBtb2RfZGVidWcgX19zdGFydF9fX3ZlcmJvc2VbXTsKK2V4dGVybiBzdHJ1Y3QgbW9kX2RlYnVnIF9fc3RvcF9fX3ZlcmJvc2VbXTsKKworc3RydWN0IGRlYnVnX25hbWUgeworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0MjsKKwlpbnQgaGFzaDE7CisJaW50IGhhc2gyOworCWNoYXIgKm5hbWU7CisJaW50IGVuYWJsZTsKKwlpbnQgdHlwZTsKK307CisKK3N0YXRpYyBpbnQgbnJfZW50cmllczsKK3N0YXRpYyBpbnQgbnVtX2VuYWJsZWQ7CitpbnQgZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX05PTkU7CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgbW9kdWxlX3RhYmxlW0RFQlVHX0hBU0hfVEFCTEVfU0laRV0gPQorCXsgWzAgLi4uIERFQlVHX0hBU0hfVEFCTEVfU0laRS0xXSA9IEhMSVNUX0hFQURfSU5JVCB9Oworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIG1vZHVsZV90YWJsZTJbREVCVUdfSEFTSF9UQUJMRV9TSVpFXSA9CisJeyBbMCAuLi4gREVCVUdfSEFTSF9UQUJMRV9TSVpFLTFdID0gSExJU1RfSEVBRF9JTklUIH07CitzdGF0aWMgREVDTEFSRV9NVVRFWChkZWJ1Z19saXN0X211dGV4KTsKKworLyogZHluYW1pY19wcmludGtfZW5hYmxlZCwgYW5kIGR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyIGFyZSBiaXRtYXNrcyBpbiB3aGljaAorICogYml0IG4gaXMgc2V0IHRvIDEgaWYgYW55IG1vZG5hbWUgaGFzaGVzIGludG8gdGhlIGJ1Y2tldCBuLCAwIG90aGVyd2lzZS4gVGhleQorICogdXNlIGluZGVwZW5kZW50IGhhc2ggZnVuY3Rpb25zLCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBmYWxzZSBwb3NpdGl2ZXMuCisgKi8KK2xvbmcgbG9uZyBkeW5hbWljX3ByaW50a19lbmFibGVkOworRVhQT1JUX1NZTUJPTF9HUEwoZHluYW1pY19wcmludGtfZW5hYmxlZCk7Citsb25nIGxvbmcgZHluYW1pY19wcmludGtfZW5hYmxlZDI7CitFWFBPUlRfU1lNQk9MX0dQTChkeW5hbWljX3ByaW50a19lbmFibGVkMik7CisKKy8qIHJldHVybnMgdGhlIGRlYnVnIG1vZHVsZSBwb2ludGVyLiAqLworc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpmaW5kX2RlYnVnX21vZHVsZShjaGFyICptb2R1bGVfbmFtZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZGVidWdfbmFtZSAqZWxlbWVudDsKKworCWVsZW1lbnQgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBERUJVR19IQVNIX1RBQkxFX1NJWkU7IGkrKykgeworCQloZWFkID0gJm1vZHVsZV90YWJsZVtpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW1lbnQsIG5vZGUsIGhlYWQsIGhsaXN0KQorCQkJaWYgKCFzdHJjbXAoZWxlbWVudC0+bmFtZSwgbW9kdWxlX25hbWUpKQorCQkJCXJldHVybiBlbGVtZW50OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmV0dXJucyB0aGUgZGVidWcgbW9kdWxlIHBvaW50ZXIuICovCitzdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKmZpbmRfZGVidWdfbW9kdWxlX2hhc2goY2hhciAqbW9kdWxlX25hbWUsIGludCBoYXNoKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBkZWJ1Z19uYW1lICplbGVtZW50OworCisJZWxlbWVudCA9IE5VTEw7CisJaGVhZCA9ICZtb2R1bGVfdGFibGVbaGFzaF07CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW1lbnQsIG5vZGUsIGhlYWQsIGhsaXN0KQorCQlpZiAoIXN0cmNtcChlbGVtZW50LT5uYW1lLCBtb2R1bGVfbmFtZSkpCisJCQlyZXR1cm4gZWxlbWVudDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBtdXRleCovCitzdGF0aWMgaW50IF9fYWRkX2RlYnVnX21vZHVsZShjaGFyICptb2RfbmFtZSwgaW50IGhhc2gsIGludCBoYXNoMikKK3sKKwlzdHJ1Y3QgZGVidWdfbmFtZSAqbmV3OworCWNoYXIgKm1vZHVsZV9uYW1lOworCWludCByZXQgPSAwOworCisJaWYgKGZpbmRfZGVidWdfbW9kdWxlKG1vZF9uYW1lKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJbW9kdWxlX25hbWUgPSBrbWFsbG9jKHN0cmxlbihtb2RfbmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1vZHVsZV9uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwltb2R1bGVfbmFtZSA9IHN0cmNweShtb2R1bGVfbmFtZSwgbW9kX25hbWUpOworCW1vZHVsZV9uYW1lW3N0cmxlbihtb2RfbmFtZSldID0gJ1wwJzsKKwluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGVidWdfbmFtZSksIEdGUF9LRVJORUwpOworCWlmICghbmV3KSB7CisJCWtmcmVlKG1vZHVsZV9uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCUlOSVRfSExJU1RfTk9ERSgmbmV3LT5obGlzdCk7CisJSU5JVF9ITElTVF9OT0RFKCZuZXctPmhsaXN0Mik7CisJbmV3LT5uYW1lID0gbW9kdWxlX25hbWU7CisJbmV3LT5oYXNoMSA9IGhhc2g7CisJbmV3LT5oYXNoMiA9IGhhc2gyOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmbmV3LT5obGlzdCwgJm1vZHVsZV90YWJsZVtoYXNoXSk7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZXctPmhsaXN0MiwgJm1vZHVsZV90YWJsZTJbaGFzaDJdKTsKKwlucl9lbnRyaWVzKys7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IHVucmVnaXN0ZXJfZHluYW1pY19kZWJ1Z19tb2R1bGUoY2hhciAqbW9kX25hbWUpCit7CisJc3RydWN0IGRlYnVnX25hbWUgKmVsZW1lbnQ7CisJaW50IHJldCA9IDA7CisKKwlkb3duKCZkZWJ1Z19saXN0X211dGV4KTsKKwllbGVtZW50ID0gZmluZF9kZWJ1Z19tb2R1bGUobW9kX25hbWUpOworCWlmICghZWxlbWVudCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaGxpc3RfZGVsX3JjdSgmZWxlbWVudC0+aGxpc3QpOworCWhsaXN0X2RlbF9yY3UoJmVsZW1lbnQtPmhsaXN0Mik7CisJc3luY2hyb25pemVfcmN1KCk7CisJa2ZyZWUoZWxlbWVudC0+bmFtZSk7CisJaWYgKGVsZW1lbnQtPmVuYWJsZSkKKwkJbnVtX2VuYWJsZWQtLTsKKwlrZnJlZShlbGVtZW50KTsKKwlucl9lbnRyaWVzLS07CitvdXQ6CisJdXAoJmRlYnVnX2xpc3RfbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9keW5hbWljX2RlYnVnX21vZHVsZSk7CisKK2ludCByZWdpc3Rlcl9keW5hbWljX2RlYnVnX21vZHVsZShjaGFyICptb2RfbmFtZSwgaW50IHR5cGUsIGNoYXIgKnNoYXJlX25hbWUsCisJCQkJCWNoYXIgKmZsYWdzLCBpbnQgaGFzaCwgaW50IGhhc2gyKQoreworCXN0cnVjdCBkZWJ1Z19uYW1lICplbGVtOworCWludCByZXQgPSAwOworCisJZG93bigmZGVidWdfbGlzdF9tdXRleCk7CisJZWxlbSA9IGZpbmRfZGVidWdfbW9kdWxlKG1vZF9uYW1lKTsKKwlpZiAoIWVsZW0pIHsKKwkJaWYgKF9fYWRkX2RlYnVnX21vZHVsZShtb2RfbmFtZSwgaGFzaCwgaGFzaDIpKQorCQkJZ290byBvdXQ7CisJCWVsZW0gPSBmaW5kX2RlYnVnX21vZHVsZShtb2RfbmFtZSk7CisJCWlmIChkeW5hbWljX2VuYWJsZWQgPT0gRFlOQU1JQ19FTkFCTEVEX0FMTCAmJgorCQkJCSFzdHJjbXAobW9kX25hbWUsIHNoYXJlX25hbWUpKSB7CisJCQllbGVtLT5lbmFibGUgPSB0cnVlOworCQkJbnVtX2VuYWJsZWQrKzsKKwkJfQorCX0KKwllbGVtLT50eXBlIHw9IHR5cGU7CitvdXQ6CisJdXAoJmRlYnVnX2xpc3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9keW5hbWljX2RlYnVnX21vZHVsZSk7CisKK2ludCBfX2R5bmFtaWNfZGJnX2VuYWJsZWRfaGVscGVyKGNoYXIgKm1vZF9uYW1lLCBpbnQgdHlwZSwgaW50IHZhbHVlLCBpbnQgaGFzaCkKK3sKKwlzdHJ1Y3QgZGVidWdfbmFtZSAqZWxlbTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkeW5hbWljX2VuYWJsZWQgPT0gRFlOQU1JQ19FTkFCTEVEX0FMTCkKKwkJcmV0dXJuIDE7CisJcmN1X3JlYWRfbG9jaygpOworCWVsZW0gPSBmaW5kX2RlYnVnX21vZHVsZV9oYXNoKG1vZF9uYW1lLCBoYXNoKTsKKwlpZiAoZWxlbSAmJiBlbGVtLT5lbmFibGUpCisJCXJldCA9IDE7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZHluYW1pY19kYmdfZW5hYmxlZF9oZWxwZXIpOworCitzdGF0aWMgdm9pZCBzZXRfYWxsKGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBkZWJ1Z19uYW1lICplOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWludCBpOworCWxvbmcgbG9uZyBlbmFibGVfbWFzazsKKworCWZvciAoaSA9IDA7IGkgPCBERUJVR19IQVNIX1RBQkxFX1NJWkU7IGkrKykgeworCQlpZiAobW9kdWxlX3RhYmxlW2ldLmZpcnN0ICE9IE5VTEwpIHsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIG5vZGUsICZtb2R1bGVfdGFibGVbaV0sIGhsaXN0KSB7CisJCQkJZS0+ZW5hYmxlID0gZW5hYmxlOworCQkJfQorCQl9CisJfQorCWlmIChlbmFibGUpCisJCWVuYWJsZV9tYXNrID0gVUxMT05HX01BWDsKKwllbHNlCisJCWVuYWJsZV9tYXNrID0gMDsKKwlkeW5hbWljX3ByaW50a19lbmFibGVkID0gZW5hYmxlX21hc2s7CisJZHluYW1pY19wcmludGtfZW5hYmxlZDIgPSBlbmFibGVfbWFzazsKK30KKworc3RhdGljIGludCBkaXNhYmxlZF9oYXNoKGludCBpLCBib29sIGZpcnN0X3RhYmxlKQoreworCXN0cnVjdCBkZWJ1Z19uYW1lICplOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJaWYgKGZpcnN0X3RhYmxlKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsIG5vZGUsICZtb2R1bGVfdGFibGVbaV0sIGhsaXN0KSB7CisJCQlpZiAoZS0+ZW5hYmxlKQorCQkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZSwgbm9kZSwgJm1vZHVsZV90YWJsZTJbaV0sIGhsaXN0MikgeworCQkJaWYgKGUtPmVuYWJsZSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3QgcHJfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGxlbmd0aCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZmZlciwgKnMsICp2YWx1ZV9zdHIsICpzZXR0aW5nX3N0cjsKKwlpbnQgZXJyLCB2YWx1ZTsKKwlzdHJ1Y3QgZGVidWdfbmFtZSAqZWxlbSA9IE5VTEw7CisJaW50IGFsbCA9IDA7CisKKwlpZiAobGVuZ3RoID4gUEFHRV9TSVpFIHx8IGxlbmd0aCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmZmVyID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBidWYsIGxlbmd0aCkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAobGVuZ3RoIDwgUEFHRV9TSVpFKQorCQlidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisJZWxzZSBpZiAoYnVmZmVyW1BBR0VfU0laRS0xXSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWRvd24oJmRlYnVnX2xpc3RfbXV0ZXgpOworCisJaWYgKHN0cm5jbXAoInNldCIsIGJ1ZmZlciwgMykpCisJCWdvdG8gb3V0X3VwOworCXMgPSBidWZmZXIgKyAzOworCXNldHRpbmdfc3RyID0gc3Ryc2VwKCZzLCAiPSIpOworCWlmIChzID09IE5VTEwpCisJCWdvdG8gb3V0X3VwOworCXNldHRpbmdfc3RyID0gc3Ryc3RyaXAoc2V0dGluZ19zdHIpOworCXZhbHVlX3N0ciA9IHN0cnNlcCgmcywgIiAiKTsKKwlpZiAocyA9PSBOVUxMKQorCQlnb3RvIG91dF91cDsKKwlzID0gc3Ryc3RyaXAocyk7CisJaWYgKCFzdHJuY21wKHMsICJhbGwiLCAzKSkKKwkJYWxsID0gMTsKKwllbHNlCisJCWVsZW0gPSBmaW5kX2RlYnVnX21vZHVsZShzKTsKKwlpZiAoIXN0cm5jbXAoc2V0dGluZ19zdHIsICJlbmFibGUiLCA2KSkgeworCQl2YWx1ZSA9ICEhc2ltcGxlX3N0cnRvbCh2YWx1ZV9zdHIsIE5VTEwsIDEwKTsKKwkJaWYgKGFsbCkgeworCQkJaWYgKHZhbHVlKSB7CisJCQkJc2V0X2FsbCh0cnVlKTsKKwkJCQludW1fZW5hYmxlZCA9IG5yX2VudHJpZXM7CisJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX0FMTDsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2FsbChmYWxzZSk7CisJCQkJbnVtX2VuYWJsZWQgPSAwOworCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9OT05FOworCQkJfQorCQkJZXJyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChlbGVtKSB7CisJCQkJaWYgKHZhbHVlICYmIChlbGVtLT5lbmFibGUgPT0gMCkpIHsKKwkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCB8PQorCQkJCQkJCSgxTEwgPDwgZWxlbS0+aGFzaDEpOworCQkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkMiB8PQorCQkJCQkJCSgxTEwgPDwgZWxlbS0+aGFzaDIpOworCQkJCQllbGVtLT5lbmFibGUgPSAxOworCQkJCQludW1fZW5hYmxlZCsrOworCQkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfU09NRTsKKwkJCQkJZXJyID0gMDsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICJkZWJ1Z2dpbmcgZW5hYmxlZCBmb3IgbW9kdWxlICVzIiwKKwkJCQkJICAgICAgIGVsZW0tPm5hbWUpOworCQkJCX0gZWxzZSBpZiAoIXZhbHVlICYmIChlbGVtLT5lbmFibGUgPT0gMSkpIHsKKwkJCQkJZWxlbS0+ZW5hYmxlID0gMDsKKwkJCQkJbnVtX2VuYWJsZWQtLTsKKwkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDEsIHRydWUpKQorCQkJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZCAmPQorCQkJCQkJCX4oMUxMIDw8IGVsZW0tPmhhc2gxKTsKKwkJCQkJaWYgKGRpc2FibGVkX2hhc2goZWxlbS0+aGFzaDIsIGZhbHNlKSkKKwkJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyICY9CisJCQkJCQkJfigxTEwgPDwgZWxlbS0+aGFzaDIpOworCQkJCQlpZiAobnVtX2VuYWJsZWQpCisJCQkJCQlkeW5hbWljX2VuYWJsZWQgPQorCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9TT01FOworCQkJCQllbHNlCisJCQkJCQlkeW5hbWljX2VuYWJsZWQgPQorCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9OT05FOworCQkJCQllcnIgPSAwOworCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgImRlYnVnZ2luZyBkaXNhYmxlZCBmb3IgbW9kdWxlICIKKwkJCQkJICAgICAgICIlcyIsIGVsZW0tPm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoIWVycikKKwkJZXJyID0gbGVuZ3RoOworb3V0X3VwOgorCXVwKCZkZWJ1Z19saXN0X211dGV4KTsKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCAqcHJfZGVidWdfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZiwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICgqcG9zIDwgREVCVUdfSEFTSF9UQUJMRV9TSVpFKSA/IHBvcyA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpwcl9kZWJ1Z19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSgqcG9zKSsrOworCWlmICgqcG9zID49IERFQlVHX0hBU0hfVEFCTEVfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHZvaWQgcHJfZGVidWdfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIGludCBwcl9kZWJ1Z19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGRlYnVnX25hbWUgKmVsZW07CisJdW5zaWduZWQgaW50IGkgPSAqKGxvZmZfdCAqKSB2OworCisJcmN1X3JlYWRfbG9jaygpOworCWhlYWQgPSAmbW9kdWxlX3RhYmxlW2ldOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBub2RlLCBoZWFkLCBobGlzdCkgeworCQlzZXFfcHJpbnRmKHMsICIlcyBlbmFibGVkPSVkIiwgZWxlbS0+bmFtZSwgZWxlbS0+ZW5hYmxlKTsKKwkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJfZGVidWdfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBwcl9kZWJ1Z19zZXFfc3RhcnQsCisJLm5leHQgID0gcHJfZGVidWdfc2VxX25leHQsCisJLnN0b3AgID0gcHJfZGVidWdfc2VxX3N0b3AsCisJLnNob3cgID0gcHJfZGVidWdfc2VxX3Nob3cKK307CisKK3N0YXRpYyBpbnQgcHJfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlscCwgJnByX2RlYnVnX3NlcV9vcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcl9kZWJ1Z19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHByX2RlYnVnX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByX2RlYnVnX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkeW5hbWljX3ByaW50a19pbml0KHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqZGlyLCAqZmlsZTsKKwlzdHJ1Y3QgbW9kX2RlYnVnICppdGVyOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImR5bmFtaWNfcHJpbnRrIiwgTlVMTCk7CisJaWYgKCFkaXIpCisJCXJldHVybiAtRU5PTUVNOworCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtb2R1bGVzIiwgMDY0NCwgZGlyLCBOVUxMLAorCQkJCQkmcHJfZGVidWdfb3BlcmF0aW9ucyk7CisJaWYgKCFmaWxlKSB7CisJCWRlYnVnZnNfcmVtb3ZlKGRpcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKHZhbHVlID0gKHVuc2lnbmVkIGxvbmcpX19zdGFydF9fX3ZlcmJvc2U7CisJCXZhbHVlIDwgKHVuc2lnbmVkIGxvbmcpX19zdG9wX19fdmVyYm9zZTsKKwkJdmFsdWUgKz0gc2l6ZW9mKHN0cnVjdCBtb2RfZGVidWcpKSB7CisJCQlpdGVyID0gKHN0cnVjdCBtb2RfZGVidWcgKil2YWx1ZTsKKwkJCXJlZ2lzdGVyX2R5bmFtaWNfZGVidWdfbW9kdWxlKGl0ZXItPm1vZG5hbWUsCisJCQkJaXRlci0+dHlwZSwKKwkJCQlpdGVyLT5sb2dpY2FsX21vZG5hbWUsCisJCQkJaXRlci0+ZmxhZ19uYW1lcywgaXRlci0+aGFzaCwgaXRlci0+aGFzaDIpOworCX0KKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGR5bmFtaWNfcHJpbnRrX2luaXQpOworLyogbWF5IHdhbnQgdG8gbW92ZSB0aGlzIGVhcmxpZXIgc28gd2UgY2FuIGdldCB0cmFjZXMgYXMgZWFybHkgYXMgcG9zc2libGUgKi8KKworc3RhdGljIGludCBfX2luaXQgZHluYW1pY19wcmludGtfc2V0dXAoY2hhciAqc3RyKQoreworCWlmIChzdHIpCisJCXJldHVybiAtRU5PRU5UOworCXNldF9hbGwodHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisvKiBVc2UgZWFybHlfcGFyYW0oKSwgc28gd2UgY2FuIGdldCBkZWJ1ZyBvdXRwdXQgYXMgZWFybHkgYXMgcG9zc2libGUgKi8KK2Vhcmx5X3BhcmFtKCJkeW5hbWljX3ByaW50ayIsIGR5bmFtaWNfcHJpbnRrX3NldHVwKTsKZGlmZiAtLWdpdCBhL2xpYi9pb21tdS1oZWxwZXIuYyBiL2xpYi9pb21tdS1oZWxwZXIuYwppbmRleCBhM2I4ZDRjLi43NWRiZGEwIDEwMDY0NAotLS0gYS9saWIvaW9tbXUtaGVscGVyLmMKKysrIGIvbGliL2lvbW11LWhlbHBlci5jCkBAIC0zMCw4ICszMCw3IEBACiAJcmV0dXJuIGluZGV4OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdF9hcmVhKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgbG9uZyBpLAotCQkJCWludCBsZW4pCit2b2lkIGlvbW11X2FyZWFfcmVzZXJ2ZSh1bnNpZ25lZCBsb25nICptYXAsIHVuc2lnbmVkIGxvbmcgaSwgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IGkgKyBsZW47CiAJd2hpbGUgKGkgPCBlbmQpIHsKQEAgLTY0LDcgKzYzLDcgQEAKIAkJCXN0YXJ0ID0gaW5kZXggKyAxOwogCQkJZ290byBhZ2FpbjsKIAkJfQotCQlzZXRfYml0X2FyZWEobWFwLCBpbmRleCwgbnIpOworCQlpb21tdV9hcmVhX3Jlc2VydmUobWFwLCBpbmRleCwgbnIpOwogCX0KIAlyZXR1cm4gaW5kZXg7CiB9CkBAIC04MCwzICs3OSwxMiBAQAogCX0KIH0KIEVYUE9SVF9TWU1CT0woaW9tbXVfYXJlYV9mcmVlKTsKKwordW5zaWduZWQgbG9uZyBpb21tdV9udW1fcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW9fcGFnZV9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IChhZGRyICYgKGlvX3BhZ2Vfc2l6ZSAtIDEpKSArIGxlbjsKKworCXJldHVybiBESVZfUk9VTkRfVVAoc2l6ZSwgaW9fcGFnZV9zaXplKTsKK30KK0VYUE9SVF9TWU1CT0woaW9tbXVfbnVtX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL2xpYi9rbGlzdC5jIGIvbGliL2tsaXN0LmMKaW5kZXggY2NhMzdmOS4uYmJkZDMwMSAxMDA2NDQKLS0tIGEvbGliL2tsaXN0LmMKKysrIGIvbGliL2tsaXN0LmMKQEAgLTM3LDYgKzM3LDM3IEBACiAjaW5jbHVkZSA8bGludXgva2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorLyoKKyAqIFVzZSB0aGUgbG93ZXN0IGJpdCBvZiBuX2tsaXN0IHRvIG1hcmsgZGVsZXRlZCBub2RlcyBhbmQgZXhjbHVkZQorICogZGVhZCBvbmVzIGZyb20gaXRlcmF0aW9uLgorICovCisjZGVmaW5lIEtOT0RFX0RFQUQJCTFMVQorI2RlZmluZSBLTk9ERV9LTElTVF9NQVNLCX5LTk9ERV9ERUFECisKK3N0YXRpYyBzdHJ1Y3Qga2xpc3QgKmtub2RlX2tsaXN0KHN0cnVjdCBrbGlzdF9ub2RlICprbm9kZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBrbGlzdCAqKQorCQkoKHVuc2lnbmVkIGxvbmcpa25vZGUtPm5fa2xpc3QgJiBLTk9ERV9LTElTVF9NQVNLKTsKK30KKworc3RhdGljIGJvb2wga25vZGVfZGVhZChzdHJ1Y3Qga2xpc3Rfbm9kZSAqa25vZGUpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWtub2RlLT5uX2tsaXN0ICYgS05PREVfREVBRDsKK30KKworc3RhdGljIHZvaWQga25vZGVfc2V0X2tsaXN0KHN0cnVjdCBrbGlzdF9ub2RlICprbm9kZSwgc3RydWN0IGtsaXN0ICprbGlzdCkKK3sKKwlrbm9kZS0+bl9rbGlzdCA9IGtsaXN0OworCS8qIG5vIGtub2RlIGRlc2VydmVzIHRvIHN0YXJ0IGl0cyBsaWZlIGRlYWQgKi8KKwlXQVJOX09OKGtub2RlX2RlYWQoa25vZGUpKTsKK30KKworc3RhdGljIHZvaWQga25vZGVfa2lsbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqa25vZGUpCit7CisJLyogYW5kIG5vIGtub2RlIHNob3VsZCBkaWUgdHdpY2UgZXZlciBlaXRoZXIsIHNlZSB3ZSdyZSB2ZXJ5IGh1bWFuZSAqLworCVdBUk5fT04oa25vZGVfZGVhZChrbm9kZSkpOworCSoodW5zaWduZWQgbG9uZyAqKSZrbm9kZS0+bl9rbGlzdCB8PSBLTk9ERV9ERUFEOworfQogCiAvKioKICAqIGtsaXN0X2luaXQgLSBJbml0aWFsaXplIGEga2xpc3Qgc3RydWN0dXJlLgpAQCAtNzksNyArMTEwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbi0+bl9ub2RlKTsKIAlpbml0X2NvbXBsZXRpb24oJm4tPm5fcmVtb3ZlZCk7CiAJa3JlZl9pbml0KCZuLT5uX3JlZik7Ci0Jbi0+bl9rbGlzdCA9IGs7CisJa25vZGVfc2V0X2tsaXN0KG4sIGspOwogCWlmIChrLT5nZXQpCiAJCWstPmdldChuKTsKIH0KQEAgLTExNSw3ICsxNDYsNyBAQAogICovCiB2b2lkIGtsaXN0X2FkZF9hZnRlcihzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiwgc3RydWN0IGtsaXN0X25vZGUgKnBvcykKIHsKLQlzdHJ1Y3Qga2xpc3QgKmsgPSBwb3MtPm5fa2xpc3Q7CisJc3RydWN0IGtsaXN0ICprID0ga25vZGVfa2xpc3QocG9zKTsKIAogCWtsaXN0X25vZGVfaW5pdChrLCBuKTsKIAlzcGluX2xvY2soJmstPmtfbG9jayk7CkBAIC0xMzEsNyArMTYyLDcgQEAKICAqLwogdm9pZCBrbGlzdF9hZGRfYmVmb3JlKHN0cnVjdCBrbGlzdF9ub2RlICpuLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqcG9zKQogewotCXN0cnVjdCBrbGlzdCAqayA9IHBvcy0+bl9rbGlzdDsKKwlzdHJ1Y3Qga2xpc3QgKmsgPSBrbm9kZV9rbGlzdChwb3MpOwogCiAJa2xpc3Rfbm9kZV9pbml0KGssIG4pOwogCXNwaW5fbG9jaygmay0+a19sb2NrKTsKQEAgLTE0NCw5ICsxNzUsMTAgQEAKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9yZWYpOwogCisJV0FSTl9PTigha25vZGVfZGVhZChuKSk7CiAJbGlzdF9kZWwoJm4tPm5fbm9kZSk7CiAJY29tcGxldGUoJm4tPm5fcmVtb3ZlZCk7Ci0Jbi0+bl9rbGlzdCA9IE5VTEw7CisJa25vZGVfc2V0X2tsaXN0KG4sIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGtsaXN0X2RlY19hbmRfZGVsKHN0cnVjdCBrbGlzdF9ub2RlICpuKQpAQCAtMTU0LDIxICsxODYsMjggQEAKIAlyZXR1cm4ga3JlZl9wdXQoJm4tPm5fcmVmLCBrbGlzdF9yZWxlYXNlKTsKIH0KIAorc3RhdGljIHZvaWQga2xpc3RfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuLCBib29sIGtpbGwpCit7CisJc3RydWN0IGtsaXN0ICprID0ga25vZGVfa2xpc3Qobik7CisJdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikgPSBrLT5wdXQ7CisKKwlzcGluX2xvY2soJmstPmtfbG9jayk7CisJaWYgKGtpbGwpCisJCWtub2RlX2tpbGwobik7CisJaWYgKCFrbGlzdF9kZWNfYW5kX2RlbChuKSkKKwkJcHV0ID0gTlVMTDsKKwlzcGluX3VubG9jaygmay0+a19sb2NrKTsKKwlpZiAocHV0KQorCQlwdXQobik7Cit9CisKIC8qKgogICoga2xpc3RfZGVsIC0gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2Ygbm9kZSBhbmQgdHJ5IHRvIHJlbW92ZS4KICAqIEBuOiBub2RlIHdlJ3JlIGRlbGV0aW5nLgogICovCiB2b2lkIGtsaXN0X2RlbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3Qga2xpc3QgKmsgPSBuLT5uX2tsaXN0OwotCXZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopID0gay0+cHV0OwotCi0Jc3Bpbl9sb2NrKCZrLT5rX2xvY2spOwotCWlmICgha2xpc3RfZGVjX2FuZF9kZWwobikpCi0JCXB1dCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmstPmtfbG9jayk7Ci0JaWYgKHB1dCkKLQkJcHV0KG4pOworCWtsaXN0X3B1dChuLCB0cnVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X2RlbCk7CiAKQEAgLTIwNiw3ICsyNDUsNiBAQAogCQkJICBzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKIAlpLT5pX2tsaXN0ID0gazsKLQlpLT5pX2hlYWQgPSAmay0+a19saXN0OwogCWktPmlfY3VyID0gbjsKIAlpZiAobikKIAkJa3JlZl9nZXQoJm4tPm5fcmVmKTsKQEAgLTIzNyw3ICsyNzUsNyBAQAogdm9pZCBrbGlzdF9pdGVyX2V4aXQoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCiB7CiAJaWYgKGktPmlfY3VyKSB7Ci0JCWtsaXN0X2RlbChpLT5pX2N1cik7CisJCWtsaXN0X3B1dChpLT5pX2N1ciwgZmFsc2UpOwogCQlpLT5pX2N1ciA9IE5VTEw7CiAJfQogfQpAQCAtMjU4LDI3ICsyOTYsMzMgQEAKICAqLwogc3RydWN0IGtsaXN0X25vZGUgKmtsaXN0X25leHQoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKLQlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbG5vZGUgPSBpLT5pX2N1cjsKLQlzdHJ1Y3Qga2xpc3Rfbm9kZSAqa25vZGUgPSBOVUxMOwogCXZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopID0gaS0+aV9rbGlzdC0+cHV0OworCXN0cnVjdCBrbGlzdF9ub2RlICpsYXN0ID0gaS0+aV9jdXI7CisJc3RydWN0IGtsaXN0X25vZGUgKm5leHQ7CiAKIAlzcGluX2xvY2soJmktPmlfa2xpc3QtPmtfbG9jayk7Ci0JaWYgKGxub2RlKSB7Ci0JCW5leHQgPSBsbm9kZS0+bl9ub2RlLm5leHQ7Ci0JCWlmICgha2xpc3RfZGVjX2FuZF9kZWwobG5vZGUpKQorCisJaWYgKGxhc3QpIHsKKwkJbmV4dCA9IHRvX2tsaXN0X25vZGUobGFzdC0+bl9ub2RlLm5leHQpOworCQlpZiAoIWtsaXN0X2RlY19hbmRfZGVsKGxhc3QpKQogCQkJcHV0ID0gTlVMTDsKIAl9IGVsc2UKLQkJbmV4dCA9IGktPmlfaGVhZC0+bmV4dDsKKwkJbmV4dCA9IHRvX2tsaXN0X25vZGUoaS0+aV9rbGlzdC0+a19saXN0Lm5leHQpOwogCi0JaWYgKG5leHQgIT0gaS0+aV9oZWFkKSB7Ci0JCWtub2RlID0gdG9fa2xpc3Rfbm9kZShuZXh0KTsKLQkJa3JlZl9nZXQoJmtub2RlLT5uX3JlZik7CisJaS0+aV9jdXIgPSBOVUxMOworCXdoaWxlIChuZXh0ICE9IHRvX2tsaXN0X25vZGUoJmktPmlfa2xpc3QtPmtfbGlzdCkpIHsKKwkJaWYgKGxpa2VseSgha25vZGVfZGVhZChuZXh0KSkpIHsKKwkJCWtyZWZfZ2V0KCZuZXh0LT5uX3JlZik7CisJCQlpLT5pX2N1ciA9IG5leHQ7CisJCQlicmVhazsKKwkJfQorCQluZXh0ID0gdG9fa2xpc3Rfbm9kZShuZXh0LT5uX25vZGUubmV4dCk7CiAJfQotCWktPmlfY3VyID0ga25vZGU7CisKIAlzcGluX3VubG9jaygmaS0+aV9rbGlzdC0+a19sb2NrKTsKLQlpZiAocHV0ICYmIGxub2RlKQotCQlwdXQobG5vZGUpOwotCXJldHVybiBrbm9kZTsKKworCWlmIChwdXQgJiYgbGFzdCkKKwkJcHV0KGxhc3QpOworCXJldHVybiBpLT5pX2N1cjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X25leHQpOwpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggZmJmMGFlMi4uMDQ4N2QxZiAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC0zODcsMTEgKzM4NywxNyBAQAogICoga29iamVjdF9yZW5hbWUgLSBjaGFuZ2UgdGhlIG5hbWUgb2YgYW4gb2JqZWN0CiAgKiBAa29iajogb2JqZWN0IGluIHF1ZXN0aW9uLgogICogQG5ld19uYW1lOiBvYmplY3QncyBuZXcgbmFtZQorICoKKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgbXV0dWFsCisgKiBleGNsdXNpb24gYmV0d2VlbiB0d28gZGlmZmVyZW50IGNhbGxzIG9mIGtvYmplY3RfcmVuYW1lCisgKiBvbiB0aGUgc2FtZSBrb2JqZWN0IGFuZCB0byBlbnN1cmUgdGhhdCBuZXdfbmFtZSBpcyB2YWxpZCBhbmQKKyAqIHdvbid0IGNvbmZsaWN0IHdpdGggb3RoZXIga29iamVjdHMuCiAgKi8KIGludCBrb2JqZWN0X3JlbmFtZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUpCiB7CiAJaW50IGVycm9yID0gMDsKIAljb25zdCBjaGFyICpkZXZwYXRoID0gTlVMTDsKKwljb25zdCBjaGFyICpkdXBfbmFtZSA9IE5VTEwsICpuYW1lOwogCWNoYXIgKmRldnBhdGhfc3RyaW5nID0gTlVMTDsKIAljaGFyICplbnZwWzJdOwogCkBAIC00MDEsMTkgKzQwNyw2IEBACiAJaWYgKCFrb2JqLT5wYXJlbnQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogc2VlIGlmIHRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSAqLwotCWlmIChrb2JqLT5rc2V0KSB7Ci0JCXN0cnVjdCBrb2JqZWN0ICp0ZW1wX2tvYmo7Ci0JCXRlbXBfa29iaiA9IGtzZXRfZmluZF9vYmooa29iai0+a3NldCwgbmV3X25hbWUpOwotCQlpZiAodGVtcF9rb2JqKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJrb2JqZWN0ICclcycgY2Fubm90IGJlIHJlbmFtZWQgIgotCQkJICAgICAgICJ0byAnJXMnIGFzICclcycgaXMgYWxyZWFkeSBpbiBleGlzdGVuY2UuXG4iLAotCQkJICAgICAgIGtvYmplY3RfbmFtZShrb2JqKSwgbmV3X25hbWUsIG5ld19uYW1lKTsKLQkJCWtvYmplY3RfcHV0KHRlbXBfa29iaik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQogCWRldnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKGtvYmosIEdGUF9LRVJORUwpOwogCWlmICghZGV2cGF0aCkgewogCQllcnJvciA9IC1FTk9NRU07CkBAIC00MjgsMTUgKzQyMSwyNyBAQAogCWVudnBbMF0gPSBkZXZwYXRoX3N0cmluZzsKIAllbnZwWzFdID0gTlVMTDsKIAorCW5hbWUgPSBkdXBfbmFtZSA9IGtzdHJkdXAobmV3X25hbWUsIEdGUF9LRVJORUwpOworCWlmICghbmFtZSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwogCWVycm9yID0gc3lzZnNfcmVuYW1lX2Rpcihrb2JqLCBuZXdfbmFtZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIEluc3RhbGwgdGhlIG5ldyBrb2JqZWN0IG5hbWUgKi8KKwlkdXBfbmFtZSA9IGtvYmotPm5hbWU7CisJa29iai0+bmFtZSA9IG5hbWU7CiAKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3RseS9vbmx5IHVzZWQgZm9yIG5ldHdvcmsgaW50ZXJmYWNlLgogCSAqIFNvbWUgaG90cGx1ZyBwYWNrYWdlIHRyYWNrIGludGVyZmFjZXMgYnkgdGhlaXIgbmFtZSBhbmQKIAkgKiB0aGVyZWZvcmUgd2FudCB0byBrbm93IHdoZW4gdGhlIG5hbWUgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4gKi8KLQlpZiAoIWVycm9yKQotCQlrb2JqZWN0X3VldmVudF9lbnYoa29iaiwgS09CSl9NT1ZFLCBlbnZwKTsKKwlrb2JqZWN0X3VldmVudF9lbnYoa29iaiwgS09CSl9NT1ZFLCBlbnZwKTsKIAogb3V0OgorCWtmcmVlKGR1cF9uYW1lKTsKIAlrZnJlZShkZXZwYXRoX3N0cmluZyk7CiAJa2ZyZWUoZGV2cGF0aCk7CiAJa29iamVjdF9wdXQoa29iaik7CmRpZmYgLS1naXQgYS9saWIvcGFyc2VyLmMgYi9saWIvcGFyc2VyLmMKaW5kZXggNGYwY2JjMC4uYjAwZDAyMCAxMDA2NDQKLS0tIGEvbGliL3BhcnNlci5jCisrKyBiL2xpYi9wYXJzZXIuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgKiBmb3JtYXQgaWRlbnRpZmllcnMgd2hpY2ggd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBtYXRjaGluZyB0aGUKICAqIHRva2VucywgYW5kIHdob3NlIGxvY2F0aW9ucyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBAYXJncyBhcnJheS4KICAqLwotaW50IG1hdGNoX3Rva2VuKGNoYXIgKnMsIG1hdGNoX3RhYmxlX3QgdGFibGUsIHN1YnN0cmluZ190IGFyZ3NbXSkKK2ludCBtYXRjaF90b2tlbihjaGFyICpzLCBjb25zdCBtYXRjaF90YWJsZV90IHRhYmxlLCBzdWJzdHJpbmdfdCBhcmdzW10pCiB7CiAJY29uc3Qgc3RydWN0IG1hdGNoX3Rva2VuICpwOwogCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCmluZGV4IDRhOGJhNGIuLmE4NjYzODkgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfY291bnRlci5jCisrKyBiL2xpYi9wZXJjcHVfY291bnRlci5jCkBAIC01Miw3ICs1Miw3IEBACiAgKiBBZGQgdXAgYWxsIHRoZSBwZXItY3B1IGNvdW50cywgcmV0dXJuIHRoZSByZXN1bHQuICBUaGlzIGlzIGEgbW9yZSBhY2N1cmF0ZQogICogYnV0IG11Y2ggc2xvd2VyIHZlcnNpb24gb2YgcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgpCiAgKi8KLXM2NCBfX3BlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgaW50IHNldCkKK3M2NCBfX3BlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKIHsKIAlzNjQgcmV0OwogCWludCBjcHU7CkBAIC02MiwxMSArNjIsOSBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXMzMiAqcGNvdW50ID0gcGVyX2NwdV9wdHIoZmJjLT5jb3VudGVycywgY3B1KTsKIAkJcmV0ICs9ICpwY291bnQ7Ci0JCWlmIChzZXQpCi0JCQkqcGNvdW50ID0gMDsKKwkJKnBjb3VudCA9IDA7CiAJfQotCWlmIChzZXQpCi0JCWZiYy0+Y291bnQgPSByZXQ7CisJZmJjLT5jb3VudCA9IHJldDsKIAogCXNwaW5fdW5sb2NrKCZmYmMtPmxvY2spOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9saWIvc2NhdHRlcmxpc3QuYyBiL2xpYi9zY2F0dGVybGlzdC5jCmluZGV4IDg3NmJhNmQuLjhkMjY4OGYgMTAwNjQ0Ci0tLSBhL2xpYi9zY2F0dGVybGlzdC5jCisrKyBiL2xpYi9zY2F0dGVybGlzdC5jCkBAIC00MjIsOSArNDIyLDEyIEBACiB7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CiAJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzZ2wsIG5lbnRzLCBTR19NSVRFUl9BVE9NSUMpOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCiAJd2hpbGUgKHNnX21pdGVyX25leHQoJm1pdGVyKSAmJiBvZmZzZXQgPCBidWZsZW4pIHsKIAkJdW5zaWduZWQgaW50IGxlbjsKIApAQCAtNDQyLDYgKzQ0NSw3IEBACiAKIAlzZ19taXRlcl9zdG9wKCZtaXRlcik7CiAKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIG9mZnNldDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL3N0cmluZ19oZWxwZXJzLmMgYi9saWIvc3RyaW5nX2hlbHBlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N0cmluZ19oZWxwZXJzLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEhlbHBlcnMgZm9yIGZvcm1hdHRpbmcgYW5kIHByaW50aW5nIHN0cmluZ3MKKyAqCisgKiBDb3B5cmlnaHQgMzEgQXVndXN0IDIwMDggSmFtZXMgQm90dG9tbGV5CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorCisvKioKKyAqIHN0cmluZ19nZXRfc2l6ZSAtIGdldCB0aGUgc2l6ZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXRzCisgKiBAc2l6ZToJVGhlIHNpemUgdG8gYmUgY29udmVydGVkCisgKiBAdW5pdHM6CXVuaXRzIHRvIHVzZSAocG93ZXJzIG9mIDEwMDAgb3IgMTAyNCkKKyAqIEBidWY6CWJ1ZmZlciB0byBmb3JtYXQgdG8KKyAqIEBsZW46CWxlbmd0aCBvZiBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgZm9ybWF0dGVkIHRvIDMgc2lnbmlmaWNhbnQgZmlndXJlcworICogZ2l2aW5nIHRoZSBzaXplIGluIHRoZSByZXF1aXJlZCB1bml0cy4gIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yCisgKiBlcnJvciBvbiBmYWlsdXJlLiAgQGJ1ZiBpcyBhbHdheXMgemVybyB0ZXJtaW5hdGVkLgorICoKKyAqLworaW50IHN0cmluZ19nZXRfc2l6ZSh1NjQgc2l6ZSwgY29uc3QgZW51bSBzdHJpbmdfc2l6ZV91bml0cyB1bml0cywKKwkJICAgIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICp1bml0c18xMFtdID0geyAiQiIsICJLQiIsICJNQiIsICJHQiIsICJUQiIsICJQQiIsCisJCQkJICAgIkVCIiwgIlpCIiwgIllCIiwgTlVMTH07CisJY29uc3QgY2hhciAqdW5pdHNfMltdID0geyJCIiwgIktpQiIsICJNaUIiLCAiR2lCIiwgIlRpQiIsICJQaUIiLAorCQkJCSAiRWlCIiwgIlppQiIsICJZaUIiLCBOVUxMIH07CisJY29uc3QgY2hhciAqKnVuaXRzX3N0cltdID0geworCQlbU1RSSU5HX1VOSVRTXzEwXSA9ICB1bml0c18xMCwKKwkJW1NUUklOR19VTklUU18yXSA9IHVuaXRzXzIsCisJfTsKKwljb25zdCBpbnQgZGl2aXNvcltdID0geworCQlbU1RSSU5HX1VOSVRTXzEwXSA9IDEwMDAsCisJCVtTVFJJTkdfVU5JVFNfMl0gPSAxMDI0LAorCX07CisJaW50IGksIGo7CisJdTY0IHJlbWFpbmRlciA9IDAsIHNmX2NhcDsKKwljaGFyIHRtcFs4XTsKKworCXRtcFswXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBzaXplID4gZGl2aXNvclt1bml0c10gJiYgdW5pdHNfc3RyW3VuaXRzXVtpXTsgaSsrKQorCQlyZW1haW5kZXIgPSBkb19kaXYoc2l6ZSwgZGl2aXNvclt1bml0c10pOworCisJc2ZfY2FwID0gc2l6ZTsKKwlmb3IgKGogPSAwOyBzZl9jYXAqMTAgPCAxMDAwOyBqKyspCisJCXNmX2NhcCAqPSAxMDsKKworCWlmIChqKSB7CisJCXJlbWFpbmRlciAqPSAxMDAwOworCQlkb19kaXYocmVtYWluZGVyLCBkaXZpc29yW3VuaXRzXSk7CisJCXNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIuJTAzbGxkIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlbWFpbmRlcik7CisJCXRtcFtqKzFdID0gJ1wwJzsKKwl9CisKKwlzbnByaW50ZihidWYsIGxlbiwgIiVsbGQlcyVzIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplLAorCQkgdG1wLCB1bml0c19zdHJbdW5pdHNdW2ldKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzdHJpbmdfZ2V0X3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliL3N3aW90bGIuYyBiL2xpYi9zd2lvdGxiLmMKaW5kZXggOTc3ZWRiZC4uZjhlZWJkNDggMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtMjc0LDEzICsyNzQsMTQgQEAKIH0KIAogc3RhdGljIGludAotYWRkcmVzc19uZWVkc19tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGFkZHIpCithZGRyZXNzX25lZWRzX21hcHBpbmcoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCiB7Ci0JZG1hX2FkZHJfdCBtYXNrID0gMHhmZmZmZmZmZjsKLQkvKiBJZiB0aGUgZGV2aWNlIGhhcyBhIG1hc2ssIHVzZSBpdCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gMzIgYml0cyAqLwotCWlmIChod2RldiAmJiBod2Rldi0+ZG1hX21hc2spCi0JCW1hc2sgPSAqaHdkZXYtPmRtYV9tYXNrOwotCXJldHVybiAoYWRkciAmIH5tYXNrKSAhPSAwOworCXJldHVybiAhaXNfYnVmZmVyX2RtYV9jYXBhYmxlKGRtYV9nZXRfbWFzayhod2RldiksIGFkZHIsIHNpemUpOworfQorCitzdGF0aWMgaW50IGlzX3N3aW90bGJfYnVmZmVyKGNoYXIgKmFkZHIpCit7CisJcmV0dXJuIGFkZHIgPj0gaW9fdGxiX3N0YXJ0ICYmIGFkZHIgPCBpb190bGJfZW5kOwogfQogCiAvKgpAQCAtNDY3LDE1ICs0NjgsOCBAQAogCXZvaWQgKnJldDsKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAKLQkvKgotCSAqIFhYWCBmaXggbWU6IHRoZSBETUEgQVBJIHNob3VsZCBwYXNzIHVzIGFuIGV4cGxpY2l0IERNQSBtYXNrCi0JICogaW5zdGVhZCwgb3IgdXNlIFpPTkVfRE1BMzIgKGlhNjQgb3ZlcmxvYWRzIFpPTkVfRE1BIHRvIGJlIGEgfjMyCi0JICogYml0IHJhbmdlIGluc3RlYWQgb2YgYSAxNk1CIG9uZSkuCi0JICovCi0JZmxhZ3MgfD0gR0ZQX0RNQTsKLQogCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwotCWlmIChyZXQgJiYgYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCB2aXJ0X3RvX2J1cyhyZXQpKSkgeworCWlmIChyZXQgJiYgYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCB2aXJ0X3RvX2J1cyhyZXQpLCBzaXplKSkgewogCQkvKgogCQkgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpc24ndCByZWFjaGFibGUgYnkgdGhlIGRldmljZS4KIAkJICogRmFsbCBiYWNrIG9uIHN3aW90bGJfbWFwX3NpbmdsZSgpLgpAQCAtNDkwLDE5ICs0ODQsMTYgQEAKIAkJICogc3dpb3RsYl9tYXBfc2luZ2xlKCksIHdoaWNoIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbQogCQkgKiB0aGUgbG93ZXN0IGF2YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgogCQkgKi8KLQkJZG1hX2FkZHJfdCBoYW5kbGU7Ci0JCWhhbmRsZSA9IHN3aW90bGJfbWFwX3NpbmdsZShOVUxMLCBOVUxMLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAoc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcihod2RldiwgaGFuZGxlKSkKKwkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgTlVMTCwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKCFyZXQpCiAJCQlyZXR1cm4gTlVMTDsKLQotCQlyZXQgPSBidXNfdG9fdmlydChoYW5kbGUpOwogCX0KIAogCW1lbXNldChyZXQsIDAsIHNpemUpOwogCWRldl9hZGRyID0gdmlydF90b19idXMocmV0KTsKIAogCS8qIENvbmZpcm0gYWRkcmVzcyBjYW4gYmUgRE1BJ2QgYnkgZGV2aWNlICovCi0JaWYgKGFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIpKSB7CisJaWYgKGFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIsIHNpemUpKSB7CiAJCXByaW50aygiaHdkZXYgRE1BIG1hc2sgPSAweCUwMTZMeCwgZGV2X2FkZHIgPSAweCUwMTZMeFxuIiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKmh3ZGV2LT5kbWFfbWFzaywKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2X2FkZHIpOwpAQCAtNTE4LDEyICs1MDksMTEgQEAKIAkJICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewogCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKLQlpZiAoISh2YWRkciA+PSAodm9pZCAqKWlvX3RsYl9zdGFydAotICAgICAgICAgICAgICAgICAgICAmJiB2YWRkciA8ICh2b2lkICopaW9fdGxiX2VuZCkpCisJaWYgKCFpc19zd2lvdGxiX2J1ZmZlcih2YWRkcikpCiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwogCWVsc2UKIAkJLyogRE1BX1RPX0RFVklDRSB0byBhdm9pZCBtZW1jcHkgaW4gdW5tYXBfc2luZ2xlICovCi0JCXN3aW90bGJfdW5tYXBfc2luZ2xlIChod2RldiwgZG1hX2hhbmRsZSwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCXVubWFwX3NpbmdsZShod2RldiwgdmFkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTY3LDcgKzU1Nyw3IEBACiAJICogd2UgY2FuIHNhZmVseSByZXR1cm4gdGhlIGRldmljZSBhZGRyIGFuZCBub3Qgd29ycnkgYWJvdXQgYm91bmNlCiAJICogYnVmZmVyaW5nIGl0LgogCSAqLwotCWlmICghYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZfYWRkcikgJiYgIXN3aW90bGJfZm9yY2UpCisJaWYgKCFhZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGRldl9hZGRyLCBzaXplKSAmJiAhc3dpb3RsYl9mb3JjZSkKIAkJcmV0dXJuIGRldl9hZGRyOwogCiAJLyoKQEAgLTU4NCw3ICs1NzQsNyBAQAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgaXMgRE1BJ2JsZQogCSAqLwotCWlmIChhZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGRldl9hZGRyKSkKKwlpZiAoYWRkcmVzc19uZWVkc19tYXBwaW5nKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSkpCiAJCXBhbmljKCJtYXBfc2luZ2xlOiBib3VuY2UgYnVmZmVyIGlzIG5vdCBETUEnYmxlIik7CiAKIAlyZXR1cm4gZGV2X2FkZHI7CkBAIC02MTIsNyArNjAyLDcgQEAKIAljaGFyICpkbWFfYWRkciA9IGJ1c190b192aXJ0KGRldl9hZGRyKTsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChkbWFfYWRkciA+PSBpb190bGJfc3RhcnQgJiYgZG1hX2FkZHIgPCBpb190bGJfZW5kKQorCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCiAJCXVubWFwX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7CiAJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKIAkJZG1hX21hcmtfY2xlYW4oZG1hX2FkZHIsIHNpemUpOwpAQCAtNjQyLDcgKzYzMiw3IEBACiAJY2hhciAqZG1hX2FkZHIgPSBidXNfdG9fdmlydChkZXZfYWRkcik7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKLQlpZiAoZG1hX2FkZHIgPj0gaW9fdGxiX3N0YXJ0ICYmIGRtYV9hZGRyIDwgaW9fdGxiX2VuZCkKKwlpZiAoaXNfc3dpb3RsYl9idWZmZXIoZG1hX2FkZHIpKQogCQlzeW5jX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpciwgdGFyZ2V0KTsKIAllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQogCQlkbWFfbWFya19jbGVhbihkbWFfYWRkciwgc2l6ZSk7CkBAIC02NzMsNyArNjYzLDcgQEAKIAljaGFyICpkbWFfYWRkciA9IGJ1c190b192aXJ0KGRldl9hZGRyKSArIG9mZnNldDsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChkbWFfYWRkciA+PSBpb190bGJfc3RhcnQgJiYgZG1hX2FkZHIgPCBpb190bGJfZW5kKQorCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCiAJCXN5bmNfc2luZ2xlKGh3ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyLCB0YXJnZXQpOwogCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCiAJCWRtYV9tYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKQEAgLTcyNyw3ICs3MTcsOCBAQAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewogCQlhZGRyID0gU0dfRU5UX1ZJUlRfQUREUkVTUyhzZyk7CiAJCWRldl9hZGRyID0gdmlydF90b19idXMoYWRkcik7Ci0JCWlmIChzd2lvdGxiX2ZvcmNlIHx8IGFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIpKSB7CisJCWlmIChzd2lvdGxiX2ZvcmNlIHx8CisJCSAgICBhZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGRldl9hZGRyLCBzZy0+bGVuZ3RoKSkgewogCQkJdm9pZCAqbWFwID0gbWFwX3NpbmdsZShod2RldiwgYWRkciwgc2ctPmxlbmd0aCwgZGlyKTsKIAkJCWlmICghbWFwKSB7CiAJCQkJLyogRG9uJ3QgcGFuaWMgaGVyZSwgd2UgZXhwZWN0IG1hcF9zZyB1c2VycwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBkOGQxZDExLi5jY2VlY2I2IDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMjcsNDQgKzI3LDUzIEBACiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgkJLyogZm9yIFBBR0VfU0laRSAqLwogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgkvKiBmb3IgZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcigpICovCiAKIC8qIFdvcmtzIG9ubHkgZm9yIGRpZ2l0cyBhbmQgbGV0dGVycywgYnV0IHNtYWxsIGFuZCBmYXN0ICovCiAjZGVmaW5lIFRPTE9XRVIoeCkgKCh4KSB8IDB4MjApCiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ltcGxlX2d1ZXNzX2Jhc2UoY29uc3QgY2hhciAqY3ApCit7CisJaWYgKGNwWzBdID09ICcwJykgeworCQlpZiAoVE9MT1dFUihjcFsxXSkgPT0gJ3gnICYmIGlzeGRpZ2l0KGNwWzJdKSkKKwkJCXJldHVybiAxNjsKKwkJZWxzZQorCQkJcmV0dXJuIDg7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDEwOworCX0KK30KKwogLyoqCiAgKiBzaW1wbGVfc3RydG91bCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZwogICogQGNwOiBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZwogICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKICAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCiAgKi8KLXVuc2lnbmVkIGxvbmcgc2ltcGxlX3N0cnRvdWwoY29uc3QgY2hhciAqY3AsY2hhciAqKmVuZHAsdW5zaWduZWQgaW50IGJhc2UpCit1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCiB7Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwLHZhbHVlOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKIAotCWlmICghYmFzZSkgewotCQliYXNlID0gMTA7Ci0JCWlmICgqY3AgPT0gJzAnKSB7Ci0JCQliYXNlID0gODsKLQkJCWNwKys7Ci0JCQlpZiAoKFRPTE9XRVIoKmNwKSA9PSAneCcpICYmIGlzeGRpZ2l0KGNwWzFdKSkgewotCQkJCWNwKys7Ci0JCQkJYmFzZSA9IDE2OwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChiYXNlID09IDE2KSB7Ci0JCWlmIChjcFswXSA9PSAnMCcgJiYgVE9MT1dFUihjcFsxXSkgPT0gJ3gnKQotCQkJY3AgKz0gMjsKLQl9Ci0Jd2hpbGUgKGlzeGRpZ2l0KCpjcCkgJiYKLQkgICAgICAgKHZhbHVlID0gaXNkaWdpdCgqY3ApID8gKmNwLScwJyA6IFRPTE9XRVIoKmNwKS0nYScrMTApIDwgYmFzZSkgewotCQlyZXN1bHQgPSByZXN1bHQqYmFzZSArIHZhbHVlOworCWlmICghYmFzZSkKKwkJYmFzZSA9IHNpbXBsZV9ndWVzc19iYXNlKGNwKTsKKworCWlmIChiYXNlID09IDE2ICYmIGNwWzBdID09ICcwJyAmJiBUT0xPV0VSKGNwWzFdKSA9PSAneCcpCisJCWNwICs9IDI7CisKKwl3aGlsZSAoaXN4ZGlnaXQoKmNwKSkgeworCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwkJdmFsdWUgPSBpc2RpZ2l0KCpjcCkgPyAqY3AgLSAnMCcgOiBUT0xPV0VSKCpjcCkgLSAnYScgKyAxMDsKKwkJaWYgKHZhbHVlID49IGJhc2UpCisJCQlicmVhazsKKwkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwogCQljcCsrOwogCX0KKwogCWlmIChlbmRwKQogCQkqZW5kcCA9IChjaGFyICopY3A7CiAJcmV0dXJuIHJlc3VsdDsKIH0KLQogRVhQT1JUX1NZTUJPTChzaW1wbGVfc3RydG91bCk7CiAKIC8qKgpAQCAtNzMsMTMgKzgyLDEyIEBACiAgKiBAZW5kcDogQSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHBhcnNlZCBzdHJpbmcgd2lsbCBiZSBwbGFjZWQgaGVyZQogICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UKICAqLwotbG9uZyBzaW1wbGVfc3RydG9sKGNvbnN0IGNoYXIgKmNwLGNoYXIgKiplbmRwLHVuc2lnbmVkIGludCBiYXNlKQorbG9uZyBzaW1wbGVfc3RydG9sKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCiB7Ci0JaWYoKmNwPT0nLScpCi0JCXJldHVybiAtc2ltcGxlX3N0cnRvdWwoY3ArMSxlbmRwLGJhc2UpOwotCXJldHVybiBzaW1wbGVfc3RydG91bChjcCxlbmRwLGJhc2UpOworCWlmKCpjcCA9PSAnLScpCisJCXJldHVybiAtc2ltcGxlX3N0cnRvdWwoY3AgKyAxLCBlbmRwLCBiYXNlKTsKKwlyZXR1cm4gc2ltcGxlX3N0cnRvdWwoY3AsIGVuZHAsIGJhc2UpOwogfQotCiBFWFBPUlRfU1lNQk9MKHNpbXBsZV9zdHJ0b2wpOwogCiAvKioKQEAgLTg4LDM0ICs5NiwzMCBAQAogICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKICAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCiAgKi8KLXVuc2lnbmVkIGxvbmcgbG9uZyBzaW1wbGVfc3RydG91bGwoY29uc3QgY2hhciAqY3AsY2hhciAqKmVuZHAsdW5zaWduZWQgaW50IGJhc2UpCit1bnNpZ25lZCBsb25nIGxvbmcgc2ltcGxlX3N0cnRvdWxsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdCA9IDAsdmFsdWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdCA9IDA7CiAKLQlpZiAoIWJhc2UpIHsKLQkJYmFzZSA9IDEwOwotCQlpZiAoKmNwID09ICcwJykgewotCQkJYmFzZSA9IDg7Ci0JCQljcCsrOwotCQkJaWYgKChUT0xPV0VSKCpjcCkgPT0gJ3gnKSAmJiBpc3hkaWdpdChjcFsxXSkpIHsKLQkJCQljcCsrOwotCQkJCWJhc2UgPSAxNjsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoYmFzZSA9PSAxNikgewotCQlpZiAoY3BbMF0gPT0gJzAnICYmIFRPTE9XRVIoY3BbMV0pID09ICd4JykKLQkJCWNwICs9IDI7Ci0JfQotCXdoaWxlIChpc3hkaWdpdCgqY3ApCi0JICYmICh2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcC0nMCcgOiBUT0xPV0VSKCpjcCktJ2EnKzEwKSA8IGJhc2UpIHsKLQkJcmVzdWx0ID0gcmVzdWx0KmJhc2UgKyB2YWx1ZTsKKwlpZiAoIWJhc2UpCisJCWJhc2UgPSBzaW1wbGVfZ3Vlc3NfYmFzZShjcCk7CisKKwlpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgVE9MT1dFUihjcFsxXSkgPT0gJ3gnKQorCQljcCArPSAyOworCisJd2hpbGUgKGlzeGRpZ2l0KCpjcCkpIHsKKwkJdW5zaWduZWQgaW50IHZhbHVlOworCisJCXZhbHVlID0gaXNkaWdpdCgqY3ApID8gKmNwIC0gJzAnIDogVE9MT1dFUigqY3ApIC0gJ2EnICsgMTA7CisJCWlmICh2YWx1ZSA+PSBiYXNlKQorCQkJYnJlYWs7CisJCXJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyB2YWx1ZTsKIAkJY3ArKzsKIAl9CisKIAlpZiAoZW5kcCkKIAkJKmVuZHAgPSAoY2hhciAqKWNwOwogCXJldHVybiByZXN1bHQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc2ltcGxlX3N0cnRvdWxsKTsKIAogLyoqCkBAIC0xMjQsMTQgKzEyOCwxMyBAQAogICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKICAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCiAgKi8KLWxvbmcgbG9uZyBzaW1wbGVfc3RydG9sbChjb25zdCBjaGFyICpjcCxjaGFyICoqZW5kcCx1bnNpZ25lZCBpbnQgYmFzZSkKK2xvbmcgbG9uZyBzaW1wbGVfc3RydG9sbChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQogewogCWlmKCpjcD09Jy0nKQotCQlyZXR1cm4gLXNpbXBsZV9zdHJ0b3VsbChjcCsxLGVuZHAsYmFzZSk7Ci0JcmV0dXJuIHNpbXBsZV9zdHJ0b3VsbChjcCxlbmRwLGJhc2UpOworCQlyZXR1cm4gLXNpbXBsZV9zdHJ0b3VsbChjcCArIDEsIGVuZHAsIGJhc2UpOworCXJldHVybiBzaW1wbGVfc3RydG91bGwoY3AsIGVuZHAsIGJhc2UpOwogfQogCi0KIC8qKgogICogc3RyaWN0X3N0cnRvdWwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgc3RyaWN0bHkKICAqIEBjcDogVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKQEAgLTE1NCw3ICsxNTcsMjcgQEAKICAqIHNpbXBsZV9zdHJ0b3VsIGp1c3QgaWdub3JlcyB0aGUgc3VjY2Vzc2l2ZSBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kCiAgKiByZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZSBvZiBwcmVmaXggcGFydCBvZiB0aGUgc3RyaW5nLgogICovCi1pbnQgc3RyaWN0X3N0cnRvdWwoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nICpyZXMpOworaW50IHN0cmljdF9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgbG9uZyAqcmVzKQoreworCWNoYXIgKnRhaWw7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJc2l6ZV90IGxlbjsKKworCSpyZXMgPSAwOworCWxlbiA9IHN0cmxlbihjcCk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAmdGFpbCwgYmFzZSk7CisJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAorCQkoKGxlbiA9PSAoc2l6ZV90KSh0YWlsIC0gY3ApICsgMSkgJiYgKCp0YWlsID09ICdcbicpKSkgeworCQkqcmVzID0gdmFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woc3RyaWN0X3N0cnRvdWwpOwogCiAvKioKICAqIHN0cmljdF9zdHJ0b2wgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBzdHJpY3RseQpAQCAtMTY4LDcgKzE5MSwyMCBAQAogICogSXQgcmV0dXJucyAwIGlmIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCBhbmQgKnJlcyBpcyBzZXQgdG8gdGhlIGNvbnZlcnRlZAogICogdmFsdWUsIG90aGVyd2lzZSBpdCByZXR1cm5zIC1FSU5WQUwgYW5kICpyZXMgaXMgc2V0IHRvIDAuCiAgKi8KLWludCBzdHJpY3Rfc3RydG9sKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyAqcmVzKTsKK2ludCBzdHJpY3Rfc3RydG9sKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyAqcmVzKQoreworCWludCByZXQ7CisJaWYgKCpjcCA9PSAnLScpIHsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoY3AgKyAxLCBiYXNlLCAodW5zaWduZWQgbG9uZyAqKXJlcyk7CisJCWlmICghcmV0KQorCQkJKnJlcyA9IC0oKnJlcyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoY3AsIGJhc2UsICh1bnNpZ25lZCBsb25nICopcmVzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzdHJpY3Rfc3RydG9sKTsKIAogLyoqCiAgKiBzdHJpY3Rfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJpY3RseQpAQCAtMTkyLDcgKzIyOCwyNyBAQAogICogc2ltcGxlX3N0cnRvdWxsIGp1c3QgaWdub3JlcyB0aGUgc3VjY2Vzc2l2ZSBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kCiAgKiByZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZSBvZiBwcmVmaXggcGFydCBvZiB0aGUgc3RyaW5nLgogICovCi1pbnQgc3RyaWN0X3N0cnRvdWxsKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpyZXMpOworaW50IHN0cmljdF9zdHJ0b3VsbChjb25zdCBjaGFyICpjcCwgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQoreworCWNoYXIgKnRhaWw7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlzaXplX3QgbGVuOworCisJKnJlcyA9IDA7CisJbGVuID0gc3RybGVuKGNwKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWxsKGNwLCAmdGFpbCwgYmFzZSk7CisJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAorCQkoKGxlbiA9PSAoc2l6ZV90KSh0YWlsIC0gY3ApICsgMSkgJiYgKCp0YWlsID09ICdcbicpKSkgeworCQkqcmVzID0gdmFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woc3RyaWN0X3N0cnRvdWxsKTsKIAogLyoqCiAgKiBzdHJpY3Rfc3RydG9sbCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBsb25nIGxvbmcgc3RyaWN0bHkKQEAgLTIwNiw1MyArMjYyLDIwIEBACiAgKiBJdCByZXR1cm5zIDAgaWYgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIGFuZCAqcmVzIGlzIHNldCB0byB0aGUgY29udmVydGVkCiAgKiB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgLUVJTlZBTCBhbmQgKnJlcyBpcyBzZXQgdG8gMC4KICAqLwotaW50IHN0cmljdF9zdHJ0b2xsKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyBsb25nICpyZXMpOworaW50IHN0cmljdF9zdHJ0b2xsKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyBsb25nICpyZXMpCit7CisJaW50IHJldDsKKwlpZiAoKmNwID09ICctJykgeworCQlyZXQgPSBzdHJpY3Rfc3RydG91bGwoY3AgKyAxLCBiYXNlLCAodW5zaWduZWQgbG9uZyBsb25nICopcmVzKTsKKwkJaWYgKCFyZXQpCisJCQkqcmVzID0gLSgqcmVzKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzdHJpY3Rfc3RydG91bGwoY3AsIGJhc2UsICh1bnNpZ25lZCBsb25nIGxvbmcgKilyZXMpOworCX0KIAotI2RlZmluZSBkZWZpbmVfc3RyaWN0X3N0cnRvdXgodHlwZSwgdmFsdHlwZSkJCQkJXAotaW50IHN0cmljdF9zdHJ0b3UjI3R5cGUoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB2YWx0eXBlICpyZXMpXAotewkJCQkJCQkJCVwKLQljaGFyICp0YWlsOwkJCQkJCQlcCi0JdmFsdHlwZSB2YWw7CQkJCQkJCVwKLQlzaXplX3QgbGVuOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JKnJlcyA9IDA7CQkJCQkJCVwKLQlsZW4gPSBzdHJsZW4oY3ApOwkJCQkJCVwKLQlpZiAobGVuID09IDApCQkJCQkJCVwKLQkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAotCQkJCQkJCQkJXAotCXZhbCA9IHNpbXBsZV9zdHJ0b3UjI3R5cGUoY3AsICZ0YWlsLCBiYXNlKTsJCQlcCi0JaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAkJCQkJCVwKLQkJKChsZW4gPT0gKHNpemVfdCkodGFpbCAtIGNwKSArIDEpICYmICgqdGFpbCA9PSAnXG4nKSkpIHtcCi0JCSpyZXMgPSB2YWw7CQkJCQkJXAotCQlyZXR1cm4gMDsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCQkJCQkJCQkJXAotCXJldHVybiAtRUlOVkFMOwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCi0jZGVmaW5lIGRlZmluZV9zdHJpY3Rfc3RydG94KHR5cGUsIHZhbHR5cGUpCQkJCVwKLWludCBzdHJpY3Rfc3RydG8jI3R5cGUoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB2YWx0eXBlICpyZXMpCVwKLXsJCQkJCQkJCQlcCi0JaW50IHJldDsJCQkJCQkJXAotCWlmICgqY3AgPT0gJy0nKSB7CQkJCQkJXAotCQlyZXQgPSBzdHJpY3Rfc3RydG91IyN0eXBlKGNwKzEsIGJhc2UsIHJlcyk7CQlcCi0JCWlmICghcmV0KQkJCQkJCVwKLQkJCSpyZXMgPSAtKCpyZXMpOwkJCQkJXAotCX0gZWxzZQkJCQkJCQkJXAotCQlyZXQgPSBzdHJpY3Rfc3RydG91IyN0eXBlKGNwLCBiYXNlLCByZXMpOwkJXAotCQkJCQkJCQkJXAotCXJldHVybiByZXQ7CQkJCQkJCVwKLX0JCQkJCQkJCQlcCi0KLWRlZmluZV9zdHJpY3Rfc3RydG91eChsLCB1bnNpZ25lZCBsb25nKQotZGVmaW5lX3N0cmljdF9zdHJ0b3gobCwgbG9uZykKLWRlZmluZV9zdHJpY3Rfc3RydG91eChsbCwgdW5zaWduZWQgbG9uZyBsb25nKQotZGVmaW5lX3N0cmljdF9zdHJ0b3gobGwsIGxvbmcgbG9uZykKLQotRVhQT1JUX1NZTUJPTChzdHJpY3Rfc3RydG91bCk7Ci1FWFBPUlRfU1lNQk9MKHN0cmljdF9zdHJ0b2wpOworCXJldHVybiByZXQ7Cit9CiBFWFBPUlRfU1lNQk9MKHN0cmljdF9zdHJ0b2xsKTsKLUVYUE9SVF9TWU1CT0woc3RyaWN0X3N0cnRvdWxsKTsKIAogc3RhdGljIGludCBza2lwX2F0b2koY29uc3QgY2hhciAqKnMpCiB7CkBAIC01MTMsMTYgKzUzNiw2IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKHZvaWQgKnB0cikKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19JQTY0KSB8fCBkZWZpbmVkKENPTkZJR19QUEM2NCkKLQl2b2lkICpwOwotCWlmICghcHJvYmVfa2VybmVsX2FkZHJlc3MocHRyLCBwKSkKLQkJcHRyID0gcDsKLSNlbmRpZgotCXJldHVybiBwdHI7Ci19Ci0KIHN0YXRpYyBjaGFyICpzeW1ib2xfc3RyaW5nKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB2b2lkICpwdHIsIGludCBmaWVsZF93aWR0aCwgaW50IHByZWNpc2lvbiwgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAodW5zaWduZWQgbG9uZykgcHRyOwpAQCAtNTc0LDYgKzU4NywxMCBAQAogICogQGZtdDogVGhlIGZvcm1hdCBzdHJpbmcgdG8gdXNlCiAgKiBAYXJnczogQXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZwogICoKKyAqIFRoaXMgZnVuY3Rpb24gZm9sbG93cyBDOTkgdnNucHJpbnRmLCBidXQgaGFzIHNvbWUgZXh0ZW5zaW9uczoKKyAqICVwUyBvdXRwdXQgdGhlIG5hbWUgb2YgYSB0ZXh0IHN5bWJvbAorICogJXBGIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIKKyAqCiAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCB3b3VsZAogICogYmUgZ2VuZXJhdGVkIGZvciB0aGUgZ2l2ZW4gaW5wdXQsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcKICAqICdcMCcsIGFzIHBlciBJU08gQzk5LiBJZiB5b3Ugd2FudCB0byBoYXZlIHRoZSBleGFjdApAQCAtNzk5LDcgKzgxNiw2IEBACiAJLyogdGhlIHRyYWlsaW5nIG51bGwgYnl0ZSBkb2Vzbid0IGNvdW50IHRvd2FyZHMgdGhlIHRvdGFsICovCiAJcmV0dXJuIHN0ci1idWY7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodnNucHJpbnRmKTsKIAogLyoqCkBAIC04MTUsNiArODMxLDggQEAKICAqCiAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gaWYgeW91IGFyZSBhbHJlYWR5IGRlYWxpbmcgd2l0aCBhIHZhX2xpc3QuCiAgKiBZb3UgcHJvYmFibHkgd2FudCBzY25wcmludGYoKSBpbnN0ZWFkLgorICoKKyAqIFNlZSB0aGUgdnNucHJpbnRmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0IHN0cmluZyBleHRlbnNpb25zIG92ZXIgQzk5LgogICovCiBpbnQgdnNjbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKIHsKQEAgLTgyMyw3ICs4NDEsNiBAQAogCWk9dnNucHJpbnRmKGJ1ZixzaXplLGZtdCxhcmdzKTsKIAlyZXR1cm4gKGkgPj0gc2l6ZSkgPyAoc2l6ZSAtIDEpIDogaTsKIH0KLQogRVhQT1JUX1NZTUJPTCh2c2NucHJpbnRmKTsKIAogLyoqCkBAIC04MzcsNiArODU0LDggQEAKICAqIGdlbmVyYXRlZCBmb3IgdGhlIGdpdmVuIGlucHV0LCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIG51bGwsCiAgKiBhcyBwZXIgSVNPIEM5OS4gIElmIHRoZSByZXR1cm4gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCiAgKiBAc2l6ZSwgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgdHJ1bmNhdGVkLgorICoKKyAqIFNlZSB0aGUgdnNucHJpbnRmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0IHN0cmluZyBleHRlbnNpb25zIG92ZXIgQzk5LgogICovCiBpbnQgc25wcmludGYoY2hhciAqIGJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewpAQCAtODQ4LDcgKzg2Nyw2IEBACiAJdmFfZW5kKGFyZ3MpOwogCXJldHVybiBpOwogfQotCiBFWFBPUlRfU1lNQk9MKHNucHJpbnRmKTsKIAogLyoqCkBAIC04ODYsMTIgKzkwNCwxMyBAQAogICoKICAqIENhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIGFscmVhZHkgZGVhbGluZyB3aXRoIGEgdmFfbGlzdC4KICAqIFlvdSBwcm9iYWJseSB3YW50IHNwcmludGYoKSBpbnN0ZWFkLgorICoKKyAqIFNlZSB0aGUgdnNucHJpbnRmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0IHN0cmluZyBleHRlbnNpb25zIG92ZXIgQzk5LgogICovCiBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKIHsKIAlyZXR1cm4gdnNucHJpbnRmKGJ1ZiwgSU5UX01BWCwgZm10LCBhcmdzKTsKIH0KLQogRVhQT1JUX1NZTUJPTCh2c3ByaW50Zik7CiAKIC8qKgpAQCAtOTAzLDYgKzkyMiw4IEBACiAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgogICogaW50byBAYnVmLiBVc2Ugc25wcmludGYoKSBvciBzY25wcmludGYoKSBpbiBvcmRlciB0byBhdm9pZAogICogYnVmZmVyIG92ZXJmbG93cy4KKyAqCisgKiBTZWUgdGhlIHZzbnByaW50ZigpIGRvY3VtZW50YXRpb24gZm9yIGZvcm1hdCBzdHJpbmcgZXh0ZW5zaW9ucyBvdmVyIEM5OS4KICAqLwogaW50IHNwcmludGYoY2hhciAqIGJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC05MTQsNyArOTM1LDYgQEAKIAl2YV9lbmQoYXJncyk7CiAJcmV0dXJuIGk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc3ByaW50Zik7CiAKIC8qKgpAQCAtMTE0Myw3ICsxMTYzLDYgQEAKIAogCXJldHVybiBudW07CiB9Ci0KIEVYUE9SVF9TWU1CT0wodnNzY2FuZik7CiAKIC8qKgpAQCAtMTE2Miw1ICsxMTgxLDQgQEAKIAl2YV9lbmQoYXJncyk7CiAJcmV0dXJuIGk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woc3NjYW5mKTsKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IDBiZDljMmQuLjFhNTAxYTQgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTAxLDcgKzEwMSw3IEBACiAjIHdpdGggZ2NjIDMuNCBhbmQgbGF0ZXIuCiAjCiBjb25maWcgU1BBUlNFTUVNX1NUQVRJQwotCWRlZl9ib29sIG4KKwlib29sCiAKICMKICMgQXJjaGl0ZWN0dXJlIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIGEgdHdvIGxldmVsIG1lbV9zZWN0aW9uIGluIFNQQVJTRU1FTQpAQCAtMTEzLDcgKzExMyw3IEBACiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gJiYgIVNQQVJTRU1FTV9TVEFUSUMKIAogY29uZmlnIFNQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRQotCWRlZl9ib29sIG4KKwlib29sCiAKIGNvbmZpZyBTUEFSU0VNRU1fVk1FTU1BUAogCWJvb2wgIlNwYXJzZSBNZW1vcnkgdmlydHVhbCBtZW1tYXAiCkBAIC0xODcsNiArMTg3LDkgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgbWVtb3J5IGFuZCBJTyByZXNvdXJjZXMgdG8gYmUgNjQgYml0LgogCitjb25maWcgUEhZU19BRERSX1RfNjRCSVQKKwlkZWZfYm9vbCA2NEJJVCB8fCBBUkNIX1BIWVNfQUREUl9UXzY0QklUCisKIGNvbmZpZyBaT05FX0RNQV9GTEFHCiAJaW50CiAJZGVmYXVsdCAiMCIgaWYgIVpPTkVfRE1BCmRpZmYgLS1naXQgYS9tbS9ib290bWVtLmMgYi9tbS9ib290bWVtLmMKaW5kZXggYWQ4ZWVjNi4uYWM1YTg5MSAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtNDgsNyArNDgsNyBAQAogCWlmICh1bmxpa2VseShib290bWVtX2RlYnVnKSkJCQlcCiAJCXByaW50ayhLRVJOX0lORk8JCQlcCiAJCQkiYm9vdG1lbTo6JXMgIiBmbXQsCQlcCi0JCQlfX0ZVTkNUSU9OX18sICMjIGFyZ3MpOwkJXAorCQkJX19mdW5jX18sICMjIGFyZ3MpOwkJXAogfSkKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGJvb3RtYXBfYnl0ZXModW5zaWduZWQgbG9uZyBwYWdlcykKZGlmZiAtLWdpdCBhL21tL2JvdW5jZS5jIGIvbW0vYm91bmNlLmMKaW5kZXggYjZkMmQwZi4uMDY3MjJjNCAxMDA2NDQKLS0tIGEvbW0vYm91bmNlLmMKKysrIGIvbW0vYm91bmNlLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCS8qCiAJICogRGF0YS1sZXNzIGJpbywgbm90aGluZyB0byBib3VuY2UKIAkgKi8KLQlpZiAoYmlvX2VtcHR5X2JhcnJpZXIoKmJpb19vcmlnKSkKKwlpZiAoIWJpb19oYXNfZGF0YSgqYmlvX29yaWcpKQogCQlyZXR1cm47CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vZmFkdmlzZS5jIGIvbW0vZmFkdmlzZS5jCmluZGV4IDM0M2NmZGYuLmExZGE5NjkgMTAwNjQ0Ci0tLSBhL21tL2ZhZHZpc2UuYworKysgYi9tbS9mYWR2aXNlLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyLCBMaW51cyBUb3J2YWxkcwogICoKLSAqIDExSmFuMjAwMwlha3BtQGRpZ2VvLmNvbQorICogMTFKYW4yMDAzCUFuZHJldyBNb3J0b24KICAqCQlJbml0aWFsIHZlcnNpb24uCiAgKi8KIApkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDg3NmJjNTkuLjkwM2JmMzEgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTExMDAsOCArMTEwMCw5IEBACiAKIHBhZ2Vfbm90X3VwX3RvX2RhdGU6CiAJCS8qIEdldCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwYWdlIC4uLiAqLwotCQlpZiAobG9ja19wYWdlX2tpbGxhYmxlKHBhZ2UpKQotCQkJZ290byByZWFkcGFnZV9laW87CisJCWVycm9yID0gbG9ja19wYWdlX2tpbGxhYmxlKHBhZ2UpOworCQlpZiAodW5saWtlbHkoZXJyb3IpKQorCQkJZ290byByZWFkcGFnZV9lcnJvcjsKIAogcGFnZV9ub3RfdXBfdG9fZGF0ZV9sb2NrZWQ6CiAJCS8qIERpZCBpdCBnZXQgdHJ1bmNhdGVkIGJlZm9yZSB3ZSBnb3QgdGhlIGxvY2s/ICovCkBAIC0xMTMwLDggKzExMzEsOSBAQAogCQl9CiAKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCWlmIChsb2NrX3BhZ2Vfa2lsbGFibGUocGFnZSkpCi0JCQkJZ290byByZWFkcGFnZV9laW87CisJCQllcnJvciA9IGxvY2tfcGFnZV9raWxsYWJsZShwYWdlKTsKKwkJCWlmICh1bmxpa2VseShlcnJvcikpCisJCQkJZ290byByZWFkcGFnZV9lcnJvcjsKIAkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CiAJCQkJaWYgKHBhZ2UtPm1hcHBpbmcgPT0gTlVMTCkgewogCQkJCQkvKgpAQCAtMTE0MywxNSArMTE0NSwxNCBAQAogCQkJCX0KIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQlzaHJpbmtfcmVhZGFoZWFkX3NpemVfZWlvKGZpbHAsIHJhKTsKLQkJCQlnb3RvIHJlYWRwYWdlX2VpbzsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byByZWFkcGFnZV9lcnJvcjsKIAkJCX0KIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAKIAkJZ290byBwYWdlX29rOwogCi1yZWFkcGFnZV9laW86Ci0JCWVycm9yID0gLUVJTzsKIHJlYWRwYWdlX2Vycm9yOgogCQkvKiBVSEhVSCEgQSBzeW5jaHJvbm91cyByZWFkIGVycm9yIG9jY3VycmVkLiBSZXBvcnQgaXQgKi8KIAkJZGVzYy0+ZXJyb3IgPSBlcnJvcjsKQEAgLTExODYsOCArMTE4Nyw3IEBACiAJcmEtPnByZXZfcG9zIHw9IHByZXZfb2Zmc2V0OwogCiAJKnBwb3MgPSAoKGxvZmZfdClpbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mZnNldDsKLQlpZiAoZmlscCkKLQkJZmlsZV9hY2Nlc3NlZChmaWxwKTsKKwlmaWxlX2FjY2Vzc2VkKGZpbHApOwogfQogCiBpbnQgZmlsZV9yZWFkX2FjdG9yKHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKZGlmZiAtLWdpdCBhL21tL2hpZ2htZW0uYyBiL21tL2hpZ2htZW0uYwppbmRleCBlMTZlMTUyLi5iMzZiODNiIDEwMDY0NAotLS0gYS9tbS9oaWdobWVtLmMKKysrIGIvbW0vaGlnaG1lbS5jCkBAIC03MCw2ICs3MCw3IEBACiBzdGF0aWMgdm9pZCBmbHVzaF9hbGxfemVyb19wa21hcHModm9pZCkKIHsKIAlpbnQgaTsKKwlpbnQgbmVlZF9mbHVzaCA9IDA7CiAKIAlmbHVzaF9jYWNoZV9rbWFwcygpOwogCkBAIC0xMDEsOCArMTAyLDEwIEBACiAJCQkgICZwa21hcF9wYWdlX3RhYmxlW2ldKTsKIAogCQlzZXRfcGFnZV9hZGRyZXNzKHBhZ2UsIE5VTEwpOworCQluZWVkX2ZsdXNoID0gMTsKIAl9Ci0JZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShQS01BUF9BRERSKDApLCBQS01BUF9BRERSKExBU1RfUEtNQVApKTsKKwlpZiAobmVlZF9mbHVzaCkKKwkJZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShQS01BUF9BRERSKDApLCBQS01BUF9BRERSKExBU1RfUEtNQVApKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggNjdhNzExOS4uMzg2MzM4NiAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMjAwOCw3ICsyMDA4LDcgQEAKIAllbnRyeSA9IGh1Z2VfcHRlcF9nZXQocHRlcCk7CiAJaWYgKGh1Z2VfcHRlX25vbmUoZW50cnkpKSB7CiAJCXJldCA9IGh1Z2V0bGJfbm9fcGFnZShtbSwgdm1hLCBhZGRyZXNzLCBwdGVwLCB3cml0ZV9hY2Nlc3MpOwotCQlnb3RvIG91dF91bmxvY2s7CisJCWdvdG8gb3V0X211dGV4OwogCX0KIAogCXJldCA9IDA7CkBAIC0yMDI0LDcgKzIwMjQsNyBAQAogCWlmICh3cml0ZV9hY2Nlc3MgJiYgIXB0ZV93cml0ZShlbnRyeSkpIHsKIAkJaWYgKHZtYV9uZWVkc19yZXNlcnZhdGlvbihoLCB2bWEsIGFkZHJlc3MpIDwgMCkgewogCQkJcmV0ID0gVk1fRkFVTFRfT09NOwotCQkJZ290byBvdXRfdW5sb2NrOworCQkJZ290byBvdXRfbXV0ZXg7CiAJCX0KIAogCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKQEAgLTIwMzQsMTAgKzIwMzQsMjMgQEAKIAogCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJLyogQ2hlY2sgZm9yIGEgcmFjaW5nIHVwZGF0ZSBiZWZvcmUgY2FsbGluZyBodWdldGxiX2NvdyAqLwotCWlmIChsaWtlbHkocHRlX3NhbWUoZW50cnksIGh1Z2VfcHRlcF9nZXQocHRlcCkpKSkKLQkJaWYgKHdyaXRlX2FjY2VzcyAmJiAhcHRlX3dyaXRlKGVudHJ5KSkKKwlpZiAodW5saWtlbHkoIXB0ZV9zYW1lKGVudHJ5LCBodWdlX3B0ZXBfZ2V0KHB0ZXApKSkpCisJCWdvdG8gb3V0X3BhZ2VfdGFibGVfbG9jazsKKworCisJaWYgKHdyaXRlX2FjY2VzcykgeworCQlpZiAoIXB0ZV93cml0ZShlbnRyeSkpIHsKIAkJCXJldCA9IGh1Z2V0bGJfY293KG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXAsIGVudHJ5LAogCQkJCQkJCXBhZ2VjYWNoZV9wYWdlKTsKKwkJCWdvdG8gb3V0X3BhZ2VfdGFibGVfbG9jazsKKwkJfQorCQllbnRyeSA9IHB0ZV9ta2RpcnR5KGVudHJ5KTsKKwl9CisJZW50cnkgPSBwdGVfbWt5b3VuZyhlbnRyeSk7CisJaWYgKGh1Z2VfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgYWRkcmVzcywgcHRlcCwgZW50cnksIHdyaXRlX2FjY2VzcykpCisJCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBlbnRyeSk7CisKK291dF9wYWdlX3RhYmxlX2xvY2s6CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCiAJaWYgKHBhZ2VjYWNoZV9wYWdlKSB7CkBAIC0yMDQ1LDcgKzIwNTgsNyBAQAogCQlwdXRfcGFnZShwYWdlY2FjaGVfcGFnZSk7CiAJfQogCi1vdXRfdW5sb2NrOgorb3V0X211dGV4OgogCW11dGV4X3VubG9jaygmaHVnZXRsYl9pbnN0YW50aWF0aW9uX211dGV4KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggMGYxZjdhNy4uMzY4OTZmMyAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMjUwLDYgKzI1MCwxNCBAQAogCiBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQogeworCS8qCisJICogbW1fdXBkYXRlX25leHRfb3duZXIoKSBtYXkgY2xlYXIgbW0tPm93bmVyIHRvIE5VTEwKKwkgKiBpZiBpdCByYWNlcyB3aXRoIHN3YXBvZmYsIHBhZ2UgbWlncmF0aW9uLCBldGMuCisJICogU28gdGhpcyBjYW4gYmUgY2FsbGVkIHdpdGggcCA9PSBOVUxMLgorCSAqLworCWlmICh1bmxpa2VseSghcCkpCisJCXJldHVybiBOVUxMOworCiAJcmV0dXJuIGNvbnRhaW5lcl9vZih0YXNrX3N1YnN5c19zdGF0ZShwLCBtZW1fY2dyb3VwX3N1YnN5c19pZCksCiAJCQkJc3RydWN0IG1lbV9jZ3JvdXAsIGNzcyk7CiB9CkBAIC01NDksNiArNTU3LDExIEBACiAJaWYgKGxpa2VseSghbWVtY2cpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOworCQlpZiAodW5saWtlbHkoIW1lbSkpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJa21lbV9jYWNoZV9mcmVlKHBhZ2VfY2dyb3VwX2NhY2hlLCBwYyk7CisJCQlyZXR1cm4gMDsKKwkJfQogCQkvKgogCQkgKiBGb3IgZXZlcnkgY2hhcmdlIGZyb20gdGhlIGNncm91cCwgaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudAogCQkgKi8KQEAgLTgwMSwxMSArODE0LDE2IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOworCWlmICh1bmxpa2VseSghbWVtKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIDA7CisJfQogCWNzc19nZXQoJm1lbS0+Y3NzKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWRvIHsKIAkJcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbSwgZ2ZwX21hc2spOworCQlwcm9ncmVzcyArPSByZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdCgmbWVtLT5yZXMpOwogCX0gd2hpbGUgKCFwcm9ncmVzcyAmJiAtLXJldHJ5KTsKIAogCWNzc19wdXQoJm1lbS0+Y3NzKTsKZGlmZiAtLWdpdCBhL21tL21tem9uZS5jIGIvbW0vbW16b25lLmMKaW5kZXggNDg2ZWQ1OS4uMTZjZThiOSAxMDA2NDQKLS0tIGEvbW0vbW16b25lLmMKKysrIGIvbW0vbW16b25lLmMKQEAgLTY5LDYgKzY5LDYgQEAKIAkJCQkoei0+em9uZSAmJiAhenJlZl9pbl9ub2RlbWFzayh6LCBub2RlcykpKQogCQkJeisrOwogCi0JKnpvbmUgPSB6b25lbGlzdF96b25lKHorKyk7CisJKnpvbmUgPSB6b25lbGlzdF96b25lKHopOwogCXJldHVybiB6OwogfQpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggMjRkZThiNi4uYzEzMGExMyAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC03LDcgKzcsNyBAQAogICogQ29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gd3JpdGluZyBiYWNrIGRpcnR5IHBhZ2VzIGF0IHRoZQogICogYWRkcmVzc19zcGFjZSBsZXZlbC4KICAqCi0gKiAxMEFwcjIwMDIJYWtwbUB6aXAuY29tLmF1CisgKiAxMEFwcjIwMDIJQW5kcmV3IE1vcnRvbgogICoJCUluaXRpYWwgdmVyc2lvbgogICovCiAKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBlMjkzYzU4Li45ZWI5ZWI5IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0yNjgsMTMgKzI2OCwxNCBAQAogewogCWludCBpOwogCWludCBucl9wYWdlcyA9IDEgPDwgb3JkZXI7CisJc3RydWN0IHBhZ2UgKnAgPSBwYWdlICsgMTsKIAogCXNldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSwgZnJlZV9jb21wb3VuZF9wYWdlKTsKIAlzZXRfY29tcG91bmRfb3JkZXIocGFnZSwgb3JkZXIpOwogCV9fU2V0UGFnZUhlYWQocGFnZSk7Ci0JZm9yIChpID0gMTsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnAgPSBwYWdlICsgaTsKLQorCWZvciAoaSA9IDE7IGkgPCBucl9wYWdlczsgaSsrLCBwKyspIHsKKwkJaWYgKHVubGlrZWx5KChpICYgKE1BWF9PUkRFUl9OUl9QQUdFUyAtIDEpKSA9PSAwKSkKKwkJCXAgPSBwZm5fdG9fcGFnZShwYWdlX3RvX3BmbihwYWdlKSArIGkpOwogCQlfX1NldFBhZ2VUYWlsKHApOwogCQlwLT5maXJzdF9wYWdlID0gcGFnZTsKIAl9CkBAIC0yODQsNiArMjg1LDcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgbnJfcGFnZXMgPSAxIDw8IG9yZGVyOworCXN0cnVjdCBwYWdlICpwID0gcGFnZSArIDE7CiAKIAlpZiAodW5saWtlbHkoY29tcG91bmRfb3JkZXIocGFnZSkgIT0gb3JkZXIpKQogCQliYWRfcGFnZShwYWdlKTsKQEAgLTI5MSw4ICsyOTMsOSBAQAogCWlmICh1bmxpa2VseSghUGFnZUhlYWQocGFnZSkpKQogCQkJYmFkX3BhZ2UocGFnZSk7CiAJX19DbGVhclBhZ2VIZWFkKHBhZ2UpOwotCWZvciAoaSA9IDE7IGkgPCBucl9wYWdlczsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwID0gcGFnZSArIGk7CisJZm9yIChpID0gMTsgaSA8IG5yX3BhZ2VzOyBpKyssIHArKykgeworCQlpZiAodW5saWtlbHkoKGkgJiAoTUFYX09SREVSX05SX1BBR0VTIC0gMSkpID09IDApKQorCQkJcCA9IHBmbl90b19wYWdlKHBhZ2VfdG9fcGZuKHBhZ2UpICsgaSk7CiAKIAkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwKSB8CiAJCQkJKHAtPmZpcnN0X3BhZ2UgIT0gcGFnZSkpKQpAQCAtMzk0OSw3ICszOTUyLDcgQEAKIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X25vZGVzKHVuc2lnbmVkIGxvbmcgKm1heF96b25lX3BmbikKIHsKIAl1bnNpZ25lZCBsb25nIG5pZDsKLQllbnVtIHpvbmVfdHlwZSBpOworCWludCBpOwogCiAJLyogU29ydCBlYXJseV9ub2RlX21hcCBhcyBpbml0aWFsaXNhdGlvbiBhc3N1bWVzIGl0IGlzIHNvcnRlZCAqLwogCXNvcnRfbm9kZV9tYXAoKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaXNvbGF0aW9uLmMgYi9tbS9wYWdlX2lzb2xhdGlvbi5jCmluZGV4IGM2OWY4NGYuLmI3MGE3ZmUgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaXNvbGF0aW9uLmMKKysrIGIvbW0vcGFnZV9pc29sYXRpb24uYwpAQCAtMTE0LDggKzExNCwxMCBAQAogCiBpbnQgdGVzdF9wYWdlc19pc29sYXRlZCh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogewotCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgcGZuLCBmbGFnczsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlpbnQgcmV0OwogCiAJcGZuID0gc3RhcnRfcGZuOwogCS8qCkBAIC0xMzEsNyArMTMzLDkgQEAKIAlpZiAocGZuIDwgZW5kX3BmbikKIAkJcmV0dXJuIC1FQlVTWTsKIAkvKiBDaGVjayBhbGwgcGFnZXMgYXJlIGZyZWUgb3IgTWFya2VkIGFzIElTT0xBVEVEICovCi0JaWYgKF9fdGVzdF9wYWdlX2lzb2xhdGVkX2luX3BhZ2VibG9jayhzdGFydF9wZm4sIGVuZF9wZm4pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVCVVNZOworCXpvbmUgPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UocGZuKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX3Rlc3RfcGFnZV9pc29sYXRlZF9pbl9wYWdlYmxvY2soc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldCA/IDAgOiAtRUJVU1k7CiB9CmRpZmYgLS1naXQgYS9tbS9wZGZsdXNoLmMgYi9tbS9wZGZsdXNoLmMKaW5kZXggMGNiZTBjNi4uYTBhMTRjNCAxMDA2NDQKLS0tIGEvbW0vcGRmbHVzaC5jCisrKyBiL21tL3BkZmx1c2guYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIExpbnVzIFRvcnZhbGRzLgogICoKLSAqIDA5QXByMjAwMglha3BtQHppcC5jb20uYXUKKyAqIDA5QXByMjAwMglBbmRyZXcgTW9ydG9uCiAgKgkJSW5pdGlhbCB2ZXJzaW9uCiAgKiAyOUZlYjIwMDQJa2Fvc0BzZ2kuY29tCiAgKgkJTW92ZSB3b3JrZXIgdGhyZWFkIGNyZWF0aW9uIHRvIGt0aHJlYWQgdG8gYXZvaWQgY2hld2luZwpkaWZmIC0tZ2l0IGEvbW0vcmVhZGFoZWFkLmMgYi9tbS9yZWFkYWhlYWQuYwppbmRleCA3N2U4ZGRmLi42Y2JkOWE3IDEwMDY0NAotLS0gYS9tbS9yZWFkYWhlYWQuYworKysgYi9tbS9yZWFkYWhlYWQuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIExpbnVzIFRvcnZhbGRzCiAgKgotICogMDlBcHIyMDAyCWFrcG1AemlwLmNvbS5hdQorICogMDlBcHIyMDAyCUFuZHJldyBNb3J0b24KICAqCQlJbml0aWFsIHZlcnNpb24uCiAgKi8KIApkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMDRmYjRmMS4uYmY2NmQwMSAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC01MCwxNCArNTAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotLyogVGhpcyBtYWdpYyBudW1iZXIgaXMgdXNlZCBpbiBnbGliYyBmb3IgcG9zaXggc2hhcmVkIG1lbW9yeSAqLwotI2RlZmluZSBUTVBGU19NQUdJQwkweDAxMDIxOTk0Ci0KICNkZWZpbmUgRU5UUklFU19QRVJfUEFHRSAoUEFHRV9DQUNIRV9TSVpFL3NpemVvZih1bnNpZ25lZCBsb25nKSkKICNkZWZpbmUgRU5UUklFU19QRVJfUEFHRVBBR0UgKEVOVFJJRVNfUEVSX1BBR0UqRU5UUklFU19QRVJfUEFHRSkKICNkZWZpbmUgQkxPQ0tTX1BFUl9QQUdFICAoUEFHRV9DQUNIRV9TSVpFLzUxMikKZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCA0YzgyZGQ0Li5jYjY3NWQxIDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC01MTQsOSArNTE0LDExIEBACiAJCXJldHVybiAwOwogCiAJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShibG9jayk7Ci0JaWYgKHNsb2JfcGFnZShzcCkpCi0JCXJldHVybiAoKHNsb2JfdCAqKWJsb2NrIC0gMSktPnVuaXRzICsgU0xPQl9VTklUOwotCWVsc2UKKwlpZiAoc2xvYl9wYWdlKHNwKSkgeworCQlpbnQgYWxpZ24gPSBtYXgoQVJDSF9LTUFMTE9DX01JTkFMSUdOLCBBUkNIX1NMQUJfTUlOQUxJR04pOworCQl1bnNpZ25lZCBpbnQgKm0gPSAodW5zaWduZWQgaW50ICopKGJsb2NrIC0gYWxpZ24pOworCQlyZXR1cm4gU0xPQl9VTklUUygqbSkgKiBTTE9CX1VOSVQ7CisJfSBlbHNlCiAJCXJldHVybiBzcC0+cGFnZS5wcml2YXRlOwogfQogCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggZmI0ODZkNS4uMGM4M2U2YSAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMTkzMiw2ICsxOTMyLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbi0+cGFydGlhbCk7CiAjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlhdG9taWNfbG9uZ19zZXQoJm4tPm5yX3NsYWJzLCAwKTsKKwlhdG9taWNfbG9uZ19zZXQoJm4tPnRvdGFsX29iamVjdHMsIDApOwogCUlOSVRfTElTVF9IRUFEKCZuLT5mdWxsKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvbW0vdGlueS1zaG1lbS5jIGIvbW0vdGlueS1zaG1lbS5jCmluZGV4IGFlNTMyZjUuLjhkN2EyN2EgMTAwNjQ0Ci0tLSBhL21tL3Rpbnktc2htZW0uYworKysgYi9tbS90aW55LXNobWVtLmMKQEAgLTY1LDMxICs2NSwzMSBAQAogCWlmICghZGVudHJ5KQogCQlnb3RvIHB1dF9tZW1vcnk7CiAKLQllcnJvciA9IC1FTk9TUEM7Ci0JaW5vZGUgPSByYW1mc19nZXRfaW5vZGUocm9vdC0+ZF9zYiwgU19JRlJFRyB8IFNfSVJXWFVHTywgMCk7Ci0JaWYgKCFpbm9kZSkKLQkJZ290byBwdXRfZGVudHJ5OwotCi0JZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAllcnJvciA9IC1FTkZJTEU7Ci0JZmlsZSA9IGFsbG9jX2ZpbGUoc2htX21udCwgZGVudHJ5LCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCi0JCQkmcmFtZnNfZmlsZV9vcGVyYXRpb25zKTsKKwlmaWxlID0gZ2V0X2VtcHR5X2ZpbHAoKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gcHV0X2RlbnRyeTsKIAotCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KLQotCS8qIG5vdGlmeSBldmVyeW9uZSBhcyB0byB0aGUgY2hhbmdlIG9mIGZpbGUgc2l6ZSAqLwotCWVycm9yID0gZG9fdHJ1bmNhdGUoZGVudHJ5LCBzaXplLCAwLCBmaWxlKTsKLQlpZiAoZXJyb3IgPCAwKQorCWVycm9yID0gLUVOT1NQQzsKKwlpbm9kZSA9IHJhbWZzX2dldF9pbm9kZShyb290LT5kX3NiLCBTX0lGUkVHIHwgU19JUldYVUdPLCAwKTsKKwlpZiAoIWlub2RlKQogCQlnb3RvIGNsb3NlX2ZpbGU7CiAKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWlub2RlLT5pX3NpemUgPSBzaXplOworCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KKwlpbml0X2ZpbGUoZmlsZSwgc2htX21udCwgZGVudHJ5LCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCisJCQkmcmFtZnNfZmlsZV9vcGVyYXRpb25zKTsKKworI2lmbmRlZiBDT05GSUdfTU1VCisJZXJyb3IgPSByYW1mc19ub21tdV9leHBhbmRfZm9yX21hcHBpbmcoaW5vZGUsIHNpemUpOworCWlmIChlcnJvcikKKwkJZ290byBjbG9zZV9maWxlOworI2VuZGlmCiAJcmV0dXJuIGZpbGU7CiAKIGNsb3NlX2ZpbGU6CiAJcHV0X2ZpbHAoZmlsZSk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotCiBwdXRfZGVudHJ5OgogCWRwdXQoZGVudHJ5KTsKIHB1dF9tZW1vcnk6CmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCA2NjUwYzFkLi5lODNlNGIxIDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyLCBMaW51cyBUb3J2YWxkcwogICoKLSAqIDEwU2VwMjAwMglha3BtQHppcC5jb20uYXUKKyAqIDEwU2VwMjAwMglBbmRyZXcgTW9ydG9uCiAgKgkJSW5pdGlhbCB2ZXJzaW9uLgogICovCiAKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCA4NWI5YTBkLi5iYmEwNmM0IDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xODAsNiArMTgwLDEzIEBACiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlcCwgcHRlOwogCisJLyoKKwkgKiBYWFggd2UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhpcyBpZiB3ZSBhZGQgVklSVFVBTF9CVUdfT04gZm9yCisJICogYXJjaGl0ZWN0dXJlcyB0aGF0IGRvIG5vdCB2bWFsbG9jIG1vZHVsZSBzcGFjZQorCSAqLworCVZJUlRVQUxfQlVHX09OKCFpc192bWFsbG9jX2FkZHIodm1hbGxvY19hZGRyKSAmJgorCQkJIWlzX21vZHVsZV9hZGRyZXNzKGFkZHIpKTsKKwogCWlmICghcGdkX25vbmUoKnBnZCkpIHsKIAkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCQlpZiAoIXB1ZF9ub25lKCpwdWQpKSB7CmRpZmYgLS1naXQgYS9uZXQvODAyL2ZjLmMgYi9uZXQvODAyL2ZjLmMKaW5kZXggY2IzNDc1ZS4uMzRjZjFlZSAxMDA2NDQKLS0tIGEvbmV0LzgwMi9mYy5jCisrKyBiL25ldC84MDIvZmMuYwpAQCAtODIsMTMgKzgyLDEzIEBACiAKIHN0YXRpYyBpbnQgZmNfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKyNpZmRlZiBDT05GSUdfSU5FVAogCXN0cnVjdCBmY2hfaGRyICpmY2g9KHN0cnVjdCBmY2hfaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBmY2xsYyAqZmNsbGM9KHN0cnVjdCBmY2xsYyAqKShza2ItPmRhdGErc2l6ZW9mKHN0cnVjdCBmY2hfaGRyKSk7CiAJaWYoZmNsbGMtPmV0aGVydHlwZSAhPSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJcHJpbnRrKCJmY19yZWJ1aWxkX2hlYWRlcjogRG9uJ3Qga25vdyBob3cgdG8gcmVzb2x2ZSB0eXBlICUwNFggYWRkcmVzc2VzID9cbiIsIG50b2hzKGZjbGxjLT5ldGhlcnR5cGUpKTsKIAkJcmV0dXJuIDA7CiAJfQotI2lmZGVmIENPTkZJR19JTkVUCiAJcmV0dXJuIGFycF9maW5kKGZjaC0+ZGFkZHIsIHNrYik7CiAjZWxzZQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9wc25hcC5jIGIvbmV0LzgwMi9wc25hcC5jCmluZGV4IGIzY2ZlNWEuLjcwOTgwYmEgMTAwNjQ0Ci0tLSBhL25ldC84MDIvcHNuYXAuYworKysgYi9uZXQvODAyL3BzbmFwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJU05BUCBkYXRhIGxpbmsgbGF5ZXIuIERlcml2ZWQgZnJvbSA4MDIuMgogICoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPiwKKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICAqCQlmcm9tIHRoZSA4MDIuMiBsYXllciBieSBHcmVnIFBhZ2UuCiAgKgkJTWVyZ2VkIGluIGFkZGl0aW9ucyBmcm9tIEdyZWcgUGFnZSdzIHBzbmFwLmMuCiAgKgpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggYjY2MWY0Ny4uZjBlMzM1YSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC0zOTQsNiArMzk0LDcgQEAKIAogCXZsYW5kZXYtPmZlYXR1cmVzICY9IH5kZXYtPnZsYW5fZmVhdHVyZXM7CiAJdmxhbmRldi0+ZmVhdHVyZXMgfD0gZGV2LT5mZWF0dXJlcyAmIGRldi0+dmxhbl9mZWF0dXJlczsKKwl2bGFuZGV2LT5nc29fbWF4X3NpemUgPSBkZXYtPmdzb19tYXhfc2l6ZTsKIAogCWlmIChvbGRfZmVhdHVyZXMgIT0gdmxhbmRldi0+ZmVhdHVyZXMpCiAJCW5ldGRldl9mZWF0dXJlc19jaGFuZ2UodmxhbmRldik7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9kZXYuYyBiL25ldC84MDIxcS92bGFuX2Rldi5jCmluZGV4IDRiZjAxNGUuLjg4ODNlOWMgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyBiL25ldC84MDIxcS92bGFuX2Rldi5jCkBAIC00OCw3ICs0OCw3IEBACiAKIAlzd2l0Y2ggKHZldGgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8pIHsKICNpZmRlZiBDT05GSUdfSU5FVAotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAKIAkJLyogVE9ETzogIENvbmZpcm0gdGhpcyB3aWxsIHdvcmsgd2l0aCBWTEFOIGhlYWRlcnMuLi4gKi8KIAkJcmV0dXJuIGFycF9maW5kKHZldGgtPmhfZGVzdCwgc2tiKTsKQEAgLTYwNyw2ICs2MDcsNyBAQAogCQkgICAgICAoMTw8X19MSU5LX1NUQVRFX1BSRVNFTlQpOwogCiAJZGV2LT5mZWF0dXJlcyB8PSByZWFsX2Rldi0+ZmVhdHVyZXMgJiByZWFsX2Rldi0+dmxhbl9mZWF0dXJlczsKKwlkZXYtPmdzb19tYXhfc2l6ZSA9IHJlYWxfZGV2LT5nc29fbWF4X3NpemU7CiAKIAkvKiBpcHY2IHNoYXJlZCBjYXJkIHJlbGF0ZWQgc3R1ZmYgKi8KIAlkZXYtPmRldl9pZCA9IHJlYWxfZGV2LT5kZXZfaWQ7CmRpZmYgLS1naXQgYS9uZXQvOXAvY2xpZW50LmMgYi9uZXQvOXAvY2xpZW50LmMKaW5kZXggMmZmZTQwYy4uZTA1M2UwNiAxMDA2NDQKLS0tIGEvbmV0LzlwL2NsaWVudC5jCisrKyBiL25ldC85cC9jbGllbnQuYwpAQCAtNTIsNyArNTIsNyBAQAogCU9wdF9lcnIsCiB9OwogCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CiAJe09wdF9tc2l6ZSwgIm1zaXplPSV1In0sCiAJe09wdF9sZWdhY3ksICJub2V4dGVuZCJ9LAogCXtPcHRfdHJhbnMsICJ0cmFucz0lcyJ9LApAQCAtNzUsNyArNzUsNiBAQAogCWludCBvcHRpb247CiAJaW50IHJldCA9IDA7CiAKLQljbG50LT50cmFuc19tb2QgPSB2OWZzX2RlZmF1bHRfdHJhbnMoKTsKIAljbG50LT5kb3R1ID0gMTsKIAljbG50LT5tc2l6ZSA9IDgxOTI7CiAKQEAgLTEwOCw3ICsxMDcsNyBAQAogCQkJY2xudC0+bXNpemUgPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfdHJhbnM6Ci0JCQljbG50LT50cmFuc19tb2QgPSB2OWZzX21hdGNoX3RyYW5zKCZhcmdzWzBdKTsKKwkJCWNsbnQtPnRyYW5zX21vZCA9IHY5ZnNfZ2V0X3RyYW5zX2J5X25hbWUoJmFyZ3NbMF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2xlZ2FjeToKIAkJCWNsbnQtPmRvdHUgPSAwOwpAQCAtMTE3LDYgKzExNiwxMCBAQAogCQkJY29udGludWU7CiAJCX0KIAl9CisKKwlpZiAoIWNsbnQtPnRyYW5zX21vZCkKKwkJY2xudC0+dHJhbnNfbW9kID0gdjlmc19nZXRfZGVmYXVsdF90cmFucygpOworCiAJa2ZyZWUob3B0aW9ucyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MCw2ICsxNTMsNyBAQAogCWlmICghY2xudCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKKwljbG50LT50cmFuc19tb2QgPSBOVUxMOwogCWNsbnQtPnRyYW5zID0gTlVMTDsKIAlzcGluX2xvY2tfaW5pdCgmY2xudC0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsbnQtPmZpZGxpc3QpOwpAQCAtMjM1LDYgKzIzOSw4IEBACiAJCWNsbnQtPnRyYW5zID0gTlVMTDsKIAl9CiAKKwl2OWZzX3B1dF90cmFucyhjbG50LT50cmFuc19tb2QpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZpZCwgZmlkcHRyLCAmY2xudC0+ZmlkbGlzdCwgZmxpc3QpCiAJCXA5X2ZpZF9kZXN0cm95KGZpZCk7CiAKZGlmZiAtLWdpdCBhL25ldC85cC9jb252LmMgYi9uZXQvOXAvY29udi5jCmluZGV4IDQ0NTQ3MjAuLjVhZDNhM2IgMTAwNjQ0Ci0tLSBhL25ldC85cC9jb252LmMKKysrIGIvbmV0LzlwL2NvbnYuYwpAQCAtNDUxLDggKzQ1MSwxMCBAQAogCQkgICB1bnNpZ25lZCBjaGFyICoqcGRhdGEpCiB7CiAJKnBkYXRhID0gYnVmX2FsbG9jKGJ1ZnAsIGNvdW50KTsKKwlpZiAoKnBkYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCW1lbW1vdmUoKnBkYXRhLCBkYXRhLCBjb3VudCk7Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC00NjAsNiArNDYyLDggQEAKIAkJICAgdW5zaWduZWQgY2hhciAqKnBkYXRhKQogewogCSpwZGF0YSA9IGJ1Zl9hbGxvYyhidWZwLCBjb3VudCk7CisJaWYgKCpwZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gY29weV9mcm9tX3VzZXIoKnBkYXRhLCBkYXRhLCBjb3VudCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC85cC9tb2QuYyBiL25ldC85cC9tb2QuYwppbmRleCBiZGVlMWZiLi4xMDg0ZmViIDEwMDY0NAotLS0gYS9uZXQvOXAvbW9kLmMKKysrIGIvbmV0LzlwL21vZC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bmV0LzlwL3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaWZkZWYgQ09ORklHX05FVF85UF9ERUJVRwogdW5zaWduZWQgaW50IHA5X2RlYnVnX2xldmVsID0gMDsJLyogZmVhdHVyZS1yaWZpYyBnbG9iYWwgZGVidWcgbGV2ZWwgICovCkBAIC00NCw4ICs0NSw4IEBACiAgKgogICovCiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodjlmc190cmFuc19sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQodjlmc190cmFuc19saXN0KTsKLXN0YXRpYyBzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX2RlZmF1bHRfdHJhbnNwb3J0OwogCiAvKioKICAqIHY5ZnNfcmVnaXN0ZXJfdHJhbnMgLSByZWdpc3RlciBhIG5ldyB0cmFuc3BvcnQgd2l0aCA5cApAQCAtNTQsNDggKzU1LDg3IEBACiAgKi8KIHZvaWQgdjlmc19yZWdpc3Rlcl90cmFucyhzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICptKQogeworCXNwaW5fbG9jaygmdjlmc190cmFuc19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZtLT5saXN0LCAmdjlmc190cmFuc19saXN0KTsKLQlpZiAobS0+ZGVmKQotCQl2OWZzX2RlZmF1bHRfdHJhbnNwb3J0ID0gbTsKKwlzcGluX3VubG9jaygmdjlmc190cmFuc19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0wodjlmc19yZWdpc3Rlcl90cmFucyk7CiAKIC8qKgotICogdjlmc19tYXRjaF90cmFucyAtIG1hdGNoIHRyYW5zcG9ydCB2ZXJzdXMgcmVnaXN0ZXJlZCB0cmFuc3BvcnRzCisgKiB2OWZzX3VucmVnaXN0ZXJfdHJhbnMgLSB1bnJlZ2lzdGVyIGEgOXAgdHJhbnNwb3J0CisgKiBAbTogdGhlIHRyYW5zcG9ydCB0byByZW1vdmUKKyAqCisgKi8KK3ZvaWQgdjlmc191bnJlZ2lzdGVyX3RyYW5zKHN0cnVjdCBwOV90cmFuc19tb2R1bGUgKm0pCit7CisJc3Bpbl9sb2NrKCZ2OWZzX3RyYW5zX2xvY2spOworCWxpc3RfZGVsX2luaXQoJm0tPmxpc3QpOworCXNwaW5fdW5sb2NrKCZ2OWZzX3RyYW5zX2xvY2spOworfQorRVhQT1JUX1NZTUJPTCh2OWZzX3VucmVnaXN0ZXJfdHJhbnMpOworCisvKioKKyAqIHY5ZnNfZ2V0X3RyYW5zX2J5X25hbWUgLSBnZXQgdHJhbnNwb3J0IHdpdGggdGhlIG1hdGNoaW5nIG5hbWUKICAqIEBuYW1lOiBzdHJpbmcgaWRlbnRpZnlpbmcgdHJhbnNwb3J0CiAgKgogICovCi1zdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp2OWZzX21hdGNoX3RyYW5zKGNvbnN0IHN1YnN0cmluZ190ICpuYW1lKQorc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqdjlmc19nZXRfdHJhbnNfYnlfbmFtZShjb25zdCBzdWJzdHJpbmdfdCAqbmFtZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBwOV90cmFuc19tb2R1bGUgKnQgPSBOVUxMOworCXN0cnVjdCBwOV90cmFuc19tb2R1bGUgKnQsICpmb3VuZCA9IE5VTEw7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZ2OWZzX3RyYW5zX2xpc3QpIHsKLQkJdCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHA5X3RyYW5zX21vZHVsZSwgbGlzdCk7Ci0JCWlmIChzdHJuY21wKHQtPm5hbWUsIG5hbWUtPmZyb20sIG5hbWUtPnRvLW5hbWUtPmZyb20pID09IDApCi0JCQlyZXR1cm4gdDsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJc3Bpbl9sb2NrKCZ2OWZzX3RyYW5zX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdjlmc190cmFuc19saXN0LCBsaXN0KQorCQlpZiAoc3RybmNtcCh0LT5uYW1lLCBuYW1lLT5mcm9tLCBuYW1lLT50by1uYW1lLT5mcm9tKSA9PSAwICYmCisJCSAgICB0cnlfbW9kdWxlX2dldCh0LT5vd25lcikpIHsKKwkJCWZvdW5kID0gdDsKKwkJCWJyZWFrOworCQl9CisKKwlzcGluX3VubG9jaygmdjlmc190cmFuc19sb2NrKTsKKwlyZXR1cm4gZm91bmQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHY5ZnNfbWF0Y2hfdHJhbnMpOworRVhQT1JUX1NZTUJPTCh2OWZzX2dldF90cmFuc19ieV9uYW1lKTsKIAogLyoqCi0gKiB2OWZzX2RlZmF1bHRfdHJhbnMgLSByZXR1cm5zIHBvaW50ZXIgdG8gZGVmYXVsdCB0cmFuc3BvcnQKKyAqIHY5ZnNfZ2V0X2RlZmF1bHRfdHJhbnMgLSBnZXQgdGhlIGRlZmF1bHQgdHJhbnNwb3J0CiAgKgogICovCiAKLXN0cnVjdCBwOV90cmFuc19tb2R1bGUgKnY5ZnNfZGVmYXVsdF90cmFucyh2b2lkKQorc3RydWN0IHA5X3RyYW5zX21vZHVsZSAqdjlmc19nZXRfZGVmYXVsdF90cmFucyh2b2lkKQogewotCWlmICh2OWZzX2RlZmF1bHRfdHJhbnNwb3J0KQotCQlyZXR1cm4gdjlmc19kZWZhdWx0X3RyYW5zcG9ydDsKLQllbHNlIGlmICghbGlzdF9lbXB0eSgmdjlmc190cmFuc19saXN0KSkKLQkJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJnY5ZnNfdHJhbnNfbGlzdCwKLQkJCQkJc3RydWN0IHA5X3RyYW5zX21vZHVsZSwgbGlzdCk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wodjlmc19kZWZhdWx0X3RyYW5zKTsKKwlzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICp0LCAqZm91bmQgPSBOVUxMOwogCisJc3Bpbl9sb2NrKCZ2OWZzX3RyYW5zX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdjlmc190cmFuc19saXN0LCBsaXN0KQorCQlpZiAodC0+ZGVmICYmIHRyeV9tb2R1bGVfZ2V0KHQtPm93bmVyKSkgeworCQkJZm91bmQgPSB0OworCQkJYnJlYWs7CisJCX0KKworCWlmICghZm91bmQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnY5ZnNfdHJhbnNfbGlzdCwgbGlzdCkKKwkJCWlmICh0cnlfbW9kdWxlX2dldCh0LT5vd25lcikpIHsKKwkJCQlmb3VuZCA9IHQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwlzcGluX3VubG9jaygmdjlmc190cmFuc19sb2NrKTsKKwlyZXR1cm4gZm91bmQ7Cit9CitFWFBPUlRfU1lNQk9MKHY5ZnNfZ2V0X2RlZmF1bHRfdHJhbnMpOworCisvKioKKyAqIHY5ZnNfcHV0X3RyYW5zIC0gcHV0IHRyYW5zCisgKiBAbTogdHJhbnNwb3J0IHRvIHB1dAorICoKKyAqLwordm9pZCB2OWZzX3B1dF90cmFucyhzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlICptKQoreworCWlmIChtKQorCQltb2R1bGVfcHV0KG0tPm93bmVyKTsKK30KIAogLyoqCiAgKiB2OWZzX2luaXQgLSBJbml0aWFsaXplIG1vZHVsZQpAQCAtMTIwLDYgKzE2MCw4IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wOSh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIlVubG9hZGluZyA5UDIwMDAgc3VwcG9ydFxuIik7CisKKwlwOV90cmFuc19mZF9leGl0KCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfcDkpCmRpZmYgLS1naXQgYS9uZXQvOXAvdHJhbnNfZmQuYyBiL25ldC85cC90cmFuc19mZC5jCmluZGV4IGNkZjEzN2EuLjZkYWJiZGIgMTAwNjQ0Ci0tLSBhL25ldC85cC90cmFuc19mZC5jCisrKyBiL25ldC85cC90cmFuc19mZC5jCkBAIC04Niw3ICs4Niw3IEBACiAJT3B0X3BvcnQsIE9wdF9yZmRubywgT3B0X3dmZG5vLCBPcHRfZXJyLAogfTsKIAotc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtPcHRfcG9ydCwgInBvcnQ9JXUifSwKIAl7T3B0X3JmZG5vLCAicmZkbm89JXUifSwKIAl7T3B0X3dmZG5vLCAid2Zkbm89JXUifSwKQEAgLTE1MSw3ICsxNTEsNiBAQAogICogQHRyYW5zOiByZWZlcmVuY2UgdG8gdHJhbnNwb3J0IGluc3RhbmNlIGZvciB0aGlzIGNvbm5lY3Rpb24KICAqIEB0YWdwb29sOiBpZCBhY2NvdW50aW5nIGZvciB0cmFuc2FjdGlvbnMKICAqIEBlcnI6IGVycm9yIHN0YXRlCi0gKiBAZXF1ZXVlOiBldmVudCB3YWl0X3EgKD8pCiAgKiBAcmVxX2xpc3Q6IGFjY291bnRpbmcgZm9yIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBzZW50CiAgKiBAdW5zZW50X3JlcV9saXN0OiBhY2NvdW50aW5nIGZvciByZXF1ZXN0cyB0aGF0IGhhdmVuJ3QgYmVlbiBzZW50CiAgKiBAcmNhbGw6IGN1cnJlbnQgcmVzcG9uc2UgJnA5X2ZjYWxsIHN0cnVjdHVyZQpAQCAtMTc4LDcgKzE3Nyw2IEBACiAJc3RydWN0IHA5X3RyYW5zICp0cmFuczsKIAlzdHJ1Y3QgcDlfaWRwb29sICp0YWdwb29sOwogCWludCBlcnI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXF1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgcmVxX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCB1bnNlbnRfcmVxX2xpc3Q7CiAJc3RydWN0IHA5X2ZjYWxsICpyY2FsbDsKQEAgLTI0MCwyMiArMjM4LDYgQEAKIAogc3RhdGljIHZvaWQgcDlfY29ubl9jYW5jZWwoc3RydWN0IHA5X2Nvbm4gKm0sIGludCBlcnIpOwogCi1zdGF0aWMgaW50IHA5X211eF9nbG9iYWxfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocDlfbXV4X3BvbGxfdGFza3MpOyBpKyspCi0JCXA5X211eF9wb2xsX3Rhc2tzW2ldLnRhc2sgPSBOVUxMOwotCi0JcDlfbXV4X3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgidjlmcyIpOwotCWlmICghcDlfbXV4X3dxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInY5ZnM6IG11eDogY3JlYXRpbmcgd29ya3F1ZXVlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdTE2IHA5X211eF9nZXRfdGFnKHN0cnVjdCBwOV9jb25uICptKQogewogCWludCB0YWc7CkBAIC00MDksMTEgKzM5MSwxMSBAQAogc3RhdGljIHN0cnVjdCBwOV9jb25uICpwOV9jb25uX2NyZWF0ZShzdHJ1Y3QgcDlfdHJhbnMgKnRyYW5zKQogewogCWludCBpLCBuOwotCXN0cnVjdCBwOV9jb25uICptLCAqbXRtcDsKKwlzdHJ1Y3QgcDlfY29ubiAqbTsKIAogCVA5X0RQUklOVEsoUDlfREVCVUdfTVVYLCAidHJhbnNwb3J0ICVwIG1zaXplICVkXG4iLCB0cmFucywKIAkJCQkJCQkJdHJhbnMtPm1zaXplKTsKLQltID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHA5X2Nvbm4pLCBHRlBfS0VSTkVMKTsKKwltID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHA5X2Nvbm4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW0pCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCkBAIC00MjQsMjUgKzQwNiwxNCBAQAogCW0tPnRyYW5zID0gdHJhbnM7CiAJbS0+dGFncG9vbCA9IHA5X2lkcG9vbF9jcmVhdGUoKTsKIAlpZiAoSVNfRVJSKG0tPnRhZ3Bvb2wpKSB7Ci0JCW10bXAgPSBFUlJfUFRSKC1FTk9NRU0pOwogCQlrZnJlZShtKTsKLQkJcmV0dXJuIG10bXA7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAotCW0tPmVyciA9IDA7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbS0+ZXF1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmbS0+cmVxX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZtLT51bnNlbnRfcmVxX2xpc3QpOwotCW0tPnJjYWxsID0gTlVMTDsKLQltLT5ycG9zID0gMDsKLQltLT5yYnVmID0gTlVMTDsKLQltLT53cG9zID0gbS0+d3NpemUgPSAwOwotCW0tPndidWYgPSBOVUxMOwogCUlOSVRfV09SSygmbS0+cnEsIHA5X3JlYWRfd29yayk7CiAJSU5JVF9XT1JLKCZtLT53cSwgcDlfd3JpdGVfd29yayk7Ci0JbS0+d3NjaGVkID0gMDsKLQltZW1zZXQoJm0tPnBvbGxfd2FkZHIsIDAsIHNpemVvZihtLT5wb2xsX3dhZGRyKSk7Ci0JbS0+cG9sbF90YXNrID0gTlVMTDsKIAluID0gcDlfbXV4X3BvbGxfc3RhcnQobSk7CiAJaWYgKG4pIHsKIAkJa2ZyZWUobSk7CkBAIC00NjMsMTAgKzQzNCw4IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobS0+cG9sbF93YWRkcik7IGkrKykgewogCQlpZiAoSVNfRVJSKG0tPnBvbGxfd2FkZHJbaV0pKSB7CiAJCQlwOV9tdXhfcG9sbF9zdG9wKG0pOwotCQkJbXRtcCA9ICh2b2lkICopbS0+cG9sbF93YWRkcjsJLyogdGhlIGVycm9yIGNvZGUgKi8KIAkJCWtmcmVlKG0pOwotCQkJbSA9IG10bXA7Ci0JCQlicmVhazsKKwkJCXJldHVybiAodm9pZCAqKW0tPnBvbGxfd2FkZHI7CS8qIHRoZSBlcnJvciBjb2RlICovCiAJCX0KIAl9CiAKQEAgLTQ4MywxOCArNDUyLDEzIEBACiB7CiAJUDlfRFBSSU5USyhQOV9ERUJVR19NVVgsICJtdXggJXAgcHJldiAlcCBuZXh0ICVwXG4iLCBtLAogCQltLT5tdXhfbGlzdC5wcmV2LCBtLT5tdXhfbGlzdC5uZXh0KTsKLQlwOV9jb25uX2NhbmNlbChtLCAtRUNPTk5SRVNFVCk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJm0tPnJlcV9saXN0KSkgewotCQkvKiB3YWl0IHVudGlsIGFsbCBwcm9jZXNzZXMgd2FpdGluZyBvbiB0aGlzIHNlc3Npb24gZXhpdCAqLwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX01VWCwKLQkJCSJtdXggJXAgd2FpdGluZyBmb3IgZW1wdHkgcmVxdWVzdCBxdWV1ZVxuIiwgbSk7Ci0JCXdhaXRfZXZlbnRfdGltZW91dChtLT5lcXVldWUsIChsaXN0X2VtcHR5KCZtLT5yZXFfbGlzdCkpLCA1MDAwKTsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19NVVgsICJtdXggJXAgcmVxdWVzdCBxdWV1ZSBlbXB0eTogJWRcbiIsIG0sCi0JCQlsaXN0X2VtcHR5KCZtLT5yZXFfbGlzdCkpOwotCX0KIAogCXA5X211eF9wb2xsX3N0b3AobSk7CisJY2FuY2VsX3dvcmtfc3luYygmbS0+cnEpOworCWNhbmNlbF93b3JrX3N5bmMoJm0tPndxKTsKKworCXA5X2Nvbm5fY2FuY2VsKG0sIC1FQ09OTlJFU0VUKTsKKwogCW0tPnRyYW5zID0gTlVMTDsKIAlwOV9pZHBvb2xfZGVzdHJveShtLT50YWdwb29sKTsKIAlrZnJlZShtKTsKQEAgLTg0MCw4ICs4MDQsNiBAQAogCQkJCQkoKnJlcS0+Y2IpIChyZXEsIHJlcS0+Y2JhKTsKIAkJCQllbHNlCiAJCQkJCWtmcmVlKHJlcS0+cmNhbGwpOwotCi0JCQkJd2FrZV91cCgmbS0+ZXF1ZXVlKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChlcnIgPj0gMCAmJiByY2FsbC0+aWQgIT0gUDlfUkZMVVNIKQpAQCAtOTA4LDggKzg3MCwxMCBAQAogCWVsc2UKIAkJbiA9IHA5X211eF9nZXRfdGFnKG0pOwogCi0JaWYgKG4gPCAwKQorCWlmIChuIDwgMCkgeworCQlrZnJlZShyZXEpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CiAKIAlwOV9zZXRfdGFnKHRjLCBuKTsKIApAQCAtOTg0LDggKzk0OCw2IEBACiAJCQkoKnJlcS0+Y2IpIChyZXEsIHJlcS0+Y2JhKTsKIAkJZWxzZQogCQkJa2ZyZWUocmVxLT5yY2FsbCk7Ci0KLQkJd2FrZV91cCgmbS0+ZXF1ZXVlKTsKIAl9CiAKIAlrZnJlZShmcmVxLT50Y2FsbCk7CkBAIC0xMTkxLDggKzExNTMsNiBAQAogCQllbHNlCiAJCQlrZnJlZShyZXEtPnJjYWxsKTsKIAl9Ci0KLQl3YWtlX3VwKCZtLT5lcXVldWUpOwogfQogCiAvKioKQEAgLTEzNzAsNyArMTMzMCw2IEBACiB7CiAJaW50IHJldCwgbjsKIAlzdHJ1Y3QgcDlfdHJhbnNfZmQgKnRzID0gTlVMTDsKLQltbV9zZWdtZW50X3Qgb2xkZnM7CiAKIAlpZiAodHJhbnMgJiYgdHJhbnMtPnN0YXR1cyA9PSBDb25uZWN0ZWQpCiAJCXRzID0gdHJhbnMtPnByaXY7CkBAIC0xMzg0LDI0ICsxMzQzLDE3IEBACiAJaWYgKCF0cy0+d3ItPmZfb3AgfHwgIXRzLT53ci0+Zl9vcC0+cG9sbCkKIAkJcmV0dXJuIC1FSU87CiAKLQlvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0KIAlyZXQgPSB0cy0+cmQtPmZfb3AtPnBvbGwodHMtPnJkLCBwdCk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZW5kOworCQlyZXR1cm4gcmV0OwogCiAJaWYgKHRzLT5yZCAhPSB0cy0+d3IpIHsKIAkJbiA9IHRzLT53ci0+Zl9vcC0+cG9sbCh0cy0+d3IsIHB0KTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXQgPSBuOwotCQkJZ290byBlbmQ7Ci0JCX0KKwkJaWYgKG4gPCAwKQorCQkJcmV0dXJuIG47CiAJCXJldCA9IChyZXQgJiB+UE9MTE9VVCkgfCAobiAmIH5QT0xMSU4pOwogCX0KIAotZW5kOgotCXNldF9mcyhvbGRmcyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTYyOSw2ICsxNTgxLDcgQEAKIAkubWF4c2l6ZSA9IE1BWF9TT0NLX0JVRiwKIAkuZGVmID0gMSwKIAkuY3JlYXRlID0gcDlfdHJhbnNfY3JlYXRlX3RjcCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlIHA5X3VuaXhfdHJhbnMgPSB7CkBAIC0xNjM2LDYgKzE1ODksNyBAQAogCS5tYXhzaXplID0gTUFYX1NPQ0tfQlVGLAogCS5kZWYgPSAwLAogCS5jcmVhdGUgPSBwOV90cmFuc19jcmVhdGVfdW5peCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcDlfdHJhbnNfbW9kdWxlIHA5X2ZkX3RyYW5zID0gewpAQCAtMTY0MywxNCArMTU5NywyMCBAQAogCS5tYXhzaXplID0gTUFYX1NPQ0tfQlVGLAogCS5kZWYgPSAwLAogCS5jcmVhdGUgPSBwOV90cmFuc19jcmVhdGVfZmQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBpbnQgcDlfdHJhbnNfZmRfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBwOV9tdXhfZ2xvYmFsX2luaXQoKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIjlwOiBzdGFydGluZyBtdXggZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHA5X211eF9wb2xsX3Rhc2tzKTsgaSsrKQorCQlwOV9tdXhfcG9sbF90YXNrc1tpXS50YXNrID0gTlVMTDsKKworCXA5X211eF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInY5ZnMiKTsKKwlpZiAoIXA5X211eF93cSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2OWZzOiBtdXg6IGNyZWF0aW5nIHdvcmtxdWV1ZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAl2OWZzX3JlZ2lzdGVyX3RyYW5zKCZwOV90Y3BfdHJhbnMpOwpAQCAtMTY1OSw0ICsxNjE5LDEyIEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocDlfdHJhbnNfZmRfaW5pdCk7CisKK3ZvaWQgcDlfdHJhbnNfZmRfZXhpdCh2b2lkKQoreworCXY5ZnNfdW5yZWdpc3Rlcl90cmFucygmcDlfdGNwX3RyYW5zKTsKKwl2OWZzX3VucmVnaXN0ZXJfdHJhbnMoJnA5X3VuaXhfdHJhbnMpOworCXY5ZnNfdW5yZWdpc3Rlcl90cmFucygmcDlfZmRfdHJhbnMpOworCisJZGVzdHJveV93b3JrcXVldWUocDlfbXV4X3dxKTsKK30KZGlmZiAtLWdpdCBhL25ldC85cC90cmFuc192aXJ0aW8uYyBiL25ldC85cC90cmFuc192aXJ0aW8uYwppbmRleCA0MmFkYzA1Li45NDkxMmUwIDEwMDY0NAotLS0gYS9uZXQvOXAvdHJhbnNfdmlydGlvLmMKKysrIGIvbmV0LzlwL3RyYW5zX3ZpcnRpby5jCkBAIC01MjgsNiArNTI4LDcgQEAKIAkuY3JlYXRlID0gcDlfdmlydGlvX2NyZWF0ZSwKIAkubWF4c2l6ZSA9IFBBR0VfU0laRSoxNiwKIAkuZGVmID0gMCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIC8qIFRoZSBzdGFuZGFyZCBpbml0IGZ1bmN0aW9uICovCkBAIC01NDUsNiArNTQ2LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwOV92aXJ0aW9fY2xlYW51cCh2b2lkKQogewogCXVucmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmcDlfdmlydGlvX2Rydik7CisJdjlmc191bnJlZ2lzdGVyX3RyYW5zKCZwOV92aXJ0aW9fdHJhbnMpOwogfQogCiBtb2R1bGVfaW5pdChwOV92aXJ0aW9faW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDc2MTJjYzguLmQ3ODlkNzkgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0xODAsNiArMTgwLDcgQEAKIHNvdXJjZSAibmV0L2F0bS9LY29uZmlnIgogc291cmNlICJuZXQvODAyL0tjb25maWciCiBzb3VyY2UgIm5ldC9icmlkZ2UvS2NvbmZpZyIKK3NvdXJjZSAibmV0L2RzYS9LY29uZmlnIgogc291cmNlICJuZXQvODAyMXEvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2RlY25ldC9LY29uZmlnIgogc291cmNlICJuZXQvbGxjL0tjb25maWciCkBAIC0yMzIsMTggKzIzMywyMyBAQAogc291cmNlICJuZXQvaXJkYS9LY29uZmlnIgogc291cmNlICJuZXQvYmx1ZXRvb3RoL0tjb25maWciCiBzb3VyY2UgIm5ldC9yeHJwYy9LY29uZmlnIgorc291cmNlICJuZXQvcGhvbmV0L0tjb25maWciCiAKIGNvbmZpZyBGSUJfUlVMRVMKIAlib29sCiAKLW1lbnUgIldpcmVsZXNzIgorbWVudWNvbmZpZyBXSVJFTEVTUworCWJvb2wgIldpcmVsZXNzIgogCWRlcGVuZHMgb24gIVMzOTAKKwlkZWZhdWx0IHkKKworaWYgV0lSRUxFU1MKIAogc291cmNlICJuZXQvd2lyZWxlc3MvS2NvbmZpZyIKIHNvdXJjZSAibmV0L21hYzgwMjExL0tjb25maWciCiBzb3VyY2UgIm5ldC9pZWVlODAyMTEvS2NvbmZpZyIKIAotZW5kbWVudQorZW5kaWYgIyBXSVJFTEVTUwogCiBzb3VyY2UgIm5ldC9yZmtpbGwvS2NvbmZpZyIKIHNvdXJjZSAibmV0LzlwL0tjb25maWciCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggNGY0M2U3Zi4uMjdkMWYxMCAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtMjYsNiArMjYsNyBAQAogb2JqLSQoQ09ORklHX05FVF9LRVkpCQkrPSBrZXkvCiBvYmotJChDT05GSUdfTkVUX1NDSEVEKQkJKz0gc2NoZWQvCiBvYmotJChDT05GSUdfQlJJREdFKQkJKz0gYnJpZGdlLworb2JqLSQoQ09ORklHX05FVF9EU0EpCQkrPSBkc2EvCiBvYmotJChDT05GSUdfSVBYKQkJKz0gaXB4Lwogb2JqLSQoQ09ORklHX0FUQUxLKQkJKz0gYXBwbGV0YWxrLwogb2JqLSQoQ09ORklHX1dBTl9ST1VURVIpCSs9IHdhbnJvdXRlci8KQEAgLTQyLDYgKzQzLDcgQEAKIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfREVDTkVUKQkJKz0gZGVjbmV0Lwogb2JqLSQoQ09ORklHX0VDT05FVCkJCSs9IGVjb25ldC8KK29iai0kKENPTkZJR19QSE9ORVQpCQkrPSBwaG9uZXQvCiBpZm5lcSAoJChDT05GSUdfVkxBTl84MDIxUSksKQogb2JqLXkJCQkJKz0gODAyMXEvCiBlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggMGM4NTA0Mi4uZDMxMzRlNyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0yLDcgKzIsNyBAQAogICoJRERQOglBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBwbGVUYWxrIEREUCBwcm90b2NvbCBmb3IKICAqCQlFdGhlcm5ldCAnRUxBUCcuCiAgKgotICoJCUFsYW4gQ294ICA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294ICA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqCQlXaXRoIG1vcmUgdGhhbiBhIGxpdHRsZSBhc3Npc3RhbmNlIGZyb20KICAqCkBAIC0xOTM0LDYgKzE5MzQsNiBAQAogbW9kdWxlX2V4aXQoYXRhbGtfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZVRhbGsgMC4yMFxuIik7CiBNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfQVBQTEVUQUxLKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vYnIyNjg0LmMgYi9uZXQvYXRtL2JyMjY4NC5jCmluZGV4IDhkOWE2ZjEuLjI4MGRlNDggMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYnIyNjg0LmMKKysrIGIvbmV0L2F0bS9icjI2ODQuYwpAQCAtMzc1LDExICszNzUsMTEgQEAKIAkJCWlmIChtZW1jbXAKIAkJCSAgICAoc2tiLT5kYXRhICsgNiwgZXRoZXJ0eXBlX2lwdjYsCiAJCQkgICAgIHNpemVvZihldGhlcnR5cGVfaXB2NikpID09IDApCi0JCQkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CisJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOwogCQkJZWxzZSBpZiAobWVtY21wCiAJCQkJIChza2ItPmRhdGEgKyA2LCBldGhlcnR5cGVfaXB2NCwKIAkJCQkgIHNpemVvZihldGhlcnR5cGVfaXB2NCkpID09IDApCi0JCQkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOworCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJCQllbHNlCiAJCQkJZ290byBlcnJvcjsKIAkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKGxsY19vdWlfaXB2NCkpOwpAQCAtNDA0LDkgKzQwNCw5IEBACiAJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJCWlwaCA9IGlwX2hkcihza2IpOwogCQkJaWYgKGlwaC0+dmVyc2lvbiA9PSA0KQotCQkJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKKwkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCQkJZWxzZSBpZiAoaXBoLT52ZXJzaW9uID09IDYpCi0JCQkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CisJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOwogCQkJZWxzZQogCQkJCWdvdG8gZXJyb3I7CiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5jIGIvbmV0L2F0bS9sZWMuYwppbmRleCA1Nzk5ZmI1Li44ZjcwMWNkIDEwMDY0NAotLS0gYS9uZXQvYXRtL2xlYy5jCisrKyBiL25ldC9hdG0vbGVjLmMKQEAgLTE5MzEsNyArMTkzMSw2IEBACiAJCXN3aXRjaCAocHJpdi0+bGFuZV92ZXJzaW9uKSB7CiAJCWNhc2UgMToKIAkJCXJldHVybiBwcml2LT5tY2FzdF92Y2M7Ci0JCQlicmVhazsKIAkJY2FzZSAyOgkvKiBMQU5FMiB3YW50cyBhcnAgZm9yIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KIAkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKG1hY190b19maW5kLCBidXNfbWFjKSkKIAkJCQlyZXR1cm4gcHJpdi0+bWNhc3RfdmNjOwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IDAxYzgzZTIuLjI4YzcxNTcgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTMxNyw2ICszMTcsOSBAQAogCQkJCS8qIFF1ZXVlIHRoZSB1bmFjY2VwdGVkIHNvY2tldCBmb3IgZGVhdGggKi8KIAkJCQlzb2NrX29ycGhhbihza2ItPnNrKTsKIAorCQkJCS8qIDlBNEdMOiBoYWNrIHRvIHJlbGVhc2UgdW5hY2NlcHRlZCBzb2NrZXRzICovCisJCQkJc2tiLT5zay0+c2tfc3RhdGUgPSBUQ1BfTElTVEVOOworCiAJCQkJYXgyNV9zdGFydF9oZWFydGJlYXQoc2F4MjUpOwogCQkJCXNheDI1LT5zdGF0ZSA9IEFYMjVfU1RBVEVfMDsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfc3RkX3RpbWVyLmMgYi9uZXQvYXgyNS9heDI1X3N0ZF90aW1lci5jCmluZGV4IGNkYzdlNzUuLjk2ZTRiOTIgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfc3RkX3RpbWVyLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9zdGRfdGltZXIuYwpAQCAtMzksOSArMzksMTEgQEAKIAogCXN3aXRjaCAoYXgyNS0+c3RhdGUpIHsKIAljYXNlIEFYMjVfU1RBVEVfMDoKLQkJaWYgKCFzayB8fAotCQkgICAgc29ja19mbGFnKHNrLCBTT0NLX0RFU1RST1kpIHx8Ci0JCSAgICBzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJLyogTWFnaWMgaGVyZTogSWYgd2UgbGlzdGVuKCkgYW5kIGEgbmV3IGxpbmsgZGllcyBiZWZvcmUgaXQKKwkJICAgaXMgYWNjZXB0ZWQoKSBpdCBpc24ndCAnZGVhZCcgc28gZG9lc24ndCBnZXQgcmVtb3ZlZC4gKi8KKwkJaWYgKCFzayB8fCBzb2NrX2ZsYWcoc2ssIFNPQ0tfREVTVFJPWSkgfHwKKwkJICAgIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTiAmJgorCQkgICAgIHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkpIHsKIAkJCWlmIChzaykgewogCQkJCXNvY2tfaG9sZChzayk7CiAJCQkJYXgyNV9kZXN0cm95X3NvY2tldChheDI1KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCmluZGV4IDFlZGZkZjQuLmY2MzQ4ZTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtNDksNyArNDksNyBAQAogI2RlZmluZSBCVF9EQkcoRC4uLikKICNlbmRpZgogCi0jZGVmaW5lIFZFUlNJT04gIjIuMTIiCisjZGVmaW5lIFZFUlNJT04gIjIuMTMiCiAKIC8qIEJsdWV0b290aCBzb2NrZXRzICovCiAjZGVmaW5lIEJUX01BWF9QUk9UTwk4CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggY2E4ZDA1Mi4uYjcwMDI0MiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtMzMwLDcgKzMzMCw3IEBACiAKIC8qIENyZWF0ZSBTQ08gb3IgQUNMIGNvbm5lY3Rpb24uCiAgKiBEZXZpY2UgX211c3RfIGJlIGxvY2tlZCAqLwotc3RydWN0IGhjaV9jb25uICpoY2lfY29ubmVjdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIGJkYWRkcl90ICpkc3QpCitzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCwgX191OCBhdXRoX3R5cGUpCiB7CiAJc3RydWN0IGhjaV9jb25uICphY2w7CiAJc3RydWN0IGhjaV9jb25uICpzY287CkBAIC0zNDQsOCArMzQ0LDEwIEBACiAKIAloY2lfY29ubl9ob2xkKGFjbCk7CiAKLQlpZiAoYWNsLT5zdGF0ZSA9PSBCVF9PUEVOIHx8IGFjbC0+c3RhdGUgPT0gQlRfQ0xPU0VEKQorCWlmIChhY2wtPnN0YXRlID09IEJUX09QRU4gfHwgYWNsLT5zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJYWNsLT5hdXRoX3R5cGUgPSBhdXRoX3R5cGU7CiAJCWhjaV9hY2xfY29ubmVjdChhY2wpOworCX0KIAogCWlmICh0eXBlID09IEFDTF9MSU5LKQogCQlyZXR1cm4gYWNsOwpAQCAtMzc0LDYgKzM3NiwxOSBAQAogfQogRVhQT1JUX1NZTUJPTChoY2lfY29ubmVjdCk7CiAKKy8qIENoZWNrIGxpbmsgc2VjdXJpdHkgcmVxdWlyZW1lbnQgKi8KK2ludCBoY2lfY29ubl9jaGVja19saW5rX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJaWYgKGNvbm4tPnNzcF9tb2RlID4gMCAmJiBjb25uLT5oZGV2LT5zc3BfbW9kZSA+IDAgJiYKKwkJCQkJIShjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9jb25uX2NoZWNrX2xpbmtfbW9kZSk7CisKIC8qIEF1dGhlbnRpY2F0ZSByZW1vdGUgZGV2aWNlICovCiBpbnQgaGNpX2Nvbm5fYXV0aChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CkBAIC0zODEsNyArMzk2LDcgQEAKIAogCWlmIChjb25uLT5zc3BfbW9kZSA+IDAgJiYgY29ubi0+aGRldi0+c3NwX21vZGUgPiAwKSB7CiAJCWlmICghKGNvbm4tPmF1dGhfdHlwZSAmIDB4MDEpKSB7Ci0JCQljb25uLT5hdXRoX3R5cGUgPSBIQ0lfQVRfR0VORVJBTF9CT05ESU5HX01JVE07CisJCQljb25uLT5hdXRoX3R5cGUgfD0gMHgwMTsKIAkJCWNvbm4tPmxpbmtfbW9kZSAmPSB+SENJX0xNX0FVVEg7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKaW5kZXggZjViMjFjYi4uMjc4YTNhYyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtMTY0LDYgKzE2NCw5IEBACiB7CiAJaW50IHJldDsKIAorCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVORVRET1dOOworCiAJLyogU2VyaWFsaXplIGFsbCByZXF1ZXN0cyAqLwogCWhjaV9yZXFfbG9jayhoZGV2KTsKIAlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIHJlcSwgb3B0LCB0aW1lb3V0KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IDBlM2RiMjguLmFkN2E1NTMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtMTYwNSwxNCArMTYwNSwxMSBAQAogCiAJCWlmIChjb25uLT5zdGF0ZSA9PSBCVF9DT05GSUcpIHsKIAkJCWlmICghZXYtPnN0YXR1cyAmJiBoZGV2LT5zc3BfbW9kZSA+IDAgJiYKLQkJCQkJCQljb25uLT5zc3BfbW9kZSA+IDApIHsKLQkJCQlpZiAoY29ubi0+b3V0KSB7Ci0JCQkJCXN0cnVjdCBoY2lfY3BfYXV0aF9yZXF1ZXN0ZWQgY3A7Ci0JCQkJCWNwLmhhbmRsZSA9IGV2LT5oYW5kbGU7Ci0JCQkJCWhjaV9zZW5kX2NtZChoZGV2LAotCQkJCQkJSENJX09QX0FVVEhfUkVRVUVTVEVELAorCQkJCQljb25uLT5zc3BfbW9kZSA+IDAgJiYgY29ubi0+b3V0KSB7CisJCQkJc3RydWN0IGhjaV9jcF9hdXRoX3JlcXVlc3RlZCBjcDsKKwkJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQkJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfQVVUSF9SRVFVRVNURUQsCiAJCQkJCQkJc2l6ZW9mKGNwKSwgJmNwKTsKLQkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOwogCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDk2NDM0ZDcuLmFjZGVhYjMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJaWYgKHNlc3Npb24tPmhpZCkgewogCQlpZiAoc2Vzc2lvbi0+aGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCiAJCQloaWRpbnB1dF9kaXNjb25uZWN0KHNlc3Npb24tPmhpZCk7Ci0JCWhpZF9mcmVlX2RldmljZShzZXNzaW9uLT5oaWQpOworCQloaWRfZGVzdHJveV9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKIAl9CiAKIAkvKiBXYWtldXAgdXNlci1zcGFjZSBwb2xsaW5nIGZvciBzb2NrZXQgZXJyb3JzICovCkBAIC02MjMsOSArNjIzLDE1IEBACiBzdGF0aWMgaW50IGhpZHBfc2V0dXBfaW5wdXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQlzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSAqcmVxKQogewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gc2Vzc2lvbi0+aW5wdXQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CiAJaW50IGk7CiAKKwlpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXQpCisJCXJldHVybiAtRU5PTUVNOworCisJc2Vzc2lvbi0+aW5wdXQgPSBpbnB1dDsKKwogCWlucHV0X3NldF9kcnZkYXRhKGlucHV0LCBzZXNzaW9uKTsKIAogCWlucHV0LT5uYW1lID0gIkJsdWV0b290aCBISUQgQm9vdCBQcm90b2NvbCBEZXZpY2UiOwpAQCAtNjc3LDY3ICs2ODMsMTE0IEBACiB7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCV9fdTE2IGlkVmVuZG9yOwotCV9fdTE2IGlkUHJvZHVjdDsKLQl1bnNpZ25lZCBxdWlya3M7Ci19IGhpZHBfYmxhY2tsaXN0W10gPSB7Ci0JLyogQXBwbGUgd2lyZWxlc3MgTWlnaHR5IE1vdXNlICovCi0JeyAweDA1YWMsIDB4MDMwYywgSElEX1FVSVJLX01JR0hUWU1PVVNFIHwgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwgfSwKLQotCXsgfQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotc3RhdGljIHZvaWQgaGlkcF9zZXR1cF9xdWlya3Moc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3N0YXRpYyBpbnQgaGlkcF9wYXJzZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewotCXVuc2lnbmVkIGludCBuOworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBoaWQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEgPSBzZXNzaW9uLT5yZXE7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCByZXQ7CiAKLQlmb3IgKG4gPSAwOyBoaWRwX2JsYWNrbGlzdFtuXS5pZFZlbmRvcjsgbisrKQotCQlpZiAoaGlkcF9ibGFja2xpc3Rbbl0uaWRWZW5kb3IgPT0gbGUxNl90b19jcHUoaGlkLT52ZW5kb3IpICYmCi0JCQkJaGlkcF9ibGFja2xpc3Rbbl0uaWRQcm9kdWN0ID09IGxlMTZfdG9fY3B1KGhpZC0+cHJvZHVjdCkpCi0JCQloaWQtPnF1aXJrcyA9IGhpZHBfYmxhY2tsaXN0W25dLnF1aXJrczsKKwlidWYgPSBrbWFsbG9jKHJlcS0+cmRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgcmVxLT5yZF9kYXRhLCByZXEtPnJkX3NpemUpKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldCA9IGhpZF9wYXJzZV9yZXBvcnQoc2Vzc2lvbi0+aGlkLCBidWYsIHJlcS0+cmRfc2l6ZSk7CisKKwlrZnJlZShidWYpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNlc3Npb24tPnJlcSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaGlkcF9zZXR1cF9oaWQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwKK3N0YXRpYyBpbnQgaGlkcF9zdGFydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBoaWQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0uCisJCQlyZXBvcnRfbGlzdCwgbGlzdCkKKwkJaGlkcF9zZW5kX3JlcG9ydChzZXNzaW9uLCByZXBvcnQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0uCisJCQlyZXBvcnRfbGlzdCwgbGlzdCkKKwkJaGlkcF9zZW5kX3JlcG9ydChzZXNzaW9uLCByZXBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpZHBfc3RvcChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBoaWQtPmRyaXZlcl9kYXRhOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKKwlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOworCisJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQorCQloaWRpbnB1dF9kaXNjb25uZWN0KGhpZCk7CisJaGlkLT5jbGFpbWVkID0gMDsKK30KKworc3RhdGljIHN0cnVjdCBoaWRfbGxfZHJpdmVyIGhpZHBfaGlkX2RyaXZlciA9IHsKKwkucGFyc2UgPSBoaWRwX3BhcnNlLAorCS5zdGFydCA9IGhpZHBfc3RhcnQsCisJLnN0b3AgPSBoaWRwX3N0b3AsCisJLm9wZW4gID0gaGlkcF9vcGVuLAorCS5jbG9zZSA9IGhpZHBfY2xvc2UsCisJLmhpZGlucHV0X2lucHV0X2V2ZW50ID0gaGlkcF9oaWRpbnB1dF9ldmVudCwKK307CisKK3N0YXRpYyBpbnQgaGlkcF9zZXR1cF9oaWQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQlzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSAqcmVxKQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBzZXNzaW9uLT5oaWQ7Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwogCWJkYWRkcl90IHNyYywgZHN0OworCWludCByZXQ7CisKKwloaWQgPSBoaWRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKElTX0VSUihoaWQpKSB7CisJCXJldCA9IFBUUl9FUlIoc2Vzc2lvbi0+aGlkKTsKKwkJZ290byBlcnI7CisJfQorCisJc2Vzc2lvbi0+aGlkID0gaGlkOworCXNlc3Npb24tPnJlcSA9IHJlcTsKKwloaWQtPmRyaXZlcl9kYXRhID0gc2Vzc2lvbjsKIAogCWJhc3dhcCgmc3JjLCAmYnRfc2soc2Vzc2lvbi0+Y3RybF9zb2NrLT5zayktPnNyYyk7CiAJYmFzd2FwKCZkc3QsICZidF9zayhzZXNzaW9uLT5jdHJsX3NvY2stPnNrKS0+ZHN0KTsKIAotCWhpZC0+ZHJpdmVyX2RhdGEgPSBzZXNzaW9uOwotCi0JaGlkLT5jb3VudHJ5ID0gcmVxLT5jb3VudHJ5OwotCiAJaGlkLT5idXMgICAgID0gQlVTX0JMVUVUT09USDsKIAloaWQtPnZlbmRvciAgPSByZXEtPnZlbmRvcjsKIAloaWQtPnByb2R1Y3QgPSByZXEtPnByb2R1Y3Q7CiAJaGlkLT52ZXJzaW9uID0gcmVxLT52ZXJzaW9uOworCWhpZC0+Y291bnRyeSA9IHJlcS0+Y291bnRyeTsKIAogCXN0cm5jcHkoaGlkLT5uYW1lLCByZXEtPm5hbWUsIDEyOCk7CiAJc3RybmNweShoaWQtPnBoeXMsIGJhdG9zdHIoJnNyYyksIDY0KTsKIAlzdHJuY3B5KGhpZC0+dW5pcSwgYmF0b3N0cigmZHN0KSwgNjQpOwogCi0JaGlkLT5kZXYgPSBoaWRwX2dldF9kZXZpY2Uoc2Vzc2lvbik7CisJaGlkLT5kZXYucGFyZW50ID0gaGlkcF9nZXRfZGV2aWNlKHNlc3Npb24pOworCWhpZC0+bGxfZHJpdmVyID0gJmhpZHBfaGlkX2RyaXZlcjsKIAotCWhpZC0+aGlkX29wZW4gID0gaGlkcF9vcGVuOwotCWhpZC0+aGlkX2Nsb3NlID0gaGlkcF9jbG9zZTsKKwlyZXQgPSBoaWRfYWRkX2RldmljZShoaWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hpZDsKIAotCWhpZC0+aGlkaW5wdXRfaW5wdXRfZXZlbnQgPSBoaWRwX2hpZGlucHV0X2V2ZW50OwotCi0JaGlkcF9zZXR1cF9xdWlya3MoaGlkKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfSU5QVVRfUkVQT1JUXS5yZXBvcnRfbGlzdCwgbGlzdCkKLQkJaGlkcF9zZW5kX3JlcG9ydChzZXNzaW9uLCByZXBvcnQpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCi0JCWhpZHBfc2VuZF9yZXBvcnQoc2Vzc2lvbiwgcmVwb3J0KTsKLQotCWlmIChoaWRpbnB1dF9jb25uZWN0KGhpZCkgPT0gMCkKLQkJaGlkLT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0lOUFVUOworCXJldHVybiAwOworZXJyX2hpZDoKKwloaWRfZGVzdHJveV9kZXZpY2UoaGlkKTsKKwlzZXNzaW9uLT5oaWQgPSBOVUxMOworZXJyOgorCXJldHVybiByZXQ7CiB9CiAKIGludCBoaWRwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKmN0cmxfc29jaywgc3RydWN0IHNvY2tldCAqaW50cl9zb2NrKQpAQCAtNzU3LDM4ICs4MTAsNiBAQAogCiAJQlRfREJHKCJyZF9kYXRhICVwIHJkX3NpemUgJWQiLCByZXEtPnJkX2RhdGEsIHJlcS0+cmRfc2l6ZSk7CiAKLQlpZiAocmVxLT5yZF9zaXplID4gMCkgewotCQl1bnNpZ25lZCBjaGFyICpidWYgPSBrbWFsbG9jKHJlcS0+cmRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKCFidWYpIHsKLQkJCWtmcmVlKHNlc3Npb24pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCByZXEtPnJkX2RhdGEsIHJlcS0+cmRfc2l6ZSkpIHsKLQkJCWtmcmVlKGJ1Zik7Ci0JCQlrZnJlZShzZXNzaW9uKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJc2Vzc2lvbi0+aGlkID0gaGlkX3BhcnNlX3JlcG9ydChidWYsIHJlcS0+cmRfc2l6ZSk7Ci0KLQkJa2ZyZWUoYnVmKTsKLQotCQlpZiAoIXNlc3Npb24tPmhpZCkgewotCQkJa2ZyZWUoc2Vzc2lvbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCWlmICghc2Vzc2lvbi0+aGlkKSB7Ci0JCXNlc3Npb24tPmlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JCWlmICghc2Vzc2lvbi0+aW5wdXQpIHsKLQkJCWtmcmVlKHNlc3Npb24pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KIAlkb3duX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKIAogCXMgPSBfX2hpZHBfZ2V0X3Nlc3Npb24oJmJ0X3NrKGN0cmxfc29jay0+c2spLT5kc3QpOwpAQCAtODE2LDE0ICs4MzcsMTcgQEAKIAlzZXNzaW9uLT5mbGFncyAgID0gcmVxLT5mbGFncyAmICgxIDw8IEhJRFBfQkxVRVRPT1RIX1ZFTkRPUl9JRCk7CiAJc2Vzc2lvbi0+aWRsZV90byA9IHJlcS0+aWRsZV90bzsKIAotCWlmIChzZXNzaW9uLT5pbnB1dCkgewotCQllcnIgPSBoaWRwX3NldHVwX2lucHV0KHNlc3Npb24sIHJlcSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBmYWlsZWQ7CisJaWYgKHJlcS0+cmRfc2l6ZSA+IDApIHsKKwkJZXJyID0gaGlkcF9zZXR1cF9oaWQoc2Vzc2lvbiwgcmVxKTsKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RFVikKKwkJCWdvdG8gZXJyX3NrYjsKIAl9CiAKLQlpZiAoc2Vzc2lvbi0+aGlkKQotCQloaWRwX3NldHVwX2hpZChzZXNzaW9uLCByZXEpOworCWlmICghc2Vzc2lvbi0+aGlkKSB7CisJCWVyciA9IGhpZHBfc2V0dXBfaW5wdXQoc2Vzc2lvbiwgcmVxKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycl9za2I7CisJfQogCiAJX19oaWRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKIApAQCAtODUwLDE3ICs4NzQsMTYgQEAKIAogCV9faGlkcF91bmxpbmtfc2Vzc2lvbihzZXNzaW9uKTsKIAotCWlmIChzZXNzaW9uLT5pbnB1dCkgeworCWlmIChzZXNzaW9uLT5pbnB1dCkKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc2Vzc2lvbi0+aW5wdXQpOwotCQlzZXNzaW9uLT5pbnB1dCA9IE5VTEw7IC8qIGRvbid0IHRyeSB0byBmcmVlIGl0IGhlcmUgKi8KLQl9Ci0KKwlpZiAoc2Vzc2lvbi0+aGlkKQorCQloaWRfZGVzdHJveV9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKK2Vycl9za2I6CisJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKKwlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogZmFpbGVkOgogCXVwX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKIAotCWlmIChzZXNzaW9uLT5oaWQpCi0JCWhpZF9mcmVlX2RldmljZShzZXNzaW9uLT5oaWQpOwotCiAJaW5wdXRfZnJlZV9kZXZpY2Uoc2Vzc2lvbi0+aW5wdXQpOwogCWtmcmVlKHNlc3Npb24pOwogCXJldHVybiBlcnI7CkBAIC05NTAsMTggKzk3Myw0MyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRwX3RhYmxlW10gPSB7CisJeyBISURfQkxVRVRPT1RIX0RFVklDRShISURfQU5ZX0lELCBISURfQU5ZX0lEKSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGhpZHBfZHJpdmVyID0geworCS5uYW1lID0gImdlbmVyaWMtYmx1ZXRvb3RoIiwKKwkuaWRfdGFibGUgPSBoaWRwX3RhYmxlLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaGlkcF9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCWwyY2FwX2xvYWQoKTsKIAogCUJUX0lORk8oIkhJRFAgKEh1bWFuIEludGVyZmFjZSBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOwogCi0JcmV0dXJuIGhpZHBfaW5pdF9zb2NrZXRzKCk7CisJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmaGlkcF9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gaGlkcF9pbml0X3NvY2tldHMoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kcnY7CisKKwlyZXR1cm4gMDsKK2Vycl9kcnY6CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRwX2RyaXZlcik7CitlcnI6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGhpZHBfZXhpdCh2b2lkKQogewogCWhpZHBfY2xlYW51cF9zb2NrZXRzKCk7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRwX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhpZHBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaAppbmRleCAzNDNmYjA1Li5lNTAzYzg5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKQEAgLTE1MSw2ICsxNTEsOCBAQAogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBjdHJsX3RyYW5zbWl0OwogCXN0cnVjdCBza19idWZmX2hlYWQgaW50cl90cmFuc21pdDsKKworCXN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9zY2hlZHVsZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcC5jIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCmluZGV4IDMzOTZkNWIuLjk2MTBhOWMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXAuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKQEAgLTU1LDcgKzU1LDcgQEAKICNkZWZpbmUgQlRfREJHKEQuLi4pCiAjZW5kaWYKIAotI2RlZmluZSBWRVJTSU9OICIyLjEwIgorI2RlZmluZSBWRVJTSU9OICIyLjExIgogCiBzdGF0aWMgdTMyIGwyY2FwX2ZlYXRfbWFzayA9IDB4MDAwMDsKIApAQCAtNzc4LDYgKzc3OCw3IEBACiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm47CiAJc3RydWN0IGhjaV9jb25uICpoY29uOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCV9fdTggYXV0aF90eXBlOwogCWludCBlcnIgPSAwOwogCiAJQlRfREJHKCIlcyAtPiAlcyBwc20gMHglMi4yeCIsIGJhdG9zdHIoc3JjKSwgYmF0b3N0cihkc3QpLCBsMmNhcF9waShzayktPnBzbSk7CkBAIC03ODksNyArNzkwLDIxIEBACiAKIAllcnIgPSAtRU5PTUVNOwogCi0JaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIEFDTF9MSU5LLCBkc3QpOworCWlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX0FVVEggfHwKKwkJCWwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fRU5DUllQVCB8fAorCQkJCWwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fU0VDVVJFKSB7CisJCWlmIChsMmNhcF9waShzayktPnBzbSA9PSBjcHVfdG9fbGUxNigweDAwMDEpKQorCQkJYXV0aF90eXBlID0gSENJX0FUX05PX0JPTkRJTkdfTUlUTTsKKwkJZWxzZQorCQkJYXV0aF90eXBlID0gSENJX0FUX0dFTkVSQUxfQk9ORElOR19NSVRNOworCX0gZWxzZSB7CisJCWlmIChsMmNhcF9waShzayktPnBzbSA9PSBjcHVfdG9fbGUxNigweDAwMDEpKQorCQkJYXV0aF90eXBlID0gSENJX0FUX05PX0JPTkRJTkc7CisJCWVsc2UKKwkJCWF1dGhfdHlwZSA9IEhDSV9BVF9HRU5FUkFMX0JPTkRJTkc7CisJfQorCisJaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIEFDTF9MSU5LLCBkc3QsIGF1dGhfdHlwZSk7CiAJaWYgKCFoY29uKQogCQlnb3RvIGRvbmU7CiAKQEAgLTE1NTMsMTAgKzE1NjgsMTAgQEAKIAlzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKnJlcSA9IChzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKikgZGF0YTsKIAlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOwogCXN0cnVjdCBzb2NrICpzaywgKnBhcmVudDsKLQlpbnQgcmVzdWx0LCBzdGF0dXMgPSAwOworCWludCByZXN1bHQsIHN0YXR1cyA9IEwyQ0FQX0NTX05PX0lORk87CiAKIAl1MTYgZGNpZCA9IDAsIHNjaWQgPSBfX2xlMTZfdG9fY3B1KHJlcS0+c2NpZCk7Ci0JX19sZTE2IHBzbSAgPSByZXEtPnBzbTsKKwlfX2xlMTYgcHNtID0gcmVxLT5wc207CiAKIAlCVF9EQkcoInBzbSAweCUyLjJ4IHNjaWQgMHglNC40eCIsIHBzbSwgc2NpZCk7CiAKQEAgLTE1NjcsNiArMTU4MiwxMyBAQAogCQlnb3RvIHNlbmRyZXNwOwogCX0KIAorCS8qIENoZWNrIGlmIHRoZSBBQ0wgaXMgc2VjdXJlIGVub3VnaCAoaWYgbm90IFNEUCkgKi8KKwlpZiAocHNtICE9IGNwdV90b19sZTE2KDB4MDAwMSkgJiYKKwkJCQkhaGNpX2Nvbm5fY2hlY2tfbGlua19tb2RlKGNvbm4tPmhjb24pKSB7CisJCXJlc3VsdCA9IEwyQ0FQX0NSX1NFQ19CTE9DSzsKKwkJZ290byByZXNwb25zZTsKKwl9CisKIAlyZXN1bHQgPSBMMkNBUF9DUl9OT19NRU07CiAKIAkvKiBDaGVjayBmb3IgYmFja2xvZyBzaXplICovCkBAIC0yMjI0LDcgKzIyNDYsNyBAQAogCQkJcnNwLnNjaWQgICA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CiAJCQlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAkJCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOwotCQkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KDApOworCQkJcnNwLnN0YXR1cyA9IGNwdV90b19sZTE2KEwyQ0FQX0NTX05PX0lORk8pOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKIAkJCQkJTDJDQVBfQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKIAkJfQpAQCAtMjI5Niw3ICsyMzE4LDcgQEAKIAkJCXJzcC5zY2lkICAgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwogCQkJcnNwLmRjaWQgICA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CiAJCQlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKLQkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNigwKTsKKwkJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihMMkNBUF9DU19OT19JTkZPKTsKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX3BpKHNrKS0+aWRlbnQsCiAJCQkJCUwyQ0FQX0NPTk5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc2NvLmMgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCmluZGV4IGExNjAxMWYuLjBjYzkxZTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc2NvLmMKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJZWxzZQogCQl0eXBlID0gU0NPX0xJTks7CiAKLQloY29uID0gaGNpX2Nvbm5lY3QoaGRldiwgdHlwZSwgZHN0KTsKKwloY29uID0gaGNpX2Nvbm5lY3QoaGRldiwgdHlwZSwgZHN0LCBIQ0lfQVRfTk9fQk9ORElORyk7CiAJaWYgKCFoY29uKQogCQlnb3RvIGRvbmU7CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnIuYyBiL25ldC9icmlkZ2UvYnIuYwppbmRleCA1NzNhY2RmLi40ZDJjMWYxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyLmMKKysrIGIvbmV0L2JyaWRnZS9ici5jCkBAIC0yOCw2ICsyOCwxMCBAQAogCS5yY3YJPSBicl9zdHBfcmN2LAogfTsKIAorc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBicl9uZXRfb3BzID0geworCS5leGl0CT0gYnJfbmV0X2V4aXQsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBicl9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTQyLDE4ICs0NiwyMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDsKIAotCWVyciA9IGJyX25ldGZpbHRlcl9pbml0KCk7CisJZXJyID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmYnJfbmV0X29wcyk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0MTsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYnJfZGV2aWNlX25vdGlmaWVyKTsKKwllcnIgPSBicl9uZXRmaWx0ZXJfaW5pdCgpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDI7CiAKLQllcnIgPSBicl9uZXRsaW5rX2luaXQoKTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJyX2RldmljZV9ub3RpZmllcik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0MzsKIAorCWVyciA9IGJyX25ldGxpbmtfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDQ7CisKIAlicmlvY3RsX3NldChicl9pb2N0bF9kZXZpY2VsZXNzX3N0dWIpOwogCWJyX2hhbmRsZV9mcmFtZV9ob29rID0gYnJfaGFuZGxlX2ZyYW1lOwogCkBAIC02MSwxMCArNjksMTIgQEAKIAlicl9mZGJfcHV0X2hvb2sgPSBicl9mZGJfcHV0OwogCiAJcmV0dXJuIDA7Ci1lcnJfb3V0MzoKK2Vycl9vdXQ0OgogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZicl9kZXZpY2Vfbm90aWZpZXIpOwotZXJyX291dDI6CitlcnJfb3V0MzoKIAlicl9uZXRmaWx0ZXJfZmluaSgpOworZXJyX291dDI6CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZicl9uZXRfb3BzKTsKIGVycl9vdXQxOgogCWJyX2ZkYl9maW5pKCk7CiBlcnJfb3V0OgpAQCAtODAsNyArOTAsNyBAQAogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZicl9kZXZpY2Vfbm90aWZpZXIpOwogCWJyaW9jdGxfc2V0KE5VTEwpOwogCi0JYnJfY2xlYW51cF9icmlkZ2VzKCk7CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZicl9uZXRfb3BzKTsKIAogCXN5bmNocm9uaXplX25ldCgpOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCA0ZjUyYzNkLi4yMmJhODYzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTE3OCw1ICsxNzgsNiBAQAogCWRldi0+cHJpdl9mbGFncyA9IElGRl9FQlJJREdFOwogCiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9ISUdIRE1BIHwKLQkJCU5FVElGX0ZfR1NPX01BU0sgfCBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX0xMVFg7CisJCQlORVRJRl9GX0dTT19NQVNLIHwgTkVUSUZfRl9OT19DU1VNIHwgTkVUSUZfRl9MTFRYIHwKKwkJCU5FVElGX0ZfTkVUTlNfTE9DQUw7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggNjNjMThhYS4uNTczZTIwZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoYnItPmRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbmV3X2JyaWRnZV9kZXYoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbmV3X2JyaWRnZV9kZXYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTc4LDYgKzE3OCw3IEBACiAKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CisJZGV2X25ldF9zZXQoZGV2LCBuZXQpOwogCiAJYnIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWJyLT5kZXYgPSBkZXY7CkBAIC0yNjIsMTIgKzI2MywxMiBAQAogCXJldHVybiBwOwogfQogCi1pbnQgYnJfYWRkX2JyaWRnZShjb25zdCBjaGFyICpuYW1lKQoraW50IGJyX2FkZF9icmlkZ2Uoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IHJldDsKIAotCWRldiA9IG5ld19icmlkZ2VfZGV2KG5hbWUpOworCWRldiA9IG5ld19icmlkZ2VfZGV2KG5ldCwgbmFtZSk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yOTQsMTMgKzI5NSwxMyBAQAogCWdvdG8gb3V0OwogfQogCi1pbnQgYnJfZGVsX2JyaWRnZShjb25zdCBjaGFyICpuYW1lKQoraW50IGJyX2RlbF9icmlkZ2Uoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IHJldCA9IDA7CiAKIAlydG5sX2xvY2soKTsKLQlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIG5hbWUpOworCWRldiA9IF9fZGV2X2dldF9ieV9uYW1lKG5ldCwgbmFtZSk7CiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXQgPSAgLUVOWElPOyAJLyogQ291bGQgbm90IGZpbmQgZGV2aWNlICovCiAKQEAgLTQ0NSwxMyArNDQ2LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IGJyX2NsZWFudXBfYnJpZGdlcyh2b2lkKQordm9pZCBicl9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAogCXJ0bmxfbG9jaygpOwogcmVzdGFydDoKLQlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpIHsKKwlmb3JfZWFjaF9uZXRkZXYobmV0LCBkZXYpIHsKIAkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSB7CiAJCQlkZWxfYnIoZGV2LT5wcml2KTsKIAkJCWdvdG8gcmVzdGFydDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW9jdGwuYyBiL25ldC9icmlkZ2UvYnJfaW9jdGwuYwppbmRleCBlZWVlMjE4Li42YTY0MzNkIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pb2N0bC5jCkBAIC0yMSwxMiArMjEsMTIgQEAKICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKIC8qIGNhbGxlZCB3aXRoIFJUTkwgKi8KLXN0YXRpYyBpbnQgZ2V0X2JyaWRnZV9pZmluZGljZXMoaW50ICppbmRpY2VzLCBpbnQgbnVtKQorc3RhdGljIGludCBnZXRfYnJpZGdlX2lmaW5kaWNlcyhzdHJ1Y3QgbmV0ICpuZXQsIGludCAqaW5kaWNlcywgaW50IG51bSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpID0gMDsKIAotCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikgeworCWZvcl9lYWNoX25ldGRldihuZXQsIGRldikgewogCQlpZiAoaSA+PSBudW0pCiAJCQlicmVhazsKIAkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKQpAQCAtODksNyArODksNyBAQAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoJmluaXRfbmV0LCBpZmluZGV4KTsKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGRldl9uZXQoYnItPmRldiksIGlmaW5kZXgpOwogCWlmIChkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE4OCwxNSArMTg4LDIxIEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUU6CisJeworCQl1bnNpZ25lZCBsb25nIHQgPSBjbG9ja190X3RvX2ppZmZpZXMoYXJnc1sxXSk7CiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAKKwkJaWYgKHQgPCBIWikKKwkJCXJldHVybiAtRUlOVkFMOworCiAJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwotCQlici0+YnJpZGdlX2hlbGxvX3RpbWUgPSBjbG9ja190X3RvX2ppZmZpZXMoYXJnc1sxXSk7CisJCWJyLT5icmlkZ2VfaGVsbG9fdGltZSA9IHQ7CiAJCWlmIChicl9pc19yb290X2JyaWRnZShicikpCiAJCQlici0+aGVsbG9fdGltZSA9IGJyLT5icmlkZ2VfaGVsbG9fdGltZTsKIAkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJY2FzZSBCUkNUTF9TRVRfQlJJREdFX01BWF9BR0U6CiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKQEAgLTMwOSw3ICszMTUsNyBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGludCBvbGRfZGV2aWNlbGVzcyh2b2lkIF9fdXNlciAqdWFyZykKK3N0YXRpYyBpbnQgb2xkX2RldmljZWxlc3Moc3RydWN0IG5ldCAqbmV0LCB2b2lkIF9fdXNlciAqdWFyZykKIHsKIAl1bnNpZ25lZCBsb25nIGFyZ3NbM107CiAKQEAgLTMzMSw3ICszMzcsNyBAQAogCQlpZiAoaW5kaWNlcyA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJYXJnc1syXSA9IGdldF9icmlkZ2VfaWZpbmRpY2VzKGluZGljZXMsIGFyZ3NbMl0pOworCQlhcmdzWzJdID0gZ2V0X2JyaWRnZV9pZmluZGljZXMobmV0LCBpbmRpY2VzLCBhcmdzWzJdKTsKIAogCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnc1sxXSwgaW5kaWNlcywgYXJnc1syXSpzaXplb2YoaW50KSkKIAkJCT8gLUVGQVVMVCA6IGFyZ3NbMl07CkBAIC0zNTQsOSArMzYwLDkgQEAKIAkJYnVmW0lGTkFNU0laLTFdID0gMDsKIAogCQlpZiAoYXJnc1swXSA9PSBCUkNUTF9BRERfQlJJREdFKQotCQkJcmV0dXJuIGJyX2FkZF9icmlkZ2UoYnVmKTsKKwkJCXJldHVybiBicl9hZGRfYnJpZGdlKG5ldCwgYnVmKTsKIAotCQlyZXR1cm4gYnJfZGVsX2JyaWRnZShidWYpOworCQlyZXR1cm4gYnJfZGVsX2JyaWRnZShuZXQsIGJ1Zik7CiAJfQogCX0KIApAQCAtMzY4LDcgKzM3NCw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHSUZCUjoKIAljYXNlIFNJT0NTSUZCUjoKLQkJcmV0dXJuIG9sZF9kZXZpY2VsZXNzKHVhcmcpOworCQlyZXR1cm4gb2xkX2RldmljZWxlc3MobmV0LCB1YXJnKTsKIAogCWNhc2UgU0lPQ0JSQUREQlI6CiAJY2FzZSBTSU9DQlJERUxCUjoKQEAgLTM4Myw5ICszODksOSBAQAogCiAJCWJ1ZltJRk5BTVNJWi0xXSA9IDA7CiAJCWlmIChjbWQgPT0gU0lPQ0JSQUREQlIpCi0JCQlyZXR1cm4gYnJfYWRkX2JyaWRnZShidWYpOworCQkJcmV0dXJuIGJyX2FkZF9icmlkZ2UobmV0LCBidWYpOwogCi0JCXJldHVybiBicl9kZWxfYnJpZGdlKGJ1Zik7CisJCXJldHVybiBicl9kZWxfYnJpZGdlKG5ldCwgYnVmKTsKIAl9CiAJfQogCXJldHVybiAtRU9QTk9UU1VQUDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IDZhOWE2Y2QuLmE0YWJlZDUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiB7CiAJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBhcmVudDsKLQlpbnQgcGY7CisJdV9pbnQ4X3QgcGY7CiAKIAlpZiAoIXNrYi0+bmZfYnJpZGdlKQogCQlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtNzkxLDcgKzc5MSw3IEBACiB7CiAJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbG91dGRldiA9IGJyaWRnZV9wYXJlbnQoc2tiLT5kZXYpOwotCWludCBwZjsKKwl1X2ludDhfdCBwZjsKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkvKiBCZSB2ZXJ5IHBhcmFub2lkLiBUaGlzIHByb2JhYmx5IHdvbid0IGhhcHBlbiBhbnltb3JlLCBidXQgbGV0J3MKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKaW5kZXggZjE1NWU2Yy4uYmE3YmUxOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKQEAgLTgyLDYgKzgyLDcgQEAKICAqLwogdm9pZCBicl9pZmluZm9fbm90aWZ5KGludCBldmVudCwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHBvcnQtPmRldik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKQEAgLTk3LDEwICs5OCwxMCBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJZ290byBlcnJvdXQ7CiAJfQotCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgJmluaXRfbmV0LDAsIFJUTkxHUlBfTElOSywgTlVMTCwgR0ZQX0FUT01JQyk7CisJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBuZXQsIDAsIFJUTkxHUlBfTElOSywgTlVMTCwgR0ZQX0FUT01JQyk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCi0JCXJ0bmxfc2V0X3NrX2VycigmaW5pdF9uZXQsIFJUTkxHUlBfTElOSywgZXJyKTsKKwkJcnRubF9zZXRfc2tfZXJyKG5ldCwgUlROTEdSUF9MSU5LLCBlcnIpOwogfQogCiAvKgpAQCAtMTEyLDExICsxMTMsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGlkeDsKIAotCWlmIChuZXQgIT0gJmluaXRfbmV0KQotCQlyZXR1cm4gMDsKLQogCWlkeCA9IDA7Ci0JZm9yX2VhY2hfbmV0ZGV2KCZpbml0X25ldCwgZGV2KSB7CisJZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7CiAJCS8qIG5vdCBhIGJyaWRnZSBwb3J0ICovCiAJCWlmIChkZXYtPmJyX3BvcnQgPT0gTlVMTCB8fCBpZHggPCBjYi0+YXJnc1swXSkKIAkJCWdvdG8gc2tpcDsKQEAgLTE0Nyw5ICsxNDUsNiBAQAogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CiAJdTggbmV3X3N0YXRlOwogCi0JaWYgKG5ldCAhPSAmaW5pdF9uZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKG5sbXNnX2xlbihubGgpIDwgc2l6ZW9mKCppZm0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTY1LDcgKzE2MCw3IEBACiAJaWYgKG5ld19zdGF0ZSA+IEJSX1NUQVRFX0JMT0NLSU5HKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleCgmaW5pdF9uZXQsIGlmbS0+aWZpX2luZGV4KTsKKwlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBpZm0tPmlmaV9pbmRleCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jIGIvbmV0L2JyaWRnZS9icl9ub3RpZnkuYwppbmRleCA3NjM0MGJkLi43NjNhM2VjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCisrKyBiL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMKQEAgLTM1LDkgKzM1LDYgQEAKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gZGV2LT5icl9wb3J0OwogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAotCWlmICghbmV0X2VxKGRldl9uZXQoZGV2KSwgJmluaXRfbmV0KSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCiAJLyogbm90IGEgcG9ydCBvZiBhIGJyaWRnZSAqLwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKaW5kZXggYzNkYzE4ZC4uYjZjM2I3MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKQEAgLTE3OCw5ICsxNzgsOSBAQAogCiAvKiBicl9pZi5jICovCiBleHRlcm4gdm9pZCBicl9wb3J0X2NhcnJpZXJfY2hlY2soc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7Ci1leHRlcm4gaW50IGJyX2FkZF9icmlkZ2UoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gaW50IGJyX2RlbF9icmlkZ2UoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBicl9jbGVhbnVwX2JyaWRnZXModm9pZCk7CitleHRlcm4gaW50IGJyX2FkZF9icmlkZ2Uoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgYnJfZGVsX2JyaWRnZShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgYnJfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KTsKIGV4dGVybiBpbnQgYnJfYWRkX2lmKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgYnJfZGVsX2lmKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYwppbmRleCA4YjIwMGY5Li44MWFlNDBiIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKKysrIGIvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCkBAIC0xNDAsOSArMTQwLDYgQEAKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwogCi0JaWYgKCFuZXRfZXEoZGV2X25ldChkZXYpLCAmaW5pdF9uZXQpKQotCQlnb3RvIGVycjsKLQogCWlmICghcCkKIAkJZ290byBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwppbmRleCAyN2Q2YTUxLi4xNThkZWU4IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCkBAIC0yOSwxMSArMjksMTIgQEAKICAqLwogc3RhdGljIHNzaXplX3Qgc3RvcmVfYnJpZGdlX3Bhcm0oc3RydWN0IGRldmljZSAqZCwKIAkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotCQkJCSB2b2lkICgqc2V0KShzdHJ1Y3QgbmV0X2JyaWRnZSAqLCB1bnNpZ25lZCBsb25nKSkKKwkJCQkgaW50ICgqc2V0KShzdHJ1Y3QgbmV0X2JyaWRnZSAqLCB1bnNpZ25lZCBsb25nKSkKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZCk7CiAJY2hhciAqZW5kcDsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyOwogCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtNDMsOSArNDQsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwotCSgqc2V0KShiciwgdmFsKTsKKwllcnIgPSAoKnNldCkoYnIsIHZhbCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKLQlyZXR1cm4gbGVuOworCXJldHVybiBlcnIgPyBlcnIgOiBsZW47CiB9CiAKIApAQCAtNTYsMTIgKzU3LDEzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBqaWZmaWVzX3RvX2Nsb2NrX3QoYnItPmZvcndhcmRfZGVsYXkpKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2ZvcndhcmRfZGVsYXkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbnQgc2V0X2ZvcndhcmRfZGVsYXkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGRlbGF5ID0gY2xvY2tfdF90b19qaWZmaWVzKHZhbCk7CiAJYnItPmZvcndhcmRfZGVsYXkgPSBkZWxheTsKIAlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQogCQlici0+YnJpZGdlX2ZvcndhcmRfZGVsYXkgPSBkZWxheTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfZm9yd2FyZF9kZWxheShzdHJ1Y3QgZGV2aWNlICpkLApAQCAtODAsMTIgKzgyLDE3IEBACiAJCSAgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodG9fYnJpZGdlKGQpLT5oZWxsb190aW1lKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9oZWxsb190aW1lKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW50IHNldF9oZWxsb190aW1lKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyB0ID0gY2xvY2tfdF90b19qaWZmaWVzKHZhbCk7CisKKwlpZiAodCA8IEhaKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWJyLT5oZWxsb190aW1lID0gdDsKIAlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQogCQlici0+YnJpZGdlX2hlbGxvX3RpbWUgPSB0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9oZWxsb190aW1lKHN0cnVjdCBkZXZpY2UgKmQsCkBAIC0xMDQsMTIgKzExMSwxMyBAQAogCQkgICAgICAgamlmZmllc190b19jbG9ja190KHRvX2JyaWRnZShkKS0+bWF4X2FnZSkpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfbWF4X2FnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGludCBzZXRfbWF4X2FnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgdCA9IGNsb2NrX3RfdG9famlmZmllcyh2YWwpOwogCWJyLT5tYXhfYWdlID0gdDsKIAlpZiAoYnJfaXNfcm9vdF9icmlkZ2UoYnIpKQogCQlici0+YnJpZGdlX21heF9hZ2UgPSB0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9tYXhfYWdlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTI2LDkgKzEzNCwxMCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgamlmZmllc190b19jbG9ja190KGJyLT5hZ2VpbmdfdGltZSkpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfYWdlaW5nX3RpbWUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbnQgc2V0X2FnZWluZ190aW1lKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJYnItPmFnZWluZ190aW1lID0gY2xvY2tfdF90b19qaWZmaWVzKHZhbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2FnZWluZ190aW1lKHN0cnVjdCBkZXZpY2UgKmQsCkBAIC0xODAsOSArMTg5LDEwIEBACiAJCSAgICAgICAoYnItPmJyaWRnZV9pZC5wcmlvWzBdIDw8IDgpIHwgYnItPmJyaWRnZV9pZC5wcmlvWzFdKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3ByaW9yaXR5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW50IHNldF9wcmlvcml0eShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCWJyX3N0cF9zZXRfYnJpZGdlX3ByaW9yaXR5KGJyLCAodTE2KSB2YWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9wcmlvcml0eShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9LY29uZmlnCmluZGV4IDkwOTQ3OTcuLmJhNmY3M2UgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMiwyMSArMiwyMiBAQAogIyBCcmlkZ2UgbmV0ZmlsdGVyIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiQnJpZGdlOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbiIKLQlkZXBlbmRzIG9uIEJSSURHRSAmJiBCUklER0VfTkVURklMVEVSCi0KLWNvbmZpZyBCUklER0VfTkZfRUJUQUJMRVMKK21lbnVjb25maWcgQlJJREdFX05GX0VCVEFCTEVTCiAJdHJpc3RhdGUgIkV0aGVybmV0IEJyaWRnZSB0YWJsZXMgKGVidGFibGVzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJJREdFICYmIEJSSURHRV9ORVRGSUxURVIKKwlzZWxlY3QgTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBlYnRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgZnJhbWUvcGFja2V0IGlkZW50aWZpY2F0aW9uCiAJICBmcmFtZXdvcmsuIFNheSAnWScgb3IgJ00nIGhlcmUgaWYgeW91IHdhbnQgdG8gZG8gRXRoZXJuZXQKIAkgIGZpbHRlcmluZy9OQVQvYnJvdXRpbmcgb24gdGhlIEV0aGVybmV0IGJyaWRnZS4KKworaWYgQlJJREdFX05GX0VCVEFCTEVTCisKICMKICMgdGFibGVzCiAjCiBjb25maWcgQlJJREdFX0VCVF9CUk9VVEUKIAl0cmlzdGF0ZSAiZWJ0OiBicm91dGUgdGFibGUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUwogCWhlbHAKIAkgIFRoZSBlYnRhYmxlcyBicm91dGUgdGFibGUgaXMgdXNlZCB0byBkZWZpbmUgcnVsZXMgdGhhdCBkZWNpZGUgYmV0d2VlbgogCSAgYnJpZGdpbmcgYW5kIHJvdXRpbmcgZnJhbWVzLCBnaXZpbmcgTGludXggdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYQpAQCAtMjcsNyArMjgsNiBAQAogCiBjb25maWcgQlJJREdFX0VCVF9UX0ZJTFRFUgogCXRyaXN0YXRlICJlYnQ6IGZpbHRlciB0YWJsZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhlIGVidGFibGVzIGZpbHRlciB0YWJsZSBpcyB1c2VkIHRvIGRlZmluZSBmcmFtZSBmaWx0ZXJpbmcgcnVsZXMgYXQKIAkgIGxvY2FsIGlucHV0LCBmb3J3YXJkaW5nIGFuZCBsb2NhbCBvdXRwdXQuIFNlZSB0aGUgbWFuIHBhZ2UgZm9yCkBAIC0zNyw3ICszNyw2IEBACiAKIGNvbmZpZyBCUklER0VfRUJUX1RfTkFUCiAJdHJpc3RhdGUgImVidDogbmF0IHRhYmxlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKIAloZWxwCiAJICBUaGUgZWJ0YWJsZXMgbmF0IHRhYmxlIGlzIHVzZWQgdG8gZGVmaW5lIHJ1bGVzIHRoYXQgYWx0ZXIgdGhlIE1BQwogCSAgc291cmNlIGFkZHJlc3MgKE1BQyBTTkFUKSBvciB0aGUgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MgKE1BQyBETkFUKS4KQEAgLTQ5LDcgKzQ4LDYgQEAKICMKIGNvbmZpZyBCUklER0VfRUJUXzgwMl8zCiAJdHJpc3RhdGUgImVidDogODAyLjMgZmlsdGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIG1hdGNoaW5nIHN1cHBvcnQgZm9yIDgwMi4zIEV0aGVybmV0IGZyYW1lcy4KIApAQCAtNTcsNyArNTUsNiBAQAogCiBjb25maWcgQlJJREdFX0VCVF9BTU9ORwogCXRyaXN0YXRlICJlYnQ6IGFtb25nIGZpbHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgYW1vbmcgbWF0Y2gsIHdoaWNoIGFsbG93cyBtYXRjaGluZyB0aGUgTUFDIHNvdXJjZQogCSAgYW5kL29yIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb24gYSBsaXN0IG9mIGFkZHJlc3Nlcy4gT3B0aW9uYWxseSwKQEAgLTY3LDcgKzY0LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfQVJQCiAJdHJpc3RhdGUgImVidDogQVJQIGZpbHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgQVJQIG1hdGNoLCB3aGljaCBhbGxvd3MgQVJQIGFuZCBSQVJQIGhlYWRlciBmaWVsZAogCSAgZmlsdGVyaW5nLgpAQCAtNzYsNyArNzIsNiBAQAogCiBjb25maWcgQlJJREdFX0VCVF9JUAogCXRyaXN0YXRlICJlYnQ6IElQIGZpbHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgSVAgbWF0Y2gsIHdoaWNoIGFsbG93cyBiYXNpYyBJUCBoZWFkZXIgZmllbGQKIAkgIGZpbHRlcmluZy4KQEAgLTk0LDcgKzg5LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfTElNSVQKIAl0cmlzdGF0ZSAiZWJ0OiBsaW1pdCBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgbGltaXQgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gY29udHJvbAogCSAgdGhlIHJhdGUgYXQgd2hpY2ggYSBydWxlIGNhbiBiZSBtYXRjaGVkLiBUaGlzIG1hdGNoIGlzIHRoZQpAQCAtMTA1LDcgKzk5LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfTUFSSwogCXRyaXN0YXRlICJlYnQ6IG1hcmsgZmlsdGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBtYXJrIG1hdGNoLCB3aGljaCBhbGxvd3MgbWF0Y2hpbmcgZnJhbWVzIGJhc2VkIG9uCiAJICB0aGUgJ25mbWFyaycgdmFsdWUgaW4gdGhlIGZyYW1lLiBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIG1hcmsgdGFyZ2V0LgpAQCAtMTE2LDcgKzEwOSw2IEBACiAKIGNvbmZpZyBCUklER0VfRUJUX1BLVFRZUEUKIAl0cmlzdGF0ZSAiZWJ0OiBwYWNrZXQgdHlwZSBmaWx0ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIHBhY2tldCB0eXBlIG1hdGNoLCB3aGljaCBhbGxvd3MgbWF0Y2hpbmcgb24gdGhlCiAJICB0eXBlIG9mIHBhY2tldCBiYXNlZCBvbiBpdHMgRXRoZXJuZXQgImNsYXNzIiAoYXMgZGV0ZXJtaW5lZCBieQpAQCAtMTI3LDcgKzExOSw2IEBACiAKIGNvbmZpZyBCUklER0VfRUJUX1NUUAogCXRyaXN0YXRlICJlYnQ6IFNUUCBmaWx0ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIFNwYW5uaW5nIFRyZWUgUHJvdG9jb2wgbWF0Y2gsIHdoaWNoCiAJICBhbGxvd3MgU1RQIGhlYWRlciBmaWVsZCBmaWx0ZXJpbmcuCkBAIC0xMzYsNyArMTI3LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfVkxBTgogCXRyaXN0YXRlICJlYnQ6IDgwMi4xUSBWTEFOIGZpbHRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgODAyLjFRIHZsYW4gbWF0Y2gsIHdoaWNoIGFsbG93cyB0aGUgZmlsdGVyaW5nIG9mCiAJICA4MDIuMVEgdmxhbiBmaWVsZHMuCkBAIC0xNTYsNyArMTQ2LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfRE5BVAogCXRyaXN0YXRlICJlYnQ6IGRuYXQgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBNQUMgRE5BVCB0YXJnZXQsIHdoaWNoIGFsbG93cyBhbHRlcmluZyB0aGUgTUFDCiAJICBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIGZyYW1lcy4KQEAgLTE2NSw3ICsxNTQsNiBAQAogCiBjb25maWcgQlJJREdFX0VCVF9NQVJLX1QKIAl0cmlzdGF0ZSAiZWJ0OiBtYXJrIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgbWFyayB0YXJnZXQsIHdoaWNoIGFsbG93cyBtYXJraW5nIGZyYW1lcyBieQogCSAgc2V0dGluZyB0aGUgJ25mbWFyaycgdmFsdWUgaW4gdGhlIGZyYW1lLgpAQCAtMTc2LDcgKzE2NCw2IEBACiAKIGNvbmZpZyBCUklER0VfRUJUX1JFRElSRUNUCiAJdHJpc3RhdGUgImVidDogcmVkaXJlY3QgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUklER0VfTkZfRUJUQUJMRVMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBNQUMgcmVkaXJlY3QgdGFyZ2V0LCB3aGljaCBhbGxvd3MgYWx0ZXJpbmcgdGhlIE1BQwogCSAgZGVzdGluYXRpb24gYWRkcmVzcyBvZiBhIGZyYW1lIHRvIHRoYXQgb2YgdGhlIGRldmljZSBpdCBhcnJpdmVkIG9uLgpAQCAtMTg1LDcgKzE3Miw2IEBACiAKIGNvbmZpZyBCUklER0VfRUJUX1NOQVQKIAl0cmlzdGF0ZSAiZWJ0OiBzbmF0IHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgTUFDIFNOQVQgdGFyZ2V0LCB3aGljaCBhbGxvd3MgYWx0ZXJpbmcgdGhlIE1BQwogCSAgc291cmNlIGFkZHJlc3Mgb2YgZnJhbWVzLgpAQCAtMTk2LDcgKzE4Miw2IEBACiAjCiBjb25maWcgQlJJREdFX0VCVF9MT0cKIAl0cmlzdGF0ZSAiZWJ0OiBsb2cgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJSSURHRV9ORl9FQlRBQkxFUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlIGxvZyB3YXRjaGVyLCB0aGF0IHlvdSBjYW4gdXNlIGluIGFueSBydWxlCiAJICBpbiBhbnkgZWJ0YWJsZXMgdGFibGUuIEl0IHJlY29yZHMgaW5mbyBhYm91dCB0aGUgZnJhbWUgaGVhZGVyCkBAIC0yMDYsNyArMTkxLDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfVUxPRwogCXRyaXN0YXRlICJlYnQ6IHVsb2cgc3VwcG9ydCAoT0JTT0xFVEUpIgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgb2xkIGJyaWRnZS1zcGVjaWZpYyAiZWJ0X3Vsb2ciIGltcGxlbWVudGF0aW9uCiAJICB3aGljaCBoYXMgYmVlbiBvYnNvbGV0ZWQgYnkgdGhlIG5ldyAibmZuZXRsaW5rX2xvZyIgY29kZSAoc2VlCkBAIC0yMjMsNyArMjA3LDYgQEAKIAogY29uZmlnIEJSSURHRV9FQlRfTkZMT0cKIAl0cmlzdGF0ZSAiZWJ0OiBuZmxvZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQlJJREdFX05GX0VCVEFCTEVTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgbmZsb2cgd2F0Y2hlciwgd2hpY2ggYWxsb3dzIHRvIExPRwogCSAgbWVzc2FnZXMgdGhyb3VnaCB0aGUgbmV0ZmlsdGVyIGxvZ2dpbmcgQVBJLCB3aGljaCBjYW4gdXNlCkBAIC0yMzUsNCArMjE4LDQgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWVuZG1lbnUKK2VuZGlmICMgQlJJREdFX05GX0VCVEFCTEVTCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCmluZGV4IDk4NTM0MDIuLmJkOTFkYzUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF84MDJfMy5jCkBAIC03LDY0ICs3LDYzIEBACiAgKiBNYXkgMjAwMwogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLXN0YXRpYyBpbnQgZWJ0X2ZpbHRlcl84MDJfMyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sCitlYnRfODAyXzNfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgZWJ0XzgwMl8zX2hkciAqaGRyID0gZWJ0XzgwMl8zX2hkcihza2IpOwogCV9fYmUxNiB0eXBlID0gaGRyLT5sbGMudWkuY3RybCAmIElTX1VJID8gaGRyLT5sbGMudWkudHlwZSA6IGhkci0+bGxjLm5pLnR5cGU7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF84MDJfM19TQVApIHsKIAkJaWYgKEZXSU5WKGluZm8tPnNhcCAhPSBoZHItPmxsYy51aS5zc2FwLCBFQlRfODAyXzNfU0FQKSkKLQkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChGV0lOVihpbmZvLT5zYXAgIT0gaGRyLT5sbGMudWkuZHNhcCwgRUJUXzgwMl8zX1NBUCkpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUXzgwMl8zX1RZUEUpIHsKIAkJaWYgKCEoaGRyLT5sbGMudWkuZHNhcCA9PSBDSEVDS19UWVBFICYmIGhkci0+bGxjLnVpLnNzYXAgPT0gQ0hFQ0tfVFlQRSkpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChGV0lOVihpbmZvLT50eXBlICE9IHR5cGUsIEVCVF84MDJfM19UWVBFKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gRUJUX01BVENIOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfODAyXzM7Ci1zdGF0aWMgaW50IGVidF84MDJfM19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0XzgwMl8zX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKLQlpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8pKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaW5mby0+Yml0bWFzayAmIH5FQlRfODAyXzNfTUFTSyB8fCBpbmZvLT5pbnZmbGFncyAmIH5FQlRfODAyXzNfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiAwOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfODAyXzMgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSBFQlRfODAyXzNfTUFUQ0gsCi0JLm1hdGNoCQk9IGVidF9maWx0ZXJfODAyXzMsCi0JLmNoZWNrCQk9IGVidF84MDJfM19jaGVjaywKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZWJ0XzgwMl8zX210X3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICI4MDJfMyIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfODAyXzNfbXQsCisJLmNoZWNrZW50cnkJPSBlYnRfODAyXzNfbXRfY2hlY2ssCisJLm1hdGNoc2l6ZQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfODAyXzNfaW5pdCh2b2lkKQogewotCXJldHVybiBlYnRfcmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl84MDJfMyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZlYnRfODAyXzNfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF84MDJfM19maW5pKHZvaWQpCiB7Ci0JZWJ0X3VucmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl84MDJfMyk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmZWJ0XzgwMl8zX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF84MDJfM19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKaW5kZXggNzBiNmRjYS4uYjU5NWYwOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2Ftb25nLmMKQEAgLTcsMTUgKzcsMTUgQEAKICAqICBBdWd1c3QsIDIwMDMKICAqCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmg+CiAKLXN0YXRpYyBpbnQgZWJ0X21hY193b3JtaGFzaF9jb250YWlucyhjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2gsCi0JCQkJICAgICBjb25zdCBjaGFyICptYWMsIF9fYmUzMiBpcCkKK3N0YXRpYyBib29sIGVidF9tYWNfd29ybWhhc2hfY29udGFpbnMoY29uc3Qgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKndoLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm1hYywgX19iZTMyIGlwKQogewogCS8qIFlvdSBtYXkgYmUgcHV6emxlZCBhcyB0byBob3cgdGhpcyBjb2RlIHdvcmtzLgogCSAqIFNvbWUgdHJpY2tzIHdlcmUgdXNlZCwgcmVmZXIgdG8KQEAgLTMzLDIzICszMywxOSBAQAogCWlmIChpcCkgewogCQlmb3IgKGkgPSBzdGFydDsgaSA8IGxpbWl0OyBpKyspIHsKIAkJCXAgPSAmd2gtPnBvb2xbaV07Ci0JCQlpZiAoY21wWzFdID09IHAtPmNtcFsxXSAmJiBjbXBbMF0gPT0gcC0+Y21wWzBdKSB7Ci0JCQkJaWYgKHAtPmlwID09IDAgfHwgcC0+aXAgPT0gaXApIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfQorCQkJaWYgKGNtcFsxXSA9PSBwLT5jbXBbMV0gJiYgY21wWzBdID09IHAtPmNtcFswXSkKKwkJCQlpZiAocC0+aXAgPT0gMCB8fCBwLT5pcCA9PSBpcCkKKwkJCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSBzdGFydDsgaSA8IGxpbWl0OyBpKyspIHsKIAkJCXAgPSAmd2gtPnBvb2xbaV07Ci0JCQlpZiAoY21wWzFdID09IHAtPmNtcFsxXSAmJiBjbXBbMF0gPT0gcC0+Y21wWzBdKSB7Ci0JCQkJaWYgKHAtPmlwID09IDApIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfQorCQkJaWYgKGNtcFsxXSA9PSBwLT5jbXBbMV0gJiYgY21wWzBdID09IHAtPmNtcFswXSkKKwkJCQlpZiAocC0+aXAgPT0gMCkKKwkJCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgaW50IGVidF9tYWNfd29ybWhhc2hfY2hlY2tfaW50ZWdyaXR5KGNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoCkBAIC0xMzEsMTIgKzEyNywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVidF9maWx0ZXJfYW1vbmcoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sCitlYnRfYW1vbmdfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9hbW9uZ19pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBjaGFyICpkbWFjLCAqc21hYzsKIAljb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2hfZHN0LCAqd2hfc3JjOwogCV9fYmUzMiBkaXAgPSAwLCBzaXAgPSAwOwpAQCAtMTQ3LDQxICsxNDEsNDEgQEAKIAlpZiAod2hfc3JjKSB7CiAJCXNtYWMgPSBldGhfaGRyKHNrYiktPmhfc291cmNlOwogCQlpZiAoZ2V0X2lwX3NyYyhza2IsICZzaXApKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoIShpbmZvLT5iaXRtYXNrICYgRUJUX0FNT05HX1NSQ19ORUcpKSB7CiAJCQkvKiB3ZSBtYXRjaCBvbmx5IGlmIGl0IGNvbnRhaW5zICovCiAJCQlpZiAoIWVidF9tYWNfd29ybWhhc2hfY29udGFpbnMod2hfc3JjLCBzbWFjLCBzaXApKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkvKiB3ZSBtYXRjaCBvbmx5IGlmIGl0IERPRVMgTk9UIGNvbnRhaW4gKi8KIAkJCWlmIChlYnRfbWFjX3dvcm1oYXNoX2NvbnRhaW5zKHdoX3NyYywgc21hYywgc2lwKSkKLQkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfQogCiAJaWYgKHdoX2RzdCkgewogCQlkbWFjID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7CiAJCWlmIChnZXRfaXBfZHN0KHNrYiwgJmRpcCkpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmICghKGluZm8tPmJpdG1hc2sgJiBFQlRfQU1PTkdfRFNUX05FRykpIHsKIAkJCS8qIHdlIG1hdGNoIG9ubHkgaWYgaXQgY29udGFpbnMgKi8KIAkJCWlmICghZWJ0X21hY193b3JtaGFzaF9jb250YWlucyh3aF9kc3QsIGRtYWMsIGRpcCkpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJCXJldHVybiBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCS8qIHdlIG1hdGNoIG9ubHkgaWYgaXQgRE9FUyBOT1QgY29udGFpbiAqLwogCQkJaWYgKGVidF9tYWNfd29ybWhhc2hfY29udGFpbnMod2hfZHN0LCBkbWFjLCBkaXApKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAKLQlyZXR1cm4gRUJUX01BVENIOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IGVidF9hbW9uZ19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLQkJCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsCi0JCQkgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sIGVidF9hbW9uZ19tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfYW1vbmdfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKmVtID0KKwkJY29udGFpbmVyX29mKHBhci0+bWF0Y2hpbmZvLCBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoLCBkYXRhKTsKIAlpbnQgZXhwZWN0ZWRfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBlYnRfYW1vbmdfaW5mbyk7CiAJY29uc3Qgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKndoX2RzdCwgKndoX3NyYzsKIAlpbnQgZXJyOwpAQCAtMTkxLDQyICsxODUsNDUgQEAKIAlleHBlY3RlZF9sZW5ndGggKz0gZWJ0X21hY193b3JtaGFzaF9zaXplKHdoX2RzdCk7CiAJZXhwZWN0ZWRfbGVuZ3RoICs9IGVidF9tYWNfd29ybWhhc2hfc2l6ZSh3aF9zcmMpOwogCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKGV4cGVjdGVkX2xlbmd0aCkpIHsKKwlpZiAoZW0tPm1hdGNoX3NpemUgIT0gRUJUX0FMSUdOKGV4cGVjdGVkX2xlbmd0aCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImVidGFibGVzOiBhbW9uZzogd3Jvbmcgc2l6ZTogJWQgIgogCQkgICAgICAgImFnYWluc3QgZXhwZWN0ZWQgJWQsIHJvdW5kZWQgdG8gJVpkXG4iLAotCQkgICAgICAgZGF0YWxlbiwgZXhwZWN0ZWRfbGVuZ3RoLAorCQkgICAgICAgZW0tPm1hdGNoX3NpemUsIGV4cGVjdGVkX2xlbmd0aCwKIAkJICAgICAgIEVCVF9BTElHTihleHBlY3RlZF9sZW5ndGgpKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAl9CiAJaWYgKHdoX2RzdCAmJiAoZXJyID0gZWJ0X21hY193b3JtaGFzaF9jaGVja19pbnRlZ3JpdHkod2hfZHN0KSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImVidGFibGVzOiBhbW9uZzogZHN0IGludGVncml0eSBmYWlsOiAleFxuIiwgLWVycik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCWlmICh3aF9zcmMgJiYgKGVyciA9IGVidF9tYWNfd29ybWhhc2hfY2hlY2tfaW50ZWdyaXR5KHdoX3NyYykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJlYnRhYmxlczogYW1vbmc6IHNyYyBpbnRlZ3JpdHkgZmFpbDogJXhcbiIsIC1lcnIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfbWF0Y2ggZmlsdGVyX2Ftb25nIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCT0gRUJUX0FNT05HX01BVENILAotCS5tYXRjaAkJPSBlYnRfZmlsdGVyX2Ftb25nLAotCS5jaGVjawkJPSBlYnRfYW1vbmdfY2hlY2ssCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGVidF9hbW9uZ19tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiYW1vbmciLAorCS5yZXZpc2lvbgk9IDAsCisJLmZhbWlseQkJPSBORlBST1RPX0JSSURHRSwKKwkubWF0Y2gJCT0gZWJ0X2Ftb25nX210LAorCS5jaGVja2VudHJ5CT0gZWJ0X2Ftb25nX210X2NoZWNrLAorCS5tYXRjaHNpemUJPSAtMSwgLyogc3BlY2lhbCBjYXNlICovCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X2Ftb25nX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYW1vbmcpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmZWJ0X2Ftb25nX210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfYW1vbmdfZmluaSh2b2lkKQogewotCWVidF91bnJlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYW1vbmcpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF9hbW9uZ19tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChlYnRfYW1vbmdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKaW5kZXggN2M1MzViZS4uYjdhZDYwNCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnAuYwpAQCAtOCw1OCArOCw1OCBAQAogICogIEFwcmlsLCAyMDAyCiAgKgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmg+CiAKLXN0YXRpYyBpbnQgZWJ0X2ZpbHRlcl9hcnAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbAorZWJ0X2FycF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X2FycF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X2FycF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGFycGhkciAqYWg7CiAJc3RydWN0IGFycGhkciBfYXJwaDsKIAogCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9hcnBoKSwgJl9hcnBoKTsKIAlpZiAoYWggPT0gTlVMTCkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX09QQ09ERSAmJiBGV0lOVihpbmZvLT5vcGNvZGUgIT0KIAkgICBhaC0+YXJfb3AsIEVCVF9BUlBfT1BDT0RFKSkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX0hUWVBFICYmIEZXSU5WKGluZm8tPmh0eXBlICE9CiAJICAgYWgtPmFyX2hyZCwgRUJUX0FSUF9IVFlQRSkpCi0JCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9QVFlQRSAmJiBGV0lOVihpbmZvLT5wdHlwZSAhPQogCSAgIGFoLT5hcl9wcm8sIEVCVF9BUlBfUFRZUEUpKQotCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVAgfCBFQlRfQVJQX0dSQVQpKSB7CiAJCWNvbnN0IF9fYmUzMiAqc2FwLCAqZGFwOwogCQlfX2JlMzIgc2FkZHIsIGRhZGRyOwogCiAJCWlmIChhaC0+YXJfcGxuICE9IHNpemVvZihfX2JlMzIpIHx8IGFoLT5hcl9wcm8gIT0gaHRvbnMoRVRIX1BfSVApKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQlzYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKwogCQkJCQlhaC0+YXJfaGxuLCBzaXplb2Yoc2FkZHIpLAogCQkJCQkmc2FkZHIpOwogCQlpZiAoc2FwID09IE5VTEwpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWRhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCiAJCQkJCTIqYWgtPmFyX2hsbitzaXplb2Yoc2FkZHIpLAogCQkJCQlzaXplb2YoZGFkZHIpLCAmZGFkZHIpOwogCQlpZiAoZGFwID09IE5VTEwpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfSVAgJiYKIAkJICAgIEZXSU5WKGluZm8tPnNhZGRyICE9ICgqc2FwICYgaW5mby0+c21zayksIEVCVF9BUlBfU1JDX0lQKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX0RTVF9JUCAmJgogCQkgICAgRldJTlYoaW5mby0+ZGFkZHIgIT0gKCpkYXAgJiBpbmZvLT5kbXNrKSwgRUJUX0FSUF9EU1RfSVApKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfR1JBVCAmJgogCQkgICAgRldJTlYoKmRhcCAhPSAqc2FwLCBFQlRfQVJQX0dSQVQpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9BUlBfU1JDX01BQyB8IEVCVF9BUlBfRFNUX01BQykpIHsKQEAgLTY4LDE4ICs2OCwxOCBAQAogCQl1aW50OF90IHZlcmRpY3QsIGk7CiAKIAkJaWYgKGFoLT5hcl9obG4gIT0gRVRIX0FMRU4gfHwgYWgtPmFyX2hyZCAhPSBodG9ucyhBUlBIUkRfRVRIRVIpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfU1JDX01BQykgewogCQkJbXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkciksCiAJCQkJCQlzaXplb2YoX21hYyksICZfbWFjKTsKIAkJCWlmIChtcCA9PSBOVUxMKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQl2ZXJkaWN0ID0gMDsKIAkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQkJdmVyZGljdCB8PSAobXBbaV0gXiBpbmZvLT5zbWFkZHJbaV0pICYKIAkJCQkgICAgICAgaW5mby0+c21tc2tbaV07CiAJCQlpZiAoRldJTlYodmVyZGljdCAhPSAwLCBFQlRfQVJQX1NSQ19NQUMpKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAogCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfRFNUX01BQykgewpAQCAtODcsNTAgKzg3LDUxIEBACiAJCQkJCQlhaC0+YXJfaGxuICsgYWgtPmFyX3BsbiwKIAkJCQkJCXNpemVvZihfbWFjKSwgJl9tYWMpOwogCQkJaWYgKG1wID09IE5VTEwpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJCXJldHVybiBmYWxzZTsKIAkJCXZlcmRpY3QgPSAwOwogCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJCQl2ZXJkaWN0IHw9IChtcFtpXSBeIGluZm8tPmRtYWRkcltpXSkgJgogCQkJCQlpbmZvLT5kbW1za1tpXTsKIAkJCWlmIChGV0lOVih2ZXJkaWN0ICE9IDAsIEVCVF9BUlBfRFNUX01BQykpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KIAotCXJldHVybiBFQlRfTUFUQ0g7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgZWJ0X2FycF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0X2FycF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X2FycF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X2FycF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2FycF9pbmZvKSkpCi0JCXJldHVybiAtRUlOVkFMOwogCWlmICgoZS0+ZXRocHJvdG8gIT0gaHRvbnMoRVRIX1BfQVJQKSAmJgogCSAgIGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QX1JBUlApKSB8fAogCSAgIGUtPmludmZsYWdzICYgRUJUX0lQUk9UTykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAlpZiAoaW5mby0+Yml0bWFzayAmIH5FQlRfQVJQX01BU0sgfHwgaW5mby0+aW52ZmxhZ3MgJiB+RUJUX0FSUF9NQVNLKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfYXJwIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCT0gRUJUX0FSUF9NQVRDSCwKLQkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl9hcnAsCi0JLmNoZWNrCQk9IGVidF9hcnBfY2hlY2ssCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGVidF9hcnBfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gImFycCIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfYXJwX210LAorCS5jaGVja2VudHJ5CT0gZWJ0X2FycF9tdF9jaGVjaywKKwkubWF0Y2hzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfYXJwX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfYXJwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYXJwKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmVidF9hcnBfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9hcnBfZmluaSh2b2lkKQogewotCWVidF91bnJlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfYXJwKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZlYnRfYXJwX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9hcnBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwcmVwbHkuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnByZXBseS5jCmluZGV4IDBjNDI3OTUuLjc2NTg0Y2QgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnByZXBseS5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnByZXBseS5jCkBAIC04LDE4ICs4LDE3IEBACiAgKiAgQXVndXN0LCAyMDAzCiAgKgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycHJlcGx5Lmg+CiAKLXN0YXRpYyBpbnQgZWJ0X3RhcmdldF9yZXBseShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9va25yLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgdW5zaWduZWQgaW50CitlYnRfYXJwcmVwbHlfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCXN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqaW5mbyA9ICh2b2lkICopZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCWNvbnN0IF9fYmUzMiAqc2lwdHIsICpkaXB0cjsKIAlfX2JlMzIgX3NpcCwgX2RpcDsKIAljb25zdCBzdHJ1Y3QgYXJwaGRyICphcDsKQEAgLTUyLDQ1ICs1MSw0NSBAQAogCWlmIChkaXB0ciA9PSBOVUxMKQogCQlyZXR1cm4gRUJUX0RST1A7CiAKLQlhcnBfc2VuZChBUlBPUF9SRVBMWSwgRVRIX1BfQVJQLCAqc2lwdHIsIChzdHJ1Y3QgbmV0X2RldmljZSAqKWluLAorCWFycF9zZW5kKEFSUE9QX1JFUExZLCBFVEhfUF9BUlAsICpzaXB0ciwgKHN0cnVjdCBuZXRfZGV2aWNlICopcGFyLT5pbiwKIAkJICpkaXB0ciwgc2hwLCBpbmZvLT5tYWMsIHNocCk7CiAKIAlyZXR1cm4gaW5mby0+dGFyZ2V0OwogfQogCi1zdGF0aWMgaW50IGVidF90YXJnZXRfcmVwbHlfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCi0gICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sIGVidF9hcnByZXBseV90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8pKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKEJBU0VfQ0hBSU4gJiYgaW5mby0+dGFyZ2V0ID09IEVCVF9SRVRVUk4pCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGUtPmV0aHByb3RvICE9IGh0b25zKEVUSF9QX0FSUCkgfHwKIAkgICAgZS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpIHx8IGhvb2ttYXNrICYgfigxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IHJlcGx5X3RhcmdldCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9BUlBSRVBMWV9UQVJHRVQsCi0JLnRhcmdldAkJPSBlYnRfdGFyZ2V0X3JlcGx5LAotCS5jaGVjawkJPSBlYnRfdGFyZ2V0X3JlcGx5X2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X2FycHJlcGx5X3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJhcnByZXBseSIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS50YWJsZQkJPSAibmF0IiwKKwkuaG9va3MJCT0gKDEgPDwgTkZfQlJfTlVNSE9PS1MpIHwgKDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpLAorCS50YXJnZXQJCT0gZWJ0X2FycHJlcGx5X3RnLAorCS5jaGVja2VudHJ5CT0gZWJ0X2FycHJlcGx5X3RnX2NoZWNrLAorCS50YXJnZXRzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbykpLAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVidF9hcnByZXBseV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl90YXJnZXQoJnJlcGx5X3RhcmdldCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmZWJ0X2FycHJlcGx5X3RnX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfYXJwcmVwbHlfZmluaSh2b2lkKQogewotCWVidF91bnJlZ2lzdGVyX3RhcmdldCgmcmVwbHlfdGFyZ2V0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmZWJ0X2FycHJlcGx5X3RnX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9hcnByZXBseV9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9kbmF0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfZG5hdC5jCmluZGV4IGNhNjRjMWMuLjZiNDllYTkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9kbmF0LmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2RuYXQuYwpAQCAtNywxOCArNywxNyBAQAogICogIEp1bmUsIDIwMDIKICAqCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaD4KIAotc3RhdGljIGludCBlYnRfdGFyZ2V0X2RuYXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X2RuYXRfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIDApKQogCQlyZXR1cm4gRUJUX0RST1A7CkBAIC0yNyw0MCArMjYsNDYgQEAKIAlyZXR1cm4gaW5mby0+dGFyZ2V0OwogfQogCi1zdGF0aWMgaW50IGVidF90YXJnZXRfZG5hdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0X2RuYXRfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9uYXRfaW5mbyAqaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9uYXRfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJdW5zaWduZWQgaW50IGhvb2tfbWFzazsKIAogCWlmIChCQVNFX0NIQUlOICYmIGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKLQlpZiAoIChzdHJjbXAodGFibGVuYW1lLCAibmF0IikgfHwKLQkgICAoaG9va21hc2sgJiB+KCgxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0JSX0xPQ0FMX09VVCkpKSkgJiYKLQkgICAoc3RyY21wKHRhYmxlbmFtZSwgImJyb3V0ZSIpIHx8IGhvb2ttYXNrICYgfigxIDw8IE5GX0JSX0JST1VUSU5HKSkgKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKKworCWhvb2tfbWFzayA9IHBhci0+aG9va19tYXNrICYgfigxIDw8IE5GX0JSX05VTUhPT0tTKTsKKwlpZiAoKHN0cmNtcChwYXItPnRhYmxlLCAibmF0IikgIT0gMCB8fAorCSAgICAoaG9va19tYXNrICYgfigoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfAorCSAgICAoMSA8PCBORl9CUl9MT0NBTF9PVVQpKSkpICYmCisJICAgIChzdHJjbXAocGFyLT50YWJsZSwgImJyb3V0ZSIpICE9IDAgfHwKKwkgICAgaG9va19tYXNrICYgfigxIDw8IE5GX0JSX0JST1VUSU5HKSkpCisJCXJldHVybiBmYWxzZTsKIAlpZiAoSU5WQUxJRF9UQVJHRVQpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X3RhcmdldCBkbmF0IF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCT0gRUJUX0ROQVRfVEFSR0VULAotCS50YXJnZXQJCT0gZWJ0X3RhcmdldF9kbmF0LAotCS5jaGVjawkJPSBlYnRfdGFyZ2V0X2RuYXRfY2hlY2ssCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBlYnRfZG5hdF90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiZG5hdCIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5ob29rcwkJPSAoMSA8PCBORl9CUl9OVU1IT09LUykgfCAoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfAorCQkJICAoMSA8PCBORl9CUl9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfQlJfQlJPVVRJTkcpLAorCS50YXJnZXQJCT0gZWJ0X2RuYXRfdGcsCisJLmNoZWNrZW50cnkJPSBlYnRfZG5hdF90Z19jaGVjaywKKwkudGFyZ2V0c2l6ZQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X25hdF9pbmZvKSksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X2RuYXRfaW5pdCh2b2lkKQogewotCXJldHVybiBlYnRfcmVnaXN0ZXJfdGFyZ2V0KCZkbmF0KTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZlYnRfZG5hdF90Z19yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWJ0X2RuYXRfZmluaSh2b2lkKQogewotCWVidF91bnJlZ2lzdGVyX3RhcmdldCgmZG5hdCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmVidF9kbmF0X3RnX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9kbmF0X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwppbmRleCA2NWNhYTAwLi5kNzcxYmJmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwpAQCAtMTEsMjQgKzExLDIzIEBACiAgKiAgICBJbm5vbWluYXRlIFNlY3VyaXR5IFRlY2hub2xvZ2llcyBBRyA8bWhvcGZAaW5ub21pbmF0ZS5jb20+CiAgKiAgICBTZXB0ZW1iZXIsIDIwMDIKICAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oPgogCiBzdHJ1Y3QgdGNwdWRwaGRyIHsKIAlfX2JlMTYgc3JjOwogCV9fYmUxNiBkc3Q7CiB9OwogCi1zdGF0aWMgaW50IGVidF9maWx0ZXJfaXAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwKLSAgIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wKK2VidF9pcF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X2lwX2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfaXBfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaWg7CiAJc3RydWN0IGlwaGRyIF9pcGg7CiAJY29uc3Qgc3RydWN0IHRjcHVkcGhkciAqcHB0cjsKQEAgLTM2LDkyICszNSw5MyBAQAogCiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2lwaCksICZfaXBoKTsKIAlpZiAoaWggPT0gTlVMTCkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfVE9TICYmCiAJICAgRldJTlYoaW5mby0+dG9zICE9IGloLT50b3MsIEVCVF9JUF9UT1MpKQotCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCXJldHVybiBmYWxzZTsKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9JUF9TT1VSQ0UgJiYKIAkgICBGV0lOVigoaWgtPnNhZGRyICYgaW5mby0+c21zaykgIT0KIAkgICBpbmZvLT5zYWRkciwgRUJUX0lQX1NPVVJDRSkpCi0JCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmICgoaW5mby0+Yml0bWFzayAmIEVCVF9JUF9ERVNUKSAmJgogCSAgIEZXSU5WKChpaC0+ZGFkZHIgJiBpbmZvLT5kbXNrKSAhPQogCSAgIGluZm8tPmRhZGRyLCBFQlRfSVBfREVTVCkpCi0JCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1BST1RPKSB7CiAJCWlmIChGV0lOVihpbmZvLT5wcm90b2NvbCAhPSBpaC0+cHJvdG9jb2wsIEVCVF9JUF9QUk9UTykpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmICghKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfRFBPUlQpICYmCiAJCSAgICAhKGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfU1BPUlQpKQotCQkJcmV0dXJuIEVCVF9NQVRDSDsKKwkJCXJldHVybiB0cnVlOwogCQlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGloLT5paGwqNCwKIAkJCQkJICBzaXplb2YoX3BvcnRzKSwgJl9wb3J0cyk7CiAJCWlmIChwcHRyID09IE5VTEwpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUKSB7CiAJCQl1MzIgZHN0ID0gbnRvaHMocHB0ci0+ZHN0KTsKIAkJCWlmIChGV0lOVihkc3QgPCBpbmZvLT5kcG9ydFswXSB8fAogCQkJCSAgZHN0ID4gaW5mby0+ZHBvcnRbMV0sCiAJCQkJICBFQlRfSVBfRFBPUlQpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1NQT1JUKSB7CiAJCQl1MzIgc3JjID0gbnRvaHMocHB0ci0+c3JjKTsKIAkJCWlmIChGV0lOVihzcmMgPCBpbmZvLT5zcG9ydFswXSB8fAogCQkJCSAgc3JjID4gaW5mby0+c3BvcnRbMV0sCiAJCQkJICBFQlRfSVBfU1BPUlQpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfQotCXJldHVybiBFQlRfTUFUQ0g7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgZWJ0X2lwX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfaXBfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9pcF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X2lwX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplID0gcGFyLT5lbnRyeWluZm87CiAKLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfaXBfaW5mbykpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZS0+ZXRocHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApIHx8CiAJICAgZS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgfkVCVF9JUF9NQVNLIHx8IGluZm8tPmludmZsYWdzICYgfkVCVF9JUF9NQVNLKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgKEVCVF9JUF9EUE9SVCB8IEVCVF9JUF9TUE9SVCkpIHsKIAkJaWYgKGluZm8tPmludmZsYWdzICYgRUJUX0lQX1BST1RPKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKIAkJICAgIGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fVURQTElURSAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19TQ1RQICYmCiAJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX0RDQ1ApCi0JCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkgcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9JUF9EUE9SVCAmJiBpbmZvLT5kcG9ydFswXSA+IGluZm8tPmRwb3J0WzFdKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1NQT1JUICYmIGluZm8tPnNwb3J0WzBdID4gaW5mby0+c3BvcnRbMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGZpbHRlcl9pcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9JUF9NQVRDSCwKLQkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl9pcCwKLQkuY2hlY2sJCT0gZWJ0X2lwX2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlYnRfaXBfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gImlwIiwKKwkucmV2aXNpb24JPSAwLAorCS5mYW1pbHkJCT0gTkZQUk9UT19CUklER0UsCisJLm1hdGNoCQk9IGVidF9pcF9tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF9pcF9tdF9jaGVjaywKKwkubWF0Y2hzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfaXBfaW5mbykpLAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVidF9pcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX2lwKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmVidF9pcF9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWJ0X2lwX2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX2lwKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZlYnRfaXBfbXRfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X2lwX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwNi5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwNi5jCmluZGV4IDM2ZWZiM2EuLjc4NGE2NTcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcDYuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXA2LmMKQEAgLTEzLDI2ICsxMywyNCBAQAogICoKICAqICBKYW4sIDIwMDgKICAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwNi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXA2Lmg+CiAKIHN0cnVjdCB0Y3B1ZHBoZHIgewogCV9fYmUxNiBzcmM7CiAJX19iZTE2IGRzdDsKIH07CiAKLXN0YXRpYyBpbnQgZWJ0X2ZpbHRlcl9pcDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsCi0gICB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sCitlYnRfaXA2X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfaXA2X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9pcDZfaW5mbyAqKWRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9pcDZfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppaDY7CiAJc3RydWN0IGlwdjZoZHIgX2lwNmg7CiAJY29uc3Qgc3RydWN0IHRjcHVkcGhkciAqcHB0cjsKQEAgLTQyLDEwMCArNDAsMTAwIEBACiAKIAlpaDYgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2lwNmgpLCAmX2lwNmgpOwogCWlmIChpaDYgPT0gTlVMTCkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1RDTEFTUyAmJgogCSAgIEZXSU5WKGluZm8tPnRjbGFzcyAhPSBpcHY2X2dldF9kc2ZpZWxkKGloNiksIEVCVF9JUDZfVENMQVNTKSkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJdG1wX2FkZHIuaW42X3UudTZfYWRkcjMyW2ldID0gaWg2LT5zYWRkci5pbjZfdS51Nl9hZGRyMzJbaV0gJgogCQkJaW5mby0+c21zay5pbjZfdS51Nl9hZGRyMzJbaV07CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1NPVVJDRSAmJgogCQlGV0lOVigoaXB2Nl9hZGRyX2NtcCgmdG1wX2FkZHIsICZpbmZvLT5zYWRkcikgIT0gMCksCiAJCQlFQlRfSVA2X1NPVVJDRSkpCi0JCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJcmV0dXJuIGZhbHNlOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCXRtcF9hZGRyLmluNl91LnU2X2FkZHIzMltpXSA9IGloNi0+ZGFkZHIuaW42X3UudTZfYWRkcjMyW2ldICYKIAkJCWluZm8tPmRtc2suaW42X3UudTZfYWRkcjMyW2ldOwogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9ERVNUICYmCiAJICAgRldJTlYoKGlwdjZfYWRkcl9jbXAoJnRtcF9hZGRyLCAmaW5mby0+ZGFkZHIpICE9IDApLCBFQlRfSVA2X0RFU1QpKQotCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCXJldHVybiBmYWxzZTsKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfUFJPVE8pIHsKIAkJdWludDhfdCBuZXh0aGRyID0gaWg2LT5uZXh0aGRyOwogCQlpbnQgb2Zmc2V0X3BoOwogCiAJCW9mZnNldF9waCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2YoX2lwNmgpLCAmbmV4dGhkcik7CiAJCWlmIChvZmZzZXRfcGggPT0gLTEpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChGV0lOVihpbmZvLT5wcm90b2NvbCAhPSBuZXh0aGRyLCBFQlRfSVA2X1BST1RPKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAkJaWYgKCEoaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfRFBPUlQpICYmCiAJCSAgICAhKGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1NQT1JUKSkKLQkJCXJldHVybiBFQlRfTUFUQ0g7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldF9waCwgc2l6ZW9mKF9wb3J0cyksCiAJCQkJCSAgJl9wb3J0cyk7CiAJCWlmIChwcHRyID09IE5VTEwpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9EUE9SVCkgewogCQkJdTMyIGRzdCA9IG50b2hzKHBwdHItPmRzdCk7CiAJCQlpZiAoRldJTlYoZHN0IDwgaW5mby0+ZHBvcnRbMF0gfHwKIAkJCQkgIGRzdCA+IGluZm8tPmRwb3J0WzFdLCBFQlRfSVA2X0RQT1JUKSkKLQkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9TUE9SVCkgewogCQkJdTMyIHNyYyA9IG50b2hzKHBwdHItPnNyYyk7CiAJCQlpZiAoRldJTlYoc3JjIDwgaW5mby0+c3BvcnRbMF0gfHwKIAkJCQkgIHNyYyA+IGluZm8tPnNwb3J0WzFdLCBFQlRfSVA2X1NQT1JUKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlyZXR1cm4gRUJUX01BVENIOworCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0JcmV0dXJuIEVCVF9NQVRDSDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBlYnRfaXA2X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfaXA2X210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCBlYnRfaXA2X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9pcDZfaW5mbyAqKWRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOworCXN0cnVjdCBlYnRfaXA2X2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9pcDZfaW5mbykpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZS0+ZXRocHJvdG8gIT0gaHRvbnMoRVRIX1BfSVBWNikgfHwgZS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChpbmZvLT5iaXRtYXNrICYgfkVCVF9JUDZfTUFTSyB8fCBpbmZvLT5pbnZmbGFncyAmIH5FQlRfSVA2X01BU0spCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiAoRUJUX0lQNl9EUE9SVCB8IEVCVF9JUDZfU1BPUlQpKSB7CiAJCWlmIChpbmZvLT5pbnZmbGFncyAmIEVCVF9JUDZfUFJPVE8pCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBmYWxzZTsKIAkJaWYgKGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fVENQICYmCiAJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFBMSVRFICYmCiAJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1NDVFAgJiYKIAkJICAgIGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fRENDUCkKLQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X0RQT1JUICYmIGluZm8tPmRwb3J0WzBdID4gaW5mby0+ZHBvcnRbMV0pCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1NQT1JUICYmIGluZm8tPnNwb3J0WzBdID4gaW5mby0+c3BvcnRbMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGZpbHRlcl9pcDYgPQotewotCS5uYW1lCQk9IEVCVF9JUDZfTUFUQ0gsCi0JLm1hdGNoCQk9IGVidF9maWx0ZXJfaXA2LAotCS5jaGVjawkJPSBlYnRfaXA2X2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlYnRfaXA2X210X3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJpcDYiLAorCS5yZXZpc2lvbgk9IDAsCisJLmZhbWlseQkJPSBORlBST1RPX0JSSURHRSwKKwkubWF0Y2gJCT0gZWJ0X2lwNl9tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF9pcDZfbXRfY2hlY2ssCisJLm1hdGNoc2l6ZQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2lwNl9pbmZvKSksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X2lwNl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX2lwNik7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZlYnRfaXA2X210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfaXA2X2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX2lwNik7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmZWJ0X2lwNl9tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChlYnRfaXA2X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xpbWl0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbGltaXQuYwppbmRleCA4Y2JkYzAxYy4uZjdiZDkxOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xpbWl0LmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xpbWl0LmMKQEAgLTEwLDEzICsxMCwxMiBAQAogICogIFNlcHRlbWJlciwgMjAwMwogICoKICAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9saW1pdC5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpbWl0X2xvY2spOwogCkBAIC0zMSwxMSArMzAsMTAgQEAKIAogI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKIAotc3RhdGljIGludCBlYnRfbGltaXRfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wKK2VidF9saW1pdF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9saW1pdF9pbmZvICopZGF0YTsKKwlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKmluZm8gPSAodm9pZCAqKXBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCXNwaW5fbG9ja19iaCgmbGltaXRfbG9jayk7CkBAIC00NywxMSArNDUsMTEgQEAKIAkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCiAJCWluZm8tPmNyZWRpdCAtPSBpbmZvLT5jb3N0OwogCQlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JCXJldHVybiBFQlRfTUFUQ0g7CisJCXJldHVybiB0cnVlOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKLQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKiBQcmVjaXNpb24gc2F2ZXIuICovCkBAIC02NiwyMCArNjQsMTYgQEAKIAlyZXR1cm4gKHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZKSAvIEVCVF9MSU1JVF9TQ0FMRTsKIH0KIAotc3RhdGljIGludCBlYnRfbGltaXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCi0gICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sIGVidF9saW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKmluZm8gPSBkYXRhOwotCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8pKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IGVidF9saW1pdF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCiAJaWYgKGluZm8tPmJ1cnN0ID09IDAgfHwKIAkgICAgdXNlcjJjcmVkaXRzKGluZm8tPmF2ZyAqIGluZm8tPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhpbmZvLT5hdmcpKSB7CiAJCXByaW50aygiT3ZlcmZsb3cgaW4gZWJ0X2xpbWl0LCB0cnkgbG93ZXI6ICV1LyV1XG4iLAogCQkJaW5mby0+YXZnLCBpbmZvLT5idXJzdCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIEVCVF9MSU1JVF9TQ0FMRTogY29udmVydCB0byBqaWZmaWVzICogMTI4LiAqLwpAQCAtODcsMjQgKzgxLDI3IEBACiAJaW5mby0+Y3JlZGl0ID0gdXNlcjJjcmVkaXRzKGluZm8tPmF2ZyAqIGluZm8tPmJ1cnN0KTsKIAlpbmZvLT5jcmVkaXRfY2FwID0gdXNlcjJjcmVkaXRzKGluZm8tPmF2ZyAqIGluZm8tPmJ1cnN0KTsKIAlpbmZvLT5jb3N0ID0gdXNlcjJjcmVkaXRzKGluZm8tPmF2Zyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X21hdGNoIGVidF9saW1pdF9yZWcgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSBFQlRfTElNSVRfTUFUQ0gsCi0JLm1hdGNoCQk9IGVidF9saW1pdF9tYXRjaCwKLQkuY2hlY2sJCT0gZWJ0X2xpbWl0X2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlYnRfbGltaXRfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gImxpbWl0IiwKKwkucmV2aXNpb24JPSAwLAorCS5mYW1pbHkJCT0gTkZQUk9UT19CUklER0UsCisJLm1hdGNoCQk9IGVidF9saW1pdF9tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF9saW1pdF9tdF9jaGVjaywKKwkubWF0Y2hzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbGltaXRfaW5mbykpLAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVidF9saW1pdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZWJ0X2xpbWl0X3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZlYnRfbGltaXRfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9saW1pdF9maW5pKHZvaWQpCiB7Ci0JZWJ0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF9saW1pdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF9saW1pdF9tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChlYnRfbGltaXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggMmY0MzBkNC4uM2QzM2M2MCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtOCwxMCArOCw2IEBACiAgKiAgQXByaWwsIDIwMDIKICAqCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9sb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CkBAIC0yMSwyMiArMTcsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWJ0X2xvZ19sb2NrKTsKIAotc3RhdGljIGludCBlYnRfbG9nX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfbG9nX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSBkYXRhOworCXN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2xvZ19pbmZvKSkpCi0JCXJldHVybiAtRUlOVkFMOwogCWlmIChpbmZvLT5iaXRtYXNrICYgfkVCVF9MT0dfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAlpZiAoaW5mby0+bG9nbGV2ZWwgPj0gOCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAlpbmZvLT5wcmVmaXhbRUJUX0xPR19QUkVGSVhfU0laRSAtIDFdID0gJ1wwJzsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RydWN0IHRjcHVkcGhkcgpAQCAtODQsNyArODEsNyBAQAogCiAjZGVmaW5lIG15TklQUVVBRChhKSBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdCiBzdGF0aWMgdm9pZAotZWJ0X2xvZ19wYWNrZXQodW5zaWduZWQgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSwKK2VidF9sb2dfcGFja2V0KHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSwKICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsb2dpbmZvLAogICAgY29uc3QgY2hhciAqcHJlZml4KQpAQCAtMTk0LDExICsxOTEsMTAgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBlYnRfbG9nKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rbnIsCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2VidF9sb2dfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBuZl9sb2dpbmZvIGxpOwogCiAJbGkudHlwZSA9IE5GX0xPR19UWVBFX0xPRzsKQEAgLTIwNiwxOCArMjAyLDIxIEBACiAJbGkudS5sb2cubG9nZmxhZ3MgPSBpbmZvLT5iaXRtYXNrOwogCiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfTE9HX05GTE9HKQotCQluZl9sb2dfcGFja2V0KFBGX0JSSURHRSwgaG9va25yLCBza2IsIGluLCBvdXQsICZsaSwKLQkJCSAgICAgICIlcyIsIGluZm8tPnByZWZpeCk7CisJCW5mX2xvZ19wYWNrZXQoTkZQUk9UT19CUklER0UsIHBhci0+aG9va251bSwgc2tiLCBwYXItPmluLAorCQkgICAgICAgICAgICAgIHBhci0+b3V0LCAmbGksICIlcyIsIGluZm8tPnByZWZpeCk7CiAJZWxzZQotCQllYnRfbG9nX3BhY2tldChQRl9CUklER0UsIGhvb2tuciwgc2tiLCBpbiwgb3V0LCAmbGksCi0JCQkgICAgICAgaW5mby0+cHJlZml4KTsKKwkJZWJ0X2xvZ19wYWNrZXQoTkZQUk9UT19CUklER0UsIHBhci0+aG9va251bSwgc2tiLCBwYXItPmluLAorCQkgICAgICAgICAgICAgICBwYXItPm91dCwgJmxpLCBpbmZvLT5wcmVmaXgpOworCXJldHVybiBFQlRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X3dhdGNoZXIgbG9nID0KLXsKLQkubmFtZQkJPSBFQlRfTE9HX1dBVENIRVIsCi0JLndhdGNoZXIJPSBlYnRfbG9nLAotCS5jaGVjawkJPSBlYnRfbG9nX2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X2xvZ190Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAibG9nIiwKKwkucmV2aXNpb24JPSAwLAorCS5mYW1pbHkJCT0gTkZQUk9UT19CUklER0UsCisJLnRhcmdldAkJPSBlYnRfbG9nX3RnLAorCS5jaGVja2VudHJ5CT0gZWJ0X2xvZ190Z19jaGVjaywKKwkudGFyZ2V0c2l6ZQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X2xvZ19pbmZvKSksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtMjMxLDE3ICsyMzAsMTcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoJmxvZyk7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZlYnRfbG9nX3RnX3JlZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JbmZfbG9nX3JlZ2lzdGVyKFBGX0JSSURHRSwgJmVidF9sb2dfbG9nZ2VyKTsKKwluZl9sb2dfcmVnaXN0ZXIoTkZQUk9UT19CUklER0UsICZlYnRfbG9nX2xvZ2dlcik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfbG9nX2Zpbmkodm9pZCkKIHsKIAluZl9sb2dfdW5yZWdpc3RlcigmZWJ0X2xvZ19sb2dnZXIpOwotCWVidF91bnJlZ2lzdGVyX3dhdGNoZXIoJmxvZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmVidF9sb2dfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X2xvZ19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFyay5jCmluZGV4IDM2NzIzZjQuLjJmZWU3ZTggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmsuYwpAQCAtMTMsMTUgKzEzLDE1IEBACiAgKiBNYXJraW5nIGEgZnJhbWUgZG9lc24ndCByZWFsbHkgY2hhbmdlIGFueXRoaW5nIGluIHRoZSBmcmFtZSBhbnl3YXkuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotc3RhdGljIGludCBlYnRfdGFyZ2V0X21hcmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X21hcmtfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfbWFya190X2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfbWFya190X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCWludCBhY3Rpb24gPSBpbmZvLT50YXJnZXQgJiAtMTY7CiAKIAlpZiAoYWN0aW9uID09IE1BUktfU0VUX1ZBTFVFKQpAQCAtMzYsNDIgKzM2LDQxIEBACiAJcmV0dXJuIGluZm8tPnRhcmdldCB8IH5FQlRfVkVSRElDVF9CSVRTOwogfQogCi1zdGF0aWMgaW50IGVidF90YXJnZXRfbWFya19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKLSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0X21hcmtfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJaW50IHRtcDsKIAotCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9tYXJrX3RfaW5mbykpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAl0bXAgPSBpbmZvLT50YXJnZXQgfCB+RUJUX1ZFUkRJQ1RfQklUUzsKIAlpZiAoQkFTRV9DSEFJTiAmJiB0bXAgPT0gRUJUX1JFVFVSTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JQ0xFQVJfQkFTRV9DSEFJTl9CSVQ7CisJCXJldHVybiBmYWxzZTsKIAlpZiAodG1wIDwgLU5VTV9TVEFOREFSRF9UQVJHRVRTIHx8IHRtcCA+PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCXRtcCA9IGluZm8tPnRhcmdldCAmIH5FQlRfVkVSRElDVF9CSVRTOwogCWlmICh0bXAgIT0gTUFSS19TRVRfVkFMVUUgJiYgdG1wICE9IE1BUktfT1JfVkFMVUUgJiYKIAkgICAgdG1wICE9IE1BUktfQU5EX1ZBTFVFICYmIHRtcCAhPSBNQVJLX1hPUl9WQUxVRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IG1hcmtfdGFyZ2V0IF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCT0gRUJUX01BUktfVEFSR0VULAotCS50YXJnZXQJCT0gZWJ0X3RhcmdldF9tYXJrLAotCS5jaGVjawkJPSBlYnRfdGFyZ2V0X21hcmtfY2hlY2ssCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBlYnRfbWFya190Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAibWFyayIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS50YXJnZXQJCT0gZWJ0X21hcmtfdGcsCisJLmNoZWNrZW50cnkJPSBlYnRfbWFya190Z19jaGVjaywKKwkudGFyZ2V0c2l6ZQk9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvKSksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X21hcmtfaW5pdCh2b2lkKQogewotCXJldHVybiBlYnRfcmVnaXN0ZXJfdGFyZ2V0KCZtYXJrX3RhcmdldCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmZWJ0X21hcmtfdGdfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9tYXJrX2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl90YXJnZXQoJm1hcmtfdGFyZ2V0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmZWJ0X21hcmtfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X21hcmtfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFya19tLmMKaW5kZXggOWIwYTQ1NC4uZWE1NzBmMiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrX20uYwpAQCAtNyw1MyArNyw1MiBAQAogICogIEp1bHksIDIwMDIKICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotc3RhdGljIGludCBlYnRfZmlsdGVyX21hcmsoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwKLSAgIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wKK2VidF9tYXJrX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfbWFya19tX2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfbWFya19tX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX01BUktfT1IpCi0JCXJldHVybiAhKCEhKHNrYi0+bWFyayAmIGluZm8tPm1hc2spIF4gaW5mby0+aW52ZXJ0KTsKLQlyZXR1cm4gISgoKHNrYi0+bWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0KTsKKwkJcmV0dXJuICEhKHNrYi0+bWFyayAmIGluZm8tPm1hc2spIF4gaW5mby0+aW52ZXJ0OworCXJldHVybiAoKHNrYi0+bWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OwogfQogCi1zdGF0aWMgaW50IGVidF9tYXJrX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfbWFya19tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbWFya19tX2luZm8pKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiB+RUJUX01BUktfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAlpZiAoKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19PUikgJiYgKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19BTkQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCWlmICghaW5mby0+Yml0bWFzaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfbWF0Y2ggZmlsdGVyX21hcmsgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSBFQlRfTUFSS19NQVRDSCwKLQkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl9tYXJrLAotCS5jaGVjawkJPSBlYnRfbWFya19jaGVjaywKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZWJ0X21hcmtfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gIm1hcmtfbSIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfbWFya19tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF9tYXJrX210X2NoZWNrLAorCS5tYXRjaHNpemUJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9tYXJrX21faW5mbykpLAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVidF9tYXJrX21faW5pdCh2b2lkKQogewotCXJldHVybiBlYnRfcmVnaXN0ZXJfbWF0Y2goJmZpbHRlcl9tYXJrKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmVidF9tYXJrX210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfbWFya19tX2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX21hcmspOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF9tYXJrX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9tYXJrX21faW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbmZsb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9uZmxvZy5jCmluZGV4IDhlNzk5YWEuLjJhNjNkOTk2IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbmZsb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbmZsb2cuYwpAQCAtMTQsMTcgKzE0LDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uZmxvZy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbG9nLmg+CiAKLXN0YXRpYyB2b2lkIGVidF9uZmxvZyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va25yLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X25mbG9nX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgZWJ0X25mbG9nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9uZmxvZ19pbmZvICopZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X25mbG9nX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBuZl9sb2dpbmZvIGxpOwogCiAJbGkudHlwZSA9IE5GX0xPR19UWVBFX1VMT0c7CkBAIC0zMiwzOSArMzAsMzkgQEAKIAlsaS51LnVsb2cuZ3JvdXAgPSBpbmZvLT5ncm91cDsKIAlsaS51LnVsb2cucXRocmVzaG9sZCA9IGluZm8tPnRocmVzaG9sZDsKIAotCW5mX2xvZ19wYWNrZXQoUEZfQlJJREdFLCBob29rbnIsIHNrYiwgaW4sIG91dCwgJmxpLCAiJXMiLCBpbmZvLT5wcmVmaXgpOworCW5mX2xvZ19wYWNrZXQoUEZfQlJJREdFLCBwYXItPmhvb2tudW0sIHNrYiwgcGFyLT5pbiwgcGFyLT5vdXQsCisJICAgICAgICAgICAgICAmbGksICIlcyIsIGluZm8tPnByZWZpeCk7CisJcmV0dXJuIEVCVF9DT05USU5VRTsKIH0KIAotc3RhdGljIGludCBlYnRfbmZsb2dfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotCQkJICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwKLQkJCSAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0X25mbG9nX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X25mbG9nX2luZm8gKilkYXRhOworCXN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbmZsb2dfaW5mbykpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaW5mby0+ZmxhZ3MgJiB+RUJUX05GTE9HX01BU0spCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJaW5mby0+cHJlZml4W0VCVF9ORkxPR19QUkVGSVhfU0laRSAtIDFdID0gJ1wwJzsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfd2F0Y2hlciBuZmxvZyBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lID0gRUJUX05GTE9HX1dBVENIRVIsCi0JLndhdGNoZXIgPSBlYnRfbmZsb2csCi0JLmNoZWNrID0gZWJ0X25mbG9nX2NoZWNrLAotCS5tZSA9IFRISVNfTU9EVUxFLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X25mbG9nX3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lICAgICAgID0gIm5mbG9nIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX0JSSURHRSwKKwkudGFyZ2V0ICAgICA9IGVidF9uZmxvZ190ZywKKwkuY2hlY2tlbnRyeSA9IGVidF9uZmxvZ190Z19jaGVjaywKKwkudGFyZ2V0c2l6ZSA9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X25mbG9nX2luZm8pKSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X25mbG9nX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoJm5mbG9nKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZlYnRfbmZsb2dfdGdfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9uZmxvZ19maW5pKHZvaWQpCiB7Ci0JZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcigmbmZsb2cpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZlYnRfbmZsb2dfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X25mbG9nX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3BrdHR5cGUuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9wa3R0eXBlLmMKaW5kZXggNjc2ZGIzMi4uODgzZTk2ZSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3BrdHR5cGUuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcGt0dHlwZS5jCkBAIC03LDUwICs3LDQ3IEBACiAgKiAgQXByaWwsIDIwMDMKICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9wa3R0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLXN0YXRpYyBpbnQgZWJ0X2ZpbHRlcl9wa3R0eXBlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgY29uc3Qgdm9pZCAqZGF0YSwKLSAgIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wKK2VidF9wa3R0eXBlX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCi0JcmV0dXJuIChza2ItPnBrdF90eXBlICE9IGluZm8tPnBrdF90eXBlKSBeIGluZm8tPmludmVydDsKKwlyZXR1cm4gKHNrYi0+cGt0X3R5cGUgPT0gaW5mby0+cGt0X3R5cGUpIF4gaW5mby0+aW52ZXJ0OwogfQogCi1zdGF0aWMgaW50IGVidF9wa3R0eXBlX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfcGt0dHlwZV9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9wa3R0eXBlX2luZm8pKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGluZm8tPmludmVydCAhPSAwICYmIGluZm8tPmludmVydCAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCS8qIEFsbG93IGFueSBwa3RfdHlwZSB2YWx1ZSAqLwotCXJldHVybiAwOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfcGt0dHlwZSBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9QS1RUWVBFX01BVENILAotCS5tYXRjaAkJPSBlYnRfZmlsdGVyX3BrdHR5cGUsCi0JLmNoZWNrCQk9IGVidF9wa3R0eXBlX2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlYnRfcGt0dHlwZV9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAicGt0dHlwZSIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfcGt0dHlwZV9tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF9wa3R0eXBlX210X2NoZWNrLAorCS5tYXRjaHNpemUJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9wa3R0eXBlX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfcGt0dHlwZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX3BrdHR5cGUpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmZWJ0X3BrdHR5cGVfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9wa3R0eXBlX2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX3BrdHR5cGUpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF9wa3R0eXBlX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9wa3R0eXBlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcmVkaXJlY3QuYwppbmRleCBiOGFmZTg1Li5jOGE0OWY3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcmVkaXJlY3QuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfcmVkaXJlY3QuYwpAQCAtNyw2NSArNyw3MCBAQAogICogIEFwcmlsLCAyMDAyCiAgKgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaD4KIAotc3RhdGljIGludCBlYnRfdGFyZ2V0X3JlZGlyZWN0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rbnIsCi0gICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2VidF9yZWRpcmVjdF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIDApKQogCQlyZXR1cm4gRUJUX0RST1A7CiAKLQlpZiAoaG9va25yICE9IE5GX0JSX0JST1VUSU5HKQorCWlmIChwYXItPmhvb2tudW0gIT0gTkZfQlJfQlJPVVRJTkcpCiAJCW1lbWNweShldGhfaGRyKHNrYiktPmhfZGVzdCwKLQkJICAgICAgIGluLT5icl9wb3J0LT5ici0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCQkgICAgICAgcGFyLT5pbi0+YnJfcG9ydC0+YnItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAllbHNlCi0JCW1lbWNweShldGhfaGRyKHNrYiktPmhfZGVzdCwgaW4tPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShldGhfaGRyKHNrYiktPmhfZGVzdCwgcGFyLT5pbi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJcmV0dXJuIGluZm8tPnRhcmdldDsKIH0KIAotc3RhdGljIGludCBlYnRfdGFyZ2V0X3JlZGlyZWN0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfcmVkaXJlY3RfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOworCXVuc2lnbmVkIGludCBob29rX21hc2s7CiAKLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbykpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoQkFTRV9DSEFJTiAmJiBpbmZvLT50YXJnZXQgPT0gRUJUX1JFVFVSTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JQ0xFQVJfQkFTRV9DSEFJTl9CSVQ7Ci0JaWYgKCAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpIHx8IGhvb2ttYXNrICYgfigxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSkgJiYKLQkgICAgIChzdHJjbXAodGFibGVuYW1lLCAiYnJvdXRlIikgfHwgaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfQlJPVVRJTkcpKSApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CisKKwlob29rX21hc2sgPSBwYXItPmhvb2tfbWFzayAmIH4oMSA8PCBORl9CUl9OVU1IT09LUyk7CisJaWYgKChzdHJjbXAocGFyLT50YWJsZSwgIm5hdCIpICE9IDAgfHwKKwkgICAgaG9va19tYXNrICYgfigxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSkgJiYKKwkgICAgKHN0cmNtcChwYXItPnRhYmxlLCAiYnJvdXRlIikgIT0gMCB8fAorCSAgICBob29rX21hc2sgJiB+KDEgPDwgTkZfQlJfQlJPVVRJTkcpKSkKKwkJcmV0dXJuIGZhbHNlOwogCWlmIChJTlZBTElEX1RBUkdFVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBlYnRfdGFyZ2V0IHJlZGlyZWN0X3RhcmdldCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9SRURJUkVDVF9UQVJHRVQsCi0JLnRhcmdldAkJPSBlYnRfdGFyZ2V0X3JlZGlyZWN0LAotCS5jaGVjawkJPSBlYnRfdGFyZ2V0X3JlZGlyZWN0X2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X3JlZGlyZWN0X3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJyZWRpcmVjdCIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5ob29rcwkJPSAoMSA8PCBORl9CUl9OVU1IT09LUykgfCAoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfAorCQkJICAoMSA8PCBORl9CUl9CUk9VVElORyksCisJLnRhcmdldAkJPSBlYnRfcmVkaXJlY3RfdGcsCisJLmNoZWNrZW50cnkJPSBlYnRfcmVkaXJlY3RfdGdfY2hlY2ssCisJLnRhcmdldHNpemUJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvKSksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZWJ0X3JlZGlyZWN0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZWJ0X3JlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfdGFyZ2V0KTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZlYnRfcmVkaXJlY3RfdGdfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9yZWRpcmVjdF9maW5pKHZvaWQpCiB7Ci0JZWJ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF90YXJnZXQpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZlYnRfcmVkaXJlY3RfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X3JlZGlyZWN0X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3NuYXQuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zbmF0LmMKaW5kZXggNTQyNTMzMy4uOGQwNGQ0YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3NuYXQuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jCkBAIC03LDIwICs3LDE5IEBACiAgKiAgSnVuZSwgMjAwMgogICoKICAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaD4KIAotc3RhdGljIGludCBlYnRfdGFyZ2V0X3NuYXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X3NuYXRfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIDApKQogCQlyZXR1cm4gRUJUX0RST1A7CkBAIC00Myw0NiArNDIsNDMgQEAKIAlyZXR1cm4gaW5mby0+dGFyZ2V0IHwgfkVCVF9WRVJESUNUX0JJVFM7CiB9CiAKLXN0YXRpYyBpbnQgZWJ0X3RhcmdldF9zbmF0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAotICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbCBlYnRfc25hdF90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgZWJ0X25hdF9pbmZvICppbmZvID0gZGF0YTsKKwljb25zdCBzdHJ1Y3QgZWJ0X25hdF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKIAlpbnQgdG1wOwogCi0JaWYgKGRhdGFsZW4gIT0gRUJUX0FMSUdOKHNpemVvZihzdHJ1Y3QgZWJ0X25hdF9pbmZvKSkpCi0JCXJldHVybiAtRUlOVkFMOwogCXRtcCA9IGluZm8tPnRhcmdldCB8IH5FQlRfVkVSRElDVF9CSVRTOwogCWlmIChCQVNFX0NIQUlOICYmIHRtcCA9PSBFQlRfUkVUVVJOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm5hdCIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfUE9TVF9ST1VUSU5HKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAogCWlmICh0bXAgPCAtTlVNX1NUQU5EQVJEX1RBUkdFVFMgfHwgdG1wID49IDApCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJdG1wID0gaW5mby0+dGFyZ2V0IHwgRUJUX1ZFUkRJQ1RfQklUUzsKIAlpZiAoKHRtcCAmIH5OQVRfQVJQX0JJVCkgIT0gfk5BVF9BUlBfQklUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF90YXJnZXQgc25hdCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9TTkFUX1RBUkdFVCwKLQkudGFyZ2V0CQk9IGVidF90YXJnZXRfc25hdCwKLQkuY2hlY2sJCT0gZWJ0X3RhcmdldF9zbmF0X2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X3NuYXRfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInNuYXQiLAorCS5yZXZpc2lvbgk9IDAsCisJLmZhbWlseQkJPSBORlBST1RPX0JSSURHRSwKKwkudGFibGUJCT0gIm5hdCIsCisJLmhvb2tzCQk9ICgxIDw8IE5GX0JSX05VTUhPT0tTKSB8ICgxIDw8IE5GX0JSX1BPU1RfUk9VVElORyksCisJLnRhcmdldAkJPSBlYnRfc25hdF90ZywKKwkuY2hlY2tlbnRyeQk9IGVidF9zbmF0X3RnX2NoZWNrLAorCS50YXJnZXRzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfc25hdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl90YXJnZXQoJnNuYXQpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJmVidF9zbmF0X3RnX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRfc25hdF9maW5pKHZvaWQpCiB7Ci0JZWJ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZzbmF0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmZWJ0X3NuYXRfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoZWJ0X3NuYXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc3RwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc3RwLmMKaW5kZXggNDBmMzZkMy4uNDg1MjdlNiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3N0cC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zdHAuYwpAQCAtNywxMSArNywxMSBAQAogICoKICAqICBKdWx5LCAyMDAzCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaD4KIAogI2RlZmluZSBCUERVX1RZUEVfQ09ORklHIDAKICNkZWZpbmUgQlBEVV9UWVBFX1RDTiAweDgwCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIE5SMTYocCkgKHBbMF0gPDwgOCB8IHBbMV0pCiAjZGVmaW5lIE5SMzIocCkgKChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgcFszXSkKIAotc3RhdGljIGludCBlYnRfZmlsdGVyX2NvbmZpZyhjb25zdCBzdHJ1Y3QgZWJ0X3N0cF9pbmZvICppbmZvLAorc3RhdGljIGJvb2wgZWJ0X2ZpbHRlcl9jb25maWcoY29uc3Qgc3RydWN0IGVidF9zdHBfaW5mbyAqaW5mbywKICAgIGNvbnN0IHN0cnVjdCBzdHBfY29uZmlnX3BkdSAqc3RwYykKIHsKIAljb25zdCBzdHJ1Y3QgZWJ0X3N0cF9jb25maWdfaW5mbyAqYzsKQEAgLTUxLDEyICs1MSwxMiBAQAogCWMgPSAmaW5mby0+Y29uZmlnOwogCWlmICgoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfRkxBR1MpICYmCiAJICAgIEZXSU5WKGMtPmZsYWdzICE9IHN0cGMtPmZsYWdzLCBFQlRfU1RQX0ZMQUdTKSkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX1JPT1RQUklPKSB7CiAJCXYxNiA9IE5SMTYoc3RwYy0+cm9vdCk7CiAJCWlmIChGV0lOVih2MTYgPCBjLT5yb290X3ByaW9sIHx8CiAJCSAgICB2MTYgPiBjLT5yb290X3ByaW91LCBFQlRfU1RQX1JPT1RQUklPKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX1JPT1RBRERSKSB7CiAJCXZlcmRpY3QgPSAwOwpAQCAtNjQsMTkgKzY0LDE5IEBACiAJCQl2ZXJkaWN0IHw9IChzdHBjLT5yb290WzIraV0gXiBjLT5yb290X2FkZHJbaV0pICYKIAkJCQkgICBjLT5yb290X2FkZHJtc2tbaV07CiAJCWlmIChGV0lOVih2ZXJkaWN0ICE9IDAsIEVCVF9TVFBfUk9PVEFERFIpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfUk9PVENPU1QpIHsKIAkJdjMyID0gTlIzMihzdHBjLT5yb290X2Nvc3QpOwogCQlpZiAoRldJTlYodjMyIDwgYy0+cm9vdF9jb3N0bCB8fAogCQkgICAgdjMyID4gYy0+cm9vdF9jb3N0dSwgRUJUX1NUUF9ST09UQ09TVCkpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX1NUUF9TRU5ERVJQUklPKSB7CiAJCXYxNiA9IE5SMTYoc3RwYy0+c2VuZGVyKTsKIAkJaWYgKEZXSU5WKHYxNiA8IGMtPnNlbmRlcl9wcmlvbCB8fAogCQkgICAgdjE2ID4gYy0+c2VuZGVyX3ByaW91LCBFQlRfU1RQX1NFTkRFUlBSSU8pKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfU0VOREVSQUREUikgewogCQl2ZXJkaWN0ID0gMDsKQEAgLTg0LDYwICs4NCw2MCBAQAogCQkJdmVyZGljdCB8PSAoc3RwYy0+c2VuZGVyWzIraV0gXiBjLT5zZW5kZXJfYWRkcltpXSkgJgogCQkJCSAgIGMtPnNlbmRlcl9hZGRybXNrW2ldOwogCQlpZiAoRldJTlYodmVyZGljdCAhPSAwLCBFQlRfU1RQX1NFTkRFUkFERFIpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfUE9SVCkgewogCQl2MTYgPSBOUjE2KHN0cGMtPnBvcnQpOwogCQlpZiAoRldJTlYodjE2IDwgYy0+cG9ydGwgfHwKIAkJICAgIHYxNiA+IGMtPnBvcnR1LCBFQlRfU1RQX1BPUlQpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfTVNHQUdFKSB7CiAJCXYxNiA9IE5SMTYoc3RwYy0+bXNnX2FnZSk7CiAJCWlmIChGV0lOVih2MTYgPCBjLT5tc2dfYWdlbCB8fAogCQkgICAgdjE2ID4gYy0+bXNnX2FnZXUsIEVCVF9TVFBfTVNHQUdFKSkKLQkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX01BWEFHRSkgewogCQl2MTYgPSBOUjE2KHN0cGMtPm1heF9hZ2UpOwogCQlpZiAoRldJTlYodjE2IDwgYy0+bWF4X2FnZWwgfHwKIAkJICAgIHYxNiA+IGMtPm1heF9hZ2V1LCBFQlRfU1RQX01BWEFHRSkpCi0JCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX1NUUF9IRUxMT1RJTUUpIHsKIAkJdjE2ID0gTlIxNihzdHBjLT5oZWxsb190aW1lKTsKIAkJaWYgKEZXSU5WKHYxNiA8IGMtPmhlbGxvX3RpbWVsIHx8CiAJCSAgICB2MTYgPiBjLT5oZWxsb190aW1ldSwgRUJUX1NUUF9IRUxMT1RJTUUpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfRldERCkgewogCQl2MTYgPSBOUjE2KHN0cGMtPmZvcndhcmRfZGVsYXkpOwogCQlpZiAoRldJTlYodjE2IDwgYy0+Zm9yd2FyZF9kZWxheWwgfHwKIAkJICAgIHYxNiA+IGMtPmZvcndhcmRfZGVsYXl1LCBFQlRfU1RQX0ZXREQpKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCX0KLQlyZXR1cm4gRUJUX01BVENIOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IGVidF9maWx0ZXJfc3RwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wKK2VidF9zdHBfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9zdHBfaW5mbyAqaW5mbyA9IGRhdGE7CisJY29uc3Qgc3RydWN0IGVidF9zdHBfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBzdHBfaGVhZGVyICpzcDsKIAlzdHJ1Y3Qgc3RwX2hlYWRlciBfc3RwaDsKIAljb25zdCB1aW50OF90IGhlYWRlcls2XSA9IHsweDQyLCAweDQyLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKIAogCXNwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9zdHBoKSwgJl9zdHBoKTsKIAlpZiAoc3AgPT0gTlVMTCkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBUaGUgc3RwIGNvZGUgb25seSBjb25zaWRlcnMgdGhlc2UgKi8KIAlpZiAobWVtY21wKHNwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9TVFBfVFlQRQogCSAgICAmJiBGV0lOVihpbmZvLT50eXBlICE9IHNwLT50eXBlLCBFQlRfU1RQX1RZUEUpKQotCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChzcC0+dHlwZSA9PSBCUERVX1RZUEVfQ09ORklHICYmCiAJICAgIGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX0NPTkZJR19NQVNLKSB7CkBAIC0xNDcsNDggKzE0Nyw0OCBAQAogCQlzdCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihfc3RwaCksCiAJCQkJCXNpemVvZihfc3RwYyksICZfc3RwYyk7CiAJCWlmIChzdCA9PSBOVUxMKQotCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gZWJ0X2ZpbHRlcl9jb25maWcoaW5mbywgc3QpOwogCX0KLQlyZXR1cm4gRUJUX01BVENIOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IGVidF9zdHBfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCi0gICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sIGVidF9zdHBfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF9zdHBfaW5mbyAqaW5mbyA9IGRhdGE7Ci0JY29uc3QgdW5zaWduZWQgaW50IGxlbiA9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9zdHBfaW5mbykpOworCWNvbnN0IHN0cnVjdCBlYnRfc3RwX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCB1aW50OF90IGJyaWRnZV91bGFbNl0gPSB7MHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMH07CiAJY29uc3QgdWludDhfdCBtc2tbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisJY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKGluZm8tPmJpdG1hc2sgJiB+RUJUX1NUUF9NQVNLIHx8IGluZm8tPmludmZsYWdzICYgfkVCVF9TVFBfTUFTSyB8fAogCSAgICAhKGluZm8tPmJpdG1hc2sgJiBFQlRfU1RQX01BU0spKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGF0YWxlbiAhPSBsZW4pCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJLyogTWFrZSBzdXJlIHRoZSBtYXRjaCBvbmx5IHJlY2VpdmVzIHN0cCBmcmFtZXMgKi8KIAlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGUtPmRlc3RtYWMsIGJyaWRnZV91bGEpIHx8CiAJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihlLT5kZXN0bXNrLCBtc2spIHx8ICEoZS0+Yml0bWFzayAmIEVCVF9ERVNUTUFDKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiAwOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfc3RwIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUJCT0gRUJUX1NUUF9NQVRDSCwKLQkubWF0Y2gJCT0gZWJ0X2ZpbHRlcl9zdHAsCi0JLmNoZWNrCQk9IGVidF9zdHBfY2hlY2ssCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGVidF9zdHBfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInN0cCIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfc3RwX210LAorCS5jaGVja2VudHJ5CT0gZWJ0X3N0cF9tdF9jaGVjaywKKwkubWF0Y2hzaXplCT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfc3RwX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfc3RwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZWJ0X3JlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfc3RwKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmVidF9zdHBfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF9zdHBfZmluaSh2b2lkKQogewotCWVidF91bnJlZ2lzdGVyX21hdGNoKCZmaWx0ZXJfc3RwKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZlYnRfc3RwX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF9zdHBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwppbmRleCAyZDRjOWVmLi4yYzZkNjgyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbG9nLmg+CkBAIC0yMjMsNyArMjI0LDcgQEAKIH0KIAogLyogdGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIG5ldGZpbHRlciBjb3JlICovCi1zdGF0aWMgdm9pZCBlYnRfbG9nX3BhY2tldCh1bnNpZ25lZCBpbnQgcGYsIHVuc2lnbmVkIGludCBob29rbnVtLAorc3RhdGljIHZvaWQgZWJ0X2xvZ19wYWNrZXQodV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rbnVtLAogICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmxpLAogICAgY29uc3QgY2hhciAqcHJlZml4KQpAQCAtMjQ1LDI0ICsyNDYsMjAgQEAKIAllYnRfdWxvZ19wYWNrZXQoaG9va251bSwgc2tiLCBpbiwgb3V0LCAmbG9naW5mbywgcHJlZml4KTsKIH0KIAotc3RhdGljIHZvaWQgZWJ0X3Vsb2coY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIHVuc2lnbmVkIGludAorZWJ0X3Vsb2dfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBlYnRfdWxvZ19pbmZvICp1bG9naW5mbyA9IGRhdGE7Ci0KLQllYnRfdWxvZ19wYWNrZXQoaG9va25yLCBza2IsIGluLCBvdXQsIHVsb2dpbmZvLCBOVUxMKTsKKwllYnRfdWxvZ19wYWNrZXQocGFyLT5ob29rbnVtLCBza2IsIHBhci0+aW4sIHBhci0+b3V0LAorCSAgICAgICAgICAgICAgICBwYXItPnRhcmdpbmZvLCBOVUxMKTsKKwlyZXR1cm4gRUJUX0NPTlRJTlVFOwogfQogCi0KLXN0YXRpYyBpbnQgZWJ0X3Vsb2dfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCi0gICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3N0YXRpYyBib29sIGVidF91bG9nX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCBlYnRfdWxvZ19pbmZvICp1bG9naW5mbyA9IGRhdGE7CisJc3RydWN0IGVidF91bG9nX2luZm8gKnVsb2dpbmZvID0gcGFyLT50YXJnaW5mbzsKIAotCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF91bG9nX2luZm8pKSB8fAotCSAgICB1bG9naW5mby0+bmxncm91cCA+IDMxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodWxvZ2luZm8tPm5sZ3JvdXAgPiAzMSkKKwkJcmV0dXJuIGZhbHNlOwogCiAJdWxvZ2luZm8tPnByZWZpeFtFQlRfVUxPR19QUkVGSVhfTEVOIC0gMV0gPSAnXDAnOwogCkBAIC0yNzIsMjcgKzI2OSwzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF93YXRjaGVyIHVsb2cgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSBFQlRfVUxPR19XQVRDSEVSLAotCS53YXRjaGVyCT0gZWJ0X3Vsb2csCi0JLmNoZWNrCQk9IGVidF91bG9nX2NoZWNrLAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgZWJ0X3Vsb2dfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInVsb2ciLAorCS5yZXZpc2lvbgk9IDAsCisJLmZhbWlseQkJPSBORlBST1RPX0JSSURHRSwKKwkudGFyZ2V0CQk9IGVidF91bG9nX3RnLAorCS5jaGVja2VudHJ5CT0gZWJ0X3Vsb2dfdGdfY2hlY2ssCisJLnRhcmdldHNpemUJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF91bG9nX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mX2xvZ2dlciBlYnRfdWxvZ19sb2dnZXIgPSB7Ci0JLm5hbWUJCT0gRUJUX1VMT0dfV0FUQ0hFUiwKKwkubmFtZQkJPSAidWxvZyIsCiAJLmxvZ2ZuCQk9ICZlYnRfbG9nX3BhY2tldCwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlYnRfdWxvZ19pbml0KHZvaWQpCiB7Ci0JaW50IGksIHJldCA9IDA7CisJYm9vbCByZXQgPSB0cnVlOworCWludCBpOwogCiAJaWYgKG5sYnVmc2l6ID49IDEyOCoxMDI0KSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiZWJ0X3Vsb2c6IE5ldGxpbmsgYnVmZmVyIGhhcyB0byBiZSA8PSAxMjhrQiwiCiAJCSAgICAgICAiIHBsZWFzZSB0cnkgYSBzbWFsbGVyIG5sYnVmc2l6IHBhcmFtZXRlci5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIGluaXRpYWxpemUgdWxvZ19idWZmZXJzICovCkBAIC0zMDQsMTMgKzMwNSwxNiBAQAogCWVidHVsb2dubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsIE5FVExJTktfTkZMT0csCiAJCQkJCSAgRUJUX1VMT0dfTUFYTkxHUk9VUFMsIE5VTEwsIE5VTEwsCiAJCQkJCSAgVEhJU19NT0RVTEUpOwotCWlmICghZWJ0dWxvZ25sKQotCQlyZXQgPSAtRU5PTUVNOwotCWVsc2UgaWYgKChyZXQgPSBlYnRfcmVnaXN0ZXJfd2F0Y2hlcigmdWxvZykpKQorCWlmICghZWJ0dWxvZ25sKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUgIjogb3V0IG9mIG1lbW9yeSB0cnlpbmcgdG8gIgorCQkgICAgICAgImNhbGwgbmV0bGlua19rZXJuZWxfY3JlYXRlXG4iKTsKKwkJcmV0ID0gZmFsc2U7CisJfSBlbHNlIGlmICh4dF9yZWdpc3Rlcl90YXJnZXQoJmVidF91bG9nX3RnX3JlZykgIT0gMCkgewogCQluZXRsaW5rX2tlcm5lbF9yZWxlYXNlKGVidHVsb2dubCk7CisJfQogCi0JaWYgKHJldCA9PSAwKQotCQluZl9sb2dfcmVnaXN0ZXIoUEZfQlJJREdFLCAmZWJ0X3Vsb2dfbG9nZ2VyKTsKKwlpZiAocmV0KQorCQluZl9sb2dfcmVnaXN0ZXIoTkZQUk9UT19CUklER0UsICZlYnRfdWxvZ19sb2dnZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMyMSw3ICszMjUsNyBAQAogCWludCBpOwogCiAJbmZfbG9nX3VucmVnaXN0ZXIoJmVidF91bG9nX2xvZ2dlcik7Ci0JZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcigmdWxvZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmVidF91bG9nX3RnX3JlZyk7CiAJZm9yIChpID0gMDsgaSA8IEVCVF9VTE9HX01BWE5MR1JPVVBTOyBpKyspIHsKIAkJdWIgPSAmdWxvZ19idWZmZXJzW2ldOwogCQlpZiAodGltZXJfcGVuZGluZygmdWItPnRpbWVyKSkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jCmluZGV4IGFiNjBiMGQuLjNkZGRkNDggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3ZsYW4uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmg+CiAKQEAgLTM3LDE1ICszOCwxMiBAQAogCiAjZGVmaW5lIERFQlVHX01TRyhhcmdzLi4uKSBpZiAoZGVidWcpIHByaW50ayAoS0VSTl9ERUJVRyAiZWJ0X3ZsYW46ICIgYXJncykKICNkZWZpbmUgR0VUX0JJVE1BU0soX0JJVF9NQVNLXykgaW5mby0+Yml0bWFzayAmIF9CSVRfTUFTS18KLSNkZWZpbmUgRVhJVF9PTl9NSVNNQVRDSChfTUFUQ0hfLF9NQVNLXykge2lmICghKChpbmZvLT5fTUFUQ0hfID09IF9NQVRDSF8pXiEhKGluZm8tPmludmZsYWdzICYgX01BU0tfKSkpIHJldHVybiBFQlRfTk9NQVRDSDt9CisjZGVmaW5lIEVYSVRfT05fTUlTTUFUQ0goX01BVENIXyxfTUFTS18pIHtpZiAoISgoaW5mby0+X01BVENIXyA9PSBfTUFUQ0hfKV4hIShpbmZvLT5pbnZmbGFncyAmIF9NQVNLXykpKSByZXR1cm4gZmFsc2U7IH0KIAotc3RhdGljIGludAotZWJ0X2ZpbHRlcl92bGFuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4pCitzdGF0aWMgYm9vbAorZWJ0X3ZsYW5fbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGVidF92bGFuX2luZm8gKmluZm8gPSBkYXRhOworCWNvbnN0IHN0cnVjdCBlYnRfdmxhbl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IHZsYW5faGRyICpmcDsKIAlzdHJ1Y3Qgdmxhbl9oZHIgX2ZyYW1lOwogCkBAIC01Nyw3ICs1NSw3IEBACiAKIAlmcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfZnJhbWUpLCAmX2ZyYW1lKTsKIAlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoVENJKSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgogCSAqIC0gVXNlcl9wcmlvcml0eS4gVGhlIHVzZXJfcHJpb3JpdHkgZmllbGQgaXMgdGhyZWUgYml0cyBpbiBsZW5ndGgsCkBAIC04MywzMCArODEsMjAgQEAKIAlpZiAoR0VUX0JJVE1BU0soRUJUX1ZMQU5fRU5DQVApKQogCQlFWElUX09OX01JU01BVENIKGVuY2FwLCBFQlRfVkxBTl9FTkNBUCk7CiAKLQlyZXR1cm4gRUJUX01BVENIOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50Ci1lYnRfY2hlY2tfdmxhbihjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIHVuc2lnbmVkIGludCBob29rbnIsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorc3RhdGljIGJvb2wgZWJ0X3ZsYW5fbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IGVidF92bGFuX2luZm8gKmluZm8gPSBkYXRhOwotCi0JLyogUGFyYW1ldGVycyBidWZmZXIgb3ZlcmZsb3cgY2hlY2sgKi8KLQlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfdmxhbl9pbmZvKSkpIHsKLQkJREVCVUdfTVNHCi0JCSAgICAoInBhc3NlZCBzaXplICVkIGlzIG5vdCBlcSB0byBlYnRfdmxhbl9pbmZvICglWmQpXG4iLAotCQkgICAgIGRhdGFsZW4sIHNpemVvZihzdHJ1Y3QgZWJ0X3ZsYW5faW5mbykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJc3RydWN0IGVidF92bGFuX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplID0gcGFyLT5lbnRyeWluZm87CiAKIAkvKiBJcyBpdCA4MDIuMVEgZnJhbWUgY2hlY2tlZD8gKi8KIAlpZiAoZS0+ZXRocHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCURFQlVHX01TRwogCQkgICAgKCJwYXNzZWQgZW50cnkgcHJvdG8gJTIuNFggaXMgbm90IDgwMi4xUSAoODEwMClcbiIsCiAJCSAgICAgKHVuc2lnbmVkIHNob3J0KSBudG9ocyhlLT5ldGhwcm90bykpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIENoZWNrIGZvciBiaXRtYXNrIHJhbmdlCkBAIC0xMTQsMTQgKzEwMiwxNCBAQAogCWlmIChpbmZvLT5iaXRtYXNrICYgfkVCVF9WTEFOX01BU0spIHsKIAkJREVCVUdfTVNHKCJiaXRtYXNrICUyWCBpcyBvdXQgb2YgbWFzayAoJTJYKVxuIiwKIAkJCSAgaW5mby0+Yml0bWFzaywgRUJUX1ZMQU5fTUFTSyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogQ2hlY2sgZm9yIGludmVyc2lvbiBmbGFncyByYW5nZSAqLwogCWlmIChpbmZvLT5pbnZmbGFncyAmIH5FQlRfVkxBTl9NQVNLKSB7CiAJCURFQlVHX01TRygiaW52ZXJzaW9uIGZsYWdzICUyWCBpcyBvdXQgb2YgbWFzayAoJTJYKVxuIiwKIAkJCSAgaW5mby0+aW52ZmxhZ3MsIEVCVF9WTEFOX01BU0spOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qIFJlc2VydmVkIFZMQU4gSUQgKFZJRCkgdmFsdWVzCkBAIC0xMzYsNyArMTI0LDcgQEAKIAkJCQlERUJVR19NU0cKIAkJCQkgICAgKCJpZCAlZCBpcyBvdXQgb2YgcmFuZ2UgKDEtNDA5NilcbiIsCiAJCQkJICAgICBpbmZvLT5pZCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJLyogTm90ZTogVGhpcyBpcyB2YWxpZCBWTEFOLXRhZ2dlZCBmcmFtZSBwb2ludC4KIAkJCSAqIEFueSB2YWx1ZSBvZiB1c2VyX3ByaW9yaXR5IGFyZSBhY2NlcHRhYmxlLApAQCAtMTUxLDcgKzEzOSw3IEBACiAJCWlmICgodW5zaWduZWQgY2hhcikgaW5mby0+cHJpbyA+IDcpIHsKIAkJCURFQlVHX01TRygicHJpbyAlZCBpcyBvdXQgb2YgcmFuZ2UgKDAtNylcbiIsCiAJCQkgICAgIGluZm8tPnByaW8pOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAJLyogQ2hlY2sgZm9yIGVuY2Fwc3VsYXRlZCBwcm90byByYW5nZSAtIGl0IGlzIHBvc3NpYmxlIHRvIGJlCkBAIC0xNjIsMTcgKzE1MCwyMCBAQAogCQkJREVCVUdfTVNHCiAJCQkgICAgKCJlbmNhcCBmcmFtZSBsZW5ndGggJWQgaXMgbGVzcyB0aGFuIG1pbmltYWxcbiIsCiAJCQkgICAgIG50b2hzKGluZm8tPmVuY2FwKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KIAotCXJldHVybiAwOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGVidF9tYXRjaCBmaWx0ZXJfdmxhbiBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9IEVCVF9WTEFOX01BVENILAotCS5tYXRjaAkJPSBlYnRfZmlsdGVyX3ZsYW4sCi0JLmNoZWNrCQk9IGVidF9jaGVja192bGFuLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlYnRfdmxhbl9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAidmxhbiIsCisJLnJldmlzaW9uCT0gMCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQlJJREdFLAorCS5tYXRjaAkJPSBlYnRfdmxhbl9tdCwKKwkuY2hlY2tlbnRyeQk9IGVidF92bGFuX210X2NoZWNrLAorCS5tYXRjaHNpemUJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF92bGFuX2luZm8pKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCiB9OwogCkBAIC0xODEsMTIgKzE3MiwxMiBAQAogCURFQlVHX01TRygiZWJ0YWJsZXMgODAyLjFRIGV4dGVuc2lvbiBtb2R1bGUgdiIKIAkJICBNT0RVTEVfVkVSUyAiXG4iKTsKIAlERUJVR19NU0coIm1vZHVsZSBkZWJ1Zz0lZFxuIiwgISFkZWJ1Zyk7Ci0JcmV0dXJuIGVidF9yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX3ZsYW4pOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmZWJ0X3ZsYW5fbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGVidF92bGFuX2Zpbmkodm9pZCkKIHsKLQllYnRfdW5yZWdpc3Rlcl9tYXRjaCgmZmlsdGVyX3ZsYW4pOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVidF92bGFuX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGVidF92bGFuX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKaW5kZXggMzJhZmZmOC4uNWJiODhlYiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtNTUsMjkgKzU2LDMxIEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgoZWJ0X211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQoZWJ0X3RhYmxlcyk7Ci1zdGF0aWMgTElTVF9IRUFEKGVidF90YXJnZXRzKTsKLXN0YXRpYyBMSVNUX0hFQUQoZWJ0X21hdGNoZXMpOwotc3RhdGljIExJU1RfSEVBRChlYnRfd2F0Y2hlcnMpOwogCi1zdGF0aWMgc3RydWN0IGVidF90YXJnZXQgZWJ0X3N0YW5kYXJkX3RhcmdldCA9Ci17IHtOVUxMLCBOVUxMfSwgRUJUX1NUQU5EQVJEX1RBUkdFVCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBlYnRfc3RhbmRhcmRfdGFyZ2V0ID0geworCS5uYW1lICAgICAgID0gInN0YW5kYXJkIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX0JSSURHRSwKKwkudGFyZ2V0c2l6ZSA9IHNpemVvZihpbnQpLAorfTsKIAotc3RhdGljIGlubGluZSBpbnQgZWJ0X2RvX3dhdGNoZXIgKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdywKLSAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rbnIsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCitzdGF0aWMgaW5saW5lIGludAorZWJ0X2RvX3dhdGNoZXIoY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0Jdy0+dS53YXRjaGVyLT53YXRjaGVyKHNrYiwgaG9va25yLCBpbiwgb3V0LCB3LT5kYXRhLAotCSAgIHctPndhdGNoZXJfc2l6ZSk7CisJcGFyLT50YXJnZXQgICA9IHctPnUud2F0Y2hlcjsKKwlwYXItPnRhcmdpbmZvID0gdy0+ZGF0YTsKKwl3LT51LndhdGNoZXItPnRhcmdldChza2IsIHBhcik7CiAJLyogd2F0Y2hlcnMgZG9uJ3QgZ2l2ZSBhIHZlcmRpY3QgKi8KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWJ0X2RvX21hdGNoIChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLAotICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCkKKyAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCXJldHVybiBtLT51Lm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPmRhdGEsCi0JICAgbS0+bWF0Y2hfc2l6ZSk7CisJcGFyLT5tYXRjaCAgICAgPSBtLT51Lm1hdGNoOworCXBhci0+bWF0Y2hpbmZvID0gbS0+ZGF0YTsKKwlyZXR1cm4gbS0+dS5tYXRjaC0+bWF0Y2goc2tiLCBwYXIpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlYnRfZGV2X2NoZWNrKGNoYXIgKmVudHJ5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aWNlKQpAQCAtMTUzLDYgKzE1NiwxNSBAQAogCXN0cnVjdCBlYnRfZW50cmllcyAqY2hhaW5pbmZvOwogCWNoYXIgKmJhc2U7CiAJc3RydWN0IGVidF90YWJsZV9pbmZvICpwcml2YXRlOworCWJvb2wgaG90ZHJvcCA9IGZhbHNlOworCXN0cnVjdCB4dF9tYXRjaF9wYXJhbSBtdHBhcjsKKwlzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtIHRncGFyOworCisJbXRwYXIuZmFtaWx5ICA9IHRncGFyLmZhbWlseSA9IE5GUFJPVE9fQlJJREdFOworCW10cGFyLmluICAgICAgPSB0Z3Bhci5pbiAgPSBpbjsKKwltdHBhci5vdXQgICAgID0gdGdwYXIub3V0ID0gb3V0OworCW10cGFyLmhvdGRyb3AgPSAmaG90ZHJvcDsKKwl0Z3Bhci5ob29rbnVtID0gaG9vazsKIAogCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOwogCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKQEAgLTE3Myw4ICsxODUsMTIgQEAKIAkJaWYgKGVidF9iYXNpY19tYXRjaChwb2ludCwgZXRoX2hkcihza2IpLCBpbiwgb3V0KSkKIAkJCWdvdG8gbGV0c2NvbnRpbnVlOwogCi0JCWlmIChFQlRfTUFUQ0hfSVRFUkFURShwb2ludCwgZWJ0X2RvX21hdGNoLCBza2IsIGluLCBvdXQpICE9IDApCisJCWlmIChFQlRfTUFUQ0hfSVRFUkFURShwb2ludCwgZWJ0X2RvX21hdGNoLCBza2IsICZtdHBhcikgIT0gMCkKIAkJCWdvdG8gbGV0c2NvbnRpbnVlOworCQlpZiAoaG90ZHJvcCkgeworCQkJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKwkJCXJldHVybiBORl9EUk9QOworCQl9CiAKIAkJLyogaW5jcmVhc2UgY291bnRlciAqLwogCQkoKihjb3VudGVyX2Jhc2UgKyBpKSkucGNudCsrOwpAQCAtMTgyLDE3ICsxOTgsMTggQEAKIAogCQkvKiB0aGVzZSBzaG91bGQgb25seSB3YXRjaDogbm90IG1vZGlmeSwgbm9yIHRlbGwgdXMKIAkJICAgd2hhdCB0byBkbyB3aXRoIHRoZSBwYWNrZXQgKi8KLQkJRUJUX1dBVENIRVJfSVRFUkFURShwb2ludCwgZWJ0X2RvX3dhdGNoZXIsIHNrYiwgaG9vaywgaW4sCi0JCSAgIG91dCk7CisJCUVCVF9XQVRDSEVSX0lURVJBVEUocG9pbnQsIGVidF9kb193YXRjaGVyLCBza2IsICZ0Z3Bhcik7CiAKIAkJdCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKQogCQkgICAoKChjaGFyICopcG9pbnQpICsgcG9pbnQtPnRhcmdldF9vZmZzZXQpOwogCQkvKiBzdGFuZGFyZCB0YXJnZXQgKi8KIAkJaWYgKCF0LT51LnRhcmdldC0+dGFyZ2V0KQogCQkJdmVyZGljdCA9ICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0KS0+dmVyZGljdDsKLQkJZWxzZQotCQkJdmVyZGljdCA9IHQtPnUudGFyZ2V0LT50YXJnZXQoc2tiLCBob29rLAotCQkJICAgaW4sIG91dCwgdC0+ZGF0YSwgdC0+dGFyZ2V0X3NpemUpOworCQllbHNlIHsKKwkJCXRncGFyLnRhcmdldCAgID0gdC0+dS50YXJnZXQ7CisJCQl0Z3Bhci50YXJnaW5mbyA9IHQtPmRhdGE7CisJCQl2ZXJkaWN0ID0gdC0+dS50YXJnZXQtPnRhcmdldChza2IsICZ0Z3Bhcik7CisJCX0KIAkJaWYgKHZlcmRpY3QgPT0gRUJUX0FDQ0VQVCkgewogCQkJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKIAkJCXJldHVybiBORl9BQ0NFUFQ7CkBAIC0zMTIsODAgKzMyOSw3MSBAQAogCXJldHVybiBmaW5kX2lubGlzdF9sb2NrKCZlYnRfdGFibGVzLCBuYW1lLCAiZWJ0YWJsZV8iLCBlcnJvciwgbXV0ZXgpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfbWF0Y2ggKgotZmluZF9tYXRjaF9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBtdXRleCAqbXV0ZXgpCi17Ci0JcmV0dXJuIGZpbmRfaW5saXN0X2xvY2soJmVidF9tYXRjaGVzLCBuYW1lLCAiZWJ0XyIsIGVycm9yLCBtdXRleCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGVidF93YXRjaGVyICoKLWZpbmRfd2F0Y2hlcl9sb2NrKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqZXJyb3IsIHN0cnVjdCBtdXRleCAqbXV0ZXgpCi17Ci0JcmV0dXJuIGZpbmRfaW5saXN0X2xvY2soJmVidF93YXRjaGVycywgbmFtZSwgImVidF8iLCBlcnJvciwgbXV0ZXgpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfdGFyZ2V0ICoKLWZpbmRfdGFyZ2V0X2xvY2soY29uc3QgY2hhciAqbmFtZSwgaW50ICplcnJvciwgc3RydWN0IG11dGV4ICptdXRleCkKLXsKLQlyZXR1cm4gZmluZF9pbmxpc3RfbG9jaygmZWJ0X3RhcmdldHMsIG5hbWUsICJlYnRfIiwgZXJyb3IsIG11dGV4KTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQKLWVidF9jaGVja19tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLCBzdHJ1Y3QgZWJ0X2VudHJ5ICplLAotICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgKmNudCkKK2VidF9jaGVja19tYXRjaChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptLCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhciwKKwkJdW5zaWduZWQgaW50ICpjbnQpCiB7Ci0Jc3RydWN0IGVidF9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IGVidF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOworCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CiAJc2l6ZV90IGxlZnQgPSAoKGNoYXIgKillICsgZS0+d2F0Y2hlcnNfb2Zmc2V0KSAtIChjaGFyICopbTsKIAlpbnQgcmV0OwogCiAJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCkgfHwKIAkgICAgbGVmdCAtIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSA8IG0tPm1hdGNoX3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwotCW1hdGNoID0gZmluZF9tYXRjaF9sb2NrKG0tPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7Ci0JaWYgKCFtYXRjaCkKLQkJcmV0dXJuIHJldDsKLQltLT51Lm1hdGNoID0gbWF0Y2g7Ci0JaWYgKCF0cnlfbW9kdWxlX2dldChtYXRjaC0+bWUpKSB7Ci0JCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKKworCW1hdGNoID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF9tYXRjaChORlBST1RPX0JSSURHRSwKKwkJbS0+dS5uYW1lLCAwKSwgImVidF8lcyIsIG0tPnUubmFtZSk7CisJaWYgKElTX0VSUihtYXRjaCkpCisJCXJldHVybiBQVFJfRVJSKG1hdGNoKTsKKwlpZiAobWF0Y2ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKLQlpZiAobWF0Y2gtPmNoZWNrICYmCi0JICAgbWF0Y2gtPmNoZWNrKG5hbWUsIGhvb2ttYXNrLCBlLCBtLT5kYXRhLCBtLT5tYXRjaF9zaXplKSAhPSAwKSB7Ci0JCUJVR1BSSU5UKCJtYXRjaC0+Y2hlY2sgZmFpbGVkXG4iKTsKKwltLT51Lm1hdGNoID0gbWF0Y2g7CisKKwlwYXItPm1hdGNoICAgICA9IG1hdGNoOworCXBhci0+bWF0Y2hpbmZvID0gbS0+ZGF0YTsKKwlyZXQgPSB4dF9jaGVja19tYXRjaChwYXIsIG0tPm1hdGNoX3NpemUsCisJICAgICAgZS0+ZXRocHJvdG8sIGUtPmludmZsYWdzICYgRUJUX0lQUk9UTyk7CisJaWYgKHJldCA8IDApIHsKIAkJbW9kdWxlX3B1dChtYXRjaC0+bWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CisKIAkoKmNudCkrKzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWVidF9jaGVja193YXRjaGVyKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdywgc3RydWN0IGVidF9lbnRyeSAqZSwKLSAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50ICpjbnQpCitlYnRfY2hlY2tfd2F0Y2hlcihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncsIHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyLAorCQkgIHVuc2lnbmVkIGludCAqY250KQogewotCXN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcjsKKwljb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5ICplID0gcGFyLT5lbnRyeWluZm87CisJc3RydWN0IHh0X3RhcmdldCAqd2F0Y2hlcjsKIAlzaXplX3QgbGVmdCA9ICgoY2hhciAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0KSAtIChjaGFyICopdzsKIAlpbnQgcmV0OwogCiAJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSB8fAogCSAgIGxlZnQgLSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSA8IHctPndhdGNoZXJfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jd2F0Y2hlciA9IGZpbmRfd2F0Y2hlcl9sb2NrKHctPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7Ci0JaWYgKCF3YXRjaGVyKQotCQlyZXR1cm4gcmV0OwotCXctPnUud2F0Y2hlciA9IHdhdGNoZXI7Ci0JaWYgKCF0cnlfbW9kdWxlX2dldCh3YXRjaGVyLT5tZSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOworCisJd2F0Y2hlciA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKAorCQkgIHh0X2ZpbmRfdGFyZ2V0KE5GUFJPVE9fQlJJREdFLCB3LT51Lm5hbWUsIDApLAorCQkgICJlYnRfJXMiLCB3LT51Lm5hbWUpOworCWlmIChJU19FUlIod2F0Y2hlcikpCisJCXJldHVybiBQVFJfRVJSKHdhdGNoZXIpOworCWlmICh3YXRjaGVyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwotCX0KLQltdXRleF91bmxvY2soJmVidF9tdXRleCk7Ci0JaWYgKHdhdGNoZXItPmNoZWNrICYmCi0JICAgd2F0Y2hlci0+Y2hlY2sobmFtZSwgaG9va21hc2ssIGUsIHctPmRhdGEsIHctPndhdGNoZXJfc2l6ZSkgIT0gMCkgewotCQlCVUdQUklOVCgid2F0Y2hlci0+Y2hlY2sgZmFpbGVkXG4iKTsKKwl3LT51LndhdGNoZXIgPSB3YXRjaGVyOworCisJcGFyLT50YXJnZXQgICA9IHdhdGNoZXI7CisJcGFyLT50YXJnaW5mbyA9IHctPmRhdGE7CisJcmV0ID0geHRfY2hlY2tfdGFyZ2V0KHBhciwgdy0+d2F0Y2hlcl9zaXplLAorCSAgICAgIGUtPmV0aHByb3RvLCBlLT5pbnZmbGFncyAmIEVCVF9JUFJPVE8pOworCWlmIChyZXQgPCAwKSB7CiAJCW1vZHVsZV9wdXQod2F0Y2hlci0+bWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CisKIAkoKmNudCkrKzsKIAlyZXR1cm4gMDsKIH0KQEAgLTU1OCwzMCArNTY2LDQxIEBACiBzdGF0aWMgaW5saW5lIGludAogZWJ0X2NsZWFudXBfbWF0Y2goc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbSwgdW5zaWduZWQgaW50ICppKQogeworCXN0cnVjdCB4dF9tdGR0b3JfcGFyYW0gcGFyOworCiAJaWYgKGkgJiYgKCppKS0tID09IDApCiAJCXJldHVybiAxOwotCWlmIChtLT51Lm1hdGNoLT5kZXN0cm95KQotCQltLT51Lm1hdGNoLT5kZXN0cm95KG0tPmRhdGEsIG0tPm1hdGNoX3NpemUpOwotCW1vZHVsZV9wdXQobS0+dS5tYXRjaC0+bWUpOwogCisJcGFyLm1hdGNoICAgICA9IG0tPnUubWF0Y2g7CisJcGFyLm1hdGNoaW5mbyA9IG0tPmRhdGE7CisJcGFyLmZhbWlseSAgICA9IE5GUFJPVE9fQlJJREdFOworCWlmIChwYXIubWF0Y2gtPmRlc3Ryb3kgIT0gTlVMTCkKKwkJcGFyLm1hdGNoLT5kZXN0cm95KCZwYXIpOworCW1vZHVsZV9wdXQocGFyLm1hdGNoLT5tZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBlYnRfY2xlYW51cF93YXRjaGVyKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdywgdW5zaWduZWQgaW50ICppKQogeworCXN0cnVjdCB4dF90Z2R0b3JfcGFyYW0gcGFyOworCiAJaWYgKGkgJiYgKCppKS0tID09IDApCiAJCXJldHVybiAxOwotCWlmICh3LT51LndhdGNoZXItPmRlc3Ryb3kpCi0JCXctPnUud2F0Y2hlci0+ZGVzdHJveSh3LT5kYXRhLCB3LT53YXRjaGVyX3NpemUpOwotCW1vZHVsZV9wdXQody0+dS53YXRjaGVyLT5tZSk7CiAKKwlwYXIudGFyZ2V0ICAgPSB3LT51LndhdGNoZXI7CisJcGFyLnRhcmdpbmZvID0gdy0+ZGF0YTsKKwlwYXIuZmFtaWx5ICAgPSBORlBST1RPX0JSSURHRTsKKwlpZiAocGFyLnRhcmdldC0+ZGVzdHJveSAhPSBOVUxMKQorCQlwYXIudGFyZ2V0LT5kZXN0cm95KCZwYXIpOworCW1vZHVsZV9wdXQocGFyLnRhcmdldC0+bWUpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludAogZWJ0X2NsZWFudXBfZW50cnkoc3RydWN0IGVidF9lbnRyeSAqZSwgdW5zaWduZWQgaW50ICpjbnQpCiB7CisJc3RydWN0IHh0X3RnZHRvcl9wYXJhbSBwYXI7CiAJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CiAKIAlpZiAoZS0+Yml0bWFzayA9PSAwKQpAQCAtNTkyLDEwICs2MTEsMTMgQEAKIAlFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX3dhdGNoZXIsIE5VTEwpOwogCUVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jbGVhbnVwX21hdGNoLCBOVUxMKTsKIAl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7Ci0JaWYgKHQtPnUudGFyZ2V0LT5kZXN0cm95KQotCQl0LT51LnRhcmdldC0+ZGVzdHJveSh0LT5kYXRhLCB0LT50YXJnZXRfc2l6ZSk7Ci0JbW9kdWxlX3B1dCh0LT51LnRhcmdldC0+bWUpOwogCisJcGFyLnRhcmdldCAgID0gdC0+dS50YXJnZXQ7CisJcGFyLnRhcmdpbmZvID0gdC0+ZGF0YTsKKwlwYXIuZmFtaWx5ICAgPSBORlBST1RPX0JSSURHRTsKKwlpZiAocGFyLnRhcmdldC0+ZGVzdHJveSAhPSBOVUxMKQorCQlwYXIudGFyZ2V0LT5kZXN0cm95KCZwYXIpOworCW1vZHVsZV9wdXQocGFyLnRhcmdldC0+bWUpOwogCXJldHVybiAwOwogfQogCkBAIC02MDUsMTAgKzYyNywxMiBAQAogICAgc3RydWN0IGVidF9jbF9zdGFjayAqY2xfcywgdW5zaWduZWQgaW50IHVkY19jbnQpCiB7CiAJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7Ci0Jc3RydWN0IGVidF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJdW5zaWduZWQgaW50IGksIGosIGhvb2sgPSAwLCBob29rbWFzayA9IDA7CiAJc2l6ZV90IGdhcDsKIAlpbnQgcmV0OworCXN0cnVjdCB4dF9tdGNoa19wYXJhbSBtdHBhcjsKKwlzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gdGdwYXI7CiAKIAkvKiBkb24ndCBtZXNzIHdpdGggdGhlIHN0cnVjdCBlYnRfZW50cmllcyAqLwogCWlmIChlLT5iaXRtYXNrID09IDApCkBAIC02NDksMjQgKzY3MywzMSBAQAogCQkJaG9va21hc2sgPSBjbF9zW2kgLSAxXS5ob29rbWFzazsKIAl9CiAJaSA9IDA7Ci0JcmV0ID0gRUJUX01BVENIX0lURVJBVEUoZSwgZWJ0X2NoZWNrX21hdGNoLCBlLCBuYW1lLCBob29rbWFzaywgJmkpOworCisJbXRwYXIudGFibGUgICAgID0gdGdwYXIudGFibGUgICAgID0gbmFtZTsKKwltdHBhci5lbnRyeWluZm8gPSB0Z3Bhci5lbnRyeWluZm8gPSBlOworCW10cGFyLmhvb2tfbWFzayA9IHRncGFyLmhvb2tfbWFzayA9IGhvb2ttYXNrOworCW10cGFyLmZhbWlseSAgICA9IHRncGFyLmZhbWlseSAgICA9IE5GUFJPVE9fQlJJREdFOworCXJldCA9IEVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF9jaGVja19tYXRjaCwgJm10cGFyLCAmaSk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAlqID0gMDsKLQlyZXQgPSBFQlRfV0FUQ0hFUl9JVEVSQVRFKGUsIGVidF9jaGVja193YXRjaGVyLCBlLCBuYW1lLCBob29rbWFzaywgJmopOworCXJldCA9IEVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X2NoZWNrX3dhdGNoZXIsICZ0Z3BhciwgJmopOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbnVwX3dhdGNoZXJzOwogCXQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKikoKChjaGFyICopZSkgKyBlLT50YXJnZXRfb2Zmc2V0KTsKIAlnYXAgPSBlLT5uZXh0X29mZnNldCAtIGUtPnRhcmdldF9vZmZzZXQ7Ci0JdGFyZ2V0ID0gZmluZF90YXJnZXRfbG9jayh0LT51Lm5hbWUsICZyZXQsICZlYnRfbXV0ZXgpOwotCWlmICghdGFyZ2V0KQorCisJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoCisJCSB4dF9maW5kX3RhcmdldChORlBST1RPX0JSSURHRSwgdC0+dS5uYW1lLCAwKSwKKwkJICJlYnRfJXMiLCB0LT51Lm5hbWUpOworCWlmIChJU19FUlIodGFyZ2V0KSkgeworCQlyZXQgPSBQVFJfRVJSKHRhcmdldCk7CiAJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHRhcmdldC0+bWUpKSB7Ci0JCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwogCiAJdC0+dS50YXJnZXQgPSB0YXJnZXQ7CiAJaWYgKHQtPnUudGFyZ2V0ID09ICZlYnRfc3RhbmRhcmRfdGFyZ2V0KSB7CkBAIC02ODEsMTMgKzcxMiwyMCBAQAogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKIAkJfQotCX0gZWxzZSBpZiAodC0+dGFyZ2V0X3NpemUgPiBnYXAgLSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpIHx8Ci0JICAgKHQtPnUudGFyZ2V0LT5jaGVjayAmJgotCSAgIHQtPnUudGFyZ2V0LT5jaGVjayhuYW1lLCBob29rbWFzaywgZSwgdC0+ZGF0YSwgdC0+dGFyZ2V0X3NpemUpICE9IDApKXsKKwl9IGVsc2UgaWYgKHQtPnRhcmdldF9zaXplID4gZ2FwIC0gc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSkgewogCQltb2R1bGVfcHV0KHQtPnUudGFyZ2V0LT5tZSk7CiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKIAl9CisKKwl0Z3Bhci50YXJnZXQgICA9IHRhcmdldDsKKwl0Z3Bhci50YXJnaW5mbyA9IHQtPmRhdGE7CisJcmV0ID0geHRfY2hlY2tfdGFyZ2V0KCZ0Z3BhciwgdC0+dGFyZ2V0X3NpemUsCisJICAgICAgZS0+ZXRocHJvdG8sIGUtPmludmZsYWdzICYgRUJUX0lQUk9UTyk7CisJaWYgKHJldCA8IDApIHsKKwkJbW9kdWxlX3B1dCh0YXJnZXQtPm1lKTsKKwkJZ290byBjbGVhbnVwX3dhdGNoZXJzOworCX0KIAkoKmNudCkrKzsKIAlyZXR1cm4gMDsKIGNsZWFudXBfd2F0Y2hlcnM6CkBAIC0xMDY4LDg3ICsxMTA2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZWJ0X3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgZWJ0X3RhcmdldCAqdGFyZ2V0KQotewotCXN0cnVjdCBlYnRfdGFyZ2V0ICp0OwotCWludCByZXQ7Ci0KLQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVidF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmVidF90YXJnZXRzLCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgdGFyZ2V0LT5uYW1lKSA9PSAwKSB7Ci0JCQltdXRleF91bmxvY2soJmVidF9tdXRleCk7Ci0JCQlyZXR1cm4gLUVFWElTVDsKLQkJfQotCX0KLQlsaXN0X2FkZCgmdGFyZ2V0LT5saXN0LCAmZWJ0X3RhcmdldHMpOwotCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVidF91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgZWJ0X3RhcmdldCAqdGFyZ2V0KQotewotCW11dGV4X2xvY2soJmVidF9tdXRleCk7Ci0JbGlzdF9kZWwoJnRhcmdldC0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwotfQotCi1pbnQgZWJ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBlYnRfbWF0Y2ggKm1hdGNoKQotewotCXN0cnVjdCBlYnRfbWF0Y2ggKm07Ci0JaW50IHJldDsKLQotCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWJ0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmZWJ0X21hdGNoZXMsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChtLT5uYW1lLCBtYXRjaC0+bmFtZSkgPT0gMCkgewotCQkJbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwotCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCX0KLQl9Ci0JbGlzdF9hZGQoJm1hdGNoLT5saXN0LCAmZWJ0X21hdGNoZXMpOwotCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVidF91bnJlZ2lzdGVyX21hdGNoKHN0cnVjdCBlYnRfbWF0Y2ggKm1hdGNoKQotewotCW11dGV4X2xvY2soJmVidF9tdXRleCk7Ci0JbGlzdF9kZWwoJm1hdGNoLT5saXN0KTsKLQltdXRleF91bmxvY2soJmVidF9tdXRleCk7Ci19Ci0KLWludCBlYnRfcmVnaXN0ZXJfd2F0Y2hlcihzdHJ1Y3QgZWJ0X3dhdGNoZXIgKndhdGNoZXIpCi17Ci0Jc3RydWN0IGVidF93YXRjaGVyICp3OwotCWludCByZXQ7Ci0KLQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVidF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmVidF93YXRjaGVycywgbGlzdCkgewotCQlpZiAoc3RyY21wKHctPm5hbWUsIHdhdGNoZXItPm5hbWUpID09IDApIHsKLQkJCW11dGV4X3VubG9jaygmZWJ0X211dGV4KTsKLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JfQotCWxpc3RfYWRkKCZ3YXRjaGVyLT5saXN0LCAmZWJ0X3dhdGNoZXJzKTsKLQltdXRleF91bmxvY2soJmVidF9tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlYnRfdW5yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcikKLXsKLQltdXRleF9sb2NrKCZlYnRfbXV0ZXgpOwotCWxpc3RfZGVsKCZ3YXRjaGVyLT5saXN0KTsKLQltdXRleF91bmxvY2soJmVidF9tdXRleCk7Ci19Ci0KIGludCBlYnRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IGVidF90YWJsZSAqdGFibGUpCiB7CiAJc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvOwpAQCAtMTUxOCwxMSArMTQ3NSwxNCBAQAogewogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZlYnRfbXV0ZXgpOwotCWxpc3RfYWRkKCZlYnRfc3RhbmRhcmRfdGFyZ2V0Lmxpc3QsICZlYnRfdGFyZ2V0cyk7Ci0JbXV0ZXhfdW5sb2NrKCZlYnRfbXV0ZXgpOwotCWlmICgocmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmZWJ0X3NvY2tvcHRzKSkgPCAwKQorCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmZWJ0X3N0YW5kYXJkX3RhcmdldCk7CisJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CisJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmZWJ0X3NvY2tvcHRzKTsKKwlpZiAocmV0IDwgMCkgeworCQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmZWJ0X3N0YW5kYXJkX3RhcmdldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRWJ0YWJsZXMgdjIuMCByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTE1MzEsMTcgKzE0OTEsMTIgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlYnRhYmxlc19maW5pKHZvaWQpCiB7CiAJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZlYnRfc29ja29wdHMpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZlYnRfc3RhbmRhcmRfdGFyZ2V0KTsKIAlwcmludGsoS0VSTl9JTkZPICJFYnRhYmxlcyB2Mi4wIHVucmVnaXN0ZXJlZFxuIik7CiB9CiAKIEVYUE9SVF9TWU1CT0woZWJ0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfdGFibGUpOwotRVhQT1JUX1NZTUJPTChlYnRfcmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChlYnRfdW5yZWdpc3Rlcl9tYXRjaCk7Ci1FWFBPUlRfU1lNQk9MKGVidF9yZWdpc3Rlcl93YXRjaGVyKTsKLUVYUE9SVF9TWU1CT0woZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcik7Ci1FWFBPUlRfU1lNQk9MKGVidF9yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChlYnRfdW5yZWdpc3Rlcl90YXJnZXQpOwogRVhQT1JUX1NZTUJPTChlYnRfZG9fdGFibGUpOwogbW9kdWxlX2luaXQoZWJ0YWJsZXNfaW5pdCk7CiBtb2R1bGVfZXhpdChlYnRhYmxlc19maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKaW5kZXggYjEzMzJmNi4uMjZhMzdjYiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvTWFrZWZpbGUKKysrIGIvbmV0L2NvcmUvTWFrZWZpbGUKQEAgLTYsNiArNiw3IEBACiAJIGdlbl9zdGF0cy5vIGdlbl9lc3RpbWF0b3IubyBuZXRfbmFtZXNwYWNlLm8KIAogb2JqLSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsX25ldF9jb3JlLm8KK29iai0kKENPTkZJR19IQVNfRE1BKSArPSBza2JfZG1hX21hcC5vCiAKIG9iai15CQkgICAgICs9IGRldi5vIGV0aHRvb2wubyBkZXZfbWNhc3QubyBkc3QubyBuZXRldmVudC5vIFwKIAkJCW5laWdoYm91ci5vIHJ0bmV0bGluay5vIHV0aWxzLm8gbGlua193YXRjaC5vIGZpbHRlci5vCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kYXRhZ3JhbS5jIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwppbmRleCA1MmY1NzdhLi5lZTYzMTg0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kYXRhZ3JhbS5jCisrKyBiL25ldC9jb3JlL2RhdGFncmFtLmMKQEAgLTksNyArOSw3IEBACiAgKglpZGVudGljYWwgcmVjdm1zZygpIGNvZGUuIFNvIHdlIHNoYXJlIGl0IGhlcmUuIFRoZSBwb2xsIHdhcwogICoJc2hhcmVkIGJlZm9yZSBidXQgYnVyaWVkIGluIHVkcC5jIHNvIEkgbW92ZWQgaXQuCiAgKgotICoJQXV0aG9yczoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4uIChkYXRhZ3JhbV9wb2xsKCkgZnJvbSBvbGQKKyAqCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+LiAoZGF0YWdyYW1fcG9sbCgpIGZyb20gb2xkCiAgKgkJCQkJCSAgICAgdWRwLmMgY29kZSkKICAqCiAgKglGaXhlczoKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNjBjNTFmNy4uMTQwOGEwODMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0xMjIsNiArMTIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgpAQCAtODkwLDcgKzg5MSw3IEBACiAgKglDaGFuZ2UgbmFtZSBvZiBhIGRldmljZSwgY2FuIHBhc3MgZm9ybWF0IHN0cmluZ3MgImV0aCVkIi4KICAqCWZvciB3aWxkY2FyZGluZy4KICAqLwotaW50IGRldl9jaGFuZ2VfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpuZXduYW1lKQoraW50IGRldl9jaGFuZ2VfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuZXduYW1lKQogewogCWNoYXIgb2xkbmFtZVtJRk5BTVNJWl07CiAJaW50IGVyciA9IDA7CkBAIC05MTYsNyArOTE3LDYgQEAKIAkJZXJyID0gZGV2X2FsbG9jX25hbWUoZGV2LCBuZXduYW1lKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQlzdHJjcHkobmV3bmFtZSwgZGV2LT5uYW1lKTsKIAl9CiAJZWxzZSBpZiAoX19kZXZfZ2V0X2J5X25hbWUobmV0LCBuZXduYW1lKSkKIAkJcmV0dXJuIC1FRVhJU1Q7CkBAIC05NTQsNiArOTU0LDM4IEBACiB9CiAKIC8qKgorICoJZGV2X3NldF9hbGlhcyAtIGNoYW5nZSBpZmFsaWFzIG9mIGEgZGV2aWNlCisgKglAZGV2OiBkZXZpY2UKKyAqCUBhbGlhczogbmFtZSB1cCB0byBJRkFMSUFTWgorICoJQGxlbjogbGltaXQgb2YgYnl0ZXMgdG8gY29weSBmcm9tIGluZm8KKyAqCisgKglTZXQgaWZhbGlhcyBmb3IgYSBkZXZpY2UsCisgKi8KK2ludCBkZXZfc2V0X2FsaWFzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmFsaWFzLCBzaXplX3QgbGVuKQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAobGVuID49IElGQUxJQVNaKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbGVuKSB7CisJCWlmIChkZXYtPmlmYWxpYXMpIHsKKwkJCWtmcmVlKGRldi0+aWZhbGlhcyk7CisJCQlkZXYtPmlmYWxpYXMgPSBOVUxMOworCQl9CisJCXJldHVybiAwOworCX0KKworCWRldi0+aWZhbGlhcyA9IGtyZWFsbG9jKGRldi0+aWZhbGlhcywgbGVuKzEsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pZmFsaWFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmxjcHkoZGV2LT5pZmFsaWFzLCBhbGlhcywgbGVuKzEpOworCXJldHVybiBsZW47Cit9CisKKworLyoqCiAgKgluZXRkZXZfZmVhdHVyZXNfY2hhbmdlIC0gZGV2aWNlIGNoYW5nZXMgZmVhdHVyZXMKICAqCUBkZXY6IGRldmljZSB0byBjYXVzZSBub3RpZmljYXRpb24KICAqCkBAIC0xNjY3LDcgKzE2OTksNyBAQAogewogCXUzMiBhZGRyMSwgYWRkcjIsIHBvcnRzOwogCXUzMiBoYXNoLCBpaGw7Ci0JdTggaXBfcHJvdG87CisJdTggaXBfcHJvdG8gPSAwOwogCiAJaWYgKHVubGlrZWx5KCFzaW1wbGVfdHhfaGFzaHJuZF9pbml0aWFsaXplZCkpIHsKIAkJZ2V0X3JhbmRvbV9ieXRlcygmc2ltcGxlX3R4X2hhc2hybmQsIDQpOwpAQCAtMTY3NSwxMyArMTcwNywxNCBAQAogCX0KIAogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCWlwX3Byb3RvID0gaXBfaGRyKHNrYiktPnByb3RvY29sOworCWNhc2UgaHRvbnMoRVRIX1BfSVApOgorCQlpZiAoIShpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpKQorCQkJaXBfcHJvdG8gPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAJCWFkZHIxID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlhZGRyMiA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAkJaWhsID0gaXBfaGRyKHNrYiktPmlobDsKIAkJYnJlYWs7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CiAJCWlwX3Byb3RvID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKIAkJYWRkcjEgPSBpcHY2X2hkcihza2IpLT5zYWRkci5zNl9hZGRyMzJbM107CiAJCWFkZHIyID0gaXB2Nl9oZHIoc2tiKS0+ZGFkZHIuczZfYWRkcjMyWzNdOwpAQCAtMTk5MSw4ICsyMDI0LDEzIEBACiAJCQkJc3Bpbl91bmxvY2socm9vdF9sb2NrKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCF0ZXN0X2JpdChfX1FESVNDX1NUQVRFX0RFQUNUSVZBVEVELAotCQkJCQkgICAgICAmcS0+c3RhdGUpKQorCQkJCQkgICAgICAmcS0+c3RhdGUpKSB7CiAJCQkJCV9fbmV0aWZfcmVzY2hlZHVsZShxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwkJCQkJY2xlYXJfYml0KF9fUURJU0NfU1RBVEVfU0NIRUQsCisJCQkJCQkgICZxLT5zdGF0ZSk7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMjkxMSw2ICsyOTQ5LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGRldl9jaGFuZ2VfcnhfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZsYWdzKQoreworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQICYmIGRldi0+Y2hhbmdlX3J4X2ZsYWdzKQorCQlkZXYtPmNoYW5nZV9yeF9mbGFncyhkZXYsIGZsYWdzKTsKK30KKwogc3RhdGljIGludCBfX2Rldl9zZXRfcHJvbWlzY3VpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluYykKIHsKIAl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwpAQCAtMjk0OCw4ICsyOTkyLDcgQEAKIAkJCQljdXJyZW50LT51aWQsIGN1cnJlbnQtPmdpZCwKIAkJCQlhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpKTsKIAotCQlpZiAoZGV2LT5jaGFuZ2VfcnhfZmxhZ3MpCi0JCQlkZXYtPmNoYW5nZV9yeF9mbGFncyhkZXYsIElGRl9QUk9NSVNDKTsKKwkJZGV2X2NoYW5nZV9yeF9mbGFncyhkZXYsIElGRl9QUk9NSVNDKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDE1LDggKzMwNTgsNyBAQAogCQl9CiAJfQogCWlmIChkZXYtPmZsYWdzIF4gb2xkX2ZsYWdzKSB7Ci0JCWlmIChkZXYtPmNoYW5nZV9yeF9mbGFncykKLQkJCWRldi0+Y2hhbmdlX3J4X2ZsYWdzKGRldiwgSUZGX0FMTE1VTFRJKTsKKwkJZGV2X2NoYW5nZV9yeF9mbGFncyhkZXYsIElGRl9BTExNVUxUSSk7CiAJCWRldl9zZXRfcnhfbW9kZShkZXYpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMyOTUsNiArMzMzNywxMiBAQAogCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGRldik7CiB9CiAKKy8qKgorICoJZGV2X2dldF9mbGFncyAtIGdldCBmbGFncyByZXBvcnRlZCB0byB1c2Vyc3BhY2UKKyAqCUBkZXY6IGRldmljZQorICoKKyAqCUdldCB0aGUgY29tYmluYXRpb24gb2YgZmxhZyBiaXRzIGV4cG9ydGVkIHRocm91Z2ggQVBJcyB0byB1c2Vyc3BhY2UuCisgKi8KIHVuc2lnbmVkIGRldl9nZXRfZmxhZ3MoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBmbGFnczsKQEAgLTMzMTksNiArMzM2NywxNCBAQAogCXJldHVybiBmbGFnczsKIH0KIAorLyoqCisgKglkZXZfY2hhbmdlX2ZsYWdzIC0gY2hhbmdlIGRldmljZSBzZXR0aW5ncworICoJQGRldjogZGV2aWNlCisgKglAZmxhZ3M6IGRldmljZSBzdGF0ZSBmbGFncworICoKKyAqCUNoYW5nZSBzZXR0aW5ncyBvbiBkZXZpY2UgYmFzZWQgc3RhdGUgZmxhZ3MuIFRoZSBmbGFncyBhcmUKKyAqCWluIHRoZSB1c2Vyc3BhY2UgZXhwb3J0ZWQgZm9ybWF0LgorICovCiBpbnQgZGV2X2NoYW5nZV9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBmbGFncykKIHsKIAlpbnQgcmV0LCBjaGFuZ2VzOwpAQCAtMzM0MCw4ICszMzk2LDggQEAKIAkgKglMb2FkIGluIHRoZSBjb3JyZWN0IG11bHRpY2FzdCBsaXN0IG5vdyB0aGUgZmxhZ3MgaGF2ZSBjaGFuZ2VkLgogCSAqLwogCi0JaWYgKGRldi0+Y2hhbmdlX3J4X2ZsYWdzICYmIChvbGRfZmxhZ3MgXiBmbGFncykgJiBJRkZfTVVMVElDQVNUKQotCQlkZXYtPmNoYW5nZV9yeF9mbGFncyhkZXYsIElGRl9NVUxUSUNBU1QpOworCWlmICgob2xkX2ZsYWdzIF4gZmxhZ3MpICYgSUZGX01VTFRJQ0FTVCkKKwkJZGV2X2NoYW5nZV9yeF9mbGFncyhkZXYsIElGRl9NVUxUSUNBU1QpOwogCiAJZGV2X3NldF9yeF9tb2RlKGRldik7CiAKQEAgLTMzODgsNiArMzQ0NCwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICoJZGV2X3NldF9tdHUgLSBDaGFuZ2UgbWF4aW11bSB0cmFuc2ZlciB1bml0CisgKglAZGV2OiBkZXZpY2UKKyAqCUBuZXdfbXR1OiBuZXcgdHJhbnNmZXIgdW5pdAorICoKKyAqCUNoYW5nZSB0aGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIG9mIHRoZSBuZXR3b3JrIGRldmljZS4KKyAqLwogaW50IGRldl9zZXRfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewogCWludCBlcnI7CkBAIC0zNDEyLDYgKzM0NzUsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKioKKyAqCWRldl9zZXRfbWFjX2FkZHJlc3MgLSBDaGFuZ2UgTWVkaWEgQWNjZXNzIENvbnRyb2wgQWRkcmVzcworICoJQGRldjogZGV2aWNlCisgKglAc2E6IG5ldyBhZGRyZXNzCisgKgorICoJQ2hhbmdlIHRoZSBoYXJkd2FyZSAoTUFDKSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKKyAqLwogaW50IGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNvY2thZGRyICpzYSkKIHsKIAlpbnQgZXJyOwpAQCAtMzgwMSwxNCArMzg3MSwxMSBAQAogfQogCiAvKiBEZWxheWVkIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdGVyYXRpb24gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmV0X3RvZG9fbGlzdF9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQobmV0X3RvZG9fbGlzdCk7CiAKIHN0YXRpYyB2b2lkIG5ldF9zZXRfdG9kbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXNwaW5fbG9jaygmbmV0X3RvZG9fbGlzdF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPnRvZG9fbGlzdCwgJm5ldF90b2RvX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZuZXRfdG9kb19saXN0X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCByb2xsYmFja19yZWdpc3RlcmVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC00MTM1LDMzICs0MjAyLDI0IEBACiAgKglmcmVlX25ldGRldih5MSk7CiAgKglmcmVlX25ldGRldih5Mik7CiAgKgotICogV2UgYXJlIGludm9rZWQgYnkgcnRubF91bmxvY2soKSBhZnRlciBpdCBkcm9wcyB0aGUgc2VtYXBob3JlLgorICogV2UgYXJlIGludm9rZWQgYnkgcnRubF91bmxvY2soKS4KICAqIFRoaXMgYWxsb3dzIHVzIHRvIGRlYWwgd2l0aCBwcm9ibGVtczoKICAqIDEpIFdlIGNhbiBkZWxldGUgc3lzZnMgb2JqZWN0cyB3aGljaCBpbnZva2UgaG90cGx1ZwogICogICAgd2l0aG91dCBkZWFkbG9ja2luZyB3aXRoIGxpbmt3YXRjaCB2aWEga2V2ZW50ZC4KICAqIDIpIFNpbmNlIHdlIHJ1biB3aXRoIHRoZSBSVE5MIHNlbWFwaG9yZSBub3QgaGVsZCwgd2UgY2FuIHNsZWVwCiAgKiAgICBzYWZlbHkgaW4gb3JkZXIgdG8gd2FpdCBmb3IgdGhlIG5ldGRldiByZWZjbnQgdG8gZHJvcCB0byB6ZXJvLgorICoKKyAqIFdlIG11c3Qgbm90IHJldHVybiB1bnRpbCBhbGwgdW5yZWdpc3RlciBldmVudHMgYWRkZWQgZHVyaW5nCisgKiB0aGUgaW50ZXJ2YWwgdGhlIGxvY2sgd2FzIGhlbGQgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KICAqLwotc3RhdGljIERFRklORV9NVVRFWChuZXRfdG9kb19ydW5fbXV0ZXgpOwogdm9pZCBuZXRkZXZfcnVuX3RvZG8odm9pZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKLQkvKiBOZWVkIHRvIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgY3B1J3MgZ2V0dGluZyBvdXQgb2Ygb3JkZXIuICovCi0JbXV0ZXhfbG9jaygmbmV0X3RvZG9fcnVuX211dGV4KTsKLQotCS8qIE5vdCBzYWZlIHRvIGRvIG91dHNpZGUgdGhlIHNlbWFwaG9yZS4gIFdlIG11c3Qgbm90IHJldHVybgotCSAqIHVudGlsIGFsbCB1bnJlZ2lzdGVyIGV2ZW50cyBpbnZva2VkIGJ5IHRoZSBsb2NhbCBwcm9jZXNzb3IKLQkgKiBoYXZlIGJlZW4gY29tcGxldGVkIChlaXRoZXIgYnkgdGhpcyB0b2RvIHJ1biwgb3Igb25lIG9uCi0JICogYW5vdGhlciBjcHUpLgotCSAqLwotCWlmIChsaXN0X2VtcHR5KCZuZXRfdG9kb19saXN0KSkKLQkJZ290byBvdXQ7Ci0KIAkvKiBTbmFwc2hvdCBsaXN0LCBhbGxvdyBsYXRlciByZXF1ZXN0cyAqLwotCXNwaW5fbG9jaygmbmV0X3RvZG9fbGlzdF9sb2NrKTsKIAlsaXN0X3JlcGxhY2VfaW5pdCgmbmV0X3RvZG9fbGlzdCwgJmxpc3QpOwotCXNwaW5fdW5sb2NrKCZuZXRfdG9kb19saXN0X2xvY2spOworCisJX19ydG5sX3VubG9jaygpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CkBAIC00MTkzLDkgKzQyNTEsNiBAQAogCQkvKiBGcmVlIG5ldHdvcmsgZGV2aWNlICovCiAJCWtvYmplY3RfcHV0KCZkZXYtPmRldi5rb2JqKTsKIAl9Ci0KLW91dDoKLQltdXRleF91bmxvY2soJm5ldF90b2RvX3J1bl9tdXRleCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW50ZXJuYWxfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTQzMTUsNyArNDM3MCwxMiBAQAogCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKIH0KIAotLyogU3luY2hyb25pemUgd2l0aCBwYWNrZXQgcmVjZWl2ZSBwcm9jZXNzaW5nLiAqLworLyoqCisgKglzeW5jaHJvbml6ZV9uZXQgLSAgU3luY2hyb25pemUgd2l0aCBwYWNrZXQgcmVjZWl2ZSBwcm9jZXNzaW5nCisgKgorICoJV2FpdCBmb3IgcGFja2V0cyBjdXJyZW50bHkgYmVpbmcgcmVjZWl2ZWQgdG8gYmUgZG9uZS4KKyAqCURvZXMgbm90IGJsb2NrIGxhdGVyIHBhY2tldHMgZnJvbSBzdGFydGluZy4KKyAqLwogdm9pZCBzeW5jaHJvbml6ZV9uZXQodm9pZCkKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtNDYxNyw3ICs0Njc3LDcgQEAKIH0KIAogLyoqCi0gKiBuZXRkZXZfZG1hX3JlZ2lzZXIgLSByZWdpc3RlciB0aGUgbmV0d29ya2luZyBzdWJzeXN0ZW0gYXMgYSBETUEgY2xpZW50CisgKiBuZXRkZXZfZG1hX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgdGhlIG5ldHdvcmtpbmcgc3Vic3lzdGVtIGFzIGEgRE1BIGNsaWVudAogICovCiBzdGF0aWMgaW50IF9faW5pdCBuZXRkZXZfZG1hX3JlZ2lzdGVyKHZvaWQpCiB7CkBAIC00NjYzLDYgKzQ3MjMsMTIgQEAKIAkJb25lIHw9IE5FVElGX0ZfR1NPX1NPRlRXQVJFOwogCW9uZSB8PSBORVRJRl9GX0dTTzsKIAorCS8qCisJICogSWYgZXZlbiBvbmUgZGV2aWNlIHN1cHBvcnRzIGEgR1NPIHByb3RvY29sIHdpdGggc29mdHdhcmUgZmFsbGJhY2ssCisJICogZW5hYmxlIGl0IGZvciBhbGwuCisJICovCisJYWxsIHw9IG9uZSAmIE5FVElGX0ZfR1NPX1NPRlRXQVJFOworCiAJLyogSWYgZXZlbiBvbmUgZGV2aWNlIHN1cHBvcnRzIHJvYnVzdCBHU08sIGVuYWJsZSBpdCBmb3IgYWxsLiAqLwogCWlmIChvbmUgJiBORVRJRl9GX0dTT19ST0JVU1QpCiAJCWFsbCB8PSBORVRJRl9GX0dTT19ST0JVU1Q7CkBAIC00NzEyLDEwICs0Nzc4LDE4IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLWNoYXIgKm5ldGRldl9kcml2ZXJuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKKy8qKgorICoJbmV0ZGV2X2RyaXZlcm5hbWUgLSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIGRldmljZQorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCUBidWZmZXI6IGJ1ZmZlciBmb3IgcmVzdWx0aW5nIG5hbWUKKyAqCUBsZW46IHNpemUgb2YgYnVmZmVyCisgKgorICoJRGV0ZXJtaW5lIG5ldHdvcmsgZHJpdmVyIGZvciBkZXZpY2UuCisgKi8KK2NoYXIgKm5ldGRldl9kcml2ZXJuYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOwotCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworCWNvbnN0IHN0cnVjdCBkZXZpY2UgKnBhcmVudDsKIAogCWlmIChsZW4gPD0gMCB8fCAhYnVmZmVyKQogCQlyZXR1cm4gYnVmZmVyOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2X21jYXN0LmMgYi9uZXQvY29yZS9kZXZfbWNhc3QuYwppbmRleCA1NDAyYjNiLi45ZTJmYTM5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXZfbWNhc3QuYworKysgYi9uZXQvY29yZS9kZXZfbWNhc3QuYwpAQCAtNiw3ICs2LDcgQEAKICAqCQlSaWNoYXJkIFVuZGVyd29vZCA8cmljaGFyZEB3dXp6LmRlbW9uLmNvLnVrPgogICoKICAqCVN0aXIgZnJpZWQgdG9nZXRoZXIgZnJvbSB0aGUgSVAgbXVsdGljYXN0IGFuZCBDQVAgcGF0Y2hlcyBhYm92ZQotICoJCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCiAgKglGaXhlczoKICAqCQlBbGFuIENveAk6CVVwZGF0ZSB0aGUgZGV2aWNlIG9uIGEgcmVhbCBkZWxldGUKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggZmUwMzI2Ni4uMDljMTUzMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTIwMyw2ICsyMDMsNyBAQAogCWlmIChkc3RfZ2FyYmFnZS50aW1lcl9pbmMgPiBEU1RfR0NfSU5DKSB7CiAJCWRzdF9nYXJiYWdlLnRpbWVyX2luYyA9IERTVF9HQ19JTkM7CiAJCWRzdF9nYXJiYWdlLnRpbWVyX2V4cGlyZXMgPSBEU1RfR0NfTUlOOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZkc3RfZ2Nfd29yayk7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZHN0X2djX3dvcmssIGRzdF9nYXJiYWdlLnRpbWVyX2V4cGlyZXMpOwogCX0KIAlzcGluX3VubG9ja19iaCgmZHN0X2dhcmJhZ2UubG9jayk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZWlnaGJvdXIuYyBiL25ldC9jb3JlL25laWdoYm91ci5jCmluZGV4IDlkOTJlNDEuLjFkYzcyOGIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25laWdoYm91ci5jCisrKyBiL25ldC9jb3JlL25laWdoYm91ci5jCkBAIC05MjcsOCArOTI3LDcgQEAKIAkJCWlmIChza2JfcXVldWVfbGVuKCZuZWlnaC0+YXJwX3F1ZXVlKSA+PQogCQkJICAgIG5laWdoLT5wYXJtcy0+cXVldWVfbGVuKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7Ci0JCQkJYnVmZiA9IG5laWdoLT5hcnBfcXVldWUubmV4dDsKLQkJCQlfX3NrYl91bmxpbmsoYnVmZiwgJm5laWdoLT5hcnBfcXVldWUpOworCQkJCWJ1ZmYgPSBfX3NrYl9kZXF1ZXVlKCZuZWlnaC0+YXJwX3F1ZXVlKTsKIAkJCQlrZnJlZV9za2IoYnVmZik7CiAJCQkJTkVJR0hfQ0FDSEVfU1RBVF9JTkMobmVpZ2gtPnRibCwgdW5yZXNfZGlzY2FyZHMpOwogCQkJfQpAQCAtMTI1OSwyNCArMTI1OCwyMCBAQAogCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gKHN0cnVjdCBuZWlnaF90YWJsZSAqKWFyZzsKIAlsb25nIHNjaGVkX25leHQgPSAwOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IsICpuOwogCiAJc3Bpbl9sb2NrKCZ0YmwtPnByb3h5X3F1ZXVlLmxvY2spOwogCi0Jc2tiID0gdGJsLT5wcm94eV9xdWV1ZS5uZXh0OworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnRibC0+cHJveHlfcXVldWUsIHNrYiwgbikgeworCQlsb25nIHRkaWYgPSBORUlHSF9DQihza2IpLT5zY2hlZF9uZXh0IC0gbm93OwogCi0Jd2hpbGUgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmdGJsLT5wcm94eV9xdWV1ZSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqYmFjayA9IHNrYjsKLQkJbG9uZyB0ZGlmID0gTkVJR0hfQ0IoYmFjayktPnNjaGVkX25leHQgLSBub3c7Ci0KLQkJc2tiID0gc2tiLT5uZXh0OwogCQlpZiAodGRpZiA8PSAwKSB7Ci0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYmFjay0+ZGV2OwotCQkJX19za2JfdW5saW5rKGJhY2ssICZ0YmwtPnByb3h5X3F1ZXVlKTsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwkJCV9fc2tiX3VubGluayhza2IsICZ0YmwtPnByb3h5X3F1ZXVlKTsKIAkJCWlmICh0YmwtPnByb3h5X3JlZG8gJiYgbmV0aWZfcnVubmluZyhkZXYpKQotCQkJCXRibC0+cHJveHlfcmVkbyhiYWNrKTsKKwkJCQl0YmwtPnByb3h5X3JlZG8oc2tiKTsKIAkJCWVsc2UKLQkJCQlrZnJlZV9za2IoYmFjayk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CiAKIAkJCWRldl9wdXQoZGV2KTsKIAkJfSBlbHNlIGlmICghc2NoZWRfbmV4dCB8fCB0ZGlmIDwgc2NoZWRfbmV4dCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggYzFmNGUwZC4uOTJkNmI5NCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTIwOSw5ICsyMDksNDQgQEAKIAlyZXR1cm4gbmV0ZGV2X3N0b3JlKGRldiwgYXR0ciwgYnVmLCBsZW4sIGNoYW5nZV90eF9xdWV1ZV9sZW4pOwogfQogCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pZmFsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gdG9fbmV0X2RldihkZXYpOworCXNpemVfdCBjb3VudCA9IGxlbjsKKwlzc2l6ZV90IHJldDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIGlnbm9yZSB0cmFpbGluZyBuZXdsaW5lICovCisJaWYgKGxlbiA+ICAwICYmIGJ1ZltsZW4gLSAxXSA9PSAnXG4nKQorCQktLWNvdW50OworCisJcnRubF9sb2NrKCk7CisJcmV0ID0gZGV2X3NldF9hbGlhcyhuZXRkZXYsIGJ1ZiwgY291bnQpOworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pZmFsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0b19uZXRfZGV2KGRldik7CisJc3NpemVfdCByZXQgPSAwOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGRldi0+aWZhbGlhcykKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwgbmV0ZGV2LT5pZmFsaWFzKTsKKwlydG5sX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBuZXRfY2xhc3NfYXR0cmlidXRlc1tdID0gewogCV9fQVRUUihhZGRyX2xlbiwgU19JUlVHTywgc2hvd19hZGRyX2xlbiwgTlVMTCksCiAJX19BVFRSKGRldl9pZCwgU19JUlVHTywgc2hvd19kZXZfaWQsIE5VTEwpLAorCV9fQVRUUihpZmFsaWFzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pZmFsaWFzLCBzdG9yZV9pZmFsaWFzKSwKIAlfX0FUVFIoaWZsaW5rLCBTX0lSVUdPLCBzaG93X2lmbGluaywgTlVMTCksCiAJX19BVFRSKGlmaW5kZXgsIFNfSVJVR08sIHNob3dfaWZpbmRleCwgTlVMTCksCiAJX19BVFRSKGZlYXR1cmVzLCBTX0lSVUdPLCBzaG93X2ZlYXR1cmVzLCBOVUxMKSwKQEAgLTQxOCw2ICs0NTMsNyBAQAogCiAJQlVHX09OKGRldi0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUxFQVNFRCk7CiAKKwlrZnJlZShkZXYtPmlmYWxpYXMpOwogCWtmcmVlKChjaGFyICopZGV2IC0gZGV2LT5wYWRkZWQpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggN2M1MmZlMi4uZjFkMDdiNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCisrKyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwpAQCAtMTgsNiArMTgsNyBAQAogc3RhdGljIERFRklORV9NVVRFWChuZXRfbXV0ZXgpOwogCiBMSVNUX0hFQUQobmV0X25hbWVzcGFjZV9saXN0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5ldF9uYW1lc3BhY2VfbGlzdCk7CiAKIHN0cnVjdCBuZXQgaW5pdF9uZXQ7CiBFWFBPUlRfU1lNQk9MKGluaXRfbmV0KTsKQEAgLTk1LDcgKzk2LDcgQEAKIAkJcmV0dXJuOwogCX0KICNlbmRpZgotCisJa2ZyZWUobmV0LT5nZW4pOwogCWttZW1fY2FjaGVfZnJlZShuZXRfY2FjaGVwLCBuZXQpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IGE3NTY4NDcuLjk5ZjY1NmQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0yNDc0LDcgKzI0NzQsNyBAQAogCQkJCWlmIChyZXQgPCAwKSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgZXhwYW5kaW5nICIKIAkJCQkJICAgICAgICJpcHNlYyBwYWNrZXQgJWRcbiIscmV0KTsKLQkJCQkJcmV0dXJuIDA7CisJCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCX0KIApAQCAtMjQ4NCw4ICsyNDg0LDcgQEAKIAkJCWlmIChyZXQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNyZWF0aW5nIGlwc2VjICIKIAkJCQkgICAgICAgInBhY2tldCAlZFxuIixyZXQpOwotCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCXJldHVybiAwOworCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJLyogcmVzdG9yZSBsbCAqLwogCQkJZXRoID0gKF9fdTggKikgc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CkBAIC0yNDk0LDYgKzI0OTMsOSBAQAogCQl9CiAJfQogCXJldHVybiAxOworZXJyOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggNzFlZGI4Yi4uMzYzMDEzMSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTczLDcgKzczLDcgQEAKIAogdm9pZCBydG5sX3VubG9jayh2b2lkKQogewotCW11dGV4X3VubG9jaygmcnRubF9tdXRleCk7CisJLyogVGhpcyBmZWxsb3cgd2lsbCB1bmxvY2sgaXQgZm9yIHVzLiAqLwogCW5ldGRldl9ydW5fdG9kbygpOwogfQogCkBAIC01ODYsNiArNTg2LDcgQEAKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQogCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBJRkxBX0lGTkFNRSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGQUxJQVNaKSAvKiBJRkxBX0lGQUxJQVMgKi8KIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWikgLyogSUZMQV9RRElTQyAqLwogCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX2lmbWFwKSkKIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0cykpCkBAIC02NDAsNiArNjQxLDkgQEAKIAlpZiAodHhxLT5xZGlzY19zbGVlcGluZykKIAkJTkxBX1BVVF9TVFJJTkcoc2tiLCBJRkxBX1FESVNDLCB0eHEtPnFkaXNjX3NsZWVwaW5nLT5vcHMtPmlkKTsKIAorCWlmIChkZXYtPmlmYWxpYXMpCisJCU5MQV9QVVRfU1RSSU5HKHNrYiwgSUZMQV9JRkFMSUFTLCBkZXYtPmlmYWxpYXMpOworCiAJaWYgKDEpIHsKIAkJc3RydWN0IHJ0bmxfbGlua19pZm1hcCBtYXAgPSB7CiAJCQkubWVtX3N0YXJ0ICAgPSBkZXYtPm1lbV9zdGFydCwKQEAgLTcxMyw2ICs3MTcsNyBAQAogCVtJRkxBX0xJTktNT0RFXQkJPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJW0lGTEFfTElOS0lORk9dCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCiAJW0lGTEFfTkVUX05TX1BJRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJRkxBX0lGQUxJQVNdCSAgICAgICAgPSB7IC50eXBlID0gTkxBX1NUUklORywgLmxlbiA9IElGQUxJQVNaLTEgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX2luZm9fcG9saWN5W0lGTEFfSU5GT19NQVgrMV0gPSB7CkBAIC04NTMsNiArODU4LDE0IEBACiAJCW1vZGlmaWVkID0gMTsKIAl9CiAKKwlpZiAodGJbSUZMQV9JRkFMSUFTXSkgeworCQllcnIgPSBkZXZfc2V0X2FsaWFzKGRldiwgbmxhX2RhdGEodGJbSUZMQV9JRkFMSUFTXSksCisJCQkJICAgIG5sYV9sZW4odGJbSUZMQV9JRkFMSUFTXSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCQltb2RpZmllZCA9IDE7CisJfQorCiAJaWYgKHRiW0lGTEFfQlJPQURDQVNUXSkgewogCQlubGFfbWVtY3B5KGRldi0+YnJvYWRjYXN0LCB0YltJRkxBX0JST0FEQ0FTVF0sIGRldi0+YWRkcl9sZW4pOwogCQlzZW5kX2FkZHJfbm90aWZ5ID0gMTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYl9kbWFfbWFwLmMgYi9uZXQvY29yZS9za2JfZG1hX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjM0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9za2JfZG1hX21hcC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHNrYl9kbWFfbWFwLmM6IERNQSBtYXBwaW5nIGhlbHBlcnMgZm9yIHNvY2tldCBidWZmZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitpbnQgc2tiX2RtYV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqc3AgPSBza2Jfc2hpbmZvKHNrYik7CisJZG1hX2FkZHJfdCBtYXA7CisJaW50IGk7CisKKwltYXAgPSBkbWFfbWFwX3NpbmdsZShkZXYsIHNrYi0+ZGF0YSwKKwkJCSAgICAgc2tiX2hlYWRsZW4oc2tiKSwgZGlyKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtYXApKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcC0+ZG1hX21hcHNbMF0gPSBtYXA7CisJZm9yIChpID0gMDsgaSA8IHNwLT5ucl9mcmFnczsgaSsrKSB7CisJCXNrYl9mcmFnX3QgKmZwID0gJnNwLT5mcmFnc1tpXTsKKworCQltYXAgPSBkbWFfbWFwX3BhZ2UoZGV2LCBmcC0+cGFnZSwgZnAtPnBhZ2Vfb2Zmc2V0LAorCQkJCSAgIGZwLT5zaXplLCBkaXIpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtYXApKQorCQkJZ290byB1bndpbmQ7CisJCXNwLT5kbWFfbWFwc1tpICsgMV0gPSBtYXA7CisJfQorCXNwLT5udW1fZG1hX21hcHMgPSBpICsgMTsKKworCXJldHVybiAwOworCit1bndpbmQ6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXNrYl9mcmFnX3QgKmZwID0gJnNwLT5mcmFnc1tpXTsKKworCQlkbWFfdW5tYXBfcGFnZShkZXYsIHNwLT5kbWFfbWFwc1tpICsgMV0sCisJCQkgICAgICAgZnAtPnNpemUsIGRpcik7CisJfQorCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzcC0+ZG1hX21hcHNbMF0sCisJCQkgc2tiX2hlYWRsZW4oc2tiKSwgZGlyKTsKK291dF9lcnI6CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MKHNrYl9kbWFfbWFwKTsKKwordm9pZCBza2JfZG1hX3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNwID0gc2tiX3NoaW5mbyhza2IpOworCWludCBpOworCisJZG1hX3VubWFwX3NpbmdsZShkZXYsIHNwLT5kbWFfbWFwc1swXSwKKwkJCSBza2JfaGVhZGxlbihza2IpLCBkaXIpOworCWZvciAoaSA9IDA7IGkgPCBzcC0+bnJfZnJhZ3M7IGkrKykgeworCQlza2JfZnJhZ190ICpmcCA9ICZzcC0+ZnJhZ3NbaV07CisKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LCBzcC0+ZG1hX21hcHNbaSArIDFdLAorCQkJICAgICAgIGZwLT5zaXplLCBkaXIpOworCX0KK30KK0VYUE9SVF9TWU1CT0woc2tiX2RtYV91bm1hcCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IGNhMWNjZGYuLjRlMjJlM2EgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCVJvdXRpbmVzIGhhdmluZyB0byBkbyB3aXRoIHRoZSAnc3RydWN0IHNrX2J1ZmYnIG1lbW9yeSBoYW5kbGVycy4KICAqCi0gKglBdXRob3JzOglBbGFuIENveCA8aWlpdGFjQHB5ci5zd2FuLmFjLnVrPgorICoJQXV0aG9yczoJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQkJRmxvcmlhbiBMYSBSb2NoZSA8cnpzZmxAcnoudW5pLXNiLmRlPgogICoKICAqCUZpeGVzOgpAQCAtMjYzLDYgKzI2MywyNiBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0cnVjdCBwYWdlICpfX25ldGRldl9hbGxvY19wYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGdmcF90IGdmcF9tYXNrKQoreworCWludCBub2RlID0gZGV2LT5kZXYucGFyZW50ID8gZGV2X3RvX25vZGUoZGV2LT5kZXYucGFyZW50KSA6IC0xOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwX21hc2ssIDApOworCXJldHVybiBwYWdlOworfQorRVhQT1JUX1NZTUJPTChfX25ldGRldl9hbGxvY19wYWdlKTsKKwordm9pZCBza2JfYWRkX3J4X2ZyYWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGksIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2ZmLAorCQlpbnQgc2l6ZSkKK3sKKwlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBpLCBwYWdlLCBvZmYsIHNpemUpOworCXNrYi0+bGVuICs9IHNpemU7CisJc2tiLT5kYXRhX2xlbiArPSBzaXplOworCXNrYi0+dHJ1ZXNpemUgKz0gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woc2tiX2FkZF9yeF9mcmFnKTsKKwogLyoqCiAgKglkZXZfYWxsb2Nfc2tiIC0gYWxsb2NhdGUgYW4gc2tidWZmIGZvciByZWNlaXZpbmcKICAqCUBsZW5ndGg6IGxlbmd0aCB0byBhbGxvY2F0ZQpAQCAtMzYzLDggKzM4Myw3IEBACiAJfQogfQogCi0vKiBGcmVlIGV2ZXJ5dGhpbmcgYnV0IHRoZSBza19idWZmIHNoZWxsLiAqLwotc3RhdGljIHZvaWQgc2tiX3JlbGVhc2VfYWxsKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBza2JfcmVsZWFzZV9oZWFkX3N0YXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogI2lmZGVmIENPTkZJR19YRlJNCkBAIC0zODgsNiArNDA3LDEyIEBACiAJc2tiLT50Y192ZXJkID0gMDsKICNlbmRpZgogI2VuZGlmCit9CisKKy8qIEZyZWUgZXZlcnl0aGluZyBidXQgdGhlIHNrX2J1ZmYgc2hlbGwuICovCitzdGF0aWMgdm9pZCBza2JfcmVsZWFzZV9hbGwoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2JfcmVsZWFzZV9oZWFkX3N0YXRlKHNrYik7CiAJc2tiX3JlbGVhc2VfZGF0YShza2IpOwogfQogCkBAIC00MjQsNiArNDQ5LDM4IEBACiAJX19rZnJlZV9za2Ioc2tiKTsKIH0KIAoraW50IHNrYl9yZWN5Y2xlX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIGludCBza2Jfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87CisKKwlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpIHx8IHNrYi0+ZmNsb25lICE9IFNLQl9GQ0xPTkVfVU5BVkFJTEFCTEUpCisJCXJldHVybiAwOworCisJc2tiX3NpemUgPSBTS0JfREFUQV9BTElHTihza2Jfc2l6ZSArIE5FVF9TS0JfUEFEKTsKKwlpZiAoc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQgPCBza2Jfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiX3NoYXJlZChza2IpIHx8IHNrYl9jbG9uZWQoc2tiKSkKKwkJcmV0dXJuIDA7CisKKwlza2JfcmVsZWFzZV9oZWFkX3N0YXRlKHNrYik7CisJc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOworCWF0b21pY19zZXQoJnNoaW5mby0+ZGF0YXJlZiwgMSk7CisJc2hpbmZvLT5ucl9mcmFncyA9IDA7CisJc2hpbmZvLT5nc29fc2l6ZSA9IDA7CisJc2hpbmZvLT5nc29fc2VncyA9IDA7CisJc2hpbmZvLT5nc29fdHlwZSA9IDA7CisJc2hpbmZvLT5pcDZfZnJhZ19pZCA9IDA7CisJc2hpbmZvLT5mcmFnX2xpc3QgPSBOVUxMOworCisJbWVtc2V0KHNrYiwgMCwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHRhaWwpKTsKKwlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CisJc2tiLT5kYXRhID0gc2tiLT5oZWFkICsgTkVUX1NLQl9QQUQ7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woc2tiX3JlY3ljbGVfY2hlY2spOworCiBzdGF0aWMgdm9pZCBfX2NvcHlfc2tiX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqbmV3LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb2xkKQogewogCW5ldy0+dHN0YW1wCQk9IG9sZC0+dHN0YW1wOwpAQCAtNzAxLDYgKzc1OCw4IEBACiAjZW5kaWYKIAlsb25nIG9mZjsKIAorCUJVR19PTihuaGVhZCA8IDApOworCiAJaWYgKHNrYl9zaGFyZWQoc2tiKSkKIAkJQlVHKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCA5MWY4YmJjLi41ZTJhMzEzIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC0xNTQsNyArMTU0LDggQEAKICAgInNrX2xvY2stQUZfUFBQT1giICwgInNrX2xvY2stQUZfV0FOUElQRSIgICwgInNrX2xvY2stQUZfTExDIiAgICAgICwKICAgInNrX2xvY2stMjciICAgICAgICwgInNrX2xvY2stMjgiICAgICAgICAgICwgInNrX2xvY2stQUZfQ0FOIiAgICAgICwKICAgInNrX2xvY2stQUZfVElQQyIgICwgInNrX2xvY2stQUZfQkxVRVRPT1RIIiwgInNrX2xvY2stSVVDViIgICAgICAgICwKLSAgInNrX2xvY2stQUZfUlhSUEMiICwgInNrX2xvY2stQUZfTUFYIgorICAic2tfbG9jay1BRl9SWFJQQyIgLCAic2tfbG9jay1BRl9JU0ROIiAgICAgLCAic2tfbG9jay1BRl9QSE9ORVQiICAgLAorICAic2tfbG9jay1BRl9NQVgiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmFmX2ZhbWlseV9zbG9ja19rZXlfc3RyaW5nc1tBRl9NQVgrMV0gPSB7CiAgICJzbG9jay1BRl9VTlNQRUMiLCAic2xvY2stQUZfVU5JWCIgICAgICwgInNsb2NrLUFGX0lORVQiICAgICAsCkBAIC0xNjgsNyArMTY5LDggQEAKICAgInNsb2NrLUFGX1BQUE9YIiAsICJzbG9jay1BRl9XQU5QSVBFIiAgLCAic2xvY2stQUZfTExDIiAgICAgICwKICAgInNsb2NrLTI3IiAgICAgICAsICJzbG9jay0yOCIgICAgICAgICAgLCAic2xvY2stQUZfQ0FOIiAgICAgICwKICAgInNsb2NrLUFGX1RJUEMiICAsICJzbG9jay1BRl9CTFVFVE9PVEgiLCAic2xvY2stQUZfSVVDViIgICAgICwKLSAgInNsb2NrLUFGX1JYUlBDIiAsICJzbG9jay1BRl9NQVgiCisgICJzbG9jay1BRl9SWFJQQyIgLCAic2xvY2stQUZfSVNETiIgICAgICwgInNsb2NrLUFGX1BIT05FVCIgICAsCisgICJzbG9jay1BRl9NQVgiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmFmX2ZhbWlseV9jbG9ja19rZXlfc3RyaW5nc1tBRl9NQVgrMV0gPSB7CiAgICJjbG9jay1BRl9VTlNQRUMiLCAiY2xvY2stQUZfVU5JWCIgICAgICwgImNsb2NrLUFGX0lORVQiICAgICAsCkBAIC0xODIsNyArMTg0LDggQEAKICAgImNsb2NrLUFGX1BQUE9YIiAsICJjbG9jay1BRl9XQU5QSVBFIiAgLCAiY2xvY2stQUZfTExDIiAgICAgICwKICAgImNsb2NrLTI3IiAgICAgICAsICJjbG9jay0yOCIgICAgICAgICAgLCAiY2xvY2stQUZfQ0FOIiAgICAgICwKICAgImNsb2NrLUFGX1RJUEMiICAsICJjbG9jay1BRl9CTFVFVE9PVEgiLCAiY2xvY2stQUZfSVVDViIgICAgICwKLSAgImNsb2NrLUFGX1JYUlBDIiAsICJjbG9jay1BRl9NQVgiCisgICJjbG9jay1BRl9SWFJQQyIgLCAiY2xvY2stQUZfSVNETiIgICAgICwgImNsb2NrLUFGX1BIT05FVCIgICAsCisgICJjbG9jay1BRl9NQVgiCiB9OwogI2VuZGlmCiAKQEAgLTMyNCw3ICszMjcsNyBAQAogCQkgKi8KIAkJbXV0ZXhfYWNxdWlyZSgmc2stPnNrX2xvY2suZGVwX21hcCwgMCwgMSwgX1JFVF9JUF8pOwogCi0JCXJjID0gc2stPnNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOworCQlyYyA9IHNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOwogCiAJCW11dGV4X3JlbGVhc2UoJnNrLT5za19sb2NrLmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKIAl9IGVsc2UKQEAgLTEzNzEsNyArMTM3NCw3IEBACiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKIAogCQkJc2tiLT5uZXh0ID0gTlVMTDsKLQkJCXNrLT5za19iYWNrbG9nX3Jjdihzaywgc2tiKTsKKwkJCXNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOwogCiAJCQkvKgogCQkJICogV2UgYXJlIGluIHByb2Nlc3MgY29udGV4dCBoZXJlIHdpdGggc29mdGlycXMKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N0cmVhbS5jIGIvbmV0L2NvcmUvc3RyZWFtLmMKaW5kZXggYTZiMzQzNy4uODcyN2NlYSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3RyZWFtLmMKKysrIGIvbmV0L2NvcmUvc3RyZWFtLmMKQEAgLTksNyArOSw3IEBACiAgKgogICogICAgIEF1dGhvcnM6ICAgICAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KICAqICAgICAgICAgICAgICAgICAgICAgKGZyb20gb2xkIHRjcC5jIGNvZGUpCi0gKiAgICAgICAgICAgICAgICAgICAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IChCb3Jyb3dlZCBjb21tZW50cyA4LSkpCisgKiAgICAgICAgICAgICAgICAgICAgIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+IChCb3Jyb3dlZCBjb21tZW50cyA4LSkpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKaW5kZXggOGU5NTgwOC4uOWE0MzA3MyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCkBAIC03ODMsNyArNzgzLDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwotbW9kdWxlX3BhcmFtKGNjaWQyX2RlYnVnLCBib29sLCAwNDQ0KTsKK21vZHVsZV9wYXJhbShjY2lkMl9kZWJ1ZywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaWQyX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKaW5kZXggZjY3NTZlMC4uM2I4YmQ3YyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCkBAIC05NjMsNyArOTYzLDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwotbW9kdWxlX3BhcmFtKGNjaWQzX2RlYnVnLCBib29sLCAwNDQ0KTsKK21vZHVsZV9wYXJhbShjY2lkM19kZWJ1ZywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaWQzX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKaW5kZXggYmNkNmFjNC4uNWIzY2UwNiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCkBAIC02Nyw3ICs2NywxMCBAQAogCXUzMiBpX2ksIGlfdG90MCA9IDAsIGlfdG90MSA9IDAsIHdfdG90ID0gMDsKIAlpbnQgaSwgayA9IHRmcmNfbGhfbGVuZ3RoKGxoKSAtIDE7IC8qIGsgaXMgYXMgaW4gcmZjMzQ0OGJpcywgNS40ICovCiAKLQlmb3IgKGk9MDsgaSA8PSBrOyBpKyspIHsKKwlpZiAoayA8PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDw9IGs7IGkrKykgewogCQlpX2kgPSB0ZnJjX2xoX2dldF9pbnRlcnZhbChsaCwgaSk7CiAKIAkJaWYgKGkgPCBrKSB7CkBAIC03OCw3ICs4MSw2IEBACiAJCQlpX3RvdDEgKz0gaV9pICogdGZyY19saF93ZWlnaHRzW2ktMV07CiAJfQogCi0JQlVHX09OKHdfdG90ID09IDApOwogCWxoLT5pX21lYW4gPSBtYXgoaV90b3QwLCBpX3RvdDEpIC8gd190b3Q7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCmluZGV4IDk3ZWNlYzAuLjE4NTkxNjIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYwpAQCAtMTAsNyArMTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfVEZSQ19ERUJVRwogaW50IHRmcmNfZGVidWc7Ci1tb2R1bGVfcGFyYW0odGZyY19kZWJ1ZywgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odGZyY19kZWJ1ZywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRmcmNfZGVidWcsICJFbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA4MDM5MzNhLi43NzlkMGVkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCQlnb3RvIGRpc2NhcmQ7CiAKIAlpZiAoZGNjcF9wYXJzZV9vcHRpb25zKHNrLCBOVUxMLCBza2IpKQotCQlnb3RvIGRpc2NhcmQ7CisJCXJldHVybiAxOwogCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEgIT0gRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRKQogCQlkY2NwX2V2ZW50X2Fja19yZWN2KHNrLCBza2IpOwpAQCAtNjEwLDcgKzYxMCw3IEBACiAJCSAqIFN0ZXAgODogUHJvY2VzcyBvcHRpb25zIGFuZCBtYXJrIGFja25vd2xlZGdlYWJsZQogCQkgKi8KIAkJaWYgKGRjY3BfcGFyc2Vfb3B0aW9ucyhzaywgTlVMTCwgc2tiKSkKLQkJCWdvdG8gZGlzY2FyZDsKKwkJCXJldHVybiAxOwogCiAJCWlmIChkY2ItPmRjY3BkX2Fja19zZXEgIT0gRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRKQogCQkJZGNjcF9ldmVudF9hY2tfcmVjdihzaywgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCA4ODJjNWM0Li5lM2RmZGRhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC04MTEsOSArODExLDggQEAKIAogCS8qIFN0ZXAgMjoKIAkgKglMb29rIHVwIGZsb3cgSUQgaW4gdGFibGUgYW5kIGdldCBjb3JyZXNwb25kaW5nIHNvY2tldCAqLwotCXNrID0gX19pbmV0X2xvb2t1cChkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCAmZGNjcF9oYXNoaW5mbywKLQkJCSAgIGlwaC0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwKLQkJCSAgIGlwaC0+ZGFkZHIsIGRoLT5kY2NwaF9kcG9ydCwgaW5ldF9paWYoc2tiKSk7CisJc2sgPSBfX2luZXRfbG9va3VwX3NrYigmZGNjcF9oYXNoaW5mbywgc2tiLAorCQkJICAgICAgIGRoLT5kY2NwaF9zcG9ydCwgZGgtPmRjY3BoX2Rwb3J0KTsKIAkvKgogCSAqIFN0ZXAgMjoKIAkgKglJZiBubyBzb2NrZXQgLi4uCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggNWUxZWUwZC4uMTEwNjI3OCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtOTgsNyArOTgsOCBAQAogCiAJaWYgKHNrYi0+bGVuIDwgb2Zmc2V0ICsgc2l6ZW9mKCpkaCkgfHwKIAkgICAgc2tiLT5sZW4gPCBvZmZzZXQgKyBfX2RjY3BfYmFzaWNfaGRyX2xlbihkaCkpIHsKLQkJSUNNUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoc2tiLT5kZXYpLCBJQ01QNl9NSUJfSU5FUlJPUlMpOworCQlJQ01QNl9JTkNfU1RBVFNfQkgobmV0LCBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KSwKKwkJCQkgICBJQ01QNl9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDcsNyArMTA4LDggQEAKIAkJCSZoZHItPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsIGluZXQ2X2lpZihza2IpKTsKIAogCWlmIChzayA9PSBOVUxMKSB7Ci0JCUlDTVA2X0lOQ19TVEFUU19CSChfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KSwgSUNNUDZfTUlCX0lORVJST1JTKTsKKwkJSUNNUDZfSU5DX1NUQVRTX0JIKG5ldCwgX19pbjZfZGV2X2dldChza2ItPmRldiksCisJCQkJICAgSUNNUDZfTUlCX0lORVJST1JTKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODA1LDEwICs4MDcsOCBAQAogCiAJLyogU3RlcCAyOgogCSAqCUxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgZ2V0IGNvcnJlc3BvbmRpbmcgc29ja2V0ICovCi0Jc2sgPSBfX2luZXQ2X2xvb2t1cChkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCAmZGNjcF9oYXNoaW5mbywKLQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwKLQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIG50b2hzKGRoLT5kY2NwaF9kcG9ydCksCi0JCQkgICAgaW5ldDZfaWlmKHNrYikpOworCXNrID0gX19pbmV0Nl9sb29rdXBfc2tiKCZkY2NwX2hhc2hpbmZvLCBza2IsCisJCQkgICAgICAgIGRoLT5kY2NwaF9zcG9ydCwgZGgtPmRjY3BoX2Rwb3J0KTsKIAkvKgogCSAqIFN0ZXAgMjoKIAkgKglJZiBubyBzb2NrZXQgLi4uCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9vcHRpb25zLmMgYi9uZXQvZGNjcC9vcHRpb25zLmMKaW5kZXggZGM3YzE1OC4uMDgwOWI2MyAxMDA2NDQKLS0tIGEvbmV0L2RjY3Avb3B0aW9ucy5jCisrKyBiL25ldC9kY2NwL29wdGlvbnMuYwpAQCAtODEsMTEgKzgxLDExIEBACiAJCS8qIENoZWNrIGlmIHRoaXMgaXNuJ3QgYSBzaW5nbGUgYnl0ZSBvcHRpb24gKi8KIAkJaWYgKG9wdCA+IERDQ1BPX01BWF9SRVNFUlZFRCkgewogCQkJaWYgKG9wdF9wdHIgPT0gb3B0X2VuZCkKLQkJCQlnb3RvIG91dF9pbnZhbGlkX29wdGlvbjsKKwkJCQlnb3RvIG91dF9ub25zZW5zaWNhbF9sZW5ndGg7CiAKIAkJCWxlbiA9ICpvcHRfcHRyKys7Ci0JCQlpZiAobGVuIDwgMykKLQkJCQlnb3RvIG91dF9pbnZhbGlkX29wdGlvbjsKKwkJCWlmIChsZW4gPCAyKQorCQkJCWdvdG8gb3V0X25vbnNlbnNpY2FsX2xlbmd0aDsKIAkJCS8qCiAJCQkgKiBSZW1vdmUgdGhlIHR5cGUgYW5kIGxlbiBmaWVsZHMsIGxlYXZpbmcKIAkJCSAqIGp1c3QgdGhlIHZhbHVlIHNpemUKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCW9wdF9wdHIgKz0gbGVuOwogCiAJCQlpZiAob3B0X3B0ciA+IG9wdF9lbmQpCi0JCQkJZ290byBvdXRfaW52YWxpZF9vcHRpb247CisJCQkJZ290byBvdXRfbm9uc2Vuc2ljYWxfbGVuZ3RoOwogCQl9CiAKIAkJLyoKQEAgLTI4MywxMiArMjgzLDE3IEBACiAJaWYgKG1hbmRhdG9yeSkKIAkJZ290byBvdXRfaW52YWxpZF9vcHRpb247CiAKK291dF9ub25zZW5zaWNhbF9sZW5ndGg6CisJLyogUkZDIDQzNDAsIDUuODogaWdub3JlIG9wdGlvbiBhbmQgYWxsIHJlbWFpbmluZyBvcHRpb24gc3BhY2UgKi8KIAlyZXR1cm4gMDsKIAogb3V0X2ludmFsaWRfb3B0aW9uOgogCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX0lOVkFMSURPUFQpOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfT1BUSU9OX0VSUk9SOwogCURDQ1BfV0FSTigiRENDUCglcCk6IGludmFsaWQgb3B0aW9uICVkLCBsZW49JWQiLCBzaywgb3B0LCBsZW4pOworCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2RhdGFbMF0gPSBvcHQ7CisJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfcmVzZXRfZGF0YVsxXSA9IGxlbiA+IDAgPyB2YWx1ZVswXSA6IDA7CisJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfcmVzZXRfZGF0YVsyXSA9IGxlbiA+IDEgPyB2YWx1ZVsxXSA6IDA7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm90by5jIGIvbmV0L2RjY3AvcHJvdG8uYwppbmRleCAxY2EzYjI2Li5kMGJkMzQ4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm90by5jCisrKyBiL25ldC9kY2NwL3Byb3RvLmMKQEAgLTMwOSw3ICszMDksOSBAQAogCQlzay0+c2tfZXJyID0gRUNPTk5SRVNFVDsKIAogCWRjY3BfY2xlYXJfeG1pdF90aW1lcnMoc2spOworCiAJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKIAlpZiAoc2stPnNrX3NlbmRfaGVhZCAhPSBOVUxMKSB7CiAJCV9fa2ZyZWVfc2tiKHNrLT5za19zZW5kX2hlYWQpOwogCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKQEAgLTEwMjgsNyArMTAzMCw3IEBACiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwogaW50IGRjY3BfZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGNjcF9kZWJ1ZywgYm9vbCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZGNjcF9kZWJ1ZywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRjY3BfZGVidWcsICJFbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9kZWJ1Zyk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2Rldi5jIGIvbmV0L2RlY25ldC9kbl9kZXYuYwppbmRleCAyZjBhYzNjLi44MDA4Yzg2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2Rldi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAjZGVmaW5lIEROX0RFVl9MSVNUX1NJWkUgQVJSQVlfU0laRShkbl9kZXZfbGlzdCkKIAotI2RlZmluZSBETl9ERVZfUEFSTVNfT0ZGU0VUKHgpICgoaW50KSAoKGNoYXIgKikgJigoc3RydWN0IGRuX2Rldl9wYXJtcyAqKTApLT54KSkKKyNkZWZpbmUgRE5fREVWX1BBUk1TX09GRlNFVCh4KSBvZmZzZXRvZihzdHJ1Y3QgZG5fZGV2X3Bhcm1zLCB4KQogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogc3RhdGljIGludCBkbl9mb3J3YXJkaW5nX3Byb2MoY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKIAkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7Ci1zdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorc3RhdGljIGludCBkbl9mb3J3YXJkaW5nX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogCkBAIC0zMTgsNyArMzE4LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorc3RhdGljIGludCBkbl9mb3J3YXJkaW5nX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMgYi9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMKaW5kZXggMjI4MDY3Yy4uMzY0MDBiMiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiB9CiAKIAotc3RhdGljIGludCBkbl9ub2RlX2FkZHJlc3Nfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCitzdGF0aWMgaW50IGRuX25vZGVfYWRkcmVzc19zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKQEAgLTIxNyw3ICsyMTcsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgZG5fZGVmX2Rldl9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK3N0YXRpYyBpbnQgZG5fZGVmX2Rldl9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKZGlmZiAtLWdpdCBhL25ldC9kc2EvS2NvbmZpZyBiL25ldC9kc2EvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTIxMWIzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9LY29uZmlnCkBAIC0wLDAgKzEsNjAgQEAKK21lbnVjb25maWcgTkVUX0RTQQorCWJvb2wgIkRpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhUzM5MAorCXNlbGVjdCBQSFlMSUIKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyB5b3UgdG8gdXNlIGhhcmR3YXJlIHN3aXRjaCBjaGlwcyB0aGF0IHVzZQorCSAgdGhlIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUuCisKKworaWYgTkVUX0RTQQorCisjIHRhZ2dpbmcgZm9ybWF0cworY29uZmlnIE5FVF9EU0FfVEFHX0RTQQorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIE5FVF9EU0FfVEFHX0VEU0EKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBORVRfRFNBX1RBR19UUkFJTEVSCisJYm9vbAorCWRlZmF1bHQgbgorCisKKyMgc3dpdGNoIGRyaXZlcnMKK2NvbmZpZyBORVRfRFNBX01WODhFNlhYWAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2MDYwCisJYm9vbCAiTWFydmVsbCA4OEU2MDYwIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCisJc2VsZWN0IE5FVF9EU0FfVEFHX1RSQUlMRVIKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgODhFNjA2MCBldGhlcm5ldCBzd2l0Y2gKKwkgIGNoaXAuCisKK2NvbmZpZyBORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVQorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2MTMxCisJYm9vbCAiTWFydmVsbCA4OEU2MTMxIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCisJc2VsZWN0IE5FVF9EU0FfTVY4OEU2WFhYCisJc2VsZWN0IE5FVF9EU0FfTVY4OEU2WFhYX05FRURfUFBVCisJc2VsZWN0IE5FVF9EU0FfVEFHX0RTQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OEU2MTMxIGV0aGVybmV0IHN3aXRjaAorCSAgY2hpcC4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2MTIzXzYxXzY1CisJYm9vbCAiTWFydmVsbCA4OEU2MTIzLzYxNjEvNjE2NSBldGhlcm5ldCBzd2l0Y2ggY2hpcCBzdXBwb3J0IgorCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWAorCXNlbGVjdCBORVRfRFNBX1RBR19FRFNBCisJLS0taGVscC0tLQorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIDg4RTYxMjMvNjE2MS82MTY1CisJICBldGhlcm5ldCBzd2l0Y2ggY2hpcHMuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL01ha2VmaWxlIGIvbmV0L2RzYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc0ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIHRhZ2dpbmcgZm9ybWF0cworb2JqLSQoQ09ORklHX05FVF9EU0FfVEFHX0RTQSkgKz0gdGFnX2RzYS5vCitvYmotJChDT05GSUdfTkVUX0RTQV9UQUdfRURTQSkgKz0gdGFnX2Vkc2Eubworb2JqLSQoQ09ORklHX05FVF9EU0FfVEFHX1RSQUlMRVIpICs9IHRhZ190cmFpbGVyLm8KKworIyBzd2l0Y2ggZHJpdmVycworb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYKSArPSBtdjg4ZTZ4eHgubworb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2MDYwKSArPSBtdjg4ZTYwNjAubworb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2MTIzXzYxXzY1KSArPSBtdjg4ZTYxMjNfNjFfNjUubworb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2MTMxKSArPSBtdjg4ZTYxMzEubworCisjIHRoZSBjb3JlCitvYmotJChDT05GSUdfTkVUX0RTQSkgKz0gZHNhLm8gc2xhdmUubwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2EuYyBiL25ldC9kc2EvZHNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlOTk0NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kc2EvZHNhLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBuZXQvZHNhL2RzYS5jIC0gSGFyZHdhcmUgc3dpdGNoIGhhbmRsaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9kc2EuaD4KKyNpbmNsdWRlICJkc2FfcHJpdi5oIgorCitjaGFyIGRzYV9kcml2ZXJfdmVyc2lvbltdID0gIjAuMSI7CisKKworLyogc3dpdGNoIGRyaXZlciByZWdpc3RyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgREVGSU5FX01VVEVYKGRzYV9zd2l0Y2hfZHJpdmVyc19tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGRzYV9zd2l0Y2hfZHJpdmVycyk7CisKK3ZvaWQgcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydikKK3sKKwltdXRleF9sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmRydi0+bGlzdCwgJmRzYV9zd2l0Y2hfZHJpdmVycyk7CisJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOworfQorCit2b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydikKK3sKKwltdXRleF9sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOworCWxpc3RfZGVsX2luaXQoJmRydi0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICoKK2RzYV9zd2l0Y2hfcHJvYmUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIsIGNoYXIgKipfbmFtZSkKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnJldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWNoYXIgKm5hbWU7CisKKwlyZXQgPSBOVUxMOworCW5hbWUgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpIHsKKwkJc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnY7CisKKwkJZHJ2ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIsIGxpc3QpOworCisJCW5hbWUgPSBkcnYtPnByb2JlKGJ1cywgc3dfYWRkcik7CisJCWlmIChuYW1lICE9IE5VTEwpIHsKKwkJCXJldCA9IGRydjsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKKworCSpfbmFtZSA9IG5hbWU7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIGJhc2ljIHN3aXRjaCBvcGVyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoICoKK2RzYV9zd2l0Y2hfc2V0dXAoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgKnBkLAorCQkgc3RydWN0IG1paV9idXMgKmJ1cywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydjsKKwljaGFyICpuYW1lOworCWludCBpOworCisJLyoKKwkgKiBQcm9iZSBmb3Igc3dpdGNoIG1vZGVsLgorCSAqLworCWRydiA9IGRzYV9zd2l0Y2hfcHJvYmUoYnVzLCBwZC0+c3dfYWRkciwgJm5hbWUpOworCWlmIChkcnYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgZGV0ZWN0IGF0dGFjaGVkIHN3aXRjaFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogZGV0ZWN0ZWQgYSAlcyBzd2l0Y2hcbiIsIGRldi0+bmFtZSwgbmFtZSk7CisKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2Ugc3dpdGNoIHN0YXRlLgorCSAqLworCWRzID0ga3phbGxvYyhzaXplb2YoKmRzKSArIGRydi0+cHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHMgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlkcy0+cGQgPSBwZDsKKwlkcy0+bWFzdGVyX25ldGRldiA9IGRldjsKKwlkcy0+bWFzdGVyX21paV9idXMgPSBidXM7CisKKwlkcy0+ZHJ2ID0gZHJ2OworCWRzLT50YWdfcHJvdG9jb2wgPSBkcnYtPnRhZ19wcm90b2NvbDsKKworCisJLyoKKwkgKiBWYWxpZGF0ZSBzdXBwbGllZCBzd2l0Y2ggY29uZmlndXJhdGlvbi4KKwkgKi8KKwlkcy0+Y3B1X3BvcnQgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgRFNBX01BWF9QT1JUUzsgaSsrKSB7CisJCWNoYXIgKm5hbWU7CisKKwkJbmFtZSA9IHBkLT5wb3J0X25hbWVzW2ldOworCQlpZiAobmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdHJjbXAobmFtZSwgImNwdSIpKSB7CisJCQlpZiAoZHMtPmNwdV9wb3J0ICE9IC0xKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtdWx0aXBsZSBjcHUgcG9ydHM/IVxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWRzLT5jcHVfcG9ydCA9IGk7CisJCX0gZWxzZSB7CisJCQlkcy0+dmFsaWRfcG9ydF9tYXNrIHw9IDEgPDwgaTsKKwkJfQorCX0KKworCWlmIChkcy0+Y3B1X3BvcnQgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJubyBjcHUgcG9ydD8hXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisKKwkvKgorCSAqIElmIHdlIHVzZSBhIHRhZ2dpbmcgZm9ybWF0IHRoYXQgZG9lc24ndCBoYXZlIGFuIGV0aGVydHlwZQorCSAqIGZpZWxkLCBtYWtlIHN1cmUgdGhhdCBhbGwgcGFja2V0cyBmcm9tIHRoaXMgcG9pbnQgb24gZ2V0CisJICogc2VudCB0byB0aGUgdGFnIGZvcm1hdCdzIHJlY2VpdmUgZnVuY3Rpb24uICAoV2hpY2ggd2lsbAorCSAqIGRpc2NhcmQgcmVjZWl2ZWQgcGFja2V0cyB1bnRpbCB3ZSBzZXQgZHMtPnBvcnRzW10gYmVsb3cuKQorCSAqLworCXdtYigpOworCWRldi0+ZHNhX3B0ciA9ICh2b2lkICopZHM7CisKKworCS8qCisJICogRG8gYmFzaWMgcmVnaXN0ZXIgc2V0dXAuCisJICovCisJcmV0ID0gZHJ2LT5zZXR1cChkcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZHJ2LT5zZXRfYWRkcihkcywgZGV2LT5kZXZfYWRkcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZHMtPnNsYXZlX21paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKGRzLT5zbGF2ZV9taWlfYnVzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWRzYV9zbGF2ZV9taWlfYnVzX2luaXQoZHMpOworCisJcmV0ID0gbWRpb2J1c19yZWdpc3Rlcihkcy0+c2xhdmVfbWlpX2J1cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKworCS8qCisJICogQ3JlYXRlIG5ldHdvcmsgZGV2aWNlcyBmb3IgcGh5c2ljYWwgc3dpdGNoIHBvcnRzLgorCSAqLworCXdtYigpOworCWZvciAoaSA9IDA7IGkgPCBEU0FfTUFYX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldjsKKworCQlpZiAoIShkcy0+dmFsaWRfcG9ydF9tYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJc2xhdmVfZGV2ID0gZHNhX3NsYXZlX2NyZWF0ZShkcywgcGFyZW50LCBpLCBwZC0+cG9ydF9uYW1lc1tpXSk7CisJCWlmIChzbGF2ZV9kZXYgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgY3JlYXRlIGRzYSBzbGF2ZSAiCisJCQkgICAgICAgImRldmljZSBmb3IgcG9ydCAlZCglcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpLCBwZC0+cG9ydF9uYW1lc1tpXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRzLT5wb3J0c1tpXSA9IHNsYXZlX2RldjsKKwl9CisKKwlyZXR1cm4gZHM7CisKK291dF9mcmVlOgorCW1kaW9idXNfZnJlZShkcy0+c2xhdmVfbWlpX2J1cyk7CitvdXQ6CisJZGV2LT5kc2FfcHRyID0gTlVMTDsKKwlrZnJlZShkcyk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHZvaWQgZHNhX3N3aXRjaF9kZXN0cm95KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKK30KKworCisvKiBob29rcyBmb3IgZXRoZXJ0eXBlLWxlc3MgdGFnZ2luZyBmb3JtYXRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgb3JpZ2luYWwgRFNBIHRhZyBmb3JtYXQgYW5kIHNvbWUgb3RoZXIgdGFnIGZvcm1hdHMgaGF2ZSBubworICogZXRoZXJ0eXBlLCB3aGljaCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gYWRkIGEgbGl0dGxlIGhhY2sgdG8gdGhlCisgKiBuZXR3b3JraW5nIHJlY2VpdmUgcGF0aCB0byBtYWtlIHN1cmUgdGhhdCByZWNlaXZlZCBmcmFtZXMgZ2V0CisgKiB0aGUgcmlnaHQgLT5wcm90b2NvbCBhc3NpZ25lZCB0byB0aGVtIHdoZW4gb25lIG9mIHRob3NlIHRhZworICogZm9ybWF0cyBpcyBpbiB1c2UuCisgKi8KK2Jvb2wgZHNhX3VzZXNfZHNhX3RhZ3Modm9pZCAqZHNhX3B0cikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkc2FfcHRyOworCisJcmV0dXJuICEhKGRzLT50YWdfcHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRFNBKSk7Cit9CisKK2Jvb2wgZHNhX3VzZXNfdHJhaWxlcl90YWdzKHZvaWQgKmRzYV9wdHIpCit7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX3B0cjsKKworCXJldHVybiAhIShkcy0+dGFnX3Byb3RvY29sID09IGh0b25zKEVUSF9QX1RSQUlMRVIpKTsKK30KKworCisvKiBsaW5rIHBvbGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGRzYV9saW5rX3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVnbHkpCit7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOworCisJZHMgPSBjb250YWluZXJfb2YodWdseSwgc3RydWN0IGRzYV9zd2l0Y2gsIGxpbmtfcG9sbF93b3JrKTsKKworCWRzLT5kcnYtPnBvbGxfbGluayhkcyk7CisJbW9kX3RpbWVyKCZkcy0+bGlua19wb2xsX3RpbWVyLCByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBIWikpOworfQorCitzdGF0aWMgdm9pZCBkc2FfbGlua19wb2xsX3RpbWVyKHVuc2lnbmVkIGxvbmcgX2RzKQoreworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9ICh2b2lkICopX2RzOworCisJc2NoZWR1bGVfd29yaygmZHMtPmxpbmtfcG9sbF93b3JrKTsKK30KKworCisvKiBwbGF0Zm9ybSBkcml2ZXIgaW5pdCBhbmQgY2xlYW51cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZGV2X2lzX2NsYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY2xhc3MpCit7CisJaWYgKGRldi0+Y2xhc3MgIT0gTlVMTCAmJiAhc3RyY21wKGRldi0+Y2xhc3MtPm5hbWUsIGNsYXNzKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmRldl9maW5kX2NsYXNzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgY2hhciAqY2xhc3MpCit7CisJaWYgKGRldl9pc19jbGFzcyhwYXJlbnQsIGNsYXNzKSkgeworCQlnZXRfZGV2aWNlKHBhcmVudCk7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcmV0dXJuIGRldmljZV9maW5kX2NoaWxkKHBhcmVudCwgY2xhc3MsIGRldl9pc19jbGFzcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX2J1cyAqZGV2X3RvX21paV9idXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmQ7CisKKwlkID0gZGV2X2ZpbmRfY2xhc3MoZGV2LCAibWRpb19idXMiKTsKKwlpZiAoZCAhPSBOVUxMKSB7CisJCXN0cnVjdCBtaWlfYnVzICpidXM7CisKKwkJYnVzID0gdG9fbWlpX2J1cyhkKTsKKwkJcHV0X2RldmljZShkKTsKKworCQlyZXR1cm4gYnVzOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl90b19uZXRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkOworCisJZCA9IGRldl9maW5kX2NsYXNzKGRldiwgIm5ldCIpOworCWlmIChkICE9IE5VTEwpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5kOworCisJCW5kID0gdG9fbmV0X2RldihkKTsKKwkJZGV2X2hvbGQobmQpOworCQlwdXRfZGV2aWNlKGQpOworCisJCXJldHVybiBuZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBkc2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdGF0aWMgaW50IGRzYV92ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IGRzYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG1paV9idXMgKmJ1czsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CisKKwlpZiAoIWRzYV92ZXJzaW9uX3ByaW50ZWQrKykKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlICIKKwkJCSJkcml2ZXIgdmVyc2lvbiAlc1xuIiwgZHNhX2RyaXZlcl92ZXJzaW9uKTsKKworCWlmIChwZCA9PSBOVUxMIHx8IHBkLT5taWlfYnVzID09IE5VTEwgfHwgcGQtPm5ldGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1cyA9IGRldl90b19taWlfYnVzKHBkLT5taWlfYnVzKTsKKwlpZiAoYnVzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gZGV2X3RvX25ldF9kZXZpY2UocGQtPm5ldGRldik7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXYtPmRzYV9wdHIgIT0gTlVMTCkgeworCQlkZXZfcHV0KGRldik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWRzID0gZHNhX3N3aXRjaF9zZXR1cCgmcGRldi0+ZGV2LCBwZCwgYnVzLCBkZXYpOworCWlmIChJU19FUlIoZHMpKSB7CisJCWRldl9wdXQoZGV2KTsKKwkJcmV0dXJuIFBUUl9FUlIoZHMpOworCX0KKworCWlmIChkcy0+ZHJ2LT5wb2xsX2xpbmsgIT0gTlVMTCkgeworCQlJTklUX1dPUksoJmRzLT5saW5rX3BvbGxfd29yaywgZHNhX2xpbmtfcG9sbF93b3JrKTsKKwkJaW5pdF90aW1lcigmZHMtPmxpbmtfcG9sbF90aW1lcik7CisJCWRzLT5saW5rX3BvbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRzOworCQlkcy0+bGlua19wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZHNhX2xpbmtfcG9sbF90aW1lcjsKKwkJZHMtPmxpbmtfcG9sbF90aW1lci5leHBpcmVzID0gcm91bmRfamlmZmllcyhqaWZmaWVzICsgSFopOworCQlhZGRfdGltZXIoJmRzLT5saW5rX3BvbGxfdGltZXIpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkcy0+ZHJ2LT5wb2xsX2xpbmsgIT0gTlVMTCkKKwkJZGVsX3RpbWVyX3N5bmMoJmRzLT5saW5rX3BvbGxfdGltZXIpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWRzYV9zd2l0Y2hfZGVzdHJveShkcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNhX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzYV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGRzYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGRzYV9yZW1vdmUsCisJLnNodXRkb3duCT0gZHNhX3NodXRkb3duLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImRzYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkc2FfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkc2FfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGRzYV9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc2FfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHNhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkc2FfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4iKQorTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgc3dpdGNoIGNoaXBzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRzYSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2FfcHJpdi5oIGIvbmV0L2RzYS9kc2FfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZHNhL2RzYV9wcml2LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBuZXQvZHNhL2RzYV9wcml2LmggLSBIYXJkd2FyZSBzd2l0Y2ggaGFuZGxpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19EU0FfUFJJVl9ICisjZGVmaW5lIF9fRFNBX1BSSVZfSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2RzYS5oPgorCitzdHJ1Y3QgZHNhX3N3aXRjaCB7CisJLyoKKwkgKiBDb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwbGF0Zm9ybSBkZXZpY2UgdGhhdCBvd25zCisJICogdGhpcyBkc2Egc3dpdGNoIGluc3RhbmNlLgorCSAqLworCXN0cnVjdCBkc2FfcGxhdGZvcm1fZGF0YQkqcGQ7CisKKwkvKgorCSAqIFJlZmVyZW5jZXMgdG8gbmV0d29yayBkZXZpY2UgYW5kIG1paSBidXMgdG8gdXNlLgorCSAqLworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbWFzdGVyX25ldGRldjsKKwlzdHJ1Y3QgbWlpX2J1cwkJCSptYXN0ZXJfbWlpX2J1czsKKworCS8qCisJICogVGhlIHVzZWQgc3dpdGNoIGRyaXZlciBhbmQgZnJhbWUgdGFnZ2luZyB0eXBlLgorCSAqLworCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlcgkqZHJ2OworCV9fYmUxNgkJCQl0YWdfcHJvdG9jb2w7CisKKwkvKgorCSAqIFNsYXZlIG1paV9idXMgYW5kIGRldmljZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHBvcnRzLgorCSAqLworCWludAkJCQljcHVfcG9ydDsKKwl1MzIJCQkJdmFsaWRfcG9ydF9tYXNrOworCXN0cnVjdCBtaWlfYnVzCQkJKnNsYXZlX21paV9idXM7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpwb3J0c1tEU0FfTUFYX1BPUlRTXTsKKworCS8qCisJICogTGluayBzdGF0ZSBwb2xsaW5nLgorCSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAkJbGlua19wb2xsX3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QJCWxpbmtfcG9sbF90aW1lcjsKK307CisKK3N0cnVjdCBkc2Ffc2xhdmVfcHJpdiB7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzdHJ1Y3QgZHNhX3N3aXRjaAkqcGFyZW50OworCWludAkJCXBvcnQ7CisJc3RydWN0IHBoeV9kZXZpY2UJKnBoeTsKK307CisKK3N0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCisJX19iZTE2CQkJdGFnX3Byb3RvY29sOworCWludAkJCXByaXZfc2l6ZTsKKworCS8qCisJICogUHJvYmluZyBhbmQgc2V0dXAuCisJICovCisJY2hhcgkqKCpwcm9iZSkoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIpOworCWludAkoKnNldHVwKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworCWludAkoKnNldF9hZGRyKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKTsKKworCS8qCisJICogQWNjZXNzIHRvIHRoZSBzd2l0Y2gncyBQSFkgcmVnaXN0ZXJzLgorCSAqLworCWludAkoKnBoeV9yZWFkKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtKTsKKwlpbnQJKCpwaHlfd3JpdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICAgIGludCByZWdudW0sIHUxNiB2YWwpOworCisJLyoKKwkgKiBMaW5rIHN0YXRlIHBvbGxpbmcgYW5kIElSUSBoYW5kbGluZy4KKwkgKi8KKwl2b2lkCSgqcG9sbF9saW5rKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworCisJLyoKKwkgKiBldGh0b29sIGhhcmR3YXJlIHN0YXRpc3RpY3MuCisJICovCisJdm9pZAkoKmdldF9zdHJpbmdzKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKTsKKwl2b2lkCSgqZ2V0X2V0aHRvb2xfc3RhdHMpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCQkgICAgIGludCBwb3J0LCB1aW50NjRfdCAqZGF0YSk7CisJaW50CSgqZ2V0X3NzZXRfY291bnQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7Cit9OworCisvKiBkc2EuYyAqLworZXh0ZXJuIGNoYXIgZHNhX2RyaXZlcl92ZXJzaW9uW107Cit2b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICp0eXBlKTsKK3ZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7CisKKy8qIHNsYXZlLmMgKi8KK3ZvaWQgZHNhX3NsYXZlX21paV9idXNfaW5pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworc3RydWN0IG5ldF9kZXZpY2UgKmRzYV9zbGF2ZV9jcmVhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJICAgIGludCBwb3J0LCBjaGFyICpuYW1lKTsKKworLyogdGFnX2RzYS5jICovCitpbnQgZHNhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIHRhZ19lZHNhLmMgKi8KK2ludCBlZHNhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIHRhZ190cmFpbGVyLmMgKi8KK2ludCB0cmFpbGVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjA2MC5jIGIvbmV0L2RzYS9tdjg4ZTYwNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDA2OGVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9tdjg4ZTYwNjAuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIG5ldC9kc2EvbXY4OGU2MDYwLmMgLSBEcml2ZXIgZm9yIE1hcnZlbGwgODhlNjA2MCBzd2l0Y2ggY2hpcHMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSAiZHNhX3ByaXYuaCIKKworI2RlZmluZSBSRUdfUE9SVChwKQkJKDggKyAocCkpCisjZGVmaW5lIFJFR19HTE9CQUwJCTB4MGYKKworc3RhdGljIGludCByZWdfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnKQoreworCXJldHVybiBtZGlvYnVzX3JlYWQoZHMtPm1hc3Rlcl9taWlfYnVzLCBhZGRyLCByZWcpOworfQorCisjZGVmaW5lIFJFR19SRUFEKGFkZHIsIHJlZykJCQkJCVwKKwkoewkJCQkJCQlcCisJCWludCBfX3JldDsJCQkJCVwKKwkJCQkJCQkJXAorCQlfX3JldCA9IHJlZ19yZWFkKGRzLCBhZGRyLCByZWcpOwkJXAorCQlpZiAoX19yZXQgPCAwKQkJCQkJXAorCQkJcmV0dXJuIF9fcmV0OwkJCQlcCisJCV9fcmV0OwkJCQkJCVwKKwl9KQorCisKK3N0YXRpYyBpbnQgcmVnX3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpCit7CisJcmV0dXJuIG1kaW9idXNfd3JpdGUoZHMtPm1hc3Rlcl9taWlfYnVzLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKKyNkZWZpbmUgUkVHX1dSSVRFKGFkZHIsIHJlZywgdmFsKQkJCQlcCisJKHsJCQkJCQkJXAorCQlpbnQgX19yZXQ7CQkJCQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSByZWdfd3JpdGUoZHMsIGFkZHIsIHJlZywgdmFsKTsJCVwKKwkJaWYgKF9fcmV0IDwgMCkJCQkJCVwKKwkJCXJldHVybiBfX3JldDsJCQkJXAorCX0pCisKK3N0YXRpYyBjaGFyICptdjg4ZTYwNjBfcHJvYmUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIpCit7CisJaW50IHJldDsKKworCXJldCA9IG1kaW9idXNfcmVhZChidXMsIFJFR19QT1JUKDApLCAweDAzKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcmV0ICY9IDB4ZmZmMDsKKwkJaWYgKHJldCA9PSAweDA2MDApCisJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjA2MCI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MDYwX3N3aXRjaF9yZXNldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7CisJCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIHRyYW5zbWl0IHF1ZXVlcyB0byBkcmFpbi4KKwkgKi8KKwltc2xlZXAoMik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBzd2l0Y2guCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MEEsIDB4YTEzMCk7CisKKwkvKgorCSAqIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDAwKTsKKwkJaWYgKChyZXQgJiAweDgwMDApID09IDB4MDAwMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKGkgPT0gMTAwMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYwNjBfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwkvKgorCSAqIERpc2FibGUgZGlzY2FyZGluZyBvZiBmcmFtZXMgd2l0aCBleGNlc3NpdmUgY29sbGlzaW9ucywKKwkgKiBzZXQgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSB0byAxNTM2IGJ5dGVzLCBhbmQgbWFzayBhbGwKKwkgKiBpbnRlcnJ1cHQgc291cmNlcy4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwNCwgMHgwODAwKTsKKworCS8qCisJICogRW5hYmxlIGF1dG9tYXRpYyBhZGRyZXNzIGxlYXJuaW5nLCBzZXQgdGhlIGFkZHJlc3MKKwkgKiBkYXRhYmFzZSBzaXplIHRvIDEwMjQgZW50cmllcywgYW5kIHNldCB0aGUgZGVmYXVsdCBhZ2luZworCSAqIHRpbWUgdG8gNSBtaW51dGVzLgorCSAqLworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDBhLCAweDIxMzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MDYwX3NldHVwX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKK3sKKwlpbnQgYWRkciA9IFJFR19QT1JUKHApOworCisJLyoKKwkgKiBEbyBub3QgZm9yY2UgZmxvdyBjb250cm9sLCBkaXNhYmxlIEluZ3Jlc3MgYW5kIEVncmVzcworCSAqIEhlYWRlciB0YWdnaW5nLCBkaXNhYmxlIFZMQU4gdHVubmVsaW5nLCBhbmQgc2V0IHRoZSBwb3J0CisJICogc3RhdGUgdG8gRm9yd2FyZGluZy4gIEFkZGl0aW9uYWxseSwgaWYgdGhpcyBpcyB0aGUgQ1BVCisJICogcG9ydCwgZW5hYmxlIEluZ3Jlc3MgYW5kIEVncmVzcyBUcmFpbGVyIHRhZ2dpbmcgbW9kZS4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwNCwgKHAgPT0gZHMtPmNwdV9wb3J0KSA/IDB4NDEwMyA6IDB4MDAwMyk7CisKKwkvKgorCSAqIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IGl0cyBvd24gYWRkcmVzcworCSAqIGRhdGFiYXNlLCBhbGxvdyB0aGUgQ1BVIHBvcnQgdG8gdGFsayB0byBlYWNoIG9mIHRoZSAncmVhbCcKKwkgKiBwb3J0cywgYW5kIGFsbG93IGVhY2ggb2YgdGhlICdyZWFsJyBwb3J0cyB0byBvbmx5IHRhbGsgdG8KKwkgKiB0aGUgQ1BVIHBvcnQuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDYsCisJCQkoKHAgJiAweGYpIDw8IDEyKSB8CisJCQkgKChwID09IGRzLT5jcHVfcG9ydCkgPworCQkJCWRzLT52YWxpZF9wb3J0X21hc2sgOgorCQkJCSgxIDw8IGRzLT5jcHVfcG9ydCkpKTsKKworCS8qCisJICogUG9ydCBBc3NvY2lhdGlvbiBWZWN0b3I6IHdoZW4gbGVhcm5pbmcgc291cmNlIGFkZHJlc3NlcworCSAqIG9mIHBhY2tldHMsIGFkZCB0aGUgYWRkcmVzcyB0byB0aGUgYWRkcmVzcyBkYXRhYmFzZSB1c2luZworCSAqIGEgcG9ydCBiaXRtYXAgdGhhdCBoYXMgb25seSB0aGUgYml0IGZvciB0aGlzIHBvcnQgc2V0IGFuZAorCSAqIHRoZSBvdGhlciBiaXRzIGNsZWFyLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDBiLCAxIDw8IHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MDYwX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJcmV0ID0gbXY4OGU2MDYwX3N3aXRjaF9yZXNldChkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBAQEAgaW5pdGlhbGlzZSBhdHUgKi8KKworCXJldCA9IG12ODhlNjA2MF9zZXR1cF9nbG9iYWwoZHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlyZXQgPSBtdjg4ZTYwNjBfc2V0dXBfcG9ydChkcywgaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYwNjBfc2V0X2FkZHIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKK3sKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMSwgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMiwgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMywgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlNjA2MF9wb3J0X3RvX3BoeV9hZGRyKGludCBwb3J0KQoreworCWlmIChwb3J0ID49IDAgJiYgcG9ydCA8PSA1KQorCQlyZXR1cm4gcG9ydDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MDYwX3BoeV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCByZWdudW0pCit7CisJaW50IGFkZHI7CisKKwlhZGRyID0gbXY4OGU2MDYwX3BvcnRfdG9fcGh5X2FkZHIocG9ydCk7CisJaWYgKGFkZHIgPT0gLTEpCisJCXJldHVybiAweGZmZmY7CisKKwlyZXR1cm4gcmVnX3JlYWQoZHMsIGFkZHIsIHJlZ251bSk7Cit9CisKK3N0YXRpYyBpbnQKK212ODhlNjA2MF9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlpbnQgYWRkcjsKKworCWFkZHIgPSBtdjg4ZTYwNjBfcG9ydF90b19waHlfYWRkcihwb3J0KTsKKwlpZiAoYWRkciA9PSAtMSkKKwkJcmV0dXJuIDB4ZmZmZjsKKworCXJldHVybiByZWdfd3JpdGUoZHMsIGFkZHIsIHJlZ251bSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2MDYwX3BvbGxfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFNBX01BWF9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCWludCBwb3J0X3N0YXR1czsKKwkJaW50IGxpbms7CisJCWludCBzcGVlZDsKKwkJaW50IGR1cGxleDsKKwkJaW50IGZjOworCisJCWRldiA9IGRzLT5wb3J0c1tpXTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJbGluayA9IDA7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQlwb3J0X3N0YXR1cyA9IHJlZ19yZWFkKGRzLCBSRUdfUE9SVChpKSwgMHgwMCk7CisJCQlpZiAocG9ydF9zdGF0dXMgPCAwKQorCQkJCWNvbnRpbnVlOworCisJCQlsaW5rID0gISEocG9ydF9zdGF0dXMgJiAweDEwMDApOworCQl9CisKKwkJaWYgKCFsaW5rKSB7CisJCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzcGVlZCA9IChwb3J0X3N0YXR1cyAmIDB4MDEwMCkgPyAxMDAgOiAxMDsKKwkJZHVwbGV4ID0gKHBvcnRfc3RhdHVzICYgMHgwMjAwKSA/IDEgOiAwOworCQlmYyA9ICgocG9ydF9zdGF0dXMgJiAweGMwMDApID09IDB4YzAwMCkgPyAxIDogMDsKKworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVkIE1iL3MsICVzIGR1cGxleCwgIgorCQkJCQkgImZsb3cgY29udHJvbCAlc2FibGVkXG4iLCBkZXYtPm5hbWUsCisJCQkJCSBzcGVlZCwgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCQkgZmMgPyAiZW4iIDogImRpcyIpOworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyID0geworCS50YWdfcHJvdG9jb2wJPSBodG9ucyhFVEhfUF9UUkFJTEVSKSwKKwkucHJvYmUJCT0gbXY4OGU2MDYwX3Byb2JlLAorCS5zZXR1cAkJPSBtdjg4ZTYwNjBfc2V0dXAsCisJLnNldF9hZGRyCT0gbXY4OGU2MDYwX3NldF9hZGRyLAorCS5waHlfcmVhZAk9IG12ODhlNjA2MF9waHlfcmVhZCwKKwkucGh5X3dyaXRlCT0gbXY4OGU2MDYwX3BoeV93cml0ZSwKKwkucG9sbF9saW5rCT0gbXY4OGU2MDYwX3BvbGxfbGluaywKK307CisKK2ludCBfX2luaXQgbXY4OGU2MDYwX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYwNjBfc3dpdGNoX2RyaXZlcik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChtdjg4ZTYwNjBfaW5pdCk7CisKK3ZvaWQgX19leGl0IG12ODhlNjA2MF9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYwNjBfc3dpdGNoX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtdjg4ZTYwNjBfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjEyM182MV82NS5jIGIvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTViMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIG5ldC9kc2EvbXY4OGU2MTIzXzYxXzY1LmMgLSBNYXJ2ZWxsIDg4ZTYxMjMvNjE2MS82MTY1IHN3aXRjaCBjaGlwIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSAiZHNhX3ByaXYuaCIKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKworc3RhdGljIGNoYXIgKm12ODhlNjEyM182MV82NV9wcm9iZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19tdjg4ZTZ4eHhfcmVnX3JlYWQoYnVzLCBzd19hZGRyLCBSRUdfUE9SVCgwKSwgMHgwMyk7CisJaWYgKHJldCA+PSAwKSB7CisJCXJldCAmPSAweGZmZjA7CisJCWlmIChyZXQgPT0gMHgxMjEwKQorCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxMjMiOworCQlpZiAocmV0ID09IDB4MTYxMCkKKwkJCXJldHVybiAiTWFydmVsbCA4OEU2MTYxIjsKKwkJaWYgKHJldCA9PSAweDE2NTApCisJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjE2NSI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTIzXzYxXzY1X3N3aXRjaF9yZXNldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7CisJCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIHRyYW5zbWl0IHF1ZXVlcyB0byBkcmFpbi4KKwkgKi8KKwltc2xlZXAoMik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBzd2l0Y2guCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4YzQwMCk7CisKKwkvKgorCSAqIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDAwKTsKKwkJaWYgKChyZXQgJiAweGM4MDApID09IDB4YzgwMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKGkgPT0gMTAwMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlpbnQgcmV0OworCWludCBpOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBQSFkgcG9sbGluZyB1bml0IChzaW5jZSB0aGVyZSB3b24ndCBiZSBhbnkKKwkgKiBleHRlcm5hbCBQSFlzIHRvIHBvbGwpLCBkb24ndCBkaXNjYXJkIHBhY2tldHMgd2l0aAorCSAqIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zLCBhbmQgbWFzayBhbGwgaW50ZXJydXB0IHNvdXJjZXMuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4MDAwMCk7CisKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCBhZGRyZXNzIGFnaW5nIHRpbWUgdG8gNSBtaW51dGVzLCBhbmQKKwkgKiBlbmFibGUgYWRkcmVzcyBsZWFybiBtZXNzYWdlcyB0byBiZSBzZW50IHRvIGFsbCBtZXNzYWdlCisJICogcG9ydHMuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MGEsIDB4MDE0OCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgbWFwcGluZyByZWdpc3RlcnMuCisJICovCisJcmV0ID0gbXY4OGU2eHh4X2NvbmZpZ19wcmlvKGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBjcHUgcG9ydCwgYW5kIGNvbmZpZ3VyZSB0aGUgY3B1IHBvcnQgYXMgdGhlCisJICogcG9ydCB0byB3aGljaCBpbmdyZXNzIGFuZCBlZ3Jlc3MgbW9uaXRvciBmcmFtZXMgYXJlIHRvIGJlCisJICogc2VudC4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgxYSwgKGRzLT5jcHVfcG9ydCAqIDB4MTExMCkpOworCisJLyoKKwkgKiBEaXNhYmxlIHJlbW90ZSBtYW5hZ2VtZW50IGZvciBub3csIGFuZCBzZXQgdGhlIHN3aXRjaCdzCisJICogRFNBIGRldmljZSBudW1iZXIgdG8gemVyby4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgxYywgMHgwMDAwKTsKKworCS8qCisJICogU2VuZCBhbGwgZnJhbWVzIHdpdGggZGVzdGluYXRpb24gYWRkcmVzc2VzIG1hdGNoaW5nCisJICogMDE6ODA6YzI6MDA6MDA6MnggdG8gdGhlIENQVSBwb3J0LgorCSAqLworCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwMiwgMHhmZmZmKTsKKworCS8qCisJICogU2VuZCBhbGwgZnJhbWVzIHdpdGggZGVzdGluYXRpb24gYWRkcmVzc2VzIG1hdGNoaW5nCisJICogMDE6ODA6YzI6MDA6MDA6MHggdG8gdGhlIENQVSBwb3J0LgorCSAqLworCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwMywgMHhmZmZmKTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgbG9vcGJhY2sgZmlsdGVyLCBkaXNhYmxlIGZsb3cgY29udHJvbAorCSAqIG1lc3NhZ2VzLCBkaXNhYmxlIGZsb29kIGJyb2FkY2FzdCBvdmVycmlkZSwgZGlzYWJsZQorCSAqIHJlbW92aW5nIG9mIHByb3ZpZGVyIHRhZ3MsIGRpc2FibGUgQVRVIGFnZSB2aW9sYXRpb24KKwkgKiBpbnRlcnJ1cHRzLCBkaXNhYmxlIHRhZyBmbG93IGNvbnRyb2wsIGZvcmNlIGZsb3cKKwkgKiBjb250cm9sIHByaW9yaXR5IHRvIHRoZSBoaWdoZXN0LCBhbmQgc2VuZCBhbGwgc3BlY2lhbAorCSAqIG11bHRpY2FzdCBmcmFtZXMgdG8gdGhlIENQVSBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MDUsIDB4MDBmZik7CisKKwkvKgorCSAqIE1hcCBhbGwgRFNBIGRldmljZSBJRHMgdG8gdGhlIENQVSBwb3J0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MDYsIDB4ODAwMCB8IChpIDw8IDgpIHwgZHMtPmNwdV9wb3J0KTsKKworCS8qCisJICogQ2xlYXIgYWxsIHRydW5rIG1hc2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwNywgMHg4MDAwIHwgKGkgPDwgMTIpIHwgMHhmZik7CisKKwkvKgorCSAqIENsZWFyIGFsbCB0cnVuayBtYXBwaW5ncy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJUkVHX1dSSVRFKFJFR19HTE9CQUwyLCAweDA4LCAweDgwMDAgfCAoaSA8PCAxMSkpOworCisJLyoKKwkgKiBEaXNhYmxlIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBieSByZXNldHRpbmcgYWxsIGluZ3Jlc3MKKwkgKiByYXRlIGxpbWl0IHJlZ2lzdGVycyB0byB0aGVpciBpbml0aWFsIHN0YXRlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwOSwgMHg5MDAwIHwgKGkgPDwgOCkpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIGNyb3NzLWNoaXAgcG9ydCBWTEFOIHRhYmxlIHRvIHJlc2V0IGRlZmF1bHRzLgorCSAqLworCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwYiwgMHg5MDAwKTsKKworCS8qCisJICogQ2xlYXIgdGhlIHByaW9yaXR5IG92ZXJyaWRlIHRhYmxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MGYsIDB4ODAwMCB8IChpIDw8IDgpKTsKKworCS8qIEBAQCBpbml0aWFsaXNlIEFWQiAoMjIvMjMpIHdhdGNoZG9nICgyNykgc2RldCAoMjkpIHJlZ2lzdGVycyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTIzXzYxXzY1X3NldHVwX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKK3sKKwlpbnQgYWRkciA9IFJFR19QT1JUKHApOworCisJLyoKKwkgKiBNQUMgRm9yY2luZyByZWdpc3RlcjogZG9uJ3QgZm9yY2UgbGluaywgc3BlZWQsIGR1cGxleAorCSAqIG9yIGZsb3cgY29udHJvbCBzdGF0ZSB0byBhbnkgcGFydGljdWxhciB2YWx1ZXMuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDEsIDB4MDAwMyk7CisKKwkvKgorCSAqIERvIG5vdCBsaW1pdCB0aGUgcGVyaW9kIG9mIHRpbWUgdGhhdCB0aGlzIHBvcnQgY2FuIGJlCisJICogcGF1c2VkIGZvciBieSB0aGUgcmVtb3RlIGVuZCBvciB0aGUgcGVyaW9kIG9mIHRpbWUgdGhhdAorCSAqIHRoaXMgcG9ydCBjYW4gcGF1c2UgdGhlIHJlbW90ZSBlbmQuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDIsIDB4MDAwMCk7CisKKwkvKgorCSAqIFBvcnQgQ29udHJvbDogZGlzYWJsZSBEcm9wLW9uLVVubG9jaywgZGlzYWJsZSBEcm9wLW9uLUxvY2ssCisJICogY29uZmlndXJlIHRoZSByZXF1ZXN0ZWQgKERTQS9FRFNBKSB0YWdnaW5nIG1vZGUgaWYgdGhpcyBpcworCSAqIHRoZSBDUFUgcG9ydCwgZGlzYWJsZSBIZWFkZXIgbW9kZSwgZW5hYmxlIElHTVAvTUxEIHNub29waW5nLAorCSAqIGRpc2FibGUgVkxBTiB0dW5uZWxpbmcsIGRldGVybWluZSBwcmlvcml0eSBieSBsb29raW5nIGF0CisJICogODAyLjFwIGFuZCBJUCBwcmlvcml0eSBmaWVsZHMgKElQIHByaW8gaGFzIHByZWNlZGVuY2UpLCBhbmQKKwkgKiBzZXQgU1RQIHN0YXRlIHRvIEZvcndhcmRpbmcuICBGaW5hbGx5LCBpZiB0aGlzIGlzIHRoZSBDUFUKKwkgKiBwb3J0LCBhZGRpdGlvbmFsbHkgZW5hYmxlIGZvcndhcmRpbmcgb2YgdW5rbm93biB1bmljYXN0IGFuZAorCSAqIG11bHRpY2FzdCBhZGRyZXNzZXMuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDQsCisJCQkocCA9PSBkcy0+Y3B1X3BvcnQpID8KKwkJCSAoZHMtPnRhZ19wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9EU0EpKSA/CisJCQkgIDB4MDUzZiA6IDB4MzczZiA6CisJCQkgMHgwNDMzKTsKKworCS8qCisJICogUG9ydCBDb250cm9sIDE6IGRpc2FibGUgdHJ1bmtpbmcuICBBbHNvLCBpZiB0aGlzIGlzIHRoZQorCSAqIENQVSBwb3J0LCBlbmFibGUgbGVhcm4gbWVzc2FnZXMgdG8gYmUgc2VudCB0byB0aGlzIHBvcnQuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDUsIChwID09IGRzLT5jcHVfcG9ydCkgPyAweDgwMDAgOiAweDAwMDApOworCisJLyoKKwkgKiBQb3J0IGJhc2VkIFZMQU4gbWFwOiBnaXZlIGVhY2ggcG9ydCBpdHMgb3duIGFkZHJlc3MKKwkgKiBkYXRhYmFzZSwgYWxsb3cgdGhlIENQVSBwb3J0IHRvIHRhbGsgdG8gZWFjaCBvZiB0aGUgJ3JlYWwnCisJICogcG9ydHMsIGFuZCBhbGxvdyBlYWNoIG9mIHRoZSAncmVhbCcgcG9ydHMgdG8gb25seSB0YWxrIHRvCisJICogdGhlIENQVSBwb3J0LgorCSAqLworCVJFR19XUklURShhZGRyLCAweDA2LAorCQkJKChwICYgMHhmKSA8PCAxMikgfAorCQkJICgocCA9PSBkcy0+Y3B1X3BvcnQpID8KKwkJCQlkcy0+dmFsaWRfcG9ydF9tYXNrIDoKKwkJCQkoMSA8PCBkcy0+Y3B1X3BvcnQpKSk7CisKKwkvKgorCSAqIERlZmF1bHQgVkxBTiBJRCBhbmQgcHJpb3JpdHk6IGRvbid0IHNldCBhIGRlZmF1bHQgVkxBTgorCSAqIElELCBhbmQgc2V0IHRoZSBkZWZhdWx0IHBhY2tldCBwcmlvcml0eSB0byB6ZXJvLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDA3LCAweDAwMDApOworCisJLyoKKwkgKiBQb3J0IENvbnRyb2wgMjogZG9uJ3QgZm9yY2UgYSBnb29kIEZDUywgc2V0IHRoZSBtYXhpbXVtCisJICogZnJhbWUgc2l6ZSB0byAxMDI0MCBieXRlcywgZG9uJ3QgbGV0IHRoZSBzd2l0Y2ggYWRkIG9yCisJICogc3RyaXAgODAyLjFxIHRhZ3MsIGRvbid0IGRpc2NhcmQgdGFnZ2VkIG9yIHVudGFnZ2VkIGZyYW1lcworCSAqIG9uIHRoaXMgcG9ydCwgZG8gYSBkZXN0aW5hdGlvbiBhZGRyZXNzIGxvb2t1cCBvbiBhbGwKKwkgKiByZWNlaXZlZCBwYWNrZXRzIGFzIHVzdWFsLCBkaXNhYmxlIEFSUCBtaXJyb3JpbmcgYW5kIGRvbid0CisJICogc2VuZCBhIGNvcHkgb2YgYWxsIHRyYW5zbWl0dGVkL3JlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIHBvcnQKKwkgKiB0byB0aGUgQ1BVLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDA4LCAweDIwODApOworCisJLyoKKwkgKiBFZ3Jlc3MgcmF0ZSBjb250cm9sOiBkaXNhYmxlIGVncmVzcyByYXRlIGNvbnRyb2wuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDksIDB4MDAwMSk7CisKKwkvKgorCSAqIEVncmVzcyByYXRlIGNvbnRyb2wgMjogZGlzYWJsZSBlZ3Jlc3MgcmF0ZSBjb250cm9sLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDBhLCAweDAwMDApOworCisJLyoKKwkgKiBQb3J0IEFzc29jaWF0aW9uIFZlY3Rvcjogd2hlbiBsZWFybmluZyBzb3VyY2UgYWRkcmVzc2VzCisJICogb2YgcGFja2V0cywgYWRkIHRoZSBhZGRyZXNzIHRvIHRoZSBhZGRyZXNzIGRhdGFiYXNlIHVzaW5nCisJICogYSBwb3J0IGJpdG1hcCB0aGF0IGhhcyBvbmx5IHRoZSBiaXQgZm9yIHRoaXMgcG9ydCBzZXQgYW5kCisJICogdGhlIG90aGVyIGJpdHMgY2xlYXIuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MGIsIDEgPDwgcCk7CisKKwkvKgorCSAqIFBvcnQgQVRVIGNvbnRyb2w6IGRpc2FibGUgbGltaXRpbmcgdGhlIG51bWJlciBvZiBhZGRyZXNzCisJICogZGF0YWJhc2UgZW50cmllcyB0aGF0IHRoaXMgcG9ydCBpcyBhbGxvd2VkIHRvIHVzZS4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwYywgMHgwMDAwKTsKKworCS8qCisJICogUHJpb3JpdCBPdmVycmlkZTogZGlzYWJsZSBEQSwgU0EgYW5kIFZUVSBwcmlvcml0eSBvdmVycmlkZS4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwZCwgMHgwMDAwKTsKKworCS8qCisJICogUG9ydCBFdGhlcnR5cGU6IHVzZSB0aGUgRXRoZXJ0eXBlIERTQSBFdGhlcnR5cGUgdmFsdWUuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MGYsIEVUSF9QX0VEU0EpOworCisJLyoKKwkgKiBUYWcgUmVtYXA6IHVzZSBhbiBpZGVudGl0eSA4MDIuMXAgcHJpbyAtPiBzd2l0Y2ggcHJpbworCSAqIG1hcHBpbmcuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MTgsIDB4MzIxMCk7CisKKwkvKgorCSAqIFRhZyBSZW1hcCAyOiB1c2UgYW4gaWRlbnRpdHkgODAyLjFwIHByaW8gLT4gc3dpdGNoIHByaW8KKwkgKiBtYXBwaW5nLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDE5LCAweDc2NTQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTIzXzYxXzY1X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmcHMtPnNtaV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcHMtPnN0YXRzX211dGV4KTsKKworCXJldCA9IG12ODhlNjEyM182MV82NV9zd2l0Y2hfcmVzZXQoZHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQEBAIGluaXRpYWxpc2UgdnR1IGFuZCBhdHUgKi8KKworCXJldCA9IG12ODhlNjEyM182MV82NV9zZXR1cF9nbG9iYWwoZHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlyZXQgPSBtdjg4ZTYxMjNfNjFfNjVfc2V0dXBfcG9ydChkcywgaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfcG9ydF90b19waHlfYWRkcihpbnQgcG9ydCkKK3sKKwlpZiAocG9ydCA+PSAwICYmIHBvcnQgPD0gNCkKKwkJcmV0dXJuIHBvcnQ7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Cittdjg4ZTYxMjNfNjFfNjVfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSkKK3sKKwlpbnQgYWRkciA9IG12ODhlNjEyM182MV82NV9wb3J0X3RvX3BoeV9hZGRyKHBvcnQpOworCXJldHVybiBtdjg4ZTZ4eHhfcGh5X3JlYWQoZHMsIGFkZHIsIHJlZ251bSk7Cit9CisKK3N0YXRpYyBpbnQKK212ODhlNjEyM182MV82NV9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAorCQkJICAgICAgaW50IHBvcnQsIGludCByZWdudW0sIHUxNiB2YWwpCit7CisJaW50IGFkZHIgPSBtdjg4ZTYxMjNfNjFfNjVfcG9ydF90b19waHlfYWRkcihwb3J0KTsKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV93cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOworfQorCitzdGF0aWMgc3RydWN0IG12ODhlNnh4eF9od19zdGF0IG12ODhlNjEyM182MV82NV9od19zdGF0c1tdID0geworCXsgImluX2dvb2Rfb2N0ZXRzIiwgOCwgMHgwMCwgfSwKKwl7ICJpbl9iYWRfb2N0ZXRzIiwgNCwgMHgwMiwgfSwKKwl7ICJpbl91bmljYXN0IiwgNCwgMHgwNCwgfSwKKwl7ICJpbl9icm9hZGNhc3RzIiwgNCwgMHgwNiwgfSwKKwl7ICJpbl9tdWx0aWNhc3RzIiwgNCwgMHgwNywgfSwKKwl7ICJpbl9wYXVzZSIsIDQsIDB4MTYsIH0sCisJeyAiaW5fdW5kZXJzaXplIiwgNCwgMHgxOCwgfSwKKwl7ICJpbl9mcmFnbWVudHMiLCA0LCAweDE5LCB9LAorCXsgImluX292ZXJzaXplIiwgNCwgMHgxYSwgfSwKKwl7ICJpbl9qYWJiZXIiLCA0LCAweDFiLCB9LAorCXsgImluX3J4X2Vycm9yIiwgNCwgMHgxYywgfSwKKwl7ICJpbl9mY3NfZXJyb3IiLCA0LCAweDFkLCB9LAorCXsgIm91dF9vY3RldHMiLCA4LCAweDBlLCB9LAorCXsgIm91dF91bmljYXN0IiwgNCwgMHgxMCwgfSwKKwl7ICJvdXRfYnJvYWRjYXN0cyIsIDQsIDB4MTMsIH0sCisJeyAib3V0X211bHRpY2FzdHMiLCA0LCAweDEyLCB9LAorCXsgIm91dF9wYXVzZSIsIDQsIDB4MTUsIH0sCisJeyAiZXhjZXNzaXZlIiwgNCwgMHgxMSwgfSwKKwl7ICJjb2xsaXNpb25zIiwgNCwgMHgxZSwgfSwKKwl7ICJkZWZlcnJlZCIsIDQsIDB4MDUsIH0sCisJeyAic2luZ2xlIiwgNCwgMHgxNCwgfSwKKwl7ICJtdWx0aXBsZSIsIDQsIDB4MTcsIH0sCisJeyAib3V0X2Zjc19lcnJvciIsIDQsIDB4MDMsIH0sCisJeyAibGF0ZSIsIDQsIDB4MWYsIH0sCisJeyAiaGlzdF82NGJ5dGVzIiwgNCwgMHgwOCwgfSwKKwl7ICJoaXN0XzY1XzEyN2J5dGVzIiwgNCwgMHgwOSwgfSwKKwl7ICJoaXN0XzEyOF8yNTVieXRlcyIsIDQsIDB4MGEsIH0sCisJeyAiaGlzdF8yNTZfNTExYnl0ZXMiLCA0LCAweDBiLCB9LAorCXsgImhpc3RfNTEyXzEwMjNieXRlcyIsIDQsIDB4MGMsIH0sCisJeyAiaGlzdF8xMDI0X21heF9ieXRlcyIsIDQsIDB4MGQsIH0sCit9OworCitzdGF0aWMgdm9pZAorbXY4OGU2MTIzXzYxXzY1X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCit7CisJbXY4OGU2eHh4X2dldF9zdHJpbmdzKGRzLCBBUlJBWV9TSVpFKG12ODhlNjEyM182MV82NV9od19zdGF0cyksCisJCQkgICAgICBtdjg4ZTYxMjNfNjFfNjVfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorbXY4OGU2MTIzXzYxXzY1X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCQkgIGludCBwb3J0LCB1aW50NjRfdCAqZGF0YSkKK3sKKwltdjg4ZTZ4eHhfZ2V0X2V0aHRvb2xfc3RhdHMoZHMsIEFSUkFZX1NJWkUobXY4OGU2MTIzXzYxXzY1X2h3X3N0YXRzKSwKKwkJCQkgICAgbXY4OGU2MTIzXzYxXzY1X2h3X3N0YXRzLCBwb3J0LCBkYXRhKTsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBBUlJBWV9TSVpFKG12ODhlNjEyM182MV82NV9od19zdGF0cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MTIzXzYxXzY1X3N3aXRjaF9kcml2ZXIgPSB7CisJLnRhZ19wcm90b2NvbAkJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0VEU0EpLAorCS5wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSksCisJLnByb2JlCQkJPSBtdjg4ZTYxMjNfNjFfNjVfcHJvYmUsCisJLnNldHVwCQkJPSBtdjg4ZTYxMjNfNjFfNjVfc2V0dXAsCisJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkcl9pbmRpcmVjdCwKKwkucGh5X3JlYWQJCT0gbXY4OGU2MTIzXzYxXzY1X3BoeV9yZWFkLAorCS5waHlfd3JpdGUJCT0gbXY4OGU2MTIzXzYxXzY1X3BoeV93cml0ZSwKKwkucG9sbF9saW5rCQk9IG12ODhlNnh4eF9wb2xsX2xpbmssCisJLmdldF9zdHJpbmdzCQk9IG12ODhlNjEyM182MV82NV9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjg4ZTYxMjNfNjFfNjVfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9zc2V0X2NvdW50CQk9IG12ODhlNjEyM182MV82NV9nZXRfc3NldF9jb3VudCwKK307CisKK2ludCBfX2luaXQgbXY4OGU2MTIzXzYxXzY1X2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYxMjNfNjFfNjVfc3dpdGNoX2RyaXZlcik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChtdjg4ZTYxMjNfNjFfNjVfaW5pdCk7CisKK3ZvaWQgX19leGl0IG12ODhlNjEyM182MV82NV9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYxMjNfNjFfNjVfc3dpdGNoX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtdjg4ZTYxMjNfNjFfNjVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjEzMS5jIGIvbmV0L2RzYS9tdjg4ZTYxMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmUwMWViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9tdjg4ZTYxMzEuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIG5ldC9kc2EvbXY4OGU2MTMxLmMgLSBNYXJ2ZWxsIDg4ZTYxMzEgc3dpdGNoIGNoaXAgc3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlICJkc2FfcHJpdi5oIgorI2luY2x1ZGUgIm12ODhlNnh4eC5oIgorCitzdGF0aWMgY2hhciAqbXY4OGU2MTMxX3Byb2JlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBzd19hZGRyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCAweDAzKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcmV0ICY9IDB4ZmZmMDsKKwkJaWYgKHJldCA9PSAweDEwNjApCisJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjEzMSI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTMxX3N3aXRjaF9yZXNldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7CisJCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIHRyYW5zbWl0IHF1ZXVlcyB0byBkcmFpbi4KKwkgKi8KKwltc2xlZXAoMik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBzd2l0Y2guCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4YzQwMCk7CisKKwkvKgorCSAqIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDAwKTsKKwkJaWYgKChyZXQgJiAweGM4MDApID09IDB4YzgwMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKGkgPT0gMTAwMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMzFfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlpbnQgcmV0OworCWludCBpOworCisJLyoKKwkgKiBFbmFibGUgdGhlIFBIWSBwb2xsaW5nIHVuaXQsIGRvbid0IGRpc2NhcmQgcGFja2V0cyB3aXRoCisJICogZXhjZXNzaXZlIGNvbGxpc2lvbnMsIHVzZSBhIHdlaWdodGVkIGZhaXIgcXVldWVpbmcgc2NoZW1lCisJICogdG8gYXJiaXRyYXRlIGJldHdlZW4gcGFja2V0IHF1ZXVlcywgc2V0IHRoZSBtYXhpbXVtIGZyYW1lCisJICogc2l6ZSB0byAxNjMyLCBhbmQgbWFzayBhbGwgaW50ZXJydXB0IHNvdXJjZXMuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4NDQwMCk7CisKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCBhZGRyZXNzIGFnaW5nIHRpbWUgdG8gNSBtaW51dGVzLCBhbmQKKwkgKiBlbmFibGUgYWRkcmVzcyBsZWFybiBtZXNzYWdlcyB0byBiZSBzZW50IHRvIGFsbCBtZXNzYWdlCisJICogcG9ydHMuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MGEsIDB4MDE0OCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgbWFwcGluZyByZWdpc3RlcnMuCisJICovCisJcmV0ID0gbXY4OGU2eHh4X2NvbmZpZ19wcmlvKGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogU2V0IHRoZSBWTEFOIGV0aGVydHlwZSB0byAweDgxMDAuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTksIDB4ODEwMCk7CisKKwkvKgorCSAqIERpc2FibGUgQVJQIG1pcnJvcmluZywgYW5kIGNvbmZpZ3VyZSB0aGUgY3B1IHBvcnQgYXMgdGhlCisJICogcG9ydCB0byB3aGljaCBpbmdyZXNzIGFuZCBlZ3Jlc3MgbW9uaXRvciBmcmFtZXMgYXJlIHRvIGJlCisJICogc2VudC4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgxYSwgKGRzLT5jcHVfcG9ydCAqIDB4MTEwMCkgfCAweDAwZjApOworCisJLyoKKwkgKiBEaXNhYmxlIGNhc2NhZGUgcG9ydCBmdW5jdGlvbmFsaXR5LCBhbmQgc2V0IHRoZSBzd2l0Y2gncworCSAqIERTQSBkZXZpY2UgbnVtYmVyIHRvIHplcm8uCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MWMsIDB4ZTAwMCk7CisKKwkvKgorCSAqIFNlbmQgYWxsIGZyYW1lcyB3aXRoIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBtYXRjaGluZworCSAqIDAxOjgwOmMyOjAwOjAwOjB4IHRvIHRoZSBDUFUgcG9ydC4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MDMsIDB4ZmZmZik7CisKKwkvKgorCSAqIElnbm9yZSByZW1vdmVkIHRhZyBkYXRhIG9uIGRvdWJseSB0YWdnZWQgcGFja2V0cywgZGlzYWJsZQorCSAqIGZsb3cgY29udHJvbCBtZXNzYWdlcywgZm9yY2UgZmxvdyBjb250cm9sIHByaW9yaXR5IHRvIHRoZQorCSAqIGhpZ2hlc3QsIGFuZCBzZW5kIGFsbCBzcGVjaWFsIG11bHRpY2FzdCBmcmFtZXMgdG8gdGhlIENQVQorCSAqIHBvcnQgYXQgdGhlIGhpZ2VzdCBwcmlvcml0eS4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MDUsIDB4MDBmZik7CisKKwkvKgorCSAqIE1hcCBhbGwgRFNBIGRldmljZSBJRHMgdG8gdGhlIENQVSBwb3J0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MDYsIDB4ODAwMCB8IChpIDw8IDgpIHwgZHMtPmNwdV9wb3J0KTsKKworCS8qCisJICogQ2xlYXIgYWxsIHRydW5rIG1hc2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwNywgMHg4MDAwIHwgKGkgPDwgMTIpIHwgMHhmZik7CisKKwkvKgorCSAqIENsZWFyIGFsbCB0cnVuayBtYXBwaW5ncy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJUkVHX1dSSVRFKFJFR19HTE9CQUwyLCAweDA4LCAweDgwMDAgfCAoaSA8PCAxMSkpOworCisJLyoKKwkgKiBGb3JjZSB0aGUgcHJpb3JpdHkgb2YgSUdNUC9NTEQgc25vb3AgZnJhbWVzIGFuZCBBUlAgZnJhbWVzCisJICogdG8gdGhlIGhpZ2hlc3Qgc2V0dGluZy4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MGYsIDB4MDBmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMzFfc2V0dXBfcG9ydChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwKQoreworCWludCBhZGRyID0gUkVHX1BPUlQocCk7CisKKwkvKgorCSAqIE1BQyBGb3JjaW5nIHJlZ2lzdGVyOiBkb24ndCBmb3JjZSBsaW5rLCBzcGVlZCwgZHVwbGV4CisJICogb3IgZmxvdyBjb250cm9sIHN0YXRlIHRvIGFueSBwYXJ0aWN1bGFyIHZhbHVlcy4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwMSwgMHgwMDAzKTsKKworCS8qCisJICogUG9ydCBDb250cm9sOiBkaXNhYmxlIENvcmUgVGFnLCBkaXNhYmxlIERyb3Atb24tTG9jaywKKwkgKiB0cmFuc21pdCBmcmFtZXMgdW5tb2RpZmllZCwgZGlzYWJsZSBIZWFkZXIgbW9kZSwKKwkgKiBlbmFibGUgSUdNUC9NTEQgc25vb3AsIGRpc2FibGUgRG91YmxlVGFnLCBkaXNhYmxlIFZMQU4KKwkgKiB0dW5uZWxpbmcsIGRldGVybWluZSBwcmlvcml0eSBieSBsb29raW5nIGF0IDgwMi4xcCBhbmQKKwkgKiBJUCBwcmlvcml0eSBmaWVsZHMgKElQIHByaW8gaGFzIHByZWNlZGVuY2UpLCBhbmQgc2V0IFNUUAorCSAqIHN0YXRlIHRvIEZvcndhcmRpbmcuICBGaW5hbGx5LCBpZiB0aGlzIGlzIHRoZSBDUFUgcG9ydCwKKwkgKiBhZGRpdGlvbmFsbHkgZW5hYmxlIERTQSB0YWdnaW5nIGFuZCBmb3J3YXJkaW5nIG9mIHVua25vd24KKwkgKiB1bmljYXN0IGFkZHJlc3Nlcy4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwNCwgKHAgPT0gZHMtPmNwdV9wb3J0KSA/IDB4MDUzNyA6IDB4MDQzMyk7CisKKwkvKgorCSAqIFBvcnQgQ29udHJvbCAxOiBkaXNhYmxlIHRydW5raW5nLiAgQWxzbywgaWYgdGhpcyBpcyB0aGUKKwkgKiBDUFUgcG9ydCwgZW5hYmxlIGxlYXJuIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhpcyBwb3J0LgorCSAqLworCVJFR19XUklURShhZGRyLCAweDA1LCAocCA9PSBkcy0+Y3B1X3BvcnQpID8gMHg4MDAwIDogMHgwMDAwKTsKKworCS8qCisJICogUG9ydCBiYXNlZCBWTEFOIG1hcDogZ2l2ZSBlYWNoIHBvcnQgaXRzIG93biBhZGRyZXNzCisJICogZGF0YWJhc2UsIGFsbG93IHRoZSBDUFUgcG9ydCB0byB0YWxrIHRvIGVhY2ggb2YgdGhlICdyZWFsJworCSAqIHBvcnRzLCBhbmQgYWxsb3cgZWFjaCBvZiB0aGUgJ3JlYWwnIHBvcnRzIHRvIG9ubHkgdGFsayB0bworCSAqIHRoZSBDUFUgcG9ydC4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwNiwKKwkJCSgocCAmIDB4ZikgPDwgMTIpIHwKKwkJCSAoKHAgPT0gZHMtPmNwdV9wb3J0KSA/CisJCQkJZHMtPnZhbGlkX3BvcnRfbWFzayA6CisJCQkJKDEgPDwgZHMtPmNwdV9wb3J0KSkpOworCisJLyoKKwkgKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KKwkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgwNywgMHgwMDAwKTsKKworCS8qCisJICogUG9ydCBDb250cm9sIDI6IGRvbid0IGZvcmNlIGEgZ29vZCBGQ1MsIGRvbid0IHVzZQorCSAqIFZMQU4tYmFzZWQsIHNvdXJjZSBhZGRyZXNzLWJhc2VkIG9yIGRlc3RpbmF0aW9uCisJICogYWRkcmVzcy1iYXNlZCBwcmlvcml0eSBvdmVycmlkZXMsIGRvbid0IGxldCB0aGUgc3dpdGNoCisJICogYWRkIG9yIHN0cmlwIDgwMi4xcSB0YWdzLCBkb24ndCBkaXNjYXJkIHRhZ2dlZCBvcgorCSAqIHVudGFnZ2VkIGZyYW1lcyBvbiB0aGlzIHBvcnQsIGRvIGEgZGVzdGluYXRpb24gYWRkcmVzcworCSAqIGxvb2t1cCBvbiByZWNlaXZlZCBwYWNrZXRzIGFzIHVzdWFsLCBkb24ndCBzZW5kIGEgY29weQorCSAqIG9mIGFsbCB0cmFuc21pdHRlZC9yZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBwb3J0IHRvIHRoZQorCSAqIENQVSwgYW5kIGNvbmZpZ3VyZSB0aGUgQ1BVIHBvcnQgbnVtYmVyLiAgQWxzbywgaWYgdGhpcworCSAqIGlzIHRoZSBDUFUgcG9ydCwgZW5hYmxlIGZvcndhcmRpbmcgb2YgdW5rbm93biBtdWx0aWNhc3QKKwkgKiBhZGRyZXNzZXMuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDgsCisJCQkoKHAgPT0gZHMtPmNwdV9wb3J0KSA/IDB4MDBjMCA6IDB4MDA4MCkgfAorCQkJIGRzLT5jcHVfcG9ydCk7CisKKwkvKgorCSAqIFJhdGUgQ29udHJvbDogZGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MDksIDB4MDAwMCk7CisKKwkvKgorCSAqIFJhdGUgQ29udHJvbCAyOiBkaXNhYmxlIGVncmVzcyByYXRlIGxpbWl0aW5nLgorCSAqLworCVJFR19XUklURShhZGRyLCAweDBhLCAweDAwMDApOworCisJLyoKKwkgKiBQb3J0IEFzc29jaWF0aW9uIFZlY3Rvcjogd2hlbiBsZWFybmluZyBzb3VyY2UgYWRkcmVzc2VzCisJICogb2YgcGFja2V0cywgYWRkIHRoZSBhZGRyZXNzIHRvIHRoZSBhZGRyZXNzIGRhdGFiYXNlIHVzaW5nCisJICogYSBwb3J0IGJpdG1hcCB0aGF0IGhhcyBvbmx5IHRoZSBiaXQgZm9yIHRoaXMgcG9ydCBzZXQgYW5kCisJICogdGhlIG90aGVyIGJpdHMgY2xlYXIuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MGIsIDEgPDwgcCk7CisKKwkvKgorCSAqIFRhZyBSZW1hcDogdXNlIGFuIGlkZW50aXR5IDgwMi4xcCBwcmlvIC0+IHN3aXRjaCBwcmlvCisJICogbWFwcGluZy4KKwkgKi8KKwlSRUdfV1JJVEUoYWRkciwgMHgxOCwgMHgzMjEwKTsKKworCS8qCisJICogVGFnIFJlbWFwIDI6IHVzZSBhbiBpZGVudGl0eSA4MDIuMXAgcHJpbyAtPiBzd2l0Y2ggcHJpbworCSAqIG1hcHBpbmcuCisJICovCisJUkVHX1dSSVRFKGFkZHIsIDB4MTksIDB4NzY1NCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTYxMzFfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSAodm9pZCAqKShkcyArIDEpOworCWludCBpOworCWludCByZXQ7CisKKwltdXRleF9pbml0KCZwcy0+c21pX211dGV4KTsKKwltdjg4ZTZ4eHhfcHB1X3N0YXRlX2luaXQoZHMpOworCW11dGV4X2luaXQoJnBzLT5zdGF0c19tdXRleCk7CisKKwlyZXQgPSBtdjg4ZTYxMzFfc3dpdGNoX3Jlc2V0KGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEBAQCBpbml0aWFsaXNlIHZ0dSBhbmQgYXR1ICovCisKKwlyZXQgPSBtdjg4ZTYxMzFfc2V0dXBfZ2xvYmFsKGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJcmV0ID0gbXY4OGU2MTMxX3NldHVwX3BvcnQoZHMsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTMxX3BvcnRfdG9fcGh5X2FkZHIoaW50IHBvcnQpCit7CisJaWYgKHBvcnQgPj0gMCAmJiBwb3J0ICE9IDMgJiYgcG9ydCA8PSA3KQorCQlyZXR1cm4gcG9ydDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK212ODhlNjEzMV9waHlfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtKQoreworCWludCBhZGRyID0gbXY4OGU2MTMxX3BvcnRfdG9fcGh5X2FkZHIocG9ydCk7CisJcmV0dXJuIG12ODhlNnh4eF9waHlfcmVhZF9wcHUoZHMsIGFkZHIsIHJlZ251bSk7Cit9CisKK3N0YXRpYyBpbnQKK212ODhlNjEzMV9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAorCQkJICAgICAgaW50IHBvcnQsIGludCByZWdudW0sIHUxNiB2YWwpCit7CisJaW50IGFkZHIgPSBtdjg4ZTYxMzFfcG9ydF90b19waHlfYWRkcihwb3J0KTsKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV93cml0ZV9wcHUoZHMsIGFkZHIsIHJlZ251bSwgdmFsKTsKK30KKworc3RhdGljIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCBtdjg4ZTYxMzFfaHdfc3RhdHNbXSA9IHsKKwl7ICJpbl9nb29kX29jdGV0cyIsIDgsIDB4MDAsIH0sCisJeyAiaW5fYmFkX29jdGV0cyIsIDQsIDB4MDIsIH0sCisJeyAiaW5fdW5pY2FzdCIsIDQsIDB4MDQsIH0sCisJeyAiaW5fYnJvYWRjYXN0cyIsIDQsIDB4MDYsIH0sCisJeyAiaW5fbXVsdGljYXN0cyIsIDQsIDB4MDcsIH0sCisJeyAiaW5fcGF1c2UiLCA0LCAweDE2LCB9LAorCXsgImluX3VuZGVyc2l6ZSIsIDQsIDB4MTgsIH0sCisJeyAiaW5fZnJhZ21lbnRzIiwgNCwgMHgxOSwgfSwKKwl7ICJpbl9vdmVyc2l6ZSIsIDQsIDB4MWEsIH0sCisJeyAiaW5famFiYmVyIiwgNCwgMHgxYiwgfSwKKwl7ICJpbl9yeF9lcnJvciIsIDQsIDB4MWMsIH0sCisJeyAiaW5fZmNzX2Vycm9yIiwgNCwgMHgxZCwgfSwKKwl7ICJvdXRfb2N0ZXRzIiwgOCwgMHgwZSwgfSwKKwl7ICJvdXRfdW5pY2FzdCIsIDQsIDB4MTAsIH0sCisJeyAib3V0X2Jyb2FkY2FzdHMiLCA0LCAweDEzLCB9LAorCXsgIm91dF9tdWx0aWNhc3RzIiwgNCwgMHgxMiwgfSwKKwl7ICJvdXRfcGF1c2UiLCA0LCAweDE1LCB9LAorCXsgImV4Y2Vzc2l2ZSIsIDQsIDB4MTEsIH0sCisJeyAiY29sbGlzaW9ucyIsIDQsIDB4MWUsIH0sCisJeyAiZGVmZXJyZWQiLCA0LCAweDA1LCB9LAorCXsgInNpbmdsZSIsIDQsIDB4MTQsIH0sCisJeyAibXVsdGlwbGUiLCA0LCAweDE3LCB9LAorCXsgIm91dF9mY3NfZXJyb3IiLCA0LCAweDAzLCB9LAorCXsgImxhdGUiLCA0LCAweDFmLCB9LAorCXsgImhpc3RfNjRieXRlcyIsIDQsIDB4MDgsIH0sCisJeyAiaGlzdF82NV8xMjdieXRlcyIsIDQsIDB4MDksIH0sCisJeyAiaGlzdF8xMjhfMjU1Ynl0ZXMiLCA0LCAweDBhLCB9LAorCXsgImhpc3RfMjU2XzUxMWJ5dGVzIiwgNCwgMHgwYiwgfSwKKwl7ICJoaXN0XzUxMl8xMDIzYnl0ZXMiLCA0LCAweDBjLCB9LAorCXsgImhpc3RfMTAyNF9tYXhfYnl0ZXMiLCA0LCAweDBkLCB9LAorfTsKKworc3RhdGljIHZvaWQKK212ODhlNjEzMV9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQoreworCW12ODhlNnh4eF9nZXRfc3RyaW5ncyhkcywgQVJSQVlfU0laRShtdjg4ZTYxMzFfaHdfc3RhdHMpLAorCQkJICAgICAgbXY4OGU2MTMxX2h3X3N0YXRzLCBwb3J0LCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK212ODhlNjEzMV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCisJCQkJICBpbnQgcG9ydCwgdWludDY0X3QgKmRhdGEpCit7CisJbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKGRzLCBBUlJBWV9TSVpFKG12ODhlNjEzMV9od19zdGF0cyksCisJCQkJICAgIG12ODhlNjEzMV9od19zdGF0cywgcG9ydCwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2MTMxX2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShtdjg4ZTYxMzFfaHdfc3RhdHMpOworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyID0geworCS50YWdfcHJvdG9jb2wJCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9EU0EpLAorCS5wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSksCisJLnByb2JlCQkJPSBtdjg4ZTYxMzFfcHJvYmUsCisJLnNldHVwCQkJPSBtdjg4ZTYxMzFfc2V0dXAsCisJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkcl9kaXJlY3QsCisJLnBoeV9yZWFkCQk9IG12ODhlNjEzMV9waHlfcmVhZCwKKwkucGh5X3dyaXRlCQk9IG12ODhlNjEzMV9waHlfd3JpdGUsCisJLnBvbGxfbGluawkJPSBtdjg4ZTZ4eHhfcG9sbF9saW5rLAorCS5nZXRfc3RyaW5ncwkJPSBtdjg4ZTYxMzFfZ2V0X3N0cmluZ3MsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gbXY4OGU2MTMxX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3NldF9jb3VudAkJPSBtdjg4ZTYxMzFfZ2V0X3NzZXRfY291bnQsCit9OworCitpbnQgX19pbml0IG12ODhlNjEzMV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MTMxX3N3aXRjaF9kcml2ZXIpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQobXY4OGU2MTMxX2luaXQpOworCit2b2lkIF9fZXhpdCBtdjg4ZTYxMzFfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MTMxX3N3aXRjaF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXY4OGU2MTMxX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9tdjg4ZTZ4eHguYyBiL25ldC9kc2EvbXY4OGU2eHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2YzYwOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kc2EvbXY4OGU2eHh4LmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBuZXQvZHNhL212ODhlNnh4eC5jIC0gTWFydmVsbCA4OGU2eHh4IHN3aXRjaCBjaGlwIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSAiZHNhX3ByaXYuaCIKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKworLyoKKyAqIElmIHRoZSBzd2l0Y2gncyBBRERSWzQ6MF0gc3RyYXAgcGlucyBhcmUgc3RyYXBwZWQgdG8gemVybywgaXQgd2lsbAorICogdXNlIGFsbCAzMiBTTUkgYnVzIGFkZHJlc3NlcyBvbiBpdHMgU01JIGJ1cywgYW5kIGFsbCBzd2l0Y2ggcmVnaXN0ZXJzCisgKiB3aWxsIGJlIGRpcmVjdGx5IGFjY2Vzc2libGUgb24gc29tZSB7ZGV2aWNlIGFkZHJlc3MscmVnaXN0ZXIgYWRkcmVzc30KKyAqIHBhaXIuICBJZiB0aGUgQUREUls0OjBdIHBpbnMgYXJlIG5vdCBzdHJhcHBlZCB0byB6ZXJvLCB0aGUgc3dpdGNoCisgKiB3aWxsIG9ubHkgcmVzcG9uZCB0byBTTUkgdHJhbnNhY3Rpb25zIHRvIHRoYXQgc3BlY2lmaWMgYWRkcmVzcywgYW5kCisgKiBhbiBpbmRpcmVjdCBhZGRyZXNzaW5nIG1lY2hhbmlzbSBuZWVkcyB0byBiZSB1c2VkIHRvIGFjY2VzcyBpdHMKKyAqIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCBtdjg4ZTZ4eHhfcmVnX3dhaXRfcmVhZHkoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXJldCA9IG1kaW9idXNfcmVhZChidXMsIHN3X2FkZHIsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKChyZXQgJiAweDgwMDApID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworaW50IF9fbXY4OGU2eHh4X3JlZ19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBzd19hZGRyLCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlpbnQgcmV0OworCisJaWYgKHN3X2FkZHIgPT0gMCkKKwkJcmV0dXJuIG1kaW9idXNfcmVhZChidXMsIGFkZHIsIHJlZyk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBidXMgdG8gYmVjb21lIGZyZWUuCisJICovCisJcmV0ID0gbXY4OGU2eHh4X3JlZ193YWl0X3JlYWR5KGJ1cywgc3dfYWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRyYW5zbWl0IHRoZSByZWFkIGNvbW1hbmQuCisJICovCisJcmV0ID0gbWRpb2J1c193cml0ZShidXMsIHN3X2FkZHIsIDAsIDB4OTgwMCB8IChhZGRyIDw8IDUpIHwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHJlYWQgY29tbWFuZCB0byBjb21wbGV0ZS4KKwkgKi8KKwlyZXQgPSBtdjg4ZTZ4eHhfcmVnX3dhaXRfcmVhZHkoYnVzLCBzd19hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogUmVhZCB0aGUgZGF0YS4KKwkgKi8KKwlyZXQgPSBtZGlvYnVzX3JlYWQoYnVzLCBzd19hZGRyLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQgJiAweGZmZmY7Cit9CisKK2ludCBtdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisJcmV0ID0gX19tdjg4ZTZ4eHhfcmVnX3JlYWQoZHMtPm1hc3Rlcl9taWlfYnVzLAorCQkJCSAgIGRzLT5wZC0+c3dfYWRkciwgYWRkciwgcmVnKTsKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IF9fbXY4OGU2eHh4X3JlZ193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkciwgaW50IGFkZHIsCisJCQkgIGludCByZWcsIHUxNiB2YWwpCit7CisJaW50IHJldDsKKworCWlmIChzd19hZGRyID09IDApCisJCXJldHVybiBtZGlvYnVzX3dyaXRlKGJ1cywgYWRkciwgcmVnLCB2YWwpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgYnVzIHRvIGJlY29tZSBmcmVlLgorCSAqLworCXJldCA9IG12ODhlNnh4eF9yZWdfd2FpdF9yZWFkeShidXMsIHN3X2FkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUcmFuc21pdCB0aGUgZGF0YSB0byB3cml0ZS4KKwkgKi8KKwlyZXQgPSBtZGlvYnVzX3dyaXRlKGJ1cywgc3dfYWRkciwgMSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogVHJhbnNtaXQgdGhlIHdyaXRlIGNvbW1hbmQuCisJICovCisJcmV0ID0gbWRpb2J1c193cml0ZShidXMsIHN3X2FkZHIsIDAsIDB4OTQwMCB8IChhZGRyIDw8IDUpIHwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHdyaXRlIGNvbW1hbmQgdG8gY29tcGxldGUuCisJICovCisJcmV0ID0gbXY4OGU2eHh4X3JlZ193YWl0X3JlYWR5KGJ1cywgc3dfYWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG12ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisJcmV0ID0gX19tdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLT5tYXN0ZXJfbWlpX2J1cywKKwkJCQkgICAgZHMtPnBkLT5zd19hZGRyLCBhZGRyLCByZWcsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBtdjg4ZTZ4eHhfY29uZmlnX3ByaW8oc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCS8qCisJICogQ29uZmlndXJlIHRoZSBJUCBUb1MgbWFwcGluZyByZWdpc3RlcnMuCisJICovCisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTAsIDB4MDAwMCk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTEsIDB4MDAwMCk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTIsIDB4NTU1NSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTMsIDB4NTU1NSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTQsIDB4YWFhYSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTUsIDB4YWFhYSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTYsIDB4ZmZmZik7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTcsIDB4ZmZmZik7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgSUVFRSA4MDIuMXAgcHJpb3JpdHkgbWFwcGluZyByZWdpc3Rlci4KKwkgKi8KKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgxOCwgMHhmYTQxKTsKKworCXJldHVybiAwOworfQorCitpbnQgbXY4OGU2eHh4X3NldF9hZGRyX2RpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKQoreworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDAxLCAoYWRkclswXSA8PCA4KSB8IGFkZHJbMV0pOworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDAyLCAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDAzLCAoYWRkcls0XSA8PCA4KSB8IGFkZHJbNV0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtdjg4ZTZ4eHhfc2V0X2FkZHJfaW5kaXJlY3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpbnQgajsKKworCQkvKgorCQkgKiBXcml0ZSB0aGUgTUFDIGFkZHJlc3MgYnl0ZS4KKwkJICovCisJCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwZCwgMHg4MDAwIHwgKGkgPDwgOCkgfCBhZGRyW2ldKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuCisJCSAqLworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTDIsIDB4MGQpOworCQkJaWYgKChyZXQgJiAweDgwMDApID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gMTYpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG12ODhlNnh4eF9waHlfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKQoreworCWlmIChhZGRyID49IDApCisJCXJldHVybiBtdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIGFkZHIsIHJlZ251bSk7CisJcmV0dXJuIDB4ZmZmZjsKK30KKworaW50IG12ODhlNnh4eF9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlpZiAoYWRkciA+PSAwKQorCQlyZXR1cm4gbXY4OGU2eHh4X3JlZ193cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX05FRURfUFBVCitzdGF0aWMgaW50IG12ODhlNnh4eF9wcHVfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDQpOworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDA0LCByZXQgJiB+MHg0MDAwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkgICAgICAgIHJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOworCSAgICAgICAgbXNsZWVwKDEpOworCSAgICAgICAgaWYgKChyZXQgJiAweGMwMDApICE9IDB4YzAwMCkKKwkgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BwdV9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDA0KTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwNCwgcmV0IHwgMHg0MDAwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkgICAgICAgIHJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOworCSAgICAgICAgbXNsZWVwKDEpOworCSAgICAgICAgaWYgKChyZXQgJiAweGMwMDApID09IDB4YzAwMCkKKwkgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9wcHVfcmVlbmFibGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVnbHkpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwczsKKworCXBzID0gY29udGFpbmVyX29mKHVnbHksIHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSwgcHB1X3dvcmspOworCWlmIChtdXRleF90cnlsb2NrKCZwcy0+cHB1X211dGV4KSkgeworCSAgICAgICAgc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gKChzdHJ1Y3QgZHNhX3N3aXRjaCAqKXBzKSAtIDE7CisKKwkgICAgICAgIGlmIChtdjg4ZTZ4eHhfcHB1X2VuYWJsZShkcykgPT0gMCkKKwkgICAgICAgICAgICAgICAgcHMtPnBwdV9kaXNhYmxlZCA9IDA7CisJICAgICAgICBtdXRleF91bmxvY2soJnBzLT5wcHVfbXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BwdV9yZWVuYWJsZV90aW1lcih1bnNpZ25lZCBsb25nIF9wcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKilfcHM7CisKKwlzY2hlZHVsZV93b3JrKCZwcy0+cHB1X3dvcmspOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wcHVfYWNjZXNzX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9ICh2b2lkICopKGRzICsgMSk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnBzLT5wcHVfbXV0ZXgpOworCisJLyoKKwkgKiBJZiB0aGUgUEhZIHBvbGxpbmcgdW5pdCBpcyBlbmFibGVkLCBkaXNhYmxlIGl0IHNvIHRoYXQKKwkgKiB3ZSBjYW4gYWNjZXNzIHRoZSBQSFkgcmVnaXN0ZXJzLiAgSWYgaXQgd2FzIGFscmVhZHkKKwkgKiBkaXNhYmxlZCwgY2FuY2VsIHRoZSB0aW1lciB0aGF0IGlzIGdvaW5nIHRvIHJlLWVuYWJsZQorCSAqIGl0LgorCSAqLworCWlmICghcHMtPnBwdV9kaXNhYmxlZCkgeworCSAgICAgICAgcmV0ID0gbXY4OGU2eHh4X3BwdV9kaXNhYmxlKGRzKTsKKwkgICAgICAgIGlmIChyZXQgPCAwKSB7CisJICAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmcHMtPnBwdV9tdXRleCk7CisJICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisJICAgICAgICB9CisJICAgICAgICBwcy0+cHB1X2Rpc2FibGVkID0gMTsKKwl9IGVsc2UgeworCSAgICAgICAgZGVsX3RpbWVyKCZwcy0+cHB1X3RpbWVyKTsKKwkgICAgICAgIHJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BwdV9hY2Nlc3NfcHV0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKworCS8qCisJICogU2NoZWR1bGUgYSB0aW1lciB0byByZS1lbmFibGUgdGhlIFBIWSBwb2xsaW5nIHVuaXQuCisJICovCisJbW9kX3RpbWVyKCZwcy0+cHB1X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCkpOworCW11dGV4X3VubG9jaygmcHMtPnBwdV9tdXRleCk7Cit9CisKK3ZvaWQgbXY4OGU2eHh4X3BwdV9zdGF0ZV9pbml0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKworCW11dGV4X2luaXQoJnBzLT5wcHVfbXV0ZXgpOworCUlOSVRfV09SSygmcHMtPnBwdV93b3JrLCBtdjg4ZTZ4eHhfcHB1X3JlZW5hYmxlX3dvcmspOworCWluaXRfdGltZXIoJnBzLT5wcHVfdGltZXIpOworCXBzLT5wcHVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBzOworCXBzLT5wcHVfdGltZXIuZnVuY3Rpb24gPSBtdjg4ZTZ4eHhfcHB1X3JlZW5hYmxlX3RpbWVyOworfQorCitpbnQgbXY4OGU2eHh4X3BoeV9yZWFkX3BwdShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoZHMpOworCWlmIChyZXQgPj0gMCkgeworCSAgICAgICAgcmV0ID0gbXY4OGU2eHh4X3JlZ19yZWFkKGRzLCBhZGRyLCByZWdudW0pOworCSAgICAgICAgbXY4OGU2eHh4X3BwdV9hY2Nlc3NfcHV0KGRzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXY4OGU2eHh4X3BoeV93cml0ZV9wcHUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwKKwkJCSAgICBpbnQgcmVnbnVtLCB1MTYgdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoZHMpOworCWlmIChyZXQgPj0gMCkgeworCSAgICAgICAgcmV0ID0gbXY4OGU2eHh4X3JlZ193cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOworCSAgICAgICAgbXY4OGU2eHh4X3BwdV9hY2Nlc3NfcHV0KGRzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3ZvaWQgbXY4OGU2eHh4X3BvbGxfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFNBX01BWF9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCWludCBwb3J0X3N0YXR1czsKKwkJaW50IGxpbms7CisJCWludCBzcGVlZDsKKwkJaW50IGR1cGxleDsKKwkJaW50IGZjOworCisJCWRldiA9IGRzLT5wb3J0c1tpXTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJbGluayA9IDA7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQlwb3J0X3N0YXR1cyA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX1BPUlQoaSksIDB4MDApOworCQkJaWYgKHBvcnRfc3RhdHVzIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJbGluayA9ICEhKHBvcnRfc3RhdHVzICYgMHgwODAwKTsKKwkJfQorCisJCWlmICghbGluaykgeworCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChwb3J0X3N0YXR1cyAmIDB4MDMwMCkgeworCQljYXNlIDB4MDAwMDoKKwkJCXNwZWVkID0gMTA7CisJCQlicmVhazsKKwkJY2FzZSAweDAxMDA6CisJCQlzcGVlZCA9IDEwMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDIwMDoKKwkJCXNwZWVkID0gMTAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3BlZWQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWR1cGxleCA9IChwb3J0X3N0YXR1cyAmIDB4MDQwMCkgPyAxIDogMDsKKwkJZmMgPSAocG9ydF9zdGF0dXMgJiAweDgwMDApID8gMSA6IDA7CisKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlZCBNYi9zLCAlcyBkdXBsZXgsICIKKwkJCQkJICJmbG93IGNvbnRyb2wgJXNhYmxlZFxuIiwgZGV2LT5uYW1lLAorCQkJCQkgc3BlZWQsIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwKKwkJCQkJIGZjID8gImVuIiA6ICJkaXMiKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfc3RhdHNfd2FpdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwyLCAweDFkKTsKKwkJaWYgKChyZXQgJiAweDgwMDApID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfc3RhdHNfc25hcHNob3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBTbmFwc2hvdCB0aGUgaGFyZHdhcmUgc3RhdGlzdGljcyBjb3VudGVycyBmb3IgdGhpcyBwb3J0LgorCSAqLworCVJFR19XUklURShSRUdfR0xPQkFMLCAweDFkLCAweGRjMDAgfCBwb3J0KTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHNuYXBzaG90dGluZyB0byBjb21wbGV0ZS4KKwkgKi8KKwlyZXQgPSBtdjg4ZTZ4eHhfc3RhdHNfd2FpdChkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3N0YXRzX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgc3RhdCwgdTMyICp2YWwpCit7CisJdTMyIF92YWw7CisJaW50IHJldDsKKworCSp2YWwgPSAwOworCisJcmV0ID0gbXY4OGU2eHh4X3JlZ193cml0ZShkcywgUkVHX0dMT0JBTCwgMHgxZCwgMHhjYzAwIHwgc3RhdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKworCXJldCA9IG12ODhlNnh4eF9zdGF0c193YWl0KGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJcmV0ID0gbXY4OGU2eHh4X3JlZ19yZWFkKGRzLCBSRUdfR0xPQkFMLCAweDFlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJX3ZhbCA9IHJldCA8PCAxNjsKKworCXJldCA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX0dMT0JBTCwgMHgxZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKworCSp2YWwgPSBfdmFsIHwgcmV0OworfQorCit2b2lkIG12ODhlNnh4eF9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCisJCQkgICBpbnQgbnJfc3RhdHMsIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdHMsCisJCQkgICBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9zdGF0czsgaSsrKSB7CisJCW1lbWNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJICAgICAgIHN0YXRzW2ldLnN0cmluZywgRVRIX0dTVFJJTkdfTEVOKTsKKwl9Cit9CisKK3ZvaWQgbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCQkgaW50IG5yX3N0YXRzLCBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXRzLAorCQkJCSBpbnQgcG9ydCwgdWludDY0X3QgKmRhdGEpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9ICh2b2lkICopKGRzICsgMSk7CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnBzLT5zdGF0c19tdXRleCk7CisKKwlyZXQgPSBtdjg4ZTZ4eHhfc3RhdHNfc25hcHNob3QoZHMsIHBvcnQpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X3VubG9jaygmcHMtPnN0YXRzX211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmVhZCBlYWNoIG9mIHRoZSBjb3VudGVycy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfc3RhdHM7IGkrKykgeworCQlzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnMgPSBzdGF0cyArIGk7CisJCXUzMiBsb3c7CisJCXUzMiBoaWdoOworCisJCW12ODhlNnh4eF9zdGF0c19yZWFkKGRzLCBzLT5yZWcsICZsb3cpOworCQlpZiAocy0+c2l6ZW9mX3N0YXQgPT0gOCkKKwkJCW12ODhlNnh4eF9zdGF0c19yZWFkKGRzLCBzLT5yZWcgKyAxLCAmaGlnaCk7CisJCWVsc2UKKwkJCWhpZ2ggPSAwOworCisJCWRhdGFbaV0gPSAoKCh1NjQpaGlnaCkgPDwgMzIpIHwgbG93OworCX0KKworCW11dGV4X3VubG9jaygmcHMtPnN0YXRzX211dGV4KTsKK30KZGlmZiAtLWdpdCBhL25ldC9kc2EvbXY4OGU2eHh4LmggYi9uZXQvZHNhL212ODhlNnh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGUwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZHNhL212ODhlNnh4eC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBuZXQvZHNhL212ODhlNnh4eC5oIC0gTWFydmVsbCA4OGU2eHh4IHN3aXRjaCBjaGlwIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19NVjg4RTZYWFhfSAorI2RlZmluZSBfX01WODhFNlhYWF9ICisKKyNkZWZpbmUgUkVHX1BPUlQocCkJCSgweDEwICsgKHApKQorI2RlZmluZSBSRUdfR0xPQkFMCQkweDFiCisjZGVmaW5lIFJFR19HTE9CQUwyCQkweDFjCisKK3N0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSB7CisJLyoKKwkgKiBXaGVuIHVzaW5nIG11bHRpLWNoaXAgYWRkcmVzc2luZywgdGhpcyBtdXRleCBwcm90ZWN0cworCSAqIGFjY2VzcyB0byB0aGUgaW5kaXJlY3QgYWNjZXNzIHJlZ2lzdGVycy4gIChJbiBzaW5nbGUtY2hpcAorCSAqIG1vZGUsIHRoaXMgbXV0ZXggaXMgZWZmZWN0aXZlbHkgdXNlbGVzcy4pCisJICovCisJc3RydWN0IG11dGV4CXNtaV9tdXRleDsKKworI2lmZGVmIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVQorCS8qCisJICogSGFuZGxlcyBhdXRvbWF0aWMgZGlzYWJsaW5nIGFuZCByZS1lbmFibGluZyBvZiB0aGUgUEhZCisJICogcG9sbGluZyB1bml0LgorCSAqLworCXN0cnVjdCBtdXRleAkJcHB1X211dGV4OworCWludAkJCXBwdV9kaXNhYmxlZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHB1X3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QJcHB1X3RpbWVyOworI2VuZGlmCisKKwkvKgorCSAqIFRoaXMgbXV0ZXggc2VyaWFsaXNlcyBhY2Nlc3MgdG8gdGhlIHN0YXRpc3RpY3MgdW5pdC4KKwkgKiBIb2xkIHRoaXMgbXV0ZXggb3ZlciBzbmFwc2hvdCArIGR1bXAgc2VxdWVuY2VzLgorCSAqLworCXN0cnVjdCBtdXRleAlzdGF0c19tdXRleDsKK307CisKK3N0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCB7CisJY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc2l6ZW9mX3N0YXQ7CisJaW50IHJlZzsKK307CisKK2ludCBfX212ODhlNnh4eF9yZWdfcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkciwgaW50IGFkZHIsIGludCByZWcpOworaW50IG12ODhlNnh4eF9yZWdfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnKTsKK2ludCBfX212ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIsIGludCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnLCB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfcmVnX3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpOworaW50IG12ODhlNnh4eF9jb25maWdfcHJpbyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworaW50IG12ODhlNnh4eF9zZXRfYWRkcl9kaXJlY3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcik7CitpbnQgbXY4OGU2eHh4X3NldF9hZGRyX2luZGlyZWN0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdTggKmFkZHIpOworaW50IG12ODhlNnh4eF9waHlfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKTsKK2ludCBtdjg4ZTZ4eHhfcGh5X3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWdudW0sIHUxNiB2YWwpOwordm9pZCBtdjg4ZTZ4eHhfcHB1X3N0YXRlX2luaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKK2ludCBtdjg4ZTZ4eHhfcGh5X3JlYWRfcHB1KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWdudW0pOworaW50IG12ODhlNnh4eF9waHlfd3JpdGVfcHB1KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsCisJCQkgICAgaW50IHJlZ251bSwgdTE2IHZhbCk7Cit2b2lkIG12ODhlNnh4eF9wb2xsX2xpbmsoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKK3ZvaWQgbXY4OGU2eHh4X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCSAgIGludCBucl9zdGF0cywgc3RydWN0IG12ODhlNnh4eF9od19zdGF0ICpzdGF0cywKKwkJCSAgIGludCBwb3J0LCB1aW50OF90ICpkYXRhKTsKK3ZvaWQgbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCQkgaW50IG5yX3N0YXRzLCBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXRzLAorCQkJCSBpbnQgcG9ydCwgdWludDY0X3QgKmRhdGEpOworCisjZGVmaW5lIFJFR19SRUFEKGFkZHIsIHJlZykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJaW50IF9fcmV0OwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJX19yZXQgPSBtdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIGFkZHIsIHJlZyk7CQlcCisJCWlmIChfX3JldCA8IDApCQkJCQkJXAorCQkJcmV0dXJuIF9fcmV0OwkJCQkJXAorCQlfX3JldDsJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgUkVHX1dSSVRFKGFkZHIsIHJlZywgdmFsKQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCWludCBfX3JldDsJCQkJCQlcCisJCQkJCQkJCQlcCisJCV9fcmV0ID0gbXY4OGU2eHh4X3JlZ193cml0ZShkcywgYWRkciwgcmVnLCB2YWwpOwlcCisJCWlmIChfX3JldCA8IDApCQkJCQkJXAorCQkJcmV0dXJuIF9fcmV0OwkJCQkJXAorCX0pCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9kc2Evc2xhdmUuYyBiL25ldC9kc2Evc2xhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzYxNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS9zbGF2ZS5jCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogbmV0L2RzYS9zbGF2ZS5jIC0gU2xhdmUgZGV2aWNlIGhhbmRsaW5nCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgImRzYV9wcml2LmgiCisKKy8qIHNsYXZlIG1paV9idXMgaGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkc2Ffc2xhdmVfcGh5X3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsIGludCByZWcpCit7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gYnVzLT5wcml2OworCisJaWYgKGRzLT52YWxpZF9wb3J0X21hc2sgJiAoMSA8PCBhZGRyKSkKKwkJcmV0dXJuIGRzLT5kcnYtPnBoeV9yZWFkKGRzLCBhZGRyLCByZWcpOworCisJcmV0dXJuIDB4ZmZmZjsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfcGh5X3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGJ1cy0+cHJpdjsKKworCWlmIChkcy0+dmFsaWRfcG9ydF9tYXNrICYgKDEgPDwgYWRkcikpCisJCXJldHVybiBkcy0+ZHJ2LT5waHlfd3JpdGUoZHMsIGFkZHIsIHJlZywgdmFsKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGRzYV9zbGF2ZV9taWlfYnVzX2luaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCWRzLT5zbGF2ZV9taWlfYnVzLT5wcml2ID0gKHZvaWQgKilkczsKKwlkcy0+c2xhdmVfbWlpX2J1cy0+bmFtZSA9ICJkc2Egc2xhdmUgc21pIjsKKwlkcy0+c2xhdmVfbWlpX2J1cy0+cmVhZCA9IGRzYV9zbGF2ZV9waHlfcmVhZDsKKwlkcy0+c2xhdmVfbWlpX2J1cy0+d3JpdGUgPSBkc2Ffc2xhdmVfcGh5X3dyaXRlOworCXNucHJpbnRmKGRzLT5zbGF2ZV9taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXM6JS4yeCIsCisJCQlkcy0+bWFzdGVyX21paV9idXMtPmlkLCBkcy0+cGQtPnN3X2FkZHIpOworCWRzLT5zbGF2ZV9taWlfYnVzLT5wYXJlbnQgPSAmKGRzLT5tYXN0ZXJfbWlpX2J1cy0+ZGV2KTsKK30KKworCisvKiBzbGF2ZSBkZXZpY2UgaGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZHNhX3NsYXZlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNhX3NsYXZlX2NoYW5nZV9yeF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbmdlKQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciA9IHAtPnBhcmVudC0+bWFzdGVyX25ldGRldjsKKworCWlmIChjaGFuZ2UgJiBJRkZfQUxMTVVMVEkpCisJCWRldl9zZXRfYWxsbXVsdGkobWFzdGVyLCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gMSA6IC0xKTsKKwlpZiAoY2hhbmdlICYgSUZGX1BST01JU0MpCisJCWRldl9zZXRfcHJvbWlzY3VpdHkobWFzdGVyLCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAxIDogLTEpOworfQorCitzdGF0aWMgdm9pZCBkc2Ffc2xhdmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIgPSBwLT5wYXJlbnQtPm1hc3Rlcl9uZXRkZXY7CisKKwlkZXZfbWNfc3luYyhtYXN0ZXIsIGRldik7CisJZGV2X3VuaWNhc3Rfc3luYyhtYXN0ZXIsIGRldik7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyICsgMiwgNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paV9kYXRhID0gaWZfbWlpKGlmcik7CisKKwlpZiAocC0+cGh5ICE9IE5VTEwpCisJCXJldHVybiBwaHlfbWlpX2lvY3RsKHAtPnBoeSwgbWlpX2RhdGEsIGNtZCk7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworLyogZXRodG9vbCBvcGVyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Citkc2Ffc2xhdmVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChwLT5waHkgIT0gTlVMTCkgeworCQllcnIgPSBwaHlfcmVhZF9zdGF0dXMocC0+cGh5KTsKKwkJaWYgKGVyciA9PSAwKQorCQkJZXJyID0gcGh5X2V0aHRvb2xfZ3NldChwLT5waHksIGNtZCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorZHNhX3NsYXZlX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHAtPnBoeSAhPSBOVUxMKQorCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwLT5waHksIGNtZCk7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIGRzYV9zbGF2ZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgImRzYSIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGRzYV9kcml2ZXJfdmVyc2lvbiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCAicGxhdGZvcm0iLCAzMik7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHAtPnBoeSAhPSBOVUxMKQorCQlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwLT5waHkpOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgdTMyIGRzYV9zbGF2ZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocC0+cGh5ICE9IE5VTEwpIHsKKwkJZ2VucGh5X3VwZGF0ZV9saW5rKHAtPnBoeSk7CisJCXJldHVybiBwLT5waHktPmxpbms7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgdm9pZCBkc2Ffc2xhdmVfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHVpbnQzMl90IHN0cmluZ3NldCwgdWludDhfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKSB7CisJCWludCBsZW4gPSBFVEhfR1NUUklOR19MRU47CisKKwkJc3RybmNweShkYXRhLCAidHhfcGFja2V0cyIsIGxlbik7CisJCXN0cm5jcHkoZGF0YSArIGxlbiwgInR4X2J5dGVzIiwgbGVuKTsKKwkJc3RybmNweShkYXRhICsgMiAqIGxlbiwgInJ4X3BhY2tldHMiLCBsZW4pOworCQlzdHJuY3B5KGRhdGEgKyAzICogbGVuLCAicnhfYnl0ZXMiLCBsZW4pOworCQlpZiAoZHMtPmRydi0+Z2V0X3N0cmluZ3MgIT0gTlVMTCkKKwkJCWRzLT5kcnYtPmdldF9zdHJpbmdzKGRzLCBwLT5wb3J0LCBkYXRhICsgNCAqIGxlbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBkc2Ffc2xhdmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLAorCQkJCQl1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWRhdGFbMF0gPSBwLT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJZGF0YVsxXSA9IHAtPmRldi0+c3RhdHMudHhfYnl0ZXM7CisJZGF0YVsyXSA9IHAtPmRldi0+c3RhdHMucnhfcGFja2V0czsKKwlkYXRhWzNdID0gcC0+ZGV2LT5zdGF0cy5yeF9ieXRlczsKKwlpZiAoZHMtPmRydi0+Z2V0X2V0aHRvb2xfc3RhdHMgIT0gTlVMTCkKKwkJZHMtPmRydi0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIHAtPnBvcnQsIGRhdGEgKyA0KTsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlpZiAoc3NldCA9PSBFVEhfU1NfU1RBVFMpIHsKKwkJaW50IGNvdW50OworCisJCWNvdW50ID0gNDsKKwkJaWYgKGRzLT5kcnYtPmdldF9zc2V0X2NvdW50ICE9IE5VTEwpCisJCQljb3VudCArPSBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudChkcyk7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBkc2Ffc2xhdmVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBkc2Ffc2xhdmVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gZHNhX3NsYXZlX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gZHNhX3NsYXZlX2dldF9kcnZpbmZvLAorCS5ud2F5X3Jlc2V0CQk9IGRzYV9zbGF2ZV9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBkc2Ffc2xhdmVfZ2V0X2xpbmssCisJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF9zdHJpbmdzCQk9IGRzYV9zbGF2ZV9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBkc2Ffc2xhdmVfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9zc2V0X2NvdW50CQk9IGRzYV9zbGF2ZV9nZXRfc3NldF9jb3VudCwKK307CisKKworLyogc2xhdmUgZGV2aWNlIHNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmV0X2RldmljZSAqCitkc2Ffc2xhdmVfY3JlYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkgaW50IHBvcnQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciA9IGRzLT5tYXN0ZXJfbmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXY7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwOworCWludCByZXQ7CisKKwlzbGF2ZV9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBkc2Ffc2xhdmVfcHJpdiksCisJCQkJIG5hbWUsIGV0aGVyX3NldHVwKTsKKwlpZiAoc2xhdmVfZGV2ID09IE5VTEwpCisJCXJldHVybiBzbGF2ZV9kZXY7CisKKwlzbGF2ZV9kZXYtPmZlYXR1cmVzID0gbWFzdGVyLT52bGFuX2ZlYXR1cmVzOworCVNFVF9FVEhUT09MX09QUyhzbGF2ZV9kZXYsICZkc2Ffc2xhdmVfZXRodG9vbF9vcHMpOworCW1lbWNweShzbGF2ZV9kZXYtPmRldl9hZGRyLCBtYXN0ZXItPmRldl9hZGRyLCBFVEhfQUxFTik7CisJc2xhdmVfZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCXN3aXRjaCAoZHMtPnRhZ19wcm90b2NvbCkgeworI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19EU0EKKwljYXNlIGh0b25zKEVUSF9QX0RTQSk6CisJCXNsYXZlX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gZHNhX3htaXQ7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0VEU0EKKwljYXNlIGh0b25zKEVUSF9QX0VEU0EpOgorCQlzbGF2ZV9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGVkc2FfeG1pdDsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUgorCWNhc2UgaHRvbnMoRVRIX1BfVFJBSUxFUik6CisJCXNsYXZlX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gdHJhaWxlcl94bWl0OworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlzbGF2ZV9kZXYtPm9wZW4gPSBkc2Ffc2xhdmVfb3BlbjsKKwlzbGF2ZV9kZXYtPnN0b3AgPSBkc2Ffc2xhdmVfY2xvc2U7CisJc2xhdmVfZGV2LT5jaGFuZ2VfcnhfZmxhZ3MgPSBkc2Ffc2xhdmVfY2hhbmdlX3J4X2ZsYWdzOworCXNsYXZlX2Rldi0+c2V0X3J4X21vZGUgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGU7CisJc2xhdmVfZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGU7CisJc2xhdmVfZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBkc2Ffc2xhdmVfc2V0X21hY19hZGRyZXNzOworCXNsYXZlX2Rldi0+ZG9faW9jdGwgPSBkc2Ffc2xhdmVfaW9jdGw7CisJU0VUX05FVERFVl9ERVYoc2xhdmVfZGV2LCBwYXJlbnQpOworCXNsYXZlX2Rldi0+dmxhbl9mZWF0dXJlcyA9IG1hc3Rlci0+dmxhbl9mZWF0dXJlczsKKworCXAgPSBuZXRkZXZfcHJpdihzbGF2ZV9kZXYpOworCXAtPmRldiA9IHNsYXZlX2RldjsKKwlwLT5wYXJlbnQgPSBkczsKKwlwLT5wb3J0ID0gcG9ydDsKKwlwLT5waHkgPSBkcy0+c2xhdmVfbWlpX2J1cy0+cGh5X21hcFtwb3J0XTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihzbGF2ZV9kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgaW50ZXJmYWNlICVzXG4iLAorCQkJCW1hc3Rlci0+bmFtZSwgcmV0LCBzbGF2ZV9kZXYtPm5hbWUpOworCQlmcmVlX25ldGRldihzbGF2ZV9kZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwluZXRpZl9jYXJyaWVyX29mZihzbGF2ZV9kZXYpOworCisJaWYgKHAtPnBoeSAhPSBOVUxMKSB7CisJCXBoeV9hdHRhY2goc2xhdmVfZGV2LCBwLT5waHktPmRldi5idXNfaWQsCisJCQkgICAwLCBQSFlfSU5URVJGQUNFX01PREVfR01JSSk7CisKKwkJcC0+cGh5LT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCXAtPnBoeS0+c3BlZWQgPSAwOworCQlwLT5waHktPmR1cGxleCA9IDA7CisJCXAtPnBoeS0+YWR2ZXJ0aXNpbmcgPSBwLT5waHktPnN1cHBvcnRlZCB8IEFEVkVSVElTRURfQXV0b25lZzsKKwkJcGh5X3N0YXJ0X2FuZWcocC0+cGh5KTsKKwl9CisKKwlyZXR1cm4gc2xhdmVfZGV2OworfQpkaWZmIC0tZ2l0IGEvbmV0L2RzYS90YWdfZHNhLmMgYi9uZXQvZHNhL3RhZ19kc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMwNTEwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS90YWdfZHNhLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBuZXQvZHNhL3RhZ19kc2EuYyAtIChOb24tZXRoZXJ0eXBlKSBEU0EgdGFnZ2luZworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImRzYV9wcml2LmgiCisKKyNkZWZpbmUgRFNBX0hMRU4JNAorCitpbnQgZHNhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4ICpkc2FfaGVhZGVyOworCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qCisJICogQ29udmVydCB0aGUgb3V0ZXJtb3N0IDgwMi4xcSB0YWcgdG8gYSBEU0EgdGFnIGZvciB0YWdnZWQKKwkgKiBwYWNrZXRzLCBvciBpbnNlcnQgYSBEU0EgdGFnIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBhbmQKKwkgKiB0aGUgZXRoZXJ0eXBlIGZpZWxkIGZvciB1bnRhZ2dlZCBwYWNrZXRzLgorCSAqLworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgMCkgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKworCQkvKgorCQkgKiBDb25zdHJ1Y3QgdGFnZ2VkIEZST01fQ1BVIERTQSB0YWcgZnJvbSA4MDIuMXEgdGFnLgorCQkgKi8KKwkJZHNhX2hlYWRlciA9IHNrYi0+ZGF0YSArIDIgKiBFVEhfQUxFTjsKKwkJZHNhX2hlYWRlclswXSA9IDB4NjA7CisJCWRzYV9oZWFkZXJbMV0gPSBwLT5wb3J0IDw8IDM7CisKKwkJLyoKKwkJICogTW92ZSBDRkkgZmllbGQgZnJvbSBieXRlIDIgdG8gYnl0ZSAxLgorCQkgKi8KKwkJaWYgKGRzYV9oZWFkZXJbMl0gJiAweDEwKSB7CisJCQlkc2FfaGVhZGVyWzFdIHw9IDB4MDE7CisJCQlkc2FfaGVhZGVyWzJdICY9IH4weDEwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNrYl9jb3dfaGVhZChza2IsIERTQV9ITEVOKSA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCQlza2JfcHVzaChza2IsIERTQV9ITEVOKTsKKworCQltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgRFNBX0hMRU4sIDIgKiBFVEhfQUxFTik7CisKKwkJLyoKKwkJICogQ29uc3RydWN0IHVudGFnZ2VkIEZST01fQ1BVIERTQSB0YWcuCisJCSAqLworCQlkc2FfaGVhZGVyID0gc2tiLT5kYXRhICsgMiAqIEVUSF9BTEVOOworCQlkc2FfaGVhZGVyWzBdID0gMHg0MDsKKwkJZHNhX2hlYWRlclsxXSA9IHAtPnBvcnQgPDwgMzsKKwkJZHNhX2hlYWRlclsyXSA9IDB4MDA7CisJCWRzYV9oZWFkZXJbM10gPSAweDAwOworCX0KKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9EU0EpOworCisJc2tiLT5kZXYgPSBwLT5wYXJlbnQtPm1hc3Rlcl9uZXRkZXY7CisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7CisKK291dF9mcmVlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCit7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZGV2LT5kc2FfcHRyOworCXU4ICpkc2FfaGVhZGVyOworCWludCBzb3VyY2VfcG9ydDsKKworCWlmICh1bmxpa2VseShkcyA9PSBOVUxMKSkKKwkJZ290byBvdXRfZHJvcDsKKworCXNrYiA9IHNrYl91bnNoYXJlKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIERTQV9ITEVOKSkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKgorCSAqIFRoZSBldGhlcnR5cGUgZmllbGQgaXMgcGFydCBvZiB0aGUgRFNBIGhlYWRlci4KKwkgKi8KKwlkc2FfaGVhZGVyID0gc2tiLT5kYXRhIC0gMjsKKworCS8qCisJICogQ2hlY2sgdGhhdCBmcmFtZSB0eXBlIGlzIGVpdGhlciBUT19DUFUgb3IgRk9SV0FSRCwgYW5kCisJICogdGhhdCB0aGUgc291cmNlIGRldmljZSBpcyB6ZXJvLgorCSAqLworCWlmICgoZHNhX2hlYWRlclswXSAmIDB4ZGYpICE9IDB4MDAgJiYgKGRzYV9oZWFkZXJbMF0gJiAweGRmKSAhPSAweGMwKQorCQlnb3RvIG91dF9kcm9wOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBzb3VyY2UgcG9ydCBpcyBhIHJlZ2lzdGVyZWQgRFNBIHBvcnQuCisJICovCisJc291cmNlX3BvcnQgPSAoZHNhX2hlYWRlclsxXSA+PiAzKSAmIDB4MWY7CisJaWYgKHNvdXJjZV9wb3J0ID49IERTQV9NQVhfUE9SVFMgfHwgZHMtPnBvcnRzW3NvdXJjZV9wb3J0XSA9PSBOVUxMKQorCQlnb3RvIG91dF9kcm9wOworCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBEU0EgaGVhZGVyIHRvIGFuIDgwMi4xcSBoZWFkZXIgaWYgdGhlICd0YWdnZWQnCisJICogYml0IGluIHRoZSBEU0EgaGVhZGVyIGlzIHNldC4gIElmIHRoZSAndGFnZ2VkJyBiaXQgaXMgY2xlYXIsCisJICogZGVsZXRlIHRoZSBEU0EgaGVhZGVyIGVudGlyZWx5LgorCSAqLworCWlmIChkc2FfaGVhZGVyWzBdICYgMHgyMCkgeworCQl1OCBuZXdfaGVhZGVyWzRdOworCisJCS8qCisJCSAqIEluc2VydCA4MDIuMXEgZXRoZXJ0eXBlIGFuZCBjb3B5IHRoZSBWTEFOLXJlbGF0ZWQKKwkJICogZmllbGRzLCBidXQgY2xlYXIgdGhlIGJpdCB0aGF0IHdpbGwgaG9sZCBDRkkgKHNpbmNlCisJCSAqIERTQSB1c2VzIHRoYXQgYml0IGxvY2F0aW9uIGZvciBhbm90aGVyIHB1cnBvc2UpLgorCQkgKi8KKwkJbmV3X2hlYWRlclswXSA9IChFVEhfUF84MDIxUSA+PiA4KSAmIDB4ZmY7CisJCW5ld19oZWFkZXJbMV0gPSBFVEhfUF84MDIxUSAmIDB4ZmY7CisJCW5ld19oZWFkZXJbMl0gPSBkc2FfaGVhZGVyWzJdICYgfjB4MTA7CisJCW5ld19oZWFkZXJbM10gPSBkc2FfaGVhZGVyWzNdOworCisJCS8qCisJCSAqIE1vdmUgQ0ZJIGJpdCBmcm9tIGl0cyBwbGFjZSBpbiB0aGUgRFNBIGhlYWRlciB0bworCQkgKiBpdHMgODAyLjFxLWRlc2lnbmF0ZWQgcGxhY2UuCisJCSAqLworCQlpZiAoZHNhX2hlYWRlclsxXSAmIDB4MDEpCisJCQluZXdfaGVhZGVyWzJdIHw9IDB4MTA7CisKKwkJLyoKKwkJICogVXBkYXRlIHBhY2tldCBjaGVja3N1bSBpZiBza2IgaXMgQ0hFQ0tTVU1fQ09NUExFVEUuCisJCSAqLworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKKwkJCV9fd3N1bSBjID0gc2tiLT5jc3VtOworCQkJYyA9IGNzdW1fYWRkKGMsIGNzdW1fcGFydGlhbChuZXdfaGVhZGVyICsgMiwgMiwgMCkpOworCQkJYyA9IGNzdW1fc3ViKGMsIGNzdW1fcGFydGlhbChkc2FfaGVhZGVyICsgMiwgMiwgMCkpOworCQkJc2tiLT5jc3VtID0gYzsKKwkJfQorCisJCW1lbWNweShkc2FfaGVhZGVyLCBuZXdfaGVhZGVyLCBEU0FfSExFTik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVtb3ZlIERTQSB0YWcgYW5kIHVwZGF0ZSBjaGVja3N1bS4KKwkJICovCisJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgRFNBX0hMRU4pOworCQltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLAorCQkJc2tiLT5kYXRhIC0gRVRIX0hMRU4gLSBEU0FfSExFTiwKKwkJCTIgKiBFVEhfQUxFTik7CisJfQorCisJc2tiLT5kZXYgPSBkcy0+cG9ydHNbc291cmNlX3BvcnRdOworCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXNrYi0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKKworb3V0X2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgZHNhX3BhY2tldF90eXBlID0geworCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9EU0EpLAorCS5mdW5jCT0gZHNhX3JjdiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzYV9pbml0X21vZHVsZSh2b2lkKQoreworCWRldl9hZGRfcGFjaygmZHNhX3BhY2tldF90eXBlKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGRzYV9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc2FfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJmRzYV9wYWNrZXRfdHlwZSk7Cit9Cittb2R1bGVfZXhpdChkc2FfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS90YWdfZWRzYS5jIGIvbmV0L2RzYS90YWdfZWRzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODVlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZHNhL3RhZ19lZHNhLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBuZXQvZHNhL3RhZ19lZHNhLmMgLSBFdGhlcnR5cGUgRFNBIHRhZ2dpbmcKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJkc2FfcHJpdi5oIgorCisjZGVmaW5lIERTQV9ITEVOCTQKKyNkZWZpbmUgRURTQV9ITEVOCTgKKworaW50IGVkc2FfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJdTggKmVkc2FfaGVhZGVyOworCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qCisJICogQ29udmVydCB0aGUgb3V0ZXJtb3N0IDgwMi4xcSB0YWcgdG8gYSBEU0EgdGFnIGFuZCBwcmVwZW5kCisJICogYSBEU0EgZXRoZXJ0eXBlIGZpZWxkIGlzIHRoZSBwYWNrZXQgaXMgdGFnZ2VkLCBvciBpbnNlcnQKKwkgKiBhIERTQSBldGhlcnR5cGUgcGx1cyBEU0EgdGFnIGJldHdlZW4gdGhlIGFkZHJlc3NlcyBhbmQgdGhlCisJICogY3VycmVudCBldGhlcnR5cGUgZmllbGQgaWYgdGhlIHBhY2tldCBpcyB1bnRhZ2dlZC4KKwkgKi8KKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJaWYgKHNrYl9jb3dfaGVhZChza2IsIERTQV9ITEVOKSA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCQlza2JfcHVzaChza2IsIERTQV9ITEVOKTsKKworCQltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgRFNBX0hMRU4sIDIgKiBFVEhfQUxFTik7CisKKwkJLyoKKwkJICogQ29uc3RydWN0IHRhZ2dlZCBGUk9NX0NQVSBEU0EgdGFnIGZyb20gODAyLjFxIHRhZy4KKwkJICovCisJCWVkc2FfaGVhZGVyID0gc2tiLT5kYXRhICsgMiAqIEVUSF9BTEVOOworCQllZHNhX2hlYWRlclswXSA9IChFVEhfUF9FRFNBID4+IDgpICYgMHhmZjsKKwkJZWRzYV9oZWFkZXJbMV0gPSBFVEhfUF9FRFNBICYgMHhmZjsKKwkJZWRzYV9oZWFkZXJbMl0gPSAweDAwOworCQllZHNhX2hlYWRlclszXSA9IDB4MDA7CisJCWVkc2FfaGVhZGVyWzRdID0gMHg2MDsKKwkJZWRzYV9oZWFkZXJbNV0gPSBwLT5wb3J0IDw8IDM7CisKKwkJLyoKKwkJICogTW92ZSBDRkkgZmllbGQgZnJvbSBieXRlIDYgdG8gYnl0ZSA1LgorCQkgKi8KKwkJaWYgKGVkc2FfaGVhZGVyWzZdICYgMHgxMCkgeworCQkJZWRzYV9oZWFkZXJbNV0gfD0gMHgwMTsKKwkJCWVkc2FfaGVhZGVyWzZdICY9IH4weDEwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHNrYl9jb3dfaGVhZChza2IsIEVEU0FfSExFTikgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwkJc2tiX3B1c2goc2tiLCBFRFNBX0hMRU4pOworCisJCW1lbW1vdmUoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBFRFNBX0hMRU4sIDIgKiBFVEhfQUxFTik7CisKKwkJLyoKKwkJICogQ29uc3RydWN0IHVudGFnZ2VkIEZST01fQ1BVIERTQSB0YWcuCisJCSAqLworCQllZHNhX2hlYWRlciA9IHNrYi0+ZGF0YSArIDIgKiBFVEhfQUxFTjsKKwkJZWRzYV9oZWFkZXJbMF0gPSAoRVRIX1BfRURTQSA+PiA4KSAmIDB4ZmY7CisJCWVkc2FfaGVhZGVyWzFdID0gRVRIX1BfRURTQSAmIDB4ZmY7CisJCWVkc2FfaGVhZGVyWzJdID0gMHgwMDsKKwkJZWRzYV9oZWFkZXJbM10gPSAweDAwOworCQllZHNhX2hlYWRlcls0XSA9IDB4NDA7CisJCWVkc2FfaGVhZGVyWzVdID0gcC0+cG9ydCA8PCAzOworCQllZHNhX2hlYWRlcls2XSA9IDB4MDA7CisJCWVkc2FfaGVhZGVyWzddID0gMHgwMDsKKwl9CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRURTQSk7CisKKwlza2ItPmRldiA9IHAtPnBhcmVudC0+bWFzdGVyX25ldGRldjsKKwlkZXZfcXVldWVfeG1pdChza2IpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworb3V0X2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIGludCBlZHNhX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldi0+ZHNhX3B0cjsKKwl1OCAqZWRzYV9oZWFkZXI7CisJaW50IHNvdXJjZV9wb3J0OworCisJaWYgKHVubGlrZWx5KGRzID09IE5VTEwpKQorCQlnb3RvIG91dF9kcm9wOworCisJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgRURTQV9ITEVOKSkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKgorCSAqIFNraXAgdGhlIHR3byBudWxsIGJ5dGVzIGFmdGVyIHRoZSBldGhlcnR5cGUuCisJICovCisJZWRzYV9oZWFkZXIgPSBza2ItPmRhdGEgKyAyOworCisJLyoKKwkgKiBDaGVjayB0aGF0IGZyYW1lIHR5cGUgaXMgZWl0aGVyIFRPX0NQVSBvciBGT1JXQVJELCBhbmQKKwkgKiB0aGF0IHRoZSBzb3VyY2UgZGV2aWNlIGlzIHplcm8uCisJICovCisJaWYgKChlZHNhX2hlYWRlclswXSAmIDB4ZGYpICE9IDB4MDAgJiYgKGVkc2FfaGVhZGVyWzBdICYgMHhkZikgIT0gMHhjMCkKKwkJZ290byBvdXRfZHJvcDsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgc291cmNlIHBvcnQgaXMgYSByZWdpc3RlcmVkIERTQSBwb3J0LgorCSAqLworCXNvdXJjZV9wb3J0ID0gKGVkc2FfaGVhZGVyWzFdID4+IDMpICYgMHgxZjsKKwlpZiAoc291cmNlX3BvcnQgPj0gRFNBX01BWF9QT1JUUyB8fCBkcy0+cG9ydHNbc291cmNlX3BvcnRdID09IE5VTEwpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKgorCSAqIElmIHRoZSAndGFnZ2VkJyBiaXQgaXMgc2V0LCBjb252ZXJ0IHRoZSBEU0EgdGFnIHRvIGEgODAyLjFxCisJICogdGFnIGFuZCBkZWxldGUgdGhlIGV0aGVydHlwZSBwYXJ0LiAgSWYgdGhlICd0YWdnZWQnIGJpdCBpcworCSAqIGNsZWFyLCBkZWxldGUgdGhlIGV0aGVydHlwZSBhbmQgdGhlIERTQSB0YWcgcGFydHMuCisJICovCisJaWYgKGVkc2FfaGVhZGVyWzBdICYgMHgyMCkgeworCQl1OCBuZXdfaGVhZGVyWzRdOworCisJCS8qCisJCSAqIEluc2VydCA4MDIuMXEgZXRoZXJ0eXBlIGFuZCBjb3B5IHRoZSBWTEFOLXJlbGF0ZWQKKwkJICogZmllbGRzLCBidXQgY2xlYXIgdGhlIGJpdCB0aGF0IHdpbGwgaG9sZCBDRkkgKHNpbmNlCisJCSAqIERTQSB1c2VzIHRoYXQgYml0IGxvY2F0aW9uIGZvciBhbm90aGVyIHB1cnBvc2UpLgorCQkgKi8KKwkJbmV3X2hlYWRlclswXSA9IChFVEhfUF84MDIxUSA+PiA4KSAmIDB4ZmY7CisJCW5ld19oZWFkZXJbMV0gPSBFVEhfUF84MDIxUSAmIDB4ZmY7CisJCW5ld19oZWFkZXJbMl0gPSBlZHNhX2hlYWRlclsyXSAmIH4weDEwOworCQluZXdfaGVhZGVyWzNdID0gZWRzYV9oZWFkZXJbM107CisKKwkJLyoKKwkJICogTW92ZSBDRkkgYml0IGZyb20gaXRzIHBsYWNlIGluIHRoZSBEU0EgaGVhZGVyIHRvCisJCSAqIGl0cyA4MDIuMXEtZGVzaWduYXRlZCBwbGFjZS4KKwkJICovCisJCWlmIChlZHNhX2hlYWRlclsxXSAmIDB4MDEpCisJCQluZXdfaGVhZGVyWzJdIHw9IDB4MTA7CisKKwkJc2tiX3B1bGxfcmNzdW0oc2tiLCBEU0FfSExFTik7CisKKwkJLyoKKwkJICogVXBkYXRlIHBhY2tldCBjaGVja3N1bSBpZiBza2IgaXMgQ0hFQ0tTVU1fQ09NUExFVEUuCisJCSAqLworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKKwkJCV9fd3N1bSBjID0gc2tiLT5jc3VtOworCQkJYyA9IGNzdW1fYWRkKGMsIGNzdW1fcGFydGlhbChuZXdfaGVhZGVyICsgMiwgMiwgMCkpOworCQkJYyA9IGNzdW1fc3ViKGMsIGNzdW1fcGFydGlhbChlZHNhX2hlYWRlciArIDIsIDIsIDApKTsKKwkJCXNrYi0+Y3N1bSA9IGM7CisJCX0KKworCQltZW1jcHkoZWRzYV9oZWFkZXIsIG5ld19oZWFkZXIsIERTQV9ITEVOKTsKKworCQltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLAorCQkJc2tiLT5kYXRhIC0gRVRIX0hMRU4gLSBEU0FfSExFTiwKKwkJCTIgKiBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVtb3ZlIERTQSB0YWcgYW5kIHVwZGF0ZSBjaGVja3N1bS4KKwkJICovCisJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgRURTQV9ITEVOKTsKKwkJbWVtbW92ZShza2ItPmRhdGEgLSBFVEhfSExFTiwKKwkJCXNrYi0+ZGF0YSAtIEVUSF9ITEVOIC0gRURTQV9ITEVOLAorCQkJMiAqIEVUSF9BTEVOKTsKKwl9CisKKwlza2ItPmRldiA9IGRzLT5wb3J0c1tzb3VyY2VfcG9ydF07CisJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBlZHNhX3BhY2tldF90eXBlID0geworCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9FRFNBKSwKKwkuZnVuYwk9IGVkc2FfcmN2LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWRzYV9pbml0X21vZHVsZSh2b2lkKQoreworCWRldl9hZGRfcGFjaygmZWRzYV9wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChlZHNhX2luaXRfbW9kdWxlKTsKKworc3RhdGljIHZvaWQgX19leGl0IGVkc2FfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJmVkc2FfcGFja2V0X3R5cGUpOworfQorbW9kdWxlX2V4aXQoZWRzYV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvZHNhL3RhZ190cmFpbGVyLmMgYi9uZXQvZHNhL3RhZ190cmFpbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxMTc3NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9kc2EvdGFnX3RyYWlsZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIG5ldC9kc2EvdGFnX3RyYWlsZXIuYyAtIFRyYWlsZXIgdGFnIGZvcm1hdCBoYW5kbGluZworICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImRzYV9wcml2LmgiCisKK2ludCB0cmFpbGVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpuc2tiOworCWludCBwYWRsZW47CisJdTggKnRyYWlsZXI7CisKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFpbGVyIGVuZHMgdXAgYXMgdGhlIHZlcnkKKwkgKiBsYXN0IDQgYnl0ZXMgb2YgdGhlIHBhY2tldC4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHBhZAorCSAqIHRoZSBwYWNrZXQgdG8gdGhlIG1pbmltdW0gZXRoZXJuZXQgZnJhbWUgc2l6ZSwgaWYgbmVjZXNzYXJ5LAorCSAqIGJlZm9yZSBhZGRpbmcgdGhlIHRyYWlsZXIuCisJICovCisJcGFkbGVuID0gMDsKKwlpZiAoc2tiLT5sZW4gPCA2MCkKKwkJcGFkbGVuID0gNjAgLSBza2ItPmxlbjsKKworCW5za2IgPSBhbGxvY19za2IoTkVUX0lQX0FMSUdOICsgc2tiLT5sZW4gKyBwYWRsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwlpZiAobnNrYiA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKwlza2JfcmVzZXJ2ZShuc2tiLCBORVRfSVBfQUxJR04pOworCisJc2tiX3Jlc2V0X21hY19oZWFkZXIobnNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihuc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZCk7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKG5za2IsIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQpOworCXNrYl9jb3B5X2FuZF9jc3VtX2Rldihza2IsIHNrYl9wdXQobnNrYiwgc2tiLT5sZW4pKTsKKwlrZnJlZV9za2Ioc2tiKTsKKworCWlmIChwYWRsZW4pIHsKKwkJdTggKnBhZCA9IHNrYl9wdXQobnNrYiwgcGFkbGVuKTsKKwkJbWVtc2V0KHBhZCwgMCwgcGFkbGVuKTsKKwl9CisKKwl0cmFpbGVyID0gc2tiX3B1dChuc2tiLCA0KTsKKwl0cmFpbGVyWzBdID0gMHg4MDsKKwl0cmFpbGVyWzFdID0gMSA8PCBwLT5wb3J0OworCXRyYWlsZXJbMl0gPSAweDEwOworCXRyYWlsZXJbM10gPSAweDAwOworCisJbnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9UUkFJTEVSKTsKKworCW5za2ItPmRldiA9IHAtPnBhcmVudC0+bWFzdGVyX25ldGRldjsKKwlkZXZfcXVldWVfeG1pdChuc2tiKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbnQgdHJhaWxlcl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkZXYtPmRzYV9wdHI7CisJdTggKnRyYWlsZXI7CisJaW50IHNvdXJjZV9wb3J0OworCisJaWYgKHVubGlrZWx5KGRzID09IE5VTEwpKQorCQlnb3RvIG91dF9kcm9wOworCisJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkKKwkJZ290byBvdXRfZHJvcDsKKworCXRyYWlsZXIgPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSA0OworCWlmICh0cmFpbGVyWzBdICE9IDB4ODAgfHwgKHRyYWlsZXJbMV0gJiAweGY4KSAhPSAweDAwIHx8CisJICAgICh0cmFpbGVyWzNdICYgMHhlZikgIT0gMHgwMCB8fCB0cmFpbGVyWzNdICE9IDB4MDApCisJCWdvdG8gb3V0X2Ryb3A7CisKKwlzb3VyY2VfcG9ydCA9IHRyYWlsZXJbMV0gJiA3OworCWlmIChzb3VyY2VfcG9ydCA+PSBEU0FfTUFYX1BPUlRTIHx8IGRzLT5wb3J0c1tzb3VyY2VfcG9ydF0gPT0gTlVMTCkKKwkJZ290byBvdXRfZHJvcDsKKworCXBza2JfdHJpbV9yY3N1bShza2IsIHNrYi0+bGVuIC0gNCk7CisKKwlza2ItPmRldiA9IGRzLT5wb3J0c1tzb3VyY2VfcG9ydF07CisJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSB0cmFpbGVyX3BhY2tldF90eXBlID0geworCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9UUkFJTEVSKSwKKwkuZnVuYwk9IHRyYWlsZXJfcmN2LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHJhaWxlcl9pbml0X21vZHVsZSh2b2lkKQoreworCWRldl9hZGRfcGFjaygmdHJhaWxlcl9wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh0cmFpbGVyX2luaXRfbW9kdWxlKTsKKworc3RhdGljIHZvaWQgX19leGl0IHRyYWlsZXJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJnRyYWlsZXJfcGFja2V0X3R5cGUpOworfQorbW9kdWxlX2V4aXQodHJhaWxlcl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggYTgwODM5Yi4uYjlkODVhZiAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCisrKyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKQEAgLTEyOSw3ICsxMzAsNyBAQAogCiAJc3dpdGNoIChldGgtPmhfcHJvdG8pIHsKICNpZmRlZiBDT05GSUdfSU5FVAotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCXJldHVybiBhcnBfZmluZChldGgtPmhfZGVzdCwgc2tiKTsKICNlbmRpZgogCWRlZmF1bHQ6CkBAIC0xODQsNiArMTg1LDE3IEBACiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKIAl9CiAKKwkvKgorCSAqIFNvbWUgdmFyaWFudHMgb2YgRFNBIHRhZ2dpbmcgZG9uJ3QgaGF2ZSBhbiBldGhlcnR5cGUgZmllbGQKKwkgKiBhdCBhbGwsIHNvIHdlIGNoZWNrIGhlcmUgd2hldGhlciBvbmUgb2YgdGhvc2UgdGFnZ2luZworCSAqIHZhcmlhbnRzIGhhcyBiZWVuIGNvbmZpZ3VyZWQgb24gdGhlIHJlY2VpdmluZyBpbnRlcmZhY2UsCisJICogYW5kIGlmIHNvLCBzZXQgc2tiLT5wcm90b2NvbCB3aXRob3V0IGxvb2tpbmcgYXQgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAobmV0ZGV2X3VzZXNfZHNhX3RhZ3MoZGV2KSkKKwkJcmV0dXJuIGh0b25zKEVUSF9QX0RTQSk7CisJaWYgKG5ldGRldl91c2VzX3RyYWlsZXJfdGFncyhkZXYpKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfVFJBSUxFUik7CisKIAlpZiAobnRvaHMoZXRoLT5oX3Byb3RvKSA+PSAxNTM2KQogCQlyZXR1cm4gZXRoLT5oX3Byb3RvOwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IDNiY2E5N2YuLjk0OTc3MmEgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAllcnIgPSBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoaWVlZSk7CiAJaWYgKGVycikgewogCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBiZWFjb24gc3RvcmFnZTogJWRcbiIsIGVycik7Ci0JCWdvdG8gZmFpbGVkOworCQlnb3RvIGZhaWxlZF9mcmVlX25ldGRldjsKIAl9CiAJaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoaWVlZSk7CiAKQEAgLTE5Myw5ICsxOTMsOSBAQAogCiAJcmV0dXJuIGRldjsKIAotICAgICAgZmFpbGVkOgotCWlmIChkZXYpCi0JCWZyZWVfbmV0ZGV2KGRldik7CitmYWlsZWRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2ZhaWxlZDoKIAlyZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggNTkxZWEyMy4uNjkxMjY4ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC02MzAsNSArNjMwLDMgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotc291cmNlICJuZXQvaXB2NC9pcHZzL0tjb25maWciCi0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L01ha2VmaWxlIGIvbmV0L2lwdjQvTWFrZWZpbGUKaW5kZXggYWQ0MGVmMy4uODBmZjg3YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjQvTWFrZWZpbGUKQEAgLTMzLDcgKzMzLDYgQEAKIG9iai0kKENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwpICs9IHhmcm00X21vZGVfdHVubmVsLm8KIG9iai0kKENPTkZJR19JUF9QTlApICs9IGlwY29uZmlnLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVIpCSs9IG5ldGZpbHRlci5vIG5ldGZpbHRlci8KLW9iai0kKENPTkZJR19JUF9WUykgKz0gaXB2cy8KIG9iai0kKENPTkZJR19JTkVUX0RJQUcpICs9IGluZXRfZGlhZy5vIAogb2JqLSQoQ09ORklHX0lORVRfVENQX0RJQUcpICs9IHRjcF9kaWFnLm8KIG9iai0kKENPTkZJR19ORVRfVENQUFJPQkUpICs9IHRjcF9wcm9iZS5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggOGEzYWMxZi4uMWZiZmY1ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAJICovCiAJZXJyID0gLUVBRERSTk9UQVZBSUw7CiAJaWYgKCFzeXNjdGxfaXBfbm9ubG9jYWxfYmluZCAmJgotCSAgICAhaW5ldC0+ZnJlZWJpbmQgJiYKKwkgICAgIShpbmV0LT5mcmVlYmluZCB8fCBpbmV0LT50cmFuc3BhcmVudCkgJiYKIAkgICAgYWRkci0+c2luX2FkZHIuc19hZGRyICE9IGh0b25sKElOQUREUl9BTlkpICYmCiAJICAgIGNoa19hZGRyX3JldCAhPSBSVE5fTE9DQUwgJiYKIAkgICAgY2hrX2FkZHJfcmV0ICE9IFJUTl9NVUxUSUNBU1QgJiYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwppbmRleCAyYzBlNDU3Li40OTBlMDM1YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvY2lwc29faXB2NC5jCisrKyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwpAQCAtMTMsNyArMTMsNyBAQAogICovCiAKIC8qCi0gKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2CisgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2LCAyMDA4CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDcsMTcgKzQ3LDcgQEAKICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCi1zdHJ1Y3QgY2lwc29fdjRfZG9taHNoX2VudHJ5IHsKLQljaGFyICpkb21haW47Ci0JdTMyIHZhbGlkOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotfTsKLQogLyogTGlzdCBvZiBhdmFpbGFibGUgRE9JIGRlZmluaXRpb25zICovCi0vKiBYWFggLSBVcGRhdGVzIHNob3VsZCBiZSBtaW5pbWFsIHNvIGhhdmluZyBhIHNpbmdsZSBsb2NrIGZvciB0aGUKLSAqIGNpcHNvX3Y0X2RvaV9saXN0IGFuZCB0aGUgY2lwc29fdjRfZG9pX2xpc3QtPmRvbV9saXN0IHNob3VsZCBiZQotICogb2theS4gKi8KIC8qIFhYWCAtIFRoaXMgY3VycmVudGx5IGFzc3VtZXMgYSBtaW5pbWFsIG51bWJlciBvZiBkaWZmZXJlbnQgRE9JcyBpbiB1c2UsCiAgKiBpZiBpbiBwcmFjdGljZSB0aGVyZSBhcmUgYSBsb3Qgb2YgZGlmZmVyZW50IERPSXMgdGhpcyBsaXN0IHNob3VsZAogICogcHJvYmFibHkgYmUgdHVybmVkIGludG8gYSBoYXNoIHRhYmxlIG9yIHNvbWV0aGluZyBzaW1pbGFyIHNvIHdlCkBAIC0xMTksNiArMTA5LDE5IEBACiAgKiBiZSBvbWl0dGVkLiAqLwogI2RlZmluZSBDSVBTT19WNF9UQUdfUk5HX0NBVF9NQVggICAgICA4CiAKKy8qIEJhc2UgbGVuZ3RoIG9mIHRoZSBsb2NhbCB0YWcgKG5vbi1zdGFuZGFyZCB0YWcpLgorICogIFRhZyBkZWZpbml0aW9uIChtYXkgY2hhbmdlIGJldHdlZW4ga2VybmVsIHZlcnNpb25zKQorICoKKyAqIDAgICAgICAgICAgOCAgICAgICAgICAxNiAgICAgICAgIDI0ICAgICAgICAgMzIKKyAqICstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKworICogfCAxMDAwMDAwMCB8IDAwMDAwMTEwIHwgMzItYml0IHNlY2lkIHZhbHVlICB8CisgKiArLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAqIHwgaW4gKGhvc3QgYnl0ZSBvcmRlcil8CisgKiArLS0tLS0tLS0tLSstLS0tLS0tLS0tKworICoKKyAqLworI2RlZmluZSBDSVBTT19WNF9UQUdfTE9DX0JMRU4gICAgICAgICA2CisKIC8qCiAgKiBIZWxwZXIgRnVuY3Rpb25zCiAgKi8KQEAgLTE5NCwyNSArMTk3LDYgQEAKIH0KIAogLyoqCi0gKiBjaXBzb192NF9kb2lfZG9taHNoX2ZyZWUgLSBGcmVlcyBhIGRvbWFpbiBsaXN0IGVudHJ5Ci0gKiBAZW50cnk6IHRoZSBlbnRyeSdzIFJDVSBmaWVsZAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgY2FsbGJhY2sgdG8gdGhlIGNhbGxfcmN1KCkKLSAqIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYSBkb21haW4gbGlzdCBlbnRyeSBjYW4gYmUgcmVsZWFzZWQKLSAqIHNhZmVseS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGNpcHNvX3Y0X2RvaV9kb21oc2hfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmVudHJ5KQotewotCXN0cnVjdCBjaXBzb192NF9kb21oc2hfZW50cnkgKnB0cjsKLQotCXB0ciA9IGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGNpcHNvX3Y0X2RvbWhzaF9lbnRyeSwgcmN1KTsKLQlrZnJlZShwdHItPmRvbWFpbik7Ci0Ja2ZyZWUocHRyKTsKLX0KLQotLyoqCiAgKiBjaXBzb192NF9jYWNoZV9lbnRyeV9mcmVlIC0gRnJlZXMgYSBjYWNoZSBlbnRyeQogICogQGVudHJ5OiB0aGUgZW50cnkgdG8gZnJlZQogICoKQEAgLTQ1Nyw3ICs0NDEsNyBAQAogCXN0cnVjdCBjaXBzb192NF9kb2kgKml0ZXI7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLCAmY2lwc29fdjRfZG9pX2xpc3QsIGxpc3QpCi0JCWlmIChpdGVyLT5kb2kgPT0gZG9pICYmIGl0ZXItPnZhbGlkKQorCQlpZiAoaXRlci0+ZG9pID09IGRvaSAmJiBhdG9taWNfcmVhZCgmaXRlci0+cmVmY291bnQpKQogCQkJcmV0dXJuIGl0ZXI7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC00OTYsMTQgKzQ4MCwxNyBAQAogCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfTE9DQUw6CisJCQlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfTE9DQUwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JZG9pX2RlZi0+dmFsaWQgPSAxOworCWF0b21pY19zZXQoJmRvaV9kZWYtPnJlZmNvdW50LCAxKTsKIAlJTklUX1JDVV9IRUFEKCZkb2lfZGVmLT5yY3UpOwotCUlOSVRfTElTVF9IRUFEKCZkb2lfZGVmLT5kb21fbGlzdCk7CiAKIAlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwogCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkgIT0gTlVMTCkKQEAgLTUxOSw1OSArNTA2LDEyOSBAQAogfQogCiAvKioKLSAqIGNpcHNvX3Y0X2RvaV9yZW1vdmUgLSBSZW1vdmUgYW4gZXhpc3RpbmcgRE9JIGZyb20gdGhlIENJUFNPIHByb3RvY29sIGVuZ2luZQotICogQGRvaTogdGhlIERPSSB2YWx1ZQotICogQGF1ZGl0X3NlY2lkOiB0aGUgTFNNIHNlY2lkIHRvIHVzZSBpbiB0aGUgYXVkaXQgbWVzc2FnZQotICogQGNhbGxiYWNrOiB0aGUgRE9JIGNsZWFudXAvZnJlZSBjYWxsYmFjaworICogY2lwc29fdjRfZG9pX2ZyZWUgLSBGcmVlcyBhIERPSSBkZWZpbml0aW9uCisgKiBAZW50cnk6IHRoZSBlbnRyeSdzIFJDVSBmaWVsZAogICoKICAqIERlc2NyaXB0aW9uOgotICogUmVtb3ZlcyBhIERPSSBkZWZpbml0aW9uIGZyb20gdGhlIENJUFNPIGVuZ2luZSwgQGNhbGxiYWNrIGlzIGNhbGxlZCB0bwotICogZnJlZSBhbnkgbWVtb3J5LiAgVGhlIE5ldExhYmVsIHJvdXRpbmVzIHdpbGwgYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhlaXIgb3duCi0gKiBMU00gZG9tYWluIG1hcHBpbmdzIGFzIHdlbGwgYXMgb3VyIG93biBkb21haW4gbGlzdC4gIFJldHVybnMgemVybyBvbgotICogc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIERPSSBkZWZpbml0aW9uLgogICoKICAqLwotaW50IGNpcHNvX3Y0X2RvaV9yZW1vdmUodTMyIGRvaSwKLQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8sCi0JCQl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgcmN1X2hlYWQgKiBoZWFkKSkKK3ZvaWQgY2lwc29fdjRfZG9pX2ZyZWUoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZikKIHsKLQlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOwotCXN0cnVjdCBjaXBzb192NF9kb21oc2hfZW50cnkgKmRvbV9pdGVyOworCWlmIChkb2lfZGVmID09IE5VTEwpCisJCXJldHVybjsKIAotCXNwaW5fbG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pKTsKLQlpZiAoZG9pX2RlZiAhPSBOVUxMKSB7Ci0JCWRvaV9kZWYtPnZhbGlkID0gMDsKLQkJbGlzdF9kZWxfcmN1KCZkb2lfZGVmLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRvbV9pdGVyLCAmZG9pX2RlZi0+ZG9tX2xpc3QsIGxpc3QpCi0JCQlpZiAoZG9tX2l0ZXItPnZhbGlkKQotCQkJCW5ldGxibF9jZmdfbWFwX2RlbChkb21faXRlci0+ZG9tYWluLAotCQkJCQkJICAgYXVkaXRfaW5mbyk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQljaXBzb192NF9jYWNoZV9pbnZhbGlkYXRlKCk7Ci0JCWNhbGxfcmN1KCZkb2lfZGVmLT5yY3UsIGNhbGxiYWNrKTsKLQkJcmV0dXJuIDA7CisJc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7CisJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CisJCWtmcmVlKGRvaV9kZWYtPm1hcC5zdGQtPmx2bC5jaXBzbyk7CisJCWtmcmVlKGRvaV9kZWYtPm1hcC5zdGQtPmx2bC5sb2NhbCk7CisJCWtmcmVlKGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5jaXBzbyk7CisJCWtmcmVlKGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbCk7CisJCWJyZWFrOwogCX0KLQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0KLQlyZXR1cm4gLUVOT0VOVDsKKwlrZnJlZShkb2lfZGVmKTsKIH0KIAogLyoqCi0gKiBjaXBzb192NF9kb2lfZ2V0ZGVmIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSB2YWxpZCBET0kgZGVmaW5pdGlvbgorICogY2lwc29fdjRfZG9pX2ZyZWVfcmN1IC0gRnJlZXMgYSBET0kgZGVmaW5pdGlvbiB2aWEgdGhlIFJDVSBwb2ludGVyCisgKiBAZW50cnk6IHRoZSBlbnRyeSdzIFJDVSBmaWVsZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgY2FsbGJhY2sgdG8gdGhlIGNhbGxfcmN1KCkKKyAqIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIERPSSBkZWZpbml0aW9uIGNhbiBiZSByZWxlYXNlZAorICogc2FmZWx5LgorICoKKyAqLworc3RhdGljIHZvaWQgY2lwc29fdjRfZG9pX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqZW50cnkpCit7CisJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZjsKKworCWRvaV9kZWYgPSBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBjaXBzb192NF9kb2ksIHJjdSk7CisJY2lwc29fdjRfZG9pX2ZyZWUoZG9pX2RlZik7Cit9CisKKy8qKgorICogY2lwc29fdjRfZG9pX3JlbW92ZSAtIFJlbW92ZSBhbiBleGlzdGluZyBET0kgZnJvbSB0aGUgQ0lQU08gcHJvdG9jb2wgZW5naW5lCisgKiBAZG9pOiB0aGUgRE9JIHZhbHVlCisgKiBAYXVkaXRfc2VjaWQ6IHRoZSBMU00gc2VjaWQgdG8gdXNlIGluIHRoZSBhdWRpdCBtZXNzYWdlCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZW1vdmVzIGEgRE9JIGRlZmluaXRpb24gZnJvbSB0aGUgQ0lQU08gZW5naW5lLiAgVGhlIE5ldExhYmVsIHJvdXRpbmVzIHdpbGwKKyAqIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoZWlyIG93biBMU00gZG9tYWluIG1hcHBpbmdzIGFzIHdlbGwgYXMgb3VyIG93bgorICogZG9tYWluIGxpc3QuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgY2lwc29fdjRfZG9pX3JlbW92ZSh1MzIgZG9pLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWY7CisKKwlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOworCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGRvaSk7CisJaWYgKGRvaV9kZWYgPT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmRvaV9kZWYtPnJlZmNvdW50KSkgeworCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWxpc3RfZGVsX3JjdSgmZG9pX2RlZi0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOworCisJY2lwc29fdjRfY2FjaGVfaW52YWxpZGF0ZSgpOworCWNhbGxfcmN1KCZkb2lfZGVmLT5yY3UsIGNpcHNvX3Y0X2RvaV9mcmVlX3JjdSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjaXBzb192NF9kb2lfZ2V0ZGVmIC0gUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHZhbGlkIERPSSBkZWZpbml0aW9uCiAgKiBAZG9pOiB0aGUgRE9JIHZhbHVlCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBTZWFyY2hlcyBmb3IgYSB2YWxpZCBET0kgZGVmaW5pdGlvbiBhbmQgaWYgb25lIGlzIGZvdW5kIGl0IGlzIHJldHVybmVkIHRvCiAgKiB0aGUgY2FsbGVyLiAgT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKLSAqIHJjdV9yZWFkX2xvY2soKSBpcyBoZWxkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcmV0dXJuZWQgZGVmaW5pdGlvbi4KKyAqIHJjdV9yZWFkX2xvY2soKSBpcyBoZWxkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcmV0dXJuZWQgZGVmaW5pdGlvbiBhbmQgdGhlIERPSQorICogZGVmaW5pdGlvbiByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQgd2hlbiB0aGUgY2FsbGVyIGlzIGRvbmUuCiAgKgogICovCiBzdHJ1Y3QgY2lwc29fdjRfZG9pICpjaXBzb192NF9kb2lfZ2V0ZGVmKHUzMiBkb2kpCiB7Ci0JcmV0dXJuIGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pKTsKKwlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOworCisJcmN1X3JlYWRfbG9jaygpOworCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGRvaSk7CisJaWYgKGRvaV9kZWYgPT0gTlVMTCkKKwkJZ290byBkb2lfZ2V0ZGVmX3JldHVybjsKKwlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmRvaV9kZWYtPnJlZmNvdW50KSkKKwkJZG9pX2RlZiA9IE5VTEw7CisKK2RvaV9nZXRkZWZfcmV0dXJuOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBkb2lfZGVmOworfQorCisvKioKKyAqIGNpcHNvX3Y0X2RvaV9wdXRkZWYgLSBSZWxlYXNlcyBhIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uCisgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWxlYXNlcyBhIERPSSBkZWZpbml0aW9uIHJlZmVyZW5jZSBvYnRhaW5lZCBmcm9tIGNpcHNvX3Y0X2RvaV9nZXRkZWYoKS4KKyAqCisgKi8KK3ZvaWQgY2lwc29fdjRfZG9pX3B1dGRlZihzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKQoreworCWlmIChkb2lfZGVmID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZG9pX2RlZi0+cmVmY291bnQpKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbF9yY3UoJmRvaV9kZWYtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKKworCWNpcHNvX3Y0X2NhY2hlX2ludmFsaWRhdGUoKTsKKwljYWxsX3JjdSgmZG9pX2RlZi0+cmN1LCBjaXBzb192NF9kb2lfZnJlZV9yY3UpOwogfQogCiAvKioKQEAgLTU5Nyw3ICs2NTQsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGl0ZXJfZG9pLCAmY2lwc29fdjRfZG9pX2xpc3QsIGxpc3QpCi0JCWlmIChpdGVyX2RvaS0+dmFsaWQpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZpdGVyX2RvaS0+cmVmY291bnQpID4gMCkgewogCQkJaWYgKGRvaV9jbnQrKyA8ICpza2lwX2NudCkKIAkJCQljb250aW51ZTsKIAkJCXJldF92YWwgPSBjYWxsYmFjayhpdGVyX2RvaSwgY2JfYXJnKTsKQEAgLTYxMyw4NSArNjcwLDYgQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotLyoqCi0gKiBjaXBzb192NF9kb2lfZG9taHNoX2FkZCAtIEFkZHMgYSBkb21haW4gZW50cnkgdG8gYSBET0kgZGVmaW5pdGlvbgotICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgotICogQGRvbWFpbjogdGhlIGRvbWFpbiB0byBhZGQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFkZHMgdGhlIEBkb21haW4gdG8gdGhlIERPSSBzcGVjaWZpZWQgYnkgQGRvaV9kZWYsIHRoaXMgZnVuY3Rpb24KLSAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBleHRlcm5hbCBmdW5jdGlvbnMgKGkuZS4gTmV0TGFiZWwpLiAgVGhpcyBmdW5jdGlvbgotICogZG9lcyBhbGxvY2F0ZSBtZW1vcnkuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCi0gKgotICovCi1pbnQgY2lwc29fdjRfZG9pX2RvbWhzaF9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwgY29uc3QgY2hhciAqZG9tYWluKQotewotCXN0cnVjdCBjaXBzb192NF9kb21oc2hfZW50cnkgKml0ZXI7Ci0Jc3RydWN0IGNpcHNvX3Y0X2RvbWhzaF9lbnRyeSAqbmV3X2RvbTsKLQotCW5ld19kb20gPSBremFsbG9jKHNpemVvZigqbmV3X2RvbSksIEdGUF9LRVJORUwpOwotCWlmIChuZXdfZG9tID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChkb21haW4pIHsKLQkJbmV3X2RvbS0+ZG9tYWluID0ga3N0cmR1cChkb21haW4sIEdGUF9LRVJORUwpOwotCQlpZiAobmV3X2RvbS0+ZG9tYWluID09IE5VTEwpIHsKLQkJCWtmcmVlKG5ld19kb20pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JbmV3X2RvbS0+dmFsaWQgPSAxOwotCUlOSVRfUkNVX0hFQUQoJm5ld19kb20tPnJjdSk7Ci0KLQlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJmRvaV9kZWYtPmRvbV9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYKLQkJICAgICgoZG9tYWluICE9IE5VTEwgJiYgaXRlci0+ZG9tYWluICE9IE5VTEwgJiYKLQkJICAgICAgc3RyY21wKGl0ZXItPmRvbWFpbiwgZG9tYWluKSA9PSAwKSB8fAotCQkgICAgIChkb21haW4gPT0gTlVMTCAmJiBpdGVyLT5kb21haW4gPT0gTlVMTCkpKSB7Ci0JCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JCQlrZnJlZShuZXdfZG9tLT5kb21haW4pOwotCQkJa2ZyZWUobmV3X2RvbSk7Ci0JCQlyZXR1cm4gLUVFWElTVDsKLQkJfQotCWxpc3RfYWRkX3RhaWxfcmN1KCZuZXdfZG9tLT5saXN0LCAmZG9pX2RlZi0+ZG9tX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGNpcHNvX3Y0X2RvaV9kb21oc2hfcmVtb3ZlIC0gUmVtb3ZlcyBhIGRvbWFpbiBlbnRyeSBmcm9tIGEgRE9JIGRlZmluaXRpb24KLSAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KLSAqIEBkb21haW46IHRoZSBkb21haW4gdG8gcmVtb3ZlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZW1vdmVzIHRoZSBAZG9tYWluIGZyb20gdGhlIERPSSBzcGVjaWZpZWQgYnkgQGRvaV9kZWYsIHRoaXMgZnVuY3Rpb24KLSAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBleHRlcm5hbCBmdW5jdGlvbnMgKGkuZS4gTmV0TGFiZWwpLiAgIFJldHVybnMgemVybwotICogb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGVycm9yLgotICoKLSAqLwotaW50IGNpcHNvX3Y0X2RvaV9kb21oc2hfcmVtb3ZlKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCi0JCQkgICAgICAgY29uc3QgY2hhciAqZG9tYWluKQotewotCXN0cnVjdCBjaXBzb192NF9kb21oc2hfZW50cnkgKml0ZXI7Ci0KLQlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJmRvaV9kZWYtPmRvbV9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYKLQkJICAgICgoZG9tYWluICE9IE5VTEwgJiYgaXRlci0+ZG9tYWluICE9IE5VTEwgJiYKLQkJICAgICAgc3RyY21wKGl0ZXItPmRvbWFpbiwgZG9tYWluKSA9PSAwKSB8fAotCQkgICAgIChkb21haW4gPT0gTlVMTCAmJiBpdGVyLT5kb21haW4gPT0gTlVMTCkpKSB7Ci0JCQlpdGVyLT52YWxpZCA9IDA7Ci0JCQlsaXN0X2RlbF9yY3UoJml0ZXItPmxpc3QpOwotCQkJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCQkJY2FsbF9yY3UoJml0ZXItPnJjdSwgY2lwc29fdjRfZG9pX2RvbWhzaF9mcmVlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0Jc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCi0JcmV0dXJuIC1FTk9FTlQ7Ci19Ci0KIC8qCiAgKiBMYWJlbCBNYXBwaW5nIEZ1bmN0aW9ucwogICovCkBAIC03MTIsNyArNjkwLDcgQEAKIAlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQlyZXR1cm4gMDsKLQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCWlmIChkb2lfZGVmLT5tYXAuc3RkLT5sdmwuY2lwc29bbGV2ZWxdIDwgQ0lQU09fVjRfSU5WX0xWTCkKIAkJCXJldHVybiAwOwogCQlicmVhazsKQEAgLTc0MSw3ICs3MTksNyBAQAogCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6CiAJCSpuZXRfbHZsID0gaG9zdF9sdmw7CiAJCXJldHVybiAwOwotCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwljYXNlIENJUFNPX1Y0X01BUF9UUkFOUzoKIAkJaWYgKGhvc3RfbHZsIDwgZG9pX2RlZi0+bWFwLnN0ZC0+bHZsLmxvY2FsX3NpemUgJiYKIAkJICAgIGRvaV9kZWYtPm1hcC5zdGQtPmx2bC5sb2NhbFtob3N0X2x2bF0gPCBDSVBTT19WNF9JTlZfTFZMKSB7CiAJCQkqbmV0X2x2bCA9IGRvaV9kZWYtPm1hcC5zdGQtPmx2bC5sb2NhbFtob3N0X2x2bF07CkBAIC03NzUsNyArNzUzLDcgQEAKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQkqaG9zdF9sdmwgPSBuZXRfbHZsOwogCQlyZXR1cm4gMDsKLQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCW1hcF90YmwgPSBkb2lfZGVmLT5tYXAuc3RkOwogCQlpZiAobmV0X2x2bCA8IG1hcF90YmwtPmx2bC5jaXBzb19zaXplICYmCiAJCSAgICBtYXBfdGJsLT5sdmwuY2lwc29bbmV0X2x2bF0gPCBDSVBTT19WNF9JTlZfTFZMKSB7CkBAIC04MTIsNyArNzkwLDcgQEAKIAlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQlyZXR1cm4gMDsKLQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCWNpcHNvX2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7CiAJCWNpcHNvX2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOwogCQlmb3IgKDs7KSB7CkBAIC04NjAsNyArODM4LDcgQEAKIAl1MzIgaG9zdF9jYXRfc2l6ZSA9IDA7CiAJdTMyICpob3N0X2NhdF9hcnJheSA9IE5VTEw7CiAKLQlpZiAoZG9pX2RlZi0+dHlwZSA9PSBDSVBTT19WNF9NQVBfU1REKSB7CisJaWYgKGRvaV9kZWYtPnR5cGUgPT0gQ0lQU09fVjRfTUFQX1RSQU5TKSB7CiAJCWhvc3RfY2F0X3NpemUgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWxfc2l6ZTsKIAkJaG9zdF9jYXRfYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWw7CiAJfQpAQCAtODc1LDcgKzg1Myw3IEBACiAJCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6CiAJCQluZXRfc3BvdCA9IGhvc3Rfc3BvdDsKIAkJCWJyZWFrOwotCQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgogCQkJaWYgKGhvc3Rfc3BvdCA+PSBob3N0X2NhdF9zaXplKQogCQkJCXJldHVybiAtRVBFUk07CiAJCQluZXRfc3BvdCA9IGhvc3RfY2F0X2FycmF5W2hvc3Rfc3BvdF07CkBAIC05MjEsNyArODk5LDcgQEAKIAl1MzIgbmV0X2NhdF9zaXplID0gMDsKIAl1MzIgKm5ldF9jYXRfYXJyYXkgPSBOVUxMOwogCi0JaWYgKGRvaV9kZWYtPnR5cGUgPT0gQ0lQU09fVjRfTUFQX1NURCkgeworCWlmIChkb2lfZGVmLT50eXBlID09IENJUFNPX1Y0X01BUF9UUkFOUykgewogCQluZXRfY2F0X3NpemUgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQuY2lwc29fc2l6ZTsKIAkJbmV0X2NhdF9hcnJheSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5jaXBzbzsKIAl9CkBAIC05NDEsNyArOTE5LDcgQEAKIAkJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKIAkJCWhvc3Rfc3BvdCA9IG5ldF9zcG90OwogCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwkJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCQlpZiAobmV0X3Nwb3QgPj0gbmV0X2NhdF9zaXplKQogCQkJCXJldHVybiAtRVBFUk07CiAJCQlob3N0X3Nwb3QgPSBuZXRfY2F0X2FycmF5W25ldF9zcG90XTsKQEAgLTEyNzcsNyArMTI1NSw3IEBACiAJfSBlbHNlCiAJCXRhZ19sZW4gPSA0OwogCi0JYnVmZmVyWzBdID0gMHgwMTsKKwlidWZmZXJbMF0gPSBDSVBTT19WNF9UQUdfUkJJVE1BUDsKIAlidWZmZXJbMV0gPSB0YWdfbGVuOwogCWJ1ZmZlclszXSA9IGxldmVsOwogCkBAIC0xMzczLDcgKzEzNTEsNyBAQAogCX0gZWxzZQogCQl0YWdfbGVuID0gNDsKIAotCWJ1ZmZlclswXSA9IDB4MDI7CisJYnVmZmVyWzBdID0gQ0lQU09fVjRfVEFHX0VOVU07CiAJYnVmZmVyWzFdID0gdGFnX2xlbjsKIAlidWZmZXJbM10gPSBsZXZlbDsKIApAQCAtMTQ2OSw3ICsxNDQ3LDcgQEAKIAl9IGVsc2UKIAkJdGFnX2xlbiA9IDQ7CiAKLQlidWZmZXJbMF0gPSAweDA1OworCWJ1ZmZlclswXSA9IENJUFNPX1Y0X1RBR19SQU5HRTsKIAlidWZmZXJbMV0gPSB0YWdfbGVuOwogCWJ1ZmZlclszXSA9IGxldmVsOwogCkBAIC0xNTIzLDYgKzE1MDEsNTQgQEAKIH0KIAogLyoqCisgKiBjaXBzb192NF9nZW50YWdfbG9jIC0gR2VuZXJhdGUgYSBDSVBTTyBsb2NhbCB0YWcgKG5vbi1zdGFuZGFyZCkKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogQGJ1ZmZlcjogdGhlIG9wdGlvbiBidWZmZXIKKyAqIEBidWZmZXJfbGVuOiBsZW5ndGggb2YgYnVmZmVyIGluIGJ5dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZW5lcmF0ZSBhIENJUFNPIG9wdGlvbiB1c2luZyB0aGUgbG9jYWwgdGFnLiAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdGFnCisgKiBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfZ2VudGFnX2xvYyhjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJICAgICAgIHUzMiBidWZmZXJfbGVuKQoreworCWlmICghKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfU0VDSUQpKQorCQlyZXR1cm4gLUVQRVJNOworCisJYnVmZmVyWzBdID0gQ0lQU09fVjRfVEFHX0xPQ0FMOworCWJ1ZmZlclsxXSA9IENJUFNPX1Y0X1RBR19MT0NfQkxFTjsKKwkqKHUzMiAqKSZidWZmZXJbMl0gPSBzZWNhdHRyLT5hdHRyLnNlY2lkOworCisJcmV0dXJuIENJUFNPX1Y0X1RBR19MT0NfQkxFTjsKK30KKworLyoqCisgKiBjaXBzb192NF9wYXJzZXRhZ19sb2MgLSBQYXJzZSBhIENJUFNPIGxvY2FsIHRhZworICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHRhZzogdGhlIENJUFNPIHRhZworICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYXJzZSBhIENJUFNPIGxvY2FsIHRhZyBhbmQgcmV0dXJuIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzIGluIEBzZWNhdHRyLgorICogUmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmVzIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9wYXJzZXRhZ19sb2MoY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqdGFnLAorCQkJCSBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQoreworCXNlY2F0dHItPmF0dHIuc2VjaWQgPSAqKHUzMiAqKSZ0YWdbMl07CisJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfU0VDSUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBjaXBzb192NF92YWxpZGF0ZSAtIFZhbGlkYXRlIGEgQ0lQU08gb3B0aW9uCiAgKiBAb3B0aW9uOiB0aGUgc3RhcnQgb2YgdGhlIG9wdGlvbiwgb24gZXJyb3IgaXQgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBlcnJvcgogICoKQEAgLTE1NDEsNyArMTU2Nyw3IEBACiAgKiAgIHRoYXQgaXMgdW5yZWNvZ25pemVkLiIKICAqCiAgKi8KLWludCBjaXBzb192NF92YWxpZGF0ZSh1bnNpZ25lZCBjaGFyICoqb3B0aW9uKQoraW50IGNpcHNvX3Y0X3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKipvcHRpb24pCiB7CiAJdW5zaWduZWQgY2hhciAqb3B0ID0gKm9wdGlvbjsKIAl1bnNpZ25lZCBjaGFyICp0YWc7CkBAIC0xNTY2LDcgKzE1OTIsNyBAQAogCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CiAJfQogCi0Jb3B0X2l0ZXIgPSA2OworCW9wdF9pdGVyID0gQ0lQU09fVjRfSERSX0xFTjsKIAl0YWcgPSBvcHQgKyBvcHRfaXRlcjsKIAl3aGlsZSAob3B0X2l0ZXIgPCBvcHRfbGVuKSB7CiAJCWZvciAodGFnX2l0ZXIgPSAwOyBkb2lfZGVmLT50YWdzW3RhZ19pdGVyXSAhPSB0YWdbMF07KQpAQCAtMTU4NCw3ICsxNjEwLDcgQEAKIAogCQlzd2l0Y2ggKHRhZ1swXSkgewogCQljYXNlIENJUFNPX1Y0X1RBR19SQklUTUFQOgotCQkJaWYgKHRhZ19sZW4gPCA0KSB7CisJCQlpZiAodGFnX2xlbiA8IENJUFNPX1Y0X1RBR19SQk1fQkxFTikgewogCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDE7CiAJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJfQpAQCAtMTYwMiw3ICsxNjI4LDcgQEAKIAkJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgMzsKIAkJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJCX0KLQkJCQlpZiAodGFnX2xlbiA+IDQgJiYKKwkJCQlpZiAodGFnX2xlbiA+IENJUFNPX1Y0X1RBR19SQk1fQkxFTiAmJgogCQkJCSAgICBjaXBzb192NF9tYXBfY2F0X3JibV92YWxpZChkb2lfZGVmLAogCQkJCQkJCSAgICAmdGFnWzRdLAogCQkJCQkJCSAgICB0YWdfbGVuIC0gNCkgPCAwKSB7CkBAIC0xNjEyLDcgKzE2MzgsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX0VOVU06Ci0JCQlpZiAodGFnX2xlbiA8IDQpIHsKKwkJCWlmICh0YWdfbGVuIDwgQ0lQU09fVjRfVEFHX0VOVU1fQkxFTikgewogCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDE7CiAJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJfQpAQCAtMTYyMiw3ICsxNjQ4LDcgQEAKIAkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXIgKyAzOwogCQkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKIAkJCX0KLQkJCWlmICh0YWdfbGVuID4gNCAmJgorCQkJaWYgKHRhZ19sZW4gPiBDSVBTT19WNF9UQUdfRU5VTV9CTEVOICYmCiAJCQkgICAgY2lwc29fdjRfbWFwX2NhdF9lbnVtX3ZhbGlkKGRvaV9kZWYsCiAJCQkJCQkJJnRhZ1s0XSwKIAkJCQkJCQl0YWdfbGVuIC0gNCkgPCAwKSB7CkBAIC0xNjMxLDcgKzE2NTcsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgotCQkJaWYgKHRhZ19sZW4gPCA0KSB7CisJCQlpZiAodGFnX2xlbiA8IENJUFNPX1Y0X1RBR19STkdfQkxFTikgewogCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDE7CiAJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJfQpAQCAtMTY0MSw3ICsxNjY3LDcgQEAKIAkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXIgKyAzOwogCQkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKIAkJCX0KLQkJCWlmICh0YWdfbGVuID4gNCAmJgorCQkJaWYgKHRhZ19sZW4gPiBDSVBTT19WNF9UQUdfUk5HX0JMRU4gJiYKIAkJCSAgICBjaXBzb192NF9tYXBfY2F0X3JuZ192YWxpZChkb2lfZGVmLAogCQkJCQkJICAgICAgICZ0YWdbNF0sCiAJCQkJCQkgICAgICAgdGFnX2xlbiAtIDQpIDwgMCkgewpAQCAtMTY0OSw2ICsxNjc1LDE5IEBACiAJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfVEFHX0xPQ0FMOgorCQkJLyogVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCB0YWcgdGhhdCB3ZSBvbmx5IGFsbG93IGZvcgorCQkJICogbG9jYWwgY29ubmVjdGlvbnMsIHNvIGlmIHRoZSBpbmNvbWluZyBpbnRlcmZhY2UgaXMKKwkJCSAqIG5vdCB0aGUgbG9vcGJhY2sgZGV2aWNlIGRyb3AgdGhlIHBhY2tldC4gKi8KKwkJCWlmICghKHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKKwkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXI7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCQkJaWYgKHRhZ19sZW4gIT0gQ0lQU09fVjRfVEFHX0xPQ19CTEVOKSB7CisJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgMTsKKwkJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CisJCQl9CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWVycl9vZmZzZXQgPSBvcHRfaXRlcjsKIAkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKQEAgLTE3MDQsNDggKzE3NDMsMjcgQEAKIH0KIAogLyoqCi0gKiBjaXBzb192NF9zb2NrX3NldGF0dHIgLSBBZGQgYSBDSVBTTyBvcHRpb24gdG8gYSBzb2NrZXQKLSAqIEBzazogdGhlIHNvY2tldAorICogY2lwc29fdjRfZ2Vub3B0IC0gR2VuZXJhdGUgYSBDSVBTTyBvcHRpb24KKyAqIEBidWY6IHRoZSBvcHRpb24gYnVmZmVyCisgKiBAYnVmX2xlbjogdGhlIHNpemUgb2Ygb3B0X2J1ZgogICogQGRvaV9kZWY6IHRoZSBDSVBTTyBET0kgdG8gdXNlCi0gKiBAc2VjYXR0cjogdGhlIHNwZWNpZmljIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb2YgdGhlIHNvY2tldAorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBTZXQgdGhlIENJUFNPIG9wdGlvbiBvbiB0aGUgZ2l2ZW4gc29ja2V0IHVzaW5nIHRoZSBET0kgZGVmaW5pdGlvbiBhbmQKLSAqIHNlY3VyaXR5IGF0dHJpYnV0ZXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMKLSAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gQHNrLCB3aGljaCBtZWFucyBpdCBlaXRoZXIgbmVlZHMgdG8gYmUgaW4gdGhlCi0gKiBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQgb3IgbG9ja2VkLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlCi0gKiB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIEdlbmVyYXRlIGEgQ0lQU08gb3B0aW9uIHVzaW5nIHRoZSBET0kgZGVmaW5pdGlvbiBhbmQgc2VjdXJpdHkgYXR0cmlidXRlcworICogcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uIG9uIHN1Y2Nlc3MgYW5kCisgKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBjaXBzb192NF9zb2NrX3NldGF0dHIoc3RydWN0IHNvY2sgKnNrLAotCQkJICBjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAotCQkJICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQorc3RhdGljIGludCBjaXBzb192NF9nZW5vcHQodW5zaWduZWQgY2hhciAqYnVmLCB1MzIgYnVmX2xlbiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQogewotCWludCByZXRfdmFsID0gLUVQRVJNOworCWludCByZXRfdmFsOwogCXUzMiBpdGVyOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQl1MzIgYnVmX2xlbiA9IDA7Ci0JdTMyIG9wdF9sZW47Ci0Jc3RydWN0IGlwX29wdGlvbnMgKm9wdCA9IE5VTEw7Ci0Jc3RydWN0IGluZXRfc29jayAqc2tfaW5ldDsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKnNrX2Nvbm47CiAKLQkvKiBJbiB0aGUgY2FzZSBvZiBzb2NrX2NyZWF0ZV9saXRlKCksIHRoZSBzb2NrLT5zayBmaWVsZCBpcyBub3QKLQkgKiBkZWZpbmVkIHlldCBidXQgaXQgaXMgbm90IGEgcHJvYmxlbSBhcyB0aGUgb25seSB1c2VycyBvZiB0aGVzZQotCSAqICJsaXRlIiBQRl9JTkVUIHNvY2tldHMgYXJlIGZ1bmN0aW9ucyB3aGljaCBkbyBhbiBhY2NlcHQoKSBjYWxsCi0JICogYWZ0ZXJ3YXJkcyBzbyB3ZSB3aWxsIGxhYmVsIHRoZSBzb2NrZXQgYXMgcGFydCBvZiB0aGUgYWNjZXB0KCkuICovCi0JaWYgKHNrID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JLyogV2UgYWxsb2NhdGUgdGhlIG1heGltdW0gQ0lQU08gb3B0aW9uIHNpemUgaGVyZSBzbyB3ZSBhcmUgcHJvYmFibHkKLQkgKiBiZWluZyBhIGxpdHRsZSB3YXN0ZWZ1bCwgYnV0IGl0IG1ha2VzIG91ciBsaWZlIF9tdWNoXyBlYXNpZXIgbGF0ZXIKLQkgKiBvbiBhbmQgYWZ0ZXIgYWxsIHdlIGFyZSBvbmx5IHRhbGtpbmcgYWJvdXQgNDAgYnl0ZXMuICovCi0JYnVmX2xlbiA9IENJUFNPX1Y0X09QVF9MRU5fTUFYOwotCWJ1ZiA9IGttYWxsb2MoYnVmX2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCXJldF92YWwgPSAtRU5PTUVNOwotCQlnb3RvIHNvY2tldF9zZXRhdHRyX2ZhaWx1cmU7Ci0JfQorCWlmIChidWZfbGVuIDw9IENJUFNPX1Y0X0hEUl9MRU4pCisJCXJldHVybiAtRU5PU1BDOwogCiAJLyogWFhYIC0gVGhpcyBjb2RlIGFzc3VtZXMgb25seSBvbmUgdGFnIHBlciBDSVBTTyBvcHRpb24gd2hpY2ggaXNuJ3QKIAkgKiByZWFsbHkgYSBnb29kIGFzc3VtcHRpb24gdG8gbWFrZSBidXQgc2luY2Ugd2Ugb25seSBzdXBwb3J0IHRoZSBNQUMKQEAgLTE3NzIsOSArMTc5MCwxNCBAQAogCQkJCQkJICAgJmJ1ZltDSVBTT19WNF9IRFJfTEVOXSwKIAkJCQkJCSAgIGJ1Zl9sZW4gLSBDSVBTT19WNF9IRFJfTEVOKTsKIAkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X1RBR19MT0NBTDoKKwkJCXJldF92YWwgPSBjaXBzb192NF9nZW50YWdfbG9jKGRvaV9kZWYsCisJCQkJCQkgICBzZWNhdHRyLAorCQkJCQkJICAgJmJ1ZltDSVBTT19WNF9IRFJfTEVOXSwKKwkJCQkJCSAgIGJ1Zl9sZW4gLSBDSVBTT19WNF9IRFJfTEVOKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0X3ZhbCA9IC1FUEVSTTsKLQkJCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKKwkJCXJldHVybiAtRVBFUk07CiAJCX0KIAogCQlpdGVyKys7CkBAIC0xNzgyLDkgKzE4MDUsNTggQEAKIAkJIGl0ZXIgPCBDSVBTT19WNF9UQUdfTUFYQ05UICYmCiAJCSBkb2lfZGVmLT50YWdzW2l0ZXJdICE9IENJUFNPX1Y0X1RBR19JTlZBTElEKTsKIAlpZiAocmV0X3ZhbCA8IDApCi0JCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKKwkJcmV0dXJuIHJldF92YWw7CiAJY2lwc29fdjRfZ2VudGFnX2hkcihkb2lfZGVmLCBidWYsIHJldF92YWwpOwotCWJ1Zl9sZW4gPSBDSVBTT19WNF9IRFJfTEVOICsgcmV0X3ZhbDsKKwlyZXR1cm4gQ0lQU09fVjRfSERSX0xFTiArIHJldF92YWw7Cit9CisKKy8qKgorICogY2lwc29fdjRfc29ja19zZXRhdHRyIC0gQWRkIGEgQ0lQU08gb3B0aW9uIHRvIGEgc29ja2V0CisgKiBAc2s6IHRoZSBzb2NrZXQKKyAqIEBkb2lfZGVmOiB0aGUgQ0lQU08gRE9JIHRvIHVzZQorICogQHNlY2F0dHI6IHRoZSBzcGVjaWZpYyBzZWN1cml0eSBhdHRyaWJ1dGVzIG9mIHRoZSBzb2NrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNldCB0aGUgQ0lQU08gb3B0aW9uIG9uIHRoZSBnaXZlbiBzb2NrZXQgdXNpbmcgdGhlIERPSSBkZWZpbml0aW9uIGFuZAorICogc2VjdXJpdHkgYXR0cmlidXRlcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcworICogZXhjbHVzaXZlIGFjY2VzcyB0byBAc2ssIHdoaWNoIG1lYW5zIGl0IGVpdGhlciBuZWVkcyB0byBiZSBpbiB0aGUKKyAqIHByb2Nlc3Mgb2YgYmVpbmcgY3JlYXRlZCBvciBsb2NrZWQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUKKyAqIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IGNpcHNvX3Y0X3NvY2tfc2V0YXR0cihzdHJ1Y3Qgc29jayAqc2ssCisJCQkgIGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWwgPSAtRVBFUk07CisJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgb3B0X2xlbjsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gTlVMTDsKKwlzdHJ1Y3QgaW5ldF9zb2NrICpza19pbmV0OworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqc2tfY29ubjsKKworCS8qIEluIHRoZSBjYXNlIG9mIHNvY2tfY3JlYXRlX2xpdGUoKSwgdGhlIHNvY2stPnNrIGZpZWxkIGlzIG5vdAorCSAqIGRlZmluZWQgeWV0IGJ1dCBpdCBpcyBub3QgYSBwcm9ibGVtIGFzIHRoZSBvbmx5IHVzZXJzIG9mIHRoZXNlCisJICogImxpdGUiIFBGX0lORVQgc29ja2V0cyBhcmUgZnVuY3Rpb25zIHdoaWNoIGRvIGFuIGFjY2VwdCgpIGNhbGwKKwkgKiBhZnRlcndhcmRzIHNvIHdlIHdpbGwgbGFiZWwgdGhlIHNvY2tldCBhcyBwYXJ0IG9mIHRoZSBhY2NlcHQoKS4gKi8KKwlpZiAoc2sgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBDSVBTTyBvcHRpb24gc2l6ZSBoZXJlIHNvIHdlIGFyZSBwcm9iYWJseQorCSAqIGJlaW5nIGEgbGl0dGxlIHdhc3RlZnVsLCBidXQgaXQgbWFrZXMgb3VyIGxpZmUgX211Y2hfIGVhc2llciBsYXRlcgorCSAqIG9uIGFuZCBhZnRlciBhbGwgd2UgYXJlIG9ubHkgdGFsa2luZyBhYm91dCA0MCBieXRlcy4gKi8KKwlidWZfbGVuID0gQ0lQU09fVjRfT1BUX0xFTl9NQVg7CisJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKKwl9CisKKwlyZXRfdmFsID0gY2lwc29fdjRfZ2Vub3B0KGJ1ZiwgYnVmX2xlbiwgZG9pX2RlZiwgc2VjYXR0cik7CisJaWYgKHJldF92YWwgPCAwKQorCQlnb3RvIHNvY2tldF9zZXRhdHRyX2ZhaWx1cmU7CisJYnVmX2xlbiA9IHJldF92YWw7CiAKIAkvKiBXZSBjYW4ndCB1c2UgaXBfb3B0aW9uc19nZXQoKSBkaXJlY3RseSBiZWNhdXNlIGl0IG1ha2VzIGEgY2FsbCB0bwogCSAqIGlwX29wdGlvbnNfZ2V0X2FsbG9jKCkgd2hpY2ggYWxsb2NhdGVzIG1lbW9yeSB3aXRoIEdGUF9LRVJORUwgYW5kCkBAIC0xODIyLDYgKzE4OTQsODAgQEAKIH0KIAogLyoqCisgKiBjaXBzb192NF9zb2NrX2RlbGF0dHIgLSBEZWxldGUgdGhlIENJUFNPIG9wdGlvbiBmcm9tIGEgc29ja2V0CisgKiBAc2s6IHRoZSBzb2NrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgdGhlIENJUFNPIG9wdGlvbiBmcm9tIGEgc29ja2V0LCBpZiBwcmVzZW50LgorICoKKyAqLwordm9pZCBjaXBzb192NF9zb2NrX2RlbGF0dHIoc3RydWN0IHNvY2sgKnNrKQoreworCXU4IGhkcl9kZWx0YTsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0OworCXN0cnVjdCBpbmV0X3NvY2sgKnNrX2luZXQ7CisKKwlza19pbmV0ID0gaW5ldF9zayhzayk7CisJb3B0ID0gc2tfaW5ldC0+b3B0OworCWlmIChvcHQgPT0gTlVMTCB8fCBvcHQtPmNpcHNvID09IDApCisJCXJldHVybjsKKworCWlmIChvcHQtPnNyciB8fCBvcHQtPnJyIHx8IG9wdC0+dHMgfHwgb3B0LT5yb3V0ZXJfYWxlcnQpIHsKKwkJdTggY2lwc29fbGVuOworCQl1OCBjaXBzb19vZmY7CisJCXVuc2lnbmVkIGNoYXIgKmNpcHNvX3B0cjsKKwkJaW50IGl0ZXI7CisJCWludCBvcHRsZW5fbmV3OworCisJCWNpcHNvX29mZiA9IG9wdC0+Y2lwc28gLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJY2lwc29fcHRyID0gJm9wdC0+X19kYXRhW2NpcHNvX29mZl07CisJCWNpcHNvX2xlbiA9IGNpcHNvX3B0clsxXTsKKworCQlpZiAob3B0LT5zcnIgPiBvcHQtPmNpcHNvKQorCQkJb3B0LT5zcnIgLT0gY2lwc29fbGVuOworCQlpZiAob3B0LT5yciA+IG9wdC0+Y2lwc28pCisJCQlvcHQtPnJyIC09IGNpcHNvX2xlbjsKKwkJaWYgKG9wdC0+dHMgPiBvcHQtPmNpcHNvKQorCQkJb3B0LT50cyAtPSBjaXBzb19sZW47CisJCWlmIChvcHQtPnJvdXRlcl9hbGVydCA+IG9wdC0+Y2lwc28pCisJCQlvcHQtPnJvdXRlcl9hbGVydCAtPSBjaXBzb19sZW47CisJCW9wdC0+Y2lwc28gPSAwOworCisJCW1lbW1vdmUoY2lwc29fcHRyLCBjaXBzb19wdHIgKyBjaXBzb19sZW4sCisJCQlvcHQtPm9wdGxlbiAtIGNpcHNvX29mZiAtIGNpcHNvX2xlbik7CisKKwkJLyogZGV0ZXJtaW5pbmcgdGhlIG5ldyB0b3RhbCBvcHRpb24gbGVuZ3RoIGlzIHRyaWNreSBiZWNhdXNlIG9mCisJCSAqIHRoZSBwYWRkaW5nIG5lY2Vzc2FyeSwgdGhlIG9ubHkgdGhpbmcgaSBjYW4gdGhpbmsgdG8gZG8gYXQKKwkJICogdGhpcyBwb2ludCBpcyB3YWxrIHRoZSBvcHRpb25zIG9uZS1ieS1vbmUsIHNraXBwaW5nIHRoZQorCQkgKiBwYWRkaW5nIGF0IHRoZSBlbmQgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgb3B0aW9uIHNpemUgYW5kCisJCSAqIGZyb20gdGhlcmUgd2UgY2FuIGRldGVybWluZSB0aGUgbmV3IHRvdGFsIG9wdGlvbiBsZW5ndGggKi8KKwkJaXRlciA9IDA7CisJCW9wdGxlbl9uZXcgPSAwOworCQl3aGlsZSAoaXRlciA8IG9wdC0+b3B0bGVuKQorCQkJaWYgKG9wdC0+X19kYXRhW2l0ZXJdICE9IElQT1BUX05PUCkgeworCQkJCWl0ZXIgKz0gb3B0LT5fX2RhdGFbaXRlciArIDFdOworCQkJCW9wdGxlbl9uZXcgPSBpdGVyOworCQkJfSBlbHNlCisJCQkJaXRlcisrOworCQloZHJfZGVsdGEgPSBvcHQtPm9wdGxlbjsKKwkJb3B0LT5vcHRsZW4gPSAob3B0bGVuX25ldyArIDMpICYgfjM7CisJCWhkcl9kZWx0YSAtPSBvcHQtPm9wdGxlbjsKKwl9IGVsc2UgeworCQkvKiBvbmx5IHRoZSBjaXBzbyBvcHRpb24gd2FzIHByZXNlbnQgb24gdGhlIHNvY2tldCBzbyB3ZSBjYW4KKwkJICogcmVtb3ZlIHRoZSBlbnRpcmUgb3B0aW9uIHN0cnVjdCAqLworCQlza19pbmV0LT5vcHQgPSBOVUxMOworCQloZHJfZGVsdGEgPSBvcHQtPm9wdGxlbjsKKwkJa2ZyZWUob3B0KTsKKwl9CisKKwlpZiAoc2tfaW5ldC0+aXNfaWNzayAmJiBoZHJfZGVsdGEgPiAwKSB7CisJCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqc2tfY29ubiA9IGluZXRfY3NrKHNrKTsKKwkJc2tfY29ubi0+aWNza19leHRfaGRyX2xlbiAtPSBoZHJfZGVsdGE7CisJCXNrX2Nvbm4tPmljc2tfc3luY19tc3Moc2ssIHNrX2Nvbm4tPmljc2tfcG10dV9jb29raWUpOworCX0KK30KKworLyoqCiAgKiBjaXBzb192NF9nZXRhdHRyIC0gSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2lwc29fdjRfKl9nZXRhdHRyIGZ1bmN0aW9ucwogICogQGNpcHNvOiB0aGUgQ0lQU08gdjQgb3B0aW9uCiAgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKQEAgLTE4NTksNiArMjAwNSw5IEBACiAJY2FzZSBDSVBTT19WNF9UQUdfUkFOR0U6CiAJCXJldF92YWwgPSBjaXBzb192NF9wYXJzZXRhZ19ybmcoZG9pX2RlZiwgJmNpcHNvWzZdLCBzZWNhdHRyKTsKIAkJYnJlYWs7CisJY2FzZSBDSVBTT19WNF9UQUdfTE9DQUw6CisJCXJldF92YWwgPSBjaXBzb192NF9wYXJzZXRhZ19sb2MoZG9pX2RlZiwgJmNpcHNvWzZdLCBzZWNhdHRyKTsKKwkJYnJlYWs7CiAJfQogCWlmIChyZXRfdmFsID09IDApCiAJCXNlY2F0dHItPnR5cGUgPSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ7CkBAIC0xODkzLDYgKzIwNDIsMTIzIEBACiB9CiAKIC8qKgorICogY2lwc29fdjRfc2tidWZmX3NldGF0dHIgLSBTZXQgdGhlIENJUFNPIG9wdGlvbiBvbiBhIHBhY2tldAorICogQHNrYjogdGhlIHBhY2tldAorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBTZXQgdGhlIENJUFNPIG9wdGlvbiBvbiB0aGUgZ2l2ZW4gcGFja2V0IGJhc2VkIG9uIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIElQIGhlYWRlciBvbiBzdWNjZXNzIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgY2lwc29fdjRfc2tidWZmX3NldGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWw7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGlwX29wdGlvbnMgKm9wdCA9ICZJUENCKHNrYiktPm9wdDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltDSVBTT19WNF9PUFRfTEVOX01BWF07CisJdTMyIGJ1Zl9sZW4gPSBDSVBTT19WNF9PUFRfTEVOX01BWDsKKwl1MzIgb3B0X2xlbjsKKwlpbnQgbGVuX2RlbHRhOworCisJYnVmX2xlbiA9IGNpcHNvX3Y0X2dlbm9wdChidWYsIGJ1Zl9sZW4sIGRvaV9kZWYsIHNlY2F0dHIpOworCWlmIChidWZfbGVuIDwgMCkKKwkJcmV0dXJuIGJ1Zl9sZW47CisJb3B0X2xlbiA9IChidWZfbGVuICsgMykgJiB+MzsKKworCS8qIHdlIG92ZXJ3cml0ZSBhbnkgZXhpc3Rpbmcgb3B0aW9ucyB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaAorCSAqIHJvb20gZm9yIHRoZSBDSVBTTyBvcHRpb24sIHRoZSByZWFzb24gaXMgdGhhdCB3ZSBfbmVlZF8gdG8gZ3VhcmFudGVlCisJICogdGhhdCB0aGUgc2VjdXJpdHkgbGFiZWwgaXMgYXBwbGllZCB0byB0aGUgcGFja2V0IC0gd2UgZG8gdGhlIHNhbWUKKwkgKiB0aGluZyB3aGVuIHVzaW5nIHRoZSBzb2NrZXQgb3B0aW9ucyBhbmQgaXQgaGFzbid0IGNhdXNlZCBhIHByb2JsZW0sCisJICogaWYgd2UgbmVlZCB0byB3ZSBjYW4gYWx3YXlzIHJldmlzaXQgdGhpcyBjaG9pY2UgbGF0ZXIgKi8KKworCWxlbl9kZWx0YSA9IG9wdF9sZW4gLSBvcHQtPm9wdGxlbjsKKwkvKiBpZiB3ZSBkb24ndCBlbnN1cmUgZW5vdWdoIGhlYWRyb29tIHdlIGNvdWxkIHBhbmljIG9uIHRoZSBza2JfcHVzaCgpCisJICogY2FsbCBiZWxvdyBzbyBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2gsIHdlIGFyZSBhbHNvICJtYW5nbGluZyIgdGhlCisJICogcGFja2V0IHNvIHdlIHNob3VsZCBwcm9iYWJseSBkbyBhIGNvcHktb24td3JpdGUgY2FsbCBhbnl3YXkgKi8KKwlyZXRfdmFsID0gc2tiX2Nvdyhza2IsIHNrYl9oZWFkcm9vbShza2IpICsgbGVuX2RlbHRhKTsKKwlpZiAocmV0X3ZhbCA8IDApCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKGxlbl9kZWx0YSA+IDApIHsKKwkJLyogd2UgYXNzdW1lIHRoYXQgdGhlIGhlYWRlciArIG9wdC0+b3B0bGVuIGhhdmUgYWxyZWFkeSBiZWVuCisJCSAqICJwdXNoZWQiIGluIGlwX29wdGlvbnNfYnVpbGQoKSBvciBzaW1pbGFyICovCisJCWlwaCA9IGlwX2hkcihza2IpOworCQlza2JfcHVzaChza2IsIGxlbl9kZWx0YSk7CisJCW1lbW1vdmUoKGNoYXIgKilpcGggLSBsZW5fZGVsdGEsIGlwaCwgaXBoLT5paGwgPDwgMik7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQlpcGggPSBpcF9oZHIoc2tiKTsKKwl9IGVsc2UgaWYgKGxlbl9kZWx0YSA8IDApIHsKKwkJaXBoID0gaXBfaGRyKHNrYik7CisJCW1lbXNldChpcGggKyAxLCBJUE9QVF9OT1AsIG9wdC0+b3B0bGVuKTsKKwl9IGVsc2UKKwkJaXBoID0gaXBfaGRyKHNrYik7CisKKwlpZiAob3B0LT5vcHRsZW4gPiAwKQorCQltZW1zZXQob3B0LCAwLCBzaXplb2YoKm9wdCkpOworCW9wdC0+b3B0bGVuID0gb3B0X2xlbjsKKwlvcHQtPmNpcHNvID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJb3B0LT5pc19jaGFuZ2VkID0gMTsKKworCS8qIHdlIGhhdmUgdG8gZG8gdGhlIGZvbGxvd2luZyBiZWNhdXNlIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSBhCisJICogbmV0ZmlsdGVyIGhvb2sgd2hpY2ggbWVhbnMgdGhlIHBhY2tldCBhbHJlYWR5IGhhcyBoYWQgdGhlIGhlYWRlcgorCSAqIGZpZWxkcyBwb3B1bGF0ZWQgYW5kIHRoZSBjaGVja3N1bSBjYWxjdWxhdGVkIC0geWVzIHRoaXMgbWVhbnMgd2UKKwkgKiBhcmUgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVlZGVkIGJ1dCB3ZSBkbyBpdCB0byBrZWVwIHRoZSBjb3JlCisJICogc3RhY2sgY2xlYW4gYW5kIHRpZHkgKi8KKwltZW1jcHkoaXBoICsgMSwgYnVmLCBidWZfbGVuKTsKKwlpZiAob3B0X2xlbiA+IGJ1Zl9sZW4pCisJCW1lbXNldCgoY2hhciAqKShpcGggKyAxKSArIGJ1Zl9sZW4sIDAsIG9wdF9sZW4gLSBidWZfbGVuKTsKKwlpZiAobGVuX2RlbHRhICE9IDApIHsKKwkJaXBoLT5paGwgPSA1ICsgKG9wdF9sZW4gPj4gMik7CisJCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwl9CisJaXBfc2VuZF9jaGVjayhpcGgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2lwc29fdjRfc2tidWZmX2RlbGF0dHIgLSBEZWxldGUgYW55IENJUFNPIG9wdGlvbnMgZnJvbSBhIHBhY2tldAorICogQHNrYjogdGhlIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBhbnkgYW5kIGFsbCBDSVBTTyBvcHRpb25zIGZyb20gdGhlIGdpdmVuIHBhY2tldC4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgY2lwc29fdjRfc2tidWZmX2RlbGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0X3ZhbDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gJklQQ0Ioc2tiKS0+b3B0OworCXVuc2lnbmVkIGNoYXIgKmNpcHNvX3B0cjsKKworCWlmIChvcHQtPmNpcHNvID09IDApCisJCXJldHVybiAwOworCisJLyogc2luY2Ugd2UgYXJlIGNoYW5naW5nIHRoZSBwYWNrZXQgd2Ugc2hvdWxkIG1ha2UgYSBjb3B5ICovCisJcmV0X3ZhbCA9IHNrYl9jb3coc2tiLCBza2JfaGVhZHJvb20oc2tiKSk7CisJaWYgKHJldF92YWwgPCAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCS8qIHRoZSBlYXNpZXN0IHRoaW5nIHRvIGRvIGlzIGp1c3QgcmVwbGFjZSB0aGUgY2lwc28gb3B0aW9uIHdpdGggbm9vcAorCSAqIG9wdGlvbnMgc2luY2Ugd2UgZG9uJ3QgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBwYWNrZXQsIGFsdGhvdWdoIHdlCisJICogc3RpbGwgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gKi8KKworCWlwaCA9IGlwX2hkcihza2IpOworCWNpcHNvX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopaXBoICsgb3B0LT5jaXBzbzsKKwltZW1zZXQoY2lwc29fcHRyLCBJUE9QVF9OT09QLCBjaXBzb19wdHJbMV0pOworCW9wdC0+Y2lwc28gPSAwOworCW9wdC0+aXNfY2hhbmdlZCA9IDE7CisKKwlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBjaXBzb192NF9za2J1ZmZfZ2V0YXR0ciAtIEdldCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBmcm9tIHRoZSBDSVBTTyBvcHRpb24KICAqIEBza2I6IHRoZSBwYWNrZXQKICAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IGIxMmRhZTIuLjUxNTRlNzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTEyODMsNyArMTI4Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkZXZpbmV0X2NvbmZfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorc3RhdGljIGludCBkZXZpbmV0X2NvbmZfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsCiAJCQkgICAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCSAgICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpAQCAtMTM3OSwxMiArMTM3OSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKK2ludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7Ci0JaW50IHJldCA9IGRldmluZXRfY29uZl9zeXNjdGwodGFibGUsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwKLQkJCQkgICAgICBuZXd2YWwsIG5ld2xlbik7CisJaW50IHJldCA9IGRldmluZXRfY29uZl9zeXNjdGwodGFibGUsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCXN0cnVjdCBuZXQgKm5ldCA9IHRhYmxlLT5leHRyYTI7CiAKIAlpZiAocmV0ID09IDEpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggNTVjMzU1ZS4uNzJiMmRlNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWNtcC5jCisrKyBiL25ldC9pcHY0L2ljbXAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKglORVQzOglJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNNUCBwcm90b2NvbCBsYXllci4KICAqCi0gKgkJQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCBmNzBmYWM2Li5hMGQ4NjQ1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC05LDcgKzksNyBAQAogICoJc2VlbXMgdG8gZmFsbCBvdXQgd2l0aCBnY2MgMi42LjIuCiAgKgogICoJQXV0aG9yczoKLSAqCQlBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTEyMzQsNiArMTIzNCw3IEBACiAJd3JpdGVfbG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOwogCWltLT5uZXh0PWluX2Rldi0+bWNfbGlzdDsKIAlpbl9kZXYtPm1jX2xpc3Q9aW07CisJaW5fZGV2LT5tY19jb3VudCsrOwogCXdyaXRlX3VubG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOwogI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKIAlpZ21wdjNfZGVsX2RlbHJlYyhpbl9kZXYsIGltLT5tdWx0aWFkZHIpOwpAQCAtMTI4Miw2ICsxMjgzLDcgQEAKIAkJCWlmICgtLWktPnVzZXJzID09IDApIHsKIAkJCQl3cml0ZV9sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CiAJCQkJKmlwID0gaS0+bmV4dDsKKwkJCQlpbl9kZXYtPm1jX2NvdW50LS07CiAJCQkJd3JpdGVfdW5sb2NrX2JoKCZpbl9kZXYtPm1jX2xpc3RfbG9jayk7CiAJCQkJaWdtcF9ncm91cF9kcm9wcGVkKGkpOwogCkBAIC0xMzMwLDYgKzEzMzIsNyBAQAogCXNldHVwX3RpbWVyKCZpbl9kZXYtPm1yX2dxX3RpbWVyLCBpZ21wX2dxX3RpbWVyX2V4cGlyZSwKIAkJCSh1bnNpZ25lZCBsb25nKWluX2Rldik7CiAJaW5fZGV2LT5tcl9pZmNfY291bnQgPSAwOworCWluX2Rldi0+bWNfY291bnQgICAgID0gMDsKIAlzZXR1cF90aW1lcigmaW5fZGV2LT5tcl9pZmNfdGltZXIsIGlnbXBfaWZjX3RpbWVyX2V4cGlyZSwKIAkJCSh1bnNpZ25lZCBsb25nKWluX2Rldik7CiAJaW5fZGV2LT5tcl9xcnYgPSBJR01QX1Vuc29saWNpdGVkX1JlcG9ydF9Db3VudDsKQEAgLTEzNjksOCArMTM3Miw4IEBACiAJd3JpdGVfbG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOwogCXdoaWxlICgoaSA9IGluX2Rldi0+bWNfbGlzdCkgIT0gTlVMTCkgewogCQlpbl9kZXYtPm1jX2xpc3QgPSBpLT5uZXh0OworCQlpbl9kZXYtPm1jX2NvdW50LS07CiAJCXdyaXRlX3VubG9ja19iaCgmaW5fZGV2LT5tY19saXN0X2xvY2spOwotCiAJCWlnbXBfZ3JvdXBfZHJvcHBlZChpKTsKIAkJaXBfbWFfcHV0KGkpOwogCkBAIC0yMzgzLDcgKzIzODYsNyBAQAogCiAJCWlmIChzdGF0ZS0+aW5fZGV2LT5tY19saXN0ID09IGltKSB7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIiVkXHQlLTEwczogJTVkICU3c1xuIiwKLQkJCQkgICBzdGF0ZS0+ZGV2LT5pZmluZGV4LCBzdGF0ZS0+ZGV2LT5uYW1lLCBzdGF0ZS0+ZGV2LT5tY19jb3VudCwgcXVlcmllcik7CisJCQkJICAgc3RhdGUtPmRldi0+aWZpbmRleCwgc3RhdGUtPmRldi0+bmFtZSwgc3RhdGUtPmluX2Rldi0+bWNfY291bnQsIHF1ZXJpZXIpOwogCQl9CiAKIAkJc2VxX3ByaW50ZihzZXEsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwppbmRleCAwYzFhZTY4ZS4uYmQxMjc4YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYworKysgYi9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCkBAIC0zMCwyMCArMzAsMjIgQEAKICNlbmRpZgogCiAvKgotICogVGhpcyBhcnJheSBob2xkcyB0aGUgZmlyc3QgYW5kIGxhc3QgbG9jYWwgcG9ydCBudW1iZXIuCisgKiBUaGlzIHN0cnVjdCBob2xkcyB0aGUgZmlyc3QgYW5kIGxhc3QgbG9jYWwgcG9ydCBudW1iZXIuCiAgKi8KLWludCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsyXSA9IHsgMzI3NjgsIDYxMDAwIH07Ci1ERUZJTkVfU0VRTE9DSyhzeXNjdGxfcG9ydF9yYW5nZV9sb2NrKTsKK3N0cnVjdCBsb2NhbF9wb3J0cyBzeXNjdGxfbG9jYWxfcG9ydHMgX19yZWFkX21vc3RseSA9IHsKKwkubG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQsCisJLnJhbmdlID0geyAzMjc2OCwgNjEwMDAgfSwKK307CiAKIHZvaWQgaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShpbnQgKmxvdywgaW50ICpoaWdoKQogewogCXVuc2lnbmVkIHNlcTsKIAlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnN5c2N0bF9wb3J0X3JhbmdlX2xvY2spOworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZzeXNjdGxfbG9jYWxfcG9ydHMubG9jayk7CiAKLQkJKmxvdyA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdOwotCQkqaGlnaCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzFdOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnN5c2N0bF9wb3J0X3JhbmdlX2xvY2ssIHNlcSkpOworCQkqbG93ID0gc3lzY3RsX2xvY2FsX3BvcnRzLnJhbmdlWzBdOworCQkqaGlnaCA9IHN5c2N0bF9sb2NhbF9wb3J0cy5yYW5nZVsxXTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZzeXNjdGxfbG9jYWxfcG9ydHMubG9jaywgc2VxKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2UpOwogCkBAIC0zMzUsNiArMzM3LDcgQEAKIAkJCQkJLnNhZGRyID0gaXJlcS0+bG9jX2FkZHIsCiAJCQkJCS50b3MgPSBSVF9DT05OX0ZMQUdTKHNrKSB9IH0sCiAJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sLAorCQkJICAgIC5mbGFncyA9IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJICAgIC51bGlfdSA9IHsgLnBvcnRzID0KIAkJCQkgICAgICAgeyAuc3BvcnQgPSBpbmV0X3NrKHNrKS0+c3BvcnQsCiAJCQkJCSAuZHBvcnQgPSBpcmVxLT5ybXRfcG9ydCB9IH0gfTsKQEAgLTUxNSw2ICs1MTgsOCBAQAogCQluZXdpY3NrLT5pY3NrX2JpbmRfaGFzaCA9IE5VTEw7CiAKIAkJaW5ldF9zayhuZXdzayktPmRwb3J0ID0gaW5ldF9yc2socmVxKS0+cm10X3BvcnQ7CisJCWluZXRfc2sobmV3c2spLT5udW0gPSBudG9ocyhpbmV0X3JzayhyZXEpLT5sb2NfcG9ydCk7CisJCWluZXRfc2sobmV3c2spLT5zcG9ydCA9IGluZXRfcnNrKHJlcSktPmxvY19wb3J0OwogCQluZXdzay0+c2tfd3JpdGVfc3BhY2UgPSBza19zdHJlYW1fd3JpdGVfc3BhY2U7CiAKIAkJbmV3aWNzay0+aWNza19yZXRyYW5zbWl0cyA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2RpYWcuYyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCmluZGV4IGMxMDAzNmUuLjg5Y2IwNDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZGlhZy5jCisrKyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCkBAIC03ODIsMTEgKzc4MiwxNSBAQAogCQlzdHJ1Y3Qgc29jayAqc2s7CiAJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCisJCW51bSA9IDA7CisKKwkJaWYgKGhsaXN0X2VtcHR5KCZoZWFkLT5jaGFpbikgJiYgaGxpc3RfZW1wdHkoJmhlYWQtPnR3Y2hhaW4pKQorCQkJY29udGludWU7CisKIAkJaWYgKGkgPiBzX2kpCiAJCQlzX251bSA9IDA7CiAKIAkJcmVhZF9sb2NrX2JoKGxvY2spOwotCQludW0gPSAwOwogCQlza19mb3JfZWFjaChzaywgbm9kZSwgJmhlYWQtPmNoYWluKSB7CiAJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKaW5kZXggZDk4NWJkNi4uMWM1ZmQzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKQEAgLTEyNiw2ICsxMjYsNyBAQAogCQl0dy0+dHdfcmV1c2UJICAgID0gc2stPnNrX3JldXNlOwogCQl0dy0+dHdfaGFzaAkgICAgPSBzay0+c2tfaGFzaDsKIAkJdHctPnR3X2lwdjZvbmx5CSAgICA9IDA7CisJCXR3LT50d190cmFuc3BhcmVudCAgPSBpbmV0LT50cmFuc3BhcmVudDsKIAkJdHctPnR3X3Byb3QJICAgID0gc2stPnNrX3Byb3RfY3JlYXRvcjsKIAkJdHdza19uZXRfc2V0KHR3LCBob2xkX25ldChzb2NrX25ldChzaykpKTsKIAkJYXRvbWljX3NldCgmdHctPnR3X3JlZmNudCwgMSk7CkBAIC00MDksMyArNDEwLDM4IEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdkcl90d2NhbF90aWNrKTsKKwordm9pZCBpbmV0X3R3c2tfcHVyZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCisJCSAgICAgc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICp0d2RyLCBpbnQgZmFtaWx5KQoreworCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3OworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlpbnQgaDsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlmb3IgKGggPSAwOyBoIDwgKGhhc2hpbmZvLT5laGFzaF9zaXplKTsgaCsrKSB7CisJCXN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldCAqaGVhZCA9CisJCQlpbmV0X2VoYXNoX2J1Y2tldChoYXNoaW5mbywgaCk7CisJCXJ3bG9ja190ICpsb2NrID0gaW5ldF9laGFzaF9sb2NrcChoYXNoaW5mbywgaCk7CityZXN0YXJ0OgorCQl3cml0ZV9sb2NrKGxvY2spOworCQlza19mb3JfZWFjaChzaywgbm9kZSwgJmhlYWQtPnR3Y2hhaW4pIHsKKworCQkJdHcgPSBpbmV0X3R3c2soc2spOworCQkJaWYgKCFuZXRfZXEodHdza19uZXQodHcpLCBuZXQpIHx8CisJCQkgICAgdHctPnR3X2ZhbWlseSAhPSBmYW1pbHkpCisJCQkJY29udGludWU7CisKKwkJCWF0b21pY19pbmMoJnR3LT50d19yZWZjbnQpOworCQkJd3JpdGVfdW5sb2NrKGxvY2spOworCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUodHcsIHR3ZHIpOworCQkJaW5ldF90d3NrX3B1dCh0dyk7CisKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQl3cml0ZV91bmxvY2sobG9jayk7CisJfQorCWxvY2FsX2JoX2VuYWJsZSgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF90d3NrX3B1cmdlKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCmluZGV4IDIxNTJkMjIuLmU0ZjgxZjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKKysrIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwpAQCAtNiw3ICs2LDcgQEAKICAqCQlUaGUgSVAgZnJhZ21lbnRhdGlvbiBmdW5jdGlvbmFsaXR5LgogICoKICAqIEF1dGhvcnM6CUZyZWQgTi4gdmFuIEtlbXBlbiA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+Ci0gKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoKICAqIEZpeGVzOgogICoJCUFsYW4gQ294CToJU3BsaXQgZnJvbSBpcC5jICwgc2VlIGlwX2lucHV0LmMgZm9yIGhpc3RvcnkuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IDJhNjExNTguLjg1YzQ4N2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC00MSw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CisjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogCiAjaWZkZWYgQ09ORklHX0lQVjYKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgpAQCAtMTE3LDggKzExOSwxMCBAQAogICAgQWxleGV5IEt1em5ldHNvdi4KICAqLwogCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19vcHMgaXBncmVfbGlua19vcHMgX19yZWFkX21vc3RseTsKIHN0YXRpYyBpbnQgaXBncmVfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBpcGdyZV90dW5uZWxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlwZ3JlX3R1bm5lbF9iaW5kX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogLyogRmFsbGJhY2sgdHVubmVsOiBubyBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uLCBubyBrZXksIG5vIG9wdGlvbnMgKi8KIApAQCAtMTYzLDM4ICsxNjcsNjQgQEAKIC8qIEdpdmVuIHNyYywgZHN0IGFuZCBrZXksIGZpbmQgYXBwcm9wcmlhdGUgZm9yIGlucHV0IHR1bm5lbC4gKi8KIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGdyZV90dW5uZWxfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKLQkJX19iZTMyIHJlbW90ZSwgX19iZTMyIGxvY2FsLCBfX2JlMzIga2V5KQorCQkJCQkgICAgICBfX2JlMzIgcmVtb3RlLCBfX2JlMzIgbG9jYWwsCisJCQkJCSAgICAgIF9fYmUzMiBrZXksIF9fYmUxNiBncmVfcHJvdG8pCiB7CiAJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CiAJdW5zaWduZWQgaDEgPSBIQVNIKGtleSk7CiAJc3RydWN0IGlwX3R1bm5lbCAqdDsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0MiA9IE5VTEw7CiAJc3RydWN0IGlwZ3JlX25ldCAqaWduID0gbmV0X2dlbmVyaWMobmV0LCBpcGdyZV9uZXRfaWQpOworCWludCBkZXZfdHlwZSA9IChncmVfcHJvdG8gPT0gaHRvbnMoRVRIX1BfVEVCKSkgPworCQkgICAgICAgQVJQSFJEX0VUSEVSIDogQVJQSFJEX0lQR1JFOwogCiAJZm9yICh0ID0gaWduLT50dW5uZWxzX3JfbFtoMF5oMV07IHQ7IHQgPSB0LT5uZXh0KSB7CiAJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYgcmVtb3RlID09IHQtPnBhcm1zLmlwaC5kYWRkcikgewotCQkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQotCQkJCXJldHVybiB0OworCQkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiB0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJaWYgKHQtPmRldi0+dHlwZSA9PSBkZXZfdHlwZSkKKwkJCQkJcmV0dXJuIHQ7CisJCQkJaWYgKHQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSVBHUkUgJiYgIXQyKQorCQkJCQl0MiA9IHQ7CisJCQl9CiAJCX0KIAl9CisKIAlmb3IgKHQgPSBpZ24tPnR1bm5lbHNfcltoMF5oMV07IHQ7IHQgPSB0LT5uZXh0KSB7CiAJCWlmIChyZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKSB7Ci0JCQlpZiAodC0+cGFybXMuaV9rZXkgPT0ga2V5ICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCi0JCQkJcmV0dXJuIHQ7CisJCQlpZiAodC0+cGFybXMuaV9rZXkgPT0ga2V5ICYmIHQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJCQlpZiAodC0+ZGV2LT50eXBlID09IGRldl90eXBlKQorCQkJCQlyZXR1cm4gdDsKKwkJCQlpZiAodC0+ZGV2LT50eXBlID09IEFSUEhSRF9JUEdSRSAmJiAhdDIpCisJCQkJCXQyID0gdDsKKwkJCX0KIAkJfQogCX0KKwogCWZvciAodCA9IGlnbi0+dHVubmVsc19sW2gxXTsgdDsgdCA9IHQtPm5leHQpIHsKIAkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciB8fAogCQkgICAgIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguZGFkZHIgJiYKIAkJICAgICAgaXB2NF9pc19tdWx0aWNhc3QobG9jYWwpKSkgewotCQkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiAodC0+ZGV2LT5mbGFncyZJRkZfVVApKQotCQkJCXJldHVybiB0OworCQkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiB0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJaWYgKHQtPmRldi0+dHlwZSA9PSBkZXZfdHlwZSkKKwkJCQkJcmV0dXJuIHQ7CisJCQkJaWYgKHQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSVBHUkUgJiYgIXQyKQorCQkJCQl0MiA9IHQ7CisJCQl9CiAJCX0KIAl9CisKIAlmb3IgKHQgPSBpZ24tPnR1bm5lbHNfd2NbaDFdOyB0OyB0ID0gdC0+bmV4dCkgewotCQlpZiAodC0+cGFybXMuaV9rZXkgPT0ga2V5ICYmICh0LT5kZXYtPmZsYWdzJklGRl9VUCkpCi0JCQlyZXR1cm4gdDsKKwkJaWYgKHQtPnBhcm1zLmlfa2V5ID09IGtleSAmJiB0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQlpZiAodC0+ZGV2LT50eXBlID09IGRldl90eXBlKQorCQkJCXJldHVybiB0OworCQkJaWYgKHQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSVBHUkUgJiYgIXQyKQorCQkJCXQyID0gdDsKKwkJfQogCX0KIAorCWlmICh0MikKKwkJcmV0dXJuIHQyOworCiAJaWYgKGlnbi0+ZmJfdHVubmVsX2Rldi0+ZmxhZ3MmSUZGX1VQKQogCQlyZXR1cm4gbmV0ZGV2X3ByaXYoaWduLT5mYl90dW5uZWxfZGV2KTsKIAlyZXR1cm4gTlVMTDsKQEAgLTI0OSwyNSArMjc5LDM3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwZ3JlX3R1bm5lbF9sb2NhdGUoc3RydWN0IG5ldCAqbmV0LAotCQlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQorc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKmlwZ3JlX3R1bm5lbF9maW5kKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJICAgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcywKKwkJCQkJICAgaW50IHR5cGUpCiB7CiAJX19iZTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7CiAJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlfX2JlMzIga2V5ID0gcGFybXMtPmlfa2V5OwotCXN0cnVjdCBpcF90dW5uZWwgKnQsICoqdHAsICpudDsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwOworCXN0cnVjdCBpcGdyZV9uZXQgKmlnbiA9IG5ldF9nZW5lcmljKG5ldCwgaXBncmVfbmV0X2lkKTsKKworCWZvciAodHAgPSBfX2lwZ3JlX2J1Y2tldChpZ24sIHBhcm1zKTsgKHQgPSAqdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpCisJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYKKwkJICAgIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIgJiYKKwkJICAgIGtleSA9PSB0LT5wYXJtcy5pX2tleSAmJgorCQkgICAgdHlwZSA9PSB0LT5kZXYtPnR5cGUpCisJCQlicmVhazsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwZ3JlX3R1bm5lbF9sb2NhdGUoc3RydWN0IG5ldCAqbmV0LAorCQlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zLCBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBpcF90dW5uZWwgKnQsICpudDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAJc3RydWN0IGlwZ3JlX25ldCAqaWduID0gbmV0X2dlbmVyaWMobmV0LCBpcGdyZV9uZXRfaWQpOwogCi0JZm9yICh0cCA9IF9faXBncmVfYnVja2V0KGlnbiwgcGFybXMpOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgewotCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyICYmIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIpIHsKLQkJCWlmIChrZXkgPT0gdC0+cGFybXMuaV9rZXkpCi0JCQkJcmV0dXJuIHQ7Ci0JCX0KLQl9Ci0JaWYgKCFjcmVhdGUpCi0JCXJldHVybiBOVUxMOworCXQgPSBpcGdyZV90dW5uZWxfZmluZChuZXQsIHBhcm1zLCBBUlBIUkRfSVBHUkUpOworCWlmICh0IHx8ICFjcmVhdGUpCisJCXJldHVybiB0OwogCiAJaWYgKHBhcm1zLT5uYW1lWzBdKQogCQlzdHJsY3B5KG5hbWUsIHBhcm1zLT5uYW1lLCBJRk5BTVNJWik7CkBAIC0yODUsOSArMzI3LDExIEBACiAJCQlnb3RvIGZhaWxlZF9mcmVlOwogCX0KIAotCWRldi0+aW5pdCA9IGlwZ3JlX3R1bm5lbF9pbml0OwogCW50ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAludC0+cGFybXMgPSAqcGFybXM7CisJZGV2LT5ydG5sX2xpbmtfb3BzID0gJmlwZ3JlX2xpbmtfb3BzOworCisJZGV2LT5tdHUgPSBpcGdyZV90dW5uZWxfYmluZF9kZXYoZGV2KTsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KSA8IDApCiAJCWdvdG8gZmFpbGVkX2ZyZWU7CkBAIC0zODAsOCArNDI0LDkgQEAKIAogCXJlYWRfbG9jaygmaXBncmVfbG9jayk7CiAJdCA9IGlwZ3JlX3R1bm5lbF9sb29rdXAoZGV2X25ldChza2ItPmRldiksIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsCi0JCQkoZmxhZ3MmR1JFX0tFWSkgPwotCQkJKigoKF9fYmUzMiopcCkgKyAoZ3JlaGxlbj4+MikgLSAxKSA6IDApOworCQkJCWZsYWdzICYgR1JFX0tFWSA/CisJCQkJKigoKF9fYmUzMiAqKXApICsgKGdyZWhsZW4gLyA0KSAtIDEpIDogMCwKKwkJCQlwWzFdKTsKIAlpZiAodCA9PSBOVUxMIHx8IHQtPnBhcm1zLmlwaC5kYWRkciA9PSAwIHx8CiAJICAgIGlwdjRfaXNfbXVsdGljYXN0KHQtPnBhcm1zLmlwaC5kYWRkcikpCiAJCWdvdG8gb3V0OwpAQCAtNDMxLDYgKzQ3Niw4IEBACiAJdTMyICAgIHNlcW5vID0gMDsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CiAJaW50ICAgIG9mZnNldCA9IDQ7CisJX19iZTE2IGdyZV9wcm90bzsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMTYpKQogCQlnb3RvIGRyb3Bfbm9sb2NrOwpAQCAtNDcwLDIwICs1MTcsMjIgQEAKIAkJfQogCX0KIAorCWdyZV9wcm90byA9ICooX19iZTE2ICopKGggKyAyKTsKKwogCXJlYWRfbG9jaygmaXBncmVfbG9jayk7CiAJaWYgKCh0dW5uZWwgPSBpcGdyZV90dW5uZWxfbG9va3VwKGRldl9uZXQoc2tiLT5kZXYpLAotCQkJCQlpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBrZXkpKSAhPSBOVUxMKSB7CisJCQkJCSAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwga2V5LAorCQkJCQkgIGdyZV9wcm90bykpKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0dW5uZWwtPmRldi0+c3RhdHM7CiAKIAkJc2VjcGF0aF9yZXNldChza2IpOwogCi0JCXNrYi0+cHJvdG9jb2wgPSAqKF9fYmUxNiopKGggKyAyKTsKKwkJc2tiLT5wcm90b2NvbCA9IGdyZV9wcm90bzsKIAkJLyogV0NDUCB2ZXJzaW9uIDEgYW5kIDIgcHJvdG9jb2wgZGVjb2RpbmcuCiAJCSAqIC0gQ2hhbmdlIHByb3RvY29sIHRvIElQCiAJCSAqIC0gV2hlbiBkZWFsaW5nIHdpdGggV0NDUHYyLCBTa2lwIGV4dHJhIDQgYnl0ZXMgaW4gR1JFIGhlYWRlcgogCQkgKi8KLQkJaWYgKGZsYWdzID09IDAgJiYKLQkJICAgIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfV0NDUCkpIHsKKwkJaWYgKGZsYWdzID09IDAgJiYgZ3JlX3Byb3RvID09IGh0b25zKEVUSF9QX1dDQ1ApKSB7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCQkJaWYgKCgqKGggKyBvZmZzZXQpICYgMHhGMCkgIT0gMHg0MCkKIAkJCQlvZmZzZXQgKz0gNDsKQEAgLTQ5MSw3ICs1NDAsNiBAQAogCiAJCXNrYi0+bWFjX2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAJCV9fcHNrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKLQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG9mZnNldCk7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKICNpZmRlZiBDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVApAQCAtNTE5LDEzICs1NjcsMzIgQEAKIAkJCX0KIAkJCXR1bm5lbC0+aV9zZXFubyA9IHNlcW5vICsgMTsKIAkJfQorCisJCWxlbiA9IHNrYi0+bGVuOworCisJCS8qIFdhcm5pbmc6IEFsbCBza2IgcG9pbnRlcnMgd2lsbCBiZSBpbnZhbGlkYXRlZCEgKi8KKwkJaWYgKHR1bm5lbC0+ZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgeworCQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSB7CisJCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQkJZ290byBkcm9wOworCQkJfQorCisJCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHR1bm5lbC0+ZGV2KTsKKwkJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIGV0aF9oZHIoc2tiKSwgRVRIX0hMRU4pOworCQl9CisKIAkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKLQkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gbGVuOwogCQlza2ItPmRldiA9IHR1bm5lbC0+ZGV2OwogCQlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJCXNrYi0+ZHN0ID0gTlVMTDsKIAkJbmZfcmVzZXQoc2tiKTsKKworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJaXBncmVfZWNuX2RlY2Fwc3VsYXRlKGlwaCwgc2tiKTsKKwogCQluZXRpZl9yeChza2IpOwogCQlyZWFkX3VubG9jaygmaXBncmVfbG9jayk7CiAJCXJldHVybigwKTsKQEAgLTU2MCw3ICs2MjcsMTAgQEAKIAkJZ290byB0eF9lcnJvcjsKIAl9CiAKLQlpZiAoZGV2LT5oZWFkZXJfb3BzKSB7CisJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCisJCUlQQ0Ioc2tiKS0+ZmxhZ3MgPSAwOworCisJaWYgKGRldi0+aGVhZGVyX29wcyAmJiBkZXYtPnR5cGUgPT0gQVJQSFJEX0lQR1JFKSB7CiAJCWdyZV9obGVuID0gMDsKIAkJdGlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKIAl9IGVsc2UgewpAQCAtNjM3LDcgKzcwNyw3IEBACiAKIAlkZiA9IHRpcGgtPmZyYWdfb2ZmOwogCWlmIChkZikKLQkJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHR1bm5lbC0+aGxlbjsKKwkJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIGRldi0+aGFyZF9oZWFkZXJfbGVuIC0gdHVubmVsLT5obGVuOwogCWVsc2UKIAkJbXR1ID0gc2tiLT5kc3QgPyBkc3RfbXR1KHNrYi0+ZHN0KSA6IGRldi0+bXR1OwogCkBAIC03MDMsNyArNzczLDcgQEAKIAkJb2xkX2lwaCA9IGlwX2hkcihza2IpOwogCX0KIAotCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlza2JfcHVzaChza2IsIGdyZV9obGVuKTsKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwpAQCAtNzM2LDggKzgwNiw5IEBACiAJCQlpcGgtPnR0bCA9IGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCk7CiAJfQogCi0JKChfX2JlMTYqKShpcGgrMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOwotCSgoX19iZTE2KikoaXBoKzEpKVsxXSA9IHNrYi0+cHJvdG9jb2w7CisJKChfX2JlMTYgKikoaXBoICsgMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOworCSgoX19iZTE2ICopKGlwaCArIDEpKVsxXSA9IChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKSA/CisJCQkJICAgaHRvbnMoRVRIX1BfVEVCKSA6IHNrYi0+cHJvdG9jb2w7CiAKIAlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJihHUkVfS0VZfEdSRV9DU1VNfEdSRV9TRVEpKSB7CiAJCV9fYmUzMiAqcHRyID0gKF9fYmUzMiopKCgodTgqKWlwaCkgKyB0dW5uZWwtPmhsZW4gLSA0KTsKQEAgLTc3Myw3ICs4NDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpcGdyZV90dW5uZWxfYmluZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgaXBncmVfdHVubmVsX2JpbmRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXYgPSBOVUxMOwogCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbDsKQEAgLTc4NSw3ICs4NTYsNyBAQAogCXR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAJaXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwogCi0JLyogR3Vlc3Mgb3V0cHV0IGRldmljZSB0byBjaG9vc2UgcmVhc29uYWJsZSBtdHUgYW5kIGhhcmRfaGVhZGVyX2xlbiAqLworCS8qIEd1ZXNzIG91dHB1dCBkZXZpY2UgdG8gY2hvb3NlIHJlYXNvbmFibGUgbXR1IGFuZCBuZWVkZWRfaGVhZHJvb20gKi8KIAogCWlmIChpcGgtPmRhZGRyKSB7CiAJCXN0cnVjdCBmbG93aSBmbCA9IHsgLm9pZiA9IHR1bm5lbC0+cGFybXMubGluaywKQEAgLTc5OSwxNCArODcwLDE2IEBACiAJCQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKIAkJCWlwX3J0X3B1dChydCk7CiAJCX0KLQkJZGV2LT5mbGFncyB8PSBJRkZfUE9JTlRPUE9JTlQ7CisKKwkJaWYgKGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCisJCQlkZXYtPmZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKIAl9CiAKIAlpZiAoIXRkZXYgJiYgdHVubmVsLT5wYXJtcy5saW5rKQogCQl0ZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGRldl9uZXQoZGV2KSwgdHVubmVsLT5wYXJtcy5saW5rKTsKIAogCWlmICh0ZGV2KSB7Ci0JCWhsZW4gPSB0ZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCWhsZW4gPSB0ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyB0ZGV2LT5uZWVkZWRfaGVhZHJvb207CiAJCW10dSA9IHRkZXYtPm10dTsKIAl9CiAJZGV2LT5pZmxpbmsgPSB0dW5uZWwtPnBhcm1zLmxpbms7CkBAIC04MjAsMTAgKzg5MywxNSBAQAogCQlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJkdSRV9TRVEpCiAJCQlhZGRlbmQgKz0gNDsKIAl9Ci0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBobGVuICsgYWRkZW5kOwotCWRldi0+bXR1ID0gbXR1IC0gYWRkZW5kOworCWRldi0+bmVlZGVkX2hlYWRyb29tID0gYWRkZW5kICsgaGxlbjsKKwltdHUgLT0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBhZGRlbmQ7CisKKwlpZiAobXR1IDwgNjgpCisJCW10dSA9IDY4OworCiAJdHVubmVsLT5obGVuID0gYWRkZW5kOwogCisJcmV0dXJuIG10dTsKIH0KIAogc3RhdGljIGludApAQCAtOTE3LDcgKzk5NSw3IEBACiAJCQkJdC0+cGFybXMuaXBoLmZyYWdfb2ZmID0gcC5pcGguZnJhZ19vZmY7CiAJCQkJaWYgKHQtPnBhcm1zLmxpbmsgIT0gcC5saW5rKSB7CiAJCQkJCXQtPnBhcm1zLmxpbmsgPSBwLmxpbms7Ci0JCQkJCWlwZ3JlX3R1bm5lbF9iaW5kX2RldihkZXYpOworCQkJCQlkZXYtPm10dSA9IGlwZ3JlX3R1bm5lbF9iaW5kX2RldihkZXYpOwogCQkJCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CiAJCQkJfQogCQkJfQpAQCAtOTU5LDcgKzEwMzcsOCBAQAogc3RhdGljIGludCBpcGdyZV90dW5uZWxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOwotCWlmIChuZXdfbXR1IDwgNjggfHwgbmV3X210dSA+IDB4RkZGOCAtIHR1bm5lbC0+aGxlbikKKwlpZiAobmV3X210dSA8IDY4IHx8CisJICAgIG5ld19tdHUgPiAweEZGRjggLSBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIHR1bm5lbC0+aGxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwogCXJldHVybiAwOwpAQCAtMTA3OCw2ICsxMTU3LDcgQEAKIAogc3RhdGljIHZvaWQgaXBncmVfdHVubmVsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJZGV2LT5pbml0CQk9IGlwZ3JlX3R1bm5lbF9pbml0OwogCWRldi0+dW5pbml0CQk9IGlwZ3JlX3R1bm5lbF91bmluaXQ7CiAJZGV2LT5kZXN0cnVjdG9yIAk9IGZyZWVfbmV0ZGV2OwogCWRldi0+aGFyZF9zdGFydF94bWl0CT0gaXBncmVfdHVubmVsX3htaXQ7CkBAIC0xMDg1LDcgKzExNjUsNyBAQAogCWRldi0+Y2hhbmdlX210dQkJPSBpcGdyZV90dW5uZWxfY2hhbmdlX210dTsKIAogCWRldi0+dHlwZQkJPSBBUlBIUkRfSVBHUkU7Ci0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gCT0gTExfTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgNDsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSAJPSBMTF9NQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OwogCWRldi0+bXR1CQk9IEVUSF9EQVRBX0xFTiAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0gNDsKIAlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKIAlkZXYtPmlmbGluawkJPSAwOwpAQCAtMTEwNyw4ICsxMTg3LDYgQEAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnR1bm5lbC0+cGFybXMuaXBoLnNhZGRyLCA0KTsKIAltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZ0dW5uZWwtPnBhcm1zLmlwaC5kYWRkciwgNCk7CiAKLQlpcGdyZV90dW5uZWxfYmluZF9kZXYoZGV2KTsKLQogCWlmIChpcGgtPmRhZGRyKSB7CiAjaWZkZWYgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QKIAkJaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwaC0+ZGFkZHIpKSB7CkBAIC0xMTg5LDYgKzEyNjcsNyBAQAogCiAJaWduLT5mYl90dW5uZWxfZGV2LT5pbml0ID0gaXBncmVfZmJfdHVubmVsX2luaXQ7CiAJZGV2X25ldF9zZXQoaWduLT5mYl90dW5uZWxfZGV2LCBuZXQpOworCWlnbi0+ZmJfdHVubmVsX2Rldi0+cnRubF9saW5rX29wcyA9ICZpcGdyZV9saW5rX29wczsKIAogCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGlnbi0+ZmJfdHVubmVsX2RldikpKQogCQlnb3RvIGVycl9yZWdfZGV2OwpAQCAtMTIyMSw2ICsxMzAwLDI5OCBAQAogCS5leGl0ID0gaXBncmVfZXhpdF9uZXQsCiB9OwogCitzdGF0aWMgaW50IGlwZ3JlX3R1bm5lbF92YWxpZGF0ZShzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCit7CisJX19iZTE2IGZsYWdzOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCWZsYWdzID0gMDsKKwlpZiAoZGF0YVtJRkxBX0dSRV9JRkxBR1NdKQorCQlmbGFncyB8PSBubGFfZ2V0X2JlMTYoZGF0YVtJRkxBX0dSRV9JRkxBR1NdKTsKKwlpZiAoZGF0YVtJRkxBX0dSRV9PRkxBR1NdKQorCQlmbGFncyB8PSBubGFfZ2V0X2JlMTYoZGF0YVtJRkxBX0dSRV9PRkxBR1NdKTsKKwlpZiAoZmxhZ3MgJiAoR1JFX1ZFUlNJT058R1JFX1JPVVRJTkcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwZ3JlX3RhcF92YWxpZGF0ZShzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCit7CisJX19iZTMyIGRhZGRyOworCisJaWYgKHRiW0lGTEFfQUREUkVTU10pIHsKKwkJaWYgKG5sYV9sZW4odGJbSUZMQV9BRERSRVNTXSkgIT0gRVRIX0FMRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5sYV9kYXRhKHRiW0lGTEFfQUREUkVTU10pKSkKKwkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwl9CisKKwlpZiAoIWRhdGEpCisJCWdvdG8gb3V0OworCisJaWYgKGRhdGFbSUZMQV9HUkVfUkVNT1RFXSkgeworCQltZW1jcHkoJmRhZGRyLCBubGFfZGF0YShkYXRhW0lGTEFfR1JFX1JFTU9URV0pLCA0KTsKKwkJaWYgKCFkYWRkcikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworb3V0OgorCXJldHVybiBpcGdyZV90dW5uZWxfdmFsaWRhdGUodGIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBpcGdyZV9uZXRsaW5rX3Bhcm1zKHN0cnVjdCBubGF0dHIgKmRhdGFbXSwKKwkJCQlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zKQoreworCW1lbXNldChwYXJtcywgMCwgc2l6ZW9mKCpwYXJtcykpOworCisJcGFybXMtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fR1JFOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YVtJRkxBX0dSRV9MSU5LXSkKKwkJcGFybXMtPmxpbmsgPSBubGFfZ2V0X3UzMihkYXRhW0lGTEFfR1JFX0xJTktdKTsKKworCWlmIChkYXRhW0lGTEFfR1JFX0lGTEFHU10pCisJCXBhcm1zLT5pX2ZsYWdzID0gbmxhX2dldF9iZTE2KGRhdGFbSUZMQV9HUkVfSUZMQUdTXSk7CisKKwlpZiAoZGF0YVtJRkxBX0dSRV9PRkxBR1NdKQorCQlwYXJtcy0+b19mbGFncyA9IG5sYV9nZXRfYmUxNihkYXRhW0lGTEFfR1JFX09GTEFHU10pOworCisJaWYgKGRhdGFbSUZMQV9HUkVfSUtFWV0pCisJCXBhcm1zLT5pX2tleSA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfR1JFX0lLRVldKTsKKworCWlmIChkYXRhW0lGTEFfR1JFX09LRVldKQorCQlwYXJtcy0+b19rZXkgPSBubGFfZ2V0X2JlMzIoZGF0YVtJRkxBX0dSRV9PS0VZXSk7CisKKwlpZiAoZGF0YVtJRkxBX0dSRV9MT0NBTF0pCisJCXBhcm1zLT5pcGguc2FkZHIgPSBubGFfZ2V0X2JlMzIoZGF0YVtJRkxBX0dSRV9MT0NBTF0pOworCisJaWYgKGRhdGFbSUZMQV9HUkVfUkVNT1RFXSkKKwkJcGFybXMtPmlwaC5kYWRkciA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfR1JFX1JFTU9URV0pOworCisJaWYgKGRhdGFbSUZMQV9HUkVfVFRMXSkKKwkJcGFybXMtPmlwaC50dGwgPSBubGFfZ2V0X3U4KGRhdGFbSUZMQV9HUkVfVFRMXSk7CisKKwlpZiAoZGF0YVtJRkxBX0dSRV9UT1NdKQorCQlwYXJtcy0+aXBoLnRvcyA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0dSRV9UT1NdKTsKKworCWlmICghZGF0YVtJRkxBX0dSRV9QTVRVRElTQ10gfHwgbmxhX2dldF91OChkYXRhW0lGTEFfR1JFX1BNVFVESVNDXSkpCisJCXBhcm1zLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7Cit9CisKK3N0YXRpYyBpbnQgaXBncmVfdGFwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CisKKwl0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdHVubmVsLT5kZXYgPSBkZXY7CisJc3RyY3B5KHR1bm5lbC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKKworCWlwZ3JlX3R1bm5lbF9iaW5kX2RldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwZ3JlX3RhcF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCWRldi0+aW5pdAkJPSBpcGdyZV90YXBfaW5pdDsKKwlkZXYtPnVuaW5pdAkJPSBpcGdyZV90dW5uZWxfdW5pbml0OworCWRldi0+ZGVzdHJ1Y3RvciAJPSBmcmVlX25ldGRldjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGlwZ3JlX3R1bm5lbF94bWl0OworCWRldi0+Y2hhbmdlX210dQkJPSBpcGdyZV90dW5uZWxfY2hhbmdlX210dTsKKworCWRldi0+aWZsaW5rCQk9IDA7CisJZGV2LT5mZWF0dXJlcwkJfD0gTkVUSUZfRl9ORVROU19MT0NBTDsKK30KKworc3RhdGljIGludCBpcGdyZV9uZXdsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBubGF0dHIgKnRiW10sCisJCQkgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQoreworCXN0cnVjdCBpcF90dW5uZWwgKm50OworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXBncmVfbmV0ICppZ24gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwZ3JlX25ldF9pZCk7CisJaW50IG10dTsKKwlpbnQgZXJyOworCisJbnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWlwZ3JlX25ldGxpbmtfcGFybXMoZGF0YSwgJm50LT5wYXJtcyk7CisKKwlpZiAoaXBncmVfdHVubmVsX2ZpbmQobmV0LCAmbnQtPnBhcm1zLCBkZXYtPnR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSICYmICF0YltJRkxBX0FERFJFU1NdKQorCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKKworCW10dSA9IGlwZ3JlX3R1bm5lbF9iaW5kX2RldihkZXYpOworCWlmICghdGJbSUZMQV9NVFVdKQorCQlkZXYtPm10dSA9IG10dTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZGV2X2hvbGQoZGV2KTsKKwlpcGdyZV90dW5uZWxfbGluayhpZ24sIG50KTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXBncmVfY2hhbmdlbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmxhdHRyICp0YltdLAorCQkJICAgIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqbnQ7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCXN0cnVjdCBpcGdyZV9uZXQgKmlnbiA9IG5ldF9nZW5lcmljKG5ldCwgaXBncmVfbmV0X2lkKTsKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKwlpbnQgbXR1OworCisJaWYgKGRldiA9PSBpZ24tPmZiX3R1bm5lbF9kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJbnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWlwZ3JlX25ldGxpbmtfcGFybXMoZGF0YSwgJnApOworCisJdCA9IGlwZ3JlX3R1bm5lbF9sb2NhdGUobmV0LCAmcCwgMCk7CisKKwlpZiAodCkgeworCQlpZiAodC0+ZGV2ICE9IGRldikKKwkJCXJldHVybiAtRUVYSVNUOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIG5mbGFncyA9IDA7CisKKwkJdCA9IG50OworCisJCWlmIChpcHY0X2lzX211bHRpY2FzdChwLmlwaC5kYWRkcikpCisJCQluZmxhZ3MgPSBJRkZfQlJPQURDQVNUOworCQllbHNlIGlmIChwLmlwaC5kYWRkcikKKwkJCW5mbGFncyA9IElGRl9QT0lOVE9QT0lOVDsKKworCQlpZiAoKGRldi0+ZmxhZ3MgXiBuZmxhZ3MpICYKKwkJICAgIChJRkZfUE9JTlRPUE9JTlQgfCBJRkZfQlJPQURDQVNUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlwZ3JlX3R1bm5lbF91bmxpbmsoaWduLCB0KTsKKwkJdC0+cGFybXMuaXBoLnNhZGRyID0gcC5pcGguc2FkZHI7CisJCXQtPnBhcm1zLmlwaC5kYWRkciA9IHAuaXBoLmRhZGRyOworCQl0LT5wYXJtcy5pX2tleSA9IHAuaV9rZXk7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmcC5pcGguc2FkZHIsIDQpOworCQltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZwLmlwaC5kYWRkciwgNCk7CisJCWlwZ3JlX3R1bm5lbF9saW5rKGlnbiwgdCk7CisJCW5ldGRldl9zdGF0ZV9jaGFuZ2UoZGV2KTsKKwl9CisKKwl0LT5wYXJtcy5vX2tleSA9IHAub19rZXk7CisJdC0+cGFybXMuaXBoLnR0bCA9IHAuaXBoLnR0bDsKKwl0LT5wYXJtcy5pcGgudG9zID0gcC5pcGgudG9zOworCXQtPnBhcm1zLmlwaC5mcmFnX29mZiA9IHAuaXBoLmZyYWdfb2ZmOworCisJaWYgKHQtPnBhcm1zLmxpbmsgIT0gcC5saW5rKSB7CisJCXQtPnBhcm1zLmxpbmsgPSBwLmxpbms7CisJCW10dSA9IGlwZ3JlX3R1bm5lbF9iaW5kX2RldihkZXYpOworCQlpZiAoIXRiW0lGTEFfTVRVXSkKKwkJCWRldi0+bXR1ID0gbXR1OworCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgaXBncmVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4KKwkJLyogSUZMQV9HUkVfTElOSyAqLworCQlubGFfdG90YWxfc2l6ZSg0KSArCisJCS8qIElGTEFfR1JFX0lGTEFHUyAqLworCQlubGFfdG90YWxfc2l6ZSgyKSArCisJCS8qIElGTEFfR1JFX09GTEFHUyAqLworCQlubGFfdG90YWxfc2l6ZSgyKSArCisJCS8qIElGTEFfR1JFX0lLRVkgKi8KKwkJbmxhX3RvdGFsX3NpemUoNCkgKworCQkvKiBJRkxBX0dSRV9PS0VZICovCisJCW5sYV90b3RhbF9zaXplKDQpICsKKwkJLyogSUZMQV9HUkVfTE9DQUwgKi8KKwkJbmxhX3RvdGFsX3NpemUoNCkgKworCQkvKiBJRkxBX0dSRV9SRU1PVEUgKi8KKwkJbmxhX3RvdGFsX3NpemUoNCkgKworCQkvKiBJRkxBX0dSRV9UVEwgKi8KKwkJbmxhX3RvdGFsX3NpemUoMSkgKworCQkvKiBJRkxBX0dSRV9UT1MgKi8KKwkJbmxhX3RvdGFsX3NpemUoMSkgKworCQkvKiBJRkxBX0dSRV9QTVRVRElTQyAqLworCQlubGFfdG90YWxfc2l6ZSgxKSArCisJCTA7Cit9CisKK3N0YXRpYyBpbnQgaXBncmVfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwID0gJnQtPnBhcm1zOworCisJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX0dSRV9MSU5LLCBwLT5saW5rKTsKKwlOTEFfUFVUX0JFMTYoc2tiLCBJRkxBX0dSRV9JRkxBR1MsIHAtPmlfZmxhZ3MpOworCU5MQV9QVVRfQkUxNihza2IsIElGTEFfR1JFX09GTEFHUywgcC0+b19mbGFncyk7CisJTkxBX1BVVF9CRTMyKHNrYiwgSUZMQV9HUkVfSUtFWSwgcC0+aV9rZXkpOworCU5MQV9QVVRfQkUzMihza2IsIElGTEFfR1JFX09LRVksIHAtPm9fa2V5KTsKKwlOTEFfUFVUX0JFMzIoc2tiLCBJRkxBX0dSRV9MT0NBTCwgcC0+aXBoLnNhZGRyKTsKKwlOTEFfUFVUX0JFMzIoc2tiLCBJRkxBX0dSRV9SRU1PVEUsIHAtPmlwaC5kYWRkcik7CisJTkxBX1BVVF9VOChza2IsIElGTEFfR1JFX1RUTCwgcC0+aXBoLnR0bCk7CisJTkxBX1BVVF9VOChza2IsIElGTEFfR1JFX1RPUywgcC0+aXBoLnRvcyk7CisJTkxBX1BVVF9VOChza2IsIElGTEFfR1JFX1BNVFVESVNDLCAhIShwLT5pcGguZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlwZ3JlX3BvbGljeVtJRkxBX0dSRV9NQVggKyAxXSA9IHsKKwlbSUZMQV9HUkVfTElOS10JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSUZMQV9HUkVfSUZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lGTEFfR1JFX09GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtJRkxBX0dSRV9JS0VZXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJRkxBX0dSRV9PS0VZXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJRkxBX0dSRV9MT0NBTF0JPSB7IC5sZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IGlwaGRyLCBzYWRkcikgfSwKKwlbSUZMQV9HUkVfUkVNT1RFXQk9IHsgLmxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgaXBoZHIsIGRhZGRyKSB9LAorCVtJRkxBX0dSRV9UVExdCQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbSUZMQV9HUkVfVE9TXQkJPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW0lGTEFfR1JFX1BNVFVESVNDXQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBpcGdyZV9saW5rX29wcyBfX3JlYWRfbW9zdGx5ID0geworCS5raW5kCQk9ICJncmUiLAorCS5tYXh0eXBlCT0gSUZMQV9HUkVfTUFYLAorCS5wb2xpY3kJCT0gaXBncmVfcG9saWN5LAorCS5wcml2X3NpemUJPSBzaXplb2Yoc3RydWN0IGlwX3R1bm5lbCksCisJLnNldHVwCQk9IGlwZ3JlX3R1bm5lbF9zZXR1cCwKKwkudmFsaWRhdGUJPSBpcGdyZV90dW5uZWxfdmFsaWRhdGUsCisJLm5ld2xpbmsJPSBpcGdyZV9uZXdsaW5rLAorCS5jaGFuZ2VsaW5rCT0gaXBncmVfY2hhbmdlbGluaywKKwkuZ2V0X3NpemUJPSBpcGdyZV9nZXRfc2l6ZSwKKwkuZmlsbF9pbmZvCT0gaXBncmVfZmlsbF9pbmZvLAorfTsKKworc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfb3BzIGlwZ3JlX3RhcF9vcHMgX19yZWFkX21vc3RseSA9IHsKKwkua2luZAkJPSAiZ3JldGFwIiwKKwkubWF4dHlwZQk9IElGTEFfR1JFX01BWCwKKwkucG9saWN5CQk9IGlwZ3JlX3BvbGljeSwKKwkucHJpdl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF90dW5uZWwpLAorCS5zZXR1cAkJPSBpcGdyZV90YXBfc2V0dXAsCisJLnZhbGlkYXRlCT0gaXBncmVfdGFwX3ZhbGlkYXRlLAorCS5uZXdsaW5rCT0gaXBncmVfbmV3bGluaywKKwkuY2hhbmdlbGluawk9IGlwZ3JlX2NoYW5nZWxpbmssCisJLmdldF9zaXplCT0gaXBncmVfZ2V0X3NpemUsCisJLmZpbGxfaW5mbwk9IGlwZ3JlX2ZpbGxfaW5mbywKK307CisKIC8qCiAgKglBbmQgbm93IHRoZSBtb2R1bGVzIGNvZGUgYW5kIGtlcm5lbCBpbnRlcmZhY2UuCiAgKi8KQEAgLTEyMzgsMTkgKzE2MDksMzkgQEAKIAogCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9nZW5fZGV2aWNlKCZpcGdyZV9uZXRfaWQsICZpcGdyZV9uZXRfb3BzKTsKIAlpZiAoZXJyIDwgMCkKLQkJaW5ldF9kZWxfcHJvdG9jb2woJmlwZ3JlX3Byb3RvY29sLCBJUFBST1RPX0dSRSk7CisJCWdvdG8gZ2VuX2RldmljZV9mYWlsZWQ7CiAKKwllcnIgPSBydG5sX2xpbmtfcmVnaXN0ZXIoJmlwZ3JlX2xpbmtfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBydG5sX2xpbmtfZmFpbGVkOworCisJZXJyID0gcnRubF9saW5rX3JlZ2lzdGVyKCZpcGdyZV90YXBfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB0YXBfb3BzX2ZhaWxlZDsKKworb3V0OgogCXJldHVybiBlcnI7CisKK3RhcF9vcHNfZmFpbGVkOgorCXJ0bmxfbGlua191bnJlZ2lzdGVyKCZpcGdyZV9saW5rX29wcyk7CitydG5sX2xpbmtfZmFpbGVkOgorCXVucmVnaXN0ZXJfcGVybmV0X2dlbl9kZXZpY2UoaXBncmVfbmV0X2lkLCAmaXBncmVfbmV0X29wcyk7CitnZW5fZGV2aWNlX2ZhaWxlZDoKKwlpbmV0X2RlbF9wcm90b2NvbCgmaXBncmVfcHJvdG9jb2wsIElQUFJPVE9fR1JFKTsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwZ3JlX2Zpbmkodm9pZCkKIHsKKwlydG5sX2xpbmtfdW5yZWdpc3RlcigmaXBncmVfdGFwX29wcyk7CisJcnRubF9saW5rX3VucmVnaXN0ZXIoJmlwZ3JlX2xpbmtfb3BzKTsKKwl1bnJlZ2lzdGVyX3Blcm5ldF9nZW5fZGV2aWNlKGlwZ3JlX25ldF9pZCwgJmlwZ3JlX25ldF9vcHMpOwogCWlmIChpbmV0X2RlbF9wcm90b2NvbCgmaXBncmVfcHJvdG9jb2wsIElQUFJPVE9fR1JFKSA8IDApCiAJCXByaW50ayhLRVJOX0lORk8gImlwZ3JlIGNsb3NlOiBjYW4ndCByZW1vdmUgcHJvdG9jb2xcbiIpOwotCi0JdW5yZWdpc3Rlcl9wZXJuZXRfZ2VuX2RldmljZShpcGdyZV9uZXRfaWQsICZpcGdyZV9uZXRfb3BzKTsKIH0KIAogbW9kdWxlX2luaXQoaXBncmVfaW5pdCk7CiBtb2R1bGVfZXhpdChpcGdyZV9maW5pKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19SVE5MX0xJTksoImdyZSIpOworTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiZ3JldGFwIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9pbnB1dC5jIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwppbmRleCBlMGJlZDU2Li44NjE5NzhhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L2lwX2lucHV0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBBdXRob3JzOglSb3NzIEJpcm8KICAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KICAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KLSAqCQlBbGFuIENveCwgPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCQlBbGFuIENveCwgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCQlSaWNoYXJkIFVuZGVyd29vZAogICoJCVN0ZWZhbiBCZWNrZXIsIDxzdGVmYW5iQHllbGxvLnBpbmcuZGU+CiAgKgkJSm9yZ2UgQ3dpaywgPGpvcmdlQGxhc2VyLnNhdGxpbmsubmV0PgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IGJlM2YxOGEuLjJjODhkYTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCQlvcHQtPmNpcHNvID0gb3B0cHRyIC0gaXBoOwotCQkJaWYgKGNpcHNvX3Y0X3ZhbGlkYXRlKCZvcHRwdHIpKSB7CisJCQlpZiAoY2lwc29fdjRfdmFsaWRhdGUoc2tiLCAmb3B0cHRyKSkgewogCQkJCXBwX3B0ciA9IG9wdHB0cjsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBkNTMzYTg5Li5kMmE4ZjhiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtMzQwLDYgKzM0MCw3IEBACiAJCQkJCQkJLnNhZGRyID0gaW5ldC0+c2FkZHIsCiAJCQkJCQkJLnRvcyA9IFJUX0NPTk5fRkxBR1Moc2spIH0gfSwKIAkJCQkJICAgIC5wcm90byA9IHNrLT5za19wcm90b2NvbCwKKwkJCQkJICAgIC5mbGFncyA9IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQogCQkJCQkJICAgICAgIHsgLnNwb3J0ID0gaW5ldC0+c3BvcnQsCiAJCQkJCQkJIC5kcG9ydCA9IGluZXQtPmRwb3J0IH0gfSB9OwpAQCAtMTM3MSw3ICsxMzcyLDggQEAKIAkJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQogCQkJCQkgICAgICAgeyAuc3BvcnQgPSB0Y3BfaGRyKHNrYiktPmRlc3QsCiAJCQkJCQkgLmRwb3J0ID0gdGNwX2hkcihza2IpLT5zb3VyY2UgfSB9LAotCQkJCSAgICAucHJvdG8gPSBzay0+c2tfcHJvdG9jb2wgfTsKKwkJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sLAorCQkJCSAgICAuZmxhZ3MgPSBpcF9yZXBseV9hcmdfZmxvd2lfZmxhZ3MoYXJnKSB9OwogCQlzZWN1cml0eV9za2JfY2xhc3NpZnlfZmxvdyhza2IsICZmbCk7CiAJCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KHNvY2tfbmV0KHNrKSwgJnJ0LCAmZmwpKQogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKaW5kZXggMTA1ZDkyYS4uNDY1YWJmMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYworKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC00MTksNyArNDE5LDcgQEAKIAkJCSAgICAgKDE8PElQX1RUTCkgfCAoMTw8SVBfSERSSU5DTCkgfAogCQkJICAgICAoMTw8SVBfTVRVX0RJU0NPVkVSKSB8ICgxPDxJUF9SRUNWRVJSKSB8CiAJCQkgICAgICgxPDxJUF9ST1VURVJfQUxFUlQpIHwgKDE8PElQX0ZSRUVCSU5EKSB8Ci0JCQkgICAgICgxPDxJUF9QQVNTU0VDKSkpIHx8CisJCQkgICAgICgxPDxJUF9QQVNTU0VDKSB8ICgxPDxJUF9UUkFOU1BBUkVOVCkpKSB8fAogCSAgICBvcHRuYW1lID09IElQX01VTFRJQ0FTVF9UVEwgfHwKIAkgICAgb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfTE9PUCkgewogCQlpZiAob3B0bGVuID49IHNpemVvZihpbnQpKSB7CkBAIC04NzgsNiArODc4LDE2IEBACiAJCWVyciA9IHhmcm1fdXNlcl9wb2xpY3koc2ssIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIAkJYnJlYWs7CiAKKwljYXNlIElQX1RSQU5TUEFSRU5UOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvcHRsZW4gPCAxKQorCQkJZ290byBlX2ludmFsOworCQlpbmV0LT50cmFuc3BhcmVudCA9ICEhdmFsOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC0xMTMwLDYgKzExNDAsOSBAQAogCWNhc2UgSVBfRlJFRUJJTkQ6CiAJCXZhbCA9IGluZXQtPmZyZWViaW5kOwogCQlicmVhazsKKwljYXNlIElQX1RSQU5TUEFSRU5UOgorCQl2YWwgPSBpbmV0LT50cmFuc3BhcmVudDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCA0YzZkMmNhLi4yOTYwOWQyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC00MSw3ICs0MSw3IEBACiAJCU1hZGUgdGhlIHR1bm5lbHMgdXNlIGRldi0+bmFtZSBub3QgdHVubmVsOiB3aGVuIGVycm9yIHJlcG9ydGluZy4KIAkJQWRkZWQgdHhfZHJvcHBlZCBzdGF0CiAKLQkJLUFsYW4gQ294CShBbGFuLkNveEBsaW51eC5vcmcpIDIxIE1hcmNoIDk1CisJCS1BbGFuIENveAkoYWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrKSAyMSBNYXJjaCA5NQogCiAJUmV3b3JrZWQ6CiAJCUNoYW5nZWQgdG8gdHVubmVsIHRvIGRlc3RpbmF0aW9uIGdhdGV3YXkgaW4gYWRkaXRpb24gdG8gdGhlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggYzUxOWI4ZC4uYjQyZTA4MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKglJUCBtdWx0aWNhc3Qgcm91dGluZyBzdXBwb3J0IGZvciBtcm91dGVkIDMuNi8zLjgKICAqCi0gKgkJKGMpIDE5OTUgQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+CisgKgkJKGMpIDE5OTUgQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkgIExpbnV4IENvbnN1bHRhbmN5IGFuZCBDdXN0b20gRHJpdmVyIERldmVsb3BtZW50CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9LY29uZmlnIGIvbmV0L2lwdjQvaXB2cy9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQwYzNmLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jCi0jIElQIFZpcnR1YWwgU2VydmVyIGNvbmZpZ3VyYXRpb24KLSMKLW1lbnVjb25maWcgSVBfVlMKLQl0cmlzdGF0ZSAiSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUgotCS0tLWhlbHAtLS0KLQkgIElQIFZpcnR1YWwgU2VydmVyIHN1cHBvcnQgd2lsbCBsZXQgeW91IGJ1aWxkIGEgaGlnaC1wZXJmb3JtYW5jZQotCSAgdmlydHVhbCBzZXJ2ZXIgYmFzZWQgb24gY2x1c3RlciBvZiB0d28gb3IgbW9yZSByZWFsIHNlcnZlcnMuIFRoaXMKLQkgIG9wdGlvbiBtdXN0IGJlIGVuYWJsZWQgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2x1c3RlcmVkIGNvbXB1dGVycwotCSAgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBpbnRlcmNlcHRpbmcgaW5jb21pbmcgY29ubmVjdGlvbnMgdG8gYQotCSAgc2luZ2xlIElQIGFkZHJlc3MgYW5kIHNjaGVkdWxpbmcgdGhlbSB0byByZWFsIHNlcnZlcnMuCi0KLQkgIFRocmVlIHJlcXVlc3QgZGlzcGF0Y2hpbmcgdGVjaG5pcXVlcyBhcmUgaW1wbGVtZW50ZWQsIHRoZXkgYXJlCi0JICB2aXJ0dWFsIHNlcnZlciB2aWEgTkFULCB2aXJ0dWFsIHNlcnZlciB2aWEgdHVubmVsaW5nIGFuZCB2aXJ0dWFsCi0JICBzZXJ2ZXIgdmlhIGRpcmVjdCByb3V0aW5nLiBUaGUgc2V2ZXJhbCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgY2FuCi0JICBiZSB1c2VkIHRvIGNob29zZSB3aGljaCBzZXJ2ZXIgdGhlIGNvbm5lY3Rpb24gaXMgZGlyZWN0ZWQgdG8sCi0JICB0aHVzIGxvYWQgYmFsYW5jaW5nIGNhbiBiZSBhY2hpZXZlZCBhbW9uZyB0aGUgc2VydmVycy4gIEZvciBtb3JlCi0JICBpbmZvcm1hdGlvbiBhbmQgaXRzIGFkbWluaXN0cmF0aW9uIHByb2dyYW0sIHBsZWFzZSB2aXNpdCB0aGUKLQkgIGZvbGxvd2luZyBVUkw6IDxodHRwOi8vd3d3LmxpbnV4dmlydHVhbHNlcnZlci5vcmcvPi4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKLQkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotaWYgSVBfVlMKLQotY29uZmlnCUlQX1ZTX0RFQlVHCi0JYm9vbCAiSVAgdmlydHVhbCBzZXJ2ZXIgZGVidWdnaW5nIgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZ2V0IGFkZGl0aW9uYWwgbWVzc2FnZXMgdXNlZnVsIGluCi0JICBkZWJ1Z2dpbmcgdGhlIElQIHZpcnR1YWwgc2VydmVyIGNvZGUuIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWJ1ZwotCSAgbGV2ZWwgaW4gL3Byb2Mvc3lzL25ldC9pcHY0L3ZzL2RlYnVnX2xldmVsCi0KLWNvbmZpZwlJUF9WU19UQUJfQklUUwotCWludCAiSVBWUyBjb25uZWN0aW9uIHRhYmxlIHNpemUgKHRoZSBOdGggcG93ZXIgb2YgMikiCi0JZGVmYXVsdCAiMTIiIAotCS0tLWhlbHAtLS0KLQkgIFRoZSBJUFZTIGNvbm5lY3Rpb24gaGFzaCB0YWJsZSB1c2VzIHRoZSBjaGFpbmluZyBzY2hlbWUgdG8gaGFuZGxlCi0JICBoYXNoIGNvbGxpc2lvbnMuIFVzaW5nIGEgYmlnIElQVlMgY29ubmVjdGlvbiBoYXNoIHRhYmxlIHdpbGwgZ3JlYXRseQotCSAgcmVkdWNlIGNvbmZsaWN0cyB3aGVuIHRoZXJlIGFyZSBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2YgY29ubmVjdGlvbnMKLQkgIGluIHRoZSBoYXNoIHRhYmxlLgotCi0JICBOb3RlIHRoZSB0YWJsZSBzaXplIG11c3QgYmUgcG93ZXIgb2YgMi4gVGhlIHRhYmxlIHNpemUgd2lsbCBiZSB0aGUKLQkgIHZhbHVlIG9mIDIgdG8gdGhlIHlvdXIgaW5wdXQgbnVtYmVyIHBvd2VyLiBUaGUgbnVtYmVyIHRvIGNob29zZSBpcwotCSAgZnJvbSA4IHRvIDIwLCB0aGUgZGVmYXVsdCBudW1iZXIgaXMgMTIsIHdoaWNoIG1lYW5zIHRoZSB0YWJsZSBzaXplCi0JICBpcyA0MDk2LiBEb24ndCBpbnB1dCB0aGUgbnVtYmVyIHRvbyBzbWFsbCwgb3RoZXJ3aXNlIHlvdSB3aWxsIGxvc2UKLQkgIHBlcmZvcm1hbmNlIG9uIGl0LiBZb3UgY2FuIGFkYXB0IHRoZSB0YWJsZSBzaXplIHlvdXJzZWxmLCBhY2NvcmRpbmcKLQkgIHRvIHlvdXIgdmlydHVhbCBzZXJ2ZXIgYXBwbGljYXRpb24uIEl0IGlzIGdvb2QgdG8gc2V0IHRoZSB0YWJsZSBzaXplCi0JICBub3QgZmFyIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBzZWNvbmQgbXVsdGlwbHlpbmcKLQkgIGF2ZXJhZ2UgbGFzdGluZyB0aW1lIG9mIGNvbm5lY3Rpb24gaW4gdGhlIHRhYmxlLiAgRm9yIGV4YW1wbGUsIHlvdXIKLQkgIHZpcnR1YWwgc2VydmVyIGdldHMgMjAwIGNvbm5lY3Rpb25zIHBlciBzZWNvbmQsIHRoZSBjb25uZWN0aW9uIGxhc3RzCi0JICBmb3IgMjAwIHNlY29uZHMgaW4gYXZlcmFnZSBpbiB0aGUgY29ubmVjdGlvbiB0YWJsZSwgdGhlIHRhYmxlIHNpemUKLQkgIHNob3VsZCBiZSBub3QgZmFyIGxlc3MgdGhhbiAyMDB4MjAwLCBpdCBpcyBnb29kIHRvIHNldCB0aGUgdGFibGUKLQkgIHNpemUgMzI3NjggKDIqKjE1KS4KLQotCSAgQW5vdGhlciBub3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIG9jY3VwaWVzIDEyOCBieXRlcyBlZmZlY3RpdmVseSBhbmQKLQkgIGVhY2ggaGFzaCBlbnRyeSB1c2VzIDggYnl0ZXMsIHNvIHlvdSBjYW4gZXN0aW1hdGUgaG93IG11Y2ggbWVtb3J5IGlzCi0JICBuZWVkZWQgZm9yIHlvdXIgYm94LgotCi1jb21tZW50ICJJUFZTIHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgotCi1jb25maWcJSVBfVlNfUFJPVE9fVENQCi0JYm9vbCAiVENQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBUQ1AgdHJhbnNwb3J0Ci0JICBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgotCi1jb25maWcJSVBfVlNfUFJPVE9fVURQCi0JYm9vbCAiVURQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBVRFAgdHJhbnNwb3J0Ci0JICBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgotCi1jb25maWcJSVBfVlNfUFJPVE9fRVNQCi0JYm9vbCAiRVNQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBFU1AgKEVuY2Fwc3VsYXRpb24KLQkgIFNlY3VyaXR5IFBheWxvYWQpIHRyYW5zcG9ydCBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgotCi1jb25maWcJSVBfVlNfUFJPVE9fQUgKLQlib29sICJBSCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgbG9hZCBiYWxhbmNpbmcgQUggKEF1dGhlbnRpY2F0aW9uCi0JICBIZWFkZXIpIHRyYW5zcG9ydCBwcm90b2NvbC4gU2F5IFkgaWYgdW5zdXJlLgotCi1jb21tZW50ICJJUFZTIHNjaGVkdWxlciIKLQotY29uZmlnCUlQX1ZTX1JSCi0JdHJpc3RhdGUgInJvdW5kLXJvYmluIHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIHJvYmluLXJvYmluIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHNpbXBseSBkaXJlY3RzIG5ldHdvcmsKLQkgIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCByZWFsIHNlcnZlcnMgaW4gYSByb3VuZC1yb2JpbiBtYW5uZXIuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCi0gCi1jb25maWcJSVBfVlNfV1JSCi0gICAgICAgIHRyaXN0YXRlICJ3ZWlnaHRlZCByb3VuZC1yb2JpbiBzY2hlZHVsaW5nIiAKLQktLS1oZWxwLS0tCi0JICBUaGUgd2VpZ2h0ZWQgcm9iaW4tcm9iaW4gc2NoZWR1bGluZyBhbGdvcml0aG0gZGlyZWN0cyBuZXR3b3JrCi0JICBjb25uZWN0aW9ucyB0byBkaWZmZXJlbnQgcmVhbCBzZXJ2ZXJzIGJhc2VkIG9uIHNlcnZlciB3ZWlnaHRzCi0JICBpbiBhIHJvdW5kLXJvYmluIG1hbm5lci4gU2VydmVycyB3aXRoIGhpZ2hlciB3ZWlnaHRzIHJlY2VpdmUKLQkgIG5ldyBjb25uZWN0aW9ucyBmaXJzdCB0aGFuIHRob3NlIHdpdGggbGVzcyB3ZWlnaHRzLCBhbmQgc2VydmVycwotCSAgd2l0aCBoaWdoZXIgd2VpZ2h0cyBnZXQgbW9yZSBjb25uZWN0aW9ucyB0aGFuIHRob3NlIHdpdGggbGVzcwotCSAgd2VpZ2h0cyBhbmQgc2VydmVycyB3aXRoIGVxdWFsIHdlaWdodHMgZ2V0IGVxdWFsIGNvbm5lY3Rpb25zLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQotCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcJSVBfVlNfTEMKLSAgICAgICAgdHJpc3RhdGUgImxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyIKLQktLS1oZWxwLS0tCi0JICBUaGUgbGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIGFsZ29yaXRobSBkaXJlY3RzIG5ldHdvcmsKLQkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgbGVhc3QgbnVtYmVyIG9mIGFjdGl2ZSAKLQkgIGNvbm5lY3Rpb25zLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQotCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcJSVBfVlNfV0xDCi0gICAgICAgIHRyaXN0YXRlICJ3ZWlnaHRlZCBsZWFzdC1jb25uZWN0aW9uIHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIHdlaWdodGVkIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyBhbGdvcml0aG0gZGlyZWN0cyBuZXR3b3JrCi0JICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyIHdpdGggdGhlIGxlYXN0IGFjdGl2ZSBjb25uZWN0aW9ucwotCSAgbm9ybWFsaXplZCBieSB0aGUgc2VydmVyIHdlaWdodC4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKLQkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnCUlQX1ZTX0xCTEMKLQl0cmlzdGF0ZSAibG9jYWxpdHktYmFzZWQgbGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIgotCS0tLWhlbHAtLS0KLQkgIFRoZSBsb2NhbGl0eS1iYXNlZCBsZWFzdC1jb25uZWN0aW9uIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGlzIGZvcgotCSAgZGVzdGluYXRpb24gSVAgbG9hZCBiYWxhbmNpbmcuIEl0IGlzIHVzdWFsbHkgdXNlZCBpbiBjYWNoZSBjbHVzdGVyLgotCSAgVGhpcyBhbGdvcml0aG0gdXN1YWxseSBkaXJlY3RzIHBhY2tldCBkZXN0aW5lZCBmb3IgYW4gSVAgYWRkcmVzcyB0bwotCSAgaXRzIHNlcnZlciBpZiB0aGUgc2VydmVyIGlzIGFsaXZlIGFuZCB1bmRlciBsb2FkLiBJZiB0aGUgc2VydmVyIGlzCi0JICBvdmVybG9hZGVkIChpdHMgYWN0aXZlIGNvbm5lY3Rpb24gbnVtYmVycyBpcyBsYXJnZXIgdGhhbiBpdHMgd2VpZ2h0KQotCSAgYW5kIHRoZXJlIGlzIGEgc2VydmVyIGluIGl0cyBoYWxmIGxvYWQsIHRoZW4gYWxsb2NhdGUgdGhlIHdlaWdodGVkCi0JICBsZWFzdC1jb25uZWN0aW9uIHNlcnZlciB0byB0aGlzIElQIGFkZHJlc3MuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyAgSVBfVlNfTEJMQ1IKLQl0cmlzdGF0ZSAibG9jYWxpdHktYmFzZWQgbGVhc3QtY29ubmVjdGlvbiB3aXRoIHJlcGxpY2F0aW9uIHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIGxvY2FsaXR5LWJhc2VkIGxlYXN0LWNvbm5lY3Rpb24gd2l0aCByZXBsaWNhdGlvbiBzY2hlZHVsaW5nCi0JICBhbGdvcml0aG0gaXMgYWxzbyBmb3IgZGVzdGluYXRpb24gSVAgbG9hZCBiYWxhbmNpbmcuIEl0IGlzIAotCSAgdXN1YWxseSB1c2VkIGluIGNhY2hlIGNsdXN0ZXIuIEl0IGRpZmZlcnMgZnJvbSB0aGUgTEJMQyBzY2hlZHVsaW5nCi0JICBhcyBmb2xsb3dzOiB0aGUgbG9hZCBiYWxhbmNlciBtYWludGFpbnMgbWFwcGluZ3MgZnJvbSBhIHRhcmdldAotCSAgdG8gYSBzZXQgb2Ygc2VydmVyIG5vZGVzIHRoYXQgY2FuIHNlcnZlIHRoZSB0YXJnZXQuIFJlcXVlc3RzIGZvcgotCSAgYSB0YXJnZXQgYXJlIGFzc2lnbmVkIHRvIHRoZSBsZWFzdC1jb25uZWN0aW9uIG5vZGUgaW4gdGhlIHRhcmdldCdzCi0JICBzZXJ2ZXIgc2V0LiBJZiBhbGwgdGhlIG5vZGUgaW4gdGhlIHNlcnZlciBzZXQgYXJlIG92ZXIgbG9hZGVkLAotCSAgaXQgcGlja3MgdXAgYSBsZWFzdC1jb25uZWN0aW9uIG5vZGUgaW4gdGhlIGNsdXN0ZXIgYW5kIGFkZHMgaXQKLQkgIGluIHRoZSBzZXZlciBzZXQgZm9yIHRoZSB0YXJnZXQuIElmIHRoZSBzZXJ2ZXIgc2V0IGhhcyBub3QgYmVlbgotCSAgbW9kaWZpZWQgZm9yIHRoZSBzcGVjaWZpZWQgdGltZSwgdGhlIG1vc3QgbG9hZGVkIG5vZGUgaXMgcmVtb3ZlZAotCSAgZnJvbSB0aGUgc2VydmVyIHNldCwgaW4gb3JkZXIgdG8gYXZvaWQgaGlnaCBkZWdyZWUgb2YgcmVwbGljYXRpb24uCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZwlJUF9WU19ESAotCXRyaXN0YXRlICJkZXN0aW5hdGlvbiBoYXNoaW5nIHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIGRlc3RpbmF0aW9uIGhhc2hpbmcgc2NoZWR1bGluZyBhbGdvcml0aG0gYXNzaWducyBuZXR3b3JrCi0JICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVycyB0aHJvdWdoIGxvb2tpbmcgdXAgYSBzdGF0aWNhbGx5IGFzc2lnbmVkCi0JICBoYXNoIHRhYmxlIGJ5IHRoZWlyIGRlc3RpbmF0aW9uIElQIGFkZHJlc3Nlcy4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKLQkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnCUlQX1ZTX1NICi0JdHJpc3RhdGUgInNvdXJjZSBoYXNoaW5nIHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIHNvdXJjZSBoYXNoaW5nIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFzc2lnbnMgbmV0d29yawotCSAgY29ubmVjdGlvbnMgdG8gdGhlIHNlcnZlcnMgdGhyb3VnaCBsb29raW5nIHVwIGEgc3RhdGljYWxseSBhc3NpZ25lZAotCSAgaGFzaCB0YWJsZSBieSB0aGVpciBzb3VyY2UgSVAgYWRkcmVzc2VzLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQotCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcJSVBfVlNfU0VECi0JdHJpc3RhdGUgInNob3J0ZXN0IGV4cGVjdGVkIGRlbGF5IHNjaGVkdWxpbmciCi0JLS0taGVscC0tLQotCSAgVGhlIHNob3J0ZXN0IGV4cGVjdGVkIGRlbGF5IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFzc2lnbnMgbmV0d29yawotCSAgY29ubmVjdGlvbnMgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBzaG9ydGVzdCBleHBlY3RlZCBkZWxheS4gVGhlIAotCSAgZXhwZWN0ZWQgZGVsYXkgdGhhdCB0aGUgam9iIHdpbGwgZXhwZXJpZW5jZSBpcyAoQ2kgKyAxKSAvIFVpIGlmIAotCSAgc2VudCB0byB0aGUgaXRoIHNlcnZlciwgaW4gd2hpY2ggQ2kgaXMgdGhlIG51bWJlciBvZiBjb25uZWN0aW9ucwotCSAgb24gdGhlIGl0aCBzZXJ2ZXIgYW5kIFVpIGlzIHRoZSBmaXhlZCBzZXJ2aWNlIHJhdGUgKHdlaWdodCkKLQkgIG9mIHRoZSBpdGggc2VydmVyLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQotCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcJSVBfVlNfTlEKLQl0cmlzdGF0ZSAibmV2ZXIgcXVldWUgc2NoZWR1bGluZyIKLQktLS1oZWxwLS0tCi0JICBUaGUgbmV2ZXIgcXVldWUgc2NoZWR1bGluZyBhbGdvcml0aG0gYWRvcHRzIGEgdHdvLXNwZWVkIG1vZGVsLgotCSAgV2hlbiB0aGVyZSBpcyBhbiBpZGxlIHNlcnZlciBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZSBzZW50IHRvCi0JICB0aGUgaWRsZSBzZXJ2ZXIsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSBmYXN0IG9uZS4gV2hlbiB0aGVyZQotCSAgaXMgbm8gaWRsZSBzZXJ2ZXIgYXZhaWxhYmxlLCB0aGUgam9iIHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyCi0JICB0aGF0IG1pbmltaXplIGl0cyBleHBlY3RlZCBkZWxheSAoVGhlIFNob3J0ZXN0IEV4cGVjdGVkIERlbGF5Ci0JICBzY2hlZHVsaW5nIGFsZ29yaXRobSkuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbW1lbnQgJ0lQVlMgYXBwbGljYXRpb24gaGVscGVyJwotCi1jb25maWcJSVBfVlNfRlRQCi0gIAl0cmlzdGF0ZSAiRlRQIHByb3RvY29sIGhlbHBlciIKLSAgICAgICAgZGVwZW5kcyBvbiBJUF9WU19QUk9UT19UQ1AKLQktLS1oZWxwLS0tCi0JICBGVFAgaXMgYSBwcm90b2NvbCB0aGF0IHRyYW5zZmVycyBJUCBhZGRyZXNzIGFuZC9vciBwb3J0IG51bWJlciBpbgotCSAgdGhlIHBheWxvYWQuIEluIHRoZSB2aXJ0dWFsIHNlcnZlciB2aWEgTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uLAotCSAgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIG9mIHJlYWwgc2VydmVycyBjYW5ub3QgYmUgc2VudCB0bwotCSAgY2xpZW50cyBpbiBmdHAgY29ubmVjdGlvbnMgZGlyZWN0bHksIHNvIEZUUCBwcm90b2NvbCBoZWxwZXIgaXMKLQkgIHJlcXVpcmVkIGZvciB0cmFja2luZyB0aGUgY29ubmVjdGlvbiBhbmQgbWFuZ2xpbmcgaXQgYmFjayB0byB0aGF0IG9mCi0JICB2aXJ0dWFsIHNlcnZpY2UuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCi0JICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCi0KLWVuZGlmICMgSVBfVlMKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvTWFrZWZpbGUgYi9uZXQvaXB2NC9pcHZzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU4NWRlLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgSVBWUyBtb2R1bGVzIG9uIHRvcCBvZiBJUHY0LgotIwotCi0jIElQVlMgdHJhbnNwb3J0IHByb3RvY29sIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQKLWlwX3ZzX3Byb3RvLW9ianMteSA6PQotaXBfdnNfcHJvdG8tb2Jqcy0kKENPTkZJR19JUF9WU19QUk9UT19UQ1ApICs9IGlwX3ZzX3Byb3RvX3RjcC5vCi1pcF92c19wcm90by1vYmpzLSQoQ09ORklHX0lQX1ZTX1BST1RPX1VEUCkgKz0gaXBfdnNfcHJvdG9fdWRwLm8KLWlwX3ZzX3Byb3RvLW9ianMtJChDT05GSUdfSVBfVlNfUFJPVE9fRVNQKSArPSBpcF92c19wcm90b19lc3AubwotaXBfdnNfcHJvdG8tb2Jqcy0kKENPTkZJR19JUF9WU19QUk9UT19BSCkgKz0gaXBfdnNfcHJvdG9fYWgubwotCi1pcF92cy1vYmpzIDo9CWlwX3ZzX2Nvbm4ubyBpcF92c19jb3JlLm8gaXBfdnNfY3RsLm8gaXBfdnNfc2NoZWQubwkgICBcCi0JCWlwX3ZzX3htaXQubyBpcF92c19hcHAubyBpcF92c19zeW5jLm8JICAgCQkgICBcCi0JCWlwX3ZzX2VzdC5vIGlwX3ZzX3Byb3RvLm8gCQkJCSAgIFwKLQkJJChpcF92c19wcm90by1vYmpzLXkpCi0KLQotIyBJUFZTIGNvcmUKLW9iai0kKENPTkZJR19JUF9WUykgKz0gaXBfdnMubwotCi0jIElQVlMgc2NoZWR1bGVycwotb2JqLSQoQ09ORklHX0lQX1ZTX1JSKSArPSBpcF92c19yci5vCi1vYmotJChDT05GSUdfSVBfVlNfV1JSKSArPSBpcF92c193cnIubwotb2JqLSQoQ09ORklHX0lQX1ZTX0xDKSArPSBpcF92c19sYy5vCi1vYmotJChDT05GSUdfSVBfVlNfV0xDKSArPSBpcF92c193bGMubwotb2JqLSQoQ09ORklHX0lQX1ZTX0xCTEMpICs9IGlwX3ZzX2xibGMubwotb2JqLSQoQ09ORklHX0lQX1ZTX0xCTENSKSArPSBpcF92c19sYmxjci5vCi1vYmotJChDT05GSUdfSVBfVlNfREgpICs9IGlwX3ZzX2RoLm8KLW9iai0kKENPTkZJR19JUF9WU19TSCkgKz0gaXBfdnNfc2gubwotb2JqLSQoQ09ORklHX0lQX1ZTX1NFRCkgKz0gaXBfdnNfc2VkLm8KLW9iai0kKENPTkZJR19JUF9WU19OUSkgKz0gaXBfdnNfbnEubwotCi0jIElQVlMgYXBwbGljYXRpb24gaGVscGVycwotb2JqLSQoQ09ORklHX0lQX1ZTX0ZUUCkgKz0gaXBfdnNfZnRwLm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTY4NzIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIzICswLDAgQEAKLS8qCi0gKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQotICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQotICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldGZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQotICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKLSAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KLSAqICAgICAgICAgICAgICBQZXRlciBLZXNlIDxwZXRlci5rZXNlQGlqcy5zaT4KLSAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhlIElQVlMgY29kZSBmb3Iga2VybmVsIDIuMiB3YXMgZG9uZSBieSBXZW5zb25nIFpoYW5nIGFuZCBQZXRlciBLZXNlLAotICogd2l0aCBjaGFuZ2VzL2ZpeGVzIGZyb20gSnVsaWFuIEFuYXN0YXNvdiwgTGFycyBNYXJvd3NreS1CcmVlLCBIb3JtcwotICogYW5kIG90aGVycy4gTWFueSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbSBJUCBNQVNRIGNvZGUgb2Yga2VybmVsIDIuMi4KLSAqCi0gKiBDaGFuZ2VzOgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkJLyogZm9yIHByb2NfbmV0XyogKi8KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0KLSNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qCi0gKiAgQ29ubmVjdGlvbiBoYXNoIHRhYmxlOiBmb3IgaW5wdXQgYW5kIG91dHB1dCBwYWNrZXRzIGxvb2t1cHMgb2YgSVBWUwotICovCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqaXBfdnNfY29ubl90YWI7Ci0KLS8qICBTTEFCIGNhY2hlIGZvciBJUFZTIGNvbm5lY3Rpb25zICovCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlwX3ZzX2Nvbm5fY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci0KLS8qICBjb3VudGVyIGZvciBjdXJyZW50IElQVlMgY29ubmVjdGlvbnMgKi8KLXN0YXRpYyBhdG9taWNfdCBpcF92c19jb25uX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLS8qICBjb3VudGVyIGZvciBubyBjbGllbnQgcG9ydCBjb25uZWN0aW9ucyAqLwotc3RhdGljIGF0b21pY190IGlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLS8qIHJhbmRvbSB2YWx1ZSBmb3IgSVBWUyBjb25uZWN0aW9uIGhhc2ggKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfdnNfY29ubl9ybmQ7Ci0KLS8qCi0gKiAgRmluZSBsb2NraW5nIGdyYW51bGFyaXR5IGZvciBiaWcgY29ubmVjdGlvbiBoYXNoIHRhYmxlCi0gKi8KLSNkZWZpbmUgQ1RfTE9DS0FSUkFZX0JJVFMgIDQKLSNkZWZpbmUgQ1RfTE9DS0FSUkFZX1NJWkUgICgxPDxDVF9MT0NLQVJSQVlfQklUUykKLSNkZWZpbmUgQ1RfTE9DS0FSUkFZX01BU0sgIChDVF9MT0NLQVJSQVlfU0laRS0xKQotCi1zdHJ1Y3QgaXBfdnNfYWxpZ25lZF9sb2NrCi17Ci0Jcndsb2NrX3QJbDsKLX0gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oU01QX0NBQ0hFX0JZVEVTKSkpOwotCi0vKiBsb2NrIGFycmF5IGZvciBjb25uIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2FsaWduZWRfbG9jawotX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlbQ1RfTE9DS0FSUkFZX1NJWkVdIF9fY2FjaGVsaW5lX2FsaWduZWQ7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjdF9yZWFkX2xvY2sodW5zaWduZWQga2V5KQotewotCXJlYWRfbG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGN0X3JlYWRfdW5sb2NrKHVuc2lnbmVkIGtleSkKLXsKLQlyZWFkX3VubG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGN0X3dyaXRlX2xvY2sodW5zaWduZWQga2V5KQotewotCXdyaXRlX2xvY2soJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2tleSZDVF9MT0NLQVJSQVlfTUFTS10ubCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjdF93cml0ZV91bmxvY2sodW5zaWduZWQga2V5KQotewotCXdyaXRlX3VubG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGN0X3JlYWRfbG9ja19iaCh1bnNpZ25lZCBrZXkpCi17Ci0JcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3RfcmVhZF91bmxvY2tfYmgodW5zaWduZWQga2V5KQotewotCXJlYWRfdW5sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3Rfd3JpdGVfbG9ja19iaCh1bnNpZ25lZCBrZXkpCi17Ci0Jd3JpdGVfbG9ja19iaCgmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGN0X3dyaXRlX3VubG9ja19iaCh1bnNpZ25lZCBrZXkpCi17Ci0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOwotfQotCi0KLS8qCi0gKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgY29ubmVjdGlvbiBlbnRyeQotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX3ZzX2Nvbm5faGFzaGtleSh1bnNpZ25lZCBwcm90bywgX19iZTMyIGFkZHIsIF9fYmUxNiBwb3J0KQotewotCXJldHVybiBqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKWFkZHIsIChfX2ZvcmNlIHUzMilwb3J0LCBwcm90bywgaXBfdnNfY29ubl9ybmQpCi0JCSYgSVBfVlNfQ09OTl9UQUJfTUFTSzsKLX0KLQotCi0vKgotICoJSGFzaGVzIGlwX3ZzX2Nvbm4gaW4gaXBfdnNfY29ubl90YWIgYnkgcHJvdG8sYWRkcixwb3J0LgotICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX2Nvbm5faGFzaChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0JdW5zaWduZWQgaGFzaDsKLQlpbnQgcmV0OwotCi0JLyogSGFzaCBieSBwcm90b2NvbCwgY2xpZW50IGFkZHJlc3MgYW5kIHBvcnQgKi8KLQloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KGNwLT5wcm90b2NvbCwgY3AtPmNhZGRyLCBjcC0+Y3BvcnQpOwotCi0JY3Rfd3JpdGVfbG9jayhoYXNoKTsKLQotCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9IQVNIRUQpKSB7Ci0JCWxpc3RfYWRkKCZjcC0+Y19saXN0LCAmaXBfdnNfY29ubl90YWJbaGFzaF0pOwotCQljcC0+ZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX0hBU0hFRDsKLQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7Ci0JCXJldCA9IDE7Ci0JfSBlbHNlIHsKLQkJSVBfVlNfRVJSKCJpcF92c19jb25uX2hhc2goKTogcmVxdWVzdCBmb3IgYWxyZWFkeSBoYXNoZWQsICIKLQkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlyZXQgPSAwOwotCX0KLQotCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqCVVOaGFzaGVzIGlwX3ZzX2Nvbm4gZnJvbSBpcF92c19jb25uX3RhYi4KLSAqCXJldHVybnMgYm9vbCBzdWNjZXNzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpcF92c19jb25uX3VuaGFzaChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0JdW5zaWduZWQgaGFzaDsKLQlpbnQgcmV0OwotCi0JLyogdW5oYXNoIGl0IGFuZCBkZWNyZWFzZSBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgKi8KLQloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KGNwLT5wcm90b2NvbCwgY3AtPmNhZGRyLCBjcC0+Y3BvcnQpOwotCi0JY3Rfd3JpdGVfbG9jayhoYXNoKTsKLQotCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSEFTSEVEKSB7Ci0JCWxpc3RfZGVsKCZjcC0+Y19saXN0KTsKLQkJY3AtPmZsYWdzICY9IH5JUF9WU19DT05OX0ZfSEFTSEVEOwotCQlhdG9taWNfZGVjKCZjcC0+cmVmY250KTsKLQkJcmV0ID0gMTsKLQl9IGVsc2UKLQkJcmV0ID0gMDsKLQotCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqICBHZXRzIGlwX3ZzX2Nvbm4gYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiLgotICogIENhbGxlZCBmb3IgcGt0cyBjb21pbmcgZnJvbSBPVVRzaWRlLXRvLUlOc2lkZS4KLSAqCXNfYWRkciwgc19wb3J0OiBwa3Qgc291cmNlIGFkZHJlc3MgKGZvcmVpZ24gaG9zdCkKLSAqCWRfYWRkciwgZF9wb3J0OiBwa3QgZGVzdCBhZGRyZXNzIChsb2FkIGJhbGFuY2VyKQotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19jb25uICpfX2lwX3ZzX2Nvbm5faW5fZ2V0Ci0oaW50IHByb3RvY29sLCBfX2JlMzIgc19hZGRyLCBfX2JlMTYgc19wb3J0LCBfX2JlMzIgZF9hZGRyLCBfX2JlMTYgZF9wb3J0KQotewotCXVuc2lnbmVkIGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwotCi0JaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQpOwotCi0JY3RfcmVhZF9sb2NrKGhhc2gpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2hhc2hdLCBjX2xpc3QpIHsKLQkJaWYgKHNfYWRkcj09Y3AtPmNhZGRyICYmIHNfcG9ydD09Y3AtPmNwb3J0ICYmCi0JCSAgICBkX3BvcnQ9PWNwLT52cG9ydCAmJiBkX2FkZHI9PWNwLT52YWRkciAmJgotCQkgICAgKCghc19wb3J0KSBeICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpKSAmJgotCQkgICAgcHJvdG9jb2w9PWNwLT5wcm90b2NvbCkgewotCQkJLyogSElUICovCi0JCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKLQkJCWN0X3JlYWRfdW5sb2NrKGhhc2gpOwotCQkJcmV0dXJuIGNwOwotCQl9Ci0JfQotCi0JY3RfcmVhZF91bmxvY2soaGFzaCk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGlwX3ZzX2Nvbm4gKmlwX3ZzX2Nvbm5faW5fZ2V0Ci0oaW50IHByb3RvY29sLCBfX2JlMzIgc19hZGRyLCBfX2JlMTYgc19wb3J0LCBfX2JlMzIgZF9hZGRyLCBfX2JlMTYgZF9wb3J0KQotewotCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQotCWNwID0gX19pcF92c19jb25uX2luX2dldChwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQsIGRfYWRkciwgZF9wb3J0KTsKLQlpZiAoIWNwICYmIGF0b21pY19yZWFkKCZpcF92c19jb25uX25vX2Nwb3J0X2NudCkpCi0JCWNwID0gX19pcF92c19jb25uX2luX2dldChwcm90b2NvbCwgc19hZGRyLCAwLCBkX2FkZHIsIGRfcG9ydCk7Ci0KLQlJUF9WU19EQkcoOSwgImxvb2t1cC9pbiAlcyAldS4ldS4ldS4ldTolZC0+JXUuJXUuJXUuJXU6JWQgJXNcbiIsCi0JCSAgaXBfdnNfcHJvdG9fbmFtZShwcm90b2NvbCksCi0JCSAgTklQUVVBRChzX2FkZHIpLCBudG9ocyhzX3BvcnQpLAotCQkgIE5JUFFVQUQoZF9hZGRyKSwgbnRvaHMoZF9wb3J0KSwKLQkJICBjcD8iaGl0Ijoibm90IGhpdCIpOwotCi0JcmV0dXJuIGNwOwotfQotCi0vKiBHZXQgcmVmZXJlbmNlIHRvIGNvbm5lY3Rpb24gdGVtcGxhdGUgKi8KLXN0cnVjdCBpcF92c19jb25uICppcF92c19jdF9pbl9nZXQKLShpbnQgcHJvdG9jb2wsIF9fYmUzMiBzX2FkZHIsIF9fYmUxNiBzX3BvcnQsIF9fYmUzMiBkX2FkZHIsIF9fYmUxNiBkX3BvcnQpCi17Ci0JdW5zaWduZWQgaGFzaDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0KLQloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KHByb3RvY29sLCBzX2FkZHIsIHNfcG9ydCk7Ci0KLQljdF9yZWFkX2xvY2soaGFzaCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaGFzaF0sIGNfbGlzdCkgewotCQlpZiAoc19hZGRyPT1jcC0+Y2FkZHIgJiYgc19wb3J0PT1jcC0+Y3BvcnQgJiYKLQkJICAgIGRfcG9ydD09Y3AtPnZwb3J0ICYmIGRfYWRkcj09Y3AtPnZhZGRyICYmCi0JCSAgICBjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUgJiYKLQkJICAgIHByb3RvY29sPT1jcC0+cHJvdG9jb2wpIHsKLQkJCS8qIEhJVCAqLwotCQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQljcCA9IE5VTEw7Ci0KLSAgb3V0OgotCWN0X3JlYWRfdW5sb2NrKGhhc2gpOwotCi0JSVBfVlNfREJHKDksICJ0ZW1wbGF0ZSBsb29rdXAvaW4gJXMgJXUuJXUuJXUuJXU6JWQtPiV1LiV1LiV1LiV1OiVkICVzXG4iLAotCQkgIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAotCQkgIE5JUFFVQUQoc19hZGRyKSwgbnRvaHMoc19wb3J0KSwKLQkJICBOSVBRVUFEKGRfYWRkciksIG50b2hzKGRfcG9ydCksCi0JCSAgY3A/ImhpdCI6Im5vdCBoaXQiKTsKLQotCXJldHVybiBjcDsKLX0KLQotLyoKLSAqICBHZXRzIGlwX3ZzX2Nvbm4gYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiLgotICogIENhbGxlZCBmb3IgcGt0cyBjb21pbmcgZnJvbSBpbnNpZGUtdG8tT1VUc2lkZS4KLSAqCXNfYWRkciwgc19wb3J0OiBwa3Qgc291cmNlIGFkZHJlc3MgKGluc2lkZSBob3N0KQotICoJZF9hZGRyLCBkX3BvcnQ6IHBrdCBkZXN0IGFkZHJlc3MgKGZvcmVpZ24gaG9zdCkKLSAqLwotc3RydWN0IGlwX3ZzX2Nvbm4gKmlwX3ZzX2Nvbm5fb3V0X2dldAotKGludCBwcm90b2NvbCwgX19iZTMyIHNfYWRkciwgX19iZTE2IHNfcG9ydCwgX19iZTMyIGRfYWRkciwgX19iZTE2IGRfcG9ydCkKLXsKLQl1bnNpZ25lZCBoYXNoOwotCXN0cnVjdCBpcF92c19jb25uICpjcCwgKnJldD1OVUxMOwotCi0JLyoKLQkgKglDaGVjayBmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCi0JICovCi0JaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShwcm90b2NvbCwgZF9hZGRyLCBkX3BvcnQpOwotCi0JY3RfcmVhZF9sb2NrKGhhc2gpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2hhc2hdLCBjX2xpc3QpIHsKLQkJaWYgKGRfYWRkciA9PSBjcC0+Y2FkZHIgJiYgZF9wb3J0ID09IGNwLT5jcG9ydCAmJgotCQkgICAgc19wb3J0ID09IGNwLT5kcG9ydCAmJiBzX2FkZHIgPT0gY3AtPmRhZGRyICYmCi0JCSAgICBwcm90b2NvbCA9PSBjcC0+cHJvdG9jb2wpIHsKLQkJCS8qIEhJVCAqLwotCQkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7Ci0JCQlyZXQgPSBjcDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JY3RfcmVhZF91bmxvY2soaGFzaCk7Ci0KLQlJUF9WU19EQkcoOSwgImxvb2t1cC9vdXQgJXMgJXUuJXUuJXUuJXU6JWQtPiV1LiV1LiV1LiV1OiVkICVzXG4iLAotCQkgIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAotCQkgIE5JUFFVQUQoc19hZGRyKSwgbnRvaHMoc19wb3J0KSwKLQkJICBOSVBRVUFEKGRfYWRkciksIG50b2hzKGRfcG9ydCksCi0JCSAgcmV0PyJoaXQiOiJub3QgaGl0Iik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKiAgICAgIFB1dCBiYWNrIHRoZSBjb25uIGFuZCByZXN0YXJ0IGl0cyB0aW1lciB3aXRoIGl0cyB0aW1lb3V0Ci0gKi8KLXZvaWQgaXBfdnNfY29ubl9wdXQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCS8qIHJlc2V0IGl0IGV4cGlyZSBpbiBpdHMgdGltZW91dCAqLwotCW1vZF90aW1lcigmY3AtPnRpbWVyLCBqaWZmaWVzK2NwLT50aW1lb3V0KTsKLQotCV9faXBfdnNfY29ubl9wdXQoY3ApOwotfQotCi0KLS8qCi0gKglGaWxsIGEgbm9fY2xpZW50X3BvcnQgY29ubmVjdGlvbiB3aXRoIGEgY2xpZW50IHBvcnQgbnVtYmVyCi0gKi8KLXZvaWQgaXBfdnNfY29ubl9maWxsX2Nwb3J0KHN0cnVjdCBpcF92c19jb25uICpjcCwgX19iZTE2IGNwb3J0KQotewotCWlmIChpcF92c19jb25uX3VuaGFzaChjcCkpIHsKLQkJc3Bpbl9sb2NrKCZjcC0+bG9jayk7Ci0JCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpIHsKLQkJCWF0b21pY19kZWMoJmlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250KTsKLQkJCWNwLT5mbGFncyAmPSB+SVBfVlNfQ09OTl9GX05PX0NQT1JUOwotCQkJY3AtPmNwb3J0ID0gY3BvcnQ7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKLQotCQkvKiBoYXNoIG9uIG5ldyBkcG9ydCAqLwotCQlpcF92c19jb25uX2hhc2goY3ApOwotCX0KLX0KLQotCi0vKgotICoJQmluZCBhIGNvbm5lY3Rpb24gZW50cnkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwYWNrZXRfeG1pdC4KLSAqCUNhbGxlZCBieSBpcF92c19jb25uX25ldy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2JpbmRfeG1pdChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0Jc3dpdGNoIChJUF9WU19GV0RfTUVUSE9EKGNwKSkgewotCWNhc2UgSVBfVlNfQ09OTl9GX01BU1E6Ci0JCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX25hdF94bWl0OwotCQlicmVhazsKLQotCWNhc2UgSVBfVlNfQ09OTl9GX1RVTk5FTDoKLQkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfdHVubmVsX3htaXQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUF9WU19DT05OX0ZfRFJPVVRFOgotCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19kcl94bWl0OwotCQlicmVhazsKLQotCWNhc2UgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERToKLQkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfbnVsbF94bWl0OwotCQlicmVhazsKLQotCWNhc2UgSVBfVlNfQ09OTl9GX0JZUEFTUzoKLQkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfYnlwYXNzX3htaXQ7Ci0JCWJyZWFrOwotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIGludCBpcF92c19kZXN0X3RvdGFsY29ubnMoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykKLQkJKyBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7Ci19Ci0KLS8qCi0gKglCaW5kIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIGEgdmlydHVhbCBzZXJ2aWNlIGRlc3RpbmF0aW9uCi0gKglDYWxsZWQganVzdCBhZnRlciBhIG5ldyBjb25uZWN0aW9uIGVudHJ5IGlzIGNyZWF0ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXBfdnNfYmluZF9kZXN0KHN0cnVjdCBpcF92c19jb25uICpjcCwgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyogaWYgZGVzdCBpcyBOVUxMLCB0aGVuIHJldHVybiBkaXJlY3RseSAqLwotCWlmICghZGVzdCkKLQkJcmV0dXJuOwotCi0JLyogSW5jcmVhc2UgdGhlIHJlZmNudCBjb3VudGVyIG9mIHRoZSBkZXN0ICovCi0JYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKLQotCS8qIEJpbmQgd2l0aCB0aGUgZGVzdGluYXRpb24gYW5kIGl0cyBjb3JyZXNwb25kaW5nIHRyYW5zbWl0dGVyICovCi0JaWYgKChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU1lOQykgJiYKLQkgICAgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSkpCi0JCS8qIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCB0ZW1wbGF0ZSBhbmQgaXMgY3JlYXRlZAotCQkgKiBieSBzeW5jLCBwcmVzZXJ2ZSB0aGUgYWN0aXZpdHkgZmxhZy4KLQkJICovCi0JCWNwLT5mbGFncyB8PSBhdG9taWNfcmVhZCgmZGVzdC0+Y29ubl9mbGFncykgJgotCQkJICAgICAofklQX1ZTX0NPTk5fRl9JTkFDVElWRSk7Ci0JZWxzZQotCQljcC0+ZmxhZ3MgfD0gYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpOwotCWNwLT5kZXN0ID0gZGVzdDsKLQotCUlQX1ZTX0RCRyg3LCAiQmluZC1kZXN0ICVzIGM6JXUuJXUuJXUuJXU6JWQgdjoldS4ldS4ldS4ldTolZCAiCi0JCSAgImQ6JXUuJXUuJXUuJXU6JWQgZndkOiVjIHM6JXUgY29ubi0+ZmxhZ3M6JVggY29ubi0+cmVmY250OiVkICIKLQkJICAiZGVzdC0+cmVmY250OiVkXG4iLAotCQkgIGlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKLQkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCi0JCSAgTklQUVVBRChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAotCQkgIE5JUFFVQUQoY3AtPmRhZGRyKSwgbnRvaHMoY3AtPmRwb3J0KSwKLQkJICBpcF92c19md2RfdGFnKGNwKSwgY3AtPnN0YXRlLAotCQkgIGNwLT5mbGFncywgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpLAotCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKLQotCS8qIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBjb3VudGVycyAqLwotCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9URU1QTEFURSkpIHsKLQkJLyogSXQgaXMgYSBub3JtYWwgY29ubmVjdGlvbiwgc28gaW5jcmVhc2UgdGhlIGluYWN0aXZlCi0JCSAgIGNvbm5lY3Rpb24gY291bnRlciBiZWNhdXNlIGl0IGlzIGluIFRDUCBTWU5SRUNWCi0JCSAgIHN0YXRlIChpbmFjdGl2ZSkgb3Igb3RoZXIgcHJvdG9jb2wgaW5hY2l2ZSBzdGF0ZSAqLwotCQlpZiAoKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9TWU5DKSAmJgotCQkgICAgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0lOQUNUSVZFKSkpCi0JCQlhdG9taWNfaW5jKCZkZXN0LT5hY3RpdmVjb25ucyk7Ci0JCWVsc2UKLQkJCWF0b21pY19pbmMoJmRlc3QtPmluYWN0Y29ubnMpOwotCX0gZWxzZSB7Ci0JCS8qIEl0IGlzIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uL3RlbXBsYXRlLCBzbyBpbmNyZWFzZQotCQkgICB0aGUgcGVyaXN0ZW50IGNvbm5lY3Rpb24gY291bnRlciAqLwotCQlhdG9taWNfaW5jKCZkZXN0LT5wZXJzaXN0Y29ubnMpOwotCX0KLQotCWlmIChkZXN0LT51X3RocmVzaG9sZCAhPSAwICYmCi0JICAgIGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhkZXN0KSA+PSBkZXN0LT51X3RocmVzaG9sZCkKLQkJZGVzdC0+ZmxhZ3MgfD0gSVBfVlNfREVTVF9GX09WRVJMT0FEOwotfQotCi0KLS8qCi0gKiBDaGVjayBpZiB0aGVyZSBpcyBhIGRlc3RpbmF0aW9uIGZvciB0aGUgY29ubmVjdGlvbiwgaWYgc28KLSAqIGJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRlc3RpbmF0aW9uLgotICovCi1zdHJ1Y3QgaXBfdnNfZGVzdCAqaXBfdnNfdHJ5X2JpbmRfZGVzdChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0KLQlpZiAoKGNwKSAmJiAoIWNwLT5kZXN0KSkgewotCQlkZXN0ID0gaXBfdnNfZmluZF9kZXN0KGNwLT5kYWRkciwgY3AtPmRwb3J0LAotCQkJCSAgICAgICBjcC0+dmFkZHIsIGNwLT52cG9ydCwgY3AtPnByb3RvY29sKTsKLQkJaXBfdnNfYmluZF9kZXN0KGNwLCBkZXN0KTsKLQkJcmV0dXJuIGRlc3Q7Ci0JfSBlbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi0KLS8qCi0gKglVbmJpbmQgYSBjb25uZWN0aW9uIGVudHJ5IHdpdGggaXRzIFZTIGRlc3RpbmF0aW9uCi0gKglDYWxsZWQgYnkgdGhlIGlwX3ZzX2Nvbm5fZXhwaXJlIGZ1bmN0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfdW5iaW5kX2Rlc3Qoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gY3AtPmRlc3Q7Ci0KLQlpZiAoIWRlc3QpCi0JCXJldHVybjsKLQotCUlQX1ZTX0RCRyg3LCAiVW5iaW5kLWRlc3QgJXMgYzoldS4ldS4ldS4ldTolZCB2OiV1LiV1LiV1LiV1OiVkICIKLQkJICAiZDoldS4ldS4ldS4ldTolZCBmd2Q6JWMgczoldSBjb25uLT5mbGFnczolWCBjb25uLT5yZWZjbnQ6JWQgIgotCQkgICJkZXN0LT5yZWZjbnQ6JWRcbiIsCi0JCSAgaXBfdnNfcHJvdG9fbmFtZShjcC0+cHJvdG9jb2wpLAotCQkgIE5JUFFVQUQoY3AtPmNhZGRyKSwgbnRvaHMoY3AtPmNwb3J0KSwKLQkJICBOSVBRVUFEKGNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCi0JCSAgTklQUVVBRChjcC0+ZGFkZHIpLCBudG9ocyhjcC0+ZHBvcnQpLAotCQkgIGlwX3ZzX2Z3ZF90YWcoY3ApLCBjcC0+c3RhdGUsCi0JCSAgY3AtPmZsYWdzLCBhdG9taWNfcmVhZCgmY3AtPnJlZmNudCksCi0JCSAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCkpOwotCi0JLyogVXBkYXRlIHRoZSBjb25uZWN0aW9uIGNvdW50ZXJzICovCi0JaWYgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSkgewotCQkvKiBJdCBpcyBhIG5vcm1hbCBjb25uZWN0aW9uLCBzbyBkZWNyZWFzZSB0aGUgaW5hY3Rjb25ucwotCQkgICBvciBhY3RpdmVjb25ucyBjb3VudGVyICovCi0JCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSU5BQ1RJVkUpIHsKLQkJCWF0b21pY19kZWMoJmRlc3QtPmluYWN0Y29ubnMpOwotCQl9IGVsc2UgewotCQkJYXRvbWljX2RlYygmZGVzdC0+YWN0aXZlY29ubnMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogSXQgaXMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24vdGVtcGxhdGUsIHNvIGRlY3JlYXNlCi0JCSAgIHRoZSBwZXJpc3RlbnQgY29ubmVjdGlvbiBjb3VudGVyICovCi0JCWF0b21pY19kZWMoJmRlc3QtPnBlcnNpc3Rjb25ucyk7Ci0JfQotCi0JaWYgKGRlc3QtPmxfdGhyZXNob2xkICE9IDApIHsKLQkJaWYgKGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhkZXN0KSA8IGRlc3QtPmxfdGhyZXNob2xkKQotCQkJZGVzdC0+ZmxhZ3MgJj0gfklQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKLQl9IGVsc2UgaWYgKGRlc3QtPnVfdGhyZXNob2xkICE9IDApIHsKLQkJaWYgKGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhkZXN0KSAqIDQgPCBkZXN0LT51X3RocmVzaG9sZCAqIDMpCi0JCQlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX09WRVJMT0FEOwotCX0gZWxzZSB7Ci0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKLQkJCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7Ci0JfQotCi0JLyoKLQkgKiBTaW1wbHkgZGVjcmVhc2UgdGhlIHJlZmNudCBvZiB0aGUgZGVzdCwgYmVjYXVzZSB0aGUKLQkgKiBkZXN0IHdpbGwgYmUgZWl0aGVyIGluIHNlcnZpY2UncyBkZXN0aW5hdGlvbiBsaXN0Ci0JICogb3IgaW4gdGhlIHRyYXNoLgotCSAqLwotCWF0b21pY19kZWMoJmRlc3QtPnJlZmNudCk7Ci19Ci0KLQotLyoKLSAqCUNoZWNraW5nIGlmIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbm5lY3Rpb24gdGVtcGxhdGUgaXMgYXZhaWxhYmxlLgotICoJSWYgYXZhaWxhYmxlLCByZXR1cm4gMSwgb3RoZXJ3aXNlIGludmFsaWRhdGUgdGhpcyBjb25uZWN0aW9uCi0gKgl0ZW1wbGF0ZSBhbmQgcmV0dXJuIDAuCi0gKi8KLWludCBpcF92c19jaGVja190ZW1wbGF0ZShzdHJ1Y3QgaXBfdnNfY29ubiAqY3QpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjdC0+ZGVzdDsKLQotCS8qCi0JICogQ2hlY2tpbmcgdGhlIGRlc3Qgc2VydmVyIHN0YXR1cy4KLQkgKi8KLQlpZiAoKGRlc3QgPT0gTlVMTCkgfHwKLQkgICAgIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpIHx8Ci0JICAgIChzeXNjdGxfaXBfdnNfZXhwaXJlX3F1aWVzY2VudF90ZW1wbGF0ZSAmJgotCSAgICAgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApKSkgewotCQlJUF9WU19EQkcoOSwgImNoZWNrX3RlbXBsYXRlOiBkZXN0IG5vdCBhdmFpbGFibGUgZm9yICIKLQkJCSAgInByb3RvY29sICVzIHM6JXUuJXUuJXUuJXU6JWQgdjoldS4ldS4ldS4ldTolZCAiCi0JCQkgICItPiBkOiV1LiV1LiV1LiV1OiVkXG4iLAotCQkJICBpcF92c19wcm90b19uYW1lKGN0LT5wcm90b2NvbCksCi0JCQkgIE5JUFFVQUQoY3QtPmNhZGRyKSwgbnRvaHMoY3QtPmNwb3J0KSwKLQkJCSAgTklQUVVBRChjdC0+dmFkZHIpLCBudG9ocyhjdC0+dnBvcnQpLAotCQkJICBOSVBRVUFEKGN0LT5kYWRkciksIG50b2hzKGN0LT5kcG9ydCkpOwotCi0JCS8qCi0JCSAqIEludmFsaWRhdGUgdGhlIGNvbm5lY3Rpb24gdGVtcGxhdGUKLQkJICovCi0JCWlmIChjdC0+dnBvcnQgIT0gaHRvbnMoMHhmZmZmKSkgewotCQkJaWYgKGlwX3ZzX2Nvbm5fdW5oYXNoKGN0KSkgewotCQkJCWN0LT5kcG9ydCA9IGh0b25zKDB4ZmZmZik7Ci0JCQkJY3QtPnZwb3J0ID0gaHRvbnMoMHhmZmZmKTsKLQkJCQljdC0+Y3BvcnQgPSAwOwotCQkJCWlwX3ZzX2Nvbm5faGFzaChjdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBTaW1wbHkgZGVjcmVhc2UgdGhlIHJlZmNudCBvZiB0aGUgdGVtcGxhdGUsCi0JCSAqIGRvbid0IHJlc3RhcnQgaXRzIHRpbWVyLgotCQkgKi8KLQkJYXRvbWljX2RlYygmY3QtPnJlZmNudCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaXBfdnNfY29ubl9leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpcF92c19jb25uICpjcCA9IChzdHJ1Y3QgaXBfdnNfY29ubiAqKWRhdGE7Ci0KLQljcC0+dGltZW91dCA9IDYwKkhaOwotCi0JLyoKLQkgKgloZXksIEknbSB1c2luZyBpdAotCSAqLwotCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOwotCi0JLyoKLQkgKglkbyBJIGNvbnRyb2wgYW55Ym9keT8KLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJmNwLT5uX2NvbnRyb2wpKQotCQlnb3RvIGV4cGlyZV9sYXRlcjsKLQotCS8qCi0JICoJdW5oYXNoIGl0IGlmIGl0IGlzIGhhc2hlZCBpbiB0aGUgY29ubiB0YWJsZQotCSAqLwotCWlmICghaXBfdnNfY29ubl91bmhhc2goY3ApKQotCQlnb3RvIGV4cGlyZV9sYXRlcjsKLQotCS8qCi0JICoJcmVmY250PT0xIGltcGxpZXMgSSdtIHRoZSBvbmx5IG9uZSByZWZlcnJlcgotCSAqLwotCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpID09IDEpKSB7Ci0JCS8qIGRlbGV0ZSB0aGUgdGltZXIgaWYgaXQgaXMgYWN0aXZhdGVkIGJ5IG90aGVyIHVzZXJzICovCi0JCWlmICh0aW1lcl9wZW5kaW5nKCZjcC0+dGltZXIpKQotCQkJZGVsX3RpbWVyKCZjcC0+dGltZXIpOwotCi0JCS8qIGRvZXMgYW55Ym9keSBjb250cm9sIG1lPyAqLwotCQlpZiAoY3AtPmNvbnRyb2wpCi0JCQlpcF92c19jb250cm9sX2RlbChjcCk7Ci0KLQkJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpCi0JCQlpcF92c191bmJpbmRfYXBwKGNwKTsKLQkJaXBfdnNfdW5iaW5kX2Rlc3QoY3ApOwotCQlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PX0NQT1JUKQotCQkJYXRvbWljX2RlYygmaXBfdnNfY29ubl9ub19jcG9ydF9jbnQpOwotCQlhdG9taWNfZGVjKCZpcF92c19jb25uX2NvdW50KTsKLQotCQlrbWVtX2NhY2hlX2ZyZWUoaXBfdnNfY29ubl9jYWNoZXAsIGNwKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGhhc2ggaXQgYmFjayB0byB0aGUgdGFibGUgKi8KLQlpcF92c19jb25uX2hhc2goY3ApOwotCi0gIGV4cGlyZV9sYXRlcjoKLQlJUF9WU19EQkcoNywgImRlbGF5ZWQ6IGNvbm4tPnJlZmNudC0xPSVkIGNvbm4tPm5fY29udHJvbD0lZFxuIiwKLQkJICBhdG9taWNfcmVhZCgmY3AtPnJlZmNudCktMSwKLQkJICBhdG9taWNfcmVhZCgmY3AtPm5fY29udHJvbCkpOwotCi0JaXBfdnNfY29ubl9wdXQoY3ApOwotfQotCi0KLXZvaWQgaXBfdnNfY29ubl9leHBpcmVfbm93KHN0cnVjdCBpcF92c19jb25uICpjcCkKLXsKLQlpZiAoZGVsX3RpbWVyKCZjcC0+dGltZXIpKQotCQltb2RfdGltZXIoJmNwLT50aW1lciwgamlmZmllcyk7Ci19Ci0KLQotLyoKLSAqCUNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGVudHJ5IGFuZCBoYXNoIGl0IGludG8gdGhlIGlwX3ZzX2Nvbm5fdGFiCi0gKi8KLXN0cnVjdCBpcF92c19jb25uICoKLWlwX3ZzX2Nvbm5fbmV3KGludCBwcm90bywgX19iZTMyIGNhZGRyLCBfX2JlMTYgY3BvcnQsIF9fYmUzMiB2YWRkciwgX19iZTE2IHZwb3J0LAotCSAgICAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwgdW5zaWduZWQgZmxhZ3MsCi0JICAgICAgIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQotewotCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwID0gaXBfdnNfcHJvdG9fZ2V0KHByb3RvKTsKLQotCWNwID0ga21lbV9jYWNoZV96YWxsb2MoaXBfdnNfY29ubl9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmIChjcCA9PSBOVUxMKSB7Ci0JCUlQX1ZTX0VSUl9STCgiaXBfdnNfY29ubl9uZXc6IG5vIG1lbW9yeSBhdmFpbGFibGUuXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJmNwLT5jX2xpc3QpOwotCXNldHVwX3RpbWVyKCZjcC0+dGltZXIsIGlwX3ZzX2Nvbm5fZXhwaXJlLCAodW5zaWduZWQgbG9uZyljcCk7Ci0JY3AtPnByb3RvY29sCSAgID0gcHJvdG87Ci0JY3AtPmNhZGRyCSAgID0gY2FkZHI7Ci0JY3AtPmNwb3J0CSAgID0gY3BvcnQ7Ci0JY3AtPnZhZGRyCSAgID0gdmFkZHI7Ci0JY3AtPnZwb3J0CSAgID0gdnBvcnQ7Ci0JY3AtPmRhZGRyICAgICAgICAgID0gZGFkZHI7Ci0JY3AtPmRwb3J0ICAgICAgICAgID0gZHBvcnQ7Ci0JY3AtPmZsYWdzCSAgID0gZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNwLT5sb2NrKTsKLQotCS8qCi0JICogU2V0IHRoZSBlbnRyeSBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBiZWZvcmUgaGFzaGluZwotCSAqIGl0IGluIHRoZSB0YWJsZSwgc28gdGhhdCBvdGhlciB0aHJlYWQgcnVuIGlwX3ZzX3JhbmRvbV9kcm9wZW50cnkKLQkgKiBidXQgY2Fubm90IGRyb3AgdGhpcyBlbnRyeS4KLQkgKi8KLQlhdG9taWNfc2V0KCZjcC0+cmVmY250LCAxKTsKLQotCWF0b21pY19zZXQoJmNwLT5uX2NvbnRyb2wsIDApOwotCWF0b21pY19zZXQoJmNwLT5pbl9wa3RzLCAwKTsKLQotCWF0b21pY19pbmMoJmlwX3ZzX2Nvbm5fY291bnQpOwotCWlmIChmbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkKLQkJYXRvbWljX2luYygmaXBfdnNfY29ubl9ub19jcG9ydF9jbnQpOwotCi0JLyogQmluZCB0aGUgY29ubmVjdGlvbiB3aXRoIGEgZGVzdGluYXRpb24gc2VydmVyICovCi0JaXBfdnNfYmluZF9kZXN0KGNwLCBkZXN0KTsKLQotCS8qIFNldCBpdHMgc3RhdGUgYW5kIHRpbWVvdXQgKi8KLQljcC0+c3RhdGUgPSAwOwotCWNwLT50aW1lb3V0ID0gMypIWjsKLQotCS8qIEJpbmQgaXRzIHBhY2tldCB0cmFuc21pdHRlciAqLwotCWlwX3ZzX2JpbmRfeG1pdChjcCk7Ci0KLQlpZiAodW5saWtlbHkocHAgJiYgYXRvbWljX3JlYWQoJnBwLT5hcHBjbnQpKSkKLQkJaXBfdnNfYmluZF9hcHAoY3AsIHBwKTsKLQotCS8qIEhhc2ggaXQgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiIGZpbmFsbHkgKi8KLQlpcF92c19jb25uX2hhc2goY3ApOwotCi0JcmV0dXJuIGNwOwotfQotCi0KLS8qCi0gKgkvcHJvYy9uZXQvaXBfdnNfY29ubiBlbnRyaWVzCi0gKi8KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCi1zdGF0aWMgdm9pZCAqaXBfdnNfY29ubl9hcnJheShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKLXsKLQlpbnQgaWR4OwotCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQotCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19DT05OX1RBQl9TSVpFOyBpZHgrKykgewotCQljdF9yZWFkX2xvY2tfYmgoaWR4KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2lkeF0sIGNfbGlzdCkgewotCQkJaWYgKHBvcy0tID09IDApIHsKLQkJCQlzZXEtPnByaXZhdGUgPSAmaXBfdnNfY29ubl90YWJbaWR4XTsKLQkJCQlyZXR1cm4gY3A7Ci0JCQl9Ci0JCX0KLQkJY3RfcmVhZF91bmxvY2tfYmgoaWR4KTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgKmlwX3ZzX2Nvbm5fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLXsKLQlzZXEtPnByaXZhdGUgPSBOVUxMOwotCXJldHVybiAqcG9zID8gaXBfdnNfY29ubl9hcnJheShzZXEsICpwb3MgLSAxKSA6U0VRX1NUQVJUX1RPS0VOOwotfQotCi1zdGF0aWMgdm9pZCAqaXBfdnNfY29ubl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gdjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplLCAqbCA9IHNlcS0+cHJpdmF0ZTsKLQlpbnQgaWR4OwotCi0JKysqcG9zOwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5fYXJyYXkoc2VxLCAwKTsKLQotCS8qIG1vcmUgb24gc2FtZSBoYXNoIGNoYWluPyAqLwotCWlmICgoZSA9IGNwLT5jX2xpc3QubmV4dCkgIT0gbCkKLQkJcmV0dXJuIGxpc3RfZW50cnkoZSwgc3RydWN0IGlwX3ZzX2Nvbm4sIGNfbGlzdCk7Ci0KLQlpZHggPSBsIC0gaXBfdnNfY29ubl90YWI7Ci0JY3RfcmVhZF91bmxvY2tfYmgoaWR4KTsKLQotCXdoaWxlICgrK2lkeCA8IElQX1ZTX0NPTk5fVEFCX1NJWkUpIHsKLQkJY3RfcmVhZF9sb2NrX2JoKGlkeCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltpZHhdLCBjX2xpc3QpIHsKLQkJCXNlcS0+cHJpdmF0ZSA9ICZpcF92c19jb25uX3RhYltpZHhdOwotCQkJcmV0dXJuIGNwOwotCQl9Ci0JCWN0X3JlYWRfdW5sb2NrX2JoKGlkeCk7Ci0JfQotCXNlcS0+cHJpdmF0ZSA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGlwX3ZzX2Nvbm5fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbCA9IHNlcS0+cHJpdmF0ZTsKLQotCWlmIChsKQotCQljdF9yZWFkX3VubG9ja19iaChsIC0gaXBfdnNfY29ubl90YWIpOwotfQotCi1zdGF0aWMgaW50IGlwX3ZzX2Nvbm5fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0KLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXNlcV9wdXRzKHNlcSwKLSAgICJQcm8gRnJvbUlQICAgRlBydCBUb0lQICAgICBUUHJ0IERlc3RJUCAgIERQcnQgU3RhdGUgICAgICAgRXhwaXJlc1xuIik7Ci0JZWxzZSB7Ci0JCWNvbnN0IHN0cnVjdCBpcF92c19jb25uICpjcCA9IHY7Ci0KLQkJc2VxX3ByaW50ZihzZXEsCi0JCQkiJS0zcyAlMDhYICUwNFggJTA4WCAlMDRYICUwOFggJTA0WCAlLTExcyAlN2x1XG4iLAotCQkJCWlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKLQkJCQludG9obChjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAotCQkJCW50b2hsKGNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCi0JCQkJbnRvaGwoY3AtPmRhZGRyKSwgbnRvaHMoY3AtPmRwb3J0KSwKLQkJCQlpcF92c19zdGF0ZV9uYW1lKGNwLT5wcm90b2NvbCwgY3AtPnN0YXRlKSwKLQkJCQkoY3AtPnRpbWVyLmV4cGlyZXMtamlmZmllcykvSFopOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcF92c19jb25uX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gaXBfdnNfY29ubl9zZXFfc3RhcnQsCi0JLm5leHQgID0gaXBfdnNfY29ubl9zZXFfbmV4dCwKLQkuc3RvcCAgPSBpcF92c19jb25uX3NlcV9zdG9wLAotCS5zaG93ICA9IGlwX3ZzX2Nvbm5fc2VxX3Nob3csCi19OwotCi1zdGF0aWMgaW50IGlwX3ZzX2Nvbm5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlwX3ZzX2Nvbm5fc2VxX29wcyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwX3ZzX2Nvbm5fZm9wcyA9IHsKLQkub3duZXIJID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBpcF92c19jb25uX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmlwX3ZzX29yaWdpbl9uYW1lKHVuc2lnbmVkIGZsYWdzKQotewotCWlmIChmbGFncyAmIElQX1ZTX0NPTk5fRl9TWU5DKQotCQlyZXR1cm4gIlNZTkMiOwotCWVsc2UKLQkJcmV0dXJuICJMT0NBTCI7Ci19Ci0KLXN0YXRpYyBpbnQgaXBfdnNfY29ubl9zeW5jX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQotCQlzZXFfcHV0cyhzZXEsCi0gICAiUHJvIEZyb21JUCAgIEZQcnQgVG9JUCAgICAgVFBydCBEZXN0SVAgICBEUHJ0IFN0YXRlICAgICAgIE9yaWdpbiBFeHBpcmVzXG4iKTsKLQllbHNlIHsKLQkJY29uc3Qgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gdjsKLQotCQlzZXFfcHJpbnRmKHNlcSwKLQkJCSIlLTNzICUwOFggJTA0WCAlMDhYICUwNFggJTA4WCAlMDRYICUtMTFzICUtNnMgJTdsdVxuIiwKLQkJCQlpcF92c19wcm90b19uYW1lKGNwLT5wcm90b2NvbCksCi0JCQkJbnRvaGwoY3AtPmNhZGRyKSwgbnRvaHMoY3AtPmNwb3J0KSwKLQkJCQludG9obChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAotCQkJCW50b2hsKGNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCi0JCQkJaXBfdnNfc3RhdGVfbmFtZShjcC0+cHJvdG9jb2wsIGNwLT5zdGF0ZSksCi0JCQkJaXBfdnNfb3JpZ2luX25hbWUoY3AtPmZsYWdzKSwKLQkJCQkoY3AtPnRpbWVyLmV4cGlyZXMtamlmZmllcykvSFopOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcF92c19jb25uX3N5bmNfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBpcF92c19jb25uX3NlcV9zdGFydCwKLQkubmV4dCAgPSBpcF92c19jb25uX3NlcV9uZXh0LAotCS5zdG9wICA9IGlwX3ZzX2Nvbm5fc2VxX3N0b3AsCi0JLnNob3cgID0gaXBfdnNfY29ubl9zeW5jX3NlcV9zaG93LAotfTsKLQotc3RhdGljIGludCBpcF92c19jb25uX3N5bmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlwX3ZzX2Nvbm5fc3luY19zZXFfb3BzKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBfdnNfY29ubl9zeW5jX2ZvcHMgPSB7Ci0JLm93bmVyCSA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gaXBfdnNfY29ubl9zeW5jX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAotfTsKLQotI2VuZGlmCi0KLQotLyoKLSAqICAgICAgUmFuZG9tbHkgZHJvcCBjb25uZWN0aW9uIGVudHJpZXMgYmVmb3JlIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeQotICovCi1zdGF0aWMgaW5saW5lIGludCB0b2Ryb3BfZW50cnkoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCS8qCi0JICogVGhlIGRyb3AgcmF0ZSBhcnJheSBuZWVkcyB0dW5pbmcgZm9yIHJlYWwgZW52aXJvbm1lbnRzLgotCSAqIENhbGxlZCBmcm9tIHRpbWVyIGJoIG9ubHkgPT4gbm8gbG9ja2luZwotCSAqLwotCXN0YXRpYyBjb25zdCBjaGFyIHRvZHJvcF9yYXRlWzldID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OwotCXN0YXRpYyBjaGFyIHRvZHJvcF9jb3VudGVyWzldID0gezB9OwotCWludCBpOwotCi0JLyogaWYgdGhlIGNvbm4gZW50cnkgaGFzbid0IGxhc3RlZCBmb3IgNjAgc2Vjb25kcywgZG9uJ3QgZHJvcCBpdC4KLQkgICBUaGlzIHdpbGwgbGVhdmUgZW5vdWdoIHRpbWUgZm9yIG5vcm1hbCBjb25uZWN0aW9uIHRvIGdldAotCSAgIHRocm91Z2guICovCi0JaWYgKHRpbWVfYmVmb3JlKGNwLT50aW1lb3V0ICsgamlmZmllcywgY3AtPnRpbWVyLmV4cGlyZXMgKyA2MCpIWikpCi0JCXJldHVybiAwOwotCi0JLyogRG9uJ3QgZHJvcCB0aGUgZW50cnkgaWYgaXRzIG51bWJlciBvZiBpbmNvbWluZyBwYWNrZXRzIGlzIG5vdAotCSAgIGxvY2F0ZWQgaW4gWzAsIDhdICovCi0JaSA9IGF0b21pY19yZWFkKCZjcC0+aW5fcGt0cyk7Ci0JaWYgKGkgPiA4IHx8IGkgPCAwKSByZXR1cm4gMDsKLQotCWlmICghdG9kcm9wX3JhdGVbaV0pIHJldHVybiAwOwotCWlmICgtLXRvZHJvcF9jb3VudGVyW2ldID4gMCkgcmV0dXJuIDA7Ci0KLQl0b2Ryb3BfY291bnRlcltpXSA9IHRvZHJvcF9yYXRlW2ldOwotCXJldHVybiAxOwotfQotCi0vKiBDYWxsZWQgZnJvbSBrZXZlbnRkIGFuZCBtdXN0IHByb3RlY3QgaXRzZWxmIGZyb20gc29mdGlycXMgKi8KLXZvaWQgaXBfdnNfcmFuZG9tX2Ryb3BlbnRyeSh2b2lkKQotewotCWludCBpZHg7Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwotCi0JLyoKLQkgKiBSYW5kb21seSBzY2FuIDEvMzIgb2YgdGhlIHdob2xlIHRhYmxlIGV2ZXJ5IHNlY29uZAotCSAqLwotCWZvciAoaWR4ID0gMDsgaWR4IDwgKElQX1ZTX0NPTk5fVEFCX1NJWkU+PjUpOyBpZHgrKykgewotCQl1bnNpZ25lZCBoYXNoID0gbmV0X3JhbmRvbSgpICYgSVBfVlNfQ09OTl9UQUJfTUFTSzsKLQotCQkvKgotCQkgKiAgTG9jayBpcyBhY3R1YWxseSBuZWVkZWQgaW4gdGhpcyBsb29wLgotCQkgKi8KLQkJY3Rfd3JpdGVfbG9ja19iaChoYXNoKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaGFzaF0sIGNfbGlzdCkgewotCQkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9URU1QTEFURSkKLQkJCQkvKiBjb25uZWN0aW9uIHRlbXBsYXRlICovCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChjcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKLQkJCQlzd2l0Y2goY3AtPnN0YXRlKSB7Ci0JCQkJY2FzZSBJUF9WU19UQ1BfU19TWU5fUkVDVjoKLQkJCQljYXNlIElQX1ZTX1RDUF9TX1NZTkFDSzoKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEOgotCQkJCQlpZiAodG9kcm9wX2VudHJ5KGNwKSkKLQkJCQkJCWJyZWFrOwotCQkJCQljb250aW51ZTsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCF0b2Ryb3BfZW50cnkoY3ApKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSVBfVlNfREJHKDQsICJkZWwgY29ubmVjdGlvblxuIik7Ci0JCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3ApOwotCQkJaWYgKGNwLT5jb250cm9sKSB7Ci0JCQkJSVBfVlNfREJHKDQsICJkZWwgY29ubiB0ZW1wbGF0ZVxuIik7Ci0JCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwLT5jb250cm9sKTsKLQkJCX0KLQkJfQotCQljdF93cml0ZV91bmxvY2tfYmgoaGFzaCk7Ci0JfQotfQotCi0KLS8qCi0gKiAgICAgIEZsdXNoIGFsbCB0aGUgY29ubmVjdGlvbiBlbnRyaWVzIGluIHRoZSBpcF92c19jb25uX3RhYgotICovCi1zdGF0aWMgdm9pZCBpcF92c19jb25uX2ZsdXNoKHZvaWQpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0KLSAgZmx1c2hfYWdhaW46Ci0JZm9yIChpZHg9MDsgaWR4PElQX1ZTX0NPTk5fVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCS8qCi0JCSAqICBMb2NrIGlzIGFjdHVhbGx5IG5lZWRlZCBpbiB0aGlzIGxvb3AuCi0JCSAqLwotCQljdF93cml0ZV9sb2NrX2JoKGlkeCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2lkeF0sIGNfbGlzdCkgewotCi0JCQlJUF9WU19EQkcoNCwgImRlbCBjb25uZWN0aW9uXG4iKTsKLQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcCk7Ci0JCQlpZiAoY3AtPmNvbnRyb2wpIHsKLQkJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uIHRlbXBsYXRlXG4iKTsKLQkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3AtPmNvbnRyb2wpOwotCQkJfQotCQl9Ci0JCWN0X3dyaXRlX3VubG9ja19iaChpZHgpOwotCX0KLQotCS8qIHRoZSBjb3VudGVyIG1heSBiZSBub3QgTlVMTCwgYmVjYXVzZSBtYXliZSBzb21lIGNvbm4gZW50cmllcwotCSAgIGFyZSBydW4gYnkgc2xvdyB0aW1lciBoYW5kbGVyIG9yIHVuaGFzaGVkIGJ1dCBzdGlsbCByZWZlcnJlZCAqLwotCWlmIChhdG9taWNfcmVhZCgmaXBfdnNfY29ubl9jb3VudCkgIT0gMCkgewotCQlzY2hlZHVsZSgpOwotCQlnb3RvIGZsdXNoX2FnYWluOwotCX0KLX0KLQotCi1pbnQgX19pbml0IGlwX3ZzX2Nvbm5faW5pdCh2b2lkKQotewotCWludCBpZHg7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBjb25uZWN0aW9uIGhhc2ggdGFibGUgYW5kIGluaXRpYWxpemUgaXRzIGxpc3QgaGVhZHMKLQkgKi8KLQlpcF92c19jb25uX3RhYiA9IHZtYWxsb2MoSVBfVlNfQ09OTl9UQUJfU0laRSpzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpOwotCWlmICghaXBfdnNfY29ubl90YWIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogQWxsb2NhdGUgaXBfdnNfY29ubiBzbGFiIGNhY2hlICovCi0JaXBfdnNfY29ubl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfdnNfY29ubiIsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXBfdnNfY29ubiksIDAsCi0JCQkJCSAgICAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCFpcF92c19jb25uX2NhY2hlcCkgewotCQl2ZnJlZShpcF92c19jb25uX3RhYik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCUlQX1ZTX0lORk8oIkNvbm5lY3Rpb24gaGFzaCB0YWJsZSBjb25maWd1cmVkICIKLQkJICAgIihzaXplPSVkLCBtZW1vcnk9JWxkS2J5dGVzKVxuIiwKLQkJICAgSVBfVlNfQ09OTl9UQUJfU0laRSwKLQkJICAgKGxvbmcpKElQX1ZTX0NPTk5fVEFCX1NJWkUqc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKS8xMDI0KTsKLQlJUF9WU19EQkcoMCwgIkVhY2ggY29ubmVjdGlvbiBlbnRyeSBuZWVkcyAlWmQgYnl0ZXMgYXQgbGVhc3RcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19jb25uKSk7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IElQX1ZTX0NPTk5fVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZpcF92c19jb25uX3RhYltpZHhdKTsKLQl9Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IENUX0xPQ0tBUlJBWV9TSVpFOyBpZHgrKykgIHsKLQkJcndsb2NrX2luaXQoJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2lkeF0ubCk7Ci0JfQotCi0JcHJvY19uZXRfZm9wc19jcmVhdGUoJmluaXRfbmV0LCAiaXBfdnNfY29ubiIsIDAsICZpcF92c19jb25uX2ZvcHMpOwotCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImlwX3ZzX2Nvbm5fc3luYyIsIDAsICZpcF92c19jb25uX3N5bmNfZm9wcyk7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIHJhbmRvbSB2YWx1ZSBmb3IgY29ubmVjdGlvbiBoYXNoICovCi0JZ2V0X3JhbmRvbV9ieXRlcygmaXBfdnNfY29ubl9ybmQsIHNpemVvZihpcF92c19jb25uX3JuZCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBpcF92c19jb25uX2NsZWFudXAodm9pZCkKLXsKLQkvKiBmbHVzaCBhbGwgdGhlIGNvbm5lY3Rpb24gZW50cmllcyBmaXJzdCAqLwotCWlwX3ZzX2Nvbm5fZmx1c2goKTsKLQotCS8qIFJlbGVhc2UgdGhlIGVtcHR5IGNhY2hlICovCi0Ja21lbV9jYWNoZV9kZXN0cm95KGlwX3ZzX2Nvbm5fY2FjaGVwKTsKLQlwcm9jX25ldF9yZW1vdmUoJmluaXRfbmV0LCAiaXBfdnNfY29ubiIpOwotCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJpcF92c19jb25uX3N5bmMiKTsKLQl2ZnJlZShpcF92c19jb25uX3RhYik7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg3OWVhZmMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI1ICswLDAgQEAKLS8qCi0gKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQotICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQotICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldGZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQotICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKLSAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KLSAqICAgICAgICAgICAgICBQZXRlciBLZXNlIDxwZXRlci5rZXNlQGlqcy5zaT4KLSAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhlIElQVlMgY29kZSBmb3Iga2VybmVsIDIuMiB3YXMgZG9uZSBieSBXZW5zb25nIFpoYW5nIGFuZCBQZXRlciBLZXNlLAotICogd2l0aCBjaGFuZ2VzL2ZpeGVzIGZyb20gSnVsaWFuIEFuYXN0YXNvdiwgTGFycyBNYXJvd3NreS1CcmVlLCBIb3JtcwotICogYW5kIG90aGVycy4KLSAqCi0gKiBDaGFuZ2VzOgotICoJUGF1bCBgUnVzdHknIFJ1c3NlbGwJCXByb3Blcmx5IGhhbmRsZSBub24tbGluZWFyIHNrYnMKLSAqCUhhcmFsZCBXZWx0ZQkJCWRvbid0IHVzZSBuZmNhY2hlCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLQotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+Ci0jaW5jbHVkZSA8bmV0L2ljbXAuaD4gICAgICAgICAgICAgICAgICAgLyogZm9yIGljbXBfc2VuZCAqLwotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKTsKLUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIpOwotRVhQT1JUX1NZTUJPTChpcF92c19za2JfcmVwbGFjZSk7Ci1FWFBPUlRfU1lNQk9MKGlwX3ZzX3Byb3RvX25hbWUpOwotRVhQT1JUX1NZTUJPTChpcF92c19jb25uX25ldyk7Ci1FWFBPUlRfU1lNQk9MKGlwX3ZzX2Nvbm5faW5fZ2V0KTsKLUVYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9vdXRfZ2V0KTsKLSNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVENQCi1FWFBPUlRfU1lNQk9MKGlwX3ZzX3RjcF9jb25uX2xpc3Rlbik7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9wdXQpOwotI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRwotRVhQT1JUX1NZTUJPTChpcF92c19nZXRfZGVidWdfbGV2ZWwpOwotI2VuZGlmCi0KLQotLyogSUQgdXNlZCBpbiBJQ01QIGxvb2t1cHMgKi8KLSNkZWZpbmUgaWNtcF9pZChpY21waCkgICAgICAgICAgKCgoaWNtcGgpLT51bikuZWNoby5pZCkKLQotY29uc3QgY2hhciAqaXBfdnNfcHJvdG9fbmFtZSh1bnNpZ25lZCBwcm90bykKLXsKLQlzdGF0aWMgY2hhciBidWZbMjBdOwotCi0Jc3dpdGNoIChwcm90bykgewotCWNhc2UgSVBQUk9UT19JUDoKLQkJcmV0dXJuICJJUCI7Ci0JY2FzZSBJUFBST1RPX1VEUDoKLQkJcmV0dXJuICJVRFAiOwotCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCXJldHVybiAiVENQIjsKLQljYXNlIElQUFJPVE9fSUNNUDoKLQkJcmV0dXJuICJJQ01QIjsKLQlkZWZhdWx0OgotCQlzcHJpbnRmKGJ1ZiwgIklQXyVkIiwgcHJvdG8pOwotCQlyZXR1cm4gYnVmOwotCX0KLX0KLQotdm9pZCBpcF92c19pbml0X2hhc2hfdGFibGUoc3RydWN0IGxpc3RfaGVhZCAqdGFibGUsIGludCByb3dzKQotewotCXdoaWxlICgtLXJvd3MgPj0gMCkKLQkJSU5JVF9MSVNUX0hFQUQoJnRhYmxlW3Jvd3NdKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pcF92c19pbl9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKLQlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgewotCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOwotCQlkZXN0LT5zdGF0cy5pbnBrdHMrKzsKLQkJZGVzdC0+c3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKLQkJc3Bpbl91bmxvY2soJmRlc3QtPnN0YXRzLmxvY2spOwotCi0JCXNwaW5fbG9jaygmZGVzdC0+c3ZjLT5zdGF0cy5sb2NrKTsKLQkJZGVzdC0+c3ZjLT5zdGF0cy5pbnBrdHMrKzsKLQkJZGVzdC0+c3ZjLT5zdGF0cy5pbmJ5dGVzICs9IHNrYi0+bGVuOwotCQlzcGluX3VubG9jaygmZGVzdC0+c3ZjLT5zdGF0cy5sb2NrKTsKLQotCQlzcGluX2xvY2soJmlwX3ZzX3N0YXRzLmxvY2spOwotCQlpcF92c19zdGF0cy5pbnBrdHMrKzsKLQkJaXBfdnNfc3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKLQkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOwotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlwX3ZzX291dF9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKLQlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgewotCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOwotCQlkZXN0LT5zdGF0cy5vdXRwa3RzKys7Ci0JCWRlc3QtPnN0YXRzLm91dGJ5dGVzICs9IHNrYi0+bGVuOwotCQlzcGluX3VubG9jaygmZGVzdC0+c3RhdHMubG9jayk7Ci0KLQkJc3Bpbl9sb2NrKCZkZXN0LT5zdmMtPnN0YXRzLmxvY2spOwotCQlkZXN0LT5zdmMtPnN0YXRzLm91dHBrdHMrKzsKLQkJZGVzdC0+c3ZjLT5zdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKLQkJc3Bpbl91bmxvY2soJmRlc3QtPnN2Yy0+c3RhdHMubG9jayk7Ci0KLQkJc3Bpbl9sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKLQkJaXBfdnNfc3RhdHMub3V0cGt0cysrOwotCQlpcF92c19zdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKLQkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOwotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlwX3ZzX2Nvbm5fc3RhdHMoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXNwaW5fbG9jaygmY3AtPmRlc3QtPnN0YXRzLmxvY2spOwotCWNwLT5kZXN0LT5zdGF0cy5jb25ucysrOwotCXNwaW5fdW5sb2NrKCZjcC0+ZGVzdC0+c3RhdHMubG9jayk7Ci0KLQlzcGluX2xvY2soJnN2Yy0+c3RhdHMubG9jayk7Ci0Jc3ZjLT5zdGF0cy5jb25ucysrOwotCXNwaW5fdW5sb2NrKCZzdmMtPnN0YXRzLmxvY2spOwotCi0Jc3Bpbl9sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKLQlpcF92c19zdGF0cy5jb25ucysrOwotCXNwaW5fdW5sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludAotaXBfdnNfc2V0X3N0YXRlKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKLQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLQlpZiAodW5saWtlbHkoIXBwLT5zdGF0ZV90cmFuc2l0aW9uKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcHApOwotfQotCi0KLS8qCi0gKiAgSVBWUyBwZXJzaXN0ZW50IHNjaGVkdWxpbmcgZnVuY3Rpb24KLSAqICBJdCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBhY2NvcmRpbmcgdG8gaXRzIHRlbXBsYXRlIGlmIGV4aXN0cywKLSAqICBvciBzZWxlY3RzIGEgc2VydmVyIGFuZCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBwbHVzIGEgdGVtcGxhdGUuCi0gKiAgTG9ja2luZzogd2UgYXJlIHN2YyB1c2VyIChzdmMtPnJlZmNudCksIHNvIHdlIGhvbGQgYWxsIGRlc3RzIHRvbwotICogIFByb3RvY29scyBzdXBwb3J0ZWQ6IFRDUCwgVURQCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCi1pcF92c19zY2hlZF9wZXJzaXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCi0JCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgX19iZTE2IHBvcnRzWzJdKQotewotCXN0cnVjdCBpcF92c19jb25uICpjcCA9IE5VTEw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3Q7Ci0JX19iZTE2ICBkcG9ydDsJIC8qIGRlc3RpbmF0aW9uIHBvcnQgdG8gZm9yd2FyZCAqLwotCV9fYmUzMiAgc25ldDsJIC8qIHNvdXJjZSBuZXR3b3JrIG9mIHRoZSBjbGllbnQsIGFmdGVyIG1hc2tpbmcgKi8KLQotCS8qIE1hc2sgc2FkZHIgd2l0aCB0aGUgbmV0bWFzayB0byBhZGp1c3QgdGVtcGxhdGUgZ3JhbnVsYXJpdHkgKi8KLQlzbmV0ID0gaXBoLT5zYWRkciAmIHN2Yy0+bmV0bWFzazsKLQotCUlQX1ZTX0RCRyg2LCAicC1zY2hlZHVsZTogc3JjICV1LiV1LiV1LiV1OiV1IGRlc3QgJXUuJXUuJXUuJXU6JXUgIgotCQkgICJtbmV0ICV1LiV1LiV1LiV1XG4iLAotCQkgIE5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHBvcnRzWzBdKSwKLQkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyhwb3J0c1sxXSksCi0JCSAgTklQUVVBRChzbmV0KSk7Ci0KLQkvKgotCSAqIEFzIGZhciBhcyB3ZSBrbm93LCBGVFAgaXMgYSB2ZXJ5IGNvbXBsaWNhdGVkIG5ldHdvcmsgcHJvdG9jb2wsIGFuZAotCSAqIGl0IHVzZXMgY29udHJvbCBjb25uZWN0aW9uIGFuZCBkYXRhIGNvbm5lY3Rpb25zLiBGb3IgYWN0aXZlIEZUUCwKLQkgKiBGVFAgc2VydmVyIGluaXRpYWxpemUgZGF0YSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQsIGl0cyBzb3VyY2UgcG9ydAotCSAqIGlzIG9mdGVuIDIwLiBGb3IgcGFzc2l2ZSBGVFAsIEZUUCBzZXJ2ZXIgdGVsbHMgdGhlIGNsaWVudHMgdGhlIHBvcnQKLQkgKiB0aGF0IGl0IHBhc3NpdmVseSBsaXN0ZW5zIHRvLCAgYW5kIHRoZSBjbGllbnQgaXNzdWVzIHRoZSBkYXRhCi0JICogY29ubmVjdGlvbi4gSW4gdGhlIHR1bm5lbGluZyBvciBkaXJlY3Qgcm91dGluZyBtb2RlLCB0aGUgbG9hZAotCSAqIGJhbGFuY2VyIGlzIG9uIHRoZSBjbGllbnQtdG8tc2VydmVyIGhhbGYgb2YgY29ubmVjdGlvbiwgdGhlIHBvcnQKLQkgKiBudW1iZXIgaXMgdW5rbm93biB0byB0aGUgbG9hZCBiYWxhbmNlci4gU28sIGEgY29ubiB0ZW1wbGF0ZSBsaWtlCi0JICogPGNhZGRyLCAwLCB2YWRkciwgMCwgZGFkZHIsIDA+IGlzIGNyZWF0ZWQgZm9yIHBlcnNpc3RlbnQgRlRQCi0JICogc2VydmljZSwgYW5kIGEgdGVtcGxhdGUgbGlrZSA8Y2FkZHIsIDAsIHZhZGRyLCB2cG9ydCwgZGFkZHIsIGRwb3J0PgotCSAqIGlzIGNyZWF0ZWQgZm9yIG90aGVyIHBlcnNpc3RlbnQgc2VydmljZXMuCi0JICovCi0JaWYgKHBvcnRzWzFdID09IHN2Yy0+cG9ydCkgewotCQkvKiBDaGVjayBpZiBhIHRlbXBsYXRlIGFscmVhZHkgZXhpc3RzICovCi0JCWlmIChzdmMtPnBvcnQgIT0gRlRQUE9SVCkKLQkJCWN0ID0gaXBfdnNfY3RfaW5fZ2V0KGlwaC0+cHJvdG9jb2wsIHNuZXQsIDAsCi0JCQkJCSAgICAgICBpcGgtPmRhZGRyLCBwb3J0c1sxXSk7Ci0JCWVsc2UKLQkJCWN0ID0gaXBfdnNfY3RfaW5fZ2V0KGlwaC0+cHJvdG9jb2wsIHNuZXQsIDAsCi0JCQkJCSAgICAgICBpcGgtPmRhZGRyLCAwKTsKLQotCQlpZiAoIWN0IHx8ICFpcF92c19jaGVja190ZW1wbGF0ZShjdCkpIHsKLQkJCS8qCi0JCQkgKiBObyB0ZW1wbGF0ZSBmb3VuZCBvciB0aGUgZGVzdCBvZiB0aGUgY29ubmVjdGlvbgotCQkJICogdGVtcGxhdGUgaXMgbm90IGF2YWlsYWJsZS4KLQkJCSAqLwotCQkJZGVzdCA9IHN2Yy0+c2NoZWR1bGVyLT5zY2hlZHVsZShzdmMsIHNrYik7Ci0JCQlpZiAoZGVzdCA9PSBOVUxMKSB7Ci0JCQkJSVBfVlNfREJHKDEsICJwLXNjaGVkdWxlOiBubyBkZXN0IGZvdW5kLlxuIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBDcmVhdGUgYSB0ZW1wbGF0ZSBsaWtlIDxwcm90b2NvbCxjYWRkciwwLAotCQkJICogdmFkZHIsdnBvcnQsZGFkZHIsZHBvcnQ+IGZvciBub24tZnRwIHNlcnZpY2UsCi0JCQkgKiBhbmQgPHByb3RvY29sLGNhZGRyLDAsdmFkZHIsMCxkYWRkciwwPgotCQkJICogZm9yIGZ0cCBzZXJ2aWNlLgotCQkJICovCi0JCQlpZiAoc3ZjLT5wb3J0ICE9IEZUUFBPUlQpCi0JCQkJY3QgPSBpcF92c19jb25uX25ldyhpcGgtPnByb3RvY29sLAotCQkJCQkJICAgIHNuZXQsIDAsCi0JCQkJCQkgICAgaXBoLT5kYWRkciwKLQkJCQkJCSAgICBwb3J0c1sxXSwKLQkJCQkJCSAgICBkZXN0LT5hZGRyLCBkZXN0LT5wb3J0LAotCQkJCQkJICAgIElQX1ZTX0NPTk5fRl9URU1QTEFURSwKLQkJCQkJCSAgICBkZXN0KTsKLQkJCWVsc2UKLQkJCQljdCA9IGlwX3ZzX2Nvbm5fbmV3KGlwaC0+cHJvdG9jb2wsCi0JCQkJCQkgICAgc25ldCwgMCwKLQkJCQkJCSAgICBpcGgtPmRhZGRyLCAwLAotCQkJCQkJICAgIGRlc3QtPmFkZHIsIDAsCi0JCQkJCQkgICAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFLAotCQkJCQkJICAgIGRlc3QpOwotCQkJaWYgKGN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCWN0LT50aW1lb3V0ID0gc3ZjLT50aW1lb3V0OwotCQl9IGVsc2UgewotCQkJLyogc2V0IGRlc3RpbmF0aW9uIHdpdGggdGhlIGZvdW5kIHRlbXBsYXRlICovCi0JCQlkZXN0ID0gY3QtPmRlc3Q7Ci0JCX0KLQkJZHBvcnQgPSBkZXN0LT5wb3J0OwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE5vdGU6IHBlcnNpc3RlbnQgZndtYXJrLWJhc2VkIHNlcnZpY2VzIGFuZCBwZXJzaXN0ZW50Ci0JCSAqIHBvcnQgemVybyBzZXJ2aWNlIGFyZSBoYW5kbGVkIGhlcmUuCi0JCSAqIGZ3bWFyayB0ZW1wbGF0ZTogPElQUFJPVE9fSVAsY2FkZHIsMCxmd21hcmssMCxkYWRkciwwPgotCQkgKiBwb3J0IHplcm8gdGVtcGxhdGU6IDxwcm90b2NvbCxjYWRkciwwLHZhZGRyLDAsZGFkZHIsMD4KLQkJICovCi0JCWlmIChzdmMtPmZ3bWFyaykKLQkJCWN0ID0gaXBfdnNfY3RfaW5fZ2V0KElQUFJPVE9fSVAsIHNuZXQsIDAsCi0JCQkJCSAgICAgICBodG9ubChzdmMtPmZ3bWFyayksIDApOwotCQllbHNlCi0JCQljdCA9IGlwX3ZzX2N0X2luX2dldChpcGgtPnByb3RvY29sLCBzbmV0LCAwLAotCQkJCQkgICAgICAgaXBoLT5kYWRkciwgMCk7Ci0KLQkJaWYgKCFjdCB8fCAhaXBfdnNfY2hlY2tfdGVtcGxhdGUoY3QpKSB7Ci0JCQkvKgotCQkJICogSWYgaXQgaXMgbm90IHBlcnNpc3RlbnQgcG9ydCB6ZXJvLCByZXR1cm4gTlVMTCwKLQkJCSAqIG90aGVyd2lzZSBjcmVhdGUgYSBjb25uZWN0aW9uIHRlbXBsYXRlLgotCQkJICovCi0JCQlpZiAoc3ZjLT5wb3J0KQotCQkJCXJldHVybiBOVUxMOwotCi0JCQlkZXN0ID0gc3ZjLT5zY2hlZHVsZXItPnNjaGVkdWxlKHN2Yywgc2tiKTsKLQkJCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJCQlJUF9WU19EQkcoMSwgInAtc2NoZWR1bGU6IG5vIGRlc3QgZm91bmQuXG4iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENyZWF0ZSBhIHRlbXBsYXRlIGFjY29yZGluZyB0byB0aGUgc2VydmljZQotCQkJICovCi0JCQlpZiAoc3ZjLT5md21hcmspCi0JCQkJY3QgPSBpcF92c19jb25uX25ldyhJUFBST1RPX0lQLAotCQkJCQkJICAgIHNuZXQsIDAsCi0JCQkJCQkgICAgaHRvbmwoc3ZjLT5md21hcmspLCAwLAotCQkJCQkJICAgIGRlc3QtPmFkZHIsIDAsCi0JCQkJCQkgICAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFLAotCQkJCQkJICAgIGRlc3QpOwotCQkJZWxzZQotCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKLQkJCQkJCSAgICBzbmV0LCAwLAotCQkJCQkJICAgIGlwaC0+ZGFkZHIsIDAsCi0JCQkJCQkgICAgZGVzdC0+YWRkciwgMCwKLQkJCQkJCSAgICBJUF9WU19DT05OX0ZfVEVNUExBVEUsCi0JCQkJCQkgICAgZGVzdCk7Ci0JCQlpZiAoY3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJY3QtPnRpbWVvdXQgPSBzdmMtPnRpbWVvdXQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzZXQgZGVzdGluYXRpb24gd2l0aCB0aGUgZm91bmQgdGVtcGxhdGUgKi8KLQkJCWRlc3QgPSBjdC0+ZGVzdDsKLQkJfQotCQlkcG9ydCA9IHBvcnRzWzFdOwotCX0KLQotCS8qCi0JICogICAgQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSB0ZW1wbGF0ZQotCSAqLwotCWNwID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKLQkJCSAgICBpcGgtPnNhZGRyLCBwb3J0c1swXSwKLQkJCSAgICBpcGgtPmRhZGRyLCBwb3J0c1sxXSwKLQkJCSAgICBkZXN0LT5hZGRyLCBkcG9ydCwKLQkJCSAgICAwLAotCQkJICAgIGRlc3QpOwotCWlmIChjcCA9PSBOVUxMKSB7Ci0JCWlwX3ZzX2Nvbm5fcHV0KGN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyoKLQkgKiAgICBBZGQgaXRzIGNvbnRyb2wKLQkgKi8KLQlpcF92c19jb250cm9sX2FkZChjcCwgY3QpOwotCWlwX3ZzX2Nvbm5fcHV0KGN0KTsKLQotCWlwX3ZzX2Nvbm5fc3RhdHMoY3AsIHN2Yyk7Ci0JcmV0dXJuIGNwOwotfQotCi0KLS8qCi0gKiAgSVBWUyBtYWluIHNjaGVkdWxpbmcgZnVuY3Rpb24KLSAqICBJdCBzZWxlY3RzIGEgc2VydmVyIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBzZXJ2aWNlLCBhbmQKLSAqICBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeS4KLSAqICBQcm90b2NvbHMgc3VwcG9ydGVkOiBUQ1AsIFVEUAotICovCi1zdHJ1Y3QgaXBfdnNfY29ubiAqCi1pcF92c19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcF92c19jb25uICpjcCA9IE5VTEw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKLQotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCo0LAotCQkJCSAgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7Ci0JaWYgKHBwdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqICAgIFBlcnNpc3RlbnQgc2VydmljZQotCSAqLwotCWlmIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfUEVSU0lTVEVOVCkKLQkJcmV0dXJuIGlwX3ZzX3NjaGVkX3BlcnNpc3Qoc3ZjLCBza2IsIHBwdHIpOwotCi0JLyoKLQkgKiAgICBOb24tcGVyc2lzdGVudCBzZXJ2aWNlCi0JICovCi0JaWYgKCFzdmMtPmZ3bWFyayAmJiBwcHRyWzFdICE9IHN2Yy0+cG9ydCkgewotCQlpZiAoIXN2Yy0+cG9ydCkKLQkJCUlQX1ZTX0VSUigiU2NoZWR1bGU6IHBvcnQgemVybyBvbmx5IHN1cHBvcnRlZCAiCi0JCQkJICAiaW4gcGVyc2lzdGVudCBzZXJ2aWNlcywgIgotCQkJCSAgImNoZWNrIHlvdXIgaXB2cyBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZGVzdCA9IHN2Yy0+c2NoZWR1bGVyLT5zY2hlZHVsZShzdmMsIHNrYik7Ci0JaWYgKGRlc3QgPT0gTlVMTCkgewotCQlJUF9WU19EQkcoMSwgIlNjaGVkdWxlOiBubyBkZXN0IGZvdW5kLlxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qCi0JICogICAgQ3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KLQkgKi8KLQljcCA9IGlwX3ZzX2Nvbm5fbmV3KGlwaC0+cHJvdG9jb2wsCi0JCQkgICAgaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCSAgICBpcGgtPmRhZGRyLCBwcHRyWzFdLAotCQkJICAgIGRlc3QtPmFkZHIsIGRlc3QtPnBvcnQ/ZGVzdC0+cG9ydDpwcHRyWzFdLAotCQkJICAgIDAsCi0JCQkgICAgZGVzdCk7Ci0JaWYgKGNwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JSVBfVlNfREJHKDYsICJTY2hlZHVsZSBmd2Q6JWMgYzoldS4ldS4ldS4ldToldSB2OiV1LiV1LiV1LiV1OiV1ICIKLQkJICAiZDoldS4ldS4ldS4ldToldSBjb25uLT5mbGFnczolWCBjb25uLT5yZWZjbnQ6JWRcbiIsCi0JCSAgaXBfdnNfZndkX3RhZyhjcCksCi0JCSAgTklQUVVBRChjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAotCQkgIE5JUFFVQUQoY3AtPnZhZGRyKSwgbnRvaHMoY3AtPnZwb3J0KSwKLQkJICBOSVBRVUFEKGNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCi0JCSAgY3AtPmZsYWdzLCBhdG9taWNfcmVhZCgmY3AtPnJlZmNudCkpOwotCi0JaXBfdnNfY29ubl9zdGF0cyhjcCwgc3ZjKTsKLQlyZXR1cm4gY3A7Ci19Ci0KLQotLyoKLSAqICBQYXNzIG9yIGRyb3AgdGhlIHBhY2tldC4KLSAqICBDYWxsZWQgYnkgaXBfdnNfaW4sIHdoZW4gdGhlIHZpcnR1YWwgc2VydmljZSBpcyBhdmFpbGFibGUgYnV0Ci0gKiAgbm8gZGVzdGluYXRpb24gaXMgYXZhaWxhYmxlIGZvciBhIG5ldyBjb25uZWN0aW9uLgotICovCi1pbnQgaXBfdnNfbGVhdmUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCi0JcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsKjQsCi0JCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKSB7Ci0JCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotCS8qIGlmIGl0IGlzIGZ3bWFyay1iYXNlZCBzZXJ2aWNlLCB0aGUgY2FjaGVfYnlwYXNzIHN5c2N0bCBpcyB1cAotCSAgIGFuZCB0aGUgZGVzdGluYXRpb24gaXMgUlROX1VOSUNBU1QgKGFuZCBub3QgbG9jYWwpLCB0aGVuIGNyZWF0ZQotCSAgIGEgY2FjaGVfYnlwYXNzIGNvbm5lY3Rpb24gZW50cnkgKi8KLQlpZiAoc3lzY3RsX2lwX3ZzX2NhY2hlX2J5cGFzcyAmJiBzdmMtPmZ3bWFyawotCSAgICAmJiAoaW5ldF9hZGRyX3R5cGUoJmluaXRfbmV0LCBpcGgtPmRhZGRyKSA9PSBSVE5fVU5JQ0FTVCkpIHsKLQkJaW50IHJldCwgY3M7Ci0JCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQotCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCi0JCS8qIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGVudHJ5ICovCi0JCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGVhdmU6IGNyZWF0ZSBhIGNhY2hlX2J5cGFzcyBlbnRyeVxuIik7Ci0JCWNwID0gaXBfdnNfY29ubl9uZXcoaXBoLT5wcm90b2NvbCwKLQkJCQkgICAgaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkgICAgaXBoLT5kYWRkciwgcHB0clsxXSwKLQkJCQkgICAgMCwgMCwKLQkJCQkgICAgSVBfVlNfQ09OTl9GX0JZUEFTUywKLQkJCQkgICAgTlVMTCk7Ci0JCWlmIChjcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5GX0RST1A7Ci0KLQkJLyogc3RhdGlzdGljcyAqLwotCQlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKLQotCQkvKiBzZXQgc3RhdGUgKi8KLQkJY3MgPSBpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9JTlBVVCwgc2tiLCBwcCk7Ci0KLQkJLyogdHJhbnNtaXQgdGhlIGZpcnN0IFNZTiBwYWNrZXQgKi8KLQkJcmV0ID0gY3AtPnBhY2tldF94bWl0KHNrYiwgY3AsIHBwKTsKLQkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCi0KLQkJYXRvbWljX2luYygmY3AtPmluX3BrdHMpOwotCQlpcF92c19jb25uX3B1dChjcCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBXaGVuIHRoZSB2aXJ0dWFsIGZ0cCBzZXJ2aWNlIGlzIHByZXNlbnRlZCwgcGFja2V0cyBkZXN0aW5lZAotCSAqIGZvciBvdGhlciBzZXJ2aWNlcyBvbiB0aGUgVklQIG1heSBnZXQgaGVyZSAoZXhjZXB0IHNlcnZpY2VzCi0JICogbGlzdGVkIGluIHRoZSBpcHZzIHRhYmxlKSwgcGFzcyB0aGUgcGFja2V0cywgYmVjYXVzZSBpdCBpcwotCSAqIG5vdCBpcHZzIGpvYiB0byBkZWNpZGUgdG8gZHJvcCB0aGUgcGFja2V0cy4KLQkgKi8KLQlpZiAoKHN2Yy0+cG9ydCA9PSBGVFBQT1JUKSAmJiAocHB0clsxXSAhPSBGVFBQT1JUKSkgewotCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7Ci0KLQkvKgotCSAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIHVucmVhY2hhYmxlLCBhbmQKLQkgKiByZWxlYXNlIHRoZSBzb2NrZXQgYnVmZmVyLgotCSAqIFNpbmNlIGl0IGlzIGluIElQIGxheWVyLCB0aGUgVENQIHNvY2tldCBpcyBub3QgYWN0dWFsbHkKLQkgKiBjcmVhdGVkLCB0aGUgVENQIFJTVCBwYWNrZXQgY2Fubm90IGJlIHNlbnQsIGluc3RlYWQgdGhhdAotCSAqIElDTVBfUE9SVF9VTlJFQUNIIGlzIHNlbnQgaGVyZSBubyBtYXR0ZXIgaXQgaXMgVENQL1VEUC4gLS1XWgotCSAqLwotCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7Ci0JcmV0dXJuIE5GX0RST1A7Ci19Ci0KLQotLyoKLSAqICAgICAgSXQgaXMgaG9va2VkIGJlZm9yZSBORl9JUF9QUklfTkFUX1NSQyBhdCB0aGUgTkZfSU5FVF9QT1NUX1JPVVRJTkcKLSAqICAgICAgY2hhaW4sIGFuZCBpcyB1c2VkIGZvciBWUy9OQVQuCi0gKiAgICAgIEl0IGRldGVjdHMgcGFja2V0cyBmb3IgVlMvTkFUIGNvbm5lY3Rpb25zIGFuZCBzZW5kcyB0aGUgcGFja2V0cwotICogICAgICBpbW1lZGlhdGVseS4gVGhpcyBjYW4gYXZvaWQgdGhhdCBpcHRhYmxlX25hdCBtYW5nbGVzIHRoZSBwYWNrZXRzCi0gKiAgICAgIGZvciBWUy9OQVQuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfdnNfcG9zdF9yb3V0aW5nKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCWlmICghc2tiLT5pcHZzX3Byb3BlcnR5KQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCS8qIFRoZSBwYWNrZXQgd2FzIHNlbnQgZnJvbSBJUFZTLCBleGl0IHRoaXMgY2hhaW4gKi8KLQlyZXR1cm4gTkZfU1RPUDsKLX0KLQotX19zdW0xNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQotewotCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF92c19nYXRoZXJfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHVzZXIpCi17Ci0JaW50IGVyciA9IGlwX2RlZnJhZyhza2IsIHVzZXIpOwotCi0JaWYgKCFlcnIpCi0JCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIFBhY2tldCBoYXMgYmVlbiBtYWRlIHN1ZmZpY2llbnRseSB3cml0YWJsZSBpbiBjYWxsZXIKLSAqIC0gaW5vdXQ6IDE9aW4tPm91dCwgMD1vdXQtPmluCi0gKi8KLXZvaWQgaXBfdnNfbmF0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKLQkJICAgIHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGlub3V0KQotewotCXN0cnVjdCBpcGhkciAqaXBoCSA9IGlwX2hkcihza2IpOwotCXVuc2lnbmVkIGludCBpY21wX29mZnNldCA9IGlwaC0+aWhsKjQ7Ci0Jc3RydWN0IGljbXBoZHIgKmljbXBoCSA9IChzdHJ1Y3QgaWNtcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCi0JCQkJCQkgICAgICBpY21wX29mZnNldCk7Ci0Jc3RydWN0IGlwaGRyICpjaXBoCSA9IChzdHJ1Y3QgaXBoZHIgKikoaWNtcGggKyAxKTsKLQotCWlmIChpbm91dCkgewotCQlpcGgtPnNhZGRyID0gY3AtPnZhZGRyOwotCQlpcF9zZW5kX2NoZWNrKGlwaCk7Ci0JCWNpcGgtPmRhZGRyID0gY3AtPnZhZGRyOwotCQlpcF9zZW5kX2NoZWNrKGNpcGgpOwotCX0gZWxzZSB7Ci0JCWlwaC0+ZGFkZHIgPSBjcC0+ZGFkZHI7Ci0JCWlwX3NlbmRfY2hlY2soaXBoKTsKLQkJY2lwaC0+c2FkZHIgPSBjcC0+ZGFkZHI7Ci0JCWlwX3NlbmRfY2hlY2soY2lwaCk7Ci0JfQotCi0JLyogdGhlIFRDUC9VRFAgcG9ydCAqLwotCWlmIChJUFBST1RPX1RDUCA9PSBjaXBoLT5wcm90b2NvbCB8fCBJUFBST1RPX1VEUCA9PSBjaXBoLT5wcm90b2NvbCkgewotCQlfX2JlMTYgKnBvcnRzID0gKHZvaWQgKiljaXBoICsgY2lwaC0+aWhsKjQ7Ci0KLQkJaWYgKGlub3V0KQotCQkJcG9ydHNbMV0gPSBjcC0+dnBvcnQ7Ci0JCWVsc2UKLQkJCXBvcnRzWzBdID0gY3AtPmRwb3J0OwotCX0KLQotCS8qIEFuZCBmaW5hbGx5IHRoZSBJQ01QIGNoZWNrc3VtICovCi0JaWNtcGgtPmNoZWNrc3VtID0gMDsKLQlpY21waC0+Y2hlY2tzdW0gPSBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGljbXBfb2Zmc2V0KTsKLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCi0JaWYgKGlub3V0KQotCQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCAodm9pZCAqKWNpcGggLSAodm9pZCAqKWlwaCwKLQkJCSJGb3J3YXJkaW5nIGFsdGVyZWQgb3V0Z29pbmcgSUNNUCIpOwotCWVsc2UKLQkJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgKHZvaWQgKiljaXBoIC0gKHZvaWQgKilpcGgsCi0JCQkiRm9yd2FyZGluZyBhbHRlcmVkIGluY29taW5nIElDTVAiKTsKLX0KLQotLyoKLSAqCUhhbmRsZSBJQ01QIG1lc3NhZ2VzIGluIHRoZSBpbnNpZGUtdG8tb3V0c2lkZSBkaXJlY3Rpb24gKG91dGdvaW5nKS4KLSAqCUZpbmQgYW55IHRoYXQgbWlnaHQgYmUgcmVsZXZhbnQsIGNoZWNrIGFnYWluc3QgZXhpc3RpbmcgY29ubmVjdGlvbnMsCi0gKglmb3J3YXJkIHRvIHRoZSByaWdodCBkZXN0aW5hdGlvbiBob3N0IGlmIHJlbGV2YW50LgotICoJQ3VycmVudGx5IGhhbmRsZXMgZXJyb3IgdHlwZXMgLSB1bnJlYWNoYWJsZSwgcXVlbmNoLCB0dGwgZXhjZWVkZWQuCi0gKgkoT25seSB1c2VkIGluIFZTL05BVCkKLSAqLwotc3RhdGljIGludCBpcF92c19vdXRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKnJlbGF0ZWQpCi17Ci0Jc3RydWN0IGlwaGRyICppcGg7Ci0Jc3RydWN0IGljbXBoZHIJX2ljbXBoLCAqaWM7Ci0Jc3RydWN0IGlwaGRyCV9jaXBoLCAqY2loOwkvKiBUaGUgaXAgaGVhZGVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIElDTVAgKi8KLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0Jc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpaGwsIHZlcmRpY3Q7Ci0KLQkqcmVsYXRlZCA9IDE7Ci0KLQkvKiByZWFzc2VtYmxlIElQIGZyYWdtZW50cyAqLwotCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKLQkJaWYgKGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpKQotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQl9Ci0KLQlpcGggPSBpcF9oZHIoc2tiKTsKLQlvZmZzZXQgPSBpaGwgPSBpcGgtPmlobCAqIDQ7Ci0JaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKLQlpZiAoaWMgPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlJUF9WU19EQkcoMTIsICJPdXRnb2luZyBJQ01QICglZCwlZCkgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1XG4iLAotCQkgIGljLT50eXBlLCBudG9ocyhpY21wX2lkKGljKSksCi0JCSAgTklQUVVBRChpcGgtPnNhZGRyKSwgTklQUVVBRChpcGgtPmRhZGRyKSk7Ci0KLQkvKgotCSAqIFdvcmsgdGhyb3VnaCBzZWVpbmcgaWYgdGhpcyBpcyBmb3IgdXMuCi0JICogVGhlc2UgY2hlY2tzIGFyZSBzdXBwb3NlZCB0byBiZSBpbiBhbiBvcmRlciB0aGF0IG1lYW5zIGVhc3kKLQkgKiB0aGluZ3MgYXJlIGNoZWNrZWQgZmlyc3QgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZy4uLi4gaG93ZXZlcgotCSAqIHRoaXMgbWVhbnMgdGhhdCBzb21lIHBhY2tldHMgd2lsbCBtYW5hZ2UgdG8gZ2V0IGEgbG9uZyB3YXkKLQkgKiBkb3duIHRoaXMgc3RhY2sgYW5kIHRoZW4gYmUgcmVqZWN0ZWQsIGJ1dCB0aGF0J3MgbGlmZS4KLQkgKi8KLQlpZiAoKGljLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIKSAmJgotCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9TT1VSQ0VfUVVFTkNIKSAmJgotCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9USU1FX0VYQ0VFREVEKSkgewotCQkqcmVsYXRlZCA9IDA7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTm93IGZpbmQgdGhlIGNvbnRhaW5lZCBJUCBoZWFkZXIgKi8KLQlvZmZzZXQgKz0gc2l6ZW9mKF9pY21waCk7Ci0JY2loID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2NpcGgpLCAmX2NpcGgpOwotCWlmIChjaWggPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsgLyogVGhlIHBhY2tldCBsb29rcyB3cm9uZywgaWdub3JlICovCi0KLQlwcCA9IGlwX3ZzX3Byb3RvX2dldChjaWgtPnByb3RvY29sKTsKLQlpZiAoIXBwKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyogSXMgdGhlIGVtYmVkZGVkIHByb3RvY29sIGhlYWRlciBwcmVzZW50PyAqLwotCWlmICh1bmxpa2VseShjaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSAmJgotCQkgICAgIHBwLT5kb250X2RlZnJhZykpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCBvZmZzZXQsICJDaGVja2luZyBvdXRnb2luZyBJQ01QIGZvciIpOwotCi0Jb2Zmc2V0ICs9IGNpaC0+aWhsICogNDsKLQotCS8qIFRoZSBlbWJlZGRlZCBoZWFkZXJzIGNvbnRhaW4gc291cmNlIGFuZCBkZXN0IGluIHJldmVyc2Ugb3JkZXIgKi8KLQljcCA9IHBwLT5jb25uX291dF9nZXQoc2tiLCBwcCwgY2loLCBvZmZzZXQsIDEpOwotCWlmICghY3ApCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQl2ZXJkaWN0ID0gTkZfRFJPUDsKLQotCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSAwKSB7Ci0JCUlQX1ZTX0VSUigic2hvdWxkbid0IHJlYWNoIGhlcmUsIGJlY2F1c2UgdGhlIGJveCBpcyBvbiB0aGUgIgotCQkJICAiaGFsZiBjb25uZWN0aW9uIGluIHRoZSB0dW4vZHIgbW9kdWxlLlxuIik7Ci0JfQotCi0JLyogRW5zdXJlIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0ICovCi0JaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgewotCQkvKiBGYWlsZWQgY2hlY2tzdW0hICovCi0JCUlQX1ZTX0RCRygxLCAiRm9yd2FyZCBJQ01QOiBmYWlsZWQgY2hlY2tzdW0gZnJvbSAlZC4lZC4lZC4lZCFcbiIsCi0JCQkgIE5JUFFVQUQoaXBoLT5zYWRkcikpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoSVBQUk9UT19UQ1AgPT0gY2loLT5wcm90b2NvbCB8fCBJUFBST1RPX1VEUCA9PSBjaWgtPnByb3RvY29sKQotCQlvZmZzZXQgKz0gMiAqIHNpemVvZihfX3UxNik7Ci0JaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIG9mZnNldCkpCi0JCWdvdG8gb3V0OwotCi0JaXBfdnNfbmF0X2ljbXAoc2tiLCBwcCwgY3AsIDEpOwotCi0JLyogZG8gdGhlIHN0YXRpc3RpY3MgYW5kIHB1dCBpdCBiYWNrICovCi0JaXBfdnNfb3V0X3N0YXRzKGNwLCBza2IpOwotCi0Jc2tiLT5pcHZzX3Byb3BlcnR5ID0gMTsKLQl2ZXJkaWN0ID0gTkZfQUNDRVBUOwotCi0gIG91dDoKLQlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKLQotCXJldHVybiB2ZXJkaWN0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpc190Y3BfcmVzZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGgtPnJzdDsKLX0KLQotLyoKLSAqCUl0IGlzIGhvb2tlZCBhdCB0aGUgTkZfSU5FVF9GT1JXQVJEIGNoYWluLCB1c2VkIG9ubHkgZm9yIFZTL05BVC4KLSAqCUNoZWNrIGlmIG91dGdvaW5nIHBhY2tldCBiZWxvbmdzIHRvIHRoZSBlc3RhYmxpc2hlZCBpcF92c19jb25uLAotICogICAgICByZXdyaXRlIGFkZHJlc3NlcyBvZiB0aGUgcGFja2V0IGFuZCBzZW5kIGl0IG9uIGl0cyB3YXkuLi4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludAotaXBfdnNfb3V0KHVuc2lnbmVkIGludCBob29rbnVtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0Jc3RydWN0IGlwaGRyCSppcGg7Ci0Jc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JaW50IGlobDsKLQotCUVudGVyRnVuY3Rpb24oMTEpOwotCi0JaWYgKHNrYi0+aXB2c19wcm9wZXJ0eSkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCWlwaCA9IGlwX2hkcihza2IpOwotCWlmICh1bmxpa2VseShpcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkpIHsKLQkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19vdXRfaWNtcChza2IsICZyZWxhdGVkKTsKLQotCQlpZiAocmVsYXRlZCkKLQkJCXJldHVybiB2ZXJkaWN0OwotCQlpcGggPSBpcF9oZHIoc2tiKTsKLQl9Ci0KLQlwcCA9IGlwX3ZzX3Byb3RvX2dldChpcGgtPnByb3RvY29sKTsKLQlpZiAodW5saWtlbHkoIXBwKSkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKHVubGlrZWx5KGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpICYmCi0JCSAgICAgIXBwLT5kb250X2RlZnJhZykpIHsKLQkJaWYgKGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpKQotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQkJaXBoID0gaXBfaGRyKHNrYik7Ci0JfQotCi0JaWhsID0gaXBoLT5paGwgPDwgMjsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHBhY2tldCBiZWxvbmdzIHRvIGFuIGV4aXN0aW5nIGVudHJ5Ci0JICovCi0JY3AgPSBwcC0+Y29ubl9vdXRfZ2V0KHNrYiwgcHAsIGlwaCwgaWhsLCAwKTsKLQotCWlmICh1bmxpa2VseSghY3ApKSB7Ci0JCWlmIChzeXNjdGxfaXBfdnNfbmF0X2ljbXBfc2VuZCAmJgotCQkgICAgKHBwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAotCQkgICAgIHBwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkpIHsKLQkJCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwotCi0JCQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaWhsLAotCQkJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQkJCWlmIChwcHRyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5GX0FDQ0VQVDsJLyogTm90IGZvciBtZSAqLwotCQkJaWYgKGlwX3ZzX2xvb2t1cF9yZWFsX3NlcnZpY2UoaXBoLT5wcm90b2NvbCwKLQkJCQkJCSAgICAgIGlwaC0+c2FkZHIsIHBwdHJbMF0pKSB7Ci0JCQkJLyoKLQkJCQkgKiBOb3RpZnkgdGhlIHJlYWwgc2VydmVyOiB0aGVyZSBpcyBubwotCQkJCSAqIGV4aXN0aW5nIGVudHJ5IGlmIGl0IGlzIG5vdCBSU1QKLQkJCQkgKiBwYWNrZXQgb3Igbm90IFRDUCBwYWNrZXQuCi0JCQkJICovCi0JCQkJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AKLQkJCQkgICAgfHwgIWlzX3RjcF9yZXNldChza2IpKSB7Ci0JCQkJCWljbXBfc2VuZChza2IsSUNNUF9ERVNUX1VOUkVBQ0gsCi0JCQkJCQkgIElDTVBfUE9SVF9VTlJFQUNILCAwKTsKLQkJCQkJcmV0dXJuIE5GX0RST1A7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlQX1ZTX0RCR19QS1QoMTIsIHBwLCBza2IsIDAsCi0JCQkgICAgICAicGFja2V0IGNvbnRpbnVlcyB0cmF2ZXJzYWwgYXMgbm9ybWFsIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgMCwgIk91dGdvaW5nIHBhY2tldCIpOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIGlobCkpCi0JCWdvdG8gZHJvcDsKLQotCS8qIG1hbmdsZSB0aGUgcGFja2V0ICovCi0JaWYgKHBwLT5zbmF0X2hhbmRsZXIgJiYgIXBwLT5zbmF0X2hhbmRsZXIoc2tiLCBwcCwgY3ApKQotCQlnb3RvIGRyb3A7Ci0JaXBfaGRyKHNrYiktPnNhZGRyID0gY3AtPnZhZGRyOwotCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwotCi0JLyogRm9yIHBvbGljeSByb3V0aW5nLCBwYWNrZXRzIG9yaWdpbmF0aW5nIGZyb20gdGhpcwotCSAqIG1hY2hpbmUgaXRzZWxmIG1heSBiZSByb3V0ZWQgZGlmZmVyZW50bHkgdG8gcGFja2V0cwotCSAqIHBhc3NpbmcgdGhyb3VnaC4gIFdlIHdhbnQgdGhpcyBwYWNrZXQgdG8gYmUgcm91dGVkIGFzCi0JICogaWYgaXQgY2FtZSBmcm9tIHRoaXMgbWFjaGluZSBpdHNlbGYuICBTbyByZS1jb21wdXRlCi0JICogdGhlIHJvdXRpbmcgaW5mb3JtYXRpb24uCi0JICovCi0JaWYgKGlwX3JvdXRlX21lX2hhcmRlcihza2IsIFJUTl9MT0NBTCkgIT0gMCkKLQkJZ290byBkcm9wOwotCi0JSVBfVlNfREJHX1BLVCgxMCwgcHAsIHNrYiwgMCwgIkFmdGVyIFNOQVQiKTsKLQotCWlwX3ZzX291dF9zdGF0cyhjcCwgc2tiKTsKLQlpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9PVVRQVVQsIHNrYiwgcHApOwotCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKLQotCXNrYi0+aXB2c19wcm9wZXJ0eSA9IDE7Ci0KLQlMZWF2ZUZ1bmN0aW9uKDExKTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi0gIGRyb3A6Ci0JaXBfdnNfY29ubl9wdXQoY3ApOwotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORl9TVE9MRU47Ci19Ci0KLQotLyoKLSAqCUhhbmRsZSBJQ01QIG1lc3NhZ2VzIGluIHRoZSBvdXRzaWRlLXRvLWluc2lkZSBkaXJlY3Rpb24gKGluY29taW5nKS4KLSAqCUZpbmQgYW55IHRoYXQgbWlnaHQgYmUgcmVsZXZhbnQsIGNoZWNrIGFnYWluc3QgZXhpc3RpbmcgY29ubmVjdGlvbnMsCi0gKglmb3J3YXJkIHRvIHRoZSByaWdodCBkZXN0aW5hdGlvbiBob3N0IGlmIHJlbGV2YW50LgotICoJQ3VycmVudGx5IGhhbmRsZXMgZXJyb3IgdHlwZXMgLSB1bnJlYWNoYWJsZSwgcXVlbmNoLCB0dGwgZXhjZWVkZWQuCi0gKi8KLXN0YXRpYyBpbnQKLWlwX3ZzX2luX2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpyZWxhdGVkLCB1bnNpZ25lZCBpbnQgaG9va251bSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlzdHJ1Y3QgaWNtcGhkcglfaWNtcGgsICppYzsKLQlzdHJ1Y3QgaXBoZHIJX2NpcGgsICpjaWg7CS8qIFRoZSBpcCBoZWFkZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgSUNNUCAqLwotCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOwotCXVuc2lnbmVkIGludCBvZmZzZXQsIGlobCwgdmVyZGljdDsKLQotCSpyZWxhdGVkID0gMTsKLQotCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgewotCQlpZiAoaXBfdnNfZ2F0aGVyX2ZyYWdzKHNrYiwgaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX0lOID8KLQkJCQkJICAgIElQX0RFRlJBR19WU19JTiA6IElQX0RFRlJBR19WU19GV0QpKQotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQl9Ci0KLQlpcGggPSBpcF9oZHIoc2tiKTsKLQlvZmZzZXQgPSBpaGwgPSBpcGgtPmlobCAqIDQ7Ci0JaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKLQlpZiAoaWMgPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlJUF9WU19EQkcoMTIsICJJbmNvbWluZyBJQ01QICglZCwlZCkgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1XG4iLAotCQkgIGljLT50eXBlLCBudG9ocyhpY21wX2lkKGljKSksCi0JCSAgTklQUVVBRChpcGgtPnNhZGRyKSwgTklQUVVBRChpcGgtPmRhZGRyKSk7Ci0KLQkvKgotCSAqIFdvcmsgdGhyb3VnaCBzZWVpbmcgaWYgdGhpcyBpcyBmb3IgdXMuCi0JICogVGhlc2UgY2hlY2tzIGFyZSBzdXBwb3NlZCB0byBiZSBpbiBhbiBvcmRlciB0aGF0IG1lYW5zIGVhc3kKLQkgKiB0aGluZ3MgYXJlIGNoZWNrZWQgZmlyc3QgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZy4uLi4gaG93ZXZlcgotCSAqIHRoaXMgbWVhbnMgdGhhdCBzb21lIHBhY2tldHMgd2lsbCBtYW5hZ2UgdG8gZ2V0IGEgbG9uZyB3YXkKLQkgKiBkb3duIHRoaXMgc3RhY2sgYW5kIHRoZW4gYmUgcmVqZWN0ZWQsIGJ1dCB0aGF0J3MgbGlmZS4KLQkgKi8KLQlpZiAoKGljLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIKSAmJgotCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9TT1VSQ0VfUVVFTkNIKSAmJgotCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9USU1FX0VYQ0VFREVEKSkgewotCQkqcmVsYXRlZCA9IDA7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTm93IGZpbmQgdGhlIGNvbnRhaW5lZCBJUCBoZWFkZXIgKi8KLQlvZmZzZXQgKz0gc2l6ZW9mKF9pY21waCk7Ci0JY2loID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2NpcGgpLCAmX2NpcGgpOwotCWlmIChjaWggPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsgLyogVGhlIHBhY2tldCBsb29rcyB3cm9uZywgaWdub3JlICovCi0KLQlwcCA9IGlwX3ZzX3Byb3RvX2dldChjaWgtPnByb3RvY29sKTsKLQlpZiAoIXBwKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JLyogSXMgdGhlIGVtYmVkZGVkIHByb3RvY29sIGhlYWRlciBwcmVzZW50PyAqLwotCWlmICh1bmxpa2VseShjaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSAmJgotCQkgICAgIHBwLT5kb250X2RlZnJhZykpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCBvZmZzZXQsICJDaGVja2luZyBpbmNvbWluZyBJQ01QIGZvciIpOwotCi0Jb2Zmc2V0ICs9IGNpaC0+aWhsICogNDsKLQotCS8qIFRoZSBlbWJlZGRlZCBoZWFkZXJzIGNvbnRhaW4gc291cmNlIGFuZCBkZXN0IGluIHJldmVyc2Ugb3JkZXIgKi8KLQljcCA9IHBwLT5jb25uX2luX2dldChza2IsIHBwLCBjaWgsIG9mZnNldCwgMSk7Ci0JaWYgKCFjcCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCXZlcmRpY3QgPSBORl9EUk9QOwotCi0JLyogRW5zdXJlIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0ICovCi0JaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgewotCQkvKiBGYWlsZWQgY2hlY2tzdW0hICovCi0JCUlQX1ZTX0RCRygxLCAiSW5jb21pbmcgSUNNUDogZmFpbGVkIGNoZWNrc3VtIGZyb20gJWQuJWQuJWQuJWQhXG4iLAotCQkJICBOSVBRVUFEKGlwaC0+c2FkZHIpKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogZG8gdGhlIHN0YXRpc3RpY3MgYW5kIHB1dCBpdCBiYWNrICovCi0JaXBfdnNfaW5fc3RhdHMoY3AsIHNrYik7Ci0JaWYgKElQUFJPVE9fVENQID09IGNpaC0+cHJvdG9jb2wgfHwgSVBQUk9UT19VRFAgPT0gY2loLT5wcm90b2NvbCkKLQkJb2Zmc2V0ICs9IDIgKiBzaXplb2YoX191MTYpOwotCXZlcmRpY3QgPSBpcF92c19pY21wX3htaXQoc2tiLCBjcCwgcHAsIG9mZnNldCk7Ci0JLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCi0KLSAgb3V0OgotCV9faXBfdnNfY29ubl9wdXQoY3ApOwotCi0JcmV0dXJuIHZlcmRpY3Q7Ci19Ci0KLS8qCi0gKglDaGVjayBpZiBpdCdzIGZvciB2aXJ0dWFsIHNlcnZpY2VzLCBsb29rIGl0IHVwLAotICoJYW5kIHNlbmQgaXQgb24gaXRzIHdheS4uLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pcF92c19pbih1bnNpZ25lZCBpbnQgaG9va251bSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQlzdHJ1Y3QgaXBoZHIJKmlwaDsKLQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOwotCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQlpbnQgcmV0LCByZXN0YXJ0OwotCWludCBpaGw7Ci0KLQkvKgotCSAqCUJpZyB0YXBwbzogb25seSBQQUNLRVRfSE9TVCAobmVpdGhlciBsb29wYmFjayBub3IgbWNhc3RzKQotCSAqCS4uLiBkb24ndCBrbm93IHdoeSAxc3QgdGVzdCBET0VTIE5PVCBpbmNsdWRlIDJuZCAoPykKLQkgKi8KLQlpZiAodW5saWtlbHkoc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVAotCQkgICAgIHx8IHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSyB8fCBza2ItPnNrKSkgewotCQlJUF9WU19EQkcoMTIsICJwYWNrZXQgdHlwZT0lZCBwcm90bz0lZCBkYWRkcj0lZC4lZC4lZC4lZCBpZ25vcmVkXG4iLAotCQkJICBza2ItPnBrdF90eXBlLAotCQkJICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCi0JCQkgIE5JUFFVQUQoaXBfaGRyKHNrYiktPmRhZGRyKSk7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JaWYgKHVubGlrZWx5KGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSkgewotCQlpbnQgcmVsYXRlZCwgdmVyZGljdCA9IGlwX3ZzX2luX2ljbXAoc2tiLCAmcmVsYXRlZCwgaG9va251bSk7Ci0KLQkJaWYgKHJlbGF0ZWQpCi0JCQlyZXR1cm4gdmVyZGljdDsKLQkJaXBoID0gaXBfaGRyKHNrYik7Ci0JfQotCi0JLyogUHJvdG9jb2wgc3VwcG9ydGVkPyAqLwotCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGlwaC0+cHJvdG9jb2wpOwotCWlmICh1bmxpa2VseSghcHApKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JaWhsID0gaXBoLT5paGwgPDwgMjsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHBhY2tldCBiZWxvbmdzIHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gZW50cnkKLQkgKi8KLQljcCA9IHBwLT5jb25uX2luX2dldChza2IsIHBwLCBpcGgsIGlobCwgMCk7Ci0KLQlpZiAodW5saWtlbHkoIWNwKSkgewotCQlpbnQgdjsKLQotCQlpZiAoIXBwLT5jb25uX3NjaGVkdWxlKHNrYiwgcHAsICZ2LCAmY3ApKQotCQkJcmV0dXJuIHY7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFjcCkpIHsKLQkJLyogc29ycnksIGFsbCB0aGlzIHRyb3VibGUgZm9yIGEgbm8taGl0IDopICovCi0JCUlQX1ZTX0RCR19QS1QoMTIsIHBwLCBza2IsIDAsCi0JCQkgICAgICAicGFja2V0IGNvbnRpbnVlcyB0cmF2ZXJzYWwgYXMgbm9ybWFsIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgMCwgIkluY29taW5nIHBhY2tldCIpOwotCi0JLyogQ2hlY2sgdGhlIHNlcnZlciBzdGF0dXMgKi8KLQlpZiAoY3AtPmRlc3QgJiYgIShjcC0+ZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgewotCQkvKiB0aGUgZGVzdGluYXRpb24gc2VydmVyIGlzIG5vdCBhdmFpbGFibGUgKi8KLQotCQlpZiAoc3lzY3RsX2lwX3ZzX2V4cGlyZV9ub2Rlc3RfY29ubikgewotCQkJLyogdHJ5IHRvIGV4cGlyZSB0aGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSAqLwotCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKLQkJfQotCQkvKiBkb24ndCByZXN0YXJ0IGl0cyB0aW1lciwgYW5kIHNpbGVudGx5Ci0JCSAgIGRyb3AgdGhlIHBhY2tldC4gKi8KLQkJX19pcF92c19jb25uX3B1dChjcCk7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOwotCXJlc3RhcnQgPSBpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9JTlBVVCwgc2tiLCBwcCk7Ci0JaWYgKGNwLT5wYWNrZXRfeG1pdCkKLQkJcmV0ID0gY3AtPnBhY2tldF94bWl0KHNrYiwgY3AsIHBwKTsKLQkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCi0JZWxzZSB7Ci0JCUlQX1ZTX0RCR19STCgid2FybmluZzogcGFja2V0X3htaXQgaXMgbnVsbCIpOwotCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogSW5jcmVhc2UgaXRzIHBhY2tldCBjb3VudGVyIGFuZCBjaGVjayBpZiBpdCBpcyBuZWVkZWQKLQkgKiB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKgotCSAqIFN5bmMgY29ubmVjdGlvbiBpZiBpdCBpcyBhYm91dCB0byBjbG9zZSB0bwotCSAqIGVuY29yYWdlIHRoZSBzdGFuZGJ5IHNlcnZlcnMgdG8gdXBkYXRlIHRoZSBjb25uZWN0aW9ucyB0aW1lb3V0Ci0JICovCi0JYXRvbWljX2luYygmY3AtPmluX3BrdHMpOwotCWlmICgoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikgJiYKLQkgICAgKCgoY3AtPnByb3RvY29sICE9IElQUFJPVE9fVENQIHx8Ci0JICAgICAgIGNwLT5zdGF0ZSA9PSBJUF9WU19UQ1BfU19FU1RBQkxJU0hFRCkgJiYKLQkgICAgICAoYXRvbWljX3JlYWQoJmNwLT5pbl9wa3RzKSAlIHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFsxXQotCSAgICAgICA9PSBzeXNjdGxfaXBfdnNfc3luY190aHJlc2hvbGRbMF0pKSB8fAotCSAgICAgKChjcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApICYmIChjcC0+b2xkX3N0YXRlICE9IGNwLT5zdGF0ZSkgJiYKLQkgICAgICAoKGNwLT5zdGF0ZSA9PSBJUF9WU19UQ1BfU19GSU5fV0FJVCkgfHwKLQkgICAgICAgKGNwLT5zdGF0ZSA9PSBJUF9WU19UQ1BfU19DTE9TRV9XQUlUKSB8fAotCSAgICAgICAoY3AtPnN0YXRlID09IElQX1ZTX1RDUF9TX1RJTUVfV0FJVCkpKSkpCi0JCWlwX3ZzX3N5bmNfY29ubihjcCk7Ci0JY3AtPm9sZF9zdGF0ZSA9IGNwLT5zdGF0ZTsKLQotCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKglJdCBpcyBob29rZWQgYXQgdGhlIE5GX0lORVRfRk9SV0FSRCBjaGFpbiwgaW4gb3JkZXIgdG8gY2F0Y2ggSUNNUAotICogICAgICByZWxhdGVkIHBhY2tldHMgZGVzdGluZWQgZm9yIDAuMC4wLjAvMC4KLSAqICAgICAgV2hlbiBmd21hcmstYmFzZWQgdmlydHVhbCBzZXJ2aWNlIGlzIHVzZWQsIHN1Y2ggYXMgdHJhbnNwYXJlbnQKLSAqICAgICAgY2FjaGUgY2x1c3RlciwgVENQIHBhY2tldHMgY2FuIGJlIG1hcmtlZCBhbmQgcm91dGVkIHRvIGlwX3ZzX2luLAotICogICAgICBidXQgSUNNUCBkZXN0aW5lZCBmb3IgMC4wLjAuMC8wIGNhbm5vdCBub3QgYmUgZWFzaWx5IG1hcmtlZCBhbmQKLSAqICAgICAgc2VudCB0byBpcF92c19pbl9pY21wLiBTbywgY2F0Y2ggdGhlbSBhdCB0aGUgTkZfSU5FVF9GT1JXQVJEIGNoYWluCi0gKiAgICAgIGFuZCBzZW5kIHRoZW0gdG8gaXBfdnNfaW5faWNtcC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludAotaXBfdnNfZm9yd2FyZF9pY21wKHVuc2lnbmVkIGludCBob29rbnVtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCWludCByOwotCi0JaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX0lDTVApCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlyZXR1cm4gaXBfdnNfaW5faWNtcChza2IsICZyLCBob29rbnVtKTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX3ZzX29wc1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgZm9yd2FyZCBwYWNrZXQgdGhyb3VnaCBWUy9EUiwgVlMvVFVOLAotCSAqIG9yIFZTL05BVChjaGFuZ2UgZGVzdGluYXRpb24pLCBzbyB0aGF0IGZpbHRlcmluZyBydWxlcyBjYW4gYmUKLQkgKiBhcHBsaWVkIHRvIElQVlMuICovCi0JewotCQkuaG9vawkJPSBpcF92c19pbiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5ICAgICAgID0gMTAwLAotCX0sCi0JLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KLQl7Ci0JCS5ob29rCQk9IGlwX3ZzX291dCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9GT1JXQVJELAotCQkucHJpb3JpdHkgICAgICAgPSAxMDAsCi0JfSwKLQkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nIChidXQgYmVmb3JlIGlwX3ZzX291dF9pY21wKSwgY2F0Y2ggaWNtcAotCSAqIGRlc3RpbmVkIGZvciAwLjAuMC4wLzAsIHdoaWNoIGlzIGZvciBpbmNvbWluZyBJUFZTIGNvbm5lY3Rpb25zICovCi0JewotCQkuaG9vawkJPSBpcF92c19mb3J3YXJkX2ljbXAsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfRk9SV0FSRCwKLQkJLnByaW9yaXR5ICAgICAgID0gOTksCi0JfSwKLQkvKiBCZWZvcmUgdGhlIG5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nLCBleGl0IGZyb20gUE9TVF9ST1VUSU5HICovCi0JewotCQkuaG9vawkJPSBpcF92c19wb3N0X3JvdXRpbmcsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfUE9TVF9ST1VUSU5HLAotCQkucHJpb3JpdHkgICAgICAgPSBORl9JUF9QUklfTkFUX1NSQy0xLAotCX0sCi19OwotCi0KLS8qCi0gKglJbml0aWFsaXplIElQIFZpcnR1YWwgU2VydmVyCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaXBfdnNfY29udHJvbF9pbml0KCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVBfVlNfRVJSKCJjYW4ndCBzZXR1cCBjb250cm9sLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9ub3RoaW5nOwotCX0KLQotCWlwX3ZzX3Byb3RvY29sX2luaXQoKTsKLQotCXJldCA9IGlwX3ZzX2FwcF9pbml0KCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVBfVlNfRVJSKCJjYW4ndCBzZXR1cCBhcHBsaWNhdGlvbiBoZWxwZXIuXG4iKTsKLQkJZ290byBjbGVhbnVwX3Byb3RvY29sOwotCX0KLQotCXJldCA9IGlwX3ZzX2Nvbm5faW5pdCgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCUlQX1ZTX0VSUigiY2FuJ3Qgc2V0dXAgY29ubmVjdGlvbiB0YWJsZS5cbiIpOwotCQlnb3RvIGNsZWFudXBfYXBwOwotCX0KLQotCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2tzKGlwX3ZzX29wcywgQVJSQVlfU0laRShpcF92c19vcHMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlJUF9WU19FUlIoImNhbid0IHJlZ2lzdGVyIGhvb2tzLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9jb25uOwotCX0KLQotCUlQX1ZTX0lORk8oImlwdnMgbG9hZGVkLlxuIik7Ci0JcmV0dXJuIHJldDsKLQotICBjbGVhbnVwX2Nvbm46Ci0JaXBfdnNfY29ubl9jbGVhbnVwKCk7Ci0gIGNsZWFudXBfYXBwOgotCWlwX3ZzX2FwcF9jbGVhbnVwKCk7Ci0gIGNsZWFudXBfcHJvdG9jb2w6Ci0JaXBfdnNfcHJvdG9jb2xfY2xlYW51cCgpOwotCWlwX3ZzX2NvbnRyb2xfY2xlYW51cCgpOwotICBjbGVhbnVwX25vdGhpbmc6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX2NsZWFudXAodm9pZCkKLXsKLQluZl91bnJlZ2lzdGVyX2hvb2tzKGlwX3ZzX29wcywgQVJSQVlfU0laRShpcF92c19vcHMpKTsKLQlpcF92c19jb25uX2NsZWFudXAoKTsKLQlpcF92c19hcHBfY2xlYW51cCgpOwotCWlwX3ZzX3Byb3RvY29sX2NsZWFudXAoKTsKLQlpcF92c19jb250cm9sX2NsZWFudXAoKTsKLQlJUF9WU19JTkZPKCJpcHZzIHVubG9hZGVkLlxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX3ZzX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfdnNfY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3OTcwNS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM3MyArMCwwIEBACi0vKgotICogSVBWUyAgICAgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUCB2aXJ0dWFsIHNlcnZlciBzdXBwb3J0IGZvciB0aGUKLSAqICAgICAgICAgICAgICBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtLiAgSVBWUyBpcyBub3cgaW1wbGVtZW50ZWQgYXMgYSBtb2R1bGUKLSAqICAgICAgICAgICAgICBvdmVyIHRoZSBOZXRGaWx0ZXIgZnJhbWV3b3JrLiBJUFZTIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEKLSAqICAgICAgICAgICAgICBoaWdoLXBlcmZvcm1hbmNlIGFuZCBoaWdobHkgYXZhaWxhYmxlIHNlcnZlciBiYXNlZCBvbiBhCi0gKiAgICAgICAgICAgICAgY2x1c3RlciBvZiBzZXJ2ZXJzLgotICoKLSAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+Ci0gKiAgICAgICAgICAgICAgUGV0ZXIgS2VzZSA8cGV0ZXIua2VzZUBpanMuc2k+Ci0gKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KLS8qIHNlbWFwaG9yZSBmb3IgSVBWUyBzb2Nrb3B0cy4gQW5kLCBbZ3NdZXRzb2Nrb3B0IG1heSBzbGVlcC4gKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoX19pcF92c19tdXRleCk7Ci0KLS8qIGxvY2sgZm9yIHNlcnZpY2UgdGFibGUgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKF9faXBfdnNfc3ZjX2xvY2spOwotCi0vKiBsb2NrIGZvciB0YWJsZSB3aXRoIHRoZSByZWFsIHNlcnZpY2VzICovCi1zdGF0aWMgREVGSU5FX1JXTE9DSyhfX2lwX3ZzX3JzX2xvY2spOwotCi0vKiBsb2NrIGZvciBzdGF0ZSBhbmQgdGltZW91dCB0YWJsZXMgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKF9faXBfdnNfc2VjdXJldGNwX2xvY2spOwotCi0vKiBsb2NrIGZvciBkcm9wIGVudHJ5IGhhbmRsaW5nICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9faXBfdnNfZHJvcGVudHJ5X2xvY2spOwotCi0vKiBsb2NrIGZvciBkcm9wIHBhY2tldCBoYW5kbGluZyAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhfX2lwX3ZzX2Ryb3BwYWNrZXRfbG9jayk7Ci0KLS8qIDEvcmF0ZSBkcm9wIGFuZCBkcm9wLWVudHJ5IHZhcmlhYmxlcyAqLwotaW50IGlwX3ZzX2Ryb3BfcmF0ZSA9IDA7Ci1pbnQgaXBfdnNfZHJvcF9jb3VudGVyID0gMDsKLXN0YXRpYyBhdG9taWNfdCBpcF92c19kcm9wZW50cnkgPSBBVE9NSUNfSU5JVCgwKTsKLQotLyogbnVtYmVyIG9mIHZpcnR1YWwgc2VydmljZXMgKi8KLXN0YXRpYyBpbnQgaXBfdnNfbnVtX3NlcnZpY2VzID0gMDsKLQotLyogc3lzY3RsIHZhcmlhYmxlcyAqLwotc3RhdGljIGludCBzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSA9IDA7Ci1zdGF0aWMgaW50IHN5c2N0bF9pcF92c19kcm9wX3BhY2tldCA9IDA7Ci1zdGF0aWMgaW50IHN5c2N0bF9pcF92c19zZWN1cmVfdGNwID0gMDsKLXN0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2ggPSAxMDI0Owotc3RhdGljIGludCBzeXNjdGxfaXBfdnNfYW1fZHJvcHJhdGUgPSAxMDsKLWludCBzeXNjdGxfaXBfdnNfY2FjaGVfYnlwYXNzID0gMDsKLWludCBzeXNjdGxfaXBfdnNfZXhwaXJlX25vZGVzdF9jb25uID0gMDsKLWludCBzeXNjdGxfaXBfdnNfZXhwaXJlX3F1aWVzY2VudF90ZW1wbGF0ZSA9IDA7Ci1pbnQgc3lzY3RsX2lwX3ZzX3N5bmNfdGhyZXNob2xkWzJdID0geyAzLCA1MCB9OwotaW50IHN5c2N0bF9pcF92c19uYXRfaWNtcF9zZW5kID0gMDsKLQotCi0jaWZkZWYgQ09ORklHX0lQX1ZTX0RFQlVHCi1zdGF0aWMgaW50IHN5c2N0bF9pcF92c19kZWJ1Z19sZXZlbCA9IDA7Ci0KLWludCBpcF92c19nZXRfZGVidWdfbGV2ZWwodm9pZCkKLXsKLQlyZXR1cm4gc3lzY3RsX2lwX3ZzX2RlYnVnX2xldmVsOwotfQotI2VuZGlmCi0KLS8qCi0gKgl1cGRhdGVfZGVmZW5zZV9sZXZlbCBpcyBjYWxsZWQgZnJvbSBrZXZlbnRkIGFuZCBmcm9tIHN5c2N0bCwKLSAqCXNvIGl0IG5lZWRzIHRvIHByb3RlY3QgaXRzZWxmIGZyb20gc29mdGlycXMKLSAqLwotc3RhdGljIHZvaWQgdXBkYXRlX2RlZmVuc2VfbGV2ZWwodm9pZCkKLXsKLQlzdHJ1Y3Qgc3lzaW5mbyBpOwotCXN0YXRpYyBpbnQgb2xkX3NlY3VyZV90Y3AgPSAwOwotCWludCBhdmFpbG1lbTsKLQlpbnQgbm9tZW07Ci0JaW50IHRvX2NoYW5nZSA9IC0xOwotCi0JLyogd2Ugb25seSBjb3VudCBmcmVlIGFuZCBidWZmZXJlZCBtZW1vcnkgKGluIHBhZ2VzKSAqLwotCXNpX21lbWluZm8oJmkpOwotCWF2YWlsbWVtID0gaS5mcmVlcmFtICsgaS5idWZmZXJyYW07Ci0JLyogaG93ZXZlciBpbiBsaW51eCAyLjUgdGhlIGkuYnVmZmVycmFtIGlzIHRvdGFsIHBhZ2UgY2FjaGUgc2l6ZSwKLQkgICB3ZSBuZWVkIGFkanVzdCBpdCAqLwotCS8qIHNpX3N3YXBpbmZvKCZpKTsgKi8KLQkvKiBhdmFpbG1lbSA9IGF2YWlsbWVtIC0gKGkudG90YWxzd2FwIC0gaS5mcmVlc3dhcCk7ICovCi0KLQlub21lbSA9IChhdmFpbG1lbSA8IHN5c2N0bF9pcF92c19hbWVtdGhyZXNoKTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQotCS8qIGRyb3BfZW50cnkgKi8KLQlzcGluX2xvY2soJl9faXBfdnNfZHJvcGVudHJ5X2xvY2spOwotCXN3aXRjaCAoc3lzY3RsX2lwX3ZzX2Ryb3BfZW50cnkpIHsKLQljYXNlIDA6Ci0JCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWYgKG5vbWVtKSB7Ci0JCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDEpOwotCQkJc3lzY3RsX2lwX3ZzX2Ryb3BfZW50cnkgPSAyOwotCQl9IGVsc2UgewotCQkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChub21lbSkgewotCQkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAxKTsKLQkJfSBlbHNlIHsKLQkJCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMCk7Ci0JCQlzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSA9IDE7Ci0JCX07Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAxKTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrKCZfX2lwX3ZzX2Ryb3BlbnRyeV9sb2NrKTsKLQotCS8qIGRyb3BfcGFja2V0ICovCi0Jc3Bpbl9sb2NrKCZfX2lwX3ZzX2Ryb3BwYWNrZXRfbG9jayk7Ci0Jc3dpdGNoIChzeXNjdGxfaXBfdnNfZHJvcF9wYWNrZXQpIHsKLQljYXNlIDA6Ci0JCWlwX3ZzX2Ryb3BfcmF0ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWYgKG5vbWVtKSB7Ci0JCQlpcF92c19kcm9wX3JhdGUgPSBpcF92c19kcm9wX2NvdW50ZXIKLQkJCQk9IHN5c2N0bF9pcF92c19hbWVtdGhyZXNoIC8KLQkJCQkoc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gtYXZhaWxtZW0pOwotCQkJc3lzY3RsX2lwX3ZzX2Ryb3BfcGFja2V0ID0gMjsKLQkJfSBlbHNlIHsKLQkJCWlwX3ZzX2Ryb3BfcmF0ZSA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAobm9tZW0pIHsKLQkJCWlwX3ZzX2Ryb3BfcmF0ZSA9IGlwX3ZzX2Ryb3BfY291bnRlcgotCQkJCT0gc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2ggLwotCQkJCShzeXNjdGxfaXBfdnNfYW1lbXRocmVzaC1hdmFpbG1lbSk7Ci0JCX0gZWxzZSB7Ci0JCQlpcF92c19kcm9wX3JhdGUgPSAwOwotCQkJc3lzY3RsX2lwX3ZzX2Ryb3BfcGFja2V0ID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIDM6Ci0JCWlwX3ZzX2Ryb3BfcmF0ZSA9IHN5c2N0bF9pcF92c19hbV9kcm9wcmF0ZTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrKCZfX2lwX3ZzX2Ryb3BwYWNrZXRfbG9jayk7Ci0KLQkvKiBzZWN1cmVfdGNwICovCi0Jd3JpdGVfbG9jaygmX19pcF92c19zZWN1cmV0Y3BfbG9jayk7Ci0Jc3dpdGNoIChzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcCkgewotCWNhc2UgMDoKLQkJaWYgKG9sZF9zZWN1cmVfdGNwID49IDIpCi0JCQl0b19jaGFuZ2UgPSAwOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWlmIChub21lbSkgewotCQkJaWYgKG9sZF9zZWN1cmVfdGNwIDwgMikKLQkJCQl0b19jaGFuZ2UgPSAxOwotCQkJc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3AgPSAyOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZF9zZWN1cmVfdGNwID49IDIpCi0JCQkJdG9fY2hhbmdlID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChub21lbSkgewotCQkJaWYgKG9sZF9zZWN1cmVfdGNwIDwgMikKLQkJCQl0b19jaGFuZ2UgPSAxOwotCQl9IGVsc2UgewotCQkJaWYgKG9sZF9zZWN1cmVfdGNwID49IDIpCi0JCQkJdG9fY2hhbmdlID0gMDsKLQkJCXN5c2N0bF9pcF92c19zZWN1cmVfdGNwID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIDM6Ci0JCWlmIChvbGRfc2VjdXJlX3RjcCA8IDIpCi0JCQl0b19jaGFuZ2UgPSAxOwotCQlicmVhazsKLQl9Ci0Jb2xkX3NlY3VyZV90Y3AgPSBzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcDsKLQlpZiAodG9fY2hhbmdlID49IDApCi0JCWlwX3ZzX3Byb3RvY29sX3RpbWVvdXRfY2hhbmdlKHN5c2N0bF9pcF92c19zZWN1cmVfdGNwPjEpOwotCXdyaXRlX3VubG9jaygmX19pcF92c19zZWN1cmV0Y3BfbG9jayk7Ci0KLQlsb2NhbF9iaF9lbmFibGUoKTsKLX0KLQotCi0vKgotICoJVGltZXIgZm9yIGNoZWNraW5nIHRoZSBkZWZlbnNlCi0gKi8KLSNkZWZpbmUgREVGRU5TRV9USU1FUl9QRVJJT0QJMSpIWgotc3RhdGljIHZvaWQgZGVmZW5zZV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhkZWZlbnNlX3dvcmssIGRlZmVuc2Vfd29ya19oYW5kbGVyKTsKLQotc3RhdGljIHZvaWQgZGVmZW5zZV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXVwZGF0ZV9kZWZlbnNlX2xldmVsKCk7Ci0JaWYgKGF0b21pY19yZWFkKCZpcF92c19kcm9wZW50cnkpKQotCQlpcF92c19yYW5kb21fZHJvcGVudHJ5KCk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRlZmVuc2Vfd29yaywgREVGRU5TRV9USU1FUl9QRVJJT0QpOwotfQotCi1pbnQKLWlwX3ZzX3VzZV9jb3VudF9pbmModm9pZCkKLXsKLQlyZXR1cm4gdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotfQotCi12b2lkCi1pcF92c191c2VfY291bnRfZGVjKHZvaWQpCi17Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci19Ci0KLQotLyoKLSAqCUhhc2ggdGFibGU6IGZvciB2aXJ0dWFsIHNlcnZpY2UgbG9va3VwcwotICovCi0jZGVmaW5lIElQX1ZTX1NWQ19UQUJfQklUUyA4Ci0jZGVmaW5lIElQX1ZTX1NWQ19UQUJfU0laRSAoMSA8PCBJUF9WU19TVkNfVEFCX0JJVFMpCi0jZGVmaW5lIElQX1ZTX1NWQ19UQUJfTUFTSyAoSVBfVlNfU1ZDX1RBQl9TSVpFIC0gMSkKLQotLyogdGhlIHNlcnZpY2UgdGFibGUgaGFzaGVkIGJ5IDxwcm90b2NvbCwgYWRkciwgcG9ydD4gKi8KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlwX3ZzX3N2Y190YWJsZVtJUF9WU19TVkNfVEFCX1NJWkVdOwotLyogdGhlIHNlcnZpY2UgdGFibGUgaGFzaGVkIGJ5IGZ3bWFyayAqLwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXBfdnNfc3ZjX2Z3bV90YWJsZVtJUF9WU19TVkNfVEFCX1NJWkVdOwotCi0vKgotICoJSGFzaCB0YWJsZTogZm9yIHJlYWwgc2VydmljZSBsb29rdXBzCi0gKi8KLSNkZWZpbmUgSVBfVlNfUlRBQl9CSVRTIDQKLSNkZWZpbmUgSVBfVlNfUlRBQl9TSVpFICgxIDw8IElQX1ZTX1JUQUJfQklUUykKLSNkZWZpbmUgSVBfVlNfUlRBQl9NQVNLIChJUF9WU19SVEFCX1NJWkUgLSAxKQotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpcF92c19ydGFibGVbSVBfVlNfUlRBQl9TSVpFXTsKLQotLyoKLSAqCVRyYXNoIGZvciBkZXN0aW5hdGlvbnMKLSAqLwotc3RhdGljIExJU1RfSEVBRChpcF92c19kZXN0X3RyYXNoKTsKLQotLyoKLSAqCUZUUCAmIE5VTEwgdmlydHVhbCBzZXJ2aWNlIGNvdW50ZXJzCi0gKi8KLXN0YXRpYyBhdG9taWNfdCBpcF92c19mdHBzdmNfY291bnRlciA9IEFUT01JQ19JTklUKDApOwotc3RhdGljIGF0b21pY190IGlwX3ZzX251bGxzdmNfY291bnRlciA9IEFUT01JQ19JTklUKDApOwotCi0KLS8qCi0gKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIHZpcnR1YWwgc2VydmljZQotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZAotaXBfdnNfc3ZjX2hhc2hrZXkodW5zaWduZWQgcHJvdG8sIF9fYmUzMiBhZGRyLCBfX2JlMTYgcG9ydCkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBwb3J0aCA9IG50b2hzKHBvcnQpOwotCi0JcmV0dXJuIChwcm90b15udG9obChhZGRyKV4ocG9ydGg+PklQX1ZTX1NWQ19UQUJfQklUUylecG9ydGgpCi0JCSYgSVBfVlNfU1ZDX1RBQl9NQVNLOwotfQotCi0vKgotICoJUmV0dXJucyBoYXNoIHZhbHVlIG9mIGZ3bWFyayBmb3IgdmlydHVhbCBzZXJ2aWNlIGxvb2t1cAotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpcF92c19zdmNfZndtX2hhc2hrZXkoX191MzIgZndtYXJrKQotewotCXJldHVybiBmd21hcmsgJiBJUF9WU19TVkNfVEFCX01BU0s7Ci19Ci0KLS8qCi0gKglIYXNoZXMgYSBzZXJ2aWNlIGluIHRoZSBpcF92c19zdmNfdGFibGUgYnkgPHByb3RvLGFkZHIscG9ydD4KLSAqCW9yIGluIHRoZSBpcF92c19zdmNfZndtX3RhYmxlIGJ5IGZ3bWFyay4KLSAqCVNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgdGFibGVzLgotICovCi1zdGF0aWMgaW50IGlwX3ZzX3N2Y19oYXNoKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JdW5zaWduZWQgaGFzaDsKLQotCWlmIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfSEFTSEVEKSB7Ci0JCUlQX1ZTX0VSUigiaXBfdnNfc3ZjX2hhc2goKTogcmVxdWVzdCBmb3IgYWxyZWFkeSBoYXNoZWQsICIKLQkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3ZjLT5md21hcmsgPT0gMCkgewotCQkvKgotCQkgKiAgSGFzaCBpdCBieSA8cHJvdG9jb2wsYWRkcixwb3J0PiBpbiBpcF92c19zdmNfdGFibGUKLQkJICovCi0JCWhhc2ggPSBpcF92c19zdmNfaGFzaGtleShzdmMtPnByb3RvY29sLCBzdmMtPmFkZHIsIHN2Yy0+cG9ydCk7Ci0JCWxpc3RfYWRkKCZzdmMtPnNfbGlzdCwgJmlwX3ZzX3N2Y190YWJsZVtoYXNoXSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogIEhhc2ggaXQgYnkgZndtYXJrIGluIGlwX3ZzX3N2Y19md21fdGFibGUKLQkJICovCi0JCWhhc2ggPSBpcF92c19zdmNfZndtX2hhc2hrZXkoc3ZjLT5md21hcmspOwotCQlsaXN0X2FkZCgmc3ZjLT5mX2xpc3QsICZpcF92c19zdmNfZndtX3RhYmxlW2hhc2hdKTsKLQl9Ci0KLQlzdmMtPmZsYWdzIHw9IElQX1ZTX1NWQ19GX0hBU0hFRDsKLQkvKiBpbmNyZWFzZSBpdHMgcmVmY250IGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ZjIHRhYmxlICovCi0JYXRvbWljX2luYygmc3ZjLT5yZWZjbnQpOwotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKglVbmhhc2hlcyBhIHNlcnZpY2UgZnJvbSBpcF92c19zdmNfdGFibGUvaXBfdnNfc3ZjX2Z3bV90YWJsZS4KLSAqCVNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgdGFibGVzLgotICovCi1zdGF0aWMgaW50IGlwX3ZzX3N2Y191bmhhc2goc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlpZiAoIShzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfSEFTSEVEKSkgewotCQlJUF9WU19FUlIoImlwX3ZzX3N2Y191bmhhc2goKTogcmVxdWVzdCBmb3IgdW5oYXNoIGZsYWdnZWQsICIKLQkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3ZjLT5md21hcmsgPT0gMCkgewotCQkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfc3ZjX3RhYmxlIHRhYmxlICovCi0JCWxpc3RfZGVsKCZzdmMtPnNfbGlzdCk7Ci0JfSBlbHNlIHsKLQkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIGlwX3ZzX3N2Y19md21fdGFibGUgdGFibGUgKi8KLQkJbGlzdF9kZWwoJnN2Yy0+Zl9saXN0KTsKLQl9Ci0KLQlzdmMtPmZsYWdzICY9IH5JUF9WU19TVkNfRl9IQVNIRUQ7Ci0JYXRvbWljX2RlYygmc3ZjLT5yZWZjbnQpOwotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKglHZXQgc2VydmljZSBieSB7cHJvdG8sYWRkcixwb3J0fSBpbiB0aGUgc2VydmljZSB0YWJsZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwX3ZzX3NlcnZpY2UgKgotX19pcF92c19zZXJ2aWNlX2dldChfX3UxNiBwcm90b2NvbCwgX19iZTMyIHZhZGRyLCBfX2JlMTYgdnBvcnQpCi17Ci0JdW5zaWduZWQgaGFzaDsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOwotCi0JLyogQ2hlY2sgZm9yICJmdWxsIiBhZGRyZXNzZWQgZW50cmllcyAqLwotCWhhc2ggPSBpcF92c19zdmNfaGFzaGtleShwcm90b2NvbCwgdmFkZHIsIHZwb3J0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2hhc2hdLCBzX2xpc3QpewotCQlpZiAoKHN2Yy0+YWRkciA9PSB2YWRkcikKLQkJICAgICYmIChzdmMtPnBvcnQgPT0gdnBvcnQpCi0JCSAgICAmJiAoc3ZjLT5wcm90b2NvbCA9PSBwcm90b2NvbCkpIHsKLQkJCS8qIEhJVCAqLwotCQkJYXRvbWljX2luYygmc3ZjLT51c2VjbnQpOwotCQkJcmV0dXJuIHN2YzsKLQkJfQotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0KLS8qCi0gKglHZXQgc2VydmljZSBieSB7ZndtYXJrfSBpbiB0aGUgc2VydmljZSB0YWJsZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwX3ZzX3NlcnZpY2UgKl9faXBfdnNfc3ZjX2Z3bV9nZXQoX191MzIgZndtYXJrKQotewotCXVuc2lnbmVkIGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQotCS8qIENoZWNrIGZvciBmd21hcmsgYWRkcmVzc2VkIGVudHJpZXMgKi8KLQloYXNoID0gaXBfdnNfc3ZjX2Z3bV9oYXNoa2V5KGZ3bWFyayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaGFzaF0sIGZfbGlzdCkgewotCQlpZiAoc3ZjLT5md21hcmsgPT0gZndtYXJrKSB7Ci0JCQkvKiBISVQgKi8KLQkJCWF0b21pY19pbmMoJnN2Yy0+dXNlY250KTsKLQkJCXJldHVybiBzdmM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGlwX3ZzX3NlcnZpY2UgKgotaXBfdnNfc2VydmljZV9nZXQoX191MzIgZndtYXJrLCBfX3UxNiBwcm90b2NvbCwgX19iZTMyIHZhZGRyLCBfX2JlMTYgdnBvcnQpCi17Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQotCXJlYWRfbG9jaygmX19pcF92c19zdmNfbG9jayk7Ci0KLQkvKgotCSAqCUNoZWNrIHRoZSB0YWJsZSBoYXNoZWQgYnkgZndtYXJrIGZpcnN0Ci0JICovCi0JaWYgKGZ3bWFyayAmJiAoc3ZjID0gX19pcF92c19zdmNfZndtX2dldChmd21hcmspKSkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqCUNoZWNrIHRoZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLGFkZHIscG9ydD4KLQkgKglmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCi0JICovCi0Jc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChwcm90b2NvbCwgdmFkZHIsIHZwb3J0KTsKLQotCWlmIChzdmMgPT0gTlVMTAotCSAgICAmJiBwcm90b2NvbCA9PSBJUFBST1RPX1RDUAotCSAgICAmJiBhdG9taWNfcmVhZCgmaXBfdnNfZnRwc3ZjX2NvdW50ZXIpCi0JICAgICYmICh2cG9ydCA9PSBGVFBEQVRBIHx8IG50b2hzKHZwb3J0KSA+PSBQUk9UX1NPQ0spKSB7Ci0JCS8qCi0JCSAqIENoZWNrIGlmIGZ0cCBzZXJ2aWNlIGVudHJ5IGV4aXN0cywgdGhlIHBhY2tldAotCQkgKiBtaWdodCBiZWxvbmcgdG8gRlRQIGRhdGEgY29ubmVjdGlvbnMuCi0JCSAqLwotCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KHByb3RvY29sLCB2YWRkciwgRlRQUE9SVCk7Ci0JfQotCi0JaWYgKHN2YyA9PSBOVUxMCi0JICAgICYmIGF0b21pY19yZWFkKCZpcF92c19udWxsc3ZjX2NvdW50ZXIpKSB7Ci0JCS8qCi0JCSAqIENoZWNrIGlmIHRoZSBjYXRjaC1hbGwgcG9ydCAocG9ydCB6ZXJvKSBleGlzdHMKLQkJICovCi0JCXN2YyA9IF9faXBfdnNfc2VydmljZV9nZXQocHJvdG9jb2wsIHZhZGRyLCAwKTsKLQl9Ci0KLSAgb3V0OgotCXJlYWRfdW5sb2NrKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQotCUlQX1ZTX0RCRyg5LCAibG9va3VwIHNlcnZpY2U6IGZ3bSAldSAlcyAldS4ldS4ldS4ldToldSAlc1xuIiwKLQkJICBmd21hcmssIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAotCQkgIE5JUFFVQUQodmFkZHIpLCBudG9ocyh2cG9ydCksCi0JCSAgc3ZjPyJoaXQiOiJub3QgaGl0Iik7Ci0KLQlyZXR1cm4gc3ZjOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pcF92c19iaW5kX3N2YyhzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlhdG9taWNfaW5jKCZzdmMtPnJlZmNudCk7Ci0JZGVzdC0+c3ZjID0gc3ZjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXBfdnNfdW5iaW5kX3N2YyhzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjID0gZGVzdC0+c3ZjOwotCi0JZGVzdC0+c3ZjID0gTlVMTDsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3ZjLT5yZWZjbnQpKQotCQlrZnJlZShzdmMpOwotfQotCi0KLS8qCi0gKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIHJlYWwgc2VydmljZQotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpcF92c19yc19oYXNoa2V5KF9fYmUzMiBhZGRyLCBfX2JlMTYgcG9ydCkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBwb3J0aCA9IG50b2hzKHBvcnQpOwotCi0JcmV0dXJuIChudG9obChhZGRyKV4ocG9ydGg+PklQX1ZTX1JUQUJfQklUUylecG9ydGgpCi0JCSYgSVBfVlNfUlRBQl9NQVNLOwotfQotCi0vKgotICoJSGFzaGVzIGlwX3ZzX2Rlc3QgaW4gaXBfdnNfcnRhYmxlIGJ5IDxwcm90byxhZGRyLHBvcnQ+LgotICoJc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGxvY2tlZCB0YWJsZXMuCi0gKi8KLXN0YXRpYyBpbnQgaXBfdnNfcnNfaGFzaChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQl1bnNpZ25lZCBoYXNoOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZkZXN0LT5kX2xpc3QpKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICoJSGFzaCBieSBwcm90byxhZGRyLHBvcnQsCi0JICoJd2hpY2ggYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByZWFsIHNlcnZpY2UuCi0JICovCi0JaGFzaCA9IGlwX3ZzX3JzX2hhc2hrZXkoZGVzdC0+YWRkciwgZGVzdC0+cG9ydCk7Ci0JbGlzdF9hZGQoJmRlc3QtPmRfbGlzdCwgJmlwX3ZzX3J0YWJsZVtoYXNoXSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqCVVOaGFzaGVzIGlwX3ZzX2Rlc3QgZnJvbSBpcF92c19ydGFibGUuCi0gKglzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja2VkIHRhYmxlcy4KLSAqLwotc3RhdGljIGludCBpcF92c19yc191bmhhc2goc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyoKLQkgKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfcnRhYmxlIHRhYmxlLgotCSAqLwotCWlmICghbGlzdF9lbXB0eSgmZGVzdC0+ZF9saXN0KSkgewotCQlsaXN0X2RlbCgmZGVzdC0+ZF9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJmRlc3QtPmRfbGlzdCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKglMb29rdXAgcmVhbCBzZXJ2aWNlIGJ5IDxwcm90byxhZGRyLHBvcnQ+IGluIHRoZSByZWFsIHNlcnZpY2UgdGFibGUuCi0gKi8KLXN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX2xvb2t1cF9yZWFsX3NlcnZpY2UoX191MTYgcHJvdG9jb2wsIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0KQotewotCXVuc2lnbmVkIGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0KLQkvKgotCSAqCUNoZWNrIGZvciAiZnVsbCIgYWRkcmVzc2VkIGVudHJpZXMKLQkgKglSZXR1cm4gdGhlIGZpcnN0IGZvdW5kIGVudHJ5Ci0JICovCi0JaGFzaCA9IGlwX3ZzX3JzX2hhc2hrZXkoZGFkZHIsIGRwb3J0KTsKLQotCXJlYWRfbG9jaygmX19pcF92c19yc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZpcF92c19ydGFibGVbaGFzaF0sIGRfbGlzdCkgewotCQlpZiAoKGRlc3QtPmFkZHIgPT0gZGFkZHIpCi0JCSAgICAmJiAoZGVzdC0+cG9ydCA9PSBkcG9ydCkKLQkJICAgICYmICgoZGVzdC0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpIHx8Ci0JCQlkZXN0LT52ZndtYXJrKSkgewotCQkJLyogSElUICovCi0JCQlyZWFkX3VubG9jaygmX19pcF92c19yc19sb2NrKTsKLQkJCXJldHVybiBkZXN0OwotCQl9Ci0JfQotCXJlYWRfdW5sb2NrKCZfX2lwX3ZzX3JzX2xvY2spOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKglMb29rdXAgZGVzdGluYXRpb24gYnkge2FkZHIscG9ydH0gaW4gdGhlIGdpdmVuIHNlcnZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX2xvb2t1cF9kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0KQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCi0JLyoKLQkgKiBGaW5kIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGdpdmVuIHNlcnZpY2UKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlmICgoZGVzdC0+YWRkciA9PSBkYWRkcikgJiYgKGRlc3QtPnBvcnQgPT0gZHBvcnQpKSB7Ci0JCQkvKiBISVQgKi8KLQkJCXJldHVybiBkZXN0OwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBGaW5kIGRlc3RpbmF0aW9uIGJ5IHtkYWRkcixkcG9ydCx2YWRkcixwcm90b2NvbH0KLSAqIENyZXRhZWQgdG8gYmUgdXNlZCBpbiBpcF92c19wcm9jZXNzX21lc3NhZ2UoKSBpbgotICogdGhlIGJhY2t1cCBzeW5jaHJvbml6YXRpb24gZGFlbW9uLiBJdCBmaW5kcyB0aGUKLSAqIGRlc3RpbmF0aW9uIHRvIGJlIGJvdW5kIHRvIHRoZSByZWNlaXZlZCBjb25uZWN0aW9uCi0gKiBvbiB0aGUgYmFja3VwLgotICoKLSAqIGlwX3ZzX2xvb2t1cF9yZWFsX3NlcnZpY2UoKSBsb29rZWQgcHJvbWlzc2luZywgYnV0Ci0gKiBzZWVtcyBub3Qgd29ya2luZyBhcyBleHBlY3RlZC4KLSAqLwotc3RydWN0IGlwX3ZzX2Rlc3QgKmlwX3ZzX2ZpbmRfZGVzdChfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwKLQkJCQkgICAgX19iZTMyIHZhZGRyLCBfX2JlMTYgdnBvcnQsIF9fdTE2IHByb3RvY29sKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7Ci0KLQlzdmMgPSBpcF92c19zZXJ2aWNlX2dldCgwLCBwcm90b2NvbCwgdmFkZHIsIHZwb3J0KTsKLQlpZiAoIXN2YykKLQkJcmV0dXJuIE5VTEw7Ci0JZGVzdCA9IGlwX3ZzX2xvb2t1cF9kZXN0KHN2YywgZGFkZHIsIGRwb3J0KTsKLQlpZiAoZGVzdCkKLQkJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKLQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCXJldHVybiBkZXN0OwotfQotCi0vKgotICogIExvb2t1cCBkZXN0IGJ5IHtzdmMsYWRkcixwb3J0fSBpbiB0aGUgZGVzdGluYXRpb24gdHJhc2guCi0gKiAgVGhlIGRlc3RpbmF0aW9uIHRyYXNoIGlzIHVzZWQgdG8gaG9sZCB0aGUgZGVzdGluYXRpb25zIHRoYXQgYXJlIHJlbW92ZWQKLSAqICBmcm9tIHRoZSBzZXJ2aWNlIHRhYmxlIGJ1dCBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBzb21lIGNvbm4gZW50cmllcy4KLSAqICBUaGUgcmVhc29uIHRvIGFkZCB0aGUgZGVzdGluYXRpb24gdHJhc2ggaXMgd2hlbiB0aGUgZGVzdCBpcyB0ZW1wb3JhcnkKLSAqICBkb3duIChlaXRoZXIgYnkgYWRtaW5pc3RyYXRvciBvciBieSBtb25pdG9yIHByb2dyYW0pLCB0aGUgZGVzdCBjYW4gYmUKLSAqICBwaWNrZWQgYmFjayBmcm9tIHRoZSB0cmFzaCwgdGhlIHJlbWFpbmluZyBjb25uZWN0aW9ucyB0byB0aGUgZGVzdCBjYW4KLSAqICBjb250aW51ZSwgYW5kIHRoZSBjb3VudGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgZGVzdCBpcyBhbHNvIHVzZWZ1bCBmb3IKLSAqICBzY2hlZHVsaW5nLgotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfdHJhc2hfZ2V0X2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpueHQ7Ci0KLQkvKgotCSAqIEZpbmQgdGhlIGRlc3RpbmF0aW9uIGluIHRyYXNoCi0JICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc3QsIG54dCwgJmlwX3ZzX2Rlc3RfdHJhc2gsIG5fbGlzdCkgewotCQlJUF9WU19EQkcoMywgIkRlc3RpbmF0aW9uICV1LyV1LiV1LiV1LiV1OiV1IHN0aWxsIGluIHRyYXNoLCAiCi0JCQkgICJkZXN0LT5yZWZjbnQ9JWRcbiIsCi0JCQkgIGRlc3QtPnZmd21hcmssCi0JCQkgIE5JUFFVQUQoZGVzdC0+YWRkciksIG50b2hzKGRlc3QtPnBvcnQpLAotCQkJICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSk7Ci0JCWlmIChkZXN0LT5hZGRyID09IGRhZGRyICYmCi0JCSAgICBkZXN0LT5wb3J0ID09IGRwb3J0ICYmCi0JCSAgICBkZXN0LT52ZndtYXJrID09IHN2Yy0+ZndtYXJrICYmCi0JCSAgICBkZXN0LT5wcm90b2NvbCA9PSBzdmMtPnByb3RvY29sICYmCi0JCSAgICAoc3ZjLT5md21hcmsgfHwKLQkJICAgICAoZGVzdC0+dmFkZHIgPT0gc3ZjLT5hZGRyICYmCi0JCSAgICAgIGRlc3QtPnZwb3J0ID09IHN2Yy0+cG9ydCkpKSB7Ci0JCQkvKiBISVQgKi8KLQkJCXJldHVybiBkZXN0OwotCQl9Ci0KLQkJLyoKLQkJICogVHJ5IHRvIHB1cmdlIHRoZSBkZXN0aW5hdGlvbiBmcm9tIHRyYXNoIGlmIG5vdCByZWZlcmVuY2VkCi0JCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCkgPT0gMSkgewotCQkJSVBfVlNfREJHKDMsICJSZW1vdmluZyBkZXN0aW5hdGlvbiAldS8ldS4ldS4ldS4ldToldSAiCi0JCQkJICAiZnJvbSB0cmFzaFxuIiwKLQkJCQkgIGRlc3QtPnZmd21hcmssCi0JCQkJICBOSVBRVUFEKGRlc3QtPmFkZHIpLCBudG9ocyhkZXN0LT5wb3J0KSk7Ci0JCQlsaXN0X2RlbCgmZGVzdC0+bl9saXN0KTsKLQkJCWlwX3ZzX2RzdF9yZXNldChkZXN0KTsKLQkJCV9faXBfdnNfdW5iaW5kX3N2YyhkZXN0KTsKLQkJCWtmcmVlKGRlc3QpOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLSAqICBDbGVhbiB1cCBhbGwgdGhlIGRlc3RpbmF0aW9ucyBpbiB0aGUgdHJhc2gKLSAqICBDYWxsZWQgYnkgdGhlIGlwX3ZzX2NvbnRyb2xfY2xlYW51cCgpCi0gKgotICogIFdoZW4gdGhlIGlwX3ZzX2NvbnRyb2xfY2xlYXJ1cCBpcyBhY3RpdmF0ZWQgYnkgaXB2cyBtb2R1bGUgZXhpdCwKLSAqICB0aGUgc2VydmljZSB0YWJsZXMgbXVzdCBoYXZlIGJlZW4gZmx1c2hlZCBhbmQgYWxsIHRoZSBjb25uZWN0aW9ucwotICogIGFyZSBleHBpcmVkLCBhbmQgdGhlIHJlZmNudCBvZiBlYWNoIGRlc3RpbmF0aW9uIGluIHRoZSB0cmFzaCBtdXN0Ci0gKiAgYmUgMSwgc28gd2Ugc2ltcGx5IHJlbGVhc2UgdGhlbSBoZXJlLgotICovCi1zdGF0aWMgdm9pZCBpcF92c190cmFzaF9jbGVhbnVwKHZvaWQpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpueHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzdCwgbnh0LCAmaXBfdnNfZGVzdF90cmFzaCwgbl9saXN0KSB7Ci0JCWxpc3RfZGVsKCZkZXN0LT5uX2xpc3QpOwotCQlpcF92c19kc3RfcmVzZXQoZGVzdCk7Ci0JCV9faXBfdnNfdW5iaW5kX3N2YyhkZXN0KTsKLQkJa2ZyZWUoZGVzdCk7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkCi1pcF92c196ZXJvX3N0YXRzKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZzdGF0cy0+bG9jayk7Ci0KLQlzdGF0cy0+Y29ubnMgPSAwOwotCXN0YXRzLT5pbnBrdHMgPSAwOwotCXN0YXRzLT5vdXRwa3RzID0gMDsKLQlzdGF0cy0+aW5ieXRlcyA9IDA7Ci0Jc3RhdHMtPm91dGJ5dGVzID0gMDsKLQotCXN0YXRzLT5jcHMgPSAwOwotCXN0YXRzLT5pbnBwcyA9IDA7Ci0Jc3RhdHMtPm91dHBwcyA9IDA7Ci0Jc3RhdHMtPmluYnBzID0gMDsKLQlzdGF0cy0+b3V0YnBzID0gMDsKLQotCWlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0YXRzKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZzdGF0cy0+bG9jayk7Ci19Ci0KLS8qCi0gKglVcGRhdGUgYSBkZXN0aW5hdGlvbiBpbiB0aGUgZ2l2ZW4gc2VydmljZQotICovCi1zdGF0aWMgdm9pZAotX19pcF92c191cGRhdGVfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLAotCQkgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19kZXN0X3VzZXIgKnVkZXN0KQotewotCWludCBjb25uX2ZsYWdzOwotCi0JLyogc2V0IHRoZSB3ZWlnaHQgYW5kIHRoZSBmbGFncyAqLwotCWF0b21pY19zZXQoJmRlc3QtPndlaWdodCwgdWRlc3QtPndlaWdodCk7Ci0JY29ubl9mbGFncyA9IHVkZXN0LT5jb25uX2ZsYWdzIHwgSVBfVlNfQ09OTl9GX0lOQUNUSVZFOwotCi0JLyogY2hlY2sgaWYgbG9jYWwgbm9kZSBhbmQgdXBkYXRlIHRoZSBmbGFncyAqLwotCWlmIChpbmV0X2FkZHJfdHlwZSgmaW5pdF9uZXQsIHVkZXN0LT5hZGRyKSA9PSBSVE5fTE9DQUwpIHsKLQkJY29ubl9mbGFncyA9IChjb25uX2ZsYWdzICYgfklQX1ZTX0NPTk5fRl9GV0RfTUFTSykKLQkJCXwgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERTsKLQl9Ci0KLQkvKiBzZXQgdGhlIElQX1ZTX0NPTk5fRl9OT09VVFBVVCBmbGFnIGlmIG5vdCBtYXNxdWVyYWRpbmcvTkFUICovCi0JaWYgKChjb25uX2ZsYWdzICYgSVBfVlNfQ09OTl9GX0ZXRF9NQVNLKSAhPSAwKSB7Ci0JCWNvbm5fZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX05PT1VUUFVUOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqICAgIFB1dCB0aGUgcmVhbCBzZXJ2aWNlIGluIGlwX3ZzX3J0YWJsZSBpZiBub3QgcHJlc2VudC4KLQkJICogICAgRm9yIG5vdyBvbmx5IGZvciBOQVQhCi0JCSAqLwotCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3JzX2xvY2spOwotCQlpcF92c19yc19oYXNoKGRlc3QpOwotCQl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7Ci0JfQotCWF0b21pY19zZXQoJmRlc3QtPmNvbm5fZmxhZ3MsIGNvbm5fZmxhZ3MpOwotCi0JLyogYmluZCB0aGUgc2VydmljZSAqLwotCWlmICghZGVzdC0+c3ZjKSB7Ci0JCV9faXBfdnNfYmluZF9zdmMoZGVzdCwgc3ZjKTsKLQl9IGVsc2UgewotCQlpZiAoZGVzdC0+c3ZjICE9IHN2YykgewotCQkJX19pcF92c191bmJpbmRfc3ZjKGRlc3QpOwotCQkJaXBfdnNfemVyb19zdGF0cygmZGVzdC0+c3RhdHMpOwotCQkJX19pcF92c19iaW5kX3N2YyhkZXN0LCBzdmMpOwotCQl9Ci0JfQotCi0JLyogc2V0IHRoZSBkZXN0IHN0YXR1cyBmbGFncyAqLwotCWRlc3QtPmZsYWdzIHw9IElQX1ZTX0RFU1RfRl9BVkFJTEFCTEU7Ci0KLQlpZiAodWRlc3QtPnVfdGhyZXNob2xkID09IDAgfHwgdWRlc3QtPnVfdGhyZXNob2xkID4gZGVzdC0+dV90aHJlc2hvbGQpCi0JCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7Ci0JZGVzdC0+dV90aHJlc2hvbGQgPSB1ZGVzdC0+dV90aHJlc2hvbGQ7Ci0JZGVzdC0+bF90aHJlc2hvbGQgPSB1ZGVzdC0+bF90aHJlc2hvbGQ7Ci19Ci0KLQotLyoKLSAqCUNyZWF0ZSBhIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VydmljZQotICovCi1zdGF0aWMgaW50Ci1pcF92c19uZXdfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCwKLQkgICAgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKipkZXN0X3ApCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0JdW5zaWduZWQgYXR5cGU7Ci0KLQlFbnRlckZ1bmN0aW9uKDIpOwotCi0JYXR5cGUgPSBpbmV0X2FkZHJfdHlwZSgmaW5pdF9uZXQsIHVkZXN0LT5hZGRyKTsKLQlpZiAoYXR5cGUgIT0gUlROX0xPQ0FMICYmIGF0eXBlICE9IFJUTl9VTklDQVNUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRlc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdCksIEdGUF9BVE9NSUMpOwotCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19uZXdfZGVzdDoga21hbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZGVzdC0+cHJvdG9jb2wgPSBzdmMtPnByb3RvY29sOwotCWRlc3QtPnZhZGRyID0gc3ZjLT5hZGRyOwotCWRlc3QtPnZwb3J0ID0gc3ZjLT5wb3J0OwotCWRlc3QtPnZmd21hcmsgPSBzdmMtPmZ3bWFyazsKLQlkZXN0LT5hZGRyID0gdWRlc3QtPmFkZHI7Ci0JZGVzdC0+cG9ydCA9IHVkZXN0LT5wb3J0OwotCi0JYXRvbWljX3NldCgmZGVzdC0+YWN0aXZlY29ubnMsIDApOwotCWF0b21pY19zZXQoJmRlc3QtPmluYWN0Y29ubnMsIDApOwotCWF0b21pY19zZXQoJmRlc3QtPnBlcnNpc3Rjb25ucywgMCk7Ci0JYXRvbWljX3NldCgmZGVzdC0+cmVmY250LCAwKTsKLQotCUlOSVRfTElTVF9IRUFEKCZkZXN0LT5kX2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZkZXN0LT5kc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRlc3QtPnN0YXRzLmxvY2spOwotCV9faXBfdnNfdXBkYXRlX2Rlc3Qoc3ZjLCBkZXN0LCB1ZGVzdCk7Ci0JaXBfdnNfbmV3X2VzdGltYXRvcigmZGVzdC0+c3RhdHMpOwotCi0JKmRlc3RfcCA9IGRlc3Q7Ci0KLQlMZWF2ZUZ1bmN0aW9uKDIpOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKglBZGQgYSBkZXN0aW5hdGlvbiBpbnRvIGFuIGV4aXN0aW5nIHNlcnZpY2UKLSAqLwotc3RhdGljIGludAotaXBfdnNfYWRkX2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IGlwX3ZzX2Rlc3RfdXNlciAqdWRlc3QpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0JX19iZTMyIGRhZGRyID0gdWRlc3QtPmFkZHI7Ci0JX19iZTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7Ci0JaW50IHJldDsKLQotCUVudGVyRnVuY3Rpb24oMik7Ci0KLQlpZiAodWRlc3QtPndlaWdodCA8IDApIHsKLQkJSVBfVlNfRVJSKCJpcF92c19hZGRfZGVzdCgpOiBzZXJ2ZXIgd2VpZ2h0IGxlc3MgdGhhbiB6ZXJvXG4iKTsKLQkJcmV0dXJuIC1FUkFOR0U7Ci0JfQotCi0JaWYgKHVkZXN0LT5sX3RocmVzaG9sZCA+IHVkZXN0LT51X3RocmVzaG9sZCkgewotCQlJUF9WU19FUlIoImlwX3ZzX2FkZF9kZXN0KCk6IGxvd2VyIHRocmVzaG9sZCBpcyBoaWdoZXIgdGhhbiAiCi0JCQkgICJ1cHBlciB0aHJlc2hvbGRcbiIpOwotCQlyZXR1cm4gLUVSQU5HRTsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZSBkZXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBsaXN0Ci0JICovCi0JZGVzdCA9IGlwX3ZzX2xvb2t1cF9kZXN0KHN2YywgZGFkZHIsIGRwb3J0KTsKLQlpZiAoZGVzdCAhPSBOVUxMKSB7Ci0JCUlQX1ZTX0RCRygxLCAiaXBfdnNfYWRkX2Rlc3QoKTogZGVzdCBhbHJlYWR5IGV4aXN0c1xuIik7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGRlc3QgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyYXNoIGFuZAotCSAqIGlzIGZyb20gdGhlIHNhbWUgc2VydmljZQotCSAqLwotCWRlc3QgPSBpcF92c190cmFzaF9nZXRfZGVzdChzdmMsIGRhZGRyLCBkcG9ydCk7Ci0JaWYgKGRlc3QgIT0gTlVMTCkgewotCQlJUF9WU19EQkcoMywgIkdldCBkZXN0aW5hdGlvbiAldS4ldS4ldS4ldToldSBmcm9tIHRyYXNoLCAiCi0JCQkgICJkZXN0LT5yZWZjbnQ9JWQsIHNlcnZpY2UgJXUvJXUuJXUuJXUuJXU6JXVcbiIsCi0JCQkgIE5JUFFVQUQoZGFkZHIpLCBudG9ocyhkcG9ydCksCi0JCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpLAotCQkJICBkZXN0LT52ZndtYXJrLAotCQkJICBOSVBRVUFEKGRlc3QtPnZhZGRyKSwKLQkJCSAgbnRvaHMoZGVzdC0+dnBvcnQpKTsKLQkJX19pcF92c191cGRhdGVfZGVzdChzdmMsIGRlc3QsIHVkZXN0KTsKLQotCQkvKgotCQkgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGZyb20gdGhlIHRyYXNoCi0JCSAqLwotCQlsaXN0X2RlbCgmZGVzdC0+bl9saXN0KTsKLQotCQlpcF92c19uZXdfZXN0aW1hdG9yKCZkZXN0LT5zdGF0cyk7Ci0KLQkJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkJLyoKLQkJICogV2FpdCB1bnRpbCBhbGwgb3RoZXIgc3ZjIHVzZXJzIGdvIGF3YXkuCi0JCSAqLwotCQlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKLQotCQlsaXN0X2FkZCgmZGVzdC0+bl9saXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMpOwotCQlzdmMtPm51bV9kZXN0cysrOwotCi0JCS8qIGNhbGwgdGhlIHVwZGF0ZV9zZXJ2aWNlIGZ1bmN0aW9uIG9mIGl0cyBzY2hlZHVsZXIgKi8KLQkJc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKHN2Yyk7Ci0KLQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVzdCBzdHJ1Y3R1cmUKLQkgKi8KLQlyZXQgPSBpcF92c19uZXdfZGVzdChzdmMsIHVkZXN0LCAmZGVzdCk7Ci0JaWYgKHJldCkgewotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qCi0JICogQWRkIHRoZSBkZXN0IGVudHJ5IGludG8gdGhlIGxpc3QKLQkgKi8KLQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwotCi0Jd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkvKgotCSAqIFdhaXQgdW50aWwgYWxsIG90aGVyIHN2YyB1c2VycyBnbyBhd2F5LgotCSAqLwotCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOwotCi0JbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJnN2Yy0+ZGVzdGluYXRpb25zKTsKLQlzdmMtPm51bV9kZXN0cysrOwotCi0JLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlciAqLwotCXN2Yy0+c2NoZWR1bGVyLT51cGRhdGVfc2VydmljZShzdmMpOwotCi0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQotCUxlYXZlRnVuY3Rpb24oMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICoJRWRpdCBhIGRlc3RpbmF0aW9uIGluIHRoZSBnaXZlbiBzZXJ2aWNlCi0gKi8KLXN0YXRpYyBpbnQKLWlwX3ZzX2VkaXRfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlfX2JlMzIgZGFkZHIgPSB1ZGVzdC0+YWRkcjsKLQlfX2JlMTYgZHBvcnQgPSB1ZGVzdC0+cG9ydDsKLQotCUVudGVyRnVuY3Rpb24oMik7Ci0KLQlpZiAodWRlc3QtPndlaWdodCA8IDApIHsKLQkJSVBfVlNfRVJSKCJpcF92c19lZGl0X2Rlc3QoKTogc2VydmVyIHdlaWdodCBsZXNzIHRoYW4gemVyb1xuIik7Ci0JCXJldHVybiAtRVJBTkdFOwotCX0KLQotCWlmICh1ZGVzdC0+bF90aHJlc2hvbGQgPiB1ZGVzdC0+dV90aHJlc2hvbGQpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19lZGl0X2Rlc3QoKTogbG93ZXIgdGhyZXNob2xkIGlzIGhpZ2hlciB0aGFuICIKLQkJCSAgInVwcGVyIHRocmVzaG9sZFxuIik7Ci0JCXJldHVybiAtRVJBTkdFOwotCX0KLQotCS8qCi0JICogIExvb2t1cCB0aGUgZGVzdGluYXRpb24gbGlzdAotCSAqLwotCWRlc3QgPSBpcF92c19sb29rdXBfZGVzdChzdmMsIGRhZGRyLCBkcG9ydCk7Ci0JaWYgKGRlc3QgPT0gTlVMTCkgewotCQlJUF9WU19EQkcoMSwgImlwX3ZzX2VkaXRfZGVzdCgpOiBkZXN0IGRvZXNuJ3QgZXhpc3RcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlfX2lwX3ZzX3VwZGF0ZV9kZXN0KHN2YywgZGVzdCwgdWRlc3QpOwotCi0Jd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkvKiBXYWl0IHVudGlsIGFsbCBvdGhlciBzdmMgdXNlcnMgZ28gYXdheSAqLwotCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOwotCi0JLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UsIGJlY2F1c2Ugc2VydmVyIHdlaWdodCBtYXkgYmUgY2hhbmdlZCAqLwotCXN2Yy0+c2NoZWR1bGVyLT51cGRhdGVfc2VydmljZShzdmMpOwotCi0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQotCUxlYXZlRnVuY3Rpb24oMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICoJRGVsZXRlIGEgZGVzdGluYXRpb24gKG11c3QgYmUgYWxyZWFkeSB1bmxpbmtlZCBmcm9tIHRoZSBzZXJ2aWNlKQotICovCi1zdGF0aWMgdm9pZCBfX2lwX3ZzX2RlbF9kZXN0KHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQotewotCWlwX3ZzX2tpbGxfZXN0aW1hdG9yKCZkZXN0LT5zdGF0cyk7Ci0KLQkvKgotCSAqICBSZW1vdmUgaXQgZnJvbSB0aGUgZC1saW5rZWQgbGlzdCB3aXRoIHRoZSByZWFsIHNlcnZpY2VzLgotCSAqLwotCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7Ci0JaXBfdnNfcnNfdW5oYXNoKGRlc3QpOwotCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19yc19sb2NrKTsKLQotCS8qCi0JICogIERlY3JlYXNlIHRoZSByZWZjbnQgb2YgdGhlIGRlc3QsIGFuZCBmcmVlIHRoZSBkZXN0Ci0JICogIGlmIG5vYm9keSByZWZlcnMgdG8gaXQgKHJlZmNudD0wKS4gT3RoZXJ3aXNlLCB0aHJvdwotCSAqICB0aGUgZGVzdGluYXRpb24gaW50byB0aGUgdHJhc2guCi0JICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRlc3QtPnJlZmNudCkpIHsKLQkJaXBfdnNfZHN0X3Jlc2V0KGRlc3QpOwotCQkvKiBzaW1wbHkgZGVjcmVhc2Ugc3ZjLT5yZWZjbnQgaGVyZSwgbGV0IHRoZSBjYWxsZXIgY2hlY2sKLQkJICAgYW5kIHJlbGVhc2UgdGhlIHNlcnZpY2UgaWYgbm9ib2R5IHJlZmVycyB0byBpdC4KLQkJICAgT25seSB1c2VyIGNvbnRleHQgY2FuIHJlbGVhc2UgZGVzdGluYXRpb24gYW5kIHNlcnZpY2UsCi0JCSAgIGFuZCBvbmx5IG9uZSB1c2VyIGNvbnRleHQgY2FuIHVwZGF0ZSB2aXJ0dWFsIHNlcnZpY2UgYXQgYQotCQkgICB0aW1lLCBzbyB0aGUgb3BlcmF0aW9uIGhlcmUgaXMgT0sgKi8KLQkJYXRvbWljX2RlYygmZGVzdC0+c3ZjLT5yZWZjbnQpOwotCQlrZnJlZShkZXN0KTsKLQl9IGVsc2UgewotCQlJUF9WU19EQkcoMywgIk1vdmluZyBkZXN0ICV1LiV1LiV1LiV1OiV1IGludG8gdHJhc2gsICIKLQkJCSAgImRlc3QtPnJlZmNudD0lZFxuIiwKLQkJCSAgTklQUVVBRChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCksCi0JCQkgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKLQkJbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJmlwX3ZzX2Rlc3RfdHJhc2gpOwotCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwotCX0KLX0KLQotCi0vKgotICoJVW5saW5rIGEgZGVzdGluYXRpb24gZnJvbSB0aGUgZ2l2ZW4gc2VydmljZQotICovCi1zdGF0aWMgdm9pZCBfX2lwX3ZzX3VubGlua19kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCi0JCQkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsCi0JCQkJaW50IHN2Y3VwZCkKLXsKLQlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX0FWQUlMQUJMRTsKLQotCS8qCi0JICogIFJlbW92ZSBpdCBmcm9tIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0LgotCSAqLwotCWxpc3RfZGVsKCZkZXN0LT5uX2xpc3QpOwotCXN2Yy0+bnVtX2Rlc3RzLS07Ci0JaWYgKHN2Y3VwZCkgewotCQkvKgotCQkgKiAgQ2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlcgotCQkgKi8KLQkJc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKHN2Yyk7Ci0JfQotfQotCi0KLS8qCi0gKglEZWxldGUgYSBkZXN0aW5hdGlvbiBzZXJ2ZXIgaW4gdGhlIGdpdmVuIHNlcnZpY2UKLSAqLwotc3RhdGljIGludAotaXBfdnNfZGVsX2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyxzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICp1ZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlfX2JlMzIgZGFkZHIgPSB1ZGVzdC0+YWRkcjsKLQlfX2JlMTYgZHBvcnQgPSB1ZGVzdC0+cG9ydDsKLQotCUVudGVyRnVuY3Rpb24oMik7Ci0KLQlkZXN0ID0gaXBfdnNfbG9va3VwX2Rlc3Qoc3ZjLCBkYWRkciwgZHBvcnQpOwotCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJSVBfVlNfREJHKDEsICJpcF92c19kZWxfZGVzdCgpOiBkZXN0aW5hdGlvbiBub3QgZm91bmQhXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0Jd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkvKgotCSAqCVdhaXQgdW50aWwgYWxsIG90aGVyIHN2YyB1c2VycyBnbyBhd2F5LgotCSAqLwotCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOwotCi0JLyoKLQkgKglVbmxpbmsgZGVzdCBmcm9tIHRoZSBzZXJ2aWNlCi0JICovCi0JX19pcF92c191bmxpbmtfZGVzdChzdmMsIGRlc3QsIDEpOwotCi0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQotCS8qCi0JICoJRGVsZXRlIHRoZSBkZXN0aW5hdGlvbgotCSAqLwotCV9faXBfdnNfZGVsX2Rlc3QoZGVzdCk7Ci0KLQlMZWF2ZUZ1bmN0aW9uKDIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqCUFkZCBhIHNlcnZpY2UgaW50byB0aGUgc2VydmljZSBoYXNoIHRhYmxlCi0gKi8KLXN0YXRpYyBpbnQKLWlwX3ZzX2FkZF9zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIgKnUsIHN0cnVjdCBpcF92c19zZXJ2aWNlICoqc3ZjX3ApCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWQgPSBOVUxMOwotCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMgPSBOVUxMOwotCi0JLyogaW5jcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KLQlpcF92c191c2VfY291bnRfaW5jKCk7Ci0KLQkvKiBMb29rdXAgdGhlIHNjaGVkdWxlciBieSAndS0+c2NoZWRfbmFtZScgKi8KLQlzY2hlZCA9IGlwX3ZzX3NjaGVkdWxlcl9nZXQodS0+c2NoZWRfbmFtZSk7Ci0JaWYgKHNjaGVkID09IE5VTEwpIHsKLQkJSVBfVlNfSU5GTygiU2NoZWR1bGVyIG1vZHVsZSBpcF92c18lcyBub3QgZm91bmRcbiIsCi0JCQkgICB1LT5zY2hlZF9uYW1lKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBvdXRfbW9kX2RlYzsKLQl9Ci0KLQlzdmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZSksIEdGUF9BVE9NSUMpOwotCWlmIChzdmMgPT0gTlVMTCkgewotCQlJUF9WU19EQkcoMSwgImlwX3ZzX2FkZF9zZXJ2aWNlOiBrbWFsbG9jIGZhaWxlZC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JLyogSSdtIHRoZSBmaXJzdCB1c2VyIG9mIHRoZSBzZXJ2aWNlICovCi0JYXRvbWljX3NldCgmc3ZjLT51c2VjbnQsIDEpOwotCWF0b21pY19zZXQoJnN2Yy0+cmVmY250LCAwKTsKLQotCXN2Yy0+cHJvdG9jb2wgPSB1LT5wcm90b2NvbDsKLQlzdmMtPmFkZHIgPSB1LT5hZGRyOwotCXN2Yy0+cG9ydCA9IHUtPnBvcnQ7Ci0Jc3ZjLT5md21hcmsgPSB1LT5md21hcms7Ci0Jc3ZjLT5mbGFncyA9IHUtPmZsYWdzOwotCXN2Yy0+dGltZW91dCA9IHUtPnRpbWVvdXQgKiBIWjsKLQlzdmMtPm5ldG1hc2sgPSB1LT5uZXRtYXNrOwotCi0JSU5JVF9MSVNUX0hFQUQoJnN2Yy0+ZGVzdGluYXRpb25zKTsKLQlyd2xvY2tfaW5pdCgmc3ZjLT5zY2hlZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmc3ZjLT5zdGF0cy5sb2NrKTsKLQotCS8qIEJpbmQgdGhlIHNjaGVkdWxlciAqLwotCXJldCA9IGlwX3ZzX2JpbmRfc2NoZWR1bGVyKHN2Yywgc2NoZWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2VycjsKLQlzY2hlZCA9IE5VTEw7Ci0KLQkvKiBVcGRhdGUgdGhlIHZpcnR1YWwgc2VydmljZSBjb3VudGVycyAqLwotCWlmIChzdmMtPnBvcnQgPT0gRlRQUE9SVCkKLQkJYXRvbWljX2luYygmaXBfdnNfZnRwc3ZjX2NvdW50ZXIpOwotCWVsc2UgaWYgKHN2Yy0+cG9ydCA9PSAwKQotCQlhdG9taWNfaW5jKCZpcF92c19udWxsc3ZjX2NvdW50ZXIpOwotCi0JaXBfdnNfbmV3X2VzdGltYXRvcigmc3ZjLT5zdGF0cyk7Ci0JaXBfdnNfbnVtX3NlcnZpY2VzKys7Ci0KLQkvKiBIYXNoIHRoZSBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgdGFibGUgKi8KLQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQlpcF92c19zdmNfaGFzaChzdmMpOwotCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkqc3ZjX3AgPSBzdmM7Ci0JcmV0dXJuIDA7Ci0KLSAgb3V0X2VycjoKLQlpZiAoc3ZjICE9IE5VTEwpIHsKLQkJaWYgKHN2Yy0+c2NoZWR1bGVyKQotCQkJaXBfdnNfdW5iaW5kX3NjaGVkdWxlcihzdmMpOwotCQlpZiAoc3ZjLT5pbmMpIHsKLQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJCWlwX3ZzX2FwcF9pbmNfcHV0KHN2Yy0+aW5jKTsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOwotCQl9Ci0JCWtmcmVlKHN2Yyk7Ci0JfQotCWlwX3ZzX3NjaGVkdWxlcl9wdXQoc2NoZWQpOwotCi0gIG91dF9tb2RfZGVjOgotCS8qIGRlY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCi0JaXBfdnNfdXNlX2NvdW50X2RlYygpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi0vKgotICoJRWRpdCBhIHNlcnZpY2UgYW5kIGJpbmQgaXQgd2l0aCBhIG5ldyBzY2hlZHVsZXIKLSAqLwotc3RhdGljIGludAotaXBfdnNfZWRpdF9zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIgKnUpCi17Ci0Jc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqc2NoZWQsICpvbGRfc2NoZWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIExvb2t1cCB0aGUgc2NoZWR1bGVyLCBieSAndS0+c2NoZWRfbmFtZScKLQkgKi8KLQlzY2hlZCA9IGlwX3ZzX3NjaGVkdWxlcl9nZXQodS0+c2NoZWRfbmFtZSk7Ci0JaWYgKHNjaGVkID09IE5VTEwpIHsKLQkJSVBfVlNfSU5GTygiU2NoZWR1bGVyIG1vZHVsZSBpcF92c18lcyBub3QgZm91bmRcbiIsCi0JCQkgICB1LT5zY2hlZF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCW9sZF9zY2hlZCA9IHNjaGVkOwotCi0Jd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0KLQkvKgotCSAqIFdhaXQgdW50aWwgYWxsIG90aGVyIHN2YyB1c2VycyBnbyBhd2F5LgotCSAqLwotCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOwotCi0JLyoKLQkgKiBTZXQgdGhlIGZsYWdzIGFuZCB0aW1lb3V0IHZhbHVlCi0JICovCi0Jc3ZjLT5mbGFncyA9IHUtPmZsYWdzIHwgSVBfVlNfU1ZDX0ZfSEFTSEVEOwotCXN2Yy0+dGltZW91dCA9IHUtPnRpbWVvdXQgKiBIWjsKLQlzdmMtPm5ldG1hc2sgPSB1LT5uZXRtYXNrOwotCi0Jb2xkX3NjaGVkID0gc3ZjLT5zY2hlZHVsZXI7Ci0JaWYgKHNjaGVkICE9IG9sZF9zY2hlZCkgewotCQkvKgotCQkgKiBVbmJpbmQgdGhlIG9sZCBzY2hlZHVsZXIKLQkJICovCi0JCWlmICgocmV0ID0gaXBfdnNfdW5iaW5kX3NjaGVkdWxlcihzdmMpKSkgewotCQkJb2xkX3NjaGVkID0gc2NoZWQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qCi0JCSAqIEJpbmQgdGhlIG5ldyBzY2hlZHVsZXIKLQkJICovCi0JCWlmICgocmV0ID0gaXBfdnNfYmluZF9zY2hlZHVsZXIoc3ZjLCBzY2hlZCkpKSB7Ci0JCQkvKgotCQkJICogSWYgaXBfdnNfYmluZF9zY2hlZHVsZXIgZmFpbHMsIHJlc3RvcmUgdGhlIG9sZAotCQkJICogc2NoZWR1bGVyLgotCQkJICogVGhlIG1haW4gcmVhc29uIG9mIGZhaWx1cmUgaXMgb3V0IG9mIG1lbW9yeS4KLQkJCSAqCi0JCQkgKiBUaGUgcXVlc3Rpb24gaXMgaWYgdGhlIG9sZCBzY2hlZHVsZXIgY2FuIGJlCi0JCQkgKiByZXN0b3JlZCBhbGwgdGhlIHRpbWUuIFRPRE86IGlmIGl0IGNhbm5vdCBiZQotCQkJICogcmVzdG9yZWQgc29tZSB0aW1lLCB3ZSBtdXN0IGRlbGV0ZSB0aGUgc2VydmljZSwKLQkJCSAqIG90aGVyd2lzZSB0aGUgc3lzdGVtIG1heSBjcmFzaC4KLQkJCSAqLwotCQkJaXBfdnNfYmluZF9zY2hlZHVsZXIoc3ZjLCBvbGRfc2NoZWQpOwotCQkJb2xkX3NjaGVkID0gc2NoZWQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotICBvdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQotCWlmIChvbGRfc2NoZWQpCi0JCWlwX3ZzX3NjaGVkdWxlcl9wdXQob2xkX3NjaGVkKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqCURlbGV0ZSBhIHNlcnZpY2UgZnJvbSB0aGUgc2VydmljZSBsaXN0Ci0gKgktIFRoZSBzZXJ2aWNlIG11c3QgYmUgdW5saW5rZWQsIHVubG9ja2VkIGFuZCBub3QgcmVmZXJlbmNlZCEKLSAqCS0gV2UgYXJlIGNhbGxlZCB1bmRlciBfYmggbG9jawotICovCi1zdGF0aWMgdm9pZCBfX2lwX3ZzX2RlbF9zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpueHQ7Ci0Jc3RydWN0IGlwX3ZzX3NjaGVkdWxlciAqb2xkX3NjaGVkOwotCi0JaXBfdnNfbnVtX3NlcnZpY2VzLS07Ci0JaXBfdnNfa2lsbF9lc3RpbWF0b3IoJnN2Yy0+c3RhdHMpOwotCi0JLyogVW5iaW5kIHNjaGVkdWxlciAqLwotCW9sZF9zY2hlZCA9IHN2Yy0+c2NoZWR1bGVyOwotCWlwX3ZzX3VuYmluZF9zY2hlZHVsZXIoc3ZjKTsKLQlpZiAob2xkX3NjaGVkKQotCQlpcF92c19zY2hlZHVsZXJfcHV0KG9sZF9zY2hlZCk7Ci0KLQkvKiBVbmJpbmQgYXBwIGluYyAqLwotCWlmIChzdmMtPmluYykgewotCQlpcF92c19hcHBfaW5jX3B1dChzdmMtPmluYyk7Ci0JCXN2Yy0+aW5jID0gTlVMTDsKLQl9Ci0KLQkvKgotCSAqICAgIFVubGluayB0aGUgd2hvbGUgZGVzdGluYXRpb24gbGlzdAotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXN0LCBueHQsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCV9faXBfdnNfdW5saW5rX2Rlc3Qoc3ZjLCBkZXN0LCAwKTsKLQkJX19pcF92c19kZWxfZGVzdChkZXN0KTsKLQl9Ci0KLQkvKgotCSAqICAgIFVwZGF0ZSB0aGUgdmlydHVhbCBzZXJ2aWNlIGNvdW50ZXJzCi0JICovCi0JaWYgKHN2Yy0+cG9ydCA9PSBGVFBQT1JUKQotCQlhdG9taWNfZGVjKCZpcF92c19mdHBzdmNfY291bnRlcik7Ci0JZWxzZSBpZiAoc3ZjLT5wb3J0ID09IDApCi0JCWF0b21pY19kZWMoJmlwX3ZzX251bGxzdmNfY291bnRlcik7Ci0KLQkvKgotCSAqICAgIEZyZWUgdGhlIHNlcnZpY2UgaWYgbm9ib2R5IHJlZmVycyB0byBpdAotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmc3ZjLT5yZWZjbnQpID09IDApCi0JCWtmcmVlKHN2Yyk7Ci0KLQkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLwotCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKLX0KLQotLyoKLSAqCURlbGV0ZSBhIHNlcnZpY2UgZnJvbSB0aGUgc2VydmljZSBsaXN0Ci0gKi8KLXN0YXRpYyBpbnQgaXBfdnNfZGVsX3NlcnZpY2Uoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlpZiAoc3ZjID09IE5VTEwpCi0JCXJldHVybiAtRUVYSVNUOwotCi0JLyoKLQkgKiBVbmhhc2ggaXQgZnJvbSB0aGUgc2VydmljZSB0YWJsZQotCSAqLwotCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOwotCi0JaXBfdnNfc3ZjX3VuaGFzaChzdmMpOwotCi0JLyoKLQkgKiBXYWl0IHVudGlsIGFsbCB0aGUgc3ZjIHVzZXJzIGdvIGF3YXkuCi0JICovCi0JSVBfVlNfV0FJVF9XSElMRShhdG9taWNfcmVhZCgmc3ZjLT51c2VjbnQpID4gMSk7Ci0KLQlfX2lwX3ZzX2RlbF9zZXJ2aWNlKHN2Yyk7Ci0KLQl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqCUZsdXNoIGFsbCB0aGUgdmlydHVhbCBzZXJ2aWNlcwotICovCi1zdGF0aWMgaW50IGlwX3ZzX2ZsdXNoKHZvaWQpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCAqbnh0OwotCi0JLyoKLQkgKiBGbHVzaCB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLGFkZHIscG9ydD4KLQkgKi8KLQlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3ZjLCBueHQsICZpcF92c19zdmNfdGFibGVbaWR4XSwgc19saXN0KSB7Ci0JCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQkJCWlwX3ZzX3N2Y191bmhhc2goc3ZjKTsKLQkJCS8qCi0JCQkgKiBXYWl0IHVudGlsIGFsbCB0aGUgc3ZjIHVzZXJzIGdvIGF3YXkuCi0JCQkgKi8KLQkJCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDApOwotCQkJX19pcF92c19kZWxfc2VydmljZShzdmMpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQkJfQotCX0KLQotCS8qCi0JICogRmx1c2ggdGhlIHNlcnZpY2UgdGFibGUgaGFzaGVkIGJ5IGZ3bWFyawotCSAqLwotCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdmMsIG54dCwKLQkJCQkJICZpcF92c19zdmNfZndtX3RhYmxlW2lkeF0sIGZfbGlzdCkgewotCQkJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0JCQlpcF92c19zdmNfdW5oYXNoKHN2Yyk7Ci0JCQkvKgotCQkJICogV2FpdCB1bnRpbCBhbGwgdGhlIHN2YyB1c2VycyBnbyBhd2F5LgotCQkJICovCi0JCQlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAwKTsKLQkJCV9faXBfdnNfZGVsX3NlcnZpY2Uoc3ZjKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICoJWmVybyBjb3VudGVycyBpbiBhIHNlcnZpY2Ugb3IgYWxsIHNlcnZpY2VzCi0gKi8KLXN0YXRpYyBpbnQgaXBfdnNfemVyb19zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0KLQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlwX3ZzX3plcm9fc3RhdHMoJmRlc3QtPnN0YXRzKTsKLQl9Ci0JaXBfdnNfemVyb19zdGF0cygmc3ZjLT5zdGF0cyk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpcF92c196ZXJvX2FsbCh2b2lkKQotewotCWludCBpZHg7Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQotCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgewotCQkJaXBfdnNfemVyb19zZXJ2aWNlKHN2Yyk7Ci0JCX0KLQl9Ci0KLQlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7Ci0JCQlpcF92c196ZXJvX3NlcnZpY2Uoc3ZjKTsKLQkJfQotCX0KLQotCWlwX3ZzX3plcm9fc3RhdHMoJmlwX3ZzX3N0YXRzKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1wcm9jX2RvX2RlZmVuc2VfbW9kZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKLQkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKLQlpbnQgdmFsID0gKnZhbHA7Ci0JaW50IHJjOwotCi0JcmMgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQlpZiAod3JpdGUgJiYgKCp2YWxwICE9IHZhbCkpIHsKLQkJaWYgKCgqdmFscCA8IDApIHx8ICgqdmFscCA+IDMpKSB7Ci0JCQkvKiBSZXN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlICovCi0JCQkqdmFscCA9IHZhbDsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZV9kZWZlbnNlX2xldmVsKCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQKLXByb2NfZG9fc3luY190aHJlc2hvbGQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOwotCWludCB2YWxbMl07Ci0JaW50IHJjOwotCi0JLyogYmFja3VwIHRoZSB2YWx1ZSBmaXJzdCAqLwotCW1lbWNweSh2YWwsIHZhbHAsIHNpemVvZih2YWwpKTsKLQotCXJjID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JaWYgKHdyaXRlICYmICh2YWxwWzBdIDwgMCB8fCB2YWxwWzFdIDwgMCB8fCB2YWxwWzBdID49IHZhbHBbMV0pKSB7Ci0JCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KLQkJbWVtY3B5KHZhbHAsIHZhbCwgc2l6ZW9mKHZhbCkpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyoKLSAqCUlQVlMgc3lzY3RsIHRhYmxlICh1bmRlciB0aGUgL3Byb2Mvc3lzL25ldC9pcHY0L3ZzLykKLSAqLwotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSB2c192YXJzW10gPSB7Ci0JewotCQkucHJvY25hbWUJPSAiYW1lbXRocmVzaCIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0jaWZkZWYgQ09ORklHX0lQX1ZTX0RFQlVHCi0JewotCQkucHJvY25hbWUJPSAiZGVidWdfbGV2ZWwiLAotCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2RlYnVnX2xldmVsLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLSNlbmRpZgotCXsKLQkJLnByb2NuYW1lCT0gImFtX2Ryb3ByYXRlIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19hbV9kcm9wcmF0ZSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiZHJvcF9lbnRyeSIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2RlZmVuc2VfbW9kZSwKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImRyb3BfcGFja2V0IiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19kcm9wX3BhY2tldCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2RlZmVuc2VfbW9kZSwKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInNlY3VyZV90Y3AiLAotCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3AsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19kZWZlbnNlX21vZGUsCi0JfSwKLSNpZiAwCi0JewotCQkucHJvY25hbWUJPSAidGltZW91dF9lc3RhYmxpc2hlZCIsCi0JCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19FU1RBQkxJU0hFRF0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAidGltZW91dF9zeW5zZW50IiwKLQkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1NZTl9TRU5UXSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bnJlY3YiLAotCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfU1lOX1JFQ1ZdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInRpbWVvdXRfZmlud2FpdCIsCi0JCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19GSU5fV0FJVF0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAidGltZW91dF90aW1ld2FpdCIsCi0JCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19USU1FX1dBSVRdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInRpbWVvdXRfY2xvc2UiLAotCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfQ0xPU0VdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInRpbWVvdXRfY2xvc2V3YWl0IiwKLQkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0NMT1NFX1dBSVRdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInRpbWVvdXRfbGFzdGFjayIsCi0JCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19MQVNUX0FDS10sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAidGltZW91dF9saXN0ZW4iLAotCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfTElTVEVOXSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bmFjayIsCi0JCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19TWU5BQ0tdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gInRpbWVvdXRfdWRwIiwKLQkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1VEUF0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAidGltZW91dF9pY21wIiwKLQkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0lDTVBdLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotI2VuZGlmCi0JewotCQkucHJvY25hbWUJPSAiY2FjaGVfYnlwYXNzIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19jYWNoZV9ieXBhc3MsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImV4cGlyZV9ub2Rlc3RfY29ubiIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZXhwaXJlX25vZGVzdF9jb25uLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJleHBpcmVfcXVpZXNjZW50X3RlbXBsYXRlIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19leHBpcmVfcXVpZXNjZW50X3RlbXBsYXRlLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJzeW5jX3RocmVzaG9sZCIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfc3luY190aHJlc2hvbGQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19zeW5jX3RocmVzaG9sZCwKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gIm5hdF9pY21wX3NlbmQiLAotCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX25hdF9pY21wX3NlbmQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1jb25zdCBzdHJ1Y3QgY3RsX3BhdGggbmV0X3ZzX2N0bF9wYXRoW10gPSB7Ci0JeyAucHJvY25hbWUgPSAibmV0IiwgLmN0bF9uYW1lID0gQ1RMX05FVCwgfSwKLQl7IC5wcm9jbmFtZSA9ICJpcHY0IiwgLmN0bF9uYW1lID0gTkVUX0lQVjQsIH0sCi0JeyAucHJvY25hbWUgPSAidnMiLCB9LAotCXsgfQotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5ldF92c19jdGxfcGF0aCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCi1zdHJ1Y3QgaXBfdnNfaXRlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdGFibGU7Ci0JaW50IGJ1Y2tldDsKLX07Ci0KLS8qCi0gKglXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIFZTIHJ1bGUgdGFibGUgdG8gYSBQUk9DZnMgZmlsZS4KLSAqCShJdCBpcyBrZXB0IGp1c3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCi0gKi8KLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaXBfdnNfZndkX25hbWUodW5zaWduZWQgZmxhZ3MpCi17Ci0Jc3dpdGNoIChmbGFncyAmIElQX1ZTX0NPTk5fRl9GV0RfTUFTSykgewotCWNhc2UgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERToKLQkJcmV0dXJuICJMb2NhbCI7Ci0JY2FzZSBJUF9WU19DT05OX0ZfVFVOTkVMOgotCQlyZXR1cm4gIlR1bm5lbCI7Ci0JY2FzZSBJUF9WU19DT05OX0ZfRFJPVVRFOgotCQlyZXR1cm4gIlJvdXRlIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIk1hc3EiOwotCX0KLX0KLQotCi0vKiBHZXQgdGhlIE50aCBlbnRyeSBpbiB0aGUgdHdvIGxpc3RzICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKmlwX3ZzX2luZm9fYXJyYXkoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOwotCi0JLyogbG9vayBpbiBoYXNoIGJ5IHByb3RvY29sICovCi0JZm9yIChpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgewotCQkJaWYgKHBvcy0tID09IDApewotCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX3RhYmxlOwotCQkJCWl0ZXItPmJ1Y2tldCA9IGlkeDsKLQkJCQlyZXR1cm4gc3ZjOwotCQkJfQotCQl9Ci0JfQotCi0JLyoga2VlcCBsb29raW5nIGluIGZ3bWFyayAqLwotCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7Ci0JCQlpZiAocG9zLS0gPT0gMCkgewotCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKLQkJCQlpdGVyLT5idWNrZXQgPSBpZHg7Ci0JCQkJcmV0dXJuIHN2YzsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqaXBfdnNfaW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotewotCi0JcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKLQlyZXR1cm4gKnBvcyA/IGlwX3ZzX2luZm9fYXJyYXkoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Ci19Ci0KLQotc3RhdGljIHZvaWQgKmlwX3ZzX2luZm9fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmU7Ci0Jc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXI7Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQotCSsrKnBvczsKLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXJldHVybiBpcF92c19pbmZvX2FycmF5KHNlcSwwKTsKLQotCXN2YyA9IHY7Ci0JaXRlciA9IHNlcS0+cHJpdmF0ZTsKLQotCWlmIChpdGVyLT50YWJsZSA9PSBpcF92c19zdmNfdGFibGUpIHsKLQkJLyogbmV4dCBzZXJ2aWNlIGluIHRhYmxlIGhhc2hlZCBieSBwcm90b2NvbCAqLwotCQlpZiAoKGUgPSBzdmMtPnNfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX3RhYmxlW2l0ZXItPmJ1Y2tldF0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgc19saXN0KTsKLQotCi0JCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgewotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsJmlwX3ZzX3N2Y190YWJsZVtpdGVyLT5idWNrZXRdLAotCQkJCQkgICAgc19saXN0KSB7Ci0JCQkJcmV0dXJuIHN2YzsKLQkJCX0KLQkJfQotCi0JCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKLQkJaXRlci0+YnVja2V0ID0gLTE7Ci0JCWdvdG8gc2Nhbl9md21hcms7Ci0JfQotCi0JLyogbmV4dCBzZXJ2aWNlIGluIGhhc2hlZCBieSBmd21hcmsgKi8KLQlpZiAoKGUgPSBzdmMtPmZfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX2Z3bV90YWJsZVtpdGVyLT5idWNrZXRdKQotCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgZl9saXN0KTsKLQotIHNjYW5fZndtYXJrOgotCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaXRlci0+YnVja2V0XSwKLQkJCQkgICAgZl9saXN0KQotCQkJcmV0dXJuIHN2YzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaXBfdnNfaW5mb19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLQlyZWFkX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHJpbnRmKHNlcSwKLQkJCSJJUCBWaXJ0dWFsIFNlcnZlciB2ZXJzaW9uICVkLiVkLiVkIChzaXplPSVkKVxuIiwKLQkJCU5WRVJTSU9OKElQX1ZTX1ZFUlNJT05fQ09ERSksIElQX1ZTX0NPTk5fVEFCX1NJWkUpOwotCQlzZXFfcHV0cyhzZXEsCi0JCQkgIlByb3QgTG9jYWxBZGRyZXNzOlBvcnQgU2NoZWR1bGVyIEZsYWdzXG4iKTsKLQkJc2VxX3B1dHMoc2VxLAotCQkJICIgIC0+IFJlbW90ZUFkZHJlc3M6UG9ydCBGb3J3YXJkIFdlaWdodCBBY3RpdmVDb25uIEluQWN0Q29ublxuIik7Ci0JfSBlbHNlIHsKLQkJY29uc3Qgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyA9IHY7Ci0JCWNvbnN0IHN0cnVjdCBpcF92c19pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOwotCQljb25zdCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQotCQlpZiAoaXRlci0+dGFibGUgPT0gaXBfdnNfc3ZjX3RhYmxlKQotCQkJc2VxX3ByaW50ZihzZXEsICIlcyAgJTA4WDolMDRYICVzICIsCi0JCQkJICAgaXBfdnNfcHJvdG9fbmFtZShzdmMtPnByb3RvY29sKSwKLQkJCQkgICBudG9obChzdmMtPmFkZHIpLAotCQkJCSAgIG50b2hzKHN2Yy0+cG9ydCksCi0JCQkJICAgc3ZjLT5zY2hlZHVsZXItPm5hbWUpOwotCQllbHNlCi0JCQlzZXFfcHJpbnRmKHNlcSwgIkZXTSAgJTA4WCAlcyAiLAotCQkJCSAgIHN2Yy0+ZndtYXJrLCBzdmMtPnNjaGVkdWxlci0+bmFtZSk7Ci0KLQkJaWYgKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9QRVJTSVNURU5UKQotCQkJc2VxX3ByaW50ZihzZXEsICJwZXJzaXN0ZW50ICVkICUwOFhcbiIsCi0JCQkJc3ZjLT50aW1lb3V0LAotCQkJCW50b2hsKHN2Yy0+bmV0bWFzaykpOwotCQllbHNlCi0JCQlzZXFfcHV0YyhzZXEsICdcbicpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKLQkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICIgIC0+ICUwOFg6JTA0WCAgICAgICUtN3MgJS02ZCAlLTEwZCAlLTEwZFxuIiwKLQkJCQkgICBudG9obChkZXN0LT5hZGRyKSwgbnRvaHMoZGVzdC0+cG9ydCksCi0JCQkJICAgaXBfdnNfZndkX25hbWUoYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpKSwKLQkJCQkgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSwKLQkJCQkgICBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpLAotCQkJCSAgIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXBfdnNfaW5mb19zZXFfb3BzID0gewotCS5zdGFydCA9IGlwX3ZzX2luZm9fc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGlwX3ZzX2luZm9fc2VxX25leHQsCi0JLnN0b3AgID0gaXBfdnNfaW5mb19zZXFfc3RvcCwKLQkuc2hvdyAgPSBpcF92c19pbmZvX3NlcV9zaG93LAotfTsKLQotc3RhdGljIGludCBpcF92c19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgJmlwX3ZzX2luZm9fc2VxX29wcywKLQkJCXNpemVvZihzdHJ1Y3QgaXBfdnNfaXRlcikpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF92c19pbmZvX2ZvcHMgPSB7Ci0JLm93bmVyCSA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gaXBfdnNfaW5mb19vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAotfTsKLQotI2VuZGlmCi0KLXN0cnVjdCBpcF92c19zdGF0cyBpcF92c19zdGF0cyA9IHsKLQkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGlwX3ZzX3N0YXRzLmxvY2spLAotfTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IGlwX3ZzX3N0YXRzX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0KLS8qICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCi0Jc2VxX3B1dHMoc2VxLAotCQkgIiAgIFRvdGFsIEluY29taW5nIE91dGdvaW5nICAgICAgICAgSW5jb21pbmcgICAgICAgICBPdXRnb2luZ1xuIik7Ci0Jc2VxX3ByaW50ZihzZXEsCi0JCSAgICIgICBDb25ucyAgUGFja2V0cyAgUGFja2V0cyAgICAgICAgICAgIEJ5dGVzICAgICAgICAgICAgQnl0ZXNcbiIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcF92c19zdGF0cy5sb2NrKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiU4WCAlOFggJThYICUxNkxYICUxNkxYXG5cbiIsIGlwX3ZzX3N0YXRzLmNvbm5zLAotCQkgICBpcF92c19zdGF0cy5pbnBrdHMsIGlwX3ZzX3N0YXRzLm91dHBrdHMsCi0JCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwX3ZzX3N0YXRzLmluYnl0ZXMsCi0JCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwX3ZzX3N0YXRzLm91dGJ5dGVzKTsKLQotLyogICAgICAgICAgICAgICAgIDAxMjM0NTY3IDAxMjM0NTY3IDAxMjM0NTY3IDAxMjM0NTY3MDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAqLwotCXNlcV9wdXRzKHNlcSwKLQkJICAgIiBDb25ucy9zICAgUGt0cy9zICAgUGt0cy9zICAgICAgICAgIEJ5dGVzL3MgICAgICAgICAgQnl0ZXMvc1xuIik7Ci0Jc2VxX3ByaW50ZihzZXEsIiU4WCAlOFggJThYICUxNlggJTE2WFxuIiwKLQkJCWlwX3ZzX3N0YXRzLmNwcywKLQkJCWlwX3ZzX3N0YXRzLmlucHBzLAotCQkJaXBfdnNfc3RhdHMub3V0cHBzLAotCQkJaXBfdnNfc3RhdHMuaW5icHMsCi0JCQlpcF92c19zdGF0cy5vdXRicHMpOwotCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zdGF0cy5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlwX3ZzX3N0YXRzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpcF92c19zdGF0c19zaG93LCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBfdnNfc3RhdHNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGlwX3ZzX3N0YXRzX3NlcV9vcGVuLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotI2VuZGlmCi0KLS8qCi0gKglTZXQgdGltZW91dCB2YWx1ZXMgZm9yIHRjcCB0Y3BmaW4gdWRwIGluIHRoZSB0aW1lb3V0X3RhYmxlLgotICovCi1zdGF0aWMgaW50IGlwX3ZzX3NldF90aW1lb3V0KHN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgKnUpCi17Ci0JSVBfVlNfREJHKDIsICJTZXR0aW5nIHRpbWVvdXQgdGNwOiVkIHRjcGZpbjolZCB1ZHA6JWRcbiIsCi0JCSAgdS0+dGNwX3RpbWVvdXQsCi0JCSAgdS0+dGNwX2Zpbl90aW1lb3V0LAotCQkgIHUtPnVkcF90aW1lb3V0KTsKLQotI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19UQ1AKLQlpZiAodS0+dGNwX3RpbWVvdXQpIHsKLQkJaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCi0JCQk9IHUtPnRjcF90aW1lb3V0ICogSFo7Ci0JfQotCi0JaWYgKHUtPnRjcF9maW5fdGltZW91dCkgewotCQlpcF92c19wcm90b2NvbF90Y3AudGltZW91dF90YWJsZVtJUF9WU19UQ1BfU19GSU5fV0FJVF0KLQkJCT0gdS0+dGNwX2Zpbl90aW1lb3V0ICogSFo7Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVURQCi0JaWYgKHUtPnVkcF90aW1lb3V0KSB7Ci0JCWlwX3ZzX3Byb3RvY29sX3VkcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF0KLQkJCT0gdS0+dWRwX3RpbWVvdXQgKiBIWjsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotCi0jZGVmaW5lIFNFVF9DTURJRChjbWQpCQkoY21kIC0gSVBfVlNfQkFTRV9DVEwpCi0jZGVmaW5lIFNFUlZJQ0VfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyKSkKLSNkZWZpbmUgU1ZDREVTVF9BUkdfTEVOCQkoc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIpICsJXAotCQkJCSBzaXplb2Yoc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcikpCi0jZGVmaW5lIFRJTUVPVVRfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyKSkKLSNkZWZpbmUgREFFTU9OX0FSR19MRU4JCShzaXplb2Yoc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyKSkKLSNkZWZpbmUgTUFYX0FSR19MRU4JCVNWQ0RFU1RfQVJHX0xFTgotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzZXRfYXJnbGVuW1NFVF9DTURJRChJUF9WU19TT19TRVRfTUFYKSsxXSA9IHsKLQlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9BREQpXQkJPSBTRVJWSUNFX0FSR19MRU4sCi0JW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVCldCQk9IFNFUlZJQ0VfQVJHX0xFTiwKLQlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUwpXQkJPSBTRVJWSUNFX0FSR19MRU4sCi0JW1NFVF9DTURJRChJUF9WU19TT19TRVRfRkxVU0gpXQkJPSAwLAotCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX0FERERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKLQlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUxERVNUKV0JPSBTVkNERVNUX0FSR19MRU4sCi0JW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKLQlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9USU1FT1VUKV0JPSBUSU1FT1VUX0FSR19MRU4sCi0JW1NFVF9DTURJRChJUF9WU19TT19TRVRfU1RBUlREQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAotCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1NUT1BEQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAotCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1pFUk8pXQkJPSBTRVJWSUNFX0FSR19MRU4sCi19OwotCi1zdGF0aWMgaW50Ci1kb19pcF92c19zZXRfY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGFyZ1tNQVhfQVJHX0xFTl07Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2VfdXNlciAqdXN2YzsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOwotCXN0cnVjdCBpcF92c19kZXN0X3VzZXIgKnVkZXN0OwotCi0JaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGxlbiAhPSBzZXRfYXJnbGVuW1NFVF9DTURJRChjbWQpXSkgewotCQlJUF9WU19FUlIoInNldF9jdGw6IGxlbiAldSAhPSAldVxuIiwKLQkJCSAgbGVuLCBzZXRfYXJnbGVuW1NFVF9DTURJRChjbWQpXSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihhcmcsIHVzZXIsIGxlbikgIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKiBpbmNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLwotCWlwX3ZzX3VzZV9jb3VudF9pbmMoKTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJl9faXBfdnNfbXV0ZXgpKSB7Ci0JCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJZ290byBvdXRfZGVjOwotCX0KLQotCWlmIChjbWQgPT0gSVBfVlNfU09fU0VUX0ZMVVNIKSB7Ci0JCS8qIEZsdXNoIHRoZSB2aXJ0dWFsIHNlcnZpY2UgKi8KLQkJcmV0ID0gaXBfdnNfZmx1c2goKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0gZWxzZSBpZiAoY21kID09IElQX1ZTX1NPX1NFVF9USU1FT1VUKSB7Ci0JCS8qIFNldCB0aW1lb3V0IHZhbHVlcyBmb3IgKHRjcCB0Y3BmaW4gdWRwKSAqLwotCQlyZXQgPSBpcF92c19zZXRfdGltZW91dCgoc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlciAqKWFyZyk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9IGVsc2UgaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfU1RBUlREQUVNT04pIHsKLQkJc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyICpkbSA9IChzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgKilhcmc7Ci0JCXJldCA9IHN0YXJ0X3N5bmNfdGhyZWFkKGRtLT5zdGF0ZSwgZG0tPm1jYXN0X2lmbiwgZG0tPnN5bmNpZCk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9IGVsc2UgaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfU1RPUERBRU1PTikgewotCQlzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgKmRtID0gKHN0cnVjdCBpcF92c19kYWVtb25fdXNlciAqKWFyZzsKLQkJcmV0ID0gc3RvcF9zeW5jX3RocmVhZChkbS0+c3RhdGUpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JdXN2YyA9IChzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyICopYXJnOwotCXVkZXN0ID0gKHN0cnVjdCBpcF92c19kZXN0X3VzZXIgKikodXN2YyArIDEpOwotCi0JaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfWkVSTykgewotCQkvKiBpZiBubyBzZXJ2aWNlIGFkZHJlc3MgaXMgc2V0LCB6ZXJvIGNvdW50ZXJzIGluIGFsbCAqLwotCQlpZiAoIXVzdmMtPmZ3bWFyayAmJiAhdXN2Yy0+YWRkciAmJiAhdXN2Yy0+cG9ydCkgewotCQkJcmV0ID0gaXBfdnNfemVyb19hbGwoKTsKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCX0KLQotCS8qIENoZWNrIGZvciB2YWxpZCBwcm90b2NvbDogVENQIG9yIFVEUCwgZXZlbiBmb3IgZndtYXJrIT0wICovCi0JaWYgKHVzdmMtPnByb3RvY29sIT1JUFBST1RPX1RDUCAmJiB1c3ZjLT5wcm90b2NvbCE9SVBQUk9UT19VRFApIHsKLQkJSVBfVlNfRVJSKCJzZXRfY3RsOiBpbnZhbGlkIHByb3RvY29sOiAlZCAlZC4lZC4lZC4lZDolZCAlc1xuIiwKLQkJCSAgdXN2Yy0+cHJvdG9jb2wsIE5JUFFVQUQodXN2Yy0+YWRkciksCi0JCQkgIG50b2hzKHVzdmMtPnBvcnQpLCB1c3ZjLT5zY2hlZF9uYW1lKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCS8qIExvb2t1cCB0aGUgZXhhY3Qgc2VydmljZSBieSA8cHJvdG9jb2wsIGFkZHIsIHBvcnQ+IG9yIGZ3bWFyayAqLwotCWlmICh1c3ZjLT5md21hcmsgPT0gMCkKLQkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldCh1c3ZjLT5wcm90b2NvbCwKLQkJCQkJICB1c3ZjLT5hZGRyLCB1c3ZjLT5wb3J0KTsKLQllbHNlCi0JCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy0+ZndtYXJrKTsKLQotCWlmIChjbWQgIT0gSVBfVlNfU09fU0VUX0FERAotCSAgICAmJiAoc3ZjID09IE5VTEwgfHwgc3ZjLT5wcm90b2NvbCAhPSB1c3ZjLT5wcm90b2NvbCkpIHsKLQkJcmV0ID0gLUVTUkNIOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIElQX1ZTX1NPX1NFVF9BREQ6Ci0JCWlmIChzdmMgIT0gTlVMTCkKLQkJCXJldCA9IC1FRVhJU1Q7Ci0JCWVsc2UKLQkJCXJldCA9IGlwX3ZzX2FkZF9zZXJ2aWNlKHVzdmMsICZzdmMpOwotCQlicmVhazsKLQljYXNlIElQX1ZTX1NPX1NFVF9FRElUOgotCQlyZXQgPSBpcF92c19lZGl0X3NlcnZpY2Uoc3ZjLCB1c3ZjKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUF9WU19TT19TRVRfREVMOgotCQlyZXQgPSBpcF92c19kZWxfc2VydmljZShzdmMpOwotCQlpZiAoIXJldCkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJYnJlYWs7Ci0JY2FzZSBJUF9WU19TT19TRVRfWkVSTzoKLQkJcmV0ID0gaXBfdnNfemVyb19zZXJ2aWNlKHN2Yyk7Ci0JCWJyZWFrOwotCWNhc2UgSVBfVlNfU09fU0VUX0FERERFU1Q6Ci0JCXJldCA9IGlwX3ZzX2FkZF9kZXN0KHN2YywgdWRlc3QpOwotCQlicmVhazsKLQljYXNlIElQX1ZTX1NPX1NFVF9FRElUREVTVDoKLQkJcmV0ID0gaXBfdnNfZWRpdF9kZXN0KHN2YywgdWRlc3QpOwotCQlicmVhazsKLQljYXNlIElQX1ZTX1NPX1NFVF9ERUxERVNUOgotCQlyZXQgPSBpcF92c19kZWxfZGVzdChzdmMsIHVkZXN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3ZjKQotCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCi0gIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZfX2lwX3ZzX211dGV4KTsKLSAgb3V0X2RlYzoKLQkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLwotCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWlwX3ZzX2NvcHlfc3RhdHMoc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgKmRzdCwgc3RydWN0IGlwX3ZzX3N0YXRzICpzcmMpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZzcmMtPmxvY2spOwotCW1lbWNweShkc3QsIHNyYywgKGNoYXIqKSZzcmMtPmxvY2sgLSAoY2hhciopc3JjKTsKLQlzcGluX3VubG9ja19iaCgmc3JjLT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQKLWlwX3ZzX2NvcHlfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqZHN0LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3JjKQotewotCWRzdC0+cHJvdG9jb2wgPSBzcmMtPnByb3RvY29sOwotCWRzdC0+YWRkciA9IHNyYy0+YWRkcjsKLQlkc3QtPnBvcnQgPSBzcmMtPnBvcnQ7Ci0JZHN0LT5md21hcmsgPSBzcmMtPmZ3bWFyazsKLQlzdHJsY3B5KGRzdC0+c2NoZWRfbmFtZSwgc3JjLT5zY2hlZHVsZXItPm5hbWUsIHNpemVvZihkc3QtPnNjaGVkX25hbWUpKTsKLQlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKLQlkc3QtPnRpbWVvdXQgPSBzcmMtPnRpbWVvdXQgLyBIWjsKLQlkc3QtPm5ldG1hc2sgPSBzcmMtPm5ldG1hc2s7Ci0JZHN0LT5udW1fZGVzdHMgPSBzcmMtPm51bV9kZXN0czsKLQlpcF92c19jb3B5X3N0YXRzKCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2lwX3ZzX2dldF9zZXJ2aWNlX2VudHJpZXMoY29uc3Qgc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcyAqZ2V0LAotCQkJICAgIHN0cnVjdCBpcF92c19nZXRfc2VydmljZXMgX191c2VyICp1cHRyKQotewotCWludCBpZHgsIGNvdW50PTA7Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQlzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSBlbnRyeTsKLQlpbnQgcmV0ID0gMDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtpZHhdLCBzX2xpc3QpIHsKLQkJCWlmIChjb3VudCA+PSBnZXQtPm51bV9zZXJ2aWNlcykKLQkJCQlnb3RvIG91dDsKLQkJCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOwotCQkJaXBfdnNfY29weV9zZXJ2aWNlKCZlbnRyeSwgc3ZjKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoJnVwdHItPmVudHJ5dGFibGVbY291bnRdLAotCQkJCQkgJmVudHJ5LCBzaXplb2YoZW50cnkpKSkgewotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotCi0JZm9yIChpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX2Z3bV90YWJsZVtpZHhdLCBmX2xpc3QpIHsKLQkJCWlmIChjb3VudCA+PSBnZXQtPm51bV9zZXJ2aWNlcykKLQkJCQlnb3RvIG91dDsKLQkJCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOwotCQkJaXBfdnNfY29weV9zZXJ2aWNlKCZlbnRyeSwgc3ZjKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoJnVwdHItPmVudHJ5dGFibGVbY291bnRdLAotCQkJCQkgJmVudHJ5LCBzaXplb2YoZW50cnkpKSkgewotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQl9Ci0JfQotICBvdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLV9faXBfdnNfZ2V0X2Rlc3RfZW50cmllcyhjb25zdCBzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzICpnZXQsCi0JCQkgc3RydWN0IGlwX3ZzX2dldF9kZXN0cyBfX3VzZXIgKnVwdHIpCi17Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChnZXQtPmZ3bWFyaykKLQkJc3ZjID0gX19pcF92c19zdmNfZndtX2dldChnZXQtPmZ3bWFyayk7Ci0JZWxzZQotCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KGdldC0+cHJvdG9jb2wsCi0JCQkJCSAgZ2V0LT5hZGRyLCBnZXQtPnBvcnQpOwotCWlmIChzdmMpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0JCXN0cnVjdCBpcF92c19kZXN0X2VudHJ5IGVudHJ5OwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKLQkJCWlmIChjb3VudCA+PSBnZXQtPm51bV9kZXN0cykKLQkJCQlicmVhazsKLQotCQkJZW50cnkuYWRkciA9IGRlc3QtPmFkZHI7Ci0JCQllbnRyeS5wb3J0ID0gZGVzdC0+cG9ydDsKLQkJCWVudHJ5LmNvbm5fZmxhZ3MgPSBhdG9taWNfcmVhZCgmZGVzdC0+Y29ubl9mbGFncyk7Ci0JCQllbnRyeS53ZWlnaHQgPSBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KTsKLQkJCWVudHJ5LnVfdGhyZXNob2xkID0gZGVzdC0+dV90aHJlc2hvbGQ7Ci0JCQllbnRyeS5sX3RocmVzaG9sZCA9IGRlc3QtPmxfdGhyZXNob2xkOwotCQkJZW50cnkuYWN0aXZlY29ubnMgPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpOwotCQkJZW50cnkuaW5hY3Rjb25ucyA9IGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKLQkJCWVudHJ5LnBlcnNpc3Rjb25ucyA9IGF0b21pY19yZWFkKCZkZXN0LT5wZXJzaXN0Y29ubnMpOwotCQkJaXBfdnNfY29weV9zdGF0cygmZW50cnkuc3RhdHMsICZkZXN0LT5zdGF0cyk7Ci0JCQlpZiAoY29weV90b191c2VyKCZ1cHRyLT5lbnRyeXRhYmxlW2NvdW50XSwKLQkJCQkJICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQrKzsKLQkJfQotCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCX0gZWxzZQotCQlyZXQgPSAtRVNSQ0g7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1fX2lwX3ZzX2dldF90aW1lb3V0cyhzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyICp1KQotewotI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19UQ1AKLQl1LT50Y3BfdGltZW91dCA9Ci0JCWlwX3ZzX3Byb3RvY29sX3RjcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1RDUF9TX0VTVEFCTElTSEVEXSAvIEhaOwotCXUtPnRjcF9maW5fdGltZW91dCA9Ci0JCWlwX3ZzX3Byb3RvY29sX3RjcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1RDUF9TX0ZJTl9XQUlUXSAvIEhaOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1VEUAotCXUtPnVkcF90aW1lb3V0ID0KLQkJaXBfdnNfcHJvdG9jb2xfdWRwLnRpbWVvdXRfdGFibGVbSVBfVlNfVURQX1NfTk9STUFMXSAvIEhaOwotI2VuZGlmCi19Ci0KLQotI2RlZmluZSBHRVRfQ01ESUQoY21kKQkJKGNtZCAtIElQX1ZTX0JBU0VfQ1RMKQotI2RlZmluZSBHRVRfSU5GT19BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX2dldGluZm8pKQotI2RlZmluZSBHRVRfU0VSVklDRVNfQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c19nZXRfc2VydmljZXMpKQotI2RlZmluZSBHRVRfU0VSVklDRV9BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX3NlcnZpY2VfZW50cnkpKQotI2RlZmluZSBHRVRfREVTVFNfQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c19nZXRfZGVzdHMpKQotI2RlZmluZSBHRVRfVElNRU9VVF9BUkdfTEVOCShzaXplb2Yoc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlcikpCi0jZGVmaW5lIEdFVF9EQUVNT05fQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c19kYWVtb25fdXNlcikgKiAyKQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBnZXRfYXJnbGVuW0dFVF9DTURJRChJUF9WU19TT19HRVRfTUFYKSsxXSA9IHsKLQlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9WRVJTSU9OKV0JPSA2NCwKLQlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9JTkZPKV0JCT0gR0VUX0lORk9fQVJHX0xFTiwKLQlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9TRVJWSUNFUyldCT0gR0VUX1NFUlZJQ0VTX0FSR19MRU4sCi0JW0dFVF9DTURJRChJUF9WU19TT19HRVRfU0VSVklDRSldCT0gR0VUX1NFUlZJQ0VfQVJHX0xFTiwKLQlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9ERVNUUyldCQk9IEdFVF9ERVNUU19BUkdfTEVOLAotCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX1RJTUVPVVQpXQk9IEdFVF9USU1FT1VUX0FSR19MRU4sCi0JW0dFVF9DTURJRChJUF9WU19TT19HRVRfREFFTU9OKV0JPSBHRVRfREFFTU9OX0FSR19MRU4sCi19OwotCi1zdGF0aWMgaW50Ci1kb19pcF92c19nZXRfY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVzZXIsIGludCAqbGVuKQotewotCXVuc2lnbmVkIGNoYXIgYXJnWzEyOF07Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoKmxlbiA8IGdldF9hcmdsZW5bR0VUX0NNRElEKGNtZCldKSB7Ci0JCUlQX1ZTX0VSUigiZ2V0X2N0bDogbGVuICV1IDwgJXVcbiIsCi0JCQkgICpsZW4sIGdldF9hcmdsZW5bR0VUX0NNRElEKGNtZCldKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgdXNlciwgZ2V0X2FyZ2xlbltHRVRfQ01ESUQoY21kKV0pICE9IDApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmX19pcF92c19tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSVBfVlNfU09fR0VUX1ZFUlNJT046Ci0JewotCQljaGFyIGJ1Zls2NF07Ci0KLQkJc3ByaW50ZihidWYsICJJUCBWaXJ0dWFsIFNlcnZlciB2ZXJzaW9uICVkLiVkLiVkIChzaXplPSVkKSIsCi0JCQlOVkVSU0lPTihJUF9WU19WRVJTSU9OX0NPREUpLCBJUF9WU19DT05OX1RBQl9TSVpFKTsKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCBidWYsIHN0cmxlbihidWYpKzEpICE9IDApIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQkqbGVuID0gc3RybGVuKGJ1ZikrMTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElQX1ZTX1NPX0dFVF9JTkZPOgotCXsKLQkJc3RydWN0IGlwX3ZzX2dldGluZm8gaW5mbzsKLQkJaW5mby52ZXJzaW9uID0gSVBfVlNfVkVSU0lPTl9DT0RFOwotCQlpbmZvLnNpemUgPSBJUF9WU19DT05OX1RBQl9TSVpFOwotCQlpbmZvLm51bV9zZXJ2aWNlcyA9IGlwX3ZzX251bV9zZXJ2aWNlczsKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgc2l6ZW9mKGluZm8pKSAhPSAwKQotCQkJcmV0ID0gLUVGQVVMVDsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElQX1ZTX1NPX0dFVF9TRVJWSUNFUzoKLQl7Ci0JCXN0cnVjdCBpcF92c19nZXRfc2VydmljZXMgKmdldDsKLQkJaW50IHNpemU7Ci0KLQkJZ2V0ID0gKHN0cnVjdCBpcF92c19nZXRfc2VydmljZXMgKilhcmc7Ci0JCXNpemUgPSBzaXplb2YoKmdldCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5KSAqIGdldC0+bnVtX3NlcnZpY2VzOwotCQlpZiAoKmxlbiAhPSBzaXplKSB7Ci0JCQlJUF9WU19FUlIoImxlbmd0aDogJXUgIT0gJXVcbiIsICpsZW4sIHNpemUpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXJldCA9IF9faXBfdnNfZ2V0X3NlcnZpY2VfZW50cmllcyhnZXQsIHVzZXIpOwotCX0KLQlicmVhazsKLQotCWNhc2UgSVBfVlNfU09fR0VUX1NFUlZJQ0U6Ci0JewotCQlzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqZW50cnk7Ci0JCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7Ci0KLQkJZW50cnkgPSAoc3RydWN0IGlwX3ZzX3NlcnZpY2VfZW50cnkgKilhcmc7Ci0JCWlmIChlbnRyeS0+ZndtYXJrKQotCQkJc3ZjID0gX19pcF92c19zdmNfZndtX2dldChlbnRyeS0+ZndtYXJrKTsKLQkJZWxzZQotCQkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChlbnRyeS0+cHJvdG9jb2wsCi0JCQkJCQkgIGVudHJ5LT5hZGRyLCBlbnRyeS0+cG9ydCk7Ci0JCWlmIChzdmMpIHsKLQkJCWlwX3ZzX2NvcHlfc2VydmljZShlbnRyeSwgc3ZjKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgZW50cnksIHNpemVvZigqZW50cnkpKSAhPSAwKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwotCQl9IGVsc2UKLQkJCXJldCA9IC1FU1JDSDsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIElQX1ZTX1NPX0dFVF9ERVNUUzoKLQl7Ci0JCXN0cnVjdCBpcF92c19nZXRfZGVzdHMgKmdldDsKLQkJaW50IHNpemU7Ci0KLQkJZ2V0ID0gKHN0cnVjdCBpcF92c19nZXRfZGVzdHMgKilhcmc7Ci0JCXNpemUgPSBzaXplb2YoKmdldCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBpcF92c19kZXN0X2VudHJ5KSAqIGdldC0+bnVtX2Rlc3RzOwotCQlpZiAoKmxlbiAhPSBzaXplKSB7Ci0JCQlJUF9WU19FUlIoImxlbmd0aDogJXUgIT0gJXVcbiIsICpsZW4sIHNpemUpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXJldCA9IF9faXBfdnNfZ2V0X2Rlc3RfZW50cmllcyhnZXQsIHVzZXIpOwotCX0KLQlicmVhazsKLQotCWNhc2UgSVBfVlNfU09fR0VUX1RJTUVPVVQ6Ci0JewotCQlzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyIHQ7Ci0KLQkJX19pcF92c19nZXRfdGltZW91dHMoJnQpOwotCQlpZiAoY29weV90b191c2VyKHVzZXIsICZ0LCBzaXplb2YodCkpICE9IDApCi0JCQlyZXQgPSAtRUZBVUxUOwotCX0KLQlicmVhazsKLQotCWNhc2UgSVBfVlNfU09fR0VUX0RBRU1PTjoKLQl7Ci0JCXN0cnVjdCBpcF92c19kYWVtb25fdXNlciBkWzJdOwotCi0JCW1lbXNldCgmZCwgMCwgc2l6ZW9mKGQpKTsKLQkJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9NQVNURVIpIHsKLQkJCWRbMF0uc3RhdGUgPSBJUF9WU19TVEFURV9NQVNURVI7Ci0JCQlzdHJsY3B5KGRbMF0ubWNhc3RfaWZuLCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBzaXplb2YoZFswXS5tY2FzdF9pZm4pKTsKLQkJCWRbMF0uc3luY2lkID0gaXBfdnNfbWFzdGVyX3N5bmNpZDsKLQkJfQotCQlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX0JBQ0tVUCkgewotCQkJZFsxXS5zdGF0ZSA9IElQX1ZTX1NUQVRFX0JBQ0tVUDsKLQkJCXN0cmxjcHkoZFsxXS5tY2FzdF9pZm4sIGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4sIHNpemVvZihkWzFdLm1jYXN0X2lmbikpOwotCQkJZFsxXS5zeW5jaWQgPSBpcF92c19iYWNrdXBfc3luY2lkOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmQsIHNpemVvZihkKSkgIT0gMCkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JfQotCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLSAgb3V0OgotCW11dGV4X3VubG9jaygmX19pcF92c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IG5mX3NvY2tvcHRfb3BzIGlwX3ZzX3NvY2tvcHRzID0gewotCS5wZgkJPSBQRl9JTkVULAotCS5zZXRfb3B0bWluCT0gSVBfVlNfQkFTRV9DVEwsCi0JLnNldF9vcHRtYXgJPSBJUF9WU19TT19TRVRfTUFYKzEsCi0JLnNldAkJPSBkb19pcF92c19zZXRfY3RsLAotCS5nZXRfb3B0bWluCT0gSVBfVlNfQkFTRV9DVEwsCi0JLmdldF9vcHRtYXgJPSBJUF9WU19TT19HRVRfTUFYKzEsCi0JLmdldAkJPSBkb19pcF92c19nZXRfY3RsLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLQotaW50IF9faW5pdCBpcF92c19jb250cm9sX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCWludCBpZHg7Ci0KLQlFbnRlckZ1bmN0aW9uKDIpOwotCi0JcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXBfdnNfc29ja29wdHMpOwotCWlmIChyZXQpIHsKLQkJSVBfVlNfRVJSKCJjYW5ub3QgcmVnaXN0ZXIgc29ja29wdC5cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImlwX3ZzIiwgMCwgJmlwX3ZzX2luZm9fZm9wcyk7Ci0JcHJvY19uZXRfZm9wc19jcmVhdGUoJmluaXRfbmV0LCAiaXBfdnNfc3RhdHMiLDAsICZpcF92c19zdGF0c19mb3BzKTsKLQotCXN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfcGF0aHMobmV0X3ZzX2N0bF9wYXRoLCB2c192YXJzKTsKLQotCS8qIEluaXRpYWxpemUgaXBfdnNfc3ZjX3RhYmxlLCBpcF92c19zdmNfZndtX3RhYmxlLCBpcF92c19ydGFibGUgKi8KLQlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y190YWJsZVtpZHhdKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSk7Ci0JfQotCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19SVEFCX1NJWkU7IGlkeCsrKSAgewotCQlJTklUX0xJU1RfSEVBRCgmaXBfdnNfcnRhYmxlW2lkeF0pOwotCX0KLQotCWlwX3ZzX25ld19lc3RpbWF0b3IoJmlwX3ZzX3N0YXRzKTsKLQotCS8qIEhvb2sgdGhlIGRlZmVuc2UgdGltZXIgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRlZmVuc2Vfd29yaywgREVGRU5TRV9USU1FUl9QRVJJT0QpOwotCi0JTGVhdmVGdW5jdGlvbigyKTsKLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIGlwX3ZzX2NvbnRyb2xfY2xlYW51cCh2b2lkKQotewotCUVudGVyRnVuY3Rpb24oMik7Ci0JaXBfdnNfdHJhc2hfY2xlYW51cCgpOwotCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmRlZmVuc2Vfd29yayk7Ci0JY2FuY2VsX3dvcmtfc3luYygmZGVmZW5zZV93b3JrLndvcmspOwotCWlwX3ZzX2tpbGxfZXN0aW1hdG9yKCZpcF92c19zdGF0cyk7Ci0JdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7Ci0JcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX3ZzX3N0YXRzIik7Ci0JcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX3ZzIik7Ci0JbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcF92c19zb2Nrb3B0cyk7Ci0JTGVhdmVGdW5jdGlvbigyKTsKLX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZGguYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2NjgyNC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIElQVlM6ICAgICAgICBEZXN0aW5hdGlvbiBIYXNoaW5nIHNjaGVkdWxpbmcgbW9kdWxlCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgotICoKLSAqICAgICAgICAgICAgICBJbnNwaXJlZCBieSB0aGUgY29uc2lzdGVudCBoYXNoaW5nIHNjaGVkdWxlciBwYXRjaCBmcm9tCi0gKiAgICAgICAgICAgICAgVGhvbWFzIFByb2VsbCA8cHJvZWxsdEBnbXguZGU+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqCi0gKi8KLQotLyoKLSAqIFRoZSBkaCBhbGdvcml0aG0gaXMgdG8gc2VsZWN0IHNlcnZlciBieSB0aGUgaGFzaCBrZXkgb2YgZGVzdGluYXRpb24gSVAKLSAqIGFkZHJlc3MuIFRoZSBwc2V1ZG8gY29kZSBpcyBhcyBmb2xsb3dzOgotICoKLSAqICAgICAgIG4gPC0gc2VydmVybm9kZVtkZXN0X2lwXTsKLSAqICAgICAgIGlmIChuIGlzIGRlYWQpIE9SCi0gKiAgICAgICAgICAobiBpcyBvdmVybG9hZGVkKSBPUiAobi53ZWlnaHQgPD0gMCkgdGhlbgotICogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICoKLSAqICAgICAgIHJldHVybiBuOwotICoKLSAqIE5vdGVzIHRoYXQgc2VydmVybm9kZSBpcyBhIDI1Ni1idWNrZXQgaGFzaCB0YWJsZSB0aGF0IG1hcHMgdGhlIGhhc2gKLSAqIGluZGV4IGRlcml2ZWQgZnJvbSBwYWNrZXQgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byB0aGUgY3VycmVudCBzZXJ2ZXIKLSAqIGFycmF5LiBJZiB0aGUgZGggc2NoZWR1bGVyIGlzIHVzZWQgaW4gY2FjaGUgY2x1c3RlciwgaXQgaXMgZ29vZCB0bwotICogY29tYmluZSBpdCB3aXRoIGNhY2hlX2J5cGFzcyBmZWF0dXJlLiBXaGVuIHRoZSBzdGF0aWNhbGx5IGFzc2lnbmVkCi0gKiBzZXJ2ZXIgaXMgZGVhZCBvciBvdmVybG9hZGVkLCB0aGUgbG9hZCBiYWxhbmNlciBjYW4gYnlwYXNzIHRoZSBjYWNoZQotICogc2VydmVyIGFuZCBzZW5kIHJlcXVlc3RzIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgZGlyZWN0bHkuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KLQotLyoKLSAqICAgICAgSVBWUyBESCBidWNrZXQKLSAqLwotc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCB7Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgICAgICAgKmRlc3Q7ICAgICAgICAgIC8qIHJlYWwgc2VydmVyIChjYWNoZSkgKi8KLX07Ci0KLS8qCi0gKiAgICAgZm9yIElQVlMgREggZW50cnkgaGFzaCB0YWJsZQotICovCi0jaWZuZGVmIENPTkZJR19JUF9WU19ESF9UQUJfQklUUwotI2RlZmluZSBDT05GSUdfSVBfVlNfREhfVEFCX0JJVFMgICAgICAgIDgKLSNlbmRpZgotI2RlZmluZSBJUF9WU19ESF9UQUJfQklUUyAgICAgICAgICAgICAgIENPTkZJR19JUF9WU19ESF9UQUJfQklUUwotI2RlZmluZSBJUF9WU19ESF9UQUJfU0laRSAgICAgICAgICAgICAgICgxIDw8IElQX1ZTX0RIX1RBQl9CSVRTKQotI2RlZmluZSBJUF9WU19ESF9UQUJfTUFTSyAgICAgICAgICAgICAgIChJUF9WU19ESF9UQUJfU0laRSAtIDEpCi0KLQotLyoKLSAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgSVBWUyBESCBlbnRyeQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGlwX3ZzX2RoX2hhc2hrZXkoX19iZTMyIGFkZHIpCi17Ci0JcmV0dXJuIChudG9obChhZGRyKSoyNjU0NDM1NzYxVUwpICYgSVBfVlNfREhfVEFCX01BU0s7Ci19Ci0KLQotLyoKLSAqICAgICAgR2V0IGlwX3ZzX2Rlc3QgYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfZGhfZ2V0KHN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCwgX19iZTMyIGFkZHIpCi17Ci0JcmV0dXJuICh0YmxbaXBfdnNfZGhfaGFzaGtleShhZGRyKV0pLmRlc3Q7Ci19Ci0KLQotLyoKLSAqICAgICAgQXNzaWduIGFsbCB0aGUgaGFzaCBidWNrZXRzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgc2VydmljZS4KLSAqLwotc3RhdGljIGludAotaXBfdnNfZGhfYXNzaWduKHN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCwgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICpiOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0KLQliID0gdGJsOwotCXAgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7Ci0JZm9yIChpPTA7IGk8SVBfVlNfREhfVEFCX1NJWkU7IGkrKykgewotCQlpZiAobGlzdF9lbXB0eShwKSkgewotCQkJYi0+ZGVzdCA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocCA9PSAmc3ZjLT5kZXN0aW5hdGlvbnMpCi0JCQkJcCA9IHAtPm5leHQ7Ci0KLQkJCWRlc3QgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpcF92c19kZXN0LCBuX2xpc3QpOwotCQkJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKLQkJCWItPmRlc3QgPSBkZXN0OwotCi0JCQlwID0gcC0+bmV4dDsKLQkJfQotCQliKys7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgICAgIEZsdXNoIGFsbCB0aGUgaGFzaCBidWNrZXRzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIGlwX3ZzX2RoX2ZsdXNoKHN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICpiOwotCi0JYiA9IHRibDsKLQlmb3IgKGk9MDsgaTxJUF9WU19ESF9UQUJfU0laRTsgaSsrKSB7Ci0JCWlmIChiLT5kZXN0KSB7Ci0JCQlhdG9taWNfZGVjKCZiLT5kZXN0LT5yZWZjbnQpOwotCQkJYi0+ZGVzdCA9IE5VTEw7Ci0JCX0KLQkJYisrOwotCX0KLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX2RoX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0Jc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsOwotCi0JLyogYWxsb2NhdGUgdGhlIERIIHRhYmxlIGZvciB0aGlzIHNlcnZpY2UgKi8KLQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0KSpJUF9WU19ESF9UQUJfU0laRSwKLQkJICAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKHRibCA9PSBOVUxMKSB7Ci0JCUlQX1ZTX0VSUigiaXBfdnNfZGhfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKLQlJUF9WU19EQkcoNiwgIkRIIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgYWxsb2NhdGVkIGZvciAiCi0JCSAgImN1cnJlbnQgc2VydmljZVxuIiwKLQkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCkqSVBfVlNfREhfVEFCX1NJWkUpOwotCi0JLyogYXNzaWduIHRoZSBoYXNoIGJ1Y2tldHMgd2l0aCB0aGUgdXBkYXRlZCBzZXJ2aWNlICovCi0JaXBfdnNfZGhfYXNzaWduKHRibCwgc3ZjKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfZGhfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0YmwgPSBzdmMtPnNjaGVkX2RhdGE7Ci0KLQkvKiBnb3QgdG8gY2xlYW4gdXAgaGFzaCBidWNrZXRzIGhlcmUgKi8KLQlpcF92c19kaF9mbHVzaCh0YmwpOwotCi0JLyogcmVsZWFzZSB0aGUgdGFibGUgaXRzZWxmICovCi0Ja2ZyZWUoc3ZjLT5zY2hlZF9kYXRhKTsKLQlJUF9WU19EQkcoNiwgIkRIIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19kaF9idWNrZXQpKklQX1ZTX0RIX1RBQl9TSVpFKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfZGhfdXBkYXRlX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKLQotCS8qIGdvdCB0byBjbGVhbiB1cCBoYXNoIGJ1Y2tldHMgaGVyZSAqLwotCWlwX3ZzX2RoX2ZsdXNoKHRibCk7Ci0KLQkvKiBhc3NpZ24gdGhlIGhhc2ggYnVja2V0cyB3aXRoIHRoZSB1cGRhdGVkIHNlcnZpY2UgKi8KLQlpcF92c19kaF9hc3NpZ24odGJsLCBzdmMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqICAgICAgSWYgdGhlIGRlc3QgZmxhZ3MgaXMgc2V0IHdpdGggSVBfVlNfREVTVF9GX09WRVJMT0FELAotICogICAgICBjb25zaWRlciB0aGF0IHRoZSBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCBoZXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpc19vdmVybG9hZGVkKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQotewotCXJldHVybiBkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKLX0KLQotCi0vKgotICogICAgICBEZXN0aW5hdGlvbiBoYXNoaW5nIHNjaGVkdWxpbmcKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX2RoX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7Ci0Jc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsOwotCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KLQlJUF9WU19EQkcoNiwgImlwX3ZzX2RoX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwotCi0JdGJsID0gKHN0cnVjdCBpcF92c19kaF9idWNrZXQgKilzdmMtPnNjaGVkX2RhdGE7Ci0JZGVzdCA9IGlwX3ZzX2RoX2dldCh0YmwsIGlwaC0+ZGFkZHIpOwotCWlmICghZGVzdAotCSAgICB8fCAhKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkKLQkgICAgfHwgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPD0gMAotCSAgICB8fCBpc19vdmVybG9hZGVkKGRlc3QpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUlQX1ZTX0RCRyg2LCAiREg6IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgIgotCQkgICItLT4gc2VydmVyICV1LiV1LiV1LiV1OiVkXG4iLAotCQkgIE5JUFFVQUQoaXBoLT5kYWRkciksCi0JCSAgTklQUVVBRChkZXN0LT5hZGRyKSwKLQkJICBudG9ocyhkZXN0LT5wb3J0KSk7Ci0KLQlyZXR1cm4gZGVzdDsKLX0KLQotCi0vKgotICogICAgICBJUFZTIERIIFNjaGVkdWxlciBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfZGhfc2NoZWR1bGVyID0KLXsKLQkubmFtZSA9CQkJImRoIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19kaF9zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2RoX2luaXRfc3ZjLAotCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfZGhfZG9uZV9zdmMsCi0JLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfZGhfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfZGhfc2NoZWR1bGUsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2RoX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19kaF9zY2hlZHVsZXIpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19kaF9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2RoX3NjaGVkdWxlcik7Ci19Ci0KLQotbW9kdWxlX2luaXQoaXBfdnNfZGhfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c19kaF9jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZXN0LmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2VzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTIwZjkzLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIGlwX3ZzX2VzdC5jOiBzaW1wbGUgcmF0ZSBlc3RpbWF0b3IgZm9yIElQVlMKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0vKgotICBUaGlzIGNvZGUgaXMgdG8gZXN0aW1hdGUgcmF0ZSBpbiBhIHNob3J0ZXIgaW50ZXJ2YWwgKHN1Y2ggYXMgOAotICBzZWNvbmRzKSBmb3IgdmlydHVhbCBzZXJ2aWNlcyBhbmQgcmVhbCBzZXJ2ZXJzLiBGb3IgbWVhc3VyZSByYXRlIGluIGEKLSAgbG9uZyBpbnRlcnZhbCwgaXQgaXMgZWFzeSB0byBpbXBsZW1lbnQgYSB1c2VyIGxldmVsIGRhZW1vbiB3aGljaAotICBwZXJpb2RpY2FsbHkgcmVhZHMgdGhvc2Ugc3RhdGlzdGljYWwgY291bnRlcnMgYW5kIG1lYXN1cmUgcmF0ZS4KLQotICBDdXJyZW50bHksIHRoZSBtZWFzdXJlbWVudCBpcyBhY3RpdmF0ZWQgYnkgc2xvdyB0aW1lciBoYW5kbGVyLiBIb3BlCi0gIHRoaXMgbWVhc3VyZW1lbnQgd2lsbCBub3QgaW50cm9kdWNlIHRvbyBtdWNoIGxvYWQuCi0KLSAgV2UgbWVhc3VyZSByYXRlIGR1cmluZyB0aGUgbGFzdCA4IHNlY29uZHMgZXZlcnkgMiBzZWNvbmRzOgotCi0gICAgYXZncmF0ZSA9IGF2Z3JhdGUqKDEtVykgKyByYXRlKlcKLQotICAgIHdoZXJlIFcgPSAyXigtMikKLQotICBOT1RFUy4KLQotICAqIFRoZSBzdG9yZWQgdmFsdWUgZm9yIGF2ZXJhZ2UgYnBzIGlzIHNjYWxlZCBieSAyXjUsIHNvIHRoYXQgbWF4aW1hbAotICAgIHJhdGUgaXMgfjIuMTVHYml0cy9zLCBhdmVyYWdlIHBwcyBhbmQgY3BzIGFyZSBzY2FsZWQgYnkgMl4xMC4KLQotICAqIEEgbG90IGNvZGUgaXMgdGFrZW4gZnJvbSBuZXQvc2NoZWQvZXN0aW1hdG9yLmMKLSAqLwotCi0KLXN0YXRpYyB2b2lkIGVzdGltYXRpb25fdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOwotCi1zdGF0aWMgTElTVF9IRUFEKGVzdF9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXN0X2xvY2spOwotc3RhdGljIERFRklORV9USU1FUihlc3RfdGltZXIsIGVzdGltYXRpb25fdGltZXIsIDAsIDApOwotCi1zdGF0aWMgdm9pZCBlc3RpbWF0aW9uX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpcF92c19lc3RpbWF0b3IgKmU7Ci0Jc3RydWN0IGlwX3ZzX3N0YXRzICpzOwotCXUzMiBuX2Nvbm5zOwotCXUzMiBuX2lucGt0cywgbl9vdXRwa3RzOwotCXU2NCBuX2luYnl0ZXMsIG5fb3V0Ynl0ZXM7Ci0JdTMyIHJhdGU7Ci0KLQlzcGluX2xvY2soJmVzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZlc3RfbGlzdCwgbGlzdCkgewotCQlzID0gY29udGFpbmVyX29mKGUsIHN0cnVjdCBpcF92c19zdGF0cywgZXN0KTsKLQotCQlzcGluX2xvY2soJnMtPmxvY2spOwotCQluX2Nvbm5zID0gcy0+Y29ubnM7Ci0JCW5faW5wa3RzID0gcy0+aW5wa3RzOwotCQluX291dHBrdHMgPSBzLT5vdXRwa3RzOwotCQluX2luYnl0ZXMgPSBzLT5pbmJ5dGVzOwotCQluX291dGJ5dGVzID0gcy0+b3V0Ynl0ZXM7Ci0KLQkJLyogc2NhbGVkIGJ5IDJeMTAsIGJ1dCBkaXZpZGVkIDIgc2Vjb25kcyAqLwotCQlyYXRlID0gKG5fY29ubnMgLSBlLT5sYXN0X2Nvbm5zKTw8OTsKLQkJZS0+bGFzdF9jb25ucyA9IG5fY29ubnM7Ci0JCWUtPmNwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmNwcyk+PjI7Ci0JCXMtPmNwcyA9IChlLT5jcHMrMHgxRkYpPj4xMDsKLQotCQlyYXRlID0gKG5faW5wa3RzIC0gZS0+bGFzdF9pbnBrdHMpPDw5OwotCQllLT5sYXN0X2lucGt0cyA9IG5faW5wa3RzOwotCQllLT5pbnBwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmlucHBzKT4+MjsKLQkJcy0+aW5wcHMgPSAoZS0+aW5wcHMrMHgxRkYpPj4xMDsKLQotCQlyYXRlID0gKG5fb3V0cGt0cyAtIGUtPmxhc3Rfb3V0cGt0cyk8PDk7Ci0JCWUtPmxhc3Rfb3V0cGt0cyA9IG5fb3V0cGt0czsKLQkJZS0+b3V0cHBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+b3V0cHBzKT4+MjsKLQkJcy0+b3V0cHBzID0gKGUtPm91dHBwcysweDFGRik+PjEwOwotCi0JCXJhdGUgPSAobl9pbmJ5dGVzIC0gZS0+bGFzdF9pbmJ5dGVzKTw8NDsKLQkJZS0+bGFzdF9pbmJ5dGVzID0gbl9pbmJ5dGVzOwotCQllLT5pbmJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmluYnBzKT4+MjsKLQkJcy0+aW5icHMgPSAoZS0+aW5icHMrMHhGKT4+NTsKLQotCQlyYXRlID0gKG5fb3V0Ynl0ZXMgLSBlLT5sYXN0X291dGJ5dGVzKTw8NDsKLQkJZS0+bGFzdF9vdXRieXRlcyA9IG5fb3V0Ynl0ZXM7Ci0JCWUtPm91dGJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPm91dGJwcyk+PjI7Ci0JCXMtPm91dGJwcyA9IChlLT5vdXRicHMrMHhGKT4+NTsKLQkJc3Bpbl91bmxvY2soJnMtPmxvY2spOwotCX0KLQlzcGluX3VubG9jaygmZXN0X2xvY2spOwotCW1vZF90aW1lcigmZXN0X3RpbWVyLCBqaWZmaWVzICsgMipIWik7Ci19Ci0KLXZvaWQgaXBfdnNfbmV3X2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQotewotCXN0cnVjdCBpcF92c19lc3RpbWF0b3IgKmVzdCA9ICZzdGF0cy0+ZXN0OwotCi0JSU5JVF9MSVNUX0hFQUQoJmVzdC0+bGlzdCk7Ci0KLQllc3QtPmxhc3RfY29ubnMgPSBzdGF0cy0+Y29ubnM7Ci0JZXN0LT5jcHMgPSBzdGF0cy0+Y3BzPDwxMDsKLQotCWVzdC0+bGFzdF9pbnBrdHMgPSBzdGF0cy0+aW5wa3RzOwotCWVzdC0+aW5wcHMgPSBzdGF0cy0+aW5wcHM8PDEwOwotCi0JZXN0LT5sYXN0X291dHBrdHMgPSBzdGF0cy0+b3V0cGt0czsKLQllc3QtPm91dHBwcyA9IHN0YXRzLT5vdXRwcHM8PDEwOwotCi0JZXN0LT5sYXN0X2luYnl0ZXMgPSBzdGF0cy0+aW5ieXRlczsKLQllc3QtPmluYnBzID0gc3RhdHMtPmluYnBzPDw1OwotCi0JZXN0LT5sYXN0X291dGJ5dGVzID0gc3RhdHMtPm91dGJ5dGVzOwotCWVzdC0+b3V0YnBzID0gc3RhdHMtPm91dGJwczw8NTsKLQotCXNwaW5fbG9ja19iaCgmZXN0X2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZlc3RfbGlzdCkpCi0JCW1vZF90aW1lcigmZXN0X3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKLQlsaXN0X2FkZCgmZXN0LT5saXN0LCAmZXN0X2xpc3QpOwotCXNwaW5fdW5sb2NrX2JoKCZlc3RfbG9jayk7Ci19Ci0KLXZvaWQgaXBfdnNfa2lsbF9lc3RpbWF0b3Ioc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cykKLXsKLQlzdHJ1Y3QgaXBfdnNfZXN0aW1hdG9yICplc3QgPSAmc3RhdHMtPmVzdDsKLQotCXNwaW5fbG9ja19iaCgmZXN0X2xvY2spOwotCWxpc3RfZGVsKCZlc3QtPmxpc3QpOwotCXdoaWxlIChsaXN0X2VtcHR5KCZlc3RfbGlzdCkgJiYgdHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZlc3RfdGltZXIpIDwgMCkgewotCQlzcGluX3VubG9ja19iaCgmZXN0X2xvY2spOwotCQljcHVfcmVsYXgoKTsKLQkJc3Bpbl9sb2NrX2JoKCZlc3RfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZlc3RfbG9jayk7Ci19Ci0KLXZvaWQgaXBfdnNfemVyb19lc3RpbWF0b3Ioc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cykKLXsKLQlzdHJ1Y3QgaXBfdnNfZXN0aW1hdG9yICplc3QgPSAmc3RhdHMtPmVzdDsKLQotCS8qIHNldCBjb3VudGVycyB6ZXJvLCBjYWxsZXIgbXVzdCBob2xkIHRoZSBzdGF0cy0+bG9jayBsb2NrICovCi0JZXN0LT5sYXN0X2luYnl0ZXMgPSAwOwotCWVzdC0+bGFzdF9vdXRieXRlcyA9IDA7Ci0JZXN0LT5sYXN0X2Nvbm5zID0gMDsKLQllc3QtPmxhc3RfaW5wa3RzID0gMDsKLQllc3QtPmxhc3Rfb3V0cGt0cyA9IDA7Ci0JZXN0LT5jcHMgPSAwOwotCWVzdC0+aW5wcHMgPSAwOwotCWVzdC0+b3V0cHBzID0gMDsKLQllc3QtPmluYnBzID0gMDsKLQllc3QtPm91dGJwcyA9IDA7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjNzU4ZS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qCi0gKiBpcF92c19mdHAuYzogSVBWUyBmdHAgYXBwbGljYXRpb24gbW9kdWxlCi0gKgotICogQXV0aG9yczoJV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICoKLSAqIENoYW5nZXM6Ci0gKgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogTW9zdCBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbSBpcF9tYXNxX2Z0cC5jIGluIGtlcm5lbCAyLjIuIFRoZSBkaWZmZXJlbmNlCi0gKiBpcyB0aGF0IGlwX3ZzX2Z0cCBtb2R1bGUgaGFuZGxlcyB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gdG8gaXBfbWFzcV9mdHAuCi0gKgotICoJCUlQX01BU1FfRlRQIGZ0cCBtYXNxdWVyYWRpbmcgbW9kdWxlCi0gKgotICogVmVyc2lvbjoJQCgjKWlwX21hc3FfZnRwLmMgMC4wNCAgIDAyLzA1Lzk2Ci0gKgotICogQXV0aG9yOglXb3V0ZXIgR2FkZXluZQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLSNkZWZpbmUgU0VSVkVSX1NUUklORyAiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoIgotI2RlZmluZSBDTElFTlRfU1RSSU5HICJQT1JUICIKLQotCi0vKgotICogTGlzdCBvZiBwb3J0cyAodXAgdG8gSVBfVlNfQVBQX01BWF9QT1JUUykgdG8gYmUgaGFuZGxlZCBieSBoZWxwZXIKLSAqIEZpcnN0IHBvcnQgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHBvcnQuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tJUF9WU19BUFBfTUFYX1BPUlRTXSA9IHsyMSwgMH07Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnRzLCAiUG9ydHMgdG8gbW9uaXRvciBmb3IgRlRQIGNvbnRyb2wgY29tbWFuZHMiKTsKLQotCi0vKglEdW1teSB2YXJpYWJsZSAqLwotc3RhdGljIGludCBpcF92c19mdHBfcGFzdjsKLQotCi1zdGF0aWMgaW50Ci1pcF92c19mdHBfaW5pdF9jb25uKHN0cnVjdCBpcF92c19hcHAgKmFwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWlwX3ZzX2Z0cF9kb25lX2Nvbm4oc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIEdldCA8YWRkcixwb3J0PiBmcm9tIHRoZSBzdHJpbmcgInh4eC54eHgueHh4Lnh4eCxwcHAscHBwIiwgc3RhcnRlZAotICogd2l0aCB0aGUgInBhdHRlcm4iIGFuZCB0ZXJtaW5hdGVkIHdpdGggdGhlICJ0ZXJtIiBjaGFyYWN0ZXIuCi0gKiA8YWRkcixwb3J0PiBpcyBpbiBuZXR3b3JrIG9yZGVyLgotICovCi1zdGF0aWMgaW50IGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoY2hhciAqZGF0YSwgY2hhciAqZGF0YV9saW1pdCwKLQkJCQkgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHNpemVfdCBwbGVuLCBjaGFyIHRlcm0sCi0JCQkJICBfX2JlMzIgKmFkZHIsIF9fYmUxNiAqcG9ydCwKLQkJCQkgIGNoYXIgKipzdGFydCwgY2hhciAqKmVuZCkKLXsKLQl1bnNpZ25lZCBjaGFyIHBbNl07Ci0JaW50IGkgPSAwOwotCi0JaWYgKGRhdGFfbGltaXQgLSBkYXRhIDwgcGxlbikgewotCQkvKiBjaGVjayBpZiB0aGVyZSBpcyBwYXJ0aWFsIG1hdGNoICovCi0JCWlmIChzdHJuaWNtcChkYXRhLCBwYXR0ZXJuLCBkYXRhX2xpbWl0IC0gZGF0YSkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIHBsZW4pICE9IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCSpzdGFydCA9IGRhdGEgKyBwbGVuOwotCi0JZm9yIChkYXRhID0gKnN0YXJ0OyAqZGF0YSAhPSB0ZXJtOyBkYXRhKyspIHsKLQkJaWYgKGRhdGEgPT0gZGF0YV9saW1pdCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JKmVuZCA9IGRhdGE7Ci0KLQltZW1zZXQocCwgMCwgc2l6ZW9mKHApKTsKLQlmb3IgKGRhdGEgPSAqc3RhcnQ7IGRhdGEgIT0gKmVuZDsgZGF0YSsrKSB7Ci0JCWlmICgqZGF0YSA+PSAnMCcgJiYgKmRhdGEgPD0gJzknKSB7Ci0JCQlwW2ldID0gcFtpXSoxMCArICpkYXRhIC0gJzAnOwotCQl9IGVsc2UgaWYgKCpkYXRhID09ICcsJyAmJiBpIDwgNSkgewotCQkJaSsrOwotCQl9IGVsc2UgewotCQkJLyogdW5leHBlY3RlZCBjaGFyYWN0ZXIgKi8KLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWlmIChpICE9IDUpCi0JCXJldHVybiAtMTsKLQotCSphZGRyID0gZ2V0X3VuYWxpZ25lZCgoX19iZTMyICopcCk7Ci0JKnBvcnQgPSBnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikocCArIDQpKTsKLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogTG9vayBhdCBvdXRnb2luZyBmdHAgcGFja2V0cyB0byBjYXRjaCB0aGUgcmVzcG9uc2UgdG8gYSBQQVNWIGNvbW1hbmQKLSAqIGZyb20gdGhlIHNlcnZlciAoaW5zaWRlLXRvLW91dHNpZGUpLgotICogV2hlbiB3ZSBzZWUgb25lLCB3ZSBidWlsZCBhIGNvbm5lY3Rpb24gZW50cnkgd2l0aCB0aGUgY2xpZW50IGFkZHJlc3MsCi0gKiBjbGllbnQgcG9ydCAwICh1bmtub3duIGF0IHRoZSBtb21lbnQpLCB0aGUgc2VydmVyIGFkZHJlc3MgYW5kIHRoZQotICogc2VydmVyIHBvcnQuICBNYXJrIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gZW50cnkgYXMgYSBjb250cm9sIGNoYW5uZWwKLSAqIG9mIHRoZSBuZXcgZW50cnkuIEFsbCB0aGlzIHdvcmsgaXMganVzdCB0byBtYWtlIHRoZSBkYXRhIGNvbm5lY3Rpb24KLSAqIGNhbiBiZSBzY2hlZHVsZWQgdG8gdGhlIHJpZ2h0IHNlcnZlciBsYXRlci4KLSAqCi0gKiBUaGUgb3V0Z29pbmcgcGFja2V0IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZQotICogICAiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoeHh4LHh4eCx4eHgseHh4LHBwcCxwcHApIi4KLSAqIHh4eCx4eHgseHh4LHh4eCBpcyB0aGUgc2VydmVyIGFkZHJlc3MsIHBwcCxwcHAgaXMgdGhlIHNlcnZlciBwb3J0IG51bWJlci4KLSAqLwotc3RhdGljIGludCBpcF92c19mdHBfb3V0KHN0cnVjdCBpcF92c19hcHAgKmFwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCQkJIHN0cnVjdCBza19idWZmICpza2IsIGludCAqZGlmZikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlzdHJ1Y3QgdGNwaGRyICp0aDsKLQljaGFyICpkYXRhLCAqZGF0YV9saW1pdDsKLQljaGFyICpzdGFydCwgKmVuZDsKLQlfX2JlMzIgZnJvbTsKLQlfX2JlMTYgcG9ydDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqbl9jcDsKLQljaGFyIGJ1ZlsyNF07CQkvKiB4eHgueHh4Lnh4eC54eHgscHBwLHBwcFwwMDAgKi8KLQl1bnNpZ25lZCBidWZfbGVuOwotCWludCByZXQ7Ci0KLQkqZGlmZiA9IDA7Ci0KLQkvKiBPbmx5IHVzZWZ1bCBmb3IgZXN0YWJsaXNoZWQgc2Vzc2lvbnMgKi8KLQlpZiAoY3AtPnN0YXRlICE9IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKQotCQlyZXR1cm4gMTsKLQotCS8qIExpbmVhciBwYWNrZXRzIGFyZSBtdWNoIGVhc2llciB0byBkZWFsIHdpdGguICovCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHNrYi0+bGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY3AtPmFwcF9kYXRhID09ICZpcF92c19mdHBfcGFzdikgewotCQlpcGggPSBpcF9oZHIoc2tiKTsKLQkJdGggPSAoc3RydWN0IHRjcGhkciAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7Ci0JCWRhdGEgPSAoY2hhciAqKXRoICsgKHRoLT5kb2ZmIDw8IDIpOwotCQlkYXRhX2xpbWl0ID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwotCi0JCWlmIChpcF92c19mdHBfZ2V0X2FkZHJwb3J0KGRhdGEsIGRhdGFfbGltaXQsCi0JCQkJCSAgIFNFUlZFUl9TVFJJTkcsCi0JCQkJCSAgIHNpemVvZihTRVJWRVJfU1RSSU5HKS0xLCAnKScsCi0JCQkJCSAgICZmcm9tLCAmcG9ydCwKLQkJCQkJICAgJnN0YXJ0LCAmZW5kKSAhPSAxKQotCQkJcmV0dXJuIDE7Ci0KLQkJSVBfVlNfREJHKDcsICJQQVNWIHJlc3BvbnNlICgldS4ldS4ldS4ldTolZCkgLT4gIgotCQkJICAiJXUuJXUuJXUuJXU6JWQgZGV0ZWN0ZWRcbiIsCi0JCQkgIE5JUFFVQUQoZnJvbSksIG50b2hzKHBvcnQpLCBOSVBRVUFEKGNwLT5jYWRkciksIDApOwotCi0JCS8qCi0JCSAqIE5vdyB1cGRhdGUgb3IgY3JlYXRlIGFuIGNvbm5lY3Rpb24gZW50cnkgZm9yIGl0Ci0JCSAqLwotCQluX2NwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsIGZyb20sIHBvcnQsCi0JCQkJCSAgY3AtPmNhZGRyLCAwKTsKLQkJaWYgKCFuX2NwKSB7Ci0JCQluX2NwID0gaXBfdnNfY29ubl9uZXcoSVBQUk9UT19UQ1AsCi0JCQkJCSAgICAgIGNwLT5jYWRkciwgMCwKLQkJCQkJICAgICAgY3AtPnZhZGRyLCBwb3J0LAotCQkJCQkgICAgICBmcm9tLCBwb3J0LAotCQkJCQkgICAgICBJUF9WU19DT05OX0ZfTk9fQ1BPUlQsCi0JCQkJCSAgICAgIGNwLT5kZXN0KTsKLQkJCWlmICghbl9jcCkKLQkJCQlyZXR1cm4gMDsKLQotCQkJLyogYWRkIGl0cyBjb250cm9sbGVyICovCi0JCQlpcF92c19jb250cm9sX2FkZChuX2NwLCBjcCk7Ci0JCX0KLQotCQkvKgotCQkgKiBSZXBsYWNlIHRoZSBvbGQgcGFzc2l2ZSBhZGRyZXNzIHdpdGggdGhlIG5ldyBvbmUKLQkJICovCi0JCWZyb20gPSBuX2NwLT52YWRkcjsKLQkJcG9ydCA9IG5fY3AtPnZwb3J0OwotCQlzcHJpbnRmKGJ1ZiwiJWQsJWQsJWQsJWQsJWQsJWQiLCBOSVBRVUFEKGZyb20pLAotCQkJKG50b2hzKHBvcnQpPj44KSYyNTUsIG50b2hzKHBvcnQpJjI1NSk7Ci0JCWJ1Zl9sZW4gPSBzdHJsZW4oYnVmKTsKLQotCQkvKgotCQkgKiBDYWxjdWxhdGUgcmVxdWlyZWQgZGVsdGEtb2Zmc2V0IHRvIGtlZXAgVENQIGhhcHB5Ci0JCSAqLwotCQkqZGlmZiA9IGJ1Zl9sZW4gLSAoZW5kLXN0YXJ0KTsKLQotCQlpZiAoKmRpZmYgPT0gMCkgewotCQkJLyogc2ltcGx5IHJlcGxhY2UgaXQgd2l0aCBuZXcgcGFzc2l2ZSBhZGRyZXNzICovCi0JCQltZW1jcHkoc3RhcnQsIGJ1ZiwgYnVmX2xlbik7Ci0JCQlyZXQgPSAxOwotCQl9IGVsc2UgewotCQkJcmV0ID0gIWlwX3ZzX3NrYl9yZXBsYWNlKHNrYiwgR0ZQX0FUT01JQywgc3RhcnQsCi0JCQkJCSAgZW5kLXN0YXJ0LCBidWYsIGJ1Zl9sZW4pOwotCQl9Ci0KLQkJY3AtPmFwcF9kYXRhID0gTlVMTDsKLQkJaXBfdnNfdGNwX2Nvbm5fbGlzdGVuKG5fY3ApOwotCQlpcF92c19jb25uX3B1dChuX2NwKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqIExvb2sgYXQgaW5jb21pbmcgZnRwIHBhY2tldHMgdG8gY2F0Y2ggdGhlIFBBU1YvUE9SVCBjb21tYW5kCi0gKiAob3V0c2lkZS10by1pbnNpZGUpLgotICoKLSAqIFRoZSBpbmNvbWluZyBwYWNrZXQgaGF2aW5nIHRoZSBQT1JUIGNvbW1hbmQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCi0gKiAgICAgICJQT1JUIHh4eCx4eHgseHh4LHh4eCxwcHAscHBwXG4iLgotICogeHh4LHh4eCx4eHgseHh4IGlzIHRoZSBjbGllbnQgYWRkcmVzcywgcHBwLHBwcCBpcyB0aGUgY2xpZW50IHBvcnQgbnVtYmVyLgotICogSW4gdGhpcyBjYXNlLCB3ZSBjcmVhdGUgYSBjb25uZWN0aW9uIGVudHJ5IHVzaW5nIHRoZSBjbGllbnQgYWRkcmVzcyBhbmQKLSAqIHBvcnQsIHNvIHRoYXQgdGhlIGFjdGl2ZSBmdHAgZGF0YSBjb25uZWN0aW9uIGZyb20gdGhlIHNlcnZlciBjYW4gcmVhY2gKLSAqIHRoZSBjbGllbnQuCi0gKi8KLXN0YXRpYyBpbnQgaXBfdnNfZnRwX2luKHN0cnVjdCBpcF92c19hcHAgKmFwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpkaWZmKQotewotCXN0cnVjdCBpcGhkciAqaXBoOwotCXN0cnVjdCB0Y3BoZHIgKnRoOwotCWNoYXIgKmRhdGEsICpkYXRhX3N0YXJ0LCAqZGF0YV9saW1pdDsKLQljaGFyICpzdGFydCwgKmVuZDsKLQlfX2JlMzIgdG87Ci0JX19iZTE2IHBvcnQ7Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKm5fY3A7Ci0KLQkvKiBubyBkaWZmIHJlcXVpcmVkIGZvciBpbmNvbWluZyBwYWNrZXRzICovCi0JKmRpZmYgPSAwOwotCi0JLyogT25seSB1c2VmdWwgZm9yIGVzdGFibGlzaGVkIHNlc3Npb25zICovCi0JaWYgKGNwLT5zdGF0ZSAhPSBJUF9WU19UQ1BfU19FU1RBQkxJU0hFRCkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBMaW5lYXIgcGFja2V0cyBhcmUgbXVjaCBlYXNpZXIgdG8gZGVhbCB3aXRoLiAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCBza2ItPmxlbikpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBEZXRlY3Rpbmcgd2hldGhlciBpdCBpcyBwYXNzaXZlCi0JICovCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JdGggPSAoc3RydWN0IHRjcGhkciAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7Ci0KLQkvKiBTaW5jZSB0aGVyZSBtYXkgYmUgT1BUSU9OUyBpbiB0aGUgVENQIHBhY2tldCBhbmQgdGhlIEhMRU4gaXMKLQkgICB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgaW4gMzItYml0IG11bHRpcGxlcywgaXQgaXMgYWNjdXJhdGUKLQkgICB0byBjYWxjdWxhdGUgZGF0YSBhZGRyZXNzIGJ5IHRoK0hMRU4qNCAqLwotCWRhdGEgPSBkYXRhX3N0YXJ0ID0gKGNoYXIgKil0aCArICh0aC0+ZG9mZiA8PCAyKTsKLQlkYXRhX2xpbWl0ID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwotCi0Jd2hpbGUgKGRhdGEgPD0gZGF0YV9saW1pdCAtIDYpIHsKLQkJaWYgKHN0cm5pY21wKGRhdGEsICJQQVNWXHJcbiIsIDYpID09IDApIHsKLQkJCS8qIFBhc3NpdmUgbW9kZSBvbiAqLwotCQkJSVBfVlNfREJHKDcsICJnb3QgUEFTViBhdCAldGQgb2YgJXRkXG4iLAotCQkJCSAgZGF0YSAtIGRhdGFfc3RhcnQsCi0JCQkJICBkYXRhX2xpbWl0IC0gZGF0YV9zdGFydCk7Ci0JCQljcC0+YXBwX2RhdGEgPSAmaXBfdnNfZnRwX3Bhc3Y7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlkYXRhKys7Ci0JfQotCi0JLyoKLQkgKiBUbyBzdXBwb3J0IHZpcnR1YWwgRlRQIHNlcnZlciwgdGhlIHNjZW5lcmlvIGlzIGFzIGZvbGxvd3M6Ci0JICogICAgICAgRlRQIGNsaWVudCAtLS0tPiBMb2FkIEJhbGFuY2VyIC0tLS0+IEZUUCBzZXJ2ZXIKLQkgKiBGaXJzdCBkZXRlY3QgdGhlIHBvcnQgbnVtYmVyIGluIHRoZSBhcHBsaWNhdGlvbiBkYXRhLAotCSAqIHRoZW4gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gZW50cnkgZm9yIHRoZSBjb21pbmcgZGF0YQotCSAqIGNvbm5lY3Rpb24uCi0JICovCi0JaWYgKGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoZGF0YV9zdGFydCwgZGF0YV9saW1pdCwKLQkJCQkgICBDTElFTlRfU1RSSU5HLCBzaXplb2YoQ0xJRU5UX1NUUklORyktMSwKLQkJCQkgICAnXHInLCAmdG8sICZwb3J0LAotCQkJCSAgICZzdGFydCwgJmVuZCkgIT0gMSkKLQkJcmV0dXJuIDE7Ci0KLQlJUF9WU19EQkcoNywgIlBPUlQgJXUuJXUuJXUuJXU6JWQgZGV0ZWN0ZWRcbiIsCi0JCSAgTklQUVVBRCh0byksIG50b2hzKHBvcnQpKTsKLQotCS8qIFBhc3NpdmUgbW9kZSBvZmYgKi8KLQljcC0+YXBwX2RhdGEgPSBOVUxMOwotCi0JLyoKLQkgKiBOb3cgdXBkYXRlIG9yIGNyZWF0ZSBhIGNvbm5lY3Rpb24gZW50cnkgZm9yIGl0Ci0JICovCi0JSVBfVlNfREJHKDcsICJwcm90b2NvbCAlcyAldS4ldS4ldS4ldTolZCAldS4ldS4ldS4ldTolZFxuIiwKLQkJICBpcF92c19wcm90b19uYW1lKGlwaC0+cHJvdG9jb2wpLAotCQkgIE5JUFFVQUQodG8pLCBudG9ocyhwb3J0KSwgTklQUVVBRChjcC0+dmFkZHIpLCAwKTsKLQotCW5fY3AgPSBpcF92c19jb25uX2luX2dldChpcGgtPnByb3RvY29sLAotCQkJCSB0bywgcG9ydCwKLQkJCQkgY3AtPnZhZGRyLCBodG9ucyhudG9ocyhjcC0+dnBvcnQpLTEpKTsKLQlpZiAoIW5fY3ApIHsKLQkJbl9jcCA9IGlwX3ZzX2Nvbm5fbmV3KElQUFJPVE9fVENQLAotCQkJCSAgICAgIHRvLCBwb3J0LAotCQkJCSAgICAgIGNwLT52YWRkciwgaHRvbnMobnRvaHMoY3AtPnZwb3J0KS0xKSwKLQkJCQkgICAgICBjcC0+ZGFkZHIsIGh0b25zKG50b2hzKGNwLT5kcG9ydCktMSksCi0JCQkJICAgICAgMCwKLQkJCQkgICAgICBjcC0+ZGVzdCk7Ci0JCWlmICghbl9jcCkKLQkJCXJldHVybiAwOwotCi0JCS8qIGFkZCBpdHMgY29udHJvbGxlciAqLwotCQlpcF92c19jb250cm9sX2FkZChuX2NwLCBjcCk7Ci0JfQotCi0JLyoKLQkgKglNb3ZlIHR1bm5lbCB0byBsaXN0ZW4gc3RhdGUKLQkgKi8KLQlpcF92c190Y3BfY29ubl9saXN0ZW4obl9jcCk7Ci0JaXBfdnNfY29ubl9wdXQobl9jcCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2FwcCBpcF92c19mdHAgPSB7Ci0JLm5hbWUgPQkJImZ0cCIsCi0JLnR5cGUgPQkJSVBfVlNfQVBQX1RZUEVfRlRQLAotCS5wcm90b2NvbCA9CUlQUFJPVE9fVENQLAotCS5tb2R1bGUgPQlUSElTX01PRFVMRSwKLQkuaW5jc19saXN0ID0JTElTVF9IRUFEX0lOSVQoaXBfdnNfZnRwLmluY3NfbGlzdCksCi0JLmluaXRfY29ubiA9CWlwX3ZzX2Z0cF9pbml0X2Nvbm4sCi0JLmRvbmVfY29ubiA9CWlwX3ZzX2Z0cF9kb25lX2Nvbm4sCi0JLmJpbmRfY29ubiA9CU5VTEwsCi0JLnVuYmluZF9jb25uID0JTlVMTCwKLQkucGt0X291dCA9CWlwX3ZzX2Z0cF9vdXQsCi0JLnBrdF9pbiA9CWlwX3ZzX2Z0cF9pbiwKLX07Ci0KLQotLyoKLSAqCWlwX3ZzX2Z0cCBpbml0aWFsaXphdGlvbgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpcF92c19mdHBfaW5pdCh2b2lkKQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IGlwX3ZzX2FwcCAqYXBwID0gJmlwX3ZzX2Z0cDsKLQotCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX2FwcChhcHApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlmb3IgKGk9MDsgaTxJUF9WU19BUFBfTUFYX1BPUlRTOyBpKyspIHsKLQkJaWYgKCFwb3J0c1tpXSkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSByZWdpc3Rlcl9pcF92c19hcHBfaW5jKGFwcCwgYXBwLT5wcm90b2NvbCwgcG9ydHNbaV0pOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JCUlQX1ZTX0lORk8oIiVzOiBsb2FkZWQgc3VwcG9ydCBvbiBwb3J0WyVkXSA9ICVkXG4iLAotCQkJICAgYXBwLT5uYW1lLCBpLCBwb3J0c1tpXSk7Ci0JfQotCi0JaWYgKHJldCkKLQkJdW5yZWdpc3Rlcl9pcF92c19hcHAoYXBwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqCWlwX3ZzX2Z0cCBmaW5pc2guCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19mdHBfZXhpdCh2b2lkKQotewotCXVucmVnaXN0ZXJfaXBfdnNfYXBwKCZpcF92c19mdHApOwotfQotCi0KLW1vZHVsZV9pbml0KGlwX3ZzX2Z0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX3ZzX2Z0cF9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsYy5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNmEzMTkuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzEgKzAsMCBAQAotLyoKLSAqIElQVlM6ICAgICAgICBMb2NhbGl0eS1CYXNlZCBMZWFzdC1Db25uZWN0aW9uIHNjaGVkdWxpbmcgbW9kdWxlCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKiAgICAgTWFydGluIEhhbWlsdG9uICAgICAgICAgOiAgICBmaXhlZCB0aGUgdGVycmlibGUgbG9ja2luZyBidWdzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvY2sodGJsLT5sb2NrKSA9PT4gKmxvY2soJnRibC0+bG9jaykKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICA6ICAgIGZpeGVkIHRoZSB1bmluaXRpbGl6ZWQgdGJsLT5sb2NrIGJ1ZwotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgIDogICAgYWRkZWQgZG9pbmcgZnVsbCBleHBpcmF0aW9uIGNoZWNrIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCBzdGFsZSBlbnRyaWVzIG9mIDI0KyBob3VycyB3aGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gcGFydGlhbCBleHBpcmUgY2hlY2sgaW4gYSBoYWxmIGhvdXIKLSAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICA6ICAgIHJlcGxhY2VkIGRlbF90aW1lciBjYWxsIHdpdGggZGVsX3RpbWVyX3N5bmMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcG9zc2libGUgcmFjZSBiZXR3ZWVuIHRpbWVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBhbmQgZGVsX3RpbWVyIHRocmVhZCBpbiBTTVAKLSAqCi0gKi8KLQotLyoKLSAqIFRoZSBsYmxjIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzIChwc2V1ZG8gY29kZSk6Ci0gKgotICogICAgICAgaWYgY2FjaGVub2RlW2Rlc3RfaXBdIGlzIG51bGwgdGhlbgotICogICAgICAgICAgICAgICBuLCBjYWNoZW5vZGVbZGVzdF9pcF0gPC0ge3dlaWdodGVkIGxlYXN0LWNvbm4gbm9kZX07Ci0gKiAgICAgICBlbHNlCi0gKiAgICAgICAgICAgICAgIG4gPC0gY2FjaGVub2RlW2Rlc3RfaXBdOwotICogICAgICAgICAgICAgICBpZiAobiBpcyBkZWFkKSBPUgotICogICAgICAgICAgICAgICAgICAobi5jb25ucz5uLndlaWdodCBBTkQKLSAqICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgbm9kZSBtIHdpdGggbS5jb25uczxtLndlaWdodC8yKSB0aGVuCi0gKiAgICAgICAgICAgICAgICAgbiwgY2FjaGVub2RlW2Rlc3RfaXBdIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OwotICoKLSAqICAgICAgIHJldHVybiBuOwotICoKLSAqIFRoYW5rcyBtdXN0IGdvIHRvIFdlbnpodW8gWmhhbmcgZm9yIHRhbGtpbmcgV0NDUCB0byBtZSBhbmQgcHVzaGluZwotICogbWUgdG8gd3JpdGUgdGhpcyBtb2R1bGUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0vKiBmb3Igc3lzY3RsICovCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qCi0gKiAgICBJdCBpcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHN0YWxlIElQVlMgbGJsYyBlbnRyaWVzLAotICogICAgd2hlbiB0aGUgdGFibGUgaXMgZnVsbC4KLSAqLwotI2RlZmluZSBDSEVDS19FWFBJUkVfSU5URVJWQUwgICAoNjAqSFopCi0jZGVmaW5lIEVOVFJZX1RJTUVPVVQgICAgICAgICAgICg2KjYwKkhaKQotCi0vKgotICogICAgSXQgaXMgZm9yIGZ1bGwgZXhwaXJhdGlvbiBjaGVjay4KLSAqICAgIFdoZW4gdGhlcmUgaXMgbm8gcGFydGlhbCBleHBpcmF0aW9uIGNoZWNrIChnYXJiYWdlIGNvbGxlY3Rpb24pCi0gKiAgICBpbiBhIGhhbGYgaG91ciwgZG8gYSBmdWxsIGV4cGlyYXRpb24gY2hlY2sgdG8gY29sbGVjdCBzdGFsZQotICogICAgZW50cmllcyB0aGF0IGhhdmVuJ3QgYmVlbiB0b3VjaGVkIGZvciBhIGRheS4KLSAqLwotI2RlZmluZSBDT1VOVF9GT1JfRlVMTF9FWFBJUkFUSU9OICAgMzAKLXN0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2xibGNfZXhwaXJhdGlvbiA9IDI0KjYwKjYwKkhaOwotCi0KLS8qCi0gKiAgICAgZm9yIElQVlMgbGJsYyBlbnRyeSBoYXNoIHRhYmxlCi0gKi8KLSNpZm5kZWYgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMKLSNkZWZpbmUgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMgICAgICAxMAotI2VuZGlmCi0jZGVmaW5lIElQX1ZTX0xCTENfVEFCX0JJVFMgICAgIENPTkZJR19JUF9WU19MQkxDX1RBQl9CSVRTCi0jZGVmaW5lIElQX1ZTX0xCTENfVEFCX1NJWkUgICAgICgxIDw8IElQX1ZTX0xCTENfVEFCX0JJVFMpCi0jZGVmaW5lIElQX1ZTX0xCTENfVEFCX01BU0sgICAgIChJUF9WU19MQkxDX1RBQl9TSVpFIC0gMSkKLQotCi0vKgotICogICAgICBJUFZTIGxibGMgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCi0gKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIKLSAqLwotc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7Ci0JX19iZTMyICAgICAgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGxhc3R1c2U7ICAgICAgICAvKiBsYXN0IHVzZWQgdGltZSAqLwotfTsKLQotCi0vKgotICogICAgICBJUFZTIGxibGMgaGFzaCB0YWJsZQotICovCi1zdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSB7Ci0Jcndsb2NrX3QJICAgICAgICBsb2NrOyAgICAgICAgICAgLyogbG9jayBmb3IgdGhpcyB0YWJsZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGJ1Y2tldFtJUF9WU19MQkxDX1RBQl9TSVpFXTsgIC8qIGhhc2ggYnVja2V0ICovCi0JYXRvbWljX3QgICAgICAgICAgICAgICAgZW50cmllczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemU7ICAgICAgIC8qIG1heGltdW0gc2l6ZSBvZiBlbnRyaWVzICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcGVyaW9kaWNfdGltZXI7IC8qIGNvbGxlY3Qgc3RhbGUgZW50cmllcyAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIHJvdmVyOyAgICAgICAgICAvKiByb3ZlciBmb3IgZXhwaXJlIGNoZWNrICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgY291bnRlcjsgICAgICAgIC8qIGNvdW50ZXIgZm9yIG5vIGV4cGlyZSAqLwotfTsKLQotCi0vKgotICogICAgICBJUFZTIExCTEMgc3lzY3RsIHRhYmxlCi0gKi8KLQotc3RhdGljIGN0bF90YWJsZSB2c192YXJzX3RhYmxlW10gPSB7Ci0JewotCQkucHJvY25hbWUJPSAibGJsY19leHBpcmF0aW9uIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19sYmxjX2V4cGlyYXRpb24sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7Ci0KLS8qCi0gKiAgICAgIG5ldy9mcmVlIGEgaXBfdnNfbGJsY19lbnRyeSwgd2hpY2ggaXMgYSBtYXBwaW5nIG9mIGEgZGVzdGlvbmF0aW9uCi0gKiAgICAgIElQIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKgotaXBfdnNfbGJsY19uZXcoX19iZTMyIGRhZGRyLCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW47Ci0KLQllbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjX2VudHJ5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVuID09IE5VTEwpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19sYmxjX25ldygpOiBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmZW4tPmxpc3QpOwotCWVuLT5hZGRyID0gZGFkZHI7Ci0KLQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwotCWVuLT5kZXN0ID0gZGVzdDsKLQotCXJldHVybiBlbjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfbGJsY19mcmVlKHN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbikKLXsKLQlsaXN0X2RlbCgmZW4tPmxpc3QpOwotCS8qCi0JICogV2UgZG9uJ3Qga2ZyZWUgZGVzdCBiZWNhdXNlIGl0IGlzIHJlZmVyZWQgZWl0aGVyIGJ5IGl0cyBzZXJ2aWNlCi0JICogb3IgdGhlIHRyYXNoIGRlc3QgbGlzdC4KLQkgKi8KLQlhdG9taWNfZGVjKCZlbi0+ZGVzdC0+cmVmY250KTsKLQlrZnJlZShlbik7Ci19Ci0KLQotLyoKLSAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgSVBWUyBMQkxDIGVudHJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXBfdnNfbGJsY19oYXNoa2V5KF9fYmUzMiBhZGRyKQotewotCXJldHVybiAobnRvaGwoYWRkcikqMjY1NDQzNTc2MVVMKSAmIElQX1ZTX0xCTENfVEFCX01BU0s7Ci19Ci0KLQotLyoKLSAqCUhhc2ggYW4gZW50cnkgaW4gdGhlIGlwX3ZzX2xibGNfdGFibGUuCi0gKglyZXR1cm5zIGJvb2wgc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludAotaXBfdnNfbGJsY19oYXNoKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwsIHN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbikKLXsKLQl1bnNpZ25lZCBoYXNoOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZlbi0+bGlzdCkpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19sYmxjX2hhc2goKTogcmVxdWVzdCBmb3IgYWxyZWFkeSBoYXNoZWQsICIKLQkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqCUhhc2ggYnkgZGVzdGluYXRpb24gSVAgYWRkcmVzcwotCSAqLwotCWhhc2ggPSBpcF92c19sYmxjX2hhc2hrZXkoZW4tPmFkZHIpOwotCi0Jd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKLQlsaXN0X2FkZCgmZW4tPmxpc3QsICZ0YmwtPmJ1Y2tldFtoYXNoXSk7Ci0JYXRvbWljX2luYygmdGJsLT5lbnRyaWVzKTsKLQl3cml0ZV91bmxvY2soJnRibC0+bG9jayk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi0vKgotICogIEdldCBpcF92c19sYmxjX2VudHJ5IGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICoKLWlwX3ZzX2xibGNfZ2V0KHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwsIF9fYmUzMiBhZGRyKQotewotCXVuc2lnbmVkIGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuOwotCi0JaGFzaCA9IGlwX3ZzX2xibGNfaGFzaGtleShhZGRyKTsKLQotCXJlYWRfbG9jaygmdGJsLT5sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW4sICZ0YmwtPmJ1Y2tldFtoYXNoXSwgbGlzdCkgewotCQlpZiAoZW4tPmFkZHIgPT0gYWRkcikgewotCQkJLyogSElUICovCi0JCQlyZWFkX3VubG9jaygmdGJsLT5sb2NrKTsKLQkJCXJldHVybiBlbjsKLQkJfQotCX0KLQotCXJlYWRfdW5sb2NrKCZ0YmwtPmxvY2spOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLSAqICAgICAgRmx1c2ggYWxsIHRoZSBlbnRyaWVzIG9mIHRoZSBzcGVjaWZpZWQgdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIGlwX3ZzX2xibGNfZmx1c2goc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4sICpueHQ7Ci0KLQlmb3IgKGk9MDsgaTxJUF9WU19MQkxDX1RBQl9TSVpFOyBpKyspIHsKLQkJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtpXSwgbGlzdCkgewotCQkJaXBfdnNfbGJsY19mcmVlKGVuKTsKLQkJCWF0b21pY19kZWMoJnRibC0+ZW50cmllcyk7Ci0JCX0KLQkJd3JpdGVfdW5sb2NrKCZ0YmwtPmxvY2spOwotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfbGJsY19mdWxsX2NoZWNrKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwpCi17Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCWludCBpLCBqOwotCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbiwgKm54dDsKLQotCWZvciAoaT0wLCBqPXRibC0+cm92ZXI7IGk8SVBfVlNfTEJMQ19UQUJfU0laRTsgaSsrKSB7Ci0JCWogPSAoaiArIDEpICYgSVBfVlNfTEJMQ19UQUJfTUFTSzsKLQotCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7Ci0JCQlpZiAodGltZV9iZWZvcmUobm93LAotCQkJCQllbi0+bGFzdHVzZSArIHN5c2N0bF9pcF92c19sYmxjX2V4cGlyYXRpb24pKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpcF92c19sYmxjX2ZyZWUoZW4pOwotCQkJYXRvbWljX2RlYygmdGJsLT5lbnRyaWVzKTsKLQkJfQotCQl3cml0ZV91bmxvY2soJnRibC0+bG9jayk7Ci0JfQotCXRibC0+cm92ZXIgPSBqOwotfQotCi0KLS8qCi0gKiAgICAgIFBlcmlvZGljYWwgdGltZXIgaGFuZGxlciBmb3IgSVBWUyBsYmxjIHRhYmxlCi0gKiAgICAgIEl0IGlzIHVzZWQgdG8gY29sbGVjdCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlIG51bWJlciBvZiBlbnRyaWVzCi0gKiAgICAgIGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdGFibGUuCi0gKgotICogICAgICBGaXhtZTogd2UgcHJvYmFibHkgbmVlZCBtb3JlIGNvbXBsaWNhdGVkIGFsZ29yaXRobSB0byBjb2xsZWN0Ci0gKiAgICAgICAgICAgICBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkIGZvciBhIGxvbmcgdGltZSBldmVuCi0gKiAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZQotICogICAgICAgICAgICAgb2YgdGhlIHRhYmxlLgotICogICAgICBUaGUgZnVsbCBleHBpcmF0aW9uIGNoZWNrIGlzIGZvciB0aGlzIHB1cnBvc2Ugbm93LgotICovCi1zdGF0aWMgdm9pZCBpcF92c19sYmxjX2NoZWNrX2V4cGlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibDsKLQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JaW50IGdvYWw7Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuLCAqbnh0OwotCi0JdGJsID0gKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICopZGF0YTsKLQotCWlmICgodGJsLT5jb3VudGVyICUgQ09VTlRfRk9SX0ZVTExfRVhQSVJBVElPTikgPT0gMCkgewotCQkvKiBkbyBmdWxsIGV4cGlyYXRpb24gY2hlY2sgKi8KLQkJaXBfdnNfbGJsY19mdWxsX2NoZWNrKHRibCk7Ci0JCXRibC0+Y291bnRlciA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmdGJsLT5lbnRyaWVzKSA8PSB0YmwtPm1heF9zaXplKSB7Ci0JCXRibC0+Y291bnRlcisrOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlnb2FsID0gKGF0b21pY19yZWFkKCZ0YmwtPmVudHJpZXMpIC0gdGJsLT5tYXhfc2l6ZSkqNC8zOwotCWlmIChnb2FsID4gdGJsLT5tYXhfc2l6ZS8yKQotCQlnb2FsID0gdGJsLT5tYXhfc2l6ZS8yOwotCi0JZm9yIChpPTAsIGo9dGJsLT5yb3ZlcjsgaTxJUF9WU19MQkxDX1RBQl9TSVpFOyBpKyspIHsKLQkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDX1RBQl9NQVNLOwotCi0JCXdyaXRlX2xvY2soJnRibC0+bG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbiwgbnh0LCAmdGJsLT5idWNrZXRbal0sIGxpc3QpIHsKLQkJCWlmICh0aW1lX2JlZm9yZShub3csIGVuLT5sYXN0dXNlICsgRU5UUllfVElNRU9VVCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWlwX3ZzX2xibGNfZnJlZShlbik7Ci0JCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOwotCQkJZ29hbC0tOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKLQkJaWYgKGdvYWwgPD0gMCkKLQkJCWJyZWFrOwotCX0KLQl0YmwtPnJvdmVyID0gajsKLQotICBvdXQ6Ci0JbW9kX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyLCBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTCk7Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19sYmxjX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibDsKLQotCS8qCi0JICogICAgQWxsb2NhdGUgdGhlIGlwX3ZzX2xibGNfdGFibGUgZm9yIHRoaXMgc2VydmljZQotCSAqLwotCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHRibCA9PSBOVUxMKSB7Ci0JCUlQX1ZTX0VSUigiaXBfdnNfbGJsY19pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwotCUlQX1ZTX0RCRyg2LCAiTEJMQyBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgotCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlKSk7Ci0KLQkvKgotCSAqICAgIEluaXRpYWxpemUgdGhlIGhhc2ggYnVja2V0cwotCSAqLwotCWZvciAoaT0wOyBpPElQX1ZTX0xCTENfVEFCX1NJWkU7IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmdGJsLT5idWNrZXRbaV0pOwotCX0KLQlyd2xvY2tfaW5pdCgmdGJsLT5sb2NrKTsKLQl0YmwtPm1heF9zaXplID0gSVBfVlNfTEJMQ19UQUJfU0laRSoxNjsKLQl0YmwtPnJvdmVyID0gMDsKLQl0YmwtPmNvdW50ZXIgPSAxOwotCi0JLyoKLQkgKiAgICBIb29rIHBlcmlvZGljIHRpbWVyIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24KLQkgKi8KLQlzZXR1cF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lciwgaXBfdnNfbGJsY19jaGVja19leHBpcmUsCi0JCQkodW5zaWduZWQgbG9uZyl0YmwpOwotCXRibC0+cGVyaW9kaWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrQ0hFQ0tfRVhQSVJFX0lOVEVSVkFMOwotCWFkZF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX2xibGNfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOwotCi0JLyogcmVtb3ZlIHBlcmlvZGljIHRpbWVyICovCi0JZGVsX3RpbWVyX3N5bmMoJnRibC0+cGVyaW9kaWNfdGltZXIpOwotCi0JLyogZ290IHRvIGNsZWFuIHVwIHRhYmxlIGVudHJpZXMgaGVyZSAqLwotCWlwX3ZzX2xibGNfZmx1c2godGJsKTsKLQotCS8qIHJlbGVhc2UgdGhlIHRhYmxlIGl0c2VsZiAqLwotCWtmcmVlKHN2Yy0+c2NoZWRfZGF0YSk7Ci0JSVBfVlNfREJHKDYsICJMQkxDIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX2xibGNfdXBkYXRlX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKgotX19pcF92c193bGNfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IGlwaGRyICppcGgpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdDsKLQlpbnQgbG9oLCBkb2g7Ci0KLQkvKgotCSAqIFdlIHRoaW5rIHRoZSBvdmVyaGVhZCBvZiBwcm9jZXNzaW5nIGFjdGl2ZSBjb25uZWN0aW9ucyBpcyBmaWZ0eQotCSAqIHRpbWVzIGhpZ2hlciB0aGFuIHRoYXQgb2YgaW5hY3RpdmUgY29ubmVjdGlvbnMgaW4gYXZlcmFnZS4gKFRoaXMKLQkgKiBmaWZ0eSB0aW1lcyBtaWdodCBub3QgYmUgYWNjdXJhdGUsIHdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyLikgV2UKLQkgKiB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhIHRvIGVzdGltYXRlIHRoZSBvdmVyaGVhZDoKLQkgKiAgICAgICAgICAgICAgICBkZXN0LT5hY3RpdmVjb25ucyo1MCArIGRlc3QtPmluYWN0Y29ubnMKLQkgKiBhbmQgdGhlIGxvYWQ6Ci0JICogICAgICAgICAgICAgICAgKGRlc3Qgb3ZlcmhlYWQpIC8gZGVzdC0+d2VpZ2h0Ci0JICoKLQkgKiBSZW1lbWJlciAtLSBubyBmbG9hdHMgaW4ga2VybmVsIG1vZGUhISEKLQkgKiBUaGUgY29tcGFyaXNvbiBvZiBoMSp3MiA+IGgyKncxIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBvZgotCSAqICAgICAgICAgICAgICAgIGgxL3cxID4gaDIvdzIKLQkgKiBpZiBldmVyeSB3ZWlnaHQgaXMgbGFyZ2VyIHRoYW4gemVyby4KLQkgKgotCSAqIFRoZSBzZXJ2ZXIgd2l0aCB3ZWlnaHQ9MCBpcyBxdWllc2NlZCBhbmQgd2lsbCBub3QgcmVjZWl2ZSBhbnkKLQkgKiBuZXcgY29ubmVjdGlvbi4KLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCi0JCQkJKyBhdG9taWNfcmVhZCgmbGVhc3QtPmluYWN0Y29ubnMpOwotCQkJZ290byBuZXh0c3RhZ2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqICAgIEZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIGxlYXN0IGxvYWQuCi0JICovCi0gIG5leHRzdGFnZToKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKLQkJCWNvbnRpbnVlOwotCi0JCWRvaCA9IGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgKiA1MAotCQkJKyBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7Ci0JCWlmIChsb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+Ci0JCSAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpIHsKLQkJCWxlYXN0ID0gZGVzdDsKLQkJCWxvaCA9IGRvaDsKLQkJfQotCX0KLQotCUlQX1ZTX0RCRyg2LCAiTEJMQzogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKLQkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKLQkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7Ci0KLQlyZXR1cm4gbGVhc3Q7Ci19Ci0KLQotLyoKLSAqICAgSWYgdGhpcyBkZXN0aW5hdGlvbiBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCBhbmQgdGhlcmUgaXMgYSBsZXNzIGxvYWRlZAotICogICBzZXJ2ZXIsIHRoZW4gcmV0dXJuIHRydWUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pc19vdmVybG9hZGVkKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCWlmIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpID4gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkpIHsKLQkJc3RydWN0IGlwX3ZzX2Rlc3QgKmQ7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCQkJaWYgKGF0b21pY19yZWFkKCZkLT5hY3RpdmVjb25ucykqMgotCQkJICAgIDwgYXRvbWljX3JlYWQoJmQtPndlaWdodCkpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogICAgTG9jYWxpdHktQmFzZWQgKHdlaWdodGVkKSBMZWFzdC1Db25uZWN0aW9uIHNjaGVkdWxpbmcKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX2xibGNfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsOwotCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCi0JSVBfVlNfREJHKDYsICJpcF92c19sYmxjX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwotCi0JdGJsID0gKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICopc3ZjLT5zY2hlZF9kYXRhOwotCWVuID0gaXBfdnNfbGJsY19nZXQodGJsLCBpcGgtPmRhZGRyKTsKLQlpZiAoZW4gPT0gTlVMTCkgewotCQlkZXN0ID0gX19pcF92c193bGNfc2NoZWR1bGUoc3ZjLCBpcGgpOwotCQlpZiAoZGVzdCA9PSBOVUxMKSB7Ci0JCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbiA9IGlwX3ZzX2xibGNfbmV3KGlwaC0+ZGFkZHIsIGRlc3QpOwotCQlpZiAoZW4gPT0gTlVMTCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaXBfdnNfbGJsY19oYXNoKHRibCwgZW4pOwotCX0gZWxzZSB7Ci0JCWRlc3QgPSBlbi0+ZGVzdDsKLQkJaWYgKCEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKQotCQkgICAgfHwgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPD0gMAotCQkgICAgfHwgaXNfb3ZlcmxvYWRlZChkZXN0LCBzdmMpKSB7Ci0JCQlkZXN0ID0gX19pcF92c193bGNfc2NoZWR1bGUoc3ZjLCBpcGgpOwotCQkJaWYgKGRlc3QgPT0gTlVMTCkgewotCQkJCUlQX1ZTX0RCRygxLCAibm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWF0b21pY19kZWMoJmVuLT5kZXN0LT5yZWZjbnQpOwotCQkJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKLQkJCWVuLT5kZXN0ID0gZGVzdDsKLQkJfQotCX0KLQllbi0+bGFzdHVzZSA9IGppZmZpZXM7Ci0KLQlJUF9WU19EQkcoNiwgIkxCTEM6IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgIgotCQkgICItLT4gc2VydmVyICV1LiV1LiV1LiV1OiVkXG4iLAotCQkgIE5JUFFVQUQoZW4tPmFkZHIpLAotCQkgIE5JUFFVQUQoZGVzdC0+YWRkciksCi0JCSAgbnRvaHMoZGVzdC0+cG9ydCkpOwotCi0JcmV0dXJuIGRlc3Q7Ci19Ci0KLQotLyoKLSAqICAgICAgSVBWUyBMQkxDIFNjaGVkdWxlciBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbGJsY19zY2hlZHVsZXIgPQotewotCS5uYW1lID0JCQkibGJsYyIsCi0JLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKLQkubW9kdWxlID0JCVRISVNfTU9EVUxFLAotCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfbGJsY19zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2xibGNfaW5pdF9zdmMsCi0JLmRvbmVfc2VydmljZSA9CQlpcF92c19sYmxjX2RvbmVfc3ZjLAotCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX2xibGNfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfbGJsY19zY2hlZHVsZSwKLX07Ci0KLQotc3RhdGljIGludCBfX2luaXQgaXBfdnNfbGJsY19pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfcGF0aHMobmV0X3ZzX2N0bF9wYXRoLCB2c192YXJzX3RhYmxlKTsKLQlyZXQgPSByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xibGNfc2NoZWR1bGVyKTsKLQlpZiAocmV0KQotCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19sYmxjX2NsZWFudXAodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKLQl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGJsY19zY2hlZHVsZXIpOwotfQotCi0KLW1vZHVsZV9pbml0KGlwX3ZzX2xibGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c19sYmxjX2NsZWFudXApOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0ZTczLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYworKysgL2Rldi9udWxsCkBAIC0xLDc2MCArMCwwIEBACi0vKgotICogSVBWUzogICAgICAgIExvY2FsaXR5LUJhc2VkIExlYXN0LUNvbm5lY3Rpb24gd2l0aCBSZXBsaWNhdGlvbiBzY2hlZHVsZXIKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BnbnVjaGluYS5vcmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICA6ICAgIEFkZGVkIHRoZSBtaXNzaW5nIChkZXN0LT53ZWlnaHQ+MCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBpbiB0aGUgaXBfdnNfZGVzdF9zZXRfbWF4LgotICoKLSAqLwotCi0vKgotICogVGhlIGxibGMvciBhbGdvcml0aG0gaXMgYXMgZm9sbG93cyAocHNldWRvIGNvZGUpOgotICoKLSAqICAgICAgIGlmIHNlcnZlclNldFtkZXN0X2lwXSBpcyBudWxsIHRoZW4KLSAqICAgICAgICAgICAgICAgbiwgc2VydmVyU2V0W2Rlc3RfaXBdIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OwotICogICAgICAgZWxzZQotICogICAgICAgICAgICAgICBuIDwtIHtsZWFzdC1jb25uIChhbGl2ZSkgbm9kZSBpbiBzZXJ2ZXJTZXRbZGVzdF9pcF19OwotICogICAgICAgICAgICAgICBpZiAobiBpcyBudWxsKSBPUgotICogICAgICAgICAgICAgICAgICAobi5jb25ucz5uLndlaWdodCBBTkQKLSAqICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgbm9kZSBtIHdpdGggbS5jb25uczxtLndlaWdodC8yKSB0aGVuCi0gKiAgICAgICAgICAgICAgICAgICBuIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OwotICogICAgICAgICAgICAgICAgICAgYWRkIG4gdG8gc2VydmVyU2V0W2Rlc3RfaXBdOwotICogICAgICAgICAgICAgICBpZiB8c2VydmVyU2V0W2Rlc3RfaXBdfCA+IDEgQU5ECi0gKiAgICAgICAgICAgICAgICAgICBub3cgLSBzZXJ2ZXJTZXRbZGVzdF9pcF0ubGFzdE1vZCA+IFQgdGhlbgotICogICAgICAgICAgICAgICAgICAgbSA8LSB7bW9zdCBjb25uIG5vZGUgaW4gc2VydmVyU2V0W2Rlc3RfaXBdfTsKLSAqICAgICAgICAgICAgICAgICAgIHJlbW92ZSBtIGZyb20gc2VydmVyU2V0W2Rlc3RfaXBdOwotICogICAgICAgaWYgc2VydmVyU2V0W2Rlc3RfaXBdIGNoYW5nZWQgdGhlbgotICogICAgICAgICAgICAgICBzZXJ2ZXJTZXRbZGVzdF9pcF0ubGFzdE1vZCA8LSBub3c7Ci0gKgotICogICAgICAgcmV0dXJuIG47Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLQotLyogZm9yIHN5c2N0bCAqLwotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qCi0gKiAgICBJdCBpcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHN0YWxlIElQVlMgbGJsY3IgZW50cmllcywKLSAqICAgIHdoZW4gdGhlIHRhYmxlIGlzIGZ1bGwuCi0gKi8KLSNkZWZpbmUgQ0hFQ0tfRVhQSVJFX0lOVEVSVkFMICAgKDYwKkhaKQotI2RlZmluZSBFTlRSWV9USU1FT1VUICAgICAgICAgICAoNio2MCpIWikKLQotLyoKLSAqICAgIEl0IGlzIGZvciBmdWxsIGV4cGlyYXRpb24gY2hlY2suCi0gKiAgICBXaGVuIHRoZXJlIGlzIG5vIHBhcnRpYWwgZXhwaXJhdGlvbiBjaGVjayAoZ2FyYmFnZSBjb2xsZWN0aW9uKQotICogICAgaW4gYSBoYWxmIGhvdXIsIGRvIGEgZnVsbCBleHBpcmF0aW9uIGNoZWNrIHRvIGNvbGxlY3Qgc3RhbGUKLSAqICAgIGVudHJpZXMgdGhhdCBoYXZlbid0IGJlZW4gdG91Y2hlZCBmb3IgYSBkYXkuCi0gKi8KLSNkZWZpbmUgQ09VTlRfRk9SX0ZVTExfRVhQSVJBVElPTiAgIDMwCi1zdGF0aWMgaW50IHN5c2N0bF9pcF92c19sYmxjcl9leHBpcmF0aW9uID0gMjQqNjAqNjAqSFo7Ci0KLQotLyoKLSAqICAgICBmb3IgSVBWUyBsYmxjciBlbnRyeSBoYXNoIHRhYmxlCi0gKi8KLSNpZm5kZWYgQ09ORklHX0lQX1ZTX0xCTENSX1RBQl9CSVRTCi0jZGVmaW5lIENPTkZJR19JUF9WU19MQkxDUl9UQUJfQklUUyAgICAgIDEwCi0jZW5kaWYKLSNkZWZpbmUgSVBfVlNfTEJMQ1JfVEFCX0JJVFMgICAgIENPTkZJR19JUF9WU19MQkxDUl9UQUJfQklUUwotI2RlZmluZSBJUF9WU19MQkxDUl9UQUJfU0laRSAgICAgKDEgPDwgSVBfVlNfTEJMQ1JfVEFCX0JJVFMpCi0jZGVmaW5lIElQX1ZTX0xCTENSX1RBQl9NQVNLICAgICAoSVBfVlNfTEJMQ1JfVEFCX1NJWkUgLSAxKQotCi0KLS8qCi0gKiAgICAgIElQVlMgZGVzdGluYXRpb24gc2V0IHN0cnVjdHVyZSBhbmQgb3BlcmF0aW9ucwotICovCi1zdHJ1Y3QgaXBfdnNfZGVzdF9saXN0IHsKLQlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICAqbmV4dDsgICAgICAgICAgLyogbGlzdCBsaW5rICovCi0Jc3RydWN0IGlwX3ZzX2Rlc3QgICAgICAgKmRlc3Q7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIHNlcnZlciAqLwotfTsKLQotc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0IHsKLQlhdG9taWNfdCAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgLyogc2V0IHNpemUgKi8KLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBsYXN0bW9kOyAgICAgICAgLyogbGFzdCBtb2RpZmllZCB0aW1lICovCi0Jc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAgKmxpc3Q7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGxpc3QgKi8KLQlyd2xvY2tfdAkgICAgICAgIGxvY2s7ICAgICAgICAgICAvKiBsb2NrIGZvciB0aGlzIGxpc3QgKi8KLX07Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0X2xpc3QgKgotaXBfdnNfZGVzdF9zZXRfaW5zZXJ0KHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0LCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplOwotCi0JZm9yIChlPXNldC0+bGlzdDsgZSE9TlVMTDsgZT1lLT5uZXh0KSB7Ci0JCWlmIChlLT5kZXN0ID09IGRlc3QpCi0JCQkvKiBhbHJlYWR5IGV4aXN0ZWQgKi8KLQkJCXJldHVybiBOVUxMOwotCX0KLQotCWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGUgPT0gTlVMTCkgewotCQlJUF9WU19FUlIoImlwX3ZzX2Rlc3Rfc2V0X2luc2VydCgpOiBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwotCWUtPmRlc3QgPSBkZXN0OwotCi0JLyogbGluayBpdCB0byB0aGUgbGlzdCAqLwotCXdyaXRlX2xvY2soJnNldC0+bG9jayk7Ci0JZS0+bmV4dCA9IHNldC0+bGlzdDsKLQlzZXQtPmxpc3QgPSBlOwotCWF0b21pY19pbmMoJnNldC0+c2l6ZSk7Ci0Jd3JpdGVfdW5sb2NrKCZzZXQtPmxvY2spOwotCi0Jc2V0LT5sYXN0bW9kID0gamlmZmllczsKLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIHZvaWQKLWlwX3ZzX2Rlc3Rfc2V0X2VyYXNlKHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0LCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplLCAqKmVwOwotCi0Jd3JpdGVfbG9jaygmc2V0LT5sb2NrKTsKLQlmb3IgKGVwPSZzZXQtPmxpc3QsIGU9KmVwOyBlIT1OVUxMOyBlPSplcCkgewotCQlpZiAoZS0+ZGVzdCA9PSBkZXN0KSB7Ci0JCQkvKiBISVQgKi8KLQkJCSplcCA9IGUtPm5leHQ7Ci0JCQlhdG9taWNfZGVjKCZzZXQtPnNpemUpOwotCQkJc2V0LT5sYXN0bW9kID0gamlmZmllczsKLQkJCWF0b21pY19kZWMoJmUtPmRlc3QtPnJlZmNudCk7Ci0JCQlrZnJlZShlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVwID0gJmUtPm5leHQ7Ci0JfQotCXdyaXRlX3VubG9jaygmc2V0LT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgaXBfdnNfZGVzdF9zZXRfZXJhc2VhbGwoc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0ICpzZXQpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAqZSwgKiplcDsKLQotCXdyaXRlX2xvY2soJnNldC0+bG9jayk7Ci0JZm9yIChlcD0mc2V0LT5saXN0LCBlPSplcDsgZSE9TlVMTDsgZT0qZXApIHsKLQkJKmVwID0gZS0+bmV4dDsKLQkJLyoKLQkJICogV2UgZG9uJ3Qga2ZyZWUgZGVzdCBiZWNhdXNlIGl0IGlzIHJlZmVyZWQgZWl0aGVyCi0JCSAqIGJ5IGl0cyBzZXJ2aWNlIG9yIGJ5IHRoZSB0cmFzaCBkZXN0IGxpc3QuCi0JCSAqLwotCQlhdG9taWNfZGVjKCZlLT5kZXN0LT5yZWZjbnQpOwotCQlrZnJlZShlKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrKCZzZXQtPmxvY2spOwotfQotCi0vKiBnZXQgd2VpZ2h0ZWQgbGVhc3QtY29ubmVjdGlvbiBub2RlIGluIHRoZSBkZXN0aW5hdGlvbiBzZXQgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKmlwX3ZzX2Rlc3Rfc2V0X21pbihzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgKnNldCkKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplOwotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7Ci0JaW50IGxvaCwgZG9oOwotCi0JaWYgKHNldCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlYWRfbG9jaygmc2V0LT5sb2NrKTsKLQkvKiBzZWxlY3QgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHNlcnZlciwgd2hvc2Ugd2VpZ2h0ID4gMCAqLwotCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgewotCQlsZWFzdCA9IGUtPmRlc3Q7Ci0JCWlmIChsZWFzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSA+IDApCi0JCSAgICAmJiAobGVhc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkpIHsKLQkJCWxvaCA9IGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpICogNTAKLQkJCQkrIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucyk7Ci0JCQlnb3RvIG5leHRzdGFnZTsKLQkJfQotCX0KLQlyZWFkX3VubG9jaygmc2V0LT5sb2NrKTsKLQlyZXR1cm4gTlVMTDsKLQotCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHdlaWdodGVkIGxlYXN0IGxvYWQgKi8KLSAgbmV4dHN0YWdlOgotCWZvciAoZT1lLT5uZXh0OyBlIT1OVUxMOyBlPWUtPm5leHQpIHsKLQkJZGVzdCA9IGUtPmRlc3Q7Ci0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKLQkJCWNvbnRpbnVlOwotCi0JCWRvaCA9IGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgKiA1MAotCQkJKyBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7Ci0JCWlmICgobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgotCQkgICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkKLQkJICAgICYmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBkb2g7Ci0JCX0KLQl9Ci0JcmVhZF91bmxvY2soJnNldC0+bG9jayk7Ci0KLQlJUF9WU19EQkcoNiwgImlwX3ZzX2Rlc3Rfc2V0X21pbjogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKLQkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKLQkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7Ci0JcmV0dXJuIGxlYXN0OwotfQotCi0KLS8qIGdldCB3ZWlnaHRlZCBtb3N0LWNvbm5lY3Rpb24gbm9kZSBpbiB0aGUgZGVzdGluYXRpb24gc2V0ICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19kZXN0ICppcF92c19kZXN0X3NldF9tYXgoc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0ICpzZXQpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAqZTsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKm1vc3Q7Ci0JaW50IG1vaCwgZG9oOwotCi0JaWYgKHNldCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlYWRfbG9jaygmc2V0LT5sb2NrKTsKLQkvKiBzZWxlY3QgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHNlcnZlciwgd2hvc2Ugd2VpZ2h0ID4gMCAqLwotCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgewotCQltb3N0ID0gZS0+ZGVzdDsKLQkJaWYgKGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpID4gMCkgewotCQkJbW9oID0gYXRvbWljX3JlYWQoJm1vc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCi0JCQkJKyBhdG9taWNfcmVhZCgmbW9zdC0+aW5hY3Rjb25ucyk7Ci0JCQlnb3RvIG5leHRzdGFnZTsKLQkJfQotCX0KLQlyZWFkX3VubG9jaygmc2V0LT5sb2NrKTsKLQlyZXR1cm4gTlVMTDsKLQotCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHdlaWdodGVkIG1vc3QgbG9hZCAqLwotICBuZXh0c3RhZ2U6Ci0JZm9yIChlPWUtPm5leHQ7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgewotCQlkZXN0ID0gZS0+ZGVzdDsKLQkJZG9oID0gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCi0JCQkrIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKLQkJLyogbW9oL213IDwgZG9oL2R3ID09PiBtb2gqZHcgPCBkb2gqbXcsIHdoZXJlIG13LGR3PjAgKi8KLQkJaWYgKChtb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8Ci0JCSAgICAgZG9oICogYXRvbWljX3JlYWQoJm1vc3QtPndlaWdodCkpCi0JCSAgICAmJiAoYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKSkgewotCQkJbW9zdCA9IGRlc3Q7Ci0JCQltb2ggPSBkb2g7Ci0JCX0KLQl9Ci0JcmVhZF91bmxvY2soJnNldC0+bG9jayk7Ci0KLQlJUF9WU19EQkcoNiwgImlwX3ZzX2Rlc3Rfc2V0X21heDogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKLQkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKLQkJICBOSVBRVUFEKG1vc3QtPmFkZHIpLCBudG9ocyhtb3N0LT5wb3J0KSwKLQkJICBhdG9taWNfcmVhZCgmbW9zdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZtb3N0LT5yZWZjbnQpLAotCQkgIGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpLCBtb2gpOwotCXJldHVybiBtb3N0OwotfQotCi0KLS8qCi0gKiAgICAgIElQVlMgbGJsY3IgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCi0gKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIgc2V0Ci0gKi8KLXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsKLQlfX2JlMzIgICAgICAgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgICBzZXQ7ICAgICAgICAgICAgLyogZGVzdGluYXRpb24gc2VydmVyIHNldCAqLwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGxhc3R1c2U7ICAgICAgICAvKiBsYXN0IHVzZWQgdGltZSAqLwotfTsKLQotCi0vKgotICogICAgICBJUFZTIGxibGNyIGhhc2ggdGFibGUKLSAqLwotc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlIHsKLQlyd2xvY2tfdAkgICAgICAgIGxvY2s7ICAgICAgICAgICAvKiBsb2NrIGZvciB0aGlzIHRhYmxlICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgYnVja2V0W0lQX1ZTX0xCTENSX1RBQl9TSVpFXTsgIC8qIGhhc2ggYnVja2V0ICovCi0JYXRvbWljX3QgICAgICAgICAgICAgICAgZW50cmllczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemU7ICAgICAgIC8qIG1heGltdW0gc2l6ZSBvZiBlbnRyaWVzICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcGVyaW9kaWNfdGltZXI7IC8qIGNvbGxlY3Qgc3RhbGUgZW50cmllcyAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIHJvdmVyOyAgICAgICAgICAvKiByb3ZlciBmb3IgZXhwaXJlIGNoZWNrICovCi0JaW50ICAgICAgICAgICAgICAgICAgICAgY291bnRlcjsgICAgICAgIC8qIGNvdW50ZXIgZm9yIG5vIGV4cGlyZSAqLwotfTsKLQotCi0vKgotICogICAgICBJUFZTIExCTENSIHN5c2N0bCB0YWJsZQotICovCi0KLXN0YXRpYyBjdGxfdGFibGUgdnNfdmFyc190YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImxibGNyX2V4cGlyYXRpb24iLAotCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2xibGNyX2V4cGlyYXRpb24sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7Ci0KLS8qCi0gKiAgICAgIG5ldy9mcmVlIGEgaXBfdnNfbGJsY3JfZW50cnksIHdoaWNoIGlzIGEgbWFwcGluZyBvZiBhIGRlc3RpbmF0aW9uCi0gKiAgICAgIElQIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICppcF92c19sYmxjcl9uZXcoX19iZTMyIGRhZGRyKQotewotCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW47Ci0KLQllbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSksIEdGUF9BVE9NSUMpOwotCWlmIChlbiA9PSBOVUxMKSB7Ci0JCUlQX1ZTX0VSUigiaXBfdnNfbGJsY3JfbmV3KCk6IG5vIG1lbW9yeVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZlbi0+bGlzdCk7Ci0JZW4tPmFkZHIgPSBkYWRkcjsKLQotCS8qIGluaXRpbGl6ZSBpdHMgZGVzdCBzZXQgKi8KLQlhdG9taWNfc2V0KCYoZW4tPnNldC5zaXplKSwgMCk7Ci0JZW4tPnNldC5saXN0ID0gTlVMTDsKLQlyd2xvY2tfaW5pdCgmZW4tPnNldC5sb2NrKTsKLQotCXJldHVybiBlbjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfbGJsY3JfZnJlZShzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuKQotewotCWxpc3RfZGVsKCZlbi0+bGlzdCk7Ci0JaXBfdnNfZGVzdF9zZXRfZXJhc2VhbGwoJmVuLT5zZXQpOwotCWtmcmVlKGVuKTsKLX0KLQotCi0vKgotICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciBJUFZTIExCTENSIGVudHJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXBfdnNfbGJsY3JfaGFzaGtleShfX2JlMzIgYWRkcikKLXsKLQlyZXR1cm4gKG50b2hsKGFkZHIpKjI2NTQ0MzU3NjFVTCkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKLX0KLQotCi0vKgotICoJSGFzaCBhbiBlbnRyeSBpbiB0aGUgaXBfdnNfbGJsY3JfdGFibGUuCi0gKglyZXR1cm5zIGJvb2wgc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludAotaXBfdnNfbGJsY3JfaGFzaChzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCwgc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbikKLXsKLQl1bnNpZ25lZCBoYXNoOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZlbi0+bGlzdCkpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19sYmxjcl9oYXNoKCk6IHJlcXVlc3QgZm9yIGFscmVhZHkgaGFzaGVkLCAiCi0JCQkgICJjYWxsZWQgZnJvbSAlcFxuIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKglIYXNoIGJ5IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MKLQkgKi8KLQloYXNoID0gaXBfdnNfbGJsY3JfaGFzaGtleShlbi0+YWRkcik7Ci0KLQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOwotCWxpc3RfYWRkKCZlbi0+bGlzdCwgJnRibC0+YnVja2V0W2hhc2hdKTsKLQlhdG9taWNfaW5jKCZ0YmwtPmVudHJpZXMpOwotCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKLQotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKiAgR2V0IGlwX3ZzX2xibGNyX2VudHJ5IGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqCi1pcF92c19sYmxjcl9nZXQoc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwsIF9fYmUzMiBhZGRyKQotewotCXVuc2lnbmVkIGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKLQotCWhhc2ggPSBpcF92c19sYmxjcl9oYXNoa2V5KGFkZHIpOwotCi0JcmVhZF9sb2NrKCZ0YmwtPmxvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbiwgJnRibC0+YnVja2V0W2hhc2hdLCBsaXN0KSB7Ci0JCWlmIChlbi0+YWRkciA9PSBhZGRyKSB7Ci0JCQkvKiBISVQgKi8KLQkJCXJlYWRfdW5sb2NrKCZ0YmwtPmxvY2spOwotCQkJcmV0dXJuIGVuOwotCQl9Ci0JfQotCi0JcmVhZF91bmxvY2soJnRibC0+bG9jayk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotICogICAgICBGbHVzaCBhbGwgdGhlIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZS4KLSAqLwotc3RhdGljIHZvaWQgaXBfdnNfbGJsY3JfZmx1c2goc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbiwgKm54dDsKLQotCWZvciAoaT0wOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKLQkJd3JpdGVfbG9jaygmdGJsLT5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtpXSwgbGlzdCkgewotCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7Ci0JCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKLQl9Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2xibGNyX2Z1bGxfY2hlY2soc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwpCi17Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCWludCBpLCBqOwotCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW4sICpueHQ7Ci0KLQlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKLQkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKLQotCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7Ci0JCQlpZiAodGltZV9hZnRlcihlbi0+bGFzdHVzZStzeXNjdGxfaXBfdnNfbGJsY3JfZXhwaXJhdGlvbiwKLQkJCQkgICAgICAgbm93KSkKLQkJCQljb250aW51ZTsKLQotCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7Ci0JCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKLQl9Ci0JdGJsLT5yb3ZlciA9IGo7Ci19Ci0KLQotLyoKLSAqICAgICAgUGVyaW9kaWNhbCB0aW1lciBoYW5kbGVyIGZvciBJUFZTIGxibGNyIHRhYmxlCi0gKiAgICAgIEl0IGlzIHVzZWQgdG8gY29sbGVjdCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlIG51bWJlciBvZiBlbnRyaWVzCi0gKiAgICAgIGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdGFibGUuCi0gKgotICogICAgICBGaXhtZTogd2UgcHJvYmFibHkgbmVlZCBtb3JlIGNvbXBsaWNhdGVkIGFsZ29yaXRobSB0byBjb2xsZWN0Ci0gKiAgICAgICAgICAgICBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkIGZvciBhIGxvbmcgdGltZSBldmVuCi0gKiAgICAgICAgICAgICBpZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZQotICogICAgICAgICAgICAgb2YgdGhlIHRhYmxlLgotICogICAgICBUaGUgZnVsbCBleHBpcmF0aW9uIGNoZWNrIGlzIGZvciB0aGlzIHB1cnBvc2Ugbm93LgotICovCi1zdGF0aWMgdm9pZCBpcF92c19sYmxjcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlpbnQgZ29hbDsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuLCAqbnh0OwotCi0JdGJsID0gKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqKWRhdGE7Ci0KLQlpZiAoKHRibC0+Y291bnRlciAlIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04pID09IDApIHsKLQkJLyogZG8gZnVsbCBleHBpcmF0aW9uIGNoZWNrICovCi0JCWlwX3ZzX2xibGNyX2Z1bGxfY2hlY2sodGJsKTsKLQkJdGJsLT5jb3VudGVyID0gMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZ0YmwtPmVudHJpZXMpIDw9IHRibC0+bWF4X3NpemUpIHsKLQkJdGJsLT5jb3VudGVyKys7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWdvYWwgPSAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykgLSB0YmwtPm1heF9zaXplKSo0LzM7Ci0JaWYgKGdvYWwgPiB0YmwtPm1heF9zaXplLzIpCi0JCWdvYWwgPSB0YmwtPm1heF9zaXplLzI7Ci0KLQlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKLQkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKLQotCQl3cml0ZV9sb2NrKCZ0YmwtPmxvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7Ci0JCQlpZiAodGltZV9iZWZvcmUobm93LCBlbi0+bGFzdHVzZStFTlRSWV9USU1FT1VUKSkKLQkJCQljb250aW51ZTsKLQotCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7Ci0JCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOwotCQkJZ29hbC0tOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmdGJsLT5sb2NrKTsKLQkJaWYgKGdvYWwgPD0gMCkKLQkJCWJyZWFrOwotCX0KLQl0YmwtPnJvdmVyID0gajsKLQotICBvdXQ6Ci0JbW9kX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyLCBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXBfdnNfbGJsY3JfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibDsKLQotCS8qCi0JICogICAgQWxsb2NhdGUgdGhlIGlwX3ZzX2xibGNyX3RhYmxlIGZvciB0aGlzIHNlcnZpY2UKLQkgKi8KLQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAodGJsID09IE5VTEwpIHsKLQkJSVBfVlNfRVJSKCJpcF92c19sYmxjcl9pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwotCUlQX1ZTX0RCRyg2LCAiTEJMQ1IgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKLQkJICAiY3VycmVudCBzZXJ2aWNlXG4iLAotCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUpKTsKLQotCS8qCi0JICogICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBidWNrZXRzCi0JICovCi0JZm9yIChpPTA7IGk8SVBfVlNfTEJMQ1JfVEFCX1NJWkU7IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmdGJsLT5idWNrZXRbaV0pOwotCX0KLQlyd2xvY2tfaW5pdCgmdGJsLT5sb2NrKTsKLQl0YmwtPm1heF9zaXplID0gSVBfVlNfTEJMQ1JfVEFCX1NJWkUqMTY7Ci0JdGJsLT5yb3ZlciA9IDA7Ci0JdGJsLT5jb3VudGVyID0gMTsKLQotCS8qCi0JICogICAgSG9vayBwZXJpb2RpYyB0aW1lciBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uCi0JICovCi0Jc2V0dXBfdGltZXIoJnRibC0+cGVyaW9kaWNfdGltZXIsIGlwX3ZzX2xibGNyX2NoZWNrX2V4cGlyZSwKLQkJCSh1bnNpZ25lZCBsb25nKXRibCk7Ci0JdGJsLT5wZXJpb2RpY190aW1lci5leHBpcmVzID0gamlmZmllcytDSEVDS19FWFBJUkVfSU5URVJWQUw7Ci0JYWRkX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfbGJsY3JfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKLQotCS8qIHJlbW92ZSBwZXJpb2RpYyB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKLQotCS8qIGdvdCB0byBjbGVhbiB1cCB0YWJsZSBlbnRyaWVzIGhlcmUgKi8KLQlpcF92c19sYmxjcl9mbHVzaCh0YmwpOwotCi0JLyogcmVsZWFzZSB0aGUgdGFibGUgaXRzZWxmICovCi0Ja2ZyZWUoc3ZjLT5zY2hlZF9kYXRhKTsKLQlJUF9WU19EQkcoNiwgIkxCTENSIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19sYmxjcl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqCi1fX2lwX3ZzX3dsY19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBoZHIgKmlwaCkKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0OwotCWludCBsb2gsIGRvaDsKLQotCS8qCi0JICogV2UgdGhpbmsgdGhlIG92ZXJoZWFkIG9mIHByb2Nlc3NpbmcgYWN0aXZlIGNvbm5lY3Rpb25zIGlzIGZpZnR5Ci0JICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcwotCSAqIGZpZnR5IHRpbWVzIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSwgd2Ugd2lsbCBjaGFuZ2UgaXQgbGF0ZXIuKSBXZQotCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkOgotCSAqICAgICAgICAgICAgICAgIGRlc3QtPmFjdGl2ZWNvbm5zKjUwICsgZGVzdC0+aW5hY3Rjb25ucwotCSAqIGFuZCB0aGUgbG9hZDoKLQkgKiAgICAgICAgICAgICAgICAoZGVzdCBvdmVyaGVhZCkgLyBkZXN0LT53ZWlnaHQKLQkgKgotCSAqIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSEhIQotCSAqIFRoZSBjb21wYXJpc29uIG9mIGgxKncyID4gaDIqdzEgaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mCi0JICogICAgICAgICAgICAgICAgaDEvdzEgPiBoMi93MgotCSAqIGlmIGV2ZXJ5IHdlaWdodCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgotCSAqCi0JICogVGhlIHNlcnZlciB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGFueQotCSAqIG5ldyBjb25uZWN0aW9uLgotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKLQkJaWYgKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgewotCQkJbGVhc3QgPSBkZXN0OwotCQkJbG9oID0gYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucykgKiA1MAotCQkJCSsgYXRvbWljX3JlYWQoJmxlYXN0LT5pbmFjdGNvbm5zKTsKLQkJCWdvdG8gbmV4dHN0YWdlOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotCi0JLyoKLQkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgotCSAqLwotICBuZXh0c3RhZ2U6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCi0JCQljb250aW51ZTsKLQotCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKLQkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOwotCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgotCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBkb2g7Ci0JCX0KLQl9Ci0KLQlJUF9WU19EQkcoNiwgIkxCTENSOiBzZXJ2ZXIgJWQuJWQuJWQuJWQ6JWQgIgotCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkIG92ZXJoZWFkICVkXG4iLAotCQkgIE5JUFFVQUQobGVhc3QtPmFkZHIpLCBudG9ocyhsZWFzdC0+cG9ydCksCi0JCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCi0JCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5yZWZjbnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSwgbG9oKTsKLQotCXJldHVybiBsZWFzdDsKLX0KLQotCi0vKgotICogICBJZiB0aGlzIGRlc3RpbmF0aW9uIHNlcnZlciBpcyBvdmVybG9hZGVkIGFuZCB0aGVyZSBpcyBhIGxlc3MgbG9hZGVkCi0gKiAgIHNlcnZlciwgdGhlbiByZXR1cm4gdHJ1ZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLWlzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgPiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSkgewotCQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZDsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJmQtPmFjdGl2ZWNvbm5zKSoyCi0JCQkgICAgPCBhdG9taWNfcmVhZCgmZC0+d2VpZ2h0KSkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgICBMb2NhbGl0eS1CYXNlZCAod2VpZ2h0ZWQpIExlYXN0LUNvbm5lY3Rpb24gc2NoZWR1bGluZwotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfbGJsY3Jfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibDsKLQlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuOwotCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KLQlJUF9WU19EQkcoNiwgImlwX3ZzX2xibGNyX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwotCi0JdGJsID0gKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqKXN2Yy0+c2NoZWRfZGF0YTsKLQllbiA9IGlwX3ZzX2xibGNyX2dldCh0YmwsIGlwaC0+ZGFkZHIpOwotCWlmIChlbiA9PSBOVUxMKSB7Ci0JCWRlc3QgPSBfX2lwX3ZzX3dsY19zY2hlZHVsZShzdmMsIGlwaCk7Ci0JCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJCUlQX1ZTX0RCRygxLCAibm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVuID0gaXBfdnNfbGJsY3JfbmV3KGlwaC0+ZGFkZHIpOwotCQlpZiAoZW4gPT0gTlVMTCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaXBfdnNfZGVzdF9zZXRfaW5zZXJ0KCZlbi0+c2V0LCBkZXN0KTsKLQkJaXBfdnNfbGJsY3JfaGFzaCh0YmwsIGVuKTsKLQl9IGVsc2UgewotCQlkZXN0ID0gaXBfdnNfZGVzdF9zZXRfbWluKCZlbi0+c2V0KTsKLQkJaWYgKCFkZXN0IHx8IGlzX292ZXJsb2FkZWQoZGVzdCwgc3ZjKSkgewotCQkJZGVzdCA9IF9faXBfdnNfd2xjX3NjaGVkdWxlKHN2YywgaXBoKTsKLQkJCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpcF92c19kZXN0X3NldF9pbnNlcnQoJmVuLT5zZXQsIGRlc3QpOwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmZW4tPnNldC5zaXplKSA+IDEgJiYKLQkJICAgIGppZmZpZXMtZW4tPnNldC5sYXN0bW9kID4gc3lzY3RsX2lwX3ZzX2xibGNyX2V4cGlyYXRpb24pIHsKLQkJCXN0cnVjdCBpcF92c19kZXN0ICptOwotCQkJbSA9IGlwX3ZzX2Rlc3Rfc2V0X21heCgmZW4tPnNldCk7Ci0JCQlpZiAobSkKLQkJCQlpcF92c19kZXN0X3NldF9lcmFzZSgmZW4tPnNldCwgbSk7Ci0JCX0KLQl9Ci0JZW4tPmxhc3R1c2UgPSBqaWZmaWVzOwotCi0JSVBfVlNfREJHKDYsICJMQkxDUjogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCi0JCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCi0JCSAgTklQUVVBRChlbi0+YWRkciksCi0JCSAgTklQUVVBRChkZXN0LT5hZGRyKSwKLQkJICBudG9ocyhkZXN0LT5wb3J0KSk7Ci0KLQlyZXR1cm4gZGVzdDsKLX0KLQotCi0vKgotICogICAgICBJUFZTIExCTENSIFNjaGVkdWxlciBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbGJsY3Jfc2NoZWR1bGVyID0KLXsKLQkubmFtZSA9CQkJImxibGNyIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19sYmxjcl9zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2xibGNyX2luaXRfc3ZjLAotCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfbGJsY3JfZG9uZV9zdmMsCi0JLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfbGJsY3JfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfbGJsY3Jfc2NoZWR1bGUsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2xibGNyX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF9wYXRocyhuZXRfdnNfY3RsX3BhdGgsIHZzX3ZhcnNfdGFibGUpOwotCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGJsY3Jfc2NoZWR1bGVyKTsKLQlpZiAocmV0KQotCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19sYmxjcl9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7Ci0JdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xibGNyX3NjaGVkdWxlcik7Ci19Ci0KLQotbW9kdWxlX2luaXQoaXBfdnNfbGJsY3JfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c19sYmxjcl9jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbGMuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZGJmNy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIElQVlM6ICAgICAgICBMZWFzdC1Db25uZWN0aW9uIFNjaGVkdWxpbmcgbW9kdWxlCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KLSAqCi0gKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBDaGFuZ2VzOgotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCB0aGUgaXBfdnNfbGNfdXBkYXRlX3N2YwotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCBhbnkgZGVzdCB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLXN0YXRpYyBpbnQgaXBfdnNfbGNfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX2xjX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19sY191cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWlwX3ZzX2xjX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyoKLQkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgMjU2Ci0JICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcwotCSAqIDI1NiB0aW1lcyBtaWdodCBub3QgYmUgYWNjdXJhdGUsIHdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyKSBXZQotCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkIG5vdzoKLQkgKgkJICBkZXN0LT5hY3RpdmVjb25ucyoyNTYgKyBkZXN0LT5pbmFjdGNvbm5zCi0JICovCi0JcmV0dXJuIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpIDw8IDgpICsKLQkJYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOwotfQotCi0KLS8qCi0gKglMZWFzdCBDb25uZWN0aW9uIHNjaGVkdWxpbmcKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX2xjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGxvaCA9IDAsIGRvaDsKLQotCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGNfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7Ci0KLQkvKgotCSAqIFNpbXBseSBzZWxlY3QgdGhlIHNlcnZlciB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2YKLQkgKiAgICAgICAgKGFjdGl2ZWNvbm5zPDw1KSArIGluYWN0Y29ubnMKLQkgKiBFeGNlcHQgd2hvc2Ugd2VpZ2h0IGlzIGVxdWFsIHRvIHplcm8uCi0JICogSWYgdGhlIHdlaWdodCBpcyBlcXVhbCB0byB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgaXMKLQkgKiBxdWllc2NlZCwgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgc3RpbGwgZ2V0Ci0JICogc2VydmVkLCBidXQgbm8gbmV3IGNvbm5lY3Rpb24gaXMgYXNzaWduZWQgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKLQkJaWYgKChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgfHwKLQkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApCi0JCQljb250aW51ZTsKLQkJZG9oID0gaXBfdnNfbGNfZGVzdF9vdmVyaGVhZChkZXN0KTsKLQkJaWYgKCFsZWFzdCB8fCBkb2ggPCBsb2gpIHsKLQkJCWxlYXN0ID0gZGVzdDsKLQkJCWxvaCA9IGRvaDsKLQkJfQotCX0KLQotCWlmIChsZWFzdCkKLQlJUF9WU19EQkcoNiwgIkxDOiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JXUgYWN0aXZlY29ubnMgJWQgaW5hY3Rjb25ucyAlZFxuIiwKLQkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucykpOwotCi0JcmV0dXJuIGxlYXN0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX2xjX3NjaGVkdWxlciA9IHsKLQkubmFtZSA9CQkJImxjIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19sY19zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2xjX2luaXRfc3ZjLAotCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfbGNfZG9uZV9zdmMsCi0JLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfbGNfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfbGNfc2NoZWR1bGUsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2xjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19sY19zY2hlZHVsZXIpIDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX2xjX2NsZWFudXAodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGNfc2NoZWR1bGVyKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfdnNfbGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c19sY19jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfbnEuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmM2E2Ny4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX25xLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIElQVlM6ICAgICAgICBOZXZlciBRdWV1ZSBzY2hlZHVsaW5nIG1vZHVsZQotICoKLSAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqCi0gKi8KLQotLyoKLSAqIFRoZSBOUSBhbGdvcml0aG0gYWRvcHRzIGEgdHdvLXNwZWVkIG1vZGVsLiBXaGVuIHRoZXJlIGlzIGFuIGlkbGUgc2VydmVyCi0gKiBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZSBzZW50IHRvIHRoZSBpZGxlIHNlcnZlciwgaW5zdGVhZCBvZiB3YWl0aW5nCi0gKiBmb3IgYSBmYXN0IG9uZS4gV2hlbiB0aGVyZSBpcyBubyBpZGxlIHNlcnZlciBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZQotICogc2VudCB0byB0aGUgc2VydmVyIHRoYXQgbWluaW1pemUgaXRzIGV4cGVjdGVkIGRlbGF5IChUaGUgU2hvcnRlc3QKLSAqIEV4cGVjdGVkIERlbGF5IHNjaGVkdWxpbmcgYWxnb3JpdGhtKS4KLSAqCi0gKiBTZWUgdGhlIGZvbGxvd2luZyBwYXBlciBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKLSAqIEEuIFdlaW5yaWIgYW5kIFMuIFNoZW5rZXIsIEdyZWVkIGlzIG5vdCBlbm91Z2g6IEFkYXB0aXZlIGxvYWQgc2hhcmluZwotICogaW4gbGFyZ2UgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zLiBJbiBQcm9jZWVkaW5ncyBJRUVFIElORk9DT00nODgsCi0gKiBwYWdlcyA5ODYtOTk0LCAxOTg4LgotICoKLSAqIFRoYW5rcyBtdXN0IGdvIHRvIE1hcmtvIEJ1dXJpIDxtYXJrb0BidXVyaS5uYW1lPiBmb3IgdGFsa2luZyBOUSB0byBtZS4KLSAqCi0gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIE5RIGFuZCBTRUQgaXMgdGhhdCBOUSBjYW4gaW1wcm92ZSBvdmVyYWxsCi0gKiBzeXN0ZW0gdXRpbGl6YXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLXN0YXRpYyBpbnQKLWlwX3ZzX25xX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaXBfdnNfbnFfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1pcF92c19ucV91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWlwX3ZzX25xX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyoKLQkgKiBXZSBvbmx5IHVzZSB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gbnVtYmVyIGluIHRoZSBjb3N0Ci0JICogY2FsY3VsYXRpb24gaGVyZS4KLQkgKi8KLQlyZXR1cm4gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSArIDE7Ci19Ci0KLQotLyoKLSAqCVdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gc2NoZWR1bGluZwotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfbnFfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0ID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbG9oID0gMCwgZG9oOwotCi0JSVBfVlNfREJHKDYsICJpcF92c19ucV9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKLQotCS8qCi0JICogV2UgY2FsY3VsYXRlIHRoZSBsb2FkIG9mIGVhY2ggZGVzdCBzZXJ2ZXIgYXMgZm9sbG93czoKLQkgKgkoc2VydmVyIGV4cGVjdGVkIG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAotCSAqCi0JICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCi0JICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKLQkgKgkJICBoMS93MSA+IGgyL3cyCi0JICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCi0JICoKLQkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55Ci0JICogbmV3IGNvbm5lY3Rpb25zLgotCSAqLwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCi0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCB8fAotCQkgICAgIWF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKQotCQkJY29udGludWU7Ci0KLQkJZG9oID0gaXBfdnNfbnFfZGVzdF9vdmVyaGVhZChkZXN0KTsKLQotCQkvKiByZXR1cm4gdGhlIHNlcnZlciBkaXJlY3RseSBpZiBpdCBpcyBpZGxlICovCi0JCWlmIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpID09IDApIHsKLQkJCWxlYXN0ID0gZGVzdDsKLQkJCWxvaCA9IGRvaDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKCFsZWFzdCB8fAotCQkgICAgKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KLQkJICAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBkb2g7Ci0JCX0KLQl9Ci0KLQlpZiAoIWxlYXN0KQotCQlyZXR1cm4gTlVMTDsKLQotICBvdXQ6Ci0JSVBfVlNfREJHKDYsICJOUTogc2VydmVyICV1LiV1LiV1LiV1OiV1ICIKLQkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKLQkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7Ci0KLQlyZXR1cm4gbGVhc3Q7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbnFfc2NoZWR1bGVyID0KLXsKLQkubmFtZSA9CQkJIm5xIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19ucV9zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX25xX2luaXRfc3ZjLAotCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfbnFfZG9uZV9zdmMsCi0JLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfbnFfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfbnFfc2NoZWR1bGUsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX3ZzX25xX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19ucV9zY2hlZHVsZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbnFfY2xlYW51cCh2b2lkKQotewotCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19ucV9zY2hlZHVsZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcF92c19ucV9pbml0KTsKLW1vZHVsZV9leGl0KGlwX3ZzX25xX2NsZWFudXApOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90by5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90by5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk5YTg4Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG8uYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogaXBfdnNfcHJvdG8uYzogdHJhbnNwb3J0IHByb3RvY29sIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQgZm9yIElQVlMKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KLSAqCi0gKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBDaGFuZ2VzOgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0KLSNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KLQotCi0vKgotICogSVBWUyBwcm90b2NvbHMgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgd2hlbiB0aGUgaXB2cwotICogbW9kdWxlIGlzIGxvYWRlZC91bmxvYWRlZCwgc28gbm8gbG9jayBpcyBuZWVkZWQgaW4gYWNjZXNzaW5nIHRoZQotICogaXB2cyBwcm90b2NvbCB0YWJsZS4KLSAqLwotCi0jZGVmaW5lIElQX1ZTX1BST1RPX1RBQl9TSVpFCQkzMgkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgSVBfVlNfUFJPVE9fSEFTSChwcm90bykJCSgocHJvdG8pICYgKElQX1ZTX1BST1RPX1RBQl9TSVpFLTEpKQotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX3Byb3RvY29sICppcF92c19wcm90b190YWJsZVtJUF9WU19QUk9UT19UQUJfU0laRV07Ci0KLQotLyoKLSAqCXJlZ2lzdGVyIGFuIGlwdnMgcHJvdG9jb2wKLSAqLwotc3RhdGljIGludCBfX3VzZWQgX19pbml0IHJlZ2lzdGVyX2lwX3ZzX3Byb3RvY29sKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0JdW5zaWduZWQgaGFzaCA9IElQX1ZTX1BST1RPX0hBU0gocHAtPnByb3RvY29sKTsKLQotCXBwLT5uZXh0ID0gaXBfdnNfcHJvdG9fdGFibGVbaGFzaF07Ci0JaXBfdnNfcHJvdG9fdGFibGVbaGFzaF0gPSBwcDsKLQotCWlmIChwcC0+aW5pdCAhPSBOVUxMKQotCQlwcC0+aW5pdChwcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICoJdW5yZWdpc3RlciBhbiBpcHZzIHByb3RvY29sCi0gKi8KLXN0YXRpYyBpbnQgdW5yZWdpc3Rlcl9pcF92c19wcm90b2NvbChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCXN0cnVjdCBpcF92c19wcm90b2NvbCAqKnBwX3A7Ci0JdW5zaWduZWQgaGFzaCA9IElQX1ZTX1BST1RPX0hBU0gocHAtPnByb3RvY29sKTsKLQotCXBwX3AgPSAmaXBfdnNfcHJvdG9fdGFibGVbaGFzaF07Ci0JZm9yICg7ICpwcF9wOyBwcF9wID0gJigqcHBfcCktPm5leHQpIHsKLQkJaWYgKCpwcF9wID09IHBwKSB7Ci0JCQkqcHBfcCA9IHBwLT5uZXh0OwotCQkJaWYgKHBwLT5leGl0ICE9IE5VTEwpCi0JCQkJcHAtPmV4aXQocHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVTUkNIOwotfQotCi0KLS8qCi0gKglnZXQgaXBfdnNfcHJvdG9jb2wgb2JqZWN0IGJ5IGl0cyBwcm90by4KLSAqLwotc3RydWN0IGlwX3ZzX3Byb3RvY29sICogaXBfdnNfcHJvdG9fZ2V0KHVuc2lnbmVkIHNob3J0IHByb3RvKQotewotCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7Ci0JdW5zaWduZWQgaGFzaCA9IElQX1ZTX1BST1RPX0hBU0gocHJvdG8pOwotCi0JZm9yIChwcCA9IGlwX3ZzX3Byb3RvX3RhYmxlW2hhc2hdOyBwcDsgcHAgPSBwcC0+bmV4dCkgewotCQlpZiAocHAtPnByb3RvY29sID09IHByb3RvKQotCQkJcmV0dXJuIHBwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0KLS8qCi0gKglQcm9wYWdhdGUgZXZlbnQgZm9yIHN0YXRlIGNoYW5nZSB0byBhbGwgcHJvdG9jb2xzCi0gKi8KLXZvaWQgaXBfdnNfcHJvdG9jb2xfdGltZW91dF9jaGFuZ2UoaW50IGZsYWdzKQotewotCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVBfVlNfUFJPVE9fVEFCX1NJWkU7IGkrKykgewotCQlmb3IgKHBwID0gaXBfdnNfcHJvdG9fdGFibGVbaV07IHBwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCQlpZiAocHAtPnRpbWVvdXRfY2hhbmdlKQotCQkJCXBwLT50aW1lb3V0X2NoYW5nZShwcCwgZmxhZ3MpOwotCQl9Ci0JfQotfQotCi0KLWludCAqCi1pcF92c19jcmVhdGVfdGltZW91dF90YWJsZShpbnQgKnRhYmxlLCBpbnQgc2l6ZSkKLXsKLQlyZXR1cm4ga21lbWR1cCh0YWJsZSwgc2l6ZSwgR0ZQX0FUT01JQyk7Ci19Ci0KLQotLyoKLSAqCVNldCB0aW1lb3V0IHZhbHVlIGZvciBzdGF0ZSBzcGVjaWZpZWQgYnkgbmFtZQotICovCi1pbnQKLWlwX3ZzX3NldF9zdGF0ZV90aW1lb3V0KGludCAqdGFibGUsIGludCBudW0sIGNoYXIgKipuYW1lcywgY2hhciAqbmFtZSwgaW50IHRvKQotewotCWludCBpOwotCi0JaWYgKCF0YWJsZSB8fCAhbmFtZSB8fCAhdG8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAobmFtZXNbaV0sIG5hbWUpKQotCQkJY29udGludWU7Ci0JCXRhYmxlW2ldID0gdG8gKiBIWjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRU5PRU5UOwotfQotCi0KLWNvbnN0IGNoYXIgKiBpcF92c19zdGF0ZV9uYW1lKF9fdTE2IHByb3RvLCBpbnQgc3RhdGUpCi17Ci0Jc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCA9IGlwX3ZzX3Byb3RvX2dldChwcm90byk7Ci0KLQlpZiAocHAgPT0gTlVMTCB8fCBwcC0+c3RhdGVfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gKElQUFJPVE9fSVAgPT0gcHJvdG8pID8gIk5PTkUiIDogIkVSUiEiOwotCXJldHVybiBwcC0+c3RhdGVfbmFtZShzdGF0ZSk7Ci19Ci0KLQotdm9pZAotaXBfdnNfdGNwdWRwX2RlYnVnX3BhY2tldChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBpbnQgb2Zmc2V0LAotCQkJICBjb25zdCBjaGFyICptc2cpCi17Ci0JY2hhciBidWZbMTI4XTsKLQlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOwotCi0JaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXBoKSwgJl9pcGgpOwotCWlmIChpaCA9PSBOVUxMKQotCQlzcHJpbnRmKGJ1ZiwgIiVzIFRSVU5DQVRFRCIsIHBwLT5uYW1lKTsKLQllbHNlIGlmIChpaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKQotCQlzcHJpbnRmKGJ1ZiwgIiVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSBmcmFnIiwKLQkJCXBwLT5uYW1lLCBOSVBRVUFEKGloLT5zYWRkciksCi0JCQlOSVBRVUFEKGloLT5kYWRkcikpOwotCWVsc2UgewotCQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cgotOwotCQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0ICsgaWgtPmlobCo0LAotCQkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwotCQlpZiAocHB0ciA9PSBOVUxMKQotCQkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IiwKLQkJCQlwcC0+bmFtZSwKLQkJCQlOSVBRVUFEKGloLT5zYWRkciksCi0JCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKLQkJZWxzZQotCQkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldToldS0+JXUuJXUuJXUuJXU6JXUiLAotCQkJCXBwLT5uYW1lLAotCQkJCU5JUFFVQUQoaWgtPnNhZGRyKSwKLQkJCQludG9ocyhwcHRyWzBdKSwKLQkJCQlOSVBRVUFEKGloLT5kYWRkciksCi0JCQkJbnRvaHMocHB0clsxXSkpOwotCX0KLQotCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKLX0KLQotCi1pbnQgX19pbml0IGlwX3ZzX3Byb3RvY29sX2luaXQodm9pZCkKLXsKLQljaGFyIHByb3RvY29sc1s2NF07Ci0jZGVmaW5lIFJFR0lTVEVSX1BST1RPQ09MKHApCQkJXAotCWRvIHsJCQkJCVwKLQkJcmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2wocCk7CVwKLQkJc3RyY2F0KHByb3RvY29scywgIiwgIik7CVwKLQkJc3RyY2F0KHByb3RvY29scywgKHApLT5uYW1lKTsJXAotCX0gd2hpbGUgKDApCi0KLQlwcm90b2NvbHNbMF0gPSAnXDAnOwotCXByb3RvY29sc1syXSA9ICdcMCc7Ci0jaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1RDUAotCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF90Y3ApOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1VEUAotCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF91ZHApOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX0FICi0JUkVHSVNURVJfUFJPVE9DT0woJmlwX3ZzX3Byb3RvY29sX2FoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19FU1AKLQlSRUdJU1RFUl9QUk9UT0NPTCgmaXBfdnNfcHJvdG9jb2xfZXNwKTsKLSNlbmRpZgotCUlQX1ZTX0lORk8oIlJlZ2lzdGVyZWQgcHJvdG9jb2xzICglcylcbiIsICZwcm90b2NvbHNbMl0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBpcF92c19wcm90b2NvbF9jbGVhbnVwKHZvaWQpCi17Ci0Jc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKLQlpbnQgaTsKLQotCS8qIHVucmVnaXN0ZXIgYWxsIHRoZSBpcHZzIHByb3RvY29scyAqLwotCWZvciAoaSA9IDA7IGkgPCBJUF9WU19QUk9UT19UQUJfU0laRTsgaSsrKSB7Ci0JCXdoaWxlICgocHAgPSBpcF92c19wcm90b190YWJsZVtpXSkgIT0gTlVMTCkKLQkJCXVucmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2wocHApOwotCX0KLX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fYWguYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fYWguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMGVhOC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIGlwX3ZzX3Byb3RvX2FoLmM6CUFIIElQU2VjIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQgZm9yIElQVlMKLSAqCi0gKiBBdXRob3JzOglKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+LCBGZWJydWFyeSAyMDAyCi0gKgkJV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQl2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qIFRPRE86Ci0KLXN0cnVjdCBpc2FrbXBfaGRyIHsKLQlfX3U4CQlpY29va2llWzhdOwotCV9fdTgJCXJjb29raWVbOF07Ci0JX191OAkJbnA7Ci0JX191OAkJdmVyc2lvbjsKLQlfX3U4CQl4Y2hndHlwZTsKLQlfX3U4CQlmbGFnczsKLQlfX3UzMgkJbXNnaWQ7Ci0JX191MzIJCWxlbmd0aDsKLX07Ci0KLSovCi0KLSNkZWZpbmUgUE9SVF9JU0FLTVAJNTAwCi0KLQotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLWFoX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLAotCSAgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAotCSAgICAgICBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0KLQlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewotCQljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KElQUFJPVE9fVURQLAotCQkJCSAgICAgICBpcGgtPnNhZGRyLAotCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCksCi0JCQkJICAgICAgIGlwaC0+ZGFkZHIsCi0JCQkJICAgICAgIGh0b25zKFBPUlRfSVNBS01QKSk7Ci0JfSBlbHNlIHsKLQkJY3AgPSBpcF92c19jb25uX2luX2dldChJUFBST1RPX1VEUCwKLQkJCQkgICAgICAgaXBoLT5kYWRkciwKLQkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApLAotCQkJCSAgICAgICBpcGgtPnNhZGRyLAotCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCkpOwotCX0KLQotCWlmICghY3ApIHsKLQkJLyoKLQkJICogV2UgYXJlIG5vdCBzdXJlIGlmIHRoZSBwYWNrZXQgaXMgZnJvbSBvdXIKLQkJICogc2VydmljZSwgc28gb3VyIGNvbm5fc2NoZWR1bGUgaG9vayBzaG91bGQgcmV0dXJuIE5GX0FDQ0VQVAotCQkgKi8KLQkJSVBfVlNfREJHKDEyLCAiVW5rbm93biBJU0FLTVAgZW50cnkgZm9yIG91dGluIHBhY2tldCAiCi0JCQkgICIlcyVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldVxuIiwKLQkJCSAgaW52ZXJzZSA/ICJJQ01QKyIgOiAiIiwKLQkJCSAgcHAtPm5hbWUsCi0JCQkgIE5JUFFVQUQoaXBoLT5zYWRkciksCi0JCQkgIE5JUFFVQUQoaXBoLT5kYWRkcikpOwotCX0KLQotCXJldHVybiBjcDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgotYWhfY29ubl9vdXRfZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0KLQlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewotCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKLQkJCQkJaXBoLT5zYWRkciwKLQkJCQkJaHRvbnMoUE9SVF9JU0FLTVApLAotCQkJCQlpcGgtPmRhZGRyLAotCQkJCQlodG9ucyhQT1JUX0lTQUtNUCkpOwotCX0gZWxzZSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KElQUFJPVE9fVURQLAotCQkJCQlpcGgtPmRhZGRyLAotCQkJCQlodG9ucyhQT1JUX0lTQUtNUCksCi0JCQkJCWlwaC0+c2FkZHIsCi0JCQkJCWh0b25zKFBPUlRfSVNBS01QKSk7Ci0JfQotCi0JaWYgKCFjcCkgewotCQlJUF9WU19EQkcoMTIsICJVbmtub3duIElTQUtNUCBlbnRyeSBmb3IgaW5vdXQgcGFja2V0ICIKLQkJCSAgIiVzJXMgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1XG4iLAotCQkJICBpbnZlcnNlID8gIklDTVArIiA6ICIiLAotCQkJICBwcC0+bmFtZSwKLQkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSwKLQkJCSAgTklQUVVBRChpcGgtPmRhZGRyKSk7Ci0JfQotCi0JcmV0dXJuIGNwOwotfQotCi0KLXN0YXRpYyBpbnQKLWFoX2Nvbm5fc2NoZWR1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCSBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKQotewotCS8qCi0JICogQUggaXMgb25seSByZWxhdGVkIHRyYWZmaWMuIFBhc3MgdGhlIHBhY2tldCB0byBJUCBzdGFjay4KLQkgKi8KLQkqdmVyZGljdCA9IE5GX0FDQ0VQVDsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZAotYWhfZGVidWdfcGFja2V0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCWludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKLXsKLQljaGFyIGJ1ZlsyNTZdOwotCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7Ci0KLQlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7Ci0JaWYgKGloID09IE5VTEwpCi0JCXNwcmludGYoYnVmLCAiJXMgVFJVTkNBVEVEIiwgcHAtPm5hbWUpOwotCWVsc2UKLQkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUiLAotCQkJcHAtPm5hbWUsIE5JUFFVQUQoaWgtPnNhZGRyKSwKLQkJCU5JUFFVQUQoaWgtPmRhZGRyKSk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiSVBWUzogJXM6ICVzXG4iLCBtc2csIGJ1Zik7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWhfaW5pdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCS8qIG5vdGhpbmcgdG8gZG8gbm93ICovCi19Ci0KLQotc3RhdGljIHZvaWQgYWhfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCS8qIG5vdGhpbmcgdG8gZG8gbm93ICovCi19Ci0KLQotc3RydWN0IGlwX3ZzX3Byb3RvY29sIGlwX3ZzX3Byb3RvY29sX2FoID0gewotCS5uYW1lID0JCQkiQUgiLAotCS5wcm90b2NvbCA9CQlJUFBST1RPX0FILAotCS5udW1fc3RhdGVzID0JCTEsCi0JLmRvbnRfZGVmcmFnID0JCTEsCi0JLmluaXQgPQkJCWFoX2luaXQsCi0JLmV4aXQgPQkJCWFoX2V4aXQsCi0JLmNvbm5fc2NoZWR1bGUgPQlhaF9jb25uX3NjaGVkdWxlLAotCS5jb25uX2luX2dldCA9CQlhaF9jb25uX2luX2dldCwKLQkuY29ubl9vdXRfZ2V0ID0JCWFoX2Nvbm5fb3V0X2dldCwKLQkuc25hdF9oYW5kbGVyID0JCU5VTEwsCi0JLmRuYXRfaGFuZGxlciA9CQlOVUxMLAotCS5jc3VtX2NoZWNrID0JCU5VTEwsCi0JLnN0YXRlX3RyYW5zaXRpb24gPQlOVUxMLAotCS5yZWdpc3Rlcl9hcHAgPQkJTlVMTCwKLQkudW5yZWdpc3Rlcl9hcHAgPQlOVUxMLAotCS5hcHBfY29ubl9iaW5kID0JTlVMTCwKLQkuZGVidWdfcGFja2V0ID0JCWFoX2RlYnVnX3BhY2tldCwKLQkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAkJLyogSVNBS01QICovCi0JLnNldF9zdGF0ZV90aW1lb3V0ID0JTlVMTCwKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2VzcC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19lc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkNzBjOC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBpcF92c19wcm90b19lc3AuYzoJRVNQIElQU2VjIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQgZm9yIElQVlMKLSAqCi0gKiBBdXRob3JzOglKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+LCBGZWJydWFyeSAyMDAyCi0gKgkJV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQl2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qIFRPRE86Ci0KLXN0cnVjdCBpc2FrbXBfaGRyIHsKLQlfX3U4CQlpY29va2llWzhdOwotCV9fdTgJCXJjb29raWVbOF07Ci0JX191OAkJbnA7Ci0JX191OAkJdmVyc2lvbjsKLQlfX3U4CQl4Y2hndHlwZTsKLQlfX3U4CQlmbGFnczsKLQlfX3UzMgkJbXNnaWQ7Ci0JX191MzIJCWxlbmd0aDsKLX07Ci0KLSovCi0KLSNkZWZpbmUgUE9SVF9JU0FLTVAJNTAwCi0KLQotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLWVzcF9jb25uX2luX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJdW5zaWduZWQgaW50IHByb3RvX29mZiwKLQkJaW50IGludmVyc2UpCi17Ci0Jc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwotCi0JaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKLQkJY3AgPSBpcF92c19jb25uX2luX2dldChJUFBST1RPX1VEUCwKLQkJCQkgICAgICAgaXBoLT5zYWRkciwKLQkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApLAotCQkJCSAgICAgICBpcGgtPmRhZGRyLAotCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCkpOwotCX0gZWxzZSB7Ci0JCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoSVBQUk9UT19VRFAsCi0JCQkJICAgICAgIGlwaC0+ZGFkZHIsCi0JCQkJICAgICAgIGh0b25zKFBPUlRfSVNBS01QKSwKLQkJCQkgICAgICAgaXBoLT5zYWRkciwKLQkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApKTsKLQl9Ci0KLQlpZiAoIWNwKSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBub3Qgc3VyZSBpZiB0aGUgcGFja2V0IGlzIGZyb20gb3VyCi0JCSAqIHNlcnZpY2UsIHNvIG91ciBjb25uX3NjaGVkdWxlIGhvb2sgc2hvdWxkIHJldHVybiBORl9BQ0NFUFQKLQkJICovCi0JCUlQX1ZTX0RCRygxMiwgIlVua25vd24gSVNBS01QIGVudHJ5IGZvciBvdXRpbiBwYWNrZXQgIgotCQkJICAiJXMlcyAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCi0JCQkgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCi0JCQkgIHBwLT5uYW1lLAotCQkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLAotCQkJICBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKLQl9Ci0KLQlyZXR1cm4gY3A7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLWVzcF9jb25uX291dF9nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKLQkJIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0KLQlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewotCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKLQkJCQkJaXBoLT5zYWRkciwKLQkJCQkJaHRvbnMoUE9SVF9JU0FLTVApLAotCQkJCQlpcGgtPmRhZGRyLAotCQkJCQlodG9ucyhQT1JUX0lTQUtNUCkpOwotCX0gZWxzZSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KElQUFJPVE9fVURQLAotCQkJCQlpcGgtPmRhZGRyLAotCQkJCQlodG9ucyhQT1JUX0lTQUtNUCksCi0JCQkJCWlwaC0+c2FkZHIsCi0JCQkJCWh0b25zKFBPUlRfSVNBS01QKSk7Ci0JfQotCi0JaWYgKCFjcCkgewotCQlJUF9WU19EQkcoMTIsICJVbmtub3duIElTQUtNUCBlbnRyeSBmb3IgaW5vdXQgcGFja2V0ICIKLQkJCSAgIiVzJXMgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1XG4iLAotCQkJICBpbnZlcnNlID8gIklDTVArIiA6ICIiLAotCQkJICBwcC0+bmFtZSwKLQkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSwKLQkJCSAgTklQUVVBRChpcGgtPmRhZGRyKSk7Ci0JfQotCi0JcmV0dXJuIGNwOwotfQotCi0KLXN0YXRpYyBpbnQKLWVzcF9jb25uX3NjaGVkdWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCSAgaW50ICp2ZXJkaWN0LCBzdHJ1Y3QgaXBfdnNfY29ubiAqKmNwcCkKLXsKLQkvKgotCSAqIEVTUCBpcyBvbmx5IHJlbGF0ZWQgdHJhZmZpYy4gUGFzcyB0aGUgcGFja2V0IHRvIElQIHN0YWNrLgotCSAqLwotCSp2ZXJkaWN0ID0gTkZfQUNDRVBUOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkCi1lc3BfZGVidWdfcGFja2V0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICptc2cpCi17Ci0JY2hhciBidWZbMjU2XTsKLQlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOwotCi0JaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXBoKSwgJl9pcGgpOwotCWlmIChpaCA9PSBOVUxMKQotCQlzcHJpbnRmKGJ1ZiwgIiVzIFRSVU5DQVRFRCIsIHBwLT5uYW1lKTsKLQllbHNlCi0JCXNwcmludGYoYnVmLCAiJXMgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IiwKLQkJCXBwLT5uYW1lLCBOSVBRVUFEKGloLT5zYWRkciksCi0JCQlOSVBRVUFEKGloLT5kYWRkcikpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIklQVlM6ICVzOiAlc1xuIiwgbXNnLCBidWYpOwotfQotCi0KLXN0YXRpYyB2b2lkIGVzcF9pbml0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0JLyogbm90aGluZyB0byBkbyBub3cgKi8KLX0KLQotCi1zdGF0aWMgdm9pZCBlc3BfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCS8qIG5vdGhpbmcgdG8gZG8gbm93ICovCi19Ci0KLQotc3RydWN0IGlwX3ZzX3Byb3RvY29sIGlwX3ZzX3Byb3RvY29sX2VzcCA9IHsKLQkubmFtZSA9CQkJIkVTUCIsCi0JLnByb3RvY29sID0JCUlQUFJPVE9fRVNQLAotCS5udW1fc3RhdGVzID0JCTEsCi0JLmRvbnRfZGVmcmFnID0JCTEsCi0JLmluaXQgPQkJCWVzcF9pbml0LAotCS5leGl0ID0JCQllc3BfZXhpdCwKLQkuY29ubl9zY2hlZHVsZSA9CWVzcF9jb25uX3NjaGVkdWxlLAotCS5jb25uX2luX2dldCA9CQllc3BfY29ubl9pbl9nZXQsCi0JLmNvbm5fb3V0X2dldCA9CQllc3BfY29ubl9vdXRfZ2V0LAotCS5zbmF0X2hhbmRsZXIgPQkJTlVMTCwKLQkuZG5hdF9oYW5kbGVyID0JCU5VTEwsCi0JLmNzdW1fY2hlY2sgPQkJTlVMTCwKLQkuc3RhdGVfdHJhbnNpdGlvbiA9CU5VTEwsCi0JLnJlZ2lzdGVyX2FwcCA9CQlOVUxMLAotCS51bnJlZ2lzdGVyX2FwcCA9CU5VTEwsCi0JLmFwcF9jb25uX2JpbmQgPQlOVUxMLAotCS5kZWJ1Z19wYWNrZXQgPQkJZXNwX2RlYnVnX3BhY2tldCwKLQkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAkJLyogSVNBS01QICovCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZWE0NjcuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYworKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vKgotICogaXBfdnNfcHJvdG9fdGNwLmM6CVRDUCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IGZvciBJUFZTCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KLSAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+ICAgICAgICAgICAgICAgICAgLyogZm9yIHRjcGhkciAqLwotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4gICAgICAgICAgICAgICAgICAgIC8qIGZvciBjc3VtX3RjcHVkcF9tYWdpYyAqLwotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KLQotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgotdGNwX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKLXsKLQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKLQotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b19vZmYsIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwotCWlmIChwcHRyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5faW5fZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCSBpcGgtPnNhZGRyLCBwcHRyWzBdLAotCQkJCQkgaXBoLT5kYWRkciwgcHB0clsxXSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGlwX3ZzX2Nvbm5faW5fZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCSBpcGgtPmRhZGRyLCBwcHRyWzFdLAotCQkJCQkgaXBoLT5zYWRkciwgcHB0clswXSk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgotdGNwX2Nvbm5fb3V0X2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgY29uc3Qgc3RydWN0IGlwaGRyICppcGgsIHVuc2lnbmVkIGludCBwcm90b19vZmYsIGludCBpbnZlcnNlKQotewotCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwotCi0JcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvX29mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7Ci0JaWYgKHBwdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewotCQlyZXR1cm4gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAgaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkJICBpcGgtPmRhZGRyLCBwcHRyWzFdKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCSAgaXBoLT5kYWRkciwgcHB0clsxXSwKLQkJCQkJICBpcGgtPnNhZGRyLCBwcHRyWzBdKTsKLQl9Ci19Ci0KLQotc3RhdGljIGludAotdGNwX2Nvbm5fc2NoZWR1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCi17Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKSB7Ci0JCSp2ZXJkaWN0ID0gTkZfRFJPUDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHRoLT5zeW4gJiYKLQkgICAgKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bWFyaywgaXBfaGRyKHNrYiktPnByb3RvY29sLAotCQkJCSAgICAgaXBfaGRyKHNrYiktPmRhZGRyLCB0aC0+ZGVzdCkpKSB7Ci0JCWlmIChpcF92c190b2Ryb3AoKSkgewotCQkJLyoKLQkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgotCQkJICogV2UgaGF2ZSB0byBkcm9wIHRoaXMgcGFja2V0IDooCi0JCQkgKi8KLQkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7Ci0JCQkqdmVyZGljdCA9IE5GX0RST1A7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qCi0JCSAqIExldCB0aGUgdmlydHVhbCBzZXJ2ZXIgc2VsZWN0IGEgcmVhbCBzZXJ2ZXIgZm9yIHRoZQotCQkgKiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgY3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KLQkJICovCi0JCSpjcHAgPSBpcF92c19zY2hlZHVsZShzdmMsIHNrYik7Ci0JCWlmICghKmNwcCkgewotCQkJKnZlcmRpY3QgPSBpcF92c19sZWF2ZShzdmMsIHNrYiwgcHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkCi10Y3BfZmFzdF9jc3VtX3VwZGF0ZShzdHJ1Y3QgdGNwaGRyICp0Y3BoLCBfX2JlMzIgb2xkaXAsIF9fYmUzMiBuZXdpcCwKLQkJICAgICBfX2JlMTYgb2xkcG9ydCwgX19iZTE2IG5ld3BvcnQpCi17Ci0JdGNwaC0+Y2hlY2sgPQotCQljc3VtX2ZvbGQoaXBfdnNfY2hlY2tfZGlmZjQob2xkaXAsIG5ld2lwLAotCQkJCSBpcF92c19jaGVja19kaWZmMihvbGRwb3J0LCBuZXdwb3J0LAotCQkJCQkJfmNzdW1fdW5mb2xkKHRjcGgtPmNoZWNrKSkpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci10Y3Bfc25hdF9oYW5kbGVyKHN0cnVjdCBza19idWZmICpza2IsCi0JCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0Jc3RydWN0IHRjcGhkciAqdGNwaDsKLQljb25zdCB1bnNpZ25lZCBpbnQgdGNwaG9mZiA9IGlwX2hkcmxlbihza2IpOwotCi0JLyogY3N1bV9jaGVjayByZXF1aXJlcyB1bnNoYXJlZCBza2IgKi8KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgdGNwaG9mZitzaXplb2YoKnRjcGgpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodW5saWtlbHkoY3AtPmFwcCAhPSBOVUxMKSkgewotCQkvKiBTb21lIGNoZWNrcyBiZWZvcmUgbWFuZ2xpbmcgKi8KLQkJaWYgKHBwLT5jc3VtX2NoZWNrICYmICFwcC0+Y3N1bV9jaGVjayhza2IsIHBwKSkKLQkJCXJldHVybiAwOwotCi0JCS8qIENhbGwgYXBwbGljYXRpb24gaGVscGVyIGlmIG5lZWRlZCAqLwotCQlpZiAoIWlwX3ZzX2FwcF9wa3Rfb3V0KGNwLCBza2IpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JdGNwaCA9ICh2b2lkICopaXBfaGRyKHNrYikgKyB0Y3Bob2ZmOwotCXRjcGgtPnNvdXJjZSA9IGNwLT52cG9ydDsKLQotCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW1zICovCi0JaWYgKCFjcC0+YXBwKSB7Ci0JCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLwotCQl0Y3BfZmFzdF9jc3VtX3VwZGF0ZSh0Y3BoLCBjcC0+ZGFkZHIsIGNwLT52YWRkciwKLQkJCQkgICAgIGNwLT5kcG9ydCwgY3AtPnZwb3J0KTsKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCX0gZWxzZSB7Ci0JCS8qIGZ1bGwgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KLQkJdGNwaC0+Y2hlY2sgPSAwOwotCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB0Y3Bob2ZmLCBza2ItPmxlbiAtIHRjcGhvZmYsIDApOwotCQl0Y3BoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT52YWRkciwgY3AtPmNhZGRyLAotCQkJCQkJc2tiLT5sZW4gLSB0Y3Bob2ZmLAotCQkJCQkJY3AtPnByb3RvY29sLCBza2ItPmNzdW0pOwotCQlJUF9WU19EQkcoMTEsICJPLXBrdDogJXMgTy1jc3VtPSVkICgrJXpkKVxuIiwKLQkJCSAgcHAtPm5hbWUsIHRjcGgtPmNoZWNrLAotCQkJICAoY2hhciopJih0Y3BoLT5jaGVjaykgLSAoY2hhciopdGNwaCk7Ci0JfQotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLXRjcF9kbmF0X2hhbmRsZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKLXsKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwotCWNvbnN0IHVuc2lnbmVkIGludCB0Y3Bob2ZmID0gaXBfaGRybGVuKHNrYik7Ci0KLQkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCB0Y3Bob2ZmK3NpemVvZigqdGNwaCkpKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseShjcC0+YXBwICE9IE5VTEwpKSB7Ci0JCS8qIFNvbWUgY2hlY2tzIGJlZm9yZSBtYW5nbGluZyAqLwotCQlpZiAocHAtPmNzdW1fY2hlY2sgJiYgIXBwLT5jc3VtX2NoZWNrKHNrYiwgcHApKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyoKLQkJICoJQXR0ZW1wdCBpcF92c19hcHAgY2FsbC4KLQkJICoJSXQgd2lsbCBmaXggaXBfdnNfY29ubiBhbmQgaXBoIGFja19zZXEgc3R1ZmYKLQkJICovCi0JCWlmICghaXBfdnNfYXBwX3BrdF9pbihjcCwgc2tiKSkKLQkJCXJldHVybiAwOwotCX0KLQotCXRjcGggPSAodm9pZCAqKWlwX2hkcihza2IpICsgdGNwaG9mZjsKLQl0Y3BoLT5kZXN0ID0gY3AtPmRwb3J0OwotCi0JLyoKLQkgKglBZGp1c3QgVENQIGNoZWNrc3VtcwotCSAqLwotCWlmICghY3AtPmFwcCkgewotCQkvKiBPbmx5IHBvcnQgYW5kIGFkZHIgYXJlIGNoYW5nZWQsIGRvIGZhc3QgY3N1bSB1cGRhdGUgKi8KLQkJdGNwX2Zhc3RfY3N1bV91cGRhdGUodGNwaCwgY3AtPnZhZGRyLCBjcC0+ZGFkZHIsCi0JCQkJICAgICBjcC0+dnBvcnQsIGNwLT5kcG9ydCk7Ci0JCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKLQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQl9IGVsc2UgewotCQkvKiBmdWxsIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCi0JCXRjcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdGNwaG9mZiwgc2tiLT5sZW4gLSB0Y3Bob2ZmLCAwKTsKLQkJdGNwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhjcC0+Y2FkZHIsIGNwLT5kYWRkciwKLQkJCQkJCXNrYi0+bGVuIC0gdGNwaG9mZiwKLQkJCQkJCWNwLT5wcm90b2NvbCwgc2tiLT5jc3VtKTsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotdGNwX2NzdW1fY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLQljb25zdCB1bnNpZ25lZCBpbnQgdGNwaG9mZiA9IGlwX2hkcmxlbihza2IpOwotCi0Jc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewotCWNhc2UgQ0hFQ0tTVU1fTk9ORToKLQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdGNwaG9mZiwgc2tiLT5sZW4gLSB0Y3Bob2ZmLCAwKTsKLQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQlpZiAoY3N1bV90Y3B1ZHBfbWFnaWMoaXBfaGRyKHNrYiktPnNhZGRyLCBpcF9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkJICAgICAgc2tiLT5sZW4gLSB0Y3Bob2ZmLAotCQkJCSAgICAgIGlwX2hkcihza2IpLT5wcm90b2NvbCwgc2tiLT5jc3VtKSkgewotCQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLAotCQkJCQkgIkZhaWxlZCBjaGVja3N1bSBmb3IiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIE5vIG5lZWQgdG8gY2hlY2tzdW0uICovCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiAxOwotfQotCi0KLSNkZWZpbmUgVENQX0RJUl9JTlBVVAkJMAotI2RlZmluZSBUQ1BfRElSX09VVFBVVAkJNAotI2RlZmluZSBUQ1BfRElSX0lOUFVUX09OTFkJOAotCi1zdGF0aWMgY29uc3QgaW50IHRjcF9zdGF0ZV9vZmZbSVBfVlNfRElSX0xBU1RdID0gewotCVtJUF9WU19ESVJfSU5QVVRdCQk9CVRDUF9ESVJfSU5QVVQsCi0JW0lQX1ZTX0RJUl9PVVRQVVRdCQk9CVRDUF9ESVJfT1VUUFVULAotCVtJUF9WU19ESVJfSU5QVVRfT05MWV0JCT0JVENQX0RJUl9JTlBVVF9PTkxZLAotfTsKLQotLyoKLSAqCVRpbWVvdXQgdGFibGVbc3RhdGVdCi0gKi8KLXN0YXRpYyBpbnQgdGNwX3RpbWVvdXRzW0lQX1ZTX1RDUF9TX0xBU1QrMV0gPSB7Ci0JW0lQX1ZTX1RDUF9TX05PTkVdCQk9CTIqSFosCi0JW0lQX1ZTX1RDUF9TX0VTVEFCTElTSEVEXQk9CTE1KjYwKkhaLAotCVtJUF9WU19UQ1BfU19TWU5fU0VOVF0JCT0JMio2MCpIWiwKLQlbSVBfVlNfVENQX1NfU1lOX1JFQ1ZdCQk9CTEqNjAqSFosCi0JW0lQX1ZTX1RDUF9TX0ZJTl9XQUlUXQkJPQkyKjYwKkhaLAotCVtJUF9WU19UQ1BfU19USU1FX1dBSVRdCQk9CTIqNjAqSFosCi0JW0lQX1ZTX1RDUF9TX0NMT1NFXQkJPQkxMCpIWiwKLQlbSVBfVlNfVENQX1NfQ0xPU0VfV0FJVF0JPQk2MCpIWiwKLQlbSVBfVlNfVENQX1NfTEFTVF9BQ0tdCQk9CTMwKkhaLAotCVtJUF9WU19UQ1BfU19MSVNURU5dCQk9CTIqNjAqSFosCi0JW0lQX1ZTX1RDUF9TX1NZTkFDS10JCT0JMTIwKkhaLAotCVtJUF9WU19UQ1BfU19MQVNUXQkJPQkyKkhaLAotfTsKLQotc3RhdGljIGNoYXIgKiB0Y3Bfc3RhdGVfbmFtZV90YWJsZVtJUF9WU19UQ1BfU19MQVNUKzFdID0gewotCVtJUF9WU19UQ1BfU19OT05FXQkJPQkiTk9ORSIsCi0JW0lQX1ZTX1RDUF9TX0VTVEFCTElTSEVEXQk9CSJFU1RBQkxJU0hFRCIsCi0JW0lQX1ZTX1RDUF9TX1NZTl9TRU5UXQkJPQkiU1lOX1NFTlQiLAotCVtJUF9WU19UQ1BfU19TWU5fUkVDVl0JCT0JIlNZTl9SRUNWIiwKLQlbSVBfVlNfVENQX1NfRklOX1dBSVRdCQk9CSJGSU5fV0FJVCIsCi0JW0lQX1ZTX1RDUF9TX1RJTUVfV0FJVF0JCT0JIlRJTUVfV0FJVCIsCi0JW0lQX1ZTX1RDUF9TX0NMT1NFXQkJPQkiQ0xPU0UiLAotCVtJUF9WU19UQ1BfU19DTE9TRV9XQUlUXQk9CSJDTE9TRV9XQUlUIiwKLQlbSVBfVlNfVENQX1NfTEFTVF9BQ0tdCQk9CSJMQVNUX0FDSyIsCi0JW0lQX1ZTX1RDUF9TX0xJU1RFTl0JCT0JIkxJU1RFTiIsCi0JW0lQX1ZTX1RDUF9TX1NZTkFDS10JCT0JIlNZTkFDSyIsCi0JW0lQX1ZTX1RDUF9TX0xBU1RdCQk9CSJCVUchIiwKLX07Ci0KLSNkZWZpbmUgc05PIElQX1ZTX1RDUF9TX05PTkUKLSNkZWZpbmUgc0VTIElQX1ZTX1RDUF9TX0VTVEFCTElTSEVECi0jZGVmaW5lIHNTUyBJUF9WU19UQ1BfU19TWU5fU0VOVAotI2RlZmluZSBzU1IgSVBfVlNfVENQX1NfU1lOX1JFQ1YKLSNkZWZpbmUgc0ZXIElQX1ZTX1RDUF9TX0ZJTl9XQUlUCi0jZGVmaW5lIHNUVyBJUF9WU19UQ1BfU19USU1FX1dBSVQKLSNkZWZpbmUgc0NMIElQX1ZTX1RDUF9TX0NMT1NFCi0jZGVmaW5lIHNDVyBJUF9WU19UQ1BfU19DTE9TRV9XQUlUCi0jZGVmaW5lIHNMQSBJUF9WU19UQ1BfU19MQVNUX0FDSwotI2RlZmluZSBzTEkgSVBfVlNfVENQX1NfTElTVEVOCi0jZGVmaW5lIHNTQSBJUF9WU19UQ1BfU19TWU5BQ0sKLQotc3RydWN0IHRjcF9zdGF0ZXNfdCB7Ci0JaW50IG5leHRfc3RhdGVbSVBfVlNfVENQX1NfTEFTVF07Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIHRjcF9zdGF0ZV9uYW1lKGludCBzdGF0ZSkKLXsKLQlpZiAoc3RhdGUgPj0gSVBfVlNfVENQX1NfTEFTVCkKLQkJcmV0dXJuICJFUlIhIjsKLQlyZXR1cm4gdGNwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdID8gdGNwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdIDogIj8iOwotfQotCi1zdGF0aWMgc3RydWN0IHRjcF9zdGF0ZXNfdCB0Y3Bfc3RhdGVzIFtdID0gewotLyoJSU5QVVQgKi8KLS8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLwotLypzeW4qLyB7e3NTUiwgc0VTLCBzRVMsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSIH19LAotLypmaW4qLyB7e3NDTCwgc0NXLCBzU1MsIHNUVywgc1RXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1RXIH19LAotLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc0VTIH19LAotLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc1NSIH19LAotCi0vKglPVVRQVVQgKi8KLS8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLwotLypzeW4qLyB7e3NTUywgc0VTLCBzU1MsIHNTUiwgc1NTLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNMSSwgc1NSIH19LAotLypmaW4qLyB7e3NUVywgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc1RXLCBzTEEsIHNMSSwgc1RXIH19LAotLyphY2sqLyB7e3NFUywgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNFUywgc0VTIH19LAotLypyc3QqLyB7e3NDTCwgc0NMLCBzU1MsIHNDTCwgc0NMLCBzVFcsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMIH19LAotCi0vKglJTlBVVC1PTkxZICovCi0vKiAgICAgICAgc05PLCBzRVMsIHNTUywgc1NSLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzU0EJKi8KLS8qc3luKi8ge3tzU1IsIHNFUywgc0VTLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiB9fSwKLS8qZmluKi8ge3tzQ0wsIHNGVywgc1NTLCBzVFcsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNUVyB9fSwKLS8qYWNrKi8ge3tzQ0wsIHNFUywgc1NTLCBzRVMsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0NMLCBzTEksIHNFUyB9fSwKLS8qcnN0Ki8ge3tzQ0wsIHNDTCwgc0NMLCBzU1IsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0xBLCBzTEksIHNDTCB9fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNwX3N0YXRlc190IHRjcF9zdGF0ZXNfZG9zIFtdID0gewotLyoJSU5QVVQgKi8KLS8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLwotLypzeW4qLyB7e3NTUiwgc0VTLCBzRVMsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NBIH19LAotLypmaW4qLyB7e3NDTCwgc0NXLCBzU1MsIHNUVywgc1RXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBIH19LAotLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc1NBIH19LAotLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc0NMIH19LAotCi0vKglPVVRQVVQgKi8KLS8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLwotLypzeW4qLyB7e3NTUywgc0VTLCBzU1MsIHNTQSwgc1NTLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNMSSwgc1NBIH19LAotLypmaW4qLyB7e3NUVywgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc1RXLCBzTEEsIHNMSSwgc1RXIH19LAotLyphY2sqLyB7e3NFUywgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNFUywgc0VTIH19LAotLypyc3QqLyB7e3NDTCwgc0NMLCBzU1MsIHNDTCwgc0NMLCBzVFcsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMIH19LAotCi0vKglJTlBVVC1PTkxZICovCi0vKiAgICAgICAgc05PLCBzRVMsIHNTUywgc1NSLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzU0EJKi8KLS8qc3luKi8ge3tzU0EsIHNFUywgc0VTLCBzU1IsIHNTQSwgc1NBLCBzU0EsIHNTQSwgc1NBLCBzU0EsIHNTQSB9fSwKLS8qZmluKi8ge3tzQ0wsIHNGVywgc1NTLCBzVFcsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNUVyB9fSwKLS8qYWNrKi8ge3tzQ0wsIHNFUywgc1NTLCBzRVMsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0NMLCBzTEksIHNFUyB9fSwKLS8qcnN0Ki8ge3tzQ0wsIHNDTCwgc0NMLCBzU1IsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0xBLCBzTEksIHNDTCB9fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNwX3N0YXRlc190ICp0Y3Bfc3RhdGVfdGFibGUgPSB0Y3Bfc3RhdGVzOwotCi0KLXN0YXRpYyB2b2lkIHRjcF90aW1lb3V0X2NoYW5nZShzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBpbnQgZmxhZ3MpCi17Ci0JaW50IG9uID0gKGZsYWdzICYgMSk7CQkvKiBzZWN1cmVfdGNwICovCi0KLQkvKgotCSoqIEZJWE1FOiBjaGFuZ2Ugc2VjdXJlX3RjcCB0byBpbmRlcGVuZGVudCBzeXNjdGwgdmFyCi0JKiogb3IgbWFrZSBpdCBwZXItc2VydmljZSBvciBwZXItYXBwIGJlY2F1c2UgaXQgaXMgdmFsaWQKLQkqKiBmb3IgbW9zdCBpZiBub3QgZm9yIGFsbCBvZiB0aGUgYXBwbGljYXRpb25zLiBTb21ldGhpbmcKLQkqKiBsaWtlICJjYXBhYmlsaXRpZXMiIChmbGFncykgZm9yIGVhY2ggb2JqZWN0LgotCSovCi0JdGNwX3N0YXRlX3RhYmxlID0gKG9uPyB0Y3Bfc3RhdGVzX2RvcyA6IHRjcF9zdGF0ZXMpOwotfQotCi1zdGF0aWMgaW50Ci10Y3Bfc2V0X3N0YXRlX3RpbWVvdXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY2hhciAqc25hbWUsIGludCB0bykKLXsKLQlyZXR1cm4gaXBfdnNfc2V0X3N0YXRlX3RpbWVvdXQocHAtPnRpbWVvdXRfdGFibGUsIElQX1ZTX1RDUF9TX0xBU1QsCi0JCQkJICAgICAgIHRjcF9zdGF0ZV9uYW1lX3RhYmxlLCBzbmFtZSwgdG8pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0Y3Bfc3RhdGVfaWR4KHN0cnVjdCB0Y3BoZHIgKnRoKQotewotCWlmICh0aC0+cnN0KQotCQlyZXR1cm4gMzsKLQlpZiAodGgtPnN5bikKLQkJcmV0dXJuIDA7Ci0JaWYgKHRoLT5maW4pCi0JCXJldHVybiAxOwotCWlmICh0aC0+YWNrKQotCQlyZXR1cm4gMjsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3RjcF9zdGF0ZShzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCi0JICAgICAgaW50IGRpcmVjdGlvbiwgc3RydWN0IHRjcGhkciAqdGgpCi17Ci0JaW50IHN0YXRlX2lkeDsKLQlpbnQgbmV3X3N0YXRlID0gSVBfVlNfVENQX1NfQ0xPU0U7Ci0JaW50IHN0YXRlX29mZiA9IHRjcF9zdGF0ZV9vZmZbZGlyZWN0aW9uXTsKLQotCS8qCi0JICogICAgVXBkYXRlIHN0YXRlIG9mZnNldCB0byBJTlBVVF9PTkxZIGlmIG5lY2Vzc2FyeQotCSAqICAgIG9yIGRlbGV0ZSBOT19PVVRQVVQgZmxhZyBpZiBvdXRwdXQgcGFja2V0IGRldGVjdGVkCi0JICovCi0JaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT09VVFBVVCkgewotCQlpZiAoc3RhdGVfb2ZmID09IFRDUF9ESVJfT1VUUFVUKQotCQkJY3AtPmZsYWdzICY9IH5JUF9WU19DT05OX0ZfTk9PVVRQVVQ7Ci0JCWVsc2UKLQkJCXN0YXRlX29mZiA9IFRDUF9ESVJfSU5QVVRfT05MWTsKLQl9Ci0KLQlpZiAoKHN0YXRlX2lkeCA9IHRjcF9zdGF0ZV9pZHgodGgpKSA8IDApIHsKLQkJSVBfVlNfREJHKDgsICJ0Y3Bfc3RhdGVfaWR4PSVkISEhXG4iLCBzdGF0ZV9pZHgpOwotCQlnb3RvIHRjcF9zdGF0ZV9vdXQ7Ci0JfQotCi0JbmV3X3N0YXRlID0gdGNwX3N0YXRlX3RhYmxlW3N0YXRlX29mZitzdGF0ZV9pZHhdLm5leHRfc3RhdGVbY3AtPnN0YXRlXTsKLQotICB0Y3Bfc3RhdGVfb3V0OgotCWlmIChuZXdfc3RhdGUgIT0gY3AtPnN0YXRlKSB7Ci0JCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gY3AtPmRlc3Q7Ci0KLQkJSVBfVlNfREJHKDgsICIlcyAlcyBbJWMlYyVjJWNdICV1LiV1LiV1LiV1OiVkLT4iCi0JCQkgICIldS4ldS4ldS4ldTolZCBzdGF0ZTogJXMtPiVzIGNvbm4tPnJlZmNudDolZFxuIiwKLQkJCSAgcHAtPm5hbWUsCi0JCQkgIChzdGF0ZV9vZmY9PVRDUF9ESVJfT1VUUFVUKT8ib3V0cHV0ICI6ImlucHV0ICIsCi0JCQkgIHRoLT5zeW4/ICdTJyA6ICcuJywKLQkJCSAgdGgtPmZpbj8gJ0YnIDogJy4nLAotCQkJICB0aC0+YWNrPyAnQScgOiAnLicsCi0JCQkgIHRoLT5yc3Q/ICdSJyA6ICcuJywKLQkJCSAgTklQUVVBRChjcC0+ZGFkZHIpLCBudG9ocyhjcC0+ZHBvcnQpLAotCQkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCi0JCQkgIHRjcF9zdGF0ZV9uYW1lKGNwLT5zdGF0ZSksCi0JCQkgIHRjcF9zdGF0ZV9uYW1lKG5ld19zdGF0ZSksCi0JCQkgIGF0b21pY19yZWFkKCZjcC0+cmVmY250KSk7Ci0JCWlmIChkZXN0KSB7Ci0JCQlpZiAoIShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSU5BQ1RJVkUpICYmCi0JCQkgICAgKG5ld19zdGF0ZSAhPSBJUF9WU19UQ1BfU19FU1RBQkxJU0hFRCkpIHsKLQkJCQlhdG9taWNfZGVjKCZkZXN0LT5hY3RpdmVjb25ucyk7Ci0JCQkJYXRvbWljX2luYygmZGVzdC0+aW5hY3Rjb25ucyk7Ci0JCQkJY3AtPmZsYWdzIHw9IElQX1ZTX0NPTk5fRl9JTkFDVElWRTsKLQkJCX0gZWxzZSBpZiAoKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkgJiYKLQkJCQkgICAobmV3X3N0YXRlID09IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSkgewotCQkJCWF0b21pY19pbmMoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKLQkJCQlhdG9taWNfZGVjKCZkZXN0LT5pbmFjdGNvbm5zKTsKLQkJCQljcC0+ZmxhZ3MgJj0gfklQX1ZTX0NPTk5fRl9JTkFDVElWRTsKLQkJCX0KLQkJfQotCX0KLQotCWNwLT50aW1lb3V0ID0gcHAtPnRpbWVvdXRfdGFibGVbY3AtPnN0YXRlID0gbmV3X3N0YXRlXTsKLX0KLQotCi0vKgotICoJSGFuZGxlIHN0YXRlIHRyYW5zaXRpb25zCi0gKi8KLXN0YXRpYyBpbnQKLXRjcF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKLQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJmNwLT5sb2NrKTsKLQlzZXRfdGNwX3N0YXRlKHBwLCBjcCwgZGlyZWN0aW9uLCB0aCk7Ci0Jc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKLQotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKglIYXNoIHRhYmxlIGZvciBUQ1AgYXBwbGljYXRpb24gaW5jYXJuYXRpb25zCi0gKi8KLSNkZWZpbmUJVENQX0FQUF9UQUJfQklUUwk0Ci0jZGVmaW5lCVRDUF9BUFBfVEFCX1NJWkUJKDEgPDwgVENQX0FQUF9UQUJfQklUUykKLSNkZWZpbmUJVENQX0FQUF9UQUJfTUFTSwkoVENQX0FQUF9UQUJfU0laRSAtIDEpCi0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHRjcF9hcHBzW1RDUF9BUFBfVEFCX1NJWkVdOwotc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfYXBwX2xvY2spOwotCi1zdGF0aWMgaW5saW5lIF9fdTE2IHRjcF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKLXsKLQlyZXR1cm4gKCgoX19mb3JjZSB1MTYpcG9ydCA+PiBUQ1BfQVBQX1RBQl9CSVRTKSBeIChfX2ZvcmNlIHUxNilwb3J0KQotCQkmIFRDUF9BUFBfVEFCX01BU0s7Ci19Ci0KLQotc3RhdGljIGludCB0Y3BfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKLXsKLQlzdHJ1Y3QgaXBfdnNfYXBwICppOwotCV9fdTE2IGhhc2g7Ci0JX19iZTE2IHBvcnQgPSBpbmMtPnBvcnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQloYXNoID0gdGNwX2FwcF9oYXNoa2V5KHBvcnQpOwotCi0Jc3Bpbl9sb2NrX2JoKCZ0Y3BfYXBwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnRjcF9hcHBzW2hhc2hdLCBwX2xpc3QpIHsKLQkJaWYgKGktPnBvcnQgPT0gcG9ydCkgewotCQkJcmV0ID0gLUVFWElTVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWxpc3RfYWRkKCZpbmMtPnBfbGlzdCwgJnRjcF9hcHBzW2hhc2hdKTsKLQlhdG9taWNfaW5jKCZpcF92c19wcm90b2NvbF90Y3AuYXBwY250KTsKLQotICBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnRjcF9hcHBfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZAotdGNwX3VucmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKLXsKLQlzcGluX2xvY2tfYmgoJnRjcF9hcHBfbG9jayk7Ci0JYXRvbWljX2RlYygmaXBfdnNfcHJvdG9jb2xfdGNwLmFwcGNudCk7Ci0JbGlzdF9kZWwoJmluYy0+cF9saXN0KTsKLQlzcGluX3VubG9ja19iaCgmdGNwX2FwcF9sb2NrKTsKLX0KLQotCi1zdGF0aWMgaW50Ci10Y3BfYXBwX2Nvbm5fYmluZChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0JaW50IGhhc2g7Ci0Jc3RydWN0IGlwX3ZzX2FwcCAqaW5jOwotCWludCByZXN1bHQgPSAwOwotCi0JLyogRGVmYXVsdCBiaW5kaW5nOiBiaW5kIGFwcCBvbmx5IGZvciBOQVQgKi8KLQlpZiAoSVBfVlNfRldEX01FVEhPRChjcCkgIT0gSVBfVlNfQ09OTl9GX01BU1EpCi0JCXJldHVybiAwOwotCi0JLyogTG9va3VwIGFwcGxpY2F0aW9uIGluY2FybmF0aW9ucyBhbmQgYmluZCB0aGUgcmlnaHQgb25lICovCi0JaGFzaCA9IHRjcF9hcHBfaGFzaGtleShjcC0+dnBvcnQpOwotCi0Jc3Bpbl9sb2NrKCZ0Y3BfYXBwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5jLCAmdGNwX2FwcHNbaGFzaF0sIHBfbGlzdCkgewotCQlpZiAoaW5jLT5wb3J0ID09IGNwLT52cG9ydCkgewotCQkJaWYgKHVubGlrZWx5KCFpcF92c19hcHBfaW5jX2dldChpbmMpKSkKLQkJCQlicmVhazsKLQkJCXNwaW5fdW5sb2NrKCZ0Y3BfYXBwX2xvY2spOwotCi0JCQlJUF9WU19EQkcoOSwgIiVzOiBCaW5kaW5nIGNvbm4gJXUuJXUuJXUuJXU6JXUtPiIKLQkJCQkgICIldS4ldS4ldS4ldToldSB0byBhcHAgJXMgb24gcG9ydCAldVxuIiwKLQkJCQkgIF9fZnVuY19fLAotCQkJCSAgTklQUVVBRChjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAotCQkJCSAgTklQUVVBRChjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAotCQkJCSAgaW5jLT5uYW1lLCBudG9ocyhpbmMtPnBvcnQpKTsKLQkJCWNwLT5hcHAgPSBpbmM7Ci0JCQlpZiAoaW5jLT5pbml0X2Nvbm4pCi0JCQkJcmVzdWx0ID0gaW5jLT5pbml0X2Nvbm4oaW5jLCBjcCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmdGNwX2FwcF9sb2NrKTsKLQotICBvdXQ6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICoJU2V0IExJU1RFTiB0aW1lb3V0LiAoaXBfdnNfY29ubl9wdXQgd2lsbCBzZXR1cCB0aW1lcikKLSAqLwotdm9pZCBpcF92c190Y3BfY29ubl9saXN0ZW4oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCXNwaW5fbG9jaygmY3AtPmxvY2spOwotCWNwLT5zdGF0ZSA9IElQX1ZTX1RDUF9TX0xJU1RFTjsKLQljcC0+dGltZW91dCA9IGlwX3ZzX3Byb3RvY29sX3RjcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1RDUF9TX0xJU1RFTl07Ci0Jc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpcF92c190Y3BfaW5pdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCUlQX1ZTX0lOSVRfSEFTSF9UQUJMRSh0Y3BfYXBwcyk7Ci0JcHAtPnRpbWVvdXRfdGFibGUgPSB0Y3BfdGltZW91dHM7Ci19Ci0KLQotc3RhdGljIHZvaWQgaXBfdnNfdGNwX2V4aXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLX0KLQotCi1zdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfdGNwID0gewotCS5uYW1lID0JCQkiVENQIiwKLQkucHJvdG9jb2wgPQkJSVBQUk9UT19UQ1AsCi0JLm51bV9zdGF0ZXMgPQkJSVBfVlNfVENQX1NfTEFTVCwKLQkuZG9udF9kZWZyYWcgPQkJMCwKLQkuYXBwY250ID0JCUFUT01JQ19JTklUKDApLAotCS5pbml0ID0JCQlpcF92c190Y3BfaW5pdCwKLQkuZXhpdCA9CQkJaXBfdnNfdGNwX2V4aXQsCi0JLnJlZ2lzdGVyX2FwcCA9CQl0Y3BfcmVnaXN0ZXJfYXBwLAotCS51bnJlZ2lzdGVyX2FwcCA9CXRjcF91bnJlZ2lzdGVyX2FwcCwKLQkuY29ubl9zY2hlZHVsZSA9CXRjcF9jb25uX3NjaGVkdWxlLAotCS5jb25uX2luX2dldCA9CQl0Y3BfY29ubl9pbl9nZXQsCi0JLmNvbm5fb3V0X2dldCA9CQl0Y3BfY29ubl9vdXRfZ2V0LAotCS5zbmF0X2hhbmRsZXIgPQkJdGNwX3NuYXRfaGFuZGxlciwKLQkuZG5hdF9oYW5kbGVyID0JCXRjcF9kbmF0X2hhbmRsZXIsCi0JLmNzdW1fY2hlY2sgPQkJdGNwX2NzdW1fY2hlY2ssCi0JLnN0YXRlX25hbWUgPQkJdGNwX3N0YXRlX25hbWUsCi0JLnN0YXRlX3RyYW5zaXRpb24gPQl0Y3Bfc3RhdGVfdHJhbnNpdGlvbiwKLQkuYXBwX2Nvbm5fYmluZCA9CXRjcF9hcHBfY29ubl9iaW5kLAotCS5kZWJ1Z19wYWNrZXQgPQkJaXBfdnNfdGNwdWRwX2RlYnVnX3BhY2tldCwKLQkudGltZW91dF9jaGFuZ2UgPQl0Y3BfdGltZW91dF9jaGFuZ2UsCi0JLnNldF9zdGF0ZV90aW1lb3V0ID0JdGNwX3NldF9zdGF0ZV90aW1lb3V0LAotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJlNWQ1Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoKLSAqIGlwX3ZzX3Byb3RvX3VkcC5jOglVRFAgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVBWUwotICoKLSAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+Ci0gKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgotdWRwX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCi0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSB7Ci0JCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoaXBoLT5wcm90b2NvbCwKLQkJCQkgICAgICAgaXBoLT5zYWRkciwgcHB0clswXSwKLQkJCQkgICAgICAgaXBoLT5kYWRkciwgcHB0clsxXSk7Ci0JfSBlbHNlIHsKLQkJY3AgPSBpcF92c19jb25uX2luX2dldChpcGgtPnByb3RvY29sLAotCQkJCSAgICAgICBpcGgtPmRhZGRyLCBwcHRyWzFdLAotCQkJCSAgICAgICBpcGgtPnNhZGRyLCBwcHRyWzBdKTsKLQl9Ci0KLQlyZXR1cm4gY3A7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKLXVkcF9jb25uX291dF9nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKLQkJIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLCBpbnQgaW52ZXJzZSkKLXsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7Ci0KLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksCi0JCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKLQlpZiAocHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChsaWtlbHkoIWludmVyc2UpKSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCWlwaC0+c2FkZHIsIHBwdHJbMF0sCi0JCQkJCWlwaC0+ZGFkZHIsIHBwdHJbMV0pOwotCX0gZWxzZSB7Ci0JCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGlwaC0+cHJvdG9jb2wsCi0JCQkJCWlwaC0+ZGFkZHIsIHBwdHJbMV0sCi0JCQkJCWlwaC0+c2FkZHIsIHBwdHJbMF0pOwotCX0KLQotCXJldHVybiBjcDsKLX0KLQotCi1zdGF0aWMgaW50Ci11ZHBfY29ubl9zY2hlZHVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAotCQkgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCi17Ci0Jc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKLQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0KLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLAotCQkJCXNpemVvZihfdWRwaCksICZfdWRwaCk7Ci0JaWYgKHVoID09IE5VTEwpIHsKLQkJKnZlcmRpY3QgPSBORl9EUk9QOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bWFyaywgaXBfaGRyKHNrYiktPnByb3RvY29sLAotCQkJCSAgICAgaXBfaGRyKHNrYiktPmRhZGRyLCB1aC0+ZGVzdCkpKSB7Ci0JCWlmIChpcF92c190b2Ryb3AoKSkgewotCQkJLyoKLQkJCSAqIEl0IHNlZW1zIHRoYXQgd2UgYXJlIHZlcnkgbG9hZGVkLgotCQkJICogV2UgaGF2ZSB0byBkcm9wIHRoaXMgcGFja2V0IDooCi0JCQkgKi8KLQkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7Ci0JCQkqdmVyZGljdCA9IE5GX0RST1A7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qCi0JCSAqIExldCB0aGUgdmlydHVhbCBzZXJ2ZXIgc2VsZWN0IGEgcmVhbCBzZXJ2ZXIgZm9yIHRoZQotCQkgKiBpbmNvbWluZyBjb25uZWN0aW9uLCBhbmQgY3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KLQkJICovCi0JCSpjcHAgPSBpcF92c19zY2hlZHVsZShzdmMsIHNrYik7Ci0JCWlmICghKmNwcCkgewotCQkJKnZlcmRpY3QgPSBpcF92c19sZWF2ZShzdmMsIHNrYiwgcHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkCi11ZHBfZmFzdF9jc3VtX3VwZGF0ZShzdHJ1Y3QgdWRwaGRyICp1aGRyLCBfX2JlMzIgb2xkaXAsIF9fYmUzMiBuZXdpcCwKLQkJICAgICBfX2JlMTYgb2xkcG9ydCwgX19iZTE2IG5ld3BvcnQpCi17Ci0JdWhkci0+Y2hlY2sgPQotCQljc3VtX2ZvbGQoaXBfdnNfY2hlY2tfZGlmZjQob2xkaXAsIG5ld2lwLAotCQkJCSBpcF92c19jaGVja19kaWZmMihvbGRwb3J0LCBuZXdwb3J0LAotCQkJCQl+Y3N1bV91bmZvbGQodWhkci0+Y2hlY2spKSkpOwotCWlmICghdWhkci0+Y2hlY2spCi0JCXVoZHItPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7Ci19Ci0KLXN0YXRpYyBpbnQKLXVkcF9zbmF0X2hhbmRsZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKLXsKLQlzdHJ1Y3QgdWRwaGRyICp1ZHBoOwotCWNvbnN0IHVuc2lnbmVkIGludCB1ZHBob2ZmID0gaXBfaGRybGVuKHNrYik7Ci0KLQkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCB1ZHBob2ZmK3NpemVvZigqdWRwaCkpKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseShjcC0+YXBwICE9IE5VTEwpKSB7Ci0JCS8qIFNvbWUgY2hlY2tzIGJlZm9yZSBtYW5nbGluZyAqLwotCQlpZiAocHAtPmNzdW1fY2hlY2sgJiYgIXBwLT5jc3VtX2NoZWNrKHNrYiwgcHApKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyoKLQkJICoJQ2FsbCBhcHBsaWNhdGlvbiBoZWxwZXIgaWYgbmVlZGVkCi0JCSAqLwotCQlpZiAoIWlwX3ZzX2FwcF9wa3Rfb3V0KGNwLCBza2IpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JdWRwaCA9ICh2b2lkICopaXBfaGRyKHNrYikgKyB1ZHBob2ZmOwotCXVkcGgtPnNvdXJjZSA9IGNwLT52cG9ydDsKLQotCS8qCi0JICoJQWRqdXN0IFVEUCBjaGVja3N1bXMKLQkgKi8KLQlpZiAoIWNwLT5hcHAgJiYgKHVkcGgtPmNoZWNrICE9IDApKSB7Ci0JCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLwotCQl1ZHBfZmFzdF9jc3VtX3VwZGF0ZSh1ZHBoLCBjcC0+ZGFkZHIsIGNwLT52YWRkciwKLQkJCQkgICAgIGNwLT5kcG9ydCwgY3AtPnZwb3J0KTsKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCX0gZWxzZSB7Ci0JCS8qIGZ1bGwgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KLQkJdWRwaC0+Y2hlY2sgPSAwOwotCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB1ZHBob2ZmLCBza2ItPmxlbiAtIHVkcGhvZmYsIDApOwotCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT52YWRkciwgY3AtPmNhZGRyLAotCQkJCQkJc2tiLT5sZW4gLSB1ZHBob2ZmLAotCQkJCQkJY3AtPnByb3RvY29sLCBza2ItPmNzdW0pOwotCQlpZiAodWRwaC0+Y2hlY2sgPT0gMCkKLQkJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7Ci0JCUlQX1ZTX0RCRygxMSwgIk8tcGt0OiAlcyBPLWNzdW09JWQgKCslemQpXG4iLAotCQkJICBwcC0+bmFtZSwgdWRwaC0+Y2hlY2ssCi0JCQkgIChjaGFyKikmKHVkcGgtPmNoZWNrKSAtIChjaGFyKil1ZHBoKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotdWRwX2RuYXRfaGFuZGxlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQotewotCXN0cnVjdCB1ZHBoZHIgKnVkcGg7Ci0JdW5zaWduZWQgaW50IHVkcGhvZmYgPSBpcF9oZHJsZW4oc2tiKTsKLQotCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHVkcGhvZmYrc2l6ZW9mKCp1ZHBoKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpIHsKLQkJLyogU29tZSBjaGVja3MgYmVmb3JlIG1hbmdsaW5nICovCi0JCWlmIChwcC0+Y3N1bV9jaGVjayAmJiAhcHAtPmNzdW1fY2hlY2soc2tiLCBwcCkpCi0JCQlyZXR1cm4gMDsKLQotCQkvKgotCQkgKglBdHRlbXB0IGlwX3ZzX2FwcCBjYWxsLgotCQkgKglJdCB3aWxsIGZpeCBpcF92c19jb25uCi0JCSAqLwotCQlpZiAoIWlwX3ZzX2FwcF9wa3RfaW4oY3AsIHNrYikpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQl1ZHBoID0gKHZvaWQgKilpcF9oZHIoc2tiKSArIHVkcGhvZmY7Ci0JdWRwaC0+ZGVzdCA9IGNwLT5kcG9ydDsKLQotCS8qCi0JICoJQWRqdXN0IFVEUCBjaGVja3N1bXMKLQkgKi8KLQlpZiAoIWNwLT5hcHAgJiYgKHVkcGgtPmNoZWNrICE9IDApKSB7Ci0JCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLwotCQl1ZHBfZmFzdF9jc3VtX3VwZGF0ZSh1ZHBoLCBjcC0+dmFkZHIsIGNwLT5kYWRkciwKLQkJCQkgICAgIGNwLT52cG9ydCwgY3AtPmRwb3J0KTsKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCX0gZWxzZSB7Ci0JCS8qIGZ1bGwgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KLQkJdWRwaC0+Y2hlY2sgPSAwOwotCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCB1ZHBob2ZmLCBza2ItPmxlbiAtIHVkcGhvZmYsIDApOwotCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT5jYWRkciwgY3AtPmRhZGRyLAotCQkJCQkJc2tiLT5sZW4gLSB1ZHBob2ZmLAotCQkJCQkJY3AtPnByb3RvY29sLCBza2ItPmNzdW0pOwotCQlpZiAodWRwaC0+Y2hlY2sgPT0gMCkKLQkJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JfQotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLXVkcF9jc3VtX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0Jc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOwotCWNvbnN0IHVuc2lnbmVkIGludCB1ZHBob2ZmID0gaXBfaGRybGVuKHNrYik7Ci0KLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHVkcGhvZmYsIHNpemVvZihfdWRwaCksICZfdWRwaCk7Ci0JaWYgKHVoID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JaWYgKHVoLT5jaGVjayAhPSAwKSB7Ci0JCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKLQkJY2FzZSBDSEVDS1NVTV9OT05FOgotCQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdWRwaG9mZiwKLQkJCQkJCSBza2ItPmxlbiAtIHVkcGhvZmYsIDApOwotCQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQkJaWYgKGNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwKLQkJCQkJICAgICAgaXBfaGRyKHNrYiktPmRhZGRyLAotCQkJCQkgICAgICBza2ItPmxlbiAtIHVkcGhvZmYsCi0JCQkJCSAgICAgIGlwX2hkcihza2IpLT5wcm90b2NvbCwKLQkJCQkJICAgICAgc2tiLT5jc3VtKSkgewotCQkJCUlQX1ZTX0RCR19STF9QS1QoMCwgcHAsIHNrYiwgMCwKLQkJCQkJCSAiRmFpbGVkIGNoZWNrc3VtIGZvciIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBObyBuZWVkIHRvIGNoZWNrc3VtLiAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqCU5vdGU6IHRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IG9ubHkgb25lIG9mIHJlZ2lzdGVyX2FwcCwKLSAqCXVucmVnaXN0ZXJfYXBwIG9yIGFwcF9jb25uX2JpbmQgaXMgY2FsbGVkIGVhY2ggdGltZS4KLSAqLwotCi0jZGVmaW5lCVVEUF9BUFBfVEFCX0JJVFMJNAotI2RlZmluZQlVRFBfQVBQX1RBQl9TSVpFCSgxIDw8IFVEUF9BUFBfVEFCX0JJVFMpCi0jZGVmaW5lCVVEUF9BUFBfVEFCX01BU0sJKFVEUF9BUFBfVEFCX1NJWkUgLSAxKQotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1ZHBfYXBwc1tVRFBfQVBQX1RBQl9TSVpFXTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWRwX2FwcF9sb2NrKTsKLQotc3RhdGljIGlubGluZSBfX3UxNiB1ZHBfYXBwX2hhc2hrZXkoX19iZTE2IHBvcnQpCi17Ci0JcmV0dXJuICgoKF9fZm9yY2UgdTE2KXBvcnQgPj4gVURQX0FQUF9UQUJfQklUUykgXiAoX19mb3JjZSB1MTYpcG9ydCkKLQkJJiBVRFBfQVBQX1RBQl9NQVNLOwotfQotCi0KLXN0YXRpYyBpbnQgdWRwX3JlZ2lzdGVyX2FwcChzdHJ1Y3QgaXBfdnNfYXBwICppbmMpCi17Ci0Jc3RydWN0IGlwX3ZzX2FwcCAqaTsKLQlfX3UxNiBoYXNoOwotCV9fYmUxNiBwb3J0ID0gaW5jLT5wb3J0OwotCWludCByZXQgPSAwOwotCi0JaGFzaCA9IHVkcF9hcHBfaGFzaGtleShwb3J0KTsKLQotCi0Jc3Bpbl9sb2NrX2JoKCZ1ZHBfYXBwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnVkcF9hcHBzW2hhc2hdLCBwX2xpc3QpIHsKLQkJaWYgKGktPnBvcnQgPT0gcG9ydCkgewotCQkJcmV0ID0gLUVFWElTVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWxpc3RfYWRkKCZpbmMtPnBfbGlzdCwgJnVkcF9hcHBzW2hhc2hdKTsKLQlhdG9taWNfaW5jKCZpcF92c19wcm90b2NvbF91ZHAuYXBwY250KTsKLQotICBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnVkcF9hcHBfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZAotdWRwX3VucmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKLXsKLQlzcGluX2xvY2tfYmgoJnVkcF9hcHBfbG9jayk7Ci0JYXRvbWljX2RlYygmaXBfdnNfcHJvdG9jb2xfdWRwLmFwcGNudCk7Ci0JbGlzdF9kZWwoJmluYy0+cF9saXN0KTsKLQlzcGluX3VubG9ja19iaCgmdWRwX2FwcF9sb2NrKTsKLX0KLQotCi1zdGF0aWMgaW50IHVkcF9hcHBfY29ubl9iaW5kKHN0cnVjdCBpcF92c19jb25uICpjcCkKLXsKLQlpbnQgaGFzaDsKLQlzdHJ1Y3QgaXBfdnNfYXBwICppbmM7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQkvKiBEZWZhdWx0IGJpbmRpbmc6IGJpbmQgYXBwIG9ubHkgZm9yIE5BVCAqLwotCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSBJUF9WU19DT05OX0ZfTUFTUSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBMb29rdXAgYXBwbGljYXRpb24gaW5jYXJuYXRpb25zIGFuZCBiaW5kIHRoZSByaWdodCBvbmUgKi8KLQloYXNoID0gdWRwX2FwcF9oYXNoa2V5KGNwLT52cG9ydCk7Ci0KLQlzcGluX2xvY2soJnVkcF9hcHBfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbmMsICZ1ZHBfYXBwc1toYXNoXSwgcF9saXN0KSB7Ci0JCWlmIChpbmMtPnBvcnQgPT0gY3AtPnZwb3J0KSB7Ci0JCQlpZiAodW5saWtlbHkoIWlwX3ZzX2FwcF9pbmNfZ2V0KGluYykpKQotCQkJCWJyZWFrOwotCQkJc3Bpbl91bmxvY2soJnVkcF9hcHBfbG9jayk7Ci0KLQkJCUlQX1ZTX0RCRyg5LCAiJXM6IEJpbmRpbmcgY29ubiAldS4ldS4ldS4ldToldS0+IgotCQkJCSAgIiV1LiV1LiV1LiV1OiV1IHRvIGFwcCAlcyBvbiBwb3J0ICV1XG4iLAotCQkJCSAgX19mdW5jX18sCi0JCQkJICBOSVBRVUFEKGNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCi0JCQkJICBOSVBRVUFEKGNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCi0JCQkJICBpbmMtPm5hbWUsIG50b2hzKGluYy0+cG9ydCkpOwotCQkJY3AtPmFwcCA9IGluYzsKLQkJCWlmIChpbmMtPmluaXRfY29ubikKLQkJCQlyZXN1bHQgPSBpbmMtPmluaXRfY29ubihpbmMsIGNwKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZ1ZHBfYXBwX2xvY2spOwotCi0gIG91dDoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQgdWRwX3RpbWVvdXRzW0lQX1ZTX1VEUF9TX0xBU1QrMV0gPSB7Ci0JW0lQX1ZTX1VEUF9TX05PUk1BTF0JCT0JNSo2MCpIWiwKLQlbSVBfVlNfVURQX1NfTEFTVF0JCT0JMipIWiwKLX07Ci0KLXN0YXRpYyBjaGFyICogdWRwX3N0YXRlX25hbWVfdGFibGVbSVBfVlNfVURQX1NfTEFTVCsxXSA9IHsKLQlbSVBfVlNfVURQX1NfTk9STUFMXQkJPQkiVURQIiwKLQlbSVBfVlNfVURQX1NfTEFTVF0JCT0JIkJVRyEiLAotfTsKLQotCi1zdGF0aWMgaW50Ci11ZHBfc2V0X3N0YXRlX3RpbWVvdXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY2hhciAqc25hbWUsIGludCB0bykKLXsKLQlyZXR1cm4gaXBfdnNfc2V0X3N0YXRlX3RpbWVvdXQocHAtPnRpbWVvdXRfdGFibGUsIElQX1ZTX1VEUF9TX0xBU1QsCi0JCQkJICAgICAgIHVkcF9zdGF0ZV9uYW1lX3RhYmxlLCBzbmFtZSwgdG8pOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIHVkcF9zdGF0ZV9uYW1lKGludCBzdGF0ZSkKLXsKLQlpZiAoc3RhdGUgPj0gSVBfVlNfVURQX1NfTEFTVCkKLQkJcmV0dXJuICJFUlIhIjsKLQlyZXR1cm4gdWRwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdID8gdWRwX3N0YXRlX25hbWVfdGFibGVbc3RhdGVdIDogIj8iOwotfQotCi1zdGF0aWMgaW50Ci11ZHBfc3RhdGVfdHJhbnNpdGlvbihzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCi0JCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCWNwLT50aW1lb3V0ID0gcHAtPnRpbWVvdXRfdGFibGVbSVBfVlNfVURQX1NfTk9STUFMXTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgdWRwX2luaXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLQlJUF9WU19JTklUX0hBU0hfVEFCTEUodWRwX2FwcHMpOwotCXBwLT50aW1lb3V0X3RhYmxlID0gdWRwX3RpbWVvdXRzOwotfQotCi1zdGF0aWMgdm9pZCB1ZHBfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotfQotCi0KLXN0cnVjdCBpcF92c19wcm90b2NvbCBpcF92c19wcm90b2NvbF91ZHAgPSB7Ci0JLm5hbWUgPQkJCSJVRFAiLAotCS5wcm90b2NvbCA9CQlJUFBST1RPX1VEUCwKLQkubnVtX3N0YXRlcyA9CQlJUF9WU19VRFBfU19MQVNULAotCS5kb250X2RlZnJhZyA9CQkwLAotCS5pbml0ID0JCQl1ZHBfaW5pdCwKLQkuZXhpdCA9CQkJdWRwX2V4aXQsCi0JLmNvbm5fc2NoZWR1bGUgPQl1ZHBfY29ubl9zY2hlZHVsZSwKLQkuY29ubl9pbl9nZXQgPQkJdWRwX2Nvbm5faW5fZ2V0LAotCS5jb25uX291dF9nZXQgPQkJdWRwX2Nvbm5fb3V0X2dldCwKLQkuc25hdF9oYW5kbGVyID0JCXVkcF9zbmF0X2hhbmRsZXIsCi0JLmRuYXRfaGFuZGxlciA9CQl1ZHBfZG5hdF9oYW5kbGVyLAotCS5jc3VtX2NoZWNrID0JCXVkcF9jc3VtX2NoZWNrLAotCS5zdGF0ZV90cmFuc2l0aW9uID0JdWRwX3N0YXRlX3RyYW5zaXRpb24sCi0JLnN0YXRlX25hbWUgPQkJdWRwX3N0YXRlX25hbWUsCi0JLnJlZ2lzdGVyX2FwcCA9CQl1ZHBfcmVnaXN0ZXJfYXBwLAotCS51bnJlZ2lzdGVyX2FwcCA9CXVkcF91bnJlZ2lzdGVyX2FwcCwKLQkuYXBwX2Nvbm5fYmluZCA9CXVkcF9hcHBfY29ubl9iaW5kLAotCS5kZWJ1Z19wYWNrZXQgPQkJaXBfdnNfdGNwdWRwX2RlYnVnX3BhY2tldCwKLQkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAotCS5zZXRfc3RhdGVfdGltZW91dCA9CXVkcF9zZXRfc3RhdGVfdGltZW91dCwKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3JyLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3JyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODExMGQuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19yci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBJUFZTOiAgICAgICAgUm91bmQtUm9iaW4gU2NoZWR1bGluZyBtb2R1bGUKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZpeGVzL0NoYW5nZXM6Ci0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3JyX3NjaGVkdWxlIHRvIHJldHVybiBkZXN0Ci0gKiAgICAgSnVsaWFuIEFuYXN0YXNvdiAgICAgICAgIDogICAgIGZpeGVkIHRoZSBOVUxMIHBvaW50ZXIgYWNjZXNzIGJ1ZyBpbiBkZWJ1Z2dpbmcKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBzb21lIGNvbWVzdGljcyB0aGluZ3MgZm9yIGRlYnVnZ2luZwotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIGZvciB0aGUgZC1saW5rZWQgZGVzdGluYXRpb24gbGlzdAotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCB0aGUgaXBfdnNfcnJfdXBkYXRlX3N2YwotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCBhbnkgZGVzdCB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLXN0YXRpYyBpbnQgaXBfdnNfcnJfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdmMtPnNjaGVkX2RhdGEgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19ycl9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfcnJfdXBkYXRlX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXN2Yy0+c2NoZWRfZGF0YSA9ICZzdmMtPmRlc3RpbmF0aW9uczsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogUm91bmQtUm9iaW4gU2NoZWR1bGluZwotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfcnJfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQotCUlQX1ZTX0RCRyg2LCAiaXBfdnNfcnJfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7Ci0KLQl3cml0ZV9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOwotCXAgPSAoc3RydWN0IGxpc3RfaGVhZCAqKXN2Yy0+c2NoZWRfZGF0YTsKLQlwID0gcC0+bmV4dDsKLQlxID0gcDsKLQlkbyB7Ci0JCS8qIHNraXAgbGlzdCBoZWFkICovCi0JCWlmIChxID09ICZzdmMtPmRlc3RpbmF0aW9ucykgewotCQkJcSA9IHEtPm5leHQ7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWRlc3QgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBpcF92c19kZXN0LCBuX2xpc3QpOwotCQlpZiAoIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgJiYKLQkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkKLQkJCS8qIEhJVCAqLwotCQkJZ290byBvdXQ7Ci0JCXEgPSBxLT5uZXh0OwotCX0gd2hpbGUgKHEgIT0gcCk7Ci0Jd3JpdGVfdW5sb2NrKCZzdmMtPnNjaGVkX2xvY2spOwotCXJldHVybiBOVUxMOwotCi0gIG91dDoKLQlzdmMtPnNjaGVkX2RhdGEgPSBxOwotCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKLQlJUF9WU19EQkcoNiwgIlJSOiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JXUgIgotCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkXG4iLAotCQkgIE5JUFFVQUQoZGVzdC0+YWRkciksIG50b2hzKGRlc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucyksCi0JCSAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCksIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKTsKLQotCXJldHVybiBkZXN0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3JyX3NjaGVkdWxlciA9IHsKLQkubmFtZSA9CQkJInJyIiwJCQkvKiBuYW1lICovCi0JLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKLQkubW9kdWxlID0JCVRISVNfTU9EVUxFLAotCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfcnJfc2NoZWR1bGVyLm5fbGlzdCksCi0JLmluaXRfc2VydmljZSA9CQlpcF92c19ycl9pbml0X3N2YywKLQkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX3JyX2RvbmVfc3ZjLAotCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3JyX3VwZGF0ZV9zdmMsCi0JLnNjaGVkdWxlID0JCWlwX3ZzX3JyX3NjaGVkdWxlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaXBfdnNfcnJfaW5pdCh2b2lkKQotewotCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19ycl9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX3ZzX3JyX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfdnNfcnJfY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NlZC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2NjNkOC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBJUFZTOiAgICAgICAgU2hvcnRlc3QgRXhwZWN0ZWQgRGVsYXkgc2NoZWR1bGluZyBtb2R1bGUKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKgotICovCi0KLS8qCi0gKiBUaGUgU0VEIGFsZ29yaXRobSBhdHRlbXB0cyB0byBtaW5pbWl6ZSBlYWNoIGpvYidzIGV4cGVjdGVkIGRlbGF5IHVudGlsCi0gKiBjb21wbGV0aW9uLiBUaGUgZXhwZWN0ZWQgZGVsYXkgdGhhdCB0aGUgam9iIHdpbGwgZXhwZXJpZW5jZSBpcwotICogKENpICsgMSkgLyBVaSBpZiBzZW50IHRvIHRoZSBpdGggc2VydmVyLCBpbiB3aGljaCBDaSBpcyB0aGUgbnVtYmVyIG9mCi0gKiBqb2JzIG9uIHRoZSBpdGggc2VydmVyIGFuZCBVaSBpcyB0aGUgZml4ZWQgc2VydmljZSByYXRlICh3ZWlnaHQpIG9mCi0gKiB0aGUgaXRoIHNlcnZlci4gVGhlIFNFRCBhbGdvcml0aG0gYWRvcHRzIGEgZ3JlZWR5IHBvbGljeSB0aGF0IGVhY2ggZG9lcwotICogd2hhdCBpcyBpbiBpdHMgb3duIGJlc3QgaW50ZXJlc3QsIGkuZS4gdG8gam9pbiB0aGUgcXVldWUgd2hpY2ggd291bGQKLSAqIG1pbmltaXplIGl0cyBleHBlY3RlZCBkZWxheSBvZiBjb21wbGV0aW9uLgotICoKLSAqIFNlZSB0aGUgZm9sbG93aW5nIHBhcGVyIGZvciBtb3JlIGluZm9ybWF0aW9uOgotICogQS4gV2VpbnJpYiBhbmQgUy4gU2hlbmtlciwgR3JlZWQgaXMgbm90IGVub3VnaDogQWRhcHRpdmUgbG9hZCBzaGFyaW5nCi0gKiBpbiBsYXJnZSBoZXRlcm9nZW5lb3VzIHN5c3RlbXMuIEluIFByb2NlZWRpbmdzIElFRUUgSU5GT0NPTSc4OCwKLSAqIHBhZ2VzIDk4Ni05OTQsIDE5ODguCi0gKgotICogVGhhbmtzIG11c3QgZ28gdG8gTWFya28gQnV1cmkgPG1hcmtvQGJ1dXJpLm5hbWU+IGZvciB0YWxraW5nIFNFRCB0byBtZS4KLSAqCi0gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNFRCBhbmQgV0xDIGlzIHRoYXQgU0VEIGluY2x1ZGVzIHRoZSBpbmNvbWluZwotICogam9iIGluIHRoZSBjb3N0IGZ1bmN0aW9uICh0aGUgaW5jcmVtZW50IG9mIDEpLiBTRUQgbWF5IG91dHBlcmZvcm0KLSAqIFdMQywgd2hpbGUgc2NoZWR1bGluZyBiaWcgam9icyB1bmRlciBsYXJnZXIgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zCi0gKiAodGhlIHNlcnZlciB3ZWlnaHQgdmFyaWVzIGEgbG90KS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KLQotc3RhdGljIGludAotaXBfdnNfc2VkX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaXBfdnNfc2VkX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaXBfdnNfc2VkX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotaXBfdnNfc2VkX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyoKLQkgKiBXZSBvbmx5IHVzZSB0aGUgYWN0aXZlIGNvbm5lY3Rpb24gbnVtYmVyIGluIHRoZSBjb3N0Ci0JICogY2FsY3VsYXRpb24gaGVyZS4KLQkgKi8KLQlyZXR1cm4gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSArIDE7Ci19Ci0KLQotLyoKLSAqCVdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gc2NoZWR1bGluZwotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfc2VkX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdDsKLQl1bnNpZ25lZCBpbnQgbG9oLCBkb2g7Ci0KLQlJUF9WU19EQkcoNiwgImlwX3ZzX3NlZF9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKLQotCS8qCi0JICogV2UgY2FsY3VsYXRlIHRoZSBsb2FkIG9mIGVhY2ggZGVzdCBzZXJ2ZXIgYXMgZm9sbG93czoKLQkgKgkoc2VydmVyIGV4cGVjdGVkIG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAotCSAqCi0JICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCi0JICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKLQkgKgkJICBoMS93MSA+IGgyL3cyCi0JICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCi0JICoKLQkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55Ci0JICogbmV3IGNvbm5lY3Rpb25zLgotCSAqLwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCQlpZiAoIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgJiYKLQkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgewotCQkJbGVhc3QgPSBkZXN0OwotCQkJbG9oID0gaXBfdnNfc2VkX2Rlc3Rfb3ZlcmhlYWQobGVhc3QpOwotCQkJZ290byBuZXh0c3RhZ2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqICAgIEZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIGxlYXN0IGxvYWQuCi0JICovCi0gIG5leHRzdGFnZToKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKLQkJCWNvbnRpbnVlOwotCQlkb2ggPSBpcF92c19zZWRfZGVzdF9vdmVyaGVhZChkZXN0KTsKLQkJaWYgKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KLQkJICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkgewotCQkJbGVhc3QgPSBkZXN0OwotCQkJbG9oID0gZG9oOwotCQl9Ci0JfQotCi0JSVBfVlNfREJHKDYsICJTRUQ6IHNlcnZlciAldS4ldS4ldS4ldToldSAiCi0JCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCi0JCSAgTklQUVVBRChsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPnJlZmNudCksCi0JCSAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOwotCi0JcmV0dXJuIGxlYXN0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3NlZF9zY2hlZHVsZXIgPQotewotCS5uYW1lID0JCQkic2VkIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19zZWRfc2NoZWR1bGVyLm5fbGlzdCksCi0JLmluaXRfc2VydmljZSA9CQlpcF92c19zZWRfaW5pdF9zdmMsCi0JLmRvbmVfc2VydmljZSA9CQlpcF92c19zZWRfZG9uZV9zdmMsCi0JLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfc2VkX3VwZGF0ZV9zdmMsCi0JLnNjaGVkdWxlID0JCWlwX3ZzX3NlZF9zY2hlZHVsZSwKLX07Ci0KLQotc3RhdGljIGludCBfX2luaXQgaXBfdnNfc2VkX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19zZWRfc2NoZWR1bGVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX3NlZF9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3NlZF9zY2hlZHVsZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcF92c19zZWRfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c19zZWRfY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NoLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTc5ZTIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBJUFZTOiAgICAgICAgU291cmNlIEhhc2hpbmcgc2NoZWR1bGluZyBtb2R1bGUKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BnbnVjaGluYS5vcmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqCi0gKi8KLQotLyoKLSAqIFRoZSBzaCBhbGdvcml0aG0gaXMgdG8gc2VsZWN0IHNlcnZlciBieSB0aGUgaGFzaCBrZXkgb2Ygc291cmNlIElQCi0gKiBhZGRyZXNzLiBUaGUgcHNldWRvIGNvZGUgaXMgYXMgZm9sbG93czoKLSAqCi0gKiAgICAgICBuIDwtIHNlcnZlcm5vZGVbc3JjX2lwXTsKLSAqICAgICAgIGlmIChuIGlzIGRlYWQpIE9SCi0gKiAgICAgICAgICAobiBpcyBvdmVybG9hZGVkKSBvciAobi53ZWlnaHQgPD0gMCkgdGhlbgotICogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICoKLSAqICAgICAgIHJldHVybiBuOwotICoKLSAqIE5vdGVzIHRoYXQgc2VydmVybm9kZSBpcyBhIDI1Ni1idWNrZXQgaGFzaCB0YWJsZSB0aGF0IG1hcHMgdGhlIGhhc2gKLSAqIGluZGV4IGRlcml2ZWQgZnJvbSBwYWNrZXQgc291cmNlIElQIGFkZHJlc3MgdG8gdGhlIGN1cnJlbnQgc2VydmVyCi0gKiBhcnJheS4gSWYgdGhlIHNoIHNjaGVkdWxlciBpcyB1c2VkIGluIGNhY2hlIGNsdXN0ZXIsIGl0IGlzIGdvb2QgdG8KLSAqIGNvbWJpbmUgaXQgd2l0aCBjYWNoZV9ieXBhc3MgZmVhdHVyZS4gV2hlbiB0aGUgc3RhdGljYWxseSBhc3NpZ25lZAotICogc2VydmVyIGlzIGRlYWQgb3Igb3ZlcmxvYWRlZCwgdGhlIGxvYWQgYmFsYW5jZXIgY2FuIGJ5cGFzcyB0aGUgY2FjaGUKLSAqIHNlcnZlciBhbmQgc2VuZCByZXF1ZXN0cyB0byB0aGUgb3JpZ2luYWwgc2VydmVyIGRpcmVjdGx5LgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qCi0gKiAgICAgIElQVlMgU0ggYnVja2V0Ci0gKi8KLXN0cnVjdCBpcF92c19zaF9idWNrZXQgewotCXN0cnVjdCBpcF92c19kZXN0ICAgICAgICpkZXN0OyAgICAgICAgICAvKiByZWFsIHNlcnZlciAoY2FjaGUpICovCi19OwotCi0vKgotICogICAgIGZvciBJUFZTIFNIIGVudHJ5IGhhc2ggdGFibGUKLSAqLwotI2lmbmRlZiBDT05GSUdfSVBfVlNfU0hfVEFCX0JJVFMKLSNkZWZpbmUgQ09ORklHX0lQX1ZTX1NIX1RBQl9CSVRTICAgICAgICA4Ci0jZW5kaWYKLSNkZWZpbmUgSVBfVlNfU0hfVEFCX0JJVFMgICAgICAgICAgICAgICBDT05GSUdfSVBfVlNfU0hfVEFCX0JJVFMKLSNkZWZpbmUgSVBfVlNfU0hfVEFCX1NJWkUgICAgICAgICAgICAgICAoMSA8PCBJUF9WU19TSF9UQUJfQklUUykKLSNkZWZpbmUgSVBfVlNfU0hfVEFCX01BU0sgICAgICAgICAgICAgICAoSVBfVlNfU0hfVEFCX1NJWkUgLSAxKQotCi0KLS8qCi0gKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgU0ggZW50cnkKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcF92c19zaF9oYXNoa2V5KF9fYmUzMiBhZGRyKQotewotCXJldHVybiAobnRvaGwoYWRkcikqMjY1NDQzNTc2MVVMKSAmIElQX1ZTX1NIX1RBQl9NQVNLOwotfQotCi0KLS8qCi0gKiAgICAgIEdldCBpcF92c19kZXN0IGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX3NoX2dldChzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwsIF9fYmUzMiBhZGRyKQotewotCXJldHVybiAodGJsW2lwX3ZzX3NoX2hhc2hrZXkoYWRkcildKS5kZXN0OwotfQotCi0KLS8qCi0gKiAgICAgIEFzc2lnbiBhbGwgdGhlIGhhc2ggYnVja2V0cyBvZiB0aGUgc3BlY2lmaWVkIHRhYmxlIHdpdGggdGhlIHNlcnZpY2UuCi0gKi8KLXN0YXRpYyBpbnQKLWlwX3ZzX3NoX2Fzc2lnbihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCi0JYiA9IHRibDsKLQlwID0gJnN2Yy0+ZGVzdGluYXRpb25zOwotCWZvciAoaT0wOyBpPElQX1ZTX1NIX1RBQl9TSVpFOyBpKyspIHsKLQkJaWYgKGxpc3RfZW1wdHkocCkpIHsKLQkJCWItPmRlc3QgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJaWYgKHAgPT0gJnN2Yy0+ZGVzdGluYXRpb25zKQotCQkJCXAgPSBwLT5uZXh0OwotCi0JCQlkZXN0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaXBfdnNfZGVzdCwgbl9saXN0KTsKLQkJCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7Ci0JCQliLT5kZXN0ID0gZGVzdDsKLQotCQkJcCA9IHAtPm5leHQ7Ci0JCX0KLQkJYisrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogICAgICBGbHVzaCBhbGwgdGhlIGhhc2ggYnVja2V0cyBvZiB0aGUgc3BlY2lmaWVkIHRhYmxlLgotICovCi1zdGF0aWMgdm9pZCBpcF92c19zaF9mbHVzaChzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqYjsKLQotCWIgPSB0Ymw7Ci0JZm9yIChpPTA7IGk8SVBfVlNfU0hfVEFCX1NJWkU7IGkrKykgewotCQlpZiAoYi0+ZGVzdCkgewotCQkJYXRvbWljX2RlYygmYi0+ZGVzdC0+cmVmY250KTsKLQkJCWItPmRlc3QgPSBOVUxMOwotCQl9Ci0JCWIrKzsKLQl9Ci19Ci0KLQotc3RhdGljIGludCBpcF92c19zaF9pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibDsKLQotCS8qIGFsbG9jYXRlIHRoZSBTSCB0YWJsZSBmb3IgdGhpcyBzZXJ2aWNlICovCi0JdGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCkqSVBfVlNfU0hfVEFCX1NJWkUsCi0JCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmICh0YmwgPT0gTlVMTCkgewotCQlJUF9WU19FUlIoImlwX3ZzX3NoX2luaXRfc3ZjKCk6IG5vIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzdmMtPnNjaGVkX2RhdGEgPSB0Ymw7Ci0JSVBfVlNfREJHKDYsICJTSCBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgotCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsCi0JCSAgc2l6ZW9mKHN0cnVjdCBpcF92c19zaF9idWNrZXQpKklQX1ZTX1NIX1RBQl9TSVpFKTsKLQotCS8qIGFzc2lnbiB0aGUgaGFzaCBidWNrZXRzIHdpdGggdGhlIHVwZGF0ZWQgc2VydmljZSAqLwotCWlwX3ZzX3NoX2Fzc2lnbih0YmwsIHN2Yyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX3NoX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0Jc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOwotCi0JLyogZ290IHRvIGNsZWFuIHVwIGhhc2ggYnVja2V0cyBoZXJlICovCi0JaXBfdnNfc2hfZmx1c2godGJsKTsKLQotCS8qIHJlbGVhc2UgdGhlIHRhYmxlIGl0c2VsZiAqLwotCWtmcmVlKHN2Yy0+c2NoZWRfZGF0YSk7Ci0JSVBfVlNfREJHKDYsICJTSCBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIHJlbGVhc2VkXG4iLAotCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0KSpJUF9WU19TSF9UQUJfU0laRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGlwX3ZzX3NoX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0YmwgPSBzdmMtPnNjaGVkX2RhdGE7Ci0KLQkvKiBnb3QgdG8gY2xlYW4gdXAgaGFzaCBidWNrZXRzIGhlcmUgKi8KLQlpcF92c19zaF9mbHVzaCh0YmwpOwotCi0JLyogYXNzaWduIHRoZSBoYXNoIGJ1Y2tldHMgd2l0aCB0aGUgdXBkYXRlZCBzZXJ2aWNlICovCi0JaXBfdnNfc2hfYXNzaWduKHRibCwgc3ZjKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgICAgIElmIHRoZSBkZXN0IGZsYWdzIGlzIHNldCB3aXRoIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCwKLSAqICAgICAgY29uc2lkZXIgdGhhdCB0aGUgc2VydmVyIGlzIG92ZXJsb2FkZWQgaGVyZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgaXNfb3ZlcmxvYWRlZChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKLXsKLQlyZXR1cm4gZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7Ci19Ci0KLQotLyoKLSAqICAgICAgU291cmNlIEhhc2hpbmcgc2NoZWR1bGluZwotICovCi1zdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgotaXBfdnNfc2hfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0Ymw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQotCUlQX1ZTX0RCRyg2LCAiaXBfdnNfc2hfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7Ci0KLQl0YmwgPSAoc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqKXN2Yy0+c2NoZWRfZGF0YTsKLQlkZXN0ID0gaXBfdnNfc2hfZ2V0KHRibCwgaXBoLT5zYWRkcik7Ci0JaWYgKCFkZXN0Ci0JICAgIHx8ICEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKQotCSAgICB8fCBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8PSAwCi0JICAgIHx8IGlzX292ZXJsb2FkZWQoZGVzdCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JSVBfVlNfREJHKDYsICJTSDogc291cmNlIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgIgotCQkgICItLT4gc2VydmVyICV1LiV1LiV1LiV1OiVkXG4iLAotCQkgIE5JUFFVQUQoaXBoLT5zYWRkciksCi0JCSAgTklQUVVBRChkZXN0LT5hZGRyKSwKLQkJICBudG9ocyhkZXN0LT5wb3J0KSk7Ci0KLQlyZXR1cm4gZGVzdDsKLX0KLQotCi0vKgotICogICAgICBJUFZTIFNIIFNjaGVkdWxlciBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfc2hfc2NoZWR1bGVyID0KLXsKLQkubmFtZSA9CQkJInNoIiwKLQkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAotCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCi0JLm5fbGlzdAkgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfc2hfc2NoZWR1bGVyLm5fbGlzdCksCi0JLmluaXRfc2VydmljZSA9CQlpcF92c19zaF9pbml0X3N2YywKLQkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX3NoX2RvbmVfc3ZjLAotCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3NoX3VwZGF0ZV9zdmMsCi0JLnNjaGVkdWxlID0JCWlwX3ZzX3NoX3NjaGVkdWxlLAotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF92c19zaF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfc2hfc2NoZWR1bGVyKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfc2hfY2xlYW51cCh2b2lkKQotewotCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19zaF9zY2hlZHVsZXIpOwotfQotCi0KLW1vZHVsZV9pbml0KGlwX3ZzX3NoX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfdnNfc2hfY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjUyZGEyLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMwICswLDAgQEAKLS8qCi0gKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQotICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQotICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldEZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQotICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKLSAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCi0gKgotICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KLSAqCi0gKiBpcF92c19zeW5jOiAgc3luYyBjb25uZWN0aW9uIGluZm8gZnJvbSBtYXN0ZXIgbG9hZCBiYWxhbmNlciB0byBiYWNrdXBzCi0gKiAgICAgICAgICAgICAgdGhyb3VnaCBtdWx0aWNhc3QKLSAqCi0gKiBDaGFuZ2VzOgotICoJQWxleGFuZHJlIENhc3Nlbgk6CUFkZGVkIG1hc3RlciAmIGJhY2t1cCBzdXBwb3J0IGF0IGEgdGltZS4KLSAqCUFsZXhhbmRyZSBDYXNzZW4JOglBZGRlZCBTeW5jSUQgc3VwcG9ydCBmb3IgaW5jb21pbmcgc3luYwotICoJCQkJCW1lc3NhZ2VzIGZpbHRlcmluZy4KLSAqCUp1c3RpbiBPc3Nldm9vcnQJOglGaXggZW5kaWFuIHByb2JsZW0gb24gc3luYyBtZXNzYWdlIHNpemUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pZ21wLmg+ICAgICAgICAgICAgICAgICAvKiBmb3IgaXBfbWNfam9pbl9ncm91cCAqLwotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotCi0jaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KLSNkZWZpbmUgSVBfVlNfU1lOQ19HUk9VUCAweGUwMDAwMDUxICAgIC8qIG11bHRpY2FzdCBhZGRyIC0gMjI0LjAuMC44MSAqLwotI2RlZmluZSBJUF9WU19TWU5DX1BPUlQgIDg4NDggICAgICAgICAgLyogbXVsdGljYXN0IHBvcnQgKi8KLQotCi0vKgotICoJSVBWUyBzeW5jIGNvbm5lY3Rpb24gZW50cnkKLSAqLwotc3RydWN0IGlwX3ZzX3N5bmNfY29ubiB7Ci0JX191OAkJCXJlc2VydmVkOwotCi0JLyogUHJvdG9jb2wsIGFkZHJlc3NlcyBhbmQgcG9ydCBudW1iZXJzICovCi0JX191OAkJCXByb3RvY29sOyAgICAgICAvKiBXaGljaCBwcm90b2NvbCAoVENQL1VEUCkgKi8KLQlfX2JlMTYJCQljcG9ydDsKLQlfX2JlMTYgICAgICAgICAgICAgICAgICB2cG9ydDsKLQlfX2JlMTYgICAgICAgICAgICAgICAgICBkcG9ydDsKLQlfX2JlMzIgICAgICAgICAgICAgICAgICBjYWRkcjsgICAgICAgICAgLyogY2xpZW50IGFkZHJlc3MgKi8KLQlfX2JlMzIgICAgICAgICAgICAgICAgICB2YWRkcjsgICAgICAgICAgLyogdmlydHVhbCBhZGRyZXNzICovCi0JX19iZTMyICAgICAgICAgICAgICAgICAgZGFkZHI7ICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KLQotCS8qIEZsYWdzIGFuZCBzdGF0ZSB0cmFuc2l0aW9uICovCi0JX19iZTE2ICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIHN0YXR1cyBmbGFncyAqLwotCV9fYmUxNiAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBzdGF0ZSBpbmZvICovCi0KLQkvKiBUaGUgc2VxdWVuY2Ugb3B0aW9ucyBzdGFydCBoZXJlICovCi19OwotCi1zdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgewotCXN0cnVjdCBpcF92c19zZXEgICAgICAgIGluX3NlcTsgICAgICAgICAvKiBpbmNvbWluZyBzZXEuIHN0cnVjdCAqLwotCXN0cnVjdCBpcF92c19zZXEgICAgICAgIG91dF9zZXE7ICAgICAgICAvKiBvdXRnb2luZyBzZXEuIHN0cnVjdCAqLwotfTsKLQotc3RydWN0IGlwX3ZzX3N5bmNfdGhyZWFkX2RhdGEgewotCXN0cnVjdCBzb2NrZXQgKnNvY2s7Ci0JY2hhciAqYnVmOwotfTsKLQotI2RlZmluZSBTSU1QTEVfQ09OTl9TSVpFICAoc2l6ZW9mKHN0cnVjdCBpcF92c19zeW5jX2Nvbm4pKQotI2RlZmluZSBGVUxMX0NPTk5fU0laRSAgXAotKHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19jb25uKSArIHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMpKQotCi0KLS8qCi0gIFRoZSBtYXN0ZXIgbXVsaXRjYXN0cyBtZXNzYWdlcyB0byB0aGUgYmFja3VwIGxvYWQgYmFsYW5jZXJzIGluIHRoZQotICBmb2xsb3dpbmcgZm9ybWF0LgotCi0gICAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgIHwgIENvdW50IENvbm5zICB8ICAgIFN5bmNJRCAgICAgfCAgICAgICAgICAgIFNpemUgICAgICAgICAgICAgICB8Ci0gICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgIElQVlMgU3luYyBDb25uZWN0aW9uICgxKSAgICAgICAgICAgICAgICAgICB8Ci0gICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgICBJUFZTIFN5bmMgQ29ubmVjdGlvbiAobikgICAgICAgICAgICAgICAgICAgfAotICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi0KLSNkZWZpbmUgU1lOQ19NRVNHX0hFQURFUl9MRU4JNAotCi1zdHJ1Y3QgaXBfdnNfc3luY19tZXNnIHsKLQlfX3U4ICAgICAgICAgICAgICAgICAgICBucl9jb25uczsKLQlfX3U4ICAgICAgICAgICAgICAgICAgICBzeW5jaWQ7Ci0JX191MTYgICAgICAgICAgICAgICAgICAgc2l6ZTsKLQotCS8qIGlwX3ZzX3N5bmNfY29ubiBlbnRyaWVzIHN0YXJ0IGhlcmUgKi8KLX07Ci0KLS8qIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIChzZW5kaW5nL3JlY2VpdmluZykgbWVzc2FnZSAqLwotc3RhdGljIGludCBzeW5jX3NlbmRfbWVzZ19tYXhsZW47Ci1zdGF0aWMgaW50IHN5bmNfcmVjdl9tZXNnX21heGxlbjsKLQotc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBmaXJzdHVzZTsKLQotCS8qIHBvaW50ZXJzIGZvciB0aGUgbWVzc2FnZSBkYXRhICovCi0Jc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAgKm1lc2c7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICAgKmhlYWQ7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICAgKmVuZDsKLX07Ci0KLQotLyogdGhlIHN5bmNfYnVmZiBsaXN0IGhlYWQgYW5kIHRoZSBsb2NrICovCi1zdGF0aWMgTElTVF9IRUFEKGlwX3ZzX3N5bmNfcXVldWUpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpcF92c19zeW5jX2xvY2spOwotCi0vKiBjdXJyZW50IHN5bmNfYnVmZiBmb3IgYWNjZXB0aW5nIG5ldyBjb25uIGVudHJpZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICAgKmN1cnJfc2IgPSBOVUxMOwotc3RhdGljIERFRklORV9TUElOTE9DSyhjdXJyX3NiX2xvY2spOwotCi0vKiBpcHZzIHN5bmMgZGFlbW9uIHN0YXRlICovCi12b2xhdGlsZSBpbnQgaXBfdnNfc3luY19zdGF0ZSA9IElQX1ZTX1NUQVRFX05PTkU7Ci12b2xhdGlsZSBpbnQgaXBfdnNfbWFzdGVyX3N5bmNpZCA9IDA7Ci12b2xhdGlsZSBpbnQgaXBfdnNfYmFja3VwX3N5bmNpZCA9IDA7Ci0KLS8qIG11bHRpY2FzdCBpbnRlcmZhY2UgbmFtZSAqLwotY2hhciBpcF92c19tYXN0ZXJfbWNhc3RfaWZuW0lQX1ZTX0lGTkFNRV9NQVhMRU5dOwotY2hhciBpcF92c19iYWNrdXBfbWNhc3RfaWZuW0lQX1ZTX0lGTkFNRV9NQVhMRU5dOwotCi0vKiBzeW5jIGRhZW1vbiB0YXNrcyAqLwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3luY19tYXN0ZXJfdGhyZWFkOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3luY19iYWNrdXBfdGhyZWFkOwotCi0vKiBtdWx0aWNhc3QgYWRkciAqLwotc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBtY2FzdF9hZGRyID0gewotCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCi0JLnNpbl9wb3J0CQk9IF9fY29uc3RhbnRfaHRvbnMoSVBfVlNfU1lOQ19QT1JUKSwKLQkuc2luX2FkZHIuc19hZGRyCT0gX19jb25zdGFudF9odG9ubChJUF9WU19TWU5DX0dST1VQKSwKLX07Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICpzYl9kZXF1ZXVlKHZvaWQpCi17Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7Ci0KLQlzcGluX2xvY2tfYmgoJmlwX3ZzX3N5bmNfbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJmlwX3ZzX3N5bmNfcXVldWUpKSB7Ci0JCXNiID0gTlVMTDsKLQl9IGVsc2UgewotCQlzYiA9IGxpc3RfZW50cnkoaXBfdnNfc3luY19xdWV1ZS5uZXh0LAotCQkJCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYsCi0JCQkJbGlzdCk7Ci0JCWxpc3RfZGVsKCZzYi0+bGlzdCk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zeW5jX2xvY2spOwotCi0JcmV0dXJuIHNiOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKiBpcF92c19zeW5jX2J1ZmZfY3JlYXRlKHZvaWQpCi17Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7Ci0KLQlpZiAoIShzYj1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19idWZmKSwgR0ZQX0FUT01JQykpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghKHNiLT5tZXNnPWttYWxsb2Moc3luY19zZW5kX21lc2dfbWF4bGVuLCBHRlBfQVRPTUlDKSkpIHsKLQkJa2ZyZWUoc2IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2ItPm1lc2ctPm5yX2Nvbm5zID0gMDsKLQlzYi0+bWVzZy0+c3luY2lkID0gaXBfdnNfbWFzdGVyX3N5bmNpZDsKLQlzYi0+bWVzZy0+c2l6ZSA9IDQ7Ci0Jc2ItPmhlYWQgPSAodW5zaWduZWQgY2hhciAqKXNiLT5tZXNnICsgNDsKLQlzYi0+ZW5kID0gKHVuc2lnbmVkIGNoYXIgKilzYi0+bWVzZyArIHN5bmNfc2VuZF9tZXNnX21heGxlbjsKLQlzYi0+Zmlyc3R1c2UgPSBqaWZmaWVzOwotCXJldHVybiBzYjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiKQotewotCWtmcmVlKHNiLT5tZXNnKTsKLQlrZnJlZShzYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYl9xdWV1ZV90YWlsKHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiKQotewotCXNwaW5fbG9jaygmaXBfdnNfc3luY19sb2NrKTsKLQlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikKLQkJbGlzdF9hZGRfdGFpbCgmc2ItPmxpc3QsICZpcF92c19zeW5jX3F1ZXVlKTsKLQllbHNlCi0JCWlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHNiKTsKLQlzcGluX3VubG9jaygmaXBfdnNfc3luY19sb2NrKTsKLX0KLQotLyoKLSAqCUdldCB0aGUgY3VycmVudCBzeW5jIGJ1ZmZlciBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIGZvciBtb3JlCi0gKgl0aGFuIHRoZSBzcGVjaWZpZWQgdGltZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUgaXMgemVyby4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICoKLWdldF9jdXJyX3N5bmNfYnVmZih1bnNpZ25lZCBsb25nIHRpbWUpCi17Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7Ci0KLQlzcGluX2xvY2tfYmgoJmN1cnJfc2JfbG9jayk7Ci0JaWYgKGN1cnJfc2IgJiYgKHRpbWUgPT0gMCB8fAotCQkJdGltZV9iZWZvcmUoamlmZmllcyAtIGN1cnJfc2ItPmZpcnN0dXNlLCB0aW1lKSkpIHsKLQkJc2IgPSBjdXJyX3NiOwotCQljdXJyX3NiID0gTlVMTDsKLQl9IGVsc2UKLQkJc2IgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2JoKCZjdXJyX3NiX2xvY2spOwotCXJldHVybiBzYjsKLX0KLQotCi0vKgotICogICAgICBBZGQgYW4gaXBfdnNfY29ubiBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjdXJyZW50IHN5bmNfYnVmZi4KLSAqICAgICAgQ2FsbGVkIGJ5IGlwX3ZzX2luLgotICovCi12b2lkIGlwX3ZzX3N5bmNfY29ubihzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCi17Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAqbTsKLQlzdHJ1Y3QgaXBfdnNfc3luY19jb25uICpzOwotCWludCBsZW47Ci0KLQlzcGluX2xvY2soJmN1cnJfc2JfbG9jayk7Ci0JaWYgKCFjdXJyX3NiKSB7Ci0JCWlmICghKGN1cnJfc2I9aXBfdnNfc3luY19idWZmX2NyZWF0ZSgpKSkgewotCQkJc3Bpbl91bmxvY2soJmN1cnJfc2JfbG9jayk7Ci0JCQlJUF9WU19FUlIoImlwX3ZzX3N5bmNfYnVmZl9jcmVhdGUgZmFpbGVkLlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlsZW4gPSAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1NFUV9NQVNLKSA/IEZVTExfQ09OTl9TSVpFIDoKLQkJU0lNUExFX0NPTk5fU0laRTsKLQltID0gY3Vycl9zYi0+bWVzZzsKLQlzID0gKHN0cnVjdCBpcF92c19zeW5jX2Nvbm4gKiljdXJyX3NiLT5oZWFkOwotCi0JLyogY29weSBtZW1iZXJzICovCi0Jcy0+cHJvdG9jb2wgPSBjcC0+cHJvdG9jb2w7Ci0Jcy0+Y3BvcnQgPSBjcC0+Y3BvcnQ7Ci0Jcy0+dnBvcnQgPSBjcC0+dnBvcnQ7Ci0Jcy0+ZHBvcnQgPSBjcC0+ZHBvcnQ7Ci0Jcy0+Y2FkZHIgPSBjcC0+Y2FkZHI7Ci0Jcy0+dmFkZHIgPSBjcC0+dmFkZHI7Ci0Jcy0+ZGFkZHIgPSBjcC0+ZGFkZHI7Ci0Jcy0+ZmxhZ3MgPSBodG9ucyhjcC0+ZmxhZ3MgJiB+SVBfVlNfQ09OTl9GX0hBU0hFRCk7Ci0Jcy0+c3RhdGUgPSBodG9ucyhjcC0+c3RhdGUpOwotCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU0VRX01BU0spIHsKLQkJc3RydWN0IGlwX3ZzX3N5bmNfY29ubl9vcHRpb25zICpvcHQgPQotCQkJKHN0cnVjdCBpcF92c19zeW5jX2Nvbm5fb3B0aW9ucyAqKSZzWzFdOwotCQltZW1jcHkob3B0LCAmY3AtPmluX3NlcSwgc2l6ZW9mKCpvcHQpKTsKLQl9Ci0KLQltLT5ucl9jb25ucysrOwotCW0tPnNpemUgKz0gbGVuOwotCWN1cnJfc2ItPmhlYWQgKz0gbGVuOwotCi0JLyogY2hlY2sgaWYgdGhlcmUgaXMgYSBzcGFjZSBmb3IgbmV4dCBvbmUgKi8KLQlpZiAoY3Vycl9zYi0+aGVhZCtGVUxMX0NPTk5fU0laRSA+IGN1cnJfc2ItPmVuZCkgewotCQlzYl9xdWV1ZV90YWlsKGN1cnJfc2IpOwotCQljdXJyX3NiID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmN1cnJfc2JfbG9jayk7Ci0KLQkvKiBzeW5jaHJvbml6ZSBpdHMgY29udHJvbGxlciBpZiBpdCBoYXMgKi8KLQlpZiAoY3AtPmNvbnRyb2wpCi0JCWlwX3ZzX3N5bmNfY29ubihjcC0+Y29udHJvbCk7Ci19Ci0KLQotLyoKLSAqICAgICAgUHJvY2VzcyByZWNlaXZlZCBtdWx0aWNhc3QgbWVzc2FnZSBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgIGlwX3ZzX2Nvbm4gZW50cmllcy4KLSAqLwotc3RhdGljIHZvaWQgaXBfdnNfcHJvY2Vzc19tZXNzYWdlKGNvbnN0IGNoYXIgKmJ1ZmZlciwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKLXsKLQlzdHJ1Y3QgaXBfdnNfc3luY19tZXNnICptID0gKHN0cnVjdCBpcF92c19zeW5jX21lc2cgKilidWZmZXI7Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfY29ubiAqczsKLQlzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgKm9wdDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0Jc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKLQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKLQljaGFyICpwOwotCWludCBpOwotCi0JaWYgKGJ1ZmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19tZXNnKSkgewotCQlJUF9WU19FUlJfUkwoInN5bmMgbWVzc2FnZSBoZWFkZXIgdG9vIHNob3J0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIENvbnZlcnQgc2l6ZSBiYWNrIHRvIGhvc3QgYnl0ZSBvcmRlciAqLwotCW0tPnNpemUgPSBudG9ocyhtLT5zaXplKTsKLQotCWlmIChidWZsZW4gIT0gbS0+c2l6ZSkgewotCQlJUF9WU19FUlJfUkwoImJvZ3VzIHN5bmMgbWVzc2FnZSBzaXplXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFN5bmNJRCBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoaXBfdnNfYmFja3VwX3N5bmNpZCAhPSAwICYmIG0tPnN5bmNpZCAhPSBpcF92c19iYWNrdXBfc3luY2lkKSB7Ci0JCUlQX1ZTX0RCRyg3LCAiSWdub3JpbmcgaW5jb21pbmcgbXNnIHdpdGggc3luY2lkID0gJWRcbiIsCi0JCQkgIG0tPnN5bmNpZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwID0gKGNoYXIgKilidWZmZXIgKyBzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyk7Ci0JZm9yIChpPTA7IGk8bS0+bnJfY29ubnM7IGkrKykgewotCQl1bnNpZ25lZCBmbGFncywgc3RhdGU7Ci0KLQkJaWYgKHAgKyBTSU1QTEVfQ09OTl9TSVpFID4gYnVmZmVyK2J1ZmxlbikgewotCQkJSVBfVlNfRVJSX1JMKCJib2d1cyBjb25uIGluIHN5bmMgbWVzc2FnZVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcyA9IChzdHJ1Y3QgaXBfdnNfc3luY19jb25uICopIHA7Ci0JCWZsYWdzID0gbnRvaHMocy0+ZmxhZ3MpIHwgSVBfVlNfQ09OTl9GX1NZTkM7Ci0JCWZsYWdzICY9IH5JUF9WU19DT05OX0ZfSEFTSEVEOwotCQlpZiAoZmxhZ3MgJiBJUF9WU19DT05OX0ZfU0VRX01BU0spIHsKLQkJCW9wdCA9IChzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgKikmc1sxXTsKLQkJCXAgKz0gRlVMTF9DT05OX1NJWkU7Ci0JCQlpZiAocCA+IGJ1ZmZlcitidWZsZW4pIHsKLQkJCQlJUF9WU19FUlJfUkwoImJvZ3VzIGNvbm4gb3B0aW9ucyBpbiBzeW5jIG1lc3NhZ2VcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9wdCA9IE5VTEw7Ci0JCQlwICs9IFNJTVBMRV9DT05OX1NJWkU7Ci0JCX0KLQotCQlzdGF0ZSA9IG50b2hzKHMtPnN0YXRlKTsKLQkJaWYgKCEoZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKSB7Ci0JCQlwcCA9IGlwX3ZzX3Byb3RvX2dldChzLT5wcm90b2NvbCk7Ci0JCQlpZiAoIXBwKSB7Ci0JCQkJSVBfVlNfRVJSX1JMKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAldSBpbiBzeW5jIG1zZ1xuIiwKLQkJCQkJcy0+cHJvdG9jb2wpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHN0YXRlID49IHBwLT5udW1fc3RhdGVzKSB7Ci0JCQkJSVBfVlNfREJHKDIsICJJbnZhbGlkICVzIHN0YXRlICV1IGluIHN5bmMgbXNnXG4iLAotCQkJCQlwcC0+bmFtZSwgc3RhdGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogcHJvdG9jb2wgaW4gdGVtcGxhdGVzIGlzIG5vdCB1c2VkIGZvciBzdGF0ZS90aW1lb3V0ICovCi0JCQlwcCA9IE5VTEw7Ci0JCQlpZiAoc3RhdGUgPiAwKSB7Ci0JCQkJSVBfVlNfREJHKDIsICJJbnZhbGlkIHRlbXBsYXRlIHN0YXRlICV1IGluIHN5bmMgbXNnXG4iLAotCQkJCQlzdGF0ZSk7Ci0JCQkJc3RhdGUgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKCEoZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKQotCQkJY3AgPSBpcF92c19jb25uX2luX2dldChzLT5wcm90b2NvbCwKLQkJCQkJICAgICAgIHMtPmNhZGRyLCBzLT5jcG9ydCwKLQkJCQkJICAgICAgIHMtPnZhZGRyLCBzLT52cG9ydCk7Ci0JCWVsc2UKLQkJCWNwID0gaXBfdnNfY3RfaW5fZ2V0KHMtPnByb3RvY29sLAotCQkJCQkgICAgICAgcy0+Y2FkZHIsIHMtPmNwb3J0LAotCQkJCQkgICAgICAgcy0+dmFkZHIsIHMtPnZwb3J0KTsKLQkJaWYgKCFjcCkgewotCQkJLyoKLQkJCSAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29ubmVjdGlvbi4KLQkJCSAqIElmIGl0IGlzIG5vdCBmb3VuZCB0aGUgY29ubmVjdGlvbiB3aWxsIHJlbWFpbiB1bmJvdW5kCi0JCQkgKiBidXQgc3RpbGwgaGFuZGxlZC4KLQkJCSAqLwotCQkJZGVzdCA9IGlwX3ZzX2ZpbmRfZGVzdChzLT5kYWRkciwgcy0+ZHBvcnQsCi0JCQkJCSAgICAgICBzLT52YWRkciwgcy0+dnBvcnQsCi0JCQkJCSAgICAgICBzLT5wcm90b2NvbCk7Ci0JCQkvKiAgU2V0IHRoZSBhcHByb3ByaXRlIGF0aXZpdHkgZmxhZyAqLwotCQkJaWYgKHMtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7Ci0JCQkJaWYgKHN0YXRlICE9IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKQotCQkJCQlmbGFncyB8PSBJUF9WU19DT05OX0ZfSU5BQ1RJVkU7Ci0JCQkJZWxzZQotCQkJCQlmbGFncyAmPSB+SVBfVlNfQ09OTl9GX0lOQUNUSVZFOwotCQkJfQotCQkJY3AgPSBpcF92c19jb25uX25ldyhzLT5wcm90b2NvbCwKLQkJCQkJICAgIHMtPmNhZGRyLCBzLT5jcG9ydCwKLQkJCQkJICAgIHMtPnZhZGRyLCBzLT52cG9ydCwKLQkJCQkJICAgIHMtPmRhZGRyLCBzLT5kcG9ydCwKLQkJCQkJICAgIGZsYWdzLCBkZXN0KTsKLQkJCWlmIChkZXN0KQotCQkJCWF0b21pY19kZWMoJmRlc3QtPnJlZmNudCk7Ci0JCQlpZiAoIWNwKSB7Ci0JCQkJSVBfVlNfRVJSKCJpcF92c19jb25uX25ldyBmYWlsZWRcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIGlmICghY3AtPmRlc3QpIHsKLQkJCWRlc3QgPSBpcF92c190cnlfYmluZF9kZXN0KGNwKTsKLQkJCWlmIChkZXN0KQotCQkJCWF0b21pY19kZWMoJmRlc3QtPnJlZmNudCk7Ci0JCX0gZWxzZSBpZiAoKGNwLT5kZXN0KSAmJiAoY3AtPnByb3RvY29sID09IElQUFJPVE9fVENQKSAmJgotCQkJICAgKGNwLT5zdGF0ZSAhPSBzdGF0ZSkpIHsKLQkJCS8qIHVwZGF0ZSBhY3RpdmUvaW5hY3RpdmUgZmxhZyBmb3IgdGhlIGNvbm5lY3Rpb24gKi8KLQkJCWRlc3QgPSBjcC0+ZGVzdDsKLQkJCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkgJiYKLQkJCQkoc3RhdGUgIT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpKSB7Ci0JCQkJYXRvbWljX2RlYygmZGVzdC0+YWN0aXZlY29ubnMpOwotCQkJCWF0b21pY19pbmMoJmRlc3QtPmluYWN0Y29ubnMpOwotCQkJCWNwLT5mbGFncyB8PSBJUF9WU19DT05OX0ZfSU5BQ1RJVkU7Ci0JCQl9IGVsc2UgaWYgKChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSU5BQ1RJVkUpICYmCi0JCQkJKHN0YXRlID09IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSkgewotCQkJCWF0b21pY19pbmMoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKLQkJCQlhdG9taWNfZGVjKCZkZXN0LT5pbmFjdGNvbm5zKTsKLQkJCQljcC0+ZmxhZ3MgJj0gfklQX1ZTX0NPTk5fRl9JTkFDVElWRTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHQpCi0JCQltZW1jcHkoJmNwLT5pbl9zZXEsIG9wdCwgc2l6ZW9mKCpvcHQpKTsKLQkJYXRvbWljX3NldCgmY3AtPmluX3BrdHMsIHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFswXSk7Ci0JCWNwLT5zdGF0ZSA9IHN0YXRlOwotCQljcC0+b2xkX3N0YXRlID0gY3AtPnN0YXRlOwotCQkvKgotCQkgKiBXZSBjYW4gbm90IHJlY292ZXIgdGhlIHJpZ2h0IHRpbWVvdXQgZm9yIHRlbXBsYXRlcwotCQkgKiBpbiBhbGwgY2FzZXMsIHdlIGNhbiBub3QgZmluZCB0aGUgcmlnaHQgZndtYXJrCi0JCSAqIHZpcnR1YWwgc2VydmljZS4gSWYgbmVlZGVkLCB3ZSBjYW4gZG8gaXQgZm9yCi0JCSAqIG5vbi1md21hcmsgcGVyc2lzdGVudCBzZXJ2aWNlcy4KLQkJICovCi0JCWlmICghKGZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSAmJiBwcC0+dGltZW91dF90YWJsZSkKLQkJCWNwLT50aW1lb3V0ID0gcHAtPnRpbWVvdXRfdGFibGVbc3RhdGVdOwotCQllbHNlCi0JCQljcC0+dGltZW91dCA9ICgzKjYwKkhaKTsKLQkJaXBfdnNfY29ubl9wdXQoY3ApOwotCX0KLX0KLQotCi0vKgotICogICAgICBTZXR1cCBsb29wYmFjayBvZiBvdXRnb2luZyBtdWx0aWNhc3RzIG9uIGEgc2VuZGluZyBzb2NrZXQKLSAqLwotc3RhdGljIHZvaWQgc2V0X21jYXN0X2xvb3Aoc3RydWN0IHNvY2sgKnNrLCB1X2NoYXIgbG9vcCkKLXsKLQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0KLQkvKiBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9JUCwgSVBfTVVMVElDQVNUX0xPT1AsICZsb29wLCBzaXplb2YobG9vcCkpOyAqLwotCWxvY2tfc29jayhzayk7Ci0JaW5ldC0+bWNfbG9vcCA9IGxvb3AgPyAxIDogMDsKLQlyZWxlYXNlX3NvY2soc2spOwotfQotCi0vKgotICogICAgICBTcGVjaWZ5IFRUTCBmb3Igb3V0Z29pbmcgbXVsdGljYXN0cyBvbiBhIHNlbmRpbmcgc29ja2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHNldF9tY2FzdF90dGwoc3RydWN0IHNvY2sgKnNrLCB1X2NoYXIgdHRsKQotewotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQotCS8qIHNldHNvY2tvcHQoc29jaywgU09MX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCAmdHRsLCBzaXplb2YodHRsKSk7ICovCi0JbG9ja19zb2NrKHNrKTsKLQlpbmV0LT5tY190dGwgPSB0dGw7Ci0JcmVsZWFzZV9zb2NrKHNrKTsKLX0KLQotLyoKLSAqICAgICAgU3BlY2lmaXkgZGVmYXVsdCBpbnRlcmZhY2UgZm9yIG91dGdvaW5nIG11bHRpY2FzdHMKLSAqLwotc3RhdGljIGludCBzZXRfbWNhc3RfaWYoc3RydWN0IHNvY2sgKnNrLCBjaGFyICppZm5hbWUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0KLQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaWZuYW1lKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBkZXYtPmlmaW5kZXggIT0gc2stPnNrX2JvdW5kX2Rldl9pZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlsb2NrX3NvY2soc2spOwotCWluZXQtPm1jX2luZGV4ID0gZGV2LT5pZmluZGV4OwotCS8qICBpbmV0LT5tY19hZGRyICA9IDA7ICovCi0JcmVsZWFzZV9zb2NrKHNrKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKglTZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN5bmMgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlCi0gKglzcGVjaWZpZWQgaW50ZXJmYWNlJ3MgTVRVLgotICovCi1zdGF0aWMgaW50IHNldF9zeW5jX21lc2dfbWF4bGVuKGludCBzeW5jX3N0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IG51bTsKLQotCWlmIChzeW5jX3N0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgewotCQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaXBfdnNfbWFzdGVyX21jYXN0X2lmbikpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQludW0gPSAoZGV2LT5tdHUgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSAtCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHVkcGhkcikgLQotCQkgICAgICAgU1lOQ19NRVNHX0hFQURFUl9MRU4gLSAyMCkgLyBTSU1QTEVfQ09OTl9TSVpFOwotCQlzeW5jX3NlbmRfbWVzZ19tYXhsZW4gPQotCQkJU1lOQ19NRVNHX0hFQURFUl9MRU4gKyBTSU1QTEVfQ09OTl9TSVpFICogbnVtOwotCQlJUF9WU19EQkcoNywgInNldHRpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN5bmMgc2VuZGluZyAiCi0JCQkgICJtZXNzYWdlICVkLlxuIiwgc3luY19zZW5kX21lc2dfbWF4bGVuKTsKLQl9IGVsc2UgaWYgKHN5bmNfc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQKSB7Ci0JCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpcF92c19iYWNrdXBfbWNhc3RfaWZuKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCXN5bmNfcmVjdl9tZXNnX21heGxlbiA9IGRldi0+bXR1IC0KLQkJCXNpemVvZihzdHJ1Y3QgaXBoZHIpIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCQlJUF9WU19EQkcoNywgInNldHRpbmcgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN5bmMgcmVjZWl2aW5nICIKLQkJCSAgIm1lc3NhZ2UgJWQuXG4iLCBzeW5jX3JlY3ZfbWVzZ19tYXhsZW4pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgICAgIEpvaW4gYSBtdWx0aWNhc3QgZ3JvdXAuCi0gKiAgICAgIHRoZSBncm91cCBpcyBzcGVjaWZpZWQgYnkgYSBjbGFzcyBEIG11bHRpY2FzdCBhZGRyZXNzIDIyNC4wLjAuMC84Ci0gKiAgICAgIGluIHRoZSBpbl9hZGRyIHN0cnVjdHVyZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIuCi0gKi8KLXN0YXRpYyBpbnQKLWpvaW5fbWNhc3RfZ3JvdXAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwgY2hhciAqaWZuYW1lKQotewotCXN0cnVjdCBpcF9tcmVxbiBtcmVxOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKLQltZW1jcHkoJm1yZXEuaW1yX211bHRpYWRkciwgYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0KLQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaWZuYW1lKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYgZGV2LT5pZmluZGV4ICE9IHNrLT5za19ib3VuZF9kZXZfaWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXJlcS5pbXJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKLQotCWxvY2tfc29jayhzayk7Ci0JcmV0ID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCXJlbGVhc2Vfc29jayhzayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgYmluZF9tY2FzdGlmX2FkZHIoc3RydWN0IHNvY2tldCAqc29jaywgY2hhciAqaWZuYW1lKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JX19iZTMyIGFkZHI7Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQotCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpZm5hbWUpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWFkZHIgPSBpbmV0X3NlbGVjdF9hZGRyKGRldiwgMCwgUlRfU0NPUEVfVU5JVkVSU0UpOwotCWlmICghYWRkcikKLQkJSVBfVlNfRVJSKCJZb3UgcHJvYmFibHkgbmVlZCB0byBzcGVjaWZ5IElQIGFkZHJlc3Mgb24gIgotCQkJICAibXVsdGljYXN0IGludGVyZmFjZS5cbiIpOwotCi0JSVBfVlNfREJHKDcsICJiaW5kaW5nIHNvY2tldCB3aXRoICglcykgJXUuJXUuJXUuJXVcbiIsCi0JCSAgaWZuYW1lLCBOSVBRVUFEKGFkZHIpKTsKLQotCS8qIE5vdyBiaW5kIHRoZSBzb2NrZXQgd2l0aCB0aGUgYWRkcmVzcyBvZiBtdWx0aWNhc3QgaW50ZXJmYWNlICovCi0Jc2luLnNpbl9mYW1pbHkJICAgICA9IEFGX0lORVQ7Ci0Jc2luLnNpbl9hZGRyLnNfYWRkciAgPSBhZGRyOwotCXNpbi5zaW5fcG9ydCAgICAgICAgID0gMDsKLQotCXJldHVybiBzb2NrLT5vcHMtPmJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciopJnNpbiwgc2l6ZW9mKHNpbikpOwotfQotCi0vKgotICogICAgICBTZXQgdXAgc2VuZGluZyBtdWx0aWNhc3Qgc29ja2V0IG92ZXIgVURQCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICogbWFrZV9zZW5kX3NvY2sodm9pZCkKLXsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwotCWludCByZXN1bHQ7Ci0KLQkvKiBGaXJzdCBjcmVhdGUgYSBzb2NrZXQgKi8KLQlyZXN1bHQgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAmc29jayk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJSVBfVlNfRVJSKCJFcnJvciBkdXJpbmcgY3JlYXRpb24gb2Ygc29ja2V0OyB0ZXJtaW5hdGluZ1xuIik7Ci0JCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Ci0JfQotCi0JcmVzdWx0ID0gc2V0X21jYXN0X2lmKHNvY2stPnNrLCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlJUF9WU19FUlIoIkVycm9yIHNldHRpbmcgb3V0Ym91bmQgbWNhc3QgaW50ZXJmYWNlXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlzZXRfbWNhc3RfbG9vcChzb2NrLT5zaywgMCk7Ci0Jc2V0X21jYXN0X3R0bChzb2NrLT5zaywgMSk7Ci0KLQlyZXN1bHQgPSBiaW5kX21jYXN0aWZfYWRkcihzb2NrLCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlJUF9WU19FUlIoIkVycm9yIGJpbmRpbmcgYWRkcmVzcyBvZiB0aGUgbWNhc3QgaW50ZXJmYWNlXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXN1bHQgPSBzb2NrLT5vcHMtPmNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbWNhc3RfYWRkciwKLQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpLCAwKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlJUF9WU19FUlIoIkVycm9yIGNvbm5lY3RpbmcgdG8gdGhlIG11bHRpY2FzdCBhZGRyXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gc29jazsKLQotICBlcnJvcjoKLQlzb2NrX3JlbGVhc2Uoc29jayk7Ci0JcmV0dXJuIEVSUl9QVFIocmVzdWx0KTsKLX0KLQotCi0vKgotICogICAgICBTZXQgdXAgcmVjZWl2aW5nIG11bHRpY2FzdCBzb2NrZXQgb3ZlciBVRFAKLSAqLwotc3RhdGljIHN0cnVjdCBzb2NrZXQgKiBtYWtlX3JlY2VpdmVfc29jayh2b2lkKQotewotCXN0cnVjdCBzb2NrZXQgKnNvY2s7Ci0JaW50IHJlc3VsdDsKLQotCS8qIEZpcnN0IGNyZWF0ZSBhIHNvY2tldCAqLwotCXJlc3VsdCA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsICZzb2NrKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlJUF9WU19FUlIoIkVycm9yIGR1cmluZyBjcmVhdGlvbiBvZiBzb2NrZXQ7IHRlcm1pbmF0aW5nXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIocmVzdWx0KTsKLQl9Ci0KLQkvKiBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBSRVVTRUFERFIgb3B0aW9uIGluIHVzZXItc3BhY2UgKi8KLQlzb2NrLT5zay0+c2tfcmV1c2UgPSAxOwotCi0JcmVzdWx0ID0gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1jYXN0X2FkZHIsCi0JCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJSVBfVlNfRVJSKCJFcnJvciBiaW5kaW5nIHRvIHRoZSBtdWx0aWNhc3QgYWRkclxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogam9pbiB0aGUgbXVsdGljYXN0IGdyb3VwICovCi0JcmVzdWx0ID0gam9pbl9tY2FzdF9ncm91cChzb2NrLT5zaywKLQkJCShzdHJ1Y3QgaW5fYWRkciAqKSAmbWNhc3RfYWRkci5zaW5fYWRkciwKLQkJCWlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCUlQX1ZTX0VSUigiRXJyb3Igam9pbmluZyB0byB0aGUgbXVsdGljYXN0IGdyb3VwXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gc29jazsKLQotICBlcnJvcjoKLQlzb2NrX3JlbGVhc2Uoc29jayk7Ci0JcmV0dXJuIEVSUl9QVFIocmVzdWx0KTsKLX0KLQotCi1zdGF0aWMgaW50Ci1pcF92c19zZW5kX2FzeW5jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGNvbnN0IGNoYXIgKmJ1ZmZlciwgY29uc3Qgc2l6ZV90IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgbXNnaGRyCW1zZyA9IHsubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUfE1TR19OT1NJR05BTH07Ci0Jc3RydWN0IGt2ZWMJaW92OwotCWludAkJbGVuOwotCi0JRW50ZXJGdW5jdGlvbig3KTsKLQlpb3YuaW92X2Jhc2UgICAgID0gKHZvaWQgKilidWZmZXI7Ci0JaW92Lmlvdl9sZW4gICAgICA9IGxlbmd0aDsKLQotCWxlbiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIChzaXplX3QpKGxlbmd0aCkpOwotCi0JTGVhdmVGdW5jdGlvbig3KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdm9pZAotaXBfdnNfc2VuZF9zeW5jX21zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgaXBfdnNfc3luY19tZXNnICptc2cpCi17Ci0JaW50IG1zaXplOwotCi0JbXNpemUgPSBtc2ctPnNpemU7Ci0KLQkvKiBQdXQgc2l6ZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQltc2ctPnNpemUgPSBodG9ucyhtc2ctPnNpemUpOwotCi0JaWYgKGlwX3ZzX3NlbmRfYXN5bmMoc29jaywgKGNoYXIgKiltc2csIG1zaXplKSAhPSBtc2l6ZSkKLQkJSVBfVlNfRVJSKCJpcF92c19zZW5kX2FzeW5jIGVycm9yXG4iKTsKLX0KLQotc3RhdGljIGludAotaXBfdnNfcmVjZWl2ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBjaGFyICpidWZmZXIsIGNvbnN0IHNpemVfdCBidWZsZW4pCi17Ci0Jc3RydWN0IG1zZ2hkcgkJbXNnID0ge05VTEwsfTsKLQlzdHJ1Y3Qga3ZlYwkJaW92OwotCWludAkJCWxlbjsKLQotCUVudGVyRnVuY3Rpb24oNyk7Ci0KLQkvKiBSZWNlaXZlIGEgcGFja2V0ICovCi0JaW92Lmlvdl9iYXNlICAgICA9IGJ1ZmZlcjsKLQlpb3YuaW92X2xlbiAgICAgID0gKHNpemVfdClidWZsZW47Ci0KLQlsZW4gPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBidWZsZW4sIDApOwotCi0JaWYgKGxlbiA8IDApCi0JCXJldHVybiAtMTsKLQotCUxlYXZlRnVuY3Rpb24oNyk7Ci0JcmV0dXJuIGxlbjsKLX0KLQotCi1zdGF0aWMgaW50IHN5bmNfdGhyZWFkX21hc3Rlcih2b2lkICpkYXRhKQotewotCXN0cnVjdCBpcF92c19zeW5jX3RocmVhZF9kYXRhICp0aW5mbyA9IGRhdGE7Ci0Jc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7Ci0KLQlJUF9WU19JTkZPKCJzeW5jIHRocmVhZCBzdGFydGVkOiBzdGF0ZSA9IE1BU1RFUiwgbWNhc3RfaWZuID0gJXMsICIKLQkJICAgInN5bmNpZCA9ICVkXG4iLAotCQkgICBpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBpcF92c19tYXN0ZXJfc3luY2lkKTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXdoaWxlICgoc2IgPSBzYl9kZXF1ZXVlKCkpKSB7Ci0JCQlpcF92c19zZW5kX3N5bmNfbXNnKHRpbmZvLT5zb2NrLCBzYi0+bWVzZyk7Ci0JCQlpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzYik7Ci0JCX0KLQotCQkvKiBjaGVjayBpZiBlbnRyaWVzIHN0YXkgaW4gY3Vycl9zYiBmb3IgMiBzZWNvbmRzICovCi0JCXNiID0gZ2V0X2N1cnJfc3luY19idWZmKDIgKiBIWik7Ci0JCWlmIChzYikgewotCQkJaXBfdnNfc2VuZF9zeW5jX21zZyh0aW5mby0+c29jaywgc2ItPm1lc2cpOwotCQkJaXBfdnNfc3luY19idWZmX3JlbGVhc2Uoc2IpOwotCQl9Ci0KLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKEhaKTsKLQl9Ci0KLQkvKiBjbGVhbiB1cCB0aGUgc3luY19idWZmIHF1ZXVlICovCi0Jd2hpbGUgKChzYj1zYl9kZXF1ZXVlKCkpKSB7Ci0JCWlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHNiKTsKLQl9Ci0KLQkvKiBjbGVhbiB1cCB0aGUgY3VycmVudCBzeW5jX2J1ZmYgKi8KLQlpZiAoKHNiID0gZ2V0X2N1cnJfc3luY19idWZmKDApKSkgewotCQlpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzYik7Ci0JfQotCi0JLyogcmVsZWFzZSB0aGUgc2VuZGluZyBtdWx0aWNhc3Qgc29ja2V0ICovCi0Jc29ja19yZWxlYXNlKHRpbmZvLT5zb2NrKTsKLQlrZnJlZSh0aW5mbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHN5bmNfdGhyZWFkX2JhY2t1cCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBpcF92c19zeW5jX3RocmVhZF9kYXRhICp0aW5mbyA9IGRhdGE7Ci0JaW50IGxlbjsKLQotCUlQX1ZTX0lORk8oInN5bmMgdGhyZWFkIHN0YXJ0ZWQ6IHN0YXRlID0gQkFDS1VQLCBtY2FzdF9pZm4gPSAlcywgIgotCQkgICAic3luY2lkID0gJWRcbiIsCi0JCSAgIGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4sIGlwX3ZzX2JhY2t1cF9zeW5jaWQpOwotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCp0aW5mby0+c29jay0+c2stPnNrX3NsZWVwLAotCQkJICFza2JfcXVldWVfZW1wdHkoJnRpbmZvLT5zb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkKLQkJCSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwotCi0JCS8qIGRvIHdlIGhhdmUgZGF0YSBub3c/ICovCi0JCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCYodGluZm8tPnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKLQkJCWxlbiA9IGlwX3ZzX3JlY2VpdmUodGluZm8tPnNvY2ssIHRpbmZvLT5idWYsCi0JCQkJCXN5bmNfcmVjdl9tZXNnX21heGxlbik7Ci0JCQlpZiAobGVuIDw9IDApIHsKLQkJCQlJUF9WU19FUlIoInJlY2VpdmluZyBtZXNzYWdlIGVycm9yXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogZGlzYWJsZSBib3R0b20gaGFsZiwgYmVjYXVzZSBpdCBhY2Nlc3NlcyB0aGUgZGF0YQotCQkJICAgc2hhcmVkIGJ5IHNvZnRpcnEgd2hpbGUgZ2V0dGluZy9jcmVhdGluZyBjb25ucyAqLwotCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQkJaXBfdnNfcHJvY2Vzc19tZXNzYWdlKHRpbmZvLT5idWYsIGxlbik7Ci0JCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJfQotCX0KLQotCS8qIHJlbGVhc2UgdGhlIHNlbmRpbmcgbXVsdGljYXN0IHNvY2tldCAqLwotCXNvY2tfcmVsZWFzZSh0aW5mby0+c29jayk7Ci0Ja2ZyZWUodGluZm8tPmJ1Zik7Ci0Ja2ZyZWUodGluZm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHN0YXJ0X3N5bmNfdGhyZWFkKGludCBzdGF0ZSwgY2hhciAqbWNhc3RfaWZuLCBfX3U4IHN5bmNpZCkKLXsKLQlzdHJ1Y3QgaXBfdnNfc3luY190aHJlYWRfZGF0YSAqdGluZm87Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICoqcmVhbHRhc2ssICp0YXNrOwotCXN0cnVjdCBzb2NrZXQgKnNvY2s7Ci0JY2hhciAqbmFtZSwgKmJ1ZiA9IE5VTEw7Ci0JaW50ICgqdGhyZWFkZm4pKHZvaWQgKmRhdGEpOwotCWludCByZXN1bHQgPSAtRU5PTUVNOwotCi0JSVBfVlNfREJHKDcsICIlczogcGlkICVkXG4iLCBfX2Z1bmNfXywgdGFza19waWRfbnIoY3VycmVudCkpOwotCUlQX1ZTX0RCRyg3LCAiRWFjaCBpcF92c19zeW5jX2Nvbm4gZW50cnkgbmVlZHMgJVpkIGJ5dGVzXG4iLAotCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19jb25uKSk7Ci0KLQlpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKSB7Ci0JCWlmIChzeW5jX21hc3Rlcl90aHJlYWQpCi0JCQlyZXR1cm4gLUVFWElTVDsKLQotCQlzdHJsY3B5KGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4sIG1jYXN0X2lmbiwKLQkJCXNpemVvZihpcF92c19tYXN0ZXJfbWNhc3RfaWZuKSk7Ci0JCWlwX3ZzX21hc3Rlcl9zeW5jaWQgPSBzeW5jaWQ7Ci0JCXJlYWx0YXNrID0gJnN5bmNfbWFzdGVyX3RocmVhZDsKLQkJbmFtZSA9ICJpcHZzX3N5bmNtYXN0ZXIiOwotCQl0aHJlYWRmbiA9IHN5bmNfdGhyZWFkX21hc3RlcjsKLQkJc29jayA9IG1ha2Vfc2VuZF9zb2NrKCk7Ci0JfSBlbHNlIGlmIChzdGF0ZSA9PSBJUF9WU19TVEFURV9CQUNLVVApIHsKLQkJaWYgKHN5bmNfYmFja3VwX3RocmVhZCkKLQkJCXJldHVybiAtRUVYSVNUOwotCi0JCXN0cmxjcHkoaXBfdnNfYmFja3VwX21jYXN0X2lmbiwgbWNhc3RfaWZuLAotCQkJc2l6ZW9mKGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pKTsKLQkJaXBfdnNfYmFja3VwX3N5bmNpZCA9IHN5bmNpZDsKLQkJcmVhbHRhc2sgPSAmc3luY19iYWNrdXBfdGhyZWFkOwotCQluYW1lID0gImlwdnNfc3luY2JhY2t1cCI7Ci0JCXRocmVhZGZuID0gc3luY190aHJlYWRfYmFja3VwOwotCQlzb2NrID0gbWFrZV9yZWNlaXZlX3NvY2soKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoSVNfRVJSKHNvY2spKSB7Ci0JCXJlc3VsdCA9IFBUUl9FUlIoc29jayk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXNldF9zeW5jX21lc2dfbWF4bGVuKHN0YXRlKTsKLQlpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQKSB7Ci0JCWJ1ZiA9IGttYWxsb2Moc3luY19yZWN2X21lc2dfbWF4bGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpCi0JCQlnb3RvIG91dHNvY2tldDsKLQl9Ci0KLQl0aW5mbyA9IGttYWxsb2Moc2l6ZW9mKCp0aW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghdGluZm8pCi0JCWdvdG8gb3V0YnVmOwotCi0JdGluZm8tPnNvY2sgPSBzb2NrOwotCXRpbmZvLT5idWYgPSBidWY7Ci0KLQl0YXNrID0ga3RocmVhZF9ydW4odGhyZWFkZm4sIHRpbmZvLCBuYW1lKTsKLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXJlc3VsdCA9IFBUUl9FUlIodGFzayk7Ci0JCWdvdG8gb3V0dGluZm87Ci0JfQotCi0JLyogbWFyayBhcyBhY3RpdmUgKi8KLQkqcmVhbHRhc2sgPSB0YXNrOwotCWlwX3ZzX3N5bmNfc3RhdGUgfD0gc3RhdGU7Ci0KLQkvKiBpbmNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLwotCWlwX3ZzX3VzZV9jb3VudF9pbmMoKTsKLQotCXJldHVybiAwOwotCi1vdXR0aW5mbzoKLQlrZnJlZSh0aW5mbyk7Ci1vdXRidWY6Ci0Ja2ZyZWUoYnVmKTsKLW91dHNvY2tldDoKLQlzb2NrX3JlbGVhc2Uoc29jayk7Ci1vdXQ6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1pbnQgc3RvcF9zeW5jX3RocmVhZChpbnQgc3RhdGUpCi17Ci0JSVBfVlNfREJHKDcsICIlczogcGlkICVkXG4iLCBfX2Z1bmNfXywgdGFza19waWRfbnIoY3VycmVudCkpOwotCi0JaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgewotCQlpZiAoIXN5bmNfbWFzdGVyX3RocmVhZCkKLQkJCXJldHVybiAtRVNSQ0g7Ci0KLQkJSVBfVlNfSU5GTygic3RvcHBpbmcgbWFzdGVyIHN5bmMgdGhyZWFkICVkIC4uLlxuIiwKLQkJCSAgIHRhc2tfcGlkX25yKHN5bmNfbWFzdGVyX3RocmVhZCkpOwotCi0JCS8qCi0JCSAqIFRoZSBsb2NrIHN5bmNocm9uaXplcyB3aXRoIHNiX3F1ZXVlX3RhaWwoKSwgc28gdGhhdCB3ZSBkb24ndAotCQkgKiBhZGQgc3luYyBidWZmZXJzIHRvIHRoZSBxdWV1ZSwgd2hlbiB3ZSBhcmUgYWxyZWFkeSBpbgotCQkgKiBwcm9ncmVzcyBvZiBzdG9wcGluZyB0aGUgbWFzdGVyIHN5bmMgZGFlbW9uLgotCQkgKi8KLQotCQlzcGluX2xvY2tfYmgoJmlwX3ZzX3N5bmNfbG9jayk7Ci0JCWlwX3ZzX3N5bmNfc3RhdGUgJj0gfklQX1ZTX1NUQVRFX01BU1RFUjsKLQkJc3Bpbl91bmxvY2tfYmgoJmlwX3ZzX3N5bmNfbG9jayk7Ci0JCWt0aHJlYWRfc3RvcChzeW5jX21hc3Rlcl90aHJlYWQpOwotCQlzeW5jX21hc3Rlcl90aHJlYWQgPSBOVUxMOwotCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQKSB7Ci0JCWlmICghc3luY19iYWNrdXBfdGhyZWFkKQotCQkJcmV0dXJuIC1FU1JDSDsKLQotCQlJUF9WU19JTkZPKCJzdG9wcGluZyBiYWNrdXAgc3luYyB0aHJlYWQgJWQgLi4uXG4iLAotCQkJICAgdGFza19waWRfbnIoc3luY19iYWNrdXBfdGhyZWFkKSk7Ci0KLQkJaXBfdnNfc3luY19zdGF0ZSAmPSB+SVBfVlNfU1RBVEVfQkFDS1VQOwotCQlrdGhyZWFkX3N0b3Aoc3luY19iYWNrdXBfdGhyZWFkKTsKLQkJc3luY19iYWNrdXBfdGhyZWFkID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLwotCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c193bGMuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfd2xjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMGVmODYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c193bGMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogSVBWUzogICAgICAgIFdlaWdodGVkIExlYXN0LUNvbm5lY3Rpb24gU2NoZWR1bGluZyBtb2R1bGUKLSAqCi0gKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgotICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3dsY19zY2hlZHVsZSB0byByZXR1cm4gZGVzdAotICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIHRvIHVzZSB0aGUgaW5hY3Rjb25ucyBpbiBzY2hlZHVsaW5nCi0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgc29tZSBjb21lc3RpY3MgdGhpbmdzIGZvciBkZWJ1Z2dpbmcKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBmb3IgdGhlIGQtbGlua2VkIGRlc3RpbmF0aW9uIGxpc3QKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgYWRkZWQgdGhlIGlwX3ZzX3dsY191cGRhdGVfc3ZjCi0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIGFueSBkZXN0IHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bmV0L2lwX3ZzLmg+Ci0KLQotc3RhdGljIGludAotaXBfdnNfd2xjX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaXBfdnNfd2xjX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotaXBfdnNfd2xjX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotaXBfdnNfd2xjX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0JLyoKLQkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgMjU2Ci0JICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcwotCSAqIDI1NiB0aW1lcyBtaWdodCBub3QgYmUgYWNjdXJhdGUsIHdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyKSBXZQotCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkIG5vdzoKLQkgKgkJICBkZXN0LT5hY3RpdmVjb25ucyoyNTYgKyBkZXN0LT5pbmFjdGNvbm5zCi0JICovCi0JcmV0dXJuIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpIDw8IDgpICsKLQkJYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOwotfQotCi0KLS8qCi0gKglXZWlnaHRlZCBMZWFzdCBDb25uZWN0aW9uIHNjaGVkdWxpbmcKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX3dsY19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7Ci0JdW5zaWduZWQgaW50IGxvaCwgZG9oOwotCi0JSVBfVlNfREJHKDYsICJpcF92c193bGNfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7Ci0KLQkvKgotCSAqIFdlIGNhbGN1bGF0ZSB0aGUgbG9hZCBvZiBlYWNoIGRlc3Qgc2VydmVyIGFzIGZvbGxvd3M6Ci0JICoJCSAgKGRlc3Qgb3ZlcmhlYWQpIC8gZGVzdC0+d2VpZ2h0Ci0JICoKLQkgKiBSZW1lbWJlciAtLSBubyBmbG9hdHMgaW4ga2VybmVsIG1vZGUhISEKLQkgKiBUaGUgY29tcGFyaXNvbiBvZiBoMSp3MiA+IGgyKncxIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBvZgotCSAqCQkgIGgxL3cxID4gaDIvdzIKLQkgKiBpZiBldmVyeSB3ZWlnaHQgaXMgbGFyZ2VyIHRoYW4gemVyby4KLQkgKgotCSAqIFRoZSBzZXJ2ZXIgd2l0aCB3ZWlnaHQ9MCBpcyBxdWllc2NlZCBhbmQgd2lsbCBub3QgcmVjZWl2ZSBhbnkKLQkgKiBuZXcgY29ubmVjdGlvbnMuCi0JICovCi0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7Ci0JCWlmICghKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKSAmJgotCQkgICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBpcF92c193bGNfZGVzdF9vdmVyaGVhZChsZWFzdCk7Ci0JCQlnb3RvIG5leHRzdGFnZTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLQotCS8qCi0JICogICAgRmluZCB0aGUgZGVzdGluYXRpb24gd2l0aCB0aGUgbGVhc3QgbG9hZC4KLQkgKi8KLSAgbmV4dHN0YWdlOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKLQkJaWYgKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKQotCQkJY29udGludWU7Ci0JCWRvaCA9IGlwX3ZzX3dsY19kZXN0X292ZXJoZWFkKGRlc3QpOwotCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgotCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7Ci0JCQlsZWFzdCA9IGRlc3Q7Ci0JCQlsb2ggPSBkb2g7Ci0JCX0KLQl9Ci0KLQlJUF9WU19EQkcoNiwgIldMQzogc2VydmVyICV1LiV1LiV1LiV1OiV1ICIKLQkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKLQkJICBOSVBRVUFEKGxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+YWN0aXZlY29ubnMpLAotCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKLQkJICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7Ci0KLQlyZXR1cm4gbGVhc3Q7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfd2xjX3NjaGVkdWxlciA9Ci17Ci0JLm5hbWUgPQkJCSJ3bGMiLAotCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCi0JLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKLQkubl9saXN0ID0JCUxJU1RfSEVBRF9JTklUKGlwX3ZzX3dsY19zY2hlZHVsZXIubl9saXN0KSwKLQkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX3dsY19pbml0X3N2YywKLQkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX3dsY19kb25lX3N2YywKLQkudXBkYXRlX3NlcnZpY2UgPQlpcF92c193bGNfdXBkYXRlX3N2YywKLQkuc2NoZWR1bGUgPQkJaXBfdnNfd2xjX3NjaGVkdWxlLAotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF92c193bGNfaW5pdCh2b2lkKQotewotCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3dsY19zY2hlZHVsZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfd2xjX2NsZWFudXAodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfd2xjX3NjaGVkdWxlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX3ZzX3dsY19pbml0KTsKLW1vZHVsZV9leGl0KGlwX3ZzX3dsY19jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfd3JyLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3dyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg2YTc5Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfd3JyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIElQVlM6ICAgICAgICBXZWlnaHRlZCBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nIG1vZHVsZQotICoKLSAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+Ci0gKgotICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ2hhbmdlczoKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCB0aGUgaXBfdnNfd3JyX3NjaGVkdWxlIHRvIHJldHVybiBkZXN0Ci0gKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgc29tZSBjb21lc3RpY3MgdGhpbmdzIGZvciBkZWJ1Z2dpbmcKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBmb3IgdGhlIGQtbGlua2VkIGRlc3RpbmF0aW9uIGxpc3QKLSAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgYWRkZWQgdGhlIGlwX3ZzX3dycl91cGRhdGVfc3ZjCi0gKiAgICAgSnVsaWFuIEFuYXN0YXNvdiAgICAgICAgIDogICAgIGZpeGVkIHRoZSBidWcgb2YgcmV0dXJuaW5nIGRlc3RpbmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggd2VpZ2h0IDAgd2hlbiBhbGwgd2VpZ2h0cyBhcmUgemVybwotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KLQotLyoKLSAqIGN1cnJlbnQgZGVzdGluYXRpb24gcG9pbnRlciBmb3Igd2VpZ2h0ZWQgcm91bmQtcm9iaW4gc2NoZWR1bGluZwotICovCi1zdHJ1Y3QgaXBfdnNfd3JyX21hcmsgewotCXN0cnVjdCBsaXN0X2hlYWQgKmNsOwkvKiBjdXJyZW50IGxpc3QgaGVhZCAqLwotCWludCBjdzsJCQkvKiBjdXJyZW50IHdlaWdodCAqLwotCWludCBtdzsJCQkvKiBtYXhpbXVtIHdlaWdodCAqLwotCWludCBkaTsJCQkvKiBkZWNyZWFzaW5nIGludGVydmFsICovCi19OwotCi0KLS8qCi0gKiAgICBHZXQgdGhlIGdjZCBvZiBzZXJ2ZXIgd2VpZ2h0cwotICovCi1zdGF0aWMgaW50IGdjZChpbnQgYSwgaW50IGIpCi17Ci0JaW50IGM7Ci0KLQl3aGlsZSAoKGMgPSBhICUgYikpIHsKLQkJYSA9IGI7Ci0JCWIgPSBjOwotCX0KLQlyZXR1cm4gYjsKLX0KLQotc3RhdGljIGludCBpcF92c193cnJfZ2NkX3dlaWdodChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCWludCB3ZWlnaHQ7Ci0JaW50IGcgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCQl3ZWlnaHQgPSBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KTsKLQkJaWYgKHdlaWdodCA+IDApIHsKLQkJCWlmIChnID4gMCkKLQkJCQlnID0gZ2NkKHdlaWdodCwgZyk7Ci0JCQllbHNlCi0JCQkJZyA9IHdlaWdodDsKLQkJfQotCX0KLQlyZXR1cm4gZyA/IGcgOiAxOwotfQotCi0KLS8qCi0gKiAgICBHZXQgdGhlIG1heGltdW0gd2VpZ2h0IG9mIHRoZSBzZXJ2aWNlIGRlc3RpbmF0aW9ucy4KLSAqLwotc3RhdGljIGludCBpcF92c193cnJfbWF4X3dlaWdodChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCWludCB3ZWlnaHQgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgewotCQlpZiAoYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiB3ZWlnaHQpCi0JCQl3ZWlnaHQgPSBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KTsKLQl9Ci0KLQlyZXR1cm4gd2VpZ2h0OwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfd3JyX2luaXRfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0Jc3RydWN0IGlwX3ZzX3dycl9tYXJrICptYXJrOwotCi0JLyoKLQkgKiAgICBBbGxvY2F0ZSB0aGUgbWFyayB2YXJpYWJsZSBmb3IgV1JSIHNjaGVkdWxpbmcKLQkgKi8KLQltYXJrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX3dycl9tYXJrKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1hcmsgPT0gTlVMTCkgewotCQlJUF9WU19FUlIoImlwX3ZzX3dycl9pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWFyay0+Y2wgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7Ci0JbWFyay0+Y3cgPSAwOwotCW1hcmstPm13ID0gaXBfdnNfd3JyX21heF93ZWlnaHQoc3ZjKTsKLQltYXJrLT5kaSA9IGlwX3ZzX3dycl9nY2Rfd2VpZ2h0KHN2Yyk7Ci0Jc3ZjLT5zY2hlZF9kYXRhID0gbWFyazsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfd3JyX2RvbmVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCi17Ci0JLyoKLQkgKiAgICBSZWxlYXNlIHRoZSBtYXJrIHZhcmlhYmxlCi0JICovCi0Ja2ZyZWUoc3ZjLT5zY2hlZF9kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXBfdnNfd3JyX3VwZGF0ZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKLXsKLQlzdHJ1Y3QgaXBfdnNfd3JyX21hcmsgKm1hcmsgPSBzdmMtPnNjaGVkX2RhdGE7Ci0KLQltYXJrLT5jbCA9ICZzdmMtPmRlc3RpbmF0aW9uczsKLQltYXJrLT5tdyA9IGlwX3ZzX3dycl9tYXhfd2VpZ2h0KHN2Yyk7Ci0JbWFyay0+ZGkgPSBpcF92c193cnJfZ2NkX3dlaWdodChzdmMpOwotCWlmIChtYXJrLT5jdyA+IG1hcmstPm13KQotCQltYXJrLT5jdyA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqICAgIFdlaWdodGVkIFJvdW5kLVJvYmluIFNjaGVkdWxpbmcKLSAqLwotc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKLWlwX3ZzX3dycl9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwotCXN0cnVjdCBpcF92c193cnJfbWFyayAqbWFyayA9IHN2Yy0+c2NoZWRfZGF0YTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCi0JSVBfVlNfREJHKDYsICJpcF92c193cnJfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7Ci0KLQkvKgotCSAqIFRoaXMgbG9vcCB3aWxsIGFsd2F5cyB0ZXJtaW5hdGUsIGJlY2F1c2UgbWFyay0+Y3cgaW4gKDAsIG1heF93ZWlnaHRdCi0JICogYW5kIGF0IGxlYXN0IG9uZSBzZXJ2ZXIgaGFzIGl0cyB3ZWlnaHQgZXF1YWwgdG8gbWF4X3dlaWdodC4KLQkgKi8KLQl3cml0ZV9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOwotCXAgPSBtYXJrLT5jbDsKLQl3aGlsZSAoMSkgewotCQlpZiAobWFyay0+Y2wgPT0gJnN2Yy0+ZGVzdGluYXRpb25zKSB7Ci0JCQkvKiBpdCBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgZGVzdGluYXRpb24gbGlzdCAqLwotCi0JCQlpZiAobWFyay0+Y2wgPT0gbWFyay0+Y2wtPm5leHQpIHsKLQkJCQkvKiBubyBkZXN0IGVudHJ5ICovCi0JCQkJZGVzdCA9IE5VTEw7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCW1hcmstPmNsID0gc3ZjLT5kZXN0aW5hdGlvbnMubmV4dDsKLQkJCW1hcmstPmN3IC09IG1hcmstPmRpOwotCQkJaWYgKG1hcmstPmN3IDw9IDApIHsKLQkJCQltYXJrLT5jdyA9IG1hcmstPm13OwotCQkJCS8qCi0JCQkJICogU3RpbGwgemVybywgd2hpY2ggbWVhbnMgbm8gYXZhaWxhYmxlIHNlcnZlcnMuCi0JCQkJICovCi0JCQkJaWYgKG1hcmstPmN3ID09IDApIHsKLQkJCQkJbWFyay0+Y2wgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7Ci0JCQkJCUlQX1ZTX0VSUl9STCgiaXBfdnNfd3JyX3NjaGVkdWxlKCk6ICIKLQkJCQkJCSAgICJubyBhdmFpbGFibGUgc2VydmVyc1xuIik7Ci0JCQkJCWRlc3QgPSBOVUxMOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZQotCQkJbWFyay0+Y2wgPSBtYXJrLT5jbC0+bmV4dDsKLQotCQlpZiAobWFyay0+Y2wgIT0gJnN2Yy0+ZGVzdGluYXRpb25zKSB7Ci0JCQkvKiBub3QgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KLQkJCWRlc3QgPSBsaXN0X2VudHJ5KG1hcmstPmNsLCBzdHJ1Y3QgaXBfdnNfZGVzdCwgbl9saXN0KTsKLQkJCWlmICghKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKSAmJgotCQkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID49IG1hcmstPmN3KSB7Ci0JCQkJLyogZ290IGl0ICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWFyay0+Y2wgPT0gcCAmJiBtYXJrLT5jdyA9PSBtYXJrLT5kaSkgewotCQkJLyogYmFjayB0byB0aGUgc3RhcnQsIGFuZCBubyBkZXN0IGlzIGZvdW5kLgotCQkJICAgSXQgaXMgb25seSBwb3NzaWJsZSB3aGVuIGFsbCBkZXN0cyBhcmUgT1ZFUkxPQURFRCAqLwotCQkJZGVzdCA9IE5VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCUlQX1ZTX0RCRyg2LCAiV1JSOiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JXUgIgotCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkXG4iLAotCQkgIE5JUFFVQUQoZGVzdC0+YWRkciksIG50b2hzKGRlc3QtPnBvcnQpLAotCQkgIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucyksCi0JCSAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCksCi0JCSAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkpOwotCi0gIG91dDoKLQl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7Ci0JcmV0dXJuIGRlc3Q7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfd3JyX3NjaGVkdWxlciA9IHsKLQkubmFtZSA9CQkJIndyciIsCi0JLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKLQkubW9kdWxlID0JCVRISVNfTU9EVUxFLAotCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfd3JyX3NjaGVkdWxlci5uX2xpc3QpLAotCS5pbml0X3NlcnZpY2UgPQkJaXBfdnNfd3JyX2luaXRfc3ZjLAotCS5kb25lX3NlcnZpY2UgPQkJaXBfdnNfd3JyX2RvbmVfc3ZjLAotCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3dycl91cGRhdGVfc3ZjLAotCS5zY2hlZHVsZSA9CQlpcF92c193cnJfc2NoZWR1bGUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF92c193cnJfaW5pdCh2b2lkKQotewotCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3dycl9zY2hlZHVsZXIpIDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX3dycl9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3dycl9zY2hlZHVsZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcF92c193cnJfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF92c193cnJfY2xlYW51cCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfeG1pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODkyZDRhLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfeG1pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qCi0gKiBpcF92c194bWl0LmM6IHZhcmlvdXMgcGFja2V0IHRyYW5zbWl0dGVycyBmb3IgSVBWUwotICoKLSAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+Ci0gKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgotICoKLSAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENoYW5nZXM6Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgdGNwaGRyICovCi0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPiAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNzdW1fdGNwdWRwX21hZ2ljICovCi0jaW5jbHVkZSA8bmV0L3VkcC5oPgotI2luY2x1ZGUgPG5ldC9pY21wLmg+ICAgICAgICAgICAgICAgICAgIC8qIGZvciBpY21wX3NlbmQgKi8KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4gICAgICAgICAgICAgICAgICAvKiBmb3IgaXBfcm91dGVfb3V0cHV0ICovCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLQotI2luY2x1ZGUgPG5ldC9pcF92cy5oPgotCi0KLS8qCi0gKiAgICAgIERlc3RpbmF0aW9uIGNhY2hlIHRvIHNwZWVkIHVwIG91dGdvaW5nIHJvdXRlIGxvb2t1cAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXBfdnNfZHN0X3NldChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgdTMyIHJ0b3MsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKLXsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpvbGRfZHN0OwotCi0Jb2xkX2RzdCA9IGRlc3QtPmRzdF9jYWNoZTsKLQlkZXN0LT5kc3RfY2FjaGUgPSBkc3Q7Ci0JZGVzdC0+ZHN0X3J0b3MgPSBydG9zOwotCWRzdF9yZWxlYXNlKG9sZF9kc3QpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkc3RfZW50cnkgKgotX19pcF92c19kc3RfY2hlY2soc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHUzMiBydG9zLCB1MzIgY29va2llKQotewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IGRlc3QtPmRzdF9jYWNoZTsKLQotCWlmICghZHN0KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGRzdC0+b2Jzb2xldGUgfHwgcnRvcyAhPSBkZXN0LT5kc3RfcnRvcykgJiYKLQkgICAgZHN0LT5vcHMtPmNoZWNrKGRzdCwgY29va2llKSA9PSBOVUxMKSB7Ci0JCWRlc3QtPmRzdF9jYWNoZSA9IE5VTEw7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkc3RfaG9sZChkc3QpOwotCXJldHVybiBkc3Q7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRhYmxlICoKLV9faXBfdnNfZ2V0X291dF9ydChzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHUzMiBydG9zKQotewotCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCi0Jc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKLQotCWlmIChkZXN0KSB7Ci0JCXNwaW5fbG9jaygmZGVzdC0+ZHN0X2xvY2spOwotCQlpZiAoIShydCA9IChzdHJ1Y3QgcnRhYmxlICopCi0JCSAgICAgIF9faXBfdnNfZHN0X2NoZWNrKGRlc3QsIHJ0b3MsIDApKSkgewotCQkJc3RydWN0IGZsb3dpIGZsID0gewotCQkJCS5vaWYgPSAwLAotCQkJCS5ubF91ID0gewotCQkJCQkuaXA0X3UgPSB7Ci0JCQkJCQkuZGFkZHIgPSBkZXN0LT5hZGRyLAotCQkJCQkJLnNhZGRyID0gMCwKLQkJCQkJCS50b3MgPSBydG9zLCB9IH0sCi0JCQl9OwotCi0JCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmaW5pdF9uZXQsICZydCwgJmZsKSkgewotCQkJCXNwaW5fdW5sb2NrKCZkZXN0LT5kc3RfbG9jayk7Ci0JCQkJSVBfVlNfREJHX1JMKCJpcF9yb3V0ZV9vdXRwdXQgZXJyb3IsICIKLQkJCQkJICAgICAiZGVzdDogJXUuJXUuJXUuJXVcbiIsCi0JCQkJCSAgICAgTklQUVVBRChkZXN0LT5hZGRyKSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlfX2lwX3ZzX2RzdF9zZXQoZGVzdCwgcnRvcywgZHN0X2Nsb25lKCZydC0+dS5kc3QpKTsKLQkJCUlQX1ZTX0RCRygxMCwgIm5ldyBkc3QgJXUuJXUuJXUuJXUsIHJlZmNudD0lZCwgcnRvcz0lWFxuIiwKLQkJCQkgIE5JUFFVQUQoZGVzdC0+YWRkciksCi0JCQkJICBhdG9taWNfcmVhZCgmcnQtPnUuZHN0Ll9fcmVmY250KSwgcnRvcyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7Ci0JCQkub2lmID0gMCwKLQkJCS5ubF91ID0gewotCQkJCS5pcDRfdSA9IHsKLQkJCQkJLmRhZGRyID0gY3AtPmRhZGRyLAotCQkJCQkuc2FkZHIgPSAwLAotCQkJCQkudG9zID0gcnRvcywgfSB9LAotCQl9OwotCi0JCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZpbml0X25ldCwgJnJ0LCAmZmwpKSB7Ci0JCQlJUF9WU19EQkdfUkwoImlwX3JvdXRlX291dHB1dCBlcnJvciwgZGVzdDogIgotCQkJCSAgICAgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGNwLT5kYWRkcikpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcnQ7Ci19Ci0KLQotLyoKLSAqCVJlbGVhc2UgZGVzdC0+ZHN0X2NhY2hlIGJlZm9yZSBhIGRlc3QgaXMgcmVtb3ZlZAotICovCi12b2lkCi1pcF92c19kc3RfcmVzZXQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqb2xkX2RzdDsKLQotCW9sZF9kc3QgPSBkZXN0LT5kc3RfY2FjaGU7Ci0JZGVzdC0+ZHN0X2NhY2hlID0gTlVMTDsKLQlkc3RfcmVsZWFzZShvbGRfZHN0KTsKLX0KLQotI2RlZmluZSBJUF9WU19YTUlUKHNrYiwgcnQpCQkJCVwKLWRvIHsJCQkJCQkJXAotCShza2IpLT5pcHZzX3Byb3BlcnR5ID0gMTsJCQlcCi0Jc2tiX2ZvcndhcmRfY3N1bShza2IpOwkJCQlcCi0JTkZfSE9PSyhQRl9JTkVULCBORl9JTkVUX0xPQ0FMX09VVCwgKHNrYiksIE5VTEwsCVwKLQkJKHJ0KS0+dS5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsJCVwKLX0gd2hpbGUgKDApCi0KLQotLyoKLSAqICAgICAgTlVMTCB0cmFuc21pdHRlciAoZG8gbm90aGluZyBleGNlcHQgcmV0dXJuIE5GX0FDQ0VQVCkKLSAqLwotaW50Ci1pcF92c19udWxsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCS8qIHdlIGRvIG5vdCB0b3VjaCBza2IgYW5kIGRvIG5vdCBuZWVkIHBza2IgcHRyICovCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotCi0vKgotICogICAgICBCeXBhc3MgdHJhbnNtaXR0ZXIKLSAqICAgICAgTGV0IHBhY2tldHMgYnlwYXNzIHRoZSBkZXN0aW5hdGlvbiB3aGVuIHRoZSBkZXN0aW5hdGlvbiBpcyBub3QKLSAqICAgICAgYXZhaWxhYmxlLCBpdCBtYXkgYmUgb25seSB1c2VkIGluIHRyYW5zcGFyZW50IGNhY2hlIGNsdXN0ZXIuCi0gKi8KLWludAotaXBfdnNfYnlwYXNzX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCQkgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7CQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KLQlzdHJ1Y3QgaXBoZHIgICppcGggPSBpcF9oZHIoc2tiKTsKLQl1OCAgICAgdG9zID0gaXBoLT50b3M7Ci0JaW50ICAgIG10dTsKLQlzdHJ1Y3QgZmxvd2kgZmwgPSB7Ci0JCS5vaWYgPSAwLAotCQkubmxfdSA9IHsKLQkJCS5pcDRfdSA9IHsKLQkJCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAotCQkJCS5zYWRkciA9IDAsCi0JCQkJLnRvcyA9IFJUX1RPUyh0b3MpLCB9IH0sCi0JfTsKLQotCUVudGVyRnVuY3Rpb24oMTApOwotCi0JaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJmluaXRfbmV0LCAmcnQsICZmbCkpIHsKLQkJSVBfVlNfREJHX1JMKCJpcF92c19ieXBhc3NfeG1pdCgpOiBpcF9yb3V0ZV9vdXRwdXQgZXJyb3IsICIKLQkJCSAgICAgImRlc3Q6ICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKLQkJZ290byB0eF9lcnJvcl9pY21wOwotCX0KLQotCS8qIE1UVSBjaGVja2luZyAqLwotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7Ci0JaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKSB7Ci0JCWlwX3J0X3B1dChydCk7Ci0JCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwotCQlJUF9WU19EQkdfUkwoImlwX3ZzX2J5cGFzc194bWl0KCk6IGZyYWcgbmVlZGVkXG4iKTsKLQkJZ290byB0eF9lcnJvcjsKLQl9Ci0KLQkvKgotCSAqIENhbGwgaXBfc2VuZF9jaGVjayBiZWNhdXNlIHdlIGFyZSBub3Qgc3VyZSBpdCBpcyBjYWxsZWQKLQkgKiBhZnRlciBpcF9kZWZyYWcuIElzIGNvcHktb24td3JpdGUgbmVlZGVkPwotCSAqLwotCWlmICh1bmxpa2VseSgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpKSB7Ci0JCWlwX3J0X3B1dChydCk7Ci0JCXJldHVybiBORl9TVE9MRU47Ci0JfQotCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwotCi0JLyogZHJvcCBvbGQgcm91dGUgKi8KLQlkc3RfcmVsZWFzZShza2ItPmRzdCk7Ci0Jc2tiLT5kc3QgPSAmcnQtPnUuZHN0OwotCi0JLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KLQlza2ItPmxvY2FsX2RmID0gMTsKLQotCUlQX1ZTX1hNSVQoc2tiLCBydCk7Ci0KLQlMZWF2ZUZ1bmN0aW9uKDEwKTsKLQlyZXR1cm4gTkZfU1RPTEVOOwotCi0gdHhfZXJyb3JfaWNtcDoKLQlkc3RfbGlua19mYWlsdXJlKHNrYik7Ci0gdHhfZXJyb3I6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JTGVhdmVGdW5jdGlvbigxMCk7Ci0JcmV0dXJuIE5GX1NUT0xFTjsKLX0KLQotCi0vKgotICogICAgICBOQVQgdHJhbnNtaXR0ZXIgKG9ubHkgZm9yIG91dHNpZGUtdG8taW5zaWRlIG5hdCBmb3J3YXJkaW5nKQotICogICAgICBOb3QgdXNlZCBmb3IgcmVsYXRlZCBJQ01QCi0gKi8KLWludAotaXBfdnNfbmF0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCSAgICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQotewotCXN0cnVjdCBydGFibGUgKnJ0OwkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KLQlpbnQgbXR1OwotCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KLQlFbnRlckZ1bmN0aW9uKDEwKTsKLQotCS8qIGNoZWNrIGlmIGl0IGlzIGEgY29ubmVjdGlvbiBvZiBuby1jbGllbnQtcG9ydCAqLwotCWlmICh1bmxpa2VseShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpKSB7Ci0JCV9fYmUxNiBfcHQsICpwOwotCQlwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwgc2l6ZW9mKF9wdCksICZfcHQpOwotCQlpZiAocCA9PSBOVUxMKQotCQkJZ290byB0eF9lcnJvcjsKLQkJaXBfdnNfY29ubl9maWxsX2Nwb3J0KGNwLCAqcCk7Ci0JCUlQX1ZTX0RCRygxMCwgImZpbGxlZCBjcG9ydD0lZFxuIiwgbnRvaHMoKnApKTsKLQl9Ci0KLQlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwaC0+dG9zKSkpKQotCQlnb3RvIHR4X2Vycm9yX2ljbXA7Ci0KLQkvKiBNVFUgY2hlY2tpbmcgKi8KLQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgewotCQlpcF9ydF9wdXQocnQpOwotCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKLQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLCAiaXBfdnNfbmF0X3htaXQoKTogZnJhZyBuZWVkZWQgZm9yIik7Ci0JCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0JLyogY29weS1vbi13cml0ZSB0aGUgcGFja2V0IGJlZm9yZSBtYW5nbGluZyBpdCAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCi0JCWdvdG8gdHhfZXJyb3JfcHV0OwotCi0JaWYgKHNrYl9jb3coc2tiLCBydC0+dS5kc3QuZGV2LT5oYXJkX2hlYWRlcl9sZW4pKQotCQlnb3RvIHR4X2Vycm9yX3B1dDsKLQotCS8qIGRyb3Agb2xkIHJvdXRlICovCi0JZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKLQotCS8qIG1hbmdsZSB0aGUgcGFja2V0ICovCi0JaWYgKHBwLT5kbmF0X2hhbmRsZXIgJiYgIXBwLT5kbmF0X2hhbmRsZXIoc2tiLCBwcCwgY3ApKQotCQlnb3RvIHR4X2Vycm9yOwotCWlwX2hkcihza2IpLT5kYWRkciA9IGNwLT5kYWRkcjsKLQlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKLQotCUlQX1ZTX0RCR19QS1QoMTAsIHBwLCBza2IsIDAsICJBZnRlciBETkFUIik7Ci0KLQkvKiBGSVhNRTogd2hlbiBhcHBsaWNhdGlvbiBoZWxwZXIgZW5sYXJnZXMgdGhlIHBhY2tldCBhbmQgdGhlIGxlbmd0aAotCSAgIGlzIGxhcmdlciB0aGFuIHRoZSBNVFUgb2Ygb3V0Z29pbmcgZGV2aWNlLCB0aGVyZSB3aWxsIGJlIHN0aWxsCi0JICAgTVRVIHByb2JsZW0uICovCi0KLQkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwotCXNrYi0+bG9jYWxfZGYgPSAxOwotCi0JSVBfVlNfWE1JVChza2IsIHJ0KTsKLQotCUxlYXZlRnVuY3Rpb24oMTApOwotCXJldHVybiBORl9TVE9MRU47Ci0KLSAgdHhfZXJyb3JfaWNtcDoKLQlkc3RfbGlua19mYWlsdXJlKHNrYik7Ci0gIHR4X2Vycm9yOgotCUxlYXZlRnVuY3Rpb24oMTApOwotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORl9TVE9MRU47Ci0gIHR4X2Vycm9yX3B1dDoKLQlpcF9ydF9wdXQocnQpOwotCWdvdG8gdHhfZXJyb3I7Ci19Ci0KLQotLyoKLSAqICAgSVAgVHVubmVsaW5nIHRyYW5zbWl0dGVyCi0gKgotICogICBUaGlzIGZ1bmN0aW9uIGVuY2Fwc3VsYXRlcyB0aGUgcGFja2V0IGluIGEgbmV3IElQIHBhY2tldCwgaXRzCi0gKiAgIGRlc3RpbmF0aW9uIHdpbGwgYmUgc2V0IHRvIGNwLT5kYWRkci4gTW9zdCBjb2RlIG9mIHRoaXMgZnVuY3Rpb24KLSAqICAgaXMgdGFrZW4gZnJvbSBpcGlwLmMuCi0gKgotICogICBJdCBpcyB1c2VkIGluIFZTL1RVTiBjbHVzdGVyLiBUaGUgbG9hZCBiYWxhbmNlciBzZWxlY3RzIGEgcmVhbAotICogICBzZXJ2ZXIgZnJvbSBhIGNsdXN0ZXIgYmFzZWQgb24gYSBzY2hlZHVsaW5nIGFsZ29yaXRobSwKLSAqICAgZW5jYXBzdWxhdGVzIHRoZSByZXF1ZXN0IHBhY2tldCBhbmQgZm9yd2FyZHMgaXQgdG8gdGhlIHNlbGVjdGVkCi0gKiAgIHNlcnZlci4gRm9yIGV4YW1wbGUsIGFsbCByZWFsIHNlcnZlcnMgYXJlIGNvbmZpZ3VyZWQgd2l0aAotICogICAiaWZjb25maWcgdHVubDAgPFZpcnR1YWwgSVAgQWRkcmVzcz4gdXAiLiBXaGVuIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMKLSAqICAgdGhlIGVuY2Fwc3VsYXRlZCBwYWNrZXQsIGl0IHdpbGwgZGVjYXBzdWxhdGUgdGhlIHBhY2tldCwgcHJvY2Vzc2UKLSAqICAgdGhlIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgcmVzcG9uc2UgcGFja2V0cyBkaXJlY3RseSB0byB0aGUgY2xpZW50Ci0gKiAgIHdpdGhvdXQgcGFzc2luZyB0aGUgbG9hZCBiYWxhbmNlci4gVGhpcyBjYW4gZ3JlYXRseSBpbmNyZWFzZSB0aGUKLSAqICAgc2NhbGFiaWxpdHkgb2YgdmlydHVhbCBzZXJ2ZXIuCi0gKgotICogICBVc2VkIGZvciBBTlkgcHJvdG9jb2wKLSAqLwotaW50Ci1pcF92c190dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCi0JCSAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKLXsKLQlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwotCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KLQlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gaXBfaGRyKHNrYik7Ci0JdTggICAgIHRvcyA9IG9sZF9pcGgtPnRvczsKLQlfX2JlMTYgZGYgPSBvbGRfaXBoLT5mcmFnX29mZjsKLQlza19idWZmX2RhdGFfdCBvbGRfdHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKLQlzdHJ1Y3QgaXBoZHIgICppcGg7CQkJLyogT3VyIG5ldyBJUCBoZWFkZXIgKi8KLQl1bnNpZ25lZCBpbnQgbWF4X2hlYWRyb29tOwkJLyogVGhlIGV4dHJhIGhlYWRlciBzcGFjZSBuZWVkZWQgKi8KLQlpbnQgICAgbXR1OwotCi0JRW50ZXJGdW5jdGlvbigxMCk7Ci0KLQlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJSVBfVlNfREJHX1JMKCJpcF92c190dW5uZWxfeG1pdCgpOiBwcm90b2NvbCBlcnJvciwgIgotCQkJICAgICAiRVRIX1BfSVA6ICVkLCBza2IgcHJvdG9jb2w6ICVkXG4iLAotCQkJICAgICBodG9ucyhFVEhfUF9JUCksIHNrYi0+cHJvdG9jb2wpOwotCQlnb3RvIHR4X2Vycm9yOwotCX0KLQotCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1ModG9zKSkpKQotCQlnb3RvIHR4X2Vycm9yX2ljbXA7Ci0KLQl0ZGV2ID0gcnQtPnUuZHN0LmRldjsKLQotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCkgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKLQlpZiAobXR1IDwgNjgpIHsKLQkJaXBfcnRfcHV0KHJ0KTsKLQkJSVBfVlNfREJHX1JMKCJpcF92c190dW5uZWxfeG1pdCgpOiBtdHUgbGVzcyB0aGFuIDY4XG4iKTsKLQkJZ290byB0eF9lcnJvcjsKLQl9Ci0JaWYgKHNrYi0+ZHN0KQotCQlza2ItPmRzdC0+b3BzLT51cGRhdGVfcG10dShza2ItPmRzdCwgbXR1KTsKLQotCWRmIHw9IChvbGRfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSk7Ci0KLQlpZiAoKG9sZF9pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKQotCSAgICAmJiBtdHUgPCBudG9ocyhvbGRfaXBoLT50b3RfbGVuKSkgewotCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKLQkJaXBfcnRfcHV0KHJ0KTsKLQkJSVBfVlNfREJHX1JMKCJpcF92c190dW5uZWxfeG1pdCgpOiBmcmFnIG5lZWRlZFxuIik7Ci0JCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0JLyoKLQkgKiBPa2F5LCBub3cgc2VlIGlmIHdlIGNhbiBzdHVmZiBpdCBpbiB0aGUgYnVmZmVyIGFzLWlzLgotCSAqLwotCW1heF9oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFKHRkZXYpICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7Ci0KLQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBtYXhfaGVhZHJvb20KLQkgICAgfHwgc2tiX2Nsb25lZChza2IpIHx8IHNrYl9zaGFyZWQoc2tiKSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9Ci0JCQlza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heF9oZWFkcm9vbSk7Ci0JCWlmICghbmV3X3NrYikgewotCQkJaXBfcnRfcHV0KHJ0KTsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJSVBfVlNfRVJSX1JMKCJpcF92c190dW5uZWxfeG1pdCgpOiBubyBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQkJfQotCQlrZnJlZV9za2Ioc2tiKTsKLQkJc2tiID0gbmV3X3NrYjsKLQkJb2xkX2lwaCA9IGlwX2hkcihza2IpOwotCX0KLQotCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IG9sZF90cmFuc3BvcnRfaGVhZGVyOwotCi0JLyogZml4IG9sZCBJUCBoZWFkZXIgY2hlY2tzdW0gKi8KLQlpcF9zZW5kX2NoZWNrKG9sZF9pcGgpOwotCi0Jc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7Ci0Jc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7Ci0JbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKLQotCS8qIGRyb3Agb2xkIHJvdXRlICovCi0JZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKLQotCS8qCi0JICoJUHVzaCBkb3duIGFuZCBpbnN0YWxsIHRoZSBJUElQIGhlYWRlci4KLQkgKi8KLQlpcGgJCQk9CWlwX2hkcihza2IpOwotCWlwaC0+dmVyc2lvbgkJPQk0OwotCWlwaC0+aWhsCQk9CXNpemVvZihzdHJ1Y3QgaXBoZHIpPj4yOwotCWlwaC0+ZnJhZ19vZmYJCT0JZGY7Ci0JaXBoLT5wcm90b2NvbAkJPQlJUFBST1RPX0lQSVA7Ci0JaXBoLT50b3MJCT0JdG9zOwotCWlwaC0+ZGFkZHIJCT0JcnQtPnJ0X2RzdDsKLQlpcGgtPnNhZGRyCQk9CXJ0LT5ydF9zcmM7Ci0JaXBoLT50dGwJCT0Jb2xkX2lwaC0+dHRsOwotCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+dS5kc3QsIE5VTEwpOwotCi0JLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KLQlza2ItPmxvY2FsX2RmID0gMTsKLQotCWlwX2xvY2FsX291dChza2IpOwotCi0JTGVhdmVGdW5jdGlvbigxMCk7Ci0KLQlyZXR1cm4gTkZfU1RPTEVOOwotCi0gIHR4X2Vycm9yX2ljbXA6Ci0JZHN0X2xpbmtfZmFpbHVyZShza2IpOwotICB0eF9lcnJvcjoKLQlrZnJlZV9za2Ioc2tiKTsKLQlMZWF2ZUZ1bmN0aW9uKDEwKTsKLQlyZXR1cm4gTkZfU1RPTEVOOwotfQotCi0KLS8qCi0gKiAgICAgIERpcmVjdCBSb3V0aW5nIHRyYW5zbWl0dGVyCi0gKiAgICAgIFVzZWQgZm9yIEFOWSBwcm90b2NvbAotICovCi1pbnQKLWlwX3ZzX2RyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAotCSAgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7CQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KLQlzdHJ1Y3QgaXBoZHIgICppcGggPSBpcF9oZHIoc2tiKTsKLQlpbnQgICAgbXR1OwotCi0JRW50ZXJGdW5jdGlvbigxMCk7Ci0KLQlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwaC0+dG9zKSkpKQotCQlnb3RvIHR4X2Vycm9yX2ljbXA7Ci0KLQkvKiBNVFUgY2hlY2tpbmcgKi8KLQltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgJiYgc2tiLT5sZW4gPiBtdHUpIHsKLQkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7Ci0JCWlwX3J0X3B1dChydCk7Ci0JCUlQX1ZTX0RCR19STCgiaXBfdnNfZHJfeG1pdCgpOiBmcmFnIG5lZWRlZFxuIik7Ci0JCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0JLyoKLQkgKiBDYWxsIGlwX3NlbmRfY2hlY2sgYmVjYXVzZSB3ZSBhcmUgbm90IHN1cmUgaXQgaXMgY2FsbGVkCi0JICogYWZ0ZXIgaXBfZGVmcmFnLiBJcyBjb3B5LW9uLXdyaXRlIG5lZWRlZD8KLQkgKi8KLQlpZiAodW5saWtlbHkoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSkgewotCQlpcF9ydF9wdXQocnQpOwotCQlyZXR1cm4gTkZfU1RPTEVOOwotCX0KLQlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKLQotCS8qIGRyb3Agb2xkIHJvdXRlICovCi0JZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwotCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKLQotCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCi0Jc2tiLT5sb2NhbF9kZiA9IDE7Ci0KLQlJUF9WU19YTUlUKHNrYiwgcnQpOwotCi0JTGVhdmVGdW5jdGlvbigxMCk7Ci0JcmV0dXJuIE5GX1NUT0xFTjsKLQotICB0eF9lcnJvcl9pY21wOgotCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKLSAgdHhfZXJyb3I6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JTGVhdmVGdW5jdGlvbigxMCk7Ci0JcmV0dXJuIE5GX1NUT0xFTjsKLX0KLQotCi0vKgotICoJSUNNUCBwYWNrZXQgdHJhbnNtaXR0ZXIKLSAqCWNhbGxlZCBieSB0aGUgaXBfdnNfaW5faWNtcAotICovCi1pbnQKLWlwX3ZzX2ljbXBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCi0JCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHJ0YWJsZQkqcnQ7CS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCi0JaW50IG10dTsKLQlpbnQgcmM7Ci0KLQlFbnRlckZ1bmN0aW9uKDEwKTsKLQotCS8qIFRoZSBJQ01QIHBhY2tldCBmb3IgVlMvVFVOLCBWUy9EUiBhbmQgTE9DQUxOT0RFIHdpbGwgYmUKLQkgICBmb3J3YXJkZWQgZGlyZWN0bHkgaGVyZSwgYmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkIHRvCi0JICAgdHJhbnNsYXRlIGFkZHJlc3MvcG9ydCBiYWNrICovCi0JaWYgKElQX1ZTX0ZXRF9NRVRIT0QoY3ApICE9IElQX1ZTX0NPTk5fRl9NQVNRKSB7Ci0JCWlmIChjcC0+cGFja2V0X3htaXQpCi0JCQlyYyA9IGNwLT5wYWNrZXRfeG1pdChza2IsIGNwLCBwcCk7Ci0JCWVsc2UKLQkJCXJjID0gTkZfQUNDRVBUOwotCQkvKiBkbyBub3QgdG91Y2ggc2tiIGFueW1vcmUgKi8KLQkJYXRvbWljX2luYygmY3AtPmluX3BrdHMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIG1hbmdsZSBhbmQgc2VuZCB0aGUgcGFja2V0IGhlcmUgKG9ubHkgZm9yIFZTL05BVCkKLQkgKi8KLQotCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1MoaXBfaGRyKHNrYiktPnRvcykpKSkKLQkJZ290byB0eF9lcnJvcl9pY21wOwotCi0JLyogTVRVIGNoZWNraW5nICovCi0JbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKLQlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgewotCQlpcF9ydF9wdXQocnQpOwotCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7Ci0JCUlQX1ZTX0RCR19STCgiaXBfdnNfaW5faWNtcCgpOiBmcmFnIG5lZWRlZFxuIik7Ci0JCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0JLyogY29weS1vbi13cml0ZSB0aGUgcGFja2V0IGJlZm9yZSBtYW5nbGluZyBpdCAqLwotCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQpKQotCQlnb3RvIHR4X2Vycm9yX3B1dDsKLQotCWlmIChza2JfY293KHNrYiwgcnQtPnUuZHN0LmRldi0+aGFyZF9oZWFkZXJfbGVuKSkKLQkJZ290byB0eF9lcnJvcl9wdXQ7Ci0KLQkvKiBkcm9wIHRoZSBvbGQgcm91dGUgd2hlbiBza2IgaXMgbm90IHNoYXJlZCAqLwotCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKLQlza2ItPmRzdCA9ICZydC0+dS5kc3Q7Ci0KLQlpcF92c19uYXRfaWNtcChza2IsIHBwLCBjcCwgMCk7Ci0KLQkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwotCXNrYi0+bG9jYWxfZGYgPSAxOwotCi0JSVBfVlNfWE1JVChza2IsIHJ0KTsKLQotCXJjID0gTkZfU1RPTEVOOwotCWdvdG8gb3V0OwotCi0gIHR4X2Vycm9yX2ljbXA6Ci0JZHN0X2xpbmtfZmFpbHVyZShza2IpOwotICB0eF9lcnJvcjoKLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JcmMgPSBORl9TVE9MRU47Ci0gIG91dDoKLQlMZWF2ZUZ1bmN0aW9uKDEwKTsKLQlyZXR1cm4gcmM7Ci0gIHR4X2Vycm9yX3B1dDoKLQlpcF9ydF9wdXQocnQpOwotCWdvdG8gdHhfZXJyb3I7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IGY4ZWRhY2QuLjZlZmRiNzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0xMiw2ICsxMiw3IEBACiAvKiByb3V0ZV9tZV9oYXJkZXIgZnVuY3Rpb24sIHVzZWQgYnkgaXB0YWJsZV9uYXQsIGlwdGFibGVfbWFuZ2xlICsgaXBfcXVldWUgKi8KIGludCBpcF9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgYWRkcl90eXBlKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7fTsKQEAgLTE5LDcgKzIwLDkgQEAKIAl1bnNpZ25lZCBpbnQgaGhfbGVuOwogCXVuc2lnbmVkIGludCB0eXBlOwogCi0JdHlwZSA9IGluZXRfYWRkcl90eXBlKCZpbml0X25ldCwgaXBoLT5zYWRkcik7CisJdHlwZSA9IGluZXRfYWRkcl90eXBlKG5ldCwgaXBoLT5zYWRkcik7CisJaWYgKHNrYi0+c2sgJiYgaW5ldF9zayhza2ItPnNrKS0+dHJhbnNwYXJlbnQpCisJCXR5cGUgPSBSVE5fTE9DQUw7CiAJaWYgKGFkZHJfdHlwZSA9PSBSVE5fVU5TUEVDKQogCQlhZGRyX3R5cGUgPSB0eXBlOwogCkBAIC0zMyw3ICszNiw4IEBACiAJCWZsLm5sX3UuaXA0X3UudG9zID0gUlRfVE9TKGlwaC0+dG9zKTsKIAkJZmwub2lmID0gc2tiLT5zayA/IHNrYi0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDA7CiAJCWZsLm1hcmsgPSBza2ItPm1hcms7Ci0JCWlmIChpcF9yb3V0ZV9vdXRwdXRfa2V5KCZpbml0X25ldCwgJnJ0LCAmZmwpICE9IDApCisJCWZsLmZsYWdzID0gc2tiLT5zayA/IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2tiLT5zaykgOiAwOworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZydCwgJmZsKSAhPSAwKQogCQkJcmV0dXJuIC0xOwogCiAJCS8qIERyb3Agb2xkIHJvdXRlLiAqLwpAQCAtNDMsNyArNDcsNyBAQAogCQkvKiBub24tbG9jYWwgc3JjLCBmaW5kIHZhbGlkIGlpZiB0byBzYXRpc2Z5CiAJCSAqIHJwLWZpbHRlciB3aGVuIGNhbGxpbmcgaXBfcm91dGVfaW5wdXQuICovCiAJCWZsLm5sX3UuaXA0X3UuZGFkZHIgPSBpcGgtPnNhZGRyOwotCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmaW5pdF9uZXQsICZydCwgJmZsKSAhPSAwKQorCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZydCwgJmZsKSAhPSAwKQogCQkJcmV0dXJuIC0xOwogCiAJCW9kc3QgPSBza2ItPmRzdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggOTBlYjdjYi4uMzgxNmUxZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTUsMTAgKzUsMTUgQEAKIG1lbnUgIklQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbiIKIAlkZXBlbmRzIG9uIElORVQgJiYgTkVURklMVEVSCiAKK2NvbmZpZyBORl9ERUZSQUdfSVBWNAorCXRyaXN0YXRlCisJZGVmYXVsdCBuCisKIGNvbmZpZyBORl9DT05OVFJBQ0tfSVBWNAogCXRyaXN0YXRlICJJUHY0IGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCAocmVxdWlyZWQgZm9yIE5BVCkiCiAJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KKwlzZWxlY3QgTkZfREVGUkFHX0lQVjQKIAktLS1oZWxwLS0tCiAJICBDb25uZWN0aW9uIHRyYWNraW5nIGtlZXBzIGEgcmVjb3JkIG9mIHdoYXQgcGFja2V0cyBoYXZlIHBhc3NlZAogCSAgdGhyb3VnaCB5b3VyIG1hY2hpbmUsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgYXJlIHJlbGF0ZWQKQEAgLTU2LDUzICs2MSwxMSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgSVBfTkZfSVBUQUJMRVMKKwogIyBUaGUgbWF0Y2hlcy4KLWNvbmZpZyBJUF9ORl9NQVRDSF9SRUNFTlQKLQl0cmlzdGF0ZSAnInJlY2VudCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQloZWxwCi0JICBUaGlzIG1hdGNoIGlzIHVzZWQgZm9yIGNyZWF0aW5nIG9uZSBvciBtYW55IGxpc3RzIG9mIHJlY2VudGx5Ci0JICB1c2VkIGFkZHJlc3NlcyBhbmQgdGhlbiBtYXRjaGluZyBhZ2FpbnN0IHRoYXQvdGhvc2UgbGlzdChzKS4KLQotCSAgU2hvcnQgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGJ5IHVzaW5nICdpcHRhYmxlcyAtbSByZWNlbnQgLWgnCi0JICBPZmZpY2lhbCBXZWJzaXRlOiA8aHR0cDovL3Nub3dtYW4ubmV0L3Byb2plY3RzL2lwdF9yZWNlbnQvPgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0VDTgotCXRyaXN0YXRlICciZWNuIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgRUNOJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCBhZ2FpbnN0Ci0JICB0aGUgSVB2NCBhbmQgVENQIGhlYWRlciBFQ04gZmllbGRzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0FICi0JdHJpc3RhdGUgJyJhaCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQloZWxwCi0JICBUaGlzIG1hdGNoIGV4dGVuc2lvbiBhbGxvd3MgeW91IHRvIG1hdGNoIGEgcmFuZ2Ugb2YgU1BJcwotCSAgaW5zaWRlIEFIIGhlYWRlciBvZiBJUFNlYyBwYWNrZXRzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX1RUTAotCXRyaXN0YXRlICcidHRsIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAotCWhlbHAKLQkgIFRoaXMgYWRkcyBDT05GSUdfSVBfTkZfTUFUQ0hfVFRMIG9wdGlvbiwgd2hpY2ggZW5hYmxlZCB0aGUgdXNlcgotCSAgdG8gbWF0Y2ggcGFja2V0cyBieSB0aGVpciBUVEwgdmFsdWUuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVBfTkZfTUFUQ0hfQUREUlRZUEUKIAl0cmlzdGF0ZSAnImFkZHJ0eXBlIiBhZGRyZXNzIHR5cGUgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIG1hdGNoIHdoYXQgcm91dGluZyB0aGlua3Mgb2YgYW4gYWRkcmVzcywKQEAgLTExMSwxMCArNzQsMzYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KIAorY29uZmlnIElQX05GX01BVENIX0FICisJdHJpc3RhdGUgJyJhaCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCWhlbHAKKwkgIFRoaXMgbWF0Y2ggZXh0ZW5zaW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggYSByYW5nZSBvZiBTUElzCisJICBpbnNpZGUgQUggaGVhZGVyIG9mIElQU2VjIHBhY2tldHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSVBfTkZfTUFUQ0hfRUNOCisJdHJpc3RhdGUgJyJlY24iIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYEVDTicgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggYWdhaW5zdAorCSAgdGhlIElQdjQgYW5kIFRDUCBoZWFkZXIgRUNOIGZpZWxkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBJUF9ORl9NQVRDSF9UVEwKKwl0cmlzdGF0ZSAnInR0bCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCWhlbHAKKwkgIFRoaXMgYWRkcyBDT05GSUdfSVBfTkZfTUFUQ0hfVFRMIG9wdGlvbiwgd2hpY2ggZW5hYmxlZCB0aGUgdXNlcgorCSAgdG8gbWF0Y2ggcGFja2V0cyBieSB0aGVpciBUVEwgdmFsdWUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiAjIGBmaWx0ZXInLCBnZW5lcmljIGFuZCBzcGVjaWZpYyB0YXJnZXRzCiBjb25maWcgSVBfTkZfRklMVEVSCiAJdHJpc3RhdGUgIlBhY2tldCBmaWx0ZXJpbmciCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFBhY2tldCBmaWx0ZXJpbmcgZGVmaW5lcyBhIHRhYmxlIGBmaWx0ZXInLCB3aGljaCBoYXMgYSBzZXJpZXMgb2YKQEAgLTEzNiw3ICsxMjUsNiBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX0xPRwogCXRyaXN0YXRlICJMT0cgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTE9HJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzIGluCkBAIC0xNDYsNyArMTM0LDYgQEAKIAogY29uZmlnIElQX05GX1RBUkdFVF9VTE9HCiAJdHJpc3RhdGUgIlVMT0cgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCS0tLWhlbHAtLS0KIApAQCAtMTY3LDcgKzE1NCw3IEBACiAjIE5BVCArIHNwZWNpZmljIHRhcmdldHM6IG5mX2Nvbm50cmFjawogY29uZmlnIE5GX05BVAogCXRyaXN0YXRlICJGdWxsIE5BVCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDS19JUFY0CisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfSVBWNAogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoZSBGdWxsIE5BVCBvcHRpb24gYWxsb3dzIG1hc3F1ZXJhZGluZywgcG9ydCBmb3J3YXJkaW5nIGFuZCBvdGhlcgpAQCAtMTk0LDYgKzE4MSwxNyBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQX05GX1RBUkdFVF9ORVRNQVAKKwl0cmlzdGF0ZSAiTkVUTUFQIHRhcmdldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZfTkFUCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwloZWxwCisJICBORVRNQVAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RhdGljIDE6MSBOQVQgbWFwcGluZyBvZiBuZXR3b3JrCisJICBhZGRyZXNzZXMuIEl0IG1hcHMgdGhlIG5ldHdvcmsgYWRkcmVzcyBwYXJ0LCB3aGlsZSBrZWVwaW5nIHRoZSBob3N0CisJICBhZGRyZXNzIHBhcnQgaW50YWN0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElQX05GX1RBUkdFVF9SRURJUkVDVAogCXRyaXN0YXRlICJSRURJUkVDVCB0YXJnZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5GX05BVApAQCAtMjA2LDE3ICsyMDQsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX1RBUkdFVF9ORVRNQVAKLQl0cmlzdGF0ZSAiTkVUTUFQIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkZfTkFUCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQloZWxwCi0JICBORVRNQVAgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygc3RhdGljIDE6MSBOQVQgbWFwcGluZyBvZiBuZXR3b3JrCi0JICBhZGRyZXNzZXMuIEl0IG1hcHMgdGhlIG5ldHdvcmsgYWRkcmVzcyBwYXJ0LCB3aGlsZSBrZWVwaW5nIHRoZSBob3N0Ci0JICBhZGRyZXNzIHBhcnQgaW50YWN0LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIE5GX05BVF9TTk1QX0JBU0lDCiAJdHJpc3RhdGUgIkJhc2ljIFNOTVAtQUxHIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORl9OQVQKQEAgLTI2Miw0NCArMjQ5LDQzIEBACiAKIGNvbmZpZyBORl9OQVRfRlRQCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfRlRQCiAKIGNvbmZpZyBORl9OQVRfSVJDCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfSVJDCiAKIGNvbmZpZyBORl9OQVRfVEZUUAogCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX1RGVFAKIAogY29uZmlnIE5GX05BVF9BTUFOREEKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAorCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19BTUFOREEKIAogY29uZmlnIE5GX05BVF9QUFRQCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfUFBUUAogCXNlbGVjdCBORl9OQVRfUFJPVE9fR1JFCiAKIGNvbmZpZyBORl9OQVRfSDMyMwogCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0gzMjMKIAogY29uZmlnIE5GX05BVF9TSVAKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAorCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19TSVAKIAogIyBtYW5nbGUgKyBzcGVjaWZpYyB0YXJnZXRzCiBjb25maWcgSVBfTkZfTUFOR0xFCiAJdHJpc3RhdGUgIlBhY2tldCBtYW5nbGluZyIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBtYW5nbGUnIHRhYmxlIHRvIGlwdGFibGVzOiBzZWUgdGhlIG1hbiBwYWdlIGZvcgpAQCAtMzA4LDYgKzI5NCwxOSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQX05GX1RBUkdFVF9DTFVTVEVSSVAKKwl0cmlzdGF0ZSAiQ0xVU1RFUklQIHRhcmdldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX0lQVjQKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSworCWhlbHAKKwkgIFRoZSBDTFVTVEVSSVAgdGFyZ2V0IGFsbG93cyB5b3UgdG8gYnVpbGQgbG9hZC1iYWxhbmNpbmcgY2x1c3RlcnMgb2YKKwkgIG5ldHdvcmsgc2VydmVycyB3aXRob3V0IGhhdmluZyBhIGRlZGljYXRlZCBsb2FkLWJhbGFuY2luZworCSAgcm91dGVyL3NlcnZlci9zd2l0Y2guCisJCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElQX05GX1RBUkdFVF9FQ04KIAl0cmlzdGF0ZSAiRUNOIHRhcmdldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCkBAIC0zMzgsMjMgKzMzNyw5IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX0NMVVNURVJJUAotCXRyaXN0YXRlICJDTFVTVEVSSVAgdGFyZ2V0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUgJiYgRVhQRVJJTUVOVEFMCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfSVBWNAotCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECi0Jc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCi0JaGVscAotCSAgVGhlIENMVVNURVJJUCB0YXJnZXQgYWxsb3dzIHlvdSB0byBidWlsZCBsb2FkLWJhbGFuY2luZyBjbHVzdGVycyBvZgotCSAgbmV0d29yayBzZXJ2ZXJzIHdpdGhvdXQgaGF2aW5nIGEgZGVkaWNhdGVkIGxvYWQtYmFsYW5jaW5nCi0JICByb3V0ZXIvc2VydmVyL3N3aXRjaC4KLQkKLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiAjIHJhdyArIHNwZWNpZmljIHRhcmdldHMKIGNvbmZpZyBJUF9ORl9SQVcKIAl0cmlzdGF0ZSAgJ3JhdyB0YWJsZSBzdXBwb3J0IChyZXF1aXJlZCBmb3IgTk9UUkFDSy9UUkFDRSknCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByYXcnIHRhYmxlIHRvIGlwdGFibGVzLiBUaGlzIHRhYmxlIGlzIHRoZSB2ZXJ5CkBAIC0zNjcsNyArMzUyLDYgQEAKICMgc2VjdXJpdHkgdGFibGUgZm9yIE1BQyBwb2xpY3kKIGNvbmZpZyBJUF9ORl9TRUNVUklUWQogCXRyaXN0YXRlICJTZWN1cml0eSB0YWJsZSIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCiAJZGVwZW5kcyBvbiBTRUNVUklUWQogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscApAQCAtMzc2LDYgKzM2MCw4IEBACiAJIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorZW5kaWYgIyBJUF9ORl9JUFRBQkxFUworCiAjIEFSUCB0YWJsZXMKIGNvbmZpZyBJUF9ORl9BUlBUQUJMRVMKIAl0cmlzdGF0ZSAiQVJQIHRhYmxlcyBzdXBwb3J0IgpAQCAtMzg4LDkgKzM3NCwxMCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgSVBfTkZfQVJQVEFCTEVTCisKIGNvbmZpZyBJUF9ORl9BUlBGSUxURVIKIAl0cmlzdGF0ZSAiQVJQIHBhY2tldCBmaWx0ZXJpbmciCi0JZGVwZW5kcyBvbiBJUF9ORl9BUlBUQUJMRVMKIAloZWxwCiAJICBBUlAgcGFja2V0IGZpbHRlcmluZyBkZWZpbmVzIGEgdGFibGUgYGZpbHRlcicsIHdoaWNoIGhhcyBhIHNlcmllcyBvZgogCSAgcnVsZXMgZm9yIHNpbXBsZSBBUlAgcGFja2V0IGZpbHRlcmluZyBhdCBsb2NhbCBpbnB1dCBhbmQKQEAgLTQwMSwxMCArMzg4LDExIEBACiAKIGNvbmZpZyBJUF9ORl9BUlBfTUFOR0xFCiAJdHJpc3RhdGUgIkFSUCBwYXlsb2FkIG1hbmdsaW5nIgotCWRlcGVuZHMgb24gSVBfTkZfQVJQVEFCTEVTCiAJaGVscAogCSAgQWxsb3dzIGFsdGVyaW5nIHRoZSBBUlAgcGFja2V0IHBheWxvYWQ6IHNvdXJjZSBhbmQgZGVzdGluYXRpb24KIAkgIGhhcmR3YXJlIGFuZCBuZXR3b3JrIGFkZHJlc3Nlcy4KIAorZW5kaWYgIyBJUF9ORl9BUlBUQUJMRVMKKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggM2YzMTI5MWYuLjVmOWI2NTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDkgQEAKIAogb2JqLSQoQ09ORklHX05GX05BVCkgKz0gbmZfbmF0Lm8KIAorIyBkZWZyYWcKK29iai0kKENPTkZJR19ORl9ERUZSQUdfSVBWNCkgKz0gbmZfZGVmcmFnX2lwdjQubworCiAjIE5BVCBoZWxwZXJzIChuZl9jb25udHJhY2spCiBvYmotJChDT05GSUdfTkZfTkFUX0FNQU5EQSkgKz0gbmZfbmF0X2FtYW5kYS5vCiBvYmotJChDT05GSUdfTkZfTkFUX0ZUUCkgKz0gbmZfbmF0X2Z0cC5vCkBAIC00OCw3ICs1MSw2IEBACiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUpICs9IGlwdF9hZGRydHlwZS5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUgpICs9IGlwdF9haC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRUNOKSArPSBpcHRfZWNuLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQpICs9IGlwdF9yZWNlbnQubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RUTCkgKz0gaXB0X3R0bC5vCiAKICMgdGFyZ2V0cwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKaW5kZXggMDNlODNhNi4uOGQ3MGQyOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCkBAIC0yMDAsMTUgKzIwMCwxMiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGFycHRfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitzdGF0aWMgdW5zaWduZWQgaW50CithcnB0X2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQlwcmludGsoImFycF90YWJsZXM6IGVycm9yOiAnJXMnXG4iLCAoY2hhciAqKXRhcmdpbmZvKTsKKwkJcHJpbnRrKCJhcnBfdGFibGVzOiBlcnJvcjogJyVzJ1xuIiwKKwkJICAgICAgIChjb25zdCBjaGFyICopcGFyLT50YXJnaW5mbyk7CiAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KQEAgLTIzMiw2ICsyMjksNyBAQAogCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwogCXZvaWQgKnRhYmxlX2Jhc2U7CiAJY29uc3Qgc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CisJc3RydWN0IHh0X3RhcmdldF9wYXJhbSB0Z3BhcjsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGFycF9oZHJfbGVuKHNrYi0+ZGV2KSkpCiAJCXJldHVybiBORl9EUk9QOwpAQCAtMjQ1LDYgKzI0MywxMSBAQAogCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CiAJYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT51bmRlcmZsb3dbaG9va10pOwogCisJdGdwYXIuaW4gICAgICA9IGluOworCXRncGFyLm91dCAgICAgPSBvdXQ7CisJdGdwYXIuaG9va251bSA9IGhvb2s7CisJdGdwYXIuZmFtaWx5ICA9IE5GUFJPVE9fQVJQOworCiAJYXJwID0gYXJwX2hkcihza2IpOwogCWRvIHsKIAkJaWYgKGFycF9wYWNrZXRfbWF0Y2goYXJwLCBza2ItPmRldiwgaW5kZXYsIG91dGRldiwgJmUtPmFycCkpIHsKQEAgLTI5MCwxMSArMjkzLDEwIEBACiAJCQkJLyogVGFyZ2V0cyB3aGljaCByZWVudGVyIG11c3QgcmV0dXJuCiAJCQkJICogYWJzLiB2ZXJkaWN0cwogCQkJCSAqLworCQkJCXRncGFyLnRhcmdldCAgID0gdC0+dS5rZXJuZWwudGFyZ2V0OworCQkJCXRncGFyLnRhcmdpbmZvID0gdC0+ZGF0YTsKIAkJCQl2ZXJkaWN0ID0gdC0+dS5rZXJuZWwudGFyZ2V0LT50YXJnZXQoc2tiLAotCQkJCQkJCQkgICAgIGluLCBvdXQsCi0JCQkJCQkJCSAgICAgaG9vaywKLQkJCQkJCQkJICAgICB0LT51Lmtlcm5lbC50YXJnZXQsCi0JCQkJCQkJCSAgICAgdC0+ZGF0YSk7CisJCQkJCQkJCSAgICAgJnRncGFyKTsKIAogCQkJCS8qIFRhcmdldCBtaWdodCBoYXZlIGNoYW5nZWQgc3R1ZmYuICovCiAJCQkJYXJwID0gYXJwX2hkcihza2IpOwpAQCAtNDU2LDIzICs0NTgsMjQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdGFyZ2V0KHN0cnVjdCBhcnB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lKQogewotCXN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdDsKLQlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICp0ID0gYXJwdF9nZXRfdGFyZ2V0KGUpOwogCWludCByZXQ7CisJc3RydWN0IHh0X3RnY2hrX3BhcmFtIHBhciA9IHsKKwkJLnRhYmxlICAgICA9IG5hbWUsCisJCS5lbnRyeWluZm8gPSBlLAorCQkudGFyZ2V0ICAgID0gdC0+dS5rZXJuZWwudGFyZ2V0LAorCQkudGFyZ2luZm8gID0gdC0+ZGF0YSwKKwkJLmhvb2tfbWFzayA9IGUtPmNvbWVmcm9tLAorCQkuZmFtaWx5ICAgID0gTkZQUk9UT19BUlAsCisJfTsKIAotCXQgPSBhcnB0X2dldF90YXJnZXQoZSk7Ci0JdGFyZ2V0ID0gdC0+dS5rZXJuZWwudGFyZ2V0OwotCi0JcmV0ID0geHRfY2hlY2tfdGFyZ2V0KHRhcmdldCwgTkZfQVJQLCB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwKLQkJCSAgICAgIG5hbWUsIGUtPmNvbWVmcm9tLCAwLCAwKTsKLQlpZiAoIXJldCAmJiB0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkKLQkgICAgJiYgIXQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeShuYW1lLCBlLCB0YXJnZXQsIHQtPmRhdGEsCi0JCQkJCSAgICAgICBlLT5jb21lZnJvbSkpIHsKKwlyZXQgPSB4dF9jaGVja190YXJnZXQoJnBhciwgdC0+dS50YXJnZXRfc2l6ZSAtIHNpemVvZigqdCksIDAsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkgewogCQlkdXByaW50ZigiYXJwX3RhYmxlczogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKIAkJCSB0LT51Lmtlcm5lbC50YXJnZXQtPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNDg4LDcgKzQ5MSw4IEBACiAJCXJldHVybiByZXQ7CiAKIAl0ID0gYXJwdF9nZXRfdGFyZ2V0KGUpOwotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFyZ2V0KE5GX0FSUCwgdC0+dS51c2VyLm5hbWUsCisJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoTkZQUk9UT19BUlAsCisJCQkJCQkJdC0+dS51c2VyLm5hbWUsCiAJCQkJCQkJdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJhcnB0XyVzIiwgdC0+dS51c2VyLm5hbWUpOwogCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KSB7CkBAIC01NTQsMTUgKzU1OCwxOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjbGVhbnVwX2VudHJ5KHN0cnVjdCBhcnB0X2VudHJ5ICplLCB1bnNpZ25lZCBpbnQgKmkpCiB7CisJc3RydWN0IHh0X3RnZHRvcl9wYXJhbSBwYXI7CiAJc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0ICp0OwogCiAJaWYgKGkgJiYgKCppKS0tID09IDApCiAJCXJldHVybiAxOwogCiAJdCA9IGFycHRfZ2V0X3RhcmdldChlKTsKLQlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KQotCQl0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kodC0+dS5rZXJuZWwudGFyZ2V0LCB0LT5kYXRhKTsKLQltb2R1bGVfcHV0KHQtPnUua2VybmVsLnRhcmdldC0+bWUpOworCXBhci50YXJnZXQgICA9IHQtPnUua2VybmVsLnRhcmdldDsKKwlwYXIudGFyZ2luZm8gPSB0LT5kYXRhOworCXBhci5mYW1pbHkgICA9IE5GUFJPVE9fQVJQOworCWlmIChwYXIudGFyZ2V0LT5kZXN0cm95ICE9IE5VTEwpCisJCXBhci50YXJnZXQtPmRlc3Ryb3koJnBhcik7CisJbW9kdWxlX3B1dChwYXIudGFyZ2V0LT5tZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4OCw3ICs3OTYsNyBAQAogCWludCB2ID0gKihjb21wYXRfaW50X3QgKilzcmM7CiAKIAlpZiAodiA+IDApCi0JCXYgKz0geHRfY29tcGF0X2NhbGNfanVtcChORl9BUlAsIHYpOworCQl2ICs9IHh0X2NvbXBhdF9jYWxjX2p1bXAoTkZQUk9UT19BUlAsIHYpOwogCW1lbWNweShkc3QsICZ2LCBzaXplb2YodikpOwogfQogCkBAIC03OTcsNyArODA1LDcgQEAKIAljb21wYXRfaW50X3QgY3YgPSAqKGludCAqKXNyYzsKIAogCWlmIChjdiA+IDApCi0JCWN2IC09IHh0X2NvbXBhdF9jYWxjX2p1bXAoTkZfQVJQLCBjdik7CisJCWN2IC09IHh0X2NvbXBhdF9jYWxjX2p1bXAoTkZQUk9UT19BUlAsIGN2KTsKIAlyZXR1cm4gY29weV90b191c2VyKGRzdCwgJmN2LCBzaXplb2YoY3YpKSA/IC1FRkFVTFQgOiAwOwogfQogCkBAIC04MTUsNyArODIzLDcgQEAKIAl0ID0gYXJwdF9nZXRfdGFyZ2V0KGUpOwogCW9mZiArPSB4dF9jb21wYXRfdGFyZ2V0X29mZnNldCh0LT51Lmtlcm5lbC50YXJnZXQpOwogCW5ld2luZm8tPnNpemUgLT0gb2ZmOwotCXJldCA9IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KE5GX0FSUCwgZW50cnlfb2Zmc2V0LCBvZmYpOworCXJldCA9IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KE5GUFJPVE9fQVJQLCBlbnRyeV9vZmZzZXQsIG9mZik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODY2LDkgKzg3NCw5IEBACiAJbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU4tMV0gPSAnXDAnOwogI2lmZGVmIENPTkZJR19DT01QQVQKIAlpZiAoY29tcGF0KQotCQl4dF9jb21wYXRfbG9jayhORl9BUlApOworCQl4dF9jb21wYXRfbG9jayhORlBST1RPX0FSUCk7CiAjZW5kaWYKLQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZfQVJQLCBuYW1lKSwKKwl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZQUk9UT19BUlAsIG5hbWUpLAogCQkJCSAgICAiYXJwdGFibGVfJXMiLCBuYW1lKTsKIAlpZiAodCAmJiAhSVNfRVJSKHQpKSB7CiAJCXN0cnVjdCBhcnB0X2dldGluZm8gaW5mbzsKQEAgLTg3OCw3ICs4ODYsNyBAQAogCQlpZiAoY29tcGF0KSB7CiAJCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyB0bXA7CiAJCQlyZXQgPSBjb21wYXRfdGFibGVfaW5mbyhwcml2YXRlLCAmdG1wKTsKLQkJCXh0X2NvbXBhdF9mbHVzaF9vZmZzZXRzKE5GX0FSUCk7CisJCQl4dF9jb21wYXRfZmx1c2hfb2Zmc2V0cyhORlBST1RPX0FSUCk7CiAJCQlwcml2YXRlID0gJnRtcDsKIAkJfQogI2VuZGlmCkBAIC05MDEsNyArOTA5LDcgQEAKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogI2lmZGVmIENPTkZJR19DT01QQVQKIAlpZiAoY29tcGF0KQotCQl4dF9jb21wYXRfdW5sb2NrKE5GX0FSUCk7CisJCXh0X2NvbXBhdF91bmxvY2soTkZQUk9UT19BUlApOwogI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KQEAgLTkyNSw3ICs5MzMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl0ID0geHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZfQVJQLCBnZXQubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhuZXQsIE5GUFJPVE9fQVJQLCBnZXQubmFtZSk7CiAJaWYgKHQgJiYgIUlTX0VSUih0KSkgewogCQljb25zdCBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAKQEAgLTk2Nyw3ICs5NzUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZfQVJQLCBuYW1lKSwKKwl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZQUk9UT19BUlAsIG5hbWUpLAogCQkJCSAgICAiYXJwdGFibGVfJXMiLCBuYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTExMzQsNyArMTE0Miw3IEBACiAJCWdvdG8gZnJlZTsKIAl9CiAKLQl0ID0geHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZfQVJQLCBuYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKG5ldCwgTkZQUk9UT19BUlAsIG5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CkBAIC0xMjE4LDcgKzEyMjYsNyBAQAogCWVudHJ5X29mZnNldCA9ICh2b2lkICopZSAtICh2b2lkICopYmFzZTsKIAogCXQgPSBjb21wYXRfYXJwdF9nZXRfdGFyZ2V0KGUpOwotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFyZ2V0KE5GX0FSUCwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChORlBST1RPX0FSUCwKIAkJCQkJCQl0LT51LnVzZXIubmFtZSwKIAkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImFycHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CkBAIC0xMjMyLDcgKzEyNDAsNyBAQAogCiAJb2ZmICs9IHh0X2NvbXBhdF90YXJnZXRfb2Zmc2V0KHRhcmdldCk7CiAJKnNpemUgKz0gb2ZmOwotCXJldCA9IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KE5GX0FSUCwgZW50cnlfb2Zmc2V0LCBvZmYpOworCXJldCA9IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KE5GUFJPVE9fQVJQLCBlbnRyeV9vZmZzZXQsIG9mZik7CiAJaWYgKHJldCkKIAkJZ290byByZWxlYXNlX3RhcmdldDsKIApAQCAtMTMzMyw3ICsxMzQxLDcgQEAKIAogCWR1cHJpbnRmKCJ0cmFuc2xhdGVfY29tcGF0X3RhYmxlOiBzaXplICV1XG4iLCBpbmZvLT5zaXplKTsKIAlqID0gMDsKLQl4dF9jb21wYXRfbG9jayhORl9BUlApOworCXh0X2NvbXBhdF9sb2NrKE5GUFJPVE9fQVJQKTsKIAkvKiBXYWxrIHRocm91Z2ggZW50cmllcywgY2hlY2tpbmcgb2Zmc2V0cy4gKi8KIAlyZXQgPSBDT01QQVRfQVJQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgdG90YWxfc2l6ZSwKIAkJCQkJY2hlY2tfY29tcGF0X2VudHJ5X3NpemVfYW5kX2hvb2tzLApAQCAtMTM4Myw4ICsxMzkxLDggQEAKIAlyZXQgPSBDT01QQVRfQVJQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgdG90YWxfc2l6ZSwKIAkJCQkJY29tcGF0X2NvcHlfZW50cnlfZnJvbV91c2VyLAogCQkJCQkmcG9zLCAmc2l6ZSwgbmFtZSwgbmV3aW5mbywgZW50cnkxKTsKLQl4dF9jb21wYXRfZmx1c2hfb2Zmc2V0cyhORl9BUlApOwotCXh0X2NvbXBhdF91bmxvY2soTkZfQVJQKTsKKwl4dF9jb21wYXRfZmx1c2hfb2Zmc2V0cyhORlBST1RPX0FSUCk7CisJeHRfY29tcGF0X3VubG9jayhORlBST1RPX0FSUCk7CiAJaWYgKHJldCkKIAkJZ290byBmcmVlX25ld2luZm87CiAKQEAgLTE0MjAsOCArMTQyOCw4IEBACiAJQ09NUEFUX0FSUFRfRU5UUllfSVRFUkFURShlbnRyeTAsIHRvdGFsX3NpemUsIGNvbXBhdF9yZWxlYXNlX2VudHJ5LCAmaik7CiAJcmV0dXJuIHJldDsKIG91dF91bmxvY2s6Ci0JeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoTkZfQVJQKTsKLQl4dF9jb21wYXRfdW5sb2NrKE5GX0FSUCk7CisJeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoTkZQUk9UT19BUlApOworCXh0X2NvbXBhdF91bmxvY2soTkZQUk9UT19BUlApOwogCWdvdG8gb3V0OwogfQogCkBAIC0xNjA3LDggKzE2MTUsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl4dF9jb21wYXRfbG9jayhORl9BUlApOwotCXQgPSB4dF9maW5kX3RhYmxlX2xvY2sobmV0LCBORl9BUlAsIGdldC5uYW1lKTsKKwl4dF9jb21wYXRfbG9jayhORlBST1RPX0FSUCk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhuZXQsIE5GUFJPVE9fQVJQLCBnZXQubmFtZSk7CiAJaWYgKHQgJiYgIUlTX0VSUih0KSkgewogCQljb25zdCBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAJCXN0cnVjdCB4dF90YWJsZV9pbmZvIGluZm87CkBAIC0xNjIzLDEzICsxNjMxLDEzIEBACiAJCQkJIHByaXZhdGUtPnNpemUsIGdldC5zaXplKTsKIAkJCXJldCA9IC1FQUdBSU47CiAJCX0KLQkJeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoTkZfQVJQKTsKKwkJeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoTkZQUk9UT19BUlApOwogCQltb2R1bGVfcHV0KHQtPm1lKTsKIAkJeHRfdGFibGVfdW5sb2NrKHQpOwogCX0gZWxzZQogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CiAKLQl4dF9jb21wYXRfdW5sb2NrKE5GX0FSUCk7CisJeHRfY29tcGF0X3VubG9jayhORlBST1RPX0FSUCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTcwOSw3ICsxNzE3LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF9yZXZpc2lvbihORl9BUlAsIHJldi5uYW1lLAorCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3JldmlzaW9uKE5GUFJPVE9fQVJQLCByZXYubmFtZSwKIAkJCQkJCQkgcmV2LnJldmlzaW9uLCAxLCAmcmV0KSwKIAkJCQkJImFycHRfJXMiLCByZXYubmFtZSk7CiAJCWJyZWFrOwpAQCAtMTc4Nyw3ICsxNzk1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGFycHRfc3RhbmRhcmRfdGFyZ2V0IF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gQVJQVF9TVEFOREFSRF9UQVJHRVQsCiAJLnRhcmdldHNpemUJPSBzaXplb2YoaW50KSwKLQkuZmFtaWx5CQk9IE5GX0FSUCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fQVJQLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0c2l6ZQk9IHNpemVvZihjb21wYXRfaW50X3QpLAogCS5jb21wYXRfZnJvbV91c2VyID0gY29tcGF0X3N0YW5kYXJkX2Zyb21fdXNlciwKQEAgLTE3OTksNyArMTgwNyw3IEBACiAJLm5hbWUJCT0gQVJQVF9FUlJPUl9UQVJHRVQsCiAJLnRhcmdldAkJPSBhcnB0X2Vycm9yLAogCS50YXJnZXRzaXplCT0gQVJQVF9GVU5DVElPTl9NQVhOQU1FTEVOLAotCS5mYW1pbHkJCT0gTkZfQVJQLAorCS5mYW1pbHkJCT0gTkZQUk9UT19BUlAsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mX3NvY2tvcHRfb3BzIGFycHRfc29ja29wdHMgPSB7CkBAIC0xODIxLDEyICsxODI5LDEyIEBACiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBhcnBfdGFibGVzX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlyZXR1cm4geHRfcHJvdG9faW5pdChuZXQsIE5GX0FSUCk7CisJcmV0dXJuIHh0X3Byb3RvX2luaXQobmV0LCBORlBST1RPX0FSUCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgYXJwX3RhYmxlc19uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0JeHRfcHJvdG9fZmluaShuZXQsIE5GX0FSUCk7CisJeHRfcHJvdG9fZmluaShuZXQsIE5GUFJPVE9fQVJQKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBhcnBfdGFibGVzX25ldF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCmluZGV4IGEzODU5NTkuLmIwZDViMWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCkBAIC05LDEyICs5LDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiYXJwdGFibGVzIGFycCBwYXlsb2FkIG1hbmdsZSB0YXJnZXQiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAotdGFyZ2V0KHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBhcnB0X21hbmdsZSAqbWFuZ2xlID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGFycHRfbWFuZ2xlICptYW5nbGUgPSBwYXItPnRhcmdpbmZvOwogCWNvbnN0IHN0cnVjdCBhcnBoZHIgKmFycDsKIAl1bnNpZ25lZCBjaGFyICphcnBwdHI7CiAJaW50IHBsbiwgaGxuOwpAQCAtNTcsMTEgKzU0LDkgQEAKIAlyZXR1cm4gbWFuZ2xlLT50YXJnZXQ7CiB9CiAKLXN0YXRpYyBib29sCi1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCSAgIHZvaWQgKnRhcmdpbmZvLCB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgYXJwdF9tYW5nbGUgKm1hbmdsZSA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBhcnB0X21hbmdsZSAqbWFuZ2xlID0gcGFyLT50YXJnaW5mbzsKIAogCWlmIChtYW5nbGUtPmZsYWdzICYgfkFSUFRfTUFOR0xFX01BU0sgfHwKIAkgICAgIShtYW5nbGUtPmZsYWdzICYgQVJQVF9NQU5HTEVfTUFTSykpCkBAIC03NSw3ICs3MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGFycHRfbWFuZ2xlX3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJtYW5nbGUiLAotCS5mYW1pbHkJCT0gTkZfQVJQLAorCS5mYW1pbHkJCT0gTkZQUk9UT19BUlAsCiAJLnRhcmdldAkJPSB0YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGFycHRfbWFuZ2xlKSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKaW5kZXggMDgyZjVkZC4uYmVlM2QxMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYwpAQCAtNTEsNyArNTEsNyBAQAogCS5sb2NrCQk9IF9fUldfTE9DS19VTkxPQ0tFRChwYWNrZXRfZmlsdGVyLmxvY2spLAogCS5wcml2YXRlCT0gTlVMTCwKIAkubWUJCT0gVEhJU19NT0RVTEUsCi0JLmFmCQk9IE5GX0FSUCwKKwkuYWYJCT0gTkZQUk9UT19BUlAsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMgKi8KQEAgLTg5LDIxICs4OSwyMSBAQAogCXsKIAkJLmhvb2sJCT0gYXJwdF9pbl9ob29rLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBORl9BUlAsCisJCS5wZgkJPSBORlBST1RPX0FSUCwKIAkJLmhvb2tudW0JPSBORl9BUlBfSU4sCiAJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9GSUxURVIsCiAJfSwKIAl7CiAJCS5ob29rCQk9IGFycHRfb3V0X2hvb2ssCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IE5GX0FSUCwKKwkJLnBmCQk9IE5GUFJPVE9fQVJQLAogCQkuaG9va251bQk9IE5GX0FSUF9PVVQsCiAJCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9GSUxURVIsCiAJfSwKIAl7CiAJCS5ob29rCQk9IGFycHRfZm9yd2FyZF9ob29rLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBORl9BUlAsCisJCS5wZgkJPSBORlBST1RPX0FSUCwKIAkJLmhvb2tudW0JPSBORl9BUlBfRk9SV0FSRCwKIAkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0ZJTFRFUiwKIAl9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IDRlN2M3MTkuLjIxM2ZiMjcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTE3MSwzMSArMTcxLDI1IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwdF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitpcHRfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCXByaW50aygiaXBfdGFibGVzOiBlcnJvcjogYCVzJ1xuIiwgKGNoYXIgKil0YXJnaW5mbyk7CisJCXByaW50aygiaXBfdGFibGVzOiBlcnJvcjogYCVzJ1xuIiwKKwkJICAgICAgIChjb25zdCBjaGFyICopcGFyLT50YXJnaW5mbyk7CiAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KIAogLyogUGVyZm9ybWFuY2UgY3JpdGljYWwgLSBjYWxsZWQgZm9yIGV2ZXJ5IHBhY2tldCAqLwogc3RhdGljIGlubGluZSBib29sCi1kb19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAotCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICAgaW50IG9mZnNldCwKLQkgICAgICBib29sICpob3Rkcm9wKQorZG9fbWF0Y2goc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CisJcGFyLT5tYXRjaCAgICAgPSBtLT51Lmtlcm5lbC5tYXRjaDsKKwlwYXItPm1hdGNoaW5mbyA9IG0tPmRhdGE7CisKIAkvKiBTdG9wIGl0ZXJhdGlvbiBpZiBpdCBkb2Vzbid0IG1hdGNoICovCi0JaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT51Lmtlcm5lbC5tYXRjaCwgbS0+ZGF0YSwKLQkJCQkgICAgICBvZmZzZXQsIGlwX2hkcmxlbihza2IpLCBob3Rkcm9wKSkKKwlpZiAoIW0tPnUua2VybmVsLm1hdGNoLT5tYXRjaChza2IsIHBhcikpCiAJCXJldHVybiB0cnVlOwogCWVsc2UKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMzI2LDcgKzMyMCw2IEBACiAJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKLQl1X2ludDE2X3Qgb2Zmc2V0OwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXA7CiAJdV9pbnQxNl90IGRhdGFsZW47CiAJYm9vbCBob3Rkcm9wID0gZmFsc2U7CkBAIC0zMzYsNiArMzI5LDggQEAKIAl2b2lkICp0YWJsZV9iYXNlOwogCXN0cnVjdCBpcHRfZW50cnkgKmUsICpiYWNrOwogCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOworCXN0cnVjdCB4dF9tYXRjaF9wYXJhbSBtdHBhcjsKKwlzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtIHRncGFyOwogCiAJLyogSW5pdGlhbGl6YXRpb24gKi8KIAlpcCA9IGlwX2hkcihza2IpOwpAQCAtMzQ4LDcgKzM0MywxMyBAQAogCSAqIHRoaW5ncyB3ZSBkb24ndCBrbm93LCBpZS4gdGNwIHN5biBmbGFnIG9yIHBvcnRzKS4gIElmIHRoZQogCSAqIHJ1bGUgaXMgYWxzbyBhIGZyYWdtZW50LXNwZWNpZmljIHJ1bGUsIG5vbi1mcmFnbWVudHMgd29uJ3QKIAkgKiBtYXRjaCBpdC4gKi8KLQlvZmZzZXQgPSBudG9ocyhpcC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUOworCW10cGFyLmZyYWdvZmYgPSBudG9ocyhpcC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUOworCW10cGFyLnRob2ZmICAgPSBpcF9oZHJsZW4oc2tiKTsKKwltdHBhci5ob3Rkcm9wID0gJmhvdGRyb3A7CisJbXRwYXIuaW4gICAgICA9IHRncGFyLmluICA9IGluOworCW10cGFyLm91dCAgICAgPSB0Z3Bhci5vdXQgPSBvdXQ7CisJbXRwYXIuZmFtaWx5ICA9IHRncGFyLmZhbWlseSA9IE5GUFJPVE9fSVBWNDsKKwl0Z3Bhci5ob29rbnVtID0gaG9vazsKIAogCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOwogCUlQX05GX0FTU0VSVCh0YWJsZS0+dmFsaWRfaG9va3MgJiAoMSA8PCBob29rKSk7CkBAIC0zNjIsMTIgKzM2MywxMSBAQAogCWRvIHsKIAkJSVBfTkZfQVNTRVJUKGUpOwogCQlJUF9ORl9BU1NFUlQoYmFjayk7Ci0JCWlmIChpcF9wYWNrZXRfbWF0Y2goaXAsIGluZGV2LCBvdXRkZXYsICZlLT5pcCwgb2Zmc2V0KSkgeworCQlpZiAoaXBfcGFja2V0X21hdGNoKGlwLCBpbmRldiwgb3V0ZGV2LAorCQkgICAgJmUtPmlwLCBtdHBhci5mcmFnb2ZmKSkgewogCQkJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7CiAKLQkJCWlmIChJUFRfTUFUQ0hfSVRFUkFURShlLCBkb19tYXRjaCwKLQkJCQkJICAgICAgc2tiLCBpbiwgb3V0LAotCQkJCQkgICAgICBvZmZzZXQsICZob3Rkcm9wKSAhPSAwKQorCQkJaWYgKElQVF9NQVRDSF9JVEVSQVRFKGUsIGRvX21hdGNoLCBza2IsICZtdHBhcikgIT0gMCkKIAkJCQlnb3RvIG5vX21hdGNoOwogCiAJCQlBRERfQ09VTlRFUihlLT5jb3VudGVycywgbnRvaHMoaXAtPnRvdF9sZW4pLCAxKTsKQEAgLTQxMywxNiArNDEzLDE0IEBACiAJCQl9IGVsc2UgewogCQkJCS8qIFRhcmdldHMgd2hpY2ggcmVlbnRlciBtdXN0IHJldHVybgogCQkJCSAgIGFicy4gdmVyZGljdHMgKi8KKwkJCQl0Z3Bhci50YXJnZXQgICA9IHQtPnUua2VybmVsLnRhcmdldDsKKwkJCQl0Z3Bhci50YXJnaW5mbyA9IHQtPmRhdGE7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogCQkJCSgoc3RydWN0IGlwdF9lbnRyeSAqKXRhYmxlX2Jhc2UpLT5jb21lZnJvbQogCQkJCQk9IDB4ZWVlZWVlZWM7CiAjZW5kaWYKIAkJCQl2ZXJkaWN0ID0gdC0+dS5rZXJuZWwudGFyZ2V0LT50YXJnZXQoc2tiLAotCQkJCQkJCQkgICAgIGluLCBvdXQsCi0JCQkJCQkJCSAgICAgaG9vaywKLQkJCQkJCQkJICAgICB0LT51Lmtlcm5lbC50YXJnZXQsCi0JCQkJCQkJCSAgICAgdC0+ZGF0YSk7Ci0KKwkJCQkJCQkJICAgICAmdGdwYXIpOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkJCQlpZiAoKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tCiAJCQkJICAgICE9IDB4ZWVlZWVlZWMKQEAgLTU3NSwxMiArNTczLDE3IEBACiBzdGF0aWMgaW50CiBjbGVhbnVwX21hdGNoKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqaSkKIHsKKwlzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtIHBhcjsKKwogCWlmIChpICYmICgqaSktLSA9PSAwKQogCQlyZXR1cm4gMTsKIAotCWlmIChtLT51Lmtlcm5lbC5tYXRjaC0+ZGVzdHJveSkKLQkJbS0+dS5rZXJuZWwubWF0Y2gtPmRlc3Ryb3kobS0+dS5rZXJuZWwubWF0Y2gsIG0tPmRhdGEpOwotCW1vZHVsZV9wdXQobS0+dS5rZXJuZWwubWF0Y2gtPm1lKTsKKwlwYXIubWF0Y2ggICAgID0gbS0+dS5rZXJuZWwubWF0Y2g7CisJcGFyLm1hdGNoaW5mbyA9IG0tPmRhdGE7CisJcGFyLmZhbWlseSAgICA9IE5GUFJPVE9fSVBWNDsKKwlpZiAocGFyLm1hdGNoLT5kZXN0cm95ICE9IE5VTEwpCisJCXBhci5tYXRjaC0+ZGVzdHJveSgmcGFyKTsKKwltb2R1bGVfcHV0KHBhci5tYXRjaC0+bWUpOwogCXJldHVybiAwOwogfQogCkBAIC02MDYsMzQgKzYwOSwyOCBAQAogfQogCiBzdGF0aWMgaW50Ci1jaGVja19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCAqaSkKK2NoZWNrX21hdGNoKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyLAorCSAgICB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IHBhci0+ZW50cnlpbmZvOwogCWludCByZXQ7CiAKLQltYXRjaCA9IG0tPnUua2VybmVsLm1hdGNoOwotCXJldCA9IHh0X2NoZWNrX21hdGNoKG1hdGNoLCBBRl9JTkVULCBtLT51Lm1hdGNoX3NpemUgLSBzaXplb2YoKm0pLAotCQkJICAgICBuYW1lLCBob29rbWFzaywgaXAtPnByb3RvLAotCQkJICAgICBpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKTsKLQlpZiAoIXJldCAmJiBtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeQotCSAgICAmJiAhbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkobmFtZSwgaXAsIG1hdGNoLCBtLT5kYXRhLAotCQkJCQkgICAgICBob29rbWFzaykpIHsKKwlwYXItPm1hdGNoICAgICA9IG0tPnUua2VybmVsLm1hdGNoOworCXBhci0+bWF0Y2hpbmZvID0gbS0+ZGF0YTsKKworCXJldCA9IHh0X2NoZWNrX21hdGNoKHBhciwgbS0+dS5tYXRjaF9zaXplIC0gc2l6ZW9mKCptKSwKKwkgICAgICBpcC0+cHJvdG8sIGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pOworCWlmIChyZXQgPCAwKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCi0JCQkgbS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOworCQkJIHBhci5tYXRjaC0+bmFtZSk7CisJCXJldHVybiByZXQ7CiAJfQotCWlmICghcmV0KQotCQkoKmkpKys7Ci0JcmV0dXJuIHJldDsKKwkrKyppOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1maW5kX2NoZWNrX21hdGNoKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sCi0JCSBjb25zdCBjaGFyICpuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSB1bnNpZ25lZCBpbnQgaG9va21hc2ssCitmaW5kX2NoZWNrX21hdGNoKHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0sIHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyLAogCQkgdW5zaWduZWQgaW50ICppKQogewogCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CkBAIC02NDgsNyArNjQ1LDcgQEAKIAl9CiAJbS0+dS5rZXJuZWwubWF0Y2ggPSBtYXRjaDsKIAotCXJldCA9IGNoZWNrX21hdGNoKG0sIG5hbWUsIGlwLCBob29rbWFzaywgaSk7CisJcmV0ID0gY2hlY2tfbWF0Y2gobSwgcGFyLCBpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIApAQCAtNjYwLDIzICs2NTcsMjUgQEAKIAogc3RhdGljIGludCBjaGVja190YXJnZXQoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKLQlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQgPSBpcHRfZ2V0X3RhcmdldChlKTsKKwlzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gcGFyID0geworCQkudGFibGUgICAgID0gbmFtZSwKKwkJLmVudHJ5aW5mbyA9IGUsCisJCS50YXJnZXQgICAgPSB0LT51Lmtlcm5lbC50YXJnZXQsCisJCS50YXJnaW5mbyAgPSB0LT5kYXRhLAorCQkuaG9va19tYXNrID0gZS0+Y29tZWZyb20sCisJCS5mYW1pbHkgICAgPSBORlBST1RPX0lQVjQsCisJfTsKIAlpbnQgcmV0OwogCi0JdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOwotCXRhcmdldCA9IHQtPnUua2VybmVsLnRhcmdldDsKLQlyZXQgPSB4dF9jaGVja190YXJnZXQodGFyZ2V0LCBBRl9JTkVULCB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwKLQkJCSAgICAgIG5hbWUsIGUtPmNvbWVmcm9tLCBlLT5pcC5wcm90bywKLQkJCSAgICAgIGUtPmlwLmludmZsYWdzICYgSVBUX0lOVl9QUk9UTyk7Ci0JaWYgKCFyZXQgJiYgdC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5Ci0JICAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkobmFtZSwgZSwgdGFyZ2V0LCB0LT5kYXRhLAotCQkJCQkgICAgICAgZS0+Y29tZWZyb20pKSB7CisJcmV0ID0geHRfY2hlY2tfdGFyZ2V0KCZwYXIsIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpLAorCSAgICAgIGUtPmlwLnByb3RvLCBlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pOworCWlmIChyZXQgPCAwKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCiAJCQkgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtNjg3LDE0ICs2ODYsMTggQEAKIAlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgajsKKwlzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gbXRwYXI7CiAKIAlyZXQgPSBjaGVja19lbnRyeShlLCBuYW1lKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJaiA9IDA7Ci0JcmV0ID0gSVBUX01BVENIX0lURVJBVEUoZSwgZmluZF9jaGVja19tYXRjaCwgbmFtZSwgJmUtPmlwLAotCQkJCWUtPmNvbWVmcm9tLCAmaik7CisJbXRwYXIudGFibGUgICAgID0gbmFtZTsKKwltdHBhci5lbnRyeWluZm8gPSAmZS0+aXA7CisJbXRwYXIuaG9va19tYXNrID0gZS0+Y29tZWZyb207CisJbXRwYXIuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY0OworCXJldCA9IElQVF9NQVRDSF9JVEVSQVRFKGUsIGZpbmRfY2hlY2tfbWF0Y2gsICZtdHBhciwgJmopOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAKQEAgLTc2OSw2ICs3NzIsNyBAQAogc3RhdGljIGludAogY2xlYW51cF9lbnRyeShzdHJ1Y3QgaXB0X2VudHJ5ICplLCB1bnNpZ25lZCBpbnQgKmkpCiB7CisJc3RydWN0IHh0X3RnZHRvcl9wYXJhbSBwYXI7CiAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7CiAKIAlpZiAoaSAmJiAoKmkpLS0gPT0gMCkKQEAgLTc3Nyw5ICs3ODEsMTMgQEAKIAkvKiBDbGVhbnVwIGFsbCBtYXRjaGVzICovCiAJSVBUX01BVENIX0lURVJBVEUoZSwgY2xlYW51cF9tYXRjaCwgTlVMTCk7CiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOwotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kpCi0JCXQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSh0LT51Lmtlcm5lbC50YXJnZXQsIHQtPmRhdGEpOwotCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CisKKwlwYXIudGFyZ2V0ICAgPSB0LT51Lmtlcm5lbC50YXJnZXQ7CisJcGFyLnRhcmdpbmZvID0gdC0+ZGF0YTsKKwlwYXIuZmFtaWx5ICAgPSBORlBST1RPX0lQVjQ7CisJaWYgKHBhci50YXJnZXQtPmRlc3Ryb3kgIT0gTlVMTCkKKwkJcGFyLnRhcmdldC0+ZGVzdHJveSgmcGFyKTsKKwltb2R1bGVfcHV0KHBhci50YXJnZXQtPm1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY0OCwxMiArMTY1NiwxNiBAQAogY29tcGF0X2NoZWNrX2VudHJ5KHN0cnVjdCBpcHRfZW50cnkgKmUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CisJc3RydWN0IHh0X210Y2hrX3BhcmFtIG10cGFyOwogCXVuc2lnbmVkIGludCBqOwogCWludCByZXQ7CiAKIAlqID0gMDsKLQlyZXQgPSBJUFRfTUFUQ0hfSVRFUkFURShlLCBjaGVja19tYXRjaCwgbmFtZSwgJmUtPmlwLAotCQkJCWUtPmNvbWVmcm9tLCAmaik7CisJbXRwYXIudGFibGUgICAgID0gbmFtZTsKKwltdHBhci5lbnRyeWluZm8gPSAmZS0+aXA7CisJbXRwYXIuaG9va19tYXNrID0gZS0+Y29tZWZyb207CisJbXRwYXIuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY0OworCXJldCA9IElQVF9NQVRDSF9JVEVSQVRFKGUsIGNoZWNrX21hdGNoLCAmbXRwYXIsICZqKTsKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIApAQCAtMjEyMSwzMCArMjEzMywyMyBAQAogfQogCiBzdGF0aWMgYm9vbAotaWNtcF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgIGludCBvZmZzZXQsCi0JICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICAgYm9vbCAqaG90ZHJvcCkKK2ljbXBfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJY29uc3Qgc3RydWN0IGljbXBoZHIgKmljOwogCXN0cnVjdCBpY21waGRyIF9pY21waDsKLQljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaWNtcCAqaWNtcGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCi0JaWYgKG9mZnNldCkKKwlpZiAocGFyLT5mcmFnb2ZmICE9IDApCiAJCXJldHVybiBmYWxzZTsKIAotCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcGFyLT50aG9mZiwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOwogCWlmIChpYyA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KIAkJICovCiAJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIElDTVAgdGlueWdyYW0uXG4iKTsKLQkJKmhvdGRyb3AgPSB0cnVlOworCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMjE1NSwxNSArMjE2MCw5IEBACiAJCQkJICAgICEhKGljbXBpbmZvLT5pbnZmbGFncyZJUFRfSUNNUF9JTlYpKTsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGJvb2wKLWljbXBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgdm9pZCAqZW50cnksCi0JICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkgICB2b2lkICptYXRjaGluZm8sCi0JICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGljbXBfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaWNtcCAqaWNtcGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgc3BlY2lmeSBubyB1bmtub3duIGludmZsYWdzICovCiAJcmV0dXJuICEoaWNtcGluZm8tPmludmZsYWdzICYgfklQVF9JQ01QX0lOVik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwppbmRleCBmYWZlOGViLi43YWMxNjc3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTI4MSwxMSArMjgxLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHVuc2lnbmVkIGludAotY2x1c3RlcmlwX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQorY2x1c3RlcmlwX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqY2lwaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvICpjaXBpbmZvID0gcGFyLT50YXJnaW5mbzsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJdV9pbnQzMl90IGhhc2g7CkBAIC0zNDksMTMgKzM0NywxMCBAQAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAotc3RhdGljIGJvb2wKLWNsdXN0ZXJpcF90Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBjbHVzdGVyaXBfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8gKmNpcGluZm8gPSB0YXJnaW5mbzsKLQljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOworCXN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvICpjaXBpbmZvID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gcGFyLT5lbnRyeWluZm87CiAKIAlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqY29uZmlnOwogCkBAIC00MDYsOSArNDAxLDkgQEAKIAl9CiAJY2lwaW5mby0+Y29uZmlnID0gY29uZmlnOwogCi0JaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodGFyZ2V0LT5mYW1pbHkpIDwgMCkgeworCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHBhci0+dGFyZ2V0LT5mYW1pbHkpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCi0JCQkJICAgICJwcm90bz0ldVxuIiwgdGFyZ2V0LT5mYW1pbHkpOworCQkJCSAgICAicHJvdG89JXVcbiIsIHBhci0+dGFyZ2V0LT5mYW1pbHkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC00MTYsOSArNDExLDkgQEAKIH0KIAogLyogZHJvcCByZWZlcmVuY2UgY291bnQgb2YgY2x1c3RlciBjb25maWcgd2hlbiBydWxlIGlzIGRlbGV0ZWQgKi8KLXN0YXRpYyB2b2lkIGNsdXN0ZXJpcF90Z19kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8pCitzdGF0aWMgdm9pZCBjbHVzdGVyaXBfdGdfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8gKmNpcGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2NsdXN0ZXJpcF90Z3RfaW5mbyAqY2lwaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAkvKiBpZiBubyBtb3JlIGVudHJpZXMgYXJlIHJlZmVyZW5jaW5nIHRoZSBjb25maWcsIHJlbW92ZSBpdAogCSAqIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgdGhlIHByb2MgZW50cnkgKi8KQEAgLTQyNiw3ICs0MjEsNyBAQAogCiAJY2x1c3RlcmlwX2NvbmZpZ19wdXQoY2lwaW5mby0+Y29uZmlnKTsKIAotCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh0YXJnZXQtPmZhbWlseSk7CisJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHBhci0+dGFyZ2V0LT5mYW1pbHkpOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtNDQ1LDcgKzQ0MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsdXN0ZXJpcF90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiQ0xVU1RFUklQIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldAkJPSBjbHVzdGVyaXBfdGcsCiAJLmNoZWNrZW50cnkJPSBjbHVzdGVyaXBfdGdfY2hlY2ssCiAJLmRlc3Ryb3kJPSBjbHVzdGVyaXBfdGdfZGVzdHJveSwKQEAgLTU0Niw3ICs1NDEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGNpcF9hcnBfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmhvb2sgPSBhcnBfbWFuZ2xlLAotCS5wZiA9IE5GX0FSUCwKKwkucGYgPSBORlBST1RPX0FSUCwKIAkuaG9va251bSA9IE5GX0FSUF9PVVQsCiAJLnByaW9yaXR5ID0gLTEKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCBkNjAxMzljLi5mN2UyZmEwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTc3LDExICs3Nyw5IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWVjbl90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK2Vjbl90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9FQ05faW5mbyAqZWluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0lQKQogCQlpZiAoIXNldF9lY3RfaXAoc2tiLCBlaW5mbykpCkBAIC05NSwxMyArOTMsMTAgQEAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi1lY25fdGdfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplX3ZvaWQsCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgZWNuX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcHRfRUNOX2luZm8gKmVpbmZvID0gdGFyZ2luZm87Ci0JY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVfdm9pZDsKKwljb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX01BU0spIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUNOOiB1bnN1cHBvcnRlZCBFQ04gb3BlcmF0aW9uICV4XG4iLApAQCAtMTI0LDcgKzExOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGVjbl90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiRUNOIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldAkJPSBlY25fdGcsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9FQ05faW5mbyksCiAJLnRhYmxlCQk9ICJtYW5nbGUiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggMGFmMTQxMy4uZmM2Y2UwNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIH07CiAKIHN0YXRpYyB2b2lkCi1pcHRfbG9nX3BhY2tldCh1bnNpZ25lZCBpbnQgcGYsCitpcHRfbG9nX3BhY2tldCh1X2ludDhfdCBwZiwKIAkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTQyNiwyOCArNDI2LDIzIEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWxvZ190ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK2xvZ190ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9sb2dfaW5mbyAqbG9naW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfbG9nX2luZm8gKmxvZ2luZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBuZl9sb2dpbmZvIGxpOwogCiAJbGkudHlwZSA9IE5GX0xPR19UWVBFX0xPRzsKIAlsaS51LmxvZy5sZXZlbCA9IGxvZ2luZm8tPmxldmVsOwogCWxpLnUubG9nLmxvZ2ZsYWdzID0gbG9naW5mby0+bG9nZmxhZ3M7CiAKLQlpcHRfbG9nX3BhY2tldChQRl9JTkVULCBob29rbnVtLCBza2IsIGluLCBvdXQsICZsaSwKKwlpcHRfbG9nX3BhY2tldChORlBST1RPX0lQVjQsIHBhci0+aG9va251bSwgc2tiLCBwYXItPmluLCBwYXItPm91dCwgJmxpLAogCQkgICAgICAgbG9naW5mby0+cHJlZml4KTsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi1sb2dfdGdfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplLAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGxvZ190Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2xvZ19pbmZvICpsb2dpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9sb2dfaW5mbyAqbG9naW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobG9naW5mby0+bGV2ZWwgPj0gOCkgewogCQlwcl9kZWJ1ZygiTE9HOiBsZXZlbCAldSA+PSA4XG4iLCBsb2dpbmZvLT5sZXZlbCk7CkBAIC00NjMsNyArNDU4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbG9nX3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJMT0ciLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkudGFyZ2V0CQk9IGxvZ190ZywKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2xvZ19pbmZvKSwKIAkuY2hlY2tlbnRyeQk9IGxvZ190Z19jaGVjaywKQEAgLTQ4Myw3ICs0NzgsNyBAQAogCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmbG9nX3RnX3JlZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQsICZpcHRfbG9nX2xvZ2dlcik7CisJbmZfbG9nX3JlZ2lzdGVyKE5GUFJPVE9fSVBWNCwgJmlwdF9sb2dfbG9nZ2VyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwppbmRleCAwODQxYWVmLi5mMzg5ZjYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwpAQCAtMzEsMTIgKzMxLDkgQEAKIHN0YXRpYyBERUZJTkVfUldMT0NLKG1hc3FfbG9jayk7CiAKIC8qIEZJWE1FOiBNdWx0aXBsZSB0YXJnZXRzLiAtLVJSICovCi1zdGF0aWMgYm9vbAotbWFzcXVlcmFkZV90Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBtYXNxdWVyYWRlX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpIHsKIAkJcHJfZGVidWcoIm1hc3F1ZXJhZGVfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CkBAIC01MCw5ICs0Nyw3IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLW1hc3F1ZXJhZGVfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK21hc3F1ZXJhZGVfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdDsKQEAgLTYyLDcgKzU3LDcgQEAKIAljb25zdCBzdHJ1Y3QgcnRhYmxlICpydDsKIAlfX2JlMzIgbmV3c3JjOwogCi0JTkZfQ1RfQVNTRVJUKGhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcpOworCU5GX0NUX0FTU0VSVChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcpOwogCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAluYXQgPSBuZmN0X25hdChjdCk7CkBAIC03NiwxNiArNzEsMTYgQEAKIAlpZiAoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCA9PSAwKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JbXIgPSB0YXJnaW5mbzsKKwltciA9IHBhci0+dGFyZ2luZm87CiAJcnQgPSBza2ItPnJ0YWJsZTsKLQluZXdzcmMgPSBpbmV0X3NlbGVjdF9hZGRyKG91dCwgcnQtPnJ0X2dhdGV3YXksIFJUX1NDT1BFX1VOSVZFUlNFKTsKKwluZXdzcmMgPSBpbmV0X3NlbGVjdF9hZGRyKHBhci0+b3V0LCBydC0+cnRfZ2F0ZXdheSwgUlRfU0NPUEVfVU5JVkVSU0UpOwogCWlmICghbmV3c3JjKSB7Ci0JCXByaW50aygiTUFTUVVFUkFERTogJXMgYXRlIG15IElQIGFkZHJlc3NcbiIsIG91dC0+bmFtZSk7CisJCXByaW50aygiTUFTUVVFUkFERTogJXMgYXRlIG15IElQIGFkZHJlc3NcbiIsIHBhci0+b3V0LT5uYW1lKTsKIAkJcmV0dXJuIE5GX0RST1A7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmbWFzcV9sb2NrKTsKLQluYXQtPm1hc3FfaW5kZXggPSBvdXQtPmlmaW5kZXg7CisJbmF0LT5tYXNxX2luZGV4ID0gcGFyLT5vdXQtPmlmaW5kZXg7CiAJd3JpdGVfdW5sb2NrX2JoKCZtYXNxX2xvY2spOwogCiAJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KQEAgLTExOSw5ICsxMTQsNyBAQAogCQkJICAgICB2b2lkICpwdHIpCiB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKLQotCWlmICghbmV0X2VxKGRldl9uZXQoZGV2KSwgJmluaXRfbmV0KSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAogCWlmIChldmVudCA9PSBORVRERVZfRE9XTikgewogCQkvKiBEZXZpY2Ugd2FzIGRvd25lZC4gIFNlYXJjaCBlbnRpcmUgdGFibGUgZm9yCkBAIC0xMjksNyArMTIyLDggQEAKIAkJICAgYW5kIGZvcmdldCB0aGVtLiAqLwogCQlORl9DVF9BU1NFUlQoZGV2LT5pZmluZGV4ICE9IDApOwogCi0JCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChkZXZpY2VfY21wLCAodm9pZCAqKShsb25nKWRldi0+aWZpbmRleCk7CisJCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChuZXQsIGRldmljZV9jbXAsCisJCQkJICAgICAgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOwogCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTE1Myw3ICsxNDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBtYXNxdWVyYWRlX3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJNQVNRVUVSQURFIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldAkJPSBtYXNxdWVyYWRlX3RnLAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCA2NzM5YWJmLi43YzI5NTgyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTIyLDEyICsyMiw5IEBACiBNT0RVTEVfQVVUSE9SKCJTdmVubmluZyBTb2VyZW5zZW4gPHN2ZW5uaW5nQHBvc3Q1LnRlbGUuZGs+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IDE6MSBOQVQgbWFwcGluZyBvZiBJUHY0IHN1Ym5ldHMiKTsKIAotc3RhdGljIGJvb2wKLW5ldG1hcF90Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgbmV0bWFwX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAoIShtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykpIHsKIAkJcHJfZGVidWcoIk5FVE1BUDpjaGVjazogYmFkIE1BUF9JUFMuXG4iKTsKQEAgLTQxLDI0ICszOCwyMyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1uZXRtYXBfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCituZXRtYXBfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlfX2JlMzIgbmV3X2lwLCBuZXRtYXNrOwotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAJc3RydWN0IG5mX25hdF9yYW5nZSBuZXdyYW5nZTsKIAotCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcKLQkJICAgICB8fCBob29rbnVtID09IE5GX0lORVRfUE9TVF9ST1VUSU5HCi0JCSAgICAgfHwgaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCk7CisJTkZfQ1RfQVNTRVJUKHBhci0+aG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HIHx8CisJCSAgICAgcGFyLT5ob29rbnVtID09IE5GX0lORVRfUE9TVF9ST1VUSU5HIHx8CisJCSAgICAgcGFyLT5ob29rbnVtID09IE5GX0lORVRfTE9DQUxfT1VUKTsKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCiAJbmV0bWFzayA9IH4obXItPnJhbmdlWzBdLm1pbl9pcCBeIG1yLT5yYW5nZVswXS5tYXhfaXApOwogCi0JaWYgKGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyB8fCBob29rbnVtID09IE5GX0lORVRfTE9DQUxfT1VUKQorCWlmIChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyB8fAorCSAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpCiAJCW5ld19pcCA9IGlwX2hkcihza2IpLT5kYWRkciAmIH5uZXRtYXNrOwogCWVsc2UKIAkJbmV3X2lwID0gaXBfaGRyKHNrYiktPnNhZGRyICYgfm5ldG1hc2s7CkBAIC03MCwxMiArNjYsMTIgQEAKIAkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBIT09LMk1BTklQKGhvb2tudW0pKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgSE9PSzJNQU5JUChwYXItPmhvb2tudW0pKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbmV0bWFwX3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lIAkJPSAiTkVUTUFQIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldCAJPSBuZXRtYXBfdGcsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCA1YzYyOTI0Li42OThlNWU3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCkBAIC0yNiwxMiArMjYsOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBDb25uZWN0aW9uIHJlZGlyZWN0aW9uIHRvIGxvY2FsaG9zdCIpOwogCiAvKiBGSVhNRTogVGFrZSBtdWx0aXBsZSByYW5nZXMgLS1SUiAqLwotc3RhdGljIGJvb2wKLXJlZGlyZWN0X3RnX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgcmVkaXJlY3RfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKIAogCWlmIChtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykgewogCQlwcl9kZWJ1ZygicmVkaXJlY3RfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CkBAIC00NSwyNCArNDIsMjIgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotcmVkaXJlY3RfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQorcmVkaXJlY3RfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlfX2JlMzIgbmV3ZHN0OwotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAJc3RydWN0IG5mX25hdF9yYW5nZSBuZXdyYW5nZTsKIAotCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcKLQkJICAgICB8fCBob29rbnVtID09IE5GX0lORVRfTE9DQUxfT1VUKTsKKwlORl9DVF9BU1NFUlQocGFyLT5ob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgfHwKKwkJICAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpOwogCiAJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAlORl9DVF9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQpKTsKIAogCS8qIExvY2FsIHBhY2tldHM6IG1ha2UgdGhlbSBnbyB0byBsb29wYmFjayAqLwotCWlmIChob29rbnVtID09IE5GX0lORVRfTE9DQUxfT1VUKQorCWlmIChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpCiAJCW5ld2RzdCA9IGh0b25sKDB4N0YwMDAwMDEpOwogCWVsc2UgewogCQlzdHJ1Y3QgaW5fZGV2aWNlICppbmRldjsKQEAgLTkyLDcgKzg3LDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgcmVkaXJlY3RfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gIlJFRElSRUNUIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldAkJPSByZWRpcmVjdF90ZywKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggMjYzOTg3Mi4uMGI0YjZlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC0xMzYsMTEgKzEzNiw5IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXJlamVjdF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK3JlamVjdF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqZWN0ID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqZWN0ID0gcGFyLT50YXJnaW5mbzsKIAogCS8qIFdBUk5JTkc6IFRoaXMgY29kZSBjYXVzZXMgcmVlbnRyeSB3aXRoaW4gaXB0YWJsZXMuCiAJICAgVGhpcyBtZWFucyB0aGF0IHRoZSBpcHRhYmxlcyBqdW1wIHN0YWNrIGlzIG5vdyBjcmFwLiAgV2UKQEAgLTE2OCw3ICsxNjYsNyBAQAogCQlzZW5kX3VucmVhY2goc2tiLCBJQ01QX1BLVF9GSUxURVJFRCk7CiAJCWJyZWFrOwogCWNhc2UgSVBUX1RDUF9SRVNFVDoKLQkJc2VuZF9yZXNldChza2IsIGhvb2tudW0pOworCQlzZW5kX3Jlc2V0KHNrYiwgcGFyLT5ob29rbnVtKTsKIAljYXNlIElQVF9JQ01QX0VDSE9SRVBMWToKIAkJLyogRG9lc24ndCBoYXBwZW4uICovCiAJCWJyZWFrOwpAQCAtMTc3LDEzICsxNzUsMTAgQEAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KIAotc3RhdGljIGJvb2wKLXJlamVjdF90Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVfdm9pZCwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCByZWplY3RfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqaW5mbyA9IHRhcmdpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlX3ZvaWQ7CisJY29uc3Qgc3RydWN0IGlwdF9yZWplY3RfaW5mbyAqcmVqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKHJlamluZm8tPndpdGggPT0gSVBUX0lDTVBfRUNIT1JFUExZKSB7CiAJCXByaW50aygiaXB0X1JFSkVDVDogRUNIT1JFUExZIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4iKTsKQEAgLTIwMSw3ICsxOTYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCByZWplY3RfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gIlJFSkVDVCIsCi0JLmZhbWlseQkJPSBBRl9JTkVULAorCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCS50YXJnZXQJCT0gcmVqZWN0X3RnLAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfcmVqZWN0X2luZm8pLAogCS50YWJsZQkJPSAiZmlsdGVyIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IDMwZWVkNjUuLjZkNzZhYWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtMjAsMTIgKzIwLDEwIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXR0bF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK3R0bF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwaGRyICppcGg7Ci0JY29uc3Qgc3RydWN0IGlwdF9UVExfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfVFRMX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCWludCBuZXdfdHRsOwogCiAJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHNrYi0+bGVuKSkKQEAgLTYxLDEyICs1OSw5IEBACiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgYm9vbAotdHRsX3RnX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCB0dGxfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9UVExfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfVFRMX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJaWYgKGluZm8tPm1vZGUgPiBJUFRfVFRMX01BWE1PREUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXB0X1RUTDogaW52YWxpZCBvciB1bmtub3duIE1vZGUgJXVcbiIsCkBAIC04MCw3ICs3NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHR0bF90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSAJCT0gIlRUTCIsCi0JLmZhbWlseQkJPSBBRl9JTkVULAorCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCS50YXJnZXQgCT0gdHRsX3RnLAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfVFRMX2luZm8pLAogCS50YWJsZQkJPSAibWFuZ2xlIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKaW5kZXggYjE5Mjc1Ni4uMThhMjgyNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKQEAgLTI4MSwxOCArMjgxLDE0IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXVsb2dfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK3Vsb2dfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCXN0cnVjdCBpcHRfdWxvZ19pbmZvICpsb2dpbmZvID0gKHN0cnVjdCBpcHRfdWxvZ19pbmZvICopIHRhcmdpbmZvOwotCi0JaXB0X3Vsb2dfcGFja2V0KGhvb2tudW0sIHNrYiwgaW4sIG91dCwgbG9naW5mbywgTlVMTCk7Ci0KKwlpcHRfdWxvZ19wYWNrZXQocGFyLT5ob29rbnVtLCBza2IsIHBhci0+aW4sIHBhci0+b3V0LAorCSAgICAgICAgICAgICAgICBwYXItPnRhcmdpbmZvLCBOVUxMKTsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdF9sb2dmbih1bnNpZ25lZCBpbnQgcGYsCitzdGF0aWMgdm9pZCBpcHRfbG9nZm4odV9pbnQ4X3QgcGYsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAogCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCkBAIC0zMTcsMTIgKzMxMyw5IEBACiAJaXB0X3Vsb2dfcGFja2V0KGhvb2tudW0sIHNrYiwgaW4sIG91dCwgJmxvZ2luZm8sIHByZWZpeCk7CiB9CiAKLXN0YXRpYyBib29sCi11bG9nX3RnX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrKQorc3RhdGljIGJvb2wgdWxvZ190Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyAqbG9naW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfdWxvZ19pbmZvICpsb2dpbmZvID0gcGFyLT50YXJnaW5mbzsKIAogCWlmIChsb2dpbmZvLT5wcmVmaXhbc2l6ZW9mKGxvZ2luZm8tPnByZWZpeCkgLSAxXSAhPSAnXDAnKSB7CiAJCXByX2RlYnVnKCJpcHRfVUxPRzogcHJlZml4IHRlcm0gJWlcbiIsCkBAIC0zNzQsNyArMzY3LDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgdWxvZ190Z19yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiVUxPRyIsCi0JLmZhbWlseQkJPSBBRl9JTkVULAorCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCS50YXJnZXQJCT0gdWxvZ190ZywKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSB1bG9nX3RnX2NoZWNrLApAQCAtNDE5LDcgKzQxMiw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCWlmIChuZmxvZykKLQkJbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQsICZpcHRfdWxvZ19sb2dnZXIpOworCQluZl9sb2dfcmVnaXN0ZXIoTkZQUk9UT19JUFY0LCAmaXB0X3Vsb2dfbG9nZ2VyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCmluZGV4IDQ2MmEyMmMuLjg4NzYyZjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKQEAgLTMwLDEyICszMCw5IEBACiB9CiAKIHN0YXRpYyBib29sCi1hZGRydHlwZV9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICAgICAgIGJvb2wgKmhvdGRyb3ApCithZGRydHlwZV9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlib29sIHJldCA9IHRydWU7CiAKQEAgLTUwLDIwICs0NywxNyBAQAogfQogCiBzdGF0aWMgYm9vbAotYWRkcnR5cGVfbXRfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotCSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotCSAgICAgICBib29sICpob3Rkcm9wKQorYWRkcnR5cGVfbXRfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvX3YxICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mb192MSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CiAJYm9vbCByZXQgPSB0cnVlOwogCiAJaWYgKGluZm8tPmZsYWdzICYgSVBUX0FERFJUWVBFX0xJTUlUX0lGQUNFX0lOKQotCQlkZXYgPSBpbjsKKwkJZGV2ID0gcGFyLT5pbjsKIAllbHNlIGlmIChpbmZvLT5mbGFncyAmIElQVF9BRERSVFlQRV9MSU1JVF9JRkFDRV9PVVQpCi0JCWRldiA9IG91dDsKKwkJZGV2ID0gcGFyLT5vdXQ7CiAKIAlpZiAoaW5mby0+c291cmNlKQogCQlyZXQgJj0gbWF0Y2hfdHlwZShkZXYsIGlwaC0+c2FkZHIsIGluZm8tPnNvdXJjZSkgXgpAQCAtNzQsMTIgKzY4LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYm9vbAotYWRkcnR5cGVfbXRfY2hlY2tlbnRyeV92MShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCi0JCQkgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLQkJCSAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGFkZHJ0eXBlX210X2NoZWNrZW50cnlfdjEoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvX3YxICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mb192MSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKGluZm8tPmZsYWdzICYgSVBUX0FERFJUWVBFX0xJTUlUX0lGQUNFX0lOICYmCiAJICAgIGluZm8tPmZsYWdzICYgSVBUX0FERFJUWVBFX0xJTUlUX0lGQUNFX09VVCkgewpAQCAtODgsMTQgKzc5LDE2IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlpZiAoaG9va19tYXNrICYgKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORyB8IDEgPDwgTkZfSU5FVF9MT0NBTF9JTikgJiYKKwlpZiAocGFyLT5ob29rX21hc2sgJiAoKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfAorCSAgICAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSkgJiYKIAkgICAgaW5mby0+ZmxhZ3MgJiBJUFRfQUREUlRZUEVfTElNSVRfSUZBQ0VfT1VUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXB0X2FkZHJ0eXBlOiBvdXRwdXQgaW50ZXJmYWNlIGxpbWl0YXRpb24gIgogCQkJCSJub3QgdmFsaWQgaW4gUFJFX1JPVVRJTkcgYW5kIElOUFVUXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCWlmIChob29rX21hc2sgJiAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORyB8IDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpICYmCisJaWYgKHBhci0+aG9va19tYXNrICYgKCgxIDw8IE5GX0lORVRfUE9TVF9ST1VUSU5HKSB8CisJICAgICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSkgJiYKIAkgICAgaW5mby0+ZmxhZ3MgJiBJUFRfQUREUlRZUEVfTElNSVRfSUZBQ0VfSU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcHRfYWRkcnR5cGU6IGlucHV0IGludGVyZmFjZSBsaW1pdGF0aW9uICIKIAkJCQkibm90IHZhbGlkIGluIFBPU1RfUk9VVElORyBhbmQgT1VUUFVUXG4iKTsKQEAgLTEwOCwxNCArMTAxLDE0IEBACiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIGFkZHJ0eXBlX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAiYWRkcnR5cGUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2gJCT0gYWRkcnR5cGVfbXRfdjAsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9hZGRydHlwZV9pbmZvKSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFCiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJhZGRydHlwZSIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJCS5yZXZpc2lvbgk9IDEsCiAJCS5tYXRjaAkJPSBhZGRydHlwZV9tdF92MSwKIAkJLmNoZWNrZW50cnkJPSBhZGRydHlwZV9tdF9jaGVja2VudHJ5X3YxLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCmluZGV4IGU5Nzc5ODkuLjAxMDRjMGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKQEAgLTM2LDI3ICszNiwyMyBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgYm9vbAotYWhfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCitzdGF0aWMgYm9vbCBhaF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgaXBfYXV0aF9oZHIgX2FoZHI7CiAJY29uc3Qgc3RydWN0IGlwX2F1dGhfaGRyICphaDsKLQljb25zdCBzdHJ1Y3QgaXB0X2FoICphaGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9haCAqYWhpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCWlmIChvZmZzZXQpCisJaWYgKHBhci0+ZnJhZ29mZiAhPSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCi0JCQkJc2l6ZW9mKF9haGRyKSwgJl9haGRyKTsKKwlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfYWhkciksICZfYWhkcik7CiAJaWYgKGFoID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKIAkJICogY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLgogCQkgKi8KIAkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgQUggdGlueWdyYW0uXG4iKTsKLQkJKmhvdGRyb3AgPSB0cnVlOworCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02NSwxMyArNjEsOSBAQAogCQkJICEhKGFoaW5mby0+aW52ZmxhZ3MgJiBJUFRfQUhfSU5WX1NQSSkpOwogfQogCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgYm9vbAotYWhfbXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcF92b2lkLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGFoX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcHRfYWggKmFoaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2FoICphaGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgc3BlY2lmeSBubyB1bmtub3duIGludmZsYWdzICovCiAJaWYgKGFoaW5mby0+aW52ZmxhZ3MgJiB+SVBUX0FIX0lOVl9NQVNLKSB7CkBAIC04Myw3ICs3NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggYWhfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gImFoIiwKLQkuZmFtaWx5CQk9IEFGX0lORVQsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLm1hdGNoCQk9IGFoX210LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9haCksCiAJLnByb3RvCQk9IElQUFJPVE9fQUgsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwppbmRleCA3NDlkZTgyLi42Mjg5YjY0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKQEAgLTY3LDEyICs2Nyw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1lY25fbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK3N0YXRpYyBib29sIGVjbl9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWlmIChpbmZvLT5vcGVyYXRpb24gJiBJUFRfRUNOX09QX01BVENIX0lQKQogCQlpZiAoIW1hdGNoX2lwKHNrYiwgaW5mbykpCkBAIC04MSwyMCArNzgsMTcgQEAKIAlpZiAoaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfTUFUQ0hfRUNFfElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSkgewogCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fVENQKQogCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIW1hdGNoX3RjcChza2IsIGluZm8sIGhvdGRyb3ApKQorCQlpZiAoIW1hdGNoX3RjcChza2IsIGluZm8sIHBhci0+aG90ZHJvcCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1lY25fbXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcF92b2lkLAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgZWNuX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpcF92b2lkOworCWNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKGluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfTUFTSykKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTE0LDcgKzEwOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZWNuX210X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJlY24iLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkubWF0Y2gJCT0gZWNuX210LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9lY25faW5mbyksCiAJLmNoZWNrZW50cnkJPSBlY25fbXRfY2hlY2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3NGQ3Yy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgb2YgdGhlIG9sZCBpcHRfcmVjZW50IG1vZHVsZSwgd2hpY2ggY2FycmllZCB0aGUKLSAqIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlOgotICoKLSAqIEF1dGhvcjogU3RlcGhlbiBGcm9zdCA8c2Zyb3N0QHNub3dtYW4ubmV0PgotICogQ29weXJpZ2h0IDIwMDItMjAwMywgU3RlcGhlbiBGcm9zdCwgMi41LnggcG9ydCBieSBsYWZvcmdlQG5ldGZpbHRlci5vcmcKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaD4KLQotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IFwicmVjZW50bHktc2VlblwiIGhvc3QgbWF0Y2hpbmcgZm9yIElQdjQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9saXN0X3RvdCA9IDEwMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfcGt0X2xpc3RfdG90ID0gMjA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2xpc3RfaGFzaF9zaXplID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbGlzdF9wZXJtcyA9IDA2NDQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2xpc3RfdWlkID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbGlzdF9naWQgPSAwOwotbW9kdWxlX3BhcmFtKGlwX2xpc3RfdG90LCB1aW50LCAwNDAwKTsKLW1vZHVsZV9wYXJhbShpcF9wa3RfbGlzdF90b3QsIHVpbnQsIDA0MDApOwotbW9kdWxlX3BhcmFtKGlwX2xpc3RfaGFzaF9zaXplLCB1aW50LCAwNDAwKTsKLW1vZHVsZV9wYXJhbShpcF9saXN0X3Blcm1zLCB1aW50LCAwNDAwKTsKLW1vZHVsZV9wYXJhbShpcF9saXN0X3VpZCwgdWludCwgMDQwMCk7Ci1tb2R1bGVfcGFyYW0oaXBfbGlzdF9naWQsIHVpbnQsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X3RvdCwgIm51bWJlciBvZiBJUHMgdG8gcmVtZW1iZXIgcGVyIGxpc3QiKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXBfcGt0X2xpc3RfdG90LCAibnVtYmVyIG9mIHBhY2tldHMgcGVyIElQIHRvIHJlbWVtYmVyIChtYXguIDI1NSkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXBfbGlzdF9oYXNoX3NpemUsICJzaXplIG9mIGhhc2ggdGFibGUgdXNlZCB0byBsb29rIHVwIElQcyIpOwotTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X3Blcm1zLCAicGVybWlzc2lvbnMgb24gL3Byb2MvbmV0L2lwdF9yZWNlbnQvKiBmaWxlcyIpOwotTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X3VpZCwib3duZXIgb2YgL3Byb2MvbmV0L2lwdF9yZWNlbnQvKiBmaWxlcyIpOwotTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X2dpZCwib3duaW5nIGdyb3VwIG9mIC9wcm9jL25ldC9pcHRfcmVjZW50LyogZmlsZXMiKTsKLQotc3RydWN0IHJlY2VudF9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJbHJ1X2xpc3Q7Ci0JX19iZTMyCQkJYWRkcjsKLQl1X2ludDhfdAkJdHRsOwotCXVfaW50OF90CQlpbmRleDsKLQl1X2ludDE2X3QJCW5zdGFtcHM7Ci0JdW5zaWduZWQgbG9uZwkJc3RhbXBzWzBdOwotfTsKLQotc3RydWN0IHJlY2VudF90YWJsZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCWNoYXIJCQluYW1lW0lQVF9SRUNFTlRfTkFNRV9MRU5dOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jOwotI2VuZGlmCi0JdW5zaWduZWQgaW50CQlyZWZjbnQ7Ci0JdW5zaWduZWQgaW50CQllbnRyaWVzOwotCXN0cnVjdCBsaXN0X2hlYWQJbHJ1X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAlpcGhhc2hbMF07Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKHRhYmxlcyk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlY2VudF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgocmVjZW50X211dGV4KTsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX2RpcjsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXJlY2VudF9mb3BzOwotI2VuZGlmCi0KLXN0YXRpYyB1X2ludDMyX3QgaGFzaF9ybmQ7Ci1zdGF0aWMgaW50IGhhc2hfcm5kX2luaXR0ZWQ7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVjZW50X2VudHJ5X2hhc2goX19iZTMyIGFkZHIpCi17Ci0JaWYgKCFoYXNoX3JuZF9pbml0dGVkKSB7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmhhc2hfcm5kLCA0KTsKLQkJaGFzaF9ybmRfaW5pdHRlZCA9IDE7Ci0JfQotCXJldHVybiBqaGFzaF8xd29yZCgoX19mb3JjZSB1MzIpYWRkciwgaGFzaF9ybmQpICYgKGlwX2xpc3RfaGFzaF9zaXplIC0gMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVjZW50X2VudHJ5ICoKLXJlY2VudF9lbnRyeV9sb29rdXAoY29uc3Qgc3RydWN0IHJlY2VudF90YWJsZSAqdGFibGUsIF9fYmUzMiBhZGRyLCB1X2ludDhfdCB0dGwpCi17Ci0Jc3RydWN0IHJlY2VudF9lbnRyeSAqZTsKLQl1bnNpZ25lZCBpbnQgaDsKLQotCWggPSByZWNlbnRfZW50cnlfaGFzaChhZGRyKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZ0YWJsZS0+aXBoYXNoW2hdLCBsaXN0KQotCQlpZiAoZS0+YWRkciA9PSBhZGRyICYmICh0dGwgPT0gZS0+dHRsIHx8ICF0dGwgfHwgIWUtPnR0bCkpCi0JCQlyZXR1cm4gZTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcmVjZW50X2VudHJ5X3JlbW92ZShzdHJ1Y3QgcmVjZW50X3RhYmxlICp0LCBzdHJ1Y3QgcmVjZW50X2VudHJ5ICplKQotewotCWxpc3RfZGVsKCZlLT5saXN0KTsKLQlsaXN0X2RlbCgmZS0+bHJ1X2xpc3QpOwotCWtmcmVlKGUpOwotCXQtPmVudHJpZXMtLTsKLX0KLQotc3RhdGljIHN0cnVjdCByZWNlbnRfZW50cnkgKgotcmVjZW50X2VudHJ5X2luaXQoc3RydWN0IHJlY2VudF90YWJsZSAqdCwgX19iZTMyIGFkZHIsIHVfaW50OF90IHR0bCkKLXsKLQlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplOwotCi0JaWYgKHQtPmVudHJpZXMgPj0gaXBfbGlzdF90b3QpIHsKLQkJZSA9IGxpc3RfZW50cnkodC0+bHJ1X2xpc3QubmV4dCwgc3RydWN0IHJlY2VudF9lbnRyeSwgbHJ1X2xpc3QpOwotCQlyZWNlbnRfZW50cnlfcmVtb3ZlKHQsIGUpOwotCX0KLQllID0ga21hbGxvYyhzaXplb2YoKmUpICsgc2l6ZW9mKGUtPnN0YW1wc1swXSkgKiBpcF9wa3RfbGlzdF90b3QsCi0JCSAgICBHRlBfQVRPTUlDKTsKLQlpZiAoZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllLT5hZGRyICAgICAgPSBhZGRyOwotCWUtPnR0bCAgICAgICA9IHR0bDsKLQllLT5zdGFtcHNbMF0gPSBqaWZmaWVzOwotCWUtPm5zdGFtcHMgICA9IDE7Ci0JZS0+aW5kZXggICAgID0gMTsKLQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmdC0+aXBoYXNoW3JlY2VudF9lbnRyeV9oYXNoKGFkZHIpXSk7Ci0JbGlzdF9hZGRfdGFpbCgmZS0+bHJ1X2xpc3QsICZ0LT5scnVfbGlzdCk7Ci0JdC0+ZW50cmllcysrOwotCXJldHVybiBlOwotfQotCi1zdGF0aWMgdm9pZCByZWNlbnRfZW50cnlfdXBkYXRlKHN0cnVjdCByZWNlbnRfdGFibGUgKnQsIHN0cnVjdCByZWNlbnRfZW50cnkgKmUpCi17Ci0JZS0+c3RhbXBzW2UtPmluZGV4KytdID0gamlmZmllczsKLQlpZiAoZS0+aW5kZXggPiBlLT5uc3RhbXBzKQotCQllLT5uc3RhbXBzID0gZS0+aW5kZXg7Ci0JZS0+aW5kZXggJT0gaXBfcGt0X2xpc3RfdG90OwotCWxpc3RfbW92ZV90YWlsKCZlLT5scnVfbGlzdCwgJnQtPmxydV9saXN0KTsKLX0KLQotc3RhdGljIHN0cnVjdCByZWNlbnRfdGFibGUgKnJlY2VudF90YWJsZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgcmVjZW50X3RhYmxlICp0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdGFibGVzLCBsaXN0KQotCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCBuYW1lKSkKLQkJCXJldHVybiB0OwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCByZWNlbnRfdGFibGVfZmx1c2goc3RydWN0IHJlY2VudF90YWJsZSAqdCkKLXsKLQlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplLCAqbmV4dDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBpcF9saXN0X2hhc2hfc2l6ZTsgaSsrKQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgbmV4dCwgJnQtPmlwaGFzaFtpXSwgbGlzdCkKLQkJCXJlY2VudF9lbnRyeV9yZW1vdmUodCwgZSk7Ci19Ci0KLXN0YXRpYyBib29sCi1yZWNlbnRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICBib29sICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcHRfcmVjZW50X2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0Jc3RydWN0IHJlY2VudF90YWJsZSAqdDsKLQlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplOwotCV9fYmUzMiBhZGRyOwotCXVfaW50OF90IHR0bDsKLQlib29sIHJldCA9IGluZm8tPmludmVydDsKLQotCWlmIChpbmZvLT5zaWRlID09IElQVF9SRUNFTlRfREVTVCkKLQkJYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKLQllbHNlCi0JCWFkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7Ci0KLQl0dGwgPSBpcF9oZHIoc2tiKS0+dHRsOwotCS8qIHVzZSBUVEwgYXMgc2VlbiBiZWZvcmUgZm9yd2FyZGluZyAqLwotCWlmIChvdXQgJiYgIXNrYi0+c2spCi0JCXR0bCsrOwotCi0Jc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7Ci0JdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7Ci0JZSA9IHJlY2VudF9lbnRyeV9sb29rdXAodCwgYWRkciwKLQkJCQlpbmZvLT5jaGVja19zZXQgJiBJUFRfUkVDRU5UX1RUTCA/IHR0bCA6IDApOwotCWlmIChlID09IE5VTEwpIHsKLQkJaWYgKCEoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9TRVQpKQotCQkJZ290byBvdXQ7Ci0JCWUgPSByZWNlbnRfZW50cnlfaW5pdCh0LCBhZGRyLCB0dGwpOwotCQlpZiAoZSA9PSBOVUxMKQotCQkJKmhvdGRyb3AgPSB0cnVlOwotCQlyZXQgPSAhcmV0OwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9TRVQpCi0JCXJldCA9ICFyZXQ7Ci0JZWxzZSBpZiAoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9SRU1PVkUpIHsKLQkJcmVjZW50X2VudHJ5X3JlbW92ZSh0LCBlKTsKLQkJcmV0ID0gIXJldDsKLQl9IGVsc2UgaWYgKGluZm8tPmNoZWNrX3NldCAmIChJUFRfUkVDRU5UX0NIRUNLIHwgSVBUX1JFQ0VOVF9VUERBVEUpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGltZSA9IGppZmZpZXMgLSBpbmZvLT5zZWNvbmRzICogSFo7Ci0JCXVuc2lnbmVkIGludCBpLCBoaXRzID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZS0+bnN0YW1wczsgaSsrKSB7Ci0JCQlpZiAoaW5mby0+c2Vjb25kcyAmJiB0aW1lX2FmdGVyKHRpbWUsIGUtPnN0YW1wc1tpXSkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoKytoaXRzID49IGluZm8tPmhpdF9jb3VudCkgewotCQkJCXJldCA9ICFyZXQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby0+Y2hlY2tfc2V0ICYgSVBUX1JFQ0VOVF9TRVQgfHwKLQkgICAgKGluZm8tPmNoZWNrX3NldCAmIElQVF9SRUNFTlRfVVBEQVRFICYmIHJldCkpIHsKLQkJcmVjZW50X2VudHJ5X3VwZGF0ZSh0LCBlKTsKLQkJZS0+dHRsID0gdHRsOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sCi1yZWNlbnRfbXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcCwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3JlY2VudF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXN0cnVjdCByZWNlbnRfdGFibGUgKnQ7Ci0JdW5zaWduZWQgaTsKLQlib29sIHJldCA9IGZhbHNlOwotCi0JaWYgKGh3ZWlnaHQ4KGluZm8tPmNoZWNrX3NldCAmCi0JCSAgICAgKElQVF9SRUNFTlRfU0VUIHwgSVBUX1JFQ0VOVF9SRU1PVkUgfAotCQkgICAgICBJUFRfUkVDRU5UX0NIRUNLIHwgSVBUX1JFQ0VOVF9VUERBVEUpKSAhPSAxKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKChpbmZvLT5jaGVja19zZXQgJiAoSVBUX1JFQ0VOVF9TRVQgfCBJUFRfUkVDRU5UX1JFTU9WRSkpICYmCi0JICAgIChpbmZvLT5zZWNvbmRzIHx8IGluZm8tPmhpdF9jb3VudCkpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAoaW5mby0+aGl0X2NvdW50ID4gaXBfcGt0X2xpc3RfdG90KQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGluZm8tPm5hbWVbMF0gPT0gJ1wwJyB8fAotCSAgICBzdHJubGVuKGluZm8tPm5hbWUsIElQVF9SRUNFTlRfTkFNRV9MRU4pID09IElQVF9SRUNFTlRfTkFNRV9MRU4pCi0JCXJldHVybiBmYWxzZTsKLQotCW11dGV4X2xvY2soJnJlY2VudF9tdXRleCk7Ci0JdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7Ci0JaWYgKHQgIT0gTlVMTCkgewotCQl0LT5yZWZjbnQrKzsKLQkJcmV0ID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSArIHNpemVvZih0LT5pcGhhc2hbMF0pICogaXBfbGlzdF9oYXNoX3NpemUsCi0JCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAodCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQl0LT5yZWZjbnQgPSAxOwotCXN0cmNweSh0LT5uYW1lLCBpbmZvLT5uYW1lKTsKLQlJTklUX0xJU1RfSEVBRCgmdC0+bHJ1X2xpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBpcF9saXN0X2hhc2hfc2l6ZTsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmdC0+aXBoYXNoW2ldKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXQtPnByb2MgPSBwcm9jX2NyZWF0ZSh0LT5uYW1lLCBpcF9saXN0X3Blcm1zLCBwcm9jX2RpciwgJnJlY2VudF9mb3BzKTsKLQlpZiAodC0+cHJvYyA9PSBOVUxMKSB7Ci0JCWtmcmVlKHQpOwotCQlnb3RvIG91dDsKLQl9Ci0JdC0+cHJvYy0+dWlkICAgICAgID0gaXBfbGlzdF91aWQ7Ci0JdC0+cHJvYy0+Z2lkICAgICAgID0gaXBfbGlzdF9naWQ7Ci0JdC0+cHJvYy0+ZGF0YSAgICAgID0gdDsKLSNlbmRpZgotCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnQtPmxpc3QsICZ0YWJsZXMpOwotCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7Ci0JcmV0ID0gdHJ1ZTsKLW91dDoKLQltdXRleF91bmxvY2soJnJlY2VudF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcmVjZW50X210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQotewotCWNvbnN0IHN0cnVjdCBpcHRfcmVjZW50X2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0Jc3RydWN0IHJlY2VudF90YWJsZSAqdDsKLQotCW11dGV4X2xvY2soJnJlY2VudF9tdXRleCk7Ci0JdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7Ci0JaWYgKC0tdC0+cmVmY250ID09IDApIHsKLQkJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7Ci0JCWxpc3RfZGVsKCZ0LT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCQlyZW1vdmVfcHJvY19lbnRyeSh0LT5uYW1lLCBwcm9jX2Rpcik7Ci0jZW5kaWYKLQkJcmVjZW50X3RhYmxlX2ZsdXNoKHQpOwotCQlrZnJlZSh0KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyZWNlbnRfbXV0ZXgpOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0cnVjdCByZWNlbnRfaXRlcl9zdGF0ZSB7Ci0Jc3RydWN0IHJlY2VudF90YWJsZQkqdGFibGU7Ci0JdW5zaWduZWQgaW50CQlidWNrZXQ7Ci19OwotCi1zdGF0aWMgdm9pZCAqcmVjZW50X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi0JX19hY3F1aXJlcyhyZWNlbnRfbG9jaykKLXsKLQlzdHJ1Y3QgcmVjZW50X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCWNvbnN0IHN0cnVjdCByZWNlbnRfdGFibGUgKnQgPSBzdC0+dGFibGU7Ci0Jc3RydWN0IHJlY2VudF9lbnRyeSAqZTsKLQlsb2ZmX3QgcCA9ICpwb3M7Ci0KLQlzcGluX2xvY2tfYmgoJnJlY2VudF9sb2NrKTsKLQotCWZvciAoc3QtPmJ1Y2tldCA9IDA7IHN0LT5idWNrZXQgPCBpcF9saXN0X2hhc2hfc2l6ZTsgc3QtPmJ1Y2tldCsrKQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZ0LT5pcGhhc2hbc3QtPmJ1Y2tldF0sIGxpc3QpCi0JCQlpZiAocC0tID09IDApCi0JCQkJcmV0dXJuIGU7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICpyZWNlbnRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCByZWNlbnRfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0JY29uc3Qgc3RydWN0IHJlY2VudF90YWJsZSAqdCA9IHN0LT50YWJsZTsKLQlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplID0gdjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gZS0+bGlzdC5uZXh0OwotCi0Jd2hpbGUgKGhlYWQgPT0gJnQtPmlwaGFzaFtzdC0+YnVja2V0XSkgewotCQlpZiAoKytzdC0+YnVja2V0ID49IGlwX2xpc3RfaGFzaF9zaXplKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSB0LT5pcGhhc2hbc3QtPmJ1Y2tldF0ubmV4dDsKLQl9Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHJlY2VudF9lbnRyeSwgbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY2VudF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi0JX19yZWxlYXNlcyhyZWNlbnRfbG9jaykKLXsKLQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOwotfQotCi1zdGF0aWMgaW50IHJlY2VudF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLQljb25zdCBzdHJ1Y3QgcmVjZW50X2VudHJ5ICplID0gdjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWkgPSAoZS0+aW5kZXggLSAxKSAlIGlwX3BrdF9saXN0X3RvdDsKLQlzZXFfcHJpbnRmKHNlcSwgInNyYz0ldS4ldS4ldS4ldSB0dGw6ICV1IGxhc3Rfc2VlbjogJWx1IG9sZGVzdF9wa3Q6ICV1IiwKLQkJICAgTklQUVVBRChlLT5hZGRyKSwgZS0+dHRsLCBlLT5zdGFtcHNbaV0sIGUtPmluZGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgZS0+bnN0YW1wczsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiVzICVsdSIsIGkgPyAiLCIgOiAiIiwgZS0+c3RhbXBzW2ldKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmVjZW50X3NlcV9vcHMgPSB7Ci0JLnN0YXJ0CQk9IHJlY2VudF9zZXFfc3RhcnQsCi0JLm5leHQJCT0gcmVjZW50X3NlcV9uZXh0LAotCS5zdG9wCQk9IHJlY2VudF9zZXFfc3RvcCwKLQkuc2hvdwkJPSByZWNlbnRfc2VxX3Nob3csCi19OwotCi1zdGF0aWMgaW50IHJlY2VudF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7Ci0Jc3RydWN0IHJlY2VudF9pdGVyX3N0YXRlICpzdDsKLQotCXN0ID0gX19zZXFfb3Blbl9wcml2YXRlKGZpbGUsICZyZWNlbnRfc2VxX29wcywgc2l6ZW9mKCpzdCkpOwotCWlmIChzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXN0LT50YWJsZSAgICA9IHBkZS0+ZGF0YTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcmVjZW50X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbnB1dCwKLQkJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKLXsKLQljb25zdCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKLQlzdHJ1Y3QgcmVjZW50X3RhYmxlICp0ID0gcGRlLT5kYXRhOwotCXN0cnVjdCByZWNlbnRfZW50cnkgKmU7Ci0JY2hhciBidWZbc2l6ZW9mKCIrMjU1LjI1NS4yNTUuMjU1IildLCAqYyA9IGJ1ZjsKLQlfX2JlMzIgYWRkcjsKLQlpbnQgYWRkOwotCi0JaWYgKHNpemUgPiBzaXplb2YoYnVmKSkKLQkJc2l6ZSA9IHNpemVvZihidWYpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGlucHV0LCBzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jd2hpbGUgKGlzc3BhY2UoKmMpKQotCQljKys7Ci0KLQlpZiAoc2l6ZSAtIChjIC0gYnVmKSA8IDUpCi0JCXJldHVybiBjIC0gYnVmOwotCWlmICghc3RybmNtcChjLCAiY2xlYXIiLCA1KSkgewotCQljICs9IDU7Ci0JCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOwotCQlyZWNlbnRfdGFibGVfZmx1c2godCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7Ci0JCXJldHVybiBjIC0gYnVmOwotCX0KLQotCXN3aXRjaCAoKmMpIHsKLQljYXNlICctJzoKLQkJYWRkID0gMDsKLQkJYysrOwotCQlicmVhazsKLQljYXNlICcrJzoKLQkJYysrOwotCWRlZmF1bHQ6Ci0JCWFkZCA9IDE7Ci0JCWJyZWFrOwotCX0KLQlhZGRyID0gaW5fYXRvbihjKTsKLQotCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOwotCWUgPSByZWNlbnRfZW50cnlfbG9va3VwKHQsIGFkZHIsIDApOwotCWlmIChlID09IE5VTEwpIHsKLQkJaWYgKGFkZCkKLQkJCXJlY2VudF9lbnRyeV9pbml0KHQsIGFkZHIsIDApOwotCX0gZWxzZSB7Ci0JCWlmIChhZGQpCi0JCQlyZWNlbnRfZW50cnlfdXBkYXRlKHQsIGUpOwotCQllbHNlCi0JCQlyZWNlbnRfZW50cnlfcmVtb3ZlKHQsIGUpOwotCX0KLQlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOwotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWNlbnRfZm9wcyA9IHsKLQkub3BlbgkJPSByZWNlbnRfc2VxX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLndyaXRlCQk9IHJlY2VudF9wcm9jX3dyaXRlLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0KLXN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcmVjZW50X210X3JlZyBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9ICJyZWNlbnQiLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkubWF0Y2gJCT0gcmVjZW50X210LAotCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF9yZWNlbnRfaW5mbyksCi0JLmNoZWNrZW50cnkJPSByZWNlbnRfbXRfY2hlY2ssCi0JLmRlc3Ryb3kJPSByZWNlbnRfbXRfZGVzdHJveSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByZWNlbnRfbXRfaW5pdCh2b2lkKQotewotCWludCBlcnI7Ci0KLQlpZiAoIWlwX2xpc3RfdG90IHx8ICFpcF9wa3RfbGlzdF90b3QgfHwgaXBfcGt0X2xpc3RfdG90ID4gMjU1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpcF9saXN0X2hhc2hfc2l6ZSA9IDEgPDwgZmxzKGlwX2xpc3RfdG90KTsKLQotCWVyciA9IHh0X3JlZ2lzdGVyX21hdGNoKCZyZWNlbnRfbXRfcmVnKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JcHJvY19kaXIgPSBwcm9jX21rZGlyKCJpcHRfcmVjZW50IiwgaW5pdF9uZXQucHJvY19uZXQpOwotCWlmIChwcm9jX2RpciA9PSBOVUxMKSB7Ci0JCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnJlY2VudF9tdF9yZWcpOwotCQllcnIgPSAtRU5PTUVNOwotCX0KLSNlbmRpZgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCByZWNlbnRfbXRfZXhpdCh2b2lkKQotewotCUJVR19PTighbGlzdF9lbXB0eSgmdGFibGVzKSk7Ci0JeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X210X3JlZyk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXB0X3JlY2VudCIsIGluaXRfbmV0LnByb2NfbmV0KTsKLSNlbmRpZgotfQotCi1tb2R1bGVfaW5pdChyZWNlbnRfbXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChyZWNlbnRfbXRfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYwppbmRleCBlMGI4Y2FlLi4yOTdmMWNiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKQEAgLTE4LDEyICsxOCw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IElQdjQgVFRMIGZpZWxkIG1hdGNoIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBib29sCi10dGxfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK3N0YXRpYyBib29sIHR0bF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3R0bF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfdHRsX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCB1OCB0dGwgPSBpcF9oZHIoc2tiKS0+dHRsOwogCiAJc3dpdGNoIChpbmZvLT5tb2RlKSB7CkBAIC00Niw3ICs0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdHRsX210X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJ0dGwiLAotCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkubWF0Y2gJCT0gdHRsX210LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF90dGxfaW5mbyksCiAJLm1lCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwppbmRleCAxZWE2NzdkLi5jOTIyNDMxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwpAQCAtNzAsNyArNzAsNyBAQAogCQkgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX2xvY2FsX2luX25ldChpbiwgb3V0KS0+aXB2NC5pcHRhYmxlX2ZpbHRlcik7CisJCQkgICAgZGV2X25ldChpbiktPmlwdjQuaXB0YWJsZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC04MSw3ICs4MSw3IEBACiAJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX2ZvcndhcmRfbmV0KGluLCBvdXQpLT5pcHY0LmlwdGFibGVfZmlsdGVyKTsKKwkJCSAgICBkZXZfbmV0KGluKS0+aXB2NC5pcHRhYmxlX2ZpbHRlcik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTEwMSw3ICsxMDEsNyBAQAogCX0KIAogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX2xvY2FsX291dF9uZXQoaW4sIG91dCktPmlwdjQuaXB0YWJsZV9maWx0ZXIpOworCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX2ZpbHRlcik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXB0X29wc1tdIF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IGRhNTkxODIuLjY5ZjJjNDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC04MSw3ICs4MSw3IEBACiAJCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgbmZfcHJlX3JvdXRpbmdfbmV0KGluLCBvdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKKwkJCSAgICBkZXZfbmV0KGluKS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTkyLDcgKzkyLDcgQEAKIAkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgbmZfcG9zdF9yb3V0aW5nX25ldChpbiwgb3V0KS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CisJCQkgICAgZGV2X25ldChvdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtMTAzLDcgKzEwMyw3IEBACiAJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgbmZfbG9jYWxfaW5fbmV0KGluLCBvdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKKwkJCSAgICBkZXZfbmV0KGluKS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTExNCw3ICsxMTQsNyBAQAogCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlyZXR1cm4gaXB0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwKLQkJCSAgICBuZl9mb3J3YXJkX25ldChpbiwgb3V0KS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CisJCQkgICAgZGV2X25ldChpbiktPmlwdjQuaXB0YWJsZV9tYW5nbGUpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAl0b3MgPSBpcGgtPnRvczsKIAogCXJldCA9IGlwdF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICBuZl9sb2NhbF9vdXRfbmV0KGluLCBvdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKKwkJCSAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CiAJLyogUmVyb3V0ZSBmb3IgQU5ZIGNoYW5nZS4gKi8KIAlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJiByZXQgIT0gTkZfUVVFVUUpIHsKIAkJaXBoID0gaXBfaGRyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCmluZGV4IGZkZGNlNzcuLjhmYWViZmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCkBAIC01Myw3ICs1Myw3IEBACiAJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX3ByZV9yb3V0aW5nX25ldChpbiwgb3V0KS0+aXB2NC5pcHRhYmxlX3Jhdyk7CisJCQkgICAgZGV2X25ldChpbiktPmlwdjQuaXB0YWJsZV9yYXcpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC03Miw3ICs3Miw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX2xvY2FsX291dF9uZXQoaW4sIG91dCktPmlwdjQuaXB0YWJsZV9yYXcpOworCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX3Jhdyk7CiB9CiAKIC8qICdyYXcnIGlzIHRoZSB2ZXJ5IGZpcnN0IHRhYmxlLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfc2VjdXJpdHkuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3NlY3VyaXR5LmMKaW5kZXggZGI2ZDMxMi4uMzZmM2JlMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfc2VjdXJpdHkuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9zZWN1cml0eS5jCkBAIC03Myw3ICs3Myw3IEBACiAJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgbmZfbG9jYWxfaW5fbmV0KGluLCBvdXQpLT5pcHY0LmlwdGFibGVfc2VjdXJpdHkpOworCQkJICAgIGRldl9uZXQoaW4pLT5pcHY0LmlwdGFibGVfc2VjdXJpdHkpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC04NCw3ICs4NCw3IEBACiAJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlyZXR1cm4gaXB0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwKLQkJCSAgICBuZl9mb3J3YXJkX25ldChpbiwgb3V0KS0+aXB2NC5pcHRhYmxlX3NlY3VyaXR5KTsKKwkJCSAgICBkZXZfbmV0KGluKS0+aXB2NC5pcHRhYmxlX3NlY3VyaXR5KTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtMTAzLDcgKzEwMyw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgIG5mX2xvY2FsX291dF9uZXQoaW4sIG91dCktPmlwdjQuaXB0YWJsZV9zZWN1cml0eSk7CisJCQkgICAgZGV2X25ldChvdXQpLT5pcHY0LmlwdGFibGVfc2VjdXJpdHkpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwdF9vcHNbXSBfX3JlYWRfbW9zdGx5ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggNWE5NTVjNC4uNGE3YzM1MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC0xLDMgKzEsNCBAQAorCiAvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCiAgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CiAgKgpAQCAtMjQsNiArMjUsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfZGVmcmFnX2lwdjQuaD4KIAogaW50ICgqbmZfbmF0X3NlcV9hZGp1c3RfaG9vaykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKQEAgLTYzLDIzICs2NSw2IEBACiAJCQkgIE5JUFFVQUQodHVwbGUtPmRzdC51My5pcCkpOwogfQogCi0vKiBSZXR1cm5zIG5ldyBza19idWZmLCBvciBOVUxMICovCi1zdGF0aWMgaW50IG5mX2N0X2lwdjRfZ2F0aGVyX2ZyYWdzKHN0cnVjdCBza19idWZmICpza2IsIHVfaW50MzJfdCB1c2VyKQotewotCWludCBlcnI7Ci0KLQlza2Jfb3JwaGFuKHNrYik7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JZXJyID0gaXBfZGVmcmFnKHNrYiwgdXNlcik7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7Ci0KLQlpZiAoIWVycikKLQkJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IGlwdjRfZ2V0X2w0cHJvdG8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAogCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YW9mZiwgdV9pbnQ4X3QgKnByb3RvbnVtKQogewpAQCAtMTQ0LDM1ICsxMjksMTMgQEAKIAlyZXR1cm4gbmZfY29ubnRyYWNrX2NvbmZpcm0oc2tiKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBpcHY0X2Nvbm50cmFja19kZWZyYWcodW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gIElnbm9yZS4gIERvIHRoaXMgYmVmb3JlCi0JICAgZnJhZ21lbnQgY2hlY2suICovCi0JaWYgKHNrYi0+bmZjdCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCS8qIEdhdGhlciBmcmFnbWVudHMuICovCi0JaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgewotCQlpZiAobmZfY3RfaXB2NF9nYXRoZXJfZnJhZ3Moc2tiLAotCQkJCQkgICAgaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HID8KLQkJCQkJICAgIElQX0RFRlJBR19DT05OVFJBQ0tfSU4gOgotCQkJCQkgICAgSVBfREVGUkFHX0NPTk5UUkFDS19PVVQpKQotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBpcHY0X2Nvbm50cmFja19pbih1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewotCXJldHVybiBuZl9jb25udHJhY2tfaW4oUEZfSU5FVCwgaG9va251bSwgc2tiKTsKKwlyZXR1cm4gbmZfY29ubnRyYWNrX2luKGRldl9uZXQoaW4pLCBQRl9JTkVULCBob29rbnVtLCBza2IpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdjRfY29ubnRyYWNrX2xvY2FsKHVuc2lnbmVkIGludCBob29rbnVtLApAQCAtMTg4LDIwICsxNTEsMTMgQEAKIAkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQotCXJldHVybiBuZl9jb25udHJhY2tfaW4oUEZfSU5FVCwgaG9va251bSwgc2tiKTsKKwlyZXR1cm4gbmZfY29ubnRyYWNrX2luKGRldl9uZXQob3V0KSwgUEZfSU5FVCwgaG9va251bSwgc2tiKTsKIH0KIAogLyogQ29ubmVjdGlvbiB0cmFja2luZyBtYXkgZHJvcCBwYWNrZXRzLCBidXQgbmV2ZXIgYWx0ZXJzIHRoZW0sIHNvCiAgICBtYWtlIGl0IHRoZSBmaXJzdCBob29rLiAqLwogc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcHY0X2Nvbm50cmFja19vcHNbXSBfX3JlYWRfbW9zdGx5ID0gewogCXsKLQkJLmhvb2sJCT0gaXB2NF9jb25udHJhY2tfZGVmcmFnLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lORVRfUFJFX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHLAotCX0sCi0JewogCQkuaG9vawkJPSBpcHY0X2Nvbm50cmFja19pbiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVCwKQEAgLTIwOSwxMyArMTY1LDYgQEAKIAkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDSywKIAl9LAogCXsKLQkJLmhvb2sgICAgICAgICAgID0gaXB2NF9jb25udHJhY2tfZGVmcmFnLAotCQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkJLnBmICAgICAgICAgICAgID0gUEZfSU5FVCwKLQkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eSAgICAgICA9IE5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHLAotCX0sCi0JewogCQkuaG9vawkJPSBpcHY0X2Nvbm50cmFja19sb2NhbCwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVCwKQEAgLTI1NCw3ICsyMDMsNyBAQAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0NPVU5ULAogCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2NvdW50IiwKLQkJLmRhdGEJCT0gJm5mX2Nvbm50cmFja19jb3VudCwKKwkJLmRhdGEJCT0gJmluaXRfbmV0LmN0LmNvdW50LAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNDQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCkBAIC0yNzAsNyArMjE5LDcgQEAKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19DSEVDS1NVTSwKIAkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jaGVja3N1bSIsCi0JCS5kYXRhCQk9ICZuZl9jb25udHJhY2tfY2hlY2tzdW0sCisJCS5kYXRhCQk9ICZpbml0X25ldC5jdC5zeXNjdGxfY2hlY2tzdW0sCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKQEAgLTI3OCw3ICsyMjcsNyBAQAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElELAogCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKLQkJLmRhdGEJCT0gJm5mX2N0X2xvZ19pbnZhbGlkLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuY3Quc3lzY3RsX2xvZ19pbnZhbGlkLAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LApAQCAtMzIzLDcgKzI3Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlKTsKKwloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KHNvY2tfbmV0KHNrKSwgJnR1cGxlKTsKIAlpZiAoaCkgewogCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwogCQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwpAQCAtNDIyLDYgKzM3MSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAluZWVkX2Nvbm50cmFjaygpOworCW5mX2RlZnJhZ19pcHY0X2VuYWJsZSgpOwogCiAJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKaW5kZXggM2EwMjA3Mi4uMzEzZWJmMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKQEAgLTIxLDE4ICsyMSwyMCBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaD4KIAogc3RydWN0IGN0X2l0ZXJfc3RhdGUgeworCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKIAl1bnNpZ25lZCBpbnQgYnVja2V0OwogfTsKIAogc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpjdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCiAJZm9yIChzdC0+YnVja2V0ID0gMDsKIAkgICAgIHN0LT5idWNrZXQgPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiAJICAgICBzdC0+YnVja2V0KyspIHsKLQkJbiA9IHJjdV9kZXJlZmVyZW5jZShuZl9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XS5maXJzdCk7CisJCW4gPSByY3VfZGVyZWZlcmVuY2UobmV0LT5jdC5oYXNoW3N0LT5idWNrZXRdLmZpcnN0KTsKIAkJaWYgKG4pCiAJCQlyZXR1cm4gbjsKIAl9CkBAIC00MiwxMyArNDQsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCiAJCQkJICAgICAgc3RydWN0IGhsaXN0X25vZGUgKmhlYWQpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCiAJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLT5uZXh0KTsKIAl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7CiAJCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UobmZfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuaGFzaFtzdC0+YnVja2V0XS5maXJzdCk7CiAJfQogCXJldHVybiBoZWFkOwogfQpAQCAtMTU4LDggKzE2MSw4IEBACiAKIHN0YXRpYyBpbnQgY3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2VxX29wZW5fcHJpdmF0ZShmaWxlLCAmY3Rfc2VxX29wcywKLQkJCXNpemVvZihzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSkpOworCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZjdF9zZXFfb3BzLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9maWxlX29wcyA9IHsKQEAgLTE2NywyMSArMTcwLDIzIEBACiAJLm9wZW4gICAgPSBjdF9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfbmV0LAogfTsKIAogLyogZXhwZWN0cyAqLwogc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlIHsKKwlzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlIHA7CiAJdW5zaWduZWQgaW50IGJ1Y2tldDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZXhwZWN0X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCiAJZm9yIChzdC0+YnVja2V0ID0gMDsgc3QtPmJ1Y2tldCA8IG5mX2N0X2V4cGVjdF9oc2l6ZTsgc3QtPmJ1Y2tldCsrKSB7Ci0JCW4gPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQluID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOwogCQlpZiAobikKIAkJCXJldHVybiBuOwogCX0KQEAgLTE5MSwxMyArMTk2LDE0IEBACiBzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmN0X2V4cGVjdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKIAkJCQkJICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqaGVhZCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCiAJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLT5uZXh0KTsKIAl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7CiAJCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY3RfZXhwZWN0X2hzaXplKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOwogCX0KIAlyZXR1cm4gaGVhZDsKIH0KQEAgLTI2NSw4ICsyNzEsOCBAQAogCiBzdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3Blbl9wcml2YXRlKGZpbGUsICZleHBfc2VxX29wcywKLQkJCXNpemVvZihzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUpKTsKKwlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmZXhwX3NlcV9vcHMsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF9leHBfZmlsZV9vcHMgPSB7CkBAIC0yNzQsMTEgKzI4MCwxMiBAQAogCS5vcGVuICAgID0gZXhwX29wZW4sCiAJLnJlYWQgICAgPSBzZXFfcmVhZCwKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCiB9OwogCiBzdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJaW50IGNwdTsKIAogCWlmICgqcG9zID09IDApCkBAIC0yODgsNyArMjk1LDcgQEAKIAkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKIAkJCWNvbnRpbnVlOwogCQkqcG9zID0gY3B1KzE7Ci0JCXJldHVybiAmcGVyX2NwdShuZl9jb25udHJhY2tfc3RhdCwgY3B1KTsKKwkJcmV0dXJuIHBlcl9jcHVfcHRyKG5ldC0+Y3Quc3RhdCwgY3B1KTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTI5NiwxMyArMzAzLDE0IEBACiAKIHN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwogCWludCBjcHU7CiAKIAlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7CiAJCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCiAJCQljb250aW51ZTsKIAkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gJnBlcl9jcHUobmZfY29ubnRyYWNrX3N0YXQsIGNwdSk7CisJCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0zMTQsNyArMzIyLDggQEAKIAogc3RhdGljIGludCBjdF9jcHVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0JdW5zaWduZWQgaW50IG5yX2Nvbm50cmFja3MgPSBhdG9taWNfcmVhZCgmbmZfY29ubnRyYWNrX2NvdW50KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKKwl1bnNpZ25lZCBpbnQgbnJfY29ubnRyYWNrcyA9IGF0b21pY19yZWFkKCZuZXQtPmN0LmNvdW50KTsKIAljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgKnN0ID0gdjsKIAogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewpAQCAtMzU0LDcgKzM2Myw4IEBACiAKIHN0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3RfY3B1X3NlcV9vcHMpOworCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZjdF9jcHVfc2VxX29wcywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7CkBAIC0zNjIsMzkgKzM3Miw1NCBAQAogCS5vcGVuICAgID0gY3RfY3B1X3NlcV9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKIH07CiAKLWludCBfX2luaXQgbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19uZXRfaW5pdCBpcF9jb25udHJhY2tfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYywgKnByb2NfZXhwLCAqcHJvY19zdGF0OwogCi0JcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImlwX2Nvbm50cmFjayIsIDA0NDAsICZjdF9maWxlX29wcyk7CisJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKG5ldCwgImlwX2Nvbm50cmFjayIsIDA0NDAsICZjdF9maWxlX29wcyk7CiAJaWYgKCFwcm9jKQogCQlnb3RvIGVycjE7CiAKLQlwcm9jX2V4cCA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImlwX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLAorCXByb2NfZXhwID0gcHJvY19uZXRfZm9wc19jcmVhdGUobmV0LCAiaXBfY29ubnRyYWNrX2V4cGVjdCIsIDA0NDAsCiAJCQkJCSZpcF9leHBfZmlsZV9vcHMpOwogCWlmICghcHJvY19leHApCiAJCWdvdG8gZXJyMjsKIAogCXByb2Nfc3RhdCA9IHByb2NfY3JlYXRlKCJpcF9jb25udHJhY2siLCBTX0lSVUdPLAotCQkJCWluaXRfbmV0LnByb2NfbmV0X3N0YXQsICZjdF9jcHVfc2VxX2ZvcHMpOworCQkJCW5ldC0+cHJvY19uZXRfc3RhdCwgJmN0X2NwdV9zZXFfZm9wcyk7CiAJaWYgKCFwcm9jX3N0YXQpCiAJCWdvdG8gZXJyMzsKIAlyZXR1cm4gMDsKIAogZXJyMzoKLQlwcm9jX25ldF9yZW1vdmUoJmluaXRfbmV0LCAiaXBfY29ubnRyYWNrX2V4cGVjdCIpOworCXByb2NfbmV0X3JlbW92ZShuZXQsICJpcF9jb25udHJhY2tfZXhwZWN0Iik7CiBlcnIyOgotCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJpcF9jb25udHJhY2siKTsKKwlwcm9jX25ldF9yZW1vdmUobmV0LCAiaXBfY29ubnRyYWNrIik7CiBlcnIxOgogCXJldHVybiAtRU5PTUVNOwogfQogCitzdGF0aWMgdm9pZCBfX25ldF9leGl0IGlwX2Nvbm50cmFja19uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXRfc3RhdCk7CisJcHJvY19uZXRfcmVtb3ZlKG5ldCwgImlwX2Nvbm50cmFja19leHBlY3QiKTsKKwlwcm9jX25ldF9yZW1vdmUobmV0LCAiaXBfY29ubnRyYWNrIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgaXBfY29ubnRyYWNrX25ldF9vcHMgPSB7CisJLmluaXQgPSBpcF9jb25udHJhY2tfbmV0X2luaXQsCisJLmV4aXQgPSBpcF9jb25udHJhY2tfbmV0X2V4aXQsCit9OworCitpbnQgX19pbml0IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwX2Nvbm50cmFja19uZXRfb3BzKTsKK30KKwogdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2Zpbmkodm9pZCkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgaW5pdF9uZXQucHJvY19uZXRfc3RhdCk7Ci0JcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX2Nvbm50cmFja19leHBlY3QiKTsKLQlwcm9jX25ldF9yZW1vdmUoJmluaXRfbmV0LCAiaXBfY29ubnRyYWNrIik7CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcF9jb25udHJhY2tfbmV0X29wcyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IDk3NzkxMDQuLjRlODg3OTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC03OSw3ICs3OSw3IEBACiAJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIGludCBwZiwKKwkJICAgICAgIHVfaW50OF90IHBmLAogCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CiAJLyogVHJ5IHRvIGRlbGV0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGFsbCByZXBsaWVzOgpAQCAtOTEsNyArOTEsNyBAQAogCQkJbmZfY3Rfa2lsbF9hY2N0KGN0LCBjdGluZm8sIHNrYik7CiAJfSBlbHNlIHsKIAkJYXRvbWljX2luYygmY3QtPnByb3RvLmljbXAuY291bnQpOwotCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUsIHNrYik7CisJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GT19WT0xBVElMRSwgY3QpOwogCQluZl9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLCBuZl9jdF9pY21wX3RpbWVvdXQpOwogCX0KIApAQCAtMTIzLDcgKzEyMyw3IEBACiAKIC8qIFJldHVybnMgY29ubnRyYWNrIGlmIGl0IGRlYWx0IHdpdGggSUNNUCwgYW5kIGZpbGxlZCBpbiBza2IgZmllbGRzICovCiBzdGF0aWMgaW50Ci1pY21wX2Vycm9yX21lc3NhZ2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ljbXBfZXJyb3JfbWVzc2FnZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiAJKmN0aW5mbyA9IElQX0NUX1JFTEFURUQ7CiAKLQloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KCZpbm5lcnR1cGxlKTsKKwloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KG5ldCwgJmlubmVydHVwbGUpOwogCWlmICghaCkgewogCQlwcl9kZWJ1ZygiaWNtcF9lcnJvcl9tZXNzYWdlOiBubyBtYXRjaFxuIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwpAQCAtMTcyLDggKzE3Miw4IEBACiAKIC8qIFNtYWxsIGFuZCBtb2RpZmllZCB2ZXJzaW9uIG9mIGljbXBfcmN2ICovCiBzdGF0aWMgaW50Ci1pY21wX2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSkKK2ljbXBfZXJyb3Ioc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sIHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAljb25zdCBzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CiAJc3RydWN0IGljbXBoZHIgX2loOwpAQCAtMTgxLDE2ICsxODEsMTYgQEAKIAkvKiBOb3QgZW5vdWdoIGhlYWRlcj8gKi8KIAlpY21waCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX2loKSwgJl9paCk7CiAJaWYgKGljbXBoID09IE5VTEwpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fSUNNUCkpCiAJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfaWNtcDogc2hvcnQgcGFja2V0ICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKIAl9CiAKIAkvKiBTZWUgaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jICovCi0JaWYgKG5mX2Nvbm50cmFja19jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgJiYKKwlpZiAobmV0LT5jdC5zeXNjdGxfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HICYmCiAJICAgIG5mX2lwX2NoZWNrc3VtKHNrYiwgaG9va251bSwgZGF0YW9mZiwgMCkpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fSUNNUCkpCiAJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfaWNtcDogYmFkIEhXIElDTVAgY2hlY2tzdW0gIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJICoJCSAgZGlzY2FyZGVkLgogCSAqLwogCWlmIChpY21waC0+dHlwZSA+IE5SX0lDTVBfVFlQRVMpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fSUNNUCkpCiAJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfaWNtcDogaW52YWxpZCBJQ01QIHR5cGUgIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJICAgICYmIGljbXBoLT50eXBlICE9IElDTVBfUkVESVJFQ1QpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlyZXR1cm4gaWNtcF9lcnJvcl9tZXNzYWdlKHNrYiwgY3RpbmZvLCBob29rbnVtKTsKKwlyZXR1cm4gaWNtcF9lcnJvcl9tZXNzYWdlKG5ldCwgc2tiLCBjdGluZm8sIGhvb2tudW0pOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmQ2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYwpAQCAtMCwwICsxLDk3IEBACisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfZGVmcmFnX2lwdjQuaD4KKworLyogUmV0dXJucyBuZXcgc2tfYnVmZiwgb3IgTlVMTCAqLworc3RhdGljIGludCBuZl9jdF9pcHY0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcikKK3sKKwlpbnQgZXJyOworCisJc2tiX29ycGhhbihza2IpOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWVyciA9IGlwX2RlZnJhZyhza2IsIHVzZXIpOworCWxvY2FsX2JoX2VuYWJsZSgpOworCisJaWYgKCFlcnIpCisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpcHY0X2Nvbm50cmFja19kZWZyYWcodW5zaWduZWQgaW50IGhvb2tudW0sCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgIWRlZmluZWQoQ09ORklHX05GX05BVCkgJiYgIWRlZmluZWQoQ09ORklHX05GX05BVF9NT0RVTEUpCisJLyogUHJldmlvdXNseSBzZWVuIChsb29wYmFjayk/ICBJZ25vcmUuICBEbyB0aGlzIGJlZm9yZQorCSAgIGZyYWdtZW50IGNoZWNrLiAqLworCWlmIChza2ItPm5mY3QpCisJCXJldHVybiBORl9BQ0NFUFQ7CisjZW5kaWYKKyNlbmRpZgorCS8qIEdhdGhlciBmcmFnbWVudHMuICovCisJaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgeworCQlpZiAobmZfY3RfaXB2NF9nYXRoZXJfZnJhZ3Moc2tiLAorCQkJCQkgICAgaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HID8KKwkJCQkJICAgIElQX0RFRlJBR19DT05OVFJBQ0tfSU4gOgorCQkJCQkgICAgSVBfREVGUkFHX0NPTk5UUkFDS19PVVQpKQorCQkJcmV0dXJuIE5GX1NUT0xFTjsKKwl9CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcHY0X2RlZnJhZ19vcHNbXSA9IHsKKwl7CisJCS5ob29rCQk9IGlwdjRfY29ubnRyYWNrX2RlZnJhZywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0JPSBORl9JTkVUX1BSRV9ST1VUSU5HLAorCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0RFRlJBRywKKwl9LAorCXsKKwkJLmhvb2sgICAgICAgICAgID0gaXB2NF9jb25udHJhY2tfZGVmcmFnLAorCQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkJLnBmICAgICAgICAgICAgID0gUEZfSU5FVCwKKwkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9MT0NBTF9PVVQsCisJCS5wcmlvcml0eSAgICAgICA9IE5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZl9kZWZyYWdfaW5pdCh2b2lkKQoreworCXJldHVybiBuZl9yZWdpc3Rlcl9ob29rcyhpcHY0X2RlZnJhZ19vcHMsIEFSUkFZX1NJWkUoaXB2NF9kZWZyYWdfb3BzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZl9kZWZyYWdfZmluaSh2b2lkKQoreworCW5mX3VucmVnaXN0ZXJfaG9va3MoaXB2NF9kZWZyYWdfb3BzLCBBUlJBWV9TSVpFKGlwdjRfZGVmcmFnX29wcykpOworfQorCit2b2lkIG5mX2RlZnJhZ19pcHY0X2VuYWJsZSh2b2lkKQoreworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfZGVmcmFnX2lwdjRfZW5hYmxlKTsKKworbW9kdWxlX2luaXQobmZfZGVmcmFnX2luaXQpOworbW9kdWxlX2V4aXQobmZfZGVmcmFnX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDZjNmEzY2IuLmE2NWNmNjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC0zNyw5ICszNyw2IEBACiAKIC8qIENhbGN1bGF0ZWQgYXQgaW5pdCBiYXNlZCBvbiBtZW1vcnkgc2l6ZSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBuZl9uYXRfaHRhYmxlX3NpemUgX19yZWFkX21vc3RseTsKLXN0YXRpYyBpbnQgbmZfbmF0X3ZtYWxsb2NlZDsKLQotc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpieXNvdXJjZSBfX3JlYWRfbW9zdGx5OwogCiAjZGVmaW5lIE1BWF9JUF9OQVRfUFJPVE8gMjU2CiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mX25hdF9wcm90b2NvbCAqbmZfbmF0X3Byb3Rvc1tNQVhfSVBfTkFUX1BST1RPXQpAQCAtMTQ1LDcgKzE0Miw4IEBACiAKIC8qIE9ubHkgY2FsbGVkIGZvciBTUkMgbWFuaXAgKi8KIHN0YXRpYyBpbnQKLWZpbmRfYXBwcm9wcmlhdGVfc3JjKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorZmluZF9hcHByb3ByaWF0ZV9zcmMoc3RydWN0IG5ldCAqbmV0LAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnJlc3VsdCwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKIHsKQEAgLTE1NSw3ICsxNTMsNyBAQAogCWNvbnN0IHN0cnVjdCBobGlzdF9ub2RlICpuOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShuYXQsIG4sICZieXNvdXJjZVtoXSwgYnlzb3VyY2UpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobmF0LCBuLCAmbmV0LT5pcHY0Lm5hdF9ieXNvdXJjZVtoXSwgYnlzb3VyY2UpIHsKIAkJY3QgPSBuYXQtPmN0OwogCQlpZiAoc2FtZV9zcmMoY3QsIHR1cGxlKSkgewogCQkJLyogQ29weSBzb3VyY2UgcGFydCBmcm9tIHJlcGx5IHR1cGxlLiAqLwpAQCAtMjMxLDYgKzIyOSw3IEBACiAJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCWNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnByb3RvOwogCiAJLyogMSkgSWYgdGhpcyBzcmNpcC9wcm90by9zcmMtcHJvdG8tcGFydCBpcyBjdXJyZW50bHkgbWFwcGVkLApAQCAtMjQyLDcgKzI0MSw3IEBACiAJICAgbWFuaXBzIG5vdCBhbiBpc3N1ZS4gICovCiAJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDICYmCiAJICAgICEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkpIHsKLQkJaWYgKGZpbmRfYXBwcm9wcmlhdGVfc3JjKG9yaWdfdHVwbGUsIHR1cGxlLCByYW5nZSkpIHsKKwkJaWYgKGZpbmRfYXBwcm9wcmlhdGVfc3JjKG5ldCwgb3JpZ190dXBsZSwgdHVwbGUsIHJhbmdlKSkgewogCQkJcHJfZGVidWcoImdldF91bmlxdWVfdHVwbGU6IEZvdW5kIGN1cnJlbnQgc3JjIG1hcFxuIik7CiAJCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCiAJCQkJcmV0dXJuOwpAQCAtMjgzLDYgKzI4Miw3IEBACiAJCSAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCiAJCSAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIGN1cnJfdHVwbGUsIG5ld190dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdDsKIAlpbnQgaGF2ZV90b19oYXNoID0gIShjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwpAQCAtMzM0LDcgKzMzNCw4IEBACiAJCS8qIG5mX2Nvbm50cmFja19hbHRlcl9yZXBseSBtaWdodCByZS1hbGxvY2F0ZSBleG50ZW5zaW9uIGFlcmEgKi8KIAkJbmF0ID0gbmZjdF9uYXQoY3QpOwogCQluYXQtPmN0ID0gY3Q7Ci0JCWhsaXN0X2FkZF9oZWFkX3JjdSgmbmF0LT5ieXNvdXJjZSwgJmJ5c291cmNlW3NyY2hhc2hdKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZuYXQtPmJ5c291cmNlLAorCQkJCSAgICZuZXQtPmlwdjQubmF0X2J5c291cmNlW3NyY2hhc2hdKTsKIAkJc3Bpbl91bmxvY2tfYmgoJm5mX25hdF9sb2NrKTsKIAl9CiAKQEAgLTU4Myw2ICs1ODQsMTMyIEBACiAJLmZsYWdzCQk9IE5GX0NUX0VYVF9GX1BSRUFMTE9DLAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBwcm90b25hdF9ubGFfcG9saWN5W0NUQV9QUk9UT05BVF9NQVgrMV0gPSB7CisJW0NUQV9QUk9UT05BVF9QT1JUX01JTl0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtDVEFfUFJPVE9OQVRfUE9SVF9NQVhdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKK307CisKK3N0YXRpYyBpbnQgbmZuZXRsaW5rX3BhcnNlX25hdF9wcm90byhzdHJ1Y3QgbmxhdHRyICphdHRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICAgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJc3RydWN0IG5sYXR0ciAqdGJbQ1RBX1BST1RPTkFUX01BWCsxXTsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sICpucHQ7CisJaW50IGVycjsKKworCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIENUQV9QUk9UT05BVF9NQVgsIGF0dHIsIHByb3RvbmF0X25sYV9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbnB0ID0gbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KG5mX2N0X3Byb3RvbnVtKGN0KSk7CisJaWYgKG5wdC0+bmxhdHRyX3RvX3JhbmdlKQorCQllcnIgPSBucHQtPm5sYXR0cl90b19yYW5nZSh0YiwgcmFuZ2UpOworCW5mX25hdF9wcm90b19wdXQobnB0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmF0X25sYV9wb2xpY3lbQ1RBX05BVF9NQVgrMV0gPSB7CisJW0NUQV9OQVRfTUlOSVBdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0NUQV9OQVRfTUFYSVBdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50CituZm5ldGxpbmtfcGFyc2VfbmF0KHN0cnVjdCBubGF0dHIgKm5hdCwKKwkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCit7CisJc3RydWN0IG5sYXR0ciAqdGJbQ1RBX05BVF9NQVgrMV07CisJaW50IGVycjsKKworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCwgbmF0X25sYV9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHRiW0NUQV9OQVRfTUlOSVBdKQorCQlyYW5nZS0+bWluX2lwID0gbmxhX2dldF9iZTMyKHRiW0NUQV9OQVRfTUlOSVBdKTsKKworCWlmICghdGJbQ1RBX05BVF9NQVhJUF0pCisJCXJhbmdlLT5tYXhfaXAgPSByYW5nZS0+bWluX2lwOworCWVsc2UKKwkJcmFuZ2UtPm1heF9pcCA9IG5sYV9nZXRfYmUzMih0YltDVEFfTkFUX01BWElQXSk7CisKKwlpZiAocmFuZ2UtPm1pbl9pcCkKKwkJcmFuZ2UtPmZsYWdzIHw9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCisJaWYgKCF0YltDVEFfTkFUX1BST1RPXSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBuZm5ldGxpbmtfcGFyc2VfbmF0X3Byb3RvKHRiW0NUQV9OQVRfUFJPVE9dLCBjdCwgcmFuZ2UpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mbmV0bGlua19wYXJzZV9uYXRfc2V0dXAoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwLAorCQkJICBzdHJ1Y3QgbmxhdHRyICphdHRyKQoreworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CisKKwlpZiAobmZuZXRsaW5rX3BhcnNlX25hdChhdHRyLCBjdCwgJnJhbmdlKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsIG1hbmlwKSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgbWFuaXApOworfQorI2Vsc2UKK3N0YXRpYyBpbnQKK25mbmV0bGlua19wYXJzZV9uYXRfc2V0dXAoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwLAorCQkJICBzdHJ1Y3QgbmxhdHRyICphdHRyKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fbmV0X2luaXQgbmZfbmF0X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwluZXQtPmlwdjQubmF0X2J5c291cmNlID0gbmZfY3RfYWxsb2NfaGFzaHRhYmxlKCZuZl9uYXRfaHRhYmxlX3NpemUsCisJCQkJCQkgICAgICAmbmV0LT5pcHY0Lm5hdF92bWFsbG9jZWQpOworCWlmICghbmV0LT5pcHY0Lm5hdF9ieXNvdXJjZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qIENsZWFyIE5BVCBzZWN0aW9uIG9mIGFsbCBjb25udHJhY2tzLCBpbiBjYXNlIHdlJ3JlIGxvYWRlZCBhZ2Fpbi4gKi8KK3N0YXRpYyBpbnQgY2xlYW5fbmF0KHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoaSk7CisKKwlpZiAoIW5hdCkKKwkJcmV0dXJuIDA7CisJbWVtc2V0KG5hdCwgMCwgc2l6ZW9mKCpuYXQpKTsKKwlpLT5zdGF0dXMgJj0gfihJUFNfTkFUX01BU0sgfCBJUFNfTkFUX0RPTkVfTUFTSyB8IElQU19TRVFfQURKVVNUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9uYXRfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQoreworCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChuZXQsICZjbGVhbl9uYXQsIE5VTEwpOworCXN5bmNocm9uaXplX3JjdSgpOworCW5mX2N0X2ZyZWVfaGFzaHRhYmxlKG5ldC0+aXB2NC5uYXRfYnlzb3VyY2UsIG5ldC0+aXB2NC5uYXRfdm1hbGxvY2VkLAorCQkJICAgICBuZl9uYXRfaHRhYmxlX3NpemUpOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIG5mX25hdF9uZXRfb3BzID0geworCS5pbml0ID0gbmZfbmF0X25ldF9pbml0LAorCS5leGl0ID0gbmZfbmF0X25ldF9leGl0LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbmZfbmF0X2luaXQodm9pZCkKIHsKIAlzaXplX3QgaTsKQEAgLTU5OSwxMiArNzI2LDkgQEAKIAkvKiBMZWF2ZSB0aGVtIHRoZSBzYW1lIGZvciB0aGUgbW9tZW50LiAqLwogCW5mX25hdF9odGFibGVfc2l6ZSA9IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKIAotCWJ5c291cmNlID0gbmZfY3RfYWxsb2NfaGFzaHRhYmxlKCZuZl9uYXRfaHRhYmxlX3NpemUsCi0JCQkJCSAmbmZfbmF0X3ZtYWxsb2NlZCk7Ci0JaWYgKCFieXNvdXJjZSkgewotCQlyZXQgPSAtRU5PTUVNOworCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX25hdF9uZXRfb3BzKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBjbGVhbnVwX2V4dGVuZDsKLQl9CiAKIAkvKiBTZXcgaW4gYnVpbHRpbiBwcm90b2NvbHMuICovCiAJc3Bpbl9sb2NrX2JoKCZuZl9uYXRfbG9jayk7CkBAIC02MjIsNiArNzQ2LDkgQEAKIAogCUJVR19PTihuZl9uYXRfc2VxX2FkanVzdF9ob29rICE9IE5VTEwpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfc2VxX2FkanVzdF9ob29rLCBuZl9uYXRfc2VxX2FkanVzdCk7CisJQlVHX09OKG5mbmV0bGlua19wYXJzZV9uYXRfc2V0dXBfaG9vayAhPSBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZuZXRsaW5rX3BhcnNlX25hdF9zZXR1cF9ob29rLAorCQkJICAgbmZuZXRsaW5rX3BhcnNlX25hdF9zZXR1cCk7CiAJcmV0dXJuIDA7CiAKICBjbGVhbnVwX2V4dGVuZDoKQEAgLTYyOSwzMCArNzU2LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogQ2xlYXIgTkFUIHNlY3Rpb24gb2YgYWxsIGNvbm50cmFja3MsIGluIGNhc2Ugd2UncmUgbG9hZGVkIGFnYWluLiAqLwotc3RhdGljIGludCBjbGVhbl9uYXQoc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQgPSBuZmN0X25hdChpKTsKLQotCWlmICghbmF0KQotCQlyZXR1cm4gMDsKLQltZW1zZXQobmF0LCAwLCBzaXplb2YoKm5hdCkpOwotCWktPnN0YXR1cyAmPSB+KElQU19OQVRfTUFTSyB8IElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX1NFUV9BREpVU1QpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmZfbmF0X2NsZWFudXAodm9pZCkKIHsKLQluZl9jdF9pdGVyYXRlX2NsZWFudXAoJmNsZWFuX25hdCwgTlVMTCk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0JbmZfY3RfZnJlZV9oYXNodGFibGUoYnlzb3VyY2UsIG5mX25hdF92bWFsbG9jZWQsIG5mX25hdF9odGFibGVfc2l6ZSk7CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl9uYXRfbmV0X29wcyk7CiAJbmZfY3RfbDNwcm90b19wdXQobDNwcm90byk7CiAJbmZfY3RfZXh0ZW5kX3VucmVnaXN0ZXIoJm5hdF9leHRlbmQpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9uYXRfc2VxX2FkanVzdF9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmZuZXRsaW5rX3BhcnNlX25hdF9zZXR1cF9ob29rLCBOVUxMKTsKIAlzeW5jaHJvbml6ZV9uZXQoKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJuZi1uYXQtaXB2NCIpOwogCiBtb2R1bGVfaW5pdChuZl9uYXRfaW5pdCk7CiBtb2R1bGVfZXhpdChuZl9uYXRfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwppbmRleCAxMTk3NmVhLi5jZjdhNDJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CkBAIC0xOTIsNyArMTkzLDcgQEAKIAkJbmZfY29ubnRyYWNrX3RjcF91cGRhdGUoc2tiLCBpcF9oZHJsZW4oc2tiKSwKIAkJCQkJY3QsIENUSU5GTzJESVIoY3RpbmZvKSk7CiAKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTkFUU0VRQURKLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9OQVRTRVFBREosIGN0KTsKIAl9CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCmluZGV4IGRhM2Q5MWEuLjllYjE3MTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jCkBAIC00MCw2ICs0MCw3IEBACiBzdGF0aWMgdm9pZCBwcHRwX25hdF9leHBlY3RlZChzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKm1hc3RlciA9IGN0LT5tYXN0ZXI7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKm90aGVyX2V4cDsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHQ7CkBAIC03Myw3ICs3NCw3IEBACiAKIAlwcl9kZWJ1ZygidHJ5aW5nIHRvIHVuZXhwZWN0IG90aGVyIGRpcjogIik7CiAJbmZfY3RfZHVtcF90dXBsZV9pcCgmdCk7Ci0Jb3RoZXJfZXhwID0gbmZfY3RfZXhwZWN0X2ZpbmRfZ2V0KCZ0KTsKKwlvdGhlcl9leHAgPSBuZl9jdF9leHBlY3RfZmluZF9nZXQobmV0LCAmdCk7CiAJaWYgKG90aGVyX2V4cCkgewogCQluZl9jdF91bmV4cGVjdF9yZWxhdGVkKG90aGVyX2V4cCk7CiAJCW5mX2N0X2V4cGVjdF9wdXQob3RoZXJfZXhwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKaW5kZXggZThiNGQwZC4uYmVhNTRhNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAlzdHJ1Y3QgaXB0X3JlcGxhY2UgcmVwbDsKIAlzdHJ1Y3QgaXB0X3N0YW5kYXJkIGVudHJpZXNbM107CiAJc3RydWN0IGlwdF9lcnJvciB0ZXJtOwotfSBuYXRfaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhID0geworfSBuYXRfaW5pdGlhbF90YWJsZSBfX25ldF9pbml0ZGF0YSA9IHsKIAkucmVwbCA9IHsKIAkJLm5hbWUgPSAibmF0IiwKIAkJLnZhbGlkX2hvb2tzID0gTkFUX1ZBTElEX0hPT0tTLApAQCAtNTgsNDcgKzU4LDQyIEBACiAJLnRlcm0gPSBJUFRfRVJST1JfSU5JVCwJCQkvKiBFUlJPUiAqLwogfTsKIAotc3RhdGljIHN0cnVjdCB4dF90YWJsZSBfX25hdF90YWJsZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgbmF0X3RhYmxlID0gewogCS5uYW1lCQk9ICJuYXQiLAogCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKIAkubG9jawkJPSBfX1JXX0xPQ0tfVU5MT0NLRUQoX19uYXRfdGFibGUubG9jayksCiAJLm1lCQk9IFRISVNfTU9EVUxFLAogCS5hZgkJPSBBRl9JTkVULAogfTsKLXN0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgKm5hdF90YWJsZTsKIAogLyogU291cmNlIE5BVCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpcHRfc25hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwdF9zbmF0X3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKLQlORl9DVF9BU1NFUlQoaG9va251bSA9PSBORl9JTkVUX1BPU1RfUk9VVElORyk7CisJTkZfQ1RfQVNTRVJUKHBhci0+aG9va251bSA9PSBORl9JTkVUX1BPU1RfUk9VVElORyk7CiAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCiAJLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCiAJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIHx8CiAJCQkgICAgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOwotCU5GX0NUX0FTU0VSVChvdXQpOworCU5GX0NUX0FTU0VSVChwYXItPm91dCAhPSBOVUxMKTsKIAogCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm1yLT5yYW5nZVswXSwgSVBfTkFUX01BTklQX1NSQyk7CiB9CiAKIC8qIEJlZm9yZSAyLjYuMTEgd2UgZGlkIGltcGxpY2l0IHNvdXJjZSBOQVQgaWYgcmVxdWlyZWQuIFdhcm4gYWJvdXQgY2hhbmdlLiAqLwotc3RhdGljIHZvaWQgd2Fybl9pZl9leHRyYV9tYW5nbGUoX19iZTMyIGRzdGlwLCBfX2JlMzIgc3JjaXApCitzdGF0aWMgdm9pZCB3YXJuX2lmX2V4dHJhX21hbmdsZShzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBkc3RpcCwgX19iZTMyIHNyY2lwKQogewogCXN0YXRpYyBpbnQgd2FybmVkID0gMDsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGRzdGlwIH0gfSB9OwogCXN0cnVjdCBydGFibGUgKnJ0OwogCi0JaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJmluaXRfbmV0LCAmcnQsICZmbCkgIT0gMCkKKwlpZiAoaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZydCwgJmZsKSAhPSAwKQogCQlyZXR1cm47CiAKIAlpZiAocnQtPnJ0X3NyYyAhPSBzcmNpcCAmJiAhd2FybmVkKSB7CkBAIC0xMTAsNDAgKzEwNSwzMiBAQAogCWlwX3J0X3B1dChydCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXB0X2RuYXRfdGFyZ2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkJCQkgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitzdGF0aWMgdW5zaWduZWQgaW50CitpcHRfZG5hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwogCi0JTkZfQ1RfQVNTRVJUKGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyB8fAotCQkgICAgIGhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpOworCU5GX0NUX0FTU0VSVChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyB8fAorCQkgICAgIHBhci0+aG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCk7CiAKIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCiAJLyogQ29ubmVjdGlvbiBtdXN0IGJlIHZhbGlkIGFuZCBuZXcuICovCiAJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEKSk7CiAKLQlpZiAoaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCAmJgorCWlmIChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQgJiYKIAkgICAgbXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpCi0JCXdhcm5faWZfZXh0cmFfbWFuZ2xlKGlwX2hkcihza2IpLT5kYWRkciwKKwkJd2Fybl9pZl9leHRyYV9tYW5nbGUoZGV2X25ldChwYXItPm91dCksIGlwX2hkcihza2IpLT5kYWRkciwKIAkJCQkgICAgIG1yLT5yYW5nZVswXS5taW5faXApOwogCiAJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBJUF9OQVRfTUFOSVBfRFNUKTsKIH0KIAotc3RhdGljIGJvb2wgaXB0X3NuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkJY29uc3Qgdm9pZCAqZW50cnksCi0JCQkJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJCXZvaWQgKnRhcmdpbmZvLAotCQkJCXVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBpcHRfc25hdF9jaGVja2VudHJ5KGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKIAkvKiBNdXN0IGJlIGEgdmFsaWQgcmFuZ2UgKi8KIAlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7CkBAIC0xNTMsMTMgKzE0MCw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sIGlwdF9kbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJCWNvbnN0IHZvaWQgKmVudHJ5LAotCQkJCWNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkJCQl2b2lkICp0YXJnaW5mbywKLQkJCQl1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwogCiAJLyogTXVzdCBiZSBhIHZhbGlkIHJhbmdlICovCiAJaWYgKG1yLT5yYW5nZXNpemUgIT0gMSkgewpAQCAtMTk0LDkgKzE3NywxMCBAQAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJaW50IHJldDsKIAotCXJldCA9IGlwdF9kb190YWJsZShza2IsIGhvb2tudW0sIGluLCBvdXQsIG5hdF90YWJsZSk7CisJcmV0ID0gaXB0X2RvX3RhYmxlKHNrYiwgaG9va251bSwgaW4sIG91dCwgbmV0LT5pcHY0Lm5hdF90YWJsZSk7CiAKIAlpZiAocmV0ID09IE5GX0FDQ0VQVCkgewogCQlpZiAoIW5mX25hdF9pbml0aWFsaXplZChjdCwgSE9PSzJNQU5JUChob29rbnVtKSkpCkBAIC0yMjYsMTQgKzIxMCwzMiBAQAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIH07CiAKK3N0YXRpYyBpbnQgX19uZXRfaW5pdCBuZl9uYXRfcnVsZV9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJbmV0LT5pcHY0Lm5hdF90YWJsZSA9IGlwdF9yZWdpc3Rlcl90YWJsZShuZXQsICZuYXRfdGFibGUsCisJCQkJCQkgJm5hdF9pbml0aWFsX3RhYmxlLnJlcGwpOworCWlmIChJU19FUlIobmV0LT5pcHY0Lm5hdF90YWJsZSkpCisJCXJldHVybiBQVFJfRVJSKG5ldC0+aXB2NC5uYXRfdGFibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX25ldF9leGl0IG5mX25hdF9ydWxlX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlpcHRfdW5yZWdpc3Rlcl90YWJsZShuZXQtPmlwdjQubmF0X3RhYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBuZl9uYXRfcnVsZV9uZXRfb3BzID0geworCS5pbml0ID0gbmZfbmF0X3J1bGVfbmV0X2luaXQsCisJLmV4aXQgPSBuZl9uYXRfcnVsZV9uZXRfZXhpdCwKK307CisKIGludCBfX2luaXQgbmZfbmF0X3J1bGVfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKLQluYXRfdGFibGUgPSBpcHRfcmVnaXN0ZXJfdGFibGUoJmluaXRfbmV0LCAmX19uYXRfdGFibGUsCi0JCQkJICAgICAgICZuYXRfaW5pdGlhbF90YWJsZS5yZXBsKTsKLQlpZiAoSVNfRVJSKG5hdF90YWJsZSkpCi0JCXJldHVybiBQVFJfRVJSKG5hdF90YWJsZSk7CisJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfbmF0X3J1bGVfbmV0X29wcyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKIAlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIHVucmVnaXN0ZXJfdGFibGU7CkBAIC0yNDcsOCArMjQ5LDggQEAKICB1bnJlZ2lzdGVyX3NuYXQ6CiAJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CiAgdW5yZWdpc3Rlcl90YWJsZToKLQlpcHRfdW5yZWdpc3Rlcl90YWJsZShuYXRfdGFibGUpOwotCisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl9uYXRfcnVsZV9uZXRfb3BzKTsKKyBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjU2LDUgKzI1OCw1IEBACiB7CiAJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9kbmF0X3JlZyk7CiAJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7Ci0JaXB0X3VucmVnaXN0ZXJfdGFibGUobmF0X3RhYmxlKTsKKwl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX25hdF9ydWxlX25ldF9vcHMpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggNmVlNTM1NC4uOTQyYmUwNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0yODIsNiArMjgyLDggQEAKIAlzdHJ1Y3QgcnRhYmxlICpyID0gTlVMTDsKIAogCWZvciAoc3QtPmJ1Y2tldCA9IHJ0X2hhc2hfbWFzazsgc3QtPmJ1Y2tldCA+PSAwOyAtLXN0LT5idWNrZXQpIHsKKwkJaWYgKCFydF9oYXNoX3RhYmxlW3N0LT5idWNrZXRdLmNoYWluKQorCQkJY29udGludWU7CiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAkJciA9IHJjdV9kZXJlZmVyZW5jZShydF9oYXNoX3RhYmxlW3N0LT5idWNrZXRdLmNoYWluKTsKIAkJd2hpbGUgKHIpIHsKQEAgLTI5OSwxMSArMzAxLDE0IEBACiAJCQkJCSAgc3RydWN0IHJ0YWJsZSAqcikKIHsKIAlzdHJ1Y3QgcnRfY2FjaGVfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisKIAlyID0gci0+dS5kc3QucnRfbmV4dDsKIAl3aGlsZSAoIXIpIHsKIAkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0JCWlmICgtLXN0LT5idWNrZXQgPCAwKQotCQkJYnJlYWs7CisJCWRvIHsKKwkJCWlmICgtLXN0LT5idWNrZXQgPCAwKQorCQkJCXJldHVybiBOVUxMOworCQl9IHdoaWxlICghcnRfaGFzaF90YWJsZVtzdC0+YnVja2V0XS5jaGFpbik7CiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAkJciA9IHJ0X2hhc2hfdGFibGVbc3QtPmJ1Y2tldF0uY2hhaW47CiAJfQpAQCAtMjM1NiwxMSArMjM2MSw2IEBACiAJCSAgICBpcHY0X2lzX3plcm9uZXQob2xkZmxwLT5mbDRfc3JjKSkKIAkJCWdvdG8gb3V0OwogCi0JCS8qIEl0IGlzIGVxdWl2YWxlbnQgdG8gaW5ldF9hZGRyX3R5cGUoc2FkZHIpID09IFJUTl9MT0NBTCAqLwotCQlkZXZfb3V0ID0gaXBfZGV2X2ZpbmQobmV0LCBvbGRmbHAtPmZsNF9zcmMpOwotCQlpZiAoZGV2X291dCA9PSBOVUxMKQotCQkJZ290byBvdXQ7Ci0KIAkJLyogSSByZW1vdmVkIGNoZWNrIGZvciBvaWYgPT0gZGV2X291dC0+b2lmIGhlcmUuCiAJCSAgIEl0IHdhcyB3cm9uZyBmb3IgdHdvIHJlYXNvbnM6CiAJCSAgIDEuIGlwX2Rldl9maW5kKG5ldCwgc2FkZHIpIGNhbiByZXR1cm4gd3JvbmcgaWZhY2UsIGlmIHNhZGRyCkBAIC0yMzcyLDYgKzIzNzIsMTEgQEAKIAkJaWYgKG9sZGZscC0+b2lmID09IDAKIAkJICAgICYmIChpcHY0X2lzX211bHRpY2FzdChvbGRmbHAtPmZsNF9kc3QpIHx8CiAJCQlvbGRmbHAtPmZsNF9kc3QgPT0gaHRvbmwoMHhGRkZGRkZGRikpKSB7CisJCQkvKiBJdCBpcyBlcXVpdmFsZW50IHRvIGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwgKi8KKwkJCWRldl9vdXQgPSBpcF9kZXZfZmluZChuZXQsIG9sZGZscC0+Zmw0X3NyYyk7CisJCQlpZiAoZGV2X291dCA9PSBOVUxMKQorCQkJCWdvdG8gb3V0OworCiAJCQkvKiBTcGVjaWFsIGhhY2s6IHVzZXIgY2FuIGRpcmVjdCBtdWx0aWNhc3RzCiAJCQkgICBhbmQgbGltaXRlZCBicm9hZGNhc3QgdmlhIG5lY2Vzc2FyeSBpbnRlcmZhY2UKIAkJCSAgIHdpdGhvdXQgZmlkZGxpbmcgd2l0aCBJUF9NVUxUSUNBU1RfSUYgb3IgSVBfUEtUSU5GTy4KQEAgLTIzOTAsOSArMjM5NSwxNSBAQAogCQkJZmwub2lmID0gZGV2X291dC0+aWZpbmRleDsKIAkJCWdvdG8gbWFrZV9yb3V0ZTsKIAkJfQotCQlpZiAoZGV2X291dCkKKworCQlpZiAoIShvbGRmbHAtPmZsYWdzICYgRkxPV0lfRkxBR19BTllTUkMpKSB7CisJCQkvKiBJdCBpcyBlcXVpdmFsZW50IHRvIGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwgKi8KKwkJCWRldl9vdXQgPSBpcF9kZXZfZmluZChuZXQsIG9sZGZscC0+Zmw0X3NyYyk7CisJCQlpZiAoZGV2X291dCA9PSBOVUxMKQorCQkJCWdvdG8gb3V0OwogCQkJZGV2X3B1dChkZXZfb3V0KTsKLQkJZGV2X291dCA9IE5VTEw7CisJCQlkZXZfb3V0ID0gTlVMTDsKKwkJfQogCX0KIAogCkBAIC0yODQwLDcgKzI4NTEsOSBAQAogCWlmIChzX2ggPCAwKQogCQlzX2ggPSAwOwogCXNfaWR4ID0gaWR4ID0gY2ItPmFyZ3NbMV07Ci0JZm9yIChoID0gc19oOyBoIDw9IHJ0X2hhc2hfbWFzazsgaCsrKSB7CisJZm9yIChoID0gc19oOyBoIDw9IHJ0X2hhc2hfbWFzazsgaCsrLCBzX2lkeCA9IDApIHsKKwkJaWYgKCFydF9oYXNoX3RhYmxlW2hdLmNoYWluKQorCQkJY29udGludWU7CiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAkJZm9yIChydCA9IHJjdV9kZXJlZmVyZW5jZShydF9oYXNoX3RhYmxlW2hdLmNoYWluKSwgaWR4ID0gMDsgcnQ7CiAJCSAgICAgcnQgPSByY3VfZGVyZWZlcmVuY2UocnQtPnUuZHN0LnJ0X25leHQpLCBpZHgrKykgewpAQCAtMjg1OSw3ICsyODcyLDYgQEAKIAkJCWRzdF9yZWxlYXNlKHhjaGcoJnNrYi0+ZHN0LCBOVUxMKSk7CiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0JCXNfaWR4ID0gMDsKIAl9CiAKIGRvbmU6CkBAIC0yODk2LDggKzI5MDgsNiBAQAogfQogCiBzdGF0aWMgaW50IGlwdjRfc3lzY3RsX3J0Y2FjaGVfZmx1c2hfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwKLQkJCQkJCWludCBfX3VzZXIgKm5hbWUsCi0JCQkJCQlpbnQgbmxlbiwKIAkJCQkJCXZvaWQgX191c2VyICpvbGR2YWwsCiAJCQkJCQlzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwKQEAgLTI5NjAsMTYgKzI5NzAsMTMgQEAKIH0KIAogc3RhdGljIGludCBpcHY0X3N5c2N0bF9ydF9zZWNyZXRfaW50ZXJ2YWxfc3RyYXRlZ3koY3RsX3RhYmxlICp0YWJsZSwKLQkJCQkJCSAgIGludCBfX3VzZXIgKm5hbWUsCi0JCQkJCQkgICBpbnQgbmxlbiwKIAkJCQkJCSAgIHZvaWQgX191c2VyICpvbGR2YWwsCiAJCQkJCQkgICBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJCQkJICAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwKIAkJCQkJCSAgIHNpemVfdCBuZXdsZW4pCiB7CiAJaW50IG9sZCA9IGlwX3J0X3NlY3JldF9pbnRlcnZhbDsKLQlpbnQgcmV0ID0gc3lzY3RsX2ppZmZpZXModGFibGUsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLAotCQkJCSBuZXdsZW4pOworCWludCByZXQgPSBzeXNjdGxfamlmZmllcyh0YWJsZSwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAKIAlydF9zZWNyZXRfcmVzY2hlZHVsZShvbGQpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggOWQzODAwNS4uZDM0NmMyMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKIC8qIFRpbWVzdGFtcHM6IGxvd2VzdCA5IGJpdHMgc3RvcmUgVENQIG9wdGlvbnMgKi8KICNkZWZpbmUgVFNCSVRTIDkKQEAgLTI5Niw2ICsyOTcsNyBAQAogCXRyZXEtPnJjdl9pc24JCT0gbnRvaGwodGgtPnNlcSkgLSAxOwogCXRyZXEtPnNudF9pc24JCT0gY29va2llOwogCXJlcS0+bXNzCQk9IG1zczsKKwlpcmVxLT5sb2NfcG9ydAkJPSB0aC0+ZGVzdDsKIAlpcmVxLT5ybXRfcG9ydAkJPSB0aC0+c291cmNlOwogCWlyZXEtPmxvY19hZGRyCQk9IGlwX2hkcihza2IpLT5kYWRkcjsKIAlpcmVxLT5ybXRfYWRkcgkJPSBpcF9oZHIoc2tiKS0+c2FkZHI7CkBAIC0zMzcsNiArMzM5LDcgQEAKIAkJCQkJCS5zYWRkciA9IGlyZXEtPmxvY19hZGRyLAogCQkJCQkJLnRvcyA9IFJUX0NPTk5fRkxBR1Moc2spIH0gfSwKIAkJCQkgICAgLnByb3RvID0gSVBQUk9UT19UQ1AsCisJCQkJICAgIC5mbGFncyA9IGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CiAJCQkJCSAgICAgICB7IC5zcG9ydCA9IHRoLT5kZXN0LAogCQkJCQkJIC5kcG9ydCA9IHRoLT5zb3VyY2UgfSB9IH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IGUwNjg5ZmQuLjFiYjEwZGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0yNiwxNiArMjYsMTMgQEAKIHN0YXRpYyBpbnQgaXBfbG9jYWxfcG9ydF9yYW5nZV9taW5bXSA9IHsgMSwgMSB9Owogc3RhdGljIGludCBpcF9sb2NhbF9wb3J0X3JhbmdlX21heFtdID0geyA2NTUzNSwgNjU1MzUgfTsKIAotZXh0ZXJuIHNlcWxvY2tfdCBzeXNjdGxfcG9ydF9yYW5nZV9sb2NrOwotZXh0ZXJuIGludCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsyXTsKLQogLyogVXBkYXRlIHN5c3RlbSB2aXNpYmxlIElQIHBvcnQgcmFuZ2UgKi8KIHN0YXRpYyB2b2lkIHNldF9sb2NhbF9wb3J0X3JhbmdlKGludCByYW5nZVsyXSkKIHsKLQl3cml0ZV9zZXFsb2NrKCZzeXNjdGxfcG9ydF9yYW5nZV9sb2NrKTsKLQlzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSA9IHJhbmdlWzBdOwotCXN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzFdID0gcmFuZ2VbMV07Ci0Jd3JpdGVfc2VxdW5sb2NrKCZzeXNjdGxfcG9ydF9yYW5nZV9sb2NrKTsKKwl3cml0ZV9zZXFsb2NrKCZzeXNjdGxfbG9jYWxfcG9ydHMubG9jayk7CisJc3lzY3RsX2xvY2FsX3BvcnRzLnJhbmdlWzBdID0gcmFuZ2VbMF07CisJc3lzY3RsX2xvY2FsX3BvcnRzLnJhbmdlWzFdID0gcmFuZ2VbMV07CisJd3JpdGVfc2VxdW5sb2NrKCZzeXNjdGxfbG9jYWxfcG9ydHMubG9jayk7CiB9CiAKIC8qIFZhbGlkYXRlIGNoYW5nZXMgZnJvbSAvcHJvYyBpbnRlcmZhY2UuICovCkBAIC00NCw4ICs0MSw3IEBACiAJCQkJIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewogCWludCByZXQ7Ci0JaW50IHJhbmdlWzJdID0geyBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSwKLQkJCSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSB9OworCWludCByYW5nZVsyXTsKIAljdGxfdGFibGUgdG1wID0gewogCQkuZGF0YSA9ICZyYW5nZSwKIAkJLm1heGxlbiA9IHNpemVvZihyYW5nZSksCkBAIC01NCw2ICs1MCw3IEBACiAJCS5leHRyYTIgPSAmaXBfbG9jYWxfcG9ydF9yYW5nZV9tYXgsCiAJfTsKIAorCWluZXRfZ2V0X2xvY2FsX3BvcnRfcmFuZ2UocmFuZ2UsIHJhbmdlICsgMSk7CiAJcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgoJnRtcCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAKIAlpZiAod3JpdGUgJiYgcmV0ID09IDApIHsKQEAgLTY3LDE0ICs2NCwxMyBAQAogfQogCiAvKiBWYWxpZGF0ZSBjaGFuZ2VzIGZyb20gc3lzY3RsIGludGVyZmFjZS4gKi8KLXN0YXRpYyBpbnQgaXB2NF9zeXNjdGxfbG9jYWxfcG9ydF9yYW5nZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLAotCQkJCQkgaW50IG5sZW4sIHZvaWQgX191c2VyICpvbGR2YWwsCitzdGF0aWMgaW50IGlwdjRfc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2UoY3RsX3RhYmxlICp0YWJsZSwKKwkJCQkJIHZvaWQgX191c2VyICpvbGR2YWwsCiAJCQkJCSBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCByZXQ7Ci0JaW50IHJhbmdlWzJdID0geyBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSwKLQkJCSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSB9OworCWludCByYW5nZVsyXTsKIAljdGxfdGFibGUgdG1wID0gewogCQkuZGF0YSA9ICZyYW5nZSwKIAkJLm1heGxlbiA9IHNpemVvZihyYW5nZSksCkBAIC04Myw3ICs3OSw4IEBACiAJCS5leHRyYTIgPSAmaXBfbG9jYWxfcG9ydF9yYW5nZV9tYXgsCiAJfTsKIAotCXJldCA9IHN5c2N0bF9pbnR2ZWMoJnRtcCwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CisJaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShyYW5nZSwgcmFuZ2UgKyAxKTsKKwlyZXQgPSBzeXNjdGxfaW50dmVjKCZ0bXAsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCWlmIChyZXQgPT0gMCAmJiBuZXd2YWwgJiYgbmV3bGVuKSB7CiAJCWlmIChyYW5nZVsxXSA8IHJhbmdlWzBdKQogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTExMiw4ICsxMDksOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc3lzY3RsX3RjcF9jb25nZXN0aW9uX2NvbnRyb2woY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwKLQkJCQkJIGludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLAorc3RhdGljIGludCBzeXNjdGxfdGNwX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKnRhYmxlLAorCQkJCQkgdm9pZCBfX3VzZXIgKm9sZHZhbCwKIAkJCQkJIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJCSB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewpAQCAtMTI1LDcgKzEyMiw3IEBACiAJaW50IHJldDsKIAogCXRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKLQlyZXQgPSBzeXNjdGxfc3RyaW5nKCZ0YmwsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOworCXJldCA9IHN5c2N0bF9zdHJpbmcoJnRibCwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHJldCA9PSAxICYmIG5ld3ZhbCAmJiBuZXdsZW4pCiAJCXJldCA9IHRjcF9zZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTY4LDggKzE2NSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzdHJhdGVneV9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLAotCQkJCQkgICAgICAgaW50IG5sZW4sIHZvaWQgX191c2VyICpvbGR2YWwsCitzdGF0aWMgaW50IHN0cmF0ZWd5X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqdGFibGUsCisJCQkJCSAgICAgICB2b2lkIF9fdXNlciAqb2xkdmFsLAogCQkJCQkgICAgICAgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCQkJICAgICAgIHZvaWQgX191c2VyICpuZXd2YWwsCiAJCQkJCSAgICAgICBzaXplX3QgbmV3bGVuKQpAQCAtMTgyLDcgKzE3OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdGNwX2dldF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sKHRibC5kYXRhLCB0YmwubWF4bGVuKTsKLQlyZXQgPSBzeXNjdGxfc3RyaW5nKCZ0YmwsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOworCXJldCA9IHN5c2N0bF9zdHJpbmcoJnRibCwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHJldCA9PSAxICYmIG5ld3ZhbCAmJiBuZXdsZW4pCiAJCXJldCA9IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEpOwogCWtmcmVlKHRibC5kYXRhKTsKQEAgLTM5Niw4ICszOTMsOCBAQAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTE9DQUxfUE9SVF9SQU5HRSwKIAkJLnByb2NuYW1lCT0gImlwX2xvY2FsX3BvcnRfcmFuZ2UiLAotCQkuZGF0YQkJPSAmc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlKSwKKwkJLmRhdGEJCT0gJnN5c2N0bF9sb2NhbF9wb3J0cy5yYW5nZSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2xvY2FsX3BvcnRzLnJhbmdlKSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZpcHY0X2xvY2FsX3BvcnRfcmFuZ2UsCiAJCS5zdHJhdGVneQk9ICZpcHY0X3N5c2N0bF9sb2NhbF9wb3J0X3JhbmdlLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAxYWIzNDFlLi5lY2NiNzE2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMzg0LDEzICszODQsMTcgQEAKIAogCS8qIENvbm5lY3RlZD8gKi8KIAlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIH4oVENQRl9TWU5fU0VOVCB8IFRDUEZfU1lOX1JFQ1YpKSB7CisJCWludCB0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCAwLCBJTlRfTUFYKTsKKworCQlpZiAodHAtPnVyZ19zZXEgPT0gdHAtPmNvcGllZF9zZXEgJiYKKwkJICAgICFzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKSAmJgorCQkgICAgdHAtPnVyZ19kYXRhKQorCQkJdGFyZ2V0LS07CisKIAkJLyogUG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLiBJZiByZWFkIG9mIHRwIGJlbG93IHdpbGwKIAkJICogZXNjYXBlIGFib3ZlIHNrLT5za19zdGF0ZSwgd2UgY2FuIGJlIGlsbGVnYWxseSBhd2FrZW4KIAkJICogaW4gU1lOXyogc3RhdGVzLiAqLwotCQlpZiAoKHRwLT5yY3Zfbnh0ICE9IHRwLT5jb3BpZWRfc2VxKSAmJgotCQkgICAgKHRwLT51cmdfc2VxICE9IHRwLT5jb3BpZWRfc2VxIHx8Ci0JCSAgICAgdHAtPnJjdl9ueHQgIT0gdHAtPmNvcGllZF9zZXEgKyAxIHx8Ci0JCSAgICAgc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkgfHwgIXRwLT51cmdfZGF0YSkpCisJCWlmICh0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxID49IHRhcmdldCkKIAkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCQlpZiAoIShzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSkgewpAQCAtNDkzLDEwICs0OTcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9tYXJrX3VyZyhzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZ3MsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoZmxhZ3MgJiBNU0dfT09CKSB7Ci0JCXRwLT51cmdfbW9kZSA9IDE7CisJaWYgKGZsYWdzICYgTVNHX09PQikKIAkJdHAtPnNuZF91cCA9IHRwLT53cml0ZV9zZXE7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3B1c2goc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MsIGludCBtc3Nfbm93LApAQCAtMTE1Nyw3ICsxMTU5LDcgQEAKIAkgKiBuZWNlc3NhcnkgKi8KIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0cC0+dWNvcHkucHJlcXVldWUpKSAhPSBOVUxMKQotCQlzay0+c2tfYmFja2xvZ19yY3Yoc2ssIHNrYik7CisJCXNrX2JhY2tsb2dfcmN2KHNrLCBza2IpOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCiAJLyogQ2xlYXIgbWVtb3J5IGNvdW50ZXIuICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaHlibGEuYyBiL25ldC9pcHY0L3RjcF9oeWJsYS5jCmluZGV4IGJmY2JkMTQuLmMyMDllMDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9oeWJsYS5jCisrKyBiL25ldC9pcHY0L3RjcF9oeWJsYS5jCkBAIC0xNTAsNyArMTUwLDExIEBACiAJCWNhLT5zbmRfY3duZF9jZW50cyAtPSAxMjg7CiAJCXRwLT5zbmRfY3duZF9jbnQgPSAwOwogCX0KLQorCS8qIGNoZWNrIHdoZW4gY3duZCBoYXMgbm90IGJlZW4gaW5jcmVtZW50ZWQgZm9yIGEgd2hpbGUgKi8KKwlpZiAoaW5jcmVtZW50ID09IDAgJiYgb2RkID09IDAgJiYgdHAtPnNuZF9jd25kX2NudCA+PSB0cC0+c25kX2N3bmQpIHsKKwkJdHAtPnNuZF9jd25kKys7CisJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCX0KIAkvKiBjbGFtcCBkb3duIHNsb3dzdGFydCBjd25kIHRvIHNzdGhyZXNoIHZhbHVlLiAqLwogCWlmIChpc19zbG93c3RhcnQpCiAJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsIHRwLT5zbmRfc3N0aHJlc2gpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCA2N2NjY2UyLi5kNzdjMGQyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtOTc5LDYgKzk3OSwzOSBAQAogCX0KIH0KIAorLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9zdF9vdXQgaXMgaW5jcmVtZW50ZWQgKi8KK3N0YXRpYyB2b2lkIHRjcF92ZXJpZnlfcmV0cmFuc21pdF9oaW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKCh0cC0+cmV0cmFuc21pdF9za2JfaGludCA9PSBOVUxMKSB8fAorCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsCisJCSAgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKQorCQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IHNrYjsKKworCWlmICghdHAtPmxvc3Rfb3V0IHx8CisJICAgIGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnJldHJhbnNtaXRfaGlnaCkpCisJCXRwLT5yZXRyYW5zbWl0X2hpZ2ggPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9za2JfbWFya19sb3N0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiAoVENQQ0JfTE9TVHxUQ1BDQl9TQUNLRURfQUNLRUQpKSkgeworCQl0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludCh0cCwgc2tiKTsKKworCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKKwl9Cit9CisKK3ZvaWQgdGNwX3NrYl9tYXJrX2xvc3RfdW5jb25kX3ZlcmlmeShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXRjcF92ZXJpZnlfcmV0cmFuc21pdF9oaW50KHRwLCBza2IpOworCisJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiAoVENQQ0JfTE9TVHxUQ1BDQl9TQUNLRURfQUNLRUQpKSkgeworCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKKwl9Cit9CisKIC8qIFRoaXMgcHJvY2VkdXJlIHRhZ3MgdGhlIHJldHJhbnNtaXNzaW9uIHF1ZXVlIHdoZW4gU0FDS3MgYXJyaXZlLgogICoKICAqIFdlIGhhdmUgdGhyZWUgdGFnIGJpdHM6IFNBQ0tFRChTKSwgUkVUUkFOUyhSKSBhbmQgTE9TVChMKS4KQEAgLTExNTUsMTMgKzExODgsNyBAQAogCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1NBQ0tFRF9SRVRSQU5TOwogCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAKLQkJCS8qIGNsZWFyIGxvc3QgaGludCAqLwotCQkJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBOVUxMOwotCi0JCQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIChUQ1BDQl9MT1NUfFRDUENCX1NBQ0tFRF9BQ0tFRCkpKSB7Ci0JCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKLQkJCX0KKwkJCXRjcF9za2JfbWFya19sb3N0X3VuY29uZF92ZXJpZnkodHAsIHNrYik7CiAJCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUExPU1RSRVRSQU5TTUlUKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChiZWZvcmUoYWNrX3NlcSwgbmV3X2xvd19zZXEpKQpAQCAtMTI3MSw5ICsxMjk4LDYgQEAKIAkJCQkJfihUQ1BDQl9MT1NUfFRDUENCX1NBQ0tFRF9SRVRSQU5TKTsKIAkJCQl0cC0+bG9zdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKIAkJCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQotCQkJCS8qIGNsZWFyIGxvc3QgaGludCAqLwotCQkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gTlVMTDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmICghKHNhY2tlZCAmIFRDUENCX1JFVFJBTlMpKSB7CkBAIC0xMjkyLDkgKzEzMTYsNiBAQAogCQkJaWYgKHNhY2tlZCAmIFRDUENCX0xPU1QpIHsKIAkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfTE9TVDsKIAkJCQl0cC0+bG9zdF9vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQotCQkJCS8qIGNsZWFyIGxvc3QgaGludCAqLwotCQkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gTlVMTDsKIAkJCX0KIAkJfQogCkBAIC0xMzI0LDcgKzEzNDUsNiBAQAogCWlmIChkdXBfc2FjayAmJiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfUkVUUkFOUykpIHsKIAkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1NBQ0tFRF9SRVRSQU5TOwogCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQkJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBOVUxMOwogCX0KIAogCXJldHVybiBmbGFnOwpAQCAtMTcyNiw2ICsxNzQ2LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlza2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7CisJaWYgKHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSkKKwkJcmV0dXJuIDE7CiAJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYik7CS8qIFNraXBzIGhlYWQgKi8KIAl0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykgewogCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQpAQCAtMTg2Nyw2ICsxODg5LDcgQEAKIAkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpKSB7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwogCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQl0cC0+cmV0cmFuc21pdF9oaWdoID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCQl9CiAJfQogCXRjcF92ZXJpZnlfbGVmdF9vdXQodHApOwpAQCAtMTg4Myw3ICsxOTA2LDcgQEAKIAl0cC0+aGlnaF9zZXEgPSB0cC0+c25kX254dDsKIAlUQ1BfRUNOX3F1ZXVlX2N3cih0cCk7CiAKLQl0Y3BfY2xlYXJfcmV0cmFuc19oaW50c19wYXJ0aWFsKHRwKTsKKwl0Y3BfY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogfQogCiBzdGF0aWMgdm9pZCB0Y3BfY2xlYXJfcmV0cmFuc19wYXJ0aWFsKHN0cnVjdCB0Y3Bfc29jayAqdHApCkBAIC0xOTM0LDEyICsxOTU3LDExIEBACiAJCS8qIFB1c2ggdW5kbyBtYXJrZXIsIGlmIGl0IHdhcyBwbGFpbiBSVE8gYW5kIG5vdGhpbmcKIAkJICogd2FzIHJldHJhbnNtaXR0ZWQuICovCiAJCXRwLT51bmRvX21hcmtlciA9IHRwLT5zbmRfdW5hOwotCQl0Y3BfY2xlYXJfcmV0cmFuc19oaW50c19wYXJ0aWFsKHRwKTsKIAl9IGVsc2UgewogCQl0cC0+c2Fja2VkX291dCA9IDA7CiAJCXRwLT5mYWNrZXRzX291dCA9IDA7Ci0JCXRjcF9jbGVhcl9hbGxfcmV0cmFuc19oaW50cyh0cCk7CiAJfQorCXRjcF9jbGVhcl9hbGxfcmV0cmFuc19oaW50cyh0cCk7CiAKIAl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKIAkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKQEAgLTE5NTIsNiArMTk3NCw3IEBACiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX0FDS0VEOwogCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKIAkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCQkJdHAtPnJldHJhbnNtaXRfaGlnaCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAkJfQogCX0KIAl0Y3BfdmVyaWZ5X2xlZnRfb3V0KHRwKTsKQEAgLTIxNTcsMTkgKzIxODAsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBSRkM6IFRoaXMgaXMgZnJvbSB0aGUgb3JpZ2luYWwsIEkgZG91YnQgdGhhdCB0aGlzIGlzIG5lY2Vzc2FyeSBhdCBhbGw6Ci0gKiBjbGVhciB4bWl0X3JldHJhbnMgaGludCBpZiBzZXEgb2YgdGhpcyBza2IgaXMgYmV5b25kIGhpbnQuIEhvdyBjb3VsZCB3ZQotICogcmV0cmFuc21pdHRlZCBwYXN0IExPU1QgbWFya2luZ3MgaW4gdGhlIGZpcnN0IHBsYWNlPyBJJ20gbm90IGZ1bGx5IHN1cmUKLSAqIGFib3V0IHVuZG8gYW5kIGVuZCBvZiBjb25uZWN0aW9uIGNhc2VzLCB3aGljaCBjYW4gY2F1c2UgUiB3aXRob3V0IEw/Ci0gKi8KLXN0YXRpYyB2b2lkIHRjcF92ZXJpZnlfcmV0cmFuc21pdF9oaW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKCh0cC0+cmV0cmFuc21pdF9za2JfaGludCAhPSBOVUxMKSAmJgotCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsCi0JCSAgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKQotCQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IE5VTEw7Ci19Ci0KIC8qIE1hcmsgaGVhZCBvZiBxdWV1ZSB1cCBhcyBsb3N0LiBXaXRoIFJGQzM1MTcgU0FDSywgdGhlIHBhY2tldHMgaXMKICAqIGlzIGFnYWluc3Qgc2Fja2VkICJjbnQiLCBvdGhlcndpc2UgaXQncyBhZ2FpbnN0IGZhY2tlZCAiY250IgogICovCkBAIC0yMjE3LDExICsyMjI3LDcgQEAKIAkJCWNudCA9IHBhY2tldHM7CiAJCX0KIAotCQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIChUQ1BDQl9TQUNLRURfQUNLRUR8VENQQ0JfTE9TVCkpKSB7Ci0JCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwotCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCQl0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludCh0cCwgc2tiKTsKLQkJfQorCQl0Y3Bfc2tiX21hcmtfbG9zdCh0cCwgc2tiKTsKIAl9CiAJdGNwX3ZlcmlmeV9sZWZ0X291dCh0cCk7CiB9CkBAIC0yMjYzLDExICsyMjY5LDcgQEAKIAkJCWlmICghdGNwX3NrYl90aW1lZG91dChzaywgc2tiKSkKIAkJCQlicmVhazsKIAotCQkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiAoVENQQ0JfU0FDS0VEX0FDS0VEfFRDUENCX0xPU1QpKSkgewotCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7Ci0JCQkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7Ci0JCQkJdGNwX3ZlcmlmeV9yZXRyYW5zbWl0X2hpbnQodHAsIHNrYik7Ci0JCQl9CisJCQl0Y3Bfc2tiX21hcmtfbG9zdCh0cCwgc2tiKTsKIAkJfQogCiAJCXRwLT5zY29yZWJvYXJkX3NrYl9oaW50ID0gc2tiOwpAQCAtMjM3OCwxMCArMjM4MCw2IEBACiAJfQogCXRjcF9tb2RlcmF0ZV9jd25kKHRwKTsKIAl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKLQotCS8qIFRoZXJlIGlzIHNvbWV0aGluZyBzY3Jld3kgZ29pbmcgb24gd2l0aCB0aGUgcmV0cmFucyBoaW50cyBhZnRlcgotCSAgIGFuIHVuZG8gKi8KLQl0Y3BfY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB0Y3BfbWF5X3VuZG8oc3RydWN0IHRjcF9zb2NrICp0cCkKQEAgLTI4MzgsNyArMjgzNiw4IEBACiAgKiBpcyBiZWZvcmUgdGhlIGFjayBzZXF1ZW5jZSB3ZSBjYW4gZGlzY2FyZCBpdCBhcyBpdCdzIGNvbmZpcm1lZCB0byBoYXZlCiAgKiBhcnJpdmVkIGF0IHRoZSBvdGhlciBlbmQuCiAgKi8KLXN0YXRpYyBpbnQgdGNwX2NsZWFuX3J0eF9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIGludCBwcmlvcl9mYWNrZXRzKQorc3RhdGljIGludCB0Y3BfY2xlYW5fcnR4X3F1ZXVlKHN0cnVjdCBzb2NrICpzaywgaW50IHByaW9yX2ZhY2tldHMsCisJCQkgICAgICAgdTMyIHByaW9yX3NuZF91bmEpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwpAQCAtMjg0OCw2ICsyODQ3LDcgQEAKIAlpbnQgZmxhZyA9IDA7CiAJdTMyIHBrdHNfYWNrZWQgPSAwOwogCXUzMiByZW9yZCA9IHRwLT5wYWNrZXRzX291dDsKKwl1MzIgcHJpb3Jfc2Fja2VkID0gdHAtPnNhY2tlZF9vdXQ7CiAJczMyIHNlcV9ydHQgPSAtMTsKIAlzMzIgY2Ffc2VxX3J0dCA9IC0xOwogCWt0aW1lX3QgbGFzdF9hY2t0ID0gbmV0X2ludmFsaWRfdGltZXN0YW1wKCk7CkBAIC0yOTA0LDkgKzI5MDQsNiBAQAogCQlpZiAoc2Fja2VkICYgVENQQ0JfTE9TVCkKIAkJCXRwLT5sb3N0X291dCAtPSBhY2tlZF9wY291bnQ7CiAKLQkJaWYgKHVubGlrZWx5KHRwLT51cmdfbW9kZSAmJiAhYmVmb3JlKGVuZF9zZXEsIHRwLT5zbmRfdXApKSkKLQkJCXRwLT51cmdfbW9kZSA9IDA7Ci0KIAkJdHAtPnBhY2tldHNfb3V0IC09IGFja2VkX3Bjb3VudDsKIAkJcGt0c19hY2tlZCArPSBhY2tlZF9wY291bnQ7CiAKQEAgLTI5MjksOSArMjkyNiwxNiBAQAogCiAJCXRjcF91bmxpbmtfd3JpdGVfcXVldWUoc2tiLCBzayk7CiAJCXNrX3dtZW1fZnJlZV9za2Ioc2ssIHNrYik7Ci0JCXRjcF9jbGVhcl9hbGxfcmV0cmFuc19oaW50cyh0cCk7CisJCXRwLT5zY29yZWJvYXJkX3NrYl9oaW50ID0gTlVMTDsKKwkJaWYgKHNrYiA9PSB0cC0+cmV0cmFuc21pdF9za2JfaGludCkKKwkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gTlVMTDsKKwkJaWYgKHNrYiA9PSB0cC0+bG9zdF9za2JfaGludCkKKwkJCXRwLT5sb3N0X3NrYl9oaW50ID0gTlVMTDsKIAl9CiAKKwlpZiAobGlrZWx5KGJldHdlZW4odHAtPnNuZF91cCwgcHJpb3Jfc25kX3VuYSwgdHAtPnNuZF91bmEpKSkKKwkJdHAtPnNuZF91cCA9IHRwLT5zbmRfdW5hOworCiAJaWYgKHNrYiAmJiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpKQogCQlmbGFnIHw9IEZMQUdfU0FDS19SRU5FR0lORzsKIApAQCAtMjk0OCw2ICsyOTUyLDE1IEBACiAJCQkvKiBOb24tcmV0cmFuc21pdHRlZCBob2xlIGdvdCBmaWxsZWQ/IFRoYXQncyByZW9yZGVyaW5nICovCiAJCQlpZiAocmVvcmQgPCBwcmlvcl9mYWNrZXRzKQogCQkJCXRjcF91cGRhdGVfcmVvcmRlcmluZyhzaywgdHAtPmZhY2tldHNfb3V0IC0gcmVvcmQsIDApOworCisJCQkvKiBObyBuZWVkIHRvIGNhcmUgZm9yIHVuZGVyZmxvd3MgaGVyZSBiZWNhdXNlCisJCQkgKiB0aGUgbG9zdF9za2JfaGludCBnZXRzIE5VTExlZCBpZiB3ZSdyZSBwYXN0IGl0CisJCQkgKiAob3Igc29tZXRoaW5nIG5vbi10cml2aWFsIGhhcHBlbmVkKQorCQkJICovCisJCQlpZiAodGNwX2lzX2ZhY2sodHApKQorCQkJCXRwLT5sb3N0X2NudF9oaW50IC09IHBrdHNfYWNrZWQ7CisJCQllbHNlCisJCQkJdHAtPmxvc3RfY250X2hpbnQgLT0gcHJpb3Jfc2Fja2VkIC0gdHAtPnNhY2tlZF9vdXQ7CiAJCX0KIAogCQl0cC0+ZmFja2V0c19vdXQgLT0gbWluKHBrdHNfYWNrZWQsIHRwLT5mYWNrZXRzX291dCk7CkBAIC0zMjk5LDcgKzMzMTIsNyBAQAogCQlnb3RvIG5vX3F1ZXVlOwogCiAJLyogU2VlIGlmIHdlIGNhbiB0YWtlIGFueXRoaW5nIG9mZiBvZiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KLQlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssIHByaW9yX2ZhY2tldHMpOworCWZsYWcgfD0gdGNwX2NsZWFuX3J0eF9xdWV1ZShzaywgcHJpb3JfZmFja2V0cywgcHJpb3Jfc25kX3VuYSk7CiAKIAlpZiAodHAtPmZydG9fY291bnRlcikKIAkJZnJ0b19jd25kID0gdGNwX3Byb2Nlc3NfZnJ0byhzaywgZmxhZyk7CkBAIC0zNDQyLDYgKzM0NTUsMjIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdGNwX3BhcnNlX2FsaWduZWRfdGltZXN0YW1wKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCB0Y3BoZHIgKnRoKQoreworCV9fYmUzMiAqcHRyID0gKF9fYmUzMiAqKSh0aCArIDEpOworCisJaWYgKCpwdHIgPT0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpCisJCQkgIHwgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCkpIHsKKwkJdHAtPnJ4X29wdC5zYXdfdHN0YW1wID0gMTsKKwkJKytwdHI7CisJCXRwLT5yeF9vcHQucmN2X3RzdmFsID0gbnRvaGwoKnB0cik7CisJCSsrcHRyOworCQl0cC0+cnhfb3B0LnJjdl90c2VjciA9IG50b2hsKCpwdHIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qIEZhc3QgcGFyc2Ugb3B0aW9ucy4gVGhpcyBob3BlcyB0byBvbmx5IHNlZSB0aW1lc3RhbXBzLgogICogSWYgaXQgaXMgd3JvbmcgaXQgZmFsbHMgYmFjayBvbiB0Y3BfcGFyc2Vfb3B0aW9ucygpLgogICovCkBAIC0zNDUzLDE2ICszNDgyLDggQEAKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmICh0cC0+cnhfb3B0LnRzdGFtcF9vayAmJgogCQkgICB0aC0+ZG9mZiA9PSAoc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpPj4yKSsoVENQT0xFTl9UU1RBTVBfQUxJR05FRD4+MikpIHsKLQkJX19iZTMyICpwdHIgPSAoX19iZTMyICopKHRoICsgMSk7Ci0JCWlmICgqcHRyID09IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8IChUQ1BPUFRfTk9QIDw8IDE2KQotCQkJCSAgfCAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKSkgewotCQkJdHAtPnJ4X29wdC5zYXdfdHN0YW1wID0gMTsKLQkJCSsrcHRyOwotCQkJdHAtPnJ4X29wdC5yY3ZfdHN2YWwgPSBudG9obCgqcHRyKTsKLQkJCSsrcHRyOwotCQkJdHAtPnJ4X29wdC5yY3ZfdHNlY3IgPSBudG9obCgqcHRyKTsKKwkJaWYgKHRjcF9wYXJzZV9hbGlnbmVkX3RpbWVzdGFtcCh0cCwgdGgpKQogCQkJcmV0dXJuIDE7Ci0JCX0KIAl9CiAJdGNwX3BhcnNlX29wdGlvbnMoc2tiLCAmdHAtPnJ4X29wdCwgMSk7CiAJcmV0dXJuIDE7CkBAIC00MTM4LDcgKzQxNTksNyBAQAogCQkJCXNrYjEgPSBza2IxLT5wcmV2OwogCQkJfQogCQl9Ci0JCV9fc2tiX2luc2VydChza2IsIHNrYjEsIHNrYjEtPm5leHQsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJX19za2JfcXVldWVfYWZ0ZXIoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEsIHNrYik7CiAKIAkJLyogQW5kIGNsZWFuIHNlZ21lbnRzIGNvdmVyZWQgYnkgbmV3IG9uZSBhcyB3aG9sZS4gKi8KIAkJd2hpbGUgKChza2IxID0gc2tiLT5uZXh0KSAhPQpAQCAtNDE2MSw2ICs0MTgyLDE4IEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRjcF9jb2xsYXBzZV9vbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiLT5uZXh0OworCisJX19za2JfdW5saW5rKHNrYiwgbGlzdCk7CisJX19rZnJlZV9za2Ioc2tiKTsKKwlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCk7CisKKwlyZXR1cm4gbmV4dDsKK30KKwogLyogQ29sbGFwc2UgY29udGlndW91cyBzZXF1ZW5jZSBvZiBza2JzIGhlYWQuLnRhaWwgd2l0aAogICogc2VxdWVuY2UgbnVtYmVycyBzdGFydC4uZW5kLgogICogU2VnbWVudHMgd2l0aCBGSU4vU1lOIGFyZSBub3QgY29sbGFwc2VkIChvbmx5IGJlY2F1c2UgdGhpcwpAQCAtNDE3OCwxMSArNDIxMSw3IEBACiAJZm9yIChza2IgPSBoZWFkOyBza2IgIT0gdGFpbDspIHsKIAkJLyogTm8gbmV3IGJpdHM/IEl0IGlzIHBvc3NpYmxlIG9uIG9mbyBxdWV1ZS4gKi8KIAkJaWYgKCFiZWZvcmUoc3RhcnQsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKLQkJCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiLT5uZXh0OwotCQkJX19za2JfdW5saW5rKHNrYiwgbGlzdCk7Ci0JCQlfX2tmcmVlX3NrYihza2IpOwotCQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BSQ1ZDT0xMQVBTRUQpOwotCQkJc2tiID0gbmV4dDsKKwkJCXNrYiA9IHRjcF9jb2xsYXBzZV9vbmUoc2ssIHNrYiwgbGlzdCk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC00MjI4LDcgKzQyNTcsNyBAQAogCQltZW1jcHkobnNrYi0+aGVhZCwgc2tiLT5oZWFkLCBoZWFkZXIpOwogCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CiAJCVRDUF9TS0JfQ0IobnNrYiktPnNlcSA9IFRDUF9TS0JfQ0IobnNrYiktPmVuZF9zZXEgPSBzdGFydDsKLQkJX19za2JfaW5zZXJ0KG5za2IsIHNrYi0+cHJldiwgc2tiLCBsaXN0KTsKKwkJX19za2JfcXVldWVfYmVmb3JlKGxpc3QsIHNrYiwgbnNrYik7CiAJCXNrYl9zZXRfb3duZXJfcihuc2tiLCBzayk7CiAKIAkJLyogQ29weSBkYXRhLCByZWxlYXNpbmcgY29sbGFwc2VkIHNrYnMuICovCkBAIC00MjQ2LDExICs0Mjc1LDcgQEAKIAkJCQlzdGFydCArPSBzaXplOwogCQkJfQogCQkJaWYgKCFiZWZvcmUoc3RhcnQsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYi0+bmV4dDsKLQkJCQlfX3NrYl91bmxpbmsoc2tiLCBsaXN0KTsKLQkJCQlfX2tmcmVlX3NrYihza2IpOwotCQkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQUkNWQ09MTEFQU0VEKTsKLQkJCQlza2IgPSBuZXh0OworCQkJCXNrYiA9IHRjcF9jb2xsYXBzZV9vbmUoc2ssIHNrYiwgbGlzdCk7CiAJCQkJaWYgKHNrYiA9PSB0YWlsIHx8CiAJCQkJICAgIHRjcF9oZHIoc2tiKS0+c3luIHx8CiAJCQkJICAgIHRjcF9oZHIoc2tiKS0+ZmluKQpAQCAtNDQzNiw4ICs0NDYxLDggQEAKIAogCWlmICh0Y3Bfc2hvdWxkX2V4cGFuZF9zbmRidWYoc2spKSB7CiAJCWludCBzbmRtZW0gPSBtYXhfdCh1MzIsIHRwLT5yeF9vcHQubXNzX2NsYW1wLCB0cC0+bXNzX2NhY2hlKSArCi0JCQlNQVhfVENQX0hFQURFUiArIDE2ICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSwKLQkJICAgIGRlbWFuZGVkID0gbWF4X3QodW5zaWduZWQgaW50LCB0cC0+c25kX2N3bmQsCisJCQlNQVhfVENQX0hFQURFUiArIDE2ICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKTsKKwkJaW50IGRlbWFuZGVkID0gbWF4X3QodW5zaWduZWQgaW50LCB0cC0+c25kX2N3bmQsCiAJCQkJICAgICB0cC0+cmVvcmRlcmluZyArIDEpOwogCQlzbmRtZW0gKj0gMiAqIGRlbWFuZGVkOwogCQlpZiAoc25kbWVtID4gc2stPnNrX3NuZGJ1ZikKQEAgLTQ2OTEsNiArNDcxNiw2NyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19ORVRfRE1BICovCiAKKy8qIERvZXMgUEFXUyBhbmQgc2Vxbm8gYmFzZWQgdmFsaWRhdGlvbiBvZiBhbiBpbmNvbWluZyBzZWdtZW50LCBmbGFncyB3aWxsCisgKiBwbGF5IHNpZ25pZmljYW50IHJvbGUgaGVyZS4KKyAqLworc3RhdGljIGludCB0Y3BfdmFsaWRhdGVfaW5jb21pbmcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IHRjcGhkciAqdGgsIGludCBzeW5faW5lcnIpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkvKiBSRkMxMzIzOiBIMS4gQXBwbHkgUEFXUyBjaGVjayBmaXJzdC4gKi8KKwlpZiAodGNwX2Zhc3RfcGFyc2Vfb3B0aW9ucyhza2IsIHRoLCB0cCkgJiYgdHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmCisJICAgIHRjcF9wYXdzX2Rpc2NhcmQoc2ssIHNrYikpIHsKKwkJaWYgKCF0aC0+cnN0KSB7CisJCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVEKTsKKwkJCXRjcF9zZW5kX2R1cGFjayhzaywgc2tiKTsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCQkvKiBSZXNldCBpcyBhY2NlcHRlZCBldmVuIGlmIGl0IGRpZCBub3QgcGFzcyBQQVdTLiAqLworCX0KKworCS8qIFN0ZXAgMTogY2hlY2sgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKCF0Y3Bfc2VxdWVuY2UodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7CisJCS8qIFJGQzc5MywgcGFnZSAzNzogIkluIGFsbCBzdGF0ZXMgZXhjZXB0IFNZTi1TRU5ULCBhbGwgcmVzZXQKKwkJICogKFJTVCkgc2VnbWVudHMgYXJlIHZhbGlkYXRlZCBieSBjaGVja2luZyB0aGVpciBTRVEtZmllbGRzLiIKKwkJICogQW5kIHBhZ2UgNjk6ICJJZiBhbiBpbmNvbWluZyBzZWdtZW50IGlzIG5vdCBhY2NlcHRhYmxlLAorCQkgKiBhbiBhY2tub3dsZWRnbWVudCBzaG91bGQgYmUgc2VudCBpbiByZXBseSAodW5sZXNzIHRoZSBSU1QKKwkJICogYml0IGlzIHNldCwgaWYgc28gZHJvcCB0aGUgc2VnbWVudCBhbmQgcmV0dXJuKSIuCisJCSAqLworCQlpZiAoIXRoLT5yc3QpCisJCQl0Y3Bfc2VuZF9kdXBhY2soc2ssIHNrYik7CisJCWdvdG8gZGlzY2FyZDsKKwl9CisKKwkvKiBTdGVwIDI6IGNoZWNrIFJTVCBiaXQgKi8KKwlpZiAodGgtPnJzdCkgeworCQl0Y3BfcmVzZXQoc2spOworCQlnb3RvIGRpc2NhcmQ7CisJfQorCisJLyogdHNfcmVjZW50IHVwZGF0ZSBtdXN0IGJlIG1hZGUgYWZ0ZXIgd2UgYXJlIHN1cmUgdGhhdCB0aGUgcGFja2V0CisJICogaXMgaW4gd2luZG93LgorCSAqLworCXRjcF9yZXBsYWNlX3RzX3JlY2VudCh0cCwgVENQX1NLQl9DQihza2IpLT5zZXEpOworCisJLyogc3RlcCAzOiBjaGVjayBzZWN1cml0eSBhbmQgcHJlY2VkZW5jZSBbaWdub3JlZF0gKi8KKworCS8qIHN0ZXAgNDogQ2hlY2sgZm9yIGEgU1lOIGluIHdpbmRvdy4gKi8KKwlpZiAodGgtPnN5biAmJiAhYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmN2X254dCkpIHsKKwkJaWYgKHN5bl9pbmVycikKKwkJCVRDUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBUQ1BfTUlCX0lORVJSUyk7CisJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQQUJPUlRPTlNZTik7CisJCXRjcF9yZXNldChzayk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMTsKKworZGlzY2FyZDoKKwlfX2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCiAvKgogICoJVENQIHJlY2VpdmUgZnVuY3Rpb24gZm9yIHRoZSBFU1RBQkxJU0hFRCBzdGF0ZS4KICAqCkBAIC00NzE4LDYgKzQ4MDQsNyBAQAogCQkJc3RydWN0IHRjcGhkciAqdGgsIHVuc2lnbmVkIGxlbikKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlpbnQgcmVzOwogCiAJLyoKIAkgKglIZWFkZXIgcHJlZGljdGlvbi4KQEAgLTQ3NTYsMTkgKzQ4NDMsMTAgQEAKIAogCQkvKiBDaGVjayB0aW1lc3RhbXAgKi8KIAkJaWYgKHRjcF9oZWFkZXJfbGVuID09IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fVFNUQU1QX0FMSUdORUQpIHsKLQkJCV9fYmUzMiAqcHRyID0gKF9fYmUzMiAqKSh0aCArIDEpOwotCiAJCQkvKiBObz8gU2xvdyBwYXRoISAqLwotCQkJaWYgKCpwdHIgIT0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpCi0JCQkJCSAgfCAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8IFRDUE9MRU5fVElNRVNUQU1QKSkKKwkJCWlmICghdGNwX3BhcnNlX2FsaWduZWRfdGltZXN0YW1wKHRwLCB0aCkpCiAJCQkJZ290byBzbG93X3BhdGg7CiAKLQkJCXRwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDE7Ci0JCQkrK3B0cjsKLQkJCXRwLT5yeF9vcHQucmN2X3RzdmFsID0gbnRvaGwoKnB0cik7Ci0JCQkrK3B0cjsKLQkJCXRwLT5yeF9vcHQucmN2X3RzZWNyID0gbnRvaGwoKnB0cik7Ci0KIAkJCS8qIElmIFBBV1MgZmFpbGVkLCBjaGVjayBpdCBtb3JlIGNhcmVmdWxseSBpbiBzbG93IHBhdGggKi8KIAkJCWlmICgoczMyKSh0cC0+cnhfb3B0LnJjdl90c3ZhbCAtIHRwLT5yeF9vcHQudHNfcmVjZW50KSA8IDApCiAJCQkJZ290byBzbG93X3BhdGg7CkBAIC00ODc5LDcgKzQ5NTcsOCBAQAogCQkJCQlnb3RvIG5vX2FjazsKIAkJCX0KIAotCQkJX190Y3BfYWNrX3NuZF9jaGVjayhzaywgMCk7CisJCQlpZiAoIWNvcGllZF9lYXJseSB8fCB0cC0+cmN2X254dCAhPSB0cC0+cmN2X3d1cCkKKwkJCQlfX3RjcF9hY2tfc25kX2NoZWNrKHNrLCAwKTsKIG5vX2FjazoKICNpZmRlZiBDT05GSUdfTkVUX0RNQQogCQkJaWYgKGNvcGllZF9lYXJseSkKQEAgLTQ4OTksNTEgKzQ5NzgsMTIgQEAKIAkJZ290byBjc3VtX2Vycm9yOwogCiAJLyoKLQkgKiBSRkMxMzIzOiBIMS4gQXBwbHkgUEFXUyBjaGVjayBmaXJzdC4KLQkgKi8KLQlpZiAodGNwX2Zhc3RfcGFyc2Vfb3B0aW9ucyhza2IsIHRoLCB0cCkgJiYgdHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmCi0JICAgIHRjcF9wYXdzX2Rpc2NhcmQoc2ssIHNrYikpIHsKLQkJaWYgKCF0aC0+cnN0KSB7Ci0JCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVEKTsKLQkJCXRjcF9zZW5kX2R1cGFjayhzaywgc2tiKTsKLQkJCWdvdG8gZGlzY2FyZDsKLQkJfQotCQkvKiBSZXNldHMgYXJlIGFjY2VwdGVkIGV2ZW4gaWYgUEFXUyBmYWlsZWQuCi0KLQkJICAgdHNfcmVjZW50IHVwZGF0ZSBtdXN0IGJlIG1hZGUgYWZ0ZXIgd2UgYXJlIHN1cmUKLQkJICAgdGhhdCB0aGUgcGFja2V0IGlzIGluIHdpbmRvdy4KLQkJICovCi0JfQotCi0JLyoKIAkgKglTdGFuZGFyZCBzbG93IHBhdGguCiAJICovCiAKLQlpZiAoIXRjcF9zZXF1ZW5jZSh0cCwgVENQX1NLQl9DQihza2IpLT5zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKLQkJLyogUkZDNzkzLCBwYWdlIDM3OiAiSW4gYWxsIHN0YXRlcyBleGNlcHQgU1lOLVNFTlQsIGFsbCByZXNldAotCQkgKiAoUlNUKSBzZWdtZW50cyBhcmUgdmFsaWRhdGVkIGJ5IGNoZWNraW5nIHRoZWlyIFNFUS1maWVsZHMuIgotCQkgKiBBbmQgcGFnZSA2OTogIklmIGFuIGluY29taW5nIHNlZ21lbnQgaXMgbm90IGFjY2VwdGFibGUsCi0JCSAqIGFuIGFja25vd2xlZGdtZW50IHNob3VsZCBiZSBzZW50IGluIHJlcGx5ICh1bmxlc3MgdGhlIFJTVCBiaXQKLQkJICogaXMgc2V0LCBpZiBzbyBkcm9wIHRoZSBzZWdtZW50IGFuZCByZXR1cm4pIi4KLQkJICovCi0JCWlmICghdGgtPnJzdCkKLQkJCXRjcF9zZW5kX2R1cGFjayhzaywgc2tiKTsKLQkJZ290byBkaXNjYXJkOwotCX0KLQotCWlmICh0aC0+cnN0KSB7Ci0JCXRjcF9yZXNldChzayk7Ci0JCWdvdG8gZGlzY2FyZDsKLQl9Ci0KLQl0Y3BfcmVwbGFjZV90c19yZWNlbnQodHAsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxKTsKLQotCWlmICh0aC0+c3luICYmICFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5yY3Zfbnh0KSkgewotCQlUQ1BfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgVENQX01JQl9JTkVSUlMpOwotCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUEFCT1JUT05TWU4pOwotCQl0Y3BfcmVzZXQoc2spOwotCQlyZXR1cm4gMTsKLQl9CisJcmVzID0gdGNwX3ZhbGlkYXRlX2luY29taW5nKHNrLCBza2IsIHRoLCAxKTsKKwlpZiAocmVzIDw9IDApCisJCXJldHVybiAtcmVzOwogCiBzdGVwNToKIAlpZiAodGgtPmFjaykKQEAgLTUyMjUsNiArNTI2NSw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCWludCBxdWV1ZWQgPSAwOworCWludCByZXM7CiAKIAl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOwogCkBAIC01Mjc3LDQyICs1MzE4LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHRjcF9mYXN0X3BhcnNlX29wdGlvbnMoc2tiLCB0aCwgdHApICYmIHRwLT5yeF9vcHQuc2F3X3RzdGFtcCAmJgotCSAgICB0Y3BfcGF3c19kaXNjYXJkKHNrLCBza2IpKSB7Ci0JCWlmICghdGgtPnJzdCkgewotCQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9QQVdTRVNUQUJSRUpFQ1RFRCk7Ci0JCQl0Y3Bfc2VuZF9kdXBhY2soc2ssIHNrYik7Ci0JCQlnb3RvIGRpc2NhcmQ7Ci0JCX0KLQkJLyogUmVzZXQgaXMgYWNjZXB0ZWQgZXZlbiBpZiBpdCBkaWQgbm90IHBhc3MgUEFXUy4gKi8KLQl9Ci0KLQkvKiBzdGVwIDE6IGNoZWNrIHNlcXVlbmNlIG51bWJlciAqLwotCWlmICghdGNwX3NlcXVlbmNlKHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKSkgewotCQlpZiAoIXRoLT5yc3QpCi0JCQl0Y3Bfc2VuZF9kdXBhY2soc2ssIHNrYik7Ci0JCWdvdG8gZGlzY2FyZDsKLQl9Ci0KLQkvKiBzdGVwIDI6IGNoZWNrIFJTVCBiaXQgKi8KLQlpZiAodGgtPnJzdCkgewotCQl0Y3BfcmVzZXQoc2spOwotCQlnb3RvIGRpc2NhcmQ7Ci0JfQotCi0JdGNwX3JlcGxhY2VfdHNfcmVjZW50KHRwLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7Ci0KLQkvKiBzdGVwIDM6IGNoZWNrIHNlY3VyaXR5IGFuZCBwcmVjZWRlbmNlIFtpZ25vcmVkXSAqLwotCi0JLyoJc3RlcCA0OgotCSAqCi0JICoJQ2hlY2sgZm9yIGEgU1lOIGluIHdpbmRvdy4KLQkgKi8KLQlpZiAodGgtPnN5biAmJiAhYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmN2X254dCkpIHsKLQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BBQk9SVE9OU1lOKTsKLQkJdGNwX3Jlc2V0KHNrKTsKLQkJcmV0dXJuIDE7Ci0JfQorCXJlcyA9IHRjcF92YWxpZGF0ZV9pbmNvbWluZyhzaywgc2tiLCB0aCwgMCk7CisJaWYgKHJlcyA8PSAwKQorCQlyZXR1cm4gLXJlczsKIAogCS8qIHN0ZXAgNTogY2hlY2sgdGhlIEFDSyBmaWVsZCAqLwogCWlmICh0aC0+YWNrKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCA0NGMxZTkzLi41YzhmYTdmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTU4MywxNCArNTgzLDE1IEBACiAJCXJlcC50aC5kb2ZmID0gYXJnLmlvdlswXS5pb3ZfbGVuIC8gNDsKIAogCQl0Y3BfdjRfbWQ1X2hhc2hfaGRyKChfX3U4ICopICZyZXAub3B0WzFdLAotCQkJCSAgICAga2V5LCBpcF9oZHIoc2tiKS0+ZGFkZHIsCi0JCQkJICAgICBpcF9oZHIoc2tiKS0+c2FkZHIsICZyZXAudGgpOworCQkJCSAgICAga2V5LCBpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJICAgICBpcF9oZHIoc2tiKS0+ZGFkZHIsICZyZXAudGgpOwogCX0KICNlbmRpZgogCWFyZy5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKGlwX2hkcihza2IpLT5kYWRkciwKIAkJCQkgICAgICBpcF9oZHIoc2tiKS0+c2FkZHIsIC8qIFhYWCAqLwotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSwgSVBQUk9UT19UQ1AsIDApOworCQkJCSAgICAgIGFyZy5pb3ZbMF0uaW92X2xlbiwgSVBQUk9UT19UQ1AsIDApOwogCWFyZy5jc3Vtb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spIC8gMjsKKwlhcmcuZmxhZ3MgPSAoc2sgJiYgaW5ldF9zayhzayktPnRyYW5zcGFyZW50KSA/IElQX1JFUExZX0FSR19OT1NSQ0NIRUNLIDogMDsKIAogCW5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAJaXBfc2VuZF9yZXBseShuZXQtPmlwdjQudGNwX3NvY2ssIHNrYiwKQEAgLTYwNiw3ICs2MDcsOCBAQAogCiBzdGF0aWMgdm9pZCB0Y3BfdjRfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywKIAkJCSAgICB1MzIgd2luLCB1MzIgdHMsIGludCBvaWYsCi0JCQkgICAgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXkpCisJCQkgICAgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkgICAgaW50IHJlcGx5X2ZsYWdzKQogewogCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCXN0cnVjdCB7CkBAIC02MTgsNyArNjIwLDcgQEAKIAkJCV07CiAJfSByZXA7CiAJc3RydWN0IGlwX3JlcGx5X2FyZyBhcmc7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRzdC0+ZGV2KTsKIAogCW1lbXNldCgmcmVwLnRoLCAwLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CkBAIC02NTksNiArNjYxLDcgQEAKIAkJCQkgICAgaXBfaGRyKHNrYiktPmRhZGRyLCAmcmVwLnRoKTsKIAl9CiAjZW5kaWYKKwlhcmcuZmxhZ3MgPSByZXBseV9mbGFnczsKIAlhcmcuY3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChpcF9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkJICAgICAgaXBfaGRyKHNrYiktPnNhZGRyLCAvKiBYWFggKi8KIAkJCQkgICAgICBhcmcuaW92WzBdLmlvdl9sZW4sIElQUFJPVE9fVENQLCAwKTsKQEAgLTY4MSw3ICs2ODQsOCBAQAogCQkJdGNwdHctPnR3X3Jjdl93bmQgPj4gdHctPnR3X3Jjdl93c2NhbGUsCiAJCQl0Y3B0dy0+dHdfdHNfcmVjZW50LAogCQkJdHctPnR3X2JvdW5kX2Rldl9pZiwKLQkJCXRjcF90d3NrX21kNV9rZXkodGNwdHcpCisJCQl0Y3BfdHdza19tZDVfa2V5KHRjcHR3KSwKKwkJCXR3LT50d190cmFuc3BhcmVudCA/IElQX1JFUExZX0FSR19OT1NSQ0NIRUNLIDogMAogCQkJKTsKIAogCWluZXRfdHdza19wdXQodHcpOwpAQCAtNjk0LDcgKzY5OCw4IEBACiAJCQl0Y3BfcnNrKHJlcSktPnJjdl9pc24gKyAxLCByZXEtPnJjdl93bmQsCiAJCQlyZXEtPnRzX3JlY2VudCwKIAkJCTAsCi0JCQl0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgaXBfaGRyKHNrYiktPmRhZGRyKSk7CisJCQl0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgaXBfaGRyKHNrYiktPmRhZGRyKSwKKwkJCWluZXRfcnNrKHJlcSktPm5vX3NyY2NoZWNrID8gSVBfUkVQTFlfQVJHX05PU1JDQ0hFQ0sgOiAwKTsKIH0KIAogLyoKQEAgLTEyNDQsNiArMTI0OSw3IEBACiAJaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJaXJlcS0+bG9jX2FkZHIgPSBkYWRkcjsKIAlpcmVxLT5ybXRfYWRkciA9IHNhZGRyOworCWlyZXEtPm5vX3NyY2NoZWNrID0gaW5ldF9zayhzayktPnRyYW5zcGFyZW50OwogCWlyZXEtPm9wdCA9IHRjcF92NF9zYXZlX29wdGlvbnMoc2ssIHNrYik7CiAJaWYgKCF3YW50X2Nvb2tpZSkKIAkJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CkBAIC0xMzY0LDYgKzEzNzAsMTAgQEAKIAl0Y3BfbXR1cF9pbml0KG5ld3NrKTsKIAl0Y3Bfc3luY19tc3MobmV3c2ssIGRzdF9tdHUoZHN0KSk7CiAJbmV3dHAtPmFkdm1zcyA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUyk7CisJaWYgKHRjcF9zayhzayktPnJ4X29wdC51c2VyX21zcyAmJgorCSAgICB0Y3Bfc2soc2spLT5yeF9vcHQudXNlcl9tc3MgPCBuZXd0cC0+YWR2bXNzKQorCQluZXd0cC0+YWR2bXNzID0gdGNwX3NrKHNrKS0+cnhfb3B0LnVzZXJfbXNzOworCiAJdGNwX2luaXRpYWxpemVfcmN2X21zcyhuZXdzayk7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwpAQCAtMTU2Nyw4ICsxNTc3LDcgQEAKIAlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzCSA9IGlwaC0+dG9zOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkCSA9IDA7CiAKLQlzayA9IF9faW5ldF9sb29rdXAobmV0LCAmdGNwX2hhc2hpbmZvLCBpcGgtPnNhZGRyLAotCQkJdGgtPnNvdXJjZSwgaXBoLT5kYWRkciwgdGgtPmRlc3QsIGluZXRfaWlmKHNrYikpOworCXNrID0gX19pbmV0X2xvb2t1cF9za2IoJnRjcF9oYXNoaW5mbywgc2tiLCB0aC0+c291cmNlLCB0aC0+ZGVzdCk7CiAJaWYgKCFzaykKIAkJZ290byBub190Y3Bfc29ja2V0OwogCkBAIC0xOTQ2LDYgKzE5NTUsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGVtcHR5X2J1Y2tldChzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnN0KQoreworCXJldHVybiBobGlzdF9lbXB0eSgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLmNoYWluKSAmJgorCQlobGlzdF9lbXB0eSgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLnR3Y2hhaW4pOworfQorCiBzdGF0aWMgdm9pZCAqZXN0YWJsaXNoZWRfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQogewogCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSogc3QgPSBzZXEtPnByaXZhdGU7CkBAIC0xOTU4LDYgKzE5NzMsMTAgQEAKIAkJc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHc7CiAJCXJ3bG9ja190ICpsb2NrID0gaW5ldF9laGFzaF9sb2NrcCgmdGNwX2hhc2hpbmZvLCBzdC0+YnVja2V0KTsKIAorCQkvKiBMb2NrbGVzcyBmYXN0IHBhdGggZm9yIHRoZSBjb21tb24gY2FzZSBvZiBlbXB0eSBidWNrZXRzICovCisJCWlmIChlbXB0eV9idWNrZXQoc3QpKQorCQkJY29udGludWU7CisKIAkJcmVhZF9sb2NrX2JoKGxvY2spOwogCQlza19mb3JfZWFjaChzaywgbm9kZSwgJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0XS5jaGFpbikgewogCQkJaWYgKHNrLT5za19mYW1pbHkgIT0gc3QtPmZhbWlseSB8fApAQCAtMjAwOCwxMyArMjAyNywxNSBAQAogCQlyZWFkX3VubG9ja19iaChpbmV0X2VoYXNoX2xvY2twKCZ0Y3BfaGFzaGluZm8sIHN0LT5idWNrZXQpKTsKIAkJc3QtPnN0YXRlID0gVENQX1NFUV9TVEFURV9FU1RBQkxJU0hFRDsKIAotCQlpZiAoKytzdC0+YnVja2V0IDwgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUpIHsKLQkJCXJlYWRfbG9ja19iaChpbmV0X2VoYXNoX2xvY2twKCZ0Y3BfaGFzaGluZm8sIHN0LT5idWNrZXQpKTsKLQkJCXNrID0gc2tfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLmNoYWluKTsKLQkJfSBlbHNlIHsKLQkJCWN1ciA9IE5VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQkvKiBMb29rIGZvciBuZXh0IG5vbiBlbXB0eSBidWNrZXQgKi8KKwkJd2hpbGUgKCsrc3QtPmJ1Y2tldCA8IHRjcF9oYXNoaW5mby5laGFzaF9zaXplICYmCisJCQkJZW1wdHlfYnVja2V0KHN0KSkKKwkJCTsKKwkJaWYgKHN0LT5idWNrZXQgPj0gdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUpCisJCQlyZXR1cm4gTlVMTDsKKworCQlyZWFkX2xvY2tfYmgoaW5ldF9laGFzaF9sb2NrcCgmdGNwX2hhc2hpbmZvLCBzdC0+YnVja2V0KSk7CisJCXNrID0gc2tfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLmNoYWluKTsKIAl9IGVsc2UKIAkJc2sgPSBza19uZXh0KHNrKTsKIApAQCAtMjM3Niw2ICsyMzk3LDcgQEAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgdGNwX3NrX2V4aXQoc3RydWN0IG5ldCAqbmV0KQogewogCWluZXRfY3RsX3NvY2tfZGVzdHJveShuZXQtPmlwdjQudGNwX3NvY2spOworCWluZXRfdHdza19wdXJnZShuZXQsICZ0Y3BfaGFzaGluZm8sICZ0Y3BfZGVhdGhfcm93LCBBRl9JTkVUKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBfX25ldF9pbml0ZGF0YSB0Y3Bfc2tfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IGY5NzZmYzUuLjc3OWYyZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTM5NSw2ICszOTUsNyBAQAogCQluZXd0cC0+cHJlZF9mbGFncyA9IDA7CiAJCW5ld3RwLT5yY3Zfd3VwID0gbmV3dHAtPmNvcGllZF9zZXEgPSBuZXd0cC0+cmN2X254dCA9IHRyZXEtPnJjdl9pc24gKyAxOwogCQluZXd0cC0+c25kX3NtbCA9IG5ld3RwLT5zbmRfdW5hID0gbmV3dHAtPnNuZF9ueHQgPSB0cmVxLT5zbnRfaXNuICsgMTsKKwkJbmV3dHAtPnNuZF91cCA9IHRyZXEtPnNudF9pc24gKyAxOwogCiAJCXRjcF9wcmVxdWV1ZV9pbml0KG5ld3RwKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX291dHB1dC5jIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCmluZGV4IDgxNjVmNWEuLjk5MGE1ODQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKQEAgLTM0NSw2ICszNDUsMTEgQEAKIAlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSBzZXE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF91cmdfbW9kZShjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXJldHVybiB0cC0+c25kX3VuYSAhPSB0cC0+c25kX3VwOworfQorCiAjZGVmaW5lIE9QVElPTl9TQUNLX0FEVkVSVElTRQkoMSA8PCAwKQogI2RlZmluZSBPUFRJT05fVFMJCSgxIDw8IDEpCiAjZGVmaW5lIE9QVElPTl9NRDUJCSgxIDw8IDIpCkBAIC02NDYsNyArNjUxLDggQEAKIAl0aC0+Y2hlY2sJCT0gMDsKIAl0aC0+dXJnX3B0cgkJPSAwOwogCi0JaWYgKHVubGlrZWx5KHRwLT51cmdfbW9kZSAmJgorCS8qIFRoZSB1cmdfbW9kZSBjaGVjayBpcyBuZWNlc3NhcnkgZHVyaW5nIGEgYmVsb3cgc25kX3VuYSB3aW4gcHJvYmUgKi8KKwlpZiAodW5saWtlbHkodGNwX3VyZ19tb2RlKHRwKSAmJgogCQkgICAgIGJldHdlZW4odHAtPnNuZF91cCwgdGNiLT5zZXEgKyAxLCB0Y2ItPnNlcSArIDB4RkZGRikpKSB7CiAJCXRoLT51cmdfcHRyCQk9IGh0b25zKHRwLT5zbmRfdXAgLSB0Y2ItPnNlcSk7CiAJCXRoLT51cmcJCQk9IDE7CkBAIC0xMDEyLDcgKzEwMTgsNyBAQAogLyogQ29tcHV0ZSB0aGUgY3VycmVudCBlZmZlY3RpdmUgTVNTLCB0YWtpbmcgU0FDS3MgYW5kIElQIG9wdGlvbnMsCiAgKiBhbmQgZXZlbiBQTVRVIGRpc2NvdmVyeSBldmVudHMgaW50byBhY2NvdW50LgogICoKLSAqIExBUkdFU0VORCBub3RlOiAhdXJnX21vZGUgaXMgb3ZlcmtpbGwsIG9ubHkgZnJhbWVzIHVwIHRvIHNuZF91cAorICogTEFSR0VTRU5EIG5vdGU6ICF0Y3BfdXJnX21vZGUgaXMgb3ZlcmtpbGwsIG9ubHkgZnJhbWVzIHVwIHRvIHNuZF91cAogICogY2Fubm90IGJlIGxhcmdlLiBIb3dldmVyLCB0YWtpbmcgaW50byBhY2NvdW50IHJhcmUgdXNlIG9mIFVSRywgdGhpcwogICogaXMgbm90IGEgYmlnIGZsYXcuCiAgKi8KQEAgLTEwMjksNyArMTAzNSw3IEBACiAKIAltc3Nfbm93ID0gdHAtPm1zc19jYWNoZTsKIAotCWlmIChsYXJnZV9hbGxvd2VkICYmIHNrX2Nhbl9nc28oc2spICYmICF0cC0+dXJnX21vZGUpCisJaWYgKGxhcmdlX2FsbG93ZWQgJiYgc2tfY2FuX2dzbyhzaykgJiYgIXRjcF91cmdfbW9kZSh0cCkpCiAJCWRvaW5nX3RzbyA9IDE7CiAKIAlpZiAoZHN0KSB7CkBAIC0xMTkzLDcgKzExOTksNyBAQAogCS8qIERvbid0IHVzZSB0aGUgbmFnbGUgcnVsZSBmb3IgdXJnZW50IGRhdGEgKG9yIGZvciB0aGUgZmluYWwgRklOKS4KIAkgKiBOYWdsZSBjYW4gYmUgaWdub3JlZCBkdXJpbmcgRi1SVE8gdG9vIChzZWUgUkZDNDEzOCkuCiAJICovCi0JaWYgKHRwLT51cmdfbW9kZSB8fCAodHAtPmZydG9fY291bnRlciA9PSAyKSB8fAorCWlmICh0Y3BfdXJnX21vZGUodHApIHx8ICh0cC0+ZnJ0b19jb3VudGVyID09IDIpIHx8CiAJICAgIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pKQogCQlyZXR1cm4gMTsKIApAQCAtMTgyNCw2ICsxODMwLDggQEAKIAogCS8qIGNoYW5nZWQgdHJhbnNtaXQgcXVldWUgdW5kZXIgdXMgc28gY2xlYXIgaGludHMgKi8KIAl0Y3BfY2xlYXJfcmV0cmFuc19oaW50c19wYXJ0aWFsKHRwKTsKKwlpZiAobmV4dF9za2IgPT0gdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpCisJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gc2tiOwogCiAJc2tfd21lbV9mcmVlX3NrYihzaywgbmV4dF9za2IpOwogfQpAQCAtMTgzOCw3ICsxODQ2LDcgQEAKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGludCBtc3MgPSB0Y3BfY3VycmVudF9tc3Moc2ssIDApOwotCWludCBsb3N0ID0gMDsKKwl1MzIgcHJpb3JfbG9zdCA9IHRwLT5sb3N0X291dDsKIAogCXRjcF9mb3Jfd3JpdGVfcXVldWUoc2tiLCBzaykgewogCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQpAQCAtMTg0OSwxNyArMTg1NywxMyBAQAogCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfUkVUUkFOUzsKIAkJCQl0cC0+cmV0cmFuc19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKIAkJCX0KLQkJCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfTE9TVCkpIHsKLQkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwotCQkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCQkJCWxvc3QgPSAxOwotCQkJfQorCQkJdGNwX3NrYl9tYXJrX2xvc3RfdW5jb25kX3ZlcmlmeSh0cCwgc2tiKTsKIAkJfQogCX0KIAotCXRjcF9jbGVhcl9hbGxfcmV0cmFuc19oaW50cyh0cCk7CisJdGNwX2NsZWFyX3JldHJhbnNfaGludHNfcGFydGlhbCh0cCk7CiAKLQlpZiAoIWxvc3QpCisJaWYgKHByaW9yX2xvc3QgPT0gdHAtPmxvc3Rfb3V0KQogCQlyZXR1cm47CiAKIAlpZiAodGNwX2lzX3Jlbm8odHApKQpAQCAtMTkzNCw4ICsxOTM4LDggQEAKIAkvKiBDb2xsYXBzZSB0d28gYWRqYWNlbnQgcGFja2V0cyBpZiB3b3J0aHdoaWxlIGFuZCB3ZSBjYW4uICovCiAJaWYgKCEoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSAmJgogCSAgICAoc2tiLT5sZW4gPCAoY3VyX21zcyA+PiAxKSkgJiYKLQkgICAgKHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpICE9IHRjcF9zZW5kX2hlYWQoc2spKSAmJgogCSAgICAoIXRjcF9za2JfaXNfbGFzdChzaywgc2tiKSkgJiYKKwkgICAgKHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpICE9IHRjcF9zZW5kX2hlYWQoc2spKSAmJgogCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwICYmCiAJICAgICBza2Jfc2hpbmZvKHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpKS0+bnJfZnJhZ3MgPT0gMCkgJiYKIAkgICAgKHRjcF9za2JfcGNvdW50KHNrYikgPT0gMSAmJgpAQCAtMTk5Niw2ICsyMDAwLDMzIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCB0Y3BfY2FuX2ZvcndhcmRfcmV0cmFuc21pdChzdHJ1Y3Qgc29jayAqc2spCit7CisJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJLyogRm9yd2FyZCByZXRyYW5zbWlzc2lvbnMgYXJlIHBvc3NpYmxlIG9ubHkgZHVyaW5nIFJlY292ZXJ5LiAqLworCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9SZWNvdmVyeSkKKwkJcmV0dXJuIDA7CisKKwkvKiBObyBmb3J3YXJkIHJldHJhbnNtaXNzaW9ucyBpbiBSZW5vIGFyZSBwb3NzaWJsZS4gKi8KKwlpZiAodGNwX2lzX3Jlbm8odHApKQorCQlyZXR1cm4gMDsKKworCS8qIFllYWgsIHdlIGhhdmUgdG8gbWFrZSBkaWZmaWN1bHQgY2hvaWNlIGJldHdlZW4gZm9yd2FyZCB0cmFuc21pc3Npb24KKwkgKiBhbmQgcmV0cmFuc21pc3Npb24uLi4gQm90aCB3YXlzIGhhdmUgdGhlaXIgbWVyaXRzLi4uCisJICoKKwkgKiBGb3Igbm93IHdlIGRvIG5vdCByZXRyYW5zbWl0IGFueXRoaW5nLCB3aGlsZSB3ZSBoYXZlIHNvbWUgbmV3CisJICogc2VnbWVudHMgdG8gc2VuZC4gSW4gdGhlIG90aGVyIGNhc2VzLCBmb2xsb3cgcnVsZSAzIGZvcgorCSAqIE5leHRTZWcoKSBzcGVjaWZpZWQgaW4gUkZDMzUxNy4KKwkgKi8KKworCWlmICh0Y3BfbWF5X3NlbmRfbm93KHNrKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwogLyogVGhpcyBnZXRzIGNhbGxlZCBhZnRlciBhIHJldHJhbnNtaXQgdGltZW91dCwgYW5kIHRoZSBpbml0aWFsbHkKICAqIHJldHJhbnNtaXR0ZWQgZGF0YSBpcyBhY2tub3dsZWRnZWQuICBJdCB0cmllcyB0byBjb250aW51ZQogICogcmVzZW5kaW5nIHRoZSByZXN0IG9mIHRoZSByZXRyYW5zbWl0IHF1ZXVlLCB1bnRpbCBlaXRoZXIKQEAgLTIwMDksMTIwICsyMDQwLDg2IEBACiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHBhY2tldF9jbnQ7CisJc3RydWN0IHNrX2J1ZmYgKmhvbGUgPSBOVUxMOworCXUzMiBsYXN0X2xvc3Q7CisJaW50IG1pYl9pZHg7CisJaW50IGZ3ZF9yZXhtaXR0aW5nID0gMDsKKworCWlmICghdHAtPmxvc3Rfb3V0KQorCQl0cC0+cmV0cmFuc21pdF9oaWdoID0gdHAtPnNuZF91bmE7CiAKIAlpZiAodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpIHsKIAkJc2tiID0gdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQ7Ci0JCXBhY2tldF9jbnQgPSB0cC0+cmV0cmFuc21pdF9jbnRfaGludDsKKwkJbGFzdF9sb3N0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCQlpZiAoYWZ0ZXIobGFzdF9sb3N0LCB0cC0+cmV0cmFuc21pdF9oaWdoKSkKKwkJCWxhc3RfbG9zdCA9IHRwLT5yZXRyYW5zbWl0X2hpZ2g7CiAJfSBlbHNlIHsKIAkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOwotCQlwYWNrZXRfY250ID0gMDsKKwkJbGFzdF9sb3N0ID0gdHAtPnNuZF91bmE7CiAJfQogCiAJLyogRmlyc3QgcGFzczogcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuICovCi0JaWYgKHRwLT5sb3N0X291dCkgewotCQl0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykgewotCQkJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKLQotCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKLQkJCQlicmVhazsKLQkJCS8qIHdlIGNvdWxkIGRvIGJldHRlciB0aGFuIHRvIGFzc2lnbiBlYWNoIHRpbWUgKi8KLQkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gc2tiOwotCQkJdHAtPnJldHJhbnNtaXRfY250X2hpbnQgPSBwYWNrZXRfY250OwotCi0JCQkvKiBBc3N1bWUgdGhpcyByZXRyYW5zbWl0IHdpbGwgZ2VuZXJhdGUKLQkJCSAqIG9ubHkgb25lIHBhY2tldCBmb3IgY29uZ2VzdGlvbiB3aW5kb3cKLQkJCSAqIGNhbGN1bGF0aW9uIHB1cnBvc2VzLiAgVGhpcyB3b3JrcyBiZWNhdXNlCi0JCQkgKiB0Y3BfcmV0cmFuc21pdF9za2IoKSB3aWxsIGNob3AgdXAgdGhlCi0JCQkgKiBwYWNrZXQgdG8gYmUgTVNTIHNpemVkIGFuZCBhbGwgdGhlCi0JCQkgKiBwYWNrZXQgY291bnRpbmcgd29ya3Mgb3V0LgotCQkJICovCi0JCQlpZiAodGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA+PSB0cC0+c25kX2N3bmQpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoc2Fja2VkICYgVENQQ0JfTE9TVCkgewotCQkJCWlmICghKHNhY2tlZCAmIChUQ1BDQl9TQUNLRURfQUNLRUR8VENQQ0JfU0FDS0VEX1JFVFJBTlMpKSkgewotCQkJCQlpbnQgbWliX2lkeDsKLQotCQkJCQlpZiAodGNwX3JldHJhbnNtaXRfc2tiKHNrLCBza2IpKSB7Ci0JCQkJCQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IE5VTEw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgIT0gVENQX0NBX0xvc3MpCi0JCQkJCQltaWJfaWR4ID0gTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TOwotCQkJCQllbHNlCi0JCQkJCQltaWJfaWR4ID0gTElOVVhfTUlCX1RDUFNMT1dTVEFSVFJFVFJBTlM7Ci0JCQkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBtaWJfaWR4KTsKLQotCQkJCQlpZiAoc2tiID09IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkKLQkJCQkJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAotCQkJCQkJCQkJICBpbmV0X2NzayhzayktPmljc2tfcnRvLAotCQkJCQkJCQkJICBUQ1BfUlRPX01BWCk7Ci0JCQkJfQotCi0JCQkJcGFja2V0X2NudCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCQkJCWlmIChwYWNrZXRfY250ID49IHRwLT5sb3N0X291dCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBPSywgZGVtYW5kZWQgcmV0cmFuc21pc3Npb24gaXMgZmluaXNoZWQuICovCi0KLQkvKiBGb3J3YXJkIHJldHJhbnNtaXNzaW9ucyBhcmUgcG9zc2libGUgb25seSBkdXJpbmcgUmVjb3ZlcnkuICovCi0JaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgIT0gVENQX0NBX1JlY292ZXJ5KQotCQlyZXR1cm47Ci0KLQkvKiBObyBmb3J3YXJkIHJldHJhbnNtaXNzaW9ucyBpbiBSZW5vIGFyZSBwb3NzaWJsZS4gKi8KLQlpZiAodGNwX2lzX3Jlbm8odHApKQotCQlyZXR1cm47Ci0KLQkvKiBZZWFoLCB3ZSBoYXZlIHRvIG1ha2UgZGlmZmljdWx0IGNob2ljZSBiZXR3ZWVuIGZvcndhcmQgdHJhbnNtaXNzaW9uCi0JICogYW5kIHJldHJhbnNtaXNzaW9uLi4uIEJvdGggd2F5cyBoYXZlIHRoZWlyIG1lcml0cy4uLgotCSAqCi0JICogRm9yIG5vdyB3ZSBkbyBub3QgcmV0cmFuc21pdCBhbnl0aGluZywgd2hpbGUgd2UgaGF2ZSBzb21lIG5ldwotCSAqIHNlZ21lbnRzIHRvIHNlbmQuIEluIHRoZSBvdGhlciBjYXNlcywgZm9sbG93IHJ1bGUgMyBmb3IKLQkgKiBOZXh0U2VnKCkgc3BlY2lmaWVkIGluIFJGQzM1MTcuCi0JICovCi0KLQlpZiAodGNwX21heV9zZW5kX25vdyhzaykpCi0JCXJldHVybjsKLQotCS8qIElmIG5vdGhpbmcgaXMgU0FDS2VkLCBoaWdoZXN0X3NhY2sgaW4gdGhlIGxvb3Agd29uJ3QgYmUgdmFsaWQgKi8KLQlpZiAoIXRwLT5zYWNrZWRfb3V0KQotCQlyZXR1cm47Ci0KLQlpZiAodHAtPmZvcndhcmRfc2tiX2hpbnQpCi0JCXNrYiA9IHRwLT5mb3J3YXJkX3NrYl9oaW50OwotCWVsc2UKLQkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOwotCiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKwogCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQogCQkJYnJlYWs7Ci0JCXRwLT5mb3J3YXJkX3NrYl9oaW50ID0gc2tiOworCQkvKiB3ZSBjb3VsZCBkbyBiZXR0ZXIgdGhhbiB0byBhc3NpZ24gZWFjaCB0aW1lICovCisJCWlmIChob2xlID09IE5VTEwpCisJCQl0cC0+cmV0cmFuc21pdF9za2JfaGludCA9IHNrYjsKIAotCQlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdGNwX2hpZ2hlc3Rfc2Fja19zZXEodHApKSkKLQkJCWJyZWFrOwotCisJCS8qIEFzc3VtZSB0aGlzIHJldHJhbnNtaXQgd2lsbCBnZW5lcmF0ZQorCQkgKiBvbmx5IG9uZSBwYWNrZXQgZm9yIGNvbmdlc3Rpb24gd2luZG93CisJCSAqIGNhbGN1bGF0aW9uIHB1cnBvc2VzLiAgVGhpcyB3b3JrcyBiZWNhdXNlCisJCSAqIHRjcF9yZXRyYW5zbWl0X3NrYigpIHdpbGwgY2hvcCB1cCB0aGUKKwkJICogcGFja2V0IHRvIGJlIE1TUyBzaXplZCBhbmQgYWxsIHRoZQorCQkgKiBwYWNrZXQgY291bnRpbmcgd29ya3Mgb3V0LgorCQkgKi8KIAkJaWYgKHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgPj0gdHAtPnNuZF9jd25kKQotCQkJYnJlYWs7CisJCQlyZXR1cm47CiAKLQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfVEFHQklUUykKKwkJaWYgKGZ3ZF9yZXhtaXR0aW5nKSB7CitiZWdpbl9md2Q6CisJCQlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdGNwX2hpZ2hlc3Rfc2Fja19zZXEodHApKSkKKwkJCQlicmVhazsKKwkJCW1pYl9pZHggPSBMSU5VWF9NSUJfVENQRk9SV0FSRFJFVFJBTlM7CisKKwkJfSBlbHNlIGlmICghYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCB0cC0+cmV0cmFuc21pdF9oaWdoKSkgeworCQkJdHAtPnJldHJhbnNtaXRfaGlnaCA9IGxhc3RfbG9zdDsKKwkJCWlmICghdGNwX2Nhbl9mb3J3YXJkX3JldHJhbnNtaXQoc2spKQorCQkJCWJyZWFrOworCQkJLyogQmFja3RyYWNrIGlmIG5lY2Vzc2FyeSB0byBub24tTCdlZCBza2IgKi8KKwkJCWlmIChob2xlICE9IE5VTEwpIHsKKwkJCQlza2IgPSBob2xlOworCQkJCWhvbGUgPSBOVUxMOworCQkJfQorCQkJZndkX3JleG1pdHRpbmcgPSAxOworCQkJZ290byBiZWdpbl9md2Q7CisKKwkJfSBlbHNlIGlmICghKHNhY2tlZCAmIFRDUENCX0xPU1QpKSB7CisJCQlpZiAoaG9sZSA9PSBOVUxMICYmICEoc2Fja2VkICYgVENQQ0JfU0FDS0VEX1JFVFJBTlMpKQorCQkJCWhvbGUgPSBza2I7CiAJCQljb250aW51ZTsKIAotCQkvKiBPaywgcmV0cmFuc21pdCBpdC4gKi8KLQkJaWYgKHRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiKSkgewotCQkJdHAtPmZvcndhcmRfc2tiX2hpbnQgPSBOVUxMOwotCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlsYXN0X2xvc3QgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcykKKwkJCQltaWJfaWR4ID0gTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TOworCQkJZWxzZQorCQkJCW1pYl9pZHggPSBMSU5VWF9NSUJfVENQU0xPV1NUQVJUUkVUUkFOUzsKIAkJfQogCisJCWlmIChzYWNrZWQgJiAoVENQQ0JfU0FDS0VEX0FDS0VEfFRDUENCX1NBQ0tFRF9SRVRSQU5TKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYikpCisJCQlyZXR1cm47CisJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBtaWJfaWR4KTsKKwogCQlpZiAoc2tiID09IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkKIAkJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJCQkJICBpbmV0X2NzayhzayktPmljc2tfcnRvLAogCQkJCQkJICBUQ1BfUlRPX01BWCk7Ci0KLQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BGT1JXQVJEUkVUUkFOUyk7CiAJfQogfQogCkBAIC0yMjQxLDYgKzIyMzgsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICptZDU7CiAJX191OCAqbWQ1X2hhc2hfbG9jYXRpb247CisJaW50IG1zczsKIAogCXNrYiA9IHNvY2tfd21hbGxvYyhzaywgTUFYX1RDUF9IRUFERVIgKyAxNSwgMSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQpAQCAtMjI1MSwxMyArMjI0OSwxNyBAQAogCiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoZHN0KTsKIAorCW1zcyA9IGRzdF9tZXRyaWMoZHN0LCBSVEFYX0FEVk1TUyk7CisJaWYgKHRwLT5yeF9vcHQudXNlcl9tc3MgJiYgdHAtPnJ4X29wdC51c2VyX21zcyA8IG1zcykKKwkJbXNzID0gdHAtPnJ4X29wdC51c2VyX21zczsKKwogCWlmIChyZXEtPnJjdl93bmQgPT0gMCkgeyAvKiBpZ25vcmVkIGZvciByZXRyYW5zbWl0dGVkIHN5bnMgKi8KIAkJX191OCByY3Zfd3NjYWxlOwogCQkvKiBTZXQgdGhpcyB1cCBvbiB0aGUgZmlyc3QgY2FsbCBvbmx5ICovCiAJCXJlcS0+d2luZG93X2NsYW1wID0gdHAtPndpbmRvd19jbGFtcCA/IDogZHN0X21ldHJpYyhkc3QsIFJUQVhfV0lORE9XKTsKIAkJLyogdGNwX2Z1bGxfc3BhY2UgYmVjYXVzZSBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSBmaXJzdCBwYWNrZXQgKi8KIAkJdGNwX3NlbGVjdF9pbml0aWFsX3dpbmRvdyh0Y3BfZnVsbF9zcGFjZShzayksCi0JCQlkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpIC0gKGlyZXEtPnRzdGFtcF9vayA/IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQgOiAwKSwKKwkJCW1zcyAtIChpcmVxLT50c3RhbXBfb2sgPyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEIDogMCksCiAJCQkmcmVxLT5yY3Zfd25kLAogCQkJJnJlcS0+d2luZG93X2NsYW1wLAogCQkJaXJlcS0+d3NjYWxlX29rLApAQCAtMjI2Nyw4ICsyMjY5LDcgQEAKIAogCW1lbXNldCgmb3B0cywgMCwgc2l6ZW9mKG9wdHMpKTsKIAlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKLQl0Y3BfaGVhZGVyX3NpemUgPSB0Y3Bfc3luYWNrX29wdGlvbnMoc2ssIHJlcSwKLQkJCQkJICAgICBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpLAorCXRjcF9oZWFkZXJfc2l6ZSA9IHRjcF9zeW5hY2tfb3B0aW9ucyhzaywgcmVxLCBtc3MsCiAJCQkJCSAgICAgc2tiLCAmb3B0cywgJm1kNSkgKwogCQkJICBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAKQEAgLTIyODAsNyArMjI4MSw3IEBACiAJdGgtPnN5biA9IDE7CiAJdGgtPmFjayA9IDE7CiAJVENQX0VDTl9tYWtlX3N5bmFjayhyZXEsIHRoKTsKLQl0aC0+c291cmNlID0gaW5ldF9zayhzayktPnNwb3J0OworCXRoLT5zb3VyY2UgPSBpcmVxLT5sb2NfcG9ydDsKIAl0aC0+ZGVzdCA9IGlyZXEtPnJtdF9wb3J0OwogCS8qIFNldHRpbmcgb2YgZmxhZ3MgYXJlIHN1cGVyZmx1b3VzIGhlcmUgZm9yIGNhbGxlcnMgKGFuZCBFQ0UgaXMKIAkgKiBub3QgZXZlbiBjb3JyZWN0bHkgc2V0KQpAQCAtMjM0Miw2ICsyMzQzLDkgQEAKIAlpZiAoIXRwLT53aW5kb3dfY2xhbXApCiAJCXRwLT53aW5kb3dfY2xhbXAgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9XSU5ET1cpOwogCXRwLT5hZHZtc3MgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpOworCWlmICh0cC0+cnhfb3B0LnVzZXJfbXNzICYmIHRwLT5yeF9vcHQudXNlcl9tc3MgPCB0cC0+YWR2bXNzKQorCQl0cC0+YWR2bXNzID0gdHAtPnJ4X29wdC51c2VyX21zczsKKwogCXRjcF9pbml0aWFsaXplX3Jjdl9tc3Moc2spOwogCiAJdGNwX3NlbGVjdF9pbml0aWFsX3dpbmRvdyh0Y3BfZnVsbF9zcGFjZShzayksCkBAIC0yMzYwLDYgKzIzNjQsNyBAQAogCXRjcF9pbml0X3dsKHRwLCB0cC0+d3JpdGVfc2VxLCAwKTsKIAl0cC0+c25kX3VuYSA9IHRwLT53cml0ZV9zZXE7CiAJdHAtPnNuZF9zbWwgPSB0cC0+d3JpdGVfc2VxOworCXRwLT5zbmRfdXAgPSB0cC0+d3JpdGVfc2VxOwogCXRwLT5yY3Zfbnh0ID0gMDsKIAl0cC0+cmN2X3d1cCA9IDA7CiAJdHAtPmNvcGllZF9zZXEgPSAwOwpAQCAtMjU2OSw4ICsyNTc0LDcgQEAKIAkJCXRjcF9ldmVudF9uZXdfZGF0YV9zZW50KHNrLCBza2IpOwogCQlyZXR1cm4gZXJyOwogCX0gZWxzZSB7Ci0JCWlmICh0cC0+dXJnX21vZGUgJiYKLQkJICAgIGJldHdlZW4odHAtPnNuZF91cCwgdHAtPnNuZF91bmEgKyAxLCB0cC0+c25kX3VuYSArIDB4RkZGRikpCisJCWlmIChiZXR3ZWVuKHRwLT5zbmRfdXAsIHRwLT5zbmRfdW5hICsgMSwgdHAtPnNuZF91bmEgKyAweEZGRkYpKQogCQkJdGNwX3htaXRfcHJvYmVfc2tiKHNrLCAxKTsKIAkJcmV0dXJuIHRjcF94bWl0X3Byb2JlX3NrYihzaywgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwppbmRleCA1YWI2YmExLi42YjZkZmYxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdGltZXIuYworKysgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQU0NIRURVTEVSRkFJTEVEKTsKIAogCQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnRwLT51Y29weS5wcmVxdWV1ZSkpICE9IE5VTEwpCi0JCQlzay0+c2tfYmFja2xvZ19yY3Yoc2ssIHNrYik7CisJCQlza19iYWNrbG9nX3Jjdihzaywgc2tiKTsKIAogCQl0cC0+dWNvcHkubWVtb3J5ID0gMDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IDhlNDJmYmIuLjIwOTVhYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC04LDcgKzgsNyBAQAogICogQXV0aG9yczoJUm9zcyBCaXJvCiAgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+Ci0gKgkJQWxhbiBDb3gsIDxBbGFuLkNveEBsaW51eC5vcmc+CisgKgkJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkJSGlyb2thenUgVGFrYWhhc2hpLCA8dGFrYUB2YWxpbnV4LmNvLmpwPgogICoKICAqIEZpeGVzOgpAQCAtMTA4LDkgKzEwOCw2IEBACiAgKglTbm1wIE1JQiBmb3IgdGhlIFVEUCBsYXllcgogICovCiAKLURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0c19pbjYpIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MKHVkcF9zdGF0c19pbjYpOwotCiBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHBfaGFzaFtVRFBfSFRBQkxFX1NJWkVdOwogREVGSU5FX1JXTE9DSyh1ZHBfaGFzaF9sb2NrKTsKIApAQCAtMTI1LDE0ICsxMjIsMjMgQEAKIGF0b21pY190IHVkcF9tZW1vcnlfYWxsb2NhdGVkOwogRVhQT1JUX1NZTUJPTCh1ZHBfbWVtb3J5X2FsbG9jYXRlZCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fdWRwX2xpYl9scG9ydF9pbnVzZShzdHJ1Y3QgbmV0ICpuZXQsIF9fdTE2IG51bSwKLQkJCQkJY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKK3N0YXRpYyBpbnQgdWRwX2xpYl9scG9ydF9pbnVzZShzdHJ1Y3QgbmV0ICpuZXQsIF9fdTE2IG51bSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLAorCQkJICAgICAgIHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICAgICBpbnQgKCpzYWRkcl9jb21wKShjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzazIpKQogewotCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc29jayAqc2syOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCi0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHB0YWJsZVt1ZHBfaGFzaGZuKG5ldCwgbnVtKV0pCi0JCWlmIChuZXRfZXEoc29ja19uZXQoc2spLCBuZXQpICYmIHNrLT5za19oYXNoID09IG51bSkKKwlza19mb3JfZWFjaChzazIsIG5vZGUsICZ1ZHB0YWJsZVt1ZHBfaGFzaGZuKG5ldCwgbnVtKV0pCisJCWlmIChuZXRfZXEoc29ja19uZXQoc2syKSwgbmV0KQkJCSYmCisJCSAgICBzazIgIT0gc2sJCQkJCSYmCisJCSAgICBzazItPnNrX2hhc2ggPT0gbnVtCQkJCSYmCisJCSAgICAoIXNrMi0+c2tfcmV1c2UgfHwgIXNrLT5za19yZXVzZSkJCSYmCisJCSAgICAoIXNrMi0+c2tfYm91bmRfZGV2X2lmIHx8ICFzay0+c2tfYm91bmRfZGV2X2lmCisJCQl8fCBzazItPnNrX2JvdW5kX2Rldl9pZiA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgorCQkgICAgKCpzYWRkcl9jb21wKShzaywgc2syKSkKIAkJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMTQ5LDgzICsxNTUsMzcgQEAKIAkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzazIgKSAgICApCiB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKnVkcHRhYmxlID0gc2stPnNrX3Byb3QtPmgudWRwX2hhc2g7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IHNvY2sgKnNrMjsKIAlpbnQgICAgZXJyb3IgPSAxOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAogCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOwogCiAJaWYgKCFzbnVtKSB7Ci0JCWludCBpLCBsb3csIGhpZ2gsIHJlbWFpbmluZzsKLQkJdW5zaWduZWQgcm92ZXIsIGJlc3QsIGJlc3Rfc2l6ZV9zb19mYXI7CisJCWludCBsb3csIGhpZ2gsIHJlbWFpbmluZzsKKwkJdW5zaWduZWQgcmFuZDsKKwkJdW5zaWduZWQgc2hvcnQgZmlyc3Q7CiAKIAkJaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZSgmbG93LCAmaGlnaCk7CiAJCXJlbWFpbmluZyA9IChoaWdoIC0gbG93KSArIDE7CiAKLQkJYmVzdF9zaXplX3NvX2ZhciA9IFVJTlRfTUFYOwotCQliZXN0ID0gcm92ZXIgPSBuZXRfcmFuZG9tKCkgJSByZW1haW5pbmcgKyBsb3c7Ci0KLQkJLyogMXN0IHBhc3M6IGxvb2sgZm9yIGVtcHR5IChvciBzaG9ydGVzdCkgaGFzaCBjaGFpbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgVURQX0hUQUJMRV9TSVpFOyBpKyspIHsKLQkJCWludCBzaXplID0gMDsKLQotCQkJaGVhZCA9ICZ1ZHB0YWJsZVt1ZHBfaGFzaGZuKG5ldCwgcm92ZXIpXTsKLQkJCWlmIChobGlzdF9lbXB0eShoZWFkKSkKLQkJCQlnb3RvIGdvdGl0OwotCi0JCQlza19mb3JfZWFjaChzazIsIG5vZGUsIGhlYWQpIHsKLQkJCQlpZiAoKytzaXplID49IGJlc3Rfc2l6ZV9zb19mYXIpCi0JCQkJCWdvdG8gbmV4dDsKLQkJCX0KLQkJCWJlc3Rfc2l6ZV9zb19mYXIgPSBzaXplOwotCQkJYmVzdCA9IHJvdmVyOwotCQluZXh0OgotCQkJLyogZm9sZCBiYWNrIGlmIGVuZCBvZiByYW5nZSAqLwotCQkJaWYgKCsrcm92ZXIgPiBoaWdoKQotCQkJCXJvdmVyID0gbG93ICsgKChyb3ZlciAtIGxvdykKLQkJCQkJICAgICAgICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpKTsKLQotCi0JCX0KLQotCQkvKiAybmQgcGFzczogZmluZCBob2xlIGluIHNob3J0ZXN0IGhhc2ggY2hhaW4gKi8KLQkJcm92ZXIgPSBiZXN0OwotCQlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgMTYpIC8gVURQX0hUQUJMRV9TSVpFOyBpKyspIHsKLQkJCWlmICghIF9fdWRwX2xpYl9scG9ydF9pbnVzZShuZXQsIHJvdmVyLCB1ZHB0YWJsZSkpCi0JCQkJZ290byBnb3RpdDsKLQkJCXJvdmVyICs9IFVEUF9IVEFCTEVfU0laRTsKLQkJCWlmIChyb3ZlciA+IGhpZ2gpCi0JCQkJcm92ZXIgPSBsb3cgKyAoKHJvdmVyIC0gbG93KQotCQkJCQkgICAgICAgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSkpOwotCQl9Ci0KLQotCQkvKiBBbGwgcG9ydHMgaW4gdXNlISAqLwotCQlnb3RvIGZhaWw7Ci0KLWdvdGl0OgotCQlzbnVtID0gcm92ZXI7Ci0JfSBlbHNlIHsKLQkJaGVhZCA9ICZ1ZHB0YWJsZVt1ZHBfaGFzaGZuKG5ldCwgc251bSldOwotCi0JCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgaGVhZCkKLQkJCWlmIChzazItPnNrX2hhc2ggPT0gc251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLQkJCSAgICBzazIgIT0gc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLQkJCSAgICBuZXRfZXEoc29ja19uZXQoc2syKSwgbmV0KQkJCSAgICAgJiYKLQkJCSAgICAoIXNrMi0+c2tfcmV1c2UgICAgICAgIHx8ICFzay0+c2tfcmV1c2UpICAgICAgICAgJiYKLQkJCSAgICAoIXNrMi0+c2tfYm91bmRfZGV2X2lmIHx8ICFzay0+c2tfYm91bmRfZGV2X2lmCi0JCQkgICAgIHx8IHNrMi0+c2tfYm91bmRfZGV2X2lmID09IHNrLT5za19ib3VuZF9kZXZfaWYpICYmCi0JCQkgICAgKCpzYWRkcl9jb21wKShzaywgc2syKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCQlyYW5kID0gbmV0X3JhbmRvbSgpOworCQlzbnVtID0gZmlyc3QgPSByYW5kICUgcmVtYWluaW5nICsgbG93OworCQlyYW5kIHw9IDE7CisJCXdoaWxlICh1ZHBfbGliX2xwb3J0X2ludXNlKG5ldCwgc251bSwgdWRwdGFibGUsIHNrLAorCQkJCQkgICBzYWRkcl9jb21wKSkgeworCQkJZG8geworCQkJCXNudW0gPSBzbnVtICsgcmFuZDsKKwkJCX0gd2hpbGUgKHNudW0gPCBsb3cgfHwgc251bSA+IGhpZ2gpOworCQkJaWYgKHNudW0gPT0gZmlyc3QpCiAJCQkJZ290byBmYWlsOwotCX0KKwkJfQorCX0gZWxzZSBpZiAodWRwX2xpYl9scG9ydF9pbnVzZShuZXQsIHNudW0sIHVkcHRhYmxlLCBzaywgc2FkZHJfY29tcCkpCisJCWdvdG8gZmFpbDsKIAogCWluZXRfc2soc2spLT5udW0gPSBzbnVtOwogCXNrLT5za19oYXNoID0gc251bTsKIAlpZiAoc2tfdW5oYXNoZWQoc2spKSB7Ci0JCWhlYWQgPSAmdWRwdGFibGVbdWRwX2hhc2hmbihuZXQsIHNudW0pXTsKLQkJc2tfYWRkX25vZGUoc2ssIGhlYWQpOworCQlza19hZGRfbm9kZShzaywgJnVkcHRhYmxlW3VkcF9oYXNoZm4obmV0LCBzbnVtKV0pOwogCQlzb2NrX3Byb3RfaW51c2VfYWRkKHNvY2tfbmV0KHNrKSwgc2stPnNrX3Byb3QsIDEpOwogCX0KIAllcnJvciA9IDA7CkBAIC0zMDIsNiArMjYyLDI4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqX191ZHA0X2xpYl9sb29rdXBfc2tiKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQsCisJCQkJCQkgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKworCWlmICh1bmxpa2VseShzayA9IHNrYl9zdGVhbF9zb2NrKHNrYikpKQorCQlyZXR1cm4gc2s7CisJZWxzZQorCQlyZXR1cm4gX191ZHA0X2xpYl9sb29rdXAoZGV2X25ldChza2ItPmRzdC0+ZGV2KSwgaXBoLT5zYWRkciwgc3BvcnQsCisJCQkJCSBpcGgtPmRhZGRyLCBkcG9ydCwgaW5ldF9paWYoc2tiKSwKKwkJCQkJIHVkcHRhYmxlKTsKK30KKworc3RydWN0IHNvY2sgKnVkcDRfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LAorCQkJICAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwgaW50IGRpZikKK3sKKwlyZXR1cm4gX191ZHA0X2xpYl9sb29rdXAobmV0LCBzYWRkciwgc3BvcnQsIGRhZGRyLCBkcG9ydCwgZGlmLCB1ZHBfaGFzaCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZHA0X2xpYl9sb29rdXApOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICp1ZHBfdjRfbWNhc3RfbmV4dChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgX19iZTE2IGxvY19wb3J0LCBfX2JlMzIgbG9jX2FkZHIsCiAJCQkJCSAgICAgX19iZTE2IHJtdF9wb3J0LCBfX2JlMzIgcm10X2FkZHIsCkBAIC05NTEsNiArOTMzLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX191ZHBfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKKwlpbnQgcmM7CisKKwlpZiAoKHJjID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpKSA8IDApIHsKKwkJLyogTm90ZSB0aGF0IGFuIEVOT01FTSBlcnJvciBpcyBjaGFyZ2VkIHR3aWNlICovCisJCWlmIChyYyA9PSAtRU5PTUVNKQorCQkJVURQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIFVEUF9NSUJfUkNWQlVGRVJST1JTLAorCQkJCQkgaXNfdWRwbGl0ZSk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlyZXR1cm4gMDsKKworZHJvcDoKKwlVRFBfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOworfQorCiAvKiByZXR1cm5zOgogICogIC0xOiBlcnJvcgogICogICAwOiBzdWNjZXNzCkBAIC05ODksOSArOTkyLDcgQEAKIAkJICAgIHVwLT5lbmNhcF9yY3YgIT0gTlVMTCkgewogCQkJaW50IHJldDsKIAotCQkJYmhfdW5sb2NrX3NvY2soc2spOwogCQkJcmV0ID0gKCp1cC0+ZW5jYXBfcmN2KShzaywgc2tiKTsKLQkJCWJoX2xvY2tfc29jayhzayk7CiAJCQlpZiAocmV0IDw9IDApIHsKIAkJCQlVRFBfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwKIAkJCQkJCSBVRFBfTUlCX0lOREFUQUdSQU1TLApAQCAtMTA0NCwxNyArMTA0NSwxNiBAQAogCQkJZ290byBkcm9wOwogCX0KIAotCWlmICgocmMgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssc2tiKSkgPCAwKSB7Ci0JCS8qIE5vdGUgdGhhdCBhbiBFTk9NRU0gZXJyb3IgaXMgY2hhcmdlZCB0d2ljZSAqLwotCQlpZiAocmMgPT0gLUVOT01FTSkgewotCQkJVURQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCi0JCQkJCVVEUF9NSUJfUkNWQlVGRVJST1JTLCBpc191ZHBsaXRlKTsKLQkJCWF0b21pY19pbmMoJnNrLT5za19kcm9wcyk7Ci0JCX0KLQkJZ290byBkcm9wOwotCX0KKwlyYyA9IDA7CiAKLQlyZXR1cm4gMDsKKwliaF9sb2NrX3NvY2soc2spOworCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkKKwkJcmMgPSBfX3VkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOworCWVsc2UKKwkJc2tfYWRkX2JhY2tsb2coc2ssIHNrYik7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJcmV0dXJuIHJjOwogCiBkcm9wOgogCVVEUF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBVRFBfTUlCX0lORVJST1JTLCBpc191ZHBsaXRlKTsKQEAgLTEwOTIsMTUgKzEwOTIsNyBAQAogCQkJCXNrYjEgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAogCQkJaWYgKHNrYjEpIHsKLQkJCQlpbnQgcmV0ID0gMDsKLQotCQkJCWJoX2xvY2tfc29jayhzayk7Ci0JCQkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKQotCQkJCQlyZXQgPSB1ZHBfcXVldWVfcmN2X3NrYihzaywgc2tiMSk7Ci0JCQkJZWxzZQotCQkJCQlza19hZGRfYmFja2xvZyhzaywgc2tiMSk7Ci0JCQkJYmhfdW5sb2NrX3NvY2soc2spOwotCisJCQkJaW50IHJldCA9IHVkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IxKTsKIAkJCQlpZiAocmV0ID4gMCkKIAkJCQkJLyogd2Ugc2hvdWxkIHByb2JhYmx5IHJlLXByb2Nlc3MgaW5zdGVhZAogCQkJCQkgKiBvZiBkcm9wcGluZyBwYWNrZXRzIGhlcmUuICovCkBAIC0xMTkxLDE3ICsxMTgzLDEwIEBACiAJCXJldHVybiBfX3VkcDRfbGliX21jYXN0X2RlbGl2ZXIobmV0LCBza2IsIHVoLAogCQkJCXNhZGRyLCBkYWRkciwgdWRwdGFibGUpOwogCi0Jc2sgPSBfX3VkcDRfbGliX2xvb2t1cChuZXQsIHNhZGRyLCB1aC0+c291cmNlLCBkYWRkciwKLQkJCXVoLT5kZXN0LCBpbmV0X2lpZihza2IpLCB1ZHB0YWJsZSk7CisJc2sgPSBfX3VkcDRfbGliX2xvb2t1cF9za2Ioc2tiLCB1aC0+c291cmNlLCB1aC0+ZGVzdCwgdWRwdGFibGUpOwogCiAJaWYgKHNrICE9IE5VTEwpIHsKLQkJaW50IHJldCA9IDA7Ci0JCWJoX2xvY2tfc29jayhzayk7Ci0JCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkKLQkJCXJldCA9IHVkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwotCQllbHNlCi0JCQlza19hZGRfYmFja2xvZyhzaywgc2tiKTsKLQkJYmhfdW5sb2NrX3NvY2soc2spOworCQlpbnQgcmV0ID0gdWRwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJCXNvY2tfcHV0KHNrKTsKIAogCQkvKiBhIHJldHVybiB2YWx1ZSA+IDAgbWVhbnMgdG8gcmVzdWJtaXQgdGhlIGlucHV0LCBidXQKQEAgLTE0OTQsNyArMTQ3OSw3IEBACiAJLnNlbmRtc2cJICAgPSB1ZHBfc2VuZG1zZywKIAkucmVjdm1zZwkgICA9IHVkcF9yZWN2bXNnLAogCS5zZW5kcGFnZQkgICA9IHVkcF9zZW5kcGFnZSwKLQkuYmFja2xvZ19yY3YJICAgPSB1ZHBfcXVldWVfcmN2X3NrYiwKKwkuYmFja2xvZ19yY3YJICAgPSBfX3VkcF9xdWV1ZV9yY3Zfc2tiLAogCS5oYXNoCQkgICA9IHVkcF9saWJfaGFzaCwKIAkudW5oYXNoCQkgICA9IHVkcF9saWJfdW5oYXNoLAogCS5nZXRfcG9ydAkgICA9IHVkcF92NF9nZXRfcG9ydCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IDdiNmE1ODQuLmVlYTk1NDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMzk4Miw3ICszOTgyLDYgQEAKIH0KIAogc3RhdGljIGludCBhZGRyY29uZl9zeXNjdGxfZm9yd2FyZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAotCQkJCQkgICAgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCQkJCSAgICB2b2lkIF9fdXNlciAqb2xkdmFsLAogCQkJCQkgICAgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKIAkJCQkJICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCA5NTA1NWY4Li4wMWVkYWM4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxuZXQvaXBpcC5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CkBAIC03OTQsNjEgKzc5NSw1NSBAQAogCWRldl9yZW1vdmVfcGFjaygmaXB2Nl9wYWNrZXRfdHlwZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfaXB2Nl9taWJzKHZvaWQpCitzdGF0aWMgaW50IF9fbmV0X2luaXQgaXB2Nl9pbml0X21pYnMoc3RydWN0IG5ldCAqbmV0KQogewotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcywKLQkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKLQkJZ290byBlcnJfaXBfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCi0JCWdvdG8gZXJyX2ljbXBfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKWljbXB2Nm1zZ19zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nm1zZ19taWIpKSA8IDApCi0JCWdvdG8gZXJyX2ljbXBtc2dfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKXVkcF9zdGF0c19pbjYsIHNpemVvZiAoc3RydWN0IHVkcF9taWIpKSA8IDApCi0JCWdvdG8gZXJyX3VkcF9taWI7Ci0JaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYsCisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNiwKKwkJCSAgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYsCiAJCQkgIHNpemVvZiAoc3RydWN0IHVkcF9taWIpKSA8IDApCiAJCWdvdG8gZXJyX3VkcGxpdGVfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcywKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwkJZ290byBlcnJfaXBfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCisJCWdvdG8gZXJyX2ljbXBfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nm1zZ19taWIpKSA8IDApCisJCWdvdG8gZXJyX2ljbXBtc2dfbWliOwogCXJldHVybiAwOwogCi1lcnJfdWRwbGl0ZV9taWI6Ci0Jc25tcF9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKLWVycl91ZHBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2bXNnX3N0YXRpc3RpY3MpOwogZXJyX2ljbXBtc2dfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MpOwogZXJyX2ljbXBfbWliOgotCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzKTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKW5ldC0+bWliLmlwdjZfc3RhdGlzdGljcyk7CiBlcnJfaXBfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYpOworZXJyX3VkcGxpdGVfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNik7CiAJcmV0dXJuIC1FTk9NRU07Ci0KIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9pcHY2X21pYnModm9pZCkKK3N0YXRpYyB2b2lkIF9fbmV0X2V4aXQgaXB2Nl9jbGVhbnVwX21pYnMoc3RydWN0IG5ldCAqbmV0KQogewotCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzKTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nm1zZ19zdGF0aXN0aWNzKTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0c19pbjYpOwotCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKiluZXQtPm1pYi5pcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIuaWNtcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopbmV0LT5taWIuaWNtcHY2bXNnX3N0YXRpc3RpY3MpOwogfQogCi1zdGF0aWMgaW50IGluZXQ2X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3N0YXRpYyBpbnQgX19uZXRfaW5pdCBpbmV0Nl9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJaW50IGVyciA9IDA7CiAKIAluZXQtPmlwdjYuc3lzY3RsLmJpbmR2Nm9ubHkgPSAwOwotCW5ldC0+aXB2Ni5zeXNjdGwuZmx1c2hfZGVsYXkgPSAwOwotCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X21heF9zaXplID0gNDA5NjsKLQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19taW5faW50ZXJ2YWwgPSBIWiAvIDI7Ci0JbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfdGltZW91dCA9IDYwKkhaOwotCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2ludGVydmFsID0gMzAqSFo7Ci0JbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfZWxhc3RpY2l0eSA9IDk7Ci0JbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfbXR1X2V4cGlyZXMgPSAxMCo2MCpIWjsKLQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9taW5fYWR2bXNzID0gSVBWNl9NSU5fTVRVIC0gMjAgLSA0MDsKIAluZXQtPmlwdjYuc3lzY3RsLmljbXB2Nl90aW1lID0gMSpIWjsKIAorCWVyciA9IGlwdjZfaW5pdF9taWJzKG5ldCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWVyciA9IHVkcDZfcHJvY19pbml0KG5ldCk7CiAJaWYgKGVycikKQEAgLTg1OSw3ICs4NTQsNiBAQAogCWVyciA9IGFjNl9wcm9jX2luaXQobmV0KTsKIAlpZiAoZXJyKQogCQlnb3RvIHByb2NfYWM2X2ZhaWw7Ci1vdXQ6CiAjZW5kaWYKIAlyZXR1cm4gZXJyOwogCkBAIC04NjgsNyArODYyLDkgQEAKIAl0Y3A2X3Byb2NfZXhpdChuZXQpOwogcHJvY190Y3A2X2ZhaWw6CiAJdWRwNl9wcm9jX2V4aXQobmV0KTsKLQlnb3RvIG91dDsKK291dDoKKwlpcHY2X2NsZWFudXBfbWlicyhuZXQpOworCXJldHVybiBlcnI7CiAjZW5kaWYKIH0KIApAQCAtODc5LDYgKzg3NSw3IEBACiAJdGNwNl9wcm9jX2V4aXQobmV0KTsKIAlhYzZfcHJvY19leGl0KG5ldCk7CiAjZW5kaWYKKwlpcHY2X2NsZWFudXBfbWlicyhuZXQpOwogfQogCiBzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGluZXQ2X25ldF9vcHMgPSB7CkBAIC05MjksMTEgKzkyNiw2IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfc29ja19yZWdpc3Rlcl9mYWlsOwogCi0JLyogSW5pdGlhbGlzZSBpcHY2IG1pYnMgKi8KLQllcnIgPSBpbml0X2lwdjZfbWlicygpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VucmVnaXN0ZXJfc29jazsKLQogI2lmZGVmIENPTkZJR19TWVNDVEwKIAllcnIgPSBpcHY2X3N0YXRpY19zeXNjdGxfcmVnaXN0ZXIoKTsKIAlpZiAoZXJyKQpAQCAtMTA2Nyw4ICsxMDU5LDYgQEAKIAlpcHY2X3N0YXRpY19zeXNjdGxfdW5yZWdpc3RlcigpOwogc3RhdGljX3N5c2N0bF9mYWlsOgogI2VuZGlmCi0JY2xlYW51cF9pcHY2X21pYnMoKTsKLW91dF91bnJlZ2lzdGVyX3NvY2s6CiAJc29ja191bnJlZ2lzdGVyKFBGX0lORVQ2KTsKIAlydG5sX3VucmVnaXN0ZXJfYWxsKFBGX0lORVQ2KTsKIG91dF9zb2NrX3JlZ2lzdGVyX2ZhaWw6CkBAIC0xMTI1LDcgKzExMTUsNiBAQAogI2lmZGVmIENPTkZJR19TWVNDVEwKIAlpcHY2X3N0YXRpY19zeXNjdGxfdW5yZWdpc3RlcigpOwogI2VuZGlmCi0JY2xlYW51cF9pcHY2X21pYnMoKTsKIAlwcm90b191bnJlZ2lzdGVyKCZyYXd2Nl9wcm90KTsKIAlwcm90b191bnJlZ2lzdGVyKCZ1ZHBsaXRldjZfcHJvdCk7CiAJcHJvdG9fdW5yZWdpc3RlcigmdWRwdjZfcHJvdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggODM3YzgzMC4uNmJmZmZlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIDgpIHx8CiAJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKwogCQkJCSAoKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzKSkpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJSVA2X0lOQ19TVEFUU19CSChkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CkBAIC0zMDEsNyArMzAxLDggQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgoZGV2X25ldChkc3QtPmRldiksCisJCQkgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAlkc3RfcmVsZWFzZShkc3QpOwogCXJldHVybiAtMTsKIH0KQEAgLTMxOSw3ICszMjAsOCBAQAogCWludCBuLCBpOwogCXN0cnVjdCBpcHY2X3J0X2hkciAqaGRyOwogCXN0cnVjdCBydDBfaGRyICpydGhkcjsKLQlpbnQgYWNjZXB0X3NvdXJjZV9yb3V0ZSA9IGRldl9uZXQoc2tiLT5kZXYpLT5pcHY2LmRldmNvbmZfYWxsLT5hY2NlcHRfc291cmNlX3JvdXRlOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kZXYpOworCWludCBhY2NlcHRfc291cmNlX3JvdXRlID0gbmV0LT5pcHY2LmRldmNvbmZfYWxsLT5hY2NlcHRfc291cmNlX3JvdXRlOwogCiAJaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAlpZiAoaWRldikgewpAQCAtMzMxLDcgKzMzMyw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIDgpIHx8CiAJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKwogCQkJCSAoKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzKSkpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKQEAgLTM0MSw3ICszNDMsNyBAQAogCiAJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmlwdjZfaGRyKHNrYiktPmRhZGRyKSB8fAogCSAgICBza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9IT1NUKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CkBAIC0zNTYsNyArMzU4LDcgQEAKIAkJCSAqIHByb2Nlc3NlZCBieSBvd24KIAkJCSAqLwogCQkJaWYgKCFhZGRyKSB7Ci0JCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIC0xOwpAQCAtMzgyLDcgKzM4NCw3IEBACiAJCQlnb3RvIHVua25vd25fcmg7CiAJCS8qIFNpbGVudGx5IGRpc2NhcmQgaW52YWxpZCBSVEggdHlwZSAyICovCiAJCWlmIChoZHItPmhkcmxlbiAhPSAyIHx8IGhkci0+c2VnbWVudHNfbGVmdCAhPSAxKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwpAQCAtNDAxLDcgKzQwMyw3IEBACiAJbiA9IGhkci0+aGRybGVuID4+IDE7CiAKIAlpZiAoaGRyLT5zZWdtZW50c19sZWZ0ID4gbikgewotCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKIAkJCQkgICgoJmhkci0+c2VnbWVudHNfbGVmdCkgLQpAQCAtNDE1LDcgKzQxNyw3IEBACiAJaWYgKHNrYl9jbG9uZWQoc2tiKSkgewogCQkvKiB0aGUgY29weSBpcyBhIGZvcndhcmRlZCBwYWNrZXQgKi8KIAkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtMTsKQEAgLTQzOCwxMyArNDQwLDEzIEBACiAJCWlmICh4ZnJtNl9pbnB1dF9hZGRyKHNrYiwgKHhmcm1fYWRkcmVzc190ICopYWRkciwKIAkJCQkgICAgICh4ZnJtX2FkZHJlc3NfdCAqKSZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCQkgICAgIElQUFJPVE9fUk9VVElORykgPCAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlpZiAoIWlwdjZfY2hrX2hvbWVfYWRkcihkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCBhZGRyKSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gLTE7CkBAIC00NTYsNyArNDU4LDcgQEAKIAl9CiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChhZGRyKSkgewotCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwpAQCAtNDc2LDcgKzQ3OCw3IEBACiAKIAlpZiAoc2tiLT5kc3QtPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSB7CiAJCWlmIChpcHY2X2hkcihza2IpLT5ob3BfbGltaXQgPD0gMSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9USU1FX0VYQ0VFRCwgSUNNUFY2X0VYQ19IT1BMSU1JVCwKIAkJCQkgICAgMCwgc2tiLT5kZXYpOwpAQCAtNDkyLDcgKzQ5NCw3IEBACiAJcmV0dXJuIC0xOwogCiB1bmtub3duX3JoOgotCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAogCQkJICAoJmhkci0+dHlwZSkgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CiAJcmV0dXJuIC0xOwpAQCAtNTc5LDI5ICs1ODEsMzMgQEAKIHsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCXUzMiBwa3RfbGVuOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAKIAlpZiAobmhbb3B0b2ZmICsgMV0gIT0gNCB8fCAob3B0b2ZmICYgMykgIT0gMikgewogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcHY2X2hvcF9qdW1ibzogd3JvbmcganVtYm8gb3B0IGxlbmd0aC9hbGlnbm1lbnQgJWRcbiIsCiAJCQkgICAgICAgbmhbb3B0b2ZmKzFdKTsKLQkJSVA2X0lOQ19TVEFUU19CSChpcHY2X3NrYl9pZGV2KHNrYiksCisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcHY2X3NrYl9pZGV2KHNrYiksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJZ290byBkcm9wOwogCX0KIAogCXBrdF9sZW4gPSBudG9obCgqKF9fYmUzMiAqKShuaCArIG9wdG9mZiArIDIpKTsKIAlpZiAocGt0X2xlbiA8PSBJUFY2X01BWFBMRU4pIHsKLQkJSVA2X0lOQ19TVEFUU19CSChpcHY2X3NrYl9pZGV2KHNrYiksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwdjZfc2tiX2lkZXYoc2tiKSwKKwkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIG9wdG9mZisyKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbikgewotCQlJUDZfSU5DX1NUQVRTX0JIKGlwdjZfc2tiX2lkZXYoc2tiKSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaXB2Nl9za2JfaWRldihza2IpLAorCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBrdF9sZW4gPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpIHsKLQkJSVA2X0lOQ19TVEFUU19CSChpcHY2X3NrYl9pZGV2KHNrYiksIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpcHY2X3NrYl9pZGV2KHNrYiksCisJCQkJIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CiAJCWdvdG8gZHJvcDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ljbXAuYyBiL25ldC9pcHY2L2ljbXAuYwppbmRleCBiMzE1N2EwLi45YjdkMTlhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pY21wLmMKKysrIGIvbmV0L2lwdjYvaWNtcC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAkgKi8KIAlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgc2ssIGZsKTsKIAlpZiAoZHN0LT5lcnJvcikgewotCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLAorCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KGRzdCksCiAJCQkgICAgICBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJfSBlbHNlIGlmIChkc3QtPmRldiAmJiAoZHN0LT5kZXYtPmZsYWdzJklGRl9MT09QQkFDSykpIHsKIAkJcmVzID0gMTsKQEAgLTY2NCw3ICs2NjQsNyBAQAogCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgbmgpOwogCX0KIAotCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5NU0dTKTsKKwlJQ01QNl9JTkNfU1RBVFNfQkgoZGV2X25ldChkZXYpLCBpZGV2LCBJQ01QNl9NSUJfSU5NU0dTKTsKIAogCXNhZGRyID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOwogCWRhZGRyID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwpAQCAtNjkzLDcgKzY5Myw3IEBACiAKIAl0eXBlID0gaGRyLT5pY21wNl90eXBlOwogCi0JSUNNUDZNU0dJTl9JTkNfU1RBVFNfQkgoaWRldiwgdHlwZSk7CisJSUNNUDZNU0dJTl9JTkNfU1RBVFNfQkgoZGV2X25ldChkZXYpLCBpZGV2LCB0eXBlKTsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSUNNUFY2X0VDSE9fUkVRVUVTVDoKQEAgLTc3Miw3ICs3NzIsNyBAQAogCXJldHVybiAwOwogCiBkaXNjYXJkX2l0OgotCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5FUlJPUlMpOworCUlDTVA2X0lOQ19TVEFUU19CSChkZXZfbmV0KGRldiksIGlkZXYsIElDTVA2X01JQl9JTkVSUk9SUyk7CiBkcm9wX25vX2NvdW50OgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2lucHV0LmMgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwppbmRleCA3ZTE0Y2NjLi45MzZmNDg5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwpAQCAtNTksNiArNTksNyBAQAogCXN0cnVjdCBpcHY2aGRyICpoZHI7CiAJdTMyIAkJcGt0X2xlbjsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kZXYpOwogCiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTY5LDExICs3MCwxMSBAQAogCiAJaWRldiA9IF9faW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCi0JSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTlJFQ0VJVkVTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfSU5SRUNFSVZFUyk7CiAKIAlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMIHx8CiAJICAgICFpZGV2IHx8IHVubGlrZWx5KGlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTExOCwxMSArMTE5LDEyIEBACiAJLyogcGt0X2xlbiBtYXkgYmUgemVybyBpZiBKdW1ibyBwYXlsb2FkIG9wdGlvbiBpcyBwcmVzZW50ICovCiAJaWYgKHBrdF9sZW4gfHwgaGRyLT5uZXh0aGRyICE9IE5FWFRIRFJfSE9QKSB7CiAJCWlmIChwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+IHNrYi0+bGVuKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwKKwkJCQkJIGlkZXYsIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CiAJCQlnb3RvIGRyb3A7CiAJCX0KIAkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJZ290byBkcm9wOwogCQl9CiAJCWhkciA9IGlwdjZfaGRyKHNrYik7CkBAIC0xMzAsNyArMTMyLDcgQEAKIAogCWlmIChoZHItPm5leHRoZHIgPT0gTkVYVEhEUl9IT1ApIHsKIAkJaWYgKGlwdjZfcGFyc2VfaG9wb3B0cyhza2IpIDwgMCkgewotCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTQxLDcgKzE0Myw3IEBACiAJcmV0dXJuIE5GX0hPT0soUEZfSU5FVDYsIE5GX0lORVRfUFJFX1JPVVRJTkcsIHNrYiwgZGV2LCBOVUxMLAogCQkgICAgICAgaXA2X3Jjdl9maW5pc2gpOwogZXJyOgotCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiBkcm9wOgogCXJjdV9yZWFkX3VubG9jaygpOwogCWtmcmVlX3NrYihza2IpOwpAQCAtMTYxLDYgKzE2Myw3IEBACiAJaW50IG5leHRoZHIsIHJhdzsKIAl1OCBoYXNoOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRzdC0+ZGV2KTsKIAogCS8qCiAJICoJUGFyc2UgZXh0ZW5zaW9uIGhlYWRlcnMKQEAgLTIwNSwyNCArMjA4LDI1IEBACiAJCWlmIChyZXQgPiAwKQogCQkJZ290byByZXN1Ym1pdDsKIAkJZWxzZSBpZiAocmV0ID09IDApCi0JCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOwogCX0gZWxzZSB7CiAJCWlmICghcmF3KSB7CiAJCQlpZiAoeGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MpOworCQkJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LAorCQkJCQkJIElQU1RBVFNfTUlCX0lOVU5LTk9XTlBST1RPUyk7CiAJCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLAogCQkJCQkgICAgSUNNUFY2X1VOS19ORVhUSERSLCBuaG9mZiwKIAkJCQkJICAgIHNrYi0+ZGV2KTsKIAkJCX0KIAkJfSBlbHNlCi0JCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIDA7CiAKIGRpc2NhcmQ6Ci0JSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CkBAIC0yNDAsNyArMjQ0LDggQEAKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCWludCBkZWxpdmVyOwogCi0JSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTk1DQVNUUEtUUyk7CisJSVA2X0lOQ19TVEFUU19CSChkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLAorCQkJIGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOTUNBU1RQS1RTKTsKIAogCWhkciA9IGlwdjZfaGRyKHNrYik7CiAJZGVsaXZlciA9IGlwdjZfY2hrX21jYXN0X2FkZHIoc2tiLT5kZXYsICZoZHItPmRhZGRyLCBOVUxMKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAwZTg0NGMyLi5jNzdkYjBiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC0xMDMsNyArMTAzLDggQEAKIAllbHNlIGlmIChkc3QtPm5laWdoYm91cikKIAkJcmV0dXJuIGRzdC0+bmVpZ2hib3VyLT5vdXRwdXQoc2tiKTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKGRldl9uZXQoZHN0LT5kZXYpLAorCQkJIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1MCwxMyArMTUxLDE0IEBACiAJCQkJCWlwNl9kZXZfbG9vcGJhY2tfeG1pdCk7CiAKIAkJCWlmIChpcHY2X2hkcihza2IpLT5ob3BfbGltaXQgPT0gMCkgewotCQkJCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQkJCUlQNl9JTkNfU1RBVFMoZGV2X25ldChkZXYpLCBpZGV2LAorCQkJCQkgICAgICBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KIAotCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CisJCUlQNl9JTkNfU1RBVFMoZGV2X25ldChkZXYpLCBpZGV2LCBJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOwogCX0KIAogCXJldHVybiBORl9IT09LKFBGX0lORVQ2LCBORl9JTkVUX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBza2ItPmRldiwKQEAgLTE3NSw3ICsxNzcsOCBAQAogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpOwogCWlmICh1bmxpa2VseShpZGV2LT5jbmYuZGlzYWJsZV9pcHY2KSkgewotCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCBpZGV2LAorCQkJICAgICAgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTk0LDYgKzE5Nyw3IEBACiBpbnQgaXA2X3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsLAogCSAgICAgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsIGludCBpcGZyYWdvaykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBpbjZfYWRkciAqZmlyc3RfaG9wID0gJmZsLT5mbDZfZHN0OwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OwpAQCAtMjE2LDcgKzIyMCw3IEBACiAJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGhlYWRfcm9vbSkgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIGhlYWRfcm9vbSk7CiAJCQlpZiAoc2tiMiA9PSBOVUxMKSB7Ci0JCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCQkgICAgICBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIC1FTk9CVUZTOwpAQCAtMjcwLDcgKzI3NCw3IEBACiAKIAltdHUgPSBkc3RfbXR1KGRzdCk7CiAJaWYgKChza2ItPmxlbiA8PSBtdHUpIHx8IHNrYi0+bG9jYWxfZGYgfHwgc2tiX2lzX2dzbyhza2IpKSB7Ci0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkgICAgICBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJCXJldHVybiBORl9IT09LKFBGX0lORVQ2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwKIAkJCQlkc3Rfb3V0cHV0KTsKQEAgLTI4MCw3ICsyODQsNyBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiSVB2Njogc2VuZGluZyBwa3RfdG9vX2JpZyB0byBzZWxmXG4iKTsKIAlza2ItPmRldiA9IGRzdC0+ZGV2OwogCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOwotCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQpAQCAtNDIyLDcgKzQyNiw3IEBACiAJCWdvdG8gZHJvcDsKIAogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0ZXRCwgc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJZ290byBkcm9wOwogCX0KIApAQCAtNDU1LDcgKzQ1OSw4IEBACiAJCXNrYi0+ZGV2ID0gZHN0LT5kZXY7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULAogCQkJICAgIDAsIHNrYi0+ZGV2KTsKLQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwKKwkJCQkgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC00NjgsMTMgKzQ3MywxNCBAQAogCQlpZiAocHJveGllZCA+IDApCiAJCQlyZXR1cm4gaXA2X2lucHV0KHNrYik7CiAJCWVsc2UgaWYgKHByb3hpZWQgPCAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKKwkJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoZHN0KSwKKwkJCQkgICAgICBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJCWdvdG8gZHJvcDsKIAkJfQogCX0KIAogCWlmICgheGZybTZfcm91dGVfZm9yd2FyZChza2IpKSB7Ci0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOwogCQlnb3RvIGRyb3A7CiAJfQogCWRzdCA9IHNrYi0+ZHN0OwpAQCAtNTIzLDE0ICs1MjksMTYgQEAKIAkJLyogQWdhaW4sIGZvcmNlIE9VVFBVVCBkZXZpY2UgdXNlZCBhcyBzb3VyY2UgYWRkcmVzcyAqLwogCQlza2ItPmRldiA9IGRzdC0+ZGV2OwogCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBkc3RfbXR1KGRzdCksIHNrYi0+ZGV2KTsKLQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMpOwotCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQlJUDZfSU5DX1NUQVRTX0JIKG5ldCwKKwkJCQkgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOVE9PQklHRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsCisJCQkJIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKIAlpZiAoc2tiX2Nvdyhza2IsIGRzdC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pKSB7Ci0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCWdvdG8gZHJvcDsKIAl9CiAKQEAgLTU0MCwxMiArNTQ4LDEyIEBACiAKIAloZHItPmhvcF9saW1pdC0tOwogCi0JSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfT1VURk9SV0RBVEFHUkFNUyk7CisJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9PVVRGT1JXREFUQUdSQU1TKTsKIAlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSU5FVF9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBkc3QtPmRldiwKIAkJICAgICAgIGlwNl9mb3J3YXJkX2ZpbmlzaCk7CiAKIGVycm9yOgotCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CisJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTYxMyw3ICs2MjEsNiBAQAogCiBzdGF0aWMgaW50IGlwNl9mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKCpvdXRwdXQpKHN0cnVjdCBza19idWZmICopKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNrX2J1ZmYgKmZyYWc7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8qKXNrYi0+ZHN0OwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IHNrYi0+c2sgPyBpbmV0Nl9zayhza2ItPnNrKSA6IE5VTEw7CkBAIC02MjMsOCArNjMwLDggQEAKIAlfX2JlMzIgZnJhZ19pZCA9IDA7CiAJaW50IHB0ciwgb2Zmc2V0ID0gMCwgZXJyPTA7CiAJdTggKnByZXZoZHIsIG5leHRoZHIgPSAwOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAKLQlkZXYgPSBydC0+dS5kc3QuZGV2OwogCWhsZW4gPSBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgJnByZXZoZHIpOwogCW5leHRoZHIgPSAqcHJldmhkcjsKIApAQCAtNjM3LDcgKzY0NCw4IEBACiAJaWYgKCFza2ItPmxvY2FsX2RmKSB7CiAJCXNrYi0+ZGV2ID0gc2tiLT5kc3QtPmRldjsKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1LCBza2ItPmRldik7Ci0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CkBAIC02ODYsNyArNjk0LDggQEAKIAkJKnByZXZoZHIgPSBORVhUSERSX0ZSQUdNRU5UOwogCQl0bXBfaGRyID0ga21lbWR1cChza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdG1wX2hkcikgewotCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTczNyw3ICs3NDYsOCBAQAogCiAJCQllcnIgPSBvdXRwdXQoc2tiKTsKIAkJCWlmKCFlcnIpCi0JCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksIElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKKwkJCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpLAorCQkJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CiAKIAkJCWlmIChlcnIgfHwgIWZyYWcpCiAJCQkJYnJlYWs7CkBAIC03NTAsNyArNzYwLDggQEAKIAkJa2ZyZWUodG1wX2hkcik7CiAKIAkJaWYgKGVyciA9PSAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldigmcnQtPnUuZHN0KSwgSVBTVEFUU19NSUJfRlJBR09LUyk7CisJCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpLAorCQkJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdPS1MpOwogCQkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtNzYxLDcgKzc3Miw4IEBACiAJCQlmcmFnID0gc2tiOwogCQl9CiAKLQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoJnJ0LT51LmRzdCksCisJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC03OTUsNyArODA3LDcgQEAKIAogCQlpZiAoKGZyYWcgPSBhbGxvY19za2IobGVuK2hsZW4rc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikrTExfQUxMT0NBVEVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQkJTkVUREVCVUcoS0VSTl9JTkZPICJJUHY2OiBmcmFnOiBubyBtZW1vcnkgZm9yIG5ldyBmcmFnbWVudCFcbiIpOwotCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWw7CkBAIC04NTksMTUgKzg3MSwxNiBAQAogCQlpZiAoZXJyKQogCQkJZ290byBmYWlsOwogCi0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpOworCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKIAl9Ci0JSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkgICAgICBJUFNUQVRTX01JQl9GUkFHT0tTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gZXJyOwogCiBmYWlsOgotCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gZXJyOwpAQCAtOTQzLDQ2ICs5NTYsNDYgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAotCQkvKgotCQkgKiBIZXJlIGlmIHRoZSBkc3QgZW50cnkgd2UndmUgbG9va2VkIHVwCi0JCSAqIGhhcyBhIG5laWdoYm91ciBlbnRyeSB0aGF0IGlzIGluIHRoZSBJTkNPTVBMRVRFCi0JCSAqIHN0YXRlIGFuZCB0aGUgc3JjIGFkZHJlc3MgZnJvbSB0aGUgZmxvdyBpcwotCQkgKiBtYXJrZWQgYXMgT1BUSU1JU1RJQywgd2UgcmVsZWFzZSB0aGUgZm91bmQKLQkJICogZHN0IGVudHJ5IGFuZCByZXBsYWNlIGl0IGluc3RlYWQgd2l0aCB0aGUKLQkJICogZHN0IGVudHJ5IG9mIHRoZSBuZXh0aG9wIHJvdXRlcgotCQkgKi8KLQkJaWYgKCEoKCpkc3QpLT5uZWlnaGJvdXItPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKLQkJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKLQkJCXN0cnVjdCBmbG93aSBmbF9ndzsKLQkJCWludCByZWRpcmVjdDsKKwkvKgorCSAqIEhlcmUgaWYgdGhlIGRzdCBlbnRyeSB3ZSd2ZSBsb29rZWQgdXAKKwkgKiBoYXMgYSBuZWlnaGJvdXIgZW50cnkgdGhhdCBpcyBpbiB0aGUgSU5DT01QTEVURQorCSAqIHN0YXRlIGFuZCB0aGUgc3JjIGFkZHJlc3MgZnJvbSB0aGUgZmxvdyBpcworCSAqIG1hcmtlZCBhcyBPUFRJTUlTVElDLCB3ZSByZWxlYXNlIHRoZSBmb3VuZAorCSAqIGRzdCBlbnRyeSBhbmQgcmVwbGFjZSBpdCBpbnN0ZWFkIHdpdGggdGhlCisJICogZHN0IGVudHJ5IG9mIHRoZSBuZXh0aG9wIHJvdXRlcgorCSAqLworCWlmICgoKmRzdCktPm5laWdoYm91ciAmJiAhKCgqZHN0KS0+bmVpZ2hib3VyLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CisJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKKwkJc3RydWN0IGZsb3dpIGZsX2d3OworCQlpbnQgcmVkaXJlY3Q7CiAKLQkJCWlmcCA9IGlwdjZfZ2V0X2lmYWRkcihuZXQsICZmbC0+Zmw2X3NyYywKLQkJCQkJICAgICAgKCpkc3QpLT5kZXYsIDEpOworCQlpZnAgPSBpcHY2X2dldF9pZmFkZHIobmV0LCAmZmwtPmZsNl9zcmMsCisJCQkJICAgICAgKCpkc3QpLT5kZXYsIDEpOwogCi0JCQlyZWRpcmVjdCA9IChpZnAgJiYgaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpOwotCQkJaWYgKGlmcCkKLQkJCQlpbjZfaWZhX3B1dChpZnApOworCQlyZWRpcmVjdCA9IChpZnAgJiYgaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpOworCQlpZiAoaWZwKQorCQkJaW42X2lmYV9wdXQoaWZwKTsKIAotCQkJaWYgKHJlZGlyZWN0KSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBuZWVkIHRvIGdldCB0aGUgZHN0IGVudHJ5IGZvciB0aGUKLQkJCQkgKiBkZWZhdWx0IHJvdXRlciBpbnN0ZWFkCi0JCQkJICovCi0JCQkJZHN0X3JlbGVhc2UoKmRzdCk7Ci0JCQkJbWVtY3B5KCZmbF9ndywgZmwsIHNpemVvZihzdHJ1Y3QgZmxvd2kpKTsKLQkJCQltZW1zZXQoJmZsX2d3LmZsNl9kc3QsIDAsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQkJCQkqZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrLCAmZmxfZ3cpOwotCQkJCWlmICgoZXJyID0gKCpkc3QpLT5lcnJvcikpCi0JCQkJCWdvdG8gb3V0X2Vycl9yZWxlYXNlOwotCQkJfQorCQlpZiAocmVkaXJlY3QpIHsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGdldCB0aGUgZHN0IGVudHJ5IGZvciB0aGUKKwkJCSAqIGRlZmF1bHQgcm91dGVyIGluc3RlYWQKKwkJCSAqLworCQkJZHN0X3JlbGVhc2UoKmRzdCk7CisJCQltZW1jcHkoJmZsX2d3LCBmbCwgc2l6ZW9mKHN0cnVjdCBmbG93aSkpOworCQkJbWVtc2V0KCZmbF9ndy5mbDZfZHN0LCAwLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkqZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrLCAmZmxfZ3cpOworCQkJaWYgKChlcnIgPSAoKmRzdCktPmVycm9yKSkKKwkJCQlnb3RvIG91dF9lcnJfcmVsZWFzZTsKIAkJfQorCX0KICNlbmRpZgogCiAJcmV0dXJuIDA7CiAKIG91dF9lcnJfcmVsZWFzZToKIAlpZiAoZXJyID09IC1FTkVUVU5SRUFDSCkKLQkJSVA2X0lOQ19TVEFUU19CSChOVUxMLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBOVUxMLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJZHN0X3JlbGVhc2UoKmRzdCk7CiAJKmRzdCA9IE5VTEw7CiAJcmV0dXJuIGVycjsKQEAgLTEzODcsNyArMTQwMCw3IEBACiAJcmV0dXJuIDA7CiBlcnJvcjoKIAlpbmV0LT5jb3JrLmxlbmd0aCAtPSBsZW5ndGg7Ci0JSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJSVA2X0lOQ19TVEFUUyhzb2NrX25ldChzayksIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNDExLDYgKzE0MjQsNyBAQAogCXN0cnVjdCBpbjZfYWRkciBmaW5hbF9kc3RfYnVmLCAqZmluYWxfZHN0ID0gJmZpbmFsX2RzdF9idWY7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IGlwdjZoZHIgKmhkcjsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCA9IG5wLT5jb3JrLm9wdDsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWluZXQtPmNvcmsuZHN0OwpAQCAtMTQ2NCwxMiArMTQ3OCwxMiBAQAogCXNrYi0+bWFyayA9IHNrLT5za19tYXJrOwogCiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7Ci0JSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhuZXQsIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAlpZiAocHJvdG8gPT0gSVBQUk9UT19JQ01QVjYpIHsKIAkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlwNl9kc3RfaWRldihza2ItPmRzdCk7CiAKLQkJSUNNUDZNU0dPVVRfSU5DX1NUQVRTX0JIKGlkZXYsIGljbXA2X2hkcihza2IpLT5pY21wNl90eXBlKTsKLQkJSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwkJSUNNUDZNU0dPVVRfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgaWNtcDZfaGRyKHNrYiktPmljbXA2X3R5cGUpOworCQlJQ01QNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CiAJfQogCiAJZXJyID0gaXA2X2xvY2FsX291dChza2IpOwpAQCAtMTQ5Myw3ICsxNTA3LDcgQEAKIAogCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7CiAJCWlmIChza2ItPmRzdCkKLQkJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCUlQNl9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAogCQkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IDE3YzdiMDkuLjY0Y2UzZDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTEwNTAsMTAgKzEwNTAsMTAgQEAKIAl9CiAKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlyZXQgPSBpcDRpcDZfdG5sX3htaXQoc2tiLCBkZXYpOwogCQlicmVhazsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAkJcmV0ID0gaXA2aXA2X3RubF94bWl0KHNrYiwgZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDA5NWJjNDUuLjE4MmY4YTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMTM4Myw3ICsxMzgzLDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXA2bXJfZm9yd2FyZDJfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9PVVRGT1JXREFUQUdSQU1TKTsKKwlJUDZfSU5DX1NUQVRTX0JIKGRldl9uZXQoc2tiLT5kc3QtPmRldiksIGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkgSVBTVEFUU19NSUJfT1VURk9SV0RBVEFHUkFNUyk7CiAJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKaW5kZXggZTdjMDNiYy4uZDdiM2M2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWNhc3QuYworKysgYi9uZXQvaXB2Ni9tY2FzdC5jCkBAIC0xNDQ2LDcgKzE0NDYsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IGZsb3dpIGZsOwogCi0JSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAlwYXlsb2FkX2xlbiA9IChza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyKSAtIHNpemVvZigqcGlwNik7CiAJbWxkbGVuID0gc2tiLT50YWlsIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOwogCXBpcDYtPnBheWxvYWRfbGVuID0gaHRvbnMocGF5bG9hZF9sZW4pOwpAQCAtMTQ3NCwxMSArMTQ3NCwxMSBAQAogCQkgICAgICBkc3Rfb3V0cHV0KTsKIG91dDoKIAlpZiAoIWVycikgewotCQlJQ01QNk1TR09VVF9JTkNfU1RBVFNfQkgoaWRldiwgSUNNUFY2X01MRDJfUkVQT1JUKTsKLQkJSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKLQkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCQlJQ01QNk1TR09VVF9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJQ01QVjZfTUxEMl9SRVBPUlQpOworCQlJQ01QNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOwogCX0gZWxzZQotCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKIAkJaW42X2Rldl9wdXQoaWRldik7CkBAIC0xNzcxLDcgKzE3NzEsNyBAQAogCXN0cnVjdCBmbG93aSBmbDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlJUDZfSU5DX1NUQVRTKF9faW42X2Rldl9nZXQoZGV2KSwKKwlJUDZfSU5DX1NUQVRTKG5ldCwgX19pbjZfZGV2X2dldChkZXYpLAogCQkgICAgICBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKHR5cGUgPT0gSUNNUFY2X01HTV9SRURVQ1RJT04pCkBAIC0xNzg3LDcgKzE3ODcsNyBAQAogCiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJSVA2X0lOQ19TVEFUUyhfX2luNl9kZXZfZ2V0KGRldiksCisJCUlQNl9JTkNfU1RBVFMobmV0LCBfX2luNl9kZXZfZ2V0KGRldiksCiAJCQkgICAgICBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm47CkBAIC0xODM5LDExICsxODM5LDExIEBACiAJCSAgICAgIGRzdF9vdXRwdXQpOwogb3V0OgogCWlmICghZXJyKSB7Ci0JCUlDTVA2TVNHT1VUX0lOQ19TVEFUUyhpZGV2LCB0eXBlKTsKLQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKLQkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCQlJQ01QNk1TR09VVF9JTkNfU1RBVFMobmV0LCBpZGV2LCB0eXBlKTsKKwkJSUNNUDZfSU5DX1NUQVRTKG5ldCwgaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOworCQlJUDZfSU5DX1NUQVRTKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKIAl9IGVsc2UKLQkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCUlQNl9JTkNfU1RBVFMobmV0LCBpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAKIAlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCiAJCWluNl9kZXZfcHV0KGlkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggZjFjNjJiYS4uMTcyNDM4MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC01MTYsMTMgKzUxNiwxMyBAQAogCXNrYi0+ZHN0ID0gZHN0OwogCiAJaWRldiA9IGluNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlJUDZfSU5DX1NUQVRTKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsCiAJCSAgICAgIGRzdF9vdXRwdXQpOwogCWlmICghZXJyKSB7Ci0JCUlDTVA2TVNHT1VUX0lOQ19TVEFUUyhpZGV2LCB0eXBlKTsKLQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKKwkJSUNNUDZNU0dPVVRfSU5DX1NUQVRTKG5ldCwgaWRldiwgdHlwZSk7CisJCUlDTVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKIAl9CiAKIAlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCkBAIC0xMTk5LDcgKzExOTksNyBAQAogCQl9CiAJCW5laWdoLT5mbGFncyB8PSBOVEZfUk9VVEVSOwogCX0gZWxzZSBpZiAocnQpIHsKLQkJcnQtPnJ0NmlfZmxhZ3MgfD0gKHJ0LT5ydDZpX2ZsYWdzICYgflJURl9QUkVGX01BU0spIHwgUlRGX1BSRUYocHJlZik7CisJCXJ0LT5ydDZpX2ZsYWdzID0gKHJ0LT5ydDZpX2ZsYWdzICYgflJURl9QUkVGX01BU0spIHwgUlRGX1BSRUYocHJlZik7CiAJfQogCiAJaWYgKHJ0KQpAQCAtMTU4MSwxMiArMTU4MSwxMiBAQAogCiAJYnVmZi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhuZXQsIGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JTkVUX0xPQ0FMX09VVCwgYnVmZiwgTlVMTCwgZHN0LT5kZXYsCiAJCSAgICAgIGRzdF9vdXRwdXQpOwogCWlmICghZXJyKSB7Ci0JCUlDTVA2TVNHT1VUX0lOQ19TVEFUUyhpZGV2LCBORElTQ19SRURJUkVDVCk7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CisJCUlDTVA2TVNHT1VUX0lOQ19TVEFUUyhuZXQsIGlkZXYsIE5ESVNDX1JFRElSRUNUKTsKKwkJSUNNUDZfSU5DX1NUQVRTKG5ldCwgaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOwogCX0KIAogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKQEAgLTE3MzAsOSArMTczMCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsIGludCBfX3VzZXIgKm5hbWUsCi0JCQkJIGludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLAotCQkJCSBzaXplX3QgX191c2VyICpvbGRsZW5wLAoraW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsCisJCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGN0bC0+ZXh0cmExOwpAQCAtMTc0NSwxMyArMTc0NCwxMSBAQAogCiAJc3dpdGNoIChjdGwtPmN0bF9uYW1lKSB7CiAJY2FzZSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUU6Ci0JCXJldCA9IHN5c2N0bF9qaWZmaWVzKGN0bCwgbmFtZSwgbmxlbiwKLQkJCQkgICAgIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOworCQlyZXQgPSBzeXNjdGxfamlmZmllcyhjdGwsIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCQlicmVhazsKIAljYXNlIE5FVF9ORUlHSF9SRVRSQU5TX1RJTUVfTVM6CiAJY2FzZSBORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUVfTVM6Ci0JCSByZXQgPSBzeXNjdGxfbXNfamlmZmllcyhjdGwsIG5hbWUsIG5sZW4sCi0JCQkJCSBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKKwkJIHJldCA9IHN5c2N0bF9tc19qaWZmaWVzKGN0bCwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJCSBicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwppbmRleCA4YzZjNWU3Li5mZDViM2E0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwpAQCAtMTIsNiArMTIsNyBAQAogCiBpbnQgaXA2X3JvdXRlX21lX2hhcmRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBmbG93aSBmbCA9IHsKQEAgLTIzLDcgKzI0LDcgQEAKIAkJICAgIC5zYWRkciA9IGlwaC0+c2FkZHIsIH0gfSwKIAl9OwogCi0JZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIHNrYi0+c2ssICZmbCk7CisJZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrYi0+c2ssICZmbCk7CiAKICNpZmRlZiBDT05GSUdfWEZSTQogCWlmICghKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1hGUk1fVFJBTlNGT1JNRUQpICYmCkBAIC0zMyw3ICszNCw3IEBACiAjZW5kaWYKIAogCWlmIChkc3QtPmVycm9yKSB7Ci0JCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgImlwNl9yb3V0ZV9tZV9oYXJkZXI6IE5vIG1vcmUgcm91dGUuXG4iKTsKIAkJZHN0X3JlbGVhc2UoZHN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDBjZmNjZTcuLjUzZWE1MTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC01NSwzMCArNTUsMjkgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIElQNl9ORl9JUFRBQkxFUworCiAjIFRoZSBzaW1wbGUgbWF0Y2hlcy4KLWNvbmZpZyBJUDZfTkZfTUFUQ0hfUlQKLQl0cmlzdGF0ZSAnInJ0IiBSb3V0aW5nIGhlYWRlciBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCitjb25maWcgSVA2X05GX01BVENIX0FICisJdHJpc3RhdGUgJyJhaCIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKLQkgIHJ0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgcm91dGluZwotCSAgaGVhZGVyIG9mIHRoZSBwYWNrZXQuCisJICBUaGlzIG1vZHVsZSBhbGxvd3Mgb25lIHRvIG1hdGNoIEFIIHBhY2tldHMuCiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX01BVENIX09QVFMKLQl0cmlzdGF0ZSAnImhvcGJ5aG9wIiBhbmQgImRzdCIgb3B0cyBoZWFkZXIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUworY29uZmlnIElQNl9ORl9NQVRDSF9FVUk2NAorCXRyaXN0YXRlICciZXVpNjQiIGFkZHJlc3MgY2hlY2snCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCi0JICBUaGlzIGFsbG93cyBvbmUgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgaG9wLWJ5LWhvcAotCSAgYW5kIGRlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVycyBvZiBhIHBhY2tldC4KKwkgIFRoaXMgbW9kdWxlIHBlcmZvcm1zIGNoZWNraW5nIG9uIHRoZSBJUHY2IHNvdXJjZSBhZGRyZXNzCisJICBDb21wYXJlcyB0aGUgbGFzdCA2NCBiaXRzIHdpdGggdGhlIEVVSTY0IChkZWxpdmVyZWQKKwkgIGZyb20gdGhlIE1BQyBhZGRyZXNzKSBhZGRyZXNzCiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgSVA2X05GX01BVENIX0ZSQUcKIAl0cmlzdGF0ZSAnImZyYWciIEZyYWdtZW50YXRpb24gaGVhZGVyIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIGZyYWcgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZSBmcmFnbWVudGF0aW9uCkBAIC04Niw5ICs4NSwxNyBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQNl9ORl9NQVRDSF9PUFRTCisJdHJpc3RhdGUgJyJoYmgiIGhvcC1ieS1ob3AgYW5kICJkc3QiIG9wdHMgaGVhZGVyIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwloZWxwCisJICBUaGlzIGFsbG93cyBvbmUgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgaG9wLWJ5LWhvcAorCSAgYW5kIGRlc3RpbmF0aW9uIG9wdGlvbnMgaGVhZGVycyBvZiBhIHBhY2tldC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUDZfTkZfTUFUQ0hfSEwKIAl0cmlzdGF0ZSAnImhsIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBITCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIGhvcApAQCAtOTgsNyArMTA1LDYgQEAKIAogY29uZmlnIElQNl9ORl9NQVRDSF9JUFY2SEVBREVSCiAJdHJpc3RhdGUgJyJpcHY2aGVhZGVyIiBJUHY2IEV4dGVuc2lvbiBIZWFkZXJzIE1hdGNoJwotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJaGVscAogCSAgVGhpcyBtb2R1bGUgYWxsb3dzIG9uZSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIHVwb24KQEAgLTEwNiwzOSArMTEyLDM1IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX01BVENIX0FICi0JdHJpc3RhdGUgJyJhaCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECi0JaGVscAotCSAgVGhpcyBtb2R1bGUgYWxsb3dzIG9uZSB0byBtYXRjaCBBSCBwYWNrZXRzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQVRDSF9NSAogCXRyaXN0YXRlICcibWgiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIGFsbG93cyBvbmUgdG8gbWF0Y2ggTUggcGFja2V0cy4KIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfTUFUQ0hfRVVJNjQKLQl0cmlzdGF0ZSAnImV1aTY0IiBhZGRyZXNzIGNoZWNrJwotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCitjb25maWcgSVA2X05GX01BVENIX1JUCisJdHJpc3RhdGUgJyJydCIgUm91dGluZyBoZWFkZXIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKLQkgIFRoaXMgbW9kdWxlIHBlcmZvcm1zIGNoZWNraW5nIG9uIHRoZSBJUHY2IHNvdXJjZSBhZGRyZXNzCi0JICBDb21wYXJlcyB0aGUgbGFzdCA2NCBiaXRzIHdpdGggdGhlIEVVSTY0IChkZWxpdmVyZWQKLQkgIGZyb20gdGhlIE1BQyBhZGRyZXNzKSBhZGRyZXNzCisJICBydCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHJvdXRpbmcKKwkgIGhlYWRlciBvZiB0aGUgcGFja2V0LgogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogIyBUaGUgdGFyZ2V0cworY29uZmlnIElQNl9ORl9UQVJHRVRfTE9HCisJdHJpc3RhdGUgIkxPRyB0YXJnZXQgc3VwcG9ydCIKKwlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYExPRycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBydWxlcyBpbgorCSAgYW55IGlwdGFibGVzIHRhYmxlIHdoaWNoIHJlY29yZHMgdGhlIHBhY2tldCBoZWFkZXIgdG8gdGhlIHN5c2xvZy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUDZfTkZfRklMVEVSCiAJdHJpc3RhdGUgIlBhY2tldCBmaWx0ZXJpbmciCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBQYWNrZXQgZmlsdGVyaW5nIGRlZmluZXMgYSB0YWJsZSBgZmlsdGVyJywgd2hpY2ggaGFzIGEgc2VyaWVzIG9mCkBAIC0xNDcsMTYgKzE0OSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX1RBUkdFVF9MT0cKLQl0cmlzdGF0ZSAiTE9HIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVA2X05GX0ZJTFRFUgotCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTE9HJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzIGluCi0JICBhbnkgaXB0YWJsZXMgdGFibGUgd2hpY2ggcmVjb3JkcyB0aGUgcGFja2V0IGhlYWRlciB0byB0aGUgc3lzbG9nLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9UQVJHRVRfUkVKRUNUCiAJdHJpc3RhdGUgIlJFSkVDVCB0YXJnZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQNl9ORl9GSUxURVIKQEAgLTE3MCw3ICsxNjIsNiBAQAogCiBjb25maWcgSVA2X05GX01BTkdMRQogCXRyaXN0YXRlICJQYWNrZXQgbWFuZ2xpbmciCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIGEgYG1hbmdsZScgdGFibGUgdG8gaXB0YWJsZXM6IHNlZSB0aGUgbWFuIHBhZ2UgZm9yCkBAIC0xOTgsNyArMTg5LDYgQEAKIAogY29uZmlnIElQNl9ORl9SQVcKIAl0cmlzdGF0ZSAgJ3JhdyB0YWJsZSBzdXBwb3J0IChyZXF1aXJlZCBmb3IgVFJBQ0UpJwotCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHJhdycgdGFibGUgdG8gaXA2dGFibGVzLiBUaGlzIHRhYmxlIGlzIHRoZSB2ZXJ5CkBAIC0yMTEsNyArMjAxLDYgQEAKICMgc2VjdXJpdHkgdGFibGUgZm9yIE1BQyBwb2xpY3kKIGNvbmZpZyBJUDZfTkZfU0VDVVJJVFkKICAgICAgICB0cmlzdGF0ZSAiU2VjdXJpdHkgdGFibGUiCi0gICAgICAgZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKICAgICAgICBkZXBlbmRzIG9uIFNFQ1VSSVRZCiAgICAgICAgZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKICAgICAgICBoZWxwCkBAIC0yMjAsNSArMjA5LDcgQEAKICAgICAgICAgCiAgICAgICAgICBJZiB1bnN1cmUsIHNheSBOLgogCitlbmRpZiAjIElQNl9ORl9JUFRBQkxFUworCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDBiNDU1N2UuLmEzMzQ4NWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMjAwLDMyICsyMDAsMjUgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotaXA2dF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitpcDZ0X2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQlwcmludGsoImlwNl90YWJsZXM6IGVycm9yOiBgJXMnXG4iLCAoY2hhciAqKXRhcmdpbmZvKTsKKwkJcHJpbnRrKCJpcDZfdGFibGVzOiBlcnJvcjogYCVzJ1xuIiwKKwkJICAgICAgIChjb25zdCBjaGFyICopcGFyLT50YXJnaW5mbyk7CiAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KIAogLyogUGVyZm9ybWFuY2UgY3JpdGljYWwgLSBjYWxsZWQgZm9yIGV2ZXJ5IHBhY2tldCAqLwogc3RhdGljIGlubGluZSBib29sCi1kb19tYXRjaChzdHJ1Y3QgaXA2dF9lbnRyeV9tYXRjaCAqbSwKLQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgIGludCBvZmZzZXQsCi0JICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICAgICAgYm9vbCAqaG90ZHJvcCkKK2RvX21hdGNoKHN0cnVjdCBpcDZ0X2VudHJ5X21hdGNoICptLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKKwlwYXItPm1hdGNoICAgICA9IG0tPnUua2VybmVsLm1hdGNoOworCXBhci0+bWF0Y2hpbmZvID0gbS0+ZGF0YTsKKwogCS8qIFN0b3AgaXRlcmF0aW9uIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggKi8KLQlpZiAoIW0tPnUua2VybmVsLm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPnUua2VybmVsLm1hdGNoLCBtLT5kYXRhLAotCQkJCSAgICAgIG9mZnNldCwgcHJvdG9mZiwgaG90ZHJvcCkpCisJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBwYXIpKQogCQlyZXR1cm4gdHJ1ZTsKIAllbHNlCiAJCXJldHVybiBmYWxzZTsKQEAgLTM1NSw4ICszNDgsNiBAQAogCSAgICAgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOwotCWludCBvZmZzZXQgPSAwOwotCXVuc2lnbmVkIGludCBwcm90b2ZmID0gMDsKIAlib29sIGhvdGRyb3AgPSBmYWxzZTsKIAkvKiBJbml0aWFsaXppbmcgdmVyZGljdCB0byBORl9EUk9QIGtlZXBzIGdjYyBoYXBweS4gKi8KIAl1bnNpZ25lZCBpbnQgdmVyZGljdCA9IE5GX0RST1A7CkBAIC0zNjQsNiArMzU1LDggQEAKIAl2b2lkICp0YWJsZV9iYXNlOwogCXN0cnVjdCBpcDZ0X2VudHJ5ICplLCAqYmFjazsKIAlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKKwlzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gbXRwYXI7CisJc3RydWN0IHh0X3RhcmdldF9wYXJhbSB0Z3BhcjsKIAogCS8qIEluaXRpYWxpemF0aW9uICovCiAJaW5kZXYgPSBpbiA/IGluLT5uYW1lIDogbnVsbGRldm5hbWU7CkBAIC0zNzQsNiArMzY3LDExIEBACiAJICogdGhpbmdzIHdlIGRvbid0IGtub3csIGllLiB0Y3Agc3luIGZsYWcgb3IgcG9ydHMpLiAgSWYgdGhlCiAJICogcnVsZSBpcyBhbHNvIGEgZnJhZ21lbnQtc3BlY2lmaWMgcnVsZSwgbm9uLWZyYWdtZW50cyB3b24ndAogCSAqIG1hdGNoIGl0LiAqLworCW10cGFyLmhvdGRyb3AgPSAmaG90ZHJvcDsKKwltdHBhci5pbiAgICAgID0gdGdwYXIuaW4gID0gaW47CisJbXRwYXIub3V0ICAgICA9IHRncGFyLm91dCA9IG91dDsKKwltdHBhci5mYW1pbHkgID0gdGdwYXIuZmFtaWx5ID0gTkZQUk9UT19JUFY2OworCXRncGFyLmhvb2tudW0gPSBob29rOwogCiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAJSVBfTkZfQVNTRVJUKHRhYmxlLT52YWxpZF9ob29rcyAmICgxIDw8IGhvb2spKTsKQEAgLTM4OCwxMiArMzg2LDEwIEBACiAJCUlQX05GX0FTU0VSVChlKTsKIAkJSVBfTkZfQVNTRVJUKGJhY2spOwogCQlpZiAoaXA2X3BhY2tldF9tYXRjaChza2IsIGluZGV2LCBvdXRkZXYsICZlLT5pcHY2LAotCQkJJnByb3RvZmYsICZvZmZzZXQsICZob3Rkcm9wKSkgeworCQkJJm10cGFyLnRob2ZmLCAmbXRwYXIuZnJhZ29mZiwgJmhvdGRyb3ApKSB7CiAJCQlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgKnQ7CiAKLQkJCWlmIChJUDZUX01BVENIX0lURVJBVEUoZSwgZG9fbWF0Y2gsCi0JCQkJCSAgICAgICBza2IsIGluLCBvdXQsCi0JCQkJCSAgICAgICBvZmZzZXQsIHByb3RvZmYsICZob3Rkcm9wKSAhPSAwKQorCQkJaWYgKElQNlRfTUFUQ0hfSVRFUkFURShlLCBkb19tYXRjaCwgc2tiLCAmbXRwYXIpICE9IDApCiAJCQkJZ290byBub19tYXRjaDsKIAogCQkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsCkBAIC00NDEsMTUgKzQzNywxNSBAQAogCQkJfSBlbHNlIHsKIAkJCQkvKiBUYXJnZXRzIHdoaWNoIHJlZW50ZXIgbXVzdCByZXR1cm4KIAkJCQkgICBhYnMuIHZlcmRpY3RzICovCisJCQkJdGdwYXIudGFyZ2V0ICAgPSB0LT51Lmtlcm5lbC50YXJnZXQ7CisJCQkJdGdwYXIudGFyZ2luZm8gPSB0LT5kYXRhOworCiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogCQkJCSgoc3RydWN0IGlwNnRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20KIAkJCQkJPSAweGVlZWVlZWVjOwogI2VuZGlmCiAJCQkJdmVyZGljdCA9IHQtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KHNrYiwKLQkJCQkJCQkJICAgICBpbiwgb3V0LAotCQkJCQkJCQkgICAgIGhvb2ssCi0JCQkJCQkJCSAgICAgdC0+dS5rZXJuZWwudGFyZ2V0LAotCQkJCQkJCQkgICAgIHQtPmRhdGEpOworCQkJCQkJCQkgICAgICZ0Z3Bhcik7CiAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCiAJCQkJaWYgKCgoc3RydWN0IGlwNnRfZW50cnkgKil0YWJsZV9iYXNlKS0+Y29tZWZyb20KQEAgLTYwMiwxMiArNTk4LDE3IEBACiBzdGF0aWMgaW50CiBjbGVhbnVwX21hdGNoKHN0cnVjdCBpcDZ0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKmkpCiB7CisJc3RydWN0IHh0X210ZHRvcl9wYXJhbSBwYXI7CisKIAlpZiAoaSAmJiAoKmkpLS0gPT0gMCkKIAkJcmV0dXJuIDE7CiAKLQlpZiAobS0+dS5rZXJuZWwubWF0Y2gtPmRlc3Ryb3kpCi0JCW0tPnUua2VybmVsLm1hdGNoLT5kZXN0cm95KG0tPnUua2VybmVsLm1hdGNoLCBtLT5kYXRhKTsKLQltb2R1bGVfcHV0KG0tPnUua2VybmVsLm1hdGNoLT5tZSk7CisJcGFyLm1hdGNoICAgICA9IG0tPnUua2VybmVsLm1hdGNoOworCXBhci5tYXRjaGluZm8gPSBtLT5kYXRhOworCXBhci5mYW1pbHkgICAgPSBORlBST1RPX0lQVjY7CisJaWYgKHBhci5tYXRjaC0+ZGVzdHJveSAhPSBOVUxMKQorCQlwYXIubWF0Y2gtPmRlc3Ryb3koJnBhcik7CisJbW9kdWxlX3B1dChwYXIubWF0Y2gtPm1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjMyLDM0ICs2MzMsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19tYXRjaChzdHJ1Y3QgaXA2dF9lbnRyeV9tYXRjaCAqbSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50ICppKQorc3RhdGljIGludCBjaGVja19tYXRjaChzdHJ1Y3QgaXA2dF9lbnRyeV9tYXRjaCAqbSwgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwdjYgPSBwYXItPmVudHJ5aW5mbzsKIAlpbnQgcmV0OwogCi0JbWF0Y2ggPSBtLT51Lmtlcm5lbC5tYXRjaDsKLQlyZXQgPSB4dF9jaGVja19tYXRjaChtYXRjaCwgQUZfSU5FVDYsIG0tPnUubWF0Y2hfc2l6ZSAtIHNpemVvZigqbSksCi0JCQkgICAgIG5hbWUsIGhvb2ttYXNrLCBpcHY2LT5wcm90bywKLQkJCSAgICAgaXB2Ni0+aW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTyk7Ci0JaWYgKCFyZXQgJiYgbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkKLQkgICAgJiYgIW0tPnUua2VybmVsLm1hdGNoLT5jaGVja2VudHJ5KG5hbWUsIGlwdjYsIG1hdGNoLCBtLT5kYXRhLAotCQkJCQkgICAgICBob29rbWFzaykpIHsKKwlwYXItPm1hdGNoICAgICA9IG0tPnUua2VybmVsLm1hdGNoOworCXBhci0+bWF0Y2hpbmZvID0gbS0+ZGF0YTsKKworCXJldCA9IHh0X2NoZWNrX21hdGNoKHBhciwgbS0+dS5tYXRjaF9zaXplIC0gc2l6ZW9mKCptKSwKKwkJCSAgICAgaXB2Ni0+cHJvdG8sIGlwdjYtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pOworCWlmIChyZXQgPCAwKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCi0JCQkgbS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOworCQkJIHBhci5tYXRjaC0+bmFtZSk7CisJCXJldHVybiByZXQ7CiAJfQotCWlmICghcmV0KQotCQkoKmkpKys7Ci0JcmV0dXJuIHJldDsKKwkrKyppOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1maW5kX2NoZWNrX21hdGNoKHN0cnVjdCBpcDZ0X2VudHJ5X21hdGNoICptLAotCQkgY29uc3QgY2hhciAqbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKLQkJIHVuc2lnbmVkIGludCBob29rbWFzaywKK2ZpbmRfY2hlY2tfbWF0Y2goc3RydWN0IGlwNnRfZW50cnlfbWF0Y2ggKm0sIHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyLAogCQkgdW5zaWduZWQgaW50ICppKQogewogCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CkBAIC02NzQsNyArNjY5LDcgQEAKIAl9CiAJbS0+dS5rZXJuZWwubWF0Y2ggPSBtYXRjaDsKIAotCXJldCA9IGNoZWNrX21hdGNoKG0sIG5hbWUsIGlwdjYsIGhvb2ttYXNrLCBpKTsKKwlyZXQgPSBjaGVja19tYXRjaChtLCBwYXIsIGkpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCkBAIC02ODYsMjMgKzY4MSwyNiBAQAogCiBzdGF0aWMgaW50IGNoZWNrX3RhcmdldChzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgKnQ7Ci0Jc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKKwlzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gcGFyID0geworCQkudGFibGUgICAgID0gbmFtZSwKKwkJLmVudHJ5aW5mbyA9IGUsCisJCS50YXJnZXQgICAgPSB0LT51Lmtlcm5lbC50YXJnZXQsCisJCS50YXJnaW5mbyAgPSB0LT5kYXRhLAorCQkuaG9va19tYXNrID0gZS0+Y29tZWZyb20sCisJCS5mYW1pbHkgICAgPSBORlBST1RPX0lQVjYsCisJfTsKIAlpbnQgcmV0OwogCiAJdCA9IGlwNnRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0LT51Lmtlcm5lbC50YXJnZXQ7Ci0JcmV0ID0geHRfY2hlY2tfdGFyZ2V0KHRhcmdldCwgQUZfSU5FVDYsIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpLAotCQkJICAgICAgbmFtZSwgZS0+Y29tZWZyb20sIGUtPmlwdjYucHJvdG8sCi0JCQkgICAgICBlLT5pcHY2LmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pOwotCWlmICghcmV0ICYmIHQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeQotCSAgICAmJiAhdC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5KG5hbWUsIGUsIHRhcmdldCwgdC0+ZGF0YSwKLQkJCQkJICAgICAgIGUtPmNvbWVmcm9tKSkgeworCXJldCA9IHh0X2NoZWNrX3RhcmdldCgmcGFyLCB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwKKwkgICAgICBlLT5pcHY2LnByb3RvLCBlLT5pcHY2LmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pOworCWlmIChyZXQgPCAwKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCiAJCQkgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtNzEzLDE0ICs3MTEsMTggQEAKIAlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgajsKKwlzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gbXRwYXI7CiAKIAlyZXQgPSBjaGVja19lbnRyeShlLCBuYW1lKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJaiA9IDA7Ci0JcmV0ID0gSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGZpbmRfY2hlY2tfbWF0Y2gsIG5hbWUsICZlLT5pcHY2LAotCQkJCSBlLT5jb21lZnJvbSwgJmopOworCW10cGFyLnRhYmxlICAgICA9IG5hbWU7CisJbXRwYXIuZW50cnlpbmZvID0gJmUtPmlwdjY7CisJbXRwYXIuaG9va19tYXNrID0gZS0+Y29tZWZyb207CisJbXRwYXIuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY2OworCXJldCA9IElQNlRfTUFUQ0hfSVRFUkFURShlLCBmaW5kX2NoZWNrX21hdGNoLCAmbXRwYXIsICZqKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cF9tYXRjaGVzOwogCkBAIC03OTUsNiArNzk3LDcgQEAKIHN0YXRpYyBpbnQKIGNsZWFudXBfZW50cnkoc3RydWN0IGlwNnRfZW50cnkgKmUsIHVuc2lnbmVkIGludCAqaSkKIHsKKwlzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtIHBhcjsKIAlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgKnQ7CiAKIAlpZiAoaSAmJiAoKmkpLS0gPT0gMCkKQEAgLTgwMyw5ICs4MDYsMTMgQEAKIAkvKiBDbGVhbnVwIGFsbCBtYXRjaGVzICovCiAJSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGNsZWFudXBfbWF0Y2gsIE5VTEwpOwogCXQgPSBpcDZ0X2dldF90YXJnZXQoZSk7Ci0JaWYgKHQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSkKLQkJdC0+dS5rZXJuZWwudGFyZ2V0LT5kZXN0cm95KHQtPnUua2VybmVsLnRhcmdldCwgdC0+ZGF0YSk7Ci0JbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKKworCXBhci50YXJnZXQgICA9IHQtPnUua2VybmVsLnRhcmdldDsKKwlwYXIudGFyZ2luZm8gPSB0LT5kYXRhOworCXBhci5mYW1pbHkgICA9IE5GUFJPVE9fSVBWNjsKKwlpZiAocGFyLnRhcmdldC0+ZGVzdHJveSAhPSBOVUxMKQorCQlwYXIudGFyZ2V0LT5kZXN0cm95KCZwYXIpOworCW1vZHVsZV9wdXQocGFyLnRhcmdldC0+bWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xNjc3LDEwICsxNjg0LDE0IEBACiB7CiAJdW5zaWduZWQgaW50IGo7CiAJaW50IHJldDsKKwlzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gbXRwYXI7CiAKIAlqID0gMDsKLQlyZXQgPSBJUDZUX01BVENIX0lURVJBVEUoZSwgY2hlY2tfbWF0Y2gsIG5hbWUsICZlLT5pcHY2LAotCQkJCSBlLT5jb21lZnJvbSwgJmopOworCW10cGFyLnRhYmxlICAgICA9IG5hbWU7CisJbXRwYXIuZW50cnlpbmZvID0gJmUtPmlwdjY7CisJbXRwYXIuaG9va19tYXNrID0gZS0+Y29tZWZyb207CisJbXRwYXIuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY2OworCXJldCA9IElQNlRfTUFUQ0hfSVRFUkFURShlLCBjaGVja19tYXRjaCwgJm10cGFyLCAmaik7CiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAKQEAgLTIxNDYsMzAgKzIxNTcsMjMgQEAKIH0KIAogc3RhdGljIGJvb2wKLWljbXA2X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICAgaW50IG9mZnNldCwKLQkgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkgICBib29sICpob3Rkcm9wKQoraWNtcDZfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJY29uc3Qgc3RydWN0IGljbXA2aGRyICppYzsKIAlzdHJ1Y3QgaWNtcDZoZHIgX2ljbXBoOwotCWNvbnN0IHN0cnVjdCBpcDZ0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2ljbXAgKmljbXBpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCWlmIChvZmZzZXQpCisJaWYgKHBhci0+ZnJhZ29mZiAhPSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKKwlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKIAlpZiAoaWMgPT0gTlVMTCkgewogCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQogCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCiAJCSAqLwogCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBJQ01QIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTIxODEsMTQgKzIxODUsOSBAQAogfQogCiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgYm9vbAotaWNtcDZfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgdm9pZCAqZW50cnksCi0JICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkgICB2b2lkICptYXRjaGluZm8sCi0JICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGljbXA2X2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfaWNtcCAqaWNtcGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfaWNtcCAqaWNtcGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgc3BlY2lmeSBubyB1bmtub3duIGludmZsYWdzICovCiAJcmV0dXJuICEoaWNtcGluZm8tPmludmZsYWdzICYgfklQNlRfSUNNUF9JTlYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKaW5kZXggZDVmOGZkNS4uMjdiNWFkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCkBAIC0xOSwxMiArMTksMTAgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAotaGxfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQoraGxfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKLQljb25zdCBzdHJ1Y3QgaXA2dF9ITF9pbmZvICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfSExfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJaW50IG5ld19obDsKIAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCBza2ItPmxlbikpCkBAIC01NiwxMiArNTQsOSBAQAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAotc3RhdGljIGJvb2wKLWhsX3RnNl9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGhsX3RnNl9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXA2dF9ITF9pbmZvICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfSExfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAoaW5mby0+bW9kZSA+IElQNlRfSExfTUFYTU9ERSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcDZ0X0hMOiBpbnZhbGlkIG9yIHVua25vd24gTW9kZSAldVxuIiwKQEAgLTc4LDcgKzczLDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaGxfdGc2X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lIAkJPSAiSEwiLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLnRhcmdldAkJPSBobF90ZzYsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfSExfaW5mbyksCiAJLnRhYmxlCQk9ICJtYW5nbGUiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwppbmRleCAzYTIzMTY5Li5jYWE0NDFkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwpAQCAtMzg1LDcgKzM4NSw3IEBACiB9OwogCiBzdGF0aWMgdm9pZAotaXA2dF9sb2dfcGFja2V0KHVuc2lnbmVkIGludCBwZiwKK2lwNnRfbG9nX3BhY2tldCh1X2ludDhfdCBwZiwKIAkJdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTQzOCwyOCArNDM4LDI0IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLWxvZ190ZzYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK2xvZ190ZzYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcDZ0X2xvZ19pbmZvICpsb2dpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfbG9nX2luZm8gKmxvZ2luZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBuZl9sb2dpbmZvIGxpOwogCiAJbGkudHlwZSA9IE5GX0xPR19UWVBFX0xPRzsKIAlsaS51LmxvZy5sZXZlbCA9IGxvZ2luZm8tPmxldmVsOwogCWxpLnUubG9nLmxvZ2ZsYWdzID0gbG9naW5mby0+bG9nZmxhZ3M7CiAKLQlpcDZ0X2xvZ19wYWNrZXQoUEZfSU5FVDYsIGhvb2tudW0sIHNrYiwgaW4sIG91dCwgJmxpLCBsb2dpbmZvLT5wcmVmaXgpOworCWlwNnRfbG9nX3BhY2tldChORlBST1RPX0lQVjYsIHBhci0+aG9va251bSwgc2tiLCBwYXItPmluLCBwYXItPm91dCwKKwkJCSZsaSwgbG9naW5mby0+cHJlZml4KTsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIAotc3RhdGljIGJvb2wKLWxvZ190ZzZfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGxvZ190ZzZfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfbG9nX2luZm8gKmxvZ2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9sb2dfaW5mbyAqbG9naW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobG9naW5mby0+bGV2ZWwgPj0gOCkgewogCQlwcl9kZWJ1ZygiTE9HOiBsZXZlbCAldSA+PSA4XG4iLCBsb2dpbmZvLT5sZXZlbCk7CkBAIC00NzUsNyArNDcxLDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbG9nX3RnNl9yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSAJCT0gIkxPRyIsCi0JLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkudGFyZ2V0IAk9IGxvZ190ZzYsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfbG9nX2luZm8pLAogCS5jaGVja2VudHJ5CT0gbG9nX3RnNl9jaGVjaywKQEAgLTQ5NSw3ICs0OTEsNyBAQAogCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmbG9nX3RnNl9yZWcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCW5mX2xvZ19yZWdpc3RlcihQRl9JTkVUNiwgJmlwNnRfbG9nZ2VyKTsKKwluZl9sb2dfcmVnaXN0ZXIoTkZQUk9UT19JUFY2LCAmaXA2dF9sb2dnZXIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jCmluZGV4IDQ0YzhkNjUuLjA5ODFiNGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jCkBAIC0zNSw3ICszNSw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIC8qIFNlbmQgUlNUIHJlcGx5ICovCi1zdGF0aWMgdm9pZCBzZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpvbGRza2IpCitzdGF0aWMgdm9pZCBzZW5kX3Jlc2V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKm9sZHNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAlzdHJ1Y3QgdGNwaGRyIG90Y3BoLCAqdGNwaDsKQEAgLTk0LDcgKzk0LDcgQEAKIAlmbC5mbF9pcF9zcG9ydCA9IG90Y3BoLmRlc3Q7CiAJZmwuZmxfaXBfZHBvcnQgPSBvdGNwaC5zb3VyY2U7CiAJc2VjdXJpdHlfc2tiX2NsYXNzaWZ5X2Zsb3cob2xkc2tiLCAmZmwpOwotCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoJmluaXRfbmV0LCBOVUxMLCAmZmwpOworCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmwpOwogCWlmIChkc3QgPT0gTlVMTCkKIAkJcmV0dXJuOwogCWlmIChkc3QtPmVycm9yIHx8IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgTlVMTCwgMCkpCkBAIC0xNjMsMjAgKzE2MywyMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNlbmRfdW5yZWFjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2luLCB1bnNpZ25lZCBjaGFyIGNvZGUsIHVuc2lnbmVkIGludCBob29rbnVtKQorc2VuZF91bnJlYWNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgdW5zaWduZWQgY2hhciBjb2RlLAorCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CiAJaWYgKGhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQgJiYgc2tiX2luLT5kZXYgPT0gTlVMTCkKLQkJc2tiX2luLT5kZXYgPSBpbml0X25ldC5sb29wYmFja19kZXY7CisJCXNrYl9pbi0+ZGV2ID0gbmV0LT5sb29wYmFja19kZXY7CiAKIAlpY21wdjZfc2VuZChza2JfaW4sIElDTVBWNl9ERVNUX1VOUkVBQ0gsIGNvZGUsIDAsIE5VTEwpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1yZWplY3RfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCityZWplY3RfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXA2dF9yZWplY3RfaW5mbyAqcmVqZWN0ID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfcmVqZWN0X2luZm8gKnJlamVjdCA9IHBhci0+dGFyZ2luZm87CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCgocGFyLT5pbiAhPSBOVUxMKSA/IHBhci0+aW4gOiBwYXItPm91dCk7CiAKIAlwcl9kZWJ1ZygiJXM6IG1lZGl1bSBwb2ludFxuIiwgX19mdW5jX18pOwogCS8qIFdBUk5JTkc6IFRoaXMgY29kZSBjYXVzZXMgcmVlbnRyeSB3aXRoaW4gaXA2dGFibGVzLgpAQCAtMTg0LDI1ICsxODQsMjUgQEAKIAkgICBtdXN0IHJldHVybiBhbiBhYnNvbHV0ZSB2ZXJkaWN0LiAtLVJSICovCiAJc3dpdGNoIChyZWplY3QtPndpdGgpIHsKIAljYXNlIElQNlRfSUNNUDZfTk9fUk9VVEU6Ci0JCXNlbmRfdW5yZWFjaChza2IsIElDTVBWNl9OT1JPVVRFLCBob29rbnVtKTsKKwkJc2VuZF91bnJlYWNoKG5ldCwgc2tiLCBJQ01QVjZfTk9ST1VURSwgcGFyLT5ob29rbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBJUDZUX0lDTVA2X0FETV9QUk9ISUJJVEVEOgotCQlzZW5kX3VucmVhY2goc2tiLCBJQ01QVjZfQURNX1BST0hJQklURUQsIGhvb2tudW0pOworCQlzZW5kX3VucmVhY2gobmV0LCBza2IsIElDTVBWNl9BRE1fUFJPSElCSVRFRCwgcGFyLT5ob29rbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBJUDZUX0lDTVA2X05PVF9ORUlHSEJPVVI6Ci0JCXNlbmRfdW5yZWFjaChza2IsIElDTVBWNl9OT1RfTkVJR0hCT1VSLCBob29rbnVtKTsKKwkJc2VuZF91bnJlYWNoKG5ldCwgc2tiLCBJQ01QVjZfTk9UX05FSUdIQk9VUiwgcGFyLT5ob29rbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBJUDZUX0lDTVA2X0FERFJfVU5SRUFDSDoKLQkJc2VuZF91bnJlYWNoKHNrYiwgSUNNUFY2X0FERFJfVU5SRUFDSCwgaG9va251bSk7CisJCXNlbmRfdW5yZWFjaChuZXQsIHNrYiwgSUNNUFY2X0FERFJfVU5SRUFDSCwgcGFyLT5ob29rbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBJUDZUX0lDTVA2X1BPUlRfVU5SRUFDSDoKLQkJc2VuZF91bnJlYWNoKHNrYiwgSUNNUFY2X1BPUlRfVU5SRUFDSCwgaG9va251bSk7CisJCXNlbmRfdW5yZWFjaChuZXQsIHNrYiwgSUNNUFY2X1BPUlRfVU5SRUFDSCwgcGFyLT5ob29rbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBJUDZUX0lDTVA2X0VDSE9SRVBMWToKIAkJLyogRG8gbm90aGluZyAqLwogCQlicmVhazsKIAljYXNlIElQNlRfVENQX1JFU0VUOgotCQlzZW5kX3Jlc2V0KHNrYik7CisJCXNlbmRfcmVzZXQobmV0LCBza2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtMjEzLDEzICsyMTMsMTAgQEAKIAlyZXR1cm4gTkZfRFJPUDsKIH0KIAotc3RhdGljIGJvb2wKLXJlamVjdF90ZzZfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHJlamVjdF90ZzZfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfcmVqZWN0X2luZm8gKnJlamluZm8gPSB0YXJnaW5mbzsKLQljb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSA9IGVudHJ5OworCWNvbnN0IHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvICpyZWppbmZvID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKHJlamluZm8tPndpdGggPT0gSVA2VF9JQ01QNl9FQ0hPUkVQTFkpIHsKIAkJcHJpbnRrKCJpcDZ0X1JFSkVDVDogRUNIT1JFUExZIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKQEAgLTIzNyw3ICsyMzQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCByZWplY3RfdGc2X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJSRUpFQ1QiLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLnRhcmdldAkJPSByZWplY3RfdGc2LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvKSwKIAkudGFibGUJCT0gImZpbHRlciIsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwppbmRleCA0Mjk2MjlmLi4zYTgyZjI0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKQEAgLTM2LDE0ICszNiwxMSBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgYm9vbAotYWhfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCitzdGF0aWMgYm9vbCBhaF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwX2F1dGhfaGRyIF9haDsKIAljb25zdCBzdHJ1Y3QgaXBfYXV0aF9oZHIgKmFoOwotCWNvbnN0IHN0cnVjdCBpcDZ0X2FoICphaGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfYWggKmFoaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBwdHI7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CiAJaW50IGVycjsKQEAgLTUxLDEzICs0OCwxMyBAQAogCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX0FVVEgsIE5VTEwpOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChlcnIgIT0gLUVOT0VOVCkKLQkJCSpob3Rkcm9wID0gdHJ1ZTsKKwkJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfYWgpLCAmX2FoKTsKIAlpZiAoYWggPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC05MywxMyArOTAsOSBAQAogCSAgICAgICAhKGFoaW5mby0+aGRycmVzICYmIGFoLT5yZXNlcnZlZCk7CiB9CiAKLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBib29sCi1haF9tdDZfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGFoX210Nl9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXA2dF9haCAqYWhpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2FoICphaGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWlmIChhaGluZm8tPmludmZsYWdzICYgfklQNlRfQUhfSU5WX01BU0spIHsKIAkJcHJfZGVidWcoImlwNnRfYWg6IHVua25vd24gZmxhZ3MgJVhcbiIsIGFoaW5mby0+aW52ZmxhZ3MpOwpAQCAtMTEwLDcgKzEwMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggYWhfbXQ2X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJhaCIsCi0JLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkubWF0Y2gJCT0gYWhfbXQ2LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfYWgpLAogCS5jaGVja2VudHJ5CT0gYWhfbXQ2X2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKaW5kZXggOGYzMzFmMS4uZGI2MTBiYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCkBAIC0yMCwxOCArMjAsMTUgQEAKIE1PRFVMRV9BVVRIT1IoIkFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+Iik7CiAKIHN0YXRpYyBib29sCi1ldWk2NF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICBib29sICpob3Rkcm9wKQorZXVpNjRfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCXVuc2lnbmVkIGNoYXIgZXVpNjRbOF07CiAJaW50IGkgPSAwOwogCiAJaWYgKCEoc2tiX21hY19oZWFkZXIoc2tiKSA+PSBza2ItPmhlYWQgJiYKIAkgICAgICBza2JfbWFjX2hlYWRlcihza2IpICsgRVRIX0hMRU4gPD0gc2tiLT5kYXRhKSAmJgotCSAgICBvZmZzZXQgIT0gMCkgewotCQkqaG90ZHJvcCA9IHRydWU7CisJICAgIHBhci0+ZnJhZ29mZiAhPSAwKSB7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC02MCw3ICs1Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZXVpNjRfbXQ2X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJldWk2NCIsCi0JLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkubWF0Y2gJCT0gZXVpNjRfbXQ2LAogCS5tYXRjaHNpemUJPSBzaXplb2YoaW50KSwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSB8CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggZTJiYmM2My4uNjczYWEwYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtMzUsMjcgKzM1LDI0IEBACiB9CiAKIHN0YXRpYyBib29sCi1mcmFnX210Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitmcmFnX210Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgZnJhZ19oZHIgX2ZyYWc7CiAJY29uc3Qgc3RydWN0IGZyYWdfaGRyICpmaDsKLQljb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBwdHI7CiAJaW50IGVycjsKIAogCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX0ZSQUdNRU5ULCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FTk9FTlQpCi0JCQkqaG90ZHJvcCA9IHRydWU7CisJCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHRyLCBzaXplb2YoX2ZyYWcpLCAmX2ZyYWcpOwogCWlmIChmaCA9PSBOVUxMKSB7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTExMCwxMyArMTA3LDkgQEAKIAkJICYmIChudG9ocyhmaC0+ZnJhZ19vZmYpICYgSVA2X01GKSk7CiB9CiAKLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBib29sCi1mcmFnX210Nl9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAotICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGZyYWdfbXQ2X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcDZ0X2ZyYWcgKmZyYWdpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2ZyYWcgKmZyYWdpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoZnJhZ2luZm8tPmludmZsYWdzICYgfklQNlRfRlJBR19JTlZfTUFTSykgewogCQlwcl9kZWJ1ZygiaXA2dF9mcmFnOiB1bmtub3duIGZsYWdzICVYXG4iLCBmcmFnaW5mby0+aW52ZmxhZ3MpOwpAQCAtMTI3LDcgKzEyMCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZnJhZ19tdDZfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gImZyYWciLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLm1hdGNoCQk9IGZyYWdfbXQ2LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfZnJhZyksCiAJLmNoZWNrZW50cnkJPSBmcmFnX210Nl9jaGVjaywKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMKaW5kZXggNjJlMzlhYy4uY2JlOGRlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMKQEAgLTQyLDE0ICs0MiwxMSBAQAogICovCiAKIHN0YXRpYyBib29sCi1oYmhfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2hiaF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwdjZfb3B0X2hkciBfb3B0c2g7CiAJY29uc3Qgc3RydWN0IGlwdjZfb3B0X2hkciAqb2g7Ci0JY29uc3Qgc3RydWN0IGlwNnRfb3B0cyAqb3B0aW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRpbmZvID0gcGFyLT5tYXRjaGluZm87CiAJdW5zaWduZWQgaW50IHRlbXA7CiAJdW5zaWduZWQgaW50IHB0cjsKIAl1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKQEAgLTYxLDE2ICs1OCwxNiBAQAogCXVuc2lnbmVkIGludCBvcHRsZW47CiAJaW50IGVycjsKIAotCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBtYXRjaC0+ZGF0YSwgTlVMTCk7CisJZXJyID0gaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIHBhci0+bWF0Y2gtPmRhdGEsIE5VTEwpOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChlcnIgIT0gLUVOT0VOVCkKLQkJCSpob3Rkcm9wID0gdHJ1ZTsKKwkJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJb2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfb3B0c2gpLCAmX29wdHNoKTsKIAlpZiAob2ggPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC05Nyw4ICs5NCw2IEBACiAJaGRybGVuIC09IDI7CiAJaWYgKCEob3B0aW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfT1BUUykpIHsKIAkJcmV0dXJuIHJldDsKLQl9IGVsc2UgaWYgKG9wdGluZm8tPmZsYWdzICYgSVA2VF9PUFRTX05TVFJJQ1QpIHsKLQkJcHJfZGVidWcoIk5vdCBzdHJpY3QgLSBub3QgaW1wbGVtZW50ZWQiKTsKIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiU3RyaWN0ICIpOwogCQlwcl9kZWJ1ZygiIyVkICIsIG9wdGluZm8tPm9wdHNucik7CkBAIC0xNjUsMjUgKzE2MCwyNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGJvb2wKLWhiaF9tdDZfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgaGJoX210Nl9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vcHRzICpvcHRzaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKG9wdHNpbmZvLT5pbnZmbGFncyAmIH5JUDZUX09QVFNfSU5WX01BU0spIHsKIAkJcHJfZGVidWcoImlwNnRfb3B0czogdW5rbm93biBmbGFncyAlWFxuIiwgb3B0c2luZm8tPmludmZsYWdzKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KKworCWlmIChvcHRzaW5mby0+ZmxhZ3MgJiBJUDZUX09QVFNfTlNUUklDVCkgeworCQlwcl9kZWJ1ZygiaXA2dF9vcHRzOiBOb3Qgc3RyaWN0IC0gbm90IGltcGxlbWVudGVkIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKIAlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoYmhfbXQ2X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAiaGJoIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5tYXRjaAkJPSBoYmhfbXQ2LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X29wdHMpLAogCQkuY2hlY2tlbnRyeQk9IGhiaF9tdDZfY2hlY2ssCkBAIC0xOTIsNyArMTg5LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gImRzdCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkubWF0Y2gJCT0gaGJoX210NiwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9vcHRzKSwKIAkJLmNoZWNrZW50cnkJPSBoYmhfbXQ2X2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKaW5kZXggMzQ1NjcxNi4uYzk2NGRjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCkBAIC0xOSwxMiArMTksOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBJUHY2IEhvcCBMaW1pdCBmaWVsZCBtYXRjaCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgYm9vbAotaGxfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCitzdGF0aWMgYm9vbCBobF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfaGxfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9obF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOwogCiAJc3dpdGNoIChpbmZvLT5tb2RlKSB7CkBAIC01MSw3ICs0OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaGxfbXQ2X3JlZyBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lCQk9ICJobCIsCi0JLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkubWF0Y2gJCT0gaGxfbXQ2LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaGxfaW5mbyksCiAJLm1lCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCmluZGV4IDMxN2E4OTYuLjE0ZTY3MjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKQEAgLTI3LDEyICsyNyw5IEBACiBNT0RVTEVfQVVUSE9SKCJBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PiIpOwogCiBzdGF0aWMgYm9vbAotaXB2NmhlYWRlcl9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICAgICAgICBib29sICpob3Rkcm9wKQoraXB2NmhlYWRlcl9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfaXB2NmhlYWRlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwdjZoZWFkZXJfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCB0ZW1wOwogCWludCBsZW47CiAJdTggbmV4dGhkcjsKQEAgLTEyMSwxMiArMTE4LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sCi1pcHY2aGVhZGVyX210Nl9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGlwdjZoZWFkZXJfbXQ2X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcDZ0X2lwdjZoZWFkZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcHY2aGVhZGVyX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIGludmZsYWdzIGlzIDAgb3IgMHhmZiBpbiBoYXJkIG1vZGUgKi8KIAlpZiAoKCFpbmZvLT5tb2RlZmxhZykgJiYgaW5mby0+aW52ZmxhZ3MgIT0gMHgwMCAmJgpAQCAtMTM4LDcgKzEzMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaXB2NmhlYWRlcl9tdDZfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gImlwdjZoZWFkZXIiLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLm1hdGNoCQk9IGlwdjZoZWFkZXJfbXQ2LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaXB2NmhlYWRlcl9pbmZvKSwKIAkuY2hlY2tlbnRyeQk9IGlwdjZoZWFkZXJfbXQ2X2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21oLmMKaW5kZXggZTA2Njc4ZC4uYWFmZTRlNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWguYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9taC5jCkBAIC0zNywzMiArMzcsMjkgQEAKIAlyZXR1cm4gKHR5cGUgPj0gbWluICYmIHR5cGUgPD0gbWF4KSBeIGludmVydDsKIH0KIAotc3RhdGljIGJvb2wKLW1oX210Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgbWhfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCBpcDZfbWggX21oOwogCWNvbnN0IHN0cnVjdCBpcDZfbWggKm1oOwotCWNvbnN0IHN0cnVjdCBpcDZ0X21oICptaGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfbWggKm1oaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQlpZiAob2Zmc2V0KQorCWlmIChwYXItPmZyYWdvZmYgIT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JbWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX21oKSwgJl9taCk7CisJbWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwYXItPnRob2ZmLCBzaXplb2YoX21oKSwgJl9taCk7CiAJaWYgKG1oID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKIAkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLwogCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBNSCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJaWYgKG1oLT5pcDZtaF9wcm90byAhPSBJUFBST1RPX05PTkUpIHsKIAkJZHVwcmludGYoIkRyb3BwaW5nIGludmFsaWQgTUggUGF5bG9hZCBQcm90bzogJXVcbiIsCiAJCQkgbWgtPmlwNm1oX3Byb3RvKTsKLQkJKmhvdGRyb3AgPSB0cnVlOworCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNzAsMTMgKzY3LDkgQEAKIAkJCSAgISEobWhpbmZvLT5pbnZmbGFncyAmIElQNlRfTUhfSU5WX1RZUEUpKTsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGJvb2wKLW1oX210Nl9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgbWhfbXQ2X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBpcDZ0X21oICptaGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfbWggKm1oaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJLyogTXVzdCBzcGVjaWZ5IG5vIHVua25vd24gaW52ZmxhZ3MgKi8KIAlyZXR1cm4gIShtaGluZm8tPmludmZsYWdzICYgfklQNlRfTUhfSU5WX01BU0spOwpAQCAtODQsNyArNzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1oX210Nl9yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAibWgiLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLmNoZWNrZW50cnkJPSBtaF9tdDZfY2hlY2ssCiAJLm1hdGNoCQk9IG1oX210NiwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X21oKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCmluZGV4IDgxYWFmN2EuLjM1NmI4ZDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwpAQCAtMzYsMTQgKzM2LDExIEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBib29sCi1ydF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK3N0YXRpYyBib29sIHJ0X210Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgaXB2Nl9ydF9oZHIgX3JvdXRlOwogCWNvbnN0IHN0cnVjdCBpcHY2X3J0X2hkciAqcmg7Ci0JY29uc3Qgc3RydWN0IGlwNnRfcnQgKnJ0aW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9ydCAqcnRpbmZvID0gcGFyLT5tYXRjaGluZm87CiAJdW5zaWduZWQgaW50IHRlbXA7CiAJdW5zaWduZWQgaW50IHB0cjsKIAl1bnNpZ25lZCBpbnQgaGRybGVuID0gMDsKQEAgLTU1LDEzICs1MiwxMyBAQAogCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX1JPVVRJTkcsIE5VTEwpOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChlcnIgIT0gLUVOT0VOVCkKLQkJCSpob3Rkcm9wID0gdHJ1ZTsKKwkJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJcmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfcm91dGUpLCAmX3JvdXRlKTsKIAlpZiAocmggPT0gTlVMTCkgewotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xODksMTMgKzE4Niw5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgYm9vbAotcnRfbXQ2X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBydF9tdDZfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfcnQgKnJ0aW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9ydCAqcnRpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAocnRpbmZvLT5pbnZmbGFncyAmIH5JUDZUX1JUX0lOVl9NQVNLKSB7CiAJCXByX2RlYnVnKCJpcDZ0X3J0OiB1bmtub3duIGZsYWdzICVYXG4iLCBydGluZm8tPmludmZsYWdzKTsKQEAgLTIxNCw3ICsyMDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIHJ0X210Nl9yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAicnQiLAotCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJLm1hdGNoCQk9IHJ0X210NiwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3J0KSwKIAkuY2hlY2tlbnRyeQk9IHJ0X210Nl9jaGVjaywKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCA1NWEyYzI5Li5iMTEwYThhOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwpAQCAtNjgsNyArNjgsNyBAQAogCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgIG5mX2xvY2FsX2luX25ldChpbiwgb3V0KS0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOworCQkJICAgICBkZXZfbmV0KGluKS0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC03OSw3ICs3OSw3IEBACiAJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgICBuZl9mb3J3YXJkX25ldChpbiwgb3V0KS0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOworCQkJICAgICBkZXZfbmV0KGluKS0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC0xMDAsNyArMTAwLDcgQEAKICNlbmRpZgogCiAJcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgICBuZl9sb2NhbF9vdXRfbmV0KGluLCBvdXQpLT5pcHY2LmlwNnRhYmxlX2ZpbHRlcik7CisJCQkgICAgIGRldl9uZXQob3V0KS0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwNnRfb3BzW10gX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwppbmRleCBmNDA1Y2VhLi5kMGIzMWIyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCkBAIC02NywxNyArNjcsMjkgQEAKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwogc3RhdGljIHVuc2lnbmVkIGludAotaXA2dF9yb3V0ZV9ob29rKHVuc2lnbmVkIGludCBob29rLAoraXA2dF9pbl9ob29rKHVuc2lnbmVkIGludCBob29rLAogCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewotCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwgaW5pdF9uZXQuaXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOworCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwKKwkJCSAgICAgZGV2X25ldChpbiktPmlwdjYuaXA2dGFibGVfbWFuZ2xlKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotaXA2dF9sb2NhbF9ob29rKHVuc2lnbmVkIGludCBob29rLAoraXA2dF9wb3N0X3JvdXRpbmdfaG9vayh1bnNpZ25lZCBpbnQgaG9vaywKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCisJCQkgICAgIGRldl9uZXQob3V0KS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpcDZ0X2xvY2FsX291dF9ob29rKHVuc2lnbmVkIGludCBob29rLAogCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCkBAIC0xMDgsNyArMTIwLDggQEAKIAkvKiBmbG93bGFiZWwgYW5kIHByaW8gKGluY2x1ZGVzIHZlcnNpb24sIHdoaWNoIHNob3VsZG4ndCBjaGFuZ2UgZWl0aGVyICovCiAJZmxvd2xhYmVsID0gKigodV9pbnQzMl90ICopaXB2Nl9oZHIoc2tiKSk7CiAKLQlyZXQgPSBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwgaW5pdF9uZXQuaXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOworCXJldCA9IGlwNnRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAorCQkJICAgIGRldl9uZXQob3V0KS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOwogCiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KIAkJJiYgKG1lbWNtcCgmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkKQEAgLTEyMiwzNSArMTM1LDM1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXA2dF9vcHNbXSBfX3JlYWRfbW9zdGx5ID0gewogCXsKLQkJLmhvb2sJCT0gaXA2dF9yb3V0ZV9ob29rLAorCQkuaG9vawkJPSBpcDZ0X2luX2hvb2ssCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfUFJFX1JPVVRJTkcsCiAJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTUFOR0xFLAogCX0sCiAJewotCQkuaG9vawkJPSBpcDZ0X3JvdXRlX2hvb2ssCisJCS5ob29rCQk9IGlwNnRfaW5faG9vaywKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkucGYJCT0gUEZfSU5FVDYsCiAJCS5ob29rbnVtCT0gTkZfSU5FVF9MT0NBTF9JTiwKIAkJLnByaW9yaXR5CT0gTkZfSVA2X1BSSV9NQU5HTEUsCiAJfSwKIAl7Ci0JCS5ob29rCQk9IGlwNnRfcm91dGVfaG9vaywKKwkJLmhvb2sJCT0gaXA2dF9pbl9ob29rLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVUNiwKIAkJLmhvb2tudW0JPSBORl9JTkVUX0ZPUldBUkQsCiAJCS5wcmlvcml0eQk9IE5GX0lQNl9QUklfTUFOR0xFLAogCX0sCiAJewotCQkuaG9vawkJPSBpcDZ0X2xvY2FsX2hvb2ssCisJCS5ob29rCQk9IGlwNnRfbG9jYWxfb3V0X2hvb2ssCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBmCQk9IFBGX0lORVQ2LAogCQkuaG9va251bQk9IE5GX0lORVRfTE9DQUxfT1VULAogCQkucHJpb3JpdHkJPSBORl9JUDZfUFJJX01BTkdMRSwKIAl9LAogCXsKLQkJLmhvb2sJCT0gaXA2dF9yb3V0ZV9ob29rLAorCQkuaG9vawkJPSBpcDZ0X3Bvc3Rfcm91dGluZ19ob29rLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5wZgkJPSBQRl9JTkVUNiwKIAkJLmhvb2tudW0JPSBORl9JTkVUX1BPU1RfUk9VVElORywKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCA5MmI5MTA3Li4xMDlmYWI2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC00NSwyNSArNDUsMzcgQEAKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwogc3RhdGljIHVuc2lnbmVkIGludAotaXA2dF9ob29rKHVuc2lnbmVkIGludCBob29rLAoraXA2dF9wcmVfcm91dGluZ19ob29rKHVuc2lnbmVkIGludCBob29rLAogCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewotCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwgaW5pdF9uZXQuaXB2Ni5pcDZ0YWJsZV9yYXcpOworCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwKKwkJCSAgICAgZGV2X25ldChpbiktPmlwdjYuaXA2dGFibGVfcmF3KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraXA2dF9sb2NhbF9vdXRfaG9vayh1bnNpZ25lZCBpbnQgaG9vaywKKwkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCisJCQkgICAgIGRldl9uZXQob3V0KS0+aXB2Ni5pcDZ0YWJsZV9yYXcpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwNnRfb3BzW10gX19yZWFkX21vc3RseSA9IHsKIAl7Ci0JICAuaG9vayA9IGlwNnRfaG9vaywKKwkgIC5ob29rID0gaXA2dF9wcmVfcm91dGluZ19ob29rLAogCSAgLnBmID0gUEZfSU5FVDYsCiAJICAuaG9va251bSA9IE5GX0lORVRfUFJFX1JPVVRJTkcsCiAJICAucHJpb3JpdHkgPSBORl9JUDZfUFJJX0ZJUlNULAogCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAl7Ci0JICAuaG9vayA9IGlwNnRfaG9vaywKKwkgIC5ob29rID0gaXA2dF9sb2NhbF9vdXRfaG9vaywKIAkgIC5wZiA9IFBGX0lORVQ2LAogCSAgLmhvb2tudW0gPSBORl9JTkVUX0xPQ0FMX09VVCwKIAkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfRklSU1QsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfc2VjdXJpdHkuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9zZWN1cml0eS5jCmluZGV4IDZlNzEzMTAuLjIwYmM1MmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9zZWN1cml0eS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9zZWN1cml0eS5jCkBAIC03Miw3ICs3Miw3IEBACiAJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgaG9vaywgaW4sIG91dCwKLQkJCSAgICAgbmZfbG9jYWxfaW5fbmV0KGluLCBvdXQpLT5pcHY2LmlwNnRhYmxlX3NlY3VyaXR5KTsKKwkJCSAgICAgZGV2X25ldChpbiktPmlwdjYuaXA2dGFibGVfc2VjdXJpdHkpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC04Myw3ICs4Myw3IEBACiAJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAotCQkJICAgICBuZl9mb3J3YXJkX25ldChpbiwgb3V0KS0+aXB2Ni5pcDZ0YWJsZV9zZWN1cml0eSk7CisJCQkgICAgIGRldl9uZXQoaW4pLT5pcHY2LmlwNnRhYmxlX3NlY3VyaXR5KTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApAQCAtOTUsNyArOTUsNyBAQAogewogCS8qIFRCRDogaGFuZGxlIHNob3J0IHBhY2tldHMgdmlhIHJhdyBzb2NrZXQgKi8KIAlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIGhvb2ssIGluLCBvdXQsCi0JCQkgICAgIG5mX2xvY2FsX291dF9uZXQoaW4sIG91dCktPmlwdjYuaXA2dGFibGVfc2VjdXJpdHkpOworCQkJICAgICBkZXZfbmV0KG91dCktPmlwdjYuaXA2dGFibGVfc2VjdXJpdHkpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwNnRfb3BzW10gX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCmluZGV4IDg1MDUwYzAuLmU5MWRiMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwpAQCAtMjExLDExICsyMTEsMTAgQEAKIAlyZXR1cm4gTkZfU1RPTEVOOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwdjZfY29ubnRyYWNrX2luKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCitzdGF0aWMgdW5zaWduZWQgaW50IF9faXB2Nl9jb25udHJhY2tfaW4oc3RydWN0IG5ldCAqbmV0LAorCQkJCQl1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnJlYXNtID0gc2tiLT5uZmN0X3JlYXNtOwogCkBAIC0yMjUsNyArMjI0LDcgQEAKIAkJaWYgKCFyZWFzbS0+bmZjdCkgewogCQkJdW5zaWduZWQgaW50IHJldDsKIAotCQkJcmV0ID0gbmZfY29ubnRyYWNrX2luKFBGX0lORVQ2LCBob29rbnVtLCByZWFzbSk7CisJCQlyZXQgPSBuZl9jb25udHJhY2tfaW4obmV0LCBQRl9JTkVUNiwgaG9va251bSwgcmVhc20pOwogCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMjM1LDcgKzIzNCwxNiBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIAotCXJldHVybiBuZl9jb25udHJhY2tfaW4oUEZfSU5FVDYsIGhvb2tudW0sIHNrYik7CisJcmV0dXJuIG5mX2Nvbm50cmFja19pbihuZXQsIFBGX0lORVQ2LCBob29rbnVtLCBza2IpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwdjZfY29ubnRyYWNrX2luKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJcmV0dXJuIF9faXB2Nl9jb25udHJhY2tfaW4oZGV2X25ldChpbiksIGhvb2tudW0sIHNrYiwgb2tmbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2Nl9jb25udHJhY2tfbG9jYWwodW5zaWduZWQgaW50IGhvb2tudW0sCkBAIC0yNTAsNyArMjU4LDcgQEAKIAkJCXByaW50aygiaXB2Nl9jb25udHJhY2tfbG9jYWw6IHBhY2tldCB0b28gc2hvcnRcbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KLQlyZXR1cm4gaXB2Nl9jb25udHJhY2tfaW4oaG9va251bSwgc2tiLCBpbiwgb3V0LCBva2ZuKTsKKwlyZXR1cm4gX19pcHY2X2Nvbm50cmFja19pbihkZXZfbmV0KG91dCksIGhvb2tudW0sIHNrYiwgb2tmbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXB2Nl9jb25udHJhY2tfb3BzW10gX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCmluZGV4IDE0ZDQ3ZDguLjA1NzI2MTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwpAQCAtODEsNyArODEsNyBAQAogCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICBpbnQgcGYsCisJCSAgICAgICB1X2ludDhfdCBwZiwKIAkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCS8qIFRyeSB0byBkZWxldGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhZnRlciBhbGwgcmVwbGllczoKQEAgLTkzLDcgKzkzLDcgQEAKIAkJCW5mX2N0X2tpbGxfYWNjdChjdCwgY3RpbmZvLCBza2IpOwogCX0gZWxzZSB7CiAJCWF0b21pY19pbmMoJmN0LT5wcm90by5pY21wLmNvdW50KTsKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUFJPVE9JTkZPX1ZPTEFUSUxFLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUsIGN0KTsKIAkJbmZfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIHNrYiwgbmZfY3RfaWNtcHY2X3RpbWVvdXQpOwogCX0KIApAQCAtMTIyLDcgKzEyMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWljbXB2Nl9lcnJvcl9tZXNzYWdlKHN0cnVjdCBza19idWZmICpza2IsCitpY21wdjZfZXJyb3JfbWVzc2FnZShzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bnNpZ25lZCBpbnQgaWNtcDZvZmYsCiAJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAogCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQpAQCAtMTU2LDcgKzE1Nyw3IEBACiAKIAkqY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKIAotCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJmludHVwbGUpOworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQobmV0LCAmaW50dXBsZSk7CiAJaWYgKCFoKSB7CiAJCXByX2RlYnVnKCJpY21wdjZfZXJyb3I6IG5vIG1hdGNoXG4iKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CkBAIC0xNzIsMjEgKzE3MywyMSBAQAogfQogCiBzdGF0aWMgaW50Ci1pY21wdjZfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sIGludCBwZiwgdW5zaWduZWQgaW50IGhvb2tudW0pCitpY21wdjZfZXJyb3Ioc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywgdV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCWNvbnN0IHN0cnVjdCBpY21wNmhkciAqaWNtcDZoOwogCXN0cnVjdCBpY21wNmhkciBfaWg7CiAKIAlpY21wNmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2loKSwgJl9paCk7CiAJaWYgKGljbXA2aCA9PSBOVUxMKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX0lDTVBWNikpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fSUNNUFY2KSkKIAkJbmZfbG9nX3BhY2tldChQRl9JTkVUNiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJICAgICAgIm5mX2N0X2ljbXB2Njogc2hvcnQgcGFja2V0ICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKIAl9CiAKLQlpZiAobmZfY29ubnRyYWNrX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyAmJgorCWlmIChuZXQtPmN0LnN5c2N0bF9jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgJiYKIAkgICAgbmZfaXA2X2NoZWNrc3VtKHNrYiwgaG9va251bSwgZGF0YW9mZiwgSVBQUk9UT19JQ01QVjYpKSB7CiAJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVDYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCSAgICAgICJuZl9jdF9pY21wdjY6IElDTVB2NiBjaGVja3N1bSBmYWlsZWRcbiIpOwpAQCAtMTk3LDcgKzE5OCw3IEBACiAJaWYgKGljbXA2aC0+aWNtcDZfdHlwZSA+PSAxMjgpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlyZXR1cm4gaWNtcHY2X2Vycm9yX21lc3NhZ2Uoc2tiLCBkYXRhb2ZmLCBjdGluZm8sIGhvb2tudW0pOworCXJldHVybiBpY21wdjZfZXJyb3JfbWVzc2FnZShuZXQsIHNrYiwgZGF0YW9mZiwgY3RpbmZvLCBob29rbnVtKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCmluZGV4IDUyZDA2ZGQuLjk5NjdhYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KQEAgLTEwMywzOSArMTAyLDEyIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2cWhhc2hmbihfX2JlMzIgaWQsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkcikKLXsKLQl1MzIgYSwgYiwgYzsKLQotCWEgPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlswXTsKLQliID0gKF9fZm9yY2UgdTMyKXNhZGRyLT5zNl9hZGRyMzJbMV07Ci0JYyA9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzJdOwotCi0JYSArPSBKSEFTSF9HT0xERU5fUkFUSU87Ci0JYiArPSBKSEFTSF9HT0xERU5fUkFUSU87Ci0JYyArPSBuZl9mcmFncy5ybmQ7Ci0JX19qaGFzaF9taXgoYSwgYiwgYyk7Ci0KLQlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOwotCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMF07Ci0JYyArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKLQlfX2poYXNoX21peChhLCBiLCBjKTsKLQotCWEgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMl07Ci0JYiArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlszXTsKLQljICs9IChfX2ZvcmNlIHUzMilpZDsKLQlfX2poYXNoX21peChhLCBiLCBjKTsKLQotCXJldHVybiBjICYgKElORVRGUkFHU19IQVNIU1ogLSAxKTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBuZl9oYXNoZm4oc3RydWN0IGluZXRfZnJhZ19xdWV1ZSAqcSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKm5xOwogCiAJbnEgPSBjb250YWluZXJfb2YocSwgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlLCBxKTsKLQlyZXR1cm4gaXA2cWhhc2hmbihucS0+aWQsICZucS0+c2FkZHIsICZucS0+ZGFkZHIpOworCXJldHVybiBpbmV0Nl9oYXNoX2ZyYWcobnEtPmlkLCAmbnEtPnNhZGRyLCAmbnEtPmRhZGRyLCBuZl9mcmFncy5ybmQpOwogfQogCiBzdGF0aWMgdm9pZCBuZl9za2JfZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjA5LDcgKzE4MSw3IEBACiAJYXJnLmRzdCA9IGRzdDsKIAogCXJlYWRfbG9ja19iaCgmbmZfZnJhZ3MubG9jayk7Ci0JaGFzaCA9IGlwNnFoYXNoZm4oaWQsIHNyYywgZHN0KTsKKwloYXNoID0gaW5ldDZfaGFzaF9mcmFnKGlkLCBzcmMsIGRzdCwgbmZfZnJhZ3Mucm5kKTsKIAogCXEgPSBpbmV0X2ZyYWdfZmluZCgmbmZfaW5pdF9mcmFncywgJm5mX2ZyYWdzLCAmYXJnLCBoYXNoKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCAwMTc5YjY2Li4wN2YwYjc2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0X2RldnNubXA2OwotCiBzdGF0aWMgaW50IHNvY2tzdGF0Nl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CkBAIC00OCw2ICs0NiwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNvY2tzdGF0Nl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW5fbmV0KGlub2RlLCBmaWxlLCBzb2Nrc3RhdDZfc2VxX3Nob3cpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb2Nrc3RhdDZfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IHNvY2tzdGF0Nl9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlX25ldCwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25tcF9taWIgc25tcDZfaXBzdGF0c19saXN0W10gPSB7CiAvKiBpcHY2IG1pYiBhY2NvcmRpbmcgdG8gUkZDIDI0NjUgKi8KIAlTTk1QX01JQl9JVEVNKCJJcDZJblJlY2VpdmVzIiwgSVBTVEFUU19NSUJfSU5SRUNFSVZFUyksCkBAIC0xNjQsMzkgKzE3NSwyMyBAQAogCiBzdGF0aWMgaW50IHNubXA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSAoc3RydWN0IGluZXQ2X2RldiAqKXNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSAoc3RydWN0IG5ldCAqKXNlcS0+cHJpdmF0ZTsKIAotCWlmIChpZGV2KSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCV1XG4iLCAiaWZJbmRleCIsIGlkZXYtPmRldi0+aWZpbmRleCk7Ci0JCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2LCBzbm1wNl9pcHN0YXRzX2xpc3QpOwotCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2LCBzbm1wNl9pY21wNl9saXN0KTsKLQkJc25tcDZfc2VxX3Nob3dfaWNtcHY2bXNnKHNlcSwgKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2bXNnKTsKLQl9IGVsc2UgewotCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzLCBzbm1wNl9pcHN0YXRzX2xpc3QpOwotCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MsIHNubXA2X2ljbXA2X2xpc3QpOwotCQlzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc2VxLCAodm9pZCAqKilpY21wdjZtc2dfc3RhdGlzdGljcyk7Ci0JCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKil1ZHBfc3RhdHNfaW42LCBzbm1wNl91ZHA2X2xpc3QpOwotCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYsIHNubXA2X3VkcGxpdGU2X2xpc3QpOwotCX0KKwlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopbmV0LT5taWIuaXB2Nl9zdGF0aXN0aWNzLAorCQkJICAgIHNubXA2X2lwc3RhdHNfbGlzdCk7CisJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzLAorCQkJICAgIHNubXA2X2ljbXA2X2xpc3QpOworCXNubXA2X3NlcV9zaG93X2ljbXB2Nm1zZyhzZXEsICh2b2lkICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzKTsKKwlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopbmV0LT5taWIudWRwX3N0YXRzX2luNiwKKwkJCSAgICBzbm1wNl91ZHA2X2xpc3QpOworCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRzX2luNiwKKwkJCSAgICBzbm1wNl91ZHBsaXRlNl9saXN0KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb2Nrc3RhdDZfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuX25ldChpbm9kZSwgZmlsZSwgc29ja3N0YXQ2X3NlcV9zaG93KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ja3N0YXQ2X3NlcV9mb3BzID0gewotCS5vd25lcgkgPSBUSElTX01PRFVMRSwKLQkub3BlbgkgPSBzb2Nrc3RhdDZfc2VxX29wZW4sCi0JLnJlYWQJID0gc2VxX3JlYWQsCi0JLmxsc2VlawkgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZV9uZXQsCi19OwotCiBzdGF0aWMgaW50IHNubXA2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzbm1wNl9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CisJcmV0dXJuIHNpbmdsZV9vcGVuX25ldChpbm9kZSwgZmlsZSwgc25tcDZfc2VxX3Nob3cpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbm1wNl9zZXFfZm9wcyA9IHsKQEAgLTIwNCwyNCArMTk5LDQ4IEBACiAJLm9wZW4JID0gc25tcDZfc2VxX29wZW4sCiAJLnJlYWQJID0gc2VxX3JlYWQsCiAJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZV9uZXQsCit9OworCitzdGF0aWMgaW50IHNubXA2X2Rldl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gKHN0cnVjdCBpbmV0Nl9kZXYgKilzZXEtPnByaXZhdGU7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQldVxuIiwgImlmSW5kZXgiLCBpZGV2LT5kZXYtPmlmaW5kZXgpOworCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2LCBzbm1wNl9pcHN0YXRzX2xpc3QpOworCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIHNubXA2X2ljbXA2X2xpc3QpOworCXNubXA2X3NlcV9zaG93X2ljbXB2Nm1zZyhzZXEsICh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Nm1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25tcDZfZGV2X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzbm1wNl9kZXZfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbm1wNl9kZXZfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IHNubXA2X2Rldl9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogaW50IHNubXA2X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKwlzdHJ1Y3QgbmV0ICpuZXQ7CiAKIAlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIW5ldF9lcShkZXZfbmV0KGlkZXYtPmRldiksICZpbml0X25ldCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCFwcm9jX25ldF9kZXZzbm1wNikKKwluZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7CisJaWYgKCFuZXQtPm1pYi5wcm9jX25ldF9kZXZzbm1wNikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlwID0gcHJvY19jcmVhdGVfZGF0YShpZGV2LT5kZXYtPm5hbWUsIFNfSVJVR08sCi0JCQkgICAgIHByb2NfbmV0X2RldnNubXA2LCAmc25tcDZfc2VxX2ZvcHMsIGlkZXYpOworCQkJICAgICBuZXQtPm1pYi5wcm9jX25ldF9kZXZzbm1wNiwKKwkJCSAgICAgJnNubXA2X2Rldl9zZXFfZm9wcywgaWRldik7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjMxLDEyICsyNTAsMTMgQEAKIAogaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCiB7Ci0JaWYgKCFwcm9jX25ldF9kZXZzbm1wNikKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7CisJaWYgKCFuZXQtPm1pYi5wcm9jX25ldF9kZXZzbm1wNikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJaWYgKCFpZGV2IHx8ICFpZGV2LT5zdGF0cy5wcm9jX2Rpcl9lbnRyeSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmVtb3ZlX3Byb2NfZW50cnkoaWRldi0+c3RhdHMucHJvY19kaXJfZW50cnktPm5hbWUsCi0JCQkgIHByb2NfbmV0X2RldnNubXA2KTsKKwkJCSAgbmV0LT5taWIucHJvY19uZXRfZGV2c25tcDYpOwogCWlkZXYtPnN0YXRzLnByb2NfZGlyX2VudHJ5ID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NiwxMiArMjY2LDI3IEBACiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZShuZXQsICJzb2Nrc3RhdDYiLCBTX0lSVUdPLAogCQkJJnNvY2tzdGF0Nl9zZXFfZm9wcykpCiAJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZShuZXQsICJzbm1wNiIsIFNfSVJVR08sICZzbm1wNl9zZXFfZm9wcykpCisJCWdvdG8gcHJvY19zbm1wNl9mYWlsOworCisJbmV0LT5taWIucHJvY19uZXRfZGV2c25tcDYgPSBwcm9jX21rZGlyKCJkZXZfc25tcDYiLCBuZXQtPnByb2NfbmV0KTsKKwlpZiAoIW5ldC0+bWliLnByb2NfbmV0X2RldnNubXA2KQorCQlnb3RvIHByb2NfZGV2X3NubXA2X2ZhaWw7CiAJcmV0dXJuIDA7CisKK3Byb2Nfc25tcDZfZmFpbDoKKwlwcm9jX25ldF9yZW1vdmUobmV0LCAic29ja3N0YXQ2Iik7Citwcm9jX2Rldl9zbm1wNl9mYWlsOgorCXByb2NfbmV0X3JlbW92ZShuZXQsICJkZXZfc25tcDYiKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgaXB2Nl9wcm9jX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlwcm9jX25ldF9yZW1vdmUobmV0LCAic29ja3N0YXQ2Iik7CisJcHJvY19uZXRfcmVtb3ZlKG5ldCwgImRldl9zbm1wNiIpOworCXByb2NfbmV0X3JlbW92ZShuZXQsICJzbm1wNiIpOwogfQogCiBzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGlwdjZfcHJvY19vcHMgPSB7CkBAIC0yNjEsMzMgKzI5NiwxMSBAQAogCiBpbnQgX19pbml0IGlwdjZfbWlzY19wcm9jX2luaXQodm9pZCkKIHsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwdjZfcHJvY19vcHMpKQotCQlnb3RvIHByb2NfbmV0X2ZhaWw7Ci0KLQlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgInNubXA2IiwgU19JUlVHTywgJnNubXA2X3NlcV9mb3BzKSkKLQkJZ290byBwcm9jX3NubXA2X2ZhaWw7Ci0KLQlwcm9jX25ldF9kZXZzbm1wNiA9IHByb2NfbWtkaXIoImRldl9zbm1wNiIsIGluaXRfbmV0LnByb2NfbmV0KTsKLQlpZiAoIXByb2NfbmV0X2RldnNubXA2KQotCQlnb3RvIHByb2NfZGV2X3NubXA2X2ZhaWw7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotCi1wcm9jX2Rldl9zbm1wNl9mYWlsOgotCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJzbm1wNiIpOwotcHJvY19zbm1wNl9mYWlsOgotCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmaXB2Nl9wcm9jX29wcyk7Ci1wcm9jX25ldF9mYWlsOgotCXJjID0gLUVOT01FTTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmaXB2Nl9wcm9jX29wcyk7CiB9CiAKIHZvaWQgaXB2Nl9taXNjX3Byb2NfZXhpdCh2b2lkKQogewotCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJkZXZfc25tcDYiKTsKLQlwcm9jX25ldF9yZW1vdmUoJmluaXRfbmV0LCAic25tcDYiKTsKIAl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwdjZfcHJvY19vcHMpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IGU1M2U0OTMuLjJiYTA0ZDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC02MzgsNyArNjM4LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX2ZhdWx0OwogCi0JSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhzb2NrX25ldChzayksIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBydC0+dS5kc3QuZGV2LAogCQkgICAgICBkc3Rfb3V0cHV0KTsKIAlpZiAoZXJyID4gMCkKQEAgLTY1Miw3ICs2NTIsNyBAQAogCWVyciA9IC1FRkFVTFQ7CiAJa2ZyZWVfc2tiKHNrYik7CiBlcnJvcjoKLQlJUDZfSU5DX1NUQVRTKHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwlJUDZfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgcnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwppbmRleCA4OTE4NGI1Li5hZjEyZGUwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKKysrIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCkBAIC05OSw4ICs5OSw4IEBACiAgKiBjYWxsZXJzIHNob3VsZCBiZSBjYXJlZnVsIG5vdCB0byB1c2UgdGhlIGhhc2ggdmFsdWUgb3V0c2lkZSB0aGUgaXBmcmFnX2xvY2sKICAqIGFzIGRvaW5nIHNvIGNvdWxkIHJhY2Ugd2l0aCBpcGZyYWdfaGFzaF9ybmQgYmVpbmcgcmVjYWxjdWxhdGVkLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4oX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCit1bnNpZ25lZCBpbnQgaW5ldDZfaGFzaF9mcmFnKF9fYmUzMiBpZCwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgdTMyIHJuZCkKIHsKIAl1MzIgYSwgYiwgYzsKIApAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlhICs9IEpIQVNIX0dPTERFTl9SQVRJTzsKIAliICs9IEpIQVNIX0dPTERFTl9SQVRJTzsKLQljICs9IGlwNl9mcmFncy5ybmQ7CisJYyArPSBybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOwpAQCAtMTI1LDEzICsxMjUsMTQgQEAKIAogCXJldHVybiBjICYgKElORVRGUkFHU19IQVNIU1ogLSAxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGluZXQ2X2hhc2hfZnJhZyk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2X2hhc2hmbihzdHJ1Y3QgaW5ldF9mcmFnX3F1ZXVlICpxKQogewogCXN0cnVjdCBmcmFnX3F1ZXVlICpmcTsKIAogCWZxID0gY29udGFpbmVyX29mKHEsIHN0cnVjdCBmcmFnX3F1ZXVlLCBxKTsKLQlyZXR1cm4gaXA2cWhhc2hmbihmcS0+aWQsICZmcS0+c2FkZHIsICZmcS0+ZGFkZHIpOworCXJldHVybiBpbmV0Nl9oYXNoX2ZyYWcoZnEtPmlkLCAmZnEtPnNhZGRyLCAmZnEtPmRhZGRyLCBpcDZfZnJhZ3Mucm5kKTsKIH0KIAogaW50IGlwNl9mcmFnX21hdGNoKHN0cnVjdCBpbmV0X2ZyYWdfcXVldWUgKnEsIHZvaWQgKmEpCkBAIC0xODgsNyArMTg5LDcgQEAKIAogCWV2aWN0ZWQgPSBpbmV0X2ZyYWdfZXZpY3RvcigmbmV0LT5pcHY2LmZyYWdzLCAmaXA2X2ZyYWdzKTsKIAlpZiAoZXZpY3RlZCkKLQkJSVA2X0FERF9TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTLCBldmljdGVkKTsKKwkJSVA2X0FERF9TVEFUU19CSChuZXQsIGlkZXYsIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMsIGV2aWN0ZWQpOwogfQogCiBzdGF0aWMgdm9pZCBpcDZfZnJhZ19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMjEyLDggKzIxMyw4IEBACiAJCWdvdG8gb3V0OwogCiAJcmN1X3JlYWRfbG9jaygpOwotCUlQNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTVRJTUVPVVQpOwotCUlQNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTVRJTUVPVVQpOworCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBfX2luNl9kZXZfZ2V0KGRldiksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyogRG9uJ3Qgc2VuZCBlcnJvciBpZiB0aGUgZmlyc3Qgc2VnbWVudCBkaWQgbm90IGFycml2ZS4gKi8KQEAgLTI0Nyw3ICsyNDgsNyBAQAogCWFyZy5kc3QgPSBkc3Q7CiAKIAlyZWFkX2xvY2soJmlwNl9mcmFncy5sb2NrKTsKLQloYXNoID0gaXA2cWhhc2hmbihpZCwgc3JjLCBkc3QpOworCWhhc2ggPSBpbmV0Nl9oYXNoX2ZyYWcoaWQsIHNyYywgZHN0LCBpcDZfZnJhZ3Mucm5kKTsKIAogCXEgPSBpbmV0X2ZyYWdfZmluZCgmbmV0LT5pcHY2LmZyYWdzLCAmaXA2X2ZyYWdzLCAmYXJnLCBoYXNoKTsKIAlpZiAocSA9PSBOVUxMKQpAQCAtMjU2LDcgKzI1Nyw3IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3QgZnJhZ19xdWV1ZSwgcSk7CiAKIG9vbToKLQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCUlQNl9JTkNfU1RBVFNfQkgobmV0LCBpZGV2LCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjY2LDYgKzI2Nyw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnByZXYsICpuZXh0OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IG9mZnNldCwgZW5kOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAKIAlpZiAoZnEtPnEubGFzdF9pbiAmIElORVRfRlJBR19DT01QTEVURSkKIAkJZ290byBlcnI7CkBAIC0yNzUsNyArMjc3LDcgQEAKIAkJCSgodTggKikoZmhkciArIDEpIC0gKHU4ICopKGlwdjZfaGRyKHNrYikgKyAxKSkpOwogCiAJaWYgKCh1bnNpZ25lZCBpbnQpZW5kID4gSVBWNl9NQVhQTEVOKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAogCQkJCSAgKCh1OCAqKSZmaGRyLT5mcmFnX29mZiAtCkBAIC0zMDgsNyArMzEwLDcgQEAKIAkJCS8qIFJGQzI0NjAgc2F5cyBhbHdheXMgc2VuZCBwYXJhbWV0ZXIgcHJvYmxlbSBpbgogCQkJICogdGhpcyBjYXNlLiAtRGF2ZU0KIAkJCSAqLwotCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsCiAJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIHBheWxvYWRfbGVuKSk7CkBAIC00MzIsNyArNDM0LDggQEAKIAlyZXR1cm4gLTE7CiAKIGVycjoKLQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkgICAgICBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC01NDgsNyArNTUxLDggQEAKIAkJCQkJICBoZWFkLT5jc3VtKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOworCUlQNl9JTkNfU1RBVFNfQkgoZGV2X25ldChkZXYpLAorCQkJIF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWZxLT5xLmZyYWdtZW50cyA9IE5VTEw7CiAJcmV0dXJuIDE7CkBAIC01NjIsNyArNTY2LDggQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgImlwNl9mcmFnX3JlYXNtOiBubyBtZW1vcnkgZm9yIHJlYXNzZW1ibHlcbiIpOwogb3V0X2ZhaWw6CiAJcmN1X3JlYWRfbG9jaygpOwotCUlQNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlJUDZfSU5DX1NUQVRTX0JIKGRldl9uZXQoZGV2KSwKKwkJCSBfX2luNl9kZXZfZ2V0KGRldiksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAtMTsKIH0KQEAgLTU3MiwyNCArNTc3LDE3IEBACiAJc3RydWN0IGZyYWdfaGRyICpmaGRyOwogCXN0cnVjdCBmcmFnX3F1ZXVlICpmcTsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gaXB2Nl9oZHIoc2tiKTsKLQlzdHJ1Y3QgbmV0ICpuZXQ7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRzdC0+ZGV2KTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfUkVBU01SRVFEUyk7CisJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNUkVRRFMpOwogCiAJLyogSnVtYm8gcGF5bG9hZCBpbmhpYml0cyBmcmFnLiBoZWFkZXIgKi8KLQlpZiAoaGRyLT5wYXlsb2FkX2xlbj09MCkgewotCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAotCQkJCSAgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAoaGRyLT5wYXlsb2FkX2xlbj09MCkKKwkJZ290byBmYWlsX2hkcjsKKwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKLQkJCQkgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpKSkgewotCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAotCQkJCSAgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKLQkJcmV0dXJuIC0xOwotCX0KKwkJCQkgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpKSkKKwkJZ290byBmYWlsX2hkcjsKIAogCWhkciA9IGlwdjZfaGRyKHNrYik7CiAJZmhkciA9IChzdHJ1Y3QgZnJhZ19oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwpAQCAtNTk3LDEzICs1OTUsMTMgQEAKIAlpZiAoIShmaGRyLT5mcmFnX29mZiAmIGh0b25zKDB4RkZGOSkpKSB7CiAJCS8qIEl0IGlzIG5vdCBhIGZyYWdtZW50ZWQgZnJhbWUgKi8KIAkJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOwotCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNT0tTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChuZXQsCisJCQkJIGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNT0tTKTsKIAogCQlJUDZDQihza2IpLT5uaG9mZiA9ICh1OCAqKWZoZHIgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAJaWYgKGF0b21pY19yZWFkKCZuZXQtPmlwdjYuZnJhZ3MubWVtKSA+IG5ldC0+aXB2Ni5mcmFncy5oaWdoX3RocmVzaCkKIAkJaXA2X2V2aWN0b3IobmV0LCBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpKTsKIApAQCAtNjIwLDkgKzYxOCwxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtMTsKKworZmFpbF9oZHI6CisJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CisJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sIGZyYWdfcHJvdG9jb2wgPQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKaW5kZXggOWFmNjExNS4uODlkYzY5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcm91dGUuYworKysgYi9uZXQvaXB2Ni9yb3V0ZS5jCkBAIC0xMDAzLDYgKzEwMDMsMjUgQEAKIAlyZXR1cm4gbW9yZTsKIH0KIAorc3RhdGljIHZvaWQgaWNtcDZfY2xlYW5fYWxsKGludCAoKmZ1bmMpKHN0cnVjdCBydDZfaW5mbyAqcnQsIHZvaWQgKmFyZyksCisJCQkgICAgdm9pZCAqYXJnKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCwgKipwcHJldjsKKworCXNwaW5fbG9ja19iaCgmaWNtcDZfZHN0X2xvY2spOworCXBwcmV2ID0gJmljbXA2X2RzdF9nY19saXN0OworCXdoaWxlICgoZHN0ID0gKnBwcmV2KSAhPSBOVUxMKSB7CisJCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopIGRzdDsKKwkJaWYgKGZ1bmMocnQsIGFyZykpIHsKKwkJCSpwcHJldiA9IGRzdC0+bmV4dDsKKwkJCWRzdF9mcmVlKGRzdCk7CisJCX0gZWxzZSB7CisJCQlwcHJldiA9ICZkc3QtPm5leHQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmljbXA2X2RzdF9sb2NrKTsKK30KKwogc3RhdGljIGludCBpcDZfZHN0X2djKHN0cnVjdCBkc3Rfb3BzICpvcHMpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwpAQCAtMTgxNCwxNiArMTgzMywxOSBAQAogc3RhdGljIGludCBpcDZfcGt0X2Ryb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvZGUsIGludCBpcHN0YXRzX21pYl9ub3JvdXRlcykKIHsKIAlpbnQgdHlwZTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKIAlzd2l0Y2ggKGlwc3RhdHNfbWliX25vcm91dGVzKSB7CiAJY2FzZSBJUFNUQVRTX01JQl9JTk5PUk9VVEVTOgogCQl0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkgewotCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUUyhkZXZfbmV0KGRzdC0+ZGV2KSwgaXA2X2RzdF9pZGV2KGRzdCksCisJCQkJICAgICAgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBJUFNUQVRTX01JQl9PVVROT1JPVVRFUzoKLQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBpcHN0YXRzX21pYl9ub3JvdXRlcyk7CisJCUlQNl9JTkNfU1RBVFMoZGV2X25ldChkc3QtPmRldiksIGlwNl9kc3RfaWRldihkc3QpLAorCQkJICAgICAgaXBzdGF0c19taWJfbm9yb3V0ZXMpOwogCQlicmVhazsKIAl9CiAJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBjb2RlLCAwLCBza2ItPmRldik7CkBAIC0xOTMwLDYgKzE5NTIsNyBAQAogCX07CiAKIAlmaWI2X2NsZWFuX2FsbChuZXQsIGZpYjZfaWZkb3duLCAwLCAmYWRuKTsKKwlpY21wNl9jbGVhbl9hbGwoZmliNl9pZmRvd24sICZhZG4pOwogfQogCiBzdHJ1Y3QgcnQ2X210dV9jaGFuZ2VfYXJnCkBAIC0yNjExLDEwICsyNjM0LDggQEAKIAluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5ID0ga21lbWR1cCgmaXA2X3Byb2hpYml0X2VudHJ5X3RlbXBsYXRlLAogCQkJCQkgICAgICAgc2l6ZW9mKCpuZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5KSwKIAkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghbmV0LT5pcHY2LmlwNl9wcm9oaWJpdF9lbnRyeSkgewotCQlrZnJlZShuZXQtPmlwdjYuaXA2X251bGxfZW50cnkpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFuZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5KQorCQlnb3RvIG91dF9pcDZfbnVsbF9lbnRyeTsKIAluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5LT51LmRzdC5wYXRoID0KIAkJKHN0cnVjdCBkc3RfZW50cnkgKiluZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5OwogCW5ldC0+aXB2Ni5pcDZfcHJvaGliaXRfZW50cnktPnUuZHN0Lm9wcyA9IG5ldC0+aXB2Ni5pcDZfZHN0X29wczsKQEAgLTI2MjIsMTYgKzI2NDMsMjIgQEAKIAluZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5ID0ga21lbWR1cCgmaXA2X2Jsa19ob2xlX2VudHJ5X3RlbXBsYXRlLAogCQkJCQkgICAgICAgc2l6ZW9mKCpuZXQtPmlwdjYuaXA2X2Jsa19ob2xlX2VudHJ5KSwKIAkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghbmV0LT5pcHY2LmlwNl9ibGtfaG9sZV9lbnRyeSkgewotCQlrZnJlZShuZXQtPmlwdjYuaXA2X251bGxfZW50cnkpOwotCQlrZnJlZShuZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghbmV0LT5pcHY2LmlwNl9ibGtfaG9sZV9lbnRyeSkKKwkJZ290byBvdXRfaXA2X3Byb2hpYml0X2VudHJ5OwogCW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnktPnUuZHN0LnBhdGggPQogCQkoc3RydWN0IGRzdF9lbnRyeSAqKW5ldC0+aXB2Ni5pcDZfYmxrX2hvbGVfZW50cnk7CiAJbmV0LT5pcHY2LmlwNl9ibGtfaG9sZV9lbnRyeS0+dS5kc3Qub3BzID0gbmV0LT5pcHY2LmlwNl9kc3Rfb3BzOwogI2VuZGlmCiAKKwluZXQtPmlwdjYuc3lzY3RsLmZsdXNoX2RlbGF5ID0gMDsKKwluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9tYXhfc2l6ZSA9IDQwOTY7CisJbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfbWluX2ludGVydmFsID0gSFogLyAyOworCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX3RpbWVvdXQgPSA2MCpIWjsKKwluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19pbnRlcnZhbCA9IDMwKkhaOworCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2VsYXN0aWNpdHkgPSA5OworCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X210dV9leHBpcmVzID0gMTAqNjAqSFo7CisJbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfbWluX2Fkdm1zcyA9IElQVjZfTUlOX01UVSAtIDIwIC0gNDA7CisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKG5ldCwgImlwdjZfcm91dGUiLCAwLCAmaXB2Nl9yb3V0ZV9wcm9jX2ZvcHMpOwogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKG5ldCwgInJ0Nl9zdGF0cyIsIFNfSVJVR08sICZydDZfc3RhdHNfc2VxX2ZvcHMpOwpAQCAtMjY0Miw2ICsyNjY5LDEyIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIAorI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUworb3V0X2lwNl9wcm9oaWJpdF9lbnRyeToKKwlrZnJlZShuZXQtPmlwdjYuaXA2X3Byb2hpYml0X2VudHJ5KTsKK291dF9pcDZfbnVsbF9lbnRyeToKKwlrZnJlZShuZXQtPmlwdjYuaXA2X251bGxfZW50cnkpOworI2VuZGlmCiBvdXRfaXA2X2RzdF9vcHM6CiAJcmVsZWFzZV9uZXQobmV0LT5pcHY2LmlwNl9kc3Rfb3BzLT5kc3RfbmV0KTsKIAlrZnJlZShuZXQtPmlwdjYuaXA2X2RzdF9vcHMpOwpAQCAtMjY4OCw2ICsyNzIxLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9rbWVtX2NhY2hlOwogCisJaXA2X2RzdF9ibGFja2hvbGVfb3BzLmttZW1fY2FjaGVwID0gaXA2X2RzdF9vcHNfdGVtcGxhdGUua21lbV9jYWNoZXA7CisKIAkvKiBSZWdpc3RlcmluZyBvZiB0aGUgbG9vcGJhY2sgaXMgZG9uZSBiZWZvcmUgdGhpcyBwb3J0aW9uIG9mIGNvZGUsCiAJICogdGhlIGxvb3BiYWNrIHJlZmVyZW5jZSBpbiBydDZfaW5mbyB3aWxsIG5vdCBiZSB0YWtlbiwgZG8gaXQKIAkgKiBtYW51YWxseSBmb3IgaW5pdF9uZXQgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDViOTBiMzYuLmU1MzEwYzliIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTMzMCw3ICszMzAsOCBAQAogCQkJdGgtPmRlc3QsICZoZHItPnNhZGRyLCB0aC0+c291cmNlLCBza2ItPmRldi0+aWZpbmRleCk7CiAKIAlpZiAoc2sgPT0gTlVMTCkgewotCQlJQ01QNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChza2ItPmRldiksIElDTVA2X01JQl9JTkVSUk9SUyk7CisJCUlDTVA2X0lOQ19TVEFUU19CSChuZXQsIF9faW42X2Rldl9nZXQoc2tiLT5kZXYpLAorCQkJCSAgIElDTVA2X01JQl9JTkVSUk9SUyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk0MSwxMTcgKzk0MiwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9yZXNwb25zZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgc2VxLCB1MzIgYWNrLCB1MzIgd2luLAorCQkJCSB1MzIgdHMsIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LCBpbnQgcnN0KQogewogCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpLCAqdDE7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kc3QtPmRldik7CiAJc3RydWN0IHNvY2sgKmN0bF9zayA9IG5ldC0+aXB2Ni50Y3Bfc2s7Ci0JdW5zaWduZWQgaW50IHRvdF9sZW4gPSBzaXplb2YoKnRoKTsKLSNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OwotI2VuZGlmCi0KLQlpZiAodGgtPnJzdCkKLQkJcmV0dXJuOwotCi0JaWYgKCFpcHY2X3VuaWNhc3RfZGVzdGluYXRpb24oc2tiKSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKLQlpZiAoc2spCi0JCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwotCWVsc2UKLQkJa2V5ID0gTlVMTDsKLQotCWlmIChrZXkpCi0JCXRvdF9sZW4gKz0gVENQT0xFTl9NRDVTSUdfQUxJR05FRDsKLSNlbmRpZgotCi0JLyoKLQkgKiBXZSBuZWVkIHRvIGdyYWIgc29tZSBtZW1vcnksIGFuZCBwdXQgdG9nZXRoZXIgYW4gUlNULAotCSAqIGFuZCB0aGVuIHB1dCBpdCBpbnRvIHRoZSBxdWV1ZSB0byBiZSBzZW50LgotCSAqLwotCi0JYnVmZiA9IGFsbG9jX3NrYihNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHRvdF9sZW4sCi0JCQkgR0ZQX0FUT01JQyk7Ci0JaWYgKGJ1ZmYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc2tiX3Jlc2VydmUoYnVmZiwgTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuKTsKLQotCXQxID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goYnVmZiwgdG90X2xlbik7Ci0KLQkvKiBTd2FwIHRoZSBzZW5kIGFuZCB0aGUgcmVjZWl2ZS4gKi8KLQltZW1zZXQodDEsIDAsIHNpemVvZigqdDEpKTsKLQl0MS0+ZGVzdCA9IHRoLT5zb3VyY2U7Ci0JdDEtPnNvdXJjZSA9IHRoLT5kZXN0OwotCXQxLT5kb2ZmID0gdG90X2xlbiAvIDQ7Ci0JdDEtPnJzdCA9IDE7Ci0KLQlpZih0aC0+YWNrKSB7Ci0JCXQxLT5zZXEgPSB0aC0+YWNrX3NlcTsKLQl9IGVsc2UgewotCQl0MS0+YWNrID0gMTsKLQkJdDEtPmFja19zZXEgPSBodG9ubChudG9obCh0aC0+c2VxKSArIHRoLT5zeW4gKyB0aC0+ZmluCi0JCQkJICAgICsgc2tiLT5sZW4gLSAodGgtPmRvZmY8PDIpKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotCWlmIChrZXkpIHsKLQkJX19iZTMyICpvcHQgPSAoX19iZTMyKikodDEgKyAxKTsKLQkJb3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKLQkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAotCQkJICAgICAgIChUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwKLQkJCSAgICAgICBUQ1BPTEVOX01ENVNJRyk7Ci0JCXRjcF92Nl9tZDVfaGFzaF9oZHIoKF9fdTggKikmb3B0WzFdLCBrZXksCi0JCQkJICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKLQkJCQkgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLCB0MSk7Ci0JfQotI2VuZGlmCi0KLQlidWZmLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdDEsIHNpemVvZigqdDEpLCAwKTsKLQotCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwotCi0JdDEtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZmbC5mbDZfc3JjLCAmZmwuZmw2X2RzdCwKLQkJCQkgICAgc2l6ZW9mKCp0MSksIElQUFJPVE9fVENQLAotCQkJCSAgICBidWZmLT5jc3VtKTsKLQotCWZsLnByb3RvID0gSVBQUk9UT19UQ1A7Ci0JZmwub2lmID0gaW5ldDZfaWlmKHNrYik7Ci0JZmwuZmxfaXBfZHBvcnQgPSB0MS0+ZGVzdDsKLQlmbC5mbF9pcF9zcG9ydCA9IHQxLT5zb3VyY2U7Ci0Jc2VjdXJpdHlfc2tiX2NsYXNzaWZ5X2Zsb3coc2tiLCAmZmwpOwotCi0JLyogUGFzcyBhIHNvY2tldCB0byBpcDZfZHN0X2xvb2t1cCBlaXRoZXIgaXQgaXMgZm9yIFJTVAotCSAqIFVuZGVybHlpbmcgZnVuY3Rpb24gd2lsbCB1c2UgdGhpcyB0byByZXRyaWV2ZSB0aGUgbmV0d29yawotCSAqIG5hbWVzcGFjZQotCSAqLwotCWlmICghaXA2X2RzdF9sb29rdXAoY3RsX3NrLCAmYnVmZi0+ZHN0LCAmZmwpKSB7Ci0KLQkJaWYgKHhmcm1fbG9va3VwKCZidWZmLT5kc3QsICZmbCwgTlVMTCwgMCkgPj0gMCkgewotCQkJaXA2X3htaXQoY3RsX3NrLCBidWZmLCAmZmwsIE5VTEwsIDApOwotCQkJVENQX0lOQ19TVEFUU19CSChuZXQsIFRDUF9NSUJfT1VUU0VHUyk7Ci0JCQlUQ1BfSU5DX1NUQVRTX0JIKG5ldCwgVENQX01JQl9PVVRSU1RTKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWtmcmVlX3NrYihidWZmKTsKLX0KLQotc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cywKLQkJCSAgICBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSkKLXsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKSwgKnQxOwotCXN0cnVjdCBza19idWZmICpidWZmOwotCXN0cnVjdCBmbG93aSBmbDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHNrYi0+ZGV2KTsKLQlzdHJ1Y3Qgc29jayAqY3RsX3NrID0gbmV0LT5pcHY2LnRjcF9zazsKIAl1bnNpZ25lZCBpbnQgdG90X2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAlfX2JlMzIgKnRvcHQ7CiAKQEAgLTEwNjksMTYgKzk2NywxNyBAQAogCiAJc2tiX3Jlc2VydmUoYnVmZiwgTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuKTsKIAotCXQxID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goYnVmZix0b3RfbGVuKTsKKwl0MSA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKGJ1ZmYsIHRvdF9sZW4pOwogCiAJLyogU3dhcCB0aGUgc2VuZCBhbmQgdGhlIHJlY2VpdmUuICovCiAJbWVtc2V0KHQxLCAwLCBzaXplb2YoKnQxKSk7CiAJdDEtPmRlc3QgPSB0aC0+c291cmNlOwogCXQxLT5zb3VyY2UgPSB0aC0+ZGVzdDsKLQl0MS0+ZG9mZiA9IHRvdF9sZW4vNDsKKwl0MS0+ZG9mZiA9IHRvdF9sZW4gLyA0OwogCXQxLT5zZXEgPSBodG9ubChzZXEpOwogCXQxLT5hY2tfc2VxID0gaHRvbmwoYWNrKTsKLQl0MS0+YWNrID0gMTsKKwl0MS0+YWNrID0gIXJzdCB8fCAhdGgtPmFjazsKKwl0MS0+cnN0ID0gcnN0OwogCXQxLT53aW5kb3cgPSBodG9ucyh3aW4pOwogCiAJdG9wdCA9IChfX2JlMzIgKikodDEgKyAxKTsKQEAgLTEwODcsNyArOTg2LDcgQEAKIAkJKnRvcHQrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8IChUQ1BPUFRfTk9QIDw8IDE2KSB8CiAJCQkJKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCk7CiAJCSp0b3B0KysgPSBodG9ubCh0Y3BfdGltZV9zdGFtcCk7Ci0JCSp0b3B0ID0gaHRvbmwodHMpOworCQkqdG9wdCsrID0gaHRvbmwodHMpOwogCX0KIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCkBAIC0xMTE2LDEwICsxMDE1LDE2IEBACiAJZmwuZmxfaXBfc3BvcnQgPSB0MS0+c291cmNlOwogCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgJmZsKTsKIAorCS8qIFBhc3MgYSBzb2NrZXQgdG8gaXA2X2RzdF9sb29rdXAgZWl0aGVyIGl0IGlzIGZvciBSU1QKKwkgKiBVbmRlcmx5aW5nIGZ1bmN0aW9uIHdpbGwgdXNlIHRoaXMgdG8gcmV0cmlldmUgdGhlIG5ldHdvcmsKKwkgKiBuYW1lc3BhY2UKKwkgKi8KIAlpZiAoIWlwNl9kc3RfbG9va3VwKGN0bF9zaywgJmJ1ZmYtPmRzdCwgJmZsKSkgewogCQlpZiAoeGZybV9sb29rdXAoJmJ1ZmYtPmRzdCwgJmZsLCBOVUxMLCAwKSA+PSAwKSB7CiAJCQlpcDZfeG1pdChjdGxfc2ssIGJ1ZmYsICZmbCwgTlVMTCwgMCk7CiAJCQlUQ1BfSU5DX1NUQVRTX0JIKG5ldCwgVENQX01JQl9PVVRTRUdTKTsKKwkJCWlmIChyc3QpCisJCQkJVENQX0lOQ19TVEFUU19CSChuZXQsIFRDUF9NSUJfT1VUUlNUUyk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xMTI3LDYgKzEwMzIsMzggQEAKIAlrZnJlZV9za2IoYnVmZik7CiB9CiAKK3N0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKKwl1MzIgc2VxID0gMCwgYWNrX3NlcSA9IDA7CisJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXkgPSBOVUxMOworCisJaWYgKHRoLT5yc3QpCisJCXJldHVybjsKKworCWlmICghaXB2Nl91bmljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCisJCXJldHVybjsKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKHNrKQorCQlrZXkgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKyNlbmRpZgorCisJaWYgKHRoLT5hY2spCisJCXNlcSA9IG50b2hsKHRoLT5hY2tfc2VxKTsKKwllbHNlCisJCWFja19zZXEgPSBudG9obCh0aC0+c2VxKSArIHRoLT5zeW4gKyB0aC0+ZmluICsgc2tiLT5sZW4gLQorCQkJICAodGgtPmRvZmYgPDwgMik7CisKKwl0Y3BfdjZfc2VuZF9yZXNwb25zZShza2IsIHNlcSwgYWNrX3NlcSwgMCwgMCwga2V5LCAxKTsKK30KKworc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cywKKwkJCSAgICBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSkKK3sKKwl0Y3BfdjZfc2VuZF9yZXNwb25zZShza2IsIHNlcSwgYWNrLCB3aW4sIHRzLCBrZXksIDApOworfQorCiBzdGF0aWMgdm9pZCB0Y3BfdjZfdGltZXdhaXRfYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7CkBAIC0xMjg2LDcgKzEyMjMsNyBAQAogCQkJCQkgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKIAkJCQkJICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7Ci0Jc3RydWN0IGluZXQ2X3JlcXVlc3Rfc29jayAqdHJlcSA9IGluZXQ2X3JzayhyZXEpOworCXN0cnVjdCBpbmV0Nl9yZXF1ZXN0X3NvY2sgKnRyZXE7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5ld25wLCAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IHRjcDZfc29jayAqbmV3dGNwNnNrOwogCXN0cnVjdCBpbmV0X3NvY2sgKm5ld2luZXQ7CkBAIC0xMzUwLDYgKzEyODcsNyBAQAogCQlyZXR1cm4gbmV3c2s7CiAJfQogCisJdHJlcSA9IGluZXQ2X3JzayhyZXEpOwogCW9wdCA9IG5wLT5vcHQ7CiAKIAlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkKQEAgLTE2ODAsMTEgKzE2MTgsNyBAQAogCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKIAotCXNrID0gX19pbmV0Nl9sb29rdXAobmV0LCAmdGNwX2hhc2hpbmZvLAotCQkJJmlwdjZfaGRyKHNrYiktPnNhZGRyLCB0aC0+c291cmNlLAotCQkJJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBudG9ocyh0aC0+ZGVzdCksCi0JCQlpbmV0Nl9paWYoc2tiKSk7Ci0KKwlzayA9IF9faW5ldDZfbG9va3VwX3NrYigmdGNwX2hhc2hpbmZvLCBza2IsIHRoLT5zb3VyY2UsIHRoLT5kZXN0KTsKIAlpZiAoIXNrKQogCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CiAKQEAgLTIxNDgsNiArMjA4Miw3IEBACiBzdGF0aWMgdm9pZCB0Y3B2Nl9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJaW5ldF9jdGxfc29ja19kZXN0cm95KG5ldC0+aXB2Ni50Y3Bfc2spOworCWluZXRfdHdza19wdXJnZShuZXQsICZ0Y3BfaGFzaGluZm8sICZ0Y3BfZGVhdGhfcm93LCBBRl9JTkVUNik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgdGNwdjZfbmV0X29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggYTZhZWNmNy4uZTUxZGE4YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTEwNyw2ICsxMDcsMjEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fdWRwNl9saWJfbG9va3VwX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0LAorCQkJCQkgIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCisJaWYgKHVubGlrZWx5KHNrID0gc2tiX3N0ZWFsX3NvY2soc2tiKSkpCisJCXJldHVybiBzazsKKwllbHNlCisJCXJldHVybiBfX3VkcDZfbGliX2xvb2t1cChkZXZfbmV0KHNrYi0+ZHN0LT5kZXYpLCAmaXBoLT5zYWRkciwgc3BvcnQsCisJCQkJCSAmaXBoLT5kYWRkciwgZHBvcnQsIGluZXQ2X2lpZihza2IpLAorCQkJCQkgdWRwdGFibGUpOworfQorCiAvKgogICogCVRoaXMgc2hvdWxkIGJlIGVhc3ksIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZSB3ZQogICogCXJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgpAQCAtNDg4LDggKzUwMyw3IEBACiAJICogY2hlY2sgc29ja2V0IGNhY2hlIC4uLiBtdXN0IHRhbGsgdG8gQWxhbiBhYm91dCBoaXMgcGxhbnMKIAkgKiBmb3Igc29jayBjYWNoZXMuLi4gaSdsbCBza2lwIHRoaXMgZm9yIG5vdy4KIAkgKi8KLQlzayA9IF9fdWRwNl9saWJfbG9va3VwKG5ldCwgc2FkZHIsIHVoLT5zb3VyY2UsCi0JCQkgICAgICAgZGFkZHIsIHVoLT5kZXN0LCBpbmV0Nl9paWYoc2tiKSwgdWRwdGFibGUpOworCXNrID0gX191ZHA2X2xpYl9sb29rdXBfc2tiKHNrYiwgdWgtPnNvdXJjZSwgdWgtPmRlc3QsIHVkcHRhYmxlKTsKIAogCWlmIChzayA9PSBOVUxMKSB7CiAJCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCmluZGV4IGY2Y2RjYjMuLjNjZDFhMWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcGxpdGUuYworKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTEzLDggKzEzLDYgQEAKICAqLwogI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAKLURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdHNfaW42KSBfX3JlYWRfbW9zdGx5OwotCiBzdGF0aWMgaW50IHVkcGxpdGV2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gX191ZHA2X2xpYl9yY3Yoc2tiLCB1ZHBsaXRlX2hhc2gsIElQUFJPVE9fVURQTElURSk7CmRpZmYgLS1naXQgYS9uZXQvaXVjdi9pdWN2LmMgYi9uZXQvaXVjdi9pdWN2LmMKaW5kZXggNzA1OTU5Yi4uZDdiNTRiNSAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtNTI0LDcgKzUyNCw2IEBACiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGl1Y3ZfZGVjbGFyZV9jcHUsIE5VTEwsIDEpOwotCXByZWVtcHRfZW5hYmxlKCk7CiAJaWYgKGNwdXNfZW1wdHkoaXVjdl9idWZmZXJfY3B1bWFzaykpCiAJCS8qIE5vIGNwdSBjb3VsZCBkZWNsYXJlIGFuIGl1Y3YgYnVmZmVyLiAqLwogCQlnb3RvIG91dF9wYXRoOwpAQCAtNTQ3LDcgKzU0Niw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGl1Y3ZfZGlzYWJsZSh2b2lkKQogeworCWdldF9vbmxpbmVfY3B1cygpOwogCW9uX2VhY2hfY3B1KGl1Y3ZfcmV0cmlldmVfY3B1LCBOVUxMLCAxKTsKKwlwdXRfb25saW5lX2NwdXMoKTsKIAlrZnJlZShpdWN2X3BhdGhfdGFibGUpOwogfQogCmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCBkNjI4ZGY5Li5lNTVlMDQ0IDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTU4LDYgKzU4LDcgQEAKIAkJCXN0cnVjdCB4ZnJtX3BvbGljeV93YWxrCXBvbGljeTsKIAkJCXN0cnVjdCB4ZnJtX3N0YXRlX3dhbGsJc3RhdGU7CiAJCX0gdTsKKwkJc3RydWN0IHNrX2J1ZmYJKnNrYjsKIAl9IGR1bXA7CiB9OwogCkBAIC03MywyMiArNzQsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwZmtleV9kb19kdW1wKHN0cnVjdCBwZmtleV9zb2NrICpwZmspCitzdGF0aWMgdm9pZCBwZmtleV90ZXJtaW5hdGVfZHVtcChzdHJ1Y3QgcGZrZXlfc29jayAqcGZrKQogewotCWludCByYzsKLQotCXJjID0gcGZrLT5kdW1wLmR1bXAocGZrKTsKLQlpZiAocmMgPT0gLUVOT0JVRlMpCi0JCXJldHVybiAwOwotCi0JcGZrLT5kdW1wLmRvbmUocGZrKTsKLQlwZmstPmR1bXAuZHVtcCA9IE5VTEw7Ci0JcGZrLT5kdW1wLmRvbmUgPSBOVUxMOwotCXJldHVybiByYzsKKwlpZiAocGZrLT5kdW1wLmR1bXApIHsKKwkJaWYgKHBmay0+ZHVtcC5za2IpIHsKKwkJCWtmcmVlX3NrYihwZmstPmR1bXAuc2tiKTsKKwkJCXBmay0+ZHVtcC5za2IgPSBOVUxMOworCQl9CisJCXBmay0+ZHVtcC5kb25lKHBmayk7CisJCXBmay0+ZHVtcC5kdW1wID0gTlVMTDsKKwkJcGZrLT5kdW1wLmRvbmUgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQgcGZrZXlfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCiB7CisJcGZrZXlfdGVybWluYXRlX2R1bXAocGZrZXlfc2soc2spKTsKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CkBAIC0zMTAsNiArMzExLDMxIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBwZmtleV9kb19kdW1wKHN0cnVjdCBwZmtleV9zb2NrICpwZmspCit7CisJc3RydWN0IHNhZGJfbXNnICpoZHI7CisJaW50IHJjOworCisJcmMgPSBwZmstPmR1bXAuZHVtcChwZmspOworCWlmIChyYyA9PSAtRU5PQlVGUykKKwkJcmV0dXJuIDA7CisKKwlpZiAocGZrLT5kdW1wLnNrYikgeworCQlpZiAoIXBma2V5X2Nhbl9kdW1wKCZwZmstPnNrKSkKKwkJCXJldHVybiAwOworCisJCWhkciA9IChzdHJ1Y3Qgc2FkYl9tc2cgKikgcGZrLT5kdW1wLnNrYi0+ZGF0YTsKKwkJaGRyLT5zYWRiX21zZ19zZXEgPSAwOworCQloZHItPnNhZGJfbXNnX2Vycm5vID0gcmM7CisJCXBma2V5X2Jyb2FkY2FzdChwZmstPmR1bXAuc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLAorCQkJCSZwZmstPnNrKTsKKwkJcGZrLT5kdW1wLnNrYiA9IE5VTEw7CisJfQorCisJcGZrZXlfdGVybWluYXRlX2R1bXAocGZrKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZmtleV9oZHJfZHVwKHN0cnVjdCBzYWRiX21zZyAqbmV3LCBzdHJ1Y3Qgc2FkYl9tc2cgKm9yaWcpCiB7CiAJKm5ldyA9ICpvcmlnOwpAQCAtMzcyLDYgKzM5OCw3IEBACiAJW1NBREJfWF9FWFRfTkFUX1RfRFBPUlRdCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KSwKIAlbU0FEQl9YX0VYVF9OQVRfVF9PQV0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcyksCiAJW1NBREJfWF9FWFRfU0VDX0NUWF0JCT0gKHU4KSBzaXplb2Yoc3RydWN0IHNhZGJfeF9zZWNfY3R4KSwKKwlbU0FEQl9YX0VYVF9LTUFERFJFU1NdCQk9ICh1OCkgc2l6ZW9mKHN0cnVjdCBzYWRiX3hfa21hZGRyZXNzKSwKIH07CiAKIC8qIFZlcmlmeSBzYWRiX2FkZHJlc3Nfe2xlbixwcmVmaXhsZW59IGFnYWluc3Qgc2FfZmFtaWx5LiAgKi8KQEAgLTE3MzYsOSArMTc2MywxNCBAQAogCW91dF9oZHItPnNhZGJfbXNnX3NhdHlwZSA9IHBma2V5X3Byb3RvMnNhdHlwZSh4LT5pZC5wcm90byk7CiAJb3V0X2hkci0+c2FkYl9tc2dfZXJybm8gPSAwOwogCW91dF9oZHItPnNhZGJfbXNnX3Jlc2VydmVkID0gMDsKLQlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBjb3VudDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBjb3VudCArIDE7CiAJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gcGZrLT5kdW1wLm1zZ19waWQ7Ci0JcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9PTkUsICZwZmstPnNrKTsKKworCWlmIChwZmstPmR1bXAuc2tiKQorCQlwZmtleV9icm9hZGNhc3QocGZrLT5kdW1wLnNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX09ORSwKKwkJCQkmcGZrLT5zayk7CisJcGZrLT5kdW1wLnNrYiA9IG91dF9za2I7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIzNyw3ICsyMjY5LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXhwLT5kZWFkID0gMTsKKwl4cC0+d2Fsay5kZWFkID0gMTsKIAl4ZnJtX3BvbGljeV9kZXN0cm95KHhwKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjMwOSw2ICsyMzQxLDcgQEAKIAogCWMuc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CiAJYy5waWQgPSBoZHItPnNhZGJfbXNnX3BpZDsKKwljLmRhdGEuYnlpZCA9IDA7CiAJYy5ldmVudCA9IFhGUk1fTVNHX0RFTFBPTElDWTsKIAlrbV9wb2xpY3lfbm90aWZ5KHhwLCBwb2wtPnNhZGJfeF9wb2xpY3lfZGlyLTEsICZjKTsKIApAQCAtMjM1MywyNCArMjM4NiwyMSBAQAogCXJldHVybiBQRktFWV9BTElHTjgocGZrZXlfc29ja2FkZHJfbGVuKGZhbWlseSkgKiAyKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV9zb2NrYWRkcl9wYWlyKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0ICpycSwKK3N0YXRpYyBpbnQgcGFyc2Vfc29ja2FkZHJfcGFpcihzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgZXh0X2xlbiwKIAkJCSAgICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKIAkJCSAgICAgICB1MTYgKmZhbWlseSkKIHsKLQl1OCAqc2EgPSAodTggKikgKHJxICsgMSk7CiAJaW50IGFmLCBzb2NrbGVuOwogCi0JaWYgKHJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbiA8Ci0JICAgIHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZSgoKHN0cnVjdCBzb2NrYWRkciAqKXNhKS0+c2FfZmFtaWx5KSkKKwlpZiAoZXh0X2xlbiA8IHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShzYS0+c2FfZmFtaWx5KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhZiA9IHBma2V5X3NvY2thZGRyX2V4dHJhY3QoKHN0cnVjdCBzb2NrYWRkciAqKSBzYSwKLQkJCQkgICAgc2FkZHIpOworCWFmID0gcGZrZXlfc29ja2FkZHJfZXh0cmFjdChzYSwgc2FkZHIpOwogCWlmICghYWYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc29ja2xlbiA9IHBma2V5X3NvY2thZGRyX2xlbihhZik7Ci0JaWYgKHBma2V5X3NvY2thZGRyX2V4dHJhY3QoKHN0cnVjdCBzb2NrYWRkciAqKSAoc2EgKyBzb2NrbGVuKSwKKwlpZiAocGZrZXlfc29ja2FkZHJfZXh0cmFjdCgoc3RydWN0IHNvY2thZGRyICopICgoKHU4ICopc2EpICsgc29ja2xlbiksCiAJCQkJICAgZGFkZHIpICE9IGFmKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjM5MCw3ICsyNDIwLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBvbGQgZW5kb2ludHMgKi8KLQllcnIgPSBwYXJzZV9zb2NrYWRkcl9wYWlyKHJxMSwgJm0tPm9sZF9zYWRkciwgJm0tPm9sZF9kYWRkciwKKwllcnIgPSBwYXJzZV9zb2NrYWRkcl9wYWlyKChzdHJ1Y3Qgc29ja2FkZHIgKikocnExICsgMSksCisJCQkJICBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuLAorCQkJCSAgJm0tPm9sZF9zYWRkciwgJm0tPm9sZF9kYWRkciwKIAkJCQkgICZtLT5vbGRfZmFtaWx5KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMjQwMyw3ICsyNDM1LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBuZXcgZW5kcG9pbnRzICovCi0JZXJyID0gcGFyc2Vfc29ja2FkZHJfcGFpcihycTIsICZtLT5uZXdfc2FkZHIsICZtLT5uZXdfZGFkZHIsCisJZXJyID0gcGFyc2Vfc29ja2FkZHJfcGFpcigoc3RydWN0IHNvY2thZGRyICopKHJxMiArIDEpLAorCQkJCSAgcnEyLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbiwKKwkJCQkgICZtLT5uZXdfc2FkZHIsICZtLT5uZXdfZGFkZHIsCiAJCQkJICAmbS0+bmV3X2ZhbWlseSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTI0MjksMjkgKzI0NjMsNDAgQEAKIAlpbnQgaSwgbGVuLCByZXQsIGVyciA9IC1FSU5WQUw7CiAJdTggZGlyOwogCXN0cnVjdCBzYWRiX2FkZHJlc3MgKnNhOworCXN0cnVjdCBzYWRiX3hfa21hZGRyZXNzICprbWE7CiAJc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbDsKIAlzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqcnE7CiAJc3RydWN0IHhmcm1fc2VsZWN0b3Igc2VsOwogCXN0cnVjdCB4ZnJtX21pZ3JhdGUgbVtYRlJNX01BWF9ERVBUSF07CisJc3RydWN0IHhmcm1fa21hZGRyZXNzIGs7CiAKIAlpZiAoIXByZXNlbnRfYW5kX3NhbWVfZmFtaWx5KGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfU1JDIC0gMV0sCi0JICAgIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNUIC0gMV0pIHx8CisJCQkJICAgICBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVCAtIDFdKSB8fAogCSAgICAhZXh0X2hkcnNbU0FEQl9YX0VYVF9QT0xJQ1kgLSAxXSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKKwlrbWEgPSBleHRfaGRyc1tTQURCX1hfRVhUX0tNQUREUkVTUyAtIDFdOwogCXBvbCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZIC0gMV07Ci0JaWYgKCFwb2wpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKHBvbC0+c2FkYl94X3BvbGljeV9kaXIgPj0gSVBTRUNfRElSX01BWCkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoa21hKSB7CisJCS8qIGNvbnZlcnQgc2FkYl94X2ttYWRkcmVzcyB0byB4ZnJtX2ttYWRkcmVzcyAqLworCQlrLnJlc2VydmVkID0ga21hLT5zYWRiX3hfa21hZGRyZXNzX3Jlc2VydmVkOworCQlyZXQgPSBwYXJzZV9zb2NrYWRkcl9wYWlyKChzdHJ1Y3Qgc29ja2FkZHIgKikoa21hICsgMSksCisJCQkJCSAgOCooa21hLT5zYWRiX3hfa21hZGRyZXNzX2xlbikgLSBzaXplb2YoKmttYSksCisJCQkJCSAgJmsubG9jYWwsICZrLnJlbW90ZSwgJmsuZmFtaWx5KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9IHJldDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJZGlyID0gcG9sLT5zYWRiX3hfcG9saWN5X2RpciAtIDE7CiAJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKIApAQCAtMjQ5Niw3ICsyNTQxLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0dXJuIHhmcm1fbWlncmF0ZSgmc2VsLCBkaXIsIFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgbSwgaSk7CisJcmV0dXJuIHhmcm1fbWlncmF0ZSgmc2VsLCBkaXIsIFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgbSwgaSwKKwkJCSAgICBrbWEgPyAmayA6IE5VTEwpOwogCiAgb3V0OgogCXJldHVybiBlcnI7CkBAIC0yNTc1LDkgKzI2MjEsMTQgQEAKIAlvdXRfaGRyLT5zYWRiX21zZ190eXBlID0gU0FEQl9YX1NQRERVTVA7CiAJb3V0X2hkci0+c2FkYl9tc2dfc2F0eXBlID0gU0FEQl9TQVRZUEVfVU5TUEVDOwogCW91dF9oZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKLQlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBjb3VudDsKKwlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBjb3VudCArIDE7CiAJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gcGZrLT5kdW1wLm1zZ19waWQ7Ci0JcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9PTkUsICZwZmstPnNrKTsKKworCWlmIChwZmstPmR1bXAuc2tiKQorCQlwZmtleV9icm9hZGNhc3QocGZrLT5kdW1wLnNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX09ORSwKKwkJCQkmcGZrLT5zayk7CisJcGZrLT5kdW1wLnNrYiA9IG91dF9za2I7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzI4Myw2ICszMzM0LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGludCBzZXRfc2FkYl9rbWFkZHJlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKQoreworCXN0cnVjdCBzYWRiX3hfa21hZGRyZXNzICprbWE7CisJdTggKnNhOworCWludCBmYW1pbHkgPSBrLT5mYW1pbHk7CisJaW50IHNvY2tsZW4gPSBwZmtleV9zb2NrYWRkcl9sZW4oZmFtaWx5KTsKKwlpbnQgc2l6ZV9yZXE7CisKKwlzaXplX3JlcSA9IChzaXplb2Yoc3RydWN0IHNhZGJfeF9rbWFkZHJlc3MpICsKKwkJICAgIHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShmYW1pbHkpKTsKKworCWttYSA9IChzdHJ1Y3Qgc2FkYl94X2ttYWRkcmVzcyAqKXNrYl9wdXQoc2tiLCBzaXplX3JlcSk7CisJbWVtc2V0KGttYSwgMCwgc2l6ZV9yZXEpOworCWttYS0+c2FkYl94X2ttYWRkcmVzc19sZW4gPSBzaXplX3JlcSAvIDg7CisJa21hLT5zYWRiX3hfa21hZGRyZXNzX2V4dHR5cGUgPSBTQURCX1hfRVhUX0tNQUREUkVTUzsKKwlrbWEtPnNhZGJfeF9rbWFkZHJlc3NfcmVzZXJ2ZWQgPSBrLT5yZXNlcnZlZDsKKworCXNhID0gKHU4ICopKGttYSArIDEpOworCWlmICghcGZrZXlfc29ja2FkZHJfZmlsbCgmay0+bG9jYWwsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKilzYSwgZmFtaWx5KSB8fAorCSAgICAhcGZrZXlfc29ja2FkZHJfZmlsbCgmay0+cmVtb3RlLCAwLCAoc3RydWN0IHNvY2thZGRyICopKHNhK3NvY2tsZW4pLCBmYW1pbHkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNldF9pcHNlY3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICB1aW50OF90IHByb3RvLCB1aW50OF90IG1vZGUsIGludCBsZXZlbCwKIAkJCSAgICB1aW50MzJfdCByZXFpZCwgdWludDhfdCBmYW1pbHksCkBAIC0zMzE1LDcgKzMzOTIsOCBAQAogCiAjaWZkZWYgQ09ORklHX05FVF9LRVlfTUlHUkFURQogc3RhdGljIGludCBwZmtleV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAotCQkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzKQorCQkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzLAorCQkJICAgICAgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKQogewogCWludCBpOwogCWludCBzYXNpemVfc2VsOwpAQCAtMzMzMiw2ICszNDEwLDEyIEBACiAJaWYgKG51bV9idW5kbGVzIDw9IDAgfHwgbnVtX2J1bmRsZXMgPiBYRlJNX01BWF9ERVBUSCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoayAhPSBOVUxMKSB7CisJCS8qIGFkZHJlc3NlcyBmb3IgS00gKi8KKwkJc2l6ZSArPSBQRktFWV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBzYWRiX3hfa21hZGRyZXNzKSArCisJCQkJICAgICBwZmtleV9zb2NrYWRkcl9wYWlyX3NpemUoay0+ZmFtaWx5KSk7CisJfQorCiAJLyogc2VsZWN0b3IgKi8KIAlzYXNpemVfc2VsID0gcGZrZXlfc29ja2FkZHJfc2l6ZShzZWwtPmZhbWlseSk7CiAJaWYgKCFzYXNpemVfc2VsKQpAQCAtMzM2OCw2ICszNDUyLDEwIEBACiAJaGRyLT5zYWRiX21zZ19zZXEgPSAwOwogCWhkci0+c2FkYl9tc2dfcGlkID0gMDsKIAorCS8qIEFkZHJlc3NlcyB0byBiZSB1c2VkIGJ5IEtNIGZvciBuZWdvdGlhdGlvbiwgaWYgZXh0IGlzIGF2YWlsYWJsZSAqLworCWlmIChrICE9IE5VTEwgJiYgKHNldF9zYWRiX2ttYWRkcmVzcyhza2IsIGspIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogc2VsZWN0b3Igc3JjICovCiAJc2V0X3NhZGJfYWRkcmVzcyhza2IsIHNhc2l6ZV9zZWwsIFNBREJfRVhUX0FERFJFU1NfU1JDLCBzZWwpOwogCkBAIC0zNDEzLDcgKzM1MDEsOCBAQAogfQogI2Vsc2UKIHN0YXRpYyBpbnQgcGZrZXlfc2VuZF9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKLQkJCSAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcykKKwkJCSAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcywKKwkJCSAgICAgIHN0cnVjdCB4ZnJtX2ttYWRkcmVzcyAqaykKIHsKIAlyZXR1cm4gLUVOT1BST1RPT1BUOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL0tjb25maWcgYi9uZXQvbWFjODAyMTEvS2NvbmZpZwppbmRleCA4MGQ2OTMzLi43ZjcxMGEyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvS2NvbmZpZworKysgYi9uZXQvbWFjODAyMTEvS2NvbmZpZwpAQCAtMjIsNiArMjIsMTEgQEAKIAkgIG1hYzgwMjExIHRoYXQgdXNlcyBhIFBJRCBjb250cm9sbGVyIHRvIHNlbGVjdCB0aGUgVFgKIAkgIHJhdGUuCiAKK2NvbmZpZyBNQUM4MDIxMV9SQ19NSU5TVFJFTAorCWJvb2wgIk1pbnN0cmVsIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlICdtaW5zdHJlbCcgVFggcmF0ZSBjb250cm9sIGFsZ29yaXRobQorCiBjaG9pY2UKIAlwcm9tcHQgIkRlZmF1bHQgcmF0ZSBjb250cm9sIGFsZ29yaXRobSIKIAlkZWZhdWx0IE1BQzgwMjExX1JDX0RFRkFVTFRfUElECkBAIC0zOSwxMSArNDQsMTkgQEAKIAkgIGRlZmF1bHQgcmF0ZSBjb250cm9sIGFsZ29yaXRobS4gWW91IHNob3VsZCBjaG9vc2UKIAkgIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KIAorY29uZmlnIE1BQzgwMjExX1JDX0RFRkFVTFRfTUlOU1RSRUwKKwlib29sICJNaW5zdHJlbCIKKwlkZXBlbmRzIG9uIE1BQzgwMjExX1JDX01JTlNUUkVMCisJLS0taGVscC0tLQorCSAgU2VsZWN0IE1pbnN0cmVsIGFzIHRoZSBkZWZhdWx0IHJhdGUgY29udHJvbCBhbGdvcml0aG0uCisKKwogZW5kY2hvaWNlCiAKIGNvbmZpZyBNQUM4MDIxMV9SQ19ERUZBVUxUCiAJc3RyaW5nCiAJZGVmYXVsdCAicGlkIiBpZiBNQUM4MDIxMV9SQ19ERUZBVUxUX1BJRAorCWRlZmF1bHQgIm1pbnN0cmVsIiBpZiBNQUM4MDIxMV9SQ19ERUZBVUxUX01JTlNUUkVMCiAJZGVmYXVsdCAiIgogCiBlbmRtZW51CkBAIC0xNzksMTkgKzE5Miw2IEBACiAKIAkgIERvIG5vdCBzZWxlY3QgdGhpcyBvcHRpb24uCiAKLWNvbmZpZyBNQUM4MDIxMV9MT1dUWF9GUkFNRV9EVU1QCi0JYm9vbCAiRGVidWcgZnJhbWUgZHVtcGluZyIKLQlkZXBlbmRzIG9uIE1BQzgwMjExX0RFQlVHX01FTlUKLQktLS1oZWxwLS0tCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgc3RhY2sgdG8KLQkgIHByaW50IGEgbWVzc2FnZSBmb3IgZWFjaCBmcmFtZSB0aGF0IGlzIGhhbmRlZAotCSAgdG8gdGhlIGxvd2xldmVsIGRyaXZlciBmb3IgdHJhbnNtaXNzaW9uLiBUaGlzCi0JICBtZXNzYWdlIGluY2x1ZGVzIGFsbCBNQUMgYWRkcmVzc2VzIGFuZCB0aGUKLQkgIGZyYW1lIGNvbnRyb2wgZmllbGQuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4gYW5kIGluc2VydCB0aGUgZGVidWdnaW5nIGNvZGUKLQkgIHlvdSByZXF1aXJlIGludG8gdGhlIGRyaXZlciB5b3UgYXJlIGRlYnVnZ2luZy4KLQogY29uZmlnIE1BQzgwMjExX0RFQlVHX0NPVU5URVJTCiAJYm9vbCAiRXh0cmEgc3RhdGlzdGljcyBmb3IgVFgvUlggZGVidWdnaW5nIgogCWRlcGVuZHMgb24gTUFDODAyMTFfREVCVUdfTUVOVQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL01ha2VmaWxlIGIvbmV0L21hYzgwMjExL01ha2VmaWxlCmluZGV4IGExNjliMDIuLjMxY2ZkMWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9NYWtlZmlsZQorKysgYi9uZXQvbWFjODAyMTEvTWFrZWZpbGUKQEAgLTcsNiArNyw4IEBACiAJc3RhX2luZm8ubyBcCiAJd2VwLm8gXAogCXdwYS5vIFwKKwlzY2FuLm8gXAorCWh0Lm8gXAogCW1sbWUubyBcCiAJaWZhY2UubyBcCiAJcmF0ZS5vIFwKQEAgLTE1LDYgKzE3LDcgQEAKIAlhZXNfY2NtLm8gXAogCWNmZy5vIFwKIAlyeC5vIFwKKwlzcGVjdG1nbXQubyBcCiAJdHgubyBcCiAJa2V5Lm8gXAogCXV0aWwubyBcCkBAIC0zOCw0ICs0MSw4IEBACiByYzgwMjExX3BpZC15IDo9IHJjODAyMTFfcGlkX2FsZ28ubwogcmM4MDIxMV9waWQtJChDT05GSUdfTUFDODAyMTFfREVCVUdGUykgKz0gcmM4MDIxMV9waWRfZGVidWdmcy5vCiAKK3JjODAyMTFfbWluc3RyZWwteSA6PSByYzgwMjExX21pbnN0cmVsLm8KK3JjODAyMTFfbWluc3RyZWwtJChDT05GSUdfTUFDODAyMTFfREVCVUdGUykgKz0gcmM4MDIxMV9taW5zdHJlbF9kZWJ1Z2ZzLm8KKwogbWFjODAyMTEtJChDT05GSUdfTUFDODAyMTFfUkNfUElEKSArPSAkKHJjODAyMTFfcGlkLXkpCittYWM4MDIxMS0kKENPTkZJR19NQUM4MDIxMV9SQ19NSU5TVFJFTCkgKz0gJChyYzgwMjExX21pbnN0cmVsLXkpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggMjk3YzI1Ny4uODU1MTI2YSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NmZy5jCisrKyBiL25ldC9tYWM4MDIxMS9jZmcuYwpAQCAtMTcsMjYgKzE3LDI2IEBACiAjaW5jbHVkZSAicmF0ZS5oIgogI2luY2x1ZGUgIm1lc2guaCIKIAotc3RhdGljIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzCi1ubDgwMjExX3R5cGVfdG9fbWFjODAyMTFfdHlwZShlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICp3aXBoeV90b19odyhzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CisJcmV0dXJuICZsb2NhbC0+aHc7Cit9CitFWFBPUlRfU1lNQk9MKHdpcGh5X3RvX2h3KTsKKworc3RhdGljIGJvb2wgbmw4MDIxMV90eXBlX2NoZWNrKGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSkKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgotCQlyZXR1cm4gSUVFRTgwMjExX0lGX1RZUEVfU1RBOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCXJldHVybiBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJcmV0dXJuIElFRUU4MDIxMV9JRl9UWVBFX1NUQTsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCXJldHVybiBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQlyZXR1cm4gSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVDsKICNlbmRpZgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgotCQlyZXR1cm4gSUVFRTgwMjExX0lGX1RZUEVfV0RTOworCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgotCQlyZXR1cm4gSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIH0KIApAQCAtNDUsMTcgKzQ1LDE1IEBACiAJCQkgICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwotCWVudW0gaWVlZTgwMjExX2lmX3R5cGVzIGl0eXBlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJaW50IGVycjsKIAotCWl0eXBlID0gbmw4MDIxMV90eXBlX3RvX21hYzgwMjExX3R5cGUodHlwZSk7Ci0JaWYgKGl0eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQpCisJaWYgKCFubDgwMjExX3R5cGVfY2hlY2sodHlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gaWVlZTgwMjExX2lmX2FkZChsb2NhbCwgbmFtZSwgJmRldiwgaXR5cGUsIHBhcmFtcyk7Ci0JaWYgKGVyciB8fCBpdHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSIHx8ICFmbGFncykKKwllcnIgPSBpZWVlODAyMTFfaWZfYWRkKGxvY2FsLCBuYW1lLCAmZGV2LCB0eXBlLCBwYXJhbXMpOworCWlmIChlcnIgfHwgdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SIHx8ICFmbGFncykKIAkJcmV0dXJuIGVycjsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKQEAgLTY2LDEzICs2NCwxNiBAQAogc3RhdGljIGludCBpZWVlODAyMTFfZGVsX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksIGludCBpZmluZGV4KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAKIAkvKiB3ZSdyZSB1bmRlciBSVE5MICovCiAJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgaWZpbmRleCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWVlZTgwMjExX2lmX3JlbW92ZShkZXYpOworCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKworCWllZWU4MDIxMV9pZl9yZW1vdmUoc2RhdGEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MSw5ICs4Miw3IEBACiAJCQkJICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCiAJCQkJICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQllbnVtIGllZWU4MDIxMV9pZl90eXBlcyBpdHlwZTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlpbnQgcmV0OwogCkBAIC05MiwyNSArOTEsMjQgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpdHlwZSA9IG5sODAyMTFfdHlwZV90b19tYWM4MDIxMV90eXBlKHR5cGUpOwotCWlmIChpdHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEKQorCWlmICghbmw4MDIxMV90eXBlX2NoZWNrKHR5cGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAotCXJldCA9IGllZWU4MDIxMV9pZl9jaGFuZ2VfdHlwZShzZGF0YSwgaXR5cGUpOworCXJldCA9IGllZWU4MDIxMV9pZl9jaGFuZ2VfdHlwZShzZGF0YSwgdHlwZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpICYmIHBhcmFtcy0+bWVzaF9pZF9sZW4pCi0JCWllZWU4MDIxMV9pZl9zdGFfc2V0X21lc2hfaWQoJnNkYXRhLT51LnN0YSwKLQkJCQkJICAgICBwYXJhbXMtPm1lc2hfaWRfbGVuLAotCQkJCQkgICAgIHBhcmFtcy0+bWVzaF9pZCk7CisJaWYgKG5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCisJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX01OVFIgfHwgIWZsYWdzKQorCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpICYmIHBhcmFtcy0+bWVzaF9pZF9sZW4pCisJCWllZWU4MDIxMV9zZGF0YV9zZXRfbWVzaF9pZChzZGF0YSwKKwkJCQkJICAgIHBhcmFtcy0+bWVzaF9pZF9sZW4sCisJCQkJCSAgICBwYXJhbXMtPm1lc2hfaWQpOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SIHx8ICFmbGFncykKIAkJcmV0dXJuIDA7CiAKIAlzZGF0YS0+dS5tbnRyX2ZsYWdzID0gKmZsYWdzOwpAQCAtMTIxLDE2ICsxMTksMTIgQEAKIAkJCSAgICAgdTgga2V5X2lkeCwgdTggKm1hY19hZGRyLAogCQkJICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOwogCWVudW0gaWVlZTgwMjExX2tleV9hbGcgYWxnOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CiAJaW50IGVycjsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAogCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKQEAgLTE3NSwxNCArMTY5LDEwIEBACiBzdGF0aWMgaW50IGllZWU4MDIxMV9kZWxfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHU4IGtleV9pZHgsIHU4ICptYWNfYWRkcikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCWludCByZXQ7CiAKLQlpZiAoZGV2ID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yMjMsNyArMjEzLDYgQEAKIAkJCSAgICAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICpjb29raWUsCiAJCQkJCSAgICAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOwogCXU4IHNlcVs2XSA9IHswfTsKQEAgLTIzMyw5ICsyMjIsNiBAQAogCXUxNiBpdjE2OwogCWludCBlcnIgPSAtRU5PRU5UOwogCi0JaWYgKGRldiA9PSBsb2NhbC0+bWRldikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMzExLDEyICsyOTcsOCBAQAogCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQl1OCBrZXlfaWR4KQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAKLQlpZiAoZGV2ID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CkBAIC0zNjUsNyArMzQ3LDcgQEAKIAlzdGEgPSBzdGFfaW5mb19nZXRfYnlfaWR4KGxvY2FsLCBpZHgsIGRldik7CiAJaWYgKHN0YSkgewogCQlyZXQgPSAwOwotCQltZW1jcHkobWFjLCBzdGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1hYywgc3RhLT5zdGEuYWRkciwgRVRIX0FMRU4pOwogCQlzdGFfc2V0X3NpbmZvKHN0YSwgc2luZm8pOwogCX0KIApAQCAtNDk3LDE2ICs0NzksMTIgQEAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2FkZF9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBiZWFjb25fZGF0YSAqb2xkOwogCi0JaWYgKGRldiA9PSBsb2NhbC0+bWRldikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9sZCA9IHNkYXRhLT51LmFwLmJlYWNvbjsKQEAgLTUyMCwxNiArNDk4LDEyIEBACiBzdGF0aWMgaW50IGllZWU4MDIxMV9zZXRfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgYmVhY29uX2RhdGEgKm9sZDsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlvbGQgPSBzZGF0YS0+dS5hcC5iZWFjb247CkBAIC01NDIsMTYgKzUxNiwxMiBAQAogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9kZWxfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgYmVhY29uX2RhdGEgKm9sZDsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlvbGQgPSBzZGF0YS0+dS5hcC5iZWFjb247CkBAIC01OTQsNyArNTY0LDcgQEAKIAkgKiBVcGRhdGUgcmVzcG9uc2UgZnJhbWU7IElFRUUgU3RkIDgwMi4yLTE5OTgsIDUuNC4xLjIuMSAqLwogCiAJbWVtc2V0KG1zZy0+ZGEsIDB4ZmYsIEVUSF9BTEVOKTsKLQltZW1jcHkobXNnLT5zYSwgc3RhLT5hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG1zZy0+c2EsIHN0YS0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKIAltc2ctPmxlbiA9IGh0b25zKDYpOwogCW1zZy0+ZHNhcCA9IDA7CiAJbXNnLT5zc2FwID0gMHgwMTsJLyogTlVMTCBMU0FQLCBDUiBCaXQ6IFJlc3BvbnNlICovCkBAIC02NDksOSArNjE5LDkgQEAKIAkgKi8KIAogCWlmIChwYXJhbXMtPmFpZCkgewotCQlzdGEtPmFpZCA9IHBhcmFtcy0+YWlkOwotCQlpZiAoc3RhLT5haWQgPiBJRUVFODAyMTFfTUFYX0FJRCkKLQkJCXN0YS0+YWlkID0gMDsgLyogWFhYOiBzaG91bGQgdGhpcyBiZSBhbiBlcnJvcj8gKi8KKwkJc3RhLT5zdGEuYWlkID0gcGFyYW1zLT5haWQ7CisJCWlmIChzdGEtPnN0YS5haWQgPiBJRUVFODAyMTFfTUFYX0FJRCkKKwkJCXN0YS0+c3RhLmFpZCA9IDA7IC8qIFhYWDogc2hvdWxkIHRoaXMgYmUgYW4gZXJyb3I/ICovCiAJfQogCiAJaWYgKHBhcmFtcy0+bGlzdGVuX2ludGVydmFsID49IDApCkBAIC02NjgsNyArNjM4LDEyIEBACiAJCQkJCXJhdGVzIHw9IEJJVChqKTsKIAkJCX0KIAkJfQotCQlzdGEtPnN1cHBfcmF0ZXNbbG9jYWwtPm9wZXJfY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKKwkJc3RhLT5zdGEuc3VwcF9yYXRlc1tsb2NhbC0+b3Blcl9jaGFubmVsLT5iYW5kXSA9IHJhdGVzOworCX0KKworCWlmIChwYXJhbXMtPmh0X2NhcGEpIHsKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19odF9pbmZvKHBhcmFtcy0+aHRfY2FwYSwKKwkJCQkJICAgICAgICZzdGEtPnN0YS5odF9pbmZvKTsKIAl9CiAKIAlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSAmJiBwYXJhbXMtPnBsaW5rX2FjdGlvbikgewpAQCAtNjkxLDkgKzY2Niw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJaW50IGVycjsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYgfHwgcGFyYW1zLT52bGFuID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAkvKiBQcmV2ZW50IGEgcmFjZSB3aXRoIGNoYW5naW5nIHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtICovCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRU5FVERPV047CkBAIC03MDEsOCArNjczLDggQEAKIAlpZiAocGFyYW1zLT52bGFuKSB7CiAJCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYocGFyYW1zLT52bGFuKTsKIAotCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4gJiYKLQkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCisJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UKIAkJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwpAQCAtNzIxLDcgKzY5Myw3IEBACiAKIAlzdGFfYXBwbHlfcGFyYW1ldGVycyhsb2NhbCwgc3RhLCBwYXJhbXMpOwogCi0JcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEsIGxvY2FsKTsKKwlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKQEAgLTczMiw4ICs3MDQsOCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfVkxBTiB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApCisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJaWVlZTgwMjExX3NlbmRfbGF5ZXIyX3VwZGF0ZShzdGEpOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC03NDgsOSArNzIwLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAogCWlmIChtYWMpIHsKQEAgLTc4Miw5ICs3NTEsNiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnZsYW5zZGF0YTsKIAotCWlmIChkZXYgPT0gbG9jYWwtPm1kZXYgfHwgcGFyYW1zLT52bGFuID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAkvKiBYWFg6IGdldCBzdGEgYmVsb25naW5nIHRvIGRldiAqLwpAQCAtNzk3LDggKzc2Myw4IEBACiAJaWYgKHBhcmFtcy0+dmxhbiAmJiBwYXJhbXMtPnZsYW4gIT0gc3RhLT5zZGF0YS0+ZGV2KSB7CiAJCXZsYW5zZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKHBhcmFtcy0+dmxhbik7CiAKLQkJaWYgKHZsYW5zZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfVkxBTiAmJgotCQkgICAgdmxhbnNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCQlpZiAodmxhbnNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCisJCSAgICB2bGFuc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC04MjQsMTUgKzc5MCwxMiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCWludCBlcnI7CiAKLQlpZiAoZGV2ID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FTkVURE9XTjsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVCkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC04NDIsMTMgKzgwNSwxMyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQllcnIgPSBtZXNoX3BhdGhfYWRkKGRzdCwgZGV2KTsKKwllcnIgPSBtZXNoX3BhdGhfYWRkKGRzdCwgc2RhdGEpOwogCWlmIChlcnIpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdCwgZGV2KTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZHN0LCBzZGF0YSk7CiAJaWYgKCFtcGF0aCkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTg2MiwxMCArODI1LDEyIEBACiBzdGF0aWMgaW50IGllZWU4MDIxMV9kZWxfbXBhdGgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgdTggKmRzdCkKIHsKLQlpZiAoZHN0KQotCQlyZXR1cm4gbWVzaF9wYXRoX2RlbChkc3QsIGRldik7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JbWVzaF9wYXRoX2ZsdXNoKGRldik7CisJaWYgKGRzdCkKKwkJcmV0dXJuIG1lc2hfcGF0aF9kZWwoZHN0LCBzZGF0YSk7CisKKwltZXNoX3BhdGhfZmx1c2goc2RhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC04NzgsMTUgKzg0MywxMiBAQAogCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCi0JaWYgKGRldiA9PSBsb2NhbC0+bWRldikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRU5FVERPV047CiAKIAlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQpCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtODk3LDcgKzg1OSw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3QsIGRldik7CisJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdCwgc2RhdGEpOwogCWlmICghbXBhdGgpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtOTEzLDcgKzg3NSw3IEBACiAJCQkgICAgc3RydWN0IG1wYXRoX2luZm8gKnBpbmZvKQogewogCWlmIChtcGF0aC0+bmV4dF9ob3ApCi0JCW1lbWNweShuZXh0X2hvcCwgbXBhdGgtPm5leHRfaG9wLT5hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShuZXh0X2hvcCwgbXBhdGgtPm5leHRfaG9wLT5zdGEuYWRkciwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtc2V0KG5leHRfaG9wLCAwLCBFVEhfQUxFTik7CiAKQEAgLTk1MiwyMCArOTE0LDE2IEBACiAJCQkgICAgICAgdTggKmRzdCwgdTggKm5leHRfaG9wLCBzdHJ1Y3QgbXBhdGhfaW5mbyAqcGluZm8pCiAKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOwogCi0JaWYgKGRldiA9PSBsb2NhbC0+bWRldikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UKQorCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZHN0LCBkZXYpOworCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3QsIHNkYXRhKTsKIAlpZiAoIW1wYXRoKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTk4MCwyMCArOTM4LDE2IEBACiAJCQkJIGludCBpZHgsIHU4ICpkc3QsIHU4ICpuZXh0X2hvcCwKIAkJCQkgc3RydWN0IG1wYXRoX2luZm8gKnBpbmZvKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAKLQlpZiAoZGV2ID09IGxvY2FsLT5tZGV2KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQpCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cF9ieV9pZHgoaWR4LCBkZXYpOworCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cF9ieV9pZHgoaWR4LCBzZGF0YSk7CiAJaWYgKCFtcGF0aCkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xMDA1LDYgKzk1OSwzOCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NoYW5nZV9ic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBic3NfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXUzMiBjaGFuZ2VkID0gMDsKKworCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtcy0+dXNlX2N0c19wcm90ID49IDApIHsKKwkJc2RhdGEtPmJzc19jb25mLnVzZV9jdHNfcHJvdCA9IHBhcmFtcy0+dXNlX2N0c19wcm90OworCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVDsKKwl9CisJaWYgKHBhcmFtcy0+dXNlX3Nob3J0X3ByZWFtYmxlID49IDApIHsKKwkJc2RhdGEtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSA9CisJCQlwYXJhbXMtPnVzZV9zaG9ydF9wcmVhbWJsZTsKKwkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEU7CisJfQorCWlmIChwYXJhbXMtPnVzZV9zaG9ydF9zbG90X3RpbWUgPj0gMCkgeworCQlzZGF0YS0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QgPQorCQkJcGFyYW1zLT51c2Vfc2hvcnRfc2xvdF90aW1lOworCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0VSUF9TTE9UOworCX0KKworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIG1hYzgwMjExX2NvbmZpZ19vcHMgPSB7CiAJLmFkZF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfYWRkX2lmYWNlLAogCS5kZWxfdmlydHVhbF9pbnRmID0gaWVlZTgwMjExX2RlbF9pZmFjZSwKQEAgLTEwMjgsNCArMTAxNCw1IEBACiAJLmdldF9tcGF0aCA9IGllZWU4MDIxMV9nZXRfbXBhdGgsCiAJLmR1bXBfbXBhdGggPSBpZWVlODAyMTFfZHVtcF9tcGF0aCwKICNlbmRpZgorCS5jaGFuZ2VfYnNzID0gaWVlZTgwMjExX2NoYW5nZV9ic3MsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKaW5kZXggZWU1MDlmMS4uMjRjZTU0NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCkBAIC01MSw4ICs1MSw2IEBACiAJCSAgICAgIGxvY2FsLT5ody5jb25mLmFudGVubmFfc2VsX3R4KTsKIERFQlVHRlNfUkVBRE9OTFlfRklMRShhbnRlbm5hX3NlbF9yeCwgMjAsICIlZCIsCiAJCSAgICAgIGxvY2FsLT5ody5jb25mLmFudGVubmFfc2VsX3J4KTsKLURFQlVHRlNfUkVBRE9OTFlfRklMRShicmlkZ2VfcGFja2V0cywgMjAsICIlZCIsCi0JCSAgICAgIGxvY2FsLT5icmlkZ2VfcGFja2V0cyk7CiBERUJVR0ZTX1JFQURPTkxZX0ZJTEUocnRzX3RocmVzaG9sZCwgMjAsICIlZCIsCiAJCSAgICAgIGxvY2FsLT5ydHNfdGhyZXNob2xkKTsKIERFQlVHRlNfUkVBRE9OTFlfRklMRShmcmFnbWVudGF0aW9uX3RocmVzaG9sZCwgMjAsICIlZCIsCkBAIC0yMDYsNyArMjA0LDYgQEAKIAlERUJVR0ZTX0FERChmcmVxdWVuY3kpOwogCURFQlVHRlNfQUREKGFudGVubmFfc2VsX3R4KTsKIAlERUJVR0ZTX0FERChhbnRlbm5hX3NlbF9yeCk7Ci0JREVCVUdGU19BREQoYnJpZGdlX3BhY2tldHMpOwogCURFQlVHRlNfQUREKHJ0c190aHJlc2hvbGQpOwogCURFQlVHRlNfQUREKGZyYWdtZW50YXRpb25fdGhyZXNob2xkKTsKIAlERUJVR0ZTX0FERChzaG9ydF9yZXRyeV9saW1pdCk7CkBAIC0yNjMsNyArMjYwLDYgQEAKIAlERUJVR0ZTX0RFTChmcmVxdWVuY3kpOwogCURFQlVHRlNfREVMKGFudGVubmFfc2VsX3R4KTsKIAlERUJVR0ZTX0RFTChhbnRlbm5hX3NlbF9yeCk7Ci0JREVCVUdGU19ERUwoYnJpZGdlX3BhY2tldHMpOwogCURFQlVHRlNfREVMKHJ0c190aHJlc2hvbGQpOwogCURFQlVHRlNfREVMKGZyYWdtZW50YXRpb25fdGhyZXNob2xkKTsKIAlERUJVR0ZTX0RFTChzaG9ydF9yZXRyeV9saW1pdCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19rZXkuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCmluZGV4IGNmODJhY2UuLmEzMjk0ZDEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX2tleS5jCkBAIC0yMDYsNyArMjA2LDggQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlKGtleS0+c3RhKTsKIAlpZiAoc3RhKQotCQlzcHJpbnRmKGJ1ZiwgIi4uLy4uL3N0YXRpb25zLyVzIiwgcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCXNwcmludGYoYnVmLCAiLi4vLi4vc3RhdGlvbnMvJXMiLAorCQkJcHJpbnRfbWFjKG1hYywgc3RhLT5zdGEuYWRkcikpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyogdXNpbmcgc3RhIGFzIGEgYm9vbGVhbiBpcyBmaW5lIG91dHNpZGUgUkNVIGxvY2sgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggODE2NWRmNS4uMmFkNTA0ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTE3Myw3ICsxNzMsNiBAQAogSUVFRTgwMjExX0lGX0ZJTEUoYXV0aF9hbGdzLCB1LnN0YS5hdXRoX2FsZ3MsIEhFWCk7CiBJRUVFODAyMTFfSUZfRklMRShhdXRoX2FsZywgdS5zdGEuYXV0aF9hbGcsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShhdXRoX3RyYW5zYWN0aW9uLCB1LnN0YS5hdXRoX3RyYW5zYWN0aW9uLCBERUMpOwotSUVFRTgwMjExX0lGX0ZJTEUobnVtX2JlYWNvbnNfc3RhLCB1LnN0YS5udW1fYmVhY29ucywgREVDKTsKIAogc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF9mbGFncygKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQpAQCAtMTkyLDcgKzE5MSw2IEBACiAvKiBBUCBhdHRyaWJ1dGVzICovCiBJRUVFODAyMTFfSUZfRklMRShudW1fc3RhX3BzLCB1LmFwLm51bV9zdGFfcHMsIEFUT01JQyk7CiBJRUVFODAyMTFfSUZfRklMRShkdGltX2NvdW50LCB1LmFwLmR0aW1fY291bnQsIERFQyk7Ci1JRUVFODAyMTFfSUZfRklMRShudW1fYmVhY29ucywgdS5hcC5udW1fYmVhY29ucywgREVDKTsKIAogc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF9udW1fYnVmZmVyZWRfbXVsdGljYXN0KAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBjaGFyICpidWYsIGludCBidWZsZW4pCkBAIC0yMDcsMzcgKzIwNSwzNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIC8qIE1lc2ggc3RhdHMgYXR0cmlidXRlcyAqLwotSUVFRTgwMjExX0lGX0ZJTEUoZndkZWRfZnJhbWVzLCB1LnN0YS5tc2hzdGF0cy5md2RlZF9mcmFtZXMsIERFQyk7Ci1JRUVFODAyMTFfSUZfRklMRShkcm9wcGVkX2ZyYW1lc190dGwsIHUuc3RhLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX3R0bCwgREVDKTsKK0lFRUU4MDIxMV9JRl9GSUxFKGZ3ZGVkX2ZyYW1lcywgdS5tZXNoLm1zaHN0YXRzLmZ3ZGVkX2ZyYW1lcywgREVDKTsKK0lFRUU4MDIxMV9JRl9GSUxFKGRyb3BwZWRfZnJhbWVzX3R0bCwgdS5tZXNoLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX3R0bCwgREVDKTsKIElFRUU4MDIxMV9JRl9GSUxFKGRyb3BwZWRfZnJhbWVzX25vX3JvdXRlLAotCQl1LnN0YS5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc19ub19yb3V0ZSwgREVDKTsKLUlFRUU4MDIxMV9JRl9GSUxFKGVzdGFiX3BsaW5rcywgdS5zdGEubXNoc3RhdHMuZXN0YWJfcGxpbmtzLCBBVE9NSUMpOworCQl1Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUsIERFQyk7CitJRUVFODAyMTFfSUZfRklMRShlc3RhYl9wbGlua3MsIHUubWVzaC5tc2hzdGF0cy5lc3RhYl9wbGlua3MsIEFUT01JQyk7CiAKIC8qIE1lc2ggcGFyYW1ldGVycyAqLwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaE1heFJldHJpZXMsCi0JCXUuc3RhLm1zaGNmZy5kb3QxMU1lc2hNYXhSZXRyaWVzLCBERUMsIHU4KTsKKwkJdS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hNYXhSZXRyaWVzLCBERUMsIHU4KTsKIElFRUU4MDIxMV9JRl9XRklMRShkb3QxMU1lc2hSZXRyeVRpbWVvdXQsCi0JCXUuc3RhLm1zaGNmZy5kb3QxMU1lc2hSZXRyeVRpbWVvdXQsIERFQywgdTE2KTsKKwkJdS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hSZXRyeVRpbWVvdXQsIERFQywgdTE2KTsKIElFRUU4MDIxMV9JRl9XRklMRShkb3QxMU1lc2hDb25maXJtVGltZW91dCwKLQkJdS5zdGEubXNoY2ZnLmRvdDExTWVzaENvbmZpcm1UaW1lb3V0LCBERUMsIHUxNik7CisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoQ29uZmlybVRpbWVvdXQsIERFQywgdTE2KTsKIElFRUU4MDIxMV9JRl9XRklMRShkb3QxMU1lc2hIb2xkaW5nVGltZW91dCwKLQkJdS5zdGEubXNoY2ZnLmRvdDExTWVzaEhvbGRpbmdUaW1lb3V0LCBERUMsIHUxNik7Ci1JRUVFODAyMTFfSUZfV0ZJTEUoZG90MTFNZXNoVFRMLCB1LnN0YS5tc2hjZmcuZG90MTFNZXNoVFRMLCBERUMsIHU4KTsKLUlFRUU4MDIxMV9JRl9XRklMRShhdXRvX29wZW5fcGxpbmtzLCB1LnN0YS5tc2hjZmcuYXV0b19vcGVuX3BsaW5rcywgREVDLCB1OCk7CisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSG9sZGluZ1RpbWVvdXQsIERFQywgdTE2KTsKK0lFRUU4MDIxMV9JRl9XRklMRShkb3QxMU1lc2hUVEwsIHUubWVzaC5tc2hjZmcuZG90MTFNZXNoVFRMLCBERUMsIHU4KTsKK0lFRUU4MDIxMV9JRl9XRklMRShhdXRvX29wZW5fcGxpbmtzLCB1Lm1lc2gubXNoY2ZnLmF1dG9fb3Blbl9wbGlua3MsIERFQywgdTgpOwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaE1heFBlZXJMaW5rcywKLQkJdS5zdGEubXNoY2ZnLmRvdDExTWVzaE1heFBlZXJMaW5rcywgREVDLCB1MTYpOworCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaE1heFBlZXJMaW5rcywgREVDLCB1MTYpOwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCwKLQkJdS5zdGEubXNoY2ZnLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCwgREVDLCB1MzIpOworCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCwgREVDLCB1MzIpOwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsCi0JCXUuc3RhLm1zaGNmZy5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsLCBERUMsIHUxNik7CisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCwgREVDLCB1MTYpOwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsCi0JCXUuc3RhLm1zaGNmZy5kb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lLCBERUMsIHUxNik7CisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSwgREVDLCB1MTYpOwogSUVFRTgwMjExX0lGX1dGSUxFKGRvdDExTWVzaEhXTVBtYXhQUkVRcmV0cmllcywKLQkJdS5zdGEubXNoY2ZnLmRvdDExTWVzaEhXTVBtYXhQUkVRcmV0cmllcywgREVDLCB1OCk7CisJCXUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUG1heFBSRVFyZXRyaWVzLCBERUMsIHU4KTsKIElFRUU4MDIxMV9JRl9XRklMRShwYXRoX3JlZnJlc2hfdGltZSwKLQkJdS5zdGEubXNoY2ZnLnBhdGhfcmVmcmVzaF90aW1lLCBERUMsIHUzMik7CisJCXUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUsIERFQywgdTMyKTsKIElFRUU4MDIxMV9JRl9XRklMRShtaW5fZGlzY292ZXJ5X3RpbWVvdXQsCi0JCXUuc3RhLm1zaGNmZy5taW5fZGlzY292ZXJ5X3RpbWVvdXQsIERFQywgdTE2KTsKKwkJdS5tZXNoLm1zaGNmZy5taW5fZGlzY292ZXJ5X3RpbWVvdXQsIERFQywgdTE2KTsKICNlbmRpZgogCiAKQEAgLTI2NSw3ICsyNjMsNiBAQAogCURFQlVHRlNfQUREKGF1dGhfYWxnLCBzdGEpOwogCURFQlVHRlNfQUREKGF1dGhfdHJhbnNhY3Rpb24sIHN0YSk7CiAJREVCVUdGU19BREQoZmxhZ3MsIHN0YSk7Ci0JREVCVUdGU19BREQobnVtX2JlYWNvbnNfc3RhLCBzdGEpOwogfQogCiBzdGF0aWMgdm9pZCBhZGRfYXBfZmlsZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCkBAIC0yNzYsNyArMjczLDYgQEAKIAogCURFQlVHRlNfQUREKG51bV9zdGFfcHMsIGFwKTsKIAlERUJVR0ZTX0FERChkdGltX2NvdW50LCBhcCk7Ci0JREVCVUdGU19BREQobnVtX2JlYWNvbnMsIGFwKTsKIAlERUJVR0ZTX0FERChudW1fYnVmZmVyZWRfbXVsdGljYXN0LCBhcCk7CiB9CiAKQEAgLTM0NSwyNiArMzQxLDI2IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCQlhZGRfbWVzaF9zdGF0cyhzZGF0YSk7CiAJCWFkZF9tZXNoX2NvbmZpZyhzZGF0YSk7CiAjZW5kaWYKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJYWRkX3N0YV9maWxlcyhzZGF0YSk7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJYWRkX2FwX2ZpbGVzKHNkYXRhKTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9XRFM6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJCWFkZF93ZHNfZmlsZXMoc2RhdGEpOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01OVFI6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCQlhZGRfbW9uaXRvcl9maWxlcyhzZGF0YSk7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWFkZF92bGFuX2ZpbGVzKHNkYXRhKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM5OCw3ICszOTQsNiBAQAogCURFQlVHRlNfREVMKGF1dGhfYWxnLCBzdGEpOwogCURFQlVHRlNfREVMKGF1dGhfdHJhbnNhY3Rpb24sIHN0YSk7CiAJREVCVUdGU19ERUwoZmxhZ3MsIHN0YSk7Ci0JREVCVUdGU19ERUwobnVtX2JlYWNvbnNfc3RhLCBzdGEpOwogfQogCiBzdGF0aWMgdm9pZCBkZWxfYXBfZmlsZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCkBAIC00MDksNyArNDA0LDYgQEAKIAogCURFQlVHRlNfREVMKG51bV9zdGFfcHMsIGFwKTsKIAlERUJVR0ZTX0RFTChkdGltX2NvdW50LCBhcCk7Ci0JREVCVUdGU19ERUwobnVtX2JlYWNvbnMsIGFwKTsKIAlERUJVR0ZTX0RFTChudW1fYnVmZmVyZWRfbXVsdGljYXN0LCBhcCk7CiB9CiAKQEAgLTQ4MiwyNiArNDc2LDI2IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCQlkZWxfbWVzaF9zdGF0cyhzZGF0YSk7CiAJCWRlbF9tZXNoX2NvbmZpZyhzZGF0YSk7CiAjZW5kaWYKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJZGVsX3N0YV9maWxlcyhzZGF0YSk7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJZGVsX2FwX2ZpbGVzKHNkYXRhKTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9XRFM6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJCWRlbF93ZHNfZmlsZXMoc2RhdGEpOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01OVFI6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCQlkZWxfbW9uaXRvcl9maWxlcyhzZGF0YSk7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWRlbF92bGFuX2ZpbGVzKHNkYXRhKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTU1MSw4ICs1NDUsMTIgQEAKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAotCXNwcmludGYoYnVmLCAibmV0ZGV2OiVzIiwgZGV2LT5uYW1lKTsKIAlkaXIgPSBzZGF0YS0+ZGVidWdmc2RpcjsKKworCWlmICghZGlyKQorCQlyZXR1cm4gMDsKKworCXNwcmludGYoYnVmLCAibmV0ZGV2OiVzIiwgZGV2LT5uYW1lKTsKIAlpZiAoIWRlYnVnZnNfcmVuYW1lKGRpci0+ZF9wYXJlbnQsIGRpciwgZGlyLT5kX3BhcmVudCwgYnVmKSkKIAkJcHJpbnRrKEtFUk5fRVJSICJtYWM4MDIxMTogZGVidWdmczogZmFpbGVkIHRvIHJlbmFtZSBkZWJ1Z2ZzICIKIAkJICAgICAgICJkaXIgdG8gJXNcbiIsIGJ1Zik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19zdGEuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCmluZGV4IDc5YTA2MjcuLjE4OWQwYmEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCkBAIC01MCw3ICs1MCw3IEBACiAJCVNUQV9SRUFEXyMjZm9ybWF0KG5hbWUsIGZpZWxkKQkJCQlcCiAJCVNUQV9PUFMobmFtZSkKIAotU1RBX0ZJTEUoYWlkLCBhaWQsIEQpOworU1RBX0ZJTEUoYWlkLCBzdGEuYWlkLCBEKTsKIFNUQV9GSUxFKGRldiwgc2RhdGEtPmRldi0+bmFtZSwgUyk7CiBTVEFfRklMRShyeF9wYWNrZXRzLCByeF9wYWNrZXRzLCBMVSk7CiBTVEFfRklMRSh0eF9wYWNrZXRzLCB0eF9wYWNrZXRzLCBMVSk7CkBAIC0xNzMsMTAgKzE3Myw5IEBACiAJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0YS0+c2RhdGEtPmRldjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc3RhLT5zZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAmbG9jYWwtPmh3OwotCXU4ICpkYSA9IHN0YS0+YWRkcjsKKwl1OCAqZGEgPSBzdGEtPnN0YS5hZGRyOwogCXN0YXRpYyBpbnQgdGlkX3N0YXRpY190eFsxNl0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkJCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CiAJc3RhdGljIGludCB0aWRfc3RhdGljX3J4WzE2XSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLApAQCAtMjAxLDcgKzIwMCw3IEBACiAJCXRpZF9udW0gPSB0aWRfbnVtIC0gMTAwOwogCQlpZiAodGlkX3N0YXRpY19yeFt0aWRfbnVtXSA9PSAxKSB7CiAJCQlzdHJjcHkoc3RhdGUsICJvZmYgIik7Ci0JCQlpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbihkZXYsIGRhLCB0aWRfbnVtLCAwLAorCQkJaWVlZTgwMjExX3N0YV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RhLT5zZGF0YSwgZGEsIHRpZF9udW0sIDAsCiAJCQkJCVdMQU5fUkVBU09OX1FTVEFfUkVRVUlSRV9TRVRVUCk7CiAJCQlzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3J4W3RpZF9udW1dIHw9CiAJCQkJCUhUX0FHR19TVEFURV9ERUJVR0ZTX0NUTDsKQEAgLTI1MCwxMSArMjQ5LDIyIEBACiAJREVDTEFSRV9NQUNfQlVGKG1idWYpOwogCXU4ICptYWM7CiAKKwlzdGEtPmRlYnVnZnMuYWRkX2hhc19ydW4gPSB0cnVlOworCiAJaWYgKCFzdGF0aW9uc19kaXIpCiAJCXJldHVybjsKIAotCW1hYyA9IHByaW50X21hYyhtYnVmLCBzdGEtPmFkZHIpOworCW1hYyA9IHByaW50X21hYyhtYnVmLCBzdGEtPnN0YS5hZGRyKTsKIAorCS8qCisJICogVGhpcyBtaWdodCBmYWlsIGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uOgorCSAqIFdoZW4gbWFjODAyMTEgdW5saW5rcyBhIHN0YXRpb24sIHRoZSBkZWJ1Z2ZzIGVudHJpZXMKKwkgKiByZW1haW4sIGJ1dCBpdCBpcyBhbHJlYWR5IHBvc3NpYmxlIHRvIGxpbmsgYSBuZXcKKwkgKiBzdGF0aW9uIHdpdGggdGhlIHNhbWUgYWRkcmVzcyB3aGljaCB0cmlnZ2VycyBhZGRpbmcKKwkgKiBpdCB0byBkZWJ1Z2ZzOyB0aGVyZWZvcmUsIGlmIHRoZSBvbGQgc3RhdGlvbiBpc24ndAorCSAqIGRlc3Ryb3llZCBxdWlja2x5IGVub3VnaCB0aGUgb2xkIHN0YXRpb24ncyBkZWJ1Z2ZzCisJICogZGlyIG1pZ2h0IHN0aWxsIGJlIGFyb3VuZC4KKwkgKi8KIAlzdGEtPmRlYnVnZnMuZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKG1hYywgc3RhdGlvbnNfZGlyKTsKIAlpZiAoIXN0YS0+ZGVidWdmcy5kaXIpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9ldmVudC5jIGIvbmV0L21hYzgwMjExL2V2ZW50LmMKaW5kZXggMjI4MGY0MC4uOGRlNjBkZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2V2ZW50LmMKKysrIGIvbmV0L21hYzgwMjExL2V2ZW50LmMKQEAgLTgsNyArOCw2IEBACiAgKiBtYWM4MDIxMSAtIGV2ZW50cwogICovCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAKQEAgLTE3LDcgKzE2LDcgQEAKICAqIChpbiB0aGUgdmFyaWFibGUgaGRyKSBtdXN0IGJlIGxvbmcgZW5vdWdoIHRvIGV4dHJhY3QgdGhlIFRLSVAKICAqIGZpZWxkcyBsaWtlIFRTQwogICovCi12b2lkIG1hYzgwMjExX2V2X21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGtleWlkeCwKK3ZvaWQgbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgaW50IGtleWlkeCwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCiB7CiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwpAQCAtMzIsNyArMzEsNyBAQAogCQkJcHJpbnRfbWFjKG1hYywgaGRyLT5hZGRyMikpOwogCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CiAJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHNkYXRhLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOwogCQlrZnJlZShidWYpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2h0LmMgYi9uZXQvbWFjODAyMTEvaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdkOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTAsMCArMSw5OTIgQEAKKy8qCisgKiBIVCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAyMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgMjAwMi0yMDA1LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IDIwMDYtMjAwNwlKaXJpIEJlbmMgPGpiZW5jQHN1c2UuY3o+CisgKiBDb3B5cmlnaHQgMjAwNywgTWljaGFlbCBXdSA8ZmxhbWluZ2ljZUBzb3VybWlsay5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCisjaW5jbHVkZSAic3RhX2luZm8uaCIKKyNpbmNsdWRlICJ3bWUuaCIKKworaW50IGllZWU4MDIxMV9odF9jYXBfaWVfdG9faHRfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2llLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbykKK3sKKworCWlmIChodF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGh0X2luZm8sIDAsIHNpemVvZigqaHRfaW5mbykpOworCisJaWYgKGh0X2NhcF9pZSkgeworCQl1OCBhbXBkdV9pbmZvID0gaHRfY2FwX2llLT5hbXBkdV9wYXJhbXNfaW5mbzsKKworCQlodF9pbmZvLT5odF9zdXBwb3J0ZWQgPSAxOworCQlodF9pbmZvLT5jYXAgPSBsZTE2X3RvX2NwdShodF9jYXBfaWUtPmNhcF9pbmZvKTsKKwkJaHRfaW5mby0+YW1wZHVfZmFjdG9yID0KKwkJCWFtcGR1X2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUjsKKwkJaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9CisJCQkoYW1wZHVfaW5mbyAmIElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSkgPj4gMjsKKwkJbWVtY3B5KGh0X2luZm8tPnN1cHBfbWNzX3NldCwgaHRfY2FwX2llLT5zdXBwX21jc19zZXQsIDE2KTsKKwl9IGVsc2UKKwkJaHRfaW5mby0+aHRfc3VwcG9ydGVkID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX2h0X2FkZHRfaW5mb19pZV90b19odF9ic3NfaW5mbygKKwkJCXN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvICpodF9hZGRfaW5mb19pZSwKKwkJCXN0cnVjdCBpZWVlODAyMTFfaHRfYnNzX2luZm8gKmJzc19pbmZvKQoreworCWlmIChic3NfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChic3NfaW5mbywgMCwgc2l6ZW9mKCpic3NfaW5mbykpOworCisJaWYgKGh0X2FkZF9pbmZvX2llKSB7CisJCXUxNiBvcF9tb2RlOworCQlvcF9tb2RlID0gbGUxNl90b19jcHUoaHRfYWRkX2luZm9faWUtPm9wZXJhdGlvbl9tb2RlKTsKKworCQlic3NfaW5mby0+cHJpbWFyeV9jaGFubmVsID0gaHRfYWRkX2luZm9faWUtPmNvbnRyb2xfY2hhbjsKKwkJYnNzX2luZm8tPmJzc19jYXAgPSBodF9hZGRfaW5mb19pZS0+aHRfcGFyYW07CisJCWJzc19pbmZvLT5ic3Nfb3BfbW9kZSA9ICh1OCkob3BfbW9kZSAmIDB4ZmYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXF1ZXN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQkgY29uc3QgdTggKmRhLCB1MTYgdGlkLAorCQkJCQkgdTggZGlhbG9nX3Rva2VuLCB1MTYgc3RhcnRfc2VxX251bSwKKwkJCQkJIHUxNiBhZ2dfc2l6ZSwgdTE2IHRpbWVvdXQpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwl1MTYgY2FwYWI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqbWdtdCkgKyBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciAiCisJCQkJImZvciBhZGRiYSByZXF1ZXN0IGZyYW1lXG4iLCBzZGF0YS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKKwltZW1zZXQobWdtdCwgMCwgMjQpOworCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKKwltZW1jcHkobWdtdC0+c2EsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkKKwkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KG1nbXQtPmJzc2lkLCBpZnN0YS0+YnNzaWQsIEVUSF9BTEVOKTsKKworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CisKKwlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcSkpOworCisJbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX0JBQ0s7CisJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9BRERCQV9SRVE7CisKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47CisJY2FwYWIgPSAodTE2KSgxIDw8IDEpOwkJLyogYml0IDEgYWdncmVnYXRpb24gcG9saWN5ICovCisJY2FwYWIgfD0gKHUxNikodGlkIDw8IDIpOyAJLyogYml0IDU6MiBUSUQgbnVtYmVyICovCisJY2FwYWIgfD0gKHUxNikoYWdnX3NpemUgPDwgNik7CS8qIGJpdCAxNTo2IG1heCBzaXplIG9mIGFnZ2VyZ2F0aW9uICovCisKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5jYXBhYiA9IGNwdV90b19sZTE2KGNhcGFiKTsKKworCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5zdGFydF9zZXFfbnVtID0KKwkJCQkJY3B1X3RvX2xlMTYoc3RhcnRfc2VxX251bSA8PCA0KTsKKworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2FkZGJhX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHU4ICpkYSwgdTE2IHRpZCwKKwkJCQkgICAgICB1OCBkaWFsb2dfdG9rZW4sIHUxNiBzdGF0dXMsIHUxNiBwb2xpY3ksCisJCQkJICAgICAgdTE2IGJ1Zl9zaXplLCB1MTYgdGltZW91dCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXUxNiBjYXBhYjsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCptZ210KSArIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgIgorCQkgICAgICAgImZvciBhZGRiYSByZXNwIGZyYW1lXG4iLCBzZGF0YS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgMjQpOworCW1lbXNldChtZ210LCAwLCAyNCk7CisJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkobWdtdC0+YnNzaWQsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CisKKwlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3ApKTsKKwltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfQkFDSzsKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9BRERCQV9SRVNQOworCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47CisKKwljYXBhYiA9ICh1MTYpKHBvbGljeSA8PCAxKTsJLyogYml0IDEgYWdncmVnYXRpb24gcG9saWN5ICovCisJY2FwYWIgfD0gKHUxNikodGlkIDw8IDIpOyAJLyogYml0IDU6MiBUSUQgbnVtYmVyICovCisJY2FwYWIgfD0gKHUxNikoYnVmX3NpemUgPDwgNik7CS8qIGJpdCAxNTo2IG1heCBzaXplIG9mIGFnZ3JlZ2F0aW9uICovCisKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIgPSBjcHVfdG9fbGUxNihjYXBhYik7CisJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKKwltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKKworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2RlbGJhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSBjb25zdCB1OCAqZGEsIHUxNiB0aWQsCisJCQkJIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb25fY29kZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXUxNiBwYXJhbXM7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqbWdtdCkgKyBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciAiCisJCQkJCSJmb3IgZGVsYmEgZnJhbWVcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCAyNCk7CisJbWVtc2V0KG1nbXQsIDAsIDI0KTsKKwltZW1jcHkobWdtdC0+ZGEsIGRhLCBFVEhfQUxFTik7CisJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbWNweShtZ210LT5ic3NpZCwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7CisJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKKworCXNrYl9wdXQoc2tiLCAxICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuZGVsYmEpKTsKKworCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9CQUNLOworCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9ERUxCQTsKKwlwYXJhbXMgPSAodTE2KShpbml0aWF0b3IgPDwgMTEpOyAJLyogYml0IDExIGluaXRpYXRvciAqLworCXBhcmFtcyB8PSAodTE2KSh0aWQgPDwgMTIpOyAJCS8qIGJpdCAxNToxMiBUSUQgbnVtYmVyICovCisKKwltZ210LT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5yZWFzb25fY29kZSA9IGNwdV90b19sZTE2KHJlYXNvbl9jb2RlKTsKKworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfYmFyKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1OCAqcmEsIHUxNiB0aWQsIHUxNiBzc24pCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2JhciAqYmFyOworCXUxNiBiYXJfY29udHJvbCA9IDA7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqYmFyKSArIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgIgorCQkJImJhciBmcmFtZVxuIiwgc2RhdGEtPmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCWJhciA9IChzdHJ1Y3QgaWVlZTgwMjExX2JhciAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKmJhcikpOworCW1lbXNldChiYXIsIDAsIHNpemVvZigqYmFyKSk7CisJYmFyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8CisJCQkJCSBJRUVFODAyMTFfU1RZUEVfQkFDS19SRVEpOworCW1lbWNweShiYXItPnJhLCByYSwgRVRIX0FMRU4pOworCW1lbWNweShiYXItPnRhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWJhcl9jb250cm9sIHw9ICh1MTYpSUVFRTgwMjExX0JBUl9DVFJMX0FDS19QT0xJQ1lfTk9STUFMOworCWJhcl9jb250cm9sIHw9ICh1MTYpSUVFRTgwMjExX0JBUl9DVFJMX0NCTVRJRF9DT01QUkVTU0VEX0JBOworCWJhcl9jb250cm9sIHw9ICh1MTYpKHRpZCA8PCAxMik7CisJYmFyLT5jb250cm9sID0gY3B1X3RvX2xlMTYoYmFyX2NvbnRyb2wpOworCWJhci0+c3RhcnRfc2VxX251bSA9IGNwdV90b19sZTE2KHNzbik7CisKKwlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IsIDApOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1OCAqcmEsIHUxNiB0aWQsCisJCQkJCXUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAmbG9jYWwtPmh3OworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCWludCByZXQsIGk7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIHJhKTsKKwlpZiAoIXN0YSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIGlmIFRJRCBpcyBpbiBvcGVyYXRpb25hbCBzdGF0ZSAqLworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwlpZiAoc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV9yeFt0aWRdCisJCQkJIT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKwlzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3J4W3RpZF0gPQorCQlIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLIHwKKwkJKGluaXRpYXRvciA8PCBIVF9BR0dfU1RBVEVfSU5JVElBVE9SX1NISUZUKTsKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKworCS8qIHN0b3AgSFcgUnggYWdncmVnYXRpb24uIGFtcGR1X2FjdGlvbiBleGlzdGVuY2UKKwkgKiBhbHJlYWR5IHZlcmlmaWVkIGluIHNlc3Npb24gaW5pdCBzbyB3ZSBhZGQgdGhlIEJVR19PTiAqLworCUJVR19PTighbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKTsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJSeCBCQSBzZXNzaW9uIHN0b3AgcmVxdWVzdGVkIGZvciAlcyB0aWQgJXVcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgcmEpLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJcmV0ID0gbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKGh3LCBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUCwKKwkJCQkgICAgICAgJnN0YS0+c3RhLCB0aWQsIE5VTEwpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0RFQlVHICJIVyBwcm9ibGVtIC0gY2FuIG5vdCBzdG9wIHJ4ICIKKwkJCQkiYWdncmVnYXRpb24gZm9yIHRpZCAlZFxuIiwgdGlkKTsKKworCS8qIHNodXRkb3duIHRpbWVyIGhhcyBub3QgZXhwaXJlZCAqLworCWlmIChpbml0aWF0b3IgIT0gV0xBTl9CQUNLX1RJTUVSKQorCQlkZWxfdGltZXJfc3luYygmc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5zZXNzaW9uX3RpbWVyKTsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgYSBzZWxmIGdlbmVyYXRlZCBhZ2dyZWdhdGlvbiBoYWx0ICovCisJaWYgKGluaXRpYXRvciA9PSBXTEFOX0JBQ0tfUkVDSVBJRU5UIHx8IGluaXRpYXRvciA9PSBXTEFOX0JBQ0tfVElNRVIpCisJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHNkYXRhLCByYSwgdGlkLCAwLCByZWFzb24pOworCisJLyogZnJlZSB0aGUgcmVvcmRlcmluZyBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5idWZfc2l6ZTsgaSsrKSB7CisJCWlmIChzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPnJlb3JkZXJfYnVmW2ldKSB7CisJCQkvKiByZWxlYXNlIHRoZSByZW9yZGVyZWQgZnJhbWVzICovCisJCQlkZXZfa2ZyZWVfc2tiKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+cmVvcmRlcl9idWZbaV0pOworCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5zdG9yZWRfbXBkdV9udW0tLTsKKwkJCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+cmVvcmRlcl9idWZbaV0gPSBOVUxMOworCQl9CisJfQorCS8qIGZyZWUgcmVzb3VyY2VzICovCisJa2ZyZWUoc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5yZW9yZGVyX2J1Zik7CisJa2ZyZWUoc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdKTsKKwlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0gPSBOVUxMOworCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSA9IEhUX0FHR19TVEFURV9JRExFOworCisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKworLyoKKyAqIEFmdGVyIHNlbmRpbmcgYWRkIEJsb2NrIEFjayByZXF1ZXN0IHdlIGFjdGl2YXRlZCBhIHRpbWVyIHVudGlsCisgKiBhZGQgQmxvY2sgQWNrIHJlc3BvbnNlIHdpbGwgYXJyaXZlIGZyb20gdGhlIHJlY2lwaWVudC4KKyAqIElmIHRoaXMgdGltZXIgZXhwaXJlcyBzdGFfYWRkYmFfcmVzcF90aW1lcl9leHBpcmVkIHdpbGwgYmUgZXhlY3V0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHN0YV9hZGRiYV9yZXNwX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIG5vdCBhbiBlbGVnYW50IGRldG91ciwgYnV0IHRoZXJlIGlzIG5vIGNob2ljZSBhcyB0aGUgdGltZXIgcGFzc2VzCisJICogb25seSBvbmUgYXJndW1lbnQsIGFuZCBib3RoIHN0YV9pbmZvIGFuZCBUSUQgYXJlIG5lZWRlZCwgc28gaW5pdAorCSAqIGZsb3cgaW4gc3RhX2luZm9fY3JlYXRlIGdpdmVzIHRoZSBUSUQgYXMgZGF0YSwgd2hpbGUgdGhlIHRpbWVyX3RvX2lkCisJICogYXJyYXkgZ2l2ZXMgdGhlIHN0YSB0aHJvdWdoIGNvbnRhaW5lcl9vZiAqLworCXUxNiB0aWQgPSAqKHU4ICopZGF0YTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnRlbXBfc3RhID0gY29udGFpbmVyX29mKCh2b2lkICopZGF0YSwKKwkJc3RydWN0IHN0YV9pbmZvLCB0aW1lcl90b190aWRbdGlkXSk7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHRlbXBfc3RhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJdTggKnN0YXRlOworCisJcmN1X3JlYWRfbG9jaygpOworCisJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCB0ZW1wX3N0YS0+c3RhLmFkZHIpOworCWlmICghc3RhKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCS8qIGNoZWNrIGlmIHRoZSBUSUQgd2FpdHMgZm9yIGFkZEJBIHJlc3BvbnNlICovCisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfSURMRTsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgInRpbWVyIGV4cGlyZWQgb24gdGlkICVkIGJ1dCB3ZSBhcmUgbm90ICIKKwkJCQkiZXhwZWN0aW5nIGFkZEJBIHJlc3BvbnNlIHRoZXJlIiwgdGlkKTsKKyNlbmRpZgorCQlnb3RvIHRpbWVyX2V4cGlyZWRfZXhpdDsKKwl9CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiYWRkQkEgcmVzcG9uc2UgdGltZXIgZXhwaXJlZCBvbiB0aWQgJWRcbiIsIHRpZCk7CisjZW5kaWYKKworCS8qIGdvIHRocm91Z2ggdGhlIHN0YXRlIGNoZWNrIGluIHN0b3BfQkFfc2Vzc2lvbiAqLworCSpzdGF0ZSA9IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTDsKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKGh3LCB0ZW1wX3N0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkgICAgIFdMQU5fQkFDS19JTklUSUFUT1IpOworCit0aW1lcl9leHBpcmVkX2V4aXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHU4ICphZGRyKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8ICBTVEFfVElEX05VTTsgaSsrKSB7CisJCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oJmxvY2FsLT5odywgYWRkciwgaSwKKwkJCQkJICAgICBXTEFOX0JBQ0tfSU5JVElBVE9SKTsKKwkJaWVlZTgwMjExX3N0YV9zdG9wX3J4X2JhX3Nlc3Npb24oc2RhdGEsIGFkZHIsIGksCisJCQkJCQkgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKKwkJCQkJCSBXTEFOX1JFQVNPTl9RU1RBX0xFQVZFX1FCU1MpOworCX0KK30KKworaW50IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcmEsIHUxNiB0aWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJdTE2IHN0YXJ0X3NlcV9udW07CisJdTggKnN0YXRlOworCWludCByZXQ7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlpZiAodGlkID49IFNUQV9USURfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJPcGVuIEJBIHNlc3Npb24gcmVxdWVzdGVkIGZvciAlcyB0aWQgJXVcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgcmEpLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJcmN1X3JlYWRfbG9jaygpOworCisJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCByYSk7CisJaWYgKCFzdGEpIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBmaW5kIHRoZSBzdGF0aW9uXG4iKTsKKyNlbmRpZgorCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCisJLyogd2UgaGF2ZSB0cmllZCB0b28gbWFueSB0aW1lcywgcmVjZWl2ZXIgZG9lcyBub3Qgd2FudCBBLU1QRFUgKi8KKwlpZiAoc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA+IEhUX0FHR19NQVhfUkVUUklFUykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3VubG9ja19zdGE7CisJfQorCisJc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCS8qIGNoZWNrIGlmIHRoZSBUSUQgaXMgbm90IGluIGFnZ3JlZ2F0aW9uIGZsb3cgYWxyZWFkeSAqLworCWlmICgqc3RhdGUgIT0gSFRfQUdHX1NUQVRFX0lETEUpIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJBIHJlcXVlc3QgZGVuaWVkIC0gc2Vzc2lvbiBpcyBub3QgIgorCQkJCSAiaWRsZSBvbiB0aWQgJXVcbiIsIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX3VubG9ja19zdGE7CisJfQorCisJLyogcHJlcGFyZSBBLU1QRFUgTUxNRSBmb3IgVHggYWdncmVnYXRpb24gKi8KKwlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0gPQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHRpZF9hbXBkdV90eCksIEdGUF9BVE9NSUMpOworCWlmICghc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgImFsbG9jYXRlIHR4IG1sbWUgdG8gdGlkICVkIGZhaWxlZFxuIiwKKwkJCQkJdGlkKTsKKyNlbmRpZgorCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmxvY2tfc3RhOworCX0KKwkvKiBUeCB0aW1lciAqLworCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lci5mdW5jdGlvbiA9CisJCQlzdGFfYWRkYmFfcmVzcF90aW1lcl9leHBpcmVkOworCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lci5kYXRhID0KKwkJCSh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOworCWluaXRfdGltZXIoJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lcik7CisKKwkvKiBjcmVhdGUgYSBuZXcgcXVldWUgZm9yIHRoaXMgYWdncmVnYXRpb24gKi8KKwlyZXQgPSBpZWVlODAyMTFfaHRfYWdnX3F1ZXVlX2FkZChsb2NhbCwgc3RhLCB0aWQpOworCisJLyogY2FzZSBubyBxdWV1ZSBpcyBhdmFpbGFibGUgdG8gYWdncmVnYXRpb24KKwkgKiBkb24ndCBzd2l0Y2ggdG8gYWdncmVnYXRpb24gKi8KKwlpZiAocmV0KSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJCQSByZXF1ZXN0IGRlbmllZCAtIHF1ZXVlIHVuYXZhaWxhYmxlIGZvciIKKwkJCQkJIiB0aWQgJWRcbiIsIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisJCWdvdG8gZXJyX3VubG9ja19xdWV1ZTsKKwl9CisJc2RhdGEgPSBzdGEtPnNkYXRhOworCisJLyogT2ssIHRoZSBBZGRiYSBmcmFtZSBoYXNuJ3QgYmVlbiBzZW50IHlldCwgYnV0IGlmIHRoZSBkcml2ZXIgY2FsbHMgdGhlCisJICogY2FsbCBiYWNrIHJpZ2h0IGF3YXksIGl0IG11c3Qgc2VlIHRoYXQgdGhlIGZsb3cgaGFzIGJlZ3VuICovCisJKnN0YXRlIHw9IEhUX0FEREJBX1JFUVVFU1RFRF9NU0s7CisKKwkvKiBUaGlzIGlzIHNsaWdodGx5IHJhY3kgYmVjYXVzZSB0aGUgcXVldWUgaXNuJ3Qgc3RvcHBlZCAqLworCXN0YXJ0X3NlcV9udW0gPSBzdGEtPnRpZF9zZXFbdGlkXTsKKworCWlmIChsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pCisJCXJldCA9IGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbihodywgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJULAorCQkJCQkgICAgICAgJnN0YS0+c3RhLCB0aWQsICZzdGFydF9zZXFfbnVtKTsKKworCWlmIChyZXQpIHsKKwkJLyogTm8gbmVlZCB0byByZXF1ZXVlIHRoZSBwYWNrZXRzIGluIHRoZSBhZ2cgcXVldWUsIHNpbmNlIHdlCisJCSAqIGhlbGQgdGhlIHR4IGxvY2s6IG5vIHBhY2tldCBjb3VsZCBiZSBlbnF1ZXVlZCB0byB0aGUgbmV3bHkKKwkJICogYWxsb2NhdGVkIHF1ZXVlICovCisJCWllZWU4MDIxMV9odF9hZ2dfcXVldWVfcmVtb3ZlKGxvY2FsLCBzdGEsIHRpZCwgMCk7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJCQSByZXF1ZXN0IGRlbmllZCAtIEhXIHVuYXZhaWxhYmxlIGZvciIKKwkJCQkJIiB0aWQgJWRcbiIsIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisJCSpzdGF0ZSA9IEhUX0FHR19TVEFURV9JRExFOworCQlnb3RvIGVycl91bmxvY2tfcXVldWU7CisJfQorCisJLyogV2lsbCBwdXQgYWxsIHRoZSBwYWNrZXRzIGluIHRoZSBuZXcgU1cgcXVldWUgKi8KKwlpZWVlODAyMTFfcmVxdWV1ZShsb2NhbCwgaWVlZTgwMl8xZF90b19hY1t0aWRdKTsKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKworCS8qIHNlbmQgYW4gYWRkQkEgcmVxdWVzdCAqLworCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7CisJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5kaWFsb2dfdG9rZW4gPQorCQkJc3RhLT5hbXBkdV9tbG1lLmRpYWxvZ190b2tlbl9hbGxvY2F0b3I7CisJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5zc24gPSBzdGFydF9zZXFfbnVtOworCisKKwlpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXF1ZXN0KHN0YS0+c2RhdGEsIHJhLCB0aWQsCisJCQkgc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5kaWFsb2dfdG9rZW4sCisJCQkgc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5zc24sCisJCQkgMHg0MCwgNTAwMCk7CisJLyogYWN0aXZhdGUgdGhlIHRpbWVyIGZvciB0aGUgcmVjaXBpZW50J3MgYWRkQkEgcmVzcG9uc2UgKi8KKwlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIuZXhwaXJlcyA9CisJCQkJamlmZmllcyArIEFEREJBX1JFU1BfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIpOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJhY3RpdmF0ZWQgYWRkQkEgcmVzcG9uc2UgdGltZXIgb24gdGlkICVkXG4iLCB0aWQpOworI2VuZGlmCisJZ290byBleGl0OworCitlcnJfdW5sb2NrX3F1ZXVlOgorCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSk7CisJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0gTlVMTDsKKwlyZXQgPSAtRUJVU1k7CitlcnJfdW5sb2NrX3N0YToKKwlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKK2V4aXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24pOworCitpbnQgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgdTggKnJhLCB1MTYgdGlkLAorCQkJCSBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXU4ICpzdGF0ZTsKKwlpbnQgcmV0ID0gMDsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCWlmICh0aWQgPj0gU1RBX1RJRF9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmN1X3JlYWRfbG9jaygpOworCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOworCWlmICghc3RhKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgVElEIGlzIGluIGFnZ3JlZ2F0aW9uICovCisJc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKworCWlmICgqc3RhdGUgIT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gc3RvcF9CQV9leGl0OworCX0KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJUeCBCQSBzZXNzaW9uIHN0b3AgcmVxdWVzdGVkIGZvciAlcyB0aWQgJXVcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgcmEpLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJaWVlZTgwMjExX3N0b3BfcXVldWUoaHcsIHN0YS0+dGlkX3RvX3R4X3FbdGlkXSk7CisKKwkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLIHwKKwkJKGluaXRpYXRvciA8PCBIVF9BR0dfU1RBVEVfSU5JVElBVE9SX1NISUZUKTsKKworCWlmIChsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pCisJCXJldCA9IGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbihodywgSUVFRTgwMjExX0FNUERVX1RYX1NUT1AsCisJCQkJCSAgICAgICAmc3RhLT5zdGEsIHRpZCwgTlVMTCk7CisKKwkvKiBjYXNlIEhXIGRlbmllZCBnb2luZyBiYWNrIHRvIGxlZ2FjeSAqLworCWlmIChyZXQpIHsKKwkJV0FSTl9PTihyZXQgIT0gLUVCVVNZKTsKKwkJKnN0YXRlID0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMOworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShodywgc3RhLT50aWRfdG9fdHhfcVt0aWRdKTsKKwkJZ290byBzdG9wX0JBX2V4aXQ7CisJfQorCitzdG9wX0JBX2V4aXQ6CisJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbik7CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcmEsIHUxNiB0aWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJdTggKnN0YXRlOworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisJaWYgKHRpZCA+PSBTVEFfVElEX05VTSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIFRJRCB2YWx1ZTogdGlkID0gJWQgKD49ICVkKVxuIiwKKwkJCQl0aWQsIFNUQV9USURfTlVNKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOworCWlmICghc3RhKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGZpbmQgc3RhdGlvbjogJXNcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgcmEpKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKworCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJhZGRCQSB3YXMgbm90IHJlcXVlc3RlZCB5ZXQsIHN0YXRlIGlzICVkXG4iLAorCQkJCSpzdGF0ZSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJV0FSTl9PTl9PTkNFKCpzdGF0ZSAmIEhUX0FEREJBX0RSVl9SRUFEWV9NU0spOworCisJKnN0YXRlIHw9IEhUX0FEREJBX0RSVl9SRUFEWV9NU0s7CisKKwlpZiAoKnN0YXRlID09IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTCkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQWdncmVnYXRpb24gaXMgb24gZm9yIHRpZCAlZCBcbiIsIHRpZCk7CisjZW5kaWYKKwkJaWVlZTgwMjExX3dha2VfcXVldWUoaHcsIHN0YS0+dGlkX3RvX3R4X3FbdGlkXSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCXJjdV9yZWFkX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2IpOworCit2b2lkIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcmEsIHU4IHRpZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwl1OCAqc3RhdGU7CisJaW50IGFnZ19xdWV1ZTsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCWlmICh0aWQgPj0gU1RBX1RJRF9OVU0pIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBUSUQgdmFsdWU6IHRpZCA9ICVkICg+PSAlZClcbiIsCisJCQkJdGlkLCBTVEFfVElEX05VTSk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJTdG9wcGluZyBUeCBCQSBzZXNzaW9uIGZvciAlcyB0aWQgJWRcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgcmEpLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJcmN1X3JlYWRfbG9jaygpOworCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOworCWlmICghc3RhKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZmluZCBzdGF0aW9uOiAlc1xuIiwKKwkJCQlwcmludF9tYWMobWFjLCByYSkpOworI2VuZGlmCisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKKworCS8qIE5PVEU6IG5vIG5lZWQgdG8gdXNlIHN0YS0+bG9jayBpbiB0aGlzIHN0YXRlIGNoZWNrLCBhcworCSAqIGllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24gd2lsbCBsZXQgb25seSBvbmUgc3RvcCBjYWxsIHRvCisJICogcGFzcyB0aHJvdWdoIHBlciBzdGEvdGlkCisJICovCisJaWYgKCgqc3RhdGUgJiBIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJ1bmV4cGVjdGVkIGNhbGxiYWNrIHRvIEEtTVBEVSBzdG9wXG4iKTsKKyNlbmRpZgorCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgqc3RhdGUgJiBIVF9BR0dfU1RBVEVfSU5JVElBVE9SX01TSykKKwkJaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RhLT5zZGF0YSwgcmEsIHRpZCwKKwkJCVdMQU5fQkFDS19JTklUSUFUT1IsIFdMQU5fUkVBU09OX1FTVEFfTk9UX1VTRSk7CisKKwlhZ2dfcXVldWUgPSBzdGEtPnRpZF90b190eF9xW3RpZF07CisKKwlpZWVlODAyMTFfaHRfYWdnX3F1ZXVlX3JlbW92ZShsb2NhbCwgc3RhLCB0aWQsIDEpOworCisJLyogV2UganVzdCByZXF1ZXVlZCB0aGUgYWxsIHRoZSBmcmFtZXMgdGhhdCB3ZXJlIGluIHRoZQorCSAqIHJlbW92ZWQgcXVldWUsIGFuZCBzaW5jZSB3ZSBtaWdodCBtaXNzIGEgc29mdGlycSB3ZSBkbworCSAqIG5ldGlmX3NjaGVkdWxlX3F1ZXVlLiAgaWVlZTgwMjExX3dha2VfcXVldWUgaXMgbm90IHVzZWQKKwkgKiBoZXJlIGFzIHRoaXMgcXVldWUgaXMgbm90IG5lY2Vzc2FyaWx5IHN0b3BwZWQKKwkgKi8KKwluZXRpZl9zY2hlZHVsZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKGxvY2FsLT5tZGV2LCBhZ2dfcXVldWUpKTsKKwlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7CisJKnN0YXRlID0gSFRfQUdHX1NUQVRFX0lETEU7CisJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA9IDA7CisJa2ZyZWUoc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdKTsKKwlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiKTsKKwordm9pZCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICBjb25zdCB1OCAqcmEsIHUxNiB0aWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKnJhX3RpZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYigwKTsKKworCWlmICh1bmxpa2VseSghc2tiKSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5LCAiCisJCQkgICAgICAgImRyb3BwaW5nIHN0YXJ0IEJBIHNlc3Npb24iLCBza2ItPmRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKwlyYV90aWQgPSAoc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKikgJnNrYi0+Y2I7CisJbWVtY3B5KCZyYV90aWQtPnJhLCByYSwgRVRIX0FMRU4pOworCXJhX3RpZC0+dGlkID0gdGlkOworCisJc2tiLT5wa3RfdHlwZSA9IElFRUU4MDIxMV9BRERCQV9NU0c7CisJc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT5za2JfcXVldWUsIHNrYik7CisJdGFza2xldF9zY2hlZHVsZSgmbG9jYWwtPnRhc2tsZXQpOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSk7CisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIGNvbnN0IHU4ICpyYSwgdTE2IHRpZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhX3RpZCAqcmFfdGlkOworCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKDApOworCisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnksICIKKwkJCSAgICAgICAiZHJvcHBpbmcgc3RvcCBCQSBzZXNzaW9uIiwgc2tiLT5kZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybjsKKwl9CisJcmFfdGlkID0gKHN0cnVjdCBpZWVlODAyMTFfcmFfdGlkICopICZza2ItPmNiOworCW1lbWNweSgmcmFfdGlkLT5yYSwgcmEsIEVUSF9BTEVOKTsKKwlyYV90aWQtPnRpZCA9IHRpZDsKKworCXNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfREVMQkFfTVNHOworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+c2tiX3F1ZXVlLCBza2IpOworCXRhc2tsZXRfc2NoZWR1bGUoJmxvY2FsLT50YXNrbGV0KTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSk7CisKKy8qCisgKiBBZnRlciBhY2NlcHRpbmcgdGhlIEFkZEJBIFJlcXVlc3Qgd2UgYWN0aXZhdGVkIGEgdGltZXIsCisgKiByZXNldHRpbmcgaXQgYWZ0ZXIgZWFjaCBmcmFtZSB0aGF0IGFycml2ZXMgZnJvbSB0aGUgb3JpZ2luYXRvci4KKyAqIGlmIHRoaXMgdGltZXIgZXhwaXJlcyBpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbiB3aWxsIGJlIGV4ZWN1dGVkLgorICovCitzdGF0aWMgdm9pZCBzdGFfcnhfYWdnX3Nlc3Npb25fdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyogbm90IGFuIGVsZWdhbnQgZGV0b3VyLCBidXQgdGhlcmUgaXMgbm8gY2hvaWNlIGFzIHRoZSB0aW1lciBwYXNzZXMKKwkgKiBvbmx5IG9uZSBhcmd1bWVudCwgYW5kIHZhcmlvdXMgc3RhX2luZm8gYXJlIG5lZWRlZCBoZXJlLCBzbyBpbml0CisJICogZmxvdyBpbiBzdGFfaW5mb19jcmVhdGUgZ2l2ZXMgdGhlIFRJRCBhcyBkYXRhLCB3aGlsZSB0aGUgdGltZXJfdG9faWQKKwkgKiBhcnJheSBnaXZlcyB0aGUgc3RhIHRocm91Z2ggY29udGFpbmVyX29mICovCisJdTggKnB0aWQgPSAodTggKilkYXRhOworCXU4ICp0aW1lcl90b19pZCA9IHB0aWQgLSAqcHRpZDsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0aW1lcl90b19pZCwgc3RydWN0IHN0YV9pbmZvLAorCQkJCQkgdGltZXJfdG9fdGlkWzBdKTsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJyeCBzZXNzaW9uIHRpbWVyIGV4cGlyZWQgb24gdGlkICVkXG4iLCAodTE2KSpwdGlkKTsKKyNlbmRpZgorCWllZWU4MDIxMV9zdGFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YS0+c2RhdGEsIHN0YS0+c3RhLmFkZHIsCisJCQkJCSAodTE2KSpwdGlkLCBXTEFOX0JBQ0tfVElNRVIsCisJCQkJCSBXTEFOX1JFQVNPTl9RU1RBX1RJTUVPVVQpOworfQorCit2b2lkIGllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3JlcXVlc3Qoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCQkgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAmbG9jYWwtPmh3OworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgdGlkX2FtcGR1X3J4ICp0aWRfYWdnX3J4OworCXUxNiBjYXBhYiwgdGlkLCB0aW1lb3V0LCBiYV9wb2xpY3ksIGJ1Zl9zaXplLCBzdGFydF9zZXFfbnVtLCBzdGF0dXM7CisJdTggZGlhbG9nX3Rva2VuOworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCS8qIGV4dHJhY3Qgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZyb20gYWRkYmEgcmVxdWVzdCBmcmFtZSAqLworCWRpYWxvZ190b2tlbiA9IG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmRpYWxvZ190b2tlbjsKKwl0aW1lb3V0ID0gbGUxNl90b19jcHUobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEudGltZW91dCk7CisJc3RhcnRfc2VxX251bSA9CisJCWxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLnN0YXJ0X3NlcV9udW0pID4+IDQ7CisKKwljYXBhYiA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiKTsKKwliYV9wb2xpY3kgPSAoY2FwYWIgJiBJRUVFODAyMTFfQUREQkFfUEFSQU1fUE9MSUNZX01BU0spID4+IDE7CisJdGlkID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLKSA+PiAyOworCWJ1Zl9zaXplID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX0JVRl9TSVpFX01BU0spID4+IDY7CisKKwlzdGF0dXMgPSBXTEFOX1NUQVRVU19SRVFVRVNUX0RFQ0xJTkVEOworCisJLyogc2FuaXR5IGNoZWNrIGZvciBpbmNvbWluZyBwYXJhbWV0ZXJzOgorCSAqIGNoZWNrIGlmIGNvbmZpZ3VyYXRpb24gY2FuIHN1cHBvcnQgdGhlIEJBIHBvbGljeQorCSAqIGFuZCBpZiBidWZmZXIgc2l6ZSBkb2VzIG5vdCBleGNlZWRzIG1heCB2YWx1ZSAqLworCWlmICgoKGJhX3BvbGljeSAhPSAxKQorCQkmJiAoIShjb25mLT5odF9jb25mLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfREVMQVlfQkEpKSkKKwkJfHwgKGJ1Zl9zaXplID4gSUVFRTgwMjExX01BWF9BTVBEVV9CVUYpKSB7CisJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfUU9TX1BBUkFNOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkFkZEJBIFJlcSB3aXRoIGJhZCBwYXJhbXMgZnJvbSAiCisJCQkJIiVzIG9uIHRpZCAldS4gcG9saWN5ICVkLCBidWZmZXIgc2l6ZSAlZFxuIiwKKwkJCQlwcmludF9tYWMobWFjLCBtZ210LT5zYSksIHRpZCwgYmFfcG9saWN5LAorCQkJCWJ1Zl9zaXplKTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KKwkJZ290byBlbmRfbm9fbG9jazsKKwl9CisJLyogZGV0ZXJtaW5lIGRlZmF1bHQgYnVmZmVyIHNpemUgKi8KKwlpZiAoYnVmX3NpemUgPT0gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07CisJCWJ1Zl9zaXplID0gSUVFRTgwMjExX01JTl9BTVBEVV9CVUY7CisJCWJ1Zl9zaXplID0gYnVmX3NpemUgPDwgc2JhbmQtPmh0X2luZm8uYW1wZHVfZmFjdG9yOworCX0KKworCisJLyogZXhhbWluZSBzdGF0ZSBtYWNoaW5lICovCisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCisJaWYgKHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSAhPSBIVF9BR0dfU1RBVEVfSURMRSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInVuZXhwZWN0ZWQgQWRkQkEgUmVxIGZyb20gIgorCQkJCSIlcyBvbiB0aWQgJXVcbiIsCisJCQkJcHJpbnRfbWFjKG1hYywgbWdtdC0+c2EpLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBwcmVwYXJlIEEtTVBEVSBNTE1FIGZvciBSeCBhZ2dyZWdhdGlvbiAqLworCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGlkX2FtcGR1X3J4KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxsb2NhdGUgcnggbWxtZSB0byB0aWQgJWQgZmFpbGVkXG4iLAorCQkJCQl0aWQpOworI2VuZGlmCisJCWdvdG8gZW5kOworCX0KKwkvKiByeCB0aW1lciAqLworCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lci5mdW5jdGlvbiA9CisJCQkJc3RhX3J4X2FnZ19zZXNzaW9uX3RpbWVyX2V4cGlyZWQ7CisJc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5zZXNzaW9uX3RpbWVyLmRhdGEgPQorCQkJCSh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOworCWluaXRfdGltZXIoJnN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lcik7CisKKwl0aWRfYWdnX3J4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdOworCisJLyogcHJlcGFyZSByZW9yZGVyaW5nIGJ1ZmZlciAqLworCXRpZF9hZ2dfcngtPnJlb3JkZXJfYnVmID0KKwkJa21hbGxvYyhidWZfc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0aWRfYWdnX3J4LT5yZW9yZGVyX2J1ZikgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jYXRlIHJlb3JkZXJpbmcgYnVmZmVyICIKKwkJCSAgICAgICAidG8gdGlkICVkXG4iLCB0aWQpOworI2VuZGlmCisJCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSk7CisJCWdvdG8gZW5kOworCX0KKwltZW1zZXQodGlkX2FnZ19yeC0+cmVvcmRlcl9idWYsIDAsCisJCWJ1Zl9zaXplICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKworCWlmIChsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pCisJCXJldCA9IGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbihodywgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJULAorCQkJCQkgICAgICAgJnN0YS0+c3RhLCB0aWQsICZzdGFydF9zZXFfbnVtKTsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiUnggQS1NUERVIHJlcXVlc3Qgb24gdGlkICVkIHJlc3VsdCAlZFxuIiwgdGlkLCByZXQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJaWYgKHJldCkgeworCQlrZnJlZSh0aWRfYWdnX3J4LT5yZW9yZGVyX2J1Zik7CisJCWtmcmVlKHRpZF9hZ2dfcngpOworCQlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0gPSBOVUxMOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBjaGFuZ2Ugc3RhdGUgYW5kIHNlbmQgYWRkYmEgcmVzcCAqLworCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSA9IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTDsKKwl0aWRfYWdnX3J4LT5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47CisJdGlkX2FnZ19yeC0+c3NuID0gc3RhcnRfc2VxX251bTsKKwl0aWRfYWdnX3J4LT5oZWFkX3NlcV9udW0gPSBzdGFydF9zZXFfbnVtOworCXRpZF9hZ2dfcngtPmJ1Zl9zaXplID0gYnVmX3NpemU7CisJdGlkX2FnZ19yeC0+dGltZW91dCA9IHRpbWVvdXQ7CisJdGlkX2FnZ19yeC0+c3RvcmVkX21wZHVfbnVtID0gMDsKKwlzdGF0dXMgPSBXTEFOX1NUQVRVU19TVUNDRVNTOworZW5kOgorCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCitlbmRfbm9fbG9jazoKKwlpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXNwKHN0YS0+c2RhdGEsIHN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkgIGRpYWxvZ190b2tlbiwgc3RhdHVzLCAxLCBidWZfc2l6ZSwgdGltZW91dCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWRkYmFfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAorCQkJCSAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CisJdTE2IGNhcGFiOworCXUxNiB0aWQ7CisJdTggKnN0YXRlOworCisJY2FwYWIgPSBsZTE2X3RvX2NwdShtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIpOworCXRpZCA9IChjYXBhYiAmIElFRUU4MDIxMV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsKKworCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKKworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKworCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5kaWFsb2dfdG9rZW4gIT0KKwkJc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5kaWFsb2dfdG9rZW4pIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJ3cm9uZyBhZGRCQSByZXNwb25zZSB0b2tlbiwgdGlkICVkXG4iLCB0aWQpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCQlyZXR1cm47CisJfQorCisJZGVsX3RpbWVyX3N5bmMoJnN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+YWRkYmFfcmVzcF90aW1lcik7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInN3aXRjaGVkIG9mZiBhZGRCQSB0aW1lciBmb3IgdGlkICVkIFxuIiwgdGlkKTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KKwlpZiAobGUxNl90b19jcHUobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLnN0YXR1cykKKwkJCT09IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJKnN0YXRlIHw9IEhUX0FEREJBX1JFQ0VJVkVEX01TSzsKKwkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA9IDA7CisKKwkJaWYgKCpzdGF0ZSA9PSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwpCisJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShodywgc3RhLT50aWRfdG9fdHhfcVt0aWRdKTsKKworCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwl9IGVsc2UgeworCQlzdGEtPmFtcGR1X21sbWUuYWRkYmFfcmVxX251bVt0aWRdKys7CisJCS8qIHRoaXMgd2lsbCBhbGxvdyB0aGUgc3RhdGUgY2hlY2sgaW4gc3RvcF9CQV9zZXNzaW9uICovCisJCSpzdGF0ZSA9IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTDsKKwkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisJCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oaHcsIHN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkJICAgICBXTEFOX0JBQ0tfSU5JVElBVE9SKTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfZGVsYmEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJdTE2IHRpZCwgcGFyYW1zOworCXUxNiBpbml0aWF0b3I7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlwYXJhbXMgPSBsZTE2X3RvX2NwdShtZ210LT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyk7CisJdGlkID0gKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9USURfTUFTSykgPj4gMTI7CisJaW5pdGlhdG9yID0gKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9JTklUSUFUT1JfTUFTSykgPj4gMTE7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZGVsYmEgZnJvbSAlcyAoJXMpIHRpZCAlZCByZWFzb24gY29kZSAlZFxuIiwKKwkJCXByaW50X21hYyhtYWMsIG1nbXQtPnNhKSwKKwkJCWluaXRpYXRvciA/ICJpbml0aWF0b3IiIDogInJlY2lwaWVudCIsIHRpZCwKKwkJCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCisJaWYgKGluaXRpYXRvciA9PSBXTEFOX0JBQ0tfSU5JVElBVE9SKQorCQlpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbihzZGF0YSwgc3RhLT5zdGEuYWRkciwgdGlkLAorCQkJCQkJIFdMQU5fQkFDS19JTklUSUFUT1IsIDApOworCWVsc2UgeyAvKiBXTEFOX0JBQ0tfUkVDSVBJRU5UICovCisJCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwkJc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdID0KKwkJCQlIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUw7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKCZsb2NhbC0+aHcsIHN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkJICAgICBXTEFOX0JBQ0tfUkVDSVBJRU5UKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IDQ0OThkODcuLjE1NmU0MmEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0yOSwxNyArMjksNiBAQAogI2luY2x1ZGUgImtleS5oIgogI2luY2x1ZGUgInN0YV9pbmZvLmgiCiAKLS8qIGllZWU4MDIxMS5vIGludGVybmFsIGRlZmluaXRpb25zLCBldGMuIFRoZXNlIGFyZSBub3QgaW5jbHVkZWQgaW50bwotICogbG93LWxldmVsIGRyaXZlcnMuICovCi0KLSNpZm5kZWYgRVRIX1BfUEFFCi0jZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KLSNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KLQotI2RlZmluZSBXTEFOX0ZDX0RBVEFfUFJFU0VOVChmYykgKCgoZmMpICYgMHg0YykgPT0gMHgwOCkKLQotI2RlZmluZSBJRUVFODAyMTFfRkModHlwZSwgc3VidHlwZSkgY3B1X3RvX2xlMTYodHlwZSB8IHN1YnR5cGUpCi0KIHN0cnVjdCBpZWVlODAyMTFfbG9jYWw7CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWVzIHRvIGJ1ZmZlciB3aGVuIHNvbWUgb2YgdGhlCkBAIC02MSw2ICs1MCwxMiBAQAogICogaW5jcmVhc2VkIG1lbW9yeSB1c2UgKGFib3V0IDIga0Igb2YgUkFNIHBlciBlbnRyeSkuICovCiAjZGVmaW5lIElFRUU4MDIxMV9GUkFHTUVOVF9NQVggNAogCisvKgorICogVGltZSBhZnRlciB3aGljaCB3ZSBpZ25vcmUgc2NhbiByZXN1bHRzIGFuZCBubyBsb25nZXIgcmVwb3J0L3VzZQorICogdGhlbSBpbiBhbnkgd2F5LgorICovCisjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUgKDEwICogSFopCisKIHN0cnVjdCBpZWVlODAyMTFfZnJhZ21lbnRfZW50cnkgewogCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOwogCXVuc2lnbmVkIGludCBzZXE7CkBAIC03Myw5ICs2OCw5IEBACiB9OwogCiAKLXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyB7CitzdHJ1Y3QgaWVlZTgwMjExX2JzcyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqaG5leHQ7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmhuZXh0OwogCXNpemVfdCBzc2lkX2xlbjsKIAogCWF0b21pY190IHVzZXJzOwpAQCAtODcsMTYgKzgyLDExIEBACiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCWludCBmcmVxOwogCWludCBzaWduYWwsIG5vaXNlLCBxdWFsOwotCXU4ICp3cGFfaWU7Ci0Jc2l6ZV90IHdwYV9pZV9sZW47Ci0JdTggKnJzbl9pZTsKLQlzaXplX3QgcnNuX2llX2xlbjsKLQl1OCAqd21tX2llOwotCXNpemVfdCB3bW1faWVfbGVuOwotCXU4ICpodF9pZTsKLQlzaXplX3QgaHRfaWVfbGVuOwotCXU4ICpodF9hZGRfaWU7Ci0Jc2l6ZV90IGh0X2FkZF9pZV9sZW47CisJdTggKmllczsgLyogYWxsIGluZm9ybWF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIGxhc3QgQmVhY29uIG9yIFByb2JlCisJCSAgKiBSZXNwb25zZSBmcmFtZXM7IG5vdGUgQmVhY29uIGZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvCisJCSAgKiBvdmVycmlkZSB2YWx1ZXMgZnJvbSBQcm9iZSBSZXNwb25zZSAqLworCXNpemVfdCBpZXNfbGVuOworCWJvb2wgd21tX3VzZWQ7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIAl1OCAqbWVzaF9pZDsKIAlzaXplX3QgbWVzaF9pZF9sZW47CkBAIC0xMDgsNyArOTgsNyBAQAogCXU2NCB0aW1lc3RhbXA7CiAJaW50IGJlYWNvbl9pbnQ7CiAKLQlib29sIHByb2JlX3Jlc3A7CisJdW5zaWduZWQgbG9uZyBsYXN0X3Byb2JlX3Jlc3A7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZTsKIAogCS8qIGR1cmluZyBhc3NvY2F0aW9uLCB3ZSBzYXZlIGFuIEVSUCB2YWx1ZSBmcm9tIGEgcHJvYmUgcmVzcG9uc2Ugc28KQEAgLTExOSw3ICsxMDksNyBAQAogCXU4IGVycF92YWx1ZTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdTggKmJzc19tZXNoX2NmZyhzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcykKK3N0YXRpYyBpbmxpbmUgdTggKmJzc19tZXNoX2NmZyhzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzKQogewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiAJcmV0dXJuIGJzcy0+bWVzaF9jZmc7CkBAIC0xMjcsNyArMTE3LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB1OCAqYnNzX21lc2hfaWQoc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3MpCitzdGF0aWMgaW5saW5lIHU4ICpic3NfbWVzaF9pZChzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzKQogewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiAJcmV0dXJuIGJzcy0+bWVzaF9pZDsKQEAgLTEzNSw3ICsxMjUsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGJzc19tZXNoX2lkX2xlbihzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcykKK3N0YXRpYyBpbmxpbmUgdTggYnNzX21lc2hfaWRfbGVuKHN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MpCiB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIAlyZXR1cm4gYnNzLT5tZXNoX2lkX2xlbjsKQEAgLTE3NCw3ICsxNjQsNyBAQAogCXN0cnVjdCBza19idWZmICoqZXh0cmFfZnJhZzsKIAlpbnQgbnVtX2V4dHJhX2ZyYWc7CiAKLQl1MTYgZmMsIGV0aGVydHlwZTsKKwl1MTYgZXRoZXJ0eXBlOwogCXVuc2lnbmVkIGludCBmbGFnczsKIH07CiAKQEAgLTIwMiw3ICsxOTIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXM7CiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOwogCi0JdTE2IGZjLCBldGhlcnR5cGU7CisJdTE2IGV0aGVydHlwZTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJaW50IHNlbnRfcHNfYnVmZmVyZWQ7CiAJaW50IHF1ZXVlOwpAQCAtMjM5LDcgKzIyOSw2IEBACiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwc19iY19idWY7CiAJYXRvbWljX3QgbnVtX3N0YV9wczsgLyogbnVtYmVyIG9mIHN0YXRpb25zIGluIFBTIG1vZGUgKi8KIAlpbnQgZHRpbV9jb3VudDsKLQlpbnQgbnVtX2JlYWNvbnM7IC8qIG51bWJlciBvZiBUWGVkIGJlYWNvbiBmcmFtZXMgZm9yIHRoaXMgQlNTICovCiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2lmX3dkcyB7CkBAIC0zMDAsMjIgKzI4OSw3OCBAQAogI2RlZmluZSBJRUVFODAyMTFfU1RBX0FVVE9fQlNTSURfU0VMCUJJVCgxMSkKICNkZWZpbmUgSUVFRTgwMjExX1NUQV9BVVRPX0NIQU5ORUxfU0VMCUJJVCgxMikKICNkZWZpbmUgSUVFRTgwMjExX1NUQV9QUklWQUNZX0lOVk9LRUQJQklUKDEzKQorLyogZmxhZ3MgZm9yIE1MTUUgcmVxdWVzdCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RBX1JFUV9TQ0FOIDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUQV9SRVFfRElSRUNUX1BST0JFIDEKKyNkZWZpbmUgSUVFRTgwMjExX1NUQV9SRVFfQVVUSCAyCisjZGVmaW5lIElFRUU4MDIxMV9TVEFfUkVRX1JVTiAgMworCisvKiBTVEEvSUJTUyBNTE1FIHN0YXRlcyAqLworZW51bSBpZWVlODAyMTFfc3RhX21sbWVfc3RhdGUgeworCUlFRUU4MDIxMV9TVEFfTUxNRV9ESVNBQkxFRCwKKwlJRUVFODAyMTFfU1RBX01MTUVfRElSRUNUX1BST0JFLAorCUlFRUU4MDIxMV9TVEFfTUxNRV9BVVRIRU5USUNBVEUsCisJSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURSwKKwlJRUVFODAyMTFfU1RBX01MTUVfQVNTT0NJQVRFRCwKKwlJRUVFODAyMTFfU1RBX01MTUVfSUJTU19TRUFSQ0gsCisJSUVFRTgwMjExX1NUQV9NTE1FX0lCU1NfSk9JTkVELAorfTsKKworLyogYml0ZmllbGQgb2YgYWxsb3dlZCBhdXRoIGFsZ3MgKi8KKyNkZWZpbmUgSUVFRTgwMjExX0FVVEhfQUxHX09QRU4gQklUKDApCisjZGVmaW5lIElFRUU4MDIxMV9BVVRIX0FMR19TSEFSRURfS0VZIEJJVCgxKQorI2RlZmluZSBJRUVFODAyMTFfQVVUSF9BTEdfTEVBUCBCSVQoMikKKwogc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgewogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXU4IGJzc2lkW0VUSF9BTEVOXSwgcHJldl9ic3NpZFtFVEhfQUxFTl07CiAJdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOXTsKLQllbnVtIHsKLQkJSUVFRTgwMjExX0RJU0FCTEVELCBJRUVFODAyMTFfQVVUSEVOVElDQVRFLAotCQlJRUVFODAyMTFfQVNTT0NJQVRFLCBJRUVFODAyMTFfQVNTT0NJQVRFRCwKLQkJSUVFRTgwMjExX0lCU1NfU0VBUkNILCBJRUVFODAyMTFfSUJTU19KT0lORUQsCi0JCUlFRUU4MDIxMV9NRVNIX1VQCi0JfSBzdGF0ZTsKKwllbnVtIGllZWU4MDIxMV9zdGFfbWxtZV9zdGF0ZSBzdGF0ZTsKIAlzaXplX3Qgc3NpZF9sZW47CiAJdTggc2Nhbl9zc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dOwogCXNpemVfdCBzY2FuX3NzaWRfbGVuOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICisJdTE2IGFpZDsKKwl1MTYgYXBfY2FwYWIsIGNhcGFiOworCXU4ICpleHRyYV9pZTsgLyogdG8gYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiBBc3NvY1JlcSAqLworCXNpemVfdCBleHRyYV9pZV9sZW47CisKKwkvKiBUaGUgbGFzdCBBc3NvY1JlcS9SZXNwIElFcyAqLworCXU4ICphc3NvY3JlcV9pZXMsICphc3NvY3Jlc3BfaWVzOworCXNpemVfdCBhc3NvY3JlcV9pZXNfbGVuLCBhc3NvY3Jlc3BfaWVzX2xlbjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOworCisJaW50IGFzc29jX3NjYW5fdHJpZXM7IC8qIG51bWJlciBvZiBzY2FucyBkb25lIHByZS1hc3NvY2lhdGlvbiAqLworCWludCBkaXJlY3RfcHJvYmVfdHJpZXM7IC8qIHJldHJpZXMgZm9yIGRpcmVjdCBwcm9iZXMgKi8KKwlpbnQgYXV0aF90cmllczsgLyogcmV0cmllcyBmb3IgYXV0aCByZXEgKi8KKwlpbnQgYXNzb2NfdHJpZXM7IC8qIHJldHJpZXMgZm9yIGFzc29jIHJlcSAqLworCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0OworCisJdW5zaWduZWQgbG9uZyBsYXN0X3Byb2JlOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJdW5zaWduZWQgaW50IGF1dGhfYWxnczsgLyogYml0ZmllbGQgb2YgYWxsb3dlZCBhdXRoIGFsZ3MgKi8KKwlpbnQgYXV0aF9hbGc7IC8qIGN1cnJlbnRseSB1c2VkIElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAqLworCWludCBhdXRoX3RyYW5zYWN0aW9uOworCisJdW5zaWduZWQgbG9uZyBpYnNzX2pvaW5fcmVxOworCXN0cnVjdCBza19idWZmICpwcm9iZV9yZXNwOyAvKiBQcm9iZVJlc3AgdGVtcGxhdGUgZm9yIElCU1MgKi8KKwl1MzIgc3VwcF9yYXRlc19iaXRzW0lFRUU4MDIxMV9OVU1fQkFORFNdOworCisJaW50IHdtbV9sYXN0X3BhcmFtX3NldDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgaG91c2VrZWVwaW5nX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IG1lc2hfcGF0aF90aW1lcjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9xdWV1ZTsKKworCWJvb2wgaG91c2VrZWVwaW5nOworCiAJdTggbWVzaF9pZFtJRUVFODAyMTFfTUFYX01FU0hfSURfTEVOXTsKIAlzaXplX3QgbWVzaF9pZF9sZW47CiAJLyogQWN0aXZlIFBhdGggU2VsZWN0aW9uIFByb3RvY29sIElkZW50aWZpZXIgKi8KQEAgLTM0MSw2NiArMzg2LDM1IEBACiAJc3RydWN0IG1lc2hfY29uZmlnIG1zaGNmZzsKIAl1MzIgbWVzaF9zZXFudW07CiAJYm9vbCBhY2NlcHRpbmdfcGxpbmtzOwotI2VuZGlmCi0JdTE2IGFpZDsKLQl1MTYgYXBfY2FwYWIsIGNhcGFiOwotCXU4ICpleHRyYV9pZTsgLyogdG8gYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiBBc3NvY1JlcSAqLwotCXNpemVfdCBleHRyYV9pZV9sZW47Ci0KLQkvKiBUaGUgbGFzdCBBc3NvY1JlcS9SZXNwIElFcyAqLwotCXU4ICphc3NvY3JlcV9pZXMsICphc3NvY3Jlc3BfaWVzOwotCXNpemVfdCBhc3NvY3JlcV9pZXNfbGVuLCBhc3NvY3Jlc3BfaWVzX2xlbjsKLQotCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOwotCi0JaW50IGF1dGhfdHJpZXMsIGFzc29jX3RyaWVzOwotCi0JdW5zaWduZWQgbG9uZyByZXF1ZXN0OwotCi0JdW5zaWduZWQgbG9uZyBsYXN0X3Byb2JlOwotCi0JdW5zaWduZWQgaW50IGZsYWdzOwotI2RlZmluZSBJRUVFODAyMTFfU1RBX1JFUV9TQ0FOIDAKLSNkZWZpbmUgSUVFRTgwMjExX1NUQV9SRVFfQVVUSCAxCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFfUkVRX1JVTiAgMgotCi0jZGVmaW5lIElFRUU4MDIxMV9BVVRIX0FMR19PUEVOIEJJVCgwKQotI2RlZmluZSBJRUVFODAyMTFfQVVUSF9BTEdfU0hBUkVEX0tFWSBCSVQoMSkKLSNkZWZpbmUgSUVFRTgwMjExX0FVVEhfQUxHX0xFQVAgQklUKDIpCi0JdW5zaWduZWQgaW50IGF1dGhfYWxnczsgLyogYml0ZmllbGQgb2YgYWxsb3dlZCBhdXRoIGFsZ3MgKi8KLQlpbnQgYXV0aF9hbGc7IC8qIGN1cnJlbnRseSB1c2VkIElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSAqLwotCWludCBhdXRoX3RyYW5zYWN0aW9uOwotCi0JdW5zaWduZWQgbG9uZyBpYnNzX2pvaW5fcmVxOwotCXN0cnVjdCBza19idWZmICpwcm9iZV9yZXNwOyAvKiBQcm9iZVJlc3AgdGVtcGxhdGUgZm9yIElCU1MgKi8KLQl1MzIgc3VwcF9yYXRlc19iaXRzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwotCi0JaW50IHdtbV9sYXN0X3BhcmFtX3NldDsKLQlpbnQgbnVtX2JlYWNvbnM7IC8qIG51bWJlciBvZiBUWGVkIGJlYWNvbiBmcmFtZXMgYnkgdGhpcyBTVEEgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaWZfc3RhX3NldF9tZXNoX2lkKHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwKLQkJCQkJCXU4IG1lc2hfaWRfbGVuLCB1OCAqbWVzaF9pZCkKLXsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotCWlmc3RhLT5tZXNoX2lkX2xlbiA9IG1lc2hfaWRfbGVuOwotCW1lbWNweShpZnN0YS0+bWVzaF9pZCwgbWVzaF9pZCwgbWVzaF9pZF9sZW4pOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotI2RlZmluZSBJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKHN0YSwgbmFtZSkJXAotCWRvIHsgKHN0YSktPm1zaHN0YXRzLm5hbWUrKzsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhtc2gsIG5hbWUpCVwKKwlkbyB7IChtc2gpLT5tc2hzdGF0cy5uYW1lKys7IH0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKHN0YSwgbmFtZSkgXAorI2RlZmluZSBJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKG1zaCwgbmFtZSkgXAogCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0vKiBmbGFncyB1c2VkIGluIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEuZmxhZ3MgKi8KLSNkZWZpbmUgSUVFRTgwMjExX1NEQVRBX0FMTE1VTFRJCUJJVCgwKQotI2RlZmluZSBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQwkJQklUKDEpCi0jZGVmaW5lIElFRUU4MDIxMV9TREFUQV9VU0VSU1BBQ0VfTUxNRQlCSVQoMikKLSNkZWZpbmUgSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERQlCSVQoMykKKy8qKgorICogZW51bSBpZWVlODAyMTFfc3ViX2lmX2RhdGFfZmxhZ3MgLSB2aXJ0dWFsIGludGVyZmFjZSBmbGFncworICoKKyAqIEBJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEk6IGludGVyZmFjZSB3YW50cyBhbGwgbXVsdGljYXN0IHBhY2tldHMKKyAqIEBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQzogaW50ZXJmYWNlIGlzIHByb21pc2MKKyAqIEBJRUVFODAyMTFfU0RBVEFfVVNFUlNQQUNFX01MTUU6IHVzZXJzcGFjZSBNTE1FIGlzIGFjdGl2ZQorICogQElFRUU4MDIxMV9TREFUQV9PUEVSQVRJTkdfR01PREU6IG9wZXJhdGluZyBpbiBHLW9ubHkgbW9kZQorICogQElFRUU4MDIxMV9TREFUQV9ET05UX0JSSURHRV9QQUNLRVRTOiBicmlkZ2UgcGFja2V0cyBiZXR3ZWVuCisgKglhc3NvY2lhdGVkIHN0YXRpb25zIGFuZCBkZWxpdmVyIG11bHRpY2FzdCBmcmFtZXMgYm90aAorICoJYmFjayB0byB3aXJlbGVzcyBtZWRpYSBhbmQgdG8gdGhlIGxvY2FsIG5ldCBzdGFjay4KKyAqLworZW51bSBpZWVlODAyMTFfc3ViX2lmX2RhdGFfZmxhZ3MgeworCUlFRUU4MDIxMV9TREFUQV9BTExNVUxUSQkJPSBCSVQoMCksCisJSUVFRTgwMjExX1NEQVRBX1BST01JU0MJCQk9IEJJVCgxKSwKKwlJRUVFODAyMTFfU0RBVEFfVVNFUlNQQUNFX01MTUUJCT0gQklUKDIpLAorCUlFRUU4MDIxMV9TREFUQV9PUEVSQVRJTkdfR01PREUJCT0gQklUKDMpLAorCUlFRUU4MDIxMV9TREFUQV9ET05UX0JSSURHRV9QQUNLRVRTCT0gQklUKDQpLAorfTsKKwogc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCkBAIC00MTYsMTEgKzQzMCw2IEBACiAKIAlpbnQgZHJvcF91bmVuY3J5cHRlZDsKIAotCS8qCi0JICogYmFzaWMgcmF0ZXMgb2YgdGhpcyBBUCBvciB0aGUgQVAgd2UncmUgYXNzb2NpYXRlZCB0bwotCSAqLwotCXU2NCBiYXNpY19yYXRlczsKLQogCS8qIEZyYWdtZW50IHRhYmxlIGZvciBob3N0LWJhc2VkIHJlYXNzZW1ibHkgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdtZW50X2VudHJ5CWZyYWdtZW50c1tJRUVFODAyMTFfRlJBR01FTlRfTUFYXTsKIAl1bnNpZ25lZCBpbnQgZnJhZ21lbnRfbmV4dDsKQEAgLTQ0Nyw2ICs0NTYsOSBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3dkcyB3ZHM7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfdmxhbiB2bGFuOwogCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSBzdGE7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKKwkJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoIG1lc2g7CisjZW5kaWYKIAkJdTMyIG1udHJfZmxhZ3M7CiAJfSB1OwogCkBAIC00NjksNyArNDgxLDYgQEAKIAkJCXN0cnVjdCBkZW50cnkgKmF1dGhfYWxnOwogCQkJc3RydWN0IGRlbnRyeSAqYXV0aF90cmFuc2FjdGlvbjsKIAkJCXN0cnVjdCBkZW50cnkgKmZsYWdzOwotCQkJc3RydWN0IGRlbnRyeSAqbnVtX2JlYWNvbnNfc3RhOwogCQkJc3RydWN0IGRlbnRyeSAqZm9yY2VfdW5pY2FzdF9yYXRlaWR4OwogCQkJc3RydWN0IGRlbnRyeSAqbWF4X3JhdGVjdHJsX3JhdGVpZHg7CiAJCX0gc3RhOwpAQCAtNDc3LDcgKzQ4OCw2IEBACiAJCQlzdHJ1Y3QgZGVudHJ5ICpkcm9wX3VuZW5jcnlwdGVkOwogCQkJc3RydWN0IGRlbnRyeSAqbnVtX3N0YV9wczsKIAkJCXN0cnVjdCBkZW50cnkgKmR0aW1fY291bnQ7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpudW1fYmVhY29uczsKIAkJCXN0cnVjdCBkZW50cnkgKmZvcmNlX3VuaWNhc3RfcmF0ZWlkeDsKIAkJCXN0cnVjdCBkZW50cnkgKm1heF9yYXRlY3RybF9yYXRlaWR4OwogCQkJc3RydWN0IGRlbnRyeSAqbnVtX2J1ZmZlcmVkX211bHRpY2FzdDsKQEAgLTU0MCw2ICs1NTAsMTkgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHAsIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHZpZik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3NkYXRhX3NldF9tZXNoX2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgIHU4IG1lc2hfaWRfbGVuLCB1OCAqbWVzaF9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAorCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2ggPSAmc2RhdGEtPnUubWVzaDsKKwlpZm1zaC0+bWVzaF9pZF9sZW4gPSBtZXNoX2lkX2xlbjsKKwltZW1jcHkoaWZtc2gtPm1lc2hfaWQsIG1lc2hfaWQsIG1lc2hfaWRfbGVuKTsKKyNlbHNlCisJV0FSTl9PTigxKTsKKyNlbmRpZgorfQorCiBlbnVtIHsKIAlJRUVFODAyMTFfUlhfTVNHCT0gMSwKIAlJRUVFODAyMTFfVFhfU1RBVFVTX01TRwk9IDIsCkBAIC01NTAsNiArNTczLDEwIEBACiAvKiBtYXhpbXVtIG51bWJlciBvZiBoYXJkd2FyZSBxdWV1ZXMgd2Ugc3VwcG9ydC4gKi8KICNkZWZpbmUgUURfTUFYX1FVRVVFUyAoSUVFRTgwMjExX01BWF9BTVBEVV9RVUVVRVMgKyBJRUVFODAyMTFfTUFYX1FVRVVFUykKIAorc3RydWN0IGllZWU4MDIxMV9tYXN0ZXJfcHJpdiB7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7Cit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsIHsKIAkvKiBlbWJlZCB0aGUgZHJpdmVyIHZpc2libGUgcGFydC4KIAkgKiBkb24ndCBjYXN0ICh1c2UgdGhlIHN0YXRpYyBpbmxpbmVzIGJlbG93KSwgYnV0IHdlIGtlZXAKQEAgLTYxMywxMCArNjQwLDYgQEAKIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqd2VwX3J4X3RmbTsKIAl1MzIgd2VwX2l2OwogCi0JaW50IGJyaWRnZV9wYWNrZXRzOyAvKiBicmlkZ2UgcGFja2V0cyBiZXR3ZWVuIGFzc29jaWF0ZWQgc3RhdGlvbnMgYW5kCi0JCQkgICAgICogZGVsaXZlciBtdWx0aWNhc3QgZnJhbWVzIGJvdGggYmFjayB0byB3aXJlbGVzcwotCQkJICAgICAqIG1lZGlhIGFuZCB0byB0aGUgbG9jYWwgbmV0IHN0YWNrICovCi0KIAlzdHJ1Y3QgbGlzdF9oZWFkIGludGVyZmFjZXM7CiAKIAkvKgpAQCAtNjI2LDIxICs2NDksMjEgQEAKIAlzcGlubG9ja190IGtleV9sb2NrOwogCiAKLQlib29sIHN0YV9zd19zY2FubmluZzsKLQlib29sIHN0YV9od19zY2FubmluZzsKKwkvKiBTY2FubmluZyBhbmQgQlNTIGxpc3QgKi8KKwlib29sIHN3X3NjYW5uaW5nLCBod19zY2FubmluZzsKIAlpbnQgc2Nhbl9jaGFubmVsX2lkeDsKIAllbnVtIGllZWU4MDIxMV9iYW5kIHNjYW5fYmFuZDsKIAogCWVudW0geyBTQ0FOX1NFVF9DSEFOTkVMLCBTQ0FOX1NFTkRfUFJPQkUgfSBzY2FuX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9zY2FuX2NvbXBsZXRlZDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjYW5fd29yazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc2Nhbl9kZXY7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2Nhbl9zZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm9wZXJfY2hhbm5lbCwgKnNjYW5fY2hhbm5lbDsKIAl1OCBzY2FuX3NzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07CiAJc2l6ZV90IHNjYW5fc3NpZF9sZW47Ci0Jc3RydWN0IGxpc3RfaGVhZCBzdGFfYnNzX2xpc3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpzdGFfYnNzX2hhc2hbU1RBX0hBU0hfU0laRV07Ci0Jc3BpbmxvY2tfdCBzdGFfYnNzX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBic3NfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzX2hhc2hbU1RBX0hBU0hfU0laRV07CisJc3BpbmxvY2tfdCBic3NfbG9jazsKIAogCS8qIFNOTVAgY291bnRlcnMgKi8KIAkvKiBkb3QxMUNvdW50ZXJzVGFibGUgKi8KQEAgLTcwMSwxMCArNzI0LDExIEBACiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwogCXN0cnVjdCBsb2NhbF9kZWJ1Z2ZzZGVudHJpZXMgeworCQlzdHJ1Y3QgZGVudHJ5ICpyY2RpcjsKKwkJc3RydWN0IGRlbnRyeSAqcmNuYW1lOwogCQlzdHJ1Y3QgZGVudHJ5ICpmcmVxdWVuY3k7CiAJCXN0cnVjdCBkZW50cnkgKmFudGVubmFfc2VsX3R4OwogCQlzdHJ1Y3QgZGVudHJ5ICphbnRlbm5hX3NlbF9yeDsKLQkJc3RydWN0IGRlbnRyeSAqYnJpZGdlX3BhY2tldHM7CiAJCXN0cnVjdCBkZW50cnkgKnJ0c190aHJlc2hvbGQ7CiAJCXN0cnVjdCBkZW50cnkgKmZyYWdtZW50YXRpb25fdGhyZXNob2xkOwogCQlzdHJ1Y3QgZGVudHJ5ICpzaG9ydF9yZXRyeV9saW1pdDsKQEAgLTc3NCw2ICs3OTgsOSBAQAogCiAvKiBQYXJzZWQgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zIHsKKwl1OCAqaWVfc3RhcnQ7CisJc2l6ZV90IHRvdGFsX2xlbjsKKwogCS8qIHBvaW50ZXJzIHRvIElFcyAqLwogCXU4ICpzc2lkOwogCXU4ICpzdXBwX3JhdGVzOwpAQCAtNzg5LDggKzgxNiw4IEBACiAJdTggKmV4dF9zdXBwX3JhdGVzOwogCXU4ICp3bW1faW5mbzsKIAl1OCAqd21tX3BhcmFtOwotCXU4ICpodF9jYXBfZWxlbTsKLQl1OCAqaHRfaW5mb19lbGVtOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBfZWxlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqaHRfaW5mb19lbGVtOwogCXU4ICptZXNoX2NvbmZpZzsKIAl1OCAqbWVzaF9pZDsKIAl1OCAqcGVlcl9saW5rOwpAQCAtODE3LDggKzg0NCw2IEBACiAJdTggZXh0X3N1cHBfcmF0ZXNfbGVuOwogCXU4IHdtbV9pbmZvX2xlbjsKIAl1OCB3bW1fcGFyYW1fbGVuOwotCXU4IGh0X2NhcF9lbGVtX2xlbjsKLQl1OCBodF9pbmZvX2VsZW1fbGVuOwogCXU4IG1lc2hfY29uZmlnX2xlbjsKIAl1OCBtZXNoX2lkX2xlbjsKIAl1OCBwZWVyX2xpbmtfbGVuOwpAQCAtODU3LDg2ICs4ODIsODIgQEAKIH0KIAogCi0vKiBpZWVlODAyMTEuYyAqLwogaW50IGllZWU4MDIxMV9od19jb25maWcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogaW50IGllZWU4MDIxMV9pZl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHUzMiBjaGFuZ2VkKTsKIHZvaWQgaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCk7CiB1MzIgaWVlZTgwMjExX2hhbmRsZV9odChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IGVuYWJsZV9odCwKIAkJCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqcmVxX2h0X2NhcCwKIAkJCXN0cnVjdCBpZWVlODAyMTFfaHRfYnNzX2luZm8gKnJlcV9ic3NfY2FwKTsKLQotLyogaWVlZTgwMjExX2lvY3RsLmMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgaWVlZTgwMjExX2l3X2hhbmRsZXJfZGVmOwotaW50IGllZWU4MDIxMV9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJlcSk7Ci0KLS8qIGllZWU4MDIxMV9zdGEuYyAqLwotdm9pZCBpZWVlODAyMTFfc3RhX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci12b2lkIGllZWU4MDIxMV9zdGFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBpZWVlODAyMTFfc3RhX3NjYW5fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBpZWVlODAyMTFfc3RhX3J4X21nbXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpOwotaW50IGllZWU4MDIxMV9zdGFfc2V0X3NzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqc3NpZCwgc2l6ZV90IGxlbik7Ci1pbnQgaWVlZTgwMjExX3N0YV9nZXRfc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpzc2lkLCBzaXplX3QgKmxlbik7Ci1pbnQgaWVlZTgwMjExX3N0YV9zZXRfYnNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmJzc2lkKTsKLWludCBpZWVlODAyMTFfc3RhX3JlcV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pOwotdm9pZCBpZWVlODAyMTFfc3RhX3JlcV9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKTsKLWludCBpZWVlODAyMTFfc3RhX3NjYW5fcmVzdWx0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKLWllZWU4MDIxMV9yeF9yZXN1bHQgaWVlZTgwMjExX3N0YV9yeF9zY2FuKAotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyk7Ci12b2lkIGllZWU4MDIxMV9yeF9ic3NfbGlzdF9pbml0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKLXZvaWQgaWVlZTgwMjExX3J4X2Jzc19saXN0X2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7Ci1pbnQgaWVlZTgwMjExX3N0YV9zZXRfZXh0cmFfaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqaWUsIHNpemVfdCBsZW4pOwotc3RydWN0IHN0YV9pbmZvICppZWVlODAyMTFfaWJzc19hZGRfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IsIHU4ICpic3NpZCwKLQkJCQkJdTggKmFkZHIsIHU2NCBzdXBwX3JhdGVzKTsKLWludCBpZWVlODAyMTFfc3RhX2RlYXV0aGVudGljYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWFzb24pOwotaW50IGllZWU4MDIxMV9zdGFfZGlzYXNzb2NpYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWFzb24pOwogdm9pZCBpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgICB1MzIgY2hhbmdlZCk7Ci11MzIgaWVlZTgwMjExX3Jlc2V0X2VycF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGllZWU4MDIxMV9odF9jYXBfaWVfdG9faHRfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2llLAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbyk7Ci1pbnQgaWVlZTgwMjExX2h0X2FkZHRfaW5mb19pZV90b19odF9ic3NfaW5mbygKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvICpodF9hZGRfaW5mb19pZSwKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfYnNzX2luZm8gKmJzc19pbmZvKTsKLXZvaWQgaWVlZTgwMjExX3NlbmRfYWRkYmFfcmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqZGEsCi0JCQkJICB1MTYgdGlkLCB1OCBkaWFsb2dfdG9rZW4sIHUxNiBzdGFydF9zZXFfbnVtLAotCQkJCSAgdTE2IGFnZ19zaXplLCB1MTYgdGltZW91dCk7Ci12b2lkIGllZWU4MDIxMV9zZW5kX2RlbGJhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICpkYSwgdTE2IHRpZCwKLQkJCQl1MTYgaW5pdGlhdG9yLCB1MTYgcmVhc29uX2NvZGUpOwotdm9pZCBpZWVlODAyMTFfc2VuZF9iYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnJhLCB1MTYgdGlkLCB1MTYgc3NuKTsKK3ZvaWQgaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogCi12b2lkIGllZWU4MDIxMV9zdGFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkYSwKLQkJCQl1MTYgdGlkLCB1MTYgaW5pdGlhdG9yLCB1MTYgcmVhc29uKTsKLXZvaWQgc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpOwotdm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWRkcik7CisvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCitleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIGllZWU4MDIxMV9pd19oYW5kbGVyX2RlZjsKKworLyogU1RBL0lCU1MgY29kZSAqLwordm9pZCBpZWVlODAyMTFfc3RhX3NldHVwX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3ZvaWQgaWVlZTgwMjExX3NjYW5fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBpZWVlODAyMTFfc3RhX3J4X21nbXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzKTsKK2ludCBpZWVlODAyMTFfc3RhX3NldF9zc2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBjaGFyICpzc2lkLCBzaXplX3QgbGVuKTsKK2ludCBpZWVlODAyMTFfc3RhX2dldF9zc2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBjaGFyICpzc2lkLCBzaXplX3QgKmxlbik7CitpbnQgaWVlZTgwMjExX3N0YV9zZXRfYnNzaWQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHU4ICpic3NpZCk7Cit2b2lkIGllZWU4MDIxMV9zdGFfcmVxX2F1dGgoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKTsKK3N0cnVjdCBzdGFfaW5mbyAqaWVlZTgwMjExX2lic3NfYWRkX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmJzc2lkLAorCQkJCQl1OCAqYWRkciwgdTY0IHN1cHBfcmF0ZXMpOworaW50IGllZWU4MDIxMV9zdGFfZGVhdXRoZW50aWNhdGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHUxNiByZWFzb24pOworaW50IGllZWU4MDIxMV9zdGFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1MTYgcmVhc29uKTsKK3UzMiBpZWVlODAyMTFfcmVzZXRfZXJwX2luZm8oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdTY0IGllZWU4MDIxMV9zdGFfZ2V0X3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKIAkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwotdm9pZCBpZWVlODAyMTFfc3RhX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCWludCBlbmNyeXB0KTsKLXZvaWQgaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCi0JCQkJICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKTsKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1OCAqZHN0LAorCQkJICAgICAgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbik7CiAKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotdm9pZCBpZWVlODAyMTFfc3RhcnRfbWVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21lc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXt9Ci0jZW5kaWYKKy8qIHNjYW4vQlNTIGhhbmRsaW5nICovCitpbnQgaWVlZTgwMjExX3JlcXVlc3Rfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pOworaW50IGllZWU4MDIxMV9zY2FuX3Jlc3VsdHMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKK2llZWU4MDIxMV9yeF9yZXN1bHQKK2llZWU4MDIxMV9zY2FuX3J4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyk7Cit2b2lkIGllZWU4MDIxMV9yeF9ic3NfbGlzdF9pbml0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKK3ZvaWQgaWVlZTgwMjExX3J4X2Jzc19saXN0X2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CitpbnQgaWVlZTgwMjExX3N0YV9zZXRfZXh0cmFfaWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgICAgY2hhciAqaWUsIHNpemVfdCBsZW4pOworCit2b2lkIGllZWU4MDIxMV9tbG1lX25vdGlmeV9zY2FuX2NvbXBsZXRlZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CitpbnQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2Nhbl9zZGF0YSwKKwkJCSB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKTsKK3N0cnVjdCBpZWVlODAyMTFfYnNzICoKK2llZWU4MDIxMV9ic3NfaW5mb191cGRhdGUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCSAgc2l6ZV90IGxlbiwKKwkJCSAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zLAorCQkJICBpbnQgZnJlcSwgYm9vbCBiZWFjb24pOworc3RydWN0IGllZWU4MDIxMV9ic3MgKgoraWVlZTgwMjExX3J4X2Jzc19hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHU4ICpic3NpZCwgaW50IGZyZXEsCisJCSAgICAgdTggKnNzaWQsIHU4IHNzaWRfbGVuKTsKK3N0cnVjdCBpZWVlODAyMTFfYnNzICoKK2llZWU4MDIxMV9yeF9ic3NfZ2V0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCAqYnNzaWQsIGludCBmcmVxLAorCQkgICAgIHU4ICpzc2lkLCB1OCBzc2lkX2xlbik7Cit2b2lkIGllZWU4MDIxMV9yeF9ic3NfcHV0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzKTsKIAogLyogaW50ZXJmYWNlIGhhbmRsaW5nICovCi12b2lkIGllZWU4MDIxMV9pZl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBpZWVlODAyMTFfaWZfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqbmV3X2RldiwgZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgdHlwZSwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKm5ld19kZXYsIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKIAkJICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKTsKIGludCBpZWVlODAyMTFfaWZfY2hhbmdlX3R5cGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkgICAgIGVudW0gaWVlZTgwMjExX2lmX3R5cGVzIHR5cGUpOwotdm9pZCBpZWVlODAyMTFfaWZfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCQkJICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpOwordm9pZCBpZWVlODAyMTFfaWZfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgaWVlZTgwMjExX3JlbW92ZV9pbnRlcmZhY2VzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKIAogLyogdHggaGFuZGxpbmcgKi8KQEAgLTk0NiwxNiArOTY3LDUyIEBACiBpbnQgaWVlZTgwMjExX21vbml0b3Jfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBpZWVlODAyMTFfc3ViaWZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAorLyogSFQgKi8KK2ludCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX2h0X2luZm8oc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9pZSwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pOworaW50IGllZWU4MDIxMV9odF9hZGR0X2luZm9faWVfdG9faHRfYnNzX2luZm8oCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqaHRfYWRkX2luZm9faWUsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2Jzc19pbmZvICpic3NfaW5mbyk7Cit2b2lkIGllZWU4MDIxMV9zZW5kX2JhcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTggKnJhLCB1MTYgdGlkLCB1MTYgc3NuKTsKKwordm9pZCBpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTggKmRhLAorCQkJCXUxNiB0aWQsIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pOwordm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTggKmFkZHIpOwordm9pZCBpZWVlODAyMTFfcHJvY2Vzc19kZWxiYShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbik7Cit2b2lkIGllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCQkgIHNpemVfdCBsZW4pOwordm9pZCBpZWVlODAyMTFfcHJvY2Vzc19hZGRiYV9yZXF1ZXN0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCisJCQkJICAgICBzaXplX3QgbGVuKTsKKworLyogU3BlY3RydW0gbWFuYWdlbWVudCAqLwordm9pZCBpZWVlODAyMTFfcHJvY2Vzc19tZWFzdXJlbWVudF9yZXEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCQkgICAgICAgc2l6ZV90IGxlbik7CisKIC8qIHV0aWxpdHkgZnVuY3Rpb25zL2NvbnN0YW50cyAqLwogZXh0ZXJuIHZvaWQgKm1hYzgwMjExX3dpcGh5X3ByaXZpZDsgLyogZm9yIHdpcGh5IHByaXZpZCAqLwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbNl07CiBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcls2XTsKIHU4ICppZWVlODAyMTFfZ2V0X2Jzc2lkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHNpemVfdCBsZW4sCi0JCQllbnVtIGllZWU4MDIxMV9pZl90eXBlcyB0eXBlKTsKKwkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7CiBpbnQgaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzaXplX3QgbGVuLAogCQkJICAgICBpbnQgcmF0ZSwgaW50IGVycCwgaW50IHNob3J0X3ByZWFtYmxlKTsKLXZvaWQgbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQga2V5aWR4LAordm9pZCBtYWM4MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBpbnQga2V5aWR4LAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcik7Cit2b2lkIGllZWU4MDIxMV9zZXRfd21tX2RlZmF1bHQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwordm9pZCBpZWVlODAyMTFfdHhfc2tiKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBpbnQgZW5jcnlwdCk7Cit2b2lkIGllZWU4MDJfMTFfcGFyc2VfZWxlbXModTggKnN0YXJ0LCBzaXplX3QgbGVuLAorCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcyk7CitpbnQgaWVlZTgwMjExX3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBpbnQgZnJlcSk7Cit1NjQgaWVlZTgwMjExX21hbmRhdG9yeV9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTk9JTkxJTkUKICNkZWZpbmUgZGVidWdfbm9pbmxpbmUgbm9pbmxpbmUKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggNjEwZWQxZC4uODMzNmZlZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTEsNCArMSw2IEBACiAvKgorICogSW50ZXJmYWNlIGhhbmRsaW5nIChleGNlcHQgbWFzdGVyIGludGVyZmFjZSkKKyAqCiAgKiBDb3B5cmlnaHQgMjAwMi0yMDA1LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgogICogQ29weXJpZ2h0IChjKSAyMDA2IEppcmkgQmVuYyA8amJlbmNAc3VzZS5jej4KQEAgLTE3LDcgKzE5LDUzOSBAQAogI2luY2x1ZGUgInN0YV9pbmZvLmgiCiAjaW5jbHVkZSAiZGVidWdmc19uZXRkZXYuaCIKICNpbmNsdWRlICJtZXNoLmgiCisjaW5jbHVkZSAibGVkLmgiCiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaW50IG1lc2hoZHJsZW47CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOworCisJbWVzaGhkcmxlbiA9IChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgPyA1IDogMDsKKworCS8qIEZJWDogd2hhdCB3b3VsZCBiZSBwcm9wZXIgbGltaXRzIGZvciBNVFU/CisJICogVGhpcyBpbnRlcmZhY2UgdXNlcyA4MDIuMyBmcmFtZXMuICovCisJaWYgKG5ld19tdHUgPCAyNTYgfHwKKwkgICAgbmV3X210dSA+IElFRUU4MDIxMV9NQVhfREFUQV9MRU4gLSAyNCAtIDYgLSBtZXNoaGRybGVuKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZXR0aW5nIE1UVSAlZFxuIiwgZGV2LT5uYW1lLCBuZXdfbXR1KTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRyAqLworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWRlbnRpY2FsX21hY19hZGRyX2FsbG93ZWQoaW50IHR5cGUxLCBpbnQgdHlwZTIpCit7CisJcmV0dXJuIHR5cGUxID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgfHwKKwkJdHlwZTIgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiB8fAorCQkodHlwZTEgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYgdHlwZTIgPT0gTkw4MDIxMV9JRlRZUEVfV0RTKSB8fAorCQkodHlwZTEgPT0gTkw4MDIxMV9JRlRZUEVfV0RTICYmCisJCQkodHlwZTIgPT0gTkw4MDIxMV9JRlRZUEVfV0RTIHx8CisJCQkgdHlwZTIgPT0gTkw4MDIxMV9JRlRZUEVfQVApKSB8fAorCQkodHlwZTEgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYgdHlwZTIgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikgfHwKKwkJKHR5cGUxID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKKwkJCSh0eXBlMiA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQkJIHR5cGUyID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pKTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpuc2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgY29uZjsKKwl1MzIgY2hhbmdlZCA9IDA7CisJaW50IHJlczsKKwlib29sIG5lZWRfaHdfcmVjb25maWcgPSAwOworCXU4IG51bGxfYWRkcltFVEhfQUxFTl0gPSB7MH07CisKKwkvKiBmYWlsIGVhcmx5IGlmIHVzZXIgc2V0IGFuIGludmFsaWQgYWRkcmVzcyAqLworCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkciwgbnVsbF9hZGRyKSAmJgorCSAgICAhaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJLyogd2UgaG9sZCB0aGUgUlROTCBoZXJlIHNvIGNhbiBzYWZlbHkgd2FsayB0aGUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkobnNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBuc2RhdGEtPmRldjsKKworCQlpZiAobmRldiAhPSBkZXYgJiYgbmV0aWZfcnVubmluZyhuZGV2KSkgeworCQkJLyoKKwkJCSAqIEFsbG93IG9ubHkgYSBzaW5nbGUgSUJTUyBpbnRlcmZhY2UgdG8gYmUgdXAgYXQgYW55CisJCQkgKiB0aW1lLiBUaGlzIGlzIHJlc3RyaWN0ZWQgYmVjYXVzZSBiZWFjb24gZGlzdHJpYnV0aW9uCisJCQkgKiBjYW5ub3Qgd29yayBwcm9wZXJseSBpZiBib3RoIGFyZSBpbiB0aGUgc2FtZSBJQlNTLgorCQkJICoKKwkJCSAqIFRvIHJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uIHdlJ2QgaGF2ZSB0byBkaXNhbGxvdyB0aGVtCisJCQkgKiBmcm9tIHNldHRpbmcgdGhlIHNhbWUgU1NJRCBvbiBkaWZmZXJlbnQgSUJTUyBpbnRlcmZhY2VzCisJCQkgKiBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgaGFyZHdhcmUuIFRoZW4sIGhvd2V2ZXIsIHdlJ3JlCisJCQkgKiBmYWNlZCB3aXRoIGhhdmluZyB0byBhZG9wdCB0d28gZGlmZmVyZW50IFRTRiB0aW1lcnMuLi4KKwkJCSAqLworCQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgorCQkJICAgIG5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJLyoKKwkJCSAqIFRoZSByZW1haW5pbmcgY2hlY2tzIGFyZSBvbmx5IHBlcmZvcm1lZCBmb3IgaW50ZXJmYWNlcworCQkJICogd2l0aCB0aGUgc2FtZSBNQUMgYWRkcmVzcy4KKwkJCSAqLworCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyLCBuZGV2LT5kZXZfYWRkcikpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBjaGVjayB3aGV0aGVyIGl0IG1heSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MKKwkJCSAqLworCQkJaWYgKCFpZGVudGljYWxfbWFjX2FkZHJfYWxsb3dlZChzZGF0YS0+dmlmLnR5cGUsCisJCQkJCQkJbnNkYXRhLT52aWYudHlwZSkpCisJCQkJcmV0dXJuIC1FTk9UVU5JUTsKKworCQkJLyoKKwkJCSAqIGNhbiBvbmx5IGFkZCBWTEFOcyB0byBlbmFibGVkIEFQcworCQkJICovCisJCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKKwkJCSAgICBuc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCXNkYXRhLT5ic3MgPSAmbnNkYXRhLT51LmFwOworCQl9CisJfQorCisJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNkYXRhLT51Lndkcy5yZW1vdGVfYWRkcikpCisJCQlyZXR1cm4gLUVOT0xJTks7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwkJaWYgKCFzZGF0YS0+YnNzKQorCQkJcmV0dXJuIC1FTk9MSU5LOworCQlsaXN0X2FkZCgmc2RhdGEtPnUudmxhbi5saXN0LCAmc2RhdGEtPmJzcy0+dmxhbnMpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQlzZGF0YS0+YnNzID0gJnNkYXRhLT51LmFwOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CisJCWlmICghaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKKwkJCWJyZWFrOworCQkvKiBtZXNoIGlmYWNlcyBtdXN0IHNldCBhbGxtdWx0aSB0byBmb3J3YXJkIG1jYXN0IHRyYWZmaWMgKi8KKwkJYXRvbWljX2luYygmbG9jYWwtPmlmZl9hbGxtdWx0aXMpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCS8qIG5vIHNwZWNpYWwgdHJlYXRtZW50ICovCisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CisJY2FzZSBfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1Q6CisJCS8qIGNhbm5vdCBoYXBwZW4gKi8KKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGxvY2FsLT5vcGVuX2NvdW50ID09IDApIHsKKwkJcmVzID0gMDsKKwkJaWYgKGxvY2FsLT5vcHMtPnN0YXJ0KQorCQkJcmVzID0gbG9jYWwtPm9wcy0+c3RhcnQobG9jYWxfdG9faHcobG9jYWwpKTsKKwkJaWYgKHJlcykKKwkJCWdvdG8gZXJyX2RlbF9ic3M7CisJCW5lZWRfaHdfcmVjb25maWcgPSAxOworCQlpZWVlODAyMTFfbGVkX3JhZGlvKGxvY2FsLCBsb2NhbC0+aHcuY29uZi5yYWRpb19lbmFibGVkKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFsbCBpbnRlcmZhY2VzIGFuZCBjb3B5IHRoZSBob3BlZnVsbHkgbm93LXByZXNlbnQKKwkgKiBNQUMgYWRkcmVzcyB0byB0aG9zZSB0aGF0IGhhdmUgdGhlIHNwZWNpYWwgbnVsbCBvbmUuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IG5zZGF0YS0+ZGV2OworCisJCS8qCisJCSAqIE5vIG5lZWQgdG8gY2hlY2sgbmV0aWZfcnVubmluZyBzaW5jZSB3ZSBkbyBub3QgYWxsb3cKKwkJICogaXQgdG8gc3RhcnQgdXAgd2l0aCB0aGlzIGludmFsaWQgYWRkcmVzcy4KKwkJICovCisJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobnVsbF9hZGRyLCBuZGV2LT5kZXZfYWRkcikgPT0gMCkKKwkJCW1lbWNweShuZGV2LT5kZXZfYWRkciwKKwkJCSAgICAgICBsb2NhbC0+aHcud2lwaHktPnBlcm1fYWRkciwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJfQorCisJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihudWxsX2FkZHIsIGxvY2FsLT5tZGV2LT5kZXZfYWRkcikgPT0gMCkKKwkJbWVtY3B5KGxvY2FsLT5tZGV2LT5kZXZfYWRkciwgbG9jYWwtPmh3LndpcGh5LT5wZXJtX2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhpcyBkZXZpY2UuCisJICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCWlmICghbG9jYWwtPm9wZW5fY291bnQgJiYgbG9jYWwtPm9wcy0+c3RvcCkKKwkJCWxvY2FsLT5vcHMtPnN0b3AobG9jYWxfdG9faHcobG9jYWwpKTsKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCX0KKworCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgorCQkvKiBubyBuZWVkIHRvIHRlbGwgZHJpdmVyICovCisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKKwkJCWxvY2FsLT5jb29rZWRfbW50cnMrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogbXVzdCBiZSBiZWZvcmUgdGhlIGNhbGwgdG8gaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIgKi8KKwkJbG9jYWwtPm1vbml0b3JzKys7CisJCWlmIChsb2NhbC0+bW9uaXRvcnMgPT0gMSkKKwkJCWxvY2FsLT5ody5jb25mLmZsYWdzIHw9IElFRUU4MDIxMV9DT05GX1JBRElPVEFQOworCisJCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0ZDU0ZBSUwpCisJCQlsb2NhbC0+ZmlmX2Zjc2ZhaWwrKzsKKwkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfUExDUEZBSUwpCisJCQlsb2NhbC0+ZmlmX3BsY3BmYWlsKys7CisJCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPTlRST0wpCisJCQlsb2NhbC0+ZmlmX2NvbnRyb2wrKzsKKwkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfT1RIRVJfQlNTKQorCQkJbG9jYWwtPmZpZl9vdGhlcl9ic3MrKzsKKworCQluZXRpZl9hZGRyX2xvY2tfYmgobG9jYWwtPm1kZXYpOworCQlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7CisJCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGxvY2FsLT5tZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9QUkVWX0JTU0lEX1NFVDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJY29uZi52aWYgPSAmc2RhdGEtPnZpZjsKKwkJY29uZi50eXBlID0gc2RhdGEtPnZpZi50eXBlOworCQljb25mLm1hY19hZGRyID0gZGV2LT5kZXZfYWRkcjsKKwkJcmVzID0gbG9jYWwtPm9wcy0+YWRkX2ludGVyZmFjZShsb2NhbF90b19odyhsb2NhbCksICZjb25mKTsKKwkJaWYgKHJlcykKKwkJCWdvdG8gZXJyX3N0b3A7CisKKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpCisJCQlpZWVlODAyMTFfc3RhcnRfbWVzaChzZGF0YSk7CisJCWNoYW5nZWQgfD0gaWVlZTgwMjExX3Jlc2V0X2VycF9pbmZvKHNkYXRhKTsKKwkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOworCQlpZWVlODAyMTFfZW5hYmxlX2tleXMoc2RhdGEpOworCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfVVNFUlNQQUNFX01MTUUpKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCX0KKworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfV0RTKSB7CisJCS8qIENyZWF0ZSBTVEEgZW50cnkgZm9yIHRoZSBXRFMgcGVlciAqLworCQlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghc3RhKSB7CisJCQlyZXMgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKKwkJfQorCisJCS8qIG5vIGxvY2tpbmcgcmVxdWlyZWQgc2luY2UgU1RBIGlzIG5vdCBsaXZlIHlldCAqLworCQlzdGEtPmZsYWdzIHw9IFdMQU5fU1RBX0FVVEhPUklaRUQ7CisKKwkJcmVzID0gc3RhX2luZm9faW5zZXJ0KHN0YSk7CisJCWlmIChyZXMpIHsKKwkJCS8qIFNUQSBoYXMgYmVlbiBmcmVlZCAqLworCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKKwkJfQorCX0KKworCWlmIChsb2NhbC0+b3Blbl9jb3VudCA9PSAwKSB7CisJCXJlcyA9IGRldl9vcGVuKGxvY2FsLT5tZGV2KTsKKwkJV0FSTl9PTihyZXMpOworCQlpZiAocmVzKQorCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKKwkJdGFza2xldF9lbmFibGUoJmxvY2FsLT50eF9wZW5kaW5nX3Rhc2tsZXQpOworCQl0YXNrbGV0X2VuYWJsZSgmbG9jYWwtPnRhc2tsZXQpOworCX0KKworCS8qCisJICogc2V0X211bHRpY2FzdF9saXN0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgbmV0d29ya2luZyBjb3JlCisJICogd2hpY2ggd2lsbCBjaGVjayB3aGV0aGVyIGFueSBpbmNyZW1lbnRzIGhlcmUgd2VyZSBkb25lIGluCisJICogZXJyb3IgYW5kIHN5bmMgdGhlbSBkb3duIHRvIHRoZSBoYXJkd2FyZSBhcyBmaWx0ZXIgZmxhZ3MuCisJICovCisJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9BTExNVUxUSSkKKwkJYXRvbWljX2luYygmbG9jYWwtPmlmZl9hbGxtdWx0aXMpOworCisJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9QUk9NSVNDKQorCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX3Byb21pc2NzKTsKKworCWxvY2FsLT5vcGVuX2NvdW50Kys7CisJaWYgKG5lZWRfaHdfcmVjb25maWcpIHsKKwkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCk7CisJCS8qCisJCSAqIHNldCBkZWZhdWx0IHF1ZXVlIHBhcmFtZXRlcnMgc28gZHJpdmVycyBkb24ndAorCQkgKiBuZWVkIHRvIGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGlmIHRoZSBoYXJkd2FyZQorCQkgKiBkb2Vzbid0IHN0YXJ0IHVwIHdpdGggc2FuZSBkZWZhdWx0cworCQkgKi8KKwkJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7CisJfQorCisJLyoKKwkgKiBpZWVlODAyMTFfc3RhX3dvcmsgaXMgZGlzYWJsZWQgd2hpbGUgbmV0d29yayBpbnRlcmZhY2UKKwkgKiBpcyBkb3duLiBUaGVyZWZvcmUsIHNvbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1heSBub3QKKwkgKiB5ZXQgYmUgZWZmZWN0aXZlLiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiBpZWVlODAyMTFfc3RhX3dvcmsKKwkgKiB0byBmaXggdGhpcy4KKwkgKi8KKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7CisJCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmc3RhLT53b3JrKTsKKwl9CisKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGRldik7CisKKwlyZXR1cm4gMDsKKyBlcnJfZGVsX2ludGVyZmFjZToKKwlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKGxvY2FsX3RvX2h3KGxvY2FsKSwgJmNvbmYpOworIGVycl9zdG9wOgorCWlmICghbG9jYWwtPm9wZW5fY291bnQgJiYgbG9jYWwtPm9wcy0+c3RvcCkKKwkJbG9jYWwtPm9wcy0+c3RvcChsb2NhbF90b19odyhsb2NhbCkpOworIGVycl9kZWxfYnNzOgorCXNkYXRhLT5ic3MgPSBOVUxMOworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkJbGlzdF9kZWwoJnNkYXRhLT51LnZsYW4ubGlzdCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiBjb25mOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCisJLyoKKwkgKiBTdG9wIFRYIG9uIHRoaXMgaW50ZXJmYWNlIGZpcnN0LgorCSAqLworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhkZXYpOworCisJLyoKKwkgKiBOb3cgZGVsZXRlIGFsbCBhY3RpdmUgYWdncmVnYXRpb24gc2Vzc2lvbnMuCisJICovCisJcmN1X3JlYWRfbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc3RhLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KSB7CisJCWlmIChzdGEtPnNkYXRhID09IHNkYXRhKQorCQkJaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc2RhdGEsCisJCQkJCQkJICAgIHN0YS0+c3RhLmFkZHIpOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJLyoKKwkgKiBSZW1vdmUgYWxsIHN0YXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVyZmFjZS4KKwkgKgorCSAqIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIG9wcy0+cmVtb3ZlX2ludGVyZmFjZSgpCisJICogYmVjYXVzZSBvdGhlcndpc2Ugd2UgY2FuIGxhdGVyIGludm9rZSBvcHMtPnN0YV9ub3RpZnkoKQorCSAqIHdoZW5ldmVyIHRoZSBTVEFzIGFyZSByZW1vdmVkLCBhbmQgdGhhdCBpbnZhbGlkYXRlcyBkcml2ZXIKKwkgKiBhc3N1bXB0aW9ucyBhYm91dCBhbHdheXMgZ2V0dGluZyBhIHZpZiBwb2ludGVyIHRoYXQgaXMgdmFsaWQKKwkgKiAoYmVjYXVzZSBpZiB3ZSByZW1vdmUgYSBTVEEgYWZ0ZXIgb3BzLT5yZW1vdmVfaW50ZXJmYWNlKCkKKwkgKiB0aGUgZHJpdmVyIHdpbGwgaGF2ZSByZW1vdmVkIHRoZSB2aWYgaW5mbyBhbHJlYWR5ISkKKwkgKgorCSAqIFdlIGNvdWxkIHJlbGF4IHRoaXMgYW5kIG9ubHkgdW5saW5rIHRoZSBzdGF0aW9ucyBmcm9tIHRoZQorCSAqIGhhc2ggdGFibGUgYW5kIGxpc3QgYnV0IGtlZXAgdGhlbSBvbiBhIHBlci1zZGF0YSBsaXN0IHRoYXQKKwkgKiB3aWxsIGJlIGluc2VydGVkIGJhY2sgYWdhaW4gd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJyb3VnaHQKKwkgKiB1cCBhZ2FpbiwgYnV0IEkgZG9uJ3QgY3VycmVudGx5IHNlZSBhIHVzZSBjYXNlIGZvciB0aGF0LAorCSAqIGV4Y2VwdCB3aXRoIFdEUyB3aGljaCBnZXRzIGEgU1RBIGVudHJ5IGNyZWF0ZWQgd2hlbiBpdCBpcworCSAqIGJyb3VnaHQgdXAuCisJICovCisJc3RhX2luZm9fZmx1c2gobG9jYWwsIHNkYXRhKTsKKworCS8qCisJICogRG9uJ3QgY291bnQgdGhpcyBpbnRlcmZhY2UgZm9yIHByb21pc2MvYWxsbXVsdGkgd2hpbGUgaXQKKwkgKiBpcyBkb3duLiBkZXZfbWNfdW5zeW5jKCkgd2lsbCBpbnZva2Ugc2V0X211bHRpY2FzdF9saXN0CisJICogb24gdGhlIG1hc3RlciBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBzeW5jIHRoZXNlIGRvd24gdG8gdGhlCisJICogaGFyZHdhcmUgYXMgZmlsdGVyIGZsYWdzLgorCSAqLworCWlmIChzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEkpCisJCWF0b21pY19kZWMoJmxvY2FsLT5pZmZfYWxsbXVsdGlzKTsKKworCWlmIChzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQykKKwkJYXRvbWljX2RlYygmbG9jYWwtPmlmZl9wcm9taXNjcyk7CisKKwlkZXZfbWNfdW5zeW5jKGxvY2FsLT5tZGV2LCBkZXYpOworCisJLyogQVBzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgKi8KKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnZsYW4sICp0bXA7CisJCXN0cnVjdCBiZWFjb25fZGF0YSAqb2xkX2JlYWNvbiA9IHNkYXRhLT51LmFwLmJlYWNvbjsKKworCQkvKiByZW1vdmUgYmVhY29uICovCisJCXJjdV9hc3NpZ25fcG9pbnRlcihzZGF0YS0+dS5hcC5iZWFjb24sIE5VTEwpOworCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJa2ZyZWUob2xkX2JlYWNvbik7CisKKwkJLyogZG93biBhbGwgZGVwZW5kZW50IGRldmljZXMsIHRoYXQgaXMgVkxBTnMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW4sIHRtcCwgJnNkYXRhLT51LmFwLnZsYW5zLAorCQkJCQkgdS52bGFuLmxpc3QpCisJCQlkZXZfY2xvc2Uodmxhbi0+ZGV2KTsKKwkJV0FSTl9PTighbGlzdF9lbXB0eSgmc2RhdGEtPnUuYXAudmxhbnMpKTsKKwl9CisKKwlsb2NhbC0+b3Blbl9jb3VudC0tOworCisJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CisJCWxpc3RfZGVsKCZzZGF0YS0+dS52bGFuLmxpc3QpOworCQkvKiBubyBuZWVkIHRvIHRlbGwgZHJpdmVyICovCisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKKwkJCWxvY2FsLT5jb29rZWRfbW50cnMtLTsKKwkJCWJyZWFrOworCQl9CisKKwkJbG9jYWwtPm1vbml0b3JzLS07CisJCWlmIChsb2NhbC0+bW9uaXRvcnMgPT0gMCkKKwkJCWxvY2FsLT5ody5jb25mLmZsYWdzICY9IH5JRUVFODAyMTFfQ09ORl9SQURJT1RBUDsKKworCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19GQ1NGQUlMKQorCQkJbG9jYWwtPmZpZl9mY3NmYWlsLS07CisJCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX1BMQ1BGQUlMKQorCQkJbG9jYWwtPmZpZl9wbGNwZmFpbC0tOworCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT05UUk9MKQorCQkJbG9jYWwtPmZpZl9jb250cm9sLS07CisJCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX09USEVSX0JTUykKKwkJCWxvY2FsLT5maWZfb3RoZXJfYnNzLS07CisKKwkJbmV0aWZfYWRkcl9sb2NrX2JoKGxvY2FsLT5tZGV2KTsKKwkJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOworCQluZXRpZl9hZGRyX3VubG9ja19iaChsb2NhbC0+bWRldik7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQlzZGF0YS0+dS5zdGEuc3RhdGUgPSBJRUVFODAyMTFfU1RBX01MTUVfRElTQUJMRUQ7CisJCW1lbXNldChzZGF0YS0+dS5zdGEuYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnNkYXRhLT51LnN0YS50aW1lcik7CisJCS8qCisJCSAqIElmIHRoZSB0aW1lciBmaXJlZCB3aGlsZSB3ZSB3YWl0ZWQgZm9yIGl0LCBpdCB3aWxsIGhhdmUKKwkJICogcmVxdWV1ZWQgdGhlIHdvcmsuIE5vdyB0aGUgd29yayB3aWxsIGJlIHJ1bm5pbmcgYWdhaW4KKwkJICogYnV0IHdpbGwgbm90IHJlYXJtIHRoZSB0aW1lciBhZ2FpbiBiZWNhdXNlIGl0IGNoZWNrcworCQkgKiB3aGV0aGVyIHRoZSBpbnRlcmZhY2UgaXMgcnVubmluZywgd2hpY2gsIGF0IHRoaXMgcG9pbnQsCisJCSAqIGl0IG5vIGxvbmdlciBpcy4KKwkJICovCisJCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT51LnN0YS53b3JrKTsKKwkJLyoKKwkJICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgZG93bi4KKwkJICogQ2FsbCBzeW5jaHJvbml6ZV9yY3UoKSB0byB3YWl0IGZvciB0aGUgUlggcGF0aAorCQkgKiBzaG91bGQgaXQgYmUgdXNpbmcgdGhlIGludGVyZmFjZSBhbmQgZW5xdWV1aW5nCisJCSAqIGZyYW1lcyBhdCB0aGlzIHZlcnkgdGltZSBvbiBhbm90aGVyIENQVS4KKwkJICovCisJCXN5bmNocm9uaXplX3JjdSgpOworCQlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT51LnN0YS5za2JfcXVldWUpOworCisJCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9QUklWQUNZX0lOVk9LRUQ7CisJCWtmcmVlKHNkYXRhLT51LnN0YS5leHRyYV9pZSk7CisJCXNkYXRhLT51LnN0YS5leHRyYV9pZSA9IE5VTEw7CisJCXNkYXRhLT51LnN0YS5leHRyYV9pZV9sZW4gPSAwOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CisJCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSB7CisJCQkvKiBhbGxtdWx0aSBpcyBhbHdheXMgc2V0IG9uIG1lc2ggaWZhY2VzICovCisJCQlhdG9taWNfZGVjKCZsb2NhbC0+aWZmX2FsbG11bHRpcyk7CisJCQlpZWVlODAyMTFfc3RvcF9tZXNoKHNkYXRhKTsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlpZiAobG9jYWwtPnNjYW5fc2RhdGEgPT0gc2RhdGEpIHsKKwkJCWlmICghbG9jYWwtPm9wcy0+aHdfc2NhbikKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmxvY2FsLT5zY2FuX3dvcmspOworCQkJLyoKKwkJCSAqIFRoZSBzb2Z0d2FyZSBzY2FuIGNhbiBubyBsb25nZXIgcnVuIG5vdywgc28gd2UgY2FuCisJCQkgKiBjbGVhciBvdXQgdGhlIHNjYW5fc2RhdGEgcmVmZXJlbmNlLiBIb3dldmVyLCB0aGUKKwkJCSAqIGhhcmR3YXJlIHNjYW4gbWF5IHN0aWxsIGJlIHJ1bm5pbmcuIFRoZSBjb21wbGV0ZQorCQkJICogZnVuY3Rpb24gbXVzdCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYSBOVUxMIHZhbHVlLgorCQkJICovCisJCQlsb2NhbC0+c2Nhbl9zZGF0YSA9IE5VTEw7CisJCQkvKgorCQkJICogVGhlIG1lbW9yeSBiYXJyaWVyIGd1YXJhbnRlZXMgdGhhdCBhbm90aGVyIENQVQorCQkJICogdGhhdCBpcyBoYXJkd2FyZS1zY2FubmluZyB3aWxsIG5vdyBzZWUgdGhlIGZhY3QKKwkJCSAqIHRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgZ29uZS4KKwkJCSAqLworCQkJc21wX21iKCk7CisJCQkvKgorCQkJICogSWYgc29mdHdhcmUgc2Nhbm5pbmcsIGNvbXBsZXRlIHRoZSBzY2FuIGJ1dCBzaW5jZQorCQkJICogdGhlIHNjYW5fc2RhdGEgaXMgTlVMTCBhbHJlYWR5IGRvbid0IHNlbmQgb3V0IGEKKwkJCSAqIHNjYW4gZXZlbnQgdG8gdXNlcnNwYWNlIC0tIHRoZSBzY2FuIGlzIGluY29tcGxldGUuCisJCQkgKi8KKwkJCWlmIChsb2NhbC0+c3dfc2Nhbm5pbmcpCisJCQkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKCZsb2NhbC0+aHcpOworCQl9CisKKwkJY29uZi52aWYgPSAmc2RhdGEtPnZpZjsKKwkJY29uZi50eXBlID0gc2RhdGEtPnZpZi50eXBlOworCQljb25mLm1hY19hZGRyID0gZGV2LT5kZXZfYWRkcjsKKwkJLyogZGlzYWJsZSBhbGwga2V5cyBmb3IgYXMgbG9uZyBhcyB0aGlzIG5ldGRldiBpcyBkb3duICovCisJCWllZWU4MDIxMV9kaXNhYmxlX2tleXMoc2RhdGEpOworCQlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKGxvY2FsX3RvX2h3KGxvY2FsKSwgJmNvbmYpOworCX0KKworCXNkYXRhLT5ic3MgPSBOVUxMOworCisJaWYgKGxvY2FsLT5vcGVuX2NvdW50ID09IDApIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobG9jYWwtPm1kZXYpKQorCQkJZGV2X2Nsb3NlKGxvY2FsLT5tZGV2KTsKKworCQlpZiAobG9jYWwtPm9wcy0+c3RvcCkKKwkJCWxvY2FsLT5vcHMtPnN0b3AobG9jYWxfdG9faHcobG9jYWwpKTsKKworCQlpZWVlODAyMTFfbGVkX3JhZGlvKGxvY2FsLCAwKTsKKworCQlmbHVzaF93b3JrcXVldWUobG9jYWwtPmh3LndvcmtxdWV1ZSk7CisKKwkJdGFza2xldF9kaXNhYmxlKCZsb2NhbC0+dHhfcGVuZGluZ190YXNrbGV0KTsKKwkJdGFza2xldF9kaXNhYmxlKCZsb2NhbC0+dGFza2xldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJaW50IGFsbG11bHRpLCBwcm9taXNjLCBzZGF0YV9hbGxtdWx0aSwgc2RhdGFfcHJvbWlzYzsKKworCWFsbG11bHRpID0gISEoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSk7CisJcHJvbWlzYyA9ICEhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk7CisJc2RhdGFfYWxsbXVsdGkgPSAhIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEkpOworCXNkYXRhX3Byb21pc2MgPSAhIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQyk7CisKKwlpZiAoYWxsbXVsdGkgIT0gc2RhdGFfYWxsbXVsdGkpIHsKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX2FsbG11bHRpcyk7CisJCWVsc2UKKwkJCWF0b21pY19kZWMoJmxvY2FsLT5pZmZfYWxsbXVsdGlzKTsKKwkJc2RhdGEtPmZsYWdzIF49IElFRUU4MDIxMV9TREFUQV9BTExNVUxUSTsKKwl9CisKKwlpZiAocHJvbWlzYyAhPSBzZGF0YV9wcm9taXNjKSB7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX3Byb21pc2NzKTsKKwkJZWxzZQorCQkJYXRvbWljX2RlYygmbG9jYWwtPmlmZl9wcm9taXNjcyk7CisJCXNkYXRhLT5mbGFncyBePSBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQzsKKwl9CisKKwlkZXZfbWNfc3luYyhsb2NhbC0+bWRldiwgZGV2KTsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXRoZXJfc2V0dXAoZGV2KTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV9zdWJpZl9zdGFydF94bWl0OworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmaWVlZTgwMjExX2l3X2hhbmRsZXJfZGVmOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaWVlZTgwMjExX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBpZWVlODAyMTFfY2hhbmdlX210dTsKKwlkZXYtPm9wZW4gPSBpZWVlODAyMTFfb3BlbjsKKwlkZXYtPnN0b3AgPSBpZWVlODAyMTFfc3RvcDsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKwkvKiB3ZSB3aWxsIHZhbGlkYXRlIHRoZSBhZGRyZXNzIG91cnNlbHZlcyBpbiAtPm9wZW4gKi8KKwlkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworfQogLyoKICAqIENhbGxlZCB3aGVuIHRoZSBuZXRkZXYgaXMgcmVtb3ZlZCBvciwgYnkgdGhlIGNvZGUgYmVsb3csIGJlZm9yZQogICogdGhlIGludGVyZmFjZSB0eXBlIGNoYW5nZXMuCkBAIC0zMSwxNyArNTY1LDE3IEBACiAJaW50IGZsdXNoZWQ7CiAJaW50IGk7CiAKLQlpZWVlODAyMTFfZGVidWdmc19yZW1vdmVfbmV0ZGV2KHNkYXRhKTsKLQogCS8qIGZyZWUgZXh0cmEgZGF0YSAqLwogCWllZWU4MDIxMV9mcmVlX2tleXMoc2RhdGEpOwogCisJaWVlZTgwMjExX2RlYnVnZnNfcmVtb3ZlX25ldGRldihzZGF0YSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0ZSQUdNRU5UX01BWDsgaSsrKQogCQlfX3NrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPmZyYWdtZW50c1tpXS5za2JfbGlzdCk7CiAJc2RhdGEtPmZyYWdtZW50X25leHQgPSAwOwogCiAJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCWJlYWNvbiA9IHNkYXRhLT51LmFwLmJlYWNvbjsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT51LmFwLmJlYWNvbiwgTlVMTCk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtNTMsMjMgKzU4NywyMyBAQAogCQl9CiAKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOgotCQkvKiBBbGxvdyBjb21waWxlciB0byBlbGlkZSBtZXNoX3JtY19mcmVlIGNhbGwuICovCisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKLQkJCW1lc2hfcm1jX2ZyZWUoZGV2KTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCQkJbWVzaF9ybWNfZnJlZShzZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlrZnJlZShzZGF0YS0+dS5zdGEuZXh0cmFfaWUpOwogCQlrZnJlZShzZGF0YS0+dS5zdGEuYXNzb2NyZXFfaWVzKTsKIAkJa2ZyZWUoc2RhdGEtPnUuc3RhLmFzc29jcmVzcF9pZXMpOwogCQlrZnJlZV9za2Ioc2RhdGEtPnUuc3RhLnByb2JlX3Jlc3ApOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1dEUzoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1ZMQU46Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgorCWNhc2UgX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUOgogCQlCVUcoKTsKIAkJYnJlYWs7CiAJfQpAQCAtODIsNTUgKzYxNiw0MyBAQAogICogSGVscGVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpc2UgYW4gaW50ZXJmYWNlIHRvIGEgc3BlY2lmaWMgdHlwZS4KICAqLwogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NldHVwX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCSAgZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgdHlwZSkKKwkJCQkgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGE7Ci0KIAkvKiBjbGVhciB0eXBlLWRlcGVuZGVudCB1bmlvbiAqLwogCW1lbXNldCgmc2RhdGEtPnUsIDAsIHNpemVvZihzZGF0YS0+dSkpOwogCiAJLyogYW5kIHNldCBzb21lIHR5cGUtZGVwZW5kZW50IHZhbHVlcyAqLwogCXNkYXRhLT52aWYudHlwZSA9IHR5cGU7CisJc2RhdGEtPmRldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3N1YmlmX3N0YXJ0X3htaXQ7CisJc2RhdGEtPndkZXYuaWZ0eXBlID0gdHlwZTsKIAogCS8qIG9ubHkgbW9uaXRvciBkaWZmZXJzICovCiAJc2RhdGEtPmRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKIAogCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2RhdGEtPnUuYXAucHNfYmNfYnVmKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnNkYXRhLT51LmFwLnZsYW5zKTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOgotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKLQkJaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCQlJTklUX1dPUksoJmlmc3RhLT53b3JrLCBpZWVlODAyMTFfc3RhX3dvcmspOwotCQlzZXR1cF90aW1lcigmaWZzdGEtPnRpbWVyLCBpZWVlODAyMTFfc3RhX3RpbWVyLAotCQkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmlmc3RhLT5za2JfcXVldWUpOwotCi0JCWlmc3RhLT5jYXBhYiA9IFdMQU5fQ0FQQUJJTElUWV9FU1M7Ci0JCWlmc3RhLT5hdXRoX2FsZ3MgPSBJRUVFODAyMTFfQVVUSF9BTEdfT1BFTiB8Ci0JCQlJRUVFODAyMTFfQVVUSF9BTEdfU0hBUkVEX0tFWTsKLQkJaWZzdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfQ1JFQVRFX0lCU1MgfAotCQkJSUVFRTgwMjExX1NUQV9BVVRPX0JTU0lEX1NFTCB8Ci0JCQlJRUVFODAyMTFfU1RBX0FVVE9fQ0hBTk5FTF9TRUw7Ci0JCWlmIChpZWVlODAyMTFfbnVtX3JlZ3VsYXJfcXVldWVzKCZzZGF0YS0+bG9jYWwtPmh3KSA+PSA0KQotCQkJaWZzdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfV01NX0VOQUJMRUQ7Ci0KKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaWVlZTgwMjExX3N0YV9zZXR1cF9zZGF0YShzZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpCiAJCQlpZWVlODAyMTFfbWVzaF9pbml0X3NkYXRhKHNkYXRhKTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJc2RhdGEtPmRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVA7CiAJCXNkYXRhLT5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV9tb25pdG9yX3N0YXJ0X3htaXQ7CiAJCXNkYXRhLT51Lm1udHJfZmxhZ3MgPSBNT05JVE9SX0ZMQUdfQ09OVFJPTCB8CiAJCQkJICAgICAgTU9OSVRPUl9GTEFHX09USEVSX0JTUzsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9XRFM6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CisJY2FzZSBfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1Q6CiAJCUJVRygpOwogCQlicmVhazsKIAl9CkBAIC0xMzksNyArNjYxLDcgQEAKIH0KIAogaW50IGllZWU4MDIxMV9pZl9jaGFuZ2VfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCSAgICAgZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgdHlwZSkKKwkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKQogewogCUFTU0VSVF9SVE5MKCk7CiAKQEAgLTE2MCwxNCArNjgyLDE2IEBACiAJaWVlZTgwMjExX3NldHVwX3NkYXRhKHNkYXRhLCB0eXBlKTsKIAogCS8qIHJlc2V0IHNvbWUgdmFsdWVzIHRoYXQgc2hvdWxkbid0IGJlIGtlcHQgYWNyb3NzIHR5cGUgY2hhbmdlcyAqLwotCXNkYXRhLT5iYXNpY19yYXRlcyA9IDA7CisJc2RhdGEtPmJzc19jb25mLmJhc2ljX3JhdGVzID0KKwkJaWVlZTgwMjExX21hbmRhdG9yeV9yYXRlcyhzZGF0YS0+bG9jYWwsCisJCQlzZGF0YS0+bG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZCk7CiAJc2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBpZWVlODAyMTFfaWZfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqbmV3X2RldiwgZW51bSBpZWVlODAyMTFfaWZfdHlwZXMgdHlwZSwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKm5ld19kZXYsIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKIAkJICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwpAQCAtMjI1LDkgKzc0OSw5IEBACiAKIAlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSAmJgogCSAgICBwYXJhbXMgJiYgcGFyYW1zLT5tZXNoX2lkX2xlbikKLQkJaWVlZTgwMjExX2lmX3N0YV9zZXRfbWVzaF9pZCgmc2RhdGEtPnUuc3RhLAotCQkJCQkgICAgIHBhcmFtcy0+bWVzaF9pZF9sZW4sCi0JCQkJCSAgICAgcGFyYW1zLT5tZXNoX2lkKTsKKwkJaWVlZTgwMjExX3NkYXRhX3NldF9tZXNoX2lkKHNkYXRhLAorCQkJCQkgICAgcGFyYW1zLT5tZXNoX2lkX2xlbiwKKwkJCQkJICAgIHBhcmFtcy0+bWVzaF9pZCk7CiAKIAlsaXN0X2FkZF90YWlsX3JjdSgmc2RhdGEtPmxpc3QsICZsb2NhbC0+aW50ZXJmYWNlcyk7CiAKQEAgLTI0MSwxNSArNzY1LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpZWVlODAyMTFfaWZfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGllZWU4MDIxMV9pZl9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCiAJQVNTRVJUX1JUTkwoKTsKIAogCWxpc3RfZGVsX3JjdSgmc2RhdGEtPmxpc3QpOwogCXN5bmNocm9uaXplX3JjdSgpOwotCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc2RhdGEtPmRldik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEva2V5LmMgYi9uZXQvbWFjODAyMTEva2V5LmMKaW5kZXggNjU5N2M3Ny4uYTViMDZmZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuYwpAQCAtMTE4LDEyICsxMTgsMTIgQEAKIAkgKiBhZGRyZXNzIHRvIGluZGljYXRlIGEgdHJhbnNtaXQtb25seSBrZXkuCiAJICovCiAJaWYgKGtleS0+Y29uZi5hbGcgIT0gQUxHX1dFUCAmJgotCSAgICAoa2V5LT5zZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgfHwKLQkgICAgIGtleS0+c2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4pKQorCSAgICAoa2V5LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkgICAgIGtleS0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pKQogCQlhZGRyID0gemVyb19hZGRyOwogCiAJaWYgKGtleS0+c3RhKQotCQlhZGRyID0ga2V5LT5zdGEtPmFkZHI7CisJCWFkZHIgPSBrZXktPnN0YS0+c3RhLmFkZHI7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTI4MSw2ICsyODEsMjAgQEAKIAlrZXktPmNvbmYuYWxnID0gYWxnOwogCWtleS0+Y29uZi5rZXlpZHggPSBpZHg7CiAJa2V5LT5jb25mLmtleWxlbiA9IGtleV9sZW47CisJc3dpdGNoIChhbGcpIHsKKwljYXNlIEFMR19XRVA6CisJCWtleS0+Y29uZi5pdl9sZW4gPSBXRVBfSVZfTEVOOworCQlrZXktPmNvbmYuaWN2X2xlbiA9IFdFUF9JQ1ZfTEVOOworCQlicmVhazsKKwljYXNlIEFMR19US0lQOgorCQlrZXktPmNvbmYuaXZfbGVuID0gVEtJUF9JVl9MRU47CisJCWtleS0+Y29uZi5pY3ZfbGVuID0gVEtJUF9JQ1ZfTEVOOworCQlicmVhazsKKwljYXNlIEFMR19DQ01QOgorCQlrZXktPmNvbmYuaXZfbGVuID0gQ0NNUF9IRFJfTEVOOworCQlrZXktPmNvbmYuaWN2X2xlbiA9IENDTVBfTUlDX0xFTjsKKwkJYnJlYWs7CisJfQogCW1lbWNweShrZXktPmNvbmYua2V5LCBrZXlfZGF0YSwga2V5X2xlbik7CiAJSU5JVF9MSVNUX0hFQUQoJmtleS0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmtleS0+dG9kbyk7CkBAIC0zMzEsNyArMzQ1LDcgQEAKIAkJICovCiAJCWtleS0+Y29uZi5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0U7CiAJfSBlbHNlIHsKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpIHsKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCQlzdHJ1Y3Qgc3RhX2luZm8gKmFwOwogCiAJCQkvKgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21haW4uYyBiL25ldC9tYWM4MDIxMS9tYWluLmMKaW5kZXggYWE1YTE5MS4uYWU2MmFkNDAgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKKysrIGIvbmV0L21hYzgwMjExL21haW4uYwpAQCAtNDUsMTYgKzQ1LDkgQEAKIAl1OCBkYXRhX3JldHJpZXM7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotLyogY29tbW9uIGludGVyZmFjZSByb3V0aW5lcyAqLwotCi1zdGF0aWMgaW50IGhlYWRlcl9wYXJzZV84MDIxMShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpoYWRkcikKLXsKLQltZW1jcHkoaGFkZHIsIHNrYl9tYWNfaGVhZGVyKHNrYikgKyAxMCwgRVRIX0FMRU4pOyAvKiBhZGRyMiAqLwotCXJldHVybiBFVEhfQUxFTjsKLX0KIAogLyogbXVzdCBiZSBjYWxsZWQgdW5kZXIgbWRldiB0eCBsb2NrICovCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKK3ZvaWQgaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3M7CiAJdW5zaWduZWQgaW50IG5ld19mbGFncyA9IDA7CkBAIC05Nyw5ICs5MCwyNCBAQAogCiAvKiBtYXN0ZXIgaW50ZXJmYWNlICovCiAKK3N0YXRpYyBpbnQgaGVhZGVyX3BhcnNlXzgwMjExKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQoreworCW1lbWNweShoYWRkciwgc2tiX21hY19oZWFkZXIoc2tiKSArIDEwLCBFVEhfQUxFTik7IC8qIGFkZHIyICovCisJcmV0dXJuIEVUSF9BTEVOOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgaWVlZTgwMjExX2hlYWRlcl9vcHMgPSB7CisJLmNyZWF0ZQkJPSBldGhfaGVhZGVyLAorCS5wYXJzZQkJPSBoZWFkZXJfcGFyc2VfODAyMTEsCisJLnJlYnVpbGQJPSBldGhfcmVidWlsZF9oZWFkZXIsCisJLmNhY2hlCQk9IGV0aF9oZWFkZXJfY2FjaGUsCisJLmNhY2hlX3VwZGF0ZQk9IGV0aF9oZWFkZXJfY2FjaGVfdXBkYXRlLAorfTsKKwogc3RhdGljIGludCBpZWVlODAyMTFfbWFzdGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbWFzdGVyX3ByaXYgKm1wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IG1wcml2LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlpbnQgcmVzID0gLUVPUE5PVFNVUFA7CiAKQEAgLTEyMSw3ICsxMjksOCBAQAogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9tYXN0ZXJfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CisJc3RydWN0IGllZWU4MDIxMV9tYXN0ZXJfcHJpdiAqbXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gbXByaXYtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCiAJLyogd2UgaG9sZCB0aGUgUlROTCBoZXJlIHNvIGNhbiBzYWZlbHkgd2FsayB0aGUgbGlzdCAqLwpAQCAtMTM0LDg0OSArMTQzLDEyIEBACiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9tYXN0ZXJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21hc3Rlcl9wcml2ICptcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBtcHJpdi0+bG9jYWw7CiAKIAlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7CiB9CiAKLS8qIHJlZ3VsYXIgaW50ZXJmYWNlcyAqLwotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQotewotCWludCBtZXNoaGRybGVuOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQotCW1lc2hoZHJsZW4gPSAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQpID8gNSA6IDA7Ci0KLQkvKiBGSVg6IHdoYXQgd291bGQgYmUgcHJvcGVyIGxpbWl0cyBmb3IgTVRVPwotCSAqIFRoaXMgaW50ZXJmYWNlIHVzZXMgODAyLjMgZnJhbWVzLiAqLwotCWlmIChuZXdfbXR1IDwgMjU2IHx8Ci0JICAgIG5ld19tdHUgPiBJRUVFODAyMTFfTUFYX0RBVEFfTEVOIC0gMjQgLSA2IC0gbWVzaGhkcmxlbikgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlczogc2V0dGluZyBNVFUgJWRcbiIsIGRldi0+bmFtZSwgbmV3X210dSk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcgKi8KLQlkZXYtPm10dSA9IG5ld19tdHU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlkZW50aWNhbF9tYWNfYWRkcl9hbGxvd2VkKGludCB0eXBlMSwgaW50IHR5cGUyKQotewotCXJldHVybiAodHlwZTEgPT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUiB8fAotCQl0eXBlMiA9PSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSIHx8Ci0JCSh0eXBlMSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCAmJgotCQkgdHlwZTIgPT0gSUVFRTgwMjExX0lGX1RZUEVfV0RTKSB8fAotCQkodHlwZTEgPT0gSUVFRTgwMjExX0lGX1RZUEVfV0RTICYmCi0JCSAodHlwZTIgPT0gSUVFRTgwMjExX0lGX1RZUEVfV0RTIHx8Ci0JCSAgdHlwZTIgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApKSB8fAotCQkodHlwZTEgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYKLQkJIHR5cGUyID09IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4pIHx8Ci0JCSh0eXBlMSA9PSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOICYmCi0JCSAodHlwZTIgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgfHwKLQkJICB0eXBlMiA9PSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOKSkpOwotfQotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsICpuc2RhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiBjb25mOwotCXUzMiBjaGFuZ2VkID0gMDsKLQlpbnQgcmVzOwotCWJvb2wgbmVlZF9od19yZWNvbmZpZyA9IDA7Ci0KLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0KLQkvKiB3ZSBob2xkIHRoZSBSVE5MIGhlcmUgc28gY2FuIHNhZmVseSB3YWxrIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShuc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IG5zZGF0YS0+ZGV2OwotCi0JCWlmIChuZGV2ICE9IGRldiAmJiBuZXRpZl9ydW5uaW5nKG5kZXYpKSB7Ci0JCQkvKgotCQkJICogQWxsb3cgb25seSBhIHNpbmdsZSBJQlNTIGludGVyZmFjZSB0byBiZSB1cCBhdCBhbnkKLQkJCSAqIHRpbWUuIFRoaXMgaXMgcmVzdHJpY3RlZCBiZWNhdXNlIGJlYWNvbiBkaXN0cmlidXRpb24KLQkJCSAqIGNhbm5vdCB3b3JrIHByb3Blcmx5IGlmIGJvdGggYXJlIGluIHRoZSBzYW1lIElCU1MuCi0JCQkgKgotCQkJICogVG8gcmVtb3ZlIHRoaXMgcmVzdHJpY3Rpb24gd2UnZCBoYXZlIHRvIGRpc2FsbG93IHRoZW0KLQkJCSAqIGZyb20gc2V0dGluZyB0aGUgc2FtZSBTU0lEIG9uIGRpZmZlcmVudCBJQlNTIGludGVyZmFjZXMKLQkJCSAqIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBoYXJkd2FyZS4gVGhlbiwgaG93ZXZlciwgd2UncmUKLQkJCSAqIGZhY2VkIHdpdGggaGF2aW5nIHRvIGFkb3B0IHR3byBkaWZmZXJlbnQgVFNGIHRpbWVycy4uLgotCQkJICovCi0JCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYKLQkJCSAgICBuc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQotCQkJLyoKLQkJCSAqIFRoZSByZW1haW5pbmcgY2hlY2tzIGFyZSBvbmx5IHBlcmZvcm1lZCBmb3IgaW50ZXJmYWNlcwotCQkJICogd2l0aCB0aGUgc2FtZSBNQUMgYWRkcmVzcy4KLQkJCSAqLwotCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyLCBuZGV2LT5kZXZfYWRkcikpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qCi0JCQkgKiBjaGVjayB3aGV0aGVyIGl0IG1heSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MKLQkJCSAqLwotCQkJaWYgKCFpZGVudGljYWxfbWFjX2FkZHJfYWxsb3dlZChzZGF0YS0+dmlmLnR5cGUsCi0JCQkJCQkJbnNkYXRhLT52aWYudHlwZSkpCi0JCQkJcmV0dXJuIC1FTk9UVU5JUTsKLQotCQkJLyoKLQkJCSAqIGNhbiBvbmx5IGFkZCBWTEFOcyB0byBlbmFibGVkIEFQcwotCQkJICovCi0JCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4gJiYKLQkJCSAgICBuc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKQotCQkJCXNkYXRhLT5ic3MgPSAmbnNkYXRhLT51LmFwOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1dEUzoKLQkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNkYXRhLT51Lndkcy5yZW1vdGVfYWRkcikpCi0JCQlyZXR1cm4gLUVOT0xJTks7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfVkxBTjoKLQkJaWYgKCFzZGF0YS0+YnNzKQotCQkJcmV0dXJuIC1FTk9MSU5LOwotCQlsaXN0X2FkZCgmc2RhdGEtPnUudmxhbi5saXN0LCAmc2RhdGEtPmJzcy0+dmxhbnMpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgotCQlzZGF0YS0+YnNzID0gJnNkYXRhLT51LmFwOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQ6Ci0JCS8qIG1lc2ggaWZhY2VzIG11c3Qgc2V0IGFsbG11bHRpIHRvIGZvcndhcmQgbWNhc3QgdHJhZmZpYyAqLwotCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX2FsbG11bHRpcyk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfU1RBOgotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6Ci0JCS8qIG5vIHNwZWNpYWwgdHJlYXRtZW50ICovCi0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSU5WQUxJRDoKLQkJLyogY2Fubm90IGhhcHBlbiAqLwotCQlXQVJOX09OKDEpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAobG9jYWwtPm9wZW5fY291bnQgPT0gMCkgewotCQlyZXMgPSAwOwotCQlpZiAobG9jYWwtPm9wcy0+c3RhcnQpCi0JCQlyZXMgPSBsb2NhbC0+b3BzLT5zdGFydChsb2NhbF90b19odyhsb2NhbCkpOwotCQlpZiAocmVzKQotCQkJZ290byBlcnJfZGVsX2JzczsKLQkJbmVlZF9od19yZWNvbmZpZyA9IDE7Ci0JCWllZWU4MDIxMV9sZWRfcmFkaW8obG9jYWwsIGxvY2FsLT5ody5jb25mLnJhZGlvX2VuYWJsZWQpOwotCX0KLQotCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOOgotCQkvKiBubyBuZWVkIHRvIHRlbGwgZHJpdmVyICovCi0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKLQkJCWxvY2FsLT5jb29rZWRfbW50cnMrKzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogbXVzdCBiZSBiZWZvcmUgdGhlIGNhbGwgdG8gaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIgKi8KLQkJbG9jYWwtPm1vbml0b3JzKys7Ci0JCWlmIChsb2NhbC0+bW9uaXRvcnMgPT0gMSkKLQkJCWxvY2FsLT5ody5jb25mLmZsYWdzIHw9IElFRUU4MDIxMV9DT05GX1JBRElPVEFQOwotCi0JCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0ZDU0ZBSUwpCi0JCQlsb2NhbC0+ZmlmX2Zjc2ZhaWwrKzsKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfUExDUEZBSUwpCi0JCQlsb2NhbC0+ZmlmX3BsY3BmYWlsKys7Ci0JCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPTlRST0wpCi0JCQlsb2NhbC0+ZmlmX2NvbnRyb2wrKzsKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfT1RIRVJfQlNTKQotCQkJbG9jYWwtPmZpZl9vdGhlcl9ic3MrKzsKLQotCQluZXRpZl9hZGRyX2xvY2tfYmgobG9jYWwtPm1kZXYpOwotCQlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7Ci0JCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGxvY2FsLT5tZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgotCQlzZGF0YS0+dS5zdGEuZmxhZ3MgJj0gfklFRUU4MDIxMV9TVEFfUFJFVl9CU1NJRF9TRVQ7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JCWNvbmYudmlmID0gJnNkYXRhLT52aWY7Ci0JCWNvbmYudHlwZSA9IHNkYXRhLT52aWYudHlwZTsKLQkJY29uZi5tYWNfYWRkciA9IGRldi0+ZGV2X2FkZHI7Ci0JCXJlcyA9IGxvY2FsLT5vcHMtPmFkZF9pbnRlcmZhY2UobG9jYWxfdG9faHcobG9jYWwpLCAmY29uZik7Ci0JCWlmIChyZXMpCi0JCQlnb3RvIGVycl9zdG9wOwotCi0JCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQotCQkJaWVlZTgwMjExX3N0YXJ0X21lc2goc2RhdGEtPmRldik7Ci0JCWNoYW5nZWQgfD0gaWVlZTgwMjExX3Jlc2V0X2VycF9pbmZvKGRldik7Ci0JCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKLQkJaWVlZTgwMjExX2VuYWJsZV9rZXlzKHNkYXRhKTsKLQotCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSAmJgotCQkgICAgIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfVVNFUlNQQUNFX01MTUUpKQotCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJZWxzZQotCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwotCX0KLQotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfV0RTKSB7Ci0JCS8qIENyZWF0ZSBTVEEgZW50cnkgZm9yIHRoZSBXRFMgcGVlciAqLwotCQlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc3RhKSB7Ci0JCQlyZXMgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKLQkJfQotCi0JCS8qIG5vIGxvY2tpbmcgcmVxdWlyZWQgc2luY2UgU1RBIGlzIG5vdCBsaXZlIHlldCAqLwotCQlzdGEtPmZsYWdzIHw9IFdMQU5fU1RBX0FVVEhPUklaRUQ7Ci0KLQkJcmVzID0gc3RhX2luZm9faW5zZXJ0KHN0YSk7Ci0JCWlmIChyZXMpIHsKLQkJCS8qIFNUQSBoYXMgYmVlbiBmcmVlZCAqLwotCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKLQkJfQotCX0KLQotCWlmIChsb2NhbC0+b3Blbl9jb3VudCA9PSAwKSB7Ci0JCXJlcyA9IGRldl9vcGVuKGxvY2FsLT5tZGV2KTsKLQkJV0FSTl9PTihyZXMpOwotCQlpZiAocmVzKQotCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKLQkJdGFza2xldF9lbmFibGUoJmxvY2FsLT50eF9wZW5kaW5nX3Rhc2tsZXQpOwotCQl0YXNrbGV0X2VuYWJsZSgmbG9jYWwtPnRhc2tsZXQpOwotCX0KLQotCS8qCi0JICogc2V0X211bHRpY2FzdF9saXN0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgbmV0d29ya2luZyBjb3JlCi0JICogd2hpY2ggd2lsbCBjaGVjayB3aGV0aGVyIGFueSBpbmNyZW1lbnRzIGhlcmUgd2VyZSBkb25lIGluCi0JICogZXJyb3IgYW5kIHN5bmMgdGhlbSBkb3duIHRvIHRoZSBoYXJkd2FyZSBhcyBmaWx0ZXIgZmxhZ3MuCi0JICovCi0JaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9BTExNVUxUSSkKLQkJYXRvbWljX2luYygmbG9jYWwtPmlmZl9hbGxtdWx0aXMpOwotCi0JaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9QUk9NSVNDKQotCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX3Byb21pc2NzKTsKLQotCWxvY2FsLT5vcGVuX2NvdW50Kys7Ci0JaWYgKG5lZWRfaHdfcmVjb25maWcpCi0JCWllZWU4MDIxMV9od19jb25maWcobG9jYWwpOwotCi0JLyoKLQkgKiBpZWVlODAyMTFfc3RhX3dvcmsgaXMgZGlzYWJsZWQgd2hpbGUgbmV0d29yayBpbnRlcmZhY2UKLQkgKiBpcyBkb3duLiBUaGVyZWZvcmUsIHNvbWUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1heSBub3QKLQkgKiB5ZXQgYmUgZWZmZWN0aXZlLiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiBpZWVlODAyMTFfc3RhX3dvcmsKLQkgKiB0byBmaXggdGhpcy4KLQkgKi8KLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCQlxdWV1ZV93b3JrKGxvY2FsLT5ody53b3JrcXVldWUsICZpZnN0YS0+d29yayk7Ci0JfQotCi0JbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhkZXYpOwotCi0JcmV0dXJuIDA7Ci0gZXJyX2RlbF9pbnRlcmZhY2U6Ci0JbG9jYWwtPm9wcy0+cmVtb3ZlX2ludGVyZmFjZShsb2NhbF90b19odyhsb2NhbCksICZjb25mKTsKLSBlcnJfc3RvcDoKLQlpZiAoIWxvY2FsLT5vcGVuX2NvdW50ICYmIGxvY2FsLT5vcHMtPnN0b3ApCi0JCWxvY2FsLT5vcHMtPnN0b3AobG9jYWxfdG9faHcobG9jYWwpKTsKLSBlcnJfZGVsX2JzczoKLQlzZGF0YS0+YnNzID0gTlVMTDsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4pCi0JCWxpc3RfZGVsKCZzZGF0YS0+dS52bGFuLmxpc3QpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgY29uZjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQotCS8qCi0JICogU3RvcCBUWCBvbiB0aGlzIGludGVyZmFjZSBmaXJzdC4KLQkgKi8KLQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoZGV2KTsKLQotCS8qCi0JICogTm93IGRlbGV0ZSBhbGwgYWN0aXZlIGFnZ3JlZ2F0aW9uIHNlc3Npb25zLgotCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSkKLQkJCWllZWU4MDIxMV9zdGFfdGVhcl9kb3duX0JBX3Nlc3Npb25zKGRldiwgc3RhLT5hZGRyKTsKLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCS8qCi0JICogUmVtb3ZlIGFsbCBzdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlcmZhY2UuCi0JICoKLQkgKiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBvcHMtPnJlbW92ZV9pbnRlcmZhY2UoKQotCSAqIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGNhbiBsYXRlciBpbnZva2Ugb3BzLT5zdGFfbm90aWZ5KCkKLQkgKiB3aGVuZXZlciB0aGUgU1RBcyBhcmUgcmVtb3ZlZCwgYW5kIHRoYXQgaW52YWxpZGF0ZXMgZHJpdmVyCi0JICogYXNzdW1wdGlvbnMgYWJvdXQgYWx3YXlzIGdldHRpbmcgYSB2aWYgcG9pbnRlciB0aGF0IGlzIHZhbGlkCi0JICogKGJlY2F1c2UgaWYgd2UgcmVtb3ZlIGEgU1RBIGFmdGVyIG9wcy0+cmVtb3ZlX2ludGVyZmFjZSgpCi0JICogdGhlIGRyaXZlciB3aWxsIGhhdmUgcmVtb3ZlZCB0aGUgdmlmIGluZm8gYWxyZWFkeSEpCi0JICoKLQkgKiBXZSBjb3VsZCByZWxheCB0aGlzIGFuZCBvbmx5IHVubGluayB0aGUgc3RhdGlvbnMgZnJvbSB0aGUKLQkgKiBoYXNoIHRhYmxlIGFuZCBsaXN0IGJ1dCBrZWVwIHRoZW0gb24gYSBwZXItc2RhdGEgbGlzdCB0aGF0Ci0JICogd2lsbCBiZSBpbnNlcnRlZCBiYWNrIGFnYWluIHdoZW4gdGhlIGludGVyZmFjZSBpcyBicm91Z2h0Ci0JICogdXAgYWdhaW4sIGJ1dCBJIGRvbid0IGN1cnJlbnRseSBzZWUgYSB1c2UgY2FzZSBmb3IgdGhhdCwKLQkgKiBleGNlcHQgd2l0aCBXRFMgd2hpY2ggZ2V0cyBhIFNUQSBlbnRyeSBjcmVhdGVkIHdoZW4gaXQgaXMKLQkgKiBicm91Z2h0IHVwLgotCSAqLwotCXN0YV9pbmZvX2ZsdXNoKGxvY2FsLCBzZGF0YSk7Ci0KLQkvKgotCSAqIERvbid0IGNvdW50IHRoaXMgaW50ZXJmYWNlIGZvciBwcm9taXNjL2FsbG11bHRpIHdoaWxlIGl0Ci0JICogaXMgZG93bi4gZGV2X21jX3Vuc3luYygpIHdpbGwgaW52b2tlIHNldF9tdWx0aWNhc3RfbGlzdAotCSAqIG9uIHRoZSBtYXN0ZXIgaW50ZXJmYWNlIHdoaWNoIHdpbGwgc3luYyB0aGVzZSBkb3duIHRvIHRoZQotCSAqIGhhcmR3YXJlIGFzIGZpbHRlciBmbGFncy4KLQkgKi8KLQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX0FMTE1VTFRJKQotCQlhdG9taWNfZGVjKCZsb2NhbC0+aWZmX2FsbG11bHRpcyk7Ci0KLQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX1BST01JU0MpCi0JCWF0b21pY19kZWMoJmxvY2FsLT5pZmZfcHJvbWlzY3MpOwotCi0JZGV2X21jX3Vuc3luYyhsb2NhbC0+bWRldiwgZGV2KTsKLQotCS8qIEFQcyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50ICovCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICp2bGFuLCAqdG1wOwotCQlzdHJ1Y3QgYmVhY29uX2RhdGEgKm9sZF9iZWFjb24gPSBzZGF0YS0+dS5hcC5iZWFjb247Ci0KLQkJLyogcmVtb3ZlIGJlYWNvbiAqLwotCQlyY3VfYXNzaWduX3BvaW50ZXIoc2RhdGEtPnUuYXAuYmVhY29uLCBOVUxMKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtmcmVlKG9sZF9iZWFjb24pOwotCi0JCS8qIGRvd24gYWxsIGRlcGVuZGVudCBkZXZpY2VzLCB0aGF0IGlzIFZMQU5zICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB0bXAsICZzZGF0YS0+dS5hcC52bGFucywKLQkJCQkJIHUudmxhbi5saXN0KQotCQkJZGV2X2Nsb3NlKHZsYW4tPmRldik7Ci0JCVdBUk5fT04oIWxpc3RfZW1wdHkoJnNkYXRhLT51LmFwLnZsYW5zKSk7Ci0JfQotCi0JbG9jYWwtPm9wZW5fY291bnQtLTsKLQotCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOOgotCQlsaXN0X2RlbCgmc2RhdGEtPnUudmxhbi5saXN0KTsKLQkJLyogbm8gbmVlZCB0byB0ZWxsIGRyaXZlciAqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01OVFI6Ci0JCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKSB7Ci0JCQlsb2NhbC0+Y29va2VkX21udHJzLS07Ci0JCQlicmVhazsKLQkJfQotCi0JCWxvY2FsLT5tb25pdG9ycy0tOwotCQlpZiAobG9jYWwtPm1vbml0b3JzID09IDApCi0JCQlsb2NhbC0+aHcuY29uZi5mbGFncyAmPSB+SUVFRTgwMjExX0NPTkZfUkFESU9UQVA7Ci0KLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfRkNTRkFJTCkKLQkJCWxvY2FsLT5maWZfZmNzZmFpbC0tOwotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19QTENQRkFJTCkKLQkJCWxvY2FsLT5maWZfcGxjcGZhaWwtLTsKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09OVFJPTCkKLQkJCWxvY2FsLT5maWZfY29udHJvbC0tOwotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19PVEhFUl9CU1MpCi0JCQlsb2NhbC0+ZmlmX290aGVyX2Jzcy0tOwotCi0JCW5ldGlmX2FkZHJfbG9ja19iaChsb2NhbC0+bWRldik7Ci0JCWllZWU4MDIxMV9jb25maWd1cmVfZmlsdGVyKGxvY2FsKTsKLQkJbmV0aWZfYWRkcl91bmxvY2tfYmgobG9jYWwtPm1kZXYpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQ6Ci0JCS8qIGFsbG11bHRpIGlzIGFsd2F5cyBzZXQgb24gbWVzaCBpZmFjZXMgKi8KLQkJYXRvbWljX2RlYygmbG9jYWwtPmlmZl9hbGxtdWx0aXMpOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lCU1M6Ci0JCXNkYXRhLT51LnN0YS5zdGF0ZSA9IElFRUU4MDIxMV9ESVNBQkxFRDsKLQkJbWVtc2V0KHNkYXRhLT51LnN0YS5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCQlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUuc3RhLnRpbWVyKTsKLQkJLyoKLQkJICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgZG93bi4KLQkJICogQ2FsbCBzeW5jaHJvbml6ZV9yY3UoKSB0byB3YWl0IGZvciB0aGUgUlggcGF0aAotCQkgKiBzaG91bGQgaXQgYmUgdXNpbmcgdGhlIGludGVyZmFjZSBhbmQgZW5xdWV1aW5nCi0JCSAqIGZyYW1lcyBhdCB0aGlzIHZlcnkgdGltZSBvbiBhbm90aGVyIENQVS4KLQkJICovCi0JCXN5bmNocm9uaXplX3JjdSgpOwotCQlza2JfcXVldWVfcHVyZ2UoJnNkYXRhLT51LnN0YS5za2JfcXVldWUpOwotCi0JCWlmIChsb2NhbC0+c2Nhbl9kZXYgPT0gc2RhdGEtPmRldikgewotCQkJaWYgKCFsb2NhbC0+b3BzLT5od19zY2FuKSB7Ci0JCQkJbG9jYWwtPnN0YV9zd19zY2FubmluZyA9IDA7Ci0JCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmbG9jYWwtPnNjYW5fd29yayk7Ci0JCQl9IGVsc2UKLQkJCQlsb2NhbC0+c3RhX2h3X3NjYW5uaW5nID0gMDsKLQkJfQotCi0JCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9QUklWQUNZX0lOVk9LRUQ7Ci0JCWtmcmVlKHNkYXRhLT51LnN0YS5leHRyYV9pZSk7Ci0JCXNkYXRhLT51LnN0YS5leHRyYV9pZSA9IE5VTEw7Ci0JCXNkYXRhLT51LnN0YS5leHRyYV9pZV9sZW4gPSAwOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCQljb25mLnZpZiA9ICZzZGF0YS0+dmlmOwotCQljb25mLnR5cGUgPSBzZGF0YS0+dmlmLnR5cGU7Ci0JCWNvbmYubWFjX2FkZHIgPSBkZXYtPmRldl9hZGRyOwotCQkvKiBkaXNhYmxlIGFsbCBrZXlzIGZvciBhcyBsb25nIGFzIHRoaXMgbmV0ZGV2IGlzIGRvd24gKi8KLQkJaWVlZTgwMjExX2Rpc2FibGVfa2V5cyhzZGF0YSk7Ci0JCWxvY2FsLT5vcHMtPnJlbW92ZV9pbnRlcmZhY2UobG9jYWxfdG9faHcobG9jYWwpLCAmY29uZik7Ci0JfQotCi0Jc2RhdGEtPmJzcyA9IE5VTEw7Ci0KLQlpZiAobG9jYWwtPm9wZW5fY291bnQgPT0gMCkgewotCQlpZiAobmV0aWZfcnVubmluZyhsb2NhbC0+bWRldikpCi0JCQlkZXZfY2xvc2UobG9jYWwtPm1kZXYpOwotCi0JCWlmIChsb2NhbC0+b3BzLT5zdG9wKQotCQkJbG9jYWwtPm9wcy0+c3RvcChsb2NhbF90b19odyhsb2NhbCkpOwotCi0JCWllZWU4MDIxMV9sZWRfcmFkaW8obG9jYWwsIDApOwotCi0JCWZsdXNoX3dvcmtxdWV1ZShsb2NhbC0+aHcud29ya3F1ZXVlKTsKLQotCQl0YXNrbGV0X2Rpc2FibGUoJmxvY2FsLT50eF9wZW5kaW5nX3Rhc2tsZXQpOwotCQl0YXNrbGV0X2Rpc2FibGUoJmxvY2FsLT50YXNrbGV0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqcmEsIHUxNiB0aWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0JdTE2IHN0YXJ0X3NlcV9udW0gPSAwOwotCXU4ICpzdGF0ZTsKLQlpbnQgcmV0OwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCi0JaWYgKHRpZCA+PSBTVEFfVElEX05VTSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiT3BlbiBCQSBzZXNzaW9uIHJlcXVlc3RlZCBmb3IgJXMgdGlkICV1XG4iLAotCQkJCXByaW50X21hYyhtYWMsIHJhKSwgdGlkKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOwotCWlmICghc3RhKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZmluZCB0aGUgc3RhdGlvblxuIik7Ci0jZW5kaWYKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBleGl0OwotCX0KLQotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCS8qIHdlIGhhdmUgdHJpZWQgdG9vIG1hbnkgdGltZXMsIHJlY2VpdmVyIGRvZXMgbm90IHdhbnQgQS1NUERVICovCi0JaWYgKHN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0gPiBIVF9BR0dfTUFYX1JFVFJJRVMpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl91bmxvY2tfc3RhOwotCX0KLQotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQkvKiBjaGVjayBpZiB0aGUgVElEIGlzIG5vdCBpbiBhZ2dyZWdhdGlvbiBmbG93IGFscmVhZHkgKi8KLQlpZiAoKnN0YXRlICE9IEhUX0FHR19TVEFURV9JRExFKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJCQSByZXF1ZXN0IGRlbmllZCAtIHNlc3Npb24gaXMgbm90ICIKLQkJCQkgImlkbGUgb24gdGlkICV1XG4iLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIGVycl91bmxvY2tfc3RhOwotCX0KLQotCS8qIHByZXBhcmUgQS1NUERVIE1MTUUgZm9yIFR4IGFnZ3JlZ2F0aW9uICovCi0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aWRfYW1wZHVfdHgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJhbGxvY2F0ZSB0eCBtbG1lIHRvIHRpZCAlZCBmYWlsZWRcbiIsCi0JCQkJCXRpZCk7Ci0jZW5kaWYKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfdW5sb2NrX3N0YTsKLQl9Ci0JLyogVHggdGltZXIgKi8KLQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIuZnVuY3Rpb24gPQotCQkJc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZDsKLQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIuZGF0YSA9Ci0JCQkodW5zaWduZWQgbG9uZykmc3RhLT50aW1lcl90b190aWRbdGlkXTsKLQlpbml0X3RpbWVyKCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIpOwotCi0JLyogY3JlYXRlIGEgbmV3IHF1ZXVlIGZvciB0aGlzIGFnZ3JlZ2F0aW9uICovCi0JcmV0ID0gaWVlZTgwMjExX2h0X2FnZ19xdWV1ZV9hZGQobG9jYWwsIHN0YSwgdGlkKTsKLQotCS8qIGNhc2Ugbm8gcXVldWUgaXMgYXZhaWxhYmxlIHRvIGFnZ3JlZ2F0aW9uCi0JICogZG9uJ3Qgc3dpdGNoIHRvIGFnZ3JlZ2F0aW9uICovCi0JaWYgKHJldCkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBxdWV1ZSB1bmF2YWlsYWJsZSBmb3IiCi0JCQkJCSIgdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCQlnb3RvIGVycl91bmxvY2tfcXVldWU7Ci0JfQotCXNkYXRhID0gc3RhLT5zZGF0YTsKLQotCS8qIE9rLCB0aGUgQWRkYmEgZnJhbWUgaGFzbid0IGJlZW4gc2VudCB5ZXQsIGJ1dCBpZiB0aGUgZHJpdmVyIGNhbGxzIHRoZQotCSAqIGNhbGwgYmFjayByaWdodCBhd2F5LCBpdCBtdXN0IHNlZSB0aGF0IHRoZSBmbG93IGhhcyBiZWd1biAqLwotCSpzdGF0ZSB8PSBIVF9BRERCQV9SRVFVRVNURURfTVNLOwotCi0JaWYgKGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbikKLQkJcmV0ID0gbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKGh3LCBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQsCi0JCQkJCQlyYSwgdGlkLCAmc3RhcnRfc2VxX251bSk7Ci0KLQlpZiAocmV0KSB7Ci0JCS8qIE5vIG5lZWQgdG8gcmVxdWV1ZSB0aGUgcGFja2V0cyBpbiB0aGUgYWdnIHF1ZXVlLCBzaW5jZSB3ZQotCQkgKiBoZWxkIHRoZSB0eCBsb2NrOiBubyBwYWNrZXQgY291bGQgYmUgZW5xdWV1ZWQgdG8gdGhlIG5ld2x5Ci0JCSAqIGFsbG9jYXRlZCBxdWV1ZSAqLwotCQlpZWVlODAyMTFfaHRfYWdnX3F1ZXVlX3JlbW92ZShsb2NhbCwgc3RhLCB0aWQsIDApOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBIVyB1bmF2YWlsYWJsZSBmb3IiCi0JCQkJCSIgdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfSURMRTsKLQkJZ290byBlcnJfdW5sb2NrX3F1ZXVlOwotCX0KLQotCS8qIFdpbGwgcHV0IGFsbCB0aGUgcGFja2V0cyBpbiB0aGUgbmV3IFNXIHF1ZXVlICovCi0JaWVlZTgwMjExX3JlcXVldWUobG9jYWwsIGllZWU4MDJfMWRfdG9fYWNbdGlkXSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0KLQkvKiBzZW5kIGFuIGFkZEJBIHJlcXVlc3QgKi8KLQlzdGEtPmFtcGR1X21sbWUuZGlhbG9nX3Rva2VuX2FsbG9jYXRvcisrOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+ZGlhbG9nX3Rva2VuID0KLQkJCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXS0+c3NuID0gc3RhcnRfc2VxX251bTsKLQotCi0JaWVlZTgwMjExX3NlbmRfYWRkYmFfcmVxdWVzdChzdGEtPnNkYXRhLT5kZXYsIHJhLCB0aWQsCi0JCQkgc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5kaWFsb2dfdG9rZW4sCi0JCQkgc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdLT5zc24sCi0JCQkgMHg0MCwgNTAwMCk7Ci0JLyogYWN0aXZhdGUgdGhlIHRpbWVyIGZvciB0aGUgcmVjaXBpZW50J3MgYWRkQkEgcmVzcG9uc2UgKi8KLQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIuZXhwaXJlcyA9Ci0JCQkJamlmZmllcyArIEFEREJBX1JFU1BfSU5URVJWQUw7Ci0JYWRkX3RpbWVyKCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIpOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJhY3RpdmF0ZWQgYWRkQkEgcmVzcG9uc2UgdGltZXIgb24gdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmCi0JZ290byBleGl0OwotCi1lcnJfdW5sb2NrX3F1ZXVlOgotCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSk7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0gTlVMTDsKLQlyZXQgPSAtRUJVU1k7Ci1lcnJfdW5sb2NrX3N0YToKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLWV4aXQ6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24pOwotCi1pbnQgaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgdTggKnJhLCB1MTYgdGlkLAotCQkJCSBlbnVtIGllZWU4MDIxMV9iYWNrX3BhcnRpZXMgaW5pdGlhdG9yKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXU4ICpzdGF0ZTsKLQlpbnQgcmV0ID0gMDsKLQlERUNMQVJFX01BQ19CVUYobWFjKTsKLQotCWlmICh0aWQgPj0gU1RBX1RJRF9OVU0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOwotCWlmICghc3RhKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQkvKiBjaGVjayBpZiB0aGUgVElEIGlzIGluIGFnZ3JlZ2F0aW9uICovCi0Jc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOwotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCWlmICgqc3RhdGUgIT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKSB7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gc3RvcF9CQV9leGl0OwotCX0KLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJUeCBCQSBzZXNzaW9uIHN0b3AgcmVxdWVzdGVkIGZvciAlcyB0aWQgJXVcbiIsCi0JCQkJcHJpbnRfbWFjKG1hYywgcmEpLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCi0JaWVlZTgwMjExX3N0b3BfcXVldWUoaHcsIHN0YS0+dGlkX3RvX3R4X3FbdGlkXSk7Ci0KLQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfUkVRX1NUT1BfQkFfTVNLIHwKLQkJKGluaXRpYXRvciA8PCBIVF9BR0dfU1RBVEVfSU5JVElBVE9SX1NISUZUKTsKLQotCWlmIChsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pCi0JCXJldCA9IGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbihodywgSUVFRTgwMjExX0FNUERVX1RYX1NUT1AsCi0JCQkJCQlyYSwgdGlkLCBOVUxMKTsKLQotCS8qIGNhc2UgSFcgZGVuaWVkIGdvaW5nIGJhY2sgdG8gbGVnYWN5ICovCi0JaWYgKHJldCkgewotCQlXQVJOX09OKHJldCAhPSAtRUJVU1kpOwotCQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUw7Ci0JCWllZWU4MDIxMV93YWtlX3F1ZXVlKGh3LCBzdGEtPnRpZF90b190eF9xW3RpZF0pOwotCQlnb3RvIHN0b3BfQkFfZXhpdDsKLQl9Ci0KLXN0b3BfQkFfZXhpdDoKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKTsKLQotdm9pZCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpyYSwgdTE2IHRpZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQl1OCAqc3RhdGU7Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0KLQlpZiAodGlkID49IFNUQV9USURfTlVNKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJCYWQgVElEIHZhbHVlOiB0aWQgPSAlZCAoPj0gJWQpXG4iLAotCQkJCXRpZCwgU1RBX1RJRF9OVU0pOwotI2VuZGlmCi0JCXJldHVybjsKLQl9Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCByYSk7Ci0JaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZmluZCBzdGF0aW9uOiAlc1xuIiwKLQkJCQlwcmludF9tYWMobWFjLCByYSkpOwotI2VuZGlmCi0JCXJldHVybjsKLQl9Ci0KLQlzdGF0ZSA9ICZzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3R4W3RpZF07Ci0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCi0JaWYgKCEoKnN0YXRlICYgSFRfQUREQkFfUkVRVUVTVEVEX01TSykpIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImFkZEJBIHdhcyBub3QgcmVxdWVzdGVkIHlldCwgc3RhdGUgaXMgJWRcbiIsCi0JCQkJKnN0YXRlKTsKLSNlbmRpZgotCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlXQVJOX09OX09OQ0UoKnN0YXRlICYgSFRfQUREQkFfRFJWX1JFQURZX01TSyk7Ci0KLQkqc3RhdGUgfD0gSFRfQUREQkFfRFJWX1JFQURZX01TSzsKLQotCWlmICgqc3RhdGUgPT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJBZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGlkICVkIFxuIiwgdGlkKTsKLSNlbmRpZgotCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShodywgc3RhLT50aWRfdG9fdHhfcVt0aWRdKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF90eF9iYV9jYik7Ci0KLXZvaWQgaWVlZTgwMjExX3N0b3BfdHhfYmFfY2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpyYSwgdTggdGlkKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXU4ICpzdGF0ZTsKLQlpbnQgYWdnX3F1ZXVlOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCi0JaWYgKHRpZCA+PSBTVEFfVElEX05VTSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIFRJRCB2YWx1ZTogdGlkID0gJWQgKD49ICVkKVxuIiwKLQkJCQl0aWQsIFNUQV9USURfTlVNKTsKLSNlbmRpZgotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlN0b3BwaW5nIFR4IEJBIHNlc3Npb24gZm9yICVzIHRpZCAlZFxuIiwKLQkJCQlwcmludF9tYWMobWFjLCByYSksIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCi0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCByYSk7Ci0JaWYgKCFzdGEpIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBmaW5kIHN0YXRpb246ICVzXG4iLAotCQkJCXByaW50X21hYyhtYWMsIHJhKSk7Ci0jZW5kaWYKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0Jc3RhdGUgPSAmc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdOwotCi0JLyogTk9URTogbm8gbmVlZCB0byB1c2Ugc3RhLT5sb2NrIGluIHRoaXMgc3RhdGUgY2hlY2ssIGFzCi0JICogaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbiB3aWxsIGxldCBvbmx5IG9uZSBzdG9wIGNhbGwgdG8KLQkgKiBwYXNzIHRocm91Z2ggcGVyIHN0YS90aWQKLQkgKi8KLQlpZiAoKCpzdGF0ZSAmIEhUX0FHR19TVEFURV9SRVFfU1RPUF9CQV9NU0spID09IDApIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVuZXhwZWN0ZWQgY2FsbGJhY2sgdG8gQS1NUERVIHN0b3BcbiIpOwotI2VuZGlmCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCpzdGF0ZSAmIEhUX0FHR19TVEFURV9JTklUSUFUT1JfTVNLKQotCQlpZWVlODAyMTFfc2VuZF9kZWxiYShzdGEtPnNkYXRhLT5kZXYsIHJhLCB0aWQsCi0JCQlXTEFOX0JBQ0tfSU5JVElBVE9SLCBXTEFOX1JFQVNPTl9RU1RBX05PVF9VU0UpOwotCi0JYWdnX3F1ZXVlID0gc3RhLT50aWRfdG9fdHhfcVt0aWRdOwotCi0JaWVlZTgwMjExX2h0X2FnZ19xdWV1ZV9yZW1vdmUobG9jYWwsIHN0YSwgdGlkLCAxKTsKLQotCS8qIFdlIGp1c3QgcmVxdWV1ZWQgdGhlIGFsbCB0aGUgZnJhbWVzIHRoYXQgd2VyZSBpbiB0aGUKLQkgKiByZW1vdmVkIHF1ZXVlLCBhbmQgc2luY2Ugd2UgbWlnaHQgbWlzcyBhIHNvZnRpcnEgd2UgZG8KLQkgKiBuZXRpZl9zY2hlZHVsZV9xdWV1ZS4gIGllZWU4MDIxMV93YWtlX3F1ZXVlIGlzIG5vdCB1c2VkCi0JICogaGVyZSBhcyB0aGlzIHF1ZXVlIGlzIG5vdCBuZWNlc3NhcmlseSBzdG9wcGVkCi0JICovCi0JbmV0aWZfc2NoZWR1bGVfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShsb2NhbC0+bWRldiwgYWdnX3F1ZXVlKSk7Ci0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCSpzdGF0ZSA9IEhUX0FHR19TVEFURV9JRExFOwotCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0gPSAwOwotCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfdHhbdGlkXSk7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF90eFt0aWRdID0gTlVMTDsKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF90eF9iYV9jYik7Ci0KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICAgY29uc3QgdTggKnJhLCB1MTYgdGlkKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCXN0cnVjdCBpZWVlODAyMTFfcmFfdGlkICpyYV90aWQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoMCk7Ci0KLQlpZiAodW5saWtlbHkoIXNrYikpIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSwgIgotCQkJICAgICAgICJkcm9wcGluZyBzdGFydCBCQSBzZXNzaW9uIiwgc2tiLT5kZXYtPm5hbWUpOwotI2VuZGlmCi0JCXJldHVybjsKLQl9Ci0JcmFfdGlkID0gKHN0cnVjdCBpZWVlODAyMTFfcmFfdGlkICopICZza2ItPmNiOwotCW1lbWNweSgmcmFfdGlkLT5yYSwgcmEsIEVUSF9BTEVOKTsKLQlyYV90aWQtPnRpZCA9IHRpZDsKLQotCXNrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfQUREQkFfTVNHOwotCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+c2tiX3F1ZXVlLCBza2IpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmxvY2FsLT50YXNrbGV0KTsKLX0KLUVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUpOwotCi12b2lkIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBjb25zdCB1OCAqcmEsIHUxNiB0aWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYV90aWQgKnJhX3RpZDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYigwKTsKLQotCWlmICh1bmxpa2VseSghc2tiKSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5LCAiCi0JCQkgICAgICAgImRyb3BwaW5nIHN0b3AgQkEgc2Vzc2lvbiIsIHNrYi0+ZGV2LT5uYW1lKTsKLSNlbmRpZgotCQlyZXR1cm47Ci0JfQotCXJhX3RpZCA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhX3RpZCAqKSAmc2tiLT5jYjsKLQltZW1jcHkoJnJhX3RpZC0+cmEsIHJhLCBFVEhfQUxFTik7Ci0JcmFfdGlkLT50aWQgPSB0aWQ7Ci0KLQlza2ItPnBrdF90eXBlID0gSUVFRTgwMjExX0RFTEJBX01TRzsKLQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnNrYl9xdWV1ZSwgc2tiKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZsb2NhbC0+dGFza2xldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUpOwotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0JaW50IGFsbG11bHRpLCBwcm9taXNjLCBzZGF0YV9hbGxtdWx0aSwgc2RhdGFfcHJvbWlzYzsKLQotCWFsbG11bHRpID0gISEoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSk7Ci0JcHJvbWlzYyA9ICEhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk7Ci0Jc2RhdGFfYWxsbXVsdGkgPSAhIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEkpOwotCXNkYXRhX3Byb21pc2MgPSAhIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQyk7Ci0KLQlpZiAoYWxsbXVsdGkgIT0gc2RhdGFfYWxsbXVsdGkpIHsKLQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCi0JCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX2FsbG11bHRpcyk7Ci0JCWVsc2UKLQkJCWF0b21pY19kZWMoJmxvY2FsLT5pZmZfYWxsbXVsdGlzKTsKLQkJc2RhdGEtPmZsYWdzIF49IElFRUU4MDIxMV9TREFUQV9BTExNVUxUSTsKLQl9Ci0KLQlpZiAocHJvbWlzYyAhPSBzZGF0YV9wcm9taXNjKSB7Ci0JCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCi0JCQlhdG9taWNfaW5jKCZsb2NhbC0+aWZmX3Byb21pc2NzKTsKLQkJZWxzZQotCQkJYXRvbWljX2RlYygmbG9jYWwtPmlmZl9wcm9taXNjcyk7Ci0JCXNkYXRhLT5mbGFncyBePSBJRUVFODAyMTFfU0RBVEFfUFJPTUlTQzsKLQl9Ci0KLQlkZXZfbWNfc3luYyhsb2NhbC0+bWRldiwgZGV2KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGllZWU4MDIxMV9oZWFkZXJfb3BzID0gewotCS5jcmVhdGUJCT0gZXRoX2hlYWRlciwKLQkucGFyc2UJCT0gaGVhZGVyX3BhcnNlXzgwMjExLAotCS5yZWJ1aWxkCT0gZXRoX3JlYnVpbGRfaGVhZGVyLAotCS5jYWNoZQkJPSBldGhfaGVhZGVyX2NhY2hlLAotCS5jYWNoZV91cGRhdGUJPSBldGhfaGVhZGVyX2NhY2hlX3VwZGF0ZSwKLX07Ci0KLXZvaWQgaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZXRoZXJfc2V0dXAoZGV2KTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV9zdWJpZl9zdGFydF94bWl0OwotCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmaWVlZTgwMjExX2l3X2hhbmRsZXJfZGVmOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaWVlZTgwMjExX3NldF9tdWx0aWNhc3RfbGlzdDsKLQlkZXYtPmNoYW5nZV9tdHUgPSBpZWVlODAyMTFfY2hhbmdlX210dTsKLQlkZXYtPm9wZW4gPSBpZWVlODAyMTFfb3BlbjsKLQlkZXYtPnN0b3AgPSBpZWVlODAyMTFfc3RvcDsKLQlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKLX0KLQogLyogZXZlcnl0aGluZyBlbHNlICovCiAKIGludCBpZWVlODAyMTFfaWZfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1MzIgY2hhbmdlZCkKQEAgLTk4NywxOCArMTU5LDIxIEBACiAJaWYgKFdBUk5fT04oIW5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpKQogCQlyZXR1cm4gMDsKIAorCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIWxvY2FsLT5vcHMtPmNvbmZpZ19pbnRlcmZhY2UpCiAJCXJldHVybiAwOwogCiAJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOwogCWNvbmYuY2hhbmdlZCA9IGNoYW5nZWQ7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgeworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJY29uZi5ic3NpZCA9IHNkYXRhLT51LnN0YS5ic3NpZDsKIAkJY29uZi5zc2lkID0gc2RhdGEtPnUuc3RhLnNzaWQ7CiAJCWNvbmYuc3NpZF9sZW4gPSBzZGF0YS0+dS5zdGEuc3NpZF9sZW47Ci0JfSBlbHNlIGlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwl9IGVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQljb25mLmJzc2lkID0gc2RhdGEtPmRldi0+ZGV2X2FkZHI7CiAJCWNvbmYuc3NpZCA9IHNkYXRhLT51LmFwLnNzaWQ7CiAJCWNvbmYuc3NpZF9sZW4gPSBzZGF0YS0+dS5hcC5zc2lkX2xlbjsKQEAgLTEwMjcsNyArMjAyLDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJaW50IHJldCA9IDA7CiAKLQlpZiAobG9jYWwtPnN0YV9zd19zY2FubmluZykKKwlpZiAobG9jYWwtPnN3X3NjYW5uaW5nKQogCQljaGFuID0gbG9jYWwtPnNjYW5fY2hhbm5lbDsKIAllbHNlCiAJCWNoYW4gPSBsb2NhbC0+b3Blcl9jaGFubmVsOwpAQCAtMTA5OSw4ICsyNzQsOCBAQAogCWh0X2NvbmYuaHRfc3VwcG9ydGVkID0gMTsKIAogCWh0X2NvbmYuY2FwID0gcmVxX2h0X2NhcC0+Y2FwICYgc2JhbmQtPmh0X2luZm8uY2FwOwotCWh0X2NvbmYuY2FwICY9IH4oSUVFRTgwMjExX0hUX0NBUF9NSU1PX1BTKTsKLQlodF9jb25mLmNhcCB8PSBzYmFuZC0+aHRfaW5mby5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX01JTU9fUFM7CisJaHRfY29uZi5jYXAgJj0gfihJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKTsKKwlodF9jb25mLmNhcCB8PSBzYmFuZC0+aHRfaW5mby5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTOwogCWh0X2Jzc19jb25mLnByaW1hcnlfY2hhbm5lbCA9IHJlcV9ic3NfY2FwLT5wcmltYXJ5X2NoYW5uZWw7CiAJaHRfYnNzX2NvbmYuYnNzX2NhcCA9IHJlcV9ic3NfY2FwLT5ic3NfY2FwOwogCWh0X2Jzc19jb25mLmJzc19vcF9tb2RlID0gcmVxX2Jzc19jYXAtPmJzc19vcF9tb2RlOwpAQCAtMTE1Miw2ICszMjcsOSBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCisJaWYgKFdBUk5fT04oc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pKQorCQlyZXR1cm47CisKIAlpZiAoIWNoYW5nZWQpCiAJCXJldHVybjsKIApAQCAtMTE2MiwxMCArMzQwLDggQEAKIAkJCQkJICAgICBjaGFuZ2VkKTsKIH0KIAotdTMyIGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordTMyIGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0KIAlzZGF0YS0+YnNzX2NvbmYudXNlX2N0c19wcm90ID0gMDsKIAlzZGF0YS0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlID0gMDsKIAlyZXR1cm4gQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UIHwgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFOwpAQCAtMTI0NCw5ICs0MjAsMTAgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGhkcmxlbiwgaXZfbGVuLCBtaWNfbGVuOworCXVuc2lnbmVkIGludCBoZHJsZW4sIGl2X2xlbiwgbWljX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCi0JaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CiAKIAlpZiAoIWtleSkKIAkJZ290byBub19rZXk7CkBAIC0xMjY4LDI0ICs0NDUsMjAgQEAKIAkJZ290byBub19rZXk7CiAJfQogCi0JaWYgKHNrYi0+bGVuID49IG1pY19sZW4gJiYKKwlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgbWljX2xlbiAmJgogCSAgICAhKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRSkpCiAJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBtaWNfbGVuKTsKLQlpZiAoc2tiLT5sZW4gPj0gaXZfbGVuICYmIHNrYi0+bGVuID4gaGRybGVuKSB7CisJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIGl2X2xlbikgewogCQltZW1tb3ZlKHNrYi0+ZGF0YSArIGl2X2xlbiwgc2tiLT5kYXRhLCBoZHJsZW4pOwotCQlza2JfcHVsbChza2IsIGl2X2xlbik7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYl9wdWxsKHNrYiwgaXZfbGVuKTsKIAl9CiAKIG5vX2tleToKLQl7Ci0JCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCQl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOwotCQlpZiAoKGZjICYgMHg4QykgPT0gMHg4OCkgLyogUW9TIENvbnRyb2wgRmllbGQgKi8gewotCQkJZmMgJj0gfklFRUU4MDIxMV9TVFlQRV9RT1NfREFUQTsKLQkJCWhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KGZjKTsKLQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgMiwgc2tiLT5kYXRhLCBoZHJsZW4gLSAyKTsKLQkJCXNrYl9wdWxsKHNrYiwgMik7Ci0JCX0KKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJaGRyLT5mcmFtZV9jb250cm9sICY9IH5jcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpOworCQltZW1tb3ZlKHNrYi0+ZGF0YSArIElFRUU4MDIxMV9RT1NfQ1RMX0xFTiwgc2tiLT5kYXRhLAorCQkJaGRybGVuIC0gSUVFRTgwMjExX1FPU19DVExfTEVOKTsKKwkJc2tiX3B1bGwoc2tiLCBJRUVFODAyMTFfUU9TX0NUTF9MRU4pOwogCX0KIH0KIApAQCAtMTM2OSw2ICs1NDIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAl1MTYgZnJhZywgdHlwZTsKIAlfX2xlMTYgZmM7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV90eF9zdGF0dXNfcnRhcF9oZHIgKnJ0aGRyOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpwcmV2X2RldiA9IE5VTEw7CkBAIC0xMzc2LDQ3ICs1NTAsNDggQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAotCWlmIChpbmZvLT5zdGF0dXMuZXhjZXNzaXZlX3JldHJpZXMpIHsKLQkJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQkJaWYgKHN0YSkgewotCQkJaWYgKHRlc3Rfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfUFMpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGUgU1RBIGlzIGluIHBvd2VyIHNhdmUgbW9kZSwgc28gYXNzdW1lCi0JCQkJICogdGhhdCB0aGlzIFRYIHBhY2tldCBmYWlsZWQgYmVjYXVzZSBvZiB0aGF0LgotCQkJCSAqLwotCQkJCWllZWU4MDIxMV9oYW5kbGVfZmlsdGVyZWRfZnJhbWUobG9jYWwsIHN0YSwgc2tiKTsKLQkJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9CisJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKIAotCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0JaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0spICYmCi0JICAgIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSkgewotCQl1MTYgdGlkLCBzc247Ci0JCXU4ICpxYzsKLQkJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQkJaWYgKHN0YSkgewotCQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJCXRpZCA9IHFjWzBdICYgMHhmOwotCQkJc3NuID0gKChsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSArIDB4MTApCi0JCQkJCQkmIElFRUU4MDIxMV9TQ1RMX1NFUSk7Ci0JCQlpZWVlODAyMTFfc2VuZF9iYXIoc3RhLT5zZGF0YS0+ZGV2LCBoZHItPmFkZHIxLAotCQkJCQkgICB0aWQsIHNzbik7Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9UWF9GSUxURVJFRCkgewotCQlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIGhkci0+YWRkcjEpOwotCQlpZiAoc3RhKSB7CisJaWYgKHN0YSkgeworCQlpZiAoaW5mby0+c3RhdHVzLmV4Y2Vzc2l2ZV9yZXRyaWVzICYmCisJCSAgICB0ZXN0X3N0YV9mbGFncyhzdGEsIFdMQU5fU1RBX1BTKSkgeworCQkJLyoKKwkJCSAqIFRoZSBTVEEgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlLCBzbyBhc3N1bWUKKwkJCSAqIHRoYXQgdGhpcyBUWCBwYWNrZXQgZmFpbGVkIGJlY2F1c2Ugb2YgdGhhdC4KKwkJCSAqLwogCQkJaWVlZTgwMjExX2hhbmRsZV9maWx0ZXJlZF9mcmFtZShsb2NhbCwgc3RhLCBza2IpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm47CiAJCX0KLQl9IGVsc2UKLQkJcmF0ZV9jb250cm9sX3R4X3N0YXR1cyhsb2NhbC0+bWRldiwgc2tiKTsKKworCQlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCQlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFVfTk9fQkFDSykgJiYKKwkJICAgIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSkgeworCQkJdTE2IHRpZCwgc3NuOworCQkJdTggKnFjOworCisJCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQkJdGlkID0gcWNbMF0gJiAweGY7CisJCQlzc24gPSAoKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICsgMHgxMCkKKwkJCQkJCSYgSUVFRTgwMjExX1NDVExfU0VRKTsKKwkJCWllZWU4MDIxMV9zZW5kX2JhcihzdGEtPnNkYXRhLCBoZHItPmFkZHIxLAorCQkJCQkgICB0aWQsIHNzbik7CisJCX0KKworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9UWF9GSUxURVJFRCkgeworCQkJaWVlZTgwMjExX2hhbmRsZV9maWx0ZXJlZF9mcmFtZShsb2NhbCwgc3RhLCBza2IpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAoaW5mby0+c3RhdHVzLmV4Y2Vzc2l2ZV9yZXRyaWVzKQorCQkJCXN0YS0+dHhfcmV0cnlfZmFpbGVkKys7CisJCQlzdGEtPnR4X3JldHJ5X2NvdW50ICs9IGluZm8tPnN0YXR1cy5yZXRyeV9jb3VudDsKKwkJfQorCisJCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tpbmZvLT5iYW5kXTsKKwkJcmF0ZV9jb250cm9sX3R4X3N0YXR1cyhsb2NhbCwgc2JhbmQsIHN0YSwgc2tiKTsKKwl9CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtMTUwNCw3ICs2NzksNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSKSB7CisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgewogCQkJaWYgKCFuZXRpZl9ydW5uaW5nKHNkYXRhLT5kZXYpKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xNTgwLDggKzc1NSw2IEBACiAKIAlsb2NhbC0+aHcucXVldWVzID0gMTsgLyogZGVmYXVsdCAqLwogCi0JbG9jYWwtPmJyaWRnZV9wYWNrZXRzID0gMTsKLQogCWxvY2FsLT5ydHNfdGhyZXNob2xkID0gSUVFRTgwMjExX01BWF9SVFNfVEhSRVNIT0xEOwogCWxvY2FsLT5mcmFnbWVudGF0aW9uX3RocmVzaG9sZCA9IElFRUU4MDIxMV9NQVhfRlJBR19USFJFU0hPTEQ7CiAJbG9jYWwtPnNob3J0X3JldHJ5X2xpbWl0ID0gNzsKQEAgLTE1OTIsNyArNzY1LDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+a2V5X2xvY2spOwogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmxvY2FsLT5zY2FuX3dvcmssIGllZWU4MDIxMV9zdGFfc2Nhbl93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmbG9jYWwtPnNjYW5fd29yaywgaWVlZTgwMjExX3NjYW5fd29yayk7CiAKIAlzdGFfaW5mb19pbml0KGxvY2FsKTsKIApAQCAtMTYxOSw3ICs3OTIsNyBAQAogCWludCByZXN1bHQ7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCXN0cnVjdCBuZXRfZGV2aWNlICptZGV2OwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKm13ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfbWFzdGVyX3ByaXYgKm1wcml2OwogCiAJLyoKIAkgKiBnZW5lcmljIGNvZGUgZ3VhcmFudGVlcyBhdCBsZWFzdCBvbmUgYmFuZCwKQEAgLTE2MzksNiArODEyLDEzIEBACiAJCX0KIAl9CiAKKwkvKiBpZiBsb3ctbGV2ZWwgZHJpdmVyIHN1cHBvcnRzIEFQLCB3ZSBhbHNvIHN1cHBvcnQgVkxBTiAqLworCWlmIChsb2NhbC0+aHcud2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9BUCkpCisJCWxvY2FsLT5ody53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9BUF9WTEFOKTsKKworCS8qIG1hYzgwMjExIGFsd2F5cyBzdXBwb3J0cyBtb25pdG9yICovCisJbG9jYWwtPmh3LndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpOworCiAJcmVzdWx0ID0gd2lwaHlfcmVnaXN0ZXIobG9jYWwtPmh3LndpcGh5KTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTE2NTQsMTYgKzgzNCwxNCBAQAogCWlmIChody0+cXVldWVzIDwgNCkKIAkJaHctPmFtcGR1X3F1ZXVlcyA9IDA7CiAKLQltZGV2ID0gYWxsb2NfbmV0ZGV2X21xKHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwKKwltZGV2ID0gYWxsb2NfbmV0ZGV2X21xKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21hc3Rlcl9wcml2KSwKIAkJCSAgICAgICAid21hc3RlciVkIiwgZXRoZXJfc2V0dXAsCiAJCQkgICAgICAgaWVlZTgwMjExX251bV9xdWV1ZXMoaHcpKTsKIAlpZiAoIW1kZXYpCiAJCWdvdG8gZmFpbF9tZGV2X2FsbG9jOwogCi0JbXdkZXYgPSBuZXRkZXZfcHJpdihtZGV2KTsKLQltZGV2LT5pZWVlODAyMTFfcHRyID0gbXdkZXY7Ci0JbXdkZXYtPndpcGh5ID0gbG9jYWwtPmh3LndpcGh5OwotCisJbXByaXYgPSBuZXRkZXZfcHJpdihtZGV2KTsKKwltcHJpdi0+bG9jYWwgPSBsb2NhbDsKIAlsb2NhbC0+bWRldiA9IG1kZXY7CiAKIAlpZWVlODAyMTFfcnhfYnNzX2xpc3RfaW5pdChsb2NhbCk7CkBAIC0xNzQ1LDcgKzkyMyw3IEBACiAKIAkvKiBhZGQgb25lIGRlZmF1bHQgU1RBIGludGVyZmFjZSAqLwogCXJlc3VsdCA9IGllZWU4MDIxMV9pZl9hZGQobG9jYWwsICJ3bGFuJWQiLCBOVUxMLAotCQkJCSAgSUVFRTgwMjExX0lGX1RZUEVfU1RBLCBOVUxMKTsKKwkJCQkgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04sIE5VTEwpOwogCWlmIChyZXN1bHQpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gYWRkIGRlZmF1bHQgdmlydHVhbCBpZmFjZVxuIiwKIAkJICAgICAgIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSk7CkBAIC0xODM3LDYgKzEwMTUsMTAgQEAKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvLCBkcml2ZXJfZGF0YSkgKwogCSAgICAgICAgICAgICBJRUVFODAyMTFfVFhfSU5GT19EUklWRVJfREFUQV9TSVpFID4gc2l6ZW9mKHNrYi0+Y2IpKTsKIAorCXJldCA9IHJjODAyMTFfbWluc3RyZWxfaW5pdCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSByYzgwMjExX3BpZF9pbml0KCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE4NDksNiArMTAzMSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKIHsKIAlyYzgwMjExX3BpZF9leGl0KCk7CisJcmM4MDIxMV9taW5zdHJlbF9leGl0KCk7CiAKIAkvKgogCSAqIEZvciBrZXkgdG9kbywgaXQnbGwgYmUgZW1wdHkgYnkgbm93IGJ1dCB0aGUgd29yawpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2guYyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKaW5kZXggMzVmMmY5NS4uODAxMzI3NyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2guYworKysgYi9uZXQvbWFjODAyMTEvbWVzaC5jCkBAIC0xMiw2ICsxMiw5IEBACiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJtZXNoLmgiCiAKKyNkZWZpbmUgSUVFRTgwMjExX01FU0hfUEVFUl9JTkFDVElWSVRZX0xJTUlUICgxODAwICogSFopCisjZGVmaW5lIElFRUU4MDIxMV9NRVNIX0hPVVNFS0VFUElOR19JTlRFUlZBTCAoNjAgKiBIWikKKwogI2RlZmluZSBQUF9PRkZTRVQgCTEJCS8qIFBhdGggU2VsZWN0aW9uIFByb3RvY29sICovCiAjZGVmaW5lIFBNX09GRlNFVAk1CQkvKiBQYXRoIFNlbGVjdGlvbiBNZXRyaWMgICAqLwogI2RlZmluZSBDQ19PRkZTRVQJOQkJLyogQ29uZ2VzdGlvbiBDb250cm9sIE1vZGUgKi8KQEAgLTM1LDE5ICszOCwyOCBAQAogCWttZW1fY2FjaGVfZGVzdHJveShybV9jYWNoZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX2hvdXNla2VlcGluZ190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2ggPSAmc2RhdGEtPnUubWVzaDsKKworCWlmbXNoLT5ob3VzZWtlZXBpbmcgPSB0cnVlOworCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmbXNoLT53b3JrKTsKK30KKwogLyoqCiAgKiBtZXNoX21hdGNoZXNfbG9jYWwgLSBjaGVjayBpZiB0aGUgY29uZmlnIG9mIGEgbWVzaCBwb2ludCBtYXRjaGVzIG91cnMKICAqCiAgKiBAaWU6IGluZm9ybWF0aW9uIGVsZW1lbnRzIG9mIGEgbWFuYWdlbWVudCBmcmFtZSBmcm9tIHRoZSBtZXNoIHBlZXIKLSAqIEBkZXY6IGxvY2FsIG1lc2ggaW50ZXJmYWNlCisgKiBAc2RhdGE6IGxvY2FsIG1lc2ggc3ViaWYKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbWVzaCBjb25maWd1cmF0aW9uIG9mIGEgbWVzaCBwb2ludCBtYXRjaGVzIHRoZQogICogbG9jYWwgbWVzaCBjb25maWd1cmF0aW9uLCBpLmUuIGlmIGJvdGggbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIG1lc2ggbmV0d29yay4KICAqLwotYm9vbCBtZXNoX21hdGNoZXNfbG9jYWwoc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmllLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorYm9vbCBtZXNoX21hdGNoZXNfbG9jYWwoc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmllLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKnN0YSA9ICZzZGF0YS0+dS5zdGE7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwogCiAJLyoKIAkgKiBBcyBzdXBwb3J0IGZvciBlYWNoIGZlYXR1cmUgaXMgYWRkZWQsIGNoZWNrIGZvciBtYXRjaGluZwpAQCAtNTksMTEgKzcxLDExIEBACiAJICogICAtIE1EQSBlbmFibGVkCiAJICogLSBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgb24gZmMKIAkgKi8KLQlpZiAoc3RhLT5tZXNoX2lkX2xlbiA9PSBpZS0+bWVzaF9pZF9sZW4gJiYKLQkJbWVtY21wKHN0YS0+bWVzaF9pZCwgaWUtPm1lc2hfaWQsIGllLT5tZXNoX2lkX2xlbikgPT0gMCAmJgotCQltZW1jbXAoc3RhLT5tZXNoX3BwX2lkLCBpZS0+bWVzaF9jb25maWcgKyBQUF9PRkZTRVQsIDQpID09IDAgJiYKLQkJbWVtY21wKHN0YS0+bWVzaF9wbV9pZCwgaWUtPm1lc2hfY29uZmlnICsgUE1fT0ZGU0VULCA0KSA9PSAwICYmCi0JCW1lbWNtcChzdGEtPm1lc2hfY2NfaWQsIGllLT5tZXNoX2NvbmZpZyArIENDX09GRlNFVCwgNCkgPT0gMCkKKwlpZiAoaWZtc2gtPm1lc2hfaWRfbGVuID09IGllLT5tZXNoX2lkX2xlbiAmJgorCQltZW1jbXAoaWZtc2gtPm1lc2hfaWQsIGllLT5tZXNoX2lkLCBpZS0+bWVzaF9pZF9sZW4pID09IDAgJiYKKwkJbWVtY21wKGlmbXNoLT5tZXNoX3BwX2lkLCBpZS0+bWVzaF9jb25maWcgKyBQUF9PRkZTRVQsIDQpID09IDAgJiYKKwkJbWVtY21wKGlmbXNoLT5tZXNoX3BtX2lkLCBpZS0+bWVzaF9jb25maWcgKyBQTV9PRkZTRVQsIDQpID09IDAgJiYKKwkJbWVtY21wKGlmbXNoLT5tZXNoX2NjX2lkLCBpZS0+bWVzaF9jb25maWcgKyBDQ19PRkZTRVQsIDQpID09IDApCiAJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGZhbHNlOwpAQCAtNzMsMTAgKzg1LDggQEAKICAqIG1lc2hfcGVlcl9hY2NlcHRzX3BsaW5rcyAtIGNoZWNrIGlmIGFuIG1wIGlzIHdpbGxpbmcgdG8gZXN0YWJsaXNoIHBlZXIgbGlua3MKICAqCiAgKiBAaWU6IGluZm9ybWF0aW9uIGVsZW1lbnRzIG9mIGEgbWFuYWdlbWVudCBmcmFtZSBmcm9tIHRoZSBtZXNoIHBlZXIKLSAqIEBkZXY6IGxvY2FsIG1lc2ggaW50ZXJmYWNlCiAgKi8KLWJvb2wgbWVzaF9wZWVyX2FjY2VwdHNfcGxpbmtzKHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICppZSwKLQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitib29sIG1lc2hfcGVlcl9hY2NlcHRzX3BsaW5rcyhzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqaWUpCiB7CiAJcmV0dXJuICgqKGllLT5tZXNoX2NvbmZpZyArIENBUEFCX09GRlNFVCkgJiBBQ0NFUFRfUExJTktTKSAhPSAwOwogfQpAQCAtOTgsMTEgKzEwOCwxMSBAQAogCSAqLwogCWZyZWVfcGxpbmtzID0gbWVzaF9wbGlua19hdmFpbGFibGVzKHNkYXRhKTsKIAotCWlmIChmcmVlX3BsaW5rcyAhPSBzZGF0YS0+dS5zdGEuYWNjZXB0aW5nX3BsaW5rcykKLQkJaWVlZTgwMjExX3N0YV90aW1lcigodW5zaWduZWQgbG9uZykgc2RhdGEpOworCWlmIChmcmVlX3BsaW5rcyAhPSBzZGF0YS0+dS5tZXNoLmFjY2VwdGluZ19wbGlua3MpCisJCWllZWU4MDIxMV9tZXNoX2hvdXNla2VlcGluZ190aW1lcigodW5zaWduZWQgbG9uZykgc2RhdGEpOwogfQogCi12b2lkIG1lc2hfaWRzX3NldF9kZWZhdWx0KHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICpzdGEpCit2b2lkIG1lc2hfaWRzX3NldF9kZWZhdWx0KHN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqc3RhKQogewogCXU4IGRlZl9pZFs0XSA9IHsweDAwLCAweDBGLCAweEFDLCAweGZmfTsKIApAQCAtMTExLDI4ICsxMjEsMjYgQEAKIAltZW1jcHkoc3RhLT5tZXNoX2NjX2lkLCBkZWZfaWQsIDQpOwogfQogCi1pbnQgbWVzaF9ybWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IG1lc2hfcm1jX2luaXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCWludCBpOwogCi0Jc2RhdGEtPnUuc3RhLnJtYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZXNoX3JtYyksIEdGUF9LRVJORUwpOwotCWlmICghc2RhdGEtPnUuc3RhLnJtYykKKwlzZGF0YS0+dS5tZXNoLnJtYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZXNoX3JtYyksIEdGUF9LRVJORUwpOworCWlmICghc2RhdGEtPnUubWVzaC5ybWMpCiAJCXJldHVybiAtRU5PTUVNOwotCXNkYXRhLT51LnN0YS5ybWMtPmlkeF9tYXNrID0gUk1DX0JVQ0tFVFMgLSAxOworCXNkYXRhLT51Lm1lc2gucm1jLT5pZHhfbWFzayA9IFJNQ19CVUNLRVRTIC0gMTsKIAlmb3IgKGkgPSAwOyBpIDwgUk1DX0JVQ0tFVFM7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJnNkYXRhLT51LnN0YS5ybWMtPmJ1Y2tldFtpXS5saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnNkYXRhLT51Lm1lc2gucm1jLT5idWNrZXRbaV0ubGlzdCk7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWVzaF9ybWNfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBtZXNoX3JtY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgbWVzaF9ybWMgKnJtYyA9IHNkYXRhLT51LnN0YS5ybWM7CisJc3RydWN0IG1lc2hfcm1jICpybWMgPSBzZGF0YS0+dS5tZXNoLnJtYzsKIAlzdHJ1Y3Qgcm1jX2VudHJ5ICpwLCAqbjsKIAlpbnQgaTsKIAotCWlmICghc2RhdGEtPnUuc3RhLnJtYykKKwlpZiAoIXNkYXRhLT51Lm1lc2gucm1jKQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgUk1DX0JVQ0tFVFM7IGkrKykKQEAgLTE0Miw3ICsxNTAsNyBAQAogCQl9CiAKIAlrZnJlZShybWMpOwotCXNkYXRhLT51LnN0YS5ybWMgPSBOVUxMOworCXNkYXRhLT51Lm1lc2gucm1jID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xNTgsMTAgKzE2Niw5IEBACiAgKiBpdC4KICAqLwogaW50IG1lc2hfcm1jX2NoZWNrKHU4ICpzYSwgc3RydWN0IGllZWU4MDIxMXNfaGRyICptZXNoX2hkciwKLQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBtZXNoX3JtYyAqcm1jID0gc2RhdGEtPnUuc3RhLnJtYzsKKwlzdHJ1Y3QgbWVzaF9ybWMgKnJtYyA9IHNkYXRhLT51Lm1lc2gucm1jOwogCXUzMiBzZXFudW0gPSAwOwogCWludCBlbnRyaWVzID0gMDsKIAl1OCBpZHg7CkBAIC0xOTQsMTAgKzIwMSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWVzaF9tZ210X2llc19hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgbWVzaF9tZ210X2llc19hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJdTggKnBvczsKIAlpbnQgbGVuLCBpLCByYXRlOwpAQCAtMjI0LDExICsyMzAsMTEgQEAKIAkJfQogCX0KIAotCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc2RhdGEtPnUuc3RhLm1lc2hfaWRfbGVuKTsKKwlwb3MgPSBza2JfcHV0KHNrYiwgMiArIHNkYXRhLT51Lm1lc2gubWVzaF9pZF9sZW4pOwogCSpwb3MrKyA9IFdMQU5fRUlEX01FU0hfSUQ7Ci0JKnBvcysrID0gc2RhdGEtPnUuc3RhLm1lc2hfaWRfbGVuOwotCWlmIChzZGF0YS0+dS5zdGEubWVzaF9pZF9sZW4pCi0JCW1lbWNweShwb3MsIHNkYXRhLT51LnN0YS5tZXNoX2lkLCBzZGF0YS0+dS5zdGEubWVzaF9pZF9sZW4pOworCSpwb3MrKyA9IHNkYXRhLT51Lm1lc2gubWVzaF9pZF9sZW47CisJaWYgKHNkYXRhLT51Lm1lc2gubWVzaF9pZF9sZW4pCisJCW1lbWNweShwb3MsIHNkYXRhLT51Lm1lc2gubWVzaF9pZCwgc2RhdGEtPnUubWVzaC5tZXNoX2lkX2xlbik7CiAKIAlwb3MgPSBza2JfcHV0KHNrYiwgMjEpOwogCSpwb3MrKyA9IFdMQU5fRUlEX01FU0hfQ09ORklHOwpAQCAtMjM3LDE1ICsyNDMsMTUgQEAKIAkqcG9zKysgPSAxOwogCiAJLyogQWN0aXZlIHBhdGggc2VsZWN0aW9uIHByb3RvY29sIElEICovCi0JbWVtY3B5KHBvcywgc2RhdGEtPnUuc3RhLm1lc2hfcHBfaWQsIDQpOworCW1lbWNweShwb3MsIHNkYXRhLT51Lm1lc2gubWVzaF9wcF9pZCwgNCk7CiAJcG9zICs9IDQ7CiAKIAkvKiBBY3RpdmUgcGF0aCBzZWxlY3Rpb24gbWV0cmljIElEICAgKi8KLQltZW1jcHkocG9zLCBzZGF0YS0+dS5zdGEubWVzaF9wbV9pZCwgNCk7CisJbWVtY3B5KHBvcywgc2RhdGEtPnUubWVzaC5tZXNoX3BtX2lkLCA0KTsKIAlwb3MgKz0gNDsKIAogCS8qIENvbmdlc3Rpb24gY29udHJvbCBtb2RlIGlkZW50aWZpZXIgKi8KLQltZW1jcHkocG9zLCBzZGF0YS0+dS5zdGEubWVzaF9jY19pZCwgNCk7CisJbWVtY3B5KHBvcywgc2RhdGEtPnUubWVzaC5tZXNoX2NjX2lkLCA0KTsKIAlwb3MgKz0gNDsKIAogCS8qIENoYW5uZWwgcHJlY2VkZW5jZToKQEAgLTI1NSwxNyArMjYxLDE3IEBACiAJcG9zICs9IDQ7CiAKIAkvKiBNZXNoIGNhcGFiaWxpdHkgKi8KLQlzZGF0YS0+dS5zdGEuYWNjZXB0aW5nX3BsaW5rcyA9IG1lc2hfcGxpbmtfYXZhaWxhYmxlcyhzZGF0YSk7Ci0JKnBvcysrID0gc2RhdGEtPnUuc3RhLmFjY2VwdGluZ19wbGlua3MgPyBBQ0NFUFRfUExJTktTIDogMHgwMDsKKwlzZGF0YS0+dS5tZXNoLmFjY2VwdGluZ19wbGlua3MgPSBtZXNoX3BsaW5rX2F2YWlsYWJsZXMoc2RhdGEpOworCSpwb3MrKyA9IHNkYXRhLT51Lm1lc2guYWNjZXB0aW5nX3BsaW5rcyA/IEFDQ0VQVF9QTElOS1MgOiAweDAwOwogCSpwb3MrKyA9IDB4MDA7CiAKIAlyZXR1cm47CiB9CiAKLXUzMiBtZXNoX3RhYmxlX2hhc2godTggKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBtZXNoX3RhYmxlICp0YmwpCit1MzIgbWVzaF90YWJsZV9oYXNoKHU4ICphZGRyLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IG1lc2hfdGFibGUgKnRibCkKIHsKIAkvKiBVc2UgbGFzdCBmb3VyIGJ5dGVzIG9mIGh3IGFkZHIgYW5kIGludGVyZmFjZSBpbmRleCBhcyBoYXNoIGluZGV4ICovCi0JcmV0dXJuIGpoYXNoXzJ3b3JkcygqKHUzMiAqKShhZGRyKzIpLCBkZXYtPmlmaW5kZXgsIHRibC0+aGFzaF9ybmQpCisJcmV0dXJuIGpoYXNoXzJ3b3JkcygqKHUzMiAqKShhZGRyKzIpLCBzZGF0YS0+ZGV2LT5pZmluZGV4LCB0YmwtPmhhc2hfcm5kKQogCQkmIHRibC0+aGFzaF9tYXNrOwogfQogCkBAIC0zNDQsMTAgKzM1MCwxMCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KIAkJKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKikgZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KCZzZGF0YS0+d2Rldik7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCi0JcXVldWVfd29yayhsb2NhbC0+aHcud29ya3F1ZXVlLCAmaWZzdGEtPndvcmspOworCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmbXNoLT53b3JrKTsKIH0KIAogc3RydWN0IG1lc2hfdGFibGUgKm1lc2hfdGFibGVfZ3JvdyhzdHJ1Y3QgbWVzaF90YWJsZSAqdGJsKQpAQCAtMzk5LDUwICs0MDUsMjY0IEBACiAJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCW1lc2hoZHItPmZsYWdzID0gMDsKLQltZXNoaGRyLT50dGwgPSBzZGF0YS0+dS5zdGEubXNoY2ZnLmRvdDExTWVzaFRUTDsKLQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHNkYXRhLT51LnN0YS5tZXNoX3NlcW51bSksICZtZXNoaGRyLT5zZXFudW0pOwotCXNkYXRhLT51LnN0YS5tZXNoX3NlcW51bSsrOworCW1lc2hoZHItPnR0bCA9IHNkYXRhLT51Lm1lc2gubXNoY2ZnLmRvdDExTWVzaFRUTDsKKwlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHNkYXRhLT51Lm1lc2gubWVzaF9zZXFudW0pLCAmbWVzaGhkci0+c2VxbnVtKTsKKwlzZGF0YS0+dS5tZXNoLm1lc2hfc2VxbnVtKys7CiAKIAlyZXR1cm4gNjsKIH0KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX21lc2hfaG91c2VrZWVwaW5nKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCkKK3sKKwlib29sIGZyZWVfcGxpbmtzOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ1bm5pbmcgbWVzaCBob3VzZWtlZXBpbmdcbiIsCisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZWVlODAyMTFfc3RhX2V4cGlyZShzZGF0YSwgSUVFRTgwMjExX01FU0hfUEVFUl9JTkFDVElWSVRZX0xJTUlUKTsKKwltZXNoX3BhdGhfZXhwaXJlKHNkYXRhKTsKKworCWZyZWVfcGxpbmtzID0gbWVzaF9wbGlua19hdmFpbGFibGVzKHNkYXRhKTsKKwlpZiAoZnJlZV9wbGlua3MgIT0gc2RhdGEtPnUubWVzaC5hY2NlcHRpbmdfcGxpbmtzKQorCQlpZWVlODAyMTFfaWZfY29uZmlnKHNkYXRhLCBJRUVFODAyMTFfSUZDQ19CRUFDT04pOworCisJaWZtc2gtPmhvdXNla2VlcGluZyA9IGZhbHNlOworCW1vZF90aW1lcigmaWZtc2gtPmhvdXNla2VlcGluZ190aW1lciwKKwkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBJRUVFODAyMTFfTUVTSF9IT1VTRUtFRVBJTkdfSU5URVJWQUwpKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFydF9tZXNoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2ggPSAmc2RhdGEtPnUubWVzaDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKworCWlmbXNoLT5ob3VzZWtlZXBpbmcgPSB0cnVlOworCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmbXNoLT53b3JrKTsKKwlpZWVlODAyMTFfaWZfY29uZmlnKHNkYXRhLCBJRUVFODAyMTFfSUZDQ19CRUFDT04pOworfQorCit2b2lkIGllZWU4MDIxMV9zdG9wX21lc2goc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJZGVsX3RpbWVyX3N5bmMoJnNkYXRhLT51Lm1lc2guaG91c2VrZWVwaW5nX3RpbWVyKTsKKwkvKgorCSAqIElmIHRoZSB0aW1lciBmaXJlZCB3aGlsZSB3ZSB3YWl0ZWQgZm9yIGl0LCBpdCB3aWxsIGhhdmUKKwkgKiByZXF1ZXVlZCB0aGUgd29yay4gTm93IHRoZSB3b3JrIHdpbGwgYmUgcnVubmluZyBhZ2FpbgorCSAqIGJ1dCB3aWxsIG5vdCByZWFybSB0aGUgdGltZXIgYWdhaW4gYmVjYXVzZSBpdCBjaGVja3MKKwkgKiB3aGV0aGVyIHRoZSBpbnRlcmZhY2UgaXMgcnVubmluZywgd2hpY2gsIGF0IHRoaXMgcG9pbnQsCisJICogaXQgbm8gbG9uZ2VyIGlzLgorCSAqLworCWNhbmNlbF93b3JrX3N5bmMoJnNkYXRhLT51Lm1lc2gud29yayk7CisKKwkvKgorCSAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSBpbnRlcmZhY2UgaXMgbWFya2VkIGRvd24uCisJICogQ2FsbCBzeW5jaHJvbml6ZV9yY3UoKSB0byB3YWl0IGZvciB0aGUgUlggcGF0aAorCSAqIHNob3VsZCBpdCBiZSB1c2luZyB0aGUgaW50ZXJmYWNlIGFuZCBlbnF1ZXVpbmcKKwkgKiBmcmFtZXMgYXQgdGhpcyB2ZXJ5IHRpbWUgb24gYW5vdGhlciBDUFUuCisJICovCisJc3luY2hyb25pemVfcmN1KCk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzZGF0YS0+dS5tZXNoLnNrYl9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3J4X2Jjbl9wcmVzcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJdTE2IHN0eXBlLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCisJCQkJCXNpemVfdCBsZW4sCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyBlbGVtczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJdTY0IHN1cHBfcmF0ZXMgPSAwOworCXNpemVfdCBiYXNlbGVuOworCWludCBmcmVxOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IHJ4X3N0YXR1cy0+YmFuZDsKKworCS8qIGlnbm9yZSBQcm9iZVJlc3AgdG8gZm9yZWlnbiBhZGRyZXNzICovCisJaWYgKHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQICYmCisJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihtZ210LT5kYSwgc2RhdGEtPmRldi0+ZGV2X2FkZHIpKQorCQlyZXR1cm47CisKKwliYXNlbGVuID0gKHU4ICopIG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSAtICh1OCAqKSBtZ210OworCWlmIChiYXNlbGVuID4gbGVuKQorCQlyZXR1cm47CisKKwlpZWVlODAyXzExX3BhcnNlX2VsZW1zKG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSwgbGVuIC0gYmFzZWxlbiwKKwkJCSAgICAgICAmZWxlbXMpOworCisJaWYgKGVsZW1zLmRzX3BhcmFtcyAmJiBlbGVtcy5kc19wYXJhbXNfbGVuID09IDEpCisJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koZWxlbXMuZHNfcGFyYW1zWzBdKTsKKwllbHNlCisJCWZyZXEgPSByeF9zdGF0dXMtPmZyZXE7CisKKwljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGxvY2FsLT5ody53aXBoeSwgZnJlcSk7CisKKwlpZiAoIWNoYW5uZWwgfHwgY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKKwkJcmV0dXJuOworCisJaWYgKGVsZW1zLm1lc2hfaWQgJiYgZWxlbXMubWVzaF9jb25maWcgJiYKKwkgICAgbWVzaF9tYXRjaGVzX2xvY2FsKCZlbGVtcywgc2RhdGEpKSB7CisJCXN1cHBfcmF0ZXMgPSBpZWVlODAyMTFfc3RhX2dldF9yYXRlcyhsb2NhbCwgJmVsZW1zLCBiYW5kKTsKKworCQltZXNoX25laWdoYm91cl91cGRhdGUobWdtdC0+c2EsIHN1cHBfcmF0ZXMsIHNkYXRhLAorCQkJCSAgICAgIG1lc2hfcGVlcl9hY2NlcHRzX3BsaW5rcygmZWxlbXMpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3J4X21nbXRfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCQkJICBzaXplX3QgbGVuLAorCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCit7CisJc3dpdGNoIChtZ210LT51LmFjdGlvbi5jYXRlZ29yeSkgeworCWNhc2UgUExJTktfQ0FURUdPUlk6CisJCW1lc2hfcnhfcGxpbmtfZnJhbWUoc2RhdGEsIG1nbXQsIGxlbiwgcnhfc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBNRVNIX1BBVEhfU0VMX0NBVEVHT1JZOgorCQltZXNoX3J4X3BhdGhfc2VsX2ZyYW1lKHNkYXRhLCBtZ210LCBsZW4pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3J4X3F1ZXVlZF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwl1MTYgc3R5cGU7CisKKwlpZm1zaCA9ICZzZGF0YS0+dS5tZXNoOworCisJcnhfc3RhdHVzID0gKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICopIHNrYi0+Y2I7CisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOworCXN0eXBlID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9TVFlQRTsKKworCXN3aXRjaCAoc3R5cGUpIHsKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJaWVlZTgwMjExX21lc2hfcnhfYmNuX3ByZXNwKHNkYXRhLCBzdHlwZSwgbWdtdCwgc2tiLT5sZW4sCisJCQkJCSAgICByeF9zdGF0dXMpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ1RJT046CisJCWllZWU4MDIxMV9tZXNoX3J4X21nbXRfYWN0aW9uKHNkYXRhLCBtZ210LCBza2ItPmxlbiwgcnhfc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUubWVzaC53b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICghbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKGxvY2FsLT5zd19zY2FubmluZyB8fCBsb2NhbC0+aHdfc2Nhbm5pbmcpCisJCXJldHVybjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmlmbXNoLT5za2JfcXVldWUpKSkKKwkJaWVlZTgwMjExX21lc2hfcnhfcXVldWVkX21nbXQoc2RhdGEsIHNrYik7CisKKwlpZiAoaWZtc2gtPnByZXFfcXVldWVfbGVuICYmCisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJICAgICAgIGlmbXNoLT5sYXN0X3ByZXEgKyBtc2Vjc190b19qaWZmaWVzKGlmbXNoLT5tc2hjZmcuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCkpKQorCQltZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHNkYXRhKTsKKworCWlmIChpZm1zaC0+aG91c2VrZWVwaW5nKQorCQlpZWVlODAyMTFfbWVzaF9ob3VzZWtlZXBpbmcoc2RhdGEsIGlmbXNoKTsKK30KKwordm9pZCBpZWVlODAyMTFfbWVzaF9ub3RpZnlfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkKKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpCisJCQlxdWV1ZV93b3JrKGxvY2FsLT5ody53b3JrcXVldWUsICZzZGF0YS0+dS5tZXNoLndvcmspOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCiB2b2lkIGllZWU4MDIxMV9tZXNoX2luaXRfc2RhdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAKLQlpZnN0YS0+bXNoY2ZnLmRvdDExTWVzaFJldHJ5VGltZW91dCA9IE1FU0hfUkVUX1Q7Ci0JaWZzdGEtPm1zaGNmZy5kb3QxMU1lc2hDb25maXJtVGltZW91dCA9IE1FU0hfQ09ORl9UOwotCWlmc3RhLT5tc2hjZmcuZG90MTFNZXNoSG9sZGluZ1RpbWVvdXQgPSBNRVNIX0hPTERfVDsKLQlpZnN0YS0+bXNoY2ZnLmRvdDExTWVzaE1heFJldHJpZXMgPSBNRVNIX01BWF9SRVRSOwotCWlmc3RhLT5tc2hjZmcuZG90MTFNZXNoVFRMID0gTUVTSF9UVEw7Ci0JaWZzdGEtPm1zaGNmZy5hdXRvX29wZW5fcGxpbmtzID0gdHJ1ZTsKLQlpZnN0YS0+bXNoY2ZnLmRvdDExTWVzaE1heFBlZXJMaW5rcyA9CisJSU5JVF9XT1JLKCZpZm1zaC0+d29yaywgaWVlZTgwMjExX21lc2hfd29yayk7CisJc2V0dXBfdGltZXIoJmlmbXNoLT5ob3VzZWtlZXBpbmdfdGltZXIsCisJCSAgICBpZWVlODAyMTFfbWVzaF9ob3VzZWtlZXBpbmdfdGltZXIsCisJCSAgICAodW5zaWduZWQgbG9uZykgc2RhdGEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT51Lm1lc2guc2tiX3F1ZXVlKTsKKworCWlmbXNoLT5tc2hjZmcuZG90MTFNZXNoUmV0cnlUaW1lb3V0ID0gTUVTSF9SRVRfVDsKKwlpZm1zaC0+bXNoY2ZnLmRvdDExTWVzaENvbmZpcm1UaW1lb3V0ID0gTUVTSF9DT05GX1Q7CisJaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hIb2xkaW5nVGltZW91dCA9IE1FU0hfSE9MRF9UOworCWlmbXNoLT5tc2hjZmcuZG90MTFNZXNoTWF4UmV0cmllcyA9IE1FU0hfTUFYX1JFVFI7CisJaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hUVEwgPSBNRVNIX1RUTDsKKwlpZm1zaC0+bXNoY2ZnLmF1dG9fb3Blbl9wbGlua3MgPSB0cnVlOworCWlmbXNoLT5tc2hjZmcuZG90MTFNZXNoTWF4UGVlckxpbmtzID0KIAkJTUVTSF9NQVhfRVNUQUJfUExJTktTOwotCWlmc3RhLT5tc2hjZmcuZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0ID0KKwlpZm1zaC0+bXNoY2ZnLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCA9CiAJCU1FU0hfUEFUSF9USU1FT1VUOwotCWlmc3RhLT5tc2hjZmcuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCA9CisJaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsID0KIAkJTUVTSF9QUkVRX01JTl9JTlQ7Ci0JaWZzdGEtPm1zaGNmZy5kb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lID0KKwlpZm1zaC0+bXNoY2ZnLmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUgPQogCQlNRVNIX0RJQU1fVFJBVkVSU0FMX1RJTUU7Ci0JaWZzdGEtPm1zaGNmZy5kb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMgPQorCWlmbXNoLT5tc2hjZmcuZG90MTFNZXNoSFdNUG1heFBSRVFyZXRyaWVzID0KIAkJTUVTSF9NQVhfUFJFUV9SRVRSSUVTOwotCWlmc3RhLT5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUgPQorCWlmbXNoLT5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUgPQogCQlNRVNIX1BBVEhfUkVGUkVTSF9USU1FOwotCWlmc3RhLT5tc2hjZmcubWluX2Rpc2NvdmVyeV90aW1lb3V0ID0KKwlpZm1zaC0+bXNoY2ZnLm1pbl9kaXNjb3ZlcnlfdGltZW91dCA9CiAJCU1FU0hfTUlOX0RJU0NPVkVSWV9USU1FT1VUOwotCWlmc3RhLT5hY2NlcHRpbmdfcGxpbmtzID0gdHJ1ZTsKLQlpZnN0YS0+cHJlcV9pZCA9IDA7Ci0JaWZzdGEtPmRzbiA9IDA7Ci0JYXRvbWljX3NldCgmaWZzdGEtPm1wYXRocywgMCk7Ci0JbWVzaF9ybWNfaW5pdChzZGF0YS0+ZGV2KTsKLQlpZnN0YS0+bGFzdF9wcmVxID0gamlmZmllczsKKwlpZm1zaC0+YWNjZXB0aW5nX3BsaW5rcyA9IHRydWU7CisJaWZtc2gtPnByZXFfaWQgPSAwOworCWlmbXNoLT5kc24gPSAwOworCWF0b21pY19zZXQoJmlmbXNoLT5tcGF0aHMsIDApOworCW1lc2hfcm1jX2luaXQoc2RhdGEpOworCWlmbXNoLT5sYXN0X3ByZXEgPSBqaWZmaWVzOwogCS8qIEFsbG9jYXRlIGFsbCBtZXNoIHN0cnVjdHVyZXMgd2hlbiBjcmVhdGluZyB0aGUgZmlyc3QgbWVzaCBpbnRlcmZhY2UuICovCiAJaWYgKCFtZXNoX2FsbG9jYXRlZCkKIAkJaWVlZTgwMjExc19pbml0KCk7Ci0JbWVzaF9pZHNfc2V0X2RlZmF1bHQoaWZzdGEpOwotCXNldHVwX3RpbWVyKCZpZnN0YS0+bWVzaF9wYXRoX3RpbWVyLAorCW1lc2hfaWRzX3NldF9kZWZhdWx0KGlmbXNoKTsKKwlzZXR1cF90aW1lcigmaWZtc2gtPm1lc2hfcGF0aF90aW1lciwKIAkJICAgIGllZWU4MDIxMV9tZXNoX3BhdGhfdGltZXIsCiAJCSAgICAodW5zaWduZWQgbG9uZykgc2RhdGEpOwotCUlOSVRfTElTVF9IRUFEKCZpZnN0YS0+cHJlcV9xdWV1ZS5saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmaWZzdGEtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaWZtc2gtPnByZXFfcXVldWUubGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmlmbXNoLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7Cit9CisKK2llZWU4MDIxMV9yeF9yZXN1bHQKK2llZWU4MDIxMV9tZXNoX3J4X21nbXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCAqaWZtc2ggPSAmc2RhdGEtPnUubWVzaDsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJdTE2IGZjOworCisJaWYgKHNrYi0+bGVuIDwgMjQpCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShtZ210LT5mcmFtZV9jb250cm9sKTsKKworCXN3aXRjaCAoZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgeworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDVElPTjoKKwkJbWVtY3B5KHNrYi0+Y2IsIHJ4X3N0YXR1cywgc2l6ZW9mKCpyeF9zdGF0dXMpKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmlmbXNoLT5za2JfcXVldWUsIHNrYik7CisJCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmbXNoLT53b3JrKTsKKwkJcmV0dXJuIFJYX1FVRVVFRDsKKwl9CisKKwlyZXR1cm4gUlhfQ09OVElOVUU7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5oIGIvbmV0L21hYzgwMjExL21lc2guaAppbmRleCA3NDk1ZmJiLi5lMTA0NzFjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5oCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIHN0cnVjdCBtZXNoX3BhdGggLSBtYWM4MDIxMSBtZXNoIHBhdGggc3RydWN0dXJlCiAgKgogICogQGRzdDogbWVzaCBwYXRoIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzCi0gKiBAZGV2OiBtZXNoIHBhdGggZGV2aWNlCisgKiBAc2RhdGE6IG1lc2ggc3ViaWYKICAqIEBuZXh0X2hvcDogbWVzaCBuZWlnaGJvciB0byB3aGljaCBmcmFtZXMgZm9yIHRoaXMgZGVzdGluYXRpb24gd2lsbCBiZQogICogCWZvcndhcmRlZAogICogQHRpbWVyOiBtZXNoIHBhdGggZGlzY292ZXJ5IHRpbWVyCkBAIC02NCwxNCArNjQsMTUgQEAKICAqIEBzdGF0ZV9sb2NrOiBtZXNoIHBhdCBzdGF0ZSBsb2NrCiAgKgogICoKLSAqIFRoZSBjb21iaW5hdGlvbiBvZiBkc3QgYW5kIGRldiBpcyB1bmlxdWUgaW4gdGhlIG1lc2ggcGF0aCB0YWJsZS4gU2luY2UgdGhlCisgKiBUaGUgY29tYmluYXRpb24gb2YgZHN0IGFuZCBzZGF0YSBpcyB1bmlxdWUgaW4gdGhlIG1lc2ggcGF0aCB0YWJsZS4gU2luY2UgdGhlCiAgKiBuZXh0X2hvcCBTVEEgaXMgb25seSBwcm90ZWN0ZWQgYnkgUkNVIGFzIHdlbGwsIGRlbGV0aW5nIHRoZSBTVEEgbXVzdCBhbHNvCiAgKiByZW1vdmUvc3Vic3RpdHV0ZSB0aGUgbWVzaF9wYXRoIHN0cnVjdHVyZSBhbmQgd2FpdCB1bnRpbCB0aGF0IGlzIG5vIGxvbmdlcgogICogcmVhY2hhYmxlIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBTVEEgY29tcGxldGVseS4KICAqLwogc3RydWN0IG1lc2hfcGF0aCB7CiAJdTggZHN0W0VUSF9BTEVOXTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXU4IG1wcFtFVEhfQUxFTl07CS8qIHVzZWQgZm9yIE1QUCBvciBNQVAgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXN0cnVjdCBza19idWZmX2hlYWQgZnJhbWVfcXVldWU7CkBAIC0yMDMsNjcgKzIwNCw4MiBAQAogaW50IGllZWU4MDIxMV9uZXdfbWVzaF9oZWFkZXIoc3RydWN0IGllZWU4MDIxMXNfaGRyICptZXNoaGRyLAogCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiBpbnQgbWVzaF9ybWNfY2hlY2sodTggKmFkZHIsIHN0cnVjdCBpZWVlODAyMTFzX2hkciAqbWVzaF9oZHIsCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotYm9vbCBtZXNoX21hdGNoZXNfbG9jYWwoc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmllLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgbWVzaF9pZHNfc2V0X2RlZmF1bHQoc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKnN0YSk7Ci12b2lkIG1lc2hfbWdtdF9pZXNfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBtZXNoX3JtY19mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IG1lc2hfcm1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK2Jvb2wgbWVzaF9tYXRjaGVzX2xvY2FsKHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICppZSwKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwordm9pZCBtZXNoX2lkc19zZXRfZGVmYXVsdChzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKm1lc2gpOwordm9pZCBtZXNoX21nbXRfaWVzX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIG1lc2hfcm1jX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfcm1jX2luaXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFzX2luaXQodm9pZCk7CiB2b2lkIGllZWU4MDIxMXNfc3RvcCh2b2lkKTsKIHZvaWQgaWVlZTgwMjExX21lc2hfaW5pdF9zZGF0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CitpZWVlODAyMTFfcnhfcmVzdWx0CitpZWVlODAyMTFfbWVzaF9yeF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyk7Cit2b2lkIGllZWU4MDIxMV9zdGFydF9tZXNoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3ZvaWQgaWVlZTgwMjExX3N0b3BfbWVzaChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiAKIC8qIE1lc2ggcGF0aHMgKi8KLWludCBtZXNoX25leHRob3BfbG9va3VwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RydWN0IG1lc2hfcGF0aCAqbWVzaF9wYXRoX2xvb2t1cCh1OCAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXBfYnlfaWR4KGludCBpZHgsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwordm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3N0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXAodTggKmRzdCwKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworc3RydWN0IG1lc2hfcGF0aCAqbXBwX3BhdGhfbG9va3VwKHU4ICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CitpbnQgbXBwX3BhdGhfYWRkKHU4ICpkc3QsIHU4ICptcHAsIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKK3N0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXBfYnlfaWR4KGludCBpZHgsCisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgbWVzaF9wYXRoX2ZpeF9uZXh0aG9wKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoLCBzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wKTsKLXZvaWQgbWVzaF9wYXRoX2V4cGlyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgbWVzaF9wYXRoX2ZsdXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBtZXNoX3J4X3BhdGhfc2VsX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKLQkJc2l6ZV90IGxlbik7Ci1pbnQgbWVzaF9wYXRoX2FkZCh1OCAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgbWVzaF9wYXRoX2V4cGlyZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIG1lc2hfcGF0aF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIG1lc2hfcnhfcGF0aF9zZWxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbik7CitpbnQgbWVzaF9wYXRoX2FkZCh1OCAqZHN0LCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiAvKiBNZXNoIHBsaW5rcyAqLwotdm9pZCBtZXNoX25laWdoYm91cl91cGRhdGUodTggKmh3X2FkZHIsIHU2NCByYXRlcywgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJYm9vbCBhZGQpOwotYm9vbCBtZXNoX3BlZXJfYWNjZXB0c19wbGlua3Moc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmllLAotCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIG1lc2hfbmVpZ2hib3VyX3VwZGF0ZSh1OCAqaHdfYWRkciwgdTY0IHJhdGVzLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgYm9vbCBhZGQpOworYm9vbCBtZXNoX3BlZXJfYWNjZXB0c19wbGlua3Moc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmllKTsKIHZvaWQgbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIG1lc2hfcGxpbmtfYnJva2VuKHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIHZvaWQgbWVzaF9wbGlua19kZWFjdGl2YXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIGludCBtZXNoX3BsaW5rX29wZW4oc3RydWN0IHN0YV9pbmZvICpzdGEpOwogaW50IG1lc2hfcGxpbmtfY2xvc2Uoc3RydWN0IHN0YV9pbmZvICpzdGEpOwogdm9pZCBtZXNoX3BsaW5rX2Jsb2NrKHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKLXZvaWQgbWVzaF9yeF9wbGlua19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCi0JCQkgc2l6ZV90IGxlbiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyk7Cit2b2lkIG1lc2hfcnhfcGxpbmtfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCBzaXplX3QgbGVuLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpOwogCiAvKiBQcml2YXRlIGludGVyZmFjZXMgKi8KIC8qIE1lc2ggdGFibGVzICovCiBzdHJ1Y3QgbWVzaF90YWJsZSAqbWVzaF90YWJsZV9hbGxvYyhpbnQgc2l6ZV9vcmRlcik7CiB2b2lkIG1lc2hfdGFibGVfZnJlZShzdHJ1Y3QgbWVzaF90YWJsZSAqdGJsLCBib29sIGZyZWVfbGVhZnMpOwogc3RydWN0IG1lc2hfdGFibGUgKm1lc2hfdGFibGVfZ3JvdyhzdHJ1Y3QgbWVzaF90YWJsZSAqdGJsKTsKLXUzMiBtZXNoX3RhYmxlX2hhc2godTggKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBtZXNoX3RhYmxlICp0YmwpOwordTMyIG1lc2hfdGFibGVfaGFzaCh1OCAqYWRkciwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCXN0cnVjdCBtZXNoX3RhYmxlICp0YmwpOwogLyogTWVzaCBwYXRocyAqLwogaW50IG1lc2hfcGF0aF9lcnJvcl90eCh1OCAqZGVzdCwgX19sZTMyIGRlc3RfZHNuLCB1OCAqcmEsCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIG1lc2hfcGF0aF9hc3NpZ25fbmV4dGhvcChzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCwgc3RydWN0IHN0YV9pbmZvICpzdGEpOwogdm9pZCBtZXNoX3BhdGhfZmx1c2hfcGVuZGluZyhzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCk7CiB2b2lkIG1lc2hfcGF0aF90eF9wZW5kaW5nKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKTsKIGludCBtZXNoX3BhdGh0YmxfaW5pdCh2b2lkKTsKIHZvaWQgbWVzaF9wYXRodGJsX3VucmVnaXN0ZXIodm9pZCk7Ci1pbnQgbWVzaF9wYXRoX2RlbCh1OCAqYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgbWVzaF9wYXRoX2RlbCh1OCAqYWRkciwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBtZXNoX3BhdGhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIHZvaWQgbWVzaF9wYXRoX2ZsdXNoX2J5X25leHRob3Aoc3RydWN0IHN0YV9pbmZvICpzdGEpOwotdm9pZCBtZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgbWVzaF9wYXRoX2Rpc2NhcmRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIGV4dGVybiBpbnQgbWVzaF9hbGxvY2F0ZWQ7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1lc2hfcGxpbmtfZnJlZV9jb3VudChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlyZXR1cm4gc2RhdGEtPnUuc3RhLm1zaGNmZy5kb3QxMU1lc2hNYXhQZWVyTGlua3MgLQotCSAgICAgICBhdG9taWNfcmVhZCgmc2RhdGEtPnUuc3RhLm1zaHN0YXRzLmVzdGFiX3BsaW5rcyk7CisJcmV0dXJuIHNkYXRhLT51Lm1lc2gubXNoY2ZnLmRvdDExTWVzaE1heFBlZXJMaW5rcyAtCisJICAgICAgIGF0b21pY19yZWFkKCZzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmVzdGFiX3BsaW5rcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBtZXNoX3BsaW5rX2F2YWlsYWJsZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCkBAIC0yODEsOCArMjk3LDEyIEBACiAJZm9yIChpID0gMDsgaSA8PSB4LT5oYXNoX21hc2s7IGkrKykgXAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uobm9kZSwgcCwgJngtPmhhc2hfYnVja2V0c1tpXSwgbGlzdCkKIAordm9pZCBpZWVlODAyMTFfbWVzaF9ub3RpZnlfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOworCiAjZWxzZQogI2RlZmluZSBtZXNoX2FsbG9jYXRlZAkwCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9tZXNoX25vdGlmeV9zY2FuX2NvbXBsZXRlZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkge30KICNlbmRpZgogCiAjZW5kaWYgLyogSUVFRTgwMjExU19IICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKaW5kZXggMDhhY2E0NC4uNTAxYzc4MyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwpAQCAtNjQsMTQgKzY0LDE0IEBACiAjZGVmaW5lIERTTl9MVCh4LCB5KSAoKGxvbmcpICh4KSAtIChsb25nKSAoeSkgPCAwKQogCiAjZGVmaW5lIG5ldF90cmF2ZXJzYWxfamlmZmllcyhzKSBcCi0JbXNlY3NfdG9famlmZmllcyhzLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSkKKwltc2Vjc190b19qaWZmaWVzKHMtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSkKICNkZWZpbmUgZGVmYXVsdF9saWZldGltZShzKSBcCi0JTVNFQ19UT19UVShzLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KQorCU1TRUNfVE9fVFUocy0+dS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRpbWVvdXQpCiAjZGVmaW5lIG1pbl9wcmVxX2ludF9qaWZmKHMpIFwKLQkobXNlY3NfdG9famlmZmllcyhzLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCkpCi0jZGVmaW5lIG1heF9wcmVxX3JldHJpZXMocykgKHMtPnUuc3RhLm1zaGNmZy5kb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMpCisJKG1zZWNzX3RvX2ppZmZpZXMocy0+dS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsKSkKKyNkZWZpbmUgbWF4X3ByZXFfcmV0cmllcyhzKSAocy0+dS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMpCiAjZGVmaW5lIGRpc2NfdGltZW91dF9qaWZmKHMpIFwKLQltc2Vjc190b19qaWZmaWVzKHNkYXRhLT51LnN0YS5tc2hjZmcubWluX2Rpc2NvdmVyeV90aW1lb3V0KQorCW1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcubWluX2Rpc2NvdmVyeV90aW1lb3V0KQogCiBlbnVtIG1wYXRoX2ZyYW1lX3R5cGUgewogCU1QQVRIX1BSRVEgPSAwLApAQCAtODIsOSArODIsOSBAQAogc3RhdGljIGludCBtZXNoX3BhdGhfc2VsX2ZyYW1lX3R4KGVudW0gbXBhdGhfZnJhbWVfdHlwZSBhY3Rpb24sIHU4IGZsYWdzLAogCQl1OCAqb3JpZ19hZGRyLCBfX2xlMzIgb3JpZ19kc24sIHU4IGRzdF9mbGFncywgdTggKmRzdCwKIAkJX19sZTMyIGRzdF9kc24sIHU4ICpkYSwgdTggaG9wX2NvdW50LCB1OCB0dGwsIF9fbGUzMiBsaWZldGltZSwKLQkJX19sZTMyIG1ldHJpYywgX19sZTMyIHByZXFfaWQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisJCV9fbGUzMiBtZXRyaWMsIF9fbGUzMiBwcmVxX2lkLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCk7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXU4ICpwb3M7CkBAIC05OSwxMSArOTksMTEgQEAKIAltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKQogCQlza2JfcHV0KHNrYiwgMjUgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbikpOwogCW1lbXNldChtZ210LCAwLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSk7Ci0JbWdtdC0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJICAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CisJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKIAogCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobWdtdC0+c2EsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJLyogQlNTSUQgaXMgbGVmdCB6ZXJvZWQsIHdpbGRjYXJkIHZhbHVlICovCiAJbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBNRVNIX1BBVEhfU0VMX0NBVEVHT1JZOwogCW1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24uYWN0aW9uX2NvZGUgPSBhY3Rpb247CkBAIC0xNDksNyArMTQ5LDcgQEAKIAlwb3MgKz0gRVRIX0FMRU47CiAJbWVtY3B5KHBvcywgJmRzdF9kc24sIDQpOwogCi0JaWVlZTgwMjExX3N0YV90eChkZXYsIHNrYiwgMCk7CisJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYxLDkgKzE2MSw5IEBACiAgKiBAcmE6IG5vZGUgdGhpcyBmcmFtZSBpcyBhZGRyZXNzZWQgdG8KICAqLwogaW50IG1lc2hfcGF0aF9lcnJvcl90eCh1OCAqZHN0LCBfX2xlMzIgZHN0X2RzbiwgdTggKnJhLAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCk7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXU4ICpwb3M7CkBAIC0xNzgsMTEgKzE3OCwxMSBAQAogCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopCiAJCXNrYl9wdXQoc2tiLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSk7CiAJbWVtc2V0KG1nbXQsIDAsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24pKTsKLQltZ210LT5mcmFtZV9jb250cm9sID0gSUVFRTgwMjExX0ZDKElFRUU4MDIxMV9GVFlQRV9NR01ULAotCQkJCQkgICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKKwltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwogCiAJbWVtY3B5KG1nbXQtPmRhLCByYSwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAkvKiBCU1NJRCBpcyBsZWZ0IHplcm9lZCwgd2lsZGNhcmQgdmFsdWUgKi8KIAltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IE1FU0hfUEFUSF9TRUxfQ0FURUdPUlk7CiAJbWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbi5hY3Rpb25fY29kZSA9IE1QQVRIX1BFUlI7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAlwb3MgKz0gRVRIX0FMRU47CiAJbWVtY3B5KHBvcywgJmRzdF9kc24sIDQpOwogCi0JaWVlZTgwMjExX3N0YV90eChkZXYsIHNrYiwgMCk7CisJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIzLDcgKzIyMyw3IEBACiAJLyogYml0cmF0ZSBpcyBpbiB1bml0cyBvZiAxMDAgS2Jwcywgd2hpbGUgd2UgbmVlZCByYXRlIGluIHVuaXRzIG9mCiAJICogMU1icHMuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgb24gdHhfdGltZSBjb21wdXRhdGlvbi4KIAkgKi8KLQlyYXRlID0gc2JhbmQtPmJpdHJhdGVzW3N0YS0+dHhyYXRlX2lkeF0uYml0cmF0ZTsKKwlyYXRlID0gc2JhbmQtPmJpdHJhdGVzW3N0YS0+bGFzdF90eHJhdGVfaWR4XS5iaXRyYXRlOwogCXR4X3RpbWUgPSAoZGV2aWNlX2NvbnN0YW50ICsgMTAgKiB0ZXN0X2ZyYW1lX2xlbiAvIHJhdGUpOwogCWVzdGltYXRlZF9yZXR4ID0gKCgxIDw8ICgyICogQVJJVEhfU0hJRlQpKSAvIChzX3VuaXQgLSBlcnIpKTsKIAlyZXN1bHQgPSAodHhfdGltZSAqIGVzdGltYXRlZF9yZXR4KSA+PiAoMiAqIEFSSVRIX1NISUZUKSA7CkBAIC0yMzMsNyArMjMzLDcgQEAKIC8qKgogICogaHdtcF9yb3V0ZV9pbmZvX2dldCAtIFVwZGF0ZSByb3V0aW5nIGluZm8gdG8gb3JpZ2luYXRvciBhbmQgdHJhbnNtaXR0ZXIKICAqCi0gKiBAZGV2OiBsb2NhbCBtZXNoIGludGVyZmFjZQorICogQHNkYXRhOiBsb2NhbCBtZXNoIHN1YmlmCiAgKiBAbWdtdDogbWVzaCBtYW5hZ2VtZW50IGZyYW1lCiAgKiBAaHdtcF9pZTogaHdtcCBpbmZvcm1hdGlvbiBlbGVtZW50IChQUkVQIG9yIFBSRVEpCiAgKgpAQCAtMjQ2LDExICsyNDYsMTEgQEAKICAqIE5vdGVzOiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBvbmx5IHBsYWNlIChiZXNpZGVzIHVzZXItcHJvdmlkZWQgaW5mbykgd2hlcmUKICAqIHBhdGggcm91dGluZyBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkLgogICovCi1zdGF0aWMgdTMyIGh3bXBfcm91dGVfaW5mb19nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB1MzIgaHdtcF9yb3V0ZV9pbmZvX2dldChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkgICAgdTggKmh3bXBfaWUpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlib29sIGZyZXNoX2luZm87CkBAIC0zMDEsMTQgKzMwMSwxNCBAQAogCQluZXdfbWV0cmljID0gTUFYX01FVFJJQzsKIAlleHBfdGltZSA9IFRVX1RPX0VYUF9USU1FKG9yaWdfbGlmZXRpbWUpOwogCi0JaWYgKG1lbWNtcChvcmlnX2FkZHIsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJaWYgKG1lbWNtcChvcmlnX2FkZHIsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgewogCQkvKiBUaGlzIE1QIGlzIHRoZSBvcmlnaW5hdG9yLCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcwogCQkgKiBmcmFtZSwgZXhjZXB0IGZvciB1cGRhdGluZyB0cmFuc21pdHRlcidzIHBhdGggaW5mby4KIAkJICovCiAJCXByb2Nlc3MgPSBmYWxzZTsKIAkJZnJlc2hfaW5mbyA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChvcmlnX2FkZHIsIGRldik7CisJCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChvcmlnX2FkZHIsIHNkYXRhKTsKIAkJaWYgKG1wYXRoKSB7CiAJCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAkJCWlmIChtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpCkBAIC0zMjQsOCArMzI0LDggQEAKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQltZXNoX3BhdGhfYWRkKG9yaWdfYWRkciwgZGV2KTsKLQkJCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChvcmlnX2FkZHIsIGRldik7CisJCQltZXNoX3BhdGhfYWRkKG9yaWdfYWRkciwgc2RhdGEpOworCQkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKG9yaWdfYWRkciwgc2RhdGEpOwogCQkJaWYgKCFtcGF0aCkgewogCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCXJldHVybiAwOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJZWxzZSB7CiAJCWZyZXNoX2luZm8gPSB0cnVlOwogCi0JCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cCh0YSwgZGV2KTsKKwkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhLCBzZGF0YSk7CiAJCWlmIChtcGF0aCkgewogCQkJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCQlpZiAoKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9GSVhFRCkgfHwKQEAgLTM2NSw4ICszNjUsOCBAQAogCQkJCQkobGFzdF9ob3BfbWV0cmljID4gbXBhdGgtPm1ldHJpYykpKQogCQkJCWZyZXNoX2luZm8gPSBmYWxzZTsKIAkJfSBlbHNlIHsKLQkJCW1lc2hfcGF0aF9hZGQodGEsIGRldik7Ci0JCQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGEsIGRldik7CisJCQltZXNoX3BhdGhfYWRkKHRhLCBzZGF0YSk7CisJCQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGEsIHNkYXRhKTsKIAkJCWlmICghbXBhdGgpIHsKIAkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTM5MiwxMSArMzkyLDEwIEBACiAJcmV0dXJuIHByb2Nlc3MgPyBuZXdfbWV0cmljIDogMDsKIH0KIAotc3RhdGljIHZvaWQgaHdtcF9wcmVxX2ZyYW1lX3Byb2Nlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGh3bXBfcHJlcV9mcmFtZV9wcm9jZXNzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkJICAgIHU4ICpwcmVxX2VsZW0sIHUzMiBtZXRyaWMpIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAJdTggKmRzdF9hZGRyLCAqb3JpZ19hZGRyOwogCXU4IGRzdF9mbGFncywgdHRsOwpAQCAtNDExLDE5ICs0MTAsMTkgQEAKIAlvcmlnX2RzbiA9IFBSRVFfSUVfT1JJR19EU04ocHJlcV9lbGVtKTsKIAlkc3RfZmxhZ3MgPSBQUkVRX0lFX0RTVF9GKHByZXFfZWxlbSk7CiAKLQlpZiAobWVtY21wKGRzdF9hZGRyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCWlmIChtZW1jbXAoZHN0X2FkZHIsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgewogCQlmb3J3YXJkID0gZmFsc2U7CiAJCXJlcGx5ID0gdHJ1ZTsKIAkJbWV0cmljID0gMDsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgaWZzdGEtPmxhc3RfZHNuX3VwZGF0ZSArCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmbXNoLT5sYXN0X2Rzbl91cGRhdGUgKwogCQkJCQluZXRfdHJhdmVyc2FsX2ppZmZpZXMoc2RhdGEpKSB8fAotCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywgaWZzdGEtPmxhc3RfZHNuX3VwZGF0ZSkpIHsKLQkJCWRzdF9kc24gPSArK2lmc3RhLT5kc247Ci0JCQlpZnN0YS0+bGFzdF9kc25fdXBkYXRlID0gamlmZmllczsKKwkJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGlmbXNoLT5sYXN0X2Rzbl91cGRhdGUpKSB7CisJCQlkc3RfZHNuID0gKytpZm1zaC0+ZHNuOworCQkJaWZtc2gtPmxhc3RfZHNuX3VwZGF0ZSA9IGppZmZpZXM7CiAJCX0KIAl9IGVsc2UgewogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3RfYWRkciwgZGV2KTsKKwkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdF9hZGRyLCBzZGF0YSk7CiAJCWlmIChtcGF0aCkgewogCQkJaWYgKCghKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9EU05fVkFMSUQpKSB8fAogCQkJCQlEU05fTFQobXBhdGgtPmRzbiwgZHN0X2RzbikpIHsKQEAgLTQ0NSwxNSArNDQ0LDE1IEBACiAKIAlpZiAocmVwbHkpIHsKIAkJbGlmZXRpbWUgPSBQUkVRX0lFX0xJRkVUSU1FKHByZXFfZWxlbSk7Ci0JCXR0bCA9IGlmc3RhLT5tc2hjZmcuZG90MTFNZXNoVFRMOworCQl0dGwgPSBpZm1zaC0+bXNoY2ZnLmRvdDExTWVzaFRUTDsKIAkJaWYgKHR0bCAhPSAwKQogCQkJbWVzaF9wYXRoX3NlbF9mcmFtZV90eChNUEFUSF9QUkVQLCAwLCBkc3RfYWRkciwKIAkJCQljcHVfdG9fbGUzMihkc3RfZHNuKSwgMCwgb3JpZ19hZGRyLAogCQkJCWNwdV90b19sZTMyKG9yaWdfZHNuKSwgbWdtdC0+c2EsIDAsIHR0bCwKIAkJCQljcHVfdG9fbGUzMihsaWZldGltZSksIGNwdV90b19sZTMyKG1ldHJpYyksCi0JCQkJMCwgZGV2KTsKKwkJCQkwLCBzZGF0YSk7CiAJCWVsc2UKLQkJCWlmc3RhLT5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc190dGwrKzsKKwkJCWlmbXNoLT5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc190dGwrKzsKIAl9CiAKIAlpZiAoZm9yd2FyZCkgewpAQCAtNDYzLDcgKzQ2Miw3IEBACiAJCXR0bCA9IFBSRVFfSUVfVFRMKHByZXFfZWxlbSk7CiAJCWxpZmV0aW1lID0gUFJFUV9JRV9MSUZFVElNRShwcmVxX2VsZW0pOwogCQlpZiAodHRsIDw9IDEpIHsKLQkJCWlmc3RhLT5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc190dGwrKzsKKwkJCWlmbXNoLT5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc190dGwrKzsKIAkJCXJldHVybjsKIAkJfQogCQktLXR0bDsKQEAgLTQ3MiwyMCArNDcxLDE5IEBACiAJCWhvcGNvdW50ID0gUFJFUV9JRV9IT1BDT1VOVChwcmVxX2VsZW0pICsgMTsKIAkJbWVzaF9wYXRoX3NlbF9mcmFtZV90eChNUEFUSF9QUkVRLCBmbGFncywgb3JpZ19hZGRyLAogCQkJCWNwdV90b19sZTMyKG9yaWdfZHNuKSwgZHN0X2ZsYWdzLCBkc3RfYWRkciwKLQkJCQljcHVfdG9fbGUzMihkc3RfZHNuKSwgZGV2LT5icm9hZGNhc3QsCisJCQkJY3B1X3RvX2xlMzIoZHN0X2RzbiksIHNkYXRhLT5kZXYtPmJyb2FkY2FzdCwKIAkJCQlob3Bjb3VudCwgdHRsLCBjcHVfdG9fbGUzMihsaWZldGltZSksCiAJCQkJY3B1X3RvX2xlMzIobWV0cmljKSwgY3B1X3RvX2xlMzIocHJlcV9pZCksCi0JCQkJZGV2KTsKLQkJaWZzdGEtPm1zaHN0YXRzLmZ3ZGVkX2ZyYW1lcysrOworCQkJCXNkYXRhKTsKKwkJaWZtc2gtPm1zaHN0YXRzLmZ3ZGVkX2ZyYW1lcysrOwogCX0KIH0KIAogCi1zdGF0aWMgdm9pZCBod21wX3ByZXBfZnJhbWVfcHJvY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgaHdtcF9wcmVwX2ZyYW1lX3Byb2Nlc3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCQkgICAgdTggKnByZXBfZWxlbSwgdTMyIG1ldHJpYykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAJdTggKmRzdF9hZGRyLCAqb3JpZ19hZGRyOwogCXU4IHR0bCwgaG9wY291bnQsIGZsYWdzOwpAQCAtNDk5LDE4ICs0OTcsMTggQEAKIAkgKiByZXBsaWVzCiAJICovCiAJZHN0X2FkZHIgPSBQUkVQX0lFX0RTVF9BRERSKHByZXBfZWxlbSk7Ci0JaWYgKG1lbWNtcChkc3RfYWRkciwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApCisJaWYgKG1lbWNtcChkc3RfYWRkciwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkvKiBkZXN0aW5hdGlvbiwgbm8gZm9yd2FyZGluZyByZXF1aXJlZCAqLwogCQlyZXR1cm47CiAKIAl0dGwgPSBQUkVQX0lFX1RUTChwcmVwX2VsZW0pOwogCWlmICh0dGwgPD0gMSkgewotCQlzZGF0YS0+dS5zdGEubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfdHRsKys7CisJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfdHRsKys7CiAJCXJldHVybjsKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdF9hZGRyLCBkZXYpOworCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3RfYWRkciwgc2RhdGEpOwogCWlmIChtcGF0aCkKIAkJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJZWxzZQpAQCAtNTE5LDcgKzUxNyw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCWdvdG8gZmFpbDsKIAl9Ci0JbWVtY3B5KG5leHRfaG9wLCBtcGF0aC0+bmV4dF9ob3AtPmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobmV4dF9ob3AsIG1wYXRoLT5uZXh0X2hvcC0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKIAlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCS0tdHRsOwogCWZsYWdzID0gUFJFUF9JRV9GTEFHUyhwcmVwX2VsZW0pOwpAQCAtNTMxLDIwICs1MjksMjAgQEAKIAogCW1lc2hfcGF0aF9zZWxfZnJhbWVfdHgoTVBBVEhfUFJFUCwgZmxhZ3MsIG9yaWdfYWRkciwKIAkJY3B1X3RvX2xlMzIob3JpZ19kc24pLCAwLCBkc3RfYWRkciwKLQkJY3B1X3RvX2xlMzIoZHN0X2RzbiksIG1wYXRoLT5uZXh0X2hvcC0+YWRkciwgaG9wY291bnQsIHR0bCwKKwkJY3B1X3RvX2xlMzIoZHN0X2RzbiksIG1wYXRoLT5uZXh0X2hvcC0+c3RhLmFkZHIsIGhvcGNvdW50LCB0dGwsCiAJCWNwdV90b19sZTMyKGxpZmV0aW1lKSwgY3B1X3RvX2xlMzIobWV0cmljKSwKLQkJMCwgZGV2KTsKKwkJMCwgc2RhdGEpOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXNkYXRhLT51LnN0YS5tc2hzdGF0cy5md2RlZF9mcmFtZXMrKzsKKwlzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmZ3ZGVkX2ZyYW1lcysrOwogCXJldHVybjsKIAogZmFpbDoKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlzZGF0YS0+dS5zdGEubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKKwlzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX25vX3JvdXRlKys7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBod21wX3BlcnJfZnJhbWVfcHJvY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgaHdtcF9wZXJyX2ZyYW1lX3Byb2Nlc3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgdTggKnBlcnJfZWxlbSkKIHsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKQEAgLTU1NSwxOCArNTUzLDE4IEBACiAJZHN0X2FkZHIgPSBQRVJSX0lFX0RTVF9BRERSKHBlcnJfZWxlbSk7CiAJZHN0X2RzbiA9IFBFUlJfSUVfRFNUX0RTTihwZXJyX2VsZW0pOwogCXJjdV9yZWFkX2xvY2soKTsKLQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZHN0X2FkZHIsIGRldik7CisJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdF9hZGRyLCBzZGF0YSk7CiAJaWYgKG1wYXRoKSB7CiAJCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX0FDVElWRSAmJgotCQkgICAgbWVtY21wKHRhLCBtcGF0aC0+bmV4dF9ob3AtPmFkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJCSAgICBtZW1jbXAodGEsIG1wYXRoLT5uZXh0X2hvcC0+c3RhLmFkZHIsIEVUSF9BTEVOKSA9PSAwICYmCiAJCSAgICAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRFNOX1ZBTElEKSB8fAogCQkgICAgRFNOX0dUKGRzdF9kc24sIG1wYXRoLT5kc24pKSkgewogCQkJbXBhdGgtPmZsYWdzICY9IH5NRVNIX1BBVEhfQUNUSVZFOwogCQkJbXBhdGgtPmRzbiA9IGRzdF9kc247CiAJCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQkJbWVzaF9wYXRoX2Vycm9yX3R4KGRzdF9hZGRyLCBjcHVfdG9fbGUzMihkc3RfZHNuKSwKLQkJCQkJICAgZGV2LT5icm9hZGNhc3QsIGRldik7CisJCQkJCSAgIHNkYXRhLT5kZXYtPmJyb2FkY2FzdCwgc2RhdGEpOwogCQl9IGVsc2UKIAkJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJfQpAQCAtNTc1LDcgKzU3Myw3IEBACiAKIAogCi12b2lkIG1lc2hfcnhfcGF0aF9zZWxfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3ZvaWQgbWVzaF9yeF9wYXRoX3NlbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkgICAgc2l6ZV90IGxlbikKIHsKQEAgLTU4Myw2ICs1ODEsMTAgQEAKIAlzaXplX3QgYmFzZWxlbjsKIAl1MzIgbGFzdF9ob3BfbWV0cmljOwogCisJLyogbmVlZCBhY3Rpb25fY29kZSAqLworCWlmIChsZW4gPCBJRUVFODAyMTFfTUlOX0FDVElPTl9TSVpFICsgMSkKKwkJcmV0dXJuOworCiAJYmFzZWxlbiA9ICh1OCAqKSBtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uLnZhcmlhYmxlIC0gKHU4ICopIG1nbXQ7CiAJaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyhtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uLnZhcmlhYmxlLAogCQkJbGVuIC0gYmFzZWxlbiwgJmVsZW1zKTsKQEAgLTU5MiwyNSArNTk0LDI1IEBACiAJCWlmICghZWxlbXMucHJlcSB8fCBlbGVtcy5wcmVxX2xlbiAhPSAzNykKIAkJCS8qIFJpZ2h0IG5vdyB3ZSBzdXBwb3J0IGp1c3QgMSBkZXN0aW5hdGlvbiBhbmQgbm8gQUUgKi8KIAkJCXJldHVybjsKLQkJbGFzdF9ob3BfbWV0cmljID0gaHdtcF9yb3V0ZV9pbmZvX2dldChkZXYsIG1nbXQsIGVsZW1zLnByZXEpOworCQlsYXN0X2hvcF9tZXRyaWMgPSBod21wX3JvdXRlX2luZm9fZ2V0KHNkYXRhLCBtZ210LCBlbGVtcy5wcmVxKTsKIAkJaWYgKCFsYXN0X2hvcF9tZXRyaWMpCiAJCQlyZXR1cm47Ci0JCWh3bXBfcHJlcV9mcmFtZV9wcm9jZXNzKGRldiwgbWdtdCwgZWxlbXMucHJlcSwgbGFzdF9ob3BfbWV0cmljKTsKKwkJaHdtcF9wcmVxX2ZyYW1lX3Byb2Nlc3Moc2RhdGEsIG1nbXQsIGVsZW1zLnByZXEsIGxhc3RfaG9wX21ldHJpYyk7CiAJCWJyZWFrOwogCWNhc2UgTVBBVEhfUFJFUDoKIAkJaWYgKCFlbGVtcy5wcmVwIHx8IGVsZW1zLnByZXBfbGVuICE9IDMxKQogCQkJLyogUmlnaHQgbm93IHdlIHN1cHBvcnQgbm8gQUUgKi8KIAkJCXJldHVybjsKLQkJbGFzdF9ob3BfbWV0cmljID0gaHdtcF9yb3V0ZV9pbmZvX2dldChkZXYsIG1nbXQsIGVsZW1zLnByZXApOworCQlsYXN0X2hvcF9tZXRyaWMgPSBod21wX3JvdXRlX2luZm9fZ2V0KHNkYXRhLCBtZ210LCBlbGVtcy5wcmVwKTsKIAkJaWYgKCFsYXN0X2hvcF9tZXRyaWMpCiAJCQlyZXR1cm47Ci0JCWh3bXBfcHJlcF9mcmFtZV9wcm9jZXNzKGRldiwgbWdtdCwgZWxlbXMucHJlcCwgbGFzdF9ob3BfbWV0cmljKTsKKwkJaHdtcF9wcmVwX2ZyYW1lX3Byb2Nlc3Moc2RhdGEsIG1nbXQsIGVsZW1zLnByZXAsIGxhc3RfaG9wX21ldHJpYyk7CiAJCWJyZWFrOwogCWNhc2UgTVBBVEhfUEVSUjoKIAkJaWYgKCFlbGVtcy5wZXJyIHx8IGVsZW1zLnBlcnJfbGVuICE9IDEyKQogCQkJLyogUmlnaHQgbm93IHdlIHN1cHBvcnQgb25seSBvbmUgZGVzdGluYXRpb24gcGVyIFBFUlIgKi8KIAkJCXJldHVybjsKLQkJaHdtcF9wZXJyX2ZyYW1lX3Byb2Nlc3MoZGV2LCBtZ210LCBlbGVtcy5wZXJyKTsKKwkJaHdtcF9wZXJyX2ZyYW1lX3Byb2Nlc3Moc2RhdGEsIG1nbXQsIGVsZW1zLnBlcnIpOwogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CkBAIC02MjgsOSArNjMwLDggQEAKICAqLwogc3RhdGljIHZvaWQgbWVzaF9xdWV1ZV9wcmVxKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9Ci0JCUlFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKG1wYXRoLT5kZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBtcGF0aC0+c2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwogCXN0cnVjdCBtZXNoX3ByZXFfcXVldWUgKnByZXFfbm9kZTsKIAogCXByZXFfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZXNoX3ByZXFfcXVldWUpLCBHRlBfS0VSTkVMKTsKQEAgLTYzOSw5ICs2NDAsOSBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrKCZpZnN0YS0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOwotCWlmIChpZnN0YS0+cHJlcV9xdWV1ZV9sZW4gPT0gTUFYX1BSRVFfUVVFVUVfTEVOKSB7Ci0JCXNwaW5fdW5sb2NrKCZpZnN0YS0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOworCXNwaW5fbG9jaygmaWZtc2gtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKKwlpZiAoaWZtc2gtPnByZXFfcXVldWVfbGVuID09IE1BWF9QUkVRX1FVRVVFX0xFTikgeworCQlzcGluX3VubG9jaygmaWZtc2gtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKIAkJa2ZyZWUocHJlcV9ub2RlKTsKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0RFQlVHICJNZXNoIEhXTVA6IFBSRVEgbm9kZSBxdWV1ZSBmdWxsXG4iKTsKQEAgLTY1MSw1NSArNjUyLDUzIEBACiAJbWVtY3B5KHByZXFfbm9kZS0+ZHN0LCBtcGF0aC0+ZHN0LCBFVEhfQUxFTik7CiAJcHJlcV9ub2RlLT5mbGFncyA9IGZsYWdzOwogCi0JbGlzdF9hZGRfdGFpbCgmcHJlcV9ub2RlLT5saXN0LCAmaWZzdGEtPnByZXFfcXVldWUubGlzdCk7Ci0JKytpZnN0YS0+cHJlcV9xdWV1ZV9sZW47Ci0Jc3Bpbl91bmxvY2soJmlmc3RhLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcHJlcV9ub2RlLT5saXN0LCAmaWZtc2gtPnByZXFfcXVldWUubGlzdCk7CisJKytpZm1zaC0+cHJlcV9xdWV1ZV9sZW47CisJc3Bpbl91bmxvY2soJmlmbXNoLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBpZnN0YS0+bGFzdF9wcmVxICsgbWluX3ByZXFfaW50X2ppZmYoc2RhdGEpKSkKLQkJcXVldWVfd29yayhzZGF0YS0+bG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmc3RhLT53b3JrKTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBpZm1zaC0+bGFzdF9wcmVxICsgbWluX3ByZXFfaW50X2ppZmYoc2RhdGEpKSkKKwkJcXVldWVfd29yayhzZGF0YS0+bG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmbXNoLT53b3JrKTsKIAotCWVsc2UgaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGlmc3RhLT5sYXN0X3ByZXEpKSB7CisJZWxzZSBpZiAodGltZV9iZWZvcmUoamlmZmllcywgaWZtc2gtPmxhc3RfcHJlcSkpIHsKIAkJLyogYXZvaWQgbG9uZyB3YWl0IGlmIGRpZCBub3Qgc2VuZCBwcmVxcyBmb3IgYSBsb25nIHRpbWUKIAkJICogYW5kIGppZmZpZXMgd3JhcHBlZCBhcm91bmQKIAkJICovCi0JCWlmc3RhLT5sYXN0X3ByZXEgPSBqaWZmaWVzIC0gbWluX3ByZXFfaW50X2ppZmYoc2RhdGEpIC0gMTsKLQkJcXVldWVfd29yayhzZGF0YS0+bG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmc3RhLT53b3JrKTsKKwkJaWZtc2gtPmxhc3RfcHJlcSA9IGppZmZpZXMgLSBtaW5fcHJlcV9pbnRfamlmZihzZGF0YSkgLSAxOworCQlxdWV1ZV93b3JrKHNkYXRhLT5sb2NhbC0+aHcud29ya3F1ZXVlLCAmaWZtc2gtPndvcmspOwogCX0gZWxzZQotCQltb2RfdGltZXIoJmlmc3RhLT5tZXNoX3BhdGhfdGltZXIsIGlmc3RhLT5sYXN0X3ByZXEgKworCQltb2RfdGltZXIoJmlmbXNoLT5tZXNoX3BhdGhfdGltZXIsIGlmbXNoLT5sYXN0X3ByZXEgKwogCQkJCQkJbWluX3ByZXFfaW50X2ppZmYoc2RhdGEpKTsKIH0KIAogLyoqCiAgKiBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5IC0gbGF1bmNoIGEgcGF0aCBkaXNjb3ZlcnkgZnJvbSB0aGUgUFJFUSBxdWV1ZQogICoKLSAqIEBkZXY6IGxvY2FsIG1lc2ggaW50ZXJmYWNlCisgKiBAc2RhdGE6IGxvY2FsIG1lc2ggc3ViaWYKICAqLwotdm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIG1lc2hfcGF0aF9zdGFydF9kaXNjb3Zlcnkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPQotCQlJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwogCXN0cnVjdCBtZXNoX3ByZXFfcXVldWUgKnByZXFfbm9kZTsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKIAl1OCB0dGwsIGRzdF9mbGFnczsKIAl1MzIgbGlmZXRpbWU7CiAKLQlzcGluX2xvY2soJmlmc3RhLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7Ci0JaWYgKCFpZnN0YS0+cHJlcV9xdWV1ZV9sZW4gfHwKLQkJdGltZV9iZWZvcmUoamlmZmllcywgaWZzdGEtPmxhc3RfcHJlcSArCisJc3Bpbl9sb2NrKCZpZm1zaC0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOworCWlmICghaWZtc2gtPnByZXFfcXVldWVfbGVuIHx8CisJCXRpbWVfYmVmb3JlKGppZmZpZXMsIGlmbXNoLT5sYXN0X3ByZXEgKwogCQkJCW1pbl9wcmVxX2ludF9qaWZmKHNkYXRhKSkpIHsKLQkJc3Bpbl91bmxvY2soJmlmc3RhLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZpZm1zaC0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOwogCQlyZXR1cm47CiAJfQogCi0JcHJlcV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmaWZzdGEtPnByZXFfcXVldWUubGlzdCwKKwlwcmVxX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpZm1zaC0+cHJlcV9xdWV1ZS5saXN0LAogCQkJc3RydWN0IG1lc2hfcHJlcV9xdWV1ZSwgbGlzdCk7CiAJbGlzdF9kZWwoJnByZXFfbm9kZS0+bGlzdCk7Ci0JLS1pZnN0YS0+cHJlcV9xdWV1ZV9sZW47Ci0Jc3Bpbl91bmxvY2soJmlmc3RhLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CisJLS1pZm1zaC0+cHJlcV9xdWV1ZV9sZW47CisJc3Bpbl91bmxvY2soJmlmbXNoLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHByZXFfbm9kZS0+ZHN0LCBkZXYpOworCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChwcmVxX25vZGUtPmRzdCwgc2RhdGEpOwogCWlmICghbXBhdGgpCiAJCWdvdG8gZW5kZGlzY292ZXJ5OwogCkBAIC03MjEsMTggKzcyMCwxOCBAQAogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAl9CiAKLQlpZnN0YS0+bGFzdF9wcmVxID0gamlmZmllczsKKwlpZm1zaC0+bGFzdF9wcmVxID0gamlmZmllczsKIAotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmc3RhLT5sYXN0X2Rzbl91cGRhdGUgKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmbXNoLT5sYXN0X2Rzbl91cGRhdGUgKwogCQkJCW5ldF90cmF2ZXJzYWxfamlmZmllcyhzZGF0YSkpIHx8Ci0JICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGlmc3RhLT5sYXN0X2Rzbl91cGRhdGUpKSB7Ci0JCSsraWZzdGEtPmRzbjsKLQkJc2RhdGEtPnUuc3RhLmxhc3RfZHNuX3VwZGF0ZSA9IGppZmZpZXM7CisJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIGlmbXNoLT5sYXN0X2Rzbl91cGRhdGUpKSB7CisJCSsraWZtc2gtPmRzbjsKKwkJc2RhdGEtPnUubWVzaC5sYXN0X2Rzbl91cGRhdGUgPSBqaWZmaWVzOwogCX0KIAlsaWZldGltZSA9IGRlZmF1bHRfbGlmZXRpbWUoc2RhdGEpOwotCXR0bCA9IHNkYXRhLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoVFRMOworCXR0bCA9IHNkYXRhLT51Lm1lc2gubXNoY2ZnLmRvdDExTWVzaFRUTDsKIAlpZiAodHRsID09IDApIHsKLQkJc2RhdGEtPnUuc3RhLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX3R0bCsrOworCQlzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX3R0bCsrOwogCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAl9CkBAIC03NDMsMTEgKzc0MiwxMSBAQAogCQlkc3RfZmxhZ3MgPSBNUF9GX1JGOwogCiAJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQltZXNoX3BhdGhfc2VsX2ZyYW1lX3R4KE1QQVRIX1BSRVEsIDAsIGRldi0+ZGV2X2FkZHIsCi0JCQljcHVfdG9fbGUzMihpZnN0YS0+ZHNuKSwgZHN0X2ZsYWdzLCBtcGF0aC0+ZHN0LAotCQkJY3B1X3RvX2xlMzIobXBhdGgtPmRzbiksIGRldi0+YnJvYWRjYXN0LCAwLAorCW1lc2hfcGF0aF9zZWxfZnJhbWVfdHgoTVBBVEhfUFJFUSwgMCwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsCisJCQljcHVfdG9fbGUzMihpZm1zaC0+ZHNuKSwgZHN0X2ZsYWdzLCBtcGF0aC0+ZHN0LAorCQkJY3B1X3RvX2xlMzIobXBhdGgtPmRzbiksIHNkYXRhLT5kZXYtPmJyb2FkY2FzdCwgMCwKIAkJCXR0bCwgY3B1X3RvX2xlMzIobGlmZXRpbWUpLCAwLAotCQkJY3B1X3RvX2xlMzIoaWZzdGEtPnByZXFfaWQrKyksIGRldik7CisJCQljcHVfdG9fbGUzMihpZm1zaC0+cHJlcV9pZCsrKSwgc2RhdGEpOwogCW1vZF90aW1lcigmbXBhdGgtPnRpbWVyLCBqaWZmaWVzICsgbXBhdGgtPmRpc2NvdmVyeV90aW1lb3V0KTsKIAogZW5kZGlzY292ZXJ5OgpAQCAtNzU5LDcgKzc1OCw3IEBACiAgKiBpZWVlODAyMTFzX2xvb2t1cF9uZXh0aG9wIC0gcHV0IHRoZSBhcHByb3ByaWF0ZSBuZXh0IGhvcCBvbiBhIG1lc2ggZnJhbWUKICAqCiAgKiBAc2tiOiA4MDIuMTEgZnJhbWUgdG8gYmUgc2VudAotICogQGRldjogbmV0d29yayBkZXZpY2UgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCisgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCiAgKiBAZndkX2ZyYW1lOiB0cnVlIGlmIHRoaXMgZnJhbWUgd2FzIG9yaWdpbmFsbHkgZnJvbSBhIGRpZmZlcmVudCBob3N0CiAgKgogICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4gSWYgbm8gbmV4dCBob3AgaXMKQEAgLTc2Nyw5ICs3NjYsOSBAQAogICogc2VudCB3aGVuIHRoZSBwYXRoIGlzIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoZSBjYWxsZXIgbXVzdCBub3QgZnJlZSB0aGUgc2tiCiAgKiBpbiB0aGlzIGNhc2UuCiAgKi8KLWludCBtZXNoX25leHRob3BfbG9va3VwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgbWVzaF9uZXh0aG9wX2xvb2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCXN0cnVjdCBza19idWZmICpza2JfdG9fZnJlZSA9IE5VTEw7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CkBAIC03NzcsMTQgKzc3NiwxNCBAQAogCWludCBlcnIgPSAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3RfYWRkciwgZGV2KTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZHN0X2FkZHIsIHNkYXRhKTsKIAogCWlmICghbXBhdGgpIHsKLQkJbWVzaF9wYXRoX2FkZChkc3RfYWRkciwgZGV2KTsKLQkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRzdF9hZGRyLCBkZXYpOworCQltZXNoX3BhdGhfYWRkKGRzdF9hZGRyLCBzZGF0YSk7CisJCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkc3RfYWRkciwgc2RhdGEpOwogCQlpZiAoIW1wYXRoKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlzZGF0YS0+dS5zdGEubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKKwkJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKIAkJCWVyciA9IC1FTk9TUEM7CiAJCQlnb3RvIGVuZGxvb2t1cDsKIAkJfQpAQCAtNzkyLDE0ICs3OTEsMTUgQEAKIAogCWlmIChtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1wYXRoLT5leHBfdGltZSAtCi0JCQltc2Vjc190b19qaWZmaWVzKHNkYXRhLT51LnN0YS5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKQotCQkJCSYmICFtZW1jbXAoZGV2LT5kZXZfYWRkciwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pCisJCQltc2Vjc190b19qaWZmaWVzKHNkYXRhLT51Lm1lc2gubXNoY2ZnLnBhdGhfcmVmcmVzaF90aW1lKSkKKwkJCQkmJiAhbWVtY21wKHNkYXRhLT5kZXYtPmRldl9hZGRyLCBoZHItPmFkZHI0LAorCQkJCQkgICBFVEhfQUxFTikKIAkJCQkmJiAhKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9SRVNPTFZJTkcpCiAJCQkJJiYgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKSB7CiAJCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsCiAJCQkJCVBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7CiAJCX0KLQkJbWVtY3B5KGhkci0+YWRkcjEsIG1wYXRoLT5uZXh0X2hvcC0+YWRkciwKKwkJbWVtY3B5KGhkci0+YWRkcjEsIG1wYXRoLT5uZXh0X2hvcC0+c3RhLmFkZHIsCiAJCQkJRVRIX0FMRU4pOwogCX0gZWxzZSB7CiAJCWlmICghKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9SRVNPTFZJTkcpKSB7CkBAIC04MTUsNyArODE1LDcgQEAKIAogCQlza2JfcXVldWVfdGFpbCgmbXBhdGgtPmZyYW1lX3F1ZXVlLCBza2IpOwogCQlpZiAoc2tiX3RvX2ZyZWUpCi0JCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2JfdG9fZnJlZSwgZGV2KTsKKwkJCW1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lKHNrYl90b19mcmVlLCBzZGF0YSk7CiAJCWVyciA9IC1FTk9FTlQ7CiAJfQogCkBAIC04MzUsNyArODM1LDcgQEAKIAlpZiAoIW1wYXRoKQogCQlnb3RvIGVuZG1wYXRodGltZXI7CiAJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7Ci0Jc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihtcGF0aC0+ZGV2KTsKKwlzZGF0YSA9IG1wYXRoLT5zZGF0YTsKIAlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVkVEIHx8CiAJCQkoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSkpCiAJCW1wYXRoLT5mbGFncyAmPSB+KE1FU0hfUEFUSF9SRVNPTFZJTkcgfCBNRVNIX1BBVEhfUkVTT0xWRUQpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCmluZGV4IDgzOGVlNjAuLjNjNzI1NTcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMzcsNiArMzYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtZXNoX3RhYmxlICptZXNoX3BhdGhzOworc3RhdGljIHN0cnVjdCBtZXNoX3RhYmxlICptcHBfcGF0aHM7IC8qIFN0b3JlIHBhdGhzIGZvciBNUFAmTUFQICovCiAKIC8qIFRoaXMgbG9jayB3aWxsIGhhdmUgdGhlIGdyb3cgdGFibGUgZnVuY3Rpb24gYXMgd3JpdGVyIGFuZCBhZGQgLyBkZWxldGUgbm9kZXMKICAqIGFzIHJlYWRlcnMuIFdoZW4gcmVhZGluZyB0aGUgdGFibGUgKGkuZS4gZG9pbmcgbG9va3Vwcykgd2UgYXJlIHdlbGwgcHJvdGVjdGVkCkBAIC02MiwxMyArNjIsMTMgQEAKIC8qKgogICogbWVzaF9wYXRoX2xvb2t1cCAtIGxvb2sgdXAgYSBwYXRoIGluIHRoZSBtZXNoIHBhdGggdGFibGUKICAqIEBkc3Q6IGhhcmR3YXJlIGFkZHJlc3MgKEVUSF9BTEVOIGxlbmd0aCkgb2YgZGVzdGluYXRpb24KLSAqIEBkZXY6IGxvY2FsIGludGVyZmFjZQorICogQHNkYXRhOiBsb2NhbCBzdWJpZgogICoKICAqIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIG1lc2ggcGF0aCBzdHJ1Y3R1cmUsIG9yIE5VTEwgaWYgbm90IGZvdW5kCiAgKgogICogTG9ja2luZzogbXVzdCBiZSBjYWxsZWQgd2l0aGluIGEgcmVhZCByY3Ugc2VjdGlvbi4KICAqLwotc3RydWN0IG1lc2hfcGF0aCAqbWVzaF9wYXRoX2xvb2t1cCh1OCAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RydWN0IG1lc2hfcGF0aCAqbWVzaF9wYXRoX2xvb2t1cCh1OCAqZHN0LCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKQEAgLTc4LDEwICs3OCwxMCBAQAogCiAJdGJsID0gcmN1X2RlcmVmZXJlbmNlKG1lc2hfcGF0aHMpOwogCi0JYnVja2V0ID0gJnRibC0+aGFzaF9idWNrZXRzW21lc2hfdGFibGVfaGFzaChkc3QsIGRldiwgdGJsKV07CisJYnVja2V0ID0gJnRibC0+aGFzaF9idWNrZXRzW21lc2hfdGFibGVfaGFzaChkc3QsIHNkYXRhLCB0YmwpXTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uobm9kZSwgbiwgYnVja2V0LCBsaXN0KSB7CiAJCW1wYXRoID0gbm9kZS0+bXBhdGg7Ci0JCWlmIChtcGF0aC0+ZGV2ID09IGRldiAmJgorCQlpZiAobXBhdGgtPnNkYXRhID09IHNkYXRhICYmCiAJCQkJbWVtY21wKGRzdCwgbXBhdGgtPmRzdCwgRVRIX0FMRU4pID09IDApIHsKIAkJCWlmIChNUEFUSF9FWFBJUkVEKG1wYXRoKSkgewogCQkJCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwpAQCAtOTUsMTYgKzk1LDQ0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0cnVjdCBtZXNoX3BhdGggKm1wcF9wYXRoX2xvb2t1cCh1OCAqZHN0LCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3sKKwlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OworCXN0cnVjdCBtZXNoX3RhYmxlICp0Ymw7CisJc3RydWN0IG1wYXRoX25vZGUgKm5vZGU7CisKKwl0YmwgPSByY3VfZGVyZWZlcmVuY2UobXBwX3BhdGhzKTsKKworCWJ1Y2tldCA9ICZ0YmwtPmhhc2hfYnVja2V0c1ttZXNoX3RhYmxlX2hhc2goZHN0LCBzZGF0YSwgdGJsKV07CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5vZGUsIG4sIGJ1Y2tldCwgbGlzdCkgeworCQltcGF0aCA9IG5vZGUtPm1wYXRoOworCQlpZiAobXBhdGgtPnNkYXRhID09IHNkYXRhICYmCisJCSAgICBtZW1jbXAoZHN0LCBtcGF0aC0+ZHN0LCBFVEhfQUxFTikgPT0gMCkgeworCQkJaWYgKE1QQVRIX0VYUElSRUQobXBhdGgpKSB7CisJCQkJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CisJCQkJaWYgKE1QQVRIX0VYUElSRUQobXBhdGgpKQorCQkJCQltcGF0aC0+ZmxhZ3MgJj0gfk1FU0hfUEFUSF9BQ1RJVkU7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKKwkJCX0KKwkJCXJldHVybiBtcGF0aDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCiAvKioKICAqIG1lc2hfcGF0aF9sb29rdXBfYnlfaWR4IC0gbG9vayB1cCBhIHBhdGggaW4gdGhlIG1lc2ggcGF0aCB0YWJsZSBieSBpdHMgaW5kZXgKICAqIEBpZHg6IGluZGV4Ci0gKiBAZGV2OiBsb2NhbCBpbnRlcmZhY2UsIG9yIE5VTEwgZm9yIGFsbCBlbnRyaWVzCisgKiBAc2RhdGE6IGxvY2FsIHN1YmlmLCBvciBOVUxMIGZvciBhbGwgZW50cmllcwogICoKICAqIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIG1lc2ggcGF0aCBzdHJ1Y3R1cmUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogICoKICAqIExvY2tpbmc6IG11c3QgYmUgY2FsbGVkIHdpdGhpbiBhIHJlYWQgcmN1IHNlY3Rpb24uCiAgKi8KLXN0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXBfYnlfaWR4KGludCBpZHgsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdHJ1Y3QgbWVzaF9wYXRoICptZXNoX3BhdGhfbG9va3VwX2J5X2lkeChpbnQgaWR4LCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgbXBhdGhfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKQEAgLTExMiw3ICsxNDAsNyBAQAogCWludCBqID0gMDsKIAogCWZvcl9lYWNoX21lc2hfZW50cnkobWVzaF9wYXRocywgcCwgbm9kZSwgaSkgewotCQlpZiAoZGV2ICYmIG5vZGUtPm1wYXRoLT5kZXYgIT0gZGV2KQorCQlpZiAoc2RhdGEgJiYgbm9kZS0+bXBhdGgtPnNkYXRhICE9IHNkYXRhKQogCQkJY29udGludWU7CiAJCWlmIChqKysgPT0gaWR4KSB7CiAJCQlpZiAoTVBBVEhfRVhQSVJFRChub2RlLT5tcGF0aCkpIHsKQEAgLTEzMSwxNSArMTU5LDE0IEBACiAvKioKICAqIG1lc2hfcGF0aF9hZGQgLSBhbGxvY2F0ZSBhbmQgYWRkIGEgbmV3IHBhdGggdG8gdGhlIG1lc2ggcGF0aCB0YWJsZQogICogQGFkZHI6IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBhdGggKEVUSF9BTEVOIGxlbmd0aCkKLSAqIEBkZXY6IGxvY2FsIGludGVyZmFjZQorICogQHNkYXRhOiBsb2NhbCBzdWJpZgogICoKICAqIFJldHVybnM6IDAgb24gc3VjZXNzCiAgKgogICogU3RhdGU6IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBuZXcgcGF0aCBpcyBzZXQgdG8gMAogICovCi1pbnQgbWVzaF9wYXRoX2FkZCh1OCAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IG1lc2hfcGF0aF9hZGQodTggKmRzdCwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoLCAqbmV3X21wYXRoOwogCXN0cnVjdCBtcGF0aF9ub2RlICpub2RlLCAqbmV3X25vZGU7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKQEAgLTE0OCwxNCArMTc1LDE0IEBACiAJaW50IGVyciA9IDA7CiAJdTMyIGhhc2hfaWR4OwogCi0JaWYgKG1lbWNtcChkc3QsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKQorCWlmIChtZW1jbXAoZHN0LCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApCiAJCS8qIG5ldmVyIGFkZCBvdXJzZWx2ZXMgYXMgbmVpZ2hib3VycyAqLwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRzdCkpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKLQlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnNkYXRhLT51LnN0YS5tcGF0aHMsIDEsIE1FU0hfTUFYX01QQVRIUykgPT0gMCkKKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnNkYXRhLT51Lm1lc2gubXBhdGhzLCAxLCBNRVNIX01BWF9NUEFUSFMpID09IDApCiAJCXJldHVybiAtRU5PU1BDOwogCiAJZXJyID0gLUVOT01FTTsKQEAgLTE2OSw3ICsxOTYsNyBAQAogCiAJcmVhZF9sb2NrKCZwYXRodGJsX3Jlc2l6ZV9sb2NrKTsKIAltZW1jcHkobmV3X21wYXRoLT5kc3QsIGRzdCwgRVRIX0FMRU4pOwotCW5ld19tcGF0aC0+ZGV2ID0gZGV2OworCW5ld19tcGF0aC0+c2RhdGEgPSBzZGF0YTsKIAluZXdfbXBhdGgtPmZsYWdzID0gMDsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZuZXdfbXBhdGgtPmZyYW1lX3F1ZXVlKTsKIAluZXdfbm9kZS0+bXBhdGggPSBuZXdfbXBhdGg7CkBAIC0xNzksNyArMjA2LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmbmV3X21wYXRoLT5zdGF0ZV9sb2NrKTsKIAlpbml0X3RpbWVyKCZuZXdfbXBhdGgtPnRpbWVyKTsKIAotCWhhc2hfaWR4ID0gbWVzaF90YWJsZV9oYXNoKGRzdCwgZGV2LCBtZXNoX3BhdGhzKTsKKwloYXNoX2lkeCA9IG1lc2hfdGFibGVfaGFzaChkc3QsIHNkYXRhLCBtZXNoX3BhdGhzKTsKIAlidWNrZXQgPSAmbWVzaF9wYXRocy0+aGFzaF9idWNrZXRzW2hhc2hfaWR4XTsKIAogCXNwaW5fbG9jaygmbWVzaF9wYXRocy0+aGFzaHdsb2NrW2hhc2hfaWR4XSk7CkBAIC0xODcsNyArMjE0LDcgQEAKIAllcnIgPSAtRUVYSVNUOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIG4sIGJ1Y2tldCwgbGlzdCkgewogCQltcGF0aCA9IG5vZGUtPm1wYXRoOwotCQlpZiAobXBhdGgtPmRldiA9PSBkZXYgJiYgbWVtY21wKGRzdCwgbXBhdGgtPmRzdCwgRVRIX0FMRU4pID09IDApCisJCWlmIChtcGF0aC0+c2RhdGEgPT0gc2RhdGEgJiYgbWVtY21wKGRzdCwgbXBhdGgtPmRzdCwgRVRIX0FMRU4pID09IDApCiAJCQlnb3RvIGVycl9leGlzdHM7CiAJfQogCkBAIC0yMjMsNyArMjUwLDkyIEBACiBlcnJfbm9kZV9hbGxvYzoKIAlrZnJlZShuZXdfbXBhdGgpOwogZXJyX3BhdGhfYWxsb2M6Ci0JYXRvbWljX2RlYygmc2RhdGEtPnUuc3RhLm1wYXRocyk7CisJYXRvbWljX2RlYygmc2RhdGEtPnUubWVzaC5tcGF0aHMpOworCXJldHVybiBlcnI7Cit9CisKKworaW50IG1wcF9wYXRoX2FkZCh1OCAqZHN0LCB1OCAqbXBwLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKK3sKKwlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCwgKm5ld19tcGF0aDsKKwlzdHJ1Y3QgbXBhdGhfbm9kZSAqbm9kZSwgKm5ld19ub2RlOworCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJaW50IGdyb3cgPSAwOworCWludCBlcnIgPSAwOworCXUzMiBoYXNoX2lkeDsKKworCisJaWYgKG1lbWNtcChkc3QsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkKKwkJLyogbmV2ZXIgYWRkIG91cnNlbHZlcyBhcyBuZWlnaGJvdXJzICovCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWVyciA9IC1FTk9NRU07CisJbmV3X21wYXRoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1lc2hfcGF0aCksIEdGUF9LRVJORUwpOworCWlmICghbmV3X21wYXRoKQorCQlnb3RvIGVycl9wYXRoX2FsbG9jOworCisJbmV3X25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXBhdGhfbm9kZSksIEdGUF9LRVJORUwpOworCWlmICghbmV3X25vZGUpCisJCWdvdG8gZXJyX25vZGVfYWxsb2M7CisKKwlyZWFkX2xvY2soJnBhdGh0YmxfcmVzaXplX2xvY2spOworCW1lbWNweShuZXdfbXBhdGgtPmRzdCwgZHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KG5ld19tcGF0aC0+bXBwLCBtcHAsIEVUSF9BTEVOKTsKKwluZXdfbXBhdGgtPnNkYXRhID0gc2RhdGE7CisJbmV3X21wYXRoLT5mbGFncyA9IDA7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3X21wYXRoLT5mcmFtZV9xdWV1ZSk7CisJbmV3X25vZGUtPm1wYXRoID0gbmV3X21wYXRoOworCW5ld19tcGF0aC0+ZXhwX3RpbWUgPSBqaWZmaWVzOworCXNwaW5fbG9ja19pbml0KCZuZXdfbXBhdGgtPnN0YXRlX2xvY2spOworCisJaGFzaF9pZHggPSBtZXNoX3RhYmxlX2hhc2goZHN0LCBzZGF0YSwgbXBwX3BhdGhzKTsKKwlidWNrZXQgPSAmbXBwX3BhdGhzLT5oYXNoX2J1Y2tldHNbaGFzaF9pZHhdOworCisJc3Bpbl9sb2NrKCZtcHBfcGF0aHMtPmhhc2h3bG9ja1toYXNoX2lkeF0pOworCisJZXJyID0gLUVFWElTVDsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCBuLCBidWNrZXQsIGxpc3QpIHsKKwkJbXBhdGggPSBub2RlLT5tcGF0aDsKKwkJaWYgKG1wYXRoLT5zZGF0YSA9PSBzZGF0YSAmJiBtZW1jbXAoZHN0LCBtcGF0aC0+ZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCWdvdG8gZXJyX2V4aXN0czsKKwl9CisKKwlobGlzdF9hZGRfaGVhZF9yY3UoJm5ld19ub2RlLT5saXN0LCBidWNrZXQpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmbXBwX3BhdGhzLT5lbnRyaWVzKSA+PQorCQltcHBfcGF0aHMtPm1lYW5fY2hhaW5fbGVuICogKG1wcF9wYXRocy0+aGFzaF9tYXNrICsgMSkpCisJCWdyb3cgPSAxOworCisJc3Bpbl91bmxvY2soJm1wcF9wYXRocy0+aGFzaHdsb2NrW2hhc2hfaWR4XSk7CisJcmVhZF91bmxvY2soJnBhdGh0YmxfcmVzaXplX2xvY2spOworCWlmIChncm93KSB7CisJCXN0cnVjdCBtZXNoX3RhYmxlICpvbGR0YmwsICpuZXd0Ymw7CisKKwkJd3JpdGVfbG9jaygmcGF0aHRibF9yZXNpemVfbG9jayk7CisJCW9sZHRibCA9IG1wcF9wYXRoczsKKwkJbmV3dGJsID0gbWVzaF90YWJsZV9ncm93KG1wcF9wYXRocyk7CisJCWlmICghbmV3dGJsKSB7CisJCQl3cml0ZV91bmxvY2soJnBhdGh0YmxfcmVzaXplX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG1wcF9wYXRocywgbmV3dGJsKTsKKwkJd3JpdGVfdW5sb2NrKCZwYXRodGJsX3Jlc2l6ZV9sb2NrKTsKKworCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJbWVzaF90YWJsZV9mcmVlKG9sZHRibCwgZmFsc2UpOworCX0KKwlyZXR1cm4gMDsKKworZXJyX2V4aXN0czoKKwlzcGluX3VubG9jaygmbXBwX3BhdGhzLT5oYXNod2xvY2tbaGFzaF9pZHhdKTsKKwlyZWFkX3VubG9jaygmcGF0aHRibF9yZXNpemVfbG9jayk7CisJa2ZyZWUobmV3X25vZGUpOworZXJyX25vZGVfYWxsb2M6CisJa2ZyZWUobmV3X21wYXRoKTsKK2Vycl9wYXRoX2FsbG9jOgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI0MSw3ICszNTMsNyBAQAogCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOwogCXN0cnVjdCBtcGF0aF9ub2RlICpub2RlOwogCXN0cnVjdCBobGlzdF9ub2RlICpwOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzdGEtPnNkYXRhLT5kZXY7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOwogCWludCBpOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjU2LDcgKzM2OCw3IEBACiAJCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQkJbWVzaF9wYXRoX2Vycm9yX3R4KG1wYXRoLT5kc3QsCiAJCQkJCWNwdV90b19sZTMyKG1wYXRoLT5kc24pLAotCQkJCQlkZXYtPmJyb2FkY2FzdCwgZGV2KTsKKwkJCQkJc2RhdGEtPmRldi0+YnJvYWRjYXN0LCBzZGF0YSk7CiAJCX0gZWxzZQogCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCX0KQEAgLTI4NCwxMSArMzk2LDExIEBACiAJZm9yX2VhY2hfbWVzaF9lbnRyeShtZXNoX3BhdGhzLCBwLCBub2RlLCBpKSB7CiAJCW1wYXRoID0gbm9kZS0+bXBhdGg7CiAJCWlmIChtcGF0aC0+bmV4dF9ob3AgPT0gc3RhKQotCQkJbWVzaF9wYXRoX2RlbChtcGF0aC0+ZHN0LCBtcGF0aC0+ZGV2KTsKKwkJCW1lc2hfcGF0aF9kZWwobXBhdGgtPmRzdCwgbXBhdGgtPnNkYXRhKTsKIAl9CiB9CiAKLXZvaWQgbWVzaF9wYXRoX2ZsdXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIG1lc2hfcGF0aF9mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKIAlzdHJ1Y3QgbXBhdGhfbm9kZSAqbm9kZTsKQEAgLTI5NywxOSArNDA5LDE4IEBACiAKIAlmb3JfZWFjaF9tZXNoX2VudHJ5KG1lc2hfcGF0aHMsIHAsIG5vZGUsIGkpIHsKIAkJbXBhdGggPSBub2RlLT5tcGF0aDsKLQkJaWYgKG1wYXRoLT5kZXYgPT0gZGV2KQotCQkJbWVzaF9wYXRoX2RlbChtcGF0aC0+ZHN0LCBtcGF0aC0+ZGV2KTsKKwkJaWYgKG1wYXRoLT5zZGF0YSA9PSBzZGF0YSkKKwkJCW1lc2hfcGF0aF9kZWwobXBhdGgtPmRzdCwgbXBhdGgtPnNkYXRhKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG1lc2hfcGF0aF9ub2RlX3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpycCkKIHsKIAlzdHJ1Y3QgbXBhdGhfbm9kZSAqbm9kZSA9IGNvbnRhaW5lcl9vZihycCwgc3RydWN0IG1wYXRoX25vZGUsIHJjdSk7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPQotCQlJRUVFODAyMTFfREVWX1RPX1NVQl9JRihub2RlLT5tcGF0aC0+ZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IG5vZGUtPm1wYXRoLT5zZGF0YTsKIAogCWRlbF90aW1lcl9zeW5jKCZub2RlLT5tcGF0aC0+dGltZXIpOwotCWF0b21pY19kZWMoJnNkYXRhLT51LnN0YS5tcGF0aHMpOworCWF0b21pY19kZWMoJnNkYXRhLT51Lm1lc2gubXBhdGhzKTsKIAlrZnJlZShub2RlLT5tcGF0aCk7CiAJa2ZyZWUobm9kZSk7CiB9CkBAIC0zMTgsMTEgKzQyOSwxMSBAQAogICogbWVzaF9wYXRoX2RlbCAtIGRlbGV0ZSBhIG1lc2ggcGF0aCBmcm9tIHRoZSB0YWJsZQogICoKICAqIEBhZGRyOiBkc3QgYWRkcmVzcyAoRVRIX0FMRU4gbGVuZ3RoKQotICogQGRldjogbG9jYWwgaW50ZXJmYWNlCisgKiBAc2RhdGE6IGxvY2FsIHN1YmlmCiAgKgogICogUmV0dXJuczogMCBpZiBzdWNjZXNmdWwKICAqLwotaW50IG1lc2hfcGF0aF9kZWwodTggKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgbWVzaF9wYXRoX2RlbCh1OCAqYWRkciwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAJc3RydWN0IG1wYXRoX25vZGUgKm5vZGU7CkBAIC0zMzIsMTMgKzQ0MywxMyBAQAogCWludCBlcnIgPSAwOwogCiAJcmVhZF9sb2NrKCZwYXRodGJsX3Jlc2l6ZV9sb2NrKTsKLQloYXNoX2lkeCA9IG1lc2hfdGFibGVfaGFzaChhZGRyLCBkZXYsIG1lc2hfcGF0aHMpOworCWhhc2hfaWR4ID0gbWVzaF90YWJsZV9oYXNoKGFkZHIsIHNkYXRhLCBtZXNoX3BhdGhzKTsKIAlidWNrZXQgPSAmbWVzaF9wYXRocy0+aGFzaF9idWNrZXRzW2hhc2hfaWR4XTsKIAogCXNwaW5fbG9jaygmbWVzaF9wYXRocy0+aGFzaHdsb2NrW2hhc2hfaWR4XSk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgbiwgYnVja2V0LCBsaXN0KSB7CiAJCW1wYXRoID0gbm9kZS0+bXBhdGg7Ci0JCWlmIChtcGF0aC0+ZGV2ID09IGRldiAmJgorCQlpZiAobXBhdGgtPnNkYXRhID09IHNkYXRhICYmCiAJCQkJbWVtY21wKGFkZHIsIG1wYXRoLT5kc3QsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAkJCW1wYXRoLT5mbGFncyB8PSBNRVNIX1BBVEhfUkVTT0xWSU5HOwpAQCAtMzc4LDMzICs0ODksMzMgQEAKICAqIG1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lIC0gZGlzY2FyZCBhIGZyYW1lIHdob3NlIHBhdGggY291bGQgbm90IGJlIHJlc29sdmVkCiAgKgogICogQHNrYjogZnJhbWUgdG8gZGlzY2FyZAotICogQGRldjogbmV0d29yayBkZXZpY2UgdGhlIGZyYW1lIHdhcyB0byBiZSBzZW50IHRocm91Z2gKKyAqIEBzZGF0YTogbmV0d29yayBzdWJpZiB0aGUgZnJhbWUgd2FzIHRvIGJlIHNlbnQgdGhyb3VnaAogICoKICAqIElmIHRoZSBmcmFtZSB3YXMgYmVpZ24gZm9yd2FyZGVkIGZyb20gYW5vdGhlciBNUCwgYSBQRVJSIGZyYW1lIHdpbGwgYmUgc2VudAogICogdG8gdGhlIHByZWN1cnNvci4KICAqCiAgKiBMb2NraW5nOiB0aGUgZnVuY3Rpb24gbXVzdCBtZSBjYWxsZWQgd2l0aGluIGEgcmN1X3JlYWRfbG9jayByZWdpb24KICAqLwotdm9pZCBtZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBtZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IG1lc2hfcGF0aCAqbXBhdGg7CiAJdTMyIGRzbiA9IDA7CiAKLQlpZiAobWVtY21wKGhkci0+YWRkcjQsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSAhPSAwKSB7CisJaWYgKG1lbWNtcChoZHItPmFkZHI0LCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pICE9IDApIHsKIAkJdTggKnJhLCAqZGE7CiAKIAkJZGEgPSBoZHItPmFkZHIzOwogCQlyYSA9IGhkci0+YWRkcjI7Ci0JCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkYSwgZGV2KTsKKwkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKGRhLCBzZGF0YSk7CiAJCWlmIChtcGF0aCkKIAkJCWRzbiA9ICsrbXBhdGgtPmRzbjsKLQkJbWVzaF9wYXRoX2Vycm9yX3R4KHNrYi0+ZGF0YSwgY3B1X3RvX2xlMzIoZHNuKSwgcmEsIGRldik7CisJCW1lc2hfcGF0aF9lcnJvcl90eChza2ItPmRhdGEsIGNwdV90b19sZTMyKGRzbiksIHJhLCBzZGF0YSk7CiAJfQogCiAJa2ZyZWVfc2tiKHNrYik7Ci0Jc2RhdGEtPnUuc3RhLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX25vX3JvdXRlKys7CisJc2RhdGEtPnUubWVzaC5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc19ub19yb3V0ZSsrOwogfQogCiAvKioKQEAgLTQxNiwxNCArNTI3LDExIEBACiAgKi8KIHZvaWQgbWVzaF9wYXRoX2ZsdXNoX3BlbmRpbmcoc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYobXBhdGgtPmRldik7Ci0KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZtcGF0aC0+ZnJhbWVfcXVldWUpKSAmJgogCQkJKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9BQ1RJVkUpKQotCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2IsIG1wYXRoLT5kZXYpOworCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2IsIG1wYXRoLT5zZGF0YSk7CiB9CiAKIC8qKgpAQCAtNDcyLDcgKzU4MCw3IEBACiAJbm9kZSA9IGhsaXN0X2VudHJ5KHAsIHN0cnVjdCBtcGF0aF9ub2RlLCBsaXN0KTsKIAltcGF0aCA9IG5vZGUtPm1wYXRoOwogCW5ld19ub2RlLT5tcGF0aCA9IG1wYXRoOwotCWhhc2hfaWR4ID0gbWVzaF90YWJsZV9oYXNoKG1wYXRoLT5kc3QsIG1wYXRoLT5kZXYsIG5ld3RibCk7CisJaGFzaF9pZHggPSBtZXNoX3RhYmxlX2hhc2gobXBhdGgtPmRzdCwgbXBhdGgtPnNkYXRhLCBuZXd0YmwpOwogCWhsaXN0X2FkZF9oZWFkKCZuZXdfbm9kZS0+bGlzdCwKIAkJCSZuZXd0YmwtPmhhc2hfYnVja2V0c1toYXNoX2lkeF0pOwogCXJldHVybiAwOwpAQCAtNDgxLDE1ICs1ODksMjUgQEAKIGludCBtZXNoX3BhdGh0YmxfaW5pdCh2b2lkKQogewogCW1lc2hfcGF0aHMgPSBtZXNoX3RhYmxlX2FsbG9jKElOSVRfUEFUSFNfU0laRV9PUkRFUik7CisJaWYgKCFtZXNoX3BhdGhzKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZXNoX3BhdGhzLT5mcmVlX25vZGUgPSAmbWVzaF9wYXRoX25vZGVfZnJlZTsKIAltZXNoX3BhdGhzLT5jb3B5X25vZGUgPSAmbWVzaF9wYXRoX25vZGVfY29weTsKIAltZXNoX3BhdGhzLT5tZWFuX2NoYWluX2xlbiA9IE1FQU5fQ0hBSU5fTEVOOwotCWlmICghbWVzaF9wYXRocykKKworCW1wcF9wYXRocyA9IG1lc2hfdGFibGVfYWxsb2MoSU5JVF9QQVRIU19TSVpFX09SREVSKTsKKwlpZiAoIW1wcF9wYXRocykgeworCQltZXNoX3RhYmxlX2ZyZWUobWVzaF9wYXRocywgdHJ1ZSk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KKwltcHBfcGF0aHMtPmZyZWVfbm9kZSA9ICZtZXNoX3BhdGhfbm9kZV9mcmVlOworCW1wcF9wYXRocy0+Y29weV9ub2RlID0gJm1lc2hfcGF0aF9ub2RlX2NvcHk7CisJbXBwX3BhdGhzLT5tZWFuX2NoYWluX2xlbiA9IE1FQU5fQ0hBSU5fTEVOOworCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWVzaF9wYXRoX2V4cGlyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBtZXNoX3BhdGhfZXhwaXJlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOwogCXN0cnVjdCBtcGF0aF9ub2RlICpub2RlOwpAQCAtNDk4LDcgKzYxNiw3IEBACiAKIAlyZWFkX2xvY2soJnBhdGh0YmxfcmVzaXplX2xvY2spOwogCWZvcl9lYWNoX21lc2hfZW50cnkobWVzaF9wYXRocywgcCwgbm9kZSwgaSkgewotCQlpZiAobm9kZS0+bXBhdGgtPmRldiAhPSBkZXYpCisJCWlmIChub2RlLT5tcGF0aC0+c2RhdGEgIT0gc2RhdGEpCiAJCQljb250aW51ZTsKIAkJbXBhdGggPSBub2RlLT5tcGF0aDsKIAkJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CkBAIC01MDcsNyArNjI1LDcgQEAKIAkJCXRpbWVfYWZ0ZXIoamlmZmllcywKIAkJCSBtcGF0aC0+ZXhwX3RpbWUgKyBNRVNIX1BBVEhfRVhQSVJFKSkgewogCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQkJCW1lc2hfcGF0aF9kZWwobXBhdGgtPmRzdCwgbXBhdGgtPmRldik7CisJCQltZXNoX3BhdGhfZGVsKG1wYXRoLT5kc3QsIG1wYXRoLT5zZGF0YSk7CiAJCX0gZWxzZQogCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAl9CkBAIC01MTcsNCArNjM1LDUgQEAKIHZvaWQgbWVzaF9wYXRodGJsX3VucmVnaXN0ZXIodm9pZCkKIHsKIAltZXNoX3RhYmxlX2ZyZWUobWVzaF9wYXRocywgdHJ1ZSk7CisJbWVzaF90YWJsZV9mcmVlKG1wcF9wYXRocywgdHJ1ZSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jIGIvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYwppbmRleCA5ZWZlYjFmLi5mYWFjMTAxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKQEAgLTM2LDExICszNiwxMSBAQAogI2RlZmluZSBNRVNIX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OX0lNUE9TU0lCTEUJOQogI2RlZmluZSBNRVNIX1NFQ1VSSVRZX0ZBSUxFRF9WRVJJRklDQVRJT04JMTAKIAotI2RlZmluZSBkb3QxMU1lc2hNYXhSZXRyaWVzKHMpIChzLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoTWF4UmV0cmllcykKLSNkZWZpbmUgZG90MTFNZXNoUmV0cnlUaW1lb3V0KHMpIChzLT51LnN0YS5tc2hjZmcuZG90MTFNZXNoUmV0cnlUaW1lb3V0KQotI2RlZmluZSBkb3QxMU1lc2hDb25maXJtVGltZW91dChzKSAocy0+dS5zdGEubXNoY2ZnLmRvdDExTWVzaENvbmZpcm1UaW1lb3V0KQotI2RlZmluZSBkb3QxMU1lc2hIb2xkaW5nVGltZW91dChzKSAocy0+dS5zdGEubXNoY2ZnLmRvdDExTWVzaEhvbGRpbmdUaW1lb3V0KQotI2RlZmluZSBkb3QxMU1lc2hNYXhQZWVyTGlua3MocykgKHMtPnUuc3RhLm1zaGNmZy5kb3QxMU1lc2hNYXhQZWVyTGlua3MpCisjZGVmaW5lIGRvdDExTWVzaE1heFJldHJpZXMocykgKHMtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoTWF4UmV0cmllcykKKyNkZWZpbmUgZG90MTFNZXNoUmV0cnlUaW1lb3V0KHMpIChzLT51Lm1lc2gubXNoY2ZnLmRvdDExTWVzaFJldHJ5VGltZW91dCkKKyNkZWZpbmUgZG90MTFNZXNoQ29uZmlybVRpbWVvdXQocykgKHMtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoQ29uZmlybVRpbWVvdXQpCisjZGVmaW5lIGRvdDExTWVzaEhvbGRpbmdUaW1lb3V0KHMpIChzLT51Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhvbGRpbmdUaW1lb3V0KQorI2RlZmluZSBkb3QxMU1lc2hNYXhQZWVyTGlua3MocykgKHMtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoTWF4UGVlckxpbmtzKQogCiBlbnVtIHBsaW5rX2ZyYW1lX3R5cGUgewogCVBMSU5LX09QRU4gPSAwLApAQCAtNjMsMTQgKzYzLDE0IEBACiBzdGF0aWMgaW5saW5lCiB2b2lkIG1lc2hfcGxpbmtfaW5jX2VzdGFiX2NvdW50KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCWF0b21pY19pbmMoJnNkYXRhLT51LnN0YS5tc2hzdGF0cy5lc3RhYl9wbGlua3MpOworCWF0b21pY19pbmMoJnNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZXN0YWJfcGxpbmtzKTsKIAltZXNoX2FjY2VwdF9wbGlua3NfdXBkYXRlKHNkYXRhKTsKIH0KIAogc3RhdGljIGlubGluZQogdm9pZCBtZXNoX3BsaW5rX2RlY19lc3RhYl9jb3VudChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlhdG9taWNfZGVjKCZzZGF0YS0+dS5zdGEubXNoc3RhdHMuZXN0YWJfcGxpbmtzKTsKKwlhdG9taWNfZGVjKCZzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmVzdGFiX3BsaW5rcyk7CiAJbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzZGF0YSk7CiB9CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXN0YS0+ZmxhZ3MgPSBXTEFOX1NUQV9BVVRIT1JJWkVEOwotCXN0YS0+c3VwcF9yYXRlc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSA9IHJhdGVzOworCXN0YS0+c3RhLnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKIAogCXJldHVybiBzdGE7CiB9CkBAIC0xNDQsMTAgKzE0NCwxMCBAQAogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IG1lc2hfcGxpbmtfZnJhbWVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgbWVzaF9wbGlua19mcmFtZV90eChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJZW51bSBwbGlua19mcmFtZV90eXBlIGFjdGlvbiwgdTggKmRhLCBfX2xlMTYgbGxpZCwgX19sZTE2IHBsaWQsCiAJCV9fbGUxNiByZWFzb24pIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCk7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCWJvb2wgaW5jbHVkZV9wbGlkID0gZmFsc2U7CkBAIC0xNjMsMTAgKzE2MywxMCBAQAogCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopCiAJCXNrYl9wdXQoc2tiLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LnBsaW5rX2FjdGlvbikpOwogCW1lbXNldChtZ210LCAwLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LnBsaW5rX2FjdGlvbikpOwotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CiAJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAkvKiBCU1NJRCBpcyBsZWZ0IHplcm9lZCwgd2lsZGNhcmQgdmFsdWUgKi8KIAltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFBMSU5LX0NBVEVHT1JZOwogCW1nbXQtPnUuYWN0aW9uLnUucGxpbmtfYWN0aW9uLmFjdGlvbl9jb2RlID0gYWN0aW9uOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCQkvKiB0d28tYnl0ZSBzdGF0dXMgY29kZSBmb2xsb3dlZCBieSB0d28tYnl0ZSBBSUQgKi8KIAkJCW1lbXNldChwb3MsIDAsIDQpOwogCQl9Ci0JCW1lc2hfbWdtdF9pZXNfYWRkKHNrYiwgZGV2KTsKKwkJbWVzaF9tZ210X2llc19hZGQoc2tiLCBzZGF0YSk7CiAJfQogCiAJLyogQWRkIFBlZXIgTGluayBNYW5hZ2VtZW50IGVsZW1lbnQgKi8KQEAgLTIxNywxNSArMjE3LDE0IEBACiAJCW1lbWNweShwb3MsICZyZWFzb24sIDIpOwogCX0KIAotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWVzaF9uZWlnaGJvdXJfdXBkYXRlKHU4ICpod19hZGRyLCB1NjQgcmF0ZXMsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCit2b2lkIG1lc2hfbmVpZ2hib3VyX3VwZGF0ZSh1OCAqaHdfYWRkciwgdTY0IHJhdGVzLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgIGJvb2wgcGVlcl9hY2NlcHRpbmdfcGxpbmtzKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjQ0LDEwICsyNDMsMTAgQEAKIAl9CiAKIAlzdGEtPmxhc3RfcnggPSBqaWZmaWVzOwotCXN0YS0+c3VwcF9yYXRlc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSA9IHJhdGVzOworCXN0YS0+c3RhLnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKIAlpZiAocGVlcl9hY2NlcHRpbmdfcGxpbmtzICYmIHN0YS0+cGxpbmtfc3RhdGUgPT0gUExJTktfTElTVEVOICYmCi0JCQlzZGF0YS0+dS5zdGEuYWNjZXB0aW5nX3BsaW5rcyAmJgotCQkJc2RhdGEtPnUuc3RhLm1zaGNmZy5hdXRvX29wZW5fcGxpbmtzKQorCQkJc2RhdGEtPnUubWVzaC5hY2NlcHRpbmdfcGxpbmtzICYmCisJCQlzZGF0YS0+dS5tZXNoLm1zaGNmZy5hdXRvX29wZW5fcGxpbmtzKQogCQltZXNoX3BsaW5rX29wZW4oc3RhKTsKIAogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjU3LDcgKzI1Niw2IEBACiB7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJX19sZTE2IGxsaWQsIHBsaWQsIHJlYXNvbjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9NUExfREVCVUcKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKQEAgLTI3NywxMiArMjc1LDExIEBACiAJCXJldHVybjsKIAl9CiAJbXBsX2RiZygiTWVzaCBwbGluayB0aW1lciBmb3IgJXMgZmlyZWQgb24gc3RhdGUgJWRcbiIsCi0JCQlwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLCBzdGEtPnBsaW5rX3N0YXRlKTsKKwkJCXByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpLCBzdGEtPnBsaW5rX3N0YXRlKTsKIAlyZWFzb24gPSAwOwogCWxsaWQgPSBzdGEtPmxsaWQ7CiAJcGxpZCA9IHN0YS0+cGxpZDsKIAlzZGF0YSA9IHN0YS0+c2RhdGE7Ci0JZGV2ID0gc2RhdGEtPmRldjsKIAogCXN3aXRjaCAoc3RhLT5wbGlua19zdGF0ZSkgewogCWNhc2UgUExJTktfT1BOX1JDVkQ6CkBAIC0yOTEsNyArMjg4LDcgQEAKIAkJaWYgKHN0YS0+cGxpbmtfcmV0cmllcyA8IGRvdDExTWVzaE1heFJldHJpZXMoc2RhdGEpKSB7CiAJCQl1MzIgcmFuZDsKIAkJCW1wbF9kYmcoIk1lc2ggcGxpbmsgZm9yICVzIChyZXRyeSwgdGltZW91dCk6ICVkICVkXG4iLAotCQkJCQlwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLAorCQkJCQlwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSwKIAkJCQkJc3RhLT5wbGlua19yZXRyaWVzLCBzdGEtPnBsaW5rX3RpbWVvdXQpOwogCQkJZ2V0X3JhbmRvbV9ieXRlcygmcmFuZCwgc2l6ZW9mKHUzMikpOwogCQkJc3RhLT5wbGlua190aW1lb3V0ID0gc3RhLT5wbGlua190aW1lb3V0ICsKQEAgLTI5OSw3ICsyOTYsNyBAQAogCQkJKytzdGEtPnBsaW5rX3JldHJpZXM7CiAJCQltb2RfcGxpbmtfdGltZXIoc3RhLCBzdGEtPnBsaW5rX3RpbWVvdXQpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCQltZXNoX3BsaW5rX2ZyYW1lX3R4KGRldiwgUExJTktfT1BFTiwgc3RhLT5hZGRyLCBsbGlkLAorCQkJbWVzaF9wbGlua19mcmFtZV90eChzZGF0YSwgUExJTktfT1BFTiwgc3RhLT5zdGEuYWRkciwgbGxpZCwKIAkJCQkJICAgIDAsIDApOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMxMiw3ICszMDksNyBAQAogCQlzdGEtPnBsaW5rX3N0YXRlID0gUExJTktfSE9MRElORzsKIAkJbW9kX3BsaW5rX3RpbWVyKHN0YSwgZG90MTFNZXNoSG9sZGluZ1RpbWVvdXQoc2RhdGEpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DTE9TRSwgc3RhLT5hZGRyLCBsbGlkLCBwbGlkLAorCQltZXNoX3BsaW5rX2ZyYW1lX3R4KHNkYXRhLCBQTElOS19DTE9TRSwgc3RhLT5zdGEuYWRkciwgbGxpZCwgcGxpZCwKIAkJCQkgICAgcmVhc29uKTsKIAkJYnJlYWs7CiAJY2FzZSBQTElOS19IT0xESU5HOgpAQCAtMzU1LDEwICszNTIsMTAgQEAKIAltZXNoX3BsaW5rX3RpbWVyX3NldChzdGEsIGRvdDExTWVzaFJldHJ5VGltZW91dChzZGF0YSkpOwogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCW1wbF9kYmcoIk1lc2ggcGxpbms6IHN0YXJ0aW5nIGVzdGFibGlzaG1lbnQgd2l0aCAlc1xuIiwKLQkJcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCXByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpKTsKIAotCXJldHVybiBtZXNoX3BsaW5rX2ZyYW1lX3R4KHNkYXRhLT5kZXYsIFBMSU5LX09QRU4sCi0JCQkJICAgc3RhLT5hZGRyLCBsbGlkLCAwLCAwKTsKKwlyZXR1cm4gbWVzaF9wbGlua19mcmFtZV90eChzZGF0YSwgUExJTktfT1BFTiwKKwkJCQkgICBzdGEtPnN0YS5hZGRyLCBsbGlkLCAwLCAwKTsKIH0KIAogdm9pZCBtZXNoX3BsaW5rX2Jsb2NrKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpAQCAtMzgyLDcgKzM3OSw3IEBACiAjZW5kaWYKIAogCW1wbF9kYmcoIk1lc2ggcGxpbms6IGNsb3NpbmcgbGluayB3aXRoICVzXG4iLAotCQkJcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCQlwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSk7CiAJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwogCXN0YS0+cmVhc29uID0gY3B1X3RvX2xlMTYoTUVTSF9MSU5LX0NBTkNFTExFRCk7CiAJcmVhc29uID0gc3RhLT5yZWFzb247CkBAIC00MDMsMTUgKzQwMCwxNCBAQAogCWxsaWQgPSBzdGEtPmxsaWQ7CiAJcGxpZCA9IHN0YS0+cGxpZDsKIAlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQltZXNoX3BsaW5rX2ZyYW1lX3R4KHN0YS0+c2RhdGEtPmRldiwgUExJTktfQ0xPU0UsIHN0YS0+YWRkciwgbGxpZCwKKwltZXNoX3BsaW5rX2ZyYW1lX3R4KHN0YS0+c2RhdGEsIFBMSU5LX0NMT1NFLCBzdGEtPnN0YS5hZGRyLCBsbGlkLAogCQkJICAgIHBsaWQsIHJlYXNvbik7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWVzaF9yeF9wbGlua19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCit2b2lkIG1lc2hfcnhfcGxpbmtfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCSBzaXplX3QgbGVuLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyBlbGVtczsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKQEAgLTQyNSw2ICs0MjEsMTAgQEAKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKICNlbmRpZgogCisJLyogbmVlZCBhY3Rpb25fY29kZSwgYXV4ICovCisJaWYgKGxlbiA8IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAzKQorCQlyZXR1cm47CisKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIobWdtdC0+ZGEpKSB7CiAJCW1wbF9kYmcoIk1lc2ggcGxpbms6IGlnbm9yZSBmcmFtZSBmcm9tIG11bHRpY2FzdCBhZGRyZXNzIik7CiAJCXJldHVybjsKQEAgLTQ3OCw3ICs0NzgsNyBAQAogCiAJLyogTm93IHdlIHdpbGwgZmlndXJlIG91dCB0aGUgYXBwcm9wcmlhdGUgZXZlbnQuLi4gKi8KIAlldmVudCA9IFBMSU5LX1VOREVGSU5FRDsKLQlpZiAoZnR5cGUgIT0gUExJTktfQ0xPU0UgJiYgKCFtZXNoX21hdGNoZXNfbG9jYWwoJmVsZW1zLCBkZXYpKSkgeworCWlmIChmdHlwZSAhPSBQTElOS19DTE9TRSAmJiAoIW1lc2hfbWF0Y2hlc19sb2NhbCgmZWxlbXMsIHNkYXRhKSkpIHsKIAkJc3dpdGNoIChmdHlwZSkgewogCQljYXNlIFBMSU5LX09QRU46CiAJCQlldmVudCA9IE9QTl9SSkNUOwpAQCAtNTc3LDkgKzU3Nyw5IEBACiAJCQlzdGEtPmxsaWQgPSBsbGlkOwogCQkJbWVzaF9wbGlua190aW1lcl9zZXQoc3RhLCBkb3QxMU1lc2hSZXRyeVRpbWVvdXQoc2RhdGEpKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQkJbWVzaF9wbGlua19mcmFtZV90eChkZXYsIFBMSU5LX09QRU4sIHN0YS0+YWRkciwgbGxpZCwKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX09QRU4sIHN0YS0+c3RhLmFkZHIsIGxsaWQsCiAJCQkJCSAgICAwLCAwKTsKLQkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DT05GSVJNLCBzdGEtPmFkZHIsCisJCQltZXNoX3BsaW5rX2ZyYW1lX3R4KHNkYXRhLCBQTElOS19DT05GSVJNLCBzdGEtPnN0YS5hZGRyLAogCQkJCQkgICAgbGxpZCwgcGxpZCwgMCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTYwNCw3ICs2MDQsNyBAQAogCiAJCQlsbGlkID0gc3RhLT5sbGlkOwogCQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCQltZXNoX3BsaW5rX2ZyYW1lX3R4KGRldiwgUExJTktfQ0xPU0UsIHN0YS0+YWRkciwgbGxpZCwKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NMT1NFLCBzdGEtPnN0YS5hZGRyLCBsbGlkLAogCQkJCQkgICAgcGxpZCwgcmVhc29uKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QTl9BQ1BUOgpAQCAtNjEzLDcgKzYxMyw3IEBACiAJCQlzdGEtPnBsaWQgPSBwbGlkOwogCQkJbGxpZCA9IHN0YS0+bGxpZDsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQkJbWVzaF9wbGlua19mcmFtZV90eChkZXYsIFBMSU5LX0NPTkZJUk0sIHN0YS0+YWRkciwgbGxpZCwKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NPTkZJUk0sIHN0YS0+c3RhLmFkZHIsIGxsaWQsCiAJCQkJCSAgICBwbGlkLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIENORl9BQ1BUOgpAQCAtNjQ2LDEzICs2NDYsMTMgQEAKIAogCQkJbGxpZCA9IHN0YS0+bGxpZDsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQkJbWVzaF9wbGlua19mcmFtZV90eChkZXYsIFBMSU5LX0NMT1NFLCBzdGEtPmFkZHIsIGxsaWQsCisJCQltZXNoX3BsaW5rX2ZyYW1lX3R4KHNkYXRhLCBQTElOS19DTE9TRSwgc3RhLT5zdGEuYWRkciwgbGxpZCwKIAkJCQkJICAgIHBsaWQsIHJlYXNvbik7CiAJCQlicmVhazsKIAkJY2FzZSBPUE5fQUNQVDoKIAkJCWxsaWQgPSBzdGEtPmxsaWQ7CiAJCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DT05GSVJNLCBzdGEtPmFkZHIsIGxsaWQsCisJCQltZXNoX3BsaW5rX2ZyYW1lX3R4KHNkYXRhLCBQTElOS19DT05GSVJNLCBzdGEtPnN0YS5hZGRyLCBsbGlkLAogCQkJCQkgICAgcGxpZCwgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBDTkZfQUNQVDoKQEAgLTY2MSw3ICs2NjEsNyBAQAogCQkJbWVzaF9wbGlua19pbmNfZXN0YWJfY291bnQoc2RhdGEpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CiAJCQltcGxfZGJnKCJNZXNoIHBsaW5rIHdpdGggJXMgRVNUQUJMSVNIRURcbiIsCi0JCQkJCXByaW50X21hYyhtYWMsIHN0YS0+YWRkcikpOworCQkJCQlwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwpAQCAtNjg1LDcgKzY4NSw3IEBACiAKIAkJCWxsaWQgPSBzdGEtPmxsaWQ7CiAJCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DTE9TRSwgc3RhLT5hZGRyLCBsbGlkLAorCQkJbWVzaF9wbGlua19mcmFtZV90eChzZGF0YSwgUExJTktfQ0xPU0UsIHN0YS0+c3RhLmFkZHIsIGxsaWQsCiAJCQkJCSAgICBwbGlkLCByZWFzb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgT1BOX0FDUFQ6CkBAIC02OTQsOCArNjk0LDggQEAKIAkJCW1lc2hfcGxpbmtfaW5jX2VzdGFiX2NvdW50KHNkYXRhKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCQkJbXBsX2RiZygiTWVzaCBwbGluayB3aXRoICVzIEVTVEFCTElTSEVEXG4iLAotCQkJCQlwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpKTsKLQkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DT05GSVJNLCBzdGEtPmFkZHIsIGxsaWQsCisJCQkJCXByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpKTsKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NPTkZJUk0sIHN0YS0+c3RhLmFkZHIsIGxsaWQsCiAJCQkJCSAgICBwbGlkLCAwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNzE0LDEzICs3MTQsMTMgQEAKIAkJCWxsaWQgPSBzdGEtPmxsaWQ7CiAJCQltb2RfcGxpbmtfdGltZXIoc3RhLCBkb3QxMU1lc2hIb2xkaW5nVGltZW91dChzZGF0YSkpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCQltZXNoX3BsaW5rX2ZyYW1lX3R4KGRldiwgUExJTktfQ0xPU0UsIHN0YS0+YWRkciwgbGxpZCwKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NMT1NFLCBzdGEtPnN0YS5hZGRyLCBsbGlkLAogCQkJCQkgICAgcGxpZCwgcmVhc29uKTsKIAkJCWJyZWFrOwogCQljYXNlIE9QTl9BQ1BUOgogCQkJbGxpZCA9IHN0YS0+bGxpZDsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQkJbWVzaF9wbGlua19mcmFtZV90eChkZXYsIFBMSU5LX0NPTkZJUk0sIHN0YS0+YWRkciwgbGxpZCwKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NPTkZJUk0sIHN0YS0+c3RhLmFkZHIsIGxsaWQsCiAJCQkJCSAgICBwbGlkLCAwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNzQzLDggKzc0Myw4IEBACiAJCQlsbGlkID0gc3RhLT5sbGlkOwogCQkJcmVhc29uID0gc3RhLT5yZWFzb247CiAJCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoZGV2LCBQTElOS19DTE9TRSwgc3RhLT5hZGRyLCBsbGlkLAotCQkJCQkgICAgcGxpZCwgcmVhc29uKTsKKwkJCW1lc2hfcGxpbmtfZnJhbWVfdHgoc2RhdGEsIFBMSU5LX0NMT1NFLCBzdGEtPnN0YS5hZGRyLAorCQkJCQkgICAgbGxpZCwgcGxpZCwgcmVhc29uKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWxtZS5jIGIvbmV0L21hYzgwMjExL21sbWUuYwppbmRleCA5MDJjYWMxLi44NzY2NWQ3YiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC0xMSwxMSArMTEsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotLyogVE9ETzoKLSAqIG9yZGVyIEJTUyBsaXN0IGJ5IFJTU0koPykgKCJxdWFsaXR5IG9mIEFQIikKLSAqIHNjYW4gcmVzdWx0IHRhYmxlIGZpbHRlcmluZyAoYnkgY2FwYWJpbGl0eSAocHJpdmFjeSwgSUJTUy9CU1MsIFdQQS9SU04gSUUsCi0gKiAgICBTU0lEKQotICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtMjYsNjYzICsyMSw1OCBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKwogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAicmF0ZS5oIgogI2luY2x1ZGUgImxlZC5oIgotI2luY2x1ZGUgIm1lc2guaCIKIAorI2RlZmluZSBJRUVFODAyMTFfQVNTT0NfU0NBTlNfTUFYX1RSSUVTIDIKICNkZWZpbmUgSUVFRTgwMjExX0FVVEhfVElNRU9VVCAoSFogLyA1KQogI2RlZmluZSBJRUVFODAyMTFfQVVUSF9NQVhfVFJJRVMgMwogI2RlZmluZSBJRUVFODAyMTFfQVNTT0NfVElNRU9VVCAoSFogLyA1KQogI2RlZmluZSBJRUVFODAyMTFfQVNTT0NfTUFYX1RSSUVTIDMKICNkZWZpbmUgSUVFRTgwMjExX01PTklUT1JJTkdfSU5URVJWQUwgKDIgKiBIWikKLSNkZWZpbmUgSUVFRTgwMjExX01FU0hfSE9VU0VLRUVQSU5HX0lOVEVSVkFMICg2MCAqIEhaKQogI2RlZmluZSBJRUVFODAyMTFfUFJPQkVfSU5URVJWQUwgKDYwICogSFopCiAjZGVmaW5lIElFRUU4MDIxMV9SRVRSWV9BVVRIX0lOVEVSVkFMICgxICogSFopCiAjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0lOVEVSVkFMICgyICogSFopCiAjZGVmaW5lIElFRUU4MDIxMV9TQ0FOX0lOVEVSVkFMX1NMT1cgKDE1ICogSFopCiAjZGVmaW5lIElFRUU4MDIxMV9JQlNTX0pPSU5fVElNRU9VVCAoNyAqIEhaKQogCi0jZGVmaW5lIElFRUU4MDIxMV9QUk9CRV9ERUxBWSAoSFogLyAzMykKLSNkZWZpbmUgSUVFRTgwMjExX0NIQU5ORUxfVElNRSAoSFogLyAzMykKLSNkZWZpbmUgSUVFRTgwMjExX1BBU1NJVkVfQ0hBTk5FTF9USU1FIChIWiAvIDUpCi0jZGVmaW5lIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUgKDEwICogSFopCiAjZGVmaW5lIElFRUU4MDIxMV9JQlNTX01FUkdFX0lOVEVSVkFMICgzMCAqIEhaKQogI2RlZmluZSBJRUVFODAyMTFfSUJTU19JTkFDVElWSVRZX0xJTUlUICg2MCAqIEhaKQotI2RlZmluZSBJRUVFODAyMTFfTUVTSF9QRUVSX0lOQUNUSVZJVFlfTElNSVQgKDE4MDAgKiBIWikKIAogI2RlZmluZSBJRUVFODAyMTFfSUJTU19NQVhfU1RBX0VOVFJJRVMgMTI4CiAKIAotI2RlZmluZSBFUlBfSU5GT19VU0VfUFJPVEVDVElPTiBCSVQoMSkKLQotLyogbWdtdCBoZWFkZXIgKyAxIGJ5dGUgYWN0aW9uIGNvZGUgKi8KLSNkZWZpbmUgSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSAoMjQgKyAxKQotCi0jZGVmaW5lIElFRUU4MDIxMV9BRERCQV9QQVJBTV9QT0xJQ1lfTUFTSyAweDAwMDIKLSNkZWZpbmUgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLIDB4MDAzQwotI2RlZmluZSBJRUVFODAyMTFfQUREQkFfUEFSQU1fQlVGX1NJWkVfTUFTSyAweEZGQTAKLSNkZWZpbmUgSUVFRTgwMjExX0RFTEJBX1BBUkFNX1RJRF9NQVNLIDB4RjAwMAotI2RlZmluZSBJRUVFODAyMTFfREVMQkFfUEFSQU1fSU5JVElBVE9SX01BU0sgMHgwODAwCi0KLS8qIG5leHQgdmFsdWVzIHJlcHJlc2VudCB0aGUgYnVmZmVyIHNpemUgZm9yIEEtTVBEVSBmcmFtZS4KLSAqIEFjY29yZGluZyB0byBJRUVFODAyLjExbiBzcGVjIHNpemUgdmFyaWVzIGZyb20gOEsgdG8gNjRLIChpbiBwb3dlcnMgb2YgMikgKi8KLSNkZWZpbmUgSUVFRTgwMjExX01JTl9BTVBEVV9CVUYgMHg4Ci0jZGVmaW5lIElFRUU4MDIxMV9NQVhfQU1QRFVfQlVGIDB4NDAKLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkc3QsCi0JCQkJICAgICB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKTsKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKgotaWVlZTgwMjExX3J4X2Jzc19nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmJzc2lkLCBpbnQgZnJlcSwKLQkJICAgICB1OCAqc3NpZCwgdTggc3NpZF9sZW4pOwotc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X2Jzc19wdXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzKTsKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9maW5kX2lic3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpOwotc3RhdGljIGludCBpZWVlODAyMTFfc3RhX3dlcF9jb25maWd1cmVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBpZWVlODAyMTFfc3RhX3N0YXJ0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbik7Ci1zdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfY29uZmlnX2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSk7Ci1zdGF0aWMgdm9pZCBzdGFfcnhfYWdnX3Nlc3Npb25fdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi0KLXZvaWQgaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCi0JCQkgICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKQotewotCXNpemVfdCBsZWZ0ID0gbGVuOwotCXU4ICpwb3MgPSBzdGFydDsKLQotCW1lbXNldChlbGVtcywgMCwgc2l6ZW9mKCplbGVtcykpOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkKLQkJCXJldHVybjsKLQotCQlzd2l0Y2ggKGlkKSB7Ci0JCWNhc2UgV0xBTl9FSURfU1NJRDoKLQkJCWVsZW1zLT5zc2lkID0gcG9zOwotCQkJZWxlbXMtPnNzaWRfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6Ci0JCQllbGVtcy0+c3VwcF9yYXRlcyA9IHBvczsKLQkJCWVsZW1zLT5zdXBwX3JhdGVzX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9GSF9QQVJBTVM6Ci0JCQllbGVtcy0+ZmhfcGFyYW1zID0gcG9zOwotCQkJZWxlbXMtPmZoX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRFNfUEFSQU1TOgotCQkJZWxlbXMtPmRzX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5kc19wYXJhbXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0NGX1BBUkFNUzoKLQkJCWVsZW1zLT5jZl9wYXJhbXMgPSBwb3M7Ci0JCQllbGVtcy0+Y2ZfcGFyYW1zX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9USU06Ci0JCQllbGVtcy0+dGltID0gcG9zOwotCQkJZWxlbXMtPnRpbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfSUJTU19QQVJBTVM6Ci0JCQllbGVtcy0+aWJzc19wYXJhbXMgPSBwb3M7Ci0JCQllbGVtcy0+aWJzc19wYXJhbXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0NIQUxMRU5HRToKLQkJCWVsZW1zLT5jaGFsbGVuZ2UgPSBwb3M7Ci0JCQllbGVtcy0+Y2hhbGxlbmdlX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9XUEE6Ci0JCQlpZiAoZWxlbiA+PSA0ICYmIHBvc1swXSA9PSAweDAwICYmIHBvc1sxXSA9PSAweDUwICYmCi0JCQkgICAgcG9zWzJdID09IDB4ZjIpIHsKLQkJCQkvKiBNaWNyb3NvZnQgT1VJICgwMDo1MDpGMikgKi8KLQkJCQlpZiAocG9zWzNdID09IDEpIHsKLQkJCQkJLyogT1VJIFR5cGUgMSAtIFdQQSBJRSAqLwotCQkJCQllbGVtcy0+d3BhID0gcG9zOwotCQkJCQllbGVtcy0+d3BhX2xlbiA9IGVsZW47Ci0JCQkJfSBlbHNlIGlmIChlbGVuID49IDUgJiYgcG9zWzNdID09IDIpIHsKLQkJCQkJaWYgKHBvc1s0XSA9PSAwKSB7Ci0JCQkJCQllbGVtcy0+d21tX2luZm8gPSBwb3M7Ci0JCQkJCQllbGVtcy0+d21tX2luZm9fbGVuID0gZWxlbjsKLQkJCQkJfSBlbHNlIGlmIChwb3NbNF0gPT0gMSkgewotCQkJCQkJZWxlbXMtPndtbV9wYXJhbSA9IHBvczsKLQkJCQkJCWVsZW1zLT53bW1fcGFyYW1fbGVuID0gZWxlbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1JTTjoKLQkJCWVsZW1zLT5yc24gPSBwb3M7Ci0JCQllbGVtcy0+cnNuX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9FUlBfSU5GTzoKLQkJCWVsZW1zLT5lcnBfaW5mbyA9IHBvczsKLQkJCWVsZW1zLT5lcnBfaW5mb19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRVhUX1NVUFBfUkFURVM6Ci0JCQllbGVtcy0+ZXh0X3N1cHBfcmF0ZXMgPSBwb3M7Ci0JCQllbGVtcy0+ZXh0X3N1cHBfcmF0ZXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6Ci0JCQllbGVtcy0+aHRfY2FwX2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+aHRfY2FwX2VsZW1fbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0hUX0VYVFJBX0lORk86Ci0JCQllbGVtcy0+aHRfaW5mb19lbGVtID0gcG9zOwotCQkJZWxlbXMtPmh0X2luZm9fZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoKLQkJCWVsZW1zLT5tZXNoX2lkID0gcG9zOwotCQkJZWxlbXMtPm1lc2hfaWRfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOgotCQkJZWxlbXMtPm1lc2hfY29uZmlnID0gcG9zOwotCQkJZWxlbXMtPm1lc2hfY29uZmlnX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QRUVSX0xJTks6Ci0JCQllbGVtcy0+cGVlcl9saW5rID0gcG9zOwotCQkJZWxlbXMtPnBlZXJfbGlua19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUFJFUToKLQkJCWVsZW1zLT5wcmVxID0gcG9zOwotCQkJZWxlbXMtPnByZXFfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1BSRVA6Ci0JCQllbGVtcy0+cHJlcCA9IHBvczsKLQkJCWVsZW1zLT5wcmVwX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QRVJSOgotCQkJZWxlbXMtPnBlcnIgPSBwb3M7Ci0JCQllbGVtcy0+cGVycl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0g6Ci0JCQllbGVtcy0+Y2hfc3dpdGNoX2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+Y2hfc3dpdGNoX2VsZW1fbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1FVSUVUOgotCQkJaWYgKCFlbGVtcy0+cXVpZXRfZWxlbSkgewotCQkJCWVsZW1zLT5xdWlldF9lbGVtID0gcG9zOwotCQkJCWVsZW1zLT5xdWlldF9lbGVtX2xlbiA9IGVsZW47Ci0JCQl9Ci0JCQllbGVtcy0+bnVtX29mX3F1aWV0X2VsZW0rKzsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0NPVU5UUlk6Ci0JCQllbGVtcy0+Y291bnRyeV9lbGVtID0gcG9zOwotCQkJZWxlbXMtPmNvdW50cnlfZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6Ci0JCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtID0gcG9zOwotCQkJZWxlbXMtPnB3cl9jb25zdHJfZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWxlZnQgLT0gZWxlbjsKLQkJcG9zICs9IGVsZW47Ci0JfQotfQotCi0KKy8qIHV0aWxzICovCiBzdGF0aWMgaW50IGVjdzJjdyhpbnQgZWN3KQogewogCXJldHVybiAoMSA8PCBlY3cpIC0gMTsKIH0KIAotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX2RlZl93bW1fcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcywKLQkJCQkJIGludCBpYnNzKQorc3RhdGljIHU4ICppZWVlODAyMTFfYnNzX2dldF9pZShzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzLCB1OCBpZSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0JaW50IGksIGhhdmVfaGlnaGVyX3RoYW5fMTFtYml0ID0gMDsKKwl1OCAqZW5kLCAqcG9zOwogCisJcG9zID0gYnNzLT5pZXM7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwllbmQgPSBwb3MgKyBic3MtPmllc19sZW47CiAKLQkvKiBjZi4gSUVFRSA4MDIuMTEgOS4yLjEyICovCi0JZm9yIChpID0gMDsgaSA8IGJzcy0+c3VwcF9yYXRlc19sZW47IGkrKykKLQkJaWYgKChic3MtPnN1cHBfcmF0ZXNbaV0gJiAweDdmKSAqIDUgPiAxMTApCi0JCQloYXZlX2hpZ2hlcl90aGFuXzExbWJpdCA9IDE7Ci0KLQlpZiAobG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haICYmCi0JICAgIGhhdmVfaGlnaGVyX3RoYW5fMTFtYml0KQotCQlzZGF0YS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERTsKLQllbHNlCi0JCXNkYXRhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERTsKLQotCi0JaWYgKGxvY2FsLT5vcHMtPmNvbmZfdHgpIHsKLQkJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgcXBhcmFtOwotCi0JCW1lbXNldCgmcXBhcmFtLCAwLCBzaXplb2YocXBhcmFtKSk7Ci0KLQkJcXBhcmFtLmFpZnMgPSAyOwotCi0JCWlmIChsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogJiYKLQkJICAgICEoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERSkpCi0JCQlxcGFyYW0uY3dfbWluID0gMzE7Ci0JCWVsc2UKLQkJCXFwYXJhbS5jd19taW4gPSAxNTsKLQotCQlxcGFyYW0uY3dfbWF4ID0gMTAyMzsKLQkJcXBhcmFtLnR4b3AgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBsb2NhbF90b19odyhsb2NhbCktPnF1ZXVlczsgaSsrKQotCQkJbG9jYWwtPm9wcy0+Y29uZl90eChsb2NhbF90b19odyhsb2NhbCksIGksICZxcGFyYW0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEsCi0JCQkJICAgICB1OCAqd21tX3BhcmFtLCBzaXplX3Qgd21tX3BhcmFtX2xlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zIHBhcmFtczsKLQlzaXplX3QgbGVmdDsKLQlpbnQgY291bnQ7Ci0JdTggKnBvczsKLQotCWlmICghKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfV01NX0VOQUJMRUQpKQotCQlyZXR1cm47Ci0KLQlpZiAoIXdtbV9wYXJhbSkKLQkJcmV0dXJuOwotCi0JaWYgKHdtbV9wYXJhbV9sZW4gPCA4IHx8IHdtbV9wYXJhbVs1XSAvKiB2ZXJzaW9uICovICE9IDEpCi0JCXJldHVybjsKLQljb3VudCA9IHdtbV9wYXJhbVs2XSAmIDB4MGY7Ci0JaWYgKGNvdW50ID09IGlmc3RhLT53bW1fbGFzdF9wYXJhbV9zZXQpCi0JCXJldHVybjsKLQlpZnN0YS0+d21tX2xhc3RfcGFyYW1fc2V0ID0gY291bnQ7Ci0KLQlwb3MgPSB3bW1fcGFyYW0gKyA4OwotCWxlZnQgPSB3bW1fcGFyYW1fbGVuIC0gODsKLQotCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7Ci0KLQlpZiAoIWxvY2FsLT5vcHMtPmNvbmZfdHgpCi0JCXJldHVybjsKLQotCWxvY2FsLT53bW1fYWNtID0gMDsKLQlmb3IgKDsgbGVmdCA+PSA0OyBsZWZ0IC09IDQsIHBvcyArPSA0KSB7Ci0JCWludCBhY2kgPSAocG9zWzBdID4+IDUpICYgMHgwMzsKLQkJaW50IGFjbSA9IChwb3NbMF0gPj4gNCkgJiAweDAxOwotCQlpbnQgcXVldWU7Ci0KLQkJc3dpdGNoIChhY2kpIHsKLQkJY2FzZSAxOgotCQkJcXVldWUgPSAzOwotCQkJaWYgKGFjbSkKLQkJCQlsb2NhbC0+d21tX2FjbSB8PSBCSVQoMCkgfCBCSVQoMyk7CisJd2hpbGUgKHBvcyArIDEgPCBlbmQpIHsKKwkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBlbmQpCiAJCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcXVldWUgPSAxOwotCQkJaWYgKGFjbSkKLQkJCQlsb2NhbC0+d21tX2FjbSB8PSBCSVQoNCkgfCBCSVQoNSk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcXVldWUgPSAwOwotCQkJaWYgKGFjbSkKLQkJCQlsb2NhbC0+d21tX2FjbSB8PSBCSVQoNikgfCBCSVQoNyk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQlkZWZhdWx0OgotCQkJcXVldWUgPSAyOwotCQkJaWYgKGFjbSkKLQkJCQlsb2NhbC0+d21tX2FjbSB8PSBCSVQoMSkgfCBCSVQoMik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBhcmFtcy5haWZzID0gcG9zWzBdICYgMHgwZjsKLQkJcGFyYW1zLmN3X21heCA9IGVjdzJjdygocG9zWzFdICYgMHhmMCkgPj4gNCk7Ci0JCXBhcmFtcy5jd19taW4gPSBlY3cyY3cocG9zWzFdICYgMHgwZik7Ci0JCXBhcmFtcy50eG9wID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHBvcyArIDIpOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogV01NIHF1ZXVlPSVkIGFjaT0lZCBhY209JWQgYWlmcz0lZCAiCi0JCSAgICAgICAiY1dtaW49JWQgY1dtYXg9JWQgdHhvcD0lZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcXVldWUsIGFjaSwgYWNtLCBwYXJhbXMuYWlmcywgcGFyYW1zLmN3X21pbiwKLQkJICAgICAgIHBhcmFtcy5jd19tYXgsIHBhcmFtcy50eG9wKTsKLSNlbmRpZgotCQkvKiBUT0RPOiBoYW5kbGUgQUNNIChibG9jayBUWCwgZmFsbGJhY2sgdG8gbmV4dCBsb3dlc3QgYWxsb3dlZAotCQkgKiBBQyBmb3Igbm93KSAqLwotCQlpZiAobG9jYWwtPm9wcy0+Y29uZl90eChsb2NhbF90b19odyhsb2NhbCksIHF1ZXVlLCAmcGFyYW1zKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gc2V0IFRYIHF1ZXVlICIKLQkJCSAgICAgICAicGFyYW1ldGVycyBmb3IgcXVldWUgJWRcbiIsIGRldi0+bmFtZSwgcXVldWUpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdTMyIGllZWU4MDIxMV9oYW5kbGVfcHJvdGVjdF9wcmVhbWIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSAgIGJvb2wgdXNlX3Byb3RlY3Rpb24sCi0JCQkJCSAgIGJvb2wgdXNlX3Nob3J0X3ByZWFtYmxlKQotewotCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJnNkYXRhLT5ic3NfY29uZjsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwotCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0jZW5kaWYKLQl1MzIgY2hhbmdlZCA9IDA7Ci0KLQlpZiAodXNlX3Byb3RlY3Rpb24gIT0gYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ1RTIHByb3RlY3Rpb24gJXMgKEJTU0lEPSIKLQkJCSAgICAgICAiJXMpXG4iLAotCQkJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsCi0JCQkgICAgICAgdXNlX3Byb3RlY3Rpb24gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkJICAgICAgIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCkpOwotCQl9Ci0jZW5kaWYKLQkJYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCA9IHVzZV9wcm90ZWN0aW9uOwotCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVDsKKwkJaWYgKHBvc1swXSA9PSBpZSkKKwkJCXJldHVybiBwb3M7CisJCXBvcyArPSAyICsgcG9zWzFdOwogCX0KIAotCWlmICh1c2Vfc2hvcnRfcHJlYW1ibGUgIT0gYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc3dpdGNoZWQgdG8gJXMgYmFya2VyIHByZWFtYmxlIgotCQkJICAgICAgICIgKEJTU0lEPSVzKVxuIiwKLQkJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLAotCQkJICAgICAgIHVzZV9zaG9ydF9wcmVhbWJsZSA/ICJzaG9ydCIgOiAibG9uZyIsCi0JCQkgICAgICAgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7Ci0JCX0KLSNlbmRpZgotCQlic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlID0gdXNlX3Nob3J0X3ByZWFtYmxlOwotCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRTsKLQl9Ci0KLQlyZXR1cm4gY2hhbmdlZDsKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHUzMiBpZWVlODAyMTFfaGFuZGxlX2VycF9pZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkgICB1OCBlcnBfdmFsdWUpCi17Ci0JYm9vbCB1c2VfcHJvdGVjdGlvbiA9IChlcnBfdmFsdWUgJiBXTEFOX0VSUF9VU0VfUFJPVEVDVElPTikgIT0gMDsKLQlib29sIHVzZV9zaG9ydF9wcmVhbWJsZSA9IChlcnBfdmFsdWUgJiBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUpID09IDA7Ci0KLQlyZXR1cm4gaWVlZTgwMjExX2hhbmRsZV9wcm90ZWN0X3ByZWFtYihzZGF0YSwKLQkJCXVzZV9wcm90ZWN0aW9uLCB1c2Vfc2hvcnRfcHJlYW1ibGUpOwotfQotCi1zdGF0aWMgdTMyIGllZWU4MDIxMV9oYW5kbGVfYnNzX2NhcGFiaWxpdHkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzKQotewotCXUzMiBjaGFuZ2VkID0gMDsKLQotCWlmIChic3MtPmhhc19lcnBfdmFsdWUpCi0JCWNoYW5nZWQgfD0gaWVlZTgwMjExX2hhbmRsZV9lcnBfaWUoc2RhdGEsIGJzcy0+ZXJwX3ZhbHVlKTsKLQllbHNlIHsKLQkJdTE2IGNhcGFiID0gYnNzLT5jYXBhYmlsaXR5OwotCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9oYW5kbGVfcHJvdGVjdF9wcmVhbWIoc2RhdGEsIGZhbHNlLAotCQkJCShjYXBhYiAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkgIT0gMCk7Ci0JfQotCi0JcmV0dXJuIGNoYW5nZWQ7Ci19Ci0KLWludCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX2h0X2luZm8oc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9pZSwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pCi17Ci0KLQlpZiAoaHRfaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldChodF9pbmZvLCAwLCBzaXplb2YoKmh0X2luZm8pKTsKLQotCWlmIChodF9jYXBfaWUpIHsKLQkJdTggYW1wZHVfaW5mbyA9IGh0X2NhcF9pZS0+YW1wZHVfcGFyYW1zX2luZm87Ci0KLQkJaHRfaW5mby0+aHRfc3VwcG9ydGVkID0gMTsKLQkJaHRfaW5mby0+Y2FwID0gbGUxNl90b19jcHUoaHRfY2FwX2llLT5jYXBfaW5mbyk7Ci0JCWh0X2luZm8tPmFtcGR1X2ZhY3RvciA9Ci0JCQlhbXBkdV9pbmZvICYgSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9GQUNUT1I7Ci0JCWh0X2luZm8tPmFtcGR1X2RlbnNpdHkgPQotCQkJKGFtcGR1X2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkpID4+IDI7Ci0JCW1lbWNweShodF9pbmZvLT5zdXBwX21jc19zZXQsIGh0X2NhcF9pZS0+c3VwcF9tY3Nfc2V0LCAxNik7Ci0JfSBlbHNlCi0JCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGllZWU4MDIxMV9odF9hZGR0X2luZm9faWVfdG9faHRfYnNzX2luZm8oCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqaHRfYWRkX2luZm9faWUsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2Jzc19pbmZvICpic3NfaW5mbykKLXsKLQlpZiAoYnNzX2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoYnNzX2luZm8sIDAsIHNpemVvZigqYnNzX2luZm8pKTsKLQotCWlmIChodF9hZGRfaW5mb19pZSkgewotCQl1MTYgb3BfbW9kZTsKLQkJb3BfbW9kZSA9IGxlMTZfdG9fY3B1KGh0X2FkZF9pbmZvX2llLT5vcGVyYXRpb25fbW9kZSk7Ci0KLQkJYnNzX2luZm8tPnByaW1hcnlfY2hhbm5lbCA9IGh0X2FkZF9pbmZvX2llLT5jb250cm9sX2NoYW47Ci0JCWJzc19pbmZvLT5ic3NfY2FwID0gaHRfYWRkX2luZm9faWUtPmh0X3BhcmFtOwotCQlic3NfaW5mby0+YnNzX29wX21vZGUgPSAodTgpKG9wX21vZGUgJiAweGZmKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9zZW5kX2Fzc29jaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQotewotCWNoYXIgKmJ1ZjsKLQlzaXplX3QgbGVuOwotCWludCBpOwotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQotCWlmICghaWZzdGEtPmFzc29jcmVxX2llcyAmJiAhaWZzdGEtPmFzc29jcmVzcF9pZXMpCi0JCXJldHVybjsKLQotCWJ1ZiA9IGttYWxsb2MoNTAgKyAyICogKGlmc3RhLT5hc3NvY3JlcV9pZXNfbGVuICsKLQkJCQlpZnN0YS0+YXNzb2NyZXNwX2llc19sZW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuOwotCi0JbGVuID0gc3ByaW50ZihidWYsICJBU1NPQ0lORk8oIik7Ci0JaWYgKGlmc3RhLT5hc3NvY3JlcV9pZXMpIHsKLQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUmVxSUVzPSIpOwotCQlmb3IgKGkgPSAwOyBpIDwgaWZzdGEtPmFzc29jcmVxX2llc19sZW47IGkrKykgewotCQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJTAyeCIsCi0JCQkJICAgICAgIGlmc3RhLT5hc3NvY3JlcV9pZXNbaV0pOwotCQl9Ci0JfQotCWlmIChpZnN0YS0+YXNzb2NyZXNwX2llcykgewotCQlpZiAoaWZzdGEtPmFzc29jcmVxX2llcykKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiAiKTsKLQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUmVzcElFcz0iKTsKLQkJZm9yIChpID0gMDsgaSA8IGlmc3RhLT5hc3NvY3Jlc3BfaWVzX2xlbjsgaSsrKSB7Ci0JCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlMDJ4IiwKLQkJCQkgICAgICAgaWZzdGEtPmFzc29jcmVzcF9pZXNbaV0pOwotCQl9Ci0JfQotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIikiKTsKLQotCWlmIChsZW4gPiBJV19DVVNUT01fTUFYKSB7Ci0JCWxlbiA9IHNwcmludGYoYnVmLCAiQVNTT0NSRVNQSUU9Iik7Ci0JCWZvciAoaSA9IDA7IGkgPCBpZnN0YS0+YXNzb2NyZXNwX2llc19sZW47IGkrKykgewotCQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJTAyeCIsCi0JCQkJICAgICAgIGlmc3RhLT5hc3NvY3Jlc3BfaWVzW2ldKTsKLQkJfQotCX0KLQotCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gbGVuOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKLQotCWtmcmVlKGJ1Zik7Ci19Ci0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NldF9hc3NvY2lhdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEsCi0JCQkJICAgICBib29sIGFzc29jKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmbG9jYWxfdG9faHcobG9jYWwpLT5jb25mOwotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl1MzIgY2hhbmdlZCA9IEJTU19DSEFOR0VEX0FTU09DOwotCi0JaWYgKGFzc29jKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOwotCi0JCWlmc3RhLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0FTU09DSUFURUQ7Ci0KLQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpCi0JCQlyZXR1cm47Ci0KLQkJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQoZGV2LCBpZnN0YS0+YnNzaWQsCi0JCQkJCSAgIGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxLAotCQkJCQkgICBpZnN0YS0+c3NpZCwgaWZzdGEtPnNzaWRfbGVuKTsKLQkJaWYgKGJzcykgewotCQkJLyogc2V0IHRpbWluZyBpbmZvcm1hdGlvbiAqLwotCQkJc2RhdGEtPmJzc19jb25mLmJlYWNvbl9pbnQgPSBic3MtPmJlYWNvbl9pbnQ7Ci0JCQlzZGF0YS0+YnNzX2NvbmYudGltZXN0YW1wID0gYnNzLT50aW1lc3RhbXA7Ci0JCQlzZGF0YS0+YnNzX2NvbmYuZHRpbV9wZXJpb2QgPSBic3MtPmR0aW1fcGVyaW9kOwotCi0JCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9oYW5kbGVfYnNzX2NhcGFiaWxpdHkoc2RhdGEsIGJzcyk7Ci0KLQkJCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBic3MpOwotCQl9Ci0KLQkJaWYgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfU1VQUE9SVF9IVF9NT0RFKSB7Ci0JCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0hUOwotCQkJc2RhdGEtPmJzc19jb25mLmFzc29jX2h0ID0gMTsKLQkJCXNkYXRhLT5ic3NfY29uZi5odF9jb25mID0gJmNvbmYtPmh0X2NvbmY7Ci0JCQlzZGF0YS0+YnNzX2NvbmYuaHRfYnNzX2NvbmYgPSAmY29uZi0+aHRfYnNzX2NvbmY7Ci0JCX0KLQotCQlpZnN0YS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NUQV9QUkVWX0JTU0lEX1NFVDsKLQkJbWVtY3B5KGlmc3RhLT5wcmV2X2Jzc2lkLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKLQkJaWVlZTgwMjExX3N0YV9zZW5kX2Fzc29jaW5mbyhkZXYsIGlmc3RhKTsKLQl9IGVsc2UgewotCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCQlpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhkZXYsIGlmc3RhLT5ic3NpZCk7Ci0JCWlmc3RhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9BU1NPQ0lBVEVEOwotCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhkZXYpOwotCi0JCXNkYXRhLT5ic3NfY29uZi5hc3NvY19odCA9IDA7Ci0JCXNkYXRhLT5ic3NfY29uZi5odF9jb25mID0gTlVMTDsKLQkJc2RhdGEtPmJzc19jb25mLmh0X2Jzc19jb25mID0gTlVMTDsKLQotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKLQl9Ci0JaWZzdGEtPmxhc3RfcHJvYmUgPSBqaWZmaWVzOwotCWllZWU4MDIxMV9sZWRfYXNzb2MobG9jYWwsIGFzc29jKTsKLQotCXNkYXRhLT5ic3NfY29uZi5hc3NvYyA9IGFzc29jOwotCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKLQotCWlmIChhc3NvYykKLQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwotCi0Jd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEsIGludCBkZWF1dGgpCi17Ci0JaWYgKGRlYXV0aCkKLQkJaWZzdGEtPmF1dGhfdHJpZXMgPSAwOwotCWlmc3RhLT5hc3NvY190cmllcyA9IDA7Ci0JaWVlZTgwMjExX3NldF9hc3NvY2lhdGVkKGRldiwgaWZzdGEsIDApOwotfQotCi12b2lkIGllZWU4MDIxMV9zdGFfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgaW50IGVuY3J5cHQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0KLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0Jc2tiLT5kZXYgPSBzZGF0YS0+bG9jYWwtPm1kZXY7Ci0Jc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgMCk7Ci0Jc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIDApOwotCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIDApOwotCi0Jc2tiLT5paWYgPSBzZGF0YS0+ZGV2LT5pZmluZGV4OwotCXNrYi0+ZG9fbm90X2VuY3J5cHQgPSAhZW5jcnlwdDsKLQotCWRldl9xdWV1ZV94bWl0KHNrYik7Ci19Ci0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwKLQkJCQlpbnQgdHJhbnNhY3Rpb24sIHU4ICpleHRyYSwgc2l6ZV90IGV4dHJhX2xlbiwKLQkJCQlpbnQgZW5jcnlwdCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKwotCQkJICAgIHNpemVvZigqbWdtdCkgKyA2ICsgZXh0cmFfbGVuKTsKLQlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGF1dGggIgotCQkgICAgICAgImZyYW1lXG4iLCBkZXYtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCAyNCArIDYpOwotCW1lbXNldChtZ210LCAwLCAyNCArIDYpOwotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9BVVRIKTsKLQlpZiAoZW5jcnlwdCkKLQkJbWdtdC0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOwotCW1lbWNweShtZ210LT5kYSwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPnNhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmJzc2lkLCBpZnN0YS0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZ210LT51LmF1dGguYXV0aF9hbGcgPSBjcHVfdG9fbGUxNihpZnN0YS0+YXV0aF9hbGcpOwotCW1nbXQtPnUuYXV0aC5hdXRoX3RyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYodHJhbnNhY3Rpb24pOwotCWlmc3RhLT5hdXRoX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24gKyAxOwotCW1nbXQtPnUuYXV0aC5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KDApOwotCWlmIChleHRyYSkKLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBleHRyYV9sZW4pLCBleHRyYSwgZXh0cmFfbGVuKTsKLQotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIGVuY3J5cHQpOwotfQotCi0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9hdXRoZW50aWNhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCi17Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0KLQlpZnN0YS0+YXV0aF90cmllcysrOwotCWlmIChpZnN0YS0+YXV0aF90cmllcyA+IElFRUU4MDIxMV9BVVRIX01BWF9UUklFUykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGF1dGhlbnRpY2F0aW9uIHdpdGggQVAgJXMiCi0JCSAgICAgICAiIHRpbWVkIG91dFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7Ci0JCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9ESVNBQkxFRDsKLQkJcmV0dXJuOwotCX0KLQotCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9BVVRIRU5USUNBVEU7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhdXRoZW50aWNhdGUgd2l0aCBBUCAlc1xuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBpZnN0YS0+YnNzaWQpKTsKLQotCWllZWU4MDIxMV9zZW5kX2F1dGgoZGV2LCBpZnN0YSwgMSwgTlVMTCwgMCwgMCk7Ci0KLQltb2RfdGltZXIoJmlmc3RhLT50aW1lciwgamlmZmllcyArIElFRUU4MDIxMV9BVVRIX1RJTUVPVVQpOwotfQotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9jb21wYXRpYmxlX3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzLAorc3RhdGljIGludCBpZWVlODAyMTFfY29tcGF0aWJsZV9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzLAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAogCQkJCSAgICAgIHU2NCAqcmF0ZXMpCiB7CkBAIC03MDMsMTYgKzkzLDE1MyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYXNzb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQorLyogYWxzbyB1c2VkIGJ5IG1lc2ggY29kZSAqLwordTY0IGllZWU4MDIxMV9zdGFfZ2V0X3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKKwkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKmJpdHJhdGVzOworCXNpemVfdCBudW1fcmF0ZXM7CisJdTY0IHN1cHBfcmF0ZXM7CisJaW50IGksIGo7CisJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdOworCisJaWYgKCFzYmFuZCkgeworCQlXQVJOX09OKDEpOworCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07CisJfQorCisJYml0cmF0ZXMgPSBzYmFuZC0+Yml0cmF0ZXM7CisJbnVtX3JhdGVzID0gc2JhbmQtPm5fYml0cmF0ZXM7CisJc3VwcF9yYXRlcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGVsZW1zLT5zdXBwX3JhdGVzX2xlbiArCisJCSAgICAgZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbjsgaSsrKSB7CisJCXU4IHJhdGUgPSAwOworCQlpbnQgb3duX3JhdGU7CisJCWlmIChpIDwgZWxlbXMtPnN1cHBfcmF0ZXNfbGVuKQorCQkJcmF0ZSA9IGVsZW1zLT5zdXBwX3JhdGVzW2ldOworCQllbHNlIGlmIChlbGVtcy0+ZXh0X3N1cHBfcmF0ZXMpCisJCQlyYXRlID0gZWxlbXMtPmV4dF9zdXBwX3JhdGVzCisJCQkJW2kgLSBlbGVtcy0+c3VwcF9yYXRlc19sZW5dOworCQlvd25fcmF0ZSA9IDUgKiAocmF0ZSAmIDB4N2YpOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX3JhdGVzOyBqKyspCisJCQlpZiAoYml0cmF0ZXNbal0uYml0cmF0ZSA9PSBvd25fcmF0ZSkKKwkJCQlzdXBwX3JhdGVzIHw9IEJJVChqKTsKKwl9CisJcmV0dXJuIHN1cHBfcmF0ZXM7Cit9CisKKy8qIGZyYW1lIHNlbmRpbmcgZnVuY3Rpb25zICovCisKKy8qIGFsc28gdXNlZCBieSBzY2FubmluZyBjb2RlICovCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTggKmRzdCwKKwkJCSAgICAgIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKnBvcywgKmllczsKKwl1OCAqcG9zLCAqc3VwcF9yYXRlcywgKmVzdXBwX3JhdGVzID0gTlVMTDsKKwlpbnQgaTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsgc2l6ZW9mKCptZ210KSArIDIwMCk7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBwcm9iZSAiCisJCSAgICAgICAicmVxdWVzdFxuIiwgc2RhdGEtPmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKKwltZW1zZXQobWdtdCwgMCwgMjQpOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJCSAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWlmIChkc3QpIHsKKwkJbWVtY3B5KG1nbXQtPmRhLCBkc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1nbXQtPmJzc2lkLCBkc3QsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQltZW1zZXQobWdtdC0+ZGEsIDB4ZmYsIEVUSF9BTEVOKTsKKwkJbWVtc2V0KG1nbXQtPmJzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJfQorCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc3NpZF9sZW4pOworCSpwb3MrKyA9IFdMQU5fRUlEX1NTSUQ7CisJKnBvcysrID0gc3NpZF9sZW47CisJbWVtY3B5KHBvcywgc3NpZCwgc3NpZF9sZW4pOworCisJc3VwcF9yYXRlcyA9IHNrYl9wdXQoc2tiLCAyKTsKKwlzdXBwX3JhdGVzWzBdID0gV0xBTl9FSURfU1VQUF9SQVRFUzsKKwlzdXBwX3JhdGVzWzFdID0gMDsKKwlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUgPSAmc2JhbmQtPmJpdHJhdGVzW2ldOworCQlpZiAoZXN1cHBfcmF0ZXMpIHsKKwkJCXBvcyA9IHNrYl9wdXQoc2tiLCAxKTsKKwkJCWVzdXBwX3JhdGVzWzFdKys7CisJCX0gZWxzZSBpZiAoc3VwcF9yYXRlc1sxXSA9PSA4KSB7CisJCQllc3VwcF9yYXRlcyA9IHNrYl9wdXQoc2tiLCAzKTsKKwkJCWVzdXBwX3JhdGVzWzBdID0gV0xBTl9FSURfRVhUX1NVUFBfUkFURVM7CisJCQllc3VwcF9yYXRlc1sxXSA9IDE7CisJCQlwb3MgPSAmZXN1cHBfcmF0ZXNbMl07CisJCX0gZWxzZSB7CisJCQlwb3MgPSBza2JfcHV0KHNrYiwgMSk7CisJCQlzdXBwX3JhdGVzWzFdKys7CisJCX0KKwkJKnBvcyA9IHJhdGUtPmJpdHJhdGUgLyA1OworCX0KKworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2F1dGgoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLAorCQkJCWludCB0cmFuc2FjdGlvbiwgdTggKmV4dHJhLCBzaXplX3QgZXh0cmFfbGVuLAorCQkJCWludCBlbmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKworCQkJICAgIHNpemVvZigqbWdtdCkgKyA2ICsgZXh0cmFfbGVuKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGF1dGggIgorCQkgICAgICAgImZyYW1lXG4iLCBzZGF0YS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CisKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgMjQgKyA2KTsKKwltZW1zZXQobWdtdCwgMCwgMjQgKyA2KTsKKwltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BVVRIKTsKKwlpZiAoZW5jcnlwdCkKKwkJbWdtdC0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOworCW1lbWNweShtZ210LT5kYSwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5ic3NpZCwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7CisJbWdtdC0+dS5hdXRoLmF1dGhfYWxnID0gY3B1X3RvX2xlMTYoaWZzdGEtPmF1dGhfYWxnKTsKKwltZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KHRyYW5zYWN0aW9uKTsKKwlpZnN0YS0+YXV0aF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uICsgMTsKKwltZ210LT51LmF1dGguc3RhdHVzX2NvZGUgPSBjcHVfdG9fbGUxNigwKTsKKwlpZiAoZXh0cmEpCisJCW1lbWNweShza2JfcHV0KHNrYiwgZXh0cmFfbGVuKSwgZXh0cmEsIGV4dHJhX2xlbik7CisKKwlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IsIGVuY3J5cHQpOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXU4ICpwb3MsICppZXMsICpodF9hZGRfaWU7CiAJaW50IGksIGxlbiwgY291bnQsIHJhdGVzX2xlbiwgc3VwcF9yYXRlc19sZW47CiAJdTE2IGNhcGFiOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CiAJaW50IHdtbSA9IDA7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJdTY0IHJhdGVzID0gMDsKQEAgLTcyMiw3ICsyNDksNyBAQAogCQkJICAgIGlmc3RhLT5zc2lkX2xlbik7CiAJaWYgKCFza2IpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBhc3NvYyAiCi0JCSAgICAgICAiZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCSAgICAgICAiZnJhbWVcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKQEAgLTczOCwxMyArMjY1LDEzIEBACiAJCQljYXBhYiB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7CiAJfQogCi0JYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQoZGV2LCBpZnN0YS0+YnNzaWQsCisJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQobG9jYWwsIGlmc3RhLT5ic3NpZCwKIAkJCQkgICBsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcSwKIAkJCQkgICBpZnN0YS0+c3NpZCwgaWZzdGEtPnNzaWRfbGVuKTsKIAlpZiAoYnNzKSB7CiAJCWlmIChic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKIAkJCWNhcGFiIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCQlpZiAoYnNzLT53bW1faWUpCisJCWlmIChic3MtPndtbV91c2VkKQogCQkJd21tID0gMTsKIAogCQkvKiBnZXQgYWxsIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZCB0aGUgQVAgYXMKQEAgLTc2NiwxMyArMjkzLDEzIEBACiAJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKIAltZW1zZXQobWdtdCwgMCwgMjQpOwogCW1lbWNweShtZ210LT5kYSwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPnNhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShtZ210LT5ic3NpZCwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7CiAKIAlpZiAoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9QUkVWX0JTU0lEX1NFVCkgewogCQlza2JfcHV0KHNrYiwgMTApOwotCQltZ210LT5mcmFtZV9jb250cm9sID0gSUVFRTgwMjExX0ZDKElFRUU4MDIxMV9GVFlQRV9NR01ULAotCQkJCQkJICAgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKTsKKwkJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKTsKIAkJbWdtdC0+dS5yZWFzc29jX3JlcS5jYXBhYl9pbmZvID0gY3B1X3RvX2xlMTYoY2FwYWIpOwogCQltZ210LT51LnJlYXNzb2NfcmVxLmxpc3Rlbl9pbnRlcnZhbCA9CiAJCQkJY3B1X3RvX2xlMTYobG9jYWwtPmh3LmNvbmYubGlzdGVuX2ludGVydmFsKTsKQEAgLTc4MCw4ICszMDcsOCBAQAogCQkgICAgICAgRVRIX0FMRU4pOwogCX0gZWxzZSB7CiAJCXNrYl9wdXQoc2tiLCA0KTsKLQkJbWdtdC0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOworCQltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKTsKIAkJbWdtdC0+dS5hc3NvY19yZXEuY2FwYWJfaW5mbyA9IGNwdV90b19sZTE2KGNhcGFiKTsKIAkJbWdtdC0+dS5yZWFzc29jX3JlcS5saXN0ZW5faW50ZXJ2YWwgPQogCQkJCWNwdV90b19sZTE2KGxvY2FsLT5ody5jb25mLmxpc3Rlbl9pbnRlcnZhbCk7CkBAIC04NjYsOSArMzkzLDEwIEBACiAKIAkvKiB3bW0gc3VwcG9ydCBpcyBhIG11c3QgdG8gSFQgKi8KIAlpZiAod21tICYmIChpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX1dNTV9FTkFCTEVEKSAmJgotCSAgICBzYmFuZC0+aHRfaW5mby5odF9zdXBwb3J0ZWQgJiYgYnNzLT5odF9hZGRfaWUpIHsKKwkgICAgc2JhbmQtPmh0X2luZm8uaHRfc3VwcG9ydGVkICYmCisJICAgIChodF9hZGRfaWUgPSBpZWVlODAyMTFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX0hUX0VYVFJBX0lORk8pKSkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqaHRfYWRkX2luZm8gPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvICopYnNzLT5odF9hZGRfaWU7CisJCQkoc3RydWN0IGllZWU4MDIxMV9odF9hZGR0X2luZm8gKilodF9hZGRfaWU7CiAJCXUxNiBjYXAgPSBzYmFuZC0+aHRfaW5mby5jYXA7CiAJCV9fbGUxNiB0bXA7CiAJCXUzMiBmbGFncyA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmZsYWdzOwpAQCAtOTA3LDIxICs0MzUsMjIgQEAKIAlpZiAoaWZzdGEtPmFzc29jcmVxX2llcykKIAkJbWVtY3B5KGlmc3RhLT5hc3NvY3JlcV9pZXMsIGllcywgaWZzdGEtPmFzc29jcmVxX2llc19sZW4pOwogCi0JaWVlZTgwMjExX3N0YV90eChkZXYsIHNrYiwgMCk7CisJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiLCAwKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9kZWF1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwgdTE2IHJlYXNvbikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2RlYXV0aF9kaXNhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJICAgdTE2IHN0eXBlLCB1MTYgcmVhc29uKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAogCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsgc2l6ZW9mKCptZ210KSk7CiAJaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBkZWF1dGggIgotCQkgICAgICAgImZyYW1lXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICIKKwkJICAgICAgICJkZWF1dGgvZGlzYXNzb2MgZnJhbWVcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKQEAgLTkyOSw1MSArNDU4LDQzNCBAQAogCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCAyNCk7CiAJbWVtc2V0KG1nbXQsIDAsIDI0KTsKIAltZW1jcHkobWdtdC0+ZGEsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkobWdtdC0+YnNzaWQsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOworCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IHN0eXBlKTsKIAlza2JfcHV0KHNrYiwgMik7CisJLyogdS5kZWF1dGgucmVhc29uX2NvZGUgPT0gdS5kaXNhc3NvYy5yZWFzb25fY29kZSAqLwogCW1nbXQtPnUuZGVhdXRoLnJlYXNvbl9jb2RlID0gY3B1X3RvX2xlMTYocmVhc29uKTsKIAotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKKy8qIE1MTUUgKi8KK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfZGVmX3dtbV9wYXJhbXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCWludCBpLCBoYXZlX2hpZ2hlcl90aGFuXzExbWJpdCA9IDA7CisKKwkvKiBjZi4gSUVFRSA4MDIuMTEgOS4yLjEyICovCisJZm9yIChpID0gMDsgaSA8IGJzcy0+c3VwcF9yYXRlc19sZW47IGkrKykKKwkJaWYgKChic3MtPnN1cHBfcmF0ZXNbaV0gJiAweDdmKSAqIDUgPiAxMTApCisJCQloYXZlX2hpZ2hlcl90aGFuXzExbWJpdCA9IDE7CisKKwlpZiAobG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haICYmCisJICAgIGhhdmVfaGlnaGVyX3RoYW5fMTFtYml0KQorCQlzZGF0YS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERTsKKwllbHNlCisJCXNkYXRhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERTsKKworCWllZWU4MDIxMV9zZXRfd21tX2RlZmF1bHQoc2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3dtbV9wYXJhbXMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEsCisJCQkJICAgICB1OCAqd21tX3BhcmFtLCBzaXplX3Qgd21tX3BhcmFtX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyBwYXJhbXM7CisJc2l6ZV90IGxlZnQ7CisJaW50IGNvdW50OworCXU4ICpwb3M7CisKKwlpZiAoIShpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX1dNTV9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJaWYgKCF3bW1fcGFyYW0pCisJCXJldHVybjsKKworCWlmICh3bW1fcGFyYW1fbGVuIDwgOCB8fCB3bW1fcGFyYW1bNV0gLyogdmVyc2lvbiAqLyAhPSAxKQorCQlyZXR1cm47CisJY291bnQgPSB3bW1fcGFyYW1bNl0gJiAweDBmOworCWlmIChjb3VudCA9PSBpZnN0YS0+d21tX2xhc3RfcGFyYW1fc2V0KQorCQlyZXR1cm47CisJaWZzdGEtPndtbV9sYXN0X3BhcmFtX3NldCA9IGNvdW50OworCisJcG9zID0gd21tX3BhcmFtICsgODsKKwlsZWZ0ID0gd21tX3BhcmFtX2xlbiAtIDg7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCisJaWYgKCFsb2NhbC0+b3BzLT5jb25mX3R4KQorCQlyZXR1cm47CisKKwlsb2NhbC0+d21tX2FjbSA9IDA7CisJZm9yICg7IGxlZnQgPj0gNDsgbGVmdCAtPSA0LCBwb3MgKz0gNCkgeworCQlpbnQgYWNpID0gKHBvc1swXSA+PiA1KSAmIDB4MDM7CisJCWludCBhY20gPSAocG9zWzBdID4+IDQpICYgMHgwMTsKKwkJaW50IHF1ZXVlOworCisJCXN3aXRjaCAoYWNpKSB7CisJCWNhc2UgMToKKwkJCXF1ZXVlID0gMzsKKwkJCWlmIChhY20pCisJCQkJbG9jYWwtPndtbV9hY20gfD0gQklUKDApIHwgQklUKDMpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXF1ZXVlID0gMTsKKwkJCWlmIChhY20pCisJCQkJbG9jYWwtPndtbV9hY20gfD0gQklUKDQpIHwgQklUKDUpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXF1ZXVlID0gMDsKKwkJCWlmIChhY20pCisJCQkJbG9jYWwtPndtbV9hY20gfD0gQklUKDYpIHwgQklUKDcpOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJZGVmYXVsdDoKKwkJCXF1ZXVlID0gMjsKKwkJCWlmIChhY20pCisJCQkJbG9jYWwtPndtbV9hY20gfD0gQklUKDEpIHwgQklUKDIpOworCQkJYnJlYWs7CisJCX0KKworCQlwYXJhbXMuYWlmcyA9IHBvc1swXSAmIDB4MGY7CisJCXBhcmFtcy5jd19tYXggPSBlY3cyY3coKHBvc1sxXSAmIDB4ZjApID4+IDQpOworCQlwYXJhbXMuY3dfbWluID0gZWN3MmN3KHBvc1sxXSAmIDB4MGYpOworCQlwYXJhbXMudHhvcCA9IGdldF91bmFsaWduZWRfbGUxNihwb3MgKyAyKTsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdNTSBxdWV1ZT0lZCBhY2k9JWQgYWNtPSVkIGFpZnM9JWQgIgorCQkgICAgICAgImNXbWluPSVkIGNXbWF4PSVkIHR4b3A9JWRcbiIsCisJCSAgICAgICBsb2NhbC0+bWRldi0+bmFtZSwgcXVldWUsIGFjaSwgYWNtLCBwYXJhbXMuYWlmcywgcGFyYW1zLmN3X21pbiwKKwkJICAgICAgIHBhcmFtcy5jd19tYXgsIHBhcmFtcy50eG9wKTsKKyNlbmRpZgorCQkvKiBUT0RPOiBoYW5kbGUgQUNNIChibG9jayBUWCwgZmFsbGJhY2sgdG8gbmV4dCBsb3dlc3QgYWxsb3dlZAorCQkgKiBBQyBmb3Igbm93KSAqLworCQlpZiAobG9jYWwtPm9wcy0+Y29uZl90eChsb2NhbF90b19odyhsb2NhbCksIHF1ZXVlLCAmcGFyYW1zKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gc2V0IFRYIHF1ZXVlICIKKwkJCSAgICAgICAicGFyYW1ldGVycyBmb3IgcXVldWUgJWRcbiIsIGxvY2FsLT5tZGV2LT5uYW1lLCBxdWV1ZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MzIgaWVlZTgwMjExX2hhbmRsZV9wcm90ZWN0X3ByZWFtYihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJICAgYm9vbCB1c2VfcHJvdGVjdGlvbiwKKwkJCQkJICAgYm9vbCB1c2Vfc2hvcnRfcHJlYW1ibGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmc2RhdGEtPmJzc19jb25mOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKyNlbmRpZgorCXUzMiBjaGFuZ2VkID0gMDsKKworCWlmICh1c2VfcHJvdGVjdGlvbiAhPSBic3NfY29uZi0+dXNlX2N0c19wcm90KSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDVFMgcHJvdGVjdGlvbiAlcyAoQlNTSUQ9IgorCQkJICAgICAgICIlcylcbiIsCisJCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwKKwkJCSAgICAgICB1c2VfcHJvdGVjdGlvbiA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCQkgICAgICAgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7CisJCX0KKyNlbmRpZgorCQlic3NfY29uZi0+dXNlX2N0c19wcm90ID0gdXNlX3Byb3RlY3Rpb247CisJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UOworCX0KKworCWlmICh1c2Vfc2hvcnRfcHJlYW1ibGUgIT0gYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc3dpdGNoZWQgdG8gJXMgYmFya2VyIHByZWFtYmxlIgorCQkJICAgICAgICIgKEJTU0lEPSVzKVxuIiwKKwkJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLAorCQkJICAgICAgIHVzZV9zaG9ydF9wcmVhbWJsZSA/ICJzaG9ydCIgOiAibG9uZyIsCisJCQkgICAgICAgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7CisJCX0KKyNlbmRpZgorCQlic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlID0gdXNlX3Nob3J0X3ByZWFtYmxlOworCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHUzMiBpZWVlODAyMTFfaGFuZGxlX2VycF9pZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICB1OCBlcnBfdmFsdWUpCit7CisJYm9vbCB1c2VfcHJvdGVjdGlvbiA9IChlcnBfdmFsdWUgJiBXTEFOX0VSUF9VU0VfUFJPVEVDVElPTikgIT0gMDsKKwlib29sIHVzZV9zaG9ydF9wcmVhbWJsZSA9IChlcnBfdmFsdWUgJiBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUpID09IDA7CisKKwlyZXR1cm4gaWVlZTgwMjExX2hhbmRsZV9wcm90ZWN0X3ByZWFtYihzZGF0YSwKKwkJCXVzZV9wcm90ZWN0aW9uLCB1c2Vfc2hvcnRfcHJlYW1ibGUpOworfQorCitzdGF0aWMgdTMyIGllZWU4MDIxMV9oYW5kbGVfYnNzX2NhcGFiaWxpdHkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MpCit7CisJdTMyIGNoYW5nZWQgPSAwOworCisJaWYgKGJzcy0+aGFzX2VycF92YWx1ZSkKKwkJY2hhbmdlZCB8PSBpZWVlODAyMTFfaGFuZGxlX2VycF9pZShzZGF0YSwgYnNzLT5lcnBfdmFsdWUpOworCWVsc2UgeworCQl1MTYgY2FwYWIgPSBic3MtPmNhcGFiaWxpdHk7CisJCWNoYW5nZWQgfD0gaWVlZTgwMjExX2hhbmRsZV9wcm90ZWN0X3ByZWFtYihzZGF0YSwgZmFsc2UsCisJCQkJKGNhcGFiICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSAhPSAwKTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9zZW5kX2FwaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJaWYgKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQVNTT0NJQVRFRCkKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoc2RhdGEtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfc2VuZF9hc3NvY2luZm8oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCit7CisJY2hhciAqYnVmOworCXNpemVfdCBsZW47CisJaW50IGk7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJaWYgKCFpZnN0YS0+YXNzb2NyZXFfaWVzICYmICFpZnN0YS0+YXNzb2NyZXNwX2llcykKKwkJcmV0dXJuOworCisJYnVmID0ga21hbGxvYyg1MCArIDIgKiAoaWZzdGEtPmFzc29jcmVxX2llc19sZW4gKworCQkJCWlmc3RhLT5hc3NvY3Jlc3BfaWVzX2xlbiksIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIkFTU09DSU5GTygiKTsKKwlpZiAoaWZzdGEtPmFzc29jcmVxX2llcykgeworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJSZXFJRXM9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBpZnN0YS0+YXNzb2NyZXFfaWVzX2xlbjsgaSsrKSB7CisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlMDJ4IiwKKwkJCQkgICAgICAgaWZzdGEtPmFzc29jcmVxX2llc1tpXSk7CisJCX0KKwl9CisJaWYgKGlmc3RhLT5hc3NvY3Jlc3BfaWVzKSB7CisJCWlmIChpZnN0YS0+YXNzb2NyZXFfaWVzKQorCQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiICIpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJSZXNwSUVzPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgaWZzdGEtPmFzc29jcmVzcF9pZXNfbGVuOyBpKyspIHsKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUwMngiLAorCQkJCSAgICAgICBpZnN0YS0+YXNzb2NyZXNwX2llc1tpXSk7CisJCX0KKwl9CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiKSIpOworCisJaWYgKGxlbiA+IElXX0NVU1RPTV9NQVgpIHsKKwkJbGVuID0gc3ByaW50ZihidWYsICJBU1NPQ1JFU1BJRT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IGlmc3RhLT5hc3NvY3Jlc3BfaWVzX2xlbjsgaSsrKSB7CisJCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlMDJ4IiwKKwkJCQkgICAgICAgaWZzdGEtPmFzc29jcmVzcF9pZXNbaV0pOworCQl9CisJfQorCisJaWYgKGxlbiA8PSBJV19DVVNUT01fTUFYKSB7CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IGxlbjsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChzZGF0YS0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKKwl9CisKKwlrZnJlZShidWYpOwogfQogCiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX2Rpc2Fzc29jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwgdTE2IHJlYXNvbikKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZXRfYXNzb2NpYXRlZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZsb2NhbF90b19odyhsb2NhbCktPmNvbmY7CisJdTMyIGNoYW5nZWQgPSBCU1NfQ0hBTkdFRF9BU1NPQzsKIAotCXNrYiA9IGRldl9hbGxvY19za2IobG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsgc2l6ZW9mKCptZ210KSk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBkaXNhc3NvYyAiCi0JCSAgICAgICAiZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKKworCWlmc3RhLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0FTU09DSUFURUQ7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybjsKKworCWJzcyA9IGllZWU4MDIxMV9yeF9ic3NfZ2V0KGxvY2FsLCBpZnN0YS0+YnNzaWQsCisJCQkJICAgY29uZi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEsCisJCQkJICAgaWZzdGEtPnNzaWQsIGlmc3RhLT5zc2lkX2xlbik7CisJaWYgKGJzcykgeworCQkvKiBzZXQgdGltaW5nIGluZm9ybWF0aW9uICovCisJCXNkYXRhLT5ic3NfY29uZi5iZWFjb25faW50ID0gYnNzLT5iZWFjb25faW50OworCQlzZGF0YS0+YnNzX2NvbmYudGltZXN0YW1wID0gYnNzLT50aW1lc3RhbXA7CisJCXNkYXRhLT5ic3NfY29uZi5kdGltX3BlcmlvZCA9IGJzcy0+ZHRpbV9wZXJpb2Q7CisKKwkJY2hhbmdlZCB8PSBpZWVlODAyMTFfaGFuZGxlX2Jzc19jYXBhYmlsaXR5KHNkYXRhLCBic3MpOworCisJCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBic3MpOworCX0KKworCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1NVUFBPUlRfSFRfTU9ERSkgeworCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0hUOworCQlzZGF0YS0+YnNzX2NvbmYuYXNzb2NfaHQgPSAxOworCQlzZGF0YS0+YnNzX2NvbmYuaHRfY29uZiA9ICZjb25mLT5odF9jb25mOworCQlzZGF0YS0+YnNzX2NvbmYuaHRfYnNzX2NvbmYgPSAmY29uZi0+aHRfYnNzX2NvbmY7CisJfQorCisJaWZzdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfUFJFVl9CU1NJRF9TRVQ7CisJbWVtY3B5KGlmc3RhLT5wcmV2X2Jzc2lkLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKKwlpZWVlODAyMTFfc3RhX3NlbmRfYXNzb2NpbmZvKHNkYXRhLCBpZnN0YSk7CisKKwlpZnN0YS0+bGFzdF9wcm9iZSA9IGppZmZpZXM7CisJaWVlZTgwMjExX2xlZF9hc3NvYyhsb2NhbCwgMSk7CisKKwlzZGF0YS0+YnNzX2NvbmYuYXNzb2MgPSAxOworCS8qCisJICogRm9yIG5vdyBqdXN0IGFsd2F5cyBhc2sgdGhlIGRyaXZlciB0byB1cGRhdGUgdGhlIGJhc2ljIHJhdGVzZXQKKwkgKiB3aGVuIHdlIGhhdmUgYXNzb2NpYXRlZCwgd2UgYXJlbid0IGNoZWNraW5nIHdoZXRoZXIgaXQgYWN0dWFsbHkKKwkgKiBjaGFuZ2VkIG9yIG5vdC4KKwkgKi8KKwljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTOworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihzZGF0YS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdGFfc2VuZF9hcGluZm8oc2RhdGEsIGlmc3RhKTsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX2RpcmVjdF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCit7CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKwlpZnN0YS0+ZGlyZWN0X3Byb2JlX3RyaWVzKys7CisJaWYgKGlmc3RhLT5kaXJlY3RfcHJvYmVfdHJpZXMgPiBJRUVFODAyMTFfQVVUSF9NQVhfVFJJRVMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXJlY3QgcHJvYmUgdG8gQVAgJXMgdGltZWQgb3V0XG4iLAorCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7CisJCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9TVEFfTUxNRV9ESVNBQkxFRDsKIAkJcmV0dXJuOwogCX0KLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7CiAKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgMjQpOwotCW1lbXNldChtZ210LCAwLCAyNCk7Ci0JbWVtY3B5KG1nbXQtPmRhLCBpZnN0YS0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+YnNzaWQsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk7Ci0Jc2tiX3B1dChza2IsIDIpOwotCW1nbXQtPnUuZGlzYXNzb2MucmVhc29uX2NvZGUgPSBjcHVfdG9fbGUxNihyZWFzb24pOworCXByaW50ayhLRVJOX0RFQlVHICIlczogZGlyZWN0IHByb2JlIHRvIEFQICVzIHRyeSAlZFxuIiwKKwkJCXNkYXRhLT5kZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCksCisJCQlpZnN0YS0+ZGlyZWN0X3Byb2JlX3RyaWVzKTsKIAotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOworCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9TVEFfTUxNRV9ESVJFQ1RfUFJPQkU7CisKKwlzZXRfYml0KElFRUU4MDIxMV9TVEFfUkVRX0RJUkVDVF9QUk9CRSwgJmlmc3RhLT5yZXF1ZXN0KTsKKworCS8qIERpcmVjdCBwcm9iZSBpcyBzZW50IHRvIGJyb2FkY2FzdCBhZGRyZXNzIGFzIHNvbWUgQVBzCisJICogd2lsbCBub3QgYW5zd2VyIHRvIGRpcmVjdCBwYWNrZXQgaW4gdW5hc3NvY2lhdGVkIHN0YXRlLgorCSAqLworCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcShzZGF0YSwgTlVMTCwKKwkJCQkgaWZzdGEtPnNzaWQsIGlmc3RhLT5zc2lkX2xlbik7CisKKwltb2RfdGltZXIoJmlmc3RhLT50aW1lciwgamlmZmllcyArIElFRUU4MDIxMV9BVVRIX1RJTUVPVVQpOwogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3ByaXZhY3lfbWlzbWF0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hdXRoZW50aWNhdGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQoreworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisJaWZzdGEtPmF1dGhfdHJpZXMrKzsKKwlpZiAoaWZzdGEtPmF1dGhfdHJpZXMgPiBJRUVFODAyMTFfQVVUSF9NQVhfVFJJRVMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhdXRoZW50aWNhdGlvbiB3aXRoIEFQICVzIgorCQkgICAgICAgIiB0aW1lZCBvdXRcbiIsCisJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBpZnN0YS0+YnNzaWQpKTsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0RJU0FCTEVEOworCQlyZXR1cm47CisJfQorCisJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0FVVEhFTlRJQ0FURTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGF1dGhlbnRpY2F0ZSB3aXRoIEFQICVzXG4iLAorCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBpZnN0YS0+YnNzaWQpKTsKKworCWllZWU4MDIxMV9zZW5kX2F1dGgoc2RhdGEsIGlmc3RhLCAxLCBOVUxMLCAwLCAwKTsKKworCW1vZF90aW1lcigmaWZzdGEtPnRpbWVyLCBqaWZmaWVzICsgSUVFRTgwMjExX0FVVEhfVElNRU9VVCk7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLCBib29sIGRlYXV0aCwKKwkJCQkgICBib29sIHNlbGZfZGlzY29ubmVjdGVkLCB1MTYgcmVhc29uKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXUzMiBjaGFuZ2VkID0gQlNTX0NIQU5HRURfQVNTT0M7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIGlmc3RhLT5ic3NpZCk7CisJaWYgKCFzdGEpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGVhdXRoKSB7CisJCWlmc3RhLT5kaXJlY3RfcHJvYmVfdHJpZXMgPSAwOworCQlpZnN0YS0+YXV0aF90cmllcyA9IDA7CisJfQorCWlmc3RhLT5hc3NvY19zY2FuX3RyaWVzID0gMDsKKwlpZnN0YS0+YXNzb2NfdHJpZXMgPSAwOworCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOworCisJaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc2RhdGEsIHN0YS0+c3RhLmFkZHIpOworCisJaWYgKHNlbGZfZGlzY29ubmVjdGVkKSB7CisJCWlmIChkZWF1dGgpCisJCQlpZWVlODAyMTFfc2VuZF9kZWF1dGhfZGlzYXNzb2Moc2RhdGEsCisJCQkJSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwgcmVhc29uKTsKKwkJZWxzZQorCQkJaWVlZTgwMjExX3NlbmRfZGVhdXRoX2Rpc2Fzc29jKHNkYXRhLAorCQkJCUlFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQywgcmVhc29uKTsKKwl9CisKKwlpZnN0YS0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9TVEFfQVNTT0NJQVRFRDsKKwljaGFuZ2VkIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzZGF0YSk7CisKKwlpZiAoc2RhdGEtPmJzc19jb25mLmFzc29jX2h0KQorCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0hUOworCisJc2RhdGEtPmJzc19jb25mLmFzc29jX2h0ID0gMDsKKwlzZGF0YS0+YnNzX2NvbmYuaHRfY29uZiA9IE5VTEw7CisJc2RhdGEtPmJzc19jb25mLmh0X2Jzc19jb25mID0gTlVMTDsKKworCWllZWU4MDIxMV9sZWRfYXNzb2MobG9jYWwsIDApOworCXNkYXRhLT5ic3NfY29uZi5hc3NvYyA9IDA7CisKKwlpZWVlODAyMTFfc3RhX3NlbmRfYXBpbmZvKHNkYXRhLCBpZnN0YSk7CisKKwlpZiAoc2VsZl9kaXNjb25uZWN0ZWQpCisJCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9TVEFfTUxNRV9ESVNBQkxFRDsKKworCXN0YV9pbmZvX3VubGluaygmc3RhKTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJc3RhX2luZm9fZGVzdHJveShzdGEpOworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfd2VwX2NvbmZpZ3VyZWQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJaWYgKCFzZGF0YSB8fCAhc2RhdGEtPmRlZmF1bHRfa2V5IHx8CisJICAgIHNkYXRhLT5kZWZhdWx0X2tleS0+Y29uZi5hbGcgIT0gQUxHX1dFUCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3ByaXZhY3lfbWlzbWF0Y2goc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3M7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKIAlpbnQgYnNzX3ByaXZhY3k7CiAJaW50IHdlcF9wcml2YWN5OwogCWludCBwcml2YWN5X2ludm9rZWQ7CkBAIC05ODEsMTQgKzg5MywxNCBAQAogCWlmICghaWZzdGEgfHwgKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfTUlYRURfQ0VMTCkpCiAJCXJldHVybiAwOwogCi0JYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQoZGV2LCBpZnN0YS0+YnNzaWQsCisJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQobG9jYWwsIGlmc3RhLT5ic3NpZCwKIAkJCQkgICBsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5jZW50ZXJfZnJlcSwKIAkJCQkgICBpZnN0YS0+c3NpZCwgaWZzdGEtPnNzaWRfbGVuKTsKIAlpZiAoIWJzcykKIAkJcmV0dXJuIDA7CiAKIAlic3NfcHJpdmFjeSA9ICEhKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKLQl3ZXBfcHJpdmFjeSA9ICEhaWVlZTgwMjExX3N0YV93ZXBfY29uZmlndXJlZChkZXYpOworCXdlcF9wcml2YWN5ID0gISFpZWVlODAyMTFfc3RhX3dlcF9jb25maWd1cmVkKHNkYXRhKTsKIAlwcml2YWN5X2ludm9rZWQgPSAhIShpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX1BSSVZBQ1lfSU5WT0tFRCk7CiAKIAlpZWVlODAyMTFfcnhfYnNzX3B1dChsb2NhbCwgYnNzKTsKQEAgLTk5OSw4ICs5MTEsNyBAQAogCXJldHVybiAxOwogfQogCi0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQogewogCURFQ0xBUkVfTUFDX0JVRihtYWMpOwpAQCAtMTAwOSwzMSArOTIwLDMxIEBACiAJaWYgKGlmc3RhLT5hc3NvY190cmllcyA+IElFRUU4MDIxMV9BU1NPQ19NQVhfVFJJRVMpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhc3NvY2lhdGlvbiB3aXRoIEFQICVzIgogCQkgICAgICAgIiB0aW1lZCBvdXRcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCkpOwotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfRElTQUJMRUQ7CisJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBpZnN0YS0+YnNzaWQpKTsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0RJU0FCTEVEOwogCQlyZXR1cm47CiAJfQogCi0JaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFURTsKKwlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfU1RBX01MTUVfQVNTT0NJQVRFOwogCXByaW50ayhLRVJOX0RFQlVHICIlczogYXNzb2NpYXRlIHdpdGggQVAgJXNcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7Ci0JaWYgKGllZWU4MDIxMV9wcml2YWN5X21pc21hdGNoKGRldiwgaWZzdGEpKSB7CisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCkpOworCWlmIChpZWVlODAyMTFfcHJpdmFjeV9taXNtYXRjaChzZGF0YSwgaWZzdGEpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWlzbWF0Y2ggaW4gcHJpdmFjeSBjb25maWd1cmF0aW9uIGFuZCAiCi0JCSAgICAgICAibWl4ZWQtY2VsbCBkaXNhYmxlZCAtIGFib3J0IGFzc29jaWF0aW9uXG4iLCBkZXYtPm5hbWUpOwotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfRElTQUJMRUQ7CisJCSAgICAgICAibWl4ZWQtY2VsbCBkaXNhYmxlZCAtIGFib3J0IGFzc29jaWF0aW9uXG4iLCBzZGF0YS0+ZGV2LT5uYW1lKTsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0RJU0FCTEVEOwogCQlyZXR1cm47CiAJfQogCi0JaWVlZTgwMjExX3NlbmRfYXNzb2MoZGV2LCBpZnN0YSk7CisJaWVlZTgwMjExX3NlbmRfYXNzb2Moc2RhdGEsIGlmc3RhKTsKIAogCW1vZF90aW1lcigmaWZzdGEtPnRpbWVyLCBqaWZmaWVzICsgSUVFRTgwMjExX0FTU09DX1RJTUVPVVQpOwogfQogCiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJaW50IGRpc2Fzc29jOwogCURFQ0xBUkVfTUFDX0JVRihtYWMpOwpAQCAtMTA0MywxNCArOTU0LDE0IEBACiAJICogZm9yIGJldHRlciBBUHMuICovCiAJLyogVE9ETzogcmVtb3ZlIGV4cGlyZWQgQlNTZXMgKi8KIAotCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVEVEOworCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9TVEFfTUxNRV9BU1NPQ0lBVEVEOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCiAJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBpZnN0YS0+YnNzaWQpOwogCWlmICghc3RhKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gU1RBIGVudHJ5IGZvciBvd24gQVAgJXNcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCkpOworCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgaWZzdGEtPmJzc2lkKSk7CiAJCWRpc2Fzc29jID0gMTsKIAl9IGVsc2UgewogCQlkaXNhc3NvYyA9IDA7CkBAIC0xMDYwLDIwICs5NzEsMTkgQEAKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFByb2JlUmVzcCBmcm9tICIKIAkJCQkgICAgICAgImN1cnJlbnQgQVAgJXMgLSBhc3N1bWUgb3V0IG9mICIKIAkJCQkgICAgICAgInJhbmdlXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGlmc3RhLT5ic3NpZCkpOworCQkJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBpZnN0YS0+YnNzaWQpKTsKIAkJCQlkaXNhc3NvYyA9IDE7Ci0JCQkJc3RhX2luZm9fdW5saW5rKCZzdGEpOwogCQkJfSBlbHNlCi0JCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKGRldiwgaWZzdGEtPmJzc2lkLAotCQkJCQkJCSBsb2NhbC0+c2Nhbl9zc2lkLAotCQkJCQkJCSBsb2NhbC0+c2Nhbl9zc2lkX2xlbik7CisJCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHNkYXRhLCBpZnN0YS0+YnNzaWQsCisJCQkJCQkJIGlmc3RhLT5zc2lkLAorCQkJCQkJCSBpZnN0YS0+c3NpZF9sZW4pOwogCQkJaWZzdGEtPmZsYWdzIF49IElFRUU4MDIxMV9TVEFfUFJPQkVSRVFfUE9MTDsKIAkJfSBlbHNlIHsKIAkJCWlmc3RhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9QUk9CRVJFUV9QT0xMOwogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgaWZzdGEtPmxhc3RfcHJvYmUgKwogCQkJCSAgICAgICBJRUVFODAyMTFfUFJPQkVfSU5URVJWQUwpKSB7CiAJCQkJaWZzdGEtPmxhc3RfcHJvYmUgPSBqaWZmaWVzOwotCQkJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcShkZXYsIGlmc3RhLT5ic3NpZCwKKwkJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXEoc2RhdGEsIGlmc3RhLT5ic3NpZCwKIAkJCQkJCQkgaWZzdGEtPnNzaWQsCiAJCQkJCQkJIGlmc3RhLT5zc2lkX2xlbik7CiAJCQl9CkBAIC0xMDgyLDEwMCArOTkyLDI1IEBACiAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChkaXNhc3NvYyAmJiBzdGEpCi0JCXN0YV9pbmZvX2Rlc3Ryb3koc3RhKTsKLQotCWlmIChkaXNhc3NvYykgewotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfRElTQUJMRUQ7Ci0JCWllZWU4MDIxMV9zZXRfYXNzb2NpYXRlZChkZXYsIGlmc3RhLCAwKTsKLQl9IGVsc2UgeworCWlmIChkaXNhc3NvYykKKwkJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgaWZzdGEsIHRydWUsIHRydWUsCisJCQkJCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQpOworCWVsc2UKIAkJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKwogCQkJCSAgICAgIElFRUU4MDIxMV9NT05JVE9SSU5HX0lOVEVSVkFMKTsKLQl9CiB9CiAKIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkc3QsCi0JCQkJICAgICB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKnBvcywgKnN1cHBfcmF0ZXMsICplc3VwcF9yYXRlcyA9IE5VTEw7Ci0JaW50IGk7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIHNpemVvZigqbWdtdCkgKyAyMDApOwotCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgcHJvYmUgIgotCQkgICAgICAgInJlcXVlc3RcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0Jc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKLQltZW1zZXQobWdtdCwgMCwgMjQpOwotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCSAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCW1lbWNweShtZ210LT5zYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCWlmIChkc3QpIHsKLQkJbWVtY3B5KG1nbXQtPmRhLCBkc3QsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KG1nbXQtPmJzc2lkLCBkc3QsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQltZW1zZXQobWdtdC0+ZGEsIDB4ZmYsIEVUSF9BTEVOKTsKLQkJbWVtc2V0KG1nbXQtPmJzc2lkLCAweGZmLCBFVEhfQUxFTik7Ci0JfQotCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc3NpZF9sZW4pOwotCSpwb3MrKyA9IFdMQU5fRUlEX1NTSUQ7Ci0JKnBvcysrID0gc3NpZF9sZW47Ci0JbWVtY3B5KHBvcywgc3NpZCwgc3NpZF9sZW4pOwotCi0Jc3VwcF9yYXRlcyA9IHNrYl9wdXQoc2tiLCAyKTsKLQlzdXBwX3JhdGVzWzBdID0gV0xBTl9FSURfU1VQUF9SQVRFUzsKLQlzdXBwX3JhdGVzWzFdID0gMDsKLQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUgPSAmc2JhbmQtPmJpdHJhdGVzW2ldOwotCQlpZiAoZXN1cHBfcmF0ZXMpIHsKLQkJCXBvcyA9IHNrYl9wdXQoc2tiLCAxKTsKLQkJCWVzdXBwX3JhdGVzWzFdKys7Ci0JCX0gZWxzZSBpZiAoc3VwcF9yYXRlc1sxXSA9PSA4KSB7Ci0JCQllc3VwcF9yYXRlcyA9IHNrYl9wdXQoc2tiLCAzKTsKLQkJCWVzdXBwX3JhdGVzWzBdID0gV0xBTl9FSURfRVhUX1NVUFBfUkFURVM7Ci0JCQllc3VwcF9yYXRlc1sxXSA9IDE7Ci0JCQlwb3MgPSAmZXN1cHBfcmF0ZXNbMl07Ci0JCX0gZWxzZSB7Ci0JCQlwb3MgPSBza2JfcHV0KHNrYiwgMSk7Ci0JCQlzdXBwX3JhdGVzWzFdKys7Ci0JCX0KLQkJKnBvcyA9IHJhdGUtPmJpdHJhdGUgLyA1OwotCX0KLQotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOwotfQotCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV93ZXBfY29uZmlndXJlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoIXNkYXRhIHx8ICFzZGF0YS0+ZGVmYXVsdF9rZXkgfHwKLQkgICAgc2RhdGEtPmRlZmF1bHRfa2V5LT5jb25mLmFsZyAhPSBBTEdfV0VQKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfYXV0aF9jb21wbGV0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hdXRoX2NvbXBsZXRlZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSkKIHsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGF1dGhlbnRpY2F0ZWRcbiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhdXRoZW50aWNhdGVkXG4iLCBzZGF0YS0+ZGV2LT5uYW1lKTsKIAlpZnN0YS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NUQV9BVVRIRU5USUNBVEVEOwotCWllZWU4MDIxMV9hc3NvY2lhdGUoZGV2LCBpZnN0YSk7CisJaWVlZTgwMjExX2Fzc29jaWF0ZShzZGF0YSwgaWZzdGEpOwogfQogCiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAogCQkJCSAgICAgc2l6ZV90IGxlbikKQEAgLTExODcsNjgyICsxMDIyLDMwIEBACiAJaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyhwb3MsIGxlbiAtIChwb3MgLSAodTggKikgbWdtdCksICZlbGVtcyk7CiAJaWYgKCFlbGVtcy5jaGFsbGVuZ2UpCiAJCXJldHVybjsKLQlpZWVlODAyMTFfc2VuZF9hdXRoKGRldiwgaWZzdGEsIDMsIGVsZW1zLmNoYWxsZW5nZSAtIDIsCisJaWVlZTgwMjExX3NlbmRfYXV0aChzZGF0YSwgaWZzdGEsIDMsIGVsZW1zLmNoYWxsZW5nZSAtIDIsCiAJCQkgICAgZWxlbXMuY2hhbGxlbmdlX2xlbiArIDIsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkYSwgdTE2IHRpZCwKLQkJCQkJdTggZGlhbG9nX3Rva2VuLCB1MTYgc3RhdHVzLCB1MTYgcG9saWN5LAotCQkJCQl1MTYgYnVmX3NpemUsIHUxNiB0aW1lb3V0KQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTE2IGNhcGFiOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2YoKm1nbXQpICsgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQotCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciAiCi0JCSAgICAgICAiZm9yIGFkZGJhIHJlc3AgZnJhbWVcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKLQltZW1zZXQobWdtdCwgMCwgMjQpOwotCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKQotCQltZW1jcHkobWdtdC0+YnNzaWQsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQllbHNlCi0JCW1lbWNweShtZ210LT5ic3NpZCwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWdtdC0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJICAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3ApKTsKLQltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfQkFDSzsKLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9BRERCQV9SRVNQOwotCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47Ci0KLQljYXBhYiA9ICh1MTYpKHBvbGljeSA8PCAxKTsJLyogYml0IDEgYWdncmVnYXRpb24gcG9saWN5ICovCi0JY2FwYWIgfD0gKHUxNikodGlkIDw8IDIpOyAJLyogYml0IDU6MiBUSUQgbnVtYmVyICovCi0JY2FwYWIgfD0gKHUxNikoYnVmX3NpemUgPDwgNik7CS8qIGJpdCAxNTo2IG1heCBzaXplIG9mIGFnZ3JlZ2F0aW9uICovCi0KLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIgPSBjcHVfdG9fbGUxNihjYXBhYik7Ci0JbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGllZWU4MDIxMV9zZW5kX2FkZGJhX3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmRhLAotCQkJCXUxNiB0aWQsIHU4IGRpYWxvZ190b2tlbiwgdTE2IHN0YXJ0X3NlcV9udW0sCi0JCQkJdTE2IGFnZ19zaXplLCB1MTYgdGltZW91dCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXUxNiBjYXBhYjsKLQotCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCptZ210KSArIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0KLQlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyICIKLQkJCQkiZm9yIGFkZGJhIHJlcXVlc3QgZnJhbWVcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0Jc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCAyNCk7Ci0JbWVtc2V0KG1nbXQsIDAsIDI0KTsKLQltZW1jcHkobWdtdC0+ZGEsIGRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPnNhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKLQkJbWVtY3B5KG1nbXQtPmJzc2lkLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JZWxzZQotCQltZW1jcHkobWdtdC0+YnNzaWQsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOwotCi0JbWdtdC0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcSkpOwotCi0JbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX0JBQ0s7Ci0JbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUgPSBXTEFOX0FDVElPTl9BRERCQV9SRVE7Ci0KLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47Ci0JY2FwYWIgPSAodTE2KSgxIDw8IDEpOwkJLyogYml0IDEgYWdncmVnYXRpb24gcG9saWN5ICovCi0JY2FwYWIgfD0gKHUxNikodGlkIDw8IDIpOyAJLyogYml0IDU6MiBUSUQgbnVtYmVyICovCi0JY2FwYWIgfD0gKHUxNikoYWdnX3NpemUgPDwgNik7CS8qIGJpdCAxNTo2IG1heCBzaXplIG9mIGFnZ2VyZ2F0aW9uICovCi0KLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5jYXBhYiA9IGNwdV90b19sZTE2KGNhcGFiKTsKLQotCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLnRpbWVvdXQgPSBjcHVfdG9fbGUxNih0aW1lb3V0KTsKLQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5zdGFydF9zZXFfbnVtID0KLQkJCQkJY3B1X3RvX2xlMTYoc3RhcnRfc2VxX251bSA8PCA0KTsKLQotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOwotfQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3Byb2Nlc3NfYWRkYmFfcmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAotCQkJCQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gJmxvY2FsLT5odzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHRpZF9hbXBkdV9yeCAqdGlkX2FnZ19yeDsKLQl1MTYgY2FwYWIsIHRpZCwgdGltZW91dCwgYmFfcG9saWN5LCBidWZfc2l6ZSwgc3RhcnRfc2VxX251bSwgc3RhdHVzOwotCXU4IGRpYWxvZ190b2tlbjsKLQlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIG1nbXQtPnNhKTsKLQlpZiAoIXN0YSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGV4dHJhY3Qgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZyb20gYWRkYmEgcmVxdWVzdCBmcmFtZSAqLwotCWRpYWxvZ190b2tlbiA9IG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmRpYWxvZ190b2tlbjsKLQl0aW1lb3V0ID0gbGUxNl90b19jcHUobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEudGltZW91dCk7Ci0Jc3RhcnRfc2VxX251bSA9Ci0JCWxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLnN0YXJ0X3NlcV9udW0pID4+IDQ7Ci0KLQljYXBhYiA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiKTsKLQliYV9wb2xpY3kgPSAoY2FwYWIgJiBJRUVFODAyMTFfQUREQkFfUEFSQU1fUE9MSUNZX01BU0spID4+IDE7Ci0JdGlkID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLKSA+PiAyOwotCWJ1Zl9zaXplID0gKGNhcGFiICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX0JVRl9TSVpFX01BU0spID4+IDY7Ci0KLQlzdGF0dXMgPSBXTEFOX1NUQVRVU19SRVFVRVNUX0RFQ0xJTkVEOwotCi0JLyogc2FuaXR5IGNoZWNrIGZvciBpbmNvbWluZyBwYXJhbWV0ZXJzOgotCSAqIGNoZWNrIGlmIGNvbmZpZ3VyYXRpb24gY2FuIHN1cHBvcnQgdGhlIEJBIHBvbGljeQotCSAqIGFuZCBpZiBidWZmZXIgc2l6ZSBkb2VzIG5vdCBleGNlZWRzIG1heCB2YWx1ZSAqLwotCWlmICgoKGJhX3BvbGljeSAhPSAxKQotCQkmJiAoIShjb25mLT5odF9jb25mLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfREVMQVlfQkEpKSkKLQkJfHwgKGJ1Zl9zaXplID4gSUVFRTgwMjExX01BWF9BTVBEVV9CVUYpKSB7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfUU9TX1BBUkFNOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIkFkZEJBIFJlcSB3aXRoIGJhZCBwYXJhbXMgZnJvbSAiCi0JCQkJIiVzIG9uIHRpZCAldS4gcG9saWN5ICVkLCBidWZmZXIgc2l6ZSAlZFxuIiwKLQkJCQlwcmludF9tYWMobWFjLCBtZ210LT5zYSksIHRpZCwgYmFfcG9saWN5LAotCQkJCWJ1Zl9zaXplKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KLQkJZ290byBlbmRfbm9fbG9jazsKLQl9Ci0JLyogZGV0ZXJtaW5lIGRlZmF1bHQgYnVmZmVyIHNpemUgKi8KLQlpZiAoYnVmX3NpemUgPT0gMCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQotCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07Ci0JCWJ1Zl9zaXplID0gSUVFRTgwMjExX01JTl9BTVBEVV9CVUY7Ci0JCWJ1Zl9zaXplID0gYnVmX3NpemUgPDwgc2JhbmQtPmh0X2luZm8uYW1wZHVfZmFjdG9yOwotCX0KLQotCi0JLyogZXhhbWluZSBzdGF0ZSBtYWNoaW5lICovCi0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCi0JaWYgKHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSAhPSBIVF9BR0dfU1RBVEVfSURMRSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgInVuZXhwZWN0ZWQgQWRkQkEgUmVxIGZyb20gIgotCQkJCSIlcyBvbiB0aWQgJXVcbiIsCi0JCQkJcHJpbnRfbWFjKG1hYywgbWdtdC0+c2EpLCB0aWQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCQlnb3RvIGVuZDsKLQl9Ci0KLQkvKiBwcmVwYXJlIEEtTVBEVSBNTE1FIGZvciBSeCBhZ2dyZWdhdGlvbiAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9Ci0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGlkX2FtcGR1X3J4KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiYWxsb2NhdGUgcnggbWxtZSB0byB0aWQgJWQgZmFpbGVkXG4iLAotCQkJCQl0aWQpOwotI2VuZGlmCi0JCWdvdG8gZW5kOwotCX0KLQkvKiByeCB0aW1lciAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lci5mdW5jdGlvbiA9Ci0JCQkJc3RhX3J4X2FnZ19zZXNzaW9uX3RpbWVyX2V4cGlyZWQ7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5zZXNzaW9uX3RpbWVyLmRhdGEgPQotCQkJCSh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOwotCWluaXRfdGltZXIoJnN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lcik7Ci0KLQl0aWRfYWdnX3J4ID0gc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdOwotCi0JLyogcHJlcGFyZSByZW9yZGVyaW5nIGJ1ZmZlciAqLwotCXRpZF9hZ2dfcngtPnJlb3JkZXJfYnVmID0KLQkJa21hbGxvYyhidWZfc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0aWRfYWdnX3J4LT5yZW9yZGVyX2J1ZikgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jYXRlIHJlb3JkZXJpbmcgYnVmZmVyICIKLQkJCSAgICAgICAidG8gdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmCi0JCWtmcmVlKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSk7Ci0JCWdvdG8gZW5kOwotCX0KLQltZW1zZXQodGlkX2FnZ19yeC0+cmVvcmRlcl9idWYsIDAsCi0JCWJ1Zl9zaXplICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKLQotCWlmIChsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pCi0JCXJldCA9IGxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbihodywgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJULAotCQkJCQkgICAgICAgc3RhLT5hZGRyLCB0aWQsICZzdGFydF9zZXFfbnVtKTsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiUnggQS1NUERVIHJlcXVlc3Qgb24gdGlkICVkIHJlc3VsdCAlZFxuIiwgdGlkLCByZXQpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCi0JaWYgKHJldCkgewotCQlrZnJlZSh0aWRfYWdnX3J4LT5yZW9yZGVyX2J1Zik7Ci0JCWtmcmVlKHRpZF9hZ2dfcngpOwotCQlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0gPSBOVUxMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQkvKiBjaGFuZ2Ugc3RhdGUgYW5kIHNlbmQgYWRkYmEgcmVzcCAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSA9IEhUX0FHR19TVEFURV9PUEVSQVRJT05BTDsKLQl0aWRfYWdnX3J4LT5kaWFsb2dfdG9rZW4gPSBkaWFsb2dfdG9rZW47Ci0JdGlkX2FnZ19yeC0+c3NuID0gc3RhcnRfc2VxX251bTsKLQl0aWRfYWdnX3J4LT5oZWFkX3NlcV9udW0gPSBzdGFydF9zZXFfbnVtOwotCXRpZF9hZ2dfcngtPmJ1Zl9zaXplID0gYnVmX3NpemU7Ci0JdGlkX2FnZ19yeC0+dGltZW91dCA9IHRpbWVvdXQ7Ci0JdGlkX2FnZ19yeC0+c3RvcmVkX21wZHVfbnVtID0gMDsKLQlzdGF0dXMgPSBXTEFOX1NUQVRVU19TVUNDRVNTOwotZW5kOgotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCi1lbmRfbm9fbG9jazoKLQlpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXNwKHN0YS0+c2RhdGEtPmRldiwgc3RhLT5hZGRyLCB0aWQsCi0JCQkJICBkaWFsb2dfdG9rZW4sIHN0YXR1cywgMSwgYnVmX3NpemUsIHRpbWVvdXQpOwotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3Byb2Nlc3NfYWRkYmFfcmVzcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKLQkJCQkJICAgICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAmbG9jYWwtPmh3OwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXUxNiBjYXBhYjsKLQl1MTYgdGlkOwotCXU4ICpzdGF0ZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgbWdtdC0+c2EpOwotCWlmICghc3RhKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JY2FwYWIgPSBsZTE2X3RvX2NwdShtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIpOwotCXRpZCA9IChjYXBhYiAmIElFRUU4MDIxMV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsKLQotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCWlmICghKCpzdGF0ZSAmIEhUX0FEREJBX1JFUVVFU1RFRF9NU0spKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlnb3RvIGFkZGJhX3Jlc3BfZXhpdDsKLQl9Ci0KLQlpZiAobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmRpYWxvZ190b2tlbiAhPQotCQlzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmRpYWxvZ190b2tlbikgewotCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIndyb25nIGFkZEJBIHJlc3BvbnNlIHRva2VuLCB0aWQgJWRcbiIsIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCi0JCWdvdG8gYWRkYmFfcmVzcF9leGl0OwotCX0KLQotCWRlbF90aW1lcl9zeW5jKCZzdGEtPmFtcGR1X21sbWUudGlkX3R4W3RpZF0tPmFkZGJhX3Jlc3BfdGltZXIpOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJzd2l0Y2hlZCBvZmYgYWRkQkEgdGltZXIgZm9yIHRpZCAlZCBcbiIsIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCi0JaWYgKGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpCi0JCQk9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCSpzdGF0ZSB8PSBIVF9BRERCQV9SRUNFSVZFRF9NU0s7Ci0JCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0gPSAwOwotCi0JCWlmICgqc3RhdGUgPT0gSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMKQotCQkJaWVlZTgwMjExX3dha2VfcXVldWUoaHcsIHN0YS0+dGlkX3RvX3R4X3FbdGlkXSk7Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JfSBlbHNlIHsKLQkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSsrOwotCQkvKiB0aGlzIHdpbGwgYWxsb3cgdGhlIHN0YXRlIGNoZWNrIGluIHN0b3BfQkFfc2Vzc2lvbiAqLwotCQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUw7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKGh3LCBzdGEtPmFkZHIsIHRpZCwKLQkJCQkJICAgICBXTEFOX0JBQ0tfSU5JVElBVE9SKTsKLQl9Ci0KLWFkZGJhX3Jlc3BfZXhpdDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc2VuZF9kZWxiYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqZGEsIHUxNiB0aWQsCi0JCQkgIHUxNiBpbml0aWF0b3IsIHUxNiByZWFzb25fY29kZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXUxNiBwYXJhbXM7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqbWdtdCkgKyBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCi0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciAiCi0JCQkJCSJmb3IgZGVsYmEgZnJhbWVcbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIDI0KTsKLQltZW1zZXQobWdtdCwgMCwgMjQpOwotCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKQotCQltZW1jcHkobWdtdC0+YnNzaWQsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQllbHNlCi0JCW1lbWNweShtZ210LT5ic3NpZCwgaWZzdGEtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWdtdC0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlza2JfcHV0KHNrYiwgMSArIHNpemVvZihtZ210LT51LmFjdGlvbi51LmRlbGJhKSk7Ci0KLQltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfQkFDSzsKLQltZ210LT51LmFjdGlvbi51LmRlbGJhLmFjdGlvbl9jb2RlID0gV0xBTl9BQ1RJT05fREVMQkE7Ci0JcGFyYW1zID0gKHUxNikoaW5pdGlhdG9yIDw8IDExKTsgCS8qIGJpdCAxMSBpbml0aWF0b3IgKi8KLQlwYXJhbXMgfD0gKHUxNikodGlkIDw8IDEyKTsgCQkvKiBiaXQgMTU6MTIgVElEIG51bWJlciAqLwotCi0JbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5wYXJhbXMgPSBjcHVfdG9fbGUxNihwYXJhbXMpOwotCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUgPSBjcHVfdG9fbGUxNihyZWFzb25fY29kZSk7Ci0KLQlpZWVlODAyMTFfc3RhX3R4KGRldiwgc2tiLCAwKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc2VuZF9iYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnJhLCB1MTYgdGlkLCB1MTYgc3NuKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2JhciAqYmFyOwotCXUxNiBiYXJfY29udHJvbCA9IDA7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqYmFyKSArIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgIgotCQkJImJhciBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlza2JfcmVzZXJ2ZShza2IsIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSk7Ci0JYmFyID0gKHN0cnVjdCBpZWVlODAyMTFfYmFyICopc2tiX3B1dChza2IsIHNpemVvZigqYmFyKSk7Ci0JbWVtc2V0KGJhciwgMCwgc2l6ZW9mKCpiYXIpKTsKLQliYXItPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX0NUTCwKLQkJCQkJSUVFRTgwMjExX1NUWVBFX0JBQ0tfUkVRKTsKLQltZW1jcHkoYmFyLT5yYSwgcmEsIEVUSF9BTEVOKTsKLQltZW1jcHkoYmFyLT50YSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCWJhcl9jb250cm9sIHw9ICh1MTYpSUVFRTgwMjExX0JBUl9DVFJMX0FDS19QT0xJQ1lfTk9STUFMOwotCWJhcl9jb250cm9sIHw9ICh1MTYpSUVFRTgwMjExX0JBUl9DVFJMX0NCTVRJRF9DT01QUkVTU0VEX0JBOwotCWJhcl9jb250cm9sIHw9ICh1MTYpKHRpZCA8PCAxMik7Ci0JYmFyLT5jb250cm9sID0gY3B1X3RvX2xlMTYoYmFyX2NvbnRyb2wpOwotCWJhci0+c3RhcnRfc2VxX251bSA9IGNwdV90b19sZTE2KHNzbik7Ci0KLQlpZWVlODAyMTFfc3RhX3R4KGRldiwgc2tiLCAwKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcmEsIHUxNiB0aWQsCi0JCQkJCXUxNiBpbml0aWF0b3IsIHUxNiByZWFzb24pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0JaW50IHJldCwgaTsKLQlERUNMQVJFX01BQ19CVUYobWFjKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgcmEpOwotCWlmICghc3RhKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogY2hlY2sgaWYgVElEIGlzIGluIG9wZXJhdGlvbmFsIHN0YXRlICovCi0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCWlmIChzdGEtPmFtcGR1X21sbWUudGlkX3N0YXRlX3J4W3RpZF0KLQkJCQkhPSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUwpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfcnhbdGlkXSA9Ci0JCUhUX0FHR19TVEFURV9SRVFfU1RPUF9CQV9NU0sgfAotCQkoaW5pdGlhdG9yIDw8IEhUX0FHR19TVEFURV9JTklUSUFUT1JfU0hJRlQpOwotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCi0JLyogc3RvcCBIVyBSeCBhZ2dyZWdhdGlvbi4gYW1wZHVfYWN0aW9uIGV4aXN0ZW5jZQotCSAqIGFscmVhZHkgdmVyaWZpZWQgaW4gc2Vzc2lvbiBpbml0IHNvIHdlIGFkZCB0aGUgQlVHX09OICovCi0JQlVHX09OKCFsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24pOwotCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVzIHRpZCAldVxuIiwKLQkJCQlwcmludF9tYWMobWFjLCByYSksIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCi0KLQlyZXQgPSBsb2NhbC0+b3BzLT5hbXBkdV9hY3Rpb24oaHcsIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QLAotCQkJCQlyYSwgdGlkLCBOVUxMKTsKLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9ERUJVRyAiSFcgcHJvYmxlbSAtIGNhbiBub3Qgc3RvcCByeCAiCi0JCQkJImFnZ3JlZ2F0aW9uIGZvciB0aWQgJWRcbiIsIHRpZCk7Ci0KLQkvKiBzaHV0ZG93biB0aW1lciBoYXMgbm90IGV4cGlyZWQgKi8KLQlpZiAoaW5pdGlhdG9yICE9IFdMQU5fQkFDS19USU1FUikKLQkJZGVsX3RpbWVyX3N5bmMoJnN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+c2Vzc2lvbl90aW1lcik7Ci0KLQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgc2VsZiBnZW5lcmF0ZWQgYWdncmVnYXRpb24gaGFsdCAqLwotCWlmIChpbml0aWF0b3IgPT0gV0xBTl9CQUNLX1JFQ0lQSUVOVCB8fCBpbml0aWF0b3IgPT0gV0xBTl9CQUNLX1RJTUVSKQotCQlpZWVlODAyMTFfc2VuZF9kZWxiYShkZXYsIHJhLCB0aWQsIDAsIHJlYXNvbik7Ci0KLQkvKiBmcmVlIHRoZSByZW9yZGVyaW5nIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCBzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPmJ1Zl9zaXplOyBpKyspIHsKLQkJaWYgKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXS0+cmVvcmRlcl9idWZbaV0pIHsKLQkJCS8qIHJlbGVhc2UgdGhlIHJlb3JkZXJlZCBmcmFtZXMgKi8KLQkJCWRldl9rZnJlZV9za2Ioc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5yZW9yZGVyX2J1ZltpXSk7Ci0JCQlzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPnN0b3JlZF9tcGR1X251bS0tOwotCQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdLT5yZW9yZGVyX2J1ZltpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0JLyogZnJlZSByZXNvdXJjZXMgKi8KLQlrZnJlZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0tPnJlb3JkZXJfYnVmKTsKLQlrZnJlZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwotCXN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSA9IE5VTEw7Ci0Jc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV9yeFt0aWRdID0gSFRfQUdHX1NUQVRFX0lETEU7Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3Byb2Nlc3NfZGVsYmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXUxNiB0aWQsIHBhcmFtczsKLQl1MTYgaW5pdGlhdG9yOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBtZ210LT5zYSk7Ci0JaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwYXJhbXMgPSBsZTE2X3RvX2NwdShtZ210LT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyk7Ci0JdGlkID0gKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9USURfTUFTSykgPj4gMTI7Ci0JaW5pdGlhdG9yID0gKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9JTklUSUFUT1JfTUFTSykgPj4gMTE7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQlwcmludGsoS0VSTl9ERUJVRyAiZGVsYmEgZnJvbSAlcyAoJXMpIHRpZCAlZCByZWFzb24gY29kZSAlZFxuIiwKLQkJCXByaW50X21hYyhtYWMsIG1nbXQtPnNhKSwKLQkJCWluaXRpYXRvciA/ICJpbml0aWF0b3IiIDogInJlY2lwaWVudCIsIHRpZCwKLQkJCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLwotCi0JaWYgKGluaXRpYXRvciA9PSBXTEFOX0JBQ0tfSU5JVElBVE9SKQotCQlpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbihkZXYsIHN0YS0+YWRkciwgdGlkLAotCQkJCQkJIFdMQU5fQkFDS19JTklUSUFUT1IsIDApOwotCWVsc2UgeyAvKiBXTEFOX0JBQ0tfUkVDSVBJRU5UICovCi0JCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJc3RhLT5hbXBkdV9tbG1lLnRpZF9zdGF0ZV90eFt0aWRdID0KLQkJCQlIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUw7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKCZsb2NhbC0+aHcsIHN0YS0+YWRkciwgdGlkLAotCQkJCQkgICAgIFdMQU5fQkFDS19SRUNJUElFTlQpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotLyoKLSAqIEFmdGVyIHNlbmRpbmcgYWRkIEJsb2NrIEFjayByZXF1ZXN0IHdlIGFjdGl2YXRlZCBhIHRpbWVyIHVudGlsCi0gKiBhZGQgQmxvY2sgQWNrIHJlc3BvbnNlIHdpbGwgYXJyaXZlIGZyb20gdGhlIHJlY2lwaWVudC4KLSAqIElmIHRoaXMgdGltZXIgZXhwaXJlcyBzdGFfYWRkYmFfcmVzcF90aW1lcl9leHBpcmVkIHdpbGwgYmUgZXhlY3V0ZWQuCi0gKi8KLXZvaWQgc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLyogbm90IGFuIGVsZWdhbnQgZGV0b3VyLCBidXQgdGhlcmUgaXMgbm8gY2hvaWNlIGFzIHRoZSB0aW1lciBwYXNzZXMKLQkgKiBvbmx5IG9uZSBhcmd1bWVudCwgYW5kIGJvdGggc3RhX2luZm8gYW5kIFRJRCBhcmUgbmVlZGVkLCBzbyBpbml0Ci0JICogZmxvdyBpbiBzdGFfaW5mb19jcmVhdGUgZ2l2ZXMgdGhlIFRJRCBhcyBkYXRhLCB3aGlsZSB0aGUgdGltZXJfdG9faWQKLQkgKiBhcnJheSBnaXZlcyB0aGUgc3RhIHRocm91Z2ggY29udGFpbmVyX29mICovCi0JdTE2IHRpZCA9ICoodTggKilkYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqdGVtcF9zdGEgPSBjb250YWluZXJfb2YoKHZvaWQgKilkYXRhLAotCQlzdHJ1Y3Qgc3RhX2luZm8sIHRpbWVyX3RvX3RpZFt0aWRdKTsKLQotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gdGVtcF9zdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gJmxvY2FsLT5odzsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQl1OCAqc3RhdGU7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIHRlbXBfc3RhLT5hZGRyKTsKLQlpZiAoIXN0YSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuOwotCX0KLQotCXN0YXRlID0gJnN0YS0+YW1wZHVfbWxtZS50aWRfc3RhdGVfdHhbdGlkXTsKLQkvKiBjaGVjayBpZiB0aGUgVElEIHdhaXRzIGZvciBhZGRCQSByZXNwb25zZSAqLwotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQlpZiAoISgqc3RhdGUgJiBIVF9BRERCQV9SRVFVRVNURURfTVNLKSkgewotCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQkJKnN0YXRlID0gSFRfQUdHX1NUQVRFX0lETEU7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJ0aW1lciBleHBpcmVkIG9uIHRpZCAlZCBidXQgd2UgYXJlIG5vdCAiCi0JCQkJImV4cGVjdGluZyBhZGRCQSByZXNwb25zZSB0aGVyZSIsIHRpZCk7Ci0jZW5kaWYKLQkJZ290byB0aW1lcl9leHBpcmVkX2V4aXQ7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgImFkZEJBIHJlc3BvbnNlIHRpbWVyIGV4cGlyZWQgb24gdGlkICVkXG4iLCB0aWQpOwotI2VuZGlmCi0KLQkvKiBnbyB0aHJvdWdoIHRoZSBzdGF0ZSBjaGVjayBpbiBzdG9wX0JBX3Nlc3Npb24gKi8KLQkqc3RhdGUgPSBIVF9BR0dfU1RBVEVfT1BFUkFUSU9OQUw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0JaWVlZTgwMjExX3N0b3BfdHhfYmFfc2Vzc2lvbihodywgdGVtcF9zdGEtPmFkZHIsIHRpZCwKLQkJCQkgICAgIFdMQU5fQkFDS19JTklUSUFUT1IpOwotCi10aW1lcl9leHBpcmVkX2V4aXQ6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLS8qCi0gKiBBZnRlciBhY2NlcHRpbmcgdGhlIEFkZEJBIFJlcXVlc3Qgd2UgYWN0aXZhdGVkIGEgdGltZXIsCi0gKiByZXNldHRpbmcgaXQgYWZ0ZXIgZWFjaCBmcmFtZSB0aGF0IGFycml2ZXMgZnJvbSB0aGUgb3JpZ2luYXRvci4KLSAqIGlmIHRoaXMgdGltZXIgZXhwaXJlcyBpZWVlODAyMTFfc3RhX3N0b3BfcnhfYmFfc2Vzc2lvbiB3aWxsIGJlIGV4ZWN1dGVkLgotICovCi1zdGF0aWMgdm9pZCBzdGFfcnhfYWdnX3Nlc3Npb25fdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLyogbm90IGFuIGVsZWdhbnQgZGV0b3VyLCBidXQgdGhlcmUgaXMgbm8gY2hvaWNlIGFzIHRoZSB0aW1lciBwYXNzZXMKLQkgKiBvbmx5IG9uZSBhcmd1bWVudCwgYW5kIHZhcmlvdXMgc3RhX2luZm8gYXJlIG5lZWRlZCBoZXJlLCBzbyBpbml0Ci0JICogZmxvdyBpbiBzdGFfaW5mb19jcmVhdGUgZ2l2ZXMgdGhlIFRJRCBhcyBkYXRhLCB3aGlsZSB0aGUgdGltZXJfdG9faWQKLQkgKiBhcnJheSBnaXZlcyB0aGUgc3RhIHRocm91Z2ggY29udGFpbmVyX29mICovCi0JdTggKnB0aWQgPSAodTggKilkYXRhOwotCXU4ICp0aW1lcl90b19pZCA9IHB0aWQgLSAqcHRpZDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0aW1lcl90b19pZCwgc3RydWN0IHN0YV9pbmZvLAotCQkJCQkgdGltZXJfdG9fdGlkWzBdKTsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJyeCBzZXNzaW9uIHRpbWVyIGV4cGlyZWQgb24gdGlkICVkXG4iLCAodTE2KSpwdGlkKTsKLSNlbmRpZgotCWllZWU4MDIxMV9zdGFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YS0+c2RhdGEtPmRldiwgc3RhLT5hZGRyLAotCQkJCQkgKHUxNikqcHRpZCwgV0xBTl9CQUNLX1RJTUVSLAotCQkJCQkgV0xBTl9SRUFTT05fUVNUQV9USU1FT1VUKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWRkcikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8ICBTVEFfVElEX05VTTsgaSsrKSB7Ci0JCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oJmxvY2FsLT5odywgYWRkciwgaSwKLQkJCQkJICAgICBXTEFOX0JBQ0tfSU5JVElBVE9SKTsKLQkJaWVlZTgwMjExX3N0YV9zdG9wX3J4X2JhX3Nlc3Npb24oZGV2LCBhZGRyLCBpLAotCQkJCQkJIFdMQU5fQkFDS19SRUNJUElFTlQsCi0JCQkJCQkgV0xBTl9SRUFTT05fUVNUQV9MRUFWRV9RQlNTKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX3JlZnVzZV9tZWFzdXJlbWVudF9yZXF1ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfbXNybWVudF9pZSAqcmVxdWVzdF9pZSwKLQkJCQkJY29uc3QgdTggKmRhLCBjb25zdCB1OCAqYnNzaWQsCi0JCQkJCXU4IGRpYWxvZ190b2tlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptc3JfcmVwb3J0OwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2YoKm1zcl9yZXBvcnQpICsgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsKLQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tc3JtZW50X2llKSk7Ci0KLQlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciAiCi0JCQkJIm1lYXN1cmVtZW50IHJlcG9ydCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQltc3JfcmVwb3J0ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNrYl9wdXQoc2tiLCAyNCk7Ci0JbWVtc2V0KG1zcl9yZXBvcnQsIDAsIDI0KTsKLQltZW1jcHkobXNyX3JlcG9ydC0+ZGEsIGRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1zcl9yZXBvcnQtPnNhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1zcl9yZXBvcnQtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCW1zcl9yZXBvcnQtPmZyYW1lX2NvbnRyb2wgPSBJRUVFODAyMTFfRkMoSUVFRTgwMjExX0ZUWVBFX01HTVQsCi0JCQkJCQlJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKLQotCXNrYl9wdXQoc2tiLCAxICsgc2l6ZW9mKG1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQpKTsKLQltc3JfcmVwb3J0LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDsKLQltc3JfcmVwb3J0LT51LmFjdGlvbi51Lm1lYXN1cmVtZW50LmFjdGlvbl9jb2RlID0KLQkJCQlXTEFOX0FDVElPTl9TUENUX01TUl9SUFJUOwotCW1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOwotCi0JbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5lbGVtZW50X2lkID0gV0xBTl9FSURfTUVBU1VSRV9SRVBPUlQ7Ci0JbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5sZW5ndGggPQotCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbXNybWVudF9pZSk7Ci0KLQltZW1zZXQoJm1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQubXNyX2VsZW0sIDAsCi0JCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21zcm1lbnRfaWUpKTsKLQltc3JfcmVwb3J0LT51LmFjdGlvbi51Lm1lYXN1cmVtZW50Lm1zcl9lbGVtLnRva2VuID0gcmVxdWVzdF9pZS0+dG9rZW47Ci0JbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5tc3JfZWxlbS5tb2RlIHw9Ci0JCQlJRUVFODAyMTFfU1BDVF9NU1JfUlBSVF9NT0RFX1JFRlVTRUQ7Ci0JbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5tc3JfZWxlbS50eXBlID0gcmVxdWVzdF9pZS0+dHlwZTsKLQotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOwotfQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3Byb2Nlc3NfbWVhc3VyZW1lbnRfcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCi0JCQkJCQlzaXplX3QgbGVuKQotewotCS8qCi0JICogSWdub3JpbmcgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBzcGVjIHZpb2xhdGlvbi4KLQkgKiBNYW5kYXRvcnkgbWVhc3VyZW1lbnRzIG11c3QgYmUgcmVwb3J0ZWQgb3B0aW9uYWwKLQkgKiBtZWFzdXJlbWVudHMgbWlnaHQgYmUgcmVmdXNlZCBvciByZXBvcnRlZCBpbmNhcGFibGUKLQkgKiBGb3Igbm93IGp1c3QgcmVmdXNlCi0JICogVE9ETzogQW5zd2VyIGJhc2ljIG1lYXN1cmVtZW50IGFzIHVubWVhc3VyZWQKLQkgKi8KLQlpZWVlODAyMTFfc2VuZF9yZWZ1c2VfbWVhc3VyZW1lbnRfcmVxdWVzdChkZXYsCi0JCQkmbWdtdC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5tc3JfZWxlbSwKLQkJCW1nbXQtPnNhLCBtZ210LT5ic3NpZCwKLQkJCW1nbXQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQuZGlhbG9nX3Rva2VuKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkJICAgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJdTE2IGF1dGhfYWxnLCBhdXRoX3RyYW5zYWN0aW9uLCBzdGF0dXNfY29kZTsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAotCWlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX0FVVEhFTlRJQ0FURSAmJgotCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwlpZiAoaWZzdGEtPnN0YXRlICE9IElFRUU4MDIxMV9TVEFfTUxNRV9BVVRIRU5USUNBVEUgJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlyZXR1cm47CiAKIAlpZiAobGVuIDwgMjQgKyA2KQogCQlyZXR1cm47CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCiAJICAgIG1lbWNtcChpZnN0YS0+YnNzaWQsIG1nbXQtPnNhLCBFVEhfQUxFTikgIT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTICYmCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgogCSAgICBtZW1jbXAoaWZzdGEtPmJzc2lkLCBtZ210LT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCiAJCXJldHVybjsKIApAQCAtMTg3MCw3ICsxMDUzLDcgQEAKIAlhdXRoX3RyYW5zYWN0aW9uID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24pOwogCXN0YXR1c19jb2RlID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlKTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgeworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJLyoKIAkJICogSUVFRSA4MDIuMTEgc3RhbmRhcmQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiBpbiBJQlNTCiAJCSAqIG5ldHdvcmtzIGFuZCBtb3N0IGltcGxlbWVudGF0aW9ucyBkbyBub3Qgc2VlbSB0byB1c2UgaXQuCkBAIC0xODc5LDcgKzEwNjIsNyBAQAogCQkgKi8KIAkJaWYgKGF1dGhfYWxnICE9IFdMQU5fQVVUSF9PUEVOIHx8IGF1dGhfdHJhbnNhY3Rpb24gIT0gMSkKIAkJCXJldHVybjsKLQkJaWVlZTgwMjExX3NlbmRfYXV0aChkZXYsIGlmc3RhLCAyLCBOVUxMLCAwLCAwKTsKKwkJaWVlZTgwMjExX3NlbmRfYXV0aChzZGF0YSwgaWZzdGEsIDIsIE5VTEwsIDAsIDApOwogCX0KIAogCWlmIChhdXRoX2FsZyAhPSBpZnN0YS0+YXV0aF9hbGcgfHwKQEAgLTE5MTIsNyArMTA5NSw3IEBACiAJCQkJICAgIGFsZ3NbcG9zXSA9PSAweGZmKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoYWxnc1twb3NdID09IFdMQU5fQVVUSF9TSEFSRURfS0VZICYmCi0JCQkJICAgICFpZWVlODAyMTFfc3RhX3dlcF9jb25maWd1cmVkKGRldikpCisJCQkJICAgICFpZWVlODAyMTFfc3RhX3dlcF9jb25maWd1cmVkKHNkYXRhKSkKIAkJCQkJY29udGludWU7CiAJCQkJaWZzdGEtPmF1dGhfYWxnID0gYWxnc1twb3NdOwogCQkJCWJyZWFrOwpAQCAtMTkyNCwxOSArMTEwNywxOSBAQAogCXN3aXRjaCAoaWZzdGEtPmF1dGhfYWxnKSB7CiAJY2FzZSBXTEFOX0FVVEhfT1BFTjoKIAljYXNlIFdMQU5fQVVUSF9MRUFQOgotCQlpZWVlODAyMTFfYXV0aF9jb21wbGV0ZWQoZGV2LCBpZnN0YSk7CisJCWllZWU4MDIxMV9hdXRoX2NvbXBsZXRlZChzZGF0YSwgaWZzdGEpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQVVUSF9TSEFSRURfS0VZOgogCQlpZiAoaWZzdGEtPmF1dGhfdHJhbnNhY3Rpb24gPT0gNCkKLQkJCWllZWU4MDIxMV9hdXRoX2NvbXBsZXRlZChkZXYsIGlmc3RhKTsKKwkJCWllZWU4MDIxMV9hdXRoX2NvbXBsZXRlZChzZGF0YSwgaWZzdGEpOwogCQllbHNlCi0JCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoZGV2LCBpZnN0YSwgbWdtdCwgbGVuKTsKKwkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShzZGF0YSwgaWZzdGEsIG1nbXQsIGxlbik7CiAJCWJyZWFrOwogCX0KIH0KIAogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9kZWF1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9tZ210X2RlYXV0aChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCQkgICAgIHNpemVfdCBsZW4pCkBAIC0xOTUzLDIyICsxMTM2LDIyIEBACiAJcmVhc29uX2NvZGUgPSBsZTE2X3RvX2NwdShtZ210LT51LmRlYXV0aC5yZWFzb25fY29kZSk7CiAKIAlpZiAoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9BVVRIRU5USUNBVEVEKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRlYXV0aGVudGljYXRlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkZWF1dGhlbnRpY2F0ZWRcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCi0JaWYgKGlmc3RhLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVVUSEVOVElDQVRFIHx8Ci0JICAgIGlmc3RhLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRFIHx8Ci0JICAgIGlmc3RhLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRFRCkgewotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfQVVUSEVOVElDQVRFOworCWlmIChpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX1NUQV9NTE1FX0FVVEhFTlRJQ0FURSB8fAorCSAgICBpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURSB8fAorCSAgICBpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURUQpIHsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0RJUkVDVF9QUk9CRTsKIAkJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKwogCQkJCSAgICAgIElFRUU4MDIxMV9SRVRSWV9BVVRIX0lOVEVSVkFMKTsKIAl9CiAKLQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKGRldiwgaWZzdGEsIDEpOworCWllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc2RhdGEsIGlmc3RhLCB0cnVlLCBmYWxzZSwgMCk7CiAJaWZzdGEtPmZsYWdzICY9IH5JRUVFODAyMTFfU1RBX0FVVEhFTlRJQ0FURUQ7CiB9CiAKIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X21nbXRfZGlzYXNzb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9tZ210X2Rpc2Fzc29jKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCQkgICAgICAgc2l6ZV90IGxlbikKQEAgLTE5ODUsMTUgKzExNjgsMTUgQEAKIAlyZWFzb25fY29kZSA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuZGlzYXNzb2MucmVhc29uX2NvZGUpOwogCiAJaWYgKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQVNTT0NJQVRFRCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhc3NvY2lhdGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpc2Fzc29jaWF0ZWRcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCi0JaWYgKGlmc3RhLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRFRCkgewotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRFOworCWlmIChpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURUQpIHsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURTsKIAkJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKwogCQkJCSAgICAgIElFRUU4MDIxMV9SRVRSWV9BVVRIX0lOVEVSVkFMKTsKIAl9CiAKLQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKGRldiwgaWZzdGEsIDApOworCWllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc2RhdGEsIGlmc3RhLCBmYWxzZSwgZmFsc2UsIDApOwogfQogCiAKQEAgLTIwMDQsNyArMTE4Nyw2IEBACiAJCQkJCSBpbnQgcmVhc3NvYykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2RhdGEtPmRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAl1NjQgcmF0ZXMsIGJhc2ljX3JhdGVzOwpAQCAtMjAxOSw3ICsxMjAxLDcgQEAKIAkvKiBBc3NvY1Jlc3AgYW5kIFJlYXNzb2NSZXNwIGhhdmUgaWRlbnRpY2FsIHN0cnVjdHVyZSwgc28gcHJvY2VzcyBib3RoCiAJICogb2YgdGhlbSBpbiB0aGlzIGZ1bmN0aW9uLiAqLwogCi0JaWYgKGlmc3RhLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRFKQorCWlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURSkKIAkJcmV0dXJuOwogCiAJaWYgKGxlbiA8IDI0ICsgNikKQEAgLTIwMzQsMTIgKzEyMTYsMTIgQEAKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggJXNzc29jUmVzcCBmcm9tICVzIChjYXBhYj0weCV4ICIKIAkgICAgICAgInN0YXR1cz0lZCBhaWQ9JWQpXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHJlYXNzb2MgPyAiUmVhIiA6ICJBIiwgcHJpbnRfbWFjKG1hYywgbWdtdC0+c2EpLAorCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCByZWFzc29jID8gIlJlYSIgOiAiQSIsIHByaW50X21hYyhtYWMsIG1nbXQtPnNhKSwKIAkgICAgICAgY2FwYWJfaW5mbywgc3RhdHVzX2NvZGUsICh1MTYpKGFpZCAmIH4oQklUKDE1KSB8IEJJVCgxNCkpKSk7CiAKIAlpZiAoc3RhdHVzX2NvZGUgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFQIGRlbmllZCBhc3NvY2lhdGlvbiAoY29kZT0lZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1c19jb2RlKTsKKwkJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHN0YXR1c19jb2RlKTsKIAkJLyogaWYgdGhpcyB3YXMgYSByZWFzc29jaWF0aW9uLCBlbnN1cmUgd2UgdHJ5IGEgImZ1bGwiCiAJCSAqIGFzc29jaWF0aW9uIG5leHQgdGltZS4gVGhpcyB3b3JrcyBhcm91bmQgc29tZSBicm9rZW4gQVBzCiAJCSAqIHdoaWNoIGRvIG5vdCBjb3JyZWN0bHkgcmVqZWN0IHJlYXNzb2NpYXRpb24gcmVxdWVzdHMuICovCkBAIC0yMDQ5LDcgKzEyMzEsNyBAQAogCiAJaWYgKChhaWQgJiAoQklUKDE1KSB8IEJJVCgxNCkpKSAhPSAoQklUKDE1KSB8IEJJVCgxNCkpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludmFsaWQgYWlkIHZhbHVlICVkOyBiaXRzIDE1OjE0IG5vdCAiCi0JCSAgICAgICAic2V0XG4iLCBkZXYtPm5hbWUsIGFpZCk7CisJCSAgICAgICAic2V0XG4iLCBzZGF0YS0+ZGV2LT5uYW1lLCBhaWQpOwogCWFpZCAmPSB+KEJJVCgxNSkgfCBCSVQoMTQpKTsKIAogCXBvcyA9IG1nbXQtPnUuYXNzb2NfcmVzcC52YXJpYWJsZTsKQEAgLTIwNTcsMTEgKzEyMzksMTEgQEAKIAogCWlmICghZWxlbXMuc3VwcF9yYXRlcykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIFN1cHBSYXRlcyBlbGVtZW50IGluIEFzc29jUmVzcFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHICIlczogYXNzb2NpYXRlZFxuIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFzc29jaWF0ZWRcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCWlmc3RhLT5haWQgPSBhaWQ7CiAJaWZzdGEtPmFwX2NhcGFiID0gY2FwYWJfaW5mbzsKIApAQCAtMjA3NiwxNyArMTI1OCwxNyBAQAogCS8qIEFkZCBTVEEgZW50cnkgZm9yIHRoZSBBUCAqLwogCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgaWZzdGEtPmJzc2lkKTsKIAlpZiAoIXN0YSkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzczsKKwkJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKIAkJaW50IGVycjsKIAogCQlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgaWZzdGEtPmJzc2lkLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFzdGEpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFsbG9jIFNUQSBlbnRyeSBmb3IiCi0JCQkgICAgICAgIiB0aGUgQVBcbiIsIGRldi0+bmFtZSk7CisJCQkgICAgICAgIiB0aGUgQVBcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQoZGV2LCBpZnN0YS0+YnNzaWQsCisJCWJzcyA9IGllZWU4MDIxMV9yeF9ic3NfZ2V0KGxvY2FsLCBpZnN0YS0+YnNzaWQsCiAJCQkJCSAgIGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmNlbnRlcl9mcmVxLAogCQkJCQkgICBpZnN0YS0+c3NpZCwgaWZzdGEtPnNzaWRfbGVuKTsKIAkJaWYgKGJzcykgewpAQCAtMjA5OSw3ICsxMjgxLDcgQEAKIAkJZXJyID0gc3RhX2luZm9faW5zZXJ0KHN0YSk7CiAJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGluc2VydCBTVEEgZW50cnkgZm9yIgotCQkJICAgICAgICIgdGhlIEFQIChlcnJvciAlZClcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJCSAgICAgICAiIHRoZSBBUCAoZXJyb3IgJWQpXG4iLCBzZGF0YS0+ZGV2LT5uYW1lLCBlcnIpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTIxNTIsOCArMTMzNCw4IEBACiAJCX0KIAl9CiAKLQlzdGEtPnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKLQlzZGF0YS0+YmFzaWNfcmF0ZXMgPSBiYXNpY19yYXRlczsKKwlzdGEtPnN0YS5zdXBwX3JhdGVzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdID0gcmF0ZXM7CisJc2RhdGEtPmJzc19jb25mLmJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXM7CiAKIAkvKiBjZi4gSUVFRSA4MDIuMTEgOS4yLjEyICovCiAJaWYgKGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWiAmJgpAQCAtMjE2NiwyMCArMTM0OCwxOCBAQAogCSAgICAoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9XTU1fRU5BQkxFRCkpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9odF9ic3NfaW5mbyBic3NfaW5mbzsKIAkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19odF9pbmZvKAotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKQotCQkJCWVsZW1zLmh0X2NhcF9lbGVtLCAmc3RhLT5odF9pbmZvKTsKKwkJCQllbGVtcy5odF9jYXBfZWxlbSwgJnN0YS0+c3RhLmh0X2luZm8pOwogCQlpZWVlODAyMTFfaHRfYWRkdF9pbmZvX2llX3RvX2h0X2Jzc19pbmZvKAotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqKQogCQkJCWVsZW1zLmh0X2luZm9fZWxlbSwgJmJzc19pbmZvKTsKLQkJaWVlZTgwMjExX2hhbmRsZV9odChsb2NhbCwgMSwgJnN0YS0+aHRfaW5mbywgJmJzc19pbmZvKTsKKwkJaWVlZTgwMjExX2hhbmRsZV9odChsb2NhbCwgMSwgJnN0YS0+c3RhLmh0X2luZm8sICZic3NfaW5mbyk7CiAJfQogCi0JcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEsIGxvY2FsKTsKKwlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKIAlpZiAoZWxlbXMud21tX3BhcmFtKSB7CiAJCXNldF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9XTUUpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKGRldiwgaWZzdGEsIGVsZW1zLndtbV9wYXJhbSwKKwkJaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKGxvY2FsLCBpZnN0YSwgZWxlbXMud21tX3BhcmFtLAogCQkJCQkgZWxlbXMud21tX3BhcmFtX2xlbik7CiAJfSBlbHNlCiAJCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjE4OCwyMzQgKzEzNjgsMjYgQEAKIAkgKiBpZWVlODAyMTFfc2V0X2Fzc29jaWF0ZWQoKSB3aWxsIHRlbGwgdGhlIGRyaXZlciAqLwogCWJzc19jb25mLT5haWQgPSBhaWQ7CiAJYnNzX2NvbmYtPmFzc29jX2NhcGFiaWxpdHkgPSBjYXBhYl9pbmZvOwotCWllZWU4MDIxMV9zZXRfYXNzb2NpYXRlZChkZXYsIGlmc3RhLCAxKTsKKwlpZWVlODAyMTFfc2V0X2Fzc29jaWF0ZWQoc2RhdGEsIGlmc3RhKTsKIAotCWllZWU4MDIxMV9hc3NvY2lhdGVkKGRldiwgaWZzdGEpOworCWllZWU4MDIxMV9hc3NvY2lhdGVkKHNkYXRhLCBpZnN0YSk7CiB9CiAKIAotLyogQ2FsbGVyIG11c3QgaG9sZCBsb2NhbC0+c3RhX2Jzc19sb2NrICovCi1zdGF0aWMgdm9pZCBfX2llZWU4MDIxMV9yeF9ic3NfaGFzaF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQl1OCBoYXNoX2lkeDsKLQotCWlmIChic3NfbWVzaF9jZmcoYnNzKSkKLQkJaGFzaF9pZHggPSBtZXNoX2lkX2hhc2goYnNzX21lc2hfaWQoYnNzKSwKLQkJCQkJYnNzX21lc2hfaWRfbGVuKGJzcykpOwotCWVsc2UKLQkJaGFzaF9pZHggPSBTVEFfSEFTSChic3MtPmJzc2lkKTsKLQotCWJzcy0+aG5leHQgPSBsb2NhbC0+c3RhX2Jzc19oYXNoW2hhc2hfaWR4XTsKLQlsb2NhbC0+c3RhX2Jzc19oYXNoW2hhc2hfaWR4XSA9IGJzczsKLX0KLQotCi0vKiBDYWxsZXIgbXVzdCBob2xkIGxvY2FsLT5zdGFfYnNzX2xvY2sgKi8KLXN0YXRpYyB2b2lkIF9faWVlZTgwMjExX3J4X2Jzc19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpiLCAqcHJldiA9IE5VTEw7Ci0JYiA9IGxvY2FsLT5zdGFfYnNzX2hhc2hbU1RBX0hBU0goYnNzLT5ic3NpZCldOwotCXdoaWxlIChiKSB7Ci0JCWlmIChiID09IGJzcykgewotCQkJaWYgKCFwcmV2KQotCQkJCWxvY2FsLT5zdGFfYnNzX2hhc2hbU1RBX0hBU0goYnNzLT5ic3NpZCldID0KLQkJCQkJYnNzLT5obmV4dDsKLQkJCWVsc2UKLQkJCQlwcmV2LT5obmV4dCA9IGJzcy0+aG5leHQ7Ci0JCQlicmVhazsKLQkJfQotCQlwcmV2ID0gYjsKLQkJYiA9IGItPmhuZXh0OwotCX0KLX0KLQotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICoKLWllZWU4MDIxMV9yeF9ic3NfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpic3NpZCwgaW50IGZyZXEsCi0JCSAgICAgdTggKnNzaWQsIHU4IHNzaWRfbGVuKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3M7Ci0KLQlic3MgPSBremFsbG9jKHNpemVvZigqYnNzKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFic3MpCi0JCXJldHVybiBOVUxMOwotCWF0b21pY19pbmMoJmJzcy0+dXNlcnMpOwotCWF0b21pY19pbmMoJmJzcy0+dXNlcnMpOwotCW1lbWNweShic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCWJzcy0+ZnJlcSA9IGZyZXE7Ci0JaWYgKHNzaWQgJiYgc3NpZF9sZW4gPD0gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewotCQltZW1jcHkoYnNzLT5zc2lkLCBzc2lkLCBzc2lkX2xlbik7Ci0JCWJzcy0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCS8qIFRPRE86IG9yZGVyIGJ5IFJTU0k/ICovCi0JbGlzdF9hZGRfdGFpbCgmYnNzLT5saXN0LCAmbG9jYWwtPnN0YV9ic3NfbGlzdCk7Ci0JX19pZWVlODAyMTFfcnhfYnNzX2hhc2hfYWRkKGRldiwgYnNzKTsKLQlzcGluX3VubG9ja19iaCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7Ci0JcmV0dXJuIGJzczsKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqCi1pZWVlODAyMTFfcnhfYnNzX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYnNzaWQsIGludCBmcmVxLAotCQkgICAgIHU4ICpzc2lkLCB1OCBzc2lkX2xlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOwotCi0Jc3Bpbl9sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLQlic3MgPSBsb2NhbC0+c3RhX2Jzc19oYXNoW1NUQV9IQVNIKGJzc2lkKV07Ci0Jd2hpbGUgKGJzcykgewotCQlpZiAoIWJzc19tZXNoX2NmZyhic3MpICYmCi0JCSAgICAhbWVtY21wKGJzcy0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgJiYKLQkJICAgIGJzcy0+ZnJlcSA9PSBmcmVxICYmCi0JCSAgICBic3MtPnNzaWRfbGVuID09IHNzaWRfbGVuICYmCi0JCSAgICAoc3NpZF9sZW4gPT0gMCB8fCAhbWVtY21wKGJzcy0+c3NpZCwgc3NpZCwgc3NpZF9sZW4pKSkgewotCQkJYXRvbWljX2luYygmYnNzLT51c2Vycyk7Ci0JCQlicmVhazsKLQkJfQotCQlic3MgPSBic3MtPmhuZXh0OwotCX0KLQlzcGluX3VubG9ja19iaCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7Ci0JcmV0dXJuIGJzczsKLX0KLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICoKLWllZWU4MDIxMV9yeF9tZXNoX2Jzc19nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm1lc2hfaWQsIGludCBtZXNoX2lkX2xlbiwKLQkJCSAgdTggKm1lc2hfY2ZnLCBpbnQgZnJlcSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOwotCi0Jc3Bpbl9sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLQlic3MgPSBsb2NhbC0+c3RhX2Jzc19oYXNoW21lc2hfaWRfaGFzaChtZXNoX2lkLCBtZXNoX2lkX2xlbildOwotCXdoaWxlIChic3MpIHsKLQkJaWYgKGJzc19tZXNoX2NmZyhic3MpICYmCi0JCSAgICAhbWVtY21wKGJzc19tZXNoX2NmZyhic3MpLCBtZXNoX2NmZywgTUVTSF9DRkdfQ01QX0xFTikgJiYKLQkJICAgIGJzcy0+ZnJlcSA9PSBmcmVxICYmCi0JCSAgICBtZXNoX2lkX2xlbiA9PSBic3MtPm1lc2hfaWRfbGVuICYmCi0JCSAgICAobWVzaF9pZF9sZW4gPT0gMCB8fCAhbWVtY21wKGJzcy0+bWVzaF9pZCwgbWVzaF9pZCwKLQkJCQkJCSBtZXNoX2lkX2xlbikpKSB7Ci0JCQlhdG9taWNfaW5jKCZic3MtPnVzZXJzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJzcyA9IGJzcy0+aG5leHQ7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLQlyZXR1cm4gYnNzOwotfQotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICoKLWllZWU4MDIxMV9yeF9tZXNoX2Jzc19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm1lc2hfaWQsIGludCBtZXNoX2lkX2xlbiwKLQkJCSAgdTggKm1lc2hfY2ZnLCBpbnQgbWVzaF9jb25maWdfbGVuLCBpbnQgZnJlcSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOwotCi0JaWYgKG1lc2hfY29uZmlnX2xlbiAhPSBNRVNIX0NGR19MRU4pCi0JCXJldHVybiBOVUxMOwotCi0JYnNzID0ga3phbGxvYyhzaXplb2YoKmJzcyksIEdGUF9BVE9NSUMpOwotCWlmICghYnNzKQotCQlyZXR1cm4gTlVMTDsKLQotCWJzcy0+bWVzaF9jZmcgPSBrbWFsbG9jKE1FU0hfQ0ZHX0NNUF9MRU4sIEdGUF9BVE9NSUMpOwotCWlmICghYnNzLT5tZXNoX2NmZykgewotCQlrZnJlZShic3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAobWVzaF9pZF9sZW4gJiYgbWVzaF9pZF9sZW4gPD0gSUVFRTgwMjExX01BWF9NRVNIX0lEX0xFTikgewotCQlic3MtPm1lc2hfaWQgPSBrbWFsbG9jKG1lc2hfaWRfbGVuLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFic3MtPm1lc2hfaWQpIHsKLQkJCWtmcmVlKGJzcy0+bWVzaF9jZmcpOwotCQkJa2ZyZWUoYnNzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1lbWNweShic3MtPm1lc2hfaWQsIG1lc2hfaWQsIG1lc2hfaWRfbGVuKTsKLQl9Ci0KLQlhdG9taWNfaW5jKCZic3MtPnVzZXJzKTsKLQlhdG9taWNfaW5jKCZic3MtPnVzZXJzKTsKLQltZW1jcHkoYnNzLT5tZXNoX2NmZywgbWVzaF9jZmcsIE1FU0hfQ0ZHX0NNUF9MRU4pOwotCWJzcy0+bWVzaF9pZF9sZW4gPSBtZXNoX2lkX2xlbjsKLQlic3MtPmZyZXEgPSBmcmVxOwotCXNwaW5fbG9ja19iaCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7Ci0JLyogVE9ETzogb3JkZXIgYnkgUlNTST8gKi8KLQlsaXN0X2FkZF90YWlsKCZic3MtPmxpc3QsICZsb2NhbC0+c3RhX2Jzc19saXN0KTsKLQlfX2llZWU4MDIxMV9yeF9ic3NfaGFzaF9hZGQoZGV2LCBic3MpOwotCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLQlyZXR1cm4gYnNzOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9ic3NfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcykKLXsKLQlrZnJlZShic3MtPndwYV9pZSk7Ci0Ja2ZyZWUoYnNzLT5yc25faWUpOwotCWtmcmVlKGJzcy0+d21tX2llKTsKLQlrZnJlZShic3MtPmh0X2llKTsKLQlrZnJlZShic3MtPmh0X2FkZF9pZSk7Ci0Ja2ZyZWUoYnNzX21lc2hfaWQoYnNzKSk7Ci0Ja2ZyZWUoYnNzX21lc2hfY2ZnKGJzcykpOwotCWtmcmVlKGJzcyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X2Jzc19wdXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzKQotewotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmJzcy0+dXNlcnMsICZsb2NhbC0+c3RhX2Jzc19sb2NrKSkgewotCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJcmV0dXJuOwotCX0KLQotCV9faWVlZTgwMjExX3J4X2Jzc19oYXNoX2RlbChsb2NhbCwgYnNzKTsKLQlsaXN0X2RlbCgmYnNzLT5saXN0KTsKLQlzcGluX3VubG9ja19iaCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7Ci0JaWVlZTgwMjExX3J4X2Jzc19mcmVlKGJzcyk7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfcnhfYnNzX2xpc3RfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKLXsKLQlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5zdGFfYnNzX2xpc3QpOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3J4X2Jzc19saXN0X2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcywgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShic3MsIHRtcCwgJmxvY2FsLT5zdGFfYnNzX2xpc3QsIGxpc3QpCi0JCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBic3MpOwotfQotCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9qb2luX2lic3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9qb2luX2lic3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzKQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlpbnQgcmVzLCByYXRlcywgaSwgajsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAl1OCAqcG9zOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKIAotCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQogCS8qIFJlbW92ZSBwb3NzaWJsZSBTVEEgZW50cmllcyBmcm9tIG90aGVyIElCU1MgbmV0d29ya3MuICovCiAJc3RhX2luZm9fZmx1c2hfZGVsYXllZChzZGF0YSk7CiAKQEAgLTI0MzMsNyArMTQwNSw3IEBACiAJc2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQgPSBic3MtPmNhcGFiaWxpdHkgJgogCQlXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSA/IDEgOiAwOwogCi0JcmVzID0gaWVlZTgwMjExX3NldF9mcmVxKGRldiwgYnNzLT5mcmVxKTsKKwlyZXMgPSBpZWVlODAyMTFfc2V0X2ZyZXEoc2RhdGEsIGJzcy0+ZnJlcSk7CiAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwpAQCAtMjQ0NiwxMCArMTQxOCwxMCBAQAogCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKQogCQkJc2tiX3B1dChza2IsIDI0ICsgc2l6ZW9mKG1nbXQtPnUuYmVhY29uKSk7CiAJCW1lbXNldChtZ210LCAwLCAyNCArIHNpemVvZihtZ210LT51LmJlYWNvbikpOwotCQltZ210LT5mcmFtZV9jb250cm9sID0gSUVFRTgwMjExX0ZDKElFRUU4MDIxMV9GVFlQRV9NR01ULAotCQkJCQkJICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCQltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CiAJCW1lbXNldChtZ210LT5kYSwgMHhmZiwgRVRIX0FMRU4pOwotCQltZW1jcHkobWdtdC0+c2EsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1nbXQtPnNhLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCQltZW1jcHkobWdtdC0+YnNzaWQsIGlmc3RhLT5ic3NpZCwgRVRIX0FMRU4pOwogCQltZ210LT51LmJlYWNvbi5iZWFjb25faW50ID0KIAkJCWNwdV90b19sZTE2KGxvY2FsLT5ody5jb25mLmJlYWNvbl9pbnQpOwpAQCAtMjUwNiwxMDggKzE0NzgsMzggQEAKIAl9CiAJaWZzdGEtPnN1cHBfcmF0ZXNfYml0c1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSA9IHJhdGVzOwogCi0JaWVlZTgwMjExX3N0YV9kZWZfd21tX3BhcmFtcyhkZXYsIGJzcywgMSk7CisJaWVlZTgwMjExX3N0YV9kZWZfd21tX3BhcmFtcyhzZGF0YSwgYnNzKTsKIAotCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9JQlNTX0pPSU5FRDsKKwlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfU1RBX01MTUVfSUJTU19KT0lORUQ7CiAJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKyBJRUVFODAyMTFfSUJTU19NRVJHRV9JTlRFUlZBTCk7CiAKKwlpZWVlODAyMTFfbGVkX2Fzc29jKGxvY2FsLCB0cnVlKTsKKwogCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKIAltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChzZGF0YS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAogCXJldHVybiByZXM7CiB9CiAKLXU2NCBpZWVlODAyMTFfc3RhX2dldF9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqZWxlbXMsCi0JCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqYml0cmF0ZXM7Ci0Jc2l6ZV90IG51bV9yYXRlczsKLQl1NjQgc3VwcF9yYXRlczsKLQlpbnQgaSwgajsKLQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbYmFuZF07Ci0KLQlpZiAoIXNiYW5kKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKLQl9Ci0KLQliaXRyYXRlcyA9IHNiYW5kLT5iaXRyYXRlczsKLQludW1fcmF0ZXMgPSBzYmFuZC0+bl9iaXRyYXRlczsKLQlzdXBwX3JhdGVzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgZWxlbXMtPnN1cHBfcmF0ZXNfbGVuICsKLQkJICAgICBlbGVtcy0+ZXh0X3N1cHBfcmF0ZXNfbGVuOyBpKyspIHsKLQkJdTggcmF0ZSA9IDA7Ci0JCWludCBvd25fcmF0ZTsKLQkJaWYgKGkgPCBlbGVtcy0+c3VwcF9yYXRlc19sZW4pCi0JCQlyYXRlID0gZWxlbXMtPnN1cHBfcmF0ZXNbaV07Ci0JCWVsc2UgaWYgKGVsZW1zLT5leHRfc3VwcF9yYXRlcykKLQkJCXJhdGUgPSBlbGVtcy0+ZXh0X3N1cHBfcmF0ZXMKLQkJCQlbaSAtIGVsZW1zLT5zdXBwX3JhdGVzX2xlbl07Ci0JCW93bl9yYXRlID0gNSAqIChyYXRlICYgMHg3Zik7Ci0JCWZvciAoaiA9IDA7IGogPCBudW1fcmF0ZXM7IGorKykKLQkJCWlmIChiaXRyYXRlc1tqXS5iaXRyYXRlID09IG93bl9yYXRlKQotCQkJCXN1cHBfcmF0ZXMgfD0gQklUKGopOwotCX0KLQlyZXR1cm4gc3VwcF9yYXRlczsKLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfYnNzX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9ic3NfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCQkgIHNpemVfdCBsZW4sCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAogCQkJCSAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zLAotCQkJCSAgaW50IGJlYWNvbikKKwkJCQkgIGJvb2wgYmVhY29uKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0JaW50IGZyZXEsIGNsZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3M7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJaW50IGZyZXE7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0JdTY0IGJlYWNvbl90aW1lc3RhbXAsIHJ4X3RpbWVzdGFtcDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJdTY0IGJlYWNvbl90aW1lc3RhbXAsIHJ4X3RpbWVzdGFtcDsKKwl1NjQgc3VwcF9yYXRlcyA9IDA7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gcnhfc3RhdHVzLT5iYW5kOwogCURFQ0xBUkVfTUFDX0JVRihtYWMpOwogCURFQ0xBUkVfTUFDX0JVRihtYWMyKTsKIAotCWlmICghYmVhY29uICYmIG1lbWNtcChtZ210LT5kYSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQotCQlyZXR1cm47IC8qIGlnbm9yZSBQcm9iZVJlc3AgdG8gZm9yZWlnbiBhZGRyZXNzICovCi0KLQliZWFjb25fdGltZXN0YW1wID0gbGU2NF90b19jcHUobWdtdC0+dS5iZWFjb24udGltZXN0YW1wKTsKLQotCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpICYmIGVsZW1zLT5tZXNoX2lkICYmCi0JICAgIGVsZW1zLT5tZXNoX2NvbmZpZyAmJiBtZXNoX21hdGNoZXNfbG9jYWwoZWxlbXMsIGRldikpIHsKLQkJdTY0IHJhdGVzID0gaWVlZTgwMjExX3N0YV9nZXRfcmF0ZXMobG9jYWwsIGVsZW1zLAotCQkJCQkJcnhfc3RhdHVzLT5iYW5kKTsKLQotCQltZXNoX25laWdoYm91cl91cGRhdGUobWdtdC0+c2EsIHJhdGVzLCBkZXYsCi0JCQkJICAgICAgbWVzaF9wZWVyX2FjY2VwdHNfcGxpbmtzKGVsZW1zLCBkZXYpKTsKLQl9Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYgZWxlbXMtPnN1cHBfcmF0ZXMgJiYKLQkgICAgbWVtY21wKG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKSA9PSAwICYmCi0JICAgIChzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIG1nbXQtPnNhKSkpIHsKLQkJdTY0IHByZXZfcmF0ZXM7Ci0JCXU2NCBzdXBwX3JhdGVzID0gaWVlZTgwMjExX3N0YV9nZXRfcmF0ZXMobG9jYWwsIGVsZW1zLAotCQkJCQkJCXJ4X3N0YXR1cy0+YmFuZCk7Ci0KLQkJcHJldl9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tyeF9zdGF0dXMtPmJhbmRdOwotCQlzdGEtPnN1cHBfcmF0ZXNbcnhfc3RhdHVzLT5iYW5kXSAmPSBzdXBwX3JhdGVzOwotCQlpZiAoc3RhLT5zdXBwX3JhdGVzW3J4X3N0YXR1cy0+YmFuZF0gPT0gMCkgewotCQkJLyogTm8gbWF0Y2hpbmcgcmF0ZXMgLSB0aGlzIHNob3VsZCBub3QgcmVhbGx5IGhhcHBlbi4KLQkJCSAqIE1ha2Ugc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSByYXRlIGlzIG1hcmtlZAotCQkJICogc3VwcG9ydGVkIHRvIGF2b2lkIGlzc3VlcyB3aXRoIFRYIHJhdGUgY3RybC4gKi8KLQkJCXN0YS0+c3VwcF9yYXRlc1tyeF9zdGF0dXMtPmJhbmRdID0KLQkJCQlzZGF0YS0+dS5zdGEuc3VwcF9yYXRlc19iaXRzW3J4X3N0YXR1cy0+YmFuZF07Ci0JCX0KLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQogCWlmIChlbGVtcy0+ZHNfcGFyYW1zICYmIGVsZW1zLT5kc19wYXJhbXNfbGVuID09IDEpCiAJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koZWxlbXMtPmRzX3BhcmFtc1swXSk7CiAJZWxzZQpAQCAtMjYxOCwyMTUgKzE1MjAsNjAgQEAKIAlpZiAoIWNoYW5uZWwgfHwgY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKLQlpZiAoZWxlbXMtPm1lc2hfY29uZmlnKQotCQlic3MgPSBpZWVlODAyMTFfcnhfbWVzaF9ic3NfZ2V0KGRldiwgZWxlbXMtPm1lc2hfaWQsCi0JCQkJZWxlbXMtPm1lc2hfaWRfbGVuLCBlbGVtcy0+bWVzaF9jb25maWcsIGZyZXEpOwotCWVsc2UKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIGVsZW1zLT5zdXBwX3JhdGVzICYmCisJICAgIG1lbWNtcChtZ210LT5ic3NpZCwgc2RhdGEtPnUuc3RhLmJzc2lkLCBFVEhfQUxFTikgPT0gMCkgeworCQlzdXBwX3JhdGVzID0gaWVlZTgwMjExX3N0YV9nZXRfcmF0ZXMobG9jYWwsIGVsZW1zLCBiYW5kKTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisKKwkJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBtZ210LT5zYSk7CisJCWlmIChzdGEpIHsKKwkJCXU2NCBwcmV2X3JhdGVzOworCisJCQlwcmV2X3JhdGVzID0gc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXTsKKwkJCS8qIG1ha2Ugc3VyZSBtYW5kYXRvcnkgcmF0ZXMgYXJlIGFsd2F5cyBhZGRlZCAqLworCQkJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSA9IHN1cHBfcmF0ZXMgfAorCQkJCWllZWU4MDIxMV9tYW5kYXRvcnlfcmF0ZXMobG9jYWwsIGJhbmQpOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKKwkJCWlmIChzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdICE9IHByZXZfcmF0ZXMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVkIHN1cHBfcmF0ZXMgc2V0ICIKKwkJCQkgICAgImZvciAlcyBiYXNlZCBvbiBiZWFjb24gaW5mbyAoMHglbGx4IHwgIgorCQkJCSAgICAiMHglbGx4IC0+IDB4JWxseClcbiIsCisJCQkJICAgIHNkYXRhLT5kZXYtPm5hbWUsCisJCQkJICAgIHByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwcmV2X3JhdGVzLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdXBwX3JhdGVzLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdKTsKICNlbmRpZgotCQlic3MgPSBpZWVlODAyMTFfcnhfYnNzX2dldChkZXYsIG1nbXQtPmJzc2lkLCBmcmVxLAotCQkJCQkgICBlbGVtcy0+c3NpZCwgZWxlbXMtPnNzaWRfbGVuKTsKLQlpZiAoIWJzcykgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICi0JCWlmIChlbGVtcy0+bWVzaF9jb25maWcpCi0JCQlic3MgPSBpZWVlODAyMTFfcnhfbWVzaF9ic3NfYWRkKGRldiwgZWxlbXMtPm1lc2hfaWQsCi0JCQkJZWxlbXMtPm1lc2hfaWRfbGVuLCBlbGVtcy0+bWVzaF9jb25maWcsCi0JCQkJZWxlbXMtPm1lc2hfY29uZmlnX2xlbiwgZnJlcSk7Ci0JCWVsc2UKLSNlbmRpZgotCQkJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19hZGQoZGV2LCBtZ210LT5ic3NpZCwgZnJlcSwKLQkJCQkJCSAgZWxlbXMtPnNzaWQsIGVsZW1zLT5zc2lkX2xlbik7Ci0JCWlmICghYnNzKQotCQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0jaWYgMAotCQkvKiBUT0RPOiBvcmRlciBieSBSU1NJPyAqLwotCQlzcGluX2xvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCQlsaXN0X21vdmVfdGFpbCgmYnNzLT5saXN0LCAmbG9jYWwtPnN0YV9ic3NfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLSNlbmRpZgorCQl9IGVsc2UgeworCQkJaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgTlVMTCwgbWdtdC0+YnNzaWQsCisJCQkJCSAgICAgICBtZ210LT5zYSwgc3VwcF9yYXRlcyk7CisJCX0KKworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKLQkvKiBzYXZlIHRoZSBFUlAgdmFsdWUgc28gdGhhdCBpdCBpcyBhdmFpbGFibGUgYXQgYXNzb2NpYXRpb24gdGltZSAqLwotCWlmIChlbGVtcy0+ZXJwX2luZm8gJiYgZWxlbXMtPmVycF9pbmZvX2xlbiA+PSAxKSB7Ci0JCWJzcy0+ZXJwX3ZhbHVlID0gZWxlbXMtPmVycF9pbmZvWzBdOwotCQlic3MtPmhhc19lcnBfdmFsdWUgPSAxOwotCX0KKwlic3MgPSBpZWVlODAyMTFfYnNzX2luZm9fdXBkYXRlKGxvY2FsLCByeF9zdGF0dXMsIG1nbXQsIGxlbiwgZWxlbXMsCisJCQkJCWZyZXEsIGJlYWNvbik7CisJaWYgKCFic3MpCisJCXJldHVybjsKIAotCWlmIChlbGVtcy0+aHRfY2FwX2VsZW0gJiYKLQkgICAgICghYnNzLT5odF9pZSB8fCBic3MtPmh0X2llX2xlbiAhPSBlbGVtcy0+aHRfY2FwX2VsZW1fbGVuIHx8Ci0JICAgICBtZW1jbXAoYnNzLT5odF9pZSwgZWxlbXMtPmh0X2NhcF9lbGVtLCBlbGVtcy0+aHRfY2FwX2VsZW1fbGVuKSkpIHsKLQkJa2ZyZWUoYnNzLT5odF9pZSk7Ci0JCWJzcy0+aHRfaWUgPSBrbWFsbG9jKGVsZW1zLT5odF9jYXBfZWxlbV9sZW4gKyAyLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGJzcy0+aHRfaWUpIHsKLQkJCW1lbWNweShic3MtPmh0X2llLCBlbGVtcy0+aHRfY2FwX2VsZW0gLSAyLAotCQkJCWVsZW1zLT5odF9jYXBfZWxlbV9sZW4gKyAyKTsKLQkJCWJzcy0+aHRfaWVfbGVuID0gZWxlbXMtPmh0X2NhcF9lbGVtX2xlbiArIDI7Ci0JCX0gZWxzZQotCQkJYnNzLT5odF9pZV9sZW4gPSAwOwotCX0gZWxzZSBpZiAoIWVsZW1zLT5odF9jYXBfZWxlbSAmJiBic3MtPmh0X2llKSB7Ci0JCWtmcmVlKGJzcy0+aHRfaWUpOwotCQlic3MtPmh0X2llID0gTlVMTDsKLQkJYnNzLT5odF9pZV9sZW4gPSAwOwotCX0KLQotCWlmIChlbGVtcy0+aHRfaW5mb19lbGVtICYmCi0JICAgICAoIWJzcy0+aHRfYWRkX2llIHx8Ci0JICAgICBic3MtPmh0X2FkZF9pZV9sZW4gIT0gZWxlbXMtPmh0X2luZm9fZWxlbV9sZW4gfHwKLQkgICAgIG1lbWNtcChic3MtPmh0X2FkZF9pZSwgZWxlbXMtPmh0X2luZm9fZWxlbSwKLQkJCWVsZW1zLT5odF9pbmZvX2VsZW1fbGVuKSkpIHsKLQkJa2ZyZWUoYnNzLT5odF9hZGRfaWUpOwotCQlic3MtPmh0X2FkZF9pZSA9Ci0JCQlrbWFsbG9jKGVsZW1zLT5odF9pbmZvX2VsZW1fbGVuICsgMiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChic3MtPmh0X2FkZF9pZSkgewotCQkJbWVtY3B5KGJzcy0+aHRfYWRkX2llLCBlbGVtcy0+aHRfaW5mb19lbGVtIC0gMiwKLQkJCQllbGVtcy0+aHRfaW5mb19lbGVtX2xlbiArIDIpOwotCQkJYnNzLT5odF9hZGRfaWVfbGVuID0gZWxlbXMtPmh0X2luZm9fZWxlbV9sZW4gKyAyOwotCQl9IGVsc2UKLQkJCWJzcy0+aHRfYWRkX2llX2xlbiA9IDA7Ci0JfSBlbHNlIGlmICghZWxlbXMtPmh0X2luZm9fZWxlbSAmJiBic3MtPmh0X2FkZF9pZSkgewotCQlrZnJlZShic3MtPmh0X2FkZF9pZSk7Ci0JCWJzcy0+aHRfYWRkX2llID0gTlVMTDsKLQkJYnNzLT5odF9hZGRfaWVfbGVuID0gMDsKLQl9Ci0KLQlic3MtPmJlYWNvbl9pbnQgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5iZWFjb25faW50KTsKLQlic3MtPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQotCWlmIChlbGVtcy0+dGltKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdGltX2llICp0aW1faWUgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfdGltX2llICopZWxlbXMtPnRpbTsKLQkJYnNzLT5kdGltX3BlcmlvZCA9IHRpbV9pZS0+ZHRpbV9wZXJpb2Q7Ci0JfQotCi0JLyogc2V0IGRlZmF1bHQgdmFsdWUgZm9yIGJ1Z2d5IEFQcyAqLwotCWlmICghZWxlbXMtPnRpbSB8fCBic3MtPmR0aW1fcGVyaW9kID09IDApCi0JCWJzcy0+ZHRpbV9wZXJpb2QgPSAxOwotCi0JYnNzLT5zdXBwX3JhdGVzX2xlbiA9IDA7Ci0JaWYgKGVsZW1zLT5zdXBwX3JhdGVzKSB7Ci0JCWNsZW4gPSBJRUVFODAyMTFfTUFYX1NVUFBfUkFURVMgLSBic3MtPnN1cHBfcmF0ZXNfbGVuOwotCQlpZiAoY2xlbiA+IGVsZW1zLT5zdXBwX3JhdGVzX2xlbikKLQkJCWNsZW4gPSBlbGVtcy0+c3VwcF9yYXRlc19sZW47Ci0JCW1lbWNweSgmYnNzLT5zdXBwX3JhdGVzW2Jzcy0+c3VwcF9yYXRlc19sZW5dLCBlbGVtcy0+c3VwcF9yYXRlcywKLQkJICAgICAgIGNsZW4pOwotCQlic3MtPnN1cHBfcmF0ZXNfbGVuICs9IGNsZW47Ci0JfQotCWlmIChlbGVtcy0+ZXh0X3N1cHBfcmF0ZXMpIHsKLQkJY2xlbiA9IElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUyAtIGJzcy0+c3VwcF9yYXRlc19sZW47Ci0JCWlmIChjbGVuID4gZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbikKLQkJCWNsZW4gPSBlbGVtcy0+ZXh0X3N1cHBfcmF0ZXNfbGVuOwotCQltZW1jcHkoJmJzcy0+c3VwcF9yYXRlc1tic3MtPnN1cHBfcmF0ZXNfbGVuXSwKLQkJICAgICAgIGVsZW1zLT5leHRfc3VwcF9yYXRlcywgY2xlbik7Ci0JCWJzcy0+c3VwcF9yYXRlc19sZW4gKz0gY2xlbjsKLQl9Ci0KLQlic3MtPmJhbmQgPSByeF9zdGF0dXMtPmJhbmQ7Ci0KLQlic3MtPnRpbWVzdGFtcCA9IGJlYWNvbl90aW1lc3RhbXA7Ci0JYnNzLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7Ci0JYnNzLT5zaWduYWwgPSByeF9zdGF0dXMtPnNpZ25hbDsKLQlic3MtPm5vaXNlID0gcnhfc3RhdHVzLT5ub2lzZTsKLQlic3MtPnF1YWwgPSByeF9zdGF0dXMtPnF1YWw7Ci0JaWYgKCFiZWFjb24gJiYgIWJzcy0+cHJvYmVfcmVzcCkKLQkJYnNzLT5wcm9iZV9yZXNwID0gdHJ1ZTsKKwkvKiB3YXMganVzdCB1cGRhdGVkIGluIGllZWU4MDIxMV9ic3NfaW5mb191cGRhdGUgKi8KKwliZWFjb25fdGltZXN0YW1wID0gYnNzLT50aW1lc3RhbXA7CiAKIAkvKgogCSAqIEluIFNUQSBtb2RlLCB0aGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgc2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuCiAJICogYnkgYmVhY29ucyBiZWNhdXNlIHRoZXkncmUgbm90IG5lY2Vzc2FyaWx5IGFjY3VyYXRlIHRoZXJlLgogCSAqLwotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJgotCSAgICBic3MtPnByb2JlX3Jlc3AgJiYgYmVhY29uKSB7CisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgorCSAgICBic3MtPmxhc3RfcHJvYmVfcmVzcCAmJiBiZWFjb24pIHsKIAkJaWVlZTgwMjExX3J4X2Jzc19wdXQobG9jYWwsIGJzcyk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZWxlbXMtPndwYSAmJgotCSAgICAoIWJzcy0+d3BhX2llIHx8IGJzcy0+d3BhX2llX2xlbiAhPSBlbGVtcy0+d3BhX2xlbiB8fAotCSAgICAgbWVtY21wKGJzcy0+d3BhX2llLCBlbGVtcy0+d3BhLCBlbGVtcy0+d3BhX2xlbikpKSB7Ci0JCWtmcmVlKGJzcy0+d3BhX2llKTsKLQkJYnNzLT53cGFfaWUgPSBrbWFsbG9jKGVsZW1zLT53cGFfbGVuICsgMiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChic3MtPndwYV9pZSkgewotCQkJbWVtY3B5KGJzcy0+d3BhX2llLCBlbGVtcy0+d3BhIC0gMiwgZWxlbXMtPndwYV9sZW4gKyAyKTsKLQkJCWJzcy0+d3BhX2llX2xlbiA9IGVsZW1zLT53cGFfbGVuICsgMjsKLQkJfSBlbHNlCi0JCQlic3MtPndwYV9pZV9sZW4gPSAwOwotCX0gZWxzZSBpZiAoIWVsZW1zLT53cGEgJiYgYnNzLT53cGFfaWUpIHsKLQkJa2ZyZWUoYnNzLT53cGFfaWUpOwotCQlic3MtPndwYV9pZSA9IE5VTEw7Ci0JCWJzcy0+d3BhX2llX2xlbiA9IDA7Ci0JfQotCi0JaWYgKGVsZW1zLT5yc24gJiYKLQkgICAgKCFic3MtPnJzbl9pZSB8fCBic3MtPnJzbl9pZV9sZW4gIT0gZWxlbXMtPnJzbl9sZW4gfHwKLQkgICAgIG1lbWNtcChic3MtPnJzbl9pZSwgZWxlbXMtPnJzbiwgZWxlbXMtPnJzbl9sZW4pKSkgewotCQlrZnJlZShic3MtPnJzbl9pZSk7Ci0JCWJzcy0+cnNuX2llID0ga21hbGxvYyhlbGVtcy0+cnNuX2xlbiArIDIsIEdGUF9BVE9NSUMpOwotCQlpZiAoYnNzLT5yc25faWUpIHsKLQkJCW1lbWNweShic3MtPnJzbl9pZSwgZWxlbXMtPnJzbiAtIDIsIGVsZW1zLT5yc25fbGVuICsgMik7Ci0JCQlic3MtPnJzbl9pZV9sZW4gPSBlbGVtcy0+cnNuX2xlbiArIDI7Ci0JCX0gZWxzZQotCQkJYnNzLT5yc25faWVfbGVuID0gMDsKLQl9IGVsc2UgaWYgKCFlbGVtcy0+cnNuICYmIGJzcy0+cnNuX2llKSB7Ci0JCWtmcmVlKGJzcy0+cnNuX2llKTsKLQkJYnNzLT5yc25faWUgPSBOVUxMOwotCQlic3MtPnJzbl9pZV9sZW4gPSAwOwotCX0KLQotCS8qCi0JICogQ2YuCi0JICogaHR0cDovL3d3dy53aXBvLmludC9wY3RkYi9lbi93by5qc3A/d289MjAwNzA0NzE4MSZJQT1XTzIwMDcwNDcxODEmRElTUExBWT1ERVNDCi0JICoKLQkgKiBxdW90aW5nOgotCSAqCi0JICogSW4gcGFydGljdWxhciwgIldpLUZpIENFUlRJRklFRCBmb3IgV01NIC0gU3VwcG9ydCBmb3IgTXVsdGltZWRpYQotCSAqIEFwcGxpY2F0aW9ucyB3aXRoIFF1YWxpdHkgb2YgU2VydmljZSBpbiBXaS1GaSBOZXR3b3JrcywiIFdpLSBGaQotCSAqIEFsbGlhbmNlIChTZXB0ZW1iZXIgMSwgMjAwNCkgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZSBoZXJlaW4uCi0JICogVGhlIGluY2x1c2lvbiBvZiB0aGUgV01NIFBhcmFtZXRlcnMgaW4gcHJvYmUgcmVzcG9uc2VzIGFuZAotCSAqIGFzc29jaWF0aW9uIHJlc3BvbnNlcyBpcyBtYW5kYXRvcnkgZm9yIFdNTSBlbmFibGVkIG5ldHdvcmtzLiBUaGUKLQkgKiBpbmNsdXNpb24gb2YgdGhlIFdNTSBQYXJhbWV0ZXJzIGluIGJlYWNvbnMsIGhvd2V2ZXIsIGlzIG9wdGlvbmFsLgotCSAqLwotCi0JaWYgKGVsZW1zLT53bW1fcGFyYW0gJiYKLQkgICAgKCFic3MtPndtbV9pZSB8fCBic3MtPndtbV9pZV9sZW4gIT0gZWxlbXMtPndtbV9wYXJhbV9sZW4gfHwKLQkgICAgIG1lbWNtcChic3MtPndtbV9pZSwgZWxlbXMtPndtbV9wYXJhbSwgZWxlbXMtPndtbV9wYXJhbV9sZW4pKSkgewotCQlrZnJlZShic3MtPndtbV9pZSk7Ci0JCWJzcy0+d21tX2llID0ga21hbGxvYyhlbGVtcy0+d21tX3BhcmFtX2xlbiArIDIsIEdGUF9BVE9NSUMpOwotCQlpZiAoYnNzLT53bW1faWUpIHsKLQkJCW1lbWNweShic3MtPndtbV9pZSwgZWxlbXMtPndtbV9wYXJhbSAtIDIsCi0JCQkgICAgICAgZWxlbXMtPndtbV9wYXJhbV9sZW4gKyAyKTsKLQkJCWJzcy0+d21tX2llX2xlbiA9IGVsZW1zLT53bW1fcGFyYW1fbGVuICsgMjsKLQkJfSBlbHNlCi0JCQlic3MtPndtbV9pZV9sZW4gPSAwOwotCX0gZWxzZSBpZiAoZWxlbXMtPndtbV9pbmZvICYmCi0JCSAgICAoIWJzcy0+d21tX2llIHx8IGJzcy0+d21tX2llX2xlbiAhPSBlbGVtcy0+d21tX2luZm9fbGVuIHx8Ci0JCSAgICAgbWVtY21wKGJzcy0+d21tX2llLCBlbGVtcy0+d21tX2luZm8sCi0JCQkJCQllbGVtcy0+d21tX2luZm9fbGVuKSkpIHsKLQkJIC8qIEFzIGZvciBjZXJ0YWluIEFQJ3MgRmlmdGggYml0IGlzIG5vdCBzZXQgaW4gV01NIElFIGluCi0JCSAgKiBiZWFjb24gZnJhbWVzLlNvIHdoaWxlIHBhcnNpbmcgdGhlIGJlYWNvbiBmcmFtZSB0aGUKLQkJICAqIHdtbV9pbmZvIHN0cnVjdHVyZSBpcyB1c2VkIGluc3RlYWQgb2Ygd21tX3BhcmFtLgotCQkgICogd21tX2luZm8gc3RydWN0dXJlIHdhcyBuZXZlciB1c2VkIHRvIHNldCBic3MtPndtbV9pZS4KLQkJICAqIFRoaXMgY29kZSBmaXhlcyB0aGlzIHByb2JsZW0gYnkgY29weWluZyB0aGUgV01FCi0JCSAgKiBpbmZvcm1hdGlvbiBmcm9tIHdtbV9pbmZvIHRvIGJzcy0+d21tX2llIGFuZCBlbmFibGluZwotCQkgICogbi1iYW5kIGFzc29jaWF0aW9uLgotCQkgICovCi0JCWtmcmVlKGJzcy0+d21tX2llKTsKLQkJYnNzLT53bW1faWUgPSBrbWFsbG9jKGVsZW1zLT53bW1faW5mb19sZW4gKyAyLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGJzcy0+d21tX2llKSB7Ci0JCQltZW1jcHkoYnNzLT53bW1faWUsIGVsZW1zLT53bW1faW5mbyAtIDIsCi0JCQkgICAgICAgZWxlbXMtPndtbV9pbmZvX2xlbiArIDIpOwotCQkJYnNzLT53bW1faWVfbGVuID0gZWxlbXMtPndtbV9pbmZvX2xlbiArIDI7Ci0JCX0gZWxzZQotCQkJYnNzLT53bW1faWVfbGVuID0gMDsKLQl9IGVsc2UgaWYgKCFlbGVtcy0+d21tX3BhcmFtICYmICFlbGVtcy0+d21tX2luZm8gJiYgYnNzLT53bW1faWUpIHsKLQkJa2ZyZWUoYnNzLT53bW1faWUpOwotCQlic3MtPndtbV9pZSA9IE5VTEw7Ci0JCWJzcy0+d21tX2llX2xlbiA9IDA7Ci0JfQotCiAJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBtZXJnZSBJQlNTICovCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTICYmIGJlYWNvbiAmJgotCSAgICAhbG9jYWwtPnN0YV9zd19zY2FubmluZyAmJiAhbG9jYWwtPnN0YV9od19zY2FubmluZyAmJgorCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYgYmVhY29uICYmCiAJICAgIGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTICYmCiAJICAgIGJzcy0+ZnJlcSA9PSBsb2NhbC0+b3Blcl9jaGFubmVsLT5jZW50ZXJfZnJlcSAmJgogCSAgICBlbGVtcy0+c3NpZF9sZW4gPT0gc2RhdGEtPnUuc3RhLnNzaWRfbGVuICYmCkBAIC0yODQ4LDcgKzE1OTUsNyBAQAogCQkJICogZS5nOiBhdCAxIE1CaXQgdGhhdCBtZWFucyBtYWN0aW1lIGlzIDE5MiB1c2VjIGVhcmxpZXIKIAkJCSAqICg9MjQgYnl0ZXMgKiA4IHVzZWNzL2J5dGUpIHRoYW4gdGhlIGJlYWNvbiB0aW1lc3RhbXAuCiAJCQkgKi8KLQkJCWludCByYXRlID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tyeF9zdGF0dXMtPmJhbmRdLT4KKwkJCWludCByYXRlID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXS0+CiAJCQkJCWJpdHJhdGVzW3J4X3N0YXR1cy0+cmF0ZV9pZHhdLmJpdHJhdGU7CiAJCQlyeF90aW1lc3RhbXAgPSByeF9zdGF0dXMtPm1hY3RpbWUgKyAoMjQgKiA4ICogMTAgLyByYXRlKTsKIAkJfSBlbHNlIGlmIChsb2NhbCAmJiBsb2NhbC0+b3BzICYmIGxvY2FsLT5vcHMtPmdldF90c2YpCkBAIC0yODcxLDEyICsxNjE4LDEyIEBACiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmVhY29uIFRTRiBoaWdoZXIgdGhhbiAiCiAJCQkgICAgICAgImxvY2FsIFRTRiAtIElCU1MgbWVyZ2Ugd2l0aCBCU1NJRCAlc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIG1nbXQtPmJzc2lkKSk7CisJCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgbWdtdC0+YnNzaWQpKTsKICNlbmRpZgotCQkJaWVlZTgwMjExX3N0YV9qb2luX2lic3MoZGV2LCAmc2RhdGEtPnUuc3RhLCBic3MpOwotCQkJaWVlZTgwMjExX2lic3NfYWRkX3N0YShkZXYsIE5VTEwsCisJCQlpZWVlODAyMTFfc3RhX2pvaW5faWJzcyhzZGF0YSwgJnNkYXRhLT51LnN0YSwgYnNzKTsKKwkJCWllZWU4MDIxMV9pYnNzX2FkZF9zdGEoc2RhdGEsIE5VTEwsCiAJCQkJCSAgICAgICBtZ210LT5ic3NpZCwgbWdtdC0+c2EsCi0JCQkJCSAgICAgICBCSVQocnhfc3RhdHVzLT5yYXRlX2lkeCkpOworCQkJCQkgICAgICAgc3VwcF9yYXRlcyk7CiAJCX0KIAl9CiAKQEAgLTI4ODQsMTMgKzE2MzEsMTcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9wcm9iZV9yZXNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9wcm9iZV9yZXNwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCQkgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAogCQkJCQkgc2l6ZV90IGxlbiwKIAkJCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCiB7CiAJc2l6ZV90IGJhc2VsZW47CiAJc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgZWxlbXM7CisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKKworCWlmIChtZW1jbXAobWdtdC0+ZGEsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCXJldHVybjsgLyogaWdub3JlIFByb2JlUmVzcCB0byBmb3JlaWduIGFkZHJlc3MgKi8KIAogCWJhc2VsZW4gPSAodTggKikgbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlIC0gKHU4ICopIG1nbXQ7CiAJaWYgKGJhc2VsZW4gPiBsZW4pCkBAIC0yODk5LDIwICsxNjUwLDI3IEBACiAJaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyhtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGUsIGxlbiAtIGJhc2VsZW4sCiAJCQkJJmVsZW1zKTsKIAotCWllZWU4MDIxMV9yeF9ic3NfaW5mbyhkZXYsIG1nbXQsIGxlbiwgcnhfc3RhdHVzLCAmZWxlbXMsIDApOworCWllZWU4MDIxMV9yeF9ic3NfaW5mbyhzZGF0YSwgbWdtdCwgbGVuLCByeF9zdGF0dXMsICZlbGVtcywgZmFsc2UpOworCisJLyogZGlyZWN0IHByb2JlIG1heSBiZSBwYXJ0IG9mIHRoZSBhc3NvY2lhdGlvbiBmbG93ICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJRUVFODAyMTFfU1RBX1JFUV9ESVJFQ1RfUFJPQkUsCisJCQkJCQkJJmlmc3RhLT5yZXF1ZXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZGlyZWN0IHByb2JlIHJlc3BvbmRlZFxuIiwKKwkJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUpOworCQlpZWVlODAyMTFfYXV0aGVudGljYXRlKHNkYXRhLCBpZnN0YSk7CisJfQogfQogCiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9tZ210X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X21nbXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAogCQkJCSAgICAgc2l6ZV90IGxlbiwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhOwogCXNpemVfdCBiYXNlbGVuOwogCXN0cnVjdCBpZWVlODAyXzExX2VsZW1zIGVsZW1zOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmxvY2FsLT5ody5jb25mOwogCXUzMiBjaGFuZ2VkID0gMDsKIApAQCAtMjkyMywxMCArMTY4MSw5IEBACiAKIAlpZWVlODAyXzExX3BhcnNlX2VsZW1zKG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBsZW4gLSBiYXNlbGVuLCAmZWxlbXMpOwogCi0JaWVlZTgwMjExX3J4X2Jzc19pbmZvKGRldiwgbWdtdCwgbGVuLCByeF9zdGF0dXMsICZlbGVtcywgMSk7CisJaWVlZTgwMjExX3J4X2Jzc19pbmZvKHNkYXRhLCBtZ210LCBsZW4sIHJ4X3N0YXR1cywgJmVsZW1zLCB0cnVlKTsKIAotCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybjsKIAlpZnN0YSA9ICZzZGF0YS0+dS5zdGE7CiAKQEAgLTI5MzQsMTUgKzE2OTEsOSBAQAogCSAgICBtZW1jbXAoaWZzdGEtPmJzc2lkLCBtZ210LT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCiAJCXJldHVybjsKIAotCWllZWU4MDIxMV9zdGFfd21tX3BhcmFtcyhkZXYsIGlmc3RhLCBlbGVtcy53bW1fcGFyYW0sCisJaWVlZTgwMjExX3N0YV93bW1fcGFyYW1zKGxvY2FsLCBpZnN0YSwgZWxlbXMud21tX3BhcmFtLAogCQkJCSBlbGVtcy53bW1fcGFyYW1fbGVuKTsKIAotCS8qIERvIG5vdCBzZW5kIGNoYW5nZXMgdG8gZHJpdmVyIGlmIHdlIGFyZSBzY2FubmluZy4gVGhpcyByZW1vdmVzCi0JICogcmVxdWlyZW1lbnQgdGhhdCBkcml2ZXIncyBic3NfaW5mb19jaGFuZ2VkIGZ1bmN0aW9uIG5lZWRzIHRvIGJlCi0JICogYXRvbWljLiAqLwotCWlmIChsb2NhbC0+c3RhX3N3X3NjYW5uaW5nIHx8IGxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcpCi0JCXJldHVybjsKLQogCWlmIChlbGVtcy5lcnBfaW5mbyAmJiBlbGVtcy5lcnBfaW5mb19sZW4gPj0gMSkKIAkJY2hhbmdlZCB8PSBpZWVlODAyMTFfaGFuZGxlX2VycF9pZShzZGF0YSwgZWxlbXMuZXJwX2luZm9bMF0pOwogCWVsc2UgewpAQCAtMjk1Niw3ICsxNzA3LDYgQEAKIAkJc3RydWN0IGllZWU4MDIxMV9odF9ic3NfaW5mbyBic3NfaW5mbzsKIAogCQlpZWVlODAyMTFfaHRfYWRkdF9pbmZvX2llX3RvX2h0X2Jzc19pbmZvKAotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyAqKQogCQkJCWVsZW1zLmh0X2luZm9fZWxlbSwgJmJzc19pbmZvKTsKIAkJY2hhbmdlZCB8PSBpZWVlODAyMTFfaGFuZGxlX2h0KGxvY2FsLCAxLCAmY29uZi0+aHRfY29uZiwKIAkJCQkJICAgICAgICZic3NfaW5mbyk7CkBAIC0yOTY2LDE0ICsxNzE2LDEzIEBACiB9CiAKIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X21nbXRfcHJvYmVfcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSwKIAkJCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAogCQkJCQlzaXplX3QgbGVuLAogCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCWludCB0eF9sYXN0X2JlYWNvbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqcmVzcDsKQEAgLTI5ODQsOCArMTczMyw4IEBACiAJREVDTEFSRV9NQUNfQlVGKG1hYzMpOwogI2VuZGlmCiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgfHwKLQkgICAgaWZzdGEtPnN0YXRlICE9IElFRUU4MDIxMV9JQlNTX0pPSU5FRCB8fAorCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKKwkgICAgaWZzdGEtPnN0YXRlICE9IElFRUU4MDIxMV9TVEFfTUxNRV9JQlNTX0pPSU5FRCB8fAogCSAgICBsZW4gPCAyNCArIDIgfHwgIWlmc3RhLT5wcm9iZV9yZXNwKQogCQlyZXR1cm47CiAKQEAgLTI5OTcsNyArMTc0Niw3IEBACiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJYIFByb2JlUmVxIFNBPSVzIERBPSVzIEJTU0lEPSIKIAkgICAgICAgIiVzICh0eF9sYXN0X2JlYWNvbj0lZClcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgbWdtdC0+c2EpLCBwcmludF9tYWMobWFjMiwgbWdtdC0+ZGEpLAorCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBtZ210LT5zYSksIHByaW50X21hYyhtYWMyLCBtZ210LT5kYSksCiAJICAgICAgIHByaW50X21hYyhtYWMzLCBtZ210LT5ic3NpZCksIHR4X2xhc3RfYmVhY29uKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLwogCkBAIC0zMDE1LDcgKzE3NjQsNyBAQAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW52YWxpZCBTU0lEIElFIGluIFByb2JlUmVxICIKIAkJICAgICAgICJmcm9tICVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBtZ210LT5zYSkpOworCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgbWdtdC0+c2EpKTsKICNlbmRpZgogCQlyZXR1cm47CiAJfQpAQCAtMzAzNSw3NCArMTc4NCwxNSBAQAogCW1lbWNweShyZXNwLT5kYSwgbWdtdC0+c2EsIEVUSF9BTEVOKTsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICIlczogU2VuZGluZyBQcm9iZVJlc3AgdG8gJXNcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgcmVzcC0+ZGEpKTsKKwkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgcmVzcC0+ZGEpKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLwotCWllZWU4MDIxMV9zdGFfdHgoZGV2LCBza2IsIDApOworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9tZ210X2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAotCQkJCSAgICAgc2l6ZV90IGxlbiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0KLQlpZiAobGVuIDwgSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChtZ210LT51LmFjdGlvbi5jYXRlZ29yeSkgewotCWNhc2UgV0xBTl9DQVRFR09SWV9TUEVDVFJVTV9NR01UOgotCQlpZiAobG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZCAhPSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJYnJlYWs7Ci0JCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24udS5jaGFuX3N3aXRjaC5hY3Rpb25fY29kZSkgewotCQljYXNlIFdMQU5fQUNUSU9OX1NQQ1RfTVNSX1JFUToKLQkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCi0JCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQpKSkKLQkJCQlicmVhazsKLQkJCWllZWU4MDIxMV9zdGFfcHJvY2Vzc19tZWFzdXJlbWVudF9yZXEoZGV2LCBtZ210LCBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NBVEVHT1JZX0JBQ0s6Ci0JCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUpIHsKLQkJY2FzZSBXTEFOX0FDVElPTl9BRERCQV9SRVE6Ci0JCQlpZiAobGVuIDwgKElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKwotCQkJCSAgIHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcSkpKQotCQkJCWJyZWFrOwotCQkJaWVlZTgwMjExX3N0YV9wcm9jZXNzX2FkZGJhX3JlcXVlc3QoZGV2LCBtZ210LCBsZW4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDoKLQkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCi0JCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcCkpKQotCQkJCWJyZWFrOwotCQkJaWVlZTgwMjExX3N0YV9wcm9jZXNzX2FkZGJhX3Jlc3AoZGV2LCBtZ210LCBsZW4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6Ci0JCQlpZiAobGVuIDwgKElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKwotCQkJCSAgIHNpemVvZihtZ210LT51LmFjdGlvbi51LmRlbGJhKSkpCi0JCQkJYnJlYWs7Ci0JCQlpZWVlODAyMTFfc3RhX3Byb2Nlc3NfZGVsYmEoZGV2LCBtZ210LCBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQTElOS19DQVRFR09SWToKLQkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpCi0JCQltZXNoX3J4X3BsaW5rX2ZyYW1lKGRldiwgbWdtdCwgbGVuLCByeF9zdGF0dXMpOwotCQlicmVhazsKLQljYXNlIE1FU0hfUEFUSF9TRUxfQ0FURUdPUlk6Ci0JCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQotCQkJbWVzaF9yeF9wYXRoX3NlbF9mcmFtZShkZXYsIG1nbXQsIGxlbik7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBpZWVlODAyMTFfc3RhX3J4X21nbXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3ZvaWQgaWVlZTgwMjExX3N0YV9yeF9tZ210KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CiAJdTE2IGZjOwpAQCAtMzExMCw3ICsxODAwLDYgQEAKIAlpZiAoc2tiLT5sZW4gPCAyNCkKIAkJZ290byBmYWlsOwogCi0Jc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCWlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAogCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKQEAgLTMxMjAsNyArMTgwOSw2IEBACiAJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgogCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CiAJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDVElPTjoKIAkJbWVtY3B5KHNrYi0+Y2IsIHJ4X3N0YXR1cywgc2l6ZW9mKCpyeF9zdGF0dXMpKTsKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgogCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6CkBAIC0zMTM2LDE3ICsxODI0LDE0IEBACiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9yeF9xdWV1ZWRfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1czsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGE7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXUxNiBmYzsKIAotCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlpZnN0YSA9ICZzZGF0YS0+dS5zdGE7CiAKIAlyeF9zdGF0dXMgPSAoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKikgc2tiLT5jYjsKQEAgLTMxNTUsMTcgKzE4NDAsMTcgQEAKIAogCXN3aXRjaCAoZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgewogCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKLQkJaWVlZTgwMjExX3J4X21nbXRfcHJvYmVfcmVxKGRldiwgaWZzdGEsIG1nbXQsIHNrYi0+bGVuLAorCQlpZWVlODAyMTFfcnhfbWdtdF9wcm9iZV9yZXEoc2RhdGEsIGlmc3RhLCBtZ210LCBza2ItPmxlbiwKIAkJCQkJICAgIHJ4X3N0YXR1cyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCWllZWU4MDIxMV9yeF9tZ210X3Byb2JlX3Jlc3AoZGV2LCBtZ210LCBza2ItPmxlbiwgcnhfc3RhdHVzKTsKKwkJaWVlZTgwMjExX3J4X21nbXRfcHJvYmVfcmVzcChzZGF0YSwgbWdtdCwgc2tiLT5sZW4sIHJ4X3N0YXR1cyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKLQkJaWVlZTgwMjExX3J4X21nbXRfYmVhY29uKGRldiwgbWdtdCwgc2tiLT5sZW4sIHJ4X3N0YXR1cyk7CisJCWllZWU4MDIxMV9yeF9tZ210X2JlYWNvbihzZGF0YSwgbWdtdCwgc2tiLT5sZW4sIHJ4X3N0YXR1cyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6Ci0JCWllZWU4MDIxMV9yeF9tZ210X2F1dGgoZGV2LCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4pOworCQlpZWVlODAyMTFfcnhfbWdtdF9hdXRoKHNkYXRhLCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4pOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgogCQlpZWVlODAyMTFfcnhfbWdtdF9hc3NvY19yZXNwKHNkYXRhLCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4sIDApOwpAQCAtMzE3NCwxMyArMTg1OSwxMCBAQAogCQlpZWVlODAyMTFfcnhfbWdtdF9hc3NvY19yZXNwKHNkYXRhLCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4sIDEpOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6Ci0JCWllZWU4MDIxMV9yeF9tZ210X2RlYXV0aChkZXYsIGlmc3RhLCBtZ210LCBza2ItPmxlbik7CisJCWllZWU4MDIxMV9yeF9tZ210X2RlYXV0aChzZGF0YSwgaWZzdGEsIG1nbXQsIHNrYi0+bGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6Ci0JCWllZWU4MDIxMV9yeF9tZ210X2Rpc2Fzc29jKGRldiwgaWZzdGEsIG1nbXQsIHNrYi0+bGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgotCQlpZWVlODAyMTFfcnhfbWdtdF9hY3Rpb24oZGV2LCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4sIHJ4X3N0YXR1cyk7CisJCWllZWU4MDIxMV9yeF9tZ210X2Rpc2Fzc29jKHNkYXRhLCBpZnN0YSwgbWdtdCwgc2tiLT5sZW4pOwogCQlicmVhazsKIAl9CiAKQEAgLTMxODgsNDcgKzE4NzAsMTEgQEAKIH0KIAogCi1pZWVlODAyMTFfcnhfcmVzdWx0Ci1pZWVlODAyMTFfc3RhX3J4X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cykKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JX19sZTE2IGZjOwotCi0JaWYgKHNrYi0+bGVuIDwgMikKLQkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7Ci0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0JZmMgPSBtZ210LT5mcmFtZV9jb250cm9sOwotCi0JaWYgKGllZWU4MDIxMV9pc19jdGwoZmMpKQotCQlyZXR1cm4gUlhfQ09OVElOVUU7Ci0KLQlpZiAoc2tiLT5sZW4gPCAyNCkKLQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpIHsKLQkJaWVlZTgwMjExX3J4X21nbXRfcHJvYmVfcmVzcChkZXYsIG1nbXQsIHNrYi0+bGVuLCByeF9zdGF0dXMpOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiBSWF9RVUVVRUQ7Ci0JfQotCi0JaWYgKGllZWU4MDIxMV9pc19iZWFjb24oZmMpKSB7Ci0JCWllZWU4MDIxMV9yeF9tZ210X2JlYWNvbihkZXYsIG1nbXQsIHNrYi0+bGVuLCByeF9zdGF0dXMpOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiBSWF9RVUVVRUQ7Ci0JfQotCi0JcmV0dXJuIFJYX0NPTlRJTlVFOwotfQotCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJaW50IGFjdGl2ZSA9IDA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCkBAIC0zMjQ3LDE3OSArMTg5MywzNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfZXhwaXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZXhwX3RpbWUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgKnRtcDsKLQlMSVNUX0hFQUQodG1wX2xpc3QpOwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YSwgdG1wLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGEtPmxhc3RfcnggKyBleHBfdGltZSkpIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleHBpcmluZyBpbmFjdGl2ZSBTVEEgJXNcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpKTsKLSNlbmRpZgotCQkJX19zdGFfaW5mb191bmxpbmsoJnN0YSk7Ci0JCQlpZiAoc3RhKQotCQkJCWxpc3RfYWRkKCZzdGEtPmxpc3QsICZ0bXBfbGlzdCk7Ci0JCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGEsIHRtcCwgJnRtcF9saXN0LCBsaXN0KQotCQlzdGFfaW5mb19kZXN0cm95KHN0YSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9tZXJnZV9pYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX21lcmdlX2lic3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCiB7CiAJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKyBJRUVFODAyMTFfSUJTU19NRVJHRV9JTlRFUlZBTCk7CiAKLQlpZWVlODAyMTFfc3RhX2V4cGlyZShkZXYsIElFRUU4MDIxMV9JQlNTX0lOQUNUSVZJVFlfTElNSVQpOwotCWlmIChpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKGRldikpCisJaWVlZTgwMjExX3N0YV9leHBpcmUoc2RhdGEsIElFRUU4MDIxMV9JQlNTX0lOQUNUSVZJVFlfTElNSVQpOworCWlmIChpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKHNkYXRhKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBhY3RpdmUgSUJTUyBTVEFzIC0gdHJ5aW5nIHRvIHNjYW4gZm9yIG90aGVyICIKLQkgICAgICAgIklCU1MgbmV0d29ya3Mgd2l0aCBzYW1lIFNTSUQgKG1lcmdlKVxuIiwgZGV2LT5uYW1lKTsKLQlpZWVlODAyMTFfc3RhX3JlcV9zY2FuKGRldiwgaWZzdGEtPnNzaWQsIGlmc3RhLT5zc2lkX2xlbik7CisJICAgICAgICJJQlNTIG5ldHdvcmtzIHdpdGggc2FtZSBTU0lEIChtZXJnZSlcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOworCWllZWU4MDIxMV9yZXF1ZXN0X3NjYW4oc2RhdGEsIGlmc3RhLT5zc2lkLCBpZnN0YS0+c3NpZF9sZW4pOwogfQogCiAKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotc3RhdGljIHZvaWQgaWVlZTgwMjExX21lc2hfaG91c2VrZWVwaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCWJvb2wgZnJlZV9wbGlua3M7Ci0KLQlpZWVlODAyMTFfc3RhX2V4cGlyZShkZXYsIElFRUU4MDIxMV9NRVNIX1BFRVJfSU5BQ1RJVklUWV9MSU1JVCk7Ci0JbWVzaF9wYXRoX2V4cGlyZShkZXYpOwotCi0JZnJlZV9wbGlua3MgPSBtZXNoX3BsaW5rX2F2YWlsYWJsZXMoc2RhdGEpOwotCWlmIChmcmVlX3BsaW5rcyAhPSBzZGF0YS0+dS5zdGEuYWNjZXB0aW5nX3BsaW5rcykKLQkJaWVlZTgwMjExX2lmX2NvbmZpZyhzZGF0YSwgSUVFRTgwMjExX0lGQ0NfQkVBQ09OKTsKLQotCW1vZF90aW1lcigmaWZzdGEtPnRpbWVyLCBqaWZmaWVzICsKLQkJCUlFRUU4MDIxMV9NRVNIX0hPVVNFS0VFUElOR19JTlRFUlZBTCk7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfc3RhcnRfbWVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0JaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwotCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9NRVNIX1VQOwotCWllZWU4MDIxMV9zdGFfdGltZXIoKHVuc2lnbmVkIGxvbmcpc2RhdGEpOwotCWllZWU4MDIxMV9pZl9jb25maWcoc2RhdGEsIElFRUU4MDIxMV9JRkNDX0JFQUNPTik7Ci19Ci0jZW5kaWYKLQotCi12b2lkIGllZWU4MDIxMV9zdGFfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPQogCQkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqKSBkYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoJnNkYXRhLT53ZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAogCXNldF9iaXQoSUVFRTgwMjExX1NUQV9SRVFfUlVOLCAmaWZzdGEtPnJlcXVlc3QpOwogCXF1ZXVlX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmlmc3RhLT53b3JrKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfc3RhX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuc3RhLndvcmspOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzZGF0YS0+ZGV2OwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuOwotCi0JaWYgKGxvY2FsLT5zdGFfc3dfc2Nhbm5pbmcgfHwgbG9jYWwtPnN0YV9od19zY2FubmluZykKLQkJcmV0dXJuOwotCi0JaWYgKFdBUk5fT04oc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSAmJgotCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYKLQkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UKSkKLQkJcmV0dXJuOwotCWlmc3RhID0gJnNkYXRhLT51LnN0YTsKLQotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmlmc3RhLT5za2JfcXVldWUpKSkKLQkJaWVlZTgwMjExX3N0YV9yeF9xdWV1ZWRfbWdtdChkZXYsIHNrYik7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotCWlmIChpZnN0YS0+cHJlcV9xdWV1ZV9sZW4gJiYKLQkgICAgdGltZV9hZnRlcihqaWZmaWVzLAotCQkgICAgICAgaWZzdGEtPmxhc3RfcHJlcSArIG1zZWNzX3RvX2ppZmZpZXMoaWZzdGEtPm1zaGNmZy5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsKSkpCi0JCW1lc2hfcGF0aF9zdGFydF9kaXNjb3ZlcnkoZGV2KTsKLSNlbmRpZgotCi0JaWYgKGlmc3RhLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVVUSEVOVElDQVRFICYmCi0JICAgIGlmc3RhLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRFICYmCi0JICAgIHRlc3RfYW5kX2NsZWFyX2JpdChJRUVFODAyMTFfU1RBX1JFUV9TQ0FOLCAmaWZzdGEtPnJlcXVlc3QpKSB7Ci0JCWlmIChpZnN0YS0+c2Nhbl9zc2lkX2xlbikKLQkJCWllZWU4MDIxMV9zdGFfc3RhcnRfc2NhbihkZXYsIGlmc3RhLT5zY2FuX3NzaWQsIGlmc3RhLT5zY2FuX3NzaWRfbGVuKTsKLQkJZWxzZQotCQkJaWVlZTgwMjExX3N0YV9zdGFydF9zY2FuKGRldiwgTlVMTCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElFRUU4MDIxMV9TVEFfUkVRX0FVVEgsICZpZnN0YS0+cmVxdWVzdCkpIHsKLQkJaWYgKGllZWU4MDIxMV9zdGFfY29uZmlnX2F1dGgoZGV2LCBpZnN0YSkpCi0JCQlyZXR1cm47Ci0JCWNsZWFyX2JpdChJRUVFODAyMTFfU1RBX1JFUV9SVU4sICZpZnN0YS0+cmVxdWVzdCk7Ci0JfSBlbHNlIGlmICghdGVzdF9hbmRfY2xlYXJfYml0KElFRUU4MDIxMV9TVEFfUkVRX1JVTiwgJmlmc3RhLT5yZXF1ZXN0KSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChpZnN0YS0+c3RhdGUpIHsKLQljYXNlIElFRUU4MDIxMV9ESVNBQkxFRDoKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQVVUSEVOVElDQVRFOgotCQlpZWVlODAyMTFfYXV0aGVudGljYXRlKGRldiwgaWZzdGEpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BU1NPQ0lBVEU6Ci0JCWllZWU4MDIxMV9hc3NvY2lhdGUoZGV2LCBpZnN0YSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FTU09DSUFURUQ6Ci0JCWllZWU4MDIxMV9hc3NvY2lhdGVkKGRldiwgaWZzdGEpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JQlNTX1NFQVJDSDoKLQkJaWVlZTgwMjExX3N0YV9maW5kX2lic3MoZGV2LCBpZnN0YSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lCU1NfSk9JTkVEOgotCQlpZWVlODAyMTFfc3RhX21lcmdlX2lic3MoZGV2LCBpZnN0YSk7Ci0JCWJyZWFrOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICi0JY2FzZSBJRUVFODAyMTFfTUVTSF9VUDoKLQkJaWVlZTgwMjExX21lc2hfaG91c2VrZWVwaW5nKGRldiwgaWZzdGEpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChpZWVlODAyMTFfcHJpdmFjeV9taXNtYXRjaChkZXYsIGlmc3RhKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXZhY3kgY29uZmlndXJhdGlvbiBtaXNtYXRjaCBhbmQgIgotCQkgICAgICAgIm1peGVkLWNlbGwgZGlzYWJsZWQgLSBkaXNhc3NvY2lhdGVcbiIsIGRldi0+bmFtZSk7Ci0KLQkJaWVlZTgwMjExX3NlbmRfZGlzYXNzb2MoZGV2LCBpZnN0YSwgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwotCQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKGRldiwgaWZzdGEsIDApOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3Jlc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFfcmVzZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCiAJaWYgKGxvY2FsLT5vcHMtPnJlc2V0X3RzZikgewogCQkvKiBSZXNldCBvd24gVFNGIHRvIGFsbG93IHRpbWUgc3luY2hyb25pemF0aW9uIHdvcmsuICovCkBAIC0zNDM5LDI5ICsxOTQyLDE1IEBACiAJCWlmc3RhLT5hdXRoX2FsZyA9IFdMQU5fQVVUSF9PUEVOOwogCWlmc3RhLT5hdXRoX3RyYW5zYWN0aW9uID0gLTE7CiAJaWZzdGEtPmZsYWdzICY9IH5JRUVFODAyMTFfU1RBX0FTU09DSUFURUQ7Ci0JaWZzdGEtPmF1dGhfdHJpZXMgPSBpZnN0YS0+YXNzb2NfdHJpZXMgPSAwOwotCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJaWZzdGEtPmFzc29jX3NjYW5fdHJpZXMgPSAwOworCWlmc3RhLT5kaXJlY3RfcHJvYmVfdHJpZXMgPSAwOworCWlmc3RhLT5hdXRoX3RyaWVzID0gMDsKKwlpZnN0YS0+YXNzb2NfdHJpZXMgPSAwOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhzZGF0YS0+ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihzZGF0YS0+ZGV2KTsKIH0KIAogCi12b2lkIGllZWU4MDIxMV9zdGFfcmVxX2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0KLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKLQkJcmV0dXJuOwotCi0JaWYgKChpZnN0YS0+ZmxhZ3MgJiAoSUVFRTgwMjExX1NUQV9CU1NJRF9TRVQgfAotCQkJCUlFRUU4MDIxMV9TVEFfQVVUT19CU1NJRF9TRUwpKSAmJgotCSAgICAoaWZzdGEtPmZsYWdzICYgKElFRUU4MDIxMV9TVEFfU1NJRF9TRVQgfAotCQkJCUlFRUU4MDIxMV9TVEFfQVVUT19TU0lEX1NFTCkpKSB7Ci0JCXNldF9iaXQoSUVFRTgwMjExX1NUQV9SRVFfQVVUSCwgJmlmc3RhLT5yZXF1ZXN0KTsKLQkJcXVldWVfd29yayhsb2NhbC0+aHcud29ya3F1ZXVlLCAmaWZzdGEtPndvcmspOwotCX0KLX0KLQogc3RhdGljIGludCBpZWVlODAyMTFfc3RhX21hdGNoX3NzaWQoc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhLAogCQkJCSAgICBjb25zdCBjaGFyICpzc2lkLCBpbnQgc3NpZF9sZW4pCiB7CkBAIC0zNDkyLDE3ICsxOTgxLDE4NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfY29uZmlnX2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9jcmVhdGVfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9ic3MgKmJzcywgKnNlbGVjdGVkID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXU4IGJzc2lkW0VUSF9BTEVOXSwgKnBvczsKKwlpbnQgaTsKKwlpbnQgcmV0OworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisjaWYgMAorCS8qIEVhc2llciB0ZXN0aW5nLCB1c2UgZml4ZWQgQlNTSUQuICovCisJbWVtc2V0KGJzc2lkLCAweGZlLCBFVEhfQUxFTik7CisjZWxzZQorCS8qIEdlbmVyYXRlIHJhbmRvbSwgbm90IGJyb2FkY2FzdCwgbG9jYWxseSBhZG1pbmlzdGVyZWQgQlNTSUQuIE1peCBpbgorCSAqIG93biBNQUMgYWRkcmVzcyB0byBtYWtlIHN1cmUgdGhhdCBkZXZpY2VzIHRoYXQgZG8gbm90IGhhdmUgcHJvcGVyCisJICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZ2V0IGRpZmZlcmVudCBCU1NJRC4gKi8KKwlnZXRfcmFuZG9tX2J5dGVzKGJzc2lkLCBFVEhfQUxFTik7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWJzc2lkW2ldIF49IHNkYXRhLT5kZXYtPmRldl9hZGRyW2ldOworCWJzc2lkWzBdICY9IH4weDAxOworCWJzc2lkWzBdIHw9IDB4MDI7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogQ3JlYXRpbmcgbmV3IElCU1MgbmV0d29yaywgQlNTSUQgJXNcbiIsCisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGJzc2lkKSk7CisKKwlic3MgPSBpZWVlODAyMTFfcnhfYnNzX2FkZChsb2NhbCwgYnNzaWQsCisJCQkJICAgbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEsCisJCQkJICAgc2RhdGEtPnUuc3RhLnNzaWQsIHNkYXRhLT51LnN0YS5zc2lkX2xlbik7CisJaWYgKCFic3MpCisJCXJldHVybiAtRU5PTUVNOworCisJYnNzLT5iYW5kID0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZDsKKwlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbYnNzLT5iYW5kXTsKKworCWlmIChsb2NhbC0+aHcuY29uZi5iZWFjb25faW50ID09IDApCisJCWxvY2FsLT5ody5jb25mLmJlYWNvbl9pbnQgPSAxMDA7CisJYnNzLT5iZWFjb25faW50ID0gbG9jYWwtPmh3LmNvbmYuYmVhY29uX2ludDsKKwlic3MtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKwlic3MtPmNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKworCWlmIChzZGF0YS0+ZGVmYXVsdF9rZXkpCisJCWJzcy0+Y2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKKwllbHNlCisJCXNkYXRhLT5kcm9wX3VuZW5jcnlwdGVkID0gMDsKKworCWJzcy0+c3VwcF9yYXRlc19sZW4gPSBzYmFuZC0+bl9iaXRyYXRlczsKKwlwb3MgPSBic3MtPnN1cHBfcmF0ZXM7CisJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspIHsKKwkJaW50IHJhdGUgPSBzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZTsKKwkJKnBvcysrID0gKHU4KSAocmF0ZSAvIDUpOworCX0KKworCXJldCA9IGllZWU4MDIxMV9zdGFfam9pbl9pYnNzKHNkYXRhLCBpZnN0YSwgYnNzKTsKKwlpZWVlODAyMTFfcnhfYnNzX3B1dChsb2NhbCwgYnNzKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3N0YV9maW5kX2lic3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CisJaW50IGZvdW5kID0gMDsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJaW50IGFjdGl2ZV9pYnNzOworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCURFQ0xBUkVfTUFDX0JVRihtYWMyKTsKKworCWlmIChpZnN0YS0+c3NpZF9sZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3RpdmVfaWJzcyA9IGllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3Moc2RhdGEpOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGFfZmluZF9pYnNzIChhY3RpdmVfaWJzcz0lZClcbiIsCisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIGFjdGl2ZV9pYnNzKTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmJzc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJzcywgJmxvY2FsLT5ic3NfbGlzdCwgbGlzdCkgeworCQlpZiAoaWZzdGEtPnNzaWRfbGVuICE9IGJzcy0+c3NpZF9sZW4gfHwKKwkJICAgIG1lbWNtcChpZnN0YS0+c3NpZCwgYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKSAhPSAwCisJCSAgICB8fCAhKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKKwkJCWNvbnRpbnVlOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICIgICBic3NpZD0lcyBmb3VuZFxuIiwKKwkJICAgICAgIHByaW50X21hYyhtYWMsIGJzcy0+YnNzaWQpKTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLworCQltZW1jcHkoYnNzaWQsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJZm91bmQgPSAxOworCQlpZiAoYWN0aXZlX2lic3MgfHwgbWVtY21wKGJzc2lkLCBpZnN0YS0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKKwlpZiAoZm91bmQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgICBzdGFfZmluZF9pYnNzOiBzZWxlY3RlZCAlcyBjdXJyZW50ICIKKwkJICAgICAgICIlc1xuIiwgcHJpbnRfbWFjKG1hYywgYnNzaWQpLAorCQkgICAgICAgcHJpbnRfbWFjKG1hYzIsIGlmc3RhLT5ic3NpZCkpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHICovCisKKwlpZiAoZm91bmQgJiYgbWVtY21wKGlmc3RhLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKSAhPSAwKSB7CisJCWludCByZXQ7CisJCWludCBzZWFyY2hfZnJlcTsKKworCQlpZiAoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9BVVRPX0NIQU5ORUxfU0VMKQorCQkJc2VhcmNoX2ZyZXEgPSBic3MtPmZyZXE7CisJCWVsc2UKKwkJCXNlYXJjaF9mcmVxID0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisKKwkJYnNzID0gaWVlZTgwMjExX3J4X2Jzc19nZXQobG9jYWwsIGJzc2lkLCBzZWFyY2hfZnJlcSwKKwkJCQkJICAgaWZzdGEtPnNzaWQsIGlmc3RhLT5zc2lkX2xlbik7CisJCWlmICghYnNzKQorCQkJZ290byBkb250X2pvaW47CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTZWxlY3RlZCBJQlNTIEJTU0lEICVzIgorCQkgICAgICAgIiBiYXNlZCBvbiBjb25maWd1cmVkIFNTSURcbiIsCisJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBic3NpZCkpOworCQlyZXQgPSBpZWVlODAyMTFfc3RhX2pvaW5faWJzcyhzZGF0YSwgaWZzdGEsIGJzcyk7CisJCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBic3MpOworCQlyZXR1cm4gcmV0OworCX0KKworZG9udF9qb2luOgorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIGRpZCBub3QgdHJ5IHRvIGpvaW4gaWJzc1xuIik7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcgKi8KKworCS8qIFNlbGVjdGVkIElCU1Mgbm90IGZvdW5kIGluIGN1cnJlbnQgc2NhbiByZXN1bHRzIC0gdHJ5IHRvIHNjYW4gKi8KKwlpZiAoaWZzdGEtPnN0YXRlID09IElFRUU4MDIxMV9TVEFfTUxNRV9JQlNTX0pPSU5FRCAmJgorCSAgICAhaWVlZTgwMjExX3N0YV9hY3RpdmVfaWJzcyhzZGF0YSkpIHsKKwkJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKworCQkJCSAgICAgIElFRUU4MDIxMV9JQlNTX01FUkdFX0lOVEVSVkFMKTsKKwl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbG9jYWwtPmxhc3Rfc2Nhbl9jb21wbGV0ZWQgKworCQkJICAgICAgSUVFRTgwMjExX1NDQU5fSU5URVJWQUwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJpZ2dlciBuZXcgc2NhbiB0byBmaW5kIGFuIElCU1MgdG8gIgorCQkgICAgICAgImpvaW5cbiIsIHNkYXRhLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gaWVlZTgwMjExX3JlcXVlc3Rfc2NhbihzZGF0YSwgaWZzdGEtPnNzaWQsCisJCQkJCSAgICAgIGlmc3RhLT5zc2lkX2xlbik7CisJfSBlbHNlIGlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX1NUQV9NTE1FX0lCU1NfSk9JTkVEKSB7CisJCWludCBpbnRlcnZhbCA9IElFRUU4MDIxMV9TQ0FOX0lOVEVSVkFMOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmc3RhLT5pYnNzX2pvaW5fcmVxICsKKwkJCSAgICAgICBJRUVFODAyMTFfSUJTU19KT0lOX1RJTUVPVVQpKSB7CisJCQlpZiAoKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQ1JFQVRFX0lCU1MpICYmCisJCQkgICAgKCEobG9jYWwtPm9wZXJfY2hhbm5lbC0+ZmxhZ3MgJgorCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19JQlNTKSkpCisJCQkJcmV0dXJuIGllZWU4MDIxMV9zdGFfY3JlYXRlX2lic3Moc2RhdGEsIGlmc3RhKTsKKwkJCWlmIChpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0NSRUFURV9JQlNTKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJQlNTIG5vdCBhbGxvd2VkIG9uIgorCQkJCSAgICAgICAiICVkIE1IelxuIiwgc2RhdGEtPmRldi0+bmFtZSwKKwkJCQkgICAgICAgbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCQkJfQorCisJCQkvKiBObyBJQlNTIGZvdW5kIC0gZGVjcmVhc2Ugc2NhbiBpbnRlcnZhbCBhbmQgY29udGludWUKKwkJCSAqIHNjYW5uaW5nLiAqLworCQkJaW50ZXJ2YWwgPSBJRUVFODAyMTFfU0NBTl9JTlRFUlZBTF9TTE9XOworCQl9CisKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0lCU1NfU0VBUkNIOworCQltb2RfdGltZXIoJmlmc3RhLT50aW1lciwgamlmZmllcyArIGludGVydmFsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfc3RhX2NvbmZpZ19hdXRoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MsICpzZWxlY3RlZCA9IE5VTEw7CiAJaW50IHRvcF9yc3NpID0gMCwgZnJlcTsKIAotCXNwaW5fbG9ja19iaCgmbG9jYWwtPnN0YV9ic3NfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOwogCWZyZXEgPSBsb2NhbC0+b3Blcl9jaGFubmVsLT5jZW50ZXJfZnJlcTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJzcywgJmxvY2FsLT5zdGFfYnNzX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJzcywgJmxvY2FsLT5ic3NfbGlzdCwgbGlzdCkgewogCQlpZiAoIShic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0zNTMyLDIxMCArMjE5MSwyMjIgQEAKIAl9CiAJaWYgKHNlbGVjdGVkKQogCQlhdG9taWNfaW5jKCZzZWxlY3RlZC0+dXNlcnMpOwotCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmJzc19sb2NrKTsKIAogCWlmIChzZWxlY3RlZCkgewotCQlpZWVlODAyMTFfc2V0X2ZyZXEoZGV2LCBzZWxlY3RlZC0+ZnJlcSk7CisJCWllZWU4MDIxMV9zZXRfZnJlcShzZGF0YSwgc2VsZWN0ZWQtPmZyZXEpOwogCQlpZiAoIShpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX1NTSURfU0VUKSkKLQkJCWllZWU4MDIxMV9zdGFfc2V0X3NzaWQoZGV2LCBzZWxlY3RlZC0+c3NpZCwKKwkJCWllZWU4MDIxMV9zdGFfc2V0X3NzaWQoc2RhdGEsIHNlbGVjdGVkLT5zc2lkLAogCQkJCQkgICAgICAgc2VsZWN0ZWQtPnNzaWRfbGVuKTsKLQkJaWVlZTgwMjExX3N0YV9zZXRfYnNzaWQoZGV2LCBzZWxlY3RlZC0+YnNzaWQpOwotCQlpZWVlODAyMTFfc3RhX2RlZl93bW1fcGFyYW1zKGRldiwgc2VsZWN0ZWQsIDApOworCQlpZWVlODAyMTFfc3RhX3NldF9ic3NpZChzZGF0YSwgc2VsZWN0ZWQtPmJzc2lkKTsKKwkJaWVlZTgwMjExX3N0YV9kZWZfd21tX3BhcmFtcyhzZGF0YSwgc2VsZWN0ZWQpOworCisJCS8qIFNlbmQgb3V0IGRpcmVjdCBwcm9iZSBpZiBubyBwcm9iZSByZXNwIHdhcyByZWNlaXZlZCBvcgorCQkgKiB0aGUgb25lIHdlIGhhdmUgaXMgb3V0ZGF0ZWQKKwkJICovCisJCWlmICghc2VsZWN0ZWQtPmxhc3RfcHJvYmVfcmVzcCB8fAorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBzZWxlY3RlZC0+bGFzdF9wcm9iZV9yZXNwCisJCQkJCSsgSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSkpCisJCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfU1RBX01MTUVfRElSRUNUX1BST0JFOworCQllbHNlCisJCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfU1RBX01MTUVfQVVUSEVOVElDQVRFOworCiAJCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBzZWxlY3RlZCk7Ci0JCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9BVVRIRU5USUNBVEU7Ci0JCWllZWU4MDIxMV9zdGFfcmVzZXRfYXV0aChkZXYsIGlmc3RhKTsKKwkJaWVlZTgwMjExX3N0YV9yZXNldF9hdXRoKHNkYXRhLCBpZnN0YSk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7Ci0JCWlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX0FVVEhFTlRJQ0FURSkgeworCQlpZiAoaWZzdGEtPmFzc29jX3NjYW5fdHJpZXMgPCBJRUVFODAyMTFfQVNTT0NfU0NBTlNfTUFYX1RSSUVTKSB7CisJCQlpZnN0YS0+YXNzb2Nfc2Nhbl90cmllcysrOwogCQkJaWYgKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQVVUT19TU0lEX1NFTCkKLQkJCQlpZWVlODAyMTFfc3RhX3N0YXJ0X3NjYW4oZGV2LCBOVUxMLCAwKTsKKwkJCQlpZWVlODAyMTFfc3RhcnRfc2NhbihzZGF0YSwgTlVMTCwgMCk7CiAJCQllbHNlCi0JCQkJaWVlZTgwMjExX3N0YV9zdGFydF9zY2FuKGRldiwgaWZzdGEtPnNzaWQsCisJCQkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oc2RhdGEsIGlmc3RhLT5zc2lkLAogCQkJCQkJCSBpZnN0YS0+c3NpZF9sZW4pOwotCQkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX0FVVEhFTlRJQ0FURTsKKwkJCWlmc3RhLT5zdGF0ZSA9IElFRUU4MDIxMV9TVEFfTUxNRV9BVVRIRU5USUNBVEU7CiAJCQlzZXRfYml0KElFRUU4MDIxMV9TVEFfUkVRX0FVVEgsICZpZnN0YS0+cmVxdWVzdCk7CiAJCX0gZWxzZQotCQkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX0RJU0FCTEVEOworCQkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0RJU0FCTEVEOwogCX0KIAlyZXR1cm4gLTE7CiB9CiAKIAotc3RhdGljIGludCBpZWVlODAyMTFfc3RhX2NyZWF0ZV9pYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGEpCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXU4IGJzc2lkW0VUSF9BTEVOXSwgKnBvczsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuc3RhLndvcmspOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0jaWYgMAotCS8qIEVhc2llciB0ZXN0aW5nLCB1c2UgZml4ZWQgQlNTSUQuICovCi0JbWVtc2V0KGJzc2lkLCAweGZlLCBFVEhfQUxFTik7Ci0jZWxzZQotCS8qIEdlbmVyYXRlIHJhbmRvbSwgbm90IGJyb2FkY2FzdCwgbG9jYWxseSBhZG1pbmlzdGVyZWQgQlNTSUQuIE1peCBpbgotCSAqIG93biBNQUMgYWRkcmVzcyB0byBtYWtlIHN1cmUgdGhhdCBkZXZpY2VzIHRoYXQgZG8gbm90IGhhdmUgcHJvcGVyCi0JICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZ2V0IGRpZmZlcmVudCBCU1NJRC4gKi8KLQlnZXRfcmFuZG9tX2J5dGVzKGJzc2lkLCBFVEhfQUxFTik7Ci0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCWJzc2lkW2ldIF49IGRldi0+ZGV2X2FkZHJbaV07Ci0JYnNzaWRbMF0gJj0gfjB4MDE7Ci0JYnNzaWRbMF0gfD0gMHgwMjsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCisJCXJldHVybjsKKworCWlmIChsb2NhbC0+c3dfc2Nhbm5pbmcgfHwgbG9jYWwtPmh3X3NjYW5uaW5nKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSkKKwkJcmV0dXJuOworCWlmc3RhID0gJnNkYXRhLT51LnN0YTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmlmc3RhLT5za2JfcXVldWUpKSkKKwkJaWVlZTgwMjExX3N0YV9yeF9xdWV1ZWRfbWdtdChzZGF0YSwgc2tiKTsKKworCWlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX1NUQV9NTE1FX0RJUkVDVF9QUk9CRSAmJgorCSAgICBpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX1NUQV9NTE1FX0FVVEhFTlRJQ0FURSAmJgorCSAgICBpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURSAmJgorCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoSUVFRTgwMjExX1NUQV9SRVFfU0NBTiwgJmlmc3RhLT5yZXF1ZXN0KSkgeworCQlpZWVlODAyMTFfc3RhcnRfc2NhbihzZGF0YSwgaWZzdGEtPnNjYW5fc3NpZCwKKwkJCQkgICAgIGlmc3RhLT5zY2FuX3NzaWRfbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSUVFRTgwMjExX1NUQV9SRVFfQVVUSCwgJmlmc3RhLT5yZXF1ZXN0KSkgeworCQlpZiAoaWVlZTgwMjExX3N0YV9jb25maWdfYXV0aChzZGF0YSwgaWZzdGEpKQorCQkJcmV0dXJuOworCQljbGVhcl9iaXQoSUVFRTgwMjExX1NUQV9SRVFfUlVOLCAmaWZzdGEtPnJlcXVlc3QpOworCX0gZWxzZSBpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJRUVFODAyMTFfU1RBX1JFUV9SVU4sICZpZnN0YS0+cmVxdWVzdCkpCisJCXJldHVybjsKKworCXN3aXRjaCAoaWZzdGEtPnN0YXRlKSB7CisJY2FzZSBJRUVFODAyMTFfU1RBX01MTUVfRElTQUJMRUQ6CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUQV9NTE1FX0RJUkVDVF9QUk9CRToKKwkJaWVlZTgwMjExX2RpcmVjdF9wcm9iZShzZGF0YSwgaWZzdGEpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVEFfTUxNRV9BVVRIRU5USUNBVEU6CisJCWllZWU4MDIxMV9hdXRoZW50aWNhdGUoc2RhdGEsIGlmc3RhKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RBX01MTUVfQVNTT0NJQVRFOgorCQlpZWVlODAyMTFfYXNzb2NpYXRlKHNkYXRhLCBpZnN0YSk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURUQ6CisJCWllZWU4MDIxMV9hc3NvY2lhdGVkKHNkYXRhLCBpZnN0YSk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUQV9NTE1FX0lCU1NfU0VBUkNIOgorCQlpZWVlODAyMTFfc3RhX2ZpbmRfaWJzcyhzZGF0YSwgaWZzdGEpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVEFfTUxNRV9JQlNTX0pPSU5FRDoKKwkJaWVlZTgwMjExX3N0YV9tZXJnZV9pYnNzKHNkYXRhLCBpZnN0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCX0KKworCWlmIChpZWVlODAyMTFfcHJpdmFjeV9taXNtYXRjaChzZGF0YSwgaWZzdGEpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcHJpdmFjeSBjb25maWd1cmF0aW9uIG1pc21hdGNoIGFuZCAiCisJCSAgICAgICAibWl4ZWQtY2VsbCBkaXNhYmxlZCAtIGRpc2Fzc29jaWF0ZVxuIiwgc2RhdGEtPmRldi0+bmFtZSk7CisKKwkJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgaWZzdGEsIGZhbHNlLCB0cnVlLAorCQkJCQlXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzdGFydF9zdGFfdGltZXIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlxdWV1ZV93b3JrKHNkYXRhLT5sb2NhbC0+aHcud29ya3F1ZXVlLAorCQkJICAgJnNkYXRhLT51LnN0YS53b3JrKTsKK30KKworLyogaW50ZXJmYWNlIHNldHVwICovCit2b2lkIGllZWU4MDIxMV9zdGFfc2V0dXBfc2RhdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhOworCisJaWZzdGEgPSAmc2RhdGEtPnUuc3RhOworCUlOSVRfV09SSygmaWZzdGEtPndvcmssIGllZWU4MDIxMV9zdGFfd29yayk7CisJc2V0dXBfdGltZXIoJmlmc3RhLT50aW1lciwgaWVlZTgwMjExX3N0YV90aW1lciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaWZzdGEtPnNrYl9xdWV1ZSk7CisKKwlpZnN0YS0+Y2FwYWIgPSBXTEFOX0NBUEFCSUxJVFlfRVNTOworCWlmc3RhLT5hdXRoX2FsZ3MgPSBJRUVFODAyMTFfQVVUSF9BTEdfT1BFTiB8CisJCUlFRUU4MDIxMV9BVVRIX0FMR19TSEFSRURfS0VZOworCWlmc3RhLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0NSRUFURV9JQlNTIHwKKwkJSUVFRTgwMjExX1NUQV9BVVRPX0JTU0lEX1NFTCB8CisJCUlFRUU4MDIxMV9TVEFfQVVUT19DSEFOTkVMX1NFTDsKKwlpZiAoaWVlZTgwMjExX251bV9yZWd1bGFyX3F1ZXVlcygmc2RhdGEtPmxvY2FsLT5odykgPj0gNCkKKwkJaWZzdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfV01NX0VOQUJMRUQ7Cit9CisKKy8qCisgKiBBZGQgYSBuZXcgSUJTUyBzdGF0aW9uLCB3aWxsIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSBSWCBjb2RlIHdoZW4sCisgKiBpbiBJQlNTIG1vZGUsIHJlY2VpdmluZyBhIGZyYW1lIGZyb20gYSB5ZXQtdW5rbm93biBzdGF0aW9uLCBoZW5jZQorICogbXVzdCBiZSBjYWxsYWJsZSBpbiBhdG9taWMgY29udGV4dC4KKyAqLworc3RydWN0IHN0YV9pbmZvICppZWVlODAyMTFfaWJzc19hZGRfc3RhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqYnNzaWQsCisJCQkJCXU4ICphZGRyLCB1NjQgc3VwcF9yYXRlcykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKwlpbnQgYmFuZCA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQ7CisKKwkvKiBUT0RPOiBDb3VsZCBjb25zaWRlciByZW1vdmluZyB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSBhbmQKKwkgKiBhbGxvdyBuZXcgb25lIHRvIGJlIGFkZGVkLiAqLworCWlmIChsb2NhbC0+bnVtX3N0YSA+PSBJRUVFODAyMTFfSUJTU19NQVhfU1RBX0VOVFJJRVMpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyByb29tIGZvciBhIG5ldyBJQlNTIFNUQSAiCisJCQkgICAgICAgImVudHJ5ICVzXG4iLCBzZGF0YS0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBhZGRyKSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihic3NpZCwgc2RhdGEtPnUuc3RhLmJzc2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICIlczogQWRkaW5nIG5ldyBJQlNTIHN0YXRpb24gJXMgKGRldj0lcylcbiIsCisJICAgICAgIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSwgcHJpbnRfbWFjKG1hYywgYWRkciksIHNkYXRhLT5kZXYtPm5hbWUpOwogI2VuZGlmCiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENyZWF0aW5nIG5ldyBJQlNTIG5ldHdvcmssIEJTU0lEICVzXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIGJzc2lkKSk7CisJc3RhID0gc3RhX2luZm9fYWxsb2Moc2RhdGEsIGFkZHIsIEdGUF9BVE9NSUMpOworCWlmICghc3RhKQorCQlyZXR1cm4gTlVMTDsKIAotCWJzcyA9IGllZWU4MDIxMV9yeF9ic3NfYWRkKGRldiwgYnNzaWQsCi0JCQkJICAgbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEsCi0JCQkJICAgc2RhdGEtPnUuc3RhLnNzaWQsIHNkYXRhLT51LnN0YS5zc2lkX2xlbik7Ci0JaWYgKCFic3MpCi0JCXJldHVybiAtRU5PTUVNOworCXNldF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKIAotCWJzcy0+YmFuZCA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQ7Ci0Jc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2Jzcy0+YmFuZF07CisJLyogbWFrZSBzdXJlIG1hbmRhdG9yeSByYXRlcyBhcmUgYWx3YXlzIGFkZGVkICovCisJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSA9IHN1cHBfcmF0ZXMgfAorCQkJaWVlZTgwMjExX21hbmRhdG9yeV9yYXRlcyhsb2NhbCwgYmFuZCk7CiAKLQlpZiAobG9jYWwtPmh3LmNvbmYuYmVhY29uX2ludCA9PSAwKQotCQlsb2NhbC0+aHcuY29uZi5iZWFjb25faW50ID0gMTAwOwotCWJzcy0+YmVhY29uX2ludCA9IGxvY2FsLT5ody5jb25mLmJlYWNvbl9pbnQ7Ci0JYnNzLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7Ci0JYnNzLT5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CisJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOwogCi0JaWYgKHNkYXRhLT5kZWZhdWx0X2tleSkKLQkJYnNzLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCWVsc2UKLQkJc2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOworCWlmIChzdGFfaW5mb19pbnNlcnQoc3RhKSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlic3MtPnN1cHBfcmF0ZXNfbGVuID0gc2JhbmQtPm5fYml0cmF0ZXM7Ci0JcG9zID0gYnNzLT5zdXBwX3JhdGVzOwotCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9iaXRyYXRlczsgaSsrKSB7Ci0JCWludCByYXRlID0gc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGU7Ci0JCSpwb3MrKyA9ICh1OCkgKHJhdGUgLyA1KTsKLQl9Ci0KLQlyZXQgPSBpZWVlODAyMTFfc3RhX2pvaW5faWJzcyhkZXYsIGlmc3RhLCBic3MpOwotCWllZWU4MDIxMV9yeF9ic3NfcHV0KGxvY2FsLCBic3MpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHN0YTsKIH0KIAotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfZmluZF9pYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhKQorLyogY29uZmlndXJhdGlvbiBob29rcyAqLwordm9pZCBpZWVlODAyMTFfc3RhX3JlcV9hdXRoKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2JzcyAqYnNzOwotCWludCBmb3VuZCA9IDA7Ci0JdTggYnNzaWRbRVRIX0FMRU5dOwotCWludCBhY3RpdmVfaWJzczsKLQlERUNMQVJFX01BQ19CVUYobWFjKTsKLQlERUNMQVJFX01BQ19CVUYobWFjMik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAKLQlpZiAoaWZzdGEtPnNzaWRfbGVuID09IDApCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJcmV0dXJuOwogCi0JYWN0aXZlX2lic3MgPSBpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKGRldik7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YV9maW5kX2lic3MgKGFjdGl2ZV9pYnNzPSVkKVxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBhY3RpdmVfaWJzcyk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcgKi8KLQlzcGluX2xvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmbG9jYWwtPnN0YV9ic3NfbGlzdCwgbGlzdCkgewotCQlpZiAoaWZzdGEtPnNzaWRfbGVuICE9IGJzcy0+c3NpZF9sZW4gfHwKLQkJICAgIG1lbWNtcChpZnN0YS0+c3NpZCwgYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKSAhPSAwCi0JCSAgICB8fCAhKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKLQkJCWNvbnRpbnVlOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIgICBic3NpZD0lcyBmb3VuZFxuIiwKLQkJICAgICAgIHByaW50X21hYyhtYWMsIGJzcy0+YnNzaWQpKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLwotCQltZW1jcHkoYnNzaWQsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJZm91bmQgPSAxOwotCQlpZiAoYWN0aXZlX2lic3MgfHwgbWVtY21wKGJzc2lkLCBpZnN0YS0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQotCQkJYnJlYWs7CisJaWYgKChpZnN0YS0+ZmxhZ3MgJiAoSUVFRTgwMjExX1NUQV9CU1NJRF9TRVQgfAorCQkJICAgICBJRUVFODAyMTFfU1RBX0FVVE9fQlNTSURfU0VMKSkgJiYKKwkgICAgKGlmc3RhLT5mbGFncyAmIChJRUVFODAyMTFfU1RBX1NTSURfU0VUIHwKKwkJCSAgICAgSUVFRTgwMjExX1NUQV9BVVRPX1NTSURfU0VMKSkpIHsKKworCQlpZiAoaWZzdGEtPnN0YXRlID09IElFRUU4MDIxMV9TVEFfTUxNRV9BU1NPQ0lBVEVEKQorCQkJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgaWZzdGEsIHRydWUsIHRydWUsCisJCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisKKwkJc2V0X2JpdChJRUVFODAyMTFfU1RBX1JFUV9BVVRILCAmaWZzdGEtPnJlcXVlc3QpOworCQlxdWV1ZV93b3JrKGxvY2FsLT5ody53b3JrcXVldWUsICZpZnN0YS0+d29yayk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+c3RhX2Jzc19sb2NrKTsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCi0JaWYgKGZvdW5kKQotCQlwcmludGsoS0VSTl9ERUJVRyAiICAgc3RhX2ZpbmRfaWJzczogc2VsZWN0ZWQgJXMgY3VycmVudCAiCi0JCSAgICAgICAiJXNcbiIsIHByaW50X21hYyhtYWMsIGJzc2lkKSwKLQkJICAgICAgIHByaW50X21hYyhtYWMyLCBpZnN0YS0+YnNzaWQpKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLwotCi0JaWYgKGZvdW5kICYmIG1lbWNtcChpZnN0YS0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgIT0gMCkgewotCQlpbnQgcmV0OwotCQlpbnQgc2VhcmNoX2ZyZXE7Ci0KLQkJaWYgKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQVVUT19DSEFOTkVMX1NFTCkKLQkJCXNlYXJjaF9mcmVxID0gYnNzLT5mcmVxOwotCQllbHNlCi0JCQlzZWFyY2hfZnJlcSA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmNlbnRlcl9mcmVxOwotCi0JCWJzcyA9IGllZWU4MDIxMV9yeF9ic3NfZ2V0KGRldiwgYnNzaWQsIHNlYXJjaF9mcmVxLAotCQkJCQkgICBpZnN0YS0+c3NpZCwgaWZzdGEtPnNzaWRfbGVuKTsKLQkJaWYgKCFic3MpCi0JCQlnb3RvIGRvbnRfam9pbjsKLQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNlbGVjdGVkIElCU1MgQlNTSUQgJXMiCi0JCSAgICAgICAiIGJhc2VkIG9uIGNvbmZpZ3VyZWQgU1NJRFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgYnNzaWQpKTsKLQkJcmV0ID0gaWVlZTgwMjExX3N0YV9qb2luX2lic3MoZGV2LCBpZnN0YSwgYnNzKTsKLQkJaWVlZTgwMjExX3J4X2Jzc19wdXQobG9jYWwsIGJzcyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi1kb250X2pvaW46Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0lCU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiICAgZGlkIG5vdCB0cnkgdG8gam9pbiBpYnNzXG4iKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRyAqLwotCi0JLyogU2VsZWN0ZWQgSUJTUyBub3QgZm91bmQgaW4gY3VycmVudCBzY2FuIHJlc3VsdHMgLSB0cnkgdG8gc2NhbiAqLwotCWlmIChpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX0lCU1NfSk9JTkVEICYmCi0JICAgICFpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKGRldikpIHsKLQkJbW9kX3RpbWVyKCZpZnN0YS0+dGltZXIsIGppZmZpZXMgKwotCQkJCSAgICAgIElFRUU4MDIxMV9JQlNTX01FUkdFX0lOVEVSVkFMKTsKLQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbG9jYWwtPmxhc3Rfc2Nhbl9jb21wbGV0ZWQgKwotCQkJICAgICAgSUVFRTgwMjExX1NDQU5fSU5URVJWQUwpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJpZ2dlciBuZXcgc2NhbiB0byBmaW5kIGFuIElCU1MgdG8gIgotCQkgICAgICAgImpvaW5cbiIsIGRldi0+bmFtZSk7Ci0JCXJldHVybiBpZWVlODAyMTFfc3RhX3JlcV9zY2FuKGRldiwgaWZzdGEtPnNzaWQsCi0JCQkJCSAgICAgIGlmc3RhLT5zc2lkX2xlbik7Ci0JfSBlbHNlIGlmIChpZnN0YS0+c3RhdGUgIT0gSUVFRTgwMjExX0lCU1NfSk9JTkVEKSB7Ci0JCWludCBpbnRlcnZhbCA9IElFRUU4MDIxMV9TQ0FOX0lOVEVSVkFMOwotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGlmc3RhLT5pYnNzX2pvaW5fcmVxICsKLQkJCSAgICAgICBJRUVFODAyMTFfSUJTU19KT0lOX1RJTUVPVVQpKSB7Ci0JCQlpZiAoKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQ1JFQVRFX0lCU1MpICYmCi0JCQkgICAgKCEobG9jYWwtPm9wZXJfY2hhbm5lbC0+ZmxhZ3MgJgotCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19JQlNTKSkpCi0JCQkJcmV0dXJuIGllZWU4MDIxMV9zdGFfY3JlYXRlX2lic3MoZGV2LCBpZnN0YSk7Ci0JCQlpZiAoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9DUkVBVEVfSUJTUykgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSUJTUyBub3QgYWxsb3dlZCBvbiIKLQkJCQkgICAgICAgIiAlZCBNSHpcbiIsIGRldi0+bmFtZSwKLQkJCQkgICAgICAgbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwotCQkJfQotCi0JCQkvKiBObyBJQlNTIGZvdW5kIC0gZGVjcmVhc2Ugc2NhbiBpbnRlcnZhbCBhbmQgY29udGludWUKLQkJCSAqIHNjYW5uaW5nLiAqLwotCQkJaW50ZXJ2YWwgPSBJRUVFODAyMTFfU0NBTl9JTlRFUlZBTF9TTE9XOwotCQl9Ci0KLQkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX0lCU1NfU0VBUkNIOwotCQltb2RfdGltZXIoJmlmc3RhLT50aW1lciwgamlmZmllcyArIGludGVydmFsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7CiB9CiAKLQotaW50IGllZWU4MDIxMV9zdGFfc2V0X3NzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqc3NpZCwgc2l6ZV90IGxlbikKK2ludCBpZWVlODAyMTFfc3RhX3NldF9zc2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBjaGFyICpzc2lkLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGE7CiAJaW50IHJlczsKIApAQCAtMzc1OSw3ICsyNDMwLDcgQEAKIAkJCXJlcyA9IGllZWU4MDIxMV9pZl9jb25maWcoc2RhdGEsIElFRUU4MDIxMV9JRkNDX1NTSUQpOwogCQlpZiAocmVzKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZhaWxlZCB0byBjb25maWcgbmV3IFNTSUQgdG8gIgotCQkJICAgICAgICJ0aGUgbG93LWxldmVsIGRyaXZlclxuIiwgZGV2LT5uYW1lKTsKKwkJCSAgICAgICAidGhlIGxvdy1sZXZlbCBkcml2ZXJcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwogCQkJcmV0dXJuIHJlczsKIAkJfQogCX0KQEAgLTM3NjksMzQgKzI0NDAsMjkgQEAKIAllbHNlCiAJCWlmc3RhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9TU0lEX1NFVDsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJgorCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKIAkgICAgIShpZnN0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0JTU0lEX1NFVCkpIHsKIAkJaWZzdGEtPmlic3Nfam9pbl9yZXEgPSBqaWZmaWVzOwotCQlpZnN0YS0+c3RhdGUgPSBJRUVFODAyMTFfSUJTU19TRUFSQ0g7Ci0JCXJldHVybiBpZWVlODAyMTFfc3RhX2ZpbmRfaWJzcyhkZXYsIGlmc3RhKTsKKwkJaWZzdGEtPnN0YXRlID0gSUVFRTgwMjExX1NUQV9NTE1FX0lCU1NfU0VBUkNIOworCQlyZXR1cm4gaWVlZTgwMjExX3N0YV9maW5kX2lic3Moc2RhdGEsIGlmc3RhKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1pbnQgaWVlZTgwMjExX3N0YV9nZXRfc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpzc2lkLCBzaXplX3QgKmxlbikKK2ludCBpZWVlODAyMTFfc3RhX2dldF9zc2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBjaGFyICpzc2lkLCBzaXplX3QgKmxlbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAltZW1jcHkoc3NpZCwgaWZzdGEtPnNzaWQsIGlmc3RhLT5zc2lkX2xlbik7CiAJKmxlbiA9IGlmc3RhLT5zc2lkX2xlbjsKIAlyZXR1cm4gMDsKIH0KIAotCi1pbnQgaWVlZTgwMjExX3N0YV9zZXRfYnNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmJzc2lkKQoraW50IGllZWU4MDIxMV9zdGFfc2V0X2Jzc2lkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1OCAqYnNzaWQpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhOwogCWludCByZXM7CiAKLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJaWZzdGEgPSAmc2RhdGEtPnUuc3RhOwogCiAJaWYgKG1lbWNtcChpZnN0YS0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgIT0gMCkgewpAQCAtMzgwOSw3ICsyNDc1LDcgQEAKIAkJCXJlcyA9IGllZWU4MDIxMV9pZl9jb25maWcoc2RhdGEsIElFRUU4MDIxMV9JRkNDX0JTU0lEKTsKIAkJaWYgKHJlcykgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGYWlsZWQgdG8gY29uZmlnIG5ldyBCU1NJRCB0byAiCi0JCQkgICAgICAgInRoZSBsb3ctbGV2ZWwgZHJpdmVyXG4iLCBkZXYtPm5hbWUpOworCQkJICAgICAgICJ0aGUgbG93LWxldmVsIGRyaXZlclxuIiwgc2RhdGEtPmRldi0+bmFtZSk7CiAJCQlyZXR1cm4gcmVzOwogCQl9CiAJfQpAQCAtMzgyMiw1MzEgKzI0ODgsOCBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX251bGxmdW5jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkgICAgaW50IHBvd2Vyc2F2ZSkKK2ludCBpZWVlODAyMTFfc3RhX3NldF9leHRyYV9pZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgY2hhciAqaWUsIHNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqbnVsbGZ1bmM7Ci0JX19sZTE2IGZjOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKyAyNCk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBudWxsZnVuYyAiCi0JCSAgICAgICAiZnJhbWVcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQotCW51bGxmdW5jID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYl9wdXQoc2tiLCAyNCk7Ci0JbWVtc2V0KG51bGxmdW5jLCAwLCAyNCk7Ci0JZmMgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8Ci0JCQkgSUVFRTgwMjExX0ZDVExfVE9EUyk7Ci0JaWYgKHBvd2Vyc2F2ZSkKLQkJZmMgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUE0pOwotCW51bGxmdW5jLT5mcmFtZV9jb250cm9sID0gZmM7Ci0JbWVtY3B5KG51bGxmdW5jLT5hZGRyMSwgc2RhdGEtPnUuc3RhLmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG51bGxmdW5jLT5hZGRyMiwgc2RhdGEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKLQotCWllZWU4MDIxMV9zdGFfdHgoc2RhdGEtPmRldiwgc2tiLCAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfcmVzdGFydF9zdGFfdGltZXIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCi17Ci0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKLQkgICAgaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKLQkJaWVlZTgwMjExX3N0YV90aW1lcigodW5zaWduZWQgbG9uZylzZGF0YSk7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsb2NhbC0+c2Nhbl9kZXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCi0JbG9jYWwtPmxhc3Rfc2Nhbl9jb21wbGV0ZWQgPSBqaWZmaWVzOwotCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKLQotCWlmIChsb2NhbC0+c3RhX2h3X3NjYW5uaW5nKSB7Ci0JCWxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcgPSAwOwotCQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCkpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byByZXN0b3JlIG9wZXJhdGlvbmFsICIKLQkJCSAgICAgICAiY2hhbm5lbCBhZnRlciBzY2FuXG4iLCBkZXYtPm5hbWUpOwotCQkvKiBSZXN0YXJ0IFNUQSB0aW1lciBmb3IgSFcgc2NhbiBjYXNlICovCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkKLQkJCWllZWU4MDIxMV9yZXN0YXJ0X3N0YV90aW1lcihzZGF0YSk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCi0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlsb2NhbC0+c3RhX3N3X3NjYW5uaW5nID0gMDsKLQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCkpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIHJlc3RvcmUgb3BlcmF0aW9uYWwgIgotCQkgICAgICAgImNoYW5uZWwgYWZ0ZXIgc2NhblxuIiwgZGV2LT5uYW1lKTsKLQotCi0JbmV0aWZfdHhfbG9ja19iaChsb2NhbC0+bWRldik7Ci0JbmV0aWZfYWRkcl9sb2NrKGxvY2FsLT5tZGV2KTsKLQlsb2NhbC0+ZmlsdGVyX2ZsYWdzICY9IH5GSUZfQkNOX1BSQlJFU1BfUFJPTUlTQzsKLQlsb2NhbC0+b3BzLT5jb25maWd1cmVfZmlsdGVyKGxvY2FsX3RvX2h3KGxvY2FsKSwKLQkJCQkgICAgIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLAotCQkJCSAgICAgJmxvY2FsLT5maWx0ZXJfZmxhZ3MsCi0JCQkJICAgICBsb2NhbC0+bWRldi0+bWNfY291bnQsCi0JCQkJICAgICBsb2NhbC0+bWRldi0+bWNfbGlzdCk7Ci0KLQluZXRpZl9hZGRyX3VubG9jayhsb2NhbC0+bWRldik7Ci0JbmV0aWZfdHhfdW5sb2NrX2JoKGxvY2FsLT5tZGV2KTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7Ci0JCS8qIFRlbGwgQVAgd2UncmUgYmFjayAqLwotCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSAmJgotCQkgICAgc2RhdGEtPnUuc3RhLmZsYWdzICYgSUVFRTgwMjExX1NUQV9BU1NPQ0lBVEVEKQotCQkJaWVlZTgwMjExX3NlbmRfbnVsbGZ1bmMobG9jYWwsIHNkYXRhLCAwKTsKLQotCQlpZWVlODAyMTFfcmVzdGFydF9zdGFfdGltZXIoc2RhdGEpOwotCi0JCW5ldGlmX3dha2VfcXVldWUoc2RhdGEtPmRldik7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi1kb25lOgotCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKLQkJaWYgKCEoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9CU1NJRF9TRVQpIHx8Ci0JCSAgICAoIShpZnN0YS0+c3RhdGUgPT0gSUVFRTgwMjExX0lCU1NfSk9JTkVEKSAmJgotCQkgICAgIWllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3MoZGV2KSkpCi0JCQlpZWVlODAyMTFfc3RhX2ZpbmRfaWJzcyhkZXYsIGlmc3RhKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZCk7Ci0KLXZvaWQgaWVlZTgwMjExX3N0YV9zY2FuX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIHNjYW5fd29yay53b3JrKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbG9jYWwtPnNjYW5fZGV2OwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JaW50IHNraXA7Ci0JdW5zaWduZWQgbG9uZyBuZXh0X2RlbGF5ID0gMDsKLQotCWlmICghbG9jYWwtPnN0YV9zd19zY2FubmluZykKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChsb2NhbC0+c2Nhbl9zdGF0ZSkgewotCWNhc2UgU0NBTl9TRVRfQ0hBTk5FTDoKLQkJLyoKLQkJICogR2V0IGN1cnJlbnQgc2NhbiBiYW5kLiBzY2FuX2JhbmQgbWF5IGJlIElFRUU4MDIxMV9OVU1fQkFORFMKLQkJICogYWZ0ZXIgd2Ugc3VjY2Vzc2Z1bGx5IHNjYW5uZWQgdGhlIGxhc3QgY2hhbm5lbCBvZiB0aGUgbGFzdAotCQkgKiBiYW5kIChhbmQgdGhlIGxhc3QgYmFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGh3KQotCQkgKi8KLQkJaWYgKGxvY2FsLT5zY2FuX2JhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTKQotCQkJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2xvY2FsLT5zY2FuX2JhbmRdOwotCQllbHNlCi0JCQlzYmFuZCA9IE5VTEw7Ci0KLQkJLyoKLQkJICogSWYgd2UgYXJlIGF0IGFuIHVuc3VwcG9ydGVkIGJhbmQgYW5kIGhhdmUgbW9yZSBiYW5kcwotCQkgKiBsZWZ0IHRvIHNjYW4sIGFkdmFuY2UgdG8gdGhlIG5leHQgc3VwcG9ydGVkIG9uZS4KLQkJICovCi0JCXdoaWxlICghc2JhbmQgJiYgbG9jYWwtPnNjYW5fYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFMgLSAxKSB7Ci0JCQlsb2NhbC0+c2Nhbl9iYW5kKys7Ci0JCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPnNjYW5fYmFuZF07Ci0JCQlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA9IDA7Ci0JCX0KLQotCQkvKiBpZiBubyBtb3JlIGJhbmRzL2NoYW5uZWxzIGxlZnQsIGNvbXBsZXRlIHNjYW4gKi8KLQkJaWYgKCFzYmFuZCB8fCBsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA+PSBzYmFuZC0+bl9jaGFubmVscykgewotCQkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKGxvY2FsX3RvX2h3KGxvY2FsKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2tpcCA9IDA7Ci0JCWNoYW4gPSAmc2JhbmQtPmNoYW5uZWxzW2xvY2FsLT5zY2FuX2NoYW5uZWxfaWR4XTsKLQotCQlpZiAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCB8fAotCQkgICAgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTICYmCi0JCSAgICAgY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JQlNTKSkKLQkJCXNraXAgPSAxOwotCi0JCWlmICghc2tpcCkgewotCQkJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IGNoYW47Ci0JCQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCkpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBzZXQgZnJlcSB0byAiCi0JCQkJICAgICAgICIlZCBNSHogZm9yIHNjYW5cbiIsIGRldi0+bmFtZSwKLQkJCQkgICAgICAgY2hhbi0+Y2VudGVyX2ZyZXEpOwotCQkJCXNraXAgPSAxOwotCQkJfQotCQl9Ci0KLQkJLyogYWR2YW5jZSBzdGF0ZSBtYWNoaW5lIHRvIG5leHQgY2hhbm5lbC9iYW5kICovCi0JCWxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4Kys7Ci0JCWlmIChsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA+PSBzYmFuZC0+bl9jaGFubmVscykgewotCQkJLyoKLQkJCSAqIHNjYW5fYmFuZCBtYXkgZW5kIHVwID09IElFRUU4MDIxMV9OVU1fQkFORFMsIGJ1dAotCQkJICogd2UnbGwgY2F0Y2ggdGhhdCBjYXNlIGFib3ZlIGFuZCBjb21wbGV0ZSB0aGUgc2NhbgotCQkJICogaWYgdGhhdCBpcyB0aGUgY2FzZS4KLQkJCSAqLwotCQkJbG9jYWwtPnNjYW5fYmFuZCsrOwotCQkJbG9jYWwtPnNjYW5fY2hhbm5lbF9pZHggPSAwOwotCQl9Ci0KLQkJaWYgKHNraXApCi0JCQlicmVhazsKLQotCQluZXh0X2RlbGF5ID0gSUVFRTgwMjExX1BST0JFX0RFTEFZICsKLQkJCSAgICAgdXNlY3NfdG9famlmZmllcyhsb2NhbC0+aHcuY2hhbm5lbF9jaGFuZ2VfdGltZSk7Ci0JCWxvY2FsLT5zY2FuX3N0YXRlID0gU0NBTl9TRU5EX1BST0JFOwotCQlicmVhazsKLQljYXNlIFNDQU5fU0VORF9QUk9CRToKLQkJbmV4dF9kZWxheSA9IElFRUU4MDIxMV9QQVNTSVZFX0NIQU5ORUxfVElNRTsKLQkJbG9jYWwtPnNjYW5fc3RhdGUgPSBTQ0FOX1NFVF9DSEFOTkVMOwotCi0JCWlmIChsb2NhbC0+c2Nhbl9jaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikKLQkJCWJyZWFrOwotCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXEoZGV2LCBOVUxMLCBsb2NhbC0+c2Nhbl9zc2lkLAotCQkJCQkgbG9jYWwtPnNjYW5fc3NpZF9sZW4pOwotCQluZXh0X2RlbGF5ID0gSUVFRTgwMjExX0NIQU5ORUxfVElNRTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGxvY2FsLT5zdGFfc3dfc2Nhbm5pbmcpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhsb2NhbC0+aHcud29ya3F1ZXVlLCAmbG9jYWwtPnNjYW5fd29yaywKLQkJCQkgICBuZXh0X2RlbGF5KTsKLX0KLQotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfc3RhcnRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0KLQlpZiAoc3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIE1MTUUtU0NBTi5yZXF1ZXN0IChwYWdlIDExOCkgIHBhZ2UgMTQ0ICgxMS4xLjMuMSkKLQkgKiBCU1NUeXBlOiBJTkZSQVNUUlVDVFVSRSwgSU5ERVBFTkRFTlQsIEFOWV9CU1MKLQkgKiBCU1NJRDogTUFDQWRkcmVzcwotCSAqIFNTSUQKLQkgKiBTY2FuVHlwZTogQUNUSVZFLCBQQVNTSVZFCi0JICogUHJvYmVEZWxheTogZGVsYXkgKGluIG1pY3Jvc2Vjb25kcykgdG8gYmUgdXNlZCBwcmlvciB0byB0cmFuc21pdHRpbmcKLQkgKiAgICBhIFByb2JlIGZyYW1lIGR1cmluZyBhY3RpdmUgc2Nhbm5pbmcKLQkgKiBDaGFubmVsTGlzdAotCSAqIE1pbkNoYW5uZWxUaW1lICg+PSBQcm9iZURlbGF5KSwgaW4gVFUKLQkgKiBNYXhDaGFubmVsVGltZTogKD49IE1pbkNoYW5uZWxUaW1lKSwgaW4gVFUKLQkgKi8KLQotCSAvKiBNTE1FLVNDQU4uY29uZmlybQotCSAgKiBCU1NEZXNjcmlwdGlvblNldAotCSAgKiBSZXN1bHRDb2RlOiBTVUNDRVNTLCBJTlZBTElEX1BBUkFNRVRFUlMKLQkgKi8KLQotCWlmIChsb2NhbC0+c3RhX3N3X3NjYW5uaW5nIHx8IGxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcpIHsKLQkJaWYgKGxvY2FsLT5zY2FuX2RldiA9PSBkZXYpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAobG9jYWwtPm9wcy0+aHdfc2NhbikgewotCQlpbnQgcmMgPSBsb2NhbC0+b3BzLT5od19zY2FuKGxvY2FsX3RvX2h3KGxvY2FsKSwKLQkJCQkJICAgICBzc2lkLCBzc2lkX2xlbik7Ci0JCWlmICghcmMpIHsKLQkJCWxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcgPSAxOwotCQkJbG9jYWwtPnNjYW5fZGV2ID0gZGV2OwotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlsb2NhbC0+c3RhX3N3X3NjYW5uaW5nID0gMTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoc2RhdGEtPmRldik7Ci0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBICYmCi0JCSAgICAoc2RhdGEtPnUuc3RhLmZsYWdzICYgSUVFRTgwMjExX1NUQV9BU1NPQ0lBVEVEKSkKLQkJCWllZWU4MDIxMV9zZW5kX251bGxmdW5jKGxvY2FsLCBzZGF0YSwgMSk7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JaWYgKHNzaWQpIHsKLQkJbG9jYWwtPnNjYW5fc3NpZF9sZW4gPSBzc2lkX2xlbjsKLQkJbWVtY3B5KGxvY2FsLT5zY2FuX3NzaWQsIHNzaWQsIHNzaWRfbGVuKTsKLQl9IGVsc2UKLQkJbG9jYWwtPnNjYW5fc3NpZF9sZW4gPSAwOwotCWxvY2FsLT5zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKLQlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA9IDA7Ci0JbG9jYWwtPnNjYW5fYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0JbG9jYWwtPnNjYW5fZGV2ID0gZGV2OwotCi0JbmV0aWZfYWRkcl9sb2NrX2JoKGxvY2FsLT5tZGV2KTsKLQlsb2NhbC0+ZmlsdGVyX2ZsYWdzIHw9IEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDOwotCWxvY2FsLT5vcHMtPmNvbmZpZ3VyZV9maWx0ZXIobG9jYWxfdG9faHcobG9jYWwpLAotCQkJCSAgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MsCi0JCQkJICAgICAmbG9jYWwtPmZpbHRlcl9mbGFncywKLQkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19jb3VudCwKLQkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19saXN0KTsKLQluZXRpZl9hZGRyX3VubG9ja19iaChsb2NhbC0+bWRldik7Ci0KLQkvKiBUT0RPOiBzdGFydCBzY2FuIGFzIHNvb24gYXMgYWxsIG51bGxmdW5jIGZyYW1lcyBhcmUgQUNLZWQgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmxvY2FsLT5zY2FuX3dvcmssCi0JCQkgICBJRUVFODAyMTFfQ0hBTk5FTF9USU1FKTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpZWVlODAyMTFfc3RhX3JlcV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKQotCQlyZXR1cm4gaWVlZTgwMjExX3N0YV9zdGFydF9zY2FuKGRldiwgc3NpZCwgc3NpZF9sZW4pOwotCi0JaWYgKGxvY2FsLT5zdGFfc3dfc2Nhbm5pbmcgfHwgbG9jYWwtPnN0YV9od19zY2FubmluZykgewotCQlpZiAobG9jYWwtPnNjYW5fZGV2ID09IGRldikKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmc3RhLT5zY2FuX3NzaWRfbGVuID0gc3NpZF9sZW47Ci0JaWYgKHNzaWRfbGVuKQotCQltZW1jcHkoaWZzdGEtPnNjYW5fc3NpZCwgc3NpZCwgc3NpZF9sZW4pOwotCXNldF9iaXQoSUVFRTgwMjExX1NUQV9SRVFfU0NBTiwgJmlmc3RhLT5yZXF1ZXN0KTsKLQlxdWV1ZV93b3JrKGxvY2FsLT5ody53b3JrcXVldWUsICZpZnN0YS0+d29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWllZWU4MDIxMV9zdGFfc2Nhbl9yZXN1bHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3MsCi0JCQkgIGNoYXIgKmN1cnJlbnRfZXYsIGNoYXIgKmVuZF9idWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3QgaXdfZXZlbnQgaXdlOwotCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJICAgICAgIGJzcy0+bGFzdF91cGRhdGUgKyBJRUVFODAyMTFfU0NBTl9SRVNVTFRfRVhQSVJFKSkKLQkJcmV0dXJuIGN1cnJlbnRfZXY7Ci0KLQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCWl3ZS5jbWQgPSBTSU9DR0lXQVA7Ci0JaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAotCQkJCQkgIElXX0VWX0FERFJfTEVOKTsKLQotCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKLQlpZiAoYnNzX21lc2hfY2ZnKGJzcykpIHsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3NfbWVzaF9pZF9sZW4oYnNzKTsKLQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAotCQkJCQkJICAmaXdlLCBic3NfbWVzaF9pZChic3MpKTsKLQl9IGVsc2UgewotCQlpd2UudS5kYXRhLmxlbmd0aCA9IGJzcy0+c3NpZF9sZW47Ci0JCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCSAgJml3ZSwgYnNzLT5zc2lkKTsKLQl9Ci0KLQlpZiAoYnNzLT5jYXBhYmlsaXR5ICYgKFdMQU5fQ0FQQUJJTElUWV9FU1MgfCBXTEFOX0NBUEFCSUxJVFlfSUJTUykKLQkgICAgfHwgYnNzX21lc2hfY2ZnKGJzcykpIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpZiAoYnNzX21lc2hfY2ZnKGJzcykpCi0JCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NRVNIOwotCQllbHNlIGlmIChic3MtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKQotCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOwotCQllbHNlCi0JCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCi0JCQkJCQkgICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKLQl9Ci0KLQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKLQlpd2UudS5mcmVxLm0gPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoYnNzLT5mcmVxKTsKLQlpd2UudS5mcmVxLmUgPSAwOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAotCQkJCQkgIElXX0VWX0ZSRVFfTEVOKTsKLQotCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotCWl3ZS51LmZyZXEubSA9IGJzcy0+ZnJlcTsKLQlpd2UudS5mcmVxLmUgPSA2OwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAotCQkJCQkgIElXX0VWX0ZSRVFfTEVOKTsKLQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCWl3ZS5jbWQgPSBJV0VWUVVBTDsKLQlpd2UudS5xdWFsLnF1YWwgPSBic3MtPnF1YWw7Ci0JaXdlLnUucXVhbC5sZXZlbCA9IGJzcy0+c2lnbmFsOwotCWl3ZS51LnF1YWwubm9pc2UgPSBic3MtPm5vaXNlOwotCWl3ZS51LnF1YWwudXBkYXRlZCA9IGxvY2FsLT53c3RhdHNfZmxhZ3M7Ci0JY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCi0JCQkJCSAgSVdfRVZfUVVBTF9MRU4pOwotCi0JbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKLQlpZiAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCi0JCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQllbHNlCi0JCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JaXdlLnUuZGF0YS5sZW5ndGggPSAwOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAotCQkJCQkgICZpd2UsICIiKTsKLQotCWlmIChic3MgJiYgYnNzLT53cGFfaWUpIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPndwYV9pZV9sZW47Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAotCQkJCQkJICAmaXdlLCBic3MtPndwYV9pZSk7Ci0JfQotCi0JaWYgKGJzcyAmJiBic3MtPnJzbl9pZSkgewotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IGJzcy0+cnNuX2llX2xlbjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCi0JCQkJCQkgICZpd2UsIGJzcy0+cnNuX2llKTsKLQl9Ci0KLQlpZiAoYnNzICYmIGJzcy0+aHRfaWUpIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPmh0X2llX2xlbjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCi0JCQkJCQkgICZpd2UsIGJzcy0+aHRfaWUpOwotCX0KLQotCWlmIChic3MgJiYgYnNzLT5zdXBwX3JhdGVzX2xlbiA+IDApIHsKLQkJLyogZGlzcGxheSBhbGwgc3VwcG9ydGVkIHJhdGVzIGluIHJlYWRhYmxlIGZvcm1hdCAqLwotCQljaGFyICpwID0gY3VycmVudF9ldiArIGl3ZV9zdHJlYW1fbGNwX2xlbihpbmZvKTsKLQkJaW50IGk7Ci0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOwotCQkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KLQkJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBic3MtPnN1cHBfcmF0ZXNfbGVuOyBpKyspIHsKLQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKGJzcy0+c3VwcF9yYXRlc1tpXSAmCi0JCQkJCQkJMHg3ZikgKiA1MDAwMDApOwotCQkJcCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIGN1cnJlbnRfZXYsIHAsCi0JCQkJCWVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7Ci0JCX0KLQkJY3VycmVudF9ldiA9IHA7Ci0JfQotCi0JaWYgKGJzcykgewotCQljaGFyICpidWY7Ci0JCWJ1ZiA9IGttYWxsb2MoMzAsIEdGUF9BVE9NSUMpOwotCQlpZiAoYnVmKSB7Ci0JCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCQlzcHJpbnRmKGJ1ZiwgInRzZj0lMDE2bGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykoYnNzLT50aW1lc3RhbXApKTsKLQkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0JCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCQkgIGVuZF9idWYsCi0JCQkJCQkJICAmaXdlLCBidWYpOwotCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOwotCQkJc3ByaW50ZihidWYsICIgTGFzdCBiZWFjb246ICVkbXMgYWdvIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBic3MtPmxhc3RfdXBkYXRlKSk7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLCAmaXdlLCBidWYpOwotCQkJa2ZyZWUoYnVmKTsKLQkJfQotCX0KLQotCWlmIChic3NfbWVzaF9jZmcoYnNzKSkgewotCQljaGFyICpidWY7Ci0JCXU4ICpjZmcgPSBic3NfbWVzaF9jZmcoYnNzKTsKLQkJYnVmID0ga21hbGxvYyg1MCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChidWYpIHsKLQkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKLQkJCXNwcmludGYoYnVmLCAiTWVzaCBuZXR3b3JrICh2ZXJzaW9uICVkKSIsIGNmZ1swXSk7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKLQkJCXNwcmludGYoYnVmLCAiUGF0aCBTZWxlY3Rpb24gUHJvdG9jb2wgSUQ6ICIKLQkJCQkiMHglMDJYJTAyWCUwMlglMDJYIiwgY2ZnWzFdLCBjZmdbMl0sIGNmZ1szXSwKLQkJCQkJCQljZmdbNF0pOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAotCQkJCQkJCSAgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsIGJ1Zik7Ci0JCQlzcHJpbnRmKGJ1ZiwgIlBhdGggU2VsZWN0aW9uIE1ldHJpYyBJRDogIgotCQkJCSIweCUwMlglMDJYJTAyWCUwMlgiLCBjZmdbNV0sIGNmZ1s2XSwgY2ZnWzddLAotCQkJCQkJCWNmZ1s4XSk7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKLQkJCXNwcmludGYoYnVmLCAiQ29uZ2VzdGlvbiBDb250cm9sIE1vZGUgSUQ6ICIKLQkJCQkiMHglMDJYJTAyWCUwMlglMDJYIiwgY2ZnWzldLCBjZmdbMTBdLAotCQkJCQkJCWNmZ1sxMV0sIGNmZ1sxMl0pOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAotCQkJCQkJCSAgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsIGJ1Zik7Ci0JCQlzcHJpbnRmKGJ1ZiwgIkNoYW5uZWwgUHJlY2VkZW5jZTogIgotCQkJCSIweCUwMlglMDJYJTAyWCUwMlgiLCBjZmdbMTNdLCBjZmdbMTRdLAotCQkJCQkJCWNmZ1sxNV0sIGNmZ1sxNl0pOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAotCQkJCQkJCSAgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsIGJ1Zik7Ci0JCQlrZnJlZShidWYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGN1cnJlbnRfZXY7Ci19Ci0KLQotaW50IGllZWU4MDIxMV9zdGFfc2Nhbl9yZXN1bHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQljaGFyICpjdXJyZW50X2V2ID0gYnVmOwotCWNoYXIgKmVuZF9idWYgPSBidWYgKyBsZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfYnNzICpic3M7Ci0KLQlzcGluX2xvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmbG9jYWwtPnN0YV9ic3NfbGlzdCwgbGlzdCkgewotCQlpZiAoYnVmICsgbGVuIC0gY3VycmVudF9ldiA8PSBJV19FVl9BRERSX0xFTikgewotCQkJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCQkJcmV0dXJuIC1FMkJJRzsKLQkJfQotCQljdXJyZW50X2V2ID0gaWVlZTgwMjExX3N0YV9zY2FuX3Jlc3VsdChkZXYsIGluZm8sIGJzcywKLQkJCQkJCSAgICAgICBjdXJyZW50X2V2LCBlbmRfYnVmKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5zdGFfYnNzX2xvY2spOwotCXJldHVybiBjdXJyZW50X2V2IC0gYnVmOwotfQotCi0KLWludCBpZWVlODAyMTFfc3RhX3NldF9leHRyYV9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICppZSwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAogCWtmcmVlKGlmc3RhLT5leHRyYV9pZSk7CkBAIC00MzY1LDkyICsyNTA4LDYwIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RydWN0IHN0YV9pbmZvICppZWVlODAyMTFfaWJzc19hZGRfc3RhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IsIHU4ICpic3NpZCwKLQkJCQkJdTggKmFkZHIsIHU2NCBzdXBwX3JhdGVzKQoraW50IGllZWU4MDIxMV9zdGFfZGVhdXRoZW50aWNhdGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHUxNiByZWFzb24pCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0JREVDTEFSRV9NQUNfQlVGKG1hYyk7Ci0JaW50IGJhbmQgPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kOwotCi0JLyogVE9ETzogQ291bGQgY29uc2lkZXIgcmVtb3ZpbmcgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkgYW5kCi0JICogYWxsb3cgbmV3IG9uZSB0byBiZSBhZGRlZC4gKi8KLQlpZiAobG9jYWwtPm51bV9zdGEgPj0gSUVFRTgwMjExX0lCU1NfTUFYX1NUQV9FTlRSSUVTKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gcm9vbSBmb3IgYSBuZXcgSUJTUyBTVEEgIgotCQkJICAgICAgICJlbnRyeSAlc1xuIiwgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBhZGRyKSk7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihic3NpZCwgc2RhdGEtPnUuc3RhLmJzc2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlczogQWRkaW5nIG5ldyBJQlNTIHN0YXRpb24gJXMgKGRldj0lcylcbiIsCi0JICAgICAgIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSwgcHJpbnRfbWFjKG1hYywgYWRkciksIGRldi0+bmFtZSk7Ci0jZW5kaWYKLQotCXN0YSA9IHN0YV9pbmZvX2FsbG9jKHNkYXRhLCBhZGRyLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXN0YSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZXRfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7Ci0KLQlpZiAoc3VwcF9yYXRlcykKLQkJc3RhLT5zdXBwX3JhdGVzW2JhbmRdID0gc3VwcF9yYXRlczsKLQllbHNlCi0JCXN0YS0+c3VwcF9yYXRlc1tiYW5kXSA9IHNkYXRhLT51LnN0YS5zdXBwX3JhdGVzX2JpdHNbYmFuZF07Ci0KLQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSwgbG9jYWwpOwotCi0JaWYgKHN0YV9pbmZvX2luc2VydChzdGEpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBzdGE7Ci19Ci0KLQotaW50IGllZWU4MDIxMV9zdGFfZGVhdXRoZW50aWNhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlYXNvbikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogZGVhdXRoZW50aWNhdGluZyBieSBsb2NhbCBjaG9pY2UgKHJlYXNvbj0lZClcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgcmVhc29uKTsKKwkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcmVhc29uKTsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBICYmCi0JICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWVlZTgwMjExX3NlbmRfZGVhdXRoKGRldiwgaWZzdGEsIHJlYXNvbik7Ci0JaWVlZTgwMjExX3NldF9kaXNhc3NvYyhkZXYsIGlmc3RhLCAxKTsKKwlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCBpZnN0YSwgdHJ1ZSwgdHJ1ZSwgcmVhc29uKTsKIAlyZXR1cm4gMDsKIH0KIAotCi1pbnQgaWVlZTgwMjExX3N0YV9kaXNhc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlYXNvbikKK2ludCBpZWVlODAyMTFfc3RhX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgdTE2IHJlYXNvbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhID0gJnNkYXRhLT51LnN0YTsKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogZGlzYXNzb2NpYXRpbmcgYnkgbG9jYWwgY2hvaWNlIChyZWFzb249JWQpXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHJlYXNvbik7CisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHJlYXNvbik7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCEoaWZzdGEtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9BU1NPQ0lBVEVEKSkKIAkJcmV0dXJuIC0xOwogCi0JaWVlZTgwMjExX3NlbmRfZGlzYXNzb2MoZGV2LCBpZnN0YSwgcmVhc29uKTsKLQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKGRldiwgaWZzdGEsIDApOworCWllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc2RhdGEsIGlmc3RhLCBmYWxzZSwgdHJ1ZSwgcmVhc29uKTsKIAlyZXR1cm4gMDsKIH0KIAorLyogc2NhbiBmaW5pc2hlZCBub3RpZmljYXRpb24gKi8KK3ZvaWQgaWVlZTgwMjExX21sbWVfbm90aWZ5X3NjYW5fY29tcGxldGVkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gbG9jYWwtPnNjYW5fc2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9pZl9zdGEgKmlmc3RhOworCisJaWYgKHNkYXRhICYmIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQlpZnN0YSA9ICZzZGF0YS0+dS5zdGE7CisJCWlmICghKGlmc3RhLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQlNTSURfU0VUKSB8fAorCQkgICAgKCEoaWZzdGEtPnN0YXRlID09IElFRUU4MDIxMV9TVEFfTUxNRV9JQlNTX0pPSU5FRCkgJiYKKwkJICAgICFpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKHNkYXRhKSkpCisJCQlpZWVlODAyMTFfc3RhX2ZpbmRfaWJzcyhzZGF0YSwgaWZzdGEpOworCX0KKworCS8qIFJlc3RhcnQgU1RBIHRpbWVycyAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KQorCQlpZWVlODAyMTFfcmVzdGFydF9zdGFfdGltZXIoc2RhdGEpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKiBkcml2ZXIgbm90aWZpY2F0aW9uIGNhbGwgKi8KIHZvaWQgaWVlZTgwMjExX25vdGlmeV9tYWMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgIGVudW0gaWVlZTgwMjExX25vdGlmaWNhdGlvbl90eXBlcyAgbm90aWZfdHlwZSkKIHsKQEAgLTQ0NjEsMTAgKzI1NzIsMTAgQEAKIAljYXNlIElFRUU4MDIxMV9OT1RJRllfUkVfQVNTT0M6CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewotCQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpCisJCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCQkJY29udGludWU7CiAKLQkJCWllZWU4MDIxMV9zdGFfcmVxX2F1dGgoc2RhdGEtPmRldiwgJnNkYXRhLT51LnN0YSk7CisJCQlpZWVlODAyMTFfc3RhX3JlcV9hdXRoKHNkYXRhLCAmc2RhdGEtPnUuc3RhKTsKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmF0ZS5jIGIvbmV0L21hYzgwMjExL3JhdGUuYwppbmRleCAwMzg4YzA5Li41ZDc4NjcyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmF0ZS5jCisrKyBiL25ldC9tYWM4MDIxMS9yYXRlLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlICJyYXRlLmgiCiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCiAKIHN0cnVjdCByYXRlX2NvbnRyb2xfYWxnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0xMjcsMTkgKzEyOCw0NiBAQAogCW1vZHVsZV9wdXQob3BzLT5tb2R1bGUpOwogfQogCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKK3N0YXRpYyBzc2l6ZV90IHJjbmFtZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGxlbiA9IHN0cmxlbihyZWYtPm9wcy0+bmFtZSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsCisJCQkJICAgICAgIHJlZi0+b3BzLT5uYW1lLCBsZW4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByY25hbWVfb3BzID0geworCS5yZWFkID0gcmNuYW1lX3JlYWQsCisJLm9wZW4gPSBtYWM4MDIxMV9vcGVuX2ZpbGVfZ2VuZXJpYywKK307CisjZW5kaWYKKwogc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJhdGVfY29udHJvbF9hbGxvYyhjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpciA9IE5VTEw7CiAJc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZjsKIAogCXJlZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByYXRlX2NvbnRyb2xfcmVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWYpCiAJCWdvdG8gZmFpbF9yZWY7CiAJa3JlZl9pbml0KCZyZWYtPmtyZWYpOworCXJlZi0+bG9jYWwgPSBsb2NhbDsKIAlyZWYtPm9wcyA9IGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfb3BzX2dldChuYW1lKTsKIAlpZiAoIXJlZi0+b3BzKQogCQlnb3RvIGZhaWxfb3BzOwotCXJlZi0+cHJpdiA9IHJlZi0+b3BzLT5hbGxvYyhsb2NhbCk7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCWRlYnVnZnNkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJjIiwgbG9jYWwtPmh3LndpcGh5LT5kZWJ1Z2ZzZGlyKTsKKwlsb2NhbC0+ZGVidWdmcy5yY2RpciA9IGRlYnVnZnNkaXI7CisJbG9jYWwtPmRlYnVnZnMucmNuYW1lID0gZGVidWdmc19jcmVhdGVfZmlsZSgibmFtZSIsIDA0MDAsIGRlYnVnZnNkaXIsCisJCQkJCQkgICAgcmVmLCAmcmNuYW1lX29wcyk7CisjZW5kaWYKKworCXJlZi0+cHJpdiA9IHJlZi0+b3BzLT5hbGxvYygmbG9jYWwtPmh3LCBkZWJ1Z2ZzZGlyKTsKIAlpZiAoIXJlZi0+cHJpdikKIAkJZ290byBmYWlsX3ByaXY7CiAJcmV0dXJuIHJlZjsKQEAgLTE1OCwyOSArMTg2LDQ2IEBACiAKIAljdHJsX3JlZiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmF0ZV9jb250cm9sX3JlZiwga3JlZik7CiAJY3RybF9yZWYtPm9wcy0+ZnJlZShjdHJsX3JlZi0+cHJpdik7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCWRlYnVnZnNfcmVtb3ZlKGN0cmxfcmVmLT5sb2NhbC0+ZGVidWdmcy5yY25hbWUpOworCWN0cmxfcmVmLT5sb2NhbC0+ZGVidWdmcy5yY25hbWUgPSBOVUxMOworCWRlYnVnZnNfcmVtb3ZlKGN0cmxfcmVmLT5sb2NhbC0+ZGVidWdmcy5yY2Rpcik7CisJY3RybF9yZWYtPmxvY2FsLT5kZWJ1Z2ZzLnJjZGlyID0gTlVMTDsKKyNlbmRpZgorCiAJaWVlZTgwMjExX3JhdGVfY29udHJvbF9vcHNfcHV0KGN0cmxfcmVmLT5vcHMpOwogCWtmcmVlKGN0cmxfcmVmKTsKIH0KIAotdm9pZCByYXRlX2NvbnRyb2xfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3ZvaWQgcmF0ZV9jb250cm9sX2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IHN0YV9pbmZvICpzdGEsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICBzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24gKnNlbCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBsb2NhbC0+cmF0ZV9jdHJsOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBzZGF0YS0+bG9jYWwtPnJhdGVfY3RybDsKKwl2b2lkICpwcml2X3N0YSA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKmlzdGEgPSBOVUxMOwogCWludCBpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgaGRyLT5hZGRyMSk7Ci0KIAlzZWwtPnJhdGVfaWR4ID0gLTE7CiAJc2VsLT5ub25lcnBfaWR4ID0gLTE7CiAJc2VsLT5wcm9iZV9pZHggPSAtMTsKKwlzZWwtPm1heF9yYXRlX2lkeCA9IHNkYXRhLT5tYXhfcmF0ZWN0cmxfcmF0ZWlkeDsKIAotCXJlZi0+b3BzLT5nZXRfcmF0ZShyZWYtPnByaXYsIGRldiwgc2JhbmQsIHNrYiwgc2VsKTsKKwlpZiAoc3RhKSB7CisJCWlzdGEgPSAmc3RhLT5zdGE7CisJCXByaXZfc3RhID0gc3RhLT5yYXRlX2N0cmxfcHJpdjsKKwl9CisKKwlpZiAoc3RhICYmIHNkYXRhLT5mb3JjZV91bmljYXN0X3JhdGVpZHggPiAtMSkKKwkJc2VsLT5yYXRlX2lkeCA9IHNkYXRhLT5mb3JjZV91bmljYXN0X3JhdGVpZHg7CisJZWxzZQorCQlyZWYtPm9wcy0+Z2V0X3JhdGUocmVmLT5wcml2LCBzYmFuZCwgaXN0YSwgcHJpdl9zdGEsIHNrYiwgc2VsKTsKKworCWlmIChzZGF0YS0+bWF4X3JhdGVjdHJsX3JhdGVpZHggPiAtMSAmJgorCSAgICBzZWwtPnJhdGVfaWR4ID4gc2RhdGEtPm1heF9yYXRlY3RybF9yYXRlaWR4KQorCQlzZWwtPnJhdGVfaWR4ID0gc2RhdGEtPm1heF9yYXRlY3RybF9yYXRlaWR4OwogCiAJQlVHX09OKHNlbC0+cmF0ZV9pZHggPCAwKTsKIApAQCAtMTkxLDEzICsyMzYsMTEgQEAKIAkJCWlmIChzYmFuZC0+Yml0cmF0ZXNbc2VsLT5yYXRlX2lkeF0uYml0cmF0ZSA8IHJhdGUtPmJpdHJhdGUpCiAJCQkJYnJlYWs7CiAKLQkJCWlmIChyYXRlX3N1cHBvcnRlZChzdGEsIHNiYW5kLT5iYW5kLCBpKSAmJgorCQkJaWYgKHJhdGVfc3VwcG9ydGVkKGlzdGEsIHNiYW5kLT5iYW5kLCBpKSAmJgogCQkJICAgICEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9FUlBfRykpCiAJCQkJc2VsLT5ub25lcnBfaWR4ID0gaTsKIAkJfQogCX0KLQotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdHJ1Y3QgcmF0ZV9jb250cm9sX3JlZiAqcmF0ZV9jb250cm9sX2dldChzdHJ1Y3QgcmF0ZV9jb250cm9sX3JlZiAqcmVmKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JhdGUuaCBiL25ldC9tYWM4MDIxMS9yYXRlLmgKaW5kZXggZWRlN2FiNS4uZDAwOTJmOCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JhdGUuaAorKysgYi9uZXQvbWFjODAyMTEvcmF0ZS5oCkBAIC0xOSw3NyArMTksNDggQEAKICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgInN0YV9pbmZvLmgiCiAKLS8qKgotICogc3RydWN0IHJhdGVfc2VsZWN0aW9uIC0gcmF0ZSBzZWxlY3Rpb24gZm9yIHJhdGUgY29udHJvbCBhbGdvcwotICogQHJhdGU6IHNlbGVjdGVkIHRyYW5zbWlzc2lvbiByYXRlIGluZGV4Ci0gKiBAbm9uZXJwOiBOb24tRVJQIHJhdGUgdG8gdXNlIGluc3RlYWQgaWYgRVJQIGNhbm5vdCBiZSB1c2VkCi0gKiBAcHJvYmU6IHJhdGUgZm9yIHByb2JpbmcgKG9yIC0xKQotICoKLSAqLwotc3RydWN0IHJhdGVfc2VsZWN0aW9uIHsKLQlzOCByYXRlX2lkeCwgbm9uZXJwX2lkeCwgcHJvYmVfaWR4OwotfTsKLQotc3RydWN0IHJhdGVfY29udHJvbF9vcHMgewotCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKLQljb25zdCBjaGFyICpuYW1lOwotCXZvaWQgKCp0eF9zdGF0dXMpKHZvaWQgKnByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBza19idWZmICpza2IpOwotCXZvaWQgKCpnZXRfcmF0ZSkodm9pZCAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kLAotCQkJIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgc3RydWN0IHJhdGVfc2VsZWN0aW9uICpzZWwpOwotCXZvaWQgKCpyYXRlX2luaXQpKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IHN0YV9pbmZvICpzdGEpOwotCXZvaWQgKCpjbGVhcikodm9pZCAqcHJpdik7Ci0KLQl2b2lkICooKmFsbG9jKShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7Ci0Jdm9pZCAoKmZyZWUpKHZvaWQgKnByaXYpOwotCXZvaWQgKigqYWxsb2Nfc3RhKSh2b2lkICpwcml2LCBnZnBfdCBnZnApOwotCXZvaWQgKCpmcmVlX3N0YSkodm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpOwotCi0JaW50ICgqYWRkX2F0dHJzKSh2b2lkICpwcml2LCBzdHJ1Y3Qga29iamVjdCAqa29iaik7Ci0Jdm9pZCAoKnJlbW92ZV9hdHRycykodm9pZCAqcHJpdiwgc3RydWN0IGtvYmplY3QgKmtvYmopOwotCXZvaWQgKCphZGRfc3RhX2RlYnVnZnMpKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJCXN0cnVjdCBkZW50cnkgKmRpcik7Ci0Jdm9pZCAoKnJlbW92ZV9zdGFfZGVidWdmcykodm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpOwotfTsKLQogc3RydWN0IHJhdGVfY29udHJvbF9yZWYgeworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCByYXRlX2NvbnRyb2xfb3BzICpvcHM7CiAJdm9pZCAqcHJpdjsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogfTsKIAotaW50IGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IHJhdGVfY29udHJvbF9vcHMgKm9wcyk7Ci12b2lkIGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcihzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyAqb3BzKTsKLQogLyogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLiBJZiBgbmFtZScgaXMgTlVMTCwgZ2V0IHRoZQogICogZmlyc3QgYXZhaWxhYmxlIGFsZ29yaXRobS4gKi8KIHN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyYXRlX2NvbnRyb2xfYWxsb2MoY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKLXZvaWQgcmF0ZV9jb250cm9sX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCit2b2lkIHJhdGVfY29udHJvbF9nZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IHJhdGVfc2VsZWN0aW9uICpzZWwpOwogc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJhdGVfY29udHJvbF9nZXQoc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZik7CiB2b2lkIHJhdGVfY29udHJvbF9wdXQoc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2NvbnRyb2xfdHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW5saW5lIHZvaWQgcmF0ZV9jb250cm9sX3R4X3N0YXR1cyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CiAJc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZiA9IGxvY2FsLT5yYXRlX2N0cmw7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKmlzdGEgPSAmc3RhLT5zdGE7CisJdm9pZCAqcHJpdl9zdGEgPSBzdGEtPnJhdGVfY3RybF9wcml2OwogCi0JcmVmLT5vcHMtPnR4X3N0YXR1cyhyZWYtPnByaXYsIGRldiwgc2tiKTsKKwlyZWYtPm9wcy0+dHhfc3RhdHVzKHJlZi0+cHJpdiwgc2JhbmQsIGlzdGEsIHByaXZfc3RhLCBza2IpOwogfQogCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0cnVjdCBzdGFfaW5mbyAqc3RhLAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQorc3RhdGljIGlubGluZSB2b2lkIHJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPnNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgcmF0ZV9jb250cm9sX3JlZiAqcmVmID0gc3RhLT5yYXRlX2N0cmw7Ci0JcmVmLT5vcHMtPnJhdGVfaW5pdChyZWYtPnByaXYsIHN0YS0+cmF0ZV9jdHJsX3ByaXYsIGxvY2FsLCBzdGEpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICppc3RhID0gJnN0YS0+c3RhOworCXZvaWQgKnByaXZfc3RhID0gc3RhLT5yYXRlX2N0cmxfcHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKKworCXJlZi0+b3BzLT5yYXRlX2luaXQocmVmLT5wcml2LCBzYmFuZCwgaXN0YSwgcHJpdl9zdGEpOwogfQogCiAKQEAgLTEwMCwxNSArNzEsMTkgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpyYXRlX2NvbnRyb2xfYWxsb2Nfc3RhKHN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkJCSAgIGdmcF90IGdmcCkKIHsKLQlyZXR1cm4gcmVmLT5vcHMtPmFsbG9jX3N0YShyZWYtPnByaXYsIGdmcCk7CisJcmV0dXJuIHJlZi0+b3BzLT5hbGxvY19zdGEocmVmLT5wcml2LCBzdGEsIGdmcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2NvbnRyb2xfZnJlZV9zdGEoc3RydWN0IHJhdGVfY29udHJvbF9yZWYgKnJlZiwKLQkJCQkJIHZvaWQgKnByaXYpCitzdGF0aWMgaW5saW5lIHZvaWQgcmF0ZV9jb250cm9sX2ZyZWVfc3RhKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewotCXJlZi0+b3BzLT5mcmVlX3N0YShyZWYtPnByaXYsIHByaXYpOworCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBzdGEtPnJhdGVfY3RybDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqaXN0YSA9ICZzdGEtPnN0YTsKKwl2b2lkICpwcml2X3N0YSA9IHN0YS0+cmF0ZV9jdHJsX3ByaXY7CisKKwlyZWYtPm9wcy0+ZnJlZV9zdGEocmVmLT5wcml2LCBpc3RhLCBwcml2X3N0YSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYXRlX2NvbnRyb2xfYWRkX3N0YV9kZWJ1Z2ZzKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpAQCAtMTMwLDMxICsxMDUsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJhdGVfc3VwcG9ydGVkKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAotCQkJCSBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJIGludCBpbmRleCkKLXsKLQlyZXR1cm4gKHN0YSA9PSBOVUxMIHx8IHN0YS0+c3VwcF9yYXRlc1tiYW5kXSAmIEJJVChpbmRleCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHM4Ci1yYXRlX2xvd2VzdF9pbmRleChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9iaXRyYXRlczsgaSsrKQotCQlpZiAocmF0ZV9zdXBwb3J0ZWQoc3RhLCBzYmFuZC0+YmFuZCwgaSkpCi0JCQlyZXR1cm4gaTsKLQotCS8qIHdhcm4gd2hlbiB3ZSBjYW5ub3QgZmluZCBhIHJhdGUuICovCi0JV0FSTl9PTigxKTsKLQotCXJldHVybiAwOwotfQotCi0KIC8qIGZ1bmN0aW9ucyBmb3IgcmF0ZSBjb250cm9sIHJlbGF0ZWQgdG8gYSBkZXZpY2UgKi8KIGludCBpZWVlODAyMTFfaW5pdF9yYXRlX2N0cmxfYWxnKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCSBjb25zdCBjaGFyICpuYW1lKTsKQEAgLTE3NSw0ICsxMjUsMTggQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMCitleHRlcm4gaW50IHJjODAyMTFfbWluc3RyZWxfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJjODAyMTFfbWluc3RyZWxfZXhpdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCByYzgwMjExX21pbnN0cmVsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCByYzgwMjExX21pbnN0cmVsX2V4aXQodm9pZCkKK3sKK30KKyNlbmRpZgorCisKICNlbmRpZiAvKiBJRUVFODAyMTFfUkFURV9IICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ2OWRhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwpAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBCYXNlZCBvbiBtaW5zdHJlbC5jOgorICogICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBEZXJlayBTbWl0aGllcyA8ZGVyZWtAaW5kcmFuZXQuY28ubno+CisgKiAgIFNwb25zb3JlZCBieSBJbmRyYW5ldCBUZWNobm9sb2dpZXMgTHRkCisgKgorICogQmFzZWQgb24gc2FtcGxlLmM6CisgKiAgIENvcHlyaWdodCAoYykgMjAwNSBKb2huIEJpY2tldAorICogICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogICBhcmUgbWV0OgorICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgiRGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgICAgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkKKyAqICAgICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqICAgMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgIE5PIFdBUlJBTlRZCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hBTlRJQklMSVRZCisgKiAgIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqICAgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiAgIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgInJhdGUuaCIKKyNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsLmgiCisKKyNkZWZpbmUgU0FNUExFX0NPTFVNTlMJMTAKKyNkZWZpbmUgU0FNUExFX1RCTChfbWksIF9pZHgsIF9jb2wpIFwKKwkJX21pLT5zYW1wbGVfdGFibGVbKF9pZHggKiBTQU1QTEVfQ09MVU1OUykgKyBfY29sXQorCisvKiBjb252ZXJ0IG1hYzgwMjExIHJhdGUgaW5kZXggdG8gbG9jYWwgYXJyYXkgaW5kZXggKi8KK3N0YXRpYyBpbmxpbmUgaW50CityaXhfdG9fbmR4KHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWksIGludCByaXgpCit7CisJaW50IGkgPSByaXg7CisJZm9yIChpID0gcml4OyBpID49IDA7IGktLSkKKwkJaWYgKG1pLT5yW2ldLnJpeCA9PSByaXgpCisJCQlicmVhazsKKwlXQVJOX09OKG1pLT5yW2ldLnJpeCAhPSByaXgpOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3VzZV9sb3dfcmF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwl1MTYgZmM7CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisKKwlyZXR1cm4gKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSB8fAorCQkoZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgIT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfHwKKwkJaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpOworfQorCisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF91cGRhdGVfc3RhdHMoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pKQoreworCXUzMiBtYXhfdHAgPSAwLCBpbmRleF9tYXhfdHAgPSAwLCBpbmRleF9tYXhfdHAyID0gMDsKKwl1MzIgbWF4X3Byb2IgPSAwLCBpbmRleF9tYXhfcHJvYiA9IDA7CisJdTMyIHVzZWNzOworCXUzMiBwOworCWludCBpOworCisJbWktPnN0YXRzX3VwZGF0ZSA9IGppZmZpZXM7CisJZm9yIChpID0gMDsgaSA8IG1pLT5uX3JhdGVzOyBpKyspIHsKKwkJc3RydWN0IG1pbnN0cmVsX3JhdGUgKm1yID0gJm1pLT5yW2ldOworCisJCXVzZWNzID0gbXItPnBlcmZlY3RfdHhfdGltZTsKKwkJaWYgKCF1c2VjcykKKwkJCXVzZWNzID0gMTAwMDAwMDsKKworCQkvKiBUbyBhdm9pZCByb3VuZGluZyBpc3N1ZXMsIHByb2JhYmlsaXRpZXMgc2NhbGUgZnJvbSAwICgwJSkKKwkJICogdG8gMTgwMDAgKDEwMCUpICovCisJCWlmIChtci0+YXR0ZW1wdHMpIHsKKwkJCXAgPSAobXItPnN1Y2Nlc3MgKiAxODAwMCkgLyBtci0+YXR0ZW1wdHM7CisJCQltci0+c3VjY19oaXN0ICs9IG1yLT5zdWNjZXNzOworCQkJbXItPmF0dF9oaXN0ICs9IG1yLT5hdHRlbXB0czsKKwkJCW1yLT5jdXJfcHJvYiA9IHA7CisJCQlwID0gKChwICogKDEwMCAtIG1wLT5ld21hX2xldmVsKSkgKyAobXItPnByb2JhYmlsaXR5ICoKKwkJCQltcC0+ZXdtYV9sZXZlbCkpIC8gMTAwOworCQkJbXItPnByb2JhYmlsaXR5ID0gcDsKKwkJCW1yLT5jdXJfdHAgPSBwICogKDEwMDAwMDAgLyB1c2Vjcyk7CisJCX0KKworCQltci0+bGFzdF9zdWNjZXNzID0gbXItPnN1Y2Nlc3M7CisJCW1yLT5sYXN0X2F0dGVtcHRzID0gbXItPmF0dGVtcHRzOworCQltci0+c3VjY2VzcyA9IDA7CisJCW1yLT5hdHRlbXB0cyA9IDA7CisKKwkJLyogU2FtcGxlIGxlc3Mgb2Z0ZW4gYmVsb3cgdGhlIDEwJSBjaGFuY2Ugb2Ygc3VjY2Vzcy4KKwkJICogU2FtcGxlIGxlc3Mgb2Z0ZW4gYWJvdmUgdGhlIDk1JSBjaGFuY2Ugb2Ygc3VjY2Vzcy4gKi8KKwkJaWYgKChtci0+cHJvYmFiaWxpdHkgPiAxNzEwMCkgfHwgKG1yLT5wcm9iYWJpbGl0eSA8IDE4MDApKSB7CisJCQltci0+YWRqdXN0ZWRfcmV0cnlfY291bnQgPSBtci0+cmV0cnlfY291bnQgPj4gMTsKKwkJCWlmIChtci0+YWRqdXN0ZWRfcmV0cnlfY291bnQgPiAyKQorCQkJCW1yLT5hZGp1c3RlZF9yZXRyeV9jb3VudCA9IDI7CisJCX0gZWxzZSB7CisJCQltci0+YWRqdXN0ZWRfcmV0cnlfY291bnQgPSBtci0+cmV0cnlfY291bnQ7CisJCX0KKwkJaWYgKCFtci0+YWRqdXN0ZWRfcmV0cnlfY291bnQpCisJCQltci0+YWRqdXN0ZWRfcmV0cnlfY291bnQgPSAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtaS0+bl9yYXRlczsgaSsrKSB7CisJCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptciA9ICZtaS0+cltpXTsKKwkJaWYgKG1heF90cCA8IG1yLT5jdXJfdHApIHsKKwkJCWluZGV4X21heF90cCA9IGk7CisJCQltYXhfdHAgPSBtci0+Y3VyX3RwOworCQl9CisJCWlmIChtYXhfcHJvYiA8IG1yLT5wcm9iYWJpbGl0eSkgeworCQkJaW5kZXhfbWF4X3Byb2IgPSBpOworCQkJbWF4X3Byb2IgPSBtci0+cHJvYmFiaWxpdHk7CisJCX0KKwl9CisKKwltYXhfdHAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBtaS0+bl9yYXRlczsgaSsrKSB7CisJCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptciA9ICZtaS0+cltpXTsKKworCQlpZiAoaSA9PSBpbmRleF9tYXhfdHApCisJCQljb250aW51ZTsKKworCQlpZiAobWF4X3RwIDwgbXItPmN1cl90cCkgeworCQkJaW5kZXhfbWF4X3RwMiA9IGk7CisJCQltYXhfdHAgPSBtci0+Y3VyX3RwOworCQl9CisJfQorCW1pLT5tYXhfdHBfcmF0ZSA9IGluZGV4X21heF90cDsKKwltaS0+bWF4X3RwX3JhdGUyID0gaW5kZXhfbWF4X3RwMjsKKwltaS0+bWF4X3Byb2JfcmF0ZSA9IGluZGV4X21heF9wcm9iOworfQorCitzdGF0aWMgdm9pZAorbWluc3RyZWxfdHhfc3RhdHVzKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhLAorCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBwcml2X3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV90eF9hbHRyYXRlICphciA9IGluZm8tPnN0YXR1cy5yZXRyaWVzOworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCA9IHByaXY7CisJaW50IGksIG5keCwgdHJpZXM7CisJaW50IHN1Y2Nlc3MgPSAwOworCisJaWYgKCFpbmZvLT5zdGF0dXMuZXhjZXNzaXZlX3JldHJpZXMpCisJCXN1Y2Nlc3MgPSAxOworCisJaWYgKCFtcC0+aGFzX21yciB8fCAoYXJbMF0ucmF0ZV9pZHggPCAwKSkgeworCQluZHggPSByaXhfdG9fbmR4KG1pLCBpbmZvLT50eF9yYXRlX2lkeCk7CisJCXRyaWVzID0gaW5mby0+c3RhdHVzLnJldHJ5X2NvdW50ICsgMTsKKwkJbWktPnJbbmR4XS5zdWNjZXNzICs9IHN1Y2Nlc3M7CisJCW1pLT5yW25keF0uYXR0ZW1wdHMgKz0gdHJpZXM7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChhcltpXS5yYXRlX2lkeCA8IDApCisJCQlicmVhazsKKworCQluZHggPSByaXhfdG9fbmR4KG1pLCBhcltpXS5yYXRlX2lkeCk7CisJCW1pLT5yW25keF0uYXR0ZW1wdHMgKz0gYXJbaV0ubGltaXQgKyAxOworCisJCWlmICgoaSAhPSAzKSAmJiAoYXJbaSArIDFdLnJhdGVfaWR4IDwgMCkpCisJCQltaS0+cltuZHhdLnN1Y2Nlc3MgKz0gc3VjY2VzczsKKwl9CisKKwlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9SQVRFX0NUUkxfUFJPQkUpICYmIChpID49IDApKQorCQltaS0+c2FtcGxlX2NvdW50Kys7CisKKwlpZiAobWktPnNhbXBsZV9kZWZlcnJlZCA+IDApCisJCW1pLT5zYW1wbGVfZGVmZXJyZWQtLTsKK30KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorbWluc3RyZWxfZ2V0X3JldHJ5X2NvdW50KHN0cnVjdCBtaW5zdHJlbF9yYXRlICptciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IHJldHJ5ID0gbXItPmFkanVzdGVkX3JldHJ5X2NvdW50OworCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfUlRTX0NUUykKKwkJcmV0cnkgPSBtYXgoMlUsIG1pbihtci0+cmV0cnlfY291bnRfcnRzY3RzLCByZXRyeSkpOworCWVsc2UgaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpCisJCXJldHJ5ID0gbWF4KDJVLCBtaW4obXItPnJldHJ5X2NvdW50X2N0cywgcmV0cnkpKTsKKwlyZXR1cm4gcmV0cnk7Cit9CisKKworc3RhdGljIGludAorbWluc3RyZWxfZ2V0X25leHRfc2FtcGxlKHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkpCit7CisJdW5zaWduZWQgaW50IHNhbXBsZV9uZHg7CisJc2FtcGxlX25keCA9IFNBTVBMRV9UQkwobWksIG1pLT5zYW1wbGVfaWR4LCBtaS0+c2FtcGxlX2NvbHVtbik7CisJbWktPnNhbXBsZV9pZHgrKzsKKwlpZiAobWktPnNhbXBsZV9pZHggPiAobWktPm5fcmF0ZXMgLSAyKSkgeworCQltaS0+c2FtcGxlX2lkeCA9IDA7CisJCW1pLT5zYW1wbGVfY29sdW1uKys7CisJCWlmIChtaS0+c2FtcGxlX2NvbHVtbiA+PSBTQU1QTEVfQ09MVU1OUykKKwkJCW1pLT5zYW1wbGVfY29sdW1uID0gMDsKKwl9CisJcmV0dXJuIHNhbXBsZV9uZHg7Cit9CisKK3ZvaWQKK21pbnN0cmVsX2dldF9yYXRlKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmF0ZV9zZWxlY3Rpb24gKnNlbCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IHByaXZfc3RhOworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCA9IHByaXY7CisJc3RydWN0IGllZWU4MDIxMV90eF9hbHRyYXRlICphciA9IGluZm8tPmNvbnRyb2wucmV0cmllczsKKwl1bnNpZ25lZCBpbnQgbmR4LCBzYW1wbGVfbmR4ID0gMDsKKwlib29sIG1ycjsKKwlib29sIHNhbXBsZV9zbG93ZXIgPSBmYWxzZTsKKwlib29sIHNhbXBsZSA9IGZhbHNlOworCWludCBpLCBkZWx0YTsKKwlpbnQgbXJyX25keFszXTsKKwlpbnQgc2FtcGxlX3JhdGU7CisKKwlpZiAoIXN0YSB8fCAhbWkgfHwgdXNlX2xvd19yYXRlKHNrYikpIHsKKwkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOworCQlyZXR1cm47CisJfQorCisJbXJyID0gbXAtPmhhc19tcnI7CisKKwkvKiBtYWM4MDIxMSBkb2VzIG5vdCBhbGxvdyBtcnIgZm9yIFJUUy9DVFMgKi8KKwlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfUlRTX0NUUykgfHwKKwkgICAgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9VU0VfQ1RTX1BST1RFQ1QpKQorCQltcnIgPSBmYWxzZTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1pLT5zdGF0c191cGRhdGUgKyAobXAtPnVwZGF0ZV9pbnRlcnZhbCAqCisJCQlIWikgLyAxMDAwKSkKKwkJbWluc3RyZWxfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CisKKwluZHggPSBtaS0+bWF4X3RwX3JhdGU7CisKKwlpZiAobXJyKQorCQlzYW1wbGVfcmF0ZSA9IG1wLT5sb29rYXJvdW5kX3JhdGVfbXJyOworCWVsc2UKKwkJc2FtcGxlX3JhdGUgPSBtcC0+bG9va2Fyb3VuZF9yYXRlOworCisJbWktPnBhY2tldF9jb3VudCsrOworCWRlbHRhID0gKG1pLT5wYWNrZXRfY291bnQgKiBzYW1wbGVfcmF0ZSAvIDEwMCkgLQorCQkJKG1pLT5zYW1wbGVfY291bnQgKyBtaS0+c2FtcGxlX2RlZmVycmVkIC8gMik7CisKKwkvKiBkZWx0YSA+IDA6IHNhbXBsaW5nIHJlcXVpcmVkICovCisJaWYgKGRlbHRhID4gMCkgeworCQlpZiAobWktPnBhY2tldF9jb3VudCA+PSAxMDAwMCkgeworCQkJbWktPnNhbXBsZV9kZWZlcnJlZCA9IDA7CisJCQltaS0+c2FtcGxlX2NvdW50ID0gMDsKKwkJCW1pLT5wYWNrZXRfY291bnQgPSAwOworCQl9IGVsc2UgaWYgKGRlbHRhID4gbWktPm5fcmF0ZXMgKiAyKSB7CisJCQkvKiBXaXRoIG11bHRpLXJhdGUgcmV0cnksIG5vdCBldmVyeSBwbGFubmVkIHNhbXBsZQorCQkJICogYXR0ZW1wdCBhY3R1YWxseSBnZXRzIHVzZWQsIGR1ZSB0byB0aGUgd2F5IHRoZSByZXRyeQorCQkJICogY2hhaW4gaXMgc2V0IHVwIC0gW21heF90cCxzYW1wbGUscHJvYixsb3dlc3RdIGZvcgorCQkJICogc2FtcGxlX3JhdGUgPCBtYXhfdHAuCisJCQkgKgorCQkJICogSWYgdGhlcmUncyB0b28gbXVjaCBzYW1wbGluZyBiYWNrbG9nIGFuZCB0aGUgbGluaworCQkJICogc3RhcnRzIGdldHRpbmcgd29yc2UsIG1pbnN0cmVsIHdvdWxkIHN0YXJ0IGJ1cnN0aW5nCisJCQkgKiBvdXQgbG90cyBvZiBzYW1wbGluZyBmcmFtZXMsIHdoaWNoIHdvdWxkIHJlc3VsdAorCQkJICogaW4gYSBsYXJnZSB0aHJvdWdocHV0IGxvc3MuICovCisJCQltaS0+c2FtcGxlX2NvdW50ICs9IChkZWx0YSAtIG1pLT5uX3JhdGVzICogMik7CisJCX0KKworCQlzYW1wbGVfbmR4ID0gbWluc3RyZWxfZ2V0X25leHRfc2FtcGxlKG1pKTsKKwkJc2FtcGxlID0gdHJ1ZTsKKwkJc2FtcGxlX3Nsb3dlciA9IG1yciAmJiAobWktPnJbc2FtcGxlX25keF0ucGVyZmVjdF90eF90aW1lID4KKwkJCW1pLT5yW25keF0ucGVyZmVjdF90eF90aW1lKTsKKworCQlpZiAoIXNhbXBsZV9zbG93ZXIpIHsKKwkJCW5keCA9IHNhbXBsZV9uZHg7CisJCQltaS0+c2FtcGxlX2NvdW50Kys7CisJCX0gZWxzZSB7CisJCQkvKiBPbmx5IHVzZSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSB0byBtYXJrCisJCQkgKiBwYWNrZXRzIHRoYXQgaGF2ZSB0aGUgc2FtcGxpbmcgcmF0ZSBkZWZlcnJlZCB0byB0aGUKKwkJCSAqIHNlY29uZCBNUlIgc3RhZ2UuIEluY3JlYXNlIHRoZSBzYW1wbGUgY291bnRlciBvbmx5CisJCQkgKiBpZiB0aGUgZGVmZXJyZWQgc2FtcGxlIHJhdGUgd2FzIGFjdHVhbGx5IHVzZWQuCisJCQkgKiBVc2UgdGhlIHNhbXBsZV9kZWZlcnJlZCBjb3VudGVyIHRvIG1ha2Ugc3VyZSB0aGF0CisJCQkgKiB0aGUgc2FtcGxpbmcgaXMgbm90IGRvbmUgaW4gbGFyZ2UgYnVyc3RzICovCisJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKKwkJCW1pLT5zYW1wbGVfZGVmZXJyZWQrKzsKKwkJfQorCX0KKwlzZWwtPnJhdGVfaWR4ID0gbWktPnJbbmR4XS5yaXg7CisJaW5mby0+Y29udHJvbC5yZXRyeV9saW1pdCA9IG1pbnN0cmVsX2dldF9yZXRyeV9jb3VudCgmbWktPnJbbmR4XSwgaW5mbyk7CisKKwlpZiAoIW1ycikgeworCQlhclswXS5yYXRlX2lkeCA9IG1pLT5sb3dlc3Rfcml4OworCQlhclswXS5saW1pdCA9IG1wLT5tYXhfcmV0cnk7CisJCWFyWzFdLnJhdGVfaWR4ID0gLTE7CisJCXJldHVybjsKKwl9CisKKwkvKiBNUlIgc2V0dXAgKi8KKwlpZiAoc2FtcGxlKSB7CisJCWlmIChzYW1wbGVfc2xvd2VyKQorCQkJbXJyX25keFswXSA9IHNhbXBsZV9uZHg7CisJCWVsc2UKKwkJCW1ycl9uZHhbMF0gPSBtaS0+bWF4X3RwX3JhdGU7CisJfSBlbHNlIHsKKwkJbXJyX25keFswXSA9IG1pLT5tYXhfdHBfcmF0ZTI7CisJfQorCW1ycl9uZHhbMV0gPSBtaS0+bWF4X3Byb2JfcmF0ZTsKKwltcnJfbmR4WzJdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWFyW2ldLnJhdGVfaWR4ID0gbWktPnJbbXJyX25keFtpXV0ucml4OworCQlhcltpXS5saW1pdCA9IG1pLT5yW21ycl9uZHhbaV1dLmFkanVzdGVkX3JldHJ5X2NvdW50OworCX0KK30KKworCitzdGF0aWMgdm9pZAorY2FsY19yYXRlX2R1cmF0aW9ucyhzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pLCBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1pbnN0cmVsX3JhdGUgKmQsIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZSkKK3sKKwlpbnQgZXJwID0gISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9FUlBfRyk7CisKKwlkLT5wZXJmZWN0X3R4X3RpbWUgPSBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24obG9jYWwsIDEyMDAsCisJCQlyYXRlLT5iaXRyYXRlLCBlcnAsIDEpOworCWQtPmFja190aW1lID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwKKwkJCXJhdGUtPmJpdHJhdGUsIGVycCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3NhbXBsZV90YWJsZShzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pKQoreworCXVuc2lnbmVkIGludCBpLCBjb2wsIG5ld19pZHg7CisJdW5zaWduZWQgaW50IG5fc3JhdGVzID0gbWktPm5fcmF0ZXMgLSAxOworCXU4IHJuZFs4XTsKKworCW1pLT5zYW1wbGVfY29sdW1uID0gMDsKKwltaS0+c2FtcGxlX2lkeCA9IDA7CisJbWVtc2V0KG1pLT5zYW1wbGVfdGFibGUsIDAsIFNBTVBMRV9DT0xVTU5TICogbWktPm5fcmF0ZXMpOworCisJZm9yIChjb2wgPSAwOyBjb2wgPCBTQU1QTEVfQ09MVU1OUzsgY29sKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5fc3JhdGVzOyBpKyspIHsKKwkJCWdldF9yYW5kb21fYnl0ZXMocm5kLCBzaXplb2Yocm5kKSk7CisJCQluZXdfaWR4ID0gKGkgKyBybmRbaSAmIDddKSAlIG5fc3JhdGVzOworCisJCQl3aGlsZSAoU0FNUExFX1RCTChtaSwgbmV3X2lkeCwgY29sKSAhPSAwKQorCQkJCW5ld19pZHggPSAobmV3X2lkeCArIDEpICUgbl9zcmF0ZXM7CisKKwkJCS8qIERvbid0IHNhbXBsZSB0aGUgc2xvd2VzdCByYXRlIChpLmUuIHNsb3dlc3QgYmFzZQorCQkJICogcmF0ZSkuIFdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZSBzbG93ZXN0IHJhdGUgd29ya3MKKwkJCSAqIGZpbmUsIG9yIGVsc2Ugb3RoZXIgbWFuYWdlbWVudCBmcmFtZXMgd2lsbCBhbHNvIGJlCisJCQkgKiBmYWlsaW5nIGFuZCB0aGUgbGluayB3aWxsIGJyZWFrICovCisJCQlTQU1QTEVfVEJMKG1pLCBuZXdfaWR4LCBjb2wpID0gaSArIDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCittaW5zdHJlbF9yYXRlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKK3sKKwlzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pID0gcHJpdl9zdGE7CisJc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wID0gcHJpdjsKKwlzdHJ1Y3QgbWluc3RyZWxfcmF0ZSAqbXJfY3RsOworCXVuc2lnbmVkIGludCBpLCBuID0gMDsKKwl1bnNpZ25lZCBpbnQgdF9zbG90ID0gOTsgLyogRklYTUU6IGdldCByZWFsIHNsb3QgdGltZSAqLworCisJbWktPmxvd2VzdF9yaXggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKKwltcl9jdGwgPSAmbWktPnJbcml4X3RvX25keChtaSwgbWktPmxvd2VzdF9yaXgpXTsKKwltaS0+c3BfYWNrX2R1ciA9IG1yX2N0bC0+YWNrX3RpbWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgeworCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZSAqbXIgPSAmbWktPnJbbl07CisJCXVuc2lnbmVkIGludCB0eF90aW1lID0gMCwgdHhfdGltZV9jdHMgPSAwLCB0eF90aW1lX3J0c2N0cyA9IDA7CisJCXVuc2lnbmVkIGludCB0eF90aW1lX3NpbmdsZTsKKwkJdW5zaWduZWQgaW50IGN3ID0gbXAtPmN3X21pbjsKKworCQlpZiAoIXJhdGVfc3VwcG9ydGVkKHN0YSwgc2JhbmQtPmJhbmQsIGkpKQorCQkJY29udGludWU7CisJCW4rKzsKKwkJbWVtc2V0KG1yLCAwLCBzaXplb2YoKm1yKSk7CisKKwkJbXItPnJpeCA9IGk7CisJCW1yLT5iaXRyYXRlID0gc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGUgLyA1OworCQljYWxjX3JhdGVfZHVyYXRpb25zKG1pLCBod190b19sb2NhbChtcC0+aHcpLCBtciwKKwkJCQkmc2JhbmQtPmJpdHJhdGVzW2ldKTsKKworCQkvKiBjYWxjdWxhdGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGJlZm9yZQorCQkgKiBmYWxsYmFjayAoYmFzZWQgb24gbWF4aW11bSBzZWdtZW50IHNpemUpICovCisJCW1yLT5yZXRyeV9jb3VudCA9IDE7CisJCW1yLT5yZXRyeV9jb3VudF9jdHMgPSAxOworCQltci0+cmV0cnlfY291bnRfcnRzY3RzID0gMTsKKwkJdHhfdGltZSA9IG1yLT5wZXJmZWN0X3R4X3RpbWUgKyBtaS0+c3BfYWNrX2R1cjsKKwkJZG8geworCQkJLyogYWRkIG9uZSByZXRyYW5zbWlzc2lvbiAqLworCQkJdHhfdGltZV9zaW5nbGUgPSBtci0+YWNrX3RpbWUgKyBtci0+cGVyZmVjdF90eF90aW1lOworCisJCQkvKiBjb250ZW50aW9uIHdpbmRvdyAqLworCQkJdHhfdGltZV9zaW5nbGUgKz0gdF9zbG90ICsgbWluKGN3LCBtcC0+Y3dfbWF4KTsKKwkJCWN3ID0gKGN3ICsgMSkgPDwgMTsKKworCQkJdHhfdGltZSArPSB0eF90aW1lX3NpbmdsZTsKKwkJCXR4X3RpbWVfY3RzICs9IHR4X3RpbWVfc2luZ2xlICsgbWktPnNwX2Fja19kdXI7CisJCQl0eF90aW1lX3J0c2N0cyArPSB0eF90aW1lX3NpbmdsZSArIDIgKiBtaS0+c3BfYWNrX2R1cjsKKwkJCWlmICgodHhfdGltZV9jdHMgPCBtcC0+c2VnbWVudF9zaXplKSAmJgorCQkJCShtci0+cmV0cnlfY291bnRfY3RzIDwgbXAtPm1heF9yZXRyeSkpCisJCQkJbXItPnJldHJ5X2NvdW50X2N0cysrOworCQkJaWYgKCh0eF90aW1lX3J0c2N0cyA8IG1wLT5zZWdtZW50X3NpemUpICYmCisJCQkJKG1yLT5yZXRyeV9jb3VudF9ydHNjdHMgPCBtcC0+bWF4X3JldHJ5KSkKKwkJCQltci0+cmV0cnlfY291bnRfcnRzY3RzKys7CisJCX0gd2hpbGUgKCh0eF90aW1lIDwgbXAtPnNlZ21lbnRfc2l6ZSkgJiYKKwkJCQkoKyttci0+cmV0cnlfY291bnQgPCBtcC0+bWF4X3JldHJ5KSk7CisJCW1yLT5hZGp1c3RlZF9yZXRyeV9jb3VudCA9IG1yLT5yZXRyeV9jb3VudDsKKwl9CisKKwlmb3IgKGkgPSBuOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgeworCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZSAqbXIgPSAmbWktPnJbaV07CisJCW1yLT5yaXggPSAtMTsKKwl9CisKKwltaS0+bl9yYXRlcyA9IG47CisJbWktPnN0YXRzX3VwZGF0ZSA9IGppZmZpZXM7CisKKwlpbml0X3NhbXBsZV90YWJsZShtaSk7Cit9CisKK3N0YXRpYyB2b2lkICoKK21pbnN0cmVsX2FsbG9jX3N0YSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaTsKKwlzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAgPSBwcml2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbXAtPmh3OworCWludCBtYXhfcmF0ZXMgPSAwOworCWludCBpOworCisJbWkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8pLCBnZnApOworCWlmICghbWkpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykgeworCQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbaHctPmNvbmYuY2hhbm5lbC0+YmFuZF07CisJCWlmIChzYmFuZC0+bl9iaXRyYXRlcyA+IG1heF9yYXRlcykKKwkJCW1heF9yYXRlcyA9IHNiYW5kLT5uX2JpdHJhdGVzOworCX0KKworCW1pLT5yID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pbnN0cmVsX3JhdGUpICogbWF4X3JhdGVzLCBnZnApOworCWlmICghbWktPnIpCisJCWdvdG8gZXJyb3I7CisKKwltaS0+c2FtcGxlX3RhYmxlID0ga21hbGxvYyhTQU1QTEVfQ09MVU1OUyAqIG1heF9yYXRlcywgZ2ZwKTsKKwlpZiAoIW1pLT5zYW1wbGVfdGFibGUpCisJCWdvdG8gZXJyb3IxOworCisJbWktPnN0YXRzX3VwZGF0ZSA9IGppZmZpZXM7CisJcmV0dXJuIG1pOworCitlcnJvcjE6CisJa2ZyZWUobWktPnIpOworZXJyb3I6CisJa2ZyZWUobWkpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorbWluc3RyZWxfZnJlZV9zdGEodm9pZCAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEpCit7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IHByaXZfc3RhOworCisJa2ZyZWUobWktPnNhbXBsZV90YWJsZSk7CisJa2ZyZWUobWktPnIpOworCWtmcmVlKG1pKTsKK30KKworc3RhdGljIHZvaWQKK21pbnN0cmVsX2NsZWFyKHZvaWQgKnByaXYpCit7Cit9CisKK3N0YXRpYyB2b2lkICoKK21pbnN0cmVsX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXN0cnVjdCBtaW5zdHJlbF9wcml2ICptcDsKKworCW1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pbnN0cmVsX3ByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW1wKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNvbnRlbnRpb24gd2luZG93IHNldHRpbmdzCisJICogSnVzdCBhbiBhcHByb3hpbWF0aW9uLiBVc2luZyB0aGUgcGVyLXF1ZXVlIHZhbHVlcyB3b3VsZCBjb21wbGljYXRlCisJICogdGhlIGNhbGN1bGF0aW9ucyBhbmQgaXMgcHJvYmFibHkgdW5uZWNlc3NhcnkgKi8KKwltcC0+Y3dfbWluID0gMTU7CisJbXAtPmN3X21heCA9IDEwMjM7CisKKwkvKiBudW1iZXIgb2YgcGFja2V0cyAoaW4gJSkgdG8gdXNlIGZvciBzYW1wbGluZyBvdGhlciByYXRlcworCSAqIHNhbXBsZSBsZXNzIG9mdGVuIGZvciBub24tbXJyIHBhY2tldHMsIGJlY2F1c2UgdGhlIG92ZXJoZWFkCisJICogaXMgbXVjaCBoaWdoZXIgdGhhbiB3aXRoIG1yciAqLworCW1wLT5sb29rYXJvdW5kX3JhdGUgPSA1OworCW1wLT5sb29rYXJvdW5kX3JhdGVfbXJyID0gMTA7CisKKwkvKiBtb3ZpbmcgYXZlcmFnZSB3ZWlnaHQgZm9yIEVXTUEgKi8KKwltcC0+ZXdtYV9sZXZlbCA9IDc1OworCisJLyogbWF4aW11bSB0aW1lIHRoYXQgdGhlIGh3IGlzIGFsbG93ZWQgdG8gc3RheSBpbiBvbmUgTVJSIHNlZ21lbnQgKi8KKwltcC0+c2VnbWVudF9zaXplID0gNjAwMDsKKworCWlmIChody0+bWF4X2FsdHJhdGVfdHJpZXMgPiAwKQorCQltcC0+bWF4X3JldHJ5ID0gaHctPm1heF9hbHRyYXRlX3RyaWVzOworCWVsc2UKKwkJLyogc2FmZSBkZWZhdWx0LCBkb2VzIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIG1hdGNoIGh3IHByb3BlcnRpZXMgKi8KKwkJbXAtPm1heF9yZXRyeSA9IDc7CisKKwlpZiAoaHctPm1heF9hbHRyYXRlcyA+PSAzKQorCQltcC0+aGFzX21yciA9IHRydWU7CisKKwltcC0+aHcgPSBodzsKKwltcC0+dXBkYXRlX2ludGVydmFsID0gMTAwOworCisJcmV0dXJuIG1wOworfQorCitzdGF0aWMgdm9pZAorbWluc3RyZWxfZnJlZSh2b2lkICpwcml2KQoreworCWtmcmVlKHByaXYpOworfQorCitzdGF0aWMgc3RydWN0IHJhdGVfY29udHJvbF9vcHMgbWFjODAyMTFfbWluc3RyZWwgPSB7CisJLm5hbWUgPSAibWluc3RyZWwiLAorCS50eF9zdGF0dXMgPSBtaW5zdHJlbF90eF9zdGF0dXMsCisJLmdldF9yYXRlID0gbWluc3RyZWxfZ2V0X3JhdGUsCisJLnJhdGVfaW5pdCA9IG1pbnN0cmVsX3JhdGVfaW5pdCwKKwkuY2xlYXIgPSBtaW5zdHJlbF9jbGVhciwKKwkuYWxsb2MgPSBtaW5zdHJlbF9hbGxvYywKKwkuZnJlZSA9IG1pbnN0cmVsX2ZyZWUsCisJLmFsbG9jX3N0YSA9IG1pbnN0cmVsX2FsbG9jX3N0YSwKKwkuZnJlZV9zdGEgPSBtaW5zdHJlbF9mcmVlX3N0YSwKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS5hZGRfc3RhX2RlYnVnZnMgPSBtaW5zdHJlbF9hZGRfc3RhX2RlYnVnZnMsCisJLnJlbW92ZV9zdGFfZGVidWdmcyA9IG1pbnN0cmVsX3JlbW92ZV9zdGFfZGVidWdmcywKKyNlbmRpZgorfTsKKworaW50IF9faW5pdAorcmM4MDIxMV9taW5zdHJlbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoJm1hYzgwMjExX21pbnN0cmVsKTsKK30KKwordm9pZAorcmM4MDIxMV9taW5zdHJlbF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZtYWM4MDIxMV9taW5zdHJlbCk7Cit9CisKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmggYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTBhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRmVsaXggRmlldGthdSA8bmJkQG9wZW53cnQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1JDX01JTlNUUkVMX0gKKyNkZWZpbmUgX19SQ19NSU5TVFJFTF9ICisKK3N0cnVjdCBtaW5zdHJlbF9yYXRlIHsKKwlpbnQgYml0cmF0ZTsKKwlpbnQgcml4OworCisJdW5zaWduZWQgaW50IHBlcmZlY3RfdHhfdGltZTsKKwl1bnNpZ25lZCBpbnQgYWNrX3RpbWU7CisKKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CisJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50X2N0czsKKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnRfcnRzY3RzOworCXVuc2lnbmVkIGludCBhZGp1c3RlZF9yZXRyeV9jb3VudDsKKworCXUzMiBzdWNjZXNzOworCXUzMiBhdHRlbXB0czsKKwl1MzIgbGFzdF9hdHRlbXB0czsKKwl1MzIgbGFzdF9zdWNjZXNzOworCisJLyogcGFydHMgcGVyIHRob3VzYW5kICovCisJdTMyIGN1cl9wcm9iOworCXUzMiBwcm9iYWJpbGl0eTsKKworCS8qIHBlci1yYXRlIHRocm91Z2hwdXQgKi8KKwl1MzIgY3VyX3RwOworCXUzMiB0aHJvdWdocHV0OworCisJdTY0IHN1Y2NfaGlzdDsKKwl1NjQgYXR0X2hpc3Q7Cit9OworCitzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8geworCXVuc2lnbmVkIGxvbmcgc3RhdHNfdXBkYXRlOworCXVuc2lnbmVkIGludCBzcF9hY2tfZHVyOworCXVuc2lnbmVkIGludCByYXRlX2F2ZzsKKworCXVuc2lnbmVkIGludCBsb3dlc3Rfcml4OworCisJdW5zaWduZWQgaW50IG1heF90cF9yYXRlOworCXVuc2lnbmVkIGludCBtYXhfdHBfcmF0ZTI7CisJdW5zaWduZWQgaW50IG1heF9wcm9iX3JhdGU7CisJdW5zaWduZWQgaW50IHBhY2tldF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgc2FtcGxlX2NvdW50OworCWludCBzYW1wbGVfZGVmZXJyZWQ7CisKKwl1bnNpZ25lZCBpbnQgc2FtcGxlX2lkeDsKKwl1bnNpZ25lZCBpbnQgc2FtcGxlX2NvbHVtbjsKKworCWludCBuX3JhdGVzOworCXN0cnVjdCBtaW5zdHJlbF9yYXRlICpyOworCisJLyogc2FtcGxpbmcgdGFibGUgKi8KKwl1OCAqc2FtcGxlX3RhYmxlOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKKwlzdHJ1Y3QgZGVudHJ5ICpkYmdfc3RhdHM7CisjZW5kaWYKK307CisKK3N0cnVjdCBtaW5zdHJlbF9wcml2IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlib29sIGhhc19tcnI7CisJdW5zaWduZWQgaW50IGN3X21pbjsKKwl1bnNpZ25lZCBpbnQgY3dfbWF4OworCXVuc2lnbmVkIGludCBtYXhfcmV0cnk7CisJdW5zaWduZWQgaW50IGV3bWFfbGV2ZWw7CisJdW5zaWduZWQgaW50IHNlZ21lbnRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOworCXVuc2lnbmVkIGludCBsb29rYXJvdW5kX3JhdGU7CisJdW5zaWduZWQgaW50IGxvb2thcm91bmRfcmF0ZV9tcnI7Cit9OworCit2b2lkIG1pbnN0cmVsX2FkZF9zdGFfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKTsKK3ZvaWQgbWluc3RyZWxfcmVtb3ZlX3N0YV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwMjRjZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBCYXNlZCBvbiBtaW5zdHJlbC5jOgorICogICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBEZXJlayBTbWl0aGllcyA8ZGVyZWtAaW5kcmFuZXQuY28ubno+CisgKiAgIFNwb25zb3JlZCBieSBJbmRyYW5ldCBUZWNobm9sb2dpZXMgTHRkCisgKgorICogQmFzZWQgb24gc2FtcGxlLmM6CisgKiAgIENvcHlyaWdodCAoYykgMjAwNSBKb2huIEJpY2tldAorICogICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogICBhcmUgbWV0OgorICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgiRGlzY2xhaW1lciIpIGFuZCBhbnkKKyAqICAgICAgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkKKyAqICAgICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqICAgMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICAgQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgIE5PIFdBUlJBTlRZCisgKiAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICAgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hBTlRJQklMSVRZCisgKiAgIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqICAgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqICAgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiAgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiAgIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgInJjODAyMTFfbWluc3RyZWwuaCIKKworc3RydWN0IG1pbnN0cmVsX3N0YXRzX2luZm8geworCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWk7CisJY2hhciBidWZbNDA5Nl07CisJc2l6ZV90IGxlbjsKK307CisKK3N0YXRpYyBpbnQKK21pbnN0cmVsX3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IGlub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IG1pbnN0cmVsX3N0YXRzX2luZm8gKm1zOworCXVuc2lnbmVkIGludCBpLCB0cCwgcHJvYiwgZXByb2I7CisJY2hhciAqcDsKKworCW1zID0ga21hbGxvYyhzaXplb2YoKm1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBtczsKKwlwID0gbXMtPmJ1ZjsKKwlwICs9IHNwcmludGYocCwgInJhdGUgICAgIHRocm91Z2hwdXQgIGV3bWEgcHJvYiAgIHRoaXMgcHJvYiAgIgorCQkJInRoaXMgc3VjYy9hdHRlbXB0ICAgc3VjY2VzcyAgICBhdHRlbXB0c1xuIik7CisJZm9yIChpID0gMDsgaSA8IG1pLT5uX3JhdGVzOyBpKyspIHsKKwkJc3RydWN0IG1pbnN0cmVsX3JhdGUgKm1yID0gJm1pLT5yW2ldOworCisJCSoocCsrKSA9IChpID09IG1pLT5tYXhfdHBfcmF0ZSkgPyAnVCcgOiAnICc7CisJCSoocCsrKSA9IChpID09IG1pLT5tYXhfdHBfcmF0ZTIpID8gJ3QnIDogJyAnOworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAnUCcgOiAnICc7CisJCXAgKz0gc3ByaW50ZihwLCAiJTN1JXMiLCBtci0+Yml0cmF0ZSAvIDIsCisJCQkJKG1yLT5iaXRyYXRlICYgMSA/ICIuNSIgOiAiICAiKSk7CisKKwkJdHAgPSAoKG1yLT5jdXJfdHAgKiA5NikgLyAxODAwMCkgPj4gMTA7CisJCXByb2IgPSBtci0+Y3VyX3Byb2IgLyAxODsKKwkJZXByb2IgPSBtci0+cHJvYmFiaWxpdHkgLyAxODsKKworCQlwICs9IHNwcmludGYocCwgIiAgJTZ1LiUxdSAgICU2dS4lMXUgICAlNnUuJTF1ICAgICAgICAiCisJCQkJIiUzdSglM3UpICAgJThsbHUgICAgJThsbHVcbiIsCisJCQkJdHAgLyAxMCwgdHAgJSAxMCwKKwkJCQllcHJvYiAvIDEwLCBlcHJvYiAlIDEwLAorCQkJCXByb2IgLyAxMCwgcHJvYiAlIDEwLAorCQkJCW1yLT5sYXN0X3N1Y2Nlc3MsCisJCQkJbXItPmxhc3RfYXR0ZW1wdHMsCisJCQkJbXItPnN1Y2NfaGlzdCwKKwkJCQltci0+YXR0X2hpc3QpOworCX0KKwlwICs9IHNwcmludGYocCwgIlxuVG90YWwgcGFja2V0IGNvdW50OjogICAgaWRlYWwgJWQgICAgICAiCisJCQkibG9va2Fyb3VuZCAlZFxuXG4iLAorCQkJbWktPnBhY2tldF9jb3VudCAtIG1pLT5zYW1wbGVfY291bnQsCisJCQltaS0+c2FtcGxlX2NvdW50KTsKKwltcy0+bGVuID0gcCAtIG1zLT5idWY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWluc3RyZWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvKQoreworCXN0cnVjdCBtaW5zdHJlbF9zdGF0c19pbmZvICptczsKKwljaGFyICpzcmM7CisKKwltcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzcmMgPSBtcy0+YnVmOworCisJbGVuID0gbWluKGxlbiwgbXMtPmxlbik7CisJaWYgKGxlbiA8PSAqbykKKwkJcmV0dXJuIDA7CisKKwlzcmMgKz0gKm87CisJbGVuIC09ICpvOworCSpvICs9IGxlbjsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorbWluc3RyZWxfc3RhdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWluc3RyZWxfc3RhdHNfaW5mbyAqbXMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlrZnJlZShtcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWluc3RyZWxfc3RhdF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbWluc3RyZWxfc3RhdHNfb3BlbiwKKwkucmVhZCA9IG1pbnN0cmVsX3N0YXRzX3JlYWQsCisJLnJlbGVhc2UgPSBtaW5zdHJlbF9zdGF0c19yZWxlYXNlLAorfTsKKwordm9pZAorbWluc3RyZWxfYWRkX3N0YV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLCBzdHJ1Y3QgZGVudHJ5ICpkaXIpCit7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IHByaXZfc3RhOworCisJbWktPmRiZ19zdGF0cyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJjX3N0YXRzIiwgU19JUlVHTywgZGlyLCBtaSwKKwkJCSZtaW5zdHJlbF9zdGF0X2ZvcHMpOworfQorCit2b2lkCittaW5zdHJlbF9yZW1vdmVfc3RhX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCit7CisJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IHByaXZfc3RhOworCisJZGVidWdmc19yZW1vdmUobWktPmRiZ19zdGF0cyk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWQuaCBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZC5oCmluZGV4IDBhOTEzNWIuLjAxZDY0ZDUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZC5oCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZC5oCkBAIC0xMjQsNyArMTI0LDYgQEAKICAqIHN0cnVjdCByY19waWRfZGVidWdmc19lbnRyaWVzIC0gdHVuYWJsZSBwYXJhbWV0ZXJzCiAgKgogICogQWxnb3JpdGhtIHBhcmFtZXRlcnMsIHR1bmFibGUgdmlhIGRlYnVnZnMuCi0gKiBAZGlyOiB0aGUgZGVidWdmcyBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcGh5CiAgKiBAdGFyZ2V0OiB0YXJnZXQgcGVyY2VudGFnZSBmb3IgZmFpbGVkIGZyYW1lcwogICogQHNhbXBsaW5nX3BlcmlvZDogZXJyb3Igc2FtcGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzCiAgKiBAY29lZmZfcDogYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHByb3BvcnRpb25hbCBjb2VmZmljaWVudApAQCAtMTQzLDcgKzE0Miw2IEBACiAgKglvcmRlcmluZyBvZiByYXRlcykKICAqLwogc3RydWN0IHJjX3BpZF9kZWJ1Z2ZzX2VudHJpZXMgewotCXN0cnVjdCBkZW50cnkgKmRpcjsKIAlzdHJ1Y3QgZGVudHJ5ICp0YXJnZXQ7CiAJc3RydWN0IGRlbnRyeSAqc2FtcGxpbmdfcGVyaW9kOwogCXN0cnVjdCBkZW50cnkgKmNvZWZmX3A7CkBAIC0xODAsNiArMTc4LDggQEAKIAl1MzIgdHhfbnVtX2ZhaWxlZDsKIAl1MzIgdHhfbnVtX3htaXQ7CiAKKwlpbnQgdHhyYXRlX2lkeDsKKwogCS8qIEF2ZXJhZ2UgZmFpbGVkIGZyYW1lcyBwZXJjZW50YWdlIGVycm9yIChpLmUuIGFjdHVhbCB2cy4gdGFyZ2V0CiAJICogcGVyY2VudGFnZSksIHNjYWxlZCBieSBSQ19QSURfU01PT1RISU5HLiBUaGlzIHZhbHVlIGlzIGNvbXB1dGVkCiAJICogdXNpbmcgdXNpbmcgYW4gZXhwb25lbnRpYWwgd2VpZ2h0ZWQgYXZlcmFnZSB0ZWNobmlxdWU6CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfYWxnby5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2FsZ28uYwppbmRleCBhOTE0YmE3Li44NmViMzc0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfYWxnby5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9hbGdvLmMKQEAgLTY4LDE3ICs2OCwxNCBAQAogICogZXhoaWJpdGVkIGEgd29yc2UgZmFpbGVkIGZyYW1lcyBiZWhhdmlvdXIgYW5kIHdlJ2xsIGNob29zZSB0aGUgaGlnaGVzdCByYXRlCiAgKiB3aG9zZSBmYWlsZWQgZnJhbWVzIGJlaGF2aW91ciBpcyBub3Qgd29yc2UgdGhhbiB0aGUgb25lIG9mIHRoZSBvcmlnaW5hbCByYXRlCiAgKiB0YXJnZXQuIFdoaWxlIGF0IGl0LCBjaGVjayB0aGF0IHRoZSBuZXcgcmF0ZSBpcyB2YWxpZC4gKi8KLXN0YXRpYyB2b2lkIHJhdGVfY29udHJvbF9waWRfYWRqdXN0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJCSBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgaW50IGFkaiwKK3N0YXRpYyB2b2lkIHJhdGVfY29udHJvbF9waWRfYWRqdXN0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQkgc3RydWN0IHJjX3BpZF9zdGFfaW5mbyAqc3BpbmZvLCBpbnQgYWRqLAogCQkJCQkgc3RydWN0IHJjX3BpZF9yYXRlaW5mbyAqcmluZm8pCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJaW50IGN1cl9zb3J0ZWQsIG5ld19zb3J0ZWQsIHByb2JlLCB0bXAsIG5fYml0cmF0ZXMsIGJhbmQ7Ci0JaW50IGN1ciA9IHN0YS0+dHhyYXRlX2lkeDsKKwlpbnQgY3VyID0gc3BpbmZvLT50eHJhdGVfaWR4OwogCi0Jc2RhdGEgPSBzdGEtPnNkYXRhOwotCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKIAliYW5kID0gc2JhbmQtPmJhbmQ7CiAJbl9iaXRyYXRlcyA9IHNiYW5kLT5uX2JpdHJhdGVzOwogCkBAIC0xMTEsNyArMTA4LDcgQEAKIAkvKiBGaXQgdGhlIHJhdGUgZm91bmQgdG8gdGhlIG5lYXJlc3Qgc3VwcG9ydGVkIHJhdGUuICovCiAJZG8gewogCQlpZiAocmF0ZV9zdXBwb3J0ZWQoc3RhLCBiYW5kLCByaW5mb1t0bXBdLmluZGV4KSkgewotCQkJc3RhLT50eHJhdGVfaWR4ID0gcmluZm9bdG1wXS5pbmRleDsKKwkJCXNwaW5mby0+dHhyYXRlX2lkeCA9IHJpbmZvW3RtcF0uaW5kZXg7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoYWRqIDwgMCkKQEAgLTEyMSw5ICsxMTgsOSBAQAogCX0gd2hpbGUgKHRtcCA8IG5fYml0cmF0ZXMgJiYgdG1wID49IDApOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLQlyYXRlX2NvbnRyb2xfcGlkX2V2ZW50X3JhdGVfY2hhbmdlKAotCQkmKChzdHJ1Y3QgcmNfcGlkX3N0YV9pbmZvICopc3RhLT5yYXRlX2N0cmxfcHJpdiktPmV2ZW50cywKLQkJc3RhLT50eHJhdGVfaWR4LCBzYmFuZC0+Yml0cmF0ZXNbc3RhLT50eHJhdGVfaWR4XS5iaXRyYXRlKTsKKwlyYXRlX2NvbnRyb2xfcGlkX2V2ZW50X3JhdGVfY2hhbmdlKCZzcGluZm8tPmV2ZW50cywKKwkJc3BpbmZvLT50eHJhdGVfaWR4LAorCQlzYmFuZC0+Yml0cmF0ZXNbc3BpbmZvLT50eHJhdGVfaWR4XS5iaXRyYXRlKTsKICNlbmRpZgogfQogCkBAIC0xNDUsMTUgKzE0MiwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCByYXRlX2NvbnRyb2xfcGlkX3NhbXBsZShzdHJ1Y3QgcmNfcGlkX2luZm8gKnBpbmZvLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICBzdHJ1Y3QgcmNfcGlkX3N0YV9pbmZvICpzcGluZm8pCiB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7Ci0jZW5kaWYKLQlzdHJ1Y3QgcmNfcGlkX3N0YV9pbmZvICpzcGluZm8gPSBzdGEtPnJhdGVfY3RybF9wcml2OwogCXN0cnVjdCByY19waWRfcmF0ZWluZm8gKnJpbmZvID0gcGluZm8tPnJpbmZvOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXUzMiBwZjsKIAlzMzIgZXJyX2F2ZzsKIAl1MzIgZXJyX3Byb3A7CkBAIC0xNjIsOSArMTU1LDYgQEAKIAlpbnQgYWRqLCBpLCBqLCB0bXA7CiAJdW5zaWduZWQgbG9uZyBwZXJpb2Q7CiAKLQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07Ci0Jc3BpbmZvID0gc3RhLT5yYXRlX2N0cmxfcHJpdjsKLQogCS8qIEluIGNhc2Ugbm90aGluZyBoYXBwZW5lZCBkdXJpbmcgdGhlIHByZXZpb3VzIGNvbnRyb2wgaW50ZXJ2YWwsIHR1cm4KIAkgKiB0aGUgc2hhcnBlbmluZyBmYWN0b3Igb24uICovCiAJcGVyaW9kID0gKEhaICogcGluZm8tPnNhbXBsaW5nX3BlcmlvZCArIDUwMCkgLyAxMDAwOwpAQCAtMTgwLDE0ICsxNzAsMTUgQEAKIAlpZiAodW5saWtlbHkoc3BpbmZvLT50eF9udW1feG1pdCA9PSAwKSkKIAkJcGYgPSBzcGluZm8tPmxhc3RfcGY7CiAJZWxzZSB7CisJCS8qIFhYWDogQkFEIEhBQ0shISEgKi8KKwkJc3RydWN0IHN0YV9pbmZvICpzaSA9IGNvbnRhaW5lcl9vZihzdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsKKwogCQlwZiA9IHNwaW5mby0+dHhfbnVtX2ZhaWxlZCAqIDEwMCAvIHNwaW5mby0+dHhfbnVtX3htaXQ7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKLQkJaWYgKHBmID09IDEwMCAmJgotCQkgICAgc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQpCi0JCQltZXNoX3BsaW5rX2Jyb2tlbihzdGEpOwotI2VuZGlmCisKKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2ktPnNkYXRhLT52aWYpICYmIHBmID09IDEwMCkKKwkJCW1lc2hfcGxpbmtfYnJva2VuKHNpKTsKIAkJcGYgPDw9IFJDX1BJRF9BUklUSF9TSElGVDsKLQkJc3RhLT5mYWlsX2F2ZyA9ICgocGYgKyAoc3BpbmZvLT5sYXN0X3BmIDw8IDMpKSAvIDkpCisJCXNpLT5mYWlsX2F2ZyA9ICgocGYgKyAoc3BpbmZvLT5sYXN0X3BmIDw8IDMpKSAvIDkpCiAJCQkJCT4+IFJDX1BJRF9BUklUSF9TSElGVDsKIAl9CiAKQEAgLTE5NSwxNiArMTg2LDE2IEBACiAJc3BpbmZvLT50eF9udW1fZmFpbGVkID0gMDsKIAogCS8qIElmIHdlIGp1c3Qgc3dpdGNoZWQgcmF0ZSwgdXBkYXRlIHRoZSByYXRlIGJlaGF2aW91ciBpbmZvLiAqLwotCWlmIChwaW5mby0+b2xkcmF0ZSAhPSBzdGEtPnR4cmF0ZV9pZHgpIHsKKwlpZiAocGluZm8tPm9sZHJhdGUgIT0gc3BpbmZvLT50eHJhdGVfaWR4KSB7CiAKIAkJaSA9IHJpbmZvW3BpbmZvLT5vbGRyYXRlXS5yZXZfaW5kZXg7Ci0JCWogPSByaW5mb1tzdGEtPnR4cmF0ZV9pZHhdLnJldl9pbmRleDsKKwkJaiA9IHJpbmZvW3NwaW5mby0+dHhyYXRlX2lkeF0ucmV2X2luZGV4OwogCiAJCXRtcCA9IChwZiAtIHNwaW5mby0+bGFzdF9wZik7CiAJCXRtcCA9IFJDX1BJRF9ET19BUklUSF9SSUdIVF9TSElGVCh0bXAsIFJDX1BJRF9BUklUSF9TSElGVCk7CiAKIAkJcmluZm9bal0uZGlmZiA9IHJpbmZvW2ldLmRpZmYgKyB0bXA7Ci0JCXBpbmZvLT5vbGRyYXRlID0gc3RhLT50eHJhdGVfaWR4OworCQlwaW5mby0+b2xkcmF0ZSA9IHNwaW5mby0+dHhyYXRlX2lkeDsKIAl9CiAJcmF0ZV9jb250cm9sX3BpZF9ub3JtYWxpemUocGluZm8sIHNiYW5kLT5uX2JpdHJhdGVzKTsKIApAQCAtMjMzLDQzICsyMjQsMjYgQEAKIAogCS8qIENoYW5nZSByYXRlLiAqLwogCWlmIChhZGopCi0JCXJhdGVfY29udHJvbF9waWRfYWRqdXN0X3JhdGUobG9jYWwsIHN0YSwgYWRqLCByaW5mbyk7CisJCXJhdGVfY29udHJvbF9waWRfYWRqdXN0X3JhdGUoc2JhbmQsIHN0YSwgc3BpbmZvLCBhZGosIHJpbmZvKTsKIH0KIAotc3RhdGljIHZvaWQgcmF0ZV9jb250cm9sX3BpZF90eF9zdGF0dXModm9pZCAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIHJhdGVfY29udHJvbF9waWRfdHhfc3RhdHVzKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKIAkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCByY19waWRfaW5mbyAqcGluZm8gPSBwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCByY19waWRfc3RhX2luZm8gKnNwaW5mbzsKKwlzdHJ1Y3QgcmNfcGlkX3N0YV9pbmZvICpzcGluZm8gPSBwcml2X3N0YTsKIAl1bnNpZ25lZCBsb25nIHBlcmlvZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlzdGEgPSBzdGFfaW5mb19nZXQobG9jYWwsIGhkci0+YWRkcjEpOwotCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKLQotCWlmICghc3RhKQotCQlnb3RvIHVubG9jazsKLQotCS8qIERvbid0IHVwZGF0ZSB0aGUgc3RhdGUgaWYgd2UncmUgbm90IGNvbnRyb2xsaW5nIHRoZSByYXRlLiAqLwotCXNkYXRhID0gc3RhLT5zZGF0YTsKLQlpZiAoc2RhdGEtPmZvcmNlX3VuaWNhc3RfcmF0ZWlkeCA+IC0xKSB7Ci0JCXN0YS0+dHhyYXRlX2lkeCA9IHNkYXRhLT5tYXhfcmF0ZWN0cmxfcmF0ZWlkeDsKLQkJZ290byB1bmxvY2s7Ci0JfQorCWlmICghc3BpbmZvKQorCQlyZXR1cm47CiAKIAkvKiBJZ25vcmUgYWxsIGZyYW1lcyB0aGF0IHdlcmUgc2VudCB3aXRoIGEgZGlmZmVyZW50IHJhdGUgdGhhbiB0aGUgcmF0ZQogCSAqIHdlIGN1cnJlbnRseSBhZHZpc2UgbWFjODAyMTEgdG8gdXNlLiAqLwotCWlmIChpbmZvLT50eF9yYXRlX2lkeCAhPSBzdGEtPnR4cmF0ZV9pZHgpCi0JCWdvdG8gdW5sb2NrOworCWlmIChpbmZvLT50eF9yYXRlX2lkeCAhPSBzcGluZm8tPnR4cmF0ZV9pZHgpCisJCXJldHVybjsKIAotCXNwaW5mbyA9IHN0YS0+cmF0ZV9jdHJsX3ByaXY7CiAJc3BpbmZvLT50eF9udW1feG1pdCsrOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKQEAgLTI4Nyw5MyArMjYxLDY4IEBACiAJCXNwaW5mby0+dHhfbnVtX3htaXQrKzsKIAl9CiAKLQlpZiAoaW5mby0+c3RhdHVzLmV4Y2Vzc2l2ZV9yZXRyaWVzKSB7Ci0JCXN0YS0+dHhfcmV0cnlfZmFpbGVkKys7Ci0JCXN0YS0+dHhfbnVtX2NvbnNlY3V0aXZlX2ZhaWx1cmVzKys7Ci0JCXN0YS0+dHhfbnVtX21wZHVfZmFpbCsrOwotCX0gZWxzZSB7Ci0JCXN0YS0+dHhfbnVtX2NvbnNlY3V0aXZlX2ZhaWx1cmVzID0gMDsKLQkJc3RhLT50eF9udW1fbXBkdV9vaysrOwotCX0KLQlzdGEtPnR4X3JldHJ5X2NvdW50ICs9IGluZm8tPnN0YXR1cy5yZXRyeV9jb3VudDsKLQlzdGEtPnR4X251bV9tcGR1X2ZhaWwgKz0gaW5mby0+c3RhdHVzLnJldHJ5X2NvdW50OwotCiAJLyogVXBkYXRlIFBJRCBjb250cm9sbGVyIHN0YXRlLiAqLwogCXBlcmlvZCA9IChIWiAqIHBpbmZvLT5zYW1wbGluZ19wZXJpb2QgKyA1MDApIC8gMTAwMDsKIAlpZiAoIXBlcmlvZCkKIAkJcGVyaW9kID0gMTsKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzcGluZm8tPmxhc3Rfc2FtcGxlICsgcGVyaW9kKSkKLQkJcmF0ZV9jb250cm9sX3BpZF9zYW1wbGUocGluZm8sIGxvY2FsLCBzdGEpOwotCi0gdW5sb2NrOgotCXJjdV9yZWFkX3VubG9jaygpOworCQlyYXRlX2NvbnRyb2xfcGlkX3NhbXBsZShwaW5mbywgc2JhbmQsIHN0YSwgc3BpbmZvKTsKIH0KIAotc3RhdGljIHZvaWQgcmF0ZV9jb250cm9sX3BpZF9nZXRfcmF0ZSh2b2lkICpwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgc3RydWN0IHJhdGVfc2VsZWN0aW9uICpzZWwpCitzdGF0aWMgdm9pZAorcmF0ZV9jb250cm9sX3BpZF9nZXRfcmF0ZSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCByYXRlX3NlbGVjdGlvbiAqc2VsKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IHJjX3BpZF9zdGFfaW5mbyAqc3BpbmZvID0gcHJpdl9zdGE7CiAJaW50IHJhdGVpZHg7CiAJdTE2IGZjOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQogCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgZGF0YSB1c2luZyBsb3dlc3QKIAkgKiByYXRlLiAqLwogCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKLQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICE9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHx8Ci0JICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8ICFzdGEpIHsKLQkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KGxvY2FsLCBzYmFuZCwgc3RhKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCFzdGEgfHwgIXNwaW5mbyB8fAorCSAgICAoZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgIT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfHwKKwkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKKwkJc2VsLT5yYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwogCQlyZXR1cm47CiAJfQogCi0JLyogSWYgYSBmb3JjZWQgcmF0ZSBpcyBpbiBlZmZlY3QsIHNlbGVjdCBpdC4gKi8KLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0JaWYgKHNkYXRhLT5mb3JjZV91bmljYXN0X3JhdGVpZHggPiAtMSkKLQkJc3RhLT50eHJhdGVfaWR4ID0gc2RhdGEtPmZvcmNlX3VuaWNhc3RfcmF0ZWlkeDsKLQotCXJhdGVpZHggPSBzdGEtPnR4cmF0ZV9pZHg7CisJcmF0ZWlkeCA9IHNwaW5mby0+dHhyYXRlX2lkeDsKIAogCWlmIChyYXRlaWR4ID49IHNiYW5kLT5uX2JpdHJhdGVzKQogCQlyYXRlaWR4ID0gc2JhbmQtPm5fYml0cmF0ZXMgLSAxOwogCi0Jc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSByYXRlaWR4OwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAlzZWwtPnJhdGVfaWR4ID0gcmF0ZWlkeDsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JcmF0ZV9jb250cm9sX3BpZF9ldmVudF90eF9yYXRlKAotCQkmKChzdHJ1Y3QgcmNfcGlkX3N0YV9pbmZvICopIHN0YS0+cmF0ZV9jdHJsX3ByaXYpLT5ldmVudHMsCisJcmF0ZV9jb250cm9sX3BpZF9ldmVudF90eF9yYXRlKCZzcGluZm8tPmV2ZW50cywKIAkJcmF0ZWlkeCwgc2JhbmQtPmJpdHJhdGVzW3JhdGVpZHhdLmJpdHJhdGUpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIHJhdGVfY29udHJvbF9waWRfcmF0ZV9pbml0KHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorc3RhdGljIHZvaWQKK3JhdGVfY29udHJvbF9waWRfcmF0ZV9pbml0KHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEpCiB7CisJc3RydWN0IHJjX3BpZF9zdGFfaW5mbyAqc3BpbmZvID0gcHJpdl9zdGE7CisJc3RydWN0IHN0YV9pbmZvICpzaTsKKwogCS8qIFRPRE86IFRoaXMgcm91dGluZSBzaG91bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tIHByZXZpb3VzIHBhY2tldHMKIAkgKiBhcyB3ZSBuZWVkIHRvIGhhdmUgSUVFRSA4MDIuMVggYXV0aCBzdWNjZWVkIGltbWVkaWF0ZWx5IGFmdGVyIGFzc29jLi4KIAkgKiBVbnRpbCB0aGF0IG1ldGhvZCBpcyBpbXBsZW1lbnRlZCwgd2Ugd2lsbCB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQKIAkgKiByYXRlIGFzIGEgd29ya2Fyb3VuZC4gKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAotCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKLQlzdGEtPnR4cmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleChsb2NhbCwgc2JhbmQsIHN0YSk7Ci0Jc3RhLT5mYWlsX2F2ZyA9IDA7CisJc3BpbmZvLT50eHJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoc2JhbmQsIHN0YSk7CisJLyogSEFDSyAqLworCXNpID0gY29udGFpbmVyX29mKHN0YSwgc3RydWN0IHN0YV9pbmZvLCBzdGEpOworCXNpLT5mYWlsX2F2ZyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkICpyYXRlX2NvbnRyb2xfcGlkX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQorc3RhdGljIHZvaWQgKnJhdGVfY29udHJvbF9waWRfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXIpCiB7CiAJc3RydWN0IHJjX3BpZF9pbmZvICpwaW5mbzsKIAlzdHJ1Y3QgcmNfcGlkX3JhdGVpbmZvICpyaW5mbzsKQEAgLTM4NCw3ICszMzMsNyBAQAogCXN0cnVjdCByY19waWRfZGVidWdmc19lbnRyaWVzICpkZTsKICNlbmRpZgogCi0Jc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdOworCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tody0+Y29uZi5jaGFubmVsLT5iYW5kXTsKIAogCXBpbmZvID0ga21hbGxvYyhzaXplb2YoKnBpbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaW5mbykKQEAgLTQzOSwzMCArMzg4LDI4IEBACiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwogCWRlID0gJnBpbmZvLT5kZW50cmllczsKLQlkZS0+ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJyYzgwMjExX3BpZCIsCi0JCQkJICAgICBsb2NhbC0+aHcud2lwaHktPmRlYnVnZnNkaXIpOwogCWRlLT50YXJnZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRhcmdldF9wZiIsIFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJCQlkZS0+ZGlyLCAmcGluZm8tPnRhcmdldCk7CisJCQkJCWRlYnVnZnNkaXIsICZwaW5mby0+dGFyZ2V0KTsKIAlkZS0+c2FtcGxpbmdfcGVyaW9kID0gZGVidWdmc19jcmVhdGVfdTMyKCJzYW1wbGluZ19wZXJpb2QiLAotCQkJCQkJIFNfSVJVU1IgfCBTX0lXVVNSLCBkZS0+ZGlyLAorCQkJCQkJIFNfSVJVU1IgfCBTX0lXVVNSLCBkZWJ1Z2ZzZGlyLAogCQkJCQkJICZwaW5mby0+c2FtcGxpbmdfcGVyaW9kKTsKIAlkZS0+Y29lZmZfcCA9IGRlYnVnZnNfY3JlYXRlX3UzMigiY29lZmZfcCIsIFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJCQkgZGUtPmRpciwgJnBpbmZvLT5jb2VmZl9wKTsKKwkJCQkJIGRlYnVnZnNkaXIsICZwaW5mby0+Y29lZmZfcCk7CiAJZGUtPmNvZWZmX2kgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoImNvZWZmX2kiLCBTX0lSVVNSIHwgU19JV1VTUiwKLQkJCQkJIGRlLT5kaXIsICZwaW5mby0+Y29lZmZfaSk7CisJCQkJCSBkZWJ1Z2ZzZGlyLCAmcGluZm8tPmNvZWZmX2kpOwogCWRlLT5jb2VmZl9kID0gZGVidWdmc19jcmVhdGVfdTMyKCJjb2VmZl9kIiwgU19JUlVTUiB8IFNfSVdVU1IsCi0JCQkJCSBkZS0+ZGlyLCAmcGluZm8tPmNvZWZmX2QpOworCQkJCQkgZGVidWdmc2RpciwgJnBpbmZvLT5jb2VmZl9kKTsKIAlkZS0+c21vb3RoaW5nX3NoaWZ0ID0gZGVidWdmc19jcmVhdGVfdTMyKCJzbW9vdGhpbmdfc2hpZnQiLAotCQkJCQkJIFNfSVJVU1IgfCBTX0lXVVNSLCBkZS0+ZGlyLAorCQkJCQkJIFNfSVJVU1IgfCBTX0lXVVNSLCBkZWJ1Z2ZzZGlyLAogCQkJCQkJICZwaW5mby0+c21vb3RoaW5nX3NoaWZ0KTsKIAlkZS0+c2hhcnBlbl9mYWN0b3IgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInNoYXJwZW5fZmFjdG9yIiwKLQkJCQkJICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBkZS0+ZGlyLAorCQkJCQkgICAgICAgU19JUlVTUiB8IFNfSVdVU1IsIGRlYnVnZnNkaXIsCiAJCQkJCSAgICAgICAmcGluZm8tPnNoYXJwZW5fZmFjdG9yKTsKIAlkZS0+c2hhcnBlbl9kdXJhdGlvbiA9IGRlYnVnZnNfY3JlYXRlX3UzMigic2hhcnBlbl9kdXJhdGlvbiIsCi0JCQkJCQkgIFNfSVJVU1IgfCBTX0lXVVNSLCBkZS0+ZGlyLAorCQkJCQkJICBTX0lSVVNSIHwgU19JV1VTUiwgZGVidWdmc2RpciwKIAkJCQkJCSAgJnBpbmZvLT5zaGFycGVuX2R1cmF0aW9uKTsKIAlkZS0+bm9ybV9vZmZzZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm5vcm1fb2Zmc2V0IiwKLQkJCQkJICAgICBTX0lSVVNSIHwgU19JV1VTUiwgZGUtPmRpciwKKwkJCQkJICAgICBTX0lSVVNSIHwgU19JV1VTUiwgZGVidWdmc2RpciwKIAkJCQkJICAgICAmcGluZm8tPm5vcm1fb2Zmc2V0KTsKICNlbmRpZgogCkBAIC00ODQsNyArNDMxLDYgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShkZS0+Y29lZmZfcCk7CiAJZGVidWdmc19yZW1vdmUoZGUtPnNhbXBsaW5nX3BlcmlvZCk7CiAJZGVidWdmc19yZW1vdmUoZGUtPnRhcmdldCk7Ci0JZGVidWdmc19yZW1vdmUoZGUtPmRpcik7CiAjZW5kaWYKIAogCWtmcmVlKHBpbmZvLT5yaW5mbyk7CkBAIC00OTUsNyArNDQxLDggQEAKIHsKIH0KIAotc3RhdGljIHZvaWQgKnJhdGVfY29udHJvbF9waWRfYWxsb2Nfc3RhKHZvaWQgKnByaXYsIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkICpyYXRlX2NvbnRyb2xfcGlkX2FsbG9jX3N0YSh2b2lkICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQlnZnBfdCBnZnApCiB7CiAJc3RydWN0IHJjX3BpZF9zdGFfaW5mbyAqc3BpbmZvOwogCkBAIC01MTMsMTAgKzQ2MCwxMCBAQAogCXJldHVybiBzcGluZm87CiB9CiAKLXN0YXRpYyB2b2lkIHJhdGVfY29udHJvbF9waWRfZnJlZV9zdGEodm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCitzdGF0aWMgdm9pZCByYXRlX2NvbnRyb2xfcGlkX2ZyZWVfc3RhKHZvaWQgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICAgICAgdm9pZCAqcHJpdl9zdGEpCiB7Ci0Jc3RydWN0IHJjX3BpZF9zdGFfaW5mbyAqc3BpbmZvID0gcHJpdl9zdGE7Ci0Ja2ZyZWUoc3BpbmZvKTsKKwlrZnJlZShwcml2X3N0YSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyBtYWM4MDIxMV9yY3BpZCA9IHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yeC5jIGIvbmV0L21hYzgwMjExL3J4LmMKaW5kZXggNmRiODU0NS4uY2Y2YjEyMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3J4LmMKKysrIGIvbmV0L21hYzgwMjExL3J4LmMKQEAgLTE0Myw2ICsxNDMsOCBAQAogCS8qIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyAqLwogCWlmIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTKQogCQkqcG9zIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX0ZDUzsKKwlpZiAoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19TSE9SVFBSRSkKKwkJKnBvcyB8PSBJRUVFODAyMTFfUkFESU9UQVBfRl9TSE9SVFBSRTsKIAlwb3MrKzsKIAogCS8qIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFICovCkBAIC0xNTUsOCArMTU3LDExIEBACiAJaWYgKHN0YXR1cy0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQogCQkqKF9fbGUxNiAqKXBvcyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9DSEFOX09GRE0gfAogCQkJCQkgICAgIElFRUU4MDIxMV9DSEFOXzVHSFopOworCWVsc2UgaWYgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1JBVEVfRVJQX0cpCisJCSooX19sZTE2ICopcG9zID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0NIQU5fT0ZETSB8CisJCQkJCSAgICAgSUVFRTgwMjExX0NIQU5fMkdIWik7CiAJZWxzZQotCQkqKF9fbGUxNiAqKXBvcyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9DSEFOX0RZTiB8CisJCSooX19sZTE2ICopcG9zID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0NIQU5fQ0NLIHwKIAkJCQkJICAgICBJRUVFODAyMTFfQ0hBTl8yR0haKTsKIAlwb3MgKz0gMjsKIApAQCAtMjkwLDcgKzI5NSw3IEBACiAJCWlmICghbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikKKwkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQkJY29udGludWU7CiAKIAkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpCkBAIC0zOTgsMTIgKzQwMywxMiBAQAogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gcngtPmxvY2FsOwogCXN0cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiOwogCi0JaWYgKHVubGlrZWx5KGxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcpKQotCQlyZXR1cm4gaWVlZTgwMjExX3N0YV9yeF9zY2FuKHJ4LT5kZXYsIHNrYiwgcngtPnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGxvY2FsLT5od19zY2FubmluZykpCisJCXJldHVybiBpZWVlODAyMTFfc2Nhbl9yeChyeC0+c2RhdGEsIHNrYiwgcngtPnN0YXR1cyk7CiAKLQlpZiAodW5saWtlbHkobG9jYWwtPnN0YV9zd19zY2FubmluZykpIHsKKwlpZiAodW5saWtlbHkobG9jYWwtPnN3X3NjYW5uaW5nKSkgewogCQkvKiBkcm9wIGFsbCB0aGUgb3RoZXIgcGFja2V0cyBkdXJpbmcgYSBzb2Z0d2FyZSBzY2FuIGFueXdheSAqLwotCQlpZiAoaWVlZTgwMjExX3N0YV9yeF9zY2FuKHJ4LT5kZXYsIHNrYiwgcngtPnN0YXR1cykKKwkJaWYgKGllZWU4MDIxMV9zY2FuX3J4KHJ4LT5zZGF0YSwgc2tiLCByeC0+c3RhdHVzKQogCQkgICAgIT0gUlhfUVVFVUVEKQogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gUlhfUVVFVUVEOwpAQCAtNDYxLDcgKzQ2Niw3IEBACiAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJgotCSAgICBtZXNoX3JtY19jaGVjayhoZHItPmFkZHI0LCBtc2hfaF9nZXQoaGRyLCBoZHJsZW4pLCByeC0+ZGV2KSkKKwkgICAgbWVzaF9ybWNfY2hlY2soaGRyLT5hZGRyNCwgbXNoX2hfZ2V0KGhkciwgaGRybGVuKSwgcngtPnNkYXRhKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKICN1bmRlZiBtc2hfaF9nZXQKIApAQCAtNDk2LDggKzUwMSw4IEBACiAJLyogRHJvcCBkaXNhbGxvd2VkIGZyYW1lIGNsYXNzZXMgYmFzZWQgb24gU1RBIGF1dGgvYXNzb2Mgc3RhdGU7CiAJICogSUVFRSA4MDIuMTEsIENoYXAgNS41LgogCSAqCi0JICogODAyMTEubyBkb2VzIGZpbHRlcmluZyBvbmx5IGJhc2VkIG9uIGFzc29jaWF0aW9uIHN0YXRlLCBpLmUuLCBpdAotCSAqIGRyb3BzIENsYXNzIDMgZnJhbWVzIGZyb20gbm90IGFzc29jaWF0ZWQgc3RhdGlvbnMuIGhvc3RhcGQgc2VuZHMKKwkgKiBtYWM4MDIxMSBmaWx0ZXJzIG9ubHkgYmFzZWQgb24gYXNzb2NpYXRpb24gc3RhdGUsIGkuZS4gaXQgZHJvcHMKKwkgKiBDbGFzcyAzIGZyYW1lcyBmcm9tIG5vdCBhc3NvY2lhdGVkIHN0YXRpb25zLiBob3N0YXBkIHNlbmRzCiAJICogZGVhdXRoL2Rpc2Fzc29jIGZyYW1lcyB3aGVuIG5lZWRlZC4gSW4gYWRkaXRpb24sIGhvc3RhcGQgaXMKIAkgKiByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIG9uIGJvdGggYXV0aCBhbmQgYXNzb2Mgc3RhdGVzLgogCSAqLwpAQCAtNTA3LDcgKzUxMiw3IEBACiAKIAlpZiAodW5saWtlbHkoKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkJICAgICAgaWVlZTgwMjExX2lzX3BzcG9sbChoZHItPmZyYW1lX2NvbnRyb2wpKSAmJgotCQkgICAgIHJ4LT5zZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJgorCQkgICAgIHJ4LT5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKIAkJICAgICAoIXJ4LT5zdGEgfHwgIXRlc3Rfc3RhX2ZsYWdzKHJ4LT5zdGEsIFdMQU5fU1RBX0FTU09DKSkpKSB7CiAJCWlmICgoIWllZWU4MDIxMV9oYXNfZnJvbWRzKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkJICAgICAhaWVlZTgwMjExX2hhc190b2RzKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKQEAgLTY0NSwzMiArNjUwLDI4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgYXBfc3RhX3BzX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQorc3RhdGljIHZvaWQgYXBfc3RhX3BzX3N0YXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAotCXNkYXRhID0gc3RhLT5zZGF0YTsKLQogCWF0b21pY19pbmMoJnNkYXRhLT5ic3MtPm51bV9zdGFfcHMpOwogCXNldF9hbmRfY2xlYXJfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfUFMsIFdMQU5fU1RBX1BTUE9MTCk7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfUFNfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNUQSAlcyBhaWQgJWQgZW50ZXJzIHBvd2VyIHNhdmUgbW9kZVxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLCBzdGEtPmFpZCk7CisJICAgICAgIHNkYXRhLT5kZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpLCBzdGEtPnN0YS5haWQpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHICovCiB9CiAKLXN0YXRpYyBpbnQgYXBfc3RhX3BzX2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKK3N0YXRpYyBpbnQgYXBfc3RhX3BzX2VuZChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBzZW50ID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQlzZGF0YSA9IHN0YS0+c2RhdGE7Ci0KIAlhdG9taWNfZGVjKCZzZGF0YS0+YnNzLT5udW1fc3RhX3BzKTsKIAogCWNsZWFyX3N0YV9mbGFncyhzdGEsIFdMQU5fU1RBX1BTIHwgV0xBTl9TVEFfUFNQT0xMKTsKQEAgLTY4MCw3ICs2ODEsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfUFNfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNUQSAlcyBhaWQgJWQgZXhpdHMgcG93ZXIgc2F2ZSBtb2RlXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIHN0YS0+YWRkciksIHN0YS0+YWlkKTsKKwkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgc3RhLT5zdGEuYWRkciksIHN0YS0+c3RhLmFpZCk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfUFNfREVCVUcgKi8KIAogCS8qIFNlbmQgYWxsIGJ1ZmZlcmVkIGZyYW1lcyB0byB0aGUgc3RhdGlvbiAqLwpAQCAtNjk2LDggKzY5Nyw4IEBACiAJCXNlbnQrKzsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9QU19ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNUQSAlcyBhaWQgJWQgc2VuZCBQUyBmcmFtZSAiCi0JCSAgICAgICAic2luY2UgU1RBIG5vdCBzbGVlcGluZyBhbnltb3JlXG4iLCBkZXYtPm5hbWUsCi0JCSAgICAgICBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLCBzdGEtPmFpZCk7CisJCSAgICAgICAic2luY2UgU1RBIG5vdCBzbGVlcGluZyBhbnltb3JlXG4iLCBzZGF0YS0+ZGV2LT5uYW1lLAorCQkgICAgICAgcHJpbnRfbWFjKG1hYywgc3RhLT5zdGEuYWRkciksIHN0YS0+c3RhLmFpZCk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfUFNfREVCVUcgKi8KIAkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9SRVFVRVVFOwogCQlkZXZfcXVldWVfeG1pdChza2IpOwpAQCAtNzEwLDcgKzcxMSw2IEBACiBpZWVlODAyMTFfcnhfaF9zdGFfcHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQogewogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gcngtPnN0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcngtPmRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcngtPnNrYi0+ZGF0YTsKIAogCWlmICghc3RhKQpAQCAtNzE5LDE0ICs3MTksMTQgQEAKIAkvKiBVcGRhdGUgbGFzdF9yeCBvbmx5IGZvciBJQlNTIHBhY2tldHMgd2hpY2ggYXJlIGZvciB0aGUgY3VycmVudAogCSAqIEJTU0lEIHRvIGF2b2lkIGtlZXBpbmcgdGhlIGN1cnJlbnQgSUJTUyBuZXR3b3JrIGFsaXZlIGluIGNhc2VzIHdoZXJlCiAJICogb3RoZXIgU1RBcyBhcmUgdXNpbmcgZGlmZmVyZW50IEJTU0lELiAqLwotCWlmIChyeC0+c2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwlpZiAocngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQl1OCAqYnNzaWQgPSBpZWVlODAyMTFfZ2V0X2Jzc2lkKGhkciwgcngtPnNrYi0+bGVuLAotCQkJCQkJSUVFRTgwMjExX0lGX1RZUEVfSUJTUyk7CisJCQkJCQlOTDgwMjExX0lGVFlQRV9BREhPQyk7CiAJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoYnNzaWQsIHJ4LT5zZGF0YS0+dS5zdGEuYnNzaWQpID09IDApCiAJCQlzdGEtPmxhc3RfcnggPSBqaWZmaWVzOwogCX0gZWxzZQogCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwKLQkgICAgcngtPnNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpIHsKKwkgICAgcngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCS8qIFVwZGF0ZSBsYXN0X3J4IG9ubHkgZm9yIHVuaWNhc3QgZnJhbWVzIGluIG9yZGVyIHRvIHByZXZlbnQKIAkJICogdGhlIFByb2JlIFJlcXVlc3QgZnJhbWVzICh0aGUgb25seSBicm9hZGNhc3QgZnJhbWVzIGZyb20gYQogCQkgKiBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSkgZnJvbSBrZWVwaW5nIGEgY29ubmVjdGlvbiBhbGl2ZS4KQEAgLTc0NiwxNiArNzQ2LDE2IEBACiAJc3RhLT5sYXN0X25vaXNlID0gcngtPnN0YXR1cy0+bm9pc2U7CiAKIAlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkgICAgKHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgfHwKLQkgICAgIHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfVkxBTikpIHsKKwkgICAgKHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkgICAgIHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikpIHsKIAkJLyogQ2hhbmdlIFNUQSBwb3dlciBzYXZpbmcgbW9kZSBvbmx5IGluIHRoZSBlbmQgb2YgYSBmcmFtZQogCQkgKiBleGNoYW5nZSBzZXF1ZW5jZSAqLwogCQlpZiAodGVzdF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9QUykgJiYKIAkJICAgICFpZWVlODAyMTFfaGFzX3BtKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlyeC0+c2VudF9wc19idWZmZXJlZCArPSBhcF9zdGFfcHNfZW5kKGRldiwgc3RhKTsKKwkJCXJ4LT5zZW50X3BzX2J1ZmZlcmVkICs9IGFwX3N0YV9wc19lbmQoc3RhKTsKIAkJZWxzZSBpZiAoIXRlc3Rfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfUFMpICYmCiAJCQkgaWVlZTgwMjExX2hhc19wbShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJYXBfc3RhX3BzX3N0YXJ0KGRldiwgc3RhKTsKKwkJCWFwX3N0YV9wc19zdGFydChzdGEpOwogCX0KIAogCS8qIERyb3AgZGF0YTo6bnVsbGZ1bmMgZnJhbWVzIHNpbGVudGx5LCBzaW5jZSB0aGV5IGFyZSB1c2VkIG9ubHkgdG8KQEAgLTgxNiw3ICs4MTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfZnJhZ21lbnRfZW50cnkgKgogaWVlZTgwMjExX3JlYXNzZW1ibGVfZmluZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCSAgdTE2IGZjLCB1bnNpZ25lZCBpbnQgZnJhZywgdW5zaWduZWQgaW50IHNlcSwKKwkJCSAgdW5zaWduZWQgaW50IGZyYWcsIHVuc2lnbmVkIGludCBzZXEsCiAJCQkgIGludCByeF9xdWV1ZSwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdtZW50X2VudHJ5ICplbnRyeTsKQEAgLTgyNSw3ICs4MjUsNiBAQAogCWlkeCA9IHNkYXRhLT5mcmFnbWVudF9uZXh0OwogCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR01FTlRfTUFYOyBpKyspIHsKIAkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmZfaGRyOwotCQl1MTYgZl9mYzsKIAogCQlpZHgtLTsKIAkJaWYgKGlkeCA8IDApCkBAIC04MzcsMTAgKzgzNiwxMyBAQAogCQkgICAgZW50cnktPmxhc3RfZnJhZyArIDEgIT0gZnJhZykKIAkJCWNvbnRpbnVlOwogCi0JCWZfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGVudHJ5LT5za2JfbGlzdC5uZXh0LT5kYXRhOwotCQlmX2ZjID0gbGUxNl90b19jcHUoZl9oZHItPmZyYW1lX2NvbnRyb2wpOworCQlmX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWVudHJ5LT5za2JfbGlzdC5uZXh0LT5kYXRhOwogCi0JCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgIT0gKGZfZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgfHwKKwkJLyoKKwkJICogQ2hlY2sgZnR5cGUgYW5kIGFkZHJlc3NlcyBhcmUgZXF1YWwsIGVsc2UgY2hlY2sgbmV4dCBmcmFnbWVudAorCQkgKi8KKwkJaWYgKCgoaGRyLT5mcmFtZV9jb250cm9sIF4gZl9oZHItPmZyYW1lX2NvbnRyb2wpICYKKwkJICAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GVFlQRSkpIHx8CiAJCSAgICBjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMSwgZl9oZHItPmFkZHIxKSAhPSAwIHx8CiAJCSAgICBjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMiwgZl9oZHItPmFkZHIyKSAhPSAwKQogCQkJY29udGludWU7CkBAIC04NjAsMTYgKzg2MiwxOCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTE2IHNjOworCV9fbGUxNiBmYzsKIAl1bnNpZ25lZCBpbnQgZnJhZywgc2VxOwogCXN0cnVjdCBpZWVlODAyMTFfZnJhZ21lbnRfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgcngtPnNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilyeC0+c2tiLT5kYXRhOworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCk7CiAJZnJhZyA9IHNjICYgSUVFRTgwMjExX1NDVExfRlJBRzsKIAotCWlmIChsaWtlbHkoKCEocngtPmZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSAmJiBmcmFnID09IDApIHx8CisJaWYgKGxpa2VseSgoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSAmJiBmcmFnID09IDApIHx8CiAJCSAgIChyeC0+c2tiKS0+bGVuIDwgMjQgfHwKIAkJICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpKSB7CiAJCS8qIG5vdCBmcmFnbWVudGVkICovCkBAIC04ODQsNyArODg4LDcgQEAKIAkJZW50cnkgPSBpZWVlODAyMTFfcmVhc3NlbWJsZV9hZGQocngtPnNkYXRhLCBmcmFnLCBzZXEsCiAJCQkJCQkgcngtPnF1ZXVlLCAmKHJ4LT5za2IpKTsKIAkJaWYgKHJ4LT5rZXkgJiYgcngtPmtleS0+Y29uZi5hbGcgPT0gQUxHX0NDTVAgJiYKLQkJICAgIChyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKSB7CisJCSAgICBpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChmYykpIHsKIAkJCS8qIFN0b3JlIENDTVAgUE4gc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoYXQgdGhlIG5leHQKIAkJCSAqIGZyYWdtZW50IGhhcyBhIHNlcXVlbnRpYWwgUE4gdmFsdWUuICovCiAJCQllbnRyeS0+Y2NtcCA9IDE7CkBAIC04OTgsOCArOTAyLDcgQEAKIAkvKiBUaGlzIGlzIGEgZnJhZ21lbnQgZm9yIGEgZnJhbWUgdGhhdCBzaG91bGQgYWxyZWFkeSBiZSBwZW5kaW5nIGluCiAJICogZnJhZ21lbnQgY2FjaGUuIEFkZCB0aGlzIGZyYWdtZW50IHRvIHRoZSBlbmQgb2YgdGhlIHBlbmRpbmcgZW50cnkuCiAJICovCi0JZW50cnkgPSBpZWVlODAyMTFfcmVhc3NlbWJsZV9maW5kKHJ4LT5zZGF0YSwgcngtPmZjLCBmcmFnLCBzZXEsCi0JCQkJCSAgcngtPnF1ZXVlLCBoZHIpOworCWVudHJ5ID0gaWVlZTgwMjExX3JlYXNzZW1ibGVfZmluZChyeC0+c2RhdGEsIGZyYWcsIHNlcSwgcngtPnF1ZXVlLCBoZHIpOwogCWlmICghZW50cnkpIHsKIAkJSTgwMl9ERUJVR19JTkMocngtPmxvY2FsLT5yeF9oYW5kbGVyc19kcm9wX2RlZnJhZyk7CiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CkBAIC05MjQsMTEgKzkyNywxMSBAQAogCQltZW1jcHkoZW50cnktPmxhc3RfcG4sIHBuLCBDQ01QX1BOX0xFTik7CiAJfQogCi0Jc2tiX3B1bGwocngtPnNrYiwgaWVlZTgwMjExX2dldF9oZHJsZW4ocngtPmZjKSk7CisJc2tiX3B1bGwocngtPnNrYiwgaWVlZTgwMjExX2hkcmxlbihmYykpOwogCV9fc2tiX3F1ZXVlX3RhaWwoJmVudHJ5LT5za2JfbGlzdCwgcngtPnNrYik7CiAJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CiAJZW50cnktPmV4dHJhX2xlbiArPSByeC0+c2tiLT5sZW47Ci0JaWYgKHJ4LT5mYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgeworCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpIHsKIAkJcngtPnNrYiA9IE5VTEw7CiAJCXJldHVybiBSWF9RVUVVRUQ7CiAJfQpAQCAtOTY4LDE1ICs5NzEsMTQgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBub19wZW5kaW5nX3BrdHM7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisJX19sZTE2IGZjID0gKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXJ4LT5za2ItPmRhdGEpLT5mcmFtZV9jb250cm9sOwogCi0JaWYgKGxpa2VseSghcngtPnN0YSB8fAotCQkgICAocngtPmZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICE9IElFRUU4MDIxMV9GVFlQRV9DVEwgfHwKLQkJICAgKHJ4LT5mYyAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSAhPSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMIHx8CisJaWYgKGxpa2VseSghcngtPnN0YSB8fCAhaWVlZTgwMjExX2lzX3BzcG9sbChmYykgfHwKIAkJICAgIShyeC0+ZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKSkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCi0JaWYgKChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVApICYmCi0JICAgIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfVkxBTikpCisJaWYgKChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApICYmCisJICAgIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikpCiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCiAJc2tiID0gc2tiX2RlcXVldWUoJnJ4LT5zdGEtPnR4X2ZpbHRlcmVkKTsKQEAgLTEwMDAsNyArMTAwMiw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9QU19ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiU1RBICVzIGFpZCAlZDogUFMgUG9sbCAoZW50cmllcyBhZnRlciAlZClcbiIsCi0JCSAgICAgICBwcmludF9tYWMobWFjLCByeC0+c3RhLT5hZGRyKSwgcngtPnN0YS0+YWlkLAorCQkgICAgICAgcHJpbnRfbWFjKG1hYywgcngtPnN0YS0+c3RhLmFkZHIpLCByeC0+c3RhLT5zdGEuYWlkLAogCQkgICAgICAgc2tiX3F1ZXVlX2xlbigmcngtPnN0YS0+cHNfdHhfYnVmKSk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfUFNfREVCVUcgKi8KIApAQCAtMTAyNSw3ICsxMDI3LDcgQEAKIAkJICovCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogU1RBICVzIHNlbnQgUFMgUG9sbCBldmVuICIKIAkJICAgICAgICJ0aG91Z2ggdGhlcmUgYXJlIG5vIGJ1ZmZlcmVkIGZyYW1lcyBmb3IgaXRcbiIsCi0JCSAgICAgICByeC0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCByeC0+c3RhLT5hZGRyKSk7CisJCSAgICAgICByeC0+ZGV2LT5uYW1lLCBwcmludF9tYWMobWFjLCByeC0+c3RhLT5zdGEuYWRkcikpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHICovCiAJfQogCkBAIC0xMDUwLDcgKzEwNTIsNiBAQAogCQlpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCkgLSBJRUVFODAyMTFfUU9TX0NUTF9MRU4pOwogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYl9wdWxsKHJ4LT5za2IsIElFRUU4MDIxMV9RT1NfQ1RMX0xFTik7CiAJLyogY2hhbmdlIGZyYW1lIHR5cGUgdG8gbm9uIFFPUyAqLwotCXJ4LT5mYyAmPSB+SUVFRTgwMjExX1NUWVBFX1FPU19EQVRBOwogCWhkci0+ZnJhbWVfY29udHJvbCAmPSB+Y3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKTsKIAogCXJldHVybiBSWF9DT05USU5VRTsKQEAgLTEwNjcsNyArMTA2OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWllZWU4MDIxMV9kcm9wX3VuZW5jcnlwdGVkKHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCitpZWVlODAyMTFfZHJvcF91bmVuY3J5cHRlZChzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4LCBfX2xlMTYgZmMpCiB7CiAJLyoKIAkgKiBQYXNzIHRocm91Z2ggdW5lbmNyeXB0ZWQgZnJhbWVzIGlmIHRoZSBoYXJkd2FyZSBoYXMKQEAgLTEwNzcsOSArMTA3OCw4IEBACiAJCXJldHVybiAwOwogCiAJLyogRHJvcCB1bmVuY3J5cHRlZCBmcmFtZXMgaWYga2V5IGlzIHNldC4gKi8KLQlpZiAodW5saWtlbHkoIShyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpICYmCi0JCSAgICAgKHJ4LT5mYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSAmJgotCQkgICAgIChyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DICYmCisJaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChmYykgJiYKKwkJICAgICAhaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSAmJgogCQkgICAgIChyeC0+a2V5IHx8IHJ4LT5zZGF0YS0+ZHJvcF91bmVuY3J5cHRlZCkpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIApAQCAtMTA5MSw3ICsxMDkxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcngtPmRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHJ4LT5za2ItPmRhdGE7Ci0JdTE2IGZjLCBoZHJsZW4sIGV0aGVydHlwZTsKKwl1MTYgaGRybGVuLCBldGhlcnR5cGU7CiAJdTggKnBheWxvYWQ7CiAJdTggZHN0W0VUSF9BTEVOXTsKIAl1OCBzcmNbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTsKQEAgLTExMDIsMTYgKzExMDIsMTAgQEAKIAlERUNMQVJFX01BQ19CVUYobWFjMyk7CiAJREVDTEFSRV9NQUNfQlVGKG1hYzQpOwogCi0JZmMgPSByeC0+ZmM7Ci0KLQlpZiAodW5saWtlbHkoIVdMQU5fRkNfREFUQV9QUkVTRU5UKGZjKSkpCisJaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpKQogCQlyZXR1cm4gLTE7CiAKLQloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYyk7Ci0KLQlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKLQkJaGRybGVuICs9IGllZWU4MDIxMV9nZXRfbWVzaF9oZHJsZW4oCi0JCQkJKHN0cnVjdCBpZWVlODAyMTFzX2hkciAqKSAoc2tiLT5kYXRhICsgaGRybGVuKSk7CisJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCiAJLyogY29udmVydCBJRUVFIDgwMi4xMSBoZWFkZXIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0CiAJICogaGVhZGVyCkBAIC0xMTIyLDQyICsxMTE2LDM4IEBACiAJICogICAxICAgICAwICAgQlNTSUQgU0EgICAgREEgICAgbi9hCiAJICogICAxICAgICAxICAgUkEgICAgVEEgICAgREEgICAgU0EKIAkgKi8KKwltZW1jcHkoZHN0LCBpZWVlODAyMTFfZ2V0X0RBKGhkciksIEVUSF9BTEVOKTsKKwltZW1jcHkoc3JjLCBpZWVlODAyMTFfZ2V0X1NBKGhkciksIEVUSF9BTEVOKTsKIAotCXN3aXRjaCAoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpIHsKLQljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6Ci0JCS8qIEJTU0lEIFNBIERBICovCi0JCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOwotCi0JCWlmICh1bmxpa2VseShzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgJiYKLQkJCSAgICAgc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1ZMQU4pKQorCXN3aXRjaCAoaGRyLT5mcmFtZV9jb250cm9sICYKKwkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpIHsKKwljYXNlIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk6CisJCWlmICh1bmxpa2VseShzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJCSAgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pKQogCQkJcmV0dXJuIC0xOwogCQlicmVhazsKLQljYXNlIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKToKLQkJLyogUkEgVEEgREEgU0EgKi8KLQkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOwotCQltZW1jcHkoc3JjLCBoZHItPmFkZHI0LCBFVEhfQUxFTik7Ci0KLQkJIGlmICh1bmxpa2VseShzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfV0RTICYmCi0JCQkgICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UKSkKKwljYXNlIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUyk6CisJCWlmICh1bmxpa2VseShzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfV0RTICYmCisJCQkgICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSkKIAkJCXJldHVybiAtMTsKKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFzX2hkciAqbWVzaGRyID0gKHN0cnVjdCBpZWVlODAyMTFzX2hkciAqKQorCQkJCShza2ItPmRhdGEgKyBoZHJsZW4pOworCQkJaGRybGVuICs9IGllZWU4MDIxMV9nZXRfbWVzaF9oZHJsZW4obWVzaGRyKTsKKwkJCWlmIChtZXNoZHItPmZsYWdzICYgTUVTSF9GTEFHU19BRV9BNV9BNikgeworCQkJCW1lbWNweShkc3QsIG1lc2hkci0+ZWFkZHIxLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KHNyYywgbWVzaGRyLT5lYWRkcjIsIEVUSF9BTEVOKTsKKwkJCX0KKwkJfQogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKLQkJLyogREEgQlNTSUQgU0EgKi8KLQkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwotCQltZW1jcHkoc3JjLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7Ci0KLQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKKwljYXNlIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKToKKwkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CiAJCSAgICAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSAmJgogCQkgICAgICFjb21wYXJlX2V0aGVyX2FkZHIoc3JjLCBkZXYtPmRldl9hZGRyKSkpCiAJCQlyZXR1cm4gLTE7CiAJCWJyZWFrOwotCWNhc2UgMDoKLQkJLyogREEgU0EgQlNTSUQgKi8KLQkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwotCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0KLQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCWNhc2UgX19jb25zdGFudF9jcHVfdG9fbGUxNigwKToKKwkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCXJldHVybiAtMTsKIAkJYnJlYWs7CiAJfQpAQCAtMTE5Myw3ICsxMTgzLDcgQEAKIC8qCiAgKiByZXF1aXJlcyB0aGF0IHJ4LT5za2IgaXMgYSBmcmFtZSB3aXRoIGV0aGVybmV0IGhlYWRlcgogICovCi1zdGF0aWMgYm9vbCBpZWVlODAyMTFfZnJhbWVfYWxsb3dlZChzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQorc3RhdGljIGJvb2wgaWVlZTgwMjExX2ZyYW1lX2FsbG93ZWQoc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhICpyeCwgX19sZTE2IGZjKQogewogCXN0YXRpYyBjb25zdCB1OCBwYWVfZ3JvdXBfYWRkcltFVEhfQUxFTl0gX19hbGlnbmVkKDIpCiAJCT0geyAweDAxLCAweDgwLCAweEMyLCAweDAwLCAweDAwLCAweDAzIH07CkBAIC0xMjA5LDcgKzExOTksNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmIChpZWVlODAyMTFfODAyXzF4X3BvcnRfY29udHJvbChyeCkgfHwKLQkgICAgaWVlZTgwMjExX2Ryb3BfdW5lbmNyeXB0ZWQocngpKQorCSAgICBpZWVlODAyMTFfZHJvcF91bmVuY3J5cHRlZChyeCwgZmMpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTEyMzEsOCArMTIyMSw5IEBACiAJc2tiID0gcngtPnNrYjsKIAl4bWl0X3NrYiA9IE5VTEw7CiAKLQlpZiAobG9jYWwtPmJyaWRnZV9wYWNrZXRzICYmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVAgfHwKLQkJCQkgICAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfVkxBTikgJiYKKwlpZiAoKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCSAgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pICYmCisJICAgICEoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX0RPTlRfQlJJREdFX1BBQ0tFVFMpICYmCiAJICAgIChyeC0+ZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKSB7CiAJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihlaGRyLT5oX2Rlc3QpKSB7CiAJCQkvKgpAQCAtMTI3OSwyMCArMTI3MCwyMSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByeC0+ZGV2OwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gcngtPmxvY2FsOwotCXUxNiBmYywgZXRoZXJ0eXBlOworCXUxNiBldGhlcnR5cGU7CiAJdTggKnBheWxvYWQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2IsICpmcmFtZSA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CiAJY29uc3Qgc3RydWN0IGV0aGhkciAqZXRoOwogCWludCByZW1haW5pbmcsIGVycjsKIAl1OCBkc3RbRVRIX0FMRU5dOwogCXU4IHNyY1tFVEhfQUxFTl07CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKLQlmYyA9IHJ4LT5mYzsKLQlpZiAodW5saWtlbHkoKGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICE9IElFRUU4MDIxMV9GVFlQRV9EQVRBKSkKKwlpZiAodW5saWtlbHkoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkpCiAJCXJldHVybiBSWF9DT05USU5VRTsKIAotCWlmICh1bmxpa2VseSghV0xBTl9GQ19EQVRBX1BSRVNFTlQoZmMpKSkKKwlpZiAodW5saWtlbHkoIWllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoZmMpKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAogCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9BTVNEVSkpCkBAIC0xMzc0LDcgKzEzNjYsNyBAQAogCQkJbWVtY3B5KHNrYl9wdXNoKGZyYW1lLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOwogCQl9CiAKLQkJaWYgKCFpZWVlODAyMTFfZnJhbWVfYWxsb3dlZChyeCkpIHsKKwkJaWYgKCFpZWVlODAyMTFfZnJhbWVfYWxsb3dlZChyeCwgZmMpKSB7CiAJCQlpZiAoc2tiID09IGZyYW1lKSAvKiBsYXN0IGZyYW1lICovCiAJCQkJcmV0dXJuIFJYX0RST1BfVU5VU0FCTEU7CiAJCQlkZXZfa2ZyZWVfc2tiKGZyYW1lKTsKQEAgLTEzODcsNyArMTM3OSw4IEBACiAJcmV0dXJuIFJYX1FVRVVFRDsKIH0KIAotc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAorc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQKIGllZWU4MDIxMV9yeF9oX21lc2hfZndkaW5nKHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKQEAgLTE0MDYsNiArMTM5OSwyNSBAQAogCQkvKiBpbGxlZ2FsIGZyYW1lICovCiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKKwlpZiAobWVzaF9oZHItPmZsYWdzICYgTUVTSF9GTEFHU19BRV9BNV9BNil7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCQlzdHJ1Y3QgbWVzaF9wYXRoICptcHBhdGg7CisKKwkJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihyeC0+ZGV2KTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQltcHBhdGggPSBtcHBfcGF0aF9sb29rdXAobWVzaF9oZHItPmVhZGRyMiwgc2RhdGEpOworCQlpZiAoIW1wcGF0aCkgeworCQkJbXBwX3BhdGhfYWRkKG1lc2hfaGRyLT5lYWRkcjIsIGhkci0+YWRkcjQsIHNkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19iaCgmbXBwYXRoLT5zdGF0ZV9sb2NrKTsKKwkJCW1wcGF0aC0+ZXhwX3RpbWUgPSBqaWZmaWVzOworCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihtcHBhdGgtPm1wcCwgaGRyLT5hZGRyNCkgIT0gMCkKKwkJCQltZW1jcHkobXBwYXRoLT5tcHAsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZtcHBhdGgtPnN0YXRlX2xvY2spOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKwogCWlmIChjb21wYXJlX2V0aGVyX2FkZHIocngtPmRldi0+ZGV2X2FkZHIsIGhkci0+YWRkcjMpID09IDApCiAJCXJldHVybiBSWF9DT05USU5VRTsKIApAQCAtMTQxMyw3ICsxNDI1LDcgQEAKIAogCWlmIChyeC0+ZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpIHsKIAkJaWYgKCFtZXNoX2hkci0+dHRsKQotCQkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQygmcngtPnNkYXRhLT51LnN0YSwKKwkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnJ4LT5zZGF0YS0+dS5tZXNoLAogCQkJCQkJICAgICBkcm9wcGVkX2ZyYW1lc190dGwpOwogCQllbHNlIHsKIAkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpmd2RfaGRyOwpAQCAtMTQ0MiwyNyArMTQ1NCwyNyBAQAogCWVsc2UKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIH0KLQorI2VuZGlmCiAKIHN0YXRpYyBpZWVlODAyMTFfcnhfcmVzdWx0IGRlYnVnX25vaW5saW5lCiBpZWVlODAyMTFfcnhfaF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ4LT5kZXY7Ci0JdTE2IGZjOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilyeC0+c2tiLT5kYXRhOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKIAlpbnQgZXJyOwogCi0JZmMgPSByeC0+ZmM7Ci0JaWYgKHVubGlrZWx5KChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSAhPSBJRUVFODAyMTFfRlRZUEVfREFUQSkpCisJaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCi0JaWYgKHVubGlrZWx5KCFXTEFOX0ZDX0RBVEFfUFJFU0VOVChmYykpKQorCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2lzX2RhdGFfcHJlc2VudChoZHItPmZyYW1lX2NvbnRyb2wpKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAogCWVyciA9IGllZWU4MDIxMV9kYXRhX3RvXzgwMjMocngpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKIAotCWlmICghaWVlZTgwMjExX2ZyYW1lX2FsbG93ZWQocngpKQorCWlmICghaWVlZTgwMjExX2ZyYW1lX2FsbG93ZWQocngsIGZjKSkKIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAogCXJ4LT5za2ItPmRldiA9IGRldjsKQEAgLTE1MjAsMjIgKzE1MzIsOTcgQEAKIH0KIAogc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKLWllZWU4MDIxMV9yeF9oX21nbXQoc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhICpyeCkKK2llZWU4MDIxMV9yeF9oX2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQogewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gcngtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYocngtPmRldik7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSByeC0+c2tiLT5kYXRhOworCWludCBsZW4gPSByeC0+c2tiLT5sZW47CisKKwlpZiAoIWllZWU4MDIxMV9pc19hY3Rpb24obWdtdC0+ZnJhbWVfY29udHJvbCkpCisJCXJldHVybiBSWF9DT05USU5VRTsKKworCWlmICghcngtPnN0YSkKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAogCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKHJ4LT5kZXYpOwotCWlmICgoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSB8fAotCSAgICAgc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgfHwKLQkgICAgIHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UKSAmJgotCSAgICAhKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9VU0VSU1BBQ0VfTUxNRSkpCi0JCWllZWU4MDIxMV9zdGFfcnhfbWdtdChyeC0+ZGV2LCByeC0+c2tiLCByeC0+c3RhdHVzKTsKLQllbHNlCisJLyogYWxsIGNhdGVnb3JpZXMgd2UgY3VycmVudGx5IGhhbmRsZSBoYXZlIGFjdGlvbl9jb2RlICovCisJaWYgKGxlbiA8IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAxKQogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCisJLyoKKwkgKiBGSVhNRTogcmV2aXNpdCB0aGlzLCBJJ20gc3VyZSB3ZSBzaG91bGQgaGFuZGxlIG1vc3QKKwkgKgkgIG9mIHRoZXNlIGZyYW1lcyBpbiBvdGhlciBtb2RlcyBhcyB3ZWxsIQorCSAqLworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCXJldHVybiBSWF9DT05USU5VRTsKKworCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkpIHsKKwljYXNlIFdMQU5fQ0FURUdPUllfQkFDSzoKKwkJc3dpdGNoIChtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSkgeworCQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFUToKKwkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCisJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxKSkpCisJCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwkJCWllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3JlcXVlc3QobG9jYWwsIHJ4LT5zdGEsIG1nbXQsIGxlbik7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0FDVElPTl9BRERCQV9SRVNQOgorCQkJaWYgKGxlbiA8IChJRUVFODAyMTFfTUlOX0FDVElPTl9TSVpFICsKKwkJCQkgICBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwKSkpCisJCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwkJCWllZWU4MDIxMV9wcm9jZXNzX2FkZGJhX3Jlc3AobG9jYWwsIHJ4LT5zdGEsIG1nbXQsIGxlbik7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0FDVElPTl9ERUxCQToKKwkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCisJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuZGVsYmEpKSkKKwkJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCQkJaWVlZTgwMjExX3Byb2Nlc3NfZGVsYmEoc2RhdGEsIHJ4LT5zdGEsIG1nbXQsIGxlbik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFdMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDoKKwkJaWYgKGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisJCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5hY3Rpb25fY29kZSkgeworCQljYXNlIFdMQU5fQUNUSU9OX1NQQ1RfTVNSX1JFUToKKwkJCWlmIChsZW4gPCAoSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArCisJCQkJICAgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQpKSkKKwkJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCQkJaWVlZTgwMjExX3Byb2Nlc3NfbWVhc3VyZW1lbnRfcmVxKHNkYXRhLCBtZ210LCBsZW4pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFJYX0NPTlRJTlVFOworCX0KKworCXJ4LT5zdGEtPnJ4X3BhY2tldHMrKzsKKwlkZXZfa2ZyZWVfc2tiKHJ4LT5za2IpOworCXJldHVybiBSWF9RVUVVRUQ7Cit9CisKK3N0YXRpYyBpZWVlODAyMTFfcnhfcmVzdWx0IGRlYnVnX25vaW5saW5lCitpZWVlODAyMTFfcnhfaF9tZ210KHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihyeC0+ZGV2KTsKKworCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisKKwlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKKwkJcmV0dXJuIGllZWU4MDIxMV9tZXNoX3J4X21nbXQoc2RhdGEsIHJ4LT5za2IsIHJ4LT5zdGF0dXMpOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKworCWlmIChzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfVVNFUlNQQUNFX01MTUUpCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisKKwlpZWVlODAyMTFfc3RhX3J4X21nbXQoc2RhdGEsIHJ4LT5za2IsIHJ4LT5zdGF0dXMpOwogCXJldHVybiBSWF9RVUVVRUQ7CiB9CiAKQEAgLTE1NjUsNyArMTY1Miw3IEBACiAJaWYgKCFpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlnb3RvIGlnbm9yZTsKIAotCWlmIChyeC0+c2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQICYmIGtleWlkeCkgeworCWlmIChyeC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmIGtleWlkeCkgewogCQkvKgogCQkgKiBBUHMgd2l0aCBwYWlyd2lzZSBrZXlzIHNob3VsZCBuZXZlciByZWNlaXZlIE1pY2hhZWwgTUlDCiAJCSAqIGVycm9ycyBmb3Igbm9uLXplcm8ga2V5aWR4IGJlY2F1c2UgdGhlc2UgYXJlIHJlc2VydmVkIGZvcgpAQCAtMTU3OSw3ICsxNjY2LDcgQEAKIAkgICAgIWllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCWdvdG8gaWdub3JlOwogCi0JbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShyeC0+ZGV2LCBrZXlpZHgsIGhkcik7CisJbWFjODAyMTFfZXZfbWljaGFlbF9taWNfZmFpbHVyZShyeC0+c2RhdGEsIGtleWlkeCwgaGRyKTsKICBpZ25vcmU6CiAJZGV2X2tmcmVlX3NrYihyeC0+c2tiKTsKIAlyeC0+c2tiID0gTlVMTDsKQEAgLTE2MzUsNyArMTcyMiw3IEBACiAJCWlmICghbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUiB8fAorCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IgfHwKIAkJICAgICEoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykpCiAJCQljb250aW51ZTsKIApAQCAtMTY5NCwxMCArMTc4MSwxMyBAQAogCS8qIG11c3QgYmUgYWZ0ZXIgTU1JQyB2ZXJpZnkgc28gaGVhZGVyIGlzIGNvdW50ZWQgaW4gTVBEVSBtaWMgKi8KIAlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9yZW1vdmVfcW9zX2NvbnRyb2wpCiAJQ0FMTF9SWEgoaWVlZTgwMjExX3J4X2hfYW1zZHUpCisjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIAlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkKIAkJQ0FMTF9SWEgoaWVlZTgwMjExX3J4X2hfbWVzaF9md2RpbmcpOworI2VuZGlmCiAJQ0FMTF9SWEgoaWVlZTgwMjExX3J4X2hfZGF0YSkKIAlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9jdHJsKQorCUNBTExfUlhIKGllZWU4MDIxMV9yeF9oX2FjdGlvbikKIAlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9tZ210KQogCiAjdW5kZWYgQ0FMTF9SWEgKQEAgLTE3MzMsNyArMTgyMyw3IEBACiAJaW50IG11bHRpY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOwogCiAJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWlmICghYnNzaWQpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKCFpZWVlODAyMTFfYnNzaWRfbWF0Y2goYnNzaWQsIHNkYXRhLT51LnN0YS5ic3NpZCkpIHsKQEAgLTE3NDgsMTQgKzE4MzgsMTAgQEAKIAkJCXJ4LT5mbGFncyAmPSB+SUVFRTgwMjExX1JYX1JBX01BVENIOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlpZiAoIWJzc2lkKQogCQkJcmV0dXJuIDA7CiAJCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCWlmICghcngtPnN0YSkKLQkJCQlyeC0+c3RhID0gaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YS0+ZGV2LAotCQkJCQkJcngtPnNrYiwgYnNzaWQsIGhkci0+YWRkcjIsCi0JCQkJCQlCSVQocngtPnN0YXR1cy0+cmF0ZV9pZHgpKTsKIAkJCXJldHVybiAxOwogCQl9CiAJCWVsc2UgaWYgKCFpZWVlODAyMTFfYnNzaWRfbWF0Y2goYnNzaWQsIHNkYXRhLT51LnN0YS5ic3NpZCkpIHsKQEAgLTE3NjksMTEgKzE4NTUsMTEgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCXJ4LT5mbGFncyAmPSB+SUVFRTgwMjExX1JYX1JBX01BVENIOwogCQl9IGVsc2UgaWYgKCFyeC0+c3RhKQotCQkJcngtPnN0YSA9IGllZWU4MDIxMV9pYnNzX2FkZF9zdGEoc2RhdGEtPmRldiwgcngtPnNrYiwKKwkJCXJ4LT5zdGEgPSBpZWVlODAyMTFfaWJzc19hZGRfc3RhKHNkYXRhLCByeC0+c2tiLAogCQkJCQkJYnNzaWQsIGhkci0+YWRkcjIsCiAJCQkJCQlCSVQocngtPnN0YXR1cy0+cmF0ZV9pZHgpKTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJaWYgKCFtdWx0aWNhc3QgJiYKIAkJICAgIGNvbXBhcmVfZXRoZXJfYWRkcihzZGF0YS0+ZGV2LT5kZXZfYWRkciwKIAkJCQkgICAgICAgaGRyLT5hZGRyMSkgIT0gMCkgewpAQCAtMTc4Myw4ICsxODY5LDggQEAKIAkJCXJ4LT5mbGFncyAmPSB+SUVFRTgwMjExX1JYX1JBX01BVENIOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfVkxBTjoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQlpZiAoIWJzc2lkKSB7CiAJCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHNkYXRhLT5kZXYtPmRldl9hZGRyLAogCQkJCQkgICAgICAgaGRyLT5hZGRyMSkpCkBAIC0xNzk2LDE2ICsxODgyLDE3IEBACiAJCQlyeC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRDSDsKIAkJfQogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1dEUzoKKwljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAkJaWYgKGJzc2lkIHx8ICFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQogCQkJcmV0dXJuIDA7CiAJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyLCBoZHItPmFkZHIyKSkKIAkJCXJldHVybiAwOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX01OVFI6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCQkvKiB0YWtlIGV2ZXJ5dGhpbmcgKi8KIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JTlZBTElEOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CisJY2FzZSBfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1Q6CiAJCS8qIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwogCQlXQVJOX09OKDEpOwogCQlicmVhazsKQEAgLTE4MjcsMjMgKzE5MTQsMjAgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSByeDsKLQl1MTYgdHlwZTsKIAlpbnQgcHJlcGFyZXM7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqcHJldiA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYl9uZXc7CiAJdTggKmJzc2lkOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJbWVtc2V0KCZyeCwgMCwgc2l6ZW9mKHJ4KSk7CiAJcnguc2tiID0gc2tiOwogCXJ4LmxvY2FsID0gbG9jYWw7CiAKIAlyeC5zdGF0dXMgPSBzdGF0dXM7CiAJcngucmF0ZSA9IHJhdGU7Ci0JcnguZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXR5cGUgPSByeC5mYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFOwogCi0JaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfHwgdHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSB8fCBpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlsb2NhbC0+ZG90MTFSZWNlaXZlZEZyYWdtZW50Q291bnQrKzsKIAogCXJ4LnN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgaGRyLT5hZGRyMik7CkBAIC0xODU3LDcgKzE5NDEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVubGlrZWx5KGxvY2FsLT5zdGFfc3dfc2Nhbm5pbmcgfHwgbG9jYWwtPnN0YV9od19zY2FubmluZykpCisJaWYgKHVubGlrZWx5KGxvY2FsLT5zd19zY2FubmluZyB8fCBsb2NhbC0+aHdfc2Nhbm5pbmcpKQogCQlyeC5mbGFncyB8PSBJRUVFODAyMTFfUlhfSU5fU0NBTjsKIAogCWllZWU4MDIxMV9wYXJzZV9xb3MoJnJ4KTsKQEAgLTE4NjksNyArMTk1Myw3IEBACiAJCWlmICghbmV0aWZfcnVubmluZyhzZGF0YS0+ZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfTU5UUikKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQkJY29udGludWU7CiAKIAkJYnNzaWQgPSBpZWVlODAyMTFfZ2V0X2Jzc2lkKGhkciwgc2tiLT5sZW4sIHNkYXRhLT52aWYudHlwZSk7CkBAIC0xOTA0LDE0ICsxOTg4LDEyIEBACiAJCQkJICAgICAgIHByZXYtPmRldi0+bmFtZSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlyeC5mYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CiAJCWllZWU4MDIxMV9pbnZva2VfcnhfaGFuZGxlcnMocHJldiwgJnJ4LCBza2JfbmV3KTsKIAkJcHJldiA9IHNkYXRhOwogCX0KLQlpZiAocHJldikgewotCQlyeC5mYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisJaWYgKHByZXYpCiAJCWllZWU4MDIxMV9pbnZva2VfcnhfaGFuZGxlcnMocHJldiwgJnJ4LCBza2IpOwotCX0gZWxzZQorCWVsc2UKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogfQogCkBAIC0yMDgwLDcgKzIxNjIsNyBAQAogCS8qIGlmIHRoaXMgbXBkdSBpcyBmcmFnbWVudGVkIC0gdGVybWluYXRlIHJ4IGFnZ3JlZ2F0aW9uIHNlc3Npb24gKi8KIAlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpOwogCWlmIChzYyAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpIHsKLQkJaWVlZTgwMjExX3N0YV9zdG9wX3J4X2JhX3Nlc3Npb24oc3RhLT5zZGF0YS0+ZGV2LCBzdGEtPmFkZHIsCisJCWllZWU4MDIxMV9zdGFfc3RvcF9yeF9iYV9zZXNzaW9uKHN0YS0+c2RhdGEsIHN0YS0+c3RhLmFkZHIsCiAJCQl0aWQsIDAsIFdMQU5fUkVBU09OX1FTVEFfUkVRVUlSRV9TRVRVUCk7CiAJCXJldCA9IDE7CiAJCWdvdG8gZW5kX3Jlb3JkZXI7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc2Nhbi5jIGIvbmV0L21hYzgwMjExL3NjYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZiYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21hYzgwMjExL3NjYW4uYwpAQCAtMCwwICsxLDkzOCBAQAorLyoKKyAqIFNjYW5uaW5nIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IDIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAyMDA0LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNSwgRGV2aWNlc2NhcGUgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTIwMDcJSmlyaSBCZW5jIDxqYmVuY0BzdXNlLmN6PgorICogQ29weXJpZ2h0IDIwMDcsIE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyogVE9ETzoKKyAqIG9yZGVyIEJTUyBsaXN0IGJ5IFJTU0koPykgKCJxdWFsaXR5IG9mIEFQIikKKyAqIHNjYW4gcmVzdWx0IHRhYmxlIGZpbHRlcmluZyAoYnkgY2FwYWJpbGl0eSAocHJpdmFjeSwgSUJTUy9CU1MsIFdQQS9SU04gSUUsCisgKiAgICBTU0lEKQorICovCisKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgorI2luY2x1ZGUgIm1lc2guaCIKKworI2RlZmluZSBJRUVFODAyMTFfUFJPQkVfREVMQVkgKEhaIC8gMzMpCisjZGVmaW5lIElFRUU4MDIxMV9DSEFOTkVMX1RJTUUgKEhaIC8gMzMpCisjZGVmaW5lIElFRUU4MDIxMV9QQVNTSVZFX0NIQU5ORUxfVElNRSAoSFogLyA1KQorCit2b2lkIGllZWU4MDIxMV9yeF9ic3NfbGlzdF9pbml0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+YnNzX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+YnNzX2xpc3QpOworfQorCit2b2lkIGllZWU4MDIxMV9yeF9ic3NfbGlzdF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCit7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzcywgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShic3MsIHRtcCwgJmxvY2FsLT5ic3NfbGlzdCwgbGlzdCkKKwkJaWVlZTgwMjExX3J4X2Jzc19wdXQobG9jYWwsIGJzcyk7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfYnNzICoKK2llZWU4MDIxMV9yeF9ic3NfZ2V0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCAqYnNzaWQsIGludCBmcmVxLAorCQkgICAgIHU4ICpzc2lkLCB1OCBzc2lkX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOworCWJzcyA9IGxvY2FsLT5ic3NfaGFzaFtTVEFfSEFTSChic3NpZCldOworCXdoaWxlIChic3MpIHsKKwkJaWYgKCFic3NfbWVzaF9jZmcoYnNzKSAmJgorCQkgICAgIW1lbWNtcChic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pICYmCisJCSAgICBic3MtPmZyZXEgPT0gZnJlcSAmJgorCQkgICAgYnNzLT5zc2lkX2xlbiA9PSBzc2lkX2xlbiAmJgorCQkgICAgKHNzaWRfbGVuID09IDAgfHwgIW1lbWNtcChic3MtPnNzaWQsIHNzaWQsIHNzaWRfbGVuKSkpIHsKKwkJCWF0b21pY19pbmMoJmJzcy0+dXNlcnMpOworCQkJYnJlYWs7CisJCX0KKwkJYnNzID0gYnNzLT5obmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJcmV0dXJuIGJzczsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBsb2NhbC0+YnNzX2xvY2sgKi8KK3N0YXRpYyB2b2lkIF9faWVlZTgwMjExX3J4X2Jzc19oYXNoX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzcykKK3sKKwl1OCBoYXNoX2lkeDsKKworCWlmIChic3NfbWVzaF9jZmcoYnNzKSkKKwkJaGFzaF9pZHggPSBtZXNoX2lkX2hhc2goYnNzX21lc2hfaWQoYnNzKSwKKwkJCQkJYnNzX21lc2hfaWRfbGVuKGJzcykpOworCWVsc2UKKwkJaGFzaF9pZHggPSBTVEFfSEFTSChic3MtPmJzc2lkKTsKKworCWJzcy0+aG5leHQgPSBsb2NhbC0+YnNzX2hhc2hbaGFzaF9pZHhdOworCWxvY2FsLT5ic3NfaGFzaFtoYXNoX2lkeF0gPSBic3M7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgbG9jYWwtPmJzc19sb2NrICovCitzdGF0aWMgdm9pZCBfX2llZWU4MDIxMV9yeF9ic3NfaGFzaF9kZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmIsICpwcmV2ID0gTlVMTDsKKwliID0gbG9jYWwtPmJzc19oYXNoW1NUQV9IQVNIKGJzcy0+YnNzaWQpXTsKKwl3aGlsZSAoYikgeworCQlpZiAoYiA9PSBic3MpIHsKKwkJCWlmICghcHJldikKKwkJCQlsb2NhbC0+YnNzX2hhc2hbU1RBX0hBU0goYnNzLT5ic3NpZCldID0KKwkJCQkJYnNzLT5obmV4dDsKKwkJCWVsc2UKKwkJCQlwcmV2LT5obmV4dCA9IGJzcy0+aG5leHQ7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gYjsKKwkJYiA9IGItPmhuZXh0OworCX0KK30KKworc3RydWN0IGllZWU4MDIxMV9ic3MgKgoraWVlZTgwMjExX3J4X2Jzc19hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHU4ICpic3NpZCwgaW50IGZyZXEsCisJCSAgICAgdTggKnNzaWQsIHU4IHNzaWRfbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CisKKwlic3MgPSBremFsbG9jKHNpemVvZigqYnNzKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFic3MpCisJCXJldHVybiBOVUxMOworCWF0b21pY19zZXQoJmJzcy0+dXNlcnMsIDIpOworCW1lbWNweShic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCWJzcy0+ZnJlcSA9IGZyZXE7CisJaWYgKHNzaWQgJiYgc3NpZF9sZW4gPD0gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgeworCQltZW1jcHkoYnNzLT5zc2lkLCBzc2lkLCBzc2lkX2xlbik7CisJCWJzcy0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJLyogVE9ETzogb3JkZXIgYnkgUlNTST8gKi8KKwlsaXN0X2FkZF90YWlsKCZic3MtPmxpc3QsICZsb2NhbC0+YnNzX2xpc3QpOworCV9faWVlZTgwMjExX3J4X2Jzc19oYXNoX2FkZChsb2NhbCwgYnNzKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmJzc19sb2NrKTsKKwlyZXR1cm4gYnNzOworfQorCisjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqCitpZWVlODAyMTFfcnhfbWVzaF9ic3NfZ2V0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCAqbWVzaF9pZCwgaW50IG1lc2hfaWRfbGVuLAorCQkJICB1OCAqbWVzaF9jZmcsIGludCBmcmVxKQoreworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJYnNzID0gbG9jYWwtPmJzc19oYXNoW21lc2hfaWRfaGFzaChtZXNoX2lkLCBtZXNoX2lkX2xlbildOworCXdoaWxlIChic3MpIHsKKwkJaWYgKGJzc19tZXNoX2NmZyhic3MpICYmCisJCSAgICAhbWVtY21wKGJzc19tZXNoX2NmZyhic3MpLCBtZXNoX2NmZywgTUVTSF9DRkdfQ01QX0xFTikgJiYKKwkJICAgIGJzcy0+ZnJlcSA9PSBmcmVxICYmCisJCSAgICBtZXNoX2lkX2xlbiA9PSBic3MtPm1lc2hfaWRfbGVuICYmCisJCSAgICAobWVzaF9pZF9sZW4gPT0gMCB8fCAhbWVtY21wKGJzcy0+bWVzaF9pZCwgbWVzaF9pZCwKKwkJCQkJCSBtZXNoX2lkX2xlbikpKSB7CisJCQlhdG9taWNfaW5jKCZic3MtPnVzZXJzKTsKKwkJCWJyZWFrOworCQl9CisJCWJzcyA9IGJzcy0+aG5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOworCXJldHVybiBic3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqCitpZWVlODAyMTFfcnhfbWVzaF9ic3NfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCAqbWVzaF9pZCwgaW50IG1lc2hfaWRfbGVuLAorCQkJICB1OCAqbWVzaF9jZmcsIGludCBtZXNoX2NvbmZpZ19sZW4sIGludCBmcmVxKQoreworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CisKKwlpZiAobWVzaF9jb25maWdfbGVuICE9IE1FU0hfQ0ZHX0xFTikKKwkJcmV0dXJuIE5VTEw7CisKKwlic3MgPSBremFsbG9jKHNpemVvZigqYnNzKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFic3MpCisJCXJldHVybiBOVUxMOworCisJYnNzLT5tZXNoX2NmZyA9IGttYWxsb2MoTUVTSF9DRkdfQ01QX0xFTiwgR0ZQX0FUT01JQyk7CisJaWYgKCFic3MtPm1lc2hfY2ZnKSB7CisJCWtmcmVlKGJzcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChtZXNoX2lkX2xlbiAmJiBtZXNoX2lkX2xlbiA8PSBJRUVFODAyMTFfTUFYX01FU0hfSURfTEVOKSB7CisJCWJzcy0+bWVzaF9pZCA9IGttYWxsb2MobWVzaF9pZF9sZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIWJzcy0+bWVzaF9pZCkgeworCQkJa2ZyZWUoYnNzLT5tZXNoX2NmZyk7CisJCQlrZnJlZShic3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtY3B5KGJzcy0+bWVzaF9pZCwgbWVzaF9pZCwgbWVzaF9pZF9sZW4pOworCX0KKworCWF0b21pY19zZXQoJmJzcy0+dXNlcnMsIDIpOworCW1lbWNweShic3MtPm1lc2hfY2ZnLCBtZXNoX2NmZywgTUVTSF9DRkdfQ01QX0xFTik7CisJYnNzLT5tZXNoX2lkX2xlbiA9IG1lc2hfaWRfbGVuOworCWJzcy0+ZnJlcSA9IGZyZXE7CisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOworCS8qIFRPRE86IG9yZGVyIGJ5IFJTU0k/ICovCisJbGlzdF9hZGRfdGFpbCgmYnNzLT5saXN0LCAmbG9jYWwtPmJzc19saXN0KTsKKwlfX2llZWU4MDIxMV9yeF9ic3NfaGFzaF9hZGQobG9jYWwsIGJzcyk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJcmV0dXJuIGJzczsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfYnNzX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzcykKK3sKKwlrZnJlZShic3MtPmllcyk7CisJa2ZyZWUoYnNzX21lc2hfaWQoYnNzKSk7CisJa2ZyZWUoYnNzX21lc2hfY2ZnKGJzcykpOworCWtmcmVlKGJzcyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3J4X2Jzc19wdXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MpCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmYnNzLT51c2VycywgJmxvY2FsLT5ic3NfbG9jaykpIHsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCXJldHVybjsKKwl9CisKKwlfX2llZWU4MDIxMV9yeF9ic3NfaGFzaF9kZWwobG9jYWwsIGJzcyk7CisJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJaWVlZTgwMjExX3J4X2Jzc19mcmVlKGJzcyk7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfYnNzICoKK2llZWU4MDIxMV9ic3NfaW5mb191cGRhdGUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKKwkJCSAgc2l6ZV90IGxlbiwKKwkJCSAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zLAorCQkJICBpbnQgZnJlcSwgYm9vbCBiZWFjb24pCit7CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKKwlpbnQgY2xlbjsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICisJaWYgKGVsZW1zLT5tZXNoX2NvbmZpZykKKwkJYnNzID0gaWVlZTgwMjExX3J4X21lc2hfYnNzX2dldChsb2NhbCwgZWxlbXMtPm1lc2hfaWQsCisJCQkJZWxlbXMtPm1lc2hfaWRfbGVuLCBlbGVtcy0+bWVzaF9jb25maWcsIGZyZXEpOworCWVsc2UKKyNlbmRpZgorCQlic3MgPSBpZWVlODAyMTFfcnhfYnNzX2dldChsb2NhbCwgbWdtdC0+YnNzaWQsIGZyZXEsCisJCQkJCSAgIGVsZW1zLT5zc2lkLCBlbGVtcy0+c3NpZF9sZW4pOworCWlmICghYnNzKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKKwkJaWYgKGVsZW1zLT5tZXNoX2NvbmZpZykKKwkJCWJzcyA9IGllZWU4MDIxMV9yeF9tZXNoX2Jzc19hZGQobG9jYWwsIGVsZW1zLT5tZXNoX2lkLAorCQkJCWVsZW1zLT5tZXNoX2lkX2xlbiwgZWxlbXMtPm1lc2hfY29uZmlnLAorCQkJCWVsZW1zLT5tZXNoX2NvbmZpZ19sZW4sIGZyZXEpOworCQllbHNlCisjZW5kaWYKKwkJCWJzcyA9IGllZWU4MDIxMV9yeF9ic3NfYWRkKGxvY2FsLCBtZ210LT5ic3NpZCwgZnJlcSwKKwkJCQkJCSAgZWxlbXMtPnNzaWQsIGVsZW1zLT5zc2lkX2xlbik7CisJCWlmICghYnNzKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKyNpZiAwCisJCS8qIFRPRE86IG9yZGVyIGJ5IFJTU0k/ICovCisJCXNwaW5fbG9ja19iaCgmbG9jYWwtPmJzc19sb2NrKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmJzcy0+bGlzdCwgJmxvY2FsLT5ic3NfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+YnNzX2xvY2spOworI2VuZGlmCisJfQorCisJLyogc2F2ZSB0aGUgRVJQIHZhbHVlIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIGF0IGFzc29jaWF0aW9uIHRpbWUgKi8KKwlpZiAoZWxlbXMtPmVycF9pbmZvICYmIGVsZW1zLT5lcnBfaW5mb19sZW4gPj0gMSkgeworCQlic3MtPmVycF92YWx1ZSA9IGVsZW1zLT5lcnBfaW5mb1swXTsKKwkJYnNzLT5oYXNfZXJwX3ZhbHVlID0gMTsKKwl9CisKKwlic3MtPmJlYWNvbl9pbnQgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5iZWFjb25faW50KTsKKwlic3MtPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKKworCWlmIChlbGVtcy0+dGltKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfdGltX2llICp0aW1faWUgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfdGltX2llICopZWxlbXMtPnRpbTsKKwkJYnNzLT5kdGltX3BlcmlvZCA9IHRpbV9pZS0+ZHRpbV9wZXJpb2Q7CisJfQorCisJLyogc2V0IGRlZmF1bHQgdmFsdWUgZm9yIGJ1Z2d5IEFQcyAqLworCWlmICghZWxlbXMtPnRpbSB8fCBic3MtPmR0aW1fcGVyaW9kID09IDApCisJCWJzcy0+ZHRpbV9wZXJpb2QgPSAxOworCisJYnNzLT5zdXBwX3JhdGVzX2xlbiA9IDA7CisJaWYgKGVsZW1zLT5zdXBwX3JhdGVzKSB7CisJCWNsZW4gPSBJRUVFODAyMTFfTUFYX1NVUFBfUkFURVMgLSBic3MtPnN1cHBfcmF0ZXNfbGVuOworCQlpZiAoY2xlbiA+IGVsZW1zLT5zdXBwX3JhdGVzX2xlbikKKwkJCWNsZW4gPSBlbGVtcy0+c3VwcF9yYXRlc19sZW47CisJCW1lbWNweSgmYnNzLT5zdXBwX3JhdGVzW2Jzcy0+c3VwcF9yYXRlc19sZW5dLCBlbGVtcy0+c3VwcF9yYXRlcywKKwkJICAgICAgIGNsZW4pOworCQlic3MtPnN1cHBfcmF0ZXNfbGVuICs9IGNsZW47CisJfQorCWlmIChlbGVtcy0+ZXh0X3N1cHBfcmF0ZXMpIHsKKwkJY2xlbiA9IElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUyAtIGJzcy0+c3VwcF9yYXRlc19sZW47CisJCWlmIChjbGVuID4gZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbikKKwkJCWNsZW4gPSBlbGVtcy0+ZXh0X3N1cHBfcmF0ZXNfbGVuOworCQltZW1jcHkoJmJzcy0+c3VwcF9yYXRlc1tic3MtPnN1cHBfcmF0ZXNfbGVuXSwKKwkJICAgICAgIGVsZW1zLT5leHRfc3VwcF9yYXRlcywgY2xlbik7CisJCWJzcy0+c3VwcF9yYXRlc19sZW4gKz0gY2xlbjsKKwl9CisKKwlic3MtPmJhbmQgPSByeF9zdGF0dXMtPmJhbmQ7CisKKwlic3MtPnRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KG1nbXQtPnUuYmVhY29uLnRpbWVzdGFtcCk7CisJYnNzLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7CisJYnNzLT5zaWduYWwgPSByeF9zdGF0dXMtPnNpZ25hbDsKKwlic3MtPm5vaXNlID0gcnhfc3RhdHVzLT5ub2lzZTsKKwlic3MtPnF1YWwgPSByeF9zdGF0dXMtPnF1YWw7CisJYnNzLT53bW1fdXNlZCA9IGVsZW1zLT53bW1fcGFyYW0gfHwgZWxlbXMtPndtbV9pbmZvOworCisJaWYgKCFiZWFjb24pCisJCWJzcy0+bGFzdF9wcm9iZV9yZXNwID0gamlmZmllczsKKworCS8qCisJICogRm9yIHByb2JlIHJlc3BvbnNlcywgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgaW5mb3JtYXRpb24geWV0LAorCSAqIHVzZSB0aGUgSUVzIGZyb20gdGhlIGJlYWNvbi4KKwkgKi8KKwlpZiAoIWJzcy0+aWVzIHx8ICFiZWFjb24pIHsKKwkJaWYgKGJzcy0+aWVzID09IE5VTEwgfHwgYnNzLT5pZXNfbGVuIDwgZWxlbXMtPnRvdGFsX2xlbikgeworCQkJa2ZyZWUoYnNzLT5pZXMpOworCQkJYnNzLT5pZXMgPSBrbWFsbG9jKGVsZW1zLT50b3RhbF9sZW4sIEdGUF9BVE9NSUMpOworCQl9CisJCWlmIChic3MtPmllcykgeworCQkJbWVtY3B5KGJzcy0+aWVzLCBlbGVtcy0+aWVfc3RhcnQsIGVsZW1zLT50b3RhbF9sZW4pOworCQkJYnNzLT5pZXNfbGVuID0gZWxlbXMtPnRvdGFsX2xlbjsKKwkJfSBlbHNlCisJCQlic3MtPmllc19sZW4gPSAwOworCX0KKworCXJldHVybiBic3M7Cit9CisKK2llZWU4MDIxMV9yeF9yZXN1bHQKK2llZWU4MDIxMV9zY2FuX3J4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OworCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7CisJdTggKmVsZW1lbnRzOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKKwlzaXplX3QgYmFzZWxlbjsKKwlpbnQgZnJlcTsKKwlfX2xlMTYgZmM7CisJYm9vbCBwcmVzcCwgYmVhY29uID0gZmFsc2U7CisJc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgZWxlbXM7CisKKwlpZiAoc2tiLT5sZW4gPCAyKQorCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKKworCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKKwlmYyA9IG1nbXQtPmZyYW1lX2NvbnRyb2w7CisKKwlpZiAoaWVlZTgwMjExX2lzX2N0bChmYykpCisJCXJldHVybiBSWF9DT05USU5VRTsKKworCWlmIChza2ItPmxlbiA8IDI0KQorCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCisJcHJlc3AgPSBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYyk7CisJaWYgKHByZXNwKSB7CisJCS8qIGlnbm9yZSBQcm9iZVJlc3AgdG8gZm9yZWlnbiBhZGRyZXNzICovCisJCWlmIChtZW1jbXAobWdtdC0+ZGEsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCisJCXByZXNwID0gdHJ1ZTsKKwkJZWxlbWVudHMgPSBtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGU7CisJCWJhc2VsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7CisJfSBlbHNlIHsKKwkJYmVhY29uID0gaWVlZTgwMjExX2lzX2JlYWNvbihmYyk7CisJCWJhc2VsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKKwkJZWxlbWVudHMgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKKwl9CisKKwlpZiAoIXByZXNwICYmICFiZWFjb24pCisJCXJldHVybiBSWF9DT05USU5VRTsKKworCWlmIChiYXNlbGVuID4gc2tiLT5sZW4pCisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisKKwlpZWVlODAyXzExX3BhcnNlX2VsZW1zKGVsZW1lbnRzLCBza2ItPmxlbiAtIGJhc2VsZW4sICZlbGVtcyk7CisKKwlpZiAoZWxlbXMuZHNfcGFyYW1zICYmIGVsZW1zLmRzX3BhcmFtc19sZW4gPT0gMSkKKwkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShlbGVtcy5kc19wYXJhbXNbMF0pOworCWVsc2UKKwkJZnJlcSA9IHJ4X3N0YXR1cy0+ZnJlcTsKKworCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoc2RhdGEtPmxvY2FsLT5ody53aXBoeSwgZnJlcSk7CisKKwlpZiAoIWNoYW5uZWwgfHwgY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKworCWJzcyA9IGllZWU4MDIxMV9ic3NfaW5mb191cGRhdGUoc2RhdGEtPmxvY2FsLCByeF9zdGF0dXMsCisJCQkJCW1nbXQsIHNrYi0+bGVuLCAmZWxlbXMsCisJCQkJCWZyZXEsIGJlYWNvbik7CisJaWYgKGJzcykKKwkJaWVlZTgwMjExX3J4X2Jzc19wdXQoc2RhdGEtPmxvY2FsLCBic3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBSWF9RVUVVRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9zZW5kX251bGxmdW5jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgaW50IHBvd2Vyc2F2ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpudWxsZnVuYzsKKwlfX2xlMTYgZmM7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDI0KTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG51bGxmdW5jICIKKwkJICAgICAgICJmcmFtZVxuIiwgc2RhdGEtPmRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJbnVsbGZ1bmMgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiX3B1dChza2IsIDI0KTsKKwltZW1zZXQobnVsbGZ1bmMsIDAsIDI0KTsKKwlmYyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwKKwkJCSBJRUVFODAyMTFfRkNUTF9UT0RTKTsKKwlpZiAocG93ZXJzYXZlKQorCQlmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QTSk7CisJbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBmYzsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIxLCBzZGF0YS0+dS5zdGEuYnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCBzZGF0YS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShudWxsZnVuYy0+YWRkcjMsIHNkYXRhLT51LnN0YS5ic3NpZCwgRVRIX0FMRU4pOworCisJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiLCAwKTsKK30KKwordm9pZCBpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJaWYgKFdBUk5fT04oIWxvY2FsLT5od19zY2FubmluZyAmJiAhbG9jYWwtPnN3X3NjYW5uaW5nKSkKKwkJcmV0dXJuOworCisJbG9jYWwtPmxhc3Rfc2Nhbl9jb21wbGV0ZWQgPSBqaWZmaWVzOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKworCS8qCisJICogbG9jYWwtPnNjYW5fc2RhdGEgY291bGQgaGF2ZSBiZWVuIE5VTExlZCBieSB0aGUgaW50ZXJmYWNlCisJICogZG93biBjb2RlIGluIGNhc2Ugd2Ugd2VyZSBzY2FubmluZyBvbiBhbiBpbnRlcmZhY2UgdGhhdCBpcworCSAqIGJlaW5nIHRha2VuIGRvd24uCisJICovCisJc2RhdGEgPSBsb2NhbC0+c2Nhbl9zZGF0YTsKKwlpZiAoc2RhdGEpCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoc2RhdGEtPmRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKKworCWlmIChsb2NhbC0+aHdfc2Nhbm5pbmcpIHsKKwkJbG9jYWwtPmh3X3NjYW5uaW5nID0gZmFsc2U7CisJCWlmIChpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIHJlc3RvcmUgb3BlcmF0aW9uYWwgIgorCQkJICAgICAgICJjaGFubmVsIGFmdGVyIHNjYW5cbiIsIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSk7CisKKwkJZ290byBkb25lOworCX0KKworCWxvY2FsLT5zd19zY2FubmluZyA9IGZhbHNlOworCWlmIChpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gcmVzdG9yZSBvcGVyYXRpb25hbCAiCisJCSAgICAgICAiY2hhbm5lbCBhZnRlciBzY2FuXG4iLCB3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSkpOworCisKKwluZXRpZl90eF9sb2NrX2JoKGxvY2FsLT5tZGV2KTsKKwluZXRpZl9hZGRyX2xvY2sobG9jYWwtPm1kZXYpOworCWxvY2FsLT5maWx0ZXJfZmxhZ3MgJj0gfkZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDOworCWxvY2FsLT5vcHMtPmNvbmZpZ3VyZV9maWx0ZXIobG9jYWxfdG9faHcobG9jYWwpLAorCQkJCSAgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MsCisJCQkJICAgICAmbG9jYWwtPmZpbHRlcl9mbGFncywKKwkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19jb3VudCwKKwkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19saXN0KTsKKworCW5ldGlmX2FkZHJfdW5sb2NrKGxvY2FsLT5tZGV2KTsKKwluZXRpZl90eF91bmxvY2tfYmgobG9jYWwtPm1kZXYpOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKKwkJLyogVGVsbCBBUCB3ZSdyZSBiYWNrICovCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQkJaWYgKHNkYXRhLT51LnN0YS5mbGFncyAmIElFRUU4MDIxMV9TVEFfQVNTT0NJQVRFRCkgeworCQkJCWllZWU4MDIxMV9zZW5kX251bGxmdW5jKGxvY2FsLCBzZGF0YSwgMCk7CisJCQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHNkYXRhLT5kZXYpOworCQkJfQorCQl9IGVsc2UKKwkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhzZGF0YS0+ZGV2KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKyBkb25lOgorCWllZWU4MDIxMV9tbG1lX25vdGlmeV9zY2FuX2NvbXBsZXRlZChsb2NhbCk7CisJaWVlZTgwMjExX21lc2hfbm90aWZ5X3NjYW5fY29tcGxldGVkKGxvY2FsKTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKTsKKworCit2b2lkIGllZWU4MDIxMV9zY2FuX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIHNjYW5fd29yay53b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IGxvY2FsLT5zY2FuX3NkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlpbnQgc2tpcDsKKwl1bnNpZ25lZCBsb25nIG5leHRfZGVsYXkgPSAwOworCisJLyoKKwkgKiBBdm9pZCByZS1zY2hlZHVsaW5nIHdoZW4gdGhlIHNkYXRhIGlzIGdvaW5nIGF3YXkuCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKHNkYXRhLT5kZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGxvY2FsLT5zY2FuX3N0YXRlKSB7CisJY2FzZSBTQ0FOX1NFVF9DSEFOTkVMOgorCQkvKgorCQkgKiBHZXQgY3VycmVudCBzY2FuIGJhbmQuIHNjYW5fYmFuZCBtYXkgYmUgSUVFRTgwMjExX05VTV9CQU5EUworCQkgKiBhZnRlciB3ZSBzdWNjZXNzZnVsbHkgc2Nhbm5lZCB0aGUgbGFzdCBjaGFubmVsIG9mIHRoZSBsYXN0CisJCSAqIGJhbmQgKGFuZCB0aGUgbGFzdCBiYW5kIGlzIHN1cHBvcnRlZCBieSB0aGUgaHcpCisJCSAqLworCQlpZiAobG9jYWwtPnNjYW5fYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFMpCisJCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPnNjYW5fYmFuZF07CisJCWVsc2UKKwkJCXNiYW5kID0gTlVMTDsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmUgYXQgYW4gdW5zdXBwb3J0ZWQgYmFuZCBhbmQgaGF2ZSBtb3JlIGJhbmRzCisJCSAqIGxlZnQgdG8gc2NhbiwgYWR2YW5jZSB0byB0aGUgbmV4dCBzdXBwb3J0ZWQgb25lLgorCQkgKi8KKwkJd2hpbGUgKCFzYmFuZCAmJiBsb2NhbC0+c2Nhbl9iYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUyAtIDEpIHsKKwkJCWxvY2FsLT5zY2FuX2JhbmQrKzsKKwkJCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+c2Nhbl9iYW5kXTsKKwkJCWxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4ID0gMDsKKwkJfQorCisJCS8qIGlmIG5vIG1vcmUgYmFuZHMvY2hhbm5lbHMgbGVmdCwgY29tcGxldGUgc2NhbiAqLworCQlpZiAoIXNiYW5kIHx8IGxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4ID49IHNiYW5kLT5uX2NoYW5uZWxzKSB7CisJCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQobG9jYWxfdG9faHcobG9jYWwpKTsKKwkJCXJldHVybjsKKwkJfQorCQlza2lwID0gMDsKKwkJY2hhbiA9ICZzYmFuZC0+Y2hhbm5lbHNbbG9jYWwtPnNjYW5fY2hhbm5lbF9pZHhdOworCisJCWlmIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEIHx8CisJCSAgICAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJCSAgICAgY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JQlNTKSkKKwkJCXNraXAgPSAxOworCisJCWlmICghc2tpcCkgeworCQkJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IGNoYW47CisJCQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBzZXQgZnJlcSB0byAiCisJCQkJICAgICAgICIlZCBNSHogZm9yIHNjYW5cbiIsIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSwKKwkJCQkgICAgICAgY2hhbi0+Y2VudGVyX2ZyZXEpOworCQkJCXNraXAgPSAxOworCQkJfQorCQl9CisKKwkJLyogYWR2YW5jZSBzdGF0ZSBtYWNoaW5lIHRvIG5leHQgY2hhbm5lbC9iYW5kICovCisJCWxvY2FsLT5zY2FuX2NoYW5uZWxfaWR4Kys7CisJCWlmIChsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA+PSBzYmFuZC0+bl9jaGFubmVscykgeworCQkJLyoKKwkJCSAqIHNjYW5fYmFuZCBtYXkgZW5kIHVwID09IElFRUU4MDIxMV9OVU1fQkFORFMsIGJ1dAorCQkJICogd2UnbGwgY2F0Y2ggdGhhdCBjYXNlIGFib3ZlIGFuZCBjb21wbGV0ZSB0aGUgc2NhbgorCQkJICogaWYgdGhhdCBpcyB0aGUgY2FzZS4KKwkJCSAqLworCQkJbG9jYWwtPnNjYW5fYmFuZCsrOworCQkJbG9jYWwtPnNjYW5fY2hhbm5lbF9pZHggPSAwOworCQl9CisKKwkJaWYgKHNraXApCisJCQlicmVhazsKKworCQluZXh0X2RlbGF5ID0gSUVFRTgwMjExX1BST0JFX0RFTEFZICsKKwkJCSAgICAgdXNlY3NfdG9famlmZmllcyhsb2NhbC0+aHcuY2hhbm5lbF9jaGFuZ2VfdGltZSk7CisJCWxvY2FsLT5zY2FuX3N0YXRlID0gU0NBTl9TRU5EX1BST0JFOworCQlicmVhazsKKwljYXNlIFNDQU5fU0VORF9QUk9CRToKKwkJbmV4dF9kZWxheSA9IElFRUU4MDIxMV9QQVNTSVZFX0NIQU5ORUxfVElNRTsKKwkJbG9jYWwtPnNjYW5fc3RhdGUgPSBTQ0FOX1NFVF9DSEFOTkVMOworCisJCWlmIChsb2NhbC0+c2Nhbl9jaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikKKwkJCWJyZWFrOworCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXEoc2RhdGEsIE5VTEwsIGxvY2FsLT5zY2FuX3NzaWQsCisJCQkJCSBsb2NhbC0+c2Nhbl9zc2lkX2xlbik7CisJCW5leHRfZGVsYXkgPSBJRUVFODAyMTFfQ0hBTk5FTF9USU1FOworCQlicmVhazsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmxvY2FsLT5zY2FuX3dvcmssCisJCQkgICBuZXh0X2RlbGF5KTsKK30KKworCitpbnQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2Nhbl9zZGF0YSwKKwkJCSB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2Nhbl9zZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisKKwlpZiAoc3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1MTUUtU0NBTi5yZXF1ZXN0IChwYWdlIDExOCkgIHBhZ2UgMTQ0ICgxMS4xLjMuMSkKKwkgKiBCU1NUeXBlOiBJTkZSQVNUUlVDVFVSRSwgSU5ERVBFTkRFTlQsIEFOWV9CU1MKKwkgKiBCU1NJRDogTUFDQWRkcmVzcworCSAqIFNTSUQKKwkgKiBTY2FuVHlwZTogQUNUSVZFLCBQQVNTSVZFCisJICogUHJvYmVEZWxheTogZGVsYXkgKGluIG1pY3Jvc2Vjb25kcykgdG8gYmUgdXNlZCBwcmlvciB0byB0cmFuc21pdHRpbmcKKwkgKiAgICBhIFByb2JlIGZyYW1lIGR1cmluZyBhY3RpdmUgc2Nhbm5pbmcKKwkgKiBDaGFubmVsTGlzdAorCSAqIE1pbkNoYW5uZWxUaW1lICg+PSBQcm9iZURlbGF5KSwgaW4gVFUKKwkgKiBNYXhDaGFubmVsVGltZTogKD49IE1pbkNoYW5uZWxUaW1lKSwgaW4gVFUKKwkgKi8KKworCSAvKiBNTE1FLVNDQU4uY29uZmlybQorCSAgKiBCU1NEZXNjcmlwdGlvblNldAorCSAgKiBSZXN1bHRDb2RlOiBTVUNDRVNTLCBJTlZBTElEX1BBUkFNRVRFUlMKKwkgKi8KKworCWlmIChsb2NhbC0+c3dfc2Nhbm5pbmcgfHwgbG9jYWwtPmh3X3NjYW5uaW5nKSB7CisJCWlmIChsb2NhbC0+c2Nhbl9zZGF0YSA9PSBzY2FuX3NkYXRhKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGxvY2FsLT5vcHMtPmh3X3NjYW4pIHsKKwkJaW50IHJjOworCisJCWxvY2FsLT5od19zY2FubmluZyA9IHRydWU7CisJCXJjID0gbG9jYWwtPm9wcy0+aHdfc2Nhbihsb2NhbF90b19odyhsb2NhbCksIHNzaWQsIHNzaWRfbGVuKTsKKwkJaWYgKHJjKSB7CisJCQlsb2NhbC0+aHdfc2Nhbm5pbmcgPSBmYWxzZTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlsb2NhbC0+c2Nhbl9zZGF0YSA9IHNjYW5fc2RhdGE7CisJCXJldHVybiAwOworCX0KKworCWxvY2FsLT5zd19zY2FubmluZyA9IHRydWU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgeworCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJCWlmIChzZGF0YS0+dS5zdGEuZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0FTU09DSUFURUQpIHsKKwkJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CisJCQkJaWVlZTgwMjExX3NlbmRfbnVsbGZ1bmMobG9jYWwsIHNkYXRhLCAxKTsKKwkJCX0KKwkJfSBlbHNlCisJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKHNzaWQpIHsKKwkJbG9jYWwtPnNjYW5fc3NpZF9sZW4gPSBzc2lkX2xlbjsKKwkJbWVtY3B5KGxvY2FsLT5zY2FuX3NzaWQsIHNzaWQsIHNzaWRfbGVuKTsKKwl9IGVsc2UKKwkJbG9jYWwtPnNjYW5fc3NpZF9sZW4gPSAwOworCWxvY2FsLT5zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKKwlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA9IDA7CisJbG9jYWwtPnNjYW5fYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJbG9jYWwtPnNjYW5fc2RhdGEgPSBzY2FuX3NkYXRhOworCisJbmV0aWZfYWRkcl9sb2NrX2JoKGxvY2FsLT5tZGV2KTsKKwlsb2NhbC0+ZmlsdGVyX2ZsYWdzIHw9IEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDOworCWxvY2FsLT5vcHMtPmNvbmZpZ3VyZV9maWx0ZXIobG9jYWxfdG9faHcobG9jYWwpLAorCQkJCSAgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MsCisJCQkJICAgICAmbG9jYWwtPmZpbHRlcl9mbGFncywKKwkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19jb3VudCwKKwkJCQkgICAgIGxvY2FsLT5tZGV2LT5tY19saXN0KTsKKwluZXRpZl9hZGRyX3VubG9ja19iaChsb2NhbC0+bWRldik7CisKKwkvKiBUT0RPOiBzdGFydCBzY2FuIGFzIHNvb24gYXMgYWxsIG51bGxmdW5jIGZyYW1lcyBhcmUgQUNLZWQgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsobG9jYWwtPmh3LndvcmtxdWV1ZSwgJmxvY2FsLT5zY2FuX3dvcmssCisJCQkgICBJRUVFODAyMTFfQ0hBTk5FTF9USU1FKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBpZWVlODAyMTFfcmVxdWVzdF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX3N0YSAqaWZzdGE7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCXJldHVybiBpZWVlODAyMTFfc3RhcnRfc2NhbihzZGF0YSwgc3NpZCwgc3NpZF9sZW4pOworCisJLyoKKwkgKiBTVEEgaGFzIGEgc3RhdGUgbWFjaGluZSB0aGF0IG1pZ2h0IG5lZWQgdG8gZGVmZXIgc2Nhbm5pbmcKKwkgKiB3aGlsZSBpdCdzIHRyeWluZyB0byBhc3NvY2lhdGUvYXV0aGVudGljYXRlLCB0aGVyZWZvcmUgd2UKKwkgKiBxdWV1ZSBpdCB1cCB0byB0aGUgc3RhdGUgbWFjaGluZSBpbiB0aGF0IGNhc2UuCisJICovCisKKwlpZiAobG9jYWwtPnN3X3NjYW5uaW5nIHx8IGxvY2FsLT5od19zY2FubmluZykgeworCQlpZiAobG9jYWwtPnNjYW5fc2RhdGEgPT0gc2RhdGEpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZnN0YSA9ICZzZGF0YS0+dS5zdGE7CisKKwlpZnN0YS0+c2Nhbl9zc2lkX2xlbiA9IHNzaWRfbGVuOworCWlmIChzc2lkX2xlbikKKwkJbWVtY3B5KGlmc3RhLT5zY2FuX3NzaWQsIHNzaWQsIHNzaWRfbGVuKTsKKwlzZXRfYml0KElFRUU4MDIxMV9TVEFfUkVRX1NDQU4sICZpZnN0YS0+cmVxdWVzdCk7CisJcXVldWVfd29yayhsb2NhbC0+aHcud29ya3F1ZXVlLCAmaWZzdGEtPndvcmspOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fYWRkX2llcyhzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzICpic3MsCisJCQkJICAgY2hhciAqKmN1cnJlbnRfZXYsIGNoYXIgKmVuZF9idWYpCit7CisJdTggKnBvcywgKmVuZCwgKm5leHQ7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChic3MgPT0gTlVMTCB8fCBic3MtPmllcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIG5lZWRlZCwgZnJhZ21lbnQgdGhlIElFcyBidWZmZXIgKGF0IElFIGJvdW5kYXJpZXMpIGludG8gc2hvcnQKKwkgKiBlbm91Z2ggZnJhZ21lbnRzIHRvIGZpdCBpbnRvIElXX0dFTkVSSUNfSUVfTUFYIG9jdGV0IG1lc3NhZ2VzLgorCSAqLworCXBvcyA9IGJzcy0+aWVzOworCWVuZCA9IHBvcyArIGJzcy0+aWVzX2xlbjsKKworCXdoaWxlIChlbmQgLSBwb3MgPiBJV19HRU5FUklDX0lFX01BWCkgeworCQluZXh0ID0gcG9zICsgMiArIHBvc1sxXTsKKwkJd2hpbGUgKG5leHQgKyAyICsgbmV4dFsxXSAtIHBvcyA8IElXX0dFTkVSSUNfSUVfTUFYKQorCQkJbmV4dCA9IG5leHQgKyAyICsgbmV4dFsxXTsKKworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5leHQgLSBwb3M7CisJCSpjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgKmN1cnJlbnRfZXYsCisJCQkJCQkgICBlbmRfYnVmLCAmaXdlLCBwb3MpOworCisJCXBvcyA9IG5leHQ7CisJfQorCisJaWYgKGVuZCA+IHBvcykgeworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IGVuZCAtIHBvczsKKwkJKmN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCAqY3VycmVudF9ldiwKKwkJCQkJCSAgIGVuZF9idWYsICZpd2UsIHBvcyk7CisJfQorfQorCisKK3N0YXRpYyBjaGFyICoKK2llZWU4MDIxMV9zY2FuX3Jlc3VsdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzcywKKwkJICAgICAgY2hhciAqY3VycmVudF9ldiwgY2hhciAqZW5kX2J1ZikKK3sKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCWNoYXIgKmJ1ZjsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCisJCSAgICAgICBic3MtPmxhc3RfdXBkYXRlICsgSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSkpCisJCXJldHVybiBjdXJyZW50X2V2OworCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJICBJV19FVl9BRERSX0xFTik7CisKKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJaWYgKGJzc19tZXNoX2NmZyhic3MpKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gYnNzX21lc2hfaWRfbGVuKGJzcyk7CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgYnNzX21lc2hfaWQoYnNzKSk7CisJfSBlbHNlIHsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPnNzaWRfbGVuOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkgICZpd2UsIGJzcy0+c3NpZCk7CisJfQorCisJaWYgKGJzcy0+Y2FwYWJpbGl0eSAmIChXTEFOX0NBUEFCSUxJVFlfRVNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJICAgIHx8IGJzc19tZXNoX2NmZyhic3MpKSB7CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaWYgKGJzc19tZXNoX2NmZyhic3MpKQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUVTSDsKKwkJZWxzZSBpZiAoYnNzLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJfQorCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGJzcy0+ZnJlcSk7CisJaXdlLnUuZnJlcS5lID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJICBJV19FVl9GUkVRX0xFTik7CisKKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwlpd2UudS5mcmVxLm0gPSBic3MtPmZyZXE7CisJaXdlLnUuZnJlcS5lID0gNjsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJICBJV19FVl9GUkVRX0xFTik7CisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gSVdFVlFVQUw7CisJaXdlLnUucXVhbC5xdWFsID0gYnNzLT5xdWFsOworCWl3ZS51LnF1YWwubGV2ZWwgPSBic3MtPnNpZ25hbDsKKwlpd2UudS5xdWFsLm5vaXNlID0gYnNzLT5ub2lzZTsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSBsb2NhbC0+d3N0YXRzX2ZsYWdzOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgIElXX0VWX1FVQUxfTEVOKTsKKworCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJaWYgKGJzcy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJICAmaXdlLCAiIik7CisKKwlpZWVlODAyMTFfc2Nhbl9hZGRfaWVzKGluZm8sIGJzcywgJmN1cnJlbnRfZXYsIGVuZF9idWYpOworCisJaWYgKGJzcy0+c3VwcF9yYXRlc19sZW4gPiAwKSB7CisJCS8qIGRpc3BsYXkgYWxsIHN1cHBvcnRlZCByYXRlcyBpbiByZWFkYWJsZSBmb3JtYXQgKi8KKwkJY2hhciAqcCA9IGN1cnJlbnRfZXYgKyBpd2Vfc3RyZWFtX2xjcF9sZW4oaW5mbyk7CisJCWludCBpOworCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwkJLyogVGhvc2UgdHdvIGZsYWdzIGFyZSBpZ25vcmVkLi4uICovCisJCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnNzLT5zdXBwX3JhdGVzX2xlbjsgaSsrKSB7CisJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKChic3MtPnN1cHBfcmF0ZXNbaV0gJgorCQkJCQkJCTB4N2YpICogNTAwMDAwKTsKKwkJCXAgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShpbmZvLCBjdXJyZW50X2V2LCBwLAorCQkJCQllbmRfYnVmLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworCQl9CisJCWN1cnJlbnRfZXYgPSBwOworCX0KKworCWJ1ZiA9IGttYWxsb2MoMzAsIEdGUF9BVE9NSUMpOworCWlmIChidWYpIHsKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCXNwcmludGYoYnVmLCAidHNmPSUwMTZsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKShic3MtPnRpbWVzdGFtcCkpOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCXNwcmludGYoYnVmLCAiIExhc3QgYmVhY29uOiAlZG1zIGFnbyIsCisJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBic3MtPmxhc3RfdXBkYXRlKSk7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAorCQkJCQkJICBlbmRfYnVmLCAmaXdlLCBidWYpOworCQlrZnJlZShidWYpOworCX0KKworCWlmIChic3NfbWVzaF9jZmcoYnNzKSkgeworCQl1OCAqY2ZnID0gYnNzX21lc2hfY2ZnKGJzcyk7CisJCWJ1ZiA9IGttYWxsb2MoNTAsIEdGUF9BVE9NSUMpOworCQlpZiAoYnVmKSB7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCQlzcHJpbnRmKGJ1ZiwgIk1lc2ggbmV0d29yayAodmVyc2lvbiAlZCkiLCBjZmdbMF0pOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAorCQkJCQkJCSAgZW5kX2J1ZiwKKwkJCQkJCQkgICZpd2UsIGJ1Zik7CisJCQlzcHJpbnRmKGJ1ZiwgIlBhdGggU2VsZWN0aW9uIFByb3RvY29sIElEOiAiCisJCQkJIjB4JTAyWCUwMlglMDJYJTAyWCIsIGNmZ1sxXSwgY2ZnWzJdLCBjZmdbM10sCisJCQkJCQkJY2ZnWzRdKTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCQkgIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQkJc3ByaW50ZihidWYsICJQYXRoIFNlbGVjdGlvbiBNZXRyaWMgSUQ6ICIKKwkJCQkiMHglMDJYJTAyWCUwMlglMDJYIiwgY2ZnWzVdLCBjZmdbNl0sIGNmZ1s3XSwKKwkJCQkJCQljZmdbOF0pOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAorCQkJCQkJCSAgZW5kX2J1ZiwKKwkJCQkJCQkgICZpd2UsIGJ1Zik7CisJCQlzcHJpbnRmKGJ1ZiwgIkNvbmdlc3Rpb24gQ29udHJvbCBNb2RlIElEOiAiCisJCQkJIjB4JTAyWCUwMlglMDJYJTAyWCIsIGNmZ1s5XSwgY2ZnWzEwXSwKKwkJCQkJCQljZmdbMTFdLCBjZmdbMTJdKTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCQkgIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQkJc3ByaW50ZihidWYsICJDaGFubmVsIFByZWNlZGVuY2U6ICIKKwkJCQkiMHglMDJYJTAyWCUwMlglMDJYIiwgY2ZnWzEzXSwgY2ZnWzE0XSwKKwkJCQkJCQljZmdbMTVdLCBjZmdbMTZdKTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCQkgIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQkJa2ZyZWUoYnVmKTsKKwkJfQorCX0KKworCXJldHVybiBjdXJyZW50X2V2OworfQorCisKK2ludCBpZWVlODAyMTFfc2Nhbl9yZXN1bHRzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwljaGFyICpjdXJyZW50X2V2ID0gYnVmOworCWNoYXIgKmVuZF9idWYgPSBidWYgKyBsZW47CisJc3RydWN0IGllZWU4MDIxMV9ic3MgKmJzczsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmJzc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJzcywgJmxvY2FsLT5ic3NfbGlzdCwgbGlzdCkgeworCQlpZiAoYnVmICsgbGVuIC0gY3VycmVudF9ldiA8PSBJV19FVl9BRERSX0xFTikgeworCQkJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJCQlyZXR1cm4gLUUyQklHOworCQl9CisJCWN1cnJlbnRfZXYgPSBpZWVlODAyMTFfc2Nhbl9yZXN1bHQobG9jYWwsIGluZm8sIGJzcywKKwkJCQkJCSAgICAgICBjdXJyZW50X2V2LCBlbmRfYnVmKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5ic3NfbG9jayk7CisJcmV0dXJuIGN1cnJlbnRfZXYgLSBidWY7Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3BlY3RtZ210LmMgYi9uZXQvbWFjODAyMTEvc3BlY3RtZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyYmFkNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9tYWM4MDIxMS9zcGVjdG1nbXQuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogc3BlY3RydW0gbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAyMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgMjAwMi0yMDA1LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IDIwMDYtMjAwNyAgSmlyaSBCZW5jIDxqYmVuY0BzdXNlLmN6PgorICogQ29weXJpZ2h0IDIwMDcsIE1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PgorICogQ29weXJpZ2h0IDIwMDctMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA4LCBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCisjaW5jbHVkZSAic3RhX2luZm8uaCIKKyNpbmNsdWRlICJ3bWUuaCIKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcmVmdXNlX21lYXN1cmVtZW50X3JlcXVlc3Qoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfbXNybWVudF9pZSAqcmVxdWVzdF9pZSwKKwkJCQkJY29uc3QgdTggKmRhLCBjb25zdCB1OCAqYnNzaWQsCisJCQkJCXU4IGRpYWxvZ190b2tlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbXNyX3JlcG9ydDsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCptc3JfcmVwb3J0KSArIGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbXNybWVudF9pZSkpOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgIgorCQkJCSJtZWFzdXJlbWVudCByZXBvcnQgZnJhbWVcbiIsIHNkYXRhLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCW1zcl9yZXBvcnQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiX3B1dChza2IsIDI0KTsKKwltZW1zZXQobXNyX3JlcG9ydCwgMCwgMjQpOworCW1lbWNweShtc3JfcmVwb3J0LT5kYSwgZGEsIEVUSF9BTEVOKTsKKwltZW1jcHkobXNyX3JlcG9ydC0+c2EsIHNkYXRhLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG1zcl9yZXBvcnQtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCW1zcl9yZXBvcnQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CisJCQkJCQlJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKKworCXNrYl9wdXQoc2tiLCAxICsgc2l6ZW9mKG1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQpKTsKKwltc3JfcmVwb3J0LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDsKKwltc3JfcmVwb3J0LT51LmFjdGlvbi51Lm1lYXN1cmVtZW50LmFjdGlvbl9jb2RlID0KKwkJCQlXTEFOX0FDVElPTl9TUENUX01TUl9SUFJUOworCW1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQuZGlhbG9nX3Rva2VuID0gZGlhbG9nX3Rva2VuOworCisJbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5lbGVtZW50X2lkID0gV0xBTl9FSURfTUVBU1VSRV9SRVBPUlQ7CisJbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5sZW5ndGggPQorCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbXNybWVudF9pZSk7CisKKwltZW1zZXQoJm1zcl9yZXBvcnQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQubXNyX2VsZW0sIDAsCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21zcm1lbnRfaWUpKTsKKwltc3JfcmVwb3J0LT51LmFjdGlvbi51Lm1lYXN1cmVtZW50Lm1zcl9lbGVtLnRva2VuID0gcmVxdWVzdF9pZS0+dG9rZW47CisJbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5tc3JfZWxlbS5tb2RlIHw9CisJCQlJRUVFODAyMTFfU1BDVF9NU1JfUlBSVF9NT0RFX1JFRlVTRUQ7CisJbXNyX3JlcG9ydC0+dS5hY3Rpb24udS5tZWFzdXJlbWVudC5tc3JfZWxlbS50eXBlID0gcmVxdWVzdF9pZS0+dHlwZTsKKworCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYiwgMCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfbWVhc3VyZW1lbnRfcmVxKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCisJCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJLyoKKwkgKiBJZ25vcmluZyBtZWFzdXJlbWVudCByZXF1ZXN0IGlzIHNwZWMgdmlvbGF0aW9uLgorCSAqIE1hbmRhdG9yeSBtZWFzdXJlbWVudHMgbXVzdCBiZSByZXBvcnRlZCBvcHRpb25hbAorCSAqIG1lYXN1cmVtZW50cyBtaWdodCBiZSByZWZ1c2VkIG9yIHJlcG9ydGVkIGluY2FwYWJsZQorCSAqIEZvciBub3cganVzdCByZWZ1c2UKKwkgKiBUT0RPOiBBbnN3ZXIgYmFzaWMgbWVhc3VyZW1lbnQgYXMgdW5tZWFzdXJlZAorCSAqLworCWllZWU4MDIxMV9zZW5kX3JlZnVzZV9tZWFzdXJlbWVudF9yZXF1ZXN0KHNkYXRhLAorCQkJJm1nbXQtPnUuYWN0aW9uLnUubWVhc3VyZW1lbnQubXNyX2VsZW0sCisJCQltZ210LT5zYSwgbWdtdC0+YnNzaWQsCisJCQltZ210LT51LmFjdGlvbi51Lm1lYXN1cmVtZW50LmRpYWxvZ190b2tlbik7Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCmluZGV4IGYyYmE2NTMuLjdmZWY4ZWEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jCkBAIC03MywxMSArNzMsMTEgQEAKIHsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnM7CiAKLQlzID0gbG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+YWRkcildOworCXMgPSBsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5zdGEuYWRkcildOwogCWlmICghcykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJaWYgKHMgPT0gc3RhKSB7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5hZGRyKV0sCisJCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5zdGEuYWRkcildLAogCQkJCSAgIHMtPmhuZXh0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTMsMjYgKzkzLDE5IEBACiB9CiAKIC8qIHByb3RlY3RlZCBieSBSQ1UgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gKl9fc3RhX2luZm9fZmluZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJdTggKmFkZHIpCitzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2dldChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAKIAlzdGEgPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKGFkZHIpXSk7CiAJd2hpbGUgKHN0YSkgewotCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHN0YS0+YWRkciwgYWRkcikgPT0gMCkKKwkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihzdGEtPnN0YS5hZGRyLCBhZGRyKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmhuZXh0KTsKIAl9CiAJcmV0dXJuIHN0YTsKIH0KIAotc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19nZXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHU4ICphZGRyKQotewotCXJldHVybiBfX3N0YV9pbmZvX2ZpbmQobG9jYWwsIGFkZHIpOwotfQotRVhQT1JUX1NZTUJPTChzdGFfaW5mb19nZXQpOwotCiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2dldF9ieV9pZHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIGludCBpZHgsCiAJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTQ2LDEyICsxMzksMTIgQEAKIHsKIAlERUNMQVJFX01BQ19CVUYobWJ1Zik7CiAKLQlyYXRlX2NvbnRyb2xfZnJlZV9zdGEoc3RhLT5yYXRlX2N0cmwsIHN0YS0+cmF0ZV9jdHJsX3ByaXYpOworCXJhdGVfY29udHJvbF9mcmVlX3N0YShzdGEpOwogCXJhdGVfY29udHJvbF9wdXQoc3RhLT5yYXRlX2N0cmwpOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERlc3Ryb3llZCBTVEEgJXNcbiIsCi0JICAgICAgIHdpcGh5X25hbWUobG9jYWwtPmh3LndpcGh5KSwgcHJpbnRfbWFjKG1idWYsIHN0YS0+YWRkcikpOworCSAgICAgICB3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSksIHByaW50X21hYyhtYnVmLCBzdGEtPnN0YS5hZGRyKSk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcgKi8KIAogCWtmcmVlKHN0YSk7CkBAIC0yMTksOCArMjEyLDggQEAKIHN0YXRpYyB2b2lkIHN0YV9pbmZvX2hhc2hfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0Jc3RhLT5obmV4dCA9IGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPmFkZHIpXTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+YWRkcildLCBzdGEpOworCXN0YS0+aG5leHQgPSBsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5zdGEuYWRkcildOworCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goc3RhLT5zdGEuYWRkcildLCBzdGEpOwogfQogCiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMjMxLDIwICsyMjQsMjAgQEAKIAlpbnQgaTsKIAlERUNMQVJFX01BQ19CVUYobWJ1Zik7CiAKLQlzdGEgPSBremFsbG9jKHNpemVvZigqc3RhKSwgZ2ZwKTsKKwlzdGEgPSBremFsbG9jKHNpemVvZigqc3RhKSArIGxvY2FsLT5ody5zdGFfZGF0YV9zaXplLCBnZnApOwogCWlmICghc3RhKQogCQlyZXR1cm4gTlVMTDsKIAogCXNwaW5fbG9ja19pbml0KCZzdGEtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZzdGEtPmZsYWdsb2NrKTsKIAotCW1lbWNweShzdGEtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoc3RhLT5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCXN0YS0+bG9jYWwgPSBsb2NhbDsKIAlzdGEtPnNkYXRhID0gc2RhdGE7CiAKIAlzdGEtPnJhdGVfY3RybCA9IHJhdGVfY29udHJvbF9nZXQobG9jYWwtPnJhdGVfY3RybCk7CiAJc3RhLT5yYXRlX2N0cmxfcHJpdiA9IHJhdGVfY29udHJvbF9hbGxvY19zdGEoc3RhLT5yYXRlX2N0cmwsCi0JCQkJCQkgICAgIGdmcCk7CisJCQkJCQkgICAgICZzdGEtPnN0YSwgZ2ZwKTsKIAlpZiAoIXN0YS0+cmF0ZV9jdHJsX3ByaXYpIHsKIAkJcmF0ZV9jb250cm9sX3B1dChzdGEtPnJhdGVfY3RybCk7CiAJCWtmcmVlKHN0YSk7CkBAIC0yNzEsNyArMjY0LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBbGxvY2F0ZWQgU1RBICVzXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSksIHByaW50X21hYyhtYnVmLCBzdGEtPmFkZHIpKTsKKwkgICAgICAgd2lwaHlfbmFtZShsb2NhbC0+aHcud2lwaHkpLCBwcmludF9tYWMobWJ1Ziwgc3RhLT5zdGEuYWRkcikpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHICovCiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSApAQCAtMzAwLDE1ICsyOTMsMTUgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQlpZiAoV0FSTl9PTihjb21wYXJlX2V0aGVyX2FkZHIoc3RhLT5hZGRyLCBzZGF0YS0+ZGV2LT5kZXZfYWRkcikgPT0gMCB8fAotCSAgICAgICAgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHN0YS0+YWRkcikpKSB7CisJaWYgKFdBUk5fT04oY29tcGFyZV9ldGhlcl9hZGRyKHN0YS0+c3RhLmFkZHIsIHNkYXRhLT5kZXYtPmRldl9hZGRyKSA9PSAwIHx8CisJICAgICAgICAgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoc3RhLT5zdGEuYWRkcikpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwogCS8qIGNoZWNrIGlmIFNUQSBleGlzdHMgYWxyZWFkeSAqLwotCWlmIChfX3N0YV9pbmZvX2ZpbmQobG9jYWwsIHN0YS0+YWRkcikpIHsKKwlpZiAoc3RhX2luZm9fZ2V0KGxvY2FsLCBzdGEtPnN0YS5hZGRyKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKIAkJZXJyID0gLUVFWElTVDsKIAkJZ290byBvdXRfZnJlZTsKQEAgLTMxOSwxOCArMzEyLDE4IEBACiAKIAkvKiBub3RpZnkgZHJpdmVyICovCiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpIHsKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCiAJCQlzZGF0YSA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAogCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsCiAJCQkJCSAgICAgdS5hcCk7CiAKIAkJbG9jYWwtPm9wcy0+c3RhX25vdGlmeShsb2NhbF90b19odyhsb2NhbCksICZzZGF0YS0+dmlmLAotCQkJCSAgICAgICBTVEFfTk9USUZZX0FERCwgc3RhLT5hZGRyKTsKKwkJCQkgICAgICAgU1RBX05PVElGWV9BREQsICZzdGEtPnN0YSk7CiAJfQogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluc2VydGVkIFNUQSAlc1xuIiwKLQkgICAgICAgd2lwaHlfbmFtZShsb2NhbC0+aHcud2lwaHkpLCBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpKTsKKwkgICAgICAgd2lwaHlfbmFtZShsb2NhbC0+aHcud2lwaHkpLCBwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcgKi8KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwpAQCAtMzc5LDExICszNzIsMTIgQEAKIHsKIAlCVUdfT04oIWJzcyk7CiAKLQlfX2Jzc190aW1fc2V0KGJzcywgc3RhLT5haWQpOworCV9fYnNzX3RpbV9zZXQoYnNzLCBzdGEtPnN0YS5haWQpOwogCiAJaWYgKHN0YS0+bG9jYWwtPm9wcy0+c2V0X3RpbSkgewogCQlzdGEtPmxvY2FsLT50aW1faW5fbG9ja2VkX3NlY3Rpb24gPSB0cnVlOwotCQlzdGEtPmxvY2FsLT5vcHMtPnNldF90aW0obG9jYWxfdG9faHcoc3RhLT5sb2NhbCksIHN0YS0+YWlkLCAxKTsKKwkJc3RhLT5sb2NhbC0+b3BzLT5zZXRfdGltKGxvY2FsX3RvX2h3KHN0YS0+bG9jYWwpLAorCQkJCQkgJnN0YS0+c3RhLCB0cnVlKTsKIAkJc3RhLT5sb2NhbC0+dGltX2luX2xvY2tlZF9zZWN0aW9uID0gZmFsc2U7CiAJfQogfQpAQCAtNDA0LDExICszOTgsMTIgQEAKIHsKIAlCVUdfT04oIWJzcyk7CiAKLQlfX2Jzc190aW1fY2xlYXIoYnNzLCBzdGEtPmFpZCk7CisJX19ic3NfdGltX2NsZWFyKGJzcywgc3RhLT5zdGEuYWlkKTsKIAogCWlmIChzdGEtPmxvY2FsLT5vcHMtPnNldF90aW0pIHsKIAkJc3RhLT5sb2NhbC0+dGltX2luX2xvY2tlZF9zZWN0aW9uID0gdHJ1ZTsKLQkJc3RhLT5sb2NhbC0+b3BzLT5zZXRfdGltKGxvY2FsX3RvX2h3KHN0YS0+bG9jYWwpLCBzdGEtPmFpZCwgMCk7CisJCXN0YS0+bG9jYWwtPm9wcy0+c2V0X3RpbShsb2NhbF90b19odyhzdGEtPmxvY2FsKSwKKwkJCQkJICZzdGEtPnN0YSwgZmFsc2UpOwogCQlzdGEtPmxvY2FsLT50aW1faW5fbG9ja2VkX3NlY3Rpb24gPSBmYWxzZTsKIAl9CiB9CkBAIC00MjQsNyArNDE5LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGEtPmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwogfQogCi12b2lkIF9fc3RhX2luZm9fdW5saW5rKHN0cnVjdCBzdGFfaW5mbyAqKnN0YSkKK3N0YXRpYyB2b2lkIF9fc3RhX2luZm9fdW5saW5rKHN0cnVjdCBzdGFfaW5mbyAqKnN0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9ICgqc3RhKS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSAoKnN0YSktPnNkYXRhOwpAQCAtNDU2LDEzICs0NTEsMTMgQEAKIAlsb2NhbC0+bnVtX3N0YS0tOwogCiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9ub3RpZnkpIHsKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCiAJCQlzZGF0YSA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAogCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsCiAJCQkJCSAgICAgdS5hcCk7CiAKIAkJbG9jYWwtPm9wcy0+c3RhX25vdGlmeShsb2NhbF90b19odyhsb2NhbCksICZzZGF0YS0+dmlmLAotCQkJCSAgICAgICBTVEFfTk9USUZZX1JFTU9WRSwgKCpzdGEpLT5hZGRyKTsKKwkJCQkgICAgICAgU1RBX05PVElGWV9SRU1PVkUsICYoKnN0YSktPnN0YSk7CiAJfQogCiAJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpIHsKQEAgLTQ3NCw3ICs0NjksNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlbW92ZWQgU1RBICVzXG4iLAotCSAgICAgICB3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSksIHByaW50X21hYyhtYnVmLCAoKnN0YSktPmFkZHIpKTsKKwkgICAgICAgd2lwaHlfbmFtZShsb2NhbC0+aHcud2lwaHkpLCBwcmludF9tYWMobWJ1ZiwgKCpzdGEpLT5zdGEuYWRkcikpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHICovCiAKIAkvKgpAQCAtNTcwLDcgKzU2NSw3IEBACiAJCWxvY2FsLT50b3RhbF9wc19idWZmZXJlZC0tOwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICJCdWZmZXJlZCBmcmFtZSBleHBpcmVkIChTVEEgIgotCQkgICAgICAgIiVzKVxuIiwgcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCSAgICAgICAiJXMpXG4iLCBwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSk7CiAjZW5kaWYKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCkBAIC02NDAsNyArNjM1LDEyIEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQkJaWYgKCF0bXAtPmRlYnVnZnMuZGlyKSB7CisJCQkvKgorCQkJICogZGVidWdmcy5hZGRfaGFzX3J1biB3aWxsIGJlIHNldCBieQorCQkJICogaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX2FkZCByZWdhcmRsZXNzCisJCQkgKiBvZiB3aGF0IGVsc2UgaXQgZG9lcy4KKwkJCSAqLworCQkJaWYgKCF0bXAtPmRlYnVnZnMuYWRkX2hhc19ydW4pIHsKIAkJCQlzdGEgPSB0bXA7CiAJCQkJX19zdGFfaW5mb19waW4oc3RhKTsKIAkJCQlicmVhazsKQEAgLTgwMiwzICs4MDIsNDAgQEAKIAkJc2NoZWR1bGVfd29yaygmbG9jYWwtPnN0YV9mbHVzaF93b3JrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKIH0KKwordm9pZCBpZWVlODAyMTFfc3RhX2V4cGlyZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgdW5zaWduZWQgbG9uZyBleHBfdGltZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgKnRtcDsKKwlMSVNUX0hFQUQodG1wX2xpc3QpOworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YSwgdG1wLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGEtPmxhc3RfcnggKyBleHBfdGltZSkpIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSUJTU19ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleHBpcmluZyBpbmFjdGl2ZSBTVEEgJXNcbiIsCisJCQkgICAgICAgc2RhdGEtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgc3RhLT5zdGEuYWRkcikpOworI2VuZGlmCisJCQlfX3N0YV9pbmZvX3VubGluaygmc3RhKTsKKwkJCWlmIChzdGEpCisJCQkJbGlzdF9hZGQoJnN0YS0+bGlzdCwgJnRtcF9saXN0KTsKKwkJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YSwgdG1wLCAmdG1wX2xpc3QsIGxpc3QpCisJCXN0YV9pbmZvX2Rlc3Ryb3koc3RhKTsKK30KKworc3RydWN0IGllZWU4MDIxMV9zdGEgKmllZWU4MDIxMV9maW5kX3N0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmFkZHIpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBzdGFfaW5mb19nZXQoaHdfdG9fbG9jYWwoaHcpLCBhZGRyKTsKKworCWlmICghc3RhKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnN0YS0+c3RhOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZmluZF9zdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmggYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAppbmRleCAxMDlkYjc4Li4xNjhhMzlhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAorKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaApAQCAtMTY3LDggKzE2Nyw2IEBACiAgKiBAbG9jazogdXNlZCBmb3IgbG9ja2luZyBhbGwgZmllbGRzIHRoYXQgcmVxdWlyZSBsb2NraW5nLCBzZWUgY29tbWVudHMKICAqCWluIHRoZSBoZWFkZXIgZmlsZS4KICAqIEBmbGFnbG9jazogc3BpbmxvY2sgZm9yIGZsYWdzIGFjY2Vzc2VzCi0gKiBAaHRfaW5mbzogSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBCi0gKiBAc3VwcF9yYXRlczogQml0bWFwIG9mIHN1cHBvcnRlZCByYXRlcyAocGVyIGJhbmQpCiAgKiBAYWRkcjogTUFDIGFkZHJlc3Mgb2YgdGhpcyBTVEEKICAqIEBhaWQ6IFNUQSdzIHVuaXF1ZSBBSUQgKDEuLjIwMDcsIDAgPSBub3QgYXNzaWduZWQgeWV0KSwKICAqCW9ubHkgdXNlZCBpbiBBUCAoYW5kIElCU1M/KSBtb2RlCkBAIC0xOTEsMjAgKzE4OSwxNSBAQAogICogQGxhc3RfcXVhbDogcXVhbCBvZiBsYXN0IHJlY2VpdmVkIGZyYW1lIGZyb20gdGhpcyBTVEEKICAqIEBsYXN0X25vaXNlOiBub2lzZSBvZiBsYXN0IHJlY2VpdmVkIGZyYW1lIGZyb20gdGhpcyBTVEEKICAqIEBsYXN0X3NlcV9jdHJsOiBsYXN0IHJlY2VpdmVkIHNlcS9mcmFnIG51bWJlciBmcm9tIHRoaXMgU1RBIChwZXIgUlggcXVldWUpCi0gKiBAd21lX3J4X3F1ZXVlOiBUQkQKICAqIEB0eF9maWx0ZXJlZF9jb3VudDogVEJECiAgKiBAdHhfcmV0cnlfZmFpbGVkOiBUQkQKICAqIEB0eF9yZXRyeV9jb3VudDogVEJECi0gKiBAdHhfbnVtX2NvbnNlY3V0aXZlX2ZhaWx1cmVzOiBUQkQKLSAqIEB0eF9udW1fbXBkdV9vazogVEJECi0gKiBAdHhfbnVtX21wZHVfZmFpbDogVEJECiAgKiBAZmFpbF9hdmc6IG1vdmluZyBwZXJjZW50YWdlIG9mIGZhaWxlZCBNU0RVcwogICogQHR4X3BhY2tldHM6IG51bWJlciBvZiBSWC9UWCBNU0RVcwogICogQHR4X2J5dGVzOiBUQkQKICAqIEB0eF9mcmFnbWVudHM6IG51bWJlciBvZiB0cmFuc21pdHRlZCBNUERVcwotICogQHR4cmF0ZV9pZHg6IFRCRAotICogQGxhc3RfdHhyYXRlX2lkeDogVEJECi0gKiBAd21lX3R4X3F1ZXVlOiBUQkQKKyAqIEBsYXN0X3R4cmF0ZV9pZHg6IEluZGV4IG9mIHRoZSBsYXN0IHVzZWQgdHJhbnNtaXQgcmF0ZQorICogQHRpZF9zZXE6IFRCRAogICogQGFtcGR1X21sbWU6IFRCRAogICogQHRpbWVyX3RvX3RpZDogaWRlbnRpdHkgbWFwcGluZyB0byBJRCB0aW1lcnMKICAqIEB0aWRfdG9fdHhfcTogbWFwIHRpZCB0byB0eCBxdWV1ZQpAQCAtMjE3LDYgKzIxMCw3IEBACiAgKiBAcGxpbmtfdGltZW91dDogVEJECiAgKiBAcGxpbmtfdGltZXI6IFRCRAogICogQGRlYnVnZnM6IGRlYnVnIGZpbGVzeXN0ZW0gaW5mbworICogQHN0YTogc3RhdGlvbiBpbmZvcm1hdGlvbiB3ZSBzaGFyZSB3aXRoIHRoZSBkcml2ZXIKICAqLwogc3RydWN0IHN0YV9pbmZvIHsKIAkvKiBHZW5lcmFsIGluZm9ybWF0aW9uLCBtb3N0bHkgc3RhdGljICovCkBAIC0yMjksMTAgKzIyMyw3IEBACiAJdm9pZCAqcmF0ZV9jdHJsX3ByaXY7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXNwaW5sb2NrX3QgZmxhZ2xvY2s7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9pbmZvIGh0X2luZm87Ci0JdTY0IHN1cHBfcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU107Ci0JdTggYWRkcltFVEhfQUxFTl07Ci0JdTE2IGFpZDsKKwogCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAKIAkvKgpAQCAtMjY1LDE3ICsyNTYsMTAgQEAKIAlpbnQgbGFzdF9xdWFsOwogCWludCBsYXN0X25vaXNlOwogCV9fbGUxNiBsYXN0X3NlcV9jdHJsW05VTV9SWF9EQVRBX1FVRVVFU107Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHX0NPVU5URVJTCi0JdW5zaWduZWQgaW50IHdtZV9yeF9xdWV1ZVtOVU1fUlhfREFUQV9RVUVVRVNdOwotI2VuZGlmCiAKIAkvKiBVcGRhdGVkIGZyb20gVFggc3RhdHVzIHBhdGggb25seSwgbm8gbG9ja2luZyByZXF1aXJlbWVudHMgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2ZpbHRlcmVkX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgdHhfcmV0cnlfZmFpbGVkLCB0eF9yZXRyeV9jb3VudDsKLQkvKiBUT0RPOiB1cGRhdGUgaW4gZ2VuZXJpYyBjb2RlIG5vdCByYXRlIGNvbnRyb2w/ICovCi0JdTMyIHR4X251bV9jb25zZWN1dGl2ZV9mYWlsdXJlczsKLQl1MzIgdHhfbnVtX21wZHVfb2s7Ci0JdTMyIHR4X251bV9tcGR1X2ZhaWw7CiAJLyogbW92aW5nIHBlcmNlbnRhZ2Ugb2YgZmFpbGVkIE1TRFVzICovCiAJdW5zaWduZWQgaW50IGZhaWxfYXZnOwogCkBAIC0yODMsMTIgKzI2Nyw4IEBACiAJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZyB0eF9mcmFnbWVudHM7Ci0JaW50IHR4cmF0ZV9pZHg7Ci0JaW50IGxhc3RfdHhyYXRlX2lkeDsKKwl1bnNpZ25lZCBpbnQgbGFzdF90eHJhdGVfaWR4OwogCXUxNiB0aWRfc2VxW0lFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLICsgMV07Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHX0NPVU5URVJTCi0JdW5zaWduZWQgaW50IHdtZV90eF9xdWV1ZVtOVU1fUlhfREFUQV9RVUVVRVNdOwotI2VuZGlmCiAKIAkvKgogCSAqIEFnZ3JlZ2F0aW9uIGluZm9ybWF0aW9uLCBsb2NrZWQgd2l0aCBsb2NrLgpAQCAtMzE5LDEzICsyOTksMTMgQEAKIAkJc3RydWN0IGRlbnRyeSAqbnVtX3BzX2J1Zl9mcmFtZXM7CiAJCXN0cnVjdCBkZW50cnkgKmluYWN0aXZlX21zOwogCQlzdHJ1Y3QgZGVudHJ5ICpsYXN0X3NlcV9jdHJsOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR19DT1VOVEVSUwotCQlzdHJ1Y3QgZGVudHJ5ICp3bWVfcnhfcXVldWU7Ci0JCXN0cnVjdCBkZW50cnkgKndtZV90eF9xdWV1ZTsKLSNlbmRpZgogCQlzdHJ1Y3QgZGVudHJ5ICphZ2dfc3RhdHVzOworCQlib29sIGFkZF9oYXNfcnVuOwogCX0gZGVidWdmczsKICNlbmRpZgorCisJLyoga2VlcCBsYXN0ISAqLworCXN0cnVjdCBpZWVlODAyMTFfc3RhIHN0YTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgZW51bSBwbGlua19zdGF0ZSBzdGFfcGxpbmtfc3RhdGUoc3RydWN0IHN0YV9pbmZvICpzdGEpCkBAIC00MjUsNyArNDA1LDcgQEAKIC8qCiAgKiBHZXQgYSBTVEEgaW5mbywgbXVzdCBoYXZlIGJlIHVuZGVyIFJDVSByZWFkIGxvY2suCiAgKi8KLXN0cnVjdCBzdGFfaW5mbyAqc3RhX2luZm9fZ2V0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1OCAqYWRkcik7CitzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2dldChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgY29uc3QgdTggKmFkZHIpOwogLyoKICAqIEdldCBTVEEgaW5mbyBieSBpbmRleCwgQlJPS0VOIQogICovCkBAIC00NTEsNyArNDMxLDYgQEAKICAqIGhhcyBhbHJlYWR5IHVubGlua2VkIGl0LgogICovCiB2b2lkIHN0YV9pbmZvX3VubGluayhzdHJ1Y3Qgc3RhX2luZm8gKipzdGEpOwotdm9pZCBfX3N0YV9pbmZvX3VubGluayhzdHJ1Y3Qgc3RhX2luZm8gKipzdGEpOwogCiB2b2lkIHN0YV9pbmZvX2Rlc3Ryb3koc3RydWN0IHN0YV9pbmZvICpzdGEpOwogdm9pZCBzdGFfaW5mb19zZXRfdGltX2JpdChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CkBAIC00NjMsNSArNDQyLDcgQEAKIGludCBzdGFfaW5mb19mbHVzaChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgc3RhX2luZm9fZmx1c2hfZGVsYXllZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9zdGFfZXhwaXJlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICB1bnNpZ25lZCBsb25nIGV4cF90aW1lKTsKIAogI2VuZGlmIC8qIFNUQV9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90a2lwLmMgYi9uZXQvbWFjODAyMTEvdGtpcC5jCmluZGV4IDk5NWY3YWYuLjM0YjMyYmMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90a2lwLmMKKysrIGIvbmV0L21hYzgwMjExL3RraXAuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJCQlrZXktPmZsYWdzICYgS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkUpIHsKIAkJCXU4IGJjYXN0W0VUSF9BTEVOXSA9CiAJCQkJezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCQkJdTggKnN0YV9hZGRyID0ga2V5LT5zdGEtPmFkZHI7CisJCQl1OCAqc3RhX2FkZHIgPSBrZXktPnN0YS0+c3RhLmFkZHI7CiAKIAkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihyYSkpCiAJCQkJc3RhX2FkZHIgPSBiY2FzdDsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKaW5kZXggNDc4OGY3Yi4uMTQ2MDUzNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgwMjExL3R4LmMKQEAgLTM4LDQzICszOCw2IEBACiAKIC8qIG1pc2MgdXRpbHMgKi8KIAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MT1dUWF9GUkFNRV9EVU1QCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfZHVtcF9mcmFtZShjb25zdCBjaGFyICppZm5hbWUsIGNvbnN0IGNoYXIgKnRpdGxlLAotCQkJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0JdW5zaWduZWQgaW50IGhkcmxlbjsKLQlERUNMQVJFX01BQ19CVUYobWFjKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgKGxlbj0lZCkiLCBpZm5hbWUsIHRpdGxlLCBza2ItPmxlbik7Ci0JaWYgKHNrYi0+bGVuIDwgNCkgewotCQlwcmludGsoIlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0JaWYgKGhkcmxlbiA+IHNrYi0+bGVuKQotCQloZHJsZW4gPSBza2ItPmxlbjsKLQlpZiAoaGRybGVuID49IDQpCi0JCXByaW50aygiIEZDPTB4JTA0eCBEVVI9MHglMDR4IiwKLQkJICAgIGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCksIGxlMTZfdG9fY3B1KGhkci0+ZHVyYXRpb25faWQpKTsKLQlpZiAoaGRybGVuID49IDEwKQotCQlwcmludGsoIiBBMT0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjEpKTsKLQlpZiAoaGRybGVuID49IDE2KQotCQlwcmludGsoIiBBMj0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjIpKTsKLQlpZiAoaGRybGVuID49IDI0KQotCQlwcmludGsoIiBBMz0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjMpKTsKLQlpZiAoaGRybGVuID49IDMwKQotCQlwcmludGsoIiBBND0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjQpKTsKLQlwcmludGsoIlxuIik7Ci19Ci0jZWxzZSAvKiBDT05GSUdfTUFDODAyMTFfTE9XVFhfRlJBTUVfRFVNUCAqLwotc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9kdW1wX2ZyYW1lKGNvbnN0IGNoYXIgKmlmbmFtZSwgY29uc3QgY2hhciAqdGl0bGUsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IpCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0xPV1RYX0ZSQU1FX0RVTVAgKi8KLQogc3RhdGljIF9fbGUxNiBpZWVlODAyMTFfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwgaW50IGdyb3VwX2FkZHIsCiAJCQkJIGludCBuZXh0X2ZyYWdfbGVuKQogewpAQCAtODIsNiArNDUsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqdHhyYXRlOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gdHgtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAKIAlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbdHgtPmNoYW5uZWwtPmJhbmRdOwogCXR4cmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbdHgtPnJhdGVfaWR4XTsKQEAgLTEwNywxMCArNzEsMTAgQEAKIAkgKiAgIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIHJhdGUgYmVsb25naW5nIHRvIHRoZSBQSFkgcmF0ZXMgaW4gdGhlCiAJICogICBCU1NCYXNpY1JhdGVTZXQKIAkgKi8KLQotCWlmICgodHgtPmZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09IElFRUU4MDIxMV9GVFlQRV9DVEwpIHsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eC0+c2tiLT5kYXRhOworCWlmIChpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJLyogVE9ETzogVGhlc2UgY29udHJvbCBmcmFtZXMgYXJlIG5vdCBjdXJyZW50bHkgc2VudCBieQotCQkgKiA4MDIxMS5vLCBidXQgc2hvdWxkIHRoZXkgYmUgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24KKwkJICogbWFjODAyMTEsIGJ1dCBzaG91bGQgdGhleSBiZSBpbXBsZW1lbnRlZCwgdGhpcyBmdW5jdGlvbgogCQkgKiBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHN1cHBvcnQgZHVyYXRpb24gZmllbGQgY2FsY3VsYXRpb24uCiAJCSAqCiAJCSAqIFJUUzogdGltZSBuZWVkZWQgdG8gdHJhbnNtaXQgcGVuZGluZyBkYXRhL21nbXQgZnJhbWUgcGx1cwpAQCAtMTUyLDcgKzExNiw3IEBACiAJCWlmIChyLT5iaXRyYXRlID4gdHhyYXRlLT5iaXRyYXRlKQogCQkJYnJlYWs7CiAKLQkJaWYgKHR4LT5zZGF0YS0+YmFzaWNfcmF0ZXMgJiBCSVQoaSkpCisJCWlmICh0eC0+c2RhdGEtPmJzc19jb25mLmJhc2ljX3JhdGVzICYgQklUKGkpKQogCQkJcmF0ZSA9IHItPmJpdHJhdGU7CiAKIAkJc3dpdGNoIChzYmFuZC0+YmFuZCkgewpAQCAtMjAxLDExICsxNjUsMTAgQEAKIAlyZXR1cm4gY3B1X3RvX2xlMTYoZHVyKTsKIH0KIAotc3RhdGljIGludCBpbmxpbmUgaXNfaWVlZTgwMjExX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCitzdGF0aWMgaW50IGlubGluZSBpc19pZWVlODAyMTFfZGV2aWNlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuICh3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKSA9PQotCQl3ZGV2X3ByaXYobWFzdGVyLT5pZWVlODAyMTFfcHRyKSk7CisJcmV0dXJuIGxvY2FsID09IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwogfQogCiAvKiB0eCBoYW5kbGVycyAqLwpAQCAtMjEzLDIxICsxNzYsMTkgQEAKIHN0YXRpYyBpZWVlODAyMTFfdHhfcmVzdWx0IGRlYnVnX25vaW5saW5lCiBpZWVlODAyMTFfdHhfaF9jaGVja19hc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCisKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHgtPnNrYi0+ZGF0YTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRyAqLwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHgtPnNrYik7CiAJdTMyIHN0YV9mbGFnczsKIAogCWlmICh1bmxpa2VseShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfSU5KRUNURUQpKQogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAKLQlpZiAodW5saWtlbHkodHgtPmxvY2FsLT5zdGFfc3dfc2Nhbm5pbmcpICYmCi0JICAgICgodHgtPmZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICE9IElFRUU4MDIxMV9GVFlQRV9NR01UIHx8Ci0JICAgICAodHgtPmZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpICE9IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpKQorCWlmICh1bmxpa2VseSh0eC0+bG9jYWwtPnN3X3NjYW5uaW5nKSAmJgorCSAgICAhaWVlZTgwMjExX2lzX3Byb2JlX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlyZXR1cm4gVFhfRFJPUDsKIAotCWlmICh0eC0+c2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX01FU0hfUE9JTlQpCisJaWYgKHR4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJaWYgKHR4LT5mbGFncyAmIElFRUU4MDIxMV9UWF9QU19CVUZGRVJFRCkKQEAgLTIzNyw4ICsxOTgsOCBAQAogCiAJaWYgKGxpa2VseSh0eC0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfVU5JQ0FTVCkpIHsKIAkJaWYgKHVubGlrZWx5KCEoc3RhX2ZsYWdzICYgV0xBTl9TVEFfQVNTT0MpICYmCi0JCQkgICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUyAmJgotCQkJICAgICAodHgtPmZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSkgeworCQkJICAgICB0eC0+c2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJCQkgICAgIGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpKSB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAkJCURFQ0xBUkVfTUFDX0JVRihtYWMpOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIGRhdGEgZnJhbWUgdG8gbm90ICIKQEAgLTI0OSw5ICsyMTAsOSBAQAogCQkJcmV0dXJuIFRYX0RST1A7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAodW5saWtlbHkoKHR4LT5mYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSAmJgorCQlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCQkJICAgICB0eC0+bG9jYWwtPm51bV9zdGEgPT0gMCAmJgotCQkJICAgICB0eC0+c2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpKSB7CisJCQkgICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7CiAJCQkvKgogCQkJICogTm8gYXNzb2NpYXRlZCBTVEFzIC0gbm8gbmVlZCB0byBzZW5kIG11bHRpY2FzdAogCQkJICogZnJhbWVzLgpAQCAtMjgyLDcgKzI0Myw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfYXAgKmFwOwotCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0FQKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQogCQkJY29udGludWU7CiAJCWFwID0gJnNkYXRhLT51LmFwOwogCQlza2IgPSBza2JfZGVxdWV1ZSgmYXAtPnBzX2JjX2J1Zik7CkBAIC0zMTUsNiArMjc2LDcgQEAKIGllZWU4MDIxMV90eF9oX211bHRpY2FzdF9wc19idWYoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eC0+c2tiLT5kYXRhOwogCiAJLyoKIAkgKiBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lCkBAIC0zMjksNyArMjkxLDcgQEAKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJLyogbm8gYnVmZmVyaW5nIGZvciBvcmRlcmVkIGZyYW1lcyAqLwotCWlmICh0eC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9PUkRFUikKKwlpZiAoaWVlZTgwMjExX2hhc19vcmRlcihoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAKIAkvKiBubyBzdGF0aW9ucyBpbiBQUyBtb2RlICovCkBAIC0zNjcsMTIgKzMyOSwxMSBAQAogewogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gdHgtPnN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eC0+c2tiLT5kYXRhOwogCXUzMiBzdGFmbGFnczsKIAlERUNMQVJFX01BQ19CVUYobWFjKTsKIAotCWlmICh1bmxpa2VseSghc3RhIHx8Ci0JCSAgICAgKCh0eC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgJiYKLQkJICAgICAgKHR4LT5mYyAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSA9PSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCkpKQorCWlmICh1bmxpa2VseSghc3RhIHx8IGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCkpKQogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAKIAlzdGFmbGFncyA9IGdldF9zdGFfZmxhZ3Moc3RhKTsKQEAgLTM4Miw3ICszNDMsNyBAQAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICJTVEEgJXMgYWlkICVkOiBQUyBidWZmZXIgKGVudHJpZXMgIgogCQkgICAgICAgImJlZm9yZSAlZClcbiIsCi0JCSAgICAgICBwcmludF9tYWMobWFjLCBzdGEtPmFkZHIpLCBzdGEtPmFpZCwKKwkJICAgICAgIHByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpLCBzdGEtPnN0YS5haWQsCiAJCSAgICAgICBza2JfcXVldWVfbGVuKCZzdGEtPnBzX3R4X2J1ZikpOwogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHICovCiAJCWlmICh0eC0+bG9jYWwtPnRvdGFsX3BzX2J1ZmZlcmVkID49IFRPVEFMX01BWF9UWF9CVUZGRVIpCkBAIC0zOTMsNyArMzU0LDcgQEAKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNUQSAlcyBUWCAiCiAJCQkJICAgICAgICJidWZmZXIgZnVsbCAtIGRyb3BwaW5nIG9sZGVzdCBmcmFtZVxuIiwKLQkJCQkgICAgICAgdHgtPmRldi0+bmFtZSwgcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCQkJICAgICAgIHR4LT5kZXYtPm5hbWUsIHByaW50X21hYyhtYWMsIHN0YS0+c3RhLmFkZHIpKTsKIAkJCX0KICNlbmRpZgogCQkJZGV2X2tmcmVlX3NrYihvbGQpOwpAQCAtNDEyLDcgKzM3Myw3IEBACiAJZWxzZSBpZiAodW5saWtlbHkodGVzdF9zdGFfZmxhZ3Moc3RhLCBXTEFOX1NUQV9QUykpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogU1RBICVzIGluIFBTIG1vZGUsIGJ1dCBwc3BvbGwgIgogCQkgICAgICAgInNldCAtPiBzZW5kIGZyYW1lXG4iLCB0eC0+ZGV2LT5uYW1lLAotCQkgICAgICAgcHJpbnRfbWFjKG1hYywgc3RhLT5hZGRyKSk7CisJCSAgICAgICBwcmludF9tYWMobWFjLCBzdGEtPnN0YS5hZGRyKSk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX1BTX0RFQlVHICovCiAJY2xlYXJfc3RhX2ZsYWdzKHN0YSwgV0xBTl9TVEFfUFNQT0xMKTsKQEAgLTQzNyw3ICszOTgsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXk7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eC0+c2tiKTsKLQl1MTYgZmMgPSB0eC0+ZmM7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4LT5za2ItPmRhdGE7CiAKIAlpZiAodW5saWtlbHkodHgtPnNrYi0+ZG9fbm90X2VuY3J5cHQpKQogCQl0eC0+a2V5ID0gTlVMTDsKQEAgLTQ1NCwyMiArNDE1LDE2IEBACiAJCXR4LT5rZXkgPSBOVUxMOwogCiAJaWYgKHR4LT5rZXkpIHsKLQkJdTE2IGZ0eXBlLCBzdHlwZTsKLQogCQl0eC0+a2V5LT50eF9yeF9jb3VudCsrOwogCQkvKiBUT0RPOiBhZGQgdGhyZXNob2xkIHN0dWZmIGFnYWluICovCiAKIAkJc3dpdGNoICh0eC0+a2V5LT5jb25mLmFsZykgewogCQljYXNlIEFMR19XRVA6Ci0JCQlmdHlwZSA9IGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEU7Ci0JCQlzdHlwZSA9IGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEU7Ci0KLQkJCWlmIChmdHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCAmJgotCQkJICAgIHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9BVVRIKQorCQkJaWYgKGllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCQkJYnJlYWs7CiAJCWNhc2UgQUxHX1RLSVA6CiAJCWNhc2UgQUxHX0NDTVA6Ci0JCQlpZiAoIVdMQU5fRkNfREFUQV9QUkVTRU5UKGZjKSkKKwkJCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcHJlc2VudChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQkJCXR4LT5rZXkgPSBOVUxMOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ5MSwyMCArNDQ2LDI0IEBACiAJc2JhbmQgPSB0eC0+bG9jYWwtPmh3LndpcGh5LT5iYW5kc1t0eC0+Y2hhbm5lbC0+YmFuZF07CiAKIAlpZiAobGlrZWx5KHR4LT5yYXRlX2lkeCA8IDApKSB7Ci0JCXJhdGVfY29udHJvbF9nZXRfcmF0ZSh0eC0+ZGV2LCBzYmFuZCwgdHgtPnNrYiwgJnJzZWwpOworCQlyYXRlX2NvbnRyb2xfZ2V0X3JhdGUodHgtPnNkYXRhLCBzYmFuZCwgdHgtPnN0YSwKKwkJCQkgICAgICB0eC0+c2tiLCAmcnNlbCk7CisJCWlmICh0eC0+c3RhKQorCQkJdHgtPnN0YS0+bGFzdF90eHJhdGVfaWR4ID0gcnNlbC5yYXRlX2lkeDsKIAkJdHgtPnJhdGVfaWR4ID0gcnNlbC5yYXRlX2lkeDsKIAkJaWYgKHVubGlrZWx5KHJzZWwucHJvYmVfaWR4ID49IDApKSB7CiAJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKIAkJCXR4LT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUFJPQkVfTEFTVF9GUkFHOwotCQkJaW5mby0+Y29udHJvbC5hbHRfcmV0cnlfcmF0ZV9pZHggPSB0eC0+cmF0ZV9pZHg7CisJCQlpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ucmF0ZV9pZHggPSB0eC0+cmF0ZV9pZHg7CisJCQlpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ubGltaXQgPSB0eC0+bG9jYWwtPmh3Lm1heF9hbHRyYXRlX3RyaWVzOwogCQkJdHgtPnJhdGVfaWR4ID0gcnNlbC5wcm9iZV9pZHg7Ci0JCX0gZWxzZQotCQkJaW5mby0+Y29udHJvbC5hbHRfcmV0cnlfcmF0ZV9pZHggPSAtMTsKKwkJfSBlbHNlIGlmIChpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ubGltaXQgPT0gMCkKKwkJCWluZm8tPmNvbnRyb2wucmV0cmllc1swXS5yYXRlX2lkeCA9IC0xOwogCiAJCWlmICh1bmxpa2VseSh0eC0+cmF0ZV9pZHggPCAwKSkKIAkJCXJldHVybiBUWF9EUk9QOwogCX0gZWxzZQotCQlpbmZvLT5jb250cm9sLmFsdF9yZXRyeV9yYXRlX2lkeCA9IC0xOworCQlpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ucmF0ZV9pZHggPSAtMTsKIAogCWlmICh0eC0+c2RhdGEtPmJzc19jb25mLnVzZV9jdHNfcHJvdCAmJgogCSAgICAodHgtPmZsYWdzICYgSUVFRTgwMjExX1RYX0ZSQUdNRU5URUQpICYmIChyc2VsLm5vbmVycF9pZHggPj0gMCkpIHsKQEAgLTUzNSw3ICs0OTQsNyBAQAogCXNiYW5kID0gdHgtPmxvY2FsLT5ody53aXBoeS0+YmFuZHNbdHgtPmNoYW5uZWwtPmJhbmRdOwogCiAJaWYgKHR4LT5zdGEpCi0JCWluZm8tPmNvbnRyb2wuYWlkID0gdHgtPnN0YS0+YWlkOworCQlpbmZvLT5jb250cm9sLnN0YSA9ICZ0eC0+c3RhLT5zdGE7CiAKIAlpZiAoIWluZm8tPmNvbnRyb2wucmV0cnlfbGltaXQpIHsKIAkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewpAQCAtNTYzLDcgKzUyMiw3IEBACiAJCSAqIGZyYW1lcy4KIAkJICogVE9ETzogVGhlIGxhc3QgZnJhZ21lbnQgY291bGQgc3RpbGwgdXNlIG11bHRpcGxlIHJldHJ5CiAJCSAqIHJhdGVzLiAqLwotCQlpbmZvLT5jb250cm9sLmFsdF9yZXRyeV9yYXRlX2lkeCA9IC0xOworCQlpbmZvLT5jb250cm9sLnJldHJpZXNbMF0ucmF0ZV9pZHggPSAtMTsKIAl9CiAKIAkvKiBVc2UgQ1RTIHByb3RlY3Rpb24gZm9yIHVuaWNhc3QgZnJhbWVzIHNlbnQgdXNpbmcgZXh0ZW5kZWQgcmF0ZXMgaWYKQEAgLTU5Myw3ICs1NTIsNyBAQAogCQlpbnQgaWR4OwogCiAJCS8qIERvIG5vdCB1c2UgbXVsdGlwbGUgcmV0cnkgcmF0ZXMgd2hlbiB1c2luZyBSVFMvQ1RTICovCi0JCWluZm8tPmNvbnRyb2wuYWx0X3JldHJ5X3JhdGVfaWR4ID0gLTE7CisJCWluZm8tPmNvbnRyb2wucmV0cmllc1swXS5yYXRlX2lkeCA9IC0xOwogCiAJCS8qIFVzZSBtaW4oZGF0YSByYXRlLCBtYXggYmFzZSByYXRlKSBhcyBDVFMvUlRTIHJhdGUgKi8KIAkJcmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbdHgtPnJhdGVfaWR4XTsKQEAgLTYwMSw3ICs1NjAsNyBAQAogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpZHgrKykgewogCQkJaWYgKHNiYW5kLT5iaXRyYXRlc1tpZHhdLmJpdHJhdGUgPiByYXRlLT5iaXRyYXRlKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKHR4LT5zZGF0YS0+YmFzaWNfcmF0ZXMgJiBCSVQoaWR4KSAmJgorCQkJaWYgKHR4LT5zZGF0YS0+YnNzX2NvbmYuYmFzaWNfcmF0ZXMgJiBCSVQoaWR4KSAmJgogCQkJICAgIChiYXNlcmF0ZSA8IDAgfHwKIAkJCSAgICAgKHNiYW5kLT5iaXRyYXRlc1tiYXNlcmF0ZV0uYml0cmF0ZQogCQkJICAgICAgPCBzYmFuZC0+Yml0cmF0ZXNbaWR4XS5iaXRyYXRlKSkpCkBAIC02MTUsNyArNTc0LDcgQEAKIAl9CiAKIAlpZiAodHgtPnN0YSkKLQkJaW5mby0+Y29udHJvbC5haWQgPSB0eC0+c3RhLT5haWQ7CisJCWluZm8tPmNvbnRyb2wuc3RhID0gJnR4LT5zdGEtPnN0YTsKIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTYyOSw3ICs1ODgsMTQgQEAKIAl1OCAqcWM7CiAJaW50IHRpZDsKIAotCS8qIG9ubHkgZm9yIGluamVjdGVkIGZyYW1lcyAqLworCS8qCisJICogUGFja2V0IGluamVjdGlvbiBtYXkgd2FudCB0byBjb250cm9sIHRoZSBzZXF1ZW5jZQorCSAqIG51bWJlciwgaWYgd2UgaGF2ZSBubyBtYXRjaGluZyBpbnRlcmZhY2UgdGhlbiB3ZQorCSAqIG5laXRoZXIgYXNzaWduIG9uZSBvdXJzZWx2ZXMgbm9yIGFzayB0aGUgZHJpdmVyIHRvLgorCSAqLworCWlmICh1bmxpa2VseSghaW5mby0+Y29udHJvbC52aWYpKQorCQlyZXR1cm4gVFhfQ09OVElOVUU7CisKIAlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2N0bChoZHItPmZyYW1lX2NvbnRyb2wpKSkKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCkBAIC04NTQsNyArODIwLDYgQEAKIAlzYmFuZCA9IHR4LT5sb2NhbC0+aHcud2lwaHktPmJhbmRzW3R4LT5jaGFubmVsLT5iYW5kXTsKIAogCXNrYi0+ZG9fbm90X2VuY3J5cHQgPSAxOwotCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfSU5KRUNURUQ7CiAJdHgtPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfRlJBR01FTlRFRDsKIAogCS8qCkBAIC05ODYsNyArOTUxLDcgQEAKIAogCS8qIHByb2Nlc3MgYW5kIHJlbW92ZSB0aGUgaW5qZWN0aW9uIHJhZGlvdGFwIGhlYWRlciAqLwogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAodW5saWtlbHkoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX01OVFIpKSB7CisJaWYgKHVubGlrZWx5KGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9JTkpFQ1RFRCkpIHsKIAkJaWYgKF9faWVlZTgwMjExX3BhcnNlX3R4X3JhZGlvdGFwKHR4LCBza2IpID09IFRYX0RST1ApCiAJCQlyZXR1cm4gVFhfRFJPUDsKIApAQCAtMTAwMCw3ICs5NjUsNiBAQAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAKIAl0eC0+c3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBoZHItPmFkZHIxKTsKLQl0eC0+ZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CiAJCXR4LT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX1VOSUNBU1Q7CkBAIC0xMDI1LDcgKzk4OSw3IEBACiAJZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfc3RhX2ZsYWdzKHR4LT5zdGEsIFdMQU5fU1RBX0NMRUFSX1BTX0ZJTFQpKQogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0NMRUFSX1BTX0ZJTFQ7CiAKLQloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbih0eC0+ZmMpOworCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKIAlpZiAoc2tiLT5sZW4gPiBoZHJsZW4gKyBzaXplb2YocmZjMTA0Ml9oZWFkZXIpICsgMikgewogCQl1OCAqcG9zID0gJnNrYi0+ZGF0YVtoZHJsZW4gKyBzaXplb2YocmZjMTA0Ml9oZWFkZXIpXTsKIAkJdHgtPmV0aGVydHlwZSA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMV07CkBAIC0xMDM4LDE0ICsxMDAyLDE0IEBACiAvKgogICogTkI6IEB0eCBpcyB1bmluaXRpYWxpc2VkIHdoZW4gcGFzc2VkIGluIGhlcmUKICAqLwotc3RhdGljIGludCBpZWVlODAyMTFfdHhfcHJlcGFyZShzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4LAotCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IG5ldF9kZXZpY2UgKm1kZXYpCitzdGF0aWMgaW50IGllZWU4MDIxMV90eF9wcmVwYXJlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCiAJZGV2ID0gZGV2X2dldF9ieV9pbmRleCgmaW5pdF9uZXQsIHNrYi0+aWlmKTsKLQlpZiAodW5saWtlbHkoZGV2ICYmICFpc19pZWVlODAyMTFfZGV2aWNlKGRldiwgbWRldikpKSB7CisJaWYgKHVubGlrZWx5KGRldiAmJiAhaXNfaWVlZTgwMjExX2RldmljZShsb2NhbCwgZGV2KSkpIHsKIAkJZGV2X3B1dChkZXYpOwogCQlkZXYgPSBOVUxMOwogCX0KQEAgLTEwNjgsOCArMTAzMiw2IEBACiAJCQlyZXR1cm4gSUVFRTgwMjExX1RYX0FHQUlOOwogCQlpbmZvID0gIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAotCQlpZWVlODAyMTFfZHVtcF9mcmFtZSh3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSksCi0JCQkJICAgICAiVFggdG8gbG93LWxldmVsIGRyaXZlciIsIHNrYik7CiAJCXJldCA9IGxvY2FsLT5vcHMtPnR4KGxvY2FsX3RvX2h3KGxvY2FsKSwgc2tiKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiBJRUVFODAyMTFfVFhfQUdBSU47CkBAIC0xMDk5LDkgKzEwNjEsNiBAQAogCQkJCQkJfklFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFOwogCQkJfQogCi0JCQlpZWVlODAyMTFfZHVtcF9mcmFtZSh3aXBoeV9uYW1lKGxvY2FsLT5ody53aXBoeSksCi0JCQkJCSAgICAgIlRYIHRvIGxvdy1sZXZlbCBkcml2ZXIiLAotCQkJCQkgICAgIHR4LT5leHRyYV9mcmFnW2ldKTsKIAkJCXJldCA9IGxvY2FsLT5vcHMtPnR4KGxvY2FsX3RvX2h3KGxvY2FsKSwKIAkJCQkJICAgIHR4LT5leHRyYV9mcmFnW2ldKTsKIAkJCWlmIChyZXQpCkBAIC0xMjk3LDIwICsxMjU2LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpZWVlODAyMTFfbWFzdGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraW50IGllZWU4MDIxMV9tYXN0ZXJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBpZWVlODAyMTFfbWFzdGVyX3ByaXYgKm1wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IG1wcml2LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXYgPSBOVUxMOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKm9zZGF0YTsKIAlpbnQgaGVhZHJvb207CiAJYm9vbCBtYXlfZW5jcnlwdDsKKwllbnVtIHsKKwkJTk9UX01PTklUT1IsCisJCUZPVU5EX1NEQVRBLAorCQlVTktOT1dOX0FERFJFU1MsCisJfSBtb25pdG9yX2lmYWNlID0gTk9UX01PTklUT1I7CiAJaW50IHJldDsKIAogCWlmIChza2ItPmlpZikKIAkJb2RldiA9IGRldl9nZXRfYnlfaW5kZXgoJmluaXRfbmV0LCBza2ItPmlpZik7Ci0JaWYgKHVubGlrZWx5KG9kZXYgJiYgIWlzX2llZWU4MDIxMV9kZXZpY2Uob2RldiwgZGV2KSkpIHsKKwlpZiAodW5saWtlbHkob2RldiAmJiAhaXNfaWVlZTgwMjExX2RldmljZShsb2NhbCwgb2RldikpKSB7CiAJCWRldl9wdXQob2Rldik7CiAJCW9kZXYgPSBOVUxMOwogCX0KQEAgLTEzMzEsMTUgKzEyOTYsNTUgQEAKIAogCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJm9zZGF0YS0+dmlmKSAmJgogCSAgICBpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMykpCi0JCQkJbWVtY3B5KGhkci0+YWRkcjEsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKLQkJCWVsc2UKLQkJCQlpZiAobWVzaF9uZXh0aG9wX2xvb2t1cChza2IsIG9kZXYpKQotCQkJCQlyZXR1cm4gIDA7Ci0JCQlpZiAobWVtY21wKG9kZXYtPmRldl9hZGRyLCBoZHItPmFkZHI0LCBFVEhfQUxFTikgIT0gMCkKLQkJCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZvc2RhdGEtPnUuc3RhLAotCQkJCQkJCSAgICAgZndkZWRfZnJhbWVzKTsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjMpKQorCQkJbWVtY3B5KGhkci0+YWRkcjEsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJZWxzZQorCQkJaWYgKG1lc2hfbmV4dGhvcF9sb29rdXAoc2tiLCBvc2RhdGEpKQorCQkJCXJldHVybiAgMDsKKwkJaWYgKG1lbWNtcChvZGV2LT5kZXZfYWRkciwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pICE9IDApCisJCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZvc2RhdGEtPnUubWVzaCwKKwkJCQkJCQkgICAgZndkZWRfZnJhbWVzKTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KG9zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJCWludCBoZHJsZW47CisJCXUxNiBsZW5fcnRoZHI7CisKKwkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9JTkpFQ1RFRDsKKwkJbW9uaXRvcl9pZmFjZSA9IFVOS05PV05fQUREUkVTUzsKKworCQlsZW5fcnRoZHIgPSBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbihza2ItPmRhdGEpOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEgKyBsZW5fcnRoZHI7CisJCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKKworCQkvKiBjaGVjayB0aGUgaGVhZGVyIGlzIGNvbXBsZXRlIGluIHRoZSBmcmFtZSAqLworCQlpZiAobGlrZWx5KHNrYi0+bGVuID49IGxlbl9ydGhkciArIGhkcmxlbikpIHsKKwkJCS8qCisJCQkgKiBXZSBwcm9jZXNzIG91dGdvaW5nIGluamVjdGVkIGZyYW1lcyB0aGF0IGhhdmUgYQorCQkJICogbG9jYWwgYWRkcmVzcyB3ZSBoYW5kbGUgYXMgdGhvdWdoIHRoZXkgYXJlIG91cgorCQkJICogb3duIGZyYW1lcy4KKwkJCSAqIFRoaXMgY29kZSBoZXJlIGlzbid0IGVudGlyZWx5IGNvcnJlY3QsIHRoZSBsb2NhbAorCQkJICogTUFDIGFkZHJlc3MgaXMgbm90IG5lY2Vzc2FyaWx5IGVub3VnaCB0byBmaW5kCisJCQkgKiB0aGUgaW50ZXJmYWNlIHRvIHVzZTsgZm9yIHRoYXQgcHJvcGVyIFZMQU4vV0RTCisJCQkgKiBzdXBwb3J0IHdlIHdpbGwgbmVlZCBhIGRpZmZlcmVudCBtZWNoYW5pc20uCisJCQkgKi8KKworCQkJcmN1X3JlYWRfbG9jaygpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywKKwkJCQkJCWxpc3QpIHsKKwkJCQlpZiAoIW5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoc2RhdGEtPmRldi0+ZGV2X2FkZHIsCisJCQkJCQkgICAgICAgaGRyLT5hZGRyMikpIHsKKwkJCQkJZGV2X2hvbGQoc2RhdGEtPmRldik7CisJCQkJCWRldl9wdXQob2Rldik7CisJCQkJCW9zZGF0YSA9IHNkYXRhOworCQkJCQlvZGV2ID0gb3NkYXRhLT5kZXY7CisJCQkJCXNrYi0+aWlmID0gc2RhdGEtPmRldi0+aWZpbmRleDsKKwkJCQkJbW9uaXRvcl9pZmFjZSA9IEZPVU5EX1NEQVRBOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJfQogCX0KIApAQCAtMTM1Nyw3ICsxMzYyLDEyIEBACiAJCXJldHVybiAwOwogCX0KIAotCWluZm8tPmNvbnRyb2wudmlmID0gJm9zZGF0YS0+dmlmOworCWlmIChvc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCisJCW9zZGF0YSA9IGNvbnRhaW5lcl9vZihvc2RhdGEtPmJzcywKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAorCQkJCSAgICAgIHUuYXApOworCWlmIChsaWtlbHkobW9uaXRvcl9pZmFjZSAhPSBVTktOT1dOX0FERFJFU1MpKQorCQlpbmZvLT5jb250cm9sLnZpZiA9ICZvc2RhdGEtPnZpZjsKIAlyZXQgPSBpZWVlODAyMTFfdHgob2Rldiwgc2tiKTsKIAlkZXZfcHV0KG9kZXYpOwogCkBAIC0xNDM3LDggKzE0NDcsOCBAQAogaW50IGllZWU4MDIxMV9zdWJpZl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdkZXZfcHJpdihkZXYtPmllZWU4MDIxMV9wdHIpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlpbnQgcmV0ID0gMSwgaGVhZF9uZWVkOwogCXUxNiBldGhlcnR5cGUsIGhkcmxlbiwgIG1lc2hoZHJsZW4gPSAwOwogCV9fbGUxNiBmYzsKQEAgLTE0NTAsNyArMTQ2MCw2IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJdTMyIHN0YV9mbGFncyA9IDA7CiAKLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX0hMRU4pKSB7CiAJCXJldCA9IDA7CiAJCWdvdG8gZmFpbDsKQEAgLTE0NjUsOCArMTQ3NCw4IEBACiAJZmMgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9TVFlQRV9EQVRBKTsKIAogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1ZMQU46CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWZjIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7CiAJCS8qIERBIEJTU0lEIFNBICovCiAJCW1lbWNweShoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOwpAQCAtMTQ3NCw3ICsxNDgzLDcgQEAKIAkJbWVtY3B5KGhkci5hZGRyMywgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKIAkJaGRybGVuID0gMjQ7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfV0RTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCQlmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKTsKIAkJLyogUkEgVEEgREEgU0EgKi8KIAkJbWVtY3B5KGhkci5hZGRyMSwgc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyLCBFVEhfQUxFTik7CkBAIC0xNDg0LDI0ICsxNDkzLDU2IEBACiAJCWhkcmxlbiA9IDMwOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CiAJCWZjIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpOwotCQkvKiBSQSBUQSBEQSBTQSAqLwotCQltZW1zZXQoaGRyLmFkZHIxLCAwLCBFVEhfQUxFTik7Ci0JCW1lbWNweShoZHIuYWRkcjIsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGhkci5hZGRyMywgc2tiLT5kYXRhLCBFVEhfQUxFTik7Ci0JCW1lbWNweShoZHIuYWRkcjQsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7Ci0JCWlmICghc2RhdGEtPnUuc3RhLm1zaGNmZy5kb3QxMU1lc2hUVEwpIHsKKwkJaWYgKCFzZGF0YS0+dS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hUVEwpIHsKIAkJCS8qIERvIG5vdCBzZW5kIGZyYW1lcyB3aXRoIG1lc2hfdHRsID09IDAgKi8KLQkJCXNkYXRhLT51LnN0YS5tc2hzdGF0cy5kcm9wcGVkX2ZyYW1lc190dGwrKzsKKwkJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfdHRsKys7CiAJCQlyZXQgPSAwOwogCQkJZ290byBmYWlsOwogCQl9Ci0JCW1lc2hoZHJsZW4gPSBpZWVlODAyMTFfbmV3X21lc2hfaGVhZGVyKCZtZXNoX2hkciwgc2RhdGEpOworCQltZW1zZXQoJm1lc2hfaGRyLCAwLCBzaXplb2YobWVzaF9oZHIpKTsKKworCQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIsCisJCQkJCSAgc2tiLT5kYXRhICsgRVRIX0FMRU4pID09IDApIHsKKwkJCS8qIFJBIFRBIERBIFNBICovCisJCQltZW1zZXQoaGRyLmFkZHIxLCAwLCBFVEhfQUxFTik7CisJCQltZW1jcHkoaGRyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoaGRyLmFkZHIzLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShoZHIuYWRkcjQsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCQltZXNoaGRybGVuID0gaWVlZTgwMjExX25ld19tZXNoX2hlYWRlcigmbWVzaF9oZHIsIHNkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHBhY2tldCBmcm9tIG90aGVyIGludGVyZmFjZSAqLworCQkJc3RydWN0IG1lc2hfcGF0aCAqbXBwYXRoOworCisJCQltZW1zZXQoaGRyLmFkZHIxLCAwLCBFVEhfQUxFTik7CisJCQltZW1jcHkoaGRyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoaGRyLmFkZHI0LCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihza2ItPmRhdGEpKQorCQkJCW1lbWNweShoZHIuYWRkcjMsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQkJZWxzZSB7CisJCQkJcmN1X3JlYWRfbG9jaygpOworCQkJCW1wcGF0aCA9IG1wcF9wYXRoX2xvb2t1cChza2ItPmRhdGEsIHNkYXRhKTsKKwkJCQlpZiAobXBwYXRoKQorCQkJCQltZW1jcHkoaGRyLmFkZHIzLCBtcHBhdGgtPm1wcCwgRVRIX0FMRU4pOworCQkJCWVsc2UKKwkJCQkJbWVtc2V0KGhkci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJfQorCisJCQltZXNoX2hkci5mbGFncyB8PSBNRVNIX0ZMQUdTX0FFX0E1X0E2OworCQkJbWVzaF9oZHIudHRsID0gc2RhdGEtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoVFRMOworCQkJcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMihzZGF0YS0+dS5tZXNoLm1lc2hfc2VxbnVtKSwgJm1lc2hfaGRyLnNlcW51bSk7CisJCQltZW1jcHkobWVzaF9oZHIuZWFkZHIxLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShtZXNoX2hkci5lYWRkcjIsIHNrYi0+ZGF0YSArIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCQlzZGF0YS0+dS5tZXNoLm1lc2hfc2VxbnVtKys7CisJCQltZXNoaGRybGVuID0gMTg7CisJCX0KIAkJaGRybGVuID0gMzA7CiAJCWJyZWFrOwogI2VuZGlmCi0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQlmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKIAkJLyogQlNTSUQgU0EgREEgKi8KIAkJbWVtY3B5KGhkci5hZGRyMSwgc2RhdGEtPnUuc3RhLmJzc2lkLCBFVEhfQUxFTik7CkBAIC0xNTA5LDcgKzE1NTAsNyBAQAogCQltZW1jcHkoaGRyLmFkZHIzLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKIAkJaGRybGVuID0gMjQ7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQkvKiBEQSBTQSBCU1NJRCAqLwogCQltZW1jcHkoaGRyLmFkZHIxLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKIAkJbWVtY3B5KGhkci5hZGRyMiwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKQEAgLTE1ODgsMTkgKzE2MjksNiBAQAogCW5oX3BvcyAtPSBza2lwX2hlYWRlcl9ieXRlczsKIAloX3BvcyAtPSBza2lwX2hlYWRlcl9ieXRlczsKIAotCS8qIFRPRE86IGltcGxlbWVudCBzdXBwb3J0IGZvciBmcmFnbWVudHMgc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvCi0JICogcmVhbGxvY2F0ZSBhbmQgY29weSBwYXlsb2FkOyBpdCBtaWdodCBiZSBlbm91Z2ggdG8gc3VwcG9ydCBvbmUKLQkgKiBleHRyYSBmcmFnbWVudCB0aGF0IHdvdWxkIGJlIGNvcGllZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZQotCSAqIGRhdGEuLiBhbnl3YXksIGl0IHdvdWxkIGJlIG5pY2UgdG8gaW5jbHVkZSB0aGlzIGludG8gc2tiIHN0cnVjdHVyZQotCSAqIHNvbWVob3cKLQkgKgotCSAqIFRoZXJlIGFyZSBmZXcgb3B0aW9ucyBmb3IgdGhpczoKLQkgKiB1c2Ugc2tiLT5jYiBhcyBhbiBleHRyYSBzcGFjZSBmb3IgODAyLjExIGhlYWRlcgotCSAqIGFsbG9jYXRlIG5ldyBidWZmZXIgaWYgbm90IGVub3VnaCBoZWFkcm9vbQotCSAqIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBoZWFkcm9vbSBpbiBldmVyeSBza2IgYnkgaW5jcmVhc2luZwotCSAqIGJ1aWxkIGluIGhlYWRyb29tIGluIF9fZGV2X2FsbG9jX3NrYigpIChsaW51eC9za2J1ZmYuaCkgYW5kCi0JICogYWxsb2Nfc2tiKCkgKG5ldC9jb3JlL3NrYnVmZi5jKQotCSAqLwogCWhlYWRfbmVlZCA9IGhkcmxlbiArIGVuY2Fwc19sZW4gKyBtZXNoaGRybGVuIC0gc2tiX2hlYWRyb29tKHNrYik7CiAKIAkvKgpAQCAtMTgyMywxMCArMTg1MSw3IEBACiAJc3RydWN0IHJhdGVfc2VsZWN0aW9uIHJzZWw7CiAJc3RydWN0IGJlYWNvbl9kYXRhICpiZWFjb247CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCWludCAqbnVtX2JlYWNvbnM7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZDsKLQl1OCAqcG9zOwogCiAJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdOwogCkBAIC0xODM1LDcgKzE4NjAsNyBAQAogCXNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CiAJYmRldiA9IHNkYXRhLT5kZXY7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0FQKSB7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewogCQlhcCA9ICZzZGF0YS0+dS5hcDsKIAkJYmVhY29uID0gcmN1X2RlcmVmZXJlbmNlKGFwLT5iZWFjb24pOwogCQlpZiAoYXAgJiYgYmVhY29uKSB7CkBAIC0xODczLDExICsxODk4LDkgQEAKIAkJCWlmIChiZWFjb24tPnRhaWwpCiAJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBiZWFjb24tPnRhaWxfbGVuKSwKIAkJCQkgICAgICAgYmVhY29uLT50YWlsLCBiZWFjb24tPnRhaWxfbGVuKTsKLQotCQkJbnVtX2JlYWNvbnMgPSAmYXAtPm51bV9iZWFjb25zOwogCQl9IGVsc2UKIAkJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKKwl9IGVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCQlpZnN0YSA9ICZzZGF0YS0+dS5zdGE7CiAKQEAgLTE4ODksMTEgKzE5MTIsMTMgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JCWhkci0+ZnJhbWVfY29udHJvbCA9IElFRUU4MDIxMV9GQyhJRUVFODAyMTFfRlRZUEVfTUdNVCwKLQkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CisJCWhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKKwkJCQkJCSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKIAotCQludW1fYmVhY29ucyA9ICZpZnN0YS0+bnVtX2JlYWNvbnM7CiAJfSBlbHNlIGlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwkJdTggKnBvczsKKwogCQkvKiBoZWFkcm9vbSwgaGVhZCBsZW5ndGgsIHRhaWwgbGVuZ3RoIGFuZCBtYXhpbXVtIFRJTSBsZW5ndGggKi8KIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+dHhfaGVhZHJvb20gKyA0MDApOwogCQlpZiAoIXNrYikKQEAgLTE5MTYsOSArMTk0MSw3IEBACiAJCSpwb3MrKyA9IFdMQU5fRUlEX1NTSUQ7CiAJCSpwb3MrKyA9IDB4MDsKIAotCQltZXNoX21nbXRfaWVzX2FkZChza2IsIHNkYXRhLT5kZXYpOwotCi0JCW51bV9iZWFjb25zID0gJnNkYXRhLT51LnN0YS5udW1fYmVhY29uczsKKwkJbWVzaF9tZ210X2llc19hZGQoc2tiLCBzZGF0YSk7CiAJfSBlbHNlIHsKIAkJV0FSTl9PTigxKTsKIAkJZ290byBvdXQ7CkBAIC0xOTI5LDcgKzE5NTIsNyBAQAogCXNrYi0+ZG9fbm90X2VuY3J5cHQgPSAxOwogCiAJaW5mby0+YmFuZCA9IGJhbmQ7Ci0JcmF0ZV9jb250cm9sX2dldF9yYXRlKGxvY2FsLT5tZGV2LCBzYmFuZCwgc2tiLCAmcnNlbCk7CisJcmF0ZV9jb250cm9sX2dldF9yYXRlKHNkYXRhLCBzYmFuZCwgTlVMTCwgc2tiLCAmcnNlbCk7CiAKIAlpZiAodW5saWtlbHkocnNlbC5yYXRlX2lkeCA8IDApKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKQEAgLTE5NTUsNyArMTk3OCw2IEBACiAJaW5mby0+YW50ZW5uYV9zZWxfdHggPSBsb2NhbC0+aHcuY29uZi5hbnRlbm5hX3NlbF90eDsKIAlpbmZvLT5jb250cm9sLnJldHJ5X2xpbWl0ID0gMTsKIAotCSgqbnVtX2JlYWNvbnMpKys7CiBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHNrYjsKQEAgLTIwMTcsNyArMjAzOSw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCWJlYWNvbiA9IHJjdV9kZXJlZmVyZW5jZShic3MtPmJlYWNvbik7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX0FQIHx8ICFiZWFjb24gfHwgIWJlYWNvbi0+aGVhZCkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQIHx8ICFiZWFjb24gfHwgIWJlYWNvbi0+aGVhZCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoYnNzLT5kdGltX2NvdW50ICE9IDApCkBAIC0yMDM5LDcgKzIwNjEsNyBAQAogCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKIAkJfQogCi0JCWlmICghaWVlZTgwMjExX3R4X3ByZXBhcmUoJnR4LCBza2IsIGxvY2FsLT5tZGV2KSkKKwkJaWYgKCFpZWVlODAyMTFfdHhfcHJlcGFyZShsb2NhbCwgJnR4LCBza2IpKQogCQkJYnJlYWs7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3V0aWwuYyBiL25ldC9tYWM4MDIxMS91dGlsLmMKaW5kZXggMGQ0NjNjOC4uY2VlNDg4NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3V0aWwuYworKysgYi9uZXQvbWFjODAyMTEvdXRpbC5jCkBAIC00Myw3ICs0Myw3IEBACiAKIAogdTggKmllZWU4MDIxMV9nZXRfYnNzaWQoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgc2l6ZV90IGxlbiwKLQkJCWVudW0gaWVlZTgwMjExX2lmX3R5cGVzIHR5cGUpCisJCQllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUpCiB7CiAJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCkBAIC03NywxMCArNzcsMTAgQEAKIAogCQlpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkgewogCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwkJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJCQlyZXR1cm4gaGRyLT5hZGRyMjsKLQkJCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfQVA6Ci0JCQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1ZMQU46CisJCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCQkJCXJldHVybiBoZHItPmFkZHIxOwogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIHRoZSByZXR1cm4gKi8KQEAgLTkxLDQ1ICs5MSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCi17Ci0JaW50IGhkcmxlbiA9IDI0OwotCi0Jc3dpdGNoIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKLQkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCi0JCQloZHJsZW4gPSAzMDsgLyogQWRkcjQgKi8KLQkJLyoKLQkJICogVGhlIFFvUyBDb250cm9sIGZpZWxkIGlzIHR3byBieXRlcyBhbmQgaXRzIHByZXNlbmNlIGlzCi0JCSAqIGluZGljYXRlZCBieSB0aGUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBIGJpdC4gQWRkIDIgdG8KLQkJICogaGRybGVuIGlmIHRoYXQgYml0IGlzIHNldC4KLQkJICogVGhpcyB3b3JrcyBieSBtYXNraW5nIG91dCB0aGUgYml0IGFuZCBzaGlmdGluZyBpdCB0bwotCQkgKiBiaXQgcG9zaXRpb24gMSBzbyB0aGUgcmVzdWx0IGhhcyB0aGUgdmFsdWUgMCBvciAyLgotCQkgKi8KLQkJaGRybGVuICs9IChmYyAmIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSkKLQkJCQk+PiAoaWxvZzIoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKS0xKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgotCQkvKgotCQkgKiBBQ0sgYW5kIENUUyBhcmUgMTAgYnl0ZXMsIGFsbCBvdGhlcnMgMTYuIFRvIHNlZSBob3cKLQkJICogdG8gZ2V0IHRoaXMgY29uZGl0aW9uIGNvbnNpZGVyCi0JCSAqICAgc3VidHlwZSBtYXNrOiAgIDBiMDAwMDAwMDAxMTExMDAwMCAoMHgwMEYwKQotCQkgKiAgIEFDSyBzdWJ0eXBlOiAgICAwYjAwMDAwMDAwMTEwMTAwMDAgKDB4MDBEMCkKLQkJICogICBDVFMgc3VidHlwZTogICAgMGIwMDAwMDAwMDExMDAwMDAwICgweDAwQzApCi0JCSAqICAgYml0cyB0aGF0IG1hdHRlcjogICAgICAgICBeXl4gICAgICAoMHgwMEUwKQotCQkgKiAgIHZhbHVlIG9mIHRob3NlOiAwYjAwMDAwMDAwMTEwMDAwMDAgKDB4MDBDMCkKLQkJICovCi0JCWlmICgoZmMgJiAweEUwKSA9PSAweEMwKQotCQkJaGRybGVuID0gMTA7Ci0JCWVsc2UKLQkJCWhkcmxlbiA9IDE2OwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaGRybGVuOwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2hkcmxlbik7Ci0KIHVuc2lnbmVkIGludCBpZWVlODAyMTFfaGRybGVuKF9fbGUxNiBmYykKIHsKIAl1bnNpZ25lZCBpbnQgaGRybGVuID0gMjQ7CkBAIC0yNzAsMTYgKzIzMSwyMSBAQAogCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAl1MTYgZHVyOwogCWludCBlcnA7CisJYm9vbCBzaG9ydF9wcmVhbWJsZSA9IGZhbHNlOwogCiAJZXJwID0gMDsKLQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERSkKLQkJZXJwID0gcmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9FUlBfRzsKKwlpZiAodmlmKSB7CisJCXNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJCXNob3J0X3ByZWFtYmxlID0gc2RhdGEtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZTsKKwkJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9PUEVSQVRJTkdfR01PREUpCisJCQllcnAgPSByYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX0VSUF9HOworCX0KIAogCWR1ciA9IGllZWU4MDIxMV9mcmFtZV9kdXJhdGlvbihsb2NhbCwgZnJhbWVfbGVuLCByYXRlLT5iaXRyYXRlLCBlcnAsCi0JCQkJICAgICAgIHNkYXRhLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpOworCQkJCSAgICAgICBzaG9ydF9wcmVhbWJsZSk7CiAKIAlyZXR1cm4gY3B1X3RvX2xlMTYoZHVyKTsKIH0KQEAgLTI5MSw3ICsyNTcsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCWJvb2wgc2hvcnRfcHJlYW1ibGU7CiAJaW50IGVycDsKIAl1MTYgZHVyOwpAQCAtMjk5LDEzICsyNjUsMTcgQEAKIAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKIAotCXNob3J0X3ByZWFtYmxlID0gc2RhdGEtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZTsKKwlzaG9ydF9wcmVhbWJsZSA9IGZhbHNlOwogCiAJcmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbZnJhbWVfdHhjdGwtPmNvbnRyb2wucnRzX2N0c19yYXRlX2lkeF07CiAKIAllcnAgPSAwOwotCWlmIChzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfT1BFUkFUSU5HX0dNT0RFKQotCQllcnAgPSByYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX0VSUF9HOworCWlmICh2aWYpIHsKKwkJc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwkJc2hvcnRfcHJlYW1ibGUgPSBzZGF0YS0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlOworCQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERSkKKwkJCWVycCA9IHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1JBVEVfRVJQX0c7CisJfQogCiAJLyogQ1RTIGR1cmF0aW9uICovCiAJZHVyID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwgcmF0ZS0+Yml0cmF0ZSwKQEAgLTMyOCw3ICsyOTgsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCWJvb2wgc2hvcnRfcHJlYW1ibGU7CiAJaW50IGVycDsKIAl1MTYgZHVyOwpAQCAtMzM2LDEyICszMDYsMTYgQEAKIAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKIAotCXNob3J0X3ByZWFtYmxlID0gc2RhdGEtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZTsKKwlzaG9ydF9wcmVhbWJsZSA9IGZhbHNlOwogCiAJcmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbZnJhbWVfdHhjdGwtPmNvbnRyb2wucnRzX2N0c19yYXRlX2lkeF07CiAJZXJwID0gMDsKLQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERSkKLQkJZXJwID0gcmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9FUlBfRzsKKwlpZiAodmlmKSB7CisJCXNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJCXNob3J0X3ByZWFtYmxlID0gc2RhdGEtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZTsKKwkJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9PUEVSQVRJTkdfR01PREUpCisJCQllcnAgPSByYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX0VSUF9HOworCX0KIAogCS8qIERhdGEgZnJhbWUgZHVyYXRpb24gKi8KIAlkdXIgPSBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24obG9jYWwsIGZyYW1lX2xlbiwgcmF0ZS0+Yml0cmF0ZSwKQEAgLTM4Niw2ICszNjAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcXVldWVzKTsKIAoraW50IGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgcXVldWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJcmV0dXJuIF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChsb2NhbC0+bWRldiwgcXVldWUpOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcXVldWVfc3RvcHBlZCk7CisKIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCWludCBpOwpAQCAtNDA4LDE1ICszODksMTYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewotCQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQ6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOOgorCQljYXNlIF9fTkw4MDIxMV9JRlRZUEVfQUZURVJfTEFTVDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCQljb250aW51ZTsKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9XRFM6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCkBAIC00NDEsMTUgKzQyMywxNiBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewotCQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX0lOVkFMSUQ6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTU5UUjoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOOgorCQljYXNlIF9fTkw4MDIxMV9JRlRZUEVfQUZURVJfTEFTVDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCQljb250aW51ZTsKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9TVEE6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfSUJTUzoKLQkJY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9XRFM6Ci0JCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfTUVTSF9QT0lOVDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG5ldGlmX3J1bm5pbmcoc2RhdGEtPmRldikpCkBAIC00NjAsMyArNDQzLDI0MyBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKTsKKwordm9pZCBpZWVlODAyXzExX3BhcnNlX2VsZW1zKHU4ICpzdGFydCwgc2l6ZV90IGxlbiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqZWxlbXMpCit7CisJc2l6ZV90IGxlZnQgPSBsZW47CisJdTggKnBvcyA9IHN0YXJ0OworCisJbWVtc2V0KGVsZW1zLCAwLCBzaXplb2YoKmVsZW1zKSk7CisJZWxlbXMtPmllX3N0YXJ0ID0gc3RhcnQ7CisJZWxlbXMtPnRvdGFsX2xlbiA9IGxlbjsKKworCXdoaWxlIChsZWZ0ID49IDIpIHsKKwkJdTggaWQsIGVsZW47CisKKwkJaWQgPSAqcG9zKys7CisJCWVsZW4gPSAqcG9zKys7CisJCWxlZnQgLT0gMjsKKworCQlpZiAoZWxlbiA+IGxlZnQpCisJCQlyZXR1cm47CisKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIFdMQU5fRUlEX1NTSUQ6CisJCQllbGVtcy0+c3NpZCA9IHBvczsKKwkJCWVsZW1zLT5zc2lkX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgorCQkJZWxlbXMtPnN1cHBfcmF0ZXMgPSBwb3M7CisJCQllbGVtcy0+c3VwcF9yYXRlc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgorCQkJZWxlbXMtPmZoX3BhcmFtcyA9IHBvczsKKwkJCWVsZW1zLT5maF9wYXJhbXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKKwkJCWVsZW1zLT5kc19wYXJhbXMgPSBwb3M7CisJCQllbGVtcy0+ZHNfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6CisJCQllbGVtcy0+Y2ZfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmNmX3BhcmFtc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfVElNOgorCQkJZWxlbXMtPnRpbSA9IHBvczsKKwkJCWVsZW1zLT50aW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0lCU1NfUEFSQU1TOgorCQkJZWxlbXMtPmlic3NfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmlic3NfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DSEFMTEVOR0U6CisJCQllbGVtcy0+Y2hhbGxlbmdlID0gcG9zOworCQkJZWxlbXMtPmNoYWxsZW5nZV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfV1BBOgorCQkJaWYgKGVsZW4gPj0gNCAmJiBwb3NbMF0gPT0gMHgwMCAmJiBwb3NbMV0gPT0gMHg1MCAmJgorCQkJICAgIHBvc1syXSA9PSAweGYyKSB7CisJCQkJLyogTWljcm9zb2Z0IE9VSSAoMDA6NTA6RjIpICovCisJCQkJaWYgKHBvc1szXSA9PSAxKSB7CisJCQkJCS8qIE9VSSBUeXBlIDEgLSBXUEEgSUUgKi8KKwkJCQkJZWxlbXMtPndwYSA9IHBvczsKKwkJCQkJZWxlbXMtPndwYV9sZW4gPSBlbGVuOworCQkJCX0gZWxzZSBpZiAoZWxlbiA+PSA1ICYmIHBvc1szXSA9PSAyKSB7CisJCQkJCWlmIChwb3NbNF0gPT0gMCkgeworCQkJCQkJZWxlbXMtPndtbV9pbmZvID0gcG9zOworCQkJCQkJZWxlbXMtPndtbV9pbmZvX2xlbiA9IGVsZW47CisJCQkJCX0gZWxzZSBpZiAocG9zWzRdID09IDEpIHsKKwkJCQkJCWVsZW1zLT53bW1fcGFyYW0gPSBwb3M7CisJCQkJCQllbGVtcy0+d21tX3BhcmFtX2xlbiA9IGVsZW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9SU046CisJCQllbGVtcy0+cnNuID0gcG9zOworCQkJZWxlbXMtPnJzbl9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRVJQX0lORk86CisJCQllbGVtcy0+ZXJwX2luZm8gPSBwb3M7CisJCQllbGVtcy0+ZXJwX2luZm9fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgorCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzID0gcG9zOworCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkKKwkJCQllbGVtcy0+aHRfY2FwX2VsZW0gPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0hUX0VYVFJBX0lORk86CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9hZGR0X2luZm8pKQorCQkJCWVsZW1zLT5odF9pbmZvX2VsZW0gPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX01FU0hfSUQ6CisJCQllbGVtcy0+bWVzaF9pZCA9IHBvczsKKwkJCWVsZW1zLT5tZXNoX2lkX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9NRVNIX0NPTkZJRzoKKwkJCWVsZW1zLT5tZXNoX2NvbmZpZyA9IHBvczsKKwkJCWVsZW1zLT5tZXNoX2NvbmZpZ19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUEVFUl9MSU5LOgorCQkJZWxlbXMtPnBlZXJfbGluayA9IHBvczsKKwkJCWVsZW1zLT5wZWVyX2xpbmtfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BSRVE6CisJCQllbGVtcy0+cHJlcSA9IHBvczsKKwkJCWVsZW1zLT5wcmVxX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QUkVQOgorCQkJZWxlbXMtPnByZXAgPSBwb3M7CisJCQllbGVtcy0+cHJlcF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUEVSUjoKKwkJCWVsZW1zLT5wZXJyID0gcG9zOworCQkJZWxlbXMtPnBlcnJfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0NIQU5ORUxfU1dJVENIOgorCQkJZWxlbXMtPmNoX3N3aXRjaF9lbGVtID0gcG9zOworCQkJZWxlbXMtPmNoX3N3aXRjaF9lbGVtX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9RVUlFVDoKKwkJCWlmICghZWxlbXMtPnF1aWV0X2VsZW0pIHsKKwkJCQllbGVtcy0+cXVpZXRfZWxlbSA9IHBvczsKKwkJCQllbGVtcy0+cXVpZXRfZWxlbV9sZW4gPSBlbGVuOworCQkJfQorCQkJZWxlbXMtPm51bV9vZl9xdWlldF9lbGVtKys7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DT1VOVFJZOgorCQkJZWxlbXMtPmNvdW50cnlfZWxlbSA9IHBvczsKKwkJCWVsZW1zLT5jb3VudHJ5X2VsZW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BXUl9DT05TVFJBSU5UOgorCQkJZWxlbXMtPnB3cl9jb25zdHJfZWxlbSA9IHBvczsKKwkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlsZWZ0IC09IGVsZW47CisJCXBvcyArPSBlbGVuOworCX0KK30KKwordm9pZCBpZWVlODAyMTFfc2V0X3dtbV9kZWZhdWx0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zIHFwYXJhbTsKKwlpbnQgaTsKKworCWlmICghbG9jYWwtPm9wcy0+Y29uZl90eCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZxcGFyYW0sIDAsIHNpemVvZihxcGFyYW0pKTsKKworCXFwYXJhbS5haWZzID0gMjsKKworCWlmIChsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogJiYKKwkgICAgIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfT1BFUkFUSU5HX0dNT0RFKSkKKwkJcXBhcmFtLmN3X21pbiA9IDMxOworCWVsc2UKKwkJcXBhcmFtLmN3X21pbiA9IDE1OworCisJcXBhcmFtLmN3X21heCA9IDEwMjM7CisJcXBhcmFtLnR4b3AgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxvY2FsX3RvX2h3KGxvY2FsKS0+cXVldWVzOyBpKyspCisJCWxvY2FsLT5vcHMtPmNvbmZfdHgobG9jYWxfdG9faHcobG9jYWwpLCBpLCAmcXBhcmFtKTsKK30KKwordm9pZCBpZWVlODAyMTFfdHhfc2tiKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBpbnQgZW5jcnlwdCkKK3sKKwlza2ItPmRldiA9IHNkYXRhLT5sb2NhbC0+bWRldjsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAwKTsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgMCk7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgMCk7CisKKwlza2ItPmlpZiA9IHNkYXRhLT5kZXYtPmlmaW5kZXg7CisJc2tiLT5kb19ub3RfZW5jcnlwdCA9ICFlbmNyeXB0OworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworaW50IGllZWU4MDIxMV9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgaW50IGZyZXFNSHopCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCisJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChsb2NhbC0+aHcud2lwaHksIGZyZXFNSHopOworCisJaWYgKGNoYW4gJiYgIShjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkgeworCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJCSAgICBjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSUJTUyBub3QgYWxsb3dlZCBvbiBmcmVxdWVuY3kgIgorCQkJCSIlZCBNSHpcbiIsIHNkYXRhLT5kZXYtPm5hbWUsIGNoYW4tPmNlbnRlcl9mcmVxKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbG9jYWwtPm9wZXJfY2hhbm5lbCA9IGNoYW47CisKKwkJaWYgKGxvY2FsLT5zd19zY2FubmluZyB8fCBsb2NhbC0+aHdfc2Nhbm5pbmcpCisJCQlyZXQgPSAwOworCQllbHNlCisJCQlyZXQgPSBpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsKTsKKworCQlyYXRlX2NvbnRyb2xfY2xlYXIobG9jYWwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3U2NCBpZWVlODAyMTFfbWFuZGF0b3J5X3JhdGVzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqYml0cmF0ZXM7CisJdTY0IG1hbmRhdG9yeV9yYXRlczsKKwllbnVtIGllZWU4MDIxMV9yYXRlX2ZsYWdzIG1hbmRhdG9yeV9mbGFnOworCWludCBpOworCisJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdOworCWlmICghc2JhbmQpIHsKKwkJV0FSTl9PTigxKTsKKwkJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdOworCX0KKworCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCW1hbmRhdG9yeV9mbGFnID0gSUVFRTgwMjExX1JBVEVfTUFOREFUT1JZX0I7CisJZWxzZQorCQltYW5kYXRvcnlfZmxhZyA9IElFRUU4MDIxMV9SQVRFX01BTkRBVE9SWV9BOworCisJYml0cmF0ZXMgPSBzYmFuZC0+Yml0cmF0ZXM7CisJbWFuZGF0b3J5X3JhdGVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykKKwkJaWYgKGJpdHJhdGVzW2ldLmZsYWdzICYgbWFuZGF0b3J5X2ZsYWcpCisJCQltYW5kYXRvcnlfcmF0ZXMgfD0gQklUKGkpOworCXJldHVybiBtYW5kYXRvcnlfcmF0ZXM7Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd2VwLmMgYi9uZXQvbWFjODAyMTEvd2VwLmMKaW5kZXggNWMyYmYwYS4uZjBlMmQzZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dlcC5jCisrKyBiL25ldC9tYWM4MDIxMS93ZXAuYwpAQCAtMjI4LDExICsyMjgsMTAgQEAKIAkJcmV0dXJuIC0xOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwotCi0JaWYgKHNrYi0+bGVuIDwgOCArIGhkcmxlbikKKwlpZiAoc2tiLT5sZW4gPCBoZHJsZW4gKyBXRVBfSVZfTEVOICsgV0VQX0lDVl9MRU4pCiAJCXJldHVybiAtMTsKIAotCWxlbiA9IHNrYi0+bGVuIC0gaGRybGVuIC0gODsKKwlsZW4gPSBza2ItPmxlbiAtIGhkcmxlbiAtIFdFUF9JVl9MRU4gLSBXRVBfSUNWX0xFTjsKIAogCWtleWlkeCA9IHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2OwogCkBAIC0yOTIsOSArMjkxLDEwIEBACiBpZWVlODAyMTFfcnhfcmVzdWx0CiBpZWVlODAyMTFfY3J5cHRvX3dlcF9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCiB7Ci0JaWYgKChyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgIT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgJiYKLQkgICAgKChyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgIT0gSUVFRTgwMjExX0ZUWVBFX01HTVQgfHwKLQkgICAgIChyeC0+ZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgIT0gSUVFRTgwMjExX1NUWVBFX0FVVEgpKQorCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilyeC0+c2tiLT5kYXRhOworCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJICAgICFpZWVlODAyMTFfaXNfYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAKIAlpZiAoIShyeC0+c3RhdHVzLT5mbGFnICYgUlhfRkxBR19ERUNSWVBURUQpKSB7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAl9IGVsc2UgaWYgKCEocngtPnN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSVZfU1RSSVBQRUQpKSB7CiAJCWllZWU4MDIxMV93ZXBfcmVtb3ZlX2l2KHJ4LT5sb2NhbCwgcngtPnNrYiwgcngtPmtleSk7CiAJCS8qIHJlbW92ZSBJQ1YgKi8KLQkJc2tiX3RyaW0ocngtPnNrYiwgcngtPnNrYi0+bGVuIC0gNCk7CisJCXNrYl90cmltKHJ4LT5za2IsIHJ4LT5za2ItPmxlbiAtIFdFUF9JQ1ZfTEVOKTsKIAl9CiAKIAlyZXR1cm4gUlhfQ09OVElOVUU7CkBAIC0zMTMsOSArMzEzLDYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKLQlpbmZvLT5jb250cm9sLml2X2xlbiA9IFdFUF9JVl9MRU47Ci0JaW5mby0+Y29udHJvbC5pY3ZfbGVuID0gV0VQX0lDVl9MRU47Ci0KIAlpZiAoISh0eC0+a2V5LT5mbGFncyAmIEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFKSkgewogCQlpZiAoaWVlZTgwMjExX3dlcF9lbmNyeXB0KHR4LT5sb2NhbCwgc2tiLCB0eC0+a2V5KSkKIAkJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93ZXh0LmMgYi9uZXQvbWFjODAyMTEvd2V4dC5jCmluZGV4IDM0ZmE4ZWQuLjc0MmY4MTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93ZXh0LmMKKysrIGIvbmV0L21hYzgwMjExL3dleHQuYwpAQCAtMjcsMjIgKzI3LDE5IEBACiAjaW5jbHVkZSAiYWVzX2NjbS5oIgogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpzdGFfYWRkciwKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCB1OCAqc3RhX2FkZHIsCiAJCQkJICAgIGludCBpZHgsIGludCBhbGcsIGludCByZW1vdmUsCiAJCQkJICAgIGludCBzZXRfdHhfa2V5LCBjb25zdCB1OCAqX2tleSwKIAkJCQkgICAgc2l6ZV90IGtleV9sZW4pCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5OwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCWludCBlcnI7CiAKLQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7Ci0KIAlpZiAoaWR4IDwgMCB8fCBpZHggPj0gTlVNX0RFRkFVTFRfS0VZUykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNldF9lbmNyeXB0IC0gaW52YWxpZCBpZHg9JWRcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGlkeCk7CisJCSAgICAgICBzZGF0YS0+ZGV2LT5uYW1lLCBpZHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEyNSwxMyArMTIyLDEzIEBACiAJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9VU0VSU1BBQ0VfTUxNRSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKLQkgICAgc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpIHsKLQkJaW50IHJldCA9IGllZWU4MDIxMV9zdGFfc2V0X2V4dHJhX2llKGRldiwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQlpbnQgcmV0ID0gaWVlZTgwMjExX3N0YV9zZXRfZXh0cmFfaWUoc2RhdGEsIGV4dHJhLCBkYXRhLT5sZW5ndGgpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJc2RhdGEtPnUuc3RhLmZsYWdzICY9IH5JRUVFODAyMTFfU1RBX0FVVE9fQlNTSURfU0VMOwotCQlpZWVlODAyMTFfc3RhX3JlcV9hdXRoKGRldiwgJnNkYXRhLT51LnN0YSk7CisJCWllZWU4MDIxMV9zdGFfcmVxX2F1dGgoc2RhdGEsICZzZGF0YS0+dS5zdGEpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI3NiwyMSArMjczLDIxIEBACiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCWludCB0eXBlOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9WTEFOKQorCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJc3dpdGNoICgqbW9kZSkgewogCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJdHlwZSA9IElFRUU4MDIxMV9JRl9UWVBFX1NUQTsKKwkJdHlwZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CiAJCWJyZWFrOwogCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJdHlwZSA9IElFRUU4MDIxMV9JRl9UWVBFX0lCU1M7CisJCXR5cGUgPSBOTDgwMjExX0lGVFlQRV9BREhPQzsKIAkJYnJlYWs7CiAJY2FzZSBJV19NT0RFX1JFUEVBVDoKLQkJdHlwZSA9IElFRUU4MDIxMV9JRl9UWVBFX1dEUzsKKwkJdHlwZSA9IE5MODAyMTFfSUZUWVBFX1dEUzsKIAkJYnJlYWs7CiAJY2FzZSBJV19NT0RFX01PTklUT1I6Ci0JCXR5cGUgPSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOworCQl0eXBlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDgsMjIgKzMwNSwyMiBAQAogCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9BUDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQkqbW9kZSA9IElXX01PREVfTUFTVEVSOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1NUQToKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfSUZfVFlQRV9NTlRSOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CiAJCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0lGX1RZUEVfV0RTOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCQkqbW9kZSA9IElXX01PREVfUkVQRUFUOwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9JRl9UWVBFX1ZMQU46CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCQkqbW9kZSA9IElXX01PREVfU0VDT05EOwkJLyogRklYTUUgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTMzMyw2MCArMzMwLDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpZWVlODAyMTFfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyZXFNSHopCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gd2Rldl9wcml2KGRldi0+aWVlZTgwMjExX3B0cik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCi0JY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChsb2NhbC0+aHcud2lwaHksIGZyZXFNSHopOwotCi0JaWYgKGNoYW4gJiYgIShjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkgewotCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MgJiYKLQkJICAgIGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJQlNTIG5vdCBhbGxvd2VkIG9uIGZyZXF1ZW5jeSAiCi0JCQkJIiVkIE1IelxuIiwgZGV2LT5uYW1lLCBjaGFuLT5jZW50ZXJfZnJlcSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWxvY2FsLT5vcGVyX2NoYW5uZWwgPSBjaGFuOwotCi0JCWlmIChsb2NhbC0+c3RhX3N3X3NjYW5uaW5nIHx8IGxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcpCi0JCQlyZXQgPSAwOwotCQllbHNlCi0JCQlyZXQgPSBpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsKTsKLQotCQlyYXRlX2NvbnRyb2xfY2xlYXIobG9jYWwpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgaWVlZTgwMjExX2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9BVVRPX0NIQU5ORUxfU0VMOwogCiAJLyogZnJlcS0+ZSA9PSAwOiBmcmVxLT5tID0gY2hhbm5lbDsgb3RoZXJ3aXNlIGZyZXEgPSBtICogMTBeZSAqLwogCWlmIChmcmVxLT5lID09IDApIHsKIAkJaWYgKGZyZXEtPm0gPCAwKSB7Ci0JCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSkKKwkJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJCQlzZGF0YS0+dS5zdGEuZmxhZ3MgfD0KIAkJCQkJSUVFRTgwMjExX1NUQV9BVVRPX0NIQU5ORUxfU0VMOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZQotCQkJcmV0dXJuIGllZWU4MDIxMV9zZXRfZnJlcShkZXYsCisJCQlyZXR1cm4gaWVlZTgwMjExX3NldF9mcmVxKHNkYXRhLAogCQkJCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShmcmVxLT5tKSk7CiAJfSBlbHNlIHsKIAkJaW50IGksIGRpdiA9IDEwMDAwMDA7CiAJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5lOyBpKyspCiAJCQlkaXYgLz0gMTA7CiAJCWlmIChkaXYgPiAwKQotCQkJcmV0dXJuIGllZWU4MDIxMV9zZXRfZnJlcShkZXYsIGZyZXEtPm0gLyBkaXYpOworCQkJcmV0dXJuIGllZWU4MDIxMV9zZXRfZnJlcShzZGF0YSwgZnJlcS0+bSAvIGRpdik7CiAJCWVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQxOCw4ICszODYsOCBAQAogCQlsZW4tLTsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgeworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJaW50IHJldDsKIAkJaWYgKHNkYXRhLT5mbGFncyAmIElFRUU4MDIxMV9TREFUQV9VU0VSU1BBQ0VfTUxNRSkgewogCQkJaWYgKGxlbiA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pCkBAIC00MzIsMTQgKzQwMCwxNCBAQAogCQkJc2RhdGEtPnUuc3RhLmZsYWdzICY9IH5JRUVFODAyMTFfU1RBX0FVVE9fU1NJRF9TRUw7CiAJCWVsc2UKIAkJCXNkYXRhLT51LnN0YS5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0FVVE9fU1NJRF9TRUw7Ci0JCXJldCA9IGllZWU4MDIxMV9zdGFfc2V0X3NzaWQoZGV2LCBzc2lkLCBsZW4pOworCQlyZXQgPSBpZWVlODAyMTFfc3RhX3NldF9zc2lkKHNkYXRhLCBzc2lkLCBsZW4pOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJaWVlZTgwMjExX3N0YV9yZXFfYXV0aChkZXYsICZzZGF0YS0+dS5zdGEpOworCQlpZWVlODAyMTFfc3RhX3JlcV9hdXRoKHNkYXRhLCAmc2RhdGEtPnUuc3RhKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9BUCkgeworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKIAkJbWVtY3B5KHNkYXRhLT51LmFwLnNzaWQsIHNzaWQsIGxlbik7CiAJCW1lbXNldChzZGF0YS0+dS5hcC5zc2lkICsgbGVuLCAwLAogCQkgICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTiAtIGxlbik7CkBAIC00NTgsOSArNDI2LDkgQEAKIAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1NUQSB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykgewotCQlpbnQgcmVzID0gaWVlZTgwMjExX3N0YV9nZXRfc3NpZChkZXYsIHNzaWQsICZsZW4pOworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJaW50IHJlcyA9IGllZWU4MDIxMV9zdGFfZ2V0X3NzaWQoc2RhdGEsIHNzaWQsICZsZW4pOwogCQlpZiAocmVzID09IDApIHsKIAkJCWRhdGEtPmxlbmd0aCA9IGxlbjsKIAkJCWRhdGEtPmZsYWdzID0gMTsKQEAgLTQ2OSw3ICs0MzcsNyBAQAogCQlyZXR1cm4gcmVzOwogCX0KIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfQVApIHsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCWxlbiA9IHNkYXRhLT51LmFwLnNzaWRfbGVuOwogCQlpZiAobGVuID4gSVdfRVNTSURfTUFYX1NJWkUpCiAJCQlsZW4gPSBJV19FU1NJRF9NQVhfU0laRTsKQEAgLTQ4OSw4ICs0NTcsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBIHx8Ci0JICAgIHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQlpbnQgcmV0OwogCQlpZiAoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX1VTRVJTUEFDRV9NTE1FKSB7CiAJCQltZW1jcHkoc2RhdGEtPnUuc3RhLmJzc2lkLCAodTggKikgJmFwX2FkZHItPnNhX2RhdGEsCkBAIC01MDQsMTIgKzQ3MiwxMiBAQAogCQkJc2RhdGEtPnUuc3RhLmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfQVVUT19CU1NJRF9TRUw7CiAJCWVsc2UKIAkJCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9BVVRPX0JTU0lEX1NFTDsKLQkJcmV0ID0gaWVlZTgwMjExX3N0YV9zZXRfYnNzaWQoZGV2LCAodTggKikgJmFwX2FkZHItPnNhX2RhdGEpOworCQlyZXQgPSBpZWVlODAyMTFfc3RhX3NldF9ic3NpZChzZGF0YSwgKHU4ICopICZhcF9hZGRyLT5zYV9kYXRhKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0JCWllZWU4MDIxMV9zdGFfcmVxX2F1dGgoZGV2LCAmc2RhdGEtPnUuc3RhKTsKKwkJaWVlZTgwMjExX3N0YV9yZXFfYXV0aChzZGF0YSwgJnNkYXRhLT51LnN0YSk7CiAJCXJldHVybiAwOwotCX0gZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1dEUykgeworCX0gZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1dEUykgewogCQkvKgogCQkgKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gdXBkYXRlIHRoZSBXRFMgcGVlciBhZGRyZXNzCiAJCSAqIHdoaWxlIHRoZSBpbnRlcmZhY2UgaXMgcnVubmluZywgdGhlbiB3ZSBuZWVkIHRvIGRvCkBAIC01MzcsMTAgKzUwNSwxMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBIHx8Ci0JICAgIHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKSB7Ci0JCWlmIChzZGF0YS0+dS5zdGEuc3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFURUQgfHwKLQkJICAgIHNkYXRhLT51LnN0YS5zdGF0ZSA9PSBJRUVFODAyMTFfSUJTU19KT0lORUQpIHsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJCWlmIChzZGF0YS0+dS5zdGEuc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9NTE1FX0FTU09DSUFURUQgfHwKKwkJICAgIHNkYXRhLT51LnN0YS5zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX01MTUVfSUJTU19KT0lORUQpIHsKIAkJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJCW1lbWNweSgmYXBfYWRkci0+c2FfZGF0YSwgc2RhdGEtPnUuc3RhLmJzc2lkLCBFVEhfQUxFTik7CiAJCQlyZXR1cm4gMDsKQEAgLTU0OCw3ICs1MTYsNyBAQAogCQkJbWVtc2V0KCZhcF9hZGRyLT5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCX0gZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX1dEUykgeworCX0gZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1dEUykgewogCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCW1lbWNweSgmYXBfYWRkci0+c2FfZGF0YSwgc2RhdGEtPnUud2RzLnJlbW90ZV9hZGRyLCBFVEhfQUxFTik7CiAJCXJldHVybiAwOwpAQCAtNTcwLDEwICs1MzgsMTAgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FTkVURE9XTjsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBICYmCi0JICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTICYmCi0JICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9NRVNIX1BPSU5UICYmCi0JICAgIHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9BUCkKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmCisJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogaWYgU1NJRCB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgdGhlbiB1c2UgdGhhdCAqLwpAQCAtNTg0LDcgKzU1Miw3IEBACiAJCXNzaWRfbGVuID0gcmVxLT5lc3NpZF9sZW47CiAJfQogCi0JcmV0dXJuIGllZWU4MDIxMV9zdGFfcmVxX3NjYW4oZGV2LCBzc2lkLCBzc2lkX2xlbik7CisJcmV0dXJuIGllZWU4MDIxMV9yZXF1ZXN0X3NjYW4oc2RhdGEsIHNzaWQsIHNzaWRfbGVuKTsKIH0KIAogCkBAIC01OTQsMTEgKzU2MiwxNCBAQAogewogCWludCByZXM7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAotCWlmIChsb2NhbC0+c3RhX3N3X3NjYW5uaW5nIHx8IGxvY2FsLT5zdGFfaHdfc2Nhbm5pbmcpCisJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOworCisJaWYgKGxvY2FsLT5zd19zY2FubmluZyB8fCBsb2NhbC0+aHdfc2Nhbm5pbmcpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JcmVzID0gaWVlZTgwMjExX3N0YV9zY2FuX3Jlc3VsdHMoZGV2LCBpbmZvLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKKwlyZXMgPSBpZWVlODAyMTFfc2Nhbl9yZXN1bHRzKGxvY2FsLCBpbmZvLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKIAlpZiAocmVzID49IDApIHsKIAkJZGF0YS0+bGVuZ3RoID0gcmVzOwogCQlyZXR1cm4gMDsKQEAgLTY1Niw3ICs2MjcsNyBAQAogCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSAhPSBJRUVFODAyMTFfSUZfVFlQRV9TVEEpCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF07CkBAIC02NjUsOCArNjM2LDggQEAKIAogCXN0YSA9IHN0YV9pbmZvX2dldChsb2NhbCwgc2RhdGEtPnUuc3RhLmJzc2lkKTsKIAotCWlmIChzdGEgJiYgc3RhLT50eHJhdGVfaWR4IDwgc2JhbmQtPm5fYml0cmF0ZXMpCi0JCXJhdGUtPnZhbHVlID0gc2JhbmQtPmJpdHJhdGVzW3N0YS0+dHhyYXRlX2lkeF0uYml0cmF0ZTsKKwlpZiAoc3RhICYmIHN0YS0+bGFzdF90eHJhdGVfaWR4IDwgc2JhbmQtPm5fYml0cmF0ZXMpCisJCXJhdGUtPnZhbHVlID0gc2JhbmQtPmJpdHJhdGVzW3N0YS0+bGFzdF90eHJhdGVfaWR4XS5iaXRyYXRlOwogCWVsc2UKIAkJcmF0ZS0+dmFsdWUgPSAwOwogCkBAIC04MDQsNyArNzc1LDcgQEAKIAkgKiBjb25maWd1cmUgaXQgaGVyZSAqLwogCiAJaWYgKGxvY2FsLT5vcHMtPnNldF9mcmFnX3RocmVzaG9sZCkKLQkJbG9jYWwtPm9wcy0+c2V0X2ZyYWdfdGhyZXNob2xkKAorCQlyZXR1cm4gbG9jYWwtPm9wcy0+c2V0X2ZyYWdfdGhyZXNob2xkKAogCQkJbG9jYWxfdG9faHcobG9jYWwpLAogCQkJbG9jYWwtPmZyYWdtZW50YXRpb25fdGhyZXNob2xkKTsKIApAQCAtODg3LDE3ICs4NTgsMTcgQEAKIAlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKIAogCXNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IElFRUU4MDIxMV9JRl9UWVBFX1NUQSAmJgotCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN3aXRjaCAobWxtZS0+Y21kKSB7CiAJY2FzZSBJV19NTE1FX0RFQVVUSDoKIAkJLyogVE9ETzogbWxtZS0+YWRkci5zYV9kYXRhICovCi0JCXJldHVybiBpZWVlODAyMTFfc3RhX2RlYXV0aGVudGljYXRlKGRldiwgbWxtZS0+cmVhc29uX2NvZGUpOworCQlyZXR1cm4gaWVlZTgwMjExX3N0YV9kZWF1dGhlbnRpY2F0ZShzZGF0YSwgbWxtZS0+cmVhc29uX2NvZGUpOwogCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKIAkJLyogVE9ETzogbWxtZS0+YWRkci5zYV9kYXRhICovCi0JCXJldHVybiBpZWVlODAyMTFfc3RhX2Rpc2Fzc29jaWF0ZShkZXYsIG1sbWUtPnJlYXNvbl9jb2RlKTsKKwkJcmV0dXJuIGllZWU4MDIxMV9zdGFfZGlzYXNzb2NpYXRlKHNkYXRhLCBtbG1lLT5yZWFzb25fY29kZSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTkzOCw3ICs5MDksNyBAQAogCX0KIAogCXJldHVybiBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oCi0JCWRldiwgYmNhZGRyLAorCQlzZGF0YSwgYmNhZGRyLAogCQlpZHgsIGFsZywgcmVtb3ZlLAogCQkhc2RhdGEtPmRlZmF1bHRfa2V5LAogCQlrZXlidWYsIGVycS0+bGVuZ3RoKTsKQEAgLTk4Myw3ICs5NTQsNyBAQAogCWVycS0+bGVuZ3RoID0gc2RhdGEtPmtleXNbaWR4XS0+Y29uZi5rZXlsZW47CiAJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKSB7CisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfc3RhICppZnN0YSA9ICZzZGF0YS0+dS5zdGE7CiAJCXN3aXRjaCAoaWZzdGEtPmF1dGhfYWxnKSB7CiAJCWNhc2UgV0xBTl9BVVRIX09QRU46CkBAIC0xMDU3LDcgKzEwMjgsNyBAQAogCQlzZGF0YS0+ZHJvcF91bmVuY3J5cHRlZCA9ICEhZGF0YS0+dmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6Ci0JCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCQlyZXQgPSAtRUlOVkFMOwogCQllbHNlIHsKIAkJCXNkYXRhLT51LnN0YS5mbGFncyAmPSB+SUVFRTgwMjExX1NUQV9QUklWQUNZX0lOVk9LRUQ7CkBAIC0xMDcyLDggKzEwNDMsOCBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKLQkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9JQlNTKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCXNkYXRhLT51LnN0YS5hdXRoX2FsZ3MgPSBkYXRhLT52YWx1ZTsKIAkJZWxzZQogCQkJcmV0ID0gLUVPUE5PVFNVUFA7CkBAIC0xMDk1LDggKzEwNjYsOCBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBJRUVFODAyMTFfSUZfVFlQRV9TVEEgfHwKLQkgICAgc2RhdGEtPnZpZi50eXBlID09IElFRUU4MDIxMV9JRl9UWVBFX0lCU1MpCisJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJc3RhID0gc3RhX2luZm9fZ2V0KGxvY2FsLCBzZGF0YS0+dS5zdGEuYnNzaWQpOwogCWlmICghc3RhKSB7CiAJCXdzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCA9IDA7CkBAIC0xMTI2LDggKzEwOTcsOCBAQAogCiAJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfU1RBIHx8Ci0JCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gSUVFRTgwMjExX0lGX1RZUEVfSUJTUykKKwkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCiAJCQlkYXRhLT52YWx1ZSA9IHNkYXRhLT51LnN0YS5hdXRoX2FsZ3M7CiAJCWVsc2UKIAkJCXJldCA9IC1FT1BOT1RTVVBQOwpAQCAtMTE4NCw3ICsxMTU1LDcgQEAKIAl9IGVsc2UKIAkJaWR4LS07CiAKLQlyZXR1cm4gaWVlZTgwMjExX3NldF9lbmNyeXB0aW9uKGRldiwgZXh0LT5hZGRyLnNhX2RhdGEsIGlkeCwgYWxnLAorCXJldHVybiBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc2RhdGEsIGV4dC0+YWRkci5zYV9kYXRhLCBpZHgsIGFsZywKIAkJCQkJcmVtb3ZlLAogCQkJCQlleHQtPmV4dF9mbGFncyAmCiAJCQkJCUlXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93bWUuYyBiL25ldC9tYWM4MDIxMS93bWUuYwppbmRleCA0MzEwZTJmLi4xMzliNWYyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd21lLmMKKysrIGIvbmV0L21hYzgwMjExL3dtZS5jCkBAIC0zOSw3ICszOSw3IEBACiAJCXJldHVybiBza2ItPnByaW9yaXR5IC0gMjU2OwogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJZHNjcCA9IGlwX2hkcihza2IpLT50b3MgJiAweGZjOwogCQlicmVhazsKIApAQCAtNDcsOCArNDcsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoZHNjcCAmIDB4MWMpCi0JCXJldHVybiAwOwogCXJldHVybiBkc2NwID4+IDU7CiB9CiAKQEAgLTc1LDkgKzczLDggQEAKIAogCiAvKiBJbmRpY2F0ZSB3aGljaCBxdWV1ZSB0byB1c2UuICAqLwotc3RhdGljIHUxNiBjbGFzc2lmeTgwMjExKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdTE2IGNsYXNzaWZ5ODAyMTEoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAogCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewpAQCAtMTE1LDE0ICsxMTIsMTUgQEAKIAogdTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX21hc3Rlcl9wcml2ICptcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBtcHJpdi0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJdTE2IHF1ZXVlOwogCXU4IHRpZDsKIAotCXF1ZXVlID0gY2xhc3NpZnk4MDIxMShza2IsIGRldik7CisJcXVldWUgPSBjbGFzc2lmeTgwMjExKGxvY2FsLCBza2IpOwogCWlmICh1bmxpa2VseShxdWV1ZSA+PSBsb2NhbC0+aHcucXVldWVzKSkKIAkJcXVldWUgPSBsb2NhbC0+aHcucXVldWVzIC0gMTsKIApAQCAtMjEyLDcgKzIxMCw3IEBACiAJCQkJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFsbG9jYXRlZCBhZ2dyZWdhdGlvbiBxdWV1ZSIKIAkJCQkJIiAlZCB0aWQgJWQgYWRkciAlcyBwb29sPTB4JWxYXG4iLAotCQkJCQlpLCB0aWQsIHByaW50X21hYyhtYWMsIHN0YS0+YWRkciksCisJCQkJCWksIHRpZCwgcHJpbnRfbWFjKG1hYywgc3RhLT5zdGEuYWRkciksCiAJCQkJCWxvY2FsLT5xdWV1ZV9wb29sWzBdKTsKIAkJCX0KICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93bWUuaCBiL25ldC9tYWM4MDIxMS93bWUuaAppbmRleCAwNGRlMjhjLi5iYzYyZjI4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd21lLmgKKysrIGIvbmV0L21hYzgwMjExL3dtZS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqIElFRUUgODAyLjExIGRyaXZlciAoODAyMTEubykgLSBRb1MgZGF0YXR5cGVzCiAgKiBDb3B5cmlnaHQgMjAwNCwgSW5zdGFudDgwMiBOZXR3b3JrcywgSW5jLgogICogQ29weXJpZ2h0IDIwMDUsIERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCiAgKgpAQCAtMTQsOCArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAKLSNkZWZpbmUgUU9TX0NPTlRST0xfTEVOIDIKLQogI2RlZmluZSBRT1NfQ09OVFJPTF9BQ0tfUE9MSUNZX05PUk1BTCAwCiAjZGVmaW5lIFFPU19DT05UUk9MX0FDS19QT0xJQ1lfTk9BQ0sgMQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd3BhLmMgYi9uZXQvbWFjODAyMTEvd3BhLmMKaW5kZXggMmYzM2RmMC4uNmRiNjQ5NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dwYS5jCisrKyBiL25ldC9tYWM4MDIxMS93cGEuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCWlmICghKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCiAJCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKIAotCQltYWM4MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHJ4LT5kZXYsIHJ4LT5rZXktPmNvbmYua2V5aWR4LAorCQltYWM4MDIxMV9ldl9taWNoYWVsX21pY19mYWlsdXJlKHJ4LT5zZGF0YSwgcngtPmtleS0+Y29uZi5rZXlpZHgsCiAJCQkJCQkodm9pZCAqKSBza2ItPmRhdGEpOwogCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKIAl9CkBAIC0xNTIsOSArMTUyLDYgQEAKIAlpbnQgbGVuLCB0YWlsOwogCXU4ICpwb3M7CiAKLQlpbmZvLT5jb250cm9sLmljdl9sZW4gPSBUS0lQX0lDVl9MRU47Ci0JaW5mby0+Y29udHJvbC5pdl9sZW4gPSBUS0lQX0lWX0xFTjsKLQogCWlmICgodHgtPmtleS0+ZmxhZ3MgJiBLRVlfRkxBR19VUExPQURFRF9UT19IQVJEV0FSRSkgJiYKIAkgICAgISh0eC0+a2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkgewogCQkvKiBod2FjY2VsIC0gd2l0aCBubyBuZWVkIGZvciBwcmVhbGxvY2F0ZWQgcm9vbSBmb3IgSVYvSUNWICovCkBAIC0yNTYsNyArMjUzLDcgQEAKIAogCXJlcyA9IGllZWU4MDIxMV90a2lwX2RlY3J5cHRfZGF0YShyeC0+bG9jYWwtPndlcF9yeF90Zm0sCiAJCQkJCSAga2V5LCBza2ItPmRhdGEgKyBoZHJsZW4sCi0JCQkJCSAgc2tiLT5sZW4gLSBoZHJsZW4sIHJ4LT5zdGEtPmFkZHIsCisJCQkJCSAgc2tiLT5sZW4gLSBoZHJsZW4sIHJ4LT5zdGEtPnN0YS5hZGRyLAogCQkJCQkgIGhkci0+YWRkcjEsIGh3YWNjZWwsIHJ4LT5xdWV1ZSwKIAkJCQkJICAmcngtPnRraXBfaXYzMiwKIAkJCQkJICAmcngtPnRraXBfaXYxNik7CkBAIC0zNzQsOSArMzcxLDYgQEAKIAl1OCAqcG9zLCAqcG47CiAJaW50IGk7CiAKLQlpbmZvLT5jb250cm9sLmljdl9sZW4gPSBDQ01QX01JQ19MRU47Ci0JaW5mby0+Y29udHJvbC5pdl9sZW4gPSBDQ01QX0hEUl9MRU47Ci0KIAlpZiAoKHR4LT5rZXktPmZsYWdzICYgS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkUpICYmCiAJICAgICEodHgtPmtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikpIHsKIAkJLyogaHdhY2NlbCAtIHdpdGggbm8gbmVlZCBmb3IgcHJlYWxsb2NhdGVkIHJvb20gZm9yIENDTVAgIgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGVlODk4ZTcuLjc4ODkyY2YgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTM4LDEwICszOCwxMSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgTkZfQ09OTlRSQUNLCisKIGNvbmZpZyBORl9DVF9BQ0NUCiAJYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWhlbHAKIAkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGNvZGUgd2lsbAogCSAga2VlcCBwZXItZmxvdyBwYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMuCkBAIC02Myw3ICs2NCw2IEBACiBjb25maWcgTkZfQ09OTlRSQUNLX01BUksKIAlib29sICAnQ29ubmVjdGlvbiBtYXJrIHRyYWNraW5nIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiBtYXJrcywgdXNlZCBieSB0aGUKIAkgIGBDT05OTUFSSycgdGFyZ2V0IGFuZCBgY29ubm1hcmsnIG1hdGNoLiBTaW1pbGFyIHRvIHRoZSBtYXJrIHZhbHVlCkBAIC03Miw3ICs3Miw3IEBACiAKIGNvbmZpZyBORl9DT05OVFJBQ0tfU0VDTUFSSwogCWJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHNlY3VyaXR5IG1hcmsgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSyAmJiBORVRXT1JLX1NFQ01BUksKKwlkZXBlbmRzIG9uIE5FVFdPUktfU0VDTUFSSwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc2VjdXJpdHkgbWFya2luZ3MgdG8gYmUgYXBwbGllZCB0bwpAQCAtODUsNyArODUsNiBAQAogCiBjb25maWcgTkZfQ09OTlRSQUNLX0VWRU5UUwogCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZXZlbnRzIgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlIHdpbGwKQEAgLTk2LDcgKzk1LDcgQEAKIAogY29uZmlnIE5GX0NUX1BST1RPX0RDQ1AKIAl0cmlzdGF0ZSAnRENDUCBwcm90b2NvbCBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWRlZmF1bHQgSVBfRENDUAogCWhlbHAKQEAgLTEwNywxMSArMTA2LDEwIEBACiAKIGNvbmZpZyBORl9DVF9QUk9UT19HUkUKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAKIGNvbmZpZyBORl9DVF9QUk9UT19TQ1RQCiAJdHJpc3RhdGUgJ1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpJwotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAlkZWZhdWx0IElQX1NDVFAKIAloZWxwCkBAIC0xMjMsNyArMTIxLDYgQEAKIAogY29uZmlnIE5GX0NUX1BST1RPX1VEUExJVEUKIAl0cmlzdGF0ZSAnVURQLUxpdGUgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHRoZSBsYXllciAzIGluZGVwZW5kZW50IGNvbm5lY3Rpb24KQEAgLTEzNCw3ICsxMzEsNiBAQAogCiBjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQQogCXRyaXN0YXRlICJBbWFuZGEgYmFja3VwIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCXNlbGVjdCBURVhUU0VBUkNICiAJc2VsZWN0IFRFWFRTRUFSQ0hfS01QCkBAIC0xNTAsNyArMTQ2LDYgQEAKIAogY29uZmlnIE5GX0NPTk5UUkFDS19GVFAKIAl0cmlzdGF0ZSAiRlRQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBUcmFja2luZyBGVFAgY29ubmVjdGlvbnMgaXMgcHJvYmxlbWF0aWM6IHNwZWNpYWwgaGVscGVycyBhcmUKQEAgLTE2NSw3ICsxNjAsNyBAQAogCiBjb25maWcgTkZfQ09OTlRSQUNLX0gzMjMKIAl0cmlzdGF0ZSAiSC4zMjMgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSyAmJiAoSVBWNiB8fCBJUFY2PW4pCisJZGVwZW5kcyBvbiAoSVBWNiB8fCBJUFY2PW4pCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBILjMyMyBpcyBhIFZvSVAgc2lnbmFsbGluZyBwcm90b2NvbCBmcm9tIElUVS1ULiBBcyBvbmUgb2YgdGhlIG1vc3QKQEAgLTE4NSw3ICsxODAsNiBAQAogCiBjb25maWcgTkZfQ09OTlRSQUNLX0lSQwogCXRyaXN0YXRlICJJUkMgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoZXJlIGlzIGEgY29tbW9ubHktdXNlZCBleHRlbnNpb24gdG8gSVJDIGNhbGxlZApAQCAtMjAxLDcgKzE5NSw2IEBACiAKIGNvbmZpZyBORl9DT05OVFJBQ0tfTkVUQklPU19OUwogCXRyaXN0YXRlICJOZXRCSU9TIG5hbWUgc2VydmljZSBwcm90b2NvbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBOZXRCSU9TIG5hbWUgc2VydmljZSByZXF1ZXN0cyBhcmUgc2VudCBhcyBicm9hZGNhc3QgbWVzc2FnZXMgZnJvbSBhbgpAQCAtMjIxLDcgKzIxNCw2IEBACiAKIGNvbmZpZyBORl9DT05OVFJBQ0tfUFBUUAogCXRyaXN0YXRlICJQUHRQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCXNlbGVjdCBORl9DVF9QUk9UT19HUkUKIAloZWxwCkBAIC0yNDEsNyArMjMzLDcgQEAKIAogY29uZmlnIE5GX0NPTk5UUkFDS19TQU5FCiAJdHJpc3RhdGUgIlNBTkUgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgU0FORSBpcyBhIHByb3RvY29sIGZvciByZW1vdGUgYWNjZXNzIHRvIHNjYW5uZXJzIGFzIGltcGxlbWVudGVkCkBAIC0yNTUsNyArMjQ3LDYgQEAKIAogY29uZmlnIE5GX0NPTk5UUkFDS19TSVAKIAl0cmlzdGF0ZSAiU0lQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBTSVAgaXMgYW4gYXBwbGljYXRpb24tbGF5ZXIgY29udHJvbCBwcm90b2NvbCB0aGF0IGNhbiBlc3RhYmxpc2gsCkBAIC0yNjgsNyArMjU5LDYgQEAKIAogY29uZmlnIE5GX0NPTk5UUkFDS19URlRQCiAJdHJpc3RhdGUgIlRGVFAgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVEZUUCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciwgdGhpcyBpcyByZXF1aXJlZCBkZXBlbmRpbmcKQEAgLTI4MCwxMyArMjcwLDI5IEBACiAKIGNvbmZpZyBORl9DVF9ORVRMSU5LCiAJdHJpc3RhdGUgJ0Nvbm5lY3Rpb24gdHJhY2tpbmcgbmV0bGluayBpbnRlcmZhY2UnCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlzZWxlY3QgTkVURklMVEVSX05FVExJTksKIAlkZXBlbmRzIG9uIE5GX05BVD1uIHx8IE5GX05BVAogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYSBuZXRsaW5rLWJhc2VkIHVzZXJzcGFjZSBpbnRlcmZhY2UKIAorIyB0cmFuc3BhcmVudCBwcm94eSBzdXBwb3J0Citjb25maWcgTkVURklMVEVSX1RQUk9YWQorCXRyaXN0YXRlICJUcmFuc3BhcmVudCBwcm94eWluZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdHJhbnNwYXJlbnQgcHJveHlpbmcgc3VwcG9ydCwgdGhhdCBpcywKKwkgIHN1cHBvcnQgZm9yIGhhbmRsaW5nIG5vbi1sb2NhbGx5IGJvdW5kIElQdjQgVENQIGFuZCBVRFAgc29ja2V0cy4KKwkgIEZvciBpdCB0byB3b3JrIHlvdSB3aWxsIGhhdmUgdG8gY29uZmlndXJlIGNlcnRhaW4gaXB0YWJsZXMgcnVsZXMKKwkgIGFuZCB1c2UgcG9saWN5IHJvdXRpbmcuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBzZXQgaXQgdXAKKwkgIHNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHByb3h5LnR4dC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2VuZGlmICMgTkZfQ09OTlRSQUNLCisKIGNvbmZpZyBORVRGSUxURVJfWFRBQkxFUwogCXRyaXN0YXRlICJOZXRmaWx0ZXIgWHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgaXBfdGFibGVzKSIKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KQEAgLTI5NCwxMSArMzAwLDEyIEBACiAJICBUaGlzIGlzIHJlcXVpcmVkIGlmIHlvdSBpbnRlbmQgdG8gdXNlIGFueSBvZiBpcF90YWJsZXMsCiAJICBpcDZfdGFibGVzIG9yIGFycF90YWJsZXMuCiAKK2lmIE5FVEZJTFRFUl9YVEFCTEVTCisKICMgYWxwaGFiZXRpY2FsbHkgb3JkZXJlZCBsaXN0IG9mIHRhcmdldHMKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkKIAl0cmlzdGF0ZSAnIkNMQVNTSUZZIiB0YXJnZXQgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIGEgYENMQVNTSUZZJyB0YXJnZXQsIHdoaWNoIGVuYWJsZXMgdGhlIHVzZXIgdG8gc2V0CkBAIC0zMTEsOCArMzE4LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUksKIAl0cmlzdGF0ZSAgJyJDT05OTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFIHx8IElQNl9ORl9NQU5HTEUKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCkBAIC0zMjUsOSArMzMwLDIwIEBACiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCiAJICBpcHRfQ09OTk1BUksua28uICBJZiB1bnN1cmUsIHNheSBgTicuCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLCisJdHJpc3RhdGUgJyJDT05OU0VDTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sgJiYgTkZfQ09OTlRSQUNLX1NFQ01BUksKKwlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KKwloZWxwCisJICBUaGUgQ09OTlNFQ01BUksgdGFyZ2V0IGNvcGllcyBzZWN1cml0eSBtYXJraW5ncyBmcm9tIHBhY2tldHMKKwkgIHRvIGNvbm5lY3Rpb25zLCBhbmQgcmVzdG9yZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBjb25uZWN0aW9ucworCSAgdG8gcGFja2V0cyAoaWYgdGhlIHBhY2tldHMgYXJlIG5vdCBhbHJlYWR5IG1hcmtlZCkuICBUaGlzIHdvdWxkCisJICBub3JtYWxseSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNFQ01BUksgdGFyZ2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfRFNDUAogCXRyaXN0YXRlICciRFNDUCIgYW5kICJUT1MiIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIElQX05GX01BTkdMRSB8fCBJUDZfTkZfTUFOR0xFCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCkBAIC0zNDQsNyArMzYwLDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSwogCXRyaXN0YXRlICciTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBydWxlcwpAQCAtMzU2LDIxICszNzEsOCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRQotCXRyaXN0YXRlICciTkZRVUVVRSIgdGFyZ2V0IFN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwotCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECi0JaGVscAotCSAgVGhpcyB0YXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCi0KLQkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCi0JICBub3QganVzdCBvbmUuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRwogCXRyaXN0YXRlICciTkZMT0ciIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBORkxPRyB0YXJnZXQsIHdoaWNoIGFsbG93cyB0byBMT0cKQEAgLTM4MCw5ICszODIsMTkgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUKKwl0cmlzdGF0ZSAnIk5GUVVFVUUiIHRhcmdldCBTdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJaGVscAorCSAgVGhpcyB0YXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCisKKwkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCisJICBub3QganVzdCBvbmUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLCiAJdHJpc3RhdGUgICciTk9UUkFDSyIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gSVBfTkZfUkFXIHx8IElQNl9ORl9SQVcKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECkBAIC0zOTcsNyArNDA5LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVAogCXRyaXN0YXRlICciUkFURUVTVCIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBSQVRFRVNUJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB0byBtZWFzdXJlCkBAIC00MDYsOSArNDE3LDIzIEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9UUFJPWFkKKwl0cmlzdGF0ZSAnIlRQUk9YWSIgdGFyZ2V0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9UUFJPWFkKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwlzZWxlY3QgTkZfREVGUkFHX0lQVjQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYFRQUk9YWScgdGFyZ2V0LCB3aGljaCBpcyBzb21ld2hhdCBzaW1pbGFyIHRvCisJICBSRURJUkVDVC4gIEl0IGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIG1hbmdsZSB0YWJsZSBhbmQgaXMgdXNlZnVsCisJICB0byByZWRpcmVjdCB0cmFmZmljIHRvIGEgdHJhbnNwYXJlbnQgcHJveHkuICBJdCBkb2VzIF9ub3RfIGRlcGVuZAorCSAgb24gTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIE5BVCwgdW5saWtlIFJFRElSRUNULgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UKIAl0cmlzdGF0ZSAgJyJUUkFDRSIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gSVBfTkZfUkFXIHx8IElQNl9ORl9SQVcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKQEAgLTQyMSw3ICs0NDYsNyBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLCiAJdHJpc3RhdGUgJyJTRUNNQVJLIiB0YXJnZXQgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTICYmIE5FVFdPUktfU0VDTUFSSworCWRlcGVuZHMgb24gTkVUV09SS19TRUNNQVJLCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJaGVscAogCSAgVGhlIFNFQ01BUksgdGFyZ2V0IGFsbG93cyBzZWN1cml0eSBtYXJraW5nIG9mIG5ldHdvcmsKQEAgLTQyOSwyMSArNDU0LDkgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLCi0JdHJpc3RhdGUgJyJDT05OU0VDTUFSSyIgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfQ09OTlRSQUNLX1NFQ01BUksKLQlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KLQloZWxwCi0JICBUaGUgQ09OTlNFQ01BUksgdGFyZ2V0IGNvcGllcyBzZWN1cml0eSBtYXJraW5ncyBmcm9tIHBhY2tldHMKLQkgIHRvIGNvbm5lY3Rpb25zLCBhbmQgcmVzdG9yZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBjb25uZWN0aW9ucwotCSAgdG8gcGFja2V0cyAoaWYgdGhlIHBhY2tldHMgYXJlIG5vdCBhbHJlYWR5IG1hcmtlZCkuICBUaGlzIHdvdWxkCi0JICBub3JtYWxseSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNFQ01BUksgdGFyZ2V0LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTCiAJdHJpc3RhdGUgJyJUQ1BNU1MiIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgKElQVjYgfHwgSVBWNj1uKQorCWRlcGVuZHMgb24gKElQVjYgfHwgSVBWNj1uKQogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgVENQTVNTJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gYWx0ZXIgdGhlCkBAIC00NzAsNyArNDgzLDcgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfVENQT1BUU1RSSVAKIAl0cmlzdGF0ZSAnIlRDUE9QVFNUUklQIiB0YXJnZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUgfHwgSVA2X05GX01BTkdMRQogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscApAQCAtNDc5LDcgKzQ5Miw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVAogCXRyaXN0YXRlICAnImNvbW1lbnQiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb21tZW50JyBkdW1teS1tYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwdXQKQEAgLTQ5MCw3ICs1MDIsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUwogCXRyaXN0YXRlICAnImNvbm5ieXRlcyIgcGVyLWNvbm5lY3Rpb24gY291bnRlciBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJc2VsZWN0IE5GX0NUX0FDQ1QKQEAgLTUwMyw3ICs1MTQsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVAogCXRyaXN0YXRlICciY29ubmxpbWl0IiBtYXRjaCBzdXBwb3J0IicKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCS0tLWhlbHAtLS0KQEAgLTUxMiw3ICs1MjIsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLCiAJdHJpc3RhdGUgICciY29ubm1hcmsiIGNvbm5lY3Rpb24gbWFyayBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCkBAIC01MjYsNyArNTM1LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0sKIAl0cmlzdGF0ZSAnImNvbm50cmFjayIgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCWhlbHAKQEAgLTU0MCw3ICs1NDgsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0RDQ1AKIAl0cmlzdGF0ZSAnImRjY3AiIHByb3RvY29sIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJZGVmYXVsdCBJUF9EQ0NQCiAJaGVscApAQCAtNTUzLDcgKzU2MCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfRFNDUAogCXRyaXN0YXRlICciZHNjcCIgYW5kICJ0b3MiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBEU0NQJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCBhZ2FpbnN0CkBAIC01NjksNyArNTc1LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9FU1AKIAl0cmlzdGF0ZSAnImVzcCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBUaGlzIG1hdGNoIGV4dGVuc2lvbiBhbGxvd3MgeW91IHRvIG1hdGNoIGEgcmFuZ2Ugb2YgU1BJcwpAQCAtNTc3LDkgKzU4MiwyMyBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQKKwl0cmlzdGF0ZSAnImhhc2hsaW1pdCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIChJUDZfTkZfSVBUQUJMRVMgfHwgSVA2X05GX0lQVEFCTEVTPW4pCisJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYGhhc2hsaW1pdCcgbWF0Y2guCisKKwkgIEFzIG9wcG9zZWQgdG8gYGxpbWl0JywgdGhpcyBtYXRjaCBkeW5hbWljYWxseSBjcmVhdGVzIGEgaGFzaCB0YWJsZQorCSAgb2YgbGltaXQgYnVja2V0cywgYmFzZWQgb24geW91ciBzZWxlY3Rpb24gb2Ygc291cmNlL2Rlc3RpbmF0aW9uCisJICBhZGRyZXNzZXMgYW5kL29yIHBvcnRzLgorCisJICBJdCBlbmFibGVzIHlvdSB0byBleHByZXNzIHBvbGljaWVzIGxpa2UgYDEwa3BwcyBmb3IgYW55IGdpdmVuCisJICBkZXN0aW5hdGlvbiBhZGRyZXNzJyBvciBgNTAwcHBzIGZyb20gYW55IGdpdmVuIHNvdXJjZSBhZGRyZXNzJworCSAgd2l0aCBhIHNpbmdsZSBydWxlLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0hFTFBFUgogCXRyaXN0YXRlICciaGVscGVyIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscApAQCAtNTkwLDcgKzYwOSw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRQogCXRyaXN0YXRlICciaXByYW5nZSIgYWRkcmVzcyByYW5nZSBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCS0tLWhlbHAtLS0KIAlUaGlzIG9wdGlvbiBhZGRzIGEgImlwcmFuZ2UiIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIGJhc2VkIG9uCkBAIC02MDEsNyArNjE5LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEgKIAl0cmlzdGF0ZSAnImxlbmd0aCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgYSBwYWNrZXQgYWdhaW5zdCBhCkBAIC02MTEsNyArNjI4LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVAogCXRyaXN0YXRlICcibGltaXQiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgbGltaXQgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSByYXRlIGF0IHdoaWNoIGEgcnVsZSBjYW4gYmUKQEAgLTYyMiw3ICs2MzgsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX01BQwogCXRyaXN0YXRlICcibWFjIiBhZGRyZXNzIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgTUFDIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUgc291cmNlCkBAIC02MzIsNyArNjQ3LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9NQVJLCiAJdHJpc3RhdGUgJyJtYXJrIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAloZWxwCiAJICBOZXRmaWx0ZXIgbWFyayBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlCkBAIC02NDEsMjkgKzY1NSw4IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgTkVURklMVEVSX1hUX01BVENIX09XTkVSCi0JdHJpc3RhdGUgJyJvd25lciIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKLQktLS1oZWxwLS0tCi0JU29ja2V0IG93bmVyIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggbG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cwotCWJhc2VkIG9uIHdobyBjcmVhdGVkIHRoZSBzb2NrZXQ6IHRoZSB1c2VyIG9yIGdyb3VwLiBJdCBpcyBhbHNvCi0JcG9zc2libGUgdG8gY2hlY2sgd2hldGhlciBhIHNvY2tldCBhY3R1YWxseSBleGlzdHMuCi0KLWNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZCi0JdHJpc3RhdGUgJ0lQc2VjICJwb2xpY3kiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBYRlJNCi0JZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCi0JaGVscAotCSAgUG9saWN5IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKLQkgIElQc2VjIHBvbGljeSB0aGF0IHdhcyB1c2VkIGR1cmluZyBkZWNhcHN1bGF0aW9uL3dpbGwKLQkgIGJlIHVzZWQgZHVyaW5nIGVuY2Fwc3VsYXRpb24uCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVAogCXRyaXN0YXRlICcibXVsdGlwb3J0IiBNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgTXVsdGlwb3J0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggVENQIG9yIFVEUCBwYWNrZXRzIGJhc2VkIG9uCkBAIC02NzIsOSArNjY1LDI4IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX09XTkVSCisJdHJpc3RhdGUgJyJvd25lciIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCS0tLWhlbHAtLS0KKwlTb2NrZXQgb3duZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBsb2NhbGx5LWdlbmVyYXRlZCBwYWNrZXRzCisJYmFzZWQgb24gd2hvIGNyZWF0ZWQgdGhlIHNvY2tldDogdGhlIHVzZXIgb3IgZ3JvdXAuIEl0IGlzIGFsc28KKwlwb3NzaWJsZSB0byBjaGVjayB3aGV0aGVyIGEgc29ja2V0IGFjdHVhbGx5IGV4aXN0cy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1kKKwl0cmlzdGF0ZSAnSVBzZWMgInBvbGljeSIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIFhGUk0KKwlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KKwloZWxwCisJICBQb2xpY3kgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZQorCSAgSVBzZWMgcG9saWN5IHRoYXQgd2FzIHVzZWQgZHVyaW5nIGRlY2Fwc3VsYXRpb24vd2lsbAorCSAgYmUgdXNlZCBkdXJpbmcgZW5jYXBzdWxhdGlvbi4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVgogCXRyaXN0YXRlICcicGh5c2RldiIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTICYmIEJSSURHRSAmJiBCUklER0VfTkVURklMVEVSCisJZGVwZW5kcyBvbiBCUklER0UgJiYgQlJJREdFX05FVEZJTFRFUgogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKQEAgLTY4NCw3ICs2OTYsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEUKIAl0cmlzdGF0ZSAnInBrdHR5cGUiIHBhY2tldCB0eXBlIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgUGFja2V0IHR5cGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBhIHBhY2tldCBieQpAQCAtNjk3LDcgKzcwOCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEKIAl0cmlzdGF0ZSAnInF1b3RhIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgcXVvdGEnIG1hdGNoLCB3aGljaCBhbGxvd3MgdG8gbWF0Y2ggb24gYQpAQCAtNzA4LDcgKzcxOCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUkFURUVTVAogCXRyaXN0YXRlICcicmF0ZWVzdCIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAlzZWxlY3QgTkVURklMVEVSX1hUX1RBUkdFVF9SQVRFRVNUCiAJaGVscApAQCAtNzE5LDcgKzcyOCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0KIAl0cmlzdGF0ZSAgJyJyZWFsbSIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAlzZWxlY3QgTkVUX0NMU19ST1VURQogCWhlbHAKQEAgLTczMiw5ICs3NDAsMjYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQKKwl0cmlzdGF0ZSAnInJlY2VudCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCS0tLWhlbHAtLS0KKwlUaGlzIG1hdGNoIGlzIHVzZWQgZm9yIGNyZWF0aW5nIG9uZSBvciBtYW55IGxpc3RzIG9mIHJlY2VudGx5CisJdXNlZCBhZGRyZXNzZXMgYW5kIHRoZW4gbWF0Y2hpbmcgYWdhaW5zdCB0aGF0L3Rob3NlIGxpc3QocykuCisKKwlTaG9ydCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYnkgdXNpbmcgJ2lwdGFibGVzIC1tIHJlY2VudCAtaCcKKwlPZmZpY2lhbCBXZWJzaXRlOiA8aHR0cDovL3Nub3dtYW4ubmV0L3Byb2plY3RzL2lwdF9yZWNlbnQvPgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVF9QUk9DX0NPTVBBVAorCWJvb2wgJ0VuYWJsZSBvYnNvbGV0ZSAvcHJvYy9uZXQvaXB0X3JlY2VudCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQgJiYgUFJPQ19GUworCS0tLWhlbHAtLS0KKwlUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBvbGQgL3Byb2MvbmV0L2lwdF9yZWNlbnQgaW50ZXJmYWNlLAorCXdoaWNoIGhhcyBiZWVuIG9ic29sZXRlZCBieSAvcHJvYy9uZXQveHRfcmVjZW50LgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1NDVFAKIAl0cmlzdGF0ZSAgJyJzY3RwIiBwcm90b2NvbCBtYXRjaCBzdXBwb3J0IChFWFBFUklNRU5UQUwpJwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWRlZmF1bHQgSVBfU0NUUAogCWhlbHAKQEAgLTc0NSw5ICs3NzAsMjMgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQKKwl0cmlzdGF0ZSAnInNvY2tldCIgbWF0Y2ggc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTkVURklMVEVSX1RQUk9YWQorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCXNlbGVjdCBORl9ERUZSQUdfSVBWNAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgc29ja2V0JyBtYXRjaCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWF0Y2gKKwkgIHBhY2tldHMgZm9yIHdoaWNoIGEgVENQIG9yIFVEUCBzb2NrZXQgbG9va3VwIGZpbmRzIGEgdmFsaWQgc29ja2V0LgorCSAgSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgTUFSSyB0YXJnZXQgYW5kIHBvbGljeQorCSAgcm91dGluZyB0byBpbXBsZW1lbnQgZnVsbCBmZWF0dXJlZCBub24tbG9jYWxseSBib3VuZCBzb2NrZXRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVEFURQogCXRyaXN0YXRlICcic3RhdGUiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJaGVscApAQCAtNzU5LDcgKzc5OCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDCiAJdHJpc3RhdGUgJyJzdGF0aXN0aWMiIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBzdGF0aXN0aWMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoCkBAIC03NjksNyArODA3LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcKIAl0cmlzdGF0ZSAgJyJzdHJpbmciIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJc2VsZWN0IFRFWFRTRUFSQ0gKIAlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKQEAgLTc4Myw3ICs4MjAsNiBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX1RDUE1TUwogCXRyaXN0YXRlICcidGNwbXNzIiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgdGNwbXNzJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBleGFtaW5lIHRoZQpAQCAtNzk0LDcgKzgzMCw2IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfVElNRQogCXRyaXN0YXRlICcidGltZSIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBhZGRzIGEgInRpbWUiIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIGJhc2VkIG9uCkBAIC04MDksNyArODQ0LDYgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9VMzIKIAl0cmlzdGF0ZSAnInUzMiIgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAktLS1oZWxwLS0tCiAJICB1MzIgYWxsb3dzIHlvdSB0byBleHRyYWN0IHF1YW50aXRpZXMgb2YgdXAgdG8gNCBieXRlcyBmcm9tIGEgcGFja2V0LApAQCAtODIxLDIwICs4NTUsOCBAQAogCiAJICBEZXRhaWxzIGFuZCBleGFtcGxlcyBhcmUgaW4gdGhlIGtlcm5lbCBtb2R1bGUgc291cmNlLgogCi1jb25maWcgTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVAotCXRyaXN0YXRlICciaGFzaGxpbWl0IiBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgKElQNl9ORl9JUFRBQkxFUyB8fCBJUDZfTkZfSVBUQUJMRVM9bikKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgaGFzaGxpbWl0JyBtYXRjaC4KLQotCSAgQXMgb3Bwb3NlZCB0byBgbGltaXQnLCB0aGlzIG1hdGNoIGR5bmFtaWNhbGx5IGNyZWF0ZXMgYSBoYXNoIHRhYmxlCi0JICBvZiBsaW1pdCBidWNrZXRzLCBiYXNlZCBvbiB5b3VyIHNlbGVjdGlvbiBvZiBzb3VyY2UvZGVzdGluYXRpb24KLQkgIGFkZHJlc3NlcyBhbmQvb3IgcG9ydHMuCi0KLQkgIEl0IGVuYWJsZXMgeW91IHRvIGV4cHJlc3MgcG9saWNpZXMgbGlrZSBgMTBrcHBzIGZvciBhbnkgZ2l2ZW4KLQkgIGRlc3RpbmF0aW9uIGFkZHJlc3MnIG9yIGA1MDBwcHMgZnJvbSBhbnkgZ2l2ZW4gc291cmNlIGFkZHJlc3MnCi0JICB3aXRoIGEgc2luZ2xlIHJ1bGUuCitlbmRpZiAjIE5FVEZJTFRFUl9YVEFCTEVTCiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvbmV0ZmlsdGVyL2lwdnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDNiZDJjYzUuLmRhM2Q5MDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMzQsNiArMzQsOSBAQAogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19TSVApICs9IG5mX2Nvbm50cmFja19zaXAubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19URlRQKSArPSBuZl9jb25udHJhY2tfdGZ0cC5vCiAKKyMgdHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydAorb2JqLSQoQ09ORklHX05FVEZJTFRFUl9UUFJPWFkpICs9IG5mX3Rwcm94eV9jb3JlLm8KKwogIyBnZW5lcmljIFggdGFibGVzIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTKSArPSB4X3RhYmxlcy5vIHh0X3RjcHVkcC5vCiAKQEAgLTQ4LDYgKzUxLDcgQEAKIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0spICs9IHh0X05PVFJBQ0subwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVCkgKz0geHRfUkFURUVTVC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLKSArPSB4dF9TRUNNQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RQUk9YWSkgKz0geHRfVFBST1hZLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUykgKz0geHRfVENQTVNTLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQKSArPSB4dF9UQ1BPUFRTVFJJUC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRSkgKz0geHRfVFJBQ0UubwpAQCAtNzYsMTAgKzgwLDE1IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBKSArPSB4dF9xdW90YS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1QpICs9IHh0X3JhdGVlc3Qubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTSkgKz0geHRfcmVhbG0ubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQpICs9IHh0X3JlY2VudC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFApICs9IHh0X3NjdHAubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQpICs9IHh0X3NvY2tldC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFKSArPSB4dF9zdGF0ZS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQykgKz0geHRfc3RhdGlzdGljLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HKSArPSB4dF9zdHJpbmcubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1MpICs9IHh0X3RjcG1zcy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUUpICs9IHh0X3RpbWUubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzIpICs9IHh0X3UzMi5vCisKKyMgSVBWUworb2JqLSQoQ09ORklHX0lQX1ZTKSArPSBpcHZzLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwppbmRleCAyOTJmYTI4Li5hOTBhYzgzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwpAQCAtMjYsNyArMjYsNyBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGFmaW5mb19tdXRleCk7CiAKLWNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKm5mX2FmaW5mb1tOUFJPVE9dIF9fcmVhZF9tb3N0bHk7Citjb25zdCBzdHJ1Y3QgbmZfYWZpbmZvICpuZl9hZmluZm9bTkZQUk9UT19OVU1QUk9UT10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobmZfYWZpbmZvKTsKIAogaW50IG5mX3JlZ2lzdGVyX2FmaW5mbyhjb25zdCBzdHJ1Y3QgbmZfYWZpbmZvICphZmluZm8pCkBAIC01MSw3ICs1MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl91bnJlZ2lzdGVyX2FmaW5mbyk7CiAKLXN0cnVjdCBsaXN0X2hlYWQgbmZfaG9va3NbTlBST1RPXVtORl9NQVhfSE9PS1NdIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgbGlzdF9oZWFkIG5mX2hvb2tzW05GUFJPVE9fTlVNUFJPVE9dW05GX01BWF9IT09LU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobmZfaG9va3MpOwogc3RhdGljIERFRklORV9NVVRFWChuZl9ob29rX211dGV4KTsKIApAQCAtMTEzLDcgKzExMyw3IEBACiAKIHVuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJaW50IGhvb2ssCisJCQl1bnNpZ25lZCBpbnQgaG9vaywKIAkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCiAJCQlzdHJ1Y3QgbGlzdF9oZWFkICoqaSwKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiAvKiBSZXR1cm5zIDEgaWYgb2tmbigpIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjYWxsZXIsCiAgKiAtRVBFUk0gZm9yIE5GX0RST1AsIDAgb3RoZXJ3aXNlLiAqLwotaW50IG5mX2hvb2tfc2xvdyhpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IG5mX2hvb2tfc2xvdyh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCiAJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAogCQkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksCkBAIC0xNjUsMTQgKzE2NSw2IEBACiAJdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAJaW50IHJldCA9IDA7CiAKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0Jc3RydWN0IG5ldCAqbmV0OwotCi0JbmV0ID0gaW5kZXYgPT0gTlVMTCA/IGRldl9uZXQob3V0ZGV2KSA6IGRldl9uZXQoaW5kZXYpOwotCWlmIChuZXQgIT0gJmluaXRfbmV0KQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCiAJLyogV2UgbWF5IGFscmVhZHkgaGF2ZSB0aGlzLCBidXQgcmVhZC1sb2NrcyBuZXN0IGFueXdheSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIApAQCAtMjY0LDcgKzI1Niw3IEBACiB2b2lkIF9faW5pdCBuZXRmaWx0ZXJfaW5pdCh2b2lkKQogewogCWludCBpLCBoOwotCWZvciAoaSA9IDA7IGkgPCBOUFJPVE87IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5mX2hvb2tzKTsgaSsrKSB7CiAJCWZvciAoaCA9IDA7IGggPCBORl9NQVhfSE9PS1M7IGgrKykKIAkJCUlOSVRfTElTVF9IRUFEKCZuZl9ob29rc1tpXVtoXSk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA0OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL0tjb25maWcKQEAgLTAsMCArMSwyMzkgQEAKKyMKKyMgSVAgVmlydHVhbCBTZXJ2ZXIgY29uZmlndXJhdGlvbgorIworbWVudWNvbmZpZyBJUF9WUworCXRyaXN0YXRlICJJUCB2aXJ0dWFsIHNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUICYmIElORVQgJiYgTkVURklMVEVSCisJLS0taGVscC0tLQorCSAgSVAgVmlydHVhbCBTZXJ2ZXIgc3VwcG9ydCB3aWxsIGxldCB5b3UgYnVpbGQgYSBoaWdoLXBlcmZvcm1hbmNlCisJICB2aXJ0dWFsIHNlcnZlciBiYXNlZCBvbiBjbHVzdGVyIG9mIHR3byBvciBtb3JlIHJlYWwgc2VydmVycy4gVGhpcworCSAgb3B0aW9uIG11c3QgYmUgZW5hYmxlZCBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBjbHVzdGVyZWQgY29tcHV0ZXJzCisJICB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGludGVyY2VwdGluZyBpbmNvbWluZyBjb25uZWN0aW9ucyB0byBhCisJICBzaW5nbGUgSVAgYWRkcmVzcyBhbmQgc2NoZWR1bGluZyB0aGVtIHRvIHJlYWwgc2VydmVycy4KKworCSAgVGhyZWUgcmVxdWVzdCBkaXNwYXRjaGluZyB0ZWNobmlxdWVzIGFyZSBpbXBsZW1lbnRlZCwgdGhleSBhcmUKKwkgIHZpcnR1YWwgc2VydmVyIHZpYSBOQVQsIHZpcnR1YWwgc2VydmVyIHZpYSB0dW5uZWxpbmcgYW5kIHZpcnR1YWwKKwkgIHNlcnZlciB2aWEgZGlyZWN0IHJvdXRpbmcuIFRoZSBzZXZlcmFsIHNjaGVkdWxpbmcgYWxnb3JpdGhtcyBjYW4KKwkgIGJlIHVzZWQgdG8gY2hvb3NlIHdoaWNoIHNlcnZlciB0aGUgY29ubmVjdGlvbiBpcyBkaXJlY3RlZCB0bywKKwkgIHRodXMgbG9hZCBiYWxhbmNpbmcgY2FuIGJlIGFjaGlldmVkIGFtb25nIHRoZSBzZXJ2ZXJzLiAgRm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uIGFuZCBpdHMgYWRtaW5pc3RyYXRpb24gcHJvZ3JhbSwgcGxlYXNlIHZpc2l0IHRoZQorCSAgZm9sbG93aW5nIFVSTDogPGh0dHA6Ly93d3cubGludXh2aXJ0dWFsc2VydmVyLm9yZy8+LgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitpZiBJUF9WUworCitjb25maWcJSVBfVlNfSVBWNgorCWJvb2wgIklQdjYgc3VwcG9ydCBmb3IgSVBWUyAoREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAoSVBWNiA9IHkgfHwgSVBfVlMgPSBJUFY2KQorCS0tLWhlbHAtLS0KKwkgIEFkZCBJUHY2IHN1cHBvcnQgdG8gSVBWUy4gVGhpcyBpcyBpbmNvbXBsZXRlIGFuZCBtaWdodCBiZSBkYW5nZXJvdXMuCisKKwkgIFNheSBOIGlmIHVuc3VyZS4KKworY29uZmlnCUlQX1ZTX0RFQlVHCisJYm9vbCAiSVAgdmlydHVhbCBzZXJ2ZXIgZGVidWdnaW5nIgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZ2V0IGFkZGl0aW9uYWwgbWVzc2FnZXMgdXNlZnVsIGluCisJICBkZWJ1Z2dpbmcgdGhlIElQIHZpcnR1YWwgc2VydmVyIGNvZGUuIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWJ1ZworCSAgbGV2ZWwgaW4gL3Byb2Mvc3lzL25ldC9pcHY0L3ZzL2RlYnVnX2xldmVsCisKK2NvbmZpZwlJUF9WU19UQUJfQklUUworCWludCAiSVBWUyBjb25uZWN0aW9uIHRhYmxlIHNpemUgKHRoZSBOdGggcG93ZXIgb2YgMikiCisJcmFuZ2UgOCAyMAorCWRlZmF1bHQgMTIKKwktLS1oZWxwLS0tCisJICBUaGUgSVBWUyBjb25uZWN0aW9uIGhhc2ggdGFibGUgdXNlcyB0aGUgY2hhaW5pbmcgc2NoZW1lIHRvIGhhbmRsZQorCSAgaGFzaCBjb2xsaXNpb25zLiBVc2luZyBhIGJpZyBJUFZTIGNvbm5lY3Rpb24gaGFzaCB0YWJsZSB3aWxsIGdyZWF0bHkKKwkgIHJlZHVjZSBjb25mbGljdHMgd2hlbiB0aGVyZSBhcmUgaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIGNvbm5lY3Rpb25zCisJICBpbiB0aGUgaGFzaCB0YWJsZS4KKworCSAgTm90ZSB0aGUgdGFibGUgc2l6ZSBtdXN0IGJlIHBvd2VyIG9mIDIuIFRoZSB0YWJsZSBzaXplIHdpbGwgYmUgdGhlCisJICB2YWx1ZSBvZiAyIHRvIHRoZSB5b3VyIGlucHV0IG51bWJlciBwb3dlci4gVGhlIG51bWJlciB0byBjaG9vc2UgaXMKKwkgIGZyb20gOCB0byAyMCwgdGhlIGRlZmF1bHQgbnVtYmVyIGlzIDEyLCB3aGljaCBtZWFucyB0aGUgdGFibGUgc2l6ZQorCSAgaXMgNDA5Ni4gRG9uJ3QgaW5wdXQgdGhlIG51bWJlciB0b28gc21hbGwsIG90aGVyd2lzZSB5b3Ugd2lsbCBsb3NlCisJICBwZXJmb3JtYW5jZSBvbiBpdC4gWW91IGNhbiBhZGFwdCB0aGUgdGFibGUgc2l6ZSB5b3Vyc2VsZiwgYWNjb3JkaW5nCisJICB0byB5b3VyIHZpcnR1YWwgc2VydmVyIGFwcGxpY2F0aW9uLiBJdCBpcyBnb29kIHRvIHNldCB0aGUgdGFibGUgc2l6ZQorCSAgbm90IGZhciBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBjb25uZWN0aW9ucyBwZXIgc2Vjb25kIG11bHRpcGx5aW5nCisJICBhdmVyYWdlIGxhc3RpbmcgdGltZSBvZiBjb25uZWN0aW9uIGluIHRoZSB0YWJsZS4gIEZvciBleGFtcGxlLCB5b3VyCisJICB2aXJ0dWFsIHNlcnZlciBnZXRzIDIwMCBjb25uZWN0aW9ucyBwZXIgc2Vjb25kLCB0aGUgY29ubmVjdGlvbiBsYXN0cworCSAgZm9yIDIwMCBzZWNvbmRzIGluIGF2ZXJhZ2UgaW4gdGhlIGNvbm5lY3Rpb24gdGFibGUsIHRoZSB0YWJsZSBzaXplCisJICBzaG91bGQgYmUgbm90IGZhciBsZXNzIHRoYW4gMjAweDIwMCwgaXQgaXMgZ29vZCB0byBzZXQgdGhlIHRhYmxlCisJICBzaXplIDMyNzY4ICgyKioxNSkuCisKKwkgIEFub3RoZXIgbm90ZSB0aGF0IGVhY2ggY29ubmVjdGlvbiBvY2N1cGllcyAxMjggYnl0ZXMgZWZmZWN0aXZlbHkgYW5kCisJICBlYWNoIGhhc2ggZW50cnkgdXNlcyA4IGJ5dGVzLCBzbyB5b3UgY2FuIGVzdGltYXRlIGhvdyBtdWNoIG1lbW9yeSBpcworCSAgbmVlZGVkIGZvciB5b3VyIGJveC4KKworY29tbWVudCAiSVBWUyB0cmFuc3BvcnQgcHJvdG9jb2wgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCIKKworY29uZmlnCUlQX1ZTX1BST1RPX1RDUAorCWJvb2wgIlRDUCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgbG9hZCBiYWxhbmNpbmcgVENQIHRyYW5zcG9ydAorCSAgcHJvdG9jb2wuIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnCUlQX1ZTX1BST1RPX1VEUAorCWJvb2wgIlVEUCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgbG9hZCBiYWxhbmNpbmcgVURQIHRyYW5zcG9ydAorCSAgcHJvdG9jb2wuIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnCUlQX1ZTX1BST1RPX0FIX0VTUAorCWJvb2wKKwlkZXBlbmRzIG9uIFVOREVGSU5FRAorCitjb25maWcJSVBfVlNfUFJPVE9fRVNQCisJYm9vbCAiRVNQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQiCisJc2VsZWN0IElQX1ZTX1BST1RPX0FIX0VTUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgbG9hZCBiYWxhbmNpbmcgRVNQIChFbmNhcHN1bGF0aW9uCisJICBTZWN1cml0eSBQYXlsb2FkKSB0cmFuc3BvcnQgcHJvdG9jb2wuIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnCUlQX1ZTX1BST1RPX0FICisJYm9vbCAiQUggbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCIKKwlzZWxlY3QgSVBfVlNfUFJPVE9fQUhfRVNQCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBsb2FkIGJhbGFuY2luZyBBSCAoQXV0aGVudGljYXRpb24KKwkgIEhlYWRlcikgdHJhbnNwb3J0IHByb3RvY29sLiBTYXkgWSBpZiB1bnN1cmUuCisKK2NvbW1lbnQgIklQVlMgc2NoZWR1bGVyIgorCitjb25maWcJSVBfVlNfUlIKKwl0cmlzdGF0ZSAicm91bmQtcm9iaW4gc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgcm9iaW4tcm9iaW4gc2NoZWR1bGluZyBhbGdvcml0aG0gc2ltcGx5IGRpcmVjdHMgbmV0d29yaworCSAgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IHJlYWwgc2VydmVycyBpbiBhIHJvdW5kLXJvYmluIG1hbm5lci4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKyAKK2NvbmZpZwlJUF9WU19XUlIKKyAgICAgICAgdHJpc3RhdGUgIndlaWdodGVkIHJvdW5kLXJvYmluIHNjaGVkdWxpbmciIAorCS0tLWhlbHAtLS0KKwkgIFRoZSB3ZWlnaHRlZCByb2Jpbi1yb2JpbiBzY2hlZHVsaW5nIGFsZ29yaXRobSBkaXJlY3RzIG5ldHdvcmsKKwkgIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCByZWFsIHNlcnZlcnMgYmFzZWQgb24gc2VydmVyIHdlaWdodHMKKwkgIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLiBTZXJ2ZXJzIHdpdGggaGlnaGVyIHdlaWdodHMgcmVjZWl2ZQorCSAgbmV3IGNvbm5lY3Rpb25zIGZpcnN0IHRoYW4gdGhvc2Ugd2l0aCBsZXNzIHdlaWdodHMsIGFuZCBzZXJ2ZXJzCisJICB3aXRoIGhpZ2hlciB3ZWlnaHRzIGdldCBtb3JlIGNvbm5lY3Rpb25zIHRoYW4gdGhvc2Ugd2l0aCBsZXNzCisJICB3ZWlnaHRzIGFuZCBzZXJ2ZXJzIHdpdGggZXF1YWwgd2VpZ2h0cyBnZXQgZXF1YWwgY29ubmVjdGlvbnMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19MQworICAgICAgICB0cmlzdGF0ZSAibGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIgorCS0tLWhlbHAtLS0KKwkgIFRoZSBsZWFzdC1jb25uZWN0aW9uIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGRpcmVjdHMgbmV0d29yaworCSAgY29ubmVjdGlvbnMgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2YgYWN0aXZlIAorCSAgY29ubmVjdGlvbnMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19XTEMKKyAgICAgICAgdHJpc3RhdGUgIndlaWdodGVkIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgd2VpZ2h0ZWQgbGVhc3QtY29ubmVjdGlvbiBzY2hlZHVsaW5nIGFsZ29yaXRobSBkaXJlY3RzIG5ldHdvcmsKKwkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgbGVhc3QgYWN0aXZlIGNvbm5lY3Rpb25zCisJICBub3JtYWxpemVkIGJ5IHRoZSBzZXJ2ZXIgd2VpZ2h0LgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcJSVBfVlNfTEJMQworCXRyaXN0YXRlICJsb2NhbGl0eS1iYXNlZCBsZWFzdC1jb25uZWN0aW9uIHNjaGVkdWxpbmciCisJLS0taGVscC0tLQorCSAgVGhlIGxvY2FsaXR5LWJhc2VkIGxlYXN0LWNvbm5lY3Rpb24gc2NoZWR1bGluZyBhbGdvcml0aG0gaXMgZm9yCisJICBkZXN0aW5hdGlvbiBJUCBsb2FkIGJhbGFuY2luZy4gSXQgaXMgdXN1YWxseSB1c2VkIGluIGNhY2hlIGNsdXN0ZXIuCisJICBUaGlzIGFsZ29yaXRobSB1c3VhbGx5IGRpcmVjdHMgcGFja2V0IGRlc3RpbmVkIGZvciBhbiBJUCBhZGRyZXNzIHRvCisJICBpdHMgc2VydmVyIGlmIHRoZSBzZXJ2ZXIgaXMgYWxpdmUgYW5kIHVuZGVyIGxvYWQuIElmIHRoZSBzZXJ2ZXIgaXMKKwkgIG92ZXJsb2FkZWQgKGl0cyBhY3RpdmUgY29ubmVjdGlvbiBudW1iZXJzIGlzIGxhcmdlciB0aGFuIGl0cyB3ZWlnaHQpCisJICBhbmQgdGhlcmUgaXMgYSBzZXJ2ZXIgaW4gaXRzIGhhbGYgbG9hZCwgdGhlbiBhbGxvY2F0ZSB0aGUgd2VpZ2h0ZWQKKwkgIGxlYXN0LWNvbm5lY3Rpb24gc2VydmVyIHRvIHRoaXMgSVAgYWRkcmVzcy4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnICBJUF9WU19MQkxDUgorCXRyaXN0YXRlICJsb2NhbGl0eS1iYXNlZCBsZWFzdC1jb25uZWN0aW9uIHdpdGggcmVwbGljYXRpb24gc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgbG9jYWxpdHktYmFzZWQgbGVhc3QtY29ubmVjdGlvbiB3aXRoIHJlcGxpY2F0aW9uIHNjaGVkdWxpbmcKKwkgIGFsZ29yaXRobSBpcyBhbHNvIGZvciBkZXN0aW5hdGlvbiBJUCBsb2FkIGJhbGFuY2luZy4gSXQgaXMgCisJICB1c3VhbGx5IHVzZWQgaW4gY2FjaGUgY2x1c3Rlci4gSXQgZGlmZmVycyBmcm9tIHRoZSBMQkxDIHNjaGVkdWxpbmcKKwkgIGFzIGZvbGxvd3M6IHRoZSBsb2FkIGJhbGFuY2VyIG1haW50YWlucyBtYXBwaW5ncyBmcm9tIGEgdGFyZ2V0CisJICB0byBhIHNldCBvZiBzZXJ2ZXIgbm9kZXMgdGhhdCBjYW4gc2VydmUgdGhlIHRhcmdldC4gUmVxdWVzdHMgZm9yCisJICBhIHRhcmdldCBhcmUgYXNzaWduZWQgdG8gdGhlIGxlYXN0LWNvbm5lY3Rpb24gbm9kZSBpbiB0aGUgdGFyZ2V0J3MKKwkgIHNlcnZlciBzZXQuIElmIGFsbCB0aGUgbm9kZSBpbiB0aGUgc2VydmVyIHNldCBhcmUgb3ZlciBsb2FkZWQsCisJICBpdCBwaWNrcyB1cCBhIGxlYXN0LWNvbm5lY3Rpb24gbm9kZSBpbiB0aGUgY2x1c3RlciBhbmQgYWRkcyBpdAorCSAgaW4gdGhlIHNldmVyIHNldCBmb3IgdGhlIHRhcmdldC4gSWYgdGhlIHNlcnZlciBzZXQgaGFzIG5vdCBiZWVuCisJICBtb2RpZmllZCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLCB0aGUgbW9zdCBsb2FkZWQgbm9kZSBpcyByZW1vdmVkCisJICBmcm9tIHRoZSBzZXJ2ZXIgc2V0LCBpbiBvcmRlciB0byBhdm9pZCBoaWdoIGRlZ3JlZSBvZiByZXBsaWNhdGlvbi4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnCUlQX1ZTX0RICisJdHJpc3RhdGUgImRlc3RpbmF0aW9uIGhhc2hpbmcgc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgZGVzdGluYXRpb24gaGFzaGluZyBzY2hlZHVsaW5nIGFsZ29yaXRobSBhc3NpZ25zIG5ldHdvcmsKKwkgIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXJzIHRocm91Z2ggbG9va2luZyB1cCBhIHN0YXRpY2FsbHkgYXNzaWduZWQKKwkgIGhhc2ggdGFibGUgYnkgdGhlaXIgZGVzdGluYXRpb24gSVAgYWRkcmVzc2VzLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGluIGtlcm5lbCwgc2F5IFkuIFRvIGNvbXBpbGUgaXQgYXMgYQorCSAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcJSVBfVlNfU0gKKwl0cmlzdGF0ZSAic291cmNlIGhhc2hpbmcgc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgc291cmNlIGhhc2hpbmcgc2NoZWR1bGluZyBhbGdvcml0aG0gYXNzaWducyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVycyB0aHJvdWdoIGxvb2tpbmcgdXAgYSBzdGF0aWNhbGx5IGFzc2lnbmVkCisJICBoYXNoIHRhYmxlIGJ5IHRoZWlyIHNvdXJjZSBJUCBhZGRyZXNzZXMuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19TRUQKKwl0cmlzdGF0ZSAic2hvcnRlc3QgZXhwZWN0ZWQgZGVsYXkgc2NoZWR1bGluZyIKKwktLS1oZWxwLS0tCisJICBUaGUgc2hvcnRlc3QgZXhwZWN0ZWQgZGVsYXkgc2NoZWR1bGluZyBhbGdvcml0aG0gYXNzaWducyBuZXR3b3JrCisJICBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyIHdpdGggdGhlIHNob3J0ZXN0IGV4cGVjdGVkIGRlbGF5LiBUaGUgCisJICBleHBlY3RlZCBkZWxheSB0aGF0IHRoZSBqb2Igd2lsbCBleHBlcmllbmNlIGlzIChDaSArIDEpIC8gVWkgaWYgCisJICBzZW50IHRvIHRoZSBpdGggc2VydmVyLCBpbiB3aGljaCBDaSBpcyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zCisJICBvbiB0aGUgaXRoIHNlcnZlciBhbmQgVWkgaXMgdGhlIGZpeGVkIHNlcnZpY2UgcmF0ZSAod2VpZ2h0KQorCSAgb2YgdGhlIGl0aCBzZXJ2ZXIuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZwlJUF9WU19OUQorCXRyaXN0YXRlICJuZXZlciBxdWV1ZSBzY2hlZHVsaW5nIgorCS0tLWhlbHAtLS0KKwkgIFRoZSBuZXZlciBxdWV1ZSBzY2hlZHVsaW5nIGFsZ29yaXRobSBhZG9wdHMgYSB0d28tc3BlZWQgbW9kZWwuCisJICBXaGVuIHRoZXJlIGlzIGFuIGlkbGUgc2VydmVyIGF2YWlsYWJsZSwgdGhlIGpvYiB3aWxsIGJlIHNlbnQgdG8KKwkgIHRoZSBpZGxlIHNlcnZlciwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBhIGZhc3Qgb25lLiBXaGVuIHRoZXJlCisJICBpcyBubyBpZGxlIHNlcnZlciBhdmFpbGFibGUsIHRoZSBqb2Igd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIKKwkgIHRoYXQgbWluaW1pemUgaXRzIGV4cGVjdGVkIGRlbGF5IChUaGUgU2hvcnRlc3QgRXhwZWN0ZWQgRGVsYXkKKwkgIHNjaGVkdWxpbmcgYWxnb3JpdGhtKS4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAnSVBWUyBhcHBsaWNhdGlvbiBoZWxwZXInCisKK2NvbmZpZwlJUF9WU19GVFAKKyAgCXRyaXN0YXRlICJGVFAgcHJvdG9jb2wgaGVscGVyIgorICAgICAgICBkZXBlbmRzIG9uIElQX1ZTX1BST1RPX1RDUAorCS0tLWhlbHAtLS0KKwkgIEZUUCBpcyBhIHByb3RvY29sIHRoYXQgdHJhbnNmZXJzIElQIGFkZHJlc3MgYW5kL29yIHBvcnQgbnVtYmVyIGluCisJICB0aGUgcGF5bG9hZC4gSW4gdGhlIHZpcnR1YWwgc2VydmVyIHZpYSBOZXR3b3JrIEFkZHJlc3MgVHJhbnNsYXRpb24sCisJICB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgb2YgcmVhbCBzZXJ2ZXJzIGNhbm5vdCBiZSBzZW50IHRvCisJICBjbGllbnRzIGluIGZ0cCBjb25uZWN0aW9ucyBkaXJlY3RseSwgc28gRlRQIHByb3RvY29sIGhlbHBlciBpcworCSAgcmVxdWlyZWQgZm9yIHRyYWNraW5nIHRoZSBjb25uZWN0aW9uIGFuZCBtYW5nbGluZyBpdCBiYWNrIHRvIHRoYXQgb2YKKwkgIHZpcnR1YWwgc2VydmljZS4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBpbiBrZXJuZWwsIHNheSBZLiBUbyBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kaWYgIyBJUF9WUwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9pcHZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTQ2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIElQVlMgbW9kdWxlcyBvbiB0b3Agb2YgSVB2NC4KKyMKKworIyBJUFZTIHRyYW5zcG9ydCBwcm90b2NvbCBsb2FkIGJhbGFuY2luZyBzdXBwb3J0CitpcF92c19wcm90by1vYmpzLXkgOj0KK2lwX3ZzX3Byb3RvLW9ianMtJChDT05GSUdfSVBfVlNfUFJPVE9fVENQKSArPSBpcF92c19wcm90b190Y3AubworaXBfdnNfcHJvdG8tb2Jqcy0kKENPTkZJR19JUF9WU19QUk9UT19VRFApICs9IGlwX3ZzX3Byb3RvX3VkcC5vCitpcF92c19wcm90by1vYmpzLSQoQ09ORklHX0lQX1ZTX1BST1RPX0FIX0VTUCkgKz0gaXBfdnNfcHJvdG9fYWhfZXNwLm8KKworaXBfdnMtb2JqcyA6PQlpcF92c19jb25uLm8gaXBfdnNfY29yZS5vIGlwX3ZzX2N0bC5vIGlwX3ZzX3NjaGVkLm8JICAgXAorCQlpcF92c194bWl0Lm8gaXBfdnNfYXBwLm8gaXBfdnNfc3luYy5vCSAgIAkJICAgXAorCQlpcF92c19lc3QubyBpcF92c19wcm90by5vIAkJCQkgICBcCisJCSQoaXBfdnNfcHJvdG8tb2Jqcy15KQorCisKKyMgSVBWUyBjb3JlCitvYmotJChDT05GSUdfSVBfVlMpICs9IGlwX3ZzLm8KKworIyBJUFZTIHNjaGVkdWxlcnMKK29iai0kKENPTkZJR19JUF9WU19SUikgKz0gaXBfdnNfcnIubworb2JqLSQoQ09ORklHX0lQX1ZTX1dSUikgKz0gaXBfdnNfd3JyLm8KK29iai0kKENPTkZJR19JUF9WU19MQykgKz0gaXBfdnNfbGMubworb2JqLSQoQ09ORklHX0lQX1ZTX1dMQykgKz0gaXBfdnNfd2xjLm8KK29iai0kKENPTkZJR19JUF9WU19MQkxDKSArPSBpcF92c19sYmxjLm8KK29iai0kKENPTkZJR19JUF9WU19MQkxDUikgKz0gaXBfdnNfbGJsY3Iubworb2JqLSQoQ09ORklHX0lQX1ZTX0RIKSArPSBpcF92c19kaC5vCitvYmotJChDT05GSUdfSVBfVlNfU0gpICs9IGlwX3ZzX3NoLm8KK29iai0kKENPTkZJR19JUF9WU19TRUQpICs9IGlwX3ZzX3NlZC5vCitvYmotJChDT05GSUdfSVBfVlNfTlEpICs9IGlwX3ZzX25xLm8KKworIyBJUFZTIGFwcGxpY2F0aW9uIGhlbHBlcnMKK29iai0kKENPTkZJR19JUF9WU19GVFApICs9IGlwX3ZzX2Z0cC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2FwcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfYXBwLmMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjQzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCkBAIC0wLDAgKzEsMTExMCBAQAorLyoKKyAqIElQVlMgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTElOVVggb3BlcmF0aW5nIHN5c3RlbS4gIElQVlMgaXMgbm93IGltcGxlbWVudGVkIGFzIGEgbW9kdWxlCisgKiAgICAgICAgICAgICAgb3ZlciB0aGUgTmV0ZmlsdGVyIGZyYW1ld29yay4gSVBWUyBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisgKiAgICAgICAgICAgICAgaGlnaC1wZXJmb3JtYW5jZSBhbmQgaGlnaGx5IGF2YWlsYWJsZSBzZXJ2ZXIgYmFzZWQgb24gYQorICogICAgICAgICAgICAgIGNsdXN0ZXIgb2Ygc2VydmVycy4KKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgSVBWUyBjb2RlIGZvciBrZXJuZWwgMi4yIHdhcyBkb25lIGJ5IFdlbnNvbmcgWmhhbmcgYW5kIFBldGVyIEtlc2UsCisgKiB3aXRoIGNoYW5nZXMvZml4ZXMgZnJvbSBKdWxpYW4gQW5hc3Rhc292LCBMYXJzIE1hcm93c2t5LUJyZWUsIEhvcm1zCisgKiBhbmQgb3RoZXJzLiBNYW55IGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tIElQIE1BU1EgY29kZSBvZiBrZXJuZWwgMi4yLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CQkvKiBmb3IgcHJvY19uZXRfKiAqLworI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworLyoKKyAqICBDb25uZWN0aW9uIGhhc2ggdGFibGU6IGZvciBpbnB1dCBhbmQgb3V0cHV0IHBhY2tldHMgbG9va3VwcyBvZiBJUFZTCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICppcF92c19jb25uX3RhYjsKKworLyogIFNMQUIgY2FjaGUgZm9yIElQVlMgY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXBfdnNfY29ubl9jYWNoZXAgX19yZWFkX21vc3RseTsKKworLyogIGNvdW50ZXIgZm9yIGN1cnJlbnQgSVBWUyBjb25uZWN0aW9ucyAqLworc3RhdGljIGF0b21pY190IGlwX3ZzX2Nvbm5fY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyogIGNvdW50ZXIgZm9yIG5vIGNsaWVudCBwb3J0IGNvbm5lY3Rpb25zICovCitzdGF0aWMgYXRvbWljX3QgaXBfdnNfY29ubl9ub19jcG9ydF9jbnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyogcmFuZG9tIHZhbHVlIGZvciBJUFZTIGNvbm5lY3Rpb24gaGFzaCAqLworc3RhdGljIHVuc2lnbmVkIGludCBpcF92c19jb25uX3JuZDsKKworLyoKKyAqICBGaW5lIGxvY2tpbmcgZ3JhbnVsYXJpdHkgZm9yIGJpZyBjb25uZWN0aW9uIGhhc2ggdGFibGUKKyAqLworI2RlZmluZSBDVF9MT0NLQVJSQVlfQklUUyAgNAorI2RlZmluZSBDVF9MT0NLQVJSQVlfU0laRSAgKDE8PENUX0xPQ0tBUlJBWV9CSVRTKQorI2RlZmluZSBDVF9MT0NLQVJSQVlfTUFTSyAgKENUX0xPQ0tBUlJBWV9TSVpFLTEpCisKK3N0cnVjdCBpcF92c19hbGlnbmVkX2xvY2sKK3sKKwlyd2xvY2tfdAlsOworfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhTTVBfQ0FDSEVfQllURVMpKSk7CisKKy8qIGxvY2sgYXJyYXkgZm9yIGNvbm4gdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfYWxpZ25lZF9sb2NrCitfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtDVF9MT0NLQVJSQVlfU0laRV0gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RhdGljIGlubGluZSB2b2lkIGN0X3JlYWRfbG9jayh1bnNpZ25lZCBrZXkpCit7CisJcmVhZF9sb2NrKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3RfcmVhZF91bmxvY2sodW5zaWduZWQga2V5KQoreworCXJlYWRfdW5sb2NrKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3Rfd3JpdGVfbG9jayh1bnNpZ25lZCBrZXkpCit7CisJd3JpdGVfbG9jaygmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlba2V5JkNUX0xPQ0tBUlJBWV9NQVNLXS5sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGN0X3dyaXRlX3VubG9jayh1bnNpZ25lZCBrZXkpCit7CisJd3JpdGVfdW5sb2NrKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3RfcmVhZF9sb2NrX2JoKHVuc2lnbmVkIGtleSkKK3sKKwlyZWFkX2xvY2tfYmgoJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2tleSZDVF9MT0NLQVJSQVlfTUFTS10ubCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdF9yZWFkX3VubG9ja19iaCh1bnNpZ25lZCBrZXkpCit7CisJcmVhZF91bmxvY2tfYmgoJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2tleSZDVF9MT0NLQVJSQVlfTUFTS10ubCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdF93cml0ZV9sb2NrX2JoKHVuc2lnbmVkIGtleSkKK3sKKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX2Nvbm50YmxfbG9ja19hcnJheVtrZXkmQ1RfTE9DS0FSUkFZX01BU0tdLmwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3Rfd3JpdGVfdW5sb2NrX2JoKHVuc2lnbmVkIGtleSkKK3sKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfY29ubnRibF9sb2NrX2FycmF5W2tleSZDVF9MT0NLQVJSQVlfTUFTS10ubCk7Cit9CisKKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgSVBWUyBjb25uZWN0aW9uIGVudHJ5CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfdnNfY29ubl9oYXNoa2V5KGludCBhZiwgdW5zaWduZWQgcHJvdG8sCisJCQkJICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYWRkciwKKwkJCQkgICAgICAgX19iZTE2IHBvcnQpCit7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCXJldHVybiBqaGFzaF8zd29yZHMoamhhc2goYWRkciwgMTYsIGlwX3ZzX2Nvbm5fcm5kKSwKKwkJCQkgICAgKF9fZm9yY2UgdTMyKXBvcnQsIHByb3RvLCBpcF92c19jb25uX3JuZCkKKwkJCSYgSVBfVlNfQ09OTl9UQUJfTUFTSzsKKyNlbmRpZgorCXJldHVybiBqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKWFkZHItPmlwLCAoX19mb3JjZSB1MzIpcG9ydCwgcHJvdG8sCisJCQkgICAgaXBfdnNfY29ubl9ybmQpCisJCSYgSVBfVlNfQ09OTl9UQUJfTUFTSzsKK30KKworCisvKgorICoJSGFzaGVzIGlwX3ZzX2Nvbm4gaW4gaXBfdnNfY29ubl90YWIgYnkgcHJvdG8sYWRkcixwb3J0LgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlwX3ZzX2Nvbm5faGFzaChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJdW5zaWduZWQgaGFzaDsKKwlpbnQgcmV0OworCisJLyogSGFzaCBieSBwcm90b2NvbCwgY2xpZW50IGFkZHJlc3MgYW5kIHBvcnQgKi8KKwloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KGNwLT5hZiwgY3AtPnByb3RvY29sLCAmY3AtPmNhZGRyLCBjcC0+Y3BvcnQpOworCisJY3Rfd3JpdGVfbG9jayhoYXNoKTsKKworCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9IQVNIRUQpKSB7CisJCWxpc3RfYWRkKCZjcC0+Y19saXN0LCAmaXBfdnNfY29ubl90YWJbaGFzaF0pOworCQljcC0+ZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX0hBU0hFRDsKKwkJYXRvbWljX2luYygmY3AtPnJlZmNudCk7CisJCXJldCA9IDE7CisJfSBlbHNlIHsKKwkJSVBfVlNfRVJSKCJpcF92c19jb25uX2hhc2goKTogcmVxdWVzdCBmb3IgYWxyZWFkeSBoYXNoZWQsICIKKwkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXQgPSAwOworCX0KKworCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqCVVOaGFzaGVzIGlwX3ZzX2Nvbm4gZnJvbSBpcF92c19jb25uX3RhYi4KKyAqCXJldHVybnMgYm9vbCBzdWNjZXNzLgorICovCitzdGF0aWMgaW5saW5lIGludCBpcF92c19jb25uX3VuaGFzaChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJdW5zaWduZWQgaGFzaDsKKwlpbnQgcmV0OworCisJLyogdW5oYXNoIGl0IGFuZCBkZWNyZWFzZSBpdHMgcmVmZXJlbmNlIGNvdW50ZXIgKi8KKwloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KGNwLT5hZiwgY3AtPnByb3RvY29sLCAmY3AtPmNhZGRyLCBjcC0+Y3BvcnQpOworCisJY3Rfd3JpdGVfbG9jayhoYXNoKTsKKworCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSEFTSEVEKSB7CisJCWxpc3RfZGVsKCZjcC0+Y19saXN0KTsKKwkJY3AtPmZsYWdzICY9IH5JUF9WU19DT05OX0ZfSEFTSEVEOworCQlhdG9taWNfZGVjKCZjcC0+cmVmY250KTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqICBHZXRzIGlwX3ZzX2Nvbm4gYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiLgorICogIENhbGxlZCBmb3IgcGt0cyBjb21pbmcgZnJvbSBPVVRzaWRlLXRvLUlOc2lkZS4KKyAqCXNfYWRkciwgc19wb3J0OiBwa3Qgc291cmNlIGFkZHJlc3MgKGZvcmVpZ24gaG9zdCkKKyAqCWRfYWRkciwgZF9wb3J0OiBwa3QgZGVzdCBhZGRyZXNzIChsb2FkIGJhbGFuY2VyKQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19jb25uICpfX2lwX3ZzX2Nvbm5faW5fZ2V0CisoaW50IGFmLCBpbnQgcHJvdG9jb2wsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqc19hZGRyLCBfX2JlMTYgc19wb3J0LAorIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZF9hZGRyLCBfX2JlMTYgZF9wb3J0KQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShhZiwgcHJvdG9jb2wsIHNfYWRkciwgc19wb3J0KTsKKworCWN0X3JlYWRfbG9jayhoYXNoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltoYXNoXSwgY19saXN0KSB7CisJCWlmIChjcC0+YWYgPT0gYWYgJiYKKwkJICAgIGlwX3ZzX2FkZHJfZXF1YWwoYWYsIHNfYWRkciwgJmNwLT5jYWRkcikgJiYKKwkJICAgIGlwX3ZzX2FkZHJfZXF1YWwoYWYsIGRfYWRkciwgJmNwLT52YWRkcikgJiYKKwkJICAgIHNfcG9ydCA9PSBjcC0+Y3BvcnQgJiYgZF9wb3J0ID09IGNwLT52cG9ydCAmJgorCQkgICAgKCghc19wb3J0KSBeICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpKSAmJgorCQkgICAgcHJvdG9jb2wgPT0gY3AtPnByb3RvY29sKSB7CisJCQkvKiBISVQgKi8KKwkJCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOworCQkJY3RfcmVhZF91bmxvY2soaGFzaCk7CisJCQlyZXR1cm4gY3A7CisJCX0KKwl9CisKKwljdF9yZWFkX3VubG9jayhoYXNoKTsKKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaXBfdnNfY29ubiAqaXBfdnNfY29ubl9pbl9nZXQKKyhpbnQgYWYsIGludCBwcm90b2NvbCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpzX2FkZHIsIF9fYmUxNiBzX3BvcnQsCisgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkX2FkZHIsIF9fYmUxNiBkX3BvcnQpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJY3AgPSBfX2lwX3ZzX2Nvbm5faW5fZ2V0KGFmLCBwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQsIGRfYWRkciwgZF9wb3J0KTsKKwlpZiAoIWNwICYmIGF0b21pY19yZWFkKCZpcF92c19jb25uX25vX2Nwb3J0X2NudCkpCisJCWNwID0gX19pcF92c19jb25uX2luX2dldChhZiwgcHJvdG9jb2wsIHNfYWRkciwgMCwgZF9hZGRyLAorCQkJCQkgZF9wb3J0KTsKKworCUlQX1ZTX0RCR19CVUYoOSwgImxvb2t1cC9pbiAlcyAlczolZC0+JXM6JWQgJXNcbiIsCisJCSAgICAgIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihhZiwgc19hZGRyKSwgbnRvaHMoc19wb3J0KSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoYWYsIGRfYWRkciksIG50b2hzKGRfcG9ydCksCisJCSAgICAgIGNwID8gImhpdCIgOiAibm90IGhpdCIpOworCisJcmV0dXJuIGNwOworfQorCisvKiBHZXQgcmVmZXJlbmNlIHRvIGNvbm5lY3Rpb24gdGVtcGxhdGUgKi8KK3N0cnVjdCBpcF92c19jb25uICppcF92c19jdF9pbl9nZXQKKyhpbnQgYWYsIGludCBwcm90b2NvbCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpzX2FkZHIsIF9fYmUxNiBzX3BvcnQsCisgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkX2FkZHIsIF9fYmUxNiBkX3BvcnQpCit7CisJdW5zaWduZWQgaGFzaDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisKKwloYXNoID0gaXBfdnNfY29ubl9oYXNoa2V5KGFmLCBwcm90b2NvbCwgc19hZGRyLCBzX3BvcnQpOworCisJY3RfcmVhZF9sb2NrKGhhc2gpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2hhc2hdLCBjX2xpc3QpIHsKKwkJaWYgKGNwLT5hZiA9PSBhZiAmJgorCQkgICAgaXBfdnNfYWRkcl9lcXVhbChhZiwgc19hZGRyLCAmY3AtPmNhZGRyKSAmJgorCQkgICAgaXBfdnNfYWRkcl9lcXVhbChhZiwgZF9hZGRyLCAmY3AtPnZhZGRyKSAmJgorCQkgICAgc19wb3J0ID09IGNwLT5jcG9ydCAmJiBkX3BvcnQgPT0gY3AtPnZwb3J0ICYmCisJCSAgICBjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUgJiYKKwkJICAgIHByb3RvY29sID09IGNwLT5wcm90b2NvbCkgeworCQkJLyogSElUICovCisJCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWNwID0gTlVMTDsKKworICBvdXQ6CisJY3RfcmVhZF91bmxvY2soaGFzaCk7CisKKwlJUF9WU19EQkdfQlVGKDksICJ0ZW1wbGF0ZSBsb29rdXAvaW4gJXMgJXM6JWQtPiVzOiVkICVzXG4iLAorCQkgICAgICBpcF92c19wcm90b19uYW1lKHByb3RvY29sKSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoYWYsIHNfYWRkciksIG50b2hzKHNfcG9ydCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGFmLCBkX2FkZHIpLCBudG9ocyhkX3BvcnQpLAorCQkgICAgICBjcCA/ICJoaXQiIDogIm5vdCBoaXQiKTsKKworCXJldHVybiBjcDsKK30KKworLyoKKyAqICBHZXRzIGlwX3ZzX2Nvbm4gYXNzb2NpYXRlZCB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiLgorICogIENhbGxlZCBmb3IgcGt0cyBjb21pbmcgZnJvbSBpbnNpZGUtdG8tT1VUc2lkZS4KKyAqCXNfYWRkciwgc19wb3J0OiBwa3Qgc291cmNlIGFkZHJlc3MgKGluc2lkZSBob3N0KQorICoJZF9hZGRyLCBkX3BvcnQ6IHBrdCBkZXN0IGFkZHJlc3MgKGZvcmVpZ24gaG9zdCkKKyAqLworc3RydWN0IGlwX3ZzX2Nvbm4gKmlwX3ZzX2Nvbm5fb3V0X2dldAorKGludCBhZiwgaW50IHByb3RvY29sLCBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnNfYWRkciwgX19iZTE2IHNfcG9ydCwKKyBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRfYWRkciwgX19iZTE2IGRfcG9ydCkKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19jb25uICpjcCwgKnJldD1OVUxMOworCisJLyoKKwkgKglDaGVjayBmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCisJICovCisJaGFzaCA9IGlwX3ZzX2Nvbm5faGFzaGtleShhZiwgcHJvdG9jb2wsIGRfYWRkciwgZF9wb3J0KTsKKworCWN0X3JlYWRfbG9jayhoYXNoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltoYXNoXSwgY19saXN0KSB7CisJCWlmIChjcC0+YWYgPT0gYWYgJiYKKwkJICAgIGlwX3ZzX2FkZHJfZXF1YWwoYWYsIGRfYWRkciwgJmNwLT5jYWRkcikgJiYKKwkJICAgIGlwX3ZzX2FkZHJfZXF1YWwoYWYsIHNfYWRkciwgJmNwLT5kYWRkcikgJiYKKwkJICAgIGRfcG9ydCA9PSBjcC0+Y3BvcnQgJiYgc19wb3J0ID09IGNwLT5kcG9ydCAmJgorCQkgICAgcHJvdG9jb2wgPT0gY3AtPnByb3RvY29sKSB7CisJCQkvKiBISVQgKi8KKwkJCWF0b21pY19pbmMoJmNwLT5yZWZjbnQpOworCQkJcmV0ID0gY3A7CisJCQlicmVhazsKKwkJfQorCX0KKworCWN0X3JlYWRfdW5sb2NrKGhhc2gpOworCisJSVBfVlNfREJHX0JVRig5LCAibG9va3VwL291dCAlcyAlczolZC0+JXM6JWQgJXNcbiIsCisJCSAgICAgIGlwX3ZzX3Byb3RvX25hbWUocHJvdG9jb2wpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihhZiwgc19hZGRyKSwgbnRvaHMoc19wb3J0KSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoYWYsIGRfYWRkciksIG50b2hzKGRfcG9ydCksCisJCSAgICAgIHJldCA/ICJoaXQiIDogIm5vdCBoaXQiKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqICAgICAgUHV0IGJhY2sgdGhlIGNvbm4gYW5kIHJlc3RhcnQgaXRzIHRpbWVyIHdpdGggaXRzIHRpbWVvdXQKKyAqLwordm9pZCBpcF92c19jb25uX3B1dChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJLyogcmVzZXQgaXQgZXhwaXJlIGluIGl0cyB0aW1lb3V0ICovCisJbW9kX3RpbWVyKCZjcC0+dGltZXIsIGppZmZpZXMrY3AtPnRpbWVvdXQpOworCisJX19pcF92c19jb25uX3B1dChjcCk7Cit9CisKKworLyoKKyAqCUZpbGwgYSBub19jbGllbnRfcG9ydCBjb25uZWN0aW9uIHdpdGggYSBjbGllbnQgcG9ydCBudW1iZXIKKyAqLwordm9pZCBpcF92c19jb25uX2ZpbGxfY3BvcnQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBfX2JlMTYgY3BvcnQpCit7CisJaWYgKGlwX3ZzX2Nvbm5fdW5oYXNoKGNwKSkgeworCQlzcGluX2xvY2soJmNwLT5sb2NrKTsKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkgeworCQkJYXRvbWljX2RlYygmaXBfdnNfY29ubl9ub19jcG9ydF9jbnQpOworCQkJY3AtPmZsYWdzICY9IH5JUF9WU19DT05OX0ZfTk9fQ1BPUlQ7CisJCQljcC0+Y3BvcnQgPSBjcG9ydDsKKwkJfQorCQlzcGluX3VubG9jaygmY3AtPmxvY2spOworCisJCS8qIGhhc2ggb24gbmV3IGRwb3J0ICovCisJCWlwX3ZzX2Nvbm5faGFzaChjcCk7CisJfQorfQorCisKKy8qCisgKglCaW5kIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2tldF94bWl0LgorICoJQ2FsbGVkIGJ5IGlwX3ZzX2Nvbm5fbmV3LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfYmluZF94bWl0KHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzd2l0Y2ggKElQX1ZTX0ZXRF9NRVRIT0QoY3ApKSB7CisJY2FzZSBJUF9WU19DT05OX0ZfTUFTUToKKwkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfbmF0X3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfVFVOTkVMOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c190dW5uZWxfeG1pdDsKKwkJYnJlYWs7CisKKwljYXNlIElQX1ZTX0NPTk5fRl9EUk9VVEU6CisJCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX2RyX3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfTE9DQUxOT0RFOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19udWxsX3htaXQ7CisJCWJyZWFrOworCisJY2FzZSBJUF9WU19DT05OX0ZfQllQQVNTOgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19ieXBhc3NfeG1pdDsKKwkJYnJlYWs7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19iaW5kX3htaXRfdjYoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXN3aXRjaCAoSVBfVlNfRldEX01FVEhPRChjcCkpIHsKKwljYXNlIElQX1ZTX0NPTk5fRl9NQVNROgorCQljcC0+cGFja2V0X3htaXQgPSBpcF92c19uYXRfeG1pdF92NjsKKwkJYnJlYWs7CisKKwljYXNlIElQX1ZTX0NPTk5fRl9UVU5ORUw6CisJCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX3R1bm5lbF94bWl0X3Y2OworCQlicmVhazsKKworCWNhc2UgSVBfVlNfQ09OTl9GX0RST1VURToKKwkJY3AtPnBhY2tldF94bWl0ID0gaXBfdnNfZHJfeG1pdF92NjsKKwkJYnJlYWs7CisKKwljYXNlIElQX1ZTX0NPTk5fRl9MT0NBTE5PREU6CisJCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX251bGxfeG1pdDsKKwkJYnJlYWs7CisKKwljYXNlIElQX1ZTX0NPTk5fRl9CWVBBU1M6CisJCWNwLT5wYWNrZXRfeG1pdCA9IGlwX3ZzX2J5cGFzc194bWl0X3Y2OworCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW5saW5lIGludCBpcF92c19kZXN0X3RvdGFsY29ubnMoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykKKwkJKyBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7Cit9CisKKy8qCisgKglCaW5kIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIGEgdmlydHVhbCBzZXJ2aWNlIGRlc3RpbmF0aW9uCisgKglDYWxsZWQganVzdCBhZnRlciBhIG5ldyBjb25uZWN0aW9uIGVudHJ5IGlzIGNyZWF0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXBfdnNfYmluZF9kZXN0KHN0cnVjdCBpcF92c19jb25uICpjcCwgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyogaWYgZGVzdCBpcyBOVUxMLCB0aGVuIHJldHVybiBkaXJlY3RseSAqLworCWlmICghZGVzdCkKKwkJcmV0dXJuOworCisJLyogSW5jcmVhc2UgdGhlIHJlZmNudCBjb3VudGVyIG9mIHRoZSBkZXN0ICovCisJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKKworCS8qIEJpbmQgd2l0aCB0aGUgZGVzdGluYXRpb24gYW5kIGl0cyBjb3JyZXNwb25kaW5nIHRyYW5zbWl0dGVyICovCisJaWYgKChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU1lOQykgJiYKKwkgICAgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSkpCisJCS8qIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCB0ZW1wbGF0ZSBhbmQgaXMgY3JlYXRlZAorCQkgKiBieSBzeW5jLCBwcmVzZXJ2ZSB0aGUgYWN0aXZpdHkgZmxhZy4KKwkJICovCisJCWNwLT5mbGFncyB8PSBhdG9taWNfcmVhZCgmZGVzdC0+Y29ubl9mbGFncykgJgorCQkJICAgICAofklQX1ZTX0NPTk5fRl9JTkFDVElWRSk7CisJZWxzZQorCQljcC0+ZmxhZ3MgfD0gYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpOworCWNwLT5kZXN0ID0gZGVzdDsKKworCUlQX1ZTX0RCR19CVUYoNywgIkJpbmQtZGVzdCAlcyBjOiVzOiVkIHY6JXM6JWQgIgorCQkgICAgICAiZDolczolZCBmd2Q6JWMgczoldSBjb25uLT5mbGFnczolWCBjb25uLT5yZWZjbnQ6JWQgIgorCQkgICAgICAiZGVzdC0+cmVmY250OiVkXG4iLAorCQkgICAgICBpcF92c19wcm90b19uYW1lKGNwLT5wcm90b2NvbCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT5jYWRkciksIG50b2hzKGNwLT5jcG9ydCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT5kYWRkciksIG50b2hzKGNwLT5kcG9ydCksCisJCSAgICAgIGlwX3ZzX2Z3ZF90YWcoY3ApLCBjcC0+c3RhdGUsCisJCSAgICAgIGNwLT5mbGFncywgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpLAorCQkgICAgICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSk7CisKKwkvKiBVcGRhdGUgdGhlIGNvbm5lY3Rpb24gY291bnRlcnMgKi8KKwlpZiAoIShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKSB7CisJCS8qIEl0IGlzIGEgbm9ybWFsIGNvbm5lY3Rpb24sIHNvIGluY3JlYXNlIHRoZSBpbmFjdGl2ZQorCQkgICBjb25uZWN0aW9uIGNvdW50ZXIgYmVjYXVzZSBpdCBpcyBpbiBUQ1AgU1lOUkVDVgorCQkgICBzdGF0ZSAoaW5hY3RpdmUpIG9yIG90aGVyIHByb3RvY29sIGluYWNpdmUgc3RhdGUgKi8KKwkJaWYgKChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU1lOQykgJiYKKwkJICAgICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkpKQorCQkJYXRvbWljX2luYygmZGVzdC0+YWN0aXZlY29ubnMpOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwl9IGVsc2UgeworCQkvKiBJdCBpcyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi90ZW1wbGF0ZSwgc28gaW5jcmVhc2UKKwkJICAgdGhlIHBlcmlzdGVudCBjb25uZWN0aW9uIGNvdW50ZXIgKi8KKwkJYXRvbWljX2luYygmZGVzdC0+cGVyc2lzdGNvbm5zKTsKKwl9CisKKwlpZiAoZGVzdC0+dV90aHJlc2hvbGQgIT0gMCAmJgorCSAgICBpcF92c19kZXN0X3RvdGFsY29ubnMoZGVzdCkgPj0gZGVzdC0+dV90aHJlc2hvbGQpCisJCWRlc3QtPmZsYWdzIHw9IElQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKK30KKworCisvKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb24sIGlmIHNvCisgKiBiaW5kIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAqLworc3RydWN0IGlwX3ZzX2Rlc3QgKmlwX3ZzX3RyeV9iaW5kX2Rlc3Qoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCisJaWYgKChjcCkgJiYgKCFjcC0+ZGVzdCkpIHsKKwkJZGVzdCA9IGlwX3ZzX2ZpbmRfZGVzdChjcC0+YWYsICZjcC0+ZGFkZHIsIGNwLT5kcG9ydCwKKwkJCQkgICAgICAgJmNwLT52YWRkciwgY3AtPnZwb3J0LAorCQkJCSAgICAgICBjcC0+cHJvdG9jb2wpOworCQlpcF92c19iaW5kX2Rlc3QoY3AsIGRlc3QpOworCQlyZXR1cm4gZGVzdDsKKwl9IGVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqCVVuYmluZCBhIGNvbm5lY3Rpb24gZW50cnkgd2l0aCBpdHMgVlMgZGVzdGluYXRpb24KKyAqCUNhbGxlZCBieSB0aGUgaXBfdnNfY29ubl9leHBpcmUgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c191bmJpbmRfZGVzdChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKworCWlmICghZGVzdCkKKwkJcmV0dXJuOworCisJSVBfVlNfREJHX0JVRig3LCAiVW5iaW5kLWRlc3QgJXMgYzolczolZCB2OiVzOiVkICIKKwkJICAgICAgImQ6JXM6JWQgZndkOiVjIHM6JXUgY29ubi0+ZmxhZ3M6JVggY29ubi0+cmVmY250OiVkICIKKwkJICAgICAgImRlc3QtPnJlZmNudDolZFxuIiwKKwkJICAgICAgaXBfdnNfcHJvdG9fbmFtZShjcC0+cHJvdG9jb2wpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+Y2FkZHIpLCBudG9ocyhjcC0+Y3BvcnQpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+dmFkZHIpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+ZGFkZHIpLCBudG9ocyhjcC0+ZHBvcnQpLAorCQkgICAgICBpcF92c19md2RfdGFnKGNwKSwgY3AtPnN0YXRlLAorCQkgICAgICBjcC0+ZmxhZ3MsIGF0b21pY19yZWFkKCZjcC0+cmVmY250KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCkpOworCisJLyogVXBkYXRlIHRoZSBjb25uZWN0aW9uIGNvdW50ZXJzICovCisJaWYgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSkgeworCQkvKiBJdCBpcyBhIG5vcm1hbCBjb25uZWN0aW9uLCBzbyBkZWNyZWFzZSB0aGUgaW5hY3Rjb25ucworCQkgICBvciBhY3RpdmVjb25ucyBjb3VudGVyICovCisJCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfSU5BQ1RJVkUpIHsKKwkJCWF0b21pY19kZWMoJmRlc3QtPmluYWN0Y29ubnMpOworCQl9IGVsc2UgeworCQkJYXRvbWljX2RlYygmZGVzdC0+YWN0aXZlY29ubnMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSXQgaXMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24vdGVtcGxhdGUsIHNvIGRlY3JlYXNlCisJCSAgIHRoZSBwZXJpc3RlbnQgY29ubmVjdGlvbiBjb3VudGVyICovCisJCWF0b21pY19kZWMoJmRlc3QtPnBlcnNpc3Rjb25ucyk7CisJfQorCisJaWYgKGRlc3QtPmxfdGhyZXNob2xkICE9IDApIHsKKwkJaWYgKGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhkZXN0KSA8IGRlc3QtPmxfdGhyZXNob2xkKQorCQkJZGVzdC0+ZmxhZ3MgJj0gfklQX1ZTX0RFU1RfRl9PVkVSTE9BRDsKKwl9IGVsc2UgaWYgKGRlc3QtPnVfdGhyZXNob2xkICE9IDApIHsKKwkJaWYgKGlwX3ZzX2Rlc3RfdG90YWxjb25ucyhkZXN0KSAqIDQgPCBkZXN0LT51X3RocmVzaG9sZCAqIDMpCisJCQlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX09WRVJMT0FEOworCX0gZWxzZSB7CisJCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKKwkJCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7CisJfQorCisJLyoKKwkgKiBTaW1wbHkgZGVjcmVhc2UgdGhlIHJlZmNudCBvZiB0aGUgZGVzdCwgYmVjYXVzZSB0aGUKKwkgKiBkZXN0IHdpbGwgYmUgZWl0aGVyIGluIHNlcnZpY2UncyBkZXN0aW5hdGlvbiBsaXN0CisJICogb3IgaW4gdGhlIHRyYXNoLgorCSAqLworCWF0b21pY19kZWMoJmRlc3QtPnJlZmNudCk7Cit9CisKKworLyoKKyAqCUNoZWNraW5nIGlmIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbm5lY3Rpb24gdGVtcGxhdGUgaXMgYXZhaWxhYmxlLgorICoJSWYgYXZhaWxhYmxlLCByZXR1cm4gMSwgb3RoZXJ3aXNlIGludmFsaWRhdGUgdGhpcyBjb25uZWN0aW9uCisgKgl0ZW1wbGF0ZSBhbmQgcmV0dXJuIDAuCisgKi8KK2ludCBpcF92c19jaGVja190ZW1wbGF0ZShzdHJ1Y3QgaXBfdnNfY29ubiAqY3QpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjdC0+ZGVzdDsKKworCS8qCisJICogQ2hlY2tpbmcgdGhlIGRlc3Qgc2VydmVyIHN0YXR1cy4KKwkgKi8KKwlpZiAoKGRlc3QgPT0gTlVMTCkgfHwKKwkgICAgIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpIHx8CisJICAgIChzeXNjdGxfaXBfdnNfZXhwaXJlX3F1aWVzY2VudF90ZW1wbGF0ZSAmJgorCSAgICAgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApKSkgeworCQlJUF9WU19EQkdfQlVGKDksICJjaGVja190ZW1wbGF0ZTogZGVzdCBub3QgYXZhaWxhYmxlIGZvciAiCisJCQkgICAgICAicHJvdG9jb2wgJXMgczolczolZCB2OiVzOiVkICIKKwkJCSAgICAgICItPiBkOiVzOiVkXG4iLAorCQkJICAgICAgaXBfdnNfcHJvdG9fbmFtZShjdC0+cHJvdG9jb2wpLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3QtPmFmLCAmY3QtPmNhZGRyKSwKKwkJCSAgICAgIG50b2hzKGN0LT5jcG9ydCksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihjdC0+YWYsICZjdC0+dmFkZHIpLAorCQkJICAgICAgbnRvaHMoY3QtPnZwb3J0KSwKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKGN0LT5hZiwgJmN0LT5kYWRkciksCisJCQkgICAgICBudG9ocyhjdC0+ZHBvcnQpKTsKKworCQkvKgorCQkgKiBJbnZhbGlkYXRlIHRoZSBjb25uZWN0aW9uIHRlbXBsYXRlCisJCSAqLworCQlpZiAoY3QtPnZwb3J0ICE9IGh0b25zKDB4ZmZmZikpIHsKKwkJCWlmIChpcF92c19jb25uX3VuaGFzaChjdCkpIHsKKwkJCQljdC0+ZHBvcnQgPSBodG9ucygweGZmZmYpOworCQkJCWN0LT52cG9ydCA9IGh0b25zKDB4ZmZmZik7CisJCQkJY3QtPmNwb3J0ID0gMDsKKwkJCQlpcF92c19jb25uX2hhc2goY3QpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogU2ltcGx5IGRlY3JlYXNlIHRoZSByZWZjbnQgb2YgdGhlIHRlbXBsYXRlLAorCQkgKiBkb24ndCByZXN0YXJ0IGl0cyB0aW1lci4KKwkJICovCisJCWF0b21pY19kZWMoJmN0LT5yZWZjbnQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGlwX3ZzX2Nvbm5fZXhwaXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSAoc3RydWN0IGlwX3ZzX2Nvbm4gKilkYXRhOworCisJY3AtPnRpbWVvdXQgPSA2MCpIWjsKKworCS8qCisJICoJaGV5LCBJJ20gdXNpbmcgaXQKKwkgKi8KKwlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKKworCS8qCisJICoJZG8gSSBjb250cm9sIGFueWJvZHk/CisJICovCisJaWYgKGF0b21pY19yZWFkKCZjcC0+bl9jb250cm9sKSkKKwkJZ290byBleHBpcmVfbGF0ZXI7CisKKwkvKgorCSAqCXVuaGFzaCBpdCBpZiBpdCBpcyBoYXNoZWQgaW4gdGhlIGNvbm4gdGFibGUKKwkgKi8KKwlpZiAoIWlwX3ZzX2Nvbm5fdW5oYXNoKGNwKSkKKwkJZ290byBleHBpcmVfbGF0ZXI7CisKKwkvKgorCSAqCXJlZmNudD09MSBpbXBsaWVzIEknbSB0aGUgb25seSBvbmUgcmVmZXJyZXIKKwkgKi8KKwlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZjcC0+cmVmY250KSA9PSAxKSkgeworCQkvKiBkZWxldGUgdGhlIHRpbWVyIGlmIGl0IGlzIGFjdGl2YXRlZCBieSBvdGhlciB1c2VycyAqLworCQlpZiAodGltZXJfcGVuZGluZygmY3AtPnRpbWVyKSkKKwkJCWRlbF90aW1lcigmY3AtPnRpbWVyKTsKKworCQkvKiBkb2VzIGFueWJvZHkgY29udHJvbCBtZT8gKi8KKwkJaWYgKGNwLT5jb250cm9sKQorCQkJaXBfdnNfY29udHJvbF9kZWwoY3ApOworCisJCWlmICh1bmxpa2VseShjcC0+YXBwICE9IE5VTEwpKQorCQkJaXBfdnNfdW5iaW5kX2FwcChjcCk7CisJCWlwX3ZzX3VuYmluZF9kZXN0KGNwKTsKKwkJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkKKwkJCWF0b21pY19kZWMoJmlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250KTsKKwkJYXRvbWljX2RlYygmaXBfdnNfY29ubl9jb3VudCk7CisKKwkJa21lbV9jYWNoZV9mcmVlKGlwX3ZzX2Nvbm5fY2FjaGVwLCBjcCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBoYXNoIGl0IGJhY2sgdG8gdGhlIHRhYmxlICovCisJaXBfdnNfY29ubl9oYXNoKGNwKTsKKworICBleHBpcmVfbGF0ZXI6CisJSVBfVlNfREJHKDcsICJkZWxheWVkOiBjb25uLT5yZWZjbnQtMT0lZCBjb25uLT5uX2NvbnRyb2w9JWRcbiIsCisJCSAgYXRvbWljX3JlYWQoJmNwLT5yZWZjbnQpLTEsCisJCSAgYXRvbWljX3JlYWQoJmNwLT5uX2NvbnRyb2wpKTsKKworCWlwX3ZzX2Nvbm5fcHV0KGNwKTsKK30KKworCit2b2lkIGlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJaWYgKGRlbF90aW1lcigmY3AtPnRpbWVyKSkKKwkJbW9kX3RpbWVyKCZjcC0+dGltZXIsIGppZmZpZXMpOworfQorCisKKy8qCisgKglDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBlbnRyeSBhbmQgaGFzaCBpdCBpbnRvIHRoZSBpcF92c19jb25uX3RhYgorICovCitzdHJ1Y3QgaXBfdnNfY29ubiAqCitpcF92c19jb25uX25ldyhpbnQgYWYsIGludCBwcm90bywgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpjYWRkciwgX19iZTE2IGNwb3J0LAorCSAgICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnZhZGRyLCBfX2JlMTYgdnBvcnQsCisJICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZGFkZHIsIF9fYmUxNiBkcG9ydCwgdW5zaWduZWQgZmxhZ3MsCisJICAgICAgIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwID0gaXBfdnNfcHJvdG9fZ2V0KHByb3RvKTsKKworCWNwID0ga21lbV9jYWNoZV96YWxsb2MoaXBfdnNfY29ubl9jYWNoZXAsIEdGUF9BVE9NSUMpOworCWlmIChjcCA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUl9STCgiaXBfdnNfY29ubl9uZXc6IG5vIG1lbW9yeSBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmNwLT5jX2xpc3QpOworCXNldHVwX3RpbWVyKCZjcC0+dGltZXIsIGlwX3ZzX2Nvbm5fZXhwaXJlLCAodW5zaWduZWQgbG9uZyljcCk7CisJY3AtPmFmCQkgICA9IGFmOworCWNwLT5wcm90b2NvbAkgICA9IHByb3RvOworCWlwX3ZzX2FkZHJfY29weShhZiwgJmNwLT5jYWRkciwgY2FkZHIpOworCWNwLT5jcG9ydAkgICA9IGNwb3J0OworCWlwX3ZzX2FkZHJfY29weShhZiwgJmNwLT52YWRkciwgdmFkZHIpOworCWNwLT52cG9ydAkgICA9IHZwb3J0OworCWlwX3ZzX2FkZHJfY29weShhZiwgJmNwLT5kYWRkciwgZGFkZHIpOworCWNwLT5kcG9ydCAgICAgICAgICA9IGRwb3J0OworCWNwLT5mbGFncwkgICA9IGZsYWdzOworCXNwaW5fbG9ja19pbml0KCZjcC0+bG9jayk7CisKKwkvKgorCSAqIFNldCB0aGUgZW50cnkgaXMgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgYmVmb3JlIGhhc2hpbmcKKwkgKiBpdCBpbiB0aGUgdGFibGUsIHNvIHRoYXQgb3RoZXIgdGhyZWFkIHJ1biBpcF92c19yYW5kb21fZHJvcGVudHJ5CisJICogYnV0IGNhbm5vdCBkcm9wIHRoaXMgZW50cnkuCisJICovCisJYXRvbWljX3NldCgmY3AtPnJlZmNudCwgMSk7CisKKwlhdG9taWNfc2V0KCZjcC0+bl9jb250cm9sLCAwKTsKKwlhdG9taWNfc2V0KCZjcC0+aW5fcGt0cywgMCk7CisKKwlhdG9taWNfaW5jKCZpcF92c19jb25uX2NvdW50KTsKKwlpZiAoZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpCisJCWF0b21pY19pbmMoJmlwX3ZzX2Nvbm5fbm9fY3BvcnRfY250KTsKKworCS8qIEJpbmQgdGhlIGNvbm5lY3Rpb24gd2l0aCBhIGRlc3RpbmF0aW9uIHNlcnZlciAqLworCWlwX3ZzX2JpbmRfZGVzdChjcCwgZGVzdCk7CisKKwkvKiBTZXQgaXRzIHN0YXRlIGFuZCB0aW1lb3V0ICovCisJY3AtPnN0YXRlID0gMDsKKwljcC0+dGltZW91dCA9IDMqSFo7CisKKwkvKiBCaW5kIGl0cyBwYWNrZXQgdHJhbnNtaXR0ZXIgKi8KKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJaXBfdnNfYmluZF94bWl0X3Y2KGNwKTsKKwllbHNlCisjZW5kaWYKKwkJaXBfdnNfYmluZF94bWl0KGNwKTsKKworCWlmICh1bmxpa2VseShwcCAmJiBhdG9taWNfcmVhZCgmcHAtPmFwcGNudCkpKQorCQlpcF92c19iaW5kX2FwcChjcCwgcHApOworCisJLyogSGFzaCBpdCBpbiB0aGUgaXBfdnNfY29ubl90YWIgZmluYWxseSAqLworCWlwX3ZzX2Nvbm5faGFzaChjcCk7CisKKwlyZXR1cm4gY3A7Cit9CisKKworLyoKKyAqCS9wcm9jL25ldC9pcF92c19jb25uIGVudHJpZXMKKyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyB2b2lkICppcF92c19jb25uX2FycmF5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCWludCBpZHg7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJZm9yKGlkeCA9IDA7IGlkeCA8IElQX1ZTX0NPTk5fVEFCX1NJWkU7IGlkeCsrKSB7CisJCWN0X3JlYWRfbG9ja19iaChpZHgpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaWR4XSwgY19saXN0KSB7CisJCQlpZiAocG9zLS0gPT0gMCkgeworCQkJCXNlcS0+cHJpdmF0ZSA9ICZpcF92c19jb25uX3RhYltpZHhdOworCQkJCXJldHVybiBjcDsKKwkJCX0KKwkJfQorCQljdF9yZWFkX3VubG9ja19iaChpZHgpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqaXBfdnNfY29ubl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNlcS0+cHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuICpwb3MgPyBpcF92c19jb25uX2FycmF5KHNlcSwgKnBvcyAtIDEpIDpTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcF92c19jb25uX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSB2OworCXN0cnVjdCBsaXN0X2hlYWQgKmUsICpsID0gc2VxLT5wcml2YXRlOworCWludCBpZHg7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gaXBfdnNfY29ubl9hcnJheShzZXEsIDApOworCisJLyogbW9yZSBvbiBzYW1lIGhhc2ggY2hhaW4/ICovCisJaWYgKChlID0gY3AtPmNfbGlzdC5uZXh0KSAhPSBsKQorCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfY29ubiwgY19saXN0KTsKKworCWlkeCA9IGwgLSBpcF92c19jb25uX3RhYjsKKwljdF9yZWFkX3VubG9ja19iaChpZHgpOworCisJd2hpbGUgKCsraWR4IDwgSVBfVlNfQ09OTl9UQUJfU0laRSkgeworCQljdF9yZWFkX2xvY2tfYmgoaWR4KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2lkeF0sIGNfbGlzdCkgeworCQkJc2VxLT5wcml2YXRlID0gJmlwX3ZzX2Nvbm5fdGFiW2lkeF07CisJCQlyZXR1cm4gY3A7CisJCX0KKwkJY3RfcmVhZF91bmxvY2tfYmgoaWR4KTsKKwl9CisJc2VxLT5wcml2YXRlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfY29ubl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsID0gc2VxLT5wcml2YXRlOworCisJaWYgKGwpCisJCWN0X3JlYWRfdW5sb2NrX2JoKGwgLSBpcF92c19jb25uX3RhYik7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfY29ubl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLAorICAgIlBybyBGcm9tSVAgICBGUHJ0IFRvSVAgICAgIFRQcnQgRGVzdElQICAgRFBydCBTdGF0ZSAgICAgICBFeHBpcmVzXG4iKTsKKwllbHNlIHsKKwkJY29uc3Qgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gdjsKKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJCWlmIChjcC0+YWYgPT0gQUZfSU5FVDYpCisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkiJS0zcyAiIE5JUDZfRk1UICIgJTA0WCAiIE5JUDZfRk1UCisJCQkJIiAlMDRYICIgTklQNl9GTVQgIiAlMDRYICUtMTFzICU3bHVcbiIsCisJCQkJaXBfdnNfcHJvdG9fbmFtZShjcC0+cHJvdG9jb2wpLAorCQkJCU5JUDYoY3AtPmNhZGRyLmluNiksIG50b2hzKGNwLT5jcG9ydCksCisJCQkJTklQNihjcC0+dmFkZHIuaW42KSwgbnRvaHMoY3AtPnZwb3J0KSwKKwkJCQlOSVA2KGNwLT5kYWRkci5pbjYpLCBudG9ocyhjcC0+ZHBvcnQpLAorCQkJCWlwX3ZzX3N0YXRlX25hbWUoY3AtPnByb3RvY29sLCBjcC0+c3RhdGUpLAorCQkJCShjcC0+dGltZXIuZXhwaXJlcy1qaWZmaWVzKS9IWik7CisJCWVsc2UKKyNlbmRpZgorCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJIiUtM3MgJTA4WCAlMDRYICUwOFggJTA0WCIKKwkJCQkiICUwOFggJTA0WCAlLTExcyAlN2x1XG4iLAorCQkJCWlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKKwkJCQludG9obChjcC0+Y2FkZHIuaXApLCBudG9ocyhjcC0+Y3BvcnQpLAorCQkJCW50b2hsKGNwLT52YWRkci5pcCksIG50b2hzKGNwLT52cG9ydCksCisJCQkJbnRvaGwoY3AtPmRhZGRyLmlwKSwgbnRvaHMoY3AtPmRwb3J0KSwKKwkJCQlpcF92c19zdGF0ZV9uYW1lKGNwLT5wcm90b2NvbCwgY3AtPnN0YXRlKSwKKwkJCQkoY3AtPnRpbWVyLmV4cGlyZXMtamlmZmllcykvSFopOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcF92c19jb25uX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gaXBfdnNfY29ubl9zZXFfc3RhcnQsCisJLm5leHQgID0gaXBfdnNfY29ubl9zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcF92c19jb25uX3NlcV9zdG9wLAorCS5zaG93ICA9IGlwX3ZzX2Nvbm5fc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlwX3ZzX2Nvbm5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmlwX3ZzX2Nvbm5fc2VxX29wcyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwX3ZzX2Nvbm5fZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBpcF92c19jb25uX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwX3ZzX29yaWdpbl9uYW1lKHVuc2lnbmVkIGZsYWdzKQoreworCWlmIChmbGFncyAmIElQX1ZTX0NPTk5fRl9TWU5DKQorCQlyZXR1cm4gIlNZTkMiOworCWVsc2UKKwkJcmV0dXJuICJMT0NBTCI7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfY29ubl9zeW5jX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHV0cyhzZXEsCisgICAiUHJvIEZyb21JUCAgIEZQcnQgVG9JUCAgICAgVFBydCBEZXN0SVAgICBEUHJ0IFN0YXRlICAgICAgIE9yaWdpbiBFeHBpcmVzXG4iKTsKKwllbHNlIHsKKwkJY29uc3Qgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwID0gdjsKKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJCWlmIChjcC0+YWYgPT0gQUZfSU5FVDYpCisJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkiJS0zcyAiIE5JUDZfRk1UICIgJTA0WCAiIE5JUDZfRk1UCisJCQkJIiAlMDRYICIgTklQNl9GTVQgIiAlMDRYICUtMTFzICUtNnMgJTdsdVxuIiwKKwkJCQlpcF92c19wcm90b19uYW1lKGNwLT5wcm90b2NvbCksCisJCQkJTklQNihjcC0+Y2FkZHIuaW42KSwgbnRvaHMoY3AtPmNwb3J0KSwKKwkJCQlOSVA2KGNwLT52YWRkci5pbjYpLCBudG9ocyhjcC0+dnBvcnQpLAorCQkJCU5JUDYoY3AtPmRhZGRyLmluNiksIG50b2hzKGNwLT5kcG9ydCksCisJCQkJaXBfdnNfc3RhdGVfbmFtZShjcC0+cHJvdG9jb2wsIGNwLT5zdGF0ZSksCisJCQkJaXBfdnNfb3JpZ2luX25hbWUoY3AtPmZsYWdzKSwKKwkJCQkoY3AtPnRpbWVyLmV4cGlyZXMtamlmZmllcykvSFopOworCQllbHNlCisjZW5kaWYKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSIlLTNzICUwOFggJTA0WCAlMDhYICUwNFggIgorCQkJCSIlMDhYICUwNFggJS0xMXMgJS02cyAlN2x1XG4iLAorCQkJCWlwX3ZzX3Byb3RvX25hbWUoY3AtPnByb3RvY29sKSwKKwkJCQludG9obChjcC0+Y2FkZHIuaXApLCBudG9ocyhjcC0+Y3BvcnQpLAorCQkJCW50b2hsKGNwLT52YWRkci5pcCksIG50b2hzKGNwLT52cG9ydCksCisJCQkJbnRvaGwoY3AtPmRhZGRyLmlwKSwgbnRvaHMoY3AtPmRwb3J0KSwKKwkJCQlpcF92c19zdGF0ZV9uYW1lKGNwLT5wcm90b2NvbCwgY3AtPnN0YXRlKSwKKwkJCQlpcF92c19vcmlnaW5fbmFtZShjcC0+ZmxhZ3MpLAorCQkJCShjcC0+dGltZXIuZXhwaXJlcy1qaWZmaWVzKS9IWik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlwX3ZzX2Nvbm5fc3luY19zZXFfb3BzID0geworCS5zdGFydCA9IGlwX3ZzX2Nvbm5fc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGlwX3ZzX2Nvbm5fc2VxX25leHQsCisJLnN0b3AgID0gaXBfdnNfY29ubl9zZXFfc3RvcCwKKwkuc2hvdyAgPSBpcF92c19jb25uX3N5bmNfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlwX3ZzX2Nvbm5fc3luY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmaXBfdnNfY29ubl9zeW5jX3NlcV9vcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF92c19jb25uX3N5bmNfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBpcF92c19jb25uX3N5bmNfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYKKworCisvKgorICogICAgICBSYW5kb21seSBkcm9wIGNvbm5lY3Rpb24gZW50cmllcyBiZWZvcmUgcnVubmluZyBvdXQgb2YgbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRvZHJvcF9lbnRyeShzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJLyoKKwkgKiBUaGUgZHJvcCByYXRlIGFycmF5IG5lZWRzIHR1bmluZyBmb3IgcmVhbCBlbnZpcm9ubWVudHMuCisJICogQ2FsbGVkIGZyb20gdGltZXIgYmggb25seSA9PiBubyBsb2NraW5nCisJICovCisJc3RhdGljIGNvbnN0IGNoYXIgdG9kcm9wX3JhdGVbOV0gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisJc3RhdGljIGNoYXIgdG9kcm9wX2NvdW50ZXJbOV0gPSB7MH07CisJaW50IGk7CisKKwkvKiBpZiB0aGUgY29ubiBlbnRyeSBoYXNuJ3QgbGFzdGVkIGZvciA2MCBzZWNvbmRzLCBkb24ndCBkcm9wIGl0LgorCSAgIFRoaXMgd2lsbCBsZWF2ZSBlbm91Z2ggdGltZSBmb3Igbm9ybWFsIGNvbm5lY3Rpb24gdG8gZ2V0CisJICAgdGhyb3VnaC4gKi8KKwlpZiAodGltZV9iZWZvcmUoY3AtPnRpbWVvdXQgKyBqaWZmaWVzLCBjcC0+dGltZXIuZXhwaXJlcyArIDYwKkhaKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb24ndCBkcm9wIHRoZSBlbnRyeSBpZiBpdHMgbnVtYmVyIG9mIGluY29taW5nIHBhY2tldHMgaXMgbm90CisJICAgbG9jYXRlZCBpbiBbMCwgOF0gKi8KKwlpID0gYXRvbWljX3JlYWQoJmNwLT5pbl9wa3RzKTsKKwlpZiAoaSA+IDggfHwgaSA8IDApIHJldHVybiAwOworCisJaWYgKCF0b2Ryb3BfcmF0ZVtpXSkgcmV0dXJuIDA7CisJaWYgKC0tdG9kcm9wX2NvdW50ZXJbaV0gPiAwKSByZXR1cm4gMDsKKworCXRvZHJvcF9jb3VudGVyW2ldID0gdG9kcm9wX3JhdGVbaV07CisJcmV0dXJuIDE7Cit9CisKKy8qIENhbGxlZCBmcm9tIGtldmVudGQgYW5kIG11c3QgcHJvdGVjdCBpdHNlbGYgZnJvbSBzb2Z0aXJxcyAqLwordm9pZCBpcF92c19yYW5kb21fZHJvcGVudHJ5KHZvaWQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisKKwkvKgorCSAqIFJhbmRvbWx5IHNjYW4gMS8zMiBvZiB0aGUgd2hvbGUgdGFibGUgZXZlcnkgc2Vjb25kCisJICovCisJZm9yIChpZHggPSAwOyBpZHggPCAoSVBfVlNfQ09OTl9UQUJfU0laRT4+NSk7IGlkeCsrKSB7CisJCXVuc2lnbmVkIGhhc2ggPSBuZXRfcmFuZG9tKCkgJiBJUF9WU19DT05OX1RBQl9NQVNLOworCisJCS8qCisJCSAqICBMb2NrIGlzIGFjdHVhbGx5IG5lZWRlZCBpbiB0aGlzIGxvb3AuCisJCSAqLworCQljdF93cml0ZV9sb2NrX2JoKGhhc2gpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpcF92c19jb25uX3RhYltoYXNoXSwgY19saXN0KSB7CisJCQlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKQorCQkJCS8qIGNvbm5lY3Rpb24gdGVtcGxhdGUgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKGNwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkJCXN3aXRjaChjcC0+c3RhdGUpIHsKKwkJCQljYXNlIElQX1ZTX1RDUF9TX1NZTl9SRUNWOgorCQkJCWNhc2UgSVBfVlNfVENQX1NfU1lOQUNLOgorCQkJCQlicmVhazsKKworCQkJCWNhc2UgSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQ6CisJCQkJCWlmICh0b2Ryb3BfZW50cnkoY3ApKQorCQkJCQkJYnJlYWs7CisJCQkJCWNvbnRpbnVlOworCisJCQkJZGVmYXVsdDoKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXRvZHJvcF9lbnRyeShjcCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uZWN0aW9uXG4iKTsKKwkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcCk7CisJCQlpZiAoY3AtPmNvbnRyb2wpIHsKKwkJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uIHRlbXBsYXRlXG4iKTsKKwkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3AtPmNvbnRyb2wpOworCQkJfQorCQl9CisJCWN0X3dyaXRlX3VubG9ja19iaChoYXNoKTsKKwl9Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBjb25uZWN0aW9uIGVudHJpZXMgaW4gdGhlIGlwX3ZzX2Nvbm5fdGFiCisgKi8KK3N0YXRpYyB2b2lkIGlwX3ZzX2Nvbm5fZmx1c2godm9pZCkKK3sKKwlpbnQgaWR4OworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworICBmbHVzaF9hZ2FpbjoKKwlmb3IgKGlkeD0wOyBpZHg8SVBfVlNfQ09OTl9UQUJfU0laRTsgaWR4KyspIHsKKwkJLyoKKwkJICogIExvY2sgaXMgYWN0dWFsbHkgbmVlZGVkIGluIHRoaXMgbG9vcC4KKwkJICovCisJCWN0X3dyaXRlX2xvY2tfYmgoaWR4KTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaWR4XSwgY19saXN0KSB7CisKKwkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm5lY3Rpb25cbiIpOworCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKKwkJCWlmIChjcC0+Y29udHJvbCkgeworCQkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm4gdGVtcGxhdGVcbiIpOworCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcC0+Y29udHJvbCk7CisJCQl9CisJCX0KKwkJY3Rfd3JpdGVfdW5sb2NrX2JoKGlkeCk7CisJfQorCisJLyogdGhlIGNvdW50ZXIgbWF5IGJlIG5vdCBOVUxMLCBiZWNhdXNlIG1heWJlIHNvbWUgY29ubiBlbnRyaWVzCisJICAgYXJlIHJ1biBieSBzbG93IHRpbWVyIGhhbmRsZXIgb3IgdW5oYXNoZWQgYnV0IHN0aWxsIHJlZmVycmVkICovCisJaWYgKGF0b21pY19yZWFkKCZpcF92c19jb25uX2NvdW50KSAhPSAwKSB7CisJCXNjaGVkdWxlKCk7CisJCWdvdG8gZmx1c2hfYWdhaW47CisJfQorfQorCisKK2ludCBfX2luaXQgaXBfdnNfY29ubl9pbml0KHZvaWQpCit7CisJaW50IGlkeDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGNvbm5lY3Rpb24gaGFzaCB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpdHMgbGlzdCBoZWFkcworCSAqLworCWlwX3ZzX2Nvbm5fdGFiID0gdm1hbGxvYyhJUF9WU19DT05OX1RBQl9TSVpFKnNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7CisJaWYgKCFpcF92c19jb25uX3RhYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBBbGxvY2F0ZSBpcF92c19jb25uIHNsYWIgY2FjaGUgKi8KKwlpcF92c19jb25uX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcF92c19jb25uIiwKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpcF92c19jb25uKSwgMCwKKwkJCQkJICAgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWlwX3ZzX2Nvbm5fY2FjaGVwKSB7CisJCXZmcmVlKGlwX3ZzX2Nvbm5fdGFiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJSVBfVlNfSU5GTygiQ29ubmVjdGlvbiBoYXNoIHRhYmxlIGNvbmZpZ3VyZWQgIgorCQkgICAiKHNpemU9JWQsIG1lbW9yeT0lbGRLYnl0ZXMpXG4iLAorCQkgICBJUF9WU19DT05OX1RBQl9TSVpFLAorCQkgICAobG9uZykoSVBfVlNfQ09OTl9UQUJfU0laRSpzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpLzEwMjQpOworCUlQX1ZTX0RCRygwLCAiRWFjaCBjb25uZWN0aW9uIGVudHJ5IG5lZWRzICVaZCBieXRlcyBhdCBsZWFzdFxuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX2Nvbm4pKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfQ09OTl9UQUJfU0laRTsgaWR4KyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX2Nvbm5fdGFiW2lkeF0pOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQ1RfTE9DS0FSUkFZX1NJWkU7IGlkeCsrKSAgeworCQlyd2xvY2tfaW5pdCgmX19pcF92c19jb25udGJsX2xvY2tfYXJyYXlbaWR4XS5sKTsKKwl9CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgmaW5pdF9uZXQsICJpcF92c19jb25uIiwgMCwgJmlwX3ZzX2Nvbm5fZm9wcyk7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoJmluaXRfbmV0LCAiaXBfdnNfY29ubl9zeW5jIiwgMCwgJmlwX3ZzX2Nvbm5fc3luY19mb3BzKTsKKworCS8qIGNhbGN1bGF0ZSB0aGUgcmFuZG9tIHZhbHVlIGZvciBjb25uZWN0aW9uIGhhc2ggKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZpcF92c19jb25uX3JuZCwgc2l6ZW9mKGlwX3ZzX2Nvbm5fcm5kKSk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGlwX3ZzX2Nvbm5fY2xlYW51cCh2b2lkKQoreworCS8qIGZsdXNoIGFsbCB0aGUgY29ubmVjdGlvbiBlbnRyaWVzIGZpcnN0ICovCisJaXBfdnNfY29ubl9mbHVzaCgpOworCisJLyogUmVsZWFzZSB0aGUgZW1wdHkgY2FjaGUgKi8KKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfdnNfY29ubl9jYWNoZXApOworCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJpcF92c19jb25uIik7CisJcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX3ZzX2Nvbm5fc3luYyIpOworCXZmcmVlKGlwX3ZzX2Nvbm5fdGFiKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OGFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCkBAIC0wLDAgKzEsMTU0MiBAQAorLyoKKyAqIElQVlMgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTElOVVggb3BlcmF0aW5nIHN5c3RlbS4gIElQVlMgaXMgbm93IGltcGxlbWVudGVkIGFzIGEgbW9kdWxlCisgKiAgICAgICAgICAgICAgb3ZlciB0aGUgTmV0ZmlsdGVyIGZyYW1ld29yay4gSVBWUyBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisgKiAgICAgICAgICAgICAgaGlnaC1wZXJmb3JtYW5jZSBhbmQgaGlnaGx5IGF2YWlsYWJsZSBzZXJ2ZXIgYmFzZWQgb24gYQorICogICAgICAgICAgICAgIGNsdXN0ZXIgb2Ygc2VydmVycy4KKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgSVBWUyBjb2RlIGZvciBrZXJuZWwgMi4yIHdhcyBkb25lIGJ5IFdlbnNvbmcgWmhhbmcgYW5kIFBldGVyIEtlc2UsCisgKiB3aXRoIGNoYW5nZXMvZml4ZXMgZnJvbSBKdWxpYW4gQW5hc3Rhc292LCBMYXJzIE1hcm93c2t5LUJyZWUsIEhvcm1zCisgKiBhbmQgb3RoZXJzLgorICoKKyAqIENoYW5nZXM6CisgKglQYXVsIGBSdXN0eScgUnVzc2VsbAkJcHJvcGVybHkgaGFuZGxlIG5vbi1saW5lYXIgc2ticworICoJSGFyYWxkIFdlbHRlCQkJZG9uJ3QgdXNlIG5mY2FjaGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcC5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPiAgICAgICAgICAgICAgICAgICAvKiBmb3IgaWNtcF9zZW5kICovCisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIpOworRVhQT1JUX1NZTUJPTChpcF92c19za2JfcmVwbGFjZSk7CitFWFBPUlRfU1lNQk9MKGlwX3ZzX3Byb3RvX25hbWUpOworRVhQT1JUX1NZTUJPTChpcF92c19jb25uX25ldyk7CitFWFBPUlRfU1lNQk9MKGlwX3ZzX2Nvbm5faW5fZ2V0KTsKK0VYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9vdXRfZ2V0KTsKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVENQCitFWFBPUlRfU1lNQk9MKGlwX3ZzX3RjcF9jb25uX2xpc3Rlbik7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woaXBfdnNfY29ubl9wdXQpOworI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRworRVhQT1JUX1NZTUJPTChpcF92c19nZXRfZGVidWdfbGV2ZWwpOworI2VuZGlmCisKKworLyogSUQgdXNlZCBpbiBJQ01QIGxvb2t1cHMgKi8KKyNkZWZpbmUgaWNtcF9pZChpY21waCkgICAgICAgICAgKCgoaWNtcGgpLT51bikuZWNoby5pZCkKKyNkZWZpbmUgaWNtcHY2X2lkKGljbXBoKSAgICAgICAgKGljbXBoLT5pY21wNl9kYXRhdW4udV9lY2hvLmlkZW50aWZpZXIpCisKK2NvbnN0IGNoYXIgKmlwX3ZzX3Byb3RvX25hbWUodW5zaWduZWQgcHJvdG8pCit7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIElQUFJPVE9fSVA6CisJCXJldHVybiAiSVAiOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXJldHVybiAiVURQIjsKKwljYXNlIElQUFJPVE9fVENQOgorCQlyZXR1cm4gIlRDUCI7CisJY2FzZSBJUFBST1RPX0lDTVA6CisJCXJldHVybiAiSUNNUCI7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwljYXNlIElQUFJPVE9fSUNNUFY2OgorCQlyZXR1cm4gIklDTVB2NiI7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlzcHJpbnRmKGJ1ZiwgIklQXyVkIiwgcHJvdG8pOworCQlyZXR1cm4gYnVmOworCX0KK30KKwordm9pZCBpcF92c19pbml0X2hhc2hfdGFibGUoc3RydWN0IGxpc3RfaGVhZCAqdGFibGUsIGludCByb3dzKQoreworCXdoaWxlICgtLXJvd3MgPj0gMCkKKwkJSU5JVF9MSVNUX0hFQUQoJnRhYmxlW3Jvd3NdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpcF92c19pbl9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKwlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdGF0cy51c3RhdHMuaW5wa3RzKys7CisJCWRlc3QtPnN0YXRzLnVzdGF0cy5pbmJ5dGVzICs9IHNrYi0+bGVuOworCQlzcGluX3VubG9jaygmZGVzdC0+c3RhdHMubG9jayk7CisKKwkJc3Bpbl9sb2NrKCZkZXN0LT5zdmMtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdmMtPnN0YXRzLnVzdGF0cy5pbnBrdHMrKzsKKwkJZGVzdC0+c3ZjLT5zdGF0cy51c3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmRlc3QtPnN2Yy0+c3RhdHMubG9jayk7CisKKwkJc3Bpbl9sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKKwkJaXBfdnNfc3RhdHMudXN0YXRzLmlucGt0cysrOworCQlpcF92c19zdGF0cy51c3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwX3ZzX291dF9zdGF0cyhzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKwlpZiAoZGVzdCAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQlzcGluX2xvY2soJmRlc3QtPnN0YXRzLmxvY2spOworCQlkZXN0LT5zdGF0cy51c3RhdHMub3V0cGt0cysrOworCQlkZXN0LT5zdGF0cy51c3RhdHMub3V0Ynl0ZXMgKz0gc2tiLT5sZW47CisJCXNwaW5fdW5sb2NrKCZkZXN0LT5zdGF0cy5sb2NrKTsKKworCQlzcGluX2xvY2soJmRlc3QtPnN2Yy0+c3RhdHMubG9jayk7CisJCWRlc3QtPnN2Yy0+c3RhdHMudXN0YXRzLm91dHBrdHMrKzsKKwkJZGVzdC0+c3ZjLT5zdGF0cy51c3RhdHMub3V0Ynl0ZXMgKz0gc2tiLT5sZW47CisJCXNwaW5fdW5sb2NrKCZkZXN0LT5zdmMtPnN0YXRzLmxvY2spOworCisJCXNwaW5fbG9jaygmaXBfdnNfc3RhdHMubG9jayk7CisJCWlwX3ZzX3N0YXRzLnVzdGF0cy5vdXRwa3RzKys7CisJCWlwX3ZzX3N0YXRzLnVzdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKKwkJc3Bpbl91bmxvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lwX3ZzX2Nvbm5fc3RhdHMoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXNwaW5fbG9jaygmY3AtPmRlc3QtPnN0YXRzLmxvY2spOworCWNwLT5kZXN0LT5zdGF0cy51c3RhdHMuY29ubnMrKzsKKwlzcGluX3VubG9jaygmY3AtPmRlc3QtPnN0YXRzLmxvY2spOworCisJc3Bpbl9sb2NrKCZzdmMtPnN0YXRzLmxvY2spOworCXN2Yy0+c3RhdHMudXN0YXRzLmNvbm5zKys7CisJc3Bpbl91bmxvY2soJnN2Yy0+c3RhdHMubG9jayk7CisKKwlzcGluX2xvY2soJmlwX3ZzX3N0YXRzLmxvY2spOworCWlwX3ZzX3N0YXRzLnVzdGF0cy5jb25ucysrOworCXNwaW5fdW5sb2NrKCZpcF92c19zdGF0cy5sb2NrKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAoraXBfdnNfc2V0X3N0YXRlKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKKwkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlpZiAodW5saWtlbHkoIXBwLT5zdGF0ZV90cmFuc2l0aW9uKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcHApOworfQorCisKKy8qCisgKiAgSVBWUyBwZXJzaXN0ZW50IHNjaGVkdWxpbmcgZnVuY3Rpb24KKyAqICBJdCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBhY2NvcmRpbmcgdG8gaXRzIHRlbXBsYXRlIGlmIGV4aXN0cywKKyAqICBvciBzZWxlY3RzIGEgc2VydmVyIGFuZCBjcmVhdGVzIGEgY29ubmVjdGlvbiBlbnRyeSBwbHVzIGEgdGVtcGxhdGUuCisgKiAgTG9ja2luZzogd2UgYXJlIHN2YyB1c2VyIChzdmMtPnJlZmNudCksIHNvIHdlIGhvbGQgYWxsIGRlc3RzIHRvbworICogIFByb3RvY29scyBzdXBwb3J0ZWQ6IFRDUCwgVURQCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCitpcF92c19zY2hlZF9wZXJzaXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgX19iZTE2IHBvcnRzWzJdKQoreworCXN0cnVjdCBpcF92c19jb25uICpjcCA9IE5VTEw7CisJc3RydWN0IGlwX3ZzX2lwaGRyIGlwaDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3Q7CisJX19iZTE2ICBkcG9ydDsJCQkvKiBkZXN0aW5hdGlvbiBwb3J0IHRvIGZvcndhcmQgKi8KKwl1bmlvbiBuZl9pbmV0X2FkZHIgc25ldDsJLyogc291cmNlIG5ldHdvcmsgb2YgdGhlIGNsaWVudCwKKwkJCQkJICAgYWZ0ZXIgbWFza2luZyAqLworCisJaXBfdnNfZmlsbF9pcGhkcihzdmMtPmFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CisKKwkvKiBNYXNrIHNhZGRyIHdpdGggdGhlIG5ldG1hc2sgdG8gYWRqdXN0IHRlbXBsYXRlIGdyYW51bGFyaXR5ICovCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoc3ZjLT5hZiA9PSBBRl9JTkVUNikKKwkJaXB2Nl9hZGRyX3ByZWZpeCgmc25ldC5pbjYsICZpcGguc2FkZHIuaW42LCBzdmMtPm5ldG1hc2spOworCWVsc2UKKyNlbmRpZgorCQlzbmV0LmlwID0gaXBoLnNhZGRyLmlwICYgc3ZjLT5uZXRtYXNrOworCisJSVBfVlNfREJHX0JVRig2LCAicC1zY2hlZHVsZTogc3JjICVzOiV1IGRlc3QgJXM6JXUgIgorCQkgICAgICAibW5ldCAlc1xuIiwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmlwaC5zYWRkciksIG50b2hzKHBvcnRzWzBdKSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmlwaC5kYWRkciksIG50b2hzKHBvcnRzWzFdKSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJnNuZXQpKTsKKworCS8qCisJICogQXMgZmFyIGFzIHdlIGtub3csIEZUUCBpcyBhIHZlcnkgY29tcGxpY2F0ZWQgbmV0d29yayBwcm90b2NvbCwgYW5kCisJICogaXQgdXNlcyBjb250cm9sIGNvbm5lY3Rpb24gYW5kIGRhdGEgY29ubmVjdGlvbnMuIEZvciBhY3RpdmUgRlRQLAorCSAqIEZUUCBzZXJ2ZXIgaW5pdGlhbGl6ZSBkYXRhIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCwgaXRzIHNvdXJjZSBwb3J0CisJICogaXMgb2Z0ZW4gMjAuIEZvciBwYXNzaXZlIEZUUCwgRlRQIHNlcnZlciB0ZWxscyB0aGUgY2xpZW50cyB0aGUgcG9ydAorCSAqIHRoYXQgaXQgcGFzc2l2ZWx5IGxpc3RlbnMgdG8sICBhbmQgdGhlIGNsaWVudCBpc3N1ZXMgdGhlIGRhdGEKKwkgKiBjb25uZWN0aW9uLiBJbiB0aGUgdHVubmVsaW5nIG9yIGRpcmVjdCByb3V0aW5nIG1vZGUsIHRoZSBsb2FkCisJICogYmFsYW5jZXIgaXMgb24gdGhlIGNsaWVudC10by1zZXJ2ZXIgaGFsZiBvZiBjb25uZWN0aW9uLCB0aGUgcG9ydAorCSAqIG51bWJlciBpcyB1bmtub3duIHRvIHRoZSBsb2FkIGJhbGFuY2VyLiBTbywgYSBjb25uIHRlbXBsYXRlIGxpa2UKKwkgKiA8Y2FkZHIsIDAsIHZhZGRyLCAwLCBkYWRkciwgMD4gaXMgY3JlYXRlZCBmb3IgcGVyc2lzdGVudCBGVFAKKwkgKiBzZXJ2aWNlLCBhbmQgYSB0ZW1wbGF0ZSBsaWtlIDxjYWRkciwgMCwgdmFkZHIsIHZwb3J0LCBkYWRkciwgZHBvcnQ+CisJICogaXMgY3JlYXRlZCBmb3Igb3RoZXIgcGVyc2lzdGVudCBzZXJ2aWNlcy4KKwkgKi8KKwlpZiAocG9ydHNbMV0gPT0gc3ZjLT5wb3J0KSB7CisJCS8qIENoZWNrIGlmIGEgdGVtcGxhdGUgYWxyZWFkeSBleGlzdHMgKi8KKwkJaWYgKHN2Yy0+cG9ydCAhPSBGVFBQT1JUKQorCQkJY3QgPSBpcF92c19jdF9pbl9nZXQoc3ZjLT5hZiwgaXBoLnByb3RvY29sLCAmc25ldCwgMCwKKwkJCQkJICAgICAmaXBoLmRhZGRyLCBwb3J0c1sxXSk7CisJCWVsc2UKKwkJCWN0ID0gaXBfdnNfY3RfaW5fZ2V0KHN2Yy0+YWYsIGlwaC5wcm90b2NvbCwgJnNuZXQsIDAsCisJCQkJCSAgICAgJmlwaC5kYWRkciwgMCk7CisKKwkJaWYgKCFjdCB8fCAhaXBfdnNfY2hlY2tfdGVtcGxhdGUoY3QpKSB7CisJCQkvKgorCQkJICogTm8gdGVtcGxhdGUgZm91bmQgb3IgdGhlIGRlc3Qgb2YgdGhlIGNvbm5lY3Rpb24KKwkJCSAqIHRlbXBsYXRlIGlzIG5vdCBhdmFpbGFibGUuCisJCQkgKi8KKwkJCWRlc3QgPSBzdmMtPnNjaGVkdWxlci0+c2NoZWR1bGUoc3ZjLCBza2IpOworCQkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJCUlQX1ZTX0RCRygxLCAicC1zY2hlZHVsZTogbm8gZGVzdCBmb3VuZC5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQkvKgorCQkJICogQ3JlYXRlIGEgdGVtcGxhdGUgbGlrZSA8cHJvdG9jb2wsY2FkZHIsMCwKKwkJCSAqIHZhZGRyLHZwb3J0LGRhZGRyLGRwb3J0PiBmb3Igbm9uLWZ0cCBzZXJ2aWNlLAorCQkJICogYW5kIDxwcm90b2NvbCxjYWRkciwwLHZhZGRyLDAsZGFkZHIsMD4KKwkJCSAqIGZvciBmdHAgc2VydmljZS4KKwkJCSAqLworCQkJaWYgKHN2Yy0+cG9ydCAhPSBGVFBQT1JUKQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoc3ZjLT5hZiwgaXBoLnByb3RvY29sLAorCQkJCQkJICAgICZzbmV0LCAwLAorCQkJCQkJICAgICZpcGguZGFkZHIsCisJCQkJCQkgICAgcG9ydHNbMV0sCisJCQkJCQkgICAgJmRlc3QtPmFkZHIsIGRlc3QtPnBvcnQsCisJCQkJCQkgICAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFLAorCQkJCQkJICAgIGRlc3QpOworCQkJZWxzZQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoc3ZjLT5hZiwgaXBoLnByb3RvY29sLAorCQkJCQkJICAgICZzbmV0LCAwLAorCQkJCQkJICAgICZpcGguZGFkZHIsIDAsCisJCQkJCQkgICAgJmRlc3QtPmFkZHIsIDAsCisJCQkJCQkgICAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFLAorCQkJCQkJICAgIGRlc3QpOworCQkJaWYgKGN0ID09IE5VTEwpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWN0LT50aW1lb3V0ID0gc3ZjLT50aW1lb3V0OworCQl9IGVsc2UgeworCQkJLyogc2V0IGRlc3RpbmF0aW9uIHdpdGggdGhlIGZvdW5kIHRlbXBsYXRlICovCisJCQlkZXN0ID0gY3QtPmRlc3Q7CisJCX0KKwkJZHBvcnQgPSBkZXN0LT5wb3J0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vdGU6IHBlcnNpc3RlbnQgZndtYXJrLWJhc2VkIHNlcnZpY2VzIGFuZCBwZXJzaXN0ZW50CisJCSAqIHBvcnQgemVybyBzZXJ2aWNlIGFyZSBoYW5kbGVkIGhlcmUuCisJCSAqIGZ3bWFyayB0ZW1wbGF0ZTogPElQUFJPVE9fSVAsY2FkZHIsMCxmd21hcmssMCxkYWRkciwwPgorCQkgKiBwb3J0IHplcm8gdGVtcGxhdGU6IDxwcm90b2NvbCxjYWRkciwwLHZhZGRyLDAsZGFkZHIsMD4KKwkJICovCisJCWlmIChzdmMtPmZ3bWFyaykgeworCQkJdW5pb24gbmZfaW5ldF9hZGRyIGZ3bWFyayA9IHsKKwkJCQkuYWxsID0geyAwLCAwLCAwLCBodG9ubChzdmMtPmZ3bWFyaykgfQorCQkJfTsKKworCQkJY3QgPSBpcF92c19jdF9pbl9nZXQoc3ZjLT5hZiwgSVBQUk9UT19JUCwgJnNuZXQsIDAsCisJCQkJCSAgICAgJmZ3bWFyaywgMCk7CisJCX0gZWxzZQorCQkJY3QgPSBpcF92c19jdF9pbl9nZXQoc3ZjLT5hZiwgaXBoLnByb3RvY29sLCAmc25ldCwgMCwKKwkJCQkJICAgICAmaXBoLmRhZGRyLCAwKTsKKworCQlpZiAoIWN0IHx8ICFpcF92c19jaGVja190ZW1wbGF0ZShjdCkpIHsKKwkJCS8qCisJCQkgKiBJZiBpdCBpcyBub3QgcGVyc2lzdGVudCBwb3J0IHplcm8sIHJldHVybiBOVUxMLAorCQkJICogb3RoZXJ3aXNlIGNyZWF0ZSBhIGNvbm5lY3Rpb24gdGVtcGxhdGUuCisJCQkgKi8KKwkJCWlmIChzdmMtPnBvcnQpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWRlc3QgPSBzdmMtPnNjaGVkdWxlci0+c2NoZWR1bGUoc3ZjLCBza2IpOworCQkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJCUlQX1ZTX0RCRygxLCAicC1zY2hlZHVsZTogbm8gZGVzdCBmb3VuZC5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQkvKgorCQkJICogQ3JlYXRlIGEgdGVtcGxhdGUgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2aWNlCisJCQkgKi8KKwkJCWlmIChzdmMtPmZ3bWFyaykgeworCQkJCXVuaW9uIG5mX2luZXRfYWRkciBmd21hcmsgPSB7CisJCQkJCS5hbGwgPSB7IDAsIDAsIDAsIGh0b25sKHN2Yy0+ZndtYXJrKSB9CisJCQkJfTsKKworCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoc3ZjLT5hZiwgSVBQUk9UT19JUCwKKwkJCQkJCSAgICAmc25ldCwgMCwKKwkJCQkJCSAgICAmZndtYXJrLCAwLAorCQkJCQkJICAgICZkZXN0LT5hZGRyLCAwLAorCQkJCQkJICAgIElQX1ZTX0NPTk5fRl9URU1QTEFURSwKKwkJCQkJCSAgICBkZXN0KTsKKwkJCX0gZWxzZQorCQkJCWN0ID0gaXBfdnNfY29ubl9uZXcoc3ZjLT5hZiwgaXBoLnByb3RvY29sLAorCQkJCQkJICAgICZzbmV0LCAwLAorCQkJCQkJICAgICZpcGguZGFkZHIsIDAsCisJCQkJCQkgICAgJmRlc3QtPmFkZHIsIDAsCisJCQkJCQkgICAgSVBfVlNfQ09OTl9GX1RFTVBMQVRFLAorCQkJCQkJICAgIGRlc3QpOworCQkJaWYgKGN0ID09IE5VTEwpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWN0LT50aW1lb3V0ID0gc3ZjLT50aW1lb3V0OworCQl9IGVsc2UgeworCQkJLyogc2V0IGRlc3RpbmF0aW9uIHdpdGggdGhlIGZvdW5kIHRlbXBsYXRlICovCisJCQlkZXN0ID0gY3QtPmRlc3Q7CisJCX0KKwkJZHBvcnQgPSBwb3J0c1sxXTsKKwl9CisKKwkvKgorCSAqICAgIENyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUKKwkgKi8KKwljcCA9IGlwX3ZzX2Nvbm5fbmV3KHN2Yy0+YWYsIGlwaC5wcm90b2NvbCwKKwkJCSAgICAmaXBoLnNhZGRyLCBwb3J0c1swXSwKKwkJCSAgICAmaXBoLmRhZGRyLCBwb3J0c1sxXSwKKwkJCSAgICAmZGVzdC0+YWRkciwgZHBvcnQsCisJCQkgICAgMCwKKwkJCSAgICBkZXN0KTsKKwlpZiAoY3AgPT0gTlVMTCkgeworCQlpcF92c19jb25uX3B1dChjdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogICAgQWRkIGl0cyBjb250cm9sCisJICovCisJaXBfdnNfY29udHJvbF9hZGQoY3AsIGN0KTsKKwlpcF92c19jb25uX3B1dChjdCk7CisKKwlpcF92c19jb25uX3N0YXRzKGNwLCBzdmMpOworCXJldHVybiBjcDsKK30KKworCisvKgorICogIElQVlMgbWFpbiBzY2hlZHVsaW5nIGZ1bmN0aW9uCisgKiAgSXQgc2VsZWN0cyBhIHNlcnZlciBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgc2VydmljZSwgYW5kCisgKiAgY3JlYXRlcyBhIGNvbm5lY3Rpb24gZW50cnkuCisgKiAgUHJvdG9jb2xzIHN1cHBvcnRlZDogVENQLCBVRFAKKyAqLworc3RydWN0IGlwX3ZzX2Nvbm4gKgoraXBfdnNfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSBOVUxMOworCXN0cnVjdCBpcF92c19pcGhkciBpcGg7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CisKKwlpcF92c19maWxsX2lwaGRyKHN2Yy0+YWYsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCAmaXBoKTsKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLmxlbiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqICAgIFBlcnNpc3RlbnQgc2VydmljZQorCSAqLworCWlmIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfUEVSU0lTVEVOVCkKKwkJcmV0dXJuIGlwX3ZzX3NjaGVkX3BlcnNpc3Qoc3ZjLCBza2IsIHBwdHIpOworCisJLyoKKwkgKiAgICBOb24tcGVyc2lzdGVudCBzZXJ2aWNlCisJICovCisJaWYgKCFzdmMtPmZ3bWFyayAmJiBwcHRyWzFdICE9IHN2Yy0+cG9ydCkgeworCQlpZiAoIXN2Yy0+cG9ydCkKKwkJCUlQX1ZTX0VSUigiU2NoZWR1bGU6IHBvcnQgemVybyBvbmx5IHN1cHBvcnRlZCAiCisJCQkJICAiaW4gcGVyc2lzdGVudCBzZXJ2aWNlcywgIgorCQkJCSAgImNoZWNrIHlvdXIgaXB2cyBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzdCA9IHN2Yy0+c2NoZWR1bGVyLT5zY2hlZHVsZShzdmMsIHNrYik7CisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQlJUF9WU19EQkcoMSwgIlNjaGVkdWxlOiBubyBkZXN0IGZvdW5kLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogICAgQ3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeS4KKwkgKi8KKwljcCA9IGlwX3ZzX2Nvbm5fbmV3KHN2Yy0+YWYsIGlwaC5wcm90b2NvbCwKKwkJCSAgICAmaXBoLnNhZGRyLCBwcHRyWzBdLAorCQkJICAgICZpcGguZGFkZHIsIHBwdHJbMV0sCisJCQkgICAgJmRlc3QtPmFkZHIsIGRlc3QtPnBvcnQgPyBkZXN0LT5wb3J0IDogcHB0clsxXSwKKwkJCSAgICAwLAorCQkJICAgIGRlc3QpOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCUlQX1ZTX0RCR19CVUYoNiwgIlNjaGVkdWxlIGZ3ZDolYyBjOiVzOiV1IHY6JXM6JXUgIgorCQkgICAgICAiZDolczoldSBjb25uLT5mbGFnczolWCBjb25uLT5yZWZjbnQ6JWRcbiIsCisJCSAgICAgIGlwX3ZzX2Z3ZF90YWcoY3ApLAorCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmY3AtPmNhZGRyKSwgbnRvaHMoY3AtPmNwb3J0KSwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmNwLT52YWRkciksIG50b2hzKGNwLT52cG9ydCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKHN2Yy0+YWYsICZjcC0+ZGFkZHIpLCBudG9ocyhjcC0+ZHBvcnQpLAorCQkgICAgICBjcC0+ZmxhZ3MsIGF0b21pY19yZWFkKCZjcC0+cmVmY250KSk7CisKKwlpcF92c19jb25uX3N0YXRzKGNwLCBzdmMpOworCXJldHVybiBjcDsKK30KKworCisvKgorICogIFBhc3Mgb3IgZHJvcCB0aGUgcGFja2V0LgorICogIENhbGxlZCBieSBpcF92c19pbiwgd2hlbiB0aGUgdmlydHVhbCBzZXJ2aWNlIGlzIGF2YWlsYWJsZSBidXQKKyAqICBubyBkZXN0aW5hdGlvbiBpcyBhdmFpbGFibGUgZm9yIGEgbmV3IGNvbm5lY3Rpb24uCisgKi8KK2ludCBpcF92c19sZWF2ZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOworCXN0cnVjdCBpcF92c19pcGhkciBpcGg7CisJaW50IHVuaWNhc3Q7CisJaXBfdnNfZmlsbF9pcGhkcihzdmMtPmFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLmxlbiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkgeworCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChzdmMtPmFmID09IEFGX0lORVQ2KQorCQl1bmljYXN0ID0gaXB2Nl9hZGRyX3R5cGUoJmlwaC5kYWRkci5pbjYpICYgSVBWNl9BRERSX1VOSUNBU1Q7CisJZWxzZQorI2VuZGlmCisJCXVuaWNhc3QgPSAoaW5ldF9hZGRyX3R5cGUoJmluaXRfbmV0LCBpcGguZGFkZHIuaXApID09IFJUTl9VTklDQVNUKTsKKworCS8qIGlmIGl0IGlzIGZ3bWFyay1iYXNlZCBzZXJ2aWNlLCB0aGUgY2FjaGVfYnlwYXNzIHN5c2N0bCBpcyB1cAorCSAgIGFuZCB0aGUgZGVzdGluYXRpb24gaXMgYSBub24tbG9jYWwgdW5pY2FzdCwgdGhlbiBjcmVhdGUKKwkgICBhIGNhY2hlX2J5cGFzcyBjb25uZWN0aW9uIGVudHJ5ICovCisJaWYgKHN5c2N0bF9pcF92c19jYWNoZV9ieXBhc3MgJiYgc3ZjLT5md21hcmsgJiYgdW5pY2FzdCkgeworCQlpbnQgcmV0LCBjczsKKwkJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCQl1bmlvbiBuZl9pbmV0X2FkZHIgZGFkZHIgPSAgeyAuYWxsID0geyAwLCAwLCAwLCAwIH0gfTsKKworCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCisJCS8qIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGVudHJ5ICovCisJCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGVhdmU6IGNyZWF0ZSBhIGNhY2hlX2J5cGFzcyBlbnRyeVxuIik7CisJCWNwID0gaXBfdnNfY29ubl9uZXcoc3ZjLT5hZiwgaXBoLnByb3RvY29sLAorCQkJCSAgICAmaXBoLnNhZGRyLCBwcHRyWzBdLAorCQkJCSAgICAmaXBoLmRhZGRyLCBwcHRyWzFdLAorCQkJCSAgICAmZGFkZHIsIDAsCisJCQkJICAgIElQX1ZTX0NPTk5fRl9CWVBBU1MsCisJCQkJICAgIE5VTEwpOworCQlpZiAoY3AgPT0gTlVMTCkKKwkJCXJldHVybiBORl9EUk9QOworCisJCS8qIHN0YXRpc3RpY3MgKi8KKwkJaXBfdnNfaW5fc3RhdHMoY3AsIHNrYik7CisKKwkJLyogc2V0IHN0YXRlICovCisJCWNzID0gaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcHApOworCisJCS8qIHRyYW5zbWl0IHRoZSBmaXJzdCBTWU4gcGFja2V0ICovCisJCXJldCA9IGNwLT5wYWNrZXRfeG1pdChza2IsIGNwLCBwcCk7CisJCS8qIGRvIG5vdCB0b3VjaCBza2IgYW55bW9yZSAqLworCisJCWF0b21pY19pbmMoJmNwLT5pbl9wa3RzKTsKKwkJaXBfdnNfY29ubl9wdXQoY3ApOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogV2hlbiB0aGUgdmlydHVhbCBmdHAgc2VydmljZSBpcyBwcmVzZW50ZWQsIHBhY2tldHMgZGVzdGluZWQKKwkgKiBmb3Igb3RoZXIgc2VydmljZXMgb24gdGhlIFZJUCBtYXkgZ2V0IGhlcmUgKGV4Y2VwdCBzZXJ2aWNlcworCSAqIGxpc3RlZCBpbiB0aGUgaXB2cyB0YWJsZSksIHBhc3MgdGhlIHBhY2tldHMsIGJlY2F1c2UgaXQgaXMKKwkgKiBub3QgaXB2cyBqb2IgdG8gZGVjaWRlIHRvIGRyb3AgdGhlIHBhY2tldHMuCisJICovCisJaWYgKChzdmMtPnBvcnQgPT0gRlRQUE9SVCkgJiYgKHBwdHJbMV0gIT0gRlRQUE9SVCkpIHsKKwkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCisJLyoKKwkgKiBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyB1bnJlYWNoYWJsZSwgYW5kCisJICogcmVsZWFzZSB0aGUgc29ja2V0IGJ1ZmZlci4KKwkgKiBTaW5jZSBpdCBpcyBpbiBJUCBsYXllciwgdGhlIFRDUCBzb2NrZXQgaXMgbm90IGFjdHVhbGx5CisJICogY3JlYXRlZCwgdGhlIFRDUCBSU1QgcGFja2V0IGNhbm5vdCBiZSBzZW50LCBpbnN0ZWFkIHRoYXQKKwkgKiBJQ01QX1BPUlRfVU5SRUFDSCBpcyBzZW50IGhlcmUgbm8gbWF0dGVyIGl0IGlzIFRDUC9VRFAuIC0tV1oKKwkgKi8KKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChzdmMtPmFmID09IEFGX0lORVQ2KQorCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9QT1JUX1VOUkVBQ0gsIDAsCisJCQkgICAgc2tiLT5kZXYpOworCWVsc2UKKyNlbmRpZgorCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9QT1JUX1VOUkVBQ0gsIDApOworCisJcmV0dXJuIE5GX0RST1A7Cit9CisKKworLyoKKyAqICAgICAgSXQgaXMgaG9va2VkIGJlZm9yZSBORl9JUF9QUklfTkFUX1NSQyBhdCB0aGUgTkZfSU5FVF9QT1NUX1JPVVRJTkcKKyAqICAgICAgY2hhaW4sIGFuZCBpcyB1c2VkIGZvciBWUy9OQVQuCisgKiAgICAgIEl0IGRldGVjdHMgcGFja2V0cyBmb3IgVlMvTkFUIGNvbm5lY3Rpb25zIGFuZCBzZW5kcyB0aGUgcGFja2V0cworICogICAgICBpbW1lZGlhdGVseS4gVGhpcyBjYW4gYXZvaWQgdGhhdCBpcHRhYmxlX25hdCBtYW5nbGVzIHRoZSBwYWNrZXRzCisgKiAgICAgIGZvciBWUy9OQVQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfdnNfcG9zdF9yb3V0aW5nKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCWlmICghc2tiLT5pcHZzX3Byb3BlcnR5KQorCQlyZXR1cm4gTkZfQUNDRVBUOworCS8qIFRoZSBwYWNrZXQgd2FzIHNlbnQgZnJvbSBJUFZTLCBleGl0IHRoaXMgY2hhaW4gKi8KKwlyZXR1cm4gTkZfU1RPUDsKK30KKworX19zdW0xNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcF92c19nYXRoZXJfZnJhZ3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHVzZXIpCit7CisJaW50IGVyciA9IGlwX2RlZnJhZyhza2IsIHVzZXIpOworCisJaWYgKCFlcnIpCisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOworCisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CitzdGF0aWMgaW5saW5lIGludCBpcF92c19nYXRoZXJfZnJhZ3NfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdV9pbnQzMl90IHVzZXIpCit7CisJLyogVE9ETyBJUHY2OiBGaW5kIG91dCB3aGF0IHRvIGRvIGhlcmUgZm9yIElQdjYgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogUGFja2V0IGhhcyBiZWVuIG1hZGUgc3VmZmljaWVudGx5IHdyaXRhYmxlIGluIGNhbGxlcgorICogLSBpbm91dDogMT1pbi0+b3V0LCAwPW91dC0+aW4KKyAqLwordm9pZCBpcF92c19uYXRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgICAgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgaW5vdXQpCit7CisJc3RydWN0IGlwaGRyICppcGgJID0gaXBfaGRyKHNrYik7CisJdW5zaWduZWQgaW50IGljbXBfb2Zmc2V0ID0gaXBoLT5paGwqNDsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNtcGgJID0gKHN0cnVjdCBpY21waGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsKKwkJCQkJCSAgICAgIGljbXBfb2Zmc2V0KTsKKwlzdHJ1Y3QgaXBoZHIgKmNpcGgJID0gKHN0cnVjdCBpcGhkciAqKShpY21waCArIDEpOworCisJaWYgKGlub3V0KSB7CisJCWlwaC0+c2FkZHIgPSBjcC0+dmFkZHIuaXA7CisJCWlwX3NlbmRfY2hlY2soaXBoKTsKKwkJY2lwaC0+ZGFkZHIgPSBjcC0+dmFkZHIuaXA7CisJCWlwX3NlbmRfY2hlY2soY2lwaCk7CisJfSBlbHNlIHsKKwkJaXBoLT5kYWRkciA9IGNwLT5kYWRkci5pcDsKKwkJaXBfc2VuZF9jaGVjayhpcGgpOworCQljaXBoLT5zYWRkciA9IGNwLT5kYWRkci5pcDsKKwkJaXBfc2VuZF9jaGVjayhjaXBoKTsKKwl9CisKKwkvKiB0aGUgVENQL1VEUCBwb3J0ICovCisJaWYgKElQUFJPVE9fVENQID09IGNpcGgtPnByb3RvY29sIHx8IElQUFJPVE9fVURQID09IGNpcGgtPnByb3RvY29sKSB7CisJCV9fYmUxNiAqcG9ydHMgPSAodm9pZCAqKWNpcGggKyBjaXBoLT5paGwqNDsKKworCQlpZiAoaW5vdXQpCisJCQlwb3J0c1sxXSA9IGNwLT52cG9ydDsKKwkJZWxzZQorCQkJcG9ydHNbMF0gPSBjcC0+ZHBvcnQ7CisJfQorCisJLyogQW5kIGZpbmFsbHkgdGhlIElDTVAgY2hlY2tzdW0gKi8KKwlpY21waC0+Y2hlY2tzdW0gPSAwOworCWljbXBoLT5jaGVja3N1bSA9IGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWNtcF9vZmZzZXQpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwlpZiAoaW5vdXQpCisJCUlQX1ZTX0RCR19QS1QoMTEsIHBwLCBza2IsICh2b2lkICopY2lwaCAtICh2b2lkICopaXBoLAorCQkJIkZvcndhcmRpbmcgYWx0ZXJlZCBvdXRnb2luZyBJQ01QIik7CisJZWxzZQorCQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCAodm9pZCAqKWNpcGggLSAodm9pZCAqKWlwaCwKKwkJCSJGb3J3YXJkaW5nIGFsdGVyZWQgaW5jb21pbmcgSUNNUCIpOworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3ZvaWQgaXBfdnNfbmF0X2ljbXBfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICAgIHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGlub3V0KQoreworCXN0cnVjdCBpcHY2aGRyICppcGgJID0gaXB2Nl9oZHIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgaWNtcF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXN0cnVjdCBpY21wNmhkciAqaWNtcGgJID0gKHN0cnVjdCBpY21wNmhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCQkgICAgICBpY21wX29mZnNldCk7CisJc3RydWN0IGlwdjZoZHIgKmNpcGgJID0gKHN0cnVjdCBpcHY2aGRyICopKGljbXBoICsgMSk7CisKKwlpZiAoaW5vdXQpIHsKKwkJaXBoLT5zYWRkciA9IGNwLT52YWRkci5pbjY7CisJCWNpcGgtPmRhZGRyID0gY3AtPnZhZGRyLmluNjsKKwl9IGVsc2UgeworCQlpcGgtPmRhZGRyID0gY3AtPmRhZGRyLmluNjsKKwkJY2lwaC0+c2FkZHIgPSBjcC0+ZGFkZHIuaW42OworCX0KKworCS8qIHRoZSBUQ1AvVURQIHBvcnQgKi8KKwlpZiAoSVBQUk9UT19UQ1AgPT0gY2lwaC0+bmV4dGhkciB8fCBJUFBST1RPX1VEUCA9PSBjaXBoLT5uZXh0aGRyKSB7CisJCV9fYmUxNiAqcG9ydHMgPSAodm9pZCAqKWNpcGggKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCisJCWlmIChpbm91dCkKKwkJCXBvcnRzWzFdID0gY3AtPnZwb3J0OworCQllbHNlCisJCQlwb3J0c1swXSA9IGNwLT5kcG9ydDsKKwl9CisKKwkvKiBBbmQgZmluYWxseSB0aGUgSUNNUCBjaGVja3N1bSAqLworCWljbXBoLT5pY21wNl9ja3N1bSA9IDA7CisJLyogVE9ETyBJUHY2OiBpcyB0aGlzIGNvcnJlY3QgZm9yIElDTVB2Nj8gKi8KKwlpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGljbXBfb2Zmc2V0KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJaWYgKGlub3V0KQorCQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCAodm9pZCAqKWNpcGggLSAodm9pZCAqKWlwaCwKKwkJCSJGb3J3YXJkaW5nIGFsdGVyZWQgb3V0Z29pbmcgSUNNUHY2Iik7CisJZWxzZQorCQlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCAodm9pZCAqKWNpcGggLSAodm9pZCAqKWlwaCwKKwkJCSJGb3J3YXJkaW5nIGFsdGVyZWQgaW5jb21pbmcgSUNNUHY2Iik7Cit9CisjZW5kaWYKKworLyogSGFuZGxlIHJlbGV2YW50IHJlc3BvbnNlIElDTVAgbWVzc2FnZXMgLSBmb3J3YXJkIHRvIHRoZSByaWdodAorICogZGVzdGluYXRpb24gaG9zdC4gVXNlZCBmb3IgTkFUIGFuZCBsb2NhbCBjbGllbnQuCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Jlc3BvbnNlX2ljbXAoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXVuaW9uIG5mX2luZXRfYWRkciAqc25ldCwKKwkJCQlfX3U4IHByb3RvY29sLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCQkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgaWhsKQoreworCXVuc2lnbmVkIGludCB2ZXJkaWN0ID0gTkZfRFJPUDsKKworCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSAwKSB7CisJCUlQX1ZTX0VSUigic2hvdWxkbid0IHJlYWNoIGhlcmUsIGJlY2F1c2UgdGhlIGJveCBpcyBvbiB0aGUgIgorCQkJICAiaGFsZiBjb25uZWN0aW9uIGluIHRoZSB0dW4vZHIgbW9kdWxlLlxuIik7CisJfQorCisJLyogRW5zdXJlIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0ICovCisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgeworCQkvKiBGYWlsZWQgY2hlY2tzdW0hICovCisJCUlQX1ZTX0RCR19CVUYoMSwgIkZvcndhcmQgSUNNUDogZmFpbGVkIGNoZWNrc3VtIGZyb20gJXMhXG4iLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoYWYsIHNuZXQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKElQUFJPVE9fVENQID09IHByb3RvY29sIHx8IElQUFJPVE9fVURQID09IHByb3RvY29sKQorCQlvZmZzZXQgKz0gMiAqIHNpemVvZihfX3UxNik7CisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIG9mZnNldCkpCisJCWdvdG8gb3V0OworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCWlwX3ZzX25hdF9pY21wX3Y2KHNrYiwgcHAsIGNwLCAxKTsKKwllbHNlCisjZW5kaWYKKwkJaXBfdnNfbmF0X2ljbXAoc2tiLCBwcCwgY3AsIDEpOworCisJLyogZG8gdGhlIHN0YXRpc3RpY3MgYW5kIHB1dCBpdCBiYWNrICovCisJaXBfdnNfb3V0X3N0YXRzKGNwLCBza2IpOworCisJc2tiLT5pcHZzX3Byb3BlcnR5ID0gMTsKKwl2ZXJkaWN0ID0gTkZfQUNDRVBUOworCitvdXQ6CisJX19pcF92c19jb25uX3B1dChjcCk7CisKKwlyZXR1cm4gdmVyZGljdDsKK30KKworLyoKKyAqCUhhbmRsZSBJQ01QIG1lc3NhZ2VzIGluIHRoZSBpbnNpZGUtdG8tb3V0c2lkZSBkaXJlY3Rpb24gKG91dGdvaW5nKS4KKyAqCUZpbmQgYW55IHRoYXQgbWlnaHQgYmUgcmVsZXZhbnQsIGNoZWNrIGFnYWluc3QgZXhpc3RpbmcgY29ubmVjdGlvbnMuCisgKglDdXJyZW50bHkgaGFuZGxlcyBlcnJvciB0eXBlcyAtIHVucmVhY2hhYmxlLCBxdWVuY2gsIHR0bCBleGNlZWRlZC4KKyAqLworc3RhdGljIGludCBpcF92c19vdXRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKnJlbGF0ZWQpCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGljbXBoZHIJX2ljbXBoLCAqaWM7CisJc3RydWN0IGlwaGRyCV9jaXBoLCAqY2loOwkvKiBUaGUgaXAgaGVhZGVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIElDTVAgKi8KKwlzdHJ1Y3QgaXBfdnNfaXBoZHIgY2lwaDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpaGw7CisJdW5pb24gbmZfaW5ldF9hZGRyIHNuZXQ7CisKKwkqcmVsYXRlZCA9IDE7CisKKwkvKiByZWFzc2VtYmxlIElQIGZyYWdtZW50cyAqLworCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKKwkJaWYgKGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpKQorCQkJcmV0dXJuIE5GX1NUT0xFTjsKKwl9CisKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlvZmZzZXQgPSBpaGwgPSBpcGgtPmlobCAqIDQ7CisJaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaWNtcGgpLCAmX2ljbXBoKTsKKwlpZiAoaWMgPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0RST1A7CisKKwlJUF9WU19EQkcoMTIsICJPdXRnb2luZyBJQ01QICglZCwlZCkgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1XG4iLAorCQkgIGljLT50eXBlLCBudG9ocyhpY21wX2lkKGljKSksCisJCSAgTklQUVVBRChpcGgtPnNhZGRyKSwgTklQUVVBRChpcGgtPmRhZGRyKSk7CisKKwkvKgorCSAqIFdvcmsgdGhyb3VnaCBzZWVpbmcgaWYgdGhpcyBpcyBmb3IgdXMuCisJICogVGhlc2UgY2hlY2tzIGFyZSBzdXBwb3NlZCB0byBiZSBpbiBhbiBvcmRlciB0aGF0IG1lYW5zIGVhc3kKKwkgKiB0aGluZ3MgYXJlIGNoZWNrZWQgZmlyc3QgdG8gc3BlZWQgdXAgcHJvY2Vzc2luZy4uLi4gaG93ZXZlcgorCSAqIHRoaXMgbWVhbnMgdGhhdCBzb21lIHBhY2tldHMgd2lsbCBtYW5hZ2UgdG8gZ2V0IGEgbG9uZyB3YXkKKwkgKiBkb3duIHRoaXMgc3RhY2sgYW5kIHRoZW4gYmUgcmVqZWN0ZWQsIGJ1dCB0aGF0J3MgbGlmZS4KKwkgKi8KKwlpZiAoKGljLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIKSAmJgorCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9TT1VSQ0VfUVVFTkNIKSAmJgorCSAgICAoaWMtPnR5cGUgIT0gSUNNUF9USU1FX0VYQ0VFREVEKSkgeworCQkqcmVsYXRlZCA9IDA7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJLyogTm93IGZpbmQgdGhlIGNvbnRhaW5lZCBJUCBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gc2l6ZW9mKF9pY21waCk7CisJY2loID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2NpcGgpLCAmX2NpcGgpOworCWlmIChjaWggPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsgLyogVGhlIHBhY2tldCBsb29rcyB3cm9uZywgaWdub3JlICovCisKKwlwcCA9IGlwX3ZzX3Byb3RvX2dldChjaWgtPnByb3RvY29sKTsKKwlpZiAoIXBwKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogSXMgdGhlIGVtYmVkZGVkIHByb3RvY29sIGhlYWRlciBwcmVzZW50PyAqLworCWlmICh1bmxpa2VseShjaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSAmJgorCQkgICAgIHBwLT5kb250X2RlZnJhZykpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCBvZmZzZXQsICJDaGVja2luZyBvdXRnb2luZyBJQ01QIGZvciIpOworCisJb2Zmc2V0ICs9IGNpaC0+aWhsICogNDsKKworCWlwX3ZzX2ZpbGxfaXBoZHIoQUZfSU5FVCwgY2loLCAmY2lwaCk7CisJLyogVGhlIGVtYmVkZGVkIGhlYWRlcnMgY29udGFpbiBzb3VyY2UgYW5kIGRlc3QgaW4gcmV2ZXJzZSBvcmRlciAqLworCWNwID0gcHAtPmNvbm5fb3V0X2dldChBRl9JTkVULCBza2IsIHBwLCAmY2lwaCwgb2Zmc2V0LCAxKTsKKwlpZiAoIWNwKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJc25ldC5pcCA9IGlwaC0+c2FkZHI7CisJcmV0dXJuIGhhbmRsZV9yZXNwb25zZV9pY21wKEFGX0lORVQsIHNrYiwgJnNuZXQsIGNpaC0+cHJvdG9jb2wsIGNwLAorCQkJCSAgICBwcCwgb2Zmc2V0LCBpaGwpOworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3N0YXRpYyBpbnQgaXBfdnNfb3V0X2ljbXBfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpyZWxhdGVkKQoreworCXN0cnVjdCBpcHY2aGRyICppcGg7CisJc3RydWN0IGljbXA2aGRyCV9pY21waCwgKmljOworCXN0cnVjdCBpcHY2aGRyCV9jaXBoLCAqY2loOwkvKiBUaGUgaXAgaGVhZGVyIGNvbnRhaW5lZAorCQkJCQkgICB3aXRoaW4gdGhlIElDTVAgKi8KKwlzdHJ1Y3QgaXBfdnNfaXBoZHIgY2lwaDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuaW9uIG5mX2luZXRfYWRkciBzbmV0OworCisJKnJlbGF0ZWQgPSAxOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKwlpZiAoaXB2Nl9oZHIoc2tiKS0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UKSB7CisJCWlmIChpcF92c19nYXRoZXJfZnJhZ3NfdjYoc2tiLCBJUF9ERUZSQUdfVlNfT1VUKSkKKwkJCXJldHVybiBORl9TVE9MRU47CisJfQorCisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CisJaWYgKGljID09IE5VTEwpCisJCXJldHVybiBORl9EUk9QOworCisJSVBfVlNfREJHKDEyLCAiT3V0Z29pbmcgSUNNUHY2ICglZCwlZCkgIiBOSVA2X0ZNVCAiLT4iIE5JUDZfRk1UICJcbiIsCisJCSAgaWMtPmljbXA2X3R5cGUsIG50b2hzKGljbXB2Nl9pZChpYykpLAorCQkgIE5JUDYoaXBoLT5zYWRkciksIE5JUDYoaXBoLT5kYWRkcikpOworCisJLyoKKwkgKiBXb3JrIHRocm91Z2ggc2VlaW5nIGlmIHRoaXMgaXMgZm9yIHVzLgorCSAqIFRoZXNlIGNoZWNrcyBhcmUgc3VwcG9zZWQgdG8gYmUgaW4gYW4gb3JkZXIgdGhhdCBtZWFucyBlYXN5CisJICogdGhpbmdzIGFyZSBjaGVja2VkIGZpcnN0IHRvIHNwZWVkIHVwIHByb2Nlc3NpbmcuLi4uIGhvd2V2ZXIKKwkgKiB0aGlzIG1lYW5zIHRoYXQgc29tZSBwYWNrZXRzIHdpbGwgbWFuYWdlIHRvIGdldCBhIGxvbmcgd2F5CisJICogZG93biB0aGlzIHN0YWNrIGFuZCB0aGVuIGJlIHJlamVjdGVkLCBidXQgdGhhdCdzIGxpZmUuCisJICovCisJaWYgKChpYy0+aWNtcDZfdHlwZSAhPSBJQ01QVjZfREVTVF9VTlJFQUNIKSAmJgorCSAgICAoaWMtPmljbXA2X3R5cGUgIT0gSUNNUFY2X1BLVF9UT09CSUcpICYmCisJICAgIChpYy0+aWNtcDZfdHlwZSAhPSBJQ01QVjZfVElNRV9FWENFRUQpKSB7CisJCSpyZWxhdGVkID0gMDsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3cgZmluZCB0aGUgY29udGFpbmVkIElQIGhlYWRlciAqLworCW9mZnNldCArPSBzaXplb2YoX2ljbXBoKTsKKwljaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfY2lwaCksICZfY2lwaCk7CisJaWYgKGNpaCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOyAvKiBUaGUgcGFja2V0IGxvb2tzIHdyb25nLCBpZ25vcmUgKi8KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGNpaC0+bmV4dGhkcik7CisJaWYgKCFwcCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIElzIHRoZSBlbWJlZGRlZCBwcm90b2NvbCBoZWFkZXIgcHJlc2VudD8gKi8KKwkvKiBUT0RPOiB3ZSBkb24ndCBzdXBwb3J0IGZyYWdtZW50YXRpb24gYXQgdGhlIG1vbWVudCBhbnl3YXlzICovCisJaWYgKHVubGlrZWx5KGNpaC0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UICYmIHBwLT5kb250X2RlZnJhZykpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCBvZmZzZXQsICJDaGVja2luZyBvdXRnb2luZyBJQ01QdjYgZm9yIik7CisKKwlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKworCWlwX3ZzX2ZpbGxfaXBoZHIoQUZfSU5FVDYsIGNpaCwgJmNpcGgpOworCS8qIFRoZSBlbWJlZGRlZCBoZWFkZXJzIGNvbnRhaW4gc291cmNlIGFuZCBkZXN0IGluIHJldmVyc2Ugb3JkZXIgKi8KKwljcCA9IHBwLT5jb25uX291dF9nZXQoQUZfSU5FVDYsIHNrYiwgcHAsICZjaXBoLCBvZmZzZXQsIDEpOworCWlmICghY3ApCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlpcHY2X2FkZHJfY29weSgmc25ldC5pbjYsICZpcGgtPnNhZGRyKTsKKwlyZXR1cm4gaGFuZGxlX3Jlc3BvbnNlX2ljbXAoQUZfSU5FVDYsIHNrYiwgJnNuZXQsIGNpaC0+bmV4dGhkciwgY3AsCisJCQkJICAgIHBwLCBvZmZzZXQsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3RjcF9yZXNldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhfbGVuKQoreworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKworCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhfbGVuLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdGgtPnJzdDsKK30KKworLyogSGFuZGxlIHJlc3BvbnNlIHBhY2tldHM6IHJld3JpdGUgYWRkcmVzc2VzIGFuZCBzZW5kIGF3YXkuLi4KKyAqIFVzZWQgZm9yIE5BVCBhbmQgbG9jYWwgY2xpZW50LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitoYW5kbGVfcmVzcG9uc2UoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBpaGwpCit7CisJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgMCwgIk91dGdvaW5nIHBhY2tldCIpOworCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIGlobCkpCisJCWdvdG8gZHJvcDsKKworCS8qIG1hbmdsZSB0aGUgcGFja2V0ICovCisJaWYgKHBwLT5zbmF0X2hhbmRsZXIgJiYgIXBwLT5zbmF0X2hhbmRsZXIoc2tiLCBwcCwgY3ApKQorCQlnb3RvIGRyb3A7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJaXB2Nl9oZHIoc2tiKS0+c2FkZHIgPSBjcC0+dmFkZHIuaW42OworCWVsc2UKKyNlbmRpZgorCXsKKwkJaXBfaGRyKHNrYiktPnNhZGRyID0gY3AtPnZhZGRyLmlwOworCQlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKKwl9CisKKwkvKiBGb3IgcG9saWN5IHJvdXRpbmcsIHBhY2tldHMgb3JpZ2luYXRpbmcgZnJvbSB0aGlzCisJICogbWFjaGluZSBpdHNlbGYgbWF5IGJlIHJvdXRlZCBkaWZmZXJlbnRseSB0byBwYWNrZXRzCisJICogcGFzc2luZyB0aHJvdWdoLiAgV2Ugd2FudCB0aGlzIHBhY2tldCB0byBiZSByb3V0ZWQgYXMKKwkgKiBpZiBpdCBjYW1lIGZyb20gdGhpcyBtYWNoaW5lIGl0c2VsZi4gIFNvIHJlLWNvbXB1dGUKKwkgKiB0aGUgcm91dGluZyBpbmZvcm1hdGlvbi4KKwkgKi8KKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQlpZiAoaXA2X3JvdXRlX21lX2hhcmRlcihza2IpICE9IDApCisJCQlnb3RvIGRyb3A7CisJfSBlbHNlCisjZW5kaWYKKwkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihza2IsIFJUTl9MT0NBTCkgIT0gMCkKKwkJCWdvdG8gZHJvcDsKKworCUlQX1ZTX0RCR19QS1QoMTAsIHBwLCBza2IsIDAsICJBZnRlciBTTkFUIik7CisKKwlpcF92c19vdXRfc3RhdHMoY3AsIHNrYik7CisJaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfT1VUUFVULCBza2IsIHBwKTsKKwlpcF92c19jb25uX3B1dChjcCk7CisKKwlza2ItPmlwdnNfcHJvcGVydHkgPSAxOworCisJTGVhdmVGdW5jdGlvbigxMSk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKworZHJvcDoKKwlpcF92c19jb25uX3B1dChjcCk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5GX1NUT0xFTjsKK30KKworLyoKKyAqCUl0IGlzIGhvb2tlZCBhdCB0aGUgTkZfSU5FVF9GT1JXQVJEIGNoYWluLCB1c2VkIG9ubHkgZm9yIFZTL05BVC4KKyAqCUNoZWNrIGlmIG91dGdvaW5nIHBhY2tldCBiZWxvbmdzIHRvIHRoZSBlc3RhYmxpc2hlZCBpcF92c19jb25uLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcF92c19vdXQodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgaXBfdnNfaXBoZHIgaXBoOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCWludCBhZjsKKworCUVudGVyRnVuY3Rpb24oMTEpOworCisJYWYgPSAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpID8gQUZfSU5FVCA6IEFGX0lORVQ2OworCisJaWYgKHNrYi0+aXB2c19wcm9wZXJ0eSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWlwX3ZzX2ZpbGxfaXBoZHIoYWYsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCAmaXBoKTsKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQlpZiAodW5saWtlbHkoaXBoLnByb3RvY29sID09IElQUFJPVE9fSUNNUFY2KSkgeworCQkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19vdXRfaWNtcF92Nihza2IsICZyZWxhdGVkKTsKKworCQkJaWYgKHJlbGF0ZWQpCisJCQkJcmV0dXJuIHZlcmRpY3Q7CisJCQlpcF92c19maWxsX2lwaGRyKGFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCQlpZiAodW5saWtlbHkoaXBoLnByb3RvY29sID09IElQUFJPVE9fSUNNUCkpIHsKKwkJCWludCByZWxhdGVkLCB2ZXJkaWN0ID0gaXBfdnNfb3V0X2ljbXAoc2tiLCAmcmVsYXRlZCk7CisKKwkJCWlmIChyZWxhdGVkKQorCQkJCXJldHVybiB2ZXJkaWN0OworCQkJaXBfdnNfZmlsbF9pcGhkcihhZiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksICZpcGgpOworCQl9CisKKwlwcCA9IGlwX3ZzX3Byb3RvX2dldChpcGgucHJvdG9jb2wpOworCWlmICh1bmxpa2VseSghcHApKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQlpZiAodW5saWtlbHkoaXBoLnByb3RvY29sID09IElQUFJPVE9fSUNNUFY2KSkgeworCQkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19vdXRfaWNtcF92Nihza2IsICZyZWxhdGVkKTsKKworCQkJaWYgKHJlbGF0ZWQpCisJCQkJcmV0dXJuIHZlcmRpY3Q7CisKKwkJCWlwX3ZzX2ZpbGxfaXBoZHIoYWYsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCAmaXBoKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJCWlmICh1bmxpa2VseShpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpICYmCisJCQkgICAgICFwcC0+ZG9udF9kZWZyYWcpKSB7CisJCQlpZiAoaXBfdnNfZ2F0aGVyX2ZyYWdzKHNrYiwgSVBfREVGUkFHX1ZTX09VVCkpCisJCQkJcmV0dXJuIE5GX1NUT0xFTjsKKworCQkJaXBfdnNfZmlsbF9pcGhkcihhZiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksICZpcGgpOworCQl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBwYWNrZXQgYmVsb25ncyB0byBhbiBleGlzdGluZyBlbnRyeQorCSAqLworCWNwID0gcHAtPmNvbm5fb3V0X2dldChhZiwgc2tiLCBwcCwgJmlwaCwgaXBoLmxlbiwgMCk7CisKKwlpZiAodW5saWtlbHkoIWNwKSkgeworCQlpZiAoc3lzY3RsX2lwX3ZzX25hdF9pY21wX3NlbmQgJiYKKwkJICAgIChwcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwKKwkJICAgICBwcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7CisJCQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCQkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC5sZW4sCisJCQkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCQkJaWYgKHBwdHIgPT0gTlVMTCkKKwkJCQlyZXR1cm4gTkZfQUNDRVBUOwkvKiBOb3QgZm9yIG1lICovCisJCQlpZiAoaXBfdnNfbG9va3VwX3JlYWxfc2VydmljZShhZiwgaXBoLnByb3RvY29sLAorCQkJCQkJICAgICAgJmlwaC5zYWRkciwKKwkJCQkJCSAgICAgIHBwdHJbMF0pKSB7CisJCQkJLyoKKwkJCQkgKiBOb3RpZnkgdGhlIHJlYWwgc2VydmVyOiB0aGVyZSBpcyBubworCQkJCSAqIGV4aXN0aW5nIGVudHJ5IGlmIGl0IGlzIG5vdCBSU1QKKwkJCQkgKiBwYWNrZXQgb3Igbm90IFRDUCBwYWNrZXQuCisJCQkJICovCisJCQkJaWYgKGlwaC5wcm90b2NvbCAhPSBJUFBST1RPX1RDUAorCQkJCSAgICB8fCAhaXNfdGNwX3Jlc2V0KHNrYiwgaXBoLmxlbikpIHsKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCQkJCQlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCQkJCQlpY21wdjZfc2VuZChza2IsCisJCQkJCQkJICAgIElDTVBWNl9ERVNUX1VOUkVBQ0gsCisJCQkJCQkJICAgIElDTVBWNl9QT1JUX1VOUkVBQ0gsCisJCQkJCQkJICAgIDAsIHNrYi0+ZGV2KTsKKwkJCQkJZWxzZQorI2VuZGlmCisJCQkJCQlpY21wX3NlbmQoc2tiLAorCQkJCQkJCSAgSUNNUF9ERVNUX1VOUkVBQ0gsCisJCQkJCQkJICBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7CisJCQkJCXJldHVybiBORl9EUk9QOworCQkJCX0KKwkJCX0KKwkJfQorCQlJUF9WU19EQkdfUEtUKDEyLCBwcCwgc2tiLCAwLAorCQkJICAgICAgInBhY2tldCBjb250aW51ZXMgdHJhdmVyc2FsIGFzIG5vcm1hbCIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKworCXJldHVybiBoYW5kbGVfcmVzcG9uc2UoYWYsIHNrYiwgcHAsIGNwLCBpcGgubGVuKTsKK30KKworCisvKgorICoJSGFuZGxlIElDTVAgbWVzc2FnZXMgaW4gdGhlIG91dHNpZGUtdG8taW5zaWRlIGRpcmVjdGlvbiAoaW5jb21pbmcpLgorICoJRmluZCBhbnkgdGhhdCBtaWdodCBiZSByZWxldmFudCwgY2hlY2sgYWdhaW5zdCBleGlzdGluZyBjb25uZWN0aW9ucywKKyAqCWZvcndhcmQgdG8gdGhlIHJpZ2h0IGRlc3RpbmF0aW9uIGhvc3QgaWYgcmVsZXZhbnQuCisgKglDdXJyZW50bHkgaGFuZGxlcyBlcnJvciB0eXBlcyAtIHVucmVhY2hhYmxlLCBxdWVuY2gsIHR0bCBleGNlZWRlZC4KKyAqLworc3RhdGljIGludAoraXBfdnNfaW5faWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKnJlbGF0ZWQsIHVuc2lnbmVkIGludCBob29rbnVtKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBpY21waGRyCV9pY21waCwgKmljOworCXN0cnVjdCBpcGhkcglfY2lwaCwgKmNpaDsJLyogVGhlIGlwIGhlYWRlciBjb250YWluZWQgd2l0aGluIHRoZSBJQ01QICovCisJc3RydWN0IGlwX3ZzX2lwaGRyIGNpcGg7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJdW5zaWduZWQgaW50IG9mZnNldCwgaWhsLCB2ZXJkaWN0OworCXVuaW9uIG5mX2luZXRfYWRkciBzbmV0OworCisJKnJlbGF0ZWQgPSAxOworCisJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KKwlpZiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSB7CisJCWlmIChpcF92c19nYXRoZXJfZnJhZ3Moc2tiLCBob29rbnVtID09IE5GX0lORVRfTE9DQUxfSU4gPworCQkJCQkgICAgSVBfREVGUkFHX1ZTX0lOIDogSVBfREVGUkFHX1ZTX0ZXRCkpCisJCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKworCWlwaCA9IGlwX2hkcihza2IpOworCW9mZnNldCA9IGlobCA9IGlwaC0+aWhsICogNDsKKwlpYyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWlmIChpYyA9PSBOVUxMKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCUlQX1ZTX0RCRygxMiwgIkluY29taW5nIElDTVAgKCVkLCVkKSAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXVcbiIsCisJCSAgaWMtPnR5cGUsIG50b2hzKGljbXBfaWQoaWMpKSwKKwkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLCBOSVBRVUFEKGlwaC0+ZGFkZHIpKTsKKworCS8qCisJICogV29yayB0aHJvdWdoIHNlZWluZyBpZiB0aGlzIGlzIGZvciB1cy4KKwkgKiBUaGVzZSBjaGVja3MgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGFuIG9yZGVyIHRoYXQgbWVhbnMgZWFzeQorCSAqIHRoaW5ncyBhcmUgY2hlY2tlZCBmaXJzdCB0byBzcGVlZCB1cCBwcm9jZXNzaW5nLi4uLiBob3dldmVyCisJICogdGhpcyBtZWFucyB0aGF0IHNvbWUgcGFja2V0cyB3aWxsIG1hbmFnZSB0byBnZXQgYSBsb25nIHdheQorCSAqIGRvd24gdGhpcyBzdGFjayBhbmQgdGhlbiBiZSByZWplY3RlZCwgYnV0IHRoYXQncyBsaWZlLgorCSAqLworCWlmICgoaWMtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1NPVVJDRV9RVUVOQ0gpICYmCisJICAgIChpYy0+dHlwZSAhPSBJQ01QX1RJTUVfRVhDRUVERUQpKSB7CisJCSpyZWxhdGVkID0gMDsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3cgZmluZCB0aGUgY29udGFpbmVkIElQIGhlYWRlciAqLworCW9mZnNldCArPSBzaXplb2YoX2ljbXBoKTsKKwljaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfY2lwaCksICZfY2lwaCk7CisJaWYgKGNpaCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOyAvKiBUaGUgcGFja2V0IGxvb2tzIHdyb25nLCBpZ25vcmUgKi8KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGNpaC0+cHJvdG9jb2wpOworCWlmICghcHApCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBJcyB0aGUgZW1iZWRkZWQgcHJvdG9jb2wgaGVhZGVyIHByZXNlbnQ/ICovCisJaWYgKHVubGlrZWx5KGNpaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpICYmCisJCSAgICAgcHAtPmRvbnRfZGVmcmFnKSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCUlQX1ZTX0RCR19QS1QoMTEsIHBwLCBza2IsIG9mZnNldCwgIkNoZWNraW5nIGluY29taW5nIElDTVAgZm9yIik7CisKKwlvZmZzZXQgKz0gY2loLT5paGwgKiA0OworCisJaXBfdnNfZmlsbF9pcGhkcihBRl9JTkVULCBjaWgsICZjaXBoKTsKKwkvKiBUaGUgZW1iZWRkZWQgaGVhZGVycyBjb250YWluIHNvdXJjZSBhbmQgZGVzdCBpbiByZXZlcnNlIG9yZGVyICovCisJY3AgPSBwcC0+Y29ubl9pbl9nZXQoQUZfSU5FVCwgc2tiLCBwcCwgJmNpcGgsIG9mZnNldCwgMSk7CisJaWYgKCFjcCkgeworCQkvKiBUaGUgcGFja2V0IGNvdWxkIGFsc28gYmVsb25nIHRvIGEgbG9jYWwgY2xpZW50ICovCisJCWNwID0gcHAtPmNvbm5fb3V0X2dldChBRl9JTkVULCBza2IsIHBwLCAmY2lwaCwgb2Zmc2V0LCAxKTsKKwkJaWYgKGNwKSB7CisJCQlzbmV0LmlwID0gaXBoLT5zYWRkcjsKKwkJCXJldHVybiBoYW5kbGVfcmVzcG9uc2VfaWNtcChBRl9JTkVULCBza2IsICZzbmV0LAorCQkJCQkJICAgIGNpaC0+cHJvdG9jb2wsIGNwLCBwcCwKKwkJCQkJCSAgICBvZmZzZXQsIGlobCk7CisJCX0KKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwl2ZXJkaWN0ID0gTkZfRFJPUDsKKworCS8qIEVuc3VyZSB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdCAqLworCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGlobCkpIHsKKwkJLyogRmFpbGVkIGNoZWNrc3VtISAqLworCQlJUF9WU19EQkcoMSwgIkluY29taW5nIElDTVA6IGZhaWxlZCBjaGVja3N1bSBmcm9tICVkLiVkLiVkLiVkIVxuIiwKKwkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGRvIHRoZSBzdGF0aXN0aWNzIGFuZCBwdXQgaXQgYmFjayAqLworCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOworCWlmIChJUFBST1RPX1RDUCA9PSBjaWgtPnByb3RvY29sIHx8IElQUFJPVE9fVURQID09IGNpaC0+cHJvdG9jb2wpCisJCW9mZnNldCArPSAyICogc2l6ZW9mKF9fdTE2KTsKKwl2ZXJkaWN0ID0gaXBfdnNfaWNtcF94bWl0KHNrYiwgY3AsIHBwLCBvZmZzZXQpOworCS8qIGRvIG5vdCB0b3VjaCBza2IgYW55bW9yZSAqLworCisgIG91dDoKKwlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKKworCXJldHVybiB2ZXJkaWN0OworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3N0YXRpYyBpbnQKK2lwX3ZzX2luX2ljbXBfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpyZWxhdGVkLCB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoOworCXN0cnVjdCBpY21wNmhkcglfaWNtcGgsICppYzsKKwlzdHJ1Y3QgaXB2NmhkcglfY2lwaCwgKmNpaDsJLyogVGhlIGlwIGhlYWRlciBjb250YWluZWQKKwkJCQkJICAgd2l0aGluIHRoZSBJQ01QICovCisJc3RydWN0IGlwX3ZzX2lwaGRyIGNpcGg7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHA7CisJdW5zaWduZWQgaW50IG9mZnNldCwgdmVyZGljdDsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgc25ldDsKKworCSpyZWxhdGVkID0gMTsKKworCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCisJaWYgKGlwdjZfaGRyKHNrYiktPm5leHRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCkgeworCQlpZiAoaXBfdnNfZ2F0aGVyX2ZyYWdzX3Y2KHNrYiwgaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX0lOID8KKwkJCQkJICAgICAgIElQX0RFRlJBR19WU19JTiA6CisJCQkJCSAgICAgICBJUF9ERUZSQUdfVlNfRldEKSkKKwkJCXJldHVybiBORl9TVE9MRU47CisJfQorCisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CisJaWYgKGljID09IE5VTEwpCisJCXJldHVybiBORl9EUk9QOworCisJSVBfVlNfREJHKDEyLCAiSW5jb21pbmcgSUNNUHY2ICglZCwlZCkgIiBOSVA2X0ZNVCAiLT4iIE5JUDZfRk1UICJcbiIsCisJCSAgaWMtPmljbXA2X3R5cGUsIG50b2hzKGljbXB2Nl9pZChpYykpLAorCQkgIE5JUDYoaXBoLT5zYWRkciksIE5JUDYoaXBoLT5kYWRkcikpOworCisJLyoKKwkgKiBXb3JrIHRocm91Z2ggc2VlaW5nIGlmIHRoaXMgaXMgZm9yIHVzLgorCSAqIFRoZXNlIGNoZWNrcyBhcmUgc3VwcG9zZWQgdG8gYmUgaW4gYW4gb3JkZXIgdGhhdCBtZWFucyBlYXN5CisJICogdGhpbmdzIGFyZSBjaGVja2VkIGZpcnN0IHRvIHNwZWVkIHVwIHByb2Nlc3NpbmcuLi4uIGhvd2V2ZXIKKwkgKiB0aGlzIG1lYW5zIHRoYXQgc29tZSBwYWNrZXRzIHdpbGwgbWFuYWdlIHRvIGdldCBhIGxvbmcgd2F5CisJICogZG93biB0aGlzIHN0YWNrIGFuZCB0aGVuIGJlIHJlamVjdGVkLCBidXQgdGhhdCdzIGxpZmUuCisJICovCisJaWYgKChpYy0+aWNtcDZfdHlwZSAhPSBJQ01QVjZfREVTVF9VTlJFQUNIKSAmJgorCSAgICAoaWMtPmljbXA2X3R5cGUgIT0gSUNNUFY2X1BLVF9UT09CSUcpICYmCisJICAgIChpYy0+aWNtcDZfdHlwZSAhPSBJQ01QVjZfVElNRV9FWENFRUQpKSB7CisJCSpyZWxhdGVkID0gMDsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwkvKiBOb3cgZmluZCB0aGUgY29udGFpbmVkIElQIGhlYWRlciAqLworCW9mZnNldCArPSBzaXplb2YoX2ljbXBoKTsKKwljaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfY2lwaCksICZfY2lwaCk7CisJaWYgKGNpaCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfQUNDRVBUOyAvKiBUaGUgcGFja2V0IGxvb2tzIHdyb25nLCBpZ25vcmUgKi8KKworCXBwID0gaXBfdnNfcHJvdG9fZ2V0KGNpaC0+bmV4dGhkcik7CisJaWYgKCFwcCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIElzIHRoZSBlbWJlZGRlZCBwcm90b2NvbCBoZWFkZXIgcHJlc2VudD8gKi8KKwkvKiBUT0RPOiB3ZSBkb24ndCBzdXBwb3J0IGZyYWdtZW50YXRpb24gYXQgdGhlIG1vbWVudCBhbnl3YXlzICovCisJaWYgKHVubGlrZWx5KGNpaC0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UICYmIHBwLT5kb250X2RlZnJhZykpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlJUF9WU19EQkdfUEtUKDExLCBwcCwgc2tiLCBvZmZzZXQsICJDaGVja2luZyBpbmNvbWluZyBJQ01QdjYgZm9yIik7CisKKwlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKworCWlwX3ZzX2ZpbGxfaXBoZHIoQUZfSU5FVDYsIGNpaCwgJmNpcGgpOworCS8qIFRoZSBlbWJlZGRlZCBoZWFkZXJzIGNvbnRhaW4gc291cmNlIGFuZCBkZXN0IGluIHJldmVyc2Ugb3JkZXIgKi8KKwljcCA9IHBwLT5jb25uX2luX2dldChBRl9JTkVUNiwgc2tiLCBwcCwgJmNpcGgsIG9mZnNldCwgMSk7CisJaWYgKCFjcCkgeworCQkvKiBUaGUgcGFja2V0IGNvdWxkIGFsc28gYmVsb25nIHRvIGEgbG9jYWwgY2xpZW50ICovCisJCWNwID0gcHAtPmNvbm5fb3V0X2dldChBRl9JTkVUNiwgc2tiLCBwcCwgJmNpcGgsIG9mZnNldCwgMSk7CisJCWlmIChjcCkgeworCQkJaXB2Nl9hZGRyX2NvcHkoJnNuZXQuaW42LCAmaXBoLT5zYWRkcik7CisJCQlyZXR1cm4gaGFuZGxlX3Jlc3BvbnNlX2ljbXAoQUZfSU5FVDYsIHNrYiwgJnNuZXQsCisJCQkJCQkgICAgY2loLT5uZXh0aGRyLAorCQkJCQkJICAgIGNwLCBwcCwgb2Zmc2V0LAorCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQl9CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJdmVyZGljdCA9IE5GX0RST1A7CisKKwkvKiBkbyB0aGUgc3RhdGlzdGljcyBhbmQgcHV0IGl0IGJhY2sgKi8KKwlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKKwlpZiAoSVBQUk9UT19UQ1AgPT0gY2loLT5uZXh0aGRyIHx8IElQUFJPVE9fVURQID09IGNpaC0+bmV4dGhkcikKKwkJb2Zmc2V0ICs9IDIgKiBzaXplb2YoX191MTYpOworCXZlcmRpY3QgPSBpcF92c19pY21wX3htaXRfdjYoc2tiLCBjcCwgcHAsIG9mZnNldCk7CisJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCisKKwlfX2lwX3ZzX2Nvbm5fcHV0KGNwKTsKKworCXJldHVybiB2ZXJkaWN0OworfQorI2VuZGlmCisKKworLyoKKyAqCUNoZWNrIGlmIGl0J3MgZm9yIHZpcnR1YWwgc2VydmljZXMsIGxvb2sgaXQgdXAsCisgKglhbmQgc2VuZCBpdCBvbiBpdHMgd2F5Li4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwX3ZzX2luKHVuc2lnbmVkIGludCBob29rbnVtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXN0cnVjdCBpcF92c19pcGhkciBpcGg7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJaW50IHJldCwgcmVzdGFydCwgYWY7CisKKwlhZiA9IChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgPyBBRl9JTkVUIDogQUZfSU5FVDY7CisKKwlpcF92c19maWxsX2lwaGRyKGFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CisKKwkvKgorCSAqCUJpZyB0YXBwbzogb25seSBQQUNLRVRfSE9TVCwgaW5jbHVkaW5nIGxvb3BiYWNrIGZvciBsb2NhbCBjbGllbnQKKwkgKglEb24ndCBoYW5kbGUgbG9jYWwgcGFja2V0cyBvbiBJUHY2IGZvciBub3cKKwkgKi8KKwlpZiAodW5saWtlbHkoc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkpIHsKKwkJSVBfVlNfREJHX0JVRigxMiwgInBhY2tldCB0eXBlPSVkIHByb3RvPSVkIGRhZGRyPSVzIGlnbm9yZWRcbiIsCisJCQkgICAgICBza2ItPnBrdF90eXBlLAorCQkJICAgICAgaXBoLnByb3RvY29sLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoYWYsICZpcGguZGFkZHIpKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwlpZiAodW5saWtlbHkoaXBoLnByb3RvY29sID09IElQUFJPVE9fSUNNUCkpIHsKKwkJaW50IHJlbGF0ZWQsIHZlcmRpY3QgPSBpcF92c19pbl9pY21wKHNrYiwgJnJlbGF0ZWQsIGhvb2tudW0pOworCisJCWlmIChyZWxhdGVkKQorCQkJcmV0dXJuIHZlcmRpY3Q7CisJCWlwX3ZzX2ZpbGxfaXBoZHIoYWYsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCAmaXBoKTsKKwl9CisKKwkvKiBQcm90b2NvbCBzdXBwb3J0ZWQ/ICovCisJcHAgPSBpcF92c19wcm90b19nZXQoaXBoLnByb3RvY29sKTsKKwlpZiAodW5saWtlbHkoIXBwKSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHBhY2tldCBiZWxvbmdzIHRvIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gZW50cnkKKwkgKi8KKwljcCA9IHBwLT5jb25uX2luX2dldChhZiwgc2tiLCBwcCwgJmlwaCwgaXBoLmxlbiwgMCk7CisKKwlpZiAodW5saWtlbHkoIWNwKSkgeworCQlpbnQgdjsKKworCQkvKiBGb3IgbG9jYWwgY2xpZW50IHBhY2tldHMsIGl0IGNvdWxkIGJlIGEgcmVzcG9uc2UgKi8KKwkJY3AgPSBwcC0+Y29ubl9vdXRfZ2V0KGFmLCBza2IsIHBwLCAmaXBoLCBpcGgubGVuLCAwKTsKKwkJaWYgKGNwKQorCQkJcmV0dXJuIGhhbmRsZV9yZXNwb25zZShhZiwgc2tiLCBwcCwgY3AsIGlwaC5sZW4pOworCisJCWlmICghcHAtPmNvbm5fc2NoZWR1bGUoYWYsIHNrYiwgcHAsICZ2LCAmY3ApKQorCQkJcmV0dXJuIHY7CisJfQorCisJaWYgKHVubGlrZWx5KCFjcCkpIHsKKwkJLyogc29ycnksIGFsbCB0aGlzIHRyb3VibGUgZm9yIGEgbm8taGl0IDopICovCisJCUlQX1ZTX0RCR19QS1QoMTIsIHBwLCBza2IsIDAsCisJCQkgICAgICAicGFja2V0IGNvbnRpbnVlcyB0cmF2ZXJzYWwgYXMgbm9ybWFsIik7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCisJSVBfVlNfREJHX1BLVCgxMSwgcHAsIHNrYiwgMCwgIkluY29taW5nIHBhY2tldCIpOworCisJLyogQ2hlY2sgdGhlIHNlcnZlciBzdGF0dXMgKi8KKwlpZiAoY3AtPmRlc3QgJiYgIShjcC0+ZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQkvKiB0aGUgZGVzdGluYXRpb24gc2VydmVyIGlzIG5vdCBhdmFpbGFibGUgKi8KKworCQlpZiAoc3lzY3RsX2lwX3ZzX2V4cGlyZV9ub2Rlc3RfY29ubikgeworCQkJLyogdHJ5IHRvIGV4cGlyZSB0aGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseSAqLworCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKKwkJfQorCQkvKiBkb24ndCByZXN0YXJ0IGl0cyB0aW1lciwgYW5kIHNpbGVudGx5CisJCSAgIGRyb3AgdGhlIHBhY2tldC4gKi8KKwkJX19pcF92c19jb25uX3B1dChjcCk7CisJCXJldHVybiBORl9EUk9QOworCX0KKworCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOworCXJlc3RhcnQgPSBpcF92c19zZXRfc3RhdGUoY3AsIElQX1ZTX0RJUl9JTlBVVCwgc2tiLCBwcCk7CisJaWYgKGNwLT5wYWNrZXRfeG1pdCkKKwkJcmV0ID0gY3AtPnBhY2tldF94bWl0KHNrYiwgY3AsIHBwKTsKKwkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCisJZWxzZSB7CisJCUlQX1ZTX0RCR19STCgid2FybmluZzogcGFja2V0X3htaXQgaXMgbnVsbCIpOworCQlyZXQgPSBORl9BQ0NFUFQ7CisJfQorCisJLyogSW5jcmVhc2UgaXRzIHBhY2tldCBjb3VudGVyIGFuZCBjaGVjayBpZiBpdCBpcyBuZWVkZWQKKwkgKiB0byBiZSBzeW5jaHJvbml6ZWQKKwkgKgorCSAqIFN5bmMgY29ubmVjdGlvbiBpZiBpdCBpcyBhYm91dCB0byBjbG9zZSB0bworCSAqIGVuY29yYWdlIHRoZSBzdGFuZGJ5IHNlcnZlcnMgdG8gdXBkYXRlIHRoZSBjb25uZWN0aW9ucyB0aW1lb3V0CisJICovCisJYXRvbWljX2luYygmY3AtPmluX3BrdHMpOworCWlmIChhZiA9PSBBRl9JTkVUICYmCisJICAgIChpcF92c19zeW5jX3N0YXRlICYgSVBfVlNfU1RBVEVfTUFTVEVSKSAmJgorCSAgICAoKChjcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgfHwKKwkgICAgICAgY3AtPnN0YXRlID09IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSAmJgorCSAgICAgIChhdG9taWNfcmVhZCgmY3AtPmluX3BrdHMpICUgc3lzY3RsX2lwX3ZzX3N5bmNfdGhyZXNob2xkWzFdCisJICAgICAgID09IHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFswXSkpIHx8CisJICAgICAoKGNwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgJiYgKGNwLT5vbGRfc3RhdGUgIT0gY3AtPnN0YXRlKSAmJgorCSAgICAgICgoY3AtPnN0YXRlID09IElQX1ZTX1RDUF9TX0ZJTl9XQUlUKSB8fAorCSAgICAgICAoY3AtPnN0YXRlID09IElQX1ZTX1RDUF9TX0NMT1NFX1dBSVQpIHx8CisJICAgICAgIChjcC0+c3RhdGUgPT0gSVBfVlNfVENQX1NfVElNRV9XQUlUKSkpKSkKKwkJaXBfdnNfc3luY19jb25uKGNwKTsKKwljcC0+b2xkX3N0YXRlID0gY3AtPnN0YXRlOworCisJaXBfdnNfY29ubl9wdXQoY3ApOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqCUl0IGlzIGhvb2tlZCBhdCB0aGUgTkZfSU5FVF9GT1JXQVJEIGNoYWluLCBpbiBvcmRlciB0byBjYXRjaCBJQ01QCisgKiAgICAgIHJlbGF0ZWQgcGFja2V0cyBkZXN0aW5lZCBmb3IgMC4wLjAuMC8wLgorICogICAgICBXaGVuIGZ3bWFyay1iYXNlZCB2aXJ0dWFsIHNlcnZpY2UgaXMgdXNlZCwgc3VjaCBhcyB0cmFuc3BhcmVudAorICogICAgICBjYWNoZSBjbHVzdGVyLCBUQ1AgcGFja2V0cyBjYW4gYmUgbWFya2VkIGFuZCByb3V0ZWQgdG8gaXBfdnNfaW4sCisgKiAgICAgIGJ1dCBJQ01QIGRlc3RpbmVkIGZvciAwLjAuMC4wLzAgY2Fubm90IG5vdCBiZSBlYXNpbHkgbWFya2VkIGFuZAorICogICAgICBzZW50IHRvIGlwX3ZzX2luX2ljbXAuIFNvLCBjYXRjaCB0aGVtIGF0IHRoZSBORl9JTkVUX0ZPUldBUkQgY2hhaW4KKyAqICAgICAgYW5kIHNlbmQgdGhlbSB0byBpcF92c19pbl9pY21wLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpcF92c19mb3J3YXJkX2ljbXAodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJaW50IHI7CisKKwlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCXJldHVybiBpcF92c19pbl9pY21wKHNrYiwgJnIsIGhvb2tudW0pOworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwX3ZzX2ZvcndhcmRfaWNtcF92Nih1bnNpZ25lZCBpbnQgaG9va251bSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlpbnQgcjsKKworCWlmIChpcHY2X2hkcihza2IpLT5uZXh0aGRyICE9IElQUFJPVE9fSUNNUFY2KQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJcmV0dXJuIGlwX3ZzX2luX2ljbXBfdjYoc2tiLCAmciwgaG9va251bSk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX3ZzX29wc1tdIF9fcmVhZF9tb3N0bHkgPSB7CisJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgZm9yd2FyZCBwYWNrZXQgdGhyb3VnaCBWUy9EUiwgVlMvVFVOLAorCSAqIG9yIFZTL05BVChjaGFuZ2UgZGVzdGluYXRpb24pLCBzbyB0aGF0IGZpbHRlcmluZyBydWxlcyBjYW4gYmUKKwkgKiBhcHBsaWVkIHRvIElQVlMuICovCisJeworCQkuaG9vawkJPSBpcF92c19pbiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9MT0NBTF9JTiwKKwkJLnByaW9yaXR5ICAgICAgID0gMTAwLAorCX0sCisJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KKwl7CisJCS5ob29rCQk9IGlwX3ZzX291dCwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVCwKKwkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9GT1JXQVJELAorCQkucHJpb3JpdHkgICAgICAgPSAxMDAsCisJfSwKKwkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nIChidXQgYmVmb3JlIGlwX3ZzX291dF9pY21wKSwgY2F0Y2ggaWNtcAorCSAqIGRlc3RpbmVkIGZvciAwLjAuMC4wLzAsIHdoaWNoIGlzIGZvciBpbmNvbWluZyBJUFZTIGNvbm5lY3Rpb25zICovCisJeworCQkuaG9vawkJPSBpcF92c19mb3J3YXJkX2ljbXAsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQsCisJCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfRk9SV0FSRCwKKwkJLnByaW9yaXR5ICAgICAgID0gOTksCisJfSwKKwkvKiBCZWZvcmUgdGhlIG5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nLCBleGl0IGZyb20gUE9TVF9ST1VUSU5HICovCisJeworCQkuaG9vawkJPSBpcF92c19wb3N0X3JvdXRpbmcsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBmCQk9IFBGX0lORVQsCisJCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfUE9TVF9ST1VUSU5HLAorCQkucHJpb3JpdHkgICAgICAgPSBORl9JUF9QUklfTkFUX1NSQy0xLAorCX0sCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBmb3J3YXJkIHBhY2tldCB0aHJvdWdoIFZTL0RSLCBWUy9UVU4sCisJICogb3IgVlMvTkFUKGNoYW5nZSBkZXN0aW5hdGlvbiksIHNvIHRoYXQgZmlsdGVyaW5nIHJ1bGVzIGNhbiBiZQorCSAqIGFwcGxpZWQgdG8gSVBWUy4gKi8KKwl7CisJCS5ob29rCQk9IGlwX3ZzX2luLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9MT0NBTF9JTiwKKwkJLnByaW9yaXR5ICAgICAgID0gMTAwLAorCX0sCisJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSBvbmx5IGZvciBWUy9OQVQgKi8KKwl7CisJCS5ob29rCQk9IGlwX3ZzX291dCwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVDYsCisJCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfRk9SV0FSRCwKKwkJLnByaW9yaXR5ICAgICAgID0gMTAwLAorCX0sCisJLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZyAoYnV0IGJlZm9yZSBpcF92c19vdXRfaWNtcCksIGNhdGNoIGljbXAKKwkgKiBkZXN0aW5lZCBmb3IgMC4wLjAuMC8wLCB3aGljaCBpcyBmb3IgaW5jb21pbmcgSVBWUyBjb25uZWN0aW9ucyAqLworCXsKKwkJLmhvb2sJCT0gaXBfdnNfZm9yd2FyZF9pY21wX3Y2LAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBQRl9JTkVUNiwKKwkJLmhvb2tudW0gICAgICAgID0gTkZfSU5FVF9GT1JXQVJELAorCQkucHJpb3JpdHkgICAgICAgPSA5OSwKKwl9LAorCS8qIEJlZm9yZSB0aGUgbmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcsIGV4aXQgZnJvbSBQT1NUX1JPVVRJTkcgKi8KKwl7CisJCS5ob29rCQk9IGlwX3ZzX3Bvc3Rfcm91dGluZywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkucGYJCT0gUEZfSU5FVDYsCisJCS5ob29rbnVtICAgICAgICA9IE5GX0lORVRfUE9TVF9ST1VUSU5HLAorCQkucHJpb3JpdHkgICAgICAgPSBORl9JUDZfUFJJX05BVF9TUkMtMSwKKwl9LAorI2VuZGlmCit9OworCisKKy8qCisgKglJbml0aWFsaXplIElQIFZpcnR1YWwgU2VydmVyCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaXBfdnNfZXN0aW1hdG9yX2luaXQoKTsKKworCXJldCA9IGlwX3ZzX2NvbnRyb2xfaW5pdCgpOworCWlmIChyZXQgPCAwKSB7CisJCUlQX1ZTX0VSUigiY2FuJ3Qgc2V0dXAgY29udHJvbC5cbiIpOworCQlnb3RvIGNsZWFudXBfZXN0aW1hdG9yOworCX0KKworCWlwX3ZzX3Byb3RvY29sX2luaXQoKTsKKworCXJldCA9IGlwX3ZzX2FwcF9pbml0KCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVBfVlNfRVJSKCJjYW4ndCBzZXR1cCBhcHBsaWNhdGlvbiBoZWxwZXIuXG4iKTsKKwkJZ290byBjbGVhbnVwX3Byb3RvY29sOworCX0KKworCXJldCA9IGlwX3ZzX2Nvbm5faW5pdCgpOworCWlmIChyZXQgPCAwKSB7CisJCUlQX1ZTX0VSUigiY2FuJ3Qgc2V0dXAgY29ubmVjdGlvbiB0YWJsZS5cbiIpOworCQlnb3RvIGNsZWFudXBfYXBwOworCX0KKworCXJldCA9IG5mX3JlZ2lzdGVyX2hvb2tzKGlwX3ZzX29wcywgQVJSQVlfU0laRShpcF92c19vcHMpKTsKKwlpZiAocmV0IDwgMCkgeworCQlJUF9WU19FUlIoImNhbid0IHJlZ2lzdGVyIGhvb2tzLlxuIik7CisJCWdvdG8gY2xlYW51cF9jb25uOworCX0KKworCUlQX1ZTX0lORk8oImlwdnMgbG9hZGVkLlxuIik7CisJcmV0dXJuIHJldDsKKworICBjbGVhbnVwX2Nvbm46CisJaXBfdnNfY29ubl9jbGVhbnVwKCk7CisgIGNsZWFudXBfYXBwOgorCWlwX3ZzX2FwcF9jbGVhbnVwKCk7CisgIGNsZWFudXBfcHJvdG9jb2w6CisJaXBfdnNfcHJvdG9jb2xfY2xlYW51cCgpOworCWlwX3ZzX2NvbnRyb2xfY2xlYW51cCgpOworICBjbGVhbnVwX2VzdGltYXRvcjoKKwlpcF92c19lc3RpbWF0b3JfY2xlYW51cCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19jbGVhbnVwKHZvaWQpCit7CisJbmZfdW5yZWdpc3Rlcl9ob29rcyhpcF92c19vcHMsIEFSUkFZX1NJWkUoaXBfdnNfb3BzKSk7CisJaXBfdnNfY29ubl9jbGVhbnVwKCk7CisJaXBfdnNfYXBwX2NsZWFudXAoKTsKKwlpcF92c19wcm90b2NvbF9jbGVhbnVwKCk7CisJaXBfdnNfY29udHJvbF9jbGVhbnVwKCk7CisJaXBfdnNfZXN0aW1hdG9yX2NsZWFudXAoKTsKKwlJUF9WU19JTkZPKCJpcHZzIHVubG9hZGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMmNmMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwpAQCAtMCwwICsxLDM0NDMgQEAKKy8qCisgKiBJUFZTICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgZm9yIHRoZQorICogICAgICAgICAgICAgIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uICBJUFZTIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhIG1vZHVsZQorICogICAgICAgICAgICAgIG92ZXIgdGhlIE5ldEZpbHRlciBmcmFtZXdvcmsuIElQVlMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYQorICogICAgICAgICAgICAgIGhpZ2gtcGVyZm9ybWFuY2UgYW5kIGhpZ2hseSBhdmFpbGFibGUgc2VydmVyIGJhc2VkIG9uIGEKKyAqICAgICAgICAgICAgICBjbHVzdGVyIG9mIHNlcnZlcnMuCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqICAgICAgICAgICAgICBQZXRlciBLZXNlIDxwZXRlci5rZXNlQGlqcy5zaT4KKyAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisvKiBzZW1hcGhvcmUgZm9yIElQVlMgc29ja29wdHMuIEFuZCwgW2dzXWV0c29ja29wdCBtYXkgc2xlZXAuICovCitzdGF0aWMgREVGSU5FX01VVEVYKF9faXBfdnNfbXV0ZXgpOworCisvKiBsb2NrIGZvciBzZXJ2aWNlIHRhYmxlICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhfX2lwX3ZzX3N2Y19sb2NrKTsKKworLyogbG9jayBmb3IgdGFibGUgd2l0aCB0aGUgcmVhbCBzZXJ2aWNlcyAqLworc3RhdGljIERFRklORV9SV0xPQ0soX19pcF92c19yc19sb2NrKTsKKworLyogbG9jayBmb3Igc3RhdGUgYW5kIHRpbWVvdXQgdGFibGVzICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhfX2lwX3ZzX3NlY3VyZXRjcF9sb2NrKTsKKworLyogbG9jayBmb3IgZHJvcCBlbnRyeSBoYW5kbGluZyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhfX2lwX3ZzX2Ryb3BlbnRyeV9sb2NrKTsKKworLyogbG9jayBmb3IgZHJvcCBwYWNrZXQgaGFuZGxpbmcgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soX19pcF92c19kcm9wcGFja2V0X2xvY2spOworCisvKiAxL3JhdGUgZHJvcCBhbmQgZHJvcC1lbnRyeSB2YXJpYWJsZXMgKi8KK2ludCBpcF92c19kcm9wX3JhdGUgPSAwOworaW50IGlwX3ZzX2Ryb3BfY291bnRlciA9IDA7CitzdGF0aWMgYXRvbWljX3QgaXBfdnNfZHJvcGVudHJ5ID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIG51bWJlciBvZiB2aXJ0dWFsIHNlcnZpY2VzICovCitzdGF0aWMgaW50IGlwX3ZzX251bV9zZXJ2aWNlcyA9IDA7CisKKy8qIHN5c2N0bCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2Ryb3BfZW50cnkgPSAwOworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfZHJvcF9wYWNrZXQgPSAwOworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcCA9IDA7CitzdGF0aWMgaW50IHN5c2N0bF9pcF92c19hbWVtdGhyZXNoID0gMTAyNDsKK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2FtX2Ryb3ByYXRlID0gMTA7CitpbnQgc3lzY3RsX2lwX3ZzX2NhY2hlX2J5cGFzcyA9IDA7CitpbnQgc3lzY3RsX2lwX3ZzX2V4cGlyZV9ub2Rlc3RfY29ubiA9IDA7CitpbnQgc3lzY3RsX2lwX3ZzX2V4cGlyZV9xdWllc2NlbnRfdGVtcGxhdGUgPSAwOworaW50IHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZFsyXSA9IHsgMywgNTAgfTsKK2ludCBzeXNjdGxfaXBfdnNfbmF0X2ljbXBfc2VuZCA9IDA7CisKKworI2lmZGVmIENPTkZJR19JUF9WU19ERUJVRworc3RhdGljIGludCBzeXNjdGxfaXBfdnNfZGVidWdfbGV2ZWwgPSAwOworCitpbnQgaXBfdnNfZ2V0X2RlYnVnX2xldmVsKHZvaWQpCit7CisJcmV0dXJuIHN5c2N0bF9pcF92c19kZWJ1Z19sZXZlbDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKy8qIFRha2VuIGZyb20gcnQ2X2ZpbGxfbm9kZSgpIGluIG5ldC9pcHY2L3JvdXRlLmMsIGlzIHRoZXJlIGEgYmV0dGVyIHdheT8gKi8KK3N0YXRpYyBpbnQgX19pcF92c19hZGRyX2lzX2xvY2FsX3Y2KGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJLm9pZiA9IDAsCisJCS5ubF91ID0geworCQkJLmlwNl91ID0geworCQkJCS5kYWRkciA9ICphZGRyLAorCQkJCS5zYWRkciA9IHsgLnM2X2FkZHIzMiA9IHswLCAwLCAwLCAwfSB9LCB9IH0sCisJfTsKKworCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWlwNl9yb3V0ZV9vdXRwdXQoJmluaXRfbmV0LCBOVUxMLCAmZmwpOworCWlmIChydCAmJiBydC0+cnQ2aV9kZXYgJiYgKHJ0LT5ydDZpX2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorLyoKKyAqCXVwZGF0ZV9kZWZlbnNlX2xldmVsIGlzIGNhbGxlZCBmcm9tIGtldmVudGQgYW5kIGZyb20gc3lzY3RsLAorICoJc28gaXQgbmVlZHMgdG8gcHJvdGVjdCBpdHNlbGYgZnJvbSBzb2Z0aXJxcworICovCitzdGF0aWMgdm9pZCB1cGRhdGVfZGVmZW5zZV9sZXZlbCh2b2lkKQoreworCXN0cnVjdCBzeXNpbmZvIGk7CisJc3RhdGljIGludCBvbGRfc2VjdXJlX3RjcCA9IDA7CisJaW50IGF2YWlsbWVtOworCWludCBub21lbTsKKwlpbnQgdG9fY2hhbmdlID0gLTE7CisKKwkvKiB3ZSBvbmx5IGNvdW50IGZyZWUgYW5kIGJ1ZmZlcmVkIG1lbW9yeSAoaW4gcGFnZXMpICovCisJc2lfbWVtaW5mbygmaSk7CisJYXZhaWxtZW0gPSBpLmZyZWVyYW0gKyBpLmJ1ZmZlcnJhbTsKKwkvKiBob3dldmVyIGluIGxpbnV4IDIuNSB0aGUgaS5idWZmZXJyYW0gaXMgdG90YWwgcGFnZSBjYWNoZSBzaXplLAorCSAgIHdlIG5lZWQgYWRqdXN0IGl0ICovCisJLyogc2lfc3dhcGluZm8oJmkpOyAqLworCS8qIGF2YWlsbWVtID0gYXZhaWxtZW0gLSAoaS50b3RhbHN3YXAgLSBpLmZyZWVzd2FwKTsgKi8KKworCW5vbWVtID0gKGF2YWlsbWVtIDwgc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gpOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJLyogZHJvcF9lbnRyeSAqLworCXNwaW5fbG9jaygmX19pcF92c19kcm9wZW50cnlfbG9jayk7CisJc3dpdGNoIChzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSkgeworCWNhc2UgMDoKKwkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAobm9tZW0pIHsKKwkJCWF0b21pY19zZXQoJmlwX3ZzX2Ryb3BlbnRyeSwgMSk7CisJCQlzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSA9IDI7CisJCX0gZWxzZSB7CisJCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKG5vbWVtKSB7CisJCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDEpOworCQl9IGVsc2UgeworCQkJYXRvbWljX3NldCgmaXBfdnNfZHJvcGVudHJ5LCAwKTsKKwkJCXN5c2N0bF9pcF92c19kcm9wX2VudHJ5ID0gMTsKKwkJfTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhdG9taWNfc2V0KCZpcF92c19kcm9wZW50cnksIDEpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJl9faXBfdnNfZHJvcGVudHJ5X2xvY2spOworCisJLyogZHJvcF9wYWNrZXQgKi8KKwlzcGluX2xvY2soJl9faXBfdnNfZHJvcHBhY2tldF9sb2NrKTsKKwlzd2l0Y2ggKHN5c2N0bF9pcF92c19kcm9wX3BhY2tldCkgeworCWNhc2UgMDoKKwkJaXBfdnNfZHJvcF9yYXRlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAobm9tZW0pIHsKKwkJCWlwX3ZzX2Ryb3BfcmF0ZSA9IGlwX3ZzX2Ryb3BfY291bnRlcgorCQkJCT0gc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2ggLworCQkJCShzeXNjdGxfaXBfdnNfYW1lbXRocmVzaC1hdmFpbG1lbSk7CisJCQlzeXNjdGxfaXBfdnNfZHJvcF9wYWNrZXQgPSAyOworCQl9IGVsc2UgeworCQkJaXBfdnNfZHJvcF9yYXRlID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDI6CisJCWlmIChub21lbSkgeworCQkJaXBfdnNfZHJvcF9yYXRlID0gaXBfdnNfZHJvcF9jb3VudGVyCisJCQkJPSBzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCAvCisJCQkJKHN5c2N0bF9pcF92c19hbWVtdGhyZXNoLWF2YWlsbWVtKTsKKwkJfSBlbHNlIHsKKwkJCWlwX3ZzX2Ryb3BfcmF0ZSA9IDA7CisJCQlzeXNjdGxfaXBfdnNfZHJvcF9wYWNrZXQgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaXBfdnNfZHJvcF9yYXRlID0gc3lzY3RsX2lwX3ZzX2FtX2Ryb3ByYXRlOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJl9faXBfdnNfZHJvcHBhY2tldF9sb2NrKTsKKworCS8qIHNlY3VyZV90Y3AgKi8KKwl3cml0ZV9sb2NrKCZfX2lwX3ZzX3NlY3VyZXRjcF9sb2NrKTsKKwlzd2l0Y2ggKHN5c2N0bF9pcF92c19zZWN1cmVfdGNwKSB7CisJY2FzZSAwOgorCQlpZiAob2xkX3NlY3VyZV90Y3AgPj0gMikKKwkJCXRvX2NoYW5nZSA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKG5vbWVtKSB7CisJCQlpZiAob2xkX3NlY3VyZV90Y3AgPCAyKQorCQkJCXRvX2NoYW5nZSA9IDE7CisJCQlzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcCA9IDI7CisJCX0gZWxzZSB7CisJCQlpZiAob2xkX3NlY3VyZV90Y3AgPj0gMikKKwkJCQl0b19jaGFuZ2UgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKG5vbWVtKSB7CisJCQlpZiAob2xkX3NlY3VyZV90Y3AgPCAyKQorCQkJCXRvX2NoYW5nZSA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAob2xkX3NlY3VyZV90Y3AgPj0gMikKKwkJCQl0b19jaGFuZ2UgPSAwOworCQkJc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3AgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKG9sZF9zZWN1cmVfdGNwIDwgMikKKwkJCXRvX2NoYW5nZSA9IDE7CisJCWJyZWFrOworCX0KKwlvbGRfc2VjdXJlX3RjcCA9IHN5c2N0bF9pcF92c19zZWN1cmVfdGNwOworCWlmICh0b19jaGFuZ2UgPj0gMCkKKwkJaXBfdnNfcHJvdG9jb2xfdGltZW91dF9jaGFuZ2Uoc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3A+MSk7CisJd3JpdGVfdW5sb2NrKCZfX2lwX3ZzX3NlY3VyZXRjcF9sb2NrKTsKKworCWxvY2FsX2JoX2VuYWJsZSgpOworfQorCisKKy8qCisgKglUaW1lciBmb3IgY2hlY2tpbmcgdGhlIGRlZmVuc2UKKyAqLworI2RlZmluZSBERUZFTlNFX1RJTUVSX1BFUklPRAkxKkhaCitzdGF0aWMgdm9pZCBkZWZlbnNlX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGRlZmVuc2Vfd29yaywgZGVmZW5zZV93b3JrX2hhbmRsZXIpOworCitzdGF0aWMgdm9pZCBkZWZlbnNlX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKKwlpZiAoYXRvbWljX3JlYWQoJmlwX3ZzX2Ryb3BlbnRyeSkpCisJCWlwX3ZzX3JhbmRvbV9kcm9wZW50cnkoKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGVmZW5zZV93b3JrLCBERUZFTlNFX1RJTUVSX1BFUklPRCk7Cit9CisKK2ludAoraXBfdnNfdXNlX2NvdW50X2luYyh2b2lkKQoreworCXJldHVybiB0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Cit9CisKK3ZvaWQKK2lwX3ZzX3VzZV9jb3VudF9kZWModm9pZCkKK3sKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworCisvKgorICoJSGFzaCB0YWJsZTogZm9yIHZpcnR1YWwgc2VydmljZSBsb29rdXBzCisgKi8KKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9CSVRTIDgKKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9TSVpFICgxIDw8IElQX1ZTX1NWQ19UQUJfQklUUykKKyNkZWZpbmUgSVBfVlNfU1ZDX1RBQl9NQVNLIChJUF9WU19TVkNfVEFCX1NJWkUgLSAxKQorCisvKiB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLCBhZGRyLCBwb3J0PiAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXBfdnNfc3ZjX3RhYmxlW0lQX1ZTX1NWQ19UQUJfU0laRV07CisvKiB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgZndtYXJrICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpcF92c19zdmNfZndtX3RhYmxlW0lQX1ZTX1NWQ19UQUJfU0laRV07CisKKy8qCisgKglIYXNoIHRhYmxlOiBmb3IgcmVhbCBzZXJ2aWNlIGxvb2t1cHMKKyAqLworI2RlZmluZSBJUF9WU19SVEFCX0JJVFMgNAorI2RlZmluZSBJUF9WU19SVEFCX1NJWkUgKDEgPDwgSVBfVlNfUlRBQl9CSVRTKQorI2RlZmluZSBJUF9WU19SVEFCX01BU0sgKElQX1ZTX1JUQUJfU0laRSAtIDEpCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlwX3ZzX3J0YWJsZVtJUF9WU19SVEFCX1NJWkVdOworCisvKgorICoJVHJhc2ggZm9yIGRlc3RpbmF0aW9ucworICovCitzdGF0aWMgTElTVF9IRUFEKGlwX3ZzX2Rlc3RfdHJhc2gpOworCisvKgorICoJRlRQICYgTlVMTCB2aXJ0dWFsIHNlcnZpY2UgY291bnRlcnMKKyAqLworc3RhdGljIGF0b21pY190IGlwX3ZzX2Z0cHN2Y19jb3VudGVyID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgYXRvbWljX3QgaXBfdnNfbnVsbHN2Y19jb3VudGVyID0gQVRPTUlDX0lOSVQoMCk7CisKKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgdmlydHVhbCBzZXJ2aWNlCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkCitpcF92c19zdmNfaGFzaGtleShpbnQgYWYsIHVuc2lnbmVkIHByb3RvLCBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmFkZHIsCisJCSAgX19iZTE2IHBvcnQpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgcG9ydGggPSBudG9ocyhwb3J0KTsKKwlfX2JlMzIgYWRkcl9mb2xkID0gYWRkci0+aXA7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJYWRkcl9mb2xkID0gYWRkci0+aXA2WzBdXmFkZHItPmlwNlsxXV4KKwkJCSAgICBhZGRyLT5pcDZbMl1eYWRkci0+aXA2WzNdOworI2VuZGlmCisKKwlyZXR1cm4gKHByb3RvXm50b2hsKGFkZHJfZm9sZCleKHBvcnRoPj5JUF9WU19TVkNfVEFCX0JJVFMpXnBvcnRoKQorCQkmIElQX1ZTX1NWQ19UQUJfTUFTSzsKK30KKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBvZiBmd21hcmsgZm9yIHZpcnR1YWwgc2VydmljZSBsb29rdXAKKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaXBfdnNfc3ZjX2Z3bV9oYXNoa2V5KF9fdTMyIGZ3bWFyaykKK3sKKwlyZXR1cm4gZndtYXJrICYgSVBfVlNfU1ZDX1RBQl9NQVNLOworfQorCisvKgorICoJSGFzaGVzIGEgc2VydmljZSBpbiB0aGUgaXBfdnNfc3ZjX3RhYmxlIGJ5IDxwcm90byxhZGRyLHBvcnQ+CisgKglvciBpbiB0aGUgaXBfdnNfc3ZjX2Z3bV90YWJsZSBieSBmd21hcmsuCisgKglTaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja2VkIHRhYmxlcy4KKyAqLworc3RhdGljIGludCBpcF92c19zdmNfaGFzaChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXVuc2lnbmVkIGhhc2g7CisKKwlpZiAoc3ZjLT5mbGFncyAmIElQX1ZTX1NWQ19GX0hBU0hFRCkgeworCQlJUF9WU19FUlIoImlwX3ZzX3N2Y19oYXNoKCk6IHJlcXVlc3QgZm9yIGFscmVhZHkgaGFzaGVkLCAiCisJCQkgICJjYWxsZWQgZnJvbSAlcFxuIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN2Yy0+ZndtYXJrID09IDApIHsKKwkJLyoKKwkJICogIEhhc2ggaXQgYnkgPHByb3RvY29sLGFkZHIscG9ydD4gaW4gaXBfdnNfc3ZjX3RhYmxlCisJCSAqLworCQloYXNoID0gaXBfdnNfc3ZjX2hhc2hrZXkoc3ZjLT5hZiwgc3ZjLT5wcm90b2NvbCwgJnN2Yy0+YWRkciwKKwkJCQkJIHN2Yy0+cG9ydCk7CisJCWxpc3RfYWRkKCZzdmMtPnNfbGlzdCwgJmlwX3ZzX3N2Y190YWJsZVtoYXNoXSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogIEhhc2ggaXQgYnkgZndtYXJrIGluIGlwX3ZzX3N2Y19md21fdGFibGUKKwkJICovCisJCWhhc2ggPSBpcF92c19zdmNfZndtX2hhc2hrZXkoc3ZjLT5md21hcmspOworCQlsaXN0X2FkZCgmc3ZjLT5mX2xpc3QsICZpcF92c19zdmNfZndtX3RhYmxlW2hhc2hdKTsKKwl9CisKKwlzdmMtPmZsYWdzIHw9IElQX1ZTX1NWQ19GX0hBU0hFRDsKKwkvKiBpbmNyZWFzZSBpdHMgcmVmY250IGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ZjIHRhYmxlICovCisJYXRvbWljX2luYygmc3ZjLT5yZWZjbnQpOworCXJldHVybiAxOworfQorCisKKy8qCisgKglVbmhhc2hlcyBhIHNlcnZpY2UgZnJvbSBpcF92c19zdmNfdGFibGUvaXBfdnNfc3ZjX2Z3bV90YWJsZS4KKyAqCVNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrZWQgdGFibGVzLgorICovCitzdGF0aWMgaW50IGlwX3ZzX3N2Y191bmhhc2goc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpZiAoIShzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfSEFTSEVEKSkgeworCQlJUF9WU19FUlIoImlwX3ZzX3N2Y191bmhhc2goKTogcmVxdWVzdCBmb3IgdW5oYXNoIGZsYWdnZWQsICIKKwkJCSAgImNhbGxlZCBmcm9tICVwXG4iLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3ZjLT5md21hcmsgPT0gMCkgeworCQkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfc3ZjX3RhYmxlIHRhYmxlICovCisJCWxpc3RfZGVsKCZzdmMtPnNfbGlzdCk7CisJfSBlbHNlIHsKKwkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIGlwX3ZzX3N2Y19md21fdGFibGUgdGFibGUgKi8KKwkJbGlzdF9kZWwoJnN2Yy0+Zl9saXN0KTsKKwl9CisKKwlzdmMtPmZsYWdzICY9IH5JUF9WU19TVkNfRl9IQVNIRUQ7CisJYXRvbWljX2RlYygmc3ZjLT5yZWZjbnQpOworCXJldHVybiAxOworfQorCisKKy8qCisgKglHZXQgc2VydmljZSBieSB7cHJvdG8sYWRkcixwb3J0fSBpbiB0aGUgc2VydmljZSB0YWJsZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqCitfX2lwX3ZzX3NlcnZpY2VfZ2V0KGludCBhZiwgX191MTYgcHJvdG9jb2wsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqdmFkZHIsCisJCSAgICBfX2JlMTYgdnBvcnQpCit7CisJdW5zaWduZWQgaGFzaDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJLyogQ2hlY2sgZm9yICJmdWxsIiBhZGRyZXNzZWQgZW50cmllcyAqLworCWhhc2ggPSBpcF92c19zdmNfaGFzaGtleShhZiwgcHJvdG9jb2wsIHZhZGRyLCB2cG9ydCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtoYXNoXSwgc19saXN0KXsKKwkJaWYgKChzdmMtPmFmID09IGFmKQorCQkgICAgJiYgaXBfdnNfYWRkcl9lcXVhbChhZiwgJnN2Yy0+YWRkciwgdmFkZHIpCisJCSAgICAmJiAoc3ZjLT5wb3J0ID09IHZwb3J0KQorCQkgICAgJiYgKHN2Yy0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpKSB7CisJCQkvKiBISVQgKi8KKwkJCWF0b21pY19pbmMoJnN2Yy0+dXNlY250KTsKKwkJCXJldHVybiBzdmM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICoJR2V0IHNlcnZpY2UgYnkge2Z3bWFya30gaW4gdGhlIHNlcnZpY2UgdGFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKgorX19pcF92c19zdmNfZndtX2dldChpbnQgYWYsIF9fdTMyIGZ3bWFyaykKK3sKKwl1bnNpZ25lZCBoYXNoOworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisKKwkvKiBDaGVjayBmb3IgZndtYXJrIGFkZHJlc3NlZCBlbnRyaWVzICovCisJaGFzaCA9IGlwX3ZzX3N2Y19md21faGFzaGtleShmd21hcmspOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsICZpcF92c19zdmNfZndtX3RhYmxlW2hhc2hdLCBmX2xpc3QpIHsKKwkJaWYgKHN2Yy0+ZndtYXJrID09IGZ3bWFyayAmJiBzdmMtPmFmID09IGFmKSB7CisJCQkvKiBISVQgKi8KKwkJCWF0b21pY19pbmMoJnN2Yy0+dXNlY250KTsKKwkJCXJldHVybiBzdmM7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGlwX3ZzX3NlcnZpY2UgKgoraXBfdnNfc2VydmljZV9nZXQoaW50IGFmLCBfX3UzMiBmd21hcmssIF9fdTE2IHByb3RvY29sLAorCQkgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqdmFkZHIsIF9fYmUxNiB2cG9ydCkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJcmVhZF9sb2NrKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCS8qCisJICoJQ2hlY2sgdGhlIHRhYmxlIGhhc2hlZCBieSBmd21hcmsgZmlyc3QKKwkgKi8KKwlpZiAoZndtYXJrICYmIChzdmMgPSBfX2lwX3ZzX3N2Y19md21fZ2V0KGFmLCBmd21hcmspKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqCUNoZWNrIHRoZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLGFkZHIscG9ydD4KKwkgKglmb3IgImZ1bGwiIGFkZHJlc3NlZCBlbnRyaWVzCisJICovCisJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChhZiwgcHJvdG9jb2wsIHZhZGRyLCB2cG9ydCk7CisKKwlpZiAoc3ZjID09IE5VTEwKKwkgICAgJiYgcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AKKwkgICAgJiYgYXRvbWljX3JlYWQoJmlwX3ZzX2Z0cHN2Y19jb3VudGVyKQorCSAgICAmJiAodnBvcnQgPT0gRlRQREFUQSB8fCBudG9ocyh2cG9ydCkgPj0gUFJPVF9TT0NLKSkgeworCQkvKgorCQkgKiBDaGVjayBpZiBmdHAgc2VydmljZSBlbnRyeSBleGlzdHMsIHRoZSBwYWNrZXQKKwkJICogbWlnaHQgYmVsb25nIHRvIEZUUCBkYXRhIGNvbm5lY3Rpb25zLgorCQkgKi8KKwkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChhZiwgcHJvdG9jb2wsIHZhZGRyLCBGVFBQT1JUKTsKKwl9CisKKwlpZiAoc3ZjID09IE5VTEwKKwkgICAgJiYgYXRvbWljX3JlYWQoJmlwX3ZzX251bGxzdmNfY291bnRlcikpIHsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGNhdGNoLWFsbCBwb3J0IChwb3J0IHplcm8pIGV4aXN0cworCQkgKi8KKwkJc3ZjID0gX19pcF92c19zZXJ2aWNlX2dldChhZiwgcHJvdG9jb2wsIHZhZGRyLCAwKTsKKwl9CisKKyAgb3V0OgorCXJlYWRfdW5sb2NrKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCUlQX1ZTX0RCR19CVUYoOSwgImxvb2t1cCBzZXJ2aWNlOiBmd20gJXUgJXMgJXM6JXUgJXNcbiIsCisJCSAgICAgIGZ3bWFyaywgaXBfdnNfcHJvdG9fbmFtZShwcm90b2NvbCksCisJCSAgICAgIElQX1ZTX0RCR19BRERSKGFmLCB2YWRkciksIG50b2hzKHZwb3J0KSwKKwkJICAgICAgc3ZjID8gImhpdCIgOiAibm90IGhpdCIpOworCisJcmV0dXJuIHN2YzsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXBfdnNfYmluZF9zdmMoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJYXRvbWljX2luYygmc3ZjLT5yZWZjbnQpOworCWRlc3QtPnN2YyA9IHN2YzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lwX3ZzX3VuYmluZF9zdmMoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyA9IGRlc3QtPnN2YzsKKworCWRlc3QtPnN2YyA9IE5VTEw7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnN2Yy0+cmVmY250KSkKKwkJa2ZyZWUoc3ZjKTsKK30KKworCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciByZWFsIHNlcnZpY2UKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcF92c19yc19oYXNoa2V5KGludCBhZiwKKwkJCQkJICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYWRkciwKKwkJCQkJICAgIF9fYmUxNiBwb3J0KQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIHBvcnRoID0gbnRvaHMocG9ydCk7CisJX19iZTMyIGFkZHJfZm9sZCA9IGFkZHItPmlwOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCWFkZHJfZm9sZCA9IGFkZHItPmlwNlswXV5hZGRyLT5pcDZbMV1eCisJCQkgICAgYWRkci0+aXA2WzJdXmFkZHItPmlwNlszXTsKKyNlbmRpZgorCisJcmV0dXJuIChudG9obChhZGRyX2ZvbGQpXihwb3J0aD4+SVBfVlNfUlRBQl9CSVRTKV5wb3J0aCkKKwkJJiBJUF9WU19SVEFCX01BU0s7Cit9CisKKy8qCisgKglIYXNoZXMgaXBfdnNfZGVzdCBpbiBpcF92c19ydGFibGUgYnkgPHByb3RvLGFkZHIscG9ydD4uCisgKglzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja2VkIHRhYmxlcy4KKyAqLworc3RhdGljIGludCBpcF92c19yc19oYXNoKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXVuc2lnbmVkIGhhc2g7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRlc3QtPmRfbGlzdCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKglIYXNoIGJ5IHByb3RvLGFkZHIscG9ydCwKKwkgKgl3aGljaCBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHJlYWwgc2VydmljZS4KKwkgKi8KKwloYXNoID0gaXBfdnNfcnNfaGFzaGtleShkZXN0LT5hZiwgJmRlc3QtPmFkZHIsIGRlc3QtPnBvcnQpOworCisJbGlzdF9hZGQoJmRlc3QtPmRfbGlzdCwgJmlwX3ZzX3J0YWJsZVtoYXNoXSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqCVVOaGFzaGVzIGlwX3ZzX2Rlc3QgZnJvbSBpcF92c19ydGFibGUuCisgKglzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja2VkIHRhYmxlcy4KKyAqLworc3RhdGljIGludCBpcF92c19yc191bmhhc2goc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBSZW1vdmUgaXQgZnJvbSB0aGUgaXBfdnNfcnRhYmxlIHRhYmxlLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmZGVzdC0+ZF9saXN0KSkgeworCQlsaXN0X2RlbCgmZGVzdC0+ZF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRlc3QtPmRfbGlzdCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglMb29rdXAgcmVhbCBzZXJ2aWNlIGJ5IDxwcm90byxhZGRyLHBvcnQ+IGluIHRoZSByZWFsIHNlcnZpY2UgdGFibGUuCisgKi8KK3N0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX2xvb2t1cF9yZWFsX3NlcnZpY2UoaW50IGFmLCBfX3UxNiBwcm90b2NvbCwKKwkJCSAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkYWRkciwKKwkJCSAgX19iZTE2IGRwb3J0KQoreworCXVuc2lnbmVkIGhhc2g7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisKKwkvKgorCSAqCUNoZWNrIGZvciAiZnVsbCIgYWRkcmVzc2VkIGVudHJpZXMKKwkgKglSZXR1cm4gdGhlIGZpcnN0IGZvdW5kIGVudHJ5CisJICovCisJaGFzaCA9IGlwX3ZzX3JzX2hhc2hrZXkoYWYsIGRhZGRyLCBkcG9ydCk7CisKKwlyZWFkX2xvY2soJl9faXBfdnNfcnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmaXBfdnNfcnRhYmxlW2hhc2hdLCBkX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5hZiA9PSBhZikKKwkJICAgICYmIGlwX3ZzX2FkZHJfZXF1YWwoYWYsICZkZXN0LT5hZGRyLCBkYWRkcikKKwkJICAgICYmIChkZXN0LT5wb3J0ID09IGRwb3J0KQorCQkgICAgJiYgKChkZXN0LT5wcm90b2NvbCA9PSBwcm90b2NvbCkgfHwKKwkJCWRlc3QtPnZmd21hcmspKSB7CisJCQkvKiBISVQgKi8KKwkJCXJlYWRfdW5sb2NrKCZfX2lwX3ZzX3JzX2xvY2spOworCQkJcmV0dXJuIGRlc3Q7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJl9faXBfdnNfcnNfbG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqCUxvb2t1cCBkZXN0aW5hdGlvbiBieSB7YWRkcixwb3J0fSBpbiB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfbG9va3VwX2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkYWRkciwKKwkJICBfX2JlMTYgZHBvcnQpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisKKwkvKgorCSAqIEZpbmQgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VydmljZQorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5hZiA9PSBzdmMtPmFmKQorCQkgICAgJiYgaXBfdnNfYWRkcl9lcXVhbChzdmMtPmFmLCAmZGVzdC0+YWRkciwgZGFkZHIpCisJCSAgICAmJiAoZGVzdC0+cG9ydCA9PSBkcG9ydCkpIHsKKwkJCS8qIEhJVCAqLworCQkJcmV0dXJuIGRlc3Q7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZpbmQgZGVzdGluYXRpb24gYnkge2RhZGRyLGRwb3J0LHZhZGRyLHByb3RvY29sfQorICogQ3JldGFlZCB0byBiZSB1c2VkIGluIGlwX3ZzX3Byb2Nlc3NfbWVzc2FnZSgpIGluCisgKiB0aGUgYmFja3VwIHN5bmNocm9uaXphdGlvbiBkYWVtb24uIEl0IGZpbmRzIHRoZQorICogZGVzdGluYXRpb24gdG8gYmUgYm91bmQgdG8gdGhlIHJlY2VpdmVkIGNvbm5lY3Rpb24KKyAqIG9uIHRoZSBiYWNrdXAuCisgKgorICogaXBfdnNfbG9va3VwX3JlYWxfc2VydmljZSgpIGxvb2tlZCBwcm9taXNzaW5nLCBidXQKKyAqIHNlZW1zIG5vdCB3b3JraW5nIGFzIGV4cGVjdGVkLgorICovCitzdHJ1Y3QgaXBfdnNfZGVzdCAqaXBfdnNfZmluZF9kZXN0KGludCBhZiwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkYWRkciwKKwkJCQkgICBfX2JlMTYgZHBvcnQsCisJCQkJICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp2YWRkciwKKwkJCQkgICBfX2JlMTYgdnBvcnQsIF9fdTE2IHByb3RvY29sKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisKKwlzdmMgPSBpcF92c19zZXJ2aWNlX2dldChhZiwgMCwgcHJvdG9jb2wsIHZhZGRyLCB2cG9ydCk7CisJaWYgKCFzdmMpCisJCXJldHVybiBOVUxMOworCWRlc3QgPSBpcF92c19sb29rdXBfZGVzdChzdmMsIGRhZGRyLCBkcG9ydCk7CisJaWYgKGRlc3QpCisJCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7CisJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwlyZXR1cm4gZGVzdDsKK30KKworLyoKKyAqICBMb29rdXAgZGVzdCBieSB7c3ZjLGFkZHIscG9ydH0gaW4gdGhlIGRlc3RpbmF0aW9uIHRyYXNoLgorICogIFRoZSBkZXN0aW5hdGlvbiB0cmFzaCBpcyB1c2VkIHRvIGhvbGQgdGhlIGRlc3RpbmF0aW9ucyB0aGF0IGFyZSByZW1vdmVkCisgKiAgZnJvbSB0aGUgc2VydmljZSB0YWJsZSBidXQgYXJlIHN0aWxsIHJlZmVyZW5jZWQgYnkgc29tZSBjb25uIGVudHJpZXMuCisgKiAgVGhlIHJlYXNvbiB0byBhZGQgdGhlIGRlc3RpbmF0aW9uIHRyYXNoIGlzIHdoZW4gdGhlIGRlc3QgaXMgdGVtcG9yYXJ5CisgKiAgZG93biAoZWl0aGVyIGJ5IGFkbWluaXN0cmF0b3Igb3IgYnkgbW9uaXRvciBwcm9ncmFtKSwgdGhlIGRlc3QgY2FuIGJlCisgKiAgcGlja2VkIGJhY2sgZnJvbSB0aGUgdHJhc2gsIHRoZSByZW1haW5pbmcgY29ubmVjdGlvbnMgdG8gdGhlIGRlc3QgY2FuCisgKiAgY29udGludWUsIGFuZCB0aGUgY291bnRpbmcgaW5mb3JtYXRpb24gb2YgdGhlIGRlc3QgaXMgYWxzbyB1c2VmdWwgZm9yCisgKiAgc2NoZWR1bGluZy4KKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX3RyYXNoX2dldF9kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZGFkZHIsCisJCSAgICAgX19iZTE2IGRwb3J0KQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbnh0OworCisJLyoKKwkgKiBGaW5kIHRoZSBkZXN0aW5hdGlvbiBpbiB0cmFzaAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXN0LCBueHQsICZpcF92c19kZXN0X3RyYXNoLCBuX2xpc3QpIHsKKwkJSVBfVlNfREJHX0JVRigzLCAiRGVzdGluYXRpb24gJXUvJXM6JXUgc3RpbGwgaW4gdHJhc2gsICIKKwkJCSAgICAgICJkZXN0LT5yZWZjbnQ9JWRcbiIsCisJCQkgICAgICBkZXN0LT52ZndtYXJrLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmRlc3QtPmFkZHIpLAorCQkJICAgICAgbnRvaHMoZGVzdC0+cG9ydCksCisJCQkgICAgICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSk7CisJCWlmIChkZXN0LT5hZiA9PSBzdmMtPmFmICYmCisJCSAgICBpcF92c19hZGRyX2VxdWFsKHN2Yy0+YWYsICZkZXN0LT5hZGRyLCBkYWRkcikgJiYKKwkJICAgIGRlc3QtPnBvcnQgPT0gZHBvcnQgJiYKKwkJICAgIGRlc3QtPnZmd21hcmsgPT0gc3ZjLT5md21hcmsgJiYKKwkJICAgIGRlc3QtPnByb3RvY29sID09IHN2Yy0+cHJvdG9jb2wgJiYKKwkJICAgIChzdmMtPmZ3bWFyayB8fAorCQkgICAgIChpcF92c19hZGRyX2VxdWFsKHN2Yy0+YWYsICZkZXN0LT52YWRkciwgJnN2Yy0+YWRkcikgJiYKKwkJICAgICAgZGVzdC0+dnBvcnQgPT0gc3ZjLT5wb3J0KSkpIHsKKwkJCS8qIEhJVCAqLworCQkJcmV0dXJuIGRlc3Q7CisJCX0KKworCQkvKgorCQkgKiBUcnkgdG8gcHVyZ2UgdGhlIGRlc3RpbmF0aW9uIGZyb20gdHJhc2ggaWYgbm90IHJlZmVyZW5jZWQKKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSA9PSAxKSB7CisJCQlJUF9WU19EQkdfQlVGKDMsICJSZW1vdmluZyBkZXN0aW5hdGlvbiAldS8lczoldSAiCisJCQkJICAgICAgImZyb20gdHJhc2hcbiIsCisJCQkJICAgICAgZGVzdC0+dmZ3bWFyaywKKwkJCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmZGVzdC0+YWRkciksCisJCQkJICAgICAgbnRvaHMoZGVzdC0+cG9ydCkpOworCQkJbGlzdF9kZWwoJmRlc3QtPm5fbGlzdCk7CisJCQlpcF92c19kc3RfcmVzZXQoZGVzdCk7CisJCQlfX2lwX3ZzX3VuYmluZF9zdmMoZGVzdCk7CisJCQlrZnJlZShkZXN0KTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiAgQ2xlYW4gdXAgYWxsIHRoZSBkZXN0aW5hdGlvbnMgaW4gdGhlIHRyYXNoCisgKiAgQ2FsbGVkIGJ5IHRoZSBpcF92c19jb250cm9sX2NsZWFudXAoKQorICoKKyAqICBXaGVuIHRoZSBpcF92c19jb250cm9sX2NsZWFydXAgaXMgYWN0aXZhdGVkIGJ5IGlwdnMgbW9kdWxlIGV4aXQsCisgKiAgdGhlIHNlcnZpY2UgdGFibGVzIG11c3QgaGF2ZSBiZWVuIGZsdXNoZWQgYW5kIGFsbCB0aGUgY29ubmVjdGlvbnMKKyAqICBhcmUgZXhwaXJlZCwgYW5kIHRoZSByZWZjbnQgb2YgZWFjaCBkZXN0aW5hdGlvbiBpbiB0aGUgdHJhc2ggbXVzdAorICogIGJlIDEsIHNvIHdlIHNpbXBseSByZWxlYXNlIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfdHJhc2hfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbnh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc3QsIG54dCwgJmlwX3ZzX2Rlc3RfdHJhc2gsIG5fbGlzdCkgeworCQlsaXN0X2RlbCgmZGVzdC0+bl9saXN0KTsKKwkJaXBfdnNfZHN0X3Jlc2V0KGRlc3QpOworCQlfX2lwX3ZzX3VuYmluZF9zdmMoZGVzdCk7CisJCWtmcmVlKGRlc3QpOworCX0KK30KKworCitzdGF0aWMgdm9pZAoraXBfdnNfemVyb19zdGF0cyhzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQoreworCXNwaW5fbG9ja19iaCgmc3RhdHMtPmxvY2spOworCisJbWVtc2V0KCZzdGF0cy0+dXN0YXRzLCAwLCBzaXplb2Yoc3RhdHMtPnVzdGF0cykpOworCWlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0YXRzKTsKKworCXNwaW5fdW5sb2NrX2JoKCZzdGF0cy0+bG9jayk7Cit9CisKKy8qCisgKglVcGRhdGUgYSBkZXN0aW5hdGlvbiBpbiB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgdm9pZAorX19pcF92c191cGRhdGVfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLAorCQkgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19kZXN0X3VzZXJfa2VybiAqdWRlc3QpCit7CisJaW50IGNvbm5fZmxhZ3M7CisKKwkvKiBzZXQgdGhlIHdlaWdodCBhbmQgdGhlIGZsYWdzICovCisJYXRvbWljX3NldCgmZGVzdC0+d2VpZ2h0LCB1ZGVzdC0+d2VpZ2h0KTsKKwljb25uX2ZsYWdzID0gdWRlc3QtPmNvbm5fZmxhZ3MgfCBJUF9WU19DT05OX0ZfSU5BQ1RJVkU7CisKKwkvKiBjaGVjayBpZiBsb2NhbCBub2RlIGFuZCB1cGRhdGUgdGhlIGZsYWdzICovCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoc3ZjLT5hZiA9PSBBRl9JTkVUNikgeworCQlpZiAoX19pcF92c19hZGRyX2lzX2xvY2FsX3Y2KCZ1ZGVzdC0+YWRkci5pbjYpKSB7CisJCQljb25uX2ZsYWdzID0gKGNvbm5fZmxhZ3MgJiB+SVBfVlNfQ09OTl9GX0ZXRF9NQVNLKQorCQkJCXwgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERTsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJCWlmIChpbmV0X2FkZHJfdHlwZSgmaW5pdF9uZXQsIHVkZXN0LT5hZGRyLmlwKSA9PSBSVE5fTE9DQUwpIHsKKwkJCWNvbm5fZmxhZ3MgPSAoY29ubl9mbGFncyAmIH5JUF9WU19DT05OX0ZfRldEX01BU0spCisJCQkJfCBJUF9WU19DT05OX0ZfTE9DQUxOT0RFOworCQl9CisKKwkvKiBzZXQgdGhlIElQX1ZTX0NPTk5fRl9OT09VVFBVVCBmbGFnIGlmIG5vdCBtYXNxdWVyYWRpbmcvTkFUICovCisJaWYgKChjb25uX2ZsYWdzICYgSVBfVlNfQ09OTl9GX0ZXRF9NQVNLKSAhPSAwKSB7CisJCWNvbm5fZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX05PT1VUUFVUOworCX0gZWxzZSB7CisJCS8qCisJCSAqICAgIFB1dCB0aGUgcmVhbCBzZXJ2aWNlIGluIGlwX3ZzX3J0YWJsZSBpZiBub3QgcHJlc2VudC4KKwkJICogICAgRm9yIG5vdyBvbmx5IGZvciBOQVQhCisJCSAqLworCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3JzX2xvY2spOworCQlpcF92c19yc19oYXNoKGRlc3QpOworCQl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7CisJfQorCWF0b21pY19zZXQoJmRlc3QtPmNvbm5fZmxhZ3MsIGNvbm5fZmxhZ3MpOworCisJLyogYmluZCB0aGUgc2VydmljZSAqLworCWlmICghZGVzdC0+c3ZjKSB7CisJCV9faXBfdnNfYmluZF9zdmMoZGVzdCwgc3ZjKTsKKwl9IGVsc2UgeworCQlpZiAoZGVzdC0+c3ZjICE9IHN2YykgeworCQkJX19pcF92c191bmJpbmRfc3ZjKGRlc3QpOworCQkJaXBfdnNfemVyb19zdGF0cygmZGVzdC0+c3RhdHMpOworCQkJX19pcF92c19iaW5kX3N2YyhkZXN0LCBzdmMpOworCQl9CisJfQorCisJLyogc2V0IHRoZSBkZXN0IHN0YXR1cyBmbGFncyAqLworCWRlc3QtPmZsYWdzIHw9IElQX1ZTX0RFU1RfRl9BVkFJTEFCTEU7CisKKwlpZiAodWRlc3QtPnVfdGhyZXNob2xkID09IDAgfHwgdWRlc3QtPnVfdGhyZXNob2xkID4gZGVzdC0+dV90aHJlc2hvbGQpCisJCWRlc3QtPmZsYWdzICY9IH5JUF9WU19ERVNUX0ZfT1ZFUkxPQUQ7CisJZGVzdC0+dV90aHJlc2hvbGQgPSB1ZGVzdC0+dV90aHJlc2hvbGQ7CisJZGVzdC0+bF90aHJlc2hvbGQgPSB1ZGVzdC0+bF90aHJlc2hvbGQ7Cit9CisKKworLyoKKyAqCUNyZWF0ZSBhIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgaW50CitpcF92c19uZXdfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyX2tlcm4gKnVkZXN0LAorCSAgICAgICBzdHJ1Y3QgaXBfdnNfZGVzdCAqKmRlc3RfcCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwl1bnNpZ25lZCBhdHlwZTsKKworCUVudGVyRnVuY3Rpb24oMik7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChzdmMtPmFmID09IEFGX0lORVQ2KSB7CisJCWF0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnVkZXN0LT5hZGRyLmluNik7CisJCWlmICgoIShhdHlwZSAmIElQVjZfQUREUl9VTklDQVNUKSB8fAorCQkJYXR5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSAmJgorCQkJIV9faXBfdnNfYWRkcl9pc19sb2NhbF92NigmdWRlc3QtPmFkZHIuaW42KSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorI2VuZGlmCisJeworCQlhdHlwZSA9IGluZXRfYWRkcl90eXBlKCZpbml0X25ldCwgdWRlc3QtPmFkZHIuaXApOworCQlpZiAoYXR5cGUgIT0gUlROX0xPQ0FMICYmIGF0eXBlICE9IFJUTl9VTklDQVNUKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19kZXN0KSwgR0ZQX0FUT01JQyk7CisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQlJUF9WU19FUlIoImlwX3ZzX25ld19kZXN0OiBrbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXN0LT5hZiA9IHN2Yy0+YWY7CisJZGVzdC0+cHJvdG9jb2wgPSBzdmMtPnByb3RvY29sOworCWRlc3QtPnZhZGRyID0gc3ZjLT5hZGRyOworCWRlc3QtPnZwb3J0ID0gc3ZjLT5wb3J0OworCWRlc3QtPnZmd21hcmsgPSBzdmMtPmZ3bWFyazsKKwlpcF92c19hZGRyX2NvcHkoc3ZjLT5hZiwgJmRlc3QtPmFkZHIsICZ1ZGVzdC0+YWRkcik7CisJZGVzdC0+cG9ydCA9IHVkZXN0LT5wb3J0OworCisJYXRvbWljX3NldCgmZGVzdC0+YWN0aXZlY29ubnMsIDApOworCWF0b21pY19zZXQoJmRlc3QtPmluYWN0Y29ubnMsIDApOworCWF0b21pY19zZXQoJmRlc3QtPnBlcnNpc3Rjb25ucywgMCk7CisJYXRvbWljX3NldCgmZGVzdC0+cmVmY250LCAwKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXN0LT5kX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZkZXN0LT5kc3RfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRlc3QtPnN0YXRzLmxvY2spOworCV9faXBfdnNfdXBkYXRlX2Rlc3Qoc3ZjLCBkZXN0LCB1ZGVzdCk7CisJaXBfdnNfbmV3X2VzdGltYXRvcigmZGVzdC0+c3RhdHMpOworCisJKmRlc3RfcCA9IGRlc3Q7CisKKwlMZWF2ZUZ1bmN0aW9uKDIpOworCXJldHVybiAwOworfQorCisKKy8qCisgKglBZGQgYSBkZXN0aW5hdGlvbiBpbnRvIGFuIGV4aXN0aW5nIHNlcnZpY2UKKyAqLworc3RhdGljIGludAoraXBfdnNfYWRkX2Rlc3Qoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2Yywgc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcl9rZXJuICp1ZGVzdCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgZGFkZHI7CisJX19iZTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7CisJaW50IHJldDsKKworCUVudGVyRnVuY3Rpb24oMik7CisKKwlpZiAodWRlc3QtPndlaWdodCA8IDApIHsKKwkJSVBfVlNfRVJSKCJpcF92c19hZGRfZGVzdCgpOiBzZXJ2ZXIgd2VpZ2h0IGxlc3MgdGhhbiB6ZXJvXG4iKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJaWYgKHVkZXN0LT5sX3RocmVzaG9sZCA+IHVkZXN0LT51X3RocmVzaG9sZCkgeworCQlJUF9WU19FUlIoImlwX3ZzX2FkZF9kZXN0KCk6IGxvd2VyIHRocmVzaG9sZCBpcyBoaWdoZXIgdGhhbiAiCisJCQkgICJ1cHBlciB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwlpcF92c19hZGRyX2NvcHkoc3ZjLT5hZiwgJmRhZGRyLCAmdWRlc3QtPmFkZHIpOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgZGVzdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdAorCSAqLworCWRlc3QgPSBpcF92c19sb29rdXBfZGVzdChzdmMsICZkYWRkciwgZHBvcnQpOworCisJaWYgKGRlc3QgIT0gTlVMTCkgeworCQlJUF9WU19EQkcoMSwgImlwX3ZzX2FkZF9kZXN0KCk6IGRlc3QgYWxyZWFkeSBleGlzdHNcbiIpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBkZXN0IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0cmFzaCBhbmQKKwkgKiBpcyBmcm9tIHRoZSBzYW1lIHNlcnZpY2UKKwkgKi8KKwlkZXN0ID0gaXBfdnNfdHJhc2hfZ2V0X2Rlc3Qoc3ZjLCAmZGFkZHIsIGRwb3J0KTsKKworCWlmIChkZXN0ICE9IE5VTEwpIHsKKwkJSVBfVlNfREJHX0JVRigzLCAiR2V0IGRlc3RpbmF0aW9uICVzOiV1IGZyb20gdHJhc2gsICIKKwkJCSAgICAgICJkZXN0LT5yZWZjbnQ9JWQsIHNlcnZpY2UgJXUvJXM6JXVcbiIsCisJCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmZGFkZHIpLCBudG9ocyhkcG9ydCksCisJCQkgICAgICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSwKKwkJCSAgICAgIGRlc3QtPnZmd21hcmssCisJCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmZGVzdC0+dmFkZHIpLAorCQkJICAgICAgbnRvaHMoZGVzdC0+dnBvcnQpKTsKKworCQlfX2lwX3ZzX3VwZGF0ZV9kZXN0KHN2YywgZGVzdCwgdWRlc3QpOworCisJCS8qCisJCSAqIEdldCB0aGUgZGVzdGluYXRpb24gZnJvbSB0aGUgdHJhc2gKKwkJICovCisJCWxpc3RfZGVsKCZkZXN0LT5uX2xpc3QpOworCisJCWlwX3ZzX25ld19lc3RpbWF0b3IoJmRlc3QtPnN0YXRzKTsKKworCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCQkvKgorCQkgKiBXYWl0IHVudGlsIGFsbCBvdGhlciBzdmMgdXNlcnMgZ28gYXdheS4KKwkJICovCisJCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOworCisJCWxpc3RfYWRkKCZkZXN0LT5uX2xpc3QsICZzdmMtPmRlc3RpbmF0aW9ucyk7CisJCXN2Yy0+bnVtX2Rlc3RzKys7CisKKwkJLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlciAqLworCQlpZiAoc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKQorCQkJc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKHN2Yyk7CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVzdCBzdHJ1Y3R1cmUKKwkgKi8KKwlyZXQgPSBpcF92c19uZXdfZGVzdChzdmMsIHVkZXN0LCAmZGVzdCk7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQWRkIHRoZSBkZXN0IGVudHJ5IGludG8gdGhlIGxpc3QKKwkgKi8KKwlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCisJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgYWxsIG90aGVyIHN2YyB1c2VycyBnbyBhd2F5LgorCSAqLworCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDEpOworCisJbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJnN2Yy0+ZGVzdGluYXRpb25zKTsKKwlzdmMtPm51bV9kZXN0cysrOworCisJLyogY2FsbCB0aGUgdXBkYXRlX3NlcnZpY2UgZnVuY3Rpb24gb2YgaXRzIHNjaGVkdWxlciAqLworCWlmIChzdmMtPnNjaGVkdWxlci0+dXBkYXRlX3NlcnZpY2UpCisJCXN2Yy0+c2NoZWR1bGVyLT51cGRhdGVfc2VydmljZShzdmMpOworCisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKworCUxlYXZlRnVuY3Rpb24oMik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJRWRpdCBhIGRlc3RpbmF0aW9uIGluIHRoZSBnaXZlbiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBpbnQKK2lwX3ZzX2VkaXRfZGVzdChzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyX2tlcm4gKnVkZXN0KQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCXVuaW9uIG5mX2luZXRfYWRkciBkYWRkcjsKKwlfX2JlMTYgZHBvcnQgPSB1ZGVzdC0+cG9ydDsKKworCUVudGVyRnVuY3Rpb24oMik7CisKKwlpZiAodWRlc3QtPndlaWdodCA8IDApIHsKKwkJSVBfVlNfRVJSKCJpcF92c19lZGl0X2Rlc3QoKTogc2VydmVyIHdlaWdodCBsZXNzIHRoYW4gemVyb1xuIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCWlmICh1ZGVzdC0+bF90aHJlc2hvbGQgPiB1ZGVzdC0+dV90aHJlc2hvbGQpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19lZGl0X2Rlc3QoKTogbG93ZXIgdGhyZXNob2xkIGlzIGhpZ2hlciB0aGFuICIKKwkJCSAgInVwcGVyIHRocmVzaG9sZFxuIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCWlwX3ZzX2FkZHJfY29weShzdmMtPmFmLCAmZGFkZHIsICZ1ZGVzdC0+YWRkcik7CisKKwkvKgorCSAqICBMb29rdXAgdGhlIGRlc3RpbmF0aW9uIGxpc3QKKwkgKi8KKwlkZXN0ID0gaXBfdnNfbG9va3VwX2Rlc3Qoc3ZjLCAmZGFkZHIsIGRwb3J0KTsKKworCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJSVBfVlNfREJHKDEsICJpcF92c19lZGl0X2Rlc3QoKTogZGVzdCBkb2Vzbid0IGV4aXN0XG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJX19pcF92c191cGRhdGVfZGVzdChzdmMsIGRlc3QsIHVkZXN0KTsKKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJLyogV2FpdCB1bnRpbCBhbGwgb3RoZXIgc3ZjIHVzZXJzIGdvIGF3YXkgKi8KKwlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCS8qIGNhbGwgdGhlIHVwZGF0ZV9zZXJ2aWNlLCBiZWNhdXNlIHNlcnZlciB3ZWlnaHQgbWF5IGJlIGNoYW5nZWQgKi8KKwlpZiAoc3ZjLT5zY2hlZHVsZXItPnVwZGF0ZV9zZXJ2aWNlKQorCQlzdmMtPnNjaGVkdWxlci0+dXBkYXRlX3NlcnZpY2Uoc3ZjKTsKKworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwlMZWF2ZUZ1bmN0aW9uKDIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCURlbGV0ZSBhIGRlc3RpbmF0aW9uIChtdXN0IGJlIGFscmVhZHkgdW5saW5rZWQgZnJvbSB0aGUgc2VydmljZSkKKyAqLworc3RhdGljIHZvaWQgX19pcF92c19kZWxfZGVzdChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwlpcF92c19raWxsX2VzdGltYXRvcigmZGVzdC0+c3RhdHMpOworCisJLyoKKwkgKiAgUmVtb3ZlIGl0IGZyb20gdGhlIGQtbGlua2VkIGxpc3Qgd2l0aCB0aGUgcmVhbCBzZXJ2aWNlcy4KKwkgKi8KKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3JzX2xvY2spOworCWlwX3ZzX3JzX3VuaGFzaChkZXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfcnNfbG9jayk7CisKKwkvKgorCSAqICBEZWNyZWFzZSB0aGUgcmVmY250IG9mIHRoZSBkZXN0LCBhbmQgZnJlZSB0aGUgZGVzdAorCSAqICBpZiBub2JvZHkgcmVmZXJzIHRvIGl0IChyZWZjbnQ9MCkuIE90aGVyd2lzZSwgdGhyb3cKKwkgKiAgdGhlIGRlc3RpbmF0aW9uIGludG8gdGhlIHRyYXNoLgorCSAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXN0LT5yZWZjbnQpKSB7CisJCWlwX3ZzX2RzdF9yZXNldChkZXN0KTsKKwkJLyogc2ltcGx5IGRlY3JlYXNlIHN2Yy0+cmVmY250IGhlcmUsIGxldCB0aGUgY2FsbGVyIGNoZWNrCisJCSAgIGFuZCByZWxlYXNlIHRoZSBzZXJ2aWNlIGlmIG5vYm9keSByZWZlcnMgdG8gaXQuCisJCSAgIE9ubHkgdXNlciBjb250ZXh0IGNhbiByZWxlYXNlIGRlc3RpbmF0aW9uIGFuZCBzZXJ2aWNlLAorCQkgICBhbmQgb25seSBvbmUgdXNlciBjb250ZXh0IGNhbiB1cGRhdGUgdmlydHVhbCBzZXJ2aWNlIGF0IGEKKwkJICAgdGltZSwgc28gdGhlIG9wZXJhdGlvbiBoZXJlIGlzIE9LICovCisJCWF0b21pY19kZWMoJmRlc3QtPnN2Yy0+cmVmY250KTsKKwkJa2ZyZWUoZGVzdCk7CisJfSBlbHNlIHsKKwkJSVBfVlNfREJHX0JVRigzLCAiTW92aW5nIGRlc3QgJXM6JXUgaW50byB0cmFzaCwgIgorCQkJICAgICAgImRlc3QtPnJlZmNudD0lZFxuIiwKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKGRlc3QtPmFmLCAmZGVzdC0+YWRkciksCisJCQkgICAgICBudG9ocyhkZXN0LT5wb3J0KSwKKwkJCSAgICAgIGF0b21pY19yZWFkKCZkZXN0LT5yZWZjbnQpKTsKKwkJbGlzdF9hZGQoJmRlc3QtPm5fbGlzdCwgJmlwX3ZzX2Rlc3RfdHJhc2gpOworCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCX0KK30KKworCisvKgorICoJVW5saW5rIGEgZGVzdGluYXRpb24gZnJvbSB0aGUgZ2l2ZW4gc2VydmljZQorICovCitzdGF0aWMgdm9pZCBfX2lwX3ZzX3VubGlua19kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCQkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsCisJCQkJaW50IHN2Y3VwZCkKK3sKKwlkZXN0LT5mbGFncyAmPSB+SVBfVlNfREVTVF9GX0FWQUlMQUJMRTsKKworCS8qCisJICogIFJlbW92ZSBpdCBmcm9tIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0LgorCSAqLworCWxpc3RfZGVsKCZkZXN0LT5uX2xpc3QpOworCXN2Yy0+bnVtX2Rlc3RzLS07CisKKwkvKgorCSAqICBDYWxsIHRoZSB1cGRhdGVfc2VydmljZSBmdW5jdGlvbiBvZiBpdHMgc2NoZWR1bGVyCisJICovCisJaWYgKHN2Y3VwZCAmJiBzdmMtPnNjaGVkdWxlci0+dXBkYXRlX3NlcnZpY2UpCisJCQlzdmMtPnNjaGVkdWxlci0+dXBkYXRlX3NlcnZpY2Uoc3ZjKTsKK30KKworCisvKgorICoJRGVsZXRlIGEgZGVzdGluYXRpb24gc2VydmVyIGluIHRoZSBnaXZlbiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBpbnQKK2lwX3ZzX2RlbF9kZXN0KHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcF92c19kZXN0X3VzZXJfa2VybiAqdWRlc3QpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJX19iZTE2IGRwb3J0ID0gdWRlc3QtPnBvcnQ7CisKKwlFbnRlckZ1bmN0aW9uKDIpOworCisJZGVzdCA9IGlwX3ZzX2xvb2t1cF9kZXN0KHN2YywgJnVkZXN0LT5hZGRyLCBkcG9ydCk7CisKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCUlQX1ZTX0RCRygxLCAiaXBfdnNfZGVsX2Rlc3QoKTogZGVzdGluYXRpb24gbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJLyoKKwkgKglXYWl0IHVudGlsIGFsbCBvdGhlciBzdmMgdXNlcnMgZ28gYXdheS4KKwkgKi8KKwlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCS8qCisJICoJVW5saW5rIGRlc3QgZnJvbSB0aGUgc2VydmljZQorCSAqLworCV9faXBfdnNfdW5saW5rX2Rlc3Qoc3ZjLCBkZXN0LCAxKTsKKworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkvKgorCSAqCURlbGV0ZSB0aGUgZGVzdGluYXRpb24KKwkgKi8KKwlfX2lwX3ZzX2RlbF9kZXN0KGRlc3QpOworCisJTGVhdmVGdW5jdGlvbigyKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglBZGQgYSBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgaGFzaCB0YWJsZQorICovCitzdGF0aWMgaW50CitpcF92c19hZGRfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyX2tlcm4gKnUsCisJCSAgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKipzdmNfcCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICpzY2hlZCA9IE5VTEw7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyA9IE5VTEw7CisKKwkvKiBpbmNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9pbmMoKTsKKworCS8qIExvb2t1cCB0aGUgc2NoZWR1bGVyIGJ5ICd1LT5zY2hlZF9uYW1lJyAqLworCXNjaGVkID0gaXBfdnNfc2NoZWR1bGVyX2dldCh1LT5zY2hlZF9uYW1lKTsKKwlpZiAoc2NoZWQgPT0gTlVMTCkgeworCQlJUF9WU19JTkZPKCJTY2hlZHVsZXIgbW9kdWxlIGlwX3ZzXyVzIG5vdCBmb3VuZFxuIiwKKwkJCSAgIHUtPnNjaGVkX25hbWUpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dF9tb2RfZGVjOworCX0KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKHUtPmFmID09IEFGX0lORVQ2KSB7CisJCWlmICghc2NoZWQtPnN1cHBvcnRzX2lwdjYpIHsKKwkJCXJldCA9IC1FQUZOT1NVUFBPUlQ7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwkJaWYgKCh1LT5uZXRtYXNrIDwgMSkgfHwgKHUtPm5ldG1hc2sgPiAxMjgpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZXJyOworCQl9CisJfQorI2VuZGlmCisKKwlzdmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZSksIEdGUF9BVE9NSUMpOworCWlmIChzdmMgPT0gTlVMTCkgeworCQlJUF9WU19EQkcoMSwgImlwX3ZzX2FkZF9zZXJ2aWNlOiBrbWFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogSSdtIHRoZSBmaXJzdCB1c2VyIG9mIHRoZSBzZXJ2aWNlICovCisJYXRvbWljX3NldCgmc3ZjLT51c2VjbnQsIDEpOworCWF0b21pY19zZXQoJnN2Yy0+cmVmY250LCAwKTsKKworCXN2Yy0+YWYgPSB1LT5hZjsKKwlzdmMtPnByb3RvY29sID0gdS0+cHJvdG9jb2w7CisJaXBfdnNfYWRkcl9jb3B5KHN2Yy0+YWYsICZzdmMtPmFkZHIsICZ1LT5hZGRyKTsKKwlzdmMtPnBvcnQgPSB1LT5wb3J0OworCXN2Yy0+ZndtYXJrID0gdS0+ZndtYXJrOworCXN2Yy0+ZmxhZ3MgPSB1LT5mbGFnczsKKwlzdmMtPnRpbWVvdXQgPSB1LT50aW1lb3V0ICogSFo7CisJc3ZjLT5uZXRtYXNrID0gdS0+bmV0bWFzazsKKworCUlOSVRfTElTVF9IRUFEKCZzdmMtPmRlc3RpbmF0aW9ucyk7CisJcndsb2NrX2luaXQoJnN2Yy0+c2NoZWRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnN2Yy0+c3RhdHMubG9jayk7CisKKwkvKiBCaW5kIHRoZSBzY2hlZHVsZXIgKi8KKwlyZXQgPSBpcF92c19iaW5kX3NjaGVkdWxlcihzdmMsIHNjaGVkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9lcnI7CisJc2NoZWQgPSBOVUxMOworCisJLyogVXBkYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgY291bnRlcnMgKi8KKwlpZiAoc3ZjLT5wb3J0ID09IEZUUFBPUlQpCisJCWF0b21pY19pbmMoJmlwX3ZzX2Z0cHN2Y19jb3VudGVyKTsKKwllbHNlIGlmIChzdmMtPnBvcnQgPT0gMCkKKwkJYXRvbWljX2luYygmaXBfdnNfbnVsbHN2Y19jb3VudGVyKTsKKworCWlwX3ZzX25ld19lc3RpbWF0b3IoJnN2Yy0+c3RhdHMpOworCisJLyogQ291bnQgb25seSBJUHY0IHNlcnZpY2VzIGZvciBvbGQgZ2V0L3NldHNvY2tvcHQgaW50ZXJmYWNlICovCisJaWYgKHN2Yy0+YWYgPT0gQUZfSU5FVCkKKwkJaXBfdnNfbnVtX3NlcnZpY2VzKys7CisKKwkvKiBIYXNoIHRoZSBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgdGFibGUgKi8KKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwlpcF92c19zdmNfaGFzaChzdmMpOworCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisKKwkqc3ZjX3AgPSBzdmM7CisJcmV0dXJuIDA7CisKKyAgb3V0X2VycjoKKwlpZiAoc3ZjICE9IE5VTEwpIHsKKwkJaWYgKHN2Yy0+c2NoZWR1bGVyKQorCQkJaXBfdnNfdW5iaW5kX3NjaGVkdWxlcihzdmMpOworCQlpZiAoc3ZjLT5pbmMpIHsKKwkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJCWlwX3ZzX2FwcF9pbmNfcHV0KHN2Yy0+aW5jKTsKKwkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQl9CisJCWtmcmVlKHN2Yyk7CisJfQorCWlwX3ZzX3NjaGVkdWxlcl9wdXQoc2NoZWQpOworCisgIG91dF9tb2RfZGVjOgorCS8qIGRlY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2RlYygpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICoJRWRpdCBhIHNlcnZpY2UgYW5kIGJpbmQgaXQgd2l0aCBhIG5ldyBzY2hlZHVsZXIKKyAqLworc3RhdGljIGludAoraXBfdnNfZWRpdF9zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXJfa2VybiAqdSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyICpzY2hlZCwgKm9sZF9zY2hlZDsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogTG9va3VwIHRoZSBzY2hlZHVsZXIsIGJ5ICd1LT5zY2hlZF9uYW1lJworCSAqLworCXNjaGVkID0gaXBfdnNfc2NoZWR1bGVyX2dldCh1LT5zY2hlZF9uYW1lKTsKKwlpZiAoc2NoZWQgPT0gTlVMTCkgeworCQlJUF9WU19JTkZPKCJTY2hlZHVsZXIgbW9kdWxlIGlwX3ZzXyVzIG5vdCBmb3VuZFxuIiwKKwkJCSAgIHUtPnNjaGVkX25hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJb2xkX3NjaGVkID0gc2NoZWQ7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmICh1LT5hZiA9PSBBRl9JTkVUNikgeworCQlpZiAoIXNjaGVkLT5zdXBwb3J0c19pcHY2KSB7CisJCQlyZXQgPSAtRUFGTk9TVVBQT1JUOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCh1LT5uZXRtYXNrIDwgMSkgfHwgKHUtPm5ldG1hc2sgPiAxMjgpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisjZW5kaWYKKworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJLyoKKwkgKiBXYWl0IHVudGlsIGFsbCBvdGhlciBzdmMgdXNlcnMgZ28gYXdheS4KKwkgKi8KKwlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAxKTsKKworCS8qCisJICogU2V0IHRoZSBmbGFncyBhbmQgdGltZW91dCB2YWx1ZQorCSAqLworCXN2Yy0+ZmxhZ3MgPSB1LT5mbGFncyB8IElQX1ZTX1NWQ19GX0hBU0hFRDsKKwlzdmMtPnRpbWVvdXQgPSB1LT50aW1lb3V0ICogSFo7CisJc3ZjLT5uZXRtYXNrID0gdS0+bmV0bWFzazsKKworCW9sZF9zY2hlZCA9IHN2Yy0+c2NoZWR1bGVyOworCWlmIChzY2hlZCAhPSBvbGRfc2NoZWQpIHsKKwkJLyoKKwkJICogVW5iaW5kIHRoZSBvbGQgc2NoZWR1bGVyCisJCSAqLworCQlpZiAoKHJldCA9IGlwX3ZzX3VuYmluZF9zY2hlZHVsZXIoc3ZjKSkpIHsKKwkJCW9sZF9zY2hlZCA9IHNjaGVkOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJLyoKKwkJICogQmluZCB0aGUgbmV3IHNjaGVkdWxlcgorCQkgKi8KKwkJaWYgKChyZXQgPSBpcF92c19iaW5kX3NjaGVkdWxlcihzdmMsIHNjaGVkKSkpIHsKKwkJCS8qCisJCQkgKiBJZiBpcF92c19iaW5kX3NjaGVkdWxlciBmYWlscywgcmVzdG9yZSB0aGUgb2xkCisJCQkgKiBzY2hlZHVsZXIuCisJCQkgKiBUaGUgbWFpbiByZWFzb24gb2YgZmFpbHVyZSBpcyBvdXQgb2YgbWVtb3J5LgorCQkJICoKKwkJCSAqIFRoZSBxdWVzdGlvbiBpcyBpZiB0aGUgb2xkIHNjaGVkdWxlciBjYW4gYmUKKwkJCSAqIHJlc3RvcmVkIGFsbCB0aGUgdGltZS4gVE9ETzogaWYgaXQgY2Fubm90IGJlCisJCQkgKiByZXN0b3JlZCBzb21lIHRpbWUsIHdlIG11c3QgZGVsZXRlIHRoZSBzZXJ2aWNlLAorCQkJICogb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gbWF5IGNyYXNoLgorCQkJICovCisJCQlpcF92c19iaW5kX3NjaGVkdWxlcihzdmMsIG9sZF9zY2hlZCk7CisJCQlvbGRfc2NoZWQgPSBzY2hlZDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworICBvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKyAgb3V0OgorI2VuZGlmCisKKwlpZiAob2xkX3NjaGVkKQorCQlpcF92c19zY2hlZHVsZXJfcHV0KG9sZF9zY2hlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKglEZWxldGUgYSBzZXJ2aWNlIGZyb20gdGhlIHNlcnZpY2UgbGlzdAorICoJLSBUaGUgc2VydmljZSBtdXN0IGJlIHVubGlua2VkLCB1bmxvY2tlZCBhbmQgbm90IHJlZmVyZW5jZWQhCisgKgktIFdlIGFyZSBjYWxsZWQgdW5kZXIgX2JoIGxvY2sKKyAqLworc3RhdGljIHZvaWQgX19pcF92c19kZWxfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbnh0OworCXN0cnVjdCBpcF92c19zY2hlZHVsZXIgKm9sZF9zY2hlZDsKKworCS8qIENvdW50IG9ubHkgSVB2NCBzZXJ2aWNlcyBmb3Igb2xkIGdldC9zZXRzb2Nrb3B0IGludGVyZmFjZSAqLworCWlmIChzdmMtPmFmID09IEFGX0lORVQpCisJCWlwX3ZzX251bV9zZXJ2aWNlcy0tOworCisJaXBfdnNfa2lsbF9lc3RpbWF0b3IoJnN2Yy0+c3RhdHMpOworCisJLyogVW5iaW5kIHNjaGVkdWxlciAqLworCW9sZF9zY2hlZCA9IHN2Yy0+c2NoZWR1bGVyOworCWlwX3ZzX3VuYmluZF9zY2hlZHVsZXIoc3ZjKTsKKwlpZiAob2xkX3NjaGVkKQorCQlpcF92c19zY2hlZHVsZXJfcHV0KG9sZF9zY2hlZCk7CisKKwkvKiBVbmJpbmQgYXBwIGluYyAqLworCWlmIChzdmMtPmluYykgeworCQlpcF92c19hcHBfaW5jX3B1dChzdmMtPmluYyk7CisJCXN2Yy0+aW5jID0gTlVMTDsKKwl9CisKKwkvKgorCSAqICAgIFVubGluayB0aGUgd2hvbGUgZGVzdGluYXRpb24gbGlzdAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXN0LCBueHQsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCV9faXBfdnNfdW5saW5rX2Rlc3Qoc3ZjLCBkZXN0LCAwKTsKKwkJX19pcF92c19kZWxfZGVzdChkZXN0KTsKKwl9CisKKwkvKgorCSAqICAgIFVwZGF0ZSB0aGUgdmlydHVhbCBzZXJ2aWNlIGNvdW50ZXJzCisJICovCisJaWYgKHN2Yy0+cG9ydCA9PSBGVFBQT1JUKQorCQlhdG9taWNfZGVjKCZpcF92c19mdHBzdmNfY291bnRlcik7CisJZWxzZSBpZiAoc3ZjLT5wb3J0ID09IDApCisJCWF0b21pY19kZWMoJmlwX3ZzX251bGxzdmNfY291bnRlcik7CisKKwkvKgorCSAqICAgIEZyZWUgdGhlIHNlcnZpY2UgaWYgbm9ib2R5IHJlZmVycyB0byBpdAorCSAqLworCWlmIChhdG9taWNfcmVhZCgmc3ZjLT5yZWZjbnQpID09IDApCisJCWtmcmVlKHN2Yyk7CisKKwkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKK30KKworLyoKKyAqCURlbGV0ZSBhIHNlcnZpY2UgZnJvbSB0aGUgc2VydmljZSBsaXN0CisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfZGVsX3NlcnZpY2Uoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpZiAoc3ZjID09IE5VTEwpCisJCXJldHVybiAtRUVYSVNUOworCisJLyoKKwkgKiBVbmhhc2ggaXQgZnJvbSB0aGUgc2VydmljZSB0YWJsZQorCSAqLworCXdyaXRlX2xvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJaXBfdnNfc3ZjX3VuaGFzaChzdmMpOworCisJLyoKKwkgKiBXYWl0IHVudGlsIGFsbCB0aGUgc3ZjIHVzZXJzIGdvIGF3YXkuCisJICovCisJSVBfVlNfV0FJVF9XSElMRShhdG9taWNfcmVhZCgmc3ZjLT51c2VjbnQpID4gMSk7CisKKwlfX2lwX3ZzX2RlbF9zZXJ2aWNlKHN2Yyk7CisKKwl3cml0ZV91bmxvY2tfYmgoJl9faXBfdnNfc3ZjX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCUZsdXNoIGFsbCB0aGUgdmlydHVhbCBzZXJ2aWNlcworICovCitzdGF0aWMgaW50IGlwX3ZzX2ZsdXNoKHZvaWQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCAqbnh0OworCisJLyoKKwkgKiBGbHVzaCB0aGUgc2VydmljZSB0YWJsZSBoYXNoZWQgYnkgPHByb3RvY29sLGFkZHIscG9ydD4KKwkgKi8KKwlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3ZjLCBueHQsICZpcF92c19zdmNfdGFibGVbaWR4XSwgc19saXN0KSB7CisJCQl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJCWlwX3ZzX3N2Y191bmhhc2goc3ZjKTsKKwkJCS8qCisJCQkgKiBXYWl0IHVudGlsIGFsbCB0aGUgc3ZjIHVzZXJzIGdvIGF3YXkuCisJCQkgKi8KKwkJCUlQX1ZTX1dBSVRfV0hJTEUoYXRvbWljX3JlYWQoJnN2Yy0+dXNlY250KSA+IDApOworCQkJX19pcF92c19kZWxfc2VydmljZShzdmMpOworCQkJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwkJfQorCX0KKworCS8qCisJICogRmx1c2ggdGhlIHNlcnZpY2UgdGFibGUgaGFzaGVkIGJ5IGZ3bWFyaworCSAqLworCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdmMsIG54dCwKKwkJCQkJICZpcF92c19zdmNfZndtX3RhYmxlW2lkeF0sIGZfbGlzdCkgeworCQkJd3JpdGVfbG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisJCQlpcF92c19zdmNfdW5oYXNoKHN2Yyk7CisJCQkvKgorCQkJICogV2FpdCB1bnRpbCBhbGwgdGhlIHN2YyB1c2VycyBnbyBhd2F5LgorCQkJICovCisJCQlJUF9WU19XQUlUX1dISUxFKGF0b21pY19yZWFkKCZzdmMtPnVzZWNudCkgPiAwKTsKKwkJCV9faXBfdnNfZGVsX3NlcnZpY2Uoc3ZjKTsKKwkJCXdyaXRlX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJWmVybyBjb3VudGVycyBpbiBhIHNlcnZpY2Ugb3IgYWxsIHNlcnZpY2VzCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfemVyb19zZXJ2aWNlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisKKwl3cml0ZV9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCWlwX3ZzX3plcm9fc3RhdHMoJmRlc3QtPnN0YXRzKTsKKwl9CisJaXBfdnNfemVyb19zdGF0cygmc3ZjLT5zdGF0cyk7CisJd3JpdGVfdW5sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcF92c196ZXJvX2FsbCh2b2lkKQoreworCWludCBpZHg7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgeworCQkJaXBfdnNfemVyb19zZXJ2aWNlKHN2Yyk7CisJCX0KKwl9CisKKwlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQlpcF92c196ZXJvX3NlcnZpY2Uoc3ZjKTsKKwkJfQorCX0KKworCWlwX3ZzX3plcm9fc3RhdHMoJmlwX3ZzX3N0YXRzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50Citwcm9jX2RvX2RlZmVuc2VfbW9kZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKKwlpbnQgdmFsID0gKnZhbHA7CisJaW50IHJjOworCisJcmMgPSBwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAod3JpdGUgJiYgKCp2YWxwICE9IHZhbCkpIHsKKwkJaWYgKCgqdmFscCA8IDApIHx8ICgqdmFscCA+IDMpKSB7CisJCQkvKiBSZXN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlICovCisJCQkqdmFscCA9IHZhbDsKKwkJfSBlbHNlIHsKKwkJCXVwZGF0ZV9kZWZlbnNlX2xldmVsKCk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQKK3Byb2NfZG9fc3luY190aHJlc2hvbGQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOworCWludCB2YWxbMl07CisJaW50IHJjOworCisJLyogYmFja3VwIHRoZSB2YWx1ZSBmaXJzdCAqLworCW1lbWNweSh2YWwsIHZhbHAsIHNpemVvZih2YWwpKTsKKworCXJjID0gcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHdyaXRlICYmICh2YWxwWzBdIDwgMCB8fCB2YWxwWzFdIDwgMCB8fCB2YWxwWzBdID49IHZhbHBbMV0pKSB7CisJCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KKwkJbWVtY3B5KHZhbHAsIHZhbCwgc2l6ZW9mKHZhbCkpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqCUlQVlMgc3lzY3RsIHRhYmxlICh1bmRlciB0aGUgL3Byb2Mvc3lzL25ldC9pcHY0L3ZzLykKKyAqLworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB2c192YXJzW10gPSB7CisJeworCQkucHJvY25hbWUJPSAiYW1lbXRocmVzaCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfYW1lbXRocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisjaWZkZWYgQ09ORklHX0lQX1ZTX0RFQlVHCisJeworCQkucHJvY25hbWUJPSAiZGVidWdfbGV2ZWwiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2RlYnVnX2xldmVsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKyNlbmRpZgorCXsKKwkJLnByb2NuYW1lCT0gImFtX2Ryb3ByYXRlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19hbV9kcm9wcmF0ZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUJPSAiZHJvcF9lbnRyeSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2RlZmVuc2VfbW9kZSwKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gImRyb3BfcGFja2V0IiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19kcm9wX3BhY2tldCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2RlZmVuc2VfbW9kZSwKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInNlY3VyZV90Y3AiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX3NlY3VyZV90Y3AsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19kZWZlbnNlX21vZGUsCisJfSwKKyNpZiAwCisJeworCQkucHJvY25hbWUJPSAidGltZW91dF9lc3RhYmxpc2hlZCIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19FU1RBQkxJU0hFRF0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkucHJvY25hbWUJPSAidGltZW91dF9zeW5zZW50IiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1NZTl9TRU5UXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bnJlY3YiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfU1lOX1JFQ1ZdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfZmlud2FpdCIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19GSU5fV0FJVF0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkucHJvY25hbWUJPSAidGltZW91dF90aW1ld2FpdCIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19USU1FX1dBSVRdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfY2xvc2UiLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfQ0xPU0VdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfY2xvc2V3YWl0IiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0NMT1NFX1dBSVRdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfbGFzdGFjayIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19MQVNUX0FDS10sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkucHJvY25hbWUJPSAidGltZW91dF9saXN0ZW4iLAorCQkuZGF0YQk9ICZ2c190aW1lb3V0X3RhYmxlX2Rvcy50aW1lb3V0W0lQX1ZTX1NfTElTVEVOXSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJ0aW1lb3V0X3N5bmFjayIsCisJCS5kYXRhCT0gJnZzX3RpbWVvdXRfdGFibGVfZG9zLnRpbWVvdXRbSVBfVlNfU19TWU5BQ0tdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRpbWVvdXRfdWRwIiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX1VEUF0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkucHJvY25hbWUJPSAidGltZW91dF9pY21wIiwKKwkJLmRhdGEJPSAmdnNfdGltZW91dF90YWJsZV9kb3MudGltZW91dFtJUF9WU19TX0lDTVBdLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorI2VuZGlmCisJeworCQkucHJvY25hbWUJPSAiY2FjaGVfYnlwYXNzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19jYWNoZV9ieXBhc3MsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gImV4cGlyZV9ub2Rlc3RfY29ubiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfZXhwaXJlX25vZGVzdF9jb25uLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJleHBpcmVfcXVpZXNjZW50X3RlbXBsYXRlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9pcF92c19leHBpcmVfcXVpZXNjZW50X3RlbXBsYXRlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJzeW5jX3RocmVzaG9sZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfc3luY190aHJlc2hvbGQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9pcF92c19zeW5jX3RocmVzaG9sZCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19zeW5jX3RocmVzaG9sZCwKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gIm5hdF9pY21wX3NlbmQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX25hdF9pY21wX3NlbmQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitjb25zdCBzdHJ1Y3QgY3RsX3BhdGggbmV0X3ZzX2N0bF9wYXRoW10gPSB7CisJeyAucHJvY25hbWUgPSAibmV0IiwgLmN0bF9uYW1lID0gQ1RMX05FVCwgfSwKKwl7IC5wcm9jbmFtZSA9ICJpcHY0IiwgLmN0bF9uYW1lID0gTkVUX0lQVjQsIH0sCisJeyAucHJvY25hbWUgPSAidnMiLCB9LAorCXsgfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5ldF92c19jdGxfcGF0aCk7CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIHN5c2N0bF9oZWFkZXI7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdHJ1Y3QgaXBfdnNfaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCAqdGFibGU7CisJaW50IGJ1Y2tldDsKK307CisKKy8qCisgKglXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIFZTIHJ1bGUgdGFibGUgdG8gYSBQUk9DZnMgZmlsZS4KKyAqCShJdCBpcyBrZXB0IGp1c3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaXBfdnNfZndkX25hbWUodW5zaWduZWQgZmxhZ3MpCit7CisJc3dpdGNoIChmbGFncyAmIElQX1ZTX0NPTk5fRl9GV0RfTUFTSykgeworCWNhc2UgSVBfVlNfQ09OTl9GX0xPQ0FMTk9ERToKKwkJcmV0dXJuICJMb2NhbCI7CisJY2FzZSBJUF9WU19DT05OX0ZfVFVOTkVMOgorCQlyZXR1cm4gIlR1bm5lbCI7CisJY2FzZSBJUF9WU19DT05OX0ZfRFJPVVRFOgorCQlyZXR1cm4gIlJvdXRlIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIk1hc3EiOworCX0KK30KKworCisvKiBHZXQgdGhlIE50aCBlbnRyeSBpbiB0aGUgdHdvIGxpc3RzICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKmlwX3ZzX2luZm9fYXJyYXkoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCisJLyogbG9vayBpbiBoYXNoIGJ5IHByb3RvY29sICovCisJZm9yIChpZHggPSAwOyBpZHggPCBJUF9WU19TVkNfVEFCX1NJWkU7IGlkeCsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ZjLCAmaXBfdnNfc3ZjX3RhYmxlW2lkeF0sIHNfbGlzdCkgeworCQkJaWYgKHBvcy0tID09IDApeworCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX3RhYmxlOworCQkJCWl0ZXItPmJ1Y2tldCA9IGlkeDsKKwkJCQlyZXR1cm4gc3ZjOworCQkJfQorCQl9CisJfQorCisJLyoga2VlcCBsb29raW5nIGluIGZ3bWFyayAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQlpZiAocG9zLS0gPT0gMCkgeworCQkJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKKwkJCQlpdGVyLT5idWNrZXQgPSBpZHg7CisJCQkJcmV0dXJuIHN2YzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqaXBfdnNfaW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQorX19hY3F1aXJlcyhfX2lwX3ZzX3N2Y19sb2NrKQoreworCisJcmVhZF9sb2NrX2JoKCZfX2lwX3ZzX3N2Y19sb2NrKTsKKwlyZXR1cm4gKnBvcyA/IGlwX3ZzX2luZm9fYXJyYXkoc2VxLCAqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKKworc3RhdGljIHZvaWQgKmlwX3ZzX2luZm9fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmU7CisJc3RydWN0IGlwX3ZzX2l0ZXIgKml0ZXI7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBpcF92c19pbmZvX2FycmF5KHNlcSwwKTsKKworCXN2YyA9IHY7CisJaXRlciA9IHNlcS0+cHJpdmF0ZTsKKworCWlmIChpdGVyLT50YWJsZSA9PSBpcF92c19zdmNfdGFibGUpIHsKKwkJLyogbmV4dCBzZXJ2aWNlIGluIHRhYmxlIGhhc2hlZCBieSBwcm90b2NvbCAqLworCQlpZiAoKGUgPSBzdmMtPnNfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX3RhYmxlW2l0ZXItPmJ1Y2tldF0pCisJCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgc19saXN0KTsKKworCisJCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsJmlwX3ZzX3N2Y190YWJsZVtpdGVyLT5idWNrZXRdLAorCQkJCQkgICAgc19saXN0KSB7CisJCQkJcmV0dXJuIHN2YzsKKwkJCX0KKwkJfQorCisJCWl0ZXItPnRhYmxlID0gaXBfdnNfc3ZjX2Z3bV90YWJsZTsKKwkJaXRlci0+YnVja2V0ID0gLTE7CisJCWdvdG8gc2Nhbl9md21hcms7CisJfQorCisJLyogbmV4dCBzZXJ2aWNlIGluIGhhc2hlZCBieSBmd21hcmsgKi8KKwlpZiAoKGUgPSBzdmMtPmZfbGlzdC5uZXh0KSAhPSAmaXBfdnNfc3ZjX2Z3bV90YWJsZVtpdGVyLT5idWNrZXRdKQorCQlyZXR1cm4gbGlzdF9lbnRyeShlLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSwgZl9saXN0KTsKKworIHNjYW5fZndtYXJrOgorCXdoaWxlICgrK2l0ZXItPmJ1Y2tldCA8IElQX1ZTX1NWQ19UQUJfU0laRSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaXRlci0+YnVja2V0XSwKKwkJCQkgICAgZl9saXN0KQorCQkJcmV0dXJuIHN2YzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfaW5mb19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK19fcmVsZWFzZXMoX19pcF92c19zdmNfbG9jaykKK3sKKwlyZWFkX3VubG9ja19iaCgmX19pcF92c19zdmNfbG9jayk7Cit9CisKKworc3RhdGljIGludCBpcF92c19pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSJJUCBWaXJ0dWFsIFNlcnZlciB2ZXJzaW9uICVkLiVkLiVkIChzaXplPSVkKVxuIiwKKwkJCU5WRVJTSU9OKElQX1ZTX1ZFUlNJT05fQ09ERSksIElQX1ZTX0NPTk5fVEFCX1NJWkUpOworCQlzZXFfcHV0cyhzZXEsCisJCQkgIlByb3QgTG9jYWxBZGRyZXNzOlBvcnQgU2NoZWR1bGVyIEZsYWdzXG4iKTsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICIgIC0+IFJlbW90ZUFkZHJlc3M6UG9ydCBGb3J3YXJkIFdlaWdodCBBY3RpdmVDb25uIEluQWN0Q29ublxuIik7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YyA9IHY7CisJCWNvbnN0IHN0cnVjdCBpcF92c19pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOworCQljb25zdCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCQlpZiAoaXRlci0+dGFibGUgPT0gaXBfdnNfc3ZjX3RhYmxlKSB7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkJCWlmIChzdmMtPmFmID09IEFGX0lORVQ2KQorCQkJCXNlcV9wcmludGYoc2VxLCAiJXMgIFsiIE5JUDZfRk1UICJdOiUwNFggJXMgIiwKKwkJCQkJICAgaXBfdnNfcHJvdG9fbmFtZShzdmMtPnByb3RvY29sKSwKKwkJCQkJICAgTklQNihzdmMtPmFkZHIuaW42KSwKKwkJCQkJICAgbnRvaHMoc3ZjLT5wb3J0KSwKKwkJCQkJICAgc3ZjLT5zY2hlZHVsZXItPm5hbWUpOworCQkJZWxzZQorI2VuZGlmCisJCQkJc2VxX3ByaW50ZihzZXEsICIlcyAgJTA4WDolMDRYICVzICIsCisJCQkJCSAgIGlwX3ZzX3Byb3RvX25hbWUoc3ZjLT5wcm90b2NvbCksCisJCQkJCSAgIG50b2hsKHN2Yy0+YWRkci5pcCksCisJCQkJCSAgIG50b2hzKHN2Yy0+cG9ydCksCisJCQkJCSAgIHN2Yy0+c2NoZWR1bGVyLT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiRldNICAlMDhYICVzICIsCisJCQkJICAgc3ZjLT5md21hcmssIHN2Yy0+c2NoZWR1bGVyLT5uYW1lKTsKKwkJfQorCisJCWlmIChzdmMtPmZsYWdzICYgSVBfVlNfU1ZDX0ZfUEVSU0lTVEVOVCkKKwkJCXNlcV9wcmludGYoc2VxLCAicGVyc2lzdGVudCAlZCAlMDhYXG4iLAorCQkJCXN2Yy0+dGltZW91dCwKKwkJCQludG9obChzdmMtPm5ldG1hc2spKTsKKwkJZWxzZQorCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkJCWlmIChkZXN0LT5hZiA9PSBBRl9JTkVUNikKKwkJCQlzZXFfcHJpbnRmKHNlcSwKKwkJCQkJICAgIiAgLT4gWyIgTklQNl9GTVQgIl06JTA0WCIKKwkJCQkJICAgIiAgICAgICUtN3MgJS02ZCAlLTEwZCAlLTEwZFxuIiwKKwkJCQkJICAgTklQNihkZXN0LT5hZGRyLmluNiksCisJCQkJCSAgIG50b2hzKGRlc3QtPnBvcnQpLAorCQkJCQkgICBpcF92c19md2RfbmFtZShhdG9taWNfcmVhZCgmZGVzdC0+Y29ubl9mbGFncykpLAorCQkJCQkgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSwKKwkJCQkJICAgYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSwKKwkJCQkJICAgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpKTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCXNlcV9wcmludGYoc2VxLAorCQkJCQkgICAiICAtPiAlMDhYOiUwNFggICAgICAiCisJCQkJCSAgICIlLTdzICUtNmQgJS0xMGQgJS0xMGRcbiIsCisJCQkJCSAgIG50b2hsKGRlc3QtPmFkZHIuaXApLAorCQkJCQkgICBudG9ocyhkZXN0LT5wb3J0KSwKKwkJCQkJICAgaXBfdnNfZndkX25hbWUoYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpKSwKKwkJCQkJICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCksCisJCQkJCSAgIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucyksCisJCQkJCSAgIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKSk7CisKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcF92c19pbmZvX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gaXBfdnNfaW5mb19zZXFfc3RhcnQsCisJLm5leHQgID0gaXBfdnNfaW5mb19zZXFfbmV4dCwKKwkuc3RvcCAgPSBpcF92c19pbmZvX3NlcV9zdG9wLAorCS5zaG93ICA9IGlwX3ZzX2luZm9fc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IGlwX3ZzX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW5fcHJpdmF0ZShmaWxlLCAmaXBfdnNfaW5mb19zZXFfb3BzLAorCQkJc2l6ZW9mKHN0cnVjdCBpcF92c19pdGVyKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwX3ZzX2luZm9fZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBpcF92c19pbmZvX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYKKworc3RydWN0IGlwX3ZzX3N0YXRzIGlwX3ZzX3N0YXRzID0geworCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaXBfdnNfc3RhdHMubG9jayksCit9OworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgaXBfdnNfc3RhdHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKworLyogICAgICAgICAgICAgICAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3IDAxMjM0NTY3MDEyMzQ1NjcgKi8KKwlzZXFfcHV0cyhzZXEsCisJCSAiICAgVG90YWwgSW5jb21pbmcgT3V0Z29pbmcgICAgICAgICBJbmNvbWluZyAgICAgICAgIE91dGdvaW5nXG4iKTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiAgIENvbm5zICBQYWNrZXRzICBQYWNrZXRzICAgICAgICAgICAgQnl0ZXMgICAgICAgICAgICBCeXRlc1xuIik7CisKKwlzcGluX2xvY2tfYmgoJmlwX3ZzX3N0YXRzLmxvY2spOworCXNlcV9wcmludGYoc2VxLCAiJThYICU4WCAlOFggJTE2TFggJTE2TFhcblxuIiwgaXBfdnNfc3RhdHMudXN0YXRzLmNvbm5zLAorCQkgICBpcF92c19zdGF0cy51c3RhdHMuaW5wa3RzLCBpcF92c19zdGF0cy51c3RhdHMub3V0cGt0cywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaXBfdnNfc3RhdHMudXN0YXRzLmluYnl0ZXMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGlwX3ZzX3N0YXRzLnVzdGF0cy5vdXRieXRlcyk7CisKKy8qICAgICAgICAgICAgICAgICAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3IDAxMjM0NTY3MDEyMzQ1NjcgKi8KKwlzZXFfcHV0cyhzZXEsCisJCSAgICIgQ29ubnMvcyAgIFBrdHMvcyAgIFBrdHMvcyAgICAgICAgICBCeXRlcy9zICAgICAgICAgIEJ5dGVzL3NcbiIpOworCXNlcV9wcmludGYoc2VxLCIlOFggJThYICU4WCAlMTZYICUxNlhcbiIsCisJCQlpcF92c19zdGF0cy51c3RhdHMuY3BzLAorCQkJaXBfdnNfc3RhdHMudXN0YXRzLmlucHBzLAorCQkJaXBfdnNfc3RhdHMudXN0YXRzLm91dHBwcywKKwkJCWlwX3ZzX3N0YXRzLnVzdGF0cy5pbmJwcywKKwkJCWlwX3ZzX3N0YXRzLnVzdGF0cy5vdXRicHMpOworCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zdGF0cy5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwX3ZzX3N0YXRzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpcF92c19zdGF0c19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBfdnNfc3RhdHNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGlwX3ZzX3N0YXRzX3NlcV9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworI2VuZGlmCisKKy8qCisgKglTZXQgdGltZW91dCB2YWx1ZXMgZm9yIHRjcCB0Y3BmaW4gdWRwIGluIHRoZSB0aW1lb3V0X3RhYmxlLgorICovCitzdGF0aWMgaW50IGlwX3ZzX3NldF90aW1lb3V0KHN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgKnUpCit7CisJSVBfVlNfREJHKDIsICJTZXR0aW5nIHRpbWVvdXQgdGNwOiVkIHRjcGZpbjolZCB1ZHA6JWRcbiIsCisJCSAgdS0+dGNwX3RpbWVvdXQsCisJCSAgdS0+dGNwX2Zpbl90aW1lb3V0LAorCQkgIHUtPnVkcF90aW1lb3V0KTsKKworI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19UQ1AKKwlpZiAodS0+dGNwX3RpbWVvdXQpIHsKKwkJaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCisJCQk9IHUtPnRjcF90aW1lb3V0ICogSFo7CisJfQorCisJaWYgKHUtPnRjcF9maW5fdGltZW91dCkgeworCQlpcF92c19wcm90b2NvbF90Y3AudGltZW91dF90YWJsZVtJUF9WU19UQ1BfU19GSU5fV0FJVF0KKwkJCT0gdS0+dGNwX2Zpbl90aW1lb3V0ICogSFo7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVURQCisJaWYgKHUtPnVkcF90aW1lb3V0KSB7CisJCWlwX3ZzX3Byb3RvY29sX3VkcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF0KKwkJCT0gdS0+dWRwX3RpbWVvdXQgKiBIWjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIFNFVF9DTURJRChjbWQpCQkoY21kIC0gSVBfVlNfQkFTRV9DVEwpCisjZGVmaW5lIFNFUlZJQ0VfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyKSkKKyNkZWZpbmUgU1ZDREVTVF9BUkdfTEVOCQkoc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIpICsJXAorCQkJCSBzaXplb2Yoc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcikpCisjZGVmaW5lIFRJTUVPVVRfQVJHX0xFTgkJKHNpemVvZihzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyKSkKKyNkZWZpbmUgREFFTU9OX0FSR19MRU4JCShzaXplb2Yoc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyKSkKKyNkZWZpbmUgTUFYX0FSR19MRU4JCVNWQ0RFU1RfQVJHX0xFTgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzZXRfYXJnbGVuW1NFVF9DTURJRChJUF9WU19TT19TRVRfTUFYKSsxXSA9IHsKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9BREQpXQkJPSBTRVJWSUNFX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVCldCQk9IFNFUlZJQ0VfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUwpXQkJPSBTRVJWSUNFX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRkxVU0gpXQkJPSAwLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX0FERERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9ERUxERVNUKV0JPSBTVkNERVNUX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfRURJVERFU1QpXQk9IFNWQ0RFU1RfQVJHX0xFTiwKKwlbU0VUX0NNRElEKElQX1ZTX1NPX1NFVF9USU1FT1VUKV0JPSBUSU1FT1VUX0FSR19MRU4sCisJW1NFVF9DTURJRChJUF9WU19TT19TRVRfU1RBUlREQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1NUT1BEQUVNT04pXQk9IERBRU1PTl9BUkdfTEVOLAorCVtTRVRfQ01ESUQoSVBfVlNfU09fU0VUX1pFUk8pXQkJPSBTRVJWSUNFX0FSR19MRU4sCit9OworCitzdGF0aWMgdm9pZCBpcF92c19jb3B5X3VzdmNfY29tcGF0KHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXJfa2VybiAqdXN2YywKKwkJCQkgIHN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXIgKnVzdmNfY29tcGF0KQoreworCXVzdmMtPmFmCQk9IEFGX0lORVQ7CisJdXN2Yy0+cHJvdG9jb2wJCT0gdXN2Y19jb21wYXQtPnByb3RvY29sOworCXVzdmMtPmFkZHIuaXAJCT0gdXN2Y19jb21wYXQtPmFkZHI7CisJdXN2Yy0+cG9ydAkJPSB1c3ZjX2NvbXBhdC0+cG9ydDsKKwl1c3ZjLT5md21hcmsJCT0gdXN2Y19jb21wYXQtPmZ3bWFyazsKKworCS8qIERlZXAgY29weSBvZiBzY2hlZF9uYW1lIGlzIG5vdCBuZWVkZWQgaGVyZSAqLworCXVzdmMtPnNjaGVkX25hbWUJPSB1c3ZjX2NvbXBhdC0+c2NoZWRfbmFtZTsKKworCXVzdmMtPmZsYWdzCQk9IHVzdmNfY29tcGF0LT5mbGFnczsKKwl1c3ZjLT50aW1lb3V0CQk9IHVzdmNfY29tcGF0LT50aW1lb3V0OworCXVzdmMtPm5ldG1hc2sJCT0gdXN2Y19jb21wYXQtPm5ldG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIGlwX3ZzX2NvcHlfdWRlc3RfY29tcGF0KHN0cnVjdCBpcF92c19kZXN0X3VzZXJfa2VybiAqdWRlc3QsCisJCQkJICAgc3RydWN0IGlwX3ZzX2Rlc3RfdXNlciAqdWRlc3RfY29tcGF0KQoreworCXVkZXN0LT5hZGRyLmlwCQk9IHVkZXN0X2NvbXBhdC0+YWRkcjsKKwl1ZGVzdC0+cG9ydAkJPSB1ZGVzdF9jb21wYXQtPnBvcnQ7CisJdWRlc3QtPmNvbm5fZmxhZ3MJPSB1ZGVzdF9jb21wYXQtPmNvbm5fZmxhZ3M7CisJdWRlc3QtPndlaWdodAkJPSB1ZGVzdF9jb21wYXQtPndlaWdodDsKKwl1ZGVzdC0+dV90aHJlc2hvbGQJPSB1ZGVzdF9jb21wYXQtPnVfdGhyZXNob2xkOworCXVkZXN0LT5sX3RocmVzaG9sZAk9IHVkZXN0X2NvbXBhdC0+bF90aHJlc2hvbGQ7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2lwX3ZzX3NldF9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgYXJnW01BWF9BUkdfTEVOXTsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyICp1c3ZjX2NvbXBhdDsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyX2tlcm4gdXN2YzsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCXN0cnVjdCBpcF92c19kZXN0X3VzZXIgKnVkZXN0X2NvbXBhdDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyX2tlcm4gdWRlc3Q7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobGVuICE9IHNldF9hcmdsZW5bU0VUX0NNRElEKGNtZCldKSB7CisJCUlQX1ZTX0VSUigic2V0X2N0bDogbGVuICV1ICE9ICV1XG4iLAorCQkJICBsZW4sIHNldF9hcmdsZW5bU0VUX0NNRElEKGNtZCldKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgdXNlciwgbGVuKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGluY3JlYXNlIHRoZSBtb2R1bGUgdXNlIGNvdW50ICovCisJaXBfdnNfdXNlX2NvdW50X2luYygpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmX19pcF92c19tdXRleCkpIHsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIG91dF9kZWM7CisJfQorCisJaWYgKGNtZCA9PSBJUF9WU19TT19TRVRfRkxVU0gpIHsKKwkJLyogRmx1c2ggdGhlIHZpcnR1YWwgc2VydmljZSAqLworCQlyZXQgPSBpcF92c19mbHVzaCgpOworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChjbWQgPT0gSVBfVlNfU09fU0VUX1RJTUVPVVQpIHsKKwkJLyogU2V0IHRpbWVvdXQgdmFsdWVzIGZvciAodGNwIHRjcGZpbiB1ZHApICovCisJCXJldCA9IGlwX3ZzX3NldF90aW1lb3V0KChzdHJ1Y3QgaXBfdnNfdGltZW91dF91c2VyICopYXJnKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSBpZiAoY21kID09IElQX1ZTX1NPX1NFVF9TVEFSVERBRU1PTikgeworCQlzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgKmRtID0gKHN0cnVjdCBpcF92c19kYWVtb25fdXNlciAqKWFyZzsKKwkJcmV0ID0gc3RhcnRfc3luY190aHJlYWQoZG0tPnN0YXRlLCBkbS0+bWNhc3RfaWZuLCBkbS0+c3luY2lkKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSBpZiAoY21kID09IElQX1ZTX1NPX1NFVF9TVE9QREFFTU9OKSB7CisJCXN0cnVjdCBpcF92c19kYWVtb25fdXNlciAqZG0gPSAoc3RydWN0IGlwX3ZzX2RhZW1vbl91c2VyICopYXJnOworCQlyZXQgPSBzdG9wX3N5bmNfdGhyZWFkKGRtLT5zdGF0ZSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl1c3ZjX2NvbXBhdCA9IChzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyICopYXJnOworCXVkZXN0X2NvbXBhdCA9IChzdHJ1Y3QgaXBfdnNfZGVzdF91c2VyICopKHVzdmNfY29tcGF0ICsgMSk7CisKKwkvKiBXZSBvbmx5IHVzZSB0aGUgbmV3IHN0cnVjdHMgaW50ZXJuYWxseSwgc28gY29weSB1c2Vyc3BhY2UgY29tcGF0CisJICogc3RydWN0cyB0byBleHRlbmRlZCBpbnRlcm5hbCB2ZXJzaW9ucyAqLworCWlwX3ZzX2NvcHlfdXN2Y19jb21wYXQoJnVzdmMsIHVzdmNfY29tcGF0KTsKKwlpcF92c19jb3B5X3VkZXN0X2NvbXBhdCgmdWRlc3QsIHVkZXN0X2NvbXBhdCk7CisKKwlpZiAoY21kID09IElQX1ZTX1NPX1NFVF9aRVJPKSB7CisJCS8qIGlmIG5vIHNlcnZpY2UgYWRkcmVzcyBpcyBzZXQsIHplcm8gY291bnRlcnMgaW4gYWxsICovCisJCWlmICghdXN2Yy5md21hcmsgJiYgIXVzdmMuYWRkci5pcCAmJiAhdXN2Yy5wb3J0KSB7CisJCQlyZXQgPSBpcF92c196ZXJvX2FsbCgpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJLyogQ2hlY2sgZm9yIHZhbGlkIHByb3RvY29sOiBUQ1Agb3IgVURQLCBldmVuIGZvciBmd21hcmshPTAgKi8KKwlpZiAodXN2Yy5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJiB1c3ZjLnByb3RvY29sICE9IElQUFJPVE9fVURQKSB7CisJCUlQX1ZTX0VSUigic2V0X2N0bDogaW52YWxpZCBwcm90b2NvbDogJWQgJWQuJWQuJWQuJWQ6JWQgJXNcbiIsCisJCQkgIHVzdmMucHJvdG9jb2wsIE5JUFFVQUQodXN2Yy5hZGRyLmlwKSwKKwkJCSAgbnRvaHModXN2Yy5wb3J0KSwgdXN2Yy5zY2hlZF9uYW1lKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIExvb2t1cCB0aGUgZXhhY3Qgc2VydmljZSBieSA8cHJvdG9jb2wsIGFkZHIsIHBvcnQ+IG9yIGZ3bWFyayAqLworCWlmICh1c3ZjLmZ3bWFyayA9PSAwKQorCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KHVzdmMuYWYsIHVzdmMucHJvdG9jb2wsCisJCQkJCSAgJnVzdmMuYWRkciwgdXN2Yy5wb3J0KTsKKwllbHNlCisJCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy5hZiwgdXN2Yy5md21hcmspOworCisJaWYgKGNtZCAhPSBJUF9WU19TT19TRVRfQURECisJICAgICYmIChzdmMgPT0gTlVMTCB8fCBzdmMtPnByb3RvY29sICE9IHVzdmMucHJvdG9jb2wpKSB7CisJCXJldCA9IC1FU1JDSDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJUF9WU19TT19TRVRfQUREOgorCQlpZiAoc3ZjICE9IE5VTEwpCisJCQlyZXQgPSAtRUVYSVNUOworCQllbHNlCisJCQlyZXQgPSBpcF92c19hZGRfc2VydmljZSgmdXN2YywgJnN2Yyk7CisJCWJyZWFrOworCWNhc2UgSVBfVlNfU09fU0VUX0VESVQ6CisJCXJldCA9IGlwX3ZzX2VkaXRfc2VydmljZShzdmMsICZ1c3ZjKTsKKwkJYnJlYWs7CisJY2FzZSBJUF9WU19TT19TRVRfREVMOgorCQlyZXQgPSBpcF92c19kZWxfc2VydmljZShzdmMpOworCQlpZiAoIXJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJYnJlYWs7CisJY2FzZSBJUF9WU19TT19TRVRfWkVSTzoKKwkJcmV0ID0gaXBfdnNfemVyb19zZXJ2aWNlKHN2Yyk7CisJCWJyZWFrOworCWNhc2UgSVBfVlNfU09fU0VUX0FERERFU1Q6CisJCXJldCA9IGlwX3ZzX2FkZF9kZXN0KHN2YywgJnVkZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBJUF9WU19TT19TRVRfRURJVERFU1Q6CisJCXJldCA9IGlwX3ZzX2VkaXRfZGVzdChzdmMsICZ1ZGVzdCk7CisJCWJyZWFrOworCWNhc2UgSVBfVlNfU09fU0VUX0RFTERFU1Q6CisJCXJldCA9IGlwX3ZzX2RlbF9kZXN0KHN2YywgJnVkZXN0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3ZjKQorCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCisgIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZfX2lwX3ZzX211dGV4KTsKKyAgb3V0X2RlYzoKKwkvKiBkZWNyZWFzZSB0aGUgbW9kdWxlIHVzZSBjb3VudCAqLworCWlwX3ZzX3VzZV9jb3VudF9kZWMoKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQKK2lwX3ZzX2NvcHlfc3RhdHMoc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgKmRzdCwgc3RydWN0IGlwX3ZzX3N0YXRzICpzcmMpCit7CisJc3Bpbl9sb2NrX2JoKCZzcmMtPmxvY2spOworCW1lbWNweShkc3QsICZzcmMtPnVzdGF0cywgc2l6ZW9mKCpkc3QpKTsKKwlzcGluX3VubG9ja19iaCgmc3JjLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK2lwX3ZzX2NvcHlfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqZHN0LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3JjKQoreworCWRzdC0+cHJvdG9jb2wgPSBzcmMtPnByb3RvY29sOworCWRzdC0+YWRkciA9IHNyYy0+YWRkci5pcDsKKwlkc3QtPnBvcnQgPSBzcmMtPnBvcnQ7CisJZHN0LT5md21hcmsgPSBzcmMtPmZ3bWFyazsKKwlzdHJsY3B5KGRzdC0+c2NoZWRfbmFtZSwgc3JjLT5zY2hlZHVsZXItPm5hbWUsIHNpemVvZihkc3QtPnNjaGVkX25hbWUpKTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVvdXQgPSBzcmMtPnRpbWVvdXQgLyBIWjsKKwlkc3QtPm5ldG1hc2sgPSBzcmMtPm5ldG1hc2s7CisJZHN0LT5udW1fZGVzdHMgPSBzcmMtPm51bV9kZXN0czsKKwlpcF92c19jb3B5X3N0YXRzKCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2lwX3ZzX2dldF9zZXJ2aWNlX2VudHJpZXMoY29uc3Qgc3RydWN0IGlwX3ZzX2dldF9zZXJ2aWNlcyAqZ2V0LAorCQkJICAgIHN0cnVjdCBpcF92c19nZXRfc2VydmljZXMgX191c2VyICp1cHRyKQoreworCWludCBpZHgsIGNvdW50PTA7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSBlbnRyeTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtpZHhdLCBzX2xpc3QpIHsKKwkJCS8qIE9ubHkgZXhwb3NlIElQdjQgZW50cmllcyB0byBvbGQgaW50ZXJmYWNlICovCisJCQlpZiAoc3ZjLT5hZiAhPSBBRl9JTkVUKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoY291bnQgPj0gZ2V0LT5udW1fc2VydmljZXMpCisJCQkJZ290byBvdXQ7CisJCQltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKKwkJCWlwX3ZzX2NvcHlfc2VydmljZSgmZW50cnksIHN2Yyk7CisJCQlpZiAoY29weV90b191c2VyKCZ1cHRyLT5lbnRyeXRhYmxlW2NvdW50XSwKKwkJCQkJICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY291bnQrKzsKKwkJfQorCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSwgZl9saXN0KSB7CisJCQkvKiBPbmx5IGV4cG9zZSBJUHY0IGVudHJpZXMgdG8gb2xkIGludGVyZmFjZSAqLworCQkJaWYgKHN2Yy0+YWYgIT0gQUZfSU5FVCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGNvdW50ID49IGdldC0+bnVtX3NlcnZpY2VzKQorCQkJCWdvdG8gb3V0OworCQkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CisJCQlpcF92c19jb3B5X3NlcnZpY2UoJmVudHJ5LCBzdmMpOworCQkJaWYgKGNvcHlfdG9fdXNlcigmdXB0ci0+ZW50cnl0YWJsZVtjb3VudF0sCisJCQkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvdW50Kys7CisJCX0KKwl9CisgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorX19pcF92c19nZXRfZGVzdF9lbnRyaWVzKGNvbnN0IHN0cnVjdCBpcF92c19nZXRfZGVzdHMgKmdldCwKKwkJCSBzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzIF9fdXNlciAqdXB0cikKK3sKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCXVuaW9uIG5mX2luZXRfYWRkciBhZGRyID0geyAuaXAgPSBnZXQtPmFkZHIgfTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChnZXQtPmZ3bWFyaykKKwkJc3ZjID0gX19pcF92c19zdmNfZndtX2dldChBRl9JTkVULCBnZXQtPmZ3bWFyayk7CisJZWxzZQorCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KEFGX0lORVQsIGdldC0+cHJvdG9jb2wsICZhZGRyLAorCQkJCQkgIGdldC0+cG9ydCk7CisKKwlpZiAoc3ZjKSB7CisJCWludCBjb3VudCA9IDA7CisJCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCQlzdHJ1Y3QgaXBfdnNfZGVzdF9lbnRyeSBlbnRyeTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCQlpZiAoY291bnQgPj0gZ2V0LT5udW1fZGVzdHMpCisJCQkJYnJlYWs7CisKKwkJCWVudHJ5LmFkZHIgPSBkZXN0LT5hZGRyLmlwOworCQkJZW50cnkucG9ydCA9IGRlc3QtPnBvcnQ7CisJCQllbnRyeS5jb25uX2ZsYWdzID0gYXRvbWljX3JlYWQoJmRlc3QtPmNvbm5fZmxhZ3MpOworCQkJZW50cnkud2VpZ2h0ID0gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCk7CisJCQllbnRyeS51X3RocmVzaG9sZCA9IGRlc3QtPnVfdGhyZXNob2xkOworCQkJZW50cnkubF90aHJlc2hvbGQgPSBkZXN0LT5sX3RocmVzaG9sZDsKKwkJCWVudHJ5LmFjdGl2ZWNvbm5zID0gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKKwkJCWVudHJ5LmluYWN0Y29ubnMgPSBhdG9taWNfcmVhZCgmZGVzdC0+aW5hY3Rjb25ucyk7CisJCQllbnRyeS5wZXJzaXN0Y29ubnMgPSBhdG9taWNfcmVhZCgmZGVzdC0+cGVyc2lzdGNvbm5zKTsKKwkJCWlwX3ZzX2NvcHlfc3RhdHMoJmVudHJ5LnN0YXRzLCAmZGVzdC0+c3RhdHMpOworCQkJaWYgKGNvcHlfdG9fdXNlcigmdXB0ci0+ZW50cnl0YWJsZVtjb3VudF0sCisJCQkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvdW50Kys7CisJCX0KKwkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwl9IGVsc2UKKwkJcmV0ID0gLUVTUkNIOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcF92c19nZXRfdGltZW91dHMoc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlciAqdSkKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfUFJPVE9fVENQCisJdS0+dGNwX3RpbWVvdXQgPQorCQlpcF92c19wcm90b2NvbF90Y3AudGltZW91dF90YWJsZVtJUF9WU19UQ1BfU19FU1RBQkxJU0hFRF0gLyBIWjsKKwl1LT50Y3BfZmluX3RpbWVvdXQgPQorCQlpcF92c19wcm90b2NvbF90Y3AudGltZW91dF90YWJsZVtJUF9WU19UQ1BfU19GSU5fV0FJVF0gLyBIWjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19VRFAKKwl1LT51ZHBfdGltZW91dCA9CisJCWlwX3ZzX3Byb3RvY29sX3VkcC50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF0gLyBIWjsKKyNlbmRpZgorfQorCisKKyNkZWZpbmUgR0VUX0NNRElEKGNtZCkJCShjbWQgLSBJUF9WU19CQVNFX0NUTCkKKyNkZWZpbmUgR0VUX0lORk9fQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c19nZXRpbmZvKSkKKyNkZWZpbmUgR0VUX1NFUlZJQ0VTX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfZ2V0X3NlcnZpY2VzKSkKKyNkZWZpbmUgR0VUX1NFUlZJQ0VfQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c19zZXJ2aWNlX2VudHJ5KSkKKyNkZWZpbmUgR0VUX0RFU1RTX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzKSkKKyNkZWZpbmUgR0VUX1RJTUVPVVRfQVJHX0xFTgkoc2l6ZW9mKHN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIpKQorI2RlZmluZSBHRVRfREFFTU9OX0FSR19MRU4JKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIpICogMikKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ2V0X2FyZ2xlbltHRVRfQ01ESUQoSVBfVlNfU09fR0VUX01BWCkrMV0gPSB7CisJW0dFVF9DTURJRChJUF9WU19TT19HRVRfVkVSU0lPTildCT0gNjQsCisJW0dFVF9DTURJRChJUF9WU19TT19HRVRfSU5GTyldCQk9IEdFVF9JTkZPX0FSR19MRU4sCisJW0dFVF9DTURJRChJUF9WU19TT19HRVRfU0VSVklDRVMpXQk9IEdFVF9TRVJWSUNFU19BUkdfTEVOLAorCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX1NFUlZJQ0UpXQk9IEdFVF9TRVJWSUNFX0FSR19MRU4sCisJW0dFVF9DTURJRChJUF9WU19TT19HRVRfREVTVFMpXQkJPSBHRVRfREVTVFNfQVJHX0xFTiwKKwlbR0VUX0NNRElEKElQX1ZTX1NPX0dFVF9USU1FT1VUKV0JPSBHRVRfVElNRU9VVF9BUkdfTEVOLAorCVtHRVRfQ01ESUQoSVBfVlNfU09fR0VUX0RBRU1PTildCT0gR0VUX0RBRU1PTl9BUkdfTEVOLAorfTsKKworc3RhdGljIGludAorZG9faXBfdnNfZ2V0X2N0bChzdHJ1Y3Qgc29jayAqc2ssIGludCBjbWQsIHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIGFyZ1sxMjhdOworCWludCByZXQgPSAwOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCpsZW4gPCBnZXRfYXJnbGVuW0dFVF9DTURJRChjbWQpXSkgeworCQlJUF9WU19FUlIoImdldF9jdGw6IGxlbiAldSA8ICV1XG4iLAorCQkJICAqbGVuLCBnZXRfYXJnbGVuW0dFVF9DTURJRChjbWQpXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihhcmcsIHVzZXIsIGdldF9hcmdsZW5bR0VUX0NNRElEKGNtZCldKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJl9faXBfdnNfbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQX1ZTX1NPX0dFVF9WRVJTSU9OOgorCXsKKwkJY2hhciBidWZbNjRdOworCisJCXNwcmludGYoYnVmLCAiSVAgVmlydHVhbCBTZXJ2ZXIgdmVyc2lvbiAlZC4lZC4lZCAoc2l6ZT0lZCkiLAorCQkJTlZFUlNJT04oSVBfVlNfVkVSU0lPTl9DT0RFKSwgSVBfVlNfQ09OTl9UQUJfU0laRSk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgYnVmLCBzdHJsZW4oYnVmKSsxKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJKmxlbiA9IHN0cmxlbihidWYpKzE7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfSU5GTzoKKwl7CisJCXN0cnVjdCBpcF92c19nZXRpbmZvIGluZm87CisJCWluZm8udmVyc2lvbiA9IElQX1ZTX1ZFUlNJT05fQ09ERTsKKwkJaW5mby5zaXplID0gSVBfVlNfQ09OTl9UQUJfU0laRTsKKwkJaW5mby5udW1fc2VydmljZXMgPSBpcF92c19udW1fc2VydmljZXM7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sIHNpemVvZihpbmZvKSkgIT0gMCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfU0VSVklDRVM6CisJeworCQlzdHJ1Y3QgaXBfdnNfZ2V0X3NlcnZpY2VzICpnZXQ7CisJCWludCBzaXplOworCisJCWdldCA9IChzdHJ1Y3QgaXBfdnNfZ2V0X3NlcnZpY2VzICopYXJnOworCQlzaXplID0gc2l6ZW9mKCpnZXQpICsKKwkJCXNpemVvZihzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSkgKiBnZXQtPm51bV9zZXJ2aWNlczsKKwkJaWYgKCpsZW4gIT0gc2l6ZSkgeworCQkJSVBfVlNfRVJSKCJsZW5ndGg6ICV1ICE9ICV1XG4iLCAqbGVuLCBzaXplKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBfX2lwX3ZzX2dldF9zZXJ2aWNlX2VudHJpZXMoZ2V0LCB1c2VyKTsKKwl9CisJYnJlYWs7CisKKwljYXNlIElQX1ZTX1NPX0dFVF9TRVJWSUNFOgorCXsKKwkJc3RydWN0IGlwX3ZzX3NlcnZpY2VfZW50cnkgKmVudHJ5OworCQlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCQl1bmlvbiBuZl9pbmV0X2FkZHIgYWRkcjsKKworCQllbnRyeSA9IChzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqKWFyZzsKKwkJYWRkci5pcCA9IGVudHJ5LT5hZGRyOworCQlpZiAoZW50cnktPmZ3bWFyaykKKwkJCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQoQUZfSU5FVCwgZW50cnktPmZ3bWFyayk7CisJCWVsc2UKKwkJCXN2YyA9IF9faXBfdnNfc2VydmljZV9nZXQoQUZfSU5FVCwgZW50cnktPnByb3RvY29sLAorCQkJCQkJICAmYWRkciwgZW50cnktPnBvcnQpOworCQlpZiAoc3ZjKSB7CisJCQlpcF92c19jb3B5X3NlcnZpY2UoZW50cnksIHN2Yyk7CisJCQlpZiAoY29weV90b191c2VyKHVzZXIsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSkgIT0gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJaXBfdnNfc2VydmljZV9wdXQoc3ZjKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRVNSQ0g7CisJfQorCWJyZWFrOworCisJY2FzZSBJUF9WU19TT19HRVRfREVTVFM6CisJeworCQlzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzICpnZXQ7CisJCWludCBzaXplOworCisJCWdldCA9IChzdHJ1Y3QgaXBfdnNfZ2V0X2Rlc3RzICopYXJnOworCQlzaXplID0gc2l6ZW9mKCpnZXQpICsKKwkJCXNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdF9lbnRyeSkgKiBnZXQtPm51bV9kZXN0czsKKwkJaWYgKCpsZW4gIT0gc2l6ZSkgeworCQkJSVBfVlNfRVJSKCJsZW5ndGg6ICV1ICE9ICV1XG4iLCAqbGVuLCBzaXplKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBfX2lwX3ZzX2dldF9kZXN0X2VudHJpZXMoZ2V0LCB1c2VyKTsKKwl9CisJYnJlYWs7CisKKwljYXNlIElQX1ZTX1NPX0dFVF9USU1FT1VUOgorCXsKKwkJc3RydWN0IGlwX3ZzX3RpbWVvdXRfdXNlciB0OworCisJCV9faXBfdnNfZ2V0X3RpbWVvdXRzKCZ0KTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmdCwgc2l6ZW9mKHQpKSAhPSAwKQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisKKwljYXNlIElQX1ZTX1NPX0dFVF9EQUVNT046CisJeworCQlzdHJ1Y3QgaXBfdnNfZGFlbW9uX3VzZXIgZFsyXTsKKworCQltZW1zZXQoJmQsIDAsIHNpemVvZihkKSk7CisJCWlmIChpcF92c19zeW5jX3N0YXRlICYgSVBfVlNfU1RBVEVfTUFTVEVSKSB7CisJCQlkWzBdLnN0YXRlID0gSVBfVlNfU1RBVEVfTUFTVEVSOworCQkJc3RybGNweShkWzBdLm1jYXN0X2lmbiwgaXBfdnNfbWFzdGVyX21jYXN0X2lmbiwgc2l6ZW9mKGRbMF0ubWNhc3RfaWZuKSk7CisJCQlkWzBdLnN5bmNpZCA9IGlwX3ZzX21hc3Rlcl9zeW5jaWQ7CisJCX0KKwkJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9CQUNLVVApIHsKKwkJCWRbMV0uc3RhdGUgPSBJUF9WU19TVEFURV9CQUNLVVA7CisJCQlzdHJsY3B5KGRbMV0ubWNhc3RfaWZuLCBpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBzaXplb2YoZFsxXS5tY2FzdF9pZm4pKTsKKwkJCWRbMV0uc3luY2lkID0gaXBfdnNfYmFja3VwX3N5bmNpZDsKKwkJfQorCQlpZiAoY29weV90b191c2VyKHVzZXIsICZkLCBzaXplb2YoZCkpICE9IDApCisJCQlyZXQgPSAtRUZBVUxUOworCX0KKwlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisgIG91dDoKKwltdXRleF91bmxvY2soJl9faXBfdnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyBpcF92c19zb2Nrb3B0cyA9IHsKKwkucGYJCT0gUEZfSU5FVCwKKwkuc2V0X29wdG1pbgk9IElQX1ZTX0JBU0VfQ1RMLAorCS5zZXRfb3B0bWF4CT0gSVBfVlNfU09fU0VUX01BWCsxLAorCS5zZXQJCT0gZG9faXBfdnNfc2V0X2N0bCwKKwkuZ2V0X29wdG1pbgk9IElQX1ZTX0JBU0VfQ1RMLAorCS5nZXRfb3B0bWF4CT0gSVBfVlNfU09fR0VUX01BWCsxLAorCS5nZXQJCT0gZG9faXBfdnNfZ2V0X2N0bCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCisvKgorICogR2VuZXJpYyBOZXRsaW5rIGludGVyZmFjZQorICovCisKKy8qIElQVlMgZ2VuZXRsaW5rIGZhbWlseSAqLworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBpcF92c19nZW5sX2ZhbWlseSA9IHsKKwkuaWQJCT0gR0VOTF9JRF9HRU5FUkFURSwKKwkuaGRyc2l6ZQk9IDAsCisJLm5hbWUJCT0gSVBWU19HRU5MX05BTUUsCisJLnZlcnNpb24JPSBJUFZTX0dFTkxfVkVSU0lPTiwKKwkubWF4YXR0cgk9IElQVlNfQ01EX01BWCwKK307CisKKy8qIFBvbGljeSB1c2VkIGZvciBmaXJzdC1sZXZlbCBjb21tYW5kIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpcF92c19jbWRfcG9saWN5W0lQVlNfQ01EX0FUVFJfTUFYICsgMV0gPSB7CisJW0lQVlNfQ01EX0FUVFJfU0VSVklDRV0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbSVBWU19DTURfQVRUUl9ERVNUXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtJUFZTX0NNRF9BVFRSX0RBRU1PTl0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbSVBWU19DTURfQVRUUl9USU1FT1VUX1RDUF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVENQX0ZJTl0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVURQXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCisvKiBQb2xpY3kgdXNlZCBmb3IgYXR0cmlidXRlcyBpbiBuZXN0ZWQgYXR0cmlidXRlIElQVlNfQ01EX0FUVFJfREFFTU9OICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgaXBfdnNfZGFlbW9uX3BvbGljeVtJUFZTX0RBRU1PTl9BVFRSX01BWCArIDFdID0geworCVtJUFZTX0RBRU1PTl9BVFRSX1NUQVRFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lQVlNfREFFTU9OX0FUVFJfTUNBU1RfSUZOXQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywKKwkJCQkJICAgIC5sZW4gPSBJUF9WU19JRk5BTUVfTUFYTEVOIH0sCisJW0lQVlNfREFFTU9OX0FUVFJfU1lOQ19JRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorfTsKKworLyogUG9saWN5IHVzZWQgZm9yIGF0dHJpYnV0ZXMgaW4gbmVzdGVkIGF0dHJpYnV0ZSBJUFZTX0NNRF9BVFRSX1NFUlZJQ0UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpcF92c19zdmNfcG9saWN5W0lQVlNfU1ZDX0FUVFJfTUFYICsgMV0gPSB7CisJW0lQVlNfU1ZDX0FUVFJfQUZdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lQVlNfU1ZDX0FUVFJfUFJPVE9DT0xdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbSVBWU19TVkNfQVRUUl9BRERSXQkJPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkJICAgIC5sZW4gPSBzaXplb2YodW5pb24gbmZfaW5ldF9hZGRyKSB9LAorCVtJUFZTX1NWQ19BVFRSX1BPUlRdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lQVlNfU1ZDX0FUVFJfRldNQVJLXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJUFZTX1NWQ19BVFRSX1NDSEVEX05BTUVdCT0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLAorCQkJCQkgICAgLmxlbiA9IElQX1ZTX1NDSEVETkFNRV9NQVhMRU4gfSwKKwlbSVBWU19TVkNfQVRUUl9GTEFHU10JCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJCSAgICAubGVuID0gc2l6ZW9mKHN0cnVjdCBpcF92c19mbGFncykgfSwKKwlbSVBWU19TVkNfQVRUUl9USU1FT1VUXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtJUFZTX1NWQ19BVFRSX05FVE1BU0tdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lQVlNfU1ZDX0FUVFJfU1RBVFNdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCisvKiBQb2xpY3kgdXNlZCBmb3IgYXR0cmlidXRlcyBpbiBuZXN0ZWQgYXR0cmlidXRlIElQVlNfQ01EX0FUVFJfREVTVCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlwX3ZzX2Rlc3RfcG9saWN5W0lQVlNfREVTVF9BVFRSX01BWCArIDFdID0geworCVtJUFZTX0RFU1RfQVRUUl9BRERSXQkJPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkJICAgIC5sZW4gPSBzaXplb2YodW5pb24gbmZfaW5ldF9hZGRyKSB9LAorCVtJUFZTX0RFU1RfQVRUUl9QT1JUXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtJUFZTX0RFU1RfQVRUUl9GV0RfTUVUSE9EXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lQVlNfREVTVF9BVFRSX1dFSUdIVF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSVBWU19ERVNUX0FUVFJfVV9USFJFU0hdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSVBWU19ERVNUX0FUVFJfTF9USFJFU0hdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSVBWU19ERVNUX0FUVFJfQUNUSVZFX0NPTk5TXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lQVlNfREVTVF9BVFRSX0lOQUNUX0NPTk5TXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lQVlNfREVTVF9BVFRSX1BFUlNJU1RfQ09OTlNdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSVBWU19ERVNUX0FUVFJfU1RBVFNdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfZmlsbF9zdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29udGFpbmVyX3R5cGUsCisJCQkJIHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IG5sYXR0ciAqbmxfc3RhdHMgPSBubGFfbmVzdF9zdGFydChza2IsIGNvbnRhaW5lcl90eXBlKTsKKwlpZiAoIW5sX3N0YXRzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJc3Bpbl9sb2NrX2JoKCZzdGF0cy0+bG9jayk7CisKKwlOTEFfUFVUX1UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9DT05OUywgc3RhdHMtPnVzdGF0cy5jb25ucyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5QS1RTLCBzdGF0cy0+dXN0YXRzLmlucGt0cyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUEtUUywgc3RhdHMtPnVzdGF0cy5vdXRwa3RzKTsKKwlOTEFfUFVUX1U2NChza2IsIElQVlNfU1RBVFNfQVRUUl9JTkJZVEVTLCBzdGF0cy0+dXN0YXRzLmluYnl0ZXMpOworCU5MQV9QVVRfVTY0KHNrYiwgSVBWU19TVEFUU19BVFRSX09VVEJZVEVTLCBzdGF0cy0+dXN0YXRzLm91dGJ5dGVzKTsKKwlOTEFfUFVUX1UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9DUFMsIHN0YXRzLT51c3RhdHMuY3BzKTsKKwlOTEFfUFVUX1UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9JTlBQUywgc3RhdHMtPnVzdGF0cy5pbnBwcyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUFBTLCBzdGF0cy0+dXN0YXRzLm91dHBwcyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5CUFMsIHN0YXRzLT51c3RhdHMuaW5icHMpOworCU5MQV9QVVRfVTMyKHNrYiwgSVBWU19TVEFUU19BVFRSX09VVEJQUywgc3RhdHMtPnVzdGF0cy5vdXRicHMpOworCisJc3Bpbl91bmxvY2tfYmgoJnN0YXRzLT5sb2NrKTsKKworCW5sYV9uZXN0X2VuZChza2IsIG5sX3N0YXRzKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJc3Bpbl91bmxvY2tfYmgoJnN0YXRzLT5sb2NrKTsKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCBubF9zdGF0cyk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX2ZpbGxfc2VydmljZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IG5sYXR0ciAqbmxfc2VydmljZTsKKwlzdHJ1Y3QgaXBfdnNfZmxhZ3MgZmxhZ3MgPSB7IC5mbGFncyA9IHN2Yy0+ZmxhZ3MsCisJCQkJICAgICAubWFzayA9IH4wIH07CisKKwlubF9zZXJ2aWNlID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJUFZTX0NNRF9BVFRSX1NFUlZJQ0UpOworCWlmICghbmxfc2VydmljZSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCU5MQV9QVVRfVTE2KHNrYiwgSVBWU19TVkNfQVRUUl9BRiwgc3ZjLT5hZik7CisKKwlpZiAoc3ZjLT5md21hcmspIHsKKwkJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX1NWQ19BVFRSX0ZXTUFSSywgc3ZjLT5md21hcmspOworCX0gZWxzZSB7CisJCU5MQV9QVVRfVTE2KHNrYiwgSVBWU19TVkNfQVRUUl9QUk9UT0NPTCwgc3ZjLT5wcm90b2NvbCk7CisJCU5MQV9QVVQoc2tiLCBJUFZTX1NWQ19BVFRSX0FERFIsIHNpemVvZihzdmMtPmFkZHIpLCAmc3ZjLT5hZGRyKTsKKwkJTkxBX1BVVF9VMTYoc2tiLCBJUFZTX1NWQ19BVFRSX1BPUlQsIHN2Yy0+cG9ydCk7CisJfQorCisJTkxBX1BVVF9TVFJJTkcoc2tiLCBJUFZTX1NWQ19BVFRSX1NDSEVEX05BTUUsIHN2Yy0+c2NoZWR1bGVyLT5uYW1lKTsKKwlOTEFfUFVUKHNrYiwgSVBWU19TVkNfQVRUUl9GTEFHUywgc2l6ZW9mKGZsYWdzKSwgJmZsYWdzKTsKKwlOTEFfUFVUX1UzMihza2IsIElQVlNfU1ZDX0FUVFJfVElNRU9VVCwgc3ZjLT50aW1lb3V0IC8gSFopOworCU5MQV9QVVRfVTMyKHNrYiwgSVBWU19TVkNfQVRUUl9ORVRNQVNLLCBzdmMtPm5ldG1hc2spOworCisJaWYgKGlwX3ZzX2dlbmxfZmlsbF9zdGF0cyhza2IsIElQVlNfU1ZDX0FUVFJfU1RBVFMsICZzdmMtPnN0YXRzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQoc2tiLCBubF9zZXJ2aWNlKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxhX25lc3RfY2FuY2VsKHNrYiwgbmxfc2VydmljZSk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX2R1bXBfc2VydmljZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsCisJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXZvaWQgKmhkcjsKKworCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCSAgJmlwX3ZzX2dlbmxfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgSVBWU19DTURfTkVXX1NFUlZJQ0UpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKGlwX3ZzX2dlbmxfZmlsbF9zZXJ2aWNlKHNrYiwgc3ZjKSA8IDApCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIGdlbmxtc2dfZW5kKHNrYiwgaGRyKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfZHVtcF9zZXJ2aWNlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IGlkeCA9IDAsIGk7CisJaW50IHN0YXJ0ID0gY2ItPmFyZ3NbMF07CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCW11dGV4X2xvY2soJl9faXBfdnNfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBJUF9WU19TVkNfVEFCX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtpXSwgc19saXN0KSB7CisJCQlpZiAoKytpZHggPD0gc3RhcnQpCisJCQkJY29udGludWU7CisJCQlpZiAoaXBfdnNfZ2VubF9kdW1wX3NlcnZpY2Uoc2tiLCBzdmMsIGNiKSA8IDApIHsKKwkJCQlpZHgtLTsKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJUF9WU19TVkNfVEFCX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y19md21fdGFibGVbaV0sIGZfbGlzdCkgeworCQkJaWYgKCsraWR4IDw9IHN0YXJ0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlwX3ZzX2dlbmxfZHVtcF9zZXJ2aWNlKHNrYiwgc3ZjLCBjYikgPCAwKSB7CisJCQkJaWR4LS07CisJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCQl9CisJCX0KKwl9CisKK25sYV9wdXRfZmFpbHVyZToKKwltdXRleF91bmxvY2soJl9faXBfdnNfbXV0ZXgpOworCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfcGFyc2Vfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV91c2VyX2tlcm4gKnVzdmMsCisJCQkJICAgIHN0cnVjdCBubGF0dHIgKm5sYSwgaW50IGZ1bGxfZW50cnkpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbSVBWU19TVkNfQVRUUl9NQVggKyAxXTsKKwlzdHJ1Y3QgbmxhdHRyICpubGFfYWYsICpubGFfcG9ydCwgKm5sYV9md21hcmssICpubGFfcHJvdG9jb2wsICpubGFfYWRkcjsKKworCS8qIFBhcnNlIG1hbmRhdG9yeSBpZGVudGlmeWluZyBzZXJ2aWNlIGZpZWxkcyBmaXJzdCAqLworCWlmIChubGEgPT0gTlVMTCB8fAorCSAgICBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBJUFZTX1NWQ19BVFRSX01BWCwgbmxhLCBpcF92c19zdmNfcG9saWN5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlubGFfYWYJCT0gYXR0cnNbSVBWU19TVkNfQVRUUl9BRl07CisJbmxhX3Byb3RvY29sCT0gYXR0cnNbSVBWU19TVkNfQVRUUl9QUk9UT0NPTF07CisJbmxhX2FkZHIJPSBhdHRyc1tJUFZTX1NWQ19BVFRSX0FERFJdOworCW5sYV9wb3J0CT0gYXR0cnNbSVBWU19TVkNfQVRUUl9QT1JUXTsKKwlubGFfZndtYXJrCT0gYXR0cnNbSVBWU19TVkNfQVRUUl9GV01BUktdOworCisJaWYgKCEobmxhX2FmICYmIChubGFfZndtYXJrIHx8IChubGFfcG9ydCAmJiBubGFfcHJvdG9jb2wgJiYgbmxhX2FkZHIpKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdXN2Yy0+YWYgPSBubGFfZ2V0X3UxNihubGFfYWYpOworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKHVzdmMtPmFmICE9IEFGX0lORVQgJiYgdXN2Yy0+YWYgIT0gQUZfSU5FVDYpCisjZWxzZQorCWlmICh1c3ZjLT5hZiAhPSBBRl9JTkVUKQorI2VuZGlmCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJaWYgKG5sYV9md21hcmspIHsKKwkJdXN2Yy0+cHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKwkJdXN2Yy0+ZndtYXJrID0gbmxhX2dldF91MzIobmxhX2Z3bWFyayk7CisJfSBlbHNlIHsKKwkJdXN2Yy0+cHJvdG9jb2wgPSBubGFfZ2V0X3UxNihubGFfcHJvdG9jb2wpOworCQlubGFfbWVtY3B5KCZ1c3ZjLT5hZGRyLCBubGFfYWRkciwgc2l6ZW9mKHVzdmMtPmFkZHIpKTsKKwkJdXN2Yy0+cG9ydCA9IG5sYV9nZXRfdTE2KG5sYV9wb3J0KTsKKwkJdXN2Yy0+ZndtYXJrID0gMDsKKwl9CisKKwkvKiBJZiBhIGZ1bGwgZW50cnkgd2FzIHJlcXVlc3RlZCwgY2hlY2sgZm9yIHRoZSBhZGRpdGlvbmFsIGZpZWxkcyAqLworCWlmIChmdWxsX2VudHJ5KSB7CisJCXN0cnVjdCBubGF0dHIgKm5sYV9zY2hlZCwgKm5sYV9mbGFncywgKm5sYV90aW1lb3V0LAorCQkJICAgICAgKm5sYV9uZXRtYXNrOworCQlzdHJ1Y3QgaXBfdnNfZmxhZ3MgZmxhZ3M7CisJCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisKKwkJbmxhX3NjaGVkID0gYXR0cnNbSVBWU19TVkNfQVRUUl9TQ0hFRF9OQU1FXTsKKwkJbmxhX2ZsYWdzID0gYXR0cnNbSVBWU19TVkNfQVRUUl9GTEFHU107CisJCW5sYV90aW1lb3V0ID0gYXR0cnNbSVBWU19TVkNfQVRUUl9USU1FT1VUXTsKKwkJbmxhX25ldG1hc2sgPSBhdHRyc1tJUFZTX1NWQ19BVFRSX05FVE1BU0tdOworCisJCWlmICghKG5sYV9zY2hlZCAmJiBubGFfZmxhZ3MgJiYgbmxhX3RpbWVvdXQgJiYgbmxhX25ldG1hc2spKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbmxhX21lbWNweSgmZmxhZ3MsIG5sYV9mbGFncywgc2l6ZW9mKGZsYWdzKSk7CisKKwkJLyogcHJlZmlsbCBmbGFncyBmcm9tIHNlcnZpY2UgaWYgaXQgYWxyZWFkeSBleGlzdHMgKi8KKwkJaWYgKHVzdmMtPmZ3bWFyaykKKwkJCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy0+YWYsIHVzdmMtPmZ3bWFyayk7CisJCWVsc2UKKwkJCXN2YyA9IF9faXBfdnNfc2VydmljZV9nZXQodXN2Yy0+YWYsIHVzdmMtPnByb3RvY29sLAorCQkJCQkJICAmdXN2Yy0+YWRkciwgdXN2Yy0+cG9ydCk7CisJCWlmIChzdmMpIHsKKwkJCXVzdmMtPmZsYWdzID0gc3ZjLT5mbGFnczsKKwkJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJCX0gZWxzZQorCQkJdXN2Yy0+ZmxhZ3MgPSAwOworCisJCS8qIHNldCBuZXcgZmxhZ3MgZnJvbSB1c2VybGFuZCAqLworCQl1c3ZjLT5mbGFncyA9ICh1c3ZjLT5mbGFncyAmIH5mbGFncy5tYXNrKSB8CisJCQkgICAgICAoZmxhZ3MuZmxhZ3MgJiBmbGFncy5tYXNrKTsKKwkJdXN2Yy0+c2NoZWRfbmFtZSA9IG5sYV9kYXRhKG5sYV9zY2hlZCk7CisJCXVzdmMtPnRpbWVvdXQgPSBubGFfZ2V0X3UzMihubGFfdGltZW91dCk7CisJCXVzdmMtPm5ldG1hc2sgPSBubGFfZ2V0X3UzMihubGFfbmV0bWFzayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqaXBfdnNfZ2VubF9maW5kX3NlcnZpY2Uoc3RydWN0IG5sYXR0ciAqbmxhKQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXJfa2VybiB1c3ZjOworCWludCByZXQ7CisKKwlyZXQgPSBpcF92c19nZW5sX3BhcnNlX3NlcnZpY2UoJnVzdmMsIG5sYSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCWlmICh1c3ZjLmZ3bWFyaykKKwkJcmV0dXJuIF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy5hZiwgdXN2Yy5md21hcmspOworCWVsc2UKKwkJcmV0dXJuIF9faXBfdnNfc2VydmljZV9nZXQodXN2Yy5hZiwgdXN2Yy5wcm90b2NvbCwKKwkJCQkJICAgJnVzdmMuYWRkciwgdXN2Yy5wb3J0KTsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX2ZpbGxfZGVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubF9kZXN0OworCisJbmxfZGVzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSVBWU19DTURfQVRUUl9ERVNUKTsKKwlpZiAoIW5sX2Rlc3QpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlOTEFfUFVUKHNrYiwgSVBWU19ERVNUX0FUVFJfQUREUiwgc2l6ZW9mKGRlc3QtPmFkZHIpLCAmZGVzdC0+YWRkcik7CisJTkxBX1BVVF9VMTYoc2tiLCBJUFZTX0RFU1RfQVRUUl9QT1JULCBkZXN0LT5wb3J0KTsKKworCU5MQV9QVVRfVTMyKHNrYiwgSVBWU19ERVNUX0FUVFJfRldEX01FVEhPRCwKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT5jb25uX2ZsYWdzKSAmIElQX1ZTX0NPTk5fRl9GV0RfTUFTSyk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX0RFU1RfQVRUUl9XRUlHSFQsIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKTsKKwlOTEFfUFVUX1UzMihza2IsIElQVlNfREVTVF9BVFRSX1VfVEhSRVNILCBkZXN0LT51X3RocmVzaG9sZCk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX0RFU1RfQVRUUl9MX1RIUkVTSCwgZGVzdC0+bF90aHJlc2hvbGQpOworCU5MQV9QVVRfVTMyKHNrYiwgSVBWU19ERVNUX0FUVFJfQUNUSVZFX0NPTk5TLAorCQkgICAgYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX0RFU1RfQVRUUl9JTkFDVF9DT05OUywKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKSk7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX0RFU1RfQVRUUl9QRVJTSVNUX0NPTk5TLAorCQkgICAgYXRvbWljX3JlYWQoJmRlc3QtPnBlcnNpc3Rjb25ucykpOworCisJaWYgKGlwX3ZzX2dlbmxfZmlsbF9zdGF0cyhza2IsIElQVlNfREVTVF9BVFRSX1NUQVRTLCAmZGVzdC0+c3RhdHMpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5sYV9uZXN0X2VuZChza2IsIG5sX2Rlc3QpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCBubF9kZXN0KTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfZHVtcF9kZXN0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0LAorCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwl2b2lkICpoZHI7CisKKwloZHIgPSBnZW5sbXNnX3B1dChza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkgICZpcF92c19nZW5sX2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkgIElQVlNfQ01EX05FV19ERVNUKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChpcF92c19nZW5sX2ZpbGxfZGVzdChza2IsIGRlc3QpIDwgMCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlyZXR1cm4gZ2VubG1zZ19lbmQoc2tiLCBoZHIpOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwoc2tiLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfZ2VubF9kdW1wX2Rlc3RzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaWR4ID0gMDsKKwlpbnQgc3RhcnQgPSBjYi0+YXJnc1swXTsKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCXN0cnVjdCBubGF0dHIgKmF0dHJzW0lQVlNfQ01EX0FUVFJfTUFYICsgMV07CisKKwltdXRleF9sb2NrKCZfX2lwX3ZzX211dGV4KTsKKworCS8qIFRyeSB0byBmaW5kIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBkdW1wIGRlc3RpbmF0aW9ucyAqLworCWlmIChubG1zZ19wYXJzZShjYi0+bmxoLCBHRU5MX0hEUkxFTiwgYXR0cnMsCisJCQlJUFZTX0NNRF9BVFRSX01BWCwgaXBfdnNfY21kX3BvbGljeSkpCisJCWdvdG8gb3V0X2VycjsKKworCXN2YyA9IGlwX3ZzX2dlbmxfZmluZF9zZXJ2aWNlKGF0dHJzW0lQVlNfQ01EX0FUVFJfU0VSVklDRV0pOworCWlmIChJU19FUlIoc3ZjKSB8fCBzdmMgPT0gTlVMTCkKKwkJZ290byBvdXRfZXJyOworCisJLyogRHVtcCB0aGUgZGVzdGluYXRpb25zICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoKytpZHggPD0gc3RhcnQpCisJCQljb250aW51ZTsKKwkJaWYgKGlwX3ZzX2dlbmxfZHVtcF9kZXN0KHNrYiwgZGVzdCwgY2IpIDwgMCkgeworCQkJaWR4LS07CisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJfQorCX0KKworbmxhX3B1dF9mYWlsdXJlOgorCWNiLT5hcmdzWzBdID0gaWR4OworCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisKK291dF9lcnI6CisJbXV0ZXhfdW5sb2NrKCZfX2lwX3ZzX211dGV4KTsKKworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX3BhcnNlX2Rlc3Qoc3RydWN0IGlwX3ZzX2Rlc3RfdXNlcl9rZXJuICp1ZGVzdCwKKwkJCQkgc3RydWN0IG5sYXR0ciAqbmxhLCBpbnQgZnVsbF9lbnRyeSkKK3sKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tJUFZTX0RFU1RfQVRUUl9NQVggKyAxXTsKKwlzdHJ1Y3QgbmxhdHRyICpubGFfYWRkciwgKm5sYV9wb3J0OworCisJLyogUGFyc2UgbWFuZGF0b3J5IGlkZW50aWZ5aW5nIGRlc3RpbmF0aW9uIGZpZWxkcyBmaXJzdCAqLworCWlmIChubGEgPT0gTlVMTCB8fAorCSAgICBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBJUFZTX0RFU1RfQVRUUl9NQVgsIG5sYSwgaXBfdnNfZGVzdF9wb2xpY3kpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5sYV9hZGRyCT0gYXR0cnNbSVBWU19ERVNUX0FUVFJfQUREUl07CisJbmxhX3BvcnQJPSBhdHRyc1tJUFZTX0RFU1RfQVRUUl9QT1JUXTsKKworCWlmICghKG5sYV9hZGRyICYmIG5sYV9wb3J0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlubGFfbWVtY3B5KCZ1ZGVzdC0+YWRkciwgbmxhX2FkZHIsIHNpemVvZih1ZGVzdC0+YWRkcikpOworCXVkZXN0LT5wb3J0ID0gbmxhX2dldF91MTYobmxhX3BvcnQpOworCisJLyogSWYgYSBmdWxsIGVudHJ5IHdhcyByZXF1ZXN0ZWQsIGNoZWNrIGZvciB0aGUgYWRkaXRpb25hbCBmaWVsZHMgKi8KKwlpZiAoZnVsbF9lbnRyeSkgeworCQlzdHJ1Y3QgbmxhdHRyICpubGFfZndkLCAqbmxhX3dlaWdodCwgKm5sYV91X3RocmVzaCwKKwkJCSAgICAgICpubGFfbF90aHJlc2g7CisKKwkJbmxhX2Z3ZAkJPSBhdHRyc1tJUFZTX0RFU1RfQVRUUl9GV0RfTUVUSE9EXTsKKwkJbmxhX3dlaWdodAk9IGF0dHJzW0lQVlNfREVTVF9BVFRSX1dFSUdIVF07CisJCW5sYV91X3RocmVzaAk9IGF0dHJzW0lQVlNfREVTVF9BVFRSX1VfVEhSRVNIXTsKKwkJbmxhX2xfdGhyZXNoCT0gYXR0cnNbSVBWU19ERVNUX0FUVFJfTF9USFJFU0hdOworCisJCWlmICghKG5sYV9md2QgJiYgbmxhX3dlaWdodCAmJiBubGFfdV90aHJlc2ggJiYgbmxhX2xfdGhyZXNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXVkZXN0LT5jb25uX2ZsYWdzID0gbmxhX2dldF91MzIobmxhX2Z3ZCkKKwkJCQkgICAgJiBJUF9WU19DT05OX0ZfRldEX01BU0s7CisJCXVkZXN0LT53ZWlnaHQgPSBubGFfZ2V0X3UzMihubGFfd2VpZ2h0KTsKKwkJdWRlc3QtPnVfdGhyZXNob2xkID0gbmxhX2dldF91MzIobmxhX3VfdGhyZXNoKTsKKwkJdWRlc3QtPmxfdGhyZXNob2xkID0gbmxhX2dldF91MzIobmxhX2xfdGhyZXNoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX2ZpbGxfZGFlbW9uKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUzMiBzdGF0ZSwKKwkJCQkgIGNvbnN0IGNoYXIgKm1jYXN0X2lmbiwgX19iZTMyIHN5bmNpZCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubF9kYWVtb247CisKKwlubF9kYWVtb24gPSBubGFfbmVzdF9zdGFydChza2IsIElQVlNfQ01EX0FUVFJfREFFTU9OKTsKKwlpZiAoIW5sX2RhZW1vbikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCU5MQV9QVVRfVTMyKHNrYiwgSVBWU19EQUVNT05fQVRUUl9TVEFURSwgc3RhdGUpOworCU5MQV9QVVRfU1RSSU5HKHNrYiwgSVBWU19EQUVNT05fQVRUUl9NQ0FTVF9JRk4sIG1jYXN0X2lmbik7CisJTkxBX1BVVF9VMzIoc2tiLCBJUFZTX0RBRU1PTl9BVFRSX1NZTkNfSUQsIHN5bmNpZCk7CisKKwlubGFfbmVzdF9lbmQoc2tiLCBubF9kYWVtb24pOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCBubF9kYWVtb24pOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfZ2VubF9kdW1wX2RhZW1vbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMzIgc3RhdGUsCisJCQkJICBjb25zdCBjaGFyICptY2FzdF9pZm4sIF9fYmUzMiBzeW5jaWQsCisJCQkJICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJdm9pZCAqaGRyOworCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCSAgJmlwX3ZzX2dlbmxfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgSVBWU19DTURfTkVXX0RBRU1PTik7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlpZiAoaXBfdnNfZ2VubF9maWxsX2RhZW1vbihza2IsIHN0YXRlLCBtY2FzdF9pZm4sIHN5bmNpZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIGdlbmxtc2dfZW5kKHNrYiwgaGRyKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfZHVtcF9kYWVtb25zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCW11dGV4X2xvY2soJl9faXBfdnNfbXV0ZXgpOworCWlmICgoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikgJiYgIWNiLT5hcmdzWzBdKSB7CisJCWlmIChpcF92c19nZW5sX2R1bXBfZGFlbW9uKHNrYiwgSVBfVlNfU1RBVEVfTUFTVEVSLAorCQkJCQkgICBpcF92c19tYXN0ZXJfbWNhc3RfaWZuLAorCQkJCQkgICBpcF92c19tYXN0ZXJfc3luY2lkLCBjYikgPCAwKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJY2ItPmFyZ3NbMF0gPSAxOworCX0KKworCWlmICgoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX0JBQ0tVUCkgJiYgIWNiLT5hcmdzWzFdKSB7CisJCWlmIChpcF92c19nZW5sX2R1bXBfZGFlbW9uKHNrYiwgSVBfVlNfU1RBVEVfQkFDS1VQLAorCQkJCQkgICBpcF92c19iYWNrdXBfbWNhc3RfaWZuLAorCQkJCQkgICBpcF92c19iYWNrdXBfc3luY2lkLCBjYikgPCAwKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJY2ItPmFyZ3NbMV0gPSAxOworCX0KKworbmxhX3B1dF9mYWlsdXJlOgorCW11dGV4X3VubG9jaygmX19pcF92c19tdXRleCk7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfZ2VubF9uZXdfZGFlbW9uKHN0cnVjdCBubGF0dHIgKiphdHRycykKK3sKKwlpZiAoIShhdHRyc1tJUFZTX0RBRU1PTl9BVFRSX1NUQVRFXSAmJgorCSAgICAgIGF0dHJzW0lQVlNfREFFTU9OX0FUVFJfTUNBU1RfSUZOXSAmJgorCSAgICAgIGF0dHJzW0lQVlNfREFFTU9OX0FUVFJfU1lOQ19JRF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzdGFydF9zeW5jX3RocmVhZChubGFfZ2V0X3UzMihhdHRyc1tJUFZTX0RBRU1PTl9BVFRSX1NUQVRFXSksCisJCQkJIG5sYV9kYXRhKGF0dHJzW0lQVlNfREFFTU9OX0FUVFJfTUNBU1RfSUZOXSksCisJCQkJIG5sYV9nZXRfdTMyKGF0dHJzW0lQVlNfREFFTU9OX0FUVFJfU1lOQ19JRF0pKTsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX2RlbF9kYWVtb24oc3RydWN0IG5sYXR0ciAqKmF0dHJzKQoreworCWlmICghYXR0cnNbSVBWU19EQUVNT05fQVRUUl9TVEFURV0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHN0b3Bfc3luY190aHJlYWQobmxhX2dldF91MzIoYXR0cnNbSVBWU19EQUVNT05fQVRUUl9TVEFURV0pKTsKK30KKworc3RhdGljIGludCBpcF92c19nZW5sX3NldF9jb25maWcoc3RydWN0IG5sYXR0ciAqKmF0dHJzKQoreworCXN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgdDsKKworCV9faXBfdnNfZ2V0X3RpbWVvdXRzKCZ0KTsKKworCWlmIChhdHRyc1tJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVENQXSkKKwkJdC50Y3BfdGltZW91dCA9IG5sYV9nZXRfdTMyKGF0dHJzW0lQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1BdKTsKKworCWlmIChhdHRyc1tJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVENQX0ZJTl0pCisJCXQudGNwX2Zpbl90aW1lb3V0ID0KKwkJCW5sYV9nZXRfdTMyKGF0dHJzW0lQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1BfRklOXSk7CisKKwlpZiAoYXR0cnNbSVBWU19DTURfQVRUUl9USU1FT1VUX1VEUF0pCisJCXQudWRwX3RpbWVvdXQgPSBubGFfZ2V0X3UzMihhdHRyc1tJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVURQXSk7CisKKwlyZXR1cm4gaXBfdnNfc2V0X3RpbWVvdXQoJnQpOworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfc2V0X2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMgPSBOVUxMOworCXN0cnVjdCBpcF92c19zZXJ2aWNlX3VzZXJfa2VybiB1c3ZjOworCXN0cnVjdCBpcF92c19kZXN0X3VzZXJfa2VybiB1ZGVzdDsKKwlpbnQgcmV0ID0gMCwgY21kOworCWludCBuZWVkX2Z1bGxfc3ZjID0gMCwgbmVlZF9mdWxsX2Rlc3QgPSAwOworCisJY21kID0gaW5mby0+Z2VubGhkci0+Y21kOworCisJbXV0ZXhfbG9jaygmX19pcF92c19tdXRleCk7CisKKwlpZiAoY21kID09IElQVlNfQ01EX0ZMVVNIKSB7CisJCXJldCA9IGlwX3ZzX2ZsdXNoKCk7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoY21kID09IElQVlNfQ01EX1NFVF9DT05GSUcpIHsKKwkJcmV0ID0gaXBfdnNfZ2VubF9zZXRfY29uZmlnKGluZm8tPmF0dHJzKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChjbWQgPT0gSVBWU19DTURfTkVXX0RBRU1PTiB8fAorCQkgICBjbWQgPT0gSVBWU19DTURfREVMX0RBRU1PTikgeworCisJCXN0cnVjdCBubGF0dHIgKmRhZW1vbl9hdHRyc1tJUFZTX0RBRU1PTl9BVFRSX01BWCArIDFdOworCisJCWlmICghaW5mby0+YXR0cnNbSVBWU19DTURfQVRUUl9EQUVNT05dIHx8CisJCSAgICBubGFfcGFyc2VfbmVzdGVkKGRhZW1vbl9hdHRycywgSVBWU19EQUVNT05fQVRUUl9NQVgsCisJCQkJICAgICBpbmZvLT5hdHRyc1tJUFZTX0NNRF9BVFRSX0RBRU1PTl0sCisJCQkJICAgICBpcF92c19kYWVtb25fcG9saWN5KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGNtZCA9PSBJUFZTX0NNRF9ORVdfREFFTU9OKQorCQkJcmV0ID0gaXBfdnNfZ2VubF9uZXdfZGFlbW9uKGRhZW1vbl9hdHRycyk7CisJCWVsc2UKKwkJCXJldCA9IGlwX3ZzX2dlbmxfZGVsX2RhZW1vbihkYWVtb25fYXR0cnMpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBJUFZTX0NNRF9aRVJPICYmCisJCSAgICFpbmZvLT5hdHRyc1tJUFZTX0NNRF9BVFRSX1NFUlZJQ0VdKSB7CisJCXJldCA9IGlwX3ZzX3plcm9fYWxsKCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbCBmb2xsb3dpbmcgY29tbWFuZHMgcmVxdWlyZSBhIHNlcnZpY2UgYXJndW1lbnQsIHNvIGNoZWNrIGlmIHdlCisJICogcmVjZWl2ZWQgYSB2YWxpZCBvbmUuIFdlIG5lZWQgYSBmdWxsIHNlcnZpY2Ugc3BlY2lmaWNhdGlvbiB3aGVuCisJICogYWRkaW5nIC8gZWRpdGluZyBhIHNlcnZpY2UuIE9ubHkgaWRlbnRpZnlpbmcgbWVtYmVycyBvdGhlcndpc2UuICovCisJaWYgKGNtZCA9PSBJUFZTX0NNRF9ORVdfU0VSVklDRSB8fCBjbWQgPT0gSVBWU19DTURfU0VUX1NFUlZJQ0UpCisJCW5lZWRfZnVsbF9zdmMgPSAxOworCisJcmV0ID0gaXBfdnNfZ2VubF9wYXJzZV9zZXJ2aWNlKCZ1c3ZjLAorCQkJCSAgICAgICBpbmZvLT5hdHRyc1tJUFZTX0NNRF9BVFRSX1NFUlZJQ0VdLAorCQkJCSAgICAgICBuZWVkX2Z1bGxfc3ZjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIExvb2t1cCB0aGUgZXhhY3Qgc2VydmljZSBieSA8cHJvdG9jb2wsIGFkZHIsIHBvcnQ+IG9yIGZ3bWFyayAqLworCWlmICh1c3ZjLmZ3bWFyayA9PSAwKQorCQlzdmMgPSBfX2lwX3ZzX3NlcnZpY2VfZ2V0KHVzdmMuYWYsIHVzdmMucHJvdG9jb2wsCisJCQkJCSAgJnVzdmMuYWRkciwgdXN2Yy5wb3J0KTsKKwllbHNlCisJCXN2YyA9IF9faXBfdnNfc3ZjX2Z3bV9nZXQodXN2Yy5hZiwgdXN2Yy5md21hcmspOworCisJLyogVW5sZXNzIHdlJ3JlIGFkZGluZyBhIG5ldyBzZXJ2aWNlLCB0aGUgc2VydmljZSBtdXN0IGFscmVhZHkgZXhpc3QgKi8KKwlpZiAoKGNtZCAhPSBJUFZTX0NNRF9ORVdfU0VSVklDRSkgJiYgKHN2YyA9PSBOVUxMKSkgeworCQlyZXQgPSAtRVNSQ0g7CisJCWdvdG8gb3V0OworCX0KKworCS8qIERlc3RpbmF0aW9uIGNvbW1hbmRzIHJlcXVpcmUgYSB2YWxpZCBkZXN0aW5hdGlvbiBhcmd1bWVudC4gRm9yCisJICogYWRkaW5nIC8gZWRpdGluZyBhIGRlc3RpbmF0aW9uLCB3ZSBuZWVkIGEgZnVsbCBkZXN0aW5hdGlvbgorCSAqIHNwZWNpZmljYXRpb24uICovCisJaWYgKGNtZCA9PSBJUFZTX0NNRF9ORVdfREVTVCB8fCBjbWQgPT0gSVBWU19DTURfU0VUX0RFU1QgfHwKKwkgICAgY21kID09IElQVlNfQ01EX0RFTF9ERVNUKSB7CisJCWlmIChjbWQgIT0gSVBWU19DTURfREVMX0RFU1QpCisJCQluZWVkX2Z1bGxfZGVzdCA9IDE7CisKKwkJcmV0ID0gaXBfdnNfZ2VubF9wYXJzZV9kZXN0KCZ1ZGVzdCwKKwkJCQkJICAgIGluZm8tPmF0dHJzW0lQVlNfQ01EX0FUVFJfREVTVF0sCisJCQkJCSAgICBuZWVkX2Z1bGxfZGVzdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSVBWU19DTURfTkVXX1NFUlZJQ0U6CisJCWlmIChzdmMgPT0gTlVMTCkKKwkJCXJldCA9IGlwX3ZzX2FkZF9zZXJ2aWNlKCZ1c3ZjLCAmc3ZjKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVFWElTVDsKKwkJYnJlYWs7CisJY2FzZSBJUFZTX0NNRF9TRVRfU0VSVklDRToKKwkJcmV0ID0gaXBfdnNfZWRpdF9zZXJ2aWNlKHN2YywgJnVzdmMpOworCQlicmVhazsKKwljYXNlIElQVlNfQ01EX0RFTF9TRVJWSUNFOgorCQlyZXQgPSBpcF92c19kZWxfc2VydmljZShzdmMpOworCQlicmVhazsKKwljYXNlIElQVlNfQ01EX05FV19ERVNUOgorCQlyZXQgPSBpcF92c19hZGRfZGVzdChzdmMsICZ1ZGVzdCk7CisJCWJyZWFrOworCWNhc2UgSVBWU19DTURfU0VUX0RFU1Q6CisJCXJldCA9IGlwX3ZzX2VkaXRfZGVzdChzdmMsICZ1ZGVzdCk7CisJCWJyZWFrOworCWNhc2UgSVBWU19DTURfREVMX0RFU1Q6CisJCXJldCA9IGlwX3ZzX2RlbF9kZXN0KHN2YywgJnVkZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBJUFZTX0NNRF9aRVJPOgorCQlyZXQgPSBpcF92c196ZXJvX3NlcnZpY2Uoc3ZjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKK291dDoKKwlpZiAoc3ZjKQorCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCW11dGV4X3VubG9jaygmX19pcF92c19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlwX3ZzX2dlbmxfZ2V0X2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqcmVwbHk7CisJaW50IHJldCwgY21kLCByZXBseV9jbWQ7CisKKwljbWQgPSBpbmZvLT5nZW5saGRyLT5jbWQ7CisKKwlpZiAoY21kID09IElQVlNfQ01EX0dFVF9TRVJWSUNFKQorCQlyZXBseV9jbWQgPSBJUFZTX0NNRF9ORVdfU0VSVklDRTsKKwllbHNlIGlmIChjbWQgPT0gSVBWU19DTURfR0VUX0lORk8pCisJCXJlcGx5X2NtZCA9IElQVlNfQ01EX1NFVF9JTkZPOworCWVsc2UgaWYgKGNtZCA9PSBJUFZTX0NNRF9HRVRfQ09ORklHKQorCQlyZXBseV9jbWQgPSBJUFZTX0NNRF9TRVRfQ09ORklHOworCWVsc2UgeworCQlJUF9WU19FUlIoInVua25vd24gR2VuZXJpYyBOZXRsaW5rIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZfX2lwX3ZzX211dGV4KTsKKworCXJlcGx5ID0gZ2VubG1zZ19wdXRfcmVwbHkobXNnLCBpbmZvLCAmaXBfdnNfZ2VubF9mYW1pbHksIDAsIHJlcGx5X2NtZCk7CisJaWYgKHJlcGx5ID09IE5VTEwpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElQVlNfQ01EX0dFVF9TRVJWSUNFOgorCXsKKwkJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKworCQlzdmMgPSBpcF92c19nZW5sX2ZpbmRfc2VydmljZShpbmZvLT5hdHRyc1tJUFZTX0NNRF9BVFRSX1NFUlZJQ0VdKTsKKwkJaWYgKElTX0VSUihzdmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHN2Yyk7CisJCQlnb3RvIG91dF9lcnI7CisJCX0gZWxzZSBpZiAoc3ZjKSB7CisJCQlyZXQgPSBpcF92c19nZW5sX2ZpbGxfc2VydmljZShtc2csIHN2Yyk7CisJCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FU1JDSDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCWJyZWFrOworCX0KKworCWNhc2UgSVBWU19DTURfR0VUX0NPTkZJRzoKKwl7CisJCXN0cnVjdCBpcF92c190aW1lb3V0X3VzZXIgdDsKKworCQlfX2lwX3ZzX2dldF90aW1lb3V0cygmdCk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1RDUAorCQlOTEFfUFVUX1UzMihtc2csIElQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1AsIHQudGNwX3RpbWVvdXQpOworCQlOTEFfUFVUX1UzMihtc2csIElQVlNfQ01EX0FUVFJfVElNRU9VVF9UQ1BfRklOLAorCQkJICAgIHQudGNwX2Zpbl90aW1lb3V0KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19VRFAKKwkJTkxBX1BVVF9VMzIobXNnLCBJUFZTX0NNRF9BVFRSX1RJTUVPVVRfVURQLCB0LnVkcF90aW1lb3V0KTsKKyNlbmRpZgorCisJCWJyZWFrOworCX0KKworCWNhc2UgSVBWU19DTURfR0VUX0lORk86CisJCU5MQV9QVVRfVTMyKG1zZywgSVBWU19JTkZPX0FUVFJfVkVSU0lPTiwgSVBfVlNfVkVSU0lPTl9DT0RFKTsKKwkJTkxBX1BVVF9VMzIobXNnLCBJUFZTX0lORk9fQVRUUl9DT05OX1RBQl9TSVpFLAorCQkJICAgIElQX1ZTX0NPTk5fVEFCX1NJWkUpOworCQlicmVhazsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIHJlcGx5KTsKKwlyZXQgPSBnZW5sbXNnX3VuaWNhc3QobXNnLCBpbmZvLT5zbmRfcGlkKTsKKwlnb3RvIG91dDsKKworbmxhX3B1dF9mYWlsdXJlOgorCUlQX1ZTX0VSUigibm90IGVub3VnaCBzcGFjZSBpbiBOZXRsaW5rIG1lc3NhZ2VcbiIpOworCXJldCA9IC1FTVNHU0laRTsKKworb3V0X2VycjoKKwlubG1zZ19mcmVlKG1zZyk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZfX2lwX3ZzX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBnZW5sX29wcyBpcF92c19nZW5sX29wc1tdIF9fcmVhZF9tb3N0bHkgPSB7CisJeworCQkuY21kCT0gSVBWU19DTURfTkVXX1NFUlZJQ0UsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfU0VUX1NFUlZJQ0UsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfREVMX1NFUlZJQ0UsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfR0VUX1NFUlZJQ0UsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmRvaXQJPSBpcF92c19nZW5sX2dldF9jbWQsCisJCS5kdW1waXQJPSBpcF92c19nZW5sX2R1bXBfc2VydmljZXMsCisJCS5wb2xpY3kJPSBpcF92c19jbWRfcG9saWN5LAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfTkVXX0RFU1QsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfU0VUX0RFU1QsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfREVMX0RFU1QsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfR0VUX0RFU1QsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kdW1waXQJPSBpcF92c19nZW5sX2R1bXBfZGVzdHMsCisJfSwKKwl7CisJCS5jbWQJPSBJUFZTX0NNRF9ORVdfREFFTU9OLAorCQkuZmxhZ3MJPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kJPSBpcF92c19jbWRfcG9saWN5LAorCQkuZG9pdAk9IGlwX3ZzX2dlbmxfc2V0X2NtZCwKKwl9LAorCXsKKwkJLmNtZAk9IElQVlNfQ01EX0RFTF9EQUVNT04sCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfR0VUX0RBRU1PTiwKKwkJLmZsYWdzCT0gR0VOTF9BRE1JTl9QRVJNLAorCQkuZHVtcGl0CT0gaXBfdnNfZ2VubF9kdW1wX2RhZW1vbnMsCisJfSwKKwl7CisJCS5jbWQJPSBJUFZTX0NNRF9TRVRfQ09ORklHLAorCQkuZmxhZ3MJPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kJPSBpcF92c19jbWRfcG9saWN5LAorCQkuZG9pdAk9IGlwX3ZzX2dlbmxfc2V0X2NtZCwKKwl9LAorCXsKKwkJLmNtZAk9IElQVlNfQ01EX0dFVF9DT05GSUcsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmRvaXQJPSBpcF92c19nZW5sX2dldF9jbWQsCisJfSwKKwl7CisJCS5jbWQJPSBJUFZTX0NNRF9HRVRfSU5GTywKKwkJLmZsYWdzCT0gR0VOTF9BRE1JTl9QRVJNLAorCQkuZG9pdAk9IGlwX3ZzX2dlbmxfZ2V0X2NtZCwKKwl9LAorCXsKKwkJLmNtZAk9IElQVlNfQ01EX1pFUk8sCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeQk9IGlwX3ZzX2NtZF9wb2xpY3ksCisJCS5kb2l0CT0gaXBfdnNfZ2VubF9zZXRfY21kLAorCX0sCisJeworCQkuY21kCT0gSVBWU19DTURfRkxVU0gsCisJCS5mbGFncwk9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmRvaXQJPSBpcF92c19nZW5sX3NldF9jbWQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2dlbmxfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJmlwX3ZzX2dlbmxfZmFtaWx5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXBfdnNfZ2VubF9vcHMpOyBpKyspIHsKKwkJcmV0ID0gZ2VubF9yZWdpc3Rlcl9vcHMoJmlwX3ZzX2dlbmxfZmFtaWx5LCAmaXBfdnNfZ2VubF9vcHNbaV0pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfb3V0OworCX0KKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZpcF92c19nZW5sX2ZhbWlseSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXBfdnNfZ2VubF91bnJlZ2lzdGVyKHZvaWQpCit7CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmaXBfdnNfZ2VubF9mYW1pbHkpOworfQorCisvKiBFbmQgb2YgR2VuZXJpYyBOZXRsaW5rIGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworCisKK2ludCBfX2luaXQgaXBfdnNfY29udHJvbF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlpbnQgaWR4OworCisJRW50ZXJGdW5jdGlvbigyKTsKKworCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmlwX3ZzX3NvY2tvcHRzKTsKKwlpZiAocmV0KSB7CisJCUlQX1ZTX0VSUigiY2Fubm90IHJlZ2lzdGVyIHNvY2tvcHQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpcF92c19nZW5sX3JlZ2lzdGVyKCk7CisJaWYgKHJldCkgeworCQlJUF9WU19FUlIoImNhbm5vdCByZWdpc3RlciBHZW5lcmljIE5ldGxpbmsgaW50ZXJmYWNlLlxuIik7CisJCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmaXBfdnNfc29ja29wdHMpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgImlwX3ZzIiwgMCwgJmlwX3ZzX2luZm9fZm9wcyk7CisJcHJvY19uZXRfZm9wc19jcmVhdGUoJmluaXRfbmV0LCAiaXBfdnNfc3RhdHMiLDAsICZpcF92c19zdGF0c19mb3BzKTsKKworCXN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfcGF0aHMobmV0X3ZzX2N0bF9wYXRoLCB2c192YXJzKTsKKworCS8qIEluaXRpYWxpemUgaXBfdnNfc3ZjX3RhYmxlLCBpcF92c19zdmNfZndtX3RhYmxlLCBpcF92c19ydGFibGUgKi8KKwlmb3IoaWR4ID0gMDsgaWR4IDwgSVBfVlNfU1ZDX1RBQl9TSVpFOyBpZHgrKykgIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y190YWJsZVtpZHhdKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlwX3ZzX3N2Y19md21fdGFibGVbaWR4XSk7CisJfQorCWZvcihpZHggPSAwOyBpZHggPCBJUF9WU19SVEFCX1NJWkU7IGlkeCsrKSAgeworCQlJTklUX0xJU1RfSEVBRCgmaXBfdnNfcnRhYmxlW2lkeF0pOworCX0KKworCWlwX3ZzX25ld19lc3RpbWF0b3IoJmlwX3ZzX3N0YXRzKTsKKworCS8qIEhvb2sgdGhlIGRlZmVuc2UgdGltZXIgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRlZmVuc2Vfd29yaywgREVGRU5TRV9USU1FUl9QRVJJT0QpOworCisJTGVhdmVGdW5jdGlvbigyKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGlwX3ZzX2NvbnRyb2xfY2xlYW51cCh2b2lkKQoreworCUVudGVyRnVuY3Rpb24oMik7CisJaXBfdnNfdHJhc2hfY2xlYW51cCgpOworCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmRlZmVuc2Vfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmZGVmZW5zZV93b3JrLndvcmspOworCWlwX3ZzX2tpbGxfZXN0aW1hdG9yKCZpcF92c19zdGF0cyk7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7CisJcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX3ZzX3N0YXRzIik7CisJcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgImlwX3ZzIik7CisJaXBfdnNfZ2VubF91bnJlZ2lzdGVyKCk7CisJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcF92c19zb2Nrb3B0cyk7CisJTGVhdmVGdW5jdGlvbigyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19kaC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2OTQzZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19kaC5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogSVBWUzogICAgICAgIERlc3RpbmF0aW9uIEhhc2hpbmcgc2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BnbnVjaGluYS5vcmc+CisgKgorICogICAgICAgICAgICAgIEluc3BpcmVkIGJ5IHRoZSBjb25zaXN0ZW50IGhhc2hpbmcgc2NoZWR1bGVyIHBhdGNoIGZyb20KKyAqICAgICAgICAgICAgICBUaG9tYXMgUHJvZWxsIDxwcm9lbGx0QGdteC5kZT4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworCisvKgorICogVGhlIGRoIGFsZ29yaXRobSBpcyB0byBzZWxlY3Qgc2VydmVyIGJ5IHRoZSBoYXNoIGtleSBvZiBkZXN0aW5hdGlvbiBJUAorICogYWRkcmVzcy4gVGhlIHBzZXVkbyBjb2RlIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgbiA8LSBzZXJ2ZXJub2RlW2Rlc3RfaXBdOworICogICAgICAgaWYgKG4gaXMgZGVhZCkgT1IKKyAqICAgICAgICAgIChuIGlzIG92ZXJsb2FkZWQpIE9SIChuLndlaWdodCA8PSAwKSB0aGVuCisgKiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgKgorICogICAgICAgcmV0dXJuIG47CisgKgorICogTm90ZXMgdGhhdCBzZXJ2ZXJub2RlIGlzIGEgMjU2LWJ1Y2tldCBoYXNoIHRhYmxlIHRoYXQgbWFwcyB0aGUgaGFzaAorICogaW5kZXggZGVyaXZlZCBmcm9tIHBhY2tldCBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzIHRvIHRoZSBjdXJyZW50IHNlcnZlcgorICogYXJyYXkuIElmIHRoZSBkaCBzY2hlZHVsZXIgaXMgdXNlZCBpbiBjYWNoZSBjbHVzdGVyLCBpdCBpcyBnb29kIHRvCisgKiBjb21iaW5lIGl0IHdpdGggY2FjaGVfYnlwYXNzIGZlYXR1cmUuIFdoZW4gdGhlIHN0YXRpY2FsbHkgYXNzaWduZWQKKyAqIHNlcnZlciBpcyBkZWFkIG9yIG92ZXJsb2FkZWQsIHRoZSBsb2FkIGJhbGFuY2VyIGNhbiBieXBhc3MgdGhlIGNhY2hlCisgKiBzZXJ2ZXIgYW5kIHNlbmQgcmVxdWVzdHMgdG8gdGhlIG9yaWdpbmFsIHNlcnZlciBkaXJlY3RseS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogICAgICBJUFZTIERIIGJ1Y2tldAorICovCitzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0IHsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLworfTsKKworLyoKKyAqICAgICBmb3IgSVBWUyBESCBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX0RIX1RBQl9CSVRTCisjZGVmaW5lIENPTkZJR19JUF9WU19ESF9UQUJfQklUUyAgICAgICAgOAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX0RIX1RBQl9CSVRTICAgICAgICAgICAgICAgQ09ORklHX0lQX1ZTX0RIX1RBQl9CSVRTCisjZGVmaW5lIElQX1ZTX0RIX1RBQl9TSVpFICAgICAgICAgICAgICAgKDEgPDwgSVBfVlNfREhfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX0RIX1RBQl9NQVNLICAgICAgICAgICAgICAgKElQX1ZTX0RIX1RBQl9TSVpFIC0gMSkKKworCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciBJUFZTIERIIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXBfdnNfZGhfaGFzaGtleShfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gKG50b2hsKGFkZHIpKjI2NTQ0MzU3NjFVTCkgJiBJUF9WU19ESF9UQUJfTUFTSzsKK30KKworCisvKgorICogICAgICBHZXQgaXBfdnNfZGVzdCBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19kaF9nZXQoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsLCBfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gKHRibFtpcF92c19kaF9oYXNoa2V5KGFkZHIpXSkuZGVzdDsKK30KKworCisvKgorICogICAgICBBc3NpZ24gYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZSB3aXRoIHRoZSBzZXJ2aWNlLgorICovCitzdGF0aWMgaW50CitpcF92c19kaF9hc3NpZ24oc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKmI7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCWIgPSB0Ymw7CisJcCA9ICZzdmMtPmRlc3RpbmF0aW9uczsKKwlmb3IgKGk9MDsgaTxJUF9WU19ESF9UQUJfU0laRTsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KHApKSB7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwID09ICZzdmMtPmRlc3RpbmF0aW9ucykKKwkJCQlwID0gcC0+bmV4dDsKKworCQkJZGVzdCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGlwX3ZzX2Rlc3QsIG5fbGlzdCk7CisJCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCQkJYi0+ZGVzdCA9IGRlc3Q7CisKKwkJCXAgPSBwLT5uZXh0OworCQl9CisJCWIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfZGhfZmx1c2goc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKmI7CisKKwliID0gdGJsOworCWZvciAoaT0wOyBpPElQX1ZTX0RIX1RBQl9TSVpFOyBpKyspIHsKKwkJaWYgKGItPmRlc3QpIHsKKwkJCWF0b21pY19kZWMoJmItPmRlc3QtPnJlZmNudCk7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfQorCQliKys7CisJfQorfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfZGhfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0Ymw7CisKKwkvKiBhbGxvY2F0ZSB0aGUgREggdGFibGUgZm9yIHRoaXMgc2VydmljZSAqLworCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19kaF9idWNrZXQpKklQX1ZTX0RIX1RBQl9TSVpFLAorCQkgICAgICBHRlBfQVRPTUlDKTsKKwlpZiAodGJsID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19kaF9pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOworCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKKwkJICAiY3VycmVudCBzZXJ2aWNlXG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0KSpJUF9WU19ESF9UQUJfU0laRSk7CisKKwkvKiBhc3NpZ24gdGhlIGhhc2ggYnVja2V0cyB3aXRoIHRoZSB1cGRhdGVkIHNlcnZpY2UgKi8KKwlpcF92c19kaF9hc3NpZ24odGJsLCBzdmMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19kaF9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCBoYXNoIGJ1Y2tldHMgaGVyZSAqLworCWlwX3ZzX2RoX2ZsdXNoKHRibCk7CisKKwkvKiByZWxlYXNlIHRoZSB0YWJsZSBpdHNlbGYgKi8KKwlrZnJlZShzdmMtPnNjaGVkX2RhdGEpOworCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSByZWxlYXNlZFxuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCkqSVBfVlNfREhfVEFCX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19kaF91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCisJLyogZ290IHRvIGNsZWFuIHVwIGhhc2ggYnVja2V0cyBoZXJlICovCisJaXBfdnNfZGhfZmx1c2godGJsKTsKKworCS8qIGFzc2lnbiB0aGUgaGFzaCBidWNrZXRzIHdpdGggdGhlIHVwZGF0ZWQgc2VydmljZSAqLworCWlwX3ZzX2RoX2Fzc2lnbih0YmwsIHN2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBJZiB0aGUgZGVzdCBmbGFncyBpcyBzZXQgd2l0aCBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQsCisgKiAgICAgIGNvbnNpZGVyIHRoYXQgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkIGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJcmV0dXJuIGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEOworfQorCisKKy8qCisgKiAgICAgIERlc3RpbmF0aW9uIGhhc2hpbmcgc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfZGhfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfZGhfYnVja2V0ICp0Ymw7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfZGhfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwl0YmwgPSAoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCAqKXN2Yy0+c2NoZWRfZGF0YTsKKwlkZXN0ID0gaXBfdnNfZGhfZ2V0KHRibCwgaXBoLT5kYWRkcik7CisJaWYgKCFkZXN0CisJICAgIHx8ICEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKQorCSAgICB8fCBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8PSAwCisJICAgIHx8IGlzX292ZXJsb2FkZWQoZGVzdCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSVBfVlNfREJHKDYsICJESDogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCisJCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgTklQUVVBRChpcGgtPmRhZGRyKSwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIuaXApLAorCQkgIG50b2hzKGRlc3QtPnBvcnQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgREggU2NoZWR1bGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX3NjaGVkdWxlciBpcF92c19kaF9zY2hlZHVsZXIgPQoreworCS5uYW1lID0JCQkiZGgiLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkubl9saXN0ID0JCUxJU1RfSEVBRF9JTklUKGlwX3ZzX2RoX3NjaGVkdWxlci5uX2xpc3QpLAorI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJLnN1cHBvcnRzX2lwdjYgPQkwLAorI2VuZGlmCisJLmluaXRfc2VydmljZSA9CQlpcF92c19kaF9pbml0X3N2YywKKwkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX2RoX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX2RoX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX2RoX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19kaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfZGhfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfZGhfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19kaF9zY2hlZHVsZXIpOworfQorCisKK21vZHVsZV9pbml0KGlwX3ZzX2RoX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfZGhfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZXN0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMjg2MAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19lc3QuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIGlwX3ZzX2VzdC5jOiBzaW1wbGUgcmF0ZSBlc3RpbWF0b3IgZm9yIElQVlMKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisvKgorICBUaGlzIGNvZGUgaXMgdG8gZXN0aW1hdGUgcmF0ZSBpbiBhIHNob3J0ZXIgaW50ZXJ2YWwgKHN1Y2ggYXMgOAorICBzZWNvbmRzKSBmb3IgdmlydHVhbCBzZXJ2aWNlcyBhbmQgcmVhbCBzZXJ2ZXJzLiBGb3IgbWVhc3VyZSByYXRlIGluIGEKKyAgbG9uZyBpbnRlcnZhbCwgaXQgaXMgZWFzeSB0byBpbXBsZW1lbnQgYSB1c2VyIGxldmVsIGRhZW1vbiB3aGljaAorICBwZXJpb2RpY2FsbHkgcmVhZHMgdGhvc2Ugc3RhdGlzdGljYWwgY291bnRlcnMgYW5kIG1lYXN1cmUgcmF0ZS4KKworICBDdXJyZW50bHksIHRoZSBtZWFzdXJlbWVudCBpcyBhY3RpdmF0ZWQgYnkgc2xvdyB0aW1lciBoYW5kbGVyLiBIb3BlCisgIHRoaXMgbWVhc3VyZW1lbnQgd2lsbCBub3QgaW50cm9kdWNlIHRvbyBtdWNoIGxvYWQuCisKKyAgV2UgbWVhc3VyZSByYXRlIGR1cmluZyB0aGUgbGFzdCA4IHNlY29uZHMgZXZlcnkgMiBzZWNvbmRzOgorCisgICAgYXZncmF0ZSA9IGF2Z3JhdGUqKDEtVykgKyByYXRlKlcKKworICAgIHdoZXJlIFcgPSAyXigtMikKKworICBOT1RFUy4KKworICAqIFRoZSBzdG9yZWQgdmFsdWUgZm9yIGF2ZXJhZ2UgYnBzIGlzIHNjYWxlZCBieSAyXjUsIHNvIHRoYXQgbWF4aW1hbAorICAgIHJhdGUgaXMgfjIuMTVHYml0cy9zLCBhdmVyYWdlIHBwcyBhbmQgY3BzIGFyZSBzY2FsZWQgYnkgMl4xMC4KKworICAqIEEgbG90IGNvZGUgaXMgdGFrZW4gZnJvbSBuZXQvc2NoZWQvZXN0aW1hdG9yLmMKKyAqLworCisKK3N0YXRpYyB2b2lkIGVzdGltYXRpb25fdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgTElTVF9IRUFEKGVzdF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXN0X2xvY2spOworc3RhdGljIERFRklORV9USU1FUihlc3RfdGltZXIsIGVzdGltYXRpb25fdGltZXIsIDAsIDApOworCitzdGF0aWMgdm9pZCBlc3RpbWF0aW9uX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpcF92c19lc3RpbWF0b3IgKmU7CisJc3RydWN0IGlwX3ZzX3N0YXRzICpzOworCXUzMiBuX2Nvbm5zOworCXUzMiBuX2lucGt0cywgbl9vdXRwa3RzOworCXU2NCBuX2luYnl0ZXMsIG5fb3V0Ynl0ZXM7CisJdTMyIHJhdGU7CisKKwlzcGluX2xvY2soJmVzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZlc3RfbGlzdCwgbGlzdCkgeworCQlzID0gY29udGFpbmVyX29mKGUsIHN0cnVjdCBpcF92c19zdGF0cywgZXN0KTsKKworCQlzcGluX2xvY2soJnMtPmxvY2spOworCQluX2Nvbm5zID0gcy0+dXN0YXRzLmNvbm5zOworCQluX2lucGt0cyA9IHMtPnVzdGF0cy5pbnBrdHM7CisJCW5fb3V0cGt0cyA9IHMtPnVzdGF0cy5vdXRwa3RzOworCQluX2luYnl0ZXMgPSBzLT51c3RhdHMuaW5ieXRlczsKKwkJbl9vdXRieXRlcyA9IHMtPnVzdGF0cy5vdXRieXRlczsKKworCQkvKiBzY2FsZWQgYnkgMl4xMCwgYnV0IGRpdmlkZWQgMiBzZWNvbmRzICovCisJCXJhdGUgPSAobl9jb25ucyAtIGUtPmxhc3RfY29ubnMpPDw5OworCQllLT5sYXN0X2Nvbm5zID0gbl9jb25uczsKKwkJZS0+Y3BzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+Y3BzKT4+MjsKKwkJcy0+dXN0YXRzLmNwcyA9IChlLT5jcHMrMHgxRkYpPj4xMDsKKworCQlyYXRlID0gKG5faW5wa3RzIC0gZS0+bGFzdF9pbnBrdHMpPDw5OworCQllLT5sYXN0X2lucGt0cyA9IG5faW5wa3RzOworCQllLT5pbnBwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPmlucHBzKT4+MjsKKwkJcy0+dXN0YXRzLmlucHBzID0gKGUtPmlucHBzKzB4MUZGKT4+MTA7CisKKwkJcmF0ZSA9IChuX291dHBrdHMgLSBlLT5sYXN0X291dHBrdHMpPDw5OworCQllLT5sYXN0X291dHBrdHMgPSBuX291dHBrdHM7CisJCWUtPm91dHBwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPm91dHBwcyk+PjI7CisJCXMtPnVzdGF0cy5vdXRwcHMgPSAoZS0+b3V0cHBzKzB4MUZGKT4+MTA7CisKKwkJcmF0ZSA9IChuX2luYnl0ZXMgLSBlLT5sYXN0X2luYnl0ZXMpPDw0OworCQllLT5sYXN0X2luYnl0ZXMgPSBuX2luYnl0ZXM7CisJCWUtPmluYnBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+aW5icHMpPj4yOworCQlzLT51c3RhdHMuaW5icHMgPSAoZS0+aW5icHMrMHhGKT4+NTsKKworCQlyYXRlID0gKG5fb3V0Ynl0ZXMgLSBlLT5sYXN0X291dGJ5dGVzKTw8NDsKKwkJZS0+bGFzdF9vdXRieXRlcyA9IG5fb3V0Ynl0ZXM7CisJCWUtPm91dGJwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPm91dGJwcyk+PjI7CisJCXMtPnVzdGF0cy5vdXRicHMgPSAoZS0+b3V0YnBzKzB4Rik+PjU7CisJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmVzdF9sb2NrKTsKKwltb2RfdGltZXIoJmVzdF90aW1lciwgamlmZmllcyArIDIqSFopOworfQorCit2b2lkIGlwX3ZzX25ld19lc3RpbWF0b3Ioc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaXBfdnNfZXN0aW1hdG9yICplc3QgPSAmc3RhdHMtPmVzdDsKKworCUlOSVRfTElTVF9IRUFEKCZlc3QtPmxpc3QpOworCisJZXN0LT5sYXN0X2Nvbm5zID0gc3RhdHMtPnVzdGF0cy5jb25uczsKKwllc3QtPmNwcyA9IHN0YXRzLT51c3RhdHMuY3BzPDwxMDsKKworCWVzdC0+bGFzdF9pbnBrdHMgPSBzdGF0cy0+dXN0YXRzLmlucGt0czsKKwllc3QtPmlucHBzID0gc3RhdHMtPnVzdGF0cy5pbnBwczw8MTA7CisKKwllc3QtPmxhc3Rfb3V0cGt0cyA9IHN0YXRzLT51c3RhdHMub3V0cGt0czsKKwllc3QtPm91dHBwcyA9IHN0YXRzLT51c3RhdHMub3V0cHBzPDwxMDsKKworCWVzdC0+bGFzdF9pbmJ5dGVzID0gc3RhdHMtPnVzdGF0cy5pbmJ5dGVzOworCWVzdC0+aW5icHMgPSBzdGF0cy0+dXN0YXRzLmluYnBzPDw1OworCisJZXN0LT5sYXN0X291dGJ5dGVzID0gc3RhdHMtPnVzdGF0cy5vdXRieXRlczsKKwllc3QtPm91dGJwcyA9IHN0YXRzLT51c3RhdHMub3V0YnBzPDw1OworCisJc3Bpbl9sb2NrX2JoKCZlc3RfbG9jayk7CisJbGlzdF9hZGQoJmVzdC0+bGlzdCwgJmVzdF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmZXN0X2xvY2spOworfQorCit2b2lkIGlwX3ZzX2tpbGxfZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZXN0ID0gJnN0YXRzLT5lc3Q7CisKKwlzcGluX2xvY2tfYmgoJmVzdF9sb2NrKTsKKwlsaXN0X2RlbCgmZXN0LT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmZXN0X2xvY2spOworfQorCit2b2lkIGlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZXN0ID0gJnN0YXRzLT5lc3Q7CisKKwkvKiBzZXQgY291bnRlcnMgemVybywgY2FsbGVyIG11c3QgaG9sZCB0aGUgc3RhdHMtPmxvY2sgbG9jayAqLworCWVzdC0+bGFzdF9pbmJ5dGVzID0gMDsKKwllc3QtPmxhc3Rfb3V0Ynl0ZXMgPSAwOworCWVzdC0+bGFzdF9jb25ucyA9IDA7CisJZXN0LT5sYXN0X2lucGt0cyA9IDA7CisJZXN0LT5sYXN0X291dHBrdHMgPSAwOworCWVzdC0+Y3BzID0gMDsKKwllc3QtPmlucHBzID0gMDsKKwllc3QtPm91dHBwcyA9IDA7CisJZXN0LT5pbmJwcyA9IDA7CisJZXN0LT5vdXRicHMgPSAwOworfQorCitpbnQgX19pbml0IGlwX3ZzX2VzdGltYXRvcl9pbml0KHZvaWQpCit7CisJbW9kX3RpbWVyKCZlc3RfdGltZXIsIGppZmZpZXMgKyAyICogSFopOworCXJldHVybiAwOworfQorCit2b2lkIGlwX3ZzX2VzdGltYXRvcl9jbGVhbnVwKHZvaWQpCit7CisJZGVsX3RpbWVyX3N5bmMoJmVzdF90aW1lcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3ZGJkOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIGlwX3ZzX2Z0cC5jOiBJUFZTIGZ0cCBhcHBsaWNhdGlvbiBtb2R1bGUKKyAqCisgKiBBdXRob3JzOglXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBNb3N0IGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tIGlwX21hc3FfZnRwLmMgaW4ga2VybmVsIDIuMi4gVGhlIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgaXBfdnNfZnRwIG1vZHVsZSBoYW5kbGVzIHRoZSByZXZlcnNlIGRpcmVjdGlvbiB0byBpcF9tYXNxX2Z0cC4KKyAqCisgKgkJSVBfTUFTUV9GVFAgZnRwIG1hc3F1ZXJhZGluZyBtb2R1bGUKKyAqCisgKiBWZXJzaW9uOglAKCMpaXBfbWFzcV9mdHAuYyAwLjA0ICAgMDIvMDUvOTYKKyAqCisgKiBBdXRob3I6CVdvdXRlciBHYWRleW5lCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworI2RlZmluZSBTRVJWRVJfU1RSSU5HICIyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICgiCisjZGVmaW5lIENMSUVOVF9TVFJJTkcgIlBPUlQgIgorCisKKy8qCisgKiBMaXN0IG9mIHBvcnRzICh1cCB0byBJUF9WU19BUFBfTUFYX1BPUlRTKSB0byBiZSBoYW5kbGVkIGJ5IGhlbHBlcgorICogRmlyc3QgcG9ydCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgcG9ydC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW0lQX1ZTX0FQUF9NQVhfUE9SVFNdID0gezIxLCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJQb3J0cyB0byBtb25pdG9yIGZvciBGVFAgY29udHJvbCBjb21tYW5kcyIpOworCisKKy8qCUR1bW15IHZhcmlhYmxlICovCitzdGF0aWMgaW50IGlwX3ZzX2Z0cF9wYXN2OworCisKK3N0YXRpYyBpbnQKK2lwX3ZzX2Z0cF9pbml0X2Nvbm4oc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfZnRwX2RvbmVfY29ubihzdHJ1Y3QgaXBfdnNfYXBwICphcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogR2V0IDxhZGRyLHBvcnQ+IGZyb20gdGhlIHN0cmluZyAieHh4Lnh4eC54eHgueHh4LHBwcCxwcHAiLCBzdGFydGVkCisgKiB3aXRoIHRoZSAicGF0dGVybiIgYW5kIHRlcm1pbmF0ZWQgd2l0aCB0aGUgInRlcm0iIGNoYXJhY3Rlci4KKyAqIDxhZGRyLHBvcnQ+IGlzIGluIG5ldHdvcmsgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfZnRwX2dldF9hZGRycG9ydChjaGFyICpkYXRhLCBjaGFyICpkYXRhX2xpbWl0LAorCQkJCSAgY29uc3QgY2hhciAqcGF0dGVybiwgc2l6ZV90IHBsZW4sIGNoYXIgdGVybSwKKwkJCQkgIF9fYmUzMiAqYWRkciwgX19iZTE2ICpwb3J0LAorCQkJCSAgY2hhciAqKnN0YXJ0LCBjaGFyICoqZW5kKQoreworCXVuc2lnbmVkIGNoYXIgcFs2XTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoZGF0YV9saW1pdCAtIGRhdGEgPCBwbGVuKSB7CisJCS8qIGNoZWNrIGlmIHRoZXJlIGlzIHBhcnRpYWwgbWF0Y2ggKi8KKwkJaWYgKHN0cm5pY21wKGRhdGEsIHBhdHRlcm4sIGRhdGFfbGltaXQgLSBkYXRhKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmljbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gZGF0YSArIHBsZW47CisKKwlmb3IgKGRhdGEgPSAqc3RhcnQ7ICpkYXRhICE9IHRlcm07IGRhdGErKykgeworCQlpZiAoZGF0YSA9PSBkYXRhX2xpbWl0KQorCQkJcmV0dXJuIC0xOworCX0KKwkqZW5kID0gZGF0YTsKKworCW1lbXNldChwLCAwLCBzaXplb2YocCkpOworCWZvciAoZGF0YSA9ICpzdGFydDsgZGF0YSAhPSAqZW5kOyBkYXRhKyspIHsKKwkJaWYgKCpkYXRhID49ICcwJyAmJiAqZGF0YSA8PSAnOScpIHsKKwkJCXBbaV0gPSBwW2ldKjEwICsgKmRhdGEgLSAnMCc7CisJCX0gZWxzZSBpZiAoKmRhdGEgPT0gJywnICYmIGkgPCA1KSB7CisJCQlpKys7CisJCX0gZWxzZSB7CisJCQkvKiB1bmV4cGVjdGVkIGNoYXJhY3RlciAqLworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGkgIT0gNSkKKwkJcmV0dXJuIC0xOworCisJKmFkZHIgPSBnZXRfdW5hbGlnbmVkKChfX2JlMzIgKilwKTsKKwkqcG9ydCA9IGdldF91bmFsaWduZWQoKF9fYmUxNiAqKShwICsgNCkpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBMb29rIGF0IG91dGdvaW5nIGZ0cCBwYWNrZXRzIHRvIGNhdGNoIHRoZSByZXNwb25zZSB0byBhIFBBU1YgY29tbWFuZAorICogZnJvbSB0aGUgc2VydmVyIChpbnNpZGUtdG8tb3V0c2lkZSkuCisgKiBXaGVuIHdlIHNlZSBvbmUsIHdlIGJ1aWxkIGEgY29ubmVjdGlvbiBlbnRyeSB3aXRoIHRoZSBjbGllbnQgYWRkcmVzcywKKyAqIGNsaWVudCBwb3J0IDAgKHVua25vd24gYXQgdGhlIG1vbWVudCksIHRoZSBzZXJ2ZXIgYWRkcmVzcyBhbmQgdGhlCisgKiBzZXJ2ZXIgcG9ydC4gIE1hcmsgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBlbnRyeSBhcyBhIGNvbnRyb2wgY2hhbm5lbAorICogb2YgdGhlIG5ldyBlbnRyeS4gQWxsIHRoaXMgd29yayBpcyBqdXN0IHRvIG1ha2UgdGhlIGRhdGEgY29ubmVjdGlvbgorICogY2FuIGJlIHNjaGVkdWxlZCB0byB0aGUgcmlnaHQgc2VydmVyIGxhdGVyLgorICoKKyAqIFRoZSBvdXRnb2luZyBwYWNrZXQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCisgKiAgICIyMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICh4eHgseHh4LHh4eCx4eHgscHBwLHBwcCkiLgorICogeHh4LHh4eCx4eHgseHh4IGlzIHRoZSBzZXJ2ZXIgYWRkcmVzcywgcHBwLHBwcCBpcyB0aGUgc2VydmVyIHBvcnQgbnVtYmVyLgorICovCitzdGF0aWMgaW50IGlwX3ZzX2Z0cF9vdXQoc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICpkaWZmKQoreworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRoOworCWNoYXIgKmRhdGEsICpkYXRhX2xpbWl0OworCWNoYXIgKnN0YXJ0LCAqZW5kOworCXVuaW9uIG5mX2luZXRfYWRkciBmcm9tOworCV9fYmUxNiBwb3J0OworCXN0cnVjdCBpcF92c19jb25uICpuX2NwOworCWNoYXIgYnVmWzI0XTsJCS8qIHh4eC54eHgueHh4Lnh4eCxwcHAscHBwXDAwMCAqLworCXVuc2lnbmVkIGJ1Zl9sZW47CisJaW50IHJldDsKKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJLyogVGhpcyBhcHBsaWNhdGlvbiBoZWxwZXIgZG9lc24ndCB3b3JrIHdpdGggSVB2NiB5ZXQsCisJICogc28gdHVybiB0aGlzIGludG8gYSBuby1vcCBmb3IgSVB2NiBwYWNrZXRzCisJICovCisJaWYgKGNwLT5hZiA9PSBBRl9JTkVUNikKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCSpkaWZmID0gMDsKKworCS8qIE9ubHkgdXNlZnVsIGZvciBlc3RhYmxpc2hlZCBzZXNzaW9ucyAqLworCWlmIChjcC0+c3RhdGUgIT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpCisJCXJldHVybiAxOworCisJLyogTGluZWFyIHBhY2tldHMgYXJlIG11Y2ggZWFzaWVyIHRvIGRlYWwgd2l0aC4gKi8KKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgc2tiLT5sZW4pKQorCQlyZXR1cm4gMDsKKworCWlmIChjcC0+YXBwX2RhdGEgPT0gJmlwX3ZzX2Z0cF9wYXN2KSB7CisJCWlwaCA9IGlwX2hkcihza2IpOworCQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopJigoKGNoYXIgKilpcGgpW2lwaC0+aWhsKjRdKTsKKwkJZGF0YSA9IChjaGFyICopdGggKyAodGgtPmRvZmYgPDwgMik7CisJCWRhdGFfbGltaXQgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CisKKwkJaWYgKGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoZGF0YSwgZGF0YV9saW1pdCwKKwkJCQkJICAgU0VSVkVSX1NUUklORywKKwkJCQkJICAgc2l6ZW9mKFNFUlZFUl9TVFJJTkcpLTEsICcpJywKKwkJCQkJICAgJmZyb20uaXAsICZwb3J0LAorCQkJCQkgICAmc3RhcnQsICZlbmQpICE9IDEpCisJCQlyZXR1cm4gMTsKKworCQlJUF9WU19EQkcoNywgIlBBU1YgcmVzcG9uc2UgKCV1LiV1LiV1LiV1OiVkKSAtPiAiCisJCQkgICIldS4ldS4ldS4ldTolZCBkZXRlY3RlZFxuIiwKKwkJCSAgTklQUVVBRChmcm9tLmlwKSwgbnRvaHMocG9ydCksCisJCQkgIE5JUFFVQUQoY3AtPmNhZGRyLmlwKSwgMCk7CisKKwkJLyoKKwkJICogTm93IHVwZGF0ZSBvciBjcmVhdGUgYW4gY29ubmVjdGlvbiBlbnRyeSBmb3IgaXQKKwkJICovCisJCW5fY3AgPSBpcF92c19jb25uX291dF9nZXQoQUZfSU5FVCwgaXBoLT5wcm90b2NvbCwgJmZyb20sIHBvcnQsCisJCQkJCSAgJmNwLT5jYWRkciwgMCk7CisJCWlmICghbl9jcCkgeworCQkJbl9jcCA9IGlwX3ZzX2Nvbm5fbmV3KEFGX0lORVQsIElQUFJPVE9fVENQLAorCQkJCQkgICAgICAmY3AtPmNhZGRyLCAwLAorCQkJCQkgICAgICAmY3AtPnZhZGRyLCBwb3J0LAorCQkJCQkgICAgICAmZnJvbSwgcG9ydCwKKwkJCQkJICAgICAgSVBfVlNfQ09OTl9GX05PX0NQT1JULAorCQkJCQkgICAgICBjcC0+ZGVzdCk7CisJCQlpZiAoIW5fY3ApCisJCQkJcmV0dXJuIDA7CisKKwkJCS8qIGFkZCBpdHMgY29udHJvbGxlciAqLworCQkJaXBfdnNfY29udHJvbF9hZGQobl9jcCwgY3ApOworCQl9CisKKwkJLyoKKwkJICogUmVwbGFjZSB0aGUgb2xkIHBhc3NpdmUgYWRkcmVzcyB3aXRoIHRoZSBuZXcgb25lCisJCSAqLworCQlmcm9tLmlwID0gbl9jcC0+dmFkZHIuaXA7CisJCXBvcnQgPSBuX2NwLT52cG9ydDsKKwkJc3ByaW50ZihidWYsICIlZCwlZCwlZCwlZCwlZCwlZCIsIE5JUFFVQUQoZnJvbS5pcCksCisJCQkobnRvaHMocG9ydCk+PjgpJjI1NSwgbnRvaHMocG9ydCkmMjU1KTsKKwkJYnVmX2xlbiA9IHN0cmxlbihidWYpOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSByZXF1aXJlZCBkZWx0YS1vZmZzZXQgdG8ga2VlcCBUQ1AgaGFwcHkKKwkJICovCisJCSpkaWZmID0gYnVmX2xlbiAtIChlbmQtc3RhcnQpOworCisJCWlmICgqZGlmZiA9PSAwKSB7CisJCQkvKiBzaW1wbHkgcmVwbGFjZSBpdCB3aXRoIG5ldyBwYXNzaXZlIGFkZHJlc3MgKi8KKwkJCW1lbWNweShzdGFydCwgYnVmLCBidWZfbGVuKTsKKwkJCXJldCA9IDE7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAhaXBfdnNfc2tiX3JlcGxhY2Uoc2tiLCBHRlBfQVRPTUlDLCBzdGFydCwKKwkJCQkJICBlbmQtc3RhcnQsIGJ1ZiwgYnVmX2xlbik7CisJCX0KKworCQljcC0+YXBwX2RhdGEgPSBOVUxMOworCQlpcF92c190Y3BfY29ubl9saXN0ZW4obl9jcCk7CisJCWlwX3ZzX2Nvbm5fcHV0KG5fY3ApOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMTsKK30KKworCisvKgorICogTG9vayBhdCBpbmNvbWluZyBmdHAgcGFja2V0cyB0byBjYXRjaCB0aGUgUEFTVi9QT1JUIGNvbW1hbmQKKyAqIChvdXRzaWRlLXRvLWluc2lkZSkuCisgKgorICogVGhlIGluY29taW5nIHBhY2tldCBoYXZpbmcgdGhlIFBPUlQgY29tbWFuZCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UKKyAqICAgICAgIlBPUlQgeHh4LHh4eCx4eHgseHh4LHBwcCxwcHBcbiIuCisgKiB4eHgseHh4LHh4eCx4eHggaXMgdGhlIGNsaWVudCBhZGRyZXNzLCBwcHAscHBwIGlzIHRoZSBjbGllbnQgcG9ydCBudW1iZXIuCisgKiBJbiB0aGlzIGNhc2UsIHdlIGNyZWF0ZSBhIGNvbm5lY3Rpb24gZW50cnkgdXNpbmcgdGhlIGNsaWVudCBhZGRyZXNzIGFuZAorICogcG9ydCwgc28gdGhhdCB0aGUgYWN0aXZlIGZ0cCBkYXRhIGNvbm5lY3Rpb24gZnJvbSB0aGUgc2VydmVyIGNhbiByZWFjaAorICogdGhlIGNsaWVudC4KKyAqLworc3RhdGljIGludCBpcF92c19mdHBfaW4oc3RydWN0IGlwX3ZzX2FwcCAqYXBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmRpZmYpCit7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IHRjcGhkciAqdGg7CisJY2hhciAqZGF0YSwgKmRhdGFfc3RhcnQsICpkYXRhX2xpbWl0OworCWNoYXIgKnN0YXJ0LCAqZW5kOworCXVuaW9uIG5mX2luZXRfYWRkciB0bzsKKwlfX2JlMTYgcG9ydDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqbl9jcDsKKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJLyogVGhpcyBhcHBsaWNhdGlvbiBoZWxwZXIgZG9lc24ndCB3b3JrIHdpdGggSVB2NiB5ZXQsCisJICogc28gdHVybiB0aGlzIGludG8gYSBuby1vcCBmb3IgSVB2NiBwYWNrZXRzCisJICovCisJaWYgKGNwLT5hZiA9PSBBRl9JTkVUNikKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCS8qIG5vIGRpZmYgcmVxdWlyZWQgZm9yIGluY29taW5nIHBhY2tldHMgKi8KKwkqZGlmZiA9IDA7CisKKwkvKiBPbmx5IHVzZWZ1bCBmb3IgZXN0YWJsaXNoZWQgc2Vzc2lvbnMgKi8KKwlpZiAoY3AtPnN0YXRlICE9IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKQorCQlyZXR1cm4gMTsKKworCS8qIExpbmVhciBwYWNrZXRzIGFyZSBtdWNoIGVhc2llciB0byBkZWFsIHdpdGguICovCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHNrYi0+bGVuKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERldGVjdGluZyB3aGV0aGVyIGl0IGlzIHBhc3NpdmUKKwkgKi8KKwlpcGggPSBpcF9oZHIoc2tiKTsKKwl0aCA9IChzdHJ1Y3QgdGNwaGRyICopJigoKGNoYXIgKilpcGgpW2lwaC0+aWhsKjRdKTsKKworCS8qIFNpbmNlIHRoZXJlIG1heSBiZSBPUFRJT05TIGluIHRoZSBUQ1AgcGFja2V0IGFuZCB0aGUgSExFTiBpcworCSAgIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBpbiAzMi1iaXQgbXVsdGlwbGVzLCBpdCBpcyBhY2N1cmF0ZQorCSAgIHRvIGNhbGN1bGF0ZSBkYXRhIGFkZHJlc3MgYnkgdGgrSExFTio0ICovCisJZGF0YSA9IGRhdGFfc3RhcnQgPSAoY2hhciAqKXRoICsgKHRoLT5kb2ZmIDw8IDIpOworCWRhdGFfbGltaXQgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CisKKwl3aGlsZSAoZGF0YSA8PSBkYXRhX2xpbWl0IC0gNikgeworCQlpZiAoc3RybmljbXAoZGF0YSwgIlBBU1ZcclxuIiwgNikgPT0gMCkgeworCQkJLyogUGFzc2l2ZSBtb2RlIG9uICovCisJCQlJUF9WU19EQkcoNywgImdvdCBQQVNWIGF0ICV0ZCBvZiAldGRcbiIsCisJCQkJICBkYXRhIC0gZGF0YV9zdGFydCwKKwkJCQkgIGRhdGFfbGltaXQgLSBkYXRhX3N0YXJ0KTsKKwkJCWNwLT5hcHBfZGF0YSA9ICZpcF92c19mdHBfcGFzdjsKKwkJCXJldHVybiAxOworCQl9CisJCWRhdGErKzsKKwl9CisKKwkvKgorCSAqIFRvIHN1cHBvcnQgdmlydHVhbCBGVFAgc2VydmVyLCB0aGUgc2NlbmVyaW8gaXMgYXMgZm9sbG93czoKKwkgKiAgICAgICBGVFAgY2xpZW50IC0tLS0+IExvYWQgQmFsYW5jZXIgLS0tLT4gRlRQIHNlcnZlcgorCSAqIEZpcnN0IGRldGVjdCB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIGFwcGxpY2F0aW9uIGRhdGEsCisJICogdGhlbiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBlbnRyeSBmb3IgdGhlIGNvbWluZyBkYXRhCisJICogY29ubmVjdGlvbi4KKwkgKi8KKwlpZiAoaXBfdnNfZnRwX2dldF9hZGRycG9ydChkYXRhX3N0YXJ0LCBkYXRhX2xpbWl0LAorCQkJCSAgIENMSUVOVF9TVFJJTkcsIHNpemVvZihDTElFTlRfU1RSSU5HKS0xLAorCQkJCSAgICdccicsICZ0by5pcCwgJnBvcnQsCisJCQkJICAgJnN0YXJ0LCAmZW5kKSAhPSAxKQorCQlyZXR1cm4gMTsKKworCUlQX1ZTX0RCRyg3LCAiUE9SVCAldS4ldS4ldS4ldTolZCBkZXRlY3RlZFxuIiwKKwkJICBOSVBRVUFEKHRvLmlwKSwgbnRvaHMocG9ydCkpOworCisJLyogUGFzc2l2ZSBtb2RlIG9mZiAqLworCWNwLT5hcHBfZGF0YSA9IE5VTEw7CisKKwkvKgorCSAqIE5vdyB1cGRhdGUgb3IgY3JlYXRlIGEgY29ubmVjdGlvbiBlbnRyeSBmb3IgaXQKKwkgKi8KKwlJUF9WU19EQkcoNywgInByb3RvY29sICVzICV1LiV1LiV1LiV1OiVkICV1LiV1LiV1LiV1OiVkXG4iLAorCQkgIGlwX3ZzX3Byb3RvX25hbWUoaXBoLT5wcm90b2NvbCksCisJCSAgTklQUVVBRCh0by5pcCksIG50b2hzKHBvcnQpLCBOSVBRVUFEKGNwLT52YWRkci5pcCksIDApOworCisJbl9jcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KEFGX0lORVQsIGlwaC0+cHJvdG9jb2wsCisJCQkJICZ0bywgcG9ydCwKKwkJCQkgJmNwLT52YWRkciwgaHRvbnMobnRvaHMoY3AtPnZwb3J0KS0xKSk7CisJaWYgKCFuX2NwKSB7CisJCW5fY3AgPSBpcF92c19jb25uX25ldyhBRl9JTkVULCBJUFBST1RPX1RDUCwKKwkJCQkgICAgICAmdG8sIHBvcnQsCisJCQkJICAgICAgJmNwLT52YWRkciwgaHRvbnMobnRvaHMoY3AtPnZwb3J0KS0xKSwKKwkJCQkgICAgICAmY3AtPmRhZGRyLCBodG9ucyhudG9ocyhjcC0+ZHBvcnQpLTEpLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgY3AtPmRlc3QpOworCQlpZiAoIW5fY3ApCisJCQlyZXR1cm4gMDsKKworCQkvKiBhZGQgaXRzIGNvbnRyb2xsZXIgKi8KKwkJaXBfdnNfY29udHJvbF9hZGQobl9jcCwgY3ApOworCX0KKworCS8qCisJICoJTW92ZSB0dW5uZWwgdG8gbGlzdGVuIHN0YXRlCisJICovCisJaXBfdnNfdGNwX2Nvbm5fbGlzdGVuKG5fY3ApOworCWlwX3ZzX2Nvbm5fcHV0KG5fY3ApOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19hcHAgaXBfdnNfZnRwID0geworCS5uYW1lID0JCSJmdHAiLAorCS50eXBlID0JCUlQX1ZTX0FQUF9UWVBFX0ZUUCwKKwkucHJvdG9jb2wgPQlJUFBST1RPX1RDUCwKKwkubW9kdWxlID0JVEhJU19NT0RVTEUsCisJLmluY3NfbGlzdCA9CUxJU1RfSEVBRF9JTklUKGlwX3ZzX2Z0cC5pbmNzX2xpc3QpLAorCS5pbml0X2Nvbm4gPQlpcF92c19mdHBfaW5pdF9jb25uLAorCS5kb25lX2Nvbm4gPQlpcF92c19mdHBfZG9uZV9jb25uLAorCS5iaW5kX2Nvbm4gPQlOVUxMLAorCS51bmJpbmRfY29ubiA9CU5VTEwsCisJLnBrdF9vdXQgPQlpcF92c19mdHBfb3V0LAorCS5wa3RfaW4gPQlpcF92c19mdHBfaW4sCit9OworCisKKy8qCisgKglpcF92c19mdHAgaW5pdGlhbGl6YXRpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgaXBfdnNfZnRwX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBpcF92c19hcHAgKmFwcCA9ICZpcF92c19mdHA7CisKKwlyZXQgPSByZWdpc3Rlcl9pcF92c19hcHAoYXBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpPTA7IGk8SVBfVlNfQVBQX01BWF9QT1JUUzsgaSsrKSB7CisJCWlmICghcG9ydHNbaV0pCisJCQljb250aW51ZTsKKwkJcmV0ID0gcmVnaXN0ZXJfaXBfdnNfYXBwX2luYyhhcHAsIGFwcC0+cHJvdG9jb2wsIHBvcnRzW2ldKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlJUF9WU19JTkZPKCIlczogbG9hZGVkIHN1cHBvcnQgb24gcG9ydFslZF0gPSAlZFxuIiwKKwkJCSAgIGFwcC0+bmFtZSwgaSwgcG9ydHNbaV0pOworCX0KKworCWlmIChyZXQpCisJCXVucmVnaXN0ZXJfaXBfdnNfYXBwKGFwcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKglpcF92c19mdHAgZmluaXNoLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfZnRwX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2lwX3ZzX2FwcCgmaXBfdnNfZnRwKTsKK30KKworCittb2R1bGVfaW5pdChpcF92c19mdHBfaW5pdCk7Cittb2R1bGVfZXhpdChpcF92c19mdHBfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsYy5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNlZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYwpAQCAtMCwwICsxLDU1NSBAQAorLyoKKyAqIElQVlM6ICAgICAgICBMb2NhbGl0eS1CYXNlZCBMZWFzdC1Db25uZWN0aW9uIHNjaGVkdWxpbmcgbW9kdWxlCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgTWFydGluIEhhbWlsdG9uICAgICAgICAgOiAgICBmaXhlZCB0aGUgdGVycmlibGUgbG9ja2luZyBidWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvY2sodGJsLT5sb2NrKSA9PT4gKmxvY2soJnRibC0+bG9jaykKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICA6ICAgIGZpeGVkIHRoZSB1bmluaXRpbGl6ZWQgdGJsLT5sb2NrIGJ1ZworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgIDogICAgYWRkZWQgZG9pbmcgZnVsbCBleHBpcmF0aW9uIGNoZWNrIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCBzdGFsZSBlbnRyaWVzIG9mIDI0KyBob3VycyB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gcGFydGlhbCBleHBpcmUgY2hlY2sgaW4gYSBoYWxmIGhvdXIKKyAqICAgICBKdWxpYW4gQW5hc3Rhc292ICAgICAgICA6ICAgIHJlcGxhY2VkIGRlbF90aW1lciBjYWxsIHdpdGggZGVsX3RpbWVyX3N5bmMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgcG9zc2libGUgcmFjZSBiZXR3ZWVuIHRpbWVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBhbmQgZGVsX3RpbWVyIHRocmVhZCBpbiBTTVAKKyAqCisgKi8KKworLyoKKyAqIFRoZSBsYmxjIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzIChwc2V1ZG8gY29kZSk6CisgKgorICogICAgICAgaWYgY2FjaGVub2RlW2Rlc3RfaXBdIGlzIG51bGwgdGhlbgorICogICAgICAgICAgICAgICBuLCBjYWNoZW5vZGVbZGVzdF9pcF0gPC0ge3dlaWdodGVkIGxlYXN0LWNvbm4gbm9kZX07CisgKiAgICAgICBlbHNlCisgKiAgICAgICAgICAgICAgIG4gPC0gY2FjaGVub2RlW2Rlc3RfaXBdOworICogICAgICAgICAgICAgICBpZiAobiBpcyBkZWFkKSBPUgorICogICAgICAgICAgICAgICAgICAobi5jb25ucz5uLndlaWdodCBBTkQKKyAqICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgbm9kZSBtIHdpdGggbS5jb25uczxtLndlaWdodC8yKSB0aGVuCisgKiAgICAgICAgICAgICAgICAgbiwgY2FjaGVub2RlW2Rlc3RfaXBdIDwtIHt3ZWlnaHRlZCBsZWFzdC1jb25uIG5vZGV9OworICoKKyAqICAgICAgIHJldHVybiBuOworICoKKyAqIFRoYW5rcyBtdXN0IGdvIHRvIFdlbnpodW8gWmhhbmcgZm9yIHRhbGtpbmcgV0NDUCB0byBtZSBhbmQgcHVzaGluZworICogbWUgdG8gd3JpdGUgdGhpcyBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisvKiBmb3Igc3lzY3RsICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiAgICBJdCBpcyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHN0YWxlIElQVlMgbGJsYyBlbnRyaWVzLAorICogICAgd2hlbiB0aGUgdGFibGUgaXMgZnVsbC4KKyAqLworI2RlZmluZSBDSEVDS19FWFBJUkVfSU5URVJWQUwgICAoNjAqSFopCisjZGVmaW5lIEVOVFJZX1RJTUVPVVQgICAgICAgICAgICg2KjYwKkhaKQorCisvKgorICogICAgSXQgaXMgZm9yIGZ1bGwgZXhwaXJhdGlvbiBjaGVjay4KKyAqICAgIFdoZW4gdGhlcmUgaXMgbm8gcGFydGlhbCBleHBpcmF0aW9uIGNoZWNrIChnYXJiYWdlIGNvbGxlY3Rpb24pCisgKiAgICBpbiBhIGhhbGYgaG91ciwgZG8gYSBmdWxsIGV4cGlyYXRpb24gY2hlY2sgdG8gY29sbGVjdCBzdGFsZQorICogICAgZW50cmllcyB0aGF0IGhhdmVuJ3QgYmVlbiB0b3VjaGVkIGZvciBhIGRheS4KKyAqLworI2RlZmluZSBDT1VOVF9GT1JfRlVMTF9FWFBJUkFUSU9OICAgMzAKK3N0YXRpYyBpbnQgc3lzY3RsX2lwX3ZzX2xibGNfZXhwaXJhdGlvbiA9IDI0KjYwKjYwKkhaOworCisKKy8qCisgKiAgICAgZm9yIElQVlMgbGJsYyBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMKKyNkZWZpbmUgQ09ORklHX0lQX1ZTX0xCTENfVEFCX0JJVFMgICAgICAxMAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX0JJVFMgICAgIENPTkZJR19JUF9WU19MQkxDX1RBQl9CSVRTCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX1NJWkUgICAgICgxIDw8IElQX1ZTX0xCTENfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX0xCTENfVEFCX01BU0sgICAgIChJUF9WU19MQkxDX1RBQl9TSVpFIC0gMSkKKworCisvKgorICogICAgICBJUFZTIGxibGMgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIKKyAqLworc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIGxpc3Q7CisJX19iZTMyICAgICAgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGxhc3R1c2U7ICAgICAgICAvKiBsYXN0IHVzZWQgdGltZSAqLworfTsKKworCisvKgorICogICAgICBJUFZTIGxibGMgaGFzaCB0YWJsZQorICovCitzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgYnVja2V0W0lQX1ZTX0xCTENfVEFCX1NJWkVdOyAgLyogaGFzaCBidWNrZXQgKi8KKwlhdG9taWNfdCAgICAgICAgICAgICAgICBlbnRyaWVzOyAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZTsgICAgICAgLyogbWF4aW11bSBzaXplIG9mIGVudHJpZXMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBwZXJpb2RpY190aW1lcjsgLyogY29sbGVjdCBzdGFsZSBlbnRyaWVzICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgcm92ZXI7ICAgICAgICAgIC8qIHJvdmVyIGZvciBleHBpcmUgY2hlY2sgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudGVyOyAgICAgICAgLyogY291bnRlciBmb3Igbm8gZXhwaXJlICovCit9OworCisKKy8qCisgKiAgICAgIElQVlMgTEJMQyBzeXNjdGwgdGFibGUKKyAqLworCitzdGF0aWMgY3RsX3RhYmxlIHZzX3ZhcnNfdGFibGVbXSA9IHsKKwl7CisJCS5wcm9jbmFtZQk9ICJsYmxjX2V4cGlyYXRpb24iLAorCQkuZGF0YQkJPSAmc3lzY3RsX2lwX3ZzX2xibGNfZXhwaXJhdGlvbiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogc3lzY3RsX2hlYWRlcjsKKworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2xibGNfZnJlZShzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4pCit7CisJbGlzdF9kZWwoJmVuLT5saXN0KTsKKwkvKgorCSAqIFdlIGRvbid0IGtmcmVlIGRlc3QgYmVjYXVzZSBpdCBpcyByZWZlcmVkIGVpdGhlciBieSBpdHMgc2VydmljZQorCSAqIG9yIHRoZSB0cmFzaCBkZXN0IGxpc3QuCisJICovCisJYXRvbWljX2RlYygmZW4tPmRlc3QtPnJlZmNudCk7CisJa2ZyZWUoZW4pOworfQorCisKKy8qCisgKglSZXR1cm5zIGhhc2ggdmFsdWUgZm9yIElQVlMgTEJMQyBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGlwX3ZzX2xibGNfaGFzaGtleShfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gKG50b2hsKGFkZHIpKjI2NTQ0MzU3NjFVTCkgJiBJUF9WU19MQkxDX1RBQl9NQVNLOworfQorCisKKy8qCisgKglIYXNoIGFuIGVudHJ5IGluIHRoZSBpcF92c19sYmxjX3RhYmxlLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitpcF92c19sYmxjX2hhc2goc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCwgc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuKQoreworCXVuc2lnbmVkIGhhc2ggPSBpcF92c19sYmxjX2hhc2hrZXkoZW4tPmFkZHIpOworCisJbGlzdF9hZGQoJmVuLT5saXN0LCAmdGJsLT5idWNrZXRbaGFzaF0pOworCWF0b21pY19pbmMoJnRibC0+ZW50cmllcyk7Cit9CisKKworLyoKKyAqICBHZXQgaXBfdnNfbGJsY19lbnRyeSBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4gQ2FsbGVkIHVuZGVyIHJlYWQKKyAqICBsb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKgoraXBfdnNfbGJsY19nZXQoc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCwgX19iZTMyIGFkZHIpCit7CisJdW5zaWduZWQgaGFzaCA9IGlwX3ZzX2xibGNfaGFzaGtleShhZGRyKTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuLCAmdGJsLT5idWNrZXRbaGFzaF0sIGxpc3QpCisJCWlmIChlbi0+YWRkciA9PSBhZGRyKQorCQkJcmV0dXJuIGVuOworCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIENyZWF0ZSBvciB1cGRhdGUgYW4gaXBfdnNfbGJsY19lbnRyeSwgd2hpY2ggaXMgYSBtYXBwaW5nIG9mIGEgZGVzdGluYXRpb24gSVAKKyAqIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuIENhbGxlZCB1bmRlciB3cml0ZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICoKK2lwX3ZzX2xibGNfbmV3KHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwsIF9fYmUzMiBkYWRkciwKKwkgICAgICAgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuOworCisJZW4gPSBpcF92c19sYmxjX2dldCh0YmwsIGRhZGRyKTsKKwlpZiAoIWVuKSB7CisJCWVuID0ga21hbGxvYyhzaXplb2YoKmVuKSwgR0ZQX0FUT01JQyk7CisJCWlmICghZW4pIHsKKwkJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY19uZXcoKTogbm8gbWVtb3J5XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJZW4tPmFkZHIgPSBkYWRkcjsKKwkJZW4tPmxhc3R1c2UgPSBqaWZmaWVzOworCisJCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7CisJCWVuLT5kZXN0ID0gZGVzdDsKKworCQlpcF92c19sYmxjX2hhc2godGJsLCBlbik7CisJfSBlbHNlIGlmIChlbi0+ZGVzdCAhPSBkZXN0KSB7CisJCWF0b21pY19kZWMoJmVuLT5kZXN0LT5yZWZjbnQpOworCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCQllbi0+ZGVzdCA9IGRlc3Q7CisJfQorCisJcmV0dXJuIGVuOworfQorCisKKy8qCisgKiAgICAgIEZsdXNoIGFsbCB0aGUgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBpcF92c19sYmxjX2ZsdXNoKHN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0YmwpCit7CisJc3RydWN0IGlwX3ZzX2xibGNfZW50cnkgKmVuLCAqbnh0OworCWludCBpOworCisJZm9yIChpPTA7IGk8SVBfVlNfTEJMQ19UQUJfU0laRTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbiwgbnh0LCAmdGJsLT5idWNrZXRbaV0sIGxpc3QpIHsKKwkJCWlwX3ZzX2xibGNfZnJlZShlbik7CisJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF92c19sYmxjX2Z1bGxfY2hlY2soc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCXN0cnVjdCBpcF92c19sYmxjX2VudHJ5ICplbiwgKm54dDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGksIGo7CisKKwlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENfVEFCX1NJWkU7IGkrKykgeworCQlqID0gKGogKyAxKSAmIElQX1ZTX0xCTENfVEFCX01BU0s7CisKKwkJd3JpdGVfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtqXSwgbGlzdCkgeworCQkJaWYgKHRpbWVfYmVmb3JlKG5vdywKKwkJCQkJZW4tPmxhc3R1c2UgKyBzeXNjdGxfaXBfdnNfbGJsY19leHBpcmF0aW9uKSkKKwkJCQljb250aW51ZTsKKworCQkJaXBfdnNfbGJsY19mcmVlKGVuKTsKKwkJCWF0b21pY19kZWMoJnRibC0+ZW50cmllcyk7CisJCX0KKwkJd3JpdGVfdW5sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCX0KKwl0YmwtPnJvdmVyID0gajsKK30KKworCisvKgorICogICAgICBQZXJpb2RpY2FsIHRpbWVyIGhhbmRsZXIgZm9yIElQVlMgbGJsYyB0YWJsZQorICogICAgICBJdCBpcyB1c2VkIHRvIGNvbGxlY3Qgc3RhbGUgZW50cmllcyB3aGVuIHRoZSBudW1iZXIgb2YgZW50cmllcworICogICAgICBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHRhYmxlLgorICoKKyAqICAgICAgRml4bWU6IHdlIHByb2JhYmx5IG5lZWQgbW9yZSBjb21wbGljYXRlZCBhbGdvcml0aG0gdG8gY29sbGVjdAorICogICAgICAgICAgICAgZW50cmllcyB0aGF0IGhhdmUgbm90IGJlZW4gdXNlZCBmb3IgYSBsb25nIHRpbWUgZXZlbgorICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBlbnRyaWVzIGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUKKyAqICAgICAgICAgICAgIG9mIHRoZSB0YWJsZS4KKyAqICAgICAgVGhlIGZ1bGwgZXhwaXJhdGlvbiBjaGVjayBpcyBmb3IgdGhpcyBwdXJwb3NlIG5vdy4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfbGJsY19jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMgPSAoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgZ29hbDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW4sICpueHQ7CisKKwlpZiAoKHRibC0+Y291bnRlciAlIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04pID09IDApIHsKKwkJLyogZG8gZnVsbCBleHBpcmF0aW9uIGNoZWNrICovCisJCWlwX3ZzX2xibGNfZnVsbF9jaGVjayhzdmMpOworCQl0YmwtPmNvdW50ZXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykgPD0gdGJsLT5tYXhfc2l6ZSkgeworCQl0YmwtPmNvdW50ZXIrKzsKKwkJZ290byBvdXQ7CisJfQorCisJZ29hbCA9IChhdG9taWNfcmVhZCgmdGJsLT5lbnRyaWVzKSAtIHRibC0+bWF4X3NpemUpKjQvMzsKKwlpZiAoZ29hbCA+IHRibC0+bWF4X3NpemUvMikKKwkJZ29hbCA9IHRibC0+bWF4X3NpemUvMjsKKworCWZvciAoaT0wLCBqPXRibC0+cm92ZXI7IGk8SVBfVlNfTEJMQ19UQUJfU0laRTsgaSsrKSB7CisJCWogPSAoaiArIDEpICYgSVBfVlNfTEJMQ19UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9iZWZvcmUobm93LCBlbi0+bGFzdHVzZSArIEVOVFJZX1RJTUVPVVQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpcF92c19sYmxjX2ZyZWUoZW4pOworCQkJYXRvbWljX2RlYygmdGJsLT5lbnRyaWVzKTsKKwkJCWdvYWwtLTsKKwkJfQorCQl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJCWlmIChnb2FsIDw9IDApCisJCQlicmVhazsKKwl9CisJdGJsLT5yb3ZlciA9IGo7CisKKyAgb3V0OgorCW1vZF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lciwgamlmZmllcytDSEVDS19FWFBJUkVfSU5URVJWQUwpOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfbGJsY19pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19sYmxjX3RhYmxlICp0Ymw7CisKKwkvKgorCSAqICAgIEFsbG9jYXRlIHRoZSBpcF92c19sYmxjX3RhYmxlIGZvciB0aGlzIHNlcnZpY2UKKwkgKi8KKwl0YmwgPSBrbWFsbG9jKHNpemVvZigqdGJsKSwgR0ZQX0FUT01JQyk7CisJaWYgKHRibCA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY19pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOworCUlQX1ZTX0RCRyg2LCAiTEJMQyBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgorCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsIHNpemVvZigqdGJsKSk7CisKKwkvKgorCSAqICAgIEluaXRpYWxpemUgdGhlIGhhc2ggYnVja2V0cworCSAqLworCWZvciAoaT0wOyBpPElQX1ZTX0xCTENfVEFCX1NJWkU7IGkrKykgeworCQlJTklUX0xJU1RfSEVBRCgmdGJsLT5idWNrZXRbaV0pOworCX0KKwl0YmwtPm1heF9zaXplID0gSVBfVlNfTEJMQ19UQUJfU0laRSoxNjsKKwl0YmwtPnJvdmVyID0gMDsKKwl0YmwtPmNvdW50ZXIgPSAxOworCisJLyoKKwkgKiAgICBIb29rIHBlcmlvZGljIHRpbWVyIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24KKwkgKi8KKwlzZXR1cF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lciwgaXBfdnNfbGJsY19jaGVja19leHBpcmUsCisJCQkodW5zaWduZWQgbG9uZylzdmMpOworCW1vZF90aW1lcigmdGJsLT5wZXJpb2RpY190aW1lciwgamlmZmllcyArIENIRUNLX0VYUElSRV9JTlRFUlZBTCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX2xibGNfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfbGJsY190YWJsZSAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCisJLyogcmVtb3ZlIHBlcmlvZGljIHRpbWVyICovCisJZGVsX3RpbWVyX3N5bmMoJnRibC0+cGVyaW9kaWNfdGltZXIpOworCisJLyogZ290IHRvIGNsZWFuIHVwIHRhYmxlIGVudHJpZXMgaGVyZSAqLworCWlwX3ZzX2xibGNfZmx1c2godGJsKTsKKworCS8qIHJlbGVhc2UgdGhlIHRhYmxlIGl0c2VsZiAqLworCWtmcmVlKHRibCk7CisJSVBfVlNfREJHKDYsICJMQkxDIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCisJCSAgc2l6ZW9mKCp0YmwpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKgorX19pcF92c19sYmxjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIHN0cnVjdCBpcGhkciAqaXBoKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7CisJaW50IGxvaCwgZG9oOworCisJLyoKKwkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgZmlmdHkKKwkgKiB0aW1lcyBoaWdoZXIgdGhhbiB0aGF0IG9mIGluYWN0aXZlIGNvbm5lY3Rpb25zIGluIGF2ZXJhZ2UuIChUaGlzCisJICogZmlmdHkgdGltZXMgbWlnaHQgbm90IGJlIGFjY3VyYXRlLCB3ZSB3aWxsIGNoYW5nZSBpdCBsYXRlci4pIFdlCisJICogdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBlc3RpbWF0ZSB0aGUgb3ZlcmhlYWQ6CisJICogICAgICAgICAgICAgICAgZGVzdC0+YWN0aXZlY29ubnMqNTAgKyBkZXN0LT5pbmFjdGNvbm5zCisJICogYW5kIHRoZSBsb2FkOgorCSAqICAgICAgICAgICAgICAgIChkZXN0IG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAorCSAqCisJICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCisJICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKKwkgKiAgICAgICAgICAgICAgICBoMS93MSA+IGgyL3cyCisJICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCisJICoKKwkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55CisJICogbmV3IGNvbm5lY3Rpb24uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucykgKiA1MAorCQkJCSsgYXRvbWljX3JlYWQoJmxlYXN0LT5pbmFjdGNvbm5zKTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisKKwlJUF9WU19EQkcoNiwgIkxCTEM6IHNlcnZlciAlZC4lZC4lZC4lZDolZCAiCisJCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgTklQUVVBRChsZWFzdC0+YWRkci5pcCksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPnJlZmNudCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKKy8qCisgKiAgIElmIHRoaXMgZGVzdGluYXRpb24gc2VydmVyIGlzIG92ZXJsb2FkZWQgYW5kIHRoZXJlIGlzIGEgbGVzcyBsb2FkZWQKKyAqICAgc2VydmVyLCB0aGVuIHJldHVybiB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXNfb3ZlcmxvYWRlZChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSA+IGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKSB7CisJCXN0cnVjdCBpcF92c19kZXN0ICpkOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmZC0+YWN0aXZlY29ubnMpKjIKKwkJCSAgICA8IGF0b21pY19yZWFkKCZkLT53ZWlnaHQpKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgIExvY2FsaXR5LUJhc2VkICh3ZWlnaHRlZCkgTGVhc3QtQ29ubmVjdGlvbiBzY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19sYmxjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW47CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX2xibGNfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwkvKiBGaXJzdCBsb29rIGluIG91ciBjYWNoZSAqLworCXJlYWRfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwllbiA9IGlwX3ZzX2xibGNfZ2V0KHRibCwgaXBoLT5kYWRkcik7CisJaWYgKGVuKSB7CisJCS8qIFdlIG9ubHkgaG9sZCBhIHJlYWQgbG9jaywgYnV0IHRoaXMgaXMgYXRvbWljICovCisJCWVuLT5sYXN0dXNlID0gamlmZmllczsKKworCQkvKgorCQkgKiBJZiB0aGUgZGVzdGluYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgaS5lLiBpdCdzIGluIHRoZSB0cmFzaCwKKwkJICogd2UgbXVzdCBpZ25vcmUgaXQsIGFzIGl0IG1heSBiZSByZW1vdmVkIGZyb20gdW5kZXIgb3VyIGZlZXQsCisJCSAqIGlmIHNvbWVvbmUgZHJvcHMgb3VyIHJlZmVyZW5jZSBjb3VudC4gT3VyIGNhbGxlciBvbmx5IG1ha2VzCisJCSAqIHN1cmUgdGhhdCBkZXN0aW5hdGlvbnMsIHRoYXQgYXJlIG5vdCBpbiB0aGUgdHJhc2gsIGFyZSBub3QKKwkJICogbW92ZWQgdG8gdGhlIHRyYXNoLCB3aGlsZSB3ZSBhcmUgc2NoZWR1bGluZy4gQnV0IGFueW9uZSBjYW4KKwkJICogZnJlZSB1cCBlbnRyaWVzIGZyb20gdGhlIHRyYXNoIGF0IGFueSB0aW1lLgorCQkgKi8KKworCQlpZiAoZW4tPmRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkKKwkJCWRlc3QgPSBlbi0+ZGVzdDsKKwl9CisJcmVhZF91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisKKwkvKiBJZiB0aGUgZGVzdGluYXRpb24gaGFzIGEgd2VpZ2h0IGFuZCBpcyBub3Qgb3ZlcmxvYWRlZCwgdXNlIGl0ICovCisJaWYgKGRlc3QgJiYgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwICYmICFpc19vdmVybG9hZGVkKGRlc3QsIHN2YykpCisJCWdvdG8gb3V0OworCisJLyogTm8gY2FjaGUgZW50cnkgb3IgaXQgaXMgaW52YWxpZCwgdGltZSB0byBzY2hlZHVsZSAqLworCWRlc3QgPSBfX2lwX3ZzX2xibGNfc2NoZWR1bGUoc3ZjLCBpcGgpOworCWlmICghZGVzdCkgeworCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIElmIHdlIGZhaWwgdG8gY3JlYXRlIGEgY2FjaGUgZW50cnksIHdlJ2xsIGp1c3QgdXNlIHRoZSB2YWxpZCBkZXN0ICovCisJd3JpdGVfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlpcF92c19sYmxjX25ldyh0YmwsIGlwaC0+ZGFkZHIsIGRlc3QpOworCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKworb3V0OgorCUlQX1ZTX0RCRyg2LCAiTEJMQzogZGVzdGluYXRpb24gSVAgYWRkcmVzcyAldS4ldS4ldS4ldSAiCisJCSAgIi0tPiBzZXJ2ZXIgJXUuJXUuJXUuJXU6JWRcbiIsCisJCSAgTklQUVVBRChpcGgtPmRhZGRyKSwKKwkJICBOSVBRVUFEKGRlc3QtPmFkZHIuaXApLAorCQkgIG50b2hzKGRlc3QtPnBvcnQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgTEJMQyBTY2hlZHVsZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX2xibGNfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJImxibGMiLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkubl9saXN0ID0JCUxJU1RfSEVBRF9JTklUKGlwX3ZzX2xibGNfc2NoZWR1bGVyLm5fbGlzdCksCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkuc3VwcG9ydHNfaXB2NiA9CTAsCisjZW5kaWYKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX2xibGNfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c19sYmxjX2RvbmVfc3ZjLAorCS5zY2hlZHVsZSA9CQlpcF92c19sYmxjX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19sYmxjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF9wYXRocyhuZXRfdnNfY3RsX3BhdGgsIHZzX3ZhcnNfdGFibGUpOworCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGJsY19zY2hlZHVsZXIpOworCWlmIChyZXQpCisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGlwX3ZzX2xibGNfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bF9oZWFkZXIpOworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19sYmxjX3NjaGVkdWxlcik7Cit9CisKKworbW9kdWxlX2luaXQoaXBfdnNfbGJsY19pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX2xibGNfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzVlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYwpAQCAtMCwwICsxLDc1NSBAQAorLyoKKyAqIElQVlM6ICAgICAgICBMb2NhbGl0eS1CYXNlZCBMZWFzdC1Db25uZWN0aW9uIHdpdGggUmVwbGljYXRpb24gc2NoZWR1bGVyCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgSnVsaWFuIEFuYXN0YXNvdiAgICAgICAgOiAgICBBZGRlZCB0aGUgbWlzc2luZyAoZGVzdC0+d2VpZ2h0PjApCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gaW4gdGhlIGlwX3ZzX2Rlc3Rfc2V0X21heC4KKyAqCisgKi8KKworLyoKKyAqIFRoZSBsYmxjL3IgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3MgKHBzZXVkbyBjb2RlKToKKyAqCisgKiAgICAgICBpZiBzZXJ2ZXJTZXRbZGVzdF9pcF0gaXMgbnVsbCB0aGVuCisgKiAgICAgICAgICAgICAgIG4sIHNlcnZlclNldFtkZXN0X2lwXSA8LSB7d2VpZ2h0ZWQgbGVhc3QtY29ubiBub2RlfTsKKyAqICAgICAgIGVsc2UKKyAqICAgICAgICAgICAgICAgbiA8LSB7bGVhc3QtY29ubiAoYWxpdmUpIG5vZGUgaW4gc2VydmVyU2V0W2Rlc3RfaXBdfTsKKyAqICAgICAgICAgICAgICAgaWYgKG4gaXMgbnVsbCkgT1IKKyAqICAgICAgICAgICAgICAgICAgKG4uY29ubnM+bi53ZWlnaHQgQU5ECisgKiAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIG5vZGUgbSB3aXRoIG0uY29ubnM8bS53ZWlnaHQvMikgdGhlbgorICogICAgICAgICAgICAgICAgICAgbiA8LSB7d2VpZ2h0ZWQgbGVhc3QtY29ubiBub2RlfTsKKyAqICAgICAgICAgICAgICAgICAgIGFkZCBuIHRvIHNlcnZlclNldFtkZXN0X2lwXTsKKyAqICAgICAgICAgICAgICAgaWYgfHNlcnZlclNldFtkZXN0X2lwXXwgPiAxIEFORAorICogICAgICAgICAgICAgICAgICAgbm93IC0gc2VydmVyU2V0W2Rlc3RfaXBdLmxhc3RNb2QgPiBUIHRoZW4KKyAqICAgICAgICAgICAgICAgICAgIG0gPC0ge21vc3QgY29ubiBub2RlIGluIHNlcnZlclNldFtkZXN0X2lwXX07CisgKiAgICAgICAgICAgICAgICAgICByZW1vdmUgbSBmcm9tIHNlcnZlclNldFtkZXN0X2lwXTsKKyAqICAgICAgIGlmIHNlcnZlclNldFtkZXN0X2lwXSBjaGFuZ2VkIHRoZW4KKyAqICAgICAgICAgICAgICAgc2VydmVyU2V0W2Rlc3RfaXBdLmxhc3RNb2QgPC0gbm93OworICoKKyAqICAgICAgIHJldHVybiBuOworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisKKy8qIGZvciBzeXNjdGwgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogICAgSXQgaXMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzdGFsZSBJUFZTIGxibGNyIGVudHJpZXMsCisgKiAgICB3aGVuIHRoZSB0YWJsZSBpcyBmdWxsLgorICovCisjZGVmaW5lIENIRUNLX0VYUElSRV9JTlRFUlZBTCAgICg2MCpIWikKKyNkZWZpbmUgRU5UUllfVElNRU9VVCAgICAgICAgICAgKDYqNjAqSFopCisKKy8qCisgKiAgICBJdCBpcyBmb3IgZnVsbCBleHBpcmF0aW9uIGNoZWNrLgorICogICAgV2hlbiB0aGVyZSBpcyBubyBwYXJ0aWFsIGV4cGlyYXRpb24gY2hlY2sgKGdhcmJhZ2UgY29sbGVjdGlvbikKKyAqICAgIGluIGEgaGFsZiBob3VyLCBkbyBhIGZ1bGwgZXhwaXJhdGlvbiBjaGVjayB0byBjb2xsZWN0IHN0YWxlCisgKiAgICBlbnRyaWVzIHRoYXQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgZm9yIGEgZGF5LgorICovCisjZGVmaW5lIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04gICAzMAorc3RhdGljIGludCBzeXNjdGxfaXBfdnNfbGJsY3JfZXhwaXJhdGlvbiA9IDI0KjYwKjYwKkhaOworCisKKy8qCisgKiAgICAgZm9yIElQVlMgbGJsY3IgZW50cnkgaGFzaCB0YWJsZQorICovCisjaWZuZGVmIENPTkZJR19JUF9WU19MQkxDUl9UQUJfQklUUworI2RlZmluZSBDT05GSUdfSVBfVlNfTEJMQ1JfVEFCX0JJVFMgICAgICAxMAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX0xCTENSX1RBQl9CSVRTICAgICBDT05GSUdfSVBfVlNfTEJMQ1JfVEFCX0JJVFMKKyNkZWZpbmUgSVBfVlNfTEJMQ1JfVEFCX1NJWkUgICAgICgxIDw8IElQX1ZTX0xCTENSX1RBQl9CSVRTKQorI2RlZmluZSBJUF9WU19MQkxDUl9UQUJfTUFTSyAgICAgKElQX1ZTX0xCTENSX1RBQl9TSVpFIC0gMSkKKworCisvKgorICogICAgICBJUFZTIGRlc3RpbmF0aW9uIHNldCBzdHJ1Y3R1cmUgYW5kIG9wZXJhdGlvbnMKKyAqLworc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCB7CisJc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAgKm5leHQ7ICAgICAgICAgIC8qIGxpc3QgbGluayAqLworCXN0cnVjdCBpcF92c19kZXN0ICAgICAgICpkZXN0OyAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBzZXJ2ZXIgKi8KK307CisKK3N0cnVjdCBpcF92c19kZXN0X3NldCB7CisJYXRvbWljX3QgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgIC8qIHNldCBzaXplICovCisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgbGFzdG1vZDsgICAgICAgIC8qIGxhc3QgbW9kaWZpZWQgdGltZSAqLworCXN0cnVjdCBpcF92c19kZXN0X2xpc3QgICpsaXN0OyAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBsaXN0ICovCisJcndsb2NrX3QJICAgICAgICBsb2NrOyAgICAgICAgICAgLyogbG9jayBmb3IgdGhpcyBsaXN0ICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICoKK2lwX3ZzX2Rlc3Rfc2V0X2luc2VydChzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgKnNldCwgc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3RfbGlzdCAqZTsKKworCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQlpZiAoZS0+ZGVzdCA9PSBkZXN0KQorCQkJLyogYWxyZWFkeSBleGlzdGVkICovCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllID0ga21hbGxvYyhzaXplb2YoKmUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoZSA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfZGVzdF9zZXRfaW5zZXJ0KCk6IG5vIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWF0b21pY19pbmMoJmRlc3QtPnJlZmNudCk7CisJZS0+ZGVzdCA9IGRlc3Q7CisKKwkvKiBsaW5rIGl0IHRvIHRoZSBsaXN0ICovCisJZS0+bmV4dCA9IHNldC0+bGlzdDsKKwlzZXQtPmxpc3QgPSBlOworCWF0b21pY19pbmMoJnNldC0+c2l6ZSk7CisKKwlzZXQtPmxhc3Rtb2QgPSBqaWZmaWVzOworCXJldHVybiBlOworfQorCitzdGF0aWMgdm9pZAoraXBfdnNfZGVzdF9zZXRfZXJhc2Uoc3RydWN0IGlwX3ZzX2Rlc3Rfc2V0ICpzZXQsIHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXN0cnVjdCBpcF92c19kZXN0X2xpc3QgKmUsICoqZXA7CisKKwlmb3IgKGVwPSZzZXQtPmxpc3QsIGU9KmVwOyBlIT1OVUxMOyBlPSplcCkgeworCQlpZiAoZS0+ZGVzdCA9PSBkZXN0KSB7CisJCQkvKiBISVQgKi8KKwkJCSplcCA9IGUtPm5leHQ7CisJCQlhdG9taWNfZGVjKCZzZXQtPnNpemUpOworCQkJc2V0LT5sYXN0bW9kID0gamlmZmllczsKKwkJCWF0b21pY19kZWMoJmUtPmRlc3QtPnJlZmNudCk7CisJCQlrZnJlZShlKTsKKwkJCWJyZWFrOworCQl9CisJCWVwID0gJmUtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcF92c19kZXN0X3NldF9lcmFzZWFsbChzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdF9saXN0ICplLCAqKmVwOworCisJd3JpdGVfbG9jaygmc2V0LT5sb2NrKTsKKwlmb3IgKGVwPSZzZXQtPmxpc3QsIGU9KmVwOyBlIT1OVUxMOyBlPSplcCkgeworCQkqZXAgPSBlLT5uZXh0OworCQkvKgorCQkgKiBXZSBkb24ndCBrZnJlZSBkZXN0IGJlY2F1c2UgaXQgaXMgcmVmZXJlZCBlaXRoZXIKKwkJICogYnkgaXRzIHNlcnZpY2Ugb3IgYnkgdGhlIHRyYXNoIGRlc3QgbGlzdC4KKwkJICovCisJCWF0b21pY19kZWMoJmUtPmRlc3QtPnJlZmNudCk7CisJCWtmcmVlKGUpOworCX0KKwl3cml0ZV91bmxvY2soJnNldC0+bG9jayk7Cit9CisKKy8qIGdldCB3ZWlnaHRlZCBsZWFzdC1jb25uZWN0aW9uIG5vZGUgaW4gdGhlIGRlc3RpbmF0aW9uIHNldCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqaXBfdnNfZGVzdF9zZXRfbWluKHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0KQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcF92c19kZXN0X2xpc3QgKmU7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdDsKKwlpbnQgbG9oLCBkb2g7CisKKwlpZiAoc2V0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogc2VsZWN0IHRoZSBmaXJzdCBkZXN0aW5hdGlvbiBzZXJ2ZXIsIHdob3NlIHdlaWdodCA+IDAgKi8KKwlmb3IgKGU9c2V0LT5saXN0OyBlIT1OVUxMOyBlPWUtPm5leHQpIHsKKwkJbGVhc3QgPSBlLT5kZXN0OworCQlpZiAobGVhc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKQorCQkJY29udGludWU7CisKKwkJaWYgKChhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkgPiAwKQorCQkgICAgJiYgKGxlYXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9BVkFJTEFCTEUpKSB7CisJCQlsb2ggPSBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCisJCQkJKyBhdG9taWNfcmVhZCgmbGVhc3QtPmluYWN0Y29ubnMpOworCQkJZ290byBuZXh0c3RhZ2U7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7CisKKwkvKiBmaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSB3ZWlnaHRlZCBsZWFzdCBsb2FkICovCisgIG5leHRzdGFnZToKKwlmb3IgKGU9ZS0+bmV4dDsgZSE9TlVMTDsgZT1lLT5uZXh0KSB7CisJCWRlc3QgPSBlLT5kZXN0OworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQlpZiAoKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KKwkJICAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpCisJCSAgICAmJiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfQVZBSUxBQkxFKSkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gZG9oOworCQl9CisJfQorCisJSVBfVlNfREJHKDYsICJpcF92c19kZXN0X3NldF9taW46IHNlcnZlciAlZC4lZC4lZC4lZDolZCAiCisJCSAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgTklQUVVBRChsZWFzdC0+YWRkci5pcCksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICBhdG9taWNfcmVhZCgmbGVhc3QtPnJlZmNudCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCXJldHVybiBsZWFzdDsKK30KKworCisvKiBnZXQgd2VpZ2h0ZWQgbW9zdC1jb25uZWN0aW9uIG5vZGUgaW4gdGhlIGRlc3RpbmF0aW9uIHNldCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqaXBfdnNfZGVzdF9zZXRfbWF4KHN0cnVjdCBpcF92c19kZXN0X3NldCAqc2V0KQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcF92c19kZXN0X2xpc3QgKmU7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICptb3N0OworCWludCBtb2gsIGRvaDsKKworCWlmIChzZXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzZWxlY3QgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIHNlcnZlciwgd2hvc2Ugd2VpZ2h0ID4gMCAqLworCWZvciAoZT1zZXQtPmxpc3Q7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQltb3N0ID0gZS0+ZGVzdDsKKwkJaWYgKGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpID4gMCkgeworCQkJbW9oID0gYXRvbWljX3JlYWQoJm1vc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCisJCQkJKyBhdG9taWNfcmVhZCgmbW9zdC0+aW5hY3Rjb25ucyk7CisJCQlnb3RvIG5leHRzdGFnZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKKworCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHdlaWdodGVkIG1vc3QgbG9hZCAqLworICBuZXh0c3RhZ2U6CisJZm9yIChlPWUtPm5leHQ7IGUhPU5VTEw7IGU9ZS0+bmV4dCkgeworCQlkZXN0ID0gZS0+ZGVzdDsKKwkJZG9oID0gYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSAqIDUwCisJCQkrIGF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwkJLyogbW9oL213IDwgZG9oL2R3ID09PiBtb2gqZHcgPCBkb2gqbXcsIHdoZXJlIG13LGR3PjAgKi8KKwkJaWYgKChtb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA8CisJCSAgICAgZG9oICogYXRvbWljX3JlYWQoJm1vc3QtPndlaWdodCkpCisJCSAgICAmJiAoYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKSkgeworCQkJbW9zdCA9IGRlc3Q7CisJCQltb2ggPSBkb2g7CisJCX0KKwl9CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX2Rlc3Rfc2V0X21heDogc2VydmVyICVkLiVkLiVkLiVkOiVkICIKKwkJICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKKwkJICBOSVBRVUFEKG1vc3QtPmFkZHIuaXApLCBudG9ocyhtb3N0LT5wb3J0KSwKKwkJICBhdG9taWNfcmVhZCgmbW9zdC0+YWN0aXZlY29ubnMpLAorCQkgIGF0b21pY19yZWFkKCZtb3N0LT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZtb3N0LT53ZWlnaHQpLCBtb2gpOworCXJldHVybiBtb3N0OworfQorCisKKy8qCisgKiAgICAgIElQVlMgbGJsY3IgZW50cnkgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc3RpbmF0aW9uCisgKiAgICAgIElQIGFkZHJlc3MgYW5kIGl0cyBkZXN0aW5hdGlvbiBzZXJ2ZXIgc2V0CisgKi8KK3N0cnVjdCBpcF92c19sYmxjcl9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsKKwlfX2JlMzIgICAgICAgICAgICAgICAgICAgYWRkcjsgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaXBfdnNfZGVzdF9zZXQgICBzZXQ7ICAgICAgICAgICAgLyogZGVzdGluYXRpb24gc2VydmVyIHNldCAqLworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGxhc3R1c2U7ICAgICAgICAvKiBsYXN0IHVzZWQgdGltZSAqLworfTsKKworCisvKgorICogICAgICBJUFZTIGxibGNyIGhhc2ggdGFibGUKKyAqLworc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBidWNrZXRbSVBfVlNfTEJMQ1JfVEFCX1NJWkVdOyAgLyogaGFzaCBidWNrZXQgKi8KKwlhdG9taWNfdCAgICAgICAgICAgICAgICBlbnRyaWVzOyAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZTsgICAgICAgLyogbWF4aW11bSBzaXplIG9mIGVudHJpZXMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBwZXJpb2RpY190aW1lcjsgLyogY29sbGVjdCBzdGFsZSBlbnRyaWVzICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgcm92ZXI7ICAgICAgICAgIC8qIHJvdmVyIGZvciBleHBpcmUgY2hlY2sgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudGVyOyAgICAgICAgLyogY291bnRlciBmb3Igbm8gZXhwaXJlICovCit9OworCisKKy8qCisgKiAgICAgIElQVlMgTEJMQ1Igc3lzY3RsIHRhYmxlCisgKi8KKworc3RhdGljIGN0bF90YWJsZSB2c192YXJzX3RhYmxlW10gPSB7CisJeworCQkucHJvY25hbWUJPSAibGJsY3JfZXhwaXJhdGlvbiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfaXBfdnNfbGJsY3JfZXhwaXJhdGlvbiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogc3lzY3RsX2hlYWRlcjsKKworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX2xibGNyX2ZyZWUoc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbikKK3sKKwlsaXN0X2RlbCgmZW4tPmxpc3QpOworCWlwX3ZzX2Rlc3Rfc2V0X2VyYXNlYWxsKCZlbi0+c2V0KTsKKwlrZnJlZShlbik7Cit9CisKKworLyoKKyAqCVJldHVybnMgaGFzaCB2YWx1ZSBmb3IgSVBWUyBMQkxDUiBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGlwX3ZzX2xibGNyX2hhc2hrZXkoX19iZTMyIGFkZHIpCit7CisJcmV0dXJuIChudG9obChhZGRyKSoyNjU0NDM1NzYxVUwpICYgSVBfVlNfTEJMQ1JfVEFCX01BU0s7Cit9CisKKworLyoKKyAqCUhhc2ggYW4gZW50cnkgaW4gdGhlIGlwX3ZzX2xibGNyX3RhYmxlLgorICoJcmV0dXJucyBib29sIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkCitpcF92c19sYmxjcl9oYXNoKHN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsLCBzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuKQoreworCXVuc2lnbmVkIGhhc2ggPSBpcF92c19sYmxjcl9oYXNoa2V5KGVuLT5hZGRyKTsKKworCWxpc3RfYWRkKCZlbi0+bGlzdCwgJnRibC0+YnVja2V0W2hhc2hdKTsKKwlhdG9taWNfaW5jKCZ0YmwtPmVudHJpZXMpOworfQorCisKKy8qCisgKiAgR2V0IGlwX3ZzX2xibGNyX2VudHJ5IGFzc29jaWF0ZWQgd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLiBDYWxsZWQgdW5kZXIKKyAqICByZWFkIGxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICoKK2lwX3ZzX2xibGNyX2dldChzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCwgX19iZTMyIGFkZHIpCit7CisJdW5zaWduZWQgaGFzaCA9IGlwX3ZzX2xibGNyX2hhc2hrZXkoYWRkcik7CisJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW4sICZ0YmwtPmJ1Y2tldFtoYXNoXSwgbGlzdCkKKwkJaWYgKGVuLT5hZGRyID09IGFkZHIpCisJCQlyZXR1cm4gZW47CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogQ3JlYXRlIG9yIHVwZGF0ZSBhbiBpcF92c19sYmxjcl9lbnRyeSwgd2hpY2ggaXMgYSBtYXBwaW5nIG9mIGEgZGVzdGluYXRpb24KKyAqIElQIGFkZHJlc3MgdG8gYSBzZXJ2ZXIuIENhbGxlZCB1bmRlciB3cml0ZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqCitpcF92c19sYmxjcl9uZXcoc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwsICBfX2JlMzIgZGFkZHIsCisJCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW47CisKKwllbiA9IGlwX3ZzX2xibGNyX2dldCh0YmwsIGRhZGRyKTsKKwlpZiAoIWVuKSB7CisJCWVuID0ga21hbGxvYyhzaXplb2YoKmVuKSwgR0ZQX0FUT01JQyk7CisJCWlmICghZW4pIHsKKwkJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY3JfbmV3KCk6IG5vIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWVuLT5hZGRyID0gZGFkZHI7CisJCWVuLT5sYXN0dXNlID0gamlmZmllczsKKworCQkvKiBpbml0aWxpemUgaXRzIGRlc3Qgc2V0ICovCisJCWF0b21pY19zZXQoJihlbi0+c2V0LnNpemUpLCAwKTsKKwkJZW4tPnNldC5saXN0ID0gTlVMTDsKKwkJcndsb2NrX2luaXQoJmVuLT5zZXQubG9jayk7CisKKwkJaXBfdnNfbGJsY3JfaGFzaCh0YmwsIGVuKTsKKwl9CisKKwl3cml0ZV9sb2NrKCZlbi0+c2V0LmxvY2spOworCWlwX3ZzX2Rlc3Rfc2V0X2luc2VydCgmZW4tPnNldCwgZGVzdCk7CisJd3JpdGVfdW5sb2NrKCZlbi0+c2V0LmxvY2spOworCisJcmV0dXJuIGVuOworfQorCisKKy8qCisgKiAgICAgIEZsdXNoIGFsbCB0aGUgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBpcF92c19sYmxjcl9mbHVzaChzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuLCAqbnh0OworCisJLyogTm8gbG9ja2luZyByZXF1aXJlZCwgb25seSBjYWxsZWQgZHVyaW5nIGNsZWFudXAuICovCisJZm9yIChpPTA7IGk8SVBfVlNfTEJMQ1JfVEFCX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2ldLCBsaXN0KSB7CisJCQlpcF92c19sYmxjcl9mcmVlKGVuKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfbGJsY3JfZnVsbF9jaGVjayhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19sYmxjcl90YWJsZSAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuLCAqbnh0OworCisJZm9yIChpPTAsIGo9dGJsLT5yb3ZlcjsgaTxJUF9WU19MQkxDUl9UQUJfU0laRTsgaSsrKSB7CisJCWogPSAoaiArIDEpICYgSVBfVlNfTEJMQ1JfVEFCX01BU0s7CisKKwkJd3JpdGVfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVuLCBueHQsICZ0YmwtPmJ1Y2tldFtqXSwgbGlzdCkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoZW4tPmxhc3R1c2Urc3lzY3RsX2lwX3ZzX2xibGNyX2V4cGlyYXRpb24sCisJCQkJICAgICAgIG5vdykpCisJCQkJY29udGludWU7CisKKwkJCWlwX3ZzX2xibGNyX2ZyZWUoZW4pOworCQkJYXRvbWljX2RlYygmdGJsLT5lbnRyaWVzKTsKKwkJfQorCQl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJfQorCXRibC0+cm92ZXIgPSBqOworfQorCisKKy8qCisgKiAgICAgIFBlcmlvZGljYWwgdGltZXIgaGFuZGxlciBmb3IgSVBWUyBsYmxjciB0YWJsZQorICogICAgICBJdCBpcyB1c2VkIHRvIGNvbGxlY3Qgc3RhbGUgZW50cmllcyB3aGVuIHRoZSBudW1iZXIgb2YgZW50cmllcworICogICAgICBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHRhYmxlLgorICoKKyAqICAgICAgRml4bWU6IHdlIHByb2JhYmx5IG5lZWQgbW9yZSBjb21wbGljYXRlZCBhbGdvcml0aG0gdG8gY29sbGVjdAorICogICAgICAgICAgICAgZW50cmllcyB0aGF0IGhhdmUgbm90IGJlZW4gdXNlZCBmb3IgYSBsb25nIHRpbWUgZXZlbgorICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBlbnRyaWVzIGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUKKyAqICAgICAgICAgICAgIG9mIHRoZSB0YWJsZS4KKyAqICAgICAgVGhlIGZ1bGwgZXhwaXJhdGlvbiBjaGVjayBpcyBmb3IgdGhpcyBwdXJwb3NlIG5vdy4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfbGJsY3JfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjID0gKHN0cnVjdCBpcF92c19zZXJ2aWNlICopIGRhdGE7CisJc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0YmwgPSBzdmMtPnNjaGVkX2RhdGE7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCBnb2FsOworCWludCBpLCBqOworCXN0cnVjdCBpcF92c19sYmxjcl9lbnRyeSAqZW4sICpueHQ7CisKKwlpZiAoKHRibC0+Y291bnRlciAlIENPVU5UX0ZPUl9GVUxMX0VYUElSQVRJT04pID09IDApIHsKKwkJLyogZG8gZnVsbCBleHBpcmF0aW9uIGNoZWNrICovCisJCWlwX3ZzX2xibGNyX2Z1bGxfY2hlY2soc3ZjKTsKKwkJdGJsLT5jb3VudGVyID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZ0YmwtPmVudHJpZXMpIDw9IHRibC0+bWF4X3NpemUpIHsKKwkJdGJsLT5jb3VudGVyKys7CisJCWdvdG8gb3V0OworCX0KKworCWdvYWwgPSAoYXRvbWljX3JlYWQoJnRibC0+ZW50cmllcykgLSB0YmwtPm1heF9zaXplKSo0LzM7CisJaWYgKGdvYWwgPiB0YmwtPm1heF9zaXplLzIpCisJCWdvYWwgPSB0YmwtPm1heF9zaXplLzI7CisKKwlmb3IgKGk9MCwgaj10YmwtPnJvdmVyOyBpPElQX1ZTX0xCTENSX1RBQl9TSVpFOyBpKyspIHsKKwkJaiA9IChqICsgMSkgJiBJUF9WU19MQkxDUl9UQUJfTUFTSzsKKworCQl3cml0ZV9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW4sIG54dCwgJnRibC0+YnVja2V0W2pdLCBsaXN0KSB7CisJCQlpZiAodGltZV9iZWZvcmUobm93LCBlbi0+bGFzdHVzZStFTlRSWV9USU1FT1VUKSkKKwkJCQljb250aW51ZTsKKworCQkJaXBfdnNfbGJsY3JfZnJlZShlbik7CisJCQlhdG9taWNfZGVjKCZ0YmwtPmVudHJpZXMpOworCQkJZ29hbC0tOworCQl9CisJCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwkJaWYgKGdvYWwgPD0gMCkKKwkJCWJyZWFrOworCX0KKwl0YmwtPnJvdmVyID0gajsKKworICBvdXQ6CisJbW9kX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyLCBqaWZmaWVzK0NIRUNLX0VYUElSRV9JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfbGJsY3JfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibDsKKworCS8qCisJICogICAgQWxsb2NhdGUgdGhlIGlwX3ZzX2xibGNyX3RhYmxlIGZvciB0aGlzIHNlcnZpY2UKKwkgKi8KKwl0YmwgPSBrbWFsbG9jKHNpemVvZigqdGJsKSwgR0ZQX0FUT01JQyk7CisJaWYgKHRibCA9PSBOVUxMKSB7CisJCUlQX1ZTX0VSUigiaXBfdnNfbGJsY3JfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKKwlJUF9WU19EQkcoNiwgIkxCTENSIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgYWxsb2NhdGVkIGZvciAiCisJCSAgImN1cnJlbnQgc2VydmljZVxuIiwgc2l6ZW9mKCp0YmwpKTsKKworCS8qCisJICogICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBidWNrZXRzCisJICovCisJZm9yIChpPTA7IGk8SVBfVlNfTEJMQ1JfVEFCX1NJWkU7IGkrKykgeworCQlJTklUX0xJU1RfSEVBRCgmdGJsLT5idWNrZXRbaV0pOworCX0KKwl0YmwtPm1heF9zaXplID0gSVBfVlNfTEJMQ1JfVEFCX1NJWkUqMTY7CisJdGJsLT5yb3ZlciA9IDA7CisJdGJsLT5jb3VudGVyID0gMTsKKworCS8qCisJICogICAgSG9vayBwZXJpb2RpYyB0aW1lciBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uCisJICovCisJc2V0dXBfdGltZXIoJnRibC0+cGVyaW9kaWNfdGltZXIsIGlwX3ZzX2xibGNyX2NoZWNrX2V4cGlyZSwKKwkJCSh1bnNpZ25lZCBsb25nKXN2Yyk7CisJbW9kX3RpbWVyKCZ0YmwtPnBlcmlvZGljX3RpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfRVhQSVJFX0lOVEVSVkFMKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfbGJsY3JfZG9uZV9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIHJlbW92ZSBwZXJpb2RpYyB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZ0YmwtPnBlcmlvZGljX3RpbWVyKTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCB0YWJsZSBlbnRyaWVzIGhlcmUgKi8KKwlpcF92c19sYmxjcl9mbHVzaCh0YmwpOworCisJLyogcmVsZWFzZSB0aGUgdGFibGUgaXRzZWxmICovCisJa2ZyZWUodGJsKTsKKwlJUF9WU19EQkcoNiwgIkxCTENSIGhhc2ggdGFibGUgKG1lbW9yeT0lWmRieXRlcykgcmVsZWFzZWRcbiIsCisJCSAgc2l6ZW9mKCp0YmwpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3ZzX2Rlc3QgKgorX19pcF92c19sYmxjcl9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBzdHJ1Y3QgaXBoZHIgKmlwaCkKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0OworCWludCBsb2gsIGRvaDsKKworCS8qCisJICogV2UgdGhpbmsgdGhlIG92ZXJoZWFkIG9mIHByb2Nlc3NpbmcgYWN0aXZlIGNvbm5lY3Rpb25zIGlzIGZpZnR5CisJICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcworCSAqIGZpZnR5IHRpbWVzIG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSwgd2Ugd2lsbCBjaGFuZ2UgaXQgbGF0ZXIuKSBXZQorCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkOgorCSAqICAgICAgICAgICAgICAgIGRlc3QtPmFjdGl2ZWNvbm5zKjUwICsgZGVzdC0+aW5hY3Rjb25ucworCSAqIGFuZCB0aGUgbG9hZDoKKwkgKiAgICAgICAgICAgICAgICAoZGVzdCBvdmVyaGVhZCkgLyBkZXN0LT53ZWlnaHQKKwkgKgorCSAqIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSEhIQorCSAqIFRoZSBjb21wYXJpc29uIG9mIGgxKncyID4gaDIqdzEgaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mCisJICogICAgICAgICAgICAgICAgaDEvdzEgPiBoMi93MgorCSAqIGlmIGV2ZXJ5IHdlaWdodCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgorCSAqCisJICogVGhlIHNlcnZlciB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGFueQorCSAqIG5ldyBjb25uZWN0aW9uLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKQorCQkJY29udGludWU7CisKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucykgKiA1MAorCQkJCSsgYXRvbWljX3JlYWQoJmxlYXN0LT5pbmFjdGNvbm5zKTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICogNTAKKwkJCSsgYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworCQlpZiAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgZG9oICogYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpKSB7CisJCQlsZWFzdCA9IGRlc3Q7CisJCQlsb2ggPSBkb2g7CisJCX0KKwl9CisKKwlJUF9WU19EQkcoNiwgIkxCTENSOiBzZXJ2ZXIgJWQuJWQuJWQuJWQ6JWQgIgorCQkgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkIG92ZXJoZWFkICVkXG4iLAorCQkgIE5JUFFVQUQobGVhc3QtPmFkZHIuaXApLCBudG9ocyhsZWFzdC0+cG9ydCksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgYXRvbWljX3JlYWQoJmxlYXN0LT5yZWZjbnQpLAorCQkgIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSwgbG9oKTsKKworCXJldHVybiBsZWFzdDsKK30KKworCisvKgorICogICBJZiB0aGlzIGRlc3RpbmF0aW9uIHNlcnZlciBpcyBvdmVybG9hZGVkIGFuZCB0aGVyZSBpcyBhIGxlc3MgbG9hZGVkCisgKiAgIHNlcnZlciwgdGhlbiByZXR1cm4gdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsIHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJaWYgKGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgPiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSkgeworCQlzdHJ1Y3QgaXBfdnNfZGVzdCAqZDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmQtPmFjdGl2ZWNvbm5zKSoyCisJCQkgICAgPCBhdG9taWNfcmVhZCgmZC0+d2VpZ2h0KSkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBMb2NhbGl0eS1CYXNlZCAod2VpZ2h0ZWQpIExlYXN0LUNvbm5lY3Rpb24gc2NoZWR1bGluZworICovCitzdGF0aWMgc3RydWN0IGlwX3ZzX2Rlc3QgKgoraXBfdnNfbGJsY3Jfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfdGFibGUgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgaXBfdnNfbGJsY3JfZW50cnkgKmVuOworCisJSVBfVlNfREJHKDYsICJpcF92c19sYmxjcl9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCS8qIEZpcnN0IGxvb2sgaW4gb3VyIGNhY2hlICovCisJcmVhZF9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCWVuID0gaXBfdnNfbGJsY3JfZ2V0KHRibCwgaXBoLT5kYWRkcik7CisJaWYgKGVuKSB7CisJCS8qIFdlIG9ubHkgaG9sZCBhIHJlYWQgbG9jaywgYnV0IHRoaXMgaXMgYXRvbWljICovCisJCWVuLT5sYXN0dXNlID0gamlmZmllczsKKworCQkvKiBHZXQgdGhlIGxlYXN0IGxvYWRlZCBkZXN0aW5hdGlvbiAqLworCQlyZWFkX2xvY2soJmVuLT5zZXQubG9jayk7CisJCWRlc3QgPSBpcF92c19kZXN0X3NldF9taW4oJmVuLT5zZXQpOworCQlyZWFkX3VubG9jaygmZW4tPnNldC5sb2NrKTsKKworCQkvKiBNb3JlIHRoYW4gb25lIGRlc3RpbmF0aW9uICsgZW5vdWdoIHRpbWUgcGFzc2VkIGJ5LCBjbGVhbnVwICovCisJCWlmIChhdG9taWNfcmVhZCgmZW4tPnNldC5zaXplKSA+IDEgJiYKKwkJCQl0aW1lX2FmdGVyKGppZmZpZXMsIGVuLT5zZXQubGFzdG1vZCArCisJCQkJc3lzY3RsX2lwX3ZzX2xibGNyX2V4cGlyYXRpb24pKSB7CisJCQlzdHJ1Y3QgaXBfdnNfZGVzdCAqbTsKKworCQkJd3JpdGVfbG9jaygmZW4tPnNldC5sb2NrKTsKKwkJCW0gPSBpcF92c19kZXN0X3NldF9tYXgoJmVuLT5zZXQpOworCQkJaWYgKG0pCisJCQkJaXBfdnNfZGVzdF9zZXRfZXJhc2UoJmVuLT5zZXQsIG0pOworCQkJd3JpdGVfdW5sb2NrKCZlbi0+c2V0LmxvY2spOworCQl9CisKKwkJLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBvdmVybG9hZGVkLCB1c2UgaXQgKi8KKwkJaWYgKGRlc3QgJiYgIWlzX292ZXJsb2FkZWQoZGVzdCwgc3ZjKSkgeworCQkJcmVhZF91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFRoZSBjYWNoZSBlbnRyeSBpcyBpbnZhbGlkLCB0aW1lIHRvIHNjaGVkdWxlICovCisJCWRlc3QgPSBfX2lwX3ZzX2xibGNyX3NjaGVkdWxlKHN2YywgaXBoKTsKKwkJaWYgKCFkZXN0KSB7CisJCQlJUF9WU19EQkcoMSwgIm5vIGRlc3RpbmF0aW9uIGF2YWlsYWJsZVxuIik7CisJCQlyZWFkX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogVXBkYXRlIG91ciBjYWNoZSBlbnRyeSAqLworCQl3cml0ZV9sb2NrKCZlbi0+c2V0LmxvY2spOworCQlpcF92c19kZXN0X3NldF9pbnNlcnQoJmVuLT5zZXQsIGRlc3QpOworCQl3cml0ZV91bmxvY2soJmVuLT5zZXQubG9jayk7CisJfQorCXJlYWRfdW5sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCisJaWYgKGRlc3QpCisJCWdvdG8gb3V0OworCisJLyogTm8gY2FjaGUgZW50cnksIHRpbWUgdG8gc2NoZWR1bGUgKi8KKwlkZXN0ID0gX19pcF92c19sYmxjcl9zY2hlZHVsZShzdmMsIGlwaCk7CisJaWYgKCFkZXN0KSB7CisJCUlQX1ZTX0RCRygxLCAibm8gZGVzdGluYXRpb24gYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSWYgd2UgZmFpbCB0byBjcmVhdGUgYSBjYWNoZSBlbnRyeSwgd2UnbGwganVzdCB1c2UgdGhlIHZhbGlkIGRlc3QgKi8KKwl3cml0ZV9sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCWlwX3ZzX2xibGNyX25ldyh0YmwsIGlwaC0+ZGFkZHIsIGRlc3QpOworCXdyaXRlX3VubG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKworb3V0OgorCUlQX1ZTX0RCRyg2LCAiTEJMQ1I6IGRlc3RpbmF0aW9uIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgIgorCQkgICItLT4gc2VydmVyICV1LiV1LiV1LiV1OiVkXG4iLAorCQkgIE5JUFFVQUQoaXBoLT5kYWRkciksCisJCSAgTklQUVVBRChkZXN0LT5hZGRyLmlwKSwKKwkJICBudG9ocyhkZXN0LT5wb3J0KSk7CisKKwlyZXR1cm4gZGVzdDsKK30KKworCisvKgorICogICAgICBJUFZTIExCTENSIFNjaGVkdWxlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfbGJsY3Jfc2NoZWR1bGVyID0KK3sKKwkubmFtZSA9CQkJImxibGNyIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19sYmxjcl9zY2hlZHVsZXIubl9saXN0KSwKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCS5zdXBwb3J0c19pcHY2ID0JMCwKKyNlbmRpZgorCS5pbml0X3NlcnZpY2UgPQkJaXBfdnNfbGJsY3JfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c19sYmxjcl9kb25lX3N2YywKKwkuc2NoZWR1bGUgPQkJaXBfdnNfbGJsY3Jfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX2xibGNyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF9wYXRocyhuZXRfdnNfY3RsX3BhdGgsIHZzX3ZhcnNfdGFibGUpOworCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfbGJsY3Jfc2NoZWR1bGVyKTsKKwlpZiAocmV0KQorCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxfaGVhZGVyKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19sYmxjcl9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3RsX2hlYWRlcik7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xibGNyX3NjaGVkdWxlcik7Cit9CisKKworbW9kdWxlX2luaXQoaXBfdnNfbGJsY3JfaW5pdCk7Cittb2R1bGVfZXhpdChpcF92c19sYmxjcl9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYy5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5ZjgwOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogSVBWUzogICAgICAgIExlYXN0LUNvbm5lY3Rpb24gU2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIHRoZSBpcF92c19sY191cGRhdGVfc3ZjCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIGFueSBkZXN0IHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2lwX3ZzX2xjX2Rlc3Rfb3ZlcmhlYWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJLyoKKwkgKiBXZSB0aGluayB0aGUgb3ZlcmhlYWQgb2YgcHJvY2Vzc2luZyBhY3RpdmUgY29ubmVjdGlvbnMgaXMgMjU2CisJICogdGltZXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBpbmFjdGl2ZSBjb25uZWN0aW9ucyBpbiBhdmVyYWdlLiAoVGhpcworCSAqIDI1NiB0aW1lcyBtaWdodCBub3QgYmUgYWNjdXJhdGUsIHdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyKSBXZQorCSAqIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZXN0aW1hdGUgdGhlIG92ZXJoZWFkIG5vdzoKKwkgKgkJICBkZXN0LT5hY3RpdmVjb25ucyoyNTYgKyBkZXN0LT5pbmFjdGNvbm5zCisJICovCisJcmV0dXJuIChhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpIDw8IDgpICsKKwkJYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOworfQorCisKKy8qCisgKglMZWFzdCBDb25uZWN0aW9uIHNjaGVkdWxpbmcKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX2xjX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QsICpsZWFzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGxvaCA9IDAsIGRvaDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfbGNfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwkvKgorCSAqIFNpbXBseSBzZWxlY3QgdGhlIHNlcnZlciB3aXRoIHRoZSBsZWFzdCBudW1iZXIgb2YKKwkgKiAgICAgICAgKGFjdGl2ZWNvbm5zPDw1KSArIGluYWN0Y29ubnMKKwkgKiBFeGNlcHQgd2hvc2Ugd2VpZ2h0IGlzIGVxdWFsIHRvIHplcm8uCisJICogSWYgdGhlIHdlaWdodCBpcyBlcXVhbCB0byB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgaXMKKwkgKiBxdWllc2NlZCwgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHRvIHRoZSBzZXJ2ZXIgc3RpbGwgZ2V0CisJICogc2VydmVkLCBidXQgbm8gbmV3IGNvbm5lY3Rpb24gaXMgYXNzaWduZWQgdG8gdGhlIHNlcnZlci4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID09IDApCisJCQljb250aW51ZTsKKwkJZG9oID0gaXBfdnNfbGNfZGVzdF9vdmVyaGVhZChkZXN0KTsKKwkJaWYgKCFsZWFzdCB8fCBkb2ggPCBsb2gpIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJfQorCX0KKworCWlmIChsZWFzdCkKKwlJUF9WU19EQkdfQlVGKDYsICJMQzogc2VydmVyICVzOiV1IGFjdGl2ZWNvbm5zICVkIGluYWN0Y29ubnMgJWRcbiIsCisJCSAgICAgIElQX1ZTX0RCR19BRERSKHN2Yy0+YWYsICZsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgICAgIGF0b21pY19yZWFkKCZsZWFzdC0+aW5hY3Rjb25ucykpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX2xjX3NjaGVkdWxlciA9IHsKKwkubmFtZSA9CQkJImxjIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19sY19zY2hlZHVsZXIubl9saXN0KSwKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCS5zdXBwb3J0c19pcHY2ID0JMSwKKyNlbmRpZgorCS5zY2hlZHVsZSA9CQlpcF92c19sY19zY2hlZHVsZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaXBfdnNfbGNfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX2xjX3NjaGVkdWxlcikgOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbGNfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19sY19zY2hlZHVsZXIpOworfQorCittb2R1bGVfaW5pdChpcF92c19sY19pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX2xjX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25xLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJkODAzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25xLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBJUFZTOiAgICAgICAgTmV2ZXIgUXVldWUgc2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKy8qCisgKiBUaGUgTlEgYWxnb3JpdGhtIGFkb3B0cyBhIHR3by1zcGVlZCBtb2RlbC4gV2hlbiB0aGVyZSBpcyBhbiBpZGxlIHNlcnZlcgorICogYXZhaWxhYmxlLCB0aGUgam9iIHdpbGwgYmUgc2VudCB0byB0aGUgaWRsZSBzZXJ2ZXIsIGluc3RlYWQgb2Ygd2FpdGluZworICogZm9yIGEgZmFzdCBvbmUuIFdoZW4gdGhlcmUgaXMgbm8gaWRsZSBzZXJ2ZXIgYXZhaWxhYmxlLCB0aGUgam9iIHdpbGwgYmUKKyAqIHNlbnQgdG8gdGhlIHNlcnZlciB0aGF0IG1pbmltaXplIGl0cyBleHBlY3RlZCBkZWxheSAoVGhlIFNob3J0ZXN0CisgKiBFeHBlY3RlZCBEZWxheSBzY2hlZHVsaW5nIGFsZ29yaXRobSkuCisgKgorICogU2VlIHRoZSBmb2xsb3dpbmcgcGFwZXIgZm9yIG1vcmUgaW5mb3JtYXRpb246CisgKiBBLiBXZWlucmliIGFuZCBTLiBTaGVua2VyLCBHcmVlZCBpcyBub3QgZW5vdWdoOiBBZGFwdGl2ZSBsb2FkIHNoYXJpbmcKKyAqIGluIGxhcmdlIGhldGVyb2dlbmVvdXMgc3lzdGVtcy4gSW4gUHJvY2VlZGluZ3MgSUVFRSBJTkZPQ09NJzg4LAorICogcGFnZXMgOTg2LTk5NCwgMTk4OC4KKyAqCisgKiBUaGFua3MgbXVzdCBnbyB0byBNYXJrbyBCdXVyaSA8bWFya29AYnV1cmkubmFtZT4gZm9yIHRhbGtpbmcgTlEgdG8gbWUuCisgKgorICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBOUSBhbmQgU0VEIGlzIHRoYXQgTlEgY2FuIGltcHJvdmUgb3ZlcmFsbAorICogc3lzdGVtIHV0aWxpemF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAoraXBfdnNfbnFfZGVzdF9vdmVyaGVhZChzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKK3sKKwkvKgorCSAqIFdlIG9ubHkgdXNlIHRoZSBhY3RpdmUgY29ubmVjdGlvbiBudW1iZXIgaW4gdGhlIGNvc3QKKwkgKiBjYWxjdWxhdGlvbiBoZXJlLgorCSAqLworCXJldHVybiBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpICsgMTsKK30KKworCisvKgorICoJV2VpZ2h0ZWQgTGVhc3QgQ29ubmVjdGlvbiBzY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19ucV9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCBsb2ggPSAwLCBkb2g7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX25xX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJLyoKKwkgKiBXZSBjYWxjdWxhdGUgdGhlIGxvYWQgb2YgZWFjaCBkZXN0IHNlcnZlciBhcyBmb2xsb3dzOgorCSAqCShzZXJ2ZXIgZXhwZWN0ZWQgb3ZlcmhlYWQpIC8gZGVzdC0+d2VpZ2h0CisJICoKKwkgKiBSZW1lbWJlciAtLSBubyBmbG9hdHMgaW4ga2VybmVsIG1vZGUhISEKKwkgKiBUaGUgY29tcGFyaXNvbiBvZiBoMSp3MiA+IGgyKncxIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBvZgorCSAqCQkgIGgxL3cxID4gaDIvdzIKKwkgKiBpZiBldmVyeSB3ZWlnaHQgaXMgbGFyZ2VyIHRoYW4gemVyby4KKwkgKgorCSAqIFRoZSBzZXJ2ZXIgd2l0aCB3ZWlnaHQ9MCBpcyBxdWllc2NlZCBhbmQgd2lsbCBub3QgcmVjZWl2ZSBhbnkKKwkgKiBuZXcgY29ubmVjdGlvbnMuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisKKwkJaWYgKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEIHx8CisJCSAgICAhYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkpCisJCQljb250aW51ZTsKKworCQlkb2ggPSBpcF92c19ucV9kZXN0X292ZXJoZWFkKGRlc3QpOworCisJCS8qIHJldHVybiB0aGUgc2VydmVyIGRpcmVjdGx5IGlmIGl0IGlzIGlkbGUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgPT0gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gZG9oOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIWxlYXN0IHx8CisJCSAgICAobG9oICogYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPgorCQkgICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkpIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJfQorCX0KKworCWlmICghbGVhc3QpCisJCXJldHVybiBOVUxMOworCisgIG91dDoKKwlJUF9WU19EQkdfQlVGKDYsICJOUTogc2VydmVyICVzOiV1ICIKKwkJICAgICAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgICAgIElQX1ZTX0RCR19BRERSKHN2Yy0+YWYsICZsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgICAgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX25xX3NjaGVkdWxlciA9Cit7CisJLm5hbWUgPQkJCSJucSIsCisJLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfbnFfc2NoZWR1bGVyLm5fbGlzdCksCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkuc3VwcG9ydHNfaXB2NiA9CTEsCisjZW5kaWYKKwkuc2NoZWR1bGUgPQkJaXBfdnNfbnFfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX25xX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19ucV9zY2hlZHVsZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfbnFfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19ucV9zY2hlZHVsZXIpOworfQorCittb2R1bGVfaW5pdChpcF92c19ucV9pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX25xX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzkxZjllCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvLmMKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiBpcF92c19wcm90by5jOiB0cmFuc3BvcnQgcHJvdG9jb2wgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVBWUworICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKKy8qCisgKiBJUFZTIHByb3RvY29scyBjYW4gb25seSBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCB3aGVuIHRoZSBpcHZzCisgKiBtb2R1bGUgaXMgbG9hZGVkL3VubG9hZGVkLCBzbyBubyBsb2NrIGlzIG5lZWRlZCBpbiBhY2Nlc3NpbmcgdGhlCisgKiBpcHZzIHByb3RvY29sIHRhYmxlLgorICovCisKKyNkZWZpbmUgSVBfVlNfUFJPVE9fVEFCX1NJWkUJCTMyCS8qIG11c3QgYmUgcG93ZXIgb2YgMiAqLworI2RlZmluZSBJUF9WU19QUk9UT19IQVNIKHByb3RvKQkJKChwcm90bykgJiAoSVBfVlNfUFJPVE9fVEFCX1NJWkUtMSkpCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKmlwX3ZzX3Byb3RvX3RhYmxlW0lQX1ZTX1BST1RPX1RBQl9TSVpFXTsKKworCisvKgorICoJcmVnaXN0ZXIgYW4gaXB2cyBwcm90b2NvbAorICovCitzdGF0aWMgaW50IF9fdXNlZCBfX2luaXQgcmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2woc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwl1bnNpZ25lZCBoYXNoID0gSVBfVlNfUFJPVE9fSEFTSChwcC0+cHJvdG9jb2wpOworCisJcHAtPm5leHQgPSBpcF92c19wcm90b190YWJsZVtoYXNoXTsKKwlpcF92c19wcm90b190YWJsZVtoYXNoXSA9IHBwOworCisJaWYgKHBwLT5pbml0ICE9IE5VTEwpCisJCXBwLT5pbml0KHBwKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKgl1bnJlZ2lzdGVyIGFuIGlwdnMgcHJvdG9jb2wKKyAqLworc3RhdGljIGludCB1bnJlZ2lzdGVyX2lwX3ZzX3Byb3RvY29sKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICoqcHBfcDsKKwl1bnNpZ25lZCBoYXNoID0gSVBfVlNfUFJPVE9fSEFTSChwcC0+cHJvdG9jb2wpOworCisJcHBfcCA9ICZpcF92c19wcm90b190YWJsZVtoYXNoXTsKKwlmb3IgKDsgKnBwX3A7IHBwX3AgPSAmKCpwcF9wKS0+bmV4dCkgeworCQlpZiAoKnBwX3AgPT0gcHApIHsKKwkJCSpwcF9wID0gcHAtPm5leHQ7CisJCQlpZiAocHAtPmV4aXQgIT0gTlVMTCkKKwkJCQlwcC0+ZXhpdChwcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRVNSQ0g7Cit9CisKKworLyoKKyAqCWdldCBpcF92c19wcm90b2NvbCBvYmplY3QgYnkgaXRzIHByb3RvLgorICovCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKiBpcF92c19wcm90b19nZXQodW5zaWduZWQgc2hvcnQgcHJvdG8pCit7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwl1bnNpZ25lZCBoYXNoID0gSVBfVlNfUFJPVE9fSEFTSChwcm90byk7CisKKwlmb3IgKHBwID0gaXBfdnNfcHJvdG9fdGFibGVbaGFzaF07IHBwOyBwcCA9IHBwLT5uZXh0KSB7CisJCWlmIChwcC0+cHJvdG9jb2wgPT0gcHJvdG8pCisJCQlyZXR1cm4gcHA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqCVByb3BhZ2F0ZSBldmVudCBmb3Igc3RhdGUgY2hhbmdlIHRvIGFsbCBwcm90b2NvbHMKKyAqLwordm9pZCBpcF92c19wcm90b2NvbF90aW1lb3V0X2NoYW5nZShpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJUF9WU19QUk9UT19UQUJfU0laRTsgaSsrKSB7CisJCWZvciAocHAgPSBpcF92c19wcm90b190YWJsZVtpXTsgcHA7IHBwID0gcHAtPm5leHQpIHsKKwkJCWlmIChwcC0+dGltZW91dF9jaGFuZ2UpCisJCQkJcHAtPnRpbWVvdXRfY2hhbmdlKHBwLCBmbGFncyk7CisJCX0KKwl9Cit9CisKKworaW50ICoKK2lwX3ZzX2NyZWF0ZV90aW1lb3V0X3RhYmxlKGludCAqdGFibGUsIGludCBzaXplKQoreworCXJldHVybiBrbWVtZHVwKHRhYmxlLCBzaXplLCBHRlBfQVRPTUlDKTsKK30KKworCisvKgorICoJU2V0IHRpbWVvdXQgdmFsdWUgZm9yIHN0YXRlIHNwZWNpZmllZCBieSBuYW1lCisgKi8KK2ludAoraXBfdnNfc2V0X3N0YXRlX3RpbWVvdXQoaW50ICp0YWJsZSwgaW50IG51bSwgY2hhciAqKm5hbWVzLCBjaGFyICpuYW1lLCBpbnQgdG8pCit7CisJaW50IGk7CisKKwlpZiAoIXRhYmxlIHx8ICFuYW1lIHx8ICF0bykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKHN0cmNtcChuYW1lc1tpXSwgbmFtZSkpCisJCQljb250aW51ZTsKKwkJdGFibGVbaV0gPSB0byAqIEhaOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKworY29uc3QgY2hhciAqIGlwX3ZzX3N0YXRlX25hbWUoX191MTYgcHJvdG8sIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwID0gaXBfdnNfcHJvdG9fZ2V0KHByb3RvKTsKKworCWlmIChwcCA9PSBOVUxMIHx8IHBwLT5zdGF0ZV9uYW1lID09IE5VTEwpCisJCXJldHVybiAoSVBQUk9UT19JUCA9PSBwcm90bykgPyAiTk9ORSIgOiAiRVJSISI7CisJcmV0dXJuIHBwLT5zdGF0ZV9uYW1lKHN0YXRlKTsKK30KKworCitzdGF0aWMgdm9pZAoraXBfdnNfdGNwdWRwX2RlYnVnX3BhY2tldF92NChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBpbnQgb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICptc2cpCit7CisJY2hhciBidWZbMTI4XTsKKwlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOworCisJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCWlmIChpaCA9PSBOVUxMKQorCQlzcHJpbnRmKGJ1ZiwgIiVzIFRSVU5DQVRFRCIsIHBwLT5uYW1lKTsKKwllbHNlIGlmIChpaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKQorCQlzcHJpbnRmKGJ1ZiwgIiVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSBmcmFnIiwKKwkJCXBwLT5uYW1lLCBOSVBRVUFEKGloLT5zYWRkciksCisJCQlOSVBRVUFEKGloLT5kYWRkcikpOworCWVsc2UgeworCQlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cgorOworCQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0ICsgaWgtPmlobCo0LAorCQkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCQlpZiAocHB0ciA9PSBOVUxMKQorCQkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IiwKKwkJCQlwcC0+bmFtZSwKKwkJCQlOSVBRVUFEKGloLT5zYWRkciksCisJCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICIlcyAldS4ldS4ldS4ldToldS0+JXUuJXUuJXUuJXU6JXUiLAorCQkJCXBwLT5uYW1lLAorCQkJCU5JUFFVQUQoaWgtPnNhZGRyKSwKKwkJCQludG9ocyhwcHRyWzBdKSwKKwkJCQlOSVBRVUFEKGloLT5kYWRkciksCisJCQkJbnRvaHMocHB0clsxXSkpOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKK30KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CitzdGF0aWMgdm9pZAoraXBfdnNfdGNwdWRwX2RlYnVnX3BhY2tldF92NihzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBpbnQgb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICptc2cpCit7CisJY2hhciBidWZbMTkyXTsKKwlzdHJ1Y3QgaXB2NmhkciBfaXBoLCAqaWg7CisKKwlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7CisJaWYgKGloID09IE5VTEwpCisJCXNwcmludGYoYnVmLCAiJXMgVFJVTkNBVEVEIiwgcHAtPm5hbWUpOworCWVsc2UgaWYgKGloLT5uZXh0aGRyID09IElQUFJPVE9fRlJBR01FTlQpCisJCXNwcmludGYoYnVmLCAiJXMgIiBOSVA2X0ZNVCAiLT4iIE5JUDZfRk1UICIgZnJhZyIsCisJCQlwcC0+bmFtZSwgTklQNihpaC0+c2FkZHIpLAorCQkJTklQNihpaC0+ZGFkZHIpKTsKKwllbHNlIHsKKwkJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CisKKwkJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCArIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksCisJCQkJCSAgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJCWlmIChwcHRyID09IE5VTEwpCisJCQlzcHJpbnRmKGJ1ZiwgIiVzIFRSVU5DQVRFRCAiIE5JUDZfRk1UICItPiIgTklQNl9GTVQsCisJCQkJcHAtPm5hbWUsCisJCQkJTklQNihpaC0+c2FkZHIpLAorCQkJCU5JUDYoaWgtPmRhZGRyKSk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmLCAiJXMgIiBOSVA2X0ZNVCAiOiV1LT4iIE5JUDZfRk1UICI6JXUiLAorCQkJCXBwLT5uYW1lLAorCQkJCU5JUDYoaWgtPnNhZGRyKSwKKwkJCQludG9ocyhwcHRyWzBdKSwKKwkJCQlOSVA2KGloLT5kYWRkciksCisJCQkJbnRvaHMocHB0clsxXSkpOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKK30KKyNlbmRpZgorCisKK3ZvaWQKK2lwX3ZzX3RjcHVkcF9kZWJ1Z19wYWNrZXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgaW50IG9mZnNldCwKKwkJCSAgY29uc3QgY2hhciAqbXNnKQoreworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCWlwX3ZzX3RjcHVkcF9kZWJ1Z19wYWNrZXRfdjYocHAsIHNrYiwgb2Zmc2V0LCBtc2cpOworCWVsc2UKKyNlbmRpZgorCQlpcF92c190Y3B1ZHBfZGVidWdfcGFja2V0X3Y0KHBwLCBza2IsIG9mZnNldCwgbXNnKTsKK30KKworCitpbnQgX19pbml0IGlwX3ZzX3Byb3RvY29sX2luaXQodm9pZCkKK3sKKwljaGFyIHByb3RvY29sc1s2NF07CisjZGVmaW5lIFJFR0lTVEVSX1BST1RPQ09MKHApCQkJXAorCWRvIHsJCQkJCVwKKwkJcmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2wocCk7CVwKKwkJc3RyY2F0KHByb3RvY29scywgIiwgIik7CVwKKwkJc3RyY2F0KHByb3RvY29scywgKHApLT5uYW1lKTsJXAorCX0gd2hpbGUgKDApCisKKwlwcm90b2NvbHNbMF0gPSAnXDAnOworCXByb3RvY29sc1syXSA9ICdcMCc7CisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1RDUAorCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF90Y3ApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX1VEUAorCVJFR0lTVEVSX1BST1RPQ09MKCZpcF92c19wcm90b2NvbF91ZHApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX0FICisJUkVHSVNURVJfUFJPVE9DT0woJmlwX3ZzX3Byb3RvY29sX2FoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUF9WU19QUk9UT19FU1AKKwlSRUdJU1RFUl9QUk9UT0NPTCgmaXBfdnNfcHJvdG9jb2xfZXNwKTsKKyNlbmRpZgorCUlQX1ZTX0lORk8oIlJlZ2lzdGVyZWQgcHJvdG9jb2xzICglcylcbiIsICZwcm90b2NvbHNbMl0pOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBpcF92c19wcm90b2NvbF9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwlpbnQgaTsKKworCS8qIHVucmVnaXN0ZXIgYWxsIHRoZSBpcHZzIHByb3RvY29scyAqLworCWZvciAoaSA9IDA7IGkgPCBJUF9WU19QUk9UT19UQUJfU0laRTsgaSsrKSB7CisJCXdoaWxlICgocHAgPSBpcF92c19wcm90b190YWJsZVtpXSkgIT0gTlVMTCkKKwkJCXVucmVnaXN0ZXJfaXBfdnNfcHJvdG9jb2wocHApOworCX0KK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b19haF9lc3AuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b19haF9lc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFiMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX2FoX2VzcC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogaXBfdnNfcHJvdG9fYWhfZXNwLmM6CUFIL0VTUCBJUFNlYyBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IGZvciBJUFZTCisgKgorICogQXV0aG9yczoJSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPiwgRmVicnVhcnkgMjAwMgorICoJCVdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKiBUT0RPOgorCitzdHJ1Y3QgaXNha21wX2hkciB7CisJX191OAkJaWNvb2tpZVs4XTsKKwlfX3U4CQlyY29va2llWzhdOworCV9fdTgJCW5wOworCV9fdTgJCXZlcnNpb247CisJX191OAkJeGNoZ3R5cGU7CisJX191OAkJZmxhZ3M7CisJX191MzIJCW1zZ2lkOworCV9fdTMyCQlsZW5ndGg7Cit9OworCisqLworCisjZGVmaW5lIFBPUlRfSVNBS01QCTUwMAorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCithaF9lc3BfY29ubl9pbl9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgICBjb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJICAgaW50IGludmVyc2UpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKKwkJY3AgPSBpcF92c19jb25uX2luX2dldChhZiwgSVBQUk9UT19VRFAsCisJCQkJICAgICAgICZpcGgtPnNhZGRyLAorCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCksCisJCQkJICAgICAgICZpcGgtPmRhZGRyLAorCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCkpOworCX0gZWxzZSB7CisJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoYWYsIElQUFJPVE9fVURQLAorCQkJCSAgICAgICAmaXBoLT5kYWRkciwKKwkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCSAgICAgICAmaXBoLT5zYWRkciwKKwkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9CisKKwlpZiAoIWNwKSB7CisJCS8qCisJCSAqIFdlIGFyZSBub3Qgc3VyZSBpZiB0aGUgcGFja2V0IGlzIGZyb20gb3VyCisJCSAqIHNlcnZpY2UsIHNvIG91ciBjb25uX3NjaGVkdWxlIGhvb2sgc2hvdWxkIHJldHVybiBORl9BQ0NFUFQKKwkJICovCisJCUlQX1ZTX0RCR19CVUYoMTIsICJVbmtub3duIElTQUtNUCBlbnRyeSBmb3Igb3V0aW4gcGFja2V0ICIKKwkJCSAgICAgICIlcyVzICVzLT4lc1xuIiwKKwkJCSAgICAgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCisJCQkgICAgICBwcC0+bmFtZSwKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKGFmLCAmaXBoLT5zYWRkciksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihhZiwgJmlwaC0+ZGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKK2FoX2VzcF9jb25uX291dF9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICAgIGNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLAorCQkgICAgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJICAgIGludCBpbnZlcnNlKQoreworCXN0cnVjdCBpcF92c19jb25uICpjcDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KGFmLCBJUFBST1RPX1VEUCwKKwkJCQkJJmlwaC0+c2FkZHIsCisJCQkJCWh0b25zKFBPUlRfSVNBS01QKSwKKwkJCQkJJmlwaC0+ZGFkZHIsCisJCQkJCWh0b25zKFBPUlRfSVNBS01QKSk7CisJfSBlbHNlIHsKKwkJY3AgPSBpcF92c19jb25uX291dF9nZXQoYWYsIElQUFJPVE9fVURQLAorCQkJCQkmaXBoLT5kYWRkciwKKwkJCQkJaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCQkmaXBoLT5zYWRkciwKKwkJCQkJaHRvbnMoUE9SVF9JU0FLTVApKTsKKwl9CisKKwlpZiAoIWNwKSB7CisJCUlQX1ZTX0RCR19CVUYoMTIsICJVbmtub3duIElTQUtNUCBlbnRyeSBmb3IgaW5vdXQgcGFja2V0ICIKKwkJCSAgICAgICIlcyVzICVzLT4lc1xuIiwKKwkJCSAgICAgIGludmVyc2UgPyAiSUNNUCsiIDogIiIsCisJCQkgICAgICBwcC0+bmFtZSwKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKGFmLCAmaXBoLT5zYWRkciksCisJCQkgICAgICBJUF9WU19EQkdfQUREUihhZiwgJmlwaC0+ZGFkZHIpKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIGludAorYWhfZXNwX2Nvbm5fc2NoZWR1bGUoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgICAgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCit7CisJLyoKKwkgKiBBSC9FU1AgaXMgb25seSByZWxhdGVkIHRyYWZmaWMuIFBhc3MgdGhlIHBhY2tldCB0byBJUCBzdGFjay4KKwkgKi8KKwkqdmVyZGljdCA9IE5GX0FDQ0VQVDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorYWhfZXNwX2RlYnVnX3BhY2tldF92NChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQoreworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKKworCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2lwaCksICZfaXBoKTsKKwlpZiAoaWggPT0gTlVMTCkKKwkJc3ByaW50ZihidWYsICIlcyBUUlVOQ0FURUQiLCBwcC0+bmFtZSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIiVzICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSIsCisJCQlwcC0+bmFtZSwgTklQUVVBRChpaC0+c2FkZHIpLAorCQkJTklQUVVBRChpaC0+ZGFkZHIpKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJUFZTOiAlczogJXNcbiIsIG1zZywgYnVmKTsKK30KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CitzdGF0aWMgdm9pZAorYWhfZXNwX2RlYnVnX3BhY2tldF92NihzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgaW50IG9mZnNldCwgY29uc3QgY2hhciAqbXNnKQoreworCWNoYXIgYnVmWzI1Nl07CisJc3RydWN0IGlwdjZoZHIgX2lwaCwgKmloOworCisJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCWlmIChpaCA9PSBOVUxMKQorCQlzcHJpbnRmKGJ1ZiwgIiVzIFRSVU5DQVRFRCIsIHBwLT5uYW1lKTsKKwllbHNlCisJCXNwcmludGYoYnVmLCAiJXMgIiBOSVA2X0ZNVCAiLT4iIE5JUDZfRk1ULAorCQkJcHAtPm5hbWUsIE5JUDYoaWgtPnNhZGRyKSwKKwkJCU5JUDYoaWgtPmRhZGRyKSk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSVBWUzogJXM6ICVzXG4iLCBtc2csIGJ1Zik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2FoX2VzcF9kZWJ1Z19wYWNrZXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQlhaF9lc3BfZGVidWdfcGFja2V0X3Y2KHBwLCBza2IsIG9mZnNldCwgbXNnKTsKKwllbHNlCisjZW5kaWYKKwkJYWhfZXNwX2RlYnVnX3BhY2tldF92NChwcCwgc2tiLCBvZmZzZXQsIG1zZyk7Cit9CisKKworc3RhdGljIHZvaWQgYWhfZXNwX2luaXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwkvKiBub3RoaW5nIHRvIGRvIG5vdyAqLworfQorCisKK3N0YXRpYyB2b2lkIGFoX2VzcF9leGl0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJLyogbm90aGluZyB0byBkbyBub3cgKi8KK30KKworCisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX0FICitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfYWggPSB7CisJLm5hbWUgPQkJCSJBSCIsCisJLnByb3RvY29sID0JCUlQUFJPVE9fQUgsCisJLm51bV9zdGF0ZXMgPQkJMSwKKwkuZG9udF9kZWZyYWcgPQkJMSwKKwkuaW5pdCA9CQkJYWhfZXNwX2luaXQsCisJLmV4aXQgPQkJCWFoX2VzcF9leGl0LAorCS5jb25uX3NjaGVkdWxlID0JYWhfZXNwX2Nvbm5fc2NoZWR1bGUsCisJLmNvbm5faW5fZ2V0ID0JCWFoX2VzcF9jb25uX2luX2dldCwKKwkuY29ubl9vdXRfZ2V0ID0JCWFoX2VzcF9jb25uX291dF9nZXQsCisJLnNuYXRfaGFuZGxlciA9CQlOVUxMLAorCS5kbmF0X2hhbmRsZXIgPQkJTlVMTCwKKwkuY3N1bV9jaGVjayA9CQlOVUxMLAorCS5zdGF0ZV90cmFuc2l0aW9uID0JTlVMTCwKKwkucmVnaXN0ZXJfYXBwID0JCU5VTEwsCisJLnVucmVnaXN0ZXJfYXBwID0JTlVMTCwKKwkuYXBwX2Nvbm5fYmluZCA9CU5VTEwsCisJLmRlYnVnX3BhY2tldCA9CQlhaF9lc3BfZGVidWdfcGFja2V0LAorCS50aW1lb3V0X2NoYW5nZSA9CU5VTEwsCQkvKiBJU0FLTVAgKi8KKwkuc2V0X3N0YXRlX3RpbWVvdXQgPQlOVUxMLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lQX1ZTX1BST1RPX0VTUAorc3RydWN0IGlwX3ZzX3Byb3RvY29sIGlwX3ZzX3Byb3RvY29sX2VzcCA9IHsKKwkubmFtZSA9CQkJIkVTUCIsCisJLnByb3RvY29sID0JCUlQUFJPVE9fRVNQLAorCS5udW1fc3RhdGVzID0JCTEsCisJLmRvbnRfZGVmcmFnID0JCTEsCisJLmluaXQgPQkJCWFoX2VzcF9pbml0LAorCS5leGl0ID0JCQlhaF9lc3BfZXhpdCwKKwkuY29ubl9zY2hlZHVsZSA9CWFoX2VzcF9jb25uX3NjaGVkdWxlLAorCS5jb25uX2luX2dldCA9CQlhaF9lc3BfY29ubl9pbl9nZXQsCisJLmNvbm5fb3V0X2dldCA9CQlhaF9lc3BfY29ubl9vdXRfZ2V0LAorCS5zbmF0X2hhbmRsZXIgPQkJTlVMTCwKKwkuZG5hdF9oYW5kbGVyID0JCU5VTEwsCisJLmNzdW1fY2hlY2sgPQkJTlVMTCwKKwkuc3RhdGVfdHJhbnNpdGlvbiA9CU5VTEwsCisJLnJlZ2lzdGVyX2FwcCA9CQlOVUxMLAorCS51bnJlZ2lzdGVyX2FwcCA9CU5VTEwsCisJLmFwcF9jb25uX2JpbmQgPQlOVUxMLAorCS5kZWJ1Z19wYWNrZXQgPQkJYWhfZXNwX2RlYnVnX3BhY2tldCwKKwkudGltZW91dF9jaGFuZ2UgPQlOVUxMLAkJLyogSVNBS01QICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0NTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYwpAQCAtMCwwICsxLDczMiBAQAorLyoKKyAqIGlwX3ZzX3Byb3RvX3RjcC5jOglUQ1AgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydCBmb3IgSVBWUworICoKKyAqIEF1dGhvcnM6ICAgICBXZW5zb25nIFpoYW5nIDx3ZW5zb25nQGxpbnV4dmlydHVhbHNlcnZlci5vcmc+CisgKiAgICAgICAgICAgICAgSnVsaWFuIEFuYXN0YXNvdiA8amFAc3NpLmJnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPiAgICAgICAgICAgICAgICAgIC8qIGZvciB0Y3BoZHIgKi8KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+ICAgICAgICAgICAgICAgICAgICAvKiBmb3IgY3N1bV90Y3B1ZHBfbWFnaWMgKi8KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCit0Y3BfY29ubl9pbl9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQljb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJaW50IGludmVyc2UpCit7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CisKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9fb2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlpZiAocHB0ciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsaWtlbHkoIWludmVyc2UpKSB7CisJCXJldHVybiBpcF92c19jb25uX2luX2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICZpcGgtPnNhZGRyLCBwcHRyWzBdLAorCQkJCQkgJmlwaC0+ZGFkZHIsIHBwdHJbMV0pOworCX0gZWxzZSB7CisJCXJldHVybiBpcF92c19jb25uX2luX2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICZpcGgtPmRhZGRyLCBwcHRyWzFdLAorCQkJCQkgJmlwaC0+c2FkZHIsIHBwdHJbMF0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcF92c19jb25uICoKK3RjcF9jb25uX291dF9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgY29uc3Qgc3RydWN0IGlwX3ZzX2lwaGRyICppcGgsIHVuc2lnbmVkIGludCBwcm90b19vZmYsCisJCSBpbnQgaW52ZXJzZSkKK3sKKwlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKKworCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b19vZmYsIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOworCWlmIChwcHRyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICAmaXBoLT5zYWRkciwgcHB0clswXSwKKwkJCQkJICAmaXBoLT5kYWRkciwgcHB0clsxXSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJICAmaXBoLT5kYWRkciwgcHB0clsxXSwKKwkJCQkJICAmaXBoLT5zYWRkciwgcHB0clswXSk7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK3RjcF9jb25uX3NjaGVkdWxlKGludCBhZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJICBpbnQgKnZlcmRpY3QsIHN0cnVjdCBpcF92c19jb25uICoqY3BwKQoreworCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCXN0cnVjdCBpcF92c19pcGhkciBpcGg7CisKKwlpcF92c19maWxsX2lwaGRyKGFmLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgJmlwaCk7CisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC5sZW4sIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpIHsKKwkJKnZlcmRpY3QgPSBORl9EUk9QOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGgtPnN5biAmJgorCSAgICAoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoYWYsIHNrYi0+bWFyaywgaXBoLnByb3RvY29sLCAmaXBoLmRhZGRyLAorCQkJCSAgICAgdGgtPmRlc3QpKSkgeworCQlpZiAoaXBfdnNfdG9kcm9wKCkpIHsKKwkJCS8qCisJCQkgKiBJdCBzZWVtcyB0aGF0IHdlIGFyZSB2ZXJ5IGxvYWRlZC4KKwkJCSAqIFdlIGhhdmUgdG8gZHJvcCB0aGlzIHBhY2tldCA6KAorCQkJICovCisJCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCQkJKnZlcmRpY3QgPSBORl9EUk9QOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBMZXQgdGhlIHZpcnR1YWwgc2VydmVyIHNlbGVjdCBhIHJlYWwgc2VydmVyIGZvciB0aGUKKwkJICogaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kIGNyZWF0ZSBhIGNvbm5lY3Rpb24gZW50cnkuCisJCSAqLworCQkqY3BwID0gaXBfdnNfc2NoZWR1bGUoc3ZjLCBza2IpOworCQlpZiAoISpjcHApIHsKKwkJCSp2ZXJkaWN0ID0gaXBfdnNfbGVhdmUoc3ZjLCBza2IsIHBwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordGNwX2Zhc3RfY3N1bV91cGRhdGUoaW50IGFmLCBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAorCQkgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqb2xkaXAsCisJCSAgICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpuZXdpcCwKKwkJICAgICBfX2JlMTYgb2xkcG9ydCwgX19iZTE2IG5ld3BvcnQpCit7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCXRjcGgtPmNoZWNrID0KKwkJCWNzdW1fZm9sZChpcF92c19jaGVja19kaWZmMTYob2xkaXAtPmlwNiwgbmV3aXAtPmlwNiwKKwkJCQkJIGlwX3ZzX2NoZWNrX2RpZmYyKG9sZHBvcnQsIG5ld3BvcnQsCisJCQkJCQl+Y3N1bV91bmZvbGQodGNwaC0+Y2hlY2spKSkpOworCWVsc2UKKyNlbmRpZgorCXRjcGgtPmNoZWNrID0KKwkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmY0KG9sZGlwLT5pcCwgbmV3aXAtPmlwLAorCQkJCSBpcF92c19jaGVja19kaWZmMihvbGRwb3J0LCBuZXdwb3J0LAorCQkJCQkJfmNzdW1fdW5mb2xkKHRjcGgtPmNoZWNrKSkpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK3RjcF9wYXJ0aWFsX2NzdW1fdXBkYXRlKGludCBhZiwgc3RydWN0IHRjcGhkciAqdGNwaCwKKwkJICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKm9sZGlwLAorCQkgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqbmV3aXAsCisJCSAgICAgX19iZTE2IG9sZGxlbiwgX19iZTE2IG5ld2xlbikKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJdGNwaC0+Y2hlY2sgPQorCQkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmYxNihvbGRpcC0+aXA2LCBuZXdpcC0+aXA2LAorCQkJCQkgaXBfdnNfY2hlY2tfZGlmZjIob2xkbGVuLCBuZXdsZW4sCisJCQkJCQl+Y3N1bV91bmZvbGQodGNwaC0+Y2hlY2spKSkpOworCWVsc2UKKyNlbmRpZgorCXRjcGgtPmNoZWNrID0KKwkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmY0KG9sZGlwLT5pcCwgbmV3aXAtPmlwLAorCQkJCWlwX3ZzX2NoZWNrX2RpZmYyKG9sZGxlbiwgbmV3bGVuLAorCQkJCQkJfmNzdW1fdW5mb2xkKHRjcGgtPmNoZWNrKSkpKTsKK30KKworCitzdGF0aWMgaW50Cit0Y3Bfc25hdF9oYW5kbGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IHRjcGhkciAqdGNwaDsKKwl1bnNpZ25lZCBpbnQgdGNwaG9mZjsKKwlpbnQgb2xkbGVuOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoY3AtPmFmID09IEFGX0lORVQ2KQorCQl0Y3Bob2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwllbHNlCisjZW5kaWYKKwkJdGNwaG9mZiA9IGlwX2hkcmxlbihza2IpOworCW9sZGxlbiA9IHNrYi0+bGVuIC0gdGNwaG9mZjsKKworCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHRjcGhvZmYrc2l6ZW9mKCp0Y3BoKSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpIHsKKwkJLyogU29tZSBjaGVja3MgYmVmb3JlIG1hbmdsaW5nICovCisJCWlmIChwcC0+Y3N1bV9jaGVjayAmJiAhcHAtPmNzdW1fY2hlY2soY3AtPmFmLCBza2IsIHBwKSkKKwkJCXJldHVybiAwOworCisJCS8qIENhbGwgYXBwbGljYXRpb24gaGVscGVyIGlmIG5lZWRlZCAqLworCQlpZiAoIWlwX3ZzX2FwcF9wa3Rfb3V0KGNwLCBza2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJdGNwaCA9ICh2b2lkICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB0Y3Bob2ZmOworCXRjcGgtPnNvdXJjZSA9IGNwLT52cG9ydDsKKworCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW1zICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJdGNwX3BhcnRpYWxfY3N1bV91cGRhdGUoY3AtPmFmLCB0Y3BoLCAmY3AtPmRhZGRyLCAmY3AtPnZhZGRyLAorCQkJCQlodG9ubChvbGRsZW4pLAorCQkJCQlodG9ubChza2ItPmxlbiAtIHRjcGhvZmYpKTsKKwl9IGVsc2UgaWYgKCFjcC0+YXBwKSB7CisJCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLworCQl0Y3BfZmFzdF9jc3VtX3VwZGF0ZShjcC0+YWYsIHRjcGgsICZjcC0+ZGFkZHIsICZjcC0+dmFkZHIsCisJCQkJICAgICBjcC0+ZHBvcnQsIGNwLT52cG9ydCk7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9IGVsc2UgeworCQkvKiBmdWxsIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisJCXRjcGgtPmNoZWNrID0gMDsKKwkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdGNwaG9mZiwgc2tiLT5sZW4gLSB0Y3Bob2ZmLCAwKTsKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCQlpZiAoY3AtPmFmID09IEFGX0lORVQ2KQorCQkJdGNwaC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmNwLT52YWRkci5pbjYsCisJCQkJCQkgICAgICAmY3AtPmNhZGRyLmluNiwKKwkJCQkJCSAgICAgIHNrYi0+bGVuIC0gdGNwaG9mZiwKKwkJCQkJCSAgICAgIGNwLT5wcm90b2NvbCwgc2tiLT5jc3VtKTsKKwkJZWxzZQorI2VuZGlmCisJCQl0Y3BoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT52YWRkci5pcCwKKwkJCQkJCQljcC0+Y2FkZHIuaXAsCisJCQkJCQkJc2tiLT5sZW4gLSB0Y3Bob2ZmLAorCQkJCQkJCWNwLT5wcm90b2NvbCwKKwkJCQkJCQlza2ItPmNzdW0pOworCisJCUlQX1ZTX0RCRygxMSwgIk8tcGt0OiAlcyBPLWNzdW09JWQgKCslemQpXG4iLAorCQkJICBwcC0+bmFtZSwgdGNwaC0+Y2hlY2ssCisJCQkgIChjaGFyKikmKHRjcGgtPmNoZWNrKSAtIChjaGFyKil0Y3BoKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAordGNwX2RuYXRfaGFuZGxlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CisJdW5zaWduZWQgaW50IHRjcGhvZmY7CisJaW50IG9sZGxlbjsKKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJaWYgKGNwLT5hZiA9PSBBRl9JTkVUNikKKwkJdGNwaG9mZiA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJZWxzZQorI2VuZGlmCisJCXRjcGhvZmYgPSBpcF9oZHJsZW4oc2tiKTsKKwlvbGRsZW4gPSBza2ItPmxlbiAtIHRjcGhvZmY7CisKKwkvKiBjc3VtX2NoZWNrIHJlcXVpcmVzIHVuc2hhcmVkIHNrYiAqLworCWlmICghc2tiX21ha2Vfd3JpdGFibGUoc2tiLCB0Y3Bob2ZmK3NpemVvZigqdGNwaCkpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShjcC0+YXBwICE9IE5VTEwpKSB7CisJCS8qIFNvbWUgY2hlY2tzIGJlZm9yZSBtYW5nbGluZyAqLworCQlpZiAocHAtPmNzdW1fY2hlY2sgJiYgIXBwLT5jc3VtX2NoZWNrKGNwLT5hZiwgc2tiLCBwcCkpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKglBdHRlbXB0IGlwX3ZzX2FwcCBjYWxsLgorCQkgKglJdCB3aWxsIGZpeCBpcF92c19jb25uIGFuZCBpcGggYWNrX3NlcSBzdHVmZgorCQkgKi8KKwkJaWYgKCFpcF92c19hcHBfcGt0X2luKGNwLCBza2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJdGNwaCA9ICh2b2lkICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB0Y3Bob2ZmOworCXRjcGgtPmRlc3QgPSBjcC0+ZHBvcnQ7CisKKwkvKgorCSAqCUFkanVzdCBUQ1AgY2hlY2tzdW1zCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJdGNwX3BhcnRpYWxfY3N1bV91cGRhdGUoY3AtPmFmLCB0Y3BoLCAmY3AtPmRhZGRyLCAmY3AtPnZhZGRyLAorCQkJCQlodG9ubChvbGRsZW4pLAorCQkJCQlodG9ubChza2ItPmxlbiAtIHRjcGhvZmYpKTsKKwl9IGVsc2UgaWYgKCFjcC0+YXBwKSB7CisJCS8qIE9ubHkgcG9ydCBhbmQgYWRkciBhcmUgY2hhbmdlZCwgZG8gZmFzdCBjc3VtIHVwZGF0ZSAqLworCQl0Y3BfZmFzdF9jc3VtX3VwZGF0ZShjcC0+YWYsIHRjcGgsICZjcC0+dmFkZHIsICZjcC0+ZGFkZHIsCisJCQkJICAgICBjcC0+dnBvcnQsIGNwLT5kcG9ydCk7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwl9IGVsc2UgeworCQkvKiBmdWxsIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisJCXRjcGgtPmNoZWNrID0gMDsKKwkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdGNwaG9mZiwgc2tiLT5sZW4gLSB0Y3Bob2ZmLCAwKTsKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCQlpZiAoY3AtPmFmID09IEFGX0lORVQ2KQorCQkJdGNwaC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmNwLT5jYWRkci5pbjYsCisJCQkJCQkgICAgICAmY3AtPmRhZGRyLmluNiwKKwkJCQkJCSAgICAgIHNrYi0+bGVuIC0gdGNwaG9mZiwKKwkJCQkJCSAgICAgIGNwLT5wcm90b2NvbCwgc2tiLT5jc3VtKTsKKwkJZWxzZQorI2VuZGlmCisJCQl0Y3BoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGNwLT5jYWRkci5pcCwKKwkJCQkJCQljcC0+ZGFkZHIuaXAsCisJCQkJCQkJc2tiLT5sZW4gLSB0Y3Bob2ZmLAorCQkJCQkJCWNwLT5wcm90b2NvbCwKKwkJCQkJCQlza2ItPmNzdW0pOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50Cit0Y3BfY3N1bV9jaGVjayhpbnQgYWYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJdW5zaWduZWQgaW50IHRjcGhvZmY7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJdGNwaG9mZiA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJZWxzZQorI2VuZGlmCisJCXRjcGhvZmYgPSBpcF9oZHJsZW4oc2tiKTsKKworCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKKwljYXNlIENIRUNLU1VNX05PTkU6CisJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHRjcGhvZmYsIHNrYi0+bGVuIC0gdGNwaG9mZiwgMCk7CisJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCQlpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKwkJCWlmIChjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkgICAgc2tiLT5sZW4gLSB0Y3Bob2ZmLAorCQkJCQkgICAgaXB2Nl9oZHIoc2tiKS0+bmV4dGhkciwKKwkJCQkJICAgIHNrYi0+Y3N1bSkpIHsKKwkJCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsCisJCQkJCQkgIkZhaWxlZCBjaGVja3N1bSBmb3IiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChjc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCSAgICAgIGlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkJICAgICAgc2tiLT5sZW4gLSB0Y3Bob2ZmLAorCQkJCQkgICAgICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCisJCQkJCSAgICAgIHNrYi0+Y3N1bSkpIHsKKwkJCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsCisJCQkJCQkgIkZhaWxlZCBjaGVja3N1bSBmb3IiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogTm8gbmVlZCB0byBjaGVja3N1bS4gKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKworI2RlZmluZSBUQ1BfRElSX0lOUFVUCQkwCisjZGVmaW5lIFRDUF9ESVJfT1VUUFVUCQk0CisjZGVmaW5lIFRDUF9ESVJfSU5QVVRfT05MWQk4CisKK3N0YXRpYyBjb25zdCBpbnQgdGNwX3N0YXRlX29mZltJUF9WU19ESVJfTEFTVF0gPSB7CisJW0lQX1ZTX0RJUl9JTlBVVF0JCT0JVENQX0RJUl9JTlBVVCwKKwlbSVBfVlNfRElSX09VVFBVVF0JCT0JVENQX0RJUl9PVVRQVVQsCisJW0lQX1ZTX0RJUl9JTlBVVF9PTkxZXQkJPQlUQ1BfRElSX0lOUFVUX09OTFksCit9OworCisvKgorICoJVGltZW91dCB0YWJsZVtzdGF0ZV0KKyAqLworc3RhdGljIGludCB0Y3BfdGltZW91dHNbSVBfVlNfVENQX1NfTEFTVCsxXSA9IHsKKwlbSVBfVlNfVENQX1NfTk9ORV0JCT0JMipIWiwKKwlbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCT0JMTUqNjAqSFosCisJW0lQX1ZTX1RDUF9TX1NZTl9TRU5UXQkJPQkyKjYwKkhaLAorCVtJUF9WU19UQ1BfU19TWU5fUkVDVl0JCT0JMSo2MCpIWiwKKwlbSVBfVlNfVENQX1NfRklOX1dBSVRdCQk9CTIqNjAqSFosCisJW0lQX1ZTX1RDUF9TX1RJTUVfV0FJVF0JCT0JMio2MCpIWiwKKwlbSVBfVlNfVENQX1NfQ0xPU0VdCQk9CTEwKkhaLAorCVtJUF9WU19UQ1BfU19DTE9TRV9XQUlUXQk9CTYwKkhaLAorCVtJUF9WU19UQ1BfU19MQVNUX0FDS10JCT0JMzAqSFosCisJW0lQX1ZTX1RDUF9TX0xJU1RFTl0JCT0JMio2MCpIWiwKKwlbSVBfVlNfVENQX1NfU1lOQUNLXQkJPQkxMjAqSFosCisJW0lQX1ZTX1RDUF9TX0xBU1RdCQk9CTIqSFosCit9OworCitzdGF0aWMgY2hhciAqIHRjcF9zdGF0ZV9uYW1lX3RhYmxlW0lQX1ZTX1RDUF9TX0xBU1QrMV0gPSB7CisJW0lQX1ZTX1RDUF9TX05PTkVdCQk9CSJOT05FIiwKKwlbSVBfVlNfVENQX1NfRVNUQUJMSVNIRURdCT0JIkVTVEFCTElTSEVEIiwKKwlbSVBfVlNfVENQX1NfU1lOX1NFTlRdCQk9CSJTWU5fU0VOVCIsCisJW0lQX1ZTX1RDUF9TX1NZTl9SRUNWXQkJPQkiU1lOX1JFQ1YiLAorCVtJUF9WU19UQ1BfU19GSU5fV0FJVF0JCT0JIkZJTl9XQUlUIiwKKwlbSVBfVlNfVENQX1NfVElNRV9XQUlUXQkJPQkiVElNRV9XQUlUIiwKKwlbSVBfVlNfVENQX1NfQ0xPU0VdCQk9CSJDTE9TRSIsCisJW0lQX1ZTX1RDUF9TX0NMT1NFX1dBSVRdCT0JIkNMT1NFX1dBSVQiLAorCVtJUF9WU19UQ1BfU19MQVNUX0FDS10JCT0JIkxBU1RfQUNLIiwKKwlbSVBfVlNfVENQX1NfTElTVEVOXQkJPQkiTElTVEVOIiwKKwlbSVBfVlNfVENQX1NfU1lOQUNLXQkJPQkiU1lOQUNLIiwKKwlbSVBfVlNfVENQX1NfTEFTVF0JCT0JIkJVRyEiLAorfTsKKworI2RlZmluZSBzTk8gSVBfVlNfVENQX1NfTk9ORQorI2RlZmluZSBzRVMgSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQKKyNkZWZpbmUgc1NTIElQX1ZTX1RDUF9TX1NZTl9TRU5UCisjZGVmaW5lIHNTUiBJUF9WU19UQ1BfU19TWU5fUkVDVgorI2RlZmluZSBzRlcgSVBfVlNfVENQX1NfRklOX1dBSVQKKyNkZWZpbmUgc1RXIElQX1ZTX1RDUF9TX1RJTUVfV0FJVAorI2RlZmluZSBzQ0wgSVBfVlNfVENQX1NfQ0xPU0UKKyNkZWZpbmUgc0NXIElQX1ZTX1RDUF9TX0NMT1NFX1dBSVQKKyNkZWZpbmUgc0xBIElQX1ZTX1RDUF9TX0xBU1RfQUNLCisjZGVmaW5lIHNMSSBJUF9WU19UQ1BfU19MSVNURU4KKyNkZWZpbmUgc1NBIElQX1ZTX1RDUF9TX1NZTkFDSworCitzdHJ1Y3QgdGNwX3N0YXRlc190IHsKKwlpbnQgbmV4dF9zdGF0ZVtJUF9WU19UQ1BfU19MQVNUXTsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogdGNwX3N0YXRlX25hbWUoaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSA+PSBJUF9WU19UQ1BfU19MQVNUKQorCQlyZXR1cm4gIkVSUiEiOworCXJldHVybiB0Y3Bfc3RhdGVfbmFtZV90YWJsZVtzdGF0ZV0gPyB0Y3Bfc3RhdGVfbmFtZV90YWJsZVtzdGF0ZV0gOiAiPyI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX3N0YXRlc190IHRjcF9zdGF0ZXMgW10gPSB7CisvKglJTlBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NSLCBzRVMsIHNFUywgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IgfX0sCisvKmZpbiovIHt7c0NMLCBzQ1csIHNTUywgc1RXLCBzVFcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0NMLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNDTCwgc0xJLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNDTCwgc1NSLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNMQSwgc0xJLCBzU1IgfX0sCisKKy8qCU9VVFBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NTLCBzRVMsIHNTUywgc1NSLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNTUywgc0xJLCBzU1IgfX0sCisvKmZpbiovIHt7c1RXLCBzRlcsIHNTUywgc1RXLCBzRlcsIHNUVywgc0NMLCBzVFcsIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0VTLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0VTLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNTUywgc0NMLCBzQ0wsIHNUVywgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wgfX0sCisKKy8qCUlOUFVULU9OTFkgKi8KKy8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLworLypzeW4qLyB7e3NTUiwgc0VTLCBzRVMsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSIH19LAorLypmaW4qLyB7e3NDTCwgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1RXIH19LAorLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc0VTIH19LAorLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc0NMIH19LAorfTsKKworc3RhdGljIHN0cnVjdCB0Y3Bfc3RhdGVzX3QgdGNwX3N0YXRlc19kb3MgW10gPSB7CisvKglJTlBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NSLCBzRVMsIHNFUywgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU1IsIHNTUiwgc1NSLCBzU0EgfX0sCisvKmZpbiovIHt7c0NMLCBzQ1csIHNTUywgc1RXLCBzVFcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0xJLCBzU0EgfX0sCisvKmFjayovIHt7c0NMLCBzRVMsIHNTUywgc1NSLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNDTCwgc0xJLCBzU0EgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNDTCwgc1NSLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNMQSwgc0xJLCBzQ0wgfX0sCisKKy8qCU9VVFBVVCAqLworLyogICAgICAgIHNOTywgc0VTLCBzU1MsIHNTUiwgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1NBCSovCisvKnN5biovIHt7c1NTLCBzRVMsIHNTUywgc1NBLCBzU1MsIHNTUywgc1NTLCBzU1MsIHNTUywgc0xJLCBzU0EgfX0sCisvKmZpbiovIHt7c1RXLCBzRlcsIHNTUywgc1RXLCBzRlcsIHNUVywgc0NMLCBzVFcsIHNMQSwgc0xJLCBzVFcgfX0sCisvKmFjayovIHt7c0VTLCBzRVMsIHNTUywgc0VTLCBzRlcsIHNUVywgc0NMLCBzQ1csIHNMQSwgc0VTLCBzRVMgfX0sCisvKnJzdCovIHt7c0NMLCBzQ0wsIHNTUywgc0NMLCBzQ0wsIHNUVywgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wgfX0sCisKKy8qCUlOUFVULU9OTFkgKi8KKy8qICAgICAgICBzTk8sIHNFUywgc1NTLCBzU1IsIHNGVywgc1RXLCBzQ0wsIHNDVywgc0xBLCBzTEksIHNTQQkqLworLypzeW4qLyB7e3NTQSwgc0VTLCBzRVMsIHNTUiwgc1NBLCBzU0EsIHNTQSwgc1NBLCBzU0EsIHNTQSwgc1NBIH19LAorLypmaW4qLyB7e3NDTCwgc0ZXLCBzU1MsIHNUVywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzTEEsIHNMSSwgc1RXIH19LAorLyphY2sqLyB7e3NDTCwgc0VTLCBzU1MsIHNFUywgc0ZXLCBzVFcsIHNDTCwgc0NXLCBzQ0wsIHNMSSwgc0VTIH19LAorLypyc3QqLyB7e3NDTCwgc0NMLCBzQ0wsIHNTUiwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzTEEsIHNMSSwgc0NMIH19LAorfTsKKworc3RhdGljIHN0cnVjdCB0Y3Bfc3RhdGVzX3QgKnRjcF9zdGF0ZV90YWJsZSA9IHRjcF9zdGF0ZXM7CisKKworc3RhdGljIHZvaWQgdGNwX3RpbWVvdXRfY2hhbmdlKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGludCBmbGFncykKK3sKKwlpbnQgb24gPSAoZmxhZ3MgJiAxKTsJCS8qIHNlY3VyZV90Y3AgKi8KKworCS8qCisJKiogRklYTUU6IGNoYW5nZSBzZWN1cmVfdGNwIHRvIGluZGVwZW5kZW50IHN5c2N0bCB2YXIKKwkqKiBvciBtYWtlIGl0IHBlci1zZXJ2aWNlIG9yIHBlci1hcHAgYmVjYXVzZSBpdCBpcyB2YWxpZAorCSoqIGZvciBtb3N0IGlmIG5vdCBmb3IgYWxsIG9mIHRoZSBhcHBsaWNhdGlvbnMuIFNvbWV0aGluZworCSoqIGxpa2UgImNhcGFiaWxpdGllcyIgKGZsYWdzKSBmb3IgZWFjaCBvYmplY3QuCisJKi8KKwl0Y3Bfc3RhdGVfdGFibGUgPSAob24/IHRjcF9zdGF0ZXNfZG9zIDogdGNwX3N0YXRlcyk7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9zZXRfc3RhdGVfdGltZW91dChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBjaGFyICpzbmFtZSwgaW50IHRvKQoreworCXJldHVybiBpcF92c19zZXRfc3RhdGVfdGltZW91dChwcC0+dGltZW91dF90YWJsZSwgSVBfVlNfVENQX1NfTEFTVCwKKwkJCQkgICAgICAgdGNwX3N0YXRlX25hbWVfdGFibGUsIHNuYW1lLCB0byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zdGF0ZV9pZHgoc3RydWN0IHRjcGhkciAqdGgpCit7CisJaWYgKHRoLT5yc3QpCisJCXJldHVybiAzOworCWlmICh0aC0+c3luKQorCQlyZXR1cm4gMDsKKwlpZiAodGgtPmZpbikKKwkJcmV0dXJuIDE7CisJaWYgKHRoLT5hY2spCisJCXJldHVybiAyOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfdGNwX3N0YXRlKHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkgICAgICBpbnQgZGlyZWN0aW9uLCBzdHJ1Y3QgdGNwaGRyICp0aCkKK3sKKwlpbnQgc3RhdGVfaWR4OworCWludCBuZXdfc3RhdGUgPSBJUF9WU19UQ1BfU19DTE9TRTsKKwlpbnQgc3RhdGVfb2ZmID0gdGNwX3N0YXRlX29mZltkaXJlY3Rpb25dOworCisJLyoKKwkgKiAgICBVcGRhdGUgc3RhdGUgb2Zmc2V0IHRvIElOUFVUX09OTFkgaWYgbmVjZXNzYXJ5CisJICogICAgb3IgZGVsZXRlIE5PX09VVFBVVCBmbGFnIGlmIG91dHB1dCBwYWNrZXQgZGV0ZWN0ZWQKKwkgKi8KKwlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PT1VUUFVUKSB7CisJCWlmIChzdGF0ZV9vZmYgPT0gVENQX0RJUl9PVVRQVVQpCisJCQljcC0+ZmxhZ3MgJj0gfklQX1ZTX0NPTk5fRl9OT09VVFBVVDsKKwkJZWxzZQorCQkJc3RhdGVfb2ZmID0gVENQX0RJUl9JTlBVVF9PTkxZOworCX0KKworCWlmICgoc3RhdGVfaWR4ID0gdGNwX3N0YXRlX2lkeCh0aCkpIDwgMCkgeworCQlJUF9WU19EQkcoOCwgInRjcF9zdGF0ZV9pZHg9JWQhISFcbiIsIHN0YXRlX2lkeCk7CisJCWdvdG8gdGNwX3N0YXRlX291dDsKKwl9CisKKwluZXdfc3RhdGUgPSB0Y3Bfc3RhdGVfdGFibGVbc3RhdGVfb2ZmK3N0YXRlX2lkeF0ubmV4dF9zdGF0ZVtjcC0+c3RhdGVdOworCisgIHRjcF9zdGF0ZV9vdXQ6CisJaWYgKG5ld19zdGF0ZSAhPSBjcC0+c3RhdGUpIHsKKwkJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKworCQlJUF9WU19EQkdfQlVGKDgsICIlcyAlcyBbJWMlYyVjJWNdICVzOiVkLT4iCisJCQkgICAgICAiJXM6JWQgc3RhdGU6ICVzLT4lcyBjb25uLT5yZWZjbnQ6JWRcbiIsCisJCQkgICAgICBwcC0+bmFtZSwKKwkJCSAgICAgICgoc3RhdGVfb2ZmID09IFRDUF9ESVJfT1VUUFVUKSA/CisJCQkgICAgICAgIm91dHB1dCAiIDogImlucHV0ICIpLAorCQkJICAgICAgdGgtPnN5biA/ICdTJyA6ICcuJywKKwkJCSAgICAgIHRoLT5maW4gPyAnRicgOiAnLicsCisJCQkgICAgICB0aC0+YWNrID8gJ0EnIDogJy4nLAorCQkJICAgICAgdGgtPnJzdCA/ICdSJyA6ICcuJywKKwkJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT5kYWRkciksCisJCQkgICAgICBudG9ocyhjcC0+ZHBvcnQpLAorCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3AtPmFmLCAmY3AtPmNhZGRyKSwKKwkJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCQkgICAgICB0Y3Bfc3RhdGVfbmFtZShjcC0+c3RhdGUpLAorCQkJICAgICAgdGNwX3N0YXRlX25hbWUobmV3X3N0YXRlKSwKKwkJCSAgICAgIGF0b21pY19yZWFkKCZjcC0+cmVmY250KSk7CisKKwkJaWYgKGRlc3QpIHsKKwkJCWlmICghKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkgJiYKKwkJCSAgICAobmV3X3N0YXRlICE9IElQX1ZTX1RDUF9TX0VTVEFCTElTSEVEKSkgeworCQkJCWF0b21pY19kZWMoJmRlc3QtPmFjdGl2ZWNvbm5zKTsKKwkJCQlhdG9taWNfaW5jKCZkZXN0LT5pbmFjdGNvbm5zKTsKKwkJCQljcC0+ZmxhZ3MgfD0gSVBfVlNfQ09OTl9GX0lOQUNUSVZFOworCQkJfSBlbHNlIGlmICgoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0lOQUNUSVZFKSAmJgorCQkJCSAgIChuZXdfc3RhdGUgPT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpKSB7CisJCQkJYXRvbWljX2luYygmZGVzdC0+YWN0aXZlY29ubnMpOworCQkJCWF0b21pY19kZWMoJmRlc3QtPmluYWN0Y29ubnMpOworCQkJCWNwLT5mbGFncyAmPSB+SVBfVlNfQ09OTl9GX0lOQUNUSVZFOworCQkJfQorCQl9CisJfQorCisJY3AtPnRpbWVvdXQgPSBwcC0+dGltZW91dF90YWJsZVtjcC0+c3RhdGUgPSBuZXdfc3RhdGVdOworfQorCisKKy8qCisgKglIYW5kbGUgc3RhdGUgdHJhbnNpdGlvbnMKKyAqLworc3RhdGljIGludAordGNwX3N0YXRlX3RyYW5zaXRpb24oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAorCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWludCBpaGwgPSBjcC0+YWYgPT0gQUZfSU5FVCA/IGlwX2hkcmxlbihza2IpIDogc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKyNlbHNlCisJaW50IGlobCA9IGlwX2hkcmxlbihza2IpOworI2VuZGlmCisKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlobCwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwlpZiAodGggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJmNwLT5sb2NrKTsKKwlzZXRfdGNwX3N0YXRlKHBwLCBjcCwgZGlyZWN0aW9uLCB0aCk7CisJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKKworCXJldHVybiAxOworfQorCisKKy8qCisgKglIYXNoIHRhYmxlIGZvciBUQ1AgYXBwbGljYXRpb24gaW5jYXJuYXRpb25zCisgKi8KKyNkZWZpbmUJVENQX0FQUF9UQUJfQklUUwk0CisjZGVmaW5lCVRDUF9BUFBfVEFCX1NJWkUJKDEgPDwgVENQX0FQUF9UQUJfQklUUykKKyNkZWZpbmUJVENQX0FQUF9UQUJfTUFTSwkoVENQX0FQUF9UQUJfU0laRSAtIDEpCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHRjcF9hcHBzW1RDUF9BUFBfVEFCX1NJWkVdOworc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfYXBwX2xvY2spOworCitzdGF0aWMgaW5saW5lIF9fdTE2IHRjcF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKK3sKKwlyZXR1cm4gKCgoX19mb3JjZSB1MTYpcG9ydCA+PiBUQ1BfQVBQX1RBQl9CSVRTKSBeIChfX2ZvcmNlIHUxNilwb3J0KQorCQkmIFRDUF9BUFBfVEFCX01BU0s7Cit9CisKKworc3RhdGljIGludCB0Y3BfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICppOworCV9fdTE2IGhhc2g7CisJX19iZTE2IHBvcnQgPSBpbmMtPnBvcnQ7CisJaW50IHJldCA9IDA7CisKKwloYXNoID0gdGNwX2FwcF9oYXNoa2V5KHBvcnQpOworCisJc3Bpbl9sb2NrX2JoKCZ0Y3BfYXBwX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnRjcF9hcHBzW2hhc2hdLCBwX2xpc3QpIHsKKwkJaWYgKGktPnBvcnQgPT0gcG9ydCkgeworCQkJcmV0ID0gLUVFWElTVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWxpc3RfYWRkKCZpbmMtPnBfbGlzdCwgJnRjcF9hcHBzW2hhc2hdKTsKKwlhdG9taWNfaW5jKCZpcF92c19wcm90b2NvbF90Y3AuYXBwY250KTsKKworICBvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnRjcF9hcHBfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGNwX3VucmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKK3sKKwlzcGluX2xvY2tfYmgoJnRjcF9hcHBfbG9jayk7CisJYXRvbWljX2RlYygmaXBfdnNfcHJvdG9jb2xfdGNwLmFwcGNudCk7CisJbGlzdF9kZWwoJmluYy0+cF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmdGNwX2FwcF9sb2NrKTsKK30KKworCitzdGF0aWMgaW50Cit0Y3BfYXBwX2Nvbm5fYmluZChzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJaW50IGhhc2g7CisJc3RydWN0IGlwX3ZzX2FwcCAqaW5jOworCWludCByZXN1bHQgPSAwOworCisJLyogRGVmYXVsdCBiaW5kaW5nOiBiaW5kIGFwcCBvbmx5IGZvciBOQVQgKi8KKwlpZiAoSVBfVlNfRldEX01FVEhPRChjcCkgIT0gSVBfVlNfQ09OTl9GX01BU1EpCisJCXJldHVybiAwOworCisJLyogTG9va3VwIGFwcGxpY2F0aW9uIGluY2FybmF0aW9ucyBhbmQgYmluZCB0aGUgcmlnaHQgb25lICovCisJaGFzaCA9IHRjcF9hcHBfaGFzaGtleShjcC0+dnBvcnQpOworCisJc3Bpbl9sb2NrKCZ0Y3BfYXBwX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5jLCAmdGNwX2FwcHNbaGFzaF0sIHBfbGlzdCkgeworCQlpZiAoaW5jLT5wb3J0ID09IGNwLT52cG9ydCkgeworCQkJaWYgKHVubGlrZWx5KCFpcF92c19hcHBfaW5jX2dldChpbmMpKSkKKwkJCQlicmVhazsKKwkJCXNwaW5fdW5sb2NrKCZ0Y3BfYXBwX2xvY2spOworCisJCQlJUF9WU19EQkdfQlVGKDksICIlczogQmluZGluZyBjb25uICVzOiV1LT4iCisJCQkJICAgICAgIiVzOiV1IHRvIGFwcCAlcyBvbiBwb3J0ICV1XG4iLAorCQkJCSAgICAgIF9fZnVuY19fLAorCQkJCSAgICAgIElQX1ZTX0RCR19BRERSKGNwLT5hZiwgJmNwLT5jYWRkciksCisJCQkJICAgICAgbnRvaHMoY3AtPmNwb3J0KSwKKwkJCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+dmFkZHIpLAorCQkJCSAgICAgIG50b2hzKGNwLT52cG9ydCksCisJCQkJICAgICAgaW5jLT5uYW1lLCBudG9ocyhpbmMtPnBvcnQpKTsKKworCQkJY3AtPmFwcCA9IGluYzsKKwkJCWlmIChpbmMtPmluaXRfY29ubikKKwkJCQlyZXN1bHQgPSBpbmMtPmluaXRfY29ubihpbmMsIGNwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ0Y3BfYXBwX2xvY2spOworCisgIG91dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKglTZXQgTElTVEVOIHRpbWVvdXQuIChpcF92c19jb25uX3B1dCB3aWxsIHNldHVwIHRpbWVyKQorICovCit2b2lkIGlwX3ZzX3RjcF9jb25uX2xpc3RlbihzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3Bpbl9sb2NrKCZjcC0+bG9jayk7CisJY3AtPnN0YXRlID0gSVBfVlNfVENQX1NfTElTVEVOOworCWNwLT50aW1lb3V0ID0gaXBfdnNfcHJvdG9jb2xfdGNwLnRpbWVvdXRfdGFibGVbSVBfVlNfVENQX1NfTElTVEVOXTsKKwlzcGluX3VubG9jaygmY3AtPmxvY2spOworfQorCisKK3N0YXRpYyB2b2lkIGlwX3ZzX3RjcF9pbml0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJSVBfVlNfSU5JVF9IQVNIX1RBQkxFKHRjcF9hcHBzKTsKKwlwcC0+dGltZW91dF90YWJsZSA9IHRjcF90aW1lb3V0czsKK30KKworCitzdGF0aWMgdm9pZCBpcF92c190Y3BfZXhpdChzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworfQorCisKK3N0cnVjdCBpcF92c19wcm90b2NvbCBpcF92c19wcm90b2NvbF90Y3AgPSB7CisJLm5hbWUgPQkJCSJUQ1AiLAorCS5wcm90b2NvbCA9CQlJUFBST1RPX1RDUCwKKwkubnVtX3N0YXRlcyA9CQlJUF9WU19UQ1BfU19MQVNULAorCS5kb250X2RlZnJhZyA9CQkwLAorCS5hcHBjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLmluaXQgPQkJCWlwX3ZzX3RjcF9pbml0LAorCS5leGl0ID0JCQlpcF92c190Y3BfZXhpdCwKKwkucmVnaXN0ZXJfYXBwID0JCXRjcF9yZWdpc3Rlcl9hcHAsCisJLnVucmVnaXN0ZXJfYXBwID0JdGNwX3VucmVnaXN0ZXJfYXBwLAorCS5jb25uX3NjaGVkdWxlID0JdGNwX2Nvbm5fc2NoZWR1bGUsCisJLmNvbm5faW5fZ2V0ID0JCXRjcF9jb25uX2luX2dldCwKKwkuY29ubl9vdXRfZ2V0ID0JCXRjcF9jb25uX291dF9nZXQsCisJLnNuYXRfaGFuZGxlciA9CQl0Y3Bfc25hdF9oYW5kbGVyLAorCS5kbmF0X2hhbmRsZXIgPQkJdGNwX2RuYXRfaGFuZGxlciwKKwkuY3N1bV9jaGVjayA9CQl0Y3BfY3N1bV9jaGVjaywKKwkuc3RhdGVfbmFtZSA9CQl0Y3Bfc3RhdGVfbmFtZSwKKwkuc3RhdGVfdHJhbnNpdGlvbiA9CXRjcF9zdGF0ZV90cmFuc2l0aW9uLAorCS5hcHBfY29ubl9iaW5kID0JdGNwX2FwcF9jb25uX2JpbmQsCisJLmRlYnVnX3BhY2tldCA9CQlpcF92c190Y3B1ZHBfZGVidWdfcGFja2V0LAorCS50aW1lb3V0X2NoYW5nZSA9CXRjcF90aW1lb3V0X2NoYW5nZSwKKwkuc2V0X3N0YXRlX3RpbWVvdXQgPQl0Y3Bfc2V0X3N0YXRlX3RpbWVvdXQsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjYwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBpcF92c19wcm90b191ZHAuYzoJVURQIGxvYWQgYmFsYW5jaW5nIHN1cHBvcnQgZm9yIElQVlMKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIEp1bGlhbiBBbmFzdGFzb3YgPGphQHNzaS5iZz4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICAgICAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgICAgICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCit1ZHBfY29ubl9pbl9nZXQoaW50IGFmLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQljb25zdCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwaCwgdW5zaWduZWQgaW50IHByb3RvX29mZiwKKwkJaW50IGludmVyc2UpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOworCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvX29mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobGlrZWx5KCFpbnZlcnNlKSkgeworCQljcCA9IGlwX3ZzX2Nvbm5faW5fZ2V0KGFmLCBpcGgtPnByb3RvY29sLAorCQkJCSAgICAgICAmaXBoLT5zYWRkciwgcHB0clswXSwKKwkJCQkgICAgICAgJmlwaC0+ZGFkZHIsIHBwdHJbMV0pOworCX0gZWxzZSB7CisJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoYWYsIGlwaC0+cHJvdG9jb2wsCisJCQkJICAgICAgICZpcGgtPmRhZGRyLCBwcHRyWzFdLAorCQkJCSAgICAgICAmaXBoLT5zYWRkciwgcHB0clswXSk7CisJfQorCisJcmV0dXJuIGNwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfY29ubiAqCit1ZHBfY29ubl9vdXRfZ2V0KGludCBhZiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKKwkJIGNvbnN0IHN0cnVjdCBpcF92c19pcGhkciAqaXBoLCB1bnNpZ25lZCBpbnQgcHJvdG9fb2ZmLAorCQkgaW50IGludmVyc2UpCit7CisJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOworCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOworCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvX29mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJaWYgKHBwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobGlrZWx5KCFpbnZlcnNlKSkgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJJmlwaC0+c2FkZHIsIHBwdHJbMF0sCisJCQkJCSZpcGgtPmRhZGRyLCBwcHRyWzFdKTsKKwl9IGVsc2UgeworCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChhZiwgaXBoLT5wcm90b2NvbCwKKwkJCQkJJmlwaC0+ZGFkZHIsIHBwdHJbMV0sCisJCQkJCSZpcGgtPnNhZGRyLCBwcHRyWzBdKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKKworc3RhdGljIGludAordWRwX2Nvbm5fc2NoZWR1bGUoaW50IGFmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLAorCQkgIGludCAqdmVyZGljdCwgc3RydWN0IGlwX3ZzX2Nvbm4gKipjcHApCit7CisJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKKwlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7CisJc3RydWN0IGlwX3ZzX2lwaGRyIGlwaDsKKworCWlwX3ZzX2ZpbGxfaXBoZHIoYWYsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCAmaXBoKTsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLmxlbiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKKwlpZiAodWggPT0gTlVMTCkgeworCQkqdmVyZGljdCA9IE5GX0RST1A7CisJCXJldHVybiAwOworCX0KKworCXN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KGFmLCBza2ItPm1hcmssIGlwaC5wcm90b2NvbCwKKwkJCQkmaXBoLmRhZGRyLCB1aC0+ZGVzdCk7CisJaWYgKHN2YykgeworCQlpZiAoaXBfdnNfdG9kcm9wKCkpIHsKKwkJCS8qCisJCQkgKiBJdCBzZWVtcyB0aGF0IHdlIGFyZSB2ZXJ5IGxvYWRlZC4KKwkJCSAqIFdlIGhhdmUgdG8gZHJvcCB0aGlzIHBhY2tldCA6KAorCQkJICovCisJCQlpcF92c19zZXJ2aWNlX3B1dChzdmMpOworCQkJKnZlcmRpY3QgPSBORl9EUk9QOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKgorCQkgKiBMZXQgdGhlIHZpcnR1YWwgc2VydmVyIHNlbGVjdCBhIHJlYWwgc2VydmVyIGZvciB0aGUKKwkJICogaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kIGNyZWF0ZSBhIGNvbm5lY3Rpb24gZW50cnkuCisJCSAqLworCQkqY3BwID0gaXBfdnNfc2NoZWR1bGUoc3ZjLCBza2IpOworCQlpZiAoISpjcHApIHsKKwkJCSp2ZXJkaWN0ID0gaXBfdnNfbGVhdmUoc3ZjLCBza2IsIHBwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlwX3ZzX3NlcnZpY2VfcHV0KHN2Yyk7CisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordWRwX2Zhc3RfY3N1bV91cGRhdGUoaW50IGFmLCBzdHJ1Y3QgdWRwaGRyICp1aGRyLAorCQkgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqb2xkaXAsCisJCSAgICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpuZXdpcCwKKwkJICAgICBfX2JlMTYgb2xkcG9ydCwgX19iZTE2IG5ld3BvcnQpCit7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCXVoZHItPmNoZWNrID0KKwkJCWNzdW1fZm9sZChpcF92c19jaGVja19kaWZmMTYob2xkaXAtPmlwNiwgbmV3aXAtPmlwNiwKKwkJCQkJIGlwX3ZzX2NoZWNrX2RpZmYyKG9sZHBvcnQsIG5ld3BvcnQsCisJCQkJCQl+Y3N1bV91bmZvbGQodWhkci0+Y2hlY2spKSkpOworCWVsc2UKKyNlbmRpZgorCQl1aGRyLT5jaGVjayA9CisJCQljc3VtX2ZvbGQoaXBfdnNfY2hlY2tfZGlmZjQob2xkaXAtPmlwLCBuZXdpcC0+aXAsCisJCQkJCSBpcF92c19jaGVja19kaWZmMihvbGRwb3J0LCBuZXdwb3J0LAorCQkJCQkJfmNzdW1fdW5mb2xkKHVoZHItPmNoZWNrKSkpKTsKKwlpZiAoIXVoZHItPmNoZWNrKQorCQl1aGRyLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3VkcF9wYXJ0aWFsX2NzdW1fdXBkYXRlKGludCBhZiwgc3RydWN0IHVkcGhkciAqdWhkciwKKwkJICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKm9sZGlwLAorCQkgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqbmV3aXAsCisJCSAgICAgX19iZTE2IG9sZGxlbiwgX19iZTE2IG5ld2xlbikKK3sKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChhZiA9PSBBRl9JTkVUNikKKwkJdWhkci0+Y2hlY2sgPQorCQkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmYxNihvbGRpcC0+aXA2LCBuZXdpcC0+aXA2LAorCQkJCQkgaXBfdnNfY2hlY2tfZGlmZjIob2xkbGVuLCBuZXdsZW4sCisJCQkJCQl+Y3N1bV91bmZvbGQodWhkci0+Y2hlY2spKSkpOworCWVsc2UKKyNlbmRpZgorCXVoZHItPmNoZWNrID0KKwkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmY0KG9sZGlwLT5pcCwgbmV3aXAtPmlwLAorCQkJCWlwX3ZzX2NoZWNrX2RpZmYyKG9sZGxlbiwgbmV3bGVuLAorCQkJCQkJfmNzdW1fdW5mb2xkKHVoZHItPmNoZWNrKSkpKTsKK30KKworCitzdGF0aWMgaW50Cit1ZHBfc25hdF9oYW5kbGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IHVkcGhkciAqdWRwaDsKKwl1bnNpZ25lZCBpbnQgdWRwaG9mZjsKKwlpbnQgb2xkbGVuOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoY3AtPmFmID09IEFGX0lORVQ2KQorCQl1ZHBob2ZmID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwllbHNlCisjZW5kaWYKKwkJdWRwaG9mZiA9IGlwX2hkcmxlbihza2IpOworCW9sZGxlbiA9IHNrYi0+bGVuIC0gdWRwaG9mZjsKKworCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHVkcGhvZmYrc2l6ZW9mKCp1ZHBoKSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KGNwLT5hcHAgIT0gTlVMTCkpIHsKKwkJLyogU29tZSBjaGVja3MgYmVmb3JlIG1hbmdsaW5nICovCisJCWlmIChwcC0+Y3N1bV9jaGVjayAmJiAhcHAtPmNzdW1fY2hlY2soY3AtPmFmLCBza2IsIHBwKSkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqCUNhbGwgYXBwbGljYXRpb24gaGVscGVyIGlmIG5lZWRlZAorCQkgKi8KKwkJaWYgKCFpcF92c19hcHBfcGt0X291dChjcCwgc2tiKSkKKwkJCXJldHVybiAwOworCX0KKworCXVkcGggPSAodm9pZCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgdWRwaG9mZjsKKwl1ZHBoLT5zb3VyY2UgPSBjcC0+dnBvcnQ7CisKKwkvKgorCSAqCUFkanVzdCBVRFAgY2hlY2tzdW1zCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJdWRwX3BhcnRpYWxfY3N1bV91cGRhdGUoY3AtPmFmLCB1ZHBoLCAmY3AtPmRhZGRyLCAmY3AtPnZhZGRyLAorCQkJCQlodG9ubChvbGRsZW4pLAorCQkJCQlodG9ubChza2ItPmxlbiAtIHVkcGhvZmYpKTsKKwl9IGVsc2UgaWYgKCFjcC0+YXBwICYmICh1ZHBoLT5jaGVjayAhPSAwKSkgeworCQkvKiBPbmx5IHBvcnQgYW5kIGFkZHIgYXJlIGNoYW5nZWQsIGRvIGZhc3QgY3N1bSB1cGRhdGUgKi8KKwkJdWRwX2Zhc3RfY3N1bV91cGRhdGUoY3AtPmFmLCB1ZHBoLCAmY3AtPmRhZGRyLCAmY3AtPnZhZGRyLAorCQkJCSAgICAgY3AtPmRwb3J0LCBjcC0+dnBvcnQpOworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfSBlbHNlIHsKKwkJLyogZnVsbCBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCQl1ZHBoLT5jaGVjayA9IDA7CisJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHVkcGhvZmYsIHNrYi0+bGVuIC0gdWRwaG9mZiwgMCk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkJaWYgKGNwLT5hZiA9PSBBRl9JTkVUNikKKwkJCXVkcGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZjcC0+dmFkZHIuaW42LAorCQkJCQkJICAgICAgJmNwLT5jYWRkci5pbjYsCisJCQkJCQkgICAgICBza2ItPmxlbiAtIHVkcGhvZmYsCisJCQkJCQkgICAgICBjcC0+cHJvdG9jb2wsIHNrYi0+Y3N1bSk7CisJCWVsc2UKKyNlbmRpZgorCQkJdWRwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhjcC0+dmFkZHIuaXAsCisJCQkJCQkJY3AtPmNhZGRyLmlwLAorCQkJCQkJCXNrYi0+bGVuIC0gdWRwaG9mZiwKKwkJCQkJCQljcC0+cHJvdG9jb2wsCisJCQkJCQkJc2tiLT5jc3VtKTsKKwkJaWYgKHVkcGgtPmNoZWNrID09IDApCisJCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCQlJUF9WU19EQkcoMTEsICJPLXBrdDogJXMgTy1jc3VtPSVkICgrJXpkKVxuIiwKKwkJCSAgcHAtPm5hbWUsIHVkcGgtPmNoZWNrLAorCQkJICAoY2hhciopJih1ZHBoLT5jaGVjaykgLSAoY2hhciopdWRwaCk7CisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK3VkcF9kbmF0X2hhbmRsZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgdWRwaGRyICp1ZHBoOworCXVuc2lnbmVkIGludCB1ZHBob2ZmOworCWludCBvbGRsZW47CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCWlmIChjcC0+YWYgPT0gQUZfSU5FVDYpCisJCXVkcGhvZmYgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWVsc2UKKyNlbmRpZgorCQl1ZHBob2ZmID0gaXBfaGRybGVuKHNrYik7CisJb2xkbGVuID0gc2tiLT5sZW4gLSB1ZHBob2ZmOworCisJLyogY3N1bV9jaGVjayByZXF1aXJlcyB1bnNoYXJlZCBza2IgKi8KKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgdWRwaG9mZitzaXplb2YoKnVkcGgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoY3AtPmFwcCAhPSBOVUxMKSkgeworCQkvKiBTb21lIGNoZWNrcyBiZWZvcmUgbWFuZ2xpbmcgKi8KKwkJaWYgKHBwLT5jc3VtX2NoZWNrICYmICFwcC0+Y3N1bV9jaGVjayhjcC0+YWYsIHNrYiwgcHApKQorCQkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICoJQXR0ZW1wdCBpcF92c19hcHAgY2FsbC4KKwkJICoJSXQgd2lsbCBmaXggaXBfdnNfY29ubgorCQkgKi8KKwkJaWYgKCFpcF92c19hcHBfcGt0X2luKGNwLCBza2IpKQorCQkJcmV0dXJuIDA7CisJfQorCisJdWRwaCA9ICh2b2lkICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB1ZHBob2ZmOworCXVkcGgtPmRlc3QgPSBjcC0+ZHBvcnQ7CisKKwkvKgorCSAqCUFkanVzdCBVRFAgY2hlY2tzdW1zCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJdWRwX3BhcnRpYWxfY3N1bV91cGRhdGUoY3AtPmFmLCB1ZHBoLCAmY3AtPmRhZGRyLCAmY3AtPnZhZGRyLAorCQkJCQlodG9ubChvbGRsZW4pLAorCQkJCQlodG9ubChza2ItPmxlbiAtIHVkcGhvZmYpKTsKKwl9IGVsc2UgaWYgKCFjcC0+YXBwICYmICh1ZHBoLT5jaGVjayAhPSAwKSkgeworCQkvKiBPbmx5IHBvcnQgYW5kIGFkZHIgYXJlIGNoYW5nZWQsIGRvIGZhc3QgY3N1bSB1cGRhdGUgKi8KKwkJdWRwX2Zhc3RfY3N1bV91cGRhdGUoY3AtPmFmLCB1ZHBoLCAmY3AtPnZhZGRyLCAmY3AtPmRhZGRyLAorCQkJCSAgICAgY3AtPnZwb3J0LCBjcC0+ZHBvcnQpOworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJfSBlbHNlIHsKKwkJLyogZnVsbCBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCQl1ZHBoLT5jaGVjayA9IDA7CisJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHVkcGhvZmYsIHNrYi0+bGVuIC0gdWRwaG9mZiwgMCk7CisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkJaWYgKGNwLT5hZiA9PSBBRl9JTkVUNikKKwkJCXVkcGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZjcC0+Y2FkZHIuaW42LAorCQkJCQkJICAgICAgJmNwLT5kYWRkci5pbjYsCisJCQkJCQkgICAgICBza2ItPmxlbiAtIHVkcGhvZmYsCisJCQkJCQkgICAgICBjcC0+cHJvdG9jb2wsIHNrYi0+Y3N1bSk7CisJCWVsc2UKKyNlbmRpZgorCQkJdWRwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhjcC0+Y2FkZHIuaXAsCisJCQkJCQkJY3AtPmRhZGRyLmlwLAorCQkJCQkJCXNrYi0+bGVuIC0gdWRwaG9mZiwKKwkJCQkJCQljcC0+cHJvdG9jb2wsCisJCQkJCQkJc2tiLT5jc3VtKTsKKwkJaWYgKHVkcGgtPmNoZWNrID09IDApCisJCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50Cit1ZHBfY3N1bV9jaGVjayhpbnQgYWYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOworCXVuc2lnbmVkIGludCB1ZHBob2ZmOworCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwlpZiAoYWYgPT0gQUZfSU5FVDYpCisJCXVkcGhvZmYgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWVsc2UKKyNlbmRpZgorCQl1ZHBob2ZmID0gaXBfaGRybGVuKHNrYik7CisKKwl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHVkcGhvZmYsIHNpemVvZihfdWRwaCksICZfdWRwaCk7CisJaWYgKHVoID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKHVoLT5jaGVjayAhPSAwKSB7CisJCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKKwkJY2FzZSBDSEVDS1NVTV9OT05FOgorCQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgdWRwaG9mZiwKKwkJCQkJCSBza2ItPmxlbiAtIHVkcGhvZmYsIDApOworCQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgorI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJCQlpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKwkJCQlpZiAoY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgICAgc2tiLT5sZW4gLSB1ZHBob2ZmLAorCQkJCQkJICAgIGlwdjZfaGRyKHNrYiktPm5leHRoZHIsCisJCQkJCQkgICAgc2tiLT5jc3VtKSkgeworCQkJCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsCisJCQkJCQkJICJGYWlsZWQgY2hlY2tzdW0gZm9yIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJaWYgKGNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAgICAgIGlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkJCSAgICAgIHNrYi0+bGVuIC0gdWRwaG9mZiwKKwkJCQkJCSAgICAgIGlwX2hkcihza2IpLT5wcm90b2NvbCwKKwkJCQkJCSAgICAgIHNrYi0+Y3N1bSkpIHsKKwkJCQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLAorCQkJCQkJCSAiRmFpbGVkIGNoZWNrc3VtIGZvciIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIE5vIG5lZWQgdG8gY2hlY2tzdW0uICovCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworCisvKgorICoJTm90ZTogdGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgb25seSBvbmUgb2YgcmVnaXN0ZXJfYXBwLAorICoJdW5yZWdpc3Rlcl9hcHAgb3IgYXBwX2Nvbm5fYmluZCBpcyBjYWxsZWQgZWFjaCB0aW1lLgorICovCisKKyNkZWZpbmUJVURQX0FQUF9UQUJfQklUUwk0CisjZGVmaW5lCVVEUF9BUFBfVEFCX1NJWkUJKDEgPDwgVURQX0FQUF9UQUJfQklUUykKKyNkZWZpbmUJVURQX0FQUF9UQUJfTUFTSwkoVURQX0FQUF9UQUJfU0laRSAtIDEpCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHVkcF9hcHBzW1VEUF9BUFBfVEFCX1NJWkVdOworc3RhdGljIERFRklORV9TUElOTE9DSyh1ZHBfYXBwX2xvY2spOworCitzdGF0aWMgaW5saW5lIF9fdTE2IHVkcF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKK3sKKwlyZXR1cm4gKCgoX19mb3JjZSB1MTYpcG9ydCA+PiBVRFBfQVBQX1RBQl9CSVRTKSBeIChfX2ZvcmNlIHUxNilwb3J0KQorCQkmIFVEUF9BUFBfVEFCX01BU0s7Cit9CisKKworc3RhdGljIGludCB1ZHBfcmVnaXN0ZXJfYXBwKHN0cnVjdCBpcF92c19hcHAgKmluYykKK3sKKwlzdHJ1Y3QgaXBfdnNfYXBwICppOworCV9fdTE2IGhhc2g7CisJX19iZTE2IHBvcnQgPSBpbmMtPnBvcnQ7CisJaW50IHJldCA9IDA7CisKKwloYXNoID0gdWRwX2FwcF9oYXNoa2V5KHBvcnQpOworCisKKwlzcGluX2xvY2tfYmgoJnVkcF9hcHBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmdWRwX2FwcHNbaGFzaF0sIHBfbGlzdCkgeworCQlpZiAoaS0+cG9ydCA9PSBwb3J0KSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJbGlzdF9hZGQoJmluYy0+cF9saXN0LCAmdWRwX2FwcHNbaGFzaF0pOworCWF0b21pY19pbmMoJmlwX3ZzX3Byb3RvY29sX3VkcC5hcHBjbnQpOworCisgIG91dDoKKwlzcGluX3VubG9ja19iaCgmdWRwX2FwcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit1ZHBfdW5yZWdpc3Rlcl9hcHAoc3RydWN0IGlwX3ZzX2FwcCAqaW5jKQoreworCXNwaW5fbG9ja19iaCgmdWRwX2FwcF9sb2NrKTsKKwlhdG9taWNfZGVjKCZpcF92c19wcm90b2NvbF91ZHAuYXBwY250KTsKKwlsaXN0X2RlbCgmaW5jLT5wX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZ1ZHBfYXBwX2xvY2spOworfQorCisKK3N0YXRpYyBpbnQgdWRwX2FwcF9jb25uX2JpbmQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoreworCWludCBoYXNoOworCXN0cnVjdCBpcF92c19hcHAgKmluYzsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIERlZmF1bHQgYmluZGluZzogYmluZCBhcHAgb25seSBmb3IgTkFUICovCisJaWYgKElQX1ZTX0ZXRF9NRVRIT0QoY3ApICE9IElQX1ZTX0NPTk5fRl9NQVNRKQorCQlyZXR1cm4gMDsKKworCS8qIExvb2t1cCBhcHBsaWNhdGlvbiBpbmNhcm5hdGlvbnMgYW5kIGJpbmQgdGhlIHJpZ2h0IG9uZSAqLworCWhhc2ggPSB1ZHBfYXBwX2hhc2hrZXkoY3AtPnZwb3J0KTsKKworCXNwaW5fbG9jaygmdWRwX2FwcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluYywgJnVkcF9hcHBzW2hhc2hdLCBwX2xpc3QpIHsKKwkJaWYgKGluYy0+cG9ydCA9PSBjcC0+dnBvcnQpIHsKKwkJCWlmICh1bmxpa2VseSghaXBfdnNfYXBwX2luY19nZXQoaW5jKSkpCisJCQkJYnJlYWs7CisJCQlzcGluX3VubG9jaygmdWRwX2FwcF9sb2NrKTsKKworCQkJSVBfVlNfREJHX0JVRig5LCAiJXM6IEJpbmRpbmcgY29ubiAlczoldS0+IgorCQkJCSAgICAgICIlczoldSB0byBhcHAgJXMgb24gcG9ydCAldVxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywKKwkJCQkgICAgICBJUF9WU19EQkdfQUREUihjcC0+YWYsICZjcC0+Y2FkZHIpLAorCQkJCSAgICAgIG50b2hzKGNwLT5jcG9ydCksCisJCQkJICAgICAgSVBfVlNfREJHX0FERFIoY3AtPmFmLCAmY3AtPnZhZGRyKSwKKwkJCQkgICAgICBudG9ocyhjcC0+dnBvcnQpLAorCQkJCSAgICAgIGluYy0+bmFtZSwgbnRvaHMoaW5jLT5wb3J0KSk7CisKKwkJCWNwLT5hcHAgPSBpbmM7CisJCQlpZiAoaW5jLT5pbml0X2Nvbm4pCisJCQkJcmVzdWx0ID0gaW5jLT5pbml0X2Nvbm4oaW5jLCBjcCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdWRwX2FwcF9sb2NrKTsKKworICBvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW50IHVkcF90aW1lb3V0c1tJUF9WU19VRFBfU19MQVNUKzFdID0geworCVtJUF9WU19VRFBfU19OT1JNQUxdCQk9CTUqNjAqSFosCisJW0lQX1ZTX1VEUF9TX0xBU1RdCQk9CTIqSFosCit9OworCitzdGF0aWMgY2hhciAqIHVkcF9zdGF0ZV9uYW1lX3RhYmxlW0lQX1ZTX1VEUF9TX0xBU1QrMV0gPSB7CisJW0lQX1ZTX1VEUF9TX05PUk1BTF0JCT0JIlVEUCIsCisJW0lQX1ZTX1VEUF9TX0xBU1RdCQk9CSJCVUchIiwKK307CisKKworc3RhdGljIGludAordWRwX3NldF9zdGF0ZV90aW1lb3V0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIGNoYXIgKnNuYW1lLCBpbnQgdG8pCit7CisJcmV0dXJuIGlwX3ZzX3NldF9zdGF0ZV90aW1lb3V0KHBwLT50aW1lb3V0X3RhYmxlLCBJUF9WU19VRFBfU19MQVNULAorCQkJCSAgICAgICB1ZHBfc3RhdGVfbmFtZV90YWJsZSwgc25hbWUsIHRvKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiB1ZHBfc3RhdGVfbmFtZShpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlID49IElQX1ZTX1VEUF9TX0xBU1QpCisJCXJldHVybiAiRVJSISI7CisJcmV0dXJuIHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA/IHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA6ICI/IjsKK30KKworc3RhdGljIGludAordWRwX3N0YXRlX3RyYW5zaXRpb24oc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAorCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwljcC0+dGltZW91dCA9IHBwLT50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF07CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHVkcF9pbml0KHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJSVBfVlNfSU5JVF9IQVNIX1RBQkxFKHVkcF9hcHBzKTsKKwlwcC0+dGltZW91dF90YWJsZSA9IHVkcF90aW1lb3V0czsKK30KKworc3RhdGljIHZvaWQgdWRwX2V4aXQoc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKK30KKworCitzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgaXBfdnNfcHJvdG9jb2xfdWRwID0geworCS5uYW1lID0JCQkiVURQIiwKKwkucHJvdG9jb2wgPQkJSVBQUk9UT19VRFAsCisJLm51bV9zdGF0ZXMgPQkJSVBfVlNfVURQX1NfTEFTVCwKKwkuZG9udF9kZWZyYWcgPQkJMCwKKwkuaW5pdCA9CQkJdWRwX2luaXQsCisJLmV4aXQgPQkJCXVkcF9leGl0LAorCS5jb25uX3NjaGVkdWxlID0JdWRwX2Nvbm5fc2NoZWR1bGUsCisJLmNvbm5faW5fZ2V0ID0JCXVkcF9jb25uX2luX2dldCwKKwkuY29ubl9vdXRfZ2V0ID0JCXVkcF9jb25uX291dF9nZXQsCisJLnNuYXRfaGFuZGxlciA9CQl1ZHBfc25hdF9oYW5kbGVyLAorCS5kbmF0X2hhbmRsZXIgPQkJdWRwX2RuYXRfaGFuZGxlciwKKwkuY3N1bV9jaGVjayA9CQl1ZHBfY3N1bV9jaGVjaywKKwkuc3RhdGVfdHJhbnNpdGlvbiA9CXVkcF9zdGF0ZV90cmFuc2l0aW9uLAorCS5zdGF0ZV9uYW1lID0JCXVkcF9zdGF0ZV9uYW1lLAorCS5yZWdpc3Rlcl9hcHAgPQkJdWRwX3JlZ2lzdGVyX2FwcCwKKwkudW5yZWdpc3Rlcl9hcHAgPQl1ZHBfdW5yZWdpc3Rlcl9hcHAsCisJLmFwcF9jb25uX2JpbmQgPQl1ZHBfYXBwX2Nvbm5fYmluZCwKKwkuZGVidWdfcGFja2V0ID0JCWlwX3ZzX3RjcHVkcF9kZWJ1Z19wYWNrZXQsCisJLnRpbWVvdXRfY2hhbmdlID0JTlVMTCwKKwkuc2V0X3N0YXRlX3RpbWVvdXQgPQl1ZHBfc2V0X3N0YXRlX3RpbWVvdXQsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3JyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIxOTVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3JyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBJUFZTOiAgICAgICAgUm91bmQtUm9iaW4gU2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZpeGVzL0NoYW5nZXM6CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3JyX3NjaGVkdWxlIHRvIHJldHVybiBkZXN0CisgKiAgICAgSnVsaWFuIEFuYXN0YXNvdiAgICAgICAgIDogICAgIGZpeGVkIHRoZSBOVUxMIHBvaW50ZXIgYWNjZXNzIGJ1ZyBpbiBkZWJ1Z2dpbmcKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBzb21lIGNvbWVzdGljcyB0aGluZ3MgZm9yIGRlYnVnZ2luZworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIGZvciB0aGUgZC1saW5rZWQgZGVzdGluYXRpb24gbGlzdAorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCB0aGUgaXBfdnNfcnJfdXBkYXRlX3N2YworICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBhZGRlZCBhbnkgZGVzdCB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcF92cy5oPgorCisKK3N0YXRpYyBpbnQgaXBfdnNfcnJfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdmMtPnNjaGVkX2RhdGEgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19ycl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3ZjLT5zY2hlZF9kYXRhID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19ycl9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OworCisJSVBfVlNfREJHKDYsICJpcF92c19ycl9zY2hlZHVsZSgpOiBTY2hlZHVsaW5nLi4uXG4iKTsKKworCXdyaXRlX2xvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJcCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopc3ZjLT5zY2hlZF9kYXRhOworCXAgPSBwLT5uZXh0OworCXEgPSBwOworCWRvIHsKKwkJLyogc2tpcCBsaXN0IGhlYWQgKi8KKwkJaWYgKHEgPT0gJnN2Yy0+ZGVzdGluYXRpb25zKSB7CisJCQlxID0gcS0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGVzdCA9IGxpc3RfZW50cnkocSwgc3RydWN0IGlwX3ZzX2Rlc3QsIG5fbGlzdCk7CisJCWlmICghKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEKSAmJgorCQkgICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPiAwKQorCQkJLyogSElUICovCisJCQlnb3RvIG91dDsKKwkJcSA9IHEtPm5leHQ7CisJfSB3aGlsZSAocSAhPSBwKTsKKwl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJcmV0dXJuIE5VTEw7CisKKyAgb3V0OgorCXN2Yy0+c2NoZWRfZGF0YSA9IHE7CisJd3JpdGVfdW5sb2NrKCZzdmMtPnNjaGVkX2xvY2spOworCUlQX1ZTX0RCR19CVUYoNiwgIlJSOiBzZXJ2ZXIgJXM6JXUgIgorCQkgICAgICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZFxuIiwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmRlc3QtPmFkZHIpLCBudG9ocyhkZXN0LT5wb3J0KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmRlc3QtPnJlZmNudCksIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpKTsKKworCXJldHVybiBkZXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3JyX3NjaGVkdWxlciA9IHsKKwkubmFtZSA9CQkJInJyIiwJCQkvKiBuYW1lICovCisJLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfcnJfc2NoZWR1bGVyLm5fbGlzdCksCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkuc3VwcG9ydHNfaXB2NiA9CTEsCisjZW5kaWYKKwkuaW5pdF9zZXJ2aWNlID0JCWlwX3ZzX3JyX2luaXRfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3JyX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX3JyX3NjaGVkdWxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBfdnNfcnJfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c19ycl9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3JyX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX3JyX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfcnJfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NjaGVkLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2NoZWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbmV0L2lwdjQvaXB2cy9pcF92c19zY2hlZC5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2NoZWQuYwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3NlZC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3NlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmYyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2VkLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBJUFZTOiAgICAgICAgU2hvcnRlc3QgRXhwZWN0ZWQgRGVsYXkgc2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKy8qCisgKiBUaGUgU0VEIGFsZ29yaXRobSBhdHRlbXB0cyB0byBtaW5pbWl6ZSBlYWNoIGpvYidzIGV4cGVjdGVkIGRlbGF5IHVudGlsCisgKiBjb21wbGV0aW9uLiBUaGUgZXhwZWN0ZWQgZGVsYXkgdGhhdCB0aGUgam9iIHdpbGwgZXhwZXJpZW5jZSBpcworICogKENpICsgMSkgLyBVaSBpZiBzZW50IHRvIHRoZSBpdGggc2VydmVyLCBpbiB3aGljaCBDaSBpcyB0aGUgbnVtYmVyIG9mCisgKiBqb2JzIG9uIHRoZSBpdGggc2VydmVyIGFuZCBVaSBpcyB0aGUgZml4ZWQgc2VydmljZSByYXRlICh3ZWlnaHQpIG9mCisgKiB0aGUgaXRoIHNlcnZlci4gVGhlIFNFRCBhbGdvcml0aG0gYWRvcHRzIGEgZ3JlZWR5IHBvbGljeSB0aGF0IGVhY2ggZG9lcworICogd2hhdCBpcyBpbiBpdHMgb3duIGJlc3QgaW50ZXJlc3QsIGkuZS4gdG8gam9pbiB0aGUgcXVldWUgd2hpY2ggd291bGQKKyAqIG1pbmltaXplIGl0cyBleHBlY3RlZCBkZWxheSBvZiBjb21wbGV0aW9uLgorICoKKyAqIFNlZSB0aGUgZm9sbG93aW5nIHBhcGVyIGZvciBtb3JlIGluZm9ybWF0aW9uOgorICogQS4gV2VpbnJpYiBhbmQgUy4gU2hlbmtlciwgR3JlZWQgaXMgbm90IGVub3VnaDogQWRhcHRpdmUgbG9hZCBzaGFyaW5nCisgKiBpbiBsYXJnZSBoZXRlcm9nZW5lb3VzIHN5c3RlbXMuIEluIFByb2NlZWRpbmdzIElFRUUgSU5GT0NPTSc4OCwKKyAqIHBhZ2VzIDk4Ni05OTQsIDE5ODguCisgKgorICogVGhhbmtzIG11c3QgZ28gdG8gTWFya28gQnV1cmkgPG1hcmtvQGJ1dXJpLm5hbWU+IGZvciB0YWxraW5nIFNFRCB0byBtZS4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNFRCBhbmQgV0xDIGlzIHRoYXQgU0VEIGluY2x1ZGVzIHRoZSBpbmNvbWluZworICogam9iIGluIHRoZSBjb3N0IGZ1bmN0aW9uICh0aGUgaW5jcmVtZW50IG9mIDEpLiBTRUQgbWF5IG91dHBlcmZvcm0KKyAqIFdMQywgd2hpbGUgc2NoZWR1bGluZyBiaWcgam9icyB1bmRlciBsYXJnZXIgaGV0ZXJvZ2VuZW91cyBzeXN0ZW1zCisgKiAodGhlIHNlcnZlciB3ZWlnaHQgdmFyaWVzIGEgbG90KS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2lwX3ZzX3NlZF9kZXN0X292ZXJoZWFkKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCS8qCisJICogV2Ugb25seSB1c2UgdGhlIGFjdGl2ZSBjb25uZWN0aW9uIG51bWJlciBpbiB0aGUgY29zdAorCSAqIGNhbGN1bGF0aW9uIGhlcmUuCisJICovCisJcmV0dXJuIGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucykgKyAxOworfQorCisKKy8qCisgKglXZWlnaHRlZCBMZWFzdCBDb25uZWN0aW9uIHNjaGVkdWxpbmcKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX3NlZF9zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCAqbGVhc3Q7CisJdW5zaWduZWQgaW50IGxvaCwgZG9oOworCisJSVBfVlNfREJHKDYsICJpcF92c19zZWRfc2NoZWR1bGUoKTogU2NoZWR1bGluZy4uLlxuIik7CisKKwkvKgorCSAqIFdlIGNhbGN1bGF0ZSB0aGUgbG9hZCBvZiBlYWNoIGRlc3Qgc2VydmVyIGFzIGZvbGxvd3M6CisJICoJKHNlcnZlciBleHBlY3RlZCBvdmVyaGVhZCkgLyBkZXN0LT53ZWlnaHQKKwkgKgorCSAqIFJlbWVtYmVyIC0tIG5vIGZsb2F0cyBpbiBrZXJuZWwgbW9kZSEhIQorCSAqIFRoZSBjb21wYXJpc29uIG9mIGgxKncyID4gaDIqdzEgaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mCisJICoJCSAgaDEvdzEgPiBoMi93MgorCSAqIGlmIGV2ZXJ5IHdlaWdodCBpcyBsYXJnZXIgdGhhbiB6ZXJvLgorCSAqCisJICogVGhlIHNlcnZlciB3aXRoIHdlaWdodD0wIGlzIHF1aWVzY2VkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGFueQorCSAqIG5ldyBjb25uZWN0aW9ucy4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKCEoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpICYmCisJCSAgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+IDApIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGlwX3ZzX3NlZF9kZXN0X292ZXJoZWFkKGxlYXN0KTsKKwkJCWdvdG8gbmV4dHN0YWdlOworCQl9CisJfQorCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgICBGaW5kIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBsZWFzdCBsb2FkLgorCSAqLworICBuZXh0c3RhZ2U6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoZGVzdC0+ZmxhZ3MgJiBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQpCisJCQljb250aW51ZTsKKwkJZG9oID0gaXBfdnNfc2VkX2Rlc3Rfb3ZlcmhlYWQoZGVzdCk7CisJCWlmIChsb2ggKiBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+CisJCSAgICBkb2ggKiBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCkpIHsKKwkJCWxlYXN0ID0gZGVzdDsKKwkJCWxvaCA9IGRvaDsKKwkJfQorCX0KKworCUlQX1ZTX0RCR19CVUYoNiwgIlNFRDogc2VydmVyICVzOiV1ICIKKwkJICAgICAgImFjdGl2ZWNvbm5zICVkIHJlZmNudCAlZCB3ZWlnaHQgJWQgb3ZlcmhlYWQgJWRcbiIsCisJCSAgICAgIElQX1ZTX0RCR19BRERSKHN2Yy0+YWYsICZsZWFzdC0+YWRkciksIG50b2hzKGxlYXN0LT5wb3J0KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT5hY3RpdmVjb25ucyksCisJCSAgICAgIGF0b21pY19yZWFkKCZsZWFzdC0+cmVmY250KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT53ZWlnaHQpLCBsb2gpOworCisJcmV0dXJuIGxlYXN0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3NlZF9zY2hlZHVsZXIgPQoreworCS5uYW1lID0JCQkic2VkIiwKKwkucmVmY250ID0JCUFUT01JQ19JTklUKDApLAorCS5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisJLm5fbGlzdCA9CQlMSVNUX0hFQURfSU5JVChpcF92c19zZWRfc2NoZWR1bGVyLm5fbGlzdCksCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKKwkuc3VwcG9ydHNfaXB2NiA9CTEsCisjZW5kaWYKKwkuc2NoZWR1bGUgPQkJaXBfdnNfc2VkX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19zZWRfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9pcF92c19zY2hlZHVsZXIoJmlwX3ZzX3NlZF9zY2hlZHVsZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfc2VkX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfc2VkX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX3NlZF9pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX3NlZF9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NmRlMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogSVBWUzogICAgICAgIFNvdXJjZSBIYXNoaW5nIHNjaGVkdWxpbmcgbW9kdWxlCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAZ251Y2hpbmEub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKgorICovCisKKy8qCisgKiBUaGUgc2ggYWxnb3JpdGhtIGlzIHRvIHNlbGVjdCBzZXJ2ZXIgYnkgdGhlIGhhc2gga2V5IG9mIHNvdXJjZSBJUAorICogYWRkcmVzcy4gVGhlIHBzZXVkbyBjb2RlIGlzIGFzIGZvbGxvd3M6CisgKgorICogICAgICAgbiA8LSBzZXJ2ZXJub2RlW3NyY19pcF07CisgKiAgICAgICBpZiAobiBpcyBkZWFkKSBPUgorICogICAgICAgICAgKG4gaXMgb3ZlcmxvYWRlZCkgb3IgKG4ud2VpZ2h0IDw9IDApIHRoZW4KKyAqICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAqCisgKiAgICAgICByZXR1cm4gbjsKKyAqCisgKiBOb3RlcyB0aGF0IHNlcnZlcm5vZGUgaXMgYSAyNTYtYnVja2V0IGhhc2ggdGFibGUgdGhhdCBtYXBzIHRoZSBoYXNoCisgKiBpbmRleCBkZXJpdmVkIGZyb20gcGFja2V0IHNvdXJjZSBJUCBhZGRyZXNzIHRvIHRoZSBjdXJyZW50IHNlcnZlcgorICogYXJyYXkuIElmIHRoZSBzaCBzY2hlZHVsZXIgaXMgdXNlZCBpbiBjYWNoZSBjbHVzdGVyLCBpdCBpcyBnb29kIHRvCisgKiBjb21iaW5lIGl0IHdpdGggY2FjaGVfYnlwYXNzIGZlYXR1cmUuIFdoZW4gdGhlIHN0YXRpY2FsbHkgYXNzaWduZWQKKyAqIHNlcnZlciBpcyBkZWFkIG9yIG92ZXJsb2FkZWQsIHRoZSBsb2FkIGJhbGFuY2VyIGNhbiBieXBhc3MgdGhlIGNhY2hlCisgKiBzZXJ2ZXIgYW5kIHNlbmQgcmVxdWVzdHMgdG8gdGhlIG9yaWdpbmFsIHNlcnZlciBkaXJlY3RseS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworCisvKgorICogICAgICBJUFZTIFNIIGJ1Y2tldAorICovCitzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0IHsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAgICAgICAqZGVzdDsgICAgICAgICAgLyogcmVhbCBzZXJ2ZXIgKGNhY2hlKSAqLworfTsKKworLyoKKyAqICAgICBmb3IgSVBWUyBTSCBlbnRyeSBoYXNoIHRhYmxlCisgKi8KKyNpZm5kZWYgQ09ORklHX0lQX1ZTX1NIX1RBQl9CSVRTCisjZGVmaW5lIENPTkZJR19JUF9WU19TSF9UQUJfQklUUyAgICAgICAgOAorI2VuZGlmCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9CSVRTICAgICAgICAgICAgICAgQ09ORklHX0lQX1ZTX1NIX1RBQl9CSVRTCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9TSVpFICAgICAgICAgICAgICAgKDEgPDwgSVBfVlNfU0hfVEFCX0JJVFMpCisjZGVmaW5lIElQX1ZTX1NIX1RBQl9NQVNLICAgICAgICAgICAgICAgKElQX1ZTX1NIX1RBQl9TSVpFIC0gMSkKKworCisvKgorICoJUmV0dXJucyBoYXNoIHZhbHVlIGZvciBJUFZTIFNIIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaXBfdnNfc2hfaGFzaGtleShfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gKG50b2hsKGFkZHIpKjI2NTQ0MzU3NjFVTCkgJiBJUF9WU19TSF9UQUJfTUFTSzsKK30KKworCisvKgorICogICAgICBHZXQgaXBfdnNfZGVzdCBhc3NvY2lhdGVkIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c19zaF9nZXQoc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsLCBfX2JlMzIgYWRkcikKK3sKKwlyZXR1cm4gKHRibFtpcF92c19zaF9oYXNoa2V5KGFkZHIpXSkuZGVzdDsKK30KKworCisvKgorICogICAgICBBc3NpZ24gYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZSB3aXRoIHRoZSBzZXJ2aWNlLgorICovCitzdGF0aWMgaW50CitpcF92c19zaF9hc3NpZ24oc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsLCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKmI7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKworCWIgPSB0Ymw7CisJcCA9ICZzdmMtPmRlc3RpbmF0aW9uczsKKwlmb3IgKGk9MDsgaTxJUF9WU19TSF9UQUJfU0laRTsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KHApKSB7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwID09ICZzdmMtPmRlc3RpbmF0aW9ucykKKwkJCQlwID0gcC0+bmV4dDsKKworCQkJZGVzdCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGlwX3ZzX2Rlc3QsIG5fbGlzdCk7CisJCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOworCQkJYi0+ZGVzdCA9IGRlc3Q7CisKKwkJCXAgPSBwLT5uZXh0OworCQl9CisJCWIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgRmx1c2ggYWxsIHRoZSBoYXNoIGJ1Y2tldHMgb2YgdGhlIHNwZWNpZmllZCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfc2hfZmx1c2goc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsKQoreworCWludCBpOworCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKmI7CisKKwliID0gdGJsOworCWZvciAoaT0wOyBpPElQX1ZTX1NIX1RBQl9TSVpFOyBpKyspIHsKKwkJaWYgKGItPmRlc3QpIHsKKwkJCWF0b21pY19kZWMoJmItPmRlc3QtPnJlZmNudCk7CisJCQliLT5kZXN0ID0gTlVMTDsKKwkJfQorCQliKys7CisJfQorfQorCisKK3N0YXRpYyBpbnQgaXBfdnNfc2hfaW5pdF9zdmMoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICp0Ymw7CisKKwkvKiBhbGxvY2F0ZSB0aGUgU0ggdGFibGUgZm9yIHRoaXMgc2VydmljZSAqLworCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c19zaF9idWNrZXQpKklQX1ZTX1NIX1RBQl9TSVpFLAorCQkgICAgICBHRlBfQVRPTUlDKTsKKwlpZiAodGJsID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c19zaF9pbml0X3N2YygpOiBubyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOworCUlQX1ZTX0RCRyg2LCAiU0ggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKKwkJICAiY3VycmVudCBzZXJ2aWNlXG4iLAorCQkgIHNpemVvZihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0KSpJUF9WU19TSF9UQUJfU0laRSk7CisKKwkvKiBhc3NpZ24gdGhlIGhhc2ggYnVja2V0cyB3aXRoIHRoZSB1cGRhdGVkIHNlcnZpY2UgKi8KKwlpcF92c19zaF9hc3NpZ24odGJsLCBzdmMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19zaF9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibCA9IHN2Yy0+c2NoZWRfZGF0YTsKKworCS8qIGdvdCB0byBjbGVhbiB1cCBoYXNoIGJ1Y2tldHMgaGVyZSAqLworCWlwX3ZzX3NoX2ZsdXNoKHRibCk7CisKKwkvKiByZWxlYXNlIHRoZSB0YWJsZSBpdHNlbGYgKi8KKwlrZnJlZShzdmMtPnNjaGVkX2RhdGEpOworCUlQX1ZTX0RCRyg2LCAiU0ggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSByZWxlYXNlZFxuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCkqSVBfVlNfU0hfVEFCX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpcF92c19zaF91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsID0gc3ZjLT5zY2hlZF9kYXRhOworCisJLyogZ290IHRvIGNsZWFuIHVwIGhhc2ggYnVja2V0cyBoZXJlICovCisJaXBfdnNfc2hfZmx1c2godGJsKTsKKworCS8qIGFzc2lnbiB0aGUgaGFzaCBidWNrZXRzIHdpdGggdGhlIHVwZGF0ZWQgc2VydmljZSAqLworCWlwX3ZzX3NoX2Fzc2lnbih0YmwsIHN2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBJZiB0aGUgZGVzdCBmbGFncyBpcyBzZXQgd2l0aCBJUF9WU19ERVNUX0ZfT1ZFUkxPQUQsCisgKiAgICAgIGNvbnNpZGVyIHRoYXQgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkIGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX292ZXJsb2FkZWQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJcmV0dXJuIGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX09WRVJMT0FEOworfQorCisKKy8qCisgKiAgICAgIFNvdXJjZSBIYXNoaW5nIHNjaGVkdWxpbmcKKyAqLworc3RhdGljIHN0cnVjdCBpcF92c19kZXN0ICoKK2lwX3ZzX3NoX3NjaGVkdWxlKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJc3RydWN0IGlwX3ZzX3NoX2J1Y2tldCAqdGJsOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwlJUF9WU19EQkcoNiwgImlwX3ZzX3NoX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJdGJsID0gKHN0cnVjdCBpcF92c19zaF9idWNrZXQgKilzdmMtPnNjaGVkX2RhdGE7CisJZGVzdCA9IGlwX3ZzX3NoX2dldCh0YmwsIGlwaC0+c2FkZHIpOworCWlmICghZGVzdAorCSAgICB8fCAhKGRlc3QtPmZsYWdzICYgSVBfVlNfREVTVF9GX0FWQUlMQUJMRSkKKwkgICAgfHwgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkgPD0gMAorCSAgICB8fCBpc19vdmVybG9hZGVkKGRlc3QpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCUlQX1ZTX0RCRyg2LCAiU0g6IHNvdXJjZSBJUCBhZGRyZXNzICV1LiV1LiV1LiV1ICIKKwkJICAiLS0+IHNlcnZlciAldS4ldS4ldS4ldTolZFxuIiwKKwkJICBOSVBRVUFEKGlwaC0+c2FkZHIpLAorCQkgIE5JUFFVQUQoZGVzdC0+YWRkci5pcCksCisJCSAgbnRvaHMoZGVzdC0+cG9ydCkpOworCisJcmV0dXJuIGRlc3Q7Cit9CisKKworLyoKKyAqICAgICAgSVBWUyBTSCBTY2hlZHVsZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc2NoZWR1bGVyIGlwX3ZzX3NoX3NjaGVkdWxlciA9Cit7CisJLm5hbWUgPQkJCSJzaCIsCisJLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorCS5uX2xpc3QJID0JCUxJU1RfSEVBRF9JTklUKGlwX3ZzX3NoX3NjaGVkdWxlci5uX2xpc3QpLAorI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJLnN1cHBvcnRzX2lwdjYgPQkwLAorI2VuZGlmCisJLmluaXRfc2VydmljZSA9CQlpcF92c19zaF9pbml0X3N2YywKKwkuZG9uZV9zZXJ2aWNlID0JCWlwX3ZzX3NoX2RvbmVfc3ZjLAorCS51cGRhdGVfc2VydmljZSA9CWlwX3ZzX3NoX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX3NoX3NjaGVkdWxlLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpcF92c19zaF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfc2hfc2NoZWR1bGVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfc2hfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c19zaF9zY2hlZHVsZXIpOworfQorCisKK21vZHVsZV9pbml0KGlwX3ZzX3NoX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfc2hfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVlN2UxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtMCwwICsxLDk0MiBAQAorLyoKKyAqIElQVlMgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVAgdmlydHVhbCBzZXJ2ZXIgc3VwcG9ydCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTElOVVggb3BlcmF0aW5nIHN5c3RlbS4gIElQVlMgaXMgbm93IGltcGxlbWVudGVkIGFzIGEgbW9kdWxlCisgKiAgICAgICAgICAgICAgb3ZlciB0aGUgTmV0RmlsdGVyIGZyYW1ld29yay4gSVBWUyBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisgKiAgICAgICAgICAgICAgaGlnaC1wZXJmb3JtYW5jZSBhbmQgaGlnaGx5IGF2YWlsYWJsZSBzZXJ2ZXIgYmFzZWQgb24gYQorICogICAgICAgICAgICAgIGNsdXN0ZXIgb2Ygc2VydmVycy4KKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqIGlwX3ZzX3N5bmM6ICBzeW5jIGNvbm5lY3Rpb24gaW5mbyBmcm9tIG1hc3RlciBsb2FkIGJhbGFuY2VyIHRvIGJhY2t1cHMKKyAqICAgICAgICAgICAgICB0aHJvdWdoIG11bHRpY2FzdAorICoKKyAqIENoYW5nZXM6CisgKglBbGV4YW5kcmUgQ2Fzc2VuCToJQWRkZWQgbWFzdGVyICYgYmFja3VwIHN1cHBvcnQgYXQgYSB0aW1lLgorICoJQWxleGFuZHJlIENhc3Nlbgk6CUFkZGVkIFN5bmNJRCBzdXBwb3J0IGZvciBpbmNvbWluZyBzeW5jCisgKgkJCQkJbWVzc2FnZXMgZmlsdGVyaW5nLgorICoJSnVzdGluIE9zc2V2b29ydAk6CUZpeCBlbmRpYW4gcHJvYmxlbSBvbiBzeW5jIG1lc3NhZ2Ugc2l6ZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4gICAgICAgICAgICAgICAgIC8qIGZvciBpcF9tY19qb2luX2dyb3VwICovCisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KKworI2RlZmluZSBJUF9WU19TWU5DX0dST1VQIDB4ZTAwMDAwNTEgICAgLyogbXVsdGljYXN0IGFkZHIgLSAyMjQuMC4wLjgxICovCisjZGVmaW5lIElQX1ZTX1NZTkNfUE9SVCAgODg0OCAgICAgICAgICAvKiBtdWx0aWNhc3QgcG9ydCAqLworCisKKy8qCisgKglJUFZTIHN5bmMgY29ubmVjdGlvbiBlbnRyeQorICovCitzdHJ1Y3QgaXBfdnNfc3luY19jb25uIHsKKwlfX3U4CQkJcmVzZXJ2ZWQ7CisKKwkvKiBQcm90b2NvbCwgYWRkcmVzc2VzIGFuZCBwb3J0IG51bWJlcnMgKi8KKwlfX3U4CQkJcHJvdG9jb2w7ICAgICAgIC8qIFdoaWNoIHByb3RvY29sIChUQ1AvVURQKSAqLworCV9fYmUxNgkJCWNwb3J0OworCV9fYmUxNiAgICAgICAgICAgICAgICAgIHZwb3J0OworCV9fYmUxNiAgICAgICAgICAgICAgICAgIGRwb3J0OworCV9fYmUzMiAgICAgICAgICAgICAgICAgIGNhZGRyOyAgICAgICAgICAvKiBjbGllbnQgYWRkcmVzcyAqLworCV9fYmUzMiAgICAgICAgICAgICAgICAgIHZhZGRyOyAgICAgICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlfX2JlMzIgICAgICAgICAgICAgICAgICBkYWRkcjsgICAgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisJLyogRmxhZ3MgYW5kIHN0YXRlIHRyYW5zaXRpb24gKi8KKwlfX2JlMTYgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogc3RhdHVzIGZsYWdzICovCisJX19iZTE2ICAgICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIGluZm8gKi8KKworCS8qIFRoZSBzZXF1ZW5jZSBvcHRpb25zIHN0YXJ0IGhlcmUgKi8KK307CisKK3N0cnVjdCBpcF92c19zeW5jX2Nvbm5fb3B0aW9ucyB7CisJc3RydWN0IGlwX3ZzX3NlcSAgICAgICAgaW5fc2VxOyAgICAgICAgIC8qIGluY29taW5nIHNlcS4gc3RydWN0ICovCisJc3RydWN0IGlwX3ZzX3NlcSAgICAgICAgb3V0X3NlcTsgICAgICAgIC8qIG91dGdvaW5nIHNlcS4gc3RydWN0ICovCit9OworCitzdHJ1Y3QgaXBfdnNfc3luY190aHJlYWRfZGF0YSB7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwljaGFyICpidWY7Cit9OworCisjZGVmaW5lIFNJTVBMRV9DT05OX1NJWkUgIChzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfY29ubikpCisjZGVmaW5lIEZVTExfQ09OTl9TSVpFICBcCisoc2l6ZW9mKHN0cnVjdCBpcF92c19zeW5jX2Nvbm4pICsgc2l6ZW9mKHN0cnVjdCBpcF92c19zeW5jX2Nvbm5fb3B0aW9ucykpCisKKworLyoKKyAgVGhlIG1hc3RlciBtdWxpdGNhc3RzIG1lc3NhZ2VzIHRvIHRoZSBiYWNrdXAgbG9hZCBiYWxhbmNlcnMgaW4gdGhlCisgIGZvbGxvd2luZyBmb3JtYXQuCisKKyAgICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgQ291bnQgQ29ubnMgIHwgICAgU3luY0lEICAgICB8ICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgSVBWUyBTeW5jIENvbm5lY3Rpb24gKDEpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgIElQVlMgU3luYyBDb25uZWN0aW9uIChuKSAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKi8KKworI2RlZmluZSBTWU5DX01FU0dfSEVBREVSX0xFTgk0CisjZGVmaW5lIE1BWF9DT05OU19QRVJfU1lOQ0JVRkYJMjU1IC8qIG5yX2Nvbm5zIGluIGlwX3ZzX3N5bmNfbWVzZyBpcyA4IGJpdCAqLworCitzdHJ1Y3QgaXBfdnNfc3luY19tZXNnIHsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBucl9jb25uczsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBzeW5jaWQ7CisJX191MTYgICAgICAgICAgICAgICAgICAgc2l6ZTsKKworCS8qIGlwX3ZzX3N5bmNfY29ubiBlbnRyaWVzIHN0YXJ0IGhlcmUgKi8KK307CisKKy8qIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIChzZW5kaW5nL3JlY2VpdmluZykgbWVzc2FnZSAqLworc3RhdGljIGludCBzeW5jX3NlbmRfbWVzZ19tYXhsZW47CitzdGF0aWMgaW50IHN5bmNfcmVjdl9tZXNnX21heGxlbjsKKworc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmaXJzdHVzZTsKKworCS8qIHBvaW50ZXJzIGZvciB0aGUgbWVzc2FnZSBkYXRhICovCisJc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAgKm1lc2c7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgKmhlYWQ7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgKmVuZDsKK307CisKKworLyogdGhlIHN5bmNfYnVmZiBsaXN0IGhlYWQgYW5kIHRoZSBsb2NrICovCitzdGF0aWMgTElTVF9IRUFEKGlwX3ZzX3N5bmNfcXVldWUpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpcF92c19zeW5jX2xvY2spOworCisvKiBjdXJyZW50IHN5bmNfYnVmZiBmb3IgYWNjZXB0aW5nIG5ldyBjb25uIGVudHJpZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICAgKmN1cnJfc2IgPSBOVUxMOworc3RhdGljIERFRklORV9TUElOTE9DSyhjdXJyX3NiX2xvY2spOworCisvKiBpcHZzIHN5bmMgZGFlbW9uIHN0YXRlICovCit2b2xhdGlsZSBpbnQgaXBfdnNfc3luY19zdGF0ZSA9IElQX1ZTX1NUQVRFX05PTkU7Cit2b2xhdGlsZSBpbnQgaXBfdnNfbWFzdGVyX3N5bmNpZCA9IDA7Cit2b2xhdGlsZSBpbnQgaXBfdnNfYmFja3VwX3N5bmNpZCA9IDA7CisKKy8qIG11bHRpY2FzdCBpbnRlcmZhY2UgbmFtZSAqLworY2hhciBpcF92c19tYXN0ZXJfbWNhc3RfaWZuW0lQX1ZTX0lGTkFNRV9NQVhMRU5dOworY2hhciBpcF92c19iYWNrdXBfbWNhc3RfaWZuW0lQX1ZTX0lGTkFNRV9NQVhMRU5dOworCisvKiBzeW5jIGRhZW1vbiB0YXNrcyAqLworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3luY19tYXN0ZXJfdGhyZWFkOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3luY19iYWNrdXBfdGhyZWFkOworCisvKiBtdWx0aWNhc3QgYWRkciAqLworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBtY2FzdF9hZGRyID0geworCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCisJLnNpbl9wb3J0CQk9IF9fY29uc3RhbnRfaHRvbnMoSVBfVlNfU1lOQ19QT1JUKSwKKwkuc2luX2FkZHIuc19hZGRyCT0gX19jb25zdGFudF9odG9ubChJUF9WU19TWU5DX0dST1VQKSwKK307CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICpzYl9kZXF1ZXVlKHZvaWQpCit7CisJc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7CisKKwlzcGluX2xvY2tfYmgoJmlwX3ZzX3N5bmNfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmlwX3ZzX3N5bmNfcXVldWUpKSB7CisJCXNiID0gTlVMTDsKKwl9IGVsc2UgeworCQlzYiA9IGxpc3RfZW50cnkoaXBfdnNfc3luY19xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYsCisJCQkJbGlzdCk7CisJCWxpc3RfZGVsKCZzYi0+bGlzdCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zeW5jX2xvY2spOworCisJcmV0dXJuIHNiOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKiBpcF92c19zeW5jX2J1ZmZfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7CisKKwlpZiAoIShzYj1rbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19idWZmKSwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKHNiLT5tZXNnPWttYWxsb2Moc3luY19zZW5kX21lc2dfbWF4bGVuLCBHRlBfQVRPTUlDKSkpIHsKKwkJa2ZyZWUoc2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2ItPm1lc2ctPm5yX2Nvbm5zID0gMDsKKwlzYi0+bWVzZy0+c3luY2lkID0gaXBfdnNfbWFzdGVyX3N5bmNpZDsKKwlzYi0+bWVzZy0+c2l6ZSA9IDQ7CisJc2ItPmhlYWQgPSAodW5zaWduZWQgY2hhciAqKXNiLT5tZXNnICsgNDsKKwlzYi0+ZW5kID0gKHVuc2lnbmVkIGNoYXIgKilzYi0+bWVzZyArIHN5bmNfc2VuZF9tZXNnX21heGxlbjsKKwlzYi0+Zmlyc3R1c2UgPSBqaWZmaWVzOworCXJldHVybiBzYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiKQoreworCWtmcmVlKHNiLT5tZXNnKTsKKwlrZnJlZShzYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYl9xdWV1ZV90YWlsKHN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiKQoreworCXNwaW5fbG9jaygmaXBfdnNfc3luY19sb2NrKTsKKwlpZiAoaXBfdnNfc3luY19zdGF0ZSAmIElQX1ZTX1NUQVRFX01BU1RFUikKKwkJbGlzdF9hZGRfdGFpbCgmc2ItPmxpc3QsICZpcF92c19zeW5jX3F1ZXVlKTsKKwllbHNlCisJCWlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHNiKTsKKwlzcGluX3VubG9jaygmaXBfdnNfc3luY19sb2NrKTsKK30KKworLyoKKyAqCUdldCB0aGUgY3VycmVudCBzeW5jIGJ1ZmZlciBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIGZvciBtb3JlCisgKgl0aGFuIHRoZSBzcGVjaWZpZWQgdGltZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUgaXMgemVyby4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdnNfc3luY19idWZmICoKK2dldF9jdXJyX3N5bmNfYnVmZih1bnNpZ25lZCBsb25nIHRpbWUpCit7CisJc3RydWN0IGlwX3ZzX3N5bmNfYnVmZiAqc2I7CisKKwlzcGluX2xvY2tfYmgoJmN1cnJfc2JfbG9jayk7CisJaWYgKGN1cnJfc2IgJiYgKHRpbWUgPT0gMCB8fAorCQkJdGltZV9iZWZvcmUoamlmZmllcyAtIGN1cnJfc2ItPmZpcnN0dXNlLCB0aW1lKSkpIHsKKwkJc2IgPSBjdXJyX3NiOworCQljdXJyX3NiID0gTlVMTDsKKwl9IGVsc2UKKwkJc2IgPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZjdXJyX3NiX2xvY2spOworCXJldHVybiBzYjsKK30KKworCisvKgorICogICAgICBBZGQgYW4gaXBfdnNfY29ubiBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjdXJyZW50IHN5bmNfYnVmZi4KKyAqICAgICAgQ2FsbGVkIGJ5IGlwX3ZzX2luLgorICovCit2b2lkIGlwX3ZzX3N5bmNfY29ubihzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCit7CisJc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAqbTsKKwlzdHJ1Y3QgaXBfdnNfc3luY19jb25uICpzOworCWludCBsZW47CisKKwlzcGluX2xvY2soJmN1cnJfc2JfbG9jayk7CisJaWYgKCFjdXJyX3NiKSB7CisJCWlmICghKGN1cnJfc2I9aXBfdnNfc3luY19idWZmX2NyZWF0ZSgpKSkgeworCQkJc3Bpbl91bmxvY2soJmN1cnJfc2JfbG9jayk7CisJCQlJUF9WU19FUlIoImlwX3ZzX3N5bmNfYnVmZl9jcmVhdGUgZmFpbGVkLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlsZW4gPSAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1NFUV9NQVNLKSA/IEZVTExfQ09OTl9TSVpFIDoKKwkJU0lNUExFX0NPTk5fU0laRTsKKwltID0gY3Vycl9zYi0+bWVzZzsKKwlzID0gKHN0cnVjdCBpcF92c19zeW5jX2Nvbm4gKiljdXJyX3NiLT5oZWFkOworCisJLyogY29weSBtZW1iZXJzICovCisJcy0+cHJvdG9jb2wgPSBjcC0+cHJvdG9jb2w7CisJcy0+Y3BvcnQgPSBjcC0+Y3BvcnQ7CisJcy0+dnBvcnQgPSBjcC0+dnBvcnQ7CisJcy0+ZHBvcnQgPSBjcC0+ZHBvcnQ7CisJcy0+Y2FkZHIgPSBjcC0+Y2FkZHIuaXA7CisJcy0+dmFkZHIgPSBjcC0+dmFkZHIuaXA7CisJcy0+ZGFkZHIgPSBjcC0+ZGFkZHIuaXA7CisJcy0+ZmxhZ3MgPSBodG9ucyhjcC0+ZmxhZ3MgJiB+SVBfVlNfQ09OTl9GX0hBU0hFRCk7CisJcy0+c3RhdGUgPSBodG9ucyhjcC0+c3RhdGUpOworCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU0VRX01BU0spIHsKKwkJc3RydWN0IGlwX3ZzX3N5bmNfY29ubl9vcHRpb25zICpvcHQgPQorCQkJKHN0cnVjdCBpcF92c19zeW5jX2Nvbm5fb3B0aW9ucyAqKSZzWzFdOworCQltZW1jcHkob3B0LCAmY3AtPmluX3NlcSwgc2l6ZW9mKCpvcHQpKTsKKwl9CisKKwltLT5ucl9jb25ucysrOworCW0tPnNpemUgKz0gbGVuOworCWN1cnJfc2ItPmhlYWQgKz0gbGVuOworCisJLyogY2hlY2sgaWYgdGhlcmUgaXMgYSBzcGFjZSBmb3IgbmV4dCBvbmUgKi8KKwlpZiAoY3Vycl9zYi0+aGVhZCtGVUxMX0NPTk5fU0laRSA+IGN1cnJfc2ItPmVuZCkgeworCQlzYl9xdWV1ZV90YWlsKGN1cnJfc2IpOworCQljdXJyX3NiID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmN1cnJfc2JfbG9jayk7CisKKwkvKiBzeW5jaHJvbml6ZSBpdHMgY29udHJvbGxlciBpZiBpdCBoYXMgKi8KKwlpZiAoY3AtPmNvbnRyb2wpCisJCWlwX3ZzX3N5bmNfY29ubihjcC0+Y29udHJvbCk7Cit9CisKKworLyoKKyAqICAgICAgUHJvY2VzcyByZWNlaXZlZCBtdWx0aWNhc3QgbWVzc2FnZSBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgICAgIGlwX3ZzX2Nvbm4gZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgaXBfdnNfcHJvY2Vzc19tZXNzYWdlKGNvbnN0IGNoYXIgKmJ1ZmZlciwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaXBfdnNfc3luY19tZXNnICptID0gKHN0cnVjdCBpcF92c19zeW5jX21lc2cgKilidWZmZXI7CisJc3RydWN0IGlwX3ZzX3N5bmNfY29ubiAqczsKKwlzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgKm9wdDsKKwlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CisJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcDsKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwljaGFyICpwOworCWludCBpOworCisJaWYgKGJ1ZmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBfdnNfc3luY19tZXNnKSkgeworCQlJUF9WU19FUlJfUkwoInN5bmMgbWVzc2FnZSBoZWFkZXIgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbnZlcnQgc2l6ZSBiYWNrIHRvIGhvc3QgYnl0ZSBvcmRlciAqLworCW0tPnNpemUgPSBudG9ocyhtLT5zaXplKTsKKworCWlmIChidWZsZW4gIT0gbS0+c2l6ZSkgeworCQlJUF9WU19FUlJfUkwoImJvZ3VzIHN5bmMgbWVzc2FnZSBzaXplXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFN5bmNJRCBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoaXBfdnNfYmFja3VwX3N5bmNpZCAhPSAwICYmIG0tPnN5bmNpZCAhPSBpcF92c19iYWNrdXBfc3luY2lkKSB7CisJCUlQX1ZTX0RCRyg3LCAiSWdub3JpbmcgaW5jb21pbmcgbXNnIHdpdGggc3luY2lkID0gJWRcbiIsCisJCQkgIG0tPnN5bmNpZCk7CisJCXJldHVybjsKKwl9CisKKwlwID0gKGNoYXIgKilidWZmZXIgKyBzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyk7CisJZm9yIChpPTA7IGk8bS0+bnJfY29ubnM7IGkrKykgeworCQl1bnNpZ25lZCBmbGFncywgc3RhdGU7CisKKwkJaWYgKHAgKyBTSU1QTEVfQ09OTl9TSVpFID4gYnVmZmVyK2J1ZmxlbikgeworCQkJSVBfVlNfRVJSX1JMKCJib2d1cyBjb25uIGluIHN5bmMgbWVzc2FnZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJcyA9IChzdHJ1Y3QgaXBfdnNfc3luY19jb25uICopIHA7CisJCWZsYWdzID0gbnRvaHMocy0+ZmxhZ3MpIHwgSVBfVlNfQ09OTl9GX1NZTkM7CisJCWZsYWdzICY9IH5JUF9WU19DT05OX0ZfSEFTSEVEOworCQlpZiAoZmxhZ3MgJiBJUF9WU19DT05OX0ZfU0VRX01BU0spIHsKKwkJCW9wdCA9IChzdHJ1Y3QgaXBfdnNfc3luY19jb25uX29wdGlvbnMgKikmc1sxXTsKKwkJCXAgKz0gRlVMTF9DT05OX1NJWkU7CisJCQlpZiAocCA+IGJ1ZmZlcitidWZsZW4pIHsKKwkJCQlJUF9WU19FUlJfUkwoImJvZ3VzIGNvbm4gb3B0aW9ucyBpbiBzeW5jIG1lc3NhZ2VcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW9wdCA9IE5VTEw7CisJCQlwICs9IFNJTVBMRV9DT05OX1NJWkU7CisJCX0KKworCQlzdGF0ZSA9IG50b2hzKHMtPnN0YXRlKTsKKwkJaWYgKCEoZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKSB7CisJCQlwcCA9IGlwX3ZzX3Byb3RvX2dldChzLT5wcm90b2NvbCk7CisJCQlpZiAoIXBwKSB7CisJCQkJSVBfVlNfRVJSX1JMKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAldSBpbiBzeW5jIG1zZ1xuIiwKKwkJCQkJcy0+cHJvdG9jb2wpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0YXRlID49IHBwLT5udW1fc3RhdGVzKSB7CisJCQkJSVBfVlNfREJHKDIsICJJbnZhbGlkICVzIHN0YXRlICV1IGluIHN5bmMgbXNnXG4iLAorCQkJCQlwcC0+bmFtZSwgc3RhdGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogcHJvdG9jb2wgaW4gdGVtcGxhdGVzIGlzIG5vdCB1c2VkIGZvciBzdGF0ZS90aW1lb3V0ICovCisJCQlwcCA9IE5VTEw7CisJCQlpZiAoc3RhdGUgPiAwKSB7CisJCQkJSVBfVlNfREJHKDIsICJJbnZhbGlkIHRlbXBsYXRlIHN0YXRlICV1IGluIHN5bmMgbXNnXG4iLAorCQkJCQlzdGF0ZSk7CisJCQkJc3RhdGUgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKCEoZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpKQorCQkJY3AgPSBpcF92c19jb25uX2luX2dldChBRl9JTkVULCBzLT5wcm90b2NvbCwKKwkJCQkJICAgICAgICh1bmlvbiBuZl9pbmV0X2FkZHIgKikmcy0+Y2FkZHIsCisJCQkJCSAgICAgICBzLT5jcG9ydCwKKwkJCQkJICAgICAgICh1bmlvbiBuZl9pbmV0X2FkZHIgKikmcy0+dmFkZHIsCisJCQkJCSAgICAgICBzLT52cG9ydCk7CisJCWVsc2UKKwkJCWNwID0gaXBfdnNfY3RfaW5fZ2V0KEFGX0lORVQsIHMtPnByb3RvY29sLAorCQkJCQkgICAgICh1bmlvbiBuZl9pbmV0X2FkZHIgKikmcy0+Y2FkZHIsCisJCQkJCSAgICAgcy0+Y3BvcnQsCisJCQkJCSAgICAgKHVuaW9uIG5mX2luZXRfYWRkciAqKSZzLT52YWRkciwKKwkJCQkJICAgICBzLT52cG9ydCk7CisJCWlmICghY3ApIHsKKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb24uCisJCQkgKiBJZiBpdCBpcyBub3QgZm91bmQgdGhlIGNvbm5lY3Rpb24gd2lsbCByZW1haW4gdW5ib3VuZAorCQkJICogYnV0IHN0aWxsIGhhbmRsZWQuCisJCQkgKi8KKwkJCWRlc3QgPSBpcF92c19maW5kX2Rlc3QoQUZfSU5FVCwKKwkJCQkJICAgICAgICh1bmlvbiBuZl9pbmV0X2FkZHIgKikmcy0+ZGFkZHIsCisJCQkJCSAgICAgICBzLT5kcG9ydCwKKwkJCQkJICAgICAgICh1bmlvbiBuZl9pbmV0X2FkZHIgKikmcy0+dmFkZHIsCisJCQkJCSAgICAgICBzLT52cG9ydCwKKwkJCQkJICAgICAgIHMtPnByb3RvY29sKTsKKwkJCS8qICBTZXQgdGhlIGFwcHJvcHJpdGUgYXRpdml0eSBmbGFnICovCisJCQlpZiAocy0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJCQlpZiAoc3RhdGUgIT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpCisJCQkJCWZsYWdzIHw9IElQX1ZTX0NPTk5fRl9JTkFDVElWRTsKKwkJCQllbHNlCisJCQkJCWZsYWdzICY9IH5JUF9WU19DT05OX0ZfSU5BQ1RJVkU7CisJCQl9CisJCQljcCA9IGlwX3ZzX2Nvbm5fbmV3KEFGX0lORVQsIHMtPnByb3RvY29sLAorCQkJCQkgICAgKHVuaW9uIG5mX2luZXRfYWRkciAqKSZzLT5jYWRkciwKKwkJCQkJICAgIHMtPmNwb3J0LAorCQkJCQkgICAgKHVuaW9uIG5mX2luZXRfYWRkciAqKSZzLT52YWRkciwKKwkJCQkJICAgIHMtPnZwb3J0LAorCQkJCQkgICAgKHVuaW9uIG5mX2luZXRfYWRkciAqKSZzLT5kYWRkciwKKwkJCQkJICAgIHMtPmRwb3J0LAorCQkJCQkgICAgZmxhZ3MsIGRlc3QpOworCQkJaWYgKGRlc3QpCisJCQkJYXRvbWljX2RlYygmZGVzdC0+cmVmY250KTsKKwkJCWlmICghY3ApIHsKKwkJCQlJUF9WU19FUlIoImlwX3ZzX2Nvbm5fbmV3IGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgaWYgKCFjcC0+ZGVzdCkgeworCQkJZGVzdCA9IGlwX3ZzX3RyeV9iaW5kX2Rlc3QoY3ApOworCQkJaWYgKGRlc3QpCisJCQkJYXRvbWljX2RlYygmZGVzdC0+cmVmY250KTsKKwkJfSBlbHNlIGlmICgoY3AtPmRlc3QpICYmIChjcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApICYmCisJCQkgICAoY3AtPnN0YXRlICE9IHN0YXRlKSkgeworCQkJLyogdXBkYXRlIGFjdGl2ZS9pbmFjdGl2ZSBmbGFnIGZvciB0aGUgY29ubmVjdGlvbiAqLworCQkJZGVzdCA9IGNwLT5kZXN0OworCQkJaWYgKCEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX0lOQUNUSVZFKSAmJgorCQkJCShzdGF0ZSAhPSBJUF9WU19UQ1BfU19FU1RBQkxJU0hFRCkpIHsKKwkJCQlhdG9taWNfZGVjKCZkZXN0LT5hY3RpdmVjb25ucyk7CisJCQkJYXRvbWljX2luYygmZGVzdC0+aW5hY3Rjb25ucyk7CisJCQkJY3AtPmZsYWdzIHw9IElQX1ZTX0NPTk5fRl9JTkFDVElWRTsKKwkJCX0gZWxzZSBpZiAoKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkgJiYKKwkJCQkoc3RhdGUgPT0gSVBfVlNfVENQX1NfRVNUQUJMSVNIRUQpKSB7CisJCQkJYXRvbWljX2luYygmZGVzdC0+YWN0aXZlY29ubnMpOworCQkJCWF0b21pY19kZWMoJmRlc3QtPmluYWN0Y29ubnMpOworCQkJCWNwLT5mbGFncyAmPSB+SVBfVlNfQ09OTl9GX0lOQUNUSVZFOworCQkJfQorCQl9CisKKwkJaWYgKG9wdCkKKwkJCW1lbWNweSgmY3AtPmluX3NlcSwgb3B0LCBzaXplb2YoKm9wdCkpOworCQlhdG9taWNfc2V0KCZjcC0+aW5fcGt0cywgc3lzY3RsX2lwX3ZzX3N5bmNfdGhyZXNob2xkWzBdKTsKKwkJY3AtPnN0YXRlID0gc3RhdGU7CisJCWNwLT5vbGRfc3RhdGUgPSBjcC0+c3RhdGU7CisJCS8qCisJCSAqIFdlIGNhbiBub3QgcmVjb3ZlciB0aGUgcmlnaHQgdGltZW91dCBmb3IgdGVtcGxhdGVzCisJCSAqIGluIGFsbCBjYXNlcywgd2UgY2FuIG5vdCBmaW5kIHRoZSByaWdodCBmd21hcmsKKwkJICogdmlydHVhbCBzZXJ2aWNlLiBJZiBuZWVkZWQsIHdlIGNhbiBkbyBpdCBmb3IKKwkJICogbm9uLWZ3bWFyayBwZXJzaXN0ZW50IHNlcnZpY2VzLgorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiBJUF9WU19DT05OX0ZfVEVNUExBVEUpICYmIHBwLT50aW1lb3V0X3RhYmxlKQorCQkJY3AtPnRpbWVvdXQgPSBwcC0+dGltZW91dF90YWJsZVtzdGF0ZV07CisJCWVsc2UKKwkJCWNwLT50aW1lb3V0ID0gKDMqNjAqSFopOworCQlpcF92c19jb25uX3B1dChjcCk7CisJfQorfQorCisKKy8qCisgKiAgICAgIFNldHVwIGxvb3BiYWNrIG9mIG91dGdvaW5nIG11bHRpY2FzdHMgb24gYSBzZW5kaW5nIHNvY2tldAorICovCitzdGF0aWMgdm9pZCBzZXRfbWNhc3RfbG9vcChzdHJ1Y3Qgc29jayAqc2ssIHVfY2hhciBsb29wKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCS8qIHNldHNvY2tvcHQoc29jaywgU09MX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCwgJmxvb3AsIHNpemVvZihsb29wKSk7ICovCisJbG9ja19zb2NrKHNrKTsKKwlpbmV0LT5tY19sb29wID0gbG9vcCA/IDEgOiAwOworCXJlbGVhc2Vfc29jayhzayk7Cit9CisKKy8qCisgKiAgICAgIFNwZWNpZnkgVFRMIGZvciBvdXRnb2luZyBtdWx0aWNhc3RzIG9uIGEgc2VuZGluZyBzb2NrZXQKKyAqLworc3RhdGljIHZvaWQgc2V0X21jYXN0X3R0bChzdHJ1Y3Qgc29jayAqc2ssIHVfY2hhciB0dGwpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCisJLyogc2V0c29ja29wdChzb2NrLCBTT0xfSVAsIElQX01VTFRJQ0FTVF9UVEwsICZ0dGwsIHNpemVvZih0dGwpKTsgKi8KKwlsb2NrX3NvY2soc2spOworCWluZXQtPm1jX3R0bCA9IHR0bDsKKwlyZWxlYXNlX3NvY2soc2spOworfQorCisvKgorICogICAgICBTcGVjaWZpeSBkZWZhdWx0IGludGVyZmFjZSBmb3Igb3V0Z29pbmcgbXVsdGljYXN0cworICovCitzdGF0aWMgaW50IHNldF9tY2FzdF9pZihzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpZm5hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICYmIGRldi0+aWZpbmRleCAhPSBzay0+c2tfYm91bmRfZGV2X2lmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJaW5ldC0+bWNfaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJLyogIGluZXQtPm1jX2FkZHIgID0gMDsgKi8KKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCVNldCB0aGUgbWF4aW11bSBsZW5ndGggb2Ygc3luYyBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUKKyAqCXNwZWNpZmllZCBpbnRlcmZhY2UncyBNVFUuCisgKi8KK3N0YXRpYyBpbnQgc2V0X3N5bmNfbWVzZ19tYXhsZW4oaW50IHN5bmNfc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgbnVtOworCisJaWYgKHN5bmNfc3RhdGUgPT0gSVBfVlNfU1RBVEVfTUFTVEVSKSB7CisJCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpcF92c19tYXN0ZXJfbWNhc3RfaWZuKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCW51bSA9IChkZXYtPm10dSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAtCisJCSAgICAgICBTWU5DX01FU0dfSEVBREVSX0xFTiAtIDIwKSAvIFNJTVBMRV9DT05OX1NJWkU7CisJCXN5bmNfc2VuZF9tZXNnX21heGxlbiA9IFNZTkNfTUVTR19IRUFERVJfTEVOICsKKwkJCVNJTVBMRV9DT05OX1NJWkUgKiBtaW4obnVtLCBNQVhfQ09OTlNfUEVSX1NZTkNCVUZGKTsKKwkJSVBfVlNfREJHKDcsICJzZXR0aW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIHNlbmRpbmcgIgorCQkJICAibWVzc2FnZSAlZC5cbiIsIHN5bmNfc2VuZF9tZXNnX21heGxlbik7CisJfSBlbHNlIGlmIChzeW5jX3N0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkgeworCQlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaXBfdnNfYmFja3VwX21jYXN0X2lmbikpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlzeW5jX3JlY3ZfbWVzZ19tYXhsZW4gPSBkZXYtPm10dSAtCisJCQlzaXplb2Yoc3RydWN0IGlwaGRyKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJSVBfVlNfREJHKDcsICJzZXR0aW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeW5jIHJlY2VpdmluZyAiCisJCQkgICJtZXNzYWdlICVkLlxuIiwgc3luY19yZWN2X21lc2dfbWF4bGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICBKb2luIGEgbXVsdGljYXN0IGdyb3VwLgorICogICAgICB0aGUgZ3JvdXAgaXMgc3BlY2lmaWVkIGJ5IGEgY2xhc3MgRCBtdWx0aWNhc3QgYWRkcmVzcyAyMjQuMC4wLjAvOAorICogICAgICBpbiB0aGUgaW5fYWRkciBzdHJ1Y3R1cmUgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50Citqb2luX21jYXN0X2dyb3VwKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluX2FkZHIgKmFkZHIsIGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXQ7CisKKwltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJbWVtY3B5KCZtcmVxLmltcl9tdWx0aWFkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCisJaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGlmbmFtZSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICYmIGRldi0+aWZpbmRleCAhPSBzay0+c2tfYm91bmRfZGV2X2lmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1yZXEuaW1yX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisKKwlsb2NrX3NvY2soc2spOworCXJldCA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGJpbmRfbWNhc3RpZl9hZGRyKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCV9fYmUzMiBhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaWZuYW1lKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhZGRyID0gaW5ldF9zZWxlY3RfYWRkcihkZXYsIDAsIFJUX1NDT1BFX1VOSVZFUlNFKTsKKwlpZiAoIWFkZHIpCisJCUlQX1ZTX0VSUigiWW91IHByb2JhYmx5IG5lZWQgdG8gc3BlY2lmeSBJUCBhZGRyZXNzIG9uICIKKwkJCSAgIm11bHRpY2FzdCBpbnRlcmZhY2UuXG4iKTsKKworCUlQX1ZTX0RCRyg3LCAiYmluZGluZyBzb2NrZXQgd2l0aCAoJXMpICV1LiV1LiV1LiV1XG4iLAorCQkgIGlmbmFtZSwgTklQUVVBRChhZGRyKSk7CisKKwkvKiBOb3cgYmluZCB0aGUgc29ja2V0IHdpdGggdGhlIGFkZHJlc3Mgb2YgbXVsdGljYXN0IGludGVyZmFjZSAqLworCXNpbi5zaW5fZmFtaWx5CSAgICAgPSBBRl9JTkVUOworCXNpbi5zaW5fYWRkci5zX2FkZHIgID0gYWRkcjsKKwlzaW4uc2luX3BvcnQgICAgICAgICA9IDA7CisKKwlyZXR1cm4gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZzaW4sIHNpemVvZihzaW4pKTsKK30KKworLyoKKyAqICAgICAgU2V0IHVwIHNlbmRpbmcgbXVsdGljYXN0IHNvY2tldCBvdmVyIFVEUAorICovCitzdGF0aWMgc3RydWN0IHNvY2tldCAqIG1ha2Vfc2VuZF9zb2NrKHZvaWQpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgcmVzdWx0OworCisJLyogRmlyc3QgY3JlYXRlIGEgc29ja2V0ICovCisJcmVzdWx0ID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJnNvY2spOworCWlmIChyZXN1bHQgPCAwKSB7CisJCUlQX1ZTX0VSUigiRXJyb3IgZHVyaW5nIGNyZWF0aW9uIG9mIHNvY2tldDsgdGVybWluYXRpbmdcbiIpOworCQlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworCX0KKworCXJlc3VsdCA9IHNldF9tY2FzdF9pZihzb2NrLT5zaywgaXBfdnNfbWFzdGVyX21jYXN0X2lmbik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBzZXR0aW5nIG91dGJvdW5kIG1jYXN0IGludGVyZmFjZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2V0X21jYXN0X2xvb3Aoc29jay0+c2ssIDApOworCXNldF9tY2FzdF90dGwoc29jay0+c2ssIDEpOworCisJcmVzdWx0ID0gYmluZF9tY2FzdGlmX2FkZHIoc29jaywgaXBfdnNfbWFzdGVyX21jYXN0X2lmbik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBiaW5kaW5nIGFkZHJlc3Mgb2YgdGhlIG1jYXN0IGludGVyZmFjZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVzdWx0ID0gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1jYXN0X2FkZHIsCisJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyKSwgMCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBtdWx0aWNhc3QgYWRkclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHNvY2s7CisKKyAgZXJyb3I6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyoKKyAqICAgICAgU2V0IHVwIHJlY2VpdmluZyBtdWx0aWNhc3Qgc29ja2V0IG92ZXIgVURQCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICogbWFrZV9yZWNlaXZlX3NvY2sodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWludCByZXN1bHQ7CisKKwkvKiBGaXJzdCBjcmVhdGUgYSBzb2NrZXQgKi8KKwlyZXN1bHQgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAmc29jayk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJSVBfVlNfRVJSKCJFcnJvciBkdXJpbmcgY3JlYXRpb24gb2Ygc29ja2V0OyB0ZXJtaW5hdGluZ1xuIik7CisJCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7CisJfQorCisJLyogaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgUkVVU0VBRERSIG9wdGlvbiBpbiB1c2VyLXNwYWNlICovCisJc29jay0+c2stPnNrX3JldXNlID0gMTsKKworCXJlc3VsdCA9IHNvY2stPm9wcy0+YmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZtY2FzdF9hZGRyLAorCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCUlQX1ZTX0VSUigiRXJyb3IgYmluZGluZyB0byB0aGUgbXVsdGljYXN0IGFkZHJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGpvaW4gdGhlIG11bHRpY2FzdCBncm91cCAqLworCXJlc3VsdCA9IGpvaW5fbWNhc3RfZ3JvdXAoc29jay0+c2ssCisJCQkoc3RydWN0IGluX2FkZHIgKikgJm1jYXN0X2FkZHIuc2luX2FkZHIsCisJCQlpcF92c19iYWNrdXBfbWNhc3RfaWZuKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlJUF9WU19FUlIoIkVycm9yIGpvaW5pbmcgdG8gdGhlIG11bHRpY2FzdCBncm91cFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHNvY2s7CisKKyAgZXJyb3I6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworc3RhdGljIGludAoraXBfdnNfc2VuZF9hc3luYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBjb25zdCBjaGFyICpidWZmZXIsIGNvbnN0IHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IG1zZ2hkcgltc2cgPSB7Lm1zZ19mbGFncyA9IE1TR19ET05UV0FJVHxNU0dfTk9TSUdOQUx9OworCXN0cnVjdCBrdmVjCWlvdjsKKwlpbnQJCWxlbjsKKworCUVudGVyRnVuY3Rpb24oNyk7CisJaW92Lmlvdl9iYXNlICAgICA9ICh2b2lkICopYnVmZmVyOworCWlvdi5pb3ZfbGVuICAgICAgPSBsZW5ndGg7CisKKwlsZW4gPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCAoc2l6ZV90KShsZW5ndGgpKTsKKworCUxlYXZlRnVuY3Rpb24oNyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK2lwX3ZzX3NlbmRfc3luY19tc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IGlwX3ZzX3N5bmNfbWVzZyAqbXNnKQoreworCWludCBtc2l6ZTsKKworCW1zaXplID0gbXNnLT5zaXplOworCisJLyogUHV0IHNpemUgaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJbXNnLT5zaXplID0gaHRvbnMobXNnLT5zaXplKTsKKworCWlmIChpcF92c19zZW5kX2FzeW5jKHNvY2ssIChjaGFyICopbXNnLCBtc2l6ZSkgIT0gbXNpemUpCisJCUlQX1ZTX0VSUigiaXBfdnNfc2VuZF9hc3luYyBlcnJvclxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2lwX3ZzX3JlY2VpdmUoc3RydWN0IHNvY2tldCAqc29jaywgY2hhciAqYnVmZmVyLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCBtc2doZHIJCW1zZyA9IHtOVUxMLH07CisJc3RydWN0IGt2ZWMJCWlvdjsKKwlpbnQJCQlsZW47CisKKwlFbnRlckZ1bmN0aW9uKDcpOworCisJLyogUmVjZWl2ZSBhIHBhY2tldCAqLworCWlvdi5pb3ZfYmFzZSAgICAgPSBidWZmZXI7CisJaW92Lmlvdl9sZW4gICAgICA9IChzaXplX3QpYnVmbGVuOworCisJbGVuID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgJmlvdiwgMSwgYnVmbGVuLCAwKTsKKworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlMZWF2ZUZ1bmN0aW9uKDcpOworCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludCBzeW5jX3RocmVhZF9tYXN0ZXIodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc3luY190aHJlYWRfZGF0YSAqdGluZm8gPSBkYXRhOworCXN0cnVjdCBpcF92c19zeW5jX2J1ZmYgKnNiOworCisJSVBfVlNfSU5GTygic3luYyB0aHJlYWQgc3RhcnRlZDogc3RhdGUgPSBNQVNURVIsIG1jYXN0X2lmbiA9ICVzLCAiCisJCSAgICJzeW5jaWQgPSAlZFxuIiwKKwkJICAgaXBfdnNfbWFzdGVyX21jYXN0X2lmbiwgaXBfdnNfbWFzdGVyX3N5bmNpZCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQl3aGlsZSAoKHNiID0gc2JfZGVxdWV1ZSgpKSkgeworCQkJaXBfdnNfc2VuZF9zeW5jX21zZyh0aW5mby0+c29jaywgc2ItPm1lc2cpOworCQkJaXBfdnNfc3luY19idWZmX3JlbGVhc2Uoc2IpOworCQl9CisKKwkJLyogY2hlY2sgaWYgZW50cmllcyBzdGF5IGluIGN1cnJfc2IgZm9yIDIgc2Vjb25kcyAqLworCQlzYiA9IGdldF9jdXJyX3N5bmNfYnVmZigyICogSFopOworCQlpZiAoc2IpIHsKKwkJCWlwX3ZzX3NlbmRfc3luY19tc2codGluZm8tPnNvY2ssIHNiLT5tZXNnKTsKKwkJCWlwX3ZzX3N5bmNfYnVmZl9yZWxlYXNlKHNiKTsKKwkJfQorCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWik7CisJfQorCisJLyogY2xlYW4gdXAgdGhlIHN5bmNfYnVmZiBxdWV1ZSAqLworCXdoaWxlICgoc2I9c2JfZGVxdWV1ZSgpKSkgeworCQlpcF92c19zeW5jX2J1ZmZfcmVsZWFzZShzYik7CisJfQorCisJLyogY2xlYW4gdXAgdGhlIGN1cnJlbnQgc3luY19idWZmICovCisJaWYgKChzYiA9IGdldF9jdXJyX3N5bmNfYnVmZigwKSkpIHsKKwkJaXBfdnNfc3luY19idWZmX3JlbGVhc2Uoc2IpOworCX0KKworCS8qIHJlbGVhc2UgdGhlIHNlbmRpbmcgbXVsdGljYXN0IHNvY2tldCAqLworCXNvY2tfcmVsZWFzZSh0aW5mby0+c29jayk7CisJa2ZyZWUodGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzeW5jX3RocmVhZF9iYWNrdXAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBfdnNfc3luY190aHJlYWRfZGF0YSAqdGluZm8gPSBkYXRhOworCWludCBsZW47CisKKwlJUF9WU19JTkZPKCJzeW5jIHRocmVhZCBzdGFydGVkOiBzdGF0ZSA9IEJBQ0tVUCwgbWNhc3RfaWZuID0gJXMsICIKKwkJICAgInN5bmNpZCA9ICVkXG4iLAorCQkgICBpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBpcF92c19iYWNrdXBfc3luY2lkKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgqdGluZm8tPnNvY2stPnNrLT5za19zbGVlcCwKKwkJCSAhc2tiX3F1ZXVlX2VtcHR5KCZ0aW5mby0+c29jay0+c2stPnNrX3JlY2VpdmVfcXVldWUpCisJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKworCQkvKiBkbyB3ZSBoYXZlIGRhdGEgbm93PyAqLworCQl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmKHRpbmZvLT5zb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCQlsZW4gPSBpcF92c19yZWNlaXZlKHRpbmZvLT5zb2NrLCB0aW5mby0+YnVmLAorCQkJCQlzeW5jX3JlY3ZfbWVzZ19tYXhsZW4pOworCQkJaWYgKGxlbiA8PSAwKSB7CisJCQkJSVBfVlNfRVJSKCJyZWNlaXZpbmcgbWVzc2FnZSBlcnJvclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGRpc2FibGUgYm90dG9tIGhhbGYsIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGRhdGEKKwkJCSAgIHNoYXJlZCBieSBzb2Z0aXJxIHdoaWxlIGdldHRpbmcvY3JlYXRpbmcgY29ubnMgKi8KKwkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJCWlwX3ZzX3Byb2Nlc3NfbWVzc2FnZSh0aW5mby0+YnVmLCBsZW4pOworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCX0KKwl9CisKKwkvKiByZWxlYXNlIHRoZSBzZW5kaW5nIG11bHRpY2FzdCBzb2NrZXQgKi8KKwlzb2NrX3JlbGVhc2UodGluZm8tPnNvY2spOworCWtmcmVlKHRpbmZvLT5idWYpOworCWtmcmVlKHRpbmZvKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBzdGFydF9zeW5jX3RocmVhZChpbnQgc3RhdGUsIGNoYXIgKm1jYXN0X2lmbiwgX191OCBzeW5jaWQpCit7CisJc3RydWN0IGlwX3ZzX3N5bmNfdGhyZWFkX2RhdGEgKnRpbmZvOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqKnJlYWx0YXNrLCAqdGFzazsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWNoYXIgKm5hbWUsICpidWYgPSBOVUxMOworCWludCAoKnRocmVhZGZuKSh2b2lkICpkYXRhKTsKKwlpbnQgcmVzdWx0ID0gLUVOT01FTTsKKworCUlQX1ZTX0RCRyg3LCAiJXM6IHBpZCAlZFxuIiwgX19mdW5jX18sIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwlJUF9WU19EQkcoNywgIkVhY2ggaXBfdnNfc3luY19jb25uIGVudHJ5IG5lZWRzICVaZCBieXRlc1xuIiwKKwkJICBzaXplb2Yoc3RydWN0IGlwX3ZzX3N5bmNfY29ubikpOworCisJaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgeworCQlpZiAoc3luY19tYXN0ZXJfdGhyZWFkKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwkJc3RybGNweShpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBtY2FzdF9pZm4sCisJCQlzaXplb2YoaXBfdnNfbWFzdGVyX21jYXN0X2lmbikpOworCQlpcF92c19tYXN0ZXJfc3luY2lkID0gc3luY2lkOworCQlyZWFsdGFzayA9ICZzeW5jX21hc3Rlcl90aHJlYWQ7CisJCW5hbWUgPSAiaXB2c19zeW5jbWFzdGVyIjsKKwkJdGhyZWFkZm4gPSBzeW5jX3RocmVhZF9tYXN0ZXI7CisJCXNvY2sgPSBtYWtlX3NlbmRfc29jaygpOworCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVBfVlNfU1RBVEVfQkFDS1VQKSB7CisJCWlmIChzeW5jX2JhY2t1cF90aHJlYWQpCisJCQlyZXR1cm4gLUVFWElTVDsKKworCQlzdHJsY3B5KGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4sIG1jYXN0X2lmbiwKKwkJCXNpemVvZihpcF92c19iYWNrdXBfbWNhc3RfaWZuKSk7CisJCWlwX3ZzX2JhY2t1cF9zeW5jaWQgPSBzeW5jaWQ7CisJCXJlYWx0YXNrID0gJnN5bmNfYmFja3VwX3RocmVhZDsKKwkJbmFtZSA9ICJpcHZzX3N5bmNiYWNrdXAiOworCQl0aHJlYWRmbiA9IHN5bmNfdGhyZWFkX2JhY2t1cDsKKwkJc29jayA9IG1ha2VfcmVjZWl2ZV9zb2NrKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKElTX0VSUihzb2NrKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHNvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXRfc3luY19tZXNnX21heGxlbihzdGF0ZSk7CisJaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkgeworCQlidWYgPSBrbWFsbG9jKHN5bmNfcmVjdl9tZXNnX21heGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKQorCQkJZ290byBvdXRzb2NrZXQ7CisJfQorCisJdGluZm8gPSBrbWFsbG9jKHNpemVvZigqdGluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRpbmZvKQorCQlnb3RvIG91dGJ1ZjsKKworCXRpbmZvLT5zb2NrID0gc29jazsKKwl0aW5mby0+YnVmID0gYnVmOworCisJdGFzayA9IGt0aHJlYWRfcnVuKHRocmVhZGZuLCB0aW5mbywgbmFtZSk7CisJaWYgKElTX0VSUih0YXNrKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHRhc2spOworCQlnb3RvIG91dHRpbmZvOworCX0KKworCS8qIG1hcmsgYXMgYWN0aXZlICovCisJKnJlYWx0YXNrID0gdGFzazsKKwlpcF92c19zeW5jX3N0YXRlIHw9IHN0YXRlOworCisJLyogaW5jcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KKwlpcF92c191c2VfY291bnRfaW5jKCk7CisKKwlyZXR1cm4gMDsKKworb3V0dGluZm86CisJa2ZyZWUodGluZm8pOworb3V0YnVmOgorCWtmcmVlKGJ1Zik7CitvdXRzb2NrZXQ6CisJc29ja19yZWxlYXNlKHNvY2spOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworaW50IHN0b3Bfc3luY190aHJlYWQoaW50IHN0YXRlKQoreworCUlQX1ZTX0RCRyg3LCAiJXM6IHBpZCAlZFxuIiwgX19mdW5jX18sIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKworCWlmIChzdGF0ZSA9PSBJUF9WU19TVEFURV9NQVNURVIpIHsKKwkJaWYgKCFzeW5jX21hc3Rlcl90aHJlYWQpCisJCQlyZXR1cm4gLUVTUkNIOworCisJCUlQX1ZTX0lORk8oInN0b3BwaW5nIG1hc3RlciBzeW5jIHRocmVhZCAlZCAuLi5cbiIsCisJCQkgICB0YXNrX3BpZF9ucihzeW5jX21hc3Rlcl90aHJlYWQpKTsKKworCQkvKgorCQkgKiBUaGUgbG9jayBzeW5jaHJvbml6ZXMgd2l0aCBzYl9xdWV1ZV90YWlsKCksIHNvIHRoYXQgd2UgZG9uJ3QKKwkJICogYWRkIHN5bmMgYnVmZmVycyB0byB0aGUgcXVldWUsIHdoZW4gd2UgYXJlIGFscmVhZHkgaW4KKwkJICogcHJvZ3Jlc3Mgb2Ygc3RvcHBpbmcgdGhlIG1hc3RlciBzeW5jIGRhZW1vbi4KKwkJICovCisKKwkJc3Bpbl9sb2NrX2JoKCZpcF92c19zeW5jX2xvY2spOworCQlpcF92c19zeW5jX3N0YXRlICY9IH5JUF9WU19TVEFURV9NQVNURVI7CisJCXNwaW5fdW5sb2NrX2JoKCZpcF92c19zeW5jX2xvY2spOworCQlrdGhyZWFkX3N0b3Aoc3luY19tYXN0ZXJfdGhyZWFkKTsKKwkJc3luY19tYXN0ZXJfdGhyZWFkID0gTlVMTDsKKwl9IGVsc2UgaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX0JBQ0tVUCkgeworCQlpZiAoIXN5bmNfYmFja3VwX3RocmVhZCkKKwkJCXJldHVybiAtRVNSQ0g7CisKKwkJSVBfVlNfSU5GTygic3RvcHBpbmcgYmFja3VwIHN5bmMgdGhyZWFkICVkIC4uLlxuIiwKKwkJCSAgIHRhc2tfcGlkX25yKHN5bmNfYmFja3VwX3RocmVhZCkpOworCisJCWlwX3ZzX3N5bmNfc3RhdGUgJj0gfklQX1ZTX1NUQVRFX0JBQ0tVUDsKKwkJa3RocmVhZF9zdG9wKHN5bmNfYmFja3VwX3RocmVhZCk7CisJCXN5bmNfYmFja3VwX3RocmVhZCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGVjcmVhc2UgdGhlIG1vZHVsZSB1c2UgY291bnQgKi8KKwlpcF92c191c2VfY291bnRfZGVjKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193bGMuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU5NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dsYy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogSVBWUzogICAgICAgIFdlaWdodGVkIExlYXN0LUNvbm5lY3Rpb24gU2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICogICAgICAgICAgICAgIFBldGVyIEtlc2UgPHBldGVyLmtlc2VAaWpzLnNpPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3dsY19zY2hlZHVsZSB0byByZXR1cm4gZGVzdAorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIHRvIHVzZSB0aGUgaW5hY3Rjb25ucyBpbiBzY2hlZHVsaW5nCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgc29tZSBjb21lc3RpY3MgdGhpbmdzIGZvciBkZWJ1Z2dpbmcKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgY2hhbmdlZCBmb3IgdGhlIGQtbGlua2VkIGRlc3RpbmF0aW9uIGxpc3QKKyAqICAgICBXZW5zb25nIFpoYW5nICAgICAgICAgICAgOiAgICAgYWRkZWQgdGhlIGlwX3ZzX3dsY191cGRhdGVfc3ZjCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIGFueSBkZXN0IHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2lwX3ZzX3dsY19kZXN0X292ZXJoZWFkKHN0cnVjdCBpcF92c19kZXN0ICpkZXN0KQoreworCS8qCisJICogV2UgdGhpbmsgdGhlIG92ZXJoZWFkIG9mIHByb2Nlc3NpbmcgYWN0aXZlIGNvbm5lY3Rpb25zIGlzIDI1NgorCSAqIHRpbWVzIGhpZ2hlciB0aGFuIHRoYXQgb2YgaW5hY3RpdmUgY29ubmVjdGlvbnMgaW4gYXZlcmFnZS4gKFRoaXMKKwkgKiAyNTYgdGltZXMgbWlnaHQgbm90IGJlIGFjY3VyYXRlLCB3ZSB3aWxsIGNoYW5nZSBpdCBsYXRlcikgV2UKKwkgKiB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhIHRvIGVzdGltYXRlIHRoZSBvdmVyaGVhZCBub3c6CisJICoJCSAgZGVzdC0+YWN0aXZlY29ubnMqMjU2ICsgZGVzdC0+aW5hY3Rjb25ucworCSAqLworCXJldHVybiAoYXRvbWljX3JlYWQoJmRlc3QtPmFjdGl2ZWNvbm5zKSA8PCA4KSArCisJCWF0b21pY19yZWFkKCZkZXN0LT5pbmFjdGNvbm5zKTsKK30KKworCisvKgorICoJV2VpZ2h0ZWQgTGVhc3QgQ29ubmVjdGlvbiBzY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c193bGNfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgKmxlYXN0OworCXVuc2lnbmVkIGludCBsb2gsIGRvaDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfd2xjX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJLyoKKwkgKiBXZSBjYWxjdWxhdGUgdGhlIGxvYWQgb2YgZWFjaCBkZXN0IHNlcnZlciBhcyBmb2xsb3dzOgorCSAqCQkgIChkZXN0IG92ZXJoZWFkKSAvIGRlc3QtPndlaWdodAorCSAqCisJICogUmVtZW1iZXIgLS0gbm8gZmxvYXRzIGluIGtlcm5lbCBtb2RlISEhCisJICogVGhlIGNvbXBhcmlzb24gb2YgaDEqdzIgPiBoMip3MSBpcyBlcXVpdmFsZW50IHRvIHRoYXQgb2YKKwkgKgkJICBoMS93MSA+IGgyL3cyCisJICogaWYgZXZlcnkgd2VpZ2h0IGlzIGxhcmdlciB0aGFuIHplcm8uCisJICoKKwkgKiBUaGUgc2VydmVyIHdpdGggd2VpZ2h0PTAgaXMgcXVpZXNjZWQgYW5kIHdpbGwgbm90IHJlY2VpdmUgYW55CisJICogbmV3IGNvbm5lY3Rpb25zLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXN0LCAmc3ZjLT5kZXN0aW5hdGlvbnMsIG5fbGlzdCkgeworCQlpZiAoIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgJiYKKwkJICAgIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gMCkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gaXBfdnNfd2xjX2Rlc3Rfb3ZlcmhlYWQobGVhc3QpOworCQkJZ290byBuZXh0c3RhZ2U7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqICAgIEZpbmQgdGhlIGRlc3RpbmF0aW9uIHdpdGggdGhlIGxlYXN0IGxvYWQuCisJICovCisgIG5leHRzdGFnZToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGRlc3QsICZzdmMtPmRlc3RpbmF0aW9ucywgbl9saXN0KSB7CisJCWlmIChkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkKKwkJCWNvbnRpbnVlOworCQlkb2ggPSBpcF92c193bGNfZGVzdF9vdmVyaGVhZChkZXN0KTsKKwkJaWYgKGxvaCAqIGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4KKwkJICAgIGRvaCAqIGF0b21pY19yZWFkKCZsZWFzdC0+d2VpZ2h0KSkgeworCQkJbGVhc3QgPSBkZXN0OworCQkJbG9oID0gZG9oOworCQl9CisJfQorCisJSVBfVlNfREJHX0JVRig2LCAiV0xDOiBzZXJ2ZXIgJXM6JXUgIgorCQkgICAgICAiYWN0aXZlY29ubnMgJWQgcmVmY250ICVkIHdlaWdodCAlZCBvdmVyaGVhZCAlZFxuIiwKKwkJICAgICAgSVBfVlNfREJHX0FERFIoc3ZjLT5hZiwgJmxlYXN0LT5hZGRyKSwgbnRvaHMobGVhc3QtPnBvcnQpLAorCQkgICAgICBhdG9taWNfcmVhZCgmbGVhc3QtPmFjdGl2ZWNvbm5zKSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmxlYXN0LT5yZWZjbnQpLAorCQkgICAgICBhdG9taWNfcmVhZCgmbGVhc3QtPndlaWdodCksIGxvaCk7CisKKwlyZXR1cm4gbGVhc3Q7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfd2xjX3NjaGVkdWxlciA9Cit7CisJLm5hbWUgPQkJCSJ3bGMiLAorCS5yZWZjbnQgPQkJQVRPTUlDX0lOSVQoMCksCisJLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKwkubl9saXN0ID0JCUxJU1RfSEVBRF9JTklUKGlwX3ZzX3dsY19zY2hlZHVsZXIubl9saXN0KSwKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgorCS5zdXBwb3J0c19pcHY2ID0JMSwKKyNlbmRpZgorCS5zY2hlZHVsZSA9CQlpcF92c193bGNfc2NoZWR1bGUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX3dsY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfd2xjX3NjaGVkdWxlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcF92c193bGNfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfaXBfdnNfc2NoZWR1bGVyKCZpcF92c193bGNfc2NoZWR1bGVyKTsKK30KKworbW9kdWxlX2luaXQoaXBfdnNfd2xjX2luaXQpOworbW9kdWxlX2V4aXQoaXBfdnNfd2xjX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dyci5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTkyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBJUFZTOiAgICAgICAgV2VpZ2h0ZWQgUm91bmQtUm9iaW4gU2NoZWR1bGluZyBtb2R1bGUKKyAqCisgKiBBdXRob3JzOiAgICAgV2Vuc29uZyBaaGFuZyA8d2Vuc29uZ0BsaW51eHZpcnR1YWxzZXJ2ZXIub3JnPgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgdGhlIGlwX3ZzX3dycl9zY2hlZHVsZSB0byByZXR1cm4gZGVzdAorICogICAgIFdlbnNvbmcgWmhhbmcgICAgICAgICAgICA6ICAgICBjaGFuZ2VkIHNvbWUgY29tZXN0aWNzIHRoaW5ncyBmb3IgZGVidWdnaW5nCisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGNoYW5nZWQgZm9yIHRoZSBkLWxpbmtlZCBkZXN0aW5hdGlvbiBsaXN0CisgKiAgICAgV2Vuc29uZyBaaGFuZyAgICAgICAgICAgIDogICAgIGFkZGVkIHRoZSBpcF92c193cnJfdXBkYXRlX3N2YworICogICAgIEp1bGlhbiBBbmFzdGFzb3YgICAgICAgICA6ICAgICBmaXhlZCB0aGUgYnVnIG9mIHJldHVybmluZyBkZXN0aW5hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHdlaWdodCAwIHdoZW4gYWxsIHdlaWdodHMgYXJlIHplcm8KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKy8qCisgKiBjdXJyZW50IGRlc3RpbmF0aW9uIHBvaW50ZXIgZm9yIHdlaWdodGVkIHJvdW5kLXJvYmluIHNjaGVkdWxpbmcKKyAqLworc3RydWN0IGlwX3ZzX3dycl9tYXJrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjbDsJLyogY3VycmVudCBsaXN0IGhlYWQgKi8KKwlpbnQgY3c7CQkJLyogY3VycmVudCB3ZWlnaHQgKi8KKwlpbnQgbXc7CQkJLyogbWF4aW11bSB3ZWlnaHQgKi8KKwlpbnQgZGk7CQkJLyogZGVjcmVhc2luZyBpbnRlcnZhbCAqLworfTsKKworCisvKgorICogICAgR2V0IHRoZSBnY2Qgb2Ygc2VydmVyIHdlaWdodHMKKyAqLworc3RhdGljIGludCBnY2QoaW50IGEsIGludCBiKQoreworCWludCBjOworCisJd2hpbGUgKChjID0gYSAlIGIpKSB7CisJCWEgPSBiOworCQliID0gYzsKKwl9CisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfd3JyX2djZF93ZWlnaHQoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlpbnQgd2VpZ2h0OworCWludCBnID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJd2VpZ2h0ID0gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCk7CisJCWlmICh3ZWlnaHQgPiAwKSB7CisJCQlpZiAoZyA+IDApCisJCQkJZyA9IGdjZCh3ZWlnaHQsIGcpOworCQkJZWxzZQorCQkJCWcgPSB3ZWlnaHQ7CisJCX0KKwl9CisJcmV0dXJuIGcgPyBnIDogMTsKK30KKworCisvKgorICogICAgR2V0IHRoZSBtYXhpbXVtIHdlaWdodCBvZiB0aGUgc2VydmljZSBkZXN0aW5hdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgaXBfdnNfd3JyX21heF93ZWlnaHQoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YykKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlpbnQgd2VpZ2h0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXN0LT53ZWlnaHQpID4gd2VpZ2h0KQorCQkJd2VpZ2h0ID0gYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCk7CisJfQorCisJcmV0dXJuIHdlaWdodDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl9pbml0X3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCXN0cnVjdCBpcF92c193cnJfbWFyayAqbWFyazsKKworCS8qCisJICogICAgQWxsb2NhdGUgdGhlIG1hcmsgdmFyaWFibGUgZm9yIFdSUiBzY2hlZHVsaW5nCisJICovCisJbWFyayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcF92c193cnJfbWFyayksIEdGUF9BVE9NSUMpOworCWlmIChtYXJrID09IE5VTEwpIHsKKwkJSVBfVlNfRVJSKCJpcF92c193cnJfaW5pdF9zdmMoKTogbm8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCW1hcmstPmN3ID0gMDsKKwltYXJrLT5tdyA9IGlwX3ZzX3dycl9tYXhfd2VpZ2h0KHN2Yyk7CisJbWFyay0+ZGkgPSBpcF92c193cnJfZ2NkX3dlaWdodChzdmMpOworCXN2Yy0+c2NoZWRfZGF0YSA9IG1hcms7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl9kb25lX3N2YyhzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjKQoreworCS8qCisJICogICAgUmVsZWFzZSB0aGUgbWFyayB2YXJpYWJsZQorCSAqLworCWtmcmVlKHN2Yy0+c2NoZWRfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlwX3ZzX3dycl91cGRhdGVfc3ZjKHN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmMpCit7CisJc3RydWN0IGlwX3ZzX3dycl9tYXJrICptYXJrID0gc3ZjLT5zY2hlZF9kYXRhOworCisJbWFyay0+Y2wgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7CisJbWFyay0+bXcgPSBpcF92c193cnJfbWF4X3dlaWdodChzdmMpOworCW1hcmstPmRpID0gaXBfdnNfd3JyX2djZF93ZWlnaHQoc3ZjKTsKKwlpZiAobWFyay0+Y3cgPiBtYXJrLT5tdykKKwkJbWFyay0+Y3cgPSAwOworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICBXZWlnaHRlZCBSb3VuZC1Sb2JpbiBTY2hlZHVsaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBfdnNfZGVzdCAqCitpcF92c193cnJfc2NoZWR1bGUoc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKKwlzdHJ1Y3QgaXBfdnNfd3JyX21hcmsgKm1hcmsgPSBzdmMtPnNjaGVkX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCUlQX1ZTX0RCRyg2LCAiaXBfdnNfd3JyX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOworCisJLyoKKwkgKiBUaGlzIGxvb3Agd2lsbCBhbHdheXMgdGVybWluYXRlLCBiZWNhdXNlIG1hcmstPmN3IGluICgwLCBtYXhfd2VpZ2h0XQorCSAqIGFuZCBhdCBsZWFzdCBvbmUgc2VydmVyIGhhcyBpdHMgd2VpZ2h0IGVxdWFsIHRvIG1heF93ZWlnaHQuCisJICovCisJd3JpdGVfbG9jaygmc3ZjLT5zY2hlZF9sb2NrKTsKKwlwID0gbWFyay0+Y2w7CisJd2hpbGUgKDEpIHsKKwkJaWYgKG1hcmstPmNsID09ICZzdmMtPmRlc3RpbmF0aW9ucykgeworCQkJLyogaXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGRlc3RpbmF0aW9uIGxpc3QgKi8KKworCQkJaWYgKG1hcmstPmNsID09IG1hcmstPmNsLT5uZXh0KSB7CisJCQkJLyogbm8gZGVzdCBlbnRyeSAqLworCQkJCWRlc3QgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQltYXJrLT5jbCA9IHN2Yy0+ZGVzdGluYXRpb25zLm5leHQ7CisJCQltYXJrLT5jdyAtPSBtYXJrLT5kaTsKKwkJCWlmIChtYXJrLT5jdyA8PSAwKSB7CisJCQkJbWFyay0+Y3cgPSBtYXJrLT5tdzsKKwkJCQkvKgorCQkJCSAqIFN0aWxsIHplcm8sIHdoaWNoIG1lYW5zIG5vIGF2YWlsYWJsZSBzZXJ2ZXJzLgorCQkJCSAqLworCQkJCWlmIChtYXJrLT5jdyA9PSAwKSB7CisJCQkJCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOworCQkJCQlJUF9WU19FUlJfUkwoImlwX3ZzX3dycl9zY2hlZHVsZSgpOiAiCisJCQkJCQkgICAibm8gYXZhaWxhYmxlIHNlcnZlcnNcbiIpOworCQkJCQlkZXN0ID0gTlVMTDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCW1hcmstPmNsID0gbWFyay0+Y2wtPm5leHQ7CisKKwkJaWYgKG1hcmstPmNsICE9ICZzdmMtPmRlc3RpbmF0aW9ucykgeworCQkJLyogbm90IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJCQlkZXN0ID0gbGlzdF9lbnRyeShtYXJrLT5jbCwgc3RydWN0IGlwX3ZzX2Rlc3QsIG5fbGlzdCk7CisJCQlpZiAoIShkZXN0LT5mbGFncyAmIElQX1ZTX0RFU1RfRl9PVkVSTE9BRCkgJiYKKwkJCSAgICBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSA+PSBtYXJrLT5jdykgeworCQkJCS8qIGdvdCBpdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKG1hcmstPmNsID09IHAgJiYgbWFyay0+Y3cgPT0gbWFyay0+ZGkpIHsKKwkJCS8qIGJhY2sgdG8gdGhlIHN0YXJ0LCBhbmQgbm8gZGVzdCBpcyBmb3VuZC4KKwkJCSAgIEl0IGlzIG9ubHkgcG9zc2libGUgd2hlbiBhbGwgZGVzdHMgYXJlIE9WRVJMT0FERUQgKi8KKwkJCWRlc3QgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlJUF9WU19EQkdfQlVGKDYsICJXUlI6IHNlcnZlciAlczoldSAiCisJCSAgICAgICJhY3RpdmVjb25ucyAlZCByZWZjbnQgJWQgd2VpZ2h0ICVkXG4iLAorCQkgICAgICBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmZGVzdC0+YWRkciksIG50b2hzKGRlc3QtPnBvcnQpLAorCQkgICAgICBhdG9taWNfcmVhZCgmZGVzdC0+YWN0aXZlY29ubnMpLAorCQkgICAgICBhdG9taWNfcmVhZCgmZGVzdC0+cmVmY250KSwKKwkJICAgICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkpOworCisgIG91dDoKKwl3cml0ZV91bmxvY2soJnN2Yy0+c2NoZWRfbG9jayk7CisJcmV0dXJuIGRlc3Q7Cit9CisKKworc3RhdGljIHN0cnVjdCBpcF92c19zY2hlZHVsZXIgaXBfdnNfd3JyX3NjaGVkdWxlciA9IHsKKwkubmFtZSA9CQkJIndyciIsCisJLnJlZmNudCA9CQlBVE9NSUNfSU5JVCgwKSwKKwkubW9kdWxlID0JCVRISVNfTU9EVUxFLAorCS5uX2xpc3QgPQkJTElTVF9IRUFEX0lOSVQoaXBfdnNfd3JyX3NjaGVkdWxlci5uX2xpc3QpLAorI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CisJLnN1cHBvcnRzX2lwdjYgPQkxLAorI2VuZGlmCisJLmluaXRfc2VydmljZSA9CQlpcF92c193cnJfaW5pdF9zdmMsCisJLmRvbmVfc2VydmljZSA9CQlpcF92c193cnJfZG9uZV9zdmMsCisJLnVwZGF0ZV9zZXJ2aWNlID0JaXBfdnNfd3JyX3VwZGF0ZV9zdmMsCisJLnNjaGVkdWxlID0JCWlwX3ZzX3dycl9zY2hlZHVsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwX3ZzX3dycl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfd3JyX3NjaGVkdWxlcikgOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBfdnNfd3JyX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2lwX3ZzX3NjaGVkdWxlcigmaXBfdnNfd3JyX3NjaGVkdWxlcik7Cit9CisKK21vZHVsZV9pbml0KGlwX3ZzX3dycl9pbml0KTsKK21vZHVsZV9leGl0KGlwX3ZzX3dycl9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGRjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCkBAIC0wLDAgKzEsMTAwNCBAQAorLyoKKyAqIGlwX3ZzX3htaXQuYzogdmFyaW91cyBwYWNrZXQgdHJhbnNtaXR0ZXJzIGZvciBJUFZTCisgKgorICogQXV0aG9yczogICAgIFdlbnNvbmcgWmhhbmcgPHdlbnNvbmdAbGludXh2aXJ0dWFsc2VydmVyLm9yZz4KKyAqICAgICAgICAgICAgICBKdWxpYW4gQW5hc3Rhc292IDxqYUBzc2kuYmc+CisgKgorICogICAgICAgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICAgICAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAgICAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQ2hhbmdlczoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPiAgICAgICAgICAgICAgICAgIC8qIGZvciB0Y3BoZHIgKi8KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+ICAgICAgICAgICAgICAgICAgICAvKiBmb3IgY3N1bV90Y3B1ZHBfbWFnaWMgKi8KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4gICAgICAgICAgICAgICAgICAgLyogZm9yIGljbXBfc2VuZCAqLworI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPiAgICAgICAgICAgICAgICAgIC8qIGZvciBpcF9yb3V0ZV9vdXRwdXQgKi8KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorCisjaW5jbHVkZSA8bmV0L2lwX3ZzLmg+CisKKworLyoKKyAqICAgICAgRGVzdGluYXRpb24gY2FjaGUgdG8gc3BlZWQgdXAgb3V0Z29pbmcgcm91dGUgbG9va3VwCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19pcF92c19kc3Rfc2V0KHN0cnVjdCBpcF92c19kZXN0ICpkZXN0LCB1MzIgcnRvcywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCXN0cnVjdCBkc3RfZW50cnkgKm9sZF9kc3Q7CisKKwlvbGRfZHN0ID0gZGVzdC0+ZHN0X2NhY2hlOworCWRlc3QtPmRzdF9jYWNoZSA9IGRzdDsKKwlkZXN0LT5kc3RfcnRvcyA9IHJ0b3M7CisJZHN0X3JlbGVhc2Uob2xkX2RzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRzdF9lbnRyeSAqCitfX2lwX3ZzX2RzdF9jaGVjayhzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCwgdTMyIHJ0b3MsIHUzMiBjb29raWUpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gZGVzdC0+ZHN0X2NhY2hlOworCisJaWYgKCFkc3QpCisJCXJldHVybiBOVUxMOworCWlmICgoZHN0LT5vYnNvbGV0ZQorCSAgICAgfHwgKGRlc3QtPmFmID09IEFGX0lORVQgJiYgcnRvcyAhPSBkZXN0LT5kc3RfcnRvcykpICYmCisJICAgIGRzdC0+b3BzLT5jaGVjayhkc3QsIGNvb2tpZSkgPT0gTlVMTCkgeworCQlkZXN0LT5kc3RfY2FjaGUgPSBOVUxMOworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZHN0X2hvbGQoZHN0KTsKKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgc3RydWN0IHJ0YWJsZSAqCitfX2lwX3ZzX2dldF9vdXRfcnQoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCB1MzIgcnRvcykKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0ID0gY3AtPmRlc3Q7CisKKwlpZiAoZGVzdCkgeworCQlzcGluX2xvY2soJmRlc3QtPmRzdF9sb2NrKTsKKwkJaWYgKCEocnQgPSAoc3RydWN0IHJ0YWJsZSAqKQorCQkgICAgICBfX2lwX3ZzX2RzdF9jaGVjayhkZXN0LCBydG9zLCAwKSkpIHsKKwkJCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJCQkub2lmID0gMCwKKwkJCQkubmxfdSA9IHsKKwkJCQkJLmlwNF91ID0geworCQkJCQkJLmRhZGRyID0gZGVzdC0+YWRkci5pcCwKKwkJCQkJCS5zYWRkciA9IDAsCisJCQkJCQkudG9zID0gcnRvcywgfSB9LAorCQkJfTsKKworCQkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJmluaXRfbmV0LCAmcnQsICZmbCkpIHsKKwkJCQlzcGluX3VubG9jaygmZGVzdC0+ZHN0X2xvY2spOworCQkJCUlQX1ZTX0RCR19STCgiaXBfcm91dGVfb3V0cHV0IGVycm9yLCAiCisJCQkJCSAgICAgImRlc3Q6ICV1LiV1LiV1LiV1XG4iLAorCQkJCQkgICAgIE5JUFFVQUQoZGVzdC0+YWRkci5pcCkpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJX19pcF92c19kc3Rfc2V0KGRlc3QsIHJ0b3MsIGRzdF9jbG9uZSgmcnQtPnUuZHN0KSk7CisJCQlJUF9WU19EQkcoMTAsICJuZXcgZHN0ICV1LiV1LiV1LiV1LCByZWZjbnQ9JWQsIHJ0b3M9JVhcbiIsCisJCQkJICBOSVBRVUFEKGRlc3QtPmFkZHIuaXApLAorCQkJCSAgYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCksIHJ0b3MpOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZXN0LT5kc3RfbG9jayk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZsb3dpIGZsID0geworCQkJLm9pZiA9IDAsCisJCQkubmxfdSA9IHsKKwkJCQkuaXA0X3UgPSB7CisJCQkJCS5kYWRkciA9IGNwLT5kYWRkci5pcCwKKwkJCQkJLnNhZGRyID0gMCwKKwkJCQkJLnRvcyA9IHJ0b3MsIH0gfSwKKwkJfTsKKworCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmaW5pdF9uZXQsICZydCwgJmZsKSkgeworCQkJSVBfVlNfREJHX1JMKCJpcF9yb3V0ZV9vdXRwdXQgZXJyb3IsIGRlc3Q6ICIKKwkJCQkgICAgICIldS4ldS4ldS4ldVxuIiwgTklQUVVBRChjcC0+ZGFkZHIuaXApKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHJ0OworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK3N0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKgorX19pcF92c19nZXRfb3V0X3J0X3Y2KHN0cnVjdCBpcF92c19jb25uICpjcCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QgPSBjcC0+ZGVzdDsKKworCWlmIChkZXN0KSB7CisJCXNwaW5fbG9jaygmZGVzdC0+ZHN0X2xvY2spOworCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilfX2lwX3ZzX2RzdF9jaGVjayhkZXN0LCAwLCAwKTsKKwkJaWYgKCFydCkgeworCQkJc3RydWN0IGZsb3dpIGZsID0geworCQkJCS5vaWYgPSAwLAorCQkJCS5ubF91ID0geworCQkJCQkuaXA2X3UgPSB7CisJCQkJCQkuZGFkZHIgPSBkZXN0LT5hZGRyLmluNiwKKwkJCQkJCS5zYWRkciA9IHsKKwkJCQkJCQkuczZfYWRkcjMyID0KKwkJCQkJCQkJeyAwLCAwLCAwLCAwIH0sCisJCQkJCQl9LAorCQkJCQl9LAorCQkJCX0sCisJCQl9OworCisJCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwKKwkJCQkJCQkJIE5VTEwsICZmbCk7CisJCQlpZiAoIXJ0KSB7CisJCQkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKKwkJCQlJUF9WU19EQkdfUkwoImlwNl9yb3V0ZV9vdXRwdXQgZXJyb3IsICIKKwkJCQkJICAgICAiZGVzdDogIiBOSVA2X0ZNVCAiXG4iLAorCQkJCQkgICAgIE5JUDYoZGVzdC0+YWRkci5pbjYpKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCV9faXBfdnNfZHN0X3NldChkZXN0LCAwLCBkc3RfY2xvbmUoJnJ0LT51LmRzdCkpOworCQkJSVBfVlNfREJHKDEwLCAibmV3IGRzdCAiIE5JUDZfRk1UICIsIHJlZmNudD0lZFxuIiwKKwkJCQkgIE5JUDYoZGVzdC0+YWRkci5pbjYpLAorCQkJCSAgYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCkpOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZXN0LT5kc3RfbG9jayk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGZsb3dpIGZsID0geworCQkJLm9pZiA9IDAsCisJCQkubmxfdSA9IHsKKwkJCQkuaXA2X3UgPSB7CisJCQkJCS5kYWRkciA9IGNwLT5kYWRkci5pbjYsCisJCQkJCS5zYWRkciA9IHsKKwkJCQkJCS5zNl9hZGRyMzIgPSB7IDAsIDAsIDAsIDAgfSwKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfTsKKworCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgTlVMTCwgJmZsKTsKKwkJaWYgKCFydCkgeworCQkJSVBfVlNfREJHX1JMKCJpcDZfcm91dGVfb3V0cHV0IGVycm9yLCBkZXN0OiAiCisJCQkJICAgICBOSVA2X0ZNVCAiXG4iLCBOSVA2KGNwLT5kYWRkci5pbjYpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHJ0OworfQorI2VuZGlmCisKKworLyoKKyAqCVJlbGVhc2UgZGVzdC0+ZHN0X2NhY2hlIGJlZm9yZSBhIGRlc3QgaXMgcmVtb3ZlZAorICovCit2b2lkCitpcF92c19kc3RfcmVzZXQoc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3QpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqb2xkX2RzdDsKKworCW9sZF9kc3QgPSBkZXN0LT5kc3RfY2FjaGU7CisJZGVzdC0+ZHN0X2NhY2hlID0gTlVMTDsKKwlkc3RfcmVsZWFzZShvbGRfZHN0KTsKK30KKworI2RlZmluZSBJUF9WU19YTUlUKHBmLCBza2IsIHJ0KQkJCQlcCitkbyB7CQkJCQkJCVwKKwkoc2tiKS0+aXB2c19wcm9wZXJ0eSA9IDE7CQkJXAorCXNrYl9mb3J3YXJkX2NzdW0oc2tiKTsJCQkJXAorCU5GX0hPT0socGYsIE5GX0lORVRfTE9DQUxfT1VULCAoc2tiKSwgTlVMTCwJXAorCQkocnQpLT51LmRzdC5kZXYsIGRzdF9vdXRwdXQpOwkJXAorfSB3aGlsZSAoMCkKKworCisvKgorICogICAgICBOVUxMIHRyYW5zbWl0dGVyIChkbyBub3RoaW5nIGV4Y2VwdCByZXR1cm4gTkZfQUNDRVBUKQorICovCitpbnQKK2lwX3ZzX251bGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCXN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJLyogd2UgZG8gbm90IHRvdWNoIHNrYiBhbmQgZG8gbm90IG5lZWQgcHNrYiBwdHIgKi8KKwlyZXR1cm4gTkZfQUNDRVBUOworfQorCisKKy8qCisgKiAgICAgIEJ5cGFzcyB0cmFuc21pdHRlcgorICogICAgICBMZXQgcGFja2V0cyBieXBhc3MgdGhlIGRlc3RpbmF0aW9uIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGlzIG5vdAorICogICAgICBhdmFpbGFibGUsIGl0IG1heSBiZSBvbmx5IHVzZWQgaW4gdHJhbnNwYXJlbnQgY2FjaGUgY2x1c3Rlci4KKyAqLworaW50CitpcF92c19ieXBhc3NfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCSAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcGhkciAgKmlwaCA9IGlwX2hkcihza2IpOworCXU4ICAgICB0b3MgPSBpcGgtPnRvczsKKwlpbnQgICAgbXR1OworCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJLm9pZiA9IDAsCisJCS5ubF91ID0geworCQkJLmlwNF91ID0geworCQkJCS5kYWRkciA9IGlwaC0+ZGFkZHIsCisJCQkJLnNhZGRyID0gMCwKKwkJCQkudG9zID0gUlRfVE9TKHRvcyksIH0gfSwKKwl9OworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmaW5pdF9uZXQsICZydCwgJmZsKSkgeworCQlJUF9WU19EQkdfUkwoImlwX3ZzX2J5cGFzc194bWl0KCk6IGlwX3JvdXRlX291dHB1dCBlcnJvciwgIgorCQkJICAgICAiZGVzdDogJXUuJXUuJXUuJXVcbiIsIE5JUFFVQUQoaXBoLT5kYWRkcikpOworCQlnb3RvIHR4X2Vycm9yX2ljbXA7CisJfQorCisJLyogTVRVIGNoZWNraW5nICovCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfYnlwYXNzX3htaXQoKTogZnJhZyBuZWVkZWRcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCS8qCisJICogQ2FsbCBpcF9zZW5kX2NoZWNrIGJlY2F1c2Ugd2UgYXJlIG5vdCBzdXJlIGl0IGlzIGNhbGxlZAorCSAqIGFmdGVyIGlwX2RlZnJhZy4gSXMgY29weS1vbi13cml0ZSBuZWVkZWQ/CisJICovCisJaWYgKHVubGlrZWx5KChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcmV0dXJuIE5GX1NUT0xFTjsKKwl9CisJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CisKKwkvKiBkcm9wIG9sZCByb3V0ZSAqLworCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9ICZydC0+dS5kc3Q7CisKKwkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLworCXNrYi0+bG9jYWxfZGYgPSAxOworCisJSVBfVlNfWE1JVChQRl9JTkVULCBza2IsIHJ0KTsKKworCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiBORl9TVE9MRU47CisKKyB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyB0eF9lcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK2ludAoraXBfdnNfYnlwYXNzX3htaXRfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQkgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcHY2aGRyICAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlpbnQgICAgbXR1OworCXN0cnVjdCBmbG93aSBmbCA9IHsKKwkJLm9pZiA9IDAsCisJCS5ubF91ID0geworCQkJLmlwNl91ID0geworCQkJCS5kYWRkciA9IGlwaC0+ZGFkZHIsCisJCQkJLnNhZGRyID0geyAuczZfYWRkcjMyID0gezAsIDAsIDAsIDB9IH0sIH0gfSwKKwl9OworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgTlVMTCwgJmZsKTsKKwlpZiAoIXJ0KSB7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfYnlwYXNzX3htaXRfdjYoKTogaXA2X3JvdXRlX291dHB1dCBlcnJvciwgIgorCQkJICAgICAiZGVzdDogIiBOSVA2X0ZNVCAiXG4iLCBOSVA2KGlwaC0+ZGFkZHIpKTsKKwkJZ290byB0eF9lcnJvcl9pY21wOworCX0KKworCS8qIE1UVSBjaGVja2luZyAqLworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHNrYi0+ZGV2KTsKKwkJSVBfVlNfREJHX1JMKCJpcF92c19ieXBhc3NfeG1pdF92NigpOiBmcmFnIG5lZWRlZFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyoKKwkgKiBDYWxsIGlwX3NlbmRfY2hlY2sgYmVjYXVzZSB3ZSBhcmUgbm90IHN1cmUgaXQgaXMgY2FsbGVkCisJICogYWZ0ZXIgaXBfZGVmcmFnLiBJcyBjb3B5LW9uLXdyaXRlIG5lZWRlZD8KKwkgKi8KKwlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7CisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKworCS8qIGRyb3Agb2xkIHJvdXRlICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlJUF9WU19YTUlUKFBGX0lORVQ2LCBza2IsIHJ0KTsKKworCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiBORl9TVE9MRU47CisKKyB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyB0eF9lcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorI2VuZGlmCisKKy8qCisgKiAgICAgIE5BVCB0cmFuc21pdHRlciAob25seSBmb3Igb3V0c2lkZS10by1pbnNpZGUgbmF0IGZvcndhcmRpbmcpCisgKiAgICAgIE5vdCB1c2VkIGZvciByZWxhdGVkIElDTVAKKyAqLworaW50CitpcF92c19uYXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJICAgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCWludCBtdHU7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKworCUVudGVyRnVuY3Rpb24oMTApOworCisJLyogY2hlY2sgaWYgaXQgaXMgYSBjb25uZWN0aW9uIG9mIG5vLWNsaWVudC1wb3J0ICovCisJaWYgKHVubGlrZWx5KGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9OT19DUE9SVCkpIHsKKwkJX19iZTE2IF9wdCwgKnA7CisJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCo0LCBzaXplb2YoX3B0KSwgJl9wdCk7CisJCWlmIChwID09IE5VTEwpCisJCQlnb3RvIHR4X2Vycm9yOworCQlpcF92c19jb25uX2ZpbGxfY3BvcnQoY3AsICpwKTsKKwkJSVBfVlNfREJHKDEwLCAiZmlsbGVkIGNwb3J0PSVkXG4iLCBudG9ocygqcCkpOworCX0KKworCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1MoaXBoLT50b3MpKSkpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCS8qIE1UVSBjaGVja2luZyAqLworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKSB7CisJCWlwX3J0X3B1dChydCk7CisJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOworCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsICJpcF92c19uYXRfeG1pdCgpOiBmcmFnIG5lZWRlZCBmb3IiKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKiBjb3B5LW9uLXdyaXRlIHRoZSBwYWNrZXQgYmVmb3JlIG1hbmdsaW5nIGl0ICovCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJCWdvdG8gdHhfZXJyb3JfcHV0OworCisJLyogZHJvcCBvbGQgcm91dGUgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyogbWFuZ2xlIHRoZSBwYWNrZXQgKi8KKwlpZiAocHAtPmRuYXRfaGFuZGxlciAmJiAhcHAtPmRuYXRfaGFuZGxlcihza2IsIHBwLCBjcCkpCisJCWdvdG8gdHhfZXJyb3I7CisJaXBfaGRyKHNrYiktPmRhZGRyID0gY3AtPmRhZGRyLmlwOworCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOworCisJSVBfVlNfREJHX1BLVCgxMCwgcHAsIHNrYiwgMCwgIkFmdGVyIEROQVQiKTsKKworCS8qIEZJWE1FOiB3aGVuIGFwcGxpY2F0aW9uIGhlbHBlciBlbmxhcmdlcyB0aGUgcGFja2V0IGFuZCB0aGUgbGVuZ3RoCisJICAgaXMgbGFyZ2VyIHRoYW4gdGhlIE1UVSBvZiBvdXRnb2luZyBkZXZpY2UsIHRoZXJlIHdpbGwgYmUgc3RpbGwKKwkgICBNVFUgcHJvYmxlbS4gKi8KKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlJUF9WU19YTUlUKFBGX0lORVQsIHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKworICB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyAgdHhfZXJyb3I6CisJTGVhdmVGdW5jdGlvbigxMCk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5GX1NUT0xFTjsKKyAgdHhfZXJyb3JfcHV0OgorCWlwX3J0X3B1dChydCk7CisJZ290byB0eF9lcnJvcjsKK30KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CitpbnQKK2lwX3ZzX25hdF94bWl0X3Y2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCWludCBtdHU7CisKKwlFbnRlckZ1bmN0aW9uKDEwKTsKKworCS8qIGNoZWNrIGlmIGl0IGlzIGEgY29ubmVjdGlvbiBvZiBuby1jbGllbnQtcG9ydCAqLworCWlmICh1bmxpa2VseShjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfTk9fQ1BPUlQpKSB7CisJCV9fYmUxNiBfcHQsICpwOworCQlwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwKKwkJCQkgICAgICAgc2l6ZW9mKF9wdCksICZfcHQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJZ290byB0eF9lcnJvcjsKKwkJaXBfdnNfY29ubl9maWxsX2Nwb3J0KGNwLCAqcCk7CisJCUlQX1ZTX0RCRygxMCwgImZpbGxlZCBjcG9ydD0lZFxuIiwgbnRvaHMoKnApKTsKKwl9CisKKwlydCA9IF9faXBfdnNfZ2V0X291dF9ydF92NihjcCk7CisJaWYgKCFydCkKKwkJZ290byB0eF9lcnJvcl9pY21wOworCisJLyogTVRVIGNoZWNraW5nICovCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwlpZiAoc2tiLT5sZW4gPiBtdHUpIHsKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOworCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsCisJCQkJICJpcF92c19uYXRfeG1pdF92NigpOiBmcmFnIG5lZWRlZCBmb3IiKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKiBjb3B5LW9uLXdyaXRlIHRoZSBwYWNrZXQgYmVmb3JlIG1hbmdsaW5nIGl0ICovCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQorCQlnb3RvIHR4X2Vycm9yX3B1dDsKKworCWlmIChza2JfY293KHNrYiwgcnQtPnUuZHN0LmRldi0+aGFyZF9oZWFkZXJfbGVuKSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwkvKiBkcm9wIG9sZCByb3V0ZSAqLworCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKKwlza2ItPmRzdCA9ICZydC0+dS5kc3Q7CisKKwkvKiBtYW5nbGUgdGhlIHBhY2tldCAqLworCWlmIChwcC0+ZG5hdF9oYW5kbGVyICYmICFwcC0+ZG5hdF9oYW5kbGVyKHNrYiwgcHAsIGNwKSkKKwkJZ290byB0eF9lcnJvcjsKKwlpcHY2X2hkcihza2IpLT5kYWRkciA9IGNwLT5kYWRkci5pbjY7CisKKwlJUF9WU19EQkdfUEtUKDEwLCBwcCwgc2tiLCAwLCAiQWZ0ZXIgRE5BVCIpOworCisJLyogRklYTUU6IHdoZW4gYXBwbGljYXRpb24gaGVscGVyIGVubGFyZ2VzIHRoZSBwYWNrZXQgYW5kIHRoZSBsZW5ndGgKKwkgICBpcyBsYXJnZXIgdGhhbiB0aGUgTVRVIG9mIG91dGdvaW5nIGRldmljZSwgdGhlcmUgd2lsbCBiZSBzdGlsbAorCSAgIE1UVSBwcm9ibGVtLiAqLworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoUEZfSU5FVDYsIHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKwordHhfZXJyb3JfaWNtcDoKKwlkc3RfbGlua19mYWlsdXJlKHNrYik7Cit0eF9lcnJvcjoKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkZfU1RPTEVOOwordHhfZXJyb3JfcHV0OgorCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCWdvdG8gdHhfZXJyb3I7Cit9CisjZW5kaWYKKworCisvKgorICogICBJUCBUdW5uZWxpbmcgdHJhbnNtaXR0ZXIKKyAqCisgKiAgIFRoaXMgZnVuY3Rpb24gZW5jYXBzdWxhdGVzIHRoZSBwYWNrZXQgaW4gYSBuZXcgSVAgcGFja2V0LCBpdHMKKyAqICAgZGVzdGluYXRpb24gd2lsbCBiZSBzZXQgdG8gY3AtPmRhZGRyLiBNb3N0IGNvZGUgb2YgdGhpcyBmdW5jdGlvbgorICogICBpcyB0YWtlbiBmcm9tIGlwaXAuYy4KKyAqCisgKiAgIEl0IGlzIHVzZWQgaW4gVlMvVFVOIGNsdXN0ZXIuIFRoZSBsb2FkIGJhbGFuY2VyIHNlbGVjdHMgYSByZWFsCisgKiAgIHNlcnZlciBmcm9tIGEgY2x1c3RlciBiYXNlZCBvbiBhIHNjaGVkdWxpbmcgYWxnb3JpdGhtLAorICogICBlbmNhcHN1bGF0ZXMgdGhlIHJlcXVlc3QgcGFja2V0IGFuZCBmb3J3YXJkcyBpdCB0byB0aGUgc2VsZWN0ZWQKKyAqICAgc2VydmVyLiBGb3IgZXhhbXBsZSwgYWxsIHJlYWwgc2VydmVycyBhcmUgY29uZmlndXJlZCB3aXRoCisgKiAgICJpZmNvbmZpZyB0dW5sMCA8VmlydHVhbCBJUCBBZGRyZXNzPiB1cCIuIFdoZW4gdGhlIHNlcnZlciByZWNlaXZlcworICogICB0aGUgZW5jYXBzdWxhdGVkIHBhY2tldCwgaXQgd2lsbCBkZWNhcHN1bGF0ZSB0aGUgcGFja2V0LCBwcm9jZXNzZQorICogICB0aGUgcmVxdWVzdCBhbmQgcmV0dXJuIHRoZSByZXNwb25zZSBwYWNrZXRzIGRpcmVjdGx5IHRvIHRoZSBjbGllbnQKKyAqICAgd2l0aG91dCBwYXNzaW5nIHRoZSBsb2FkIGJhbGFuY2VyLiBUaGlzIGNhbiBncmVhdGx5IGluY3JlYXNlIHRoZQorICogICBzY2FsYWJpbGl0eSBvZiB2aXJ0dWFsIHNlcnZlci4KKyAqCisgKiAgIFVzZWQgZm9yIEFOWSBwcm90b2NvbAorICovCitpbnQKK2lwX3ZzX3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQoreworCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLworCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBpcF9oZHIoc2tiKTsKKwl1OCAgICAgdG9zID0gb2xkX2lwaC0+dG9zOworCV9fYmUxNiBkZiA9IG9sZF9pcGgtPmZyYWdfb2ZmOworCXNrX2J1ZmZfZGF0YV90IG9sZF90cmFuc3BvcnRfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCXN0cnVjdCBpcGhkciAgKmlwaDsJCQkvKiBPdXIgbmV3IElQIGhlYWRlciAqLworCXVuc2lnbmVkIGludCBtYXhfaGVhZHJvb207CQkvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLworCWludCAgICBtdHU7CisKKwlFbnRlckZ1bmN0aW9uKDEwKTsKKworCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IHByb3RvY29sIGVycm9yLCAiCisJCQkgICAgICJFVEhfUF9JUDogJWQsIHNrYiBwcm90b2NvbDogJWRcbiIsCisJCQkgICAgIGh0b25zKEVUSF9QX0lQKSwgc2tiLT5wcm90b2NvbCk7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJaWYgKCEocnQgPSBfX2lwX3ZzX2dldF9vdXRfcnQoY3AsIFJUX1RPUyh0b3MpKSkpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWlmIChtdHUgPCA2OCkgeworCQlpcF9ydF9wdXQocnQpOworCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IG10dSBsZXNzIHRoYW4gNjhcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwlpZiAoc2tiLT5kc3QpCisJCXNrYi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYi0+ZHN0LCBtdHUpOworCisJZGYgfD0gKG9sZF9pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKTsKKworCWlmICgob2xkX2lwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpCisJICAgICYmIG10dSA8IG50b2hzKG9sZF9pcGgtPnRvdF9sZW4pKSB7CisJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOworCQlpcF9ydF9wdXQocnQpOworCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IGZyYWcgbmVlZGVkXG4iKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyBzZWUgaWYgd2UgY2FuIHN0dWZmIGl0IGluIHRoZSBidWZmZXIgYXMtaXMuCisJICovCisJbWF4X2hlYWRyb29tID0gTExfUkVTRVJWRURfU1BBQ0UodGRldikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IG1heF9oZWFkcm9vbQorCSAgICB8fCBza2JfY2xvbmVkKHNrYikgfHwgc2tiX3NoYXJlZChza2IpKSB7CisJCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0KKwkJCXNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWF4X2hlYWRyb29tKTsKKwkJaWYgKCFuZXdfc2tiKSB7CisJCQlpcF9ydF9wdXQocnQpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlJUF9WU19FUlJfUkwoImlwX3ZzX3R1bm5lbF94bWl0KCk6IG5vIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gTkZfU1RPTEVOOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCQlvbGRfaXBoID0gaXBfaGRyKHNrYik7CisJfQorCisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gb2xkX3RyYW5zcG9ydF9oZWFkZXI7CisKKwkvKiBmaXggb2xkIElQIGhlYWRlciBjaGVja3N1bSAqLworCWlwX3NlbmRfY2hlY2sob2xkX2lwaCk7CisKKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOworCisJLyogZHJvcCBvbGQgcm91dGUgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyoKKwkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgorCSAqLworCWlwaAkJCT0JaXBfaGRyKHNrYik7CisJaXBoLT52ZXJzaW9uCQk9CTQ7CisJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7CisJaXBoLT5mcmFnX29mZgkJPQlkZjsKKwlpcGgtPnByb3RvY29sCQk9CUlQUFJPVE9fSVBJUDsKKwlpcGgtPnRvcwkJPQl0b3M7CisJaXBoLT5kYWRkcgkJPQlydC0+cnRfZHN0OworCWlwaC0+c2FkZHIJCT0JcnQtPnJ0X3NyYzsKKwlpcGgtPnR0bAkJPQlvbGRfaXBoLT50dGw7CisJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT51LmRzdCwgTlVMTCk7CisKKwkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLworCXNrYi0+bG9jYWxfZGYgPSAxOworCisJaXBfbG9jYWxfb3V0KHNrYik7CisKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKworCXJldHVybiBORl9TVE9MRU47CisKKyAgdHhfZXJyb3JfaWNtcDoKKwlkc3RfbGlua19mYWlsdXJlKHNrYik7CisgIHR4X2Vycm9yOgorCWtmcmVlX3NrYihza2IpOworCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiBORl9TVE9MRU47Cit9CisKKyNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgoraW50CitpcF92c190dW5uZWxfeG1pdF92NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCSAgICAgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KKwlzdHJ1Y3QgaXB2NmhkciAgKm9sZF9pcGggPSBpcHY2X2hkcihza2IpOworCXNrX2J1ZmZfZGF0YV90IG9sZF90cmFuc3BvcnRfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCXN0cnVjdCBpcHY2aGRyICAqaXBoOwkJLyogT3VyIG5ldyBJUCBoZWFkZXIgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X2hlYWRyb29tOwkvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLworCWludCAgICBtdHU7CisKKwlFbnRlckZ1bmN0aW9uKDEwKTsKKworCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfdHVubmVsX3htaXRfdjYoKTogcHJvdG9jb2wgZXJyb3IsICIKKwkJCSAgICAgIkVUSF9QX0lQVjY6ICVkLCBza2IgcHJvdG9jb2w6ICVkXG4iLAorCQkJICAgICBodG9ucyhFVEhfUF9JUFY2KSwgc2tiLT5wcm90b2NvbCk7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJcnQgPSBfX2lwX3ZzX2dldF9vdXRfcnRfdjYoY3ApOworCWlmICghcnQpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCXRkZXYgPSBydC0+dS5kc3QuZGV2OworCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJLyogVE9ETyBJUHY2OiBkbyB3ZSBuZWVkIHRoaXMgY2hlY2sgaW4gSVB2Nj8gKi8KKwlpZiAobXR1IDwgMTI4MCkgeworCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJSVBfVlNfREJHX1JMKCJpcF92c190dW5uZWxfeG1pdF92NigpOiBtdHUgbGVzcyB0aGFuIDEyODBcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwlpZiAoc2tiLT5kc3QpCisJCXNrYi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYi0+ZHN0LCBtdHUpOworCisJaWYgKG10dSA8IG50b2hzKG9sZF9pcGgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpIHsKKwkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1LCBza2ItPmRldik7CisJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQlJUF9WU19EQkdfUkwoImlwX3ZzX3R1bm5lbF94bWl0X3Y2KCk6IGZyYWcgbmVlZGVkXG4iKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyBzZWUgaWYgd2UgY2FuIHN0dWZmIGl0IGluIHRoZSBidWZmZXIgYXMtaXMuCisJICovCisJbWF4X2hlYWRyb29tID0gTExfUkVTRVJWRURfU1BBQ0UodGRldikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tCisJICAgIHx8IHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hhcmVkKHNrYikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPQorCQkJc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBtYXhfaGVhZHJvb20pOworCQlpZiAoIW5ld19za2IpIHsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlJUF9WU19FUlJfUkwoImlwX3ZzX3R1bm5lbF94bWl0X3Y2KCk6IG5vIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gTkZfU1RPTEVOOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdfc2tiOworCQlvbGRfaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwl9CisKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBvbGRfdHJhbnNwb3J0X2hlYWRlcjsKKworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKworCS8qIGRyb3Agb2xkIHJvdXRlICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qCisJICoJUHVzaCBkb3duIGFuZCBpbnN0YWxsIHRoZSBJUElQIGhlYWRlci4KKwkgKi8KKwlpcGgJCQk9CWlwdjZfaGRyKHNrYik7CisJaXBoLT52ZXJzaW9uCQk9CTY7CisJaXBoLT5uZXh0aGRyCQk9CUlQUFJPVE9fSVBWNjsKKwlpcGgtPnBheWxvYWRfbGVuCT0Jb2xkX2lwaC0+cGF5bG9hZF9sZW4gKyBzaXplb2Yob2xkX2lwaCk7CisJaXBoLT5wcmlvcml0eQkJPQlvbGRfaXBoLT5wcmlvcml0eTsKKwltZW1zZXQoJmlwaC0+Zmxvd19sYmwsIDAsIHNpemVvZihpcGgtPmZsb3dfbGJsKSk7CisJaXBoLT5kYWRkcgkJPQlydC0+cnQ2aV9kc3QuYWRkcjsKKwlpcGgtPnNhZGRyCQk9CWNwLT52YWRkci5pbjY7IC8qIHJ0LT5ydDZpX3NyYy5hZGRyOyAqLworCWlwaC0+aG9wX2xpbWl0CQk9CW9sZF9pcGgtPmhvcF9saW1pdDsKKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlpcDZfbG9jYWxfb3V0KHNrYik7CisKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKworCXJldHVybiBORl9TVE9MRU47CisKK3R4X2Vycm9yX2ljbXA6CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOwordHhfZXJyb3I6CisJa2ZyZWVfc2tiKHNrYik7CisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKK30KKyNlbmRpZgorCisKKy8qCisgKiAgICAgIERpcmVjdCBSb3V0aW5nIHRyYW5zbWl0dGVyCisgKiAgICAgIFVzZWQgZm9yIEFOWSBwcm90b2NvbAorICovCitpbnQKK2lwX3ZzX2RyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCSAgICAgIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KKwlzdHJ1Y3QgaXBoZHIgICppcGggPSBpcF9oZHIoc2tiKTsKKwlpbnQgICAgbXR1OworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwaC0+dG9zKSkpKQorCQlnb3RvIHR4X2Vycm9yX2ljbXA7CisKKwkvKiBNVFUgY2hlY2tpbmcgKi8KKwltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOworCWlmICgoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgJiYgc2tiLT5sZW4gPiBtdHUpIHsKKwkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CisJCWlwX3J0X3B1dChydCk7CisJCUlQX1ZTX0RCR19STCgiaXBfdnNfZHJfeG1pdCgpOiBmcmFnIG5lZWRlZFxuIik7CisJCWdvdG8gdHhfZXJyb3I7CisJfQorCisJLyoKKwkgKiBDYWxsIGlwX3NlbmRfY2hlY2sgYmVjYXVzZSB3ZSBhcmUgbm90IHN1cmUgaXQgaXMgY2FsbGVkCisJICogYWZ0ZXIgaXBfZGVmcmFnLiBJcyBjb3B5LW9uLXdyaXRlIG5lZWRlZD8KKwkgKi8KKwlpZiAodW5saWtlbHkoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlyZXR1cm4gTkZfU1RPTEVOOworCX0KKwlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKKworCS8qIGRyb3Agb2xkIHJvdXRlICovCisJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOworCXNrYi0+ZHN0ID0gJnJ0LT51LmRzdDsKKworCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCisJc2tiLT5sb2NhbF9kZiA9IDE7CisKKwlJUF9WU19YTUlUKFBGX0lORVQsIHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKworICB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyAgdHhfZXJyb3I6CisJa2ZyZWVfc2tiKHNrYik7CisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKK30KKworI2lmZGVmIENPTkZJR19JUF9WU19JUFY2CitpbnQKK2lwX3ZzX2RyX3htaXRfdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQkgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCisJaW50ICAgIG10dTsKKworCUVudGVyRnVuY3Rpb24oMTApOworCisJcnQgPSBfX2lwX3ZzX2dldF9vdXRfcnRfdjYoY3ApOworCWlmICghcnQpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCS8qIE1UVSBjaGVja2luZyAqLworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJaWYgKHNrYi0+bGVuID4gbXR1KSB7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOworCQlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwkJSVBfVlNfREJHX1JMKCJpcF92c19kcl94bWl0X3Y2KCk6IGZyYWcgbmVlZGVkXG4iKTsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisKKwkvKgorCSAqIENhbGwgaXBfc2VuZF9jaGVjayBiZWNhdXNlIHdlIGFyZSBub3Qgc3VyZSBpdCBpcyBjYWxsZWQKKwkgKiBhZnRlciBpcF9kZWZyYWcuIElzIGNvcHktb24td3JpdGUgbmVlZGVkPworCSAqLworCXNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCXJldHVybiBORl9TVE9MRU47CisJfQorCisJLyogZHJvcCBvbGQgcm91dGUgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoUEZfSU5FVDYsIHNrYiwgcnQpOworCisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIE5GX1NUT0xFTjsKKwordHhfZXJyb3JfaWNtcDoKKwlkc3RfbGlua19mYWlsdXJlKHNrYik7Cit0eF9lcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsKKwlMZWF2ZUZ1bmN0aW9uKDEwKTsKKwlyZXR1cm4gTkZfU1RPTEVOOworfQorI2VuZGlmCisKKworLyoKKyAqCUlDTVAgcGFja2V0IHRyYW5zbWl0dGVyCisgKgljYWxsZWQgYnkgdGhlIGlwX3ZzX2luX2ljbXAKKyAqLworaW50CitpcF92c19pY21wX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAorCQlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBydGFibGUJKnJ0OwkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCWludCBtdHU7CisJaW50IHJjOworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwkvKiBUaGUgSUNNUCBwYWNrZXQgZm9yIFZTL1RVTiwgVlMvRFIgYW5kIExPQ0FMTk9ERSB3aWxsIGJlCisJICAgZm9yd2FyZGVkIGRpcmVjdGx5IGhlcmUsIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0bworCSAgIHRyYW5zbGF0ZSBhZGRyZXNzL3BvcnQgYmFjayAqLworCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSBJUF9WU19DT05OX0ZfTUFTUSkgeworCQlpZiAoY3AtPnBhY2tldF94bWl0KQorCQkJcmMgPSBjcC0+cGFja2V0X3htaXQoc2tiLCBjcCwgcHApOworCQllbHNlCisJCQlyYyA9IE5GX0FDQ0VQVDsKKwkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCisJCWF0b21pY19pbmMoJmNwLT5pbl9wa3RzKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBtYW5nbGUgYW5kIHNlbmQgdGhlIHBhY2tldCBoZXJlIChvbmx5IGZvciBWUy9OQVQpCisJICovCisKKwlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwX2hkcihza2IpLT50b3MpKSkpCisJCWdvdG8gdHhfZXJyb3JfaWNtcDsKKworCS8qIE1UVSBjaGVja2luZyAqLworCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOworCQlJUF9WU19EQkdfUkwoImlwX3ZzX2luX2ljbXAoKTogZnJhZyBuZWVkZWRcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCS8qIGNvcHktb24td3JpdGUgdGhlIHBhY2tldCBiZWZvcmUgbWFuZ2xpbmcgaXQgKi8KKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0KSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJCWdvdG8gdHhfZXJyb3JfcHV0OworCisJLyogZHJvcCB0aGUgb2xkIHJvdXRlIHdoZW4gc2tiIGlzIG5vdCBzaGFyZWQgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJaXBfdnNfbmF0X2ljbXAoc2tiLCBwcCwgY3AsIDApOworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoUEZfSU5FVCwgc2tiLCBydCk7CisKKwlyYyA9IE5GX1NUT0xFTjsKKwlnb3RvIG91dDsKKworICB0eF9lcnJvcl9pY21wOgorCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKKyAgdHhfZXJyb3I6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJjID0gTkZfU1RPTEVOOworICBvdXQ6CisJTGVhdmVGdW5jdGlvbigxMCk7CisJcmV0dXJuIHJjOworICB0eF9lcnJvcl9wdXQ6CisJaXBfcnRfcHV0KHJ0KTsKKwlnb3RvIHR4X2Vycm9yOworfQorCisjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKK2ludAoraXBfdnNfaWNtcF94bWl0X3Y2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKKwkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8JKnJ0OwkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLworCWludCBtdHU7CisJaW50IHJjOworCisJRW50ZXJGdW5jdGlvbigxMCk7CisKKwkvKiBUaGUgSUNNUCBwYWNrZXQgZm9yIFZTL1RVTiwgVlMvRFIgYW5kIExPQ0FMTk9ERSB3aWxsIGJlCisJICAgZm9yd2FyZGVkIGRpcmVjdGx5IGhlcmUsIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0bworCSAgIHRyYW5zbGF0ZSBhZGRyZXNzL3BvcnQgYmFjayAqLworCWlmIChJUF9WU19GV0RfTUVUSE9EKGNwKSAhPSBJUF9WU19DT05OX0ZfTUFTUSkgeworCQlpZiAoY3AtPnBhY2tldF94bWl0KQorCQkJcmMgPSBjcC0+cGFja2V0X3htaXQoc2tiLCBjcCwgcHApOworCQllbHNlCisJCQlyYyA9IE5GX0FDQ0VQVDsKKwkJLyogZG8gbm90IHRvdWNoIHNrYiBhbnltb3JlICovCisJCWF0b21pY19pbmMoJmNwLT5pbl9wa3RzKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBtYW5nbGUgYW5kIHNlbmQgdGhlIHBhY2tldCBoZXJlIChvbmx5IGZvciBWUy9OQVQpCisJICovCisKKwlydCA9IF9faXBfdnNfZ2V0X291dF9ydF92NihjcCk7CisJaWYgKCFydCkKKwkJZ290byB0eF9lcnJvcl9pY21wOworCisJLyogTVRVIGNoZWNraW5nICovCisJbXR1ID0gZHN0X210dSgmcnQtPnUuZHN0KTsKKwlpZiAoc2tiLT5sZW4gPiBtdHUpIHsKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgc2tiLT5kZXYpOworCQlJUF9WU19EQkdfUkwoImlwX3ZzX2luX2ljbXAoKTogZnJhZyBuZWVkZWRcbiIpOworCQlnb3RvIHR4X2Vycm9yOworCX0KKworCS8qIGNvcHktb24td3JpdGUgdGhlIHBhY2tldCBiZWZvcmUgbWFuZ2xpbmcgaXQgKi8KKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0KSkKKwkJZ290byB0eF9lcnJvcl9wdXQ7CisKKwlpZiAoc2tiX2Nvdyhza2IsIHJ0LT51LmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbikpCisJCWdvdG8gdHhfZXJyb3JfcHV0OworCisJLyogZHJvcCB0aGUgb2xkIHJvdXRlIHdoZW4gc2tiIGlzIG5vdCBzaGFyZWQgKi8KKwlkc3RfcmVsZWFzZShza2ItPmRzdCk7CisJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OworCisJaXBfdnNfbmF0X2ljbXBfdjYoc2tiLCBwcCwgY3AsIDApOworCisJLyogQW5vdGhlciBoYWNrOiBhdm9pZCBpY21wX3NlbmQgaW4gaXBfZnJhZ21lbnQgKi8KKwlza2ItPmxvY2FsX2RmID0gMTsKKworCUlQX1ZTX1hNSVQoUEZfSU5FVDYsIHNrYiwgcnQpOworCisJcmMgPSBORl9TVE9MRU47CisJZ290byBvdXQ7CisKK3R4X2Vycm9yX2ljbXA6CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOwordHhfZXJyb3I6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJjID0gTkZfU1RPTEVOOworb3V0OgorCUxlYXZlRnVuY3Rpb24oMTApOworCXJldHVybiByYzsKK3R4X2Vycm9yX3B1dDoKKwlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKKwlnb3RvIHR4X2Vycm9yOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKaW5kZXggNTliZDhiOS4uYjkyZGY1YyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwpAQCAtMjIsMTkgKzIyLDE3IEBACiAjZGVmaW5lIE5GX0NUX0FDQ1RfREVGQVVMVCAwCiAjZW5kaWYKIAotaW50IG5mX2N0X2FjY3QgX19yZWFkX21vc3RseSA9IE5GX0NUX0FDQ1RfREVGQVVMVDsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2FjY3QpOworc3RhdGljIGludCBuZl9jdF9hY2N0IF9fcmVhZF9tb3N0bHkgPSBORl9DVF9BQ0NUX0RFRkFVTFQ7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChhY2N0LCBuZl9jdF9hY2N0LCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWNjdCwgIkVuYWJsZSBjb25uZWN0aW9uIHRyYWNraW5nIGZsb3cgYWNjb3VudGluZy4iKTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqYWNjdF9zeXNjdGxfaGVhZGVyOwogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgYWNjdF9zeXNjdGxfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAogCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX2FjY3QiLAotCQkuZGF0YQkJPSAmbmZfY3RfYWNjdCwKKwkJLmRhdGEJCT0gJmluaXRfbmV0LmN0LnN5c2N0bF9hY2N0LAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCkBAIC02NCw0MSArNjIsODcgQEAKIAkuaWQJPSBORl9DVF9FWFRfQUNDVCwKIH07CiAKLWludCBuZl9jb25udHJhY2tfYWNjdF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiQ09ORklHX05GX0NUX0FDQ1QgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uIFBsYXNlIHVzZVxuIik7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAibmZfY29ubnRyYWNrLmFjY3Q9MSBrZXJuZWwgcGFyYW1hdGVyLCBhY2N0PTEgbmZfY29ubnRyYWNrIG1vZHVsZSBvcHRpb24gb3JcbiIpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgInN5c2N0bCBuZXQubmV0ZmlsdGVyLm5mX2Nvbm50cmFja19hY2N0PTEgdG8gZW5hYmxlIGl0LlxuIik7Ci0jZW5kaWYKLQotCXJldCA9IG5mX2N0X2V4dGVuZF9yZWdpc3RlcigmYWNjdF9leHRlbmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibmZfY29ubnRyYWNrX2FjY3Q6IFVuYWJsZSB0byByZWdpc3RlciBleHRlbnNpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogI2lmZGVmIENPTkZJR19TWVNDVEwKLQlhY2N0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfcGF0aHMobmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwKLQkJCQlhY2N0X3N5c2N0bF90YWJsZSk7CitzdGF0aWMgaW50IG5mX2Nvbm50cmFja19hY2N0X2luaXRfc3lzY3RsKHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKIAotCWlmICghYWNjdF9zeXNjdGxfaGVhZGVyKSB7Ci0JCW5mX2N0X2V4dGVuZF91bnJlZ2lzdGVyKCZhY2N0X2V4dGVuZCk7CisJdGFibGUgPSBrbWVtZHVwKGFjY3Rfc3lzY3RsX3RhYmxlLCBzaXplb2YoYWNjdF9zeXNjdGxfdGFibGUpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCF0YWJsZSkKKwkJZ290byBvdXQ7CiAKKwl0YWJsZVswXS5kYXRhID0gJm5ldC0+Y3Quc3lzY3RsX2FjY3Q7CisKKwluZXQtPmN0LmFjY3Rfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX25ldF9zeXNjdGxfdGFibGUobmV0LAorCQkJbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwgdGFibGUpOworCWlmICghbmV0LT5jdC5hY2N0X3N5c2N0bF9oZWFkZXIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJuZl9jb25udHJhY2tfYWNjdDogY2FuJ3QgcmVnaXN0ZXIgdG8gc3lzY3RsLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpc3RlcjsKIAl9Ci0jZW5kaWYKKwlyZXR1cm4gMDsKIAorb3V0X3JlZ2lzdGVyOgorCWtmcmVlKHRhYmxlKTsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX2FjY3RfZmluaV9zeXNjdGwoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOworCisJdGFibGUgPSBuZXQtPmN0LmFjY3Rfc3lzY3RsX2hlYWRlci0+Y3RsX3RhYmxlX2FyZzsKKwl1bnJlZ2lzdGVyX25ldF9zeXNjdGxfdGFibGUobmV0LT5jdC5hY2N0X3N5c2N0bF9oZWFkZXIpOworCWtmcmVlKHRhYmxlKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IG5mX2Nvbm50cmFja19hY2N0X2luaXRfc3lzY3RsKHN0cnVjdCBuZXQgKm5ldCkKK3sKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBuZl9jb25udHJhY2tfYWNjdF9maW5pKHZvaWQpCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfYWNjdF9maW5pX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFjY3Rfc3lzY3RsX2hlYWRlcik7Cit9CiAjZW5kaWYKLQluZl9jdF9leHRlbmRfdW5yZWdpc3RlcigmYWNjdF9leHRlbmQpOworCitpbnQgbmZfY29ubnRyYWNrX2FjY3RfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJaW50IHJldDsKKworCW5ldC0+Y3Quc3lzY3RsX2FjY3QgPSBuZl9jdF9hY2N0OworCisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpIHsKKyNpZmRlZiBDT05GSUdfTkZfQ1RfQUNDVAorCXByaW50ayhLRVJOX1dBUk5JTkcgIkNPTkZJR19ORl9DVF9BQ0NUIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLiBQbGVhc2UgdXNlXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZfY29ubnRyYWNrLmFjY3Q9MSBrZXJuZWwgcGFyYW1hdGVyLCBhY2N0PTEgbmZfY29ubnRyYWNrIG1vZHVsZSBvcHRpb24gb3JcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeXNjdGwgbmV0Lm5ldGZpbHRlci5uZl9jb25udHJhY2tfYWNjdD0xIHRvIGVuYWJsZSBpdC5cbiIpOworI2VuZGlmCisKKwkJcmV0ID0gbmZfY3RfZXh0ZW5kX3JlZ2lzdGVyKCZhY2N0X2V4dGVuZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm5mX2Nvbm50cmFja19hY2N0OiBVbmFibGUgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uXG4iKTsKKwkJCWdvdG8gb3V0X2V4dGVuZF9yZWdpc3RlcjsKKwkJfQorCX0KKworCXJldCA9IG5mX2Nvbm50cmFja19hY2N0X2luaXRfc3lzY3RsKG5ldCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3N5c2N0bDsKKworCXJldHVybiAwOworCitvdXRfc3lzY3RsOgorCWlmIChuZXRfZXEobmV0LCAmaW5pdF9uZXQpKQorCQluZl9jdF9leHRlbmRfdW5yZWdpc3RlcigmYWNjdF9leHRlbmQpOworb3V0X2V4dGVuZF9yZWdpc3RlcjoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mX2Nvbm50cmFja19hY2N0X2Zpbmkoc3RydWN0IG5ldCAqbmV0KQoreworCW5mX2Nvbm50cmFja19hY2N0X2Zpbmlfc3lzY3RsKG5ldCk7CisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpCisJCW5mX2N0X2V4dGVuZF91bnJlZ2lzdGVyKCZhY2N0X2V4dGVuZCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggOWQxODMwZC4uNjIyZDdjNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtMzgsMzYgKzM4LDMwIEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgogCiAjZGVmaW5lIE5GX0NPTk5UUkFDS19WRVJTSU9OCSIwLjUuMCIKIAordW5zaWduZWQgaW50CisoKm5mbmV0bGlua19wYXJzZV9uYXRfc2V0dXBfaG9vaykoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcCwKKwkJCQkgIHN0cnVjdCBubGF0dHIgKmF0dHIpIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfcGFyc2VfbmF0X3NldHVwX2hvb2spOworCiBERUZJTkVfU1BJTkxPQ0sobmZfY29ubnRyYWNrX2xvY2spOwogRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2xvY2spOwogCi0vKiBuZl9jb25udHJhY2tfc3RhbmRhbG9uZSBuZWVkcyB0aGlzICovCi1hdG9taWNfdCBuZl9jb25udHJhY2tfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jb3VudCk7Ci0KIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKIAotc3RydWN0IGhsaXN0X2hlYWQgKm5mX2Nvbm50cmFja19oYXNoIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGFzaCk7Ci0KIHN0cnVjdCBuZl9jb25uIG5mX2Nvbm50cmFja191bnRyYWNrZWQgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwogCi11bnNpZ25lZCBpbnQgbmZfY3RfbG9nX2ludmFsaWQgX19yZWFkX21vc3RseTsKLUhMSVNUX0hFQUQodW5jb25maXJtZWQpOwotc3RhdGljIGludCBuZl9jb25udHJhY2tfdm1hbGxvYyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuZl9jb25udHJhY2tfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgbmZfY29ubnRyYWNrX3N0YXQpOwotRVhQT1JUX1BFUl9DUFVfU1lNQk9MKG5mX2Nvbm50cmFja19zdGF0KTsKLQogc3RhdGljIGludCBuZl9jb25udHJhY2tfaGFzaF9ybmRfaW5pdHRlZDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2hhc2hfcm5kOwogCkBAIC0xODAsNiArMTc0LDcgQEAKIGRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAogCXByX2RlYnVnKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKQEAgLTIxMiw3ICsyMDcsNyBAQAogCQlobGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm9kZSk7CiAJfQogCi0JTkZfQ1RfU1RBVF9JTkMoZGVsZXRlKTsKKwlORl9DVF9TVEFUX0lOQyhuZXQsIGRlbGV0ZSk7CiAJc3Bpbl91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAogCWlmIChjdC0+bWFzdGVyKQpAQCAtMjI1LDYgKzIyMCw3IEBACiBzdGF0aWMgdm9pZCBkZWF0aF9ieV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgdWxfY29ubnRyYWNrKQogewogCXN0cnVjdCBuZl9jb25uICpjdCA9ICh2b2lkICopdWxfY29ubnRyYWNrOworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CiAJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKIApAQCAtMjM5LDE0ICsyMzUsMTQgQEAKIAlzcGluX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAkvKiBJbnNpZGUgbG9jayBzbyBwcmVlbXB0IGlzIGRpc2FibGVkIG9uIG1vZHVsZSByZW1vdmFsIHBhdGguCiAJICogT3RoZXJ3aXNlIHdlIGNhbiBnZXQgc3B1cmlvdXMgd2FybmluZ3MuICovCi0JTkZfQ1RfU1RBVF9JTkMoZGVsZXRlX2xpc3QpOworCU5GX0NUX1NUQVRfSU5DKG5ldCwgZGVsZXRlX2xpc3QpOwogCWNsZWFuX2Zyb21fbGlzdHMoY3QpOwogCXNwaW5fdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJbmZfY3RfcHV0KGN0KTsKIH0KIAogc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9fbmZfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCitfX25mX2Nvbm50cmFja19maW5kKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwpAQCAtMjU2LDEzICsyNTIsMTMgQEAKIAkgKiBhdCBsZWFzdCBvbmNlIGZvciB0aGUgc3RhdHMgYW55d2F5LgogCSAqLwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJm5mX2Nvbm50cmFja19oYXNoW2hhc2hdLCBobm9kZSkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmbmV0LT5jdC5oYXNoW2hhc2hdLCBobm9kZSkgewogCQlpZiAobmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkpIHsKLQkJCU5GX0NUX1NUQVRfSU5DKGZvdW5kKTsKKwkJCU5GX0NUX1NUQVRfSU5DKG5ldCwgZm91bmQpOwogCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCQlyZXR1cm4gaDsKIAkJfQotCQlORl9DVF9TVEFUX0lOQyhzZWFyY2hlZCk7CisJCU5GX0NUX1NUQVRfSU5DKG5ldCwgc2VhcmNoZWQpOwogCX0KIAlsb2NhbF9iaF9lbmFibGUoKTsKIApAQCAtMjcyLDEzICsyNjgsMTMgQEAKIAogLyogRmluZCBhIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwogc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKLW5mX2Nvbm50cmFja19maW5kX2dldChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK25mX2Nvbm50cmFja19maW5kX2dldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaCA9IF9fbmZfY29ubnRyYWNrX2ZpbmQodHVwbGUpOworCWggPSBfX25mX2Nvbm50cmFja19maW5kKG5ldCwgdHVwbGUpOwogCWlmIChoKSB7CiAJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKIAkJaWYgKHVubGlrZWx5KCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKSkKQEAgLTI5NCwxMCArMjkwLDEyIEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBoYXNoLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVwbF9oYXNoKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CisKIAlobGlzdF9hZGRfaGVhZF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm9kZSwKLQkJCSAgICZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSk7CisJCQkgICAmbmV0LT5jdC5oYXNoW2hhc2hdKTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5obm9kZSwKLQkJCSAgICZuZl9jb25udHJhY2tfaGFzaFtyZXBsX2hhc2hdKTsKKwkJCSAgICZuZXQtPmN0Lmhhc2hbcmVwbF9oYXNoXSk7CiB9CiAKIHZvaWQgbmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KHN0cnVjdCBuZl9jb25uICpjdCkKQEAgLTMyMyw4ICszMjEsMTAgQEAKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXN0cnVjdCBuZXQgKm5ldDsKIAogCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAogCS8qIGlwdF9SRUpFQ1QgdXNlcyBuZl9jb25udHJhY2tfYXR0YWNoIHRvIGF0dGFjaCByZWxhdGVkCiAJICAgSUNNUC9UQ1AgUlNUIHBhY2tldHMgaW4gb3RoZXIgZGlyZWN0aW9uLiAgQWN0dWFsIHBhY2tldApAQCAtMzUxLDExICszNTEsMTEgQEAKIAkvKiBTZWUgaWYgdGhlcmUncyBvbmUgaW4gdGhlIGxpc3QgYWxyZWFkeSwgaW5jbHVkaW5nIHJldmVyc2U6CiAJICAgTkFUIGNvdWxkIGhhdmUgZ3JhYmJlZCBpdCB3aXRob3V0IHJlYWxpemluZywgc2luY2Ugd2UncmUKIAkgICBub3QgaW4gdGhlIGhhc2guICBJZiB0aGVyZSBpcywgd2UgbG9zdCByYWNlLiAqLwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsIG4sICZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSwgaG5vZGUpCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5ldC0+Y3QuaGFzaFtoYXNoXSwgaG5vZGUpCiAJCWlmIChuZl9jdF90dXBsZV9lcXVhbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAogCQkJCSAgICAgICZoLT50dXBsZSkpCiAJCQlnb3RvIG91dDsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbcmVwbF9oYXNoXSwgaG5vZGUpCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5ldC0+Y3QuaGFzaFtyZXBsX2hhc2hdLCBobm9kZSkKIAkJaWYgKG5mX2N0X3R1cGxlX2VxdWFsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCiAJCQkJICAgICAgJmgtPnR1cGxlKSkKIAkJCWdvdG8gb3V0OwpAQCAtMzcxLDIyICszNzEsMjIgQEAKIAlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKIAlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwogCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZjdC0+c3RhdHVzKTsKLQlORl9DVF9TVEFUX0lOQyhpbnNlcnQpOworCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0KTsKIAlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCWlmIChoZWxwICYmIGhlbHAtPmhlbHBlcikKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfSEVMUEVSLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9IRUxQRVIsIGN0KTsKICNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCWlmICh0ZXN0X2JpdChJUFNfU1JDX05BVF9ET05FX0JJVCwgJmN0LT5zdGF0dXMpIHx8CiAJICAgIHRlc3RfYml0KElQU19EU1RfTkFUX0RPTkVfQklULCAmY3QtPnN0YXR1cykpCi0JCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX05BVElORk8sIHNrYik7CisJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX05BVElORk8sIGN0KTsKICNlbmRpZgogCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShtYXN0ZXJfY3QoY3QpID8KLQkJCQkgSVBDVF9SRUxBVEVEIDogSVBDVF9ORVcsIHNrYik7CisJCQkJIElQQ1RfUkVMQVRFRCA6IElQQ1RfTkVXLCBjdCk7CiAJcmV0dXJuIE5GX0FDQ0VQVDsKIAogb3V0OgotCU5GX0NUX1NUQVRfSU5DKGluc2VydF9mYWlsZWQpOworCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0X2ZhaWxlZCk7CiAJc3Bpbl91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlyZXR1cm4gTkZfRFJPUDsKIH0KQEAgLTM5OCw2ICszOTgsNyBAQAogbmZfY29ubnRyYWNrX3R1cGxlX3Rha2VuKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICppZ25vcmVkX2Nvbm50cmFjaykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoaWdub3JlZF9jb25udHJhY2spOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKIAl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfY29ubnRyYWNrKHR1cGxlKTsKQEAgLTQwNiwxNCArNDA3LDE0IEBACiAJICogbGVhc3Qgb25jZSBmb3IgdGhlIHN0YXRzIGFueXdheS4KIAkgKi8KIAlyY3VfcmVhZF9sb2NrX2JoKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSwgaG5vZGUpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJm5ldC0+Y3QuaGFzaFtoYXNoXSwgaG5vZGUpIHsKIAkJaWYgKG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCkgIT0gaWdub3JlZF9jb25udHJhY2sgJiYKIAkJICAgIG5mX2N0X3R1cGxlX2VxdWFsKHR1cGxlLCAmaC0+dHVwbGUpKSB7Ci0JCQlORl9DVF9TVEFUX0lOQyhmb3VuZCk7CisJCQlORl9DVF9TVEFUX0lOQyhuZXQsIGZvdW5kKTsKIAkJCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJTkZfQ1RfU1RBVF9JTkMoc2VhcmNoZWQpOworCQlORl9DVF9TVEFUX0lOQyhuZXQsIHNlYXJjaGVkKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKQEAgLTQyNSw3ICs0MjYsNyBAQAogCiAvKiBUaGVyZSdzIGEgc21hbGwgcmFjZSBoZXJlIHdoZXJlIHdlIG1heSBmcmVlIGEganVzdC1hc3N1cmVkCiAgICBjb25uZWN0aW9uLiAgVG9vIGJhZDogd2UncmUgaW4gdHJvdWJsZSBhbnl3YXkuICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IGVhcmx5X2Ryb3AodW5zaWduZWQgaW50IGhhc2gpCitzdGF0aWMgbm9pbmxpbmUgaW50IGVhcmx5X2Ryb3Aoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgaGFzaCkKIHsKIAkvKiBVc2Ugb2xkZXN0IGVudHJ5LCB3aGljaCBpcyByb3VnaGx5IExSVSAqLwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKQEAgLTQzNiw3ICs0MzcsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoaSA9IDA7IGkgPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7IGkrKykgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJm5mX2Nvbm50cmFja19oYXNoW2hhc2hdLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJm5ldC0+Y3QuaGFzaFtoYXNoXSwKIAkJCQkJIGhub2RlKSB7CiAJCQl0bXAgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCQkJaWYgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZ0bXAtPnN0YXR1cykpCkBAIC00NTgsMTMgKzQ1OSwxNCBAQAogCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewogCQlkZWF0aF9ieV90aW1lb3V0KCh1bnNpZ25lZCBsb25nKWN0KTsKIAkJZHJvcHBlZCA9IDE7Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhlYXJseV9kcm9wKTsKKwkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgZWFybHlfZHJvcCk7CiAJfQogCW5mX2N0X3B1dChjdCk7CiAJcmV0dXJuIGRyb3BwZWQ7CiB9CiAKLXN0cnVjdCBuZl9jb25uICpuZl9jb25udHJhY2tfYWxsb2MoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKK3N0cnVjdCBuZl9jb25uICpuZl9jb25udHJhY2tfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcsCiAJCQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqcmVwbCwKIAkJCQkgICBnZnBfdCBnZnApCiB7CkBAIC00NzYsMTMgKzQ3OCwxMyBAQAogCX0KIAogCS8qIFdlIGRvbid0IHdhbnQgYW55IHJhY2UgY29uZGl0aW9uIGF0IGVhcmx5IGRyb3Agc3RhZ2UgKi8KLQlhdG9taWNfaW5jKCZuZl9jb25udHJhY2tfY291bnQpOworCWF0b21pY19pbmMoJm5ldC0+Y3QuY291bnQpOwogCiAJaWYgKG5mX2Nvbm50cmFja19tYXggJiYKLQkgICAgdW5saWtlbHkoYXRvbWljX3JlYWQoJm5mX2Nvbm50cmFja19jb3VudCkgPiBuZl9jb25udHJhY2tfbWF4KSkgeworCSAgICB1bmxpa2VseShhdG9taWNfcmVhZCgmbmV0LT5jdC5jb3VudCkgPiBuZl9jb25udHJhY2tfbWF4KSkgewogCQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfY29ubnRyYWNrKG9yaWcpOwotCQlpZiAoIWVhcmx5X2Ryb3AoaGFzaCkpIHsKLQkJCWF0b21pY19kZWMoJm5mX2Nvbm50cmFja19jb3VudCk7CisJCWlmICghZWFybHlfZHJvcChuZXQsIGhhc2gpKSB7CisJCQlhdG9taWNfZGVjKCZuZXQtPmN0LmNvdW50KTsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSAgICAgICAibmZfY29ubnRyYWNrOiB0YWJsZSBmdWxsLCBkcm9wcGluZyIKQEAgLTQ5NCw3ICs0OTYsNyBAQAogCWN0ID0ga21lbV9jYWNoZV96YWxsb2MobmZfY29ubnRyYWNrX2NhY2hlcCwgZ2ZwKTsKIAlpZiAoY3QgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygibmZfY29ubnRyYWNrX2FsbG9jOiBDYW4ndCBhbGxvYyBjb25udHJhY2suXG4iKTsKLQkJYXRvbWljX2RlYygmbmZfY29ubnRyYWNrX2NvdW50KTsKKwkJYXRvbWljX2RlYygmbmV0LT5jdC5jb3VudCk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIApAQCAtNTAzLDYgKzUwNSw5IEBACiAJY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKnJlcGw7CiAJLyogRG9uJ3Qgc2V0IHRpbWVyIHlldDogd2FpdCBmb3IgY29uZmlybWF0aW9uICovCiAJc2V0dXBfdGltZXIoJmN0LT50aW1lb3V0LCBkZWF0aF9ieV90aW1lb3V0LCAodW5zaWduZWQgbG9uZyljdCk7CisjaWZkZWYgQ09ORklHX05FVF9OUworCWN0LT5jdF9uZXQgPSBuZXQ7CisjZW5kaWYKIAlJTklUX1JDVV9IRUFEKCZjdC0+cmN1KTsKIAogCXJldHVybiBjdDsKQEAgLTUxMiwxMCArNTE3LDExIEBACiBzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCBuZl9jb25uICpjdCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgbmZfY29ubiwgcmN1KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCiAJbmZfY3RfZXh0X2ZyZWUoY3QpOwogCWttZW1fY2FjaGVfZnJlZShuZl9jb25udHJhY2tfY2FjaGVwLCBjdCk7Ci0JYXRvbWljX2RlYygmbmZfY29ubnRyYWNrX2NvdW50KTsKKwlhdG9taWNfZGVjKCZuZXQtPmN0LmNvdW50KTsKIH0KIAogdm9pZCBuZl9jb25udHJhY2tfZnJlZShzdHJ1Y3QgbmZfY29ubiAqY3QpCkBAIC01MjgsNyArNTM0LDggQEAKIC8qIEFsbG9jYXRlIGEgbmV3IGNvbm50cmFjazogd2UgcmV0dXJuIC1FTk9NRU0gaWYgY2xhc3NpZmljYXRpb24KICAgIGZhaWxlZCBkdWUgdG8gc3RyZXNzLiAgT3RoZXJ3aXNlIGl0IHJlYWxseSBpcyB1bmNsYXNzaWZpYWJsZS4gKi8KIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotaW5pdF9jb25udHJhY2soY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCitpbml0X2Nvbm50cmFjayhzdHJ1Y3QgbmV0ICpuZXQsCisJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCiAJICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bywKIAkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTU0NCw3ICs1NTEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQljdCA9IG5mX2Nvbm50cmFja19hbGxvYyh0dXBsZSwgJnJlcGxfdHVwbGUsIEdGUF9BVE9NSUMpOworCWN0ID0gbmZfY29ubnRyYWNrX2FsbG9jKG5ldCwgdHVwbGUsICZyZXBsX3R1cGxlLCBHRlBfQVRPTUlDKTsKIAlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKSB7CiAJCXByX2RlYnVnKCJDYW4ndCBhbGxvY2F0ZSBjb25udHJhY2suXG4iKTsKIAkJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiljdDsKQEAgLTU1OSw3ICs1NjYsNyBAQAogCW5mX2N0X2FjY3RfZXh0X2FkZChjdCwgR0ZQX0FUT01JQyk7CiAKIAlzcGluX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlleHAgPSBuZl9jdF9maW5kX2V4cGVjdGF0aW9uKHR1cGxlKTsKKwlleHAgPSBuZl9jdF9maW5kX2V4cGVjdGF0aW9uKG5ldCwgdHVwbGUpOwogCWlmIChleHApIHsKIAkJcHJfZGVidWcoImNvbm50cmFjazogZXhwZWN0YXRpb24gYXJyaXZlcyBjdD0lcCBleHA9JXBcbiIsCiAJCQkgY3QsIGV4cCk7CkBAIC01NzksNyArNTg2LDcgQEAKIAkJY3QtPnNlY21hcmsgPSBleHAtPm1hc3Rlci0+c2VjbWFyazsKICNlbmRpZgogCQluZl9jb25udHJhY2tfZ2V0KCZjdC0+bWFzdGVyLT5jdF9nZW5lcmFsKTsKLQkJTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X25ldyk7CisJCU5GX0NUX1NUQVRfSU5DKG5ldCwgZXhwZWN0X25ldyk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKIApAQCAtNTg5LDExICs1OTYsMTIgQEAKIAkJCWlmIChoZWxwKQogCQkJCXJjdV9hc3NpZ25fcG9pbnRlcihoZWxwLT5oZWxwZXIsIGhlbHBlcik7CiAJCX0KLQkJTkZfQ1RfU1RBVF9JTkMobmV3KTsKKwkJTkZfQ1RfU1RBVF9JTkMobmV0LCBuZXcpOwogCX0KIAogCS8qIE92ZXJsb2FkIHR1cGxlIGxpbmtlZCBsaXN0IHRvIHB1dCB1cyBpbiB1bmNvbmZpcm1lZCBsaXN0LiAqLwotCWhsaXN0X2FkZF9oZWFkKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0uaG5vZGUsICZ1bmNvbmZpcm1lZCk7CisJaGxpc3RfYWRkX2hlYWQoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm9kZSwKKwkJICAgICAgICZuZXQtPmN0LnVuY29uZmlybWVkKTsKIAogCXNwaW5fdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKQEAgLTYwOCw3ICs2MTYsOCBAQAogCiAvKiBPbiBzdWNjZXNzLCByZXR1cm5zIGNvbm50cmFjayBwdHIsIHNldHMgc2tiLT5uZmN0IGFuZCBjdGluZm8gKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm4gKgotcmVzb2x2ZV9ub3JtYWxfY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3Jlc29sdmVfbm9ybWFsX2N0KHN0cnVjdCBuZXQgKm5ldCwKKwkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgIHVfaW50MTZfdCBsM251bSwKIAkJICB1X2ludDhfdCBwcm90b251bSwKQEAgLTYyOSw5ICs2MzgsOSBAQAogCX0KIAogCS8qIGxvb2sgZm9yIHR1cGxlIG1hdGNoICovCi0JaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUpOworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQobmV0LCAmdHVwbGUpOwogCWlmICghaCkgewotCQloID0gaW5pdF9jb25udHJhY2soJnR1cGxlLCBsM3Byb3RvLCBsNHByb3RvLCBza2IsIGRhdGFvZmYpOworCQloID0gaW5pdF9jb25udHJhY2sobmV0LCAmdHVwbGUsIGwzcHJvdG8sIGw0cHJvdG8sIHNrYiwgZGF0YW9mZik7CiAJCWlmICghaCkKIAkJCXJldHVybiBOVUxMOwogCQlpZiAoSVNfRVJSKGgpKQpAQCAtNjY1LDcgKzY3NCw4IEBACiB9CiAKIHVuc2lnbmVkIGludAotbmZfY29ubnRyYWNrX2luKGludCBwZiwgdW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IpCituZl9jb25udHJhY2tfaW4oc3RydWN0IG5ldCAqbmV0LCB1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCXN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwpAQCAtNjc4LDQ0ICs2ODgsNDYgQEAKIAogCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2sgb3IgdW50cmFja2VkKT8gIElnbm9yZS4gKi8KIAlpZiAoc2tiLT5uZmN0KSB7Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhpZ25vcmUpOworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBpZ25vcmUpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIAogCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwotCWwzcHJvdG8gPSBfX25mX2N0X2wzcHJvdG9fZmluZCgodV9pbnQxNl90KXBmKTsKKwlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQocGYpOwogCXJldCA9IGwzcHJvdG8tPmdldF9sNHByb3RvKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCiAJCQkJICAgJmRhdGFvZmYsICZwcm90b251bSk7CiAJaWYgKHJldCA8PSAwKSB7CiAJCXByX2RlYnVnKCJub3QgcHJlcGFyZWQgdG8gdHJhY2sgeWV0IG9yIGVycm9yIG9jY3VyZWRcbiIpOwotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMoZXJyb3IpOwotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMoaW52YWxpZCk7CisJCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIGVycm9yKTsKKwkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgaW52YWxpZCk7CiAJCXJldHVybiAtcmV0OwogCX0KIAotCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZCgodV9pbnQxNl90KXBmLCBwcm90b251bSk7CisJbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKHBmLCBwcm90b251bSk7CiAKIAkvKiBJdCBtYXkgYmUgYW4gc3BlY2lhbCBwYWNrZXQsIGVycm9yLCB1bmNsZWFuLi4uCiAJICogaW52ZXJzZSBvZiB0aGUgcmV0dXJuIGNvZGUgdGVsbHMgdG8gdGhlIG5ldGZpbHRlcgogCSAqIGNvcmUgd2hhdCB0byBkbyB3aXRoIHRoZSBwYWNrZXQuICovCi0JaWYgKGw0cHJvdG8tPmVycm9yICE9IE5VTEwgJiYKLQkgICAgKHJldCA9IGw0cHJvdG8tPmVycm9yKHNrYiwgZGF0YW9mZiwgJmN0aW5mbywgcGYsIGhvb2tudW0pKSA8PSAwKSB7Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhlcnJvcik7Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhpbnZhbGlkKTsKLQkJcmV0dXJuIC1yZXQ7CisJaWYgKGw0cHJvdG8tPmVycm9yICE9IE5VTEwpIHsKKwkJcmV0ID0gbDRwcm90by0+ZXJyb3IobmV0LCBza2IsIGRhdGFvZmYsICZjdGluZm8sIHBmLCBob29rbnVtKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBlcnJvcik7CisJCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBpbnZhbGlkKTsKKwkJCXJldHVybiAtcmV0OworCQl9CiAJfQogCi0JY3QgPSByZXNvbHZlX25vcm1hbF9jdChza2IsIGRhdGFvZmYsIHBmLCBwcm90b251bSwgbDNwcm90bywgbDRwcm90bywKLQkJCSAgICAgICAmc2V0X3JlcGx5LCAmY3RpbmZvKTsKKwljdCA9IHJlc29sdmVfbm9ybWFsX2N0KG5ldCwgc2tiLCBkYXRhb2ZmLCBwZiwgcHJvdG9udW0sCisJCQkgICAgICAgbDNwcm90bywgbDRwcm90bywgJnNldF9yZXBseSwgJmN0aW5mbyk7CiAJaWYgKCFjdCkgewogCQkvKiBOb3QgdmFsaWQgcGFydCBvZiBhIGNvbm5lY3Rpb24gKi8KLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKGludmFsaWQpOworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBpbnZhbGlkKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAl9CiAKIAlpZiAoSVNfRVJSKGN0KSkgewogCQkvKiBUb28gc3RyZXNzZWQgdG8gZGVhbC4gKi8KLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKGRyb3ApOworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBkcm9wKTsKIAkJcmV0dXJuIE5GX0RST1A7CiAJfQogCkBAIC03MjgsMTIgKzc0MCwxMiBAQAogCQlwcl9kZWJ1ZygibmZfY29ubnRyYWNrX2luOiBDYW4ndCB0cmFjayB3aXRoIHByb3RvIG1vZHVsZVxuIik7CiAJCW5mX2Nvbm50cmFja19wdXQoc2tiLT5uZmN0KTsKIAkJc2tiLT5uZmN0ID0gTlVMTDsKLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKGludmFsaWQpOworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBpbnZhbGlkKTsKIAkJcmV0dXJuIC1yZXQ7CiAJfQogCiAJaWYgKHNldF9yZXBseSAmJiAhdGVzdF9hbmRfc2V0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIGN0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04NDYsNyArODU4LDcgQEAKIAogCS8qIG11c3QgYmUgdW5sb2NrZWQgd2hlbiBjYWxsaW5nIGV2ZW50IGNhY2hlICovCiAJaWYgKGV2ZW50KQotCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoZXZlbnQsIHNrYik7CisJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShldmVudCwgY3QpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF9yZWZyZXNoX2FjY3QpOwogCkBAIC05MzgsNyArOTUwLDcgQEAKIAogLyogQnJpbmcgb3V0IHlhIGRlYWQhICovCiBzdGF0aWMgc3RydWN0IG5mX2Nvbm4gKgotZ2V0X25leHRfY29ycHNlKGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwKK2dldF9uZXh0X2NvcnBzZShzdHJ1Y3QgbmV0ICpuZXQsIGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwKIAkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50ICpidWNrZXQpCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwpAQCAtOTQ3LDEzICs5NTksMTMgQEAKIAogCXNwaW5fbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCWZvciAoOyAqYnVja2V0IDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyAoKmJ1Y2tldCkrKykgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbKmJ1Y2tldF0sIGhub2RlKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsIG4sICZuZXQtPmN0Lmhhc2hbKmJ1Y2tldF0sIGhub2RlKSB7CiAJCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CiAJCQlpZiAoaXRlcihjdCwgZGF0YSkpCiAJCQkJZ290byBmb3VuZDsKIAkJfQogCX0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShoLCBuLCAmdW5jb25maXJtZWQsIGhub2RlKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5ldC0+Y3QudW5jb25maXJtZWQsIGhub2RlKSB7CiAJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKIAkJaWYgKGl0ZXIoY3QsIGRhdGEpKQogCQkJc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7CkBAIC05NjYsMTMgKzk3OCwxNCBAQAogCXJldHVybiBjdDsKIH0KIAotdm9pZAotbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3ZvaWQgbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCSAgIGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwKKwkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCXVuc2lnbmVkIGludCBidWNrZXQgPSAwOwogCi0Jd2hpbGUgKChjdCA9IGdldF9uZXh0X2NvcnBzZShpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgeworCXdoaWxlICgoY3QgPSBnZXRfbmV4dF9jb3Jwc2UobmV0LCBpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewogCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCiAJCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKIAkJCWRlYXRoX2J5X3RpbWVvdXQoKHVuc2lnbmVkIGxvbmcpY3QpOwpAQCAtOTk4LDI3ICsxMDExLDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9mcmVlX2hhc2h0YWJsZSk7CiAKLXZvaWQgbmZfY29ubnRyYWNrX2ZsdXNoKHZvaWQpCit2b2lkIG5mX2Nvbm50cmFja19mbHVzaChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0JbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGtpbGxfYWxsLCBOVUxMKTsKKwluZl9jdF9pdGVyYXRlX2NsZWFudXAobmV0LCBraWxsX2FsbCwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZmx1c2gpOwogCi0vKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKLSAgIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuICovCi12b2lkIG5mX2Nvbm50cmFja19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cF9pbml0X25ldCh2b2lkKQogewotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9hdHRhY2gsIE5VTEwpOworCW5mX2Nvbm50cmFja19oZWxwZXJfZmluaSgpOworCW5mX2Nvbm50cmFja19wcm90b19maW5pKCk7CisJa21lbV9jYWNoZV9kZXN0cm95KG5mX2Nvbm50cmFja19jYWNoZXApOworfQogCi0JLyogVGhpcyBtYWtlcyBzdXJlIGFsbCBjdXJyZW50IHBhY2tldHMgaGF2ZSBwYXNzZWQgdGhyb3VnaAotCSAgIG5ldGZpbHRlciBmcmFtZXdvcmsuICBSb2xsIG9uLCB0d28tc3RhZ2UgbW9kdWxlCi0JICAgZGVsZXRlLi4uICovCi0Jc3luY2hyb25pemVfbmV0KCk7Ci0KLQluZl9jdF9ldmVudF9jYWNoZV9mbHVzaCgpOworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXBfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwluZl9jdF9ldmVudF9jYWNoZV9mbHVzaChuZXQpOworCW5mX2Nvbm50cmFja19lY2FjaGVfZmluaShuZXQpOwogIGlfc2VlX2RlYWRfcGVvcGxlOgotCW5mX2Nvbm50cmFja19mbHVzaCgpOwotCWlmIChhdG9taWNfcmVhZCgmbmZfY29ubnRyYWNrX2NvdW50KSAhPSAwKSB7CisJbmZfY29ubnRyYWNrX2ZsdXNoKG5ldCk7CisJaWYgKGF0b21pY19yZWFkKCZuZXQtPmN0LmNvdW50KSAhPSAwKSB7CiAJCXNjaGVkdWxlKCk7CiAJCWdvdG8gaV9zZWVfZGVhZF9wZW9wbGU7CiAJfQpAQCAtMTAyNiwxNiArMTAzOCwzMSBAQAogCXdoaWxlIChhdG9taWNfcmVhZCgmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsLnVzZSkgPiAxKQogCQlzY2hlZHVsZSgpOwogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2Rlc3Ryb3ksIE5VTEwpOwotCi0Ja21lbV9jYWNoZV9kZXN0cm95KG5mX2Nvbm50cmFja19jYWNoZXApOwotCW5mX2N0X2ZyZWVfaGFzaHRhYmxlKG5mX2Nvbm50cmFja19oYXNoLCBuZl9jb25udHJhY2tfdm1hbGxvYywKKwluZl9jdF9mcmVlX2hhc2h0YWJsZShuZXQtPmN0Lmhhc2gsIG5ldC0+Y3QuaGFzaF92bWFsbG9jLAogCQkJICAgICBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOworCW5mX2Nvbm50cmFja19hY2N0X2ZpbmkobmV0KTsKKwluZl9jb25udHJhY2tfZXhwZWN0X2ZpbmkobmV0KTsKKwlmcmVlX3BlcmNwdShuZXQtPmN0LnN0YXQpOworfQogCi0JbmZfY29ubnRyYWNrX2FjY3RfZmluaSgpOwotCW5mX2Nvbm50cmFja19leHBlY3RfZmluaSgpOwotCW5mX2Nvbm50cmFja19oZWxwZXJfZmluaSgpOwotCW5mX2Nvbm50cmFja19wcm90b19maW5pKCk7CisvKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKKyAgIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuICovCit2b2lkIG5mX2Nvbm50cmFja19jbGVhbnVwKHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlpZiAobmV0X2VxKG5ldCwgJmluaXRfbmV0KSkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X2F0dGFjaCwgTlVMTCk7CisKKwkvKiBUaGlzIG1ha2VzIHN1cmUgYWxsIGN1cnJlbnQgcGFja2V0cyBoYXZlIHBhc3NlZCB0aHJvdWdoCisJICAgbmV0ZmlsdGVyIGZyYW1ld29yay4gIFJvbGwgb24sIHR3by1zdGFnZSBtb2R1bGUKKwkgICBkZWxldGUuLi4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCW5mX2Nvbm50cmFja19jbGVhbnVwX25ldChuZXQpOworCisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2Rlc3Ryb3ksIE5VTEwpOworCQluZl9jb25udHJhY2tfY2xlYW51cF9pbml0X25ldCgpOworCX0KIH0KIAogc3RydWN0IGhsaXN0X2hlYWQgKm5mX2N0X2FsbG9jX2hhc2h0YWJsZSh1bnNpZ25lZCBpbnQgKnNpemVwLCBpbnQgKnZtYWxsb2NlZCkKQEAgLTEwOTQsOCArMTEyMSw4IEBACiAJICovCiAJc3Bpbl9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCXdoaWxlICghaGxpc3RfZW1wdHkoJm5mX2Nvbm50cmFja19oYXNoW2ldKSkgewotCQkJaCA9IGhsaXN0X2VudHJ5KG5mX2Nvbm50cmFja19oYXNoW2ldLmZpcnN0LAorCQl3aGlsZSAoIWhsaXN0X2VtcHR5KCZpbml0X25ldC5jdC5oYXNoW2ldKSkgeworCQkJaCA9IGhsaXN0X2VudHJ5KGluaXRfbmV0LmN0Lmhhc2hbaV0uZmlyc3QsCiAJCQkJCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCwgaG5vZGUpOwogCQkJaGxpc3RfZGVsX3JjdSgmaC0+aG5vZGUpOwogCQkJYnVja2V0ID0gX19oYXNoX2Nvbm50cmFjaygmaC0+dHVwbGUsIGhhc2hzaXplLCBybmQpOwpAQCAtMTEwMywxMiArMTEzMCwxMiBAQAogCQl9CiAJfQogCW9sZF9zaXplID0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCW9sZF92bWFsbG9jZWQgPSBuZl9jb25udHJhY2tfdm1hbGxvYzsKLQlvbGRfaGFzaCA9IG5mX2Nvbm50cmFja19oYXNoOworCW9sZF92bWFsbG9jZWQgPSBpbml0X25ldC5jdC5oYXNoX3ZtYWxsb2M7CisJb2xkX2hhc2ggPSBpbml0X25ldC5jdC5oYXNoOwogCiAJbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplID0gaGFzaHNpemU7Ci0JbmZfY29ubnRyYWNrX3ZtYWxsb2MgPSB2bWFsbG9jZWQ7Ci0JbmZfY29ubnRyYWNrX2hhc2ggPSBoYXNoOworCWluaXRfbmV0LmN0Lmhhc2hfdm1hbGxvYyA9IHZtYWxsb2NlZDsKKwlpbml0X25ldC5jdC5oYXNoID0gaGFzaDsKIAluZl9jb25udHJhY2tfaGFzaF9ybmQgPSBybmQ7CiAJc3Bpbl91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIApAQCAtMTEyMCw3ICsxMTQ3LDcgQEAKIG1vZHVsZV9wYXJhbV9jYWxsKGhhc2hzaXplLCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplLCBwYXJhbV9nZXRfdWludCwKIAkJICAmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplLCAwNjAwKTsKIAotaW50IF9faW5pdCBuZl9jb25udHJhY2tfaW5pdCh2b2lkKQorc3RhdGljIGludCBuZl9jb25udHJhY2tfaW5pdF9pbml0X25ldCh2b2lkKQogewogCWludCBtYXhfZmFjdG9yID0gODsKIAlpbnQgcmV0OwpAQCAtMTE0MiwxMyArMTE2OSw2IEBACiAJCSAqIGVudHJpZXMuICovCiAJCW1heF9mYWN0b3IgPSA0OwogCX0KLQluZl9jb25udHJhY2tfaGFzaCA9IG5mX2N0X2FsbG9jX2hhc2h0YWJsZSgmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplLAotCQkJCQkJICAmbmZfY29ubnRyYWNrX3ZtYWxsb2MpOwotCWlmICghbmZfY29ubnRyYWNrX2hhc2gpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIG5mX2Nvbm50cmFja19oYXNoXG4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQogCW5mX2Nvbm50cmFja19tYXggPSBtYXhfZmFjdG9yICogbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwogCiAJcHJpbnRrKCJuZl9jb25udHJhY2sgdmVyc2lvbiAlcyAoJXUgYnVja2V0cywgJWQgbWF4KVxuIiwKQEAgLTExNjAsNDggKzExODAsMTAzIEBACiAJCQkJCQkwLCAwLCBOVUxMKTsKIAlpZiAoIW5mX2Nvbm50cmFja19jYWNoZXApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIG5mX2Nvbm4gc2xhYiBjYWNoZVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaGFzaDsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY2FjaGU7CiAJfQogCiAJcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZnJlZV9jb25udHJhY2tfc2xhYjsKLQotCXJldCA9IG5mX2Nvbm50cmFja19leHBlY3RfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9maW5pX3Byb3RvOworCQlnb3RvIGVycl9wcm90bzsKIAogCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfaW5pdCgpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9maW5pX2V4cGVjdDsKKwkJZ290byBlcnJfaGVscGVyOwogCi0JcmV0ID0gbmZfY29ubnRyYWNrX2FjY3RfaW5pdCgpOworCXJldHVybiAwOworCitlcnJfaGVscGVyOgorCW5mX2Nvbm50cmFja19wcm90b19maW5pKCk7CitlcnJfcHJvdG86CisJa21lbV9jYWNoZV9kZXN0cm95KG5mX2Nvbm50cmFja19jYWNoZXApOworZXJyX2NhY2hlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbmZfY29ubnRyYWNrX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlpbnQgcmV0OworCisJYXRvbWljX3NldCgmbmV0LT5jdC5jb3VudCwgMCk7CisJSU5JVF9ITElTVF9IRUFEKCZuZXQtPmN0LnVuY29uZmlybWVkKTsKKwluZXQtPmN0LnN0YXQgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0KTsKKwlpZiAoIW5ldC0+Y3Quc3RhdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9zdGF0OworCX0KKwlyZXQgPSBuZl9jb25udHJhY2tfZWNhY2hlX2luaXQobmV0KTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZmluaV9oZWxwZXI7Ci0KLQkvKiBGb3IgdXNlIGJ5IFJFSkVDVCB0YXJnZXQgKi8KLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfYXR0YWNoLCBuZl9jb25udHJhY2tfYXR0YWNoKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfZGVzdHJveSwgZGVzdHJveV9jb25udHJhY2spOworCQlnb3RvIGVycl9lY2FjaGU7CisJbmV0LT5jdC5oYXNoID0gbmZfY3RfYWxsb2NfaGFzaHRhYmxlKCZuZl9jb25udHJhY2tfaHRhYmxlX3NpemUsCisJCQkJCQkgICZuZXQtPmN0Lmhhc2hfdm1hbGxvYyk7CisJaWYgKCFuZXQtPmN0Lmhhc2gpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIG5mX2Nvbm50cmFja19oYXNoXG4iKTsKKwkJZ290byBlcnJfaGFzaDsKKwl9CisJcmV0ID0gbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KG5ldCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2V4cGVjdDsKKwlyZXQgPSBuZl9jb25udHJhY2tfYWNjdF9pbml0KG5ldCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2FjY3Q7CiAKIAkvKiBTZXQgdXAgZmFrZSBjb25udHJhY2s6CiAJICAgIC0gdG8gbmV2ZXIgYmUgZGVsZXRlZCwgbm90IGluIGFueSBoYXNoZXMgKi8KKyNpZmRlZiBDT05GSUdfTkVUX05TCisJbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9uZXQgPSAmaW5pdF9uZXQ7CisjZW5kaWYKIAlhdG9taWNfc2V0KCZuZl9jb25udHJhY2tfdW50cmFja2VkLmN0X2dlbmVyYWwudXNlLCAxKTsKIAkvKiAgLSBhbmQgbG9vayBpdCBsaWtlIGFzIGEgY29uZmlybWVkIGNvbm5lY3Rpb24gKi8KIAlzZXRfYml0KElQU19DT05GSVJNRURfQklULCAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5zdGF0dXMpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIAotb3V0X2ZpbmlfaGVscGVyOgotCW5mX2Nvbm50cmFja19oZWxwZXJfZmluaSgpOwotb3V0X2ZpbmlfZXhwZWN0OgotCW5mX2Nvbm50cmFja19leHBlY3RfZmluaSgpOwotb3V0X2ZpbmlfcHJvdG86Ci0JbmZfY29ubnRyYWNrX3Byb3RvX2ZpbmkoKTsKLWVycl9mcmVlX2Nvbm50cmFja19zbGFiOgotCWttZW1fY2FjaGVfZGVzdHJveShuZl9jb25udHJhY2tfY2FjaGVwKTsKLWVycl9mcmVlX2hhc2g6Ci0JbmZfY3RfZnJlZV9oYXNodGFibGUobmZfY29ubnRyYWNrX2hhc2gsIG5mX2Nvbm50cmFja192bWFsbG9jLAorZXJyX2FjY3Q6CisJbmZfY29ubnRyYWNrX2V4cGVjdF9maW5pKG5ldCk7CitlcnJfZXhwZWN0OgorCW5mX2N0X2ZyZWVfaGFzaHRhYmxlKG5ldC0+Y3QuaGFzaCwgbmV0LT5jdC5oYXNoX3ZtYWxsb2MsCiAJCQkgICAgIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci1lcnJfb3V0OgotCXJldHVybiAtRU5PTUVNOworZXJyX2hhc2g6CisJbmZfY29ubnRyYWNrX2VjYWNoZV9maW5pKG5ldCk7CitlcnJfZWNhY2hlOgorCWZyZWVfcGVyY3B1KG5ldC0+Y3Quc3RhdCk7CitlcnJfc3RhdDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmZfY29ubnRyYWNrX2luaXQoc3RydWN0IG5ldCAqbmV0KQoreworCWludCByZXQ7CisKKwlpZiAobmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgeworCQlyZXQgPSBuZl9jb25udHJhY2tfaW5pdF9pbml0X25ldCgpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X2luaXRfbmV0OworCX0KKwlyZXQgPSBuZl9jb25udHJhY2tfaW5pdF9uZXQobmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfbmV0OworCisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpIHsKKwkJLyogRm9yIHVzZSBieSBSRUpFQ1QgdGFyZ2V0ICovCisJCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9hdHRhY2gsIG5mX2Nvbm50cmFja19hdHRhY2gpOworCQlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfZGVzdHJveSwgZGVzdHJveV9jb25udHJhY2spOworCX0KKwlyZXR1cm4gMDsKKworb3V0X25ldDoKKwlpZiAobmV0X2VxKG5ldCwgJmluaXRfbmV0KSkKKwkJbmZfY29ubnRyYWNrX2NsZWFudXBfaW5pdF9uZXQoKTsKK291dF9pbml0X25ldDoKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwppbmRleCA4M2M0MWFjLi5hNWY1ZTJlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwpAQCAtMjksOSArMjksNiBAQAogQVRPTUlDX05PVElGSUVSX0hFQUQobmZfY3RfZXhwZWN0X2NoYWluKTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2V4cGVjdF9jaGFpbik7CiAKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlLCBuZl9jb25udHJhY2tfZWNhY2hlKTsKLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2VjYWNoZSk7Ci0KIC8qIGRlbGl2ZXIgY2FjaGVkIGV2ZW50cyBhbmQgY2xlYXIgY2FjaGUgZW50cnkgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2FsbHkKICAqIGRpc2FibGVkIHNvZnRpcnFzICovCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTUxLDEwICs0OCwxMSBAQAogICogYnkgY29kZSBwcmlvciB0byBhc3luYyBwYWNrZXQgaGFuZGxpbmcgZm9yIGZyZWVpbmcgdGhlIHNrYiAqLwogdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKKwllY2FjaGUgPSBwZXJfY3B1X3B0cihuZXQtPmN0LmVjYWNoZSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaWYgKGVjYWNoZS0+Y3QgPT0gY3QpCiAJCV9fbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGVjYWNoZSk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CkBAIC02NCwxMCArNjIsMTEgQEAKIC8qIERlbGl2ZXIgY2FjaGVkIGV2ZW50cyBmb3Igb2xkIHBlbmRpbmcgZXZlbnRzLCBpZiBjdXJyZW50IGNvbm50cmFjayAhPSBvbGQgKi8KIHZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7CiAKIAkvKiB0YWtlIGNhcmUgb2YgZGVsaXZlcmluZyBwb3RlbnRpYWxseSBvbGQgZXZlbnRzICovCi0JZWNhY2hlID0gJl9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSk7CisJZWNhY2hlID0gcGVyX2NwdV9wdHIobmV0LT5jdC5lY2FjaGUsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOwogCUJVR19PTihlY2FjaGUtPmN0ID09IGN0KTsKIAlpZiAoZWNhY2hlLT5jdCkKIAkJX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKQEAgLTc5LDE4ICs3OCwzMSBAQAogCiAvKiBmbHVzaCB0aGUgZXZlbnQgY2FjaGUgLSB0b3VjaGVzIG90aGVyIENQVSdzIGRhdGEgYW5kIG11c3Qgbm90IGJlIGNhbGxlZAogICogd2hpbGUgcGFja2V0cyBhcmUgc3RpbGwgcGFzc2luZyB0aHJvdWdoIHRoZSBjb2RlICovCi12b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHZvaWQpCit2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwogCWludCBjcHU7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWVjYWNoZSA9ICZwZXJfY3B1KG5mX2Nvbm50cmFja19lY2FjaGUsIGNwdSk7CisJCWVjYWNoZSA9IHBlcl9jcHVfcHRyKG5ldC0+Y3QuZWNhY2hlLCBjcHUpOwogCQlpZiAoZWNhY2hlLT5jdCkKIAkJCW5mX2N0X3B1dChlY2FjaGUtPmN0KTsKIAl9CiB9CiAKK2ludCBuZl9jb25udHJhY2tfZWNhY2hlX2luaXQoc3RydWN0IG5ldCAqbmV0KQoreworCW5ldC0+Y3QuZWNhY2hlID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlKTsKKwlpZiAoIW5ldC0+Y3QuZWNhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZl9jb25udHJhY2tfZWNhY2hlX2Zpbmkoc3RydWN0IG5ldCAqbmV0KQoreworCWZyZWVfcGVyY3B1KG5ldC0+Y3QuZWNhY2hlKTsKK30KKwogaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewogCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYwppbmRleCBlOGYwZGVhLi4zN2E3MDNiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYwpAQCAtMjgsMTcgKzI4LDEyIEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KIAotc3RydWN0IGhsaXN0X2hlYWQgKm5mX2N0X2V4cGVjdF9oYXNoIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9leHBlY3RfaGFzaCk7Ci0KIHVuc2lnbmVkIGludCBuZl9jdF9leHBlY3RfaHNpemUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2V4cGVjdF9oc2l6ZSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfZXhwZWN0X2hhc2hfcm5kIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X2V4cGVjdF9jb3VudDsKIHVuc2lnbmVkIGludCBuZl9jdF9leHBlY3RfbWF4IF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50IG5mX2N0X2V4cGVjdF9oYXNoX3JuZF9pbml0dGVkIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgaW50IG5mX2N0X2V4cGVjdF92bWFsbG9jOwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5mX2N0X2V4cGVjdF9jYWNoZXAgX19yZWFkX21vc3RseTsKIApAQCAtNDYsMTggKzQxLDE5IEBACiB2b2lkIG5mX2N0X3VubGlua19leHBlY3Qoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7CisJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfZXhwX25ldChleHApOwogCiAJTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKIAlORl9DVF9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwogCiAJaGxpc3RfZGVsX3JjdSgmZXhwLT5obm9kZSk7Ci0JbmZfY3RfZXhwZWN0X2NvdW50LS07CisJbmV0LT5jdC5leHBlY3RfY291bnQtLTsKIAogCWhsaXN0X2RlbCgmZXhwLT5sbm9kZSk7CiAJbWFzdGVyX2hlbHAtPmV4cGVjdGluZ1tleHAtPmNsYXNzXS0tOwogCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKIAotCU5GX0NUX1NUQVRfSU5DKGV4cGVjdF9kZWxldGUpOworCU5GX0NUX1NUQVRfSU5DKG5ldCwgZXhwZWN0X2RlbGV0ZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF91bmxpbmtfZXhwZWN0KTsKIApAQCAtODcsMTcgKzgzLDE3IEBACiB9CiAKIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLV9fbmZfY3RfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCitfX25mX2N0X2V4cGVjdF9maW5kKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJdW5zaWduZWQgaW50IGg7CiAKLQlpZiAoIW5mX2N0X2V4cGVjdF9jb3VudCkKKwlpZiAoIW5ldC0+Y3QuZXhwZWN0X2NvdW50KQogCQlyZXR1cm4gTlVMTDsKIAogCWggPSBuZl9jdF9leHBlY3RfZHN0X2hhc2godHVwbGUpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpLCBuLCAmbmZfY3RfZXhwZWN0X2hhc2hbaF0sIGhub2RlKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGksIG4sICZuZXQtPmN0LmV4cGVjdF9oYXNoW2hdLCBobm9kZSkgewogCQlpZiAobmZfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spKQogCQkJcmV0dXJuIGk7CiAJfQpAQCAtMTA3LDEyICsxMDMsMTIgQEAKIAogLyogSnVzdCBmaW5kIGEgZXhwZWN0YXRpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwogc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotbmZfY3RfZXhwZWN0X2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQorbmZfY3RfZXhwZWN0X2ZpbmRfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaSA9IF9fbmZfY3RfZXhwZWN0X2ZpbmQodHVwbGUpOworCWkgPSBfX25mX2N0X2V4cGVjdF9maW5kKG5ldCwgdHVwbGUpOwogCWlmIChpICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZpLT51c2UpKQogCQlpID0gTlVMTDsKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTEyNCwxNyArMTIwLDE3IEBACiAvKiBJZiBhbiBleHBlY3RhdGlvbiBmb3IgdGhpcyBjb25uZWN0aW9uIGlzIGZvdW5kLCBpdCBnZXRzIGRlbGV0ZSBmcm9tCiAgKiBnbG9iYWwgbGlzdCB0aGVuIHJldHVybmVkLiAqLwogc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgotbmZfY3RfZmluZF9leHBlY3RhdGlvbihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK25mX2N0X2ZpbmRfZXhwZWN0YXRpb24oc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaSwgKmV4cCA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJdW5zaWduZWQgaW50IGg7CiAKLQlpZiAoIW5mX2N0X2V4cGVjdF9jb3VudCkKKwlpZiAoIW5ldC0+Y3QuZXhwZWN0X2NvdW50KQogCQlyZXR1cm4gTlVMTDsKIAogCWggPSBuZl9jdF9leHBlY3RfZHN0X2hhc2godHVwbGUpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGksIG4sICZuZl9jdF9leHBlY3RfaGFzaFtoXSwgaG5vZGUpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShpLCBuLCAmbmV0LT5jdC5leHBlY3RfaGFzaFtoXSwgaG5vZGUpIHsKIAkJaWYgKCEoaS0+ZmxhZ3MgJiBORl9DVF9FWFBFQ1RfSU5BQ1RJVkUpICYmCiAJCSAgICBuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykpIHsKIAkJCWV4cCA9IGk7CkBAIC0yNDEsNyArMjM3LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2V4cGVjdF9hbGxvYyk7CiAKIHZvaWQgbmZfY3RfZXhwZWN0X2luaXQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwgdW5zaWduZWQgaW50IGNsYXNzLAotCQkgICAgICAgaW50IGZhbWlseSwKKwkJICAgICAgIHVfaW50OF90IGZhbWlseSwKIAkJICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqc2FkZHIsCiAJCSAgICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmRhZGRyLAogCQkgICAgICAgdV9pbnQ4X3QgcHJvdG8sIGNvbnN0IF9fYmUxNiAqc3JjLCBjb25zdCBfX2JlMTYgKmRzdCkKQEAgLTMxMSw2ICszMDcsNyBAQAogc3RhdGljIHZvaWQgbmZfY3RfZXhwZWN0X2luc2VydChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewogCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9leHBfbmV0KGV4cCk7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3RfcG9saWN5ICpwOwogCXVuc2lnbmVkIGludCBoID0gbmZfY3RfZXhwZWN0X2RzdF9oYXNoKCZleHAtPnR1cGxlKTsKIApAQCAtMzE5LDggKzMxNiw4IEBACiAJaGxpc3RfYWRkX2hlYWQoJmV4cC0+bG5vZGUsICZtYXN0ZXJfaGVscC0+ZXhwZWN0YXRpb25zKTsKIAltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nW2V4cC0+Y2xhc3NdKys7CiAKLQlobGlzdF9hZGRfaGVhZF9yY3UoJmV4cC0+aG5vZGUsICZuZl9jdF9leHBlY3RfaGFzaFtoXSk7Ci0JbmZfY3RfZXhwZWN0X2NvdW50Kys7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZleHAtPmhub2RlLCAmbmV0LT5jdC5leHBlY3RfaGFzaFtoXSk7CisJbmV0LT5jdC5leHBlY3RfY291bnQrKzsKIAogCXNldHVwX3RpbWVyKCZleHAtPnRpbWVvdXQsIG5mX2N0X2V4cGVjdGF0aW9uX3RpbWVkX291dCwKIAkJICAgICh1bnNpZ25lZCBsb25nKWV4cCk7CkBAIC0zMjksNyArMzI2LDcgQEAKIAlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7CiAKIAlhdG9taWNfaW5jKCZleHAtPnVzZSk7Ci0JTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X2NyZWF0ZSk7CisJTkZfQ1RfU1RBVF9JTkMobmV0LCBleHBlY3RfY3JlYXRlKTsKIH0KIAogLyogUmFjZSB3aXRoIGV4cGVjdGF0aW9ucyBiZWluZyB1c2VkIG1lYW5zIHdlIGNvdWxkIGhhdmUgbm9uZSB0byBmaW5kOyBPSy4gKi8KQEAgLTM3MSw2ICszNjgsNyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwogCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBleHBlY3QtPm1hc3RlcjsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChtYXN0ZXIpOworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X2V4cF9uZXQoZXhwZWN0KTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKIAl1bnNpZ25lZCBpbnQgaDsKIAlpbnQgcmV0OwpAQCAtMzgzLDcgKzM4MSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAloID0gbmZfY3RfZXhwZWN0X2RzdF9oYXNoKCZleHBlY3QtPnR1cGxlKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShpLCBuLCAmbmZfY3RfZXhwZWN0X2hhc2hbaF0sIGhub2RlKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaSwgbiwgJm5ldC0+Y3QuZXhwZWN0X2hhc2hbaF0sIGhub2RlKSB7CiAJCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHBlY3QpKSB7CiAJCQkvKiBSZWZyZXNoIHRpbWVyOiBpZiBpdCdzIGR5aW5nLCBpZ25vcmUuLiAqLwogCQkJaWYgKHJlZnJlc2hfdGltZXIoaSkpIHsKQEAgLTQwNiw3ICs0MDQsNyBAQAogCQl9CiAJfQogCi0JaWYgKG5mX2N0X2V4cGVjdF9jb3VudCA+PSBuZl9jdF9leHBlY3RfbWF4KSB7CisJaWYgKG5ldC0+Y3QuZXhwZWN0X2NvdW50ID49IG5mX2N0X2V4cGVjdF9tYXgpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAibmZfY29ubnRyYWNrOiBleHBlY3RhdGlvbiB0YWJsZSBmdWxsXG4iKTsKQEAgLTQyNSwxNiArNDIzLDE4IEBACiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlIHsKKwlzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlIHA7CiAJdW5zaWduZWQgaW50IGJ1Y2tldDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZXhwZWN0X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCiAJZm9yIChzdC0+YnVja2V0ID0gMDsgc3QtPmJ1Y2tldCA8IG5mX2N0X2V4cGVjdF9oc2l6ZTsgc3QtPmJ1Y2tldCsrKSB7Ci0JCW4gPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQluID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOwogCQlpZiAobikKIAkJCXJldHVybiBuOwogCX0KQEAgLTQ0NCwxMyArNDQ0LDE0IEBACiBzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmN0X2V4cGVjdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKIAkJCQkJICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqaGVhZCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCiAJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLT5uZXh0KTsKIAl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7CiAJCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY3RfZXhwZWN0X2hzaXplKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOwogCX0KIAlyZXR1cm4gaGVhZDsKIH0KQEAgLTUyNCw3ICs1MjUsNyBAQAogCiBzdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3Blbl9wcml2YXRlKGZpbGUsICZleHBfc2VxX29wcywKKwlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmZXhwX3NlcV9vcHMsCiAJCQlzaXplb2Yoc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlKSk7CiB9CiAKQEAgLTUzMyw3MiArNTM0LDc5IEBACiAJLm9wZW4gICAgPSBleHBfb3BlbiwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKIH07CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAotc3RhdGljIGludCBfX2luaXQgZXhwX3Byb2NfaW5pdCh2b2lkKQorc3RhdGljIGludCBleHBfcHJvY19pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKIAotCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZSgmaW5pdF9uZXQsICJuZl9jb25udHJhY2tfZXhwZWN0IiwgMDQ0MCwgJmV4cF9maWxlX29wcyk7CisJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKG5ldCwgIm5mX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLCAmZXhwX2ZpbGVfb3BzKTsKIAlpZiAoIXByb2MpCiAJCXJldHVybiAtRU5PTUVNOwogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4cF9wcm9jX3JlbW92ZSh2b2lkKQorc3RhdGljIHZvaWQgZXhwX3Byb2NfcmVtb3ZlKHN0cnVjdCBuZXQgKm5ldCkKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXByb2NfbmV0X3JlbW92ZSgmaW5pdF9uZXQsICJuZl9jb25udHJhY2tfZXhwZWN0Iik7CisJcHJvY19uZXRfcmVtb3ZlKG5ldCwgIm5mX2Nvbm50cmFja19leHBlY3QiKTsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogfQogCiBtb2R1bGVfcGFyYW1fbmFtZWQoZXhwZWN0X2hhc2hzaXplLCBuZl9jdF9leHBlY3RfaHNpemUsIHVpbnQsIDA2MDApOwogCi1pbnQgX19pbml0IG5mX2Nvbm50cmFja19leHBlY3RfaW5pdCh2b2lkKQoraW50IG5mX2Nvbm50cmFja19leHBlY3RfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKLQlpZiAoIW5mX2N0X2V4cGVjdF9oc2l6ZSkgewotCQluZl9jdF9leHBlY3RfaHNpemUgPSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgLyAyNTY7Ci0JCWlmICghbmZfY3RfZXhwZWN0X2hzaXplKQotCQkJbmZfY3RfZXhwZWN0X2hzaXplID0gMTsKKwlpZiAobmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgeworCQlpZiAoIW5mX2N0X2V4cGVjdF9oc2l6ZSkgeworCQkJbmZfY3RfZXhwZWN0X2hzaXplID0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplIC8gMjU2OworCQkJaWYgKCFuZl9jdF9leHBlY3RfaHNpemUpCisJCQkJbmZfY3RfZXhwZWN0X2hzaXplID0gMTsKKwkJfQorCQluZl9jdF9leHBlY3RfbWF4ID0gbmZfY3RfZXhwZWN0X2hzaXplICogNDsKIAl9Ci0JbmZfY3RfZXhwZWN0X21heCA9IG5mX2N0X2V4cGVjdF9oc2l6ZSAqIDQ7CiAKLQluZl9jdF9leHBlY3RfaGFzaCA9IG5mX2N0X2FsbG9jX2hhc2h0YWJsZSgmbmZfY3RfZXhwZWN0X2hzaXplLAotCQkJCQkJICAmbmZfY3RfZXhwZWN0X3ZtYWxsb2MpOwotCWlmIChuZl9jdF9leHBlY3RfaGFzaCA9PSBOVUxMKQorCW5ldC0+Y3QuZXhwZWN0X2NvdW50ID0gMDsKKwluZXQtPmN0LmV4cGVjdF9oYXNoID0gbmZfY3RfYWxsb2NfaGFzaHRhYmxlKCZuZl9jdF9leHBlY3RfaHNpemUsCisJCQkJCQkgICZuZXQtPmN0LmV4cGVjdF92bWFsbG9jKTsKKwlpZiAobmV0LT5jdC5leHBlY3RfaGFzaCA9PSBOVUxMKQogCQlnb3RvIGVycjE7CiAKLQluZl9jdF9leHBlY3RfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mX2Nvbm50cmFja19leHBlY3QiLAorCWlmIChuZXRfZXEobmV0LCAmaW5pdF9uZXQpKSB7CisJCW5mX2N0X2V4cGVjdF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZfY29ubnRyYWNrX2V4cGVjdCIsCiAJCQkJCXNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCksCiAJCQkJCTAsIDAsIE5VTEwpOwotCWlmICghbmZfY3RfZXhwZWN0X2NhY2hlcCkKLQkJZ290byBlcnIyOworCQlpZiAoIW5mX2N0X2V4cGVjdF9jYWNoZXApCisJCQlnb3RvIGVycjI7CisJfQogCi0JZXJyID0gZXhwX3Byb2NfaW5pdCgpOworCWVyciA9IGV4cF9wcm9jX2luaXQobmV0KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnIzOwogCiAJcmV0dXJuIDA7CiAKIGVycjM6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KG5mX2N0X2V4cGVjdF9jYWNoZXApOworCWlmIChuZXRfZXEobmV0LCAmaW5pdF9uZXQpKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZfY3RfZXhwZWN0X2NhY2hlcCk7CiBlcnIyOgotCW5mX2N0X2ZyZWVfaGFzaHRhYmxlKG5mX2N0X2V4cGVjdF9oYXNoLCBuZl9jdF9leHBlY3Rfdm1hbGxvYywKKwluZl9jdF9mcmVlX2hhc2h0YWJsZShuZXQtPmN0LmV4cGVjdF9oYXNoLCBuZXQtPmN0LmV4cGVjdF92bWFsbG9jLAogCQkJICAgICBuZl9jdF9leHBlY3RfaHNpemUpOwogZXJyMToKIAlyZXR1cm4gZXJyOwogfQogCi12b2lkIG5mX2Nvbm50cmFja19leHBlY3RfZmluaSh2b2lkKQordm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X2Zpbmkoc3RydWN0IG5ldCAqbmV0KQogewotCWV4cF9wcm9jX3JlbW92ZSgpOwotCWttZW1fY2FjaGVfZGVzdHJveShuZl9jdF9leHBlY3RfY2FjaGVwKTsKLQluZl9jdF9mcmVlX2hhc2h0YWJsZShuZl9jdF9leHBlY3RfaGFzaCwgbmZfY3RfZXhwZWN0X3ZtYWxsb2MsCisJZXhwX3Byb2NfcmVtb3ZlKG5ldCk7CisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpCisJCWttZW1fY2FjaGVfZGVzdHJveShuZl9jdF9leHBlY3RfY2FjaGVwKTsKKwluZl9jdF9mcmVlX2hhc2h0YWJsZShuZXQtPmN0LmV4cGVjdF9oYXNoLCBuZXQtPmN0LmV4cGVjdF92bWFsbG9jLAogCQkJICAgICBuZl9jdF9leHBlY3RfaHNpemUpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwppbmRleCBiYjIwNjcyLi40ZjcxMDcxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwpAQCAtMzE4LDcgKzMxOCw4IEBACiB9CiAKIC8qIFdlIGRvbid0IHVwZGF0ZSBpZiBpdCdzIG9sZGVyIHRoYW4gd2hhdCB3ZSBoYXZlLiAqLwotc3RhdGljIHZvaWQgdXBkYXRlX25sX3NlcSh1MzIgbmxfc2VxLCBzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpciwKK3N0YXRpYyB2b2lkIHVwZGF0ZV9ubF9zZXEoc3RydWN0IG5mX2Nvbm4gKmN0LCB1MzIgbmxfc2VxLAorCQkJICBzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpciwKIAkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1bnNpZ25lZCBpbnQgaSwgb2xkZXN0ID0gTlVNX1NFUV9UT19SRU1FTUJFUjsKQEAgLTMzNiwxMSArMzM3LDExIEBACiAKIAlpZiAoaW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXSA8IE5VTV9TRVFfVE9fUkVNRU1CRVIpIHsKIAkJaW5mby0+c2VxX2FmdF9ubFtkaXJdW2luZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl0rK10gPSBubF9zZXE7Ci0JCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0hFTFBJTkZPX1ZPTEFUSUxFLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9IRUxQSU5GT19WT0xBVElMRSwgY3QpOwogCX0gZWxzZSBpZiAob2xkZXN0ICE9IE5VTV9TRVFfVE9fUkVNRU1CRVIgJiYKIAkJICAgYWZ0ZXIobmxfc2VxLCBpbmZvLT5zZXFfYWZ0X25sW2Rpcl1bb2xkZXN0XSkpIHsKIAkJaW5mby0+c2VxX2FmdF9ubFtkaXJdW29sZGVzdF0gPSBubF9zZXE7Ci0JCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX0hFTFBJTkZPX1ZPTEFUSUxFLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9IRUxQSU5GT19WT0xBVElMRSwgY3QpOwogCX0KIH0KIApAQCAtNTA5LDcgKzUxMCw3IEBACiAJLyogTm93IGlmIHRoaXMgZW5kcyBpbiBcbiwgdXBkYXRlIGZ0cCBpbmZvLiAgU2VxIG1heSBoYXZlIGJlZW4KIAkgKiBhZGp1c3RlZCBieSBOQVQgY29kZS4gKi8KIAlpZiAoZW5kc19pbl9ubCkKLQkJdXBkYXRlX25sX3NlcShzZXEsIGN0X2Z0cF9pbmZvLCBkaXIsIHNrYik7CisJCXVwZGF0ZV9ubF9zZXEoY3QsIHNlcSwgY3RfZnRwX2luZm8sIGRpciwgc2tiKTsKICBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJm5mX2Z0cF9sb2NrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwppbmRleCAyZjgzYzE1Li5jMTUwNGY3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwpAQCAtNzA5LDcgKzcwOSw4IEBACiAvKiBJZiB0aGUgY2FsbGluZyBwYXJ0eSBpcyBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBmb3J3YXJkLXRvIHBhcnR5LAogICogd2UgZG9uJ3QgbmVlZCB0byB0cmFjayB0aGUgc2Vjb25kIGNhbGwgKi8KIHN0YXRpYyBpbnQgY2FsbGZvcndhcmRfZG9fZmlsdGVyKGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkc3QsIGludCBmYW1pbHkpCisJCQkJIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZHN0LAorCQkJCSB1X2ludDhfdCBmYW1pbHkpCiB7CiAJY29uc3Qgc3RydWN0IG5mX2FmaW5mbyAqYWZpbmZvOwogCXN0cnVjdCBmbG93aSBmbDEsIGZsMjsKQEAgLTEyMDksNiArMTIxMCw3IEBACiAJCQkJCSAgICAgICB1bmlvbiBuZl9pbmV0X2FkZHIgKmFkZHIsCiAJCQkJCSAgICAgICBfX2JlMTYgcG9ydCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKIApAQCAtMTIxOCw3ICsxMjIwLDcgQEAKIAl0dXBsZS5kc3QudS50Y3AucG9ydCA9IHBvcnQ7CiAJdHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7CiAKLQlleHAgPSBfX25mX2N0X2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJZXhwID0gX19uZl9jdF9leHBlY3RfZmluZChuZXQsICZ0dXBsZSk7CiAJaWYgKGV4cCAmJiBleHAtPm1hc3RlciA9PSBjdCkKIAkJcmV0dXJuIGV4cDsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKaW5kZXggOGUwYjRjOC4uOWMwNmI5ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKQEAgLTEyMywxMyArMTIzLDQwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKIAotdm9pZCBuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQorc3RhdGljIHZvaWQgX19uZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lLAorCQkJCQkgICAgIHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKIAljb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgKm5leHQ7CiAJdW5zaWduZWQgaW50IGk7CiAKKwkvKiBHZXQgcmlkIG9mIGV4cGVjdGF0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBuZl9jdF9leHBlY3RfaHNpemU7IGkrKykgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgbiwgbmV4dCwKKwkJCQkJICAmbmV0LT5jdC5leHBlY3RfaGFzaFtpXSwgaG5vZGUpIHsKKwkJCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOworCQkJaWYgKChoZWxwLT5oZWxwZXIgPT0gbWUgfHwgZXhwLT5oZWxwZXIgPT0gbWUpICYmCisJCQkgICAgZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7CisJCQkJbmZfY3RfdW5saW5rX2V4cGVjdChleHApOworCQkJCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEdldCByaWQgb2YgZXhwZWN0ZWRzLCBzZXQgaGVscGVycyB0byBOVUxMLiAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsIG4sICZuZXQtPmN0LnVuY29uZmlybWVkLCBobm9kZSkKKwkJdW5oZWxwKGgsIG1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBpKyspIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5ldC0+Y3QuaGFzaFtpXSwgaG5vZGUpCisJCQl1bmhlbHAoaCwgbWUpOworCX0KK30KKwordm9pZCBuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQoreworCXN0cnVjdCBuZXQgKm5ldDsKKwogCW11dGV4X2xvY2soJm5mX2N0X2hlbHBlcl9tdXRleCk7CiAJaGxpc3RfZGVsX3JjdSgmbWUtPmhub2RlKTsKIAluZl9jdF9oZWxwZXJfY291bnQtLTsKQEAgLTE0MSwyNyArMTY4LDggQEAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCXNwaW5fbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCi0JLyogR2V0IHJpZCBvZiBleHBlY3RhdGlvbnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbmZfY3RfZXhwZWN0X2hzaXplOyBpKyspIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIG4sIG5leHQsCi0JCQkJCSAgJm5mX2N0X2V4cGVjdF9oYXNoW2ldLCBobm9kZSkgewotCQkJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7Ci0JCQlpZiAoKGhlbHAtPmhlbHBlciA9PSBtZSB8fCBleHAtPmhlbHBlciA9PSBtZSkgJiYKLQkJCSAgICBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKLQkJCQluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQkJbmZfY3RfZXhwZWN0X3B1dChleHApOwotCQkJfQotCQl9Ci0JfQotCi0JLyogR2V0IHJpZCBvZiBleHBlY3RlZHMsIHNldCBoZWxwZXJzIHRvIE5VTEwuICovCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJnVuY29uZmlybWVkLCBobm9kZSkKLQkJdW5oZWxwKGgsIG1lKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBpKyspIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5mX2Nvbm50cmFja19oYXNoW2ldLCBobm9kZSkKLQkJCXVuaGVscChoLCBtZSk7Ci0JfQorCWZvcl9lYWNoX25ldChuZXQpCisJCV9fbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKG1lLCBuZXQpOwogCXNwaW5fdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYwppbmRleCAxYjEyMjZkLi4yMDYzM2ZkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYwpAQCAtNjgsMTEgKzY4LDIxIEBACiBzdGF0aWMgaW50IHBhcnNlX2RjYyhjaGFyICpkYXRhLCBjb25zdCBjaGFyICpkYXRhX2VuZCwgdV9pbnQzMl90ICppcCwKIAkJICAgICB1X2ludDE2X3QgKnBvcnQsIGNoYXIgKiphZF9iZWdfcCwgY2hhciAqKmFkX2VuZF9wKQogeworCWNoYXIgKnRtcDsKKwogCS8qIGF0IGxlYXN0IDEyOiAiQUFBQUFBQUEgUFwxXG4iICovCiAJd2hpbGUgKCpkYXRhKysgIT0gJyAnKQogCQlpZiAoZGF0YSA+IGRhdGFfZW5kIC0gMTIpCiAJCQlyZXR1cm4gLTE7CiAKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIG5ld2xpbmUgY2hhcmFjdGVyIHdpdGhpbiB0aGUgcGFja2V0IGJvdW5kYXJpZXMKKwkgKiBiZWNhdXNlIHNpbXBsZV9zdHJ0b3VsIHBhcnNlcyB1bnRpbCB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIuICovCisJZm9yICh0bXAgPSBkYXRhOyB0bXAgPD0gZGF0YV9lbmQ7IHRtcCsrKQorCQlpZiAoKnRtcCA9PSAnXG4nKQorCQkJYnJlYWs7CisJaWYgKHRtcCA+IGRhdGFfZW5kIHx8ICp0bXAgIT0gJ1xuJykKKwkJcmV0dXJuIC0xOworCiAJKmFkX2JlZ19wID0gZGF0YTsKIAkqaXAgPSBzaW1wbGVfc3RydG91bChkYXRhLCAmZGF0YSwgMTApOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggYTg3NTIwMy4uMDhlODJkNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJbGFzdCA9IChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewogcmVzdGFydDoKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZuZl9jb25udHJhY2tfaGFzaFtjYi0+YXJnc1swXV0sCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmaW5pdF9uZXQuY3QuaGFzaFtjYi0+YXJnc1swXV0sCiAJCQkJCSBobm9kZSkgewogCQkJaWYgKE5GX0NUX0RJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCiAJCQkJY29udGludWU7CkBAIC02ODksNzEgKzY4OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAotc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHByb3RvbmF0X25sYV9wb2xpY3lbQ1RBX1BST1RPTkFUX01BWCsxXSA9IHsKLQlbQ1RBX1BST1RPTkFUX1BPUlRfTUlOXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCi0JW0NUQV9QUk9UT05BVF9QT1JUX01BWF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAotfTsKLQotc3RhdGljIGludCBuZm5ldGxpbmtfcGFyc2VfbmF0X3Byb3RvKHN0cnVjdCBubGF0dHIgKmF0dHIsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgICBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlzdHJ1Y3QgbmxhdHRyICp0YltDVEFfUFJPVE9OQVRfTUFYKzFdOwotCWNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKm5wdDsKLQlpbnQgZXJyOwotCi0JZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPTkFUX01BWCwgYXR0ciwgcHJvdG9uYXRfbmxhX3BvbGljeSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlucHQgPSBuZl9uYXRfcHJvdG9fZmluZF9nZXQobmZfY3RfcHJvdG9udW0oY3QpKTsKLQlpZiAobnB0LT5ubGF0dHJfdG9fcmFuZ2UpCi0JCWVyciA9IG5wdC0+bmxhdHRyX3RvX3JhbmdlKHRiLCByYW5nZSk7Ci0JbmZfbmF0X3Byb3RvX3B1dChucHQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuYXRfbmxhX3BvbGljeVtDVEFfTkFUX01BWCsxXSA9IHsKLQlbQ1RBX05BVF9NSU5JUF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbQ1RBX05BVF9NQVhJUF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZm5ldGxpbmtfcGFyc2VfbmF0KHN0cnVjdCBubGF0dHIgKm5hdCwKLQkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0Jc3RydWN0IG5sYXR0ciAqdGJbQ1RBX05BVF9NQVgrMV07Ci0JaW50IGVycjsKLQotCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOwotCi0JZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCwgbmF0X25sYV9wb2xpY3kpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKHRiW0NUQV9OQVRfTUlOSVBdKQotCQlyYW5nZS0+bWluX2lwID0gbmxhX2dldF9iZTMyKHRiW0NUQV9OQVRfTUlOSVBdKTsKLQotCWlmICghdGJbQ1RBX05BVF9NQVhJUF0pCi0JCXJhbmdlLT5tYXhfaXAgPSByYW5nZS0+bWluX2lwOwotCWVsc2UKLQkJcmFuZ2UtPm1heF9pcCA9IG5sYV9nZXRfYmUzMih0YltDVEFfTkFUX01BWElQXSk7Ci0KLQlpZiAocmFuZ2UtPm1pbl9pcCkKLQkJcmFuZ2UtPmZsYWdzIHw9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCi0JaWYgKCF0YltDVEFfTkFUX1BST1RPXSkKLQkJcmV0dXJuIDA7Ci0KLQllcnIgPSBuZm5ldGxpbmtfcGFyc2VfbmF0X3Byb3RvKHRiW0NUQV9OQVRfUFJPVE9dLCBjdCwgcmFuZ2UpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19wYXJzZV9oZWxwKHN0cnVjdCBubGF0dHIgKmF0dHIsIGNoYXIgKipoZWxwZXJfbmFtZSkKIHsKQEAgLTc5NCwxNCArNzI5LDE0IEBACiAJCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX1RVUExFX1JFUExZLCB1Myk7CiAJZWxzZSB7CiAJCS8qIEZsdXNoIHRoZSB3aG9sZSB0YWJsZSAqLwotCQluZl9jb25udHJhY2tfZmx1c2goKTsKKwkJbmZfY29ubnRyYWNrX2ZsdXNoKCZpbml0X25ldCk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUpOworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJmluaXRfbmV0LCAmdHVwbGUpOwogCWlmICghaCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTg0Nyw3ICs3ODIsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUpOworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJmluaXRfbmV0LCAmdHVwbGUpOwogCWlmICghaCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTg3OSw2ICs4MTQsMzQgQEAKIH0KIAogc3RhdGljIGludAorY3RuZXRsaW5rX3BhcnNlX25hdF9zZXR1cChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXAsCisJCQkgIHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJdHlwZW9mKG5mbmV0bGlua19wYXJzZV9uYXRfc2V0dXBfaG9vaykgcGFyc2VfbmF0X3NldHVwOworCisJcGFyc2VfbmF0X3NldHVwID0gcmN1X2RlcmVmZXJlbmNlKG5mbmV0bGlua19wYXJzZV9uYXRfc2V0dXBfaG9vayk7CisJaWYgKCFwYXJzZV9uYXRfc2V0dXApIHsKKyNpZmRlZiBDT05GSUdfS01PRAorCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJbmZubF91bmxvY2soKTsKKwkJaWYgKHJlcXVlc3RfbW9kdWxlKCJuZi1uYXQtaXB2NCIpIDwgMCkgeworCQkJbmZubF9sb2NrKCk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwkJbmZubF9sb2NrKCk7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaWYgKG5mbmV0bGlua19wYXJzZV9uYXRfc2V0dXBfaG9vaykKKwkJCXJldHVybiAtRUFHQUlOOworI2VuZGlmCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcGFyc2VfbmF0X3NldHVwKGN0LCBtYW5pcCwgYXR0cik7Cit9CisKK3N0YXRpYyBpbnQKIGN0bmV0bGlua19jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5sYXR0ciAqY2RhW10pCiB7CiAJdW5zaWduZWQgbG9uZyBkOwpAQCAtODk3LDMxICs4NjAsNiBAQAogCQkvKiBBU1NVUkVEIGJpdCBjYW4gb25seSBiZSBzZXQgKi8KIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmIChjZGFbQ1RBX05BVF9TUkNdIHx8IGNkYVtDVEFfTkFUX0RTVF0pIHsKLSNpZm5kZWYgQ09ORklHX05GX05BVF9ORUVERUQKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotI2Vsc2UKLQkJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKLQotCQlpZiAoY2RhW0NUQV9OQVRfRFNUXSkgewotCQkJaWYgKG5mbmV0bGlua19wYXJzZV9uYXQoY2RhW0NUQV9OQVRfRFNUXSwgY3QsCi0JCQkJCQkmcmFuZ2UpIDwgMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsIElQX05BVF9NQU5JUF9EU1QpKQotCQkJCXJldHVybiAtRUVYSVNUOwotCQkJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgSVBfTkFUX01BTklQX0RTVCk7Ci0JCX0KLQkJaWYgKGNkYVtDVEFfTkFUX1NSQ10pIHsKLQkJCWlmIChuZm5ldGxpbmtfcGFyc2VfbmF0KGNkYVtDVEFfTkFUX1NSQ10sIGN0LAotCQkJCQkJJnJhbmdlKSA8IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAobmZfbmF0X2luaXRpYWxpemVkKGN0LCBJUF9OQVRfTUFOSVBfU1JDKSkKLQkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIElQX05BVF9NQU5JUF9TUkMpOwotCQl9Ci0jZW5kaWYKLQl9Ci0KIAkvKiBCZSBjYXJlZnVsIGhlcmUsIG1vZGlmeWluZyBOQVQgYml0cyBjYW4gc2NyZXcgdXAgdGhpbmdzLAogCSAqIHNvIGRvbid0IGxldCB1c2VycyBtb2RpZnkgdGhlbSBkaXJlY3RseSBpZiB0aGV5IGRvbid0IHBhc3MKIAkgKiBuZl9uYXRfcmFuZ2UuICovCkBAIC05MjksNiArODY3LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2N0bmV0bGlua19jaGFuZ2VfbmF0KHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5sYXR0ciAqY2RhW10pCit7CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwlpbnQgcmV0OworCisJaWYgKGNkYVtDVEFfTkFUX0RTVF0pIHsKKwkJcmV0ID0gY3RuZXRsaW5rX3BhcnNlX25hdF9zZXR1cChjdCwKKwkJCQkJCUlQX05BVF9NQU5JUF9EU1QsCisJCQkJCQljZGFbQ1RBX05BVF9EU1RdKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoY2RhW0NUQV9OQVRfU1JDXSkgeworCQlyZXQgPSBjdG5ldGxpbmtfcGFyc2VfbmF0X3NldHVwKGN0LAorCQkJCQkJSVBfTkFUX01BTklQX1NSQywKKwkJCQkJCWNkYVtDVEFfTkFUX1NSQ10pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYKK30KIAogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19jaGFuZ2VfaGVscGVyKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5sYXR0ciAqY2RhW10pCkBAIC0xMTI1LDcgKzEwODgsNyBAQAogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKIAotCWN0ID0gbmZfY29ubnRyYWNrX2FsbG9jKG90dXBsZSwgcnR1cGxlLCBHRlBfS0VSTkVMKTsKKwljdCA9IG5mX2Nvbm50cmFja19hbGxvYygmaW5pdF9uZXQsIG90dXBsZSwgcnR1cGxlLCBHRlBfS0VSTkVMKTsKIAlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTE1Nyw2ICsxMTIwLDE0IEBACiAJCX0KIAl9CiAKKwlpZiAoY2RhW0NUQV9OQVRfU1JDXSB8fCBjZGFbQ1RBX05BVF9EU1RdKSB7CisJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfbmF0KGN0LCBjZGEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwogCWlmIChjZGFbQ1RBX1BST1RPSU5GT10pIHsKIAkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oY3QsIGNkYSk7CiAJCWlmIChlcnIgPCAwKSB7CkBAIC0xMjEzLDkgKzExODQsOSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJaWYgKGNkYVtDVEFfVFVQTEVfT1JJR10pCi0JCWggPSBfX25mX2Nvbm50cmFja19maW5kKCZvdHVwbGUpOworCQloID0gX19uZl9jb25udHJhY2tfZmluZCgmaW5pdF9uZXQsICZvdHVwbGUpOwogCWVsc2UgaWYgKGNkYVtDVEFfVFVQTEVfUkVQTFldKQotCQloID0gX19uZl9jb25udHJhY2tfZmluZCgmcnR1cGxlKTsKKwkJaCA9IF9fbmZfY29ubnRyYWNrX2ZpbmQoJmluaXRfbmV0LCAmcnR1cGxlKTsKIAogCWlmIChoID09IE5VTEwpIHsKIAkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBtYXN0ZXI7CkBAIC0xMjMwLDcgKzEyMDEsNyBAQAogCQkJaWYgKGVyciA8IDApCiAJCQkJZ290byBvdXRfdW5sb2NrOwogCi0JCQltYXN0ZXJfaCA9IF9fbmZfY29ubnRyYWNrX2ZpbmQoJm1hc3Rlcik7CisJCQltYXN0ZXJfaCA9IF9fbmZfY29ubnRyYWNrX2ZpbmQoJmluaXRfbmV0LCAmbWFzdGVyKTsKIAkJCWlmIChtYXN0ZXJfaCA9PSBOVUxMKSB7CiAJCQkJZXJyID0gLUVOT0VOVDsKIAkJCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xNDU4LDYgKzE0MjksNyBAQAogc3RhdGljIGludAogY3RuZXRsaW5rX2V4cF9kdW1wX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSAmaW5pdF9uZXQ7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKmxhc3Q7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CkBAIC0xNDY3LDcgKzE0MzksNyBAQAogCWxhc3QgPSAoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKiljYi0+YXJnc1sxXTsKIAlmb3IgKDsgY2ItPmFyZ3NbMF0gPCBuZl9jdF9leHBlY3RfaHNpemU7IGNiLT5hcmdzWzBdKyspIHsKIHJlc3RhcnQ6Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGV4cCwgbiwgJm5mX2N0X2V4cGVjdF9oYXNoW2NiLT5hcmdzWzBdXSwKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZXhwLCBuLCAmbmV0LT5jdC5leHBlY3RfaGFzaFtjYi0+YXJnc1swXV0sCiAJCQkJICAgICBobm9kZSkgewogCQkJaWYgKGwzcHJvdG8gJiYgZXhwLT50dXBsZS5zcmMubDNudW0gIT0gbDNwcm90bykKIAkJCQljb250aW51ZTsKQEAgLTE1MjksNyArMTUwMSw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlleHAgPSBuZl9jdF9leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKKwlleHAgPSBuZl9jdF9leHBlY3RfZmluZF9nZXQoJmluaXRfbmV0LCAmdHVwbGUpOwogCWlmICghZXhwKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTU4Myw3ICsxNTU1LDcgQEAKIAkJCXJldHVybiBlcnI7CiAKIAkJLyogYnVtcCB1c2FnZSBjb3VudCB0byAyICovCi0JCWV4cCA9IG5mX2N0X2V4cGVjdF9maW5kX2dldCgmdHVwbGUpOworCQlleHAgPSBuZl9jdF9leHBlY3RfZmluZF9nZXQoJmluaXRfbmV0LCAmdHVwbGUpOwogCQlpZiAoIWV4cCkKIAkJCXJldHVybiAtRU5PRU5UOwogCkBAIC0xNjEzLDcgKzE1ODUsNyBAQAogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBuZl9jdF9leHBlY3RfaHNpemU7IGkrKykgewogCQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIG4sIG5leHQsCi0JCQkJCQkgICZuZl9jdF9leHBlY3RfaGFzaFtpXSwKKwkJCQkJCSAgJmluaXRfbmV0LmN0LmV4cGVjdF9oYXNoW2ldLAogCQkJCQkJICBobm9kZSkgewogCQkJCW1faGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7CiAJCQkJaWYgKG1faGVscC0+aGVscGVyID09IGgKQEAgLTE2MjksNyArMTYwMSw3IEBACiAJCXNwaW5fbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCQlmb3IgKGkgPSAwOyBpIDwgbmZfY3RfZXhwZWN0X2hzaXplOyBpKyspIHsKIAkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXhwLCBuLCBuZXh0LAotCQkJCQkJICAmbmZfY3RfZXhwZWN0X2hhc2hbaV0sCisJCQkJCQkgICZpbml0X25ldC5jdC5leHBlY3RfaGFzaFtpXSwKIAkJCQkJCSAgaG5vZGUpIHsKIAkJCQlpZiAoZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7CiAJCQkJCW5mX2N0X3VubGlua19leHBlY3QoZXhwKTsKQEAgLTE2NzAsNyArMTY0Miw3IEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBMb29rIGZvciBtYXN0ZXIgY29ubnRyYWNrIG9mIHRoaXMgZXhwZWN0YXRpb24gKi8KLQloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KCZtYXN0ZXJfdHVwbGUpOworCWggPSBuZl9jb25udHJhY2tfZmluZF9nZXQoJmluaXRfbmV0LCAmbWFzdGVyX3R1cGxlKTsKIAlpZiAoIWgpCiAJCXJldHVybiAtRU5PRU5UOwogCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKQEAgLTE3MjQsNyArMTY5Niw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlzcGluX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlleHAgPSBfX25mX2N0X2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJZXhwID0gX19uZl9jdF9leHBlY3RfZmluZCgmaW5pdF9uZXQsICZ0dXBsZSk7CiAKIAlpZiAoIWV4cCkgewogCQlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDk3ZTU0YjAuLjFiYzMwMDEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pOwogCi0jaWZkZWYgREVCVUcKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRykKIC8qIFBwdHBDb250cm9sTWVzc2FnZVR5cGUgbmFtZXMgKi8KIGNvbnN0IGNoYXIgKmNvbnN0IHBwdHBfbXNnX25hbWVbXSA9IHsKIAkiVU5LTk9XTl9NRVNTQUdFIiwKQEAgLTk4LDYgKzk4LDcgQEAKIHN0YXRpYyB2b2lkIHBwdHBfZXhwZWN0Zm4oc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAl0eXBlb2YobmZfbmF0X3BwdHBfaG9va19leHBlY3RmbikgbmZfbmF0X3BwdHBfZXhwZWN0Zm47CiAJcHJfZGVidWcoImluY3JlYXNpbmcgdGltZW91dHNcbiIpOwogCkBAIC0xMjEsNyArMTIyLDcgQEAKIAkJcHJfZGVidWcoInRyeWluZyB0byB1bmV4cGVjdCBvdGhlciBkaXI6ICIpOwogCQluZl9jdF9kdW1wX3R1cGxlKCZpbnZfdCk7CiAKLQkJZXhwX290aGVyID0gbmZfY3RfZXhwZWN0X2ZpbmRfZ2V0KCZpbnZfdCk7CisJCWV4cF9vdGhlciA9IG5mX2N0X2V4cGVjdF9maW5kX2dldChuZXQsICZpbnZfdCk7CiAJCWlmIChleHBfb3RoZXIpIHsKIAkJCS8qIGRlbGV0ZSBvdGhlciBleHBlY3RhdGlvbi4gICovCiAJCQlwcl9kZWJ1ZygiZm91bmRcbiIpOwpAQCAtMTM0LDcgKzEzNSw4IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyBpbnQgZGVzdHJveV9zaWJsaW5nX29yX2V4cChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KQorc3RhdGljIGludCBkZXN0cm95X3NpYmxpbmdfb3JfZXhwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCiB7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CkBAIC0xNDMsNyArMTQ1LDcgQEAKIAlwcl9kZWJ1ZygidHJ5aW5nIHRvIHRpbWVvdXQgY3Qgb3IgZXhwIGZvciB0dXBsZSAiKTsKIAluZl9jdF9kdW1wX3R1cGxlKHQpOwogCi0JaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCh0KTsKKwloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KG5ldCwgdCk7CiAJaWYgKGgpICB7CiAJCXNpYmxpbmcgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCQlwcl9kZWJ1Zygic2V0dGluZyB0aW1lb3V0IG9mIGNvbm50cmFjayAlcCB0byAwXG4iLCBzaWJsaW5nKTsKQEAgLTE1NCw3ICsxNTYsNyBAQAogCQluZl9jdF9wdXQoc2libGluZyk7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7Ci0JCWV4cCA9IG5mX2N0X2V4cGVjdF9maW5kX2dldCh0KTsKKwkJZXhwID0gbmZfY3RfZXhwZWN0X2ZpbmRfZ2V0KG5ldCwgdCk7CiAJCWlmIChleHApIHsKIAkJCXByX2RlYnVnKCJ1bmV4cGVjdF9yZWxhdGVkIG9mIGV4cGVjdCAlcFxuIiwgZXhwKTsKIAkJCW5mX2N0X3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKQEAgLTE2OCw2ICsxNzAsNyBAQAogLyogdGltZW91dCBHUkUgZGF0YSBjb25uZWN0aW9ucyAqLwogc3RhdGljIHZvaWQgcHB0cF9kZXN0cm95X3NpYmxpbmdzKHN0cnVjdCBuZl9jb25uICpjdCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCWNvbnN0IHN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdDsKIApAQCAtMTc4LDcgKzE4MSw3IEBACiAJdC5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKIAl0LnNyYy51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKIAl0LmRzdC51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKLQlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQorCWlmICghZGVzdHJveV9zaWJsaW5nX29yX2V4cChuZXQsICZ0KSkKIAkJcHJfZGVidWcoImZhaWxlZCB0byB0aW1lb3V0IG9yaWdpbmFsIHBucy0+cGFjIGN0L2V4cFxuIik7CiAKIAkvKiB0cnkgcmVwbHkgKHBhYy0+cG5zKSB0dXBsZSAqLwpAQCAtMTg2LDcgKzE4OSw3IEBACiAJdC5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKIAl0LnNyYy51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKIAl0LmRzdC51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKLQlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQorCWlmICghZGVzdHJveV9zaWJsaW5nX29yX2V4cChuZXQsICZ0KSkKIAkJcHJfZGVidWcoImZhaWxlZCB0byB0aW1lb3V0IHJlcGx5IHBhYy0+cG5zIGN0L2V4cFxuIik7CiB9CiAKQEAgLTU5NCwxNSArNTk3LDMyIEBACiAJLmV4cGVjdF9wb2xpY3kJCT0gJnBwdHBfZXhwX3BvbGljeSwKIH07CiAKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19wcHRwX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwluZl9jdF9ncmVfa2V5bWFwX2ZsdXNoKG5ldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgbmZfY29ubnRyYWNrX3BwdHBfbmV0X29wcyA9IHsKKwkuZXhpdCA9IG5mX2Nvbm50cmFja19wcHRwX25ldF9leGl0LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX3BwdHBfaW5pdCh2b2lkKQogewotCXJldHVybiBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZwcHRwKTsKKwlpbnQgcnY7CisKKwlydiA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnBwdHApOworCWlmIChydiA8IDApCisJCXJldHVybiBydjsKKwlydiA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX2Nvbm50cmFja19wcHRwX25ldF9vcHMpOworCWlmIChydiA8IDApCisJCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmcHB0cCk7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX3BwdHBfZmluaSh2b2lkKQogewogCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmcHB0cCk7Ci0JbmZfY3RfZ3JlX2tleW1hcF9mbHVzaCgpOworCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfY29ubnRyYWNrX3BwdHBfbmV0X29wcyk7CiB9CiAKIG1vZHVsZV9pbml0KG5mX2Nvbm50cmFja19wcHRwX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKaW5kZXggYTQ5ZmM5My4uYTU5YTMwNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCkBAIC0yMDcsNiArMjA3LDggQEAKIAogdm9pZCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pCiB7CisJc3RydWN0IG5ldCAqbmV0OworCiAJQlVHX09OKHByb3RvLT5sM3Byb3RvID49IEFGX01BWCk7CiAKIAltdXRleF9sb2NrKCZuZl9jdF9wcm90b19tdXRleCk7CkBAIC0yMTksNyArMjIxLDggQEAKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLwotCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2wzcHJvdG8sIHByb3RvKTsKKwlmb3JfZWFjaF9uZXQobmV0KQorCQluZl9jdF9pdGVyYXRlX2NsZWFudXAobmV0LCBraWxsX2wzcHJvdG8sIHByb3RvKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIpOwogCkBAIC0zMTYsNiArMzE5LDggQEAKIAogdm9pZCBuZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQ7CisKIAlCVUdfT04obDRwcm90by0+bDNwcm90byA+PSBQRl9NQVgpOwogCiAJbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOwpAQCAtMzI4LDcgKzMzMyw4IEBACiAJc3luY2hyb25pemVfcmN1KCk7CiAKIAkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KLQluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9sNHByb3RvLCBsNHByb3RvKTsKKwlmb3JfZWFjaF9uZXQobmV0KQorCQluZl9jdF9pdGVyYXRlX2NsZWFudXAobmV0LCBraWxsX2w0cHJvdG8sIGw0cHJvdG8pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYwppbmRleCBlNzg2NmRkLi44ZmNmMTc2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19kY2NwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZGNjcC5jCkBAIC00MTgsNiArNDE4LDcgQEAKIHN0YXRpYyBib29sIGRjY3BfbmV3KHN0cnVjdCBuZl9jb25uICpjdCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZikKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBkY2NwX2hkciBfZGgsICpkaDsKIAljb25zdCBjaGFyICptc2c7CiAJdV9pbnQ4X3Qgc3RhdGU7CkBAIC00NDUsNyArNDQ2LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIAogb3V0X2ludmFsaWQ6Ci0JaWYgKExPR19JTlZBTElEKElQUFJPVE9fRENDUCkpCisJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19EQ0NQKSkKIAkJbmZfbG9nX3BhY2tldChuZl9jdF9sM251bShjdCksIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwgbXNnKTsKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC00NjEsOCArNDYyLDkgQEAKIAogc3RhdGljIGludCBkY2NwX3BhY2tldChzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICBpbnQgcGYsIHVuc2lnbmVkIGludCBob29rbnVtKQorCQkgICAgICAgdV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rbnVtKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAlzdHJ1Y3QgZGNjcF9oZHIgX2RoLCAqZGg7CiAJdV9pbnQ4X3QgdHlwZSwgb2xkX3N0YXRlLCBuZXdfc3RhdGU7CkBAIC01MjQsMTMgKzUyNiwxMyBAQAogCQljdC0+cHJvdG8uZGNjcC5sYXN0X3BrdCA9IHR5cGU7CiAKIAkJd3JpdGVfdW5sb2NrX2JoKCZkY2NwX2xvY2spOwotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19EQ0NQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19EQ0NQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfZGNjcDogaW52YWxpZCBwYWNrZXQgaWdub3JlZCAiKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAljYXNlIENUX0RDQ1BfSU5WQUxJRDoKIAkJd3JpdGVfdW5sb2NrX2JoKCZkY2NwX2xvY2spOwotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19EQ0NQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19EQ0NQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfZGNjcDogaW52YWxpZCBzdGF0ZSB0cmFuc2l0aW9uICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKQEAgLTU0NSw5ICs1NDcsOSBAQAogCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKLXN0YXRpYyBpbnQgZGNjcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLCBpbnQgcGYsCi0JCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQorc3RhdGljIGludCBkY2NwX2Vycm9yKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKKwkJICAgICAgdV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCXN0cnVjdCBkY2NwX2hkciBfZGgsICpkaDsKIAl1bnNpZ25lZCBpbnQgZGNjcF9sZW4gPSBza2ItPmxlbiAtIGRhdGFvZmY7CkBAIC01NzUsNyArNTc3LDcgQEAKIAkJfQogCX0KIAotCWlmIChuZl9jb25udHJhY2tfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HICYmCisJaWYgKG5ldC0+Y3Quc3lzY3RsX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyAmJgogCSAgICBuZl9jaGVja3N1bV9wYXJ0aWFsKHNrYiwgaG9va251bSwgZGF0YW9mZiwgY3Njb3YsIElQUFJPVE9fRENDUCwKIAkJCQlwZikpIHsKIAkJbXNnID0gIm5mX2N0X2RjY3A6IGJhZCBjaGVja3N1bSAiOwpAQCAtNTkwLDcgKzU5Miw3IEBACiAJcmV0dXJuIE5GX0FDQ0VQVDsKIAogb3V0X2ludmFsaWQ6Ci0JaWYgKExPR19JTlZBTElEKElQUFJPVE9fRENDUCkpCisJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19EQ0NQKSkKIAkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLCBtc2cpOwogCXJldHVybiAtTkZfQUNDRVBUOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmluZGV4IGUzMWIwZTcuLmRiZTY4MGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgIGludCBwZiwKKwkJICB1X2ludDhfdCBwZiwKIAkJICB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAluZl9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLCBuZl9jdF9nZW5lcmljX3RpbWVvdXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuYwppbmRleCA2NTRhNGY3Li5hMmNkYmNiIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuYwpAQCAtMjksOCArMjksMTEgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgpAQCAtNDAsMTkgKzQzLDIzIEBACiAjZGVmaW5lIEdSRV9USU1FT1VUCQkoMzAgKiBIWikKICNkZWZpbmUgR1JFX1NUUkVBTV9USU1FT1VUCSgxODAgKiBIWikKIAotc3RhdGljIERFRklORV9SV0xPQ0sobmZfY3RfZ3JlX2xvY2spOwotc3RhdGljIExJU1RfSEVBRChncmVfa2V5bWFwX2xpc3QpOworc3RhdGljIGludCBwcm90b19ncmVfbmV0X2lkOworc3RydWN0IG5ldG5zX3Byb3RvX2dyZSB7CisJcndsb2NrX3QJCWtleW1hcF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJa2V5bWFwX2xpc3Q7Cit9OwogCi12b2lkIG5mX2N0X2dyZV9rZXltYXBfZmx1c2godm9pZCkKK3ZvaWQgbmZfY3RfZ3JlX2tleW1hcF9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKKwlzdHJ1Y3QgbmV0bnNfcHJvdG9fZ3JlICpuZXRfZ3JlID0gbmV0X2dlbmVyaWMobmV0LCBwcm90b19ncmVfbmV0X2lkKTsKKwlzdHJ1Y3QgbmZfY3RfZ3JlX2tleW1hcCAqa20sICp0bXA7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmdyZV9rZXltYXBfbGlzdCkgewotCQlsaXN0X2RlbChwb3MpOwotCQlrZnJlZShwb3MpOworCXdyaXRlX2xvY2tfYmgoJm5ldF9ncmUtPmtleW1hcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoa20sIHRtcCwgJm5ldF9ncmUtPmtleW1hcF9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZrbS0+bGlzdCk7CisJCWtmcmVlKGttKTsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZuZXRfZ3JlLT5rZXltYXBfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX2N0X2dyZV9rZXltYXBfZmx1c2gpOwogCkBAIC02NywxOSArNzQsMjAgQEAKIH0KIAogLyogbG9vayB1cCB0aGUgc291cmNlIGtleSBmb3IgYSBnaXZlbiB0dXBsZSAqLwotc3RhdGljIF9fYmUxNiBncmVfa2V5bWFwX2xvb2t1cChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KQorc3RhdGljIF9fYmUxNiBncmVfa2V5bWFwX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCiB7CisJc3RydWN0IG5ldG5zX3Byb3RvX2dyZSAqbmV0X2dyZSA9IG5ldF9nZW5lcmljKG5ldCwgcHJvdG9fZ3JlX25ldF9pZCk7CiAJc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKmttOwogCV9fYmUxNiBrZXkgPSAwOwogCi0JcmVhZF9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJmdyZV9rZXltYXBfbGlzdCwgbGlzdCkgeworCXJlYWRfbG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa20sICZuZXRfZ3JlLT5rZXltYXBfbGlzdCwgbGlzdCkgewogCQlpZiAoZ3JlX2tleV9jbXBmbihrbSwgdCkpIHsKIAkJCWtleSA9IGttLT50dXBsZS5zcmMudS5ncmUua2V5OwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcmVhZF91bmxvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKwlyZWFkX3VubG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOwogCiAJcHJfZGVidWcoImxvb2t1cCBzcmMga2V5IDB4JXggZm9yICIsIGtleSk7CiAJbmZfY3RfZHVtcF90dXBsZSh0KTsKQEAgLTkxLDE2ICs5OSwyMiBAQAogaW50IG5mX2N0X2dyZV9rZXltYXBfYWRkKHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwKIAkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CisJc3RydWN0IG5ldG5zX3Byb3RvX2dyZSAqbmV0X2dyZSA9IG5ldF9nZW5lcmljKG5ldCwgcHJvdG9fZ3JlX25ldF9pZCk7CiAJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CiAJc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKiprbXAsICprbTsKIAogCWttcCA9ICZoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBbZGlyXTsKIAlpZiAoKmttcCkgewogCQkvKiBjaGVjayB3aGV0aGVyIGl0J3MgYSByZXRyYW5zbWlzc2lvbiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGttLCAmZ3JlX2tleW1hcF9saXN0LCBsaXN0KSB7Ci0JCQlpZiAoZ3JlX2tleV9jbXBmbihrbSwgdCkgJiYga20gPT0gKmttcCkKKwkJcmVhZF9sb2NrX2JoKCZuZXRfZ3JlLT5rZXltYXBfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa20sICZuZXRfZ3JlLT5rZXltYXBfbGlzdCwgbGlzdCkgeworCQkJaWYgKGdyZV9rZXlfY21wZm4oa20sIHQpICYmIGttID09ICprbXApIHsKKwkJCQlyZWFkX3VubG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOwogCQkJCXJldHVybiAwOworCQkJfQogCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZuZXRfZ3JlLT5rZXltYXBfbG9jayk7CiAJCXByX2RlYnVnKCJ0cnlpbmcgdG8gb3ZlcnJpZGUga2V5bWFwXyVzIGZvciBjdCAlcFxuIiwKIAkJCSBkaXIgPT0gSVBfQ1RfRElSX1JFUExZID8gInJlcGx5IiA6ICJvcmlnIiwgY3QpOwogCQlyZXR1cm4gLUVFWElTVDsKQEAgLTExNSw5ICsxMjksOSBAQAogCXByX2RlYnVnKCJhZGRpbmcgbmV3IGVudHJ5ICVwOiAiLCBrbSk7CiAJbmZfY3RfZHVtcF90dXBsZSgma20tPnR1cGxlKTsKIAotCXdyaXRlX2xvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZrbS0+bGlzdCwgJmdyZV9rZXltYXBfbGlzdCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmttLT5saXN0LCAmbmV0X2dyZS0+a2V5bWFwX2xpc3QpOworCXdyaXRlX3VubG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjYsMTIgKzE0MCwxNCBAQAogLyogZGVzdHJveSB0aGUga2V5bWFwIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBtYXN0ZXIgY3QgKi8KIHZvaWQgbmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KHN0cnVjdCBuZl9jb25uICpjdCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOworCXN0cnVjdCBuZXRuc19wcm90b19ncmUgKm5ldF9ncmUgPSBuZXRfZ2VuZXJpYyhuZXQsIHByb3RvX2dyZV9uZXRfaWQpOwogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7CiAKIAlwcl9kZWJ1ZygiZW50ZXJpbmcgZm9yIGN0ICVwXG4iLCBjdCk7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOwogCWZvciAoZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOyBkaXIgPCBJUF9DVF9ESVJfTUFYOyBkaXIrKykgewogCQlpZiAoaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl0pIHsKIAkJCXByX2RlYnVnKCJyZW1vdmluZyAlcCBmcm9tIGxpc3RcbiIsCkBAIC0xNDEsNyArMTU3LDcgQEAKIAkJCWhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcFtkaXJdID0gTlVMTDsKIAkJfQogCX0KLQl3cml0ZV91bmxvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJm5ldF9ncmUtPmtleW1hcF9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2dyZV9rZXltYXBfZGVzdHJveSk7CiAKQEAgLTE2MCw2ICsxNzYsNyBAQAogc3RhdGljIGJvb2wgZ3JlX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKIAkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldiA/IHNrYi0+ZGV2IDogc2tiLT5kc3QtPmRldik7CiAJY29uc3Qgc3RydWN0IGdyZV9oZHJfcHB0cCAqcGdyZWhkcjsKIAlzdHJ1Y3QgZ3JlX2hkcl9wcHRwIF9wZ3JlaGRyOwogCV9fYmUxNiBzcmNrZXk7CkBAIC0xODYsNyArMjAzLDcgQEAKIAl9CiAKIAl0dXBsZS0+ZHN0LnUuZ3JlLmtleSA9IHBncmVoZHItPmNhbGxfaWQ7Ci0Jc3Jja2V5ID0gZ3JlX2tleW1hcF9sb29rdXAodHVwbGUpOworCXNyY2tleSA9IGdyZV9rZXltYXBfbG9va3VwKG5ldCwgdHVwbGUpOwogCXR1cGxlLT5zcmMudS5ncmUua2V5ID0gc3Jja2V5OwogCiAJcmV0dXJuIHRydWU7CkBAIC0yMTUsNyArMjMyLDcgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICBpbnQgcGYsCisJCSAgICAgIHVfaW50OF90IHBmLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAkvKiBJZiB3ZSd2ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzLCB0aGlzIGlzIGEgR1JFIGNvbm5lY3Rpb24uCkBAIC0yMjUsNyArMjQyLDcgQEAKIAkJCQkgICBjdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0KTsKIAkJLyogQWxzbywgbW9yZSBsaWtlbHkgdG8gYmUgaW1wb3J0YW50LCBhbmQgbm90IGEgcHJvYmUuICovCiAJCXNldF9iaXQoSVBTX0FTU1VSRURfQklULCAmY3QtPnN0YXR1cyk7Ci0JCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1NUQVRVUywgc2tiKTsKKwkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBjdCk7CiAJfSBlbHNlCiAJCW5mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsCiAJCQkJICAgY3QtPnByb3RvLmdyZS50aW1lb3V0KTsKQEAgLTI4MSwxNSArMjk4LDUzIEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyBpbnQgcHJvdG9fZ3JlX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgbmV0bnNfcHJvdG9fZ3JlICpuZXRfZ3JlOworCWludCBydjsKKworCW5ldF9ncmUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0bnNfcHJvdG9fZ3JlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXRfZ3JlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyd2xvY2tfaW5pdCgmbmV0X2dyZS0+a2V5bWFwX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZuZXRfZ3JlLT5rZXltYXBfbGlzdCk7CisKKwlydiA9IG5ldF9hc3NpZ25fZ2VuZXJpYyhuZXQsIHByb3RvX2dyZV9uZXRfaWQsIG5ldF9ncmUpOworCWlmIChydiA8IDApCisJCWtmcmVlKG5ldF9ncmUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgcHJvdG9fZ3JlX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgbmV0bnNfcHJvdG9fZ3JlICpuZXRfZ3JlID0gbmV0X2dlbmVyaWMobmV0LCBwcm90b19ncmVfbmV0X2lkKTsKKworCW5mX2N0X2dyZV9rZXltYXBfZmx1c2gobmV0KTsKKwlrZnJlZShuZXRfZ3JlKTsKK30KKworc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBwcm90b19ncmVfbmV0X29wcyA9IHsKKwkuaW5pdCA9IHByb3RvX2dyZV9uZXRfaW5pdCwKKwkuZXhpdCA9IHByb3RvX2dyZV9uZXRfZXhpdCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG5mX2N0X3Byb3RvX2dyZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19ncmU0KTsKKwlpbnQgcnY7CisKKwlydiA9IG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19ncmU0KTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJcnYgPSByZWdpc3Rlcl9wZXJuZXRfZ2VuX2RldmljZSgmcHJvdG9fZ3JlX25ldF9pZCwgJnByb3RvX2dyZV9uZXRfb3BzKTsKKwlpZiAocnYgPCAwKQorCQluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19ncmU0KTsKKwlyZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyB2b2lkIG5mX2N0X3Byb3RvX2dyZV9maW5pKHZvaWQpCiB7CiAJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ3JlNCk7Ci0JbmZfY3RfZ3JlX2tleW1hcF9mbHVzaCgpOworCXVucmVnaXN0ZXJfcGVybmV0X2dlbl9kZXZpY2UocHJvdG9fZ3JlX25ldF9pZCwgJnByb3RvX2dyZV9uZXRfb3BzKTsKIH0KIAogbW9kdWxlX2luaXQobmZfY3RfcHJvdG9fZ3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDMwYWE1YjkuLmFlOGMyNjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTI4Nyw3ICsyODcsNyBAQAogCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICBpbnQgcGYsCisJCSAgICAgICB1X2ludDhfdCBwZiwKIAkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCWVudW0gc2N0cF9jb25udHJhY2sgbmV3X3N0YXRlLCBvbGRfc3RhdGU7CkBAIC0zNjksNyArMzY5LDcgQEAKIAogCQljdC0+cHJvdG8uc2N0cC5zdGF0ZSA9IG5ld19zdGF0ZTsKIAkJaWYgKG9sZF9zdGF0ZSAhPSBuZXdfc3RhdGUpCi0JCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk8sIHNrYik7CisJCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk8sIGN0KTsKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwogCkBAIC0zODAsNyArMzgwLDcgQEAKIAkgICAgbmV3X3N0YXRlID09IFNDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVEKSB7CiAJCXByX2RlYnVnKCJTZXR0aW5nIGFzc3VyZWQgYml0XG4iKTsKIAkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKTsKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIGN0KTsKIAl9CiAKIAlyZXR1cm4gTkZfQUNDRVBUOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCA2ZjYxMjYxLi5mOTQ3ZWM0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtNDg2LDggKzQ4Niw5IEBACiAJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkJICBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0Y3BoLAotCQkJICBpbnQgcGYpCisJCQkgIHVfaW50OF90IHBmKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSAqc2VuZGVyID0gJnN0YXRlLT5zZWVuW2Rpcl07CiAJc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSAqcmVjZWl2ZXIgPSAmc3RhdGUtPnNlZW5bIWRpcl07CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOwpAQCAtNjY4LDcgKzY2OSw3IEBACiAJCWlmIChzZW5kZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTCB8fAogCQkgICAgbmZfY3RfdGNwX2JlX2xpYmVyYWwpCiAJCQlyZXMgPSB0cnVlOwotCQlpZiAoIXJlcyAmJiBMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCWlmICghcmVzICYmIExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJIm5mX2N0X3RjcDogJXMgIiwKIAkJCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgPwpAQCAtNzQ2LDEwICs3NDcsMTEgQEAKIH07CiAKIC8qIFByb3RlY3QgY29ubnRyYWNrIGFnYWlzdCBicm9rZW4gcGFja2V0cy4gQ29kZSB0YWtlbiBmcm9tIGlwdF91bmNsZWFuLmMuICAqLwotc3RhdGljIGludCB0Y3BfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBpbnQgdGNwX2Vycm9yKHN0cnVjdCBuZXQgKm5ldCwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKLQkJICAgICBpbnQgcGYsCisJCSAgICAgdV9pbnQ4X3QgcGYsCiAJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqdGg7CkBAIC03NjAsNyArNzYyLDcgQEAKIAkvKiBTbWFsbGVyIHRoYXQgbWluaW1hbCBUQ1AgaGVhZGVyPyAqLwogCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQorCQlpZiAoTE9HX0lOVkFMSUQobmV0LCBJUFBST1RPX1RDUCkpCiAJCQluZl9sb2dfcGFja2V0KHBmLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCQkJIm5mX2N0X3RjcDogc2hvcnQgcGFja2V0ICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKQEAgLTc2OCw3ICs3NzAsNyBAQAogCiAJLyogTm90IHdob2xlIFRDUCBoZWFkZXIgb3IgbWFsZm9ybWVkIHBhY2tldCAqLwogCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIHx8IHRjcGxlbiA8IHRoLT5kb2ZmKjQpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCSJuZl9jdF90Y3A6IHRydW5jYXRlZC9tYWxmb3JtZWQgcGFja2V0ICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKQEAgLTc3OSw5ICs3ODEsOSBAQAogCSAqIGJlY2F1c2UgdGhlIGNoZWNrc3VtIGlzIGFzc3VtZWQgdG8gYmUgY29ycmVjdC4KIAkgKi8KIAkvKiBGSVhNRTogU291cmNlIHJvdXRlIElQIG9wdGlvbiBwYWNrZXRzIC0tUlIgKi8KLQlpZiAobmZfY29ubnRyYWNrX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyAmJgorCWlmIChuZXQtPmN0LnN5c2N0bF9jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgJiYKIAkgICAgbmZfY2hlY2tzdW0oc2tiLCBob29rbnVtLCBkYXRhb2ZmLCBJUFBST1RPX1RDUCwgcGYpKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fVENQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICJuZl9jdF90Y3A6IGJhZCBUQ1AgY2hlY2tzdW0gIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwpAQCAtNzkwLDcgKzc5Miw3IEBACiAJLyogQ2hlY2sgVENQIGZsYWdzLiAqLwogCXRjcGZsYWdzID0gKCgodV9pbnQ4X3QgKil0aClbMTNdICYgfihUSF9FQ0V8VEhfQ1dSfFRIX1BVU0gpKTsKIAlpZiAoIXRjcF92YWxpZF9mbGFnc1t0Y3BmbGFnc10pIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCSAgIm5mX2N0X3RjcDogaW52YWxpZCBUQ1AgZmxhZyBjb21iaW5hdGlvbiAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CkBAIC04MDQsOSArODA2LDEwIEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgaW50IHBmLAorCQkgICAgICB1X2ludDhfdCBwZiwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZTsKIAllbnVtIHRjcF9jb25udHJhY2sgbmV3X3N0YXRlLCBvbGRfc3RhdGU7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKQEAgLTg4NSw3ICs4ODgsNyBAQAogCQkJICogdGh1cyBpbml0aWF0ZSBhIGNsZWFuIG5ldyBzZXNzaW9uLgogCQkJICovCiAJCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCQlpZiAoTE9HX0lOVkFMSUQobmV0LCBJUFBST1RPX1RDUCkpCiAJCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCQkgICJuZl9jdF90Y3A6IGtpbGxpbmcgb3V0IG9mIHN5bmMgc2Vzc2lvbiAiKTsKIAkJCW5mX2N0X2tpbGwoY3QpOwpAQCAtODk4LDcgKzkwMSw3IEBACiAJCSAgICBzZWdtZW50X3NlcV9wbHVzX2xlbihudG9obCh0aC0+c2VxKSwgc2tiLT5sZW4sIGRhdGFvZmYsIHRoKTsKIAogCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19UQ1ApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCSAgIm5mX2N0X3RjcDogaW52YWxpZCBwYWNrZXQgaWdub3JlZCAiKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTkwNyw3ICs5MTAsNyBAQAogCQlwcl9kZWJ1ZygibmZfY3RfdGNwOiBJbnZhbGlkIGRpcj0laSBpbmRleD0ldSBvc3RhdGU9JXVcbiIsCiAJCQkgZGlyLCBnZXRfY29ubnRyYWNrX2luZGV4KHRoKSwgb2xkX3N0YXRlKTsKIAkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fVENQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICJuZl9jdF90Y3A6IGludmFsaWQgc3RhdGUgIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwpAQCAtOTY4LDkgKzk3MSw5IEBACiAJCXRpbWVvdXQgPSB0Y3BfdGltZW91dHNbbmV3X3N0YXRlXTsKIAl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKIAotCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GT19WT0xBVElMRSwgc2tiKTsKKwluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUsIGN0KTsKIAlpZiAobmV3X3N0YXRlICE9IG9sZF9zdGF0ZSkKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUFJPVE9JTkZPLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk8sIGN0KTsKIAogCWlmICghdGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cykpIHsKIAkJLyogSWYgb25seSByZXBseSBpcyBhIFJTVCwgd2UgY2FuIGNvbnNpZGVyIG91cnNlbHZlcyBub3QgdG8KQEAgLTk4OSw3ICs5OTIsNyBAQAogCQkgICBhZnRlciBTWU5fUkVDViBvciBhIHZhbGlkIGFuc3dlciBmb3IgYSBwaWNrZWQgdXAKIAkJICAgY29ubmVjdGlvbi4gKi8KIAkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKTsKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIGN0KTsKIAl9CiAJbmZfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIHNrYiwgdGltZW91dCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKaW5kZXggOGIyMTc2Mi4uN2MyY2E0OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICBpbnQgcGYsCisJCSAgICAgIHVfaW50OF90IHBmLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAkvKiBJZiB3ZSd2ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzLCB0aGlzIGlzIHNvbWUga2luZCBvZiBVRFAKQEAgLTc1LDcgKzc1LDcgQEAKIAkJbmZfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIHNrYiwgbmZfY3RfdWRwX3RpbWVvdXRfc3RyZWFtKTsKIAkJLyogQWxzbywgbW9yZSBsaWtlbHkgdG8gYmUgaW1wb3J0YW50LCBhbmQgbm90IGEgcHJvYmUgKi8KIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpKQotCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBjdCk7CiAJfSBlbHNlCiAJCW5mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIG5mX2N0X3VkcF90aW1lb3V0KTsKIApAQCAtODksOSArODksOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHVkcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKK3N0YXRpYyBpbnQgdWRwX2Vycm9yKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAotCQkgICAgIGludCBwZiwKKwkJICAgICB1X2ludDhfdCBwZiwKIAkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAl1bnNpZ25lZCBpbnQgdWRwbGVuID0gc2tiLT5sZW4gLSBkYXRhb2ZmOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJLyogSGVhZGVyIGlzIHRvbyBzbWFsbD8gKi8KIAloZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKIAlpZiAoaGRyID09IE5VTEwpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVURQKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19VRFApKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCSAgICAgICJuZl9jdF91ZHA6IHNob3J0IHBhY2tldCAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CkBAIC0xMDksNyArMTA5LDcgQEAKIAogCS8qIFRydW5jYXRlZC9tYWxmb3JtZWQgcGFja2V0cyAqLwogCWlmIChudG9ocyhoZHItPmxlbikgPiB1ZHBsZW4gfHwgbnRvaHMoaGRyLT5sZW4pIDwgc2l6ZW9mKCpoZHIpKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1VEUCkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fVURQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkibmZfY3RfdWRwOiB0cnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldCAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CkBAIC0xMjMsOSArMTIzLDkgQEAKIAkgKiBXZSBza2lwIGNoZWNraW5nIHBhY2tldHMgb24gdGhlIG91dGdvaW5nIHBhdGgKIAkgKiBiZWNhdXNlIHRoZSBjaGVja3N1bSBpcyBhc3N1bWVkIHRvIGJlIGNvcnJlY3QuCiAJICogRklYTUU6IFNvdXJjZSByb3V0ZSBJUCBvcHRpb24gcGFja2V0cyAtLVJSICovCi0JaWYgKG5mX2Nvbm50cmFja19jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgJiYKKwlpZiAobmV0LT5jdC5zeXNjdGxfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HICYmCiAJICAgIG5mX2NoZWNrc3VtKHNrYiwgaG9va251bSwgZGF0YW9mZiwgSVBQUk9UT19VRFAsIHBmKSkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFApKQorCQlpZiAoTE9HX0lOVkFMSUQobmV0LCBJUFBST1RPX1VEUCkpCiAJCQluZl9sb2dfcGFja2V0KHBmLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCQkJIm5mX2N0X3VkcDogYmFkIFVEUCBjaGVja3N1bSAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMKaW5kZXggMWZhNjJmMy4uZDIyZDgzOWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgdW5zaWduZWQgaW50IGRhdGFvZmYsCiAJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICBpbnQgcGYsCisJCQkgIHVfaW50OF90IHBmLAogCQkJICB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAkvKiBJZiB3ZSd2ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzLCB0aGlzIGlzIHNvbWUga2luZCBvZiBVRFAKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCQkgICBuZl9jdF91ZHBsaXRlX3RpbWVvdXRfc3RyZWFtKTsKIAkJLyogQWxzbywgbW9yZSBsaWtlbHkgdG8gYmUgaW1wb3J0YW50LCBhbmQgbm90IGEgcHJvYmUgKi8KIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpKQotCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBza2IpOworCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCBjdCk7CiAJfSBlbHNlCiAJCW5mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIG5mX2N0X3VkcGxpdGVfdGltZW91dCk7CiAKQEAgLTg5LDkgKzg5LDExIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgdWRwbGl0ZV9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKK3N0YXRpYyBpbnQgdWRwbGl0ZV9lcnJvcihzdHJ1Y3QgbmV0ICpuZXQsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKIAkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JCQkgaW50IHBmLAorCQkJIHVfaW50OF90IHBmLAogCQkJIHVuc2lnbmVkIGludCBob29rbnVtKQogewogCXVuc2lnbmVkIGludCB1ZHBsZW4gPSBza2ItPmxlbiAtIGRhdGFvZmY7CkBAIC0xMDIsNyArMTA0LDcgQEAKIAkvKiBIZWFkZXIgaXMgdG9vIHNtYWxsPyAqLwogCWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfaGRyKSwgJl9oZHIpOwogCWlmIChoZHIgPT0gTlVMTCkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFBMSVRFKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19VRFBMSVRFKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgICAibmZfY3RfdWRwbGl0ZTogc2hvcnQgcGFja2V0ICIpOwogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKQEAgLTExMiw3ICsxMTQsNyBAQAogCWlmIChjc2NvdiA9PSAwKQogCQljc2NvdiA9IHVkcGxlbjsKIAllbHNlIGlmIChjc2NvdiA8IHNpemVvZigqaGRyKSB8fCBjc2NvdiA+IHVkcGxlbikgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFBMSVRFKSkKKwkJaWYgKExPR19JTlZBTElEKG5ldCwgSVBQUk9UT19VRFBMSVRFKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJCQkibmZfY3RfdWRwbGl0ZTogaW52YWxpZCBjaGVja3N1bSBjb3ZlcmFnZSAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CkBAIC0xMjAsMTcgKzEyMiwxNyBAQAogCiAJLyogVURQTElURSBtYW5kYXRlcyBjaGVja3N1bXMgKi8KIAlpZiAoIWhkci0+Y2hlY2spIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVURQTElURSkpCisJCWlmIChMT0dfSU5WQUxJRChuZXQsIElQUFJPVE9fVURQTElURSkpCiAJCQluZl9sb2dfcGFja2V0KHBmLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCQkJICAgICAgIm5mX2N0X3VkcGxpdGU6IGNoZWNrc3VtIG1pc3NpbmcgIik7CiAJCXJldHVybiAtTkZfQUNDRVBUOwogCX0KIAogCS8qIENoZWNrc3VtIGludmFsaWQ/IElnbm9yZS4gKi8KLQlpZiAobmZfY29ubnRyYWNrX2NoZWNrc3VtICYmIGhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyAmJgorCWlmIChuZXQtPmN0LnN5c2N0bF9jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgJiYKIAkgICAgbmZfY2hlY2tzdW1fcGFydGlhbChza2IsIGhvb2tudW0sIGRhdGFvZmYsIGNzY292LCBJUFBST1RPX1VEUCwKIAkgICAgCQkJcGYpKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1VEUExJVEUpKQorCQlpZiAoTE9HX0lOVkFMSUQobmV0LCBJUFBST1RPX1VEUExJVEUpKQogCQkJbmZfbG9nX3BhY2tldChwZiwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJCSAgICAgICJuZl9jdF91ZHBsaXRlOiBiYWQgVURQTGl0ZSBjaGVja3N1bSAiKTsKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCmluZGV4IDJmOWJiYzAuLjY4MTNmMWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCkBAIC03MzYsNiArNzM2LDcgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqcnRwX2V4cCwgKnJ0Y3BfZXhwOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAl1bmlvbiBuZl9pbmV0X2FkZHIgKnNhZGRyOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CkBAIC03NzUsNyArNzc2LDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlkbyB7Ci0JCWV4cCA9IF9fbmZfY3RfZXhwZWN0X2ZpbmQoJnR1cGxlKTsKKwkJZXhwID0gX19uZl9jdF9leHBlY3RfZmluZChuZXQsICZ0dXBsZSk7CiAKIAkJaWYgKCFleHAgfHwgZXhwLT5tYXN0ZXIgPT0gY3QgfHwKIAkJICAgIG5mY3RfaGVscChleHAtPm1hc3RlciktPmhlbHBlciAhPSBuZmN0X2hlbHAoY3QpLT5oZWxwZXIgfHwKQEAgLTExOTMsNyArMTE5NCw2IEBACiBzdGF0aWMgaW50IHByb2Nlc3Nfc2lwX3Jlc3BvbnNlKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJY29uc3QgY2hhciAqKmRwdHIsIHVuc2lnbmVkIGludCAqZGF0YWxlbikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNpcF9oYW5kbGVyICpoYW5kbGVyOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCXVuc2lnbmVkIGludCBtYXRjaG9mZiwgbWF0Y2hsZW47CkBAIC0xMjE0LDYgKzEyMTQsOCBAQAogCWRhdGFvZmYgPSBtYXRjaG9mZiArIG1hdGNobGVuICsgMTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpcF9oYW5kbGVycyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qgc2lwX2hhbmRsZXIgKmhhbmRsZXI7CisKIAkJaGFuZGxlciA9ICZzaXBfaGFuZGxlcnNbaV07CiAJCWlmIChoYW5kbGVyLT5yZXNwb25zZSA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC0xMjI4LDEzICsxMjMwLDE0IEBACiBzdGF0aWMgaW50IHByb2Nlc3Nfc2lwX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0ciwgdW5zaWduZWQgaW50ICpkYXRhbGVuKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2lwX2hhbmRsZXIgKmhhbmRsZXI7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CiAJdW5zaWduZWQgaW50IG1hdGNob2ZmLCBtYXRjaGxlbjsKIAl1bnNpZ25lZCBpbnQgY3NlcSwgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpcF9oYW5kbGVycyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qgc2lwX2hhbmRsZXIgKmhhbmRsZXI7CisKIAkJaGFuZGxlciA9ICZzaXBfaGFuZGxlcnNbaV07CiAJCWlmIChoYW5kbGVyLT5yZXF1ZXN0ID09IE5VTEwpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA4NTA5ZGIxLi45ODEwNmQ0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC00MCwxOCArNDAsMjAgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHByaW50X3R1cGxlKTsKIAogc3RydWN0IGN0X2l0ZXJfc3RhdGUgeworCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKIAl1bnNpZ25lZCBpbnQgYnVja2V0OwogfTsKIAogc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpjdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCiAJZm9yIChzdC0+YnVja2V0ID0gMDsKIAkgICAgIHN0LT5idWNrZXQgPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiAJICAgICBzdC0+YnVja2V0KyspIHsKLQkJbiA9IHJjdV9kZXJlZmVyZW5jZShuZl9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XS5maXJzdCk7CisJCW4gPSByY3VfZGVyZWZlcmVuY2UobmV0LT5jdC5oYXNoW3N0LT5idWNrZXRdLmZpcnN0KTsKIAkJaWYgKG4pCiAJCQlyZXR1cm4gbjsKIAl9CkBAIC02MSwxMyArNjMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCiAJCQkJICAgICAgc3RydWN0IGhsaXN0X25vZGUgKmhlYWQpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CiAJc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwogCiAJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShoZWFkLT5uZXh0KTsKIAl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7CiAJCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UobmZfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0uZmlyc3QpOworCQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+Y3QuaGFzaFtzdC0+YnVja2V0XS5maXJzdCk7CiAJfQogCXJldHVybiBoZWFkOwogfQpAQCAtMTc3LDcgKzE4MCw3IEBACiAKIHN0YXRpYyBpbnQgY3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2VxX29wZW5fcHJpdmF0ZShmaWxlLCAmY3Rfc2VxX29wcywKKwlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmY3Rfc2VxX29wcywKIAkJCXNpemVvZihzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSkpOwogfQogCkBAIC0xODYsMTEgKzE4OSwxMiBAQAogCS5vcGVuICAgID0gY3Rfb3BlbiwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKIH07CiAKIHN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlpbnQgY3B1OwogCiAJaWYgKCpwb3MgPT0gMCkKQEAgLTIwMCw3ICsyMDQsNyBAQAogCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQogCQkJY29udGludWU7CiAJCSpwb3MgPSBjcHUgKyAxOwotCQlyZXR1cm4gJnBlcl9jcHUobmZfY29ubnRyYWNrX3N0YXQsIGNwdSk7CisJCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0yMDgsMTMgKzIxMiwxNCBAQAogCiBzdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKIAlpbnQgY3B1OwogCiAJZm9yIChjcHUgPSAqcG9zOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgewogCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQogCQkJY29udGludWU7CiAJCSpwb3MgPSBjcHUgKyAxOwotCQlyZXR1cm4gJnBlcl9jcHUobmZfY29ubnRyYWNrX3N0YXQsIGNwdSk7CisJCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC0yMjYsNyArMjMxLDggQEAKIAogc3RhdGljIGludCBjdF9jcHVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0JdW5zaWduZWQgaW50IG5yX2Nvbm50cmFja3MgPSBhdG9taWNfcmVhZCgmbmZfY29ubnRyYWNrX2NvdW50KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKKwl1bnNpZ25lZCBpbnQgbnJfY29ubnRyYWNrcyA9IGF0b21pY19yZWFkKCZuZXQtPmN0LmNvdW50KTsKIAljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgKnN0ID0gdjsKIAogCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewpAQCAtMjY2LDcgKzI3Miw4IEBACiAKIHN0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3RfY3B1X3NlcV9vcHMpOworCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZjdF9jcHVfc2VxX29wcywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7CkBAIC0yNzQsNTYgKzI4MSw1MiBAQAogCS5vcGVuCSA9IGN0X2NwdV9zZXFfb3BlbiwKIAkucmVhZAkgPSBzZXFfcmVhZCwKIAkubGxzZWVrCSA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfbmV0LAogfTsKIAotc3RhdGljIGludCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0X3Byb2Modm9pZCkKK3N0YXRpYyBpbnQgbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdF9wcm9jKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKIAotCXBkZSA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKCZpbml0X25ldCwgIm5mX2Nvbm50cmFjayIsIDA0NDAsICZjdF9maWxlX29wcyk7CisJcGRlID0gcHJvY19uZXRfZm9wc19jcmVhdGUobmV0LCAibmZfY29ubnRyYWNrIiwgMDQ0MCwgJmN0X2ZpbGVfb3BzKTsKIAlpZiAoIXBkZSkKIAkJZ290byBvdXRfbmZfY29ubnRyYWNrOwogCi0JcGRlID0gcHJvY19jcmVhdGUoIm5mX2Nvbm50cmFjayIsIFNfSVJVR08sIGluaXRfbmV0LnByb2NfbmV0X3N0YXQsCisJcGRlID0gcHJvY19jcmVhdGUoIm5mX2Nvbm50cmFjayIsIFNfSVJVR08sIG5ldC0+cHJvY19uZXRfc3RhdCwKIAkJCSAgJmN0X2NwdV9zZXFfZm9wcyk7CiAJaWYgKCFwZGUpCiAJCWdvdG8gb3V0X3N0YXRfbmZfY29ubnRyYWNrOwogCXJldHVybiAwOwogCiBvdXRfc3RhdF9uZl9jb25udHJhY2s6Ci0JcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgIm5mX2Nvbm50cmFjayIpOworCXByb2NfbmV0X3JlbW92ZShuZXQsICJuZl9jb25udHJhY2siKTsKIG91dF9uZl9jb25udHJhY2s6CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2ZpbmlfcHJvYyh2b2lkKQorc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaV9wcm9jKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeSgibmZfY29ubnRyYWNrIiwgaW5pdF9uZXQucHJvY19uZXRfc3RhdCk7Ci0JcHJvY19uZXRfcmVtb3ZlKCZpbml0X25ldCwgIm5mX2Nvbm50cmFjayIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJuZl9jb25udHJhY2siLCBuZXQtPnByb2NfbmV0X3N0YXQpOworCXByb2NfbmV0X3JlbW92ZShuZXQsICJuZl9jb25udHJhY2siKTsKIH0KICNlbHNlCi1zdGF0aWMgaW50IG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXRfcHJvYyh2b2lkKQorc3RhdGljIGludCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0X3Byb2Moc3RydWN0IG5ldCAqbmV0KQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2Modm9pZCkKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2ZpbmlfcHJvYyhzdHJ1Y3QgbmV0ICpuZXQpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogLyogU3lzY3RsIHN1cHBvcnQgKi8KIAotaW50IG5mX2Nvbm50cmFja19jaGVja3N1bSBfX3JlYWRfbW9zdGx5ID0gMTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jaGVja3N1bSk7Ci0KICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAvKiBMb2cgaW52YWxpZCBwYWNrZXRzIG9mIGEgZ2l2ZW4gcHJvdG9jb2wgKi8KIHN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWluID0gMDsKIHN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWF4ID0gMjU1OwogCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX2N0X3N5c2N0bF9oZWFkZXI7CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX2N0X25ldGZpbHRlcl9oZWFkZXI7CiAKIHN0YXRpYyBjdGxfdGFibGUgbmZfY3Rfc3lzY3RsX3RhYmxlW10gPSB7CkBAIC0zMzgsNyArMzQxLDcgQEAKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfQ09VTlQsCiAJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfY291bnQiLAotCQkuZGF0YQkJPSAmbmZfY29ubnRyYWNrX2NvdW50LAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuY3QuY291bnQsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA0NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKQEAgLTM1NCw3ICszNTcsNyBAQAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19DSEVDS1NVTSwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19jaGVja3N1bSIsCi0JCS5kYXRhCQk9ICZuZl9jb25udHJhY2tfY2hlY2tzdW0sCisJCS5kYXRhCQk9ICZpbml0X25ldC5jdC5zeXNjdGxfY2hlY2tzdW0sCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKQEAgLTM2Miw3ICszNjUsNyBAQAogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19MT0dfSU5WQUxJRCwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19sb2dfaW52YWxpZCIsCi0JCS5kYXRhCQk9ICZuZl9jdF9sb2dfaW52YWxpZCwKKwkJLmRhdGEJCT0gJmluaXRfbmV0LmN0LnN5c2N0bF9sb2dfaW52YWxpZCwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKQEAgLTQwMCw3NCArNDAzLDEwOSBAQAogCXsgfQogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbG9nX2ludmFsaWQpOwotCi1zdGF0aWMgaW50IG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXRfc3lzY3RsKHZvaWQpCitzdGF0aWMgaW50IG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXRfc3lzY3RsKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9jdF9uZXRmaWx0ZXJfaGVhZGVyID0KLQkJcmVnaXN0ZXJfc3lzY3RsX3BhdGhzKG5mX2N0X3BhdGgsIG5mX2N0X25ldGZpbHRlcl90YWJsZSk7Ci0JaWYgKCFuZl9jdF9uZXRmaWx0ZXJfaGVhZGVyKQotCQlnb3RvIG91dDsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKIAotCW5mX2N0X3N5c2N0bF9oZWFkZXIgPQotCQkgcmVnaXN0ZXJfc3lzY3RsX3BhdGhzKG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCi0JCQkJCW5mX2N0X3N5c2N0bF90YWJsZSk7Ci0JaWYgKCFuZl9jdF9zeXNjdGxfaGVhZGVyKQorCWlmIChuZXRfZXEobmV0LCAmaW5pdF9uZXQpKSB7CisJCW5mX2N0X25ldGZpbHRlcl9oZWFkZXIgPQorCQkgICAgICAgcmVnaXN0ZXJfc3lzY3RsX3BhdGhzKG5mX2N0X3BhdGgsIG5mX2N0X25ldGZpbHRlcl90YWJsZSk7CisJCWlmICghbmZfY3RfbmV0ZmlsdGVyX2hlYWRlcikKKwkJCWdvdG8gb3V0OworCX0KKworCXRhYmxlID0ga21lbWR1cChuZl9jdF9zeXNjdGxfdGFibGUsIHNpemVvZihuZl9jdF9zeXNjdGxfdGFibGUpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCF0YWJsZSkKKwkJZ290byBvdXRfa21lbWR1cDsKKworCXRhYmxlWzFdLmRhdGEgPSAmbmV0LT5jdC5jb3VudDsKKwl0YWJsZVszXS5kYXRhID0gJm5ldC0+Y3Quc3lzY3RsX2NoZWNrc3VtOworCXRhYmxlWzRdLmRhdGEgPSAmbmV0LT5jdC5zeXNjdGxfbG9nX2ludmFsaWQ7CisKKwluZXQtPmN0LnN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKG5ldCwKKwkJCQkJbmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwgdGFibGUpOworCWlmICghbmV0LT5jdC5zeXNjdGxfaGVhZGVyKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyX25ldGZpbHRlcjsKIAogCXJldHVybiAwOwogCiBvdXRfdW5yZWdpc3Rlcl9uZXRmaWx0ZXI6Ci0JdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfbmV0ZmlsdGVyX2hlYWRlcik7CisJa2ZyZWUodGFibGUpOworb3V0X2ttZW1kdXA6CisJaWYgKG5ldF9lcShuZXQsICZpbml0X25ldCkpCisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5mX2N0X25ldGZpbHRlcl9oZWFkZXIpOwogb3V0OgogCXByaW50aygibmZfY29ubnRyYWNrOiBjYW4ndCByZWdpc3RlciB0byBzeXNjdGwuXG4iKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaV9zeXNjdGwodm9pZCkKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2Zpbmlfc3lzY3RsKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShuZl9jdF9uZXRmaWx0ZXJfaGVhZGVyKTsKLQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShuZl9jdF9zeXNjdGxfaGVhZGVyKTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKKworCWlmIChuZXRfZXEobmV0LCAmaW5pdF9uZXQpKQorCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShuZl9jdF9uZXRmaWx0ZXJfaGVhZGVyKTsKKwl0YWJsZSA9IG5ldC0+Y3Quc3lzY3RsX2hlYWRlci0+Y3RsX3RhYmxlX2FyZzsKKwl1bnJlZ2lzdGVyX25ldF9zeXNjdGxfdGFibGUobmV0LT5jdC5zeXNjdGxfaGVhZGVyKTsKKwlrZnJlZSh0YWJsZSk7CiB9CiAjZWxzZQotc3RhdGljIGludCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0X3N5c2N0bCh2b2lkKQorc3RhdGljIGludCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0X3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2Zpbmlfc3lzY3RsKHZvaWQpCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IG5mX2Nvbm50cmFja19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IG5mX2Nvbm50cmFja19pbml0KCk7CisJcmV0ID0gbmZfY29ubnRyYWNrX2luaXQobmV0KTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdF9wcm9jKCk7CisJCWdvdG8gb3V0X2luaXQ7CisJcmV0ID0gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdF9wcm9jKG5ldCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3Byb2M7Ci0JcmV0ID0gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdF9zeXNjdGwoKTsKKwluZXQtPmN0LnN5c2N0bF9jaGVja3N1bSA9IDE7CisJbmV0LT5jdC5zeXNjdGxfbG9nX2ludmFsaWQgPSAwOworCXJldCA9IG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXRfc3lzY3RsKG5ldCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3N5c2N0bDsKIAlyZXR1cm4gMDsKIAogb3V0X3N5c2N0bDoKLQluZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2MoKTsKKwluZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2MobmV0KTsKIG91dF9wcm9jOgotCW5mX2Nvbm50cmFja19jbGVhbnVwKCk7Ci1vdXQ6CisJbmZfY29ubnRyYWNrX2NsZWFudXAobmV0KTsKK291dF9pbml0OgogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaV9zeXNjdGwobmV0KTsKKwluZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2MobmV0KTsKKwluZl9jb25udHJhY2tfY2xlYW51cChuZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIG5mX2Nvbm50cmFja19uZXRfb3BzID0geworCS5pbml0ID0gbmZfY29ubnRyYWNrX25ldF9pbml0LAorCS5leGl0ID0gbmZfY29ubnRyYWNrX25ldF9leGl0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl9jb25udHJhY2tfbmV0X29wcyk7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pKHZvaWQpCiB7Ci0JbmZfY29ubnRyYWNrX3N0YW5kYWxvbmVfZmluaV9zeXNjdGwoKTsKLQluZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2MoKTsKLQluZl9jb25udHJhY2tfY2xlYW51cCgpOworCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfY29ubnRyYWNrX25ldF9vcHMpOwogfQogCiBtb2R1bGVfaW5pdChuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmggYi9uZXQvbmV0ZmlsdGVyL25mX2ludGVybmFscy5oCmluZGV4IDE5NjI2OWMuLmJmNjYwOTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmgKKysrIGIvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaApAQCAtMTUsNyArMTUsNyBAQAogLyogY29yZS5jICovCiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2l0ZXJhdGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWludCBob29rLAorCQkJCXVuc2lnbmVkIGludCBob29rLAogCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAogCQkJCXN0cnVjdCBsaXN0X2hlYWQgKippLApAQCAtMjUsNyArMjUsNyBAQAogLyogbmZfcXVldWUuYyAqLwogZXh0ZXJuIGludCBuZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqZWxlbSwKLQkJICAgIGludCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCisJCSAgICB1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCiAJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAogCQkgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZl9sb2cuYwppbmRleCA5ZmRhNmVlLi5mYThhZTVkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMKQEAgLTE1LDE2ICsxNSwxNiBAQAogCiAjZGVmaW5lIE5GX0xPR19QUkVGSVhMRU4JCTEyOAogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5mX2xvZ2dlciAqbmZfbG9nZ2Vyc1tOUFJPVE9dIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mX2xvZ2dlciAqbmZfbG9nZ2Vyc1tORlBST1RPX05VTVBST1RPXSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIERFRklORV9NVVRFWChuZl9sb2dfbXV0ZXgpOwogCiAvKiByZXR1cm4gRUJVU1kgaWYgc29tZWJvZHkgZWxzZSBpcyByZWdpc3RlcmVkLCBFRVhJU1QgaWYgdGhlIHNhbWUgbG9nZ2VyCiAgKiBpcyByZWdpc3RyZWQsIDAgb24gc3VjY2Vzcy4gKi8KLWludCBuZl9sb2dfcmVnaXN0ZXIoaW50IHBmLCBjb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpCitpbnQgbmZfbG9nX3JlZ2lzdGVyKHVfaW50OF90IHBmLCBjb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpCiB7CiAJaW50IHJldDsKIAotCWlmIChwZiA+PSBOUFJPVE8pCisJaWYgKHBmID49IEFSUkFZX1NJWkUobmZfbG9nZ2VycykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQW55IHNldHVwIG9mIGxvZ2dpbmcgbWVtYmVycyBtdXN0IGJlIGRvbmUgYmVmb3JlCkBAIC00NSw5ICs0NSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX2xvZ19yZWdpc3Rlcik7CiAKLXZvaWQgbmZfbG9nX3VucmVnaXN0ZXJfcGYoaW50IHBmKQordm9pZCBuZl9sb2dfdW5yZWdpc3Rlcl9wZih1X2ludDhfdCBwZikKIHsKLQlpZiAocGYgPj0gTlBST1RPKQorCWlmIChwZiA+PSBBUlJBWV9TSVpFKG5mX2xvZ2dlcnMpKQogCQlyZXR1cm47CiAJbXV0ZXhfbG9jaygmbmZfbG9nX211dGV4KTsKIAlyY3VfYXNzaWduX3BvaW50ZXIobmZfbG9nZ2Vyc1twZl0sIE5VTEwpOwpAQCAtNjMsNyArNjMsNyBAQAogCWludCBpOwogCiAJbXV0ZXhfbG9jaygmbmZfbG9nX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgTlBST1RPOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZl9sb2dnZXJzKTsgaSsrKSB7CiAJCWlmIChuZl9sb2dnZXJzW2ldID09IGxvZ2dlcikKIAkJCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9sb2dnZXJzW2ldLCBOVUxMKTsKIAl9CkBAIC03Myw3ICs3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX2xvZ191bnJlZ2lzdGVyKTsKIAotdm9pZCBuZl9sb2dfcGFja2V0KGludCBwZiwKK3ZvaWQgbmZfbG9nX3BhY2tldCh1X2ludDhfdCBwZiwKIAkJICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCSAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTEwMyw3ICsxMDMsNyBAQAogewogCXJjdV9yZWFkX2xvY2soKTsKIAotCWlmICgqcG9zID49IE5QUk9UTykKKwlpZiAoKnBvcyA+PSBBUlJBWV9TSVpFKG5mX2xvZ2dlcnMpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwb3M7CkBAIC0xMTMsNyArMTEzLDcgQEAKIHsKIAkoKnBvcykrKzsKIAotCWlmICgqcG9zID49IE5QUk9UTykKKwlpZiAoKnBvcyA+PSBBUlJBWV9TSVpFKG5mX2xvZ2dlcnMpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwb3M7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmMKaW5kZXggNTgyZWMzZS4uNGYyMzEwYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuYwpAQCAtMTYsMTcgKzE2LDE3IEBACiAgKiBsb25nIHRlcm0gbXV0ZXguICBUaGUgaGFuZGxlciBtdXN0IHByb3ZpZGUgYW4gYW4gb3V0Zm4oKSB0byBhY2NlcHQgcGFja2V0cwogICogZm9yIHF1ZXVlaW5nIGFuZCBtdXN0IHJlaW5qZWN0IGFsbCBwYWNrZXRzIGl0IHJlY2VpdmVzLCBubyBtYXR0ZXIgd2hhdC4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyICpxdWV1ZV9oYW5kbGVyW05QUk9UT107CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mX3F1ZXVlX2hhbmRsZXIgKnF1ZXVlX2hhbmRsZXJbTkZQUk9UT19OVU1QUk9UT10gX19yZWFkX21vc3RseTsKIAogc3RhdGljIERFRklORV9NVVRFWChxdWV1ZV9oYW5kbGVyX211dGV4KTsKIAogLyogcmV0dXJuIEVCVVNZIHdoZW4gc29tZWJvZHkgZWxzZSBpcyByZWdpc3RlcmVkLCByZXR1cm4gRUVYSVNUIGlmIHRoZQogICogc2FtZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQsIHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gKi8KLWludCBuZl9yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVyKGludCBwZiwgY29uc3Qgc3RydWN0IG5mX3F1ZXVlX2hhbmRsZXIgKnFoKQoraW50IG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIodV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyICpxaCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHBmID49IE5QUk9UTykKKwlpZiAocGYgPj0gQVJSQVlfU0laRShxdWV1ZV9oYW5kbGVyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZxdWV1ZV9oYW5kbGVyX211dGV4KTsKQEAgLTQ1LDkgKzQ1LDkgQEAKIEVYUE9SVF9TWU1CT0wobmZfcmVnaXN0ZXJfcXVldWVfaGFuZGxlcik7CiAKIC8qIFRoZSBjYWxsZXIgbXVzdCBmbHVzaCB0aGVpciBxdWV1ZSBiZWZvcmUgdGhpcyAqLwotaW50IG5mX3VucmVnaXN0ZXJfcXVldWVfaGFuZGxlcihpbnQgcGYsIGNvbnN0IHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyICpxaCkKK2ludCBuZl91bnJlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIodV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyICpxaCkKIHsKLQlpZiAocGYgPj0gTlBST1RPKQorCWlmIChwZiA+PSBBUlJBWV9TSVpFKHF1ZXVlX2hhbmRsZXIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJnF1ZXVlX2hhbmRsZXJfbXV0ZXgpOwpAQCAtNjcsMTAgKzY3LDEwIEBACiAKIHZvaWQgbmZfdW5yZWdpc3Rlcl9xdWV1ZV9oYW5kbGVycyhjb25zdCBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciAqcWgpCiB7Ci0JaW50IHBmOworCXVfaW50OF90IHBmOwogCiAJbXV0ZXhfbG9jaygmcXVldWVfaGFuZGxlcl9tdXRleCk7Ci0JZm9yIChwZiA9IDA7IHBmIDwgTlBST1RPOyBwZisrKSAgeworCWZvciAocGYgPSAwOyBwZiA8IEFSUkFZX1NJWkUocXVldWVfaGFuZGxlcik7IHBmKyspICB7CiAJCWlmIChxdWV1ZV9oYW5kbGVyW3BmXSA9PSBxaCkKIAkJCXJjdV9hc3NpZ25fcG9pbnRlcihxdWV1ZV9oYW5kbGVyW3BmXSwgTlVMTCk7CiAJfQpAQCAtMTA3LDcgKzEwNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19uZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbGVtLAotCQkgICAgICBpbnQgcGYsIHVuc2lnbmVkIGludCBob29rLAorCQkgICAgICB1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksCkBAIC0xOTEsNyArMTkxLDcgQEAKIAogaW50IG5mX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsCiAJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbGVtLAotCSAgICAgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywKKwkgICAgIHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKIAkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCiAJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwKQEAgLTI4NSw3ICsyODUsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgdm9pZCAqc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlpZiAoKnBvcyA+PSBOUFJPVE8pCisJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShxdWV1ZV9oYW5kbGVyKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gcG9zOwpAQCAtMjk1LDcgKzI5NSw3IEBACiB7CiAJKCpwb3MpKys7CiAKLQlpZiAoKnBvcyA+PSBOUFJPVE8pCisJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShxdWV1ZV9oYW5kbGVyKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gcG9zOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9zb2Nrb3B0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYwppbmRleCAwMTQ4OTY4Li44YWI4MjlmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3NvY2tvcHQuYwpAQCAtNjAsMTQgKzYwLDExIEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfc29ja29wdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKm5mX3NvY2tvcHRfZmluZChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwKK3N0YXRpYyBzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKm5mX3NvY2tvcHRfZmluZChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLAogCQlpbnQgdmFsLCBpbnQgZ2V0KQogewogCXN0cnVjdCBuZl9zb2Nrb3B0X29wcyAqb3BzOwogCi0JaWYgKCFuZXRfZXEoc29ja19uZXQoc2spLCAmaW5pdF9uZXQpKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PUFJPVE9PUFQpOwotCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbmZfc29ja29wdF9tdXRleCkgIT0gMCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKIApAQCAtOTYsNyArOTMsNyBAQAogfQogCiAvKiBDYWxsIGdldC9zZXRzb2Nrb3B0KCkgKi8KLXN0YXRpYyBpbnQgbmZfc29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IHZhbCwKK3N0YXRpYyBpbnQgbmZfc29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLCBpbnQgdmFsLAogCQkgICAgICBjaGFyIF9fdXNlciAqb3B0LCBpbnQgKmxlbiwgaW50IGdldCkKIHsKIAlzdHJ1Y3QgbmZfc29ja29wdF9vcHMgKm9wczsKQEAgLTExNSwyMSArMTEyLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG5mX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgcGYsIGludCB2YWwsIGNoYXIgX191c2VyICpvcHQsCitpbnQgbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLCBpbnQgdmFsLCBjaGFyIF9fdXNlciAqb3B0LAogCQkgIGludCBsZW4pCiB7CiAJcmV0dXJuIG5mX3NvY2tvcHQoc2ssIHBmLCB2YWwsIG9wdCwgJmxlbiwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3NldHNvY2tvcHQpOwogCi1pbnQgbmZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IHZhbCwgY2hhciBfX3VzZXIgKm9wdCwgaW50ICpsZW4pCitpbnQgbmZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLCBpbnQgdmFsLCBjaGFyIF9fdXNlciAqb3B0LAorCQkgIGludCAqbGVuKQogewogCXJldHVybiBuZl9zb2Nrb3B0KHNrLCBwZiwgdmFsLCBvcHQsIGxlbiwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX2dldHNvY2tvcHQpOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBjb21wYXRfbmZfc29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwgaW50IHZhbCwKK3N0YXRpYyBpbnQgY29tcGF0X25mX3NvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCB1X2ludDhfdCBwZiwgaW50IHZhbCwKIAkJCSAgICAgY2hhciBfX3VzZXIgKm9wdCwgaW50ICpsZW4sIGludCBnZXQpCiB7CiAJc3RydWN0IG5mX3NvY2tvcHRfb3BzICpvcHM7CkBAIC0xNTUsMTQgKzE1MywxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBjb21wYXRfbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBwZiwKK2ludCBjb21wYXRfbmZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIHVfaW50OF90IHBmLAogCQlpbnQgdmFsLCBjaGFyIF9fdXNlciAqb3B0LCBpbnQgbGVuKQogewogCXJldHVybiBjb21wYXRfbmZfc29ja29wdChzaywgcGYsIHZhbCwgb3B0LCAmbGVuLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0woY29tcGF0X25mX3NldHNvY2tvcHQpOwogCi1pbnQgY29tcGF0X25mX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgcGYsCitpbnQgY29tcGF0X25mX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCB1X2ludDhfdCBwZiwKIAkJaW50IHZhbCwgY2hhciBfX3VzZXIgKm9wdCwgaW50ICpsZW4pCiB7CiAJcmV0dXJuIGNvbXBhdF9uZl9zb2Nrb3B0KHNrLCBwZiwgdmFsLCBvcHQsIGxlbiwgMSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjOTdmMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdHByb3h5X2NvcmUuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogVHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydCBmb3IgTGludXgvaXB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBCYWxhQml0IElUIEx0ZC4KKyAqIEF1dGhvcjogQmFsYXpzIFNjaGVpZGxlciwgS3Jpc3p0aWFuIEtvdmFjcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdHByb3h5X2NvcmUuaD4KKworc3RydWN0IHNvY2sgKgorbmZfdHByb3h5X2dldF9zb2NrX3Y0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgdTggcHJvdG9jb2wsCisJCSAgICAgIGNvbnN0IF9fYmUzMiBzYWRkciwgY29uc3QgX19iZTMyIGRhZGRyLAorCQkgICAgICBjb25zdCBfX2JlMTYgc3BvcnQsIGNvbnN0IF9fYmUxNiBkcG9ydCwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBib29sIGxpc3RlbmluZ19vbmx5KQoreworCXN0cnVjdCBzb2NrICpzazsKKworCS8qIGxvb2sgdXAgc29ja2V0ICovCisJc3dpdGNoIChwcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWlmIChsaXN0ZW5pbmdfb25seSkKKwkJCXNrID0gX19pbmV0X2xvb2t1cF9saXN0ZW5lcihuZXQsICZ0Y3BfaGFzaGluZm8sCisJCQkJCQkgICAgZGFkZHIsIG50b2hzKGRwb3J0KSwKKwkJCQkJCSAgICBpbi0+aWZpbmRleCk7CisJCWVsc2UKKwkJCXNrID0gX19pbmV0X2xvb2t1cChuZXQsICZ0Y3BfaGFzaGluZm8sCisJCQkJCSAgIHNhZGRyLCBzcG9ydCwgZGFkZHIsIGRwb3J0LAorCQkJCQkgICBpbi0+aWZpbmRleCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXNrID0gdWRwNF9saWJfbG9va3VwKG5ldCwgc2FkZHIsIHNwb3J0LCBkYWRkciwgZHBvcnQsCisJCQkJICAgICBpbi0+aWZpbmRleCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXNrID0gTlVMTDsKKwl9CisKKwlwcl9kZWJ1ZygidHByb3h5IHNvY2tldCBsb29rdXA6IHByb3RvICV1ICUwOHg6JXUgLT4gJTA4eDoldSwgbGlzdGVuZXIgb25seTogJWQsIHNvY2sgJXBcbiIsCisJCSBwcm90b2NvbCwgbnRvaGwoc2FkZHIpLCBudG9ocyhzcG9ydCksIG50b2hsKGRhZGRyKSwgbnRvaHMoZHBvcnQpLCBsaXN0ZW5pbmdfb25seSwgc2spOworCisJcmV0dXJuIHNrOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfdHByb3h5X2dldF9zb2NrX3Y0KTsKKworc3RhdGljIHZvaWQKK25mX3Rwcm94eV9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKworCXNrYi0+c2sgPSBOVUxMOworCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisKKwlpZiAoc2spCisJCW5mX3Rwcm94eV9wdXRfc29jayhzayk7Cit9CisKKy8qIGNvbnN1bWVzIHNrICovCitpbnQKK25mX3Rwcm94eV9hc3NpZ25fc29jayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKGluZXRfc2soc2spLT50cmFuc3BhcmVudCkgeworCQlza2ItPnNrID0gc2s7CisJCXNrYi0+ZGVzdHJ1Y3RvciA9IG5mX3Rwcm94eV9kZXN0cnVjdG9yOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJbmZfdHByb3h5X3B1dF9zb2NrKHNrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfdHByb3h5X2Fzc2lnbl9zb2NrKTsKKworc3RhdGljIGludCBfX2luaXQgbmZfdHByb3h5X2luaXQodm9pZCkKK3sKKwlwcl9pbmZvKCJORl9UUFJPWFk6IFRyYW5zcGFyZW50IHByb3h5IHN1cHBvcnQgaW5pdGlhbGl6ZWQsIHZlcnNpb24gNC4xLjBcbiIpOworCXByX2luZm8oIk5GX1RQUk9YWTogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgQmFsYUJpdCBJVCBMdGQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobmZfdHByb3h5X2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJLcmlzenRpYW4gS292YWNzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRyYW5zcGFyZW50IHByb3h5IHN1cHBvcnQgY29yZSByb3V0aW5lcyIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKaW5kZXggYjc1YzljNC4uNDczOWY5ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCkBAIC00NCwxNSArNDQsMTcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqc3Vic3lzX3RhYmxlW05GTkxfU1VCU1lTX0NPVU5UXTsKIHN0YXRpYyBERUZJTkVfTVVURVgobmZubF9tdXRleCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZm5sX2xvY2sodm9pZCkKK3ZvaWQgbmZubF9sb2NrKHZvaWQpCiB7CiAJbXV0ZXhfbG9jaygmbmZubF9tdXRleCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZm5sX2xvY2spOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZubF91bmxvY2sodm9pZCkKK3ZvaWQgbmZubF91bmxvY2sodm9pZCkKIHsKIAltdXRleF91bmxvY2soJm5mbmxfbXV0ZXgpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZubF91bmxvY2spOwogCiBpbnQgbmZuZXRsaW5rX3N1YnN5c19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbikKIHsKQEAgLTEzMiw2ICsxMzQsNyBAQAogCQlyZXR1cm4gMDsKIAogCXR5cGUgPSBubGgtPm5sbXNnX3R5cGU7CityZXBsYXk6CiAJc3MgPSBuZm5ldGxpbmtfZ2V0X3N1YnN5cyh0eXBlKTsKIAlpZiAoIXNzKSB7CiAjaWZkZWYgQ09ORklHX0tNT0QKQEAgLTE2NSw3ICsxNjgsMTAgQEAKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlyZXR1cm4gbmMtPmNhbGwobmZubCwgc2tiLCBubGgsIGNkYSk7CisJCWVyciA9IG5jLT5jYWxsKG5mbmwsIHNrYiwgbmxoLCBjZGEpOworCQlpZiAoZXJyID09IC1FQUdBSU4pCisJCQlnb3RvIHJlcGxheTsKKwkJcmV0dXJuIGVycjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKaW5kZXggOWEzNWI1Ny4uNDFlMDEwNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKQEAgLTM1OSw3ICszNTksNyBAQAogX19idWlsZF9wYWNrZXRfbWVzc2FnZShzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0LAogCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXVuc2lnbmVkIGludCBkYXRhX2xlbiwKLQkJCXVuc2lnbmVkIGludCBwZiwKKwkJCXVfaW50OF90IHBmLAogCQkJdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCiAJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LApAQCAtNTM0LDcgKzUzNCw3IEBACiAKIC8qIGxvZyBoYW5kbGVyIGZvciBpbnRlcm5hbCBuZXRmaWx0ZXIgbG9nZ2luZyBhcGkgKi8KIHN0YXRpYyB2b2lkCi1uZnVsbmxfbG9nX3BhY2tldCh1bnNpZ25lZCBpbnQgcGYsCituZnVsbmxfbG9nX3BhY2tldCh1X2ludDhfdCBwZiwKIAkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCA1ZDc1Y2Q4Li44OTgzN2E0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0zMCw3ICszMCw3IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJbaXAsaXA2LGFycF1fdGFibGVzIGJhY2tlbmQgbW9kdWxlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIntpcCxpcDYsYXJwLGVifV90YWJsZXMgYmFja2VuZCBtb2R1bGUiKTsKIAogI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKIApAQCAtNTgsMTcgKzU4LDIwIEBACiAjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeHRfcHJlZml4W05QUk9UT10gPSB7Ci0JW0FGX0lORVRdCT0gImlwIiwKLQlbQUZfSU5FVDZdCT0gImlwNiIsCi0JW05GX0FSUF0JPSAiYXJwIiwKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB4dF9wcmVmaXhbTkZQUk9UT19OVU1QUk9UT10gPSB7CisJW05GUFJPVE9fVU5TUEVDXSA9ICJ4IiwKKwlbTkZQUk9UT19JUFY0XSAgID0gImlwIiwKKwlbTkZQUk9UT19BUlBdICAgID0gImFycCIsCisJW05GUFJPVE9fQlJJREdFXSA9ICJlYiIsCisJW05GUFJPVE9fSVBWNl0gICA9ICJpcDYiLAogfTsKIAogLyogUmVnaXN0cmF0aW9uIGhvb2tzIGZvciB0YXJnZXRzLiAqLwogaW50CiB4dF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0KQogewotCWludCByZXQsIGFmID0gdGFyZ2V0LT5mYW1pbHk7CisJdV9pbnQ4X3QgYWYgPSB0YXJnZXQtPmZhbWlseTsKKwlpbnQgcmV0OwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpOwogCWlmIChyZXQgIT0gMCkKQEAgLTgyLDcgKzg1LDcgQEAKIHZvaWQKIHh0X3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCkKIHsKLQlpbnQgYWYgPSB0YXJnZXQtPmZhbWlseTsKKwl1X2ludDhfdCBhZiA9IHRhcmdldC0+ZmFtaWx5OwogCiAJbXV0ZXhfbG9jaygmeHRbYWZdLm11dGV4KTsKIAlsaXN0X2RlbCgmdGFyZ2V0LT5saXN0KTsKQEAgLTEyMyw3ICsxMjYsOCBAQAogaW50CiB4dF9yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoKQogewotCWludCByZXQsIGFmID0gbWF0Y2gtPmZhbWlseTsKKwl1X2ludDhfdCBhZiA9IG1hdGNoLT5mYW1pbHk7CisJaW50IHJldDsKIAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KTsKIAlpZiAocmV0ICE9IDApCkBAIC0xMzksNyArMTQzLDcgQEAKIHZvaWQKIHh0X3VucmVnaXN0ZXJfbWF0Y2goc3RydWN0IHh0X21hdGNoICptYXRjaCkKIHsKLQlpbnQgYWYgPSAgbWF0Y2gtPmZhbWlseTsKKwl1X2ludDhfdCBhZiA9IG1hdGNoLT5mYW1pbHk7CiAKIAltdXRleF9sb2NrKCZ4dFthZl0ubXV0ZXgpOwogCWxpc3RfZGVsKCZtYXRjaC0+bGlzdCk7CkBAIC0xODUsNyArMTg5LDcgQEAKICAqLwogCiAvKiBGaW5kIG1hdGNoLCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0cnVjdCB4dF9tYXRjaCAqeHRfZmluZF9tYXRjaChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQorc3RydWN0IHh0X21hdGNoICp4dF9maW5kX21hdGNoKHU4IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKIHsKIAlzdHJ1Y3QgeHRfbWF0Y2ggKm07CiAJaW50IGVyciA9IDA7CkBAIC0yMDUsMTIgKzIwOSwxNyBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmeHRbYWZdLm11dGV4KTsKKworCWlmIChhZiAhPSBORlBST1RPX1VOU1BFQykKKwkJLyogVHJ5IHNlYXJjaGluZyBhZ2FpbiBpbiB0aGUgZmFtaWx5LWluZGVwZW5kZW50IGxpc3QgKi8KKwkJcmV0dXJuIHh0X2ZpbmRfbWF0Y2goTkZQUk9UT19VTlNQRUMsIG5hbWUsIHJldmlzaW9uKTsKKwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiBFWFBPUlRfU1lNQk9MKHh0X2ZpbmRfbWF0Y2gpOwogCiAvKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdHJ1Y3QgeHRfdGFyZ2V0ICp4dF9maW5kX3RhcmdldChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQorc3RydWN0IHh0X3RhcmdldCAqeHRfZmluZF90YXJnZXQodTggYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQogewogCXN0cnVjdCB4dF90YXJnZXQgKnQ7CiAJaW50IGVyciA9IDA7CkBAIC0yMzAsMTEgKzIzOSwxNiBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmeHRbYWZdLm11dGV4KTsKKworCWlmIChhZiAhPSBORlBST1RPX1VOU1BFQykKKwkJLyogVHJ5IHNlYXJjaGluZyBhZ2FpbiBpbiB0aGUgZmFtaWx5LWluZGVwZW5kZW50IGxpc3QgKi8KKwkJcmV0dXJuIHh0X2ZpbmRfdGFyZ2V0KE5GUFJPVE9fVU5TUEVDLCBuYW1lLCByZXZpc2lvbik7CisKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogRVhQT1JUX1NZTUJPTCh4dF9maW5kX3RhcmdldCk7CiAKLXN0cnVjdCB4dF90YXJnZXQgKnh0X3JlcXVlc3RfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKK3N0cnVjdCB4dF90YXJnZXQgKnh0X3JlcXVlc3RfZmluZF90YXJnZXQodTggYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQogewogCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKIApAQCAtMjQ2LDcgKzI2MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4dF9yZXF1ZXN0X2ZpbmRfdGFyZ2V0KTsKIAotc3RhdGljIGludCBtYXRjaF9yZXZmbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQorc3RhdGljIGludCBtYXRjaF9yZXZmbih1OCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCiB7CiAJY29uc3Qgc3RydWN0IHh0X21hdGNoICptOwogCWludCBoYXZlX3JldiA9IDA7CkBAIC0yNjIsNyArMjc2LDcgQEAKIAlyZXR1cm4gaGF2ZV9yZXY7CiB9CiAKLXN0YXRpYyBpbnQgdGFyZ2V0X3JldmZuKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCitzdGF0aWMgaW50IHRhcmdldF9yZXZmbih1OCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCiB7CiAJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdDsKIAlpbnQgaGF2ZV9yZXYgPSAwOwpAQCAtMjc5LDcgKzI5Myw3IEBACiB9CiAKIC8qIFJldHVybnMgdHJ1ZSBvciBmYWxzZSAoaWYgbm8gc3VjaCBleHRlbnNpb24gYXQgYWxsKSAqLwotaW50IHh0X2ZpbmRfcmV2aXNpb24oaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50IHRhcmdldCwKK2ludCB4dF9maW5kX3JldmlzaW9uKHU4IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50IHRhcmdldCwKIAkJICAgICBpbnQgKmVycikKIHsKIAlpbnQgaGF2ZV9yZXYsIGJlc3QgPSAtMTsKQEAgLTMwNywzNyArMzIxLDQ3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4dF9maW5kX3JldmlzaW9uKTsKIAotaW50IHh0X2NoZWNrX21hdGNoKGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHVuc2lnbmVkIHNob3J0IGZhbWlseSwKLQkJICAgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBpbnQgaG9va19tYXNrLAotCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgaW50IGludl9wcm90bykKK2ludCB4dF9jaGVja19tYXRjaChzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhciwKKwkJICAgdW5zaWduZWQgaW50IHNpemUsIHVfaW50OF90IHByb3RvLCBib29sIGludl9wcm90bykKIHsKLQlpZiAoWFRfQUxJR04obWF0Y2gtPm1hdGNoc2l6ZSkgIT0gc2l6ZSkgeworCWlmIChYVF9BTElHTihwYXItPm1hdGNoLT5tYXRjaHNpemUpICE9IHNpemUgJiYKKwkgICAgcGFyLT5tYXRjaC0+bWF0Y2hzaXplICE9IC0xKSB7CisJCS8qCisJCSAqIGVidF9hbW9uZyBpcyBleGVtcHQgZnJvbSBjZW50cmFsaXplZCBtYXRjaHNpemUgY2hlY2tpbmcKKwkJICogYmVjYXVzZSBpdCB1c2VzIGEgZHluYW1pYy1zaXplIGRhdGEgc2V0LgorCQkgKi8KIAkJcHJpbnRrKCIlc190YWJsZXM6ICVzIG1hdGNoOiBpbnZhbGlkIHNpemUgJVp1ICE9ICV1XG4iLAotCQkgICAgICAgeHRfcHJlZml4W2ZhbWlseV0sIG1hdGNoLT5uYW1lLAotCQkgICAgICAgWFRfQUxJR04obWF0Y2gtPm1hdGNoc2l6ZSksIHNpemUpOworCQkgICAgICAgeHRfcHJlZml4W3Bhci0+ZmFtaWx5XSwgcGFyLT5tYXRjaC0+bmFtZSwKKwkJICAgICAgIFhUX0FMSUdOKHBhci0+bWF0Y2gtPm1hdGNoc2l6ZSksIHNpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKG1hdGNoLT50YWJsZSAmJiBzdHJjbXAobWF0Y2gtPnRhYmxlLCB0YWJsZSkpIHsKKwlpZiAocGFyLT5tYXRjaC0+dGFibGUgIT0gTlVMTCAmJgorCSAgICBzdHJjbXAocGFyLT5tYXRjaC0+dGFibGUsIHBhci0+dGFibGUpICE9IDApIHsKIAkJcHJpbnRrKCIlc190YWJsZXM6ICVzIG1hdGNoOiBvbmx5IHZhbGlkIGluICVzIHRhYmxlLCBub3QgJXNcbiIsCi0JCSAgICAgICB4dF9wcmVmaXhbZmFtaWx5XSwgbWF0Y2gtPm5hbWUsIG1hdGNoLT50YWJsZSwgdGFibGUpOworCQkgICAgICAgeHRfcHJlZml4W3Bhci0+ZmFtaWx5XSwgcGFyLT5tYXRjaC0+bmFtZSwKKwkJICAgICAgIHBhci0+bWF0Y2gtPnRhYmxlLCBwYXItPnRhYmxlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChtYXRjaC0+aG9va3MgJiYgKGhvb2tfbWFzayAmIH5tYXRjaC0+aG9va3MpICE9IDApIHsKLQkJcHJpbnRrKCIlc190YWJsZXM6ICVzIG1hdGNoOiBiYWQgaG9va19tYXNrICV1LyV1XG4iLAotCQkgICAgICAgeHRfcHJlZml4W2ZhbWlseV0sIG1hdGNoLT5uYW1lLCBob29rX21hc2ssIG1hdGNoLT5ob29rcyk7CisJaWYgKHBhci0+bWF0Y2gtPmhvb2tzICYmIChwYXItPmhvb2tfbWFzayAmIH5wYXItPm1hdGNoLT5ob29rcykgIT0gMCkgeworCQlwcmludGsoIiVzX3RhYmxlczogJXMgbWF0Y2g6IGJhZCBob29rX21hc2sgJSN4LyUjeFxuIiwKKwkJICAgICAgIHh0X3ByZWZpeFtwYXItPmZhbWlseV0sIHBhci0+bWF0Y2gtPm5hbWUsCisJCSAgICAgICBwYXItPmhvb2tfbWFzaywgcGFyLT5tYXRjaC0+aG9va3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKG1hdGNoLT5wcm90byAmJiAobWF0Y2gtPnByb3RvICE9IHByb3RvIHx8IGludl9wcm90bykpIHsKKwlpZiAocGFyLT5tYXRjaC0+cHJvdG8gJiYgKHBhci0+bWF0Y2gtPnByb3RvICE9IHByb3RvIHx8IGludl9wcm90bykpIHsKIAkJcHJpbnRrKCIlc190YWJsZXM6ICVzIG1hdGNoOiBvbmx5IHZhbGlkIGZvciBwcm90b2NvbCAldVxuIiwKLQkJICAgICAgIHh0X3ByZWZpeFtmYW1pbHldLCBtYXRjaC0+bmFtZSwgbWF0Y2gtPnByb3RvKTsKKwkJICAgICAgIHh0X3ByZWZpeFtwYXItPmZhbWlseV0sIHBhci0+bWF0Y2gtPm5hbWUsCisJCSAgICAgICBwYXItPm1hdGNoLT5wcm90byk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlpZiAocGFyLT5tYXRjaC0+Y2hlY2tlbnRyeSAhPSBOVUxMICYmICFwYXItPm1hdGNoLT5jaGVja2VudHJ5KHBhcikpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoeHRfY2hlY2tfbWF0Y2gpOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotaW50IHh0X2NvbXBhdF9hZGRfb2Zmc2V0KGludCBhZiwgdW5zaWduZWQgaW50IG9mZnNldCwgc2hvcnQgZGVsdGEpCitpbnQgeHRfY29tcGF0X2FkZF9vZmZzZXQodV9pbnQ4X3QgYWYsIHVuc2lnbmVkIGludCBvZmZzZXQsIHNob3J0IGRlbHRhKQogewogCXN0cnVjdCBjb21wYXRfZGVsdGEgKnRtcDsKIApAQCAtMzU5LDcgKzM4Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4dF9jb21wYXRfYWRkX29mZnNldCk7CiAKLXZvaWQgeHRfY29tcGF0X2ZsdXNoX29mZnNldHMoaW50IGFmKQordm9pZCB4dF9jb21wYXRfZmx1c2hfb2Zmc2V0cyh1X2ludDhfdCBhZikKIHsKIAlzdHJ1Y3QgY29tcGF0X2RlbHRhICp0bXAsICpuZXh0OwogCkBAIC0zNzMsNyArMzk3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHh0X2NvbXBhdF9mbHVzaF9vZmZzZXRzKTsKIAotc2hvcnQgeHRfY29tcGF0X2NhbGNfanVtcChpbnQgYWYsIHVuc2lnbmVkIGludCBvZmZzZXQpCitzaG9ydCB4dF9jb21wYXRfY2FsY19qdW1wKHVfaW50OF90IGFmLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBjb21wYXRfZGVsdGEgKnRtcDsKIAlzaG9ydCBkZWx0YTsKQEAgLTQ0OCwzMiArNDcyLDM2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4dF9jb21wYXRfbWF0Y2hfdG9fdXNlcik7CiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogCi1pbnQgeHRfY2hlY2tfdGFyZ2V0KGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdW5zaWduZWQgc2hvcnQgZmFtaWx5LAotCQkgICAgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBpbnQgaG9va19tYXNrLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIGludCBpbnZfcHJvdG8pCitpbnQgeHRfY2hlY2tfdGFyZ2V0KHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyLAorCQkgICAgdW5zaWduZWQgaW50IHNpemUsIHVfaW50OF90IHByb3RvLCBib29sIGludl9wcm90bykKIHsKLQlpZiAoWFRfQUxJR04odGFyZ2V0LT50YXJnZXRzaXplKSAhPSBzaXplKSB7CisJaWYgKFhUX0FMSUdOKHBhci0+dGFyZ2V0LT50YXJnZXRzaXplKSAhPSBzaXplKSB7CiAJCXByaW50aygiJXNfdGFibGVzOiAlcyB0YXJnZXQ6IGludmFsaWQgc2l6ZSAlWnUgIT0gJXVcbiIsCi0JCSAgICAgICB4dF9wcmVmaXhbZmFtaWx5XSwgdGFyZ2V0LT5uYW1lLAotCQkgICAgICAgWFRfQUxJR04odGFyZ2V0LT50YXJnZXRzaXplKSwgc2l6ZSk7CisJCSAgICAgICB4dF9wcmVmaXhbcGFyLT5mYW1pbHldLCBwYXItPnRhcmdldC0+bmFtZSwKKwkJICAgICAgIFhUX0FMSUdOKHBhci0+dGFyZ2V0LT50YXJnZXRzaXplKSwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAodGFyZ2V0LT50YWJsZSAmJiBzdHJjbXAodGFyZ2V0LT50YWJsZSwgdGFibGUpKSB7CisJaWYgKHBhci0+dGFyZ2V0LT50YWJsZSAhPSBOVUxMICYmCisJICAgIHN0cmNtcChwYXItPnRhcmdldC0+dGFibGUsIHBhci0+dGFibGUpICE9IDApIHsKIAkJcHJpbnRrKCIlc190YWJsZXM6ICVzIHRhcmdldDogb25seSB2YWxpZCBpbiAlcyB0YWJsZSwgbm90ICVzXG4iLAotCQkgICAgICAgeHRfcHJlZml4W2ZhbWlseV0sIHRhcmdldC0+bmFtZSwgdGFyZ2V0LT50YWJsZSwgdGFibGUpOworCQkgICAgICAgeHRfcHJlZml4W3Bhci0+ZmFtaWx5XSwgcGFyLT50YXJnZXQtPm5hbWUsCisJCSAgICAgICBwYXItPnRhcmdldC0+dGFibGUsIHBhci0+dGFibGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKHRhcmdldC0+aG9va3MgJiYgKGhvb2tfbWFzayAmIH50YXJnZXQtPmhvb2tzKSAhPSAwKSB7Ci0JCXByaW50aygiJXNfdGFibGVzOiAlcyB0YXJnZXQ6IGJhZCBob29rX21hc2sgJXUvJXVcbiIsCi0JCSAgICAgICB4dF9wcmVmaXhbZmFtaWx5XSwgdGFyZ2V0LT5uYW1lLCBob29rX21hc2ssCi0JCSAgICAgICB0YXJnZXQtPmhvb2tzKTsKKwlpZiAocGFyLT50YXJnZXQtPmhvb2tzICYmIChwYXItPmhvb2tfbWFzayAmIH5wYXItPnRhcmdldC0+aG9va3MpICE9IDApIHsKKwkJcHJpbnRrKCIlc190YWJsZXM6ICVzIHRhcmdldDogYmFkIGhvb2tfbWFzayAlI3gvJSN4XG4iLAorCQkgICAgICAgeHRfcHJlZml4W3Bhci0+ZmFtaWx5XSwgcGFyLT50YXJnZXQtPm5hbWUsCisJCSAgICAgICBwYXItPmhvb2tfbWFzaywgcGFyLT50YXJnZXQtPmhvb2tzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICh0YXJnZXQtPnByb3RvICYmICh0YXJnZXQtPnByb3RvICE9IHByb3RvIHx8IGludl9wcm90bykpIHsKKwlpZiAocGFyLT50YXJnZXQtPnByb3RvICYmIChwYXItPnRhcmdldC0+cHJvdG8gIT0gcHJvdG8gfHwgaW52X3Byb3RvKSkgewogCQlwcmludGsoIiVzX3RhYmxlczogJXMgdGFyZ2V0OiBvbmx5IHZhbGlkIGZvciBwcm90b2NvbCAldVxuIiwKLQkJICAgICAgIHh0X3ByZWZpeFtmYW1pbHldLCB0YXJnZXQtPm5hbWUsIHRhcmdldC0+cHJvdG8pOworCQkgICAgICAgeHRfcHJlZml4W3Bhci0+ZmFtaWx5XSwgcGFyLT50YXJnZXQtPm5hbWUsCisJCSAgICAgICBwYXItPnRhcmdldC0+cHJvdG8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKHBhci0+dGFyZ2V0LT5jaGVja2VudHJ5ICE9IE5VTEwgJiYgIXBhci0+dGFyZ2V0LT5jaGVja2VudHJ5KHBhcikpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoeHRfY2hlY2tfdGFyZ2V0KTsKQEAgLTU5MCw3ICs2MTgsOCBAQAogRVhQT1JUX1NZTUJPTCh4dF9mcmVlX3RhYmxlX2luZm8pOwogCiAvKiBGaW5kIHRhYmxlIGJ5IG5hbWUsIGdyYWJzIG11dGV4ICYgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdHJ1Y3QgeHRfdGFibGUgKnh0X2ZpbmRfdGFibGVfbG9jayhzdHJ1Y3QgbmV0ICpuZXQsIGludCBhZiwgY29uc3QgY2hhciAqbmFtZSkKK3N0cnVjdCB4dF90YWJsZSAqeHRfZmluZF90YWJsZV9sb2NrKHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgYWYsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IHh0X3RhYmxlICp0OwogCkBAIC02MTIsMTMgKzY0MSwxMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoeHRfdGFibGVfdW5sb2NrKTsKIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXZvaWQgeHRfY29tcGF0X2xvY2soaW50IGFmKQordm9pZCB4dF9jb21wYXRfbG9jayh1X2ludDhfdCBhZikKIHsKIAltdXRleF9sb2NrKCZ4dFthZl0uY29tcGF0X211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHh0X2NvbXBhdF9sb2NrKTsKIAotdm9pZCB4dF9jb21wYXRfdW5sb2NrKGludCBhZikKK3ZvaWQgeHRfY29tcGF0X3VubG9jayh1X2ludDhfdCBhZikKIHsKIAltdXRleF91bmxvY2soJnh0W2FmXS5jb21wYXRfbXV0ZXgpOwogfQpAQCAtNzIyLDEzICs3NTEsMTMgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RydWN0IHh0X25hbWVzX3ByaXYgewogCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKLQlpbnQgYWY7CisJdV9pbnQ4X3QgYWY7CiB9Owogc3RhdGljIHZvaWQgKnh0X3RhYmxlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IHh0X25hbWVzX3ByaXYgKnByaXYgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JaW50IGFmID0gcHJpdi0+YWY7CisJdV9pbnQ4X3QgYWYgPSBwcml2LT5hZjsKIAogCW11dGV4X2xvY2soJnh0W2FmXS5tdXRleCk7CiAJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZuZXQtPnh0LnRhYmxlc1thZl0sICpwb3MpOwpAQCAtNzM4LDcgKzc2Nyw3IEBACiB7CiAJc3RydWN0IHh0X25hbWVzX3ByaXYgKnByaXYgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JaW50IGFmID0gcHJpdi0+YWY7CisJdV9pbnQ4X3QgYWYgPSBwcml2LT5hZjsKIAogCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZuZXQtPnh0LnRhYmxlc1thZl0sIHBvcyk7CiB9CkBAIC03NDYsNyArNzc1LDcgQEAKIHN0YXRpYyB2b2lkIHh0X3RhYmxlX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXN0cnVjdCB4dF9uYW1lc19wcml2ICpwcml2ID0gc2VxLT5wcml2YXRlOwotCWludCBhZiA9IHByaXYtPmFmOworCXVfaW50OF90IGFmID0gcHJpdi0+YWY7CiAKIAltdXRleF91bmxvY2soJnh0W2FmXS5tdXRleCk7CiB9CkBAIC05MjIsMTQgKzk1MSwxNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAotaW50IHh0X3Byb3RvX2luaXQoc3RydWN0IG5ldCAqbmV0LCBpbnQgYWYpCitpbnQgeHRfcHJvdG9faW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50OF90IGFmKQogewogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJY2hhciBidWZbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwogI2VuZGlmCiAKLQlpZiAoYWYgPj0gTlBST1RPKQorCWlmIChhZiA+PSBBUlJBWV9TSVpFKHh0X3ByZWZpeCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAKQEAgLTk3NCw3ICsxMDAzLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHh0X3Byb3RvX2luaXQpOwogCi12b2lkIHh0X3Byb3RvX2Zpbmkoc3RydWN0IG5ldCAqbmV0LCBpbnQgYWYpCit2b2lkIHh0X3Byb3RvX2Zpbmkoc3RydWN0IG5ldCAqbmV0LCB1X2ludDhfdCBhZikKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWNoYXIgYnVmW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwpAQCAtOTk4LDcgKzEwMjcsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE5QUk9UTzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBORlBST1RPX05VTVBST1RPOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKCZuZXQtPnh0LnRhYmxlc1tpXSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDExLDExICsxMDQwLDExIEBACiB7CiAJaW50IGksIHJ2OwogCi0JeHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeHRfYWYpICogTlBST1RPLCBHRlBfS0VSTkVMKTsKKwl4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4dF9hZikgKiBORlBST1RPX05VTVBST1RPLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXh0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaSA9IDA7IGkgPCBOUFJPVE87IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBORlBST1RPX05VTVBST1RPOyBpKyspIHsKIAkJbXV0ZXhfaW5pdCgmeHRbaV0ubXV0ZXgpOwogI2lmZGVmIENPTkZJR19DT01QQVQKIAkJbXV0ZXhfaW5pdCgmeHRbaV0uY29tcGF0X211dGV4KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwppbmRleCA3N2E1MmJmLi4wMTFiYzgwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCkBAIC0yNyw1MCArMjcsMzQgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9DTEFTU0lGWSIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1jbGFzc2lmeV90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitjbGFzc2lmeV90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8gKmNsaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlza2ItPnByaW9yaXR5ID0gY2xpbmZvLT5wcmlvcml0eTsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsYXNzaWZ5X3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5uYW1lIAkJPSAiQ0xBU1NJRlkiLAotCQkudGFyZ2V0IAk9IGNsYXNzaWZ5X3RnLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pLAotCQkudGFibGUJCT0gIm1hbmdsZSIsCi0JCS5ob29rcwkJPSAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkgfAotCQkJCSAgKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8Ci0JCQkJICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORyksCi0JCS5tZSAJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lIAkJPSAiQ0xBU1NJRlkiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCQkudGFyZ2V0IAk9IGNsYXNzaWZ5X3RnLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pLAotCQkudGFibGUJCT0gIm1hbmdsZSIsCi0JCS5ob29rcwkJPSAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkgfAotCQkJCSAgKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8Ci0JCQkJICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORyksCi0JCS5tZSAJCT0gVEhJU19NT0RVTEUsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsYXNzaWZ5X3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lICAgICAgID0gIkNMQVNTSUZZIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkudGFibGUgICAgICA9ICJtYW5nbGUiLAorCS5ob29rcyAgICAgID0gKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8CisJCSAgICAgICgxIDw8IE5GX0lORVRfUE9TVF9ST1VUSU5HKSwKKwkudGFyZ2V0ICAgICA9IGNsYXNzaWZ5X3RnLAorCS50YXJnZXRzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNsYXNzaWZ5X3RnX2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyhjbGFzc2lmeV90Z19yZWcsCi0JICAgICAgIEFSUkFZX1NJWkUoY2xhc3NpZnlfdGdfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmY2xhc3NpZnlfdGdfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNsYXNzaWZ5X3RnX2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldHMoY2xhc3NpZnlfdGdfcmVnLCBBUlJBWV9TSVpFKGNsYXNzaWZ5X3RnX3JlZykpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZjbGFzc2lmeV90Z19yZWcpOwogfQogCiBtb2R1bGVfaW5pdChjbGFzc2lmeV90Z19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwppbmRleCA1ZmVjZmI0Li5kNmU1YWI0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCkBAIC0zNiwxMSArMzYsOSBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1jb25ubWFya190Z192MChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitjb25ubWFya190Z192MChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1X2ludDMyX3QgZGlmZjsKQEAgLTU0LDcgKzUyLDcgQEAKIAkJCW5ld21hcmsgPSAoY3QtPm1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwgbWFya2luZm8tPm1hcms7CiAJCQlpZiAobmV3bWFyayAhPSBjdC0+bWFyaykgewogCQkJCWN0LT5tYXJrID0gbmV3bWFyazsKLQkJCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBza2IpOworCQkJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssIGN0KTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5NQVJLX1NBVkU6CkBAIC02Miw3ICs2MCw3IEBACiAJCQkJICAoc2tiLT5tYXJrICYgbWFya2luZm8tPm1hc2spOwogCQkJaWYgKGN0LT5tYXJrICE9IG5ld21hcmspIHsKIAkJCQljdC0+bWFyayA9IG5ld21hcms7Ci0JCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgc2tiKTsKKwkJCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBjdCk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBYVF9DT05OTUFSS19SRVNUT1JFOgpAQCAtNzcsMTEgKzc1LDkgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotY29ubm1hcmtfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQorY29ubm1hcmtfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya190Z2luZm8xICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RnaW5mbzEgKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXN0cnVjdCBuZl9jb25uICpjdDsKIAl1X2ludDMyX3QgbmV3bWFyazsKQEAgLTk1LDcgKzkxLDcgQEAKIAkJbmV3bWFyayA9IChjdC0+bWFyayAmIH5pbmZvLT5jdG1hc2spIF4gaW5mby0+Y3RtYXJrOwogCQlpZiAoY3QtPm1hcmsgIT0gbmV3bWFyaykgewogCQkJY3QtPm1hcmsgPSBuZXdtYXJrOwotCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgc2tiKTsKKwkJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssIGN0KTsKIAkJfQogCQlicmVhazsKIAljYXNlIFhUX0NPTk5NQVJLX1NBVkU6CkBAIC0xMDMsNyArOTksNyBAQAogCQkgICAgICAgICAgKHNrYi0+bWFyayAmIGluZm8tPm5mbWFzayk7CiAJCWlmIChjdC0+bWFyayAhPSBuZXdtYXJrKSB7CiAJCQljdC0+bWFyayA9IG5ld21hcms7Ci0JCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCBza2IpOworCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfTUFSSywgY3QpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgWFRfQ09OTk1BUktfUkVTVE9SRToKQEAgLTExNiwxOCArMTEyLDE1IEBACiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgYm9vbAotY29ubm1hcmtfdGdfY2hlY2tfdjAoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgY29ubm1hcmtfdGdfY2hlY2tfdjAoY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXRjaGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobWF0Y2hpbmZvLT5tb2RlID09IFhUX0NPTk5NQVJLX1JFU1RPUkUpIHsKLQkJaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CisJCWlmIChzdHJjbXAocGFyLT50YWJsZSwgIm1hbmdsZSIpICE9IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNPTk5NQVJLOiByZXN0b3JlIGNhbiBvbmx5IGJlICIKIAkJCSAgICAgICAiY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwKLQkJCSAgICAgICB0YWJsZW5hbWUpOworCQkJICAgICAgIHBhci0+dGFibGUpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfQpAQCAtMTM1LDMxICsxMjgsMjcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IE9ubHkgc3VwcG9ydHMgMzJiaXQgbWFya1xuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodGFyZ2V0LT5mYW1pbHkpIDwgMCkgeworCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHBhci0+ZmFtaWx5KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkJCSAgICAicHJvdG89JXVcbiIsIHRhcmdldC0+ZmFtaWx5KTsKKwkJCQkgICAgInByb3RvPSV1XG4iLCBwYXItPmZhbWlseSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1jb25ubWFya190Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBjb25ubWFya190Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh0YXJnZXQtPmZhbWlseSkgPCAwKSB7CisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW5ub3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkgICAgICAgInByb3RvPSV1XG4iLCB0YXJnZXQtPmZhbWlseSk7CisJCSAgICAgICAicHJvdG89JXVcbiIsIHBhci0+ZmFtaWx5KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5tYXJrX3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbykKK3N0YXRpYyB2b2lkIGNvbm5tYXJrX3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RnZHRvcl9wYXJhbSAqcGFyKQogewotCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh0YXJnZXQtPmZhbWlseSk7CisJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHBhci0+ZmFtaWx5KTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKQEAgLTE5NywyMiArMTg2LDcgQEAKIAl7CiAJCS5uYW1lCQk9ICJDT05OTUFSSyIsCiAJCS5yZXZpc2lvbgk9IDAsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLmNoZWNrZW50cnkJPSBjb25ubWFya190Z19jaGVja192MCwKLQkJLmRlc3Ryb3kJPSBjb25ubWFya190Z19kZXN0cm95LAotCQkudGFyZ2V0CQk9IGNvbm5tYXJrX3RnX3YwLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF94dF9jb25ubWFya190YXJnZXRfaW5mbyksCi0JCS5jb21wYXRfZnJvbV91c2VyID0gY29ubm1hcmtfdGdfY29tcGF0X2Zyb21fdXNlcl92MCwKLQkJLmNvbXBhdF90b191c2VyCT0gY29ubm1hcmtfdGdfY29tcGF0X3RvX3VzZXJfdjAsCi0jZW5kaWYKLQkJLm1lCQk9IFRISVNfTU9EVUxFCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJDT05OTUFSSyIsCi0JCS5yZXZpc2lvbgk9IDAsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19VTlNQRUMsCiAJCS5jaGVja2VudHJ5CT0gY29ubm1hcmtfdGdfY2hlY2tfdjAsCiAJCS5kZXN0cm95CT0gY29ubm1hcmtfdGdfZGVzdHJveSwKIAkJLnRhcmdldAkJPSBjb25ubWFya190Z192MCwKQEAgLTIyNywxNyArMjAxLDcgQEAKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJDT05OTUFSSyIsCiAJCS5yZXZpc2lvbiAgICAgICA9IDEsCi0JCS5mYW1pbHkgICAgICAgICA9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5ICAgICA9IGNvbm5tYXJrX3RnX2NoZWNrLAotCQkudGFyZ2V0ICAgICAgICAgPSBjb25ubWFya190ZywKLQkJLnRhcmdldHNpemUgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190Z2luZm8xKSwKLQkJLmRlc3Ryb3kgICAgICAgID0gY29ubm1hcmtfdGdfZGVzdHJveSwKLQkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgICAgICA9ICJDT05OTUFSSyIsCi0JCS5yZXZpc2lvbiAgICAgICA9IDEsCi0JCS5mYW1pbHkgICAgICAgICA9IEFGX0lORVQ2LAorCQkuZmFtaWx5ICAgICAgICAgPSBORlBST1RPX1VOU1BFQywKIAkJLmNoZWNrZW50cnkgICAgID0gY29ubm1hcmtfdGdfY2hlY2ssCiAJCS50YXJnZXQgICAgICAgICA9IGNvbm5tYXJrX3RnLAogCQkudGFyZ2V0c2l6ZSAgICAgPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX3RnaW5mbzEpLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCmluZGV4IDc2Y2ExZjIuLmI1NGMzNzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKIAkJaWYgKGN0ICYmICFjdC0+c2VjbWFyaykgewogCQkJY3QtPnNlY21hcmsgPSBza2ItPnNlY21hcms7Ci0JCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TRUNNQVJLLCBza2IpOworCQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU0VDTUFSSywgY3QpOwogCQl9CiAJfQogfQpAQCAtNjUsMTEgKzY1LDkgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotY29ubnNlY21hcmtfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQorY29ubnNlY21hcmtfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9jb25uc2VjbWFya190YXJnZXRfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25uc2VjbWFya190YXJnZXRfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlzd2l0Y2ggKGluZm8tPm1vZGUpIHsKIAljYXNlIENPTk5TRUNNQVJLX1NBVkU6CkBAIC04NywxNiArODUsMTQgQEAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi1jb25uc2VjbWFya190Z19jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBjb25uc2VjbWFya190Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAmJiBzdHJjbXAodGFibGVuYW1lLCAic2VjdXJpdHkiKSkgeworCWlmIChzdHJjbXAocGFyLT50YWJsZSwgIm1hbmdsZSIpICE9IDAgJiYKKwkgICAgc3RyY21wKHBhci0+dGFibGUsICJzZWN1cml0eSIpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRhcmdldCBvbmx5IHZhbGlkIGluIHRoZSBcJ21hbmdsZVwnICIKLQkJICAgICAgICJvciBcJ3NlY3VyaXR5XCcgdGFibGVzLCBub3QgXCclc1wnLlxuIiwgdGFibGVuYW1lKTsKKwkJICAgICAgICJvciBcJ3NlY3VyaXR5XCcgdGFibGVzLCBub3QgXCclc1wnLlxuIiwgcGFyLT50YWJsZSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTExMCw1MSArMTA2LDM4IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh0YXJnZXQtPmZhbWlseSkgPCAwKSB7CisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCi0JCQkJICAgICJwcm90bz0ldVxuIiwgdGFyZ2V0LT5mYW1pbHkpOworCQkJCSAgICAicHJvdG89JXVcbiIsIHBhci0+ZmFtaWx5KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5zZWNtYXJrX3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbykKK3N0YXRpYyB2b2lkIGNvbm5zZWNtYXJrX3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RnZHRvcl9wYXJhbSAqcGFyKQogewotCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh0YXJnZXQtPmZhbWlseSk7CisJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHBhci0+ZmFtaWx5KTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY29ubnNlY21hcmtfdGdfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJDT05OU0VDTUFSSyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLmNoZWNrZW50cnkJPSBjb25uc2VjbWFya190Z19jaGVjaywKLQkJLmRlc3Ryb3kJPSBjb25uc2VjbWFya190Z19kZXN0cm95LAotCQkudGFyZ2V0CQk9IGNvbm5zZWNtYXJrX3RnLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJDT05OU0VDTUFSSyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5jaGVja2VudHJ5CT0gY29ubnNlY21hcmtfdGdfY2hlY2ssCi0JCS5kZXN0cm95CT0gY29ubnNlY21hcmtfdGdfZGVzdHJveSwKLQkJLnRhcmdldAkJPSBjb25uc2VjbWFya190ZywKLQkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5zZWNtYXJrX3RhcmdldF9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBjb25uc2VjbWFya190Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJDT05OU0VDTUFSSyIsCisJLnJldmlzaW9uICAgPSAwLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLmNoZWNrZW50cnkgPSBjb25uc2VjbWFya190Z19jaGVjaywKKwkuZGVzdHJveSAgICA9IGNvbm5zZWNtYXJrX3RnX2Rlc3Ryb3ksCisJLnRhcmdldCAgICAgPSBjb25uc2VjbWFya190ZywKKwkudGFyZ2V0c2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8pLAorCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjb25uc2VjbWFya190Z19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldHMoY29ubnNlY21hcmtfdGdfcmVnLAotCSAgICAgICBBUlJBWV9TSVpFKGNvbm5zZWNtYXJrX3RnX3JlZykpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJmNvbm5zZWNtYXJrX3RnX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjb25uc2VjbWFya190Z19leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXRzKGNvbm5zZWNtYXJrX3RnX3JlZywKLQkgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShjb25uc2VjbWFya190Z19yZWcpKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmY29ubnNlY21hcmtfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoY29ubnNlY21hcmtfdGdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0RTQ1AuYyBiL25ldC9uZXRmaWx0ZXIveHRfRFNDUC5jCmluZGV4IDk3ZWZkNzQuLjZhMzQ3ZTcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfRFNDUC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfRFNDUC5jCkBAIC0yOSwxMSArMjksOSBAQAogTU9EVUxFX0FMSUFTKCJpcDZ0X1RPUyIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1kc2NwX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitkc2NwX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfRFNDUF9pbmZvICpkaW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmRpbmZvID0gcGFyLT50YXJnaW5mbzsKIAl1X2ludDhfdCBkc2NwID0gaXB2NF9nZXRfZHNmaWVsZChpcF9oZHIoc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKIAogCWlmIChkc2NwICE9IGRpbmZvLT5kc2NwKSB7CkBAIC00OCwxMSArNDYsOSBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1kc2NwX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitkc2NwX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X0RTQ1BfaW5mbyAqZGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfRFNDUF9pbmZvICpkaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJdV9pbnQ4X3QgZHNjcCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2Nl9oZHIoc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKIAogCWlmIChkc2NwICE9IGRpbmZvLT5kc2NwKSB7CkBAIC02NSwyNiArNjEsMjEgQEAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi1kc2NwX3RnX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZV92b2lkLAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgZHNjcF90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCB1X2ludDhfdCBkc2NwID0gKChzdHJ1Y3QgeHRfRFNDUF9pbmZvICopdGFyZ2luZm8pLT5kc2NwOworCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKGRzY3AgPiBYVF9EU0NQX01BWCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEU0NQOiBkc2NwICV4IG91dCBvZiByYW5nZVxuIiwgZHNjcCk7CisJaWYgKGluZm8tPmRzY3AgPiBYVF9EU0NQX01BWCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEU0NQOiBkc2NwICV4IG91dCBvZiByYW5nZVxuIiwgaW5mby0+ZHNjcCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXRvc190Z192MChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK3Rvc190Z192MChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAl1X2ludDhfdCBvbGR0b3M7CiAKQEAgLTEwMSwxMiArOTIsMTAgQEAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi10b3NfdGdfY2hlY2tfdjAoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplX3ZvaWQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbywKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgdG9zX3RnX2NoZWNrX3YwKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHVfaW50OF90IHRvcyA9ICgoc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8gKil0YXJnaW5mbyktPnRvczsKKwljb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisJY29uc3QgdWludDhfdCB0b3MgPSBpbmZvLT50b3M7CiAKIAlpZiAodG9zICE9IElQVE9TX0xPV0RFTEFZICYmIHRvcyAhPSBJUFRPU19USFJPVUdIUFVUICYmCiAJICAgIHRvcyAhPSBJUFRPU19SRUxJQUJJTElUWSAmJiB0b3MgIT0gSVBUT1NfTUlOQ09TVCAmJgpAQCAtMTE5LDExICsxMDgsOSBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci10b3NfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit0b3NfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90b3NfdGFyZ2V0X2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXVfaW50OF90IG9yaWcsIG52OwogCkBAIC0xNDEsMTEgKzEyOCw5IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXRvc190ZzYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCBjb25zdCB2b2lkICp0YXJnaW5mbykKK3Rvc190ZzYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90b3NfdGFyZ2V0X2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAl1X2ludDhfdCBvcmlnLCBudjsKIApAQCAtMTY1LDcgKzE1MCw3IEBACiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBkc2NwX3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAiRFNDUCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJCS5jaGVja2VudHJ5CT0gZHNjcF90Z19jaGVjaywKIAkJLnRhcmdldAkJPSBkc2NwX3RnLAogCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfRFNDUF9pbmZvKSwKQEAgLTE3NCw3ICsxNTksNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAiRFNDUCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkuY2hlY2tlbnRyeQk9IGRzY3BfdGdfY2hlY2ssCiAJCS50YXJnZXQJCT0gZHNjcF90ZzYsCiAJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9EU0NQX2luZm8pLApAQCAtMTg0LDcgKzE2OSw3IEBACiAJewogCQkubmFtZQkJPSAiVE9TIiwKIAkJLnJldmlzaW9uCT0gMCwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLnRhYmxlCQk9ICJtYW5nbGUiLAogCQkudGFyZ2V0CQk9IHRvc190Z192MCwKIAkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8pLApAQCAtMTk0LDcgKzE3OSw3IEBACiAJewogCQkubmFtZQkJPSAiVE9TIiwKIAkJLnJldmlzaW9uCT0gMSwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLnRhYmxlCQk9ICJtYW5nbGUiLAogCQkudGFyZ2V0CQk9IHRvc190ZywKIAkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3Rvc190YXJnZXRfaW5mbyksCkBAIC0yMDMsNyArMTg4LDcgQEAKIAl7CiAJCS5uYW1lCQk9ICJUT1MiLAogCQkucmV2aXNpb24JPSAxLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLnRhYmxlCQk9ICJtYW5nbGUiLAogCQkudGFyZ2V0CQk9IHRvc190ZzYsCiAJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF90b3NfdGFyZ2V0X2luZm8pLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYwppbmRleCBmOWNlMjBiLi42NzU3NGJjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYwpAQCAtMjUsMjIgKzI1LDE4IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfTUFSSyIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1tYXJrX3RnX3YwKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCittYXJrX3RnX3YwKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJc2tiLT5tYXJrID0gbWFya2luZm8tPm1hcms7CiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1tYXJrX3RnX3YxKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCittYXJrX3RnX3YxKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSAqbWFya2luZm8gPSBwYXItPnRhcmdpbmZvOwogCWludCBtYXJrID0gMDsKIAogCXN3aXRjaCAobWFya2luZm8tPm1vZGUpIHsKQEAgLTYyLDIyICs1OCwxNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1tYXJrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCittYXJrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfbWFya190Z2luZm8yICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfdGdpbmZvMiAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlza2ItPm1hcmsgPSAoc2tiLT5tYXJrICYgfmluZm8tPm1hc2spIF4gaW5mby0+bWFyazsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBib29sCi1tYXJrX3RnX2NoZWNrX3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBtYXJrX3RnX2NoZWNrX3YwKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobWFya2luZm8tPm1hcmsgPiAweGZmZmZmZmZmKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IE9ubHkgc3VwcG9ydHMgMzJiaXQgd2lkZSBtYXJrXG4iKTsKQEAgLTg2LDEyICs3Nyw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1tYXJrX3RnX2NoZWNrX3YxKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBtYXJrX3RnX2NoZWNrX3YxKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAobWFya2luZm8tPm1vZGUgIT0gWFRfTUFSS19TRVQKIAkgICAgJiYgbWFya2luZm8tPm1vZGUgIT0gWFRfTUFSS19BTkQKQEAgLTE2MSw3ICsxNDksNyBAQAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbWFya190Z19yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewogCXsKIAkJLm5hbWUJCT0gIk1BUksiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19VTlNQRUMsCiAJCS5yZXZpc2lvbgk9IDAsCiAJCS5jaGVja2VudHJ5CT0gbWFya190Z19jaGVja192MCwKIAkJLnRhcmdldAkJPSBtYXJrX3RnX3YwLApAQCAtMTc2LDM3ICsxNjQsNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAiTUFSSyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLnJldmlzaW9uCT0gMSwKLQkJLmNoZWNrZW50cnkJPSBtYXJrX3RnX2NoZWNrX3YxLAotCQkudGFyZ2V0CQk9IG1hcmtfdGdfdjEsCi0JCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxKSwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JCS5jb21wYXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfeHRfbWFya190YXJnZXRfaW5mb192MSksCi0JCS5jb21wYXRfZnJvbV91c2VyID0gbWFya190Z19jb21wYXRfZnJvbV91c2VyX3YxLAotCQkuY29tcGF0X3RvX3VzZXIJPSBtYXJrX3RnX2NvbXBhdF90b191c2VyX3YxLAotI2VuZGlmCi0JCS50YWJsZQkJPSAibWFuZ2xlIiwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZQkJPSAiTUFSSyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5yZXZpc2lvbgk9IDAsCi0JCS5jaGVja2VudHJ5CT0gbWFya190Z19jaGVja192MCwKLQkJLnRhcmdldAkJPSBtYXJrX3RnX3YwLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyksCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQkuY29tcGF0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X21hcmtfdGFyZ2V0X2luZm8pLAotCQkuY29tcGF0X2Zyb21fdXNlciA9IG1hcmtfdGdfY29tcGF0X2Zyb21fdXNlcl92MCwKLQkJLmNvbXBhdF90b191c2VyCT0gbWFya190Z19jb21wYXRfdG9fdXNlcl92MCwKLSNlbmRpZgotCQkudGFibGUJCT0gIm1hbmdsZSIsCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIk1BUksiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fVU5TUEVDLAogCQkucmV2aXNpb24JPSAxLAogCQkuY2hlY2tlbnRyeQk9IG1hcmtfdGdfY2hlY2tfdjEsCiAJCS50YXJnZXQJCT0gbWFya190Z192MSwKQEAgLTIyMiwxNSArMTgwLDcgQEAKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJNQVJLIiwKIAkJLnJldmlzaW9uICAgICAgID0gMiwKLQkJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVCwKLQkJLnRhcmdldCAgICAgICAgID0gbWFya190ZywKLQkJLnRhcmdldHNpemUgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RnaW5mbzIpLAotCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUgICAgICAgICAgID0gIk1BUksiLAotCQkucmV2aXNpb24gICAgICAgPSAyLAotCQkuZmFtaWx5ICAgICAgICAgPSBBRl9JTkVUNiwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19VTlNQRUMsCiAJCS50YXJnZXQgICAgICAgICA9IG1hcmtfdGcsCiAJCS50YXJnZXRzaXplICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfbWFya190Z2luZm8yKSwKIAkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMKaW5kZXggMTlhZThlZi4uNTBlM2E1MiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9ORkxPRy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTkZMT0cuYwpAQCAtMjEsMTEgKzIxLDkgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9ORkxPRyIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1uZmxvZ190ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCituZmxvZ190ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X25mbG9nX2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbmZsb2dfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAJc3RydWN0IG5mX2xvZ2luZm8gbGk7CiAKIAlsaS50eXBlCQkgICAgID0gTkZfTE9HX1RZUEVfVUxPRzsKQEAgLTMzLDE3ICszMSwxNCBAQAogCWxpLnUudWxvZy5ncm91cAkgICAgID0gaW5mby0+Z3JvdXA7CiAJbGkudS51bG9nLnF0aHJlc2hvbGQgPSBpbmZvLT50aHJlc2hvbGQ7CiAKLQluZl9sb2dfcGFja2V0KHRhcmdldC0+ZmFtaWx5LCBob29rbnVtLCBza2IsIGluLCBvdXQsICZsaSwKLQkJICAgICAgIiVzIiwgaW5mby0+cHJlZml4KTsKKwluZl9sb2dfcGFja2V0KHBhci0+ZmFtaWx5LCBwYXItPmhvb2tudW0sIHNrYiwgcGFyLT5pbiwKKwkgICAgICAgICAgICAgIHBhci0+b3V0LCAmbGksICIlcyIsIGluZm8tPnByZWZpeCk7CiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgYm9vbAotbmZsb2dfdGdfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICplbnRyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2V0aW5mbywKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rbWFzaykKK3N0YXRpYyBib29sIG5mbG9nX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9uZmxvZ19pbmZvICppbmZvID0gdGFyZ2V0aW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbmZsb2dfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiB+WFRfTkZMT0dfTUFTSykKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTIsMzMgKzQ3LDI0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IG5mbG9nX3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZQkJPSAiTkZMT0ciLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gbmZsb2dfdGdfY2hlY2ssCi0JCS50YXJnZXQJCT0gbmZsb2dfdGcsCi0JCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9uZmxvZ19pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZQkJPSAiTkZMT0ciLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCQkuY2hlY2tlbnRyeQk9IG5mbG9nX3RnX2NoZWNrLAotCQkudGFyZ2V0CQk9IG5mbG9nX3RnLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfbmZsb2dfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbmZsb2dfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiTkZMT0ciLAorCS5yZXZpc2lvbiAgID0gMCwKKwkuZmFtaWx5ICAgICA9IE5GUFJPVE9fVU5TUEVDLAorCS5jaGVja2VudHJ5ID0gbmZsb2dfdGdfY2hlY2ssCisJLnRhcmdldCAgICAgPSBuZmxvZ190ZywKKwkudGFyZ2V0c2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfbmZsb2dfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5mbG9nX3RnX2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyhuZmxvZ190Z19yZWcsIEFSUkFZX1NJWkUobmZsb2dfdGdfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmbmZsb2dfdGdfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG5mbG9nX3RnX2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldHMobmZsb2dfdGdfcmVnLCBBUlJBWV9TSVpFKG5mbG9nX3RnX3JlZykpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZuZmxvZ190Z19yZWcpOwogfQogCiBtb2R1bGVfaW5pdChuZmxvZ190Z19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTkZRVUVVRS5jIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKaW5kZXggYmViMjRkMS4uMmNjMWZmZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKQEAgLTI0LDExICsyNCw5IEBACiBNT0RVTEVfQUxJQVMoImFycHRfTkZRVUVVRSIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1uZnF1ZXVlX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCituZnF1ZXVlX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfTkZRX2luZm8gKnRpbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X05GUV9pbmZvICp0aW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlyZXR1cm4gTkZfUVVFVUVfTlIodGluZm8tPnF1ZXVlbnVtKTsKIH0KQEAgLTM2LDE0ICszNCwxNCBAQAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbmZxdWV1ZV90Z19yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewogCXsKIAkJLm5hbWUJCT0gIk5GUVVFVUUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkudGFyZ2V0CQk9IG5mcXVldWVfdGcsCiAJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9ORlFfaW5mbyksCiAJCS5tZQkJPSBUSElTX01PRFVMRSwKIAl9LAogCXsKIAkJLm5hbWUJCT0gIk5GUVVFVUUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLnRhcmdldAkJPSBuZnF1ZXVlX3RnLAogCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfTkZRX2luZm8pLAogCQkubWUJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCmluZGV4IDZjOWRlNjEuLmU3YTBhNTQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCkBAIC0xMyw5ICsxMyw3IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfTk9UUkFDSyIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1ub3RyYWNrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitub3RyYWNrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrKT8gSWdub3JlLiAqLwogCWlmIChza2ItPm5mY3QgIT0gTlVMTCkKQEAgLTMyLDMxICszMCwyMyBAQAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbm90cmFja190Z19yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLm5hbWUJCT0gIk5PVFJBQ0siLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS50YXJnZXQJCT0gbm90cmFja190ZywKLQkJLnRhYmxlCQk9ICJyYXciLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJOT1RSQUNLIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLnRhcmdldAkJPSBub3RyYWNrX3RnLAotCQkudGFibGUJCT0gInJhdyIsCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgbm90cmFja190Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgPSAiTk9UUkFDSyIsCisJLnJldmlzaW9uID0gMCwKKwkuZmFtaWx5ICAgPSBORlBST1RPX1VOU1BFQywKKwkudGFyZ2V0ICAgPSBub3RyYWNrX3RnLAorCS50YWJsZSAgICA9ICJyYXciLAorCS5tZSAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbm90cmFja190Z19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldHMobm90cmFja190Z19yZWcsIEFSUkFZX1NJWkUobm90cmFja190Z19yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZub3RyYWNrX3RnX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBub3RyYWNrX3RnX2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldHMobm90cmFja190Z19yZWcsIEFSUkFZX1NJWkUobm90cmFja190Z19yZWcpKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmbm90cmFja190Z19yZWcpOwogfQogCiBtb2R1bGVfaW5pdChub3RyYWNrX3RnX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwppbmRleCA2NGQ2YWQzLi40M2Y1Njc2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwpAQCAtNzEsMTQgKzcxLDkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHh0X3JhdGVlc3RfcHV0KTsKIAogc3RhdGljIHVuc2lnbmVkIGludAoteHRfcmF0ZWVzdF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKK3h0X3JhdGVlc3RfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IHh0X3JhdGVlc3RfdGFyZ2V0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljICpzdGF0cyA9ICZpbmZvLT5lc3QtPmJzdGF0czsKIAogCXNwaW5fbG9ja19iaCgmaW5mby0+ZXN0LT5sb2NrKTsKQEAgLTg5LDE0ICs4NCw5IEBACiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgYm9vbAoteHRfcmF0ZWVzdF90Z19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSBjb25zdCB2b2lkICplbnRyeSwKLQkJCSBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgdm9pZCAqdGFyZ2luZm8sCi0JCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHh0X3JhdGVlc3RfdGdfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgeHRfcmF0ZWVzdF90YXJnZXRfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKIAlzdHJ1Y3QgeHRfcmF0ZWVzdCAqZXN0OwogCXN0cnVjdCB7CiAJCXN0cnVjdCBubGF0dHIJCW9wdDsKQEAgLTE0OSwzMyArMTM5LDIyIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCB4dF9yYXRlZXN0X3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgdm9pZCAqdGFyZ2luZm8pCitzdGF0aWMgdm9pZCB4dF9yYXRlZXN0X3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RnZHRvcl9wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvICppbmZvID0gdGFyZ2luZm87CisJc3RydWN0IHh0X3JhdGVlc3RfdGFyZ2V0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCiAJeHRfcmF0ZWVzdF9wdXQoaW5mby0+ZXN0KTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgeHRfcmF0ZWVzdF90YXJnZXRbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkubmFtZQkJPSAiUkFURUVTVCIsCi0JCS50YXJnZXQJCT0geHRfcmF0ZWVzdF90ZywKLQkJLmNoZWNrZW50cnkJPSB4dF9yYXRlZXN0X3RnX2NoZWNrZW50cnksCi0JCS5kZXN0cm95CT0geHRfcmF0ZWVzdF90Z19kZXN0cm95LAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWVzdF90YXJnZXRfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLm5hbWUJCT0gIlJBVEVFU1QiLAotCQkudGFyZ2V0CQk9IHh0X3JhdGVlc3RfdGcsCi0JCS5jaGVja2VudHJ5CT0geHRfcmF0ZWVzdF90Z19jaGVja2VudHJ5LAotCQkuZGVzdHJveQk9IHh0X3JhdGVlc3RfdGdfZGVzdHJveSwKLQkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3JhdGVlc3RfdGFyZ2V0X2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHh0X3JhdGVlc3RfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiUkFURUVTVCIsCisJLnJldmlzaW9uICAgPSAwLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLnRhcmdldCAgICAgPSB4dF9yYXRlZXN0X3RnLAorCS5jaGVja2VudHJ5ID0geHRfcmF0ZWVzdF90Z19jaGVja2VudHJ5LAorCS5kZXN0cm95ICAgID0geHRfcmF0ZWVzdF90Z19kZXN0cm95LAorCS50YXJnZXRzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvKSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgeHRfcmF0ZWVzdF90Z19pbml0KHZvaWQpCkBAIC0xODYsMTMgKzE2NSwxMiBAQAogCQlJTklUX0hMSVNUX0hFQUQoJnJhdGVlc3RfaGFzaFtpXSk7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZqaGFzaF9ybmQsIHNpemVvZihqaGFzaF9ybmQpKTsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyh4dF9yYXRlZXN0X3RhcmdldCwKLQkJCQkgICBBUlJBWV9TSVpFKHh0X3JhdGVlc3RfdGFyZ2V0KSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmeHRfcmF0ZWVzdF90Z19yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgeHRfcmF0ZWVzdF90Z19maW5pKHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXRzKHh0X3JhdGVlc3RfdGFyZ2V0LCBBUlJBWV9TSVpFKHh0X3JhdGVlc3RfdGFyZ2V0KSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnh0X3JhdGVlc3RfdGdfcmVnKTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1NFQ01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5jCmluZGV4IDk0Zjg3ZWUuLjdhNmY5ZTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5jCkBAIC0yOSwxMiArMjksMTAgQEAKIHN0YXRpYyB1OCBtb2RlOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1zZWNtYXJrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCitzZWNtYXJrX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAl1MzIgc2VjbWFyayA9IDA7Ci0JY29uc3Qgc3RydWN0IHh0X3NlY21hcmtfdGFyZ2V0X2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfc2VjbWFya190YXJnZXRfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CiAKIAlCVUdfT04oaW5mby0+bW9kZSAhPSBtb2RlKTsKIApAQCAtODIsMTYgKzgwLDE0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1zZWNtYXJrX3RnX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBzZWNtYXJrX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9zZWNtYXJrX3RhcmdldF9pbmZvICppbmZvID0gdGFyZ2luZm87CisJc3RydWN0IHh0X3NlY21hcmtfdGFyZ2V0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAmJiBzdHJjbXAodGFibGVuYW1lLCAic2VjdXJpdHkiKSkgeworCWlmIChzdHJjbXAocGFyLT50YWJsZSwgIm1hbmdsZSIpICE9IDAgJiYKKwkgICAgc3RyY21wKHBhci0+dGFibGUsICJzZWN1cml0eSIpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInRhcmdldCBvbmx5IHZhbGlkIGluIHRoZSBcJ21hbmdsZVwnICIKLQkJICAgICAgICJvciBcJ3NlY3VyaXR5XCcgdGFibGVzLCBub3QgXCclc1wnLlxuIiwgdGFibGVuYW1lKTsKKwkJICAgICAgICJvciBcJ3NlY3VyaXR5XCcgdGFibGVzLCBub3QgXCclc1wnLlxuIiwgcGFyLT50YWJsZSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTExNyw3ICsxMTMsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBzZWNtYXJrX3RnX2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbykKK3N0YXRpYyB2b2lkIHNlY21hcmtfdGdfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtICpwYXIpCiB7CiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBTRUNNQVJLX01PREVfU0VMOgpAQCAtMTI1LDM1ICsxMjEsMjUgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHNlY21hcmtfdGdfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJTRUNNQVJLIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkuY2hlY2tlbnRyeQk9IHNlY21hcmtfdGdfY2hlY2ssCi0JCS5kZXN0cm95CT0gc2VjbWFya190Z19kZXN0cm95LAotCQkudGFyZ2V0CQk9IHNlY21hcmtfdGcsCi0JCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zZWNtYXJrX3RhcmdldF9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZQkJPSAiU0VDTUFSSyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5jaGVja2VudHJ5CT0gc2VjbWFya190Z19jaGVjaywKLQkJLmRlc3Ryb3kJPSBzZWNtYXJrX3RnX2Rlc3Ryb3ksCi0JCS50YXJnZXQJCT0gc2VjbWFya190ZywKLQkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3NlY21hcmtfdGFyZ2V0X2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHNlY21hcmtfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiU0VDTUFSSyIsCisJLnJldmlzaW9uICAgPSAwLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLmNoZWNrZW50cnkgPSBzZWNtYXJrX3RnX2NoZWNrLAorCS5kZXN0cm95ICAgID0gc2VjbWFya190Z19kZXN0cm95LAorCS50YXJnZXQgICAgID0gc2VjbWFya190ZywKKwkudGFyZ2V0c2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfc2VjbWFya190YXJnZXRfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNlY21hcmtfdGdfaW5pdCh2b2lkKQogewotCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXRzKHNlY21hcmtfdGdfcmVnLCBBUlJBWV9TSVpFKHNlY21hcmtfdGdfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmc2VjbWFya190Z19yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2VjbWFya190Z19leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXRzKHNlY21hcmtfdGdfcmVnLCBBUlJBWV9TSVpFKHNlY21hcmtfdGdfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnNlY21hcmtfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoc2VjbWFya190Z19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCmluZGV4IGJlYjUwOTQuLjRmM2IxZjggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYwpAQCAtMTc0LDE1ICsxNzQsMTMgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotdGNwbXNzX3RnNChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQordGNwbXNzX3RnNChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlfX2JlMTYgbmV3bGVuOwogCWludCByZXQ7CiAKLQlyZXQgPSB0Y3Btc3NfbWFuZ2xlX3BhY2tldChza2IsIHRhcmdpbmZvLAorCXJldCA9IHRjcG1zc19tYW5nbGVfcGFja2V0KHNrYiwgcGFyLT50YXJnaW5mbywKIAkJCQkgICB0Y3Btc3NfcmV2ZXJzZV9tdHUoc2tiLCBQRl9JTkVUKSwKIAkJCQkgICBpcGgtPmlobCAqIDQsCiAJCQkJICAgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKQEAgLTE5OSw5ICsxOTcsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQogc3RhdGljIHVuc2lnbmVkIGludAotdGNwbXNzX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQordGNwbXNzX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAl1OCBuZXh0aGRyOwpAQCAtMjEyLDcgKzIwOCw3IEBACiAJdGNwaG9mZiA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2YoKmlwdjZoKSwgJm5leHRoZHIpOwogCWlmICh0Y3Bob2ZmIDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7Ci0JcmV0ID0gdGNwbXNzX21hbmdsZV9wYWNrZXQoc2tiLCB0YXJnaW5mbywKKwlyZXQgPSB0Y3Btc3NfbWFuZ2xlX3BhY2tldChza2IsIHBhci0+dGFyZ2luZm8sCiAJCQkJICAgdGNwbXNzX3JldmVyc2VfbXR1KHNrYiwgUEZfSU5FVDYpLAogCQkJCSAgIHRjcGhvZmYsCiAJCQkJICAgc2l6ZW9mKCppcHY2aCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwpAQCAtMjQxLDE2ICsyMzcsMTMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sCi10Y3Btc3NfdGc0X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCB0Y3Btc3NfdGc0X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBlbnRyeTsKKwljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBwYXItPmVudHJ5aW5mbzsKIAogCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKLQkgICAgKGhvb2tfbWFzayAmIH4oKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8CisJICAgIChwYXItPmhvb2tfbWFzayAmIH4oKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8CiAJCQkgICAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkgfAogCQkJICAgKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpKSkgIT0gMCkgewogCQlwcmludGsoInh0X1RDUE1TUzogcGF0aC1NVFUgY2xhbXBpbmcgb25seSBzdXBwb3J0ZWQgaW4gIgpAQCAtMjY0LDE2ICsyNTcsMTMgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKLXN0YXRpYyBib29sCi10Y3Btc3NfdGc2X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCB0Y3Btc3NfdGc2X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbyA9IHRhcmdpbmZvOwotCWNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5ICplID0gZW50cnk7CisJY29uc3Qgc3RydWN0IHh0X3RjcG1zc19pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSA9IHBhci0+ZW50cnlpbmZvOwogCiAJaWYgKGluZm8tPm1zcyA9PSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAmJgotCSAgICAoaG9va19tYXNrICYgfigoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwKKwkgICAgKHBhci0+aG9va19tYXNrICYgfigoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwKIAkJCSAgICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8CiAJCQkgICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykpKSAhPSAwKSB7CiAJCXByaW50aygieHRfVENQTVNTOiBwYXRoLU1UVSBjbGFtcGluZyBvbmx5IHN1cHBvcnRlZCBpbiAiCkBAIC0yODksNyArMjc5LDcgQEAKIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgdGNwbXNzX3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkubmFtZQkJPSAiVENQTVNTIiwKIAkJLmNoZWNrZW50cnkJPSB0Y3Btc3NfdGc0X2NoZWNrLAogCQkudGFyZ2V0CQk9IHRjcG1zc190ZzQsCkBAIC0yOTksNyArMjg5LDcgQEAKIAl9LAogI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKIAl7Ci0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkubmFtZQkJPSAiVENQTVNTIiwKIAkJLmNoZWNrZW50cnkJPSB0Y3Btc3NfdGc2X2NoZWNrLAogCQkudGFyZ2V0CQk9IHRjcG1zc190ZzYsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE9QVFNUUklQLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE9QVFNUUklQLmMKaW5kZXggOTY4NWI2Zi4uOWRkOGM4ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UQ1BPUFRTVFJJUC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuYwpAQCAtNzUsMTkgKzc1LDE1IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXRjcG9wdHN0cmlwX3RnNChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotCQljb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQordGNwb3B0c3RyaXBfdGc0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKLQlyZXR1cm4gdGNwb3B0c3RyaXBfbWFuZ2xlX3BhY2tldChza2IsIHRhcmdpbmZvLCBpcF9oZHJsZW4oc2tiKSwKKwlyZXR1cm4gdGNwb3B0c3RyaXBfbWFuZ2xlX3BhY2tldChza2IsIHBhci0+dGFyZ2luZm8sIGlwX2hkcmxlbihza2IpLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfTUFOR0xFKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfTUFOR0xFX01PRFVMRSkKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLXRjcG9wdHN0cmlwX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIHVuc2lnbmVkIGludCBob29rbnVtLAotCQljb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQordGNwb3B0c3RyaXBfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF90YXJnZXRfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOwogCWludCB0Y3Bob2ZmOwpAQCAtOTgsNyArOTQsNyBAQAogCWlmICh0Y3Bob2ZmIDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlyZXR1cm4gdGNwb3B0c3RyaXBfbWFuZ2xlX3BhY2tldChza2IsIHRhcmdpbmZvLCB0Y3Bob2ZmLAorCXJldHVybiB0Y3BvcHRzdHJpcF9tYW5nbGVfcGFja2V0KHNrYiwgcGFyLT50YXJnaW5mbywgdGNwaG9mZiwKIAkgICAgICAgc2l6ZW9mKCppcHY2aCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogfQogI2VuZGlmCkBAIC0xMDYsNyArMTAyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHRjcG9wdHN0cmlwX3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZSAgICAgICA9ICJUQ1BPUFRTVFJJUCIsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVCwKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX0lQVjQsCiAJCS50YWJsZSAgICAgID0gIm1hbmdsZSIsCiAJCS5wcm90byAgICAgID0gSVBQUk9UT19UQ1AsCiAJCS50YXJnZXQgICAgID0gdGNwb3B0c3RyaXBfdGc0LApAQCAtMTE2LDcgKzExMiw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX01BTkdMRSkgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX01BTkdMRV9NT0RVTEUpCiAJewogCQkubmFtZSAgICAgICA9ICJUQ1BPUFRTVFJJUCIsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVDYsCisJCS5mYW1pbHkgICAgID0gTkZQUk9UT19JUFY2LAogCQkudGFibGUgICAgICA9ICJtYW5nbGUiLAogCQkucHJvdG8gICAgICA9IElQUFJPVE9fVENQLAogCQkudGFyZ2V0ICAgICA9IHRjcG9wdHN0cmlwX3RnNiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDBjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogVHJhbnNwYXJlbnQgcHJveHkgc3VwcG9ydCBmb3IgTGludXgvaXB0YWJsZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBCYWxhQml0IElUIEx0ZC4KKyAqIEF1dGhvcjogQmFsYXpzIFNjaGVpZGxlciwgS3Jpc3p0aWFuIEtvdmFjcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfVFBST1hZLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfZGVmcmFnX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3Rwcm94eV90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0X3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwljb25zdCBzdHJ1Y3QgeHRfdHByb3h5X3RhcmdldF9pbmZvICp0Z2kgPSBwYXItPnRhcmdpbmZvOworCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhwOworCXN0cnVjdCBzb2NrICpzazsKKworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksIHNpemVvZihfaGRyKSwgJl9oZHIpOworCWlmIChocCA9PSBOVUxMKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXNrID0gbmZfdHByb3h5X2dldF9zb2NrX3Y0KGRldl9uZXQoc2tiLT5kZXYpLCBpcGgtPnByb3RvY29sLAorCQkJCSAgIGlwaC0+c2FkZHIsIHRnaS0+bGFkZHIgPyB0Z2ktPmxhZGRyIDogaXBoLT5kYWRkciwKKwkJCQkgICBocC0+c291cmNlLCB0Z2ktPmxwb3J0ID8gdGdpLT5scG9ydCA6IGhwLT5kZXN0LAorCQkJCSAgIHBhci0+aW4sIHRydWUpOworCisJLyogTk9URTogYXNzaWduX3NvY2sgY29uc3VtZXMgb3VyIHNrIHJlZmVyZW5jZSAqLworCWlmIChzayAmJiBuZl90cHJveHlfYXNzaWduX3NvY2soc2tiLCBzaykpIHsKKwkJLyogVGhpcyBzaG91bGQgYmUgaW4gYSBzZXBhcmF0ZSB0YXJnZXQsIGJ1dCB3ZSBkb24ndCBkbyBtdWx0aXBsZQorCQkgICB0YXJnZXRzIG9uIHRoZSBzYW1lIHJ1bGUgeWV0ICovCisJCXNrYi0+bWFyayA9IChza2ItPm1hcmsgJiB+dGdpLT5tYXJrX21hc2spIF4gdGdpLT5tYXJrX3ZhbHVlOworCisJCXByX2RlYnVnKCJyZWRpcmVjdGluZzogcHJvdG8gJXUgJTA4eDoldSAtPiAlMDh4OiV1LCBtYXJrOiAleFxuIiwKKwkJCSBpcGgtPnByb3RvY29sLCBudG9obChpcGgtPmRhZGRyKSwgbnRvaHMoaHAtPmRlc3QpLAorCQkJIG50b2hsKHRnaS0+bGFkZHIpLCBudG9ocyh0Z2ktPmxwb3J0KSwgc2tiLT5tYXJrKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwlwcl9kZWJ1Zygibm8gc29ja2V0LCBkcm9wcGluZzogcHJvdG8gJXUgJTA4eDoldSAtPiAlMDh4OiV1LCBtYXJrOiAleFxuIiwKKwkJIGlwaC0+cHJvdG9jb2wsIG50b2hsKGlwaC0+ZGFkZHIpLCBudG9ocyhocC0+ZGVzdCksCisJCSBudG9obCh0Z2ktPmxhZGRyKSwgbnRvaHModGdpLT5scG9ydCksIHNrYi0+bWFyayk7CisJcmV0dXJuIE5GX0RST1A7Cit9CisKK3N0YXRpYyBib29sIHRwcm94eV90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppID0gcGFyLT5lbnRyeWluZm87CisKKwlpZiAoKGktPnByb3RvID09IElQUFJPVE9fVENQIHx8IGktPnByb3RvID09IElQUFJPVE9fVURQKQorCSAgICAmJiAhKGktPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpCisJCXJldHVybiB0cnVlOworCisJcHJfaW5mbygieHRfVFBST1hZOiBDYW4gYmUgdXNlZCBvbmx5IGluIGNvbWJpbmF0aW9uIHdpdGggIgorCQkiZWl0aGVyIC1wIHRjcCBvciAtcCB1ZHBcbiIpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgdHByb3h5X3RnX3JlZyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJUUFJPWFkiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkudGFibGUJCT0gIm1hbmdsZSIsCisJLnRhcmdldAkJPSB0cHJveHlfdGcsCisJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3Rwcm94eV90YXJnZXRfaW5mbyksCisJLmNoZWNrZW50cnkJPSB0cHJveHlfdGdfY2hlY2ssCisJLmhvb2tzCQk9IDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0cHJveHlfdGdfaW5pdCh2b2lkKQoreworCW5mX2RlZnJhZ19pcHY0X2VuYWJsZSgpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJnRwcm94eV90Z19yZWcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHByb3h5X3RnX2V4aXQodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmdHByb3h5X3RnX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KHRwcm94eV90Z19pbml0KTsKK21vZHVsZV9leGl0KHRwcm94eV90Z19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktyaXN6dGlhbiBLb3ZhY3MiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIHRyYW5zcGFyZW50IHByb3h5IChUUFJPWFkpIHRhcmdldCBtb2R1bGUuIik7CitNT0RVTEVfQUxJQVMoImlwdF9UUFJPWFkiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVFJBQ0UuYyBiL25ldC9uZXRmaWx0ZXIveHRfVFJBQ0UuYwppbmRleCAzMGRhYjc5YS4uZmJiMDRiOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UUkFDRS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVFJBQ0UuYwpAQCAtMTEsMzkgKzExLDI5IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfVFJBQ0UiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAotdHJhY2VfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQordHJhY2VfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X3RhcmdldF9wYXJhbSAqcGFyKQogewogCXNrYi0+bmZfdHJhY2UgPSAxOwogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgdHJhY2VfdGdfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJUUkFDRSIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLnRhcmdldAkJPSB0cmFjZV90ZywKLQkJLnRhYmxlCQk9ICJyYXciLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJUUkFDRSIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS50YXJnZXQJCT0gdHJhY2VfdGcsCi0JCS50YWJsZQkJPSAicmF3IiwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCB0cmFjZV90Z19yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJUUkFDRSIsCisJLnJldmlzaW9uICAgPSAwLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLnRhYmxlICAgICAgPSAicmF3IiwKKwkudGFyZ2V0ICAgICA9IHRyYWNlX3RnLAorCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB0cmFjZV90Z19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldHModHJhY2VfdGdfcmVnLCBBUlJBWV9TSVpFKHRyYWNlX3RnX3JlZykpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJnRyYWNlX3RnX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0cmFjZV90Z19leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXRzKHRyYWNlX3RnX3JlZywgQVJSQVlfU0laRSh0cmFjZV90Z19yZWcpKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmdHJhY2VfdGdfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQodHJhY2VfdGdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCmluZGV4IDg5ZjQ3MzYuLmU4MjE3OTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCkBAIC0xNiw0MCArMTYsMjkgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9jb21tZW50Iik7CiAKIHN0YXRpYyBib29sCi1jb21tZW50X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9vZmYsCi0gICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitjb21tZW50X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCS8qIFdlIGFsd2F5cyBtYXRjaCAqLwogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnRfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJjb21tZW50IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkubWF0Y2gJCT0gY29tbWVudF9tdCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29tbWVudF9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjb21tZW50IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLm1hdGNoCQk9IGNvbW1lbnRfbXQsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2NvbW1lbnRfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRQotCX0sCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnRfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICA9ICJjb21tZW50IiwKKwkucmV2aXNpb24gID0gMCwKKwkuZmFtaWx5ICAgID0gTkZQUk9UT19VTlNQRUMsCisJLm1hdGNoICAgICA9IGNvbW1lbnRfbXQsCisJLm1hdGNoc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY29tbWVudF9pbmZvKSwKKwkubWUgICAgICAgID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjb21tZW50X210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhjb21tZW50X210X3JlZywgQVJSQVlfU0laRShjb21tZW50X210X3JlZykpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmY29tbWVudF9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY29tbWVudF9tdF9leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKGNvbW1lbnRfbXRfcmVnLCBBUlJBWV9TSVpFKGNvbW1lbnRfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29tbWVudF9tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChjb21tZW50X210X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKaW5kZXggM2UzOWM0Zi4uOTU1ZTY1OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCkBAIC0xNywxMiArMTcsOSBAQAogTU9EVUxFX0FMSUFTKCJpcDZ0X2Nvbm5ieXRlcyIpOwogCiBzdGF0aWMgYm9vbAotY29ubmJ5dGVzX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2Nvbm5ieXRlc19tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJdV9pbnQ2NF90IHdoYXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIG1ha2UgZ2NjIGhhcHB5ICovCkBAIC05NSwxMiArOTIsOSBAQAogCQlyZXR1cm4gd2hhdCA+PSBzaW5mby0+Y291bnQuZnJvbTsKIH0KIAotc3RhdGljIGJvb2wKLWNvbm5ieXRlc19tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgY29ubmJ5dGVzX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19QS1RTICYmCiAJICAgIHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19CWVRFUyAmJgpAQCAtMTEyLDUxICsxMDYsMzkgQEAKIAkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBYVF9DT05OQllURVNfRElSX0JPVEgpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KG1hdGNoLT5mYW1pbHkpIDwgMCkgeworCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHBhci0+ZmFtaWx5KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkJCSAgICAicHJvdG89JXVcbiIsIG1hdGNoLT5mYW1pbHkpOworCQkJCSAgICAicHJvdG89JXVcbiIsIHBhci0+ZmFtaWx5KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZAotY29ubmJ5dGVzX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQorc3RhdGljIHZvaWQgY29ubmJ5dGVzX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChtYXRjaC0+ZmFtaWx5KTsKKwluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQocGFyLT5mYW1pbHkpOwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5ieXRlc19tdF9yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLm5hbWUJCT0gImNvbm5ieXRlcyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLmNoZWNrZW50cnkJPSBjb25uYnl0ZXNfbXRfY2hlY2ssCi0JCS5tYXRjaAkJPSBjb25uYnl0ZXNfbXQsCi0JCS5kZXN0cm95CT0gY29ubmJ5dGVzX210X2Rlc3Ryb3ksCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCQkuY2hlY2tlbnRyeQk9IGNvbm5ieXRlc19tdF9jaGVjaywKLQkJLm1hdGNoCQk9IGNvbm5ieXRlc19tdCwKLQkJLmRlc3Ryb3kJPSBjb25uYnl0ZXNfbXRfZGVzdHJveSwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUKLQl9LAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25uYnl0ZXNfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiY29ubmJ5dGVzIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkuY2hlY2tlbnRyeSA9IGNvbm5ieXRlc19tdF9jaGVjaywKKwkubWF0Y2ggICAgICA9IGNvbm5ieXRlc19tdCwKKwkuZGVzdHJveSAgICA9IGNvbm5ieXRlc19tdF9kZXN0cm95LAorCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNvbm5ieXRlc19tdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoY29ubmJ5dGVzX210X3JlZywKLQkgICAgICAgQVJSQVlfU0laRShjb25uYnl0ZXNfbXRfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZjb25uYnl0ZXNfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNvbm5ieXRlc19tdF9leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKGNvbm5ieXRlc19tdF9yZWcsIEFSUkFZX1NJWkUoY29ubmJ5dGVzX210X3JlZykpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmNvbm5ieXRlc19tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChjb25uYnl0ZXNfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYwppbmRleCA3MDkwN2Y2Yi4uN2Y0MDRjYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jCkBAIC04Miw5ICs4Miw5IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAogc2FtZV9zb3VyY2VfbmV0KGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYWRkciwKIAkJY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICptYXNrLAotCQljb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnUzLCB1bnNpZ25lZCBpbnQgZmFtaWx5KQorCQljb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnUzLCB1X2ludDhfdCBmYW1pbHkpCiB7Ci0JaWYgKGZhbWlseSA9PSBBRl9JTkVUKSB7CisJaWYgKGZhbWlseSA9PSBORlBST1RPX0lQVjQpIHsKIAkJcmV0dXJuIChhZGRyLT5pcCAmIG1hc2stPmlwKSA9PSAodTMtPmlwICYgbWFzay0+aXApOwogCX0gZWxzZSB7CiAJCXVuaW9uIG5mX2luZXRfYWRkciBsaCwgcmg7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAlpbnQgbWF0Y2hlcyA9IDA7CiAKIAotCWlmIChtYXRjaC0+ZmFtaWx5ID09IEFGX0lORVQ2KQorCWlmIChtYXRjaC0+ZmFtaWx5ID09IE5GUFJPVE9fSVBWNikKIAkJaGFzaCA9ICZkYXRhLT5pcGhhc2hbY29ubmxpbWl0X2lwaGFzaDYoYWRkciwgbWFzayldOwogCWVsc2UKIAkJaGFzaCA9ICZkYXRhLT5pcGhhc2hbY29ubmxpbWl0X2lwaGFzaChhZGRyLT5pcCAmIG1hc2stPmlwKV07CkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCS8qIGNoZWNrIHRoZSBzYXZlZCBjb25uZWN0aW9ucyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb25uLCB0bXAsIGhhc2gsIGxpc3QpIHsKLQkJZm91bmQgICAgPSBfX25mX2Nvbm50cmFja19maW5kKCZjb25uLT50dXBsZSk7CisJCWZvdW5kICAgID0gX19uZl9jb25udHJhY2tfZmluZCgmaW5pdF9uZXQsICZjb25uLT50dXBsZSk7CiAJCWZvdW5kX2N0ID0gTlVMTDsKIAogCQlpZiAoZm91bmQgIT0gTlVMTCkKQEAgLTE3OCwxMiArMTc4LDkgQEAKIH0KIAogc3RhdGljIGJvb2wKLWNvbm5saW1pdF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitjb25ubGltaXRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5saW1pdF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubGltaXRfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuaW9uIG5mX2luZXRfYWRkciBhZGRyOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGVfcHRyID0gJnR1cGxlOwpAQCAtMTk1LDEwICsxOTIsMTAgQEAKIAlpZiAoY3QgIT0gTlVMTCkKIAkJdHVwbGVfcHRyID0gJmN0LT50dXBsZWhhc2hbMF0udHVwbGU7CiAJZWxzZSBpZiAoIW5mX2N0X2dldF90dXBsZXByKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCi0JCQkJICAgIG1hdGNoLT5mYW1pbHksICZ0dXBsZSkpCisJCQkJICAgIHBhci0+ZmFtaWx5LCAmdHVwbGUpKQogCQlnb3RvIGhvdGRyb3A7CiAKLQlpZiAobWF0Y2gtPmZhbWlseSA9PSBBRl9JTkVUNikgeworCWlmIChwYXItPmZhbWlseSA9PSBORlBST1RPX0lQVjYpIHsKIAkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJCW1lbWNweSgmYWRkci5pcDYsICZpcGgtPnNhZGRyLCBzaXplb2YoaXBoLT5zYWRkcikpOwogCX0gZWxzZSB7CkBAIC0yMDgsNDAgKzIwNSwzNyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZpbmZvLT5kYXRhLT5sb2NrKTsKIAljb25uZWN0aW9ucyA9IGNvdW50X3RoZW0oaW5mby0+ZGF0YSwgdHVwbGVfcHRyLCAmYWRkciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1hc2ssIG1hdGNoKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1hc2ssIHBhci0+bWF0Y2gpOwogCXNwaW5fdW5sb2NrX2JoKCZpbmZvLT5kYXRhLT5sb2NrKTsKIAogCWlmIChjb25uZWN0aW9ucyA8IDApIHsKIAkJLyoga21hbGxvYyBmYWlsZWQsIGRyb3AgaXQgZW50aXJlbHkgKi8KLQkJKmhvdGRyb3AgPSB0cnVlOworCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXJldHVybiAoY29ubmVjdGlvbnMgPiBpbmZvLT5saW1pdCkgXiBpbmZvLT5pbnZlcnNlOwogCiAgaG90ZHJvcDoKLQkqaG90ZHJvcCA9IHRydWU7CisJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbAotY29ubmxpbWl0X210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBjb25ubGltaXRfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X2Nvbm5saW1pdF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9jb25ubGltaXRfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQobWF0Y2gtPmZhbWlseSkgPCAwKSB7CisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW5ub3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkgICAgICAgImFkZHJlc3MgZmFtaWx5ICV1XG4iLCBtYXRjaC0+ZmFtaWx5KTsKKwkJICAgICAgICJhZGRyZXNzIGZhbWlseSAldVxuIiwgcGFyLT5mYW1pbHkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyogaW5pdCBwcml2YXRlIGRhdGEgKi8KIAlpbmZvLT5kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHh0X2Nvbm5saW1pdF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGluZm8tPmRhdGEgPT0gTlVMTCkgewotCQluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQobWF0Y2gtPmZhbWlseSk7CisJCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChwYXItPmZhbWlseSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTI1MiwxNiArMjQ2LDE1IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25ubGltaXRfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8pCitzdGF0aWMgdm9pZCBjb25ubGltaXRfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5saW1pdF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubGltaXRfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXN0cnVjdCB4dF9jb25ubGltaXRfY29ubiAqY29ubjsKIAlzdHJ1Y3QgeHRfY29ubmxpbWl0X2Nvbm4gKnRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoID0gaW5mby0+ZGF0YS0+aXBoYXNoOwogCXVuc2lnbmVkIGludCBpOwogCi0JbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KG1hdGNoLT5mYW1pbHkpOworCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChwYXItPmZhbWlseSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbmZvLT5kYXRhLT5pcGhhc2gpOyArK2kpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm4sIHRtcCwgJmhhc2hbaV0sIGxpc3QpIHsKQEAgLTI3Myw0MSArMjY2LDMwIEBACiAJa2ZyZWUoaW5mby0+ZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubmxpbWl0X210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZSAgICAgICA9ICJjb25ubGltaXQiLAotCQkuZmFtaWx5ICAgICA9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5ID0gY29ubmxpbWl0X210X2NoZWNrLAotCQkubWF0Y2ggICAgICA9IGNvbm5saW1pdF9tdCwKLQkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5saW1pdF9pbmZvKSwKLQkJLmRlc3Ryb3kgICAgPSBjb25ubGltaXRfbXRfZGVzdHJveSwKLQkJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUgICAgICAgPSAiY29ubmxpbWl0IiwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVUNiwKLQkJLmNoZWNrZW50cnkgPSBjb25ubGltaXRfbXRfY2hlY2ssCi0JCS5tYXRjaCAgICAgID0gY29ubmxpbWl0X210LAotCQkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfY29ubmxpbWl0X2luZm8pLAotCQkuZGVzdHJveSAgICA9IGNvbm5saW1pdF9tdF9kZXN0cm95LAotCQkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAotCX0sCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5saW1pdF9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJjb25ubGltaXQiLAorCS5yZXZpc2lvbiAgID0gMCwKKwkuZmFtaWx5ICAgICA9IE5GUFJPVE9fVU5TUEVDLAorCS5jaGVja2VudHJ5ID0gY29ubmxpbWl0X210X2NoZWNrLAorCS5tYXRjaCAgICAgID0gY29ubmxpbWl0X210LAorCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF9jb25ubGltaXRfaW5mbyksCisJLmRlc3Ryb3kgICAgPSBjb25ubGltaXRfbXRfZGVzdHJveSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY29ubmxpbWl0X210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhjb25ubGltaXRfbXRfcmVnLAotCSAgICAgICBBUlJBWV9TSVpFKGNvbm5saW1pdF9tdF9yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmNvbm5saW1pdF9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY29ubmxpbWl0X210X2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXMoY29ubmxpbWl0X210X3JlZywgQVJSQVlfU0laRShjb25ubGltaXRfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29ubmxpbWl0X210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGNvbm5saW1pdF9tdF9pbml0KTsKIG1vZHVsZV9leGl0KGNvbm5saW1pdF9tdF9leGl0KTsKLU1PRFVMRV9BVVRIT1IoIkphbiBFbmdlbGhhcmR0IDxqZW5nZWxoQGNvbXB1dGVyZ21iaC5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIkphbiBFbmdlbGhhcmR0IDxqZW5nZWxoQG1lZG96YXMuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IE51bWJlciBvZiBjb25uZWN0aW9ucyBtYXRjaGluZyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJpcHRfY29ubmxpbWl0Iik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKaW5kZXggYWFhMWI5Ni4uODZjYWNhYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwpAQCAtMzQsMTIgKzM0LDkgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9jb25ubWFyayIpOwogCiBzdGF0aWMgYm9vbAotY29ubm1hcmtfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICAgICBib29sICpob3Rkcm9wKQorY29ubm1hcmtfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX210aW5mbzEgKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAljb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAKQEAgLTUxLDEyICs0OCw5IEBACiB9CiAKIHN0YXRpYyBib29sCi1jb25ubWFya19tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitjb25ubWFya19tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIApAQCAtNjcsNDIgKzYxLDM1IEBACiAJcmV0dXJuICgoY3QtPm1hcmsgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKIH0KIAotc3RhdGljIGJvb2wKLWNvbm5tYXJrX210X2NoZWNrX3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgY29ubm1hcmtfbXRfY2hlY2tfdjAoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8gKmNtID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya19pbmZvICpjbSA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKGNtLT5tYXJrID4gMHhmZmZmZmZmZiB8fCBjbS0+bWFzayA+IDB4ZmZmZmZmZmYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29ubm1hcms6IG9ubHkgc3VwcG9ydCAzMmJpdCBtYXJrXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KLQlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChtYXRjaC0+ZmFtaWx5KSA8IDApIHsKKwlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChwYXItPmZhbWlseSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGxvYWQgY29ubnRyYWNrIHN1cHBvcnQgZm9yICIKLQkJCQkgICAgInByb3RvPSV1XG4iLCBtYXRjaC0+ZmFtaWx5KTsKKwkJCQkgICAgInByb3RvPSV1XG4iLCBwYXItPmZhbWlseSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi1jb25ubWFya19tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGNvbm5tYXJrX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KG1hdGNoLT5mYW1pbHkpIDwgMCkgeworCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHBhci0+ZmFtaWx5KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Fubm90IGxvYWQgY29ubnRyYWNrIHN1cHBvcnQgZm9yICIKLQkJICAgICAgICJwcm90bz0ldVxuIiwgbWF0Y2gtPmZhbWlseSk7CisJCSAgICAgICAicHJvdG89JXVcbiIsIHBhci0+ZmFtaWx5KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5tYXJrX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQorc3RhdGljIHZvaWQgY29ubm1hcmtfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCiB7Ci0JbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KG1hdGNoLT5mYW1pbHkpOworCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChwYXItPmZhbWlseSk7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0xNDAsMjIgKzEyNyw3IEBACiAJewogCQkubmFtZQkJPSAiY29ubm1hcmsiLAogCQkucmV2aXNpb24JPSAwLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gY29ubm1hcmtfbXRfY2hlY2tfdjAsCi0JCS5tYXRjaAkJPSBjb25ubWFya19tdF92MCwKLQkJLmRlc3Ryb3kJPSBjb25ubWFya19tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya19pbmZvKSwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JCS5jb21wYXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfeHRfY29ubm1hcmtfaW5mbyksCi0JCS5jb21wYXRfZnJvbV91c2VyID0gY29ubm1hcmtfbXRfY29tcGF0X2Zyb21fdXNlcl92MCwKLQkJLmNvbXBhdF90b191c2VyCT0gY29ubm1hcmtfbXRfY29tcGF0X3RvX3VzZXJfdjAsCi0jZW5kaWYKLQkJLm1lCQk9IFRISVNfTU9EVUxFCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJjb25ubWFyayIsCi0JCS5yZXZpc2lvbgk9IDAsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19VTlNQRUMsCiAJCS5jaGVja2VudHJ5CT0gY29ubm1hcmtfbXRfY2hlY2tfdjAsCiAJCS5tYXRjaAkJPSBjb25ubWFya19tdF92MCwKIAkJLmRlc3Ryb3kJPSBjb25ubWFya19tdF9kZXN0cm95LApAQCAtMTcwLDE3ICsxNDIsNyBAQAogCXsKIAkJLm5hbWUgICAgICAgICAgID0gImNvbm5tYXJrIiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKLQkJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVCwKLQkJLmNoZWNrZW50cnkgICAgID0gY29ubm1hcmtfbXRfY2hlY2ssCi0JCS5tYXRjaCAgICAgICAgICA9IGNvbm5tYXJrX210LAotCQkubWF0Y2hzaXplICAgICAgPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5tYXJrX210aW5mbzEpLAotCQkuZGVzdHJveSAgICAgICAgPSBjb25ubWFya19tdF9kZXN0cm95LAotCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUgICAgICAgICAgID0gImNvbm5tYXJrIiwKLQkJLnJldmlzaW9uICAgICAgID0gMSwKLQkJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVDYsCisJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fVU5TUEVDLAogCQkuY2hlY2tlbnRyeSAgICAgPSBjb25ubWFya19tdF9jaGVjaywKIAkJLm1hdGNoICAgICAgICAgID0gY29ubm1hcmtfbXQsCiAJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfbXRpbmZvMSksCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwppbmRleCBkNjE0MTJmLi4wYjcxMzlmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKQEAgLTI1LDEyICsyNSw5IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfY29ubnRyYWNrIik7CiAKIHN0YXRpYyBib29sCi1jb25udHJhY2tfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICAgICBib29sICpob3Rkcm9wKQorY29ubnRyYWNrX210X3YwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CkBAIC0xMjEsOSArMTE4LDkgQEAKICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqdWFkZHIsCiAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKnVtYXNrLCB1bnNpZ25lZCBpbnQgbDNwcm90bykKIHsKLQlpZiAobDNwcm90byA9PSBBRl9JTkVUKQorCWlmIChsM3Byb3RvID09IE5GUFJPVE9fSVBWNCkKIAkJcmV0dXJuICgoa2FkZHItPmlwIF4gdWFkZHItPmlwKSAmIHVtYXNrLT5pcCkgPT0gMDsKLQllbHNlIGlmIChsM3Byb3RvID09IEFGX0lORVQ2KQorCWVsc2UgaWYgKGwzcHJvdG8gPT0gTkZQUk9UT19JUFY2KQogCQlyZXR1cm4gaXB2Nl9tYXNrZWRfYWRkcl9jbXAoJmthZGRyLT5pbjYsICZ1bWFzay0+aW42LAogCQkgICAgICAgJnVhZGRyLT5pbjYpID09IDA7CiAJZWxzZQpAQCAtMTMzLDcgKzEzMCw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wKIGNvbm50cmFja19tdF9vcmlnc3JjKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfbXRpbmZvMSAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmYW1pbHkpCisJCSAgICAgdV9pbnQ4X3QgZmFtaWx5KQogewogCXJldHVybiBjb25udHJhY2tfYWRkcmNtcCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51MywKIAkgICAgICAgJmluZm8tPm9yaWdzcmNfYWRkciwgJmluZm8tPm9yaWdzcmNfbWFzaywgZmFtaWx5KTsKQEAgLTE0Miw3ICsxMzksNyBAQAogc3RhdGljIGlubGluZSBib29sCiBjb25udHJhY2tfbXRfb3JpZ2RzdChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX210aW5mbzEgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmFtaWx5KQorCQkgICAgIHVfaW50OF90IGZhbWlseSkKIHsKIAlyZXR1cm4gY29ubnRyYWNrX2FkZHJjbXAoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMsCiAJICAgICAgICZpbmZvLT5vcmlnZHN0X2FkZHIsICZpbmZvLT5vcmlnZHN0X21hc2ssIGZhbWlseSk7CkBAIC0xNTEsNyArMTQ4LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbAogY29ubnRyYWNrX210X3JlcGxzcmMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X2Nvbm50cmFja19tdGluZm8xICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZhbWlseSkKKwkJICAgICB1X2ludDhfdCBmYW1pbHkpCiB7CiAJcmV0dXJuIGNvbm50cmFja19hZGRyY21wKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLAogCSAgICAgICAmaW5mby0+cmVwbHNyY19hZGRyLCAmaW5mby0+cmVwbHNyY19tYXNrLCBmYW1pbHkpOwpAQCAtMTYwLDcgKzE1Nyw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wKIGNvbm50cmFja19tdF9yZXBsZHN0KGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfbXRpbmZvMSAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmYW1pbHkpCisJCSAgICAgdV9pbnQ4X3QgZmFtaWx5KQogewogCXJldHVybiBjb25udHJhY2tfYWRkcmNtcCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51MywKIAkgICAgICAgJmluZm8tPnJlcGxkc3RfYWRkciwgJmluZm8tPnJlcGxkc3RfbWFzaywgZmFtaWx5KTsKQEAgLTIwNSwxMiArMjAyLDkgQEAKIH0KIAogc3RhdGljIGJvb2wKLWNvbm50cmFja19tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitjb25udHJhY2tfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm50cmFja19tdGluZm8xICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25uICpjdDsKIAl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CkBAIC0yNDQsMjIgKzIzOCwyMiBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoaW5mby0+bWF0Y2hfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQykKLQkJaWYgKGNvbm50cmFja19tdF9vcmlnc3JjKGN0LCBpbmZvLCBtYXRjaC0+ZmFtaWx5KSBeCisJCWlmIChjb25udHJhY2tfbXRfb3JpZ3NyYyhjdCwgaW5mbywgcGFyLT5mYW1pbHkpIF4KIAkJICAgICEoaW5mby0+aW52ZXJ0X2ZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdTUkMpKQogCQkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGluZm8tPm1hdGNoX2ZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdEU1QpCi0JCWlmIChjb25udHJhY2tfbXRfb3JpZ2RzdChjdCwgaW5mbywgbWF0Y2gtPmZhbWlseSkgXgorCQlpZiAoY29ubnRyYWNrX210X29yaWdkc3QoY3QsIGluZm8sIHBhci0+ZmFtaWx5KSBeCiAJCSAgICAhKGluZm8tPmludmVydF9mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUKSkKIAkJCXJldHVybiBmYWxzZTsKIAogCWlmIChpbmZvLT5tYXRjaF9mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMU1JDKQotCQlpZiAoY29ubnRyYWNrX210X3JlcGxzcmMoY3QsIGluZm8sIG1hdGNoLT5mYW1pbHkpIF4KKwkJaWYgKGNvbm50cmFja19tdF9yZXBsc3JjKGN0LCBpbmZvLCBwYXItPmZhbWlseSkgXgogCQkgICAgIShpbmZvLT5pbnZlcnRfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTFNSQykpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoaW5mby0+bWF0Y2hfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCkKLQkJaWYgKGNvbm50cmFja19tdF9yZXBsZHN0KGN0LCBpbmZvLCBtYXRjaC0+ZmFtaWx5KSBeCisJCWlmIChjb25udHJhY2tfbXRfcmVwbGRzdChjdCwgaW5mbywgcGFyLT5mYW1pbHkpIF4KIAkJICAgICEoaW5mby0+aW52ZXJ0X2ZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExEU1QpKQogCQkJcmV0dXJuIGZhbHNlOwogCkBAIC0yODQsMjMgKzI3OCwxOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbAotY29ubnRyYWNrX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBjb25udHJhY2tfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQobWF0Y2gtPmZhbWlseSkgPCAwKSB7CisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCi0JCQkJICAgICJwcm90bz0ldVxuIiwgbWF0Y2gtPmZhbWlseSk7CisJCQkJICAgICJwcm90bz0ldVxuIiwgcGFyLT5mYW1pbHkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZAotY29ubnRyYWNrX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQorc3RhdGljIHZvaWQgY29ubnRyYWNrX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChtYXRjaC0+ZmFtaWx5KTsKKwluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQocGFyLT5mYW1pbHkpOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtMzU2LDcgKzM0Niw3IEBACiAJewogCQkubmFtZSAgICAgICA9ICJjb25udHJhY2siLAogCQkucmV2aXNpb24gICA9IDAsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVCwKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX0lQVjQsCiAJCS5tYXRjaCAgICAgID0gY29ubnRyYWNrX210X3YwLAogCQkuY2hlY2tlbnRyeSA9IGNvbm50cmFja19tdF9jaGVjaywKIAkJLmRlc3Ryb3kgICAgPSBjb25udHJhY2tfbXRfZGVzdHJveSwKQEAgLTM3MSwxNyArMzYxLDcgQEAKIAl7CiAJCS5uYW1lICAgICAgID0gImNvbm50cmFjayIsCiAJCS5yZXZpc2lvbiAgID0gMSwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVULAotCQkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfY29ubnRyYWNrX210aW5mbzEpLAotCQkubWF0Y2ggICAgICA9IGNvbm50cmFja19tdCwKLQkJLmNoZWNrZW50cnkgPSBjb25udHJhY2tfbXRfY2hlY2ssCi0JCS5kZXN0cm95ICAgID0gY29ubnRyYWNrX210X2Rlc3Ryb3ksCi0JCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgID0gImNvbm50cmFjayIsCi0JCS5yZXZpc2lvbiAgID0gMSwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVUNiwKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKIAkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm50cmFja19tdGluZm8xKSwKIAkJLm1hdGNoICAgICAgPSBjb25udHJhY2tfbXQsCiAJCS5jaGVja2VudHJ5ID0gY29ubnRyYWNrX210X2NoZWNrLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9kY2NwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYwppbmRleCA4YjY1MjIxLi5lNWQzZTg2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYwpAQCAtOTMsMjAgKzkzLDE4IEBACiB9CiAKIHN0YXRpYyBib29sCi1kY2NwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK2RjY3BfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaDsKIAlzdHJ1Y3QgZGNjcF9oZHIgX2RoOwogCi0JaWYgKG9mZnNldCkKKwlpZiAocGFyLT5mcmFnb2ZmICE9IDApCiAJCXJldHVybiBmYWxzZTsKIAotCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9kaCksICZfZGgpOworCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcGFyLT50aG9mZiwgc2l6ZW9mKF9kaCksICZfZGgpOwogCWlmIChkaCA9PSBOVUxMKSB7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTExOCwxNyArMTE2LDE0IEBACiAJCQlYVF9EQ0NQX0RFU1RfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKIAkJJiYgRENDSEVDSyhtYXRjaF90eXBlcyhkaCwgaW5mby0+dHlwZW1hc2spLAogCQkJICAgWFRfRENDUF9UWVBFLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIERDQ0hFQ0sobWF0Y2hfb3B0aW9uKGluZm8tPm9wdGlvbiwgc2tiLCBwcm90b2ZmLCBkaCwKLQkJCQkJaG90ZHJvcCksCisJCSYmIERDQ0hFQ0sobWF0Y2hfb3B0aW9uKGluZm8tPm9wdGlvbiwgc2tiLCBwYXItPnRob2ZmLCBkaCwKKwkJCQkJcGFyLT5ob3Rkcm9wKSwKIAkJCSAgIFhUX0RDQ1BfT1BUSU9OLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpOwogfQogCi1zdGF0aWMgYm9vbAotZGNjcF9tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmluZiwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgZGNjcF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCXJldHVybiAhKGluZm8tPmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCiAJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKQEAgLTEzOCw3ICsxMzMsNyBAQAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBkY2NwX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZSAJCT0gImRjY3AiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkuY2hlY2tlbnRyeQk9IGRjY3BfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBkY2NwX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9kY2NwX2luZm8pLApAQCAtMTQ3LDcgKzE0Miw3IEBACiAJfSwKIAl7CiAJCS5uYW1lIAkJPSAiZGNjcCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkuY2hlY2tlbnRyeQk9IGRjY3BfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBkY2NwX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9kY2NwX2luZm8pLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9kc2NwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYwppbmRleCAyNmY0YWFiLi5jM2Y4MDg1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2RzY3AuYwpAQCAtMjYsNjEgKzI2LDQ4IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfdG9zIik7CiAKIHN0YXRpYyBib29sCi1kc2NwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK2RzY3BfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2RzY3BfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfZHNjcF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJdV9pbnQ4X3QgZHNjcCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBfaGRyKHNrYikpID4+IFhUX0RTQ1BfU0hJRlQ7CiAKIAlyZXR1cm4gKGRzY3AgPT0gaW5mby0+ZHNjcCkgXiAhIWluZm8tPmludmVydDsKIH0KIAogc3RhdGljIGJvb2wKLWRzY3BfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2RzY3BfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9kc2NwX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2RzY3BfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVfaW50OF90IGRzY3AgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpID4+IFhUX0RTQ1BfU0hJRlQ7CiAKIAlyZXR1cm4gKGRzY3AgPT0gaW5mby0+ZHNjcCkgXiAhIWluZm8tPmludmVydDsKIH0KIAotc3RhdGljIGJvb2wKLWRzY3BfbXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppbmZvLAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBkc2NwX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHVfaW50OF90IGRzY3AgPSAoKHN0cnVjdCB4dF9kc2NwX2luZm8gKiltYXRjaGluZm8pLT5kc2NwOworCWNvbnN0IHN0cnVjdCB4dF9kc2NwX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChkc2NwID4gWFRfRFNDUF9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ4dF9kc2NwOiBkc2NwICV4IG91dCBvZiByYW5nZVxuIiwgZHNjcCk7CisJaWYgKGluZm8tPmRzY3AgPiBYVF9EU0NQX01BWCkgeworCQlwcmludGsoS0VSTl9FUlIgInh0X2RzY3A6IGRzY3AgJXggb3V0IG9mIHJhbmdlXG4iLCBpbmZvLT5kc2NwKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCB0b3NfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wKK3Rvc19tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3Rvc19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfdG9zX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCXJldHVybiAoaXBfaGRyKHNrYiktPnRvcyA9PSBpbmZvLT50b3MpIF4gaW5mby0+aW52ZXJ0OwogfQogCi1zdGF0aWMgYm9vbCB0b3NfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICAgICAgICBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgdG9zX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90b3NfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdG9zX21hdGNoX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChtYXRjaC0+ZmFtaWx5ID09IEFGX0lORVQpCisJaWYgKHBhci0+bWF0Y2gtPmZhbWlseSA9PSBORlBST1RPX0lQVjQpCiAJCXJldHVybiAoKGlwX2hkcihza2IpLT50b3MgJiBpbmZvLT50b3NfbWFzaykgPT0KIAkJICAgICAgIGluZm8tPnRvc192YWx1ZSkgXiAhIWluZm8tPmludmVydDsKIAllbHNlCkBAIC05MSw3ICs3OCw3IEBACiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIGRzY3BfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkc2NwIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLmNoZWNrZW50cnkJPSBkc2NwX210X2NoZWNrLAogCQkubWF0Y2gJCT0gZHNjcF9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfZHNjcF9pbmZvKSwKQEAgLTk5LDcgKzg2LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gImRzY3AiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLmNoZWNrZW50cnkJPSBkc2NwX210X2NoZWNrLAogCQkubWF0Y2gJCT0gZHNjcF9tdDYsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2RzY3BfaW5mbyksCkBAIC0xMDgsNyArOTUsNyBAQAogCXsKIAkJLm5hbWUJCT0gInRvcyIsCiAJCS5yZXZpc2lvbgk9IDAsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJCS5tYXRjaAkJPSB0b3NfbXRfdjAsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF90b3NfaW5mbyksCiAJCS5tZQkJPSBUSElTX01PRFVMRSwKQEAgLTExNiw3ICsxMDMsNyBAQAogCXsKIAkJLm5hbWUJCT0gInRvcyIsCiAJCS5yZXZpc2lvbgk9IDEsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJCS5tYXRjaAkJPSB0b3NfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3Rvc19tYXRjaF9pbmZvKSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFLApAQCAtMTI0LDcgKzExMSw3IEBACiAJewogCQkubmFtZQkJPSAidG9zIiwKIAkJLnJldmlzaW9uCT0gMSwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5tYXRjaAkJPSB0b3NfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3Rvc19tYXRjaF9pbmZvKSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9lc3AuYyBiL25ldC9uZXRmaWx0ZXIveHRfZXNwLmMKaW5kZXggYTEzM2ViOS4uNjA5NDM5OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9lc3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2VzcC5jCkBAIC00MiwyNiArNDIsMjMgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGJvb2wKLWVzcF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgZXNwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCBpcF9lc3BfaGRyICplaDsKIAlzdHJ1Y3QgaXBfZXNwX2hkciBfZXNwOwotCWNvbnN0IHN0cnVjdCB4dF9lc3AgKmVzcGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2VzcCAqZXNwaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQlpZiAob2Zmc2V0KQorCWlmIChwYXItPmZyYWdvZmYgIT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX2VzcCksICZfZXNwKTsKKwllaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfZXNwKSwgJl9lc3ApOwogCWlmIChlaCA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KIAkJICovCiAJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIEVTUCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC02OSwxMyArNjYsOSBAQAogCQkJICEhKGVzcGluZm8tPmludmZsYWdzICYgWFRfRVNQX0lOVl9TUEkpKTsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGJvb2wKLWVzcF9tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBlc3BfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2VzcCAqZXNwaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfZXNwICplc3BpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoZXNwaW5mby0+aW52ZmxhZ3MgJiB+WFRfRVNQX0lOVl9NQVNLKSB7CiAJCWR1cHJpbnRmKCJ4dF9lc3A6IHVua25vd24gZmxhZ3MgJVhcbiIsIGVzcGluZm8tPmludmZsYWdzKTsKQEAgLTg4LDcgKzgxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZXNwX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAiZXNwIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLmNoZWNrZW50cnkJPSBlc3BfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBlc3BfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2VzcCksCkBAIC05Nyw3ICs5MCw3IEBACiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJlc3AiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLmNoZWNrZW50cnkJPSBlc3BfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBlc3BfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2VzcCksCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwppbmRleCBkOTQxOGEyLi42ZmM0MjkyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKQEAgLTgwLDcgKzgwLDcgQEAKIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwkJLyogZ2xvYmFsIGxpc3Qgb2YgYWxsIGh0YWJsZXMgKi8KIAlhdG9taWNfdCB1c2U7Ci0JaW50IGZhbWlseTsKKwl1X2ludDhfdCBmYW1pbHk7CiAKIAlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgY2ZnOwkvKiBjb25maWcgKi8KIApAQCAtMTg1LDcgKzE4NSw3IEBACiB9CiBzdGF0aWMgdm9pZCBodGFibGVfZ2ModW5zaWduZWQgbG9uZyBodGxvbmcpOwogCi1zdGF0aWMgaW50IGh0YWJsZV9jcmVhdGVfdjAoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICptaW5mbywgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZV92MChzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKm1pbmZvLCB1X2ludDhfdCBmYW1pbHkpCiB7CiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJaGluZm8tPmNmZy5nY19pbnRlcnZhbCA9IG1pbmZvLT5jZmcuZ2NfaW50ZXJ2YWw7CiAJaGluZm8tPmNmZy5leHBpcmUgICAgICA9IG1pbmZvLT5jZmcuZXhwaXJlOwogCi0JaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorCWlmIChmYW1pbHkgPT0gTkZQUk9UT19JUFY0KQogCQloaW5mby0+Y2ZnLnNyY21hc2sgPSBoaW5mby0+Y2ZnLmRzdG1hc2sgPSAzMjsKIAllbHNlCiAJCWhpbmZvLT5jZmcuc3JjbWFzayA9IGhpbmZvLT5jZmcuZHN0bWFzayA9IDEyODsKQEAgLTIzNywxMSArMjM3LDEwIEBACiAJaGluZm8tPmZhbWlseSA9IGZhbWlseTsKIAloaW5mby0+cm5kX2luaXRpYWxpemVkID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmaGluZm8tPmxvY2spOwotCWhpbmZvLT5wZGUgPQotCQlwcm9jX2NyZWF0ZV9kYXRhKG1pbmZvLT5uYW1lLCAwLAotCQkJCSBmYW1pbHkgPT0gQUZfSU5FVCA/IGhhc2hsaW1pdF9wcm9jZGlyNCA6Ci0JCQkJCQkgICAgIGhhc2hsaW1pdF9wcm9jZGlyNiwKLQkJCQkgJmRsX2ZpbGVfb3BzLCBoaW5mbyk7CisJaGluZm8tPnBkZSA9IHByb2NfY3JlYXRlX2RhdGEobWluZm8tPm5hbWUsIDAsCisJCShmYW1pbHkgPT0gTkZQUk9UT19JUFY0KSA/CisJCWhhc2hsaW1pdF9wcm9jZGlyNCA6IGhhc2hsaW1pdF9wcm9jZGlyNiwKKwkJJmRsX2ZpbGVfb3BzLCBoaW5mbyk7CiAJaWYgKCFoaW5mby0+cGRlKSB7CiAJCXZmcmVlKGhpbmZvKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjU4LDggKzI1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZShzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKm1pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmYW1pbHkpCitzdGF0aWMgaW50IGh0YWJsZV9jcmVhdGUoc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICptaW5mbywgdV9pbnQ4X3QgZmFtaWx5KQogewogCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKQEAgLTMwMSwxMSArMjk5LDEwIEBACiAJaGluZm8tPnJuZF9pbml0aWFsaXplZCA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJmhpbmZvLT5sb2NrKTsKIAotCWhpbmZvLT5wZGUgPQotCQlwcm9jX2NyZWF0ZV9kYXRhKG1pbmZvLT5uYW1lLCAwLAotCQkJCSBmYW1pbHkgPT0gQUZfSU5FVCA/IGhhc2hsaW1pdF9wcm9jZGlyNCA6Ci0JCQkJCQkgICAgIGhhc2hsaW1pdF9wcm9jZGlyNiwKLQkJCQkgJmRsX2ZpbGVfb3BzLCBoaW5mbyk7CisJaGluZm8tPnBkZSA9IHByb2NfY3JlYXRlX2RhdGEobWluZm8tPm5hbWUsIDAsCisJCShmYW1pbHkgPT0gTkZQUk9UT19JUFY0KSA/CisJCWhhc2hsaW1pdF9wcm9jZGlyNCA6IGhhc2hsaW1pdF9wcm9jZGlyNiwKKwkJJmRsX2ZpbGVfb3BzLCBoaW5mbyk7CiAJaWYgKGhpbmZvLT5wZGUgPT0gTlVMTCkgewogCQl2ZnJlZShoaW5mbyk7CiAJCXJldHVybiAtMTsKQEAgLTM3MSwxNCArMzY4LDE0IEBACiAKIAkvKiByZW1vdmUgcHJvYyBlbnRyeSAqLwogCXJlbW92ZV9wcm9jX2VudHJ5KGhpbmZvLT5wZGUtPm5hbWUsCi0JCQkgIGhpbmZvLT5mYW1pbHkgPT0gQUZfSU5FVCA/IGhhc2hsaW1pdF9wcm9jZGlyNCA6CisJCQkgIGhpbmZvLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0ID8gaGFzaGxpbWl0X3Byb2NkaXI0IDoKIAkJCQkJCSAgICAgaGFzaGxpbWl0X3Byb2NkaXI2KTsKIAlodGFibGVfc2VsZWN0aXZlX2NsZWFudXAoaGluZm8sIHNlbGVjdF9hbGwpOwogCXZmcmVlKGhpbmZvKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodGFibGVfZmluZF9nZXQoY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJCSAgIGludCBmYW1pbHkpCisJCQkJCQkgICB1X2ludDhfdCBmYW1pbHkpCiB7CiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC01MDIsNyArNDk5LDcgQEAKIAltZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkpOwogCiAJc3dpdGNoIChoaW5mby0+ZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgorCWNhc2UgTkZQUk9UT19JUFY0OgogCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKQogCQkJZHN0LT5pcC5kc3QgPSBtYXNrbChpcF9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkgICAgICAgICAgICAgIGhpbmZvLT5jZmcuZHN0bWFzayk7CkBAIC01MTYsNyArNTEzLDcgQEAKIAkJbmV4dGhkciA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKIAkJYnJlYWs7CiAjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQotCWNhc2UgQUZfSU5FVDY6CisJY2FzZSBORlBST1RPX0lQVjY6CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9ESVApIHsKIAkJCW1lbWNweSgmZHN0LT5pcDYuZHN0LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkgICAgICAgc2l6ZW9mKGRzdC0+aXA2LmRzdCkpOwpAQCAtNTY2LDE5ICs1NjMsMTYgQEAKIH0KIAogc3RhdGljIGJvb2wKLWhhc2hsaW1pdF9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitoYXNobGltaXRfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0KLQkJKChjb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKiltYXRjaGluZm8pLT51Lm1hc3RlcjsKKwkJKChjb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKilwYXItPm1hdGNoaW5mbyktPnUubWFzdGVyOwogCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IHItPmhpbmZvOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOwogCXN0cnVjdCBkc3RoYXNoX2RzdCBkc3Q7CiAKLQlpZiAoaGFzaGxpbWl0X2luaXRfZHN0KGhpbmZvLCAmZHN0LCBza2IsIHByb3RvZmYpIDwgMCkKKwlpZiAoaGFzaGxpbWl0X2luaXRfZHN0KGhpbmZvLCAmZHN0LCBza2IsIHBhci0+dGhvZmYpIDwgMCkKIAkJZ290byBob3Rkcm9wOwogCiAJc3Bpbl9sb2NrX2JoKCZoaW5mby0+bG9jayk7CkBAIC02MTYsMjMgKzYxMCwyMCBAQAogCXJldHVybiBmYWxzZTsKIAogaG90ZHJvcDoKLQkqaG90ZHJvcCA9IHRydWU7CisJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbAotaGFzaGxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2hhc2hsaW1pdF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvID0gaW5mby0+aGluZm87CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCXN0cnVjdCBkc3RoYXNoX2VudCAqZGg7CiAJc3RydWN0IGRzdGhhc2hfZHN0IGRzdDsKIAotCWlmIChoYXNobGltaXRfaW5pdF9kc3QoaGluZm8sICZkc3QsIHNrYiwgcHJvdG9mZikgPCAwKQorCWlmIChoYXNobGltaXRfaW5pdF9kc3QoaGluZm8sICZkc3QsIHNrYiwgcGFyLT50aG9mZikgPCAwKQogCQlnb3RvIGhvdGRyb3A7CiAKIAlzcGluX2xvY2tfYmgoJmhpbmZvLT5sb2NrKTsKQEAgLTY2OSwxNiArNjYwLDEzIEBACiAJcmV0dXJuIGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0lOVkVSVDsKIAogIGhvdGRyb3A6Ci0JKmhvdGRyb3AgPSB0cnVlOworCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGJvb2wKLWhhc2hsaW1pdF9tdF9jaGVja192MChjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmluZiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIGhhc2hsaW1pdF9tdF9jaGVja192MChjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKnIgPSBtYXRjaGluZm87CisJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCiAJaWYgKHItPmNmZy5idXJzdCA9PSAwIHx8CkBAIC03MDcsOCArNjk1LDggQEAKIAkgKiB0aGUgbGlzdCBvZiBodGFibGUncyBpbiBodGFibGVfY3JlYXRlKCksIHNpbmNlIHRoZW4gd2Ugd291bGQKIAkgKiBjcmVhdGUgZHVwbGljYXRlIHByb2MgZmlsZXMuIC1IVyAqLwogCW11dGV4X2xvY2soJmhsaW1pdF9tdXRleCk7Ci0Jci0+aGluZm8gPSBodGFibGVfZmluZF9nZXQoci0+bmFtZSwgbWF0Y2gtPmZhbWlseSk7Ci0JaWYgKCFyLT5oaW5mbyAmJiBodGFibGVfY3JlYXRlX3YwKHIsIG1hdGNoLT5mYW1pbHkpICE9IDApIHsKKwlyLT5oaW5mbyA9IGh0YWJsZV9maW5kX2dldChyLT5uYW1lLCBwYXItPm1hdGNoLT5mYW1pbHkpOworCWlmICghci0+aGluZm8gJiYgaHRhYmxlX2NyZWF0ZV92MChyLCBwYXItPm1hdGNoLT5mYW1pbHkpICE9IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZobGltaXRfbXV0ZXgpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNzE5LDEyICs3MDcsOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbAotaGFzaGxpbWl0X210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgaGFzaGxpbWl0X210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KIAlpZiAoaW5mby0+Y2ZnLmJ1cnN0ID09IDAgfHwKQEAgLTczOCw3ICs3MjMsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGluZm8tPm5hbWVbc2l6ZW9mKGluZm8tPm5hbWUpLTFdICE9ICdcMCcpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAobWF0Y2gtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJaWYgKHBhci0+bWF0Y2gtPmZhbWlseSA9PSBORlBST1RPX0lQVjQpIHsKIAkJaWYgKGluZm8tPmNmZy5zcmNtYXNrID4gMzIgfHwgaW5mby0+Y2ZnLmRzdG1hc2sgPiAzMikKIAkJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewpAQCAtNzUzLDggKzczOCw4IEBACiAJICogdGhlIGxpc3Qgb2YgaHRhYmxlJ3MgaW4gaHRhYmxlX2NyZWF0ZSgpLCBzaW5jZSB0aGVuIHdlIHdvdWxkCiAJICogY3JlYXRlIGR1cGxpY2F0ZSBwcm9jIGZpbGVzLiAtSFcgKi8KIAltdXRleF9sb2NrKCZobGltaXRfbXV0ZXgpOwotCWluZm8tPmhpbmZvID0gaHRhYmxlX2ZpbmRfZ2V0KGluZm8tPm5hbWUsIG1hdGNoLT5mYW1pbHkpOwotCWlmICghaW5mby0+aGluZm8gJiYgaHRhYmxlX2NyZWF0ZShpbmZvLCBtYXRjaC0+ZmFtaWx5KSAhPSAwKSB7CisJaW5mby0+aGluZm8gPSBodGFibGVfZmluZF9nZXQoaW5mby0+bmFtZSwgcGFyLT5tYXRjaC0+ZmFtaWx5KTsKKwlpZiAoIWluZm8tPmhpbmZvICYmIGh0YWJsZV9jcmVhdGUoaW5mbywgcGFyLT5tYXRjaC0+ZmFtaWx5KSAhPSAwKSB7CiAJCW11dGV4X3VubG9jaygmaGxpbWl0X211dGV4KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTc2MywxNyArNzQ4LDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1oYXNobGltaXRfbXRfZGVzdHJveV92MChjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8pCitoYXNobGltaXRfbXRfZGVzdHJveV92MChjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaHRhYmxlX3B1dChyLT5oaW5mbyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1oYXNobGltaXRfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8pCitzdGF0aWMgdm9pZCBoYXNobGltaXRfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaHRhYmxlX3B1dChpbmZvLT5oaW5mbyk7CiB9CkBAIC04MDYsNyArNzkwLDcgQEAKIAl7CiAJCS5uYW1lCQk9ICJoYXNobGltaXQiLAogCQkucmV2aXNpb24JPSAwLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2gJCT0gaGFzaGxpbWl0X210X3YwLAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyksCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtODIxLDcgKzgwNSw3IEBACiAJewogCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKLQkJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVCwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCiAJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEpLAogCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2ssCkBAIC04MzEsNyArODE1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCiAJewogCQkubmFtZQkJPSAiaGFzaGxpbWl0IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5tYXRjaAkJPSBoYXNobGltaXRfbXRfdjAsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvKSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC04NDYsNyArODMwLDcgQEAKIAl7CiAJCS5uYW1lICAgICAgICAgICA9ICJoYXNobGltaXQiLAogCQkucmV2aXNpb24gICAgICAgPSAxLAotCQkuZmFtaWx5ICAgICAgICAgPSBBRl9JTkVUNiwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY2LAogCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCiAJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEpLAogCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2ssCkBAIC05MDEsMTQgKzg4NSwxNCBAQAogCXNwaW5fdW5sb2NrX2JoKCZodGFibGUtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIGludCBmYW1pbHksCitzdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKIAkJCQkgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CiAJLyogcmVjYWxjdWxhdGUgdG8gc2hvdyBhY2N1cmF0ZSBudW1iZXJzICovCiAJcmF0ZWluZm9fcmVjYWxjKGVudCwgamlmZmllcyk7CiAKIAlzd2l0Y2ggKGZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKKwljYXNlIE5GUFJPVE9fSVBWNDoKIAkJcmV0dXJuIHNlcV9wcmludGYocywgIiVsZCAldS4ldS4ldS4ldToldS0+IgogCQkJCSAgICAgIiV1LiV1LiV1LiV1OiV1ICV1ICV1ICV1XG4iLAogCQkJCSAobG9uZykoZW50LT5leHBpcmVzIC0gamlmZmllcykvSFosCkBAIC05MTksNyArOTAzLDcgQEAKIAkJCQkgZW50LT5yYXRlaW5mby5jcmVkaXQsIGVudC0+cmF0ZWluZm8uY3JlZGl0X2NhcCwKIAkJCQkgZW50LT5yYXRlaW5mby5jb3N0KTsKICNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCi0JY2FzZSBBRl9JTkVUNjoKKwljYXNlIE5GUFJPVE9fSVBWNjoKIAkJcmV0dXJuIHNlcV9wcmludGYocywgIiVsZCAiIE5JUDZfRk1UICI6JXUtPiIKIAkJCQkgICAgIE5JUDZfRk1UICI6JXUgJXUgJXUgJXVcbiIsCiAJCQkJIChsb25nKShlbnQtPmV4cGlyZXMgLSBqaWZmaWVzKS9IWiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCmluZGV4IGRhZGEyOTAuLjY0ZmM3ZjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpAQCAtMjQsMTIgKzI0LDkgQEAKIAogCiBzdGF0aWMgYm9vbAotaGVscGVyX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2hlbHBlcl9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2hlbHBlcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0OwogCWNvbnN0IHN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwOwogCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7CkBAIC01Nyw1NiArNTQsNDMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYm9vbAotaGVscGVyX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgaGVscGVyX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KG1hdGNoLT5mYW1pbHkpIDwgMCkgeworCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHBhci0+ZmFtaWx5KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkJCSAgICAicHJvdG89JXVcbiIsIG1hdGNoLT5mYW1pbHkpOworCQkJCSAgICAicHJvdG89JXVcbiIsIHBhci0+ZmFtaWx5KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGhlbHBlcl9tdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbykKK3N0YXRpYyB2b2lkIGhlbHBlcl9tdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tdGR0b3JfcGFyYW0gKnBhcikKIHsKLQluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQobWF0Y2gtPmZhbWlseSk7CisJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHBhci0+ZmFtaWx5KTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXJfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJoZWxwZXIiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gaGVscGVyX210X2NoZWNrLAotCQkubWF0Y2gJCT0gaGVscGVyX210LAotCQkuZGVzdHJveQk9IGhlbHBlcl9tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9oZWxwZXJfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImhlbHBlciIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5jaGVja2VudHJ5CT0gaGVscGVyX210X2NoZWNrLAotCQkubWF0Y2gJCT0gaGVscGVyX210LAotCQkuZGVzdHJveQk9IGhlbHBlcl9tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9oZWxwZXJfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXJfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAiaGVscGVyIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkuY2hlY2tlbnRyeSA9IGhlbHBlcl9tdF9jaGVjaywKKwkubWF0Y2ggICAgICA9IGhlbHBlcl9tdCwKKwkuZGVzdHJveSAgICA9IGhlbHBlcl9tdF9kZXN0cm95LAorCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF9oZWxwZXJfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGhlbHBlcl9tdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoaGVscGVyX210X3JlZywgQVJSQVlfU0laRShoZWxwZXJfbXRfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGhlbHBlcl9tdF9leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKGhlbHBlcl9tdF9yZWcsIEFSUkFZX1NJWkUoaGVscGVyX210X3JlZykpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmhlbHBlcl9tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChoZWxwZXJfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuYyBiL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCmluZGV4IGM2M2U5MzMuLjZmNjJjMzYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCkBAIC0xNywxMiArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9pcHJhbmdlLmg+CiAKIHN0YXRpYyBib29sCi1pcHJhbmdlX210X3YwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2lwcmFuZ2VfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9pcHJhbmdlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcHJhbmdlX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKGluZm8tPmZsYWdzICYgSVBSQU5HRV9TUkMpIHsKQEAgLTU1LDEyICs1Miw5IEBACiB9CiAKIHN0YXRpYyBib29sCi1pcHJhbmdlX210NChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitpcHJhbmdlX210NChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaXByYW5nZV9tdGluZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2lwcmFuZ2VfbXRpbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlib29sIG07CiAKQEAgLTExMSwxMiArMTA1LDkgQEAKIH0KIAogc3RhdGljIGJvb2wKLWlwcmFuZ2VfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2lwcmFuZ2VfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9pcHJhbmdlX210aW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfaXByYW5nZV9tdGluZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlib29sIG07CiAKQEAgLTE0MSw3ICsxMzIsNyBAQAogCXsKIAkJLm5hbWUgICAgICA9ICJpcHJhbmdlIiwKIAkJLnJldmlzaW9uICA9IDAsCi0JCS5mYW1pbHkgICAgPSBBRl9JTkVULAorCQkuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2ggICAgID0gaXByYW5nZV9tdF92MCwKIAkJLm1hdGNoc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB0X2lwcmFuZ2VfaW5mbyksCiAJCS5tZSAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTE0OSw3ICsxNDAsNyBAQAogCXsKIAkJLm5hbWUgICAgICA9ICJpcHJhbmdlIiwKIAkJLnJldmlzaW9uICA9IDEsCi0JCS5mYW1pbHkgICAgPSBBRl9JTkVULAorCQkuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2ggICAgID0gaXByYW5nZV9tdDQsCiAJCS5tYXRjaHNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2lwcmFuZ2VfbXRpbmZvKSwKIAkJLm1lICAgICAgICA9IFRISVNfTU9EVUxFLApAQCAtMTU3LDcgKzE0OCw3IEBACiAJewogCQkubmFtZSAgICAgID0gImlwcmFuZ2UiLAogCQkucmV2aXNpb24gID0gMSwKLQkJLmZhbWlseSAgICA9IEFGX0lORVQ2LAorCQkuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY2LAogCQkubWF0Y2ggICAgID0gaXByYW5nZV9tdDYsCiAJCS5tYXRjaHNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2lwcmFuZ2VfbXRpbmZvKSwKIAkJLm1lICAgICAgICA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKaW5kZXggYjg2NDBmOS4uYzQ4NzFjYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jCkBAIC0yMSwyNCArMjEsMTggQEAKIE1PRFVMRV9BTElBUygiaXA2dF9sZW5ndGgiKTsKIAogc3RhdGljIGJvb2wKLWxlbmd0aF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitsZW5ndGhfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9sZW5ndGhfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhpcF9oZHIoc2tiKS0+dG90X2xlbik7CiAKIAlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBib29sCi1sZW5ndGhfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2xlbmd0aF9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9sZW5ndGhfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWNvbnN0IHVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbikgKwogCQkJCSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCkBAIC00OCwxNCArNDIsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbGVuZ3RoX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAibGVuZ3RoIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLm1hdGNoCQk9IGxlbmd0aF9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfbGVuZ3RoX2luZm8pLAogCQkubWUJCT0gVEhJU19NT0RVTEUsCiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJsZW5ndGgiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLm1hdGNoCQk9IGxlbmd0aF9tdDYsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2xlbmd0aF9pbmZvKSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9saW1pdC5jCmluZGV4IGFhZDlhYjguLmM5MDhkNjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKQEAgLTU4LDEzICs1OCwxMCBAQAogI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKIAogc3RhdGljIGJvb2wKLWxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK2xpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCXN0cnVjdCB4dF9yYXRlaW5mbyAqciA9Ci0JCSgoY29uc3Qgc3RydWN0IHh0X3JhdGVpbmZvICopbWF0Y2hpbmZvKS0+bWFzdGVyOworCQkoKGNvbnN0IHN0cnVjdCB4dF9yYXRlaW5mbyAqKXBhci0+bWF0Y2hpbmZvKS0+bWFzdGVyOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCXNwaW5fbG9ja19iaCgmbGltaXRfbG9jayk7CkBAIC05NSwxMiArOTIsOSBAQAogCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gWFRfTElNSVRfU0NBTEU7CiB9CiAKLXN0YXRpYyBib29sCi1saW1pdF9tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmluZiwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBsaW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQlzdHJ1Y3QgeHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CisJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCiAJaWYgKHItPmJ1cnN0ID09IDAKQEAgLTE2Nyw0MyArMTYxLDI5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIGxpbWl0X210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZQkJPSAibGltaXQiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gbGltaXRfbXRfY2hlY2ssCi0JCS5tYXRjaAkJPSBsaW1pdF9tdCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWluZm8pLAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBsaW1pdF9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICAgICAgICA9ICJsaW1pdCIsCisJLnJldmlzaW9uICAgICAgICAgPSAwLAorCS5mYW1pbHkgICAgICAgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLm1hdGNoICAgICAgICAgICAgPSBsaW1pdF9tdCwKKwkuY2hlY2tlbnRyeSAgICAgICA9IGxpbWl0X210X2NoZWNrLAorCS5tYXRjaHNpemUgICAgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlaW5mbyksCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotCQkuY29tcGF0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X3JhdGVpbmZvKSwKLQkJLmNvbXBhdF9mcm9tX3VzZXIgPSBsaW1pdF9tdF9jb21wYXRfZnJvbV91c2VyLAotCQkuY29tcGF0X3RvX3VzZXIJPSBsaW1pdF9tdF9jb21wYXRfdG9fdXNlciwKKwkuY29tcGF0c2l6ZSAgICAgICA9IHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X3JhdGVpbmZvKSwKKwkuY29tcGF0X2Zyb21fdXNlciA9IGxpbWl0X210X2NvbXBhdF9mcm9tX3VzZXIsCisJLmNvbXBhdF90b191c2VyICAgPSBsaW1pdF9tdF9jb21wYXRfdG9fdXNlciwKICNlbmRpZgotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJsaW1pdCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5jaGVja2VudHJ5CT0gbGltaXRfbXRfY2hlY2ssCi0JCS5tYXRjaAkJPSBsaW1pdF9tdCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWluZm8pLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF94dF9yYXRlaW5mbyksCi0JCS5jb21wYXRfZnJvbV91c2VyID0gbGltaXRfbXRfY29tcGF0X2Zyb21fdXNlciwKLQkJLmNvbXBhdF90b191c2VyCT0gbGltaXRfbXRfY29tcGF0X3RvX3VzZXIsCi0jZW5kaWYKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCisJLm1lICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGxpbWl0X210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhsaW1pdF9tdF9yZWcsIEFSUkFZX1NJWkUobGltaXRfbXRfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZsaW1pdF9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbGltaXRfbXRfZXhpdCh2b2lkKQogewotCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhsaW1pdF9tdF9yZWcsIEFSUkFZX1NJWkUobGltaXRfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmbGltaXRfbXRfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQobGltaXRfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jIGIvbmV0L25ldGZpbHRlci94dF9tYWMuYwppbmRleCBiM2U5NmEwLi5jMjAwNzExIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKQEAgLTI0LDEyICsyNCw5IEBACiBNT0RVTEVfQUxJQVMoImlwdF9tYWMiKTsKIE1PRFVMRV9BTElBUygiaXA2dF9tYWMiKTsKIAotc3RhdGljIGJvb2wKLW1hY19tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgbWFjX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotICAgIGNvbnN0IHN0cnVjdCB4dF9tYWNfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKyAgICBjb25zdCBzdHJ1Y3QgeHRfbWFjX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogICAgIC8qIElzIG1hYyBwb2ludGVyIHZhbGlkPyAqLwogICAgIHJldHVybiBza2JfbWFjX2hlYWRlcihza2IpID49IHNrYi0+aGVhZCAmJgpAQCAtMzksMzcgKzM2LDI1IEBACiAJCV4gaW5mby0+aW52ZXJ0KTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYWNfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJtYWMiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5tYXRjaAkJPSBtYWNfbXQsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X21hY19pbmZvKSwKLQkJLmhvb2tzCQk9ICgxIDw8IE5GX0lORVRfUFJFX1JPVVRJTkcpIHwKLQkJCQkgICgxIDw8IE5GX0lORVRfTE9DQUxfSU4pIHwKLQkJCQkgICgxIDw8IE5GX0lORVRfRk9SV0FSRCksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIm1hYyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5tYXRjaAkJPSBtYWNfbXQsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X21hY19pbmZvKSwKLQkJLmhvb2tzCQk9ICgxIDw8IE5GX0lORVRfUFJFX1JPVVRJTkcpIHwKLQkJCQkgICgxIDw8IE5GX0lORVRfTE9DQUxfSU4pIHwKLQkJCQkgICgxIDw8IE5GX0lORVRfRk9SV0FSRCksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYWNfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICA9ICJtYWMiLAorCS5yZXZpc2lvbiAgPSAwLAorCS5mYW1pbHkgICAgPSBORlBST1RPX1VOU1BFQywKKwkubWF0Y2ggICAgID0gbWFjX210LAorCS5tYXRjaHNpemUgPSBzaXplb2Yoc3RydWN0IHh0X21hY19pbmZvKSwKKwkuaG9va3MgICAgID0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSB8CisJICAgICAgICAgICAgICgxIDw8IE5GX0lORVRfRk9SV0FSRCksCisJLm1lICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbWFjX210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhtYWNfbXRfcmVnLCBBUlJBWV9TSVpFKG1hY19tdF9yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJm1hY19tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWFjX210X2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXMobWFjX210X3JlZywgQVJSQVlfU0laRShtYWNfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFjX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KG1hY19tdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKaW5kZXggOWY3OGY2MS4uMTBiOWUzNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKQEAgLTIzLDMyICsyMywyNCBAQAogTU9EVUxFX0FMSUFTKCJpcDZ0X21hcmsiKTsKIAogc3RhdGljIGJvb2wKLW1hcmtfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICBib29sICpob3Rkcm9wKQorbWFya19tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfbWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCXJldHVybiAoKHNrYi0+bWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0OwogfQogCiBzdGF0aWMgYm9vbAotbWFya19tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCittYXJrX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9tYXJrX210aW5mbzEgKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJcmV0dXJuICgoc2tiLT5tYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKLXN0YXRpYyBib29sCi1tYXJrX210X2NoZWNrX3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIG1hcmtfbXRfY2hlY2tfdjAoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X21hcmtfaW5mbyAqbWluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfaW5mbyAqbWluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWlmIChtaW5mby0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgbWluZm8tPm1hc2sgPiAweGZmZmZmZmZmKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hcms6IG9ubHkgc3VwcG9ydHMgMzJiaXQgbWFya1xuIik7CkBAIC05MiwyMSArODQsNyBAQAogCXsKIAkJLm5hbWUJCT0gIm1hcmsiLAogCQkucmV2aXNpb24JPSAwLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gbWFya19tdF9jaGVja192MCwKLQkJLm1hdGNoCQk9IG1hcmtfbXRfdjAsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X21hcmtfaW5mbyksCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQkuY29tcGF0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgY29tcGF0X3h0X21hcmtfaW5mbyksCi0JCS5jb21wYXRfZnJvbV91c2VyID0gbWFya19tdF9jb21wYXRfZnJvbV91c2VyX3YwLAotCQkuY29tcGF0X3RvX3VzZXIJPSBtYXJrX210X2NvbXBhdF90b191c2VyX3YwLAotI2VuZGlmCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIm1hcmsiLAotCQkucmV2aXNpb24JPSAwLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fVU5TUEVDLAogCQkuY2hlY2tlbnRyeQk9IG1hcmtfbXRfY2hlY2tfdjAsCiAJCS5tYXRjaAkJPSBtYXJrX210X3YwLAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX2luZm8pLApAQCAtMTIwLDE1ICs5OCw3IEBACiAJewogCQkubmFtZSAgICAgICAgICAgPSAibWFyayIsCiAJCS5yZXZpc2lvbiAgICAgICA9IDEsCi0JCS5mYW1pbHkgICAgICAgICA9IEFGX0lORVQsCi0JCS5tYXRjaCAgICAgICAgICA9IG1hcmtfbXQsCi0JCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfbWFya19tdGluZm8xKSwKLQkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgICAgICA9ICJtYXJrIiwKLQkJLnJldmlzaW9uICAgICAgID0gMSwKLQkJLmZhbWlseSAgICAgICAgID0gQUZfSU5FVDYsCisJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fVU5TUEVDLAogCQkubWF0Y2ggICAgICAgICAgPSBtYXJrX210LAogCQkubWF0Y2hzaXplICAgICAgPSBzaXplb2Yoc3RydWN0IHh0X21hcmtfbXRpbmZvMSksCiAJCS5tZSAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9tdWx0aXBvcnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0LmMKaW5kZXggZmQ4OGM0OC4uZDA2YmIyZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9tdWx0aXBvcnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5jCkBAIC05NSwyNSArOTUsMjIgQEAKIH0KIAogc3RhdGljIGJvb2wKLW11bHRpcG9ydF9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCittdWx0aXBvcnRfbXRfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJY29uc3QgX19iZTE2ICpwcHRyOwogCV9fYmUxNiBfcG9ydHNbMl07Ci0JY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCi0JaWYgKG9mZnNldCkKKwlpZiAocGFyLT5mcmFnb2ZmICE9IDApCiAJCXJldHVybiBmYWxzZTsKIAotCXBwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcGFyLT50aG9mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CiAJaWYgKHBwdHIgPT0gTlVMTCkgewogCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQogCQkgKiBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuCiAJCSAqLwogCQlkdXByaW50ZigieHRfbXVsdGlwb3J0OiBEcm9wcGluZyBldmlsIG9mZnNldD0wIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEyMiwyNSArMTE5LDIyIEBACiB9CiAKIHN0YXRpYyBib29sCi1tdWx0aXBvcnRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICBib29sICpob3Rkcm9wKQorbXVsdGlwb3J0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCWNvbnN0IF9fYmUxNiAqcHB0cjsKIAlfX2JlMTYgX3BvcnRzWzJdOwotCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnRfdjEgKm11bHRpaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbXVsdGlwb3J0X3YxICptdWx0aWluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChvZmZzZXQpCisJaWYgKHBhci0+ZnJhZ29mZiAhPSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9wb3J0cyksIF9wb3J0cyk7CisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwogCWlmIChwcHRyID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKIAkJICogY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLgogCQkgKi8KIAkJZHVwcmludGYoInh0X211bHRpcG9ydDogRHJvcHBpbmcgZXZpbCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xNjQsNTAgKzE1OCwzNyBAQAogCQkmJiBjb3VudCA8PSBYVF9NVUxUSV9QT1JUUzsKIH0KIAotLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwotc3RhdGljIGJvb2wKLW11bHRpcG9ydF9tdF9jaGVja192MChjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBtdWx0aXBvcnRfbXRfY2hlY2tfdjAoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpbmZvOwotCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IHBhci0+ZW50cnlpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJcmV0dXJuIGNoZWNrKGlwLT5wcm90bywgaXAtPmludmZsYWdzLCBtdWx0aWluZm8tPmZsYWdzLAogCQkgICAgIG11bHRpaW5mby0+Y291bnQpOwogfQogCi1zdGF0aWMgYm9vbAotbXVsdGlwb3J0X210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIG11bHRpcG9ydF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZm87Ci0JY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydF92MSAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gcGFyLT5lbnRyeWluZm87CisJY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydF92MSAqbXVsdGlpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlyZXR1cm4gY2hlY2soaXAtPnByb3RvLCBpcC0+aW52ZmxhZ3MsIG11bHRpaW5mby0+ZmxhZ3MsCiAJCSAgICAgbXVsdGlpbmZvLT5jb3VudCk7CiB9CiAKLXN0YXRpYyBib29sCi1tdWx0aXBvcnRfbXQ2X2NoZWNrX3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgbXVsdGlwb3J0X210Nl9jaGVja192MChjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaW5mbzsKLQljb25zdCBzdHJ1Y3QgeHRfbXVsdGlwb3J0ICptdWx0aWluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IHBhci0+ZW50cnlpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJcmV0dXJuIGNoZWNrKGlwLT5wcm90bywgaXAtPmludmZsYWdzLCBtdWx0aWluZm8tPmZsYWdzLAogCQkgICAgIG11bHRpaW5mby0+Y291bnQpOwogfQogCi1zdGF0aWMgYm9vbAotbXVsdGlwb3J0X210Nl9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIG11bHRpcG9ydF9tdDZfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGluZm87Ci0JY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydF92MSAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBwYXItPmVudHJ5aW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfbXVsdGlwb3J0X3YxICptdWx0aWluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCXJldHVybiBjaGVjayhpcC0+cHJvdG8sIGlwLT5pbnZmbGFncywgbXVsdGlpbmZvLT5mbGFncywKIAkJICAgICBtdWx0aWluZm8tPmNvdW50KTsKQEAgLTIxNiw3ICsxOTcsNyBAQAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtdWx0aXBvcnRfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJtdWx0aXBvcnQiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkucmV2aXNpb24JPSAwLAogCQkuY2hlY2tlbnRyeQk9IG11bHRpcG9ydF9tdF9jaGVja192MCwKIAkJLm1hdGNoCQk9IG11bHRpcG9ydF9tdF92MCwKQEAgLTIyNSw3ICsyMDYsNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAibXVsdGlwb3J0IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLnJldmlzaW9uCT0gMSwKIAkJLmNoZWNrZW50cnkJPSBtdWx0aXBvcnRfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBtdWx0aXBvcnRfbXQsCkBAIC0yMzQsNyArMjE1LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gIm11bHRpcG9ydCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkucmV2aXNpb24JPSAwLAogCQkuY2hlY2tlbnRyeQk9IG11bHRpcG9ydF9tdDZfY2hlY2tfdjAsCiAJCS5tYXRjaAkJPSBtdWx0aXBvcnRfbXRfdjAsCkBAIC0yNDMsNyArMjI0LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gIm11bHRpcG9ydCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkucmV2aXNpb24JPSAxLAogCQkuY2hlY2tlbnRyeQk9IG11bHRpcG9ydF9tdDZfY2hlY2ssCiAJCS5tYXRjaAkJPSBtdWx0aXBvcnRfbXQsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X293bmVyLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X293bmVyLmMKaW5kZXggOTA1OWMxNi4uZjE5ZWJkOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9vd25lci5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfb3duZXIuYwpAQCAtMjEsMTIgKzIxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X293bmVyLmg+CiAKIHN0YXRpYyBib29sCi1vd25lcl9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitvd25lcl9tdF92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X293bmVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGZpbGUgKmZpbHA7CiAKIAlpZiAoc2tiLT5zayA9PSBOVUxMIHx8IHNrYi0+c2stPnNrX3NvY2tldCA9PSBOVUxMKQpAQCAtNTAsMTIgKzQ3LDkgQEAKIH0KIAogc3RhdGljIGJvb2wKLW93bmVyX210Nl92MChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitvd25lcl9tdDZfdjAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfb3duZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vd25lcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGZpbGUgKmZpbHA7CiAKIAlpZiAoc2tiLT5zayA9PSBOVUxMIHx8IHNrYi0+c2stPnNrX3NvY2tldCA9PSBOVUxMKQpAQCAtNzksMTIgKzczLDkgQEAKIH0KIAogc3RhdGljIGJvb2wKLW93bmVyX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK293bmVyX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9vd25lcl9tYXRjaF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9vd25lcl9tYXRjaF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGZpbGUgKmZpbHA7CiAKIAlpZiAoc2tiLT5zayA9PSBOVUxMIHx8IHNrYi0+c2stPnNrX3NvY2tldCA9PSBOVUxMKQpAQCAtMTE2LDEyICsxMDcsOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbAotb3duZXJfbXRfY2hlY2tfdjAoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppcCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBvd25lcl9tdF9jaGVja192MChjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X293bmVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9vd25lcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoaW5mby0+bWF0Y2ggJiAoSVBUX09XTkVSX1BJRCB8IElQVF9PV05FUl9TSUQgfCBJUFRfT1dORVJfQ09NTSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRQpAQCAtMTMzLDEyICsxMjEsOSBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbAotb3duZXJfbXQ2X2NoZWNrX3YwKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBvd25lcl9tdDZfY2hlY2tfdjAoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IGlwNnRfb3duZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9vd25lcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoaW5mby0+bWF0Y2ggJiAoSVA2VF9PV05FUl9QSUQgfCBJUDZUX09XTkVSX1NJRCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRQpAQCAtMTUzLDcgKzEzOCw3IEBACiAJewogCQkubmFtZSAgICAgICA9ICJvd25lciIsCiAJCS5yZXZpc2lvbiAgID0gMCwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVULAorCQkuZmFtaWx5ICAgICA9IE5GUFJPVE9fSVBWNCwKIAkJLm1hdGNoICAgICAgPSBvd25lcl9tdF92MCwKIAkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGlwdF9vd25lcl9pbmZvKSwKIAkJLmNoZWNrZW50cnkgPSBvd25lcl9tdF9jaGVja192MCwKQEAgLTE2NCw3ICsxNDksNyBAQAogCXsKIAkJLm5hbWUgICAgICAgPSAib3duZXIiLAogCQkucmV2aXNpb24gICA9IDAsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVDYsCisJCS5mYW1pbHkgICAgID0gTkZQUk9UT19JUFY2LAogCQkubWF0Y2ggICAgICA9IG93bmVyX210Nl92MCwKIAkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGlwNnRfb3duZXJfaW5mbyksCiAJCS5jaGVja2VudHJ5ID0gb3duZXJfbXQ2X2NoZWNrX3YwLApAQCAtMTc1LDE3ICsxNjAsNyBAQAogCXsKIAkJLm5hbWUgICAgICAgPSAib3duZXIiLAogCQkucmV2aXNpb24gICA9IDEsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVCwKLQkJLm1hdGNoICAgICAgPSBvd25lcl9tdCwKLQkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X293bmVyX21hdGNoX2luZm8pLAotCQkuaG9va3MgICAgICA9ICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8Ci0JCSAgICAgICAgICAgICAgKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpLAotCQkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZSAgICAgICA9ICJvd25lciIsCi0JCS5yZXZpc2lvbiAgID0gMSwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVUNiwKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKIAkJLm1hdGNoICAgICAgPSBvd25lcl9tdCwKIAkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X293bmVyX21hdGNoX2luZm8pLAogCQkuaG9va3MgICAgICA9ICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCmluZGV4IDRlYzEwOTQuLjFiY2RmYzEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0yMSwxNCArMjEsMTEgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9waHlzZGV2Iik7CiAKIHN0YXRpYyBib29sCi1waHlzZGV2X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK3BoeXNkZXZfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7CiAJaW50IGk7CiAJc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOwotCWNvbnN0IHN0cnVjdCB4dF9waHlzZGV2X2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWJvb2wgcmV0OwogCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwogCWNvbnN0IHN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwpAQCAtOTQsMTIgKzkxLDkgQEAKIAlyZXR1cm4gcmV0IF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCk7CiB9CiAKLXN0YXRpYyBib29sCi1waHlzZGV2X210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHBoeXNkZXZfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9NQVNLKSB8fAogCSAgICBpbmZvLT5iaXRtYXNrICYgflhUX1BIWVNERVZfT1BfTUFTSykKQEAgLTEwNyw0NCArMTAxLDM1IEBACiAJaWYgKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX09VVCAmJgogCSAgICAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSB8fAogCSAgICAgaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCSAgICBob29rX21hc2sgJiAoKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8Ci0JCQkgKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpKSkgeworCSAgICBwYXItPmhvb2tfbWFzayAmICgoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkgfAorCSAgICAoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwgKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwaHlzZGV2IG1hdGNoOiB1c2luZyAtLXBoeXNkZXYtb3V0IGluIHRoZSAiCiAJCSAgICAgICAiT1VUUFVULCBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgZm9yIG5vbi1icmlkZ2VkICIKIAkJICAgICAgICJ0cmFmZmljIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS5cbiIpOwotCQlpZiAoaG9va19tYXNrICYgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpKQorCQlpZiAocGFyLT5ob29rX21hc2sgJiAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIHBoeXNkZXZfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJwaHlzZGV2IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkuY2hlY2tlbnRyeQk9IHBoeXNkZXZfbXRfY2hlY2ssCi0JCS5tYXRjaAkJPSBwaHlzZGV2X210LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9waHlzZGV2X2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJwaHlzZGV2IiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLmNoZWNrZW50cnkJPSBwaHlzZGV2X210X2NoZWNrLAotCQkubWF0Y2gJCT0gcGh5c2Rldl9tdCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBoeXNkZXZfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAicGh5c2RldiIsCisJLnJldmlzaW9uICAgPSAwLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLmNoZWNrZW50cnkgPSBwaHlzZGV2X210X2NoZWNrLAorCS5tYXRjaCAgICAgID0gcGh5c2Rldl9tdCwKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvKSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcGh5c2Rldl9tdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMocGh5c2Rldl9tdF9yZWcsIEFSUkFZX1NJWkUocGh5c2Rldl9tdF9yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbXRfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBoeXNkZXZfbXRfZXhpdCh2b2lkKQogewotCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhwaHlzZGV2X210X3JlZywgQVJSQVlfU0laRShwaHlzZGV2X210X3JlZykpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbXRfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQocGh5c2Rldl9tdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKaW5kZXggNzkzNmY3ZS4uNjlkYTFkMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKQEAgLTIzLDIwICsyMywxNyBAQAogTU9EVUxFX0FMSUFTKCJpcDZ0X3BrdHR5cGUiKTsKIAogc3RhdGljIGJvb2wKLXBrdHR5cGVfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgICBib29sICpob3Rkcm9wKQorcGt0dHlwZV9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9wa3R0eXBlX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAl1X2ludDhfdCB0eXBlOwogCiAJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0xPT1BCQUNLKQogCQl0eXBlID0gc2tiLT5wa3RfdHlwZTsKLQllbHNlIGlmIChtYXRjaC0+ZmFtaWx5ID09IEFGX0lORVQgJiYKKwllbHNlIGlmIChwYXItPmZhbWlseSA9PSBORlBST1RPX0lQVjQgJiYKIAkgICAgaXB2NF9pc19tdWx0aWNhc3QoaXBfaGRyKHNrYiktPmRhZGRyKSkKIAkJdHlwZSA9IFBBQ0tFVF9NVUxUSUNBU1Q7Ci0JZWxzZSBpZiAobWF0Y2gtPmZhbWlseSA9PSBBRl9JTkVUNiAmJgorCWVsc2UgaWYgKHBhci0+ZmFtaWx5ID09IE5GUFJPVE9fSVBWNiAmJgogCSAgICBpcHY2X2hkcihza2IpLT5kYWRkci5zNl9hZGRyWzBdID09IDB4RkYpCiAJCXR5cGUgPSBQQUNLRVRfTVVMVElDQVNUOwogCWVsc2UKQEAgLTQ1LDMxICs0MiwyMyBAQAogCXJldHVybiAodHlwZSA9PSBpbmZvLT5wa3R0eXBlKSBeIGluZm8tPmludmVydDsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBwa3R0eXBlX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZQkJPSAicGt0dHlwZSIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKLQkJLm1hdGNoCQk9IHBrdHR5cGVfbXQsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3BrdHR5cGVfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gInBrdHR5cGUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCQkubWF0Y2gJCT0gcGt0dHlwZV9tdCwKLQkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBrdHR5cGVfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICA9ICJwa3R0eXBlIiwKKwkucmV2aXNpb24gID0gMCwKKwkuZmFtaWx5ICAgID0gTkZQUk9UT19VTlNQRUMsCisJLm1hdGNoICAgICA9IHBrdHR5cGVfbXQsCisJLm1hdGNoc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvKSwKKwkubWUgICAgICAgID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwa3R0eXBlX210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhwa3R0eXBlX210X3JlZywgQVJSQVlfU0laRShwa3R0eXBlX210X3JlZykpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGt0dHlwZV9tdF9leGl0KHZvaWQpCiB7Ci0JeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKHBrdHR5cGVfbXRfcmVnLCBBUlJBWV9TSVpFKHBrdHR5cGVfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChwa3R0eXBlX210X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9wb2xpY3kuYyBiL25ldC9uZXRmaWx0ZXIveHRfcG9saWN5LmMKaW5kZXggZDM1MTU4Mi4uMzI4YmQyMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9wb2xpY3kuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3BvbGljeS5jCkBAIC0yNiw5ICsyNiw5IEBACiAJICAgIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYTIsIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKIHsKIAlzd2l0Y2ggKGZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKKwljYXNlIE5GUFJPVE9fSVBWNDoKIAkJcmV0dXJuICgoYTEtPmlwIF4gYTItPmlwKSAmIG0tPmlwKSA9PSAwOwotCWNhc2UgQUZfSU5FVDY6CisJY2FzZSBORlBST1RPX0lQVjY6CiAJCXJldHVybiBpcHY2X21hc2tlZF9hZGRyX2NtcCgmYTEtPmluNiwgJm0tPmluNiwgJmEyLT5pbjYpID09IDA7CiAJfQogCXJldHVybiBmYWxzZTsKQEAgLTExMCwxOCArMTEwLDE1IEBACiB9CiAKIHN0YXRpYyBib29sCi1wb2xpY3lfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICBib29sICpob3Rkcm9wKQorcG9saWN5X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9wb2xpY3lfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfcG9saWN5X2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAlpbnQgcmV0OwogCiAJaWYgKGluZm8tPmZsYWdzICYgWFRfUE9MSUNZX01BVENIX0lOKQotCQlyZXQgPSBtYXRjaF9wb2xpY3lfaW4oc2tiLCBpbmZvLCBtYXRjaC0+ZmFtaWx5KTsKKwkJcmV0ID0gbWF0Y2hfcG9saWN5X2luKHNrYiwgaW5mbywgcGFyLT5tYXRjaC0+ZmFtaWx5KTsKIAllbHNlCi0JCXJldCA9IG1hdGNoX3BvbGljeV9vdXQoc2tiLCBpbmZvLCBtYXRjaC0+ZmFtaWx5KTsKKwkJcmV0ID0gbWF0Y2hfcG9saWN5X291dChza2IsIGluZm8sIHBhci0+bWF0Y2gtPmZhbWlseSk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0ID0gaW5mby0+ZmxhZ3MgJiBYVF9QT0xJQ1lfTUFUQ0hfTk9ORSA/IHRydWUgOiBmYWxzZTsKQEAgLTEzMSwyNiArMTI4LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wKLXBvbGljeV9tdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwX3ZvaWQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBwb2xpY3lfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3BvbGljeV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9wb2xpY3lfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKCEoaW5mby0+ZmxhZ3MgJiAoWFRfUE9MSUNZX01BVENIX0lOfFhUX1BPTElDWV9NQVRDSF9PVVQpKSkgewogCQlwcmludGsoS0VSTl9FUlIgInh0X3BvbGljeTogbmVpdGhlciBpbmNvbWluZyBub3IgIgogCQkJCSJvdXRnb2luZyBwb2xpY3kgc2VsZWN0ZWRcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCWlmIChob29rX21hc2sgJiAoMSA8PCBORl9JTkVUX1BSRV9ST1VUSU5HIHwgMSA8PCBORl9JTkVUX0xPQ0FMX0lOKQotCSAgICAmJiBpbmZvLT5mbGFncyAmIFhUX1BPTElDWV9NQVRDSF9PVVQpIHsKKwlpZiAocGFyLT5ob29rX21hc2sgJiAoKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfAorCSAgICAoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSkgJiYgaW5mby0+ZmxhZ3MgJiBYVF9QT0xJQ1lfTUFUQ0hfT1VUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieHRfcG9saWN5OiBvdXRwdXQgcG9saWN5IG5vdCB2YWxpZCBpbiAiCiAJCQkJIlBSRV9ST1VUSU5HIGFuZCBJTlBVVFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JaWYgKGhvb2tfbWFzayAmICgxIDw8IE5GX0lORVRfUE9TVF9ST1VUSU5HIHwgMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkKLQkgICAgJiYgaW5mby0+ZmxhZ3MgJiBYVF9QT0xJQ1lfTUFUQ0hfSU4pIHsKKwlpZiAocGFyLT5ob29rX21hc2sgJiAoKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpIHwKKwkgICAgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpKSAmJiBpbmZvLT5mbGFncyAmIFhUX1BPTElDWV9NQVRDSF9JTikgewogCQlwcmludGsoS0VSTl9FUlIgInh0X3BvbGljeTogaW5wdXQgcG9saWN5IG5vdCB2YWxpZCBpbiAiCiAJCQkJIlBPU1RfUk9VVElORyBhbmQgT1VUUFVUXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTY1LDcgKzE1OSw3IEBACiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBvbGljeV9tdF9yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewogCXsKIAkJLm5hbWUJCT0gInBvbGljeSIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJCS5jaGVja2VudHJ5IAk9IHBvbGljeV9tdF9jaGVjaywKIAkJLm1hdGNoCQk9IHBvbGljeV9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfcG9saWN5X2luZm8pLApAQCAtMTczLDcgKzE2Nyw3IEBACiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJwb2xpY3kiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLmNoZWNrZW50cnkJPSBwb2xpY3lfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBwb2xpY3lfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3BvbGljeV9pbmZvKSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEuYyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEuYwppbmRleCAzYjAyMWQwLi5jODRmY2U1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9xdW90YS5jCkBAIC0xOCwxMyArMTgsMTAgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socXVvdGFfbG9jayk7CiAKIHN0YXRpYyBib29sCi1xdW90YV9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitxdW90YV9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKIHsKIAlzdHJ1Y3QgeHRfcXVvdGFfaW5mbyAqcSA9Ci0JCSgoY29uc3Qgc3RydWN0IHh0X3F1b3RhX2luZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7CisJCSgoY29uc3Qgc3RydWN0IHh0X3F1b3RhX2luZm8gKilwYXItPm1hdGNoaW5mbyktPm1hc3RlcjsKIAlib29sIHJldCA9IHEtPmZsYWdzICYgWFRfUVVPVEFfSU5WRVJUOwogCiAJc3Bpbl9sb2NrX2JoKCZxdW90YV9sb2NrKTsKQEAgLTQwLDEyICszNyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wKLXF1b3RhX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgcXVvdGFfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X3F1b3RhX2luZm8gKnEgPSBtYXRjaGluZm87CisJc3RydWN0IHh0X3F1b3RhX2luZm8gKnEgPSBwYXItPm1hdGNoaW5mbzsKIAogCWlmIChxLT5mbGFncyAmIH5YVF9RVU9UQV9NQVNLKQogCQlyZXR1cm4gZmFsc2U7CkBAIC01NCwzMyArNDgsMjQgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBxdW90YV9tdF9yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLm5hbWUJCT0gInF1b3RhIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkuY2hlY2tlbnRyeQk9IHF1b3RhX210X2NoZWNrLAotCQkubWF0Y2gJCT0gcXVvdGFfbXQsCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3F1b3RhX2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUKLQl9LAotCXsKLQkJLm5hbWUJCT0gInF1b3RhIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLmNoZWNrZW50cnkJPSBxdW90YV9tdF9jaGVjaywKLQkJLm1hdGNoCQk9IHF1b3RhX210LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9xdW90YV9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcXVvdGFfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAicXVvdGEiLAorCS5yZXZpc2lvbiAgID0gMCwKKwkuZmFtaWx5ICAgICA9IE5GUFJPVE9fVU5TUEVDLAorCS5tYXRjaCAgICAgID0gcXVvdGFfbXQsCisJLmNoZWNrZW50cnkgPSBxdW90YV9tdF9jaGVjaywKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfcXVvdGFfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHF1b3RhX210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhxdW90YV9tdF9yZWcsIEFSUkFZX1NJWkUocXVvdGFfbXRfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZxdW90YV9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcXVvdGFfbXRfZXhpdCh2b2lkKQogewotCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhxdW90YV9tdF9yZWcsIEFSUkFZX1NJWkUocXVvdGFfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcXVvdGFfbXRfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQocXVvdGFfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuYyBiL25ldC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5jCmluZGV4IGViZDg0ZjEuLjIyMGExZDUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcmF0ZWVzdC5jCkBAIC0xNCwxNiArMTQsMTAgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaD4KIAogCi1zdGF0aWMgYm9vbCB4dF9yYXRlZXN0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkJCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkJICBpbnQgb2Zmc2V0LAotCQkJICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLQkJCSAgYm9vbCAqaG90ZHJvcCkKK3N0YXRpYyBib29sCit4dF9yYXRlZXN0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9yYXRlZXN0X21hdGNoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0ICpyOwogCXVfaW50MzJfdCBicHMxLCBicHMyLCBwcHMxLCBwcHMyOwogCWJvb2wgcmV0ID0gdHJ1ZTsKQEAgLTgwLDEzICs3NCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgeHRfcmF0ZWVzdF9tdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCQkgICAgIGNvbnN0IHZvaWQgKmlwLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLQkJCQkgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCB4dF9yYXRlZXN0X210X2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfcmF0ZWVzdF9tYXRjaF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJc3RydWN0IHh0X3JhdGVlc3QgKmVzdDEsICplc3QyOwogCiAJaWYgKGh3ZWlnaHQzMihpbmZvLT5mbGFncyAmIChYVF9SQVRFRVNUX01BVENIX0FCUyB8CkBAIC0xMjcsNDYgKzExNywzNCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgeHRfcmF0ZWVzdF9tdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0JCQkJICB2b2lkICptYXRjaGluZm8pCitzdGF0aWMgdm9pZCB4dF9yYXRlZXN0X210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9yYXRlZXN0X21hdGNoX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJeHRfcmF0ZWVzdF9wdXQoaW5mby0+ZXN0MSk7CiAJaWYgKGluZm8tPmVzdDIpCiAJCXh0X3JhdGVlc3RfcHV0KGluZm8tPmVzdDIpOwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIHh0X3JhdGVlc3RfbWF0Y2hbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkubmFtZQkJPSAicmF0ZWVzdCIsCi0JCS5tYXRjaAkJPSB4dF9yYXRlZXN0X210LAotCQkuY2hlY2tlbnRyeQk9IHh0X3JhdGVlc3RfbXRfY2hlY2tlbnRyeSwKLQkJLmRlc3Ryb3kJPSB4dF9yYXRlZXN0X210X2Rlc3Ryb3ksCi0JCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKLQkJLm5hbWUJCT0gInJhdGVlc3QiLAotCQkubWF0Y2gJCT0geHRfcmF0ZWVzdF9tdCwKLQkJLmNoZWNrZW50cnkJPSB4dF9yYXRlZXN0X210X2NoZWNrZW50cnksCi0JCS5kZXN0cm95CT0geHRfcmF0ZWVzdF9tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlZXN0X21hdGNoX2luZm8pLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggeHRfcmF0ZWVzdF9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJyYXRlZXN0IiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkubWF0Y2ggICAgICA9IHh0X3JhdGVlc3RfbXQsCisJLmNoZWNrZW50cnkgPSB4dF9yYXRlZXN0X210X2NoZWNrZW50cnksCisJLmRlc3Ryb3kgICAgPSB4dF9yYXRlZXN0X210X2Rlc3Ryb3ksCisJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X3JhdGVlc3RfbWF0Y2hfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHh0X3JhdGVlc3RfbXRfaW5pdCh2b2lkKQogewotCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaGVzKHh0X3JhdGVlc3RfbWF0Y2gsCi0JCQkJICAgQVJSQVlfU0laRSh4dF9yYXRlZXN0X21hdGNoKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZ4dF9yYXRlZXN0X210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB4dF9yYXRlZXN0X210X2Zpbmkodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXMoeHRfcmF0ZWVzdF9tYXRjaCwgQVJSQVlfU0laRSh4dF9yYXRlZXN0X21hdGNoKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmeHRfcmF0ZWVzdF9tdF9yZWcpOwogfQogCiBNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYyBiL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYwppbmRleCA3ZGYxNjI3Li42NzQxOTI4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCkBAIC0yMiwxMiArMjIsOSBAQAogTU9EVUxFX0FMSUFTKCJpcHRfcmVhbG0iKTsKIAogc3RhdGljIGJvb2wKLXJlYWxtX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgYm9vbCAqaG90ZHJvcCkKK3JlYWxtX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9yZWFsbV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9yZWFsbV9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CiAKIAlyZXR1cm4gKGluZm8tPmlkID09IChkc3QtPnRjbGFzc2lkICYgaW5mby0+bWFzaykpIF4gaW5mby0+aW52ZXJ0OwpAQCAtMzksNyArMzYsNyBAQAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3JlYWxtX2luZm8pLAogCS5ob29rcwkJPSAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykgfCAoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwKIAkJCSAgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpIHwgKDEgPDwgTkZfSU5FVF9MT0NBTF9JTiksCi0JLmZhbWlseQkJPSBBRl9JTkVULAorCS5mYW1pbHkJCT0gTkZQUk9UT19VTlNQRUMsCiAJLm1lCQk9IFRISVNfTU9EVUxFCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jIGIvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWJkNGNhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYwpAQCAtMCwwICsxLDY4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqIENvcHlyaWdodCDCqSBDQyBDb21wdXRlciBDb25zdWx0YW50cyBHbWJILCAyMDA3IC0gMjAwOAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IG9mIHRoZSBvbGQgaXB0X3JlY2VudCBtb2R1bGUsIHdoaWNoIGNhcnJpZWQgdGhlCisgKiBmb2xsb3dpbmcgY29weXJpZ2h0IG5vdGljZToKKyAqCisgKiBBdXRob3I6IFN0ZXBoZW4gRnJvc3QgPHNmcm9zdEBzbm93bWFuLm5ldD4KKyAqIENvcHlyaWdodCAyMDAyLTIwMDMsIFN0ZXBoZW4gRnJvc3QsIDIuNS54IHBvcnQgYnkgbGFmb3JnZUBuZXRmaWx0ZXIub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlY2VudC5oPgorCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIkphbiBFbmdlbGhhcmR0IDxqZW5nZWxoQGNvbXB1dGVyZ21iaC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWHRhYmxlczogXCJyZWNlbnRseS1zZWVuXCIgaG9zdCBtYXRjaGluZyBmb3IgSVB2NCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfcmVjZW50Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfcmVjZW50Iik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbGlzdF90b3QgPSAxMDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX3BrdF9saXN0X3RvdCA9IDIwOworc3RhdGljIHVuc2lnbmVkIGludCBpcF9saXN0X2hhc2hfc2l6ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2xpc3RfcGVybXMgPSAwNjQ0Oworc3RhdGljIHVuc2lnbmVkIGludCBpcF9saXN0X3VpZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGlwX2xpc3RfZ2lkID0gMDsKK21vZHVsZV9wYXJhbShpcF9saXN0X3RvdCwgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0oaXBfcGt0X2xpc3RfdG90LCB1aW50LCAwNDAwKTsKK21vZHVsZV9wYXJhbShpcF9saXN0X2hhc2hfc2l6ZSwgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0oaXBfbGlzdF9wZXJtcywgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0oaXBfbGlzdF91aWQsIHVpbnQsIDA0MDApOworbW9kdWxlX3BhcmFtKGlwX2xpc3RfZ2lkLCB1aW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXBfbGlzdF90b3QsICJudW1iZXIgb2YgSVBzIHRvIHJlbWVtYmVyIHBlciBsaXN0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGlwX3BrdF9saXN0X3RvdCwgIm51bWJlciBvZiBwYWNrZXRzIHBlciBJUCB0byByZW1lbWJlciAobWF4LiAyNTUpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlwX2xpc3RfaGFzaF9zaXplLCAic2l6ZSBvZiBoYXNoIHRhYmxlIHVzZWQgdG8gbG9vayB1cCBJUHMiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXBfbGlzdF9wZXJtcywgInBlcm1pc3Npb25zIG9uIC9wcm9jL25ldC94dF9yZWNlbnQvKiBmaWxlcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcF9saXN0X3VpZCwib3duZXIgb2YgL3Byb2MvbmV0L3h0X3JlY2VudC8qIGZpbGVzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlwX2xpc3RfZ2lkLCJvd25pbmcgZ3JvdXAgb2YgL3Byb2MvbmV0L3h0X3JlY2VudC8qIGZpbGVzIik7CisKK3N0cnVjdCByZWNlbnRfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxydV9saXN0OworCXVuaW9uIG5mX2luZXRfYWRkcglhZGRyOworCXVfaW50MTZfdAkJZmFtaWx5OworCXVfaW50OF90CQl0dGw7CisJdV9pbnQ4X3QJCWluZGV4OworCXVfaW50MTZfdAkJbnN0YW1wczsKKwl1bnNpZ25lZCBsb25nCQlzdGFtcHNbMF07Cit9OworCitzdHJ1Y3QgcmVjZW50X3RhYmxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJY2hhcgkJCW5hbWVbWFRfUkVDRU5UX05BTUVfTEVOXTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19vbGQsICpwcm9jOworI2VuZGlmCisJdW5zaWduZWQgaW50CQlyZWZjbnQ7CisJdW5zaWduZWQgaW50CQllbnRyaWVzOworCXN0cnVjdCBsaXN0X2hlYWQJbHJ1X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlpcGhhc2hbMF07Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHRhYmxlcyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlY2VudF9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocmVjZW50X211dGV4KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlRfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfb2xkX2RpcjsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVjZW50X3Byb2NfZGlyOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVjZW50X29sZF9mb3BzLCByZWNlbnRfbXRfZm9wczsKKyNlbmRpZgorCitzdGF0aWMgdV9pbnQzMl90IGhhc2hfcm5kOworc3RhdGljIGJvb2wgaGFzaF9ybmRfaW5pdHRlZDsKKworc3RhdGljIHVuc2lnbmVkIGludCByZWNlbnRfZW50cnlfaGFzaDQoY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICphZGRyKQoreworCWlmICghaGFzaF9ybmRfaW5pdHRlZCkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZoYXNoX3JuZCwgc2l6ZW9mKGhhc2hfcm5kKSk7CisJCWhhc2hfcm5kX2luaXR0ZWQgPSB0cnVlOworCX0KKwlyZXR1cm4gamhhc2hfMXdvcmQoKF9fZm9yY2UgdTMyKWFkZHItPmlwLCBoYXNoX3JuZCkgJgorCSAgICAgICAoaXBfbGlzdF9oYXNoX3NpemUgLSAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByZWNlbnRfZW50cnlfaGFzaDYoY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICphZGRyKQoreworCWlmICghaGFzaF9ybmRfaW5pdHRlZCkgeworCQlnZXRfcmFuZG9tX2J5dGVzKCZoYXNoX3JuZCwgc2l6ZW9mKGhhc2hfcm5kKSk7CisJCWhhc2hfcm5kX2luaXR0ZWQgPSB0cnVlOworCX0KKwlyZXR1cm4gamhhc2gyKCh1MzIgKilhZGRyLT5pcDYsIEFSUkFZX1NJWkUoYWRkci0+aXA2KSwgaGFzaF9ybmQpICYKKwkgICAgICAgKGlwX2xpc3RfaGFzaF9zaXplIC0gMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVjZW50X2VudHJ5ICoKK3JlY2VudF9lbnRyeV9sb29rdXAoY29uc3Qgc3RydWN0IHJlY2VudF90YWJsZSAqdGFibGUsCisJCSAgICBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmFkZHJwLCB1X2ludDE2X3QgZmFtaWx5LAorCQkgICAgdV9pbnQ4X3QgdHRsKQoreworCXN0cnVjdCByZWNlbnRfZW50cnkgKmU7CisJdW5zaWduZWQgaW50IGg7CisKKwlpZiAoZmFtaWx5ID09IE5GUFJPVE9fSVBWNCkKKwkJaCA9IHJlY2VudF9lbnRyeV9oYXNoNChhZGRycCk7CisJZWxzZQorCQloID0gcmVjZW50X2VudHJ5X2hhc2g2KGFkZHJwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJnRhYmxlLT5pcGhhc2hbaF0sIGxpc3QpCisJCWlmIChlLT5mYW1pbHkgPT0gZmFtaWx5ICYmCisJCSAgICBtZW1jbXAoJmUtPmFkZHIsIGFkZHJwLCBzaXplb2YoZS0+YWRkcikpID09IDAgJiYKKwkJICAgICh0dGwgPT0gZS0+dHRsIHx8IHR0bCA9PSAwIHx8IGUtPnR0bCA9PSAwKSkKKwkJCXJldHVybiBlOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZWNlbnRfZW50cnlfcmVtb3ZlKHN0cnVjdCByZWNlbnRfdGFibGUgKnQsIHN0cnVjdCByZWNlbnRfZW50cnkgKmUpCit7CisJbGlzdF9kZWwoJmUtPmxpc3QpOworCWxpc3RfZGVsKCZlLT5scnVfbGlzdCk7CisJa2ZyZWUoZSk7CisJdC0+ZW50cmllcy0tOworfQorCitzdGF0aWMgc3RydWN0IHJlY2VudF9lbnRyeSAqCityZWNlbnRfZW50cnlfaW5pdChzdHJ1Y3QgcmVjZW50X3RhYmxlICp0LCBjb25zdCB1bmlvbiBuZl9pbmV0X2FkZHIgKmFkZHIsCisJCSAgdV9pbnQxNl90IGZhbWlseSwgdV9pbnQ4X3QgdHRsKQoreworCXN0cnVjdCByZWNlbnRfZW50cnkgKmU7CisKKwlpZiAodC0+ZW50cmllcyA+PSBpcF9saXN0X3RvdCkgeworCQllID0gbGlzdF9lbnRyeSh0LT5scnVfbGlzdC5uZXh0LCBzdHJ1Y3QgcmVjZW50X2VudHJ5LCBscnVfbGlzdCk7CisJCXJlY2VudF9lbnRyeV9yZW1vdmUodCwgZSk7CisJfQorCWUgPSBrbWFsbG9jKHNpemVvZigqZSkgKyBzaXplb2YoZS0+c3RhbXBzWzBdKSAqIGlwX3BrdF9saXN0X3RvdCwKKwkJICAgIEdGUF9BVE9NSUMpOworCWlmIChlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbWNweSgmZS0+YWRkciwgYWRkciwgc2l6ZW9mKGUtPmFkZHIpKTsKKwllLT50dGwgICAgICAgPSB0dGw7CisJZS0+c3RhbXBzWzBdID0gamlmZmllczsKKwllLT5uc3RhbXBzICAgPSAxOworCWUtPmluZGV4ICAgICA9IDE7CisJZS0+ZmFtaWx5ICAgID0gZmFtaWx5OworCWlmIChmYW1pbHkgPT0gTkZQUk9UT19JUFY0KQorCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmdC0+aXBoYXNoW3JlY2VudF9lbnRyeV9oYXNoNChhZGRyKV0pOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJnQtPmlwaGFzaFtyZWNlbnRfZW50cnlfaGFzaDYoYWRkcildKTsKKwlsaXN0X2FkZF90YWlsKCZlLT5scnVfbGlzdCwgJnQtPmxydV9saXN0KTsKKwl0LT5lbnRyaWVzKys7CisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VudF9lbnRyeV91cGRhdGUoc3RydWN0IHJlY2VudF90YWJsZSAqdCwgc3RydWN0IHJlY2VudF9lbnRyeSAqZSkKK3sKKwllLT5zdGFtcHNbZS0+aW5kZXgrK10gPSBqaWZmaWVzOworCWlmIChlLT5pbmRleCA+IGUtPm5zdGFtcHMpCisJCWUtPm5zdGFtcHMgPSBlLT5pbmRleDsKKwllLT5pbmRleCAlPSBpcF9wa3RfbGlzdF90b3Q7CisJbGlzdF9tb3ZlX3RhaWwoJmUtPmxydV9saXN0LCAmdC0+bHJ1X2xpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHJlY2VudF90YWJsZSAqcmVjZW50X3RhYmxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCByZWNlbnRfdGFibGUgKnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZ0YWJsZXMsIGxpc3QpCisJCWlmICghc3RyY21wKHQtPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIHQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VudF90YWJsZV9mbHVzaChzdHJ1Y3QgcmVjZW50X3RhYmxlICp0KQoreworCXN0cnVjdCByZWNlbnRfZW50cnkgKmUsICpuZXh0OworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGlwX2xpc3RfaGFzaF9zaXplOyBpKyspCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCAmdC0+aXBoYXNoW2ldLCBsaXN0KQorCQkJcmVjZW50X2VudHJ5X3JlbW92ZSh0LCBlKTsKK30KKworc3RhdGljIGJvb2wKK3JlY2VudF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2hfcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfcmVjZW50X210aW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCByZWNlbnRfdGFibGUgKnQ7CisJc3RydWN0IHJlY2VudF9lbnRyeSAqZTsKKwl1bmlvbiBuZl9pbmV0X2FkZHIgYWRkciA9IHt9OworCXVfaW50OF90IHR0bDsKKwlib29sIHJldCA9IGluZm8tPmludmVydDsKKworCWlmIChwYXItPm1hdGNoLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0KSB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwkJaWYgKGluZm8tPnNpZGUgPT0gWFRfUkVDRU5UX0RFU1QpCisJCQlhZGRyLmlwID0gaXBoLT5kYWRkcjsKKwkJZWxzZQorCQkJYWRkci5pcCA9IGlwaC0+c2FkZHI7CisKKwkJdHRsID0gaXBoLT50dGw7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CisKKwkJaWYgKGluZm8tPnNpZGUgPT0gWFRfUkVDRU5UX0RFU1QpCisJCQltZW1jcHkoJmFkZHIuaW42LCAmaXBoLT5kYWRkciwgc2l6ZW9mKGFkZHIuaW42KSk7CisJCWVsc2UKKwkJCW1lbWNweSgmYWRkci5pbjYsICZpcGgtPnNhZGRyLCBzaXplb2YoYWRkci5pbjYpKTsKKworCQl0dGwgPSBpcGgtPmhvcF9saW1pdDsKKwl9CisKKwkvKiB1c2UgVFRMIGFzIHNlZW4gYmVmb3JlIGZvcndhcmRpbmcgKi8KKwlpZiAocGFyLT5vdXQgIT0gTlVMTCAmJiBza2ItPnNrID09IE5VTEwpCisJCXR0bCsrOworCisJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7CisJZSA9IHJlY2VudF9lbnRyeV9sb29rdXAodCwgJmFkZHIsIHBhci0+bWF0Y2gtPmZhbWlseSwKKwkJCQkoaW5mby0+Y2hlY2tfc2V0ICYgWFRfUkVDRU5UX1RUTCkgPyB0dGwgOiAwKTsKKwlpZiAoZSA9PSBOVUxMKSB7CisJCWlmICghKGluZm8tPmNoZWNrX3NldCAmIFhUX1JFQ0VOVF9TRVQpKQorCQkJZ290byBvdXQ7CisJCWUgPSByZWNlbnRfZW50cnlfaW5pdCh0LCAmYWRkciwgcGFyLT5tYXRjaC0+ZmFtaWx5LCB0dGwpOworCQlpZiAoZSA9PSBOVUxMKQorCQkJKnBhci0+aG90ZHJvcCA9IHRydWU7CisJCXJldCA9ICFyZXQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpbmZvLT5jaGVja19zZXQgJiBYVF9SRUNFTlRfU0VUKQorCQlyZXQgPSAhcmV0OworCWVsc2UgaWYgKGluZm8tPmNoZWNrX3NldCAmIFhUX1JFQ0VOVF9SRU1PVkUpIHsKKwkJcmVjZW50X2VudHJ5X3JlbW92ZSh0LCBlKTsKKwkJcmV0ID0gIXJldDsKKwl9IGVsc2UgaWYgKGluZm8tPmNoZWNrX3NldCAmIChYVF9SRUNFTlRfQ0hFQ0sgfCBYVF9SRUNFTlRfVVBEQVRFKSkgeworCQl1bnNpZ25lZCBsb25nIHRpbWUgPSBqaWZmaWVzIC0gaW5mby0+c2Vjb25kcyAqIEhaOworCQl1bnNpZ25lZCBpbnQgaSwgaGl0cyA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGUtPm5zdGFtcHM7IGkrKykgeworCQkJaWYgKGluZm8tPnNlY29uZHMgJiYgdGltZV9hZnRlcih0aW1lLCBlLT5zdGFtcHNbaV0pKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCsraGl0cyA+PSBpbmZvLT5oaXRfY291bnQpIHsKKwkJCQlyZXQgPSAhcmV0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZm8tPmNoZWNrX3NldCAmIFhUX1JFQ0VOVF9TRVQgfHwKKwkgICAgKGluZm8tPmNoZWNrX3NldCAmIFhUX1JFQ0VOVF9VUERBVEUgJiYgcmV0KSkgeworCQlyZWNlbnRfZW50cnlfdXBkYXRlKHQsIGUpOworCQllLT50dGwgPSB0dGw7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgcmVjZW50X210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9yZWNlbnRfbXRpbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHJlY2VudF90YWJsZSAqdDsKKwl1bnNpZ25lZCBpOworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwlpZiAoaHdlaWdodDgoaW5mby0+Y2hlY2tfc2V0ICYKKwkJICAgICAoWFRfUkVDRU5UX1NFVCB8IFhUX1JFQ0VOVF9SRU1PVkUgfAorCQkgICAgICBYVF9SRUNFTlRfQ0hFQ0sgfCBYVF9SRUNFTlRfVVBEQVRFKSkgIT0gMSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICgoaW5mby0+Y2hlY2tfc2V0ICYgKFhUX1JFQ0VOVF9TRVQgfCBYVF9SRUNFTlRfUkVNT1ZFKSkgJiYKKwkgICAgKGluZm8tPnNlY29uZHMgfHwgaW5mby0+aGl0X2NvdW50KSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChpbmZvLT5oaXRfY291bnQgPiBpcF9wa3RfbGlzdF90b3QpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoaW5mby0+bmFtZVswXSA9PSAnXDAnIHx8CisJICAgIHN0cm5sZW4oaW5mby0+bmFtZSwgWFRfUkVDRU5UX05BTUVfTEVOKSA9PSBYVF9SRUNFTlRfTkFNRV9MRU4pCisJCXJldHVybiBmYWxzZTsKKworCW11dGV4X2xvY2soJnJlY2VudF9tdXRleCk7CisJdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7CisJaWYgKHQgIT0gTlVMTCkgeworCQl0LT5yZWZjbnQrKzsKKwkJcmV0ID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSArIHNpemVvZih0LT5pcGhhc2hbMF0pICogaXBfbGlzdF9oYXNoX3NpemUsCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAodCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwl0LT5yZWZjbnQgPSAxOworCXN0cmNweSh0LT5uYW1lLCBpbmZvLT5uYW1lKTsKKwlJTklUX0xJU1RfSEVBRCgmdC0+bHJ1X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBpcF9saXN0X2hhc2hfc2l6ZTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmdC0+aXBoYXNoW2ldKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXQtPnByb2MgPSBwcm9jX2NyZWF0ZSh0LT5uYW1lLCBpcF9saXN0X3Blcm1zLCByZWNlbnRfcHJvY19kaXIsCisJCSAgJnJlY2VudF9tdF9mb3BzKTsKKwlpZiAodC0+cHJvYyA9PSBOVUxMKSB7CisJCWtmcmVlKHQpOworCQlnb3RvIG91dDsKKwl9CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlRfUFJPQ19DT01QQVQKKwl0LT5wcm9jX29sZCA9IHByb2NfY3JlYXRlKHQtPm5hbWUsIGlwX2xpc3RfcGVybXMsIHByb2Nfb2xkX2RpciwKKwkJICAgICAgJnJlY2VudF9vbGRfZm9wcyk7CisJaWYgKHQtPnByb2Nfb2xkID09IE5VTEwpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkodC0+bmFtZSwgcHJvY19vbGRfZGlyKTsKKwkJa2ZyZWUodCk7CisJCWdvdG8gb3V0OworCX0KKwl0LT5wcm9jX29sZC0+dWlkICAgPSBpcF9saXN0X3VpZDsKKwl0LT5wcm9jX29sZC0+Z2lkICAgPSBpcF9saXN0X2dpZDsKKwl0LT5wcm9jX29sZC0+ZGF0YSAgPSB0OworI2VuZGlmCisJdC0+cHJvYy0+dWlkICAgICAgID0gaXBfbGlzdF91aWQ7CisJdC0+cHJvYy0+Z2lkICAgICAgID0gaXBfbGlzdF9naWQ7CisJdC0+cHJvYy0+ZGF0YSAgICAgID0gdDsKKyNlbmRpZgorCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnQtPmxpc3QsICZ0YWJsZXMpOworCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJcmV0ID0gdHJ1ZTsKK291dDoKKwltdXRleF91bmxvY2soJnJlY2VudF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVjZW50X210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9yZWNlbnRfbXRpbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHJlY2VudF90YWJsZSAqdDsKKworCW11dGV4X2xvY2soJnJlY2VudF9tdXRleCk7CisJdCA9IHJlY2VudF90YWJsZV9sb29rdXAoaW5mby0+bmFtZSk7CisJaWYgKC0tdC0+cmVmY250ID09IDApIHsKKwkJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJCWxpc3RfZGVsKCZ0LT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UX1BST0NfQ09NUEFUCisJCXJlbW92ZV9wcm9jX2VudHJ5KHQtPm5hbWUsIHByb2Nfb2xkX2Rpcik7CisjZW5kaWYKKwkJcmVtb3ZlX3Byb2NfZW50cnkodC0+bmFtZSwgcmVjZW50X3Byb2NfZGlyKTsKKyNlbmRpZgorCQlyZWNlbnRfdGFibGVfZmx1c2godCk7CisJCWtmcmVlKHQpOworCX0KKwltdXRleF91bmxvY2soJnJlY2VudF9tdXRleCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RydWN0IHJlY2VudF9pdGVyX3N0YXRlIHsKKwljb25zdCBzdHJ1Y3QgcmVjZW50X3RhYmxlICp0YWJsZTsKKwl1bnNpZ25lZCBpbnQJCWJ1Y2tldDsKK307CisKK3N0YXRpYyB2b2lkICpyZWNlbnRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKKwlfX2FjcXVpcmVzKHJlY2VudF9sb2NrKQoreworCXN0cnVjdCByZWNlbnRfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7CisJY29uc3Qgc3RydWN0IHJlY2VudF90YWJsZSAqdCA9IHN0LT50YWJsZTsKKwlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplOworCWxvZmZfdCBwID0gKnBvczsKKworCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOworCisJZm9yIChzdC0+YnVja2V0ID0gMDsgc3QtPmJ1Y2tldCA8IGlwX2xpc3RfaGFzaF9zaXplOyBzdC0+YnVja2V0KyspCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJnQtPmlwaGFzaFtzdC0+YnVja2V0XSwgbGlzdCkKKwkJCWlmIChwLS0gPT0gMCkKKwkJCQlyZXR1cm4gZTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJlY2VudF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJlY2VudF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKKwljb25zdCBzdHJ1Y3QgcmVjZW50X3RhYmxlICp0ID0gc3QtPnRhYmxlOworCWNvbnN0IHN0cnVjdCByZWNlbnRfZW50cnkgKmUgPSB2OworCWNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBlLT5saXN0Lm5leHQ7CisKKwl3aGlsZSAoaGVhZCA9PSAmdC0+aXBoYXNoW3N0LT5idWNrZXRdKSB7CisJCWlmICgrK3N0LT5idWNrZXQgPj0gaXBfbGlzdF9oYXNoX3NpemUpCisJCQlyZXR1cm4gTlVMTDsKKwkJaGVhZCA9IHQtPmlwaGFzaFtzdC0+YnVja2V0XS5uZXh0OworCX0KKwkoKnBvcykrKzsKKwlyZXR1cm4gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgcmVjZW50X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQgcmVjZW50X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKKwlfX3JlbGVhc2VzKHJlY2VudF9sb2NrKQoreworCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcmVjZW50X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWNvbnN0IHN0cnVjdCByZWNlbnRfZW50cnkgKmUgPSB2OworCXVuc2lnbmVkIGludCBpOworCisJaSA9IChlLT5pbmRleCAtIDEpICUgaXBfcGt0X2xpc3RfdG90OworCWlmIChlLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0KQorCQlzZXFfcHJpbnRmKHNlcSwgInNyYz0iIE5JUFFVQURfRk1UICIgdHRsOiAldSBsYXN0X3NlZW46ICVsdSAiCisJCQkgICAib2xkZXN0X3BrdDogJXUiLCBOSVBRVUFEKGUtPmFkZHIuaXApLCBlLT50dGwsCisJCQkgICBlLT5zdGFtcHNbaV0sIGUtPmluZGV4KTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAic3JjPSIgTklQNl9GTVQgIiB0dGw6ICV1IGxhc3Rfc2VlbjogJWx1ICIKKwkJCSAgICJvbGRlc3RfcGt0OiAldSIsIE5JUDYoZS0+YWRkci5pbjYpLCBlLT50dGwsCisJCQkgICBlLT5zdGFtcHNbaV0sIGUtPmluZGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgZS0+bnN0YW1wczsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiVzICVsdSIsIGkgPyAiLCIgOiAiIiwgZS0+c3RhbXBzW2ldKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmVjZW50X3NlcV9vcHMgPSB7CisJLnN0YXJ0CQk9IHJlY2VudF9zZXFfc3RhcnQsCisJLm5leHQJCT0gcmVjZW50X3NlcV9uZXh0LAorCS5zdG9wCQk9IHJlY2VudF9zZXFfc3RvcCwKKwkuc2hvdwkJPSByZWNlbnRfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHJlY2VudF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJc3RydWN0IHJlY2VudF9pdGVyX3N0YXRlICpzdDsKKworCXN0ID0gX19zZXFfb3Blbl9wcml2YXRlKGZpbGUsICZyZWNlbnRfc2VxX29wcywgc2l6ZW9mKCpzdCkpOworCWlmIChzdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0LT50YWJsZSAgICA9IHBkZS0+ZGF0YTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UX1BST0NfQ09NUEFUCitzdGF0aWMgaW50IHJlY2VudF9vbGRfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RhdGljIGJvb2wgd2FybmVkX29mX29sZDsKKworCWlmICh1bmxpa2VseSghd2FybmVkX29mX29sZCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiBVc2Ugb2YgL3Byb2MvbmV0L2lwdF9yZWNlbnQiCisJCSAgICAgICAiIGlzIGRlcHJlY2F0ZWQ7IHVzZSAvcHJvYy9uZXQveHRfcmVjZW50LlxuIik7CisJCXdhcm5lZF9vZl9vbGQgPSB0cnVlOworCX0KKwlyZXR1cm4gcmVjZW50X3NlcV9vcGVuKGlub2RlLCBmaWxwKTsKK30KKworc3RhdGljIHNzaXplX3QgcmVjZW50X29sZF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmlucHV0LAorCQkJCSAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKK3sKKwljb25zdCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcmVjZW50X3RhYmxlICp0ID0gcGRlLT5kYXRhOworCXN0cnVjdCByZWNlbnRfZW50cnkgKmU7CisJY2hhciBidWZbc2l6ZW9mKCIrMjU1LjI1NS4yNTUuMjU1IildLCAqYyA9IGJ1ZjsKKwlfX2JlMzIgYWRkcjsKKwlpbnQgYWRkOworCisJaWYgKHNpemUgPiBzaXplb2YoYnVmKSkKKwkJc2l6ZSA9IHNpemVvZihidWYpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGlucHV0LCBzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3aGlsZSAoaXNzcGFjZSgqYykpCisJCWMrKzsKKworCWlmIChzaXplIC0gKGMgLSBidWYpIDwgNSkKKwkJcmV0dXJuIGMgLSBidWY7CisJaWYgKCFzdHJuY21wKGMsICJjbGVhciIsIDUpKSB7CisJCWMgKz0gNTsKKwkJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJCXJlY2VudF90YWJsZV9mbHVzaCh0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKKwkJcmV0dXJuIGMgLSBidWY7CisJfQorCisJc3dpdGNoICgqYykgeworCWNhc2UgJy0nOgorCQlhZGQgPSAwOworCQljKys7CisJCWJyZWFrOworCWNhc2UgJysnOgorCQljKys7CisJZGVmYXVsdDoKKwkJYWRkID0gMTsKKwkJYnJlYWs7CisJfQorCWFkZHIgPSBpbl9hdG9uKGMpOworCisJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJZSA9IHJlY2VudF9lbnRyeV9sb29rdXAodCwgKGNvbnN0IHZvaWQgKikmYWRkciwgTkZQUk9UT19JUFY0LCAwKTsKKwlpZiAoZSA9PSBOVUxMKSB7CisJCWlmIChhZGQpCisJCQlyZWNlbnRfZW50cnlfaW5pdCh0LCAoY29uc3Qgdm9pZCAqKSZhZGRyLAorCQkJCQkgIE5GUFJPVE9fSVBWNCwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKGFkZCkKKwkJCXJlY2VudF9lbnRyeV91cGRhdGUodCwgZSk7CisJCWVsc2UKKwkJCXJlY2VudF9lbnRyeV9yZW1vdmUodCwgZSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlY2VudF9vbGRfZm9wcyA9IHsKKwkub3BlbgkJPSByZWNlbnRfb2xkX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSByZWNlbnRfb2xkX3Byb2Nfd3JpdGUsCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QKK3JlY2VudF9tdF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqaW5wdXQsCisJCSAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKK3sKKwljb25zdCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcmVjZW50X3RhYmxlICp0ID0gcGRlLT5kYXRhOworCXN0cnVjdCByZWNlbnRfZW50cnkgKmU7CisJY2hhciBidWZbc2l6ZW9mKCIrYjMzNToxZDM1OjFlNTU6ZGVhZDpjMGRlOjE3MTU6NWFmZTpjMGRlIildOworCWNvbnN0IGNoYXIgKmMgPSBidWY7CisJdW5pb24gbmZfaW5ldF9hZGRyIGFkZHI7CisJdV9pbnQxNl90IGZhbWlseTsKKwlib29sIGFkZCwgc3VjYzsKKworCWlmIChzaXplID09IDApCisJCXJldHVybiAwOworCWlmIChzaXplID4gc2l6ZW9mKGJ1ZikpCisJCXNpemUgPSBzaXplb2YoYnVmKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBpbnB1dCwgc2l6ZSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBTdHJpY3QgcHJvdG9jb2whICovCisJaWYgKCpsb2ZmICE9IDApCisJCXJldHVybiAtRVNQSVBFOworCXN3aXRjaCAoKmMpIHsKKwljYXNlICcvJzogLyogZmx1c2ggdGFibGUgKi8KKwkJc3Bpbl9sb2NrX2JoKCZyZWNlbnRfbG9jayk7CisJCXJlY2VudF90YWJsZV9mbHVzaCh0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJnJlY2VudF9sb2NrKTsKKwkJcmV0dXJuIHNpemU7CisJY2FzZSAnLSc6IC8qIHJlbW92ZSBhZGRyZXNzICovCisJCWFkZCA9IGZhbHNlOworCQlicmVhazsKKwljYXNlICcrJzogLyogYWRkIGFkZHJlc3MgKi8KKwkJYWRkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiBOZWVkICtpcCwgLWlwIG9yIC9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkrK2M7CisJLS1zaXplOworCWlmIChzdHJuY2hyKGMsIHNpemUsICc6JykgIT0gTlVMTCkgeworCQlmYW1pbHkgPSBORlBST1RPX0lQVjY7CisJCXN1Y2MgICA9IGluNl9wdG9uKGMsIHNpemUsICh2b2lkICopJmFkZHIsICdcbicsIE5VTEwpOworCX0gZWxzZSB7CisJCWZhbWlseSA9IE5GUFJPVE9fSVBWNDsKKwkJc3VjYyAgID0gaW40X3B0b24oYywgc2l6ZSwgKHZvaWQgKikmYWRkciwgJ1xuJywgTlVMTCk7CisJfQorCisJaWYgKCFzdWNjKSB7CisJCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogaWxsZWdhbCBhZGRyZXNzIHdyaXR0ZW4gIgorCQkgICAgICAgInRvIHByb2Nmc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19iaCgmcmVjZW50X2xvY2spOworCWUgPSByZWNlbnRfZW50cnlfbG9va3VwKHQsICZhZGRyLCBmYW1pbHksIDApOworCWlmIChlID09IE5VTEwpIHsKKwkJaWYgKGFkZCkKKwkJCXJlY2VudF9lbnRyeV9pbml0KHQsICZhZGRyLCBmYW1pbHksIDApOworCX0gZWxzZSB7CisJCWlmIChhZGQpCisJCQlyZWNlbnRfZW50cnlfdXBkYXRlKHQsIGUpOworCQllbHNlCisJCQlyZWNlbnRfZW50cnlfcmVtb3ZlKHQsIGUpOworCX0KKwlzcGluX3VubG9ja19iaCgmcmVjZW50X2xvY2spOworCS8qIE5vdGUgd2UgcmVtb3ZlZCBvbmUgYWJvdmUgKi8KKwkqbG9mZiArPSBzaXplICsgMTsKKwlyZXR1cm4gc2l6ZSArIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlY2VudF9tdF9mb3BzID0geworCS5vcGVuICAgID0gcmVjZW50X3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLndyaXRlICAgPSByZWNlbnRfbXRfcHJvY193cml0ZSwKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKK307CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCByZWNlbnRfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gInJlY2VudCIsCisJCS5yZXZpc2lvbiAgID0gMCwKKwkJLmZhbWlseSAgICAgPSBORlBST1RPX0lQVjQsCisJCS5tYXRjaCAgICAgID0gcmVjZW50X210LAorCQkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfcmVjZW50X210aW5mbyksCisJCS5jaGVja2VudHJ5ID0gcmVjZW50X210X2NoZWNrLAorCQkuZGVzdHJveSAgICA9IHJlY2VudF9tdF9kZXN0cm95LAorCQkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSAgICAgICA9ICJyZWNlbnQiLAorCQkucmV2aXNpb24gICA9IDAsCisJCS5mYW1pbHkgICAgID0gTkZQUk9UT19JUFY2LAorCQkubWF0Y2ggICAgICA9IHJlY2VudF9tdCwKKwkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X3JlY2VudF9tdGluZm8pLAorCQkuY2hlY2tlbnRyeSA9IHJlY2VudF9tdF9jaGVjaywKKwkJLmRlc3Ryb3kgICAgPSByZWNlbnRfbXRfZGVzdHJveSwKKwkJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmVjZW50X210X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFpcF9saXN0X3RvdCB8fCAhaXBfcGt0X2xpc3RfdG90IHx8IGlwX3BrdF9saXN0X3RvdCA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXBfbGlzdF9oYXNoX3NpemUgPSAxIDw8IGZscyhpcF9saXN0X3RvdCk7CisKKwllcnIgPSB4dF9yZWdpc3Rlcl9tYXRjaGVzKHJlY2VudF9tdF9yZWcsIEFSUkFZX1NJWkUocmVjZW50X210X3JlZykpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZWNlbnRfcHJvY19kaXIgPSBwcm9jX21rZGlyKCJ4dF9yZWNlbnQiLCBpbml0X25ldC5wcm9jX25ldCk7CisJaWYgKHJlY2VudF9wcm9jX2RpciA9PSBOVUxMKSB7CisJCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhyZWNlbnRfbXRfcmVnLCBBUlJBWV9TSVpFKHJlY2VudF9tdF9yZWcpKTsKKwkJZXJyID0gLUVOT01FTTsKKwl9CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlRfUFJPQ19DT01QQVQKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlwcm9jX29sZF9kaXIgPSBwcm9jX21rZGlyKCJpcHRfcmVjZW50IiwgaW5pdF9uZXQucHJvY19uZXQpOworCWlmIChwcm9jX29sZF9kaXIgPT0gTlVMTCkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgieHRfcmVjZW50IiwgaW5pdF9uZXQucHJvY19uZXQpOworCQl4dF91bnJlZ2lzdGVyX21hdGNoZXMocmVjZW50X210X3JlZywgQVJSQVlfU0laRShyZWNlbnRfbXRfcmVnKSk7CisJCWVyciA9IC1FTk9NRU07CisJfQorI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmVjZW50X210X2V4aXQodm9pZCkKK3sKKwlCVUdfT04oIWxpc3RfZW1wdHkoJnRhYmxlcykpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhyZWNlbnRfbXRfcmVnLCBBUlJBWV9TSVpFKHJlY2VudF9tdF9yZWcpKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2lmZGVmIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UX1BST0NfQ09NUEFUCisJcmVtb3ZlX3Byb2NfZW50cnkoImlwdF9yZWNlbnQiLCBpbml0X25ldC5wcm9jX25ldCk7CisjZW5kaWYKKwlyZW1vdmVfcHJvY19lbnRyeSgieHRfcmVjZW50IiwgaW5pdF9uZXQucHJvY19uZXQpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KHJlY2VudF9tdF9pbml0KTsKK21vZHVsZV9leGl0KHJlY2VudF9tdF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKaW5kZXggZTZlNDY4MS4uZTIyM2NiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKQEAgLTExNywyMyArMTE3LDIxIEBACiB9CiAKIHN0YXRpYyBib29sCi1zY3RwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgYm9vbCAqaG90ZHJvcCkKK3NjdHBfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAJY29uc3Qgc2N0cF9zY3RwaGRyX3QgKnNoOwogCXNjdHBfc2N0cGhkcl90IF9zaDsKIAotCWlmIChvZmZzZXQpIHsKKwlpZiAocGFyLT5mcmFnb2ZmICE9IDApIHsKIAkJZHVwcmludGYoIkRyb3BwaW5nIG5vbi1maXJzdCBmcmFnbWVudC4uIEZJWE1FXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9zaCksICZfc2gpOworCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcGFyLT50aG9mZiwgc2l6ZW9mKF9zaCksICZfc2gpOwogCWlmIChzaCA9PSBOVUxMKSB7CiAJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IHRydWU7CisJCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWR1cHJpbnRmKCJzcHQ6ICVkXHRkcHQ6ICVkXG4iLCBudG9ocyhzaC0+c291cmNlKSwgbnRvaHMoc2gtPmRlc3QpKTsKQEAgLTE0NCwxNyArMTQyLDE0IEBACiAJCSYmIFNDQ0hFQ0sobnRvaHMoc2gtPmRlc3QpID49IGluZm8tPmRwdHNbMF0KIAkJCSYmIG50b2hzKHNoLT5kZXN0KSA8PSBpbmZvLT5kcHRzWzFdLAogCQkJWFRfU0NUUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIFNDQ0hFQ0sobWF0Y2hfcGFja2V0KHNrYiwgcHJvdG9mZiArIHNpemVvZiAoc2N0cF9zY3RwaGRyX3QpLAotCQkJCQlpbmZvLCBob3Rkcm9wKSwKKwkJJiYgU0NDSEVDSyhtYXRjaF9wYWNrZXQoc2tiLCBwYXItPnRob2ZmICsgc2l6ZW9mKHNjdHBfc2N0cGhkcl90KSwKKwkJCQkJaW5mbywgcGFyLT5ob3Rkcm9wKSwKIAkJCSAgIFhUX1NDVFBfQ0hVTktfVFlQRVMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7CiB9CiAKLXN0YXRpYyBib29sCi1zY3RwX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mLAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBzY3RwX210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJcmV0dXJuICEoaW5mby0+ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKIAkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQpAQCAtMTY5LDcgKzE2NCw3IEBACiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNjdHBfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJzY3RwIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLmNoZWNrZW50cnkJPSBzY3RwX210X2NoZWNrLAogCQkubWF0Y2gJCT0gc2N0cF9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfc2N0cF9pbmZvKSwKQEAgLTE3OCw3ICsxNzMsNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAic2N0cCIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkuY2hlY2tlbnRyeQk9IHNjdHBfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBzY3RwX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zY3RwX2luZm8pLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhOGZlZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBUcmFuc3BhcmVudCBwcm94eSBzdXBwb3J0IGZvciBMaW51eC9pcHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEJhbGFCaXQgSVQgTHRkLgorICogQXV0aG9yOiBLcmlzenRpYW4gS292YWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3Rwcm94eV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2RlZnJhZ19pcHY0Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjZGVmaW5lIFhUX1NPQ0tFVF9IQVZFX0NPTk5UUkFDSyAxCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNlbmRpZgorCitzdGF0aWMgaW50CitleHRyYWN0X2ljbXBfZmllbGRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICB1OCAqcHJvdG9jb2wsCisJCSAgICBfX2JlMzIgKnJhZGRyLAorCQkgICAgX19iZTMyICpsYWRkciwKKwkJICAgIF9fYmUxNiAqcnBvcnQsCisJCSAgICBfX2JlMTYgKmxwb3J0KQoreworCXVuc2lnbmVkIGludCBvdXRzaWRlX2hkcmxlbiA9IGlwX2hkcmxlbihza2IpOworCXN0cnVjdCBpcGhkciAqaW5zaWRlX2lwaCwgX2luc2lkZV9pcGg7CisJc3RydWN0IGljbXBoZHIgKmljbXBoLCBfaWNtcGg7CisJX19iZTE2ICpwb3J0cywgX3BvcnRzWzJdOworCisJaWNtcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvdXRzaWRlX2hkcmxlbiwKKwkJCQkgICBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CisJaWYgKGljbXBoID09IE5VTEwpCisJCXJldHVybiAxOworCisJc3dpdGNoIChpY21waC0+dHlwZSkgeworCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CisJY2FzZSBJQ01QX1NPVVJDRV9RVUVOQ0g6CisJY2FzZSBJQ01QX1JFRElSRUNUOgorCWNhc2UgSUNNUF9USU1FX0VYQ0VFREVEOgorCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlpbnNpZGVfaXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb3V0c2lkZV9oZHJsZW4gKworCQkJCQlzaXplb2Yoc3RydWN0IGljbXBoZHIpLAorCQkJCQlzaXplb2YoX2luc2lkZV9pcGgpLCAmX2luc2lkZV9pcGgpOworCWlmIChpbnNpZGVfaXBoID09IE5VTEwpCisJCXJldHVybiAxOworCisJaWYgKGluc2lkZV9pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQICYmCisJICAgIGluc2lkZV9pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVURQKQorCQlyZXR1cm4gMTsKKworCXBvcnRzID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb3V0c2lkZV9oZHJsZW4gKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKworCQkJCSAgIChpbnNpZGVfaXBoLT5paGwgPDwgMiksCisJCQkJICAgc2l6ZW9mKF9wb3J0cyksICZfcG9ydHMpOworCWlmIChwb3J0cyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCS8qIHRoZSBpbnNpZGUgSVAgcGFja2V0IGlzIHRoZSBvbmUgcXVvdGVkIGZyb20gb3VyIHNpZGUsIHRodXMKKwkgKiBpdHMgc2FkZHIgaXMgdGhlIGxvY2FsIGFkZHJlc3MgKi8KKwkqcHJvdG9jb2wgPSBpbnNpZGVfaXBoLT5wcm90b2NvbDsKKwkqbGFkZHIgPSBpbnNpZGVfaXBoLT5zYWRkcjsKKwkqbHBvcnQgPSBwb3J0c1swXTsKKwkqcmFkZHIgPSBpbnNpZGVfaXBoLT5kYWRkcjsKKwkqcnBvcnQgPSBwb3J0c1sxXTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBib29sCitzb2NrZXRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwlzdHJ1Y3QgdWRwaGRyIF9oZHIsICpocCA9IE5VTEw7CisJc3RydWN0IHNvY2sgKnNrOworCV9fYmUzMiBkYWRkciwgc2FkZHI7CisJX19iZTE2IGRwb3J0LCBzcG9ydDsKKwl1OCBwcm90b2NvbDsKKyNpZmRlZiBYVF9TT0NLRVRfSEFWRV9DT05OVFJBQ0sKKwlzdHJ1Y3QgbmZfY29ubiBjb25zdCAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisjZW5kaWYKKworCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQIHx8IGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwKKwkJCQkJc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJCWlmIChocCA9PSBOVUxMKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXByb3RvY29sID0gaXBoLT5wcm90b2NvbDsKKwkJc2FkZHIgPSBpcGgtPnNhZGRyOworCQlzcG9ydCA9IGhwLT5zb3VyY2U7CisJCWRhZGRyID0gaXBoLT5kYWRkcjsKKwkJZHBvcnQgPSBocC0+ZGVzdDsKKworCX0gZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKKwkJaWYgKGV4dHJhY3RfaWNtcF9maWVsZHMoc2tiLCAmcHJvdG9jb2wsICZzYWRkciwgJmRhZGRyLAorCQkJCQkmc3BvcnQsICZkcG9ydCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworI2lmZGVmIFhUX1NPQ0tFVF9IQVZFX0NPTk5UUkFDSworCS8qIERvIHRoZSBsb29rdXAgd2l0aCB0aGUgb3JpZ2luYWwgc29ja2V0IGFkZHJlc3MgaW4gY2FzZSB0aGlzIGlzIGEKKwkgKiByZXBseSBwYWNrZXQgb2YgYW4gZXN0YWJsaXNoZWQgU05BVC10ZWQgY29ubmVjdGlvbi4gKi8KKworCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJaWYgKGN0ICYmIChjdCAhPSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZCkgJiYKKwkgICAgKChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCAmJgorCSAgICAgIGN0aW5mbyA9PSBJUF9DVF9JU19SRVBMWSArIElQX0NUX0VTVEFCTElTSEVEKSB8fAorCSAgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QICYmCisJICAgICAgY3RpbmZvID09IElQX0NUX0lTX1JFUExZICsgSVBfQ1RfUkVMQVRFRCkpICYmCisJICAgIChjdC0+c3RhdHVzICYgSVBTX1NSQ19OQVRfRE9ORSkpIHsKKworCQlkYWRkciA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXA7CisJCWRwb3J0ID0gKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApID8KKwkJCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudS50Y3AucG9ydCA6CisJCQljdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUudWRwLnBvcnQ7CisJfQorI2VuZGlmCisKKwlzayA9IG5mX3Rwcm94eV9nZXRfc29ja192NChkZXZfbmV0KHNrYi0+ZGV2KSwgcHJvdG9jb2wsCisJCQkJICAgc2FkZHIsIGRhZGRyLCBzcG9ydCwgZHBvcnQsIHBhci0+aW4sIGZhbHNlKTsKKwlpZiAoc2sgIT0gTlVMTCkgeworCQlib29sIHdpbGRjYXJkID0gKGluZXRfc2soc2spLT5yY3Zfc2FkZHIgPT0gMCk7CisKKwkJbmZfdHByb3h5X3B1dF9zb2NrKHNrKTsKKwkJaWYgKHdpbGRjYXJkKQorCQkJc2sgPSBOVUxMOworCX0KKworCXByX2RlYnVnKCJzb2NrZXQgbWF0Y2g6IHByb3RvICV1ICUwOHg6JXUgLT4gJTA4eDoldSAiCisJCSAiKG9yaWcgJTA4eDoldSkgc29jayAlcFxuIiwKKwkJIHByb3RvY29sLCBudG9obChzYWRkciksIG50b2hzKHNwb3J0KSwKKwkJIG50b2hsKGRhZGRyKSwgbnRvaHMoZHBvcnQpLAorCQkgbnRvaGwoaXBoLT5kYWRkciksIGhwID8gbnRvaHMoaHAtPmRlc3QpIDogMCwgc2spOworCisJcmV0dXJuIChzayAhPSBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzb2NrZXRfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInNvY2tldCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAorCS5tYXRjaAkJPSBzb2NrZXRfbXQsCisJLmhvb2tzCQk9IDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb2NrZXRfbXRfaW5pdCh2b2lkKQoreworCW5mX2RlZnJhZ19pcHY0X2VuYWJsZSgpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmc29ja2V0X210X3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzb2NrZXRfbXRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnNvY2tldF9tdF9yZWcpOworfQorCittb2R1bGVfaW5pdChzb2NrZXRfbXRfaW5pdCk7Cittb2R1bGVfZXhpdChzb2NrZXRfbXRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIktyaXN6dGlhbiBLb3ZhY3MsIEJhbGF6cyBTY2hlaWRsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigieF90YWJsZXMgc29ja2V0IG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfc29ja2V0Iik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKaW5kZXggYTc3NmRjMy4uNGM5NDZjYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwpAQCAtMjEsMTIgKzIxLDkgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9zdGF0ZSIpOwogCiBzdGF0aWMgYm9vbAotc3RhdGVfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICAgICBib29sICpob3Rkcm9wKQorc3RhdGVfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3N0YXRlX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9zdGF0ZV9pbmZvICpzaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKIApAQCAtNDAsMjggKzM3LDI1IEBACiAJcmV0dXJuIChzaW5mby0+c3RhdGVtYXNrICYgc3RhdGViaXQpOwogfQogCi1zdGF0aWMgYm9vbAotc3RhdGVfbXRfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCB2b2lkICppbmYsCi0gICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQorc3RhdGljIGJvb2wgc3RhdGVfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQobWF0Y2gtPmZhbWlseSkgPCAwKSB7CisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5tYXRjaC0+ZmFtaWx5KSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgotCQkJCSAgICAicHJvdG89JXVcbiIsIG1hdGNoLT5mYW1pbHkpOworCQkJCSAgICAicHJvdG89JXVcbiIsIHBhci0+bWF0Y2gtPmZhbWlseSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIHN0YXRlX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQorc3RhdGljIHZvaWQgc3RhdGVfbXRfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCiB7Ci0JbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KG1hdGNoLT5mYW1pbHkpOworCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChwYXItPm1hdGNoLT5mYW1pbHkpOwogfQogCiBzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0YXRlX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7CiAJewogCQkubmFtZQkJPSAic3RhdGUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkuY2hlY2tlbnRyeQk9IHN0YXRlX210X2NoZWNrLAogCQkubWF0Y2gJCT0gc3RhdGVfbXQsCiAJCS5kZXN0cm95CT0gc3RhdGVfbXRfZGVzdHJveSwKQEAgLTcwLDcgKzY0LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gInN0YXRlIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5jaGVja2VudHJ5CT0gc3RhdGVfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSBzdGF0ZV9tdCwKIAkJLmRlc3Ryb3kJPSBzdGF0ZV9tdF9kZXN0cm95LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmMKaW5kZXggNDMxMzMwOC4uMGQ3NTE0MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5jCkBAIC0yNSwxMiArMjUsOSBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhudGhfbG9jayk7CiAKIHN0YXRpYyBib29sCi1zdGF0aXN0aWNfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICAgICBib29sICpob3Rkcm9wKQorc3RhdGlzdGljX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCXN0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgeHRfc3RhdGlzdGljX2luZm8gKiltYXRjaGluZm87CisJc3RydWN0IHh0X3N0YXRpc3RpY19pbmZvICppbmZvID0gKHZvaWQgKilwYXItPm1hdGNoaW5mbzsKIAlib29sIHJldCA9IGluZm8tPmZsYWdzICYgWFRfU1RBVElTVElDX0lOVkVSVDsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewpAQCAtNTIsMTIgKzQ5LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYm9vbAotc3RhdGlzdGljX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZW50cnksCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBzdGF0aXN0aWNfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X3N0YXRpc3RpY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaWYgKGluZm8tPm1vZGUgPiBYVF9TVEFUSVNUSUNfTU9ERV9NQVggfHwKIAkgICAgaW5mby0+ZmxhZ3MgJiB+WFRfU1RBVElTVElDX01BU0spCkBAIC02NiwzNSArNjAsMjQgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdGF0aXN0aWNfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJzdGF0aXN0aWMiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCi0JCS5jaGVja2VudHJ5CT0gc3RhdGlzdGljX210X2NoZWNrLAotCQkubWF0Y2gJCT0gc3RhdGlzdGljX210LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gInN0YXRpc3RpYyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JCS5jaGVja2VudHJ5CT0gc3RhdGlzdGljX210X2NoZWNrLAotCQkubWF0Y2gJCT0gc3RhdGlzdGljX210LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbyksCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF9zdGF0aXN0aWNfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAic3RhdGlzdGljIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkubWF0Y2ggICAgICA9IHN0YXRpc3RpY19tdCwKKwkuY2hlY2tlbnRyeSA9IHN0YXRpc3RpY19tdF9jaGVjaywKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfc3RhdGlzdGljX2luZm8pLAorCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzdGF0aXN0aWNfbXRfaW5pdCh2b2lkKQogewotCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaGVzKHN0YXRpc3RpY19tdF9yZWcsCi0JICAgICAgIEFSUkFZX1NJWkUoc3RhdGlzdGljX210X3JlZykpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmeHRfc3RhdGlzdGljX210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzdGF0aXN0aWNfbXRfZXhpdCh2b2lkKQogewotCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhzdGF0aXN0aWNfbXRfcmVnLAotCSAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHN0YXRpc3RpY19tdF9yZWcpKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZ4dF9zdGF0aXN0aWNfbXRfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoc3RhdGlzdGljX210X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMKaW5kZXggNDkwMzE4Mi4uYjRkNzc0MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCkBAIC0yMiwxOCArMjIsMTUgQEAKIE1PRFVMRV9BTElBUygiaXA2dF9zdHJpbmciKTsKIAogc3RhdGljIGJvb2wKLXN0cmluZ19tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgICAgIGJvb2wgKmhvdGRyb3ApCitzdHJpbmdfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3N0cmluZ19pbmZvICpjb25mID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IHBhci0+bWF0Y2hpbmZvOwogCXN0cnVjdCB0c19zdGF0ZSBzdGF0ZTsKIAlpbnQgaW52ZXJ0OwogCiAJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0c19zdGF0ZSkpOwogCi0JaW52ZXJ0ID0gKG1hdGNoLT5yZXZpc2lvbiA9PSAwID8gY29uZi0+dS52MC5pbnZlcnQgOgorCWludmVydCA9IChwYXItPm1hdGNoLT5yZXZpc2lvbiA9PSAwID8gY29uZi0+dS52MC5pbnZlcnQgOgogCQkJCSAgICBjb25mLT51LnYxLmZsYWdzICYgWFRfU1RSSU5HX0ZMQUdfSU5WRVJUKTsKIAogCXJldHVybiAoc2tiX2ZpbmRfdGV4dCgoc3RydWN0IHNrX2J1ZmYgKilza2IsIGNvbmYtPmZyb21fb2Zmc2V0LApAQCAtNDMsMTIgKzQwLDkgQEAKIAogI2RlZmluZSBTVFJJTkdfVEVYVF9QUklWKG0pICgoc3RydWN0IHh0X3N0cmluZ19pbmZvICopKG0pKQogCi1zdGF0aWMgYm9vbAotc3RyaW5nX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCitzdGF0aWMgYm9vbCBzdHJpbmdfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IHh0X3N0cmluZ19pbmZvICpjb25mID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IHBhci0+bWF0Y2hpbmZvOwogCXN0cnVjdCB0c19jb25maWcgKnRzX2NvbmY7CiAJaW50IGZsYWdzID0gVFNfQVVUT0xPQUQ7CiAKQEAgLTU5LDcgKzUzLDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChjb25mLT5wYXRsZW4gPiBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChtYXRjaC0+cmV2aXNpb24gPT0gMSkgeworCWlmIChwYXItPm1hdGNoLT5yZXZpc2lvbiA9PSAxKSB7CiAJCWlmIChjb25mLT51LnYxLmZsYWdzICYKIAkJICAgIH4oWFRfU1RSSU5HX0ZMQUdfSUdOT1JFQ0FTRSB8IFhUX1NUUklOR19GTEFHX0lOVkVSVCkpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC03NiwxNiArNzAsMTYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgc3RyaW5nX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQorc3RhdGljIHZvaWQgc3RyaW5nX210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCXRleHRzZWFyY2hfZGVzdHJveShTVFJJTkdfVEVYVF9QUklWKG1hdGNoaW5mbyktPmNvbmZpZyk7CisJdGV4dHNlYXJjaF9kZXN0cm95KFNUUklOR19URVhUX1BSSVYocGFyLT5tYXRjaGluZm8pLT5jb25maWcpOwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0cmluZ19tdF9yZWdbXSBfX3JlYWRfbW9zdGx5ID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF9zdHJpbmdfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lIAkJPSAic3RyaW5nIiwKIAkJLnJldmlzaW9uCT0gMCwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fVU5TUEVDLAogCQkuY2hlY2tlbnRyeQk9IHN0cmluZ19tdF9jaGVjaywKIAkJLm1hdGNoIAkJPSBzdHJpbmdfbXQsCiAJCS5kZXN0cm95IAk9IHN0cmluZ19tdF9kZXN0cm95LApAQCAtOTUsMjcgKzg5LDcgQEAKIAl7CiAJCS5uYW1lIAkJPSAic3RyaW5nIiwKIAkJLnJldmlzaW9uCT0gMSwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAotCQkuY2hlY2tlbnRyeQk9IHN0cmluZ19tdF9jaGVjaywKLQkJLm1hdGNoIAkJPSBzdHJpbmdfbXQsCi0JCS5kZXN0cm95IAk9IHN0cmluZ19tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zdHJpbmdfaW5mbyksCi0JCS5tZSAJCT0gVEhJU19NT0RVTEUKLQl9LAotCXsKLQkJLm5hbWUgCQk9ICJzdHJpbmciLAotCQkucmV2aXNpb24JPSAwLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCQkuY2hlY2tlbnRyeQk9IHN0cmluZ19tdF9jaGVjaywKLQkJLm1hdGNoIAkJPSBzdHJpbmdfbXQsCi0JCS5kZXN0cm95IAk9IHN0cmluZ19tdF9kZXN0cm95LAotCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9zdHJpbmdfaW5mbyksCi0JCS5tZSAJCT0gVEhJU19NT0RVTEUKLQl9LAotCXsKLQkJLm5hbWUgCQk9ICJzdHJpbmciLAotCQkucmV2aXNpb24JPSAxLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fVU5TUEVDLAogCQkuY2hlY2tlbnRyeQk9IHN0cmluZ19tdF9jaGVjaywKIAkJLm1hdGNoIAkJPSBzdHJpbmdfbXQsCiAJCS5kZXN0cm95IAk9IHN0cmluZ19tdF9kZXN0cm95LApAQCAtMTI2LDEyICsxMDAsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3RyaW5nX210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyhzdHJpbmdfbXRfcmVnLCBBUlJBWV9TSVpFKHN0cmluZ19tdF9yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyh4dF9zdHJpbmdfbXRfcmVnLAorCQkJCSAgIEFSUkFZX1NJWkUoeHRfc3RyaW5nX210X3JlZykpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3RyaW5nX210X2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXMoc3RyaW5nX210X3JlZywgQVJSQVlfU0laRShzdHJpbmdfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKHh0X3N0cmluZ19tdF9yZWcsIEFSUkFZX1NJWkUoeHRfc3RyaW5nX210X3JlZykpOwogfQogCiBtb2R1bGVfaW5pdChzdHJpbmdfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jIGIvbmV0L25ldGZpbHRlci94dF90Y3Btc3MuYwppbmRleCA2NzcxYmYwLi40ODA5YjM0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwbXNzLmMKQEAgLTI1LDEyICsyNSw5IEBACiBNT0RVTEVfQUxJQVMoImlwNnRfdGNwbXNzIik7CiAKIHN0YXRpYyBib29sCi10Y3Btc3NfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgICAgICBib29sICpob3Rkcm9wKQordGNwbXNzX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX21hdGNoX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aDsKIAlzdHJ1Y3QgdGNwaGRyIF90Y3BoOwogCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLwpAQCAtMzksNyArMzYsNyBAQAogCXVuc2lnbmVkIGludCBpLCBvcHRsZW47CiAKIAkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CiAJaWYgKHRoID09IE5VTEwpCiAJCWdvdG8gZHJvcGl0OwogCkBAIC01Miw3ICs0OSw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogVHJ1bmNhdGVkIG9wdGlvbnMuICovCi0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmICsgc2l6ZW9mKCp0aCksIG9wdGxlbiwgX29wdCk7CisJb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwYXItPnRob2ZmICsgc2l6ZW9mKCp0aCksIG9wdGxlbiwgX29wdCk7CiAJaWYgKG9wID09IE5VTEwpCiAJCWdvdG8gZHJvcGl0OwogCkBAIC03NiwxNCArNzMsMTQgQEAKIAlyZXR1cm4gaW5mby0+aW52ZXJ0OwogCiBkcm9waXQ6Ci0JKmhvdGRyb3AgPSB0cnVlOworCSpwYXItPmhvdGRyb3AgPSB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0Y3Btc3NfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJ0Y3Btc3MiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkubWF0Y2gJCT0gdGNwbXNzX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyksCiAJCS5wcm90bwkJPSBJUFBST1RPX1RDUCwKQEAgLTkxLDcgKzg4LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gInRjcG1zcyIsCi0JCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkubWF0Y2gJCT0gdGNwbXNzX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyksCiAJCS5wcm90bwkJPSBJUFBST1RPX1RDUCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jCmluZGV4IDk1MWIwNmIuLjFlYmRjNDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYwpAQCAtNjgsMjUgKzY4LDIyIEBACiAJcmV0dXJuIGludmVydDsKIH0KIAotc3RhdGljIGJvb2wKLXRjcF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgdGNwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoOwogCXN0cnVjdCB0Y3BoZHIgX3RjcGg7Ci0JY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdGNwICp0Y3BpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKLQlpZiAob2Zmc2V0KSB7CisJaWYgKHBhci0+ZnJhZ29mZiAhPSAwKSB7CiAJCS8qIFRvIHF1b3RlIEFsYW46CiAKIAkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAogCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQogCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgogCQkqLwotCQlpZiAob2Zmc2V0ID09IDEpIHsKKwkJaWYgKHBhci0+ZnJhZ29mZiA9PSAxKSB7CiAJCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBUQ1Agb2Zmc2V0PTEgZnJhZy5cbiIpOwotCQkJKmhvdGRyb3AgPSB0cnVlOworCQkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCX0KIAkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KIAkJcmV0dXJuIGZhbHNlOwpAQCAtOTQsMTIgKzkxLDEyIEBACiAKICNkZWZpbmUgRldJTlZUQ1AoYm9vbCwgaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiAoaW52ZmxnKSkpCiAKLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwYXItPnRob2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwogCWlmICh0aCA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KIAkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTExNyw0OSArMTE0LDQyIEBACiAJCXJldHVybiBmYWxzZTsKIAlpZiAodGNwaW5mby0+b3B0aW9uKSB7CiAJCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7Ci0JCQkqaG90ZHJvcCA9IHRydWU7CisJCQkqcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwKKwkJaWYgKCF0Y3BfZmluZF9vcHRpb24odGNwaW5mby0+b3B0aW9uLCBza2IsIHBhci0+dGhvZmYsCiAJCQkJICAgICB0aC0+ZG9mZio0IC0gc2l6ZW9mKF90Y3BoKSwKIAkJCQkgICAgIHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9PUFRJT04sCi0JCQkJICAgICBob3Rkcm9wKSkKKwkJCQkgICAgIHBhci0+aG90ZHJvcCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCXJldHVybiB0cnVlOwogfQogCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgYm9vbAotdGNwX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mbywKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHRjcF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfdGNwICp0Y3BpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgc3BlY2lmeSBubyB1bmtub3duIGludmZsYWdzICovCiAJcmV0dXJuICEodGNwaW5mby0+aW52ZmxhZ3MgJiB+WFRfVENQX0lOVl9NQVNLKTsKIH0KIAotc3RhdGljIGJvb2wKLXVkcF9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBib29sICpob3Rkcm9wKQorc3RhdGljIGJvb2wgdWRwX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVoOwogCXN0cnVjdCB1ZHBoZHIgX3VkcGg7Ci0JY29uc3Qgc3RydWN0IHh0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCWlmIChvZmZzZXQpCisJaWYgKHBhci0+ZnJhZ29mZiAhPSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdWRwaCksICZfdWRwaCk7CisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwYXItPnRob2ZmLCBzaXplb2YoX3VkcGgpLCAmX3VkcGgpOwogCWlmICh1aCA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KIAkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVURQIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gdHJ1ZTsKKwkJKnBhci0+aG90ZHJvcCA9IHRydWU7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTE3MSwxMyArMTYxLDkgQEAKIAkJCSAgICAgICEhKHVkcGluZm8tPmludmZsYWdzICYgWFRfVURQX0lOVl9EU1RQVCkpOwogfQogCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgYm9vbAotdWRwX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaW5mbywKLSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHVkcF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF91ZHAgKnVkcGluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCS8qIE11c3Qgc3BlY2lmeSBubyB1bmtub3duIGludmZsYWdzICovCiAJcmV0dXJuICEodWRwaW5mby0+aW52ZmxhZ3MgJiB+WFRfVURQX0lOVl9NQVNLKTsKQEAgLTE4Niw3ICsxNzIsNyBAQAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0Y3B1ZHBfbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJ0Y3AiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkuY2hlY2tlbnRyeQk9IHRjcF9tdF9jaGVjaywKIAkJLm1hdGNoCQk9IHRjcF9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdGNwKSwKQEAgLTE5NSw3ICsxODEsNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAidGNwIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5jaGVja2VudHJ5CT0gdGNwX210X2NoZWNrLAogCQkubWF0Y2gJCT0gdGNwX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF90Y3ApLApAQCAtMjA0LDcgKzE5MCw3IEBACiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJ1ZHAiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQsCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAogCQkuY2hlY2tlbnRyeQk9IHVkcF9tdF9jaGVjaywKIAkJLm1hdGNoCQk9IHVkcF9tdCwKIAkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdWRwKSwKQEAgLTIxMyw3ICsxOTksNyBAQAogCX0sCiAJewogCQkubmFtZQkJPSAidWRwIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCiAJCS5jaGVja2VudHJ5CT0gdWRwX210X2NoZWNrLAogCQkubWF0Y2gJCT0gdWRwX210LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF91ZHApLApAQCAtMjIyLDcgKzIwOCw3IEBACiAJfSwKIAl7CiAJCS5uYW1lCQk9ICJ1ZHBsaXRlIiwKLQkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkJLmNoZWNrZW50cnkJPSB1ZHBfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSB1ZHBfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3VkcCksCkBAIC0yMzEsNyArMjE3LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUJCT0gInVkcGxpdGUiLAotCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKIAkJLmNoZWNrZW50cnkJPSB1ZHBfbXRfY2hlY2ssCiAJCS5tYXRjaAkJPSB1ZHBfbXQsCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3VkcCksCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3RpbWUuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGltZS5jCmluZGV4IDlmMzI4NTkuLjI5Mzc1YmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfdGltZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdGltZS5jCkBAIC0xMzYsMjYgKzEzNiwyNiBAQAogCSAqIGZyb20gdyByZXBlYXRlZGx5IHdoaWxlIGNvdW50aW5nLikKIAkgKi8KIAlpZiAoaXNfbGVhcCh5ZWFyKSkgeworCQkvKiB1c2UgZGF5c19zaW5jZV9sZWFweWVhcltdIGluIGEgbGVhcCB5ZWFyICovCiAJCWZvciAoaSA9IEFSUkFZX1NJWkUoZGF5c19zaW5jZV9sZWFweWVhcikgLSAxOwotCQkgICAgaSA+IDAgJiYgZGF5c19zaW5jZV95ZWFyW2ldID4gdzsgLS1pKQorCQkgICAgaSA+IDAgJiYgZGF5c19zaW5jZV9sZWFweWVhcltpXSA+IHc7IC0taSkKIAkJCS8qIGp1c3QgbG9vcCAqLzsKKwkJci0+bW9udGhkYXkgPSB3IC0gZGF5c19zaW5jZV9sZWFweWVhcltpXSArIDE7CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gQVJSQVlfU0laRShkYXlzX3NpbmNlX3llYXIpIC0gMTsKIAkJICAgIGkgPiAwICYmIGRheXNfc2luY2VfeWVhcltpXSA+IHc7IC0taSkKIAkJCS8qIGp1c3QgbG9vcCAqLzsKKwkJci0+bW9udGhkYXkgPSB3IC0gZGF5c19zaW5jZV95ZWFyW2ldICsgMTsKIAl9CiAKIAlyLT5tb250aCAgICA9IGkgKyAxOwotCXItPm1vbnRoZGF5ID0gdyAtIGRheXNfc2luY2VfeWVhcltpXSArIDE7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgYm9vbAotdGltZV9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCit0aW1lX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9tYXRjaF9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF90aW1lX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X3RpbWVfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBwYWNrZXRfdGltZTsKIAlzdHJ1Y3QgeHRtIGN1cnJlbnRfdGltZTsKIAlzNjQgc3RhbXA7CkBAIC0yMTgsMTIgKzIxOCw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBib29sCi10aW1lX210X2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCi0gICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3N0YXRpYyBib29sIHRpbWVfbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3RpbWVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdGltZV9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CiAKIAlpZiAoaW5mby0+ZGF5dGltZV9zdGFydCA+IFhUX1RJTUVfTUFYX0RBWVRJTUUgfHwKIAkgICAgaW5mby0+ZGF5dGltZV9zdG9wID4gWFRfVElNRV9NQVhfREFZVElNRSkgewpAQCAtMjM1LDMzICsyMzIsMjMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0aW1lX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZSAgICAgICA9ICJ0aW1lIiwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVULAotCQkubWF0Y2ggICAgICA9IHRpbWVfbXQsCi0JCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF90aW1lX2luZm8pLAotCQkuY2hlY2tlbnRyeSA9IHRpbWVfbXRfY2hlY2ssCi0JCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgID0gInRpbWUiLAotCQkuZmFtaWx5ICAgICA9IEFGX0lORVQ2LAotCQkubWF0Y2ggICAgICA9IHRpbWVfbXQsCi0JCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF90aW1lX2luZm8pLAotCQkuY2hlY2tlbnRyeSA9IHRpbWVfbXRfY2hlY2ssCi0JCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggeHRfdGltZV9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJ0aW1lIiwKKwkuZmFtaWx5ICAgICA9IE5GUFJPVE9fVU5TUEVDLAorCS5tYXRjaCAgICAgID0gdGltZV9tdCwKKwkuY2hlY2tlbnRyeSA9IHRpbWVfbXRfY2hlY2ssCisJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X3RpbWVfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRpbWVfbXRfaW5pdCh2b2lkKQogewotCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaGVzKHRpbWVfbXRfcmVnLCBBUlJBWV9TSVpFKHRpbWVfbXRfcmVnKSk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZ4dF90aW1lX210X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0aW1lX210X2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXModGltZV9tdF9yZWcsIEFSUkFZX1NJWkUodGltZV9tdF9yZWcpKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZ4dF90aW1lX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KHRpbWVfbXRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3UzMi5jIGIvbmV0L25ldGZpbHRlci94dF91MzIuYwppbmRleCA2MjdlMGYzLi4yNGE1Mjc2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3UzMi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfdTMyLmMKQEAgLTg3LDQzICs4NywzMiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbAotdTMyX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAotICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGJvb2wgKmhvdGRyb3ApCitzdGF0aWMgYm9vbCB1MzJfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X21hdGNoX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X3UzMiAqZGF0YSA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdTMyICpkYXRhID0gcGFyLT5tYXRjaGluZm87CiAJYm9vbCByZXQ7CiAKIAlyZXQgPSB1MzJfbWF0Y2hfaXQoZGF0YSwgc2tiKTsKIAlyZXR1cm4gcmV0IF4gZGF0YS0+aW52ZXJ0OwogfQogCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIHUzMl9tdF9yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLm5hbWUgICAgICAgPSAidTMyIiwKLQkJLmZhbWlseSAgICAgPSBBRl9JTkVULAotCQkubWF0Y2ggICAgICA9IHUzMl9tdCwKLQkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHh0X3UzMiksCi0JCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgID0gInUzMiIsCi0JCS5mYW1pbHkgICAgID0gQUZfSU5FVDYsCi0JCS5tYXRjaCAgICAgID0gdTMyX210LAotCQkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfdTMyKSwKLQkJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKLQl9LAorc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF91MzJfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUgICAgICAgPSAidTMyIiwKKwkucmV2aXNpb24gICA9IDAsCisJLmZhbWlseSAgICAgPSBORlBST1RPX1VOU1BFQywKKwkubWF0Y2ggICAgICA9IHUzMl9tdCwKKwkubWF0Y2hzaXplICA9IHNpemVvZihzdHJ1Y3QgeHRfdTMyKSwKKwkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdTMyX210X2luaXQodm9pZCkKIHsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2hlcyh1MzJfbXRfcmVnLCBBUlJBWV9TSVpFKHUzMl9tdF9yZWcpKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnh0X3UzMl9tdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdTMyX210X2V4aXQodm9pZCkKIHsKLQl4dF91bnJlZ2lzdGVyX21hdGNoZXModTMyX210X3JlZywgQVJSQVlfU0laRSh1MzJfbXRfcmVnKSk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmeHRfdTMyX210X3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KHUzMl9tdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9NYWtlZmlsZSBiL25ldC9uZXRsYWJlbC9NYWtlZmlsZQppbmRleCA4YWYxOGMwLi5lYTc1MGU5IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvTWFrZWZpbGUKKysrIGIvbmV0L25ldGxhYmVsL01ha2VmaWxlCkBAIC01LDcgKzUsOCBAQAogIwogCiAjIGJhc2Ugb2JqZWN0cwotb2JqLXkJOj0gbmV0bGFiZWxfdXNlci5vIG5ldGxhYmVsX2thcGkubyBuZXRsYWJlbF9kb21haW5oYXNoLm8KK29iai15CTo9IG5ldGxhYmVsX3VzZXIubyBuZXRsYWJlbF9rYXBpLm8KK29iai15CSs9IG5ldGxhYmVsX2RvbWFpbmhhc2gubyBuZXRsYWJlbF9hZGRybGlzdC5vCiAKICMgbWFuYWdlbWVudCBvYmplY3RzCiBvYmoteQkrPSBuZXRsYWJlbF9tZ210Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2FkZHJsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5MjVhMwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogTmV0TGFiZWwgTmV0d29yayBBZGRyZXNzIExpc3RzCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG5ldHdvcmsgYWRkcmVzcyBsaXN0IGZ1bmN0aW9ucyB1c2VkIHRvIG1hbmFnZSBvcmRlcmVkCisgKiBsaXN0cyBvZiBuZXR3b3JrIGFkZHJlc3NlcyBmb3IgdXNlIGJ5IHRoZSBOZXRMYWJlbCBzdWJzeXN0ZW0uICBUaGUgTmV0TGFiZWwKKyAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAorICogYXMgQ0lQU08gYW5kIFJJUFNPLgorICoKKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKgorICovCisKKy8qCisgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKworI2luY2x1ZGUgIm5ldGxhYmVsX2FkZHJsaXN0LmgiCisKKy8qCisgKiBBZGRyZXNzIExpc3QgRnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBuZXRsYmxfYWY0bGlzdF9zZWFyY2ggLSBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgSVB2NCBhZGRyZXNzIGVudHJ5CisgKiBAYWRkcjogSVB2NCBhZGRyZXNzCisgKiBAaGVhZDogdGhlIGxpc3QgaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2VhcmNoZXMgdGhlIElQdjQgYWRkcmVzcyBsaXN0IGdpdmVuIGJ5IEBoZWFkLiAgSWYgYSBtYXRjaGluZyBhZGRyZXNzIGVudHJ5CisgKiBpcyBmb3VuZCBpdCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuICBUaGUgY2FsbGVyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgcmN1X3JlYWRfW3VuXWxvY2soKSBmdW5jdGlvbnMuCisgKgorICovCitzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKm5ldGxibF9hZjRsaXN0X3NlYXJjaChfX2JlMzIgYWRkciwKKwkJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGl0ZXIsIGhlYWQsIGxpc3QpCisJCWlmIChpdGVyLT52YWxpZCAmJiAoYWRkciAmIGl0ZXItPm1hc2spID09IGl0ZXItPmFkZHIpCisJCQlyZXR1cm4gaXRlcjsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG5ldGxibF9hZjRsaXN0X3NlYXJjaF9leGFjdCAtIFNlYXJjaCBmb3IgYW4gZXhhY3QgSVB2NCBhZGRyZXNzIGVudHJ5CisgKiBAYWRkcjogSVB2NCBhZGRyZXNzCisgKiBAbWFzazogSVB2NCBhZGRyZXNzIG1hc2sKKyAqIEBoZWFkOiB0aGUgbGlzdCBoZWFkCisgKgorICogRGVzY3JpcHRpb246CisgKiBTZWFyY2hlcyB0aGUgSVB2NCBhZGRyZXNzIGxpc3QgZ2l2ZW4gYnkgQGhlYWQuICBJZiBhbiBleGFjdCBtYXRjaCBpZiBmb3VuZAorICogaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgdGhlIHJjdV9yZWFkX1t1bl1sb2NrKCkgZnVuY3Rpb25zLgorICoKKyAqLworc3RydWN0IG5ldGxibF9hZjRsaXN0ICpuZXRsYmxfYWY0bGlzdF9zZWFyY2hfZXhhY3QoX19iZTMyIGFkZHIsCisJCQkJCQkgICBfX2JlMzIgbWFzaywKKwkJCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgaGVhZCwgbGlzdCkKKwkJaWYgKGl0ZXItPnZhbGlkICYmIGl0ZXItPmFkZHIgPT0gYWRkciAmJiBpdGVyLT5tYXNrID09IG1hc2spCisJCQlyZXR1cm4gaXRlcjsKKworCXJldHVybiBOVUxMOworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKy8qKgorICogbmV0bGJsX2FmNmxpc3Rfc2VhcmNoIC0gU2VhcmNoIGZvciBhIG1hdGNoaW5nIElQdjYgYWRkcmVzcyBlbnRyeQorICogQGFkZHI6IElQdjYgYWRkcmVzcworICogQGhlYWQ6IHRoZSBsaXN0IGhlYWQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNlYXJjaGVzIHRoZSBJUHY2IGFkZHJlc3MgbGlzdCBnaXZlbiBieSBAaGVhZC4gIElmIGEgbWF0Y2hpbmcgYWRkcmVzcyBlbnRyeQorICogaXMgZm91bmQgaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIHJjdV9yZWFkX1t1bl1sb2NrKCkgZnVuY3Rpb25zLgorICoKKyAqLworc3RydWN0IG5ldGxibF9hZjZsaXN0ICpuZXRsYmxfYWY2bGlzdF9zZWFyY2goY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLAorCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgaGVhZCwgbGlzdCkKKwkJaWYgKGl0ZXItPnZhbGlkICYmCisJCSAgICBpcHY2X21hc2tlZF9hZGRyX2NtcCgmaXRlci0+YWRkciwgJml0ZXItPm1hc2ssIGFkZHIpID09IDApCisJCQlyZXR1cm4gaXRlcjsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG5ldGxibF9hZjZsaXN0X3NlYXJjaF9leGFjdCAtIFNlYXJjaCBmb3IgYW4gZXhhY3QgSVB2NiBhZGRyZXNzIGVudHJ5CisgKiBAYWRkcjogSVB2NiBhZGRyZXNzCisgKiBAbWFzazogSVB2NiBhZGRyZXNzIG1hc2sKKyAqIEBoZWFkOiB0aGUgbGlzdCBoZWFkCisgKgorICogRGVzY3JpcHRpb246CisgKiBTZWFyY2hlcyB0aGUgSVB2NiBhZGRyZXNzIGxpc3QgZ2l2ZW4gYnkgQGhlYWQuICBJZiBhbiBleGFjdCBtYXRjaCBpZiBmb3VuZAorICogaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgdGhlIHJjdV9yZWFkX1t1bl1sb2NrKCkgZnVuY3Rpb25zLgorICoKKyAqLworc3RydWN0IG5ldGxibF9hZjZsaXN0ICpuZXRsYmxfYWY2bGlzdF9zZWFyY2hfZXhhY3QoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLAorCQkJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrLAorCQkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLCBoZWFkLCBsaXN0KQorCQlpZiAoaXRlci0+dmFsaWQgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbCgmaXRlci0+YWRkciwgYWRkcikgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbCgmaXRlci0+bWFzaywgbWFzaykpCisJCQlyZXR1cm4gaXRlcjsKKworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIElQdjYgKi8KKworLyoqCisgKiBuZXRsYmxfYWY0bGlzdF9hZGQgLSBBZGQgYSBuZXcgSVB2NCBhZGRyZXNzIGVudHJ5IHRvIGEgbGlzdAorICogQGVudHJ5OiBhZGRyZXNzIGVudHJ5CisgKiBAaGVhZDogdGhlIGxpc3QgaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkIGEgbmV3IGFkZHJlc3MgZW50cnkgdG8gdGhlIGxpc3QgcG9pbnRlZCB0byBieSBAaGVhZC4gIE9uIHN1Y2Nlc3MgemVybyBpcworICogcmV0dXJuZWQsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICogZm9yIGNhbGxpbmcgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGZ1bmN0aW9ucy4KKyAqCisgKi8KK2ludCBuZXRsYmxfYWY0bGlzdF9hZGQoc3RydWN0IG5ldGxibF9hZjRsaXN0ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI7CisKKwlpdGVyID0gbmV0bGJsX2FmNGxpc3Rfc2VhcmNoKGVudHJ5LT5hZGRyLCBoZWFkKTsKKwlpZiAoaXRlciAhPSBOVUxMICYmCisJICAgIGl0ZXItPmFkZHIgPT0gZW50cnktPmFkZHIgJiYgaXRlci0+bWFzayA9PSBlbnRyeS0+bWFzaykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKiBpbiBvcmRlciB0byBzcGVlZCB1cCBhZGRyZXNzIHNlYXJjaGVzIHRocm91Z2ggdGhlIGxpc3QgKHRoZSBjb21tb24KKwkgKiBjYXNlKSB3ZSBuZWVkIHRvIGtlZXAgdGhlIGxpc3QgaW4gb3JkZXIgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlCisJICogYWRkcmVzcyBtYXNrIHN1Y2ggdGhhdCB0aGUgZW50cnkgd2l0aCB0aGUgd2lkZXN0IG1hc2sgKHNtYWxsZXN0CisJICogbnVtZXJpY2FsIHZhbHVlKSBhcHBlYXJzIGZpcnN0IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgaGVhZCwgbGlzdCkKKwkJaWYgKGl0ZXItPnZhbGlkICYmCisJCSAgICBudG9obChlbnRyeS0+bWFzaykgPiBudG9obChpdGVyLT5tYXNrKSkgeworCQkJX19saXN0X2FkZF9yY3UoJmVudHJ5LT5saXN0LAorCQkJCSAgICAgICBpdGVyLT5saXN0LnByZXYsCisJCQkJICAgICAgICZpdGVyLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJbGlzdF9hZGRfdGFpbF9yY3UoJmVudHJ5LT5saXN0LCBoZWFkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorLyoqCisgKiBuZXRsYmxfYWY2bGlzdF9hZGQgLSBBZGQgYSBuZXcgSVB2NiBhZGRyZXNzIGVudHJ5IHRvIGEgbGlzdAorICogQGVudHJ5OiBhZGRyZXNzIGVudHJ5CisgKiBAaGVhZDogdGhlIGxpc3QgaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkIGEgbmV3IGFkZHJlc3MgZW50cnkgdG8gdGhlIGxpc3QgcG9pbnRlZCB0byBieSBAaGVhZC4gIE9uIHN1Y2Nlc3MgemVybyBpcworICogcmV0dXJuZWQsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICogZm9yIGNhbGxpbmcgdGhlIG5lY2Vzc2FyeSBsb2NraW5nIGZ1bmN0aW9ucy4KKyAqCisgKi8KK2ludCBuZXRsYmxfYWY2bGlzdF9hZGQoc3RydWN0IG5ldGxibF9hZjZsaXN0ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI7CisKKwlpdGVyID0gbmV0bGJsX2FmNmxpc3Rfc2VhcmNoKCZlbnRyeS0+YWRkciwgaGVhZCk7CisJaWYgKGl0ZXIgIT0gTlVMTCAmJgorCSAgICBpcHY2X2FkZHJfZXF1YWwoJml0ZXItPmFkZHIsICZlbnRyeS0+YWRkcikgJiYKKwkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpdGVyLT5tYXNrLCAmZW50cnktPm1hc2spKQorCQlyZXR1cm4gLUVFWElTVDsKKworCS8qIGluIG9yZGVyIHRvIHNwZWVkIHVwIGFkZHJlc3Mgc2VhcmNoZXMgdGhyb3VnaCB0aGUgbGlzdCAodGhlIGNvbW1vbgorCSAqIGNhc2UpIHdlIG5lZWQgdG8ga2VlcCB0aGUgbGlzdCBpbiBvcmRlciBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBhZGRyZXNzIG1hc2sgc3VjaCB0aGF0IHRoZSBlbnRyeSB3aXRoIHRoZSB3aWRlc3QgbWFzayAoc21hbGxlc3QKKwkgKiBudW1lcmljYWwgdmFsdWUpIGFwcGVhcnMgZmlyc3QgaW4gdGhlIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLCBoZWFkLCBsaXN0KQorCQlpZiAoaXRlci0+dmFsaWQgJiYKKwkJICAgIGlwdjZfYWRkcl9jbXAoJmVudHJ5LT5tYXNrLCAmaXRlci0+bWFzaykgPiAwKSB7CisJCQlfX2xpc3RfYWRkX3JjdSgmZW50cnktPmxpc3QsCisJCQkJICAgICAgIGl0ZXItPmxpc3QucHJldiwKKwkJCQkgICAgICAgJml0ZXItPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsIGhlYWQpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIElQdjYgKi8KKworLyoqCisgKiBuZXRsYmxfYWY0bGlzdF9yZW1vdmVfZW50cnkgLSBSZW1vdmUgYW4gSVB2NCBhZGRyZXNzIGVudHJ5CisgKiBAZW50cnk6IGFkZHJlc3MgZW50cnkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MgZW50cnkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY2FsbGluZyB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgZnVuY3Rpb25zLgorICoKKyAqLwordm9pZCBuZXRsYmxfYWY0bGlzdF9yZW1vdmVfZW50cnkoc3RydWN0IG5ldGxibF9hZjRsaXN0ICplbnRyeSkKK3sKKwllbnRyeS0+dmFsaWQgPSAwOworCWxpc3RfZGVsX3JjdSgmZW50cnktPmxpc3QpOworfQorCisvKioKKyAqIG5ldGxibF9hZjRsaXN0X3JlbW92ZSAtIFJlbW92ZSBhbiBJUHY0IGFkZHJlc3MgZW50cnkKKyAqIEBhZGRyOiBJUCBhZGRyZXNzCisgKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCisgKiBAaGVhZDogdGhlIGxpc3QgaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlIGFuIElQIGFkZHJlc3MgZW50cnkgZnJvbSB0aGUgbGlzdCBwb2ludGVkIHRvIGJ5IEBoZWFkLiAgUmV0dXJucyB0aGUKKyAqIGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAqIHRoZSBuZWNlc3NhcnkgbG9ja2luZyBmdW5jdGlvbnMuCisgKgorICovCitzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKm5ldGxibF9hZjRsaXN0X3JlbW92ZShfX2JlMzIgYWRkciwgX19iZTMyIG1hc2ssCisJCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmVudHJ5OworCisJZW50cnkgPSBuZXRsYmxfYWY0bGlzdF9zZWFyY2goYWRkciwgaGVhZCk7CisJaWYgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPmFkZHIgPT0gYWRkciAmJiBlbnRyeS0+bWFzayA9PSBtYXNrKSB7CisJCW5ldGxibF9hZjRsaXN0X3JlbW92ZV9lbnRyeShlbnRyeSk7CisJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorLyoqCisgKiBuZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkgLSBSZW1vdmUgYW4gSVB2NiBhZGRyZXNzIGVudHJ5CisgKiBAZW50cnk6IGFkZHJlc3MgZW50cnkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MgZW50cnkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY2FsbGluZyB0aGUgbmVjZXNzYXJ5IGxvY2tpbmcgZnVuY3Rpb25zLgorICoKKyAqLwordm9pZCBuZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoc3RydWN0IG5ldGxibF9hZjZsaXN0ICplbnRyeSkKK3sKKwllbnRyeS0+dmFsaWQgPSAwOworCWxpc3RfZGVsX3JjdSgmZW50cnktPmxpc3QpOworfQorCisvKioKKyAqIG5ldGxibF9hZjZsaXN0X3JlbW92ZSAtIFJlbW92ZSBhbiBJUHY2IGFkZHJlc3MgZW50cnkKKyAqIEBhZGRyOiBJUCBhZGRyZXNzCisgKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCisgKiBAaGVhZDogdGhlIGxpc3QgaGVhZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlIGFuIElQIGFkZHJlc3MgZW50cnkgZnJvbSB0aGUgbGlzdCBwb2ludGVkIHRvIGJ5IEBoZWFkLiAgUmV0dXJucyB0aGUKKyAqIGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAqIHRoZSBuZWNlc3NhcnkgbG9ja2luZyBmdW5jdGlvbnMuCisgKgorICovCitzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKm5ldGxibF9hZjZsaXN0X3JlbW92ZShjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrLAorCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICplbnRyeTsKKworCWVudHJ5ID0gbmV0bGJsX2FmNmxpc3Rfc2VhcmNoKGFkZHIsIGhlYWQpOworCWlmIChlbnRyeSAhPSBOVUxMICYmCisJICAgIGlwdjZfYWRkcl9lcXVhbCgmZW50cnktPmFkZHIsIGFkZHIpICYmCisJICAgIGlwdjZfYWRkcl9lcXVhbCgmZW50cnktPm1hc2ssIG1hc2spKSB7CisJCW5ldGxibF9hZjZsaXN0X3JlbW92ZV9lbnRyeShlbnRyeSk7CisJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBJUHY2ICovCisKKy8qCisgKiBBdWRpdCBIZWxwZXIgRnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBuZXRsYmxfYWY0bGlzdF9hdWRpdF9hZGRyIC0gQXVkaXQgYW4gSVB2NCBhZGRyZXNzCisgKiBAYXVkaXRfYnVmOiBhdWRpdCBidWZmZXIKKyAqIEBzcmM6IHRydWUgaWYgc291cmNlIGFkZHJlc3MsIGZhbHNlIGlmIGRlc3RpbmF0aW9uCisgKiBAZGV2OiBuZXR3b3JrIGludGVyZmFjZQorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFdyaXRlIHRoZSBJUHY0IGFkZHJlc3MgYW5kIGFkZHJlc3MgbWFzaywgaWYgbmVjZXNzYXJ5LCB0byBAYXVkaXRfYnVmLgorICoKKyAqLwordm9pZCBuZXRsYmxfYWY0bGlzdF9hdWRpdF9hZGRyKHN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZiwKKwkJCQkJaW50IHNyYywgY29uc3QgY2hhciAqZGV2LAorCQkJCQlfX2JlMzIgYWRkciwgX19iZTMyIG1hc2spCit7CisJdTMyIG1hc2tfdmFsID0gbnRvaGwobWFzayk7CisJY2hhciAqZGlyID0gKHNyYyA/ICJzcmMiIDogImRzdCIpOworCisJaWYgKGRldiAhPSBOVUxMKQorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBuZXRpZj0lcyIsIGRldik7CisJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgJXM9IiBOSVBRVUFEX0ZNVCwgZGlyLCBOSVBRVUFEKGFkZHIpKTsKKwlpZiAobWFza192YWwgIT0gMHhmZmZmZmZmZikgeworCQl1MzIgbWFza19sZW4gPSAwOworCQl3aGlsZSAobWFza192YWwgPiAwKSB7CisJCQltYXNrX3ZhbCA8PD0gMTsKKwkJCW1hc2tfbGVuKys7CisJCX0KKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgJXNfcHJlZml4bGVuPSVkIiwgZGlyLCBtYXNrX2xlbik7CisJfQorfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisvKioKKyAqIG5ldGxibF9hZjZsaXN0X2F1ZGl0X2FkZHIgLSBBdWRpdCBhbiBJUHY2IGFkZHJlc3MKKyAqIEBhdWRpdF9idWY6IGF1ZGl0IGJ1ZmZlcgorICogQHNyYzogdHJ1ZSBpZiBzb3VyY2UgYWRkcmVzcywgZmFsc2UgaWYgZGVzdGluYXRpb24KKyAqIEBkZXY6IG5ldHdvcmsgaW50ZXJmYWNlCisgKiBAYWRkcjogSVAgYWRkcmVzcworICogQG1hc2s6IElQIGFkZHJlc3MgbWFzaworICoKKyAqIERlc2NyaXB0aW9uOgorICogV3JpdGUgdGhlIElQdjYgYWRkcmVzcyBhbmQgYWRkcmVzcyBtYXNrLCBpZiBuZWNlc3NhcnksIHRvIEBhdWRpdF9idWYuCisgKgorICovCit2b2lkIG5ldGxibF9hZjZsaXN0X2F1ZGl0X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmLAorCQkJCSBpbnQgc3JjLAorCQkJCSBjb25zdCBjaGFyICpkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwKKwkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrKQoreworCWNoYXIgKmRpciA9IChzcmMgPyAic3JjIiA6ICJkc3QiKTsKKworCWlmIChkZXYgIT0gTlVMTCkKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgbmV0aWY9JXMiLCBkZXYpOworCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiICVzPSIgTklQNl9GTVQsIGRpciwgTklQNigqYWRkcikpOworCWlmIChudG9obChtYXNrLT5zNl9hZGRyMzJbM10pICE9IDB4ZmZmZmZmZmYpIHsKKwkJdTMyIG1hc2tfbGVuID0gMDsKKwkJdTMyIG1hc2tfdmFsOworCQlpbnQgaXRlciA9IC0xOworCQl3aGlsZSAobnRvaGwobWFzay0+czZfYWRkcjMyWysraXRlcl0pID09IDB4ZmZmZmZmZmYpCisJCQltYXNrX2xlbiArPSAzMjsKKwkJbWFza192YWwgPSBudG9obChtYXNrLT5zNl9hZGRyMzJbaXRlcl0pOworCQl3aGlsZSAobWFza192YWwgPiAwKSB7CisJCQltYXNrX3ZhbCA8PD0gMTsKKwkJCW1hc2tfbGVuKys7CisJCX0KKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgJXNfcHJlZml4bGVuPSVkIiwgZGlyLCBtYXNrX2xlbik7CisJfQorfQorI2VuZGlmIC8qIElQdjYgKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5oIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2FkZHJsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MmJlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTmV0TGFiZWwgTmV0d29yayBBZGRyZXNzIExpc3RzCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG5ldHdvcmsgYWRkcmVzcyBsaXN0IGZ1bmN0aW9ucyB1c2VkIHRvIG1hbmFnZSBvcmRlcmVkCisgKiBsaXN0cyBvZiBuZXR3b3JrIGFkZHJlc3NlcyBmb3IgdXNlIGJ5IHRoZSBOZXRMYWJlbCBzdWJzeXN0ZW0uICBUaGUgTmV0TGFiZWwKKyAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAorICogYXMgQ0lQU08gYW5kIFJJUFNPLgorICoKKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKgorICovCisKKy8qCisgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfTkVUTEFCRUxfQUREUkxJU1RfSAorI2RlZmluZSBfTkVUTEFCRUxfQUREUkxJU1RfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorCisvKioKKyAqIHN0cnVjdCBuZXRsYmxfYWY0bGlzdCAtIE5ldExhYmVsIElQdjQgYWRkcmVzcyBsaXN0CisgKiBAYWRkcjogSVB2NCBhZGRyZXNzCisgKiBAbWFzazogSVB2NCBhZGRyZXNzIG1hc2sKKyAqIEB2YWxpZDogdmFsaWQgZmxhZworICogQGxpc3Q6IGxpc3Qgc3RydWN0dXJlLCB1c2VkIGludGVybmFsbHkKKyAqLworc3RydWN0IG5ldGxibF9hZjRsaXN0IHsKKwlfX2JlMzIgYWRkcjsKKwlfX2JlMzIgbWFzazsKKworCXUzMiB2YWxpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBuZXRsYmxfYWY2bGlzdCAtIE5ldExhYmVsIElQdjYgYWRkcmVzcyBsaXN0CisgKiBAYWRkcjogSVB2NiBhZGRyZXNzCisgKiBAbWFzazogSVB2NiBhZGRyZXNzIG1hc2sKKyAqIEB2YWxpZDogdmFsaWQgZmxhZworICogQGxpc3Q6IGxpc3Qgc3RydWN0dXJlLCB1c2VkIGludGVybmFsbHkKKyAqLworc3RydWN0IG5ldGxibF9hZjZsaXN0IHsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgbWFzazsKKworCXUzMiB2YWxpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIF9fYWY0bGlzdF9lbnRyeShwdHIpIGNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCBuZXRsYmxfYWY0bGlzdCwgbGlzdCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKl9fYWY0bGlzdF92YWxpZChzdHJ1Y3QgbGlzdF9oZWFkICpzLAorCQkJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmkgPSBzOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqbiA9IF9fYWY0bGlzdF9lbnRyeShzKTsKKwl3aGlsZSAoaSAhPSBoICYmICFuLT52YWxpZCkgeworCQlpID0gaS0+bmV4dDsKKwkJbiA9IF9fYWY0bGlzdF9lbnRyeShpKTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGxibF9hZjRsaXN0ICpfX2FmNGxpc3RfdmFsaWRfcmN1KHN0cnVjdCBsaXN0X2hlYWQgKnMsCisJCQkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaSA9IHM7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICpuID0gX19hZjRsaXN0X2VudHJ5KHMpOworCXdoaWxlIChpICE9IGggJiYgIW4tPnZhbGlkKSB7CisJCWkgPSByY3VfZGVyZWZlcmVuY2UoaS0+bmV4dCk7CisJCW4gPSBfX2FmNGxpc3RfZW50cnkoaSk7CisJfQorCXJldHVybiBuOworfQorCisjZGVmaW5lIG5ldGxibF9hZjRsaXN0X2ZvcmVhY2goaXRlciwgaGVhZCkJCQkJXAorCWZvciAoaXRlciA9IF9fYWY0bGlzdF92YWxpZCgoaGVhZCktPm5leHQsIGhlYWQpOwkJXAorCSAgICAgcHJlZmV0Y2goaXRlci0+bGlzdC5uZXh0KSwgJml0ZXItPmxpc3QgIT0gKGhlYWQpOwkJXAorCSAgICAgaXRlciA9IF9fYWY0bGlzdF92YWxpZChpdGVyLT5saXN0Lm5leHQsIGhlYWQpKQorCisjZGVmaW5lIG5ldGxibF9hZjRsaXN0X2ZvcmVhY2hfcmN1KGl0ZXIsIGhlYWQpCQkJCVwKKwlmb3IgKGl0ZXIgPSBfX2FmNGxpc3RfdmFsaWRfcmN1KChoZWFkKS0+bmV4dCwgaGVhZCk7CQlcCisJICAgICBwcmVmZXRjaChpdGVyLT5saXN0Lm5leHQpLAkmaXRlci0+bGlzdCAhPSAoaGVhZCk7CQlcCisJICAgICBpdGVyID0gX19hZjRsaXN0X3ZhbGlkX3JjdShpdGVyLT5saXN0Lm5leHQsIGhlYWQpKQorCisjZGVmaW5lIG5ldGxibF9hZjRsaXN0X2ZvcmVhY2hfc2FmZShpdGVyLCB0bXAsIGhlYWQpCQkJXAorCWZvciAoaXRlciA9IF9fYWY0bGlzdF92YWxpZCgoaGVhZCktPm5leHQsIGhlYWQpLAkJXAorCQkgICAgIHRtcCA9IF9fYWY0bGlzdF92YWxpZChpdGVyLT5saXN0Lm5leHQsIGhlYWQpOwlcCisJICAgICAmaXRlci0+bGlzdCAhPSAoaGVhZCk7CQkJCQlcCisJICAgICBpdGVyID0gdG1wLCB0bXAgPSBfX2FmNGxpc3RfdmFsaWQoaXRlci0+bGlzdC5uZXh0LCBoZWFkKSkKKworaW50IG5ldGxibF9hZjRsaXN0X2FkZChzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmVudHJ5LAorCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKm5ldGxibF9hZjRsaXN0X3JlbW92ZShfX2JlMzIgYWRkciwgX19iZTMyIG1hc2ssCisJCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Cit2b2lkIG5ldGxibF9hZjRsaXN0X3JlbW92ZV9lbnRyeShzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmVudHJ5KTsKK3N0cnVjdCBuZXRsYmxfYWY0bGlzdCAqbmV0bGJsX2FmNGxpc3Rfc2VhcmNoKF9fYmUzMiBhZGRyLAorCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworc3RydWN0IG5ldGxibF9hZjRsaXN0ICpuZXRsYmxfYWY0bGlzdF9zZWFyY2hfZXhhY3QoX19iZTMyIGFkZHIsCisJCQkJCQkgICBfX2JlMzIgbWFzaywKKwkJCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBuZXRsYmxfYWY0bGlzdF9hdWRpdF9hZGRyKHN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZiwKKwkJCSAgICAgICBpbnQgc3JjLCBjb25zdCBjaGFyICpkZXYsCisJCQkgICAgICAgX19iZTMyIGFkZHIsIF9fYmUzMiBtYXNrKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCisjZGVmaW5lIF9fYWY2bGlzdF9lbnRyeShwdHIpIGNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCBuZXRsYmxfYWY2bGlzdCwgbGlzdCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKl9fYWY2bGlzdF92YWxpZChzdHJ1Y3QgbGlzdF9oZWFkICpzLAorCQkJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmkgPSBzOworCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqbiA9IF9fYWY2bGlzdF9lbnRyeShzKTsKKwl3aGlsZSAoaSAhPSBoICYmICFuLT52YWxpZCkgeworCQlpID0gaS0+bmV4dDsKKwkJbiA9IF9fYWY2bGlzdF9lbnRyeShpKTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGxibF9hZjZsaXN0ICpfX2FmNmxpc3RfdmFsaWRfcmN1KHN0cnVjdCBsaXN0X2hlYWQgKnMsCisJCQkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaSA9IHM7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICpuID0gX19hZjZsaXN0X2VudHJ5KHMpOworCXdoaWxlIChpICE9IGggJiYgIW4tPnZhbGlkKSB7CisJCWkgPSByY3VfZGVyZWZlcmVuY2UoaS0+bmV4dCk7CisJCW4gPSBfX2FmNmxpc3RfZW50cnkoaSk7CisJfQorCXJldHVybiBuOworfQorCisjZGVmaW5lIG5ldGxibF9hZjZsaXN0X2ZvcmVhY2goaXRlciwgaGVhZCkJCQkJXAorCWZvciAoaXRlciA9IF9fYWY2bGlzdF92YWxpZCgoaGVhZCktPm5leHQsIGhlYWQpOwkJXAorCSAgICAgcHJlZmV0Y2goaXRlci0+bGlzdC5uZXh0KSwJJml0ZXItPmxpc3QgIT0gKGhlYWQpOwkJXAorCSAgICAgaXRlciA9IF9fYWY2bGlzdF92YWxpZChpdGVyLT5saXN0Lm5leHQsIGhlYWQpKQorCisjZGVmaW5lIG5ldGxibF9hZjZsaXN0X2ZvcmVhY2hfcmN1KGl0ZXIsIGhlYWQpCQkJCVwKKwlmb3IgKGl0ZXIgPSBfX2FmNmxpc3RfdmFsaWRfcmN1KChoZWFkKS0+bmV4dCwgaGVhZCk7CQlcCisJICAgICBwcmVmZXRjaChpdGVyLT5saXN0Lm5leHQpLAkmaXRlci0+bGlzdCAhPSAoaGVhZCk7CQlcCisJICAgICBpdGVyID0gX19hZjZsaXN0X3ZhbGlkX3JjdShpdGVyLT5saXN0Lm5leHQsIGhlYWQpKQorCisjZGVmaW5lIG5ldGxibF9hZjZsaXN0X2ZvcmVhY2hfc2FmZShpdGVyLCB0bXAsIGhlYWQpCQkJXAorCWZvciAoaXRlciA9IF9fYWY2bGlzdF92YWxpZCgoaGVhZCktPm5leHQsIGhlYWQpLAkJXAorCQkgICAgIHRtcCA9IF9fYWY2bGlzdF92YWxpZChpdGVyLT5saXN0Lm5leHQsIGhlYWQpOwlcCisJICAgICAmaXRlci0+bGlzdCAhPSAoaGVhZCk7CQkJCQlcCisJICAgICBpdGVyID0gdG1wLCB0bXAgPSBfX2FmNmxpc3RfdmFsaWQoaXRlci0+bGlzdC5uZXh0LCBoZWFkKSkKKworaW50IG5ldGxibF9hZjZsaXN0X2FkZChzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKmVudHJ5LAorCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKm5ldGxibF9hZjZsaXN0X3JlbW92ZShjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrLAorCQkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBuZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoc3RydWN0IG5ldGxibF9hZjZsaXN0ICplbnRyeSk7CitzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKm5ldGxibF9hZjZsaXN0X3NlYXJjaChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKm5ldGxibF9hZjZsaXN0X3NlYXJjaF9leGFjdChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKm1hc2ssCisJCQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKK3ZvaWQgbmV0bGJsX2FmNmxpc3RfYXVkaXRfYWRkcihzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWYsCisJCQkgICAgICAgaW50IHNyYywKKwkJCSAgICAgICBjb25zdCBjaGFyICpkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbWFzayk7CisjZW5kaWYgLyogSVBWNiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKaW5kZXggMGFlYzMxOC4uZmZmMzJiNyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJuZXRsYWJlbF91c2VyLmgiCiAjaW5jbHVkZSAibmV0bGFiZWxfY2lwc29fdjQuaCIKICNpbmNsdWRlICJuZXRsYWJlbF9tZ210LmgiCisjaW5jbHVkZSAibmV0bGFiZWxfZG9tYWluaGFzaC5oIgogCiAvKiBBcmd1bWVudCBzdHJ1Y3QgZm9yIGNpcHNvX3Y0X2RvaV93YWxrKCkgKi8KIHN0cnVjdCBuZXRsYmxfY2lwc292NF9kb2l3YWxrX2FyZyB7CkBAIC01MSw2ICs1MiwxMiBAQAogCXUzMiBzZXE7CiB9OwogCisvKiBBcmd1bWVudCBzdHJ1Y3QgZm9yIG5ldGxibF9kb21oc2hfd2FsaygpICovCitzdHJ1Y3QgbmV0bGJsX2RvbWhzaF93YWxrX2FyZyB7CisJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbzsKKwl1MzIgZG9pOworfTsKKwogLyogTmV0TGFiZWwgR2VuZXJpYyBORVRMSU5LIENJUFNPdjQgZmFtaWx5ICovCiBzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IG5ldGxibF9jaXBzb3Y0X2dubF9mYW1pbHkgPSB7CiAJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKQEAgLTgxLDMyICs4OCw2IEBACiAgKi8KIAogLyoqCi0gKiBuZXRsYmxfY2lwc292NF9kb2lfZnJlZSAtIEZyZWVzIGEgQ0lQU08gVjQgRE9JIGRlZmluaXRpb24KLSAqIEBlbnRyeTogdGhlIGVudHJ5J3MgUkNVIGZpZWxkCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBjYWxsYmFjayB0byB0aGUgY2FsbF9yY3UoKQotICogZnVuY3Rpb24gc28gdGhhdCB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGUgRE9JIGRlZmluaXRpb24gY2FuIGJlIHJlbGVhc2VkCi0gKiBzYWZlbHkuCi0gKgotICovCi12b2lkIG5ldGxibF9jaXBzb3Y0X2RvaV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqZW50cnkpCi17Ci0Jc3RydWN0IGNpcHNvX3Y0X2RvaSAqcHRyOwotCi0JcHRyID0gY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgY2lwc29fdjRfZG9pLCByY3UpOwotCXN3aXRjaCAocHRyLT50eXBlKSB7Ci0JY2FzZSBDSVBTT19WNF9NQVBfU1REOgotCQlrZnJlZShwdHItPm1hcC5zdGQtPmx2bC5jaXBzbyk7Ci0JCWtmcmVlKHB0ci0+bWFwLnN0ZC0+bHZsLmxvY2FsKTsKLQkJa2ZyZWUocHRyLT5tYXAuc3RkLT5jYXQuY2lwc28pOwotCQlrZnJlZShwdHItPm1hcC5zdGQtPmNhdC5sb2NhbCk7Ci0JCWJyZWFrOwotCX0KLQlrZnJlZShwdHIpOwotfQotCi0vKioKICAqIG5ldGxibF9jaXBzb3Y0X2FkZF9jb21tb24gLSBQYXJzZSB0aGUgY29tbW9uIHNlY3Rpb25zIG9mIGEgQUREIG1lc3NhZ2UKICAqIEBpbmZvOiB0aGUgR2VuZXJpYyBORVRMSU5LIGluZm8gYmxvY2sKICAqIEBkb2lfZGVmOiB0aGUgQ0lQU08gVjQgRE9JIGRlZmluaXRpb24KQEAgLTE1MSw5ICsxMzIsOSBAQAogICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jawogICoKICAqIERlc2NyaXB0aW9uOgotICogQ3JlYXRlIGEgbmV3IENJUFNPX1Y0X01BUF9TVEQgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERCBtZXNzYWdlCi0gKiBhbmQgYWRkIGl0IHRvIHRoZSBDSVBTTyBWNCBlbmdpbmUuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbgotICogZXJyb3IuCisgKiBDcmVhdGUgYSBuZXcgQ0lQU09fVjRfTUFQX1RSQU5TIERPSSBkZWZpbml0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBBREQKKyAqIG1lc3NhZ2UgYW5kIGFkZCBpdCB0byB0aGUgQ0lQU08gVjQgZW5naW5lLiAgUmV0dXJuIHplcm8gb24gc3VjY2VzcyBhbmQKKyAqIG5vbi16ZXJvIG9uIGVycm9yLgogICoKICAqLwogc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfc3RkKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0xODMsNyArMTY0LDcgQEAKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gYWRkX3N0ZF9mYWlsdXJlOwogCX0KLQlkb2lfZGVmLT50eXBlID0gQ0lQU09fVjRfTUFQX1NURDsKKwlkb2lfZGVmLT50eXBlID0gQ0lQU09fVjRfTUFQX1RSQU5TOwogCiAJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9jb21tb24oaW5mbywgZG9pX2RlZik7CiAJaWYgKHJldF92YWwgIT0gMCkKQEAgLTM0Miw3ICszMjMsNyBAQAogCiBhZGRfc3RkX2ZhaWx1cmU6CiAJaWYgKGRvaV9kZWYpCi0JCW5ldGxibF9jaXBzb3Y0X2RvaV9mcmVlKCZkb2lfZGVmLT5yY3UpOworCQljaXBzb192NF9kb2lfZnJlZShkb2lfZGVmKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMzc5LDcgKzM2MCw0NCBAQAogCXJldHVybiAwOwogCiBhZGRfcGFzc19mYWlsdXJlOgotCW5ldGxibF9jaXBzb3Y0X2RvaV9mcmVlKCZkb2lfZGVmLT5yY3UpOworCWNpcHNvX3Y0X2RvaV9mcmVlKGRvaV9kZWYpOworCXJldHVybiByZXRfdmFsOworfQorCisvKioKKyAqIG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbCAtIEFkZHMgYSBDSVBTTyBWNCBET0kgZGVmaW5pdGlvbgorICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ3JlYXRlIGEgbmV3IENJUFNPX1Y0X01BUF9MT0NBTCBET0kgZGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gQURECisgKiBtZXNzYWdlIGFuZCBhZGQgaXQgdG8gdGhlIENJUFNPIFY0IGVuZ2luZS4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MgYW5kCisgKiBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJaW50IHJldF92YWw7CisJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CisKKwlpZiAoIWluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX1RBR0xTVF0pCisJCXJldHVybiAtRUlOVkFMOworCisJZG9pX2RlZiA9IGttYWxsb2Moc2l6ZW9mKCpkb2lfZGVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRvaV9kZWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG9pX2RlZi0+dHlwZSA9IENJUFNPX1Y0X01BUF9MT0NBTDsKKworCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfY29tbW9uKGluZm8sIGRvaV9kZWYpOworCWlmIChyZXRfdmFsICE9IDApCisJCWdvdG8gYWRkX2xvY2FsX2ZhaWx1cmU7CisKKwlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKKwlpZiAocmV0X3ZhbCAhPSAwKQorCQlnb3RvIGFkZF9sb2NhbF9mYWlsdXJlOworCXJldHVybiAwOworCithZGRfbG9jYWxfZmFpbHVyZToKKwljaXBzb192NF9kb2lfZnJlZShkb2lfZGVmKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtNDEyLDE0ICs0MzAsMTggQEAKIAogCXR5cGUgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9NVFlQRV0pOwogCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKLQkJdHlwZV9zdHIgPSAic3RkIjsKKwljYXNlIENJUFNPX1Y0X01BUF9UUkFOUzoKKwkJdHlwZV9zdHIgPSAidHJhbnMiOwogCQlyZXRfdmFsID0gbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZChpbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKIAkJdHlwZV9zdHIgPSAicGFzcyI7CiAJCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhpbmZvKTsKIAkJYnJlYWs7CisJY2FzZSBDSVBTT19WNF9NQVBfTE9DQUw6CisJCXR5cGVfc3RyID0gImxvY2FsIjsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChpbmZvKTsKKwkJYnJlYWs7CiAJfQogCWlmIChyZXRfdmFsID09IDApCiAJCWF0b21pY19pbmMoJm5ldGxhYmVsX21nbXRfcHJvdG9jb3VudCk7CkBAIC00OTEsNyArNTEzLDcgQEAKIAlkb2lfZGVmID0gY2lwc29fdjRfZG9pX2dldGRlZihkb2kpOwogCWlmIChkb2lfZGVmID09IE5VTEwpIHsKIAkJcmV0X3ZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gbGlzdF9mYWlsdXJlOworCQlnb3RvIGxpc3RfZmFpbHVyZV9sb2NrOwogCX0KIAogCXJldF92YWwgPSBubGFfcHV0X3UzMihhbnNfc2tiLCBOTEJMX0NJUFNPVjRfQV9NVFlQRSwgZG9pX2RlZi0+dHlwZSk7CkBAIC01MTYsNyArNTM4LDcgQEAKIAlubGFfbmVzdF9lbmQoYW5zX3NrYiwgbmxhX2EpOwogCiAJc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7Ci0JY2FzZSBDSVBTT19WNF9NQVBfU1REOgorCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgogCQlubGFfYSA9IG5sYV9uZXN0X3N0YXJ0KGFuc19za2IsIE5MQkxfQ0lQU09WNF9BX01MU0xWTExTVCk7CiAJCWlmIChubGFfYSA9PSBOVUxMKSB7CiAJCQlyZXRfdmFsID0gLUVOT01FTTsKQEAgLTY1NSw3ICs2NzcsNyBAQAogCQkJCSAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXN0cnVjdCBuZXRsYmxfY2lwc292NF9kb2l3YWxrX2FyZyBjYl9hcmc7Ci0JaW50IGRvaV9za2lwID0gY2ItPmFyZ3NbMF07CisJdTMyIGRvaV9za2lwID0gY2ItPmFyZ3NbMF07CiAKIAljYl9hcmcubmxfY2IgPSBjYjsKIAljYl9hcmcuc2tiID0gc2tiOwpAQCAtNjY4LDYgKzY5MCwyOSBAQAogfQogCiAvKioKKyAqIG5ldGxibF9jaXBzb3Y0X3JlbW92ZV9jYiAtIG5ldGxibF9jaXBzb3Y0X3JlbW92ZSgpIGNhbGxiYWNrIGZvciBSRU1PVkUKKyAqIEBlbnRyeTogTFNNIGRvbWFpbiBtYXBwaW5nIGVudHJ5CisgKiBAYXJnOiB0aGUgbmV0bGJsX2RvbWhzaF93YWxrX2FyZyBzdHJ1Y3R1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBuZXRsYmxfY2lwc292NF9yZW1vdmUoKSBhcyB0aGUgY2FsbGJhY2sKKyAqIGZvciB0aGUgbmV0bGJsX2RvbWhzaF93YWxrKCkgZnVuY3Rpb247IGl0IHJlbW92ZXMgTFNNIGRvbWFpbiBtYXAgZW50cmllcworICogd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ0lQU08gRE9JIHNwZWNpZmllZCBpbiBAYXJnLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfcmVtb3ZlX2NiKHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnksIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbmV0bGJsX2RvbWhzaF93YWxrX2FyZyAqY2JfYXJnID0gYXJnOworCisJaWYgKGVudHJ5LT50eXBlID09IE5FVExCTF9OTFRZUEVfQ0lQU09WNCAmJgorCSAgICBlbnRyeS0+dHlwZV9kZWYuY2lwc292NC0+ZG9pID09IGNiX2FyZy0+ZG9pKQorCQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmVfZW50cnkoZW50cnksIGNiX2FyZy0+YXVkaXRfaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBuZXRsYmxfY2lwc292NF9yZW1vdmUgLSBIYW5kbGUgYSBSRU1PVkUgbWVzc2FnZQogICogQHNrYjogdGhlIE5FVExJTksgYnVmZmVyCiAgKiBAaW5mbzogdGhlIEdlbmVyaWMgTkVUTElOSyBpbmZvIGJsb2NrCkBAIC02ODEsOCArNzI2LDExIEBACiB7CiAJaW50IHJldF92YWwgPSAtRUlOVkFMOwogCXUzMiBkb2kgPSAwOworCXN0cnVjdCBuZXRsYmxfZG9taHNoX3dhbGtfYXJnIGNiX2FyZzsKIAlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOworCXUzMiBza2lwX2JrdCA9IDA7CisJdTMyIHNraXBfY2hhaW4gPSAwOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY5MCwxMSArNzM4LDE1IEBACiAJZG9pID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfRE9JXSk7CiAJbmV0bGJsX25ldGxpbmtfYXVkaXRpbmZvKHNrYiwgJmF1ZGl0X2luZm8pOwogCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9yZW1vdmUoZG9pLAotCQkJCSAgICAgICZhdWRpdF9pbmZvLAotCQkJCSAgICAgIG5ldGxibF9jaXBzb3Y0X2RvaV9mcmVlKTsKLQlpZiAocmV0X3ZhbCA9PSAwKQotCQlhdG9taWNfZGVjKCZuZXRsYWJlbF9tZ210X3Byb3RvY291bnQpOworCWNiX2FyZy5kb2kgPSBkb2k7CisJY2JfYXJnLmF1ZGl0X2luZm8gPSAmYXVkaXRfaW5mbzsKKwlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF93YWxrKCZza2lwX2JrdCwgJnNraXBfY2hhaW4sCisJCQkJICAgICBuZXRsYmxfY2lwc292NF9yZW1vdmVfY2IsICZjYl9hcmcpOworCWlmIChyZXRfdmFsID09IDAgfHwgcmV0X3ZhbCA9PSAtRU5PRU5UKSB7CisJCXJldF92YWwgPSBjaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgJmF1ZGl0X2luZm8pOworCQlpZiAocmV0X3ZhbCA9PSAwKQorCQkJYXRvbWljX2RlYygmbmV0bGFiZWxfbWdtdF9wcm90b2NvdW50KTsKKwl9CiAKIAlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0RFTCwKIAkJCQkJICAgICAgJmF1ZGl0X2luZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuaAppbmRleCAyMjBjYjlkLi5jOGE0MDc5IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuaApAQCAtNDUsMTIgKzQ1LDEzIEBACiAgKiAgICAgTkxCTF9DSVBTT1Y0X0FfTVRZUEUKICAqICAgICBOTEJMX0NJUFNPVjRfQV9UQUdMU1QKICAqCi0gKiAgIElmIHVzaW5nIENJUFNPX1Y0X01BUF9TVEQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZDoKKyAqICAgSWYgdXNpbmcgQ0lQU09fVjRfTUFQX1RSQU5TIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQ6CiAgKgogICogICAgIE5MQkxfQ0lQU09WNF9BX01MU0xWTExTVAogICogICAgIE5MQkxfQ0lQU09WNF9BX01MU0NBVExTVAogICoKLSAqICAgSWYgdXNpbmcgQ0lQU09fVjRfTUFQX1BBU1Mgbm8gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZC4KKyAqICAgSWYgdXNpbmcgQ0lQU09fVjRfTUFQX1BBU1Mgb3IgQ0lQU09fVjRfTUFQX0xPQ0FMIG5vIGFkZGl0aW9uYWwgYXR0cmlidXRlcworICogICBhcmUgcmVxdWlyZWQuCiAgKgogICogbyBSRU1PVkU6CiAgKiAgIFNlbnQgYnkgYW4gYXBwbGljYXRpb24gdG8gcmVtb3ZlIGEgc3BlY2lmaWMgRE9JIG1hcHBpbmcgdGFibGUgZnJvbSB0aGUKQEAgLTc2LDEyICs3NywxMyBAQAogICogICAgIE5MQkxfQ0lQU09WNF9BX01UWVBFCiAgKiAgICAgTkxCTF9DSVBTT1Y0X0FfVEFHTFNUCiAgKgotICogICBJZiB1c2luZyBDSVBTT19WNF9NQVBfU1REIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQ6CisgKiAgIElmIHVzaW5nIENJUFNPX1Y0X01BUF9UUkFOUyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkOgogICoKICAqICAgICBOTEJMX0NJUFNPVjRfQV9NTFNMVkxMU1QKICAqICAgICBOTEJMX0NJUFNPVjRfQV9NTFNDQVRMU1QKICAqCi0gKiAgIElmIHVzaW5nIENJUFNPX1Y0X01BUF9QQVNTIG5vIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQuCisgKiAgIElmIHVzaW5nIENJUFNPX1Y0X01BUF9QQVNTIG9yIENJUFNPX1Y0X01BUF9MT0NBTCBubyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMKKyAqICAgYXJlIHJlcXVpcmVkLgogICoKICAqIG8gTElTVEFMTDoKICAqICAgVGhpcyBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYXBwbGljYXRpb24gdG8gbGlzdCB0aGUgdmFsaWQgRE9JcyBvbiB0aGUKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IDY0M2MwMzIuLjVmYWRmMTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtMTEsNyArMTEsNyBAQAogICovCiAKIC8qCi0gKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2CisgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2LCAyMDA4CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGFzbS9idWcuaD4KIAogI2luY2x1ZGUgIm5ldGxhYmVsX21nbXQuaCIKKyNpbmNsdWRlICJuZXRsYWJlbF9hZGRybGlzdC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX2RvbWFpbmhhc2guaCIKICNpbmNsdWRlICJuZXRsYWJlbF91c2VyLmgiCiAKQEAgLTcyLDggKzczLDI4IEBACiBzdGF0aWMgdm9pZCBuZXRsYmxfZG9taHNoX2ZyZWVfZW50cnkoc3RydWN0IHJjdV9oZWFkICplbnRyeSkKIHsKIAlzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKnB0cjsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI0OworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqdG1wNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI2OworCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqdG1wNjsKKyNlbmRpZiAvKiBJUHY2ICovCiAKIAlwdHIgPSBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBuZXRsYmxfZG9tX21hcCwgcmN1KTsKKwlpZiAocHRyLT50eXBlID09IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVCkgeworCQluZXRsYmxfYWY0bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjQsIHRtcDQsCisJCQkJCSAgICAmcHRyLT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NCkgeworCQkJbmV0bGJsX2FmNGxpc3RfcmVtb3ZlX2VudHJ5KGl0ZXI0KTsKKwkJCWtmcmVlKG5ldGxibF9kb21oc2hfYWRkcjRfZW50cnkoaXRlcjQpKTsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjYsIHRtcDYsCisJCQkJCSAgICAmcHRyLT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikgeworCQkJbmV0bGJsX2FmNmxpc3RfcmVtb3ZlX2VudHJ5KGl0ZXI2KTsKKwkJCWtmcmVlKG5ldGxibF9kb21oc2hfYWRkcjZfZW50cnkoaXRlcjYpKTsKKwkJfQorI2VuZGlmIC8qIElQdjYgKi8KKwl9CiAJa2ZyZWUocHRyLT5kb21haW4pOwogCWtmcmVlKHB0cik7CiB9CkBAIC0xMTUsMTMgKzEzNiwxMyBAQAogc3RhdGljIHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqbmV0bGJsX2RvbWhzaF9zZWFyY2goY29uc3QgY2hhciAqZG9tYWluKQogewogCXUzMiBia3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqYmt0X2xpc3Q7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICppdGVyOwogCiAJaWYgKGRvbWFpbiAhPSBOVUxMKSB7CiAJCWJrdCA9IG5ldGxibF9kb21oc2hfaGFzaChkb21haW4pOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLAotCQkJCSAgICAgJnJjdV9kZXJlZmVyZW5jZShuZXRsYmxfZG9taHNoKS0+dGJsW2JrdF0sCi0JCQkJICAgICBsaXN0KQorCQlia3RfbGlzdCA9ICZyY3VfZGVyZWZlcmVuY2UobmV0bGJsX2RvbWhzaCktPnRibFtia3RdOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLCBia3RfbGlzdCwgbGlzdCkKIAkJCWlmIChpdGVyLT52YWxpZCAmJiBzdHJjbXAoaXRlci0+ZG9tYWluLCBkb21haW4pID09IDApCiAJCQkJcmV0dXJuIGl0ZXI7CiAJfQpAQCAtMTU2LDYgKzE3Nyw2OSBAQAogCXJldHVybiBlbnRyeTsKIH0KIAorLyoqCisgKiBuZXRsYmxfZG9taHNoX2F1ZGl0X2FkZCAtIEdlbmVyYXRlIGFuIGF1ZGl0IGVudHJ5IGZvciBhbiBhZGQgZXZlbnQKKyAqIEBlbnRyeTogdGhlIGVudHJ5IGJlaW5nIGFkZGVkCisgKiBAYWRkcjQ6IHRoZSBJUHY0IGFkZHJlc3MgaW5mb3JtYXRpb24KKyAqIEBhZGRyNjogdGhlIElQdjYgYWRkcmVzcyBpbmZvcm1hdGlvbgorICogQHJlc3VsdDogdGhlIHJlc3VsdCBjb2RlCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdlbmVyYXRlIGFuIGF1ZGl0IHJlY29yZCBmb3IgYWRkaW5nIGEgbmV3IE5ldExhYmVsL0xTTSBtYXBwaW5nIGVudHJ5IHdpdGgKKyAqIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4gIENhbGxlciBpcyByZXNwb25zaWJpbGUgZm9yIGhvbGRpbmcgdGhlIG5lY2Vzc2FyeQorICogbG9ja3MuCisgKgorICovCitzdGF0aWMgdm9pZCBuZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5LAorCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmFkZHI0LAorCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKmFkZHI2LAorCQkJCSAgICBpbnQgcmVzdWx0LAorCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKKwlzdHJ1Y3QgY2lwc29fdjRfZG9pICpjaXBzb3Y0ID0gTlVMTDsKKwl1MzIgdHlwZTsKKworCWF1ZGl0X2J1ZiA9IG5ldGxibF9hdWRpdF9zdGFydF9jb21tb24oQVVESVRfTUFDX01BUF9BREQsIGF1ZGl0X2luZm8pOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBubGJsX2RvbWFpbj0lcyIsCisJCQkJIGVudHJ5LT5kb21haW4gPyBlbnRyeS0+ZG9tYWluIDogIihkZWZhdWx0KSIpOworCQlpZiAoYWRkcjQgIT0gTlVMTCkgeworCQkJc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKm1hcDQ7CisJCQltYXA0ID0gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShhZGRyNCk7CisJCQl0eXBlID0gbWFwNC0+dHlwZTsKKwkJCWNpcHNvdjQgPSBtYXA0LT50eXBlX2RlZi5jaXBzb3Y0OworCQkJbmV0bGJsX2FmNGxpc3RfYXVkaXRfYWRkcihhdWRpdF9idWYsIDAsIE5VTEwsCisJCQkJCQkgIGFkZHI0LT5hZGRyLCBhZGRyNC0+bWFzayk7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCX0gZWxzZSBpZiAoYWRkcjYgIT0gTlVMTCkgeworCQkJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDY7CisJCQltYXA2ID0gbmV0bGJsX2RvbWhzaF9hZGRyNl9lbnRyeShhZGRyNik7CisJCQl0eXBlID0gbWFwNi0+dHlwZTsKKwkJCW5ldGxibF9hZjZsaXN0X2F1ZGl0X2FkZHIoYXVkaXRfYnVmLCAwLCBOVUxMLAorCQkJCQkJICAmYWRkcjYtPmFkZHIsICZhZGRyNi0+bWFzayk7CisjZW5kaWYgLyogSVB2NiAqLworCQl9IGVsc2UgeworCQkJdHlwZSA9IGVudHJ5LT50eXBlOworCQkJY2lwc292NCA9IGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0OworCQl9CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgorCQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgbmxibF9wcm90b2NvbD11bmxibCIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgorCQkJQlVHX09OKGNpcHNvdjQgPT0gTlVMTCk7CisJCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkJICIgbmxibF9wcm90b2NvbD1jaXBzb3Y0IGNpcHNvX2RvaT0ldSIsCisJCQkJCSBjaXBzb3Y0LT5kb2kpOworCQkJYnJlYWs7CisJCX0KKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmVzdWx0ID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9Cit9CisKIC8qCiAgKiBEb21haW4gSGFzaCBUYWJsZSBGdW5jdGlvbnMKICAqLwpAQCAtMjEzLDc0ICsyOTcsMTA2IEBACiBpbnQgbmV0bGJsX2RvbWhzaF9hZGQoc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeSwKIAkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKLQlpbnQgcmV0X3ZhbDsKLQl1MzIgYmt0OwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKLQotCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKLQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgotCQlyZXRfdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6Ci0JCXJldF92YWwgPSBjaXBzb192NF9kb2lfZG9taHNoX2FkZChlbnRyeS0+dHlwZV9kZWYuY2lwc292NCwKLQkJCQkJCSAgZW50cnktPmRvbWFpbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQotCWVudHJ5LT52YWxpZCA9IDE7Ci0JSU5JVF9SQ1VfSEVBRCgmZW50cnktPnJjdSk7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnlfb2xkOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICp0bXA0OworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqaXRlcjY7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICp0bXA2OworI2VuZGlmIC8qIElQdjYgKi8KIAogCXJjdV9yZWFkX2xvY2soKTsKKwogCXNwaW5fbG9jaygmbmV0bGJsX2RvbWhzaF9sb2NrKTsKLQlpZiAoZW50cnktPmRvbWFpbiAhPSBOVUxMKSB7Ci0JCWJrdCA9IG5ldGxibF9kb21oc2hfaGFzaChlbnRyeS0+ZG9tYWluKTsKLQkJaWYgKG5ldGxibF9kb21oc2hfc2VhcmNoKGVudHJ5LT5kb21haW4pID09IE5VTEwpCisJaWYgKGVudHJ5LT5kb21haW4gIT0gTlVMTCkKKwkJZW50cnlfb2xkID0gbmV0bGJsX2RvbWhzaF9zZWFyY2goZW50cnktPmRvbWFpbik7CisJZWxzZQorCQllbnRyeV9vbGQgPSBuZXRsYmxfZG9taHNoX3NlYXJjaF9kZWYoZW50cnktPmRvbWFpbik7CisJaWYgKGVudHJ5X29sZCA9PSBOVUxMKSB7CisJCWVudHJ5LT52YWxpZCA9IDE7CisJCUlOSVRfUkNVX0hFQUQoJmVudHJ5LT5yY3UpOworCisJCWlmIChlbnRyeS0+ZG9tYWluICE9IE5VTEwpIHsKKwkJCXUzMiBia3QgPSBuZXRsYmxfZG9taHNoX2hhc2goZW50cnktPmRvbWFpbik7CiAJCQlsaXN0X2FkZF90YWlsX3JjdSgmZW50cnktPmxpc3QsCiAJCQkJICAgICZyY3VfZGVyZWZlcmVuY2UobmV0bGJsX2RvbWhzaCktPnRibFtia3RdKTsKLQkJZWxzZQotCQkJcmV0X3ZhbCA9IC1FRVhJU1Q7Ci0JfSBlbHNlIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5saXN0KTsKLQkJaWYgKHJjdV9kZXJlZmVyZW5jZShuZXRsYmxfZG9taHNoX2RlZikgPT0gTlVMTCkKKwkJfSBlbHNlIHsKKwkJCUlOSVRfTElTVF9IRUFEKCZlbnRyeS0+bGlzdCk7CiAJCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0bGJsX2RvbWhzaF9kZWYsIGVudHJ5KTsKLQkJZWxzZQotCQkJcmV0X3ZhbCA9IC1FRVhJU1Q7Ci0JfQorCQl9CisKKwkJaWYgKGVudHJ5LT50eXBlID09IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVCkgeworCQkJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsCisJCQkJCSAgICAgICAmZW50cnktPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KQorCQkJCW5ldGxibF9kb21oc2hfYXVkaXRfYWRkKGVudHJ5LCBpdGVyNCwgTlVMTCwKKwkJCQkJCQlyZXRfdmFsLCBhdWRpdF9pbmZvKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJCW5ldGxibF9hZjZsaXN0X2ZvcmVhY2hfcmN1KGl0ZXI2LAorCQkJCQkgICAgICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikKKwkJCQluZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChlbnRyeSwgTlVMTCwgaXRlcjYsCisJCQkJCQkJcmV0X3ZhbCwgYXVkaXRfaW5mbyk7CisjZW5kaWYgLyogSVB2NiAqLworCQl9IGVsc2UKKwkJCW5ldGxibF9kb21oc2hfYXVkaXRfYWRkKGVudHJ5LCBOVUxMLCBOVUxMLAorCQkJCQkJcmV0X3ZhbCwgYXVkaXRfaW5mbyk7CisJfSBlbHNlIGlmIChlbnRyeV9vbGQtPnR5cGUgPT0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUICYmCisJCSAgIGVudHJ5LT50eXBlID09IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpvbGRfbGlzdDQ7CisJCXN0cnVjdCBsaXN0X2hlYWQgKm9sZF9saXN0NjsKKworCQlvbGRfbGlzdDQgPSAmZW50cnlfb2xkLT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NDsKKwkJb2xkX2xpc3Q2ID0gJmVudHJ5X29sZC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDY7CisKKwkJLyogd2Ugb25seSBhbGxvdyB0aGUgYWRkaXRpb24gb2YgYWRkcmVzcyBzZWxlY3RvcnMgaWYgYWxsIG9mCisJCSAqIHRoZSBzZWxlY3RvcnMgZG8gbm90IGV4aXN0IGluIHRoZSBleGlzdGluZyBkb21haW4gbWFwICovCisJCW5ldGxibF9hZjRsaXN0X2ZvcmVhY2hfcmN1KGl0ZXI0LAorCQkJCQkgICAmZW50cnktPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KQorCQkJaWYgKG5ldGxibF9hZjRsaXN0X3NlYXJjaF9leGFjdChpdGVyNC0+YWRkciwKKwkJCQkJCQlpdGVyNC0+bWFzaywKKwkJCQkJCQlvbGRfbGlzdDQpKSB7CisJCQkJcmV0X3ZhbCA9IC1FRVhJU1Q7CisJCQkJZ290byBhZGRfcmV0dXJuOworCQkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwKKwkJCQkJICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikKKwkJCWlmIChuZXRsYmxfYWY2bGlzdF9zZWFyY2hfZXhhY3QoJml0ZXI2LT5hZGRyLAorCQkJCQkJCSZpdGVyNi0+bWFzaywKKwkJCQkJCQlvbGRfbGlzdDYpKSB7CisJCQkJcmV0X3ZhbCA9IC1FRVhJU1Q7CisJCQkJZ290byBhZGRfcmV0dXJuOworCQkJfQorI2VuZGlmIC8qIElQdjYgKi8KKworCQluZXRsYmxfYWY0bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjQsIHRtcDQsCisJCQkJCSAgICAmZW50cnktPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KSB7CisJCQluZXRsYmxfYWY0bGlzdF9yZW1vdmVfZW50cnkoaXRlcjQpOworCQkJaXRlcjQtPnZhbGlkID0gMTsKKwkJCXJldF92YWwgPSBuZXRsYmxfYWY0bGlzdF9hZGQoaXRlcjQsIG9sZF9saXN0NCk7CisJCQluZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChlbnRyeV9vbGQsIGl0ZXI0LCBOVUxMLAorCQkJCQkJcmV0X3ZhbCwgYXVkaXRfaW5mbyk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCWdvdG8gYWRkX3JldHVybjsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjYsIHRtcDYsCisJCQkJCSAgICAmZW50cnktPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q2KSB7CisJCQluZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoaXRlcjYpOworCQkJaXRlcjYtPnZhbGlkID0gMTsKKwkJCXJldF92YWwgPSBuZXRsYmxfYWY2bGlzdF9hZGQoaXRlcjYsIG9sZF9saXN0Nik7CisJCQluZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChlbnRyeV9vbGQsIE5VTEwsIGl0ZXI2LAorCQkJCQkJcmV0X3ZhbCwgYXVkaXRfaW5mbyk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCWdvdG8gYWRkX3JldHVybjsKKwkJfQorI2VuZGlmIC8qIElQdjYgKi8KKwl9IGVsc2UKKwkJcmV0X3ZhbCA9IC1FSU5WQUw7CisKK2FkZF9yZXR1cm46CiAJc3Bpbl91bmxvY2soJm5ldGxibF9kb21oc2hfbG9jayk7Ci0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfTUFQX0FERCwgYXVkaXRfaW5mbyk7Ci0JaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJCSAiIG5sYmxfZG9tYWluPSVzIiwKLQkJCQkgZW50cnktPmRvbWFpbiA/IGVudHJ5LT5kb21haW4gOiAiKGRlZmF1bHQpIik7Ci0JCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKLQkJY2FzZSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDoKLQkJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIG5sYmxfcHJvdG9jb2w9dW5sYmwiKTsKLQkJCWJyZWFrOwotCQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKLQkJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJCQkgIiBubGJsX3Byb3RvY29sPWNpcHNvdjQgY2lwc29fZG9pPSV1IiwKLQkJCQkJIGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0LT5kb2kpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQogCXJjdV9yZWFkX3VubG9jaygpOwotCi0JaWYgKHJldF92YWwgIT0gMCkgewotCQlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0JCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgotCQkJaWYgKGNpcHNvX3Y0X2RvaV9kb21oc2hfcmVtb3ZlKGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0LAotCQkJCQkJICAgICAgIGVudHJ5LT5kb21haW4pICE9IDApCi0JCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0zMDIsNiArNDE4LDcxIEBACiB9CiAKIC8qKgorICogbmV0bGJsX2RvbWhzaF9yZW1vdmVfZW50cnkgLSBSZW1vdmVzIGEgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgZG9tYWluIHRhYmxlCisgKiBAZW50cnk6IHRoZSBlbnRyeSB0byByZW1vdmUKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBhbiBlbnRyeSBmcm9tIHRoZSBkb21haW4gaGFzaCB0YWJsZSBhbmQgaGFuZGxlcyBhbnkgdXBkYXRlcyB0byB0aGUKKyAqIGxvd2VyIGxldmVsIHByb3RvY29sIGhhbmRsZXIgKGkuZS4gQ0lQU08pLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZW5zdXJpbmcgdGhhdCB0aGUgUkNVIHJlYWQgbG9jayBpcyBoZWxkLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlCisgKiBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlX2VudHJ5KHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnksCisJCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlpbnQgcmV0X3ZhbCA9IDA7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOworCisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCisJc3Bpbl9sb2NrKCZuZXRsYmxfZG9taHNoX2xvY2spOworCWlmIChlbnRyeS0+dmFsaWQpIHsKKwkJZW50cnktPnZhbGlkID0gMDsKKwkJaWYgKGVudHJ5ICE9IHJjdV9kZXJlZmVyZW5jZShuZXRsYmxfZG9taHNoX2RlZikpCisJCQlsaXN0X2RlbF9yY3UoJmVudHJ5LT5saXN0KTsKKwkJZWxzZQorCQkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldGxibF9kb21oc2hfZGVmLCBOVUxMKTsKKwl9IGVsc2UKKwkJcmV0X3ZhbCA9IC1FTk9FTlQ7CisJc3Bpbl91bmxvY2soJm5ldGxibF9kb21oc2hfbG9jayk7CisKKwlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19NQVBfREVMLCBhdWRpdF9pbmZvKTsKKwlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgbmxibF9kb21haW49JXMgcmVzPSV1IiwKKwkJCQkgZW50cnktPmRvbWFpbiA/IGVudHJ5LT5kb21haW4gOiAiKGRlZmF1bHQpIiwKKwkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQorCisJaWYgKHJldF92YWwgPT0gMCkgeworCQlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI0OworCQlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqbWFwNDsKKworCQlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CisJCWNhc2UgTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUOgorCQkJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsCisJCQkJCSAgICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NCkgeworCQkJCW1hcDQgPSBuZXRsYmxfZG9taHNoX2FkZHI0X2VudHJ5KGl0ZXI0KTsKKwkJCQljaXBzb192NF9kb2lfcHV0ZGVmKG1hcDQtPnR5cGVfZGVmLmNpcHNvdjQpOworCQkJfQorCQkJLyogbm8gbmVlZCB0byBjaGVjayB0aGUgSVB2NiBsaXN0IHNpbmNlIHdlIGN1cnJlbnRseQorCQkJICogc3VwcG9ydCBvbmx5IHVubGFiZWxlZCBwcm90b2NvbHMgZm9yIElQdjYgKi8KKwkJCWJyZWFrOworCQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKKwkJCWNpcHNvX3Y0X2RvaV9wdXRkZWYoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQpOworCQkJYnJlYWs7CisJCX0KKwkJY2FsbF9yY3UoJmVudHJ5LT5yY3UsIG5ldGxibF9kb21oc2hfZnJlZV9lbnRyeSk7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgogICogbmV0bGJsX2RvbWhzaF9yZW1vdmUgLSBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGRvbWFpbiBoYXNoIHRhYmxlCiAgKiBAZG9tYWluOiB0aGUgZG9tYWluIHRvIHJlbW92ZQogICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCkBAIC0zMTQsNDcgKzQ5NSwxNyBAQAogICovCiBpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmUoY29uc3QgY2hhciAqZG9tYWluLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewotCWludCByZXRfdmFsID0gLUVOT0VOVDsKKwlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5OwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAoZG9tYWluKQogCQllbnRyeSA9IG5ldGxibF9kb21oc2hfc2VhcmNoKGRvbWFpbik7CiAJZWxzZQogCQllbnRyeSA9IG5ldGxibF9kb21oc2hfc2VhcmNoX2RlZihkb21haW4pOwotCWlmIChlbnRyeSA9PSBOVUxMKQotCQlnb3RvIHJlbW92ZV9yZXR1cm47Ci0Jc3dpdGNoIChlbnRyeS0+dHlwZSkgewotCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgotCQljaXBzb192NF9kb2lfZG9taHNoX3JlbW92ZShlbnRyeS0+dHlwZV9kZWYuY2lwc292NCwKLQkJCQkJICAgZW50cnktPmRvbWFpbik7Ci0JCWJyZWFrOwotCX0KLQlzcGluX2xvY2soJm5ldGxibF9kb21oc2hfbG9jayk7Ci0JaWYgKGVudHJ5LT52YWxpZCkgewotCQllbnRyeS0+dmFsaWQgPSAwOwotCQlpZiAoZW50cnkgIT0gcmN1X2RlcmVmZXJlbmNlKG5ldGxibF9kb21oc2hfZGVmKSkKLQkJCWxpc3RfZGVsX3JjdSgmZW50cnktPmxpc3QpOwotCQllbHNlCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0bGJsX2RvbWhzaF9kZWYsIE5VTEwpOwotCQlyZXRfdmFsID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2soJm5ldGxibF9kb21oc2hfbG9jayk7Ci0KLQlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19NQVBfREVMLCBhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkJICIgbmxibF9kb21haW49JXMgcmVzPSV1IiwKLQkJCQkgZW50cnktPmRvbWFpbiA/IGVudHJ5LT5kb21haW4gOiAiKGRlZmF1bHQpIiwKLQkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQotCi1yZW1vdmVfcmV0dXJuOgorCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX3JlbW92ZV9lbnRyeShlbnRyeSwgYXVkaXRfaW5mbyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JaWYgKHJldF92YWwgPT0gMCkKLQkJY2FsbF9yY3UoJmVudHJ5LT5yY3UsIG5ldGxibF9kb21oc2hfZnJlZV9lbnRyeSk7CisKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMzg5LDYgKzU0MCw3MCBAQAogfQogCiAvKioKKyAqIG5ldGxibF9kb21oc2hfZ2V0ZW50cnlfYWY0IC0gR2V0IGFuIGVudHJ5IGZyb20gdGhlIGRvbWFpbiBoYXNoIHRhYmxlCisgKiBAZG9tYWluOiB0aGUgZG9tYWluIG5hbWUgdG8gc2VhcmNoIGZvcgorICogQGFkZHI6IHRoZSBJUCBhZGRyZXNzIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExvb2sgdGhyb3VnaCB0aGUgZG9tYWluIGhhc2ggdGFibGUgc2VhcmNoaW5nIGZvciBhbiBlbnRyeSB0byBtYXRjaCBAZG9tYWluCisgKiBhbmQgQGFkZHIsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBjb3B5IG9mIHRoZSBlbnRyeSBvciBOVUxMLiAgVGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmN1X3JlYWRfW3VuXWxvY2soKSBpcyBjYWxsZWQuCisgKgorICovCitzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqbmV0bGJsX2RvbWhzaF9nZXRlbnRyeV9hZjQoY29uc3QgY2hhciAqZG9tYWluLAorCQkJCQkJICAgICAgIF9fYmUzMiBhZGRyKQoreworCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZG9tX2l0ZXI7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICphZGRyX2l0ZXI7CisKKwlkb21faXRlciA9IG5ldGxibF9kb21oc2hfc2VhcmNoX2RlZihkb21haW4pOworCWlmIChkb21faXRlciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZG9tX2l0ZXItPnR5cGUgIT0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHJfaXRlciA9IG5ldGxibF9hZjRsaXN0X3NlYXJjaChhZGRyLAorCQkJCQkgICZkb21faXRlci0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDQpOworCWlmIChhZGRyX2l0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShhZGRyX2l0ZXIpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisvKioKKyAqIG5ldGxibF9kb21oc2hfZ2V0ZW50cnlfYWY2IC0gR2V0IGFuIGVudHJ5IGZyb20gdGhlIGRvbWFpbiBoYXNoIHRhYmxlCisgKiBAZG9tYWluOiB0aGUgZG9tYWluIG5hbWUgdG8gc2VhcmNoIGZvcgorICogQGFkZHI6IHRoZSBJUCBhZGRyZXNzIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExvb2sgdGhyb3VnaCB0aGUgZG9tYWluIGhhc2ggdGFibGUgc2VhcmNoaW5nIGZvciBhbiBlbnRyeSB0byBtYXRjaCBAZG9tYWluCisgKiBhbmQgQGFkZHIsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBjb3B5IG9mIHRoZSBlbnRyeSBvciBOVUxMLiAgVGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmN1X3JlYWRfW3VuXWxvY2soKSBpcyBjYWxsZWQuCisgKgorICovCitzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI2X21hcCAqbmV0bGJsX2RvbWhzaF9nZXRlbnRyeV9hZjYoY29uc3QgY2hhciAqZG9tYWluLAorCQkJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZG9tX2l0ZXI7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICphZGRyX2l0ZXI7CisKKwlkb21faXRlciA9IG5ldGxibF9kb21oc2hfc2VhcmNoX2RlZihkb21haW4pOworCWlmIChkb21faXRlciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZG9tX2l0ZXItPnR5cGUgIT0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHJfaXRlciA9IG5ldGxibF9hZjZsaXN0X3NlYXJjaChhZGRyLAorCQkJCQkgICZkb21faXRlci0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDYpOworCWlmIChhZGRyX2l0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbmV0bGJsX2RvbWhzaF9hZGRyNl9lbnRyeShhZGRyX2l0ZXIpOworfQorI2VuZGlmIC8qIElQdjYgKi8KKworLyoqCiAgKiBuZXRsYmxfZG9taHNoX3dhbGsgLSBJdGVyYXRlIHRocm91Z2ggdGhlIGRvbWFpbiBtYXBwaW5nIGhhc2ggdGFibGUKICAqIEBza2lwX2JrdDogdGhlIG51bWJlciBvZiBidWNrZXRzIHRvIHNraXAgYXQgdGhlIHN0YXJ0CiAgKiBAc2tpcF9jaGFpbjogdGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAgaW4gdGhlIGZpcnN0IGl0ZXJhdGVkIGJ1Y2tldApAQCAtNDEwLDYgKzYyNSw3IEBACiB7CiAJaW50IHJldF92YWwgPSAtRU5PRU5UOwogCXUzMiBpdGVyX2JrdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyX2xpc3Q7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICppdGVyX2VudHJ5OwogCXUzMiBjaGFpbl9jbnQgPSAwOwogCkBAIC00MTcsOSArNjMzLDggQEAKIAlmb3IgKGl0ZXJfYmt0ID0gKnNraXBfYmt0OwogCSAgICAgaXRlcl9ia3QgPCByY3VfZGVyZWZlcmVuY2UobmV0bGJsX2RvbWhzaCktPnNpemU7CiAJICAgICBpdGVyX2JrdCsrLCBjaGFpbl9jbnQgPSAwKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGl0ZXJfZW50cnksCi0JCQkJJnJjdV9kZXJlZmVyZW5jZShuZXRsYmxfZG9taHNoKS0+dGJsW2l0ZXJfYmt0XSwKLQkJCQlsaXN0KQorCQlpdGVyX2xpc3QgPSAmcmN1X2RlcmVmZXJlbmNlKG5ldGxibF9kb21oc2gpLT50YmxbaXRlcl9ia3RdOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyX2VudHJ5LCBpdGVyX2xpc3QsIGxpc3QpCiAJCQlpZiAoaXRlcl9lbnRyeS0+dmFsaWQpIHsKIAkJCQlpZiAoY2hhaW5fY250KysgPCAqc2tpcF9jaGFpbikKIAkJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaAppbmRleCA4MjIwOTkwLi5iZmNiNjc2IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKQEAgLTExLDcgKzExLDcgQEAKICAqLwogCiAvKgotICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgorICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNiwgMjAwOAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTM2LDE2ICszNiw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCisjaW5jbHVkZSAibmV0bGFiZWxfYWRkcmxpc3QuaCIKKwogLyogRG9tYWluIGhhc2ggdGFibGUgc2l6ZSAqLwogLyogWFhYIC0gY3VycmVudGx5IHRoaXMgbnVtYmVyIGlzIGFuIHVuZWR1Y2F0ZWQgZ3Vlc3MgKi8KICNkZWZpbmUgTkVUTEJMX0RPTUhTSF9CSVRTSVpFICAgICAgIDcKIAotLyogRG9tYWluIG1hcHBpbmcgZGVmaW5pdGlvbiBzdHJ1Y3QgKi8KKy8qIERvbWFpbiBtYXBwaW5nIGRlZmluaXRpb24gc3RydWN0dXJlcyAqLworI2RlZmluZSBuZXRsYmxfZG9taHNoX2FkZHI0X2VudHJ5KGl0ZXIpIFwKKwljb250YWluZXJfb2YoaXRlciwgc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAsIGxpc3QpCitzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCB7CisJdTMyIHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgY2lwc29fdjRfZG9pICpjaXBzb3Y0OworCX0gdHlwZV9kZWY7CisKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgbGlzdDsKK307CisjZGVmaW5lIG5ldGxibF9kb21oc2hfYWRkcjZfZW50cnkoaXRlcikgXAorCWNvbnRhaW5lcl9vZihpdGVyLCBzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI2X21hcCwgbGlzdCkKK3N0cnVjdCBuZXRsYmxfZG9tYWRkcjZfbWFwIHsKKwl1MzIgdHlwZTsKKworCS8qIE5PVEU6IG5vICd0eXBlX2RlZicgdW5pb24gbmVlZGVkIGF0IHByZXNlbnQgc2luY2Ugd2UgZG9uJ3QgY3VycmVudGx5CisJICogICAgICAgc3VwcG9ydCBhbnkgSVB2NiBsYWJlbGluZyBwcm90b2NvbHMgKi8KKworCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCBsaXN0OworfTsKK3N0cnVjdCBuZXRsYmxfZG9tYWRkcl9tYXAgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0NjsKK307CiBzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgewogCWNoYXIgKmRvbWFpbjsKIAl1MzIgdHlwZTsKIAl1bmlvbiB7CiAJCXN0cnVjdCBjaXBzb192NF9kb2kgKmNpcHNvdjQ7CisJCXN0cnVjdCBuZXRsYmxfZG9tYWRkcl9tYXAgKmFkZHJzZWw7CiAJfSB0eXBlX2RlZjsKIAogCXUzMiB2YWxpZDsKQEAgLTYxLDEyICs4OCwyMSBAQAogCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIGludCBuZXRsYmxfZG9taHNoX2FkZF9kZWZhdWx0KHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnksCiAJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfZG9taHNoX3JlbW92ZV9lbnRyeShzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5LAorCQkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfZGVmYXVsdChzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqbmV0bGJsX2RvbWhzaF9nZXRlbnRyeShjb25zdCBjaGFyICpkb21haW4pOworc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKm5ldGxibF9kb21oc2hfZ2V0ZW50cnlfYWY0KGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkJCSAgICAgICBfX2JlMzIgYWRkcik7CiBpbnQgbmV0bGJsX2RvbWhzaF93YWxrKHUzMiAqc2tpcF9ia3QsCiAJCSAgICAgdTMyICpza2lwX2NoYWluLAogCQkgICAgIGludCAoKmNhbGxiYWNrKSAoc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeSwgdm9pZCAqYXJnKSwKIAkJICAgICB2b2lkICpjYl9hcmcpOwogCisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCitzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI2X21hcCAqbmV0bGJsX2RvbWhzaF9nZXRlbnRyeV9hZjYoY29uc3QgY2hhciAqZG9tYWluLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpOworI2VuZGlmIC8qIElQdjYgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwppbmRleCAzOTc5M2ExLi5iMzJlY2ViIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqLwogCiAvKgotICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgorICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNiwgMjAwOAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTgyLDcgKzgyLDcgQEAKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCi0JCWdvdG8gY2ZnX3VubGJsX2FkZF9tYXBfZmFpbHVyZTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGRvbWFpbiAhPSBOVUxMKSB7CiAJCWVudHJ5LT5kb21haW4gPSBrc3RyZHVwKGRvbWFpbiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlbnRyeS0+ZG9tYWluID09IE5VTEwpCkBAIC0xMDQsNDkgKzEwNCw2IEBACiB9CiAKIC8qKgotICogbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZCAtIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBkZWZpbml0aW9uCi0gKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCi0gKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBkZWZpbml0aW9uIHRvIHRoZSBOZXRMYWJlbCBzdWJzeXN0ZW0uICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgotICoKLSAqLwotaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKLQkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCi17Ci0JaW50IHJldF92YWw7Ci0JY29uc3QgY2hhciAqdHlwZV9zdHI7Ci0Jc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwotCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZik7Ci0KLQlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0FERCwKLQkJCQkJICAgICAgYXVkaXRfaW5mbyk7Ci0JaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7Ci0JCXN3aXRjaCAoZG9pX2RlZi0+dHlwZSkgewotCQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6Ci0JCQl0eXBlX3N0ciA9ICJzdGQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6Ci0JCQl0eXBlX3N0ciA9ICJwYXNzIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHlwZV9zdHIgPSAiKHVua25vd24pIjsKLQkJfQotCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAotCQkJCSBkb2lfZGVmLT5kb2ksCi0JCQkJIHR5cGVfc3RyLAotCQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKLQl9Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyoqCiAgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkX21hcCAtIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBkZWZpbml0aW9uIGFuZCBtYXBwaW5nCiAgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCiAgKiBAZG9tYWluOiB0aGUgZG9tYWluIG1hcHBpbmcgdG8gYWRkCkBAIC0xNjQsNTggKzEyMSw3MSBAQAogCQkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWwgPSAtRU5PTUVNOworCXUzMiBkb2k7CisJdTMyIGRvaV90eXBlOwogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnk7CisJY29uc3QgY2hhciAqdHlwZV9zdHI7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOworCisJZG9pID0gZG9pX2RlZi0+ZG9pOworCWRvaV90eXBlID0gZG9pX2RlZi0+dHlwZTsKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCi0JCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlOworCQlyZXR1cm4gLUVOT01FTTsKIAlpZiAoZG9tYWluICE9IE5VTEwpIHsKIAkJZW50cnktPmRvbWFpbiA9IGtzdHJkdXAoZG9tYWluLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkKIAkJCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlOwogCX0KLQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKLQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGRvaV9kZWY7CiAKLQkvKiBHcmFiIGEgUkNVIHJlYWQgbG9jayBoZXJlIHNvIG5vdGhpbmcgaGFwcGVucyB0byB0aGUgZG9pX2RlZiB2YXJpYWJsZQotCSAqIGJldHdlZW4gYWRkaW5nIGl0IHRvIHRoZSBDSVBTT3Y0IHByb3RvY29sIGVuZ2luZSBhbmQgYWRkaW5nIGEKLQkgKiBkb21haW4gbWFwcGluZyBmb3IgaXQuICovCi0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0X3ZhbCA9IG5ldGxibF9jZmdfY2lwc292NF9hZGQoZG9pX2RlZiwgYXVkaXRfaW5mbyk7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfdW5sb2NrOwotCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX2FkZChlbnRyeSwgYXVkaXRfaW5mbyk7CisJcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZik7CiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKKwllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKKwlpZiAoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPT0gTlVMTCkgeworCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKKwl9CisJcmV0X3ZhbCA9IG5ldGxibF9kb21oc2hfYWRkKGVudHJ5LCBhdWRpdF9pbmZvKTsKKwlpZiAocmV0X3ZhbCAhPSAwKQorCQlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfZmFpbHVyZV9yZWxlYXNlX2RvaTsKIAotCXJldHVybiAwOworY2ZnX2NpcHNvdjRfYWRkX21hcF9yZXR1cm46CisJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9BREQsCisJCQkJCSAgICAgIGF1ZGl0X2luZm8pOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGRvaV90eXBlKSB7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgorCQkJdHlwZV9zdHIgPSAidHJhbnMiOworCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6CisJCQl0eXBlX3N0ciA9ICJwYXNzIjsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X01BUF9MT0NBTDoKKwkJCXR5cGVfc3RyID0gImxvY2FsIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHlwZV9zdHIgPSAiKHVua25vd24pIjsKKwkJfQorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAorCQkJCSBkb2ksIHR5cGVfc3RyLCByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9CiAKKwlyZXR1cm4gcmV0X3ZhbDsKKworY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3JlbGVhc2VfZG9pOgorCWNpcHNvX3Y0X2RvaV9wdXRkZWYoZG9pX2RlZik7CiBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaToKLQljaXBzb192NF9kb2lfcmVtb3ZlKGRvaV9kZWYtPmRvaSwgYXVkaXRfaW5mbywgbmV0bGJsX2NpcHNvdjRfZG9pX2ZyZWUpOwotY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3VubG9jazoKLQlyY3VfcmVhZF91bmxvY2soKTsKKwljaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgYXVkaXRfaW5mbyk7CiBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmU6CiAJaWYgKGVudHJ5ICE9IE5VTEwpCiAJCWtmcmVlKGVudHJ5LT5kb21haW4pOwogCWtmcmVlKGVudHJ5KTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyoqCi0gKiBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsIC0gUmVtb3ZlYW4gZXhpc3RpbmcgQ0lQU092NCBET0kgZGVmaW5pdGlvbgotICogQGRvaTogdGhlIENJUFNPIERPSSB2YWx1ZQotICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZW1vdmVzIGFuIGV4aXN0aW5nIENJUFNPdjQgRE9JIGRlZmluaXRpb24gZnJvbSB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtLgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgotICoKLSAqLwotaW50IG5ldGxibF9jZmdfY2lwc292NF9kZWwodTMyIGRvaSwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKLXsKLQlyZXR1cm4gY2lwc29fdjRfZG9pX3JlbW92ZShkb2ksIGF1ZGl0X2luZm8sIG5ldGxibF9jaXBzb3Y0X2RvaV9mcmVlKTsKKwlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfcmV0dXJuOwogfQogCiAvKgpAQCAtNDUyLDcgKzQyMiw5IEBACiAgKiBBdHRhY2ggdGhlIGNvcnJlY3QgbGFiZWwgdG8gdGhlIGdpdmVuIHNvY2tldCB1c2luZyB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcwogICogc3BlY2lmaWVkIGluIEBzZWNhdHRyLiAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBleGNsdXNpdmUgYWNjZXNzIHRvIEBzaywKICAqIHdoaWNoIG1lYW5zIGl0IGVpdGhlciBuZWVkcyB0byBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjcmVhdGVkIG9yIGxvY2tlZC4KLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtRURFU1RBRERSUkVRIGlmIHRoZSBkb21haW4gaXMgY29uZmlndXJlZCB0byB1c2UKKyAqIG5ldHdvcmsgYWRkcmVzcyBzZWxlY3RvcnMgKGNhbid0IGJsaW5kbHkgbGFiZWwgdGhlIHNvY2tldCksIGFuZCBuZWdhdGl2ZQorICogdmFsdWVzIG9uIGFsbCBvdGhlciBmYWlsdXJlcy4KICAqCiAgKi8KIGludCBuZXRsYmxfc29ja19zZXRhdHRyKHN0cnVjdCBzb2NrICpzaywKQEAgLTQ2Niw2ICs0MzgsOSBAQAogCWlmIChkb21fZW50cnkgPT0gTlVMTCkKIAkJZ290byBzb2NrZXRfc2V0YXR0cl9yZXR1cm47CiAJc3dpdGNoIChkb21fZW50cnktPnR5cGUpIHsKKwljYXNlIE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVDoKKwkJcmV0X3ZhbCA9IC1FREVTVEFERFJSRVE7CisJCWJyZWFrOwogCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgogCQlyZXRfdmFsID0gY2lwc29fdjRfc29ja19zZXRhdHRyKHNrLAogCQkJCQkJZG9tX2VudHJ5LT50eXBlX2RlZi5jaXBzb3Y0LApAQCAtNDg0LDYgKzQ1OSwyMCBAQAogfQogCiAvKioKKyAqIG5ldGxibF9zb2NrX2RlbGF0dHIgLSBEZWxldGUgYWxsIHRoZSBOZXRMYWJlbCBsYWJlbHMgb24gYSBzb2NrZXQKKyAqIEBzazogdGhlIHNvY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlIGFsbCB0aGUgTmV0TGFiZWwgbGFiZWxpbmcgZnJvbSBAc2suICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZW5zdXJpbmcgdGhhdCBAc2sgaXMgbG9ja2VkLgorICoKKyAqLwordm9pZCBuZXRsYmxfc29ja19kZWxhdHRyKHN0cnVjdCBzb2NrICpzaykKK3sKKwljaXBzb192NF9zb2NrX2RlbGF0dHIoc2spOworfQorCisvKioKICAqIG5ldGxibF9zb2NrX2dldGF0dHIgLSBEZXRlcm1pbmUgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb2YgYSBzb2NrCiAgKiBAc2s6IHRoZSBzb2NrCiAgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKQEAgLTUwMSw2ICs0OTAsMTI4IEBACiB9CiAKIC8qKgorICogbmV0bGJsX2Nvbm5fc2V0YXR0ciAtIExhYmVsIGEgY29ubmVjdGVkIHNvY2tldCB1c2luZyB0aGUgY29ycmVjdCBwcm90b2NvbAorICogQHNrOiB0aGUgc29ja2V0IHRvIGxhYmVsCisgKiBAYWRkcjogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogQXR0YWNoIHRoZSBjb3JyZWN0IGxhYmVsIHRvIHRoZSBnaXZlbiBjb25uZWN0ZWQgc29ja2V0IHVzaW5nIHRoZSBzZWN1cml0eQorICogYXR0cmlidXRlcyBzcGVjaWZpZWQgaW4gQHNlY2F0dHIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZworICogdGhhdCBAc2sgaXMgbG9ja2VkLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IG5ldGxibF9jb25uX3NldGF0dHIoc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJY29uc3Qgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlpbnQgcmV0X3ZhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0OworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICphZjRfZW50cnk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CisJCWFmNF9lbnRyeSA9IG5ldGxibF9kb21oc2hfZ2V0ZW50cnlfYWY0KHNlY2F0dHItPmRvbWFpbiwKKwkJCQkJCSAgICAgICBhZGRyNC0+c2luX2FkZHIuc19hZGRyKTsKKwkJaWYgKGFmNF9lbnRyeSA9PSBOVUxMKSB7CisJCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJCWdvdG8gY29ubl9zZXRhdHRyX3JldHVybjsKKwkJfQorCQlzd2l0Y2ggKGFmNF9lbnRyeS0+dHlwZSkgeworCQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKKwkJCXJldF92YWwgPSBjaXBzb192NF9zb2NrX3NldGF0dHIoc2ssCisJCQkJCQkgICBhZjRfZW50cnktPnR5cGVfZGVmLmNpcHNvdjQsCisJCQkJCQkgICBzZWNhdHRyKTsKKwkJCWJyZWFrOworCQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgorCQkJLyoganVzdCBkZWxldGUgdGhlIHByb3RvY29scyB3ZSBzdXBwb3J0IGZvciByaWdodCBub3cKKwkJCSAqIGJ1dCB3ZSBjb3VsZCByZW1vdmUgb3RoZXIgcHJvdG9jb2xzIGlmIG5lZWRlZCAqLworCQkJY2lwc29fdjRfc29ja19kZWxhdHRyKHNrKTsKKwkJCXJldF92YWwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJfQorCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQkvKiBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFueSBJUHY2IGxhYmVsaW5nIHByb3RvY29scyByaWdodAorCQkgKiBub3cgd2UgY2FuIG9wdGltaXplIGV2ZXJ5dGhpbmcgYXdheSB1bnRpbCB3ZSBkbyAqLworCQlyZXRfdmFsID0gMDsKKwkJYnJlYWs7CisjZW5kaWYgLyogSVB2NiAqLworCWRlZmF1bHQ6CisJCXJldF92YWwgPSAwOworCX0KKworY29ubl9zZXRhdHRyX3JldHVybjoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiBuZXRsYmxfc2tidWZmX3NldGF0dHIgLSBMYWJlbCBhIHBhY2tldCB1c2luZyB0aGUgY29ycmVjdCBwcm90b2NvbAorICogQHNrYjogdGhlIHBhY2tldAorICogQGZhbWlseTogcHJvdG9jb2wgZmFtaWx5CisgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEF0dGFjaCB0aGUgY29ycmVjdCBsYWJlbCB0byB0aGUgZ2l2ZW4gcGFja2V0IHVzaW5nIHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBzcGVjaWZpZWQgaW4gQHNlY2F0dHIuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX3NrYnVmZl9zZXRhdHRyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHUxNiBmYW1pbHksCisJCQkgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWw7CisJc3RydWN0IGlwaGRyICpoZHI0OworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICphZjRfZW50cnk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWhkcjQgPSBpcF9oZHIoc2tiKTsKKwkJYWY0X2VudHJ5ID0gbmV0bGJsX2RvbWhzaF9nZXRlbnRyeV9hZjQoc2VjYXR0ci0+ZG9tYWluLAorCQkJCQkJICAgICAgIGhkcjQtPmRhZGRyKTsKKwkJaWYgKGFmNF9lbnRyeSA9PSBOVUxMKSB7CisJCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJCWdvdG8gc2tidWZmX3NldGF0dHJfcmV0dXJuOworCQl9CisJCXN3aXRjaCAoYWY0X2VudHJ5LT50eXBlKSB7CisJCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgorCQkJcmV0X3ZhbCA9IGNpcHNvX3Y0X3NrYnVmZl9zZXRhdHRyKHNrYiwKKwkJCQkJCSAgIGFmNF9lbnRyeS0+dHlwZV9kZWYuY2lwc292NCwKKwkJCQkJCSAgIHNlY2F0dHIpOworCQkJYnJlYWs7CisJCWNhc2UgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ6CisJCQkvKiBqdXN0IGRlbGV0ZSB0aGUgcHJvdG9jb2xzIHdlIHN1cHBvcnQgZm9yIHJpZ2h0IG5vdworCQkJICogYnV0IHdlIGNvdWxkIHJlbW92ZSBvdGhlciBwcm90b2NvbHMgaWYgbmVlZGVkICovCisJCQlyZXRfdmFsID0gY2lwc29fdjRfc2tidWZmX2RlbGF0dHIoc2tiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0X3ZhbCA9IC1FTk9FTlQ7CisJCX0KKwkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJLyogc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhbnkgSVB2NiBsYWJlbGluZyBwcm90b2NvbHMgcmlnaHQKKwkJICogbm93IHdlIGNhbiBvcHRpbWl6ZSBldmVyeXRoaW5nIGF3YXkgdW50aWwgd2UgZG8gKi8KKwkJcmV0X3ZhbCA9IDA7CisJCWJyZWFrOworI2VuZGlmIC8qIElQdjYgKi8KKwlkZWZhdWx0OgorCQlyZXRfdmFsID0gMDsKKwl9CisKK3NrYnVmZl9zZXRhdHRyX3JldHVybjoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCiAgKiBuZXRsYmxfc2tidWZmX2dldGF0dHIgLSBEZXRlcm1pbmUgdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgb2YgYSBwYWNrZXQKICAqIEBza2I6IHRoZSBwYWNrZXQKICAqIEBmYW1pbHk6IHByb3RvY29sIGZhbWlseQpAQCAtNTI4LDYgKzYzOSw3IEBACiAgKiBuZXRsYmxfc2tidWZmX2VyciAtIEhhbmRsZSBhIExTTSBlcnJvciBvbiBhIHNrX2J1ZmYKICAqIEBza2I6IHRoZSBwYWNrZXQKICAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEBnYXRld2F5OiB0cnVlIGlmIGhvc3QgaXMgYWN0aW5nIGFzIGEgZ2F0ZXdheSwgZmFsc2Ugb3RoZXJ3aXNlCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBEZWFsIHdpdGggYSBMU00gcHJvYmxlbSB3aGVuIGhhbmRsaW5nIHRoZSBwYWNrZXQgaW4gQHNrYiwgdHlwaWNhbGx5IHRoaXMgaXMKQEAgLTUzNSwxMCArNjQ3LDEwIEBACiAgKiBhY2NvcmRpbmcgdG8gdGhlIHBhY2tldCdzIGxhYmVsaW5nIHByb3RvY29sLgogICoKICAqLwotdm9pZCBuZXRsYmxfc2tidWZmX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyb3IpCit2b2lkIG5ldGxibF9za2J1ZmZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnJvciwgaW50IGdhdGV3YXkpCiB7CiAJaWYgKENJUFNPX1Y0X09QVEVYSVNUKHNrYikpCi0JCWNpcHNvX3Y0X2Vycm9yKHNrYiwgZXJyb3IsIDApOworCQljaXBzb192NF9lcnJvcihza2IsIGVycm9yLCBnYXRld2F5KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuYwppbmRleCA0NGJlNWQ1Li5lZTc2OWVjIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqLwogCiAvKgotICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgorICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNiwgMjAwOAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTMyLDkgKzMyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSA8bmV0L2NpcHNvX2lwdjQuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC03MSw2ICs3NSwzMDEgQEAKIH07CiAKIC8qCisgKiBIZWxwZXIgRnVuY3Rpb25zCisgKi8KKworLyoqCisgKiBuZXRsYmxfbWdtdF9hZGQgLSBIYW5kbGUgYW4gQUREIG1lc3NhZ2UKKyAqIEBpbmZvOiB0aGUgR2VuZXJpYyBORVRMSU5LIGluZm8gYmxvY2sKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgQUREIGFuZCBBRERERUYgbWVzc2FnZXMgdG8gYWRkIHRoZSBkb21haW4gbWFwcGluZ3MKKyAqIGZyb20gdGhlIG1lc3NhZ2UgdG8gdGhlIGhhc2ggdGFibGUuICBTZWUgbmV0bGFiZWwuaCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqIG1lc3NhZ2UgZm9ybWF0LiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBuZXRsYmxfbWdtdF9hZGRfY29tbW9uKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCWludCByZXRfdmFsID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHJfbWFwICphZGRybWFwID0gTlVMTDsKKwlzdHJ1Y3QgY2lwc29fdjRfZG9pICpjaXBzb3Y0ID0gTlVMTDsKKwl1MzIgdG1wX3ZhbDsKKworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCWdvdG8gYWRkX2ZhaWx1cmU7CisJfQorCWVudHJ5LT50eXBlID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfUFJPVE9DT0xdKTsKKwlpZiAoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfRE9NQUlOXSkgeworCQlzaXplX3QgdG1wX3NpemUgPSBubGFfbGVuKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0RPTUFJTl0pOworCQllbnRyeS0+ZG9tYWluID0ga21hbGxvYyh0bXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlbnRyeS0+ZG9tYWluID09IE5VTEwpIHsKKwkJCXJldF92YWwgPSAtRU5PTUVNOworCQkJZ290byBhZGRfZmFpbHVyZTsKKwkJfQorCQlubGFfc3RybGNweShlbnRyeS0+ZG9tYWluLAorCQkJICAgIGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0RPTUFJTl0sIHRtcF9zaXplKTsKKwl9CisKKwkvKiBOT1RFOiBpbnRlcm5hbGx5IHdlIGFsbG93L3VzZSBhIGVudHJ5LT50eXBlIHZhbHVlIG9mCisJICogICAgICAgTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgYWxsb3cgdXNlcnMKKwkgKiAgICAgICB0byBwYXNzIHRoYXQgYXMgYSBwcm90b2NvbCB2YWx1ZSBiZWNhdXNlIHdlIG5lZWQgdG8ga25vdyB0aGUKKwkgKiAgICAgICAicmVhbCIgcHJvdG9jb2wgKi8KKworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgorCQlicmVhazsKKwljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKKwkJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9DVjRET0ldKQorCQkJZ290byBhZGRfZmFpbHVyZTsKKworCQl0bXBfdmFsID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfQ1Y0RE9JXSk7CisJCWNpcHNvdjQgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKHRtcF92YWwpOworCQlpZiAoY2lwc292NCA9PSBOVUxMKQorCQkJZ290byBhZGRfZmFpbHVyZTsKKwkJZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPSBjaXBzb3Y0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGFkZF9mYWlsdXJlOworCX0KKworCWlmIChpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY0QUREUl0pIHsKKwkJc3RydWN0IGluX2FkZHIgKmFkZHI7CisJCXN0cnVjdCBpbl9hZGRyICptYXNrOworCQlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqbWFwOworCisJCWFkZHJtYXAgPSBremFsbG9jKHNpemVvZigqYWRkcm1hcCksIEdGUF9LRVJORUwpOworCQlpZiAoYWRkcm1hcCA9PSBOVUxMKSB7CisJCQlyZXRfdmFsID0gLUVOT01FTTsKKwkJCWdvdG8gYWRkX2ZhaWx1cmU7CisJCX0KKwkJSU5JVF9MSVNUX0hFQUQoJmFkZHJtYXAtPmxpc3Q0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmFkZHJtYXAtPmxpc3Q2KTsKKworCQlpZiAobmxhX2xlbihpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY0QUREUl0pICE9CisJCSAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gYWRkX2ZhaWx1cmU7CisJCX0KKwkJaWYgKG5sYV9sZW4oaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNE1BU0tdKSAhPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisJCWFkZHIgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY0QUREUl0pOworCQltYXNrID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNE1BU0tdKTsKKworCQltYXAgPSBremFsbG9jKHNpemVvZigqbWFwKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChtYXAgPT0gTlVMTCkgeworCQkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisJCW1hcC0+bGlzdC5hZGRyID0gYWRkci0+c19hZGRyICYgbWFzay0+c19hZGRyOworCQltYXAtPmxpc3QubWFzayA9IG1hc2stPnNfYWRkcjsKKwkJbWFwLT5saXN0LnZhbGlkID0gMTsKKwkJbWFwLT50eXBlID0gZW50cnktPnR5cGU7CisJCWlmIChjaXBzb3Y0KQorCQkJbWFwLT50eXBlX2RlZi5jaXBzb3Y0ID0gY2lwc292NDsKKworCQlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZtYXAtPmxpc3QsICZhZGRybWFwLT5saXN0NCk7CisJCWlmIChyZXRfdmFsICE9IDApIHsKKwkJCWtmcmVlKG1hcCk7CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisKKwkJZW50cnktPnR5cGUgPSBORVRMQkxfTkxUWVBFX0FERFJTRUxFQ1Q7CisJCWVudHJ5LT50eXBlX2RlZi5hZGRyc2VsID0gYWRkcm1hcDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwl9IGVsc2UgaWYgKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0lQVjZBRERSXSkgeworCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI7CisJCXN0cnVjdCBpbjZfYWRkciAqbWFzazsKKwkJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDsKKworCQlhZGRybWFwID0ga3phbGxvYyhzaXplb2YoKmFkZHJtYXApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGFkZHJtYXAgPT0gTlVMTCkgeworCQkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0NCk7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0Nik7CisKKwkJaWYgKG5sYV9sZW4oaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNkFERFJdKSAhPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKKwkJCXJldF92YWwgPSAtRUlOVkFMOworCQkJZ290byBhZGRfZmFpbHVyZTsKKwkJfQorCQlpZiAobmxhX2xlbihpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2TUFTS10pICE9CisJCSAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgeworCQkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisJCWFkZHIgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2QUREUl0pOworCQltYXNrID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNk1BU0tdKTsKKworCQltYXAgPSBremFsbG9jKHNpemVvZigqbWFwKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChtYXAgPT0gTlVMTCkgeworCQkJcmV0X3ZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGFkZF9mYWlsdXJlOworCQl9CisJCWlwdjZfYWRkcl9jb3B5KCZtYXAtPmxpc3QuYWRkciwgYWRkcik7CisJCW1hcC0+bGlzdC5hZGRyLnM2X2FkZHIzMlswXSAmPSBtYXNrLT5zNl9hZGRyMzJbMF07CisJCW1hcC0+bGlzdC5hZGRyLnM2X2FkZHIzMlsxXSAmPSBtYXNrLT5zNl9hZGRyMzJbMV07CisJCW1hcC0+bGlzdC5hZGRyLnM2X2FkZHIzMlsyXSAmPSBtYXNrLT5zNl9hZGRyMzJbMl07CisJCW1hcC0+bGlzdC5hZGRyLnM2X2FkZHIzMlszXSAmPSBtYXNrLT5zNl9hZGRyMzJbM107CisJCWlwdjZfYWRkcl9jb3B5KCZtYXAtPmxpc3QubWFzaywgbWFzayk7CisJCW1hcC0+bGlzdC52YWxpZCA9IDE7CisJCW1hcC0+dHlwZSA9IGVudHJ5LT50eXBlOworCisJCXJldF92YWwgPSBuZXRsYmxfYWY2bGlzdF9hZGQoJm1hcC0+bGlzdCwgJmFkZHJtYXAtPmxpc3Q2KTsKKwkJaWYgKHJldF92YWwgIT0gMCkgeworCQkJa2ZyZWUobWFwKTsKKwkJCWdvdG8gYWRkX2ZhaWx1cmU7CisJCX0KKworCQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVDsKKwkJZW50cnktPnR5cGVfZGVmLmFkZHJzZWwgPSBhZGRybWFwOworI2VuZGlmIC8qIElQdjYgKi8KKwl9CisKKwlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF9hZGQoZW50cnksIGF1ZGl0X2luZm8pOworCWlmIChyZXRfdmFsICE9IDApCisJCWdvdG8gYWRkX2ZhaWx1cmU7CisKKwlyZXR1cm4gMDsKKworYWRkX2ZhaWx1cmU6CisJaWYgKGNpcHNvdjQpCisJCWNpcHNvX3Y0X2RvaV9wdXRkZWYoY2lwc292NCk7CisJaWYgKGVudHJ5KQorCQlrZnJlZShlbnRyeS0+ZG9tYWluKTsKKwlrZnJlZShhZGRybWFwKTsKKwlrZnJlZShlbnRyeSk7CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogbmV0bGJsX21nbXRfbGlzdGVudHJ5IC0gTGlzdCBhIE5ldExhYmVsL0xTTSBkb21haW4gbWFwIGVudHJ5CisgKiBAc2tiOiB0aGUgTkVUTElOSyBidWZmZXIKKyAqIEBlbnRyeTogdGhlIG1hcCBlbnRyeQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBMSVNUQUxMIGFuZCBMSVNUREVGIGNvbW1hbmQKKyAqIGhhbmRsZXJzLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJpbGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIFJDVSByZWFkIGxvY2sKKyAqIGlzIGhlbGQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitzdGF0aWMgaW50IG5ldGxibF9tZ210X2xpc3RlbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5KQoreworCWludCByZXRfdmFsOworCXN0cnVjdCBubGF0dHIgKm5sYV9hOworCXN0cnVjdCBubGF0dHIgKm5sYV9iOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKKyNlbmRpZgorCisJaWYgKGVudHJ5LT5kb21haW4gIT0gTlVMTCkgeworCQlyZXRfdmFsID0gbmxhX3B1dF9zdHJpbmcoc2tiLAorCQkJCQkgTkxCTF9NR01UX0FfRE9NQUlOLCBlbnRyeS0+ZG9tYWluKTsKKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KKworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVDoKKwkJbmxhX2EgPSBubGFfbmVzdF9zdGFydChza2IsIE5MQkxfTUdNVF9BX1NFTEVDVE9STElTVCk7CisJCWlmIChubGFfYSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsCisJCQkJCSAgICZlbnRyeS0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDQpIHsKKwkJCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICptYXA0OworCQkJc3RydWN0IGluX2FkZHIgYWRkcl9zdHJ1Y3Q7CisKKwkJCW5sYV9iID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBOTEJMX01HTVRfQV9BRERSU0VMRUNUT1IpOworCQkJaWYgKG5sYV9iID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWFkZHJfc3RydWN0LnNfYWRkciA9IGl0ZXI0LT5hZGRyOworCQkJcmV0X3ZhbCA9IG5sYV9wdXQoc2tiLCBOTEJMX01HTVRfQV9JUFY0QUREUiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAorCQkJCQkgICZhZGRyX3N0cnVjdCk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJYWRkcl9zdHJ1Y3Quc19hZGRyID0gaXRlcjQtPm1hc2s7CisJCQlyZXRfdmFsID0gbmxhX3B1dChza2IsIE5MQkxfTUdNVF9BX0lQVjRNQVNLLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCisJCQkJCSAgJmFkZHJfc3RydWN0KTsKKwkJCWlmIChyZXRfdmFsICE9IDApCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQltYXA0ID0gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShpdGVyNCk7CisJCQlyZXRfdmFsID0gbmxhX3B1dF91MzIoc2tiLCBOTEJMX01HTVRfQV9QUk9UT0NPTCwKKwkJCQkJICAgICAgbWFwNC0+dHlwZSk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJc3dpdGNoIChtYXA0LT50eXBlKSB7CisJCQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKKwkJCQlyZXRfdmFsID0gbmxhX3B1dF91MzIoc2tiLCBOTEJMX01HTVRfQV9DVjRET0ksCisJCQkJCQkgIG1hcDQtPnR5cGVfZGVmLmNpcHNvdjQtPmRvaSk7CisJCQkJaWYgKHJldF92YWwgIT0gMCkKKwkJCQkJcmV0dXJuIHJldF92YWw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5sYV9uZXN0X2VuZChza2IsIG5sYV9iKTsKKwkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwKKwkJCQkJICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikgeworCQkJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDY7CisKKwkJCW5sYV9iID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBOTEJMX01HTVRfQV9BRERSU0VMRUNUT1IpOworCQkJaWYgKG5sYV9iID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCXJldF92YWwgPSBubGFfcHV0KHNrYiwgTkxCTF9NR01UX0FfSVBWNkFERFIsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCisJCQkJCSAgJml0ZXI2LT5hZGRyKTsKKwkJCWlmIChyZXRfdmFsICE9IDApCisJCQkJcmV0dXJuIHJldF92YWw7CisJCQlyZXRfdmFsID0gbmxhX3B1dChza2IsIE5MQkxfTUdNVF9BX0lQVjZNQVNLLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorCQkJCQkgICZpdGVyNi0+bWFzayk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCXJldHVybiByZXRfdmFsOworCQkJbWFwNiA9IG5ldGxibF9kb21oc2hfYWRkcjZfZW50cnkoaXRlcjYpOworCQkJcmV0X3ZhbCA9IG5sYV9wdXRfdTMyKHNrYiwgTkxCTF9NR01UX0FfUFJPVE9DT0wsCisJCQkJCSAgICAgIG1hcDYtPnR5cGUpOworCQkJaWYgKHJldF92YWwgIT0gMCkKKwkJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQkJbmxhX25lc3RfZW5kKHNrYiwgbmxhX2IpOworCQl9CisjZW5kaWYgLyogSVB2NiAqLworCisJCW5sYV9uZXN0X2VuZChza2IsIG5sYV9hKTsKKwkJYnJlYWs7CisJY2FzZSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDoKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfdTMyKHNrYiwgTkxCTF9NR01UX0FfUFJPVE9DT0wsIGVudHJ5LT50eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6CisJCXJldF92YWwgPSBubGFfcHV0X3UzMihza2IsIE5MQkxfTUdNVF9BX1BST1RPQ09MLCBlbnRyeS0+dHlwZSk7CisJCWlmIChyZXRfdmFsICE9IDApCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfdTMyKHNrYiwgTkxCTF9NR01UX0FfQ1Y0RE9JLAorCQkJCSAgICAgIGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0LT5kb2kpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoKICAqIE5ldExhYmVsIENvbW1hbmQgSGFuZGxlcnMKICAqLwogCkBAIC04Nyw2NyArMzg2LDIzIEBACiAgKi8KIHN0YXRpYyBpbnQgbmV0bGJsX21nbXRfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0JaW50IHJldF92YWwgPSAtRUlOVkFMOwotCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnkgPSBOVUxMOwotCXNpemVfdCB0bXBfc2l6ZTsKLQl1MzIgdG1wX3ZhbDsKIAlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CiAKLQlpZiAoIWluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0RPTUFJTl0gfHwKLQkgICAgIWluZm8tPmF0dHJzW05MQkxfTUdNVF9BX1BST1RPQ09MXSkKLQkJZ290byBhZGRfZmFpbHVyZTsKKwlpZiAoKCFpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9ET01BSU5dKSB8fAorCSAgICAoIWluZm8tPmF0dHJzW05MQkxfTUdNVF9BX1BST1RPQ09MXSkgfHwKKwkgICAgKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0lQVjRBRERSXSAmJgorCSAgICAgaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNkFERFJdKSB8fAorCSAgICAoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNE1BU0tdICYmCisJICAgICBpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2TUFTS10pIHx8CisJICAgICgoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNEFERFJdICE9IE5VTEwpIF4KKwkgICAgIChpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY0TUFTS10gIT0gTlVMTCkpIHx8CisJICAgICgoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNkFERFJdICE9IE5VTEwpIF4KKwkgICAgIChpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2TUFTS10gIT0gTlVMTCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5ldGxibF9uZXRsaW5rX2F1ZGl0aW5mbyhza2IsICZhdWRpdF9pbmZvKTsKIAotCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJcmV0X3ZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gYWRkX2ZhaWx1cmU7Ci0JfQotCXRtcF9zaXplID0gbmxhX2xlbihpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9ET01BSU5dKTsKLQllbnRyeS0+ZG9tYWluID0ga21hbGxvYyh0bXBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkgewotCQlyZXRfdmFsID0gLUVOT01FTTsKLQkJZ290byBhZGRfZmFpbHVyZTsKLQl9Ci0JZW50cnktPnR5cGUgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9QUk9UT0NPTF0pOwotCW5sYV9zdHJsY3B5KGVudHJ5LT5kb21haW4sIGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0RPTUFJTl0sIHRtcF9zaXplKTsKLQotCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKLQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgotCQlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF9hZGQoZW50cnksICZhdWRpdF9pbmZvKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6Ci0JCWlmICghaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfQ1Y0RE9JXSkKLQkJCWdvdG8gYWRkX2ZhaWx1cmU7Ci0KLQkJdG1wX3ZhbCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0NWNERPSV0pOwotCQkvKiBXZSBzaG91bGQgYmUgaG9sZGluZyBhIHJjdV9yZWFkX2xvY2soKSBoZXJlIHdoaWxlIHdlIGhvbGQKLQkJICogdGhlIHJlc3VsdCBidXQgc2luY2UgdGhlIGVudHJ5IHdpbGwgYWx3YXlzIGJlIGRlbGV0ZWQgd2hlbgotCQkgKiB0aGUgQ0lQU08gRE9JIGlzIGRlbGV0ZWQgd2UgYXJlbid0IGdvaW5nIHRvIGtlZXAgdGhlCi0JCSAqIGxvY2suICovCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKHRtcF92YWwpOwotCQlpZiAoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPT0gTlVMTCkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlnb3RvIGFkZF9mYWlsdXJlOwotCQl9Ci0JCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX2FkZChlbnRyeSwgJmF1ZGl0X2luZm8pOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBhZGRfZmFpbHVyZTsKLQl9Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBhZGRfZmFpbHVyZTsKLQotCXJldHVybiAwOwotCi1hZGRfZmFpbHVyZToKLQlpZiAoZW50cnkpCi0JCWtmcmVlKGVudHJ5LT5kb21haW4pOwotCWtmcmVlKGVudHJ5KTsKLQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gbmV0bGJsX21nbXRfYWRkX2NvbW1vbihpbmZvLCAmYXVkaXRfaW5mbyk7CiB9CiAKIC8qKgpAQCAtMTk4LDIzICs0NTMsOSBAQAogCWlmIChkYXRhID09IE5VTEwpCiAJCWdvdG8gbGlzdGFsbF9jYl9mYWlsdXJlOwogCi0JcmV0X3ZhbCA9IG5sYV9wdXRfc3RyaW5nKGNiX2FyZy0+c2tiLAotCQkJCSBOTEJMX01HTVRfQV9ET01BSU4sCi0JCQkJIGVudHJ5LT5kb21haW4pOworCXJldF92YWwgPSBuZXRsYmxfbWdtdF9saXN0ZW50cnkoY2JfYXJnLT5za2IsIGVudHJ5KTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RhbGxfY2JfZmFpbHVyZTsKLQlyZXRfdmFsID0gbmxhX3B1dF91MzIoY2JfYXJnLT5za2IsIE5MQkxfTUdNVF9BX1BST1RPQ09MLCBlbnRyeS0+dHlwZSk7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBsaXN0YWxsX2NiX2ZhaWx1cmU7Ci0Jc3dpdGNoIChlbnRyeS0+dHlwZSkgewotCWNhc2UgTkVUTEJMX05MVFlQRV9DSVBTT1Y0OgotCQlyZXRfdmFsID0gbmxhX3B1dF91MzIoY2JfYXJnLT5za2IsCi0JCQkJICAgICAgTkxCTF9NR01UX0FfQ1Y0RE9JLAotCQkJCSAgICAgIGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0LT5kb2kpOwotCQlpZiAocmV0X3ZhbCAhPSAwKQotCQkJZ290byBsaXN0YWxsX2NiX2ZhaWx1cmU7Ci0JCWJyZWFrOwotCX0KIAogCWNiX2FyZy0+c2VxKys7CiAJcmV0dXJuIGdlbmxtc2dfZW5kKGNiX2FyZy0+c2tiLCBkYXRhKTsKQEAgLTI2OCw1NiArNTA5LDIyIEBACiAgKi8KIHN0YXRpYyBpbnQgbmV0bGJsX21nbXRfYWRkZGVmKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0JaW50IHJldF92YWwgPSAtRUlOVkFMOwotCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnkgPSBOVUxMOwotCXUzMiB0bXBfdmFsOwogCXN0cnVjdCBuZXRsYmxfYXVkaXQgYXVkaXRfaW5mbzsKIAotCWlmICghaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfUFJPVE9DT0xdKQotCQlnb3RvIGFkZGRlZl9mYWlsdXJlOworCWlmICgoIWluZm8tPmF0dHJzW05MQkxfTUdNVF9BX1BST1RPQ09MXSkgfHwKKwkgICAgKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0lQVjRBRERSXSAmJgorCSAgICAgaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNkFERFJdKSB8fAorCSAgICAoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNE1BU0tdICYmCisJICAgICBpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2TUFTS10pIHx8CisJICAgICgoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNEFERFJdICE9IE5VTEwpIF4KKwkgICAgIChpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY0TUFTS10gIT0gTlVMTCkpIHx8CisJICAgICgoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfSVBWNkFERFJdICE9IE5VTEwpIF4KKwkgICAgIChpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9JUFY2TUFTS10gIT0gTlVMTCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5ldGxibF9uZXRsaW5rX2F1ZGl0aW5mbyhza2IsICZhdWRpdF9pbmZvKTsKIAotCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJcmV0X3ZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gYWRkZGVmX2ZhaWx1cmU7Ci0JfQotCWVudHJ5LT50eXBlID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfUFJPVE9DT0xdKTsKLQotCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKLQljYXNlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOgotCQlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF9hZGRfZGVmYXVsdChlbnRyeSwgJmF1ZGl0X2luZm8pOwotCQlicmVhazsKLQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKLQkJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX01HTVRfQV9DVjRET0ldKQotCQkJZ290byBhZGRkZWZfZmFpbHVyZTsKLQotCQl0bXBfdmFsID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9NR01UX0FfQ1Y0RE9JXSk7Ci0JCS8qIFdlIHNob3VsZCBiZSBob2xkaW5nIGEgcmN1X3JlYWRfbG9jaygpIGhlcmUgd2hpbGUgd2UgaG9sZAotCQkgKiB0aGUgcmVzdWx0IGJ1dCBzaW5jZSB0aGUgZW50cnkgd2lsbCBhbHdheXMgYmUgZGVsZXRlZCB3aGVuCi0JCSAqIHRoZSBDSVBTTyBET0kgaXMgZGVsZXRlZCB3ZSBhcmVuJ3QgZ29pbmcgdG8ga2VlcCB0aGUKLQkJICogbG9jay4gKi8KLQkJcmN1X3JlYWRfbG9jaygpOwotCQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYodG1wX3ZhbCk7Ci0JCWlmIChlbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9PSBOVUxMKSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCWdvdG8gYWRkZGVmX2ZhaWx1cmU7Ci0JCX0KLQkJcmV0X3ZhbCA9IG5ldGxibF9kb21oc2hfYWRkX2RlZmF1bHQoZW50cnksICZhdWRpdF9pbmZvKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gYWRkZGVmX2ZhaWx1cmU7Ci0JfQotCWlmIChyZXRfdmFsICE9IDApCi0JCWdvdG8gYWRkZGVmX2ZhaWx1cmU7Ci0KLQlyZXR1cm4gMDsKLQotYWRkZGVmX2ZhaWx1cmU6Ci0Ja2ZyZWUoZW50cnkpOwotCXJldHVybiByZXRfdmFsOworCXJldHVybiBuZXRsYmxfbWdtdF9hZGRfY29tbW9uKGluZm8sICZhdWRpdF9pbmZvKTsKIH0KIAogLyoqCkBAIC0zNzEsMTkgKzU3OCwxMCBAQAogCQlyZXRfdmFsID0gLUVOT0VOVDsKIAkJZ290byBsaXN0ZGVmX2ZhaWx1cmVfbG9jazsKIAl9Ci0JcmV0X3ZhbCA9IG5sYV9wdXRfdTMyKGFuc19za2IsIE5MQkxfTUdNVF9BX1BST1RPQ09MLCBlbnRyeS0+dHlwZSk7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBsaXN0ZGVmX2ZhaWx1cmVfbG9jazsKLQlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0JY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6Ci0JCXJldF92YWwgPSBubGFfcHV0X3UzMihhbnNfc2tiLAotCQkJCSAgICAgIE5MQkxfTUdNVF9BX0NWNERPSSwKLQkJCQkgICAgICBlbnRyeS0+dHlwZV9kZWYuY2lwc292NC0+ZG9pKTsKLQkJaWYgKHJldF92YWwgIT0gMCkKLQkJCWdvdG8gbGlzdGRlZl9mYWlsdXJlX2xvY2s7Ci0JCWJyZWFrOwotCX0KKwlyZXRfdmFsID0gbmV0bGJsX21nbXRfbGlzdGVudHJ5KGFuc19za2IsIGVudHJ5KTsKIAlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAocmV0X3ZhbCAhPSAwKQorCQlnb3RvIGxpc3RkZWZfZmFpbHVyZTsKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCXJldHVybiBnZW5sbXNnX3JlcGx5KGFuc19za2IsIGluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuaCBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmgKaW5kZXggYTQzYmZmMS4uMDVkOTY0MyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5oCkBAIC00NSw2ICs0NSwxNiBAQAogICogICAgIE5MQkxfTUdNVF9BX0RPTUFJTgogICogICAgIE5MQkxfTUdNVF9BX1BST1RPQ09MCiAgKgorICogICBJZiBJUHY0IGlzIHNwZWNpZmllZCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkOgorICoKKyAqICAgICBOTEJMX01HTVRfQV9JUFY0QUREUgorICogICAgIE5MQkxfTUdNVF9BX0lQVjRNQVNLCisgKgorICogICBJZiBJUHY2IGlzIHNwZWNpZmllZCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkOgorICoKKyAqICAgICBOTEJMX01HTVRfQV9JUFY2QUREUgorICogICAgIE5MQkxfTUdNVF9BX0lQVjZNQVNLCisgKgogICogICBJZiB1c2luZyBORVRMQkxfTkxUWVBFX0NJUFNPVjQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZDoKICAqCiAgKiAgICAgTkxCTF9NR01UX0FfQ1Y0RE9JCkBAIC02OCwxMyArNzgsMjQgQEAKICAqICAgUmVxdWlyZWQgYXR0cmlidXRlczoKICAqCiAgKiAgICAgTkxCTF9NR01UX0FfRE9NQUlOCisgKgorICogICBJZiB0aGUgSVAgYWRkcmVzcyBzZWxlY3RvcnMgYXJlIG5vdCB1c2VkIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIGlzCisgKiAgIHJlcXVpcmVkOgorICoKICAqICAgICBOTEJMX01HTVRfQV9QUk9UT0NPTAogICoKLSAqICAgSWYgdXNpbmcgTkVUTEJMX05MVFlQRV9DSVBTT1Y0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQ6CisgKiAgIElmIHRoZSBJUCBhZGRyZXNzIHNlbGVjdG9ycyBhcmUgdXNlZCB0aGVuIHRoZSBmb2xsb3dpbmcgYXR0cml0YnV0ZSBpcworICogICByZXF1aXJlZDoKKyAqCisgKiAgICAgTkxCTF9NR01UX0FfU0VMRUNUT1JMSVNUCisgKgorICogICBJZiB0aGUgbWFwcGluZyBpcyB1c2luZyB0aGUgTkVUTEJMX05MVFlQRV9DSVBTT1Y0IHR5cGUgdGhlbiB0aGUgZm9sbG93aW5nCisgKiAgIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkOgogICoKICAqICAgICBOTEJMX01HTVRfQV9DVjRET0kKICAqCi0gKiAgIElmIHVzaW5nIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEIG5vIG90aGVyIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLgorICogICBJZiB0aGUgbWFwcGluZyBpcyB1c2luZyB0aGUgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQgdHlwZSBubyBvdGhlcgorICogICBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZC4KICAqCiAgKiBvIEFERERFRjoKICAqICAgU2VudCBieSBhbiBhcHBsaWNhdGlvbiB0byBzZXQgdGhlIGRlZmF1bHQgZG9tYWluIG1hcHBpbmcgZm9yIHRoZSBOZXRMYWJlbApAQCAtMTAwLDE1ICsxMjEsMjMgQEAKICAqICAgYXBwbGljYXRpb24gdGhlcmUgaXMgbm8gcGF5bG9hZC4gIE9uIHN1Y2Nlc3MgdGhlIGtlcm5lbCBzaG91bGQgc2VuZCBhCiAgKiAgIHJlc3BvbnNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgogICoKLSAqICAgUmVxdWlyZWQgYXR0cmlidXRlczoKKyAqICAgSWYgdGhlIElQIGFkZHJlc3Mgc2VsZWN0b3JzIGFyZSBub3QgdXNlZCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSBpcworICogICByZXF1aXJlZDoKICAqCiAgKiAgICAgTkxCTF9NR01UX0FfUFJPVE9DT0wKICAqCi0gKiAgIElmIHVzaW5nIE5FVExCTF9OTFRZUEVfQ0lQU09WNCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkOgorICogICBJZiB0aGUgSVAgYWRkcmVzcyBzZWxlY3RvcnMgYXJlIHVzZWQgdGhlbiB0aGUgZm9sbG93aW5nIGF0dHJpdGJ1dGUgaXMKKyAqICAgcmVxdWlyZWQ6CisgKgorICogICAgIE5MQkxfTUdNVF9BX1NFTEVDVE9STElTVAorICoKKyAqICAgSWYgdGhlIG1hcHBpbmcgaXMgdXNpbmcgdGhlIE5FVExCTF9OTFRZUEVfQ0lQU09WNCB0eXBlIHRoZW4gdGhlIGZvbGxvd2luZworICogICBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZDoKICAqCiAgKiAgICAgTkxCTF9NR01UX0FfQ1Y0RE9JCiAgKgotICogICBJZiB1c2luZyBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRCBubyBvdGhlciBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZC4KKyAqICAgSWYgdGhlIG1hcHBpbmcgaXMgdXNpbmcgdGhlIE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEIHR5cGUgbm8gb3RoZXIKKyAqICAgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQuCiAgKgogICogbyBQUk9UT0NPTFM6CiAgKiAgIFNlbnQgYnkgYW4gYXBwbGljYXRpb24gdG8gcmVxdWVzdCBhIGxpc3Qgb2YgY29uZmlndXJlZCBOZXRMYWJlbCBwcm90b2NvbHMKQEAgLTE2Miw2ICsxOTEsMjYgQEAKIAlOTEJMX01HTVRfQV9DVjRET0ksCiAJLyogKE5MQV9VMzIpCiAJICogdGhlIENJUFNPdjQgRE9JIHZhbHVlICovCisJTkxCTF9NR01UX0FfSVBWNkFERFIsCisJLyogKE5MQV9CSU5BUlksIHN0cnVjdCBpbjZfYWRkcikKKwkgKiBhbiBJUHY2IGFkZHJlc3MgKi8KKwlOTEJMX01HTVRfQV9JUFY2TUFTSywKKwkvKiAoTkxBX0JJTkFSWSwgc3RydWN0IGluNl9hZGRyKQorCSAqIGFuIElQdjYgYWRkcmVzcyBtYXNrICovCisJTkxCTF9NR01UX0FfSVBWNEFERFIsCisJLyogKE5MQV9CSU5BUlksIHN0cnVjdCBpbl9hZGRyKQorCSAqIGFuIElQdjQgYWRkcmVzcyAqLworCU5MQkxfTUdNVF9BX0lQVjRNQVNLLAorCS8qIChOTEFfQklOQVJZLCBzdHJ1Y3QgaW5fYWRkcikKKwkgKiBhbmQgSVB2NCBhZGRyZXNzIG1hc2sgKi8KKwlOTEJMX01HTVRfQV9BRERSU0VMRUNUT1IsCisJLyogKE5MQV9ORVNURUQpCisJICogYW4gSVAgYWRkcmVzcyBzZWxlY3RvciwgbXVzdCBjb250YWluIGFuIGFkZHJlc3MsIG1hc2ssIGFuZCBwcm90b2NvbAorCSAqIGF0dHJpYnV0ZSBwbHVzIGFueSBwcm90b2NvbCBzcGVjaWZpYyBhdHRyaWJ1dGVzICovCisJTkxCTF9NR01UX0FfU0VMRUNUT1JMSVNULAorCS8qIChOTEFfTkVTVEVEKQorCSAqIHRoZSBzZWxlY3RvciBsaXN0LCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZQorCSAqIE5MQkxfTUdNVF9BX0FERFJTRUxFQ1RPUiBhdHRyaWJ1dGUgKi8KIAlfX05MQkxfTUdNVF9BX01BWCwKIH07CiAjZGVmaW5lIE5MQkxfTUdNVF9BX01BWCAoX19OTEJMX01HTVRfQV9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCmluZGV4IDkyMWMxMTguLmU4YTVjMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqLwogCiAvKgotICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNiAtIDIwMDcKKyAqIChjKSBDb3B5cmlnaHQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4sIDIwMDYgLSAyMDA4CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKKyNpbmNsdWRlICJuZXRsYWJlbF9hZGRybGlzdC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX2RvbWFpbmhhc2guaCIKICNpbmNsdWRlICJuZXRsYWJlbF91bmxhYmVsZWQuaCIKICNpbmNsdWRlICJuZXRsYWJlbF9tZ210LmgiCkBAIC03NiwyMiArNzcsMjAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0Ymw7CiAJdTMyIHNpemU7CiB9OworI2RlZmluZSBuZXRsYmxfdW5saHNoX2FkZHI0X2VudHJ5KGl0ZXIpIFwKKwljb250YWluZXJfb2YoaXRlciwgc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjQsIGxpc3QpCiBzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCB7Ci0JX19iZTMyIGFkZHI7Ci0JX19iZTMyIG1hc2s7CiAJdTMyIHNlY2lkOwogCi0JdTMyIHZhbGlkOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKKyNkZWZpbmUgbmV0bGJsX3VubGhzaF9hZGRyNl9lbnRyeShpdGVyKSBcCisJY29udGFpbmVyX29mKGl0ZXIsIHN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI2LCBsaXN0KQogc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjYgewotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwotCXN0cnVjdCBpbjZfYWRkciBtYXNrOwogCXUzMiBzZWNpZDsKIAotCXUzMiB2YWxpZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5ldGxibF9hZjZsaXN0IGxpc3Q7CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiBzdHJ1Y3QgbmV0bGJsX3VubGhzaF9pZmFjZSB7CkBAIC0xNDcsNzYgKzE0Niw2IEBACiB9OwogCiAvKgotICogQXVkaXQgSGVscGVyIEZ1bmN0aW9ucwotICovCi0KLS8qKgotICogbmV0bGJsX3VubGFiZWxfYXVkaXRfYWRkcjQgLSBBdWRpdCBhbiBJUHY0IGFkZHJlc3MKLSAqIEBhdWRpdF9idWY6IGF1ZGl0IGJ1ZmZlcgotICogQGRldjogbmV0d29yayBpbnRlcmZhY2UKLSAqIEBhZGRyOiBJUCBhZGRyZXNzCi0gKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBXcml0ZSB0aGUgSVB2NCBhZGRyZXNzIGFuZCBhZGRyZXNzIG1hc2ssIGlmIG5lY2Vzc2FyeSwgdG8gQGF1ZGl0X2J1Zi4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIG5ldGxibF91bmxhYmVsX2F1ZGl0X2FkZHI0KHN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmRldiwKLQkJCQkgICAgIF9fYmUzMiBhZGRyLCBfX2JlMzIgbWFzaykKLXsKLQl1MzIgbWFza192YWwgPSBudG9obChtYXNrKTsKLQotCWlmIChkZXYgIT0gTlVMTCkKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgbmV0aWY9JXMiLCBkZXYpOwotCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIHNyYz0iIE5JUFFVQURfRk1ULCBOSVBRVUFEKGFkZHIpKTsKLQlpZiAobWFza192YWwgIT0gMHhmZmZmZmZmZikgewotCQl1MzIgbWFza19sZW4gPSAwOwotCQl3aGlsZSAobWFza192YWwgPiAwKSB7Ci0JCQltYXNrX3ZhbCA8PD0gMTsKLQkJCW1hc2tfbGVuKys7Ci0JCX0KLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgc3JjX3ByZWZpeGxlbj0lZCIsIG1hc2tfbGVuKTsKLQl9Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKLS8qKgotICogbmV0bGJsX3VubGFiZWxfYXVkaXRfYWRkcjYgLSBBdWRpdCBhbiBJUHY2IGFkZHJlc3MKLSAqIEBhdWRpdF9idWY6IGF1ZGl0IGJ1ZmZlcgotICogQGRldjogbmV0d29yayBpbnRlcmZhY2UKLSAqIEBhZGRyOiBJUCBhZGRyZXNzCi0gKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBXcml0ZSB0aGUgSVB2NiBhZGRyZXNzIGFuZCBhZGRyZXNzIG1hc2ssIGlmIG5lY2Vzc2FyeSwgdG8gQGF1ZGl0X2J1Zi4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIG5ldGxibF91bmxhYmVsX2F1ZGl0X2FkZHI2KHN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmRldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbWFzaykKLXsKLQlpZiAoZGV2ICE9IE5VTEwpCi0JCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIG5ldGlmPSVzIiwgZGV2KTsKLQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBzcmM9IiBOSVA2X0ZNVCwgTklQNigqYWRkcikpOwotCWlmIChudG9obChtYXNrLT5zNl9hZGRyMzJbM10pICE9IDB4ZmZmZmZmZmYpIHsKLQkJdTMyIG1hc2tfbGVuID0gMDsKLQkJdTMyIG1hc2tfdmFsOwotCQlpbnQgaXRlciA9IC0xOwotCQl3aGlsZSAobnRvaGwobWFzay0+czZfYWRkcjMyWysraXRlcl0pID09IDB4ZmZmZmZmZmYpCi0JCQltYXNrX2xlbiArPSAzMjsKLQkJbWFza192YWwgPSBudG9obChtYXNrLT5zNl9hZGRyMzJbaXRlcl0pOwotCQl3aGlsZSAobWFza192YWwgPiAwKSB7Ci0JCQltYXNrX3ZhbCA8PD0gMTsKLQkJCW1hc2tfbGVuKys7Ci0JCX0KLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgc3JjX3ByZWZpeGxlbj0lZCIsIG1hc2tfbGVuKTsKLQl9Ci19Ci0jZW5kaWYgLyogSVB2NiAqLwotCi0vKgogICogVW5sYWJlbGVkIENvbm5lY3Rpb24gSGFzaCBUYWJsZSBGdW5jdGlvbnMKICAqLwogCkBAIC0yNzQsMjYgKzIwMywyOCBAQAogc3RhdGljIHZvaWQgbmV0bGJsX3VubGhzaF9mcmVlX2lmYWNlKHN0cnVjdCByY3VfaGVhZCAqZW50cnkpCiB7CiAJc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlOwotCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI0ICppdGVyNDsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCAqdG1wNDsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiAqaXRlcjY7Ci0Jc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjYgKnRtcDY7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICppdGVyNDsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKnRtcDQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKnRtcDY7CisjZW5kaWYgLyogSVB2NiAqLwogCiAJaWZhY2UgPSBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBuZXRsYmxfdW5saHNoX2lmYWNlLCByY3UpOwogCiAJLyogbm8gbmVlZCBmb3IgbG9ja3MgaGVyZSBzaW5jZSB3ZSBhcmUgdGhlIG9ubHkgb25lIHdpdGggYWNjZXNzIHRvIHRoaXMKIAkgKiBzdHJ1Y3R1cmUgKi8KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyNCwgdG1wNCwgJmlmYWNlLT5hZGRyNF9saXN0LCBsaXN0KQotCQlpZiAoaXRlcjQtPnZhbGlkKSB7Ci0JCQlsaXN0X2RlbF9yY3UoJml0ZXI0LT5saXN0KTsKLQkJCWtmcmVlKGl0ZXI0KTsKLQkJfQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyNiwgdG1wNiwgJmlmYWNlLT5hZGRyNl9saXN0LCBsaXN0KQotCQlpZiAoaXRlcjYtPnZhbGlkKSB7Ci0JCQlsaXN0X2RlbF9yY3UoJml0ZXI2LT5saXN0KTsKLQkJCWtmcmVlKGl0ZXI2KTsKLQkJfQorCW5ldGxibF9hZjRsaXN0X2ZvcmVhY2hfc2FmZShpdGVyNCwgdG1wNCwgJmlmYWNlLT5hZGRyNF9saXN0KSB7CisJCW5ldGxibF9hZjRsaXN0X3JlbW92ZV9lbnRyeShpdGVyNCk7CisJCWtmcmVlKG5ldGxibF91bmxoc2hfYWRkcjRfZW50cnkoaXRlcjQpKTsKKwl9CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJbmV0bGJsX2FmNmxpc3RfZm9yZWFjaF9zYWZlKGl0ZXI2LCB0bXA2LCAmaWZhY2UtPmFkZHI2X2xpc3QpIHsKKwkJbmV0bGJsX2FmNmxpc3RfcmVtb3ZlX2VudHJ5KGl0ZXI2KTsKKwkJa2ZyZWUobmV0bGJsX3VubGhzaF9hZGRyNl9lbnRyeShpdGVyNikpOworCX0KKyNlbmRpZiAvKiBJUHY2ICovCiAJa2ZyZWUoaWZhY2UpOwogfQogCkBAIC0zMTYsNTkgKzI0Nyw2IEBACiB9CiAKIC8qKgotICogbmV0bGJsX3VubGhzaF9zZWFyY2hfYWRkcjQgLSBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgSVB2NCBhZGRyZXNzIGVudHJ5Ci0gKiBAYWRkcjogSVB2NCBhZGRyZXNzCi0gKiBAaWZhY2U6IHRoZSBuZXR3b3JrIGludGVyZmFjZSBlbnRyeQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2VhcmNoZXMgdGhlIElQdjQgYWRkcmVzcyBsaXN0IG9mIHRoZSBuZXR3b3JrIGludGVyZmFjZSBzcGVjaWZpZWQgYnkgQGlmYWNlLgotICogSWYgYSBtYXRjaGluZyBhZGRyZXNzIGVudHJ5IGlzIGZvdW5kIGl0IGlzIHJldHVybmVkLCBvdGhlcndpc2UgTlVMTCBpcwotICogcmV0dXJuZWQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSByY3VfcmVhZF9bdW5dbG9jaygpCi0gKiBmdW5jdGlvbnMuCi0gKgotICovCi1zdGF0aWMgc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjQgKm5ldGxibF91bmxoc2hfc2VhcmNoX2FkZHI0KAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2JlMzIgYWRkciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlKQotewotCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI0ICppdGVyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgJmlmYWNlLT5hZGRyNF9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYgKGFkZHIgJiBpdGVyLT5tYXNrKSA9PSBpdGVyLT5hZGRyKQotCQkJcmV0dXJuIGl0ZXI7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotLyoqCi0gKiBuZXRsYmxfdW5saHNoX3NlYXJjaF9hZGRyNiAtIFNlYXJjaCBmb3IgYSBtYXRjaGluZyBJUHY2IGFkZHJlc3MgZW50cnkKLSAqIEBhZGRyOiBJUHY2IGFkZHJlc3MKLSAqIEBpZmFjZTogdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGVudHJ5Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBTZWFyY2hlcyB0aGUgSVB2NiBhZGRyZXNzIGxpc3Qgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBAaWZhY2UuCi0gKiBJZiBhIG1hdGNoaW5nIGFkZHJlc3MgZW50cnkgaXMgZm91bmQgaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBOVUxMIGlzCi0gKiByZXR1cm5lZC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIHJjdV9yZWFkX1t1bl1sb2NrKCkKLSAqIGZ1bmN0aW9ucy4KLSAqCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiAqbmV0bGJsX3VubGhzaF9zZWFyY2hfYWRkcjYoCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlKQotewotCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI2ICppdGVyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgJmlmYWNlLT5hZGRyNl9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYKLQkJICAgIGlwdjZfbWFza2VkX2FkZHJfY21wKCZpdGVyLT5hZGRyLCAmaXRlci0+bWFzaywgYWRkcikgPT0gMCkKLQkJcmV0dXJuIGl0ZXI7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBJUHY2ICovCi0KLS8qKgogICogbmV0bGJsX3VubGhzaF9zZWFyY2hfaWZhY2UgLSBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgaW50ZXJmYWNlIGVudHJ5CiAgKiBAaWZpbmRleDogdGhlIG5ldHdvcmsgaW50ZXJmYWNlCiAgKgpAQCAtMzgxLDEyICsyNTksMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0bGJsX3VubGhzaF9pZmFjZSAqbmV0bGJsX3VubGhzaF9zZWFyY2hfaWZhY2UoaW50IGlmaW5kZXgpCiB7CiAJdTMyIGJrdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpia3RfbGlzdDsKIAlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9pZmFjZSAqaXRlcjsKIAogCWJrdCA9IG5ldGxibF91bmxoc2hfaGFzaChpZmluZGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLAotCQkJCSZyY3VfZGVyZWZlcmVuY2UobmV0bGJsX3VubGhzaCktPnRibFtia3RdLAotCQkJCWxpc3QpCisJYmt0X2xpc3QgPSAmcmN1X2RlcmVmZXJlbmNlKG5ldGxibF91bmxoc2gpLT50YmxbYmt0XTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyLCBia3RfbGlzdCwgbGlzdCkKIAkJaWYgKGl0ZXItPnZhbGlkICYmIGl0ZXItPmlmaW5kZXggPT0gaWZpbmRleCkKIAkJCXJldHVybiBpdGVyOwogCkBAIC00MzksNDMgKzMxNywyNiBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJCSAgIHUzMiBzZWNpZCkKIHsKKwlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCAqZW50cnk7Ci0Jc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjQgKml0ZXI7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVudHJ5LT5hZGRyID0gYWRkci0+c19hZGRyICYgbWFzay0+c19hZGRyOwotCWVudHJ5LT5tYXNrID0gbWFzay0+c19hZGRyOwotCWVudHJ5LT5zZWNpZCA9IHNlY2lkOwotCWVudHJ5LT52YWxpZCA9IDE7CisJZW50cnktPmxpc3QuYWRkciA9IGFkZHItPnNfYWRkciAmIG1hc2stPnNfYWRkcjsKKwllbnRyeS0+bGlzdC5tYXNrID0gbWFzay0+c19hZGRyOworCWVudHJ5LT5saXN0LnZhbGlkID0gMTsKIAlJTklUX1JDVV9IRUFEKCZlbnRyeS0+cmN1KTsKKwllbnRyeS0+c2VjaWQgPSBzZWNpZDsKIAogCXNwaW5fbG9jaygmbmV0bGJsX3VubGhzaF9sb2NrKTsKLQlpdGVyID0gbmV0bGJsX3VubGhzaF9zZWFyY2hfYWRkcjQoZW50cnktPmFkZHIsIGlmYWNlKTsKLQlpZiAoaXRlciAhPSBOVUxMICYmCi0JICAgIGl0ZXItPmFkZHIgPT0gYWRkci0+c19hZGRyICYmIGl0ZXItPm1hc2sgPT0gbWFzay0+c19hZGRyKSB7Ci0JCXNwaW5fdW5sb2NrKCZuZXRsYmxfdW5saHNoX2xvY2spOwotCQlrZnJlZShlbnRyeSk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQkvKiBpbiBvcmRlciB0byBzcGVlZCB1cCBhZGRyZXNzIHNlYXJjaGVzIHRocm91Z2ggdGhlIGxpc3QgKHRoZSBjb21tb24KLQkgKiBjYXNlKSB3ZSBuZWVkIHRvIGtlZXAgdGhlIGxpc3QgaW4gb3JkZXIgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlCi0JICogYWRkcmVzcyBtYXNrIHN1Y2ggdGhhdCB0aGUgZW50cnkgd2l0aCB0aGUgd2lkZXN0IG1hc2sgKHNtYWxsZXN0Ci0JICogbnVtZXJpY2FsIHZhbHVlKSBhcHBlYXJzIGZpcnN0IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgJmlmYWNlLT5hZGRyNF9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYKLQkJICAgIG50b2hsKGVudHJ5LT5tYXNrKSA+IG50b2hsKGl0ZXItPm1hc2spKSB7Ci0JCQlfX2xpc3RfYWRkX3JjdSgmZW50cnktPmxpc3QsCi0JCQkJICAgICAgIGl0ZXItPmxpc3QucHJldiwKLQkJCQkgICAgICAgJml0ZXItPmxpc3QpOwotCQkJc3Bpbl91bmxvY2soJm5ldGxibF91bmxoc2hfbG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwgJmlmYWNlLT5hZGRyNF9saXN0KTsKKwlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmlmYWNlLT5hZGRyNF9saXN0KTsKIAlzcGluX3VubG9jaygmbmV0bGJsX3VubGhzaF9sb2NrKTsKLQlyZXR1cm4gMDsKKworCWlmIChyZXRfdmFsICE9IDApCisJCWtmcmVlKGVudHJ5KTsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQpAQCAtNDk4LDQ3ICszNTksMjkgQEAKIAkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKm1hc2ssCiAJCQkJICAgdTMyIHNlY2lkKQogeworCWludCByZXRfdmFsOwogCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI2ICplbnRyeTsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiAqaXRlcjsKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaXB2Nl9hZGRyX2NvcHkoJmVudHJ5LT5hZGRyLCBhZGRyKTsKLQllbnRyeS0+YWRkci5zNl9hZGRyMzJbMF0gJj0gbWFzay0+czZfYWRkcjMyWzBdOwotCWVudHJ5LT5hZGRyLnM2X2FkZHIzMlsxXSAmPSBtYXNrLT5zNl9hZGRyMzJbMV07Ci0JZW50cnktPmFkZHIuczZfYWRkcjMyWzJdICY9IG1hc2stPnM2X2FkZHIzMlsyXTsKLQllbnRyeS0+YWRkci5zNl9hZGRyMzJbM10gJj0gbWFzay0+czZfYWRkcjMyWzNdOwotCWlwdjZfYWRkcl9jb3B5KCZlbnRyeS0+bWFzaywgbWFzayk7Ci0JZW50cnktPnNlY2lkID0gc2VjaWQ7Ci0JZW50cnktPnZhbGlkID0gMTsKKwlpcHY2X2FkZHJfY29weSgmZW50cnktPmxpc3QuYWRkciwgYWRkcik7CisJZW50cnktPmxpc3QuYWRkci5zNl9hZGRyMzJbMF0gJj0gbWFzay0+czZfYWRkcjMyWzBdOworCWVudHJ5LT5saXN0LmFkZHIuczZfYWRkcjMyWzFdICY9IG1hc2stPnM2X2FkZHIzMlsxXTsKKwllbnRyeS0+bGlzdC5hZGRyLnM2X2FkZHIzMlsyXSAmPSBtYXNrLT5zNl9hZGRyMzJbMl07CisJZW50cnktPmxpc3QuYWRkci5zNl9hZGRyMzJbM10gJj0gbWFzay0+czZfYWRkcjMyWzNdOworCWlwdjZfYWRkcl9jb3B5KCZlbnRyeS0+bGlzdC5tYXNrLCBtYXNrKTsKKwllbnRyeS0+bGlzdC52YWxpZCA9IDE7CiAJSU5JVF9SQ1VfSEVBRCgmZW50cnktPnJjdSk7CisJZW50cnktPnNlY2lkID0gc2VjaWQ7CiAKIAlzcGluX2xvY2soJm5ldGxibF91bmxoc2hfbG9jayk7Ci0JaXRlciA9IG5ldGxibF91bmxoc2hfc2VhcmNoX2FkZHI2KCZlbnRyeS0+YWRkciwgaWZhY2UpOwotCWlmIChpdGVyICE9IE5VTEwgJiYKLQkgICAgKGlwdjZfYWRkcl9lcXVhbCgmaXRlci0+YWRkciwgYWRkcikgJiYKLQkgICAgIGlwdjZfYWRkcl9lcXVhbCgmaXRlci0+bWFzaywgbWFzaykpKSB7Ci0JCXNwaW5fdW5sb2NrKCZuZXRsYmxfdW5saHNoX2xvY2spOwotCQlrZnJlZShlbnRyeSk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQkvKiBpbiBvcmRlciB0byBzcGVlZCB1cCBhZGRyZXNzIHNlYXJjaGVzIHRocm91Z2ggdGhlIGxpc3QgKHRoZSBjb21tb24KLQkgKiBjYXNlKSB3ZSBuZWVkIHRvIGtlZXAgdGhlIGxpc3QgaW4gb3JkZXIgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlCi0JICogYWRkcmVzcyBtYXNrIHN1Y2ggdGhhdCB0aGUgZW50cnkgd2l0aCB0aGUgd2lkZXN0IG1hc2sgKHNtYWxsZXN0Ci0JICogbnVtZXJpY2FsIHZhbHVlKSBhcHBlYXJzIGZpcnN0IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlciwgJmlmYWNlLT5hZGRyNl9saXN0LCBsaXN0KQotCQlpZiAoaXRlci0+dmFsaWQgJiYKLQkJICAgIGlwdjZfYWRkcl9jbXAoJmVudHJ5LT5tYXNrLCAmaXRlci0+bWFzaykgPiAwKSB7Ci0JCQlfX2xpc3RfYWRkX3JjdSgmZW50cnktPmxpc3QsCi0JCQkJICAgICAgIGl0ZXItPmxpc3QucHJldiwKLQkJCQkgICAgICAgJml0ZXItPmxpc3QpOwotCQkJc3Bpbl91bmxvY2soJm5ldGxibF91bmxoc2hfbG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWxpc3RfYWRkX3RhaWxfcmN1KCZlbnRyeS0+bGlzdCwgJmlmYWNlLT5hZGRyNl9saXN0KTsKKwlyZXRfdmFsID0gbmV0bGJsX2FmNmxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmlmYWNlLT5hZGRyNl9saXN0KTsKIAlzcGluX3VubG9jaygmbmV0bGJsX3VubGhzaF9sb2NrKTsKKworCWlmIChyZXRfdmFsICE9IDApCisJCWtmcmVlKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBJUHY2ICovCkBAIC02NTgsMTAgKzUwMSwxMCBAQAogCQltYXNrNCA9IChzdHJ1Y3QgaW5fYWRkciAqKW1hc2s7CiAJCXJldF92YWwgPSBuZXRsYmxfdW5saHNoX2FkZF9hZGRyNChpZmFjZSwgYWRkcjQsIG1hc2s0LCBzZWNpZCk7CiAJCWlmIChhdWRpdF9idWYgIT0gTlVMTCkKLQkJCW5ldGxibF91bmxhYmVsX2F1ZGl0X2FkZHI0KGF1ZGl0X2J1ZiwKLQkJCQkJCSAgIGRldl9uYW1lLAotCQkJCQkJICAgYWRkcjQtPnNfYWRkciwKLQkJCQkJCSAgIG1hc2s0LT5zX2FkZHIpOworCQkJbmV0bGJsX2FmNGxpc3RfYXVkaXRfYWRkcihhdWRpdF9idWYsIDEsCisJCQkJCQkgIGRldl9uYW1lLAorCQkJCQkJICBhZGRyNC0+c19hZGRyLAorCQkJCQkJICBtYXNrNC0+c19hZGRyKTsKIAkJYnJlYWs7CiAJfQogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQpAQCAtNjcyLDkgKzUxNSw5IEBACiAJCW1hc2s2ID0gKHN0cnVjdCBpbjZfYWRkciAqKW1hc2s7CiAJCXJldF92YWwgPSBuZXRsYmxfdW5saHNoX2FkZF9hZGRyNihpZmFjZSwgYWRkcjYsIG1hc2s2LCBzZWNpZCk7CiAJCWlmIChhdWRpdF9idWYgIT0gTlVMTCkKLQkJCW5ldGxibF91bmxhYmVsX2F1ZGl0X2FkZHI2KGF1ZGl0X2J1ZiwKLQkJCQkJCSAgIGRldl9uYW1lLAotCQkJCQkJICAgYWRkcjYsIG1hc2s2KTsKKwkJCW5ldGxibF9hZjZsaXN0X2F1ZGl0X2FkZHIoYXVkaXRfYnVmLCAxLAorCQkJCQkJICBkZXZfbmFtZSwKKwkJCQkJCSAgYWRkcjYsIG1hc2s2KTsKIAkJYnJlYWs7CiAJfQogI2VuZGlmIC8qIElQdjYgKi8KQEAgLTcxOSwzNSArNTYyLDM0IEBACiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKm1hc2ssCiAJCQkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKLQlpbnQgcmV0X3ZhbCA9IC1FTk9FTlQ7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqbGlzdF9lbnRyeTsKIAlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCAqZW50cnk7Ci0Jc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmID0gTlVMTDsKKwlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQljaGFyICpzZWNjdHggPSBOVUxMOworCWNoYXIgKnNlY2N0eDsKIAl1MzIgc2VjY3R4X2xlbjsKIAogCXNwaW5fbG9jaygmbmV0bGJsX3VubGhzaF9sb2NrKTsKLQllbnRyeSA9IG5ldGxibF91bmxoc2hfc2VhcmNoX2FkZHI0KGFkZHItPnNfYWRkciwgaWZhY2UpOwotCWlmIChlbnRyeSAhPSBOVUxMICYmCi0JICAgIGVudHJ5LT5hZGRyID09IGFkZHItPnNfYWRkciAmJiBlbnRyeS0+bWFzayA9PSBtYXNrLT5zX2FkZHIpIHsKLQkJZW50cnktPnZhbGlkID0gMDsKLQkJbGlzdF9kZWxfcmN1KCZlbnRyeS0+bGlzdCk7Ci0JCXJldF92YWwgPSAwOwotCX0KKwlsaXN0X2VudHJ5ID0gbmV0bGJsX2FmNGxpc3RfcmVtb3ZlKGFkZHItPnNfYWRkciwgbWFzay0+c19hZGRyLAorCQkJCQkgICAmaWZhY2UtPmFkZHI0X2xpc3QpOwogCXNwaW5fdW5sb2NrKCZuZXRsYmxfdW5saHNoX2xvY2spOworCWlmIChsaXN0X2VudHJ5ID09IE5VTEwpCisJCXJldF92YWwgPSAtRU5PRU5UOworCWVudHJ5ID0gbmV0bGJsX3VubGhzaF9hZGRyNF9lbnRyeShsaXN0X2VudHJ5KTsKIAogCWF1ZGl0X2J1ZiA9IG5ldGxibF9hdWRpdF9zdGFydF9jb21tb24oQVVESVRfTUFDX1VOTEJMX1NUQ0RFTCwKIAkJCQkJICAgICAgYXVkaXRfaW5mbyk7CiAJaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7CiAJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmFjZS0+aWZpbmRleCk7Ci0JCW5ldGxibF91bmxhYmVsX2F1ZGl0X2FkZHI0KGF1ZGl0X2J1ZiwKLQkJCQkJICAgKGRldiAhPSBOVUxMID8gZGV2LT5uYW1lIDogTlVMTCksCi0JCQkJCSAgIGVudHJ5LT5hZGRyLCBlbnRyeS0+bWFzayk7CisJCW5ldGxibF9hZjRsaXN0X2F1ZGl0X2FkZHIoYXVkaXRfYnVmLCAxLAorCQkJCQkgIChkZXYgIT0gTlVMTCA/IGRldi0+bmFtZSA6IE5VTEwpLAorCQkJCQkgIGFkZHItPnNfYWRkciwgbWFzay0+c19hZGRyKTsKIAkJaWYgKGRldiAhPSBOVUxMKQogCQkJZGV2X3B1dChkZXYpOwotCQlpZiAoc2VjdXJpdHlfc2VjaWRfdG9fc2VjY3R4KGVudHJ5LT5zZWNpZCwKLQkJCQkJICAgICAmc2VjY3R4LAotCQkJCQkgICAgICZzZWNjdHhfbGVuKSA9PSAwKSB7CisJCWlmIChlbnRyeSAmJiBzZWN1cml0eV9zZWNpZF90b19zZWNjdHgoZW50cnktPnNlY2lkLAorCQkJCQkJICAgICAgJnNlY2N0eCwKKwkJCQkJCSAgICAgICZzZWNjdHhfbGVuKSA9PSAwKSB7CiAJCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIiBzZWNfb2JqPSVzIiwgc2VjY3R4KTsKIAkJCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KHNlY2N0eCwgc2VjY3R4X2xlbik7CiAJCX0KQEAgLTc4MSwzNiArNjIzLDMzIEBACiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrLAogCQkJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7Ci0JaW50IHJldF92YWwgPSAtRU5PRU5UOworCWludCByZXRfdmFsID0gMDsKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKmxpc3RfZW50cnk7CiAJc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjYgKmVudHJ5OwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZiA9IE5VTEw7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JY2hhciAqc2VjY3R4ID0gTlVMTDsKKwljaGFyICpzZWNjdHg7CiAJdTMyIHNlY2N0eF9sZW47CiAKIAlzcGluX2xvY2soJm5ldGxibF91bmxoc2hfbG9jayk7Ci0JZW50cnkgPSBuZXRsYmxfdW5saHNoX3NlYXJjaF9hZGRyNihhZGRyLCBpZmFjZSk7Ci0JaWYgKGVudHJ5ICE9IE5VTEwgJiYKLQkgICAgKGlwdjZfYWRkcl9lcXVhbCgmZW50cnktPmFkZHIsIGFkZHIpICYmCi0JICAgICBpcHY2X2FkZHJfZXF1YWwoJmVudHJ5LT5tYXNrLCBtYXNrKSkpIHsKLQkJZW50cnktPnZhbGlkID0gMDsKLQkJbGlzdF9kZWxfcmN1KCZlbnRyeS0+bGlzdCk7Ci0JCXJldF92YWwgPSAwOwotCX0KKwlsaXN0X2VudHJ5ID0gbmV0bGJsX2FmNmxpc3RfcmVtb3ZlKGFkZHIsIG1hc2ssICZpZmFjZS0+YWRkcjZfbGlzdCk7CiAJc3Bpbl91bmxvY2soJm5ldGxibF91bmxoc2hfbG9jayk7CisJaWYgKGxpc3RfZW50cnkgPT0gTlVMTCkKKwkJcmV0X3ZhbCA9IC1FTk9FTlQ7CisJZW50cnkgPSBuZXRsYmxfdW5saHNoX2FkZHI2X2VudHJ5KGxpc3RfZW50cnkpOwogCiAJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfVU5MQkxfU1RDREVMLAogCQkJCQkgICAgICBhdWRpdF9pbmZvKTsKIAlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKIAkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmYWNlLT5pZmluZGV4KTsKLQkJbmV0bGJsX3VubGFiZWxfYXVkaXRfYWRkcjYoYXVkaXRfYnVmLAotCQkJCQkgICAoZGV2ICE9IE5VTEwgPyBkZXYtPm5hbWUgOiBOVUxMKSwKLQkJCQkJICAgYWRkciwgbWFzayk7CisJCW5ldGxibF9hZjZsaXN0X2F1ZGl0X2FkZHIoYXVkaXRfYnVmLCAxLAorCQkJCQkgIChkZXYgIT0gTlVMTCA/IGRldi0+bmFtZSA6IE5VTEwpLAorCQkJCQkgIGFkZHIsIG1hc2spOwogCQlpZiAoZGV2ICE9IE5VTEwpCiAJCQlkZXZfcHV0KGRldik7Ci0JCWlmIChzZWN1cml0eV9zZWNpZF90b19zZWNjdHgoZW50cnktPnNlY2lkLAotCQkJCQkgICAgICZzZWNjdHgsCi0JCQkJCSAgICAgJnNlY2N0eF9sZW4pID09IDApIHsKKwkJaWYgKGVudHJ5ICYmIHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eChlbnRyeS0+c2VjaWQsCisJCQkJCQkgICAgICAmc2VjY3R4LAorCQkJCQkJICAgICAgJnNlY2N0eF9sZW4pID09IDApIHsKIAkJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIHNlY19vYmo9JXMiLCBzZWNjdHgpOwogCQkJc2VjdXJpdHlfcmVsZWFzZV9zZWNjdHgoc2VjY3R4LCBzZWNjdHhfbGVuKTsKIAkJfQpAQCAtODM2LDE2ICs2NzUsMTggQEAKICAqLwogc3RhdGljIHZvaWQgbmV0bGJsX3VubGhzaF9jb25kcmVtb3ZlX2lmYWNlKHN0cnVjdCBuZXRsYmxfdW5saHNoX2lmYWNlICppZmFjZSkKIHsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCAqaXRlcjQ7Ci0Jc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjYgKml0ZXI2OworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKKyNlbmRpZiAvKiBJUHY2ICovCiAKIAlzcGluX2xvY2soJm5ldGxibF91bmxoc2hfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaXRlcjQsICZpZmFjZS0+YWRkcjRfbGlzdCwgbGlzdCkKLQkJaWYgKGl0ZXI0LT52YWxpZCkKLQkJCWdvdG8gdW5saHNoX2NvbmRyZW1vdmVfZmFpbHVyZTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpdGVyNiwgJmlmYWNlLT5hZGRyNl9saXN0LCBsaXN0KQotCQlpZiAoaXRlcjYtPnZhbGlkKQotCQkJZ290byB1bmxoc2hfY29uZHJlbW92ZV9mYWlsdXJlOworCW5ldGxibF9hZjRsaXN0X2ZvcmVhY2hfcmN1KGl0ZXI0LCAmaWZhY2UtPmFkZHI0X2xpc3QpCisJCWdvdG8gdW5saHNoX2NvbmRyZW1vdmVfZmFpbHVyZTsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwgJmlmYWNlLT5hZGRyNl9saXN0KQorCQlnb3RvIHVubGhzaF9jb25kcmVtb3ZlX2ZhaWx1cmU7CisjZW5kaWYgLyogSVB2NiAqLwogCWlmYWNlLT52YWxpZCA9IDA7CiAJaWYgKGlmYWNlLT5pZmluZGV4ID4gMCkKIAkJbGlzdF9kZWxfcmN1KCZpZmFjZS0+bGlzdCk7CkBAIC0xMzQ5LDcgKzExOTAsNyBAQAogCWlmIChhZGRyNCkgewogCQlzdHJ1Y3QgaW5fYWRkciBhZGRyX3N0cnVjdDsKIAotCQlhZGRyX3N0cnVjdC5zX2FkZHIgPSBhZGRyNC0+YWRkcjsKKwkJYWRkcl9zdHJ1Y3Quc19hZGRyID0gYWRkcjQtPmxpc3QuYWRkcjsKIAkJcmV0X3ZhbCA9IG5sYV9wdXQoY2JfYXJnLT5za2IsCiAJCQkJICBOTEJMX1VOTEFCRUxfQV9JUFY0QUREUiwKIAkJCQkgIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCkBAIC0xMzU3LDcgKzExOTgsNyBAQAogCQlpZiAocmV0X3ZhbCAhPSAwKQogCQkJZ290byBsaXN0X2NiX2ZhaWx1cmU7CiAKLQkJYWRkcl9zdHJ1Y3Quc19hZGRyID0gYWRkcjQtPm1hc2s7CisJCWFkZHJfc3RydWN0LnNfYWRkciA9IGFkZHI0LT5saXN0Lm1hc2s7CiAJCXJldF92YWwgPSBubGFfcHV0KGNiX2FyZy0+c2tiLAogCQkJCSAgTkxCTF9VTkxBQkVMX0FfSVBWNE1BU0ssCiAJCQkJICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLApAQCAtMTM3MCwxNCArMTIxMSwxNCBAQAogCQlyZXRfdmFsID0gbmxhX3B1dChjYl9hcmctPnNrYiwKIAkJCQkgIE5MQkxfVU5MQUJFTF9BX0lQVjZBRERSLAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JCQkJICAmYWRkcjYtPmFkZHIpOworCQkJCSAgJmFkZHI2LT5saXN0LmFkZHIpOwogCQlpZiAocmV0X3ZhbCAhPSAwKQogCQkJZ290byBsaXN0X2NiX2ZhaWx1cmU7CiAKIAkJcmV0X3ZhbCA9IG5sYV9wdXQoY2JfYXJnLT5za2IsCiAJCQkJICBOTEJMX1VOTEFCRUxfQV9JUFY2TUFTSywKIAkJCQkgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkJCSAgJmFkZHI2LT5tYXNrKTsKKwkJCQkgICZhZGRyNi0+bGlzdC5tYXNrKTsKIAkJaWYgKHJldF92YWwgIT0gMCkKIAkJCWdvdG8gbGlzdF9jYl9mYWlsdXJlOwogCkBAIC0xNDI1LDggKzEyNjYsMTEgQEAKIAl1MzIgaXRlcl9ia3Q7CiAJdTMyIGl0ZXJfY2hhaW4gPSAwLCBpdGVyX2FkZHI0ID0gMCwgaXRlcl9hZGRyNiA9IDA7CiAJc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlOwotCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI0ICphZGRyNDsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNiAqYWRkcjY7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlcl9saXN0OworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqYWRkcjQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICphZGRyNjsKKyNlbmRpZgogCiAJY2JfYXJnLm5sX2NiID0gY2I7CiAJY2JfYXJnLnNrYiA9IHNrYjsKQEAgLTE0MzYsNDQgKzEyODAsNDMgQEAKIAlmb3IgKGl0ZXJfYmt0ID0gc2tpcF9ia3Q7CiAJICAgICBpdGVyX2JrdCA8IHJjdV9kZXJlZmVyZW5jZShuZXRsYmxfdW5saHNoKS0+c2l6ZTsKIAkgICAgIGl0ZXJfYmt0KyssIGl0ZXJfY2hhaW4gPSAwLCBpdGVyX2FkZHI0ID0gMCwgaXRlcl9hZGRyNiA9IDApIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaWZhY2UsCi0JCQkgICAgICAgICZyY3VfZGVyZWZlcmVuY2UobmV0bGJsX3VubGhzaCktPnRibFtpdGVyX2JrdF0sCi0JCQkJbGlzdCkgeworCQlpdGVyX2xpc3QgPSAmcmN1X2RlcmVmZXJlbmNlKG5ldGxibF91bmxoc2gpLT50YmxbaXRlcl9ia3RdOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpZmFjZSwgaXRlcl9saXN0LCBsaXN0KSB7CiAJCQlpZiAoIWlmYWNlLT52YWxpZCB8fAogCQkJICAgIGl0ZXJfY2hhaW4rKyA8IHNraXBfY2hhaW4pCiAJCQkJY29udGludWU7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShhZGRyNCwKLQkJCQkJCSZpZmFjZS0+YWRkcjRfbGlzdCwKLQkJCQkJCWxpc3QpIHsKLQkJCQlpZiAoIWFkZHI0LT52YWxpZCB8fCBpdGVyX2FkZHI0KysgPCBza2lwX2FkZHI0KQorCQkJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoYWRkcjQsCisJCQkJCQkgICAmaWZhY2UtPmFkZHI0X2xpc3QpIHsKKwkJCQlpZiAoaXRlcl9hZGRyNCsrIDwgc2tpcF9hZGRyNCkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKG5ldGxibF91bmxhYmVsX3N0YXRpY2xpc3RfZ2VuKAotCQkJCQkgICAgICAgICAgICAgTkxCTF9VTkxBQkVMX0NfU1RBVElDTElTVCwKLQkJCQkJCSAgICAgaWZhY2UsCi0JCQkJCQkgICAgIGFkZHI0LAotCQkJCQkJICAgICBOVUxMLAotCQkJCQkJICAgICAmY2JfYXJnKSA8IDApIHsKKwkJCQkJICAgICAgTkxCTF9VTkxBQkVMX0NfU1RBVElDTElTVCwKKwkJCQkJICAgICAgaWZhY2UsCisJCQkJCSAgICAgIG5ldGxibF91bmxoc2hfYWRkcjRfZW50cnkoYWRkcjQpLAorCQkJCQkgICAgICBOVUxMLAorCQkJCQkgICAgICAmY2JfYXJnKSA8IDApIHsKIAkJCQkJaXRlcl9hZGRyNC0tOwogCQkJCQlpdGVyX2NoYWluLS07CiAJCQkJCWdvdG8gdW5sYWJlbF9zdGF0aWNsaXN0X3JldHVybjsKIAkJCQl9CiAJCQl9Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShhZGRyNiwKLQkJCQkJCSZpZmFjZS0+YWRkcjZfbGlzdCwKLQkJCQkJCWxpc3QpIHsKLQkJCQlpZiAoIWFkZHI2LT52YWxpZCB8fCBpdGVyX2FkZHI2KysgPCBza2lwX2FkZHI2KQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCQkJbmV0bGJsX2FmNmxpc3RfZm9yZWFjaF9yY3UoYWRkcjYsCisJCQkJCQkgICAmaWZhY2UtPmFkZHI2X2xpc3QpIHsKKwkJCQlpZiAoaXRlcl9hZGRyNisrIDwgc2tpcF9hZGRyNikKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKG5ldGxibF91bmxhYmVsX3N0YXRpY2xpc3RfZ2VuKAotCQkJCQkJICAgICBOTEJMX1VOTEFCRUxfQ19TVEFUSUNMSVNULAotCQkJCQkJICAgICBpZmFjZSwKLQkJCQkJCSAgICAgTlVMTCwKLQkJCQkJCSAgICAgYWRkcjYsCi0JCQkJCQkgICAgICZjYl9hcmcpIDwgMCkgeworCQkJCQkgICAgICBOTEJMX1VOTEFCRUxfQ19TVEFUSUNMSVNULAorCQkJCQkgICAgICBpZmFjZSwKKwkJCQkJICAgICAgTlVMTCwKKwkJCQkJICAgICAgbmV0bGJsX3VubGhzaF9hZGRyNl9lbnRyeShhZGRyNiksCisJCQkJCSAgICAgICZjYl9hcmcpIDwgMCkgewogCQkJCQlpdGVyX2FkZHI2LS07CiAJCQkJCWl0ZXJfY2hhaW4tLTsKIAkJCQkJZ290byB1bmxhYmVsX3N0YXRpY2xpc3RfcmV0dXJuOwogCQkJCX0KIAkJCX0KKyNlbmRpZiAvKiBJUHY2ICovCiAJCX0KIAl9CiAKQEAgLTE1MDQsOSArMTM0NywxMiBAQAogCXN0cnVjdCBuZXRsYmxfdW5saHNoX2lmYWNlICppZmFjZTsKIAl1MzIgc2tpcF9hZGRyNCA9IGNiLT5hcmdzWzBdOwogCXUzMiBza2lwX2FkZHI2ID0gY2ItPmFyZ3NbMV07Ci0JdTMyIGl0ZXJfYWRkcjQgPSAwLCBpdGVyX2FkZHI2ID0gMDsKLQlzdHJ1Y3QgbmV0bGJsX3VubGhzaF9hZGRyNCAqYWRkcjQ7Ci0Jc3RydWN0IG5ldGxibF91bmxoc2hfYWRkcjYgKmFkZHI2OworCXUzMiBpdGVyX2FkZHI0ID0gMDsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmFkZHI0OworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXUzMiBpdGVyX2FkZHI2ID0gMDsKKwlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKmFkZHI2OworI2VuZGlmCiAKIAljYl9hcmcubmxfY2IgPSBjYjsKIAljYl9hcmcuc2tiID0gc2tiOwpAQCAtMTUxNywzMCArMTM2MywzMiBAQAogCWlmIChpZmFjZSA9PSBOVUxMIHx8ICFpZmFjZS0+dmFsaWQpCiAJCWdvdG8gdW5sYWJlbF9zdGF0aWNsaXN0ZGVmX3JldHVybjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGFkZHI0LCAmaWZhY2UtPmFkZHI0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFhZGRyNC0+dmFsaWQgfHwgaXRlcl9hZGRyNCsrIDwgc2tpcF9hZGRyNCkKKwluZXRsYmxfYWY0bGlzdF9mb3JlYWNoX3JjdShhZGRyNCwgJmlmYWNlLT5hZGRyNF9saXN0KSB7CisJCWlmIChpdGVyX2FkZHI0KysgPCBza2lwX2FkZHI0KQogCQkJY29udGludWU7CiAJCWlmIChuZXRsYmxfdW5sYWJlbF9zdGF0aWNsaXN0X2dlbihOTEJMX1VOTEFCRUxfQ19TVEFUSUNMSVNUREVGLAotCQkJCQkgICBpZmFjZSwKLQkJCQkJICAgYWRkcjQsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgICZjYl9hcmcpIDwgMCkgeworCQkJCQkgICAgICBpZmFjZSwKKwkJCQkJICAgICAgbmV0bGJsX3VubGhzaF9hZGRyNF9lbnRyeShhZGRyNCksCisJCQkJCSAgICAgIE5VTEwsCisJCQkJCSAgICAgICZjYl9hcmcpIDwgMCkgewogCQkJaXRlcl9hZGRyNC0tOwogCQkJZ290byB1bmxhYmVsX3N0YXRpY2xpc3RkZWZfcmV0dXJuOwogCQl9CiAJfQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGFkZHI2LCAmaWZhY2UtPmFkZHI2X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFhZGRyNi0+dmFsaWQgfHwgaXRlcl9hZGRyNisrIDwgc2tpcF9hZGRyNikKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShhZGRyNiwgJmlmYWNlLT5hZGRyNl9saXN0KSB7CisJCWlmIChpdGVyX2FkZHI2KysgPCBza2lwX2FkZHI2KQogCQkJY29udGludWU7CiAJCWlmIChuZXRsYmxfdW5sYWJlbF9zdGF0aWNsaXN0X2dlbihOTEJMX1VOTEFCRUxfQ19TVEFUSUNMSVNUREVGLAotCQkJCQkgICBpZmFjZSwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgYWRkcjYsCi0JCQkJCSAgICZjYl9hcmcpIDwgMCkgeworCQkJCQkgICAgICBpZmFjZSwKKwkJCQkJICAgICAgTlVMTCwKKwkJCQkJICAgICAgbmV0bGJsX3VubGhzaF9hZGRyNl9lbnRyeShhZGRyNiksCisJCQkJCSAgICAgICZjYl9hcmcpIDwgMCkgewogCQkJaXRlcl9hZGRyNi0tOwogCQkJZ290byB1bmxhYmVsX3N0YXRpY2xpc3RkZWZfcmV0dXJuOwogCQl9CiAJfQorI2VuZGlmIC8qIElQdjYgKi8KIAogdW5sYWJlbF9zdGF0aWNsaXN0ZGVmX3JldHVybjoKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTE3MTgsMjUgKzE1NjYsMjcgQEAKIAlzd2l0Y2ggKGZhbWlseSkgewogCWNhc2UgUEZfSU5FVDogewogCQlzdHJ1Y3QgaXBoZHIgKmhkcjQ7Ci0JCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI0ICphZGRyNDsKKwkJc3RydWN0IG5ldGxibF9hZjRsaXN0ICphZGRyNDsKIAogCQloZHI0ID0gaXBfaGRyKHNrYik7Ci0JCWFkZHI0ID0gbmV0bGJsX3VubGhzaF9zZWFyY2hfYWRkcjQoaGRyNC0+c2FkZHIsIGlmYWNlKTsKKwkJYWRkcjQgPSBuZXRsYmxfYWY0bGlzdF9zZWFyY2goaGRyNC0+c2FkZHIsCisJCQkJCSAgICAgICZpZmFjZS0+YWRkcjRfbGlzdCk7CiAJCWlmIChhZGRyNCA9PSBOVUxMKQogCQkJZ290byB1bmxhYmVsX2dldGF0dHJfbm9sYWJlbDsKLQkJc2VjYXR0ci0+YXR0ci5zZWNpZCA9IGFkZHI0LT5zZWNpZDsKKwkJc2VjYXR0ci0+YXR0ci5zZWNpZCA9IG5ldGxibF91bmxoc2hfYWRkcjRfZW50cnkoYWRkcjQpLT5zZWNpZDsKIAkJYnJlYWs7CiAJfQogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCWNhc2UgUEZfSU5FVDY6IHsKIAkJc3RydWN0IGlwdjZoZHIgKmhkcjY7Ci0JCXN0cnVjdCBuZXRsYmxfdW5saHNoX2FkZHI2ICphZGRyNjsKKwkJc3RydWN0IG5ldGxibF9hZjZsaXN0ICphZGRyNjsKIAogCQloZHI2ID0gaXB2Nl9oZHIoc2tiKTsKLQkJYWRkcjYgPSBuZXRsYmxfdW5saHNoX3NlYXJjaF9hZGRyNigmaGRyNi0+c2FkZHIsIGlmYWNlKTsKKwkJYWRkcjYgPSBuZXRsYmxfYWY2bGlzdF9zZWFyY2goJmhkcjYtPnNhZGRyLAorCQkJCQkgICAgICAmaWZhY2UtPmFkZHI2X2xpc3QpOwogCQlpZiAoYWRkcjYgPT0gTlVMTCkKIAkJCWdvdG8gdW5sYWJlbF9nZXRhdHRyX25vbGFiZWw7Ci0JCXNlY2F0dHItPmF0dHIuc2VjaWQgPSBhZGRyNi0+c2VjaWQ7CisJCXNlY2F0dHItPmF0dHIuc2VjaWQgPSBuZXRsYmxfdW5saHNoX2FkZHI2X2VudHJ5KGFkZHI2KS0+c2VjaWQ7CiAJCWJyZWFrOwogCX0KICNlbmRpZiAvKiBJUHY2ICovCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggYjBlYWNjMC4uMmZkOGFmYSAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBORVRMSU5LICAgICAgS2VybmVsLXVzZXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbC4KICAqCi0gKiAJCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAJCUF1dGhvcnM6CUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKiAJCQkJQWxleGV5IEt1em5ldHNvdiA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CiAgKgogICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCmluZGV4IDUzMmU0ZmEuLjlmMWVhNGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKKysrIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpAQCAtNTI1LDYgKzUyNSw3IEBACiAJaWYgKHNrID09IE5VTEwpIHJldHVybiAwOwogCiAJc29ja19ob2xkKHNrKTsKKwlzb2NrX29ycGhhbihzayk7CiAJbG9ja19zb2NrKHNrKTsKIAluciA9IG5yX3NrKHNrKTsKIApAQCAtNTQ4LDcgKzU0OSw2IEBACiAJCXNrLT5za19zdGF0ZSAgICA9IFRDUF9DTE9TRTsKIAkJc2stPnNrX3NodXRkb3duIHw9IFNFTkRfU0hVVERPV047CiAJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCQlzb2NrX29ycGhhbihzayk7CiAJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREVTVFJPWSk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L0tjb25maWcgYi9uZXQvcGhvbmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNTY2OQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9waG9uZXQvS2NvbmZpZwpAQCAtMCwwICsxLDE2IEBACisjCisjIFBob25ldCBwcm90b2NvbAorIworCitjb25maWcgUEhPTkVUCisJdHJpc3RhdGUgIlBob25ldCBwcm90b2NvbHMgZmFtaWx5IgorCWhlbHAKKwkgIFRoZSBQaG9uZSBOZXR3b3JrIHByb3RvY29sIChQaG9OZXQpIGlzIGEgcGFja2V0LW9yaWVudGVkCisJICBjb21tdW5pY2F0aW9uIHByb3RvY29sIGRldmVsb3BwZWQgYnkgTm9raWEgZm9yIHVzZSB3aXRoIGl0cyBtb2RlbXMuCisKKwkgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIE1hZW1vIHRvIHVzZSBjZWxsdWxhciBkYXRhIGNvbm5lY3Rpdml0eSAoaWYKKwkgIHN1cHBvcnRlZCkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udHJvbCBOb2tpYSBwaG9uZXMKKwkgIGZyb20gYSBMaW51eCBjb21wdXRlciwgYWx0aG91Z2ggQVQgY29tbWFuZHMgbWF5IGJlIGVhc2llciB0byB1c2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBob25ldC4gSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvTWFrZWZpbGUgYi9uZXQvcGhvbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmJiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcGhvbmV0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKK29iai0kKENPTkZJR19QSE9ORVQpICs9IHBob25ldC5vIHBuX3BlcC5vCisKK3Bob25ldC1vYmpzIDo9IFwKKwlwbl9kZXYubyBcCisJcG5fbmV0bGluay5vIFwKKwlzb2NrZXQubyBcCisJZGF0YWdyYW0ubyBcCisJc3lzY3RsLm8gXAorCWFmX3Bob25ldC5vCisKK3BuX3BlcC1vYmpzIDo9IHBlcC5vIHBlcC1ncHJzLm8KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvYWZfcGhvbmV0LmMgYi9uZXQvcGhvbmV0L2FmX3Bob25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWM2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcGhvbmV0L2FmX3Bob25ldC5jCkBAIC0wLDAgKzEsNDc3IEBACisvKgorICogRmlsZTogYWZfcGhvbmV0LmMKKyAqCisgKiBQaG9uZXQgcHJvdG9jb2xzIGZhbWlseQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBDb250YWN0OiBSZW1pIERlbmlzLUNvdXJtb250IDxyZW1pLmRlbmlzLWNvdXJtb250QG5va2lhLmNvbT4KKyAqIE9yaWdpbmFsIGF1dGhvcjogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl9waG9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgorI2luY2x1ZGUgPG5ldC9waG9uZXQvcG5fZGV2Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBwaG9uZXRfcHJvdG9fZmFtaWx5Oworc3RhdGljIHN0cnVjdCBwaG9uZXRfcHJvdG9jb2wgKnBob25ldF9wcm90b19nZXQoaW50IHByb3RvY29sKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaG9uZXRfcHJvdG9fcHV0KHN0cnVjdCBwaG9uZXRfcHJvdG9jb2wgKnBwKTsKKworLyogcHJvdG9jb2wgZmFtaWx5IGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IHBuX3NvY2tldF9jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBwbl9zb2NrICpwbjsKKwlzdHJ1Y3QgcGhvbmV0X3Byb3RvY29sICpwbnA7CisJaW50IGVycjsKKworCWlmIChuZXQgIT0gJmluaXRfbmV0KQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChwcm90b2NvbCA9PSAwKSB7CisJCS8qIERlZmF1bHQgcHJvdG9jb2wgc2VsZWN0aW9uICovCisJCXN3aXRjaCAoc29jay0+dHlwZSkgeworCQljYXNlIFNPQ0tfREdSQU06CisJCQlwcm90b2NvbCA9IFBOX1BST1RPX1BIT05FVDsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfU0VRUEFDS0VUOgorCQkJcHJvdG9jb2wgPSBQTl9QUk9UT19QSVBFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwkJfQorCX0KKworCXBucCA9IHBob25ldF9wcm90b19nZXQocHJvdG9jb2wpOworI2lmZGVmIENPTkZJR19LTU9ECisJaWYgKHBucCA9PSBOVUxMICYmCisJICAgIHJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQtcHJvdG8tJWQiLCBQRl9QSE9ORVQsIHByb3RvY29sKSA9PSAwKQorCQlwbnAgPSBwaG9uZXRfcHJvdG9fZ2V0KHByb3RvY29sKTsKKyNlbmRpZgorCWlmIChwbnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKHNvY2stPnR5cGUgIT0gcG5wLT5zb2NrX3R5cGUpIHsKKwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCisJc2sgPSBza19hbGxvYyhuZXQsIFBGX1BIT05FVCwgR0ZQX0tFUk5FTCwgcG5wLT5wcm90KTsKKwlpZiAoc2sgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwlzb2NrLT5vcHMgPSBwbnAtPm9wczsKKwlzay0+c2tfYmFja2xvZ19yY3YgPSBzay0+c2tfcHJvdC0+YmFja2xvZ19yY3Y7CisJc2stPnNrX3Byb3RvY29sID0gcHJvdG9jb2w7CisJcG4gPSBwbl9zayhzayk7CisJcG4tPnNvYmplY3QgPSAwOworCXBuLT5yZXNvdXJjZSA9IDA7CisJc2stPnNrX3Byb3QtPmluaXQoc2spOworCWVyciA9IDA7CisKK291dDoKKwlwaG9uZXRfcHJvdG9fcHV0KHBucCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHBob25ldF9wcm90b19mYW1pbHkgPSB7CisJLmZhbWlseSA9IFBGX1BIT05FVCwKKwkuY3JlYXRlID0gcG5fc29ja2V0X2NyZWF0ZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKKy8qIFBob25ldCBkZXZpY2UgaGVhZGVyIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgcG5faGVhZGVyX2NyZWF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhZGRyLAorCQkJCWNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJdTggKm1lZGlhID0gc2tiX3B1c2goc2tiLCAxKTsKKworCWlmICh0eXBlICE9IEVUSF9QX1BIT05FVCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFzYWRkcikKKwkJc2FkZHIgPSBkZXYtPmRldl9hZGRyOworCSptZWRpYSA9ICooY29uc3QgdTggKilzYWRkcjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwbl9oZWFkZXJfcGFyc2UoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJY29uc3QgdTggKm1lZGlhID0gc2tiX21hY19oZWFkZXIoc2tiKTsKKwkqaGFkZHIgPSAqbWVkaWE7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBoZWFkZXJfb3BzIHBob25ldF9oZWFkZXJfb3BzID0geworCS5jcmVhdGUgPSBwbl9oZWFkZXJfY3JlYXRlLAorCS5wYXJzZSA9IHBuX2hlYWRlcl9wYXJzZSwKK307CitFWFBPUlRfU1lNQk9MKHBob25ldF9oZWFkZXJfb3BzKTsKKworLyoKKyAqIFByZXBlbmRzIGFuIElTSSBoZWFkZXIgYW5kIHNlbmRzIGEgZGF0YWdyYW0uCisgKi8KK3N0YXRpYyBpbnQgcG5fc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdTE2IGRzdCwgdTE2IHNyYywgdTggcmVzLCB1OCBpcnEpCit7CisJc3RydWN0IHBob25ldGhkciAqcGg7CisJaW50IGVycjsKKworCWlmIChza2ItPmxlbiArIDIgPiAweGZmZmYpIHsKKwkJLyogUGhvbmV0IGxlbmd0aCBmaWVsZCB3b3VsZCBvdmVyZmxvdyAqLworCQllcnIgPSAtRU1TR1NJWkU7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCVdBUk5fT04oc2tiX2hlYWRyb29tKHNrYikgJiAxKTsgLyogSFcgYXNzdW1lcyB3b3JkIGFsaWdubWVudCAqLworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBwaG9uZXRoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlwaCA9IHBuX2hkcihza2IpOworCXBoLT5wbl9yZGV2ID0gcG5fZGV2KGRzdCk7CisJcGgtPnBuX3NkZXYgPSBwbl9kZXYoc3JjKTsKKwlwaC0+cG5fcmVzID0gcmVzOworCXBoLT5wbl9sZW5ndGggPSBfX2NwdV90b19iZTE2KHNrYi0+bGVuICsgMiAtIHNpemVvZigqcGgpKTsKKwlwaC0+cG5fcm9iaiA9IHBuX29iaihkc3QpOworCXBoLT5wbl9zb2JqID0gcG5fb2JqKHNyYyk7CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfUEhPTkVUKTsKKwlza2ItPnByaW9yaXR5ID0gMDsKKwlza2ItPmRldiA9IGRldjsKKworCWlmIChwbl9hZGRyKHNyYykgPT0gcG5fYWRkcihkc3QpKSB7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTE9PUEJBQ0s7CisJCXNrYl9vcnBoYW4oc2tiKTsKKwkJaWYgKGlycSkKKwkJCW5ldGlmX3J4KHNrYik7CisJCWVsc2UKKwkJCW5ldGlmX3J4X25pKHNrYik7CisJCWVyciA9IDA7CisJfSBlbHNlIHsKKwkJZXJyID0gZGV2X2hhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhza2ItPnByb3RvY29sKSwKKwkJCQkJTlVMTCwgTlVMTCwgc2tiLT5sZW4pOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXJyID0gLUVIT1NUVU5SRUFDSDsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQllcnIgPSBkZXZfcXVldWVfeG1pdChza2IpOworCX0KKworCXJldHVybiBlcnI7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcG5fcmF3X3NlbmQoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXUxNiBkc3QsIHUxNiBzcmMsIHU4IHJlcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKE1BWF9QSE9ORVRfSEVBREVSICsgbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc2tiX3Jlc2VydmUoc2tiLCBNQVhfUEhPTkVUX0hFQURFUik7CisJX19za2JfcHV0KHNrYiwgbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGRhdGEsIGxlbik7CisJcmV0dXJuIHBuX3NlbmQoc2tiLCBkZXYsIGRzdCwgc3JjLCByZXMsIDEpOworfQorCisvKgorICogQ3JlYXRlIGEgUGhvbmV0IGhlYWRlciBmb3IgdGhlIHNrYiBhbmQgc2VuZCBpdCBvdXQuIFJldHVybnMKKyAqIG5vbi16ZXJvIGVycm9yIGNvZGUgaWYgZmFpbGVkLiBUaGUgc2tiIGlzIGZyZWVkIHRoZW4uCisgKi8KK2ludCBwbl9za2Jfc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiAqdGFyZ2V0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHBuX3NvY2sgKnBuID0gcG5fc2soc2spOworCWludCBlcnI7CisJdTE2IHNyYzsKKwl1OCBkYWRkciA9IHBuX3NvY2thZGRyX2dldF9hZGRyKHRhcmdldCksIHNhZGRyID0gUE5fTk9fQUREUjsKKworCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYpCisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgoc29ja19uZXQoc2spLCBzay0+c2tfYm91bmRfZGV2X2lmKTsKKwllbHNlCisJCWRldiA9IHBob25ldF9kZXZpY2VfZ2V0KHNvY2tfbmV0KHNrKSk7CisJaWYgKCFkZXYgfHwgIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJZ290byBkcm9wOworCisJc2FkZHIgPSBwaG9uZXRfYWRkcmVzc19nZXQoZGV2LCBkYWRkcik7CisJaWYgKHNhZGRyID09IFBOX05PX0FERFIpCisJCWdvdG8gZHJvcDsKKworCXNyYyA9IHBuLT5zb2JqZWN0OworCWlmICghcG5fYWRkcihzcmMpKQorCQlzcmMgPSBwbl9vYmplY3Qoc2FkZHIsIHBuX29iaihzcmMpKTsKKworCWVyciA9IHBuX3NlbmQoc2tiLCBkZXYsIHBuX3NvY2thZGRyX2dldF9vYmplY3QodGFyZ2V0KSwKKwkJCXNyYywgcG5fc29ja2FkZHJfZ2V0X3Jlc291cmNlKHRhcmdldCksIDApOworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChwbl9za2Jfc2VuZCk7CisKKy8qIERvIG5vdCBzZW5kIGFuIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gYW4gZXJyb3IgbWVzc2FnZSAqLworc3RhdGljIGlubGluZSBpbnQgY2FuX3Jlc3BvbmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3QgcGhvbmV0aGRyICpwaDsKKwljb25zdCBzdHJ1Y3QgcGhvbmV0bXNnICpwbTsKKwl1OCBzdWJtc2dfaWQ7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAzKSkKKwkJcmV0dXJuIDA7CisKKwlwaCA9IHBuX2hkcihza2IpOworCWlmIChwaG9uZXRfYWRkcmVzc19nZXQoc2tiLT5kZXYsIHBoLT5wbl9yZGV2KSAhPSBwaC0+cG5fcmRldikKKwkJcmV0dXJuIDA7IC8qIHdlIGFyZSBub3QgdGhlIGRlc3RpbmF0aW9uICovCisJaWYgKHBoLT5wbl9yZXMgPT0gUE5fUFJFRklYICYmICFwc2tiX21heV9wdWxsKHNrYiwgNSkpCisJCXJldHVybiAwOworCisJcGggPSBwbl9oZHIoc2tiKTsgLyogcmUtYWNxdWlyZXMgdGhlIHBvaW50ZXIgKi8KKwlwbSA9IHBuX21zZyhza2IpOworCWlmIChwbS0+cG5fbXNnX2lkICE9IFBOX0NPTU1PTl9NRVNTQUdFKQorCQlyZXR1cm4gMTsKKwlzdWJtc2dfaWQgPSAocGgtPnBuX3JlcyA9PSBQTl9QUkVGSVgpCisJCT8gcG0tPnBuX2Vfc3VibXNnX2lkIDogcG0tPnBuX3N1Ym1zZ19pZDsKKwlpZiAoc3VibXNnX2lkICE9IFBOX0NPTU1fSVNBX0VOVElUWV9OT1RfUkVBQ0hBQkxFX1JFU1AgJiYKKwkJcG0tPnBuX2Vfc3VibXNnX2lkICE9IFBOX0NPTU1fU0VSVklDRV9OT1RfSURFTlRJRklFRF9SRVNQKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZW5kX29ial91bnJlYWNoYWJsZShzdHJ1Y3Qgc2tfYnVmZiAqcnNrYikKK3sKKwljb25zdCBzdHJ1Y3QgcGhvbmV0aGRyICpvcGggPSBwbl9oZHIocnNrYik7CisJY29uc3Qgc3RydWN0IHBob25ldG1zZyAqb3BtID0gcG5fbXNnKHJza2IpOworCXN0cnVjdCBwaG9uZXRtc2cgcmVzcDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mKHJlc3ApKTsKKwlyZXNwLnBuX3RyYW5zX2lkID0gb3BtLT5wbl90cmFuc19pZDsKKwlyZXNwLnBuX21zZ19pZCA9IFBOX0NPTU1PTl9NRVNTQUdFOworCWlmIChvcGgtPnBuX3JlcyA9PSBQTl9QUkVGSVgpIHsKKwkJcmVzcC5wbl9lX3Jlc19pZCA9IG9wbS0+cG5fZV9yZXNfaWQ7CisJCXJlc3AucG5fZV9zdWJtc2dfaWQgPSBQTl9DT01NX0lTQV9FTlRJVFlfTk9UX1JFQUNIQUJMRV9SRVNQOworCQlyZXNwLnBuX2Vfb3JpZ19tc2dfaWQgPSBvcG0tPnBuX21zZ19pZDsKKwkJcmVzcC5wbl9lX3N0YXR1cyA9IDA7CisJfSBlbHNlIHsKKwkJcmVzcC5wbl9zdWJtc2dfaWQgPSBQTl9DT01NX0lTQV9FTlRJVFlfTk9UX1JFQUNIQUJMRV9SRVNQOworCQlyZXNwLnBuX29yaWdfbXNnX2lkID0gb3BtLT5wbl9tc2dfaWQ7CisJCXJlc3AucG5fc3RhdHVzID0gMDsKKwl9CisJcmV0dXJuIHBuX3Jhd19zZW5kKCZyZXNwLCBzaXplb2YocmVzcCksIHJza2ItPmRldiwKKwkJCQlwbl9vYmplY3Qob3BoLT5wbl9zZGV2LCBvcGgtPnBuX3NvYmopLAorCQkJCXBuX29iamVjdChvcGgtPnBuX3JkZXYsIG9waC0+cG5fcm9iaiksCisJCQkJb3BoLT5wbl9yZXMpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmVzZXRfaW5kaWNhdGlvbnMoc3RydWN0IHNrX2J1ZmYgKnJza2IpCit7CisJc3RydWN0IHBob25ldGhkciAqb3BoID0gcG5faGRyKHJza2IpOworCXN0YXRpYyBjb25zdCB1OCBkYXRhWzRdID0geworCQkweDAwIC8qIHRyYW5zIElEICovLCAweDEwIC8qIHN1YnNjcmliZSBtc2cgKi8sCisJCTB4MDAgLyogc3Vic2NyaXB0aW9uIGNvdW50ICovLCAweDAwIC8qIGR1bW15ICovCisJfTsKKworCXJldHVybiBwbl9yYXdfc2VuZChkYXRhLCBzaXplb2YoZGF0YSksIHJza2ItPmRldiwKKwkJCQlwbl9vYmplY3Qob3BoLT5wbl9zZGV2LCAweDAwKSwKKwkJCQlwbl9vYmplY3Qob3BoLT5wbl9yZGV2LCBvcGgtPnBuX3JvYmopLCAweDEwKTsKK30KKworCisvKiBwYWNrZXQgdHlwZSBmdW5jdGlvbnMgKi8KKworLyoKKyAqIFN0dWZmIHJlY2VpdmVkIHBhY2tldHMgdG8gYXNzb2NpYXRlZCBzb2NrZXRzLgorICogT24gZXJyb3IsIHJldHVybnMgbm9uLXplcm8gYW5kIHJlbGVhc2VzIHRoZSBza2IuCisgKi8KK3N0YXRpYyBpbnQgcGhvbmV0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IHBhY2tldF90eXBlICpwa3R0eXBlLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBwaG9uZXRoZHIgKnBoOworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc29ja2FkZHJfcG4gc2E7CisJdTE2IGxlbjsKKworCWlmIChkZXZfbmV0KGRldikgIT0gJmluaXRfbmV0KQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIHdlIGhhdmUgYXQgbGVhc3QgYSBmdWxsIFBob25ldCBoZWFkZXIgKi8KKwlpZiAoIXBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcGhvbmV0aGRyKSkpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgdGhhdCB0aGUgYWR2ZXJ0aXNlZCBsZW5ndGggaXMgY29ycmVjdCAqLworCXBoID0gcG5faGRyKHNrYik7CisJbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZwaC0+cG5fbGVuZ3RoKTsKKwlpZiAobGVuIDwgMikKKwkJZ290byBvdXQ7CisJbGVuIC09IDI7CisJaWYgKChsZW4gPiBza2ItPmxlbikgfHwgcHNrYl90cmltKHNrYiwgbGVuKSkKKwkJZ290byBvdXQ7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKworCXBuX3NrYl9nZXRfZHN0X3NvY2thZGRyKHNrYiwgJnNhKTsKKwlpZiAocG5fc29ja2FkZHJfZ2V0X2FkZHIoJnNhKSA9PSAwKQorCQlnb3RvIG91dDsgLyogY3VycmVudGx5LCB3ZSBjYW5ub3QgYmUgZGV2aWNlIDAgKi8KKworCXNrID0gcG5fZmluZF9zb2NrX2J5X3NhKCZzYSk7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJaWYgKGNhbl9yZXNwb25kKHNrYikpIHsKKwkJCXNlbmRfb2JqX3VucmVhY2hhYmxlKHNrYik7CisJCQlzZW5kX3Jlc2V0X2luZGljYXRpb25zKHNrYik7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogUHVzaCBkYXRhIHRvIHRoZSBzb2NrZXQgKG9yIG90aGVyIHNvY2tldHMgY29ubmVjdGVkIHRvIGl0KS4gKi8KKwlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2ssIHNrYiwgMCk7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgcGhvbmV0X3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9QSE9ORVQpLAorCS5kZXYgPSBOVUxMLAorCS5mdW5jID0gcGhvbmV0X3JjdiwKK307CisKKy8qIFRyYW5zcG9ydCBwcm90b2NvbCByZWdpc3RyYXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgcGhvbmV0X3Byb3RvY29sICpwcm90b190YWJbUEhPTkVUX05QUk9UT10gX19yZWFkX21vc3RseTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHJvdG9fdGFiX2xvY2spOworCitpbnQgX19pbml0X29yX21vZHVsZSBwaG9uZXRfcHJvdG9fcmVnaXN0ZXIoaW50IHByb3RvY29sLAorCQkJCQkJc3RydWN0IHBob25ldF9wcm90b2NvbCAqcHApCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocHJvdG9jb2wgPj0gUEhPTkVUX05QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBwcm90b19yZWdpc3RlcihwcC0+cHJvdCwgMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNwaW5fbG9jaygmcHJvdG9fdGFiX2xvY2spOworCWlmIChwcm90b190YWJbcHJvdG9jb2xdKQorCQllcnIgPSAtRUJVU1k7CisJZWxzZQorCQlwcm90b190YWJbcHJvdG9jb2xdID0gcHA7CisJc3Bpbl91bmxvY2soJnByb3RvX3RhYl9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHBob25ldF9wcm90b19yZWdpc3Rlcik7CisKK3ZvaWQgcGhvbmV0X3Byb3RvX3VucmVnaXN0ZXIoaW50IHByb3RvY29sLCBzdHJ1Y3QgcGhvbmV0X3Byb3RvY29sICpwcCkKK3sKKwlzcGluX2xvY2soJnByb3RvX3RhYl9sb2NrKTsKKwlCVUdfT04ocHJvdG9fdGFiW3Byb3RvY29sXSAhPSBwcCk7CisJcHJvdG9fdGFiW3Byb3RvY29sXSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnByb3RvX3RhYl9sb2NrKTsKKwlwcm90b191bnJlZ2lzdGVyKHBwLT5wcm90KTsKK30KK0VYUE9SVF9TWU1CT0wocGhvbmV0X3Byb3RvX3VucmVnaXN0ZXIpOworCitzdGF0aWMgc3RydWN0IHBob25ldF9wcm90b2NvbCAqcGhvbmV0X3Byb3RvX2dldChpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHBob25ldF9wcm90b2NvbCAqcHA7CisKKwlpZiAocHJvdG9jb2wgPj0gUEhPTkVUX05QUk9UTykKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2soJnByb3RvX3RhYl9sb2NrKTsKKwlwcCA9IHByb3RvX3RhYltwcm90b2NvbF07CisJaWYgKHBwICYmICF0cnlfbW9kdWxlX2dldChwcC0+cHJvdC0+b3duZXIpKQorCQlwcCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnByb3RvX3RhYl9sb2NrKTsKKworCXJldHVybiBwcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBob25ldF9wcm90b19wdXQoc3RydWN0IHBob25ldF9wcm90b2NvbCAqcHApCit7CisJbW9kdWxlX3B1dChwcC0+cHJvdC0+b3duZXIpOworfQorCisvKiBNb2R1bGUgcmVnaXN0cmF0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBwaG9uZXRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBzb2NrX3JlZ2lzdGVyKCZwaG9uZXRfcHJvdG9fZmFtaWx5KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0FMRVJUCisJCQkicGhvbmV0IHByb3RvY29sIGZhbWlseSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBob25ldF9kZXZpY2VfaW5pdCgpOworCWRldl9hZGRfcGFjaygmcGhvbmV0X3BhY2tldF90eXBlKTsKKwlwaG9uZXRfbmV0bGlua19yZWdpc3RlcigpOworCXBob25ldF9zeXNjdGxfaW5pdCgpOworCisJZXJyID0gaXNpX3JlZ2lzdGVyKCk7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CisKK2VycjoKKwlwaG9uZXRfc3lzY3RsX2V4aXQoKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUEhPTkVUKTsKKwlkZXZfcmVtb3ZlX3BhY2soJnBob25ldF9wYWNrZXRfdHlwZSk7CisJcGhvbmV0X2RldmljZV9leGl0KCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBob25ldF9leGl0KHZvaWQpCit7CisJaXNpX3VucmVnaXN0ZXIoKTsKKwlwaG9uZXRfc3lzY3RsX2V4aXQoKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUEhPTkVUKTsKKwlkZXZfcmVtb3ZlX3BhY2soJnBob25ldF9wYWNrZXRfdHlwZSk7CisJcGhvbmV0X2RldmljZV9leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KHBob25ldF9pbml0KTsKK21vZHVsZV9leGl0KHBob25ldF9leGl0KTsKK01PRFVMRV9ERVNDUklQVElPTigiUGhvbmV0IHByb3RvY29sIHN0YWNrIGZvciBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX1BIT05FVCk7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L2RhdGFncmFtLmMgYi9uZXQvcGhvbmV0L2RhdGFncmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4Nzg2MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9waG9uZXQvZGF0YWdyYW0uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIEZpbGU6IGRhdGFncmFtLmMKKyAqCisgKiBEYXRhZ3JhbSAoSVNJKSBQaG9uZXQgc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBDb250YWN0OiBSZW1pIERlbmlzLUNvdXJtb250IDxyZW1pLmRlbmlzLWNvdXJtb250QG5va2lhLmNvbT4KKyAqIE9yaWdpbmFsIGF1dGhvcjogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgorCitzdGF0aWMgaW50IHBuX2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qIGFzc29jaWF0ZWQgc29ja2V0IGNlYXNlcyB0byBleGlzdCAqLworc3RhdGljIHZvaWQgcG5fc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlza19jb21tb25fcmVsZWFzZShzayk7Cit9CisKK3N0YXRpYyBpbnQgcG5faW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBhbnN3OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NJTlE6CisJCWxvY2tfc29jayhzayk7CisJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWFuc3cgPSBza2IgPyBza2ItPmxlbiA6IDA7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBwdXRfdXNlcihhbnN3LCAoaW50IF9fdXNlciAqKWFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworLyogRGVzdHJveSBzb2NrZXQuIEFsbCByZWZlcmVuY2VzIGFyZSBnb25lLiAqLworc3RhdGljIHZvaWQgcG5fZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworfQorCitzdGF0aWMgaW50IHBuX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXNrLT5za19kZXN0cnVjdCA9IHBuX2Rlc3RydWN0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBuX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3BuICp0YXJnZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKG1zZy0+bXNnX25hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FREVTVEFERFJSRVE7CisKKwlpZiAobXNnLT5tc2dfbmFtZWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcG4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRhcmdldCA9IChzdHJ1Y3Qgc29ja2FkZHJfcG4gKiltc2ctPm1zZ19uYW1lOworCWlmICh0YXJnZXQtPnNwbl9mYW1pbHkgIT0gQUZfUEhPTkVUKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIE1BWF9QSE9ORVRfSEVBREVSICsgbGVuLAorCQkJCQltc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gZXJyOworCXNrYl9yZXNlcnZlKHNrYiwgTUFYX1BIT05FVF9IRUFERVIpOworCisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYygodm9pZCAqKXNrYl9wdXQoc2tiLCBsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBQaG9uZXQgaGVhZGVyIGFuZAorCSAqIGZpbmFsbHkgcGFzcyB0aGUgcGFja2V0IGZvcndhcmRzLgorCSAqLworCWVyciA9IHBuX3NrYl9zZW5kKHNrLCBza2IsIHRhcmdldCk7CisKKwkvKiBJZiBvaywgcmV0dXJuIGxlbi4gKi8KKwlyZXR1cm4gKGVyciA+PSAwKSA/IGxlbiA6IGVycjsKK30KKworc3RhdGljIGludCBwbl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywKKwkJCWludCBmbGFncywgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcG4gc2E7CisJaW50IHJ2YWwgPSAtRU9QTk9UU1VQUDsKKwlpbnQgY29weWxlbjsKKworCWlmIChmbGFncyAmIE1TR19PT0IpCisJCWdvdG8gb3V0X25vZnJlZTsKKworCWlmIChhZGRyX2xlbikKKwkJKmFkZHJfbGVuID0gc2l6ZW9mKHNhKTsKKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJnJ2YWwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9mcmVlOworCisJcG5fc2tiX2dldF9zcmNfc29ja2FkZHIoc2tiLCAmc2EpOworCisJY29weWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gPCBjb3B5bGVuKSB7CisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwkJY29weWxlbiA9IGxlbjsKKwl9CisKKwlydmFsID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcHlsZW4pOworCWlmIChydmFsKSB7CisJCXJ2YWwgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlydmFsID0gKGZsYWdzICYgTVNHX1RSVU5DKSA/IHNrYi0+bGVuIDogY29weWxlbjsKKworCWlmIChtc2ctPm1zZ19uYW1lICE9IE5VTEwpCisJCW1lbWNweShtc2ctPm1zZ19uYW1lLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcG4pKTsKKworb3V0OgorCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCitvdXRfbm9mcmVlOgorCXJldHVybiBydmFsOworfQorCisvKiBRdWV1ZSBhbiBza2IgZm9yIGEgc29jay4gKi8KK3N0YXRpYyBpbnQgcG5fYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKGVyciA8IDApCisJCWtmcmVlX3NrYihza2IpOworCXJldHVybiBlcnIgPyBORVRfUlhfRFJPUCA6IE5FVF9SWF9TVUNDRVNTOworfQorCisvKiBNb2R1bGUgcmVnaXN0cmF0aW9uICovCitzdGF0aWMgc3RydWN0IHByb3RvIHBuX3Byb3RvID0geworCS5jbG9zZQkJPSBwbl9zb2NrX2Nsb3NlLAorCS5pb2N0bAkJPSBwbl9pb2N0bCwKKwkuaW5pdAkJPSBwbl9pbml0LAorCS5zZW5kbXNnCT0gcG5fc2VuZG1zZywKKwkucmVjdm1zZwk9IHBuX3JlY3Ztc2csCisJLmJhY2tsb2dfcmN2CT0gcG5fYmFja2xvZ19yY3YsCisJLmhhc2gJCT0gcG5fc29ja19oYXNoLAorCS51bmhhc2gJCT0gcG5fc29ja191bmhhc2gsCisJLmdldF9wb3J0CT0gcG5fc29ja19nZXRfcG9ydCwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IHBuX3NvY2spLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiUEhPTkVUIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGhvbmV0X3Byb3RvY29sIHBuX2RncmFtX3Byb3RvID0geworCS5vcHMJCT0gJnBob25ldF9kZ3JhbV9vcHMsCisJLnByb3QJCT0gJnBuX3Byb3RvLAorCS5zb2NrX3R5cGUJPSBTT0NLX0RHUkFNLAorfTsKKworaW50IF9faW5pdCBpc2lfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGhvbmV0X3Byb3RvX3JlZ2lzdGVyKFBOX1BST1RPX1BIT05FVCwgJnBuX2RncmFtX3Byb3RvKTsKK30KKwordm9pZCBfX2V4aXQgaXNpX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlwaG9uZXRfcHJvdG9fdW5yZWdpc3RlcihQTl9QUk9UT19QSE9ORVQsICZwbl9kZ3JhbV9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC1ncHJzLmMgYi9uZXQvcGhvbmV0L3BlcC1ncHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3OGFmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9waG9uZXQvcGVwLWdwcnMuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIEZpbGU6IHBlcC1ncHJzLmMKKyAqCisgKiBHUFJTIG92ZXIgUGhvbmV0IHBpcGUgZW5kIHBvaW50IHNvY2tldAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBBdXRob3I6IFLDqW1pIERlbmlzLUNvdXJtb250IDxyZW1pLmRlbmlzLWNvdXJtb250QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX3Bob25ldC5oPgorI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CisjaW5jbHVkZSA8bmV0L3Bob25ldC9ncHJzLmg+CisKKyNkZWZpbmUgR1BSU19ERUZBVUxUX01UVSAxNDAwCisKK3N0cnVjdCBncHJzX2RldiB7CisJc3RydWN0IHNvY2sJCSpzazsKKwl2b2lkCQkJKCpvbGRfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqKTsKKwl2b2lkCQkJKCpvbGRfZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKiwgaW50KTsKKwl2b2lkCQkJKCpvbGRfd3JpdGVfc3BhY2UpKHN0cnVjdCBzb2NrICopOworCisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKworCXN0cnVjdCBza19idWZmX2hlYWQJdHhfcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CXR4X3dvcms7CisJc3BpbmxvY2tfdAkJdHhfbG9jazsKKwl1bnNpZ25lZAkJdHhfbWF4OworfTsKKworc3RhdGljIGludCBncHJzX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCB1OCAqcHZmYzsKKwl1OCBidWY7CisKKwlwdmZjID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgMSwgJmJ1Zik7CisJaWYgKCFwdmZjKQorCQlyZXR1cm4gMDsKKwkvKiBMb29rIGF0IElQIHZlcnNpb24gZmllbGQgKi8KKwlzd2l0Y2ggKCpwdmZjID4+IDQpIHsKKwljYXNlIDQ6CisJCXJldHVybiBodG9ucyhFVEhfUF9JUCk7CisJY2FzZSA2OgorCQlyZXR1cm4gaHRvbnMoRVRIX1BfSVBWNik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU29ja2V0IGNhbGxiYWNrcworICovCisKK3N0YXRpYyB2b2lkIGdwcnNfc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZ3Byc19kZXYgKmRldiA9IHNrLT5za191c2VyX2RhdGE7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRV9XQUlUKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2LT5uZXQpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldCk7CisJfQorfQorCitzdGF0aWMgaW50IGdwcnNfcmVjdihzdHJ1Y3QgZ3Byc19kZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1MTYgcHJvdG9jb2wgPSBncHJzX3R5cGVfdHJhbnMoc2tiKTsKKworCWlmICghcHJvdG9jb2wpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkcm9wOworCX0KKworCWlmIChsaWtlbHkoc2tiX2hlYWRyb29tKHNrYikgJiAzKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqcnNrYiwgKmZzOworCQlpbnQgZmxlbiA9IDA7CisKKwkJLyogUGhvbmV0IFBpcGUgZGF0YSBoZWFkZXIgaXMgbWlzYWxpZ25lZCAoMyBieXRlcyksCisJCSAqIHNvIHdyYXAgdGhlIElQIHBhY2tldCBhcyBhIHNpbmdsZSBmcmFnbWVudCBvZiBhbiBoZWFkLWxlc3MKKwkJICogc29ja2V0IGJ1ZmZlci4gVGhlIG5ldHdvcmsgc3RhY2sgd2lsbCBwdWxsIHdoYXQgaXQgbmVlZHMsCisJCSAqIGJ1dCBhdCBsZWFzdCwgdGhlIHdob2xlIElQIHBheWxvYWQgaXMgbm90IG1lbWNweSdkLiAqLworCQlyc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYtPm5ldCwgMCk7CisJCWlmICghcnNrYikgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJc2tiX3NoaW5mbyhyc2tiKS0+ZnJhZ19saXN0ID0gc2tiOworCQlyc2tiLT5sZW4gKz0gc2tiLT5sZW47CisJCXJza2ItPmRhdGFfbGVuICs9IHJza2ItPmxlbjsKKwkJcnNrYi0+dHJ1ZXNpemUgKz0gcnNrYi0+bGVuOworCisJCS8qIEF2b2lkIG5lc3RlZCBmcmFnbWVudHMgKi8KKwkJZm9yIChmcyA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OyBmczsgZnMgPSBmcy0+bmV4dCkKKwkJCWZsZW4gKz0gZnMtPmxlbjsKKwkJc2tiLT5uZXh0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gTlVMTDsKKwkJc2tiLT5sZW4gLT0gZmxlbjsKKwkJc2tiLT5kYXRhX2xlbiAtPSBmbGVuOworCQlza2ItPnRydWVzaXplIC09IGZsZW47CisKKwkJc2tiID0gcnNrYjsKKwl9CisKKwlza2ItPnByb3RvY29sID0gcHJvdG9jb2w7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2ItPmRldiA9IGRldi0+bmV0OworCisJaWYgKGxpa2VseShkZXYtPm5ldC0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRpZl9yeChza2IpOworCQlza2IgPSBOVUxMOworCX0gZWxzZQorCQllcnIgPSAtRU5PREVWOworCitkcm9wOgorCWlmIChza2IpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZ3Byc19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZ3Byc19kZXYgKmRldiA9IHNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gcGVwX3JlYWQoc2spKSAhPSBOVUxMKSB7CisJCXNrYl9vcnBoYW4oc2tiKTsKKwkJZ3Byc19yZWN2KGRldiwgc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdwcnNfd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBncHJzX2RldiAqZGV2ID0gc2stPnNrX3VzZXJfZGF0YTsKKwl1bnNpZ25lZCBjcmVkaXRzID0gcGVwX3dyaXRlYWJsZShzayk7CisKKwlzcGluX2xvY2tfYmgoJmRldi0+dHhfbG9jayk7CisJZGV2LT50eF9tYXggPSBjcmVkaXRzOworCWlmIChjcmVkaXRzID4gc2tiX3F1ZXVlX2xlbigmZGV2LT50eF9xdWV1ZSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXQpOworCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnR4X2xvY2spOworfQorCisvKgorICogTmV0d29yayBkZXZpY2UgY2FsbGJhY2tzCisgKi8KKworc3RhdGljIGludCBncHJzX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3Byc19kZXYgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlICBodG9ucyhFVEhfUF9JUCk6CisJY2FzZSAgaHRvbnMoRVRIX1BfSVBWNik6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrKCZkZXYtPnR4X2xvY2spOworCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbigmZGV2LT50eF9xdWV1ZSkgPCBkZXYtPnR4X21heCkpIHsKKwkJc2tiX3F1ZXVlX3RhaWwoJmRldi0+dHhfcXVldWUsIHNrYik7CisJCXNrYiA9IE5VTEw7CisJfQorCWlmIChza2JfcXVldWVfbGVuKCZkZXYtPnR4X3F1ZXVlKSA+PSBkZXYtPnR4X21heCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOworCXNwaW5fdW5sb2NrKCZkZXYtPnR4X2xvY2spOworCisJc2NoZWR1bGVfd29yaygmZGV2LT50eF93b3JrKTsKKwlpZiAodW5saWtlbHkoc2tiKSkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncHJzX3R4KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ3Byc19kZXYgKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ3Byc19kZXYsIHR4X3dvcmspOworCXN0cnVjdCBzb2NrICpzayA9IGRldi0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmRldi0+dHhfcXVldWUpKSAhPSBOVUxMKSB7CisJCWludCBlcnI7CisKKwkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJc2tiX29ycGhhbihza2IpOworCQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7CisKKwkJbG9ja19zb2NrKHNrKTsKKwkJZXJyID0gcGVwX3dyaXRlKHNrLCBza2IpOworCQlpZiAoZXJyKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkciJXM6IFRYIGVycm9yICglZClcbiIsCisJCQkJCWRldi0+bmV0LT5uYW1lLCBlcnIpOworCQkJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJfQorCQlyZWxlYXNlX3NvY2soc2spOworCX0KKworCWxvY2tfc29jayhzayk7CisJZ3Byc193cml0ZV9zcGFjZShzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKK30KKworc3RhdGljIGludCBncHJzX3NldF9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNTc2KSB8fCAobmV3X210dSA+IChQSE9ORVRfTUFYX01UVSAtIDExKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV0LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdwcnNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IGdwcnNfZGV2ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuICZkZXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBncHJzX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJbmV0LT5mZWF0dXJlcwkJPSBORVRJRl9GX0ZSQUdMSVNUOworCW5ldC0+dHlwZQkJPSBBUlBIUkRfTk9ORTsKKwluZXQtPmZsYWdzCQk9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwluZXQtPm10dQkJPSBHUFJTX0RFRkFVTFRfTVRVOworCW5ldC0+aGFyZF9oZWFkZXJfbGVuCT0gMDsKKwluZXQtPmFkZHJfbGVuCQk9IDA7CisJbmV0LT50eF9xdWV1ZV9sZW4JPSAxMDsKKworCW5ldC0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKwluZXQtPmhhcmRfc3RhcnRfeG1pdAk9IGdwcnNfeG1pdDsgLyogbWFuZGF0b3J5ICovCisJbmV0LT5jaGFuZ2VfbXR1CQk9IGdwcnNfc2V0X210dTsKKwluZXQtPmdldF9zdGF0cwkJPSBncHJzX2dldF9zdGF0czsKK30KKworLyoKKyAqIEV4dGVybmFsIGludGVyZmFjZQorICovCisKKy8qCisgKiBBdHRhY2ggYSBHUFJTIGludGVyZmFjZSB0byBhIGRhdGFncmFtIHNvY2tldC4KKyAqIFJldHVybnMgdGhlIGludGVyZmFjZSBpbmRleCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICovCitpbnQgZ3Byc19hdHRhY2goc3RydWN0IHNvY2sgKnNrKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGlmbmFtZVtdID0gImdwcnMlZCI7CisJc3RydWN0IGdwcnNfZGV2ICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKKwlpbnQgZXJyOworCisJaWYgKHVubGlrZWx5KHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIG5lZWQgcGFja2V0IGJvdW5kYXJpZXMgKi8KKworCS8qIENyZWF0ZSBuZXQgZGV2aWNlICovCisJbmV0ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqZGV2KSwgaWZuYW1lLCBncHJzX3NldHVwKTsKKwlpZiAoIW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlkZXYtPm5ldCA9IG5ldDsKKwlkZXYtPnR4X21heCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+dHhfbG9jayk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZGV2LT50eF9xdWV1ZSk7CisJSU5JVF9XT1JLKCZkZXYtPnR4X3dvcmssIGdwcnNfdHgpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXQpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYobmV0KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsb2NrX3NvY2soc2spOworCWlmICh1bmxpa2VseShzay0+c2tfdXNlcl9kYXRhKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3JlbDsKKwl9CisJaWYgKHVubGlrZWx5KCgxIDw8IHNrLT5za19zdGF0ZSAmIChUQ1BGX0NMT1NFfFRDUEZfTElTVEVOKSkgfHwKKwkJCXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfcmVsOworCX0KKwlzay0+c2tfdXNlcl9kYXRhCT0gZGV2OworCWRldi0+b2xkX3N0YXRlX2NoYW5nZQk9IHNrLT5za19zdGF0ZV9jaGFuZ2U7CisJZGV2LT5vbGRfZGF0YV9yZWFkeQk9IHNrLT5za19kYXRhX3JlYWR5OworCWRldi0+b2xkX3dyaXRlX3NwYWNlCT0gc2stPnNrX3dyaXRlX3NwYWNlOworCXNrLT5za19zdGF0ZV9jaGFuZ2UJPSBncHJzX3N0YXRlX2NoYW5nZTsKKwlzay0+c2tfZGF0YV9yZWFkeQk9IGdwcnNfZGF0YV9yZWFkeTsKKwlzay0+c2tfd3JpdGVfc3BhY2UJPSBncHJzX3dyaXRlX3NwYWNlOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlzb2NrX2hvbGQoc2spOworCWRldi0+c2sgPSBzazsKKworCXByaW50ayhLRVJOX0RFQlVHIiVzOiBhdHRhY2hlZFxuIiwgbmV0LT5uYW1lKTsKKwlncHJzX3dyaXRlX3NwYWNlKHNrKTsgLyoga2ljayBvZmYgVFggKi8KKwlyZXR1cm4gbmV0LT5pZmluZGV4OworCitvdXRfcmVsOgorCXJlbGVhc2Vfc29jayhzayk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0KTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGdwcnNfZGV0YWNoKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgZ3Byc19kZXYgKmRldiA9IHNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IGRldi0+bmV0OworCisJbG9ja19zb2NrKHNrKTsKKwlzay0+c2tfdXNlcl9kYXRhCT0gTlVMTDsKKwlzay0+c2tfc3RhdGVfY2hhbmdlCT0gZGV2LT5vbGRfc3RhdGVfY2hhbmdlOworCXNrLT5za19kYXRhX3JlYWR5CT0gZGV2LT5vbGRfZGF0YV9yZWFkeTsKKwlzay0+c2tfd3JpdGVfc3BhY2UJPSBkZXYtPm9sZF93cml0ZV9zcGFjZTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJcHJpbnRrKEtFUk5fREVCVUciJXM6IGRldGFjaGVkXG4iLCBuZXQtPm5hbWUpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlzb2NrX3B1dChzayk7CisJc2tiX3F1ZXVlX3B1cmdlKCZkZXYtPnR4X3F1ZXVlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvcGVwLmMgYi9uZXQvcGhvbmV0L3BlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmQ1MGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcGhvbmV0L3BlcC5jCkBAIC0wLDAgKzEsMTA3NiBAQAorLyoKKyAqIEZpbGU6IHBlcC5jCisgKgorICogUGhvbmV0IHBpcGUgcHJvdG9jb2wgZW5kIHBvaW50IHNvY2tldAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBBdXRob3I6IFLDqW1pIERlbmlzLUNvdXJtb250IDxyZW1pLmRlbmlzLWNvdXJtb250QG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgorI2luY2x1ZGUgPG5ldC9waG9uZXQvcGVwLmg+CisjaW5jbHVkZSA8bmV0L3Bob25ldC9ncHJzLmg+CisKKy8qIHNrX3N0YXRlIHZhbHVlczoKKyAqIFRDUF9DTE9TRQkJc29jayBub3QgaW4gdXNlIHlldAorICogVENQX0NMT1NFX1dBSVQJZGlzY29ubmVjdGVkIHBpcGUKKyAqIFRDUF9MSVNURU4JCWxpc3RlbmluZyBwaXBlIGVuZHBvaW50CisgKiBUQ1BfU1lOX1JFQ1YJCWNvbm5lY3RlZCBwaXBlIGluIGRpc2FibGVkIHN0YXRlCisgKiBUQ1BfRVNUQUJMSVNIRUQJY29ubmVjdGVkIHBpcGUgaW4gZW5hYmxlZCBzdGF0ZQorICoKKyAqIHBlcF9zb2NrIGxvY2tpbmc6CisgKiAgLSBza19zdGF0ZSwgYWNrcSwgaGxpc3Q6IHNvY2sgbG9jayBuZWVkZWQKKyAqICAtIGxpc3RlbmVyOiByZWFkIG9ubHkKKyAqICAtIHBpcGVfaGFuZGxlOiByZWFkIG9ubHkKKyAqLworCisjZGVmaW5lIENSRURJVFNfTUFYCTEwCisjZGVmaW5lIENSRURJVFNfVEhSCTcKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9wbiBwaXBlX3NydiA9IHsKKwkuc3BuX2ZhbWlseSA9IEFGX1BIT05FVCwKKwkuc3BuX3Jlc291cmNlID0gMHhEOSwgLyogcGlwZSBzZXJ2aWNlICovCit9OworCisjZGVmaW5lIHBlcF9zYl9zaXplKHMpICgoKHMpICsgNSkgJiB+MykgLyogMi1ieXRlcyBoZWFkLCAzMi1iaXRzIGFsaWduZWQgKi8KKworLyogR2V0IHRoZSBuZXh0IFRMViBzdWItYmxvY2suICovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGVwX2dldF9zYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqcHR5cGUsIHU4ICpwbGVuLAorCQkJCQl2b2lkICpidWYpCit7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJc3RydWN0IHsKKwkJdTggc2JfdHlwZTsKKwkJdTggc2JfbGVuOworCX0gKnBoLCBoOworCWludCBidWZsZW4gPSAqcGxlbjsKKworCXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgMiwgJmgpOworCWlmIChwaCA9PSBOVUxMIHx8IHBoLT5zYl9sZW4gPCAyIHx8ICFwc2tiX21heV9wdWxsKHNrYiwgcGgtPnNiX2xlbikpCisJCXJldHVybiBOVUxMOworCXBoLT5zYl9sZW4gLT0gMjsKKwkqcHR5cGUgPSBwaC0+c2JfdHlwZTsKKwkqcGxlbiA9IHBoLT5zYl9sZW47CisKKwlpZiAoYnVmbGVuID4gcGgtPnNiX2xlbikKKwkJYnVmbGVuID0gcGgtPnNiX2xlbjsKKwlkYXRhID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMiwgYnVmbGVuLCBidWYpOworCV9fc2tiX3B1bGwoc2tiLCAyICsgcGgtPnNiX2xlbik7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgcGVwX3JlcGx5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm9za2IsCisJCQl1OCBjb2RlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuLCBnZnBfdCBwcmlvcml0eSkKK3sKKwljb25zdCBzdHJ1Y3QgcG5waXBlaGRyICpvcGggPSBwbnBfaGRyKG9za2IpOworCXN0cnVjdCBwbnBpcGVoZHIgKnBoOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IoTUFYX1BOUElQRV9IRUFERVIgKyBsZW4sIHByaW9yaXR5KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOworCisJc2tiX3Jlc2VydmUoc2tiLCBNQVhfUE5QSVBFX0hFQURFUik7CisJX19za2JfcHV0KHNrYiwgbGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGRhdGEsIGxlbik7CisJX19za2JfcHVzaChza2IsIHNpemVvZigqcGgpKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXBoID0gcG5wX2hkcihza2IpOworCXBoLT51dGlkID0gb3BoLT51dGlkOworCXBoLT5tZXNzYWdlX2lkID0gb3BoLT5tZXNzYWdlX2lkICsgMTsgLyogUkVRIC0+IFJFU1AgKi8KKwlwaC0+cGlwZV9oYW5kbGUgPSBvcGgtPnBpcGVfaGFuZGxlOworCXBoLT5lcnJvcl9jb2RlID0gY29kZTsKKworCXJldHVybiBwbl9za2Jfc2VuZChzaywgc2tiLCAmcGlwZV9zcnYpOworfQorCisjZGVmaW5lIFBBRCAweDAwCitzdGF0aWMgaW50IHBlcF9hY2NlcHRfY29ubihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RhdGljIGNvbnN0IHU4IGRhdGFbMjBdID0geworCQlQQUQsIFBBRCwgUEFELCAyIC8qIHN1Yi1ibG9ja3MgKi8sCisJCVBOX1BJUEVfU0JfUkVRVUlSRURfRkNfVFgsIHBlcF9zYl9zaXplKDUpLCAzLCBQQUQsCisJCQlQTl9NVUxUSV9DUkVESVRfRkxPV19DT05UUk9MLAorCQkJUE5fT05FX0NSRURJVF9GTE9XX0NPTlRST0wsCisJCQlQTl9MRUdBQ1lfRkxPV19DT05UUk9MLAorCQkJUEFELAorCQlQTl9QSVBFX1NCX1BSRUZFUlJFRF9GQ19SWCwgcGVwX3NiX3NpemUoNSksIDMsIFBBRCwKKwkJCVBOX01VTFRJX0NSRURJVF9GTE9XX0NPTlRST0wsCisJCQlQTl9PTkVfQ1JFRElUX0ZMT1dfQ09OVFJPTCwKKwkJCVBOX0xFR0FDWV9GTE9XX0NPTlRST0wsCisJCQlQQUQsCisJfTsKKworCW1pZ2h0X3NsZWVwKCk7CisJcmV0dXJuIHBlcF9yZXBseShzaywgc2tiLCBQTl9QSVBFX05PX0VSUk9SLCBkYXRhLCBzaXplb2YoZGF0YSksCisJCQkJR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgcGVwX3JlamVjdF9jb25uKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggY29kZSkKK3sKKwlzdGF0aWMgY29uc3QgdTggZGF0YVs0XSA9IHsgUEFELCBQQUQsIFBBRCwgMCAvKiBzdWItYmxvY2tzICovIH07CisJV0FSTl9PTihjb2RlID09IFBOX1BJUEVfTk9fRVJST1IpOworCXJldHVybiBwZXBfcmVwbHkoc2ssIHNrYiwgY29kZSwgZGF0YSwgc2l6ZW9mKGRhdGEpLCBHRlBfQVRPTUlDKTsKK30KKworLyogQ29udHJvbCByZXF1ZXN0cyBhcmUgbm90IHNlbnQgYnkgdGhlIHBpcGUgc2VydmljZSBhbmQgaGF2ZSBhIHNwZWNpZmljCisgKiBtZXNzYWdlIGZvcm1hdC4gKi8KK3N0YXRpYyBpbnQgcGVwX2N0cmxyZXFfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqb3NrYiwgdTggY29kZSwKKwkJCQlnZnBfdCBwcmlvcml0eSkKK3sKKwljb25zdCBzdHJ1Y3QgcG5waXBlaGRyICpvcGggPSBwbnBfaGRyKG9za2IpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHBucGlwZWhkciAqcGg7CisJc3RydWN0IHNvY2thZGRyX3BuIGRzdDsKKworCXNrYiA9IGFsbG9jX3NrYihNQVhfUE5QSVBFX0hFQURFUiArIDQsIHByaW9yaXR5KTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOworCisJc2tiX3Jlc2VydmUoc2tiLCBNQVhfUEhPTkVUX0hFQURFUik7CisJcGggPSAoc3RydWN0IHBucGlwZWhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBoKSArIDQpOworCisJcGgtPnV0aWQgPSBvcGgtPnV0aWQ7CisJcGgtPm1lc3NhZ2VfaWQgPSBQTlNfUEVQX0NUUkxfUkVTUDsKKwlwaC0+cGlwZV9oYW5kbGUgPSBvcGgtPnBpcGVfaGFuZGxlOworCXBoLT5kYXRhWzBdID0gb3BoLT5kYXRhWzFdOyAvKiBDVFJMIGlkICovCisJcGgtPmRhdGFbMV0gPSBvcGgtPmRhdGFbMF07IC8qIFBFUCB0eXBlICovCisJcGgtPmRhdGFbMl0gPSBjb2RlOyAvKiBlcnJvciBjb2RlLCBhdCBhbiB1c3VhbCBvZmZzZXQgKi8KKwlwaC0+ZGF0YVszXSA9IFBBRDsKKwlwaC0+ZGF0YVs0XSA9IFBBRDsKKworCXBuX3NrYl9nZXRfc3JjX3NvY2thZGRyKG9za2IsICZkc3QpOworCXJldHVybiBwbl9za2Jfc2VuZChzaywgc2tiLCAmZHN0KTsKK30KKworc3RhdGljIGludCBwaXBlX3NuZF9zdGF0dXMoc3RydWN0IHNvY2sgKnNrLCB1OCB0eXBlLCB1OCBzdGF0dXMsIGdmcF90IHByaW9yaXR5KQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCXN0cnVjdCBwbnBpcGVoZHIgKnBoOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IoTUFYX1BOUElQRV9IRUFERVIgKyA0LCBwcmlvcml0eSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKKworCXNrYl9yZXNlcnZlKHNrYiwgTUFYX1BOUElQRV9IRUFERVIgKyA0KTsKKwlfX3NrYl9wdXNoKHNrYiwgc2l6ZW9mKCpwaCkgKyA0KTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXBoID0gcG5wX2hkcihza2IpOworCXBoLT51dGlkID0gMDsKKwlwaC0+bWVzc2FnZV9pZCA9IFBOU19QRVBfU1RBVFVTX0lORDsKKwlwaC0+cGlwZV9oYW5kbGUgPSBwbi0+cGlwZV9oYW5kbGU7CisJcGgtPnBlcF90eXBlID0gUE5fUEVQX1RZUEVfQ09NTU9OOworCXBoLT5kYXRhWzFdID0gdHlwZTsKKwlwaC0+ZGF0YVsyXSA9IFBBRDsKKwlwaC0+ZGF0YVszXSA9IFBBRDsKKwlwaC0+ZGF0YVs0XSA9IHN0YXR1czsKKworCXJldHVybiBwbl9za2Jfc2VuZChzaywgc2tiLCAmcGlwZV9zcnYpOworfQorCisvKiBTZW5kIG91ciBSWCBmbG93IGNvbnRyb2wgaW5mb3JtYXRpb24gdG8gdGhlIHNlbmRlci4KKyAqIFNvY2tldCBtdXN0IGJlIGxvY2tlZC4gKi8KK3N0YXRpYyB2b2lkIHBpcGVfZ3JhbnRfY3JlZGl0cyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisKKwlCVUdfT04oc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCk7CisKKwlzd2l0Y2ggKHBuLT5yeF9mYykgeworCWNhc2UgUE5fTEVHQUNZX0ZMT1dfQ09OVFJPTDogLyogVE9ETyAqLworCQlicmVhazsKKwljYXNlIFBOX09ORV9DUkVESVRfRkxPV19DT05UUk9MOgorCQlwaXBlX3NuZF9zdGF0dXMoc2ssIFBOX1BFUF9JTkRfRkxPV19DT05UUk9MLAorCQkJCVBFUF9JTkRfUkVBRFksIEdGUF9BVE9NSUMpOworCQlwbi0+cnhfY3JlZGl0cyA9IDE7CisJCWJyZWFrOworCWNhc2UgUE5fTVVMVElfQ1JFRElUX0ZMT1dfQ09OVFJPTDoKKwkJaWYgKChwbi0+cnhfY3JlZGl0cyArIENSRURJVFNfVEhSKSA+IENSRURJVFNfTUFYKQorCQkJYnJlYWs7CisJCWlmIChwaXBlX3NuZF9zdGF0dXMoc2ssIFBOX1BFUF9JTkRfSURfTUNGQ19HUkFOVF9DUkVESVRTLAorCQkJCQlDUkVESVRTX01BWCAtIHBuLT5yeF9jcmVkaXRzLAorCQkJCQlHRlBfQVRPTUlDKSA9PSAwKQorCQkJcG4tPnJ4X2NyZWRpdHMgPSBDUkVESVRTX01BWDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHBpcGVfcmN2X3N0YXR1cyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisJc3RydWN0IHBucGlwZWhkciAqaGRyID0gcG5wX2hkcihza2IpOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpICsgNCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkci0+ZGF0YVswXSAhPSBQTl9QRVBfVFlQRV9DT01NT04pIHsKKwkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyJQaG9uZXQgdW5rbm93biBQRVAgdHlwZTogJXVcbiIsCisJCQkJKHVuc2lnbmVkKWhkci0+ZGF0YVswXSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlzd2l0Y2ggKGhkci0+ZGF0YVsxXSkgeworCWNhc2UgUE5fUEVQX0lORF9GTE9XX0NPTlRST0w6CisJCXN3aXRjaCAocG4tPnR4X2ZjKSB7CisJCWNhc2UgUE5fTEVHQUNZX0ZMT1dfQ09OVFJPTDoKKwkJCXN3aXRjaCAoaGRyLT5kYXRhWzRdKSB7CisJCQljYXNlIFBFUF9JTkRfQlVTWToKKwkJCQlwbi0+dHhfY3JlZGl0cyA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFBFUF9JTkRfUkVBRFk6CisJCQkJcG4tPnR4X2NyZWRpdHMgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUE5fT05FX0NSRURJVF9GTE9XX0NPTlRST0w6CisJCQlpZiAoaGRyLT5kYXRhWzRdID09IFBFUF9JTkRfUkVBRFkpCisJCQkJcG4tPnR4X2NyZWRpdHMgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBOX1BFUF9JTkRfSURfTUNGQ19HUkFOVF9DUkVESVRTOgorCQlpZiAocG4tPnR4X2ZjICE9IFBOX01VTFRJX0NSRURJVF9GTE9XX0NPTlRST0wpCisJCQlicmVhazsKKwkJaWYgKHBuLT50eF9jcmVkaXRzICsgaGRyLT5kYXRhWzRdID4gMHhmZikKKwkJCXBuLT50eF9jcmVkaXRzID0gMHhmZjsKKwkJZWxzZQorCQkJcG4tPnR4X2NyZWRpdHMgKz0gaGRyLT5kYXRhWzRdOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUciUGhvbmV0IHVua25vd24gUEVQIGluZGljYXRpb246ICV1XG4iLAorCQkJCSh1bnNpZ25lZCloZHItPmRhdGFbMV0pOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCWlmIChwbi0+dHhfY3JlZGl0cykKKwkJc2stPnNrX3dyaXRlX3NwYWNlKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaXBlX3Jjdl9jcmVhdGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlzdHJ1Y3QgcG5waXBlaGRyICpoZHIgPSBwbnBfaGRyKHNrYik7CisJdTggbl9zYiA9IGhkci0+ZGF0YVswXTsKKworCXBuLT5yeF9mYyA9IHBuLT50eF9mYyA9IFBOX0xFR0FDWV9GTE9XX0NPTlRST0w7CisJX19za2JfcHVsbChza2IsIHNpemVvZigqaGRyKSk7CisJd2hpbGUgKG5fc2IgPiAwKSB7CisJCXU4IHR5cGUsIGJ1ZlsyXSwgbGVuID0gc2l6ZW9mKGJ1Zik7CisJCXU4ICpkYXRhID0gcGVwX2dldF9zYihza2IsICZ0eXBlLCAmbGVuLCBidWYpOworCisJCWlmIChkYXRhID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgUE5fUElQRV9TQl9ORUdPVElBVEVEX0ZDOgorCQkJaWYgKGxlbiA8IDIgfHwgKGRhdGFbMF0gfCBkYXRhWzFdKSA+IDMpCisJCQkJYnJlYWs7CisJCQlwbi0+dHhfZmMgPSBkYXRhWzBdICYgMzsKKwkJCXBuLT5yeF9mYyA9IGRhdGFbMV0gJiAzOworCQkJYnJlYWs7CisJCX0KKwkJbl9zYi0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUXVldWUgYW4gc2tiIHRvIGEgY29ubmVjdGVkIHNvY2suCisgKiBTb2NrZXQgbG9jayBtdXN0IGJlIGhlbGQuICovCitzdGF0aWMgaW50IHBpcGVfZG9fcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlzdHJ1Y3QgcG5waXBlaGRyICpoZHIgPSBwbnBfaGRyKHNrYik7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04oc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRV9XQUlUKTsKKworCXN3aXRjaCAoaGRyLT5tZXNzYWdlX2lkKSB7CisJY2FzZSBQTlNfUEVQX0NPTk5FQ1RfUkVROgorCQlwZXBfcmVqZWN0X2Nvbm4oc2ssIHNrYiwgUE5fUElQRV9FUlJfUEVQX0lOX1VTRSk7CisJCWJyZWFrOworCisJY2FzZSBQTlNfUEVQX0RJU0NPTk5FQ1RfUkVROgorCQlwZXBfcmVwbHkoc2ssIHNrYiwgUE5fUElQRV9OT19FUlJPUiwgTlVMTCwgMCwgR0ZQX0FUT01JQyk7CisJCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRV9XQUlUOworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQlicmVhazsKKworCWNhc2UgUE5TX1BFUF9FTkFCTEVfUkVROgorCQkvKiBXYWl0IGZvciBQTlNfUElQRV8oRU5BQkxFRHxSRURJUkVDVEVEKV9JTkQgKi8KKwkJcGVwX3JlcGx5KHNrLCBza2IsIFBOX1BJUEVfTk9fRVJST1IsIE5VTEwsIDAsIEdGUF9BVE9NSUMpOworCQlicmVhazsKKworCWNhc2UgUE5TX1BFUF9SRVNFVF9SRVE6CisJCXN3aXRjaCAoaGRyLT5zdGF0ZV9hZnRlcl9yZXNldCkgeworCQljYXNlIFBOX1BJUEVfRElTQUJMRToKKwkJCXBuLT5pbml0X2VuYWJsZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBQTl9QSVBFX0VOQUJMRToKKwkJCXBuLT5pbml0X2VuYWJsZSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogbm90IGFsbG93ZWQgdG8gc2VuZCBhbiBlcnJvciBoZXJlIT8gKi8KKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFBOU19QRVBfRElTQUJMRV9SRVE6CisJCXBuLT50eF9jcmVkaXRzID0gMDsKKwkJcGVwX3JlcGx5KHNrLCBza2IsIFBOX1BJUEVfTk9fRVJST1IsIE5VTEwsIDAsIEdGUF9BVE9NSUMpOworCQlicmVhazsKKworCWNhc2UgUE5TX1BFUF9DVFJMX1JFUToKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnBuLT5jdHJscmVxX3F1ZXVlKSA+PSBQTlBJUEVfQ1RSTFJFUV9NQVgpCisJCQlicmVhazsKKwkJX19za2JfcHVsbChza2IsIDQpOworCQlxdWV1ZSA9ICZwbi0+Y3RybHJlcV9xdWV1ZTsKKwkJZ290byBxdWV1ZTsKKworCWNhc2UgUE5TX1BJUEVfREFUQToKKwkJX19za2JfcHVsbChza2IsIDMpOyAvKiBQaXBlIGRhdGEgaGVhZGVyICovCisJCWlmICghcG5fZmxvd19zYWZlKHBuLT5yeF9mYykpIHsKKwkJCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwkJCWlmICghZXJyKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocG4tPnJ4X2NyZWRpdHMgPT0gMCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQlwbi0+cnhfY3JlZGl0cy0tOworCQlxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwkJZ290byBxdWV1ZTsKKworCWNhc2UgUE5TX1BFUF9TVEFUVVNfSU5EOgorCQlwaXBlX3Jjdl9zdGF0dXMoc2ssIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBQTlNfUElQRV9SRURJUkVDVEVEX0lORDoKKwkJZXJyID0gcGlwZV9yY3ZfY3JlYXRlZChzaywgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBOU19QSVBFX0NSRUFURURfSU5EOgorCQllcnIgPSBwaXBlX3Jjdl9jcmVhdGVkKHNrLCBza2IpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgUE5TX1BJUEVfUkVTRVRfSU5EOgorCQlpZiAoIXBuLT5pbml0X2VuYWJsZSkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFBOU19QSVBFX0VOQUJMRURfSU5EOgorCQlpZiAoIXBuX2Zsb3dfc2FmZShwbi0+dHhfZmMpKSB7CisJCQlwbi0+dHhfY3JlZGl0cyA9IDE7CisJCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOworCQl9CisJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKQorCQkJYnJlYWs7IC8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOworCQlwaXBlX2dyYW50X2NyZWRpdHMoc2spOworCQlicmVhazsKKworCWNhc2UgUE5TX1BJUEVfRElTQUJMRURfSU5EOgorCQlzay0+c2tfc3RhdGUgPSBUQ1BfU1lOX1JFQ1Y7CisJCXBuLT5yeF9jcmVkaXRzID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHIlBob25ldCB1bmtub3duIFBFUCBtZXNzYWdlOiAldVxuIiwKKwkJCQloZHItPm1lc3NhZ2VfaWQpOworCQllcnIgPSAtRUlOVkFMOworCX0KK291dDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gZXJyOworCitxdWV1ZToKKwlza2ItPmRldiA9IE5VTEw7CisJc2tiX3NldF9vd25lcl9yKHNrYiwgc2spOworCWVyciA9IHNrYi0+bGVuOworCXNrYl9xdWV1ZV90YWlsKHF1ZXVlLCBza2IpOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQlzay0+c2tfZGF0YV9yZWFkeShzaywgZXJyKTsKKwlyZXR1cm4gMDsKK30KKworLyogRGVzdHJveSBjb25uZWN0ZWQgc29jay4gKi8KK3N0YXRpYyB2b2lkIHBpcGVfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZwbi0+Y3RybHJlcV9xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgcGVwX2Nvbm5yZXFfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqbmV3c2s7CisJc3RydWN0IHBlcF9zb2NrICpuZXdwbiwgKnBuID0gcGVwX3NrKHNrKTsKKwlzdHJ1Y3QgcG5waXBlaGRyICpoZHI7CisJc3RydWN0IHNvY2thZGRyX3BuIGRzdDsKKwl1MTYgcGVlcl90eXBlOworCXU4IHBpcGVfaGFuZGxlLCBlbmFibGVkLCBuX3NiOworCisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikgKyA0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZHIgPSBwbnBfaGRyKHNrYik7CisJcGlwZV9oYW5kbGUgPSBoZHItPnBpcGVfaGFuZGxlOworCXN3aXRjaCAoaGRyLT5zdGF0ZV9hZnRlcl9jb25uZWN0KSB7CisJY2FzZSBQTl9QSVBFX0RJU0FCTEU6CisJCWVuYWJsZWQgPSAwOworCQlicmVhazsKKwljYXNlIFBOX1BJUEVfRU5BQkxFOgorCQllbmFibGVkID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGVwX3JlamVjdF9jb25uKHNrLCBza2IsIFBOX1BJUEVfRVJSX0lOVkFMSURfUEFSQU0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGVlcl90eXBlID0gaGRyLT5vdGhlcl9wZXBfdHlwZSA8PCA4OworCisJaWYgKHVubGlrZWx5KHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB8fCBza19hY2NlcHRxX2lzX2Z1bGwoc2spKSB7CisJCXBlcF9yZWplY3RfY29ubihzaywgc2tiLCBQTl9QSVBFX0VSUl9QRVBfSU5fVVNFKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCS8qIFBhcnNlIHN1Yi1ibG9ja3MgKG9wdGlvbnMpICovCisJbl9zYiA9IGhkci0+ZGF0YVs0XTsKKwl3aGlsZSAobl9zYiA+IDApIHsKKwkJdTggdHlwZSwgYnVmWzFdLCBsZW4gPSBzaXplb2YoYnVmKTsKKwkJY29uc3QgdTggKmRhdGEgPSBwZXBfZ2V0X3NiKHNrYiwgJnR5cGUsICZsZW4sIGJ1Zik7CisKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBQTl9QSVBFX1NCX0NPTk5FQ1RfUkVRX1BFUF9TVUJfVFlQRToKKwkJCWlmIChsZW4gPCAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcGVlcl90eXBlID0gKHBlZXJfdHlwZSAmIDB4ZmYwMCkgfCBkYXRhWzBdOworCQkJYnJlYWs7CisJCX0KKwkJbl9zYi0tOworCX0KKworCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENyZWF0ZSBhIG5ldyB0by1iZS1hY2NlcHRlZCBzb2NrICovCisJbmV3c2sgPSBza19hbGxvYyhzb2NrX25ldChzayksIFBGX1BIT05FVCwgR0ZQX0FUT01JQywgc2stPnNrX3Byb3QpOworCWlmICghbmV3c2spIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzb2NrX2luaXRfZGF0YShOVUxMLCBuZXdzayk7CisJbmV3c2stPnNrX3N0YXRlID0gVENQX1NZTl9SRUNWOworCW5ld3NrLT5za19iYWNrbG9nX3JjdiA9IHBpcGVfZG9fcmN2OworCW5ld3NrLT5za19wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKKwluZXdzay0+c2tfZGVzdHJ1Y3QgPSBwaXBlX2Rlc3RydWN0OworCisJbmV3cG4gPSBwZXBfc2sobmV3c2spOworCXBuX3NrYl9nZXRfZHN0X3NvY2thZGRyKHNrYiwgJmRzdCk7CisJbmV3cG4tPnBuX3NrLnNvYmplY3QgPSBwbl9zb2NrYWRkcl9nZXRfb2JqZWN0KCZkc3QpOworCW5ld3BuLT5wbl9zay5yZXNvdXJjZSA9IHBuLT5wbl9zay5yZXNvdXJjZTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZuZXdwbi0+Y3RybHJlcV9xdWV1ZSk7CisJbmV3cG4tPnBpcGVfaGFuZGxlID0gcGlwZV9oYW5kbGU7CisJbmV3cG4tPnBlZXJfdHlwZSA9IHBlZXJfdHlwZTsKKwluZXdwbi0+cnhfY3JlZGl0cyA9IG5ld3BuLT50eF9jcmVkaXRzID0gMDsKKwluZXdwbi0+cnhfZmMgPSBuZXdwbi0+dHhfZmMgPSBQTl9MRUdBQ1lfRkxPV19DT05UUk9MOworCW5ld3BuLT5pbml0X2VuYWJsZSA9IGVuYWJsZWQ7CisKKwlCVUdfT04oIXNrYl9xdWV1ZV9lbXB0eSgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUpKTsKKwlza2JfcXVldWVfaGVhZCgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCXNrLT5za19kYXRhX3JlYWR5KHNrLCAwKTsKKworCXNrX2FjY2VwdHFfYWRkZWQoc2spOworCXNrX2FkZF9ub2RlKG5ld3NrLCAmcG4tPmFja3EpOworCXJldHVybiAwOworfQorCisvKiBMaXN0ZW5pbmcgc29jayBtdXN0IGJlIGxvY2tlZCAqLworc3RhdGljIHN0cnVjdCBzb2NrICpwZXBfZmluZF9waXBlKGNvbnN0IHN0cnVjdCBobGlzdF9oZWFkICpobGlzdCwKKwkJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpkc3QsCisJCQkJCXU4IHBpcGVfaGFuZGxlKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBzb2NrICpza25vZGU7CisJdTE2IGRvYmogPSBwbl9zb2NrYWRkcl9nZXRfb2JqZWN0KGRzdCk7CisKKwlza19mb3JfZWFjaChza25vZGUsIG5vZGUsIGhsaXN0KSB7CisJCXN0cnVjdCBwZXBfc29jayAqcG5ub2RlID0gcGVwX3NrKHNrbm9kZSk7CisKKwkJLyogUG9ydHMgbWF0Y2gsIGJ1dCBhZGRyZXNzZXMgbWlnaHQgbm90OiAqLworCQlpZiAocG5ub2RlLT5wbl9zay5zb2JqZWN0ICE9IGRvYmopCisJCQljb250aW51ZTsKKwkJaWYgKHBubm9kZS0+cGlwZV9oYW5kbGUgIT0gcGlwZV9oYW5kbGUpCisJCQljb250aW51ZTsKKwkJaWYgKHNrbm9kZS0+c2tfc3RhdGUgPT0gVENQX0NMT1NFX1dBSVQpCisJCQljb250aW51ZTsKKworCQlzb2NrX2hvbGQoc2tub2RlKTsKKwkJcmV0dXJuIHNrbm9kZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBEZWxpdmVyIGFuIHNrYiB0byBhIGxpc3RlbmluZyBzb2NrLgorICogU29ja2V0IGxvY2sgbXVzdCBiZSBoZWxkLgorICogV2UgdGhlbiBxdWV1ZSB0aGUgc2tiIHRvIHRoZSByaWdodCBjb25uZWN0ZWQgc29jayAoaWYgYW55KS4KKyAqLworc3RhdGljIGludCBwZXBfZG9fcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlzdHJ1Y3Qgc29jayAqc2tub2RlOworCXN0cnVjdCBwbnBpcGVoZHIgKmhkciA9IHBucF9oZHIoc2tiKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfcG4gZHN0OworCWludCBlcnIgPSBORVRfUlhfU1VDQ0VTUzsKKwl1OCBwaXBlX2hhbmRsZTsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpCisJCWdvdG8gZHJvcDsKKworCWhkciA9IHBucF9oZHIoc2tiKTsKKwlwaXBlX2hhbmRsZSA9IGhkci0+cGlwZV9oYW5kbGU7CisJaWYgKHBpcGVfaGFuZGxlID09IFBOX1BJUEVfSU5WQUxJRF9IQU5ETEUpCisJCWdvdG8gZHJvcDsKKworCXBuX3NrYl9nZXRfZHN0X3NvY2thZGRyKHNrYiwgJmRzdCk7CisKKwkvKiBMb29rIGZvciBhbiBleGlzdGluZyBwaXBlIGhhbmRsZSAqLworCXNrbm9kZSA9IHBlcF9maW5kX3BpcGUoJnBuLT5obGlzdCwgJmRzdCwgcGlwZV9oYW5kbGUpOworCWlmIChza25vZGUpCisJCXJldHVybiBza19yZWNlaXZlX3NrYihza25vZGUsIHNrYiwgMSk7CisKKwkvKiBMb29rIGZvciBhIHBpcGUgaGFuZGxlIHBlbmRpbmcgYWNjZXB0ICovCisJc2tub2RlID0gcGVwX2ZpbmRfcGlwZSgmcG4tPmFja3EsICZkc3QsIHBpcGVfaGFuZGxlKTsKKwlpZiAoc2tub2RlKSB7CisJCXNvY2tfcHV0KHNrbm9kZSk7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIlBob25ldCB1bmNvbm5lY3RlZCBQRVAgaWdub3JlZCIpOworCQllcnIgPSBORVRfUlhfRFJPUDsKKwkJZ290byBkcm9wOworCX0KKworCXN3aXRjaCAoaGRyLT5tZXNzYWdlX2lkKSB7CisJY2FzZSBQTlNfUEVQX0NPTk5FQ1RfUkVROgorCQllcnIgPSBwZXBfY29ubnJlcV9yY3Yoc2ssIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBQTlNfUEVQX0RJU0NPTk5FQ1RfUkVROgorCQlwZXBfcmVwbHkoc2ssIHNrYiwgUE5fUElQRV9OT19FUlJPUiwgTlVMTCwgMCwgR0ZQX0FUT01JQyk7CisJCWJyZWFrOworCisJY2FzZSBQTlNfUEVQX0NUUkxfUkVROgorCQlwZXBfY3RybHJlcV9lcnJvcihzaywgc2tiLCBQTl9QSVBFX0lOVkFMSURfSEFORExFLCBHRlBfQVRPTUlDKTsKKwkJYnJlYWs7CisKKwljYXNlIFBOU19QRVBfUkVTRVRfUkVROgorCWNhc2UgUE5TX1BFUF9FTkFCTEVfUkVROgorCWNhc2UgUE5TX1BFUF9ESVNBQkxFX1JFUToKKwkJLyogaW52YWxpZCBoYW5kbGUgaXMgbm90IGV2ZW4gYWxsb3dlZCBoZXJlISAqLworCWRlZmF1bHQ6CisJCWVyciA9IE5FVF9SWF9EUk9QOworCX0KK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworLyogYXNzb2NpYXRlZCBzb2NrZXQgY2Vhc2VzIHRvIGV4aXN0ICovCitzdGF0aWMgdm9pZCBwZXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlpbnQgaWZpbmRleCA9IDA7CisKKwlza19jb21tb25fcmVsZWFzZShzayk7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgeworCQkvKiBEZXN0cm95IHRoZSBsaXN0ZW4gcXVldWUgKi8KKwkJc3RydWN0IHNvY2sgKnNrbm9kZTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKnAsICpuOworCisJCXNrX2Zvcl9lYWNoX3NhZmUoc2tub2RlLCBwLCBuLCAmcG4tPmFja3EpCisJCQlza19kZWxfbm9kZV9pbml0KHNrbm9kZSk7CisJCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKKwl9CisJaWZpbmRleCA9IHBuLT5pZmluZGV4OworCXBuLT5pZmluZGV4ID0gMDsKKwlyZWxlYXNlX3NvY2soc2spOworCisJaWYgKGlmaW5kZXgpCisJCWdwcnNfZGV0YWNoKHNrKTsKK30KKworc3RhdGljIGludCBwZXBfd2FpdF9jb25ucmVxKHN0cnVjdCBzb2NrICpzaywgaW50IG5vYmxvY2spCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCWxvbmcgdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBub2Jsb2NrKTsKKworCWZvciAoOzspIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghaGxpc3RfZW1wdHkoJnBuLT5hY2txKSkKKwkJCWJyZWFrOworCQlpZiAoIXRpbWVvKQorCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpCisJCQlyZXR1cm4gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKworCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZzay0+c2tfc29ja2V0LT53YWl0LCAmd2FpdCwKKwkJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisJCWZpbmlzaF93YWl0KCZzay0+c2tfc29ja2V0LT53YWl0LCAmd2FpdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqcGVwX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzLCBpbnQgKmVycnApCit7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisJc3RydWN0IHNvY2sgKm5ld3NrID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3NrYjsKKwlpbnQgZXJyOworCisJbG9ja19zb2NrKHNrKTsKKwllcnIgPSBwZXBfd2FpdF9jb25ucmVxKHNrLCBmbGFncyAmIE9fTk9OQkxPQ0spOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJbmV3c2sgPSBfX3NrX2hlYWQoJnBuLT5hY2txKTsKKworCW9za2IgPSBza2JfZGVxdWV1ZSgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUpOworCWVyciA9IHBlcF9hY2NlcHRfY29ubihuZXdzaywgb3NrYik7CisJaWYgKGVycikgeworCQlza2JfcXVldWVfaGVhZCgmbmV3c2stPnNrX3JlY2VpdmVfcXVldWUsIG9za2IpOworCQluZXdzayA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXNvY2tfaG9sZChzayk7CisJcGVwX3NrKG5ld3NrKS0+bGlzdGVuZXIgPSBzazsKKworCXNvY2tfaG9sZChuZXdzayk7CisJc2tfZGVsX25vZGVfaW5pdChuZXdzayk7CisJc2tfYWNjZXB0cV9yZW1vdmVkKHNrKTsKKwlza19hZGRfbm9kZShuZXdzaywgJnBuLT5obGlzdCk7CisJX19zb2NrX3B1dChuZXdzayk7CisKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCSplcnJwID0gZXJyOworCXJldHVybiBuZXdzazsKK30KKworc3RhdGljIGludCBwZXBfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlpbnQgYW5zdzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DSU5ROgorCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlsb2NrX3NvY2soc2spOworCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkKKwkJICYmICFza2JfcXVldWVfZW1wdHkoJnBuLT5jdHJscmVxX3F1ZXVlKSkKKwkJCWFuc3cgPSBza2JfcGVlaygmcG4tPmN0cmxyZXFfcXVldWUpLT5sZW47CisJCWVsc2UgaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKKwkJCWFuc3cgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpLT5sZW47CisJCWVsc2UKKwkJCWFuc3cgPSAwOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcHV0X3VzZXIoYW5zdywgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgcGVwX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCisJSU5JVF9ITElTVF9IRUFEKCZwbi0+YWNrcSk7CisJSU5JVF9ITElTVF9IRUFEKCZwbi0+aGxpc3QpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBuLT5jdHJscmVxX3F1ZXVlKTsKKwlwbi0+cGlwZV9oYW5kbGUgPSBQTl9QSVBFX0lOVkFMSURfSEFORExFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCWludCB2YWwgPSAwLCBlcnIgPSAwOworCisJaWYgKGxldmVsICE9IFNPTF9QTlBJUEUpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJaWYgKG9wdGxlbiA+PSBzaXplb2YoaW50KSkgeworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBvcHR2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbG9ja19zb2NrKHNrKTsKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFBOUElQRV9FTkNBUDoKKwkJaWYgKHZhbCAmJiB2YWwgIT0gUE5QSVBFX0VOQ0FQX0lQKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFwbi0+aWZpbmRleCA9PSAhdmFsKQorCQkJYnJlYWs7IC8qIE5vdGhpbmcgdG8gZG8hICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZhbCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCWVyciA9IGdwcnNfYXR0YWNoKHNrKTsKKwkJCWlmIChlcnIgPiAwKSB7CisJCQkJcG4tPmlmaW5kZXggPSBlcnI7CisJCQkJZXJyID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBuLT5pZmluZGV4ID0gMDsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlncHJzX2RldGFjaChzayk7CisJCQllcnIgPSAwOworCQl9CisJCWdvdG8gb3V0X25vcmVsOworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9QUk9UT09QVDsKKwl9CisJcmVsZWFzZV9zb2NrKHNrKTsKKworb3V0X25vcmVsOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGVwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKwlpbnQgbGVuLCB2YWw7CisKKwlpZiAobGV2ZWwgIT0gU09MX1BOUElQRSkKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgUE5QSVBFX0VOQ0FQOgorCQl2YWwgPSBwbi0+aWZpbmRleCA/IFBOUElQRV9FTkNBUF9JUCA6IFBOUElQRV9FTkNBUF9OT05FOworCQlicmVhazsKKwljYXNlIFBOUElQRV9JRklOREVYOgorCQl2YWwgPSBwbi0+aWZpbmRleDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwl9CisKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemVvZihpbnQpLCBsZW4pOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIG9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpcGVfc2tiX3NlbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCXN0cnVjdCBwbnBpcGVoZHIgKnBoOworCisJc2tiX3B1c2goc2tiLCAzKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXBoID0gcG5wX2hkcihza2IpOworCXBoLT51dGlkID0gMDsKKwlwaC0+bWVzc2FnZV9pZCA9IFBOU19QSVBFX0RBVEE7CisJcGgtPnBpcGVfaGFuZGxlID0gcG4tPnBpcGVfaGFuZGxlOworCWlmIChwbl9mbG93X3NhZmUocG4tPnR4X2ZjKSAmJiBwbi0+dHhfY3JlZGl0cykKKwkJcG4tPnR4X2NyZWRpdHMtLTsKKworCXJldHVybiBwbl9za2Jfc2VuZChzaywgc2tiLCAmcGlwZV9zcnYpOworfQorCitzdGF0aWMgaW50IHBlcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWxvbmcgdGltZW87CisJaW50IGZsYWdzID0gbXNnLT5tc2dfZmxhZ3M7CisJaW50IGVyciwgZG9uZTsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19PT0IgfHwgIShtc2ctPm1zZ19mbGFncyAmIE1TR19FT1IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlsb2NrX3NvY2soc2spOworCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOworCWlmICgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfTElTVEVOfFRDUEZfQ0xPU0UpKSB7CisJCWVyciA9IC1FTk9UQ09OTjsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CisJCS8qIFdhaXQgdW50aWwgdGhlIHBpcGUgZ2V0cyB0byBlbmFibGVkIHN0YXRlICovCitkaXNhYmxlZDoKKwkJZXJyID0gc2tfc3RyZWFtX3dhaXRfY29ubmVjdChzaywgJnRpbWVvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFX1dBSVQpIHsKKwkJCWVyciA9IC1FQ09OTlJFU0VUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJQlVHX09OKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpOworCisJLyogV2FpdCB1bnRpbCBmbG93IGNvbnRyb2wgYWxsb3dzIFRYICovCisJZG9uZSA9IHBuLT50eF9jcmVkaXRzID4gMDsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJaWYgKCF0aW1lbykgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcHJlcGFyZV90b193YWl0KCZzay0+c2tfc29ja2V0LT53YWl0LCAmd2FpdCwKKwkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOworCQlkb25lID0gc2tfd2FpdF9ldmVudChzaywgJnRpbWVvLCBwbi0+dHhfY3JlZGl0cyA+IDApOworCQlmaW5pc2hfd2FpdCgmc2stPnNrX3NvY2tldC0+d2FpdCwgJndhaXQpOworCisJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJZ290byBkaXNhYmxlZDsKKwl9CisKKwlpZiAoIXNrYikgeworCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBNQVhfUE5QSVBFX0hFQURFUiArIGxlbiwKKwkJCQkJCWZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCXNrYl9yZXNlcnZlKHNrYiwgTUFYX1BIT05FVF9IRUFERVIgKyAzKTsKKworCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCB8fCAhcG4tPnR4X2NyZWRpdHMpCisJCQlnb3RvIGRpc2FibGVkOyAvKiBzb2NrX2FsbG9jX3NlbmRfc2tiIG1pZ2h0IHNsZWVwICovCisJfQorCisJZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgbGVuKSwgbXNnLT5tc2dfaW92LCBsZW4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHBpcGVfc2tiX3NlbmQoc2ssIHNrYik7CisJaWYgKGVyciA+PSAwKQorCQllcnIgPSBsZW47IC8qIHN1Y2Nlc3MhICovCisJc2tiID0gTlVMTDsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBwZXBfd3JpdGVhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcGVwX3NvY2sgKnBuID0gcGVwX3NrKHNrKTsKKworCXJldHVybiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgPyBwbi0+dHhfY3JlZGl0cyA6IDA7Cit9CisKK2ludCBwZXBfd3JpdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpyc2tiLCAqZnM7CisJaW50IGZsZW4gPSAwOworCisJcnNrYiA9IGFsbG9jX3NrYihNQVhfUE5QSVBFX0hFQURFUiwgR0ZQX0FUT01JQyk7CisJaWYgKCFyc2tiKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc2tiX3NoaW5mbyhyc2tiKS0+ZnJhZ19saXN0ID0gc2tiOworCXJza2ItPmxlbiArPSBza2ItPmxlbjsKKwlyc2tiLT5kYXRhX2xlbiArPSByc2tiLT5sZW47CisJcnNrYi0+dHJ1ZXNpemUgKz0gcnNrYi0+bGVuOworCisJLyogQXZvaWQgbmVzdGVkIGZyYWdtZW50cyAqLworCWZvciAoZnMgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsgZnM7IGZzID0gZnMtPm5leHQpCisJCWZsZW4gKz0gZnMtPmxlbjsKKwlza2ItPm5leHQgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CisJc2tiLT5sZW4gLT0gZmxlbjsKKwlza2ItPmRhdGFfbGVuIC09IGZsZW47CisJc2tiLT50cnVlc2l6ZSAtPSBmbGVuOworCisJc2tiX3Jlc2VydmUocnNrYiwgTUFYX1BIT05FVF9IRUFERVIgKyAzKTsKKwlyZXR1cm4gcGlwZV9za2Jfc2VuZChzaywgcnNrYik7Cit9CisKK3N0cnVjdCBza19idWZmICpwZXBfcmVhZChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkKKwkJcGlwZV9ncmFudF9jcmVkaXRzKHNrKTsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHBlcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywKKwkJCWludCBmbGFncywgaW50ICphZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlpZiAodW5saWtlbHkoMSA8PCBzay0+c2tfc3RhdGUgJiAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlpZiAoKGZsYWdzICYgTVNHX09PQikgfHwgc29ja19mbGFnKHNrLCBTT0NLX1VSR0lOTElORSkpIHsKKwkJLyogRGVxdWV1ZSBhbmQgYWNrbm93bGVkZ2UgY29udHJvbCByZXF1ZXN0ICovCisJCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOworCisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwbi0+Y3RybHJlcV9xdWV1ZSk7CisJCWlmIChza2IpIHsKKwkJCXBlcF9jdHJscmVxX2Vycm9yKHNrLCBza2IsIFBOX1BJUEVfTk9fRVJST1IsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19PT0I7CisJCQlnb3RvIGNvcHk7CisJCX0KKwkJaWYgKGZsYWdzICYgTVNHX09PQikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJaWYgKGVyciA9PSAtRU5PVENPTk4gJiYgc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRV9XQUlUKQorCQkJZXJyID0gLUVDT05OUkVTRVQ7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpCisJCXBpcGVfZ3JhbnRfY3JlZGl0cyhzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKK2NvcHk6CisJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKwlpZiAoc2tiLT5sZW4gPiBsZW4pCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKKwllbHNlCisJCWxlbiA9IHNrYi0+bGVuOworCisJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJaWYgKCFlcnIpCisJCWVyciA9IChmbGFncyAmIE1TR19UUlVOQykgPyBza2ItPmxlbiA6IGxlbjsKKworCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBlcF9zb2NrX3VuaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisJc3RydWN0IHNvY2sgKnNrcGFyZW50ID0gTlVMTDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiB+KFRDUEZfQ0xPU0V8VENQRl9MSVNURU4pKSB7CisJCXNrcGFyZW50ID0gcG4tPmxpc3RlbmVyOworCQlza19kZWxfbm9kZV9pbml0KHNrKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlzayA9IHNrcGFyZW50OworCQlwbiA9IHBlcF9zayhza3BhcmVudCk7CisJCWxvY2tfc29jayhzayk7CisJfQorCS8qIFVuaGFzaCBhIGxpc3RlbmluZyBzb2NrIG9ubHkgd2hlbiBpdCBpcyBjbG9zZWQKKwkgKiBhbmQgYWxsIG9mIGl0cyBhY3RpdmUgY29ubmVjdGVkIHBpcGVzIGFyZSBjbG9zZWQuICovCisJaWYgKGhsaXN0X2VtcHR5KCZwbi0+aGxpc3QpKQorCQlwbl9zb2NrX3VuaGFzaCgmcG4tPnBuX3NrLnNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJaWYgKHNrcGFyZW50KQorCQlzb2NrX3B1dChza3BhcmVudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gcGVwX3Byb3RvID0geworCS5jbG9zZQkJPSBwZXBfc29ja19jbG9zZSwKKwkuYWNjZXB0CQk9IHBlcF9zb2NrX2FjY2VwdCwKKwkuaW9jdGwJCT0gcGVwX2lvY3RsLAorCS5pbml0CQk9IHBlcF9pbml0LAorCS5zZXRzb2Nrb3B0CT0gcGVwX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBwZXBfZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IHBlcF9zZW5kbXNnLAorCS5yZWN2bXNnCT0gcGVwX3JlY3Ztc2csCisJLmJhY2tsb2dfcmN2CT0gcGVwX2RvX3JjdiwKKwkuaGFzaAkJPSBwbl9zb2NrX2hhc2gsCisJLnVuaGFzaAkJPSBwZXBfc29ja191bmhhc2gsCisJLmdldF9wb3J0CT0gcG5fc29ja19nZXRfcG9ydCwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IHBlcF9zb2NrKSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIlBOUElQRSIsCit9OworCitzdGF0aWMgc3RydWN0IHBob25ldF9wcm90b2NvbCBwZXBfcG5fcHJvdG8gPSB7CisJLm9wcwkJPSAmcGhvbmV0X3N0cmVhbV9vcHMsCisJLnByb3QJCT0gJnBlcF9wcm90bywKKwkuc29ja190eXBlCT0gU09DS19TRVFQQUNLRVQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwZXBfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGhvbmV0X3Byb3RvX3JlZ2lzdGVyKFBOX1BST1RPX1BJUEUsICZwZXBfcG5fcHJvdG8pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGVwX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlwaG9uZXRfcHJvdG9fdW5yZWdpc3RlcihQTl9QUk9UT19QSVBFLCAmcGVwX3BuX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQocGVwX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHBlcF91bnJlZ2lzdGVyKTsKK01PRFVMRV9BVVRIT1IoIlJlbWkgRGVuaXMtQ291cm1vbnQsIE5va2lhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBob25ldCBwaXBlIHByb3RvY29sIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUX1BGX1BST1RPKFBGX1BIT05FVCwgUE5fUFJPVE9fUElQRSk7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BuX2Rldi5jIGIvbmV0L3Bob25ldC9wbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JlOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Bob25ldC9wbl9kZXYuYwpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIEZpbGU6IHBuX2Rldi5jCisgKgorICogUGhvbmV0IG5ldHdvcmsgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIENvbnRhY3Q6IFJlbWkgRGVuaXMtQ291cm1vbnQgPHJlbWkuZGVuaXMtY291cm1vbnRAbm9raWEuY29tPgorICogT3JpZ2luYWwgYXV0aG9yOiBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9waG9uZXQvcG5fZGV2Lmg+CisKKy8qIHdoZW4gYWNjZXNzaW5nLCByZW1lbWJlciB0byBsb2NrIHdpdGggc3Bpbl9sb2NrKCZwbmRldnMubG9jayk7ICovCitzdHJ1Y3QgcGhvbmV0X2RldmljZV9saXN0IHBuZGV2cyA9IHsKKwkubGlzdCA9IExJU1RfSEVBRF9JTklUKHBuZGV2cy5saXN0KSwKKwkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHBuZGV2cy5sb2NrKSwKK307CisKKy8qIEFsbG9jYXRlIG5ldyBQaG9uZXQgZGV2aWNlLiAqLworc3RhdGljIHN0cnVjdCBwaG9uZXRfZGV2aWNlICpfX3Bob25ldF9kZXZpY2VfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGhvbmV0X2RldmljZSAqcG5kID0ga21hbGxvYyhzaXplb2YoKnBuZCksIEdGUF9BVE9NSUMpOworCWlmIChwbmQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcG5kLT5uZXRkZXYgPSBkZXY7CisJYml0bWFwX3plcm8ocG5kLT5hZGRycywgNjQpOworCisJbGlzdF9hZGQoJnBuZC0+bGlzdCwgJnBuZGV2cy5saXN0KTsKKwlyZXR1cm4gcG5kOworfQorCitzdGF0aWMgc3RydWN0IHBob25ldF9kZXZpY2UgKl9fcGhvbmV0X2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwaG9uZXRfZGV2aWNlICpwbmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBuZCwgJnBuZGV2cy5saXN0LCBsaXN0KSB7CisJCWlmIChwbmQtPm5ldGRldiA9PSBkZXYpCisJCQlyZXR1cm4gcG5kOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19waG9uZXRfZGV2aWNlX2ZyZWUoc3RydWN0IHBob25ldF9kZXZpY2UgKnBuZCkKK3sKKwlsaXN0X2RlbCgmcG5kLT5saXN0KTsKKwlrZnJlZShwbmQpOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqcGhvbmV0X2RldmljZV9nZXQoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBwaG9uZXRfZGV2aWNlICpwbmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCXNwaW5fbG9ja19iaCgmcG5kZXZzLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG5kLCAmcG5kZXZzLmxpc3QsIGxpc3QpIHsKKwkJZGV2ID0gcG5kLT5uZXRkZXY7CisJCUJVR19PTighZGV2KTsKKworCQlpZiAoZGV2X25ldChkZXYpID09IG5ldCAmJgorCQkJKGRldi0+cmVnX3N0YXRlID09IE5FVFJFR19SRUdJU1RFUkVEKSAmJgorCQkJKChwbmQtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKSA9PSBJRkZfVVApCisJCQlicmVhazsKKwkJZGV2ID0gTlVMTDsKKwl9CisJaWYgKGRldikKKwkJZGV2X2hvbGQoZGV2KTsKKwlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCXJldHVybiBkZXY7Cit9CisKK2ludCBwaG9uZXRfYWRkcmVzc19hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwlzdHJ1Y3QgcGhvbmV0X2RldmljZSAqcG5kOworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZwbmRldnMubG9jayk7CisJLyogRmluZCBvciBjcmVhdGUgUGhvbmV0LXNwZWNpZmljIGRldmljZSBkYXRhICovCisJcG5kID0gX19waG9uZXRfZ2V0KGRldik7CisJaWYgKHBuZCA9PSBOVUxMKQorCQlwbmQgPSBfX3Bob25ldF9kZXZpY2VfYWxsb2MoZGV2KTsKKwlpZiAodW5saWtlbHkocG5kID09IE5VTEwpKQorCQllcnIgPSAtRU5PTUVNOworCWVsc2UgaWYgKHRlc3RfYW5kX3NldF9iaXQoYWRkciA+PiAyLCBwbmQtPmFkZHJzKSkKKwkJZXJyID0gLUVFWElTVDsKKwlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK2ludCBwaG9uZXRfYWRkcmVzc19kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwlzdHJ1Y3QgcGhvbmV0X2RldmljZSAqcG5kOworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZwbmRldnMubG9jayk7CisJcG5kID0gX19waG9uZXRfZ2V0KGRldik7CisJaWYgKCFwbmQgfHwgIXRlc3RfYW5kX2NsZWFyX2JpdChhZGRyID4+IDIsIHBuZC0+YWRkcnMpKQorCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwlpZiAoYml0bWFwX2VtcHR5KHBuZC0+YWRkcnMsIDY0KSkKKwkJX19waG9uZXRfZGV2aWNlX2ZyZWUocG5kKTsKKwlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIEdldHMgYSBzb3VyY2UgYWRkcmVzcyB0b3dhcmQgYSBkZXN0aW5hdGlvbiwgdGhyb3VnaCBhIGludGVyZmFjZS4gKi8KK3U4IHBob25ldF9hZGRyZXNzX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyKQoreworCXN0cnVjdCBwaG9uZXRfZGV2aWNlICpwbmQ7CisKKwlzcGluX2xvY2tfYmgoJnBuZGV2cy5sb2NrKTsKKwlwbmQgPSBfX3Bob25ldF9nZXQoZGV2KTsKKwlpZiAocG5kKSB7CisJCUJVR19PTihiaXRtYXBfZW1wdHkocG5kLT5hZGRycywgNjQpKTsKKworCQkvKiBVc2Ugc2FtZSBzb3VyY2UgYWRkcmVzcyBhcyBkZXN0aW5hdGlvbiwgaWYgcG9zc2libGUgKi8KKwkJaWYgKCF0ZXN0X2JpdChhZGRyID4+IDIsIHBuZC0+YWRkcnMpKQorCQkJYWRkciA9IGZpbmRfZmlyc3RfYml0KHBuZC0+YWRkcnMsIDY0KSA8PCAyOworCX0gZWxzZQorCQlhZGRyID0gUE5fTk9fQUREUjsKKwlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCXJldHVybiBhZGRyOworfQorCitpbnQgcGhvbmV0X2FkZHJlc3NfbG9va3VwKHU4IGFkZHIpCit7CisJc3RydWN0IHBob25ldF9kZXZpY2UgKnBuZDsKKworCXNwaW5fbG9ja19iaCgmcG5kZXZzLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG5kLCAmcG5kZXZzLmxpc3QsIGxpc3QpIHsKKwkJLyogRG9uJ3QgYWxsb3cgdW5yZWdpc3RlcmluZyBkZXZpY2VzISAqLworCQlpZiAoKHBuZC0+bmV0ZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpIHx8CisJCQkJKChwbmQtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKSAhPSBJRkZfVVApCisJCQljb250aW51ZTsKKworCQlpZiAodGVzdF9iaXQoYWRkciA+PiAyLCBwbmQtPmFkZHJzKSkgeworCQkJc3Bpbl91bmxvY2tfYmgoJnBuZGV2cy5sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZwbmRldnMubG9jayk7CisJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworfQorCisvKiBub3RpZnkgUGhvbmV0IG9mIGRldmljZSBldmVudHMgKi8KK3N0YXRpYyBpbnQgcGhvbmV0X2RldmljZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICptZSwgdW5zaWduZWQgbG9uZyB3aGF0LAorCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXJnOworCisJaWYgKHdoYXQgPT0gTkVUREVWX1VOUkVHSVNURVIpIHsKKwkJc3RydWN0IHBob25ldF9kZXZpY2UgKnBuZDsKKworCQkvKiBEZXN0cm95IHBob25ldC1zcGVjaWZpYyBkZXZpY2UgZGF0YSAqLworCQlzcGluX2xvY2tfYmgoJnBuZGV2cy5sb2NrKTsKKwkJcG5kID0gX19waG9uZXRfZ2V0KGRldik7CisJCWlmIChwbmQpCisJCQlfX3Bob25ldF9kZXZpY2VfZnJlZShwbmQpOworCQlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCX0KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBob25ldF9kZXZpY2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBwaG9uZXRfZGV2aWNlX25vdGlmeSwKKwkucHJpb3JpdHkgPSAwLAorfTsKKworLyogSW5pdGlhbGl6ZSBQaG9uZXQgZGV2aWNlcyBsaXN0ICovCit2b2lkIHBob25ldF9kZXZpY2VfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcGhvbmV0X2RldmljZV9ub3RpZmllcik7Cit9CisKK3ZvaWQgcGhvbmV0X2RldmljZV9leGl0KHZvaWQpCit7CisJc3RydWN0IHBob25ldF9kZXZpY2UgKnBuZCwgKm47CisKKwlydG5sX3VucmVnaXN0ZXJfYWxsKFBGX1BIT05FVCk7CisJcnRubF9sb2NrKCk7CisJc3Bpbl9sb2NrX2JoKCZwbmRldnMubG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5kLCBuLCAmcG5kZXZzLmxpc3QsIGxpc3QpCisJCV9fcGhvbmV0X2RldmljZV9mcmVlKHBuZCk7CisKKwlzcGluX3VubG9ja19iaCgmcG5kZXZzLmxvY2spOworCXJ0bmxfdW5sb2NrKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnBob25ldF9kZXZpY2Vfbm90aWZpZXIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3Bob25ldC9wbl9uZXRsaW5rLmMgYi9uZXQvcGhvbmV0L3BuX25ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc3MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3Bob25ldC9wbl9uZXRsaW5rLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBGaWxlOiBwbl9uZXRsaW5rLmMKKyAqCisgKiBQaG9uZXQgbmV0bGluayBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogQ29udGFjdDogUmVtaSBEZW5pcy1Db3VybW9udCA8cmVtaS5kZW5pcy1jb3VybW9udEBub2tpYS5jb20+CisgKiBPcmlnaW5hbCBhdXRob3I6IFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9waG9uZXQvcG5fZGV2Lmg+CisKK3N0YXRpYyBpbnQgZmlsbF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIsCisJCSAgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50KTsKKworc3RhdGljIHZvaWQgcnRtc2dfbm90aWZ5KGludCBldmVudCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnIgPSAtRU5PQlVGUzsKKworCXNrYiA9IG5sbXNnX25ldyhOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpICsKKwkJCW5sYV90b3RhbF9zaXplKDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCWVyciA9IGZpbGxfYWRkcihza2IsIGRldiwgYWRkciwgMCwgMCwgZXZlbnQpOworCWlmIChlcnIgPCAwKSB7CisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CisJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBkZXZfbmV0KGRldiksIDAsCisJCQkgIFJUTkxHUlBfUEhPTkVUX0lGQUREUiwgTlVMTCwgR0ZQX0tFUk5FTCk7CitlcnJvdXQ6CisJaWYgKGVyciA8IDApCisJCXJ0bmxfc2V0X3NrX2VycihkZXZfbmV0KGRldiksIFJUTkxHUlBfUEhPTkVUX0lGQUREUiwgZXJyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlmYV9waG9uZXRfcG9saWN5W0lGQV9NQVgrMV0gPSB7CisJW0lGQV9MT0NBTF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCit9OworCitzdGF0aWMgaW50IGFkZHJfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXR0cikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltJRkFfTUFYKzFdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOworCWludCBlcnI7CisJdTggcG5hZGRyOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJQVNTRVJUX1JUTkwoKTsKKworCWVyciA9IG5sbXNnX3BhcnNlKG5saCwgc2l6ZW9mKCppZm0pLCB0YiwgSUZBX01BWCwgaWZhX3Bob25ldF9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWZtID0gbmxtc2dfZGF0YShubGgpOworCWlmICh0YltJRkFfTE9DQUxdID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXBuYWRkciA9IG5sYV9nZXRfdTgodGJbSUZBX0xPQ0FMXSk7CisJaWYgKHBuYWRkciAmIDMpCisJCS8qIFBob25ldCBhZGRyZXNzZXMgb25seSBoYXZlIDYgaGlnaC1vcmRlciBiaXRzICovCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZtLT5pZmFfaW5kZXgpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobmxoLT5ubG1zZ190eXBlID09IFJUTV9ORVdBRERSKQorCQllcnIgPSBwaG9uZXRfYWRkcmVzc19hZGQoZGV2LCBwbmFkZHIpOworCWVsc2UKKwkJZXJyID0gcGhvbmV0X2FkZHJlc3NfZGVsKGRldiwgcG5hZGRyKTsKKwlpZiAoIWVycikKKwkJcnRtc2dfbm90aWZ5KG5saC0+bmxtc2dfdHlwZSwgZGV2LCBwbmFkZHIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIsCisJCQl1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmlmbSksIDApOworCWlmIChubGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmbSA9IG5sbXNnX2RhdGEobmxoKTsKKwlpZm0tPmlmYV9mYW1pbHkgPSBBRl9QSE9ORVQ7CisJaWZtLT5pZmFfcHJlZml4bGVuID0gMDsKKwlpZm0tPmlmYV9mbGFncyA9IElGQV9GX1BFUk1BTkVOVDsKKwlpZm0tPmlmYV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJaWZtLT5pZmFfaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJTkxBX1BVVF9VOChza2IsIElGQV9MT0NBTCwgYWRkcik7CisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0YWRkcl9kdW1waXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBwaG9uZXRfZGV2aWNlICpwbmQ7CisJaW50IGRldl9pZHggPSAwLCBkZXZfc3RhcnRfaWR4ID0gY2ItPmFyZ3NbMF07CisJaW50IGFkZHJfaWR4ID0gMCwgYWRkcl9zdGFydF9pZHggPSBjYi0+YXJnc1sxXTsKKworCXNwaW5fbG9ja19iaCgmcG5kZXZzLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG5kLCAmcG5kZXZzLmxpc3QsIGxpc3QpIHsKKwkJdTggYWRkcjsKKworCQlpZiAoZGV2X2lkeCA+IGRldl9zdGFydF9pZHgpCisJCQlhZGRyX3N0YXJ0X2lkeCA9IDA7CisJCWlmIChkZXZfaWR4KysgPCBkZXZfc3RhcnRfaWR4KQorCQkJY29udGludWU7CisKKwkJYWRkcl9pZHggPSAwOworCQlmb3IgKGFkZHIgPSBmaW5kX2ZpcnN0X2JpdChwbmQtPmFkZHJzLCA2NCk7IGFkZHIgPCA2NDsKKwkJCWFkZHIgPSBmaW5kX25leHRfYml0KHBuZC0+YWRkcnMsIDY0LCAxK2FkZHIpKSB7CisJCQlpZiAoYWRkcl9pZHgrKyA8IGFkZHJfc3RhcnRfaWR4KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmlsbF9hZGRyKHNrYiwgcG5kLT5uZXRkZXYsIGFkZHIgPDwgMiwKKwkJCQkJIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZwbmRldnMubG9jayk7CisJY2ItPmFyZ3NbMF0gPSBkZXZfaWR4OworCWNiLT5hcmdzWzFdID0gYWRkcl9pZHg7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3ZvaWQgX19pbml0IHBob25ldF9uZXRsaW5rX3JlZ2lzdGVyKHZvaWQpCit7CisJcnRubF9yZWdpc3RlcihQRl9QSE9ORVQsIFJUTV9ORVdBRERSLCBhZGRyX2RvaXQsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfUEhPTkVULCBSVE1fREVMQUREUiwgYWRkcl9kb2l0LCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1BIT05FVCwgUlRNX0dFVEFERFIsIE5VTEwsIGdldGFkZHJfZHVtcGl0KTsKK30KZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvc29ja2V0LmMgYi9uZXQvcGhvbmV0L3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTc0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcGhvbmV0L3NvY2tldC5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogRmlsZTogc29ja2V0LmMKKyAqCisgKiBQaG9uZXQgc29ja2V0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBDb250YWN0OiBSZW1pIERlbmlzLUNvdXJtb250IDxyZW1pLmRlbmlzLWNvdXJtb250QG5va2lhLmNvbT4KKyAqIE9yaWdpbmFsIGF1dGhvcjogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Bob25ldC5oPgorI2luY2x1ZGUgPG5ldC9waG9uZXQvcGhvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L3Bob25ldC9wZXAuaD4KKyNpbmNsdWRlIDxuZXQvcGhvbmV0L3BuX2Rldi5oPgorCitzdGF0aWMgaW50IHBuX3NvY2tldF9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlpZiAoc2spIHsKKwkJc29jay0+c2sgPSBOVUxMOworCQlzay0+c2tfcHJvdC0+Y2xvc2Uoc2ssIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCAgeworCXN0cnVjdCBobGlzdF9oZWFkIGhsaXN0OworCXNwaW5sb2NrX3QgbG9jazsKK30gcG5zb2NrcyA9IHsKKwkuaGxpc3QgPSBITElTVF9IRUFEX0lOSVQsCisJLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChwbnNvY2tzLmxvY2spLAorfTsKKworLyoKKyAqIEZpbmQgYWRkcmVzcyBiYXNlZCBvbiBzb2NrZXQgYWRkcmVzcywgbWF0Y2ggb25seSBjZXJ0YWluIGZpZWxkcy4KKyAqIEFsc28gZ3JhYiBzb2NrIGlmIGl0IHdhcyBmb3VuZC4gUmVtZW1iZXIgdG8gc29ja19wdXQgaXQgbGF0ZXIuCisgKi8KK3N0cnVjdCBzb2NrICpwbl9maW5kX3NvY2tfYnlfc2EoY29uc3Qgc3RydWN0IHNvY2thZGRyX3BuICpzcG4pCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnNrbm9kZTsKKwlzdHJ1Y3Qgc29jayAqcnZhbCA9IE5VTEw7CisJdTE2IG9iaiA9IHBuX3NvY2thZGRyX2dldF9vYmplY3Qoc3BuKTsKKwl1OCByZXMgPSBzcG4tPnNwbl9yZXNvdXJjZTsKKworCXNwaW5fbG9ja19iaCgmcG5zb2Nrcy5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrbm9kZSwgbm9kZSwgJnBuc29ja3MuaGxpc3QpIHsKKwkJc3RydWN0IHBuX3NvY2sgKnBuID0gcG5fc2soc2tub2RlKTsKKwkJQlVHX09OKCFwbi0+c29iamVjdCk7IC8qIHVuYm91bmQgc29ja2V0ICovCisKKwkJaWYgKHBuX3BvcnQob2JqKSkgeworCQkJLyogTG9vayB1cCBzb2NrZXQgYnkgcG9ydCAqLworCQkJaWYgKHBuX3BvcnQocG4tPnNvYmplY3QpICE9IHBuX3BvcnQob2JqKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHBvcnQgaXMgemVybywgbG9vayB1cCBieSByZXNvdXJjZSAqLworCQkJaWYgKHBuLT5yZXNvdXJjZSAhPSByZXMpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBuX2FkZHIocG4tPnNvYmplY3QpCisJCSAmJiBwbl9hZGRyKHBuLT5zb2JqZWN0KSAhPSBwbl9hZGRyKG9iaikpCisJCQljb250aW51ZTsKKworCQlydmFsID0gc2tub2RlOworCQlzb2NrX2hvbGQoc2tub2RlKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnBuc29ja3MubG9jayk7CisKKwlyZXR1cm4gcnZhbDsKKworfQorCit2b2lkIHBuX3NvY2tfaGFzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3Bpbl9sb2NrX2JoKCZwbnNvY2tzLmxvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmcG5zb2Nrcy5obGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnBuc29ja3MubG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHBuX3NvY2tfaGFzaCk7CisKK3ZvaWQgcG5fc29ja191bmhhc2goc3RydWN0IHNvY2sgKnNrKQoreworCXNwaW5fbG9ja19iaCgmcG5zb2Nrcy5sb2NrKTsKKwlza19kZWxfbm9kZV9pbml0KHNrKTsKKwlzcGluX3VubG9ja19iaCgmcG5zb2Nrcy5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wocG5fc29ja191bmhhc2gpOworCitzdGF0aWMgaW50IHBuX3NvY2tldF9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcG5fc29jayAqcG4gPSBwbl9zayhzayk7CisJc3RydWN0IHNvY2thZGRyX3BuICpzcG4gPSAoc3RydWN0IHNvY2thZGRyX3BuICopYWRkcjsKKwlpbnQgZXJyOworCXUxNiBoYW5kbGU7CisJdTggc2FkZHI7CisKKwlpZiAoc2stPnNrX3Byb3QtPmJpbmQpCisJCXJldHVybiBzay0+c2tfcHJvdC0+YmluZChzaywgYWRkciwgbGVuKTsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNwbi0+c3BuX2ZhbWlseSAhPSBBRl9QSE9ORVQpCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJaGFuZGxlID0gcG5fc29ja2FkZHJfZ2V0X29iamVjdCgoc3RydWN0IHNvY2thZGRyX3BuICopYWRkcik7CisJc2FkZHIgPSBwbl9hZGRyKGhhbmRsZSk7CisJaWYgKHNhZGRyICYmIHBob25ldF9hZGRyZXNzX2xvb2t1cChzYWRkcikpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UgfHwgcG5fcG9ydChwbi0+c29iamVjdCkpIHsKKwkJZXJyID0gLUVJTlZBTDsgLyogYXR0ZW1wdCB0byByZWJpbmQgKi8KKwkJZ290byBvdXQ7CisJfQorCWVyciA9IHNrLT5za19wcm90LT5nZXRfcG9ydChzaywgcG5fcG9ydChoYW5kbGUpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIGdldF9wb3J0KCkgc2V0cyB0aGUgcG9ydCwgYmluZCgpIHNldHMgdGhlIGFkZHJlc3MgaWYgYXBwbGljYWJsZSAqLworCXBuLT5zb2JqZWN0ID0gcG5fb2JqZWN0KHNhZGRyLCBwbl9wb3J0KHBuLT5zb2JqZWN0KSk7CisJcG4tPnJlc291cmNlID0gc3BuLT5zcG5fcmVzb3VyY2U7CisKKwkvKiBFbmFibGUgUlggb24gdGhlIHNvY2tldCAqLworCXNrLT5za19wcm90LT5oYXNoKHNrKTsKK291dDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcG5fc29ja2V0X2F1dG9iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2thZGRyX3BuIHNhOworCWludCBlcnI7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zcG5fZmFtaWx5ID0gQUZfUEhPTkVUOworCWVyciA9IHBuX3NvY2tldF9iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsCisJCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9wbikpOworCWlmIChlcnIgIT0gLUVJTlZBTCkKKwkJcmV0dXJuIGVycjsKKwlCVUdfT04oIXBuX3BvcnQocG5fc2soc29jay0+c2spLT5zb2JqZWN0KSk7CisJcmV0dXJuIDA7IC8qIHNvY2tldCB3YXMgYWxyZWFkeSBib3VuZCAqLworfQorCitzdGF0aWMgaW50IHBuX3NvY2tldF9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywKKwkJCQlpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2sgKm5ld3NrOworCWludCBlcnI7CisKKwluZXdzayA9IHNrLT5za19wcm90LT5hY2NlcHQoc2ssIGZsYWdzLCAmZXJyKTsKKwlpZiAoIW5ld3NrKQorCQlyZXR1cm4gZXJyOworCisJbG9ja19zb2NrKG5ld3NrKTsKKwlzb2NrX2dyYWZ0KG5ld3NrLCBuZXdzb2NrKTsKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKwlyZWxlYXNlX3NvY2sobmV3c2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBuX3NvY2tldF9nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCQlpbnQgKnNvY2thZGRyX2xlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBuX3NvY2sgKnBuID0gcG5fc2soc2spOworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcG4pKTsKKwlhZGRyLT5zYV9mYW1pbHkgPSBBRl9QSE9ORVQ7CisJaWYgKCFwZWVyKSAvKiBSYWNlIHdpdGggYmluZCgpIGhlcmUgaXMgdXNlcmxhbmQncyBwcm9ibGVtLiAqLworCQlwbl9zb2NrYWRkcl9zZXRfb2JqZWN0KChzdHJ1Y3Qgc29ja2FkZHJfcG4gKilhZGRyLAorCQkJCQlwbi0+c29iamVjdCk7CisKKwkqc29ja2FkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9wbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG5fc29ja2V0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCXBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0KGZpbGUsICZzb2NrLT53YWl0LCB3YWl0KTsKKworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBUQ1BfTElTVEVOOgorCQlyZXR1cm4gaGxpc3RfZW1wdHkoJnBuLT5hY2txKSA/IDAgOiBQT0xMSU47CisJY2FzZSBUQ1BfQ0xPU0U6CisJCXJldHVybiBQT0xMRVJSOworCX0KKworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcG4tPmN0cmxyZXFfcXVldWUpKQorCQltYXNrIHw9IFBPTExQUkk7CisJaWYgKCFtYXNrICYmIHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0VfV0FJVCkKKwkJcmV0dXJuIFBPTExIVVA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCAmJiBwbi0+dHhfY3JlZGl0cykKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STSB8IFBPTExXUkJBTkQ7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBwbl9zb2NrZXRfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcG5fc29jayAqcG4gPSBwbl9zayhzayk7CisKKwlpZiAoY21kID09IFNJT0NQTkdFVE9CSkVDVCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQl1MTYgaGFuZGxlOworCQl1OCBzYWRkcjsKKworCQlpZiAoZ2V0X3VzZXIoaGFuZGxlLCAoX191MTYgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWxvY2tfc29jayhzayk7CisJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmKQorCQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleChzb2NrX25ldChzayksCisJCQkJCQlzay0+c2tfYm91bmRfZGV2X2lmKTsKKwkJZWxzZQorCQkJZGV2ID0gcGhvbmV0X2RldmljZV9nZXQoc29ja19uZXQoc2spKTsKKwkJaWYgKGRldiAmJiAoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCQlzYWRkciA9IHBob25ldF9hZGRyZXNzX2dldChkZXYsIHBuX2FkZHIoaGFuZGxlKSk7CisJCWVsc2UKKwkJCXNhZGRyID0gUE5fTk9fQUREUjsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQlpZiAoZGV2KQorCQkJZGV2X3B1dChkZXYpOworCQlpZiAoc2FkZHIgPT0gUE5fTk9fQUREUikKKwkJCXJldHVybiAtRUhPU1RVTlJFQUNIOworCisJCWhhbmRsZSA9IHBuX29iamVjdChzYWRkciwgcG5fcG9ydChwbi0+c29iamVjdCkpOworCQlyZXR1cm4gcHV0X3VzZXIoaGFuZGxlLCAoX191MTYgX191c2VyICopYXJnKTsKKwl9CisKKwlyZXR1cm4gc2stPnNrX3Byb3QtPmlvY3RsKHNrLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgcG5fc29ja2V0X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19VTkNPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBuX3NvY2tldF9hdXRvYmluZChzb2NrKSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzay0+c2tfc3RhdGUgPSBUQ1BfTElTVEVOOworCXNrLT5za19hY2tfYmFja2xvZyA9IDA7CisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBuX3NvY2tldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQlzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJaWYgKHBuX3NvY2tldF9hdXRvYmluZChzb2NrKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gc2stPnNrX3Byb3QtPnNlbmRtc2coaW9jYiwgc2ssIG0sIHRvdGFsX2xlbik7Cit9CisKK2NvbnN0IHN0cnVjdCBwcm90b19vcHMgcGhvbmV0X2RncmFtX29wcyA9IHsKKwkuZmFtaWx5CQk9IEFGX1BIT05FVCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBwbl9zb2NrZXRfcmVsZWFzZSwKKwkuYmluZAkJPSBwbl9zb2NrZXRfYmluZCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lCT0gcG5fc29ja2V0X2dldG5hbWUsCisJLnBvbGwJCT0gZGF0YWdyYW1fcG9sbCwKKwkuaW9jdGwJCT0gcG5fc29ja2V0X2lvY3RsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gc29ja19ub19zZXRzb2Nrb3B0LAorCS5jb21wYXRfZ2V0c29ja29wdCA9IHNvY2tfbm9fZ2V0c29ja29wdCwKKyNlbmRpZgorCS5zZW5kbXNnCT0gcG5fc29ja2V0X3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX2NvbW1vbl9yZWN2bXNnLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UJPSBzb2NrX25vX3NlbmRwYWdlLAorfTsKKworY29uc3Qgc3RydWN0IHByb3RvX29wcyBwaG9uZXRfc3RyZWFtX29wcyA9IHsKKwkuZmFtaWx5CQk9IEFGX1BIT05FVCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBwbl9zb2NrZXRfcmVsZWFzZSwKKwkuYmluZAkJPSBwbl9zb2NrZXRfYmluZCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHBuX3NvY2tldF9hY2NlcHQsCisJLmdldG5hbWUJPSBwbl9zb2NrZXRfZ2V0bmFtZSwKKwkucG9sbAkJPSBwbl9zb2NrZXRfcG9sbCwKKwkuaW9jdGwJCT0gcG5fc29ja2V0X2lvY3RsLAorCS5saXN0ZW4JCT0gcG5fc29ja2V0X2xpc3RlbiwKKwkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc29ja19jb21tb25fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfY29tbW9uX2dldHNvY2tvcHQsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAorCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LAorI2VuZGlmCisJLnNlbmRtc2cJPSBwbl9zb2NrZXRfc2VuZG1zZywKKwkucmVjdm1zZwk9IHNvY2tfY29tbW9uX3JlY3Ztc2csCisJLm1tYXAJCT0gc29ja19ub19tbWFwLAorCS5zZW5kcGFnZQk9IHNvY2tfbm9fc2VuZHBhZ2UsCit9OworRVhQT1JUX1NZTUJPTChwaG9uZXRfc3RyZWFtX29wcyk7CisKK3N0YXRpYyBERUZJTkVfTVVURVgocG9ydF9tdXRleCk7CisKKy8qIGFsbG9jYXRlIHBvcnQgZm9yIGEgc29ja2V0ICovCitpbnQgcG5fc29ja19nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNwb3J0KQoreworCXN0YXRpYyBpbnQgcG9ydF9jdXI7CisJc3RydWN0IHBuX3NvY2sgKnBuID0gcG5fc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9wbiB0cnlfc2E7CisJc3RydWN0IHNvY2sgKnRtcHNrOworCisJbWVtc2V0KCZ0cnlfc2EsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcG4pKTsKKwl0cnlfc2Euc3BuX2ZhbWlseSA9IEFGX1BIT05FVDsKKworCW11dGV4X2xvY2soJnBvcnRfbXV0ZXgpOworCisJaWYgKCFzcG9ydCkgeworCQkvKiBzZWFyY2ggZnJlZSBwb3J0ICovCisJCWludCBwb3J0LCBwbWluLCBwbWF4OworCisJCXBob25ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZSgmcG1pbiwgJnBtYXgpOworCQlmb3IgKHBvcnQgPSBwbWluOyBwb3J0IDw9IHBtYXg7IHBvcnQrKykgeworCQkJcG9ydF9jdXIrKzsKKwkJCWlmIChwb3J0X2N1ciA8IHBtaW4gfHwgcG9ydF9jdXIgPiBwbWF4KQorCQkJCXBvcnRfY3VyID0gcG1pbjsKKworCQkJcG5fc29ja2FkZHJfc2V0X3BvcnQoJnRyeV9zYSwgcG9ydF9jdXIpOworCQkJdG1wc2sgPSBwbl9maW5kX3NvY2tfYnlfc2EoJnRyeV9zYSk7CisJCQlpZiAodG1wc2sgPT0gTlVMTCkgeworCQkJCXNwb3J0ID0gcG9ydF9jdXI7CisJCQkJZ290byBmb3VuZDsKKwkJCX0gZWxzZQorCQkJCXNvY2tfcHV0KHRtcHNrKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRyeSB0byBmaW5kIHNwZWNpZmljIHBvcnQgKi8KKwkJcG5fc29ja2FkZHJfc2V0X3BvcnQoJnRyeV9zYSwgc3BvcnQpOworCQl0bXBzayA9IHBuX2ZpbmRfc29ja19ieV9zYSgmdHJ5X3NhKTsKKwkJaWYgKHRtcHNrID09IE5VTEwpCisJCQkvKiBObyBzb2NrIHRoZXJlISBXZSBjYW4gdXNlIHRoYXQgcG9ydC4uLiAqLworCQkJZ290byBmb3VuZDsKKwkJZWxzZQorCQkJc29ja19wdXQodG1wc2spOworCX0KKwltdXRleF91bmxvY2soJnBvcnRfbXV0ZXgpOworCisJLyogdGhlIHBvcnQgbXVzdCBiZSBpbiB1c2UgYWxyZWFkeSAqLworCXJldHVybiAtRUFERFJJTlVTRTsKKworZm91bmQ6CisJbXV0ZXhfdW5sb2NrKCZwb3J0X211dGV4KTsKKwlwbi0+c29iamVjdCA9IHBuX29iamVjdChwbl9hZGRyKHBuLT5zb2JqZWN0KSwgc3BvcnQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChwbl9zb2NrX2dldF9wb3J0KTsKZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvc3lzY3RsLmMgYi9uZXQvcGhvbmV0L3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGE0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcGhvbmV0L3N5c2N0bC5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogRmlsZTogc3lzY3RsLmMKKyAqCisgKiBQaG9uZXQgL3Byb2Mvc3lzL25ldC9waG9uZXQgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uLgorICoKKyAqIENvbnRhY3Q6IFJlbWkgRGVuaXMtQ291cm1vbnQgPHJlbWkuZGVuaXMtY291cm1vbnRAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjZGVmaW5lIERZTkFNSUNfUE9SVF9NSU4JMHg0MAorI2RlZmluZSBEWU5BTUlDX1BPUlRfTUFYCTB4N2YKKworc3RhdGljIERFRklORV9TRVFMT0NLKGxvY2FsX3BvcnRfcmFuZ2VfbG9jayk7CitzdGF0aWMgaW50IGxvY2FsX3BvcnRfcmFuZ2VfbWluWzJdID0gezAsIDB9Oworc3RhdGljIGludCBsb2NhbF9wb3J0X3JhbmdlX21heFsyXSA9IHsxMDIzLCAxMDIzfTsKK3N0YXRpYyBpbnQgbG9jYWxfcG9ydF9yYW5nZVsyXSA9IHtEWU5BTUlDX1BPUlRfTUlOLCBEWU5BTUlDX1BPUlRfTUFYfTsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqcGhvbmV0X3RhYmxlX2hyZDsKKworc3RhdGljIHZvaWQgc2V0X2xvY2FsX3BvcnRfcmFuZ2UoaW50IHJhbmdlWzJdKQoreworCXdyaXRlX3NlcWxvY2soJmxvY2FsX3BvcnRfcmFuZ2VfbG9jayk7CisJbG9jYWxfcG9ydF9yYW5nZVswXSA9IHJhbmdlWzBdOworCWxvY2FsX3BvcnRfcmFuZ2VbMV0gPSByYW5nZVsxXTsKKwl3cml0ZV9zZXF1bmxvY2soJmxvY2FsX3BvcnRfcmFuZ2VfbG9jayk7Cit9CisKK3ZvaWQgcGhvbmV0X2dldF9sb2NhbF9wb3J0X3JhbmdlKGludCAqbWluLCBpbnQgKm1heCkKK3sKKwl1bnNpZ25lZCBzZXE7CisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZsb2NhbF9wb3J0X3JhbmdlX2xvY2spOworCQlpZiAobWluKQorCQkJKm1pbiA9IGxvY2FsX3BvcnRfcmFuZ2VbMF07CisJCWlmIChtYXgpCisJCQkqbWF4ID0gbG9jYWxfcG9ydF9yYW5nZVsxXTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZsb2NhbF9wb3J0X3JhbmdlX2xvY2ssIHNlcSkpOworfQorCitzdGF0aWMgaW50IHByb2NfbG9jYWxfcG9ydF9yYW5nZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXZvaWQgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJldDsKKwlpbnQgcmFuZ2VbMl0gPSB7bG9jYWxfcG9ydF9yYW5nZVswXSwgbG9jYWxfcG9ydF9yYW5nZVsxXX07CisJY3RsX3RhYmxlIHRtcCA9IHsKKwkJLmRhdGEgPSAmcmFuZ2UsCisJCS5tYXhsZW4gPSBzaXplb2YocmFuZ2UpLAorCQkubW9kZSA9IHRhYmxlLT5tb2RlLAorCQkuZXh0cmExID0gJmxvY2FsX3BvcnRfcmFuZ2VfbWluLAorCQkuZXh0cmEyID0gJmxvY2FsX3BvcnRfcmFuZ2VfbWF4LAorCX07CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCgmdG1wLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKworCWlmICh3cml0ZSAmJiByZXQgPT0gMCkgeworCQlpZiAocmFuZ2VbMV0gPCByYW5nZVswXSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCXNldF9sb2NhbF9wb3J0X3JhbmdlKHJhbmdlKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBwaG9uZXRfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibG9jYWxfcG9ydF9yYW5nZSIsCisJCS5kYXRhCQk9ICZsb2NhbF9wb3J0X3JhbmdlLAorCQkubWF4bGVuCQk9IHNpemVvZihsb2NhbF9wb3J0X3JhbmdlKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2xvY2FsX3BvcnRfcmFuZ2UsCisJCS5zdHJhdGVneQk9IE5VTEwsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RydWN0IGN0bF9wYXRoIHBob25ldF9jdGxfcGF0aFtdID0geworCXsgLnByb2NuYW1lID0gIm5ldCIsIC5jdGxfbmFtZSA9IENUTF9ORVQsIH0sCisJeyAucHJvY25hbWUgPSAicGhvbmV0IiwgLmN0bF9uYW1lID0gQ1RMX1VOTlVNQkVSRUQsIH0sCisJeyB9LAorfTsKKworaW50IF9faW5pdCBwaG9uZXRfc3lzY3RsX2luaXQodm9pZCkKK3sKKwlwaG9uZXRfdGFibGVfaHJkID0gcmVnaXN0ZXJfc3lzY3RsX3BhdGhzKHBob25ldF9jdGxfcGF0aCwgcGhvbmV0X3RhYmxlKTsKKwlyZXR1cm4gcGhvbmV0X3RhYmxlX2hyZCA9PSBOVUxMID8gLUVOT01FTSA6IDA7Cit9CisKK3ZvaWQgcGhvbmV0X3N5c2N0bF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUocGhvbmV0X3RhYmxlX2hyZCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvcmZraWxsL3Jma2lsbC1pbnB1dC5jIGIvbmV0L3Jma2lsbC9yZmtpbGwtaW5wdXQuYwppbmRleCBlNWI2OTU1Li4yMTEyNGVjIDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1pbnB1dC5jCisrKyBiL25ldC9yZmtpbGwvcmZraWxsLWlucHV0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgInJma2lsbC1pbnB1dC5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmZraWxsL3Jma2lsbC1pbnB1dC5oIGIvbmV0L3Jma2lsbC9yZmtpbGwtaW5wdXQuaAppbmRleCBmNjNkMDUwLi5iYmZhNjQ2IDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1pbnB1dC5oCisrKyBiL25ldC9yZmtpbGwvcmZraWxsLWlucHV0LmgKQEAgLTEzLDUgKzEzLDYgQEAKIAogdm9pZCByZmtpbGxfc3dpdGNoX2FsbChlbnVtIHJma2lsbF90eXBlIHR5cGUsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKTsKIHZvaWQgcmZraWxsX2Vwbyh2b2lkKTsKK3ZvaWQgcmZraWxsX3Jlc3RvcmVfc3RhdGVzKHZvaWQpOwogCiAjZW5kaWYgLyogX19SRktJTExfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwuYyBiL25ldC9yZmtpbGwvcmZraWxsLmMKaW5kZXggNzRhZWNjMC4uZjk0OWE0OCAxMDA2NDQKLS0tIGEvbmV0L3Jma2lsbC9yZmtpbGwuYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC5jCkBAIC0zNywxNCArMzcsMjAgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIExJU1RfSEVBRChyZmtpbGxfbGlzdCk7CS8qIGxpc3Qgb2YgcmVnaXN0ZXJlZCByZiBzd2l0Y2hlcyAqLwotc3RhdGljIERFRklORV9NVVRFWChyZmtpbGxfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChyZmtpbGxfZ2xvYmFsX211dGV4KTsKIAogc3RhdGljIHVuc2lnbmVkIGludCByZmtpbGxfZGVmYXVsdF9zdGF0ZSA9IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVmYXVsdF9zdGF0ZSwgcmZraWxsX2RlZmF1bHRfc3RhdGUsIHVpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X3N0YXRlLAogCQkgIkRlZmF1bHQgaW5pdGlhbCBzdGF0ZSBmb3IgYWxsIHJhZGlvIHR5cGVzLCAwID0gcmFkaW8gb2ZmIik7CiAKLXN0YXRpYyBlbnVtIHJma2lsbF9zdGF0ZSByZmtpbGxfc3RhdGVzW1JGS0lMTF9UWVBFX01BWF07CitzdHJ1Y3QgcmZraWxsX2dzd19zdGF0ZSB7CisJZW51bSByZmtpbGxfc3RhdGUgY3VycmVudF9zdGF0ZTsKKwllbnVtIHJma2lsbF9zdGF0ZSBkZWZhdWx0X3N0YXRlOworfTsKKworc3RhdGljIHN0cnVjdCByZmtpbGxfZ3N3X3N0YXRlIHJma2lsbF9nbG9iYWxfc3RhdGVzW1JGS0lMTF9UWVBFX01BWF07CitzdGF0aWMgdW5zaWduZWQgbG9uZyByZmtpbGxfc3RhdGVzX2xvY2tkZmx0W0JJVFNfVE9fTE9OR1MoUkZLSUxMX1RZUEVfTUFYKV07CiAKIHN0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKHJma2lsbF9ub3RpZmllcl9saXN0KTsKIApAQCAtNzAsNiArNzYsNyBAQAogICovCiBpbnQgcmVnaXN0ZXJfcmZraWxsX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CisJQlVHX09OKCFuYik7CiAJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZyZmtpbGxfbm90aWZpZXJfbGlzdCwgbmIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfcmZraWxsX25vdGlmaWVyKTsKQEAgLTg1LDYgKzkyLDcgQEAKICAqLwogaW50IHVucmVnaXN0ZXJfcmZraWxsX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CisJQlVHX09OKCFuYik7CiAJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnJma2lsbF9ub3RpZmllcl9saXN0LCBuYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX3Jma2lsbF9ub3RpZmllcik7CkBAIC0xMTcsNiArMTI1LDcgQEAKIAogc3RhdGljIHZvaWQgbm90aWZ5X3Jma2lsbF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHJma2lsbCAqcmZraWxsKQogeworCXJma2lsbF9sZWRfdHJpZ2dlcihyZmtpbGwsIHJma2lsbC0+c3RhdGUpOwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJma2lsbF9ub3RpZmllcl9saXN0LAogCQkJUkZLSUxMX1NUQVRFX0NIQU5HRUQsCiAJCQlyZmtpbGwpOwpAQCAtMTk1LDYgKzIwNCwxMSBAQAogCQkgKiBCTE9DSyBldmVuIGEgdHJhbnNtaXR0ZXIgdGhhdCBpcyBhbHJlYWR5IGluIHN0YXRlCiAJCSAqIFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQgKi8KIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCBLRVJOX1dBUk5JTkcKKwkJCSJyZmtpbGw6IGlsbGVnYWwgc3RhdGUgJWQgcGFzc2VkIGFzIHBhcmFtZXRlciAiCisJCQkidG8gcmZraWxsX3RvZ2dsZV9yYWRpb1xuIiwgc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoZm9yY2UgfHwgc3RhdGUgIT0gcmZraWxsLT5zdGF0ZSkgewpAQCAtMjA0LDMxICsyMTgsMzYgQEAKIAkJCXJma2lsbC0+c3RhdGUgPSBzdGF0ZTsKIAl9CiAKLQlpZiAoZm9yY2UgfHwgcmZraWxsLT5zdGF0ZSAhPSBvbGRzdGF0ZSkgewotCQlyZmtpbGxfbGVkX3RyaWdnZXIocmZraWxsLCByZmtpbGwtPnN0YXRlKTsKKwlpZiAoZm9yY2UgfHwgcmZraWxsLT5zdGF0ZSAhPSBvbGRzdGF0ZSkKIAkJbm90aWZ5X3Jma2lsbF9zdGF0ZV9jaGFuZ2UocmZraWxsKTsKLQl9CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCiAvKioKLSAqIHJma2lsbF9zd2l0Y2hfYWxsIC0gVG9nZ2xlIHN0YXRlIG9mIGFsbCBzd2l0Y2hlcyBvZiBnaXZlbiB0eXBlCisgKiBfX3Jma2lsbF9zd2l0Y2hfYWxsIC0gVG9nZ2xlIHN0YXRlIG9mIGFsbCBzd2l0Y2hlcyBvZiBnaXZlbiB0eXBlCiAgKiBAdHlwZTogdHlwZSBvZiBpbnRlcmZhY2VzIHRvIGJlIGFmZmVjdGVkCiAgKiBAc3RhdGU6IHRoZSBuZXcgc3RhdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHRvZ2dsZXMgdGhlIHN0YXRlIG9mIGFsbCBzd2l0Y2hlcyBvZiBnaXZlbiB0eXBlLAogICogdW5sZXNzIGEgc3BlY2lmaWMgc3dpdGNoIGlzIGNsYWltZWQgYnkgdXNlcnNwYWNlIChpbiB3aGljaCBjYXNlLAogICogdGhhdCBzd2l0Y2ggaXMgbGVmdCBhbG9uZSkgb3Igc3VzcGVuZGVkLgorICoKKyAqIENhbGxlciBtdXN0IGhhdmUgYWNxdWlyZWQgcmZraWxsX2dsb2JhbF9tdXRleC4KICAqLwotdm9pZCByZmtpbGxfc3dpdGNoX2FsbChlbnVtIHJma2lsbF90eXBlIHR5cGUsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQorc3RhdGljIHZvaWQgX19yZmtpbGxfc3dpdGNoX2FsbChjb25zdCBlbnVtIHJma2lsbF90eXBlIHR5cGUsCisJCQkJY29uc3QgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCiB7CiAJc3RydWN0IHJma2lsbCAqcmZraWxsOwogCi0JbXV0ZXhfbG9jaygmcmZraWxsX211dGV4KTsKKwlpZiAoV0FSTigoc3RhdGUgPj0gUkZLSUxMX1NUQVRFX01BWCB8fCB0eXBlID49IFJGS0lMTF9UWVBFX01BWCksCisJCQlLRVJOX1dBUk5JTkcKKwkJCSJyZmtpbGw6IGlsbGVnYWwgc3RhdGUgJWQgb3IgdHlwZSAlZCAiCisJCQkicGFzc2VkIGFzIHBhcmFtZXRlciB0byBfX3Jma2lsbF9zd2l0Y2hfYWxsXG4iLAorCQkJc3RhdGUsIHR5cGUpKQorCQlyZXR1cm47CiAKLQlyZmtpbGxfc3RhdGVzW3R5cGVdID0gc3RhdGU7Ci0KKwlyZmtpbGxfZ2xvYmFsX3N0YXRlc1t0eXBlXS5jdXJyZW50X3N0YXRlID0gc3RhdGU7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZmtpbGwsICZyZmtpbGxfbGlzdCwgbm9kZSkgewogCQlpZiAoKCFyZmtpbGwtPnVzZXJfY2xhaW0pICYmIChyZmtpbGwtPnR5cGUgPT0gdHlwZSkpIHsKIAkJCW11dGV4X2xvY2soJnJma2lsbC0+bXV0ZXgpOwpAQCAtMjM2LDggKzI1NSwyMSBAQAogCQkJbXV0ZXhfdW5sb2NrKCZyZmtpbGwtPm11dGV4KTsKIAkJfQogCX0KK30KIAotCW11dGV4X3VubG9jaygmcmZraWxsX211dGV4KTsKKy8qKgorICogcmZraWxsX3N3aXRjaF9hbGwgLSBUb2dnbGUgc3RhdGUgb2YgYWxsIHN3aXRjaGVzIG9mIGdpdmVuIHR5cGUKKyAqIEB0eXBlOiB0eXBlIG9mIGludGVyZmFjZXMgdG8gYmUgYWZmZWN0ZWQKKyAqIEBzdGF0ZTogdGhlIG5ldyBzdGF0ZQorICoKKyAqIEFjcXVpcmVzIHJma2lsbF9nbG9iYWxfbXV0ZXggYW5kIGNhbGxzIF9fcmZraWxsX3N3aXRjaF9hbGwoQHR5cGUsIEBzdGF0ZSkuCisgKiBQbGVhc2UgcmVmZXIgdG8gX19yZmtpbGxfc3dpdGNoX2FsbCgpIGZvciBkZXRhaWxzLgorICovCit2b2lkIHJma2lsbF9zd2l0Y2hfYWxsKGVudW0gcmZraWxsX3R5cGUgdHlwZSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJbXV0ZXhfbG9jaygmcmZraWxsX2dsb2JhbF9tdXRleCk7CisJX19yZmtpbGxfc3dpdGNoX2FsbCh0eXBlLCBzdGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZyZmtpbGxfZ2xvYmFsX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0wocmZraWxsX3N3aXRjaF9hbGwpOwogCkBAIC0yNDUsMjMgKzI3Nyw1MyBAQAogICogcmZraWxsX2VwbyAtIGVtZXJnZW5jeSBwb3dlciBvZmYgYWxsIHRyYW5zbWl0dGVycwogICoKICAqIFRoaXMga2lja3MgYWxsIG5vbi1zdXNwZW5kZWQgcmZraWxsIGRldmljZXMgdG8gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCwKLSAqIGlnbm9yaW5nIGV2ZXJ5dGhpbmcgaW4gaXRzIHBhdGggYnV0IHJma2lsbF9tdXRleCBhbmQgcmZraWxsLT5tdXRleC4KKyAqIGlnbm9yaW5nIGV2ZXJ5dGhpbmcgaW4gaXRzIHBhdGggYnV0IHJma2lsbF9nbG9iYWxfbXV0ZXggYW5kIHJma2lsbC0+bXV0ZXguCisgKgorICogVGhlIGdsb2JhbCBzdGF0ZSBiZWZvcmUgdGhlIEVQTyBpcyBzYXZlZCBhbmQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyCisgKiB1c2luZyByZmtpbGxfcmVzdG9yZV9zdGF0ZXMoKS4KICAqLwogdm9pZCByZmtpbGxfZXBvKHZvaWQpCiB7CiAJc3RydWN0IHJma2lsbCAqcmZraWxsOworCWludCBpOwogCi0JbXV0ZXhfbG9jaygmcmZraWxsX211dGV4KTsKKwltdXRleF9sb2NrKCZyZmtpbGxfZ2xvYmFsX211dGV4KTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmZraWxsLCAmcmZraWxsX2xpc3QsIG5vZGUpIHsKIAkJbXV0ZXhfbG9jaygmcmZraWxsLT5tdXRleCk7CiAJCXJma2lsbF90b2dnbGVfcmFkaW8ocmZraWxsLCBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VELCAxKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZmtpbGwtPm11dGV4KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZyZmtpbGxfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBSRktJTExfVFlQRV9NQVg7IGkrKykgeworCQlyZmtpbGxfZ2xvYmFsX3N0YXRlc1tpXS5kZWZhdWx0X3N0YXRlID0KKwkJCQlyZmtpbGxfZ2xvYmFsX3N0YXRlc1tpXS5jdXJyZW50X3N0YXRlOworCQlyZmtpbGxfZ2xvYmFsX3N0YXRlc1tpXS5jdXJyZW50X3N0YXRlID0KKwkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworCX0KKwltdXRleF91bmxvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmZraWxsX2Vwbyk7CiAKIC8qKgorICogcmZraWxsX3Jlc3RvcmVfc3RhdGVzIC0gcmVzdG9yZSBnbG9iYWwgc3RhdGVzCisgKgorICogUmVzdG9yZSAoYW5kIHN5bmMgc3dpdGNoZXMgdG8pIHRoZSBnbG9iYWwgc3RhdGUgZnJvbSB0aGUKKyAqIHN0YXRlcyBpbiByZmtpbGxfZGVmYXVsdF9zdGF0ZXMuICBUaGlzIGNhbiB1bmRvIHRoZSBlZmZlY3RzIG9mCisgKiBhIGNhbGwgdG8gcmZraWxsX2VwbygpLgorICovCit2b2lkIHJma2lsbF9yZXN0b3JlX3N0YXRlcyh2b2lkKQoreworCWludCBpOworCisJbXV0ZXhfbG9jaygmcmZraWxsX2dsb2JhbF9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkZLSUxMX1RZUEVfTUFYOyBpKyspCisJCV9fcmZraWxsX3N3aXRjaF9hbGwoaSwgcmZraWxsX2dsb2JhbF9zdGF0ZXNbaV0uZGVmYXVsdF9zdGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZyZmtpbGxfZ2xvYmFsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJma2lsbF9yZXN0b3JlX3N0YXRlcyk7CisKKy8qKgogICogcmZraWxsX2ZvcmNlX3N0YXRlIC0gRm9yY2UgdGhlIGludGVybmFsIHJma2lsbCByYWRpbyBzdGF0ZQogICogQHJma2lsbDogcG9pbnRlciB0byB0aGUgcmZraWxsIGNsYXNzIHRvIG1vZGlmeS4KICAqIEBzdGF0ZTogdGhlIGN1cnJlbnQgcmFkaW8gc3RhdGUgdGhlIGNsYXNzIHNob3VsZCBiZSBmb3JjZWQgdG8uCkBAIC0yODIsOSArMzQ0LDExIEBACiB7CiAJZW51bSByZmtpbGxfc3RhdGUgb2xkc3RhdGU7CiAKLQlpZiAoc3RhdGUgIT0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCAmJgotCSAgICBzdGF0ZSAhPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEICYmCi0JICAgIHN0YXRlICE9IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQpCisJQlVHX09OKCFyZmtpbGwpOworCWlmIChXQVJOKChzdGF0ZSA+PSBSRktJTExfU1RBVEVfTUFYKSwKKwkJCUtFUk5fV0FSTklORworCQkJInJma2lsbDogaWxsZWdhbCBzdGF0ZSAlZCBwYXNzZWQgYXMgcGFyYW1ldGVyICIKKwkJCSJ0byByZmtpbGxfZm9yY2Vfc3RhdGVcbiIsIHN0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZyZmtpbGwtPm11dGV4KTsKQEAgLTM1MiwxMiArNDE2LDE2IEBACiAJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcmZraWxsICpyZmtpbGwgPSB0b19yZmtpbGwoZGV2KTsKLQl1bnNpZ25lZCBpbnQgc3RhdGUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJaW50IGVycm9yOwogCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCisJZXJyb3IgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZzdGF0ZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKIAkvKiBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEIGlzIGlsbGVnYWwgaGVyZS4uLiAqLwogCWlmIChzdGF0ZSAhPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEICYmCiAJICAgIHN0YXRlICE9IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQpCkBAIC0zODUsNyArNDUzLDggQEAKIAkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCByZmtpbGwgKnJma2lsbCA9IHRvX3Jma2lsbChkZXYpOwotCWJvb2wgY2xhaW0gPSAhIXNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisJdW5zaWduZWQgbG9uZyBjbGFpbV90bXA7CisJYm9vbCBjbGFpbTsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCkBAIC0zOTQsMTEgKzQ2MywxNiBAQAogCWlmIChyZmtpbGwtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAorCWVycm9yID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmY2xhaW1fdG1wKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwljbGFpbSA9ICEhY2xhaW1fdG1wOworCiAJLyoKIAkgKiBUYWtlIHRoZSBnbG9iYWwgbG9jayB0byBtYWtlIHN1cmUgdGhlIGtlcm5lbCBpcyBub3QgaW4KIAkgKiB0aGUgbWlkZGxlIG9mIHJma2lsbF9zd2l0Y2hfYWxsCiAJICovCi0JZXJyb3IgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJma2lsbF9tdXRleCk7CisJZXJyb3IgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJma2lsbF9nbG9iYWxfbXV0ZXgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCkBAIC00MDYsMTQgKzQ4MCwxNCBAQAogCQlpZiAoIWNsYWltKSB7CiAJCQltdXRleF9sb2NrKCZyZmtpbGwtPm11dGV4KTsKIAkJCXJma2lsbF90b2dnbGVfcmFkaW8ocmZraWxsLAotCQkJCQkgICAgcmZraWxsX3N0YXRlc1tyZmtpbGwtPnR5cGVdLAotCQkJCQkgICAgMCk7CisJCQkJCXJma2lsbF9nbG9iYWxfc3RhdGVzW3Jma2lsbC0+dHlwZV0uY3VycmVudF9zdGF0ZSwKKwkJCQkJMCk7CiAJCQltdXRleF91bmxvY2soJnJma2lsbC0+bXV0ZXgpOwogCQl9CiAJCXJma2lsbC0+dXNlcl9jbGFpbSA9IGNsYWltOwogCX0KIAotCW11dGV4X3VubG9jaygmcmZraWxsX211dGV4KTsKKwltdXRleF91bmxvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOwogCiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBjb3VudDsKIH0KQEAgLTQzNywyMSArNTExLDkgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcmZraWxsX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IHJma2lsbCAqcmZraWxsID0gdG9fcmZraWxsKGRldik7Ci0KLQlpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBzdGF0ZS5ldmVudCkgewotCQlpZiAoc3RhdGUuZXZlbnQgJiBQTV9FVkVOVF9TTEVFUCkgewotCQkJLyogU3RvcCB0cmFuc21pdHRlciwga2VlcCBzdGF0ZSwgbm8gbm90aWZpZXMgKi8KLQkJCXVwZGF0ZV9yZmtpbGxfc3RhdGUocmZraWxsKTsKLQotCQkJbXV0ZXhfbG9jaygmcmZraWxsLT5tdXRleCk7Ci0JCQlyZmtpbGwtPnRvZ2dsZV9yYWRpbyhyZmtpbGwtPmRhdGEsCi0JCQkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEKTsKLQkJCW11dGV4X3VubG9jaygmcmZraWxsLT5tdXRleCk7Ci0JCX0KLQorCS8qIG1hcmsgY2xhc3MgZGV2aWNlIGFzIHN1c3BlbmRlZCAqLworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICE9IHN0YXRlLmV2ZW50KQogCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC01MjUsMjQgKzU4Nyw2MCBAQAogCS5kZXZfdWV2ZW50CT0gcmZraWxsX2Rldl91ZXZlbnQsCiB9OwogCitzdGF0aWMgaW50IHJma2lsbF9jaGVja19kdXBsaWNpdHkoY29uc3Qgc3RydWN0IHJma2lsbCAqcmZraWxsKQoreworCXN0cnVjdCByZmtpbGwgKnA7CisJdW5zaWduZWQgbG9uZyBzZWVuW0JJVFNfVE9fTE9OR1MoUkZLSUxMX1RZUEVfTUFYKV07CisKKwltZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnJma2lsbF9saXN0LCBub2RlKSB7CisJCWlmIChXQVJOKChwID09IHJma2lsbCksIEtFUk5fV0FSTklORworCQkJCSJyZmtpbGw6IGlsbGVnYWwgYXR0ZW1wdCB0byByZWdpc3RlciAiCisJCQkJImFuIGFscmVhZHkgcmVnaXN0ZXJlZCByZmtpbGwgc3RydWN0XG4iKSkKKwkJCXJldHVybiAtRUVYSVNUOworCQlzZXRfYml0KHAtPnR5cGUsIHNlZW4pOworCX0KKworCS8qIDA6IGZpcnN0IHN3aXRjaCBvZiBpdHMga2luZCAqLworCXJldHVybiB0ZXN0X2JpdChyZmtpbGwtPnR5cGUsIHNlZW4pOworfQorCiBzdGF0aWMgaW50IHJma2lsbF9hZGRfc3dpdGNoKHN0cnVjdCByZmtpbGwgKnJma2lsbCkKIHsKLQltdXRleF9sb2NrKCZyZmtpbGxfbXV0ZXgpOworCWludCBlcnJvcjsKIAotCXJma2lsbF90b2dnbGVfcmFkaW8ocmZraWxsLCByZmtpbGxfc3RhdGVzW3Jma2lsbC0+dHlwZV0sIDApOworCW11dGV4X2xvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOworCisJZXJyb3IgPSByZmtpbGxfY2hlY2tfZHVwbGljaXR5KHJma2lsbCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byB1bmxvY2tfb3V0OworCisJaWYgKCFlcnJvcikgeworCQkvKiBsb2NrIGRlZmF1bHQgYWZ0ZXIgZmlyc3QgdXNlICovCisJCXNldF9iaXQocmZraWxsLT50eXBlLCByZmtpbGxfc3RhdGVzX2xvY2tkZmx0KTsKKwkJcmZraWxsX2dsb2JhbF9zdGF0ZXNbcmZraWxsLT50eXBlXS5jdXJyZW50X3N0YXRlID0KKwkJCXJma2lsbF9nbG9iYWxfc3RhdGVzW3Jma2lsbC0+dHlwZV0uZGVmYXVsdF9zdGF0ZTsKKwl9CisKKwlyZmtpbGxfdG9nZ2xlX3JhZGlvKHJma2lsbCwKKwkJCSAgICByZmtpbGxfZ2xvYmFsX3N0YXRlc1tyZmtpbGwtPnR5cGVdLmN1cnJlbnRfc3RhdGUsCisJCQkgICAgMCk7CiAKIAlsaXN0X2FkZF90YWlsKCZyZmtpbGwtPm5vZGUsICZyZmtpbGxfbGlzdCk7CiAKLQltdXRleF91bmxvY2soJnJma2lsbF9tdXRleCk7CisJZXJyb3IgPSAwOwordW5sb2NrX291dDoKKwltdXRleF91bmxvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCByZmtpbGxfcmVtb3ZlX3N3aXRjaChzdHJ1Y3QgcmZraWxsICpyZmtpbGwpCiB7Ci0JbXV0ZXhfbG9jaygmcmZraWxsX211dGV4KTsKKwltdXRleF9sb2NrKCZyZmtpbGxfZ2xvYmFsX211dGV4KTsKIAlsaXN0X2RlbF9pbml0KCZyZmtpbGwtPm5vZGUpOwotCW11dGV4X3VubG9jaygmcmZraWxsX211dGV4KTsKKwltdXRleF91bmxvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOwogCiAJbXV0ZXhfbG9jaygmcmZraWxsLT5tdXRleCk7CiAJcmZraWxsX3RvZ2dsZV9yYWRpbyhyZmtpbGwsIFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQsIDEpOwpAQCAtNTYyLDExICs2NjAsMTggQEAKICAqIE5PVEU6IElmIHJlZ2lzdHJhdGlvbiBmYWlscyB0aGUgc3RydWN0dXJlIHNob3VkbCBiZSBmcmVlZCBieSBjYWxsaW5nCiAgKiByZmtpbGxfZnJlZSgpIG90aGVyd2lzZSByZmtpbGxfdW5yZWdpc3RlcigpIHNob3VsZCBiZSB1c2VkLgogICovCi1zdHJ1Y3QgcmZraWxsICpyZmtpbGxfYWxsb2NhdGUoc3RydWN0IGRldmljZSAqcGFyZW50LCBlbnVtIHJma2lsbF90eXBlIHR5cGUpCitzdHJ1Y3QgcmZraWxsICogX19tdXN0X2NoZWNrIHJma2lsbF9hbGxvY2F0ZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCSAgICAgZW51bSByZmtpbGxfdHlwZSB0eXBlKQogewogCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKKwlpZiAoV0FSTigodHlwZSA+PSBSRktJTExfVFlQRV9NQVgpLAorCQkJS0VSTl9XQVJOSU5HCisJCQkicmZraWxsOiBpbGxlZ2FsIHR5cGUgJWQgcGFzc2VkIGFzIHBhcmFtZXRlciAiCisJCQkidG8gcmZraWxsX2FsbG9jYXRlXG4iLCB0eXBlKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlyZmtpbGwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmZraWxsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZmtpbGwpCiAJCXJldHVybiBOVUxMOwpAQCAtNjMzLDE1ICs3MzgsMTggQEAKICAqIHN0cnVjdHVyZSBuZWVkcyB0byBiZSByZWdpc3RlcmVkLiBJbW1lZGlhdGVseSBmcm9tIHJlZ2lzdHJhdGlvbiB0aGUKICAqIHN3aXRjaCBkcml2ZXIgc2hvdWxkIGJlIGFibGUgdG8gc2VydmljZSBjYWxscyB0byB0b2dnbGVfcmFkaW8uCiAgKi8KLWludCByZmtpbGxfcmVnaXN0ZXIoc3RydWN0IHJma2lsbCAqcmZraWxsKQoraW50IF9fbXVzdF9jaGVjayByZmtpbGxfcmVnaXN0ZXIoc3RydWN0IHJma2lsbCAqcmZraWxsKQogewogCXN0YXRpYyBhdG9taWNfdCByZmtpbGxfbm8gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcmZraWxsLT5kZXY7CiAJaW50IGVycm9yOwogCi0JaWYgKCFyZmtpbGwtPnRvZ2dsZV9yYWRpbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHJma2lsbC0+dHlwZSA+PSBSRktJTExfVFlQRV9NQVgpCisJaWYgKFdBUk4oKCFyZmtpbGwgfHwgIXJma2lsbC0+dG9nZ2xlX3JhZGlvIHx8CisJCQlyZmtpbGwtPnR5cGUgPj0gUkZLSUxMX1RZUEVfTUFYIHx8CisJCQlyZmtpbGwtPnN0YXRlID49IFJGS0lMTF9TVEFURV9NQVgpLAorCQkJS0VSTl9XQVJOSU5HCisJCQkicmZraWxsOiBhdHRlbXB0IHRvIHJlZ2lzdGVyIGEgIgorCQkJImJhZGx5IGluaXRpYWxpemVkIHJma2lsbCBzdHJ1Y3RcbiIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNucHJpbnRmKGRldi0+YnVzX2lkLCBzaXplb2YoZGV2LT5idXNfaWQpLApAQCAtNjc2LDYgKzc4NCw3IEBACiAgKi8KIHZvaWQgcmZraWxsX3VucmVnaXN0ZXIoc3RydWN0IHJma2lsbCAqcmZraWxsKQogeworCUJVR19PTighcmZraWxsKTsKIAlkZXZpY2VfZGVsKCZyZmtpbGwtPmRldik7CiAJcmZraWxsX3JlbW92ZV9zd2l0Y2gocmZraWxsKTsKIAlyZmtpbGxfbGVkX3RyaWdnZXJfdW5yZWdpc3RlcihyZmtpbGwpOwpAQCAtNjgzLDYgKzc5Miw1NiBAQAogfQogRVhQT1JUX1NZTUJPTChyZmtpbGxfdW5yZWdpc3Rlcik7CiAKKy8qKgorICogcmZraWxsX3NldF9kZWZhdWx0IC0gc2V0IGluaXRpYWwgdmFsdWUgZm9yIGEgc3dpdGNoIHR5cGUKKyAqIEB0eXBlIC0gdGhlIHR5cGUgb2Ygc3dpdGNoIHRvIHNldCB0aGUgZGVmYXVsdCBzdGF0ZSBvZgorICogQHN0YXRlIC0gdGhlIG5ldyBkZWZhdWx0IHN0YXRlIGZvciB0aGF0IGdyb3VwIG9mIHN3aXRjaGVzCisgKgorICogU2V0cyB0aGUgaW5pdGlhbCBzdGF0ZSByZmtpbGwgc2hvdWxkIHVzZSBmb3IgYSBnaXZlbiB0eXBlLgorICogVGhlIGZvbGxvd2luZyBpbml0aWFsIHN0YXRlcyBhcmUgYWxsb3dlZDogUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRAorICogYW5kIFJGS0lMTF9TVEFURV9VTkJMT0NLRUQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IHBsYXRmb3JtIGRyaXZlcnMgZm9yIHBsYXRmb3JtcworICogdGhhdCBjYW4gc2F2ZSBzd2l0Y2ggc3RhdGUgYWNyb3NzIHBvd2VyIGRvd24vcmVib290LgorICoKKyAqIFRoZSBkZWZhdWx0IHN0YXRlIGZvciBlYWNoIHN3aXRjaCB0eXBlIGNhbiBiZSBjaGFuZ2VkIGV4YWN0bHkgb25jZS4KKyAqIEFmdGVyIGEgc3dpdGNoIG9mIHRoYXQgdHlwZSBpcyByZWdpc3RlcmVkLCB0aGUgZGVmYXVsdCBzdGF0ZSBjYW5ub3QKKyAqIGJlIGNoYW5nZWQgYW55bW9yZS4gIFRoaXMgZ3VhcmRzIGFnYWluc3QgbXVsdGlwbGUgZHJpdmVycyBpdCB0aGUKKyAqIHNhbWUgcGxhdGZvcm0gdHJ5aW5nIHRvIHNldCB0aGUgaW5pdGlhbCBzd2l0Y2ggZGVmYXVsdCBzdGF0ZSwgd2hpY2gKKyAqIGlzIG5vdCBhbGxvd2VkLgorICoKKyAqIFJldHVybnMgLUVQRVJNIGlmIHRoZSBzdGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHNldCBvbmNlIG9yIGlzIGluIHVzZSwKKyAqIHNvIGRyaXZlcnMgbGlrZWx5IHdhbnQgdG8gZWl0aGVyIGlnbm9yZSBvciBhdCBtb3N0IHByaW50ayhLRVJOX05PVElDRSkKKyAqIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtRVBFUk0uCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBuZXcgZGVmYXVsdCBzdGF0ZSB3YXMgc2V0LCBvciBhbiBlcnJvciBpZiBpdAorICogY291bGQgbm90IGJlIHNldC4KKyAqLworaW50IHJma2lsbF9zZXRfZGVmYXVsdChlbnVtIHJma2lsbF90eXBlIHR5cGUsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWludCBlcnJvcjsKKworCWlmIChXQVJOKCh0eXBlID49IFJGS0lMTF9UWVBFX01BWCB8fAorCQkJKHN0YXRlICE9IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQgJiYKKwkJCSBzdGF0ZSAhPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSksCisJCQlLRVJOX1dBUk5JTkcKKwkJCSJyZmtpbGw6IGlsbGVnYWwgc3RhdGUgJWQgb3IgdHlwZSAlZCBwYXNzZWQgYXMgIgorCQkJInBhcmFtZXRlciB0byByZmtpbGxfc2V0X2RlZmF1bHRcbiIsIHN0YXRlLCB0eXBlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZyZmtpbGxfZ2xvYmFsX211dGV4KTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eXBlLCByZmtpbGxfc3RhdGVzX2xvY2tkZmx0KSkgeworCQlyZmtpbGxfZ2xvYmFsX3N0YXRlc1t0eXBlXS5kZWZhdWx0X3N0YXRlID0gc3RhdGU7CisJCWVycm9yID0gMDsKKwl9IGVsc2UKKwkJZXJyb3IgPSAtRVBFUk07CisKKwltdXRleF91bmxvY2soJnJma2lsbF9nbG9iYWxfbXV0ZXgpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJma2lsbF9zZXRfZGVmYXVsdCk7CisKIC8qCiAgKiBSZmtpbGwgbW9kdWxlIGluaXRpYWxpemF0aW9uL2RlaW5pdGlhbGl6YXRpb24uCiAgKi8KQEAgLTY5Niw4ICs4NTUsOCBAQAogCSAgICByZmtpbGxfZGVmYXVsdF9zdGF0ZSAhPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJma2lsbF9zdGF0ZXMpOyBpKyspCi0JCXJma2lsbF9zdGF0ZXNbaV0gPSByZmtpbGxfZGVmYXVsdF9zdGF0ZTsKKwlmb3IgKGkgPSAwOyBpIDwgUkZLSUxMX1RZUEVfTUFYOyBpKyspCisJCXJma2lsbF9nbG9iYWxfc3RhdGVzW2ldLmRlZmF1bHRfc3RhdGUgPSByZmtpbGxfZGVmYXVsdF9zdGF0ZTsKIAogCWVycm9yID0gY2xhc3NfcmVnaXN0ZXIoJnJma2lsbF9jbGFzcyk7CiAJaWYgKGVycm9yKSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvS2NvbmZpZyBiL25ldC9zY2hlZC9LY29uZmlnCmluZGV4IDk0MzdiMjcuLjY3NjdlNTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9LY29uZmlnCisrKyBiL25ldC9zY2hlZC9LY29uZmlnCkBAIC0xMDYsNiArMTA2LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX3ByaW8uCiAKK2NvbmZpZyBORVRfU0NIX01VTFRJUQorCXRyaXN0YXRlICJIYXJkd2FyZSBNdWx0aXF1ZXVlLWF3YXJlIE11bHRpIEJhbmQgUXVldWluZyAoTVVMVElRKSIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBuLWJhbmQgcXVldWUgcGFja2V0IHNjaGVkdWxlcgorCSAgdG8gc3VwcG9ydCBkZXZpY2VzIHRoYXQgaGF2ZSBtdWx0aXBsZSBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzY2hfbXVsdGlxLgorCiBjb25maWcgTkVUX1NDSF9SRUQKIAl0cmlzdGF0ZSAiUmFuZG9tIEVhcmx5IERldGVjdGlvbiAoUkVEKSIKIAktLS1oZWxwLS0tCkBAIC00NzYsNiArNDg1LDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2ltcGxlLgogCitjb25maWcgTkVUX0FDVF9TS0JFRElUCisgICAgICAgIHRyaXN0YXRlICJTS0IgRWRpdGluZyIKKyAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVAorICAgICAgICAtLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGNoYW5nZSBza2IgcHJpb3JpdHkgb3IgcXVldWVfbWFwcGluZyBzZXR0aW5ncy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNrYmVkaXQuCisKIGNvbmZpZyBORVRfQ0xTX0lORAogCWJvb2wgIkluY29taW5nIGRldmljZSBjbGFzc2lmaWNhdGlvbiIKIAlkZXBlbmRzIG9uIE5FVF9DTFNfVTMyIHx8IE5FVF9DTFNfRlcKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9NYWtlZmlsZSBiL25ldC9zY2hlZC9NYWtlZmlsZQppbmRleCAxZDJiMGY3Li5lNjBjOTkyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvTWFrZWZpbGUKKysrIGIvbmV0L3NjaGVkL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfTkVUX0FDVF9OQVQpCSs9IGFjdF9uYXQubwogb2JqLSQoQ09ORklHX05FVF9BQ1RfUEVESVQpCSs9IGFjdF9wZWRpdC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9TSU1QKQkrPSBhY3Rfc2ltcGxlLm8KK29iai0kKENPTkZJR19ORVRfQUNUX1NLQkVESVQpCSs9IGFjdF9za2JlZGl0Lm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0ZJRk8pCSs9IHNjaF9maWZvLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0NCUSkJKz0gc2NoX2NicS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9IVEIpCSs9IHNjaF9odGIubwpAQCAtMjYsNiArMjcsNyBAQAogb2JqLSQoQ09ORklHX05FVF9TQ0hfVEJGKQkrPSBzY2hfdGJmLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX1RFUUwpCSs9IHNjaF90ZXFsLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX1BSSU8pCSs9IHNjaF9wcmlvLm8KK29iai0kKENPTkZJR19ORVRfU0NIX01VTFRJUSkJKz0gc2NoX211bHRpcS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9BVE0pCSs9IHNjaF9hdG0ubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfTkVURU0pCSs9IHNjaF9uZXRlbS5vCiBvYmotJChDT05GSUdfTkVUX0NMU19VMzIpCSs9IGNsc191MzIubwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9pcHQuYyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKaW5kZXggZDEyNjNiMy4uMDQ1M2Q3OSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9pcHQuYworKysgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCkBAIC00MCw2ICs0MCw3IEBACiAKIHN0YXRpYyBpbnQgaXB0X2luaXRfdGFyZ2V0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0LCBjaGFyICp0YWJsZSwgdW5zaWduZWQgaW50IGhvb2spCiB7CisJc3RydWN0IHh0X3RnY2hrX3BhcmFtIHBhcjsKIAlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQ5LDI5ICs1MCwzMCBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCXQtPnUua2VybmVsLnRhcmdldCA9IHRhcmdldDsKKwlwYXIudGFibGUgICAgID0gdGFibGU7CisJcGFyLmVudHJ5aW5mbyA9IE5VTEw7CisJcGFyLnRhcmdldCAgICA9IHRhcmdldDsKKwlwYXIudGFyZ2luZm8gID0gdC0+ZGF0YTsKKwlwYXIuaG9va19tYXNrID0gaG9vazsKKwlwYXIuZmFtaWx5ICAgID0gTkZQUk9UT19JUFY0OwogCi0JcmV0ID0geHRfY2hlY2tfdGFyZ2V0KHRhcmdldCwgQUZfSU5FVCwgdC0+dS50YXJnZXRfc2l6ZSAtIHNpemVvZigqdCksCi0JCQkgICAgICB0YWJsZSwgaG9vaywgMCwgMCk7Ci0JaWYgKHJldCkgeworCXJldCA9IHh0X2NoZWNrX3RhcmdldCgmcGFyLCB0LT51LnRhcmdldF9zaXplIC0gc2l6ZW9mKCp0KSwgMCwgZmFsc2UpOworCWlmIChyZXQgPCAwKSB7CiAJCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CiAJCXJldHVybiByZXQ7CiAJfQotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkKLQkgICAgJiYgIXQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeSh0YWJsZSwgTlVMTCwKLQkJCQkJICAgICAgIHQtPnUua2VybmVsLnRhcmdldCwgdC0+ZGF0YSwKLQkJCQkJICAgICAgIGhvb2spKSB7Ci0JCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaXB0X2Rlc3Ryb3lfdGFyZ2V0KHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0KQogewotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmRlc3Ryb3kpCi0JCXQtPnUua2VybmVsLnRhcmdldC0+ZGVzdHJveSh0LT51Lmtlcm5lbC50YXJnZXQsIHQtPmRhdGEpOwotCW1vZHVsZV9wdXQodC0+dS5rZXJuZWwudGFyZ2V0LT5tZSk7CisJc3RydWN0IHh0X3RnZHRvcl9wYXJhbSBwYXIgPSB7CisJCS50YXJnZXQgICA9IHQtPnUua2VybmVsLnRhcmdldCwKKwkJLnRhcmdpbmZvID0gdC0+ZGF0YSwKKwl9OworCWlmIChwYXIudGFyZ2V0LT5kZXN0cm95ICE9IE5VTEwpCisJCXBhci50YXJnZXQtPmRlc3Ryb3koJnBhcik7CisJbW9kdWxlX3B1dChwYXIudGFyZ2V0LT5tZSk7CiB9CiAKIHN0YXRpYyBpbnQgdGNmX2lwdF9yZWxlYXNlKHN0cnVjdCB0Y2ZfaXB0ICppcHQsIGludCBiaW5kKQpAQCAtMTk2LDYgKzE5OCw3IEBACiB7CiAJaW50IHJldCA9IDAsIHJlc3VsdCA9IDA7CiAJc3RydWN0IHRjZl9pcHQgKmlwdCA9IGEtPnByaXY7CisJc3RydWN0IHh0X3RhcmdldF9wYXJhbSBwYXI7CiAKIAlpZiAoc2tiX2Nsb25lZChza2IpKSB7CiAJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCkBAIC0yMTEsMTAgKzIxNCwxMyBAQAogCS8qIHllcywgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCBib3RoIGluIGFuZCBvdXQgZGV2CiAJIHdvcnJ5IGxhdGVyIC0gZGFuZ2VyIC0gdGhpcyBBUEkgc2VlbXMgdG8gaGF2ZSBjaGFuZ2VkCiAJIGZyb20gZWFybGllciBrZXJuZWxzICovCi0JcmV0ID0gaXB0LT50Y2ZpX3QtPnUua2VybmVsLnRhcmdldC0+dGFyZ2V0KHNrYiwgc2tiLT5kZXYsIE5VTEwsCi0JCQkJCQkgICBpcHQtPnRjZmlfaG9vaywKLQkJCQkJCSAgIGlwdC0+dGNmaV90LT51Lmtlcm5lbC50YXJnZXQsCi0JCQkJCQkgICBpcHQtPnRjZmlfdC0+ZGF0YSk7CisJcGFyLmluICAgICAgID0gc2tiLT5kZXY7CisJcGFyLm91dCAgICAgID0gTlVMTDsKKwlwYXIuaG9va251bSAgPSBpcHQtPnRjZmlfaG9vazsKKwlwYXIudGFyZ2V0ICAgPSBpcHQtPnRjZmlfdC0+dS5rZXJuZWwudGFyZ2V0OworCXBhci50YXJnaW5mbyA9IGlwdC0+dGNmaV90LT5kYXRhOworCXJldCA9IHBhci50YXJnZXQtPnRhcmdldChza2IsICZwYXIpOworCiAJc3dpdGNoIChyZXQpIHsKIAljYXNlIE5GX0FDQ0VQVDoKIAkJcmVzdWx0ID0gVENfQUNUX09LOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9za2JlZGl0LmMgYi9uZXQvc2NoZWQvYWN0X3NrYmVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk3NzdlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9za2JlZGl0LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfc2tiZWRpdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfc2tiZWRpdC5oPgorCisjZGVmaW5lIFNLQkVESVRfVEFCX01BU0sgICAgIDE1CitzdGF0aWMgc3RydWN0IHRjZl9jb21tb24gKnRjZl9za2JlZGl0X2h0W1NLQkVESVRfVEFCX01BU0sgKyAxXTsKK3N0YXRpYyB1MzIgc2tiZWRpdF9pZHhfZ2VuOworc3RhdGljIERFRklORV9SV0xPQ0soc2tiZWRpdF9sb2NrKTsKKworc3RhdGljIHN0cnVjdCB0Y2ZfaGFzaGluZm8gc2tiZWRpdF9oYXNoX2luZm8gPSB7CisJLmh0YWIJPQl0Y2Zfc2tiZWRpdF9odCwKKwkuaG1hc2sJPQlTS0JFRElUX1RBQl9NQVNLLAorCS5sb2NrCT0JJnNrYmVkaXRfbG9jaywKK307CisKK3N0YXRpYyBpbnQgdGNmX3NrYmVkaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwKKwkJICAgICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IHRjZl9za2JlZGl0ICpkID0gYS0+cHJpdjsKKworCXNwaW5fbG9jaygmZC0+dGNmX2xvY2spOworCWQtPnRjZl90bS5sYXN0dXNlID0gamlmZmllczsKKwlkLT50Y2ZfYnN0YXRzLmJ5dGVzICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKKwlkLT50Y2ZfYnN0YXRzLnBhY2tldHMrKzsKKworCWlmIChkLT5mbGFncyAmIFNLQkVESVRfRl9QUklPUklUWSkKKwkJc2tiLT5wcmlvcml0eSA9IGQtPnByaW9yaXR5OworCWlmIChkLT5mbGFncyAmIFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HICYmCisJICAgIHNrYi0+ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPiBkLT5xdWV1ZV9tYXBwaW5nKQorCQlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBkLT5xdWV1ZV9tYXBwaW5nKTsKKworCXNwaW5fdW5sb2NrKCZkLT50Y2ZfbG9jayk7CisJcmV0dXJuIGQtPnRjZl9hY3Rpb247Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBza2JlZGl0X3BvbGljeVtUQ0FfU0tCRURJVF9NQVggKyAxXSA9IHsKKwlbVENBX1NLQkVESVRfUEFSTVNdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfc2tiZWRpdCkgfSwKKwlbVENBX1NLQkVESVRfUFJJT1JJVFldCQk9IHsgLmxlbiA9IHNpemVvZih1MzIpIH0sCisJW1RDQV9TS0JFRElUX1FVRVVFX01BUFBJTkddCT0geyAubGVuID0gc2l6ZW9mKHUxNikgfSwKK307CisKK3N0YXRpYyBpbnQgdGNmX3NrYmVkaXRfaW5pdChzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCBubGF0dHIgKmVzdCwKKwkJCSBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgb3ZyLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfU0tCRURJVF9NQVggKyAxXTsKKwlzdHJ1Y3QgdGNfc2tiZWRpdCAqcGFybTsKKwlzdHJ1Y3QgdGNmX3NrYmVkaXQgKmQ7CisJc3RydWN0IHRjZl9jb21tb24gKnBjOworCXUzMiBmbGFncyA9IDAsICpwcmlvcml0eSA9IE5VTEw7CisJdTE2ICpxdWV1ZV9tYXBwaW5nID0gTlVMTDsKKwlpbnQgcmV0ID0gMCwgZXJyOworCisJaWYgKG5sYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIFRDQV9TS0JFRElUX01BWCwgbmxhLCBza2JlZGl0X3BvbGljeSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAodGJbVENBX1NLQkVESVRfUEFSTVNdID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9TS0JFRElUX1BSSU9SSVRZXSAhPSBOVUxMKSB7CisJCWZsYWdzIHw9IFNLQkVESVRfRl9QUklPUklUWTsKKwkJcHJpb3JpdHkgPSBubGFfZGF0YSh0YltUQ0FfU0tCRURJVF9QUklPUklUWV0pOworCX0KKworCWlmICh0YltUQ0FfU0tCRURJVF9RVUVVRV9NQVBQSU5HXSAhPSBOVUxMKSB7CisJCWZsYWdzIHw9IFNLQkVESVRfRl9RVUVVRV9NQVBQSU5HOworCQlxdWV1ZV9tYXBwaW5nID0gbmxhX2RhdGEodGJbVENBX1NLQkVESVRfUVVFVUVfTUFQUElOR10pOworCX0KKwlpZiAoIWZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcm0gPSBubGFfZGF0YSh0YltUQ0FfU0tCRURJVF9QQVJNU10pOworCisJcGMgPSB0Y2ZfaGFzaF9jaGVjayhwYXJtLT5pbmRleCwgYSwgYmluZCwgJnNrYmVkaXRfaGFzaF9pbmZvKTsKKwlpZiAoIXBjKSB7CisJCXBjID0gdGNmX2hhc2hfY3JlYXRlKHBhcm0tPmluZGV4LCBlc3QsIGEsIHNpemVvZigqZCksIGJpbmQsCisJCQkJICAgICAmc2tiZWRpdF9pZHhfZ2VuLCAmc2tiZWRpdF9oYXNoX2luZm8pOworCQlpZiAodW5saWtlbHkoIXBjKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWQgPSB0b19za2JlZGl0KHBjKTsKKwkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQlkID0gdG9fc2tiZWRpdChwYyk7CisJCWlmICghb3ZyKSB7CisJCQl0Y2ZfaGFzaF9yZWxlYXNlKHBjLCBiaW5kLCAmc2tiZWRpdF9oYXNoX2luZm8pOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfYmgoJmQtPnRjZl9sb2NrKTsKKworCWQtPmZsYWdzID0gZmxhZ3M7CisJaWYgKGZsYWdzICYgU0tCRURJVF9GX1BSSU9SSVRZKQorCQlkLT5wcmlvcml0eSA9ICpwcmlvcml0eTsKKwlpZiAoZmxhZ3MgJiBTS0JFRElUX0ZfUVVFVUVfTUFQUElORykKKwkJZC0+cXVldWVfbWFwcGluZyA9ICpxdWV1ZV9tYXBwaW5nOworCWQtPnRjZl9hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisKKwlzcGluX3VubG9ja19iaCgmZC0+dGNmX2xvY2spOworCisJaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQorCQl0Y2ZfaGFzaF9pbnNlcnQocGMsICZza2JlZGl0X2hhc2hfaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNmX3NrYmVkaXRfY2xlYW51cChzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3NrYmVkaXQgKmQgPSBhLT5wcml2OworCisJaWYgKGQpCisJCXJldHVybiB0Y2ZfaGFzaF9yZWxlYXNlKCZkLT5jb21tb24sIGJpbmQsICZza2JlZGl0X2hhc2hfaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRjZl9za2JlZGl0X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwKKwkJCQlpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXN0cnVjdCB0Y2Zfc2tiZWRpdCAqZCA9IGEtPnByaXY7CisJc3RydWN0IHRjX3NrYmVkaXQgb3B0OworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmluZGV4ID0gZC0+dGNmX2luZGV4OworCW9wdC5yZWZjbnQgPSBkLT50Y2ZfcmVmY250IC0gcmVmOworCW9wdC5iaW5kY250ID0gZC0+dGNmX2JpbmRjbnQgLSBiaW5kOworCW9wdC5hY3Rpb24gPSBkLT50Y2ZfYWN0aW9uOworCU5MQV9QVVQoc2tiLCBUQ0FfU0tCRURJVF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOworCWlmIChkLT5mbGFncyAmIFNLQkVESVRfRl9QUklPUklUWSkKKwkJTkxBX1BVVChza2IsIFRDQV9TS0JFRElUX1BSSU9SSVRZLCBzaXplb2YoZC0+cHJpb3JpdHkpLAorCQkJJmQtPnByaW9yaXR5KTsKKwlpZiAoZC0+ZmxhZ3MgJiBTS0JFRElUX0ZfUVVFVUVfTUFQUElORykKKwkJTkxBX1BVVChza2IsIFRDQV9TS0JFRElUX1FVRVVFX01BUFBJTkcsCisJCQlzaXplb2YoZC0+cXVldWVfbWFwcGluZyksICZkLT5xdWV1ZV9tYXBwaW5nKTsKKwl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIGQtPnRjZl90bS5pbnN0YWxsKTsKKwl0Lmxhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIGQtPnRjZl90bS5sYXN0dXNlKTsKKwl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoZC0+dGNmX3RtLmV4cGlyZXMpOworCU5MQV9QVVQoc2tiLCBUQ0FfU0tCRURJVF9UTSwgc2l6ZW9mKHQpLCAmdCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfdHJpbShza2IsIGIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9za2JlZGl0X29wcyA9IHsKKwkua2luZAkJPQkic2tiZWRpdCIsCisJLmhpbmZvCQk9CSZza2JlZGl0X2hhc2hfaW5mbywKKwkudHlwZQkJPQlUQ0FfQUNUX1NLQkVESVQsCisJLmNhcGFiCQk9CVRDQV9DQVBfTk9ORSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2Zfc2tiZWRpdCwKKwkuZHVtcAkJPQl0Y2Zfc2tiZWRpdF9kdW1wLAorCS5jbGVhbnVwCT0JdGNmX3NrYmVkaXRfY2xlYW51cCwKKwkuaW5pdAkJPQl0Y2Zfc2tiZWRpdF9pbml0LAorCS53YWxrCQk9CXRjZl9nZW5lcmljX3dhbGtlciwKK307CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBEdXljaywgPGFsZXhhbmRlci5oLmR1eWNrQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0tCIEVkaXRpbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgc2tiZWRpdF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3Rfc2tiZWRpdF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tiZWRpdF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X3NrYmVkaXRfb3BzKTsKK30KKworbW9kdWxlX2luaXQoc2tiZWRpdF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChza2JlZGl0X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZmxvdy5jIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKaW5kZXggOGY2M2ExYS4uMGViYWZmNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKQEAgLTY3LDkgKzY3LDkgQEAKIHN0YXRpYyB1MzIgZmxvd19nZXRfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJcmV0dXJuIG50b2hsKGlwX2hkcihza2IpLT5zYWRkcik7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CiAJCXJldHVybiBudG9obChpcHY2X2hkcihza2IpLT5zYWRkci5zNl9hZGRyMzJbM10pOwogCWRlZmF1bHQ6CiAJCXJldHVybiBhZGRyX2ZvbGQoc2tiLT5zayk7CkBAIC03OSw5ICs3OSw5IEBACiBzdGF0aWMgdTMyIGZsb3dfZ2V0X2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCXJldHVybiBudG9obChpcF9oZHIoc2tiKS0+ZGFkZHIpOwotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgogCQlyZXR1cm4gbnRvaGwoaXB2Nl9oZHIoc2tiKS0+ZGFkZHIuczZfYWRkcjMyWzNdKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gYWRkcl9mb2xkKHNrYi0+ZHN0KSBeIChfX2ZvcmNlIHUxNilza2ItPnByb3RvY29sOwpAQCAtOTEsOSArOTEsOSBAQAogc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCXJldHVybiBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CiAJCXJldHVybiBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJdTMyIHJlcyA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOiB7CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6IHsKIAkJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCQlpZiAoIShpcGgtPmZyYWdfb2ZmJmh0b25zKElQX01GfElQX09GRlNFVCkpICYmCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCXJlcyA9IG50b2hzKCooX19iZTE2ICopKCh2b2lkICopaXBoICsgaXBoLT5paGwgKiA0KSk7CiAJCWJyZWFrOwogCX0KLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6IHsKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOiB7CiAJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCiAJCWlmIChoYXNfcG9ydHMoaXBoLT5uZXh0aGRyKSkKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCXUzMiByZXMgPSAwOwogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTogeworCWNhc2UgaHRvbnMoRVRIX1BfSVApOiB7CiAJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAkJaWYgKCEoaXBoLT5mcmFnX29mZiZodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSAmJgpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCQlyZXMgPSBudG9ocygqKF9fYmUxNiAqKSgodm9pZCAqKWlwaCArIGlwaC0+aWhsICogNCArIDIpKTsKIAkJYnJlYWs7CiAJfQotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTogeworCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6IHsKIAkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAKIAkJaWYgKGhhc19wb3J0cyhpcGgtPm5leHRoZHIpKQpAQCAtMjEzLDkgKzIxMyw5IEBACiBzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3Rfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKwljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJcmV0dXJuIG50b2hsKENUVFVQTEUoc2tiLCBzcmMudTMuaXApKTsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAkJcmV0dXJuIG50b2hsKENUVFVQTEUoc2tiLCBzcmMudTMuaXA2WzNdKSk7CiAJfQogZmFsbGJhY2s6CkBAIC0yMjUsOSArMjI1LDkgQEAKIHN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlyZXR1cm4gbnRvaGwoQ1RUVVBMRShza2IsIGRzdC51My5pcCkpOwotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgogCQlyZXR1cm4gbnRvaGwoQ1RUVVBMRShza2IsIGRzdC51My5pcDZbM10pKTsKIAl9CiBmYWxsYmFjazoKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV9jbXAuYyBiL25ldC9zY2hlZC9lbV9jbXAuYwppbmRleCBjYzQ5YzkzLi5iYzQ1MDM5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvZW1fY21wLmMKKysrIGIvbmV0L3NjaGVkL2VtX2NtcC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdGNfZW1hdGNoL3RjX2VtX2NtcC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogCiBzdGF0aWMgaW5saW5lIGludCBjbXBfbmVlZHNfdHJhbnNmb3JtYXRpb24oc3RydWN0IHRjZl9lbV9jbXAgKmNtcCkKQEAgLTM3LDggKzM4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgVENGX0VNX0FMSUdOX1UxNjoKLQkJCXZhbCA9ICpwdHIgPDwgODsKLQkJCXZhbCB8PSAqKHB0cisxKTsKKwkJCXZhbCA9IGdldF91bmFsaWduZWRfYmUxNihwdHIpOwogCiAJCQlpZiAoY21wX25lZWRzX3RyYW5zZm9ybWF0aW9uKGNtcCkpCiAJCQkJdmFsID0gYmUxNl90b19jcHUodmFsKTsKQEAgLTQ3LDEwICs0Nyw3IEBACiAJCWNhc2UgVENGX0VNX0FMSUdOX1UzMjoKIAkJCS8qIFdvcnRoIGNoZWNraW5nIGJvdW5kcmllcz8gVGhlIGJyYW5jaGluZyBzZWVtcwogCQkJICogdG8gZ2V0IHdvcnNlLiBWaXNpdCBhZ2Fpbi4gKi8KLQkJCXZhbCA9ICpwdHIgPDwgMjQ7Ci0JCQl2YWwgfD0gKihwdHIrMSkgPDwgMTY7Ci0JCQl2YWwgfD0gKihwdHIrMikgPDwgODsKLQkJCXZhbCB8PSAqKHB0ciszKTsKKwkJCXZhbCA9IGdldF91bmFsaWduZWRfYmUzMihwdHIpOwogCiAJCQlpZiAoY21wX25lZWRzX3RyYW5zZm9ybWF0aW9uKGNtcCkpCiAJCQkJdmFsID0gYmUzMl90b19jcHUodmFsKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMgYi9uZXQvc2NoZWQvc2NoX2RzbWFyay5jCmluZGV4IGVkZDEyOTguLmJhNDNhYWIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9kc21hcmsuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAKIAlpZiAocC0+c2V0X3RjX2luZGV4KSB7CiAJCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCQljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJCWlmIChza2JfY293X2hlYWQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCQkJZ290byBkcm9wOwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJCQkmIH5JTkVUX0VDTl9NQVNLOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOgorCQljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgogCQkJaWYgKHNrYl9jb3dfaGVhZChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQogCQkJCWdvdG8gZHJvcDsKIApAQCAtMjg5LDExICsyODksMTEgQEAKIAlwcl9kZWJ1ZygiaW5kZXggJWQtPiVkXG4iLCBza2ItPnRjX2luZGV4LCBpbmRleCk7CiAKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKGlwX2hkcihza2IpLCBwLT5tYXNrW2luZGV4XSwKIAkJCQkgICAgcC0+dmFsdWVbaW5kZXhdKTsKIAkJCWJyZWFrOwotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgogCQlpcHY2X2NoYW5nZV9kc2ZpZWxkKGlwdjZfaGRyKHNrYiksIHAtPm1hc2tbaW5kZXhdLAogCQkJCSAgICBwLT52YWx1ZVtpbmRleF0pOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IDk2MzQwOTEuLjdiNTU3MmQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC00NCwyMyArNDQsMzAgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZGV2X3JlcXVldWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqcSkKIHsKLQlpZiAodW5saWtlbHkoc2tiLT5uZXh0KSkKLQkJcS0+Z3NvX3NrYiA9IHNrYjsKLQllbHNlCi0JCXEtPm9wcy0+cmVxdWV1ZShza2IsIHEpOwotCisJcS0+Z3NvX3NrYiA9IHNrYjsKKwlxLT5xc3RhdHMucmVxdWV1ZXMrKzsKIAlfX25ldGlmX3NjaGVkdWxlKHEpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfc2tiKHN0cnVjdCBRZGlzYyAqcSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBxLT5nc29fc2tiOwogCi0JaWYgKChza2IgPSBxLT5nc29fc2tiKSkKLQkJcS0+Z3NvX3NrYiA9IE5VTEw7Ci0JZWxzZQorCWlmICh1bmxpa2VseShza2IpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBxZGlzY19kZXYocSk7CisJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKworCQkvKiBjaGVjayB0aGUgcmVhc29uIG9mIHJlcXVldWluZyB3aXRob3V0IHR4IGxvY2sgZmlyc3QgKi8KKwkJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKKwkJaWYgKCFuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgJiYgIW5ldGlmX3R4X3F1ZXVlX2Zyb3plbih0eHEpKQorCQkJcS0+Z3NvX3NrYiA9IE5VTEw7CisJCWVsc2UKKwkJCXNrYiA9IE5VTEw7CisJfSBlbHNlIHsKIAkJc2tiID0gcS0+ZGVxdWV1ZShxKTsKKwl9CiAKIAlyZXR1cm4gc2tiOwogfQpAQCAtMjE1LDEwICsyMjIsOSBAQAogCQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgKGRldi0+dHJhbnNfc3RhcnQgKwogCQkJCQkJIGRldi0+d2F0Y2hkb2dfdGltZW8pKSkgewogCQkJCWNoYXIgZHJpdmVybmFtZVs2NF07Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiTkVUREVWIFdBVENIRE9HOiAlcyAoJXMpOiB0cmFuc21pdCB0aW1lZCBvdXRcbiIsCisJCQkJV0FSTl9PTkNFKDEsIEtFUk5fSU5GTyAiTkVUREVWIFdBVENIRE9HOiAlcyAoJXMpOiB0cmFuc21pdCB0aW1lZCBvdXRcbiIsCiAJCQkJICAgICAgIGRldi0+bmFtZSwgbmV0ZGV2X2RyaXZlcm5hbWUoZGV2LCBkcml2ZXJuYW1lLCA2NCkpOwogCQkJCWRldi0+dHhfdGltZW91dChkZXYpOwotCQkJCVdBUk5fT05fT05DRSgxKTsKIAkJCX0KIAkJCWlmICghbW9kX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyLAogCQkJCSAgICAgICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKwpAQCAtMzI4LDYgKzMzNCw3IEBACiAJLmZsYWdzCQk9CVRDUV9GX0JVSUxUSU4sCiAJLm9wcwkJPQkmbm9vcF9xZGlzY19vcHMsCiAJLmxpc3QJCT0JTElTVF9IRUFEX0lOSVQobm9vcF9xZGlzYy5saXN0KSwKKwkucmVxdWV1ZS5sb2NrCT0JX19TUElOX0xPQ0tfVU5MT0NLRUQobm9vcF9xZGlzYy5xLmxvY2spLAogCS5xLmxvY2sJCT0JX19TUElOX0xPQ0tfVU5MT0NLRUQobm9vcF9xZGlzYy5xLmxvY2spLAogCS5kZXZfcXVldWUJPQkmbm9vcF9uZXRkZXZfcXVldWUsCiB9OwpAQCAtMzUzLDYgKzM2MCw3IEBACiAJLmZsYWdzCQk9CVRDUV9GX0JVSUxUSU4sCiAJLm9wcwkJPQkmbm9xdWV1ZV9xZGlzY19vcHMsCiAJLmxpc3QJCT0JTElTVF9IRUFEX0lOSVQobm9xdWV1ZV9xZGlzYy5saXN0KSwKKwkucmVxdWV1ZS5sb2NrCT0JX19TUElOX0xPQ0tfVU5MT0NLRUQobm9xdWV1ZV9xZGlzYy5xLmxvY2spLAogCS5xLmxvY2sJCT0JX19TUElOX0xPQ0tfVU5MT0NLRUQobm9xdWV1ZV9xZGlzYy5xLmxvY2spLAogCS5kZXZfcXVldWUJPQkmbm9xdWV1ZV9uZXRkZXZfcXVldWUsCiB9OwpAQCAtNDczLDYgKzQ4MSw3IEBACiAJc2NoLT5wYWRkZWQgPSAoY2hhciAqKSBzY2ggLSAoY2hhciAqKSBwOwogCiAJSU5JVF9MSVNUX0hFQUQoJnNjaC0+bGlzdCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NoLT5yZXF1ZXVlKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOwogCXNjaC0+b3BzID0gb3BzOwogCXNjaC0+ZW5xdWV1ZSA9IG9wcy0+ZW5xdWV1ZTsKQEAgLTU0MSw2ICs1NTAsNyBAQAogCWRldl9wdXQocWRpc2NfZGV2KHFkaXNjKSk7CiAKIAlrZnJlZV9za2IocWRpc2MtPmdzb19za2IpOworCV9fc2tiX3F1ZXVlX3B1cmdlKCZxZGlzYy0+cmVxdWV1ZSk7CiAKIAlrZnJlZSgoY2hhciAqKSBxZGlzYyAtIHFkaXNjLT5wYWRkZWQpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tdWx0aXEuYyBiL25ldC9zY2hlZC9zY2hfbXVsdGlxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1ZjMxNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfbXVsdGlxLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBEdXljayA8YWxleGFuZGVyLmguZHV5Y2tAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKKworc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhIHsKKwl1MTYgYmFuZHM7CisJdTE2IG1heF9iYW5kczsKKwl1MTYgY3VyYmFuZDsKKwlzdHJ1Y3QgdGNmX3Byb3RvICpmaWx0ZXJfbGlzdDsKKwlzdHJ1Y3QgUWRpc2MgKipxdWV1ZXM7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKgorbXVsdGlxX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLCBpbnQgKnFlcnIpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXUzMiBiYW5kOworCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKKwlpbnQgZXJyOworCisJKnFlcnIgPSBORVRfWE1JVF9TVUNDRVNTIHwgX19ORVRfWE1JVF9CWVBBU1M7CisJZXJyID0gdGNfY2xhc3NpZnkoc2tiLCBxLT5maWx0ZXJfbGlzdCwgJnJlcyk7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJc3dpdGNoIChlcnIpIHsKKwljYXNlIFRDX0FDVF9TVE9MRU46CisJY2FzZSBUQ19BQ1RfUVVFVUVEOgorCQkqcWVyciA9IE5FVF9YTUlUX1NVQ0NFU1MgfCBfX05FVF9YTUlUX1NUT0xFTjsKKwljYXNlIFRDX0FDVF9TSE9UOgorCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKwliYW5kID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisKKwlpZiAoYmFuZCA+PSBxLT5iYW5kcykKKwkJcmV0dXJuIHEtPnF1ZXVlc1swXTsKKworCXJldHVybiBxLT5xdWV1ZXNbYmFuZF07Cit9CisKK3N0YXRpYyBpbnQKK211bHRpcV9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBRZGlzYyAqcWRpc2M7CisJaW50IHJldDsKKworCXFkaXNjID0gbXVsdGlxX2NsYXNzaWZ5KHNrYiwgc2NoLCAmcmV0KTsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlpZiAocWRpc2MgPT0gTlVMTCkgeworCisJCWlmIChyZXQgJiBfX05FVF9YTUlUX0JZUEFTUykKKwkJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisJcmV0ID0gcWRpc2NfZW5xdWV1ZShza2IsIHFkaXNjKTsKKwlpZiAocmV0ID09IE5FVF9YTUlUX1NVQ0NFU1MpIHsKKwkJc2NoLT5ic3RhdHMuYnl0ZXMgKz0gcWRpc2NfcGt0X2xlbihza2IpOworCQlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CisJCXNjaC0+cS5xbGVuKys7CisJCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworCX0KKwlpZiAobmV0X3htaXRfZHJvcF9jb3VudChyZXQpKQorCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorbXVsdGlxX3JlcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IFFkaXNjICpxZGlzYzsKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IHJldDsKKworCXFkaXNjID0gbXVsdGlxX2NsYXNzaWZ5KHNrYiwgc2NoLCAmcmV0KTsKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlpZiAocWRpc2MgPT0gTlVMTCkgeworCQlpZiAocmV0ICYgX19ORVRfWE1JVF9CWVBBU1MpCisJCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKworCXJldCA9IHFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxZGlzYyk7CisJaWYgKHJldCA9PSBORVRfWE1JVF9TVUNDRVNTKSB7CisJCXNjaC0+cS5xbGVuKys7CisJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CisJCWlmIChxLT5jdXJiYW5kKQorCQkJcS0+Y3VyYmFuZC0tOworCQllbHNlCisJCQlxLT5jdXJiYW5kID0gcS0+YmFuZHMgLSAxOworCQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKKwl9CisJaWYgKG5ldF94bWl0X2Ryb3BfY291bnQocmV0KSkKKwkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXVsdGlxX2RlcXVldWUoc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBRZGlzYyAqcWRpc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgYmFuZDsKKworCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBxLT5iYW5kczsgYmFuZCsrKSB7CisJCS8qIGN5Y2xlIHRocm91Z2ggYmFuZHMgdG8gZW5zdXJlIGZhaXJuZXNzICovCisJCXEtPmN1cmJhbmQrKzsKKwkJaWYgKHEtPmN1cmJhbmQgPj0gcS0+YmFuZHMpCisJCQlxLT5jdXJiYW5kID0gMDsKKworCQkvKiBDaGVjayB0aGF0IHRhcmdldCBzdWJxdWV1ZSBpcyBhdmFpbGFibGUgYmVmb3JlCisJCSAqIHB1bGxpbmcgYW4gc2tiIHRvIGF2b2lkIGV4Y2Vzc2l2ZSByZXF1ZXVlcworCQkgKi8KKwkJaWYgKCFfX25ldGlmX3N1YnF1ZXVlX3N0b3BwZWQocWRpc2NfZGV2KHNjaCksIHEtPmN1cmJhbmQpKSB7CisJCQlxZGlzYyA9IHEtPnF1ZXVlc1txLT5jdXJiYW5kXTsKKwkJCXNrYiA9IHFkaXNjLT5kZXF1ZXVlKHFkaXNjKTsKKwkJCWlmIChza2IpIHsKKwkJCQlzY2gtPnEucWxlbi0tOworCQkJCXJldHVybiBza2I7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtdWx0aXFfZHJvcChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IGJhbmQ7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdHJ1Y3QgUWRpc2MgKnFkaXNjOworCisJZm9yIChiYW5kID0gcS0+YmFuZHMtMTsgYmFuZCA+PSAwOyBiYW5kLS0pIHsKKwkJcWRpc2MgPSBxLT5xdWV1ZXNbYmFuZF07CisJCWlmIChxZGlzYy0+b3BzLT5kcm9wKSB7CisJCQlsZW4gPSBxZGlzYy0+b3BzLT5kcm9wKHFkaXNjKTsKKwkJCWlmIChsZW4gIT0gMCkgeworCQkJCXNjaC0+cS5xbGVuLS07CisJCQkJcmV0dXJuIGxlbjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorbXVsdGlxX3Jlc2V0KHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXUxNiBiYW5kOworCXN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBxLT5iYW5kczsgYmFuZCsrKQorCQlxZGlzY19yZXNldChxLT5xdWV1ZXNbYmFuZF0pOworCXNjaC0+cS5xbGVuID0gMDsKKwlxLT5jdXJiYW5kID0gMDsKK30KKworc3RhdGljIHZvaWQKK211bHRpcV9kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQoreworCWludCBiYW5kOworCXN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCXRjZl9kZXN0cm95X2NoYWluKCZxLT5maWx0ZXJfbGlzdCk7CisJZm9yIChiYW5kID0gMDsgYmFuZCA8IHEtPmJhbmRzOyBiYW5kKyspCisJCXFkaXNjX2Rlc3Ryb3kocS0+cXVldWVzW2JhbmRdKTsKKworCWtmcmVlKHEtPnF1ZXVlcyk7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX3R1bmUoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBubGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IHRjX211bHRpcV9xb3B0ICpxb3B0OworCWludCBpOworCisJaWYgKCFuZXRpZl9pc19tdWx0aXF1ZXVlKHFkaXNjX2RldihzY2gpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5sYV9sZW4ob3B0KSA8IHNpemVvZigqcW9wdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcW9wdCA9IG5sYV9kYXRhKG9wdCk7CisKKwlxb3B0LT5iYW5kcyA9IHFkaXNjX2RldihzY2gpLT5yZWFsX251bV90eF9xdWV1ZXM7CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJcS0+YmFuZHMgPSBxb3B0LT5iYW5kczsKKwlmb3IgKGkgPSBxLT5iYW5kczsgaSA8IHEtPm1heF9iYW5kczsgaSsrKSB7CisJCWlmIChxLT5xdWV1ZXNbaV0gIT0gJm5vb3BfcWRpc2MpIHsKKwkJCXN0cnVjdCBRZGlzYyAqY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbaV0sICZub29wX3FkaXNjKTsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihjaGlsZCwgY2hpbGQtPnEucWxlbik7CisJCQlxZGlzY19kZXN0cm95KGNoaWxkKTsKKwkJfQorCX0KKworCXNjaF90cmVlX3VubG9jayhzY2gpOworCisJZm9yIChpID0gMDsgaSA8IHEtPmJhbmRzOyBpKyspIHsKKwkJaWYgKHEtPnF1ZXVlc1tpXSA9PSAmbm9vcF9xZGlzYykgeworCQkJc3RydWN0IFFkaXNjICpjaGlsZDsKKwkJCWNoaWxkID0gcWRpc2NfY3JlYXRlX2RmbHQocWRpc2NfZGV2KHNjaCksCisJCQkJCQkgIHNjaC0+ZGV2X3F1ZXVlLAorCQkJCQkJICAmcGZpZm9fcWRpc2Nfb3BzLAorCQkJCQkJICBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsCisJCQkJCQkJICAgIGkgKyAxKSk7CisJCQlpZiAoY2hpbGQpIHsKKwkJCQlzY2hfdHJlZV9sb2NrKHNjaCk7CisJCQkJY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbaV0sIGNoaWxkKTsKKworCQkJCWlmIChjaGlsZCAhPSAmbm9vcF9xZGlzYykgeworCQkJCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oY2hpbGQsCisJCQkJCQkJCSBjaGlsZC0+cS5xbGVuKTsKKwkJCQkJcWRpc2NfZGVzdHJveShjaGlsZCk7CisJCQkJfQorCQkJCXNjaF90cmVlX3VubG9jayhzY2gpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG11bHRpcV9pbml0KHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgbmxhdHRyICpvcHQpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCWludCBpLCBlcnI7CisKKwlxLT5xdWV1ZXMgPSBOVUxMOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXEtPm1heF9iYW5kcyA9IHFkaXNjX2RldihzY2gpLT5udW1fdHhfcXVldWVzOworCisJcS0+cXVldWVzID0ga2NhbGxvYyhxLT5tYXhfYmFuZHMsIHNpemVvZihzdHJ1Y3QgUWRpc2MgKiksIEdGUF9LRVJORUwpOworCWlmICghcS0+cXVldWVzKQorCQlyZXR1cm4gLUVOT0JVRlM7CisJZm9yIChpID0gMDsgaSA8IHEtPm1heF9iYW5kczsgaSsrKQorCQlxLT5xdWV1ZXNbaV0gPSAmbm9vcF9xZGlzYzsKKworCWVyciA9IG11bHRpcV90dW5lKHNjaCxvcHQpOworCisJaWYgKGVycikKKwkJa2ZyZWUocS0+cXVldWVzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CisJc3RydWN0IHRjX211bHRpcV9xb3B0IG9wdDsKKworCW9wdC5iYW5kcyA9IHEtPmJhbmRzOworCW9wdC5tYXhfYmFuZHMgPSBxLT5tYXhfYmFuZHM7CisKKwlOTEFfUFVUKHNrYiwgVENBX09QVElPTlMsIHNpemVvZihvcHQpLCAmb3B0KTsKKworCXJldHVybiBza2ItPmxlbjsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX3RyaW0oc2tiLCBiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX2dyYWZ0KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IFFkaXNjICpuZXcsCisJCSAgICAgIHN0cnVjdCBRZGlzYyAqKm9sZCkKK3sKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJdW5zaWduZWQgbG9uZyBiYW5kID0gYXJnIC0gMTsKKworCWlmIChiYW5kID49IHEtPmJhbmRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXcgPT0gTlVMTCkKKwkJbmV3ID0gJm5vb3BfcWRpc2M7CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisJKm9sZCA9IHEtPnF1ZXVlc1tiYW5kXTsKKwlxLT5xdWV1ZXNbYmFuZF0gPSBuZXc7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKCpvbGQsICgqb2xkKS0+cS5xbGVuKTsKKwlxZGlzY19yZXNldCgqb2xkKTsKKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjICoKK211bHRpcV9sZWFmKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJdW5zaWduZWQgbG9uZyBiYW5kID0gYXJnIC0gMTsKKworCWlmIChiYW5kID49IHEtPmJhbmRzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBxLT5xdWV1ZXNbYmFuZF07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG11bHRpcV9nZXQoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwl1bnNpZ25lZCBsb25nIGJhbmQgPSBUQ19IX01JTihjbGFzc2lkKTsKKworCWlmIChiYW5kIC0gMSA+PSBxLT5iYW5kcykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJhbmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG11bHRpcV9iaW5kKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIHBhcmVudCwKKwkJCQkgdTMyIGNsYXNzaWQpCit7CisJcmV0dXJuIG11bHRpcV9nZXQoc2NoLCBjbGFzc2lkKTsKK30KKworCitzdGF0aWMgdm9pZCBtdWx0aXFfcHV0KHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGhhbmRsZSwgdTMyIHBhcmVudCwKKwkJCSBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBjbCA9ICphcmc7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKGNsIC0gMSA+IHEtPmJhbmRzKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdWx0aXFfZGVsZXRlKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGNsKQoreworCXN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlpZiAoY2wgLSAxID4gcS0+YmFuZHMpCisJCXJldHVybiAtRU5PRU5UOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbXVsdGlxX2R1bXBfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdGNtKQoreworCXN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWlmIChjbCAtIDEgPiBxLT5iYW5kcykKKwkJcmV0dXJuIC1FTk9FTlQ7CisJdGNtLT50Y21faGFuZGxlIHw9IFRDX0hfTUlOKGNsKTsKKwlpZiAocS0+cXVldWVzW2NsLTFdKQorCQl0Y20tPnRjbV9pbmZvID0gcS0+cXVldWVzW2NsLTFdLT5oYW5kbGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXVsdGlxX2R1bXBfY2xhc3Nfc3RhdHMoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wsCisJCQkJIHN0cnVjdCBnbmV0X2R1bXAgKmQpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBRZGlzYyAqY2xfcTsKKworCWNsX3EgPSBxLT5xdWV1ZXNbY2wgLSAxXTsKKwlpZiAoZ25ldF9zdGF0c19jb3B5X2Jhc2ljKGQsICZjbF9xLT5ic3RhdHMpIDwgMCB8fAorCSAgICBnbmV0X3N0YXRzX2NvcHlfcXVldWUoZCwgJmNsX3EtPnFzdGF0cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXVsdGlxX3dhbGsoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBxZGlzY193YWxrZXIgKmFyZykKK3sKKwlzdHJ1Y3QgbXVsdGlxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJaW50IGJhbmQ7CisKKwlpZiAoYXJnLT5zdG9wKQorCQlyZXR1cm47CisKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcS0+YmFuZHM7IGJhbmQrKykgeworCQlpZiAoYXJnLT5jb3VudCA8IGFyZy0+c2tpcCkgeworCQkJYXJnLT5jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZy0+Zm4oc2NoLCBiYW5kKzEsIGFyZykgPCAwKSB7CisJCQlhcmctPnN0b3AgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYXJnLT5jb3VudCsrOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfcHJvdG8gKiptdWx0aXFfZmluZF90Y2Yoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgY2wpCit7CisJc3RydWN0IG11bHRpcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCisJaWYgKGNsKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnEtPmZpbHRlcl9saXN0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IFFkaXNjX2NsYXNzX29wcyBtdWx0aXFfY2xhc3Nfb3BzID0geworCS5ncmFmdAkJPQltdWx0aXFfZ3JhZnQsCisJLmxlYWYJCT0JbXVsdGlxX2xlYWYsCisJLmdldAkJPQltdWx0aXFfZ2V0LAorCS5wdXQJCT0JbXVsdGlxX3B1dCwKKwkuY2hhbmdlCQk9CW11bHRpcV9jaGFuZ2UsCisJLmRlbGV0ZQkJPQltdWx0aXFfZGVsZXRlLAorCS53YWxrCQk9CW11bHRpcV93YWxrLAorCS50Y2ZfY2hhaW4JPQltdWx0aXFfZmluZF90Y2YsCisJLmJpbmRfdGNmCT0JbXVsdGlxX2JpbmQsCisJLnVuYmluZF90Y2YJPQltdWx0aXFfcHV0LAorCS5kdW1wCQk9CW11bHRpcV9kdW1wX2NsYXNzLAorCS5kdW1wX3N0YXRzCT0JbXVsdGlxX2R1bXBfY2xhc3Nfc3RhdHMsCit9OworCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBtdWx0aXFfcWRpc2Nfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5leHQJCT0JTlVMTCwKKwkuY2xfb3BzCQk9CSZtdWx0aXFfY2xhc3Nfb3BzLAorCS5pZAkJPQkibXVsdGlxIiwKKwkucHJpdl9zaXplCT0Jc2l6ZW9mKHN0cnVjdCBtdWx0aXFfc2NoZWRfZGF0YSksCisJLmVucXVldWUJPQltdWx0aXFfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9CW11bHRpcV9kZXF1ZXVlLAorCS5yZXF1ZXVlCT0JbXVsdGlxX3JlcXVldWUsCisJLmRyb3AJCT0JbXVsdGlxX2Ryb3AsCisJLmluaXQJCT0JbXVsdGlxX2luaXQsCisJLnJlc2V0CQk9CW11bHRpcV9yZXNldCwKKwkuZGVzdHJveQk9CW11bHRpcV9kZXN0cm95LAorCS5jaGFuZ2UJCT0JbXVsdGlxX3R1bmUsCisJLmR1bXAJCT0JbXVsdGlxX2R1bXAsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXVsdGlxX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZtdWx0aXFfcWRpc2Nfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG11bHRpcV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcWRpc2MoJm11bHRpcV9xZGlzY19vcHMpOworfQorCittb2R1bGVfaW5pdChtdWx0aXFfbW9kdWxlX2luaXQpCittb2R1bGVfZXhpdChtdWx0aXFfbW9kdWxlX2V4aXQpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCAzNzgxZTU1Li5hMTE5NTk5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC0zODgsNiArMzg4LDIwIEBACiAJW1RDQV9ORVRFTV9DT1JSVVBUXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfbmV0ZW1fY29ycnVwdCkgfSwKIH07CiAKK3N0YXRpYyBpbnQgcGFyc2VfYXR0cihzdHJ1Y3QgbmxhdHRyICp0YltdLCBpbnQgbWF4dHlwZSwgc3RydWN0IG5sYXR0ciAqbmxhLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSAqcG9saWN5LCBpbnQgbGVuKQoreworCWludCBuZXN0ZWRfbGVuID0gbmxhX2xlbihubGEpIC0gTkxBX0FMSUdOKGxlbik7CisKKwlpZiAobmVzdGVkX2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChuZXN0ZWRfbGVuID49IG5sYV9hdHRyX3NpemUoMCkpCisJCXJldHVybiBubGFfcGFyc2UodGIsIG1heHR5cGUsIG5sYV9kYXRhKG5sYSkgKyBOTEFfQUxJR04obGVuKSwKKwkJCQkgbmVzdGVkX2xlbiwgcG9saWN5KTsKKwltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgbmxhdHRyICopICogKG1heHR5cGUgKyAxKSk7CisJcmV0dXJuIDA7Cit9CisKIC8qIFBhcnNlIG5ldGxpbmsgbWVzc2FnZSB0byBzZXQgb3B0aW9ucyAqLwogc3RhdGljIGludCBuZXRlbV9jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBubGF0dHIgKm9wdCkKIHsKQEAgLTM5OSw4ICs0MTMsOCBAQAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBubGFfcGFyc2VfbmVzdGVkX2NvbXBhdCh0YiwgVENBX05FVEVNX01BWCwgb3B0LCBuZXRlbV9wb2xpY3ksCi0JCQkJICAgICAgcW9wdCwgc2l6ZW9mKCpxb3B0KSk7CisJcW9wdCA9IG5sYV9kYXRhKG9wdCk7CisJcmV0ID0gcGFyc2VfYXR0cih0YiwgVENBX05FVEVNX01BWCwgb3B0LCBuZXRlbV9wb2xpY3ksIHNpemVvZigqcW9wdCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3ByaW8uYyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCmluZGV4IGE2Njk3YzYuLjUwNGE3OGMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0yNTQsMTYgKzI1NCwxMiBAQAogewogCXN0cnVjdCBwcmlvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKLQlzdHJ1Y3QgbmxhdHRyICpuZXN0OwogCXN0cnVjdCB0Y19wcmlvX3FvcHQgb3B0OwogCiAJb3B0LmJhbmRzID0gcS0+YmFuZHM7CiAJbWVtY3B5KCZvcHQucHJpb21hcCwgcS0+cHJpbzJiYW5kLCBUQ19QUklPX01BWCsxKTsKIAotCW5lc3QgPSBubGFfbmVzdF9jb21wYXRfc3RhcnQoc2tiLCBUQ0FfT1BUSU9OUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCWlmIChuZXN0ID09IE5VTEwpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCW5sYV9uZXN0X2NvbXBhdF9lbmQoc2tiLCBuZXN0KTsKKwlOTEFfUFVUKHNrYiwgVENBX09QVElPTlMsIHNpemVvZihvcHQpLCAmb3B0KTsKIAogCXJldHVybiBza2ItPmxlbjsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggNmUwNDFkMS4uZmUxNTA4ZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAl1MzIgaCwgaDI7CiAKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCXsKIAkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAkJaCA9IGlwaC0+ZGFkZHI7CkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJCWgyIF49ICooKCh1MzIqKWlwaCkgKyBpcGgtPmlobCk7CiAJCWJyZWFrOwogCX0KLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CisJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAl7CiAJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCQloID0gaXBoLT5kYWRkci5zNl9hZGRyMzJbM107CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDg0NzJiOGIuLmY0YjIzMDQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0yODMsOCArMjgzLDcgQEAKIAlpZiAoIXNjdHBfdWxwcV9pbml0KCZhc29jLT51bHBxLCBhc29jKSkKIAkJZ290byBmYWlsX2luaXQ7CiAKLQkvKiBTZXQgdXAgdGhlIHRzbiB0cmFja2luZy4gKi8KLQlzY3RwX3Rzbm1hcF9pbml0KCZhc29jLT5wZWVyLnRzbl9tYXAsIFNDVFBfVFNOX01BUF9TSVpFLCAwKTsKKwltZW1zZXQoJmFzb2MtPnBlZXIudHNuX21hcCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3Rzbm1hcCkpOwogCiAJYXNvYy0+bmVlZF9lY25lID0gMDsKIApAQCAtNDAyLDYgKzQwMSw4IEBACiAJLyogRGlzcG9zZSBvZiBhbnkgcGVuZGluZyBjaHVua3Mgb24gdGhlIGlucXVldWUuICovCiAJc2N0cF9pbnFfZnJlZSgmYXNvYy0+YmFzZS5pbnF1ZXVlKTsKIAorCXNjdHBfdHNubWFwX2ZyZWUoJmFzb2MtPnBlZXIudHNuX21hcCk7CisKIAkvKiBGcmVlIHNzbm1hcCBzdG9yYWdlLiAqLwogCXNjdHBfc3NubWFwX2ZyZWUoYXNvYy0+c3NubWFwKTsKIApAQCAtNTk5LDExICs2MDAsMTIgQEAKIAkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIGR1cGxpY2F0ZS4gKi8KIAlwZWVyID0gc2N0cF9hc3NvY19sb29rdXBfcGFkZHIoYXNvYywgYWRkcik7CiAJaWYgKHBlZXIpIHsKKwkJLyogQW4gVU5LTk9XTiBzdGF0ZSBpcyBvbmx5IHNldCBvbiB0cmFuc3BvcnRzIGFkZGVkIGJ5CisJCSAqIHVzZXIgaW4gc2N0cF9jb25uZWN0eCgpIGNhbGwuICBTdWNoIHRyYW5zcG9ydHMgc2hvdWxkIGJlCisJCSAqIGNvbnNpZGVyZWQgQ09ORklSTUVEIHBlciBSRkMgNDk2MCwgU2VjdGlvbiA1LjQuCisJCSAqLwogCQlpZiAocGVlci0+c3RhdGUgPT0gU0NUUF9VTktOT1dOKSB7Ci0JCQlpZiAocGVlcl9zdGF0ZSA9PSBTQ1RQX0FDVElWRSkKLQkJCQlwZWVyLT5zdGF0ZSA9IFNDVFBfQUNUSVZFOwotCQkJaWYgKHBlZXJfc3RhdGUgPT0gU0NUUF9VTkNPTkZJUk1FRCkKLQkJCQlwZWVyLT5zdGF0ZSA9IFNDVFBfVU5DT05GSVJNRUQ7CisJCQlwZWVyLT5zdGF0ZSA9IFNDVFBfQUNUSVZFOwogCQl9CiAJCXJldHVybiBwZWVyOwogCX0KQEAgLTExMjEsOCArMTEyMyw4IEBACiAJYXNvYy0+cGVlci5yd25kID0gbmV3LT5wZWVyLnJ3bmQ7CiAJYXNvYy0+cGVlci5zYWNrX25lZWRlZCA9IG5ldy0+cGVlci5zYWNrX25lZWRlZDsKIAlhc29jLT5wZWVyLmkgPSBuZXctPnBlZXIuaTsKLQlzY3RwX3Rzbm1hcF9pbml0KCZhc29jLT5wZWVyLnRzbl9tYXAsIFNDVFBfVFNOX01BUF9TSVpFLAotCQkJIGFzb2MtPnBlZXIuaS5pbml0aWFsX3Rzbik7CisJc2N0cF90c25tYXBfaW5pdCgmYXNvYy0+cGVlci50c25fbWFwLCBTQ1RQX1RTTl9NQVBfSU5JVElBTCwKKwkJCSBhc29jLT5wZWVyLmkuaW5pdGlhbF90c24sIEdGUF9BVE9NSUMpOwogCiAJLyogUmVtb3ZlIGFueSBwZWVyIGFkZHJlc3NlcyBub3QgcHJlc2VudCBpbiB0aGUgbmV3IGFzc29jaWF0aW9uLiAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QpIHsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2JpbmRfYWRkci5jIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKaW5kZXggZjYyYmMyNC4uNmQ1OTQ0YSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYmluZF9hZGRyLmMKKysrIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogewogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoc2N0cF9pc19hbnkoYWRkcikpIHsKKwlpZiAoc2N0cF9pc19hbnkoTlVMTCwgYWRkcikpIHsKIAkJZXJyb3IgPSBzY3RwX2NvcHlfbG9jYWxfYWRkcl9saXN0KGRlc3QsIHNjb3BlLCBnZnAsIGZsYWdzKTsKIAl9IGVsc2UgaWYgKHNjdHBfaW5fc2NvcGUoYWRkciwgc2NvcGUpKSB7CiAJCS8qIE5vdyB0aGF0IHRoZSBhZGRyZXNzIGlzIGluIHNjb3BlLCBjaGVjayB0byBzZWUgaWYKQEAgLTQ3NywxMSArNDc3LDIxIEBACiB9CiAKIC8qIElzIHRoaXMgYSB3aWxkY2FyZCBhZGRyZXNzPyAgKi8KLWludCBzY3RwX2lzX2FueShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCitpbnQgc2N0cF9pc19hbnkoc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpCiB7Ci0Jc3RydWN0IHNjdHBfYWYgKmFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+c2Euc2FfZmFtaWx5KTsKKwl1bnNpZ25lZCBzaG9ydCBmYW0gPSAwOworCXN0cnVjdCBzY3RwX2FmICphZjsKKworCS8qIFRyeSB0byBnZXQgdGhlIHJpZ2h0IGFkZHJlc3MgZmFtaWx5ICovCisJaWYgKGFkZHItPnNhLnNhX2ZhbWlseSAhPSBBRl9VTlNQRUMpCisJCWZhbSA9IGFkZHItPnNhLnNhX2ZhbWlseTsKKwllbHNlIGlmIChzaykKKwkJZmFtID0gc2stPnNrX2ZhbWlseTsKKworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoZmFtKTsKIAlpZiAoIWFmKQogCQlyZXR1cm4gMDsKKwogCXJldHVybiBhZi0+aXNfYW55KGFkZHIpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggNDdmOTFhZi4uNDEyNGJiYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJc2tiLT5uZXR3b3JrX2hlYWRlciAgID0gc2F2ZWlwOwogCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNhdmVzY3RwOwogCWlmICghc2spIHsKLQkJSUNNUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElDTVA2X01JQl9JTkVSUk9SUyk7CisJCUlDTVA2X0lOQ19TVEFUU19CSChkZXZfbmV0KHNrYi0+ZGV2KSwgaWRldiwgSUNNUDZfTUlCX0lORVJST1JTKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC04MzcsNiArODM3LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9zb2NrICpvcHQpCiB7CiAJc3RydWN0IHNjdHBfYWYgKmFmMSwgKmFmMjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzY3RwX29wdDJzayhvcHQpOwogCiAJYWYxID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkcjEtPnNhLnNhX2ZhbWlseSk7CiAJYWYyID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkcjItPnNhLnNhX2ZhbWlseSk7CkBAIC04NDUsMTEgKzg0NiwxMSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZSBzb2NrZXQgaXMgSVB2NiBvbmx5LCB2NCBhZGRycyB3aWxsIG5vdCBtYXRjaCAqLwotCWlmIChfX2lwdjZfb25seV9zb2NrKHNjdHBfb3B0MnNrKG9wdCkpICYmIGFmMSAhPSBhZjIpCisJaWYgKF9faXB2Nl9vbmx5X3NvY2soc2spICYmIGFmMSAhPSBhZjIpCiAJCXJldHVybiAwOwogCiAJLyogVG9kYXksIHdpbGRjYXJkIEFGX0lORVQvQUZfSU5FVDYuICovCi0JaWYgKHNjdHBfaXNfYW55KGFkZHIxKSB8fCBzY3RwX2lzX2FueShhZGRyMikpCisJaWYgKHNjdHBfaXNfYW55KHNrLCBhZGRyMSkgfHwgc2N0cF9pc19hbnkoc2ssIGFkZHIyKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoYWRkcjEtPnNhLnNhX2ZhbWlseSAhPSBhZGRyMi0+c2Euc2FfZmFtaWx5KQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwppbmRleCAwZGM0YTdkLi5jM2Y0MTdmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRwdXQuYworKysgYi9uZXQvc2N0cC9vdXRwdXQuYwpAQCAtNTMzLDcgKzUzMyw4IEBACiAJaWYgKCEoZHN0LT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9OT19DU1VNKSkgewogCQljcmMzMiA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgY2tzdW1fYnVmX2xlbik7CiAJCWNyYzMyID0gc2N0cF9lbmRfY2tzdW0oY3JjMzIpOwotCX0KKwl9IGVsc2UKKwkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKIAkvKiAzKSBQdXQgdGhlIHJlc3VsdGFudCB2YWx1ZSBpbnRvIHRoZSBjaGVja3N1bSBmaWVsZCBpbiB0aGUKIAkgKiAgICBjb21tb24gaGVhZGVyLCBhbmQgbGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdW5jaGFuZ2VkLgpAQCAtNjk4LDcgKzY5OSw3IEBACiAJICogICAgV2hlbiBhIEZhc3QgUmV0cmFuc21pdCBpcyBiZWluZyBwZXJmb3JtZWQgdGhlIHNlbmRlciBTSE9VTEQKIAkgKiAgICBpZ25vcmUgdGhlIHZhbHVlIG9mIGN3bmQgYW5kIFNIT1VMRCBOT1QgZGVsYXkgcmV0cmFuc21pc3Npb24uCiAJICovCi0JaWYgKGNodW5rLT5mYXN0X3JldHJhbnNtaXQgPD0gMCkKKwlpZiAoY2h1bmstPmZhc3RfcmV0cmFuc21pdCAhPSBTQ1RQX05FRURfRlJUWCkKIAkJaWYgKHRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgPj0gdHJhbnNwb3J0LT5jd25kKSB7CiAJCQlyZXR2YWwgPSBTQ1RQX1hNSVRfUldORF9GVUxMOwogCQkJZ290byBmaW5pc2g7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA0MzI4YWQ1Li4yNDdlYmM5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQkgKiBiZSBhZGRlZCB0byB0aGUgcmV0cmFuc21pdCBxdWV1ZS4KIAkJICovCiAJCWlmICgocmVhc29uID09IFNDVFBfUlRYUl9GQVNUX1JUWCAgJiYKLQkJCSAgICAoY2h1bmstPmZhc3RfcmV0cmFuc21pdCA+IDApKSB8fAorCQkJICAgIChjaHVuay0+ZmFzdF9yZXRyYW5zbWl0ID09IFNDVFBfTkVFRF9GUlRYKSkgfHwKIAkJICAgIChyZWFzb24gIT0gU0NUUF9SVFhSX0ZBU1RfUlRYICAmJiAhY2h1bmstPnRzbl9nYXBfYWNrZWQpKSB7CiAJCQkvKiBJZiB0aGlzIGNodW5rIHdhcyBzZW50IGxlc3MgdGhlbiAxIHJ0byBhZ28sIGRvIG5vdAogCQkJICogcmV0cmFuc21pdCB0aGlzIGNodW5rLCBidXQgZ2l2ZSB0aGUgcGVlciB0aW1lCkBAIC02NTAsOCArNjUwLDggQEAKIAkJCS8qIE1hcmsgdGhlIGNodW5rIGFzIGluZWxpZ2libGUgZm9yIGZhc3QgcmV0cmFuc21pdAogCQkJICogYWZ0ZXIgaXQgaXMgcmV0cmFuc21pdHRlZC4KIAkJCSAqLwotCQkJaWYgKGNodW5rLT5mYXN0X3JldHJhbnNtaXQgPiAwKQotCQkJCWNodW5rLT5mYXN0X3JldHJhbnNtaXQgPSAtMTsKKwkJCWlmIChjaHVuay0+ZmFzdF9yZXRyYW5zbWl0ID09IFNDVFBfTkVFRF9GUlRYKQorCQkJCWNodW5rLT5mYXN0X3JldHJhbnNtaXQgPSBTQ1RQX0RPTlRfRlJUWDsKIAogCQkJLyogRm9yY2Ugc3RhcnQgVDMtcnR4IHRpbWVyIHdoZW4gZmFzdCByZXRyYW5zbWl0dGluZwogCQkJICogdGhlIGVhcmxpZXN0IG91dHN0YW5kaW5nIFRTTgpAQCAtNjgwLDggKzY4MCw4IEBACiAJICovCiAJaWYgKHJ0eF90aW1lb3V0IHx8IGZhc3RfcnR4KSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmsxLCBscXVldWUsIHRyYW5zbWl0dGVkX2xpc3QpIHsKLQkJCWlmIChjaHVuazEtPmZhc3RfcmV0cmFuc21pdCA+IDApCi0JCQkJY2h1bmsxLT5mYXN0X3JldHJhbnNtaXQgPSAtMTsKKwkJCWlmIChjaHVuazEtPmZhc3RfcmV0cmFuc21pdCA9PSBTQ1RQX05FRURfRlJUWCkKKwkJCQljaHVuazEtPmZhc3RfcmV0cmFuc21pdCA9IFNDVFBfRE9OVF9GUlRYOwogCQl9CiAJfQogCkBAIC0xMTI5LDEyICsxMTI5LDEzIEBACiAJdW5zaWduZWQgb3V0c3RhbmRpbmc7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwcmltYXJ5ID0gYXNvYy0+cGVlci5wcmltYXJ5X3BhdGg7CiAJaW50IGNvdW50X29mX25ld2Fja3MgPSAwOworCWludCBnYXBfYWNrX2Jsb2NrczsKIAogCS8qIEdyYWIgdGhlIGFzc29jaWF0aW9uJ3MgZGVzdGluYXRpb24gYWRkcmVzcyBsaXN0LiAqLwogCXRyYW5zcG9ydF9saXN0ID0gJmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdDsKIAogCXNhY2tfY3RzbiA9IG50b2hsKHNhY2stPmN1bV90c25fYWNrKTsKLQorCWdhcF9hY2tfYmxvY2tzID0gbnRvaHMoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKTsKIAkvKgogCSAqIFNGUi1DQUNDIGFsZ29yaXRobToKIAkgKiBPbiByZWNlaXB0IG9mIGEgU0FDSyB0aGUgc2VuZGVyIFNIT1VMRCBleGVjdXRlIHRoZQpAQCAtMTE0NCwzNSArMTE0NSwzOCBAQAogCSAqIG9uIHRoZSBjdXJyZW50IHByaW1hcnksIHRoZSBDSEFOR0VPVkVSX0FDVElWRSBmbGFnIFNIT1VMRCBiZQogCSAqIGNsZWFyZWQuIFRoZSBDWUNMSU5HX0NIQU5HRU9WRVIgZmxhZyBTSE9VTEQgYWxzbyBiZSBjbGVhcmVkIGZvcgogCSAqIGFsbCBkZXN0aW5hdGlvbnMuCi0JICovCi0JaWYgKFRTTl9sdGUocHJpbWFyeS0+Y2FjYy5uZXh0X3Rzbl9hdF9jaGFuZ2UsIHNhY2tfY3RzbikpIHsKLQkJcHJpbWFyeS0+Y2FjYy5jaGFuZ2VvdmVyX2FjdGl2ZSA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNwb3J0LCB0cmFuc3BvcnRfbGlzdCwKLQkJCQl0cmFuc3BvcnRzKSB7Ci0JCQl0cmFuc3BvcnQtPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyID0gMDsKLQkJfQotCX0KLQotCS8qCi0JICogU0ZSLUNBQ0MgYWxnb3JpdGhtOgogCSAqIDIpIElmIHRoZSBTQUNLIGNvbnRhaW5zIGdhcCBhY2tzIGFuZCB0aGUgZmxhZyBDSEFOR0VPVkVSX0FDVElWRQogCSAqIGlzIHNldCB0aGUgcmVjZWl2ZXIgb2YgdGhlIFNBQ0sgTVVTVCB0YWtlIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKIAkgKgogCSAqIEEpIEluaXRpYWxpemUgdGhlIGNhY2Nfc2F3X25ld2FjayB0byAwIGZvciBhbGwgZGVzdGluYXRpb24KIAkgKiBhZGRyZXNzZXMuCisJICoKKwkgKiBPbmx5IGJvdGhlciBpZiBjaGFuZ2VvdmVyX2FjdGl2ZSBpcyBzZXQuIE90aGVyd2lzZSwgdGhpcyBpcworCSAqIHRvdGFsbHkgc3Vib3B0aW1hbCB0byBkbyBvbiBldmVyeSBTQUNLLgogCSAqLwotCWlmIChzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MgJiYKLQkgICAgcHJpbWFyeS0+Y2FjYy5jaGFuZ2VvdmVyX2FjdGl2ZSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zcG9ydCwgdHJhbnNwb3J0X2xpc3QsIHRyYW5zcG9ydHMpIHsKLQkJCXRyYW5zcG9ydC0+Y2FjYy5jYWNjX3Nhd19uZXdhY2sgPSAwOworCWlmIChwcmltYXJ5LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlKSB7CisJCXU4IGNsZWFyX2N5Y2xpbmcgPSAwOworCisJCWlmIChUU05fbHRlKHByaW1hcnktPmNhY2MubmV4dF90c25fYXRfY2hhbmdlLCBzYWNrX2N0c24pKSB7CisJCQlwcmltYXJ5LT5jYWNjLmNoYW5nZW92ZXJfYWN0aXZlID0gMDsKKwkJCWNsZWFyX2N5Y2xpbmcgPSAxOworCQl9CisKKwkJaWYgKGNsZWFyX2N5Y2xpbmcgfHwgZ2FwX2Fja19ibG9ja3MpIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNwb3J0LCB0cmFuc3BvcnRfbGlzdCwKKwkJCQkJdHJhbnNwb3J0cykgeworCQkJCWlmIChjbGVhcl9jeWNsaW5nKQorCQkJCQl0cmFuc3BvcnQtPmNhY2MuY3ljbGluZ19jaGFuZ2VvdmVyID0gMDsKKwkJCQlpZiAoZ2FwX2Fja19ibG9ja3MpCisJCQkJCXRyYW5zcG9ydC0+Y2FjYy5jYWNjX3Nhd19uZXdhY2sgPSAwOworCQkJfQogCQl9CiAJfQogCiAJLyogR2V0IHRoZSBoaWdoZXN0IFRTTiBpbiB0aGUgc2Fjay4gKi8KIAloaWdoZXN0X3RzbiA9IHNhY2tfY3RzbjsKLQlpZiAoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKQotCQloaWdoZXN0X3RzbiArPQotCQkgICAgbnRvaHMoZnJhZ3NbbnRvaHMoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzKSAtIDFdLmdhYi5lbmQpOworCWlmIChnYXBfYWNrX2Jsb2NrcykKKwkJaGlnaGVzdF90c24gKz0gbnRvaHMoZnJhZ3NbZ2FwX2Fja19ibG9ja3MgLSAxXS5nYWIuZW5kKTsKIAogCWlmIChUU05fbHQoYXNvYy0+aGlnaGVzdF9zYWNrZWQsIGhpZ2hlc3RfdHNuKSkgewogCQloaWdoZXN0X25ld190c24gPSBoaWdoZXN0X3RzbjsKQEAgLTExODEsMTEgKzExODUsMTEgQEAKIAkJaGlnaGVzdF9uZXdfdHNuID0gc2N0cF9oaWdoZXN0X25ld190c24oc2FjaywgYXNvYyk7CiAJfQogCisKIAkvKiBSdW4gdGhyb3VnaCB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gIENyZWRpdCBieXRlcyByZWNlaXZlZAogCSAqIGFuZCBmcmVlIHRob3NlIGNodW5rcyB0aGF0IHdlIGNhbi4KIAkgKi8KIAlzY3RwX2NoZWNrX3RyYW5zbWl0dGVkKHEsICZxLT5yZXRyYW5zbWl0LCBOVUxMLCBzYWNrLCBoaWdoZXN0X25ld190c24pOwotCXNjdHBfbWFya19taXNzaW5nKHEsICZxLT5yZXRyYW5zbWl0LCBOVUxMLCBoaWdoZXN0X25ld190c24sIDApOwogCiAJLyogUnVuIHRocm91Z2ggdGhlIHRyYW5zbWl0dGVkIHF1ZXVlLgogCSAqIENyZWRpdCBieXRlcyByZWNlaXZlZCBhbmQgZnJlZSB0aG9zZSBjaHVua3Mgd2hpY2ggd2UgY2FuLgpAQCAtMTIwNCw5ICsxMjA4LDEwIEBACiAJCQljb3VudF9vZl9uZXdhY2tzICsrOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnNwb3J0LCB0cmFuc3BvcnRfbGlzdCwgdHJhbnNwb3J0cykgewotCQlzY3RwX21hcmtfbWlzc2luZyhxLCAmdHJhbnNwb3J0LT50cmFuc21pdHRlZCwgdHJhbnNwb3J0LAotCQkJCSAgaGlnaGVzdF9uZXdfdHNuLCBjb3VudF9vZl9uZXdhY2tzKTsKKwlpZiAoZ2FwX2Fja19ibG9ja3MpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFuc3BvcnQsIHRyYW5zcG9ydF9saXN0LCB0cmFuc3BvcnRzKQorCQkJc2N0cF9tYXJrX21pc3NpbmcocSwgJnRyYW5zcG9ydC0+dHJhbnNtaXR0ZWQsIHRyYW5zcG9ydCwKKwkJCQkJICBoaWdoZXN0X25ld190c24sIGNvdW50X29mX25ld2Fja3MpOwogCX0KIAogCS8qIE1vdmUgdGhlIEN1bXVsYXRpdmUgVFNOIEFjayBQb2ludCBpZiBhcHByb3ByaWF0ZS4gICovCkBAIC0xNjUxLDcgKzE2NTYsNyBAQAogCQkgKiBjaHVuayBpZiBpdCBoYXMgTk9UIGJlZW4gZmFzdCByZXRyYW5zbWl0dGVkIG9yIG1hcmtlZCBmb3IKIAkJICogZmFzdCByZXRyYW5zbWl0IGFscmVhZHkuCiAJCSAqLwotCQlpZiAoIWNodW5rLT5mYXN0X3JldHJhbnNtaXQgJiYKKwkJaWYgKGNodW5rLT5mYXN0X3JldHJhbnNtaXQgPT0gU0NUUF9DQU5fRlJUWCAmJgogCQkgICAgIWNodW5rLT50c25fZ2FwX2Fja2VkICYmCiAJCSAgICBUU05fbHQodHNuLCBoaWdoZXN0X25ld190c25faW5fc2FjaykpIHsKIApAQCAtMTY3Niw3ICsxNjgxLDcgQEAKIAkJICovCiAKIAkJaWYgKGNodW5rLT50c25fbWlzc2luZ19yZXBvcnQgPj0gMykgewotCQkJY2h1bmstPmZhc3RfcmV0cmFuc21pdCA9IDE7CisJCQljaHVuay0+ZmFzdF9yZXRyYW5zbWl0ID0gU0NUUF9ORUVEX0ZSVFg7CiAJCQlkb19mYXN0X3JldHJhbnNtaXQgPSAxOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IGU4Y2E0ZTUuLmZkOGFjYjQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTcwMiwxMiArNzAyLDE0IEBACiAJX191MzIgY3RzbjsKIAlfX3UxNiBudW1fZ2FicywgbnVtX2R1cF90c25zOwogCXN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwID0gKHN0cnVjdCBzY3RwX3Rzbm1hcCAqKSZhc29jLT5wZWVyLnRzbl9tYXA7CisJc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayBnYWJzW1NDVFBfTUFYX0dBQlNdOwogCisJbWVtc2V0KGdhYnMsIDAsIHNpemVvZihnYWJzKSk7CiAJY3RzbiA9IHNjdHBfdHNubWFwX2dldF9jdHNuKG1hcCk7CiAJU0NUUF9ERUJVR19QUklOVEsoInNhY2tDVFNOQWNrIHNlbnQ6ICAweCV4LlxuIiwgY3Rzbik7CiAKIAkvKiBIb3cgbXVjaCByb29tIGlzIG5lZWRlZCBpbiB0aGUgY2h1bms/ICovCi0JbnVtX2dhYnMgPSBzY3RwX3Rzbm1hcF9udW1fZ2FicyhtYXApOworCW51bV9nYWJzID0gc2N0cF90c25tYXBfbnVtX2dhYnMobWFwLCBnYWJzKTsKIAludW1fZHVwX3RzbnMgPSBzY3RwX3Rzbm1hcF9udW1fZHVwcyhtYXApOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgU0FDSyBoZWFkZXIuICAqLwpAQCAtNzYzLDcgKzc2NSw3IEBACiAJLyogQWRkIHRoZSBnYXAgYWNrIGJsb2NrIGluZm9ybWF0aW9uLiAgICovCiAJaWYgKG51bV9nYWJzKQogCQlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKF9fdTMyKSAqIG51bV9nYWJzLAotCQkJCSBzY3RwX3Rzbm1hcF9nZXRfZ2FicyhtYXApKTsKKwkJCQkgZ2Ficyk7CiAKIAkvKiBBZGQgdGhlIGR1cGxpY2F0ZSBUU04gaW5mb3JtYXRpb24uICAqLwogCWlmIChudW1fZHVwX3RzbnMpCkBAIC0xMDEyLDYgKzEwMTQsMjkgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX3Zpb2xhdGlvbl9wYXJhbWxlbigKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwljb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJc3RydWN0IHNjdHBfcGFyYW1oZHIgKnBhcmFtKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CisJc3RhdGljIGNvbnN0IGNoYXIgZXJyb3JbXSA9ICJUaGUgZm9sbG93aW5nIHBhcmFtZXRlciBoYWQgaW52YWxpZCBsZW5ndGg6IjsKKwlzaXplX3QgcGF5bG9hZF9sZW4gPSBzaXplb2YoZXJyb3IpICsgc2l6ZW9mKHNjdHBfZXJyaGRyX3QpICsKKwkJCQlzaXplb2Yoc2N0cF9wYXJhbWhkcl90KTsKKworCXJldHZhbCA9IHNjdHBfbWFrZV9hYm9ydChhc29jLCBjaHVuaywgcGF5bG9hZF9sZW4pOworCWlmICghcmV0dmFsKQorCQlnb3RvIG5vZGF0YTsKKworCXNjdHBfaW5pdF9jYXVzZShyZXR2YWwsIFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OLAorCQkJc2l6ZW9mKGVycm9yKSArIHNpemVvZihzY3RwX3BhcmFtaGRyX3QpKTsKKwlzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGVycm9yKSwgZXJyb3IpOworCXNjdHBfYWRkdG9fcGFyYW0ocmV0dmFsLCBzaXplb2Yoc2N0cF9wYXJhbWhkcl90KSwgcGFyYW0pOworCitub2RhdGE6CisJcmV0dXJuIHJldHZhbDsKK30KKwogLyogTWFrZSBhIEhFQVJUQkVBVCBjaHVuay4gICovCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2hlYXJ0YmVhdChjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0LApAQCAtMTE4OCw3ICsxMjEzLDcgQEAKIAkgKi8KIAlyZXR2YWwtPnRzbl9taXNzaW5nX3JlcG9ydCA9IDA7CiAJcmV0dmFsLT50c25fZ2FwX2Fja2VkID0gMDsKLQlyZXR2YWwtPmZhc3RfcmV0cmFuc21pdCA9IDA7CisJcmV0dmFsLT5mYXN0X3JldHJhbnNtaXQgPSBTQ1RQX0NBTl9GUlRYOwogCiAJLyogSWYgdGhpcyBpcyBhIGZyYWdtZW50ZWQgbWVzc2FnZSwgdHJhY2sgYWxsIGZyYWdtZW50cwogCSAqIG9mIHRoZSBtZXNzYWdlIChmb3IgU0VORF9GQUlMRUQpLgpAQCAtMTc4MiwxMSArMTgwNyw2IEBACiAJCQkJCWNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKiplcnJwKQogewotCXN0YXRpYyBjb25zdCBjaGFyIGVycm9yW10gPSAiVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgaGFkIGludmFsaWQgbGVuZ3RoOiI7Ci0Jc2l6ZV90CQlwYXlsb2FkX2xlbiA9IFdPUkRfUk9VTkQoc2l6ZW9mKGVycm9yKSkgKwotCQkJCQkJc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCk7Ci0KLQogCS8qIFRoaXMgaXMgYSBmYXRhbCBlcnJvci4gIEFueSBhY2N1bXVsYXRlZCBub24tZmF0YWwgZXJyb3JzIGFyZQogCSAqIG5vdCByZXBvcnRlZC4KIAkgKi8KQEAgLTE3OTQsMTQgKzE4MTQsNyBAQAogCQlzY3RwX2NodW5rX2ZyZWUoKmVycnApOwogCiAJLyogQ3JlYXRlIGFuIGVycm9yIGNodW5rIGFuZCBmaWxsIGl0IGluIHdpdGggb3VyIHBheWxvYWQuICovCi0JKmVycnAgPSBzY3RwX21ha2Vfb3BfZXJyb3Jfc3BhY2UoYXNvYywgY2h1bmssIHBheWxvYWRfbGVuKTsKLQotCWlmICgqZXJycCkgewotCQlzY3RwX2luaXRfY2F1c2UoKmVycnAsIFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OLAotCQkJCXNpemVvZihlcnJvcikgKyBzaXplb2Yoc2N0cF9wYXJhbWhkcl90KSk7Ci0JCXNjdHBfYWRkdG9fY2h1bmsoKmVycnAsIHNpemVvZihlcnJvciksIGVycm9yKTsKLQkJc2N0cF9hZGR0b19wYXJhbSgqZXJycCwgc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCksIHBhcmFtKTsKLQl9CisJKmVycnAgPSBzY3RwX21ha2VfdmlvbGF0aW9uX3BhcmFtbGVuKGFzb2MsIGNodW5rLCBwYXJhbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4ODYsMTEgKzE4OTksMTMgQEAKIAkJCSAgICAvKiBpZiB0aGUgcGVlciByZXBvcnRzIEFVVEgsIGFzc3VtZSB0aGF0IGhlCiAJCQkgICAgICogc3VwcG9ydHMgQVVUSC4KIAkJCSAgICAgKi8KLQkJCSAgICBhc29jLT5wZWVyLmF1dGhfY2FwYWJsZSA9IDE7CisJCQkgICAgaWYgKHNjdHBfYXV0aF9lbmFibGUpCisJCQkJICAgIGFzb2MtPnBlZXIuYXV0aF9jYXBhYmxlID0gMTsKIAkJCSAgICBicmVhazsKIAkJICAgIGNhc2UgU0NUUF9DSURfQVNDT05GOgogCQkgICAgY2FzZSBTQ1RQX0NJRF9BU0NPTkZfQUNLOgotCQkJICAgIGFzb2MtPnBlZXIuYXNjb25mX2NhcGFibGUgPSAxOworCQkJICAgIGlmIChzY3RwX2FkZGlwX2VuYWJsZSkKKwkJCQkgICAgYXNvYy0+cGVlci5hc2NvbmZfY2FwYWJsZSA9IDE7CiAJCQkgICAgYnJlYWs7CiAJCSAgICBkZWZhdWx0OgogCQkJICAgIGJyZWFrOwpAQCAtMjI3NSw4ICsyMjkwLDkgQEAKIAl9CiAKIAkvKiBTZXQgdXAgdGhlIFRTTiB0cmFja2luZyBwaWVjZXMuICAqLwotCXNjdHBfdHNubWFwX2luaXQoJmFzb2MtPnBlZXIudHNuX21hcCwgU0NUUF9UU05fTUFQX1NJWkUsCi0JCQkgYXNvYy0+cGVlci5pLmluaXRpYWxfdHNuKTsKKwlpZiAoIXNjdHBfdHNubWFwX2luaXQoJmFzb2MtPnBlZXIudHNuX21hcCwgU0NUUF9UU05fTUFQX0lOSVRJQUwsCisJCQkJYXNvYy0+cGVlci5pLmluaXRpYWxfdHNuLCBnZnApKQorCQlnb3RvIGNsZWFuX3VwOwogCiAJLyogUkZDIDI5NjAgNi41IFN0cmVhbSBJZGVudGlmaWVyIGFuZCBTdHJlYW0gU2VxdWVuY2UgTnVtYmVyCiAJICoKQEAgLTIzMTksMTIgKzIzMzUsMTAgQEAKIAkvKiBSZWxlYXNlIHRoZSB0cmFuc3BvcnQgc3RydWN0dXJlcy4gKi8KIAlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CiAJCXRyYW5zcG9ydCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOwotCQlsaXN0X2RlbF9pbml0KHBvcyk7Ci0JCXNjdHBfdHJhbnNwb3J0X2ZyZWUodHJhbnNwb3J0KTsKKwkJaWYgKHRyYW5zcG9ydC0+c3RhdGUgIT0gU0NUUF9BQ1RJVkUpCisJCQlzY3RwX2Fzc29jX3JtX3BlZXIoYXNvYywgdHJhbnNwb3J0KTsKIAl9CiAKLQlhc29jLT5wZWVyLnRyYW5zcG9ydF9jb3VudCA9IDA7Ci0KIG5vbWVtOgogCXJldHVybiAwOwogfQpAQCAtMjQ1NiwxMCArMjQ3MCwxMyBAQAogCQlicmVhazsKIAogCWNhc2UgU0NUUF9QQVJBTV9BREFQVEFUSU9OX0xBWUVSX0lORDoKLQkJYXNvYy0+cGVlci5hZGFwdGF0aW9uX2luZCA9IHBhcmFtLmFpbmQtPmFkYXB0YXRpb25faW5kOworCQlhc29jLT5wZWVyLmFkYXB0YXRpb25faW5kID0gbnRvaGwocGFyYW0uYWluZC0+YWRhcHRhdGlvbl9pbmQpOwogCQlicmVhazsKIAogCWNhc2UgU0NUUF9QQVJBTV9TRVRfUFJJTUFSWToKKwkJaWYgKCFzY3RwX2FkZGlwX2VuYWJsZSkKKwkJCWdvdG8gZmFsbF90aHJvdWdoOworCiAJCWFkZHJfcGFyYW0gPSBwYXJhbS52ICsgc2l6ZW9mKHNjdHBfYWRkaXBfcGFyYW1fdCk7CiAKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhwYXJhbV90eXBlMmFmKHBhcmFtLnAtPnR5cGUpKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCA5NzMyYzc5Li5lMWQ2MDc2IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC04ODksNiArODg5LDM1IEBACiAJCXNjdHBfdWxwcV90YWlsX2V2ZW50KCZhc29jLT51bHBxLCBldik7CiB9CiAKKworc3RhdGljIHZvaWQgc2N0cF9jbWRfdDFfdGltZXJfdXBkYXRlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICBzY3RwX2V2ZW50X3RpbWVvdXRfdCB0aW1lciwKKwkJCQkgICAgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQ7CisKKwl0ID0gYXNvYy0+aW5pdF9sYXN0X3NlbnRfdG87CisJYXNvYy0+aW5pdF9lcnJfY291bnRlcisrOworCisJaWYgKHQtPmluaXRfc2VudF9jb3VudCA+IChhc29jLT5pbml0X2N5Y2xlICsgMSkpIHsKKwkJYXNvYy0+dGltZW91dHNbdGltZXJdICo9IDI7CisJCWlmIChhc29jLT50aW1lb3V0c1t0aW1lcl0gPiBhc29jLT5tYXhfaW5pdF90aW1lbykgeworCQkJYXNvYy0+dGltZW91dHNbdGltZXJdID0gYXNvYy0+bWF4X2luaXRfdGltZW87CisJCX0KKwkJYXNvYy0+aW5pdF9jeWNsZSsrOworCQlTQ1RQX0RFQlVHX1BSSU5USygKKwkJCSJUMSAlcyBUaW1lb3V0IGFkanVzdG1lbnQiCisJCQkiIGluaXRfZXJyX2NvdW50ZXI6ICVkIgorCQkJIiBjeWNsZTogJWQiCisJCQkiIHRpbWVvdXQ6ICVsZFxuIiwKKwkJCW5hbWUsCisJCQlhc29jLT5pbml0X2Vycl9jb3VudGVyLAorCQkJYXNvYy0+aW5pdF9jeWNsZSwKKwkJCWFzb2MtPnRpbWVvdXRzW3RpbWVyXSk7CisJfQorCit9CisKIC8qIFRoZXNlIHRocmVlIG1hY3JvcyBhbGxvdyB1cyB0byBwdWxsIHRoZSBkZWJ1Z2dpbmcgY29kZSBvdXQgb2YgdGhlCiAgKiBtYWluIGZsb3cgb2Ygc2N0cF9kb19zbSgpIHRvIGtlZXAgYXR0ZW50aW9uIGZvY3VzZWQgb24gdGhlIHJlYWwKICAqIGZ1bmN0aW9uYWxpdHkgdGhlcmUuCkBAIC0xMTIzLDcgKzExNTIsOCBAQAogCiAJCWNhc2UgU0NUUF9DTURfUkVQT1JUX1RTTjoKIAkJCS8qIFJlY29yZCB0aGUgYXJyaXZhbCBvZiBhIFRTTi4gICovCi0JCQlzY3RwX3Rzbm1hcF9tYXJrKCZhc29jLT5wZWVyLnRzbl9tYXAsIGNtZC0+b2JqLnUzMik7CisJCQllcnJvciA9IHNjdHBfdHNubWFwX21hcmsoJmFzb2MtPnBlZXIudHNuX21hcCwKKwkJCQkJCSBjbWQtPm9iai51MzIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0NNRF9SRVBPUlRfRldEVFNOOgpAQCAtMTE5Niw2ICsxMjI2LDExIEBACiAJCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKIAkJCQkJCVNDVFBfQ0hVTksoY21kLT5vYmoucHRyKSk7CiAKKwkJCWlmIChuZXdfb2JqLT50cmFuc3BvcnQpIHsKKwkJCQluZXdfb2JqLT50cmFuc3BvcnQtPmluaXRfc2VudF9jb3VudCsrOworCQkJCWFzb2MtPmluaXRfbGFzdF9zZW50X3RvID0gbmV3X29iai0+dHJhbnNwb3J0OworCQkJfQorCiAJCQkvKiBGSVhNRSAtIEV2ZW50dWFsbHkgY29tZSB1cCB3aXRoIGEgY2xlYW5lciB3YXkgdG8KIAkJCSAqIGVuYWJsaW5nIENPT0tJRS1FQ0hPICsgREFUQSBidW5kbGluZyBkdXJpbmcKIAkJCSAqIG11bHRpaG9taW5nIHN0YWxlIGNvb2tpZSBzY2VuYXJpb3MsIHRoZSBmb2xsb3dpbmcKQEAgLTEzNDUsMjYgKzEzODAsOSBAQAogCQkJICogYWxsIHRyYW5zcG9ydHMgaGF2ZSBiZWVuIHRyaWVkIGF0IHRoZSBjdXJyZW50CiAJCQkgKiB0aW1lb3V0LgogCQkJICovCi0JCQl0ID0gYXNvYy0+aW5pdF9sYXN0X3NlbnRfdG87Ci0JCQlhc29jLT5pbml0X2Vycl9jb3VudGVyKys7Ci0KLQkJCWlmICh0LT5pbml0X3NlbnRfY291bnQgPiAoYXNvYy0+aW5pdF9jeWNsZSArIDEpKSB7Ci0JCQkJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVRdICo9IDI7Ci0JCQkJaWYgKGFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUXSA+Ci0JCQkJICAgIGFzb2MtPm1heF9pbml0X3RpbWVvKSB7Ci0JCQkJCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUXSA9Ci0JCQkJCQlhc29jLT5tYXhfaW5pdF90aW1lbzsKLQkJCQl9Ci0JCQkJYXNvYy0+aW5pdF9jeWNsZSsrOwotCQkJCVNDVFBfREVCVUdfUFJJTlRLKAotCQkJCQkiVDEgSU5JVCBUaW1lb3V0IGFkanVzdG1lbnQiCi0JCQkJCSIgaW5pdF9lcnJfY291bnRlcjogJWQiCi0JCQkJCSIgY3ljbGU6ICVkIgotCQkJCQkiIHRpbWVvdXQ6ICVsZFxuIiwKLQkJCQkJYXNvYy0+aW5pdF9lcnJfY291bnRlciwKLQkJCQkJYXNvYy0+aW5pdF9jeWNsZSwKLQkJCQkJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVRdKTsKLQkJCX0KKwkJCXNjdHBfY21kX3QxX3RpbWVyX3VwZGF0ZShhc29jLAorCQkJCQkJU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQsCisJCQkJCQkiSU5JVCIpOwogCiAJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1JFU1RBUlQsCiAJCQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1QxX0lOSVQpKTsKQEAgLTEzNzcsMjAgKzEzOTUsOSBAQAogCQkJICogYWxsIHRyYW5zcG9ydHMgaGF2ZSBiZWVuIHRyaWVkIGF0IHRoZSBjdXJyZW50CiAJCQkgKiB0aW1lb3V0LgogCQkJICovCi0JCQlhc29jLT5pbml0X2Vycl9jb3VudGVyKys7Ci0KLQkJCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUVdICo9IDI7Ci0JCQlpZiAoYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRV0gPgotCQkJICAgIGFzb2MtPm1heF9pbml0X3RpbWVvKSB7Ci0JCQkJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRV0gPQotCQkJCQlhc29jLT5tYXhfaW5pdF90aW1lbzsKLQkJCX0KLQkJCVNDVFBfREVCVUdfUFJJTlRLKAotCQkJCSJUMSBDT09LSUUgVGltZW91dCBhZGp1c3RtZW50IgotCQkJCSIgaW5pdF9lcnJfY291bnRlcjogJWQiCi0JCQkJIiB0aW1lb3V0OiAlbGRcbiIsCi0JCQkJYXNvYy0+aW5pdF9lcnJfY291bnRlciwKLQkJCQlhc29jLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFXSk7CisJCQlzY3RwX2NtZF90MV90aW1lcl91cGRhdGUoYXNvYywKKwkJCQkJCVNDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUUsCisJCQkJCQkiQ09PS0lFIik7CiAKIAkJCS8qIElmIHdlJ3ZlIHNlbnQgYW55IGRhdGEgYnVuZGxlZCB3aXRoCiAJCQkgKiBDT09LSUUtRUNITyB3ZSBuZWVkIHRvIHJlc2VuZC4KQEAgLTE0MjIsNiArMTQyOSwxMCBAQAogCQljYXNlIFNDVFBfQ01EX0lOSVRfQ09VTlRFUl9SRVNFVDoKIAkJCWFzb2MtPmluaXRfZXJyX2NvdW50ZXIgPSAwOwogCQkJYXNvYy0+aW5pdF9jeWNsZSA9IDA7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QsCisJCQkJCSAgICB0cmFuc3BvcnRzKSB7CisJCQkJdC0+aW5pdF9zZW50X2NvdW50ID0gMDsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NUUF9DTURfUkVQT1JUX0RVUDoKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKaW5kZXggODg0OGQzMi4uZDRjM2ZiYyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAotCQkJCSAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgdm9pZCAqYXJnLCB2b2lkICpleHQsCiAJCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpOwogCiBzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfdmlvbGF0aW9uX2N0c24oCkBAIC0zMTUsOCArMzE1LDEwIEBACiAJLyogSWYgdGhlIHBhY2tldCBpcyBhbiBPT1RCIHBhY2tldCB3aGljaCBpcyB0ZW1wb3JhcmlseSBvbiB0aGUKIAkgKiBjb250cm9sIGVuZHBvaW50LCByZXNwb25kIHdpdGggYW4gQUJPUlQuCiAJICovCi0JaWYgKGVwID09IHNjdHBfc2soKHNjdHBfZ2V0X2N0bF9zb2NrKCkpKS0+ZXApCisJaWYgKGVwID09IHNjdHBfc2soKHNjdHBfZ2V0X2N0bF9zb2NrKCkpKS0+ZXApIHsKKwkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfT1VUT0ZCTFVFUyk7CiAJCXJldHVybiBzY3RwX3NmX3RhYm9ydF84XzRfOChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CisJfQogCiAJLyogMy4xIEEgcGFja2V0IGNvbnRhaW5pbmcgYW4gSU5JVCBjaHVuayBNVVNUIGhhdmUgYSB6ZXJvIFZlcmlmaWNhdGlvbgogCSAqIFRhZy4KQEAgLTYzNSw4ICs2MzcsMTAgQEAKIAkvKiBJZiB0aGUgcGFja2V0IGlzIGFuIE9PVEIgcGFja2V0IHdoaWNoIGlzIHRlbXBvcmFyaWx5IG9uIHRoZQogCSAqIGNvbnRyb2wgZW5kcG9pbnQsIHJlc3BvbmQgd2l0aCBhbiBBQk9SVC4KIAkgKi8KLQlpZiAoZXAgPT0gc2N0cF9zaygoc2N0cF9nZXRfY3RsX3NvY2soKSkpLT5lcCkKKwlpZiAoZXAgPT0gc2N0cF9zaygoc2N0cF9nZXRfY3RsX3NvY2soKSkpLT5lcCkgeworCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRPRkJMVUVTKTsKIAkJcmV0dXJuIHNjdHBfc2ZfdGFib3J0XzhfNF84KGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKKwl9CiAKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgQ09PS0lFX0VDSE8gY2h1bmsgaGFzIGEgdmFsaWQgbGVuZ3RoLgogCSAqIEluIHRoaXMgY2FzZSwgd2UgY2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBmb3IgYXQgbGVhc3QgYQpAQCAtMjA3NiwxMCArMjA4MCw2IEBACiAJCSAgICBzY3RwX2JpbmRfYWRkcl9zdGF0ZSgmYXNvYy0+YmFzZS5iaW5kX2FkZHIsICZjaHVuay0+ZGVzdCkpCiAJCXJldHVybiBzY3RwX3NmX2Rpc2NhcmRfY2h1bmsoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOwogCi0JLyogU3RvcCB0aGUgVDUtc2h1dGRvd24gZ3VhcmQgdGltZXIuICAqLwotCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RPUCwKLQkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEKSk7Ci0KIAlyZXR1cm4gX19zY3RwX3NmX2RvXzlfMV9hYm9ydChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CiB9CiAKQEAgLTMzODIsNiArMzM4Miw4IEBACiAJICogcGFja2V0IGFuZCB0aGUgc3RhdGUgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIE9PVEIgU0hVVERPV05fQUNLIGlzCiAJICogY2FsbGVkIHdpdGggYSBOVUxMIGFzc29jaWF0aW9uLgogCSAqLworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVE9GQkxVRVMpOworCiAJcmV0dXJuIHNjdHBfc2Zfc2h1dF84XzRfNShlcCwgTlVMTCwgdHlwZSwgYXJnLCBjb21tYW5kcyk7CiB9CiAKQEAgLTM0MjUsNyArMzQyNyw3IEBACiAJYWRkcl9wYXJhbSA9ICh1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKiloZHItPnBhcmFtczsKIAlsZW5ndGggPSBudG9ocyhhZGRyX3BhcmFtLT5wLmxlbmd0aCk7CiAJaWYgKGxlbmd0aCA8IHNpemVvZihzY3RwX3BhcmFtaGRyX3QpKQotCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fcGFyYW1sZW4oZXAsIGFzb2MsIHR5cGUsCisJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9wYXJhbWxlbihlcCwgYXNvYywgdHlwZSwgYXJnLAogCQkJICAgKHZvaWQgKilhZGRyX3BhcmFtLCBjb21tYW5kcyk7CiAKIAkvKiBWZXJpZnkgdGhlIEFTQ09ORiBjaHVuayBiZWZvcmUgcHJvY2Vzc2luZyBpdC4gKi8KQEAgLTM0MzMsOCArMzQzNSw4IEBACiAJCQkgICAgKHNjdHBfcGFyYW1oZHJfdCAqKSgodm9pZCAqKWFkZHJfcGFyYW0gKyBsZW5ndGgpLAogCQkJICAgICh2b2lkICopY2h1bmstPmNodW5rX2VuZCwKIAkJCSAgICAmZXJyX3BhcmFtKSkKLQkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX3BhcmFtbGVuKGVwLCBhc29jLCB0eXBlLAotCQkJCQkJICAodm9pZCAqKSZlcnJfcGFyYW0sIGNvbW1hbmRzKTsKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX3BhcmFtbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkJCQkgICh2b2lkICopZXJyX3BhcmFtLCBjb21tYW5kcyk7CiAKIAkvKiBBRERJUCA1LjIgRTEpIENvbXBhcmUgdGhlIHZhbHVlIG9mIHRoZSBzZXJpYWwgbnVtYmVyIHRvIHRoZSB2YWx1ZQogCSAqIHRoZSBlbmRwb2ludCBzdG9yZWQgaW4gYSBuZXcgYXNzb2NpYXRpb24gdmFyaWFibGUKQEAgLTM1NDIsOCArMzU0NCw4IEBACiAJICAgIChzY3RwX3BhcmFtaGRyX3QgKilhZGRpcF9oZHItPnBhcmFtcywKIAkgICAgKHZvaWQgKilhc2NvbmZfYWNrLT5jaHVua19lbmQsCiAJICAgICZlcnJfcGFyYW0pKQotCQlyZXR1cm4gc2N0cF9zZl92aW9sYXRpb25fcGFyYW1sZW4oZXAsIGFzb2MsIHR5cGUsCi0JCQkgICAodm9pZCAqKSZlcnJfcGFyYW0sIGNvbW1hbmRzKTsKKwkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX3BhcmFtbGVuKGVwLCBhc29jLCB0eXBlLCBhcmcsCisJCQkgICAodm9pZCAqKWVycl9wYXJhbSwgY29tbWFuZHMpOwogCiAJaWYgKGxhc3RfYXNjb25mKSB7CiAJCWFkZGlwX2hkciA9IChzY3RwX2FkZGlwaGRyX3QgKilsYXN0X2FzY29uZi0+c3ViaC5hZGRpcF9oZHI7CkBAIC00MTg2LDExICs0MTg4LDEwIEBACiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIAotZGlzY2FyZDoKLQlzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCBTQ1RQX1NUX0NIVU5LKDApLCBhcmcsIGNvbW1hbmRzKTsKLQogCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKIAorZGlzY2FyZDoKKwlzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCBTQ1RQX1NUX0NIVU5LKDApLCBhcmcsIGNvbW1hbmRzKTsKIAlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKIAogbm9tZW1fcGt0OgpAQCAtNDI0MCwxMiArNDI0MSwzNiBAQAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAotCQkJCSAgICAgdm9pZCAqYXJnLAotCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKSB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgZXJyX3N0cltdID0gIlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGhhZCBpbnZhbGlkIGxlbmd0aDoiOworCQkJCSAgICAgdm9pZCAqYXJnLCB2b2lkICpleHQsCisJCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rID0gIGFyZzsKKwlzdHJ1Y3Qgc2N0cF9wYXJhbWhkciAqcGFyYW0gPSBleHQ7CisJc3RydWN0IHNjdHBfY2h1bmsgKmFib3J0ID0gTlVMTDsKIAotCXJldHVybiBzY3RwX3NmX2Fib3J0X3Zpb2xhdGlvbihlcCwgYXNvYywgYXJnLCBjb21tYW5kcywgZXJyX3N0ciwKLQkJCQkJc2l6ZW9mKGVycl9zdHIpKTsKKwlpZiAoc2N0cF9hdXRoX3JlY3ZfY2lkKFNDVFBfQ0lEX0FCT1JULCBhc29jKSkKKwkJZ290byBkaXNjYXJkOworCisJLyogTWFrZSB0aGUgYWJvcnQgY2h1bmsuICovCisJYWJvcnQgPSBzY3RwX21ha2VfdmlvbGF0aW9uX3BhcmFtbGVuKGFzb2MsIGNodW5rLCBwYXJhbSk7CisJaWYgKCFhYm9ydCkKKwkJZ290byBub21lbTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksIFNDVFBfQ0hVTksoYWJvcnQpKTsKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKKworCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKKwkJCVNDVFBfRVJST1IoRUNPTk5BQk9SVEVEKSk7CisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCisJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9QUk9UT19WSU9MQVRJT04pKTsKKwlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOworCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKKworZGlzY2FyZDoKKwlzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCBTQ1RQX1NUX0NIVU5LKDApLCBhcmcsIGNvbW1hbmRzKTsKKwlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKK25vbWVtOgorCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX05PTUVNOwogfQogCiAvKiBIYW5kbGUgYSBwcm90b2NvbCB2aW9sYXRpb24gd2hlbiB0aGUgcGVlciB0cnlpbmcgdG8gYWR2YW5jZSB0aGUKQEAgLTQ1MTcsMTMgKzQ1NDIsNiBAQAogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAogCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpKTsKIAotCS8qIHNjdHBpbXBndWlkZS0wNSBTZWN0aW9uIDIuMTIuMgotCSAqIFRoZSBzZW5kZXIgb2YgdGhlIFNIVVRET1dOIE1BWSBhbHNvIHN0YXJ0IGFuIG92ZXJhbGwgZ3VhcmQgdGltZXIKLQkgKiAnVDUtc2h1dGRvd24tZ3VhcmQnIHRvIGJvdW5kIHRoZSBvdmVyYWxsIHRpbWUgZm9yIHNodXRkb3duIHNlcXVlbmNlLgotCSAqLwotCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCi0JCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOwotCiAJZGlzcG9zaXRpb24gPSBTQ1RQX0RJU1BPU0lUSU9OX0NPTlNVTUU7CiAJaWYgKHNjdHBfb3V0cV9pc19lbXB0eSgmYXNvYy0+b3V0cXVldWUpKSB7CiAJCWRpc3Bvc2l0aW9uID0gc2N0cF9zZl9kb185XzJfc3RhcnRfc2h1dGRvd24oZXAsIGFzb2MsIHR5cGUsCkBAIC00OTY4LDYgKzQ5ODYsMTMgQEAKIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUQVJULAogCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDJfU0hVVERPV04pKTsKIAorCS8qIFJGQyA0OTYwIFNlY3Rpb24gOS4yCisJICogVGhlIHNlbmRlciBvZiB0aGUgU0hVVERPV04gTUFZIGFsc28gc3RhcnQgYW4gb3ZlcmFsbCBndWFyZCB0aW1lcgorCSAqICdUNS1zaHV0ZG93bi1ndWFyZCcgdG8gYm91bmQgdGhlIG92ZXJhbGwgdGltZSBmb3Igc2h1dGRvd24gc2VxdWVuY2UuCisJICovCisJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9USU1FUl9TVEFSVCwKKwkJCVNDVFBfVE8oU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEKSk7CisKIAlpZiAoYXNvYy0+YXV0b2Nsb3NlKQogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1RJTUVSX1NUT1AsCiAJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfQVVUT0NMT1NFKSk7CkBAIC01Mjc5LDYgKzUzMDQsOCBAQAogCQlpZiAoIXJlcGwpCiAJCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKIAorCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfQ0hPT1NFX1RSQU5TUE9SVCwKKwkJCQlTQ1RQX0NIVU5LKHJlcGwpKTsKIAkJLyogSXNzdWUgYSBzaWRlZWZmZWN0IHRvIGRvIHRoZSBuZWVkZWQgYWNjb3VudGluZy4gKi8KIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9DT09LSUVFQ0hPX1JFU1RBUlQsCiAJCQkJU0NUUF9UTyhTQ1RQX0VWRU5UX1RJTUVPVVRfVDFfQ09PS0lFKSk7CkBAIC01NDA2LDcgKzU0MzMsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKIAkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7Ci0JCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CisJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0FCT1JUOwogCX0KIApAQCAtNTQ2Miw2ICs1NDg5LDkgQEAKIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKIAkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CiAKKwlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CisJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKKwogCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CiBub21lbToKIAlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9OT01FTTsKQEAgLTU0OTQsMTIgKzU1MjQsNiBAQAogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX1NUQVRFLAogCQkJU0NUUF9TVEFURShTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcpKTsKIAotCS8qIHNjdHBpbXBndWlkZS0wNSBTZWN0aW9uIDIuMTIuMgotCSAqIFRoZSBzZW5kZXIgb2YgdGhlIFNIVVRET1dOIE1BWSBhbHNvIHN0YXJ0IGFuIG92ZXJhbGwgZ3VhcmQgdGltZXIKLQkgKiAnVDUtc2h1dGRvd24tZ3VhcmQnIHRvIGJvdW5kIHRoZSBvdmVyYWxsIHRpbWUgZm9yIHNodXRkb3duIHNlcXVlbmNlLgotCSAqLwotCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfVElNRVJfU1RBUlQsCi0JCQlTQ1RQX1RPKFNDVFBfRVZFTlRfVElNRU9VVF9UNV9TSFVURE9XTl9HVUFSRCkpOwogCWRpc3Bvc2l0aW9uID0gU0NUUF9ESVNQT1NJVElPTl9DT05TVU1FOwogCWlmIChzY3RwX291dHFfaXNfZW1wdHkoJmFzb2MtPm91dHF1ZXVlKSkgewogCQlkaXNwb3NpdGlvbiA9IHNjdHBfc2ZfZG9fOV8yX3N0YXJ0X3NodXRkb3duKGVwLCBhc29jLCB0eXBlLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCmluZGV4IGQ5OTEyMzcuLmRkNGRkYzQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAogCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0JVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90NV90aW1lcl9leHBpcmUpLCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKIAlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggNWZmYjlkZS4uYTFiOTA0NSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTIzMDksNyArMjMwOSw3IEBACiAJLyogSWYgYW4gYWRkcmVzcyBvdGhlciB0aGFuIElOQUREUl9BTlkgaXMgc3BlY2lmaWVkLCBhbmQKIAkgKiBubyB0cmFuc3BvcnQgaXMgZm91bmQsIHRoZW4gdGhlIHJlcXVlc3QgaXMgaW52YWxpZC4KIAkgKi8KLQlpZiAoIXNjdHBfaXNfYW55KCggdW5pb24gc2N0cF9hZGRyICopJnBhcmFtcy5zcHBfYWRkcmVzcykpIHsKKwlpZiAoIXNjdHBfaXNfYW55KHNrLCAoIHVuaW9uIHNjdHBfYWRkciAqKSZwYXJhbXMuc3BwX2FkZHJlc3MpKSB7CiAJCXRyYW5zID0gc2N0cF9hZGRyX2lkMnRyYW5zcG9ydChzaywgJnBhcmFtcy5zcHBfYWRkcmVzcywKIAkJCQkJICAgICAgIHBhcmFtcy5zcHBfYXNzb2NfaWQpOwogCQlpZiAoIXRyYW5zKQpAQCAtNDA2Miw3ICs0MDYyLDcgQEAKIAkvKiBJZiBhbiBhZGRyZXNzIG90aGVyIHRoYW4gSU5BRERSX0FOWSBpcyBzcGVjaWZpZWQsIGFuZAogCSAqIG5vIHRyYW5zcG9ydCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVxdWVzdCBpcyBpbnZhbGlkLgogCSAqLwotCWlmICghc2N0cF9pc19hbnkoKCB1bmlvbiBzY3RwX2FkZHIgKikmcGFyYW1zLnNwcF9hZGRyZXNzKSkgeworCWlmICghc2N0cF9pc19hbnkoc2ssICggdW5pb24gc2N0cF9hZGRyICopJnBhcmFtcy5zcHBfYWRkcmVzcykpIHsKIAkJdHJhbnMgPSBzY3RwX2FkZHJfaWQydHJhbnNwb3J0KHNrLCAmcGFyYW1zLnNwcF9hZGRyZXNzLAogCQkJCQkgICAgICAgcGFyYW1zLnNwcF9hc3NvY19pZCk7CiAJCWlmICghdHJhbnMpIHsKQEAgLTQ0MTQsNyArNDQxNCw3IEBACiAJaWYgKHNjdHBfbGlzdF9zaW5nbGVfZW50cnkoJmJwLT5hZGRyZXNzX2xpc3QpKSB7CiAJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKLQkJaWYgKHNjdHBfaXNfYW55KCZhZGRyLT5hKSkgeworCQlpZiAoc2N0cF9pc19hbnkoc2ssICZhZGRyLT5hKSkgewogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYWRkciwKIAkJCQkJCSZzY3RwX2xvY2FsX2FkZHJfbGlzdCwgbGlzdCkgewpAQCAtNDYwMiw3ICs0NjAyLDcgQEAKIAlpZiAoc2N0cF9saXN0X3NpbmdsZV9lbnRyeSgmYnAtPmFkZHJlc3NfbGlzdCkpIHsKIAkJYWRkciA9IGxpc3RfZW50cnkoYnAtPmFkZHJlc3NfbGlzdC5uZXh0LAogCQkJCSAgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOwotCQlpZiAoc2N0cF9pc19hbnkoJmFkZHItPmEpKSB7CisJCWlmIChzY3RwX2lzX2FueShzaywgJmFkZHItPmEpKSB7CiAJCQljbnQgPSBzY3RwX2NvcHlfbGFkZHJzX29sZChzaywgYnAtPnBvcnQsCiAJCQkJCQkgICBnZXRhZGRycy5hZGRyX251bSwKIAkJCQkJCSAgIGFkZHJzLCAmYnl0ZXNfY29waWVkKTsKQEAgLTQ2OTUsNyArNDY5NSw3IEBACiAJaWYgKHNjdHBfbGlzdF9zaW5nbGVfZW50cnkoJmJwLT5hZGRyZXNzX2xpc3QpKSB7CiAJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKLQkJaWYgKHNjdHBfaXNfYW55KCZhZGRyLT5hKSkgeworCQlpZiAoc2N0cF9pc19hbnkoc2ssICZhZGRyLT5hKSkgewogCQkJY250ID0gc2N0cF9jb3B5X2xhZGRycyhzaywgYnAtPnBvcnQsIGFkZHJzLAogCQkJCQkJc3BhY2VfbGVmdCwgJmJ5dGVzX2NvcGllZCk7CiAJCQlpZiAoY250IDwgMCkgewpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdHNubWFwLmMgYi9uZXQvc2N0cC90c25tYXAuYwppbmRleCBmM2U1OGIyLi4zNWM3M2U4IDEwMDY0NAotLS0gYS9uZXQvc2N0cC90c25tYXAuYworKysgYi9uZXQvc2N0cC90c25tYXAuYwpAQCAtNDMsMzcgKzQzLDQ0IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CiAKIHN0YXRpYyB2b2lkIHNjdHBfdHNubWFwX3VwZGF0ZShzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCk7Ci1zdGF0aWMgdm9pZCBzY3RwX3Rzbm1hcF9maW5kX2dhcF9hY2soX191OCAqbWFwLCBfX3UxNiBvZmYsCi0JCQkJICAgICBfX3UxNiBsZW4sIF9fdTE2IGJhc2UsCi0JCQkJICAgICBpbnQgKnN0YXJ0ZWQsIF9fdTE2ICpzdGFydCwKLQkJCQkgICAgIGludCAqZW5kZWQsIF9fdTE2ICplbmQpOworc3RhdGljIHZvaWQgc2N0cF90c25tYXBfZmluZF9nYXBfYWNrKHVuc2lnbmVkIGxvbmcgKm1hcCwgX191MTYgb2ZmLAorCQkJCSAgICAgX191MTYgbGVuLCBfX3UxNiAqc3RhcnQsIF9fdTE2ICplbmQpOworc3RhdGljIGludCBzY3RwX3Rzbm1hcF9ncm93KHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCB1MTYgZ2FwKTsKIAogLyogSW5pdGlhbGl6ZSBhIGJsb2NrIG9mIG1lbW9yeSBhcyBhIHRzbm1hcC4gICovCiBzdHJ1Y3Qgc2N0cF90c25tYXAgKnNjdHBfdHNubWFwX2luaXQoc3RydWN0IHNjdHBfdHNubWFwICptYXAsIF9fdTE2IGxlbiwKLQkJCQkgICAgIF9fdTMyIGluaXRpYWxfdHNuKQorCQkJCSAgICAgX191MzIgaW5pdGlhbF90c24sIGdmcF90IGdmcCkKIHsKLQltYXAtPnRzbl9tYXAgPSBtYXAtPnJhd19tYXA7Ci0JbWFwLT5vdmVyZmxvd19tYXAgPSBtYXAtPnRzbl9tYXAgKyBsZW47Ci0JbWFwLT5sZW4gPSBsZW47CisJaWYgKCFtYXAtPnRzbl9tYXApIHsKKwkJbWFwLT50c25fbWFwID0ga3phbGxvYyhsZW4+PjMsIGdmcCk7CisJCWlmIChtYXAtPnRzbl9tYXAgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOwogCi0JLyogQ2xlYXIgb3V0IGEgVFNOIGFjayBzdGF0dXMuICAqLwotCW1lbXNldChtYXAtPnRzbl9tYXAsIDB4MDAsIG1hcC0+bGVuICsgbWFwLT5sZW4pOworCQltYXAtPmxlbiA9IGxlbjsKKwl9IGVsc2UgeworCQliaXRtYXBfemVybyhtYXAtPnRzbl9tYXAsIG1hcC0+bGVuKTsKKwl9CiAKIAkvKiBLZWVwIHRyYWNrIG9mIFRTTnMgcmVwcmVzZW50ZWQgYnkgdHNuX21hcC4gICovCiAJbWFwLT5iYXNlX3RzbiA9IGluaXRpYWxfdHNuOwotCW1hcC0+b3ZlcmZsb3dfdHNuID0gaW5pdGlhbF90c24gKyBtYXAtPmxlbjsKIAltYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludCA9IGluaXRpYWxfdHNuIC0gMTsKIAltYXAtPm1heF90c25fc2VlbiA9IG1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50OwotCW1hcC0+bWFsbG9jZWQgPSAwOwogCW1hcC0+bnVtX2R1cF90c25zID0gMDsKIAogCXJldHVybiBtYXA7CiB9CiAKK3ZvaWQgc2N0cF90c25tYXBfZnJlZShzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKK3sKKwltYXAtPmxlbiA9IDA7CisJa2ZyZWUobWFwLT50c25fbWFwKTsKK30KKwogLyogVGVzdCB0aGUgdHJhY2tpbmcgc3RhdGUgb2YgdGhpcyBUU04uCiAgKiBSZXR1cm5zOgogICogICAwIGlmIHRoZSBUU04gaGFzIG5vdCB5ZXQgYmVlbiBzZWVuCkBAIC04Miw2NiArODksNjkgQEAKICAqLwogaW50IHNjdHBfdHNubWFwX2NoZWNrKGNvbnN0IHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCBfX3UzMiB0c24pCiB7Ci0JX19zMzIgZ2FwOwotCWludCBkdXA7CisJdTMyIGdhcDsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIG9sZCBUU04gKi8KKwlpZiAoVFNOX2x0ZSh0c24sIG1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaG9sZCB0aGlzIFRTTiBhbmQgdGhhdCBpdCB3aWxsIG5vdAorCSAqIG92ZXJsZm93IG91ciBtYXAKKwkgKi8KKwlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBTQ1RQX1RTTl9NQVBfU0laRSkpCisJCXJldHVybiAtMTsKIAogCS8qIENhbGN1bGF0ZSB0aGUgaW5kZXggaW50byB0aGUgbWFwcGluZyBhcnJheXMuICAqLwogCWdhcCA9IHRzbiAtIG1hcC0+YmFzZV90c247CiAKLQkvKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaG9sZCB0aGlzIFRTTi4gICovCi0JaWYgKGdhcCA+PSAoLyogYmFzZSAqLyBtYXAtPmxlbiArIC8qIG92ZXJmbG93ICovIG1hcC0+bGVuKSkgewotCQlkdXAgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogSG9uayBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBUU04uCi0JICogV2UgaGF2ZSB0aHJlZSBjYXNlczoKLQkgKgkxLiBUaGUgVFNOIGlzIGFuY2llbnQgb3IgYmVsb25ncyB0byBhIHByZXZpb3VzIHRzbl9tYXAuCi0JICoJMi4gVGhlIFRTTiBpcyBhbHJlYWR5IG1hcmtlZCBpbiB0aGUgdHNuX21hcC4KLQkgKgkzLiBUaGUgVFNOIGlzIGFscmVhZHkgbWFya2VkIGluIHRoZSB0c25fbWFwX292ZXJmbG93LgotCSAqLwotCWlmIChnYXAgPCAwIHx8Ci0JICAgIChnYXAgPCBtYXAtPmxlbiAmJiBtYXAtPnRzbl9tYXBbZ2FwXSkgfHwKLQkgICAgKGdhcCA+PSBtYXAtPmxlbiAmJiBtYXAtPm92ZXJmbG93X21hcFtnYXAgLSBtYXAtPmxlbl0pKQotCQlkdXAgPSAxOworCS8qIENoZWNrIHRvIHNlZSBpZiBUU04gaGFzIGFscmVhZHkgYmVlbiByZWNvcmRlZC4gICovCisJaWYgKGdhcCA8IG1hcC0+bGVuICYmIHRlc3RfYml0KGdhcCwgbWFwLT50c25fbWFwKSkKKwkJcmV0dXJuIDE7CiAJZWxzZQotCQlkdXAgPSAwOwotCi1vdXQ6Ci0JcmV0dXJuIGR1cDsKKwkJcmV0dXJuIDA7CiB9CiAKIAogLyogTWFyayB0aGlzIFRTTiBhcyBzZWVuLiAgKi8KLXZvaWQgc2N0cF90c25tYXBfbWFyayhzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCwgX191MzIgdHNuKQoraW50IHNjdHBfdHNubWFwX21hcmsoc3RydWN0IHNjdHBfdHNubWFwICptYXAsIF9fdTMyIHRzbikKIHsKLQlfX3MzMiBnYXA7CisJdTE2IGdhcDsKIAotCS8qIFZhY3VvdXNseSBtYXJrIGFueSBUU04gd2hpY2ggcHJlY2VkZXMgdGhlIG1hcCBiYXNlIG9yCi0JICogZXhjZWVkcyB0aGUgZW5kIG9mIHRoZSBtYXAuCi0JICovCiAJaWYgKFRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24pKQotCQlyZXR1cm47Ci0JaWYgKCFUU05fbHQodHNuLCBtYXAtPmJhc2VfdHNuICsgbWFwLT5sZW4gKyBtYXAtPmxlbikpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKLQkvKiBCdW1wIHRoZSBtYXguICAqLwotCWlmIChUU05fbHQobWFwLT5tYXhfdHNuX3NlZW4sIHRzbikpCi0JCW1hcC0+bWF4X3Rzbl9zZWVuID0gdHNuOwotCi0JLyogQXNzZXJ0OiBUU04gaXMgaW4gcmFuZ2UuICAqLwogCWdhcCA9IHRzbiAtIG1hcC0+YmFzZV90c247CiAKLQkvKiBNYXJrIHRoZSBUU04gYXMgcmVjZWl2ZWQuICAqLwotCWlmIChnYXAgPCBtYXAtPmxlbikKLQkJbWFwLT50c25fbWFwW2dhcF0rKzsKLQllbHNlCi0JCW1hcC0+b3ZlcmZsb3dfbWFwW2dhcCAtIG1hcC0+bGVuXSsrOworCWlmIChnYXAgPj0gbWFwLT5sZW4gJiYgIXNjdHBfdHNubWFwX2dyb3cobWFwLCBnYXApKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qIEdvIGZpeHVwIGFueSBpbnRlcm5hbCBUU04gbWFwcGluZyB2YXJpYWJsZXMgaW5jbHVkaW5nCi0JICogY3VtdWxhdGl2ZV90c25fYWNrX3BvaW50LgotCSAqLwotCXNjdHBfdHNubWFwX3VwZGF0ZShtYXApOworCWlmICghc2N0cF90c25tYXBfaGFzX2dhcChtYXApICYmIGdhcCA9PSAwKSB7CisJCS8qIEluIHRoaXMgY2FzZSB0aGUgbWFwIGhhcyBubyBnYXBzIGFuZCB0aGUgdHNuIHdlIGFyZQorCQkgKiByZWNvcmRpbmcgaXMgdGhlIG5leHQgZXhwZWN0ZWQgdHNuLiAgV2UgZG9uJ3QgdG91Y2gKKwkJICogdGhlIG1hcCBidXQgc2ltcGx5IGJ1bXAgdGhlIHZhbHVlcy4KKwkJICovCisJCW1hcC0+bWF4X3Rzbl9zZWVuKys7CisJCW1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50Kys7CisJCW1hcC0+YmFzZV90c24rKzsKKwl9IGVsc2UgeworCQkvKiBFaXRoZXIgd2UgYWxyZWFkeSBoYXZlIGEgZ2FwLCBvciBhYm91dCB0byByZWNvcmQgYSBnYXAsIHNvCisJCSAqIGhhdmUgd29yayB0byBkby4KKwkJICoKKwkJICogQnVtcCB0aGUgbWF4LgorCQkgKi8KKwkJaWYgKFRTTl9sdChtYXAtPm1heF90c25fc2VlbiwgdHNuKSkKKwkJCW1hcC0+bWF4X3Rzbl9zZWVuID0gdHNuOworCisJCS8qIE1hcmsgdGhlIFRTTiBhcyByZWNlaXZlZC4gICovCisJCXNldF9iaXQoZ2FwLCBtYXAtPnRzbl9tYXApOworCisJCS8qIEdvIGZpeHVwIGFueSBpbnRlcm5hbCBUU04gbWFwcGluZyB2YXJpYWJsZXMgaW5jbHVkaW5nCisJCSAqIGN1bXVsYXRpdmVfdHNuX2Fja19wb2ludC4KKwkJICovCisJCXNjdHBfdHNubWFwX3VwZGF0ZShtYXApOworCX0KKworCXJldHVybiAwOwogfQogCiAKQEAgLTE2MCw2NiArMTcwLDM0IEBACiAJCQkJCSBzdHJ1Y3Qgc2N0cF90c25tYXBfaXRlciAqaXRlciwKIAkJCQkJIF9fdTE2ICpzdGFydCwgX191MTYgKmVuZCkKIHsKLQlpbnQgc3RhcnRlZCwgZW5kZWQ7Ci0JX191MTYgc3RhcnRfLCBlbmRfLCBvZmZzZXQ7Ci0KLQkvKiBXZSBoYXZlbid0IGZvdW5kIGEgZ2FwIHlldC4gICovCi0Jc3RhcnRlZCA9IGVuZGVkID0gMDsKKwlpbnQgZW5kZWQgPSAwOworCV9fdTE2IHN0YXJ0XyA9IDAsIGVuZF8gPSAwLCBvZmZzZXQ7CiAKIAkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBnYXAgYWNrcyBwb3NzaWJsZSwgZ2V0IG91dCBmYXN0LiAgKi8KIAlpZiAoVFNOX2x0ZShtYXAtPm1heF90c25fc2VlbiwgaXRlci0+c3RhcnQpKQogCQlyZXR1cm4gMDsKIAotCS8qIFNlYXJjaCB0aGUgZmlyc3QgbWFwcGluZyBhcnJheS4gICovCi0JaWYgKGl0ZXItPnN0YXJ0IC0gbWFwLT5iYXNlX3RzbiA8IG1hcC0+bGVuKSB7CisJb2Zmc2V0ID0gaXRlci0+c3RhcnQgLSBtYXAtPmJhc2VfdHNuOworCXNjdHBfdHNubWFwX2ZpbmRfZ2FwX2FjayhtYXAtPnRzbl9tYXAsIG9mZnNldCwgbWFwLT5sZW4sCisJCQkJICZzdGFydF8sICZlbmRfKTsKIAotCQlvZmZzZXQgPSBpdGVyLT5zdGFydCAtIG1hcC0+YmFzZV90c247Ci0JCXNjdHBfdHNubWFwX2ZpbmRfZ2FwX2FjayhtYXAtPnRzbl9tYXAsIG9mZnNldCwgbWFwLT5sZW4sIDAsCi0JCQkJCSAmc3RhcnRlZCwgJnN0YXJ0XywgJmVuZGVkLCAmZW5kXyk7Ci0JfQotCi0JLyogRG8gd2UgbmVlZCB0byBjaGVjayB0aGUgb3ZlcmZsb3cgbWFwPyAqLwotCWlmICghZW5kZWQpIHsKLQkJLyogRml4IHVwIHdoZXJlIHdlJ2QgbGlrZSB0byBzdGFydCBzZWFyY2hpbmcgaW4gdGhlCi0JCSAqIG92ZXJmbG93IG1hcC4KLQkJICovCi0JCWlmIChpdGVyLT5zdGFydCAtIG1hcC0+YmFzZV90c24gPCBtYXAtPmxlbikKLQkJCW9mZnNldCA9IDA7Ci0JCWVsc2UKLQkJCW9mZnNldCA9IGl0ZXItPnN0YXJ0IC0gbWFwLT5iYXNlX3RzbiAtIG1hcC0+bGVuOwotCi0JCS8qIFNlYXJjaCB0aGUgb3ZlcmZsb3cgbWFwLiAgKi8KLQkJc2N0cF90c25tYXBfZmluZF9nYXBfYWNrKG1hcC0+b3ZlcmZsb3dfbWFwLAotCQkJCQkgb2Zmc2V0LAotCQkJCQkgbWFwLT5sZW4sCi0JCQkJCSBtYXAtPmxlbiwKLQkJCQkJICZzdGFydGVkLCAmc3RhcnRfLAotCQkJCQkgJmVuZGVkLCAmZW5kXyk7Ci0JfQotCi0JLyogVGhlIEdhcCBBY2sgQmxvY2sgaGFwcGVucyB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUKLQkgKiBvdmVyZmxvdyBtYXAuCi0JICovCi0JaWYgKHN0YXJ0ZWQgJiYgIWVuZGVkKSB7Ci0JCWVuZGVkKys7Ci0JCWVuZF8gPSBtYXAtPmxlbiArIG1hcC0+bGVuIC0gMTsKLQl9CisJLyogVGhlIEdhcCBBY2sgQmxvY2sgaGFwcGVucyB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgbWFwLiAqLworCWlmIChzdGFydF8gJiYgIWVuZF8pCisJCWVuZF8gPSBtYXAtPmxlbiAtIDE7CiAKIAkvKiBJZiB3ZSBmb3VuZCBhIEdhcCBBY2sgQmxvY2ssIHJldHVybiB0aGUgc3RhcnQgYW5kIGVuZCBhbmQKIAkgKiBidW1wIHRoZSBpdGVyYXRvciBmb3J3YXJkLgogCSAqLwotCWlmIChlbmRlZCkgeworCWlmIChlbmRfKSB7CiAJCS8qIEZpeCB1cCB0aGUgc3RhcnQgYW5kIGVuZCBiYXNlZCBvbiB0aGUKLQkJICogQ3VtdWxhdGl2ZSBUU04gQWNrIG9mZnNldCBpbnRvIHRoZSBtYXAuCisJCSAqIEN1bXVsYXRpdmUgVFNOIEFjayB3aGljaCBpcyBhbHdheXMgMSBiZWhpbmQgYmFzZS4KIAkJICovCi0JCWludCBnYXAgPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludCAtCi0JCQltYXAtPmJhc2VfdHNuOwotCi0JCSpzdGFydCA9IHN0YXJ0XyAtIGdhcDsKLQkJKmVuZCA9IGVuZF8gLSBnYXA7CisJCSpzdGFydCA9IHN0YXJ0XyArIDE7CisJCSplbmQgPSBlbmRfICsgMTsKIAogCQkvKiBNb3ZlIHRoZSBpdGVyYXRvciBmb3J3YXJkLiAgKi8KIAkJaXRlci0+c3RhcnQgPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludCArICplbmQgKyAxOworCQllbmRlZCA9IDE7CiAJfQogCiAJcmV0dXJuIGVuZGVkOwpAQCAtMjI4LDM1ICsyMDYsMzMgQEAKIC8qIE1hcmsgdGhpcyBhbmQgYW55IGxvd2VyIFRTTiBhcyBzZWVuLiAgKi8KIHZvaWQgc2N0cF90c25tYXBfc2tpcChzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCwgX191MzIgdHNuKQogewotCV9fczMyIGdhcDsKKwl1MzIgZ2FwOwogCi0JLyogVmFjdW91c2x5IG1hcmsgYW55IFRTTiB3aGljaCBwcmVjZWRlcyB0aGUgbWFwIGJhc2Ugb3IKLQkgKiBleGNlZWRzIHRoZSBlbmQgb2YgdGhlIG1hcC4KLQkgKi8KIAlpZiAoVFNOX2x0KHRzbiwgbWFwLT5iYXNlX3RzbikpCiAJCXJldHVybjsKLQlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBtYXAtPmxlbiArIG1hcC0+bGVuKSkKKwlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBTQ1RQX1RTTl9NQVBfU0laRSkpCiAJCXJldHVybjsKIAogCS8qIEJ1bXAgdGhlIG1heC4gICovCiAJaWYgKFRTTl9sdChtYXAtPm1heF90c25fc2VlbiwgdHNuKSkKIAkJbWFwLT5tYXhfdHNuX3NlZW4gPSB0c247CiAKLQkvKiBBc3NlcnQ6IFRTTiBpcyBpbiByYW5nZS4gICovCiAJZ2FwID0gdHNuIC0gbWFwLT5iYXNlX3RzbiArIDE7CiAKLQkvKiBNYXJrIHRoZSBUU05zIGFzIHJlY2VpdmVkLiAgKi8KLQlpZiAoZ2FwIDw9IG1hcC0+bGVuKQotCQltZW1zZXQobWFwLT50c25fbWFwLCAweDAxLCBnYXApOwotCWVsc2UgewotCQltZW1zZXQobWFwLT50c25fbWFwLCAweDAxLCBtYXAtPmxlbik7Ci0JCW1lbXNldChtYXAtPm92ZXJmbG93X21hcCwgMHgwMSwgKGdhcCAtIG1hcC0+bGVuKSk7CisJbWFwLT5iYXNlX3RzbiArPSBnYXA7CisJbWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgKz0gZ2FwOworCWlmIChnYXAgPj0gbWFwLT5sZW4pIHsKKwkJLyogSWYgb3VyIGdhcCBpcyBsYXJnZXIgdGhlbiB0aGUgbWFwIHNpemUsIGp1c3QKKwkJICogemVybyBvdXQgdGhlIG1hcC4KKwkJICovCisJCWJpdG1hcF96ZXJvKG1hcC0+dHNuX21hcCwgbWFwLT5sZW4pOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBnYXAgaXMgc21hbGxlciB0aGVuIHRoZSBtYXAgc2l6ZSwKKwkJICogc2hpZnQgdGhlIG1hcCBieSAnZ2FwJyBiaXRzIGFuZCB1cGRhdGUgZnVydGhlci4KKwkJICovCisJCWJpdG1hcF9zaGlmdF9yaWdodChtYXAtPnRzbl9tYXAsIG1hcC0+dHNuX21hcCwgZ2FwLCBtYXAtPmxlbik7CisJCXNjdHBfdHNubWFwX3VwZGF0ZShtYXApOwogCX0KLQotCS8qIEdvIGZpeHVwIGFueSBpbnRlcm5hbCBUU04gbWFwcGluZyB2YXJpYWJsZXMgaW5jbHVkaW5nCi0JICogY3VtdWxhdGl2ZV90c25fYWNrX3BvaW50LgotCSAqLwotCXNjdHBfdHNubWFwX3VwZGF0ZShtYXApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI2OCwyNyArMjQ0LDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNjdHBfdHNubWFwX3VwZGF0ZShzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKIHsKLQlfX3UzMiBjdHNuOworCXUxNiBsZW47CisJdW5zaWduZWQgbG9uZyB6ZXJvX2JpdDsKIAotCWN0c24gPSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKLQlkbyB7Ci0JCWN0c24rKzsKLQkJaWYgKGN0c24gPT0gbWFwLT5vdmVyZmxvd190c24pIHsKLQkJCS8qIE5vdyB0c25fbWFwIG11c3QgaGF2ZSBiZWVuIGFsbCAnMSdzLAotCQkJICogc28gd2Ugc3dhcCB0aGUgbWFwIGFuZCBjaGVjayB0aGUgb3ZlcmZsb3cgdGFibGUKLQkJCSAqLwotCQkJX191OCAqdG1wID0gbWFwLT50c25fbWFwOwotCQkJbWVtc2V0KHRtcCwgMCwgbWFwLT5sZW4pOwotCQkJbWFwLT50c25fbWFwID0gbWFwLT5vdmVyZmxvd19tYXA7Ci0JCQltYXAtPm92ZXJmbG93X21hcCA9IHRtcDsKIAotCQkJLyogVXBkYXRlIHRoZSB0c25fbWFwIGJvdW5kYXJpZXMuICAqLwotCQkJbWFwLT5iYXNlX3RzbiArPSBtYXAtPmxlbjsKLQkJCW1hcC0+b3ZlcmZsb3dfdHNuICs9IG1hcC0+bGVuOwotCQl9Ci0JfSB3aGlsZSAobWFwLT50c25fbWFwW2N0c24gLSBtYXAtPmJhc2VfdHNuXSk7CisJbGVuID0gbWFwLT5tYXhfdHNuX3NlZW4gLSBtYXAtPmN1bXVsYXRpdmVfdHNuX2Fja19wb2ludDsKKwl6ZXJvX2JpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQobWFwLT50c25fbWFwLCBsZW4pOworCWlmICghemVyb19iaXQpCisJCXJldHVybjsJCS8qIFRoZSBmaXJzdCAwLWJpdCBpcyBiaXQgMC4gIG5vdGhpbmcgdG8gZG8gKi8KIAotCW1hcC0+Y3VtdWxhdGl2ZV90c25fYWNrX3BvaW50ID0gY3RzbiAtIDE7IC8qIEJhY2sgdXAgb25lLiAqLworCW1hcC0+YmFzZV90c24gKz0gemVyb19iaXQ7CisJbWFwLT5jdW11bGF0aXZlX3Rzbl9hY2tfcG9pbnQgKz0gemVyb19iaXQ7CisKKwliaXRtYXBfc2hpZnRfcmlnaHQobWFwLT50c25fbWFwLCBtYXAtPnRzbl9tYXAsIHplcm9fYml0LCBtYXAtPmxlbik7CiB9CiAKIC8qIEhvdyBtYW55IGRhdGEgY2h1bmtzICBhcmUgd2UgbWlzc2luZyBmcm9tIG91ciBwZWVyPwpAQCAtMjk5LDMxICsyNjcsMTkgQEAKIAlfX3UzMiBtYXhfdHNuID0gbWFwLT5tYXhfdHNuX3NlZW47CiAJX191MzIgYmFzZV90c24gPSBtYXAtPmJhc2VfdHNuOwogCV9fdTE2IHBlbmRpbmdfZGF0YTsKLQlfX3MzMiBnYXAsIHN0YXJ0LCBlbmQsIGk7CisJdTMyIGdhcCwgaTsKIAogCXBlbmRpbmdfZGF0YSA9IG1heF90c24gLSBjdW1fdHNuOwogCWdhcCA9IG1heF90c24gLSBiYXNlX3RzbjsKIAotCWlmIChnYXAgPD0gMCB8fCBnYXAgPj0gKG1hcC0+bGVuICsgbWFwLT5sZW4pKQorCWlmIChnYXAgPT0gMCB8fCBnYXAgPj0gbWFwLT5sZW4pCiAJCWdvdG8gb3V0OwogCi0Jc3RhcnQgPSAoKGN1bV90c24gPj0gYmFzZV90c24pID8gKGN1bV90c24gLSBiYXNlX3RzbiArIDEpIDogMCk7Ci0JZW5kID0gKChnYXAgPiBtYXAtPmxlbiApID8gbWFwLT5sZW4gOiBnYXAgKyAxKTsKLQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLQkJaWYgKG1hcC0+dHNuX21hcFtpXSkKKwlmb3IgKGkgPSAwOyBpIDwgZ2FwKzE7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgbWFwLT50c25fbWFwKSkKIAkJCXBlbmRpbmdfZGF0YS0tOwogCX0KIAotCWlmIChnYXAgPj0gbWFwLT5sZW4pIHsKLQkJc3RhcnQgPSAwOwotCQllbmQgPSBnYXAgLSBtYXAtPmxlbiArIDE7Ci0JCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLQkJCWlmIChtYXAtPm92ZXJmbG93X21hcFtpXSkKLQkJCQlwZW5kaW5nX2RhdGEtLTsKLQkJfQotCX0KLQogb3V0OgogCXJldHVybiBwZW5kaW5nX2RhdGE7CiB9CkBAIC0zMzQsMTAgKzI5MCw4IEBACiAgKiBUaGUgZmxhZ3MgInN0YXJ0ZWQiIGFuZCAiZW5kZWQiIHRlbGwgaXMgaWYgd2UgZm91bmQgdGhlIGJlZ2lubmluZwogICogb3IgKHJlc3BlY3RpdmVseSkgdGhlIGVuZCBvZiBhIEdhcCBBY2sgQmxvY2suCiAgKi8KLXN0YXRpYyB2b2lkIHNjdHBfdHNubWFwX2ZpbmRfZ2FwX2FjayhfX3U4ICptYXAsIF9fdTE2IG9mZiwKLQkJCQkgICAgIF9fdTE2IGxlbiwgX191MTYgYmFzZSwKLQkJCQkgICAgIGludCAqc3RhcnRlZCwgX191MTYgKnN0YXJ0LAotCQkJCSAgICAgaW50ICplbmRlZCwgX191MTYgKmVuZCkKK3N0YXRpYyB2b2lkIHNjdHBfdHNubWFwX2ZpbmRfZ2FwX2Fjayh1bnNpZ25lZCBsb25nICptYXAsIF9fdTE2IG9mZiwKKwkJCQkgICAgIF9fdTE2IGxlbiwgX191MTYgKnN0YXJ0LCBfX3UxNiAqZW5kKQogewogCWludCBpID0gb2ZmOwogCkBAIC0zNDgsNTYgKzMwMiw0NCBAQAogCS8qIEFsc28sIHN0b3AgbG9va2luZyBwYXN0IHRoZSBtYXhpbXVtIFRTTiBzZWVuLiAqLwogCiAJLyogTG9vayBmb3IgdGhlIHN0YXJ0LiAqLwotCWlmICghKCpzdGFydGVkKSkgewotCQlmb3IgKDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAobWFwW2ldKSB7Ci0JCQkJKCpzdGFydGVkKSsrOwotCQkJCSpzdGFydCA9IGJhc2UgKyBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorCWkgPSBmaW5kX25leHRfYml0KG1hcCwgbGVuLCBvZmYpOworCWlmIChpIDwgbGVuKQorCQkqc3RhcnQgPSBpOwogCiAJLyogTG9vayBmb3IgdGhlIGVuZC4gICovCi0JaWYgKCpzdGFydGVkKSB7CisJaWYgKCpzdGFydCkgewogCQkvKiBXZSBoYXZlIGZvdW5kIHRoZSBzdGFydCwgbGV0J3MgZmluZCB0aGUKIAkJICogZW5kLiAgSWYgd2UgZmluZCB0aGUgZW5kLCBicmVhayBvdXQuCiAJCSAqLwotCQlmb3IgKDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoIW1hcFtpXSkgewotCQkJCSgqZW5kZWQpKys7Ci0JCQkJKmVuZCA9IGJhc2UgKyBpIC0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorCQlpID0gZmluZF9uZXh0X3plcm9fYml0KG1hcCwgbGVuLCBpKTsKKwkJaWYgKGkgPCBsZW4pCisJCQkqZW5kID0gaSAtIDE7CiAJfQogfQogCiAvKiBSZW5lZ2UgdGhhdCB3ZSBoYXZlIHNlZW4gYSBUU04uICAqLwogdm9pZCBzY3RwX3Rzbm1hcF9yZW5lZ2Uoc3RydWN0IHNjdHBfdHNubWFwICptYXAsIF9fdTMyIHRzbikKIHsKLQlfX3MzMiBnYXA7CisJdTMyIGdhcDsKIAogCWlmIChUU05fbHQodHNuLCBtYXAtPmJhc2VfdHNuKSkKIAkJcmV0dXJuOwotCWlmICghVFNOX2x0KHRzbiwgbWFwLT5iYXNlX3RzbiArIG1hcC0+bGVuICsgbWFwLT5sZW4pKQorCS8qIEFzc2VydDogVFNOIGlzIGluIHJhbmdlLiAgKi8KKwlpZiAoIVRTTl9sdCh0c24sIG1hcC0+YmFzZV90c24gKyBtYXAtPmxlbikpCiAJCXJldHVybjsKIAotCS8qIEFzc2VydDogVFNOIGlzIGluIHJhbmdlLiAgKi8KIAlnYXAgPSB0c24gLSBtYXAtPmJhc2VfdHNuOwogCiAJLyogUHJldGVuZCB3ZSBuZXZlciBzYXcgdGhlIFRTTi4gICovCi0JaWYgKGdhcCA8IG1hcC0+bGVuKQotCQltYXAtPnRzbl9tYXBbZ2FwXSA9IDA7Ci0JZWxzZQotCQltYXAtPm92ZXJmbG93X21hcFtnYXAgLSBtYXAtPmxlbl0gPSAwOworCWNsZWFyX2JpdChnYXAsIG1hcC0+dHNuX21hcCk7CiB9CiAKIC8qIEhvdyBtYW55IGdhcCBhY2sgYmxvY2tzIGRvIHdlIGhhdmUgcmVjb3JkZWQ/ICovCi1fX3UxNiBzY3RwX3Rzbm1hcF9udW1fZ2FicyhzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKK19fdTE2IHNjdHBfdHNubWFwX251bV9nYWJzKHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLAorCQkJICAgc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayAqZ2FicykKIHsKIAlzdHJ1Y3Qgc2N0cF90c25tYXBfaXRlciBpdGVyOwotCWludCBnYWJzID0gMDsKKwlpbnQgbmdhcHMgPSAwOwogCiAJLyogUmVmcmVzaCB0aGUgZ2FwIGFjayBpbmZvcm1hdGlvbi4gKi8KIAlpZiAoc2N0cF90c25tYXBfaGFzX2dhcChtYXApKSB7CkBAIC00MDcsMTIgKzM0OSwzNiBAQAogCQkJCQkJJnN0YXJ0LAogCQkJCQkJJmVuZCkpIHsKIAotCQkJbWFwLT5nYWJzW2dhYnNdLnN0YXJ0ID0gaHRvbnMoc3RhcnQpOwotCQkJbWFwLT5nYWJzW2dhYnNdLmVuZCA9IGh0b25zKGVuZCk7Ci0JCQlnYWJzKys7Ci0JCQlpZiAoZ2FicyA+PSBTQ1RQX01BWF9HQUJTKQorCQkJZ2Fic1tuZ2Fwc10uc3RhcnQgPSBodG9ucyhzdGFydCk7CisJCQlnYWJzW25nYXBzXS5lbmQgPSBodG9ucyhlbmQpOworCQkJbmdhcHMrKzsKKwkJCWlmIChuZ2FwcyA+PSBTQ1RQX01BWF9HQUJTKQogCQkJCWJyZWFrOwogCQl9CiAJfQotCXJldHVybiBnYWJzOworCXJldHVybiBuZ2FwczsKK30KKworc3RhdGljIGludCBzY3RwX3Rzbm1hcF9ncm93KHN0cnVjdCBzY3RwX3Rzbm1hcCAqbWFwLCB1MTYgZ2FwKQoreworCXVuc2lnbmVkIGxvbmcgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGluYzsKKwl1MTYgIGxlbjsKKworCWlmIChnYXAgPj0gU0NUUF9UU05fTUFQX1NJWkUpCisJCXJldHVybiAwOworCisJaW5jID0gQUxJR04oKGdhcCAtIG1hcC0+bGVuKSxCSVRTX1BFUl9MT05HKSArIFNDVFBfVFNOX01BUF9JTkNSRU1FTlQ7CisJbGVuID0gbWluX3QodTE2LCBtYXAtPmxlbiArIGluYywgU0NUUF9UU05fTUFQX1NJWkUpOworCisJbmV3ID0ga3phbGxvYyhsZW4+PjMsIEdGUF9BVE9NSUMpOworCWlmICghbmV3KQorCQlyZXR1cm4gMDsKKworCWJpdG1hcF9jb3B5KG5ldywgbWFwLT50c25fbWFwLCBtYXAtPm1heF90c25fc2VlbiAtIG1hcC0+YmFzZV90c24pOworCWtmcmVlKG1hcC0+dHNuX21hcCk7CisJbWFwLT50c25fbWFwID0gbmV3OworCW1hcC0+bGVuID0gbGVuOworCisJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCBhMWY2NTRhLi41ZjE4NmNhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTcxMyw3ICs3MTMsOSBAQAogCS8qIE5vdyB0aGF0IGFsbCBtZW1vcnkgYWxsb2NhdGlvbnMgZm9yIHRoaXMgY2h1bmsgc3VjY2VlZGVkLCB3ZQogCSAqIGNhbiBtYXJrIGl0IGFzIHJlY2VpdmVkIHNvIHRoZSB0c25fbWFwIGlzIHVwZGF0ZWQgY29ycmVjdGx5LgogCSAqLwotCXNjdHBfdHNubWFwX21hcmsoJmFzb2MtPnBlZXIudHNuX21hcCwgbnRvaGwoY2h1bmstPnN1YmguZGF0YV9oZHItPnRzbikpOworCWlmIChzY3RwX3Rzbm1hcF9tYXJrKCZhc29jLT5wZWVyLnRzbl9tYXAsCisJCQkgICAgIG50b2hsKGNodW5rLT5zdWJoLmRhdGFfaGRyLT50c24pKSkKKwkJZ290byBmYWlsX21hcms7CiAKIAkvKiBGaXJzdCBjYWxjdWxhdGUgdGhlIHBhZGRpbmcsIHNvIHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkKIAkgKiBwYXNzIHVwIHRoZSB3cm9uZyBsZW5ndGggdG8gdGhlIHVzZXIuCkBAIC03NTUsOCArNzU3LDEyIEBACiAJZXZlbnQtPm1zZ19mbGFncyB8PSBjaHVuay0+Y2h1bmtfaGRyLT5mbGFnczsKIAlldmVudC0+aWlmID0gc2N0cF9jaHVua19paWYoY2h1bmspOwogCi1mYWlsOgogCXJldHVybiBldmVudDsKKworZmFpbF9tYXJrOgorCWtmcmVlX3NrYihza2IpOworZmFpbDoKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyogQ3JlYXRlIGEgcGFydGlhbCBkZWxpdmVyeSByZWxhdGVkIGV2ZW50LgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwcXVldWUuYyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKaW5kZXggNTA2MWEyNi4uN2IyMzgwMyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwcXVldWUuYworKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0zMTcsNyArMzE3LDcgQEAKIAl9CiAKIAkvKiBJbnNlcnQgYmVmb3JlIHBvcy4gKi8KLQlfX3NrYl9pbnNlcnQoc2N0cF9ldmVudDJza2IoZXZlbnQpLCBwb3MtPnByZXYsIHBvcywgJnVscHEtPnJlYXNtKTsKKwlfX3NrYl9xdWV1ZV9iZWZvcmUoJnVscHEtPnJlYXNtLCBwb3MsIHNjdHBfZXZlbnQyc2tiKGV2ZW50KSk7CiAKIH0KIApAQCAtODI1LDggKzgyNSw3IEBACiAKIAogCS8qIEluc2VydCBiZWZvcmUgcG9zLiAqLwotCV9fc2tiX2luc2VydChzY3RwX2V2ZW50MnNrYihldmVudCksIHBvcy0+cHJldiwgcG9zLCAmdWxwcS0+bG9iYnkpOwotCisJX19za2JfcXVldWVfYmVmb3JlKCZ1bHBxLT5sb2JieSwgcG9zLCBzY3RwX2V2ZW50MnNrYihldmVudCkpOwogfQogCiBzdGF0aWMgc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwcV9vcmRlcihzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLApkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDhlZjhiYTguLjNlOGQ0ZTMgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTE1MTEsNiArMTUxMSw3IEBACiAJZ290byBvdXRfcHV0OwogfQogCisjaWYgMAogI2lmZGVmIEhBVkVfU0VUX1JFU1RPUkVfU0lHTUFTSwogYXNtbGlua2FnZSBsb25nIHN5c19wYWNjZXB0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXBlZXJfc29ja2FkZHIsCiAJCQkgICAgaW50IF9fdXNlciAqdXBlZXJfYWRkcmxlbiwKQEAgLTE1NjQsNiArMTU2NSw3IEBACiAJcmV0dXJuIGRvX2FjY2VwdChmZCwgdXBlZXJfc29ja2FkZHIsIHVwZWVyX2FkZHJsZW4sIGZsYWdzKTsKIH0KICNlbmRpZgorI2VuZGlmCiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfYWNjZXB0KGludCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqdXBlZXJfc29ja2FkZHIsCiAJCQkgICBpbnQgX191c2VyICp1cGVlcl9hZGRybGVuKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCA3NjczOWU5Li40ODk1YzM0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJY2xudC0+Y2xfcHJvY2luZm8gPSB2ZXJzaW9uLT5wcm9jczsKIAljbG50LT5jbF9tYXhwcm9jICA9IHZlcnNpb24tPm5ycHJvY3M7CiAJY2xudC0+Y2xfcHJvdG5hbWUgPSBwcm9ncmFtLT5uYW1lOwotCWNsbnQtPmNsX3Byb2cgICAgID0gcHJvZ3JhbS0+bnVtYmVyOworCWNsbnQtPmNsX3Byb2cgICAgID0gYXJncy0+cHJvZ251bWJlciA/IDogcHJvZ3JhbS0+bnVtYmVyOwogCWNsbnQtPmNsX3ZlcnMgICAgID0gdmVyc2lvbi0+bnVtYmVyOwogCWNsbnQtPmNsX3N0YXRzICAgID0gcHJvZ3JhbS0+c3RhdHM7CiAJY2xudC0+Y2xfbWV0cmljcyAgPSBycGNfYWxsb2NfaW9zdGF0cyhjbG50KTsKQEAgLTIxMywxMCArMjEzLDEwIEBACiAJfQogCiAJLyogc2F2ZSB0aGUgbm9kZW5hbWUgKi8KLQljbG50LT5jbF9ub2RlbGVuID0gc3RybGVuKHV0c25hbWUoKS0+bm9kZW5hbWUpOworCWNsbnQtPmNsX25vZGVsZW4gPSBzdHJsZW4oaW5pdF91dHNuYW1lKCktPm5vZGVuYW1lKTsKIAlpZiAoY2xudC0+Y2xfbm9kZWxlbiA+IFVOWF9NQVhOT0RFTkFNRSkKIAkJY2xudC0+Y2xfbm9kZWxlbiA9IFVOWF9NQVhOT0RFTkFNRTsKLQltZW1jcHkoY2xudC0+Y2xfbm9kZW5hbWUsIHV0c25hbWUoKS0+bm9kZW5hbWUsIGNsbnQtPmNsX25vZGVsZW4pOworCW1lbWNweShjbG50LT5jbF9ub2RlbmFtZSwgaW5pdF91dHNuYW1lKCktPm5vZGVuYW1lLCBjbG50LT5jbF9ub2RlbGVuKTsKIAlycGNfcmVnaXN0ZXJfY2xpZW50KGNsbnQpOwogCXJldHVybiBjbG50OwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCAyNGRiMmI0Li40MTAxM2RkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgpAQCAtMTc2LDEzICsxNzcsMTIgQEAKIH0KIAogc3RhdGljIGludCBycGNiX3JlZ2lzdGVyX2NhbGwoc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcmxlbiwKLQkJCSAgICAgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgIGludCAqcmVzdWx0KQorCQkJICAgICAgdTMyIHZlcnNpb24sIHN0cnVjdCBycGNfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBycGNfY2xudCAqcnBjYl9jbG50OwotCWludCBlcnJvciA9IDA7CisJaW50IHJlc3VsdCwgZXJyb3IgPSAwOwogCi0JKnJlc3VsdCA9IDA7CisJbXNnLT5ycGNfcmVzcCA9ICZyZXN1bHQ7CiAKIAlycGNiX2NsbnQgPSBycGNiX2NyZWF0ZV9sb2NhbChhZGRyLCBhZGRybGVuLCB2ZXJzaW9uKTsKIAlpZiAoIUlTX0VSUihycGNiX2NsbnQpKSB7CkBAIC0xOTEsMTIgKzE5MSwxNSBAQAogCX0gZWxzZQogCQllcnJvciA9IFBUUl9FUlIocnBjYl9jbG50KTsKIAotCWlmIChlcnJvciA8IDApCisJaWYgKGVycm9yIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJSUEM6IGZhaWxlZCB0byBjb250YWN0IGxvY2FsIHJwY2JpbmQgIgogCQkJCSJzZXJ2ZXIgKGVycm5vICVkKS5cbiIsIC1lcnJvcik7Ci0JZHByaW50aygiUlBDOiAgICAgICByZWdpc3RyYXRpb24gc3RhdHVzICVkLyVkXG4iLCBlcnJvciwgKnJlc3VsdCk7CisJCXJldHVybiBlcnJvcjsKKwl9CiAKLQlyZXR1cm4gZXJyb3I7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUFDQ0VTOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTIwNSw3ICsyMDgsMTEgQEAKICAqIEB2ZXJzOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gYmluZAogICogQHByb3Q6IHRyYW5zcG9ydCBwcm90b2NvbCB0byByZWdpc3RlcgogICogQHBvcnQ6IHBvcnQgdmFsdWUgdG8gcmVnaXN0ZXIKLSAqIEBva2F5OiBPVVQ6IHJlc3VsdCBjb2RlCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSByZWdpc3RyYXRpb24gcmVxdWVzdCB3YXMgZGlzcGF0Y2hlZCBzdWNjZXNzZnVsbHkKKyAqIGFuZCB0aGUgcnBjYmluZCBkYWVtb24gcmV0dXJuZWQgc3VjY2Vzcy4gIE90aGVyd2lzZSwgcmV0dXJucyBhbiBlcnJubworICogdmFsdWUgdGhhdCByZWZsZWN0cyB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvciAocmVxdWVzdCBjb3VsZCBub3QgYmUKKyAqIGRpc3BhdGNoZWQsIHRpbWVkIG91dCwgb3IgcnBjYmluZCByZXR1cm5lZCBhbiBlcnJvcikuCiAgKgogICogUlBDIHNlcnZpY2VzIGludm9rZSB0aGlzIGZ1bmN0aW9uIHRvIGFkdmVydGlzZSB0aGVpciBjb250YWN0CiAgKiBpbmZvcm1hdGlvbiB2aWEgdGhlIHN5c3RlbSdzIHJwY2JpbmQgZGFlbW9uLiAgUlBDIHNlcnZpY2VzCkBAIC0yMTcsMTUgKzIyNCw2IEBACiAgKiBhbGwgcmVnaXN0ZXJlZCB0cmFuc3BvcnRzIGZvciBbcHJvZ3JhbSwgdmVyc2lvbl0gZnJvbSB0aGUgbG9jYWwKICAqIHJwY2JpbmQgZGF0YWJhc2UuCiAgKgotICogUmV0dXJucyB6ZXJvIGlmIHRoZSByZWdpc3RyYXRpb24gcmVxdWVzdCB3YXMgZGlzcGF0Y2hlZAotICogc3VjY2Vzc2Z1bGx5IGFuZCBhIHJlcGx5IHdhcyByZWNlaXZlZC4gIFRoZSBycGNiaW5kIGRhZW1vbidzCi0gKiBib29sZWFuIHJlc3VsdCBjb2RlIGlzIHN0b3JlZCBpbiAqb2theS4KLSAqCi0gKiBSZXR1cm5zIGFuIGVycm5vIHZhbHVlIGFuZCBzZXRzICpyZXN1bHQgdG8gemVybyBpZiB0aGVyZSB3YXMKLSAqIHNvbWUgcHJvYmxlbSB0aGF0IHByZXZlbnRlZCB0aGUgcnBjYmluZCByZXF1ZXN0IGZyb20gYmVpbmcKLSAqIGRpc3BhdGNoZWQsIG9yIGlmIHRoZSBycGNiaW5kIGRhZW1vbiBkaWQgbm90IHJlc3BvbmQgd2l0aGluCi0gKiB0aGUgdGltZW91dC4KLSAqCiAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgcnBjYmluZCBwcm90b2NvbCB2ZXJzaW9uIDIgdG8gY29udGFjdCB0aGUKICAqIGxvY2FsIHJwY2JpbmQgZGFlbW9uLgogICoKQEAgLTIzNiw3ICsyMzQsNyBAQAogICogSU42QUREUl9BTlkgKGllIGF2YWlsYWJsZSBmb3IgYWxsIEFGX0lORVQgYW5kIEFGX0lORVQ2CiAgKiBhZGRyZXNzZXMpLgogICovCi1pbnQgcnBjYl9yZWdpc3Rlcih1MzIgcHJvZywgdTMyIHZlcnMsIGludCBwcm90LCB1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgKm9rYXkpCitpbnQgcnBjYl9yZWdpc3Rlcih1MzIgcHJvZywgdTMyIHZlcnMsIGludCBwcm90LCB1bnNpZ25lZCBzaG9ydCBwb3J0KQogewogCXN0cnVjdCBycGNiaW5kX2FyZ3MgbWFwID0gewogCQkucl9wcm9nCQk9IHByb2csCkBAIC0yNDYsNyArMjQ0LDYgQEAKIAl9OwogCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CiAJCS5ycGNfYXJncAk9ICZtYXAsCi0JCS5ycGNfcmVzcAk9IG9rYXksCiAJfTsKIAogCWRwcmludGsoIlJQQzogICAgICAgJXNyZWdpc3RlcmluZyAoJXUsICV1LCAlZCwgJXUpIHdpdGggbG9jYWwgIgpAQCAtMjU5LDcgKzI1Niw3IEBACiAKIAlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKChzdHJ1Y3Qgc29ja2FkZHIgKikmcnBjYl9pbmFkZHJfbG9vcGJhY2ssCiAJCQkJCXNpemVvZihycGNiX2luYWRkcl9sb29wYmFjayksCi0JCQkJCVJQQ0JWRVJTXzIsICZtc2csIG9rYXkpOworCQkJCQlSUENCVkVSU18yLCAmbXNnKTsKIH0KIAogLyoKQEAgLTI5MCw3ICsyODcsNyBAQAogCiAJcmV0dXJuIHJwY2JfcmVnaXN0ZXJfY2FsbCgoc3RydWN0IHNvY2thZGRyICopJnJwY2JfaW5hZGRyX2xvb3BiYWNrLAogCQkJCQlzaXplb2YocnBjYl9pbmFkZHJfbG9vcGJhY2spLAotCQkJCQlSUENCVkVSU180LCBtc2csIG1zZy0+cnBjX3Jlc3ApOworCQkJCQlSUENCVkVSU180LCBtc2cpOwogfQogCiAvKgpAQCAtMzA0LDEwICszMDEsMTMgQEAKIAljaGFyIGJ1Zls2NF07CiAKIAkvKiBDb25zdHJ1Y3QgQUZfSU5FVDYgdW5pdmVyc2FsIGFkZHJlc3MgKi8KLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJTklQNl9GTVQiLiV1LiV1IiwKLQkJCU5JUDYoYWRkcmVzc190b19yZWdpc3Rlci0+c2luNl9hZGRyKSwKLQkJCXBvcnQgPj4gOCwgcG9ydCAmIDB4ZmYpOworCWlmIChpcHY2X2FkZHJfYW55KCZhZGRyZXNzX3RvX3JlZ2lzdGVyLT5zaW42X2FkZHIpKQorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiOjouJXUuJXUiLAorCQkJCXBvcnQgPj4gOCwgcG9ydCAmIDB4ZmYpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgTklQNl9GTVQiLiV1LiV1IiwKKwkJCQlOSVA2KGFkZHJlc3NfdG9fcmVnaXN0ZXItPnNpbjZfYWRkciksCisJCQkJcG9ydCA+PiA4LCBwb3J0ICYgMHhmZik7CiAJbWFwLT5yX2FkZHIgPSBidWY7CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgICVzcmVnaXN0ZXJpbmcgWyV1LCAldSwgJXMsICclcyddIHdpdGggIgpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIAlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKChzdHJ1Y3Qgc29ja2FkZHIgKikmcnBjYl9pbjZhZGRyX2xvb3BiYWNrLAogCQkJCQlzaXplb2YocnBjYl9pbjZhZGRyX2xvb3BiYWNrKSwKLQkJCQkJUlBDQlZFUlNfNCwgbXNnLCBtc2ctPnJwY19yZXNwKTsKKwkJCQkJUlBDQlZFUlNfNCwgbXNnKTsKIH0KIAogLyoqCkBAIC0zMzAsNyArMzMwLDExIEBACiAgKiBAdmVyc2lvbjogUlBDIHZlcnNpb24gbnVtYmVyIG9mIHNlcnZpY2UgdG8gKHVuKXJlZ2lzdGVyCiAgKiBAYWRkcmVzczogYWRkcmVzcyBmYW1pbHksIElQIGFkZHJlc3MsIGFuZCBwb3J0IHRvICh1bilyZWdpc3RlcgogICogQG5ldGlkOiBuZXRpZCBvZiB0cmFuc3BvcnQgcHJvdG9jb2wgdG8gKHVuKXJlZ2lzdGVyCi0gKiBAcmVzdWx0OiByZXN1bHQgY29kZSBmcm9tIHJwY2JpbmQgUlBDIGNhbGwKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGhlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0IHdhcyBkaXNwYXRjaGVkIHN1Y2Nlc3NmdWxseQorICogYW5kIHRoZSBycGNiaW5kIGRhZW1vbiByZXR1cm5lZCBzdWNjZXNzLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGFuIGVycm5vCisgKiB2YWx1ZSB0aGF0IHJlZmxlY3RzIHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yIChyZXF1ZXN0IGNvdWxkIG5vdCBiZQorICogZGlzcGF0Y2hlZCwgdGltZWQgb3V0LCBvciBycGNiaW5kIHJldHVybmVkIGFuIGVycm9yKS4KICAqCiAgKiBSUEMgc2VydmljZXMgaW52b2tlIHRoaXMgZnVuY3Rpb24gdG8gYWR2ZXJ0aXNlIHRoZWlyIGNvbnRhY3QKICAqIGluZm9ybWF0aW9uIHZpYSB0aGUgc3lzdGVtJ3MgcnBjYmluZCBkYWVtb24uICBSUEMgc2VydmljZXMKQEAgLTM0MiwxNSArMzQ2LDYgQEAKICAqIHRvIHplcm8uICBDYWxsZXJzIHBhc3MgYSBuZXRpZCBvZiAiIiB0byB1bnJlZ2lzdGVyIGFsbAogICogdHJhbnNwb3J0IG5ldGlkcyBhc3NvY2lhdGVkIHdpdGggW3Byb2dyYW0sIHZlcnNpb24sIGFkZHJlc3NdLgogICoKLSAqIFJldHVybnMgemVybyBpZiB0aGUgcmVnaXN0cmF0aW9uIHJlcXVlc3Qgd2FzIGRpc3BhdGNoZWQKLSAqIHN1Y2Nlc3NmdWxseSBhbmQgYSByZXBseSB3YXMgcmVjZWl2ZWQuICBUaGUgcnBjYmluZCBkYWVtb24ncwotICogcmVzdWx0IGNvZGUgaXMgc3RvcmVkIGluICpyZXN1bHQuCi0gKgotICogUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBhbmQgc2V0cyAqcmVzdWx0IHRvIHplcm8gaWYgdGhlcmUgd2FzCi0gKiBzb21lIHByb2JsZW0gdGhhdCBwcmV2ZW50ZWQgdGhlIHJwY2JpbmQgcmVxdWVzdCBmcm9tIGJlaW5nCi0gKiBkaXNwYXRjaGVkLCBvciBpZiB0aGUgcnBjYmluZCBkYWVtb24gZGlkIG5vdCByZXNwb25kIHdpdGhpbgotICogdGhlIHRpbWVvdXQuCi0gKgogICogVGhpcyBmdW5jdGlvbiB1c2VzIHJwY2JpbmQgcHJvdG9jb2wgdmVyc2lvbiA0IHRvIGNvbnRhY3QgdGhlCiAgKiBsb2NhbCBycGNiaW5kIGRhZW1vbi4gIFRoZSBsb2NhbCBycGNiaW5kIGRhZW1vbiBtdXN0IHN1cHBvcnQKICAqIHZlcnNpb24gNCBvZiB0aGUgcnBjYmluZCBwcm90b2NvbCBpbiBvcmRlciBmb3IgdGhlc2UgZnVuY3Rpb25zCkBAIC0zNzIsOCArMzY3LDcgQEAKICAqIGFkdmVydGlzZXMgdGhlIHNlcnZpY2Ugb24gYWxsIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzLgogICovCiBpbnQgcnBjYl92NF9yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCi0JCSAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyZXNzLCBjb25zdCBjaGFyICpuZXRpZCwKLQkJICAgICBpbnQgKnJlc3VsdCkKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5ldGlkKQogewogCXN0cnVjdCBycGNiaW5kX2FyZ3MgbWFwID0gewogCQkucl9wcm9nCQk9IHByb2dyYW0sCkBAIC0zODMsMTEgKzM3Nyw4IEBACiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAotCQkucnBjX3Jlc3AJPSByZXN1bHQsCiAJfTsKIAotCSpyZXN1bHQgPSAwOwotCiAJc3dpdGNoIChhZGRyZXNzLT5zYV9mYW1pbHkpIHsKIAljYXNlIEFGX0lORVQ6CiAJCXJldHVybiBycGNiX3JlZ2lzdGVyX25ldGlkNCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkcmVzcywKQEAgLTQ2OSw2ICs0NjAsMjggQEAKIAlyZXR1cm4gcnBjX3J1bl90YXNrKCZ0YXNrX3NldHVwX2RhdGEpOwogfQogCisvKgorICogSW4gdGhlIGNhc2Ugd2hlcmUgcnBjIGNsaWVudHMgaGF2ZSBiZWVuIGNsb25lZCwgd2Ugd2FudCB0byBtYWtlCisgKiBzdXJlIHRoYXQgd2UgdXNlIHRoZSBwcm9ncmFtIG51bWJlci92ZXJzaW9uIGV0YyBvZiB0aGUgYWN0dWFsCisgKiBvd25lciBvZiB0aGUgeHBydC4gVG8gZG8gc28sIHdlIHdhbGsgYmFjayB1cCB0aGUgdHJlZSBvZiBwYXJlbnRzCisgKiB0byBmaW5kIHdob2V2ZXIgY3JlYXRlZCB0aGUgdHJhbnNwb3J0IGFuZC9vciB3aG9ldmVyIGhhcyB0aGUKKyAqIGF1dG9iaW5kIGZsYWcgc2V0LgorICovCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICpycGNiX2ZpbmRfdHJhbnNwb3J0X293bmVyKHN0cnVjdCBycGNfY2xudCAqY2xudCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKnBhcmVudCA9IGNsbnQtPmNsX3BhcmVudDsKKworCXdoaWxlIChwYXJlbnQgIT0gY2xudCkgeworCQlpZiAocGFyZW50LT5jbF94cHJ0ICE9IGNsbnQtPmNsX3hwcnQpCisJCQlicmVhazsKKwkJaWYgKGNsbnQtPmNsX2F1dG9iaW5kKQorCQkJYnJlYWs7CisJCWNsbnQgPSBwYXJlbnQ7CisJCXBhcmVudCA9IHBhcmVudC0+Y2xfcGFyZW50OworCX0KKwlyZXR1cm4gY2xudDsKK30KKwogLyoqCiAgKiBycGNiX2dldHBvcnRfYXN5bmMgLSBvYnRhaW4gdGhlIHBvcnQgZm9yIGEgZ2l2ZW4gUlBDIHNlcnZpY2Ugb24gYSBnaXZlbiBob3N0CiAgKiBAdGFzazogdGFzayB0aGF0IGlzIHdhaXRpbmcgZm9yIHBvcnRtYXBwZXIgcmVxdWVzdApAQCAtNDc4LDEwICs0OTEsMTAgQEAKICAqLwogdm9pZCBycGNiX2dldHBvcnRfYXN5bmMoc3RydWN0IHJwY190YXNrICp0YXNrKQogewotCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IHRhc2stPnRrX2NsaWVudDsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ7CiAJc3RydWN0IHJwY19wcm9jaW5mbyAqcHJvYzsKIAl1MzIgYmluZF92ZXJzaW9uOwotCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IHRhc2stPnRrX3hwcnQ7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0OwogCXN0cnVjdCBycGNfY2xudAkqcnBjYl9jbG50OwogCXN0YXRpYyBzdHJ1Y3QgcnBjYmluZF9hcmdzICptYXA7CiAJc3RydWN0IHJwY190YXNrCSpjaGlsZDsKQEAgLTQ5MCwxMyArNTAzLDEzIEBACiAJc2l6ZV90IHNhbGVuOwogCWludCBzdGF0dXM7CiAKKwljbG50ID0gcnBjYl9maW5kX3RyYW5zcG9ydF9vd25lcih0YXNrLT50a19jbGllbnQpOworCXhwcnQgPSBjbG50LT5jbF94cHJ0OworCiAJZHByaW50aygiUlBDOiAlNXUgJXMoJXMsICV1LCAldSwgJWQpXG4iLAogCQl0YXNrLT50a19waWQsIF9fZnVuY19fLAogCQljbG50LT5jbF9zZXJ2ZXIsIGNsbnQtPmNsX3Byb2csIGNsbnQtPmNsX3ZlcnMsIHhwcnQtPnByb3QpOwogCi0JLyogQXV0b2JpbmQgb24gY2xvbmVkIHJwYyBjbGllbnRzIGlzIGRpc2NvdXJhZ2VkICovCi0JQlVHX09OKGNsbnQtPmNsX3BhcmVudCAhPSBjbG50KTsKLQogCS8qIFB1dCBzZWxmIG9uIHRoZSB3YWl0IHF1ZXVlIHRvIGVuc3VyZSB3ZSBnZXQgbm90aWZpZWQgaWYKIAkgKiBzb21lIG90aGVyIHRhc2sgaXMgYWxyZWFkeSBhdHRlbXB0aW5nIHRvIGJpbmQgdGhlIHBvcnQgKi8KIAlycGNfc2xlZXBfb24oJnhwcnQtPmJpbmRpbmcsIHRhc2ssIE5VTEwpOwpAQCAtNTU4LDcgKzU3MSw3IEBACiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWRwcmludGsoIlJQQzogJTV1ICVzOiBubyBtZW1vcnkgYXZhaWxhYmxlXG4iLAogCQkJdGFzay0+dGtfcGlkLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gYmFpbG91dF9ub2ZyZWU7CisJCWdvdG8gYmFpbG91dF9yZWxlYXNlX2NsaWVudDsKIAl9CiAJbWFwLT5yX3Byb2cgPSBjbG50LT5jbF9wcm9nOwogCW1hcC0+cl92ZXJzID0gY2xudC0+Y2xfdmVyczsKQEAgLTU3OCwxMSArNTkxLDEzIEBACiAJCQl0YXNrLT50a19waWQsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KLQlycGNfcHV0X3Rhc2soY2hpbGQpOwogCi0JdGFzay0+dGtfeHBydC0+c3RhdC5iaW5kX2NvdW50Kys7CisJeHBydC0+c3RhdC5iaW5kX2NvdW50Kys7CisJcnBjX3B1dF90YXNrKGNoaWxkKTsKIAlyZXR1cm47CiAKK2JhaWxvdXRfcmVsZWFzZV9jbGllbnQ6CisJcnBjX3JlbGVhc2VfY2xpZW50KHJwY2JfY2xudCk7CiBiYWlsb3V0X25vZnJlZToKIAlycGNiX3dha2VfcnBjYmluZF93YWl0ZXJzKHhwcnQsIHN0YXR1cyk7CiAJdGFzay0+dGtfc3RhdHVzID0gc3RhdHVzOwpAQCAtNjMzLDcgKzY0OCw3IEBACiBzdGF0aWMgaW50IHJwY2JfZW5jb2RlX21hcHBpbmcoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKIAkJCSAgICAgICBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQogewotCWRwcmludGsoIlJQQzogICAgICAgcnBjYl9lbmNvZGVfbWFwcGluZygldSwgJXUsICVkLCAldSlcbiIsCisJZHByaW50aygiUlBDOiAgICAgICBlbmNvZGluZyBycGNiIHJlcXVlc3QgKCV1LCAldSwgJWQsICV1KVxuIiwKIAkJCXJwY2ItPnJfcHJvZywgcnBjYi0+cl92ZXJzLCBycGNiLT5yX3Byb3QsIHJwY2ItPnJfcG9ydCk7CiAJKnArKyA9IGh0b25sKHJwY2ItPnJfcHJvZyk7CiAJKnArKyA9IGh0b25sKHJwY2ItPnJfdmVycyk7CkBAIC02NDgsNyArNjYzLDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqcG9ydHApCiB7CiAJKnBvcnRwID0gKHVuc2lnbmVkIHNob3J0KSBudG9obCgqcCsrKTsKLQlkcHJpbnRrKCJSUEM6ICAgICAgIHJwY2JfZGVjb2RlX2dldHBvcnQgcmVzdWx0ICV1XG4iLAorCWRwcmludGsoIlJQQzogICAgICAgcnBjYiBnZXRwb3J0IHJlc3VsdDogJXVcbiIsCiAJCQkqcG9ydHApOwogCXJldHVybiAwOwogfQpAQCAtNjU3LDcgKzY3Miw3IEBACiAJCQkgICB1bnNpZ25lZCBpbnQgKmJvb2xwKQogewogCSpib29scCA9ICh1bnNpZ25lZCBpbnQpIG50b2hsKCpwKyspOwotCWRwcmludGsoIlJQQzogICAgICAgcnBjYl9kZWNvZGVfc2V0OiBjYWxsICVzXG4iLAorCWRwcmludGsoIlJQQzogICAgICAgcnBjYiBzZXQvdW5zZXQgY2FsbCAlc1xuIiwKIAkJCSgqYm9vbHAgPyAic3VjY2VlZGVkIiA6ICJmYWlsZWQiKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NjUsNyArNjgwLDcgQEAKIHN0YXRpYyBpbnQgcnBjYl9lbmNvZGVfZ2V0YWRkcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogCQkJICAgICAgIHN0cnVjdCBycGNiaW5kX2FyZ3MgKnJwY2IpCiB7Ci0JZHByaW50aygiUlBDOiAgICAgICBycGNiX2VuY29kZV9nZXRhZGRyKCV1LCAldSwgJXMpXG4iLAorCWRwcmludGsoIlJQQzogICAgICAgZW5jb2RpbmcgcnBjYiByZXF1ZXN0ICgldSwgJXUsICVzKVxuIiwKIAkJCXJwY2ItPnJfcHJvZywgcnBjYi0+cl92ZXJzLCBycGNiLT5yX2FkZHIpOwogCSpwKysgPSBodG9ubChycGNiLT5yX3Byb2cpOwogCSpwKysgPSBodG9ubChycGNiLT5yX3ZlcnMpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKaW5kZXggNWEzMmNiNy4uNTRjOThkOCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmMuYworKysgYi9uZXQvc3VucnBjL3N2Yy5jCkBAIC0yOCw2ICsyOCw4IEBACiAKICNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19TVkNEU1AKIAorc3RhdGljIHZvaWQgc3ZjX3VucmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KTsKKwogI2RlZmluZSBzdmNfc2Vydl9pc19wb29sZWQoc2VydikgICAgKChzZXJ2KS0+c3ZfZnVuY3Rpb24pCiAKIC8qCkBAIC0zNTcsNyArMzU5LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzdmNfc2VydiAqCiBfX3N2Y19jcmVhdGUoc3RydWN0IHN2Y19wcm9ncmFtICpwcm9nLCB1bnNpZ25lZCBpbnQgYnVmc2l6ZSwgaW50IG5wb29scywKLQkgICB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydikpCisJICAgc2FfZmFtaWx5X3QgZmFtaWx5LCB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydikpCiB7CiAJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2OwogCXVuc2lnbmVkIGludCB2ZXJzOwpAQCAtMzY2LDYgKzM2OCw3IEBACiAKIAlpZiAoIShzZXJ2ID0ga3phbGxvYyhzaXplb2YoKnNlcnYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiBOVUxMOworCXNlcnYtPnN2X2ZhbWlseSAgICA9IGZhbWlseTsKIAlzZXJ2LT5zdl9uYW1lICAgICAgPSBwcm9nLT5wZ19uYW1lOwogCXNlcnYtPnN2X3Byb2dyYW0gICA9IHByb2c7CiAJc2Vydi0+c3ZfbnJ0aHJlYWRzID0gMTsKQEAgLTQxNiwzMCArNDE5LDI5IEBACiAJCXNwaW5fbG9ja19pbml0KCZwb29sLT5zcF9sb2NrKTsKIAl9CiAKLQogCS8qIFJlbW92ZSBhbnkgc3RhbGUgcG9ydG1hcCByZWdpc3RyYXRpb25zICovCi0Jc3ZjX3JlZ2lzdGVyKHNlcnYsIDAsIDApOworCXN2Y191bnJlZ2lzdGVyKHNlcnYpOwogCiAJcmV0dXJuIHNlcnY7CiB9CiAKIHN0cnVjdCBzdmNfc2VydiAqCiBzdmNfY3JlYXRlKHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZywgdW5zaWduZWQgaW50IGJ1ZnNpemUsCi0JCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KSkKKwkJc2FfZmFtaWx5X3QgZmFtaWx5LCB2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzdmNfc2VydiAqc2VydikpCiB7Ci0JcmV0dXJuIF9fc3ZjX2NyZWF0ZShwcm9nLCBidWZzaXplLCAvKm5wb29scyovMSwgc2h1dGRvd24pOworCXJldHVybiBfX3N2Y19jcmVhdGUocHJvZywgYnVmc2l6ZSwgLypucG9vbHMqLzEsIGZhbWlseSwgc2h1dGRvd24pOwogfQogRVhQT1JUX1NZTUJPTChzdmNfY3JlYXRlKTsKIAogc3RydWN0IHN2Y19zZXJ2ICoKIHN2Y19jcmVhdGVfcG9vbGVkKHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZywgdW5zaWduZWQgaW50IGJ1ZnNpemUsCi0JCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KSwKKwkJICBzYV9mYW1pbHlfdCBmYW1pbHksIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KSwKIAkJICBzdmNfdGhyZWFkX2ZuIGZ1bmMsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnY7CiAJdW5zaWduZWQgaW50IG5wb29scyA9IHN2Y19wb29sX21hcF9nZXQoKTsKIAotCXNlcnYgPSBfX3N2Y19jcmVhdGUocHJvZywgYnVmc2l6ZSwgbnBvb2xzLCBzaHV0ZG93bik7CisJc2VydiA9IF9fc3ZjX2NyZWF0ZShwcm9nLCBidWZzaXplLCBucG9vbHMsIGZhbWlseSwgc2h1dGRvd24pOwogCiAJaWYgKHNlcnYgIT0gTlVMTCkgewogCQlzZXJ2LT5zdl9mdW5jdGlvbiA9IGZ1bmM7CkBAIC00ODYsOCArNDg4LDcgQEAKIAlpZiAoc3ZjX3NlcnZfaXNfcG9vbGVkKHNlcnYpKQogCQlzdmNfcG9vbF9tYXBfcHV0KCk7CiAKLQkvKiBVbnJlZ2lzdGVyIHNlcnZpY2Ugd2l0aCB0aGUgcG9ydG1hcHBlciAqLwotCXN2Y19yZWdpc3RlcihzZXJ2LCAwLCAwKTsKKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKIAlrZnJlZShzZXJ2LT5zdl9wb29scyk7CiAJa2ZyZWUoc2Vydik7CiB9CkBAIC03MTgsNTUgKzcxOSwyNDUgQEAKIH0KIEVYUE9SVF9TWU1CT0woc3ZjX2V4aXRfdGhyZWFkKTsKIAorI2lmZGVmIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQKKwogLyoKLSAqIFJlZ2lzdGVyIGFuIFJQQyBzZXJ2aWNlIHdpdGggdGhlIGxvY2FsIHBvcnRtYXBwZXIuCi0gKiBUbyB1bnJlZ2lzdGVyIGEgc2VydmljZSwgY2FsbCB0aGlzIHJvdXRpbmUgd2l0aAotICogcHJvdG8gYW5kIHBvcnQgPT0gMC4KKyAqIFJlZ2lzdGVyIGFuICJpbmV0IiBwcm90b2NvbCBmYW1pbHkgbmV0aWQgd2l0aCB0aGUgbG9jYWwKKyAqIHJwY2JpbmQgZGFlbW9uIHZpYSBhbiBycGNiaW5kIHY0IFNFVCByZXF1ZXN0LgorICoKKyAqIE5vIG5ldGNvbmZpZyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCwgc28KKyAqIHdlIG1hcCBJUF8gcHJvdG9jb2wgbnVtYmVycyB0byBuZXRpZHMgYnkgaGFuZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzczsgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZAorICogaWYgYW55IGVycm9yIG9jY3Vycy4KICAqLwotaW50Ci1zdmNfcmVnaXN0ZXIoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBpbnQgcHJvdG8sIHVuc2lnbmVkIHNob3J0IHBvcnQpCitzdGF0aWMgaW50IF9fc3ZjX3JwY2JfcmVnaXN0ZXI0KGNvbnN0IHUzMiBwcm9ncmFtLCBjb25zdCB1MzIgdmVyc2lvbiwKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCwKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CisJCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCisJCS5zaW5fYWRkci5zX2FkZHIJPSBodG9ubChJTkFERFJfQU5ZKSwKKwkJLnNpbl9wb3J0CQk9IGh0b25zKHBvcnQpLAorCX07CisJY2hhciAqbmV0aWQ7CisKKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJbmV0aWQgPSBSUENCSU5EX05FVElEX1VEUDsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJbmV0aWQgPSBSUENCSU5EX05FVElEX1RDUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIHJwY2JfdjRfcmVnaXN0ZXIocHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJnNpbiwgbmV0aWQpOworfQorCisvKgorICogUmVnaXN0ZXIgYW4gImluZXQ2IiBwcm90b2NvbCBmYW1pbHkgbmV0aWQgd2l0aCB0aGUgbG9jYWwKKyAqIHJwY2JpbmQgZGFlbW9uIHZpYSBhbiBycGNiaW5kIHY0IFNFVCByZXF1ZXN0LgorICoKKyAqIE5vIG5ldGNvbmZpZyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCwgc28KKyAqIHdlIG1hcCBJUF8gcHJvdG9jb2wgbnVtYmVycyB0byBuZXRpZHMgYnkgaGFuZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzczsgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZAorICogaWYgYW55IGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludCBfX3N2Y19ycGNiX3JlZ2lzdGVyNihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjYgPSB7CisJCS5zaW42X2ZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLnNpbjZfYWRkcgkJPSBJTjZBRERSX0FOWV9JTklULAorCQkuc2luNl9wb3J0CQk9IGh0b25zKHBvcnQpLAorCX07CisJY2hhciAqbmV0aWQ7CisKKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJbmV0aWQgPSBSUENCSU5EX05FVElEX1VEUDY7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19UQ1A6CisJCW5ldGlkID0gUlBDQklORF9ORVRJRF9UQ1A2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwl9CisKKwlyZXR1cm4gcnBjYl92NF9yZWdpc3Rlcihwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNiwgbmV0aWQpOworfQorCisvKgorICogUmVnaXN0ZXIgYSBrZXJuZWwgUlBDIHNlcnZpY2UgdmlhIHJwY2JpbmQgdmVyc2lvbiA0LgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGlzIHJldHVybmVkCisgKiBpZiBhbnkgZXJyb3Igb2NjdXJzLgorICovCitzdGF0aWMgaW50IF9fc3ZjX3JlZ2lzdGVyKGNvbnN0IHUzMiBwcm9ncmFtLCBjb25zdCB1MzIgdmVyc2lvbiwKKwkJCSAgY29uc3Qgc2FfZmFtaWx5X3QgZmFtaWx5LAorCQkJICBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCwKKwkJCSAgY29uc3QgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlpbnQgZXJyb3I7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIF9fc3ZjX3JwY2JfcmVnaXN0ZXI0KHByb2dyYW0sIHZlcnNpb24sCisJCQkJCQlwcm90b2NvbCwgcG9ydCk7CisJY2FzZSBBRl9JTkVUNjoKKwkJZXJyb3IgPSBfX3N2Y19ycGNiX3JlZ2lzdGVyNihwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJcHJvdG9jb2wsIHBvcnQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIGVycm9yOworCisJCS8qCisJCSAqIFdvcmsgYXJvdW5kIGJ1ZyBpbiBzb21lIHZlcnNpb25zIG9mIExpbnV4IHJwY2JpbmQKKwkJICogd2hpY2ggZG9uJ3QgYWxsb3cgcmVnaXN0cmF0aW9uIG9mIGJvdGggaW5ldCBhbmQKKwkJICogaW5ldDYgbmV0aWRzLgorCQkgKgorCQkgKiBFcnJvciByZXR1cm4gaWdub3JlZCBmb3Igbm93LgorCQkgKi8KKwkJX19zdmNfcnBjYl9yZWdpc3RlcjQocHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkJCXByb3RvY29sLCBwb3J0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7Cit9CisKKyNlbHNlCS8qIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KKworLyoKKyAqIFJlZ2lzdGVyIGEga2VybmVsIFJQQyBzZXJ2aWNlIHZpYSBycGNiaW5kIHZlcnNpb24gMi4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzczsgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZAorICogaWYgYW55IGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludCBfX3N2Y19yZWdpc3Rlcihjb25zdCB1MzIgcHJvZ3JhbSwgY29uc3QgdTMyIHZlcnNpb24sCisJCQkgIHNhX2ZhbWlseV90IGZhbWlseSwKKwkJCSAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJaWYgKGZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCXJldHVybiBycGNiX3JlZ2lzdGVyKHByb2dyYW0sIHZlcnNpb24sIHByb3RvY29sLCBwb3J0KTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KKworLyoqCisgKiBzdmNfcmVnaXN0ZXIgLSByZWdpc3RlciBhbiBSUEMgc2VydmljZSB3aXRoIHRoZSBsb2NhbCBwb3J0bWFwcGVyCisgKiBAc2Vydjogc3ZjX3NlcnYgc3RydWN0IGZvciB0aGUgc2VydmljZSB0byByZWdpc3RlcgorICogQHByb3RvOiB0cmFuc3BvcnQgcHJvdG9jb2wgbnVtYmVyIHRvIGFkdmVydGlzZQorICogQHBvcnQ6IHBvcnQgdG8gYWR2ZXJ0aXNlCisgKgorICogU2VydmljZSBpcyByZWdpc3RlcmVkIGZvciBhbnkgYWRkcmVzcyBpbiBzZXJ2J3MgYWRkcmVzcyBmYW1pbHkKKyAqLworaW50IHN2Y19yZWdpc3Rlcihjb25zdCBzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgcG9ydCkKIHsKIAlzdHJ1Y3Qgc3ZjX3Byb2dyYW0JKnByb2dwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXVuc2lnbmVkIGludAkJaTsKLQlpbnQJCQllcnJvciA9IDAsIGR1bW15OworCWludAkJCWVycm9yID0gMDsKIAotCWlmICghcG9ydCkKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NJR1BFTkRJTkcpOworCUJVR19PTihwcm90byA9PSAwICYmIHBvcnQgPT0gMCk7CiAKIAlmb3IgKHByb2dwID0gc2Vydi0+c3ZfcHJvZ3JhbTsgcHJvZ3A7IHByb2dwID0gcHJvZ3AtPnBnX25leHQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHByb2dwLT5wZ19udmVyczsgaSsrKSB7CiAJCQlpZiAocHJvZ3AtPnBnX3ZlcnNbaV0gPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAotCQkJZHByaW50aygic3ZjOiBzdmNfcmVnaXN0ZXIoJXMsICVzLCAlZCwgJWQpJXNcbiIsCisJCQlkcHJpbnRrKCJzdmM6IHN2Y19yZWdpc3Rlciglc3YlZCwgJXMsICV1LCAldSklc1xuIiwKIAkJCQkJcHJvZ3AtPnBnX25hbWUsCisJCQkJCWksCiAJCQkJCXByb3RvID09IElQUFJPVE9fVURQPyAgInVkcCIgOiAidGNwIiwKIAkJCQkJcG9ydCwKLQkJCQkJaSwKKwkJCQkJc2Vydi0+c3ZfZmFtaWx5LAogCQkJCQlwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuPwogCQkJCQkJIiAoYnV0IG5vdCB0ZWxsaW5nIHBvcnRtYXApIiA6ICIiKTsKIAogCQkJaWYgKHByb2dwLT5wZ192ZXJzW2ldLT52c19oaWRkZW4pCiAJCQkJY29udGludWU7CiAKLQkJCWVycm9yID0gcnBjYl9yZWdpc3Rlcihwcm9ncC0+cGdfcHJvZywgaSwgcHJvdG8sIHBvcnQsICZkdW1teSk7CisJCQllcnJvciA9IF9fc3ZjX3JlZ2lzdGVyKHByb2dwLT5wZ19wcm9nLCBpLAorCQkJCQkJc2Vydi0+c3ZfZmFtaWx5LCBwcm90bywgcG9ydCk7CiAJCQlpZiAoZXJyb3IgPCAwKQogCQkJCWJyZWFrOwotCQkJaWYgKHBvcnQgJiYgIWR1bW15KSB7Ci0JCQkJZXJyb3IgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCQkJfQogCQl9CiAJfQogCi0JaWYgKCFwb3J0KSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0CisKK3N0YXRpYyB2b2lkIF9fc3ZjX3VucmVnaXN0ZXIoY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLAorCQkJICAgICBjb25zdCBjaGFyICpwcm9nbmFtZSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjYgPSB7CisJCS5zaW42X2ZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLnNpbjZfYWRkcgkJPSBJTjZBRERSX0FOWV9JTklULAorCQkuc2luNl9wb3J0CQk9IDAsCisJfTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHJwY2JfdjRfcmVnaXN0ZXIocHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJnNpbjYsICIiKTsKKwlkcHJpbnRrKCJzdmM6ICVzKCVzdiV1KSwgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgcHJvZ25hbWUsIHZlcnNpb24sIGVycm9yKTsKK30KKworI2Vsc2UJLyogQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCAqLworCitzdGF0aWMgdm9pZCBfX3N2Y191bnJlZ2lzdGVyKGNvbnN0IHUzMiBwcm9ncmFtLCBjb25zdCB1MzIgdmVyc2lvbiwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBycGNiX3JlZ2lzdGVyKHByb2dyYW0sIHZlcnNpb24sIDAsIDApOworCWRwcmludGsoInN2YzogJXMoJXN2JXUpLCBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCBwcm9nbmFtZSwgdmVyc2lvbiwgZXJyb3IpOworfQorCisjZW5kaWYJLyogQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCAqLworCisvKgorICogQWxsIG5ldGlkcywgYmluZCBhZGRyZXNzZXMgYW5kIHBvcnRzIHJlZ2lzdGVyZWQgZm9yIFtwcm9ncmFtLCB2ZXJzaW9uXQorICogYXJlIHJlbW92ZWQgZnJvbSB0aGUgbG9jYWwgcnBjYmluZCBkYXRhYmFzZSAoaWYgdGhlIHNlcnZpY2UgaXMgbm90CisgKiBoaWRkZW4pIHRvIG1ha2Ugd2F5IGZvciBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2VydmljZS4KKyAqCisgKiBUaGUgcmVzdWx0IG9mIHVucmVnaXN0cmF0aW9uIGlzIHJlcG9ydGVkIHZpYSBkcHJpbnRrIGZvciB0aG9zZSB3aG8gd2FudAorICogdmVyaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQsIGJ1dCBpcyBvdGhlcndpc2Ugbm90IGltcG9ydGFudC4KKyAqLworc3RhdGljIHZvaWQgc3ZjX3VucmVnaXN0ZXIoY29uc3Qgc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQoreworCXN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZ3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKworCWZvciAocHJvZ3AgPSBzZXJ2LT5zdl9wcm9ncmFtOyBwcm9ncDsgcHJvZ3AgPSBwcm9ncC0+cGdfbmV4dCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcHJvZ3AtPnBnX252ZXJzOyBpKyspIHsKKwkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHByb2dwLT5wZ192ZXJzW2ldLT52c19oaWRkZW4pCisJCQkJY29udGludWU7CisKKwkJCV9fc3ZjX3VucmVnaXN0ZXIocHJvZ3AtPnBnX3Byb2csIGksIHByb2dwLT5wZ19uYW1lKTsKKwkJfQogCX0KIAotCXJldHVybiBlcnJvcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCmluZGV4IGU0NmM4MjUuLmJmNWI1Y2QgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYworKysgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKQEAgLTE1OSwxNSArMTU5LDQ0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzdmNfeHBydF9pbml0KTsKIAotaW50IHN2Y19jcmVhdGVfeHBydChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGNoYXIgKnhwcnRfbmFtZSwgdW5zaWduZWQgc2hvcnQgcG9ydCwKLQkJICAgIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKl9fc3ZjX3hwb19jcmVhdGUoc3RydWN0IHN2Y194cHJ0X2NsYXNzICp4Y2wsCisJCQkJCSBzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsCisJCQkJCSB1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHN2Y194cHJ0X2NsYXNzICp4Y2w7CiAJc3RydWN0IHNvY2thZGRyX2luIHNpbiA9IHsKIAkJLnNpbl9mYW1pbHkJCT0gQUZfSU5FVCwKIAkJLnNpbl9hZGRyLnNfYWRkcgk9IGh0b25sKElOQUREUl9BTlkpLAogCQkuc2luX3BvcnQJCT0gaHRvbnMocG9ydCksCiAJfTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjYgPSB7CisJCS5zaW42X2ZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLnNpbjZfYWRkcgkJPSBJTjZBRERSX0FOWV9JTklULAorCQkuc2luNl9wb3J0CQk9IGh0b25zKHBvcnQpLAorCX07CisJc3RydWN0IHNvY2thZGRyICpzYXA7CisJc2l6ZV90IGxlbjsKKworCXN3aXRjaCAoc2Vydi0+c3ZfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjsKKwkJbGVuID0gc2l6ZW9mKHNpbik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCXNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNjsKKwkJbGVuID0gc2l6ZW9mKHNpbjYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRUFGTk9TVVBQT1JUKTsKKwl9CisKKwlyZXR1cm4geGNsLT54Y2xfb3BzLT54cG9fY3JlYXRlKHNlcnYsIHNhcCwgbGVuLCBmbGFncyk7Cit9CisKK2ludCBzdmNfY3JlYXRlX3hwcnQoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LCBjaGFyICp4cHJ0X25hbWUsIHVuc2lnbmVkIHNob3J0IHBvcnQsCisJCSAgICBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHN2Y194cHJ0X2NsYXNzICp4Y2w7CisKIAlkcHJpbnRrKCJzdmM6IGNyZWF0aW5nIHRyYW5zcG9ydCAlc1slZF1cbiIsIHhwcnRfbmFtZSwgcG9ydCk7CiAJc3Bpbl9sb2NrKCZzdmNfeHBydF9jbGFzc19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhjbCwgJnN2Y194cHJ0X2NsYXNzX2xpc3QsIHhjbF9saXN0KSB7CkBAIC0xODAsOSArMjA5LDcgQEAKIAkJCWdvdG8gZXJyOwogCiAJCXNwaW5fdW5sb2NrKCZzdmNfeHBydF9jbGFzc19sb2NrKTsKLQkJbmV3eHBydCA9IHhjbC0+eGNsX29wcy0+Ci0JCQl4cG9fY3JlYXRlKHNlcnYsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSwKLQkJCQkgICBmbGFncyk7CisJCW5ld3hwcnQgPSBfX3N2Y194cG9fY3JlYXRlKHhjbCwgc2VydiwgcG9ydCwgZmxhZ3MpOwogCQlpZiAoSVNfRVJSKG5ld3hwcnQpKSB7CiAJCQltb2R1bGVfcHV0KHhjbC0+eGNsX293bmVyKTsKIAkJCXJldHVybiBQVFJfRVJSKG5ld3hwcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCAzZTY1NzE5Li45NTI5M2Y1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtMTExNCw2ICsxMTE0LDcgQEAKIAlzdHJ1Y3Qgc3ZjX3NvY2sJKnN2c2s7CiAJc3RydWN0IHNvY2sJKmluZXQ7CiAJaW50CQlwbWFwX3JlZ2lzdGVyID0gIShmbGFncyAmIFNWQ19TT0NLX0FOT05ZTU9VUyk7CisJaW50CQl2YWw7CiAKIAlkcHJpbnRrKCJzdmM6IHN2Y19zZXR1cF9zb2NrZXQgJXBcbiIsIHNvY2spOwogCWlmICghKHN2c2sgPSBremFsbG9jKHNpemVvZigqc3ZzayksIEdGUF9LRVJORUwpKSkgewpAQCAtMTE0Niw2ICsxMTQ3LDE4IEBACiAJZWxzZQogCQlzdmNfdGNwX2luaXQoc3Zzaywgc2Vydik7CiAKKwkvKgorCSAqIFdlIHN0YXJ0IG9uZSBsaXN0ZW5lciBwZXIgc3Zfc2Vydi4gIFdlIHdhbnQgQUZfSU5FVAorCSAqIHJlcXVlc3RzIHRvIGJlIGF1dG9tYXRpY2FsbHkgc2h1bnRlZCB0byBvdXIgQUZfSU5FVDYKKwkgKiBsaXN0ZW5lciB1c2luZyBhIG1hcHBlZCBJUHY0IGFkZHJlc3MuICBNYWtlIHN1cmUKKwkgKiBuby1vbmUgc3RhcnRzIGFuIGVxdWl2YWxlbnQgSVB2NCBsaXN0ZW5lciwgd2hpY2gKKwkgKiB3b3VsZCBzdGVhbCBvdXIgaW5jb21pbmcgY29ubmVjdGlvbnMuCisJICovCisJdmFsID0gMDsKKwlpZiAoc2Vydi0+c3ZfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfSVBWNiwgSVBWNl9WNk9OTFksCisJCQkJCShjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCiAJZHByaW50aygic3ZjOiBzdmNfc2V0dXBfc29ja2V0IGNyZWF0ZWQgJXAgKGluZXQgJXApXG4iLAogCQkJCXN2c2ssIHN2c2stPnNrX3NrKTsKIApAQCAtMTE1NCw4ICsxMTY3LDcgQEAKIAogaW50IHN2Y19hZGRzb2NrKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKIAkJaW50IGZkLAotCQljaGFyICpuYW1lX3JldHVybiwKLQkJaW50ICpwcm90bykKKwkJY2hhciAqbmFtZV9yZXR1cm4pCiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IHNvY2tldCAqc28gPSBzb2NrZmRfbG9va3VwKGZkLCAmZXJyKTsKQEAgLTExOTAsNyArMTIwMiw2IEBACiAJCXNvY2tmZF9wdXQoc28pOwogCQlyZXR1cm4gZXJyOwogCX0KLQlpZiAocHJvdG8pICpwcm90byA9IHNvLT5zay0+c2tfcHJvdG9jb2w7CiAJcmV0dXJuIG9uZV9zb2NrX25hbWUobmFtZV9yZXR1cm4sIHN2c2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2FkZHNvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYwppbmRleCA5OWE1MmFhLi4yOWU0MDFiIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnQuYworKysgYi9uZXQvc3VucnBjL3hwcnQuYwpAQCAtMTA4LDEzICsxMDgsMTAgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCXJlc3VsdCA9IC1FSU5WQUw7Ci0JaWYgKHRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgewotCQlsaXN0X2FkZF90YWlsKCZ0cmFuc3BvcnQtPmxpc3QsICZ4cHJ0X2xpc3QpOwotCQlwcmludGsoS0VSTl9JTkZPICJSUEM6IFJlZ2lzdGVyZWQgJXMgdHJhbnNwb3J0IG1vZHVsZS5cbiIsCi0JCQl0cmFuc3BvcnQtPm5hbWUpOwotCQlyZXN1bHQgPSAwOwotCX0KKwlsaXN0X2FkZF90YWlsKCZ0cmFuc3BvcnQtPmxpc3QsICZ4cHJ0X2xpc3QpOworCXByaW50ayhLRVJOX0lORk8gIlJQQzogUmVnaXN0ZXJlZCAlcyB0cmFuc3BvcnQgbW9kdWxlLlxuIiwKKwkgICAgICAgdHJhbnNwb3J0LT5uYW1lKTsKKwlyZXN1bHQgPSAwOwogCiBvdXQ6CiAJc3Bpbl91bmxvY2soJnhwcnRfbGlzdF9sb2NrKTsKQEAgLTE0Myw3ICsxNDAsNiBAQAogCQkJCSJSUEM6IFVucmVnaXN0ZXJlZCAlcyB0cmFuc3BvcnQgbW9kdWxlLlxuIiwKIAkJCQl0cmFuc3BvcnQtPm5hbWUpOwogCQkJbGlzdF9kZWxfaW5pdCgmdHJhbnNwb3J0LT5saXN0KTsKLQkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3JwY19yZG1hLmMgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3JwY19yZG1hLmMKaW5kZXggZTU1NDI3Zi4uMTQxMDZkMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0cmRtYS9ycGNfcmRtYS5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvcnBjX3JkbWEuYwpAQCAtMTE4LDYgKzExOCwxMCBAQAogCX0KIAogCWlmICh4ZHJidWYtPnRhaWxbMF0uaW92X2xlbikgeworCQkvKiB0aGUgcnBjcmRtYSBwcm90b2NvbCBhbGxvd3MgdXMgdG8gb21pdCBhbnkgdHJhaWxpbmcKKwkJICogeGRyIHBhZCBieXRlcywgc2F2aW5nIHRoZSBzZXJ2ZXIgYW4gUkRNQSBvcGVyYXRpb24uICovCisJCWlmICh4ZHJidWYtPnRhaWxbMF0uaW92X2xlbiA8IDQgJiYgeHBydF9yZG1hX3BhZF9vcHRpbWl6ZSkKKwkJCXJldHVybiBuOwogCQlpZiAobiA9PSBuc2VncykKIAkJCXJldHVybiAwOwogCQlzZWdbbl0ubXJfcGFnZSA9IE5VTEw7CkBAIC01MDgsOCArNTEyLDggQEAKIAlpZiAoaGRybGVuID09IDApCiAJCXJldHVybiAtMTsKIAotCWRwcmludGsoIlJQQzogICAgICAgJXM6ICVzOiBoZHJsZW4gJXpkIHJwY2xlbiAlemQgcGFkbGVuICV6ZFxuIgotCQkiICAgICAgICAgICAgICAgICAgIGhlYWRlcnAgMHglcCBiYXNlIDB4JXAgbGtleSAweCV4XG4iLAorCWRwcmludGsoIlJQQzogICAgICAgJXM6ICVzOiBoZHJsZW4gJXpkIHJwY2xlbiAlemQgcGFkbGVuICV6ZCIKKwkJIiBoZWFkZXJwIDB4JXAgYmFzZSAweCVwIGxrZXkgMHgleFxuIiwKIAkJX19mdW5jX18sIHRyYW5zZmVydHlwZXNbd3R5cGVdLCBoZHJsZW4sIHJwY2xlbiwgcGFkbGVuLAogCQloZWFkZXJwLCBiYXNlLCByZXEtPnJsX2lvdi5sa2V5KTsKIApAQCAtNTk0LDcgKzU5OCw3IEBACiAgKiBTY2F0dGVyIGlubGluZSByZWNlaXZlZCBkYXRhIGJhY2sgaW50byBwcm92aWRlZCBpb3Yncy4KICAqLwogc3RhdGljIHZvaWQKLXJwY3JkbWFfaW5saW5lX2ZpeHVwKHN0cnVjdCBycGNfcnFzdCAqcnFzdCwgY2hhciAqc3JjcCwgaW50IGNvcHlfbGVuKQorcnBjcmRtYV9pbmxpbmVfZml4dXAoc3RydWN0IHJwY19ycXN0ICpycXN0LCBjaGFyICpzcmNwLCBpbnQgY29weV9sZW4sIGludCBwYWQpCiB7CiAJaW50IGksIG5wYWdlcywgY3VybGVuLCBvbGVuOwogCWNoYXIgKmRlc3RwOwpAQCAtNjYwLDYgKzY2NCwxMyBAQAogCX0gZWxzZQogCQlycXN0LT5ycV9yY3ZfYnVmLnRhaWxbMF0uaW92X2xlbiA9IDA7CiAKKwlpZiAocGFkKSB7CisJCS8qIGltcGxpY2l0IHBhZGRpbmcgb24gdGVybWluYWwgY2h1bmsgKi8KKwkJdW5zaWduZWQgY2hhciAqcCA9IHJxc3QtPnJxX3Jjdl9idWYudGFpbFswXS5pb3ZfYmFzZTsKKwkJd2hpbGUgKHBhZC0tKQorCQkJcFtycXN0LT5ycV9yY3ZfYnVmLnRhaWxbMF0uaW92X2xlbisrXSA9IDA7CisJfQorCiAJaWYgKGNvcHlfbGVuKQogCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiAlZCBieXRlcyBpbiIKIAkJCSIgJWQgZXh0cmEgc2VnbWVudHMgKCVkIGxvc3QpXG4iLApAQCAtNjgxLDEyICs2OTIsMTQgQEAKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSBlcC0+cmVwX3hwcnQ7CiAKIAlzcGluX2xvY2tfYmgoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKKwlpZiAoKyt4cHJ0LT5jb25uZWN0X2Nvb2tpZSA9PSAwKQkvKiBtYWludGFpbiBhIHJlc2VydmVkIHZhbHVlICovCisJCSsreHBydC0+Y29ubmVjdF9jb29raWU7CiAJaWYgKGVwLT5yZXBfY29ubmVjdGVkID4gMCkgewogCQlpZiAoIXhwcnRfdGVzdF9hbmRfc2V0X2Nvbm5lY3RlZCh4cHJ0KSkKIAkJCXhwcnRfd2FrZV9wZW5kaW5nX3Rhc2tzKHhwcnQsIDApOwogCX0gZWxzZSB7CiAJCWlmICh4cHJ0X3Rlc3RfYW5kX2NsZWFyX2Nvbm5lY3RlZCh4cHJ0KSkKLQkJCXhwcnRfd2FrZV9wZW5kaW5nX3Rhc2tzKHhwcnQsIGVwLT5yZXBfY29ubmVjdGVkKTsKKwkJCXhwcnRfd2FrZV9wZW5kaW5nX3Rhc2tzKHhwcnQsIC1FTk9UQ09OTik7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZ4cHJ0LT50cmFuc3BvcnRfbG9jayk7CiB9CkBAIC03NjksNyArNzgyLDcgQEAKIAkvKiBjaGVjayBmb3IgZXhwZWN0ZWQgbWVzc2FnZSB0eXBlcyAqLwogCS8qIFRoZSBvcmRlciBvZiBzb21lIG9mIHRoZXNlIHRlc3RzIGlzIGltcG9ydGFudC4gKi8KIAlzd2l0Y2ggKGhlYWRlcnAtPnJtX3R5cGUpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbmwoUkRNQV9NU0cpOgorCWNhc2UgaHRvbmwoUkRNQV9NU0cpOgogCQkvKiBuZXZlciBleHBlY3QgcmVhZCBjaHVua3MgKi8KIAkJLyogbmV2ZXIgZXhwZWN0IHJlcGx5IGNodW5rcyAodHdvIHdheXMgdG8gY2hlY2spICovCiAJCS8qIG5ldmVyIGV4cGVjdCB3cml0ZSBjaHVua3Mgd2l0aG91dCBoYXZpbmcgb2ZmZXJlZCBSRE1BICovCkBAIC03OTIsMTcgKzgwNSwyMyBAQAogCQkJICAgICgodW5zaWduZWQgY2hhciAqKWlwdHIgLSAodW5zaWduZWQgY2hhciAqKWhlYWRlcnApOwogCQkJc3RhdHVzID0gcmVwLT5ycl9sZW4gKyByZG1hbGVuOwogCQkJcl94cHJ0LT5yeF9zdGF0cy50b3RhbF9yZG1hX3JlcGx5ICs9IHJkbWFsZW47CisJCQkvKiBzcGVjaWFsIGNhc2UgLSBsYXN0IGNodW5rIG1heSBvbWl0IHBhZGRpbmcgKi8KKwkJCWlmIChyZG1hbGVuICY9IDMpIHsKKwkJCQlyZG1hbGVuID0gNCAtIHJkbWFsZW47CisJCQkJc3RhdHVzICs9IHJkbWFsZW47CisJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBlbHNlIG9yZGluYXJ5IGlubGluZSAqLworCQkJcmRtYWxlbiA9IDA7CiAJCQlpcHRyID0gKF9fYmUzMiAqKSgodW5zaWduZWQgY2hhciAqKWhlYWRlcnAgKyAyOCk7CiAJCQlyZXAtPnJyX2xlbiAtPSAyODsgLypzaXplb2YgKmhlYWRlcnA7Ki8KIAkJCXN0YXR1cyA9IHJlcC0+cnJfbGVuOwogCQl9CiAJCS8qIEZpeCB1cCB0aGUgcnBjIHJlc3VsdHMgZm9yIHVwcGVyIGxheWVyICovCi0JCXJwY3JkbWFfaW5saW5lX2ZpeHVwKHJxc3QsIChjaGFyICopaXB0ciwgcmVwLT5ycl9sZW4pOworCQlycGNyZG1hX2lubGluZV9maXh1cChycXN0LCAoY2hhciAqKWlwdHIsIHJlcC0+cnJfbGVuLCByZG1hbGVuKTsKIAkJYnJlYWs7CiAKLQljYXNlIF9fY29uc3RhbnRfaHRvbmwoUkRNQV9OT01TRyk6CisJY2FzZSBodG9ubChSRE1BX05PTVNHKToKIAkJLyogbmV2ZXIgZXhwZWN0IHJlYWQgb3Igd3JpdGUgY2h1bmtzLCBhbHdheXMgcmVwbHkgY2h1bmtzICovCiAJCWlmIChoZWFkZXJwLT5ybV9ib2R5LnJtX2NodW5rc1swXSAhPSB4ZHJfemVybyB8fAogCQkgICAgaGVhZGVycC0+cm1fYm9keS5ybV9jaHVua3NbMV0gIT0geGRyX3plcm8gfHwKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfcmVjdmZyb20uYyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfcmVjdmZyb20uYwppbmRleCA3NGRlMzFhLi5hNDc1NjU3IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3JlY3Zmcm9tLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV9yZWN2ZnJvbS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKICAqCiAgKiBBc3N1bXB0aW9uczoKICAqIC0gY2h1bmtbMF0tPnBvc2l0aW9uIHBvaW50cyB0byBwYWdlc1swXSBhdCBhbiBvZmZzZXQgb2YgMAotICogLSBwYWdlc1tdIGlzIG5vdCBwaHlzaWNhbGx5IG9yIHZpcnR1YWxseSBjb250aWdvdXMgYW5kIGNvbnNpc3RzIG9mCisgKiAtIHBhZ2VzW10gaXMgbm90IHBoeXNpY2FsbHkgb3IgdmlydHVhbGx5IGNvbnRpZ3VvdXMgYW5kIGNvbnNpc3RzIG9mCiAgKiAgIFBBR0VfU0laRSBlbGVtZW50cy4KICAqCiAgKiBPdXRwdXQ6CkBAIC0xMjUsNyArMTI1LDcgQEAKICAqICAgY2h1bmsgaW4gdGhlIHJlYWQgbGlzdAogICoKICAqLwotc3RhdGljIGludCByZG1hX3JjbF90b19zZ2Uoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKK3N0YXRpYyBpbnQgbWFwX3JlYWRfY2h1bmtzKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsCiAJCQkgICBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQkJICAgc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmhlYWQsCiAJCQkgICBzdHJ1Y3QgcnBjcmRtYV9tc2cgKnJtc2dwLApAQCAtMjExLDI2ICsyMTEsMTI4IEBACiAJcmV0dXJuIHNnZV9ubzsKIH0KIAotc3RhdGljIHZvaWQgcmRtYV9zZXRfY3R4dF9zZ2Uoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKLQkJCSAgICAgIHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICpjdHh0LAotCQkJICAgICAgc3RydWN0IGt2ZWMgKnZlYywKLQkJCSAgICAgIHU2NCAqc2dsX29mZnNldCwKLQkJCSAgICAgIGludCBjb3VudCkKKy8qIE1hcCBhIHJlYWQtY2h1bmstbGlzdCB0byBhbiBYRFIgYW5kIGZhc3QgcmVnaXN0ZXIgdGhlIHBhZ2UtbGlzdC4KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqIC0gY2h1bmtbMF0JcG9zaXRpb24gcG9pbnRzIHRvIHBhZ2VzWzBdIGF0IGFuIG9mZnNldCBvZiAwCisgKiAtIHBhZ2VzW10Jd2lsbCBiZSBtYWRlIHBoeXNpY2FsbHkgY29udGlndW91cyBieSBjcmVhdGluZyBhIG9uZS1vZmYgbWVtb3J5CisgKgkJcmVnaW9uIHVzaW5nIHRoZSBmYXN0cmVnIHZlcmIuCisgKiAtIGJ5dGVfY291bnQgaXMgIyBvZiBieXRlcyBpbiByZWFkLWNodW5rLWxpc3QKKyAqIC0gY2hfY291bnQJaXMgIyBvZiBjaHVua3MgaW4gcmVhZC1jaHVuay1saXN0CisgKgorICogT3V0cHV0OgorICogLSBzZ2UgYXJyYXkgcG9pbnRpbmcgaW50byBwYWdlc1tdIGFycmF5LgorICogLSBjaHVua19zZ2UgYXJyYXkgc3BlY2lmeWluZyBzZ2UgaW5kZXggYW5kIGNvdW50IGZvciBlYWNoCisgKiAgIGNodW5rIGluIHRoZSByZWFkIGxpc3QKKyAqLworc3RhdGljIGludCBmYXN0X3JlZ19yZWFkX2NodW5rcyhzdHJ1Y3Qgc3ZjeHBydF9yZG1hICp4cHJ0LAorCQkJCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmhlYWQsCisJCQkJc3RydWN0IHJwY3JkbWFfbXNnICpybXNncCwKKwkJCQlzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCAqcnBsX21hcCwKKwkJCQlzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCAqY2hsX21hcCwKKwkJCQlpbnQgY2hfY291bnQsCisJCQkJaW50IGJ5dGVfY291bnQpCit7CisJaW50IHBhZ2Vfbm87CisJaW50IGNoX25vOworCXUzMiBvZmZzZXQ7CisJc3RydWN0IHJwY3JkbWFfcmVhZF9jaHVuayAqY2g7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXI7CisJaW50IHJldCA9IDA7CisKKwlmcm1yID0gc3ZjX3JkbWFfZ2V0X2ZybXIoeHBydCk7CisJaWYgKElTX0VSUihmcm1yKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZWFkLT5mcm1yID0gZnJtcjsKKwloZWFkLT5hcmcuaGVhZFswXSA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXTsKKwloZWFkLT5hcmcudGFpbFswXSA9IHJxc3RwLT5ycV9hcmcudGFpbFswXTsKKwloZWFkLT5hcmcucGFnZXMgPSAmaGVhZC0+cGFnZXNbaGVhZC0+Y291bnRdOworCWhlYWQtPmhkcl9jb3VudCA9IGhlYWQtPmNvdW50OyAvKiBzYXZlIGNvdW50IG9mIGhkciBwYWdlcyAqLworCWhlYWQtPmFyZy5wYWdlX2Jhc2UgPSAwOworCWhlYWQtPmFyZy5wYWdlX2xlbiA9IGJ5dGVfY291bnQ7CisJaGVhZC0+YXJnLmxlbiA9IHJxc3RwLT5ycV9hcmcubGVuICsgYnl0ZV9jb3VudDsKKwloZWFkLT5hcmcuYnVmbGVuID0gcnFzdHAtPnJxX2FyZy5idWZsZW4gKyBieXRlX2NvdW50OworCisJLyogRmFzdCByZWdpc3RlciB0aGUgcGFnZSBsaXN0ICovCisJZnJtci0+a3ZhID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9hcmcucGFnZXNbMF0pOworCWZybXItPmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwlmcm1yLT5hY2Nlc3NfZmxhZ3MgPSAoSUJfQUNDRVNTX0xPQ0FMX1dSSVRFfElCX0FDQ0VTU19SRU1PVEVfV1JJVEUpOworCWZybXItPm1hcF9sZW4gPSBieXRlX2NvdW50OworCWZybXItPnBhZ2VfbGlzdF9sZW4gPSBQQUdFX0FMSUdOKGJ5dGVfY291bnQpID4+IFBBR0VfU0hJRlQ7CisJZm9yIChwYWdlX25vID0gMDsgcGFnZV9ubyA8IGZybXItPnBhZ2VfbGlzdF9sZW47IHBhZ2Vfbm8rKykgeworCQlmcm1yLT5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtwYWdlX25vXSA9CisJCQlpYl9kbWFfbWFwX3NpbmdsZSh4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLAorCQkJCQkgIHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfYXJnLnBhZ2VzW3BhZ2Vfbm9dKSwKKwkJCQkJICBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJIGZybXItPnBhZ2VfbGlzdC0+cGFnZV9saXN0W3BhZ2Vfbm9dKSkKKwkJCWdvdG8gZmF0YWxfZXJyOworCQlhdG9taWNfaW5jKCZ4cHJ0LT5zY19kbWFfdXNlZCk7CisJCWhlYWQtPmFyZy5wYWdlc1twYWdlX25vXSA9IHJxc3RwLT5ycV9hcmcucGFnZXNbcGFnZV9ub107CisJfQorCWhlYWQtPmNvdW50ICs9IHBhZ2Vfbm87CisKKwkvKiBycV9yZXNwYWdlcyBwb2ludHMgb25lIHBhc3QgYXJnIHBhZ2VzICovCisJcnFzdHAtPnJxX3Jlc3BhZ2VzID0gJnJxc3RwLT5ycV9hcmcucGFnZXNbcGFnZV9ub107CisKKwkvKiBDcmVhdGUgdGhlIHJlcGx5IGFuZCBjaHVuayBtYXBzICovCisJb2Zmc2V0ID0gMDsKKwljaCA9IChzdHJ1Y3QgcnBjcmRtYV9yZWFkX2NodW5rICopJnJtc2dwLT5ybV9ib2R5LnJtX2NodW5rc1swXTsKKwlmb3IgKGNoX25vID0gMDsgY2hfbm8gPCBjaF9jb3VudDsgY2hfbm8rKykgeworCQlycGxfbWFwLT5zZ2VbY2hfbm9dLmlvdl9iYXNlID0gZnJtci0+a3ZhICsgb2Zmc2V0OworCQlycGxfbWFwLT5zZ2VbY2hfbm9dLmlvdl9sZW4gPSBjaC0+cmNfdGFyZ2V0LnJzX2xlbmd0aDsKKwkJY2hsX21hcC0+Y2hbY2hfbm9dLmNvdW50ID0gMTsKKwkJY2hsX21hcC0+Y2hbY2hfbm9dLnN0YXJ0ID0gY2hfbm87CisJCW9mZnNldCArPSBjaC0+cmNfdGFyZ2V0LnJzX2xlbmd0aDsKKwkJY2grKzsKKwl9CisKKwlyZXQgPSBzdmNfcmRtYV9mYXN0cmVnKHhwcnQsIGZybXIpOworCWlmIChyZXQpCisJCWdvdG8gZmF0YWxfZXJyOworCisJcmV0dXJuIGNoX25vOworCisgZmF0YWxfZXJyOgorCXByaW50aygic3ZjcmRtYTogZXJyb3IgZmFzdCByZWdpc3RlcmluZyB4ZHIgZm9yIHhwcnQgJXAiLCB4cHJ0KTsKKwlzdmNfcmRtYV9wdXRfZnJtcih4cHJ0LCBmcm1yKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCByZG1hX3NldF9jdHh0X3NnZShzdHJ1Y3Qgc3ZjeHBydF9yZG1hICp4cHJ0LAorCQkJICAgICBzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqY3R4dCwKKwkJCSAgICAgc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXIsCisJCQkgICAgIHN0cnVjdCBrdmVjICp2ZWMsCisJCQkgICAgIHU2NCAqc2dsX29mZnNldCwKKwkJCSAgICAgaW50IGNvdW50KQogewogCWludCBpOwogCiAJY3R4dC0+Y291bnQgPSBjb3VudDsKIAljdHh0LT5kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJYXRvbWljX2luYygmeHBydC0+c2NfZG1hX3VzZWQpOwotCQljdHh0LT5zZ2VbaV0uYWRkciA9Ci0JCQlpYl9kbWFfbWFwX3NpbmdsZSh4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLAotCQkJCQkgIHZlY1tpXS5pb3ZfYmFzZSwgdmVjW2ldLmlvdl9sZW4sCi0JCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKKwkJY3R4dC0+c2dlW2ldLmxlbmd0aCA9IDA7IC8qIGluIGNhc2UgbWFwIGZhaWxzICovCisJCWlmICghZnJtcikgeworCQkJY3R4dC0+c2dlW2ldLmFkZHIgPQorCQkJCWliX2RtYV9tYXBfc2luZ2xlKHhwcnQtPnNjX2NtX2lkLT5kZXZpY2UsCisJCQkJCQkgIHZlY1tpXS5pb3ZfYmFzZSwKKwkJCQkJCSAgdmVjW2ldLmlvdl9sZW4sCisJCQkJCQkgIERNQV9GUk9NX0RFVklDRSk7CisJCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJCSBjdHh0LT5zZ2VbaV0uYWRkcikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljdHh0LT5zZ2VbaV0ubGtleSA9IHhwcnQtPnNjX2RtYV9sa2V5OworCQkJYXRvbWljX2luYygmeHBydC0+c2NfZG1hX3VzZWQpOworCQl9IGVsc2UgeworCQkJY3R4dC0+c2dlW2ldLmFkZHIgPSAodW5zaWduZWQgbG9uZyl2ZWNbaV0uaW92X2Jhc2U7CisJCQljdHh0LT5zZ2VbaV0ubGtleSA9IGZybXItPm1yLT5sa2V5OworCQl9CiAJCWN0eHQtPnNnZVtpXS5sZW5ndGggPSB2ZWNbaV0uaW92X2xlbjsKLQkJY3R4dC0+c2dlW2ldLmxrZXkgPSB4cHJ0LT5zY19waHlzX21yLT5sa2V5OwogCQkqc2dsX29mZnNldCA9ICpzZ2xfb2Zmc2V0ICsgdmVjW2ldLmlvdl9sZW47CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJkbWFfcmVhZF9tYXhfc2dlKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsIGludCBzZ2VfY291bnQpCkBAIC0yNzgsNiArMzgwLDcgQEAKIAkJCSBzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqaGRyX2N0eHQpCiB7CiAJc3RydWN0IGliX3NlbmRfd3IgcmVhZF93cjsKKwlzdHJ1Y3QgaWJfc2VuZF93ciBpbnZfd3I7CiAJaW50IGVyciA9IDA7CiAJaW50IGNoX25vOwogCWludCBjaF9jb3VudDsKQEAgLTMwMSw5ICs0MDQsMjAgQEAKIAlzdmNfcmRtYV9yY2xfY2h1bmtfY291bnRzKGNoLCAmY2hfY291bnQsICZieXRlX2NvdW50KTsKIAlpZiAoY2hfY291bnQgPiBSUENTVkNfTUFYUEFHRVMpCiAJCXJldHVybiAtRUlOVkFMOwotCXNnZV9jb3VudCA9IHJkbWFfcmNsX3RvX3NnZSh4cHJ0LCBycXN0cCwgaGRyX2N0eHQsIHJtc2dwLAotCQkJCSAgICBycGxfbWFwLCBjaGxfbWFwLAotCQkJCSAgICBjaF9jb3VudCwgYnl0ZV9jb3VudCk7CisKKwlpZiAoIXhwcnQtPnNjX2ZybXJfcGdfbGlzdF9sZW4pCisJCXNnZV9jb3VudCA9IG1hcF9yZWFkX2NodW5rcyh4cHJ0LCBycXN0cCwgaGRyX2N0eHQsIHJtc2dwLAorCQkJCQkgICAgcnBsX21hcCwgY2hsX21hcCwgY2hfY291bnQsCisJCQkJCSAgICBieXRlX2NvdW50KTsKKwllbHNlCisJCXNnZV9jb3VudCA9IGZhc3RfcmVnX3JlYWRfY2h1bmtzKHhwcnQsIHJxc3RwLCBoZHJfY3R4dCwgcm1zZ3AsCisJCQkJCQkgcnBsX21hcCwgY2hsX21hcCwgY2hfY291bnQsCisJCQkJCQkgYnl0ZV9jb3VudCk7CisJaWYgKHNnZV9jb3VudCA8IDApIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCiAJc2dsX29mZnNldCA9IDA7CiAJY2hfbm8gPSAwOwogCkBAIC0zMTIsMTMgKzQyNiwxNiBAQAogbmV4dF9zZ2U6CiAJCWN0eHQgPSBzdmNfcmRtYV9nZXRfY29udGV4dCh4cHJ0KTsKIAkJY3R4dC0+ZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworCQljdHh0LT5mcm1yID0gaGRyX2N0eHQtPmZybXI7CisJCWN0eHQtPnJlYWRfaGRyID0gTlVMTDsKIAkJY2xlYXJfYml0KFJETUFDVFhUX0ZfTEFTVF9DVFhULCAmY3R4dC0+ZmxhZ3MpOworCQljbGVhcl9iaXQoUkRNQUNUWFRfRl9GQVNUX1VOUkVHLCAmY3R4dC0+ZmxhZ3MpOwogCiAJCS8qIFByZXBhcmUgUkVBRCBXUiAqLwogCQltZW1zZXQoJnJlYWRfd3IsIDAsIHNpemVvZiByZWFkX3dyKTsKLQkJY3R4dC0+d3Jfb3AgPSBJQl9XUl9SRE1BX1JFQUQ7CiAJCXJlYWRfd3Iud3JfaWQgPSAodW5zaWduZWQgbG9uZyljdHh0OwogCQlyZWFkX3dyLm9wY29kZSA9IElCX1dSX1JETUFfUkVBRDsKKwkJY3R4dC0+d3Jfb3AgPSByZWFkX3dyLm9wY29kZTsKIAkJcmVhZF93ci5zZW5kX2ZsYWdzID0gSUJfU0VORF9TSUdOQUxFRDsKIAkJcmVhZF93ci53ci5yZG1hLnJrZXkgPSBjaC0+cmNfdGFyZ2V0LnJzX2hhbmRsZTsKIAkJcmVhZF93ci53ci5yZG1hLnJlbW90ZV9hZGRyID0KQEAgLTMyNywxMCArNDQ0LDE1IEBACiAJCXJlYWRfd3Iuc2dfbGlzdCA9IGN0eHQtPnNnZTsKIAkJcmVhZF93ci5udW1fc2dlID0KIAkJCXJkbWFfcmVhZF9tYXhfc2dlKHhwcnQsIGNobF9tYXAtPmNoW2NoX25vXS5jb3VudCk7Ci0JCXJkbWFfc2V0X2N0eHRfc2dlKHhwcnQsIGN0eHQsCi0JCQkJICAmcnBsX21hcC0+c2dlW2NobF9tYXAtPmNoW2NoX25vXS5zdGFydF0sCi0JCQkJICAmc2dsX29mZnNldCwKLQkJCQkgIHJlYWRfd3IubnVtX3NnZSk7CisJCWVyciA9IHJkbWFfc2V0X2N0eHRfc2dlKHhwcnQsIGN0eHQsIGhkcl9jdHh0LT5mcm1yLAorCQkJCQkmcnBsX21hcC0+c2dlW2NobF9tYXAtPmNoW2NoX25vXS5zdGFydF0sCisJCQkJCSZzZ2xfb2Zmc2V0LAorCQkJCQlyZWFkX3dyLm51bV9zZ2UpOworCQlpZiAoZXJyKSB7CisJCQlzdmNfcmRtYV91bm1hcF9kbWEoY3R4dCk7CisJCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWlmICgoKGNoKzEpLT5yY19kaXNjcmltID09IDApICYmCiAJCSAgICAocmVhZF93ci5udW1fc2dlID09IGNobF9tYXAtPmNoW2NoX25vXS5jb3VudCkpIHsKIAkJCS8qCkBAIC0zMzksNiArNDYxLDI5IEBACiAJCQkgKiB0aGUgY2xpZW50IGFuZCB0aGUgUlBDIG5lZWRzIHRvIGJlIGVucXVldWVkLgogCQkJICovCiAJCQlzZXRfYml0KFJETUFDVFhUX0ZfTEFTVF9DVFhULCAmY3R4dC0+ZmxhZ3MpOworCQkJaWYgKGhkcl9jdHh0LT5mcm1yKSB7CisJCQkJc2V0X2JpdChSRE1BQ1RYVF9GX0ZBU1RfVU5SRUcsICZjdHh0LT5mbGFncyk7CisJCQkJLyoKKwkJCQkgKiBJbnZhbGlkYXRlIHRoZSBsb2NhbCBNUiB1c2VkIHRvIG1hcCB0aGUgZGF0YQorCQkJCSAqIHNpbmsuCisJCQkJICovCisJCQkJaWYgKHhwcnQtPnNjX2Rldl9jYXBzICYKKwkJCQkgICAgU1ZDUkRNQV9ERVZDQVBfUkVBRF9XX0lOVikgeworCQkJCQlyZWFkX3dyLm9wY29kZSA9CisJCQkJCQlJQl9XUl9SRE1BX1JFQURfV0lUSF9JTlY7CisJCQkJCWN0eHQtPndyX29wID0gcmVhZF93ci5vcGNvZGU7CisJCQkJCXJlYWRfd3IuZXguaW52YWxpZGF0ZV9ya2V5ID0KKwkJCQkJCWN0eHQtPmZybXItPm1yLT5sa2V5OworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFByZXBhcmUgSU5WQUxJREFURSBXUiAqLworCQkJCQltZW1zZXQoJmludl93ciwgMCwgc2l6ZW9mIGludl93cik7CisJCQkJCWludl93ci5vcGNvZGUgPSBJQl9XUl9MT0NBTF9JTlY7CisJCQkJCWludl93ci5zZW5kX2ZsYWdzID0gSUJfU0VORF9TSUdOQUxFRDsKKwkJCQkJaW52X3dyLmV4LmludmFsaWRhdGVfcmtleSA9CisJCQkJCQloZHJfY3R4dC0+ZnJtci0+bXItPmxrZXk7CisJCQkJCXJlYWRfd3IubmV4dCA9ICZpbnZfd3I7CisJCQkJfQorCQkJfQogCQkJY3R4dC0+cmVhZF9oZHIgPSBoZHJfY3R4dDsKIAkJfQogCQkvKiBQb3N0IHRoZSByZWFkICovCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3NlbmR0by5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV9zZW5kdG8uYwppbmRleCA4NGQzMjgzLi45YTdhOGU3IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3NlbmR0by5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfc2VuZHRvLmMKQEAgLTY5LDkgKzY5LDEyNyBAQAogICogYXJyYXkgaXMgb25seSBjb25jZXJuZWQgd2l0aCB0aGUgcmVwbHkgd2UgYXJlIGFzc3VyZWQgdGhhdCB3ZSBoYXZlCiAgKiBvbiBleHRyYSBwYWdlIGZvciB0aGUgUlBDUk1EQSBoZWFkZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHhkcl90b19zZ2Uoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKLQkJICAgICAgIHN0cnVjdCB4ZHJfYnVmICp4ZHIsCi0JCSAgICAgICBzdHJ1Y3Qgc3ZjX3JkbWFfcmVxX21hcCAqdmVjKQoraW50IGZhc3RfcmVnX3hkcihzdHJ1Y3Qgc3ZjeHBydF9yZG1hICp4cHJ0LAorCQkgc3RydWN0IHhkcl9idWYgKnhkciwKKwkJIHN0cnVjdCBzdmNfcmRtYV9yZXFfbWFwICp2ZWMpCit7CisJaW50IHNnZV9ubzsKKwl1MzIgc2dlX2J5dGVzOworCXUzMiBwYWdlX2J5dGVzOworCXUzMiBwYWdlX29mZjsKKwlpbnQgcGFnZV9ubyA9IDA7CisJdTggKmZydmE7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXI7CisKKwlmcm1yID0gc3ZjX3JkbWFfZ2V0X2ZybXIoeHBydCk7CisJaWYgKElTX0VSUihmcm1yKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJdmVjLT5mcm1yID0gZnJtcjsKKworCS8qIFNraXAgdGhlIFJQQ1JETUEgaGVhZGVyICovCisJc2dlX25vID0gMTsKKworCS8qIE1hcCB0aGUgaGVhZC4gKi8KKwlmcnZhID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHhkci0+aGVhZFswXS5pb3ZfYmFzZSkgJiBQQUdFX01BU0spOworCXZlYy0+c2dlW3NnZV9ub10uaW92X2Jhc2UgPSB4ZHItPmhlYWRbMF0uaW92X2Jhc2U7CisJdmVjLT5zZ2Vbc2dlX25vXS5pb3ZfbGVuID0geGRyLT5oZWFkWzBdLmlvdl9sZW47CisJdmVjLT5jb3VudCA9IDI7CisJc2dlX25vKys7CisKKwkvKiBCdWlsZCB0aGUgRlJNUiAqLworCWZybXItPmt2YSA9IGZydmE7CisJZnJtci0+ZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwlmcm1yLT5hY2Nlc3NfZmxhZ3MgPSAwOworCWZybXItPm1hcF9sZW4gPSBQQUdFX1NJWkU7CisJZnJtci0+cGFnZV9saXN0X2xlbiA9IDE7CisJZnJtci0+cGFnZV9saXN0LT5wYWdlX2xpc3RbcGFnZV9ub10gPQorCQlpYl9kbWFfbWFwX3NpbmdsZSh4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLAorCQkJCSAgKHZvaWQgKil4ZHItPmhlYWRbMF0uaW92X2Jhc2UsCisJCQkJICBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCWlmIChpYl9kbWFfbWFwcGluZ19lcnJvcih4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLAorCQkJCSBmcm1yLT5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtwYWdlX25vXSkpCisJCWdvdG8gZmF0YWxfZXJyOworCWF0b21pY19pbmMoJnhwcnQtPnNjX2RtYV91c2VkKTsKKworCXBhZ2Vfb2ZmID0geGRyLT5wYWdlX2Jhc2U7CisJcGFnZV9ieXRlcyA9IHhkci0+cGFnZV9sZW4gKyBwYWdlX29mZjsKKwlpZiAoIXBhZ2VfYnl0ZXMpCisJCWdvdG8gZW5jb2RlX3RhaWw7CisKKwkvKiBNYXAgdGhlIHBhZ2VzICovCisJdmVjLT5zZ2Vbc2dlX25vXS5pb3ZfYmFzZSA9IGZydmEgKyBmcm1yLT5tYXBfbGVuICsgcGFnZV9vZmY7CisJdmVjLT5zZ2Vbc2dlX25vXS5pb3ZfbGVuID0gcGFnZV9ieXRlczsKKwlzZ2Vfbm8rKzsKKwl3aGlsZSAocGFnZV9ieXRlcykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlwYWdlID0geGRyLT5wYWdlc1twYWdlX25vKytdOworCQlzZ2VfYnl0ZXMgPSBtaW5fdCh1MzIsIHBhZ2VfYnl0ZXMsIChQQUdFX1NJWkUgLSBwYWdlX29mZikpOworCQlwYWdlX2J5dGVzIC09IHNnZV9ieXRlczsKKworCQlmcm1yLT5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtwYWdlX25vXSA9CisJCQlpYl9kbWFfbWFwX3BhZ2UoeHBydC0+c2NfY21faWQtPmRldmljZSwgcGFnZSwgMCwKKwkJCQkJICBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJIGZybXItPnBhZ2VfbGlzdC0+cGFnZV9saXN0W3BhZ2Vfbm9dKSkKKwkJCWdvdG8gZmF0YWxfZXJyOworCisJCWF0b21pY19pbmMoJnhwcnQtPnNjX2RtYV91c2VkKTsKKwkJcGFnZV9vZmYgPSAwOyAvKiByZXNldCBmb3IgbmV4dCB0aW1lIHRocm91Z2ggbG9vcCAqLworCQlmcm1yLT5tYXBfbGVuICs9IFBBR0VfU0laRTsKKwkJZnJtci0+cGFnZV9saXN0X2xlbisrOworCX0KKwl2ZWMtPmNvdW50Kys7CisKKyBlbmNvZGVfdGFpbDoKKwkvKiBNYXAgdGFpbCAqLworCWlmICgwID09IHhkci0+dGFpbFswXS5pb3ZfbGVuKQorCQlnb3RvIGRvbmU7CisKKwl2ZWMtPmNvdW50Kys7CisJdmVjLT5zZ2Vbc2dlX25vXS5pb3ZfbGVuID0geGRyLT50YWlsWzBdLmlvdl9sZW47CisKKwlpZiAoKCh1bnNpZ25lZCBsb25nKXhkci0+dGFpbFswXS5pb3ZfYmFzZSAmIFBBR0VfTUFTSykgPT0KKwkgICAgKCh1bnNpZ25lZCBsb25nKXhkci0+aGVhZFswXS5pb3ZfYmFzZSAmIFBBR0VfTUFTSykpIHsKKwkJLyoKKwkJICogSWYgaGVhZCBhbmQgdGFpbCB1c2UgdGhlIHNhbWUgcGFnZSwgd2UgZG9uJ3QgbmVlZAorCQkgKiB0byBtYXAgaXQgYWdhaW4uCisJCSAqLworCQl2ZWMtPnNnZVtzZ2Vfbm9dLmlvdl9iYXNlID0geGRyLT50YWlsWzBdLmlvdl9iYXNlOworCX0gZWxzZSB7CisJCXZvaWQgKnZhOworCisJCS8qIE1hcCBhbm90aGVyIHBhZ2UgZm9yIHRoZSB0YWlsICovCisJCXBhZ2Vfb2ZmID0gKHVuc2lnbmVkIGxvbmcpeGRyLT50YWlsWzBdLmlvdl9iYXNlICYgflBBR0VfTUFTSzsKKwkJdmEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl4ZHItPnRhaWxbMF0uaW92X2Jhc2UgJiBQQUdFX01BU0spOworCQl2ZWMtPnNnZVtzZ2Vfbm9dLmlvdl9iYXNlID0gZnJ2YSArIGZybXItPm1hcF9sZW4gKyBwYWdlX29mZjsKKworCQlmcm1yLT5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtwYWdlX25vXSA9CisJCQlpYl9kbWFfbWFwX3NpbmdsZSh4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLCB2YSwgUEFHRV9TSVpFLAorCQkJCQkgIERNQV9UT19ERVZJQ0UpOworCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJIGZybXItPnBhZ2VfbGlzdC0+cGFnZV9saXN0W3BhZ2Vfbm9dKSkKKwkJCWdvdG8gZmF0YWxfZXJyOworCQlhdG9taWNfaW5jKCZ4cHJ0LT5zY19kbWFfdXNlZCk7CisJCWZybXItPm1hcF9sZW4gKz0gUEFHRV9TSVpFOworCQlmcm1yLT5wYWdlX2xpc3RfbGVuKys7CisJfQorCisgZG9uZToKKwlpZiAoc3ZjX3JkbWFfZmFzdHJlZyh4cHJ0LCBmcm1yKSkKKwkJZ290byBmYXRhbF9lcnI7CisKKwlyZXR1cm4gMDsKKworIGZhdGFsX2VycjoKKwlwcmludGsoInN2Y3JkbWE6IEVycm9yIGZhc3QgcmVnaXN0ZXJpbmcgbWVtb3J5IGZvciB4cHJ0ICVwXG4iLCB4cHJ0KTsKKwlzdmNfcmRtYV9wdXRfZnJtcih4cHJ0LCBmcm1yKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBtYXBfeGRyKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsCisJCSAgIHN0cnVjdCB4ZHJfYnVmICp4ZHIsCisJCSAgIHN0cnVjdCBzdmNfcmRtYV9yZXFfbWFwICp2ZWMpCiB7CiAJaW50IHNnZV9tYXggPSAoeGRyLT5sZW4rUEFHRV9TSVpFLTEpIC8gUEFHRV9TSVpFICsgMzsKIAlpbnQgc2dlX25vOwpAQCAtODMsNiArMjAxLDkgQEAKIAlCVUdfT04oeGRyLT5sZW4gIT0KIAkgICAgICAgKHhkci0+aGVhZFswXS5pb3ZfbGVuICsgeGRyLT5wYWdlX2xlbiArIHhkci0+dGFpbFswXS5pb3ZfbGVuKSk7CiAKKwlpZiAoeHBydC0+c2NfZnJtcl9wZ19saXN0X2xlbikKKwkJcmV0dXJuIGZhc3RfcmVnX3hkcih4cHJ0LCB4ZHIsIHZlYyk7CisKIAkvKiBTa2lwIHRoZSBmaXJzdCBzZ2UsIHRoaXMgaXMgZm9yIHRoZSBSUENSRE1BIGhlYWRlciAqLwogCXNnZV9ubyA9IDE7CiAKQEAgLTExNiw5ICsyMzcsMTIgQEAKIAogCUJVR19PTihzZ2Vfbm8gPiBzZ2VfbWF4KTsKIAl2ZWMtPmNvdW50ID0gc2dlX25vOworCXJldHVybiAwOwogfQogCiAvKiBBc3N1bXB0aW9uczoKKyAqIC0gV2UgYXJlIHVzaW5nIEZSTVIKKyAqICAgICAtIG9yIC0KICAqIC0gVGhlIHNwZWNpZmllZCB3cml0ZV9sZW4gY2FuIGJlIHJlcHJlc2VudGVkIGluIHNjX21heF9zZ2UgKiBQQUdFX1NJWkUKICAqLwogc3RhdGljIGludCBzZW5kX3dyaXRlKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCkBAIC0xNTgsMzAgKzI4MiwzNSBAQAogCXNnZV9ubyA9IDA7CiAKIAkvKiBDb3B5IHRoZSByZW1haW5pbmcgU0dFICovCi0Jd2hpbGUgKGJjICE9IDAgJiYgeGRyX3NnZV9ubyA8IHZlYy0+Y291bnQpIHsKLQkJc2dlW3NnZV9ub10ubGtleSA9IHhwcnQtPnNjX3BoeXNfbXItPmxrZXk7Ci0JCXNnZV9ieXRlcyA9IG1pbigoc2l6ZV90KWJjLAotCQkJCShzaXplX3QpKHZlYy0+c2dlW3hkcl9zZ2Vfbm9dLmlvdl9sZW4tc2dlX29mZikpOworCXdoaWxlIChiYyAhPSAwKSB7CisJCXNnZV9ieXRlcyA9IG1pbl90KHNpemVfdCwKKwkJCSAgYmMsIHZlYy0+c2dlW3hkcl9zZ2Vfbm9dLmlvdl9sZW4tc2dlX29mZik7CiAJCXNnZVtzZ2Vfbm9dLmxlbmd0aCA9IHNnZV9ieXRlczsKLQkJYXRvbWljX2luYygmeHBydC0+c2NfZG1hX3VzZWQpOwotCQlzZ2Vbc2dlX25vXS5hZGRyID0KLQkJCWliX2RtYV9tYXBfc2luZ2xlKHhwcnQtPnNjX2NtX2lkLT5kZXZpY2UsCi0JCQkJCSAgKHZvaWQgKikKLQkJCQkJICB2ZWMtPnNnZVt4ZHJfc2dlX25vXS5pb3ZfYmFzZSArIHNnZV9vZmYsCi0JCQkJCSAgc2dlX2J5dGVzLCBETUFfVE9fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHhwcnQtPnNjX2NtX2lkLT5kZXZpY2UtPmRtYV9kZXZpY2UsCi0JCQkJCXNnZVtzZ2Vfbm9dLmFkZHIpKQotCQkJZ290byBlcnI7CisJCWlmICghdmVjLT5mcm1yKSB7CisJCQlzZ2Vbc2dlX25vXS5hZGRyID0KKwkJCQlpYl9kbWFfbWFwX3NpbmdsZSh4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLAorCQkJCQkJICAodm9pZCAqKQorCQkJCQkJICB2ZWMtPnNnZVt4ZHJfc2dlX25vXS5pb3ZfYmFzZSArIHNnZV9vZmYsCisJCQkJCQkgIHNnZV9ieXRlcywgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJCSBzZ2Vbc2dlX25vXS5hZGRyKSkKKwkJCQlnb3RvIGVycjsKKwkJCWF0b21pY19pbmMoJnhwcnQtPnNjX2RtYV91c2VkKTsKKwkJCXNnZVtzZ2Vfbm9dLmxrZXkgPSB4cHJ0LT5zY19kbWFfbGtleTsKKwkJfSBlbHNlIHsKKwkJCXNnZVtzZ2Vfbm9dLmFkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJCQl2ZWMtPnNnZVt4ZHJfc2dlX25vXS5pb3ZfYmFzZSArIHNnZV9vZmY7CisJCQlzZ2Vbc2dlX25vXS5sa2V5ID0gdmVjLT5mcm1yLT5tci0+bGtleTsKKwkJfQorCQljdHh0LT5jb3VudCsrOworCQljdHh0LT5mcm1yID0gdmVjLT5mcm1yOwogCQlzZ2Vfb2ZmID0gMDsKIAkJc2dlX25vKys7Ci0JCWN0eHQtPmNvdW50Kys7CiAJCXhkcl9zZ2Vfbm8rKzsKKwkJQlVHX09OKHhkcl9zZ2Vfbm8gPiB2ZWMtPmNvdW50KTsKIAkJYmMgLT0gc2dlX2J5dGVzOwogCX0KIAotCUJVR19PTihiYyAhPSAwKTsKLQlCVUdfT04oeGRyX3NnZV9ubyA+IHZlYy0+Y291bnQpOwotCiAJLyogUHJlcGFyZSBXUklURSBXUiAqLwogCW1lbXNldCgmd3JpdGVfd3IsIDAsIHNpemVvZiB3cml0ZV93cik7CiAJY3R4dC0+d3Jfb3AgPSBJQl9XUl9SRE1BX1dSSVRFOwpAQCAtMjI2LDcgKzM1NSwxMCBAQAogCXJlc19hcnkgPSAoc3RydWN0IHJwY3JkbWFfd3JpdGVfYXJyYXkgKikKIAkJJnJkbWFfcmVzcC0+cm1fYm9keS5ybV9jaHVua3NbMV07CiAKLQltYXhfd3JpdGUgPSB4cHJ0LT5zY19tYXhfc2dlICogUEFHRV9TSVpFOworCWlmICh2ZWMtPmZybXIpCisJCW1heF93cml0ZSA9IHZlYy0+ZnJtci0+bWFwX2xlbjsKKwllbHNlCisJCW1heF93cml0ZSA9IHhwcnQtPnNjX21heF9zZ2UgKiBQQUdFX1NJWkU7CiAKIAkvKiBXcml0ZSBjaHVua3Mgc3RhcnQgYXQgdGhlIHBhZ2VsaXN0ICovCiAJZm9yICh4ZHJfb2ZmID0gcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4sIGNodW5rX25vID0gMDsKQEAgLTI5Nyw3ICs0MjksMTAgQEAKIAlyZXNfYXJ5ID0gKHN0cnVjdCBycGNyZG1hX3dyaXRlX2FycmF5ICopCiAJCSZyZG1hX3Jlc3AtPnJtX2JvZHkucm1fY2h1bmtzWzJdOwogCi0JbWF4X3dyaXRlID0geHBydC0+c2NfbWF4X3NnZSAqIFBBR0VfU0laRTsKKwlpZiAodmVjLT5mcm1yKQorCQltYXhfd3JpdGUgPSB2ZWMtPmZybXItPm1hcF9sZW47CisJZWxzZQorCQltYXhfd3JpdGUgPSB4cHJ0LT5zY19tYXhfc2dlICogUEFHRV9TSVpFOwogCiAJLyogeGRyIG9mZnNldCBzdGFydHMgYXQgUlBDIG1lc3NhZ2UgKi8KIAlmb3IgKHhkcl9vZmYgPSAwLCBjaHVua19ubyA9IDA7CkBAIC0zMDcsNyArNDQyLDYgQEAKIAkJY2ggPSAmYXJnX2FyeS0+d2NfYXJyYXlbY2h1bmtfbm9dLndjX3RhcmdldDsKIAkJd3JpdGVfbGVuID0gbWluKHhmZXJfbGVuLCBjaC0+cnNfbGVuZ3RoKTsKIAotCiAJCS8qIFByZXBhcmUgdGhlIHJlcGx5IGNodW5rIGdpdmVuIHRoZSBsZW5ndGggYWN0dWFsbHkKIAkJICogd3JpdHRlbiAqLwogCQlyc19vZmZzZXQgPSBnZXRfdW5hbGlnbmVkKCYoY2gtPnJzX29mZnNldCkpOwpAQCAtMzY2LDYgKzUwMCw3IEBACiAJCSAgICAgIGludCBieXRlX2NvdW50KQogewogCXN0cnVjdCBpYl9zZW5kX3dyIHNlbmRfd3I7CisJc3RydWN0IGliX3NlbmRfd3IgaW52X3dyOwogCWludCBzZ2Vfbm87CiAJaW50IHNnZV9ieXRlczsKIAlpbnQgcGFnZV9ubzsKQEAgLTM4NSwyNyArNTIwLDQ1IEBACiAJLyogUHJlcGFyZSB0aGUgY29udGV4dCAqLwogCWN0eHQtPnBhZ2VzWzBdID0gcGFnZTsKIAljdHh0LT5jb3VudCA9IDE7CisJY3R4dC0+ZnJtciA9IHZlYy0+ZnJtcjsKKwlpZiAodmVjLT5mcm1yKQorCQlzZXRfYml0KFJETUFDVFhUX0ZfRkFTVF9VTlJFRywgJmN0eHQtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChSRE1BQ1RYVF9GX0ZBU1RfVU5SRUcsICZjdHh0LT5mbGFncyk7CiAKIAkvKiBQcmVwYXJlIHRoZSBTR0UgZm9yIHRoZSBSUENSRE1BIEhlYWRlciAqLwotCWF0b21pY19pbmMoJnJkbWEtPnNjX2RtYV91c2VkKTsKIAljdHh0LT5zZ2VbMF0uYWRkciA9CiAJCWliX2RtYV9tYXBfcGFnZShyZG1hLT5zY19jbV9pZC0+ZGV2aWNlLAogCQkJCXBhZ2UsIDAsIFBBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7CisJaWYgKGliX2RtYV9tYXBwaW5nX2Vycm9yKHJkbWEtPnNjX2NtX2lkLT5kZXZpY2UsIGN0eHQtPnNnZVswXS5hZGRyKSkKKwkJZ290byBlcnI7CisJYXRvbWljX2luYygmcmRtYS0+c2NfZG1hX3VzZWQpOworCiAJY3R4dC0+ZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKwogCWN0eHQtPnNnZVswXS5sZW5ndGggPSBzdmNfcmRtYV94ZHJfZ2V0X3JlcGx5X2hkcl9sZW4ocmRtYV9yZXNwKTsKLQljdHh0LT5zZ2VbMF0ubGtleSA9IHJkbWEtPnNjX3BoeXNfbXItPmxrZXk7CisJY3R4dC0+c2dlWzBdLmxrZXkgPSByZG1hLT5zY19kbWFfbGtleTsKIAogCS8qIERldGVybWluZSBob3cgbWFueSBvZiBvdXIgU0dFIGFyZSB0byBiZSB0cmFuc21pdHRlZCAqLwogCWZvciAoc2dlX25vID0gMTsgYnl0ZV9jb3VudCAmJiBzZ2Vfbm8gPCB2ZWMtPmNvdW50OyBzZ2Vfbm8rKykgewogCQlzZ2VfYnl0ZXMgPSBtaW5fdChzaXplX3QsIHZlYy0+c2dlW3NnZV9ub10uaW92X2xlbiwgYnl0ZV9jb3VudCk7CiAJCWJ5dGVfY291bnQgLT0gc2dlX2J5dGVzOwotCQlhdG9taWNfaW5jKCZyZG1hLT5zY19kbWFfdXNlZCk7Ci0JCWN0eHQtPnNnZVtzZ2Vfbm9dLmFkZHIgPQotCQkJaWJfZG1hX21hcF9zaW5nbGUocmRtYS0+c2NfY21faWQtPmRldmljZSwKLQkJCQkJICB2ZWMtPnNnZVtzZ2Vfbm9dLmlvdl9iYXNlLAotCQkJCQkgIHNnZV9ieXRlcywgRE1BX1RPX0RFVklDRSk7CisJCWlmICghdmVjLT5mcm1yKSB7CisJCQljdHh0LT5zZ2Vbc2dlX25vXS5hZGRyID0KKwkJCQlpYl9kbWFfbWFwX3NpbmdsZShyZG1hLT5zY19jbV9pZC0+ZGV2aWNlLAorCQkJCQkJICB2ZWMtPnNnZVtzZ2Vfbm9dLmlvdl9iYXNlLAorCQkJCQkJICBzZ2VfYnl0ZXMsIERNQV9UT19ERVZJQ0UpOworCQkJaWYgKGliX2RtYV9tYXBwaW5nX2Vycm9yKHJkbWEtPnNjX2NtX2lkLT5kZXZpY2UsCisJCQkJCQkgY3R4dC0+c2dlW3NnZV9ub10uYWRkcikpCisJCQkJZ290byBlcnI7CisJCQlhdG9taWNfaW5jKCZyZG1hLT5zY19kbWFfdXNlZCk7CisJCQljdHh0LT5zZ2Vbc2dlX25vXS5sa2V5ID0gcmRtYS0+c2NfZG1hX2xrZXk7CisJCX0gZWxzZSB7CisJCQljdHh0LT5zZ2Vbc2dlX25vXS5hZGRyID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJdmVjLT5zZ2Vbc2dlX25vXS5pb3ZfYmFzZTsKKwkJCWN0eHQtPnNnZVtzZ2Vfbm9dLmxrZXkgPSB2ZWMtPmZybXItPm1yLT5sa2V5OworCQl9CiAJCWN0eHQtPnNnZVtzZ2Vfbm9dLmxlbmd0aCA9IHNnZV9ieXRlczsKLQkJY3R4dC0+c2dlW3NnZV9ub10ubGtleSA9IHJkbWEtPnNjX3BoeXNfbXItPmxrZXk7CiAJfQogCUJVR19PTihieXRlX2NvdW50ICE9IDApOwogCkBAIC00MTcsMTEgKzU3MCwxNiBAQAogCQljdHh0LT5wYWdlc1twYWdlX25vKzFdID0gcnFzdHAtPnJxX3Jlc3BhZ2VzW3BhZ2Vfbm9dOwogCQljdHh0LT5jb3VudCsrOwogCQlycXN0cC0+cnFfcmVzcGFnZXNbcGFnZV9ub10gPSBOVUxMOwotCQkvKiBJZiB0aGVyZSBhcmUgbW9yZSBwYWdlcyB0aGFuIFNHRSwgdGVybWluYXRlIFNHRSBsaXN0ICovCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtb3JlIHBhZ2VzIHRoYW4gU0dFLCB0ZXJtaW5hdGUgU0dFCisJCSAqIGxpc3Qgc28gdGhhdCBzdmNfcmRtYV91bm1hcF9kbWEgZG9lc24ndCBhdHRlbXB0IHRvCisJCSAqIHVubWFwIGdhcmJhZ2UuCisJCSAqLwogCQlpZiAocGFnZV9ubysxID49IHNnZV9ubykKIAkJCWN0eHQtPnNnZVtwYWdlX25vKzFdLmxlbmd0aCA9IDA7CiAJfQogCUJVR19PTihzZ2Vfbm8gPiByZG1hLT5zY19tYXhfc2dlKTsKKwlCVUdfT04oc2dlX25vID4gY3R4dC0+Y291bnQpOwogCW1lbXNldCgmc2VuZF93ciwgMCwgc2l6ZW9mIHNlbmRfd3IpOwogCWN0eHQtPndyX29wID0gSUJfV1JfU0VORDsKIAlzZW5kX3dyLndyX2lkID0gKHVuc2lnbmVkIGxvbmcpY3R4dDsKQEAgLTQyOSwxMiArNTg3LDI2IEBACiAJc2VuZF93ci5udW1fc2dlID0gc2dlX25vOwogCXNlbmRfd3Iub3Bjb2RlID0gSUJfV1JfU0VORDsKIAlzZW5kX3dyLnNlbmRfZmxhZ3MgPSAgSUJfU0VORF9TSUdOQUxFRDsKKwlpZiAodmVjLT5mcm1yKSB7CisJCS8qIFByZXBhcmUgSU5WQUxJREFURSBXUiAqLworCQltZW1zZXQoJmludl93ciwgMCwgc2l6ZW9mIGludl93cik7CisJCWludl93ci5vcGNvZGUgPSBJQl9XUl9MT0NBTF9JTlY7CisJCWludl93ci5zZW5kX2ZsYWdzID0gSUJfU0VORF9TSUdOQUxFRDsKKwkJaW52X3dyLmV4LmludmFsaWRhdGVfcmtleSA9CisJCQl2ZWMtPmZybXItPm1yLT5sa2V5OworCQlzZW5kX3dyLm5leHQgPSAmaW52X3dyOworCX0KIAogCXJldCA9IHN2Y19yZG1hX3NlbmQocmRtYSwgJnNlbmRfd3IpOwogCWlmIChyZXQpCi0JCXN2Y19yZG1hX3B1dF9jb250ZXh0KGN0eHQsIDEpOworCQlnb3RvIGVycjsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CisKKyBlcnI6CisJc3ZjX3JkbWFfcHV0X2ZybXIocmRtYSwgdmVjLT5mcm1yKTsKKwlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAxKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAogdm9pZCBzdmNfcmRtYV9wcmVwX3JlcGx5X2hkcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQpAQCAtNDc3LDggKzY0OSw5IEBACiAJY3R4dCA9IHN2Y19yZG1hX2dldF9jb250ZXh0KHJkbWEpOwogCWN0eHQtPmRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CiAJdmVjID0gc3ZjX3JkbWFfZ2V0X3JlcV9tYXAoKTsKLQl4ZHJfdG9fc2dlKHJkbWEsICZycXN0cC0+cnFfcmVzLCB2ZWMpOwotCisJcmV0ID0gbWFwX3hkcihyZG1hLCAmcnFzdHAtPnJxX3JlcywgdmVjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjA7CiAJaW5saW5lX2J5dGVzID0gcnFzdHAtPnJxX3Jlcy5sZW47CiAKIAkvKiBDcmVhdGUgdGhlIFJETUEgcmVzcG9uc2UgaGVhZGVyICovCkBAIC00OTgsNyArNjcxLDcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInN2Y3JkbWE6IGZhaWxlZCB0byBzZW5kIHdyaXRlIGNodW5rcywgcmM9JWRcbiIsCiAJCSAgICAgICByZXQpOwotCQlnb3RvIGVycm9yOworCQlnb3RvIGVycjE7CiAJfQogCWlubGluZV9ieXRlcyAtPSByZXQ7CiAKQEAgLTUwOCw3ICs2ODEsNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3ZjcmRtYTogZmFpbGVkIHRvIHNlbmQgcmVwbHkgY2h1bmtzLCByYz0lZFxuIiwKIAkJICAgICAgIHJldCk7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyMTsKIAl9CiAJaW5saW5lX2J5dGVzIC09IHJldDsKIApAQCAtNTE3LDkgKzY5MCwxMSBAQAogCXN2Y19yZG1hX3B1dF9yZXFfbWFwKHZlYyk7CiAJZHByaW50aygic3ZjcmRtYTogc2VuZF9yZXBseSByZXR1cm5zICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7Ci0gZXJyb3I6CisKKyBlcnIxOgorCXB1dF9wYWdlKHJlc19wYWdlKTsKKyBlcnIwOgogCXN2Y19yZG1hX3B1dF9yZXFfbWFwKHZlYyk7CiAJc3ZjX3JkbWFfcHV0X2NvbnRleHQoY3R4dCwgMCk7Ci0JcHV0X3BhZ2UocmVzX3BhZ2UpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYwppbmRleCA5MDBjYjY5Li42ZmI0OTNjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMKQEAgLTEwMCwyMCArMTAwLDI5IEBACiAJY3R4dC0+eHBydCA9IHhwcnQ7CiAJSU5JVF9MSVNUX0hFQUQoJmN0eHQtPmR0b19xKTsKIAljdHh0LT5jb3VudCA9IDA7CisJY3R4dC0+ZnJtciA9IE5VTEw7CiAJYXRvbWljX2luYygmeHBydC0+c2NfY3R4dF91c2VkKTsKIAlyZXR1cm4gY3R4dDsKIH0KIAotc3RhdGljIHZvaWQgc3ZjX3JkbWFfdW5tYXBfZG1hKHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICpjdHh0KQordm9pZCBzdmNfcmRtYV91bm1hcF9kbWEoc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmN0eHQpCiB7CiAJc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCA9IGN0eHQtPnhwcnQ7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGN0eHQtPmNvdW50ICYmIGN0eHQtPnNnZVtpXS5sZW5ndGg7IGkrKykgewotCQlhdG9taWNfZGVjKCZ4cHJ0LT5zY19kbWFfdXNlZCk7Ci0JCWliX2RtYV91bm1hcF9zaW5nbGUoeHBydC0+c2NfY21faWQtPmRldmljZSwKLQkJCQkgICAgY3R4dC0+c2dlW2ldLmFkZHIsCi0JCQkJICAgIGN0eHQtPnNnZVtpXS5sZW5ndGgsCi0JCQkJICAgIGN0eHQtPmRpcmVjdGlvbik7CisJCS8qCisJCSAqIFVubWFwIHRoZSBETUEgYWRkciBpbiB0aGUgU0dFIGlmIHRoZSBsa2V5IG1hdGNoZXMKKwkJICogdGhlIHNjX2RtYV9sa2V5LCBvdGhlcndpc2UsIGlnbm9yZSBpdCBzaW5jZSBpdCBpcworCQkgKiBhbiBGUk1SIGxrZXkgYW5kIHdpbGwgYmUgdW5tYXBwZWQgbGF0ZXIgd2hlbiB0aGUKKwkJICogbGFzdCBXUiB0aGF0IHVzZXMgaXQgY29tcGxldGVzLgorCQkgKi8KKwkJaWYgKGN0eHQtPnNnZVtpXS5sa2V5ID09IHhwcnQtPnNjX2RtYV9sa2V5KSB7CisJCQlhdG9taWNfZGVjKCZ4cHJ0LT5zY19kbWFfdXNlZCk7CisJCQlpYl9kbWFfdW5tYXBfc2luZ2xlKHhwcnQtPnNjX2NtX2lkLT5kZXZpY2UsCisJCQkJCSAgICBjdHh0LT5zZ2VbaV0uYWRkciwKKwkJCQkJICAgIGN0eHQtPnNnZVtpXS5sZW5ndGgsCisJCQkJCSAgICBjdHh0LT5kaXJlY3Rpb24pOworCQl9CiAJfQogfQogCkBAIC0xNTAsNiArMTU5LDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyg1MDApKTsKIAl9CiAJbWFwLT5jb3VudCA9IDA7CisJbWFwLT5mcm1yID0gTlVMTDsKIAlyZXR1cm4gbWFwOwogfQogCkBAIC0zMTYsNiArMzI2LDUwIEBACiB9CiAKIC8qCisgKiBQcm9jZXNzcyBhIGNvbXBsZXRpb24gY29udGV4dAorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbnRleHQoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwKKwkJCSAgICBzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqY3R4dCkKK3sKKwlzdmNfcmRtYV91bm1hcF9kbWEoY3R4dCk7CisKKwlzd2l0Y2ggKGN0eHQtPndyX29wKSB7CisJY2FzZSBJQl9XUl9TRU5EOgorCQlpZiAodGVzdF9iaXQoUkRNQUNUWFRfRl9GQVNUX1VOUkVHLCAmY3R4dC0+ZmxhZ3MpKQorCQkJc3ZjX3JkbWFfcHV0X2ZybXIoeHBydCwgY3R4dC0+ZnJtcik7CisJCXN2Y19yZG1hX3B1dF9jb250ZXh0KGN0eHQsIDEpOworCQlicmVhazsKKworCWNhc2UgSUJfV1JfUkRNQV9XUklURToKKwkJc3ZjX3JkbWFfcHV0X2NvbnRleHQoY3R4dCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBJQl9XUl9SRE1BX1JFQUQ6CisJY2FzZSBJQl9XUl9SRE1BX1JFQURfV0lUSF9JTlY6CisJCWlmICh0ZXN0X2JpdChSRE1BQ1RYVF9GX0xBU1RfQ1RYVCwgJmN0eHQtPmZsYWdzKSkgeworCQkJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKnJlYWRfaGRyID0gY3R4dC0+cmVhZF9oZHI7CisJCQlCVUdfT04oIXJlYWRfaGRyKTsKKwkJCWlmICh0ZXN0X2JpdChSRE1BQ1RYVF9GX0ZBU1RfVU5SRUcsICZjdHh0LT5mbGFncykpCisJCQkJc3ZjX3JkbWFfcHV0X2ZybXIoeHBydCwgY3R4dC0+ZnJtcik7CisJCQlzcGluX2xvY2tfYmgoJnhwcnQtPnNjX3JxX2R0b19sb2NrKTsKKwkJCXNldF9iaXQoWFBUX0RBVEEsICZ4cHJ0LT5zY194cHJ0LnhwdF9mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZyZWFkX2hkci0+ZHRvX3EsCisJCQkJICAgICAgJnhwcnQtPnNjX3JlYWRfY29tcGxldGVfcSk7CisJCQlzcGluX3VubG9ja19iaCgmeHBydC0+c2NfcnFfZHRvX2xvY2spOworCQkJc3ZjX3hwcnRfZW5xdWV1ZSgmeHBydC0+c2NfeHBydCk7CisJCX0KKwkJc3ZjX3JkbWFfcHV0X2NvbnRleHQoY3R4dCwgMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJzdmNyZG1hOiB1bmV4cGVjdGVkIGNvbXBsZXRpb24gdHlwZSwgIgorCQkgICAgICAgIm9wY29kZT0lZFxuIiwKKwkJICAgICAgIGN0eHQtPndyX29wKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgogICogU2VuZCBRdWV1ZSBDb21wbGV0aW9uIEhhbmRsZXIgLSBwb3RlbnRpYWxseSBjYWxsZWQgb24gaW50ZXJydXB0IGNvbnRleHQuCiAgKgogICogTm90ZSB0aGF0IGNhbGxlciBtdXN0IGhvbGQgYSB0cmFuc3BvcnQgcmVmZXJlbmNlLgpAQCAtMzI3LDE3ICszODEsMTIgQEAKIAlzdHJ1Y3QgaWJfY3EgKmNxID0geHBydC0+c2Nfc3FfY3E7CiAJaW50IHJldDsKIAotCiAJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoUkRNQVhQUlRfU1FfUEVORElORywgJnhwcnQtPnNjX2ZsYWdzKSkKIAkJcmV0dXJuOwogCiAJaWJfcmVxX25vdGlmeV9jcSh4cHJ0LT5zY19zcV9jcSwgSUJfQ1FfTkVYVF9DT01QKTsKIAlhdG9taWNfaW5jKCZyZG1hX3N0YXRfc3FfcG9sbCk7CiAJd2hpbGUgKChyZXQgPSBpYl9wb2xsX2NxKGNxLCAxLCAmd2MpKSA+IDApIHsKLQkJY3R4dCA9IChzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqKSh1bnNpZ25lZCBsb25nKXdjLndyX2lkOwotCQl4cHJ0ID0gY3R4dC0+eHBydDsKLQotCQlzdmNfcmRtYV91bm1hcF9kbWEoY3R4dCk7CiAJCWlmICh3Yy5zdGF0dXMgIT0gSUJfV0NfU1VDQ0VTUykKIAkJCS8qIENsb3NlIHRoZSB0cmFuc3BvcnQgKi8KIAkJCXNldF9iaXQoWFBUX0NMT1NFLCAmeHBydC0+c2NfeHBydC54cHRfZmxhZ3MpOwpAQCAtMzQ2LDM1ICszOTUsMTAgQEAKIAkJYXRvbWljX2RlYygmeHBydC0+c2Nfc3FfY291bnQpOwogCQl3YWtlX3VwKCZ4cHJ0LT5zY19zZW5kX3dhaXQpOwogCi0JCXN3aXRjaCAoY3R4dC0+d3Jfb3ApIHsKLQkJY2FzZSBJQl9XUl9TRU5EOgotCQkJc3ZjX3JkbWFfcHV0X2NvbnRleHQoY3R4dCwgMSk7Ci0JCQlicmVhazsKKwkJY3R4dCA9IChzdHJ1Y3Qgc3ZjX3JkbWFfb3BfY3R4dCAqKSh1bnNpZ25lZCBsb25nKXdjLndyX2lkOworCQlpZiAoY3R4dCkKKwkJCXByb2Nlc3NfY29udGV4dCh4cHJ0LCBjdHh0KTsKIAotCQljYXNlIElCX1dSX1JETUFfV1JJVEU6Ci0JCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUJfV1JfUkRNQV9SRUFEOgotCQkJaWYgKHRlc3RfYml0KFJETUFDVFhUX0ZfTEFTVF9DVFhULCAmY3R4dC0+ZmxhZ3MpKSB7Ci0JCQkJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKnJlYWRfaGRyID0gY3R4dC0+cmVhZF9oZHI7Ci0JCQkJQlVHX09OKCFyZWFkX2hkcik7Ci0JCQkJc3Bpbl9sb2NrX2JoKCZ4cHJ0LT5zY19ycV9kdG9fbG9jayk7Ci0JCQkJc2V0X2JpdChYUFRfREFUQSwgJnhwcnQtPnNjX3hwcnQueHB0X2ZsYWdzKTsKLQkJCQlsaXN0X2FkZF90YWlsKCZyZWFkX2hkci0+ZHRvX3EsCi0JCQkJCSAgICAgICZ4cHJ0LT5zY19yZWFkX2NvbXBsZXRlX3EpOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZ4cHJ0LT5zY19ycV9kdG9fbG9jayk7Ci0JCQkJc3ZjX3hwcnRfZW5xdWV1ZSgmeHBydC0+c2NfeHBydCk7Ci0JCQl9Ci0JCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAwKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgInN2Y3JkbWE6IHVuZXhwZWN0ZWQgY29tcGxldGlvbiB0eXBlLCAiCi0JCQkgICAgICAgIm9wY29kZT0lZCwgc3RhdHVzPSVkXG4iLAotCQkJICAgICAgIHdjLm9wY29kZSwgd2Muc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9CiAJCXN2Y194cHJ0X3B1dCgmeHBydC0+c2NfeHBydCk7CiAJfQogCkBAIC00MjUsMTAgKzQ0OSwxMiBAQAogCUlOSVRfTElTVF9IRUFEKCZjbWFfeHBydC0+c2NfZHRvX3EpOwogCUlOSVRfTElTVF9IRUFEKCZjbWFfeHBydC0+c2NfcnFfZHRvX3EpOwogCUlOSVRfTElTVF9IRUFEKCZjbWFfeHBydC0+c2NfcmVhZF9jb21wbGV0ZV9xKTsKKwlJTklUX0xJU1RfSEVBRCgmY21hX3hwcnQtPnNjX2ZybXJfcSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY21hX3hwcnQtPnNjX3NlbmRfd2FpdCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmY21hX3hwcnQtPnNjX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjbWFfeHBydC0+c2NfcnFfZHRvX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjbWFfeHBydC0+c2NfZnJtcl9xX2xvY2spOwogCiAJY21hX3hwcnQtPnNjX29yZCA9IHN2Y3JkbWFfb3JkOwogCkBAIC00NjIsNyArNDg4LDcgQEAKIAlzdHJ1Y3QgaWJfcmVjdl93ciByZWN2X3dyLCAqYmFkX3JlY3Zfd3I7CiAJc3RydWN0IHN2Y19yZG1hX29wX2N0eHQgKmN0eHQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBwYTsKKwlkbWFfYWRkcl90IHBhOwogCWludCBzZ2Vfbm87CiAJaW50IGJ1ZmxlbjsKIAlpbnQgcmV0OwpAQCAtNDc0LDEzICs1MDAsMTUgQEAKIAkJQlVHX09OKHNnZV9ubyA+PSB4cHJ0LT5zY19tYXhfc2dlKTsKIAkJcGFnZSA9IHN2Y19yZG1hX2dldF9wYWdlKCk7CiAJCWN0eHQtPnBhZ2VzW3NnZV9ub10gPSBwYWdlOwotCQlhdG9taWNfaW5jKCZ4cHJ0LT5zY19kbWFfdXNlZCk7CiAJCXBhID0gaWJfZG1hX21hcF9wYWdlKHhwcnQtPnNjX2NtX2lkLT5kZXZpY2UsCiAJCQkJICAgICBwYWdlLCAwLCBQQUdFX1NJWkUsCiAJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoaWJfZG1hX21hcHBpbmdfZXJyb3IoeHBydC0+c2NfY21faWQtPmRldmljZSwgcGEpKQorCQkJZ290byBlcnJfcHV0X2N0eHQ7CisJCWF0b21pY19pbmMoJnhwcnQtPnNjX2RtYV91c2VkKTsKIAkJY3R4dC0+c2dlW3NnZV9ub10uYWRkciA9IHBhOwogCQljdHh0LT5zZ2Vbc2dlX25vXS5sZW5ndGggPSBQQUdFX1NJWkU7Ci0JCWN0eHQtPnNnZVtzZ2Vfbm9dLmxrZXkgPSB4cHJ0LT5zY19waHlzX21yLT5sa2V5OworCQljdHh0LT5zZ2Vbc2dlX25vXS5sa2V5ID0geHBydC0+c2NfZG1hX2xrZXk7CiAJCWJ1ZmxlbiArPSBQQUdFX1NJWkU7CiAJfQogCWN0eHQtPmNvdW50ID0gc2dlX25vOwpAQCAtNDk2LDYgKzUyNCwxMCBAQAogCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAxKTsKIAl9CiAJcmV0dXJuIHJldDsKKworIGVycl9wdXRfY3R4dDoKKwlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAxKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyoKQEAgLTU2Niw3ICs1OTgsNyBAQAogCQlkcHJpbnRrKCJzdmNyZG1hOiBDb25uZWN0IHJlcXVlc3Qgb24gY21hX2lkPSVwLCB4cHJ0ID0gJXAsICIKIAkJCSJldmVudD0lZFxuIiwgY21hX2lkLCBjbWFfaWQtPmNvbnRleHQsIGV2ZW50LT5ldmVudCk7CiAJCWhhbmRsZV9jb25uZWN0X3JlcShjbWFfaWQsCi0JCQkJICAgZXZlbnQtPnBhcmFtLmNvbm4ucmVzcG9uZGVyX3Jlc291cmNlcyk7CisJCQkJICAgZXZlbnQtPnBhcmFtLmNvbm4uaW5pdGlhdG9yX2RlcHRoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQ6CkBAIC02ODYsNiArNzE4LDk3IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAorc3RhdGljIHN0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yICpyZG1hX2FsbG9jX2ZybXIoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCkKK3sKKwlzdHJ1Y3QgaWJfbXIgKm1yOworCXN0cnVjdCBpYl9mYXN0X3JlZ19wYWdlX2xpc3QgKnBsOworCXN0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yICpmcm1yOworCisJZnJtciA9IGttYWxsb2Moc2l6ZW9mKCpmcm1yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmcm1yKQorCQlnb3RvIGVycjsKKworCW1yID0gaWJfYWxsb2NfZmFzdF9yZWdfbXIoeHBydC0+c2NfcGQsIFJQQ1NWQ19NQVhQQUdFUyk7CisJaWYgKCFtcikKKwkJZ290byBlcnJfZnJlZV9mcm1yOworCisJcGwgPSBpYl9hbGxvY19mYXN0X3JlZ19wYWdlX2xpc3QoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkJIFJQQ1NWQ19NQVhQQUdFUyk7CisJaWYgKCFwbCkKKwkJZ290byBlcnJfZnJlZV9tcjsKKworCWZybXItPm1yID0gbXI7CisJZnJtci0+cGFnZV9saXN0ID0gcGw7CisJSU5JVF9MSVNUX0hFQUQoJmZybXItPmZybXJfbGlzdCk7CisJcmV0dXJuIGZybXI7CisKKyBlcnJfZnJlZV9tcjoKKwlpYl9kZXJlZ19tcihtcik7CisgZXJyX2ZyZWVfZnJtcjoKKwlrZnJlZShmcm1yKTsKKyBlcnI6CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKK3N0YXRpYyB2b2lkIHJkbWFfZGVhbGxvY19mcm1yX3Eoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCkKK3sKKwlzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqZnJtcjsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmeHBydC0+c2NfZnJtcl9xKSkgeworCQlmcm1yID0gbGlzdF9lbnRyeSh4cHJ0LT5zY19mcm1yX3EubmV4dCwKKwkJCQkgIHN0cnVjdCBzdmNfcmRtYV9mYXN0cmVnX21yLCBmcm1yX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZmcm1yLT5mcm1yX2xpc3QpOworCQlpYl9kZXJlZ19tcihmcm1yLT5tcik7CisJCWliX2ZyZWVfZmFzdF9yZWdfcGFnZV9saXN0KGZybXItPnBhZ2VfbGlzdCk7CisJCWtmcmVlKGZybXIpOworCX0KK30KKworc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKnN2Y19yZG1hX2dldF9mcm1yKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnJkbWEpCit7CisJc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXIgPSBOVUxMOworCisJc3Bpbl9sb2NrX2JoKCZyZG1hLT5zY19mcm1yX3FfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZyZG1hLT5zY19mcm1yX3EpKSB7CisJCWZybXIgPSBsaXN0X2VudHJ5KHJkbWEtPnNjX2ZybXJfcS5uZXh0LAorCQkJCSAgc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIsIGZybXJfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmZybXItPmZybXJfbGlzdCk7CisJCWZybXItPm1hcF9sZW4gPSAwOworCQlmcm1yLT5wYWdlX2xpc3RfbGVuID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnJkbWEtPnNjX2ZybXJfcV9sb2NrKTsKKwlpZiAoZnJtcikKKwkJcmV0dXJuIGZybXI7CisKKwlyZXR1cm4gcmRtYV9hbGxvY19mcm1yKHJkbWEpOworfQorCitzdGF0aWMgdm9pZCBmcm1yX3VubWFwX2RtYShzdHJ1Y3Qgc3ZjeHBydF9yZG1hICp4cHJ0LAorCQkJICAgc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXIpCit7CisJaW50IHBhZ2Vfbm87CisJZm9yIChwYWdlX25vID0gMDsgcGFnZV9ubyA8IGZybXItPnBhZ2VfbGlzdF9sZW47IHBhZ2Vfbm8rKykgeworCQlkbWFfYWRkcl90IGFkZHIgPSBmcm1yLT5wYWdlX2xpc3QtPnBhZ2VfbGlzdFtwYWdlX25vXTsKKwkJaWYgKGliX2RtYV9tYXBwaW5nX2Vycm9yKGZybXItPm1yLT5kZXZpY2UsIGFkZHIpKQorCQkJY29udGludWU7CisJCWF0b21pY19kZWMoJnhwcnQtPnNjX2RtYV91c2VkKTsKKwkJaWJfZG1hX3VubWFwX3NpbmdsZShmcm1yLT5tci0+ZGV2aWNlLCBhZGRyLCBQQUdFX1NJWkUsCisJCQkJICAgIGZybXItPmRpcmVjdGlvbik7CisJfQorfQorCit2b2lkIHN2Y19yZG1hX3B1dF9mcm1yKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnJkbWEsCisJCSAgICAgICBzdHJ1Y3Qgc3ZjX3JkbWFfZmFzdHJlZ19tciAqZnJtcikKK3sKKwlpZiAoZnJtcikgeworCQlmcm1yX3VubWFwX2RtYShyZG1hLCBmcm1yKTsKKwkJc3Bpbl9sb2NrX2JoKCZyZG1hLT5zY19mcm1yX3FfbG9jayk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmZnJtci0+ZnJtcl9saXN0KSk7CisJCWxpc3RfYWRkKCZmcm1yLT5mcm1yX2xpc3QsICZyZG1hLT5zY19mcm1yX3EpOworCQlzcGluX3VubG9ja19iaCgmcmRtYS0+c2NfZnJtcl9xX2xvY2spOworCX0KK30KKwogLyoKICAqIFRoaXMgaXMgdGhlIHhwb19yZWN2ZnJvbSBmdW5jdGlvbiBmb3IgbGlzdGVuaW5nIGVuZHBvaW50cy4gSXRzCiAgKiBwdXJwb3NlIGlzIHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucy4gVGhlIENNQSBjYWxsYmFjayBoYW5kbGVyCkBAIC03MDQsNiArODI3LDggQEAKIAlzdHJ1Y3QgcmRtYV9jb25uX3BhcmFtIGNvbm5fcGFyYW07CiAJc3RydWN0IGliX3FwX2luaXRfYXR0ciBxcF9hdHRyOwogCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciBkZXZhdHRyOworCWludCBkbWFfbXJfYWNjOworCWludCBuZWVkX2RtYV9tcjsKIAlpbnQgcmV0OwogCWludCBpOwogCkBAIC04MTksMTUgKzk0NCw3NyBAQAogCX0KIAluZXd4cHJ0LT5zY19xcCA9IG5ld3hwcnQtPnNjX2NtX2lkLT5xcDsKIAotCS8qIFJlZ2lzdGVyIGFsbCBvZiBwaHlzaWNhbCBtZW1vcnkgKi8KLQluZXd4cHJ0LT5zY19waHlzX21yID0gaWJfZ2V0X2RtYV9tcihuZXd4cHJ0LT5zY19wZCwKLQkJCQkJICAgIElCX0FDQ0VTU19MT0NBTF9XUklURSB8Ci0JCQkJCSAgICBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFKTsKLQlpZiAoSVNfRVJSKG5ld3hwcnQtPnNjX3BoeXNfbXIpKSB7Ci0JCWRwcmludGsoInN2Y3JkbWE6IEZhaWxlZCB0byBjcmVhdGUgRE1BIE1SIHJldD0lZFxuIiwgcmV0KTsKKwkvKgorCSAqIFVzZSB0aGUgbW9zdCBzZWN1cmUgc2V0IG9mIE1SIHJlc291cmNlcyBiYXNlZCBvbiB0aGUKKwkgKiB0cmFuc3BvcnQgdHlwZSBhbmQgYXZhaWxhYmxlIG1lbW9yeSBtYW5hZ2VtZW50IGZlYXR1cmVzIGluCisJICogdGhlIGRldmljZS4gSGVyZSdzIHRoZSB0YWJsZSBpbXBsZW1lbnRlZCBiZWxvdzoKKwkgKgorCSAqCQlGYXN0CUdsb2JhbAlETUEJUmVtb3RlIFdSCisJICoJCVJlZwlMS0VZCU1SCUFjY2VzcworCSAqCQlTdXAnZAlTdXAnZAlOZWVkZWQJTmVlZGVkCisJICoKKwkgKiBJV0FSUAlOCU4JWQlZCisJICoJCU4JWQlZCVkKKwkgKgkJWQlOCVkJTgorCSAqCQlZCVkJTgktCisJICoKKwkgKiBJQgkJTglOCVkJTgorCSAqCQlOCVkJTgktCisJICoJCVkJTglZCU4KKwkgKgkJWQlZCU4JLQorCSAqCisJICogTkI6CWlXQVJQIHJlcXVpcmVzIHJlbW90ZSB3cml0ZSBhY2Nlc3MgZm9yIHRoZSBkYXRhIHNpbmsKKwkgKglvZiBhbiBSRE1BX1JFQUQuIElCIGRvZXMgbm90LgorCSAqLworCWlmIChkZXZhdHRyLmRldmljZV9jYXBfZmxhZ3MgJiBJQl9ERVZJQ0VfTUVNX01HVF9FWFRFTlNJT05TKSB7CisJCW5ld3hwcnQtPnNjX2ZybXJfcGdfbGlzdF9sZW4gPQorCQkJZGV2YXR0ci5tYXhfZmFzdF9yZWdfcGFnZV9saXN0X2xlbjsKKwkJbmV3eHBydC0+c2NfZGV2X2NhcHMgfD0gU1ZDUkRNQV9ERVZDQVBfRkFTVF9SRUc7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgYSBETUEgTVIgaXMgcmVxdWlyZWQgYW5kIGlmIHNvLCB3aGF0IHByaXZzIGFyZSByZXF1aXJlZAorCSAqLworCXN3aXRjaCAocmRtYV9ub2RlX2dldF90cmFuc3BvcnQobmV3eHBydC0+c2NfY21faWQtPmRldmljZS0+bm9kZV90eXBlKSkgeworCWNhc2UgUkRNQV9UUkFOU1BPUlRfSVdBUlA6CisJCW5ld3hwcnQtPnNjX2Rldl9jYXBzIHw9IFNWQ1JETUFfREVWQ0FQX1JFQURfV19JTlY7CisJCWlmICghKG5ld3hwcnQtPnNjX2Rldl9jYXBzICYgU1ZDUkRNQV9ERVZDQVBfRkFTVF9SRUcpKSB7CisJCQluZWVkX2RtYV9tciA9IDE7CisJCQlkbWFfbXJfYWNjID0KKwkJCQkoSUJfQUNDRVNTX0xPQ0FMX1dSSVRFIHwKKwkJCQkgSUJfQUNDRVNTX1JFTU9URV9XUklURSk7CisJCX0gZWxzZSBpZiAoIShkZXZhdHRyLmRldmljZV9jYXBfZmxhZ3MgJiBJQl9ERVZJQ0VfTE9DQUxfRE1BX0xLRVkpKSB7CisJCQluZWVkX2RtYV9tciA9IDE7CisJCQlkbWFfbXJfYWNjID0gSUJfQUNDRVNTX0xPQ0FMX1dSSVRFOworCQl9IGVsc2UKKwkJCW5lZWRfZG1hX21yID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSRE1BX1RSQU5TUE9SVF9JQjoKKwkJaWYgKCEoZGV2YXR0ci5kZXZpY2VfY2FwX2ZsYWdzICYgSUJfREVWSUNFX0xPQ0FMX0RNQV9MS0VZKSkgeworCQkJbmVlZF9kbWFfbXIgPSAxOworCQkJZG1hX21yX2FjYyA9IElCX0FDQ0VTU19MT0NBTF9XUklURTsKKwkJfSBlbHNlCisJCQluZWVkX2RtYV9tciA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWdvdG8gZXJyb3V0OwogCX0KIAorCS8qIENyZWF0ZSB0aGUgRE1BIE1SIGlmIG5lZWRlZCwgb3RoZXJ3aXNlLCB1c2UgdGhlIERNQSBMS0VZICovCisJaWYgKG5lZWRfZG1hX21yKSB7CisJCS8qIFJlZ2lzdGVyIGFsbCBvZiBwaHlzaWNhbCBtZW1vcnkgKi8KKwkJbmV3eHBydC0+c2NfcGh5c19tciA9CisJCQlpYl9nZXRfZG1hX21yKG5ld3hwcnQtPnNjX3BkLCBkbWFfbXJfYWNjKTsKKwkJaWYgKElTX0VSUihuZXd4cHJ0LT5zY19waHlzX21yKSkgeworCQkJZHByaW50aygic3ZjcmRtYTogRmFpbGVkIHRvIGNyZWF0ZSBETUEgTVIgcmV0PSVkXG4iLAorCQkJCXJldCk7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQluZXd4cHJ0LT5zY19kbWFfbGtleSA9IG5ld3hwcnQtPnNjX3BoeXNfbXItPmxrZXk7CisJfSBlbHNlCisJCW5ld3hwcnQtPnNjX2RtYV9sa2V5ID0KKwkJCW5ld3hwcnQtPnNjX2NtX2lkLT5kZXZpY2UtPmxvY2FsX2RtYV9sa2V5OworCiAJLyogUG9zdCByZWNlaXZlIGJ1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbmV3eHBydC0+c2NfbWF4X3JlcXVlc3RzOyBpKyspIHsKIAkJcmV0ID0gc3ZjX3JkbWFfcG9zdF9yZWN2KG5ld3hwcnQpOwpAQCAtOTYxLDYgKzExNDgsOSBAQAogCVdBUk5fT04oYXRvbWljX3JlYWQoJnJkbWEtPnNjX2N0eHRfdXNlZCkgIT0gMCk7CiAJV0FSTl9PTihhdG9taWNfcmVhZCgmcmRtYS0+c2NfZG1hX3VzZWQpICE9IDApOwogCisJLyogRGUtYWxsb2NhdGUgZmFzdHJlZyBtciAqLworCXJkbWFfZGVhbGxvY19mcm1yX3EocmRtYSk7CisKIAkvKiBEZXN0cm95IHRoZSBRUCBpZiBwcmVzZW50IChub3QgYSBsaXN0ZW5lcikgKi8KIAlpZiAocmRtYS0+c2NfcXAgJiYgIUlTX0VSUihyZG1hLT5zY19xcCkpCiAJCWliX2Rlc3Ryb3lfcXAocmRtYS0+c2NfcXApOwpAQCAtMTAxNCwyMSArMTIwNCw1OSBAQAogCXJldHVybiAxOwogfQogCisvKgorICogQXR0ZW1wdCB0byByZWdpc3RlciB0aGUga3ZlYyByZXByZXNlbnRpbmcgdGhlIFJQQyBtZW1vcnkgd2l0aCB0aGUKKyAqIGRldmljZS4KKyAqCisgKiBSZXR1cm5zOgorICogIE5VTEwgOiBUaGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZmFzdHJlZyBvciB0aGVyZSB3ZXJlIG5vIG1vcmUKKyAqICAgICAgICAgZmFzdHJlZyBtci4KKyAqICBmcm1yIDogVGhlIGt2ZWMgcmVnaXN0ZXIgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBvc3RlZC4KKyAqICAgIDwwIDogQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIGt2ZWMuCisgKi8KK2ludCBzdmNfcmRtYV9mYXN0cmVnKHN0cnVjdCBzdmN4cHJ0X3JkbWEgKnhwcnQsCisJCSAgICAgc3RydWN0IHN2Y19yZG1hX2Zhc3RyZWdfbXIgKmZybXIpCit7CisJc3RydWN0IGliX3NlbmRfd3IgZmFzdHJlZ193cjsKKwl1OCBrZXk7CisKKwkvKiBCdW1wIHRoZSBrZXkgKi8KKwlrZXkgPSAodTgpKGZybXItPm1yLT5sa2V5ICYgMHgwMDAwMDBGRik7CisJaWJfdXBkYXRlX2Zhc3RfcmVnX2tleShmcm1yLT5tciwgKytrZXkpOworCisJLyogUHJlcGFyZSBGQVNUUkVHIFdSICovCisJbWVtc2V0KCZmYXN0cmVnX3dyLCAwLCBzaXplb2YgZmFzdHJlZ193cik7CisJZmFzdHJlZ193ci5vcGNvZGUgPSBJQl9XUl9GQVNUX1JFR19NUjsKKwlmYXN0cmVnX3dyLnNlbmRfZmxhZ3MgPSBJQl9TRU5EX1NJR05BTEVEOworCWZhc3RyZWdfd3Iud3IuZmFzdF9yZWcuaW92YV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWZybXItPmt2YTsKKwlmYXN0cmVnX3dyLndyLmZhc3RfcmVnLnBhZ2VfbGlzdCA9IGZybXItPnBhZ2VfbGlzdDsKKwlmYXN0cmVnX3dyLndyLmZhc3RfcmVnLnBhZ2VfbGlzdF9sZW4gPSBmcm1yLT5wYWdlX2xpc3RfbGVuOworCWZhc3RyZWdfd3Iud3IuZmFzdF9yZWcucGFnZV9zaGlmdCA9IFBBR0VfU0hJRlQ7CisJZmFzdHJlZ193ci53ci5mYXN0X3JlZy5sZW5ndGggPSBmcm1yLT5tYXBfbGVuOworCWZhc3RyZWdfd3Iud3IuZmFzdF9yZWcuYWNjZXNzX2ZsYWdzID0gZnJtci0+YWNjZXNzX2ZsYWdzOworCWZhc3RyZWdfd3Iud3IuZmFzdF9yZWcucmtleSA9IGZybXItPm1yLT5sa2V5OworCXJldHVybiBzdmNfcmRtYV9zZW5kKHhwcnQsICZmYXN0cmVnX3dyKTsKK30KKwogaW50IHN2Y19yZG1hX3NlbmQoc3RydWN0IHN2Y3hwcnRfcmRtYSAqeHBydCwgc3RydWN0IGliX3NlbmRfd3IgKndyKQogewotCXN0cnVjdCBpYl9zZW5kX3dyICpiYWRfd3I7CisJc3RydWN0IGliX3NlbmRfd3IgKmJhZF93ciwgKm5fd3I7CisJaW50IHdyX2NvdW50OworCWludCBpOwogCWludCByZXQ7CiAKIAlpZiAodGVzdF9iaXQoWFBUX0NMT1NFLCAmeHBydC0+c2NfeHBydC54cHRfZmxhZ3MpKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCiAJQlVHX09OKHdyLT5zZW5kX2ZsYWdzICE9IElCX1NFTkRfU0lHTkFMRUQpOwotCUJVR19PTigoKHN0cnVjdCBzdmNfcmRtYV9vcF9jdHh0ICopKHVuc2lnbmVkIGxvbmcpd3ItPndyX2lkKS0+d3Jfb3AgIT0KLQkJd3ItPm9wY29kZSk7CisJd3JfY291bnQgPSAxOworCWZvciAobl93ciA9IHdyLT5uZXh0OyBuX3dyOyBuX3dyID0gbl93ci0+bmV4dCkKKwkJd3JfY291bnQrKzsKKwogCS8qIElmIHRoZSBTUSBpcyBmdWxsLCB3YWl0IHVudGlsIGFuIFNRIGVudHJ5IGlzIGF2YWlsYWJsZSAqLwogCXdoaWxlICgxKSB7CiAJCXNwaW5fbG9ja19iaCgmeHBydC0+c2NfbG9jayk7Ci0JCWlmICh4cHJ0LT5zY19zcV9kZXB0aCA9PSBhdG9taWNfcmVhZCgmeHBydC0+c2Nfc3FfY291bnQpKSB7CisJCWlmICh4cHJ0LT5zY19zcV9kZXB0aCA8IGF0b21pY19yZWFkKCZ4cHJ0LT5zY19zcV9jb3VudCkgKyB3cl9jb3VudCkgewogCQkJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnNjX2xvY2spOwogCQkJYXRvbWljX2luYygmcmRtYV9zdGF0X3NxX3N0YXJ2ZSk7CiAKQEAgLTEwNDMsMTkgKzEyNzEsMjYgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCS8qIEJ1bXBlZCB1c2VkIFNRIFdSIGNvdW50IGFuZCBwb3N0ICovCi0JCXN2Y194cHJ0X2dldCgmeHBydC0+c2NfeHBydCk7CisJCS8qIFRha2UgYSB0cmFuc3BvcnQgcmVmIGZvciBlYWNoIFdSIHBvc3RlZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgd3JfY291bnQ7IGkrKykKKwkJCXN2Y194cHJ0X2dldCgmeHBydC0+c2NfeHBydCk7CisKKwkJLyogQnVtcCB1c2VkIFNRIFdSIGNvdW50IGFuZCBwb3N0ICovCisJCWF0b21pY19hZGQod3JfY291bnQsICZ4cHJ0LT5zY19zcV9jb3VudCk7CiAJCXJldCA9IGliX3Bvc3Rfc2VuZCh4cHJ0LT5zY19xcCwgd3IsICZiYWRfd3IpOwotCQlpZiAoIXJldCkKLQkJCWF0b21pY19pbmMoJnhwcnQtPnNjX3NxX2NvdW50KTsKLQkJZWxzZSB7Ci0JCQlzdmNfeHBydF9wdXQoJnhwcnQtPnNjX3hwcnQpOworCQlpZiAocmV0KSB7CisJCQlzZXRfYml0KFhQVF9DTE9TRSwgJnhwcnQtPnNjX3hwcnQueHB0X2ZsYWdzKTsKKwkJCWF0b21pY19zdWIod3JfY291bnQsICZ4cHJ0LT5zY19zcV9jb3VudCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgd3JfY291bnQ7IGkgKyspCisJCQkJc3ZjX3hwcnRfcHV0KCZ4cHJ0LT5zY194cHJ0KTsKIAkJCWRwcmludGsoInN2Y3JkbWE6IGZhaWxlZCB0byBwb3N0IFNRIFdSIHJjPSVkLCAiCiAJCQkgICAgICAgInNjX3NxX2NvdW50PSVkLCBzY19zcV9kZXB0aD0lZFxuIiwKIAkJCSAgICAgICByZXQsIGF0b21pY19yZWFkKCZ4cHJ0LT5zY19zcV9jb3VudCksCiAJCQkgICAgICAgeHBydC0+c2Nfc3FfZGVwdGgpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2JoKCZ4cHJ0LT5zY19sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXdha2VfdXAoJnhwcnQtPnNjX3NlbmRfd2FpdCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTA3OSwxMCArMTMxNCwxNCBAQAogCWxlbmd0aCA9IHN2Y19yZG1hX3hkcl9lbmNvZGVfZXJyb3IoeHBydCwgcm1zZ3AsIGVyciwgdmEpOwogCiAJLyogUHJlcGFyZSBTR0UgZm9yIGxvY2FsIGFkZHJlc3MgKi8KLQlhdG9taWNfaW5jKCZ4cHJ0LT5zY19kbWFfdXNlZCk7CiAJc2dlLmFkZHIgPSBpYl9kbWFfbWFwX3BhZ2UoeHBydC0+c2NfY21faWQtPmRldmljZSwKIAkJCQkgICBwLCAwLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0Jc2dlLmxrZXkgPSB4cHJ0LT5zY19waHlzX21yLT5sa2V5OworCWlmIChpYl9kbWFfbWFwcGluZ19lcnJvcih4cHJ0LT5zY19jbV9pZC0+ZGV2aWNlLCBzZ2UuYWRkcikpIHsKKwkJcHV0X3BhZ2UocCk7CisJCXJldHVybjsKKwl9CisJYXRvbWljX2luYygmeHBydC0+c2NfZG1hX3VzZWQpOworCXNnZS5sa2V5ID0geHBydC0+c2NfZG1hX2xrZXk7CiAJc2dlLmxlbmd0aCA9IGxlbmd0aDsKIAogCWN0eHQgPSBzdmNfcmRtYV9nZXRfY29udGV4dCh4cHJ0KTsKQEAgLTExMDMsNiArMTM0Miw5IEBACiAJaWYgKHJldCkgewogCQlkcHJpbnRrKCJzdmNyZG1hOiBFcnJvciAlZCBwb3N0aW5nIHNlbmQgZm9yIHByb3RvY29sIGVycm9yXG4iLAogCQkJcmV0KTsKKwkJaWJfZG1hX3VubWFwX3BhZ2UoeHBydC0+c2NfY21faWQtPmRldmljZSwKKwkJCQkgIHNnZS5hZGRyLCBQQUdFX1NJWkUsCisJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwogCQlzdmNfcmRtYV9wdXRfY29udGV4dChjdHh0LCAxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS90cmFuc3BvcnQuYwppbmRleCBhNTY0YzFhLi45ODM5YzNkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvdHJhbnNwb3J0LmMKQEAgLTcwLDExICs3MCw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHhwcnRfcmRtYV9tYXhfaW5saW5lX3JlYWQgPSBSUENSRE1BX0RFRl9JTkxJTkU7CiBzdGF0aWMgdW5zaWduZWQgaW50IHhwcnRfcmRtYV9tYXhfaW5saW5lX3dyaXRlID0gUlBDUkRNQV9ERUZfSU5MSU5FOwogc3RhdGljIHVuc2lnbmVkIGludCB4cHJ0X3JkbWFfaW5saW5lX3dyaXRlX3BhZGRpbmc7Ci0jaWYgIVJQQ1JETUFfUEVSU0lTVEVOVF9SRUdJU1RSQVRJT04KLXN0YXRpYyB1bnNpZ25lZCBpbnQgeHBydF9yZG1hX21lbXJlZ19zdHJhdGVneSA9IFJQQ1JETUFfUkVHSVNURVI7IC8qIEZNUj8gKi8KLSNlbHNlCi1zdGF0aWMgdW5zaWduZWQgaW50IHhwcnRfcmRtYV9tZW1yZWdfc3RyYXRlZ3kgPSBSUENSRE1BX0FMTFBIWVNJQ0FMOwotI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHhwcnRfcmRtYV9tZW1yZWdfc3RyYXRlZ3kgPSBSUENSRE1BX0ZSTVI7CisgICAgICAgICAgICAgICAgaW50IHhwcnRfcmRtYV9wYWRfb3B0aW1pemUgPSAwOwogCiAjaWZkZWYgUlBDX0RFQlVHCiAKQEAgLTE0MCw2ICsxMzcsMTQgQEAKIAkJLmV4dHJhMgkJPSAmbWF4X21lbXJlZywKIAl9LAogCXsKKwkJLmN0bF9uYW1lICAgICAgID0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJyZG1hX3BhZF9vcHRpbWl6ZSIsCisJCS5kYXRhCQk9ICZ4cHJ0X3JkbWFfcGFkX29wdGltaXplLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CiAJCS5jdGxfbmFtZSA9IDAsCiAJfSwKIH07CkBAIC00NTgsNiArNDYzLDggQEAKIAlzdHJ1Y3QgcnBjcmRtYV94cHJ0ICpyX3hwcnQgPSBycGN4X3RvX3JkbWF4KHhwcnQpOwogCiAJZHByaW50aygiUlBDOiAgICAgICAlczogY2xvc2luZ1xuIiwgX19mdW5jX18pOworCWlmIChyX3hwcnQtPnJ4X2VwLnJlcF9jb25uZWN0ZWQgPiAwKQorCQl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gMDsKIAl4cHJ0X2Rpc2Nvbm5lY3RfZG9uZSh4cHJ0KTsKIAkodm9pZCkgcnBjcmRtYV9lcF9kaXNjb25uZWN0KCZyX3hwcnQtPnJ4X2VwLCAmcl94cHJ0LT5yeF9pYSk7CiB9CkBAIC00ODUsNiArNDkyLDExIEBACiAJCQkvKiBSZWNvbm5lY3QgKi8KIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcl94cHJ0LT5yZG1hX2Nvbm5lY3QsCiAJCQkJeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCk7CisJCQl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0IDw8PSAxOworCQkJaWYgKHhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPiAoMzAgKiBIWikpCisJCQkJeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCA9ICgzMCAqIEhaKTsKKwkJCWVsc2UgaWYgKHhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPCAoNSAqIEhaKSkKKwkJCQl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gKDUgKiBIWik7CiAJCX0gZWxzZSB7CiAJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJfeHBydC0+cmRtYV9jb25uZWN0LCAwKTsKIAkJCWlmICghUlBDX0lTX0FTWU5DKHRhc2spKQpAQCAtNTkxLDYgKzYwMyw3IEBACiAJfQogCWRwcmludGsoIlJQQzogICAgICAgJXM6IHNpemUgJXpkLCByZXF1ZXN0IDB4JXBcbiIsIF9fZnVuY19fLCBzaXplLCByZXEpOwogb3V0OgorCXJlcS0+cmxfY29ubmVjdF9jb29raWUgPSAwOwkvKiBvdXIgcmVzZXJ2ZWQgdmFsdWUgKi8KIAlyZXR1cm4gcmVxLT5ybF94ZHJfYnVmOwogCiBvdXRmYWlsOgpAQCAtNjk0LDEzICs3MDcsMjEgQEAKIAkJcmVxLT5ybF9yZXBseS0+cnJfeHBydCA9IHhwcnQ7CiAJfQogCi0JaWYgKHJwY3JkbWFfZXBfcG9zdCgmcl94cHJ0LT5yeF9pYSwgJnJfeHBydC0+cnhfZXAsIHJlcSkpIHsKLQkJeHBydF9kaXNjb25uZWN0X2RvbmUoeHBydCk7Ci0JCXJldHVybiAtRU5PVENPTk47CS8qIGltcGxpZXMgZGlzY29ubmVjdCAqLwotCX0KKwkvKiBNdXN0IHN1cHByZXNzIHJldHJhbnNtaXQgdG8gbWFpbnRhaW4gY3JlZGl0cyAqLworCWlmIChyZXEtPnJsX2Nvbm5lY3RfY29va2llID09IHhwcnQtPmNvbm5lY3RfY29va2llKQorCQlnb3RvIGRyb3BfY29ubmVjdGlvbjsKKwlyZXEtPnJsX2Nvbm5lY3RfY29va2llID0geHBydC0+Y29ubmVjdF9jb29raWU7CiAKKwlpZiAocnBjcmRtYV9lcF9wb3N0KCZyX3hwcnQtPnJ4X2lhLCAmcl94cHJ0LT5yeF9lcCwgcmVxKSkKKwkJZ290byBkcm9wX2Nvbm5lY3Rpb247CisKKwl0YXNrLT50a19ieXRlc19zZW50ICs9IHJxc3QtPnJxX3NuZF9idWYubGVuOwogCXJxc3QtPnJxX2J5dGVzX3NlbnQgPSAwOwogCXJldHVybiAwOworCitkcm9wX2Nvbm5lY3Rpb246CisJeHBydF9kaXNjb25uZWN0X2RvbmUoeHBydCk7CisJcmV0dXJuIC1FTk9UQ09OTjsJLyogaW1wbGllcyBkaXNjb25uZWN0ICovCiB9CiAKIHN0YXRpYyB2b2lkIHhwcnRfcmRtYV9wcmludF9zdGF0cyhzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQpAQCAtNzcwLDcgKzc5MSw3IEBACiB7CiAJaW50IHJjOwogCi0JZHByaW50aygiUlBDUkRNQSBNb2R1bGUgUmVtb3ZlZCwgZGVyZWdpc3RlciBSUEMgUkRNQSB0cmFuc3BvcnRcbiIpOworCWRwcmludGsoS0VSTl9JTkZPICJSUENSRE1BIE1vZHVsZSBSZW1vdmVkLCBkZXJlZ2lzdGVyIFJQQyBSRE1BIHRyYW5zcG9ydFxuIik7CiAjaWZkZWYgUlBDX0RFQlVHCiAJaWYgKHN1bnJwY190YWJsZV9oZWFkZXIpIHsKIAkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3VucnBjX3RhYmxlX2hlYWRlcik7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKaW5kZXggOGVhMjgzZS4uYTVmZWY1ZSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYwpAQCAtMjg0LDYgKzI4NCw3IEBACiAJc3dpdGNoIChldmVudC0+ZXZlbnQpIHsKIAljYXNlIFJETUFfQ01fRVZFTlRfQUREUl9SRVNPTFZFRDoKIAljYXNlIFJETUFfQ01fRVZFTlRfUk9VVEVfUkVTT0xWRUQ6CisJCWlhLT5yaV9hc3luY19yYyA9IDA7CiAJCWNvbXBsZXRlKCZpYS0+cmlfZG9uZSk7CiAJCWJyZWFrOwogCWNhc2UgUkRNQV9DTV9FVkVOVF9BRERSX0VSUk9SOgpAQCAtMzM4LDEzICszMzksMzIgQEAKIAkJd2FrZV91cF9hbGwoJmVwLT5yZXBfY29ubmVjdF93YWl0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJaWEtPnJpX2FzeW5jX3JjID0gLUVJTlZBTDsKLQkJZHByaW50aygiUlBDOiAgICAgICAlczogdW5leHBlY3RlZCBDTSBldmVudCAlWFxuIiwKKwkJZHByaW50aygiUlBDOiAgICAgICAlczogdW5leHBlY3RlZCBDTSBldmVudCAlZFxuIiwKIAkJCV9fZnVuY19fLCBldmVudC0+ZXZlbnQpOwotCQljb21wbGV0ZSgmaWEtPnJpX2RvbmUpOwogCQlicmVhazsKIAl9CiAKKyNpZmRlZiBSUENfREVCVUcKKwlpZiAoY29ubnN0YXRlID09IDEpIHsKKwkJaW50IGlyZCA9IGF0dHIubWF4X2Rlc3RfcmRfYXRvbWljOworCQlpbnQgdGlyZCA9IGVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzOworCQlwcmludGsoS0VSTl9JTkZPICJycGNyZG1hOiBjb25uZWN0aW9uIHRvICV1LiV1LiV1LiV1OiV1ICIKKwkJCSJvbiAlcywgbWVtcmVnICVkIHNsb3RzICVkIGlyZCAlZCVzXG4iLAorCQkJTklQUVVBRChhZGRyLT5zaW5fYWRkci5zX2FkZHIpLAorCQkJbnRvaHMoYWRkci0+c2luX3BvcnQpLAorCQkJaWEtPnJpX2lkLT5kZXZpY2UtPm5hbWUsCisJCQlpYS0+cmlfbWVtcmVnX3N0cmF0ZWd5LAorCQkJeHBydC0+cnhfYnVmLnJiX21heF9yZXF1ZXN0cywKKwkJCWlyZCwgaXJkIDwgNCAmJiBpcmQgPCB0aXJkIC8gMiA/ICIgKGxvdyEpIiA6ICIiKTsKKwl9IGVsc2UgaWYgKGNvbm5zdGF0ZSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnBjcmRtYTogY29ubmVjdGlvbiB0byAldS4ldS4ldS4ldToldSAiCisJCQkiY2xvc2VkICglZClcbiIsCisJCQlOSVBRVUFEKGFkZHItPnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhhZGRyLT5zaW5fcG9ydCksCisJCQljb25uc3RhdGUpOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM1NSw2ICszNzUsOCBAQAogCXN0cnVjdCByZG1hX2NtX2lkICppZDsKIAlpbnQgcmM7CiAKKwlpbml0X2NvbXBsZXRpb24oJmlhLT5yaV9kb25lKTsKKwogCWlkID0gcmRtYV9jcmVhdGVfaWQocnBjcmRtYV9jb25uX3VwY2FsbCwgeHBydCwgUkRNQV9QU19UQ1ApOwogCWlmIChJU19FUlIoaWQpKSB7CiAJCXJjID0gUFRSX0VSUihpZCk7CkBAIC0zNjMsMjYgKzM4NSwyOCBAQAogCQlyZXR1cm4gaWQ7CiAJfQogCi0JaWEtPnJpX2FzeW5jX3JjID0gMDsKKwlpYS0+cmlfYXN5bmNfcmMgPSAtRVRJTUVET1VUOwogCXJjID0gcmRtYV9yZXNvbHZlX2FkZHIoaWQsIE5VTEwsIGFkZHIsIFJETUFfUkVTT0xWRV9USU1FT1VUKTsKIAlpZiAocmMpIHsKIAkJZHByaW50aygiUlBDOiAgICAgICAlczogcmRtYV9yZXNvbHZlX2FkZHIoKSBmYWlsZWQgJWlcbiIsCiAJCQlfX2Z1bmNfXywgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmaWEtPnJpX2RvbmUpOworCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZpYS0+cmlfZG9uZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKFJETUFfUkVTT0xWRV9USU1FT1VUKSArIDEpOwogCXJjID0gaWEtPnJpX2FzeW5jX3JjOwogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlpYS0+cmlfYXN5bmNfcmMgPSAwOworCWlhLT5yaV9hc3luY19yYyA9IC1FVElNRURPVVQ7CiAJcmMgPSByZG1hX3Jlc29sdmVfcm91dGUoaWQsIFJETUFfUkVTT0xWRV9USU1FT1VUKTsKIAlpZiAocmMpIHsKIAkJZHByaW50aygiUlBDOiAgICAgICAlczogcmRtYV9yZXNvbHZlX3JvdXRlKCkgZmFpbGVkICVpXG4iLAogCQkJX19mdW5jX18sIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlhLT5yaV9kb25lKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmaWEtPnJpX2RvbmUsCisJCQkJbXNlY3NfdG9famlmZmllcyhSRE1BX1JFU09MVkVfVElNRU9VVCkgKyAxKTsKIAlyYyA9IGlhLT5yaV9hc3luY19yYzsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwpAQCAtNDIzLDExICs0NDcsMTAgQEAKIGludAogcnBjcmRtYV9pYV9vcGVuKHN0cnVjdCBycGNyZG1hX3hwcnQgKnhwcnQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IG1lbXJlZykKIHsKLQlpbnQgcmM7CisJaW50IHJjLCBtZW1fcHJpdjsKKwlzdHJ1Y3QgaWJfZGV2aWNlX2F0dHIgZGV2YXR0cjsKIAlzdHJ1Y3QgcnBjcmRtYV9pYSAqaWEgPSAmeHBydC0+cnhfaWE7CiAKLQlpbml0X2NvbXBsZXRpb24oJmlhLT5yaV9kb25lKTsKLQogCWlhLT5yaV9pZCA9IHJwY3JkbWFfY3JlYXRlX2lkKHhwcnQsIGlhLCBhZGRyKTsKIAlpZiAoSVNfRVJSKGlhLT5yaV9pZCkpIHsKIAkJcmMgPSBQVFJfRVJSKGlhLT5yaV9pZCk7CkBAIC00NDMsNiArNDY2LDczIEBACiAJfQogCiAJLyoKKwkgKiBRdWVyeSB0aGUgZGV2aWNlIHRvIGRldGVybWluZSBpZiB0aGUgcmVxdWVzdGVkIG1lbW9yeQorCSAqIHJlZ2lzdHJhdGlvbiBzdHJhdGVneSBpcyBzdXBwb3J0ZWQuIElmIGl0IGlzbid0LCBzZXQgdGhlCisJICogc3RyYXRlZ3kgdG8gYSBnbG9iYWxseSBzdXBwb3J0ZWQgbW9kZWwuCisJICovCisJcmMgPSBpYl9xdWVyeV9kZXZpY2UoaWEtPnJpX2lkLT5kZXZpY2UsICZkZXZhdHRyKTsKKwlpZiAocmMpIHsKKwkJZHByaW50aygiUlBDOiAgICAgICAlczogaWJfcXVlcnlfZGV2aWNlIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlpZiAoZGV2YXR0ci5kZXZpY2VfY2FwX2ZsYWdzICYgSUJfREVWSUNFX0xPQ0FMX0RNQV9MS0VZKSB7CisJCWlhLT5yaV9oYXZlX2RtYV9sa2V5ID0gMTsKKwkJaWEtPnJpX2RtYV9sa2V5ID0gaWEtPnJpX2lkLT5kZXZpY2UtPmxvY2FsX2RtYV9sa2V5OworCX0KKworCXN3aXRjaCAobWVtcmVnKSB7CisJY2FzZSBSUENSRE1BX01FTVdJTkRPV1M6CisJY2FzZSBSUENSRE1BX01FTVdJTkRPV1NfQVNZTkM6CisJCWlmICghKGRldmF0dHIuZGV2aWNlX2NhcF9mbGFncyAmIElCX0RFVklDRV9NRU1fV0lORE9XKSkgeworCQkJZHByaW50aygiUlBDOiAgICAgICAlczogTUVNV0lORE9XUyByZWdpc3RyYXRpb24gIgorCQkJCSJzcGVjaWZpZWQgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgYWRhcHRlciwgIgorCQkJCSJ1c2luZyBzbG93ZXIgUlBDUkRNQV9SRUdJU1RFUlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQltZW1yZWcgPSBSUENSRE1BX1JFR0lTVEVSOworCQl9CisJCWJyZWFrOworCWNhc2UgUlBDUkRNQV9NVEhDQUZNUjoKKwkJaWYgKCFpYS0+cmlfaWQtPmRldmljZS0+YWxsb2NfZm1yKSB7CisjaWYgUlBDUkRNQV9QRVJTSVNURU5UX1JFR0lTVFJBVElPTgorCQkJZHByaW50aygiUlBDOiAgICAgICAlczogTVRIQ0FGTVIgcmVnaXN0cmF0aW9uICIKKwkJCQkic3BlY2lmaWVkIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIsICIKKwkJCQkidXNpbmcgcmlza2llciBSUENSRE1BX0FMTFBIWVNJQ0FMXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCW1lbXJlZyA9IFJQQ1JETUFfQUxMUEhZU0lDQUw7CisjZWxzZQorCQkJZHByaW50aygiUlBDOiAgICAgICAlczogTVRIQ0FGTVIgcmVnaXN0cmF0aW9uICIKKwkJCQkic3BlY2lmaWVkIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIsICIKKwkJCQkidXNpbmcgc2xvd2VyIFJQQ1JETUFfUkVHSVNURVJcbiIsCisJCQkJX19mdW5jX18pOworCQkJbWVtcmVnID0gUlBDUkRNQV9SRUdJU1RFUjsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgUlBDUkRNQV9GUk1SOgorCQkvKiBSZXF1aXJlcyBib3RoIGZybXIgcmVnIGFuZCBsb2NhbCBkbWEgbGtleSAqLworCQlpZiAoKGRldmF0dHIuZGV2aWNlX2NhcF9mbGFncyAmCisJCSAgICAgKElCX0RFVklDRV9NRU1fTUdUX0VYVEVOU0lPTlN8SUJfREVWSUNFX0xPQ0FMX0RNQV9MS0VZKSkgIT0KKwkJICAgIChJQl9ERVZJQ0VfTUVNX01HVF9FWFRFTlNJT05TfElCX0RFVklDRV9MT0NBTF9ETUFfTEtFWSkpIHsKKyNpZiBSUENSRE1BX1BFUlNJU1RFTlRfUkVHSVNUUkFUSU9OCisJCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBGUk1SIHJlZ2lzdHJhdGlvbiAiCisJCQkJInNwZWNpZmllZCBidXQgbm90IHN1cHBvcnRlZCBieSBhZGFwdGVyLCAiCisJCQkJInVzaW5nIHJpc2tpZXIgUlBDUkRNQV9BTExQSFlTSUNBTFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQltZW1yZWcgPSBSUENSRE1BX0FMTFBIWVNJQ0FMOworI2Vsc2UKKwkJCWRwcmludGsoIlJQQzogICAgICAgJXM6IEZSTVIgcmVnaXN0cmF0aW9uICIKKwkJCQkic3BlY2lmaWVkIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIsICIKKwkJCQkidXNpbmcgc2xvd2VyIFJQQ1JETUFfUkVHSVNURVJcbiIsCisJCQkJX19mdW5jX18pOworCQkJbWVtcmVnID0gUlBDUkRNQV9SRUdJU1RFUjsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCX0KKworCS8qCiAJICogT3B0aW9uYWxseSBvYnRhaW4gYW4gdW5kZXJseWluZyBwaHlzaWNhbCBpZGVudGl0eSBtYXBwaW5nIGluCiAJICogb3JkZXIgdG8gZG8gYSBtZW1vcnkgd2luZG93LWJhc2VkIGJpbmQuIFRoaXMgYmFzZSByZWdpc3RyYXRpb24KIAkgKiBpcyBwcm90ZWN0ZWQgZnJvbSByZW1vdGUgYWNjZXNzIC0gdGhhdCBpcyBlbmFibGVkIG9ubHkgYnkgYmluZGluZwpAQCAtNDUwLDIyICs1NDAsMjggQEAKIAkgKiByZXZva2VkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBsZXRpb24gc2ltaWxhciB0byBhIHN0b3JhZ2UKIAkgKiBhZGFwdGVyLgogCSAqLwotCWlmIChtZW1yZWcgPiBSUENSRE1BX1JFR0lTVEVSKSB7Ci0JCWludCBtZW1fcHJpdiA9IElCX0FDQ0VTU19MT0NBTF9XUklURTsKLQkJc3dpdGNoIChtZW1yZWcpIHsKKwlzd2l0Y2ggKG1lbXJlZykgeworCWNhc2UgUlBDUkRNQV9CT1VOQ0VCVUZGRVJTOgorCWNhc2UgUlBDUkRNQV9SRUdJU1RFUjoKKwljYXNlIFJQQ1JETUFfRlJNUjoKKwkJYnJlYWs7CiAjaWYgUlBDUkRNQV9QRVJTSVNURU5UX1JFR0lTVFJBVElPTgotCQljYXNlIFJQQ1JETUFfQUxMUEhZU0lDQUw6Ci0JCQltZW1fcHJpdiB8PSBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFOwotCQkJbWVtX3ByaXYgfD0gSUJfQUNDRVNTX1JFTU9URV9SRUFEOwotCQkJYnJlYWs7CisJY2FzZSBSUENSRE1BX0FMTFBIWVNJQ0FMOgorCQltZW1fcHJpdiA9IElCX0FDQ0VTU19MT0NBTF9XUklURSB8CisJCQkJSUJfQUNDRVNTX1JFTU9URV9XUklURSB8CisJCQkJSUJfQUNDRVNTX1JFTU9URV9SRUFEOworCQlnb3RvIHJlZ2lzdGVyX3NldHVwOwogI2VuZGlmCi0JCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTX0FTWU5DOgotCQljYXNlIFJQQ1JETUFfTUVNV0lORE9XUzoKLQkJCW1lbV9wcml2IHw9IElCX0FDQ0VTU19NV19CSU5EOworCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTX0FTWU5DOgorCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTOgorCQltZW1fcHJpdiA9IElCX0FDQ0VTU19MT0NBTF9XUklURSB8CisJCQkJSUJfQUNDRVNTX01XX0JJTkQ7CisJCWdvdG8gcmVnaXN0ZXJfc2V0dXA7CisJY2FzZSBSUENSRE1BX01USENBRk1SOgorCQlpZiAoaWEtPnJpX2hhdmVfZG1hX2xrZXkpCiAJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9CisJCW1lbV9wcml2ID0gSUJfQUNDRVNTX0xPQ0FMX1dSSVRFOworCXJlZ2lzdGVyX3NldHVwOgogCQlpYS0+cmlfYmluZF9tZW0gPSBpYl9nZXRfZG1hX21yKGlhLT5yaV9wZCwgbWVtX3ByaXYpOwogCQlpZiAoSVNfRVJSKGlhLT5yaV9iaW5kX21lbSkpIHsKIAkJCXByaW50ayhLRVJOX0FMRVJUICIlczogaWJfZ2V0X2RtYV9tciBmb3IgIgpAQCAtNDc1LDcgKzU3MSwxNSBAQAogCQkJbWVtcmVnID0gUlBDUkRNQV9SRUdJU1RFUjsKIAkJCWlhLT5yaV9iaW5kX21lbSA9IE5VTEw7CiAJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBtZW1vcnkgcmVnaXN0cmF0aW9uIG1vZGUgJWRcbiIsCisJCQkJX19mdW5jX18sIG1lbXJlZyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQyOwogCX0KKwlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBtZW1vcnkgcmVnaXN0cmF0aW9uIHN0cmF0ZWd5IGlzICVkXG4iLAorCQlfX2Z1bmNfXywgbWVtcmVnKTsKIAogCS8qIEVsc2Ugd2lsbCBkbyBtZW1vcnkgcmVnL2RlcmVnIGZvciBlYWNoIGNodW5rICovCiAJaWEtPnJpX21lbXJlZ19zdHJhdGVneSA9IG1lbXJlZzsKQEAgLTQ4Myw2ICs1ODcsNyBAQAogCXJldHVybiAwOwogb3V0MjoKIAlyZG1hX2Rlc3Ryb3lfaWQoaWEtPnJpX2lkKTsKKwlpYS0+cmlfaWQgPSBOVUxMOwogb3V0MToKIAlyZXR1cm4gcmM7CiB9CkBAIC01MDMsMTUgKzYwOCwxNyBAQAogCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBpYl9kZXJlZ19tciByZXR1cm5lZCAlaVxuIiwKIAkJCV9fZnVuY19fLCByYyk7CiAJfQotCWlmIChpYS0+cmlfaWQgIT0gTlVMTCAmJiAhSVNfRVJSKGlhLT5yaV9pZCkgJiYgaWEtPnJpX2lkLT5xcCkKLQkJcmRtYV9kZXN0cm95X3FwKGlhLT5yaV9pZCk7CisJaWYgKGlhLT5yaV9pZCAhPSBOVUxMICYmICFJU19FUlIoaWEtPnJpX2lkKSkgeworCQlpZiAoaWEtPnJpX2lkLT5xcCkKKwkJCXJkbWFfZGVzdHJveV9xcChpYS0+cmlfaWQpOworCQlyZG1hX2Rlc3Ryb3lfaWQoaWEtPnJpX2lkKTsKKwkJaWEtPnJpX2lkID0gTlVMTDsKKwl9CiAJaWYgKGlhLT5yaV9wZCAhPSBOVUxMICYmICFJU19FUlIoaWEtPnJpX3BkKSkgewogCQlyYyA9IGliX2RlYWxsb2NfcGQoaWEtPnJpX3BkKTsKIAkJZHByaW50aygiUlBDOiAgICAgICAlczogaWJfZGVhbGxvY19wZCByZXR1cm5lZCAlaVxuIiwKIAkJCV9fZnVuY19fLCByYyk7CiAJfQotCWlmIChpYS0+cmlfaWQgIT0gTlVMTCAmJiAhSVNfRVJSKGlhLT5yaV9pZCkpCi0JCXJkbWFfZGVzdHJveV9pZChpYS0+cmlfaWQpOwogfQogCiAvKgpAQCAtNTQxLDYgKzY0OCwxMiBAQAogCWVwLT5yZXBfYXR0ci5zcnEgPSBOVUxMOwogCWVwLT5yZXBfYXR0ci5jYXAubWF4X3NlbmRfd3IgPSBjZGF0YS0+bWF4X3JlcXVlc3RzOwogCXN3aXRjaCAoaWEtPnJpX21lbXJlZ19zdHJhdGVneSkgeworCWNhc2UgUlBDUkRNQV9GUk1SOgorCQkvKiBBZGQgcm9vbSBmb3IgZnJtciByZWdpc3RlciBhbmQgaW52YWxpZGF0ZSBXUnMgKi8KKwkJZXAtPnJlcF9hdHRyLmNhcC5tYXhfc2VuZF93ciAqPSAzOworCQlpZiAoZXAtPnJlcF9hdHRyLmNhcC5tYXhfc2VuZF93ciA+IGRldmF0dHIubWF4X3FwX3dyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTX0FTWU5DOgogCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTOgogCQkvKiBBZGQgcm9vbSBmb3IgbXdfYmluZHMrdW5iaW5kcyAtIG92ZXJraWxsISAqLwpAQCAtNjE3LDI5ICs3MzAsMTMgQEAKIAllcC0+cmVwX3JlbW90ZV9jbWEucHJpdmF0ZV9kYXRhX2xlbiA9IDA7CiAKIAkvKiBDbGllbnQgb2ZmZXJzIFJETUEgUmVhZCBidXQgZG9lcyBub3QgaW5pdGlhdGUgKi8KLQlzd2l0Y2ggKGlhLT5yaV9tZW1yZWdfc3RyYXRlZ3kpIHsKLQljYXNlIFJQQ1JETUFfQk9VTkNFQlVGRkVSUzoKLQkJZXAtPnJlcF9yZW1vdGVfY21hLnJlc3BvbmRlcl9yZXNvdXJjZXMgPSAwOwotCQlicmVhazsKLQljYXNlIFJQQ1JETUFfTVRIQ0FGTVI6Ci0JY2FzZSBSUENSRE1BX1JFR0lTVEVSOgotCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlcyA9IGNkYXRhLT5tYXhfcmVxdWVzdHMgKgotCQkJCShSUENSRE1BX01BWF9EQVRBX1NFR1MgLyA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENSRE1BX01FTVdJTkRPV1M6Ci0JY2FzZSBSUENSRE1BX01FTVdJTkRPV1NfQVNZTkM6Ci0jaWYgUlBDUkRNQV9QRVJTSVNURU5UX1JFR0lTVFJBVElPTgotCWNhc2UgUlBDUkRNQV9BTExQSFlTSUNBTDoKLSNlbmRpZgotCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlcyA9IGNkYXRhLT5tYXhfcmVxdWVzdHMgKgotCQkJCShSUENSRE1BX01BWF9EQVRBX1NFR1MgLyAyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCWlmIChlcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlcyA+IGRldmF0dHIubWF4X3FwX3JkX2F0b20pCi0JCWVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzID0gZGV2YXR0ci5tYXhfcXBfcmRfYXRvbTsKIAllcC0+cmVwX3JlbW90ZV9jbWEuaW5pdGlhdG9yX2RlcHRoID0gMDsKKwlpZiAoaWEtPnJpX21lbXJlZ19zdHJhdGVneSA9PSBSUENSRE1BX0JPVU5DRUJVRkZFUlMpCisJCWVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzID0gMDsKKwllbHNlIGlmIChkZXZhdHRyLm1heF9xcF9yZF9hdG9tID4gMzIpCS8qIGFyYml0cmFyeSBidXQgPD0gMjU1ICovCisJCWVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzID0gMzI7CisJZWxzZQorCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlcyA9IGRldmF0dHIubWF4X3FwX3JkX2F0b207CiAKIAllcC0+cmVwX3JlbW90ZV9jbWEucmV0cnlfY291bnQgPSA3OwogCWVwLT5yZXBfcmVtb3RlX2NtYS5mbG93X2NvbnRyb2wgPSAwOwpAQCAtNjc5LDIxICs3NzYsMTYgQEAKIAkJaWYgKHJjKQogCQkJZHByaW50aygiUlBDOiAgICAgICAlczogcnBjcmRtYV9lcF9kaXNjb25uZWN0IgogCQkJCSIgcmV0dXJuZWQgJWlcbiIsIF9fZnVuY19fLCByYyk7CisJCXJkbWFfZGVzdHJveV9xcChpYS0+cmlfaWQpOworCQlpYS0+cmlfaWQtPnFwID0gTlVMTDsKIAl9CiAKLQllcC0+cmVwX2Z1bmMgPSBOVUxMOwotCiAJLyogcGFkZGluZyAtIGNvdWxkIGJlIGRvbmUgaW4gcnBjcmRtYV9idWZmZXJfZGVzdHJveS4uLiAqLwogCWlmIChlcC0+cmVwX3BhZF9tcikgewogCQlycGNyZG1hX2RlcmVnaXN0ZXJfaW50ZXJuYWwoaWEsIGVwLT5yZXBfcGFkX21yLCAmZXAtPnJlcF9wYWQpOwogCQllcC0+cmVwX3BhZF9tciA9IE5VTEw7CiAJfQogCi0JaWYgKGlhLT5yaV9pZC0+cXApIHsKLQkJcmRtYV9kZXN0cm95X3FwKGlhLT5yaV9pZCk7Ci0JCWlhLT5yaV9pZC0+cXAgPSBOVUxMOwotCX0KLQogCXJwY3JkbWFfY2xlYW5fY3EoZXAtPnJlcF9jcSk7CiAJcmMgPSBpYl9kZXN0cm95X2NxKGVwLT5yZXBfY3EpOwogCWlmIChyYykKQEAgLTcxMiw5ICs4MDQsOCBAQAogCXN0cnVjdCByZG1hX2NtX2lkICppZDsKIAlpbnQgcmMgPSAwOwogCWludCByZXRyeV9jb3VudCA9IDA7Ci0JaW50IHJlY29ubmVjdCA9IChlcC0+cmVwX2Nvbm5lY3RlZCAhPSAwKTsKIAotCWlmIChyZWNvbm5lY3QpIHsKKwlpZiAoZXAtPnJlcF9jb25uZWN0ZWQgIT0gMCkgewogCQlzdHJ1Y3QgcnBjcmRtYV94cHJ0ICp4cHJ0OwogcmV0cnk6CiAJCXJjID0gcnBjcmRtYV9lcF9kaXNjb25uZWN0KGVwLCBpYSk7CkBAIC03NDUsNiArODM2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCS8qIEVORCBURU1QICovCisJCXJkbWFfZGVzdHJveV9xcChpYS0+cmlfaWQpOwogCQlyZG1hX2Rlc3Ryb3lfaWQoaWEtPnJpX2lkKTsKIAkJaWEtPnJpX2lkID0gaWQ7CiAJfQpAQCAtNzY5LDE0ICs4NjEsNiBAQAogCX0KIH0KIAotCS8qIFRoZW9yZXRpY2FsbHkgYSBjbGllbnQgaW5pdGlhdG9yX2RlcHRoID4gMCBpcyBub3QgbmVlZGVkLAotCSAqIGJ1dCBtYW55IHBlZXJzIGZhaWwgdG8gY29tcGxldGUgdGhlIGNvbm5lY3Rpb24gdW5sZXNzIHRoZXkKLQkgKiA9PSByZXNwb25kZXJfcmVzb3VyY2VzISAqLwotCWlmIChlcC0+cmVwX3JlbW90ZV9jbWEuaW5pdGlhdG9yX2RlcHRoICE9Ci0JCQkJZXAtPnJlcF9yZW1vdGVfY21hLnJlc3BvbmRlcl9yZXNvdXJjZXMpCi0JCWVwLT5yZXBfcmVtb3RlX2NtYS5pbml0aWF0b3JfZGVwdGggPQotCQkJZXAtPnJlcF9yZW1vdGVfY21hLnJlc3BvbmRlcl9yZXNvdXJjZXM7Ci0KIAllcC0+cmVwX2Nvbm5lY3RlZCA9IDA7CiAKIAlyYyA9IHJkbWFfY29ubmVjdChpYS0+cmlfaWQsICZlcC0+cmVwX3JlbW90ZV9jbWEpOwpAQCAtNzg2LDkgKzg3MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChyZWNvbm5lY3QpCi0JCXJldHVybiAwOwotCiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGVwLT5yZXBfY29ubmVjdF93YWl0LCBlcC0+cmVwX2Nvbm5lY3RlZCAhPSAwKTsKIAogCS8qCkBAIC04MDUsMTQgKzg4NiwxNiBAQAogCWlmIChlcC0+cmVwX2Nvbm5lY3RlZCA8PSAwKSB7CiAJCS8qIFNvbWV0aW1lcywgdGhlIG9ubHkgd2F5IHRvIHJlbGlhYmx5IGNvbm5lY3QgdG8gcmVtb3RlCiAJCSAqIENNcyBpcyB0byB1c2Ugc2FtZSBub256ZXJvIHZhbHVlcyBmb3IgT1JEIGFuZCBJUkQuICovCi0JCWVwLT5yZXBfcmVtb3RlX2NtYS5pbml0aWF0b3JfZGVwdGggPQotCQkJCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlczsKLQkJaWYgKGVwLT5yZXBfcmVtb3RlX2NtYS5pbml0aWF0b3JfZGVwdGggPT0gMCkKLQkJCSsrZXAtPnJlcF9yZW1vdGVfY21hLmluaXRpYXRvcl9kZXB0aDsKLQkJaWYgKGVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzID09IDApCi0JCQkrK2VwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzOwotCQlpZiAocmV0cnlfY291bnQrKyA9PSAwKQorCQlpZiAocmV0cnlfY291bnQrKyA8PSBSRE1BX0NPTk5FQ1RfUkVUUllfTUFYICsgMSAmJgorCQkgICAgKGVwLT5yZXBfcmVtb3RlX2NtYS5yZXNwb25kZXJfcmVzb3VyY2VzID09IDAgfHwKKwkJICAgICBlcC0+cmVwX3JlbW90ZV9jbWEuaW5pdGlhdG9yX2RlcHRoICE9CisJCQkJZXAtPnJlcF9yZW1vdGVfY21hLnJlc3BvbmRlcl9yZXNvdXJjZXMpKSB7CisJCQlpZiAoZXAtPnJlcF9yZW1vdGVfY21hLnJlc3BvbmRlcl9yZXNvdXJjZXMgPT0gMCkKKwkJCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlcyA9IDE7CisJCQllcC0+cmVwX3JlbW90ZV9jbWEuaW5pdGlhdG9yX2RlcHRoID0KKwkJCQllcC0+cmVwX3JlbW90ZV9jbWEucmVzcG9uZGVyX3Jlc291cmNlczsKIAkJCWdvdG8gcmV0cnk7CisJCX0KIAkJcmMgPSBlcC0+cmVwX2Nvbm5lY3RlZDsKIAl9IGVsc2UgewogCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKQEAgLTg2Myw2ICs5NDYsNyBAQAogCWNoYXIgKnA7CiAJc2l6ZV90IGxlbjsKIAlpbnQgaSwgcmM7CisJc3RydWN0IHJwY3JkbWFfbXcgKnI7CiAKIAlidWYtPnJiX21heF9yZXF1ZXN0cyA9IGNkYXRhLT5tYXhfcmVxdWVzdHM7CiAJc3Bpbl9sb2NrX2luaXQoJmJ1Zi0+cmJfbG9jayk7CkBAIC04NzMsNyArOTU3LDcgQEAKIAkgKiAgIDIuICBhcnJheXMgb2Ygc3RydWN0IHJwY3JkbWFfcmVxIHRvIGZpbGwgaW4gcG9pbnRlcnMKIAkgKiAgIDMuICBhcnJheSBvZiBzdHJ1Y3QgcnBjcmRtYV9yZXAgZm9yIHJlcGxpZXMKIAkgKiAgIDQuICBwYWRkaW5nLCBpZiBhbnkKLQkgKiAgIDUuICBtdydzLCBpZiBhbnkKKwkgKiAgIDUuICBtdydzLCBmbXIncyBvciBmcm1yJ3MsIGlmIGFueQogCSAqIFNlbmQvcmVjdiBidWZmZXJzIGluIHJlcS9yZXAgbmVlZCB0byBiZSByZWdpc3RlcmVkCiAJICovCiAKQEAgLTg4MSw2ICs5NjUsMTAgQEAKIAkJKHNpemVvZihzdHJ1Y3QgcnBjcmRtYV9yZXEgKikgKyBzaXplb2Yoc3RydWN0IHJwY3JkbWFfcmVwICopKTsKIAlsZW4gKz0gY2RhdGEtPnBhZGRpbmc7CiAJc3dpdGNoIChpYS0+cmlfbWVtcmVnX3N0cmF0ZWd5KSB7CisJY2FzZSBSUENSRE1BX0ZSTVI6CisJCWxlbiArPSBidWYtPnJiX21heF9yZXF1ZXN0cyAqIFJQQ1JETUFfTUFYX1NFR1MgKgorCQkJCXNpemVvZihzdHJ1Y3QgcnBjcmRtYV9tdyk7CisJCWJyZWFrOwogCWNhc2UgUlBDUkRNQV9NVEhDQUZNUjoKIAkJLyogVEJEIHdlIGFyZSBwZXJoYXBzIG92ZXJhbGxvY2F0aW5nIGhlcmUgKi8KIAkJbGVuICs9IChidWYtPnJiX21heF9yZXF1ZXN0cyArIDEpICogUlBDUkRNQV9NQVhfU0VHUyAqCkBAIC05MjcsMTUgKzEwMTUsMzcgQEAKIAkgKiBhbmQgYWxzbyByZWR1Y2UgdW5iaW5kLXRvLWJpbmQgY29sbGlzaW9uLgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZidWYtPnJiX213cyk7CisJciA9IChzdHJ1Y3QgcnBjcmRtYV9tdyAqKXA7CiAJc3dpdGNoIChpYS0+cmlfbWVtcmVnX3N0cmF0ZWd5KSB7CisJY2FzZSBSUENSRE1BX0ZSTVI6CisJCWZvciAoaSA9IGJ1Zi0+cmJfbWF4X3JlcXVlc3RzICogUlBDUkRNQV9NQVhfU0VHUzsgaTsgaS0tKSB7CisJCQlyLT5yLmZybXIuZnJfbXIgPSBpYl9hbGxvY19mYXN0X3JlZ19tcihpYS0+cmlfcGQsCisJCQkJCQkJIFJQQ1JETUFfTUFYX1NFR1MpOworCQkJaWYgKElTX0VSUihyLT5yLmZybXIuZnJfbXIpKSB7CisJCQkJcmMgPSBQVFJfRVJSKHItPnIuZnJtci5mcl9tcik7CisJCQkJZHByaW50aygiUlBDOiAgICAgICAlczogaWJfYWxsb2NfZmFzdF9yZWdfbXIiCisJCQkJCSIgZmFpbGVkICVpXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJci0+ci5mcm1yLmZyX3BnbCA9CisJCQkJaWJfYWxsb2NfZmFzdF9yZWdfcGFnZV9saXN0KGlhLT5yaV9pZC0+ZGV2aWNlLAorCQkJCQkJCSAgICBSUENSRE1BX01BWF9TRUdTKTsKKwkJCWlmIChJU19FUlIoci0+ci5mcm1yLmZyX3BnbCkpIHsKKwkJCQlyYyA9IFBUUl9FUlIoci0+ci5mcm1yLmZyX3BnbCk7CisJCQkJZHByaW50aygiUlBDOiAgICAgICAlczogIgorCQkJCQkiaWJfYWxsb2NfZmFzdF9yZWdfcGFnZV9saXN0ICIKKwkJCQkJImZhaWxlZCAlaVxuIiwgX19mdW5jX18sIHJjKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWxpc3RfYWRkKCZyLT5td19saXN0LCAmYnVmLT5yYl9td3MpOworCQkJKytyOworCQl9CisJCWJyZWFrOwogCWNhc2UgUlBDUkRNQV9NVEhDQUZNUjoKLQkJewotCQlzdHJ1Y3QgcnBjcmRtYV9tdyAqciA9IChzdHJ1Y3QgcnBjcmRtYV9tdyAqKXA7Ci0JCXN0cnVjdCBpYl9mbXJfYXR0ciBmYSA9IHsKLQkJCVJQQ1JETUFfTUFYX0RBVEFfU0VHUywgMSwgUEFHRV9TSElGVAotCQl9OwogCQkvKiBUQkQgd2UgYXJlIHBlcmhhcHMgb3ZlcmFsbG9jYXRpbmcgaGVyZSAqLwogCQlmb3IgKGkgPSAoYnVmLT5yYl9tYXhfcmVxdWVzdHMrMSkgKiBSUENSRE1BX01BWF9TRUdTOyBpOyBpLS0pIHsKKwkJCXN0YXRpYyBzdHJ1Y3QgaWJfZm1yX2F0dHIgZmEgPQorCQkJCXsgUlBDUkRNQV9NQVhfREFUQV9TRUdTLCAxLCBQQUdFX1NISUZUIH07CiAJCQlyLT5yLmZtciA9IGliX2FsbG9jX2ZtcihpYS0+cmlfcGQsCiAJCQkJSUJfQUNDRVNTX1JFTU9URV9XUklURSB8IElCX0FDQ0VTU19SRU1PVEVfUkVBRCwKIAkJCQkmZmEpOwpAQCAtOTQ4LDEyICsxMDU4LDkgQEAKIAkJCWxpc3RfYWRkKCZyLT5td19saXN0LCAmYnVmLT5yYl9td3MpOwogCQkJKytyOwogCQl9Ci0JCX0KIAkJYnJlYWs7CiAJY2FzZSBSUENSRE1BX01FTVdJTkRPV1NfQVNZTkM6CiAJY2FzZSBSUENSRE1BX01FTVdJTkRPV1M6Ci0JCXsKLQkJc3RydWN0IHJwY3JkbWFfbXcgKnIgPSAoc3RydWN0IHJwY3JkbWFfbXcgKilwOwogCQkvKiBBbGxvY2F0ZSBvbmUgZXh0cmEgcmVxdWVzdCdzIHdvcnRoLCBmb3IgZnVsbCBjeWNsaW5nICovCiAJCWZvciAoaSA9IChidWYtPnJiX21heF9yZXF1ZXN0cysxKSAqIFJQQ1JETUFfTUFYX1NFR1M7IGk7IGktLSkgewogCQkJci0+ci5tdyA9IGliX2FsbG9jX213KGlhLT5yaV9wZCk7CkBAIC05NjYsNyArMTA3Myw2IEBACiAJCQlsaXN0X2FkZCgmci0+bXdfbGlzdCwgJmJ1Zi0+cmJfbXdzKTsKIAkJCSsrcjsKIAkJfQotCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTA0Niw2ICsxMTUyLDcgQEAKIHsKIAlpbnQgcmMsIGk7CiAJc3RydWN0IHJwY3JkbWFfaWEgKmlhID0gcmRtYWJfdG9faWEoYnVmKTsKKwlzdHJ1Y3QgcnBjcmRtYV9tdyAqcjsKIAogCS8qIGNsZWFuIHVwIGluIHJldmVyc2Ugb3JkZXIgZnJvbSBjcmVhdGUKIAkgKiAgIDEuICByZWN2IG1yIG1lbW9yeSAobXIgZnJlZSwgdGhlbiBrZnJlZSkKQEAgLTEwNjUsMTEgKzExNzIsMTkgQEAKIAkJfQogCQlpZiAoYnVmLT5yYl9zZW5kX2J1ZnMgJiYgYnVmLT5yYl9zZW5kX2J1ZnNbaV0pIHsKIAkJCXdoaWxlICghbGlzdF9lbXB0eSgmYnVmLT5yYl9td3MpKSB7Ci0JCQkJc3RydWN0IHJwY3JkbWFfbXcgKnI7CiAJCQkJciA9IGxpc3RfZW50cnkoYnVmLT5yYl9td3MubmV4dCwKIAkJCQkJc3RydWN0IHJwY3JkbWFfbXcsIG13X2xpc3QpOwogCQkJCWxpc3RfZGVsKCZyLT5td19saXN0KTsKIAkJCQlzd2l0Y2ggKGlhLT5yaV9tZW1yZWdfc3RyYXRlZ3kpIHsKKwkJCQljYXNlIFJQQ1JETUFfRlJNUjoKKwkJCQkJcmMgPSBpYl9kZXJlZ19tcihyLT5yLmZybXIuZnJfbXIpOworCQkJCQlpZiAocmMpCisJCQkJCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiIKKwkJCQkJCQkiIGliX2RlcmVnX21yIgorCQkJCQkJCSIgZmFpbGVkICVpXG4iLAorCQkJCQkJCV9fZnVuY19fLCByYyk7CisJCQkJCWliX2ZyZWVfZmFzdF9yZWdfcGFnZV9saXN0KHItPnIuZnJtci5mcl9wZ2wpOworCQkJCQlicmVhazsKIAkJCQljYXNlIFJQQ1JETUFfTVRIQ0FGTVI6CiAJCQkJCXJjID0gaWJfZGVhbGxvY19mbXIoci0+ci5mbXIpOwogCQkJCQlpZiAocmMpCkBAIC0xMTE1LDYgKzEyMzAsOCBAQAogewogCXN0cnVjdCBycGNyZG1hX3JlcSAqcmVxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc3RydWN0IHJwY3JkbWFfbXcgKnI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnVmZmVycy0+cmJfbG9jaywgZmxhZ3MpOwogCWlmIChidWZmZXJzLT5yYl9zZW5kX2luZGV4ID09IGJ1ZmZlcnMtPnJiX21heF9yZXF1ZXN0cykgewpAQCAtMTEzNSw5ICsxMjUyLDggQEAKIAl9CiAJYnVmZmVycy0+cmJfc2VuZF9idWZzW2J1ZmZlcnMtPnJiX3NlbmRfaW5kZXgrK10gPSBOVUxMOwogCWlmICghbGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfbXdzKSkgewotCQlpbnQgaSA9IFJQQ1JETUFfTUFYX1NFR1MgLSAxOworCQlpID0gUlBDUkRNQV9NQVhfU0VHUyAtIDE7CiAJCWRvIHsKLQkJCXN0cnVjdCBycGNyZG1hX213ICpyOwogCQkJciA9IGxpc3RfZW50cnkoYnVmZmVycy0+cmJfbXdzLm5leHQsCiAJCQkJCXN0cnVjdCBycGNyZG1hX213LCBtd19saXN0KTsKIAkJCWxpc3RfZGVsKCZyLT5td19saXN0KTsKQEAgLTExNzEsNiArMTI4Nyw3IEBACiAJCXJlcS0+cmxfcmVwbHkgPSBOVUxMOwogCX0KIAlzd2l0Y2ggKGlhLT5yaV9tZW1yZWdfc3RyYXRlZ3kpIHsKKwljYXNlIFJQQ1JETUFfRlJNUjoKIAljYXNlIFJQQ1JETUFfTVRIQ0FGTVI6CiAJY2FzZSBSUENSRE1BX01FTVdJTkRPV1NfQVNZTkM6CiAJY2FzZSBSUENSRE1BX01FTVdJTkRPV1M6CkBAIC0xMjUyLDcgKzEzNjksMTEgQEAKIAkJCXZhLCBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKIAlpb3YtPmxlbmd0aCA9IGxlbjsKIAotCWlmIChpYS0+cmlfYmluZF9tZW0gIT0gTlVMTCkgeworCWlmIChpYS0+cmlfaGF2ZV9kbWFfbGtleSkgeworCQkqbXJwID0gTlVMTDsKKwkJaW92LT5sa2V5ID0gaWEtPnJpX2RtYV9sa2V5OworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGlhLT5yaV9iaW5kX21lbSAhPSBOVUxMKSB7CiAJCSptcnAgPSBOVUxMOwogCQlpb3YtPmxrZXkgPSBpYS0+cmlfYmluZF9tZW0tPmxrZXk7CiAJCXJldHVybiAwOwpAQCAtMTMyOSwxNSArMTQ1MCwyOTIgQEAKIAkJCQlzZWctPm1yX2RtYSwgc2VnLT5tcl9kbWFsZW4sIHNlZy0+bXJfZGlyKTsKIH0KIAorc3RhdGljIGludAorcnBjcmRtYV9yZWdpc3Rlcl9mcm1yX2V4dGVybmFsKHN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnLAorCQkJaW50ICpuc2VncywgaW50IHdyaXRpbmcsIHN0cnVjdCBycGNyZG1hX2lhICppYSwKKwkJCXN0cnVjdCBycGNyZG1hX3hwcnQgKnJfeHBydCkKK3sKKwlzdHJ1Y3QgcnBjcmRtYV9tcl9zZWcgKnNlZzEgPSBzZWc7CisJc3RydWN0IGliX3NlbmRfd3IgZnJtcl93ciwgKmJhZF93cjsKKwl1OCBrZXk7CisJaW50IGxlbiwgcGFnZW9mZjsKKwlpbnQgaSwgcmM7CisKKwlwYWdlb2ZmID0gb2Zmc2V0X2luX3BhZ2Uoc2VnMS0+bXJfb2Zmc2V0KTsKKwlzZWcxLT5tcl9vZmZzZXQgLT0gcGFnZW9mZjsJLyogc3RhcnQgb2YgcGFnZSAqLworCXNlZzEtPm1yX2xlbiArPSBwYWdlb2ZmOworCWxlbiA9IC1wYWdlb2ZmOworCWlmICgqbnNlZ3MgPiBSUENSRE1BX01BWF9EQVRBX1NFR1MpCisJCSpuc2VncyA9IFJQQ1JETUFfTUFYX0RBVEFfU0VHUzsKKwlmb3IgKGkgPSAwOyBpIDwgKm5zZWdzOykgeworCQlycGNyZG1hX21hcF9vbmUoaWEsIHNlZywgd3JpdGluZyk7CisJCXNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfcGdsLT5wYWdlX2xpc3RbaV0gPSBzZWctPm1yX2RtYTsKKwkJbGVuICs9IHNlZy0+bXJfbGVuOworCQkrK3NlZzsKKwkJKytpOworCQkvKiBDaGVjayBmb3IgaG9sZXMgKi8KKwkJaWYgKChpIDwgKm5zZWdzICYmIG9mZnNldF9pbl9wYWdlKHNlZy0+bXJfb2Zmc2V0KSkgfHwKKwkJICAgIG9mZnNldF9pbl9wYWdlKChzZWctMSktPm1yX29mZnNldCArIChzZWctMSktPm1yX2xlbikpCisJCQlicmVhazsKKwl9CisJZHByaW50aygiUlBDOiAgICAgICAlczogVXNpbmcgZnJtciAlcCB0byBtYXAgJWQgc2VnbWVudHNcbiIsCisJCV9fZnVuY19fLCBzZWcxLT5tcl9jaHVuay5ybF9tdywgaSk7CisKKwkvKiBCdW1wIHRoZSBrZXkgKi8KKwlrZXkgPSAodTgpKHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfbXItPnJrZXkgJiAweDAwMDAwMEZGKTsKKwlpYl91cGRhdGVfZmFzdF9yZWdfa2V5KHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfbXIsICsra2V5KTsKKworCS8qIFByZXBhcmUgRlJNUiBXUiAqLworCW1lbXNldCgmZnJtcl93ciwgMCwgc2l6ZW9mIGZybXJfd3IpOworCWZybXJfd3Iub3Bjb2RlID0gSUJfV1JfRkFTVF9SRUdfTVI7CisJZnJtcl93ci5zZW5kX2ZsYWdzID0gMDsJCQkvKiB1bnNpZ25hbGVkICovCisJZnJtcl93ci53ci5mYXN0X3JlZy5pb3ZhX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpc2VnMS0+bXJfZG1hOworCWZybXJfd3Iud3IuZmFzdF9yZWcucGFnZV9saXN0ID0gc2VnMS0+bXJfY2h1bmsucmxfbXctPnIuZnJtci5mcl9wZ2w7CisJZnJtcl93ci53ci5mYXN0X3JlZy5wYWdlX2xpc3RfbGVuID0gaTsKKwlmcm1yX3dyLndyLmZhc3RfcmVnLnBhZ2Vfc2hpZnQgPSBQQUdFX1NISUZUOworCWZybXJfd3Iud3IuZmFzdF9yZWcubGVuZ3RoID0gaSA8PCBQQUdFX1NISUZUOworCWZybXJfd3Iud3IuZmFzdF9yZWcuYWNjZXNzX2ZsYWdzID0gKHdyaXRpbmcgPworCQkJCUlCX0FDQ0VTU19SRU1PVEVfV1JJVEUgOiBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpOworCWZybXJfd3Iud3IuZmFzdF9yZWcucmtleSA9IHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfbXItPnJrZXk7CisJREVDUl9DUUNPVU5UKCZyX3hwcnQtPnJ4X2VwKTsKKworCXJjID0gaWJfcG9zdF9zZW5kKGlhLT5yaV9pZC0+cXAsICZmcm1yX3dyLCAmYmFkX3dyKTsKKworCWlmIChyYykgeworCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBmYWlsZWQgaWJfcG9zdF9zZW5kIGZvciByZWdpc3RlciwiCisJCQkiIHN0YXR1cyAlaVxuIiwgX19mdW5jX18sIHJjKTsKKwkJd2hpbGUgKGktLSkKKwkJCXJwY3JkbWFfdW5tYXBfb25lKGlhLCAtLXNlZyk7CisJfSBlbHNlIHsKKwkJc2VnMS0+bXJfcmtleSA9IHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfbXItPnJrZXk7CisJCXNlZzEtPm1yX2Jhc2UgPSBzZWcxLT5tcl9kbWEgKyBwYWdlb2ZmOworCQlzZWcxLT5tcl9uc2VncyA9IGk7CisJCXNlZzEtPm1yX2xlbiA9IGxlbjsKKwl9CisJKm5zZWdzID0gaTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3JwY3JkbWFfZGVyZWdpc3Rlcl9mcm1yX2V4dGVybmFsKHN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnLAorCQkJc3RydWN0IHJwY3JkbWFfaWEgKmlhLCBzdHJ1Y3QgcnBjcmRtYV94cHJ0ICpyX3hwcnQpCit7CisJc3RydWN0IHJwY3JkbWFfbXJfc2VnICpzZWcxID0gc2VnOworCXN0cnVjdCBpYl9zZW5kX3dyIGludmFsaWRhdGVfd3IsICpiYWRfd3I7CisJaW50IHJjOworCisJd2hpbGUgKHNlZzEtPm1yX25zZWdzLS0pCisJCXJwY3JkbWFfdW5tYXBfb25lKGlhLCBzZWcrKyk7CisKKwltZW1zZXQoJmludmFsaWRhdGVfd3IsIDAsIHNpemVvZiBpbnZhbGlkYXRlX3dyKTsKKwlpbnZhbGlkYXRlX3dyLm9wY29kZSA9IElCX1dSX0xPQ0FMX0lOVjsKKwlpbnZhbGlkYXRlX3dyLnNlbmRfZmxhZ3MgPSAwOwkJCS8qIHVuc2lnbmFsZWQgKi8KKwlpbnZhbGlkYXRlX3dyLmV4LmludmFsaWRhdGVfcmtleSA9IHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZybXIuZnJfbXItPnJrZXk7CisJREVDUl9DUUNPVU5UKCZyX3hwcnQtPnJ4X2VwKTsKKworCXJjID0gaWJfcG9zdF9zZW5kKGlhLT5yaV9pZC0+cXAsICZpbnZhbGlkYXRlX3dyLCAmYmFkX3dyKTsKKwlpZiAocmMpCisJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9wb3N0X3NlbmQgZm9yIGludmFsaWRhdGUsIgorCQkJIiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX3JlZ2lzdGVyX2Ztcl9leHRlcm5hbChzdHJ1Y3QgcnBjcmRtYV9tcl9zZWcgKnNlZywKKwkJCWludCAqbnNlZ3MsIGludCB3cml0aW5nLCBzdHJ1Y3QgcnBjcmRtYV9pYSAqaWEpCit7CisJc3RydWN0IHJwY3JkbWFfbXJfc2VnICpzZWcxID0gc2VnOworCXU2NCBwaHlzYWRkcnNbUlBDUkRNQV9NQVhfREFUQV9TRUdTXTsKKwlpbnQgbGVuLCBwYWdlb2ZmLCBpLCByYzsKKworCXBhZ2VvZmYgPSBvZmZzZXRfaW5fcGFnZShzZWcxLT5tcl9vZmZzZXQpOworCXNlZzEtPm1yX29mZnNldCAtPSBwYWdlb2ZmOwkvKiBzdGFydCBvZiBwYWdlICovCisJc2VnMS0+bXJfbGVuICs9IHBhZ2VvZmY7CisJbGVuID0gLXBhZ2VvZmY7CisJaWYgKCpuc2VncyA+IFJQQ1JETUFfTUFYX0RBVEFfU0VHUykKKwkJKm5zZWdzID0gUlBDUkRNQV9NQVhfREFUQV9TRUdTOworCWZvciAoaSA9IDA7IGkgPCAqbnNlZ3M7KSB7CisJCXJwY3JkbWFfbWFwX29uZShpYSwgc2VnLCB3cml0aW5nKTsKKwkJcGh5c2FkZHJzW2ldID0gc2VnLT5tcl9kbWE7CisJCWxlbiArPSBzZWctPm1yX2xlbjsKKwkJKytzZWc7CisJCSsraTsKKwkJLyogQ2hlY2sgZm9yIGhvbGVzICovCisJCWlmICgoaSA8ICpuc2VncyAmJiBvZmZzZXRfaW5fcGFnZShzZWctPm1yX29mZnNldCkpIHx8CisJCSAgICBvZmZzZXRfaW5fcGFnZSgoc2VnLTEpLT5tcl9vZmZzZXQgKyAoc2VnLTEpLT5tcl9sZW4pKQorCQkJYnJlYWs7CisJfQorCXJjID0gaWJfbWFwX3BoeXNfZm1yKHNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZtciwKKwkJCQlwaHlzYWRkcnMsIGksIHNlZzEtPm1yX2RtYSk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9tYXBfcGh5c19mbXIgIgorCQkJIiV1QDB4JWxseCslaSAoJWQpLi4uIHN0YXR1cyAlaVxuIiwgX19mdW5jX18sCisJCQlsZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpc2VnMS0+bXJfZG1hLAorCQkJcGFnZW9mZiwgaSwgcmMpOworCQl3aGlsZSAoaS0tKQorCQkJcnBjcmRtYV91bm1hcF9vbmUoaWEsIC0tc2VnKTsKKwl9IGVsc2UgeworCQlzZWcxLT5tcl9ya2V5ID0gc2VnMS0+bXJfY2h1bmsucmxfbXctPnIuZm1yLT5ya2V5OworCQlzZWcxLT5tcl9iYXNlID0gc2VnMS0+bXJfZG1hICsgcGFnZW9mZjsKKwkJc2VnMS0+bXJfbnNlZ3MgPSBpOworCQlzZWcxLT5tcl9sZW4gPSBsZW47CisJfQorCSpuc2VncyA9IGk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX2RlcmVnaXN0ZXJfZm1yX2V4dGVybmFsKHN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnLAorCQkJc3RydWN0IHJwY3JkbWFfaWEgKmlhKQoreworCXN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnMSA9IHNlZzsKKwlMSVNUX0hFQUQobCk7CisJaW50IHJjOworCisJbGlzdF9hZGQoJnNlZzEtPm1yX2NodW5rLnJsX213LT5yLmZtci0+bGlzdCwgJmwpOworCXJjID0gaWJfdW5tYXBfZm1yKCZsKTsKKwl3aGlsZSAoc2VnMS0+bXJfbnNlZ3MtLSkKKwkJcnBjcmRtYV91bm1hcF9vbmUoaWEsIHNlZysrKTsKKwlpZiAocmMpCisJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl91bm1hcF9mbXIsIgorCQkJIiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX3JlZ2lzdGVyX21lbXdpbl9leHRlcm5hbChzdHJ1Y3QgcnBjcmRtYV9tcl9zZWcgKnNlZywKKwkJCWludCAqbnNlZ3MsIGludCB3cml0aW5nLCBzdHJ1Y3QgcnBjcmRtYV9pYSAqaWEsCisJCQlzdHJ1Y3QgcnBjcmRtYV94cHJ0ICpyX3hwcnQpCit7CisJaW50IG1lbV9wcml2ID0gKHdyaXRpbmcgPyBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFIDoKKwkJCQkgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCk7CisJc3RydWN0IGliX213X2JpbmQgcGFyYW07CisJaW50IHJjOworCisJKm5zZWdzID0gMTsKKwlycGNyZG1hX21hcF9vbmUoaWEsIHNlZywgd3JpdGluZyk7CisJcGFyYW0ubXIgPSBpYS0+cmlfYmluZF9tZW07CisJcGFyYW0ud3JfaWQgPSAwVUxMOwkvKiBubyBzZW5kIGNvb2tpZSAqLworCXBhcmFtLmFkZHIgPSBzZWctPm1yX2RtYTsKKwlwYXJhbS5sZW5ndGggPSBzZWctPm1yX2xlbjsKKwlwYXJhbS5zZW5kX2ZsYWdzID0gMDsKKwlwYXJhbS5td19hY2Nlc3NfZmxhZ3MgPSBtZW1fcHJpdjsKKworCURFQ1JfQ1FDT1VOVCgmcl94cHJ0LT5yeF9lcCk7CisJcmMgPSBpYl9iaW5kX213KGlhLT5yaV9pZC0+cXAsIHNlZy0+bXJfY2h1bmsucmxfbXctPnIubXcsICZwYXJhbSk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9iaW5kX213ICIKKwkJCSIldUAweCVsbHggc3RhdHVzICVpXG4iLAorCQkJX19mdW5jX18sIHNlZy0+bXJfbGVuLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWctPm1yX2RtYSwgcmMpOworCQlycGNyZG1hX3VubWFwX29uZShpYSwgc2VnKTsKKwl9IGVsc2UgeworCQlzZWctPm1yX3JrZXkgPSBzZWctPm1yX2NodW5rLnJsX213LT5yLm13LT5ya2V5OworCQlzZWctPm1yX2Jhc2UgPSBwYXJhbS5hZGRyOworCQlzZWctPm1yX25zZWdzID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX2RlcmVnaXN0ZXJfbWVtd2luX2V4dGVybmFsKHN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnLAorCQkJc3RydWN0IHJwY3JkbWFfaWEgKmlhLAorCQkJc3RydWN0IHJwY3JkbWFfeHBydCAqcl94cHJ0LCB2b2lkICoqcikKK3sKKwlzdHJ1Y3QgaWJfbXdfYmluZCBwYXJhbTsKKwlMSVNUX0hFQUQobCk7CisJaW50IHJjOworCisJQlVHX09OKHNlZy0+bXJfbnNlZ3MgIT0gMSk7CisJcGFyYW0ubXIgPSBpYS0+cmlfYmluZF9tZW07CisJcGFyYW0uYWRkciA9IDBVTEw7CS8qIHVuYmluZCAqLworCXBhcmFtLmxlbmd0aCA9IDA7CisJcGFyYW0ubXdfYWNjZXNzX2ZsYWdzID0gMDsKKwlpZiAoKnIpIHsKKwkJcGFyYW0ud3JfaWQgPSAodTY0KSAodW5zaWduZWQgbG9uZykgKnI7CisJCXBhcmFtLnNlbmRfZmxhZ3MgPSBJQl9TRU5EX1NJR05BTEVEOworCQlJTklUX0NRQ09VTlQoJnJfeHBydC0+cnhfZXApOworCX0gZWxzZSB7CisJCXBhcmFtLndyX2lkID0gMFVMTDsKKwkJcGFyYW0uc2VuZF9mbGFncyA9IDA7CisJCURFQ1JfQ1FDT1VOVCgmcl94cHJ0LT5yeF9lcCk7CisJfQorCXJjID0gaWJfYmluZF9tdyhpYS0+cmlfaWQtPnFwLCBzZWctPm1yX2NodW5rLnJsX213LT5yLm13LCAmcGFyYW0pOworCXJwY3JkbWFfdW5tYXBfb25lKGlhLCBzZWcpOworCWlmIChyYykKKwkJZHByaW50aygiUlBDOiAgICAgICAlczogZmFpbGVkIGliXyh1biliaW5kX213LCIKKwkJCSIgc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgcmMpOworCWVsc2UKKwkJKnIgPSBOVUxMOwkvKiB3aWxsIHVwY2FsbCBvbiBjb21wbGV0aW9uICovCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX3JlZ2lzdGVyX2RlZmF1bHRfZXh0ZXJuYWwoc3RydWN0IHJwY3JkbWFfbXJfc2VnICpzZWcsCisJCQlpbnQgKm5zZWdzLCBpbnQgd3JpdGluZywgc3RydWN0IHJwY3JkbWFfaWEgKmlhKQoreworCWludCBtZW1fcHJpdiA9ICh3cml0aW5nID8gSUJfQUNDRVNTX1JFTU9URV9XUklURSA6CisJCQkJICBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpOworCXN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnMSA9IHNlZzsKKwlzdHJ1Y3QgaWJfcGh5c19idWYgaXBiW1JQQ1JETUFfTUFYX0RBVEFfU0VHU107CisJaW50IGxlbiwgaSwgcmMgPSAwOworCisJaWYgKCpuc2VncyA+IFJQQ1JETUFfTUFYX0RBVEFfU0VHUykKKwkJKm5zZWdzID0gUlBDUkRNQV9NQVhfREFUQV9TRUdTOworCWZvciAobGVuID0gMCwgaSA9IDA7IGkgPCAqbnNlZ3M7KSB7CisJCXJwY3JkbWFfbWFwX29uZShpYSwgc2VnLCB3cml0aW5nKTsKKwkJaXBiW2ldLmFkZHIgPSBzZWctPm1yX2RtYTsKKwkJaXBiW2ldLnNpemUgPSBzZWctPm1yX2xlbjsKKwkJbGVuICs9IHNlZy0+bXJfbGVuOworCQkrK3NlZzsKKwkJKytpOworCQkvKiBDaGVjayBmb3IgaG9sZXMgKi8KKwkJaWYgKChpIDwgKm5zZWdzICYmIG9mZnNldF9pbl9wYWdlKHNlZy0+bXJfb2Zmc2V0KSkgfHwKKwkJICAgIG9mZnNldF9pbl9wYWdlKChzZWctMSktPm1yX29mZnNldCsoc2VnLTEpLT5tcl9sZW4pKQorCQkJYnJlYWs7CisJfQorCXNlZzEtPm1yX2Jhc2UgPSBzZWcxLT5tcl9kbWE7CisJc2VnMS0+bXJfY2h1bmsucmxfbXIgPSBpYl9yZWdfcGh5c19tcihpYS0+cmlfcGQsCisJCQkJaXBiLCBpLCBtZW1fcHJpdiwgJnNlZzEtPm1yX2Jhc2UpOworCWlmIChJU19FUlIoc2VnMS0+bXJfY2h1bmsucmxfbXIpKSB7CisJCXJjID0gUFRSX0VSUihzZWcxLT5tcl9jaHVuay5ybF9tcik7CisJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9yZWdfcGh5c19tciAiCisJCQkiJXVAMHglbGx4ICglZCkuLi4gc3RhdHVzICVpXG4iLAorCQkJX19mdW5jX18sIGxlbiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VnMS0+bXJfZG1hLCBpLCByYyk7CisJCXdoaWxlIChpLS0pCisJCQlycGNyZG1hX3VubWFwX29uZShpYSwgLS1zZWcpOworCX0gZWxzZSB7CisJCXNlZzEtPm1yX3JrZXkgPSBzZWcxLT5tcl9jaHVuay5ybF9tci0+cmtleTsKKwkJc2VnMS0+bXJfbnNlZ3MgPSBpOworCQlzZWcxLT5tcl9sZW4gPSBsZW47CisJfQorCSpuc2VncyA9IGk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitycGNyZG1hX2RlcmVnaXN0ZXJfZGVmYXVsdF9leHRlcm5hbChzdHJ1Y3QgcnBjcmRtYV9tcl9zZWcgKnNlZywKKwkJCXN0cnVjdCBycGNyZG1hX2lhICppYSkKK3sKKwlzdHJ1Y3QgcnBjcmRtYV9tcl9zZWcgKnNlZzEgPSBzZWc7CisJaW50IHJjOworCisJcmMgPSBpYl9kZXJlZ19tcihzZWcxLT5tcl9jaHVuay5ybF9tcik7CisJc2VnMS0+bXJfY2h1bmsucmxfbXIgPSBOVUxMOworCXdoaWxlIChzZWcxLT5tcl9uc2Vncy0tKQorCQlycGNyZG1hX3VubWFwX29uZShpYSwgc2VnKyspOworCWlmIChyYykKKwkJZHByaW50aygiUlBDOiAgICAgICAlczogZmFpbGVkIGliX2RlcmVnX21yLCIKKwkJCSIgc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgcmMpOworCXJldHVybiByYzsKK30KKwogaW50CiBycGNyZG1hX3JlZ2lzdGVyX2V4dGVybmFsKHN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnLAogCQkJaW50IG5zZWdzLCBpbnQgd3JpdGluZywgc3RydWN0IHJwY3JkbWFfeHBydCAqcl94cHJ0KQogewogCXN0cnVjdCBycGNyZG1hX2lhICppYSA9ICZyX3hwcnQtPnJ4X2lhOwotCWludCBtZW1fcHJpdiA9ICh3cml0aW5nID8gSUJfQUNDRVNTX1JFTU9URV9XUklURSA6Ci0JCQkJICBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpOwotCXN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnMSA9IHNlZzsKLQlpbnQgaTsKIAlpbnQgcmMgPSAwOwogCiAJc3dpdGNoIChpYS0+cmlfbWVtcmVnX3N0cmF0ZWd5KSB7CkBAIC0xMzUyLDExNCArMTc1MCwyNSBAQAogCQlicmVhazsKICNlbmRpZgogCi0JLyogUmVnaXN0cmF0aW9uIHVzaW5nIGZhc3QgbWVtb3J5IHJlZ2lzdHJhdGlvbiAqLworCS8qIFJlZ2lzdHJhdGlvbiB1c2luZyBmcm1yIHJlZ2lzdHJhdGlvbiAqLworCWNhc2UgUlBDUkRNQV9GUk1SOgorCQlyYyA9IHJwY3JkbWFfcmVnaXN0ZXJfZnJtcl9leHRlcm5hbChzZWcsICZuc2Vncywgd3JpdGluZywgaWEsIHJfeHBydCk7CisJCWJyZWFrOworCisJLyogUmVnaXN0cmF0aW9uIHVzaW5nIGZtciBtZW1vcnkgcmVnaXN0cmF0aW9uICovCiAJY2FzZSBSUENSRE1BX01USENBRk1SOgotCQl7Ci0JCXU2NCBwaHlzYWRkcnNbUlBDUkRNQV9NQVhfREFUQV9TRUdTXTsKLQkJaW50IGxlbiwgcGFnZW9mZiA9IG9mZnNldF9pbl9wYWdlKHNlZy0+bXJfb2Zmc2V0KTsKLQkJc2VnMS0+bXJfb2Zmc2V0IC09IHBhZ2VvZmY7CS8qIHN0YXJ0IG9mIHBhZ2UgKi8KLQkJc2VnMS0+bXJfbGVuICs9IHBhZ2VvZmY7Ci0JCWxlbiA9IC1wYWdlb2ZmOwotCQlpZiAobnNlZ3MgPiBSUENSRE1BX01BWF9EQVRBX1NFR1MpCi0JCQluc2VncyA9IFJQQ1JETUFfTUFYX0RBVEFfU0VHUzsKLQkJZm9yIChpID0gMDsgaSA8IG5zZWdzOykgewotCQkJcnBjcmRtYV9tYXBfb25lKGlhLCBzZWcsIHdyaXRpbmcpOwotCQkJcGh5c2FkZHJzW2ldID0gc2VnLT5tcl9kbWE7Ci0JCQlsZW4gKz0gc2VnLT5tcl9sZW47Ci0JCQkrK3NlZzsKLQkJCSsraTsKLQkJCS8qIENoZWNrIGZvciBob2xlcyAqLwotCQkJaWYgKChpIDwgbnNlZ3MgJiYgb2Zmc2V0X2luX3BhZ2Uoc2VnLT5tcl9vZmZzZXQpKSB8fAotCQkJICAgIG9mZnNldF9pbl9wYWdlKChzZWctMSktPm1yX29mZnNldCsoc2VnLTEpLT5tcl9sZW4pKQotCQkJCWJyZWFrOwotCQl9Ci0JCW5zZWdzID0gaTsKLQkJcmMgPSBpYl9tYXBfcGh5c19mbXIoc2VnMS0+bXJfY2h1bmsucmxfbXctPnIuZm1yLAotCQkJCQlwaHlzYWRkcnMsIG5zZWdzLCBzZWcxLT5tcl9kbWEpOwotCQlpZiAocmMpIHsKLQkJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9tYXBfcGh5c19mbXIgIgotCQkJCSIldUAweCVsbHgrJWkgKCVkKS4uLiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLAotCQkJCWxlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWcxLT5tcl9kbWEsCi0JCQkJcGFnZW9mZiwgbnNlZ3MsIHJjKTsKLQkJCXdoaWxlIChuc2Vncy0tKQotCQkJCXJwY3JkbWFfdW5tYXBfb25lKGlhLCAtLXNlZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWcxLT5tcl9ya2V5ID0gc2VnMS0+bXJfY2h1bmsucmxfbXctPnIuZm1yLT5ya2V5OwotCQkJc2VnMS0+bXJfYmFzZSA9IHNlZzEtPm1yX2RtYSArIHBhZ2VvZmY7Ci0JCQlzZWcxLT5tcl9uc2VncyA9IG5zZWdzOwotCQkJc2VnMS0+bXJfbGVuID0gbGVuOwotCQl9Ci0JCX0KKwkJcmMgPSBycGNyZG1hX3JlZ2lzdGVyX2Ztcl9leHRlcm5hbChzZWcsICZuc2Vncywgd3JpdGluZywgaWEpOwogCQlicmVhazsKIAogCS8qIFJlZ2lzdHJhdGlvbiB1c2luZyBtZW1vcnkgd2luZG93cyAqLwogCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTX0FTWU5DOgogCWNhc2UgUlBDUkRNQV9NRU1XSU5ET1dTOgotCQl7Ci0JCXN0cnVjdCBpYl9td19iaW5kIHBhcmFtOwotCQlycGNyZG1hX21hcF9vbmUoaWEsIHNlZywgd3JpdGluZyk7Ci0JCXBhcmFtLm1yID0gaWEtPnJpX2JpbmRfbWVtOwotCQlwYXJhbS53cl9pZCA9IDBVTEw7CS8qIG5vIHNlbmQgY29va2llICovCi0JCXBhcmFtLmFkZHIgPSBzZWctPm1yX2RtYTsKLQkJcGFyYW0ubGVuZ3RoID0gc2VnLT5tcl9sZW47Ci0JCXBhcmFtLnNlbmRfZmxhZ3MgPSAwOwotCQlwYXJhbS5td19hY2Nlc3NfZmxhZ3MgPSBtZW1fcHJpdjsKLQotCQlERUNSX0NRQ09VTlQoJnJfeHBydC0+cnhfZXApOwotCQlyYyA9IGliX2JpbmRfbXcoaWEtPnJpX2lkLT5xcCwKLQkJCQkJc2VnLT5tcl9jaHVuay5ybF9tdy0+ci5tdywgJnBhcmFtKTsKLQkJaWYgKHJjKSB7Ci0JCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBmYWlsZWQgaWJfYmluZF9tdyAiCi0JCQkJIiV1QDB4JWxseCBzdGF0dXMgJWlcbiIsCi0JCQkJX19mdW5jX18sIHNlZy0+bXJfbGVuLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VnLT5tcl9kbWEsIHJjKTsKLQkJCXJwY3JkbWFfdW5tYXBfb25lKGlhLCBzZWcpOwotCQl9IGVsc2UgewotCQkJc2VnLT5tcl9ya2V5ID0gc2VnLT5tcl9jaHVuay5ybF9tdy0+ci5tdy0+cmtleTsKLQkJCXNlZy0+bXJfYmFzZSA9IHBhcmFtLmFkZHI7Ci0JCQlzZWctPm1yX25zZWdzID0gMTsKLQkJCW5zZWdzID0gMTsKLQkJfQotCQl9CisJCXJjID0gcnBjcmRtYV9yZWdpc3Rlcl9tZW13aW5fZXh0ZXJuYWwoc2VnLCAmbnNlZ3MsIHdyaXRpbmcsIGlhLCByX3hwcnQpOwogCQlicmVhazsKIAogCS8qIERlZmF1bHQgcmVnaXN0cmF0aW9uIGVhY2ggdGltZSAqLwogCWRlZmF1bHQ6Ci0JCXsKLQkJc3RydWN0IGliX3BoeXNfYnVmIGlwYltSUENSRE1BX01BWF9EQVRBX1NFR1NdOwotCQlpbnQgbGVuID0gMDsKLQkJaWYgKG5zZWdzID4gUlBDUkRNQV9NQVhfREFUQV9TRUdTKQotCQkJbnNlZ3MgPSBSUENSRE1BX01BWF9EQVRBX1NFR1M7Ci0JCWZvciAoaSA9IDA7IGkgPCBuc2VnczspIHsKLQkJCXJwY3JkbWFfbWFwX29uZShpYSwgc2VnLCB3cml0aW5nKTsKLQkJCWlwYltpXS5hZGRyID0gc2VnLT5tcl9kbWE7Ci0JCQlpcGJbaV0uc2l6ZSA9IHNlZy0+bXJfbGVuOwotCQkJbGVuICs9IHNlZy0+bXJfbGVuOwotCQkJKytzZWc7Ci0JCQkrK2k7Ci0JCQkvKiBDaGVjayBmb3IgaG9sZXMgKi8KLQkJCWlmICgoaSA8IG5zZWdzICYmIG9mZnNldF9pbl9wYWdlKHNlZy0+bXJfb2Zmc2V0KSkgfHwKLQkJCSAgICBvZmZzZXRfaW5fcGFnZSgoc2VnLTEpLT5tcl9vZmZzZXQrKHNlZy0xKS0+bXJfbGVuKSkKLQkJCQlicmVhazsKLQkJfQotCQluc2VncyA9IGk7Ci0JCXNlZzEtPm1yX2Jhc2UgPSBzZWcxLT5tcl9kbWE7Ci0JCXNlZzEtPm1yX2NodW5rLnJsX21yID0gaWJfcmVnX3BoeXNfbXIoaWEtPnJpX3BkLAotCQkJCQlpcGIsIG5zZWdzLCBtZW1fcHJpdiwgJnNlZzEtPm1yX2Jhc2UpOwotCQlpZiAoSVNfRVJSKHNlZzEtPm1yX2NodW5rLnJsX21yKSkgewotCQkJcmMgPSBQVFJfRVJSKHNlZzEtPm1yX2NodW5rLnJsX21yKTsKLQkJCWRwcmludGsoIlJQQzogICAgICAgJXM6IGZhaWxlZCBpYl9yZWdfcGh5c19tciAiCi0JCQkJIiV1QDB4JWxseCAoJWQpLi4uIHN0YXR1cyAlaVxuIiwKLQkJCQlfX2Z1bmNfXywgbGVuLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VnMS0+bXJfZG1hLCBuc2VncywgcmMpOwotCQkJd2hpbGUgKG5zZWdzLS0pCi0JCQkJcnBjcmRtYV91bm1hcF9vbmUoaWEsIC0tc2VnKTsKLQkJfSBlbHNlIHsKLQkJCXNlZzEtPm1yX3JrZXkgPSBzZWcxLT5tcl9jaHVuay5ybF9tci0+cmtleTsKLQkJCXNlZzEtPm1yX25zZWdzID0gbnNlZ3M7Ci0JCQlzZWcxLT5tcl9sZW4gPSBsZW47Ci0JCX0KLQkJfQorCQlyYyA9IHJwY3JkbWFfcmVnaXN0ZXJfZGVmYXVsdF9leHRlcm5hbChzZWcsICZuc2Vncywgd3JpdGluZywgaWEpOwogCQlicmVhazsKIAl9CiAJaWYgKHJjKQpAQCAtMTQ3Myw3ICsxNzgyLDYgQEAKIAkJc3RydWN0IHJwY3JkbWFfeHBydCAqcl94cHJ0LCB2b2lkICpyKQogewogCXN0cnVjdCBycGNyZG1hX2lhICppYSA9ICZyX3hwcnQtPnJ4X2lhOwotCXN0cnVjdCBycGNyZG1hX21yX3NlZyAqc2VnMSA9IHNlZzsKIAlpbnQgbnNlZ3MgPSBzZWctPm1yX25zZWdzLCByYzsKIAogCXN3aXRjaCAoaWEtPnJpX21lbXJlZ19zdHJhdGVneSkgewpAQCAtMTQ4Niw1NiArMTc5NCwyMSBAQAogCQlicmVhazsKICNlbmRpZgogCisJY2FzZSBSUENSRE1BX0ZSTVI6CisJCXJjID0gcnBjcmRtYV9kZXJlZ2lzdGVyX2ZybXJfZXh0ZXJuYWwoc2VnLCBpYSwgcl94cHJ0KTsKKwkJYnJlYWs7CisKIAljYXNlIFJQQ1JETUFfTVRIQ0FGTVI6Ci0JCXsKLQkJTElTVF9IRUFEKGwpOwotCQlsaXN0X2FkZCgmc2VnLT5tcl9jaHVuay5ybF9tdy0+ci5mbXItPmxpc3QsICZsKTsKLQkJcmMgPSBpYl91bm1hcF9mbXIoJmwpOwotCQl3aGlsZSAoc2VnMS0+bXJfbnNlZ3MtLSkKLQkJCXJwY3JkbWFfdW5tYXBfb25lKGlhLCBzZWcrKyk7Ci0JCX0KLQkJaWYgKHJjKQotCQkJZHByaW50aygiUlBDOiAgICAgICAlczogZmFpbGVkIGliX3VubWFwX2ZtciwiCi0JCQkJIiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCByYyk7CisJCXJjID0gcnBjcmRtYV9kZXJlZ2lzdGVyX2Ztcl9leHRlcm5hbChzZWcsIGlhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJQQ1JETUFfTUVNV0lORE9XU19BU1lOQzoKIAljYXNlIFJQQ1JETUFfTUVNV0lORE9XUzoKLQkJewotCQlzdHJ1Y3QgaWJfbXdfYmluZCBwYXJhbTsKLQkJQlVHX09OKG5zZWdzICE9IDEpOwotCQlwYXJhbS5tciA9IGlhLT5yaV9iaW5kX21lbTsKLQkJcGFyYW0uYWRkciA9IDBVTEw7CS8qIHVuYmluZCAqLwotCQlwYXJhbS5sZW5ndGggPSAwOwotCQlwYXJhbS5td19hY2Nlc3NfZmxhZ3MgPSAwOwotCQlpZiAocikgewotCQkJcGFyYW0ud3JfaWQgPSAodTY0KSAodW5zaWduZWQgbG9uZykgcjsKLQkJCXBhcmFtLnNlbmRfZmxhZ3MgPSBJQl9TRU5EX1NJR05BTEVEOwotCQkJSU5JVF9DUUNPVU5UKCZyX3hwcnQtPnJ4X2VwKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmFtLndyX2lkID0gMFVMTDsKLQkJCXBhcmFtLnNlbmRfZmxhZ3MgPSAwOwotCQkJREVDUl9DUUNPVU5UKCZyX3hwcnQtPnJ4X2VwKTsKLQkJfQotCQlyYyA9IGliX2JpbmRfbXcoaWEtPnJpX2lkLT5xcCwKLQkJCQlzZWctPm1yX2NodW5rLnJsX213LT5yLm13LCAmcGFyYW0pOwotCQlycGNyZG1hX3VubWFwX29uZShpYSwgc2VnKTsKLQkJfQotCQlpZiAocmMpCi0JCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBmYWlsZWQgaWJfKHVuKWJpbmRfbXcsIgotCQkJCSIgc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgcmMpOwotCQllbHNlCi0JCQlyID0gTlVMTDsJLyogd2lsbCB1cGNhbGwgb24gY29tcGxldGlvbiAqLworCQlyYyA9IHJwY3JkbWFfZGVyZWdpc3Rlcl9tZW13aW5fZXh0ZXJuYWwoc2VnLCBpYSwgcl94cHJ0LCAmcik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmMgPSBpYl9kZXJlZ19tcihzZWcxLT5tcl9jaHVuay5ybF9tcik7Ci0JCXNlZzEtPm1yX2NodW5rLnJsX21yID0gTlVMTDsKLQkJd2hpbGUgKHNlZzEtPm1yX25zZWdzLS0pCi0JCQlycGNyZG1hX3VubWFwX29uZShpYSwgc2VnKyspOwotCQlpZiAocmMpCi0JCQlkcHJpbnRrKCJSUEM6ICAgICAgICVzOiBmYWlsZWQgaWJfZGVyZWdfbXIsIgotCQkJCSIgc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgcmMpOworCQlyYyA9IHJwY3JkbWFfZGVyZWdpc3Rlcl9kZWZhdWx0X2V4dGVybmFsKHNlZywgaWEpOwogCQlicmVhazsKIAl9CiAJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmggYi9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oCmluZGV4IDI0Mjc4MjIuLmM3YTdlYmEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmgKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS94cHJ0X3JkbWEuaApAQCAtNTEsNiArNTEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcmRtYS5oPiAJLyogUlBDL1JETUEgcHJvdG9jb2wgKi8KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveHBydHJkbWEuaD4gCS8qIHhwcnQgcGFyYW1ldGVycyAqLwogCisjZGVmaW5lIFJETUFfUkVTT0xWRV9USU1FT1VUCSg1MDAwKQkvKiA1IHNlY29uZHMgKi8KKyNkZWZpbmUgUkRNQV9DT05ORUNUX1JFVFJZX01BWAkoMikJLyogcmV0cmllcyBpZiBubyBsaXN0ZW5lciBiYWNrbG9nICovCisKIC8qCiAgKiBJbnRlcmZhY2UgQWRhcHRlciAtLSBvbmUgcGVyIHRyYW5zcG9ydCBpbnN0YW5jZQogICovCkBAIC01OCw2ICs2MSw4IEBACiAJc3RydWN0IHJkbWFfY21faWQgCSpyaV9pZDsKIAlzdHJ1Y3QgaWJfcGQJCSpyaV9wZDsKIAlzdHJ1Y3QgaWJfbXIJCSpyaV9iaW5kX21lbTsKKwl1MzIJCQlyaV9kbWFfbGtleTsKKwlpbnQJCQlyaV9oYXZlX2RtYV9sa2V5OwogCXN0cnVjdCBjb21wbGV0aW9uCXJpX2RvbmU7CiAJaW50CQkJcmlfYXN5bmNfcmM7CiAJZW51bSBycGNyZG1hX21lbXJlZwlyaV9tZW1yZWdfc3RyYXRlZ3k7CkBAIC0xNTYsNiArMTYxLDEwIEBACiAJCQl1bmlvbiB7CiAJCQkJc3RydWN0IGliX213CSptdzsKIAkJCQlzdHJ1Y3QgaWJfZm1yCSpmbXI7CisJCQkJc3RydWN0IHsKKwkJCQkJc3RydWN0IGliX2Zhc3RfcmVnX3BhZ2VfbGlzdCAqZnJfcGdsOworCQkJCQlzdHJ1Y3QgaWJfbXIgKmZyX21yOworCQkJCX0gZnJtcjsKIAkJCX0gcjsKIAkJCXN0cnVjdCBsaXN0X2hlYWQgbXdfbGlzdDsKIAkJfSAqcmxfbXc7CkBAIC0xNzUsNiArMTg0LDcgQEAKIAlzaXplX3QgCQlybF9zaXplOwkvKiBhY3R1YWwgbGVuZ3RoIG9mIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGludAlybF9uaW92czsJLyogMCwgMiBvciA0ICovCiAJdW5zaWduZWQgaW50CXJsX25jaHVua3M7CS8qIG5vbi16ZXJvIGlmIGNodW5rcyAqLworCXVuc2lnbmVkIGludAlybF9jb25uZWN0X2Nvb2tpZTsJLyogcmV0cnkgZGV0ZWN0aW9uICovCiAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpybF9idWZmZXI7IC8qIGhvbWUgYmFzZSBmb3IgdGhpcyBzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgcnBjcmRtYV9yZXAJKnJsX3JlcGx5Oy8qIGhvbGRlciBmb3IgcmVwbHkgYnVmZmVyICovCiAJc3RydWN0IHJwY3JkbWFfbXJfc2VnIHJsX3NlZ21lbnRzW1JQQ1JETUFfTUFYX1NFR1NdOy8qIGNodW5rIHNlZ21lbnRzICovCkBAIC0xOTgsNyArMjA4LDcgQEAKIAlhdG9taWNfdAlyYl9jcmVkaXRzOwkvKiBtb3N0IHJlY2VudCBzZXJ2ZXIgY3JlZGl0cyAqLwogCXVuc2lnbmVkIGxvbmcJcmJfY3duZHNjYWxlOwkvKiBjYWNoZWQgZnJhbWV3b3JrIHJwY19jd25kc2NhbGUgKi8KIAlpbnQJCXJiX21heF9yZXF1ZXN0czsvKiBjbGllbnQgbWF4IHJlcXVlc3RzICovCi0Jc3RydWN0IGxpc3RfaGVhZCByYl9td3M7CS8qIG9wdGlvbmFsIG1lbW9yeSB3aW5kb3dzL2ZtcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJiX213czsJLyogb3B0aW9uYWwgbWVtb3J5IHdpbmRvd3MvZm1ycy9mcm1ycyAqLwogCWludAkJcmJfc2VuZF9pbmRleDsKIAlzdHJ1Y3QgcnBjcmRtYV9yZXEJKipyYl9zZW5kX2J1ZnM7CiAJaW50CQlyYl9yZWN2X2luZGV4OwpAQCAtMjczLDYgKzI4MywxMSBAQAogI2RlZmluZSBycGN4X3RvX3JkbWF4KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgcnBjcmRtYV94cHJ0LCB4cHJ0KQogI2RlZmluZSBycGN4X3RvX3JkbWFkKHgpIChycGN4X3RvX3JkbWF4KHgpLT5yeF9kYXRhKQogCisvKiBTZXR0aW5nIHRoaXMgdG8gMCBlbnN1cmVzIGludGVyb3BlcmFiaWxpdHkgd2l0aCBlYXJseSBzZXJ2ZXJzLgorICogU2V0dGluZyB0aGlzIHRvIDEgZW5oYW5jZXMgY2VydGFpbiB1bmFsaWduZWQgcmVhZC93cml0ZSBwZXJmb3JtYW5jZS4KKyAqIERlZmF1bHQgaXMgMCwgc2VlIHN5c2N0bCBlbnRyeSBhbmQgcnBjX3JkbWEuYyBycGNyZG1hX2NvbnZlcnRfaW92cygpICovCitleHRlcm4gaW50IHhwcnRfcmRtYV9wYWRfb3B0aW1pemU7CisKIC8qCiAgKiBJbnRlcmZhY2UgQWRhcHRlciBjYWxscyAtIHhwcnRyZG1hL3ZlcmJzLmMKICAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0c29jay5jIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCmluZGV4IDQ0ODZjNTkuLjlhMjg4ZDUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHNvY2suYworKysgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKQEAgLTMsOCArMyw4IEBACiAgKgogICogQ2xpZW50LXNpZGUgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIGZvciBzb2NrZXRzLgogICoKLSAqIFRDUCBjYWxsYmFjayByYWNlcyBmaXhlcyAoQykgMTk5OCBSZWQgSGF0IFNvZnR3YXJlIDxhbGFuQHJlZGhhdC5jb20+Ci0gKiBUQ1Agc2VuZCBmaXhlcyAoQykgMTk5OCBSZWQgSGF0IFNvZnR3YXJlIDxhbGFuQHJlZGhhdC5jb20+CisgKiBUQ1AgY2FsbGJhY2sgcmFjZXMgZml4ZXMgKEMpIDE5OTggUmVkIEhhdAorICogVENQIHNlbmQgZml4ZXMgKEMpIDE5OTggUmVkIEhhdAogICogVENQIE5GUyByZWxhdGVkIHJlYWQgKyB3cml0ZSBmaXhlcwogICogIChDKSAxOTk5IERhdmUgQWlybGllLCBVbml2ZXJzaXR5IG9mIExpbWVyaWNrLCBJcmVsYW5kIDxhaXJsaWVkQGxpbnV4LmllPgogICoKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCAwMTU2MDZiLi5jNjQ3YWFiIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE5FVDQ6CUltcGxlbWVudGF0aW9uIG9mIEJTRCBVbml4IGRvbWFpbiBzb2NrZXRzLgogICoKLSAqIEF1dGhvcnM6CUFsYW4gQ294LCA8YWxhbi5jb3hAbGludXgub3JnPgorICogQXV0aG9yczoJQWxhbiBDb3gsIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgogICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCA4MzNiMDI0Li43ZDgyYmUwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMTQsNiArMTQsMzggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIFdJUkVMRVNTX09MRF9SRUdVTEFUT1JZCisJYm9vbCAiT2xkIHdpcmVsZXNzIHN0YXRpYyByZWd1bGF0b3J5IGRlZmluaXRpb25zIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIG9sZCBzdGF0aWMgcmVndWxhdG9yeSBpbmZvcm1hdGlvbgorCSAgYW5kIHVzZXMgaXQgd2l0aGluIHRoZSBuZXcgZnJhbWV3b3JrLiBUaGlzIGlzIGF2YWlsYWJsZQorCSAgdGVtcG9yYXJpbHkgYXMgYW4gb3B0aW9uIHRvIGhlbHAgcHJldmVudCBpbW1lZGlhdGUgaXNzdWVzCisJICBkdWUgdG8gdGhlIHN3aXRjaCB0byB0aGUgbmV3IHJlZ3VsYXRvcnkgZnJhbWV3b3JrIHdoaWNoCisJICBkb2VzIHJlcXVpcmUgYSBuZXcgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHdoaWNoIGhhcyB0aGUKKwkgIGRhdGFiYXNlIG9mIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKENSREEpIGFuZCBhbm90aGVyIGZvcgorCSAgc2V0dGluZyByZWd1bGF0b3J5IGRvbWFpbnMgKGl3KS4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOgorCisJICBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL1JlZ3VsYXRvcnkvQ1JEQQorCSAgaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vdXNlcnMvRG9jdW1lbnRhdGlvbi9pdworCisJICBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aG91Z2ggdGhhdCBpZiB5b3UgKmRvKiBoYXZlIENSREEgcHJlc2VudAorCSAgYW5kIGlmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgQ1JEQSAqd2lsbCogYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUKKwkgIHJlZ3VsYXRvcnkgZG9tYWluIChmb3IgVVMgYW5kIEpQIG9ubHkpLiBTdXBwb3J0IGZvciBsZXR0aW5nIHRoZSB1c2VyCisJICBzZXQgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIHRocm91Z2ggaXcgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgb3B0aW9uCisJICBtYWlubHkgZXhpc3RzIHRvIGxlYXZlIGFyb3VuZCBmb3IgYSBrZXJuZWwgcmVsZWFzZSBzb21lIG9sZCBzdGF0aWMKKwkgIHJlZ3VsYXRvcnkgZG9tYWlucyB0aGF0IHdlcmUgZGVmaW5lZCBhbmQgdG8ga2VlcCBhcm91bmQgdGhlIG9sZAorCSAgaWVlZTgwMjExX3JlZ2RvbSBtb2R1bGUgcGFyYW1ldGVyLiBUaGlzIGlzIGJlaW5nIHBoYXNlZCBvdXQgYW5kIHlvdQorCSAgc2hvdWxkIHN0b3AgdXNpbmcgdGhlbSBBU0FQLgorCisJICBTYXkgTiB1bmxlc3MgeW91IGNhbm5vdCBpbnN0YWxsIGEgbmV3IHVzZXJzcGFjZSBhcHBsaWNhdGlvbgorCSAgb3IgaGF2ZSBvbmUgY3VycmVudGx5IGRlcGVuZGluZyBvbiB0aGUgaWVlZTgwMjExX3JlZ2RvbSBtb2R1bGUKKwkgIHBhcmFtZXRlciBhbmQgY2Fubm90IHBvcnQgaXQgdG8gdXNlIHRoZSBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMuCisKKwkgIFRoaXMgaXMgc2NoZWR1bGVkIGZvciByZW1vdmFsIGZvciAyLjYuMjkuCisKIGNvbmZpZyBXSVJFTEVTU19FWFQKIAlib29sICJXaXJlbGVzcyBleHRlbnNpb25zIgogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggZjFkYTBiOS4uNTAzMWRiNyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIGxpbnV4IHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgogICoKLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3CQlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICogQ29weXJpZ2h0IDIwMDYtMjAwOAkJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaWYuaD4KQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJubDgwMjExLmgiCiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgInN5c2ZzLmgiCisjaW5jbHVkZSAicmVnLmgiCiAKIC8qIG5hbWUgZm9yIHN5c2ZzLCAlZCBpcyBhcHBlbmRlZCAqLwogI2RlZmluZSBQSFlfTkFNRSAicGh5IgpAQCAtMzIsNyArMzMsNiBAQAogICogb2Z0ZW4gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGl0IGZvciBlYWNoIGNvbW1hbmQgKi8KIExJU1RfSEVBRChjZmc4MDIxMV9kcnZfbGlzdCk7CiBERUZJTkVfTVVURVgoY2ZnODAyMTFfZHJ2X211dGV4KTsKLXN0YXRpYyBpbnQgd2lwaHlfY291bnRlcjsKIAogLyogZm9yIGRlYnVnZnMgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppZWVlODAyMTFfZGVidWdmc19kaXI7CkBAIC0xODQsNyArMTg0LDggQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlpZiAoIWRlYnVnZnNfcmVuYW1lKHJkZXYtPndpcGh5LmRlYnVnZnNkaXItPmRfcGFyZW50LAorCWlmIChyZGV2LT53aXBoeS5kZWJ1Z2ZzZGlyICYmCisJICAgICFkZWJ1Z2ZzX3JlbmFtZShyZGV2LT53aXBoeS5kZWJ1Z2ZzZGlyLT5kX3BhcmVudCwKIAkJCSAgICByZGV2LT53aXBoeS5kZWJ1Z2ZzZGlyLAogCQkJICAgIHJkZXYtPndpcGh5LmRlYnVnZnNkaXItPmRfcGFyZW50LAogCQkJICAgIG5ld25hbWUpKQpAQCAtMjA0LDYgKzIwNSw4IEBACiAKIHN0cnVjdCB3aXBoeSAqd2lwaHlfbmV3KHN0cnVjdCBjZmc4MDIxMV9vcHMgKm9wcywgaW50IHNpemVvZl9wcml2KQogeworCXN0YXRpYyBpbnQgd2lwaHlfY291bnRlcjsKKwogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2OwogCWludCBhbGxvY19zaXplOwogCkBAIC0yMjAsMjEgKzIyMywxOCBAQAogCiAJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKIAotCWRydi0+aWR4ID0gd2lwaHlfY291bnRlcjsKLQotCS8qIG5vdyBpbmNyZWFzZSBjb3VudGVyIGZvciB0aGUgbmV4dCBkZXZpY2UgdW5sZXNzCi0JICogaXQgaGFzIHdyYXBwZWQgcHJldmlvdXNseSAqLwotCWlmICh3aXBoeV9jb3VudGVyID49IDApCi0JCXdpcGh5X2NvdW50ZXIrKzsKLQotCW11dGV4X3VubG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwlkcnYtPmlkeCA9IHdpcGh5X2NvdW50ZXIrKzsKIAogCWlmICh1bmxpa2VseShkcnYtPmlkeCA8IDApKSB7CisJCXdpcGh5X2NvdW50ZXItLTsKKwkJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOwogCQkvKiB1Z2gsIHdyYXBwZWQhICovCiAJCWtmcmVlKGRydik7CiAJCXJldHVybiBOVUxMOwogCX0KIAorCW11dGV4X3VubG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwogCS8qIGdpdmUgaXQgYSBwcm9wZXIgbmFtZSAqLwogCXNucHJpbnRmKGRydi0+d2lwaHkuZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCiAJCSBQSFlfTkFNRSAiJWQiLCBkcnYtPmlkeCk7CkBAIC0yNTksNiArMjU5LDEzIEBACiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJYm9vbCBoYXZlX2JhbmQgPSBmYWxzZTsKIAlpbnQgaTsKKwl1MTYgaWZtb2RlcyA9IHdpcGh5LT5pbnRlcmZhY2VfbW9kZXM7CisKKwkvKiBzYW5pdHkgY2hlY2sgaWZtb2RlcyAqLworCVdBUk5fT04oIWlmbW9kZXMpOworCWlmbW9kZXMgJj0gKCgxIDw8IF9fTkw4MDIxMV9JRlRZUEVfQUZURVJfTEFTVCkgLSAxKSAmIH4xOworCWlmIChXQVJOX09OKGlmbW9kZXMgIT0gd2lwaHktPmludGVyZmFjZV9tb2RlcykpCisJCXdpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBpZm1vZGVzOwogCiAJLyogc2FuaXR5IGNoZWNrIHN1cHBvcnRlZCBiYW5kcy9jaGFubmVscyAqLwogCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBiYW5kKyspIHsKQEAgLTI5NSw3ICszMDIsOSBAQAogCWllZWU4MDIxMV9zZXRfYml0cmF0ZV9mbGFncyh3aXBoeSk7CiAKIAkvKiBzZXQgdXAgcmVndWxhdG9yeSBpbmZvICovCi0Jd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkod2lwaHkpOworCW11dGV4X2xvY2soJmNmZzgwMjExX3JlZ19tdXRleCk7CisJd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkod2lwaHksIFJFR0RPTV9TRVRfQllfQ09SRSk7CisJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9yZWdfbXV0ZXgpOwogCiAJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKIApAQCAtMzA5LDYgKzMxOCw4IEBACiAJZHJ2LT53aXBoeS5kZWJ1Z2ZzZGlyID0KIAkJZGVidWdmc19jcmVhdGVfZGlyKHdpcGh5X25hbWUoJmRydi0+d2lwaHkpLAogCQkJCSAgIGllZWU4MDIxMV9kZWJ1Z2ZzX2Rpcik7CisJaWYgKElTX0VSUihkcnYtPndpcGh5LmRlYnVnZnNkaXIpKQorCQlkcnYtPndpcGh5LmRlYnVnZnNkaXIgPSBOVUxMOwogCiAJcmVzID0gMDsKIG91dF91bmxvY2s6CkBAIC0zNzMsNiArMzg0LDggQEAKIAogCXJkZXYgPSB3aXBoeV90b19kZXYoZGV2LT5pZWVlODAyMTFfcHRyLT53aXBoeSk7CiAKKwlXQVJOX09OKGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKTsKKwogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIE5FVERFVl9SRUdJU1RFUjoKIAkJbXV0ZXhfbG9jaygmcmRldi0+ZGV2bGlzdF9tdHgpOwpAQCAtNDA0LDcgKzQxNyw5IEBACiAKIHN0YXRpYyBpbnQgY2ZnODAyMTFfaW5pdCh2b2lkKQogewotCWludCBlcnIgPSB3aXBoeV9zeXNmc19pbml0KCk7CisJaW50IGVycjsKKworCWVyciA9IHdpcGh5X3N5c2ZzX2luaXQoKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mYWlsX3N5c2ZzOwogCkBAIC00MTgsOCArNDMzLDE0IEBACiAKIAlpZWVlODAyMTFfZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImllZWU4MDIxMSIsIE5VTEwpOwogCisJZXJyID0gcmVndWxhdG9yeV9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbF9yZWc7CisKIAlyZXR1cm4gMDsKIAorb3V0X2ZhaWxfcmVnOgorCWRlYnVnZnNfcmVtb3ZlKGllZWU4MDIxMV9kZWJ1Z2ZzX2Rpcik7CiBvdXRfZmFpbF9ubDgwMjExOgogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXIpOwogb3V0X2ZhaWxfbm90aWZpZXI6CkBAIC00MjcsNiArNDQ4LDcgQEAKIG91dF9mYWlsX3N5c2ZzOgogCXJldHVybiBlcnI7CiB9CisKIHN1YnN5c19pbml0Y2FsbChjZmc4MDIxMV9pbml0KTsKIAogc3RhdGljIHZvaWQgY2ZnODAyMTFfZXhpdCh2b2lkKQpAQCAtNDM1LDUgKzQ1Nyw2IEBACiAJbmw4MDIxMV9leGl0KCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmNmZzgwMjExX25ldGRldl9ub3RpZmllcik7CiAJd2lwaHlfc3lzZnNfZXhpdCgpOworCXJlZ3VsYXRvcnlfZXhpdCgpOwogfQogbW9kdWxlX2V4aXQoY2ZnODAyMTFfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5oIGIvbmV0L3dpcmVsZXNzL2NvcmUuaAppbmRleCA3YTAyYzM1Li43NzFjYzVjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5oCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTc5LDYgKzc5LDYgQEAKIAkJCSAgICAgICBjaGFyICpuZXduYW1lKTsKIAogdm9pZCBpZWVlODAyMTFfc2V0X2JpdHJhdGVfZmxhZ3Moc3RydWN0IHdpcGh5ICp3aXBoeSk7Ci12b2lkIHdpcGh5X3VwZGF0ZV9yZWd1bGF0b3J5KHN0cnVjdCB3aXBoeSAqd2lwaHkpOwordm9pZCB3aXBoeV91cGRhdGVfcmVndWxhdG9yeShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBlbnVtIHJlZ19zZXRfYnkgc2V0YnkpOwogCiAjZW5kaWYgLyogX19ORVRfV0lSRUxFU1NfQ09SRV9IICovCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCA1OWViMmNmLi41NzI3OTNjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAibmw4MDIxMS5oIgorI2luY2x1ZGUgInJlZy5oIgogCiAvKiB0aGUgbmV0bGluayBmYW1pbHkgKi8KIHN0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgbmw4MDIxMV9mYW0gPSB7CkBAIC04Nyw2ICs4OCwxNiBAQAogCVtOTDgwMjExX0FUVFJfTUVTSF9JRF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKIAkJCQkubGVuID0gSUVFRTgwMjExX01BWF9NRVNIX0lEX0xFTiB9LAogCVtOTDgwMjExX0FUVFJfTVBBVEhfTkVYVF9IT1BdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKworCVtOTDgwMjExX0FUVFJfUkVHX0FMUEhBMl0gPSB7IC50eXBlID0gTkxBX1NUUklORywgLmxlbiA9IDIgfSwKKwlbTkw4MDIxMV9BVFRSX1JFR19SVUxFU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCisJW05MODAyMTFfQVRUUl9CU1NfQ1RTX1BST1RdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbTkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUVdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCisJW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCQkgLmxlbiA9IE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4gfSwKIH07CiAKIC8qIG1lc3NhZ2UgYnVpbGRpbmcgaGVscGVyICovCkBAIC0xMDYsMTAgKzExNywxMiBAQAogCXN0cnVjdCBubGF0dHIgKm5sX2JhbmRzLCAqbmxfYmFuZDsKIAlzdHJ1Y3QgbmxhdHRyICpubF9mcmVxcywgKm5sX2ZyZXE7CiAJc3RydWN0IG5sYXR0ciAqbmxfcmF0ZXMsICpubF9yYXRlOworCXN0cnVjdCBubGF0dHIgKm5sX21vZGVzOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOwogCWludCBpOworCXUxNiBpZm1vZGVzID0gZGV2LT53aXBoeS5pbnRlcmZhY2VfbW9kZXM7CiAKIAloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIHBpZCwgc2VxLCBmbGFncywgTkw4MDIxMV9DTURfTkVXX1dJUEhZKTsKIAlpZiAoIWhkcikKQEAgLTExOCw2ICsxMzEsMjAgQEAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgZGV2LT5pZHgpOwogCU5MQV9QVVRfU1RSSU5HKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsIHdpcGh5X25hbWUoJmRldi0+d2lwaHkpKTsKIAorCW5sX21vZGVzID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfU1VQUE9SVEVEX0lGVFlQRVMpOworCWlmICghbmxfbW9kZXMpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaSA9IDA7CisJd2hpbGUgKGlmbW9kZXMpIHsKKwkJaWYgKGlmbW9kZXMgJiAxKQorCQkJTkxBX1BVVF9GTEFHKG1zZywgaSk7CisJCWlmbW9kZXMgPj49IDE7CisJCWkrKzsKKwl9CisKKwlubGFfbmVzdF9lbmQobXNnLCBubF9tb2Rlcyk7CisKIAlubF9iYW5kcyA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0JBTkRTKTsKIAlpZiAoIW5sX2JhbmRzKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTI3Miw3ICsyOTksNyBAQAogCiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgZGV2LT5pZmluZGV4KTsKIAlOTEFfUFVUX1NUUklORyhtc2csIE5MODAyMTFfQVRUUl9JRk5BTUUsIGRldi0+bmFtZSk7Ci0JLyogVE9ETzogaW50ZXJmYWNlIHR5cGUgKi8KKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRlRZUEUsIGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlKTsKIAlyZXR1cm4gZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAgbmxhX3B1dF9mYWlsdXJlOgpAQCAtMzkxLDQwICs0MTgsNTYgQEAKIAlpbnQgZXJyLCBpZmluZGV4OwogCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXUzMiBmbGFnczsKKwl1MzIgX2ZsYWdzLCAqZmxhZ3MgPSBOVUxMOwogCiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAotCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUZUWVBFXSkgewotCQl0eXBlID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0lGVFlQRV0pOwotCQlpZiAodHlwZSA+IE5MODAyMTFfSUZUWVBFX01BWCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWVyciA9IGdldF9kcnZfZGV2X2J5X2luZm9faWZpbmRleChpbmZvLT5hdHRycywgJmRydiwgJmRldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlpZmluZGV4ID0gZGV2LT5pZmluZGV4OworCXR5cGUgPSBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZTsKIAlkZXZfcHV0KGRldik7CiAKLQlpZiAoIWRydi0+b3BzLT5jaGFuZ2VfdmlydHVhbF9pbnRmKSB7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0lGVFlQRV0pIHsKKwkJdHlwZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRlRZUEVdKTsKKwkJaWYgKHR5cGUgPiBOTDgwMjExX0lGVFlQRV9NQVgpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoIWRydi0+b3BzLT5jaGFuZ2VfdmlydHVhbF9pbnRmIHx8CisJICAgICEoZHJ2LT53aXBoeS5pbnRlcmZhY2VfbW9kZXMgJiAoMSA8PCB0eXBlKSkpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKLQkgICAgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX01FU0hfSURdKSB7CisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX0lEXSkgeworCQlpZiAodHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byB1bmxvY2s7CisJCX0KIAkJcGFyYW1zLm1lc2hfaWQgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9JRF0pOwogCQlwYXJhbXMubWVzaF9pZF9sZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX0lEXSk7CiAJfQogCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NTlRSX0ZMQUdTXSkgeworCQlpZiAodHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byB1bmxvY2s7CisJCX0KKwkJZXJyID0gcGFyc2VfbW9uaXRvcl9mbGFncyhpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTU5UUl9GTEFHU10sCisJCQkJCSAgJl9mbGFncyk7CisJCWlmICghZXJyKQorCQkJZmxhZ3MgPSAmX2ZsYWdzOworCX0KIAlydG5sX2xvY2soKTsKLQllcnIgPSBwYXJzZV9tb25pdG9yX2ZsYWdzKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiA/Ci0JCQkJICBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTU5UUl9GTEFHU10gOiBOVUxMLAotCQkJCSAgJmZsYWdzKTsKIAllcnIgPSBkcnYtPm9wcy0+Y2hhbmdlX3ZpcnR1YWxfaW50ZigmZHJ2LT53aXBoeSwgaWZpbmRleCwKLQkJCQkJICAgIHR5cGUsIGVyciA/IE5VTEwgOiAmZmxhZ3MsICZwYXJhbXMpOworCQkJCQkgICAgdHlwZSwgZmxhZ3MsICZwYXJhbXMpOworCisJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgaWZpbmRleCk7CisJV0FSTl9PTighZGV2IHx8ICghZXJyICYmIGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IHR5cGUpKTsKKwogCXJ0bmxfdW5sb2NrKCk7CiAKICB1bmxvY2s6CkBAIC00NTUsNyArNDk4LDggQEAKIAlpZiAoSVNfRVJSKGRydikpCiAJCXJldHVybiBQVFJfRVJSKGRydik7CiAKLQlpZiAoIWRydi0+b3BzLT5hZGRfdmlydHVhbF9pbnRmKSB7CisJaWYgKCFkcnYtPm9wcy0+YWRkX3ZpcnR1YWxfaW50ZiB8fAorCSAgICAhKGRydi0+d2lwaHkuaW50ZXJmYWNlX21vZGVzICYgKDEgPDwgdHlwZSkpKSB7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIHVubG9jazsKIAl9CkBAIC0xMTI1LDYgKzExNjksMTAgQEAKIAkJcGFyYW1zLmxpc3Rlbl9pbnRlcnZhbCA9CiAJCSAgICBubGFfZ2V0X3UxNihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pOwogCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSkKKwkJcGFyYW1zLmh0X2NhcGEgPQorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKTsKKwogCWlmIChwYXJzZV9zdGF0aW9uX2ZsYWdzKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TVEFfRkxBR1NdLAogCQkJCSZwYXJhbXMuc3RhdGlvbl9mbGFncykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE4OCw2ICsxMjM2LDkgQEAKIAlwYXJhbXMubGlzdGVuX2ludGVydmFsID0KIAkJbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKTsKIAlwYXJhbXMuYWlkID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9BSURdKTsKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKQorCQlwYXJhbXMuaHRfY2FwYSA9CisJCQlubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pOwogCiAJaWYgKHBhcnNlX3N0YXRpb25fZmxhZ3MoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9GTEFHU10sCiAJCQkJJnBhcmFtcy5zdGF0aW9uX2ZsYWdzKSkKQEAgLTE1MjUsNiArMTU3NiwxODMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc2V0X2JzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2OworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYnNzX3BhcmFtZXRlcnMgcGFyYW1zOworCisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKwkvKiBkZWZhdWx0IHRvIG5vdCBjaGFuZ2luZyBwYXJhbWV0ZXJzICovCisJcGFyYW1zLnVzZV9jdHNfcHJvdCA9IC0xOworCXBhcmFtcy51c2Vfc2hvcnRfcHJlYW1ibGUgPSAtMTsKKwlwYXJhbXMudXNlX3Nob3J0X3Nsb3RfdGltZSA9IC0xOworCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CU1NfQ1RTX1BST1RdKQorCQlwYXJhbXMudXNlX2N0c19wcm90ID0KKwkJICAgIG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JTU19DVFNfUFJPVF0pOworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQlNTX1NIT1JUX1BSRUFNQkxFXSkKKwkJcGFyYW1zLnVzZV9zaG9ydF9wcmVhbWJsZSA9CisJCSAgICBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CU1NfU0hPUlRfUFJFQU1CTEVdKTsKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JTU19TSE9SVF9TTE9UX1RJTUVdKQorCQlwYXJhbXMudXNlX3Nob3J0X3Nsb3RfdGltZSA9CisJCSAgICBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CU1NfU0hPUlRfU0xPVF9USU1FXSk7CisKKwllcnIgPSBnZXRfZHJ2X2Rldl9ieV9pbmZvX2lmaW5kZXgoaW5mby0+YXR0cnMsICZkcnYsICZkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIWRydi0+b3BzLT5jaGFuZ2VfYnNzKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlydG5sX2xvY2soKTsKKwllcnIgPSBkcnYtPm9wcy0+Y2hhbmdlX2JzcygmZHJ2LT53aXBoeSwgZGV2LCAmcGFyYW1zKTsKKwlydG5sX3VubG9jaygpOworCisgb3V0OgorCWNmZzgwMjExX3B1dF9kZXYoZHJ2KTsKKwlkZXZfcHV0KGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CisJcmVnX3J1bGVfcG9saWN5W05MODAyMTFfUkVHX1JVTEVfQVRUUl9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfRU5EXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9NQVhfQlddCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IHBhcnNlX3JlZ19ydWxlKHN0cnVjdCBubGF0dHIgKnRiW10sCisJc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcmVnX3J1bGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmVxX3JhbmdlICpmcmVxX3JhbmdlID0gJnJlZ19ydWxlLT5mcmVxX3JhbmdlOworCXN0cnVjdCBpZWVlODAyMTFfcG93ZXJfcnVsZSAqcG93ZXJfcnVsZSA9ICZyZWdfcnVsZS0+cG93ZXJfcnVsZTsKKworCWlmICghdGJbTkw4MDIxMV9BVFRSX1JFR19SVUxFX0ZMQUdTXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0YltOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9TVEFSVF0pCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdGJbTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfRU5EXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0YltOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9NQVhfQlddKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRiW05MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9FSVJQXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWdfcnVsZS0+ZmxhZ3MgPSBubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfUkVHX1JVTEVfRkxBR1NdKTsKKworCWZyZXFfcmFuZ2UtPnN0YXJ0X2ZyZXFfa2h6ID0KKwkJbmxhX2dldF91MzIodGJbTkw4MDIxMV9BVFRSX0ZSRVFfUkFOR0VfU1RBUlRdKTsKKwlmcmVxX3JhbmdlLT5lbmRfZnJlcV9raHogPQorCQlubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfRlJFUV9SQU5HRV9FTkRdKTsKKwlmcmVxX3JhbmdlLT5tYXhfYmFuZHdpZHRoX2toeiA9CisJCW5sYV9nZXRfdTMyKHRiW05MODAyMTFfQVRUUl9GUkVRX1JBTkdFX01BWF9CV10pOworCisJcG93ZXJfcnVsZS0+bWF4X2VpcnAgPQorCQlubGFfZ2V0X3UzMih0YltOTDgwMjExX0FUVFJfUE9XRVJfUlVMRV9NQVhfRUlSUF0pOworCisJaWYgKHRiW05MODAyMTFfQVRUUl9QT1dFUl9SVUxFX01BWF9BTlRfR0FJTl0pCisJCXBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4gPQorCQkJbmxhX2dldF91MzIodGJbTkw4MDIxMV9BVFRSX1BPV0VSX1JVTEVfTUFYX0FOVF9HQUlOXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBubDgwMjExX3JlcV9zZXRfcmVnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJaW50IHI7CisJY2hhciAqZGF0YSA9IE5VTEw7CisKKwlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfQUxQSEEyXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKTsKKworI2lmZGVmIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWQorCS8qIFdlIGlnbm9yZSB3b3JsZCByZWdkb20gcmVxdWVzdHMgd2l0aCB0aGUgb2xkIHJlZ2RvbSBzZXR1cCAqLworCWlmIChpc193b3JsZF9yZWdkb20oZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwlyID0gX19yZWd1bGF0b3J5X2hpbnQoTlVMTCwgUkVHRE9NX1NFVF9CWV9VU0VSLCBkYXRhLCBOVUxMKTsKKwltdXRleF91bmxvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9zZXRfcmVnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWCArIDFdOworCXN0cnVjdCBubGF0dHIgKm5sX3JlZ19ydWxlOworCWNoYXIgKmFscGhhMiA9IE5VTEw7CisJaW50IHJlbV9yZWdfcnVsZXMgPSAwLCByID0gMDsKKwl1MzIgbnVtX3J1bGVzID0gMCwgcnVsZV9pZHggPSAwLCBzaXplX29mX3JlZ2Q7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkID0gTlVMTDsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19SVUxFU10pCisJCXJldHVybiAtRUlOVkFMOworCisJYWxwaGEyID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKTsKKworCW5sYV9mb3JfZWFjaF9uZXN0ZWQobmxfcmVnX3J1bGUsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfUlVMRVNdLAorCQkJcmVtX3JlZ19ydWxlcykgeworCQludW1fcnVsZXMrKzsKKwkJaWYgKG51bV9ydWxlcyA+IE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTKQorCQkJZ290byBiYWRfcmVnOworCX0KKworCWlmICghcmVnX2lzX3ZhbGlkX3JlcXVlc3QoYWxwaGEyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplX29mX3JlZ2QgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4pICsKKwkJKG51bV9ydWxlcyAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKSk7CisKKwlyZCA9IGt6YWxsb2Moc2l6ZV9vZl9yZWdkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJkLT5uX3JlZ19ydWxlcyA9IG51bV9ydWxlczsKKwlyZC0+YWxwaGEyWzBdID0gYWxwaGEyWzBdOworCXJkLT5hbHBoYTJbMV0gPSBhbHBoYTJbMV07CisKKwlubGFfZm9yX2VhY2hfbmVzdGVkKG5sX3JlZ19ydWxlLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX1JVTEVTXSwKKwkJCXJlbV9yZWdfcnVsZXMpIHsKKwkJbmxhX3BhcnNlKHRiLCBOTDgwMjExX1JFR19SVUxFX0FUVFJfTUFYLAorCQkJbmxhX2RhdGEobmxfcmVnX3J1bGUpLCBubGFfbGVuKG5sX3JlZ19ydWxlKSwKKwkJCXJlZ19ydWxlX3BvbGljeSk7CisJCXIgPSBwYXJzZV9yZWdfcnVsZSh0YiwgJnJkLT5yZWdfcnVsZXNbcnVsZV9pZHhdKTsKKwkJaWYgKHIpCisJCQlnb3RvIGJhZF9yZWc7CisKKwkJcnVsZV9pZHgrKzsKKworCQlpZiAocnVsZV9pZHggPiBOTDgwMjExX01BWF9TVVBQX1JFR19SVUxFUykKKwkJCWdvdG8gYmFkX3JlZzsKKwl9CisKKwlCVUdfT04ocnVsZV9pZHggIT0gbnVtX3J1bGVzKTsKKworCW11dGV4X2xvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7CisJciA9IHNldF9yZWdkb20ocmQpOworCW11dGV4X3VubG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwlpZiAocikKKwkJZ290byBiYWRfcmVnOworCisJcmV0dXJuIHI7CisKK2JhZF9yZWc6CisJa2ZyZWUocmQpOworCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgc3RydWN0IGdlbmxfb3BzIG5sODAyMTFfb3BzW10gPSB7CiAJewogCQkuY21kID0gTkw4MDIxMV9DTURfR0VUX1dJUEhZLApAQCAtMTY1Niw2ICsxODg0LDI0IEBACiAJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKIAkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAogCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfU0VUX0JTUywKKwkJLmRvaXQgPSBubDgwMjExX3NldF9ic3MsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfU0VUX1JFRywKKwkJLmRvaXQgPSBubDgwMjExX3NldF9yZWcsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfUkVRX1NFVF9SRUcsCisJCS5kb2l0ID0gbmw4MDIxMV9yZXFfc2V0X3JlZywKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJfSwKIH07CiAKIC8qIG11bHRpY2FzdCBncm91cHMgKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWcuYyBiL25ldC93aXJlbGVzcy9yZWcuYwppbmRleCA4NTViZmY0Li42MjZkYmI2OCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtMiwxNzkgKzIsODcxIEBACiAgKiBDb3B5cmlnaHQgMjAwMi0yMDA1LCBJbnN0YW50ODAyIE5ldHdvcmtzLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNS0yMDA2LCBEZXZpY2VzY2FwZSBTb2Z0d2FyZSwgSW5jLgogICogQ29weXJpZ2h0IDIwMDcJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqIENvcHlyaWdodCAyMDA4CUx1aXMgUi4gUm9kcmlndWV6IDxscm9kcmlndXpAYXRoZXJvcy5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0vKgotICogVGhpcyByZWd1bGF0b3J5IGRvbWFpbiBjb250cm9sIGltcGxlbWVudGF0aW9uIGlzIGhpZ2hseSBpbmNvbXBsZXRlLCBpdAotICogb25seSBleGlzdHMgZm9yIHRoZSBwdXJwb3NlIG9mIG5vdCByZWdyZXNzaW5nIG1hYzgwMjExLgotICoKLSAqIEZvciBub3csIGRyaXZlcnMgY2FuIHJlc3RyaWN0IHRoZSBzZXQgb2YgYWxsb3dlZCBjaGFubmVscyBieSBlaXRoZXIKLSAqIG5vdCByZWdpc3RlcmluZyB0aG9zZSBjaGFubmVscyBvciBzZXR0aW5nIHRoZSBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRAotICogZmxhZzsgdGhhdCBmbGFnIHdpbGwgb25seSBiZSAqc2V0KiBieSB0aGlzIGNvZGUsIG5ldmVyICpjbGVhcmVkLgorLyoqCisgKiBET0M6IFdpcmVsZXNzIHJlZ3VsYXRvcnkgaW5mcmFzdHJ1Y3R1cmUKICAqCiAgKiBUaGUgdXN1YWwgaW1wbGVtZW50YXRpb24gaXMgZm9yIGEgZHJpdmVyIHRvIHJlYWQgYSBkZXZpY2UgRUVQUk9NIHRvCiAgKiBkZXRlcm1pbmUgd2hpY2ggcmVndWxhdG9yeSBkb21haW4gaXQgc2hvdWxkIGJlIG9wZXJhdGluZyB1bmRlciwgdGhlbgogICogbG9va2luZyB1cCB0aGUgYWxsb3dhYmxlIGNoYW5uZWxzIGluIGEgZHJpdmVyLWxvY2FsIHRhYmxlIGFuZCBmaW5hbGx5CiAgKiByZWdpc3RlcmluZyB0aG9zZSBjaGFubmVscyBpbiB0aGUgd2lwaHkgc3RydWN0dXJlLgogICoKLSAqIEFsdGVybmF0aXZlbHksIGRyaXZlcnMgdGhhdCB0cnVzdCB0aGUgcmVndWxhdG9yeSBkb21haW4gY29udHJvbCBoZXJlCi0gKiB3aWxsIHJlZ2lzdGVyIGEgY29tcGxldGUgc2V0IG9mIGNhcGFiaWxpdGllcyBhbmQgdGhlIGNvbnRyb2wgY29kZQotICogd2lsbCByZXN0cmljdCB0aGUgc2V0IGJ5IHNldHRpbmcgdGhlIElFRUU4MDIxMV9DSEFOXyogZmxhZ3MuCisgKiBBbm90aGVyIHNldCBvZiBjb21wbGlhbmNlIGVuZm9yY2VtZW50IGlzIGZvciBkcml2ZXJzIHRvIHVzZSB0aGVpcgorICogb3duIGNvbXBsaWFuY2UgbGltaXRzIHdoaWNoIGNhbiBiZSBzdG9yZWQgb24gdGhlIEVFUFJPTS4gVGhlIGhvc3QKKyAqIGRyaXZlciBvciBmaXJtd2FyZSBtYXkgZW5zdXJlIHRoZXNlIGFyZSB1c2VkLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIGFsbCB0aGlzIHdlIHByb3ZpZGUgYW4gZXh0cmEgbGF5ZXIgb2YgcmVndWxhdG9yeQorICogY29uZm9ybWFuY2UuIEZvciBkcml2ZXJzIHdoaWNoIGRvIG5vdCBoYXZlIGFueSByZWd1bGF0b3J5CisgKiBpbmZvcm1hdGlvbiBDUkRBIHByb3ZpZGVzIHRoZSBjb21wbGV0ZSByZWd1bGF0b3J5IHNvbHV0aW9uLgorICogRm9yIG90aGVycyBpdCBwcm92aWRlcyBhIGNvbW11bml0eSBlZmZvcnQgb24gZnVydGhlciByZXN0cmljdGlvbnMKKyAqIHRvIGVuaGFuY2UgY29tcGxpYW5jZS4KKyAqCisgKiBOb3RlOiBXaGVuIG51bWJlciBvZiBydWxlcyAtLT4gaW5maW5pdHkgd2Ugd2lsbCBub3QgYmUgYWJsZSB0bworICogaW5kZXggb24gYWxwaGEyIGFueSBtb3JlLCBpbnN0ZWFkIHdlJ2xsIHByb2JhYmx5IGhhdmUgdG8KKyAqIHJlbHkgb24gc29tZSBTSEExIGNoZWNrc3VtIG9mIHRoZSByZWdkb21haW4gZm9yIGV4YW1wbGUuCisgKgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L25sODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAicmVnLmgiCiAKKy8qIHdpcGh5IGlzIHNldCBpZiB0aGlzIHJlcXVlc3QncyBpbml0aWF0b3IgaXMgUkVHRE9NX1NFVF9CWV9EUklWRVIgKi8KK3N0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCWludCBncmFudGVkOworCWVudW0gcmVnX3NldF9ieSBpbml0aWF0b3I7CisJY2hhciBhbHBoYTJbMl07Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHJlZ3VsYXRvcnlfcmVxdWVzdHMpOworREVGSU5FX01VVEVYKGNmZzgwMjExX3JlZ19tdXRleCk7CisKKy8qIFRvIHRyaWdnZXIgdXNlcnNwYWNlIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJlZ19wZGV2OworCisvKiBLZWVwIHRoZSBvcmRlcmluZyBmcm9tIGxhcmdlIHRvIHNtYWxsICovCitzdGF0aWMgdTMyIHN1cHBvcnRlZF9iYW5kd2lkdGhzW10gPSB7CisJTUhaX1RPX0tIWig0MCksCisJTUhaX1RPX0tIWigyMCksCit9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCByZWd1bGF0b3J5X3JlcXVlc3RzOworCisvKiBDZW50cmFsIHdpcmVsZXNzIGNvcmUgcmVndWxhdG9yeSBkb21haW5zLCB3ZSBvbmx5IG5lZWQgdHdvLAorICogdGhlIGN1cnJlbnQgb25lIGFuZCBhIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluIGluIGNhc2Ugd2UgaGF2ZSBubworICogaW5mb3JtYXRpb24gdG8gZ2l2ZSB1cyBhbiBhbHBoYTIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqY2ZnODAyMTFfcmVnZG9tYWluOworCisvKiBXZSBrZWVwIGEgc3RhdGljIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluIGluIGNhc2Ugb2YgdGhlIGFic2VuY2Ugb2YgQ1JEQSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHdvcmxkX3JlZ2RvbSA9IHsKKwkubl9yZWdfcnVsZXMgPSAxLAorCS5hbHBoYTIgPSAgIjAwIiwKKwkucmVnX3J1bGVzID0geworCQlSRUdfUlVMRSgyNDEyLTEwLCAyNDYyKzEwLCA0MCwgNiwgMjAsCisJCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4gfAorCQkJTkw4MDIxMV9SUkZfTk9fSUJTUyksCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpjZmc4MDIxMV93b3JsZF9yZWdkb20gPQorCSZ3b3JsZF9yZWdkb207CisKKyNpZmRlZiBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkKIHN0YXRpYyBjaGFyICppZWVlODAyMTFfcmVnZG9tID0gIlVTIjsKIG1vZHVsZV9wYXJhbShpZWVlODAyMTFfcmVnZG9tLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGllZWU4MDIxMV9yZWdkb20sICJJRUVFIDgwMi4xMSByZWd1bGF0b3J5IGRvbWFpbiBjb2RlIik7CiAKLXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9yYW5nZSB7Ci0Jc2hvcnQgc3RhcnRfZnJlcTsKLQlzaG9ydCBlbmRfZnJlcTsKLQlpbnQgbWF4X3Bvd2VyOwotCWludCBtYXhfYW50ZW5uYV9nYWluOwotCXUzMiBmbGFnczsKLX07CisvKiBXZSBhc3N1bWUgNDAgTUh6IGJhbmR3aWR0aCBmb3IgdGhlIG9sZCByZWd1bGF0b3J5IHdvcmsuCisgKiBXZSBtYWtlIGVtcGhhc2lzIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSBmcmVxdWVuY2llcworICogYXMgYmVmb3JlICovCiAKLXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHsKLQljb25zdCBjaGFyICpjb2RlOwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9yYW5nZSAqcmFuZ2VzOwotCWludCBuX3JhbmdlczsKLX07Ci0KLSNkZWZpbmUgUkFOR0VfUFdSKF9zdGFydCwgX2VuZCwgX3B3ciwgX2FnLCBfZmxhZ3MpCVwKLQl7IF9zdGFydCwgX2VuZCwgX3B3ciwgX2FnLCBfZmxhZ3MgfQotCi0KLS8qCi0gKiBJZGVhbGx5LCBpbiB0aGUgZnV0dXJlLCB0aGVzZSBkZWZpbml0aW9ucyB3aWxsIGJlIGxvYWRlZCBmcm9tIGEKLSAqIHVzZXJzcGFjZSB0YWJsZSB2aWEgc29tZSBkYWVtb24uCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfcmFuZ2UgaWVlZTgwMjExX1VTX2NoYW5uZWxzW10gPSB7Ci0JLyogSUVFRSA4MDIuMTFiL2csIGNoYW5uZWxzIDEuLjExICovCi0JUkFOR0VfUFdSKDI0MTIsIDI0NjIsIDI3LCA2LCAwKSwKLQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgMzYqLwotCVJBTkdFX1BXUig1MTgwLCA1MTgwLCAyMywgNiwgMCksCi0JLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDQwKi8KLQlSQU5HRV9QV1IoNTIwMCwgNTIwMCwgMjMsIDYsIDApLAotCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCA0NCovCi0JUkFOR0VfUFdSKDUyMjAsIDUyMjAsIDIzLCA2LCAwKSwKLQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDQ4Li42NCAqLwotCVJBTkdFX1BXUig1MjQwLCA1MzIwLCAyMywgNiwgMCksCi0JLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAxNDkuLjE2NSwgb3V0ZG9vciAqLwotCVJBTkdFX1BXUig1NzQ1LCA1ODI1LCAzMCwgNiwgMCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3JhbmdlIGllZWU4MDIxMV9KUF9jaGFubmVsc1tdID0gewotCS8qIElFRUUgODAyLjExYi9nLCBjaGFubmVscyAxLi4xNCAqLwotCVJBTkdFX1BXUigyNDEyLCAyNDg0LCAyMCwgNiwgMCksCi0JLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAzNC4uNDggKi8KLQlSQU5HRV9QV1IoNTE3MCwgNTI0MCwgMjAsIDYsIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiksCi0JLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyA1Mi4uNjQgKi8KLQlSQU5HRV9QV1IoNTI2MCwgNTMyMCwgMjAsIDYsIElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkJCSAgICAgSUVFRTgwMjExX0NIQU5fUkFEQVIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9yYW5nZSBpZWVlODAyMTFfRVVfY2hhbm5lbHNbXSA9IHsKLQkvKiBJRUVFIDgwMi4xMWIvZywgY2hhbm5lbHMgMS4uMTMgKi8KLQlSQU5HRV9QV1IoMjQxMiwgMjQ3MiwgMjAsIDYsIDApLAotCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCAzNiovCi0JUkFOR0VfUFdSKDUxODAsIDUxODAsIDIzLCA2LCBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pLAotCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCA0MCovCi0JUkFOR0VfUFdSKDUyMDAsIDUyMDAsIDIzLCA2LCBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pLAotCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCA0NCovCi0JUkFOR0VfUFdSKDUyMjAsIDUyMjAsIDIzLCA2LCBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pLAotCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgNDguLjY0ICovCi0JUkFOR0VfUFdSKDUyNDAsIDUzMjAsIDIzLCA2LCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJCQkgICAgIElFRUU4MDIxMV9DSEFOX1JBREFSKSwKLQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDEwMC4uMTQwICovCi0JUkFOR0VfUFdSKDU1MDAsIDU3MDAsIDMwLCA2LCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJCQkgICAgIElFRUU4MDIxMV9DSEFOX1JBREFSKSwKLX07Ci0KLSNkZWZpbmUgUkVHRE9NKF9jb2RlKQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQkuY29kZSA9IF9fc3RyaW5naWZ5KF9jb2RlKSwJCQkJXAotCQkucmFuZ2VzID0gaWVlZTgwMjExXyAjI19jb2RlIyMgX2NoYW5uZWxzLAkJXAotCQkubl9yYW5nZXMgPSBBUlJBWV9TSVpFKGllZWU4MDIxMV8gIyNfY29kZSMjIF9jaGFubmVscyksCVwKLQl9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBpZWVlODAyMTFfcmVnZG9tc1tdID0gewotCVJFR0RPTShVUyksCi0JUkVHRE9NKEpQKSwKLQlSRUdET00oRVUpLAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKmdldF9yZWdkb20odm9pZCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3JhbmdlCi0JaWVlZTgwMjExX3dvcmxkX2NoYW5uZWxzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gdXNfcmVnZG9tID0geworCS5uX3JlZ19ydWxlcyA9IDYsCisJLmFscGhhMiA9ICAiVVMiLAorCS5yZWdfcnVsZXMgPSB7CiAJCS8qIElFRUUgODAyLjExYi9nLCBjaGFubmVscyAxLi4xMSAqLwotCQlSQU5HRV9QV1IoMjQxMiwgMjQ2MiwgMjcsIDYsIDApLAotCX07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHJlZ2RvbV93b3JsZCA9IFJFR0RPTSh3b3JsZCk7Ci0JaW50IGk7CisJCVJFR19SVUxFKDI0MTItMTAsIDI0NjIrMTAsIDQwLCA2LCAyNywgMCksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCAzNiAqLworCQlSRUdfUlVMRSg1MTgwLTEwLCA1MTgwKzEwLCA0MCwgNiwgMjMsIDApLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgNDAgKi8KKwkJUkVHX1JVTEUoNTIwMC0xMCwgNTIwMCsxMCwgNDAsIDYsIDIzLCAwKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDQ0ICovCisJCVJFR19SVUxFKDUyMjAtMTAsIDUyMjArMTAsIDQwLCA2LCAyMywgMCksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgNDguLjY0ICovCisJCVJFR19SVUxFKDUyNDAtMTAsIDUzMjArMTAsIDQwLCA2LCAyMywgMCksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgMTQ5Li4xNjUsIG91dGRvb3IgKi8KKwkJUkVHX1JVTEUoNTc0NS0xMCwgNTgyNSsxMCwgNDAsIDYsIDMwLCAwKSwKKwl9Cit9OwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWVlZTgwMjExX3JlZ2RvbXMpOyBpKyspCi0JCWlmIChzdHJjbXAoaWVlZTgwMjExX3JlZ2RvbSwgaWVlZTgwMjExX3JlZ2RvbXNbaV0uY29kZSkgPT0gMCkKLQkJCXJldHVybiAmaWVlZTgwMjExX3JlZ2RvbXNbaV07CitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4ganBfcmVnZG9tID0geworCS5uX3JlZ19ydWxlcyA9IDMsCisJLmFscGhhMiA9ICAiSlAiLAorCS5yZWdfcnVsZXMgPSB7CisJCS8qIElFRUUgODAyLjExYi9nLCBjaGFubmVscyAxLi4xNCAqLworCQlSRUdfUlVMRSgyNDEyLTEwLCAyNDg0KzEwLCA0MCwgNiwgMjAsIDApLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDM0Li40OCAqLworCQlSRUdfUlVMRSg1MTcwLTEwLCA1MjQwKzEwLCA0MCwgNiwgMjAsCisJCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDUyLi42NCAqLworCQlSRUdfUlVMRSg1MjYwLTEwLCA1MzIwKzEwLCA0MCwgNiwgMjAsCisJCQlOTDgwMjExX1JSRl9OT19JQlNTIHwKKwkJCU5MODAyMTFfUlJGX0RGUyksCisJfQorfTsKIAotCXJldHVybiAmcmVnZG9tX3dvcmxkOworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIGV1X3JlZ2RvbSA9IHsKKwkubl9yZWdfcnVsZXMgPSA2LAorCS8qIFRoaXMgYWxwaGEyIGlzIGJvZ3VzLCB3ZSBsZWF2ZSBpdCBoZXJlIGp1c3QgZm9yIHN0dXBpZAorCSAqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwkuYWxwaGEyID0gICJFVSIsCisJLnJlZ19ydWxlcyA9IHsKKwkJLyogSUVFRSA4MDIuMTFiL2csIGNoYW5uZWxzIDEuLjEzICovCisJCVJFR19SVUxFKDI0MTItMTAsIDI0NzIrMTAsIDQwLCA2LCAyMCwgMCksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCAzNiAqLworCQlSRUdfUlVMRSg1MTgwLTEwLCA1MTgwKzEwLCA0MCwgNiwgMjMsCisJCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgNDAgKi8KKwkJUkVHX1JVTEUoNTIwMC0xMCwgNTIwMCsxMCwgNDAsIDYsIDIzLAorCQkJTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDQ0ICovCisJCVJFR19SVUxFKDUyMjAtMTAsIDUyMjArMTAsIDQwLCA2LCAyMywKKwkJCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgNDguLjY0ICovCisJCVJFR19SVUxFKDUyNDAtMTAsIDUzMjArMTAsIDQwLCA2LCAyMCwKKwkJCU5MODAyMTFfUlJGX05PX0lCU1MgfAorCQkJTkw4MDIxMV9SUkZfREZTKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAxMDAuLjE0MCAqLworCQlSRUdfUlVMRSg1NTAwLTEwLCA1NzAwKzEwLCA0MCwgNiwgMzAsCisJCQlOTDgwMjExX1JSRl9OT19JQlNTIHwKKwkJCU5MODAyMTFfUlJGX0RGUyksCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpzdGF0aWNfcmVnZG9tKGNoYXIgKmFscGhhMikKK3sKKwlpZiAoYWxwaGEyWzBdID09ICdVJyAmJiBhbHBoYTJbMV0gPT0gJ1MnKQorCQlyZXR1cm4gJnVzX3JlZ2RvbTsKKwlpZiAoYWxwaGEyWzBdID09ICdKJyAmJiBhbHBoYTJbMV0gPT0gJ1AnKQorCQlyZXR1cm4gJmpwX3JlZ2RvbTsKKwlpZiAoYWxwaGEyWzBdID09ICdFJyAmJiBhbHBoYTJbMV0gPT0gJ1UnKQorCQlyZXR1cm4gJmV1X3JlZ2RvbTsKKwkvKiBEZWZhdWx0LCBhcyBwZXIgdGhlIG9sZCBydWxlcyAqLworCXJldHVybiAmdXNfcmVnZG9tOwogfQogCitzdGF0aWMgYm9vbCBpc19vbGRfc3RhdGljX3JlZ2RvbShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisJaWYgKHJkID09ICZ1c19yZWdkb20gfHwgcmQgPT0gJmpwX3JlZ2RvbSB8fCByZCA9PSAmZXVfcmVnZG9tKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBib29sIGlzX29sZF9zdGF0aWNfcmVnZG9tKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKIAotc3RhdGljIHZvaWQgaGFuZGxlX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAotCQkJICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQorc3RhdGljIHZvaWQgcmVzZXRfcmVnZG9tYWlucyh2b2lkKQoreworCS8qIGF2b2lkIGZyZWVpbmcgc3RhdGljIGluZm9ybWF0aW9uIG9yIGZyZWVpbmcgc29tZXRoaW5nIHR3aWNlICovCisJaWYgKGNmZzgwMjExX3JlZ2RvbWFpbiA9PSBjZmc4MDIxMV93b3JsZF9yZWdkb20pCisJCWNmZzgwMjExX3JlZ2RvbWFpbiA9IE5VTEw7CisJaWYgKGNmZzgwMjExX3dvcmxkX3JlZ2RvbSA9PSAmd29ybGRfcmVnZG9tKQorCQljZmc4MDIxMV93b3JsZF9yZWdkb20gPSBOVUxMOworCWlmIChjZmc4MDIxMV9yZWdkb21haW4gPT0gJndvcmxkX3JlZ2RvbSkKKwkJY2ZnODAyMTFfcmVnZG9tYWluID0gTlVMTDsKKwlpZiAoaXNfb2xkX3N0YXRpY19yZWdkb20oY2ZnODAyMTFfcmVnZG9tYWluKSkKKwkJY2ZnODAyMTFfcmVnZG9tYWluID0gTlVMTDsKKworCWtmcmVlKGNmZzgwMjExX3JlZ2RvbWFpbik7CisJa2ZyZWUoY2ZnODAyMTFfd29ybGRfcmVnZG9tKTsKKworCWNmZzgwMjExX3dvcmxkX3JlZ2RvbSA9ICZ3b3JsZF9yZWdkb207CisJY2ZnODAyMTFfcmVnZG9tYWluID0gTlVMTDsKK30KKworLyogRHluYW1pYyB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbiByZXF1ZXN0ZWQgYnkgdGhlIHdpcmVsZXNzCisgKiBjb3JlIHVwb24gaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV93b3JsZF9yZWdkb21haW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQoreworCUJVR19PTihsaXN0X2VtcHR5KCZyZWd1bGF0b3J5X3JlcXVlc3RzKSk7CisKKwlyZXNldF9yZWdkb21haW5zKCk7CisKKwljZmc4MDIxMV93b3JsZF9yZWdkb20gPSByZDsKKwljZmc4MDIxMV9yZWdkb21haW4gPSByZDsKK30KKworYm9vbCBpc193b3JsZF9yZWdkb20oY29uc3QgY2hhciAqYWxwaGEyKQoreworCWlmICghYWxwaGEyKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGFscGhhMlswXSA9PSAnMCcgJiYgYWxwaGEyWzFdID09ICcwJykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19hbHBoYTJfc2V0KGNvbnN0IGNoYXIgKmFscGhhMikKK3sKKwlpZiAoIWFscGhhMikKKwkJcmV0dXJuIGZhbHNlOworCWlmIChhbHBoYTJbMF0gIT0gMCAmJiBhbHBoYTJbMV0gIT0gMCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19hbHBoYV91cHBlcihjaGFyIGxldHRlcikKK3sKKwkvKiBBU0NJSSBBIC0gWiAqLworCWlmIChsZXR0ZXIgPj0gNjUgJiYgbGV0dGVyIDw9IDkwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzX3Vua25vd25fYWxwaGEyKGNvbnN0IGNoYXIgKmFscGhhMikKK3sKKwlpZiAoIWFscGhhMikKKwkJcmV0dXJuIGZhbHNlOworCS8qIFNwZWNpYWwgY2FzZSB3aGVyZSByZWd1bGF0b3J5IGRvbWFpbiB3YXMgYnVpbHQgYnkgZHJpdmVyCisJICogYnV0IGEgc3BlY2lmaWMgYWxwaGEyIGNhbm5vdCBiZSBkZXRlcm1pbmVkICovCisJaWYgKGFscGhhMlswXSA9PSAnOScgJiYgYWxwaGEyWzFdID09ICc5JykKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc19hbl9hbHBoYTIoY29uc3QgY2hhciAqYWxwaGEyKQoreworCWlmICghYWxwaGEyKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGlzX2FscGhhX3VwcGVyKGFscGhhMlswXSkgJiYgaXNfYWxwaGFfdXBwZXIoYWxwaGEyWzFdKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBhbHBoYTJfZXF1YWwoY29uc3QgY2hhciAqYWxwaGEyX3gsIGNvbnN0IGNoYXIgKmFscGhhMl95KQoreworCWlmICghYWxwaGEyX3ggfHwgIWFscGhhMl95KQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGFscGhhMl94WzBdID09IGFscGhhMl95WzBdICYmCisJCWFscGhhMl94WzFdID09IGFscGhhMl95WzFdKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHJlZ2RvbV9jaGFuZ2VkKGNvbnN0IGNoYXIgKmFscGhhMikKK3sKKwlpZiAoIWNmZzgwMjExX3JlZ2RvbWFpbikKKwkJcmV0dXJuIHRydWU7CisJaWYgKGFscGhhMl9lcXVhbChjZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMiwgYWxwaGEyKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCisvKiBUaGlzIGxldHMgdXMga2VlcCByZWd1bGF0b3J5IGNvZGUgd2hpY2ggaXMgdXBkYXRlZCBvbiBhIHJlZ3VsYXRvcnkKKyAqIGJhc2lzIGluIHVzZXJzcGFjZS4gKi8KK3N0YXRpYyBpbnQgY2FsbF9jcmRhKGNvbnN0IGNoYXIgKmFscGhhMikKK3sKKwljaGFyIGNvdW50cnlfZW52WzkgKyAyXSA9ICJDT1VOVFJZPSI7CisJY2hhciAqZW52cFtdID0geworCQljb3VudHJ5X2VudiwKKwkJTlVMTAorCX07CisKKwlpZiAoIWlzX3dvcmxkX3JlZ2RvbSgoY2hhciAqKSBhbHBoYTIpKQorCQlwcmludGsoS0VSTl9JTkZPICJjZmc4MDIxMTogQ2FsbGluZyBDUkRBIGZvciBjb3VudHJ5OiAlYyVjXG4iLAorCQkJYWxwaGEyWzBdLCBhbHBoYTJbMV0pOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY2ZnODAyMTE6IENhbGxpbmcgQ1JEQSB0byB1cGRhdGUgd29ybGQgIgorCQkJInJlZ3VsYXRvcnkgZG9tYWluXG4iKTsKKworCWNvdW50cnlfZW52WzhdID0gYWxwaGEyWzBdOworCWNvdW50cnlfZW52WzldID0gYWxwaGEyWzFdOworCisJcmV0dXJuIGtvYmplY3RfdWV2ZW50X2VudigmcmVnX3BkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7Cit9CisKKy8qIFRoaXMgaGFzIHRoZSBsb2dpYyB3aGljaCBkZXRlcm1pbmVzIHdoZW4gYSBuZXcgcmVxdWVzdAorICogc2hvdWxkIGJlIGlnbm9yZWQuICovCitzdGF0aWMgaW50IGlnbm9yZV9yZXF1ZXN0KHN0cnVjdCB3aXBoeSAqd2lwaHksIGVudW0gcmVnX3NldF9ieSBzZXRfYnksCisJY2hhciAqYWxwaGEyLCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqbGFzdF9yZXF1ZXN0ID0gTlVMTDsKKworCS8qIEFsbCBpbml0aWFsIHJlcXVlc3RzIGFyZSByZXNwZWN0ZWQgKi8KKwlpZiAobGlzdF9lbXB0eSgmcmVndWxhdG9yeV9yZXF1ZXN0cykpCisJCXJldHVybiAwOworCisJbGFzdF9yZXF1ZXN0ID0gbGlzdF9maXJzdF9lbnRyeSgmcmVndWxhdG9yeV9yZXF1ZXN0cywKKwkJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCwgbGlzdCk7CisKKwlzd2l0Y2ggKHNldF9ieSkgeworCWNhc2UgUkVHRE9NX1NFVF9CWV9JTklUOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFJFR0RPTV9TRVRfQllfQ09SRToKKwkJLyogQWx3YXlzIHJlc3BlY3QgbmV3IHdpcmVsZXNzIGNvcmUgaGludHMsIHNob3VsZCBvbmx5CisJCSAqIGNvbWUgaW4gZm9yIHVwZGF0aW5nIHRoZSB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbiBhdCBpbml0CisJCSAqIGFueXdheSAqLworCQlyZXR1cm4gMDsKKwljYXNlIFJFR0RPTV9TRVRfQllfQ09VTlRSWV9JRToKKwkJaWYgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IHNldF9ieSkgeworCQkJaWYgKGxhc3RfcmVxdWVzdC0+d2lwaHkgIT0gd2lwaHkpIHsKKwkJCQkvKiBUd28gY2FyZHMgd2l0aCB0d28gQVBzIGNsYWltaW5nIGRpZmZlcmVudAorCQkJCSAqIGRpZmZlcmVudCBDb3VudHJ5IElFIGFscGhhMnMhCisJCQkJICogWW91J3JlIHNwZWNpYWwhISAqLworCQkJCWlmICghYWxwaGEyX2VxdWFsKGxhc3RfcmVxdWVzdC0+YWxwaGEyLAorCQkJCQkJY2ZnODAyMTFfcmVnZG9tYWluLT5hbHBoYTIpKSB7CisJCQkJCS8qIFhYWDogRGVhbCB3aXRoIGNvbmZsaWN0LCBjb25zaWRlcgorCQkJCQkgKiBidWlsZGluZyBhIG5ldyBvbmUgb3V0IG9mIHRoZQorCQkJCQkgKiBpbnRlcnNlY3Rpb24gKi8KKwkJCQkJV0FSTl9PTigxKTsKKwkJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJCX0KKwkJCQlyZXR1cm4gLUVBTFJFQURZOworCQkJfQorCQkJLyogVHdvIGNvbnNlY3V0aXZlIENvdW50cnkgSUUgaGludHMgb24gdGhlIHNhbWUgd2lwaHkgKi8KKwkJCWlmICghYWxwaGEyX2VxdWFsKGNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyLCBhbHBoYTIpKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJfQorCQlpZiAoV0FSTl9PTighaXNfYWxwaGEyX3NldChhbHBoYTIpIHx8ICFpc19hbl9hbHBoYTIoYWxwaGEyKSksCisJCQkJIkludmFsaWQgQ291bnRyeSBJRSByZWd1bGF0b3J5IGhpbnQgcGFzc2VkICIKKwkJCQkidG8gdGhlIHdpcmVsZXNzIGNvcmVcbiIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogV2UgaWdub3JlIENvdW50cnkgSUUgaGludHMgZm9yIG5vdywgYXMgd2UgaGF2ZW4ndCB5ZXQKKwkJICogYWRkZWQgdGhlIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZCBmbGFnCisJCSAqIGZvciB3aXBoeXMgKi8KKwkJcmV0dXJuIDE7CisJY2FzZSBSRUdET01fU0VUX0JZX0RSSVZFUjoKKwkJQlVHX09OKCF3aXBoeSk7CisJCWlmIChsYXN0X3JlcXVlc3QtPmluaXRpYXRvciA9PSBzZXRfYnkpIHsKKwkJCS8qIFR3byBzZXBhcmF0ZSBkcml2ZXJzIGhpbnRpbmcgZGlmZmVyZW50IHRoaW5ncywKKwkJCSAqIHRoaXMgaXMgcG9zc2libGUgaWYgeW91IGhhdmUgdHdvIGRldmljZXMgcHJlc2VudAorCQkJICogb24gYSBzeXN0ZW0gd2l0aCBkaWZmZXJlbnQgRUVQUk9NIHJlZ3VsYXRvcnkKKwkJCSAqIHJlYWRpbmdzLiBYWFg6IERvIGludGVyc2VjdGlvbiwgd2Ugc3VwcG9ydCBvbmx5CisJCQkgKiB0aGUgZmlyc3QgcmVndWxhdG9yeSBoaW50IGZvciBub3cgKi8KKwkJCWlmIChsYXN0X3JlcXVlc3QtPndpcGh5ICE9IHdpcGh5KQorCQkJCXJldHVybiAtRUFMUkVBRFk7CisJCQlpZiAocmQpCisJCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJCS8qIERyaXZlciBzaG91bGQgbm90IGJlIHRyeWluZyB0byBoaW50IGRpZmZlcmVudAorCQkJICogcmVndWxhdG9yeSBkb21haW5zISAqLworCQkJQlVHX09OKCFhbHBoYTJfZXF1YWwoYWxwaGEyLAorCQkJCQljZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMikpOworCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJfQorCQlpZiAobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0gUkVHRE9NX1NFVF9CWV9DT1JFKQorCQkJcmV0dXJuIDA7CisJCS8qIFhYWDogSGFuZGxlIGludGVyc2VjdGlvbiwgYW5kIGFkZCB0aGUKKwkJICogZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkIGZsYWcgdG8gd2lwaHkuIEZvciBub3cKKwkJICogd2UgYXNzdW1lIHRoZSBkcml2ZXIgaGFzIHRoaXMgc2V0IHRvIGZhbHNlLCBmb2xsb3dpbmcgdGhlCisJCSAqIDgwMi4xMWQgZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkIGRvY3VtZW50YXRpb24gKi8KKwkJaWYgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IFJFR0RPTV9TRVRfQllfQ09VTlRSWV9JRSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFJFR0RPTV9TRVRfQllfVVNFUjoKKwkJaWYgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IHNldF9ieSB8fAorCQkJCWxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IFJFR0RPTV9TRVRfQllfQ09SRSkKKwkJCXJldHVybiAwOworCQkvKiBEcml2ZXJzIGNhbiB1c2UgdGhlaXIgd2lwaHkncyByZWdfbm90aWZpZXIoKQorCQkgKiB0byBvdmVycmlkZSBhbnkgaW5mb3JtYXRpb24gKi8KKwkJaWYgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IFJFR0RPTV9TRVRfQllfRFJJVkVSKQorCQkJcmV0dXJuIDA7CisJCS8qIFhYWDogSGFuZGxlIGludGVyc2VjdGlvbiAqLworCQlpZiAobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0gUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBib29sIF9fcmVnX2lzX3ZhbGlkX3JlcXVlc3QoY29uc3QgY2hhciAqYWxwaGEyLAorCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKipyZXF1ZXN0KQoreworCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcTsKKwlpZiAobGlzdF9lbXB0eSgmcmVndWxhdG9yeV9yZXF1ZXN0cykpCisJCXJldHVybiBmYWxzZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnJlZ3VsYXRvcnlfcmVxdWVzdHMsIGxpc3QpIHsKKwkJaWYgKGFscGhhMl9lcXVhbChyZXEtPmFscGhhMiwgYWxwaGEyKSkgeworCQkJKnJlcXVlc3QgPSByZXE7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIFVzZWQgYnkgbmw4MDIxMSBiZWZvcmUga21hbGxvYydpbmcgb3VyIHJlZ3VsYXRvcnkgZG9tYWluICovCitib29sIHJlZ19pc192YWxpZF9yZXF1ZXN0KGNvbnN0IGNoYXIgKmFscGhhMikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKKwlyZXR1cm4gIF9fcmVnX2lzX3ZhbGlkX3JlcXVlc3QoYWxwaGEyLCAmcmVxdWVzdCk7Cit9CisKKy8qIFNhbml0eSBjaGVjayBvbiBhIHJlZ3VsYXRvcnkgcnVsZSAqLworc3RhdGljIGJvb2wgaXNfdmFsaWRfcmVnX3J1bGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcnVsZSkKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2ZyZXFfcmFuZ2UgKmZyZXFfcmFuZ2UgPSAmcnVsZS0+ZnJlcV9yYW5nZTsKKwl1MzIgZnJlcV9kaWZmOworCisJaWYgKGZyZXFfcmFuZ2UtPnN0YXJ0X2ZyZXFfa2h6ID09IDAgfHwgZnJlcV9yYW5nZS0+ZW5kX2ZyZXFfa2h6ID09IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmIChmcmVxX3JhbmdlLT5zdGFydF9mcmVxX2toeiA+IGZyZXFfcmFuZ2UtPmVuZF9mcmVxX2toeikKKwkJcmV0dXJuIGZhbHNlOworCisJZnJlcV9kaWZmID0gZnJlcV9yYW5nZS0+ZW5kX2ZyZXFfa2h6IC0gZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHo7CisKKwlpZiAoZnJlcV9yYW5nZS0+bWF4X2JhbmR3aWR0aF9raHogPiBmcmVxX2RpZmYpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBpc192YWxpZF9yZChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcmVnX3J1bGUgPSBOVUxMOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFyZC0+bl9yZWdfcnVsZXMpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCByZC0+bl9yZWdfcnVsZXM7IGkrKykgeworCQlyZWdfcnVsZSA9ICZyZC0+cmVnX3J1bGVzW2ldOworCQlpZiAoIWlzX3ZhbGlkX3JlZ19ydWxlKHJlZ19ydWxlKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJucyB2YWx1ZSBpbiBLSHogKi8KK3N0YXRpYyB1MzIgZnJlcV9tYXhfYmFuZHdpZHRoKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZnJlcV9yYW5nZSAqZnJlcV9yYW5nZSwKKwl1MzIgZnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdXBwb3J0ZWRfYmFuZHdpZHRocyk7IGkrKykgeworCQl1MzIgc3RhcnRfZnJlcV9raHogPSBmcmVxIC0gc3VwcG9ydGVkX2JhbmR3aWR0aHNbaV0vMjsKKwkJdTMyIGVuZF9mcmVxX2toeiA9IGZyZXEgKyBzdXBwb3J0ZWRfYmFuZHdpZHRoc1tpXS8yOworCQlpZiAoc3RhcnRfZnJlcV9raHogPj0gZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHogJiYKKwkJCWVuZF9mcmVxX2toeiA8PSBmcmVxX3JhbmdlLT5lbmRfZnJlcV9raHopCisJCQlyZXR1cm4gc3VwcG9ydGVkX2JhbmR3aWR0aHNbaV07CisJfQorCXJldHVybiAwOworfQorCisvKiBYWFg6IGFkZCBzdXBwb3J0IGZvciB0aGUgcmVzdCBvZiBlbnVtIG5sODAyMTFfcmVnX3J1bGVfZmxhZ3MsIHdlIG1heQorICogd2FudCB0byBqdXN0IGhhdmUgdGhlIGNoYW5uZWwgc3RydWN0dXJlIHVzZSB0aGVzZSAqLworc3RhdGljIHUzMiBtYXBfcmVnZG9tX2ZsYWdzKHUzMiByZF9mbGFncykKK3sKKwl1MzIgY2hhbm5lbF9mbGFncyA9IDA7CisJaWYgKHJkX2ZsYWdzICYgTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOKQorCQljaGFubmVsX2ZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKwlpZiAocmRfZmxhZ3MgJiBOTDgwMjExX1JSRl9OT19JQlNTKQorCQljaGFubmVsX2ZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PX0lCU1M7CisJaWYgKHJkX2ZsYWdzICYgTkw4MDIxMV9SUkZfREZTKQorCQljaGFubmVsX2ZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1JBREFSOworCXJldHVybiBjaGFubmVsX2ZsYWdzOworfQorCisvKioKKyAqIGZyZXFfcmVnX2luZm8gLSBnZXQgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGZyZXF1ZW5jeQorICogQGNlbnRlcl9mcmVxOiBGcmVxdWVuY3kgaW4gS0h6IGZvciB3aGljaCB3ZSB3YW50IHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gZm9yCisgKiBAYmFuZHdpZHRoOiB0aGUgYmFuZHdpZHRoIHJlcXVpcmVtZW50IHlvdSBoYXZlIGluIEtIeiwgaWYgeW91IGRvIG5vdCBoYXZlIG9uZQorICogCXlvdSBjYW4gc2V0IHRoaXMgdG8gMC4gSWYgdGhpcyBmcmVxdWVuY3kgaXMgYWxsb3dlZCB3ZSB0aGVuIHNldAorICogCXRoaXMgdmFsdWUgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBiYW5kd2lkdGguCisgKiBAcmVnX3J1bGU6IHRoZSByZWd1bGF0b3J5IHJ1bGUgd2hpY2ggd2UgaGF2ZSBmb3IgdGhpcyBmcmVxdWVuY3kKKyAqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIHJlZ3VsYXRvcnkgcnVsZSBmb3IgYSBzcGVjaWZpYyBmcmVxdWVuY3kuCisgKi8KK3N0YXRpYyBpbnQgZnJlcV9yZWdfaW5mbyh1MzIgY2VudGVyX2ZyZXEsIHUzMiAqYmFuZHdpZHRoLAorCQkJIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKipyZWdfcnVsZSkKIHsKIAlpbnQgaTsKLQl1MzIgZmxhZ3MgPSBjaGFuLT5vcmlnX2ZsYWdzOwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9yYW5nZSAqcmcgPSBOVUxMOworCXUzMiBtYXhfYmFuZHdpZHRoID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCByZC0+bl9yYW5nZXM7IGkrKykgewotCQlpZiAocmQtPnJhbmdlc1tpXS5zdGFydF9mcmVxIDw9IGNoYW4tPmNlbnRlcl9mcmVxICYmCi0JCSAgICBjaGFuLT5jZW50ZXJfZnJlcSA8PSByZC0+cmFuZ2VzW2ldLmVuZF9mcmVxKSB7Ci0JCQlyZyA9ICZyZC0+cmFuZ2VzW2ldOworCWlmICghY2ZnODAyMTFfcmVnZG9tYWluKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBjZmc4MDIxMV9yZWdkb21haW4tPm5fcmVnX3J1bGVzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcnI7CisJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZnJlcV9yYW5nZSAqZnIgPSBOVUxMOworCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3Bvd2VyX3J1bGUgKnByID0gTlVMTDsKKworCQlyciA9ICZjZmc4MDIxMV9yZWdkb21haW4tPnJlZ19ydWxlc1tpXTsKKwkJZnIgPSAmcnItPmZyZXFfcmFuZ2U7CisJCXByID0gJnJyLT5wb3dlcl9ydWxlOworCQltYXhfYmFuZHdpZHRoID0gZnJlcV9tYXhfYmFuZHdpZHRoKGZyLCBjZW50ZXJfZnJlcSk7CisJCWlmIChtYXhfYmFuZHdpZHRoICYmICpiYW5kd2lkdGggPD0gbWF4X2JhbmR3aWR0aCkgeworCQkJKnJlZ19ydWxlID0gcnI7CisJCQkqYmFuZHdpZHRoID0gbWF4X2JhbmR3aWR0aDsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCFyZykgewotCQkvKiBub3QgZm91bmQgKi8KKwlyZXR1cm4gIW1heF9iYW5kd2lkdGg7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgcjsKKwl1MzIgZmxhZ3MgPSBjaGFuLT5vcmlnX2ZsYWdzOworCXUzMiBtYXhfYmFuZHdpZHRoID0gMDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlICpyZWdfcnVsZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9wb3dlcl9ydWxlICpwb3dlcl9ydWxlID0gTlVMTDsKKworCXIgPSBmcmVxX3JlZ19pbmZvKE1IWl9UT19LSFooY2hhbi0+Y2VudGVyX2ZyZXEpLAorCQkmbWF4X2JhbmR3aWR0aCwgJnJlZ19ydWxlKTsKKworCWlmIChyKSB7CiAJCWZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEOwogCQljaGFuLT5mbGFncyA9IGZsYWdzOwogCQlyZXR1cm47CiAJfQogCi0JY2hhbi0+ZmxhZ3MgPSBmbGFnczsKKwlwb3dlcl9ydWxlID0gJnJlZ19ydWxlLT5wb3dlcl9ydWxlOworCisJY2hhbi0+ZmxhZ3MgPSBmbGFncyB8IG1hcF9yZWdkb21fZmxhZ3MocmVnX3J1bGUtPmZsYWdzKTsKIAljaGFuLT5tYXhfYW50ZW5uYV9nYWluID0gbWluKGNoYW4tPm9yaWdfbWFnLAotCQkJCQkgcmctPm1heF9hbnRlbm5hX2dhaW4pOworCQkoaW50KSBNQklfVE9fREJJKHBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4pKTsKKwljaGFuLT5tYXhfYmFuZHdpZHRoID0gS0haX1RPX01IWihtYXhfYmFuZHdpZHRoKTsKIAlpZiAoY2hhbi0+b3JpZ19tcHdyKQotCQljaGFuLT5tYXhfcG93ZXIgPSBtaW4oY2hhbi0+b3JpZ19tcHdyLCByZy0+bWF4X3Bvd2VyKTsKKwkJY2hhbi0+bWF4X3Bvd2VyID0gbWluKGNoYW4tPm9yaWdfbXB3ciwKKwkJCShpbnQpIE1CTV9UT19EQk0ocG93ZXJfcnVsZS0+bWF4X2VpcnApKTsKIAllbHNlCi0JCWNoYW4tPm1heF9wb3dlciA9IHJnLT5tYXhfcG93ZXI7CisJCWNoYW4tPm1heF9wb3dlciA9IChpbnQpIE1CTV9UT19EQk0ocG93ZXJfcnVsZS0+bWF4X2VpcnApOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfYmFuZChzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCkKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYW5kKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2NoYW5uZWxzOyBpKyspCi0JCWhhbmRsZV9jaGFubmVsKCZzYmFuZC0+Y2hhbm5lbHNbaV0sIHJkKTsKKwkJaGFuZGxlX2NoYW5uZWwoJnNiYW5kLT5jaGFubmVsc1tpXSk7CiB9CiAKLXZvaWQgd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3N0YXRpYyB2b2lkIHVwZGF0ZV9hbGxfd2lwaHlfcmVndWxhdG9yeShlbnVtIHJlZ19zZXRfYnkgc2V0YnkpCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkcnY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmNmZzgwMjExX2Rydl9saXN0LCBsaXN0KQorCQl3aXBoeV91cGRhdGVfcmVndWxhdG9yeSgmZHJ2LT53aXBoeSwgc2V0YnkpOworfQorCit2b2lkIHdpcGh5X3VwZGF0ZV9yZWd1bGF0b3J5KHN0cnVjdCB3aXBoeSAqd2lwaHksIGVudW0gcmVnX3NldF9ieSBzZXRieSkKIHsKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkID0gZ2V0X3JlZ2RvbSgpOwotCi0JZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CiAJCWlmICh3aXBoeS0+YmFuZHNbYmFuZF0pCi0JCQloYW5kbGVfYmFuZCh3aXBoeS0+YmFuZHNbYmFuZF0sIHJkKTsKKwkJCWhhbmRsZV9iYW5kKHdpcGh5LT5iYW5kc1tiYW5kXSk7CisJCWlmICh3aXBoeS0+cmVnX25vdGlmaWVyKQorCQkJd2lwaHktPnJlZ19ub3RpZmllcih3aXBoeSwgc2V0YnkpOworCX0KK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCAmY2ZnODAyMTFfZHJ2X211dGV4ICovCitpbnQgX19yZWd1bGF0b3J5X2hpbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwgZW51bSByZWdfc2V0X2J5IHNldF9ieSwKKwkJICAgICAgY29uc3QgY2hhciAqYWxwaGEyLCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdDsKKwljaGFyICpyZF9hbHBoYTI7CisJaW50IHIgPSAwOworCisJciA9IGlnbm9yZV9yZXF1ZXN0KHdpcGh5LCBzZXRfYnksIChjaGFyICopIGFscGhhMiwgcmQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChyZCkKKwkJcmRfYWxwaGEyID0gcmQtPmFscGhhMjsKKwllbHNlCisJCXJkX2FscGhhMiA9IChjaGFyICopIGFscGhhMjsKKworCXN3aXRjaCAoc2V0X2J5KSB7CisJY2FzZSBSRUdET01fU0VUX0JZX0NPUkU6CisJY2FzZSBSRUdET01fU0VUX0JZX0NPVU5UUllfSUU6CisJY2FzZSBSRUdET01fU0VUX0JZX0RSSVZFUjoKKwljYXNlIFJFR0RPTV9TRVRfQllfVVNFUjoKKwkJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QpLAorCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghcmVxdWVzdCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJlcXVlc3QtPmFscGhhMlswXSA9IHJkX2FscGhhMlswXTsKKwkJcmVxdWVzdC0+YWxwaGEyWzFdID0gcmRfYWxwaGEyWzFdOworCQlyZXF1ZXN0LT5pbml0aWF0b3IgPSBzZXRfYnk7CisJCXJlcXVlc3QtPndpcGh5ID0gd2lwaHk7CisKKwkJbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+bGlzdCwgJnJlZ3VsYXRvcnlfcmVxdWVzdHMpOworCQlpZiAocmQpCisJCQlicmVhazsKKwkJciA9IGNhbGxfY3JkYShhbHBoYTIpOworI2lmbmRlZiBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkKKwkJaWYgKHIpCisJCQlwcmludGsoS0VSTl9FUlIgImNmZzgwMjExOiBGYWlsZWQgY2FsbGluZyBDUkRBXG4iKTsKKyNlbmRpZgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyID0gLUVOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyogSWYgcmQgaXMgbm90IE5VTEwgYW5kIGlmIHRoaXMgY2FsbCBmYWlscyB0aGUgY2FsbGVyIG11c3QgZnJlZSBpdCAqLworaW50IHJlZ3VsYXRvcnlfaGludChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICphbHBoYTIsCisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQoreworCWludCByOworCUJVR19PTighcmQgJiYgIWFscGhhMik7CisKKwltdXRleF9sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOworCisJciA9IF9fcmVndWxhdG9yeV9oaW50KHdpcGh5LCBSRUdET01fU0VUX0JZX0RSSVZFUiwgYWxwaGEyLCByZCk7CisJaWYgKHIgfHwgIXJkKQorCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKworCS8qIElmIHRoZSBkcml2ZXIgcGFzc2VkIGEgcmVndWxhdG9yeSBkb21haW4gd2Ugc2tpcHBlZCBhc2tpbmcKKwkgKiB1c2Vyc3BhY2UgZm9yIG9uZSBzbyB3ZSBjYW4gbm93IGdvIGFoZWFkIGFuZCBzZXQgaXQgKi8KKwlyID0gc2V0X3JlZ2RvbShyZCk7CisKK3VubG9ja19hbmRfZXhpdDoKKwltdXRleF91bmxvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ3VsYXRvcnlfaGludCk7CisKKworc3RhdGljIHZvaWQgcHJpbnRfcmRfcnVsZXMoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJlZ19ydWxlID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2ZyZXFfcmFuZ2UgKmZyZXFfcmFuZ2UgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcG93ZXJfcnVsZSAqcG93ZXJfcnVsZSA9IE5VTEw7CisKKwlwcmludGsoS0VSTl9JTkZPICJcdChzdGFydF9mcmVxIC0gZW5kX2ZyZXEgQCBiYW5kd2lkdGgpLCAiCisJCSIobWF4X2FudGVubmFfZ2FpbiwgbWF4X2VpcnApXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByZC0+bl9yZWdfcnVsZXM7IGkrKykgeworCQlyZWdfcnVsZSA9ICZyZC0+cmVnX3J1bGVzW2ldOworCQlmcmVxX3JhbmdlID0gJnJlZ19ydWxlLT5mcmVxX3JhbmdlOworCQlwb3dlcl9ydWxlID0gJnJlZ19ydWxlLT5wb3dlcl9ydWxlOworCisJCS8qIFRoZXJlIG1heSBub3QgYmUgZG9jdW1lbnRhdGlvbiBmb3IgbWF4IGFudGVubmEgZ2FpbgorCQkgKiBpbiBjZXJ0YWluIHJlZ2lvbnMgKi8KKwkJaWYgKHBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4pCisJCQlwcmludGsoS0VSTl9JTkZPICJcdCglZCBLSHogLSAlZCBLSHogQCAlZCBLSHopLCAiCisJCQkJIiglZCBtQmksICVkIG1CbSlcbiIsCisJCQkJZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHosCisJCQkJZnJlcV9yYW5nZS0+ZW5kX2ZyZXFfa2h6LAorCQkJCWZyZXFfcmFuZ2UtPm1heF9iYW5kd2lkdGhfa2h6LAorCQkJCXBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4sCisJCQkJcG93ZXJfcnVsZS0+bWF4X2VpcnApOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJcdCglZCBLSHogLSAlZCBLSHogQCAlZCBLSHopLCAiCisJCQkJIihOL0EsICVkIG1CbSlcbiIsCisJCQkJZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHosCisJCQkJZnJlcV9yYW5nZS0+ZW5kX2ZyZXFfa2h6LAorCQkJCWZyZXFfcmFuZ2UtPm1heF9iYW5kd2lkdGhfa2h6LAorCQkJCXBvd2VyX3J1bGUtPm1heF9laXJwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JlZ2RvbWFpbihjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisKKwlpZiAoaXNfd29ybGRfcmVnZG9tKHJkLT5hbHBoYTIpKQorCQlwcmludGsoS0VSTl9JTkZPICJjZmc4MDIxMTogV29ybGQgcmVndWxhdG9yeSAiCisJCQkiZG9tYWluIHVwZGF0ZWQ6XG4iKTsKKwllbHNlIHsKKwkJaWYgKGlzX3Vua25vd25fYWxwaGEyKHJkLT5hbHBoYTIpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY2ZnODAyMTE6IFJlZ3VsYXRvcnkgZG9tYWluICIKKwkJCQkiY2hhbmdlZCB0byBkcml2ZXIgYnVpbHQtaW4gc2V0dGluZ3MgIgorCQkJCSIodW5rbm93biBjb3VudHJ5KVxuIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gImNmZzgwMjExOiBSZWd1bGF0b3J5IGRvbWFpbiAiCisJCQkJImNoYW5nZWQgdG8gY291bnRyeTogJWMlY1xuIiwKKwkJCQlyZC0+YWxwaGEyWzBdLCByZC0+YWxwaGEyWzFdKTsKKwl9CisJcHJpbnRfcmRfcnVsZXMocmQpOworfQorCit2b2lkIHByaW50X3JlZ2RvbWFpbl9pbmZvKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJjZmc4MDIxMTogUmVndWxhdG9yeSBkb21haW46ICVjJWNcbiIsCisJCXJkLT5hbHBoYTJbMF0sIHJkLT5hbHBoYTJbMV0pOworCXByaW50X3JkX3J1bGVzKHJkKTsKK30KKworc3RhdGljIGludCBfX3NldF9yZWdkb20oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQoreworCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOworCisJLyogU29tZSBiYXNpYyBzYW5pdHkgY2hlY2tzIGZpcnN0ICovCisKKwlpZiAoaXNfd29ybGRfcmVnZG9tKHJkLT5hbHBoYTIpKSB7CisJCWlmIChXQVJOX09OKCFfX3JlZ19pc192YWxpZF9yZXF1ZXN0KHJkLT5hbHBoYTIsICZyZXF1ZXN0KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdXBkYXRlX3dvcmxkX3JlZ2RvbWFpbihyZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaXNfYWxwaGEyX3NldChyZC0+YWxwaGEyKSAmJiAhaXNfYW5fYWxwaGEyKHJkLT5hbHBoYTIpICYmCisJCQkhaXNfdW5rbm93bl9hbHBoYTIocmQtPmFscGhhMikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxpc3RfZW1wdHkoJnJlZ3VsYXRvcnlfcmVxdWVzdHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGFsbG93IG92ZXJyaWRpbmcgdGhlIHN0YXRpYyBkZWZpbml0aW9ucyBpZiBDUkRBIGlzIHByZXNlbnQgKi8KKwlpZiAoIWlzX29sZF9zdGF0aWNfcmVnZG9tKGNmZzgwMjExX3JlZ2RvbWFpbikgJiYKKwkgICAgIXJlZ2RvbV9jaGFuZ2VkKHJkLT5hbHBoYTIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vdyBsZXRzIHNldCB0aGUgcmVndWxhdG9yeSBkb21haW4sIHVwZGF0ZSBhbGwgZHJpdmVyIGNoYW5uZWxzCisJICogYW5kIGZpbmFsbHkgaW5mb3JtIHRoZW0gb2Ygd2hhdCB3ZSBoYXZlIGRvbmUsIGluIGNhc2UgdGhleSB3YW50CisJICogdG8gcmV2aWV3IG9yIGFkanVzdCB0aGVpciBvd24gc2V0dGluZ3MgYmFzZWQgb24gdGhlaXIgb3duCisJICogaW50ZXJuYWwgRUVQUk9NIGRhdGEgKi8KKworCWlmIChXQVJOX09OKCFfX3JlZ19pc192YWxpZF9yZXF1ZXN0KHJkLT5hbHBoYTIsICZyZXF1ZXN0KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzZXRfcmVnZG9tYWlucygpOworCisJLyogQ291bnRyeSBJRSBwYXJzaW5nIGNvbWluZyBzb29uICovCisJc3dpdGNoIChyZXF1ZXN0LT5pbml0aWF0b3IpIHsKKwljYXNlIFJFR0RPTV9TRVRfQllfQ09SRToKKwljYXNlIFJFR0RPTV9TRVRfQllfRFJJVkVSOgorCWNhc2UgUkVHRE9NX1NFVF9CWV9VU0VSOgorCQlpZiAoIWlzX3ZhbGlkX3JkKHJkKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjZmc4MDIxMTogSW52YWxpZCAiCisJCQkJInJlZ3VsYXRvcnkgZG9tYWluIGRldGVjdGVkOlxuIik7CisJCQlwcmludF9yZWdkb21haW5faW5mbyhyZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJFR0RPTV9TRVRfQllfQ09VTlRSWV9JRTogLyogTm90IHlldCAqLworCQlXQVJOX09OKDEpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBUYWRhISAqLworCWNmZzgwMjExX3JlZ2RvbWFpbiA9IHJkOworCXJlcXVlc3QtPmdyYW50ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVXNlIHRoaXMgY2FsbCB0byBzZXQgdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uIENvbmZsaWN0cyB3aXRoCisgKiBtdWx0aXBsZSBkcml2ZXJzIGNhbiBiZSBpcm9uZWQgb3V0IGxhdGVyLiBDYWxsZXIgbXVzdCd2ZSBhbHJlYWR5CisgKiBrbWFsbG9jJ2QgdGhlIHJkIHN0cnVjdHVyZS4gSWYgdGhpcyBjYWxscyBmYWlscyB5b3Ugc2hvdWxkIGtmcmVlKCkKKyAqIHRoZSBwYXNzZWQgcmQuIENhbGxlciBtdXN0IGhvbGQgY2ZnODAyMTFfZHJ2X211dGV4ICovCitpbnQgc2V0X3JlZ2RvbShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCit7CisJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqdGhpc19yZXF1ZXN0ID0gTlVMTCwgKnByZXZfcmVxdWVzdCA9IE5VTEw7CisJaW50IHI7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnJlZ3VsYXRvcnlfcmVxdWVzdHMpKQorCQlwcmV2X3JlcXVlc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZyZWd1bGF0b3J5X3JlcXVlc3RzLAorCQkJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCwgbGlzdCk7CisKKwkvKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHVwZGF0ZSB0aGUgd2lwaHlzLCB0aGlzIGlzIGRvbmUgYmVsb3cgKi8KKwlyID0gX19zZXRfcmVnZG9tKHJkKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlCVUdfT04oKCFfX3JlZ19pc192YWxpZF9yZXF1ZXN0KHJkLT5hbHBoYTIsICZ0aGlzX3JlcXVlc3QpKSk7CisKKwkvKiBUaGUgaW5pdGlhbCBzdGFuZGFyZCBjb3JlIHVwZGF0ZSBvZiB0aGUgd29ybGQgcmVndWxhdG9yeSBkb21haW4sIG5vCisJICogbmVlZCB0byBrZWVwIHRoYXQgcmVxdWVzdCBpbmZvIGFyb3VuZCBpZiBpdCBkaWRuJ3QgZmFpbC4gKi8KKwlpZiAoaXNfd29ybGRfcmVnZG9tKHJkLT5hbHBoYTIpICYmCisJCQl0aGlzX3JlcXVlc3QtPmluaXRpYXRvciA9PSBSRUdET01fU0VUX0JZX0NPUkUgJiYKKwkJCXRoaXNfcmVxdWVzdC0+Z3JhbnRlZCkgeworCQlsaXN0X2RlbCgmdGhpc19yZXF1ZXN0LT5saXN0KTsKKwkJa2ZyZWUodGhpc19yZXF1ZXN0KTsKKwkJdGhpc19yZXF1ZXN0ID0gTlVMTDsKKwl9CisKKwkvKiBSZW1vdmUgb2xkIHJlcXVlc3RzLCB3ZSBvbmx5IGxlYXZlIGJlaGluZCB0aGUgbGFzdCBvbmUgKi8KKwlpZiAocHJldl9yZXF1ZXN0KSB7CisJCWxpc3RfZGVsKCZwcmV2X3JlcXVlc3QtPmxpc3QpOworCQlrZnJlZShwcmV2X3JlcXVlc3QpOworCQlwcmV2X3JlcXVlc3QgPSBOVUxMOworCX0KKworCS8qIFRoaXMgd291bGQgbWFrZSB0aGlzIHdob2xlIHRoaW5nIHBvaW50bGVzcyAqLworCUJVR19PTihyZCAhPSBjZmc4MDIxMV9yZWdkb21haW4pOworCisJLyogdXBkYXRlIGFsbCB3aXBoeXMgbm93IHdpdGggdGhlIG5ldyBlc3RhYmxpc2hlZCByZWd1bGF0b3J5IGRvbWFpbiAqLworCXVwZGF0ZV9hbGxfd2lwaHlfcmVndWxhdG9yeSh0aGlzX3JlcXVlc3QtPmluaXRpYXRvcik7CisKKwlwcmludF9yZWdkb21haW4ocmQpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCByZWd1bGF0b3J5X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcmVnX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJyZWd1bGF0b3J5IiwgMCwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihyZWdfcGRldikpCisJCXJldHVybiBQVFJfRVJSKHJlZ19wZGV2KTsKKworI2lmZGVmIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWQorCWNmZzgwMjExX3JlZ2RvbWFpbiA9IHN0YXRpY19yZWdkb20oaWVlZTgwMjExX3JlZ2RvbSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJjZmc4MDIxMTogVXNpbmcgc3RhdGljIHJlZ3VsYXRvcnkgZG9tYWluIGluZm9cbiIpOworCXByaW50X3JlZ2RvbWFpbl9pbmZvKGNmZzgwMjExX3JlZ2RvbWFpbik7CisJLyogVGhlIG9sZCBjb2RlIHN0aWxsIHJlcXVlc3RzIGZvciBhIG5ldyByZWdkb21haW4gYW5kIGlmCisJICogeW91IGhhdmUgQ1JEQSB5b3UgZ2V0IGl0IHVwZGF0ZWQsIG90aGVyd2lzZSB5b3UgZ2V0CisJICogc3R1Y2sgd2l0aCB0aGUgc3RhdGljIHZhbHVlcy4gV2UgaWdub3JlICJFVSIgY29kZSBhcworCSAqIHRoYXQgaXMgbm90IGEgdmFsaWQgSVNPIC8gSUVDIDMxNjYgYWxwaGEyICovCisJaWYgKGllZWU4MDIxMV9yZWdkb21bMF0gIT0gJ0UnICYmIGllZWU4MDIxMV9yZWdkb21bMV0gIT0gJ1UnKQorCQllcnIgPSBfX3JlZ3VsYXRvcnlfaGludChOVUxMLCBSRUdET01fU0VUX0JZX0NPUkUsCisJCQkJCWllZWU4MDIxMV9yZWdkb20sIE5VTEwpOworI2Vsc2UKKwljZmc4MDIxMV9yZWdkb21haW4gPSBjZmc4MDIxMV93b3JsZF9yZWdkb207CisKKwllcnIgPSBfX3JlZ3VsYXRvcnlfaGludChOVUxMLCBSRUdET01fU0VUX0JZX0NPUkUsICIwMCIsIE5VTEwpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiY2ZnODAyMTE6IGNhbGxpbmcgQ1JEQSBmYWlsZWQgLSAiCisJCSAgICAgICAidW5hYmxlIHRvIHVwZGF0ZSB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbiwgIgorCQkgICAgICAgInVzaW5nIHN0YXRpYyBkZWZpbml0aW9uXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVndWxhdG9yeV9leGl0KHZvaWQpCit7CisJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxLCAqcmVxX3RtcDsKKworCW11dGV4X2xvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7CisKKwlyZXNldF9yZWdkb21haW5zKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByZXFfdG1wLCAmcmVndWxhdG9yeV9yZXF1ZXN0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJa2ZyZWUocmVxKTsKKwl9CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocmVnX3BkZXYpOworCisJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5oIGIvbmV0L3dpcmVsZXNzL3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzM2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2lyZWxlc3MvcmVnLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX05FVF9XSVJFTEVTU19SRUdfSAorI2RlZmluZSBfX05FVF9XSVJFTEVTU19SRUdfSAorCitleHRlcm4gc3RydWN0IG11dGV4IGNmZzgwMjExX3JlZ19tdXRleDsKK2Jvb2wgaXNfd29ybGRfcmVnZG9tKGNvbnN0IGNoYXIgKmFscGhhMik7Citib29sIHJlZ19pc192YWxpZF9yZXF1ZXN0KGNvbnN0IGNoYXIgKmFscGhhMik7CisKK2ludCByZWd1bGF0b3J5X2luaXQodm9pZCk7Cit2b2lkIHJlZ3VsYXRvcnlfZXhpdCh2b2lkKTsKKworaW50IHNldF9yZWdkb20oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKTsKKworI2VuZGlmICAvKiBfX05FVF9XSVJFTEVTU19SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9vdXRwdXQuYyBiL25ldC94ZnJtL3hmcm1fb3V0cHV0LmMKaW5kZXggYWMyNWI0Yy4uZGM1MGYxZSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9vdXRwdXQuYworKysgYi9uZXQveGZybS94ZnJtX291dHB1dC5jCkBAIC0yNywxMCArMjcsMTQgQEAKIAkJLSBza2JfaGVhZHJvb20oc2tiKTsKIAlpbnQgbnRhaWwgPSBkc3QtPmRldi0+bmVlZGVkX3RhaWxyb29tIC0gc2tiX3RhaWxyb29tKHNrYik7CiAKLQlpZiAobmhlYWQgPiAwIHx8IG50YWlsID4gMCkKLQkJcmV0dXJuIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBuaGVhZCwgbnRhaWwsIEdGUF9BVE9NSUMpOworCWlmIChuaGVhZCA8PSAwKSB7CisJCWlmIChudGFpbCA8PSAwKQorCQkJcmV0dXJuIDA7CisJCW5oZWFkID0gMDsKKwl9IGVsc2UgaWYgKG50YWlsIDwgMCkKKwkJbnRhaWwgPSAwOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBuaGVhZCwgbnRhaWwsIEdGUF9BVE9NSUMpOwogfQogCiBzdGF0aWMgaW50IHhmcm1fb3V0cHV0X29uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyKQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggNDY5MTRiNy4uODMyYjQ3YyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpbmNsdWRlICJ4ZnJtX2hhc2guaCIKIAotaW50IHN5c2N0bF94ZnJtX2xhcnZhbF9kcm9wIF9fcmVhZF9tb3N0bHk7CitpbnQgc3lzY3RsX3hmcm1fbGFydmFsX2Ryb3AgX19yZWFkX21vc3RseSA9IDE7CiAKICNpZmRlZiBDT05GSUdfWEZSTV9TVEFUSVNUSUNTCiBERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBsaW51eF94ZnJtX21pYiwgeGZybV9zdGF0aXN0aWNzKSBfX3JlYWRfbW9zdGx5OwpAQCAtNDYsNyArNDYsNyBAQAogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyh4ZnJtX3BvbGljeV9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeGZybV9wb2xpY3lfYnl0eXBlW1hGUk1fUE9MSUNZX1RZUEVfTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhmcm1fcG9saWN5X2FsbDsKIHVuc2lnbmVkIGludCB4ZnJtX3BvbGljeV9jb3VudFtYRlJNX1BPTElDWV9NQVgqMl07CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X2NvdW50KTsKIApAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAlyZWFkX2xvY2soJnhwLT5sb2NrKTsKIAotCWlmICh4cC0+ZGVhZCkKKwlpZiAoeHAtPndhbGsuZGVhZCkKIAkJZ290byBvdXQ7CiAKIAlkaXIgPSB4ZnJtX3BvbGljeV9pZDJkaXIoeHAtPmluZGV4KTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXBvbGljeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZnJtX3BvbGljeSksIGdmcCk7CiAKIAlpZiAocG9saWN5KSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwb2xpY3ktPmJ5dHlwZSk7CisJCUlOSVRfTElTVF9IRUFEKCZwb2xpY3ktPndhbGsuYWxsKTsKIAkJSU5JVF9ITElTVF9OT0RFKCZwb2xpY3ktPmJ5ZHN0KTsKIAkJSU5JVF9ITElTVF9OT0RFKCZwb2xpY3ktPmJ5aWR4KTsKIAkJcndsb2NrX2luaXQoJnBvbGljeS0+bG9jayk7CkBAIC0yNTIsMTcgKzI1MiwxMyBAQAogCiB2b2lkIHhmcm1fcG9saWN5X2Rlc3Ryb3koc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCiB7Ci0JQlVHX09OKCFwb2xpY3ktPmRlYWQpOworCUJVR19PTighcG9saWN5LT53YWxrLmRlYWQpOwogCiAJQlVHX09OKHBvbGljeS0+YnVuZGxlcyk7CiAKIAlpZiAoZGVsX3RpbWVyKCZwb2xpY3ktPnRpbWVyKSkKIAkJQlVHKCk7CiAKLQl3cml0ZV9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKLQlsaXN0X2RlbCgmcG9saWN5LT5ieXR5cGUpOwotCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7Ci0KIAlzZWN1cml0eV94ZnJtX3BvbGljeV9mcmVlKHBvbGljeS0+c2VjdXJpdHkpOwogCWtmcmVlKHBvbGljeSk7CiB9CkBAIC0zMTAsOCArMzA2LDggQEAKIAlpbnQgZGVhZDsKIAogCXdyaXRlX2xvY2tfYmgoJnBvbGljeS0+bG9jayk7Ci0JZGVhZCA9IHBvbGljeS0+ZGVhZDsKLQlwb2xpY3ktPmRlYWQgPSAxOworCWRlYWQgPSBwb2xpY3ktPndhbGsuZGVhZDsKKwlwb2xpY3ktPndhbGsuZGVhZCA9IDE7CiAJd3JpdGVfdW5sb2NrX2JoKCZwb2xpY3ktPmxvY2spOwogCiAJaWYgKHVubGlrZWx5KGRlYWQpKSB7CkBAIC02MDksNiArNjA1LDcgQEAKIAlpZiAoZGVscG9sKSB7CiAJCWhsaXN0X2RlbCgmZGVscG9sLT5ieWRzdCk7CiAJCWhsaXN0X2RlbCgmZGVscG9sLT5ieWlkeCk7CisJCWxpc3RfZGVsKCZkZWxwb2wtPndhbGsuYWxsKTsKIAkJeGZybV9wb2xpY3lfY291bnRbZGlyXS0tOwogCX0KIAlwb2xpY3ktPmluZGV4ID0gZGVscG9sID8gZGVscG9sLT5pbmRleCA6IHhmcm1fZ2VuX2luZGV4KHBvbGljeS0+dHlwZSwgZGlyKTsKQEAgLTYxNyw3ICs2MTQsNyBAQAogCXBvbGljeS0+Y3VybGZ0LnVzZV90aW1lID0gMDsKIAlpZiAoIW1vZF90aW1lcigmcG9saWN5LT50aW1lciwgamlmZmllcyArIEhaKSkKIAkJeGZybV9wb2xfaG9sZChwb2xpY3kpOwotCWxpc3RfYWRkX3RhaWwoJnBvbGljeS0+Ynl0eXBlLCAmeGZybV9wb2xpY3lfYnl0eXBlW3BvbGljeS0+dHlwZV0pOworCWxpc3RfYWRkKCZwb2xpY3ktPndhbGsuYWxsLCAmeGZybV9wb2xpY3lfYWxsKTsKIAl3cml0ZV91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOwogCiAJaWYgKGRlbHBvbCkKQEAgLTY4NCw2ICs2ODEsNyBAQAogCQkJCX0KIAkJCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOwogCQkJCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CisJCQkJbGlzdF9kZWwoJnBvbC0+d2Fsay5hbGwpOwogCQkJCXhmcm1fcG9saWN5X2NvdW50W2Rpcl0tLTsKIAkJCX0KIAkJCXJldCA9IHBvbDsKQEAgLTcyNyw2ICs3MjUsNyBAQAogCQkJCX0KIAkJCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOwogCQkJCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CisJCQkJbGlzdF9kZWwoJnBvbC0+d2Fsay5hbGwpOwogCQkJCXhmcm1fcG9saWN5X2NvdW50W2Rpcl0tLTsKIAkJCX0KIAkJCXJldCA9IHBvbDsKQEAgLTg0MCw2ICs4MzksNyBAQAogCQkJCQljb250aW51ZTsKIAkJCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOwogCQkJCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CisJCQkJbGlzdF9kZWwoJnBvbC0+d2Fsay5hbGwpOwogCQkJCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CiAKIAkJCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUocG9sLCAxLApAQCAtODY3LDYwICs4NjcsNjggQEAKIAkJICAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgeGZybV9wb2xpY3kgKiwgaW50LCBpbnQsIHZvaWQqKSwKIAkJICAgICB2b2lkICpkYXRhKQogewotCXN0cnVjdCB4ZnJtX3BvbGljeSAqb2xkLCAqcG9sLCAqbGFzdCA9IE5VTEw7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2w7CisJc3RydWN0IHhmcm1fcG9saWN5X3dhbGtfZW50cnkgKng7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICh3YWxrLT50eXBlID49IFhGUk1fUE9MSUNZX1RZUEVfTUFYICYmCiAJICAgIHdhbGstPnR5cGUgIT0gWEZSTV9QT0xJQ1lfVFlQRV9BTlkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHdhbGstPnBvbGljeSA9PSBOVUxMICYmIHdhbGstPmNvdW50ICE9IDApCisJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSAmJiB3YWxrLT5zZXEgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlvbGQgPSBwb2wgPSB3YWxrLT5wb2xpY3k7Ci0Jd2Fsay0+cG9saWN5ID0gTlVMTDsKLQlyZWFkX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOwotCi0JZm9yICg7IHdhbGstPmN1cl90eXBlIDwgWEZSTV9QT0xJQ1lfVFlQRV9NQVg7IHdhbGstPmN1cl90eXBlKyspIHsKLQkJaWYgKHdhbGstPnR5cGUgIT0gd2Fsay0+Y3VyX3R5cGUgJiYKLQkJICAgIHdhbGstPnR5cGUgIT0gWEZSTV9QT0xJQ1lfVFlQRV9BTlkpCisJd3JpdGVfbG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSkKKwkJeCA9IGxpc3RfZmlyc3RfZW50cnkoJnhmcm1fcG9saWN5X2FsbCwgc3RydWN0IHhmcm1fcG9saWN5X3dhbGtfZW50cnksIGFsbCk7CisJZWxzZQorCQl4ID0gbGlzdF9lbnRyeSgmd2Fsay0+d2Fsay5hbGwsIHN0cnVjdCB4ZnJtX3BvbGljeV93YWxrX2VudHJ5LCBhbGwpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSh4LCAmeGZybV9wb2xpY3lfYWxsLCBhbGwpIHsKKwkJaWYgKHgtPmRlYWQpCiAJCQljb250aW51ZTsKLQotCQlpZiAocG9sID09IE5VTEwpIHsKLQkJCXBvbCA9IGxpc3RfZmlyc3RfZW50cnkoJnhmcm1fcG9saWN5X2J5dHlwZVt3YWxrLT5jdXJfdHlwZV0sCi0JCQkJCSAgICAgICBzdHJ1Y3QgeGZybV9wb2xpY3ksIGJ5dHlwZSk7CisJCXBvbCA9IGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgeGZybV9wb2xpY3ksIHdhbGspOworCQlpZiAod2Fsay0+dHlwZSAhPSBYRlJNX1BPTElDWV9UWVBFX0FOWSAmJgorCQkgICAgd2Fsay0+dHlwZSAhPSBwb2wtPnR5cGUpCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSBmdW5jKHBvbCwgeGZybV9wb2xpY3lfaWQyZGlyKHBvbC0+aW5kZXgpLAorCQkJICAgICB3YWxrLT5zZXEsIGRhdGEpOworCQlpZiAoZXJyb3IpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZ3YWxrLT53YWxrLmFsbCwgJngtPmFsbCk7CisJCQlnb3RvIG91dDsKIAkJfQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20ocG9sLCAmeGZybV9wb2xpY3lfYnl0eXBlW3dhbGstPmN1cl90eXBlXSwgYnl0eXBlKSB7Ci0JCQlpZiAocG9sLT5kZWFkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxhc3QpIHsKLQkJCQllcnJvciA9IGZ1bmMobGFzdCwgeGZybV9wb2xpY3lfaWQyZGlyKGxhc3QtPmluZGV4KSwKLQkJCQkJICAgICB3YWxrLT5jb3VudCwgZGF0YSk7Ci0JCQkJaWYgKGVycm9yKSB7Ci0JCQkJCXhmcm1fcG9sX2hvbGQobGFzdCk7Ci0JCQkJCXdhbGstPnBvbGljeSA9IGxhc3Q7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCX0KLQkJCWxhc3QgPSBwb2w7Ci0JCQl3YWxrLT5jb3VudCsrOwotCQl9Ci0JCXBvbCA9IE5VTEw7CisJCXdhbGstPnNlcSsrOwogCX0KLQlpZiAod2Fsay0+Y291bnQgPT0gMCkgeworCWlmICh3YWxrLT5zZXEgPT0gMCkgewogCQllcnJvciA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAobGFzdCkKLQkJZXJyb3IgPSBmdW5jKGxhc3QsIHhmcm1fcG9saWN5X2lkMmRpcihsYXN0LT5pbmRleCksIDAsIGRhdGEpOworCWxpc3RfZGVsX2luaXQoJndhbGstPndhbGsuYWxsKTsKIG91dDoKLQlyZWFkX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7Ci0JaWYgKG9sZCAhPSBOVUxMKQotCQl4ZnJtX3BvbF9wdXQob2xkKTsKKwl3cml0ZV91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOwogCXJldHVybiBlcnJvcjsKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9wb2xpY3lfd2Fsayk7CiAKK3ZvaWQgeGZybV9wb2xpY3lfd2Fsa19pbml0KHN0cnVjdCB4ZnJtX3BvbGljeV93YWxrICp3YWxrLCB1OCB0eXBlKQoreworCUlOSVRfTElTVF9IRUFEKCZ3YWxrLT53YWxrLmFsbCk7CisJd2Fsay0+d2Fsay5kZWFkID0gMTsKKwl3YWxrLT50eXBlID0gdHlwZTsKKwl3YWxrLT5zZXEgPSAwOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV93YWxrX2luaXQpOworCit2b2lkIHhmcm1fcG9saWN5X3dhbGtfZG9uZShzdHJ1Y3QgeGZybV9wb2xpY3lfd2FsayAqd2FsaykKK3sKKwlpZiAobGlzdF9lbXB0eSgmd2Fsay0+d2Fsay5hbGwpKQorCQlyZXR1cm47CisKKwl3cml0ZV9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlsaXN0X2RlbCgmd2Fsay0+d2Fsay5hbGwpOworCXdyaXRlX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3dhbGtfZG9uZSk7CisKIC8qCiAgKiBGaW5kIHBvbGljeSB0byBhcHBseSB0byB0aGlzIGZsb3cuCiAgKgpAQCAtMTA3Nyw2ICsxMDg1LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW4gPSBwb2xpY3lfaGFzaF9ieXNlbCgmcG9sLT5zZWxlY3RvciwKIAkJCQkJCSAgICAgcG9sLT5mYW1pbHksIGRpcik7CiAKKwlsaXN0X2FkZCgmcG9sLT53YWxrLmFsbCwgJnhmcm1fcG9saWN5X2FsbCk7CiAJaGxpc3RfYWRkX2hlYWQoJnBvbC0+Ynlkc3QsIGNoYWluKTsKIAlobGlzdF9hZGRfaGVhZCgmcG9sLT5ieWlkeCwgeGZybV9wb2xpY3lfYnlpZHgraWR4X2hhc2gocG9sLT5pbmRleCkpOwogCXhmcm1fcG9saWN5X2NvdW50W2Rpcl0rKzsKQEAgLTEwOTQsNiArMTEwMyw3IEBACiAKIAlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOwogCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CisJbGlzdF9kZWwoJnBvbC0+d2Fsay5hbGwpOwogCXhmcm1fcG9saWN5X2NvdW50W2Rpcl0tLTsKIAogCXJldHVybiBwb2w7CkBAIC0xNzE5LDcgKzE3MjksNyBAQAogCiAJCWZvciAocGkgPSAwOyBwaSA8IG5wb2xzOyBwaSsrKSB7CiAJCQlyZWFkX2xvY2tfYmgoJnBvbHNbcGldLT5sb2NrKTsKLQkJCXBvbF9kZWFkIHw9IHBvbHNbcGldLT5kZWFkOworCQkJcG9sX2RlYWQgfD0gcG9sc1twaV0tPndhbGsuZGVhZDsKIAkJCXJlYWRfdW5sb2NrX2JoKCZwb2xzW3BpXS0+bG9jayk7CiAJCX0KIApAQCAtMjQxNCw5ICsyNDI0LDcgQEAKIAkJCXBhbmljKCJYRlJNOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnlkc3QgaGFzaFxuIik7CiAJfQogCi0JZm9yIChkaXIgPSAwOyBkaXIgPCBYRlJNX1BPTElDWV9UWVBFX01BWDsgZGlyKyspCi0JCUlOSVRfTElTVF9IRUFEKCZ4ZnJtX3BvbGljeV9ieXR5cGVbZGlyXSk7Ci0KKwlJTklUX0xJU1RfSEVBRCgmeGZybV9wb2xpY3lfYWxsKTsKIAlJTklUX1dPUksoJnhmcm1fcG9saWN5X2djX3dvcmssIHhmcm1fcG9saWN5X2djX3Rhc2spOwogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmeGZybV9kZXZfbm90aWZpZXIpOwogfQpAQCAtMjYwMCw3ICsyNjA4LDcgQEAKIAlpbnQgaSwgaiwgbiA9IDA7CiAKIAl3cml0ZV9sb2NrX2JoKCZwb2wtPmxvY2spOwotCWlmICh1bmxpa2VseShwb2wtPmRlYWQpKSB7CisJaWYgKHVubGlrZWx5KHBvbC0+d2Fsay5kZWFkKSkgewogCQkvKiB0YXJnZXQgcG9saWN5IGhhcyBiZWVuIGRlbGV0ZWQgKi8KIAkJd3JpdGVfdW5sb2NrX2JoKCZwb2wtPmxvY2spOwogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTI2NzEsNyArMjY3OSw4IEBACiB9CiAKIGludCB4ZnJtX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAotCQkgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9taWdyYXRlKQorCQkgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9taWdyYXRlLAorCQkgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKQogewogCWludCBpLCBlcnIsIG54X2N1ciA9IDAsIG54X25ldyA9IDA7CiAJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wgPSBOVUxMOwpAQCAtMjcxNSw3ICsyNzI0LDcgQEAKIAl9CiAKIAkvKiBTdGFnZSA1IC0gYW5ub3VuY2UgKi8KLQlrbV9taWdyYXRlKHNlbCwgZGlyLCB0eXBlLCBtLCBudW1fbWlncmF0ZSk7CisJa21fbWlncmF0ZShzZWwsIGRpciwgdHlwZSwgbSwgbnVtX21pZ3JhdGUsIGspOwogCiAJeGZybV9wb2xfcHV0KHBvbCk7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCA3YmQ2MmY2Li41MDgzMzdmIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC00MDgsMTEgKzQwOCwxMCBAQAogCXN0cnVjdCBobGlzdF9oZWFkIGdjX2xpc3Q7CiAKIAlzcGluX2xvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7Ci0JZ2NfbGlzdC5maXJzdCA9IHhmcm1fc3RhdGVfZ2NfbGlzdC5maXJzdDsKLQlJTklUX0hMSVNUX0hFQUQoJnhmcm1fc3RhdGVfZ2NfbGlzdCk7CisJaGxpc3RfbW92ZV9saXN0KCZ4ZnJtX3N0YXRlX2djX2xpc3QsICZnY19saXN0KTsKIAlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoeCwgZW50cnksIHRtcCwgJmdjX2xpc3QsIGJ5ZHN0KQorCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoeCwgZW50cnksIHRtcCwgJmdjX2xpc3QsIGdjbGlzdCkKIAkJeGZybV9zdGF0ZV9nY19kZXN0cm95KHgpOwogCiAJd2FrZV91cCgma21fd2FpdHEpOwpAQCAtNTE0LDcgKzUxMyw3IEBACiAJaWYgKHgpIHsKIAkJYXRvbWljX3NldCgmeC0+cmVmY250LCAxKTsKIAkJYXRvbWljX3NldCgmeC0+dHVubmVsX3VzZXJzLCAwKTsKLQkJSU5JVF9MSVNUX0hFQUQoJngtPmFsbCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4LT5rbS5hbGwpOwogCQlJTklUX0hMSVNUX05PREUoJngtPmJ5ZHN0KTsKIAkJSU5JVF9ITElTVF9OT0RFKCZ4LT5ieXNyYyk7CiAJCUlOSVRfSExJU1RfTk9ERSgmeC0+YnlzcGkpOwpAQCAtNTQwLDEyICs1MzksOCBAQAogewogCVdBUk5fT04oeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9ERUFEKTsKIAotCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKLQlsaXN0X2RlbCgmeC0+YWxsKTsKLQlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKLQogCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKLQlobGlzdF9hZGRfaGVhZCgmeC0+Ynlkc3QsICZ4ZnJtX3N0YXRlX2djX2xpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZ4LT5nY2xpc3QsICZ4ZnJtX3N0YXRlX2djX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2djX2xvY2spOwogCXNjaGVkdWxlX3dvcmsoJnhmcm1fc3RhdGVfZ2Nfd29yayk7CiB9CkBAIC01NTgsNiArNTUzLDcgQEAKIAlpZiAoeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9ERUFEKSB7CiAJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOwogCQlzcGluX2xvY2soJnhmcm1fc3RhdGVfbG9jayk7CisJCWxpc3RfZGVsKCZ4LT5rbS5hbGwpOwogCQlobGlzdF9kZWwoJngtPmJ5ZHN0KTsKIAkJaGxpc3RfZGVsKCZ4LT5ieXNyYyk7CiAJCWlmICh4LT5pZC5zcGkpCkBAIC04NTgsNiArODU0LDcgQEAKIAogCQlpZiAoa21fcXVlcnkoeCwgdG1wbCwgcG9sKSA9PSAwKSB7CiAJCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfQUNROworCQkJbGlzdF9hZGQoJngtPmttLmFsbCwgJnhmcm1fc3RhdGVfYWxsKTsKIAkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgeGZybV9zdGF0ZV9ieWRzdCtoKTsKIAkJCWggPSB4ZnJtX3NyY19oYXNoKGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKIAkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNyYywgeGZybV9zdGF0ZV9ieXNyYytoKTsKQEAgLTkyNiw3ICs5MjMsNyBAQAogCiAJeC0+Z2VuaWQgPSArK3hmcm1fc3RhdGVfZ2VuaWQ7CiAKLQlsaXN0X2FkZF90YWlsKCZ4LT5hbGwsICZ4ZnJtX3N0YXRlX2FsbCk7CisJbGlzdF9hZGQoJngtPmttLmFsbCwgJnhmcm1fc3RhdGVfYWxsKTsKIAogCWggPSB4ZnJtX2RzdF9oYXNoKCZ4LT5pZC5kYWRkciwgJngtPnByb3BzLnNhZGRyLAogCQkJICB4LT5wcm9wcy5yZXFpZCwgeC0+cHJvcHMuZmFtaWx5KTsKQEAgLTEwNTUsNiArMTA1Miw3IEBACiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJeC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzeXNjdGxfeGZybV9hY3FfZXhwaXJlcypIWjsKIAkJYWRkX3RpbWVyKCZ4LT50aW1lcik7CisJCWxpc3RfYWRkKCZ4LT5rbS5hbGwsICZ4ZnJtX3N0YXRlX2FsbCk7CiAJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgeGZybV9zdGF0ZV9ieWRzdCtoKTsKIAkJaCA9IHhmcm1fc3JjX2hhc2goZGFkZHIsIHNhZGRyLCBmYW1pbHkpOwogCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIHhmcm1fc3RhdGVfYnlzcmMraCk7CkBAIC0xNTUxLDQ3ICsxNTQ5LDYyIEBACiAJCSAgICBpbnQgKCpmdW5jKShzdHJ1Y3QgeGZybV9zdGF0ZSAqLCBpbnQsIHZvaWQqKSwKIAkJICAgIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHhmcm1fc3RhdGUgKm9sZCwgKngsICpsYXN0ID0gTlVMTDsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHhmcm1fc3RhdGVfd2FsayAqeDsKIAlpbnQgZXJyID0gMDsKIAotCWlmICh3YWxrLT5zdGF0ZSA9PSBOVUxMICYmIHdhbGstPmNvdW50ICE9IDApCisJaWYgKHdhbGstPnNlcSAhPSAwICYmIGxpc3RfZW1wdHkoJndhbGstPmFsbCkpCiAJCXJldHVybiAwOwogCi0Jb2xkID0geCA9IHdhbGstPnN0YXRlOwotCXdhbGstPnN0YXRlID0gTlVMTDsKIAlzcGluX2xvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJeCA9IGxpc3RfZmlyc3RfZW50cnkoJnhmcm1fc3RhdGVfYWxsLCBzdHJ1Y3QgeGZybV9zdGF0ZSwgYWxsKTsKKwlpZiAobGlzdF9lbXB0eSgmd2Fsay0+YWxsKSkKKwkJeCA9IGxpc3RfZmlyc3RfZW50cnkoJnhmcm1fc3RhdGVfYWxsLCBzdHJ1Y3QgeGZybV9zdGF0ZV93YWxrLCBhbGwpOworCWVsc2UKKwkJeCA9IGxpc3RfZW50cnkoJndhbGstPmFsbCwgc3RydWN0IHhmcm1fc3RhdGVfd2FsaywgYWxsKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20oeCwgJnhmcm1fc3RhdGVfYWxsLCBhbGwpIHsKLQkJaWYgKHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfREVBRCkKKwkJaWYgKHgtPnN0YXRlID09IFhGUk1fU1RBVEVfREVBRCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXhmcm1faWRfcHJvdG9fbWF0Y2goeC0+aWQucHJvdG8sIHdhbGstPnByb3RvKSkKKwkJc3RhdGUgPSBjb250YWluZXJfb2YoeCwgc3RydWN0IHhmcm1fc3RhdGUsIGttKTsKKwkJaWYgKCF4ZnJtX2lkX3Byb3RvX21hdGNoKHN0YXRlLT5pZC5wcm90bywgd2Fsay0+cHJvdG8pKQogCQkJY29udGludWU7Ci0JCWlmIChsYXN0KSB7Ci0JCQllcnIgPSBmdW5jKGxhc3QsIHdhbGstPmNvdW50LCBkYXRhKTsKLQkJCWlmIChlcnIpIHsKLQkJCQl4ZnJtX3N0YXRlX2hvbGQobGFzdCk7Ci0JCQkJd2Fsay0+c3RhdGUgPSBsYXN0OwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQllcnIgPSBmdW5jKHN0YXRlLCB3YWxrLT5zZXEsIGRhdGEpOworCQlpZiAoZXJyKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmd2Fsay0+YWxsLCAmeC0+YWxsKTsKKwkJCWdvdG8gb3V0OwogCQl9Ci0JCWxhc3QgPSB4OwotCQl3YWxrLT5jb3VudCsrOworCQl3YWxrLT5zZXErKzsKIAl9Ci0JaWYgKHdhbGstPmNvdW50ID09IDApIHsKKwlpZiAod2Fsay0+c2VxID09IDApIHsKIAkJZXJyID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChsYXN0KQotCQllcnIgPSBmdW5jKGxhc3QsIDAsIGRhdGEpOworCWxpc3RfZGVsX2luaXQoJndhbGstPmFsbCk7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7Ci0JaWYgKG9sZCAhPSBOVUxMKQotCQl4ZnJtX3N0YXRlX3B1dChvbGQpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfd2Fsayk7CiAKK3ZvaWQgeGZybV9zdGF0ZV93YWxrX2luaXQoc3RydWN0IHhmcm1fc3RhdGVfd2FsayAqd2FsaywgdTggcHJvdG8pCit7CisJSU5JVF9MSVNUX0hFQUQoJndhbGstPmFsbCk7CisJd2Fsay0+cHJvdG8gPSBwcm90bzsKKwl3YWxrLT5zdGF0ZSA9IFhGUk1fU1RBVEVfREVBRDsKKwl3YWxrLT5zZXEgPSAwOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX3dhbGtfaW5pdCk7CisKK3ZvaWQgeGZybV9zdGF0ZV93YWxrX2RvbmUoc3RydWN0IHhmcm1fc3RhdGVfd2FsayAqd2FsaykKK3sKKwlpZiAobGlzdF9lbXB0eSgmd2Fsay0+YWxsKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCWxpc3RfZGVsKCZ3YWxrLT5hbGwpOworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV93YWxrX2RvbmUpOworCiAKIHZvaWQgeGZybV9yZXBsYXlfbm90aWZ5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgZXZlbnQpCiB7CkBAIC0xODAxLDcgKzE4MTQsOCBAQAogCiAjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQogaW50IGttX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAotCSAgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCisJICAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSwKKwkgICAgICAgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKQogewogCWludCBlcnIgPSAtRUlOVkFMOwogCWludCByZXQ7CkBAIC0xODEwLDcgKzE4MjQsNyBAQAogCXJlYWRfbG9jaygmeGZybV9rbV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGttLCAmeGZybV9rbV9saXN0LCBsaXN0KSB7CiAJCWlmIChrbS0+bWlncmF0ZSkgewotCQkJcmV0ID0ga20tPm1pZ3JhdGUoc2VsLCBkaXIsIHR5cGUsIG0sIG51bV9taWdyYXRlKTsKKwkJCXJldCA9IGttLT5taWdyYXRlKHNlbCwgZGlyLCB0eXBlLCBtLCBudW1fbWlncmF0ZSwgayk7CiAJCQlpZiAoIXJldCkKIAkJCQllcnIgPSByZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggMDRjNDE1MC4uNGE4YTFhYiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTExMDIsNyArMTEwMiw3IEBACiAJcmV0dXJuIHhwOwogIGVycm9yOgogCSplcnJwID0gZXJyOwotCXhwLT5kZWFkID0gMTsKKwl4cC0+d2Fsay5kZWFkID0gMTsKIAl4ZnJtX3BvbGljeV9kZXN0cm95KHhwKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE1OTUsNyArMTU5NSw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCiAJcmVhZF9sb2NrKCZ4cC0+bG9jayk7Ci0JaWYgKHhwLT5kZWFkKSB7CisJaWYgKHhwLT53YWxrLmRlYWQpIHsKIAkJcmVhZF91bmxvY2soJnhwLT5sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTcxMCwxMiArMTcxMCwyMyBAQAogCiAjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQogc3RhdGljIGludCBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm1hLAorCQkJCSAgc3RydWN0IHhmcm1fa21hZGRyZXNzICprLAogCQkJCSAgc3RydWN0IG5sYXR0ciAqKmF0dHJzLCBpbnQgKm51bSkKIHsKIAlzdHJ1Y3QgbmxhdHRyICpydCA9IGF0dHJzW1hGUk1BX01JR1JBVEVdOwogCXN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSAqdW07CiAJaW50IGksIG51bV9taWdyYXRlOwogCisJaWYgKGsgIT0gTlVMTCkgeworCQlzdHJ1Y3QgeGZybV91c2VyX2ttYWRkcmVzcyAqdWs7CisKKwkJdWsgPSBubGFfZGF0YShhdHRyc1tYRlJNQV9LTUFERFJFU1NdKTsKKwkJbWVtY3B5KCZrLT5sb2NhbCwgJnVrLT5sb2NhbCwgc2l6ZW9mKGstPmxvY2FsKSk7CisJCW1lbWNweSgmay0+cmVtb3RlLCAmdWstPnJlbW90ZSwgc2l6ZW9mKGstPnJlbW90ZSkpOworCQlrLT5mYW1pbHkgPSB1ay0+ZmFtaWx5OworCQlrLT5yZXNlcnZlZCA9IHVrLT5yZXNlcnZlZDsKKwl9CisKIAl1bSA9IG5sYV9kYXRhKHJ0KTsKIAludW1fbWlncmF0ZSA9IG5sYV9sZW4ocnQpIC8gc2l6ZW9mKCp1bSk7CiAKQEAgLTE3NDUsNiArMTc1Niw3IEBACiB7CiAJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCAqcGkgPSBubG1zZ19kYXRhKG5saCk7CiAJc3RydWN0IHhmcm1fbWlncmF0ZSBtW1hGUk1fTUFYX0RFUFRIXTsKKwlzdHJ1Y3QgeGZybV9rbWFkZHJlc3Mga20sICprbXA7CiAJdTggdHlwZTsKIAlpbnQgZXJyOwogCWludCBuID0gMDsKQEAgLTE3NTIsMTkgKzE3NjQsMjAgQEAKIAlpZiAoYXR0cnNbWEZSTUFfTUlHUkFURV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlrbXAgPSBhdHRyc1tYRlJNQV9LTUFERFJFU1NdID8gJmttIDogTlVMTDsKKwogCWVyciA9IGNvcHlfZnJvbV91c2VyX3BvbGljeV90eXBlKCZ0eXBlLCBhdHRycyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IGNvcHlfZnJvbV91c2VyX21pZ3JhdGUoKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKiltLAotCQkJCSAgICAgYXR0cnMsICZuKTsKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKChzdHJ1Y3QgeGZybV9taWdyYXRlICopbSwga21wLCBhdHRycywgJm4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAlpZiAoIW4pCiAJCXJldHVybiAwOwogCi0JeGZybV9taWdyYXRlKCZwaS0+c2VsLCBwaS0+ZGlyLCB0eXBlLCBtLCBuKTsKKwl4ZnJtX21pZ3JhdGUoJnBpLT5zZWwsIHBpLT5kaXIsIHR5cGUsIG0sIG4sIGttcCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTUsMTYgKzE4MDgsMzAgQEAKIAlyZXR1cm4gbmxhX3B1dChza2IsIFhGUk1BX01JR1JBVEUsIHNpemVvZih1bSksICZ1bSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHhmcm1fbWlncmF0ZV9tc2dzaXplKGludCBudW1fbWlncmF0ZSkKK3N0YXRpYyBpbnQgY29weV90b191c2VyX2ttYWRkcmVzcyhzdHJ1Y3QgeGZybV9rbWFkZHJlc3MgKmssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHhmcm1fdXNlcl9rbWFkZHJlc3MgdWs7CisKKwltZW1zZXQoJnVrLCAwLCBzaXplb2YodWspKTsKKwl1ay5mYW1pbHkgPSBrLT5mYW1pbHk7CisJdWsucmVzZXJ2ZWQgPSBrLT5yZXNlcnZlZDsKKwltZW1jcHkoJnVrLmxvY2FsLCAmay0+bG9jYWwsIHNpemVvZih1ay5sb2NhbCkpOworCW1lbWNweSgmdWsucmVtb3RlLCAmay0+bG9jYWwsIHNpemVvZih1ay5yZW1vdGUpKTsKKworCXJldHVybiBubGFfcHV0KHNrYiwgWEZSTUFfS01BRERSRVNTLCBzaXplb2YodWspLCAmdWspOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCB4ZnJtX21pZ3JhdGVfbXNnc2l6ZShpbnQgbnVtX21pZ3JhdGUsIGludCB3aXRoX2ttYSkKIHsKIAlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQpKQotCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX21pZ3JhdGUpICogbnVtX21pZ3JhdGUpCi0JICAgICAgICsgdXNlcnBvbGljeV90eXBlX2F0dHJzaXplKCk7CisJICAgICAgKyAod2l0aF9rbWEgPyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHhmcm1fa21hZGRyZXNzKSkgOiAwKQorCSAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSkgKiBudW1fbWlncmF0ZSkKKwkgICAgICArIHVzZXJwb2xpY3lfdHlwZV9hdHRyc2l6ZSgpOwogfQogCiBzdGF0aWMgaW50IGJ1aWxkX21pZ3JhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwKLQkJCSBpbnQgbnVtX21pZ3JhdGUsIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsCi0JCQkgdTggZGlyLCB1OCB0eXBlKQorCQkJIGludCBudW1fbWlncmF0ZSwgc3RydWN0IHhmcm1fa21hZGRyZXNzICprLAorCQkJIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSkKIHsKIAlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKIAlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkICpwb2xfaWQ7CkBAIC0xODIxLDYgKzE4NDgsOSBAQAogCW1lbWNweSgmcG9sX2lkLT5zZWwsIHNlbCwgc2l6ZW9mKHBvbF9pZC0+c2VsKSk7CiAJcG9sX2lkLT5kaXIgPSBkaXI7CiAKKwlpZiAoayAhPSBOVUxMICYmIChjb3B5X3RvX3VzZXJfa21hZGRyZXNzKGssIHNrYikgPCAwKSkKKwkJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKwogCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUodHlwZSwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIApAQCAtMTgzNiwyMyArMTg2NiwyNSBAQAogfQogCiBzdGF0aWMgaW50IHhmcm1fc2VuZF9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKLQkJCSAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9taWdyYXRlKQorCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUsCisJCQkgICAgIHN0cnVjdCB4ZnJtX2ttYWRkcmVzcyAqaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jc2tiID0gbmxtc2dfbmV3KHhmcm1fbWlncmF0ZV9tc2dzaXplKG51bV9taWdyYXRlKSwgR0ZQX0FUT01JQyk7CisJc2tiID0gbmxtc2dfbmV3KHhmcm1fbWlncmF0ZV9tc2dzaXplKG51bV9taWdyYXRlLCAhIWspLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogYnVpbGQgbWlncmF0ZSAqLwotCWlmIChidWlsZF9taWdyYXRlKHNrYiwgbSwgbnVtX21pZ3JhdGUsIHNlbCwgZGlyLCB0eXBlKSA8IDApCisJaWYgKGJ1aWxkX21pZ3JhdGUoc2tiLCBtLCBudW1fbWlncmF0ZSwgaywgc2VsLCBkaXIsIHR5cGUpIDwgMCkKIAkJQlVHKCk7CiAKIAlyZXR1cm4gbmxtc2dfbXVsdGljYXN0KHhmcm1fbmwsIHNrYiwgMCwgWEZSTU5MR1JQX01JR1JBVEUsIEdGUF9BVE9NSUMpOwogfQogI2Vsc2UKIHN0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAotCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCisJCQkgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSwKKwkJCSAgICAgc3RydWN0IHhmcm1fa21hZGRyZXNzICprKQogewogCXJldHVybiAtRU5PUFJPVE9PUFQ7CiB9CkBAIC0xOTAxLDYgKzE5MzMsNyBAQAogCVtYRlJNQV9DT0FERFJdCQk9IHsgLmxlbiA9IHNpemVvZih4ZnJtX2FkZHJlc3NfdCkgfSwKIAlbWEZSTUFfUE9MSUNZX1RZUEVdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSl9LAogCVtYRlJNQV9NSUdSQVRFXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlKSB9LAorCVtYRlJNQV9LTUFERFJFU1NdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfa21hZGRyZXNzKSB9LAogfTsKIAogc3RhdGljIHN0cnVjdCB4ZnJtX2xpbmsgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZSBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKaW5kZXggZDY0ZTZiYS4uOTgyZGNhZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorKysgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCkBAIC0xMDUsMTIgKzEwNSwxMiBAQAogIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9d2luY2hpcC1jNiwtbWFyY2g9aTU4NikKIAogY2Mtb3B0aW9uID0gJChjYWxsIHRyeS1ydW4sXAotCSQoQ0MpICQoS0JVSUxEX0NGTEFHUykgJCgxKSAtUyAteGMgL2Rldi9udWxsIC1vICIkJFRNUCIsJCgxKSwkKDIpKQorCSQoQ0MpICQoS0JVSUxEX0NGTEFHUykgJCgxKSAtYyAteGMgL2Rldi9udWxsIC1vICIkJFRNUCIsJCgxKSwkKDIpKQogCiAjIGNjLW9wdGlvbi15bgogIyBVc2FnZTogZmxhZyA6PSAkKGNhbGwgY2Mtb3B0aW9uLXluLC1tYXJjaD13aW5jaGlwLWM2KQogY2Mtb3B0aW9uLXluID0gJChjYWxsIHRyeS1ydW4sXAotCSQoQ0MpICQoS0JVSUxEX0NGTEFHUykgJCgxKSAtUyAteGMgL2Rldi9udWxsIC1vICIkJFRNUCIseSxuKQorCSQoQ0MpICQoS0JVSUxEX0NGTEFHUykgJCgxKSAtYyAteGMgL2Rldi9udWxsIC1vICIkJFRNUCIseSxuKQogCiAjIGNjLW9wdGlvbi1hbGlnbgogIyBQcmVmaXggYWxpZ24gd2l0aCBlaXRoZXIgLWZhbGlnbiBvciAtbWFsaWduCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlIGIvc2NyaXB0cy9NYWtlZmlsZQppbmRleCAxYzczYzVhLi5hYWZkZjA2IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIAogc3ViZGlyLSQoQ09ORklHX01PRFZFUlNJT05TKSArPSBnZW5rc3ltcwogc3ViZGlyLXkgICAgICAgICAgICAgICAgICAgICArPSBtb2QKK3N1YmRpci0kKENPTkZJR19TRUNVUklUWV9TRUxJTlVYKSArPSBzZWxpbnV4CiAKICMgTGV0IGNsZWFuIGRlc2NlbmQgaW50byBzdWJkaXJzCi1zdWJkaXItCSs9IGJhc2ljIGtjb25maWcgcGFja2FnZQorc3ViZGlyLQkrPSBiYXNpYyBrY29uZmlnIHBhY2thZ2Ugc2VsaW51eApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5saWIgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgppbmRleCBlYTQ4YjgyLi5iNGNhMzhhIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmxpYgorKysgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgpAQCAtOTYsNiArOTYsMTQgQEAKIG1vZG5hbWVfZmxhZ3MgID0gJChpZiAkKGZpbHRlciAxLCQod29yZHMgJChtb2RuYW1lKSkpLFwKICAgICAgICAgICAgICAgICAgLUQiS0JVSUxEX01PRE5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJChtb2RuYW1lKSkpIikKIAorI2hhc2ggdmFsdWVzCitpZmRlZiBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcKK2RlYnVnX2ZsYWdzID0gLUQiREVCVUdfSEFTSD0kKHNoZWxsIC4vc2NyaXB0cy9iYXNpYy9oYXNoIGRqYjIgJChARCkkKG1vZG5hbWUpKSJcCisgICAgICAgICAgICAgIC1EIkRFQlVHX0hBU0gyPSQoc2hlbGwgLi9zY3JpcHRzL2Jhc2ljL2hhc2ggcjUgJChARCkkKG1vZG5hbWUpKSIKK2Vsc2UKK2RlYnVnX2ZsYWdzID0KK2VuZGlmCisKIG9yaWdfY19mbGFncyAgID0gJChLQlVJTERfQ0ZMQUdTKSAkKGNjZmxhZ3MteSkgJChDRkxBR1NfJChiYXNldGFyZ2V0KS5vKQogX2NfZmxhZ3MgICAgICAgPSAkKGZpbHRlci1vdXQgJChDRkxBR1NfUkVNT1ZFXyQoYmFzZXRhcmdldCkubyksICQob3JpZ19jX2ZsYWdzKSkKIF9hX2ZsYWdzICAgICAgID0gJChLQlVJTERfQUZMQUdTKSAkKGFzZmxhZ3MteSkgJChBRkxBR1NfJChiYXNldGFyZ2V0KS5vKQpAQCAtMTIxLDcgKzEyOSw4IEBACiAKIGNfZmxhZ3MgICAgICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoTk9TVERJTkNfRkxBR1MpICQoS0JVSUxEX0NQUEZMQUdTKSBcCiAJCSAkKF9fY19mbGFncykgJChtb2RrZXJuX2NmbGFncykgXAotCQkgLUQiS0JVSUxEX1NUUihzKT1cI3MiICQoYmFzZW5hbWVfZmxhZ3MpICQobW9kbmFtZV9mbGFncykKKwkJIC1EIktCVUlMRF9TVFIocyk9XCNzIiAkKGJhc2VuYW1lX2ZsYWdzKSAkKG1vZG5hbWVfZmxhZ3MpIFwKKwkJICAkKGRlYnVnX2ZsYWdzKQogCiBhX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKEtCVUlMRF9DUFBGTEFHUykgXAogCQkgJChfX2FfZmxhZ3MpICQobW9ka2Vybl9hZmxhZ3MpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlIGIvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZQppbmRleCA0YzMyNGExLi4wOTU1OTk1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiAjIGZpeGRlcDogCSBVc2VkIHRvIGdlbmVyYXRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZHVyaW5nIGJ1aWxkIHByb2Nlc3MKICMgZG9jcHJvYzoJIFVzZWQgaW4gRG9jdW1lbnRhdGlvbi9Eb2NCb29rCiAKLWhvc3Rwcm9ncy15CTo9IGZpeGRlcCBkb2Nwcm9jCitob3N0cHJvZ3MteQk6PSBmaXhkZXAgZG9jcHJvYyBoYXNoCiBhbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCiAKICMgZml4ZGVwIGlzIG5lZWRlZCB0byBjb21waWxlIG90aGVyIGhvc3QgcHJvZ3JhbXMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvaGFzaC5jIGIvc2NyaXB0cy9iYXNpYy9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5OWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvaGFzaC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiwgSmFzb24gQmFyb24gPGpiYXJvbkByZWRoYXQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBEWU5BTUlDX0RFQlVHX0hBU0hfQklUUyA2CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9ncmFtOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6ICVzIDxkamIyfHI1PiA8bW9kbmFtZT5cbiIsIHByb2dyYW0pOworCWV4aXQoMSk7Cit9CisKKy8qIGRqYjIgaGFzaGluZyBhbGdvcml0aG0gYnkgRGFuIEJlcm5zdGVpbi4gRnJvbToKKyAqIGh0dHA6Ly93d3cuY3NlLnlvcmt1LmNhL35vei9oYXNoLmh0bWwKKyAqLworCit1bnNpZ25lZCBpbnQgZGpiMl9oYXNoKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSA1MzgxOworCWludCBjOworCisJYyA9ICpzdHI7CisJd2hpbGUgKGMpIHsKKwkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgYzsKKwkJYyA9ICorK3N0cjsKKwl9CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpKGhhc2ggJiAoKDEgPDwgRFlOQU1JQ19ERUJVR19IQVNIX0JJVFMpIC0gMSkpOworfQorCit1bnNpZ25lZCBpbnQgcjVfaGFzaChjaGFyICpzdHIpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gMDsKKwlpbnQgYzsKKworCWMgPSAqc3RyOworCXdoaWxlIChjKSB7CisJCWhhc2ggPSAoaGFzaCArIChjIDw8IDQpICsgKGMgPj4gNCkpICogMTE7CisJCWMgPSAqKytzdHI7CisJfQorCXJldHVybiAodW5zaWduZWQgaW50KShoYXNoICYgKCgxIDw8IERZTkFNSUNfREVCVUdfSEFTSF9CSVRTKSAtIDEpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwcm9ncmFtID0gYXJndlswXTsKKworCWlmIChhcmdjICE9IDMpCisJCXVzYWdlKCk7CisJaWYgKCFzdHJjbXAoYXJndlsxXSwgImRqYjIiKSkKKwkJcHJpbnRmKCIlZFxuIiwgZGpiMl9oYXNoKGFyZ3ZbMl0pKTsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJyNSIpKQorCQlwcmludGYoIiVkXG4iLCByNV9oYXNoKGFyZ3ZbMl0pKTsKKwllbHNlCisJCXVzYWdlKCk7CisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ib290Z3JhcGgucGwgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQzMzUzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ib290Z3JhcGgucGwKQEAgLTAsMCArMSwxNDcgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIENvcHlyaWdodCAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsCisjCisjIFRoaXMgcHJvZ3JhbSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSBpbiBhIGZpbGUgbmFtZWQgQ09QWUlORzsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorIyBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisjCisjIEF1dGhvcnM6CisjIAlBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisKKworIworIyBUaGlzIHNjcmlwdCB0dXJucyBhIGRtZXNnIG91dHB1dCBpbnRvIGEgU1ZHIGdyYXBoaWMgdGhhdCBzaG93cyB3aGljaAorIyBmdW5jdGlvbnMgdGFrZSBob3cgbXVjaCB0aW1lLiBZb3UgY2FuIHZpZXcgU1ZHIGdyYXBoaWNzIHdpdGggdmFyaW91cworIyBwcm9ncmFtcywgaW5jbHVkaW5nIElua3NjYXBlLCBUaGUgR2ltcCBhbmQgRmlyZWZveC4KKyMKKyMKKyMgRm9yIHRoaXMgc2NyaXB0IHRvIHdvcmssIHRoZSBrZXJuZWwgbmVlZHMgdG8gYmUgY29tcGlsZWQgd2l0aCB0aGUKKyMgQ09ORklHX1BSSU5US19USU1FIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZWQsIGFuZCB3aXRoCisjICJpbml0Y2FsbF9kZWJ1ZyIgcGFzc2VkIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorIworIyB1c2FnZToKKyMgCWRtZXNnIHwgcGVybCBzY3JpcHRzL2Jvb3RncmFwaC5wbCA+IG91dHB1dC5zdmcKKyMKKworbXkgQHJvd3M7CitteSAlc3RhcnQsICVlbmQsICVyb3c7CitteSAkZG9uZSA9IDA7CitteSAkcm93Y291bnQgPSAwOworbXkgJG1heHRpbWUgPSAwOworbXkgJGZpcnN0dGltZSA9IDEwMDsKK215ICRjb3VudCA9IDA7Cit3aGlsZSAoPD4pIHsKKwlteSAkbGluZSA9ICRfOworCWlmICgkbGluZSA9fiAvKFswLTlcLl0rKVxdIGNhbGxpbmcgIChbYS16QS1aMC05XF9dKylcKy8pIHsKKwkJbXkgJGZ1bmMgPSAkMjsKKwkJaWYgKCRkb25lID09IDApIHsKKwkJCSRzdGFydHskZnVuY30gPSAkMTsKKwkJCWlmICgkMSA8ICRmaXJzdHRpbWUpIHsKKwkJCQkkZmlyc3R0aW1lID0gJDE7CisJCQl9CisJCX0KKwkJJHJvd3skZnVuY30gPSAxOworCQlpZiAoJGxpbmUgPX4gL1xAIChbMC05XSspLykgeworCQkJbXkgJHBpZCA9ICQxOworCQkJaWYgKCFkZWZpbmVkKCRyb3dzWyRwaWRdKSkgeworCQkJCSRyb3djb3VudCA9ICRyb3djb3VudCArIDE7CisJCQkJJHJvd3NbJHBpZF0gPSAkcm93Y291bnQ7CisJCQl9CisJCQkkcm93eyRmdW5jfSA9ICRyb3dzWyRwaWRdOworCQl9CisJCSRjb3VudCA9ICRjb3VudCArIDE7CisJfQorCisJaWYgKCRsaW5lID1+IC8oWzAtOVwuXSspXF0gaW5pdGNhbGwgKFthLXpBLVowLTlcX10rKVwrLipyZXR1cm5lZC8pIHsKKwkJaWYgKCRkb25lID09IDApIHsKKwkJCSRlbmR7JDJ9ID0gJDE7CisJCQkkbWF4dGltZSA9ICQxOworCQl9CisJfQorCWlmICgkbGluZSA9fiAvV3JpdGUgcHJvdGVjdGluZyB0aGUvKSB7CisJCSRkb25lID0gMTsKKwl9CisJaWYgKCRsaW5lID1+IC9GcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5LykgeworCQkkZG9uZSA9IDE7CisJfQorfQorCitpZiAoJGNvdW50ID09IDApIHsKKwlwcmludCAiTm8gZGF0YSBmb3VuZCBpbiB0aGUgZG1lc2cuIE1ha2Ugc3VyZSB0aGF0ICdwcmludGsudGltZT0xJyBhbmRcbiI7CisJcHJpbnQgIidpbml0Y2FsbF9kZWJ1ZycgYXJlIHBhc3NlZCBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZS5cblxuIjsKKwlwcmludCAiVXNhZ2U6IFxuIjsKKwlwcmludCAiICAgICAgZG1lc2cgfCBwZXJsIHNjcmlwdHMvYm9vdGdyYXBoLnBsID4gb3V0cHV0LnN2Z1xuXG4iOworCWV4aXQ7Cit9CisKK3ByaW50ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCI/PiBcbiI7CitwcmludCAiPHN2ZyB3aWR0aD1cIjEwMDBcIiBoZWlnaHQ9XCIxMDAlXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiI7CisKK215IEBzdHlsZXM7CisKKyRzdHlsZXNbMF0gPSAiZmlsbDpyZ2IoMCwwLDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzFdID0gImZpbGw6cmdiKDAsMjU1LDApO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1syXSA9ICJmaWxsOnJnYigyNTUsMCwyMCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzNdID0gImZpbGw6cmdiKDI1NSwyNTUsMjApO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s0XSA9ICJmaWxsOnJnYigyNTUsMCwyNTUpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s1XSA9ICJmaWxsOnJnYigwLDI1NSwyNTUpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s2XSA9ICJmaWxsOnJnYigwLDEyOCwyNTUpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s3XSA9ICJmaWxsOnJnYigwLDI1NSwxMjgpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s4XSA9ICJmaWxsOnJnYigyNTUsMCwxMjgpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOworJHN0eWxlc1s5XSA9ICJmaWxsOnJnYigyNTUsMjU1LDEyOCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzEwXSA9ICJmaWxsOnJnYigyNTUsMTI4LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7Ciskc3R5bGVzWzExXSA9ICJmaWxsOnJnYigxMjgsMjU1LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7CisKK215ICRtdWx0ID0gOTUwLjAgLyAoJG1heHRpbWUgLSAkZmlyc3R0aW1lKTsKK215ICR0aHJlc2hvbGQgPSAoJG1heHRpbWUgLSAkZmlyc3R0aW1lKSAvIDYwLjA7CitteSAkc3R5bGVjb3VudGVyID0gMDsKK3doaWxlICgoJGtleSwkdmFsdWUpID0gZWFjaCAlc3RhcnQpIHsKKwlteSAkZHVyYXRpb24gPSAkZW5keyRrZXl9IC0gJHN0YXJ0eyRrZXl9OworCisJaWYgKCRkdXJhdGlvbiA+PSAkdGhyZXNob2xkKSB7CisJCW15ICRzLCAkczIsICRlLCAkeTsKKwkJJHMgPSAoJHZhbHVlIC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKKwkJJHMyID0gJHMgKyA2OworCQkkZSA9ICgkZW5keyRrZXl9IC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKKwkJJHcgPSAkZSAtICRzOworCisJCSR5ID0gJHJvd3ska2V5fSAqIDE1MDsKKwkJJHkyID0gJHkgKyA0OworCisJCSRzdHlsZSA9ICRzdHlsZXNbJHN0eWxlY291bnRlcl07CisJCSRzdHlsZWNvdW50ZXIgPSAkc3R5bGVjb3VudGVyICsgMTsKKwkJaWYgKCRzdHlsZWNvdW50ZXIgPiAxMSkgeworCQkJJHN0eWxlY291bnRlciA9IDA7CisJCX07CisKKwkJcHJpbnQgIjxyZWN0IHg9XCIkc1wiIHdpZHRoPVwiJHdcIiB5PVwiJHlcIiBoZWlnaHQ9XCIxNDVcIiBzdHlsZT1cIiRzdHlsZVwiLz5cbiI7CisJCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMyLCR5Mikgcm90YXRlKDkwKVwiPiRrZXk8L3RleHQ+XG4iOworCX0KK30KKworCisjIHByaW50IHRoZSB0aW1lIGxpbmUgb24gdG9wCitteSAkdGltZSA9ICRmaXJzdHRpbWU7CitteSAkc3RlcCA9ICgkbWF4dGltZSAtICRmaXJzdHRpbWUpIC8gMTU7Cit3aGlsZSAoJHRpbWUgPCAkbWF4dGltZSkgeworCW15ICRzMiA9ICgkdGltZSAtICRmaXJzdHRpbWUpICogJG11bHQ7CisJbXkgJHRtID0gaW50KCR0aW1lICogMTAwKSAvIDEwMC4wOworCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMyLDg5KSByb3RhdGUoOTApXCI+JHRtPC90ZXh0PlxuIjsKKwkkdGltZSA9ICR0aW1lICsgJHN0ZXA7Cit9CisKK3ByaW50ICI8L3N2Zz5cbiI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggYmM2Nzc5My4uZTMwYmFjMSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtOSw3ICs5LDcgQEAKIG15ICRQID0gJDA7CiAkUCA9fiBzQC4qL0BAZzsKIAotbXkgJFYgPSAnMC4yMSc7CitteSAkViA9ICcwLjI0JzsKIAogdXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2KTsKIApAQCAtNjYsNiArNjYsNyBAQAogbXkgJGRiZ192YWx1ZXMgPSAwOwogbXkgJGRiZ19wb3NzaWJsZSA9IDA7CiBteSAkZGJnX3R5cGUgPSAwOworbXkgJGRiZ19hdHRyID0gMDsKIGZvciBteSAka2V5IChrZXlzICVkZWJ1ZykgewogCWV2YWwgIlwke2RiZ18ka2V5fSA9ICckZGVidWd7JGtleX0nOyIKIH0KQEAgLTExMiw3ICsxMTMsMTAgQEAKIAkJCWNvbnN0fAogCQkJX19yZWFkX21vc3RseXwKIAkJCV9fa3Byb2Jlc3wKLQkJCV9fKD86bWVtfGNwdXxkZXZ8KSg/OmluaXRkYXRhfGluaXQpCisJCQlfXyg/Om1lbXxjcHV8ZGV2fCkoPzppbml0ZGF0YXxpbml0KXwKKwkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZHwKKwkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXB8CisJCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wCiAJCSAgfXg7CiBvdXIgJE1vZGlmaWVyOwogb3VyICRJbmxpbmUJPSBxcntpbmxpbmV8X19hbHdheXNfaW5saW5lfG5vaW5saW5lfTsKQEAgLTE0Miw2ICsxNDYsMTEgQEAKIAl8ICBceEY0W1x4ODAtXHg4Rl1bXHg4MC1ceEJGXXsyfSAgICAgIyBwbGFuZSAxNgogfXg7CiAKK291ciAkdHlwZVR5cGVkZWZzID0gcXJ7KD94OgorCSg/Ol9fKT8oPzp1fHN8YmV8bGUpKD86XGR8XGRcZCl8CisJYXRvbWljX3QKKyl9OworCiBvdXIgQHR5cGVMaXN0ID0gKAogCXFye3ZvaWR9LAogCXFyeyg/OnVuc2lnbmVkXHMrKT9jaGFyfSwKQEAgLTE1NSw3ICsxNjQsNiBAQAogCXFye2Zsb2F0fSwKIAlxcntkb3VibGV9LAogCXFye2Jvb2x9LAotCXFyeyg/Ol9fKT8oPzp1fHN8YmV8bGUpKD86OHwxNnwzMnw2NCl9LAogCXFye3N0cnVjdFxzKyRJZGVudH0sCiAJcXJ7dW5pb25ccyskSWRlbnR9LAogCXFye2VudW1ccyskSWRlbnR9LApAQCAtMTc1LDYgKzE4Myw3IEBACiAJCQkoPzokTW9kaWZpZXJccyt8Y29uc3RccyspKgogCQkJKD86CiAJCQkJKD86dHlwZW9mfF9fdHlwZW9mX18pXHMqXChccypcKipccyokSWRlbnRccypcKXwKKwkJCQkoPzokdHlwZVR5cGVkZWZzXGIpfAogCQkJCSg/OiR7YWxsfVxiKQogCQkJKQogCQkJKD86XHMrJE1vZGlmaWVyfFxzK2NvbnN0KSoKQEAgLTMzMSw3ICszNDAsNyBAQAogCQkJJG9mZisrOwogCQkJbmV4dDsKIAkJfQotCQlpZiAoc3Vic3RyKCRsaW5lLCAkb2ZmLCAyKSBlcSAnKi8nKSB7CisJCWlmICgkc2FuaXRpc2VfcXVvdGUgZXEgJyovJyAmJiBzdWJzdHIoJGxpbmUsICRvZmYsIDIpIGVxICcqLycpIHsKIAkJCSRzYW5pdGlzZV9xdW90ZSA9ICcnOwogCQkJc3Vic3RyKCRyZXMsICRvZmYsIDIsICIkOyQ7Iik7CiAJCQkkb2ZmKys7CkBAIC00MDQsNiArNDEzLDcgQEAKIAkJIyBjb250ZXh0LgogCQlpZiAoJG9mZiA+PSAkbGVuKSB7CiAJCQlmb3IgKDsgJHJlbWFpbiA+IDA7ICRsaW5lKyspIHsKKwkJCQlsYXN0IGlmICghZGVmaW5lZCAkbGluZXNbJGxpbmVdKTsKIAkJCQluZXh0IGlmICgkbGluZXNbJGxpbmVdID1+IC9eLS8pOwogCQkJCSRyZW1haW4tLTsKIAkJCQkkbG9mZiA9ICRsZW47CkBAIC02NjksNiArNjc5LDIyIEBACiAJcmV0dXJuICgkY210IG5lICcnKTsKIH0KIAorc3ViIHJhd19saW5lIHsKKwlteSAoJGxpbmVuciwgJGNudCkgPSBAXzsKKworCW15ICRvZmZzZXQgPSAkbGluZW5yIC0gMTsKKwkkY250Kys7CisKKwlteSAkbGluZTsKKwl3aGlsZSAoJGNudCkgeworCQkkbGluZSA9ICRyYXdsaW5lc1skb2Zmc2V0KytdOworCQluZXh0IGlmIChkZWZpbmVkKCRsaW5lKSAmJiAkbGluZSA9fiAvXi0vKTsKKwkJJGNudC0tOworCX0KKworCXJldHVybiAkbGluZTsKK30KKwogc3ViIGNhdF92ZXQgewogCW15ICgkdmV0KSA9IEBfOwogCW15ICgkcmVzLCAkY29kZWQpOwpAQCAtNzgyLDkgKzgwOCw5IEBACiAJCQl9CiAJCQkkdHlwZSA9ICdOJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKGlmfHdoaWxlfHR5cGVvZnxfX3R5cGVvZl9ffGZvcilcYi9vKSB7CisJCX0gZWxzaWYgKCRjdXIgPX4gL14oaWZ8d2hpbGV8Zm9yKVxiL28pIHsKIAkJCXByaW50ICJDT05EKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKLQkJCSRhdl9wZW5kaW5nID0gJ04nOworCQkJJGF2X3BlbmRpbmcgPSAnRSc7CiAJCQkkdHlwZSA9ICdOJzsKIAogCQl9IGVsc2lmICgkY3VyID1+L14oY2FzZSkvbykgewpAQCAtNzkyLDcgKzgxOCw3IEBACiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdDJzsKIAkJCSR0eXBlID0gJ04nOwogCi0JCX0gZWxzaWYgKCRjdXIgPX4vXihyZXR1cm58ZWxzZXxnb3RvKS9vKSB7CisJCX0gZWxzaWYgKCRjdXIgPX4vXihyZXR1cm58ZWxzZXxnb3RvfHR5cGVvZnxfX3R5cGVvZl9fKVxiL28pIHsKIAkJCXByaW50ICJLRVlXT1JEKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCkBAIC04NTgsNyArODg0LDcgQEAKIAkJCXByaW50ICJDTE9TRSgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQkkdHlwZSA9ICdOJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKC0oPyFbLT5dKXxcKyg/IVwrKXxcKnxcJig/IVwmKSkvbykgeworCQl9IGVsc2lmICgkY3VyID1+IC9eKC0oPyFbLT5dKXxcKyg/IVwrKXxcKnxcJlwmfFwmKS9vKSB7CiAJCQlteSAkdmFyaWFudDsKIAogCQkJcHJpbnQgIk9QVigkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CkBAIC04OTIsMTIgKzkxOCwyMiBAQAogc3ViIHBvc3NpYmxlIHsKIAlteSAoJHBvc3NpYmxlLCAkbGluZSkgPSBAXzsKIAotCXByaW50ICJDSEVDSzwkcG9zc2libGU+ICgkbGluZSlcbiIgaWYgKCRkYmdfcG9zc2libGUgPiAxKTsKLQlpZiAoJHBvc3NpYmxlICF+IC9eKD86JE1vZGlmaWVyfCRTdG9yYWdlfCRUeXBlfERFRklORV9cUyspJC8gJiYKLQkgICAgJHBvc3NpYmxlIG5lICdnb3RvJyAmJiAkcG9zc2libGUgbmUgJ3JldHVybicgJiYKLQkgICAgJHBvc3NpYmxlIG5lICdjYXNlJyAmJiAkcG9zc2libGUgbmUgJ2Vsc2UnICYmCi0JICAgICRwb3NzaWJsZSBuZSAnYXNtJyAmJiAkcG9zc2libGUgbmUgJ19fYXNtX18nICYmCi0JICAgICRwb3NzaWJsZSAhfiAvXih0eXBlZGVmfHN0cnVjdHxlbnVtKVxiLykgeworCXByaW50ICJDSEVDSzwkcG9zc2libGU+ICgkbGluZSlcbiIgaWYgKCRkYmdfcG9zc2libGUgPiAyKTsKKwlpZiAoJHBvc3NpYmxlICF+IC8oPzoKKwkJXig/OgorCQkJJE1vZGlmaWVyfAorCQkJJFN0b3JhZ2V8CisJCQkkVHlwZXwKKwkJCURFRklORV9cUyt8CisJCQlnb3RvfAorCQkJcmV0dXJufAorCQkJY2FzZXwKKwkJCWVsc2V8CisJCQlhc218X19hc21fX3wKKwkJCWRvCisJCSkkfAorCQleKD86dHlwZWRlZnxzdHJ1Y3R8ZW51bSlcYgorCSAgICApL3gpIHsKIAkJIyBDaGVjayBmb3IgbW9kaWZpZXJzLgogCQkkcG9zc2libGUgPX4gcy9ccyokU3RvcmFnZVxzKi8vZzsKIAkJJHBvc3NpYmxlID1+IHMvXHMqJFNwYXJzZVxzKi8vZzsKQEAgLTkxNSw2ICs5NTEsOCBAQAogCQkJcHVzaChAdHlwZUxpc3QsICRwb3NzaWJsZSk7CiAJCX0KIAkJYnVpbGRfdHlwZXMoKTsKKwl9IGVsc2UgeworCQl3YXJuICJOT1RQT1NTOiAkcG9zc2libGUgKCRsaW5lKVxuIiBpZiAoJGRiZ19wb3NzaWJsZSA+IDEpOwogCX0KIH0KIApAQCAtOTU0LDYgKzk5MiwzMyBAQAogCX0KIH0KIAorc3ViIGNoZWNrX2Fic29sdXRlX2ZpbGUgeworCW15ICgkYWJzb2x1dGUsICRoZXJlY3VycikgPSBAXzsKKwlteSAkZmlsZSA9ICRhYnNvbHV0ZTsKKworCSMjcHJpbnQgImFic29sdXRlPCRhYnNvbHV0ZT5cbiI7CisKKwkjIFNlZSBpZiBhbnkgc3VmZml4IG9mIHRoaXMgcGF0aCBpcyBhIHBhdGggd2l0aGluIHRoZSB0cmVlLgorCXdoaWxlICgkZmlsZSA9fiBzQF5bXi9dKi9AQCkgeworCQlpZiAoLWYgIiRyb290LyRmaWxlIikgeworCQkJIyNwcmludCAiZmlsZTwkZmlsZT5cbiI7CisJCQlsYXN0OworCQl9CisJfQorCWlmICghIC1mIF8pICB7CisJCXJldHVybiAwOworCX0KKworCSMgSXQgaXMsIHNvIHNlZSBpZiB0aGUgcHJlZml4IGlzIGFjY2VwdGFibGUuCisJbXkgJHByZWZpeCA9ICRhYnNvbHV0ZTsKKwlzdWJzdHIoJHByZWZpeCwgLWxlbmd0aCgkZmlsZSkpID0gJyc7CisKKwkjI3ByaW50ICJwcmVmaXg8JHByZWZpeD5cbiI7CisJaWYgKCRwcmVmaXggbmUgIi4uLi8iKSB7CisJCVdBUk4oInVzZSByZWxhdGl2ZSBwYXRobmFtZSBpbnN0ZWFkIG9mIGFic29sdXRlIGluIGNoYW5nZWxvZyB0ZXh0XG4iIC4gJGhlcmVjdXJyKTsKKwl9Cit9CisKIHN1YiBwcm9jZXNzIHsKIAlteSAkZmlsZW5hbWUgPSBzaGlmdDsKIApAQCAtOTkxLDYgKzEwNTYsNyBAQAogCiAJIyBzdXBwcmVzc2lvbiBmbGFncwogCW15ICVzdXBwcmVzc19pZmJyYWNlczsKKwlteSAlc3VwcHJlc3Nfd2hpbGV0cmFpbGVyczsKIAogCSMgUHJlLXNjYW4gdGhlIHBhdGNoIHNhbml0aXppbmcgdGhlIGxpbmVzLgogCSMgUHJlLXNjYW4gdGhlIHBhdGNoIGxvb2tpbmcgZm9yIGFueSBfX3NldHVwIGRvY3VtZW50YXRpb24uCkBAIC0xMDI1LDkgKzEwOTEsMTQgQEAKIAkJCSMgZWRnZSBpcyBhIGNsb3NlIGNvbW1lbnQgdGhlbiB3ZSBtdXN0IGJlIGluIGEgY29tbWVudAogCQkJIyBhdCBjb250ZXh0IHN0YXJ0LgogCQkJbXkgJGVkZ2U7Ci0JCQlmb3IgKG15ICRsbiA9ICRsaW5lbnIgKyAxOyAkbG4gPCAoJGxpbmVuciArICRyZWFsY250KTsgJGxuKyspIHsKLQkJCQluZXh0IGlmICgkbGluZSA9fiAvXi0vKTsKLQkJCQkoJGVkZ2UpID0gKCRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUApOworCQkJbXkgJGNudCA9ICRyZWFsY250OworCQkJZm9yIChteSAkbG4gPSAkbGluZW5yICsgMTsgJGNudCA+IDA7ICRsbisrKSB7CisJCQkJbmV4dCBpZiAoZGVmaW5lZCAkcmF3bGluZXNbJGxuIC0gMV0gJiYKKwkJCQkJICRyYXdsaW5lc1skbG4gLSAxXSA9fiAvXi0vKTsKKwkJCQkkY250LS07CisJCQkJI3ByaW50ICJSQVc8JHJhd2xpbmVzWyRsbiAtIDFdPlxuIjsKKwkJCQkoJGVkZ2UpID0gKGRlZmluZWQgJHJhd2xpbmVzWyRsbiAtIDFdICYmCisJCQkJCSRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUApOwogCQkJCWxhc3QgaWYgKGRlZmluZWQgJGVkZ2UpOwogCQkJfQogCQkJaWYgKGRlZmluZWQgJGVkZ2UgJiYgJGVkZ2UgZXEgJyovJykgewpAQCAtMTA3NSw2ICsxMTQ2LDcgQEAKIAkJJGxpbmVucisrOwogCiAJCW15ICRyYXdsaW5lID0gJHJhd2xpbmVzWyRsaW5lbnIgLSAxXTsKKwkJbXkgJGh1bmtfbGluZSA9ICgkcmVhbGNudCAhPSAwKTsKIAogI2V4dHJhY3QgdGhlIGxpbmUgcmFuZ2UgaW4gdGhlIGZpbGUgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQKIAkJaWYgKCRsaW5lPX4vXlxAXEAgLVxkKyg/OixcZCspPyBcKyhcZCspKCwoXGQrKSk/IFxAXEAvKSB7CkBAIC0xMDkwLDYgKzExNjIsNyBAQAogCQkJJHByZXZfdmFsdWVzID0gJ0UnOwogCiAJCQklc3VwcHJlc3NfaWZicmFjZXMgPSAoKTsKKwkJCSVzdXBwcmVzc193aGlsZXRyYWlsZXJzID0gKCk7CiAJCQluZXh0OwogCiAjIHRyYWNrIHRoZSBsaW5lIG51bWJlciBhcyB3ZSBtb3ZlIHRocm91Z2ggdGhlIGh1bmssIG5vdGUgdGhhdApAQCAtMTEyNSw3ICsxMTk4LDcgQEAKIAkJCSRyZWFsZmlsZSA9ICQxOwogCQkJJHJlYWxmaWxlID1+IHNAXlteL10qL0BAOwogCi0JCQlpZiAoJHJlYWxmaWxlID1+IG1AaW5jbHVkZS9hc20vQCkgeworCQkJaWYgKCRyZWFsZmlsZSA9fiBtQF5pbmNsdWRlL2FzbS9AKSB7CiAJCQkJRVJST1IoImRvIG5vdCBtb2RpZnkgZmlsZXMgaW4gaW5jbHVkZS9hc20sIGNoYW5nZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZmlsZXMgaW4gaW5jbHVkZS9hc20tPGFyY2hpdGVjdHVyZT5cbiIgLiAiJGhlcmUkcmF3bGluZVxuIik7CiAJCQl9CiAJCQluZXh0OwpAQCAtMTE1OSw2ICsxMjMyLDIwIEBACiAJCQkJJGhlcmVjdXJyKSBpZiAoISRlbWl0dGVkX2NvcnJ1cHQrKyk7CiAJCX0KIAorIyBDaGVjayBmb3IgYWJzb2x1dGUga2VybmVsIHBhdGhzLgorCQlpZiAoJHRyZWUpIHsKKwkJCXdoaWxlICgkbGluZSA9fiBteyg/Ol58XHMpKC9cUyopfWcpIHsKKwkJCQlteSAkZmlsZSA9ICQxOworCisJCQkJaWYgKCRmaWxlID1+IG17XiguKj8pKD86OlxkKykrOj8kfSAmJgorCQkJCSAgICBjaGVja19hYnNvbHV0ZV9maWxlKCQxLCAkaGVyZWN1cnIpKSB7CisJCQkJCSMKKwkJCQl9IGVsc2UgeworCQkJCQljaGVja19hYnNvbHV0ZV9maWxlKCRmaWxlLCAkaGVyZWN1cnIpOworCQkJCX0KKwkJCX0KKwkJfQorCiAjIFVURi04IHJlZ2V4IGZvdW5kIGF0IGh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvcXVlc3Rpb25zL3FhLWZvcm1zLXV0Zi04LmVuLnBocAogCQlpZiAoKCRyZWFsZmlsZSA9fiAvXiQvIHx8ICRsaW5lID1+IC9eXCsvKSAmJgogCQkgICAgJHJhd2xpbmUgIX4gbS9eJFVURjgqJC8pIHsKQEAgLTExNzEsMTEgKzEyNTgsOCBAQAogCQkJRVJST1IoIkludmFsaWQgVVRGLTgsIHBhdGNoIGFuZCBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgZW5jb2RlZCBpbiBVVEYtOFxuIiAuICRoZXJlcHRyKTsKIAkJfQogCi0jaWdub3JlIGxpbmVzIGJlaW5nIHJlbW92ZWQKLQkJaWYgKCRsaW5lPX4vXi0vKSB7bmV4dDt9Ci0KLSMgY2hlY2sgd2UgYXJlIGluIGEgdmFsaWQgc291cmNlIGZpbGUgaWYgbm90IHRoZW4gaWdub3JlIHRoaXMgaHVuawotCQluZXh0IGlmICgkcmVhbGZpbGUgIX4gL1wuKGh8Y3xzfFN8cGx8c2gpJC8pOworIyBpZ25vcmUgbm9uLWh1bmsgbGluZXMgYW5kIGxpbmVzIGJlaW5nIHJlbW92ZWQKKwkJbmV4dCBpZiAoISRodW5rX2xpbmUgfHwgJGxpbmUgPX4gL14tLyk7CiAKICN0cmFpbGluZyB3aGl0ZXNwYWNlCiAJCWlmICgkbGluZSA9fiAvXlwrLipcMDE1LykgewpAQCAtMTE4Niw2ICsxMjcwLDEwIEBACiAJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJHJhd2xpbmUpIC4gIlxuIjsKIAkJCUVSUk9SKCJ0cmFpbGluZyB3aGl0ZXNwYWNlXG4iIC4gJGhlcmV2ZXQpOwogCQl9CisKKyMgY2hlY2sgd2UgYXJlIGluIGEgdmFsaWQgc291cmNlIGZpbGUgaWYgbm90IHRoZW4gaWdub3JlIHRoaXMgaHVuaworCQluZXh0IGlmICgkcmVhbGZpbGUgIX4gL1wuKGh8Y3xzfFN8cGx8c2gpJC8pOworCiAjODAgY29sdW1uIGxpbWl0CiAJCWlmICgkbGluZSA9fiAvXlwrLyAmJiAkcHJldnJhd2xpbmUgIX4gL1wvXCpcKi8gJiYKIAkJICAgICRyYXdsaW5lICF+IC9eLlxzKlwqXHMqXEAkSWRlbnRccy8gJiYKQEAgLTEyMDAsOCArMTI4OCw4IEBACiAJCQlXQVJOKCJhZGRpbmcgYSBsaW5lIHdpdGhvdXQgbmV3bGluZSBhdCBlbmQgb2YgZmlsZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAotIyBjaGVjayB3ZSBhcmUgaW4gYSB2YWxpZCBzb3VyY2UgZmlsZSAqLltoY10gaWYgbm90IHRoZW4gaWdub3JlIHRoaXMgaHVuawotCQluZXh0IGlmICgkcmVhbGZpbGUgIX4gL1wuW2hjXSQvKTsKKyMgY2hlY2sgd2UgYXJlIGluIGEgdmFsaWQgc291cmNlIGZpbGUgQyBvciBwZXJsIGlmIG5vdCB0aGVuIGlnbm9yZSB0aGlzIGh1bmsKKwkJbmV4dCBpZiAoJHJlYWxmaWxlICF+IC9cLihofGN8cGwpJC8pOwogCiAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFueSB0YWJzIG11c3QgY29tZSBmaXJzdCBhbmQgYW55dGhpbmcKICMgbW9yZSB0aGFuIDggbXVzdCB1c2UgdGFicy4KQEAgLTEyMTEsMTUgKzEyOTksMTggQEAKIAkJCUVSUk9SKCJjb2RlIGluZGVudCBzaG91bGQgdXNlIHRhYnMgd2hlcmUgcG9zc2libGVcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAorIyBjaGVjayB3ZSBhcmUgaW4gYSB2YWxpZCBDIHNvdXJjZSBmaWxlIGlmIG5vdCB0aGVuIGlnbm9yZSB0aGlzIGh1bmsKKwkJbmV4dCBpZiAoJHJlYWxmaWxlICF+IC9cLihofGMpJC8pOworCiAjIGNoZWNrIGZvciBSQ1MvQ1ZTIHJldmlzaW9uIG1hcmtlcnMKIAkJaWYgKCRyYXdsaW5lID1+IC9eXCsuKlwkKFJldmlzaW9ufExvZ3xJZCkoPzpcJHwpLykgewogCQkJV0FSTigiQ1ZTIHN0eWxlIGtleXdvcmQgbWFya2VycywgdGhlc2Ugd2lsbCBfbm90XyBiZSB1cGRhdGVkXG4iLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQ2hlY2sgZm9yIHBvdGVudGlhbCAnYmFyZScgdHlwZXMKLQkJbXkgKCRzdGF0LCAkY29uZCwgJGxpbmVfbnJfbmV4dCwgJHJlbWFpbl9uZXh0KTsKKwkJbXkgKCRzdGF0LCAkY29uZCwgJGxpbmVfbnJfbmV4dCwgJHJlbWFpbl9uZXh0LCAkb2ZmX25leHQpOwogCQlpZiAoJHJlYWxjbnQgJiYgJGxpbmUgPX4gLy5ccypcUy8pIHsKLQkJCSgkc3RhdCwgJGNvbmQsICRsaW5lX25yX25leHQsICRyZW1haW5fbmV4dCkgPQorCQkJKCRzdGF0LCAkY29uZCwgJGxpbmVfbnJfbmV4dCwgJHJlbWFpbl9uZXh0LCAkb2ZmX25leHQpID0KIAkJCQljdHhfc3RhdGVtZW50X2Jsb2NrKCRsaW5lbnIsICRyZWFsY250LCAwKTsKIAkJCSRzdGF0ID1+IHMvXG4uL1xuIC9nOwogCQkJJGNvbmQgPX4gcy9cbi4vXG4gL2c7CkBAIC0xMjQwLDcgKzEzMzEsNyBAQAogCQkJCXBvc3NpYmxlKCR0eXBlLCAiQToiIC4gJHMpOwogCiAJCQkjIGRlZmluaXRpb25zIGluIGdsb2JhbCBzY29wZSBjYW4gb25seSBzdGFydCB3aXRoIHR5cGVzCi0JCQl9IGVsc2lmICgkcyA9fiAvXi4oPzokU3RvcmFnZVxzKyk/KD86JElubGluZVxzKyk/KD86Y29uc3RccyspPygkSWRlbnQpXGIvcykgeworCQkJfSBlbHNpZiAoJHMgPX4gL14uKD86JFN0b3JhZ2VccyspPyg/OiRJbmxpbmVccyspPyg/OmNvbnN0XHMrKT8oJElkZW50KVxiXHMqKD8hOikvcykgewogCQkJCXBvc3NpYmxlKCQxLCAiQjoiIC4gJHMpOwogCQkJfQogCkBAIC0xMjk0LDEwICsxMzg1LDYgQEAKIAkJCQlFUlJPUigic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiRoZXJlbGluZSRlcnIiKTsKIAkJCX0KIAkJfQotCQlpZiAoJGxpbmUgPX4gL14uXHMqKD86Y2FzZVxzKi4qfGRlZmF1bHRccyopOi9nICYmCi0JCSAgICAkbGluZSAhfiAvXEcoPzpccyp7KT8oPzpccyokOyopKD86XHMqXFwpP1xzKiQvZykgewotCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7Ci0JCX0KIAogIyBpZi93aGlsZS9ldGMgYnJhY2UgZG8gbm90IGdvIG9uIG5leHQgbGluZSwgdW5sZXNzIGRlZmluaW5nIGEgZG8gd2hpbGUgbG9vcCwKICMgb3IgaWYgdGhhdCBicmFjZSBvbiB0aGUgbmV4dCBsaW5lIGlzIGZvciBzb21ldGhpbmcgZWxzZQpAQCAtMTMzOCw2ICsxNDI1LDkxIEBACiAJCQl9CiAJCX0KIAorIyBDaGVjayByZWxhdGl2ZSBpbmRlbnQgZm9yIGNvbmRpdGlvbmFscyBhbmQgYmxvY2tzLgorCQlpZiAoJGxpbmUgPX4gL1xiKD86KD86aWZ8d2hpbGV8Zm9yKVxzKlwofGRvXGIpLyAmJiAkbGluZSAhfiAvXi5ccyojLyAmJiAkbGluZSAhfiAvXH1ccyp3aGlsZVxzKi8pIHsKKwkJCW15ICgkcywgJGMpID0gKCRzdGF0LCAkY29uZCk7CisKKwkJCXN1YnN0cigkcywgMCwgbGVuZ3RoKCRjKSwgJycpOworCisJCQkjIE1ha2Ugc3VyZSB3ZSByZW1vdmUgdGhlIGxpbmUgcHJlZml4ZXMgYXMgd2UgaGF2ZQorCQkJIyBub25lIG9uIHRoZSBmaXJzdCBsaW5lLCBhbmQgYXJlIGdvaW5nIHRvIHJlYWRkIHRoZW0KKwkJCSMgd2hlcmUgbmVjZXNzYXJ5LgorCQkJJHMgPX4gcy9cbi4vXG4vZ3M7CisKKwkJCSMgRmluZCBvdXQgaG93IGxvbmcgdGhlIGNvbmRpdGlvbmFsIGFjdHVhbGx5IGlzLgorCQkJbXkgQG5ld2xpbmVzID0gKCRjID1+IC9cbi9ncyk7CisJCQlteSAkY29uZF9saW5lcyA9IDEgKyAkI25ld2xpbmVzOworCisJCQkjIFdlIHdhbnQgdG8gY2hlY2sgdGhlIGZpcnN0IGxpbmUgaW5zaWRlIHRoZSBibG9jaworCQkJIyBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBjb25kaXRpb25hbCwgc28gcmVtb3ZlOgorCQkJIyAgMSkgYW55IGJsYW5rIGxpbmUgdGVybWluYXRpb24KKwkJCSMgIDIpIGFueSBvcGVuaW5nIGJyYWNlIHsgb24gZW5kIG9mIHRoZSBsaW5lCisJCQkjICAzKSBhbnkgZG8gKC4uLikgeworCQkJbXkgJGNvbnRpbnVhdGlvbiA9IDA7CisJCQlteSAkY2hlY2sgPSAwOworCQkJJHMgPX4gcy9eLipcYmRvXGIvLzsKKwkJCSRzID1+IHMvXlxzKnsvLzsKKwkJCWlmICgkcyA9fiBzL15ccypcXC8vKSB7CisJCQkJJGNvbnRpbnVhdGlvbiA9IDE7CisJCQl9CisJCQlpZiAoJHMgPX4gcy9eXHMqP1xuLy8pIHsKKwkJCQkkY2hlY2sgPSAxOworCQkJCSRjb25kX2xpbmVzKys7CisJCQl9CisKKwkJCSMgQWxzbyBpZ25vcmUgYSBsb29wIGNvbnN0cnVjdCBhdCB0aGUgZW5kIG9mIGEKKwkJCSMgcHJlcHJvY2Vzc29yIHN0YXRlbWVudC4KKwkJCWlmICgoJHByZXZsaW5lID1+IC9eLlxzKiNccypkZWZpbmVccy8gfHwKKwkJCSAgICAkcHJldmxpbmUgPX4gL1xcXHMqJC8pICYmICRjb250aW51YXRpb24gPT0gMCkgeworCQkJCSRjaGVjayA9IDA7CisJCQl9CisKKwkJCW15ICRjb25kX3B0ciA9IC0xOworCQkJJGNvbnRpbnVhdGlvbiA9IDA7CisJCQl3aGlsZSAoJGNvbmRfcHRyICE9ICRjb25kX2xpbmVzKSB7CisJCQkJJGNvbmRfcHRyID0gJGNvbmRfbGluZXM7CisKKwkJCQkjIElmIHdlIHNlZSBhbiAjZWxzZS8jZWxpZiB0aGVuIHRoZSBjb2RlCisJCQkJIyBpcyBub3QgbGluZWFyLgorCQkJCWlmICgkcyA9fiAvXlxzKlwjXHMqKD86ZWxzZXxlbGlmKS8pIHsKKwkJCQkJJGNoZWNrID0gMDsKKwkJCQl9CisKKwkJCQkjIElnbm9yZToKKwkJCQkjICAxKSBibGFuayBsaW5lcywgdGhleSBzaG91bGQgYmUgYXQgMCwKKwkJCQkjICAyKSBwcmVwcm9jZXNzb3IgbGluZXMsIGFuZAorCQkJCSMgIDMpIGxhYmVscy4KKwkJCQlpZiAoJGNvbnRpbnVhdGlvbiB8fAorCQkJCSAgICAkcyA9fiAvXlxzKj9cbi8gfHwKKwkJCQkgICAgJHMgPX4gL15ccyojXHMqPy8gfHwKKwkJCQkgICAgJHMgPX4gL15ccyokSWRlbnRccyo6LykgeworCQkJCQkkY29udGludWF0aW9uID0gKCRzID1+IC9eLio/XFxcbi8pID8gMSA6IDA7CisJCQkJCSRzID1+IHMvXi4qP1xuLy87CisJCQkJCSRjb25kX2xpbmVzKys7CisJCQkJfQorCQkJfQorCisJCQlteSAodW5kZWYsICRzaW5kZW50KSA9IGxpbmVfc3RhdHMoIisiIC4gJHMpOworCQkJbXkgJHN0YXRfcmVhbCA9IHJhd19saW5lKCRsaW5lbnIsICRjb25kX2xpbmVzKTsKKworCQkJIyBDaGVjayBpZiBlaXRoZXIgb2YgdGhlc2UgbGluZXMgYXJlIG1vZGlmaWVkLCBlbHNlCisJCQkjIHRoaXMgaXMgbm90IHRoaXMgcGF0Y2gncyBmYXVsdC4KKwkJCWlmICghZGVmaW5lZCgkc3RhdF9yZWFsKSB8fAorCQkJICAgICRzdGF0ICF+IC9eXCsvICYmICRzdGF0X3JlYWwgIX4gL15cKy8pIHsKKwkJCQkkY2hlY2sgPSAwOworCQkJfQorCQkJaWYgKGRlZmluZWQoJHN0YXRfcmVhbCkgJiYgJGNvbmRfbGluZXMgPiAxKSB7CisJCQkJJHN0YXRfcmVhbCA9ICJbLi4uXVxuJHN0YXRfcmVhbCI7CisJCQl9CisKKwkJCSNwcmludCAibGluZTwkbGluZT4gcHJldmxpbmU8JHByZXZsaW5lPiBpbmRlbnQ8JGluZGVudD4gc2luZGVudDwkc2luZGVudD4gY2hlY2s8JGNoZWNrPiBjb250aW51YXRpb248JGNvbnRpbnVhdGlvbj4gczwkcz4gY29uZF9saW5lczwkY29uZF9saW5lcz4gc3RhdF9yZWFsPCRzdGF0X3JlYWw+IHN0YXQ8JHN0YXQ+XG4iOworCisJCQlpZiAoJGNoZWNrICYmICgoJHNpbmRlbnQgJSA4KSAhPSAwIHx8CisJCQkgICAgKCRzaW5kZW50IDw9ICRpbmRlbnQgJiYgJHMgbmUgJycpKSkgeworCQkJCVdBUk4oInN1c3BlY3QgY29kZSBpbmRlbnQgZm9yIGNvbmRpdGlvbmFsIHN0YXRlbWVudHMgKCRpbmRlbnQsICRzaW5kZW50KVxuIiAuICRoZXJlY3VyciAuICIkc3RhdF9yZWFsXG4iKTsKKwkJCX0KKwkJfQorCiAJCSMgVHJhY2sgdGhlICd2YWx1ZXMnIGFjcm9zcyBjb250ZXh0IGFuZCBhZGRlZCBsaW5lcy4KIAkJbXkgJG9wbGluZSA9ICRsaW5lOyAkb3BsaW5lID1+IHMvXi4vIC87CiAJCW15ICgkY3Vycl92YWx1ZXMsICRjdXJyX3ZhcnMpID0KQEAgLTEzNjMsNiArMTUzNSwxNSBAQAogCQkJfQogCQkJbmV4dDsKIAkJfQorIyBURVNUOiBhbGxvdyBkaXJlY3QgdGVzdGluZyBvZiB0aGUgYXR0cmlidXRlIG1hdGNoZXIuCisJCWlmICgkZGJnX2F0dHIpIHsKKwkJCWlmICgkbGluZSA9fiAvXi5ccyokQXR0cmlidXRlXHMqJC8pIHsKKwkJCQlFUlJPUigiVEVTVDogaXMgYXR0clxuIiAuICRoZXJlY3Vycik7CisJCQl9IGVsc2lmICgkZGJnX2F0dHIgPiAxICYmICRsaW5lID1+IC9eLisoJEF0dHJpYnV0ZSkvKSB7CisJCQkJRVJST1IoIlRFU1Q6IGlzIG5vdCBhdHRyICgkMSBpcylcbiIuICRoZXJlY3Vycik7CisJCQl9CisJCQluZXh0OworCQl9CiAKICMgY2hlY2sgZm9yIGluaXRpYWxpc2F0aW9uIHRvIGFnZ3JlZ2F0ZXMgb3BlbiBicmFjZSBvbiB0aGUgbmV4dCBsaW5lCiAJCWlmICgkcHJldmxpbmUgPX4gLyREZWNsYXJlXHMqJElkZW50XHMqPVxzKiQvICYmCkBAIC0xMzk1LDEzICsxNTc2LDE0IEBACiAJCWlmICgoJGxpbmUgPX4gL0VYUE9SVF9TWU1CT0wuKlwoKC4qKVwpLykgfHwKIAkJICAgICgkbGluZSA9fiAvRVhQT1JUX1VOVVNFRF9TWU1CT0wuKlwoKC4qKVwpLykpIHsKIAkJCW15ICRuYW1lID0gJDE7Ci0JCQlpZiAoKCRwcmV2bGluZSAhfiAvXn0vKSAmJgotCQkJICAgKCRwcmV2bGluZSAhfiAvXlwrfS8pICYmCi0JCQkgICAoJHByZXZsaW5lICF+IC9eIH0vKSAmJgotCQkJICAgKCRwcmV2bGluZSAhfiAvXi5ERUNMQVJFXyRJZGVudFwoXFEkbmFtZVxFXCkvKSAmJgotCQkJICAgKCRwcmV2bGluZSAhfiAvXi5MSVNUX0hFQURcKFxRJG5hbWVcRVwpLykgJiYKLQkJCSAgICgkcHJldmxpbmUgIX4gL14uJFR5cGVccypcKFxzKlwqXHMqXFEkbmFtZVxFXHMqXClccypcKC8pICYmCi0JCQkgICAoJHByZXZsaW5lICF+IC9cYlxRJG5hbWVcRSg/OlxzKyRBdHRyaWJ1dGUpP1xzKig/Ojt8PXxcWykvKSkgeworCQkJaWYgKCRwcmV2bGluZSAhfiAvKD86CisJCQkJXi59fAorCQkJCV4uREVGSU5FXyRJZGVudFwoXFEkbmFtZVxFXCl8CisJCQkJXi5ERUNMQVJFXyRJZGVudFwoXFEkbmFtZVxFXCl8CisJCQkJXi5MSVNUX0hFQURcKFxRJG5hbWVcRVwpfAorCQkJCV4uJFR5cGVccypcKFxzKlwqXHMqXFEkbmFtZVxFXHMqXClccypcKHwKKwkJCQlcYlxRJG5hbWVcRSg/OlxzKyRBdHRyaWJ1dGUpP1xzKig/Ojt8PXxcWykKKwkJCSAgICApL3gpIHsKIAkJCQlXQVJOKCJFWFBPUlRfU1lNQk9MKGZvbyk7IHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGZ1bmN0aW9uL3ZhcmlhYmxlXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQpAQCAtMTQyMiw2ICsxNjA0LDcgQEAKIAkJaWYgKCRsaW5lID1+IC9cYnR5cGVkZWZccy8gJiYKIAkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqXCo/JElkZW50XHMqXClccypcKC8gJiYKIAkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzKyRJZGVudFxzKlwoLyAmJgorCQkgICAgJGxpbmUgIX4gL1xiJHR5cGVUeXBlZGVmc1xiLyAmJgogCQkgICAgJGxpbmUgIX4gL1xiX19iaXR3aXNlKD86X198KVxiLykgewogCQkJV0FSTigiZG8gbm90IGFkZCBuZXcgdHlwZWRlZnNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CkBAIC0xNDkzLDExICsxNjc2LDEzIEBACiAKICMgY2hlY2sgZm9yIHNwYWNpbmcgcm91bmQgc3F1YXJlIGJyYWNrZXRzOyBhbGxvd2VkOgogIyAgMS4gd2l0aCBhIHR5cGUgb24gdGhlIGxlZnQgLS0gaW50IFtdIGE7Ci0jICAyLiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBmb3Igc2xpY2UgaW5pdGlhbGlzZXJzIC0tIFswLi4xMF0gPSA1LAorIyAgMi4gYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgZm9yIHNsaWNlIGluaXRpYWxpc2VycyAtLSBbMC4uLjEwXSA9IDUsCisjICAzLiBpbnNpZGUgYSBjdXJseSBicmFjZSAtLSA9IHsgWzAuLi4xMF0gPSA1IH0KIAkJd2hpbGUgKCRsaW5lID1+IC8oLio/XHMpXFsvZykgewogCQkJbXkgKCR3aGVyZSwgJHByZWZpeCkgPSAoJC1bMV0sICQxKTsKIAkJCWlmICgkcHJlZml4ICF+IC8kVHlwZVxzKyQvICYmCi0JCQkgICAgKCR3aGVyZSAhPSAwIHx8ICRwcmVmaXggIX4gL14uXHMrJC8pKSB7CisJCQkgICAgKCR3aGVyZSAhPSAwIHx8ICRwcmVmaXggIX4gL14uXHMrJC8pICYmCisJCQkgICAgJHByZWZpeCAhfiAve1xzKyQvKSB7CiAJCQkJRVJST1IoInNwYWNlIHByb2hpYml0ZWQgYmVmb3JlIG9wZW4gc3F1YXJlIGJyYWNrZXQgJ1snXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQpAQCAtMTYzMiw3ICsxODE3LDcgQEAKIAkJCQkjIHVuYXJ5IG9wZXJhdG9yLCBvciBhIGNhc3QKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyEnIHx8ICRvcCBlcSAnficgfHwKIAkJCQkJICRvcHYgZXEgJypVJyB8fCAkb3B2IGVxICctVScgfHwKLQkJCQkJICRvcHYgZXEgJyZVJykgeworCQkJCQkgJG9wdiBlcSAnJlUnIHx8ICRvcHYgZXEgJyYmVScpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1tXRUJDXXguLyAmJiAkY2EgIX4gLyg/OlwpfCF8fnxcKnwtfFwmfFx8fFwrXCt8XC1cLXxceykkLykgewogCQkJCQkJRVJST1IoInNwYWNlIHJlcXVpcmVkIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQpAQCAtMTc4NSw3ICsxOTcwLDI2IEBACiAKICMgQ2hlY2sgZm9yIGlsbGVnYWwgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25hbCAtLSBhbmQgY2hlY2sgZm9yIHRyYWlsaW5nCiAjIHN0YXRlbWVudHMgYWZ0ZXIgdGhlIGNvbmRpdGlvbmFsLgotCQlpZiAoJGxpbmUgPX4gL1xiKD86aWZ8d2hpbGV8Zm9yKVxzKlwoLyAmJiAkbGluZSAhfiAvXi5ccyojLykgeworCQlpZiAoJGxpbmUgPX4gL2RvXHMqKD8heykvKSB7CisJCQlteSAoJHN0YXRfbmV4dCkgPSBjdHhfc3RhdGVtZW50X2Jsb2NrKCRsaW5lX25yX25leHQsCisJCQkJCQkkcmVtYWluX25leHQsICRvZmZfbmV4dCk7CisJCQkkc3RhdF9uZXh0ID1+IHMvXG4uL1xuIC9nOworCQkJIyNwcmludCAic3RhdDwkc3RhdD4gc3RhdF9uZXh0PCRzdGF0X25leHQ+XG4iOworCisJCQlpZiAoJHN0YXRfbmV4dCA9fiAvXlxzKndoaWxlXGIvKSB7CisJCQkJIyBJZiB0aGUgc3RhdGVtZW50IGNhcnJpZXMgbGVhZGluZyBuZXdsaW5lcywKKwkJCQkjIHRoZW4gY291bnQgdGhvc2UgYXMgb2Zmc2V0cy4KKwkJCQlteSAoJHdoaXRlc3BhY2UpID0KKwkJCQkJKCRzdGF0X25leHQgPX4gL14oKD86XHMqXG5bKy1dKSpccyopL3MpOworCQkJCW15ICRvZmZzZXQgPQorCQkJCQlzdGF0ZW1lbnRfcmF3bGluZXMoJHdoaXRlc3BhY2UpIC0gMTsKKworCQkJCSRzdXBwcmVzc193aGlsZXRyYWlsZXJzeyRsaW5lX25yX25leHQgKworCQkJCQkJCQkkb2Zmc2V0fSA9IDE7CisJCQl9CisJCX0KKwkJaWYgKCFkZWZpbmVkICRzdXBwcmVzc193aGlsZXRyYWlsZXJzeyRsaW5lbnJ9ICYmCisJCSAgICAkbGluZSA9fiAvXGIoPzppZnx3aGlsZXxmb3IpXHMqXCgvICYmICRsaW5lICF+IC9eLlxzKiMvKSB7CiAJCQlteSAoJHMsICRjKSA9ICgkc3RhdCwgJGNvbmQpOwogCiAJCQlpZiAoJGMgPX4gL1xiaWZccypcKC4qW148PiE9XT1bXj1dLiovKSB7CkBAIC0xODAwLDU3ICsyMDA0LDE2IEBACiAJCQlpZiAobGVuZ3RoKCRjKSAmJiAkcyAhfiAvXlxzKns/XHMqXFwqXHMqJC8gJiYKIAkJCSAgICAkYyAhfiAvfVxzKndoaWxlXHMqLykKIAkJCXsKLQkJCQlFUlJPUigidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyKTsKLQkJCX0KLQkJfQorCQkJCSMgRmluZCBvdXQgaG93IGxvbmcgdGhlIGNvbmRpdGlvbmFsIGFjdHVhbGx5IGlzLgorCQkJCW15IEBuZXdsaW5lcyA9ICgkYyA9fiAvXG4vZ3MpOworCQkJCW15ICRjb25kX2xpbmVzID0gMSArICQjbmV3bGluZXM7CiAKLSMgQ2hlY2sgcmVsYXRpdmUgaW5kZW50IGZvciBjb25kaXRpb25hbHMgYW5kIGJsb2Nrcy4KLQkJaWYgKCRsaW5lID1+IC9cYig/Oig/OmlmfHdoaWxlfGZvcilccypcKHxkb1xiKS8gJiYgJGxpbmUgIX4gL14uXHMqIy8gJiYgJGxpbmUgIX4gL1x9XHMqd2hpbGVccyovKSB7Ci0JCQlteSAoJHMsICRjKSA9ICgkc3RhdCwgJGNvbmQpOworCQkJCW15ICRzdGF0X3JlYWwgPSByYXdfbGluZSgkbGluZW5yLCAkY29uZF9saW5lcyk7CisJCQkJaWYgKGRlZmluZWQoJHN0YXRfcmVhbCkgJiYgJGNvbmRfbGluZXMgPiAxKSB7CisJCQkJCSRzdGF0X3JlYWwgPSAiWy4uLl1cbiRzdGF0X3JlYWwiOworCQkJCX0KIAotCQkJc3Vic3RyKCRzLCAwLCBsZW5ndGgoJGMpLCAnJyk7Ci0KLQkJCSMgTWFrZSBzdXJlIHdlIHJlbW92ZSB0aGUgbGluZSBwcmVmaXhlcyBhcyB3ZSBoYXZlCi0JCQkjIG5vbmUgb24gdGhlIGZpcnN0IGxpbmUsIGFuZCBhcmUgZ29pbmcgdG8gcmVhZGQgdGhlbQotCQkJIyB3aGVyZSBuZWNlc3NhcnkuCi0JCQkkcyA9fiBzL1xuLi9cbi9nczsKLQotCQkJIyBXZSB3YW50IHRvIGNoZWNrIHRoZSBmaXJzdCBsaW5lIGluc2lkZSB0aGUgYmxvY2sKLQkJCSMgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY29uZGl0aW9uYWwsIHNvIHJlbW92ZToKLQkJCSMgIDEpIGFueSBibGFuayBsaW5lIHRlcm1pbmF0aW9uCi0JCQkjICAyKSBhbnkgb3BlbmluZyBicmFjZSB7IG9uIGVuZCBvZiB0aGUgbGluZQotCQkJIyAgMykgYW55IGRvICguLi4pIHsKLQkJCW15ICRjb250aW51YXRpb24gPSAwOwotCQkJbXkgJGNoZWNrID0gMDsKLQkJCSRzID1+IHMvXi4qXGJkb1xiLy87Ci0JCQkkcyA9fiBzL15ccyp7Ly87Ci0JCQlpZiAoJHMgPX4gcy9eXHMqXFwvLykgewotCQkJCSRjb250aW51YXRpb24gPSAxOwotCQkJfQotCQkJaWYgKCRzID1+IHMvXlxzKlxuLy8pIHsKLQkJCQkkY2hlY2sgPSAxOwotCQkJfQotCi0JCQkjIEFsc28gaWdub3JlIGEgbG9vcCBjb25zdHJ1Y3QgYXQgdGhlIGVuZCBvZiBhCi0JCQkjIHByZXByb2Nlc3NvciBzdGF0ZW1lbnQuCi0JCQlpZiAoKCRwcmV2bGluZSA9fiAvXi5ccyojXHMqZGVmaW5lXHMvIHx8Ci0JCQkgICAgJHByZXZsaW5lID1+IC9cXFxzKiQvKSAmJiAkY29udGludWF0aW9uID09IDApIHsKLQkJCQkkY2hlY2sgPSAwOwotCQkJfQotCi0JCQkjIElnbm9yZSB0aGUgY3VycmVudCBsaW5lIGlmIGl0cyBpcyBhIHByZXByb2Nlc3NvcgotCQkJIyBsaW5lLgotCQkJaWYgKCRzID1+IC9eXHMqI1xzKi8pIHsKLQkJCQkkY2hlY2sgPSAwOwotCQkJfQotCi0JCQlteSAodW5kZWYsICRzaW5kZW50KSA9IGxpbmVfc3RhdHMoIisiIC4gJHMpOwotCi0JCQkjI3ByaW50ICJsaW5lPCRsaW5lPiBwcmV2bGluZTwkcHJldmxpbmU+IGluZGVudDwkaW5kZW50PiBzaW5kZW50PCRzaW5kZW50PiBjaGVjazwkY2hlY2s+IGNvbnRpbnVhdGlvbjwkY29udGludWF0aW9uPiBzPCRzPlxuIjsKLQotCQkJaWYgKCRjaGVjayAmJiAoKCRzaW5kZW50ICUgOCkgIT0gMCB8fAotCQkJICAgICgkc2luZGVudCA8PSAkaW5kZW50ICYmICRzIG5lICcnKSkpIHsKLQkJCQlXQVJOKCJzdXNwZWN0IGNvZGUgaW5kZW50IGZvciBjb25kaXRpb25hbCBzdGF0ZW1lbnRzXG4iIC4gJGhlcmVjdXJyKTsKKwkJCQlFUlJPUigidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyIC4gJHN0YXRfcmVhbCk7CiAJCQl9CiAJCX0KIApAQCAtMTg3Nyw2ICsyMDQwLDE1IEBACiAJCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KKyMgY2FzZSBhbmQgZGVmYXVsdCBzaG91bGQgbm90IGhhdmUgZ2VuZXJhbCBzdGF0ZW1lbnRzIGFmdGVyIHRoZW0KKwkJaWYgKCRsaW5lID1+IC9eLlxzKig/OmNhc2VccyouKnxkZWZhdWx0XHMqKTovZyAmJgorCQkgICAgJGxpbmUgIX4gL1xHKD86CisJCQkoPzpccyokOyopKD86XHMqeyk/KD86XHMqJDsqKSg/OlxzKlxcKT9ccyokfAorCQkJXHMqcmV0dXJuXHMrCisJCSAgICApL3hnKQorCQl7CisJCQlFUlJPUigidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQogCiAJCSMgQ2hlY2sgZm9yIH08bmw+ZWxzZSB7LCB0aGVzZSBtdXN0IGJlIGF0IHRoZSBzYW1lCiAJCSMgaW5kZW50IGxldmVsIHRvIGJlIHJlbGV2YW50IHRvIGVhY2ggb3RoZXIuCkBAIC0xOTEzLDEyICsyMDg1LDE3IEBACiAKICN3YXJuIGlmIDxhc20vZm9vLmg+IGlzICNpbmNsdWRlZCBhbmQgPGxpbnV4L2Zvby5oPiBpcyBhdmFpbGFibGUgKHVzZXMgUkFXIGxpbmUpCiAJCWlmICgkdHJlZSAmJiAkcmF3bGluZSA9fiBte14uXHMqXCNccyppbmNsdWRlXHMqXDxhc21cLyguKilcLmhcPn0pIHsKLQkJCW15ICRjaGVja2ZpbGUgPSAiaW5jbHVkZS9saW51eC8kMS5oIjsKLQkJCWlmICgtZiAiJHJvb3QvJGNoZWNrZmlsZSIgJiYgJHJlYWxmaWxlIG5lICRjaGVja2ZpbGUgJiYKKwkJCW15ICRmaWxlID0gIiQxLmgiOworCQkJbXkgJGNoZWNrZmlsZSA9ICJpbmNsdWRlL2xpbnV4LyRmaWxlIjsKKwkJCWlmICgtZiAiJHJvb3QvJGNoZWNrZmlsZSIgJiYKKwkJCSAgICAkcmVhbGZpbGUgbmUgJGNoZWNrZmlsZSAmJgogCQkJICAgICQxIG5lICdpcnEnKQogCQkJewotCQkJCVdBUk4oIlVzZSAjaW5jbHVkZSA8bGludXgvJDEuaD4gaW5zdGVhZCBvZiA8YXNtLyQxLmg+XG4iIC4KLQkJCQkJJGhlcmVjdXJyKTsKKwkJCQlpZiAoJHJlYWxmaWxlID1+IG17XmFyY2gvfSkgeworCQkJCQlDSEsoIkNvbnNpZGVyIHVzaW5nICNpbmNsdWRlIDxsaW51eC8kZmlsZT4gaW5zdGVhZCBvZiA8YXNtLyRmaWxlPlxuIiAuICRoZXJlY3Vycik7CisJCQkJfSBlbHNlIHsKKwkJCQkJV0FSTigiVXNlICNpbmNsdWRlIDxsaW51eC8kZmlsZT4gaW5zdGVhZCBvZiA8YXNtLyRmaWxlPlxuIiAuICRoZXJlY3Vycik7CisJCQkJfQogCQkJfQogCQl9CiAKQEAgLTE5NTMsOCArMjEzMCw4IEBACiAJCQkjIEV4dHJhY3QgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGVmaW5lIChpZiBhbnkpIGFuZAogCQkJIyByaXAgb2ZmIHN1cnJvdW5kaW5nIHNwYWNlcywgYW5kIHRyYWlsaW5nIFwncy4KIAkJCSRyZXN0ID0gJyc7Ci0JCQl3aGlsZSAoJG9mZiAhPSAwIHx8ICgkY250ID4gMCAmJiAkcmVzdCA9fiAvKD86XnxcXClccyokLykpIHsKLQkJCQkjcHJpbnQgIkFERElORyAkb2ZmIDwiIC4gc3Vic3RyKCRsaW5lc1skbG4gLSAxXSwgJG9mZikgLiAiPlxuIjsKKwkJCXdoaWxlICgkb2ZmICE9IDAgfHwgKCRjbnQgPiAwICYmICRyZXN0ID1+IC9cXFxzKiQvKSkgeworCQkJCSNwcmludCAiQURESU5HIGNudDwkY250PiAkb2ZmIDwiIC4gc3Vic3RyKCRsaW5lc1skbG4gLSAxXSwgJG9mZikgLiAiPiByZXN0PCRyZXN0PlxuIjsKIAkJCQlpZiAoJG9mZiAhPSAwIHx8ICRsaW5lc1skbG4gLSAxXSAhfiAvXi0vKSB7CiAJCQkJCSRyZXN0IC49IHN1YnN0cigkbGluZXNbJGxuIC0gMV0sICRvZmYpIC4gIlxuIjsKIAkJCQkJJGNudC0tOwpAQCAtMTk3OCw5ICsyMTU1LDEwIEBACiAJCQkkZHN0YXQgPX4gcy9ccyokLy9zOwogCiAJCQkjIEZsYXR0ZW4gYW55IHBhcmVudGhlc2VzIGFuZCBicmFjZXMKLQkJCXdoaWxlICgkZHN0YXQgPX4gcy9cKFteXChcKV0qXCkvMS8pIHsKLQkJCX0KLQkJCXdoaWxlICgkZHN0YXQgPX4gcy9ce1teXHtcfV0qXH0vMS8pIHsKKwkJCXdoaWxlICgkZHN0YXQgPX4gcy9cKFteXChcKV0qXCkvMS8gfHwKKwkJCSAgICAgICAkZHN0YXQgPX4gcy9ce1teXHtcfV0qXH0vMS8gfHwKKwkJCSAgICAgICAkZHN0YXQgPX4gcy9cW1teXHtcfV0qXF0vMS8pCisJCQl7CiAJCQl9CiAKIAkJCW15ICRleGNlcHRpb25zID0gcXJ7CkBAIC0yMDAzLDYgKzIxODEsNyBAQAogCQkJCWlmICgkZHN0YXQgbmUgJycgJiYKIAkJCQkgICAgJGRzdGF0ICF+IC9eKD86JElkZW50fC0/JENvbnN0YW50KSQvICYmCiAJCQkJICAgICRkc3RhdCAhfiAvJGV4Y2VwdGlvbnMvICYmCisJCQkJICAgICRkc3RhdCAhfiAvXlwuJElkZW50XHMqPS8gJiYKIAkJCQkgICAgJGRzdGF0ID1+IC8kT3BlcmF0b3JzLykKIAkJCQl7CiAJCQkJCUVSUk9SKCJNYWNyb3Mgd2l0aCBjb21wbGV4IHZhbHVlcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXNcbiIgLiAiJGhlcmVcbiRjdHhcbiIpOwpAQCAtMjEwMywxMCArMjI4MiwxMCBAQAogCQkJfQogCQkJaWYgKCRsZXZlbCA9PSAwICYmICRibG9jayA9fiAvXlxzKlx7LyAmJiAhJGFsbG93ZWQpIHsKIAkJCQlteSAkaGVyZWN0eCA9ICRoZXJlIC4gIlxuIjs7Ci0JCQkJbXkgJGVuZCA9ICRsaW5lbnIgKyBzdGF0ZW1lbnRfcmF3bGluZXMoJGJsb2NrKSAtIDE7CisJCQkJbXkgJGNudCA9IHN0YXRlbWVudF9yYXdsaW5lcygkYmxvY2spOwogCi0JCQkJZm9yIChteSAkbG4gPSAkbGluZW5yIC0gMTsgJGxuIDwgJGVuZDsgJGxuKyspIHsKLQkJCQkJJGhlcmVjdHggLj0gJHJhd2xpbmVzWyRsbl0gLiAiXG4iOzsKKwkJCQlmb3IgKG15ICRuID0gMDsgJG4gPCAkY250OyAkbisrKSB7CisJCQkJCSRoZXJlY3R4IC49IHJhd19saW5lKCRsaW5lbnIsICRuKSAuICJcbiI7OwogCQkJCX0KIAogCQkJCVdBUk4oImJyYWNlcyB7fSBhcmUgbm90IG5lY2Vzc2FyeSBmb3Igc2luZ2xlIHN0YXRlbWVudCBibG9ja3NcbiIgLiAkaGVyZWN0eCk7CkBAIC0yMjgxLDYgKzI0NjAsNyBAQAogCQlteSAkc3RyaW5nOwogCQl3aGlsZSAoJGxpbmUgPX4gLyg/Ol58IikoW1hcdF0qKSg/OiJ8JCkvZykgewogCQkJJHN0cmluZyA9IHN1YnN0cigkcmF3bGluZSwgJC1bMV0sICQrWzFdIC0gJC1bMV0pOworCQkJJHN0cmluZyA9fiBzLyUlL19fL2c7CiAJCQlpZiAoJHN0cmluZyA9fiAvKD88ISUpJUxbdWRpXS8pIHsKIAkJCQlXQVJOKCJcJUxkLyVMdSBhcmUgbm90LXN0YW5kYXJkIEMsIHVzZSAlbGxkLyVsbHVcbiIgLiAkaGVyZWN1cnIpOwogCQkJCWxhc3Q7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrc3RhY2sucGwgYi9zY3JpcHRzL2NoZWNrc3RhY2sucGwKaW5kZXggM2VjYTYyNS4uZjdlOGU5MyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3N0YWNrLnBsCisrKyBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApAQCAtODEsNyArODEsMTAgQEAKIAkJJHJlID0gcXIvLipzdFtkd111LipyMSwtKCR4ezEsOH0pXChyMVwpL287CiAJfSBlbHNpZiAoJGFyY2ggPX4gL15zMzkweD8kLykgewogCQkjICAgMTExNjA6ICAgICAgIGE3IGZiIGZmIDYwICAgICAgICAgICAgIGFnaGkgICAlcjE1LC0xNjAKLQkJJHJlID0gcXIvLiphZz9oaS4qXCVyMTUsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJCSMgb3IKKwkJIyAgMTAwMDkyOgkgZTMgZjAgZmYgYzggZmYgNzEJIGxheQkgJXIxNSwtNTYoJXIxNSkKKwkJJHJlID0gcXIvLiooPzpsYXl8YWc/aGkpLipcJXIxNSwtKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkKKwkJICAgICAgKD86XChcJXIxNVwpKT8kL294OwogCX0gZWxzaWYgKCRhcmNoID1+IC9ec2g2NCQvKSB7CiAJCSNYWFg6IHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpbW1lZGlhdGUgY2FzZSBwcmVzZW50bHksCiAJCSMgICAgIHRob3VnaCB3ZSB3aWxsIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBtb3ZpL3N1YgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggMzZiNWVlZC4uM2UxMDU3ZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC0zMiw2ICszMiw3IEBACiAKIHN0YXRpYyBpbnQgaW5kZW50ID0gMTsKIHN0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBzeW5jX2tjb25maWc7CiBzdGF0aWMgaW50IGNvbmZfY250Owogc3RhdGljIGNoYXIgbGluZVsxMjhdOwogc3RhdGljIHN0cnVjdCBtZW51ICpyb290RW50cnk7CkBAIC02NSw3ICs2Niw3IEBACiAKIHN0YXRpYyB2b2lkIGNoZWNrX3N0ZGluKHZvaWQpCiB7Ci0JaWYgKCF2YWxpZF9zdGRpbiAmJiBpbnB1dF9tb2RlID09IGFza19zaWxlbnQpIHsKKwlpZiAoIXZhbGlkX3N0ZGluKSB7CiAJCXByaW50ZihfKCJhYm9ydGVkIVxuXG4iKSk7CiAJCXByaW50ZihfKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKSk7CiAJCXByaW50ZihfKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIikpOwpAQCAtNDI3LDQzICs0MjgsNiBAQAogCQljaGVja19jb25mKGNoaWxkKTsKIH0KIAotc3RhdGljIHZvaWQgY29uZl9kb191cGRhdGUodm9pZCkKLXsKLQkvKiBVcGRhdGUgdW50aWwgYSBsb29wIGNhdXNlZCBubyBtb3JlIGNoYW5nZXMgKi8KLQlkbyB7Ci0JCWNvbmZfY250ID0gMDsKLQkJY2hlY2tfY29uZigmcm9vdG1lbnUpOwotCX0gd2hpbGUgKGNvbmZfY250KTsKLX0KLQotc3RhdGljIGludCBjb25mX3NpbGVudF91cGRhdGUodm9pZCkKLXsKLQljb25zdCBjaGFyICpuYW1lOwotCi0JaWYgKGNvbmZfZ2V0X2NoYW5nZWQoKSkgewotCQluYW1lID0gZ2V0ZW52KCJLQ09ORklHX05PU0lMRU5UVVBEQVRFIik7Ci0JCWlmIChuYW1lICYmICpuYW1lKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCV8oIlxuKioqIEtlcm5lbCBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGV4cGxpY2l0IHVwZGF0ZS5cblxuIikpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY29uZl9kb191cGRhdGUoKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZl91cGRhdGUodm9pZCkKLXsKLQlyb290RW50cnkgPSAmcm9vdG1lbnU7Ci0JY29uZigmcm9vdG1lbnUpOwotCWlmIChpbnB1dF9tb2RlID09IGFza19hbGwpIHsKLQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7Ci0JCXZhbGlkX3N0ZGluID0gMTsKLQl9Ci0JY29uZl9kb191cGRhdGUoKTsKLQlyZXR1cm4gMDsKLX0KLQogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCiB7CiAJaW50IG9wdDsKQEAgLTQ3NywxMSArNDQxLDExIEBACiAJd2hpbGUgKChvcHQgPSBnZXRvcHQoYWMsIGF2LCAib3NkRDpubXlyaCIpKSAhPSAtMSkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICdvJzoKLQkJCWlucHV0X21vZGUgPSBhc2tfbmV3OworCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CiAJCQlicmVhazsKIAkJY2FzZSAncyc6CiAJCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKLQkJCXZhbGlkX3N0ZGluID0gaXNhdHR5KDApICYmIGlzYXR0eSgxKSAmJiBpc2F0dHkoMik7CisJCQlzeW5jX2tjb25maWcgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2QnOgogCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OwpAQCAtNTE5LDYgKzQ4MywxOSBAQAogCW5hbWUgPSBhdltvcHRpbmRdOwogCWNvbmZfcGFyc2UobmFtZSk7CiAJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKwlpZiAoc3luY19rY29uZmlnKSB7CisJCWlmIChzdGF0KCIuY29uZmlnIiwgJnRtcHN0YXQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiKioqXG4iCisJCQkJIioqKiBZb3UgaGF2ZSBub3QgeWV0IGNvbmZpZ3VyZWQgeW91ciBrZXJuZWwhXG4iCisJCQkJIioqKiAobWlzc2luZyBrZXJuZWwgLmNvbmZpZyBmaWxlKVxuIgorCQkJCSIqKipcbiIKKwkJCQkiKioqIFBsZWFzZSBydW4gc29tZSBjb25maWd1cmF0b3IgKGUuZy4gXCJtYWtlIG9sZGNvbmZpZ1wiIG9yXG4iCisJCQkJIioqKiBcIm1ha2UgbWVudWNvbmZpZ1wiIG9yIFwibWFrZSB4Y29uZmlnXCIpLlxuIgorCQkJCSIqKipcbiIpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKIAlzd2l0Y2ggKGlucHV0X21vZGUpIHsKIAljYXNlIHNldF9kZWZhdWx0OgogCQlpZiAoIWRlZmNvbmZpZ19maWxlKQpAQCAtNTMxLDE2ICs1MDgsNiBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgYXNrX3NpbGVudDoKLQkJaWYgKHN0YXQoIi5jb25maWciLCAmdG1wc3RhdCkpIHsKLQkJCXByaW50ZihfKCIqKipcbiIKLQkJCQkiKioqIFlvdSBoYXZlIG5vdCB5ZXQgY29uZmlndXJlZCB5b3VyIGtlcm5lbCFcbiIKLQkJCQkiKioqIChtaXNzaW5nIGtlcm5lbCAuY29uZmlnIGZpbGUpXG4iCi0JCQkJIioqKlxuIgotCQkJCSIqKiogUGxlYXNlIHJ1biBzb21lIGNvbmZpZ3VyYXRvciAoZS5nLiBcIm1ha2Ugb2xkY29uZmlnXCIgb3JcbiIKLQkJCQkiKioqIFwibWFrZSBtZW51Y29uZmlnXCIgb3IgXCJtYWtlIHhjb25maWdcIikuXG4iCi0JCQkJIioqKlxuIikpOwotCQkJZXhpdCgxKTsKLQkJfQogCWNhc2UgYXNrX2FsbDoKIAljYXNlIGFza19uZXc6CiAJCWNvbmZfcmVhZChOVUxMKTsKQEAgLTU2OSw2ICs1MzYsMTkgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CisKKwlpZiAoc3luY19rY29uZmlnKSB7CisJCWlmIChjb25mX2dldF9jaGFuZ2VkKCkpIHsKKwkJCW5hbWUgPSBnZXRlbnYoIktDT05GSUdfTk9TSUxFTlRVUERBVEUiKTsKKwkJCWlmIChuYW1lICYmICpuYW1lKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCV8oIlxuKioqIEtlcm5lbCBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGV4cGxpY2l0IHVwZGF0ZS5cblxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCXZhbGlkX3N0ZGluID0gaXNhdHR5KDApICYmIGlzYXR0eSgxKSAmJiBpc2F0dHkoMik7CisJfQorCiAJc3dpdGNoIChpbnB1dF9tb2RlKSB7CiAJY2FzZSBzZXRfbm86CiAJCWNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhkZWZfbm8pOwpAQCAtNTg1LDI3ICs1NjUsMzggQEAKIAljYXNlIHNldF9kZWZhdWx0OgogCQljb25mX3NldF9hbGxfbmV3X3N5bWJvbHMoZGVmX2RlZmF1bHQpOwogCQlicmVhazsKLQljYXNlIGFza19zaWxlbnQ6CiAJY2FzZSBhc2tfbmV3OgotCQlpZiAoY29uZl9zaWxlbnRfdXBkYXRlKCkpCi0JCQlleGl0KDEpOwotCQlicmVhazsKIAljYXNlIGFza19hbGw6Ci0JCWlmIChjb25mX3VwZGF0ZSgpKQotCQkJZXhpdCgxKTsKKwkJcm9vdEVudHJ5ID0gJnJvb3RtZW51OworCQljb25mKCZyb290bWVudSk7CisJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIGFza19zaWxlbnQ6CisJCS8qIFVwZGF0ZSB1bnRpbCBhIGxvb3AgY2F1c2VkIG5vIG1vcmUgY2hhbmdlcyAqLworCQlkbyB7CisJCQljb25mX2NudCA9IDA7CisJCQljaGVja19jb25mKCZyb290bWVudSk7CisJCX0gd2hpbGUgKGNvbmZfY250KTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKLQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIikpOwotCQlleGl0KDEpOwotCX0KLQkvKiBhc2tfc2lsZW50IGlzIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBzbyB3ZSBzaGFsbCB1cGRhdGUgYXV0b2NvbmYuCi0JICogQWxsIG90aGVyIGNvbW1hbmRzIGFyZSBvbmx5IHVzZWQgdG8gZ2VuZXJhdGUgYSBjb25maWcuCi0JICovCi0JaWYgKGlucHV0X21vZGUgPT0gYXNrX3NpbGVudCAmJiBjb25mX3dyaXRlX2F1dG9jb25mKCkpIHsKLQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIikpOwotCQlyZXR1cm4gMTsKKwlpZiAoc3luY19rY29uZmlnKSB7CisJCS8qIHNpbGVudG9sZGNvbmZpZyBpcyB1c2VkIGR1cmluZyB0aGUgYnVpbGQgc28gd2Ugc2hhbGwgdXBkYXRlIGF1dG9jb25mLgorCQkgKiBBbGwgb3RoZXIgY29tbWFuZHMgYXJlIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSBhIGNvbmZpZy4KKwkJICovCisJCWlmIChjb25mX2dldF9jaGFuZ2VkKCkgJiYgY29uZl93cml0ZShOVUxMKSkgeworCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIikpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoY29uZl93cml0ZV9hdXRvY29uZigpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiXG4qKiogRXJyb3IgZHVyaW5nIHVwZGF0ZSBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG5cbiIpKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcbioqKiBFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG5cbiIpKTsKKwkJCWV4aXQoMSk7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IGRmNmExODguLmI5MWNmMjQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0yMjIsOCArMjIyLDEwIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoZGVmID09IFNfREVGX1VTRVIpIHsKIAkJCQlzeW0gPSBzeW1fZmluZChsaW5lICsgOSk7Ci0JCQkJaWYgKCFzeW0pCisJCQkJaWYgKCFzeW0pIHsKKwkJCQkJc3ltX2FkZF9jaGFuZ2VfY291bnQoMSk7CiAJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJc3ltID0gc3ltX2xvb2t1cChsaW5lICsgOSwgMCk7CiAJCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCkBAIC0yNTksOCArMjYxLDEwIEBACiAJCQl9CiAJCQlpZiAoZGVmID09IFNfREVGX1VTRVIpIHsKIAkJCQlzeW0gPSBzeW1fZmluZChsaW5lICsgNyk7Ci0JCQkJaWYgKCFzeW0pCisJCQkJaWYgKCFzeW0pIHsKKwkJCQkJc3ltX2FkZF9jaGFuZ2VfY291bnQoMSk7CiAJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJc3ltID0gc3ltX2xvb2t1cChsaW5lICsgNywgMCk7CiAJCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggZmY3ODdlNi4uNDRlZTk0ZCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtNzgxLDYgKzc4MSw3IEBACiAgICAgcHJpbnQgIiA8cmVmc2VjdDE+XG4iOwogICAgIHByaW50ICIgIDx0aXRsZT5NZW1iZXJzPC90aXRsZT5cbiI7CiAKKyAgICBpZiAoJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0gPj0gMCkgewogICAgIHByaW50ICIgIDx2YXJpYWJsZWxpc3Q+XG4iOwogICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgewogICAgICAgKCRwYXJhbWV0ZXIgPX4gL14jLykgJiYgbmV4dDsKQEAgLTc5OCw2ICs3OTksOSBAQAogICAgICAgcHJpbnQgIiAgICA8L3Zhcmxpc3RlbnRyeT5cbiI7CiAgICAgfQogICAgIHByaW50ICIgIDwvdmFyaWFibGVsaXN0PlxuIjsKKyAgICB9IGVsc2UgeworCXByaW50ICIgPHBhcmE+XG4gIE5vbmVcbiA8L3BhcmE+XG4iOworICAgIH0KICAgICBwcmludCAiIDwvcmVmc2VjdDE+XG4iOwogCiAgICAgb3V0cHV0X3NlY3Rpb25feG1sKEBfKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCA0Yzk4OTBlLi5kNGRjMjIyIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0yMDYsNiArMjA2LDIwIEBACiAJCWRvX3VzYl9lbnRyeV9tdWx0aShzeW12YWwgKyBpLCBtb2QpOwogfQogCisvKiBMb29rcyBsaWtlOiBoaWQ6Yk52TnBOICovCitzdGF0aWMgaW50IGRvX2hpZF9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCSAgICAgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpZC0+dmVuZG9yID0gVE9fTkFUSVZFKGlkLT52ZW5kb3IpOworCWlkLT5wcm9kdWN0ID0gVE9fTkFUSVZFKGlkLT5wcm9kdWN0KTsKKworCXNwcmludGYoYWxpYXMsICJoaWQ6YiUwNFgiLCBpZC0+YnVzKTsKKwlBREQoYWxpYXMsICJ2IiwgaWQtPnZlbmRvciAhPSBISURfQU5ZX0lELCBpZC0+dmVuZG9yKTsKKwlBREQoYWxpYXMsICJwIiwgaWQtPnByb2R1Y3QgIT0gSElEX0FOWV9JRCwgaWQtPnByb2R1Y3QpOworCisJcmV0dXJuIDE7Cit9CisKIC8qIExvb2tzIGxpa2U6IGllZWUxMzk0OnZlbk5tb05zcE52ZXJOICovCiBzdGF0aWMgaW50IGRvX2llZWUxMzk0X2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJICAgICBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkICppZCwgY2hhciAqYWxpYXMpCkBAIC02MjksNiArNjQzLDU5IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pZmllbGQgeworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwlpbnQgZmllbGQ7Cit9IGRtaV9maWVsZHNbXSA9IHsKKwl7ICJidm4iLCBETUlfQklPU19WRU5ET1IgfSwKKwl7ICJidnIiLCBETUlfQklPU19WRVJTSU9OIH0sCisJeyAiYmQiLCAgRE1JX0JJT1NfREFURSB9LAorCXsgInN2biIsIERNSV9TWVNfVkVORE9SIH0sCisJeyAicG4iLCAgRE1JX1BST0RVQ1RfTkFNRSB9LAorCXsgInB2ciIsIERNSV9QUk9EVUNUX1ZFUlNJT04gfSwKKwl7ICJydm4iLCBETUlfQk9BUkRfVkVORE9SIH0sCisJeyAicm4iLCAgRE1JX0JPQVJEX05BTUUgfSwKKwl7ICJydnIiLCBETUlfQk9BUkRfVkVSU0lPTiB9LAorCXsgImN2biIsIERNSV9DSEFTU0lTX1ZFTkRPUiB9LAorCXsgImN0IiwgIERNSV9DSEFTU0lTX1RZUEUgfSwKKwl7ICJjdnIiLCBETUlfQ0hBU1NJU19WRVJTSU9OIH0sCisJeyBOVUxMLCAgRE1JX05PTkUgfQorfTsKKworc3RhdGljIHZvaWQgZG1pX2FzY2lpX2ZpbHRlcihjaGFyICpkLCBjb25zdCBjaGFyICpzKQoreworCS8qIEZpbHRlciBvdXQgY2hhcmFjdGVycyB3ZSBkb24ndCB3YW50IHRvIHNlZSBpbiB0aGUgbW9kYWxpYXMgc3RyaW5nICovCisJZm9yICg7ICpzOyBzKyspCisJCWlmICgqcyA+ICcgJyAmJiAqcyA8IDEyNyAmJiAqcyAhPSAnOicpCisJCQkqKGQrKykgPSAqczsKKworCSpkID0gMDsKK30KKworCitzdGF0aWMgaW50IGRvX2RtaV9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkLAorCQkJY2hhciAqYWxpYXMpCit7CisJaW50IGksIGo7CisKKwlzcHJpbnRmKGFsaWFzLCAiZG1pKiIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZG1pX2ZpZWxkcyk7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlpZiAoaWQtPm1hdGNoZXNbal0uc2xvdCAmJgorCQkJICAgIGlkLT5tYXRjaGVzW2pdLnNsb3QgPT0gZG1pX2ZpZWxkc1tpXS5maWVsZCkgeworCQkJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAiOiVzKiIsCisJCQkJCWRtaV9maWVsZHNbaV0ucHJlZml4KTsKKwkJCQlkbWlfYXNjaWlfZmlsdGVyKGFsaWFzICsgc3RybGVuKGFsaWFzKSwKKwkJCQkJCSBpZC0+bWF0Y2hlc1tqXS5zdWJzdHIpOworCQkJCXN0cmNhdChhbGlhcywgIioiKTsKKwkJCX0KKwkJfQorCX0KKworCXN0cmNhdChhbGlhcywgIjoiKTsKKwlyZXR1cm4gMTsKK30KIC8qIElnbm9yZSBhbnkgcHJlZml4LCBlZy4gc29tZSBhcmNoaXRlY3R1cmVzIHByZXBlbmQgXyAqLwogc3RhdGljIGlubGluZSBpbnQgc3ltX2lzKGNvbnN0IGNoYXIgKnN5bWJvbCwgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTY5Miw2ICs3NTksMTAgQEAKIAllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3VzYl9kZXZpY2VfdGFibGUiKSkKIAkJLyogc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSBiY2REZXZpY2UgcmFuZ2VzICovCiAJCWRvX3VzYl90YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX2hpZF9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCisJCQkgc2l6ZW9mKHN0cnVjdCBoaWRfZGV2aWNlX2lkKSwgImhpZCIsCisJCQkgZG9faGlkX2VudHJ5LCBtb2QpOwogCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfaWVlZTEzOTRfZGV2aWNlX3RhYmxlIikpCiAJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLAogCQkJIHNpemVvZihzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkKSwgImllZWUxMzk0IiwKQEAgLTc2MCw2ICs4MzEsMTAgQEAKIAkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCiAJCQkgc2l6ZW9mKHN0cnVjdCBpMmNfZGV2aWNlX2lkKSwgImkyYyIsCiAJCQkgZG9faTJjX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfZG1pX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwKKwkJCSBzaXplb2Yoc3RydWN0IGRtaV9zeXN0ZW1faWQpLCAiZG1pIiwKKwkJCSBkb19kbWlfZW50cnksIG1vZCk7CiAJZnJlZSh6ZXJvcyk7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCA0MThjZDdkLi44ZTBkZTZhIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0xOTg2LDExICsxOTg2LDEzIEBACiAKIAkJbW9kID0gZmluZF9tb2R1bGUobW9kbmFtZSk7CiAJCWlmICghbW9kKSB7Ci0JCQlpZiAoaXNfdm1saW51eChtb2RuYW1lKSkKLQkJCQloYXZlX3ZtbGludXggPSAxOwogCQkJbW9kID0gbmV3X21vZHVsZShOT0ZBSUwoc3RyZHVwKG1vZG5hbWUpKSk7CiAJCQltb2QtPnNraXAgPSAxOwogCQl9CisJCWlmIChpc192bWxpbnV4KG1vZG5hbWUpKSB7CisJCQloYXZlX3ZtbGludXggPSAxOworCQkJbW9kLT5za2lwID0gMDsKKwkJfQogCiAJCWlmICghbW9kLT5za2lwKQogCQkJYWRkX21hcmtlcihtb2QsIG1hcmtlciwgZm10KTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2VsaW51eC9NYWtlZmlsZSBiL3NjcmlwdHMvc2VsaW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTRiMWVjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zZWxpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorc3ViZGlyLXkgOj0gbWRwCitzdWJkaXItCSs9IG1kcApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zZWxpbnV4L1JFQURNRSBiL3NjcmlwdHMvc2VsaW51eC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzNjMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc2VsaW51eC9SRUFETUUKQEAgLTAsMCArMSwyIEBACitQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vU0VMaW51eC50eHQgZm9yIGluZm9ybWF0aW9uIG9uCitpbnN0YWxsaW5nIGEgZHVtbXkgU0VMaW51eCBwb2xpY3kuCmRpZmYgLS1naXQgYS9zY3JpcHRzL3NlbGludXgvaW5zdGFsbF9wb2xpY3kuc2ggYi9zY3JpcHRzL3NlbGludXgvaW5zdGFsbF9wb2xpY3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5Y2NmNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc2VsaW51eC9pbnN0YWxsX3BvbGljeS5zaApAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vc2gKK2lmIFsgYGlkIC11YCAtbmUgMCBdOyB0aGVuCisJZWNobyAiJDA6IG11c3QgYmUgcm9vdCB0byBpbnN0YWxsIHRoZSBzZWxpbnV4IHBvbGljeSIKKwlleGl0IDEKK2ZpCitTRj1gd2hpY2ggc2V0ZmlsZXNgCitpZiBbICQ/IC1lcSAxIF07IHRoZW4KKwlpZiBbIC1mIC9zYmluL3NldGZpbGVzIF07IHRoZW4KKwkJU0Y9Ii91c3Ivc2V0ZmlsZXMiCisJZWxzZQorCQllY2hvICJubyBzZWxpbnV4IHRvb2xzIGluc3RhbGxlZDogc2V0ZmlsZXMiCisJCWV4aXQgMQorCWZpCitmaQorCitjZCBtZHAKKworQ1A9YHdoaWNoIGNoZWNrcG9saWN5YAorVkVSUz1gJENQIC1WIHwgYXdrICd7cHJpbnQgJDF9J2AKKworLi9tZHAgcG9saWN5LmNvbmYgZmlsZV9jb250ZXh0cworJENQIC1vIHBvbGljeS4kVkVSUyBwb2xpY3kuY29uZgorCitta2RpciAtcCAvZXRjL3NlbGludXgvZHVtbXkvcG9saWN5Citta2RpciAtcCAvZXRjL3NlbGludXgvZHVtbXkvY29udGV4dHMvZmlsZXMKKworY3AgZmlsZV9jb250ZXh0cyAvZXRjL3NlbGludXgvZHVtbXkvY29udGV4dHMvZmlsZXMKK2NwIGRidXNfY29udGV4dHMgL2V0Yy9zZWxpbnV4L2R1bW15L2NvbnRleHRzCitjcCBwb2xpY3kuJFZFUlMgL2V0Yy9zZWxpbnV4L2R1bW15L3BvbGljeQorRkNfRklMRT0vZXRjL3NlbGludXgvZHVtbXkvY29udGV4dHMvZmlsZXMvZmlsZV9jb250ZXh0cworCitpZiBbICEgLWQgL2V0Yy9zZWxpbnV4IF07IHRoZW4KKwlta2RpciAtcCAvZXRjL3NlbGludXgKK2ZpCitpZiBbICEgLWYgL2V0Yy9zZWxpbnV4L2NvbmZpZyBdOyB0aGVuCisJY2F0ID4gL2V0Yy9zZWxpbnV4L2NvbmZpZyA8PCBFT0YKK1NFTElOVVg9ZW5mb3JjaW5nCitTRUxJTlVYVFlQRT1kdW1teQorRU9GCitlbHNlCisJVFlQRT1gY2F0IC9ldGMvc2VsaW51eC9jb25maWcgfCBncmVwICJeU0VMSU5VWFRZUEUiIHwgdGFpbCAtMSB8IGF3ayAtRj0gJ3sgcHJpbnQgJDIgJ31gCisJaWYgWyAiZXEkVFlQRSIgIT0gImVxZHVtbXkiIF07IHRoZW4KKwkJc2VsaW51eGVuYWJsZWQKKwkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQllY2hvICJTRUxpbnV4IGFscmVhZHkgZW5hYmxlZCB3aXRoIGEgbm9uLWR1bW15IHBvbGljeS4iCisJCQllY2hvICJFeGl0aW5nLiAgUGxlYXNlIGluc3RhbGwgcG9saWN5IGJ5IGhhbmQgaWYgdGhhdCIKKwkJCWVjaG8gImlzIHdoYXQgeW91IFJFQUxMWSB3YW50LiIKKwkJCWV4aXQgMQorCQlmaQorCQltdiAvZXRjL3NlbGludXgvY29uZmlnIC9ldGMvc2VsaW51eC9jb25maWcubWRwYmFrCisJCWdyZXAgLXYgIl5TRUxJTlVYVFlQRSIgL2V0Yy9zZWxpbnV4L2NvbmZpZy5tZHBiYWsgPj4gL2V0Yy9zZWxpbnV4L2NvbmZpZworCQllY2hvICJTRUxJTlVYVFlQRT1kdW1teSIgPj4gL2V0Yy9zZWxpbnV4L2NvbmZpZworCWZpCitmaQorCitjZCAvZXRjL3NlbGludXgvZHVtbXkvY29udGV4dHMvZmlsZXMKKyRTRiBmaWxlX2NvbnRleHRzIC8KKworbW91bnRzPWBjYXQgL3Byb2MvJCQvbW91bnRzIHwgZWdyZXAgImV4dDJ8ZXh0M3x4ZnN8amZzfGV4dDR8ZXh0NGRldnxnZnMyIiB8IGF3ayAneyBwcmludCAkMiAnfWAKKyRTRiBmaWxlX2NvbnRleHRzICRtb3VudHMKKworCitkb2Rldj1gY2F0IC9wcm9jLyQkL21vdW50cyB8IGdyZXAgIi9kZXYgImAKK2lmIFsgImVxJGRvZGV2IiAhPSAiZXEiIF07IHRoZW4KKwltb3VudCAtLW1vdmUgL2RldiAvbW50CisJJFNGIGZpbGVfY29udGV4dHMgL2RldgorCW1vdW50IC0tbW92ZSAvbW50IC9kZXYKK2ZpCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2VsaW51eC9tZHAvLmdpdGlnbm9yZSBiL3NjcmlwdHMvc2VsaW51eC9tZHAvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQ1NDZkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zZWxpbnV4L21kcC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBHZW5lcmF0ZWQgZmlsZQorbWRwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3NlbGludXgvbWRwL01ha2VmaWxlIGIvc2NyaXB0cy9zZWxpbnV4L21kcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjM2NWIzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zZWxpbnV4L21kcC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK2hvc3Rwcm9ncy15CTo9IG1kcAorSE9TVF9FWFRSQUNGTEFHUyArPSAtSXNlY3VyaXR5L3NlbGludXgvaW5jbHVkZQorCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCitjbGVhbi1maWxlcwk6PSAkKGhvc3Rwcm9ncy15KSBwb2xpY3kuKiBmaWxlX2NvbnRleHRzCmRpZmYgLS1naXQgYS9zY3JpcHRzL3NlbGludXgvbWRwL2RidXNfY29udGV4dHMgYi9zY3JpcHRzL3NlbGludXgvbWRwL2RidXNfY29udGV4dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2ZTY4NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc2VsaW51eC9tZHAvZGJ1c19jb250ZXh0cwpAQCAtMCwwICsxLDYgQEAKKzwhRE9DVFlQRSBidXNjb25maWcgUFVCTElDICItLy9mcmVlZGVza3RvcC8vRFREIEQtQlVTIEJ1cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgImh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3N0YW5kYXJkcy9kYnVzLzEuMC9idXNjb25maWcuZHRkIj4KKzxidXNjb25maWc+CisgIDxzZWxpbnV4PgorICA8L3NlbGludXg+Cis8L2J1c2NvbmZpZz4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2VsaW51eC9tZHAvbWRwLmMgYi9zY3JpcHRzL3NlbGludXgvbWRwL21kcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzU3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NlbGludXgvbWRwL21kcC5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICoKKyAqIG1kcCAtIG1ha2UgZHVtbXkgcG9saWN5CisgKgorICogV2hlbiBwb2ludGVkIGF0IGEga2VybmVsIHRyZWUsIGJ1aWxkcyBhIGR1bW15IHBvbGljeSBmb3IgdGhhdCBrZXJuZWwKKyAqIHdpdGggZXhhY3RseSBvbmUgdHlwZSB3aXRoIGZ1bGwgcmlnaHRzIHRvIGl0c2VsZi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA2CisgKgorICogQXV0aG9yczogU2VyZ2UgRS4gSGFsbHluIDxzZXJ1ZUB1cy5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZmxhc2suaCIKKwordm9pZCB1c2FnZShjaGFyICpuYW1lKQoreworCXByaW50ZigidXNhZ2U6ICVzIFstbV0gcG9saWN5X2ZpbGUgY29udGV4dF9maWxlXG4iLCBuYW1lKTsKKwlleGl0KDEpOworfQorCit2b2lkIGZpbmRfY29tbW9uX25hbWUoY2hhciAqY25hbWUsIGNoYXIgKmRlc3QsIGludCBsZW4pCit7CisJY2hhciAqc3RhcnQsICplbmQ7CisKKwlzdGFydCA9IHN0cmNocihjbmFtZSwgJ18nKSsxOworCWVuZCA9IHN0cmNocihzdGFydCwgJ18nKTsKKwlpZiAoIXN0YXJ0IHx8ICFlbmQgfHwgc3RhcnQtY25hbWUgPiBsZW4gfHwgZW5kLXN0YXJ0ID4gbGVuKSB7CisJCXByaW50ZigiRXJyb3Igd2l0aCBjb21tb25zIGRlZmluZXNcbiIpOworCQlleGl0KDEpOworCX0KKwlzdHJuY3B5KGRlc3QsIHN0YXJ0LCBlbmQtc3RhcnQpOworCWRlc3RbZW5kLXN0YXJ0XSA9ICdcMCc7Cit9CisKKyNkZWZpbmUgU18oeCkgeCwKK3N0YXRpYyBjaGFyICpjbGFzc2xpc3RbXSA9IHsKKyNpbmNsdWRlICJjbGFzc190b19zdHJpbmcuaCIKKwlOVUxMCit9OworI3VuZGVmIFNfCisKKyNpbmNsdWRlICJpbml0aWFsX3NpZF90b19zdHJpbmcuaCIKKworI2RlZmluZSBUQl8oeCkgY2hhciAqeFtdID0geworI2RlZmluZSBURV8oeCkgTlVMTCB9OworI2RlZmluZSBTXyh4KSB4LAorI2luY2x1ZGUgImNvbW1vbl9wZXJtX3RvX3N0cmluZy5oIgorI3VuZGVmIFRCXworI3VuZGVmIFRFXworI3VuZGVmIFNfCisKK3N0cnVjdCBjb21tb24geworCWNoYXIgKmNuYW1lOworCWNoYXIgKipwZXJtczsKK307CitzdHJ1Y3QgY29tbW9uIGNvbW1vbltdID0geworI2RlZmluZSBUQl8oeCkgeyAjeCwgeCB9LAorI2RlZmluZSBTXyh4KQorI2RlZmluZSBURV8oeCkKKyNpbmNsdWRlICJjb21tb25fcGVybV90b19zdHJpbmcuaCIKKyN1bmRlZiBUQl8KKyN1bmRlZiBURV8KKyN1bmRlZiBTXworfTsKKworI2RlZmluZSBTXyh4LCB5LCB6KSB7eCwgI3l9LAorc3RydWN0IGF2X2luaGVyaXQgeworCWludCBjbGFzczsKKwljaGFyICpjb21tb247Cit9Oworc3RydWN0IGF2X2luaGVyaXQgYXZfaW5oZXJpdFtdID0geworI2luY2x1ZGUgImF2X2luaGVyaXQuaCIKK307CisjdW5kZWYgU18KKworI2luY2x1ZGUgImF2X3Blcm1pc3Npb25zLmgiCisjZGVmaW5lIFNfKHgsIHksIHopIHt4LCB5LCB6fSwKK3N0cnVjdCBhdl9wZXJtcyB7CisJaW50IGNsYXNzOworCWludCBwZXJtX2k7CisJY2hhciAqcGVybV9zOworfTsKK3N0cnVjdCBhdl9wZXJtcyBhdl9wZXJtc1tdID0geworI2luY2x1ZGUgImF2X3Blcm1fdG9fc3RyaW5nLmgiCit9OworI3VuZGVmIFNfCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGksIGosIG1scyA9IDA7CisJY2hhciAqKmFyZywgKnBvbG91dCwgKmN0eG91dDsKKwlpbnQgY2xhc3NsaXN0X2xlbiwgaW5pdGlhbF9zaWRfdG9fc3RyaW5nX2xlbjsKKwlGSUxFICpmb3V0OworCisJaWYgKGFyZ2MgPCAzKQorCQl1c2FnZShhcmd2WzBdKTsKKwlhcmcgPSBhcmd2KzE7CisJaWYgKGFyZ2M9PTQgJiYgc3RyY21wKGFyZ3ZbMV0sICItbSIpID09IDApIHsKKwkJbWxzID0gMTsKKwkJYXJnKys7CisJfQorCXBvbG91dCA9ICphcmcrKzsKKwljdHhvdXQgPSAqYXJnOworCisJZm91dCA9IGZvcGVuKHBvbG91dCwgInciKTsKKwlpZiAoIWZvdXQpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgcG9sb3V0KTsKKwkJdXNhZ2UoYXJndlswXSk7CisJfQorCisJY2xhc3NsaXN0X2xlbiA9IHNpemVvZihjbGFzc2xpc3QpIC8gc2l6ZW9mKGNoYXIgKik7CisJLyogcHJpbnQgb3V0IHRoZSBjbGFzc2VzICovCisJZm9yIChpPTE7IGkgPCBjbGFzc2xpc3RfbGVuOyBpKyspIHsKKwkJaWYoY2xhc3NsaXN0W2ldKQorCQkJZnByaW50Zihmb3V0LCAiY2xhc3MgJXNcbiIsIGNsYXNzbGlzdFtpXSk7CisJCWVsc2UKKwkJCWZwcmludGYoZm91dCwgImNsYXNzIHVzZXIlZFxuIiwgaSk7CisJfQorCWZwcmludGYoZm91dCwgIlxuIik7CisKKwlpbml0aWFsX3NpZF90b19zdHJpbmdfbGVuID0gc2l6ZW9mKGluaXRpYWxfc2lkX3RvX3N0cmluZykgLyBzaXplb2YgKGNoYXIgKik7CisJLyogcHJpbnQgb3V0IHRoZSBzaWRzICovCisJZm9yIChpPTE7IGkgPCBpbml0aWFsX3NpZF90b19zdHJpbmdfbGVuOyBpKyspCisJCWZwcmludGYoZm91dCwgInNpZCAlc1xuIiwgaW5pdGlhbF9zaWRfdG9fc3RyaW5nW2ldKTsKKwlmcHJpbnRmKGZvdXQsICJcbiIpOworCisJLyogcHJpbnQgb3V0IHRoZSBjb21tb25zICovCisJZm9yIChpPTA7IGk8IHNpemVvZihjb21tb24pL3NpemVvZihzdHJ1Y3QgY29tbW9uKTsgaSsrKSB7CisJCWNoYXIgY25hbWVbMTAxXTsKKwkJZmluZF9jb21tb25fbmFtZShjb21tb25baV0uY25hbWUsIGNuYW1lLCAxMDApOworCQljbmFtZVsxMDBdID0gJ1wwJzsKKwkJZnByaW50Zihmb3V0LCAiY29tbW9uICVzXG57XG4iLCBjbmFtZSk7CisJCWZvciAoaj0wOyBjb21tb25baV0ucGVybXNbal07IGorKykKKwkJCWZwcmludGYoZm91dCwgIlx0JXNcbiIsIGNvbW1vbltpXS5wZXJtc1tqXSk7CisJCWZwcmludGYoZm91dCwgIn1cblxuIik7CisJfQorCWZwcmludGYoZm91dCwgIlxuIik7CisKKwkvKiBwcmludCBvdXQgdGhlIGNsYXNzIHBlcm1pc3Npb25zICovCisJZm9yIChpPTE7IGkgPCBjbGFzc2xpc3RfbGVuOyBpKyspIHsKKwkJaWYgKGNsYXNzbGlzdFtpXSkgeworCQkJaW50IGZpcnN0cGVybSA9IC0xLCBudW1wZXJtcyA9IDA7CisKKwkJCWZwcmludGYoZm91dCwgImNsYXNzICVzXG4iLCBjbGFzc2xpc3RbaV0pOworCQkJLyogZG9lcyBpdCBpbmhlcml0IGZyb20gYSBjb21tb24/ICovCisJCQlmb3IgKGo9MDsgaiA8IHNpemVvZihhdl9pbmhlcml0KS9zaXplb2Yoc3RydWN0IGF2X2luaGVyaXQpOyBqKyspCisJCQkJaWYgKGF2X2luaGVyaXRbal0uY2xhc3MgPT0gaSkKKwkJCQkJZnByaW50Zihmb3V0LCAiaW5oZXJpdHMgJXNcbiIsIGF2X2luaGVyaXRbal0uY29tbW9uKTsKKworCQkJZm9yIChqPTA7IGogPCBzaXplb2YoYXZfcGVybXMpL3NpemVvZihzdHJ1Y3QgYXZfcGVybXMpOyBqKyspIHsKKwkJCQlpZiAoYXZfcGVybXNbal0uY2xhc3MgPT0gaSkgeworCQkJCQlpZiAoZmlyc3RwZXJtID09IC0xKQorCQkJCQkJZmlyc3RwZXJtID0gajsKKwkJCQkJbnVtcGVybXMrKzsKKwkJCQl9CisJCQl9CisJCQlpZiAoIW51bXBlcm1zKSB7CisJCQkJZnByaW50Zihmb3V0LCAiXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZnByaW50Zihmb3V0LCAie1xuIik7CisJCQkvKiBwcmludCBvdXQgdGhlIGF2X3Blcm1zICovCisJCQlmb3IgKGo9MDsgaiA8IG51bXBlcm1zOyBqKyspIHsKKwkJCQlmcHJpbnRmKGZvdXQsICJcdCVzXG4iLCBhdl9wZXJtc1tmaXJzdHBlcm0ral0ucGVybV9zKTsKKwkJCX0KKwkJCWZwcmludGYoZm91dCwgIn1cblxuIik7CisJCX0KKwl9CisJZnByaW50Zihmb3V0LCAiXG4iKTsKKworCS8qIE5PVyBQUklOVCBPVVQgTUxTIFNUVUZGICovCisJaWYgKG1scykgeworCQlwcmludGYoIk1MUyBub3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiB0eXBlcywgcm9sZXMsIGFuZCBhbGxvd3MgKi8KKwlmcHJpbnRmKGZvdXQsICJ0eXBlIGJhc2VfdDtcbiIpOworCWZwcmludGYoZm91dCwgInJvbGUgYmFzZV9yIHR5cGVzIHsgYmFzZV90IH07XG4iKTsKKwlmb3IgKGk9MTsgaSA8IGNsYXNzbGlzdF9sZW47IGkrKykgeworCQlpZiAoY2xhc3NsaXN0W2ldKQorCQkJZnByaW50Zihmb3V0LCAiYWxsb3cgYmFzZV90IGJhc2VfdDolcyAqO1xuIiwgY2xhc3NsaXN0W2ldKTsKKwkJZWxzZQorCQkJZnByaW50Zihmb3V0LCAiYWxsb3cgYmFzZV90IGJhc2VfdDp1c2VyJWQgKjtcbiIsIGkpOworCX0KKwlmcHJpbnRmKGZvdXQsICJ1c2VyIHVzZXJfdSByb2xlcyB7IGJhc2VfciB9O1xuIik7CisJZnByaW50Zihmb3V0LCAiXG4iKTsKKworCS8qIGRlZmF1bHQgc2lkcyAqLworCWZvciAoaT0xOyBpIDwgaW5pdGlhbF9zaWRfdG9fc3RyaW5nX2xlbjsgaSsrKQorCQlmcHJpbnRmKGZvdXQsICJzaWQgJXMgdXNlcl91OmJhc2VfcjpiYXNlX3RcbiIsIGluaXRpYWxfc2lkX3RvX3N0cmluZ1tpXSk7CisJZnByaW50Zihmb3V0LCAiXG4iKTsKKworCisJZnByaW50Zihmb3V0LCAiZnNfdXNlX3hhdHRyIGV4dDIgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfeGF0dHIgZXh0MyB1c2VyX3U6YmFzZV9yOmJhc2VfdDtcbiIpOworCWZwcmludGYoZm91dCwgImZzX3VzZV94YXR0ciBqZnMgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfeGF0dHIgeGZzIHVzZXJfdTpiYXNlX3I6YmFzZV90O1xuIik7CisJZnByaW50Zihmb3V0LCAiZnNfdXNlX3hhdHRyIHJlaXNlcmZzIHVzZXJfdTpiYXNlX3I6YmFzZV90O1xuIik7CisKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfdGFzayBwaXBlZnMgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfdGFzayBzb2NrZnMgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKworCWZwcmludGYoZm91dCwgImZzX3VzZV90cmFucyBkZXZwdHMgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfdHJhbnMgdG1wZnMgdXNlcl91OmJhc2VfcjpiYXNlX3Q7XG4iKTsKKwlmcHJpbnRmKGZvdXQsICJmc191c2VfdHJhbnMgc2htIHVzZXJfdTpiYXNlX3I6YmFzZV90O1xuIik7CisKKwlmcHJpbnRmKGZvdXQsICJnZW5mc2NvbiBwcm9jIC8gdXNlcl91OmJhc2VfcjpiYXNlX3RcbiIpOworCisJZmNsb3NlKGZvdXQpOworCisJZm91dCA9IGZvcGVuKGN0eG91dCwgInciKTsKKwlpZiAoIWZvdXQpIHsKKwkJcHJpbnRmKCJXcm90ZSBwb2xpY3ksIGJ1dCBjYW5ub3Qgb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgY3R4b3V0KTsKKwkJdXNhZ2UoYXJndlswXSk7CisJfQorCWZwcmludGYoZm91dCwgIi8gdXNlcl91OmJhc2VfcjpiYXNlX3RcbiIpOworCWZwcmludGYoZm91dCwgIi8uKiB1c2VyX3U6YmFzZV9yOmJhc2VfdFxuIik7CisJZmNsb3NlKGZvdXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9LY29uZmlnIGIvc2VjdXJpdHkvS2NvbmZpZwppbmRleCA1NTkyOTM5Li5kOWY0N2NlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L0tjb25maWcKQEAgLTUxLDYgKzUxLDE0IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCiAKK2NvbmZpZyBTRUNVUklUWUZTCisJYm9vbCAiRW5hYmxlIHRoZSBzZWN1cml0eWZzIGZpbGVzeXN0ZW0iCisJaGVscAorCSAgVGhpcyB3aWxsIGJ1aWxkIHRoZSBzZWN1cml0eWZzIGZpbGVzeXN0ZW0uICBJdCBpcyBjdXJyZW50bHkgdXNlZCBieQorCSAgdGhlIFRQTSBiaW9zIGNoYXJhY3RlciBkcml2ZXIuICBJdCBpcyBub3QgdXNlZCBieSBTRUxpbnV4IG9yIFNNQUNLLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgorCiBjb25maWcgU0VDVVJJVFlfTkVUV09SSwogCWJvb2wgIlNvY2tldCBhbmQgTmV0d29ya2luZyBTZWN1cml0eSBIb29rcyIKIAlkZXBlbmRzIG9uIFNFQ1VSSVRZCmRpZmYgLS1naXQgYS9zZWN1cml0eS9NYWtlZmlsZSBiL3NlY3VyaXR5L01ha2VmaWxlCmluZGV4IGY2NTQyNjAuLmMwNWMxMjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L01ha2VmaWxlCisrKyBiL3NlY3VyaXR5L01ha2VmaWxlCkBAIC0xMCw3ICsxMCw4IEBACiBvYmoteQkJKz0gY29tbW9uY2FwLm8KIAogIyBPYmplY3QgZmlsZSBsaXN0cwotb2JqLSQoQ09ORklHX1NFQ1VSSVRZKQkJCSs9IHNlY3VyaXR5Lm8gY2FwYWJpbGl0eS5vIGlub2RlLm8KK29iai0kKENPTkZJR19TRUNVUklUWSkJCQkrPSBzZWN1cml0eS5vIGNhcGFiaWxpdHkubworb2JqLSQoQ09ORklHX1NFQ1VSSVRZRlMpCQkrPSBpbm9kZS5vCiAjIE11c3QgcHJlY2VkZSBjYXBhYmlsaXR5Lm8gaW4gb3JkZXIgdG8gc3RhY2sgcHJvcGVybHkuCiBvYmotJChDT05GSUdfU0VDVVJJVFlfU0VMSU5VWCkJCSs9IHNlbGludXgvYnVpbHQtaW4ubwogb2JqLSQoQ09ORklHX1NFQ1VSSVRZX1NNQUNLKQkJKz0gc21hY2svYnVpbHQtaW4ubwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvY29tbW9uY2FwLmMgYi9zZWN1cml0eS9jb21tb25jYXAuYwppbmRleCBlNGM0YjNmLi4zOTliZmRiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9jb21tb25jYXAuYworKysgYi9zZWN1cml0eS9jb21tb25jYXAuYwpAQCAtNTQxLDcgKzU0MSw3IEBACiAgKiB5ZXQgd2l0aCBpbmNyZWFzZWQgY2Fwcy4KICAqIFNvIHdlIGNoZWNrIGZvciBpbmNyZWFzZWQgY2FwcyBvbiB0aGUgdGFyZ2V0IHByb2Nlc3MuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNhcF9zYWZlX25pY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIGludCBjYXBfc2FmZV9uaWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlpZiAoIWNhcF9pc3N1YnNldChwLT5jYXBfcGVybWl0dGVkLCBjdXJyZW50LT5jYXBfcGVybWl0dGVkKSAmJgogCSAgICAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW5vZGUuYyBiL3NlY3VyaXR5L2lub2RlLmMKaW5kZXggYWNjNmNmMC4uZWZlYTVhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW5vZGUuYworKysgYi9zZWN1cml0eS9pbm9kZS5jCkBAIC0yMCw4ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KLQotI2RlZmluZSBTRUNVUklUWUZTX01BR0lDCTB4NzM2MzY2NzMKKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICptb3VudDsKIHN0YXRpYyBpbnQgbW91bnRfY291bnQ7CkBAIC0xOTAsNyArMTg5LDcgQEAKICAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCiAgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQogICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCi0gKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1ldGVyIGlzICVOVUxMLCB0aGVuIHRoZQogICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHNlY3VyaXR5ZnMgZmlsZXN5c3RlbS4KICAqIEBkYXRhOiBhIHBvaW50ZXIgdG8gc29tZXRoaW5nIHRoYXQgdGhlIGNhbGxlciB3aWxsIHdhbnQgdG8gZ2V0IHRvIGxhdGVyCiAgKiAgICAgICAgb24uICBUaGUgaW5vZGUuaV9wcml2YXRlIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGlzIHZhbHVlIG9uCkBAIC0xOTksMTggKzE5OCwxOCBAQAogICogICAgICAgIHRoaXMgZmlsZS4KICAqCiAgKiBUaGlzIGlzIHRoZSBiYXNpYyAiY3JlYXRlIGEgZmlsZSIgZnVuY3Rpb24gZm9yIHNlY3VyaXR5ZnMuICBJdCBhbGxvd3MgZm9yIGEKLSAqIHdpZGUgcmFuZ2Ugb2YgZmxleGliaWxpdHkgaW4gY3JlYXRlaW5nIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgKGlmIHlvdQorICogd2lkZSByYW5nZSBvZiBmbGV4aWJpbGl0eSBpbiBjcmVhdGluZyBhIGZpbGUsIG9yIGEgZGlyZWN0b3J5IChpZiB5b3UKICAqIHdhbnQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5LCB0aGUgc2VjdXJpdHlmc19jcmVhdGVfZGlyKCkgZnVuY3Rpb24gaXMKLSAqIHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgaW5zdGVhZC4pCisgKiByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGluc3RlYWQpLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKICAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIHNlY3VyaXR5ZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcwogICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKLSAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZSkuICBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIGlzIHJldHVybmVkLgogICoKLSAqIElmIHNlY3VyaXR5ZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogSWYgc2VjdXJpdHlmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgJS1FTk9ERVYgaXMKICAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgotICogTlVMTCBvciAhTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiAlTlVMTCBvciAhJU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZwogICogY29kZS4KICAqLwogc3RydWN0IGRlbnRyeSAqc2VjdXJpdHlmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKQEAgLTI1MiwxOSArMjUxLDE5IEBACiAgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0bwogICogICAgICAgIGNyZWF0ZS4KICAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQotICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtZXRlciBpcyAlTlVMTCwgdGhlbiB0aGUKICAqICAgICAgICAgIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHNlY3VyaXR5ZnMgZmlsZXN5c3RlbS4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBkaXJlY3RvcnkgaW4gc2VjdXJpdHlmcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGlyZWN0b3J5IGluIHNlY3VyaXR5ZnMgd2l0aCB0aGUgZ2l2ZW4gQG5hbWUuCiAgKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcwogICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgc2VjdXJpdHlmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCiAgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAotICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlKS4gIElmIGFuIGVycm9yIG9jY3VycywgJU5VTEwgd2lsbCBiZSByZXR1cm5lZC4KICAqCi0gKiBJZiBzZWN1cml0eWZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtRU5PREVWIHdpbGwgYmUKKyAqIElmIHNlY3VyaXR5ZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlICUtRU5PREVWIGlzCiAgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKLSAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogJU5VTEwgb3IgISVOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKICAqIGNvZGUuCiAgKi8KIHN0cnVjdCBkZW50cnkgKnNlY3VyaXR5ZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCkBAIC0yNzgsMTYgKzI3NywxNSBAQAogLyoqCiAgKiBzZWN1cml0eWZzX3JlbW92ZSAtIHJlbW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSBmcm9tIHRoZSBzZWN1cml0eWZzIGZpbGVzeXN0ZW0KICAqCi0gKiBAZGVudHJ5OiBhIHBvaW50ZXIgdG8gYSB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBiZQotICogICAgICAgICAgcmVtb3ZlZC4KKyAqIEBkZW50cnk6IGEgcG9pbnRlciB0byBhIHRoZSBkZW50cnkgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlIHJlbW92ZWQuCiAgKgogICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGEgZmlsZSBvciBkaXJlY3RvcnkgaW4gc2VjdXJpdHlmcyB0aGF0IHdhcyBwcmV2aW91c2x5CiAgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGFub3RoZXIgc2VjdXJpdHlmcyBmdW5jdGlvbiAobGlrZQogICogc2VjdXJpdHlmc19jcmVhdGVfZmlsZSgpIG9yIHZhcmlhbnRzIHRoZXJlb2YuKQogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIGluIG9yZGVyIGZvciB0aGUgZmlsZSB0byBiZQotICogcmVtb3ZlZCwgbm8gYXV0b21hdGljIGNsZWFudXAgb2YgZmlsZXMgd2lsbCBoYXBwZW4gd2hlbiBhIG1vZHVsZSBpcwotICogcmVtb3ZlZCwgeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLgorICogcmVtb3ZlZC4gTm8gYXV0b21hdGljIGNsZWFudXAgb2YgZmlsZXMgd2lsbCBoYXBwZW4gd2hlbiBhIG1vZHVsZSBpcworICogcmVtb3ZlZDsgeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLgogICovCiB2b2lkIHNlY3VyaXR5ZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDNhNGI0ZjUuLjI1NWIwODUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtODIsOCArODIsOCBAQAogICoKICAqIFJldHVybiB0cnVlIGlmOgogICoJLVRoZSBwYXNzZWQgTFNNIGlzIHRoZSBvbmUgY2hvc2VuIGJ5IHVzZXIgYXQgYm9vdCB0aW1lLAotICoJLW9yIHVzZXIgZGlkc24ndCBzcGVjaWZ5IGEgc3BlY2lmaWMgTFNNIGFuZCB3ZSdyZSB0aGUgZmlyc3QgdG8gYXNrCi0gKgkgZm9yIHJlZ2lzdGVyYXRpb24gcGVybWlzc29pbiwKKyAqCS1vciB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgc3BlY2lmaWMgTFNNIGFuZCB3ZSdyZSB0aGUgZmlyc3QgdG8gYXNrCisgKgkgZm9yIHJlZ2lzdHJhdGlvbiBwZXJtaXNzaW9uLAogICoJLW9yIHRoZSBwYXNzZWQgTFNNIGlzIGN1cnJlbnRseSBsb2FkZWQuCiAgKiBPdGhlcndpc2UsIHJldHVybiBmYWxzZS4KICAqLwpAQCAtMTAxLDEzICsxMDEsMTMgQEAKICAqIHJlZ2lzdGVyX3NlY3VyaXR5IC0gcmVnaXN0ZXJzIGEgc2VjdXJpdHkgZnJhbWV3b3JrIHdpdGggdGhlIGtlcm5lbAogICogQG9wczogYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3Qgc2VjdXJpdHlfb3B0aW9ucyB0aGF0IGlzIHRvIGJlIHJlZ2lzdGVyZWQKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIGFsbG93IGEgc2VjdXJpdHkgbW9kdWxlIHRvIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZQorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBzZWN1cml0eSBtb2R1bGUgdG8gcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlCiAgKiBrZXJuZWwgc2VjdXJpdHkgc3Vic3lzdGVtLiAgU29tZSBydWRpbWVudGFyeSBjaGVja2luZyBpcyBkb25lIG9uIHRoZSBAb3BzCiAgKiB2YWx1ZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4gWW91J2xsIG5lZWQgdG8gY2hlY2sgZmlyc3QgaWYgeW91ciBMU00KICAqIGlzIGFsbG93ZWQgdG8gcmVnaXN0ZXIgaXRzIEBvcHMgYnkgY2FsbGluZyBzZWN1cml0eV9tb2R1bGVfZW5hYmxlKEBvcHMpLgogICoKICAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBzZWN1cml0eSBtb2R1bGUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBrZXJuZWwsCi0gKiBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KKyAqIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuICBPdGhlcndpc2UgJTAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KICAqLwogaW50IHJlZ2lzdGVyX3NlY3VyaXR5KHN0cnVjdCBzZWN1cml0eV9vcGVyYXRpb25zICpvcHMpCiB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKaW5kZXggYTQzNmQxYy4uMjYzMDFkZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCisrKyBiL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZwpAQCAtNiw5ICs2LDYgQEAKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgTlNBIFNlY3VyaXR5LUVuaGFuY2VkIExpbnV4IChTRUxpbnV4KS4KIAkgIFlvdSB3aWxsIGFsc28gbmVlZCBhIHBvbGljeSBjb25maWd1cmF0aW9uIGFuZCBhIGxhYmVsZWQgZmlsZXN5c3RlbS4KLQkgIFlvdSBjYW4gb2J0YWluIHRoZSBwb2xpY3kgY29tcGlsZXIgKGNoZWNrcG9saWN5KSwgdGhlIHV0aWxpdHkgZm9yCi0JICBsYWJlbGluZyBmaWxlc3lzdGVtcyAoc2V0ZmlsZXMpLCBhbmQgYW4gZXhhbXBsZSBwb2xpY3kgY29uZmlndXJhdGlvbgotCSAgZnJvbSA8aHR0cDovL3d3dy5uc2EuZ292L3NlbGludXgvPi4KIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCiAKIGNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX0JPT1RQQVJBTQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggMTE0YjRiNC4uY2IzMGM3ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC0xMzYsNyArMTM2LDcgQEAKICAqIEB0Y2xhc3M6IHRhcmdldCBzZWN1cml0eSBjbGFzcwogICogQGF2OiBhY2Nlc3MgdmVjdG9yCiAgKi8KLXN0YXRpYyB2b2lkIGF2Y19kdW1wX2F2KHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCB1MTYgdGNsYXNzLCB1MzIgYXYpCit2b2lkIGF2Y19kdW1wX2F2KHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCB1MTYgdGNsYXNzLCB1MzIgYXYpCiB7CiAJY29uc3QgY2hhciAqKmNvbW1vbl9wdHMgPSBOVUxMOwogCXUzMiBjb21tb25fYmFzZSA9IDA7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggMDNmYzZhOC4uNTc2ZTUxMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMjkxLDYgKzI5MSw3IEBACiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAogCXNrLT5za19zZWN1cml0eSA9IE5VTEw7CisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfZnJlZShzc2VjKTsKIAlrZnJlZShzc2VjKTsKIH0KIApAQCAtMzI0LDcgKzMyNSw3IEBACiAJT3B0X3Jvb3Rjb250ZXh0ID0gNCwKIH07CiAKLXN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7T3B0X2NvbnRleHQsIENPTlRFWFRfU1RSICIlcyJ9LAogCXtPcHRfZnNjb250ZXh0LCBGU0NPTlRFWFRfU1RSICIlcyJ9LAogCXtPcHRfZGVmY29udGV4dCwgREVGQ09OVEVYVF9TVFIgIiVzIn0sCkBAIC05NTcsNyArOTU4LDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQgc2VsaW51eF93cml0ZV9vcHRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHNlY3VyaXR5X21udF9vcHRzICpvcHRzKQorc3RhdGljIHZvaWQgc2VsaW51eF93cml0ZV9vcHRzKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCSAgICAgICBzdHJ1Y3Qgc2VjdXJpdHlfbW50X29wdHMgKm9wdHMpCiB7CiAJaW50IGk7CiAJY2hhciAqcHJlZml4OwpAQCAtMTI5MCw3ICsxMjkyLDcgQEAKIAkJLyogRGVmYXVsdCB0byB0aGUgZnMgc3VwZXJibG9jayBTSUQuICovCiAJCWlzZWMtPnNpZCA9IHNic2VjLT5zaWQ7CiAKLQkJaWYgKHNic2VjLT5wcm9jKSB7CisJCWlmIChzYnNlYy0+cHJvYyAmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgewogCQkJc3RydWN0IHByb2NfaW5vZGUgKnByb2NpID0gUFJPQ19JKGlub2RlKTsKIAkJCWlmIChwcm9jaS0+cGRlKSB7CiAJCQkJaXNlYy0+c2NsYXNzID0gaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhpbm9kZS0+aV9tb2RlKTsKQEAgLTIxMjAsNyArMjEyMiw2IEBACiAJbG9uZyBqID0gLTE7CiAJaW50IGRyb3BfdHR5ID0gMDsKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CiAJaWYgKHR0eSkgewogCQlmaWxlX2xpc3RfbG9jaygpOwpAQCAtMjEzOCw4ICsyMTM5LDggQEAKIAkJCX0KIAkJfQogCQlmaWxlX2xpc3RfdW5sb2NrKCk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOwogCX0KLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJLyogUmVzZXQgY29udHJvbGxpbmcgdHR5LiAqLwogCWlmIChkcm9wX3R0eSkKIAkJbm9fdHR5KCk7CkBAIC0zNTQ4LDM4ICszNTQ5LDQ0IEBACiAjZW5kaWYgLyogSVBWNiAqLwogCiBzdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsCi0JCQkgICAgIGNoYXIgKiphZGRycCwgaW50IHNyYywgdTggKnByb3RvKQorCQkJICAgICBjaGFyICoqX2FkZHJwLCBpbnQgc3JjLCB1OCAqcHJvdG8pCiB7Ci0JaW50IHJldCA9IDA7CisJY2hhciAqYWRkcnA7CisJaW50IHJldDsKIAogCXN3aXRjaCAoYWQtPnUubmV0LmZhbWlseSkgewogCWNhc2UgUEZfSU5FVDoKIAkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2NChza2IsIGFkLCBwcm90byk7Ci0JCWlmIChyZXQgfHwgIWFkZHJwKQotCQkJYnJlYWs7Ci0JCSphZGRycCA9IChjaGFyICopKHNyYyA/ICZhZC0+dS5uZXQudjRpbmZvLnNhZGRyIDoKLQkJCQkJJmFkLT51Lm5ldC52NGluZm8uZGFkZHIpOwotCQlicmVhazsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCWFkZHJwID0gKGNoYXIgKikoc3JjID8gJmFkLT51Lm5ldC52NGluZm8uc2FkZHIgOgorCQkJCSAgICAgICAmYWQtPnUubmV0LnY0aW5mby5kYWRkcik7CisJCWdvdG8gb2theTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCWNhc2UgUEZfSU5FVDY6CiAJCXJldCA9IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc2tiLCBhZCwgcHJvdG8pOwotCQlpZiAocmV0IHx8ICFhZGRycCkKLQkJCWJyZWFrOwotCQkqYWRkcnAgPSAoY2hhciAqKShzcmMgPyAmYWQtPnUubmV0LnY2aW5mby5zYWRkciA6Ci0JCQkJCSZhZC0+dS5uZXQudjZpbmZvLmRhZGRyKTsKLQkJYnJlYWs7CisJCWlmIChyZXQpCisJCQlnb3RvIHBhcnNlX2Vycm9yOworCQlhZGRycCA9IChjaGFyICopKHNyYyA/ICZhZC0+dS5uZXQudjZpbmZvLnNhZGRyIDoKKwkJCQkgICAgICAgJmFkLT51Lm5ldC52NmluZm8uZGFkZHIpOworCQlnb3RvIG9rYXk7CiAjZW5kaWYJLyogSVBWNiAqLwogCWRlZmF1bHQ6Ci0JCWJyZWFrOworCQlhZGRycCA9IE5VTEw7CisJCWdvdG8gb2theTsKIAl9CiAKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlNFTGludXg6IGZhaWx1cmUgaW4gc2VsaW51eF9wYXJzZV9za2IoKSwiCi0JCSAgICAgICAiIHVuYWJsZSB0byBwYXJzZSBwYWNrZXRcbiIpOwotCitwYXJzZV9lcnJvcjoKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJTRUxpbnV4OiBmYWlsdXJlIGluIHNlbGludXhfcGFyc2Vfc2tiKCksIgorCSAgICAgICAiIHVuYWJsZSB0byBwYXJzZSBwYWNrZXRcbiIpOwogCXJldHVybiByZXQ7CisKK29rYXk6CisJaWYgKF9hZGRycCkKKwkJKl9hZGRycCA9IGFkZHJwOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTM3OTQsNiArMzgwMSw3IEBACiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsIGludCBhZGRybGVuKQogeworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWM7CiAJaW50IGVycjsKIApAQCAtMzgwNyw3ICszODE1LDYgQEAKIAlpc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKIAlpZiAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1RDUF9TT0NLRVQgfHwKIAkgICAgaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX0RDQ1BfU09DS0VUKSB7Ci0JCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSBOVUxMOwogCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IE5VTEw7CkBAIC0zODQxLDYgKzM4NDgsOCBAQAogCQkJZ290byBvdXQ7CiAJfQogCisJZXJyID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X2Nvbm5lY3Qoc2ssIGFkZHJlc3MpOworCiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTQwNzAsMjAgKzQwNzksMjggQEAKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tfcmN2X3NrYl9jb21wYXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICBzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkLAotCQkJCSAgICAgICB1MTYgZmFtaWx5LCBjaGFyICphZGRycCkKKwkJCQkgICAgICAgdTE2IGZhbWlseSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OwogCXUzMiBwZWVyX3NpZDsKIAl1MzIgc2tfc2lkID0gc2tzZWMtPnNpZDsKKwlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CisJY2hhciAqYWRkcnA7CisKKwlBVkNfQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKKwlhZC51Lm5ldC5uZXRpZiA9IHNrYi0+aWlmOworCWFkLnUubmV0LmZhbWlseSA9IGZhbWlseTsKKwllcnIgPSBzZWxpbnV4X3BhcnNlX3NrYihza2IsICZhZCwgJmFkZHJwLCAxLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNlbGludXhfY29tcGF0X25ldCkKLQkJZXJyID0gc2VsaW51eF9zb2NrX3Jjdl9za2JfaXB0YWJsZXNfY29tcGF0KHNrLCBza2IsIGFkLAorCQllcnIgPSBzZWxpbnV4X3NvY2tfcmN2X3NrYl9pcHRhYmxlc19jb21wYXQoc2ssIHNrYiwgJmFkLAogCQkJCQkJCSAgIGZhbWlseSwgYWRkcnApOwogCWVsc2UKIAkJZXJyID0gYXZjX2hhc19wZXJtKHNrX3NpZCwgc2tiLT5zZWNtYXJrLCBTRUNDTEFTU19QQUNLRVQsCi0JCQkJICAgUEFDS0VUX19SRUNWLCBhZCk7CisJCQkJICAgUEFDS0VUX19SRUNWLCAmYWQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTQwOTIsMTIgKzQxMDksMTQgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJCWVyciA9IGF2Y19oYXNfcGVybShza19zaWQsIHBlZXJfc2lkLAotCQkJCSAgIFNFQ0NMQVNTX1BFRVIsIFBFRVJfX1JFQ1YsIGFkKTsKKwkJCQkgICBTRUNDTEFTU19QRUVSLCBQRUVSX19SRUNWLCAmYWQpOworCQlpZiAoZXJyKQorCQkJc2VsaW51eF9uZXRsYmxfZXJyKHNrYiwgZXJyLCAwKTsKIAl9IGVsc2UgewotCQllcnIgPSBzZWxpbnV4X25ldGxibF9zb2NrX3Jjdl9za2Ioc2tzZWMsIHNrYiwgZmFtaWx5LCBhZCk7CisJCWVyciA9IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihza3NlYywgc2tiLCBmYW1pbHksICZhZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSBzZWxpbnV4X3hmcm1fc29ja19yY3Zfc2tiKHNrc2VjLT5zaWQsIHNrYiwgYWQpOworCQllcnIgPSBzZWxpbnV4X3hmcm1fc29ja19yY3Zfc2tiKHNrc2VjLT5zaWQsIHNrYiwgJmFkKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtNDExMSw2ICs0MTMwLDggQEAKIAl1MzIgc2tfc2lkID0gc2tzZWMtPnNpZDsKIAlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAJY2hhciAqYWRkcnA7CisJdTggc2VjbWFya19hY3RpdmU7CisJdTggcGVlcmxibF9hY3RpdmU7CiAKIAlpZiAoZmFtaWx5ICE9IFBGX0lORVQgJiYgZmFtaWx5ICE9IFBGX0lORVQ2KQogCQlyZXR1cm4gMDsKQEAgLTQxMTksNiArNDE0MCwxOCBAQAogCWlmIChmYW1pbHkgPT0gUEZfSU5FVDYgJiYgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCWZhbWlseSA9IFBGX0lORVQ7CiAKKwkvKiBJZiBhbnkgc29ydCBvZiBjb21wYXRpYmlsaXR5IG1vZGUgaXMgZW5hYmxlZCB0aGVuIGhhbmRvZmYgcHJvY2Vzc2luZworCSAqIHRvIHRoZSBzZWxpbnV4X3NvY2tfcmN2X3NrYl9jb21wYXQoKSBmdW5jdGlvbiB0byBkZWFsIHdpdGggdGhlCisJICogc3BlY2lhbCBoYW5kbGluZy4gIFdlIGRvIHRoaXMgaW4gYW4gYXR0ZW1wdCB0byBrZWVwIHRoaXMgZnVuY3Rpb24KKwkgKiBhcyBmYXN0IGFuZCBhcyBjbGVhbiBhcyBwb3NzaWJsZS4gKi8KKwlpZiAoc2VsaW51eF9jb21wYXRfbmV0IHx8ICFzZWxpbnV4X3BvbGljeWNhcF9uZXRwZWVyKQorCQlyZXR1cm4gc2VsaW51eF9zb2NrX3Jjdl9za2JfY29tcGF0KHNrLCBza2IsIGZhbWlseSk7CisKKwlzZWNtYXJrX2FjdGl2ZSA9IHNlbGludXhfc2VjbWFya19lbmFibGVkKCk7CisJcGVlcmxibF9hY3RpdmUgPSBuZXRsYmxfZW5hYmxlZCgpIHx8IHNlbGludXhfeGZybV9lbmFibGVkKCk7CisJaWYgKCFzZWNtYXJrX2FjdGl2ZSAmJiAhcGVlcmxibF9hY3RpdmUpCisJCXJldHVybiAwOworCiAJQVZDX0FVRElUX0RBVEFfSU5JVCgmYWQsIE5FVCk7CiAJYWQudS5uZXQubmV0aWYgPSBza2ItPmlpZjsKIAlhZC51Lm5ldC5mYW1pbHkgPSBmYW1pbHk7CkBAIC00MTI2LDE1ICs0MTU5LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JLyogSWYgYW55IHNvcnQgb2YgY29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgdGhlbiBoYW5kb2ZmIHByb2Nlc3NpbmcKLQkgKiB0byB0aGUgc2VsaW51eF9zb2NrX3Jjdl9za2JfY29tcGF0KCkgZnVuY3Rpb24gdG8gZGVhbCB3aXRoIHRoZQotCSAqIHNwZWNpYWwgaGFuZGxpbmcuICBXZSBkbyB0aGlzIGluIGFuIGF0dGVtcHQgdG8ga2VlcCB0aGlzIGZ1bmN0aW9uCi0JICogYXMgZmFzdCBhbmQgYXMgY2xlYW4gYXMgcG9zc2libGUuICovCi0JaWYgKHNlbGludXhfY29tcGF0X25ldCB8fCAhc2VsaW51eF9wb2xpY3ljYXBfbmV0cGVlcikKLQkJcmV0dXJuIHNlbGludXhfc29ja19yY3Zfc2tiX2NvbXBhdChzaywgc2tiLCAmYWQsCi0JCQkJCQkgICBmYW1pbHksIGFkZHJwKTsKLQotCWlmIChuZXRsYmxfZW5hYmxlZCgpIHx8IHNlbGludXhfeGZybV9lbmFibGVkKCkpIHsKKwlpZiAocGVlcmxibF9hY3RpdmUpIHsKIAkJdTMyIHBlZXJfc2lkOwogCiAJCWVyciA9IHNlbGludXhfc2tiX3BlZXJsYmxfc2lkKHNrYiwgZmFtaWx5LCAmcGVlcl9zaWQpOwpAQCAtNDE0MiwxMyArNDE2NywxNyBAQAogCQkJcmV0dXJuIGVycjsKIAkJZXJyID0gc2VsaW51eF9pbmV0X3N5c19yY3Zfc2tiKHNrYi0+aWlmLCBhZGRycCwgZmFtaWx5LAogCQkJCQkgICAgICAgcGVlcl9zaWQsICZhZCk7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCXNlbGludXhfbmV0bGJsX2Vycihza2IsIGVyciwgMCk7CiAJCQlyZXR1cm4gZXJyOworCQl9CiAJCWVyciA9IGF2Y19oYXNfcGVybShza19zaWQsIHBlZXJfc2lkLCBTRUNDTEFTU19QRUVSLAogCQkJCSAgIFBFRVJfX1JFQ1YsICZhZCk7CisJCWlmIChlcnIpCisJCQlzZWxpbnV4X25ldGxibF9lcnIoc2tiLCBlcnIsIDApOwogCX0KIAotCWlmIChzZWxpbnV4X3NlY21hcmtfZW5hYmxlZCgpKSB7CisJaWYgKHNlY21hcmtfYWN0aXZlKSB7CiAJCWVyciA9IGF2Y19oYXNfcGVybShza19zaWQsIHNrYi0+c2VjbWFyaywgU0VDQ0xBU1NfUEFDS0VULAogCQkJCSAgIFBBQ0tFVF9fUkVDViwgJmFkKTsKIAkJaWYgKGVycikKQEAgLTQyMDcsMTAgKzQyMzYsMTIgQEAKIAl1MzIgcGVlcl9zZWNpZCA9IFNFQ1NJRF9OVUxMOwogCXUxNiBmYW1pbHk7CiAKLQlpZiAoc29jaykKKwlpZiAoc2tiICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlmYW1pbHkgPSBQRl9JTkVUOworCWVsc2UgaWYgKHNrYiAmJiBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQlmYW1pbHkgPSBQRl9JTkVUNjsKKwllbHNlIGlmIChzb2NrKQogCQlmYW1pbHkgPSBzb2NrLT5zay0+c2tfZmFtaWx5OwotCWVsc2UgaWYgKHNrYiAmJiBza2ItPnNrKQotCQlmYW1pbHkgPSBza2ItPnNrLT5za19mYW1pbHk7CiAJZWxzZQogCQlnb3RvIG91dDsKIApAQCAtNDI2OCw4ICs0Mjk5LDYgQEAKIAkgICAgc2stPnNrX2ZhbWlseSA9PSBQRl9VTklYKQogCQlpc2VjLT5zaWQgPSBza3NlYy0+c2lkOwogCXNrc2VjLT5zY2xhc3MgPSBpc2VjLT5zY2xhc3M7Ci0KLQlzZWxpbnV4X25ldGxibF9zb2NrX2dyYWZ0KHNrLCBwYXJlbnQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfaW5ldF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNDI3NywxMCArNDMwNiwxNSBAQAogewogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OwogCWludCBlcnI7CisJdTE2IGZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAJdTMyIG5ld3NpZDsKIAl1MzIgcGVlcnNpZDsKIAotCWVyciA9IHNlbGludXhfc2tiX3BlZXJsYmxfc2lkKHNrYiwgc2stPnNrX2ZhbWlseSwgJnBlZXJzaWQpOworCS8qIGhhbmRsZSBtYXBwZWQgSVB2NCBwYWNrZXRzIGFycml2aW5nIHZpYSBJUHY2IHNvY2tldHMgKi8KKwlpZiAoZmFtaWx5ID09IFBGX0lORVQ2ICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlmYW1pbHkgPSBQRl9JTkVUOworCisJZXJyID0gc2VsaW51eF9za2JfcGVlcmxibF9zaWQoc2tiLCBmYW1pbHksICZwZWVyc2lkKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWlmIChwZWVyc2lkID09IFNFQ1NJRF9OVUxMKSB7CkBAIC00MzE1LDEyICs0MzQ5LDE4IEBACiAJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQobmV3c2tzZWMsIHJlcS0+cnNrX29wcy0+ZmFtaWx5KTsKIH0KIAotc3RhdGljIHZvaWQgc2VsaW51eF9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLAotCQkJCXN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBzZWxpbnV4X2luZXRfY29ubl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJdTE2IGZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CiAKLQlzZWxpbnV4X3NrYl9wZWVybGJsX3NpZChza2IsIHNrLT5za19mYW1pbHksICZza3NlYy0+cGVlcl9zaWQpOworCS8qIGhhbmRsZSBtYXBwZWQgSVB2NCBwYWNrZXRzIGFycml2aW5nIHZpYSBJUHY2IHNvY2tldHMgKi8KKwlpZiAoZmFtaWx5ID09IFBGX0lORVQ2ICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlmYW1pbHkgPSBQRl9JTkVUOworCisJc2VsaW51eF9za2JfcGVlcmxibF9zaWQoc2tiLCBmYW1pbHksICZza3NlYy0+cGVlcl9zaWQpOworCisJc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX2VzdGFibGlzaGVkKHNrLCBmYW1pbHkpOwogfQogCiBzdGF0aWMgdm9pZCBzZWxpbnV4X3JlcV9jbGFzc2lmeV9mbG93KGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKQEAgLTQzNzAsMzkgKzQ0MTAsNTQgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcF9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IsIGludCBpZmluZGV4LAogCQkJCSAgICAgICB1MTYgZmFtaWx5KQogeworCWludCBlcnI7CiAJY2hhciAqYWRkcnA7CiAJdTMyIHBlZXJfc2lkOwogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAl1OCBzZWNtYXJrX2FjdGl2ZTsKKwl1OCBuZXRsYmxfYWN0aXZlOwogCXU4IHBlZXJsYmxfYWN0aXZlOwogCiAJaWYgKCFzZWxpbnV4X3BvbGljeWNhcF9uZXRwZWVyKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJc2VjbWFya19hY3RpdmUgPSBzZWxpbnV4X3NlY21hcmtfZW5hYmxlZCgpOwotCXBlZXJsYmxfYWN0aXZlID0gbmV0bGJsX2VuYWJsZWQoKSB8fCBzZWxpbnV4X3hmcm1fZW5hYmxlZCgpOworCW5ldGxibF9hY3RpdmUgPSBuZXRsYmxfZW5hYmxlZCgpOworCXBlZXJsYmxfYWN0aXZlID0gbmV0bGJsX2FjdGl2ZSB8fCBzZWxpbnV4X3hmcm1fZW5hYmxlZCgpOwogCWlmICghc2VjbWFya19hY3RpdmUgJiYgIXBlZXJsYmxfYWN0aXZlKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCisJaWYgKHNlbGludXhfc2tiX3BlZXJsYmxfc2lkKHNrYiwgZmFtaWx5LCAmcGVlcl9zaWQpICE9IDApCisJCXJldHVybiBORl9EUk9QOworCiAJQVZDX0FVRElUX0RBVEFfSU5JVCgmYWQsIE5FVCk7CiAJYWQudS5uZXQubmV0aWYgPSBpZmluZGV4OwogCWFkLnUubmV0LmZhbWlseSA9IGZhbWlseTsKIAlpZiAoc2VsaW51eF9wYXJzZV9za2Ioc2tiLCAmYWQsICZhZGRycCwgMSwgTlVMTCkgIT0gMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlpZiAoc2VsaW51eF9za2JfcGVlcmxibF9zaWQoc2tiLCBmYW1pbHksICZwZWVyX3NpZCkgIT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlpZiAocGVlcmxibF9hY3RpdmUpCi0JCWlmIChzZWxpbnV4X2luZXRfc3lzX3Jjdl9za2IoaWZpbmRleCwgYWRkcnAsIGZhbWlseSwKLQkJCQkJICAgICBwZWVyX3NpZCwgJmFkKSAhPSAwKQorCWlmIChwZWVybGJsX2FjdGl2ZSkgeworCQllcnIgPSBzZWxpbnV4X2luZXRfc3lzX3Jjdl9za2IoaWZpbmRleCwgYWRkcnAsIGZhbWlseSwKKwkJCQkJICAgICAgIHBlZXJfc2lkLCAmYWQpOworCQlpZiAoZXJyKSB7CisJCQlzZWxpbnV4X25ldGxibF9lcnIoc2tiLCBlcnIsIDEpOwogCQkJcmV0dXJuIE5GX0RST1A7CisJCX0KKwl9CiAKIAlpZiAoc2VjbWFya19hY3RpdmUpCiAJCWlmIChhdmNfaGFzX3Blcm0ocGVlcl9zaWQsIHNrYi0+c2VjbWFyaywKIAkJCQkgU0VDQ0xBU1NfUEFDS0VULCBQQUNLRVRfX0ZPUldBUkRfSU4sICZhZCkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAorCWlmIChuZXRsYmxfYWN0aXZlKQorCQkvKiB3ZSBkbyB0aGlzIGluIHRoZSBGT1JXQVJEIHBhdGggYW5kIG5vdCB0aGUgUE9TVF9ST1VUSU5HCisJCSAqIHBhdGggYmVjYXVzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcHBseSB0aGUgbmVjZXNzYXJ5CisJCSAqIGxhYmVsaW5nIGJlZm9yZSBJUHNlYyBpcyBhcHBsaWVkIHNvIHdlIGNhbiBsZXZlcmFnZSBBSAorCQkgKiBwcm90ZWN0aW9uICovCisJCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfc2V0c2lkKHNrYiwgZmFtaWx5LCBwZWVyX3NpZCkgIT0gMCkKKwkJCXJldHVybiBORl9EUk9QOworCiAJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KIApAQCAtNDQyNiw2ICs0NDgxLDM3IEBACiB9CiAjZW5kaWYJLyogSVBWNiAqLwogCitzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXBfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgdTE2IGZhbWlseSkKK3sKKwl1MzIgc2lkOworCisJaWYgKCFuZXRsYmxfZW5hYmxlZCgpKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJLyogd2UgZG8gdGhpcyBpbiB0aGUgTE9DQUxfT1VUIHBhdGggYW5kIG5vdCB0aGUgUE9TVF9ST1VUSU5HIHBhdGgKKwkgKiBiZWNhdXNlIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGFwcGx5IHRoZSBuZWNlc3NhcnkgbGFiZWxpbmcKKwkgKiBiZWZvcmUgSVBzZWMgaXMgYXBwbGllZCBzbyB3ZSBjYW4gbGV2ZXJhZ2UgQUggcHJvdGVjdGlvbiAqLworCWlmIChza2ItPnNrKSB7CisJCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2tiLT5zay0+c2tfc2VjdXJpdHk7CisJCXNpZCA9IHNrc2VjLT5zaWQ7CisJfSBlbHNlCisJCXNpZCA9IFNFQ0lOSVRTSURfS0VSTkVMOworCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfc2V0c2lkKHNrYiwgZmFtaWx5LCBzaWQpICE9IDApCisJCXJldHVybiBORl9EUk9QOworCisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzZWxpbnV4X2lwdjRfb3V0cHV0KHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQoreworCXJldHVybiBzZWxpbnV4X2lwX291dHB1dChza2IsIFBGX0lORVQpOworfQorCiBzdGF0aWMgaW50IHNlbGludXhfaXBfcG9zdHJvdXRlX2lwdGFibGVzX2NvbXBhdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCQlpbnQgaWZpbmRleCwKIAkJCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsCkBAIC00NDkzLDMwICs0NTc5LDM2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcF9wb3N0cm91dGVfY29tcGF0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQlpbnQgaWZpbmRleCwKLQkJCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsCi0JCQkJCQl1MTYgZmFtaWx5LAotCQkJCQkJY2hhciAqYWRkcnAsCi0JCQkJCQl1OCBwcm90bykKKwkJCQkJCXUxNiBmYW1pbHkpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYzsKKwlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CisJY2hhciAqYWRkcnA7CisJdTggcHJvdG87CiAKIAlpZiAoc2sgPT0gTlVMTCkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAlza3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAorCUFWQ19BVURJVF9EQVRBX0lOSVQoJmFkLCBORVQpOworCWFkLnUubmV0Lm5ldGlmID0gaWZpbmRleDsKKwlhZC51Lm5ldC5mYW1pbHkgPSBmYW1pbHk7CisJaWYgKHNlbGludXhfcGFyc2Vfc2tiKHNrYiwgJmFkLCAmYWRkcnAsIDAsICZwcm90bykpCisJCXJldHVybiBORl9EUk9QOworCiAJaWYgKHNlbGludXhfY29tcGF0X25ldCkgewogCQlpZiAoc2VsaW51eF9pcF9wb3N0cm91dGVfaXB0YWJsZXNfY29tcGF0KHNrYi0+c2ssIGlmaW5kZXgsCi0JCQkJCQkJIGFkLCBmYW1pbHksIGFkZHJwKSkKKwkJCQkJCQkgJmFkLCBmYW1pbHksIGFkZHJwKSkKIAkJCXJldHVybiBORl9EUk9QOwogCX0gZWxzZSB7CiAJCWlmIChhdmNfaGFzX3Blcm0oc2tzZWMtPnNpZCwgc2tiLT5zZWNtYXJrLAotCQkJCSBTRUNDTEFTU19QQUNLRVQsIFBBQ0tFVF9fU0VORCwgYWQpKQorCQkJCSBTRUNDTEFTU19QQUNLRVQsIFBBQ0tFVF9fU0VORCwgJmFkKSkKIAkJCXJldHVybiBORl9EUk9QOwogCX0KIAogCWlmIChzZWxpbnV4X3BvbGljeWNhcF9uZXRwZWVyKQotCQlpZiAoc2VsaW51eF94ZnJtX3Bvc3Ryb3V0ZV9sYXN0KHNrc2VjLT5zaWQsIHNrYiwgYWQsIHByb3RvKSkKKwkJaWYgKHNlbGludXhfeGZybV9wb3N0cm91dGVfbGFzdChza3NlYy0+c2lkLCBza2IsICZhZCwgcHJvdG8pKQogCQkJcmV0dXJuIE5GX0RST1A7CiAKIAlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtNDUzMCwyMyArNDYyMiwxNSBAQAogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAJY2hhciAqYWRkcnA7Ci0JdTggcHJvdG87CiAJdTggc2VjbWFya19hY3RpdmU7CiAJdTggcGVlcmxibF9hY3RpdmU7CiAKLQlBVkNfQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKLQlhZC51Lm5ldC5uZXRpZiA9IGlmaW5kZXg7Ci0JYWQudS5uZXQuZmFtaWx5ID0gZmFtaWx5OwotCWlmIChzZWxpbnV4X3BhcnNlX3NrYihza2IsICZhZCwgJmFkZHJwLCAwLCAmcHJvdG8pKQotCQlyZXR1cm4gTkZfRFJPUDsKLQogCS8qIElmIGFueSBzb3J0IG9mIGNvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHRoZW4gaGFuZG9mZiBwcm9jZXNzaW5nCiAJICogdG8gdGhlIHNlbGludXhfaXBfcG9zdHJvdXRlX2NvbXBhdCgpIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCB0aGUKIAkgKiBzcGVjaWFsIGhhbmRsaW5nLiAgV2UgZG8gdGhpcyBpbiBhbiBhdHRlbXB0IHRvIGtlZXAgdGhpcyBmdW5jdGlvbgogCSAqIGFzIGZhc3QgYW5kIGFzIGNsZWFuIGFzIHBvc3NpYmxlLiAqLwogCWlmIChzZWxpbnV4X2NvbXBhdF9uZXQgfHwgIXNlbGludXhfcG9saWN5Y2FwX25ldHBlZXIpCi0JCXJldHVybiBzZWxpbnV4X2lwX3Bvc3Ryb3V0ZV9jb21wYXQoc2tiLCBpZmluZGV4LCAmYWQsCi0JCQkJCQkgICBmYW1pbHksIGFkZHJwLCBwcm90byk7CisJCXJldHVybiBzZWxpbnV4X2lwX3Bvc3Ryb3V0ZV9jb21wYXQoc2tiLCBpZmluZGV4LCBmYW1pbHkpOwogCiAJLyogSWYgc2tiLT5kc3QtPnhmcm0gaXMgbm9uLU5VTEwgdGhlbiB0aGUgcGFja2V0IGlzIHVuZGVyZ29pbmcgYW4gSVBzZWMKIAkgKiBwYWNrZXQgdHJhbnNmb3JtYXRpb24gc28gYWxsb3cgdGhlIHBhY2tldCB0byBwYXNzIHdpdGhvdXQgYW55IGNoZWNrcwpAQCAtNDU2MiwyMSArNDY0Niw0NSBAQAogCWlmICghc2VjbWFya19hY3RpdmUgJiYgIXBlZXJsYmxfYWN0aXZlKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JLyogaWYgdGhlIHBhY2tldCBpcyBsb2NhbGx5IGdlbmVyYXRlZCAoc2tiLT5zayAhPSBOVUxMKSB0aGVuIHVzZSB0aGUKLQkgKiBzb2NrZXQncyBsYWJlbCBhcyB0aGUgcGVlciBsYWJlbCwgb3RoZXJ3aXNlIHRoZSBwYWNrZXQgaXMgYmVpbmcKLQkgKiBmb3J3YXJkZWQgdGhyb3VnaCB0aGlzIHN5c3RlbSBhbmQgd2UgbmVlZCB0byBmZXRjaCB0aGUgcGVlciBsYWJlbAotCSAqIGRpcmVjdGx5IGZyb20gdGhlIHBhY2tldCAqLworCS8qIGlmIHRoZSBwYWNrZXQgaXMgYmVpbmcgZm9yd2FyZGVkIHRoZW4gZ2V0IHRoZSBwZWVyIGxhYmVsIGZyb20gdGhlCisJICogcGFja2V0IGl0c2VsZjsgb3RoZXJ3aXNlIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBmcm9tIGEgbG9jYWwKKwkgKiBhcHBsaWNhdGlvbiBvciB0aGUga2VybmVsLCBpZiBmcm9tIGFuIGFwcGxpY2F0aW9uIGdldCB0aGUgcGVlciBsYWJlbAorCSAqIGZyb20gdGhlIHNlbmRpbmcgc29ja2V0LCBvdGhlcndpc2UgdXNlIHRoZSBrZXJuZWwncyBzaWQgKi8KIAlzayA9IHNrYi0+c2s7Ci0JaWYgKHNrKSB7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBQRl9JTkVUOgorCQkJaWYgKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9GT1JXQVJERUQpCisJCQkJc2VjbWFya19wZXJtID0gUEFDS0VUX19GT1JXQVJEX09VVDsKKwkJCWVsc2UKKwkJCQlzZWNtYXJrX3Blcm0gPSBQQUNLRVRfX1NFTkQ7CisJCQlicmVhazsKKwkJY2FzZSBQRl9JTkVUNjoKKwkJCWlmIChJUDZDQihza2IpLT5mbGFncyAmIElQNlNLQl9GT1JXQVJERUQpCisJCQkJc2VjbWFya19wZXJtID0gUEFDS0VUX19GT1JXQVJEX09VVDsKKwkJCWVsc2UKKwkJCQlzZWNtYXJrX3Blcm0gPSBQQUNLRVRfX1NFTkQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBORl9EUk9QOworCQl9CisJCWlmIChzZWNtYXJrX3Blcm0gPT0gUEFDS0VUX19GT1JXQVJEX09VVCkgeworCQkJaWYgKHNlbGludXhfc2tiX3BlZXJsYmxfc2lkKHNrYiwgZmFtaWx5LCAmcGVlcl9zaWQpKQorCQkJCXJldHVybiBORl9EUk9QOworCQl9IGVsc2UKKwkJCXBlZXJfc2lkID0gU0VDSU5JVFNJRF9LRVJORUw7CisJfSBlbHNlIHsKIAkJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CiAJCXBlZXJfc2lkID0gc2tzZWMtPnNpZDsKIAkJc2VjbWFya19wZXJtID0gUEFDS0VUX19TRU5EOwotCX0gZWxzZSB7Ci0JCWlmIChzZWxpbnV4X3NrYl9wZWVybGJsX3NpZChza2IsIGZhbWlseSwgJnBlZXJfc2lkKSkKLQkJCQlyZXR1cm4gTkZfRFJPUDsKLQkJc2VjbWFya19wZXJtID0gUEFDS0VUX19GT1JXQVJEX09VVDsKIAl9CiAKKwlBVkNfQVVESVRfREFUQV9JTklUKCZhZCwgTkVUKTsKKwlhZC51Lm5ldC5uZXRpZiA9IGlmaW5kZXg7CisJYWQudS5uZXQuZmFtaWx5ID0gZmFtaWx5OworCWlmIChzZWxpbnV4X3BhcnNlX3NrYihza2IsICZhZCwgJmFkZHJwLCAwLCBOVUxMKSkKKwkJcmV0dXJuIE5GX0RST1A7CisKIAlpZiAoc2VjbWFya19hY3RpdmUpCiAJCWlmIChhdmNfaGFzX3Blcm0ocGVlcl9zaWQsIHNrYi0+c2VjbWFyaywKIAkJCQkgU0VDQ0xBU1NfUEFDS0VULCBzZWNtYXJrX3Blcm0sICZhZCkpCkBAIC01MjE5LDggKzUzMjcsMTIgQEAKIAogCQlpZiAoc2lkID09IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKiBPbmx5IGFsbG93IHNpbmdsZSB0aHJlYWRlZCBwcm9jZXNzZXMgdG8gY2hhbmdlIGNvbnRleHQgKi8KKwkJLyoKKwkJICogU0VMaW51eCBhbGxvd3MgdG8gY2hhbmdlIGNvbnRleHQgaW4gdGhlIGZvbGxvd2luZyBjYXNlIG9ubHkuCisJCSAqICAtIFNpbmdsZSB0aHJlYWRlZCBwcm9jZXNzZXMuCisJCSAqICAtIE11bHRpIHRocmVhZGVkIHByb2Nlc3NlcyBpbnRlbmQgdG8gY2hhbmdlIGl0cyBjb250ZXh0IGludG8KKwkJICogICAgbW9yZSByZXN0cmljdGVkIGRvbWFpbiAoZGVmaW5lZCBieSBUWVBFQk9VTkRTIHN0YXRlbWVudCkuCisJCSAqLwogCQlpZiAoYXRvbWljX3JlYWQoJnAtPm1tLT5tbV91c2VycykgIT0gMSkgewogCQkJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqdDsKIAkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gcC0+bW07CkBAIC01MjI4LDExICs1MzQwLDE2IEBACiAJCQlkb19lYWNoX3RocmVhZChnLCB0KSB7CiAJCQkJaWYgKHQtPm1tID09IG1tICYmIHQgIT0gcCkgewogCQkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCQkJCXJldHVybiAtRVBFUk07CisJCQkJCWVycm9yID0gc2VjdXJpdHlfYm91bmRlZF90cmFuc2l0aW9uKHRzZWMtPnNpZCwgc2lkKTsKKwkJCQkJaWYgKCFlcnJvcikKKwkJCQkJCWdvdG8gYm91bmRhcnlfb2s7CisKKwkJCQkJcmV0dXJuIGVycm9yOwogCQkJCX0KIAkJCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgdCk7CiAJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJCX0KK2JvdW5kYXJ5X29rOgogCiAJCS8qIENoZWNrIHBlcm1pc3Npb25zIGZvciB0aGUgdHJhbnNpdGlvbi4gKi8KIAkJZXJyb3IgPSBhdmNfaGFzX3Blcm0odHNlYy0+c2lkLCBzaWQsIFNFQ0NMQVNTX1BST0NFU1MsCkBAIC01NjQxLDYgKzU3NTgsMTMgQEAKIAkJLnBmID0JCVBGX0lORVQsCiAJCS5ob29rbnVtID0JTkZfSU5FVF9GT1JXQVJELAogCQkucHJpb3JpdHkgPQlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCwKKwl9LAorCXsKKwkJLmhvb2sgPQkJc2VsaW51eF9pcHY0X291dHB1dCwKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5wZiA9CQlQRl9JTkVULAorCQkuaG9va251bSA9CU5GX0lORVRfTE9DQUxfT1VULAorCQkucHJpb3JpdHkgPQlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCwKIAl9CiB9OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKaW5kZXggN2I5NzY5Zi4uZDEyZmYxYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvcGF0aC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTEyNiw2ICsxMjcsOSBAQAogCQkgICAgIHUzMiBldmVudHMsIHUzMiBzc2lkLCB1MzIgdHNpZCwKIAkJICAgICB1MTYgdGNsYXNzLCB1MzIgcGVybXMpOwogCisvKiBTaG93cyBwZXJtaXNzaW9uIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0gKi8KK3ZvaWQgYXZjX2R1bXBfYXYoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHUxNiB0Y2xhc3MsIHUzMiBhdik7CisKIC8qIEV4cG9ydGVkIHRvIHNlbGludXhmcyAqLwogaW50IGF2Y19nZXRfaGFzaF9zdGF0cyhjaGFyICpwYWdlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXZjX2NhY2hlX3RocmVzaG9sZDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9uZXRsYWJlbC5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmgKaW5kZXggNDg3YTdkOC4uYjkxM2M4ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmgKQEAgLTM5LDYgKzM5LDkgQEAKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKTsKIAordm9pZCBzZWxpbnV4X25ldGxibF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycm9yLCBpbnQgZ2F0ZXdheSk7CisKK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfZnJlZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjKTsKIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkgICAgICBpbnQgZmFtaWx5KTsKIApAQCAtNDYsOCArNDksMTEgQEAKIAkJCQkgdTE2IGZhbWlseSwKIAkJCQkgdTMyICp0eXBlLAogCQkJCSB1MzIgKnNpZCk7CitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX3NldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1MTYgZmFtaWx5LAorCQkJCSB1MzIgc2lkKTsKIAotdm9pZCBzZWxpbnV4X25ldGxibF9zb2NrX2dyYWZ0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2tldCAqc29jayk7Cit2b2lkIHNlbGludXhfbmV0bGJsX2luZXRfY29ubl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBmYW1pbHkpOwogaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKIGludCBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIGludCBzZWxpbnV4X25ldGxibF9zb2NrX3Jjdl9za2Ioc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMsCkBAIC01NywxMiArNjMsMjcgQEAKIGludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJCSAgICAgaW50IGxldmVsLAogCQkJCSAgICAgaW50IG9wdG5hbWUpOworaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICphZGRyKTsKKwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9jYWNoZV9pbnZhbGlkYXRlKHZvaWQpCiB7CiAJcmV0dXJuOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfZXJyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgaW50IGVycm9yLAorCQkJCSAgICAgIGludCBnYXRld2F5KQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2ZyZWUoCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjKQoreworCXJldHVybjsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KAogCQkJCQkgICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkJICAgICAgIGludCBmYW1pbHkpCkBAIC03OSw5ICsxMDAsMjEgQEAKIAkqc2lkID0gU0VDU0lEX05VTEw7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfc2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgICB1MTYgZmFtaWx5LAorCQkJCQkgICAgICAgdTMyIHNpZCkKK3sKKwlyZXR1cm4gMDsKK30KIAotc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NvY2tfZ3JhZnQoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgIHN0cnVjdCBzb2NrZXQgKnNvY2spCitzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9jb25uX3NldHNpZChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICphZGRyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCQl1MTYgZmFtaWx5KQogewogCXJldHVybjsKIH0KQEAgLTEwNyw2ICsxNDAsMTEgQEAKIHsKIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCXN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfTkVUTEFCRUwgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmgKaW5kZXggOTEwNzBhYi4uZjhiZThkNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL29ianNlYy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaApAQCAtMTA5LDE2ICsxMDksMTkgQEAKIH07CiAKIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgewotCXUzMiBzaWQ7CQkJLyogU0lEIG9mIHRoaXMgb2JqZWN0ICovCi0JdTMyIHBlZXJfc2lkOwkJCS8qIFNJRCBvZiBwZWVyICovCi0JdTE2IHNjbGFzczsJCQkvKiBzb2NrIHNlY3VyaXR5IGNsYXNzICovCiAjaWZkZWYgQ09ORklHX05FVExBQkVMCiAJZW51bSB7CQkJCS8qIE5ldExhYmVsIHN0YXRlICovCiAJCU5MQkxfVU5TRVQgPSAwLAogCQlOTEJMX1JFUVVJUkUsCiAJCU5MQkxfTEFCRUxFRCwKKwkJTkxCTF9SRVFTS0IsCisJCU5MQkxfQ09OTkxBQkVMRUQsCiAJfSBubGJsX3N0YXRlOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKm5sYmxfc2VjYXR0cjsgLyogTmV0TGFiZWwgc2VjIGF0dHJpYnV0ZXMgKi8KICNlbmRpZgorCXUzMiBzaWQ7CQkJLyogU0lEIG9mIHRoaXMgb2JqZWN0ICovCisJdTMyIHBlZXJfc2lkOwkJCS8qIFNJRCBvZiBwZWVyICovCisJdTE2IHNjbGFzczsJCQkvKiBzb2NrIHNlY3VyaXR5IGNsYXNzICovCiB9OwogCiBzdHJ1Y3Qga2V5X3NlY3VyaXR5X3N0cnVjdCB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDdjNTQzMDAuLjcyNDQ3MzcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0yNywxMyArMjcsMTQgQEAKICNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9SQU5HRVRSQU5TCTIxCiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fUE9MQ0FQCQkyMgogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX1BFUk1JU1NJVkUJMjMKKyNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWQkyNAogCiAvKiBSYW5nZSBvZiBwb2xpY3kgdmVyc2lvbnMgd2UgdW5kZXJzdGFuZCovCiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUlOICAgUE9MSUNZREJfVkVSU0lPTl9CQVNFCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVgKICNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9NQVgJQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVhfVkFMVUUKICNlbHNlCi0jZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCVBPTElDWURCX1ZFUlNJT05fUEVSTUlTU0lWRQorI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX01BWAlQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZCiAjZW5kaWYKIAogI2RlZmluZSBDT05URVhUX01OVAkweDAxCkBAIC02Miw2ICs2MywxNiBAQAogZXh0ZXJuIGludCBzZWxpbnV4X3BvbGljeWNhcF9uZXRwZWVyOwogZXh0ZXJuIGludCBzZWxpbnV4X3BvbGljeWNhcF9vcGVucGVybTsKIAorLyoKKyAqIHR5cGVfZGF0dW0gcHJvcGVydGllcworICogYXZhaWxhYmxlIGF0IHRoZSBrZXJuZWwgcG9saWN5IHZlcnNpb24gPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWQorICovCisjZGVmaW5lIFRZUEVEQVRVTV9QUk9QRVJUWV9QUklNQVJZCTB4MDAwMQorI2RlZmluZSBUWVBFREFUVU1fUFJPUEVSVFlfQVRUUklCVVRFCTB4MDAwMgorCisvKiBsaW1pdGF0aW9uIG9mIGJvdW5kYXJ5IGRlcHRoICAqLworI2RlZmluZSBQT0xJQ1lEQl9CT1VORFNfTUFYREVQVEgJNAorCiBpbnQgc2VjdXJpdHlfbG9hZF9wb2xpY3kodm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CiAKIGludCBzZWN1cml0eV9wb2xpY3ljYXBfc3VwcG9ydGVkKHVuc2lnbmVkIGludCByZXFfY2FwKTsKQEAgLTExNyw2ICsxMjgsOCBAQAogaW50IHNlY3VyaXR5X3ZhbGlkYXRlX3RyYW5zaXRpb24odTMyIG9sZHNpZCwgdTMyIG5ld3NpZCwgdTMyIHRhc2tzaWQsCiAJCQkJIHUxNiB0Y2xhc3MpOwogCitpbnQgc2VjdXJpdHlfYm91bmRlZF90cmFuc2l0aW9uKHUzMiBvbGRzaWQsIHUzMiBuZXdzaWQpOworCiBpbnQgc2VjdXJpdHlfc2lkX21sc19jb3B5KHUzMiBzaWQsIHUzMiBtbHNfc2lkLCB1MzIgKm5ld19zaWQpOwogCiBpbnQgc2VjdXJpdHlfbmV0X3BlZXJzaWRfcmVzb2x2ZSh1MzIgbmxibF9zaWQsIHUzMiBubGJsX3R5cGUsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMgYi9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMKaW5kZXggODliNDE4MzkuLmY1ODcwMWEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGFiZWwuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMKQEAgLTksNyArOSw3IEBACiAgKi8KIAogLyoKLSAqIChjKSBDb3B5cmlnaHQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4sIDIwMDcKKyAqIChjKSBDb3B5cmlnaHQgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4sIDIwMDcsIDIwMDgKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yOSw4ICsyOSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIAogI2luY2x1ZGUgIm9ianNlYy5oIgogI2luY2x1ZGUgInNlY3VyaXR5LmgiCkBAIC02NCwzMiArNjgsNjkgQEAKIH0KIAogLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZCAtIExhYmVsIGEgc29ja2V0IHVzaW5nIHRoZSBOZXRMYWJlbCBtZWNoYW5pc20KLSAqIEBzazogdGhlIHNvY2tldCB0byBsYWJlbAotICogQHNpZDogdGhlIFNJRCB0byB1c2UKKyAqIHNlbGludXhfbmV0bGJsX3NvY2tfZ2VuYXR0ciAtIEdlbmVyYXRlIHRoZSBOZXRMYWJlbCBzb2NrZXQgc2VjYXR0cgorICogQHNrOiB0aGUgc29ja2V0CiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBBdHRlbXB0IHRvIGxhYmVsIGEgc29ja2V0IHVzaW5nIHRoZSBOZXRMYWJlbCBtZWNoYW5pc20gdXNpbmcgdGhlIGdpdmVuCi0gKiBTSUQuICBSZXR1cm5zIHplcm8gdmFsdWVzIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogR2VuZXJhdGUgdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMgZm9yIGEgc29ja2V0LCBtYWtpbmcgZnVsbCB1c2Ugb2YKKyAqIHRoZSBzb2NrZXQncyBhdHRyaWJ1dGUgY2FjaGUuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGludCBzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBzaWQpCitzdGF0aWMgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VsaW51eF9uZXRsYmxfc29ja19nZW5hdHRyKHN0cnVjdCBzb2NrICpzaykKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0Jc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHI7CiAKLQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKKwlpZiAoc2tzZWMtPm5sYmxfc2VjYXR0ciAhPSBOVUxMKQorCQlyZXR1cm4gc2tzZWMtPm5sYmxfc2VjYXR0cjsKIAotCXJjID0gc2VjdXJpdHlfbmV0bGJsX3NpZF90b19zZWNhdHRyKHNpZCwgJnNlY2F0dHIpOwotCWlmIChyYyAhPSAwKQotCQlnb3RvIHNvY2tfc2V0c2lkX3JldHVybjsKLQlyYyA9IG5ldGxibF9zb2NrX3NldGF0dHIoc2ssICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKKwlzZWNhdHRyID0gbmV0bGJsX3NlY2F0dHJfYWxsb2MoR0ZQX0FUT01JQyk7CisJaWYgKHNlY2F0dHIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmMgPSBzZWN1cml0eV9uZXRsYmxfc2lkX3RvX3NlY2F0dHIoc2tzZWMtPnNpZCwgc2VjYXR0cik7CisJaWYgKHJjICE9IDApIHsKKwkJbmV0bGJsX3NlY2F0dHJfZnJlZShzZWNhdHRyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNrc2VjLT5ubGJsX3NlY2F0dHIgPSBzZWNhdHRyOworCisJcmV0dXJuIHNlY2F0dHI7Cit9CisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfc29ja19zZXRzaWQgLSBMYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtCisgKiBAc2s6IHRoZSBzb2NrZXQgdG8gbGFiZWwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEF0dGVtcHQgdG8gbGFiZWwgYSBzb2NrZXQgdXNpbmcgdGhlIE5ldExhYmVsIG1lY2hhbmlzbS4gIFJldHVybnMgemVybyB2YWx1ZXMKKyAqIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGludCBzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZChzdHJ1Y3Qgc29jayAqc2spCit7CisJaW50IHJjOworCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHI7CisKKwlpZiAoc2tzZWMtPm5sYmxfc3RhdGUgIT0gTkxCTF9SRVFVSVJFKQorCQlyZXR1cm4gMDsKKworCXNlY2F0dHIgPSBzZWxpbnV4X25ldGxibF9zb2NrX2dlbmF0dHIoc2spOworCWlmIChzZWNhdHRyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJjID0gbmV0bGJsX3NvY2tfc2V0YXR0cihzaywgc2VjYXR0cik7CisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKIAkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX0xBQkVMRUQ7CisJCWJyZWFrOworCWNhc2UgLUVERVNUQUREUlJFUToKKwkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVNLQjsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CiAKLXNvY2tfc2V0c2lkX3JldHVybjoKLQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwNiw2ICsxNDcsMzggQEAKIH0KIAogLyoqCisgKiBzZWxpbnV4X25ldGxibF9lcnIgLSBIYW5kbGUgYSBOZXRMYWJlbCBwYWNrZXQgZXJyb3IKKyAqIEBza2I6IHRoZSBwYWNrZXQKKyAqIEBlcnJvcjogdGhlIGVycm9yIGNvZGUKKyAqIEBnYXRld2F5OiB0cnVlIGlmIGhvc3QgaXMgYWN0aW5nIGFzIGEgZ2F0ZXdheSwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogRGVzY3JpcHRpb246CisgKiBXaGVuIGEgcGFja2V0IGlzIGRyb3BwZWQgZHVlIHRvIGEgY2FsbCB0byBhdmNfaGFzX3Blcm0oKSBwYXNzIHRoZSBlcnJvcgorICogY29kZSB0byB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtIHNvIGFueSBwcm90b2NvbCBzcGVjaWZpYyBwcm9jZXNzaW5nIGNhbiBiZQorICogZG9uZS4gIFRoaXMgaXMgc2FmZSB0byBjYWxsIGV2ZW4gaWYgeW91IGFyZSB1bnN1cmUgaWYgTmV0TGFiZWwgbGFiZWxpbmcgaXMKKyAqIHByZXNlbnQgb24gdGhlIHBhY2tldCwgTmV0TGFiZWwgaXMgc21hcnQgZW5vdWdoIHRvIG9ubHkgYWN0IHdoZW4gaXQgc2hvdWxkLgorICoKKyAqLwordm9pZCBzZWxpbnV4X25ldGxibF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycm9yLCBpbnQgZ2F0ZXdheSkKK3sKKwluZXRsYmxfc2tidWZmX2Vycihza2IsIGVycm9yLCBnYXRld2F5KTsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9mcmVlIC0gRnJlZSB0aGUgTmV0TGFiZWwgZmllbGRzCisgKiBAc3NzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEZyZWUgYWxsIG9mIHRoZSBtZW1vcnkgaW4gdGhlIE5ldExhYmVsIGZpZWxkcyBvZiBhIHNrX3NlY3VyaXR5X3N0cnVjdC4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfZnJlZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjKQoreworCWlmIChzc2VjLT5ubGJsX3NlY2F0dHIgIT0gTlVMTCkKKwkJbmV0bGJsX3NlY2F0dHJfZnJlZShzc2VjLT5ubGJsX3NlY2F0dHIpOworfQorCisvKioKICAqIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0IC0gUmVzZXQgdGhlIE5ldExhYmVsIGZpZWxkcwogICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKICAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5CkBAIC0xNjMsMzUgKzIzNiwxMTggQEAKIH0KIAogLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrX2dyYWZ0IC0gTmV0bGFiZWwgdGhlIG5ldyBzb2NrZXQKLSAqIEBzazogdGhlIG5ldyBjb25uZWN0aW9uCi0gKiBAc29jazogdGhlIG5ldyBzb2NrZXQKKyAqIHNlbGludXhfbmV0bGJsX3NrYnVmZl9zZXRzaWQgLSBTZXQgdGhlIE5ldExhYmVsIG9uIGEgcGFja2V0IGdpdmVuIGEgc2lkCisgKiBAc2tiOiB0aGUgcGFja2V0CisgKiBAZmFtaWx5OiBwcm90b2NvbCBmYW1pbHkKKyAqIEBzaWQ6IHRoZSBTSUQKICAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoZSBjb25uZWN0aW9uIHJlcHJlc2VudGVkIGJ5IEBzayBpcyBiZWluZyBncmFmdGVkIG9udG8gQHNvY2sgc28gc2V0IHRoZQotICogc29ja2V0J3MgTmV0TGFiZWwgdG8gbWF0Y2ggdGhlIFNJRCBvZiBAc2suCisgKiBEZXNjcmlwdGlvbgorICogQ2FsbCB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHRvIHNldCB0aGUgbGFiZWwgb2YgYSBwYWNrZXQgdXNpbmcgQHNpZC4KKyAqIFJldHVybnMgemVybyBvbiBhdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLXZvaWQgc2VsaW51eF9uZXRsYmxfc29ja19ncmFmdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrZXQgKnNvY2spCitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX3NldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1MTYgZmFtaWx5LAorCQkJCSB1MzIgc2lkKQogeworCWludCByYzsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHJfc3RvcmFnZTsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyID0gTlVMTDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwkvKiBpZiB0aGlzIGlzIGEgbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0IGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5CisJICogYmVpbmcgbGFiZWxlZCBieSBpdCdzIHBhcmVudCBzb2NrZXQsIGlmIGl0IGlzIGp1c3QgZXhpdCAqLworCXNrID0gc2tiLT5zazsKKwlpZiAoc2sgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKKwkJaWYgKHNrc2VjLT5ubGJsX3N0YXRlICE9IE5MQkxfUkVRU0tCKQorCQkJcmV0dXJuIDA7CisJCXNlY2F0dHIgPSBza3NlYy0+bmxibF9zZWNhdHRyOworCX0KKwlpZiAoc2VjYXR0ciA9PSBOVUxMKSB7CisJCXNlY2F0dHIgPSAmc2VjYXR0cl9zdG9yYWdlOworCQluZXRsYmxfc2VjYXR0cl9pbml0KHNlY2F0dHIpOworCQlyYyA9IHNlY3VyaXR5X25ldGxibF9zaWRfdG9fc2VjYXR0cihzaWQsIHNlY2F0dHIpOworCQlpZiAocmMgIT0gMCkKKwkJCWdvdG8gc2tidWZmX3NldHNpZF9yZXR1cm47CisJfQorCisJcmMgPSBuZXRsYmxfc2tidWZmX3NldGF0dHIoc2tiLCBmYW1pbHksIHNlY2F0dHIpOworCitza2J1ZmZfc2V0c2lkX3JldHVybjoKKwlpZiAoc2VjYXR0ciA9PSAmc2VjYXR0cl9zdG9yYWdlKQorCQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KHNlY2F0dHIpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQgLSBOZXRsYWJlbCB0aGUgbmV3bHkgYWNjZXB0ZWQgY29ubmVjdGlvbgorICogQHNrOiB0aGUgbmV3IGNvbm5lY3Rpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEEgbmV3IGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgb24gQHNrIHNvIG1ha2Ugc3VyZSBpdCBpcyBsYWJlbGVkCisgKiBjb3JyZWN0bHkgd2l0aCB0aGUgTmV0TGFiZWwgc3VzYnN5c3RlbS4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywgdTE2IGZhbWlseSkKK3sKKwlpbnQgcmM7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0Jc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOwotCXUzMiBubGJsX3BlZXJfc2lkOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHI7CisJc3RydWN0IGluZXRfc29jayAqc2tfaW5ldCA9IGluZXRfc2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogCiAJaWYgKHNrc2VjLT5ubGJsX3N0YXRlICE9IE5MQkxfUkVRVUlSRSkKIAkJcmV0dXJuOwogCi0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0JaWYgKG5ldGxibF9zb2NrX2dldGF0dHIoc2ssICZzZWNhdHRyKSA9PSAwICYmCi0JICAgIHNlY2F0dHIuZmxhZ3MgIT0gTkVUTEJMX1NFQ0FUVFJfTk9ORSAmJgotCSAgICBzZWN1cml0eV9uZXRsYmxfc2VjYXR0cl90b19zaWQoJnNlY2F0dHIsICZubGJsX3BlZXJfc2lkKSA9PSAwKQotCQlza3NlYy0+cGVlcl9zaWQgPSBubGJsX3BlZXJfc2lkOwotCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCXNlY2F0dHIgPSBzZWxpbnV4X25ldGxibF9zb2NrX2dlbmF0dHIoc2spOworCWlmIChzZWNhdHRyID09IE5VTEwpCisJCXJldHVybjsKIAotCS8qIFRyeSB0byBzZXQgdGhlIE5ldExhYmVsIG9uIHRoZSBzb2NrZXQgdG8gc2F2ZSB0aW1lIGxhdGVyLCBpZiB3ZSBmYWlsCi0JICogaGVyZSB3ZSB3aWxsIHBpY2sgdXAgdGhlIHBpZWNlcyBpbiBsYXRlciBjYWxscyB0bwotCSAqIHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oKS4gKi8KLQlzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZChzaywgc2tzZWMtPnNpZCk7CisJcmMgPSBuZXRsYmxfc29ja19zZXRhdHRyKHNrLCBzZWNhdHRyKTsKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlza3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfTEFCRUxFRDsKKwkJYnJlYWs7CisJY2FzZSAtRURFU1RBRERSUkVROgorCQkvKiBubyBQRl9JTkVUNiBzdXBwb3J0IHlldCBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgYW55IElQdjYKKwkJICogbGFiZWxpbmcgcHJvdG9jb2xzICovCisJCWlmIChmYW1pbHkgIT0gUEZfSU5FVCkgeworCQkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1VOU0VUOworCQkJcmV0dXJuOworCQl9CisKKwkJYWRkci5zaW5fZmFtaWx5ID0gZmFtaWx5OworCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHNrX2luZXQtPmRhZGRyOworCQlpZiAobmV0bGJsX2Nvbm5fc2V0YXR0cihzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLAorCQkJCQlzZWNhdHRyKSAhPSAwKSB7CisJCQkvKiB3ZSBmYWlsZWQgdG8gbGFiZWwgdGhlIGNvbm5lY3RlZCBzb2NrZXQgKGNvdWxkIGJlCisJCQkgKiBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMsIHRoZSBhY3R1YWwgIndoeSIgaXNuJ3QKKwkJCSAqIGltcG9ydGFudCBoZXJlKSBzbyB3ZSBoYXZlIHRvIGdvIHRvIG91ciBiYWNrdXAgcGxhbiwKKwkJCSAqIGxhYmVsaW5nIHRoZSBwYWNrZXRzIGluZGl2aWR1YWxseSBpbiB0aGUgbmV0ZmlsdGVyCisJCQkgKiBsb2NhbCBvdXRwdXQgaG9vay4gIHRoaXMgaXMgb2theSBidXQgd2UgbmVlZCB0bworCQkJICogYWRqdXN0IHRoZSBNU1Mgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGFrZSBpbnRvCisJCQkgKiBhY2NvdW50IGFueSBsYWJlbGluZyBvdmVyaGVhZCwgc2luY2Ugd2UgZG9uJ3Qga25vdworCQkJICogdGhlIGV4YWN0IG92ZXJoZWFkIGF0IHRoaXMgcG9pbnQgd2UnbGwgdXNlIHRoZSB3b3JzdAorCQkJICogY2FzZSB2YWx1ZSB3aGljaCBpcyA0MCBieXRlcyBmb3IgSVB2NCAqLworCQkJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICpza19jb25uID0gaW5ldF9jc2soc2spOworCQkJc2tfY29ubi0+aWNza19leHRfaGRyX2xlbiArPSA0MCAtCisJCQkJICAgICAgKHNrX2luZXQtPm9wdCA/IHNrX2luZXQtPm9wdC0+b3B0bGVuIDogMCk7CisJCQlza19jb25uLT5pY3NrX3N5bmNfbXNzKHNrLCBza19jb25uLT5pY3NrX3BtdHVfY29va2llKTsKKworCQkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVNLQjsKKwkJfSBlbHNlCisJCQlza3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfQ09OTkxBQkVMRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdGUgdGhhdCB3ZSBhcmUgZmFpbGluZyB0byBsYWJlbCB0aGUgc29ja2V0IHdoaWNoIGNvdWxkIGJlCisJCSAqIGEgYmFkIHRoaW5nIHNpbmNlIGl0IG1lYW5zIHRyYWZmaWMgY291bGQgbGVhdmUgdGhlIHN5c3RlbQorCQkgKiB3aXRob3V0IHRoZSBkZXNpcmVkIGxhYmVsaW5nLCBob3dldmVyLCBhbGwgaXMgbm90IGxvc3QgYXMKKwkJICogd2UgaGF2ZSBhIGNoZWNrIGluIHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oKSB0bworCQkgKiBwaWNrIHVwIHRoZSBwaWVjZXMgdGhhdCB3ZSBtaWdodCBkcm9wIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndAorCQkgKiByZXR1cm4gYW4gZXJyb3IgY29kZSAqLworCQlicmVhazsKKwl9CiB9CiAKIC8qKgpAQCAtMjA1LDEzICszNjEsNyBAQAogICovCiBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2spCiB7Ci0Jc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0Jc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0KLQlpZiAoc2tzZWMtPm5sYmxfc3RhdGUgIT0gTkxCTF9SRVFVSVJFKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZChzaywgc2tzZWMtPnNpZCk7CisJcmV0dXJuIHNlbGludXhfbmV0bGJsX3NvY2tfc2V0c2lkKHNvY2stPnNrKTsKIH0KIAogLyoqCkBAIC0yNDYsNyArMzk2LDcgQEAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJYmhfbG9ja19zb2NrX25lc3RlZChzayk7CiAJaWYgKGxpa2VseShza3NlYy0+bmxibF9zdGF0ZSA9PSBOTEJMX1JFUVVJUkUpKQotCQlyYyA9IHNlbGludXhfbmV0bGJsX3NvY2tfc2V0c2lkKHNrLCBza3NlYy0+c2lkKTsKKwkJcmMgPSBzZWxpbnV4X25ldGxibF9zb2NrX3NldHNpZChzayk7CiAJZWxzZQogCQlyYyA9IDA7CiAJYmhfdW5sb2NrX3NvY2soc2spOwpAQCAtMzA3LDcgKzQ1Nyw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKG5sYmxfc2lkICE9IFNFQ0lOSVRTSURfVU5MQUJFTEVEKQotCQluZXRsYmxfc2tidWZmX2Vycihza2IsIHJjKTsKKwkJbmV0bGJsX3NrYnVmZl9lcnIoc2tiLCByYywgMCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMzQsNyArNDg0LDggQEAKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7CiAKIAlpZiAobGV2ZWwgPT0gSVBQUk9UT19JUCAmJiBvcHRuYW1lID09IElQX09QVElPTlMgJiYKLQkgICAgc2tzZWMtPm5sYmxfc3RhdGUgPT0gTkxCTF9MQUJFTEVEKSB7CisJICAgIChza3NlYy0+bmxibF9zdGF0ZSA9PSBOTEJMX0xBQkVMRUQgfHwKKwkgICAgIHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfQ09OTkxBQkVMRUQpKSB7CiAJCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwogCQlsb2NrX3NvY2soc2spOwogCQlyYyA9IG5ldGxibF9zb2NrX2dldGF0dHIoc2ssICZzZWNhdHRyKTsKQEAgLTM0NiwzICs0OTcsNTAgQEAKIAogCXJldHVybiByYzsKIH0KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfY29ubmVjdCAtIExhYmVsIGEgY2xpZW50LXNpZGUgc29ja2V0IG9uIGNvbm5lY3QKKyAqIEBzazogdGhlIHNvY2tldCB0byBsYWJlbAorICogQGFkZHI6IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKiBBdHRlbXB0IHRvIGxhYmVsIGEgY29ubmVjdGVkIHNvY2tldCB3aXRoIE5ldExhYmVsIHVzaW5nIHRoZSBnaXZlbiBhZGRyZXNzLgorICogUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKwlpbnQgcmM7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CisJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cjsKKworCWlmIChza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1JFUVNLQiAmJgorCSAgICBza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX0NPTk5MQUJFTEVEKQorCQlyZXR1cm4gMDsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwliaF9sb2NrX3NvY2tfbmVzdGVkKHNrKTsKKworCS8qIGNvbm5lY3RlZCBzb2NrZXRzIGFyZSBhbGxvd2VkIHRvIGRpc2Nvbm5lY3Qgd2hlbiB0aGUgYWRkcmVzcyBmYW1pbHkKKwkgKiBpcyBzZXQgdG8gQUZfVU5TUEVDLCBpZiB0aGF0IGlzIHdoYXQgaXMgaGFwcGVuaW5nIHdlIHdhbnQgdG8gcmVzZXQKKwkgKiB0aGUgc29ja2V0ICovCisJaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJbmV0bGJsX3NvY2tfZGVsYXR0cihzayk7CisJCXNrc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9SRVFTS0I7CisJCXJjID0gMDsKKwkJZ290byBzb2NrZXRfY29ubmVjdF9yZXR1cm47CisJfQorCXNlY2F0dHIgPSBzZWxpbnV4X25ldGxibF9zb2NrX2dlbmF0dHIoc2spOworCWlmIChzZWNhdHRyID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHNvY2tldF9jb25uZWN0X3JldHVybjsKKwl9CisJcmMgPSBuZXRsYmxfY29ubl9zZXRhdHRyKHNrLCBhZGRyLCBzZWNhdHRyKTsKKwlpZiAocmMgPT0gMCkKKwkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX0NPTk5MQUJFTEVEOworCitzb2NrZXRfY29ubmVjdF9yZXR1cm46CisJYmhfdW5sb2NrX3NvY2soc2spOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYwppbmRleCBhMWJlOTdmLi4xMjE1YjhlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jCkBAIC05OCw3ICs5OCw3IEBACiBhdnRhYl9pbnNlcnRfbm9udW5pcXVlKHN0cnVjdCBhdnRhYiAqaCwgc3RydWN0IGF2dGFiX2tleSAqa2V5LCBzdHJ1Y3QgYXZ0YWJfZGF0dW0gKmRhdHVtKQogewogCWludCBodmFsdWU7Ci0Jc3RydWN0IGF2dGFiX25vZGUgKnByZXYsICpjdXIsICpuZXdub2RlOworCXN0cnVjdCBhdnRhYl9ub2RlICpwcmV2LCAqY3VyOwogCXUxNiBzcGVjaWZpZWQgPSBrZXktPnNwZWNpZmllZCAmIH4oQVZUQUJfRU5BQkxFRHxBVlRBQl9FTkFCTEVEX09MRCk7CiAKIAlpZiAoIWggfHwgIWgtPmh0YWJsZSkKQEAgLTEyMiw5ICsxMjIsNyBAQAogCQkgICAga2V5LT50YXJnZXRfY2xhc3MgPCBjdXItPmtleS50YXJnZXRfY2xhc3MpCiAJCQlicmVhazsKIAl9Ci0JbmV3bm9kZSA9IGF2dGFiX2luc2VydF9ub2RlKGgsIGh2YWx1ZSwgcHJldiwgY3VyLCBrZXksIGRhdHVtKTsKLQotCXJldHVybiBuZXdub2RlOworCXJldHVybiBhdnRhYl9pbnNlcnRfbm9kZShoLCBodmFsdWUsIHByZXYsIGN1ciwga2V5LCBkYXR1bSk7CiB9CiAKIHN0cnVjdCBhdnRhYl9kYXR1bSAqYXZ0YWJfc2VhcmNoKHN0cnVjdCBhdnRhYiAqaCwgc3RydWN0IGF2dGFiX2tleSAqa2V5KQpAQCAtMjMxLDcgKzIyOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaC0+bnNsb3Q7IGkrKykgewogCQljdXIgPSBoLT5odGFibGVbaV07Ci0JCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQl3aGlsZSAoY3VyKSB7CiAJCQl0ZW1wID0gY3VyOwogCQkJY3VyID0gY3VyLT5uZXh0OwogCQkJa21lbV9jYWNoZV9mcmVlKGF2dGFiX25vZGVfY2FjaGVwLCB0ZW1wKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwppbmRleCBmYjRlZmU0Li40YTRlMzVjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCkBAIC0yOSw3ICsyOSw3IEBACiAJaW50IHNbQ09ORF9FWFBSX01BWERFUFRIXTsKIAlpbnQgc3AgPSAtMTsKIAotCWZvciAoY3VyID0gZXhwcjsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCWZvciAoY3VyID0gZXhwcjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKIAkJc3dpdGNoIChjdXItPmV4cHJfdHlwZSkgewogCQljYXNlIENPTkRfQk9PTDoKIAkJCWlmIChzcCA9PSAoQ09ORF9FWFBSX01BWERFUFRIIC0gMSkpCkBAIC05NywxNCArOTcsMTQgQEAKIAkJaWYgKG5ld19zdGF0ZSA9PSAtMSkKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogZXhwcmVzc2lvbiByZXN1bHQgd2FzIHVuZGVmaW5lZCAtIGRpc2FibGluZyBhbGwgcnVsZXMuXG4iKTsKIAkJLyogdHVybiB0aGUgcnVsZXMgb24gb3Igb2ZmICovCi0JCWZvciAoY3VyID0gbm9kZS0+dHJ1ZV9saXN0OyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisJCWZvciAoY3VyID0gbm9kZS0+dHJ1ZV9saXN0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgewogCQkJaWYgKG5ld19zdGF0ZSA8PSAwKQogCQkJCWN1ci0+bm9kZS0+a2V5LnNwZWNpZmllZCAmPSB+QVZUQUJfRU5BQkxFRDsKIAkJCWVsc2UKIAkJCQljdXItPm5vZGUtPmtleS5zcGVjaWZpZWQgfD0gQVZUQUJfRU5BQkxFRDsKIAkJfQogCi0JCWZvciAoY3VyID0gbm9kZS0+ZmFsc2VfbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCQlmb3IgKGN1ciA9IG5vZGUtPmZhbHNlX2xpc3Q7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CiAJCQkvKiAtMSBvciAxICovCiAJCQlpZiAobmV3X3N0YXRlKQogCQkJCWN1ci0+bm9kZS0+a2V5LnNwZWNpZmllZCAmPSB+QVZUQUJfRU5BQkxFRDsKQEAgLTEyOCw3ICsxMjgsNyBAQAogc3RhdGljIHZvaWQgY29uZF9hdl9saXN0X2Rlc3Ryb3koc3RydWN0IGNvbmRfYXZfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgY29uZF9hdl9saXN0ICpjdXIsICpuZXh0OwotCWZvciAoY3VyID0gbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IG5leHQpIHsKKwlmb3IgKGN1ciA9IGxpc3Q7IGN1cjsgY3VyID0gbmV4dCkgewogCQluZXh0ID0gY3VyLT5uZXh0OwogCQkvKiB0aGUgYXZ0YWJfcHRyX3Qgbm9kZSBpcyBkZXN0cm95IGJ5IHRoZSBhdnRhYiAqLwogCQlrZnJlZShjdXIpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiB7CiAJc3RydWN0IGNvbmRfZXhwciAqY3VyX2V4cHIsICpuZXh0X2V4cHI7CiAKLQlmb3IgKGN1cl9leHByID0gbm9kZS0+ZXhwcjsgY3VyX2V4cHIgIT0gTlVMTDsgY3VyX2V4cHIgPSBuZXh0X2V4cHIpIHsKKwlmb3IgKGN1cl9leHByID0gbm9kZS0+ZXhwcjsgY3VyX2V4cHI7IGN1cl9leHByID0gbmV4dF9leHByKSB7CiAJCW5leHRfZXhwciA9IGN1cl9leHByLT5uZXh0OwogCQlrZnJlZShjdXJfZXhwcik7CiAJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJaWYgKGxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JZm9yIChjdXIgPSBsaXN0OyBjdXIgIT0gTlVMTDsgY3VyID0gbmV4dCkgeworCWZvciAoY3VyID0gbGlzdDsgY3VyOyBjdXIgPSBuZXh0KSB7CiAJCW5leHQgPSBjdXItPm5leHQ7CiAJCWNvbmRfbm9kZV9kZXN0cm95KGN1cik7CiAJfQpAQCAtMjM5LDcgKzIzOSw3IEBACiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBlcnI7Ci0Ja2V5W2xlbl0gPSAwOworCWtleVtsZW5dID0gJ1wwJzsKIAlpZiAoaGFzaHRhYl9pbnNlcnQoaCwga2V5LCBib29sZGF0dW0pKQogCQlnb3RvIGVycjsKIApAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCQlmb3VuZCA9IDA7Ci0JCQkJZm9yIChjdXIgPSBvdGhlcjsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJCWZvciAoY3VyID0gb3RoZXI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CiAJCQkJCWlmIChjdXItPm5vZGUgPT0gbm9kZV9wdHIpIHsKIAkJCQkJCWZvdW5kID0gMTsKIAkJCQkJCWJyZWFrOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJaWYgKCFjdGFiIHx8ICFrZXkgfHwgIWF2ZCkKIAkJcmV0dXJuOwogCi0JZm9yIChub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoY3RhYiwga2V5KTsgbm9kZSAhPSBOVUxMOworCWZvciAobm9kZSA9IGF2dGFiX3NlYXJjaF9ub2RlKGN0YWIsIGtleSk7IG5vZGU7CiAJCQkJbm9kZSA9IGF2dGFiX3NlYXJjaF9ub2RlX25leHQobm9kZSwga2V5LT5zcGVjaWZpZWQpKSB7CiAJCWlmICgodTE2KShBVlRBQl9BTExPV0VEfEFWVEFCX0VOQUJMRUQpID09CiAJCSAgICAobm9kZS0+a2V5LnNwZWNpZmllZCAmIChBVlRBQl9BTExPV0VEfEFWVEFCX0VOQUJMRUQpKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuaAppbmRleCA2NWI5ZjgzLi41M2RkYjAxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIENPTkRfWE9SCTUgLyogYm9vbCBeIGJvb2wgKi8KICNkZWZpbmUgQ09ORF9FUQkJNiAvKiBib29sID09IGJvb2wgKi8KICNkZWZpbmUgQ09ORF9ORVEJNyAvKiBib29sICE9IGJvb2wgKi8KLSNkZWZpbmUgQ09ORF9MQVNUCTgKKyNkZWZpbmUgQ09ORF9MQVNUCUNPTkRfTkVRCiAJX191MzIgZXhwcl90eXBlOwogCV9fdTMyIGJvb2w7CiAJc3RydWN0IGNvbmRfZXhwciAqbmV4dDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKaW5kZXggZGRjMjc1NC4uNjhjNzM0OCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCSpjYXRtYXAgPSBjX2l0ZXI7CiAJY19pdGVyLT5zdGFydGJpdCA9IGVfaXRlci0+c3RhcnRiaXQgJiB+KE5FVExCTF9DQVRNQVBfU0laRSAtIDEpOwogCi0Jd2hpbGUgKGVfaXRlciAhPSBOVUxMKSB7CisJd2hpbGUgKGVfaXRlcikgewogCQlmb3IgKGkgPSAwOyBpIDwgRUJJVE1BUF9VTklUX05VTVM7IGkrKykgewogCQkJdW5zaWduZWQgaW50IGRlbHRhLCBlX3N0YXJ0Yml0LCBjX2VuZGJpdDsKIApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCQl9CiAJCX0KIAkJY19pdGVyID0gY19pdGVyLT5uZXh0OwotCX0gd2hpbGUgKGNfaXRlciAhPSBOVUxMKTsKKwl9IHdoaWxlIChjX2l0ZXIpOwogCWlmIChlX2l0ZXIgIT0gTlVMTCkKIAkJZWJtYXAtPmhpZ2hiaXQgPSBlX2l0ZXItPnN0YXJ0Yml0ICsgRUJJVE1BUF9TSVpFOwogCWVsc2UKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKaW5kZXggMmU3Nzg4ZS4uOTMzZTczNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAogCWh2YWx1ZSA9IGgtPmhhc2hfdmFsdWUoaCwga2V5KTsKIAljdXIgPSBoLT5odGFibGVbaHZhbHVlXTsKLQl3aGlsZSAoY3VyICE9IE5VTEwgJiYgaC0+a2V5Y21wKGgsIGtleSwgY3VyLT5rZXkpID4gMCkKKwl3aGlsZSAoY3VyICYmIGgtPmtleWNtcChoLCBrZXksIGN1ci0+a2V5KSA+IDApCiAJCWN1ciA9IGN1ci0+bmV4dDsKIAogCWlmIChjdXIgPT0gTlVMTCB8fCAoaC0+a2V5Y21wKGgsIGtleSwgY3VyLT5rZXkpICE9IDApKQpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaC0+c2l6ZTsgaSsrKSB7CiAJCWN1ciA9IGgtPmh0YWJsZVtpXTsKLQkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisJCXdoaWxlIChjdXIpIHsKIAkJCXRlbXAgPSBjdXI7CiAJCQljdXIgPSBjdXItPm5leHQ7CiAJCQlrZnJlZSh0ZW1wKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGgtPnNpemU7IGkrKykgewogCQljdXIgPSBoLT5odGFibGVbaV07Ci0JCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQl3aGlsZSAoY3VyKSB7CiAJCQlyZXQgPSBhcHBseShjdXItPmtleSwgY3VyLT5kYXR1bSwgYXJncyk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwppbmRleCA3N2Q3NDVkLi5iNTQwN2YxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKQEAgLTI4Myw4ICsyODMsOCBAQAogCQlwKys7CiAKIAlkZWxpbSA9ICpwOwotCWlmIChkZWxpbSAhPSAwKQotCQkqcCsrID0gMDsKKwlpZiAoZGVsaW0gIT0gJ1wwJykKKwkJKnArKyA9ICdcMCc7CiAKIAlmb3IgKGwgPSAwOyBsIDwgMjsgbCsrKSB7CiAJCWxldmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocG9sLT5wX2xldmVscy50YWJsZSwgc2NvbnRleHRwKTsKQEAgLTMwMiwxNCArMzAyLDE0IEBACiAJCQkJd2hpbGUgKCpwICYmICpwICE9ICcsJyAmJiAqcCAhPSAnLScpCiAJCQkJCXArKzsKIAkJCQlkZWxpbSA9ICpwOwotCQkJCWlmIChkZWxpbSAhPSAwKQotCQkJCQkqcCsrID0gMDsKKwkJCQlpZiAoZGVsaW0gIT0gJ1wwJykKKwkJCQkJKnArKyA9ICdcMCc7CiAKIAkJCQkvKiBTZXBhcmF0ZSBpbnRvIHJhbmdlIGlmIGV4aXN0cyAqLwogCQkJCXJuZ3B0ciA9IHN0cmNocihzY29udGV4dHAsICcuJyk7CiAJCQkJaWYgKHJuZ3B0ciAhPSBOVUxMKSB7CiAJCQkJCS8qIFJlbW92ZSAnLicgKi8KLQkJCQkJKnJuZ3B0cisrID0gMDsKKwkJCQkJKnJuZ3B0cisrID0gJ1wwJzsKIAkJCQl9CiAKIAkJCQljYXRkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHBvbC0+cF9jYXRzLnRhYmxlLApAQCAtMzU3LDggKzM1Nyw4IEBACiAJCQkJcCsrOwogCiAJCQlkZWxpbSA9ICpwOwotCQkJaWYgKGRlbGltICE9IDApCi0JCQkJKnArKyA9IDA7CisJCQlpZiAoZGVsaW0gIT0gJ1wwJykKKwkJCQkqcCsrID0gJ1wwJzsKIAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggMjM5MTc2MS4uNzJlNGE1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSAic2VjdXJpdHkuaCIKIAogI2luY2x1ZGUgInBvbGljeWRiLmgiCkBAIC0xMTYsNyArMTE3LDEyIEBACiAJCS52ZXJzaW9uCT0gUE9MSUNZREJfVkVSU0lPTl9QRVJNSVNTSVZFLAogCQkuc3ltX251bQk9IFNZTV9OVU0sCiAJCS5vY29uX251bQk9IE9DT05fTlVNLAotCX0KKwl9LAorCXsKKwkJLnZlcnNpb24JPSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZLAorCQkuc3ltX251bQk9IFNZTV9OVU0sCisJCS5vY29uX251bQk9IE9DT05fTlVNLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvbGljeWRiX2NvbXBhdF9pbmZvICpwb2xpY3lkYl9sb29rdXBfY29tcGF0KGludCB2ZXJzaW9uKQpAQCAtMjU0LDcgKzI2MCw5IEBACiAKIAlyb2xlID0gZGF0dW07CiAJcCA9IGRhdGFwOwotCWlmICghcm9sZS0+dmFsdWUgfHwgcm9sZS0+dmFsdWUgPiBwLT5wX3JvbGVzLm5wcmltKQorCWlmICghcm9sZS0+dmFsdWUKKwkgICAgfHwgcm9sZS0+dmFsdWUgPiBwLT5wX3JvbGVzLm5wcmltCisJICAgIHx8IHJvbGUtPmJvdW5kcyA+IHAtPnBfcm9sZXMubnByaW0pCiAJCXJldHVybiAtRUlOVkFMOwogCXAtPnBfcm9sZV92YWxfdG9fbmFtZVtyb2xlLT52YWx1ZSAtIDFdID0ga2V5OwogCXAtPnJvbGVfdmFsX3RvX3N0cnVjdFtyb2xlLT52YWx1ZSAtIDFdID0gcm9sZTsKQEAgLTI3MCw5ICsyNzgsMTIgQEAKIAlwID0gZGF0YXA7CiAKIAlpZiAodHlwZGF0dW0tPnByaW1hcnkpIHsKLQkJaWYgKCF0eXBkYXR1bS0+dmFsdWUgfHwgdHlwZGF0dW0tPnZhbHVlID4gcC0+cF90eXBlcy5ucHJpbSkKKwkJaWYgKCF0eXBkYXR1bS0+dmFsdWUKKwkJICAgIHx8IHR5cGRhdHVtLT52YWx1ZSA+IHAtPnBfdHlwZXMubnByaW0KKwkJICAgIHx8IHR5cGRhdHVtLT5ib3VuZHMgPiBwLT5wX3R5cGVzLm5wcmltKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXAtPnBfdHlwZV92YWxfdG9fbmFtZVt0eXBkYXR1bS0+dmFsdWUgLSAxXSA9IGtleTsKKwkJcC0+dHlwZV92YWxfdG9fc3RydWN0W3R5cGRhdHVtLT52YWx1ZSAtIDFdID0gdHlwZGF0dW07CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yODUsNyArMjk2LDkgQEAKIAogCXVzcmRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwotCWlmICghdXNyZGF0dW0tPnZhbHVlIHx8IHVzcmRhdHVtLT52YWx1ZSA+IHAtPnBfdXNlcnMubnByaW0pCisJaWYgKCF1c3JkYXR1bS0+dmFsdWUKKwkgICAgfHwgdXNyZGF0dW0tPnZhbHVlID4gcC0+cF91c2Vycy5ucHJpbQorCSAgICB8fCB1c3JkYXR1bS0+Ym91bmRzID4gcC0+cF91c2Vycy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcC0+cF91c2VyX3ZhbF90b19uYW1lW3VzcmRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdFt1c3JkYXR1bS0+dmFsdWUgLSAxXSA9IHVzcmRhdHVtOwpAQCAtNDM4LDYgKzQ1MSwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlwLT50eXBlX3ZhbF90b19zdHJ1Y3QgPQorCQlrbWFsbG9jKHAtPnBfdHlwZXMubnByaW0gKiBzaXplb2YoKihwLT50eXBlX3ZhbF90b19zdHJ1Y3QpKSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghcC0+dHlwZV92YWxfdG9fc3RydWN0KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKGNvbmRfaW5pdF9ib29sX2luZGV4ZXMocCkpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTYyNSw2ICs2NDYsNyBAQAogCWtmcmVlKHAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpOwogCWtmcmVlKHAtPnJvbGVfdmFsX3RvX3N0cnVjdCk7CiAJa2ZyZWUocC0+dXNlcl92YWxfdG9fc3RydWN0KTsKKwlrZnJlZShwLT50eXBlX3ZhbF90b19zdHJ1Y3QpOwogCiAJYXZ0YWJfZGVzdHJveSgmcC0+dGVfYXZ0YWIpOwogCkBAIC05MzIsNyArOTU0LDcgQEAKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKLQlrZXlbbGVuXSA9IDA7CisJa2V5W2xlbl0gPSAnXDAnOwogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIHBlcmRhdHVtKTsKIAlpZiAocmMpCkBAIC05NzksNyArMTAwMSw3IEBACiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBiYWQ7Ci0Ja2V5W2xlbl0gPSAwOworCWtleVtsZW5dID0gJ1wwJzsKIAogCWZvciAoaSA9IDA7IGkgPCBuZWw7IGkrKykgewogCQlyYyA9IHBlcm1fcmVhZChwLCBjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIGZwKTsKQEAgLTExMTcsNyArMTEzOSw3IEBACiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBiYWQ7Ci0Ja2V5W2xlbl0gPSAwOworCWtleVtsZW5dID0gJ1wwJzsKIAogCWlmIChsZW4yKSB7CiAJCWNsYWRhdHVtLT5jb21rZXkgPSBrbWFsbG9jKGxlbjIgKyAxLCBHRlBfS0VSTkVMKTsKQEAgLTExMjgsNyArMTE1MCw3IEBACiAJCXJjID0gbmV4dF9lbnRyeShjbGFkYXR1bS0+Y29ta2V5LCBmcCwgbGVuMik7CiAJCWlmIChyYyA8IDApCiAJCQlnb3RvIGJhZDsKLQkJY2xhZGF0dW0tPmNvbWtleVtsZW4yXSA9IDA7CisJCWNsYWRhdHVtLT5jb21rZXlbbGVuMl0gPSAnXDAnOwogCiAJCWNsYWRhdHVtLT5jb21kYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY29tbW9ucy50YWJsZSwKIAkJCQkJCSAgICBjbGFkYXR1bS0+Y29ta2V5KTsKQEAgLTExNzYsOCArMTE5OCw4IEBACiB7CiAJY2hhciAqa2V5ID0gTlVMTDsKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqcm9sZTsKLQlpbnQgcmM7Ci0JX19sZTMyIGJ1ZlsyXTsKKwlpbnQgcmMsIHRvX3JlYWQgPSAyOworCV9fbGUzMiBidWZbM107CiAJdTMyIGxlbjsKIAogCXJvbGUgPSBremFsbG9jKHNpemVvZigqcm9sZSksIEdGUF9LRVJORUwpOwpAQCAtMTE4NiwxMiArMTIwOCwxNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7CisJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKKwkJdG9fcmVhZCA9IDM7CisKKwlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKGJ1ZlswXSkgKiB0b19yZWFkKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJcm9sZS0+dmFsdWUgPSBsZTMyX3RvX2NwdShidWZbMV0pOworCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCisJCXJvbGUtPmJvdW5kcyA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CiAKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICgha2V5KSB7CkBAIC0xMjAxLDcgKzEyMjgsNyBAQAogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwogCWlmIChyYyA8IDApCiAJCWdvdG8gYmFkOwotCWtleVtsZW5dID0gMDsKKwlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGViaXRtYXBfcmVhZCgmcm9sZS0+ZG9taW5hdGVzLCBmcCk7CiAJaWYgKHJjKQpAQCAtMTIzNiw4ICsxMjYzLDggQEAKIHsKIAljaGFyICprZXkgPSBOVUxMOwogCXN0cnVjdCB0eXBlX2RhdHVtICp0eXBkYXR1bTsKLQlpbnQgcmM7Ci0JX19sZTMyIGJ1ZlszXTsKKwlpbnQgcmMsIHRvX3JlYWQgPSAzOworCV9fbGUzMiBidWZbNF07CiAJdTMyIGxlbjsKIAogCXR5cGRhdHVtID0ga3phbGxvYyhzaXplb2YoKnR5cGRhdHVtKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjQ2LDEzICsxMjczLDI3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7CisJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKKwkJdG9fcmVhZCA9IDQ7CisKKwlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKGJ1ZlswXSkgKiB0b19yZWFkKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJdHlwZGF0dW0tPnZhbHVlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKLQl0eXBkYXR1bS0+cHJpbWFyeSA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CisJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkgeworCQl1MzIgcHJvcCA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CisKKwkJaWYgKHByb3AgJiBUWVBFREFUVU1fUFJPUEVSVFlfUFJJTUFSWSkKKwkJCXR5cGRhdHVtLT5wcmltYXJ5ID0gMTsKKwkJaWYgKHByb3AgJiBUWVBFREFUVU1fUFJPUEVSVFlfQVRUUklCVVRFKQorCQkJdHlwZGF0dW0tPmF0dHJpYnV0ZSA9IDE7CisKKwkJdHlwZGF0dW0tPmJvdW5kcyA9IGxlMzJfdG9fY3B1KGJ1ZlszXSk7CisJfSBlbHNlIHsKKwkJdHlwZGF0dW0tPnByaW1hcnkgPSBsZTMyX3RvX2NwdShidWZbMl0pOworCX0KIAogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFrZXkpIHsKQEAgLTEyNjIsNyArMTMwMyw3IEBACiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBiYWQ7Ci0Ja2V5W2xlbl0gPSAwOworCWtleVtsZW5dID0gJ1wwJzsKIAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCB0eXBkYXR1bSk7CiAJaWYgKHJjKQpAQCAtMTMwOSw4ICsxMzUwLDggQEAKIHsKIAljaGFyICprZXkgPSBOVUxMOwogCXN0cnVjdCB1c2VyX2RhdHVtICp1c3JkYXR1bTsKLQlpbnQgcmM7Ci0JX19sZTMyIGJ1ZlsyXTsKKwlpbnQgcmMsIHRvX3JlYWQgPSAyOworCV9fbGUzMiBidWZbM107CiAJdTMyIGxlbjsKIAogCXVzcmRhdHVtID0ga3phbGxvYyhzaXplb2YoKnVzcmRhdHVtKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMzE5LDEyICsxMzYwLDE3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKKwlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZKQorCQl0b19yZWFkID0gMzsKKworCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YoYnVmWzBdKSAqIHRvX3JlYWQpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAl1c3JkYXR1bS0+dmFsdWUgPSBsZTMyX3RvX2NwdShidWZbMV0pOworCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCisJCXVzcmRhdHVtLT5ib3VuZHMgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWtleSkgewpAQCAtMTMzNCw3ICsxMzgwLDcgQEAKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKLQlrZXlbbGVuXSA9IDA7CisJa2V5W2xlbl0gPSAnXDAnOwogCiAJcmMgPSBlYml0bWFwX3JlYWQoJnVzcmRhdHVtLT5yb2xlcywgZnApOwogCWlmIChyYykKQEAgLTEzODgsNyArMTQzNCw3IEBACiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBiYWQ7Ci0Ja2V5W2xlbl0gPSAwOworCWtleVtsZW5dID0gJ1wwJzsKIAogCWxldmRhdHVtLT5sZXZlbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbHNfbGV2ZWwpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWxldmRhdHVtLT5sZXZlbCkgewpAQCAtMTQ0MCw3ICsxNDg2LDcgQEAKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGJhZDsKLQlrZXlbbGVuXSA9IDA7CisJa2V5W2xlbl0gPSAnXDAnOwogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGNhdGRhdHVtKTsKIAlpZiAocmMpCkBAIC0xNDY1LDYgKzE1MTEsMTMzIEBACiAJY2F0X3JlYWQsCiB9OwogCitzdGF0aWMgaW50IHVzZXJfYm91bmRzX3Nhbml0eV9jaGVjayh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpkYXRhcCkKK3sKKwlzdHJ1Y3QgdXNlcl9kYXR1bSAqdXBwZXIsICp1c2VyOworCXN0cnVjdCBwb2xpY3lkYiAqcCA9IGRhdGFwOworCWludCBkZXB0aCA9IDA7CisKKwl1cHBlciA9IHVzZXIgPSBkYXR1bTsKKwl3aGlsZSAodXBwZXItPmJvdW5kcykgeworCQlzdHJ1Y3QgZWJpdG1hcF9ub2RlICpub2RlOworCQl1bnNpZ25lZCBsb25nIGJpdDsKKworCQlpZiAoKytkZXB0aCA9PSBQT0xJQ1lEQl9CT1VORFNfTUFYREVQVEgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogdXNlciAlczogIgorCQkJICAgICAgICJ0b28gZGVlcCBvciBsb29wZWQgYm91bmRhcnkiLAorCQkJICAgICAgIChjaGFyICopIGtleSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXVwcGVyID0gcC0+dXNlcl92YWxfdG9fc3RydWN0W3VwcGVyLT5ib3VuZHMgLSAxXTsKKwkJZWJpdG1hcF9mb3JfZWFjaF9wb3NpdGl2ZV9iaXQoJnVzZXItPnJvbGVzLCBub2RlLCBiaXQpIHsKKwkJCWlmIChlYml0bWFwX2dldF9iaXQoJnVwcGVyLT5yb2xlcywgYml0KSkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlNFTGludXg6IGJvdW5kYXJ5IHZpb2xhdGVkIHBvbGljeTogIgorCQkJICAgICAgICJ1c2VyPSVzIHJvbGU9JXMgYm91bmRzPSVzXG4iLAorCQkJICAgICAgIHAtPnBfdXNlcl92YWxfdG9fbmFtZVt1c2VyLT52YWx1ZSAtIDFdLAorCQkJICAgICAgIHAtPnBfcm9sZV92YWxfdG9fbmFtZVtiaXRdLAorCQkJICAgICAgIHAtPnBfdXNlcl92YWxfdG9fbmFtZVt1cHBlci0+dmFsdWUgLSAxXSk7CisKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9sZV9ib3VuZHNfc2FuaXR5X2NoZWNrKHZvaWQgKmtleSwgdm9pZCAqZGF0dW0sIHZvaWQgKmRhdGFwKQoreworCXN0cnVjdCByb2xlX2RhdHVtICp1cHBlciwgKnJvbGU7CisJc3RydWN0IHBvbGljeWRiICpwID0gZGF0YXA7CisJaW50IGRlcHRoID0gMDsKKworCXVwcGVyID0gcm9sZSA9IGRhdHVtOworCXdoaWxlICh1cHBlci0+Ym91bmRzKSB7CisJCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGU7CisJCXVuc2lnbmVkIGxvbmcgYml0OworCisJCWlmICgrK2RlcHRoID09IFBPTElDWURCX0JPVU5EU19NQVhERVBUSCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiByb2xlICVzOiAiCisJCQkgICAgICAgInRvbyBkZWVwIG9yIGxvb3BlZCBib3VuZHNcbiIsCisJCQkgICAgICAgKGNoYXIgKikga2V5KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdXBwZXIgPSBwLT5yb2xlX3ZhbF90b19zdHJ1Y3RbdXBwZXItPmJvdW5kcyAtIDFdOworCQllYml0bWFwX2Zvcl9lYWNoX3Bvc2l0aXZlX2JpdCgmcm9sZS0+dHlwZXMsIG5vZGUsIGJpdCkgeworCQkJaWYgKGViaXRtYXBfZ2V0X2JpdCgmdXBwZXItPnR5cGVzLCBiaXQpKQorCQkJCWNvbnRpbnVlOworCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiU0VMaW51eDogYm91bmRhcnkgdmlvbGF0ZWQgcG9saWN5OiAiCisJCQkgICAgICAgInJvbGU9JXMgdHlwZT0lcyBib3VuZHM9JXNcbiIsCisJCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW3JvbGUtPnZhbHVlIC0gMV0sCisJCQkgICAgICAgcC0+cF90eXBlX3ZhbF90b19uYW1lW2JpdF0sCisJCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW3VwcGVyLT52YWx1ZSAtIDFdKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0eXBlX2JvdW5kc19zYW5pdHlfY2hlY2sodm9pZCAqa2V5LCB2b2lkICpkYXR1bSwgdm9pZCAqZGF0YXApCit7CisJc3RydWN0IHR5cGVfZGF0dW0gKnVwcGVyLCAqdHlwZTsKKwlzdHJ1Y3QgcG9saWN5ZGIgKnAgPSBkYXRhcDsKKwlpbnQgZGVwdGggPSAwOworCisJdXBwZXIgPSB0eXBlID0gZGF0dW07CisJd2hpbGUgKHVwcGVyLT5ib3VuZHMpIHsKKwkJaWYgKCsrZGVwdGggPT0gUE9MSUNZREJfQk9VTkRTX01BWERFUFRIKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IHR5cGUgJXM6ICIKKwkJCSAgICAgICAidG9vIGRlZXAgb3IgbG9vcGVkIGJvdW5kYXJ5XG4iLAorCQkJICAgICAgIChjaGFyICopIGtleSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXVwcGVyID0gcC0+dHlwZV92YWxfdG9fc3RydWN0W3VwcGVyLT5ib3VuZHMgLSAxXTsKKwkJaWYgKHVwcGVyLT5hdHRyaWJ1dGUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogdHlwZSAlczogIgorCQkJICAgICAgICJib3VuZGVkIGJ5IGF0dHJpYnV0ZSAlcyIsCisJCQkgICAgICAgKGNoYXIgKikga2V5LAorCQkJICAgICAgIHAtPnBfdHlwZV92YWxfdG9fbmFtZVt1cHBlci0+dmFsdWUgLSAxXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvbGljeWRiX2JvdW5kc19zYW5pdHlfY2hlY2soc3RydWN0IHBvbGljeWRiICpwKQoreworCWludCByYzsKKworCWlmIChwLT5wb2xpY3l2ZXJzIDwgUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IGhhc2h0YWJfbWFwKHAtPnBfdXNlcnMudGFibGUsCisJCQkgdXNlcl9ib3VuZHNfc2FuaXR5X2NoZWNrLCBwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gaGFzaHRhYl9tYXAocC0+cF9yb2xlcy50YWJsZSwKKwkJCSByb2xlX2JvdW5kc19zYW5pdHlfY2hlY2ssIHApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBoYXNodGFiX21hcChwLT5wX3R5cGVzLnRhYmxlLAorCQkJIHR5cGVfYm91bmRzX3Nhbml0eV9jaGVjaywgcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKwogZXh0ZXJuIGludCBzc19pbml0aWFsaXplZDsKIAogLyoKQEAgLTE1MjMsNyArMTY5Niw3IEBACiAJCWtmcmVlKHBvbGljeWRiX3N0cik7CiAJCWdvdG8gYmFkOwogCX0KLQlwb2xpY3lkYl9zdHJbbGVuXSA9IDA7CisJcG9saWN5ZGJfc3RyW2xlbl0gPSAnXDAnOwogCWlmIChzdHJjbXAocG9saWN5ZGJfc3RyLCBQT0xJQ1lEQl9TVFJJTkcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHBvbGljeWRiIHN0cmluZyAlcyBkb2VzIG5vdCBtYXRjaCAiCiAJCSAgICAgICAibXkgc3RyaW5nICVzXG4iLCBwb2xpY3lkYl9zdHIsIFBPTElDWURCX1NUUklORyk7CkBAIC0xOTYxLDYgKzIxMzQsMTAgQEAKIAkJCQlnb3RvIGJhZDsKIAl9CiAKKwlyYyA9IHBvbGljeWRiX2JvdW5kc19zYW5pdHlfY2hlY2socCk7CisJaWYgKHJjKQorCQlnb3RvIGJhZDsKKwogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKaW5kZXggNDI1MzM3MC4uNTUxNTJkNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaApAQCAtNjEsNiArNjEsNyBAQAogLyogUm9sZSBhdHRyaWJ1dGVzICovCiBzdHJ1Y3Qgcm9sZV9kYXR1bSB7CiAJdTMyIHZhbHVlOwkJCS8qIGludGVybmFsIHJvbGUgdmFsdWUgKi8KKwl1MzIgYm91bmRzOwkJCS8qIGJvdW5kYXJ5IG9mIHJvbGUgKi8KIAlzdHJ1Y3QgZWJpdG1hcCBkb21pbmF0ZXM7CS8qIHNldCBvZiByb2xlcyBkb21pbmF0ZWQgYnkgdGhpcyByb2xlICovCiAJc3RydWN0IGViaXRtYXAgdHlwZXM7CQkvKiBzZXQgb2YgYXV0aG9yaXplZCB0eXBlcyBmb3Igcm9sZSAqLwogfTsKQEAgLTgxLDEyICs4MiwxNSBAQAogLyogVHlwZSBhdHRyaWJ1dGVzICovCiBzdHJ1Y3QgdHlwZV9kYXR1bSB7CiAJdTMyIHZhbHVlOwkJLyogaW50ZXJuYWwgdHlwZSB2YWx1ZSAqLworCXUzMiBib3VuZHM7CQkvKiBib3VuZGFyeSBvZiB0eXBlICovCiAJdW5zaWduZWQgY2hhciBwcmltYXJ5OwkvKiBwcmltYXJ5IG5hbWU/ICovCisJdW5zaWduZWQgY2hhciBhdHRyaWJ1dGU7LyogYXR0cmlidXRlID8qLwogfTsKIAogLyogVXNlciBhdHRyaWJ1dGVzICovCiBzdHJ1Y3QgdXNlcl9kYXR1bSB7CiAJdTMyIHZhbHVlOwkJCS8qIGludGVybmFsIHVzZXIgdmFsdWUgKi8KKwl1MzIgYm91bmRzOwkJCS8qIGJvdW5kcyBvZiB1c2VyICovCiAJc3RydWN0IGViaXRtYXAgcm9sZXM7CQkvKiBzZXQgb2YgYXV0aG9yaXplZCByb2xlcyBmb3IgdXNlciAqLwogCXN0cnVjdCBtbHNfcmFuZ2UgcmFuZ2U7CQkvKiBNTFMgcmFuZ2UgKG1pbiAtIG1heCkgZm9yIHVzZXIgKi8KIAlzdHJ1Y3QgbWxzX2xldmVsIGRmbHRsZXZlbDsJLyogZGVmYXVsdCBsb2dpbiBNTFMgbGV2ZWwgZm9yIHVzZXIgKi8KQEAgLTIwOSw2ICsyMTMsNyBAQAogCXN0cnVjdCBjbGFzc19kYXR1bSAqKmNsYXNzX3ZhbF90b19zdHJ1Y3Q7CiAJc3RydWN0IHJvbGVfZGF0dW0gKipyb2xlX3ZhbF90b19zdHJ1Y3Q7CiAJc3RydWN0IHVzZXJfZGF0dW0gKip1c2VyX3ZhbF90b19zdHJ1Y3Q7CisJc3RydWN0IHR5cGVfZGF0dW0gKip0eXBlX3ZhbF90b19zdHJ1Y3Q7CiAKIAkvKiB0eXBlIGVuZm9yY2VtZW50IGFjY2VzcyB2ZWN0b3JzIGFuZCB0cmFuc2l0aW9ucyAqLwogCXN0cnVjdCBhdnRhYiB0ZV9hdnRhYjsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCBkMTFhODE1Li4zNDNjOGFiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC04OCw2ICs4OCwxMSBAQAogc3RhdGljIGludCBjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsIGNoYXIgKipzY29udGV4dCwKIAkJCQkgICAgdTMyICpzY29udGV4dF9sZW4pOwogCitzdGF0aWMgaW50IGNvbnRleHRfc3RydWN0X2NvbXB1dGVfYXYoc3RydWN0IGNvbnRleHQgKnNjb250ZXh0LAorCQkJCSAgICAgc3RydWN0IGNvbnRleHQgKnRjb250ZXh0LAorCQkJCSAgICAgdTE2IHRjbGFzcywKKwkJCQkgICAgIHUzMiByZXF1ZXN0ZWQsCisJCQkJICAgICBzdHJ1Y3QgYXZfZGVjaXNpb24gKmF2ZCk7CiAvKgogICogUmV0dXJuIHRoZSBib29sZWFuIHZhbHVlIG9mIGEgY29uc3RyYWludCBleHByZXNzaW9uCiAgKiB3aGVuIGl0IGlzIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRhcmdldApAQCAtMjc0LDYgKzI3OSwxMDAgQEAKIH0KIAogLyoKKyAqIHNlY3VyaXR5X2JvdW5kYXJ5X3Blcm1pc3Npb24gLSBkcm9wcyB2aW9sYXRlZCBwZXJtaXNzaW9ucworICogb24gYm91bmRhcnkgY29uc3RyYWludC4KKyAqLworc3RhdGljIHZvaWQgdHlwZV9hdHRyaWJ1dGVfYm91bmRzX2F2KHN0cnVjdCBjb250ZXh0ICpzY29udGV4dCwKKwkJCQkgICAgIHN0cnVjdCBjb250ZXh0ICp0Y29udGV4dCwKKwkJCQkgICAgIHUxNiB0Y2xhc3MsCisJCQkJICAgICB1MzIgcmVxdWVzdGVkLAorCQkJCSAgICAgc3RydWN0IGF2X2RlY2lzaW9uICphdmQpCit7CisJc3RydWN0IGNvbnRleHQgbG9fc2NvbnRleHQ7CisJc3RydWN0IGNvbnRleHQgbG9fdGNvbnRleHQ7CisJc3RydWN0IGF2X2RlY2lzaW9uIGxvX2F2ZDsKKwlzdHJ1Y3QgdHlwZV9kYXR1bSAqc291cmNlCisJCT0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W3Njb250ZXh0LT50eXBlIC0gMV07CisJc3RydWN0IHR5cGVfZGF0dW0gKnRhcmdldAorCQk9IHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdFt0Y29udGV4dC0+dHlwZSAtIDFdOworCXUzMiBtYXNrZWQgPSAwOworCisJaWYgKHNvdXJjZS0+Ym91bmRzKSB7CisJCW1lbXNldCgmbG9fYXZkLCAwLCBzaXplb2YobG9fYXZkKSk7CisKKwkJbWVtY3B5KCZsb19zY29udGV4dCwgc2NvbnRleHQsIHNpemVvZihsb19zY29udGV4dCkpOworCQlsb19zY29udGV4dC50eXBlID0gc291cmNlLT5ib3VuZHM7CisKKwkJY29udGV4dF9zdHJ1Y3RfY29tcHV0ZV9hdigmbG9fc2NvbnRleHQsCisJCQkJCSAgdGNvbnRleHQsCisJCQkJCSAgdGNsYXNzLAorCQkJCQkgIHJlcXVlc3RlZCwKKwkJCQkJICAmbG9fYXZkKTsKKwkJaWYgKChsb19hdmQuYWxsb3dlZCAmIGF2ZC0+YWxsb3dlZCkgPT0gYXZkLT5hbGxvd2VkKQorCQkJcmV0dXJuOwkJLyogbm8gbWFza2VkIHBlcm1pc3Npb24gKi8KKwkJbWFza2VkID0gfmxvX2F2ZC5hbGxvd2VkICYgYXZkLT5hbGxvd2VkOworCX0KKworCWlmICh0YXJnZXQtPmJvdW5kcykgeworCQltZW1zZXQoJmxvX2F2ZCwgMCwgc2l6ZW9mKGxvX2F2ZCkpOworCisJCW1lbWNweSgmbG9fdGNvbnRleHQsIHRjb250ZXh0LCBzaXplb2YobG9fdGNvbnRleHQpKTsKKwkJbG9fdGNvbnRleHQudHlwZSA9IHRhcmdldC0+Ym91bmRzOworCisJCWNvbnRleHRfc3RydWN0X2NvbXB1dGVfYXYoc2NvbnRleHQsCisJCQkJCSAgJmxvX3Rjb250ZXh0LAorCQkJCQkgIHRjbGFzcywKKwkJCQkJICByZXF1ZXN0ZWQsCisJCQkJCSAgJmxvX2F2ZCk7CisJCWlmICgobG9fYXZkLmFsbG93ZWQgJiBhdmQtPmFsbG93ZWQpID09IGF2ZC0+YWxsb3dlZCkKKwkJCXJldHVybjsJCS8qIG5vIG1hc2tlZCBwZXJtaXNzaW9uICovCisJCW1hc2tlZCA9IH5sb19hdmQuYWxsb3dlZCAmIGF2ZC0+YWxsb3dlZDsKKwl9CisKKwlpZiAoc291cmNlLT5ib3VuZHMgJiYgdGFyZ2V0LT5ib3VuZHMpIHsKKwkJbWVtc2V0KCZsb19hdmQsIDAsIHNpemVvZihsb19hdmQpKTsKKwkJLyoKKwkJICogbG9fc2NvbnRleHQgYW5kIGxvX3Rjb250ZXh0IGFyZSBhbHJlYWR5CisJCSAqIHNldCB1cC4KKwkJICovCisKKwkJY29udGV4dF9zdHJ1Y3RfY29tcHV0ZV9hdigmbG9fc2NvbnRleHQsCisJCQkJCSAgJmxvX3Rjb250ZXh0LAorCQkJCQkgIHRjbGFzcywKKwkJCQkJICByZXF1ZXN0ZWQsCisJCQkJCSAgJmxvX2F2ZCk7CisJCWlmICgobG9fYXZkLmFsbG93ZWQgJiBhdmQtPmFsbG93ZWQpID09IGF2ZC0+YWxsb3dlZCkKKwkJCXJldHVybjsJCS8qIG5vIG1hc2tlZCBwZXJtaXNzaW9uICovCisJCW1hc2tlZCA9IH5sb19hdmQuYWxsb3dlZCAmIGF2ZC0+YWxsb3dlZDsKKwl9CisKKwlpZiAobWFza2VkKSB7CisJCXN0cnVjdCBhdWRpdF9idWZmZXIgKmFiOworCQljaGFyICpzdHlwZV9uYW1lCisJCQk9IHBvbGljeWRiLnBfdHlwZV92YWxfdG9fbmFtZVtzb3VyY2UtPnZhbHVlIC0gMV07CisJCWNoYXIgKnR0eXBlX25hbWUKKwkJCT0gcG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW3RhcmdldC0+dmFsdWUgLSAxXTsKKwkJY2hhciAqdGNsYXNzX25hbWUKKwkJCT0gcG9saWN5ZGIucF9jbGFzc192YWxfdG9fbmFtZVt0Y2xhc3MgLSAxXTsKKworCQkvKiBtYXNrIHZpb2xhdGVkIHBlcm1pc3Npb25zICovCisJCWF2ZC0+YWxsb3dlZCAmPSB+bWFza2VkOworCisJCS8qIG5vdGljZSB0byB1c2Vyc3BhY2UgdmlhIGF1ZGl0IG1lc3NhZ2UgKi8KKwkJYWIgPSBhdWRpdF9sb2dfc3RhcnQoY3VycmVudC0+YXVkaXRfY29udGV4dCwKKwkJCQkgICAgIEdGUF9BVE9NSUMsIEFVRElUX1NFTElOVVhfRVJSKTsKKwkJaWYgKCFhYikKKwkJCXJldHVybjsKKworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiYXYgYm91bmRhcnkgdmlvbGF0aW9uOiAiCisJCQkJICJzb3VyY2U9JXMgdGFyZ2V0PSVzIHRjbGFzcz0lcyIsCisJCQkJIHN0eXBlX25hbWUsIHR0eXBlX25hbWUsIHRjbGFzc19uYW1lKTsKKwkJYXZjX2R1bXBfYXYoYWIsIHRjbGFzcywgbWFza2VkKTsKKwkJYXVkaXRfbG9nX2VuZChhYik7CisJfQorfQorCisvKgogICogQ29tcHV0ZSBhY2Nlc3MgdmVjdG9ycyBiYXNlZCBvbiBhIGNvbnRleHQgc3RydWN0dXJlIHBhaXIgZm9yCiAgKiB0aGUgcGVybWlzc2lvbnMgaW4gYSBwYXJ0aWN1bGFyIGNsYXNzLgogICovCkBAIC0zNTYsNyArNDU1LDcgQEAKIAkJCWF2a2V5LnNvdXJjZV90eXBlID0gaSArIDE7CiAJCQlhdmtleS50YXJnZXRfdHlwZSA9IGogKyAxOwogCQkJZm9yIChub2RlID0gYXZ0YWJfc2VhcmNoX25vZGUoJnBvbGljeWRiLnRlX2F2dGFiLCAmYXZrZXkpOwotCQkJICAgICBub2RlICE9IE5VTEw7CisJCQkgICAgIG5vZGU7CiAJCQkgICAgIG5vZGUgPSBhdnRhYl9zZWFyY2hfbm9kZV9uZXh0KG5vZGUsIGF2a2V5LnNwZWNpZmllZCkpIHsKIAkJCQlpZiAobm9kZS0+a2V5LnNwZWNpZmllZCA9PSBBVlRBQl9BTExPV0VEKQogCQkJCQlhdmQtPmFsbG93ZWQgfD0gbm9kZS0+ZGF0dW0uZGF0YTsKQEAgLTQwNCw2ICs1MDMsMTQgQEAKIAkJCQkJCQlQUk9DRVNTX19EWU5UUkFOU0lUSU9OKTsKIAl9CiAKKwkvKgorCSAqIElmIHRoZSBnaXZlbiBzb3VyY2UgYW5kIHRhcmdldCB0eXBlcyBoYXZlIGJvdW5kYXJ5CisJICogY29uc3RyYWludCwgbGF6eSBjaGVja3MgaGF2ZSB0byBtYXNrIGFueSB2aW9sYXRlZAorCSAqIHBlcm1pc3Npb24gYW5kIG5vdGljZSBpdCB0byB1c2Vyc3BhY2UgdmlhIGF1ZGl0LgorCSAqLworCXR5cGVfYXR0cmlidXRlX2JvdW5kc19hdihzY29udGV4dCwgdGNvbnRleHQsCisJCQkJIHRjbGFzcywgcmVxdWVzdGVkLCBhdmQpOworCiAJcmV0dXJuIDA7CiAKIGludmFsX2NsYXNzOgpAQCAtNTQ5LDYgKzY1Niw2OSBAQAogCXJldHVybiByYzsKIH0KIAorLyoKKyAqIHNlY3VyaXR5X2JvdW5kZWRfdHJhbnNpdGlvbiAtIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuCisgKiB0cmFuc2l0aW9uIGlzIGRpcmVjdGVkIHRvIGJvdW5kZWQsIG9yIG5vdC4KKyAqIEl0IHJldHVybnMgMCwgaWYgQG5ld3NpZCBpcyBib3VuZGVkIGJ5IEBvbGRzaWQuCisgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgZXJyb3IgY29kZS4KKyAqCisgKiBAb2xkc2lkIDogY3VycmVudCBzZWN1cml0eSBpZGVudGlmaWVyCisgKiBAbmV3c2lkIDogZGVzdGluYXRlZCBzZWN1cml0eSBpZGVudGlmaWVyCisgKi8KK2ludCBzZWN1cml0eV9ib3VuZGVkX3RyYW5zaXRpb24odTMyIG9sZF9zaWQsIHUzMiBuZXdfc2lkKQoreworCXN0cnVjdCBjb250ZXh0ICpvbGRfY29udGV4dCwgKm5ld19jb250ZXh0OworCXN0cnVjdCB0eXBlX2RhdHVtICp0eXBlOworCWludCBpbmRleDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKKworCW9sZF9jb250ZXh0ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBvbGRfc2lkKTsKKwlpZiAoIW9sZF9jb250ZXh0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6IHVucmVjb2duaXplZCBTSUQgJXVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgb2xkX3NpZCk7CisJCWdvdG8gb3V0OworCX0KKworCW5ld19jb250ZXh0ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBuZXdfc2lkKTsKKwlpZiAoIW5ld19jb250ZXh0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6IHVucmVjb2duaXplZCBTSUQgJXVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgbmV3X3NpZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHR5cGUvZG9tYWluIHVuY2hhbmVkICovCisJaWYgKG9sZF9jb250ZXh0LT50eXBlID09IG5ld19jb250ZXh0LT50eXBlKSB7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaW5kZXggPSBuZXdfY29udGV4dC0+dHlwZTsKKwl3aGlsZSAodHJ1ZSkgeworCQl0eXBlID0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W2luZGV4IC0gMV07CisJCUJVR19PTighdHlwZSk7CisKKwkJLyogbm90IGJvdW5kZWQgYW55bW9yZSAqLworCQlpZiAoIXR5cGUtPmJvdW5kcykgeworCQkJcmMgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCS8qIEBuZXdzaWQgaXMgYm91bmRlZCBieSBAb2xkc2lkICovCisJCWlmICh0eXBlLT5ib3VuZHMgPT0gb2xkX2NvbnRleHQtPnR5cGUpIHsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWluZGV4ID0gdHlwZS0+Ym91bmRzOworCX0KK291dDoKKwlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKwogLyoqCiAgKiBzZWN1cml0eV9jb21wdXRlX2F2IC0gQ29tcHV0ZSBhY2Nlc3MgdmVjdG9yIGRlY2lzaW9ucy4KICAqIEBzc2lkOiBzb3VyY2Ugc2VjdXJpdHkgaWRlbnRpZmllcgpAQCAtNzk0LDcgKzk2NCw3IEBACiAJKnArKyA9IDA7CiAKIAl0eXBkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHBvbC0+cF90eXBlcy50YWJsZSwgc2NvbnRleHRwKTsKLQlpZiAoIXR5cGRhdHVtKQorCWlmICghdHlwZGF0dW0gfHwgdHlwZGF0dW0tPmF0dHJpYnV0ZSkKIAkJZ290byBvdXQ7CiAKIAljdHgtPnR5cGUgPSB0eXBkYXR1bS0+dmFsdWU7CkBAIC0xMDM3LDcgKzEyMDcsNyBAQAogCS8qIElmIG5vIHBlcm1hbmVudCBydWxlLCBhbHNvIGNoZWNrIGZvciBlbmFibGVkIGNvbmRpdGlvbmFsIHJ1bGVzICovCiAJaWYgKCFhdmRhdHVtKSB7CiAJCW5vZGUgPSBhdnRhYl9zZWFyY2hfbm9kZSgmcG9saWN5ZGIudGVfY29uZF9hdnRhYiwgJmF2a2V5KTsKLQkJZm9yICg7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IGF2dGFiX3NlYXJjaF9ub2RlX25leHQobm9kZSwgc3BlY2lmaWVkKSkgeworCQlmb3IgKDsgbm9kZTsgbm9kZSA9IGF2dGFiX3NlYXJjaF9ub2RlX25leHQobm9kZSwgc3BlY2lmaWVkKSkgewogCQkJaWYgKG5vZGUtPmtleS5zcGVjaWZpZWQgJiBBVlRBQl9FTkFCTEVEKSB7CiAJCQkJYXZkYXR1bSA9ICZub2RlLT5kYXR1bTsKIAkJCQlicmVhazsKQEAgLTIwNTAsNyArMjIyMCw3IEBACiAJCQlwb2xpY3lkYi5ib29sX3ZhbF90b19zdHJ1Y3RbaV0tPnN0YXRlID0gMDsKIAl9CiAKLQlmb3IgKGN1ciA9IHBvbGljeWRiLmNvbmRfbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCWZvciAoY3VyID0gcG9saWN5ZGIuY29uZF9saXN0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgewogCQlyYyA9IGV2YWx1YXRlX2NvbmRfbm9kZSgmcG9saWN5ZGIsIGN1cik7CiAJCWlmIChyYykKIAkJCWdvdG8gb3V0OwpAQCAtMjEwMiw3ICsyMjcyLDcgQEAKIAkJaWYgKGJvb2xkYXR1bSkKIAkJCWJvb2xkYXR1bS0+c3RhdGUgPSBidmFsdWVzW2ldOwogCX0KLQlmb3IgKGN1ciA9IHAtPmNvbmRfbGlzdDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworCWZvciAoY3VyID0gcC0+Y29uZF9saXN0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgewogCQlyYyA9IGV2YWx1YXRlX2NvbmRfbm9kZShwLCBjdXIpOwogCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKQEAgLTI3MzcsNiArMjkwNyw3IEBACiAJCWlmIChjdHggPT0gTlVMTCkKIAkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKIAorCQljb250ZXh0X2luaXQoJmN0eF9uZXcpOwogCQljdHhfbmV3LnVzZXIgPSBjdHgtPnVzZXI7CiAJCWN0eF9uZXcucm9sZSA9IGN0eC0+cm9sZTsKIAkJY3R4X25ldy50eXBlID0gY3R4LT50eXBlOwpAQCAtMjc0NSwxMyArMjkxNiw5IEBACiAJCQlpZiAoZWJpdG1hcF9uZXRsYmxfaW1wb3J0KCZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCwKIAkJCQkJCSAgc2VjYXR0ci0+YXR0ci5tbHMuY2F0KSAhPSAwKQogCQkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKLQkJCWN0eF9uZXcucmFuZ2UubGV2ZWxbMV0uY2F0LmhpZ2hiaXQgPQotCQkJCWN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0LmhpZ2hiaXQ7Ci0JCQljdHhfbmV3LnJhbmdlLmxldmVsWzFdLmNhdC5ub2RlID0KLQkJCQljdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdC5ub2RlOwotCQl9IGVsc2UgewotCQkJZWJpdG1hcF9pbml0KCZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCk7Ci0JCQllYml0bWFwX2luaXQoJmN0eF9uZXcucmFuZ2UubGV2ZWxbMV0uY2F0KTsKKwkJCW1lbWNweSgmY3R4X25ldy5yYW5nZS5sZXZlbFsxXS5jYXQsCisJCQkgICAgICAgJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0LAorCQkJICAgICAgIHNpemVvZihjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCkpOwogCQl9CiAJCWlmIChtbHNfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJmN0eF9uZXcpICE9IDEpCiAJCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm5fY2xlYW51cDsKQEAgLTI3ODgsNyArMjk1NSw3IEBACiAgKi8KIGludCBzZWN1cml0eV9uZXRsYmxfc2lkX3RvX3NlY2F0dHIodTMyIHNpZCwgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKLQlpbnQgcmMgPSAtRU5PRU5UOworCWludCByYzsKIAlzdHJ1Y3QgY29udGV4dCAqY3R4OwogCiAJaWYgKCFzc19pbml0aWFsaXplZCkKQEAgLTI3OTYsMTEgKzI5NjMsMTggQEAKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwotCWlmIChjdHggPT0gTlVMTCkKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PRU5UOwogCQlnb3RvIG5ldGxibF9zaWRfdG9fc2VjYXR0cl9mYWlsdXJlOworCX0KIAlzZWNhdHRyLT5kb21haW4gPSBrc3RyZHVwKHBvbGljeWRiLnBfdHlwZV92YWxfdG9fbmFtZVtjdHgtPnR5cGUgLSAxXSwKIAkJCQkgIEdGUF9BVE9NSUMpOwotCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0RPTUFJTl9DUFk7CisJaWYgKHNlY2F0dHItPmRvbWFpbiA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBuZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZTsKKwl9CisJc2VjYXR0ci0+YXR0ci5zZWNpZCA9IHNpZDsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9ET01BSU5fQ1BZIHwgTkVUTEJMX1NFQ0FUVFJfU0VDSUQ7CiAJbWxzX2V4cG9ydF9uZXRsYmxfbHZsKGN0eCwgc2VjYXR0cik7CiAJcmMgPSBtbHNfZXhwb3J0X25ldGxibF9jYXQoY3R4LCBzZWNhdHRyKTsKIAlpZiAocmMgIT0gMCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5jCmluZGV4IGE4MWRlZDEuLmU4MTc5ODkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYwpAQCAtNDMsNyArNDMsNyBAQAogCWh2YWx1ZSA9IFNJRFRBQl9IQVNIKHNpZCk7CiAJcHJldiA9IE5VTEw7CiAJY3VyID0gcy0+aHRhYmxlW2h2YWx1ZV07Ci0Jd2hpbGUgKGN1ciAhPSBOVUxMICYmIHNpZCA+IGN1ci0+c2lkKSB7CisJd2hpbGUgKGN1ciAmJiBzaWQgPiBjdXItPnNpZCkgewogCQlwcmV2ID0gY3VyOwogCQljdXIgPSBjdXItPm5leHQ7CiAJfQpAQCAtOTIsNyArOTIsNyBAQAogCiAJaHZhbHVlID0gU0lEVEFCX0hBU0goc2lkKTsKIAljdXIgPSBzLT5odGFibGVbaHZhbHVlXTsKLQl3aGlsZSAoY3VyICE9IE5VTEwgJiYgc2lkID4gY3VyLT5zaWQpCisJd2hpbGUgKGN1ciAmJiBzaWQgPiBjdXItPnNpZCkKIAkJY3VyID0gY3VyLT5uZXh0OwogCiAJaWYgKGZvcmNlICYmIGN1ciAmJiBzaWQgPT0gY3VyLT5zaWQgJiYgY3VyLT5jb250ZXh0LmxlbikKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQlzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKIAkJaHZhbHVlID0gU0lEVEFCX0hBU0goc2lkKTsKIAkJY3VyID0gcy0+aHRhYmxlW2h2YWx1ZV07Ci0JCXdoaWxlIChjdXIgIT0gTlVMTCAmJiBzaWQgPiBjdXItPnNpZCkKKwkJd2hpbGUgKGN1ciAmJiBzaWQgPiBjdXItPnNpZCkKIAkJCWN1ciA9IGN1ci0+bmV4dDsKIAkJaWYgKCFjdXIgfHwgc2lkICE9IGN1ci0+c2lkKQogCQkJcmV0dXJuIE5VTEw7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBTSURUQUJfU0laRTsgaSsrKSB7CiAJCWN1ciA9IHMtPmh0YWJsZVtpXTsKLQkJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CisJCXdoaWxlIChjdXIpIHsKIAkJCXJjID0gYXBwbHkoY3VyLT5zaWQsICZjdXItPmNvbnRleHQsIGFyZ3MpOwogCQkJaWYgKHJjKQogCQkJCWdvdG8gb3V0OwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX1NJWkU7IGkrKykgewogCQljdXIgPSBzLT5odGFibGVbaV07Ci0JCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQl3aGlsZSAoY3VyKSB7CiAJCQlpZiAoY29udGV4dF9jbXAoJmN1ci0+Y29udGV4dCwgY29udGV4dCkpCiAJCQkJcmV0dXJuIGN1ci0+c2lkOwogCQkJY3VyID0gY3VyLT5uZXh0OwpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX1NJWkU7IGkrKykgewogCQljdXIgPSBzLT5odGFibGVbaV07Ci0JCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQl3aGlsZSAoY3VyKSB7CiAJCQl0ZW1wID0gY3VyOwogCQkJY3VyID0gY3VyLT5uZXh0OwogCQkJY29udGV4dF9kZXN0cm95KCZ0ZW1wLT5jb250ZXh0KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmggYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCmluZGV4IDRhNDQ3N2YuLjMxZGNlNTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2suaApAQCAtMTc4LDYgKzE3OCw3IEBACiBleHRlcm4gaW50IHNtYWNrX2NpcHNvX2RpcmVjdDsKIGV4dGVybiBpbnQgc21hY2tfbmV0X25sdHlwZTsKIGV4dGVybiBjaGFyICpzbWFja19uZXRfYW1iaWVudDsKK2V4dGVybiBjaGFyICpzbWFja19vbmx5Y2FwOwogCiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duICpzbWFja19rbm93bjsKIGV4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fZmxvb3I7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCmluZGV4IGY2YjVmNmUuLjc5ZmYyMWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCkBAIC0xNTcsNyArMTU3LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgY3VycmVudCBzdWJqZWN0IGxhYmVsL29iamVjdCBsYWJlbCBwYWlyCiAgKiBpbiB0aGUgYWNjZXNzIHJ1bGUgbGlzdCBhbmQgcmV0dXJucyAwIGlmIHRoZSBhY2Nlc3MgaXMgcGVybWl0dGVkLAotICogbm9uIHplcm8gb3RoZXJ3aXNlLiBJdCBhbGxvd3MgdGhhdCBjdXJyZW50IG15IGhhdmUgdGhlIGNhcGFiaWxpdHkKKyAqIG5vbiB6ZXJvIG90aGVyd2lzZS4gSXQgYWxsb3dzIHRoYXQgY3VycmVudCBtYXkgaGF2ZSB0aGUgY2FwYWJpbGl0eQogICogdG8gb3ZlcnJpZGUgdGhlIHJ1bGVzLgogICovCiBpbnQgc21rX2N1cmFjYyhjaGFyICpvYmpfbGFiZWwsIHUzMiBtb2RlKQpAQCAtMTY4LDYgKzE2OCwxNCBAQAogCWlmIChyYyA9PSAwKQogCQlyZXR1cm4gMDsKIAorCS8qCisJICogUmV0dXJuIGlmIGEgc3BlY2lmaWMgbGFiZWwgaGFzIGJlZW4gZGVzaWduYXRlZCBhcyB0aGUKKwkgKiBvbmx5IG9uZSB0aGF0IGdldHMgcHJpdmlsZWdlIGFuZCBjdXJyZW50IGRvZXMgbm90CisJICogaGF2ZSB0aGF0IGxhYmVsLgorCSAqLworCWlmIChzbWFja19vbmx5Y2FwICE9IE5VTEwgJiYgc21hY2tfb25seWNhcCAhPSBjdXJyZW50LT5zZWN1cml0eSkKKwkJcmV0dXJuIHJjOworCiAJaWYgKGNhcGFibGUoQ0FQX01BQ19PVkVSUklERSkpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IDg3ZDc1NDEuLjZlMmRjMGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC0yMTc5LDcgKzIxNzksMTAgQEAKIAkgKiBUaGlzIGlzIHRoZSBzaW1wbGlzdCBwb3NzaWJsZSBzZWN1cml0eSBtb2RlbAogCSAqIGZvciBuZXR3b3JraW5nLgogCSAqLwotCXJldHVybiBzbWtfYWNjZXNzKHNtYWNrLCBzc3AtPnNta19pbiwgTUFZX1dSSVRFKTsKKwlyYyA9IHNta19hY2Nlc3Moc21hY2ssIHNzcC0+c21rX2luLCBNQVlfV1JJVEUpOworCWlmIChyYyAhPSAwKQorCQluZXRsYmxfc2tidWZmX2Vycihza2IsIHJjLCAwKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IDI3MWE4MzUuLmMyMWQ4YzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAlTTUtfRElSRUNUCT0gNiwJLyogQ0lQU08gbGV2ZWwgaW5kaWNhdGluZyBkaXJlY3QgbGFiZWwgKi8KIAlTTUtfQU1CSUVOVAk9IDcsCS8qIGludGVybmV0IGFtYmllbnQgbGFiZWwgKi8KIAlTTUtfTkxUWVBFCT0gOCwJLyogbGFiZWwgc2NoZW1lIHRvIHVzZSBieSBkZWZhdWx0ICovCisJU01LX09OTFlDQVAJPSA5LAkvKiB0aGUgb25seSAiY2FwYWJsZSIgbGFiZWwgKi8KIH07CiAKIC8qCkBAIC02OCw2ICs2OSwxNiBAQAogICovCiBpbnQgc21hY2tfY2lwc29fZGlyZWN0ID0gU01BQ0tfQ0lQU09fRElSRUNUX0RFRkFVTFQ7CiAKKy8qCisgKiBVbmxlc3MgYSBwcm9jZXNzIGlzIHJ1bm5pbmcgd2l0aCB0aGlzIGxhYmVsIGV2ZW4KKyAqIGhhdmluZyBDQVBfTUFDX09WRVJSSURFIGlzbid0IGVub3VnaCB0byBncmFudAorICogcHJpdmlsZWdlIHRvIHZpb2xhdGUgTUFDIHBvbGljeS4gSWYgbm8gbGFiZWwgaXMKKyAqIGRlc2lnbmF0ZWQgKHRoZSBOVUxMIGNhc2UpIGNhcGFiaWxpdGllcyBhcHBseSB0bworICogZXZlcnlvbmUuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGhhdCAoXikgbGFiZWwKKyAqIHdpbGwgYmUgdXNlZCBpZiBhbnkgbGFiZWwgaXMgdXNlZC4KKyAqLworY2hhciAqc21hY2tfb25seWNhcDsKKwogc3RhdGljIGludCBzbWtfY2lwc29fZG9pX3ZhbHVlID0gU01BQ0tfQ0lQU09fRE9JX0RFRkFVTFQ7CiBzdHJ1Y3Qgc21rX2xpc3RfZW50cnkgKnNtYWNrX2xpc3Q7CiAKQEAgLTM0Myw5ICszNTQsMTEgQEAKIAkJZG9pcC0+dGFnc1tyY10gPSBDSVBTT19WNF9UQUdfSU5WQUxJRDsKIAogCXJjID0gbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoZG9pcCwgTlVMTCwgJmF1ZGl0X2luZm8pOwotCWlmIChyYyAhPSAwKQorCWlmIChyYyAhPSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIGFkZCByYyA9ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CisJCWtmcmVlKGRvaXApOworCX0KIH0KIAogLyoqCkBAIC03ODcsNiArODAwLDg1IEBACiAJLndyaXRlCQk9IHNta193cml0ZV9hbWJpZW50LAogfTsKIAorLyoqCisgKiBzbWtfcmVhZF9vbmx5Y2FwIC0gcmVhZCgpIGZvciAvc21hY2svb25seWNhcAorICogQGZpbHA6IGZpbGUgcG9pbnRlciwgbm90IGFjdHVhbGx5IHVzZWQKKyAqIEBidWY6IHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0CisgKiBAY246IG1heGltdW0gdG8gc2VuZCBhbG9uZworICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0CisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQorICovCitzdGF0aWMgc3NpemVfdCBzbWtfcmVhZF9vbmx5Y2FwKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjbiwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnNtYWNrID0gIiI7CisJc3NpemVfdCByYyA9IC1FSU5WQUw7CisJaW50IGFzaXplOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCisJaWYgKHNtYWNrX29ubHljYXAgIT0gTlVMTCkKKwkJc21hY2sgPSBzbWFja19vbmx5Y2FwOworCisJYXNpemUgPSBzdHJsZW4oc21hY2spICsgMTsKKworCWlmIChjbiA+PSBhc2l6ZSkKKwkJcmMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNuLCBwcG9zLCBzbWFjaywgYXNpemUpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHNta193cml0ZV9vbmx5Y2FwIC0gd3JpdGUoKSBmb3IgL3NtYWNrL29ubHljYXAKKyAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCisgKiBAYnVmOiB3aGVyZSB0byBnZXQgdGhlIGRhdGEgZnJvbQorICogQGNvdW50OiBieXRlcyBzZW50CisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta193cml0ZV9vbmx5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGluW1NNS19MQUJFTExFTl07CisJY2hhciAqc3AgPSBjdXJyZW50LT5zZWN1cml0eTsKKworCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogVGhpcyBjYW4gYmUgZG9uZSB1c2luZyBzbWtfYWNjZXNzKCkgYnV0IGlzIGRvbmUKKwkgKiBleHBsaWNpdGx5IGZvciBjbGFyaXR5LiBUaGUgc21rX2FjY2VzcygpIGltcGxlbWVudGF0aW9uCisJICogd291bGQgdXNlIHNta19hY2Nlc3Moc21hY2tfb25seWNhcCwgTUFZX1dSSVRFKQorCSAqLworCWlmIChzbWFja19vbmx5Y2FwICE9IE5VTEwgJiYgc21hY2tfb25seWNhcCAhPSBzcCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjb3VudCA+PSBTTUtfTEFCRUxMRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGluLCBidWYsIGNvdW50KSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogU2hvdWxkIHRoZSBudWxsIHN0cmluZyBiZSBwYXNzZWQgaW4gdW5zZXQgdGhlIG9ubHljYXAgdmFsdWUuCisJICogVGhpcyBzZWVtcyBsaWtlIHNvbWV0aGluZyB0byBiZSBjYXJlZnVsIHdpdGggYXMgdXN1YWxseQorCSAqIHNta19pbXBvcnQgb25seSBleHBlY3RzIHRvIHJldHVybiBOVUxMIGZvciBlcnJvcnMuIEl0CisJICogaXMgdXN1YWxseSB0aGUgY2FzZSB0aGF0IGEgbnVsbHN0cmluZyBvciAiXG4iIHdvdWxkIGJlCisJICogYmFkIHRvIHBhc3MgdG8gc21rX2ltcG9ydCBidXQgaW4gZmFjdCB0aGlzIGlzIHVzZWZ1bCBoZXJlLgorCSAqLworCXNtYWNrX29ubHljYXAgPSBzbWtfaW1wb3J0KGluLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNta19vbmx5Y2FwX29wcyA9IHsKKwkucmVhZAkJPSBzbWtfcmVhZF9vbmx5Y2FwLAorCS53cml0ZQkJPSBzbWtfd3JpdGVfb25seWNhcCwKK307CisKIHN0cnVjdCBvcHRpb25fbmFtZXMgewogCWludAlvX251bWJlcjsKIAljaGFyCSpvX25hbWU7CkBAIC05MTksNiArMTAxMSw4IEBACiAJCQl7ImFtYmllbnQiLCAmc21rX2FtYmllbnRfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQlbU01LX05MVFlQRV0JPQogCQkJeyJubHR5cGUiLCAmc21rX25sdHlwZV9vcHMsIFNfSVJVR098U19JV1VTUn0sCisJCVtTTUtfT05MWUNBUF0JPQorCQkJeyJvbmx5Y2FwIiwgJnNta19vbmx5Y2FwX29wcywgU19JUlVHT3xTX0lXVVNSfSwKIAkJLyogbGFzdCBvbmUgKi8geyIifQogCX07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL0tjb25maWcgYi9zb3VuZC9LY29uZmlnCmluZGV4IGEzN2JlZTAuLjIwMGFjYTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL0tjb25maWcKKysrIGIvc291bmQvS2NvbmZpZwpAQCAtMjgsNiArMjgsMTAgQEAKIAogaWYgU09VTkQKIAorY29uZmlnIFNPVU5EX09TU19DT1JFCisJYm9vbAorCWRlZmF1bHQgbgorCiBzb3VyY2UgInNvdW5kL29zcy9kbWFzb3VuZC9LY29uZmlnIgogCiBpZiAhTTY4SwpAQCAtODAsNiArODQsNyBAQAogCiBtZW51Y29uZmlnIFNPVU5EX1BSSU1FCiAJdHJpc3RhdGUgIk9wZW4gU291bmQgU3lzdGVtIChERVBSRUNBVEVEKSIKKwlzZWxlY3QgU09VTkRfT1NTX0NPUkUKIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBlbmFibGUgT3BlbiBTb3VuZCBTeXN0ZW0gZHJpdmVycy4KIApAQCAtOTEsNiArOTYsOSBAQAogCiBlbmRpZiAjICFNNjhLCiAKK2VuZGlmICMgU09VTkQKKworIyBBQzk3X0JVUyBpcyB1c2VkIGZyb20gYm90aCBzb3VuZCBhbmQgdWNiMTQwMAogY29uZmlnIEFDOTdfQlVTCiAJdHJpc3RhdGUKIAloZWxwCkBAIC05OSw0ICsxMDcsMyBAQAogCSAgc291bmQgYWx0aG91Z2ggdGhleSdyZSBzaGFyaW5nIHRoZSBBQzk3IGJ1cy4gQ29uY2VybmVkIGRyaXZlcnMKIAkgIHNob3VsZCAic2VsZWN0IiB0aGlzLgogCi1lbmRpZiAjIFNPVU5ECmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKaW5kZXggN2ExNmEzMy4uNmM1MTViMiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRhcy5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwpAQCAtNjU0LDE1ICs2NTQsMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgdHJhbnNmZXJfaW5mbyB0YXNfdHJhbnNmZXJzW10gPSB7CiAJewogCQkvKiBpbnB1dCAqLwotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAotCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCiAJCS50cmFuc2Zlcl9pbiA9IDEsCiAJfSwKIAl7CiAJCS8qIG91dHB1dCAqLwotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAotCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCiAJCS50cmFuc2Zlcl9pbiA9IDAsCiAJfSwKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9zb3VuZGJ1cy5oIGIvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKaW5kZXggNjIyY2QzNy4uYTBmMjIzYyAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKQEAgLTgsNyArOCw3IEBACiAjaWZuZGVmIF9fU09VTkRCVVNfSAogI2RlZmluZSBfX1NPVU5EQlVTX0gKIAotI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9LY29uZmlnIGIvc291bmQvYXJtL0tjb25maWcKaW5kZXggMzUxZTE5ZS4uZjhlNmRlNCAxMDA2NDQKLS0tIGEvc291bmQvYXJtL0tjb25maWcKKysrIGIvc291bmQvYXJtL0tjb25maWcKQEAgLTMyLDExICszMiwyMCBAQAogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9QQ00KIAorY29uZmlnIFNORF9QWEEyWFhfTElCCisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMgaWYgU05EX1BYQTJYWF9MSUJfQUM5NworCitjb25maWcgU05EX1BYQTJYWF9MSUJfQUM5NworCWJvb2wKKwogY29uZmlnIFNORF9QWEEyWFhfQUM5NwogCXRyaXN0YXRlICJBQzk3IGRyaXZlciBmb3IgdGhlIEludGVsIFBYQTJ4eCBjaGlwIgogCWRlcGVuZHMgb24gQVJDSF9QWEEKIAlzZWxlY3QgU05EX1BYQTJYWF9QQ00KIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwlzZWxlY3QgU05EX1BYQTJYWF9MSUIKKwlzZWxlY3QgU05EX1BYQTJYWF9MSUJfQUM5NwogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBhbnkgQUM5NyBjb2RlYyBhdHRhY2hlZCB0bwogCSAgdGhlIFBYQTJ4eCBBQzk3IGludGVyZmFjZS4KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9NYWtlZmlsZSBiL3NvdW5kL2FybS9NYWtlZmlsZQppbmRleCA0ZWY2ZGQwLi4yMDU0ZGUxIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vTWFrZWZpbGUKKysrIGIvc291bmQvYXJtL01ha2VmaWxlCkBAIC0xMSw1ICsxMSw5IEBACiBvYmotJChDT05GSUdfU05EX1BYQTJYWF9QQ00pCSs9IHNuZC1weGEyeHgtcGNtLm8KIHNuZC1weGEyeHgtcGNtLW9ianMJCTo9IHB4YTJ4eC1wY20ubwogCitvYmotJChDT05GSUdfU05EX1BYQTJYWF9MSUIpCSs9IHNuZC1weGEyeHgtbGliLm8KK3NuZC1weGEyeHgtbGliLXkJCTo9IHB4YTJ4eC1wY20tbGliLm8KK3NuZC1weGEyeHgtbGliLSQoQ09ORklHX1NORF9QWEEyWFhfTElCX0FDOTcpCSs9IHB4YTJ4eC1hYzk3LWxpYi5vCisKIG9iai0kKENPTkZJR19TTkRfUFhBMlhYX0FDOTcpCSs9IHNuZC1weGEyeHgtYWM5Ny5vCiBzbmQtcHhhMnh4LWFjOTctb2JqcwkJOj0gcHhhMnh4LWFjOTcubwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL2FhY2kuYyBiL3NvdW5kL2FybS9hYWNpLmMKaW5kZXggYjBhNDc0NC4uODkwOTZlOCAxMDA2NDQKLS0tIGEvc291bmQvYXJtL2FhY2kuYworKysgYi9zb3VuZC9hcm0vYWFjaS5jCkBAIC05OTksNyArOTk5LDcgQEAKIAljYXJkID0gc25kX2NhcmRfbmV3KFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAogCQkJICAgIFRISVNfTU9EVUxFLCBzaXplb2Yoc3RydWN0IGFhY2kpKTsKIAlpZiAoY2FyZCA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dXJuIE5VTEw7CiAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBhYWNpX2ZyZWVfY2FyZDsKIApAQCAtMTA4Myw4ICsxMDgzLDggQEAKIAkJcmV0dXJuIHJldDsKIAogCWFhY2kgPSBhYWNpX2luaXRfY2FyZChkZXYpOwotCWlmIChJU19FUlIoYWFjaSkpIHsKLQkJcmV0ID0gUFRSX0VSUihhYWNpKTsKKwlpZiAoIWFhY2kpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjMWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIEJhc2VkIG9uIHNvdW5kL2FybS9weGEyeHgtYWM5Ny5jIGFuZCBzb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmMKKyAqIHdoaWNoIGNvbnRhaW46CisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglEZWMgMDIsIDIwMDQKKyAqIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9weGEyeHgtbGliLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTJ4eC1ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdWRpby5oPgorCitzdGF0aWMgREVGSU5FX01VVEVYKGNhcl9tdXRleCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ3NyX3dxKTsKK3N0YXRpYyB2b2xhdGlsZSBsb25nIGdzcl9iaXRzOworc3RhdGljIHN0cnVjdCBjbGsgKmFjOTdfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgKmFjOTdjb25mX2NsazsKKworLyoKKyAqIEJld2FyZSBQWEEyN3ggYnVnczoKKyAqCisgKiAgIG8gU2xvdCAxMiByZWFkIGZyb20gbW9kZW0gc3BhY2Ugd2lsbCBoYW5nIGNvbnRyb2xsZXIuCisgKiAgIG8gQ0RPTkUsIFNET05FIGludGVycnVwdCBmYWlscyBhZnRlciBhbnkgc2xvdCAxMiBJTy4KKyAqCisgKiBXZSB0aGVyZWZvcmUgaGF2ZSBhbiBoeWJyaWQgYXBwcm9hY2ggZm9yIHdhaXRpbmcgb24gU0RPTkUgKGludGVycnVwdCBvcgorICogMSBqaWZmeSB0aW1lb3V0IGlmIGludGVycnVwdCBuZXZlciBjb21lcykuCisgKi8KKwordW5zaWduZWQgc2hvcnQgcHhhMnh4X2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWwgPSAtMTsKKwl2b2xhdGlsZSB1MzIgKnJlZ19hZGRyOworCisJbXV0ZXhfbG9jaygmY2FyX211dGV4KTsKKworCS8qIHNldCB1cCBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2RlYyBzcGFjZSAqLworCWlmIChjcHVfaXNfcHhhMjV4KCkgJiYgcmVnID09IEFDOTdfR1BJT19TVEFUVVMpCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNNQ19SRUdfQkFTRSA6ICZQTUNfUkVHX0JBU0U7CisJZWxzZQorCQlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOworCXJlZ19hZGRyICs9IChyZWcgPj4gMSk7CisKKwkvKiBzdGFydCByZWFkIGFjY2VzcyBhY3Jvc3MgdGhlIGFjOTcgbGluayAqLworCUdTUiA9IEdTUl9DRE9ORSB8IEdTUl9TRE9ORTsKKwlnc3JfYml0cyA9IDA7CisJdmFsID0gKnJlZ19hZGRyOworCWlmIChyZWcgPT0gQUM5N19HUElPX1NUQVRVUykKKwkJZ290byBvdXQ7CisJaWYgKHdhaXRfZXZlbnRfdGltZW91dChnc3Jfd3EsIChHU1IgfCBnc3JfYml0cykgJiBHU1JfU0RPTkUsIDEpIDw9IDAgJiYKKwkgICAgISgoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkIGVycm9yIChhYzk3X3JlZz0lZCBHU1I9JSNseClcbiIsCisJCQkJX19mdW5jX18sIHJlZywgR1NSIHwgZ3NyX2JpdHMpOworCQl2YWwgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogdmFsaWQgZGF0YSBub3cgKi8KKwlHU1IgPSBHU1JfQ0RPTkUgfCBHU1JfU0RPTkU7CisJZ3NyX2JpdHMgPSAwOworCXZhbCA9ICpyZWdfYWRkcjsKKwkvKiBidXQgd2UndmUganVzdCBzdGFydGVkIGFub3RoZXIgY3ljbGUuLi4gKi8KKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCAoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FLCAxKTsKKworb3V0OgltdXRleF91bmxvY2soJmNhcl9tdXRleCk7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTJ4eF9hYzk3X3JlYWQpOworCit2b2lkIHB4YTJ4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJdW5zaWduZWQgc2hvcnQgdmFsKQoreworCXZvbGF0aWxlIHUzMiAqcmVnX2FkZHI7CisKKwltdXRleF9sb2NrKCZjYXJfbXV0ZXgpOworCisJLyogc2V0IHVwIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvZGVjIHNwYWNlICovCisJaWYgKGNwdV9pc19weGEyNXgoKSAmJiByZWcgPT0gQUM5N19HUElPX1NUQVRVUykKKwkJcmVnX2FkZHIgPSBhYzk3LT5udW0gPyAmU01DX1JFR19CQVNFIDogJlBNQ19SRUdfQkFTRTsKKwllbHNlCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7CisJcmVnX2FkZHIgKz0gKHJlZyA+PiAxKTsKKworCUdTUiA9IEdTUl9DRE9ORSB8IEdTUl9TRE9ORTsKKwlnc3JfYml0cyA9IDA7CisJKnJlZ19hZGRyID0gdmFsOworCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCAoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX0NET05FLCAxKSA8PSAwICYmCisJICAgICEoKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9DRE9ORSkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyaXRlIGVycm9yIChhYzk3X3JlZz0lZCBHU1I9JSNseClcbiIsCisJCQkJX19mdW5jX18sIHJlZywgR1NSIHwgZ3NyX2JpdHMpOworCisJbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfd3JpdGUpOworCisjaWZkZWYgQ09ORklHX1BYQTI1eAorc3RhdGljIGlubGluZSB2b2lkIHB4YV9hYzk3X3dhcm1fcHhhMjV4KHZvaWQpCit7CisJZ3NyX2JpdHMgPSAwOworCisJR0NSIHw9IEdDUl9XQVJNX1JTVCB8IEdDUl9QUklSRFlfSUVOIHwgR0NSX1NFQ1JEWV9JRU47CisJd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgZ3NyX2JpdHMgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB4YV9hYzk3X2NvbGRfcHhhMjV4KHZvaWQpCit7CisJR0NSICY9ICBHQ1JfQ09MRF9SU1Q7ICAvKiBjbGVhciBldmVyeXRoaW5nIGJ1dCBuQ1JTVCAqLworCUdDUiAmPSB+R0NSX0NPTERfUlNUOyAgLyogdGhlbiBhc3NlcnQgbkNSU1QgKi8KKworCWdzcl9iaXRzID0gMDsKKworCUdDUiA9IEdDUl9DT0xEX1JTVDsKKwlHQ1IgfD0gR0NSX0NET05FX0lFfEdDUl9TRE9ORV9JRTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFhBMjd4CitzdGF0aWMgaW5saW5lIHZvaWQgcHhhX2FjOTdfd2FybV9weGEyN3godm9pZCkKK3sKKwlnc3JfYml0cyA9IDA7CisKKwkvKiB3YXJtIHJlc2V0IGJyb2tlbiBvbiBCdWx2ZXJkZSwKKwkgICBzbyBtYW51YWxseSBrZWVwIEFDOTcgcmVzZXQgaGlnaCAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCk7CisJdWRlbGF5KDEwKTsKKwlHQ1IgfD0gR0NSX1dBUk1fUlNUOworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworCXVkZWxheSg1MDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHhhX2FjOTdfY29sZF9weGEyN3godm9pZCkKK3sKKwlHQ1IgJj0gIEdDUl9DT0xEX1JTVDsgIC8qIGNsZWFyIGV2ZXJ5dGhpbmcgYnV0IG5DUlNUICovCisJR0NSICY9IH5HQ1JfQ09MRF9SU1Q7ICAvKiB0aGVuIGFzc2VydCBuQ1JTVCAqLworCisJZ3NyX2JpdHMgPSAwOworCisJLyogUFhBMjd4IERldmVsb3BlcnMgTWFudWFsIHNlY3Rpb24gMTMuNS4yLjIuMSAqLworCWNsa19lbmFibGUoYWM5N2NvbmZfY2xrKTsKKwl1ZGVsYXkoNSk7CisJY2xrX2Rpc2FibGUoYWM5N2NvbmZfY2xrKTsKKwlHQ1IgPSBHQ1JfQ09MRF9SU1Q7CisJdWRlbGF5KDUwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BYQTN4eAorc3RhdGljIGlubGluZSB2b2lkIHB4YV9hYzk3X3dhcm1fcHhhM3h4KHZvaWQpCit7CisJaW50IHRpbWVvdXQgPSAxMDA7CisKKwlnc3JfYml0cyA9IDA7CisKKwkvKiBDYW4ndCB1c2UgaW50ZXJydXB0cyAqLworCUdDUiB8PSBHQ1JfV0FSTV9SU1Q7CisJd2hpbGUgKCEoKEdTUiB8IGdzcl9iaXRzKSAmIChHU1JfUENSIHwgR1NSX1NDUikpICYmIHRpbWVvdXQtLSkKKwkJbWRlbGF5KDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHhhX2FjOTdfY29sZF9weGEzeHgodm9pZCkKK3sKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwkvKiBIb2xkIENMS0JQQiBmb3IgMTAwdXMgKi8KKwlHQ1IgPSAwOworCUdDUiA9IEdDUl9DTEtCUEI7CisJdWRlbGF5KDEwMCk7CisJR0NSID0gMDsKKworCUdDUiAmPSAgR0NSX0NPTERfUlNUOyAgLyogY2xlYXIgZXZlcnl0aGluZyBidXQgbkNSU1QgKi8KKwlHQ1IgJj0gfkdDUl9DT0xEX1JTVDsgIC8qIHRoZW4gYXNzZXJ0IG5DUlNUICovCisKKwlnc3JfYml0cyA9IDA7CisKKwkvKiBDYW4ndCB1c2UgaW50ZXJydXB0cyBvbiBQWEEzeHggKi8KKwlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7CisKKwlHQ1IgPSBHQ1JfV0FSTV9SU1QgfCBHQ1JfQ09MRF9SU1Q7CisJd2hpbGUgKCEoR1NSICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkgJiYgdGltZW91dC0tKQorCQltZGVsYXkoMTApOworfQorI2VuZGlmCisKK2Jvb2wgcHhhMnh4X2FjOTdfdHJ5X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworI2lmZGVmIENPTkZJR19QWEEyNXgKKwlpZiAoY3B1X2lzX3B4YTI1eCgpKQorCQlweGFfYWM5N193YXJtX3B4YTI1eCgpOworCWVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QWEEyN3gKKwlpZiAoY3B1X2lzX3B4YTI3eCgpKQorCQlweGFfYWM5N193YXJtX3B4YTI3eCgpOworCWVsc2UKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QWEEzeHgKKwlpZiAoY3B1X2lzX3B4YTN4eCgpKQorCQlweGFfYWM5N193YXJtX3B4YTN4eCgpOworCWVsc2UKKyNlbmRpZgorCQlCVUcoKTsKKworCWlmICghKChHU1IgfCBnc3JfYml0cykgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogd2FybSByZXNldCB0aW1lb3V0IChHU1I9JSNseClcbiIsCisJCQkJIF9fZnVuY19fLCBnc3JfYml0cyk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfdHJ5X3dhcm1fcmVzZXQpOworCitib29sIHB4YTJ4eF9hYzk3X3RyeV9jb2xkX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKyNpZmRlZiBDT05GSUdfUFhBMjV4CisJaWYgKGNwdV9pc19weGEyNXgoKSkKKwkJcHhhX2FjOTdfY29sZF9weGEyNXgoKTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFhBMjd4CisJaWYgKGNwdV9pc19weGEyN3goKSkKKwkJcHhhX2FjOTdfY29sZF9weGEyN3goKTsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFhBM3h4CisJaWYgKGNwdV9pc19weGEzeHgoKSkKKwkJcHhhX2FjOTdfY29sZF9weGEzeHgoKTsKKwllbHNlCisjZW5kaWYKKwkJQlVHKCk7CisKKwlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbGQgcmVzZXQgdGltZW91dCAoR1NSPSUjbHgpXG4iLAorCQkJCSBfX2Z1bmNfXywgZ3NyX2JpdHMpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTJ4eF9hYzk3X3RyeV9jb2xkX3Jlc2V0KTsKKworCit2b2lkIHB4YTJ4eF9hYzk3X2ZpbmlzaF9yZXNldChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJR0NSICY9IH4oR0NSX1BSSVJEWV9JRU58R0NSX1NFQ1JEWV9JRU4pOworCUdDUiB8PSBHQ1JfU0RPTkVfSUV8R0NSX0NET05FX0lFOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfZmluaXNoX3Jlc2V0KTsKKworc3RhdGljIGlycXJldHVybl90IHB4YTJ4eF9hYzk3X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJbG9uZyBzdGF0dXM7CisKKwlzdGF0dXMgPSBHU1I7CisJaWYgKHN0YXR1cykgeworCQlHU1IgPSBzdGF0dXM7CisJCWdzcl9iaXRzIHw9IHN0YXR1czsKKwkJd2FrZV91cCgmZ3NyX3dxKTsKKworCQkvKiBBbHRob3VnaCB3ZSBkb24ndCB1c2UgdGhvc2Ugd2Ugc3RpbGwgbmVlZCB0byBjbGVhciB0aGVtCisJCSAgIHNpbmNlIHRoZXkgdGVuZCB0byBzcHVyaW91c2x5IHRyaWdnZXIgd2hlbiBNTUMgaXMgdXNlZAorCQkgICAoaGFyZHdhcmUgYnVnPyBnbyBmaWd1cmUpLi4uICovCisJCWlmIChjcHVfaXNfcHhhMjd4KCkpIHsKKwkJCU1JU1IgPSBNSVNSX0VPQzsKKwkJCVBJU1IgPSBQSVNSX0VPQzsKKwkJCU1DU1IgPSBNQ1NSX0VPQzsKKwkJfQorCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBweGEyeHhfYWM5N19od19zdXNwZW5kKHZvaWQpCit7CisJR0NSIHw9IEdDUl9BQ0xJTktfT0ZGOworCWNsa19kaXNhYmxlKGFjOTdfY2xrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTJ4eF9hYzk3X2h3X3N1c3BlbmQpOworCitpbnQgcHhhMnh4X2FjOTdfaHdfcmVzdW1lKHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEyNXgoKSB8fCBjcHVfaXNfcHhhMjd4KCkpIHsKKwkJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwkJcHhhX2dwaW9fbW9kZShHUElPMzBfU0RBVEFfT1VUX0FDOTdfTUQpOworCQlweGFfZ3Bpb19tb2RlKEdQSU8yOF9CSVRDTEtfQUM5N19NRCk7CisJCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworCX0KKwlpZiAoY3B1X2lzX3B4YTI3eCgpKSB7CisJCS8qIFVzZSBHUElPIDExMyBhcyBBQzk3IFJlc2V0IG9uIEJ1bHZlcmRlICovCisJCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworCX0KKwljbGtfZW5hYmxlKGFjOTdfY2xrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTJ4eF9hYzk3X2h3X3Jlc3VtZSk7CisjZW5kaWYKKworaW50IF9fZGV2aW5pdCBweGEyeHhfYWM5N19od19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIDAsICJBQzk3IiwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKGNwdV9pc19weGEyNXgoKSB8fCBjcHVfaXNfcHhhMjd4KCkpIHsKKwkJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwkJcHhhX2dwaW9fbW9kZShHUElPMzBfU0RBVEFfT1VUX0FDOTdfTUQpOworCQlweGFfZ3Bpb19tb2RlKEdQSU8yOF9CSVRDTEtfQUM5N19NRCk7CisJCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworCX0KKworCWlmIChjcHVfaXNfcHhhMjd4KCkpIHsKKwkJLyogVXNlIEdQSU8gMTEzIGFzIEFDOTcgUmVzZXQgb24gQnVsdmVyZGUgKi8KKwkJcHhhX2dwaW9fbW9kZSgxMTMgfCBHUElPX0FMVF9GTl8yX09VVCk7CisJCWFjOTdjb25mX2NsayA9IGNsa19nZXQoJmRldi0+ZGV2LCAiQUM5N0NPTkZDTEsiKTsKKwkJaWYgKElTX0VSUihhYzk3Y29uZl9jbGspKSB7CisJCQlyZXQgPSBQVFJfRVJSKGFjOTdjb25mX2Nsayk7CisJCQlhYzk3Y29uZl9jbGsgPSBOVUxMOworCQkJZ290byBlcnJfaXJxOworCQl9CisJfQorCisJYWM5N19jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgIkFDOTdDTEsiKTsKKwlpZiAoSVNfRVJSKGFjOTdfY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGFjOTdfY2xrKTsKKwkJYWM5N19jbGsgPSBOVUxMOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJcmV0dXJuIGNsa19lbmFibGUoYWM5N19jbGspOworCitlcnJfaXJxOgorCUdDUiB8PSBHQ1JfQUNMSU5LX09GRjsKKwlpZiAoYWM5N2NvbmZfY2xrKSB7CisJCWNsa19wdXQoYWM5N2NvbmZfY2xrKTsKKwkJYWM5N2NvbmZfY2xrID0gTlVMTDsKKwl9CisJZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOworZXJyOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChweGEyeHhfYWM5N19od19wcm9iZSk7CisKK3ZvaWQgcHhhMnh4X2FjOTdfaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CisJZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOworCWlmIChhYzk3Y29uZl9jbGspIHsKKwkJY2xrX3B1dChhYzk3Y29uZl9jbGspOworCQlhYzk3Y29uZl9jbGsgPSBOVUxMOworCX0KKwljbGtfZGlzYWJsZShhYzk3X2Nsayk7CisJY2xrX3B1dChhYzk3X2Nsayk7CisJYWM5N19jbGsgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfaHdfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiTmljb2xhcyBQaXRyZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbC9NYXJ2ZWxsIFBYQSBzb3VuZCBsaWJyYXJ5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny5jIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKaW5kZXggMTk5Y2NhMy4uYzI2MzViZSAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LmMKQEAgLTEyLDE5OCArMTIsMjcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+Ci0jaW5jbHVkZSA8bWFjaC9weGEyeHgtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KIAogI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKIAotCi1zdGF0aWMgREVGSU5FX01VVEVYKGNhcl9tdXRleCk7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ3NyX3dxKTsKLXN0YXRpYyB2b2xhdGlsZSBsb25nIGdzcl9iaXRzOwotc3RhdGljIHN0cnVjdCBjbGsgKmFjOTdfY2xrOwotI2lmZGVmIENPTkZJR19QWEEyN3gKLXN0YXRpYyBzdHJ1Y3QgY2xrICphYzk3Y29uZl9jbGs7Ci0jZW5kaWYKLQotLyoKLSAqIEJld2FyZSBQWEEyN3ggYnVnczoKLSAqCi0gKiAgIG8gU2xvdCAxMiByZWFkIGZyb20gbW9kZW0gc3BhY2Ugd2lsbCBoYW5nIGNvbnRyb2xsZXIuCi0gKiAgIG8gQ0RPTkUsIFNET05FIGludGVycnVwdCBmYWlscyBhZnRlciBhbnkgc2xvdCAxMiBJTy4KLSAqCi0gKiBXZSB0aGVyZWZvcmUgaGF2ZSBhbiBoeWJyaWQgYXBwcm9hY2ggZm9yIHdhaXRpbmcgb24gU0RPTkUgKGludGVycnVwdCBvcgotICogMSBqaWZmeSB0aW1lb3V0IGlmIGludGVycnVwdCBuZXZlciBjb21lcykuCi0gKi8gCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBweGEyeHhfYWM5N19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKQotewotCXVuc2lnbmVkIHNob3J0IHZhbCA9IC0xOwotCXZvbGF0aWxlIHUzMiAqcmVnX2FkZHI7Ci0KLQltdXRleF9sb2NrKCZjYXJfbXV0ZXgpOwotCi0JLyogc2V0IHVwIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvZGVjIHNwYWNlICovCi0JcmVnX2FkZHIgPSAoYWM5Ny0+bnVtICYgMSkgPyAmU0FDX1JFR19CQVNFIDogJlBBQ19SRUdfQkFTRTsKLQlyZWdfYWRkciArPSAocmVnID4+IDEpOwotCi0JLyogc3RhcnQgcmVhZCBhY2Nlc3MgYWNyb3NzIHRoZSBhYzk3IGxpbmsgKi8KLQlHU1IgPSBHU1JfQ0RPTkUgfCBHU1JfU0RPTkU7Ci0JZ3NyX2JpdHMgPSAwOwotCXZhbCA9ICpyZWdfYWRkcjsKLQlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpCi0JCWdvdG8gb3V0OwotCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCAoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FLCAxKSA8PSAwICYmCi0JICAgICEoKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVhZCBlcnJvciAoYWM5N19yZWc9JWQgR1NSPSUjbHgpXG4iLAotCQkJCV9fZnVuY19fLCByZWcsIEdTUiB8IGdzcl9iaXRzKTsKLQkJdmFsID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIHZhbGlkIGRhdGEgbm93ICovCi0JR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOwotCWdzcl9iaXRzID0gMDsKLQl2YWwgPSAqcmVnX2FkZHI7CQkJCi0JLyogYnV0IHdlJ3ZlIGp1c3Qgc3RhcnRlZCBhbm90aGVyIGN5Y2xlLi4uICovCi0Jd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSwgMSk7Ci0KLW91dDoJbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCi17Ci0Jdm9sYXRpbGUgdTMyICpyZWdfYWRkcjsKLQotCW11dGV4X2xvY2soJmNhcl9tdXRleCk7Ci0KLQkvKiBzZXQgdXAgcHJpbWFyeSBvciBzZWNvbmRhcnkgY29kZWMgc3BhY2UgKi8KLQlyZWdfYWRkciA9IChhYzk3LT5udW0gJiAxKSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOwotCXJlZ19hZGRyICs9IChyZWcgPj4gMSk7Ci0KLQlHU1IgPSBHU1JfQ0RPTkUgfCBHU1JfU0RPTkU7Ci0JZ3NyX2JpdHMgPSAwOwotCSpyZWdfYWRkciA9IHZhbDsKLQlpZiAod2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9DRE9ORSwgMSkgPD0gMCAmJgotCSAgICAhKChHU1IgfCBnc3JfYml0cykgJiBHU1JfQ0RPTkUpKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3cml0ZSBlcnJvciAoYWM5N19yZWc9JWQgR1NSPSUjbHgpXG4iLAotCQkJCV9fZnVuY19fLCByZWcsIEdTUiB8IGdzcl9iaXRzKTsKLQotCW11dGV4X3VubG9jaygmY2FyX211dGV4KTsKLX0KLQogc3RhdGljIHZvaWQgcHhhMnh4X2FjOTdfcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewotCS8qIEZpcnN0LCB0cnkgY29sZCByZXNldCAqLwotI2lmZGVmIENPTkZJR19QWEEzeHgKLQlpbnQgdGltZW91dDsKLQotCS8qIEhvbGQgQ0xLQlBCIGZvciAxMDB1cyAqLwotCUdDUiA9IDA7Ci0JR0NSID0gR0NSX0NMS0JQQjsKLQl1ZGVsYXkoMTAwKTsKLQlHQ1IgPSAwOwotI2VuZGlmCi0KLQlHQ1IgJj0gIEdDUl9DT0xEX1JTVDsgIC8qIGNsZWFyIGV2ZXJ5dGhpbmcgYnV0IG5DUlNUICovCi0JR0NSICY9IH5HQ1JfQ09MRF9SU1Q7ICAvKiB0aGVuIGFzc2VydCBuQ1JTVCAqLwotCi0JZ3NyX2JpdHMgPSAwOwotI2lmZGVmIENPTkZJR19QWEEyN3gKLQkvKiBQWEEyN3ggRGV2ZWxvcGVycyBNYW51YWwgc2VjdGlvbiAxMy41LjIuMi4xICovCi0JY2xrX2VuYWJsZShhYzk3Y29uZl9jbGspOwotCXVkZWxheSg1KTsKLQljbGtfZGlzYWJsZShhYzk3Y29uZl9jbGspOwotCUdDUiA9IEdDUl9DT0xEX1JTVDsKLQl1ZGVsYXkoNTApOwotI2VsaWYgZGVmaW5lZChDT05GSUdfUFhBM3h4KQotCXRpbWVvdXQgPSAxMDAwOwotCS8qIENhbid0IHVzZSBpbnRlcnJ1cHRzIG9uIFBYQTN4eCAqLwotCUdDUiAmPSB+KEdDUl9QUklSRFlfSUVOfEdDUl9TRUNSRFlfSUVOKTsKLQotCUdDUiA9IEdDUl9XQVJNX1JTVCB8IEdDUl9DT0xEX1JTVDsKLQl3aGlsZSAoIShHU1IgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSAmJiB0aW1lb3V0LS0pCi0JCW1kZWxheSgxMCk7Ci0jZWxzZQotCUdDUiA9IEdDUl9DT0xEX1JTVDsKLQlHQ1IgfD0gR0NSX0NET05FX0lFfEdDUl9TRE9ORV9JRTsKLQl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOwotI2VuZGlmCi0KLQlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbGQgcmVzZXQgdGltZW91dCAoR1NSPSUjbHgpXG4iLAotCQkJCSBfX2Z1bmNfXywgZ3NyX2JpdHMpOwotCi0JCS8qIGxldCdzIHRyeSB3YXJtIHJlc2V0ICovCi0JCWdzcl9iaXRzID0gMDsKLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JCS8qIHdhcm0gcmVzZXQgYnJva2VuIG9uIEJ1bHZlcmRlLAotCQkgICBzbyBtYW51YWxseSBrZWVwIEFDOTcgcmVzZXQgaGlnaCAqLwotCQlweGFfZ3Bpb19tb2RlKDExMyB8IEdQSU9fT1VUIHwgR1BJT19ERkxUX0hJR0gpOyAKLQkJdWRlbGF5KDEwKTsKLQkJR0NSIHw9IEdDUl9XQVJNX1JTVDsKLQkJcHhhX2dwaW9fbW9kZSgxMTMgfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0JCXVkZWxheSg1MDApOwotI2VsaWYgZGVmaW5lZChDT05GSUdfUFhBM3h4KQotCQl0aW1lb3V0ID0gMTAwOwotCQkvKiBDYW4ndCB1c2UgaW50ZXJydXB0cyAqLwotCQlHQ1IgfD0gR0NSX1dBUk1fUlNUOwotCQl3aGlsZSAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkgJiYgdGltZW91dC0tKQotCQkJbWRlbGF5KDEpOwotI2Vsc2UKLQkJR0NSIHw9IEdDUl9XQVJNX1JTVHxHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTjsKLQkJd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgZ3NyX2JpdHMgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpLCAxKTsKLSNlbmRpZgkJCQotCi0JCWlmICghKChHU1IgfCBnc3JfYml0cykgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSkKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YXJtIHJlc2V0IHRpbWVvdXQgKEdTUj0lI2x4KVxuIiwKLQkJCQkJIF9fZnVuY19fLCBnc3JfYml0cyk7CisJaWYgKCFweGEyeHhfYWM5N190cnlfY29sZF9yZXNldChhYzk3KSkgeworCQlweGEyeHhfYWM5N190cnlfd2FybV9yZXNldChhYzk3KTsKIAl9CiAKLQlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7Ci0JR0NSIHw9IEdDUl9TRE9ORV9JRXxHQ1JfQ0RPTkVfSUU7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBweGEyeHhfYWM5N19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWxvbmcgc3RhdHVzOwotCi0Jc3RhdHVzID0gR1NSOwotCWlmIChzdGF0dXMpIHsKLQkJR1NSID0gc3RhdHVzOwotCQlnc3JfYml0cyB8PSBzdGF0dXM7Ci0JCXdha2VfdXAoJmdzcl93cSk7Ci0KLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JCS8qIEFsdGhvdWdoIHdlIGRvbid0IHVzZSB0aG9zZSB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFyIHRoZW0KLQkJICAgc2luY2UgdGhleSB0ZW5kIHRvIHNwdXJpb3VzbHkgdHJpZ2dlciB3aGVuIE1NQyBpcyB1c2VkCi0JCSAgIChoYXJkd2FyZSBidWc/IGdvIGZpZ3VyZSkuLi4gKi8KLQkJTUlTUiA9IE1JU1JfRU9DOwotCQlQSVNSID0gUElTUl9FT0M7Ci0JCU1DU1IgPSBNQ1NSX0VPQzsKLSNlbmRpZgotCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlyZXR1cm4gSVJRX05PTkU7CisJcHhhMnh4X2FjOTdfZmluaXNoX3Jlc2V0KGFjOTcpOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgcHhhMnh4X2FjOTdfb3BzID0gewpAQCAtMjE1LDcgKzQ0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9vdXQgPSB7CiAJLm5hbWUJCQk9ICJBQzk3IFBDTSBvdXQiLAogCS5kZXZfYWRkcgkJPSBfX1BSRUcoUENEUiksCi0JLmRyY21yCQkJPSAmRFJDTVJUWFBDRFIsCisJLmRyY21yCQkJPSAmRFJDTVIoMTIpLAogCS5kY21kCQkJPSBEQ01EX0lOQ1NSQ0FERFIgfCBEQ01EX0ZMT1dUUkcgfAogCQkJCSAgRENNRF9CVVJTVDMyIHwgRENNRF9XSURUSDQsCiB9OwpAQCAtMjIzLDcgKzUyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9pbiA9IHsKIAkubmFtZQkJCT0gIkFDOTcgUENNIGluIiwKIAkuZGV2X2FkZHIJCT0gX19QUkVHKFBDRFIpLAotCS5kcmNtcgkJCT0gJkRSQ01SUlhQQ0RSLAorCS5kcmNtcgkJCT0gJkRSQ01SKDExKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKIAkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAogfTsKQEAgLTI4OCwxNyArMTE3LDE5IEBACiAJc25kX2FjOTdfc3VzcGVuZChweGEyeHhfYWM5N19hYzk3KTsKIAlpZiAocGxhdGZvcm1fb3BzICYmIHBsYXRmb3JtX29wcy0+c3VzcGVuZCkKIAkJcGxhdGZvcm1fb3BzLT5zdXNwZW5kKHBsYXRmb3JtX29wcy0+cHJpdik7Ci0JR0NSIHw9IEdDUl9BQ0xJTktfT0ZGOwotCWNsa19kaXNhYmxlKGFjOTdfY2xrKTsKIAotCXJldHVybiAwOworCXJldHVybiBweGEyeHhfYWM5N19od19zdXNwZW5kKCk7CiB9CiAKIHN0YXRpYyBpbnQgcHhhMnh4X2FjOTdfZG9fcmVzdW1lKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKIAlweGEyeHhfYXVkaW9fb3BzX3QgKnBsYXRmb3JtX29wcyA9IGNhcmQtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQgcmM7CiAKLQljbGtfZW5hYmxlKGFjOTdfY2xrKTsKKwlyYyA9IHB4YTJ4eF9hYzk3X2h3X3Jlc3VtZSgpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCiAJaWYgKHBsYXRmb3JtX29wcyAmJiBwbGF0Zm9ybV9vcHMtPnJlc3VtZSkKIAkJcGxhdGZvcm1fb3BzLT5yZXN1bWUocGxhdGZvcm1fb3BzLT5wcml2KTsKIAlzbmRfYWM5N19yZXN1bWUocHhhMnh4X2FjOTdfYWM5Nyk7CkBAIC0zNTQsNDAgKzE4NSwxNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0FDOTcsIHB4YTJ4eF9hYzk3X2lycSwgMCwgIkFDOTciLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBweGEyeHhfYWM5N19od19wcm9iZShkZXYpOworCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8zMF9TREFUQV9PVVRfQUM5N19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMjhfQklUQ0xLX0FDOTdfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOwotI2lmZGVmIENPTkZJR19QWEEyN3gKLQkvKiBVc2UgR1BJTyAxMTMgYXMgQUM5NyBSZXNldCBvbiBCdWx2ZXJkZSAqLwotCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOwotCWFjOTdjb25mX2NsayA9IGNsa19nZXQoJmRldi0+ZGV2LCAiQUM5N0NPTkZDTEsiKTsKLQlpZiAoSVNfRVJSKGFjOTdjb25mX2NsaykpIHsKLQkJcmV0ID0gUFRSX0VSUihhYzk3Y29uZl9jbGspOwotCQlhYzk3Y29uZl9jbGsgPSBOVUxMOwotCQlnb3RvIGVycjsKLQl9Ci0jZW5kaWYKLQotCWFjOTdfY2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJBQzk3Q0xLIik7Ci0JaWYgKElTX0VSUihhYzk3X2NsaykpIHsKLQkJcmV0ID0gUFRSX0VSUihhYzk3X2Nsayk7Ci0JCWFjOTdfY2xrID0gTlVMTDsKLQkJZ290byBlcnI7Ci0JfQotCWNsa19lbmFibGUoYWM5N19jbGspOwotCiAJcmV0ID0gc25kX2FjOTdfYnVzKGNhcmQsIDAsICZweGEyeHhfYWM5N19vcHMsIE5VTEwsICZhYzk3X2J1cyk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyX3JlbW92ZTsKIAltZW1zZXQoJmFjOTdfdGVtcGxhdGUsIDAsIHNpemVvZihhYzk3X3RlbXBsYXRlKSk7CiAJcmV0ID0gc25kX2FjOTdfbWl4ZXIoYWM5N19idXMsICZhYzk3X3RlbXBsYXRlLCAmcHhhMnh4X2FjOTdfYWM5Nyk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyX3JlbW92ZTsKIAogCXNucHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgc2l6ZW9mKGNhcmQtPnNob3J0bmFtZSksCiAJCSAiJXMiLCBzbmRfYWM5N19nZXRfc2hvcnRfbmFtZShweGEyeHhfYWM5N19hYzk3KSk7CkBAIC00MDEsMjIgKzIwOSwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLSBlcnI6CitlcnJfcmVtb3ZlOgorCXB4YTJ4eF9hYzk3X2h3X3JlbW92ZShkZXYpOworZXJyOgogCWlmIChjYXJkKQogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCWlmIChhYzk3X2NsaykgewotCQlHQ1IgfD0gR0NSX0FDTElOS19PRkY7Ci0JCWZyZWVfaXJxKElSUV9BQzk3LCBOVUxMKTsKLQkJY2xrX2Rpc2FibGUoYWM5N19jbGspOwotCQljbGtfcHV0KGFjOTdfY2xrKTsKLQkJYWM5N19jbGsgPSBOVUxMOwotCX0KLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JaWYgKGFjOTdjb25mX2NsaykgewotCQljbGtfcHV0KGFjOTdjb25mX2Nsayk7Ci0JCWFjOTdjb25mX2NsayA9IE5VTEw7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDI3LDE1ICsyMjQsNyBAQAogCWlmIChjYXJkKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0JCUdDUiB8PSBHQ1JfQUNMSU5LX09GRjsKLQkJZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOwotCQljbGtfZGlzYWJsZShhYzk3X2Nsayk7Ci0JCWNsa19wdXQoYWM5N19jbGspOwotCQlhYzk3X2NsayA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX1BYQTI3eAotCQljbGtfcHV0KGFjOTdjb25mX2Nsayk7Ci0JCWFjOTdjb25mX2NsayA9IE5VTEw7Ci0jZW5kaWYKKwkJcHhhMnh4X2FjOTdfaHdfcmVtb3ZlKGRldik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vcHhhMnh4LXBjbS1saWIuYyBiL3NvdW5kL2FybS9weGEyeHgtcGNtLWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTNlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hcm0vcHhhMnh4LXBjbS1saWIuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CisKKyNpbmNsdWRlICJweGEyeHgtcGNtLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBweGEyeHhfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FLAorCS5mb3JtYXRzCQk9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAorCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkucGVyaW9kX2J5dGVzX21pbgk9IDMyLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gODE5MiAtIDMyLAorCS5wZXJpb2RzX21pbgkJPSAxLAorCS5wZXJpb2RzX21heAkJPSBQQUdFX1NJWkUvc2l6ZW9mKHB4YV9kbWFfZGVzYyksCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjggKiAxMDI0LAorCS5maWZvX3NpemUJCT0gMzIsCit9OworCitpbnQgX19weGEyeHhfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IHRvdHNpemUgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CisJc2l6ZV90IHBlcmlvZCA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKKwlweGFfZG1hX2Rlc2MgKmRtYV9kZXNjOworCWRtYV9hZGRyX3QgZG1hX2J1ZmZfcGh5cywgbmV4dF9kZXNjX3BoeXM7CisKKwlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IHRvdHNpemU7CisKKwlkbWFfZGVzYyA9IHJ0ZC0+ZG1hX2Rlc2NfYXJyYXk7CisJbmV4dF9kZXNjX3BoeXMgPSBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXM7CisJZG1hX2J1ZmZfcGh5cyA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCWRvIHsKKwkJbmV4dF9kZXNjX3BoeXMgKz0gc2l6ZW9mKHB4YV9kbWFfZGVzYyk7CisJCWRtYV9kZXNjLT5kZGFkciA9IG5leHRfZGVzY19waHlzOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJZG1hX2Rlc2MtPmRzYWRyID0gZG1hX2J1ZmZfcGh5czsKKwkJCWRtYV9kZXNjLT5kdGFkciA9IHJ0ZC0+cGFyYW1zLT5kZXZfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWRtYV9kZXNjLT5kc2FkciA9IHJ0ZC0+cGFyYW1zLT5kZXZfYWRkcjsKKwkJCWRtYV9kZXNjLT5kdGFkciA9IGRtYV9idWZmX3BoeXM7CisJCX0KKwkJaWYgKHBlcmlvZCA+IHRvdHNpemUpCisJCQlwZXJpb2QgPSB0b3RzaXplOworCQlkbWFfZGVzYy0+ZGNtZCA9IHJ0ZC0+cGFyYW1zLT5kY21kIHwgcGVyaW9kIHwgRENNRF9FTkRJUlFFTjsKKwkJZG1hX2Rlc2MrKzsKKwkJZG1hX2J1ZmZfcGh5cyArPSBwZXJpb2Q7CisJfSB3aGlsZSAodG90c2l6ZSAtPSBwZXJpb2QpOworCWRtYV9kZXNjWy0xXS5kZGFkciA9IHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX3B4YTJ4eF9wY21faHdfcGFyYW1zKTsKKworaW50IF9fcHhhMnh4X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChydGQgJiYgcnRkLT5wYXJhbXMpCisJCSpydGQtPnBhcmFtcy0+ZHJjbXIgPSAwOworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19weGEyeHhfcGNtX2h3X2ZyZWUpOworCitpbnQgcHhhMnh4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgPSBEQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJRENTUihwcnRkLT5kbWFfY2gpICY9IH5EQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJRENTUihwcnRkLT5kbWFfY2gpIHw9IERDU1JfUlVOOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgfD0gRENTUl9SVU47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChweGEyeHhfcGNtX3RyaWdnZXIpOworCitzbmRfcGNtX3VmcmFtZXNfdAorcHhhMnh4X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlkbWFfYWRkcl90IHB0ciA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/CisJCQkgRFNBRFIocHJ0ZC0+ZG1hX2NoKSA6IERUQURSKHBydGQtPmRtYV9jaCk7CisJc25kX3BjbV91ZnJhbWVzX3QgeCA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwdHIgLSBydW50aW1lLT5kbWFfYWRkcik7CisKKwlpZiAoeCA9PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJeCA9IDA7CisJcmV0dXJuIHg7Cit9CitFWFBPUlRfU1lNQk9MKHB4YTJ4eF9wY21fcG9pbnRlcik7CisKK2ludCBfX3B4YTJ4eF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJRENTUihwcnRkLT5kbWFfY2gpICY9IH5EQ1NSX1JVTjsKKwlEQ1NSKHBydGQtPmRtYV9jaCkgPSAwOworCURDTUQocHJ0ZC0+ZG1hX2NoKSA9IDA7CisJKnBydGQtPnBhcmFtcy0+ZHJjbXIgPSBwcnRkLT5kbWFfY2ggfCBEUkNNUl9NQVBWTEQ7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19weGEyeHhfcGNtX3ByZXBhcmUpOworCit2b2lkIHB4YTJ4eF9wY21fZG1hX2lycShpbnQgZG1hX2NoLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXZfaWQ7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBkY3NyOworCisJZGNzciA9IERDU1IoZG1hX2NoKTsKKwlEQ1NSKGRtYV9jaCkgPSBkY3NyICYgfkRDU1JfU1RPUElSUUVOOworCisJaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpIHsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBlcnJvciBvbiBjaGFubmVsICVkIChEQ1NSPSUjeClcbiIsCisJCQlydGQtPnBhcmFtcy0+bmFtZSwgZG1hX2NoLCBkY3NyKTsKKwkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCX0KK30KK0VYUE9SVF9TWU1CT0wocHhhMnh4X3BjbV9kbWFfaXJxKTsKKworaW50IF9fcHhhMnh4X3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnJ0ZDsKKwlpbnQgcmV0OworCisJcnVudGltZS0+aHcgPSBweGEyeHhfcGNtX2hhcmR3YXJlOworCisJLyoKKwkgKiBGb3IgbXlzdGVyaW91cyByZWFzb25zIChhbmQgZGVzcGl0ZSB3aGF0IHRoZSBtYW51YWwgc2F5cykKKwkgKiBwbGF5YmFjayBzYW1wbGVzIGFyZSBsb3N0IGlmIHRoZSBETUEgY291bnQgaXMgbm90IGEgbXVsdGlwbGUKKwkgKiBvZiB0aGUgRE1BIGJ1cnN0IHNpemUuICBMZXQncyBhZGQgYSBydWxlIHRvIGVuZm9yY2UgdGhhdC4KKwkgKi8KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CisJcnRkID0ga21hbGxvYyhzaXplb2YoKnJ0ZCksIEdGUF9LRVJORUwpOworCWlmICghcnRkKQorCQlnb3RvIG91dDsKKwlydGQtPmRtYV9kZXNjX2FycmF5ID0KKwkJZG1hX2FsbG9jX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJICAgICAgICZydGQtPmRtYV9kZXNjX2FycmF5X3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghcnRkLT5kbWFfZGVzY19hcnJheSkKKwkJZ290byBlcnIxOworCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcnRkOworCXJldHVybiAwOworCisgZXJyMToKKwlrZnJlZShydGQpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChfX3B4YTJ4eF9wY21fb3Blbik7CisKK2ludCBfX3B4YTJ4eF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgICAgIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXksIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cyk7CisJa2ZyZWUocnRkKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19weGEyeHhfcGNtX2Nsb3NlKTsKKworaW50IHB4YTJ4eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2FyZWEsCisJCQkJICAgICBydW50aW1lLT5kbWFfYWRkciwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7Cit9CitFWFBPUlRfU1lNQk9MKHB4YTJ4eF9wY21fbW1hcCk7CisKK2ludCBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBweGEyeHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisJYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKKwlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJYnVmLT5hcmVhID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgc2l6ZSwKKwkJCQkJICAgJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYtPmFyZWEpCisJCXJldHVybiAtRU5PTUVNOworCWJ1Zi0+Ynl0ZXMgPSBzaXplOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIpOworCit2b2lkIHB4YTJ4eF9wY21fZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmOworCWludCBzdHJlYW07CisKKwlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7CisJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwkJaWYgKCFzdWJzdHJlYW0pCisJCQljb250aW51ZTsKKwkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJaWYgKCFidWYtPmFyZWEpCisJCQljb250aW51ZTsKKwkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBidWYtPmJ5dGVzLAorCQkJCSAgICAgIGJ1Zi0+YXJlYSwgYnVmLT5hZGRyKTsKKwkJYnVmLT5hcmVhID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHB4YTJ4eF9wY21fZnJlZV9kbWFfYnVmZmVycyk7CisKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgUFhBMnh4IHNvdW5kIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtcGNtLmMgYi9zb3VuZC9hcm0vcHhhMnh4LXBjbS5jCmluZGV4IDM4MTA5NGEuLjUzNTcwNGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9weGEyeHgtcGNtLmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1wY20uYwpAQCAtMTAsMTgzICsxMCwyMCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxzb3VuZC9weGEyeHgtbGliLmg+CiAKICNpbmNsdWRlICJweGEyeHgtcGNtLmgiCiAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHB4YTJ4eF9wY21faGFyZHdhcmUgPSB7Ci0JLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19QQVVTRSwKLQkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkucGVyaW9kX2J5dGVzX21pbgk9IDMyLAotCS5wZXJpb2RfYnl0ZXNfbWF4CT0gODE5MiAtIDMyLAotCS5wZXJpb2RzX21pbgkJPSAxLAotCS5wZXJpb2RzX21heAkJPSBQQUdFX1NJWkUvc2l6ZW9mKHB4YV9kbWFfZGVzYyksCi0JLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjggKiAxMDI0LAotCS5maWZvX3NpemUJCT0gMzIsCi19OwotCi1zdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSB7Ci0JaW50IGRtYV9jaDsKLQlzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zICpwYXJhbXM7Ci0JcHhhX2RtYV9kZXNjICpkbWFfZGVzY19hcnJheTsKLQlkbWFfYWRkcl90IGRtYV9kZXNjX2FycmF5X3BoeXM7Ci19OwotCi1zdGF0aWMgaW50IHB4YTJ4eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzaXplX3QgdG90c2l6ZSA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKLQlzaXplX3QgcGVyaW9kID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOwotCXB4YV9kbWFfZGVzYyAqZG1hX2Rlc2M7Ci0JZG1hX2FkZHJfdCBkbWFfYnVmZl9waHlzLCBuZXh0X2Rlc2NfcGh5czsKLQotCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7Ci0JcnVudGltZS0+ZG1hX2J5dGVzID0gdG90c2l6ZTsKLQotCWRtYV9kZXNjID0gcnRkLT5kbWFfZGVzY19hcnJheTsKLQluZXh0X2Rlc2NfcGh5cyA9IHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKLQlkbWFfYnVmZl9waHlzID0gcnVudGltZS0+ZG1hX2FkZHI7Ci0JZG8gewotCQluZXh0X2Rlc2NfcGh5cyArPSBzaXplb2YocHhhX2RtYV9kZXNjKTsKLQkJZG1hX2Rlc2MtPmRkYWRyID0gbmV4dF9kZXNjX3BoeXM7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCQlkbWFfZGVzYy0+ZHNhZHIgPSBkbWFfYnVmZl9waHlzOwotCQkJZG1hX2Rlc2MtPmR0YWRyID0gcnRkLT5wYXJhbXMtPmRldl9hZGRyOwotCQl9IGVsc2UgewotCQkJZG1hX2Rlc2MtPmRzYWRyID0gcnRkLT5wYXJhbXMtPmRldl9hZGRyOwotCQkJZG1hX2Rlc2MtPmR0YWRyID0gZG1hX2J1ZmZfcGh5czsKLQkJfQotCQlpZiAocGVyaW9kID4gdG90c2l6ZSkKLQkJCXBlcmlvZCA9IHRvdHNpemU7Ci0JCWRtYV9kZXNjLT5kY21kID0gcnRkLT5wYXJhbXMtPmRjbWQgfCBwZXJpb2QgfCBEQ01EX0VORElSUUVOOwotCQlkbWFfZGVzYysrOwotCQlkbWFfYnVmZl9waHlzICs9IHBlcmlvZDsKLQl9IHdoaWxlICh0b3RzaXplIC09IHBlcmlvZCk7Ci0JZG1hX2Rlc2NbLTFdLmRkYWRyID0gcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHhhMnh4X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCSpydGQtPnBhcmFtcy0+ZHJjbXIgPSAwOwotCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgcHhhMnh4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBweGEyeHhfcGNtX2NsaWVudCAqY2xpZW50ID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCi0JRENTUihydGQtPmRtYV9jaCkgJj0gfkRDU1JfUlVOOwotCURDU1IocnRkLT5kbWFfY2gpID0gMDsKLQlEQ01EKHJ0ZC0+ZG1hX2NoKSA9IDA7Ci0JKnJ0ZC0+cGFyYW1zLT5kcmNtciA9IHJ0ZC0+ZG1hX2NoIHwgRFJDTVJfTUFQVkxEOworCV9fcHhhMnh4X3BjbV9wcmVwYXJlKHN1YnN0cmVhbSk7CiAKIAlyZXR1cm4gY2xpZW50LT5wcmVwYXJlKHN1YnN0cmVhbSk7CiB9CiAKLXN0YXRpYyBpbnQgcHhhMnh4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQkJRERBRFIocnRkLT5kbWFfY2gpID0gcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOwotCQlEQ1NSKHJ0ZC0+ZG1hX2NoKSA9IERDU1JfUlVOOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlEQ1NSKHJ0ZC0+ZG1hX2NoKSAmPSB+RENTUl9SVU47Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlEQ1NSKHJ0ZC0+ZG1hX2NoKSB8PSBEQ1NSX1JVTjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YTJ4eF9wY21fZG1hX2lycShpbnQgZG1hX2NoLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXZfaWQ7Ci0Jc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWludCBkY3NyOwotCi0JZGNzciA9IERDU1IoZG1hX2NoKTsKLQlEQ1NSKGRtYV9jaCkgPSBkY3NyICYgfkRDU1JfU1RPUElSUUVOOwotCi0JaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpIHsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCX0gZWxzZSB7Ci0JCXByaW50ayggS0VSTl9FUlIgIiVzOiBETUEgZXJyb3Igb24gY2hhbm5lbCAlZCAoRENTUj0lI3gpXG4iLAotCQkJcnRkLT5wYXJhbXMtPm5hbWUsIGRtYV9jaCwgZGNzciApOwotCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7Ci0JfQotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgcHhhMnh4X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlkbWFfYWRkcl90IHB0ciA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/Ci0JCQkgRFNBRFIocnRkLT5kbWFfY2gpIDogRFRBRFIocnRkLT5kbWFfY2gpOwotCXNuZF9wY21fdWZyYW1lc190IHggPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyIC0gcnVudGltZS0+ZG1hX2FkZHIpOwotCWlmICh4ID09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQl4ID0gMDsKLQlyZXR1cm4geDsKLX0KLQotc3RhdGljIGludAotcHhhMnh4X3BjbV9od19ydWxlX211bHQzMihzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9wY21faHdfcnVsZSAqcnVsZSkKLXsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICppID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCBydWxlLT52YXIpOwotCWludCBjaGFuZ2VkID0gMDsKLQotCWlmIChpLT5taW4gJiAzMSkgewotCQlpLT5taW4gPSAoaS0+bWluICYgfjMxKSArIDMyOwotCQlpLT5vcGVubWluID0gMDsKLQkJY2hhbmdlZCA9IDE7Ci0JfQotCi0JaWYgKGktPm1heCAmIDMxKSB7Ci0JCWktPm1heCAmPSB+MzE7Ci0JCWktPm9wZW5tYXggPSAwOwotCQljaGFuZ2VkID0gMTsKLQl9Ci0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQogc3RhdGljIGludCBweGEyeHhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHB4YTJ4eF9wY21fY2xpZW50ICpjbGllbnQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKQEAgLTE5NCwzMyArMzEsMTEgQEAKIAlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcnRkOwogCWludCByZXQ7CiAKLQlydW50aW1lLT5odyA9IHB4YTJ4eF9wY21faGFyZHdhcmU7Ci0KLQkvKgotCSAqIEZvciBteXN0ZXJpb3VzIHJlYXNvbnMgKGFuZCBkZXNwaXRlIHdoYXQgdGhlIG1hbnVhbCBzYXlzKQotCSAqIHBsYXliYWNrIHNhbXBsZXMgYXJlIGxvc3QgaWYgdGhlIERNQSBjb3VudCBpcyBub3QgYSBtdWx0aXBsZQotCSAqIG9mIHRoZSBETUEgYnVyc3Qgc2l6ZS4gIExldCdzIGFkZCBhIHJ1bGUgdG8gZW5mb3JjZSB0aGF0LgotCSAqLwotCXJldCA9IHNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKLQkJCQkgIHB4YTJ4eF9wY21faHdfcnVsZV9tdWx0MzIsIE5VTEwsCi0JCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAtMSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAotCQkJCSAgcHhhMnh4X3BjbV9od19ydWxlX211bHQzMiwgTlVMTCwKLQkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIC0xKTsKKwlyZXQgPSBfX3B4YTJ4eF9wY21fb3BlbihzdWJzdHJlYW0pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gLUVOT01FTTsKLQlydGQgPSBrbWFsbG9jKHNpemVvZigqcnRkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFydGQpCi0JCWdvdG8gb3V0OwotCXJ0ZC0+ZG1hX2Rlc2NfYXJyYXkgPQotCQlkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKLQkJCQkgICAgICAgJnJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFydGQtPmRtYV9kZXNjX2FycmF5KQotCQlnb3RvIGVycjE7CisJcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCiAJcnRkLT5wYXJhbXMgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPwogCQkgICAgICBjbGllbnQtPnBsYXliYWNrX3BhcmFtcyA6IGNsaWVudC0+Y2FwdHVyZV9wYXJhbXM7CkBAIC0yMzAsMTcgKzQ1LDEzIEBACiAJCWdvdG8gZXJyMjsKIAlydGQtPmRtYV9jaCA9IHJldDsKIAotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHJ0ZDsKIAlyZXQgPSBjbGllbnQtPnN0YXJ0dXAoc3Vic3RyZWFtKTsKIAlpZiAoIXJldCkKIAkJZ290byBvdXQ7CiAKIAlweGFfZnJlZV9kbWEocnRkLT5kbWFfY2gpOwogIGVycjI6Ci0JZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKLQkJCSAgICAgIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXksIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cyk7Ci0gZXJyMToKLQlrZnJlZShydGQpOworCV9fcHhhMnh4X3BjbV9jbG9zZShzdWJzdHJlYW0pOwogIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjUyLDY5ICs2MywyMiBAQAogCiAJcHhhX2ZyZWVfZG1hKHJ0ZC0+ZG1hX2NoKTsKIAljbGllbnQtPnNodXRkb3duKHN1YnN0cmVhbSk7Ci0JZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKLQkJCSAgICAgIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXksIHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cyk7Ci0Ja2ZyZWUocnRkKTsKLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludAotcHhhMnh4X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAotCQkJCSAgICAgcnVudGltZS0+ZG1hX2FyZWEsCi0JCQkJICAgICBydW50aW1lLT5kbWFfYWRkciwKLQkJCQkgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7CisJcmV0dXJuIF9fcHhhMnh4X3BjbV9jbG9zZShzdWJzdHJlYW0pOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHB4YTJ4eF9wY21fb3BzID0gewogCS5vcGVuCQk9IHB4YTJ4eF9wY21fb3BlbiwKIAkuY2xvc2UJCT0gcHhhMnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCi0JLmh3X3BhcmFtcwk9IHB4YTJ4eF9wY21faHdfcGFyYW1zLAotCS5od19mcmVlCT0gcHhhMnh4X3BjbV9od19mcmVlLAorCS5od19wYXJhbXMJPSBfX3B4YTJ4eF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gX19weGEyeHhfcGNtX2h3X2ZyZWUsCiAJLnByZXBhcmUJPSBweGEyeHhfcGNtX3ByZXBhcmUsCiAJLnRyaWdnZXIJPSBweGEyeHhfcGNtX3RyaWdnZXIsCiAJLnBvaW50ZXIJPSBweGEyeHhfcGNtX3BvaW50ZXIsCiAJLm1tYXAJCT0gcHhhMnh4X3BjbV9tbWFwLAogfTsKIAotc3RhdGljIGludCBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0Jc2l6ZV90IHNpemUgPSBweGEyeHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7Ci0JYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKLQlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JYnVmLT5hcmVhID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgc2l6ZSwKLQkJCQkJICAgJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYtPmFyZWEpCi0JCXJldHVybiAtRU5PTUVNOwotCWJ1Zi0+Ynl0ZXMgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBweGEyeHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKLQlpbnQgc3RyZWFtOwotCi0JZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgewotCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07Ci0JCWlmICghc3Vic3RyZWFtKQotCQkJY29udGludWU7Ci0JCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JCWlmICghYnVmLT5hcmVhKQotCQkJY29udGludWU7Ci0JCWRtYV9mcmVlX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgYnVmLT5ieXRlcywKLQkJCQkgICAgICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7Ci0JCWJ1Zi0+YXJlYSA9IE5VTEw7Ci0JfQotfQotCiBzdGF0aWMgdTY0IHB4YTJ4eF9wY21fZG1hbWFzayA9IDB4ZmZmZmZmZmY7CiAKIGludCBweGEyeHhfcGNtX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBweGEyeHhfcGNtX2NsaWVudCAqY2xpZW50LApkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1wY20uaCBiL3NvdW5kL2FybS9weGEyeHgtcGNtLmgKaW5kZXggYjc5ZjFlOC4uNWM0YTRkMyAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1wY20uaAorKysgYi9zb3VuZC9hcm0vcHhhMnh4LXBjbS5oCkBAIC05LDE0ICs5LDE1IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgewotCWNoYXIgKm5hbWU7CQkJLyogc3RyZWFtIGlkZW50aWZpZXIgKi8KLQl1MzIgZGNtZDsJCQkvKiBETUEgZGVzY3JpcHRvciBkY21kIGZpZWxkICovCi0Jdm9sYXRpbGUgdTMyICpkcmNtcjsJCS8qIHRoZSBETUEgcmVxdWVzdCBjaGFubmVsIHRvIHVzZSAqLwotCXUzMiBkZXZfYWRkcjsJCQkvKiBkZXZpY2UgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BICovCitzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSB7CisJaW50IGRtYV9jaDsKKwlzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zICpwYXJhbXM7CisJcHhhX2RtYV9kZXNjICpkbWFfZGVzY19hcnJheTsKKwlkbWFfYWRkcl90IGRtYV9kZXNjX2FycmF5X3BoeXM7CiB9OwotCQorCiBzdHJ1Y3QgcHhhMnh4X3BjbV9jbGllbnQgewogCXN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgKnBsYXliYWNrX3BhcmFtczsKIAlzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zICpjYXB0dXJlX3BhcmFtczsKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9zYTExeHgtdWRhMTM0MS5jIGIvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKaW5kZXggYjljNTFiZi4uMWRjZDUxZCAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKKysrIGIvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKQEAgLTQ0Miw3ICs0NDIsOCBAQAogICAgICAgICAgICAgICAgIAogCS8qIHdlIGFyZSByZXF1ZXN0ZWQgdG8gcHJvY2VzcyBzeW5jaHJvbml6YXRpb24gRE1BIHRyYW5zZmVyICovCiAJaWYgKHMtPnR4X3NwaW4pIHsKLQkJc25kX2Fzc2VydChzLT5zdHJlYW1faWQgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgcmV0dXJuKTsKKwkJaWYgKHNuZF9CVUdfT04ocy0+c3RyZWFtX2lkICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spKQorCQkJcmV0dXJuOwogCQkvKiBmaWxsIHRoZSB4bWl0IGRtYSBidWZmZXJzIGFuZCByZXR1cm4gKi8KICNpZmRlZiBISF9WRVJTSU9OCiAJCXNhMTEwMF9kbWFfc2V0X3NwaW4ocy0+ZG1hY2gsIEZPUkNFX0NMT0NLX0FERFIsIEZPUkNFX0NMT0NLX1NJWkUpOwpAQCAtNDcyLDcgKzQ3Myw3IEBACiAJCQkJY29udGludWU7CQkvKiBzcGVjaWFsIGNhc2UgKi8KIAkJfSBlbHNlIHsKIAkJCW9mZnNldCA9IGRtYV9zaXplICogcy0+cGVyaW9kOwotCQkJc25kX2Fzc2VydChkbWFfc2l6ZSA8PSBETUFfQlVGX1NJWkUsICk7CisJCQlzbmRfQlVHX09OKGRtYV9zaXplID4gRE1BX0JVRl9TSVpFKTsKIAkJfQogI2lmZGVmIEhIX1ZFUlNJT04KIAkJcmV0ID0gc2ExMTAwX2RtYV9xdWV1ZV9idWZmZXIocy0+ZG1hY2gsIHMsIHJ1bnRpbWUtPmRtYV9hZGRyICsgb2Zmc2V0LCBkbWFfc2l6ZSk7CkBAIC04NzksNyArODgwLDcgQEAKIAlhdWRpb19kbWFfZnJlZSgmY2hpcC0+c1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2ExMXh4X3VkYTEzNDFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc2ExMXh4X3VkYTEzNDFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQogewogCWludCBlcnI7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9LY29uZmlnIGIvc291bmQvY29yZS9LY29uZmlnCmluZGV4IDMzNWQ0NWUuLjY2MzQ4YzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvS2NvbmZpZworKysgYi9zb3VuZC9jb3JlL0tjb25maWcKQEAgLTEyLDYgKzEyLDEyIEBACiBjb25maWcgU05EX1JBV01JREkKIAl0cmlzdGF0ZQogCisjIFRvIGJlIGVmZmVjdGl2ZSB0aGlzIGFsc28gcmVxdWlyZXMgSU5QVVQgLSB1c2VycyBzaG91bGQgc2F5OgorIyAgICBzZWxlY3QgU05EX0pBQ0sgaWYgSU5QVVQ9eSB8fCBJTlBVVD1TTkQKKyMgdG8gYXZvaWQgaGF2aW5nIHRvIGZvcmNlIElOUFVUIG9uLgorY29uZmlnIFNORF9KQUNLCisJYm9vbAorCiBjb25maWcgU05EX1NFUVVFTkNFUgogCXRyaXN0YXRlICJTZXF1ZW5jZXIgc3VwcG9ydCIKIAlzZWxlY3QgU05EX1RJTUVSCkBAIC0zOCw2ICs0NCw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtc2VxLWR1bW15LgogCiBjb25maWcgU05EX09TU0VNVUwKKwlzZWxlY3QgU09VTkRfT1NTX0NPUkUKIAlib29sCiAKIGNvbmZpZyBTTkRfTUlYRVJfT1NTCkBAIC0xMDEsNiArMTA4LDkgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNuZC1ydGN0aW1lci4KIAorCSAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGV4Y2x1c2l2ZSB3aXRoIHRoZSBuZXcgUlRDIGRyaXZlcnMKKwkgIChDT05GSUdfUlRDX0NMQVNTKSBzaW5jZSB0aGlzIHJlcXVpcmVzIHRoZSBvbGQgQVBJLgorCiBjb25maWcgU05EX1NFUV9SVENUSU1FUl9ERUZBVUxUCiAJYm9vbCAiVXNlIFJUQyBhcyBkZWZhdWx0IHNlcXVlbmNlciB0aW1lciIKIAlkZXBlbmRzIG9uIFNORF9SVENUSU1FUiAmJiBTTkRfU0VRVUVOQ0VSCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL01ha2VmaWxlIGIvc291bmQvY29yZS9NYWtlZmlsZQppbmRleCBkYThlNjg1Li5kNTcxMjVhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL01ha2VmaWxlCisrKyBiL3NvdW5kL2NvcmUvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiBzbmQtJChDT05GSUdfSVNBX0RNQV9BUEkpICs9IGlzYWRtYS5vCiBzbmQtJChDT05GSUdfU05EX09TU0VNVUwpICs9IHNvdW5kX29zcy5vIGluZm9fb3NzLm8KIHNuZC0kKENPTkZJR19TTkRfVk1BU1RFUikgKz0gdm1hc3Rlci5vCitzbmQtJChDT05GSUdfU05EX0pBQ0spCSAgKz0gamFjay5vCiAKIHNuZC1wY20tb2JqcyA6PSBwY20ubyBwY21fbmF0aXZlLm8gcGNtX2xpYi5vIHBjbV90aW1lci5vIHBjbV9taXNjLm8gXAogCQlwY21fbWVtb3J5Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29udHJvbC5jIGIvc291bmQvY29yZS9jb250cm9sLmMKaW5kZXggMjgxYjJlMi4uNmQ3MWY5YSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTEzOSw3ICsxMzksOCBAQAogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmN0bDsKIAlzdHJ1Y3Qgc25kX2tjdGxfZXZlbnQgKmV2OwogCQotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIGlkICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWlkKSkKKwkJcmV0dXJuOwogCXJlYWRfbG9jaygmY2FyZC0+Y3RsX2ZpbGVzX3J3bG9jayk7CiAjaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCiAJY2FyZC0+bWl4ZXJfb3NzX2NoYW5nZV9jb3VudCsrOwpAQCAtMTg4LDggKzE4OSw4IEBACiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAl1bnNpZ25lZCBpbnQgaWR4OwogCQotCXNuZF9hc3NlcnQoY29udHJvbCAhPSBOVUxMLCByZXR1cm4gTlVMTCk7Ci0Jc25kX2Fzc2VydChjb250cm9sLT5jb3VudCA+IDAsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighY29udHJvbCB8fCAhY29udHJvbC0+Y291bnQpKQorCQlyZXR1cm4gTlVMTDsKIAlrY3RsID0ga3phbGxvYyhzaXplb2YoKmtjdGwpICsgc2l6ZW9mKHN0cnVjdCBzbmRfa2NvbnRyb2xfdm9sYXRpbGUpICogY29udHJvbC0+Y291bnQsIEdGUF9LRVJORUwpOwogCWlmIChrY3RsID09IE5VTEwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFsbG9jYXRlIGNvbnRyb2wgaW5zdGFuY2VcbiIpOwpAQCAtMjE4LDggKzIxOSw4IEBACiAJc3RydWN0IHNuZF9rY29udHJvbCBrY3RsOwogCXVuc2lnbmVkIGludCBhY2Nlc3M7CiAJCi0Jc25kX2Fzc2VydChuY29udHJvbCAhPSBOVUxMLCByZXR1cm4gTlVMTCk7Ci0Jc25kX2Fzc2VydChuY29udHJvbC0+aW5mbyAhPSBOVUxMLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04oIW5jb250cm9sIHx8ICFuY29udHJvbC0+aW5mbykpCisJCXJldHVybiBOVUxMOwogCW1lbXNldCgma2N0bCwgMCwgc2l6ZW9mKGtjdGwpKTsKIAlrY3RsLmlkLmlmYWNlID0gbmNvbnRyb2wtPmlmYWNlOwogCWtjdGwuaWQuZGV2aWNlID0gbmNvbnRyb2wtPmRldmljZTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiAJaWYgKCEga2NvbnRyb2wpCiAJCXJldHVybiBlcnI7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIGdvdG8gZXJyb3IpOwotCXNuZF9hc3NlcnQoa2NvbnRyb2wtPmluZm8gIT0gTlVMTCwgZ290byBlcnJvcik7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWtjb250cm9sLT5pbmZvKSkKKwkJZ290byBlcnJvcjsKIAlpZCA9IGtjb250cm9sLT5pZDsKIAlkb3duX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CiAJaWYgKHNuZF9jdGxfZmluZF9pZChjYXJkLCAmaWQpKSB7CkBAIC0zNjcsNyArMzY4LDggQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwogCXVuc2lnbmVkIGludCBpZHg7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCAmJiBrY29udHJvbCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWtjb250cm9sKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJbGlzdF9kZWwoJmtjb250cm9sLT5saXN0KTsKIAljYXJkLT5jb250cm9sc19jb3VudCAtPSBrY29udHJvbC0+Y291bnQ7CiAJaWQgPSBrY29udHJvbC0+aWQ7CkBAIC00ODcsNyArNDg5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwgJiYgbnVtaWQgIT0gMCwgcmV0dXJuIE5VTEwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFudW1pZCkpCisJCXJldHVybiBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmNvbnRyb2xzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5pZC5udW1pZCA8PSBudW1pZCAmJiBrY3RsLT5pZC5udW1pZCArIGtjdGwtPmNvdW50ID4gbnVtaWQpCiAJCQlyZXR1cm4ga2N0bDsKQEAgLTUxNCw3ICs1MTcsOCBAQAogewogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCAmJiBpZCAhPSBOVUxMLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWlkKSkKKwkJcmV0dXJuIE5VTEw7CiAJaWYgKGlkLT5udW1pZCAhPSAwKQogCQlyZXR1cm4gc25kX2N0bF9maW5kX251bWlkKGNhcmQsIGlkLT5udW1pZCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShrY3RsLCAmY2FyZC0+Y29udHJvbHMsIGxpc3QpIHsKQEAgLTY0Nyw3ICs2NTEsNyBAQAogI2VuZGlmCiAJcmVzdWx0ID0ga2N0bC0+aW5mbyhrY3RsLCBpbmZvKTsKIAlpZiAocmVzdWx0ID49IDApIHsKLQkJc25kX2Fzc2VydChpbmZvLT5hY2Nlc3MgPT0gMCwgKTsKKwkJc25kX0JVR19PTihpbmZvLT5hY2Nlc3MpOwogCQlpbmRleF9vZmZzZXQgPSBzbmRfY3RsX2dldF9pb2ZmKGtjdGwsICZpbmZvLT5pZCk7CiAJCXZkID0gJmtjdGwtPnZkW2luZGV4X29mZnNldF07CiAJCXNuZF9jdGxfYnVpbGRfaW9mZigmaW5mby0+aWQsIGtjdGwsIGluZGV4X29mZnNldCk7CkBAIC0xMTYwLDcgKzExNjQsOCBAQAogCiAJY3RsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNhcmQgPSBjdGwtPmNhcmQ7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfQ1RMX0lPQ1RMX1BWRVJTSU9OOgogCQlyZXR1cm4gcHV0X3VzZXIoU05EUlZfQ1RMX1ZFUlNJT04sIGlwKSA/IC1FRkFVTFQgOiAwOwpAQCAtMTIyMiw3ICsxMjI3LDggQEAKIAlzc2l6ZV90IHJlc3VsdCA9IDA7CiAKIAljdGwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChjdGwgIT0gTlVMTCAmJiBjdGwtPmNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWN0bCB8fCAhY3RsLT5jYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoIWN0bC0+c3Vic2NyaWJlZCkKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKGNvdW50IDwgc2l6ZW9mKHN0cnVjdCBzbmRfY3RsX2V2ZW50KSkKQEAgLTEzMjgsNyArMTMzNCw4IEBACiB7CiAJc3RydWN0IHNuZF9rY3RsX2lvY3RsICpwOwogCi0Jc25kX2Fzc2VydChmY24gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFmY24pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlkb3duX3dyaXRlKCZzbmRfaW9jdGxfcndzZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgbGlzdHMsIGxpc3QpIHsKIAkJaWYgKHAtPmZpb2N0bCA9PSBmY24pIHsKQEAgLTE0MDQsOSArMTQxMSwxMSBAQAogCWludCBlcnIsIGNhcmRudW07CiAJY2hhciBuYW1lWzE2XTsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCkpCisJCXJldHVybiAtRU5YSU87CiAJY2FyZG51bSA9IGNhcmQtPm51bWJlcjsKLQlzbmRfYXNzZXJ0KGNhcmRudW0gPj0gMCAmJiBjYXJkbnVtIDwgU05EUlZfQ0FSRFMsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKGNhcmRudW0gPCAwIHx8IGNhcmRudW0gPj0gU05EUlZfQ0FSRFMpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwcmludGYobmFtZSwgImNvbnRyb2xDJWkiLCBjYXJkbnVtKTsKIAlpZiAoKGVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfQ09OVFJPTCwgY2FyZCwgLTEsCiAJCQkJICAgICAgICZzbmRfY3RsX2Zfb3BzLCBjYXJkLCBuYW1lKSkgPCAwKQpAQCAtMTQyMywxNiArMTQzMiwxOCBAQAogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmN0bDsKIAlpbnQgZXJyLCBjYXJkbnVtOwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAljYXJkbnVtID0gY2FyZC0+bnVtYmVyOwotCXNuZF9hc3NlcnQoY2FyZG51bSA+PSAwICYmIGNhcmRudW0gPCBTTkRSVl9DQVJEUywgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oY2FyZG51bSA8IDAgfHwgY2FyZG51bSA+PSBTTkRSVl9DQVJEUykpCisJCXJldHVybiAtRU5YSU87CiAKLQlkb3duX3JlYWQoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwlyZWFkX2xvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RsLCAmY2FyZC0+Y3RsX2ZpbGVzLCBsaXN0KSB7CiAJCXdha2VfdXAoJmN0bC0+Y2hhbmdlX3NsZWVwKTsKIAkJa2lsbF9mYXN5bmMoJmN0bC0+ZmFzeW5jLCBTSUdJTywgUE9MTF9FUlIpOwogCX0KLQl1cF9yZWFkKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisJcmVhZF91bmxvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwogCiAJaWYgKChlcnIgPSBzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfQ09OVFJPTCwKIAkJCQkJIGNhcmQsIC0xKSkgPCAwKQpAQCAtMTQ2OSw3ICsxNDgwLDggQEAKIAkJLmRldl9kaXNjb25uZWN0ID0gc25kX2N0bF9kZXZfZGlzY29ubmVjdCwKIAl9OwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlyZXR1cm4gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0NPTlRST0wsIGNhcmQsICZvcHMpOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKaW5kZXggNjEwMTI1OS4uMzY4ZGM5YyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYwpAQCAtMzk4LDcgKzM5OCw4IEBACiAJaW50IGVycjsKIAogCWN0bCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KGN0bCAmJiBjdGwtPmNhcmQsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjdGwgfHwgIWN0bC0+Y2FyZCkpCisJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfQ1RMX0lPQ1RMX1BWRVJTSU9OOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggMjAyZGFjMC4uYzU4ZDgyMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC00NSw5ICs0NSw4IEBACiB7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KGRldmljZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQob3BzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFkZXZpY2VfZGF0YSB8fCAhb3BzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNhbm5vdCBhbGxvY2F0ZSBkZXZpY2VcbiIpOwpAQCAtODAsOCArNzksOCBAQAogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAJCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoZGV2aWNlX2RhdGEgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWRldmljZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCiAJCQljb250aW51ZTsKQEAgLTEyMyw4ICsxMjIsOCBAQAogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChkZXZpY2VfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEpKQorCQlyZXR1cm4gLUVOWElPOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewogCQlpZiAoZGV2LT5kZXZpY2VfZGF0YSAhPSBkZXZpY2VfZGF0YSkKIAkJCWNvbnRpbnVlOwpAQCAtMTU5LDggKzE1OCw4IEBACiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoZGV2aWNlX2RhdGEgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIWRldmljZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCiAJCQljb250aW51ZTsKQEAgLTE4OCw3ICsxODcsOCBAQAogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAJaW50IGVycjsKIAkKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVOWElPOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewogCQlpZiAoZGV2LT5zdGF0ZSA9PSBTTkRSVl9ERVZfQlVJTEQgJiYgZGV2LT5vcHMtPmRldl9yZWdpc3RlcikgewogCQkJaWYgKChlcnIgPSBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKGRldikpIDwgMCkKQEAgLTIwOCw3ICsyMDgsOCBAQAogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CiAJaW50IGVyciA9IDA7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVOWElPOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2FyZC0+ZGV2aWNlcywgbGlzdCkgewogCQlpZiAoc25kX2RldmljZV9kaXNjb25uZWN0KGNhcmQsIGRldi0+ZGV2aWNlX2RhdGEpIDwgMCkKIAkJCWVyciA9IC1FTlhJTzsKQEAgLTIyNiw3ICsyMjcsOCBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHJhbmdlX2xvdywgcmFuZ2VfaGlnaDsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCkpCisJCXJldHVybiAtRU5YSU87CiAJcmFuZ2VfbG93ID0gY21kICogU05EUlZfREVWX1RZUEVfUkFOR0VfU0laRTsKIAlyYW5nZV9oaWdoID0gcmFuZ2VfbG93ICsgU05EUlZfREVWX1RZUEVfUkFOR0VfU0laRSAtIDE7CiAgICAgICBfX2FnYWluOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9od2RlcC5jIGIvc291bmQvY29yZS9od2RlcC5jCmluZGV4IDZkNjU4OWYuLjE5NWNhZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaHdkZXAuYworKysgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKQEAgLTM1Myw5ICszNTMsMTAgQEAKIAkJLmRldl9kaXNjb25uZWN0ID0gc25kX2h3ZGVwX2Rldl9kaXNjb25uZWN0LAogCX07CiAKLQlzbmRfYXNzZXJ0KHJod2RlcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0JKnJod2RlcCA9IE5VTEw7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAocmh3ZGVwKQorCQkqcmh3ZGVwID0gTlVMTDsKIAlod2RlcCA9IGt6YWxsb2Moc2l6ZW9mKCpod2RlcCksIEdGUF9LRVJORUwpOwogCWlmIChod2RlcCA9PSBOVUxMKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImh3ZGVwOiBjYW5ub3QgYWxsb2NhdGVcbiIpOwpAQCAtMzc0LDEzICszNzUsMTUgQEAKIAl9CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaHdkZXAtPm9wZW5fd2FpdCk7CiAJbXV0ZXhfaW5pdCgmaHdkZXAtPm9wZW5fbXV0ZXgpOwotCSpyaHdkZXAgPSBod2RlcDsKKwlpZiAocmh3ZGVwKQorCQkqcmh3ZGVwID0gaHdkZXA7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2h3ZGVwX2ZyZWUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApCiB7Ci0Jc25kX2Fzc2VydChod2RlcCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoIWh3ZGVwKQorCQlyZXR1cm4gMDsKIAlpZiAoaHdkZXAtPnByaXZhdGVfZnJlZSkKIAkJaHdkZXAtPnByaXZhdGVfZnJlZShod2RlcCk7CiAJa2ZyZWUoaHdkZXApOwpAQCAtNDQwLDcgKzQ0Myw4IEBACiB7CiAJc3RydWN0IHNuZF9od2RlcCAqaHdkZXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCi0Jc25kX2Fzc2VydChod2RlcCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighaHdkZXApKQorCQlyZXR1cm4gLUVOWElPOwogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlpZiAoc25kX2h3ZGVwX3NlYXJjaChod2RlcC0+Y2FyZCwgaHdkZXAtPmRldmljZSkgIT0gaHdkZXApIHsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luZm8uYyBiL3NvdW5kL2NvcmUvaW5mby5jCmluZGV4IGM2Nzc3M2EuLjUyN2IyMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5mby5jCisrKyBiL3NvdW5kL2NvcmUvaW5mby5jCkBAIC0yMTcsNyArMjE3LDggQEAKIAlsb2ZmX3QgcG9zOwogCiAJZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KGRhdGEgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWRhdGEpKQorCQlyZXR1cm4gLUVOWElPOwogCXBvcyA9ICpvZmZzZXQ7CiAJaWYgKHBvcyA8IDAgfHwgKGxvbmcpIHBvcyAhPSBwb3MgfHwgKHNzaXplX3QpIGNvdW50IDwgMCkKIAkJcmV0dXJuIC1FSU87CkBAIC0yNTgsNyArMjU5LDggQEAKIAlsb2ZmX3QgcG9zOwogCiAJZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KGRhdGEgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWRhdGEpKQorCQlyZXR1cm4gLUVOWElPOwogCWVudHJ5ID0gZGF0YS0+ZW50cnk7CiAJcG9zID0gKm9mZnNldDsKIAlpZiAocG9zIDwgMCB8fCAobG9uZykgcG9zICE9IHBvcyB8fCAoc3NpemVfdCkgY291bnQgPCAwKQpAQCAtNjE0LDcgKzYxNiw4IEBACiAJY2hhciBzdHJbOF07CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCkpCisJCXJldHVybiAtRU5YSU87CiAKIAlzcHJpbnRmKHN0ciwgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7CiAJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9tb2R1bGVfZW50cnkoY2FyZC0+bW9kdWxlLCBzdHIsIE5VTEwpKSA9PSBOVUxMKQpAQCAtNjM2LDcgKzYzOSw4IEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWlmICghc3RyY21wKGNhcmQtPmlkLCBjYXJkLT5wcm9jX3Jvb3QtPm5hbWUpKQogCQlyZXR1cm4gMDsKQEAgLTY1NCw3ICs2NTgsOCBAQAogICovCiB2b2lkIHNuZF9pbmZvX2NhcmRfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybik7CisJaWYgKCFjYXJkKQorCQlyZXR1cm47CiAJbXV0ZXhfbG9jaygmaW5mb19tdXRleCk7CiAJaWYgKGNhcmQtPnByb2Nfcm9vdF9saW5rKSB7CiAJCXNuZF9yZW1vdmVfcHJvY19lbnRyeShzbmRfcHJvY19yb290LCBjYXJkLT5wcm9jX3Jvb3RfbGluayk7CkBAIC02NzEsNyArNjc2LDggQEAKICAqLwogaW50IHNuZF9pbmZvX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CiAJc25kX2luZm9fZnJlZV9lbnRyeShjYXJkLT5wcm9jX3Jvb3QpOwogCWNhcmQtPnByb2Nfcm9vdCA9IE5VTEw7CiAJcmV0dXJuIDA7CkBAIC04NDksNyArODU1LDcgQEAKIAkJcmV0dXJuOwogCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKIAlyb290ID0gZW50cnktPnBhcmVudCA9PSBOVUxMID8gc25kX3Byb2Nfcm9vdCA6IGVudHJ5LT5wYXJlbnQtPnA7Ci0Jc25kX2Fzc2VydChyb290LCByZXR1cm4pOworCXNuZF9CVUdfT04oIXJvb3QpOwogCXNuZF9yZW1vdmVfcHJvY19lbnRyeShyb290LCBlbnRyeS0+cCk7CiAJZW50cnktPnAgPSBOVUxMOwogfQpAQCAtOTQ3LDcgKzk1Myw4IEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LCAqcCA9IE5VTEw7CiAKLQlzbmRfYXNzZXJ0KGVudHJ5ICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFlbnRyeSkpCisJCXJldHVybiAtRU5YSU87CiAJcm9vdCA9IGVudHJ5LT5wYXJlbnQgPT0gTlVMTCA/IHNuZF9wcm9jX3Jvb3QgOiBlbnRyeS0+cGFyZW50LT5wOwogCW11dGV4X2xvY2soJmluZm9fbXV0ZXgpOwogCXAgPSBzbmRfY3JlYXRlX3Byb2NfZW50cnkoZW50cnktPm5hbWUsIGVudHJ5LT5tb2RlLCByb290KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mb19vc3MuYyBiL3NvdW5kL2NvcmUvaW5mb19vc3MuYwppbmRleCBlMzU3ODlhLi5lNGFmMTM4IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luZm9fb3NzLmMKKysrIGIvc291bmQvY29yZS9pbmZvX29zcy5jCkBAIC00Myw4ICs0MywxMCBAQAogewogCWNoYXIgKng7CiAKLQlzbmRfYXNzZXJ0KGRldiA+PSAwICYmIGRldiA8IFNORFJWX09TU19JTkZPX0RFVl9DT1VOVCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChudW0gPj0gMCAmJiBudW0gPCBTTkRSVl9DQVJEUywgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oZGV2IDwgMCB8fCBkZXYgPj0gU05EUlZfT1NTX0lORk9fREVWX0NPVU5UKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihudW0gPCAwIHx8IG51bSA+PSBTTkRSVl9DQVJEUykpCisJCXJldHVybiAtRU5YSU87CiAJbXV0ZXhfbG9jaygmc3RyaW5ncyk7CiAJaWYgKHN0cmluZyA9PSBOVUxMKSB7CiAJCWlmICgoeCA9IHNuZF9zbmRzdGF0X3N0cmluZ3NbbnVtXVtkZXZdKSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luaXQuYyBiL3NvdW5kL2NvcmUvaW5pdC5jCmluZGV4IGRmNDZiYmMuLmVmMjM1MmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvaW5pdC5jCkBAIC01NDUsMTIgKzU0NSwxMyBAQAogewogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAjaWZuZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJaWYgKCFjYXJkLT5jYXJkX2RldikgewotCQljYXJkLT5jYXJkX2RldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShzb3VuZF9jbGFzcywgY2FyZC0+ZGV2LAotCQkJCQkJICAgICAgIE1LREVWKDAsIDApLCBOVUxMLAotCQkJCQkJICAgICAgICJjYXJkJWkiLCBjYXJkLT5udW1iZXIpOworCQljYXJkLT5jYXJkX2RldiA9IGRldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIGNhcmQtPmRldiwKKwkJCQkJICAgICAgIE1LREVWKDAsIDApLCBOVUxMLAorCQkJCQkgICAgICAgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7CiAJCWlmIChJU19FUlIoY2FyZC0+Y2FyZF9kZXYpKQogCQkJY2FyZC0+Y2FyZF9kZXYgPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvamFjay5jIGIvc291bmQvY29yZS9qYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2NvcmUvamFjay5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogIEphY2sgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqCisgKiAgQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorCitzdGF0aWMgaW50IHNuZF9qYWNrX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNuZF9qYWNrICpqYWNrID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKworCS8qIElmIHRoZSBpbnB1dCBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBpbnB1dCBzdWJzeXN0ZW0KKwkgKiB0aGVuIHdlIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGRlYWxsb2NhdG9yLiAqLworCWlmIChqYWNrLT5yZWdpc3RlcmVkKQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShqYWNrLT5pbnB1dF9kZXYpOworCWVsc2UKKwkJaW5wdXRfZnJlZV9kZXZpY2UoamFjay0+aW5wdXRfZGV2KTsKKworCWtmcmVlKGphY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2phY2tfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNuZF9qYWNrICpqYWNrID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZpY2UtPmNhcmQ7CisJaW50IGVycjsKKworCXNucHJpbnRmKGphY2stPm5hbWUsIHNpemVvZihqYWNrLT5uYW1lKSwgIiVzICVzIiwKKwkJIGNhcmQtPmxvbmduYW1lLCBqYWNrLT5pZCk7CisJamFjay0+aW5wdXRfZGV2LT5uYW1lID0gamFjay0+bmFtZTsKKworCS8qIERlZmF1bHQgdG8gdGhlIHNvdW5kIGNhcmQgZGV2aWNlLiAqLworCWlmICghamFjay0+aW5wdXRfZGV2LT5kZXYucGFyZW50KQorCQlqYWNrLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQgPSBjYXJkLT5kZXY7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoamFjay0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyID09IDApCisJCWphY2stPnJlZ2lzdGVyZWQgPSAxOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBzbmRfamFja19uZXcgLSBDcmVhdGUgYSBuZXcgamFjaworICogQGNhcmQ6ICB0aGUgY2FyZCBpbnN0YW5jZQorICogQGlkOiAgICBhbiBpZGVudGlmeWluZyBzdHJpbmcgZm9yIHRoaXMgamFjaworICogQHR5cGU6ICBhIGJpdG1hc2sgb2YgZW51bSBzbmRfamFja190eXBlIHZhbHVlcyB0aGF0IGNhbiBiZSBkZXRlY3RlZCBieQorICogICAgICAgICB0aGlzIGphY2sKKyAqIEBqamFjazogVXNlZCB0byBwcm92aWRlIHRoZSBhbGxvY2F0ZWQgamFjayBvYmplY3QgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBDcmVhdGVzIGEgbmV3IGphY2sgb2JqZWN0LgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqIE9uIHN1Y2Nlc3MgamphY2sgd2lsbCBiZSBpbml0aWFsaXNlZC4KKyAqLworaW50IHNuZF9qYWNrX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGNvbnN0IGNoYXIgKmlkLCBpbnQgdHlwZSwKKwkJIHN0cnVjdCBzbmRfamFjayAqKmpqYWNrKQoreworCXN0cnVjdCBzbmRfamFjayAqamFjazsKKwlpbnQgZXJyOworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0geworCQkuZGV2X2ZyZWUgPSBzbmRfamFja19kZXZfZnJlZSwKKwkJLmRldl9yZWdpc3RlciA9IHNuZF9qYWNrX2Rldl9yZWdpc3RlciwKKwl9OworCisJamFjayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfamFjayksIEdGUF9LRVJORUwpOworCWlmIChqYWNrID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJamFjay0+aWQgPSBpZDsKKworCWphY2stPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmIChqYWNrLT5pbnB1dF9kZXYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW5wdXQ7CisJfQorCisJamFjay0+aW5wdXRfZGV2LT5waHlzID0gIkFMU0EiOworCisJamFjay0+dHlwZSA9IHR5cGU7CisKKwlpZiAodHlwZSAmIFNORF9KQUNLX0hFQURQSE9ORSkKKwkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoamFjay0+aW5wdXRfZGV2LCBFVl9TVywKKwkJCQkgICAgIFNXX0hFQURQSE9ORV9JTlNFUlQpOworCWlmICh0eXBlICYgU05EX0pBQ0tfTUlDUk9QSE9ORSkKKwkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoamFjay0+aW5wdXRfZGV2LCBFVl9TVywKKwkJCQkgICAgIFNXX01JQ1JPUEhPTkVfSU5TRVJUKTsKKworCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9KQUNLLCBqYWNrLCAmb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX2lucHV0OworCisJKmpqYWNrID0gamFjazsKKworCXJldHVybiAwOworCitmYWlsX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGphY2stPmlucHV0X2Rldik7CisJa2ZyZWUoamFjayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woc25kX2phY2tfbmV3KTsKKworLyoqCisgKiBzbmRfamFja19zZXRfcGFyZW50IC0gU2V0IHRoZSBwYXJlbnQgZGV2aWNlIGZvciBhIGphY2sKKyAqCisgKiBAamFjazogICBUaGUgamFjayB0byBjb25maWd1cmUKKyAqIEBwYXJlbnQ6IFRoZSBkZXZpY2UgdG8gc2V0IGFzIHBhcmVudCBmb3IgdGhlIGphY2suCisgKgorICogU2V0IHRoZSBwYXJlbnQgZm9yIHRoZSBqYWNrIGlucHV0IGRldmljZSBpbiB0aGUgZGV2aWNlIHRyZWUuICBUaGlzCisgKiBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIHByaW9yIHRvIHJlZ2lzdHJhdGlvbiBvZiB0aGUgamFjay4gIElmIG5vCisgKiBwYXJlbnQgaXMgY29uZmlndXJlZCB0aGVuIHRoZSBwYXJlbnQgZGV2aWNlIHdpbGwgYmUgdGhlIHNvdW5kIGNhcmQuCisgKi8KK3ZvaWQgc25kX2phY2tfc2V0X3BhcmVudChzdHJ1Y3Qgc25kX2phY2sgKmphY2ssIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlXQVJOX09OKGphY2stPnJlZ2lzdGVyZWQpOworCisJamFjay0+aW5wdXRfZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworfQorRVhQT1JUX1NZTUJPTChzbmRfamFja19zZXRfcGFyZW50KTsKKworLyoqCisgKiBzbmRfamFja19yZXBvcnQgLSBSZXBvcnQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgamFjaworICoKKyAqIEBqYWNrOiAgIFRoZSBqYWNrIHRvIHJlcG9ydCBzdGF0dXMgZm9yCisgKiBAc3RhdHVzOiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGphY2sKKyAqLwordm9pZCBzbmRfamFja19yZXBvcnQoc3RydWN0IHNuZF9qYWNrICpqYWNrLCBpbnQgc3RhdHVzKQoreworCWlmIChqYWNrLT50eXBlICYgU05EX0pBQ0tfSEVBRFBIT05FKQorCQlpbnB1dF9yZXBvcnRfc3dpdGNoKGphY2stPmlucHV0X2RldiwgU1dfSEVBRFBIT05FX0lOU0VSVCwKKwkJCQkgICAgc3RhdHVzICYgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwlpZiAoamFjay0+dHlwZSAmIFNORF9KQUNLX01JQ1JPUEhPTkUpCisJCWlucHV0X3JlcG9ydF9zd2l0Y2goamFjay0+aW5wdXRfZGV2LCBTV19NSUNST1BIT05FX0lOU0VSVCwKKwkJCQkgICAgc3RhdHVzICYgU05EX0pBQ0tfTUlDUk9QSE9ORSk7CisKKwlpbnB1dF9zeW5jKGphY2stPmlucHV0X2Rldik7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9qYWNrX3JlcG9ydCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJKYWNrIGRldGVjdGlvbiBzdXBwb3J0IGZvciBBTFNBIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggZjVkNmQ4ZC4uMWIzNTM0ZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtMzMsOSArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9tZW1hbGxvYy5oPgotI2lmZGVmIENPTkZJR19TQlVTCi0jaW5jbHVkZSA8YXNtL3NidXMuaD4KLSNlbmRpZgogCiAKIE1PRFVMRV9BVVRIT1IoIlRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4sIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+Iik7CkBAIC00NiwxNCArNDMsNiBAQAogLyoKICAqLwogCi12b2lkICpzbmRfbWFsbG9jX3NnYnVmX3BhZ2VzKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwKLQkJCSAgICAgc2l6ZV90ICpyZXNfc2l6ZSk7Ci1pbnQgc25kX2ZyZWVfc2didWZfcGFnZXMoc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKTsKLQotLyoKLSAqLwotCiBzdGF0aWMgREVGSU5FX01VVEVYKGxpc3RfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChtZW1fbGlzdF9oZWFkKTsKIApAQCAtNjcsMTggKzU2LDYgQEAKIC8qIGlkIGZvciBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KICNkZWZpbmUgU05EUlZfRE1BX0RFVklDRV9VTlVTRUQgKHVuc2lnbmVkIGludCktMQogCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotI2RlZmluZSBfX0FTVFJJTkdfXyh4KSAjeAotI2RlZmluZSBzbmRfYXNzZXJ0KGV4cHIsIGFyZ3MuLi4pIGRvIHtcCi0JaWYgKCEoZXhwcikpIHtcCi0JCXByaW50ayhLRVJOX0VSUiAic25kLW1hbGxvYzogQlVHPyAoJXMpIChjYWxsZWQgZnJvbSAlcClcbiIsIF9fQVNUUklOR19fKGV4cHIpLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpO1wKLQkJYXJncztcCi0JfVwKLX0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBzbmRfYXNzZXJ0KGV4cHIsIGFyZ3MuLi4pIC8qKi8KLSNlbmRpZgotCiAvKgogICoKICAqICBHZW5lcmljIG1lbW9yeSBhbGxvY2F0b3JzCkBAIC0xMTEsOCArODgsMTAgQEAKIAlpbnQgcGc7CiAJdm9pZCAqcmVzOwogCi0Jc25kX2Fzc2VydChzaXplID4gMCwgcmV0dXJuIE5VTEwpOwotCXNuZF9hc3NlcnQoZ2ZwX2ZsYWdzICE9IDAsIHJldHVybiBOVUxMKTsKKwlpZiAoV0FSTl9PTighc2l6ZSkpCisJCXJldHVybiBOVUxMOworCWlmIChXQVJOX09OKCFnZnBfZmxhZ3MpKQorCQlyZXR1cm4gTlVMTDsKIAlnZnBfZmxhZ3MgfD0gX19HRlBfQ09NUDsJLyogY29tcG91bmQgcGFnZSBsZXRzIHBhcnRzIGJlIG1hcHBlZCAqLwogCXBnID0gZ2V0X29yZGVyKHNpemUpOwogCWlmICgocmVzID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhnZnBfZmxhZ3MsIHBnKSkgIT0gTlVMTCkKQEAgLTE1Miw4ICsxMzEsOCBAQAogCXZvaWQgKnJlczsKIAlnZnBfdCBnZnBfZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHNpemUgPiAwLCByZXR1cm4gTlVMTCk7Ci0Jc25kX2Fzc2VydChkbWEgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOworCWlmIChXQVJOX09OKCFkbWEpKQorCQlyZXR1cm4gTlVMTDsKIAlwZyA9IGdldF9vcmRlcihzaXplKTsKIAlnZnBfZmxhZ3MgPSBHRlBfS0VSTkVMCiAJCXwgX19HRlBfQ09NUAkvKiBjb21wb3VuZCBwYWdlIGxldHMgcGFydHMgYmUgbWFwcGVkICovCkBAIC0xODAsMzkgKzE1OSw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0hBU19ETUEgKi8KIAotI2lmZGVmIENPTkZJR19TQlVTCi0KLXN0YXRpYyB2b2lkICpzbmRfbWFsbG9jX3NidXNfcGFnZXMoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICBkbWFfYWRkcl90ICpkbWFfYWRkcikKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSAoc3RydWN0IHNidXNfZGV2ICopZGV2OwotCWludCBwZzsKLQl2b2lkICpyZXM7Ci0KLQlzbmRfYXNzZXJ0KHNpemUgPiAwLCByZXR1cm4gTlVMTCk7Ci0Jc25kX2Fzc2VydChkbWFfYWRkciAhPSBOVUxMLCByZXR1cm4gTlVMTCk7Ci0JcGcgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JcmVzID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsIFBBR0VfU0laRSAqICgxIDw8IHBnKSwgZG1hX2FkZHIpOwotCWlmIChyZXMgIT0gTlVMTCkKLQkJaW5jX3NuZF9wYWdlcyhwZyk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgc25kX2ZyZWVfc2J1c19wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJCXZvaWQgKnB0ciwgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSAoc3RydWN0IHNidXNfZGV2ICopZGV2OwotCWludCBwZzsKLQotCWlmIChwdHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXBnID0gZ2V0X29yZGVyKHNpemUpOwotCWRlY19zbmRfcGFnZXMocGcpOwotCXNidXNfZnJlZV9jb25zaXN0ZW50KHNkZXYsIFBBR0VfU0laRSAqICgxIDw8IHBnKSwgcHRyLCBkbWFfYWRkcik7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfU0JVUyAqLwotCiAvKgogICoKICAqICBBTFNBIGdlbmVyaWMgbWVtb3J5IG1hbmFnZW1lbnQKQEAgLTIzNiw4ICsxODIsMTAgQEAKIGludCBzbmRfZG1hX2FsbG9jX3BhZ2VzKGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHNpemVfdCBzaXplLAogCQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiKQogewotCXNuZF9hc3NlcnQoc2l6ZSA+IDAsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoZG1hYiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoV0FSTl9PTighc2l6ZSkpCisJCXJldHVybiAtRU5YSU87CisJaWYgKFdBUk5fT04oIWRtYWIpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJZG1hYi0+ZGV2LnR5cGUgPSB0eXBlOwogCWRtYWItPmRldi5kZXYgPSBkZXZpY2U7CkBAIC0yNDcsMTEgKzE5NSw2IEBACiAJCWRtYWItPmFyZWEgPSBzbmRfbWFsbG9jX3BhZ2VzKHNpemUsICh1bnNpZ25lZCBsb25nKWRldmljZSk7CiAJCWRtYWItPmFkZHIgPSAwOwogCQlicmVhazsKLSNpZmRlZiBDT05GSUdfU0JVUwotCWNhc2UgU05EUlZfRE1BX1RZUEVfU0JVUzoKLQkJZG1hYi0+YXJlYSA9IHNuZF9tYWxsb2Nfc2J1c19wYWdlcyhkZXZpY2UsIHNpemUsICZkbWFiLT5hZGRyKTsKLQkJYnJlYWs7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfSEFTX0RNQQogCWNhc2UgU05EUlZfRE1BX1RZUEVfREVWOgogCQlkbWFiLT5hcmVhID0gc25kX21hbGxvY19kZXZfcGFnZXMoZGV2aWNlLCBzaXplLCAmZG1hYi0+YWRkcik7CkBAIC0yOTIsMTUgKzIzNSwxNyBAQAogewogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KHNpemUgPiAwLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KGRtYWIgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7Ci0KIAl3aGlsZSAoKGVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXModHlwZSwgZGV2aWNlLCBzaXplLCBkbWFiKSkgPCAwKSB7CisJCXNpemVfdCBhbGlnbmVkX3NpemU7CiAJCWlmIChlcnIgIT0gLUVOT01FTSkKIAkJCXJldHVybiBlcnI7Ci0JCXNpemUgPj49IDE7CiAJCWlmIChzaXplIDw9IFBBR0VfU0laRSkKIAkJCXJldHVybiAtRU5PTUVNOworCQlhbGlnbmVkX3NpemUgPSBQQUdFX1NJWkUgPDwgZ2V0X29yZGVyKHNpemUpOworCQlpZiAoc2l6ZSAhPSBhbGlnbmVkX3NpemUpCisJCQlzaXplID0gYWxpZ25lZF9zaXplOworCQllbHNlCisJCQlzaXplID4+PSAxOwogCX0KIAlpZiAoISBkbWFiLT5hcmVhKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTMyMCwxMSArMjY1LDYgQEAKIAljYXNlIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVM6CiAJCXNuZF9mcmVlX3BhZ2VzKGRtYWItPmFyZWEsIGRtYWItPmJ5dGVzKTsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1NCVVMKLQljYXNlIFNORFJWX0RNQV9UWVBFX1NCVVM6Ci0JCXNuZF9mcmVlX3NidXNfcGFnZXMoZG1hYi0+ZGV2LmRldiwgZG1hYi0+Ynl0ZXMsIGRtYWItPmFyZWEsIGRtYWItPmFkZHIpOwotCQlicmVhazsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19IQVNfRE1BCiAJY2FzZSBTTkRSVl9ETUFfVFlQRV9ERVY6CiAJCXNuZF9mcmVlX2Rldl9wYWdlcyhkbWFiLT5kZXYuZGV2LCBkbWFiLT5ieXRlcywgZG1hYi0+YXJlYSwgZG1hYi0+YWRkcik7CkBAIC0zNTMsNyArMjkzLDggQEAKIHsKIAlzdHJ1Y3Qgc25kX21lbV9saXN0ICptZW07CiAKLQlzbmRfYXNzZXJ0KGRtYWIsIHJldHVybiAwKTsKKwlpZiAoV0FSTl9PTighZG1hYikpCisJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW0sICZtZW1fbGlzdF9oZWFkLCBsaXN0KSB7CkBAIC0zODcsNyArMzI4LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX21lbV9saXN0ICptZW07CiAKLQlzbmRfYXNzZXJ0KGRtYWIsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoV0FSTl9PTighZG1hYikpCisJCXJldHVybiAtRUlOVkFMOwogCW1lbSA9IGttYWxsb2Moc2l6ZW9mKCptZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBtZW0pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDMxLDcgKzM3Myw3IEBACiAJbG9uZyBwYWdlcyA9IHNuZF9hbGxvY2F0ZWRfcGFnZXMgPj4gKFBBR0VfU0hJRlQtMTIpOwogCXN0cnVjdCBzbmRfbWVtX2xpc3QgKm1lbTsKIAlpbnQgZGV2bm87Ci0Jc3RhdGljIGNoYXIgKnR5cGVzW10gPSB7ICJVTktOT1dOIiwgIkNPTlQiLCAiREVWIiwgIkRFVi1TRyIsICJTQlVTIiB9OworCXN0YXRpYyBjaGFyICp0eXBlc1tdID0geyAiVU5LTk9XTiIsICJDT05UIiwgIkRFViIsICJERVYtU0ciIH07CiAKIAltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKIAlzZXFfcHJpbnRmKHNlcSwgInBhZ2VzICA6ICVsaSBieXRlcyAoJWxpIHBhZ2VzIHBlciAlbGlrQilcbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9jb3B5LmMgYi9zb3VuZC9jb3JlL29zcy9jb3B5LmMKaW5kZXggOWRlZDMwZC4uMDViNThkNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvY29weS5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL2NvcHkuYwpAQCAtMzIsMTcgKzMyLDE4IEBACiAJdW5zaWduZWQgaW50IGNoYW5uZWw7CiAJdW5zaWduZWQgaW50IG5jaGFubmVsczsKIAotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwgJiYgc3JjX2NoYW5uZWxzICE9IE5VTEwgJiYgZHN0X2NoYW5uZWxzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4gfHwgIXNyY19jaGFubmVscyB8fCAhZHN0X2NoYW5uZWxzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoZnJhbWVzID09IDApCiAJCXJldHVybiAwOwogCW5jaGFubmVscyA9IHBsdWdpbi0+c3JjX2Zvcm1hdC5jaGFubmVsczsKIAlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbmNoYW5uZWxzOyBjaGFubmVsKyspIHsKLQkJc25kX2Fzc2VydChzcmNfY2hhbm5lbHMtPmFyZWEuZmlyc3QgJSA4ID09IDAgJiYKLQkJCSAgIHNyY19jaGFubmVscy0+YXJlYS5zdGVwICUgOCA9PSAwLAotCQkJICAgcmV0dXJuIC1FTlhJTyk7Ci0JCXNuZF9hc3NlcnQoZHN0X2NoYW5uZWxzLT5hcmVhLmZpcnN0ICUgOCA9PSAwICYmCi0JCQkgICBkc3RfY2hhbm5lbHMtPmFyZWEuc3RlcCAlIDggPT0gMCwKLQkJCSAgIHJldHVybiAtRU5YSU8pOworCQlpZiAoc25kX0JVR19PTihzcmNfY2hhbm5lbHMtPmFyZWEuZmlyc3QgJSA4IHx8CisJCQkgICAgICAgc3JjX2NoYW5uZWxzLT5hcmVhLnN0ZXAgJSA4KSkKKwkJCXJldHVybiAtRU5YSU87CisJCWlmIChzbmRfQlVHX09OKGRzdF9jaGFubmVscy0+YXJlYS5maXJzdCAlIDggfHwKKwkJCSAgICAgICBkc3RfY2hhbm5lbHMtPmFyZWEuc3RlcCAlIDgpKQorCQkJcmV0dXJuIC1FTlhJTzsKIAkJaWYgKCFzcmNfY2hhbm5lbHMtPmVuYWJsZWQpIHsKIAkJCWlmIChkc3RfY2hhbm5lbHMtPndhbnRlZCkKIAkJCQlzbmRfcGNtX2FyZWFfc2lsZW5jZSgmZHN0X2NoYW5uZWxzLT5hcmVhLCAwLCBmcmFtZXMsIHBsdWdpbi0+ZHN0X2Zvcm1hdC5mb3JtYXQpOwpAQCAtNjYsMTUgKzY3LDIwIEBACiAJc3RydWN0IHNuZF9wY21fcGx1Z2luICpwbHVnaW47CiAJaW50IHdpZHRoOwogCi0Jc25kX2Fzc2VydChyX3BsdWdpbiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcl9wbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyX3BsdWdpbiA9IE5VTEw7CiAKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPmZvcm1hdCA9PSBkc3RfZm9ybWF0LT5mb3JtYXQsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3JjX2Zvcm1hdC0+cmF0ZSA9PSBkc3RfZm9ybWF0LT5yYXRlLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPmNoYW5uZWxzID09IGRzdF9mb3JtYXQtPmNoYW5uZWxzLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5mb3JtYXQgIT0gZHN0X2Zvcm1hdC0+Zm9ybWF0KSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5yYXRlICE9IGRzdF9mb3JtYXQtPnJhdGUpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHNyY19mb3JtYXQtPmNoYW5uZWxzICE9IGRzdF9mb3JtYXQtPmNoYW5uZWxzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCXdpZHRoID0gc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoc3JjX2Zvcm1hdC0+Zm9ybWF0KTsKLQlzbmRfYXNzZXJ0KHdpZHRoID4gMCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04od2lkdGggPD0gMCkpCisJCXJldHVybiAtRU5YSU87CiAKIAllcnIgPSBzbmRfcGNtX3BsdWdpbl9idWlsZChwbHVnLCAiY29weSIsIHNyY19mb3JtYXQsIGRzdF9mb3JtYXQsCiAJCQkJICAgMCwgJnBsdWdpbik7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9pby5jIGIvc291bmQvY29yZS9vc3MvaW8uYwppbmRleCBmODc0ZjZjLi42ZmFhMWQ3MSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvaW8uYworKysgYi9zb3VuZC9jb3JlL29zcy9pby5jCkBAIC0zOSwxNCArMzksMTcgQEAKIAkJCQkgICAgc3RydWN0IHNuZF9wY21fcGx1Z2luX2NoYW5uZWwgKmRzdF9jaGFubmVscywKIAkJCQkgICAgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQogewotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3JjX2NoYW5uZWxzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKCFzcmNfY2hhbm5lbHMpKQorCQlyZXR1cm4gLUVOWElPOwogCWlmIChwbHVnaW4tPmFjY2VzcyA9PSBTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEKSB7CiAJCXJldHVybiBwY21fd3JpdGUocGx1Z2luLT5wbHVnLCBzcmNfY2hhbm5lbHMtPmFyZWEuYWRkciwgZnJhbWVzKTsKIAl9IGVsc2UgewogCQlpbnQgY2hhbm5lbCwgY2hhbm5lbHMgPSBwbHVnaW4tPmRzdF9mb3JtYXQuY2hhbm5lbHM7CiAJCXZvaWQgKipidWZzID0gKHZvaWQqKilwbHVnaW4tPmV4dHJhX2RhdGE7Ci0JCXNuZF9hc3NlcnQoYnVmcyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwkJaWYgKHNuZF9CVUdfT04oIWJ1ZnMpKQorCQkJcmV0dXJuIC1FTlhJTzsKIAkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzOyBjaGFubmVsKyspIHsKIAkJCWlmIChzcmNfY2hhbm5lbHNbY2hhbm5lbF0uZW5hYmxlZCkKIAkJCQlidWZzW2NoYW5uZWxdID0gc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuYWRkcjsKQEAgLTYyLDE0ICs2NSwxNyBAQAogCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3BsdWdpbl9jaGFubmVsICpkc3RfY2hhbm5lbHMsCiAJCQkJICAgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQogewotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoZHN0X2NoYW5uZWxzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKCFkc3RfY2hhbm5lbHMpKQorCQlyZXR1cm4gLUVOWElPOwogCWlmIChwbHVnaW4tPmFjY2VzcyA9PSBTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEKSB7CiAJCXJldHVybiBwY21fcmVhZChwbHVnaW4tPnBsdWcsIGRzdF9jaGFubmVscy0+YXJlYS5hZGRyLCBmcmFtZXMpOwogCX0gZWxzZSB7CiAJCWludCBjaGFubmVsLCBjaGFubmVscyA9IHBsdWdpbi0+ZHN0X2Zvcm1hdC5jaGFubmVsczsKIAkJdm9pZCAqKmJ1ZnMgPSAodm9pZCoqKXBsdWdpbi0+ZXh0cmFfZGF0YTsKLQkJc25kX2Fzc2VydChidWZzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCQlpZiAoc25kX0JVR19PTighYnVmcykpCisJCQlyZXR1cm4gLUVOWElPOwogCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHM7IGNoYW5uZWwrKykgewogCQkJaWYgKGRzdF9jaGFubmVsc1tjaGFubmVsXS5lbmFibGVkKQogCQkJCWJ1ZnNbY2hhbm5lbF0gPSBkc3RfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5hZGRyOwpAQCAtMTA3LDkgKzExMywxMSBAQAogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbl9mb3JtYXQgZm9ybWF0OwogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbiAqcGx1Z2luOwogCi0Jc25kX2Fzc2VydChyX3BsdWdpbiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcl9wbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyX3BsdWdpbiA9IE5VTEw7Ci0Jc25kX2Fzc2VydChwbHVnICE9IE5VTEwgJiYgcGFyYW1zICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnIHx8ICFwYXJhbXMpKQorCQlyZXR1cm4gLUVOWElPOwogCWZvcm1hdC5mb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CiAJZm9ybWF0LnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCWZvcm1hdC5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbGluZWFyLmMgYi9zb3VuZC9jb3JlL29zcy9saW5lYXIuYwppbmRleCBkYTNkYmQ0Li40YzFkMTY4IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9saW5lYXIuYworKysgYi9zb3VuZC9jb3JlL29zcy9saW5lYXIuYwpAQCAtOTIsNyArOTIsOCBAQAogewogCXN0cnVjdCBsaW5lYXJfcHJpdiAqZGF0YTsKIAotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwgJiYgc3JjX2NoYW5uZWxzICE9IE5VTEwgJiYgZHN0X2NoYW5uZWxzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4gfHwgIXNyY19jaGFubmVscyB8fCAhZHN0X2NoYW5uZWxzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlkYXRhID0gKHN0cnVjdCBsaW5lYXJfcHJpdiAqKXBsdWdpbi0+ZXh0cmFfZGF0YTsKIAlpZiAoZnJhbWVzID09IDApCiAJCXJldHVybiAwOwpAQCAtMTAwLDEyICsxMDEsMTIgQEAKIAl7CiAJCXVuc2lnbmVkIGludCBjaGFubmVsOwogCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcGx1Z2luLT5zcmNfZm9ybWF0LmNoYW5uZWxzOyBjaGFubmVsKyspIHsKLQkJCXNuZF9hc3NlcnQoc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4ID09IDAgJiYKLQkJCQkgICBzcmNfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5zdGVwICUgOCA9PSAwLAotCQkJCSAgIHJldHVybiAtRU5YSU8pOwotCQkJc25kX2Fzc2VydChkc3RfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5maXJzdCAlIDggPT0gMCAmJgotCQkJCSAgIGRzdF9jaGFubmVsc1tjaGFubmVsXS5hcmVhLnN0ZXAgJSA4ID09IDAsCi0JCQkJICAgcmV0dXJuIC1FTlhJTyk7CisJCQlpZiAoc25kX0JVR19PTihzcmNfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5maXJzdCAlIDggfHwKKwkJCQkgICAgICAgc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuc3RlcCAlIDgpKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoc25kX0JVR19PTihkc3RfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5maXJzdCAlIDggfHwKKwkJCQkgICAgICAgZHN0X2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuc3RlcCAlIDgpKQorCQkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTE1NCwxMyArMTU1LDE3IEBACiAJc3RydWN0IGxpbmVhcl9wcml2ICpkYXRhOwogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbiAqcGx1Z2luOwogCi0Jc25kX2Fzc2VydChyX3BsdWdpbiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcl9wbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyX3BsdWdpbiA9IE5VTEw7CiAKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPnJhdGUgPT0gZHN0X2Zvcm1hdC0+cmF0ZSwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChzcmNfZm9ybWF0LT5jaGFubmVscyA9PSBkc3RfZm9ybWF0LT5jaGFubmVscywgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChzbmRfcGNtX2Zvcm1hdF9saW5lYXIoc3JjX2Zvcm1hdC0+Zm9ybWF0KSAmJgotCQkgICBzbmRfcGNtX2Zvcm1hdF9saW5lYXIoZHN0X2Zvcm1hdC0+Zm9ybWF0KSwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oc3JjX2Zvcm1hdC0+cmF0ZSAhPSBkc3RfZm9ybWF0LT5yYXRlKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5jaGFubmVscyAhPSBkc3RfZm9ybWF0LT5jaGFubmVscykpCisJCXJldHVybiAtRU5YSU87CisJaWYgKHNuZF9CVUdfT04oIXNuZF9wY21fZm9ybWF0X2xpbmVhcihzcmNfZm9ybWF0LT5mb3JtYXQpIHx8CisJCSAgICAgICAhc25kX3BjbV9mb3JtYXRfbGluZWFyKGRzdF9mb3JtYXQtPmZvcm1hdCkpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJZXJyID0gc25kX3BjbV9wbHVnaW5fYnVpbGQocGx1ZywgImxpbmVhciBmb3JtYXQgY29udmVyc2lvbiIsCiAJCQkJICAgc3JjX2Zvcm1hdCwgZHN0X2Zvcm1hdCwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jIGIvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKaW5kZXggNTgxYWEyYy4uNDY5MGI4YiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMKQEAgLTI1Nyw4ICsyNTcsMTAgQEAKIAkJcmVzdWx0ID0gcHNsb3QtPmdldF92b2x1bWUoZm1peGVyLCBwc2xvdCwgJmxlZnQsICZyaWdodCk7CiAJaWYgKCFwc2xvdC0+c3RlcmVvKQogCQlyaWdodCA9IGxlZnQ7Ci0Jc25kX2Fzc2VydChsZWZ0ID49IDAgJiYgbGVmdCA8PSAxMDAsIHJldHVybiAtRUlPKTsKLQlzbmRfYXNzZXJ0KHJpZ2h0ID49IDAgJiYgcmlnaHQgPD0gMTAwLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04obGVmdCA8IDAgfHwgbGVmdCA+IDEwMCkpCisJCXJldHVybiAtRUlPOworCWlmIChzbmRfQlVHX09OKHJpZ2h0IDwgMCB8fCByaWdodCA+IDEwMCkpCisJCXJldHVybiAtRUlPOwogCWlmIChyZXN1bHQgPj0gMCkgewogCQlwc2xvdC0+dm9sdW1lWzBdID0gbGVmdDsKIAkJcHNsb3QtPnZvbHVtZVsxXSA9IHJpZ2h0OwpAQCAtMjk4LDcgKzMwMCw4IEBACiAJaW50IF9fdXNlciAqcCA9IGFyZ3A7CiAJaW50IHRtcDsKIAotCXNuZF9hc3NlcnQoZm1peGVyICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFmbWl4ZXIpKQorCQlyZXR1cm4gLUVOWElPOwogCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgewogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFNPVU5EX01JWEVSX0lORk86CkBAIC0zNjgsNyArMzcxLDggQEAKIHsKIAlzdHJ1Y3Qgc25kX21peGVyX29zc19maWxlIGZtaXhlcjsKIAkKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVOWElPOwogCWlmIChjYXJkLT5taXhlcl9vc3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAltZW1zZXQoJmZtaXhlciwgMCwgc2l6ZW9mKGZtaXhlcikpOwpAQCAtMTI4NCw5ICsxMjg4LDExIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBpZHg7CiAgCi0Jc25kX2Fzc2VydChtaXhlciAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoIW1peGVyKQorCQlyZXR1cm4gMDsKIAljYXJkID0gbWl4ZXItPmNhcmQ7Ci0Jc25kX2Fzc2VydChtaXhlciA9PSBjYXJkLT5taXhlcl9vc3MsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKG1peGVyICE9IGNhcmQtPm1peGVyX29zcykpCisJCXJldHVybiAtRU5YSU87CiAJY2FyZC0+bWl4ZXJfb3NzID0gTlVMTDsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IFNORFJWX09TU19NQVhfTUlYRVJTOyBpZHgrKykgewogCQlzdHJ1Y3Qgc25kX21peGVyX29zc19zbG90ICpjaG4gPSAmbWl4ZXItPnNsb3RzW2lkeF07CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9tdWxhdy5jIGIvc291bmQvY29yZS9vc3MvbXVsYXcuYwppbmRleCA3N2Y5NjE5Li5mNzY0OWQ0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9tdWxhdy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL211bGF3LmMKQEAgLTI1MiwxOSArMjUyLDIwIEBACiB7CiAJc3RydWN0IG11bGF3X3ByaXYgKmRhdGE7CiAKLQlzbmRfYXNzZXJ0KHBsdWdpbiAhPSBOVUxMICYmIHNyY19jaGFubmVscyAhPSBOVUxMICYmIGRzdF9jaGFubmVscyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcGx1Z2luIHx8ICFzcmNfY2hhbm5lbHMgfHwgIWRzdF9jaGFubmVscykpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKGZyYW1lcyA9PSAwKQogCQlyZXR1cm4gMDsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJewogCQl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKIAkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHBsdWdpbi0+c3JjX2Zvcm1hdC5jaGFubmVsczsgY2hhbm5lbCsrKSB7Ci0JCQlzbmRfYXNzZXJ0KHNyY19jaGFubmVsc1tjaGFubmVsXS5hcmVhLmZpcnN0ICUgOCA9PSAwICYmCi0JCQkJICAgc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuc3RlcCAlIDggPT0gMCwKLQkJCQkgICByZXR1cm4gLUVOWElPKTsKLQkJCXNuZF9hc3NlcnQoZHN0X2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4ID09IDAgJiYKLQkJCQkgICBkc3RfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5zdGVwICUgOCA9PSAwLAotCQkJCSAgIHJldHVybiAtRU5YSU8pOworCQkJaWYgKHNuZF9CVUdfT04oc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4IHx8CisJCQkJICAgICAgIHNyY19jaGFubmVsc1tjaGFubmVsXS5hcmVhLnN0ZXAgJSA4KSkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKHNuZF9CVUdfT04oZHN0X2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4IHx8CisJCQkJICAgICAgIGRzdF9jaGFubmVsc1tjaGFubmVsXS5hcmVhLnN0ZXAgJSA4KSkKKwkJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQogI2VuZGlmCkBAIC0zMDUsMTEgKzMwNiwxNCBAQAogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbl9mb3JtYXQgKmZvcm1hdDsKIAltdWxhd19mIGZ1bmM7CiAKLQlzbmRfYXNzZXJ0KHJfcGx1Z2luICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFyX3BsdWdpbikpCisJCXJldHVybiAtRU5YSU87CiAJKnJfcGx1Z2luID0gTlVMTDsKIAotCXNuZF9hc3NlcnQoc3JjX2Zvcm1hdC0+cmF0ZSA9PSBkc3RfZm9ybWF0LT5yYXRlLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPmNoYW5uZWxzID09IGRzdF9mb3JtYXQtPmNoYW5uZWxzLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5yYXRlICE9IGRzdF9mb3JtYXQtPnJhdGUpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHNyY19mb3JtYXQtPmNoYW5uZWxzICE9IGRzdF9mb3JtYXQtPmNoYW5uZWxzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWlmIChkc3RfZm9ybWF0LT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9NVV9MQVcpIHsKIAkJZm9ybWF0ID0gc3JjX2Zvcm1hdDsKQEAgLTMyMyw3ICszMjcsOCBAQAogCQlzbmRfQlVHKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzbmRfYXNzZXJ0KHNuZF9wY21fZm9ybWF0X2xpbmVhcihmb3JtYXQtPmZvcm1hdCkgIT0gMCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXNuZF9wY21fZm9ybWF0X2xpbmVhcihmb3JtYXQtPmZvcm1hdCkpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJZXJyID0gc25kX3BjbV9wbHVnaW5fYnVpbGQocGx1ZywgIk11LUxhdzwtPmxpbmVhciBjb252ZXJzaW9uIiwKIAkJCQkgICBzcmNfZm9ybWF0LCBkc3RfZm9ybWF0LApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCmluZGV4IDRjNjAxYjEuLjFhZjYyYjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKQEAgLTQ1Miw3ICs0NTIsOCBAQAogCX0gZWxzZSB7CiAJCSpwYXJhbXMgPSAqc2F2ZTsKIAkJbWF4ID0gc25kX3BjbV9od19wYXJhbV9tYXgocGNtLCBwYXJhbXMsIHZhciwgbWF4LCAmbWF4ZGlyKTsKLQkJc25kX2Fzc2VydChtYXggPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAobWF4IDwgMCkKKwkJCXJldHVybiBtYXg7CiAJCWxhc3QgPSAxOwogCX0KICBfZW5kOgpAQCAtNDYxLDcgKzQ2Miw3IEBACiAJCXYgPSBzbmRfcGNtX2h3X3BhcmFtX2xhc3QocGNtLCBwYXJhbXMsIHZhciwgZGlyKTsKIAllbHNlCiAJCXYgPSBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHBjbSwgcGFyYW1zLCB2YXIsIGRpcik7Ci0Jc25kX2Fzc2VydCh2ID49IDAsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfQlVHX09OKHYgPCAwKTsKIAlyZXR1cm4gdjsKIH0KIApAQCAtNzc4LDcgKzc3OSw4IEBACiAJd2hpbGUgKG9zc19wZXJpb2Rfc2l6ZSAqIG9zc19wZXJpb2RzID4gb3NzX2J1ZmZlcl9zaXplKQogCQlvc3NfcGVyaW9kX3NpemUgLz0gMjsKIAotCXNuZF9hc3NlcnQob3NzX3BlcmlvZF9zaXplID49IDE2LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKG9zc19wZXJpb2Rfc2l6ZSA8IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKIAlydW50aW1lLT5vc3MucGVyaW9kX2J5dGVzID0gb3NzX3BlcmlvZF9zaXplOwogCXJ1bnRpbWUtPm9zcy5wZXJpb2RfZnJhbWVzID0gMTsKIAlydW50aW1lLT5vc3MucGVyaW9kcyA9IG9zc19wZXJpb2RzOwpAQCAtODk1LDcgKzg5Nyw4IEBACiAJCX0KIAl9CiAJZXJyID0gX3NuZF9wY21faHdfcGFyYW1fc2V0KHNwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIHNmb3JtYXQsIDApOwotCXNuZF9hc3NlcnQoZXJyID49IDAsIGdvdG8gZmFpbHVyZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbHVyZTsKIAogCWlmIChkaXJlY3QpIHsKIAkJbWVtY3B5KHBhcmFtcywgc3BhcmFtcywgc2l6ZW9mKCpwYXJhbXMpKTsKQEAgLTk1OCwxMSArOTYxLDEzIEBACiAKIAluID0gc25kX3BjbV9wbHVnX3NsYXZlX3NpemUoc3Vic3RyZWFtLCBydW50aW1lLT5vc3MucGVyaW9kX2J5dGVzIC8gb3NzX2ZyYW1lX3NpemUpOwogCWVyciA9IHNuZF9wY21faHdfcGFyYW1fbmVhcihzdWJzdHJlYW0sIHNwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwgbiwgTlVMTCk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgZ290byBmYWlsdXJlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsdXJlOwogCiAJZXJyID0gc25kX3BjbV9od19wYXJhbV9uZWFyKHN1YnN0cmVhbSwgc3BhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMsCiAJCQkJICAgICBydW50aW1lLT5vc3MucGVyaW9kcywgTlVMTCk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgZ290byBmYWlsdXJlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsdXJlOwogCiAJc25kX3BjbV9rZXJuZWxfaW9jdGwoc3Vic3RyZWFtLCBTTkRSVl9QQ01fSU9DVExfRFJPUCwgTlVMTCk7CiAKQEAgLTEwMDYsNyArMTAxMSwxMCBAQAogCiAJcnVudGltZS0+b3NzLnBlcmlvZHMgPSBwYXJhbXNfcGVyaW9kcyhzcGFyYW1zKTsKIAlvc3NfcGVyaW9kX3NpemUgPSBzbmRfcGNtX3BsdWdfY2xpZW50X3NpemUoc3Vic3RyZWFtLCBwYXJhbXNfcGVyaW9kX3NpemUoc3BhcmFtcykpOwotCXNuZF9hc3NlcnQob3NzX3BlcmlvZF9zaXplID49IDAsIGVyciA9IC1FSU5WQUw7IGdvdG8gZmFpbHVyZSk7CisJaWYgKG9zc19wZXJpb2Rfc2l6ZSA8IDApIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsdXJlOworCX0KICNpZmRlZiBDT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUwogCWlmIChydW50aW1lLT5vc3MucGx1Z2luX2ZpcnN0KSB7CiAJCWVyciA9IHNuZF9wY21fcGx1Z19hbGxvYyhzdWJzdHJlYW0sIG9zc19wZXJpb2Rfc2l6ZSk7CkBAIC0xMDE3LDcgKzEwMjUsMTAgQEAKIAlvc3NfcGVyaW9kX3NpemUgKj0gb3NzX2ZyYW1lX3NpemU7CiAKIAlvc3NfYnVmZmVyX3NpemUgPSBvc3NfcGVyaW9kX3NpemUgKiBydW50aW1lLT5vc3MucGVyaW9kczsKLQlzbmRfYXNzZXJ0KG9zc19idWZmZXJfc2l6ZSA+PSAwLCBlcnIgPSAtRUlOVkFMOyBnb3RvIGZhaWx1cmUpOworCWlmIChvc3NfYnVmZmVyX3NpemUgPCAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbHVyZTsKKwl9CiAKIAlydW50aW1lLT5vc3MucGVyaW9kX2J5dGVzID0gb3NzX3BlcmlvZF9zaXplOwogCXJ1bnRpbWUtPm9zcy5idWZmZXJfYnl0ZXMgPSBvc3NfYnVmZmVyX3NpemU7CkBAIC0xMDY5LDcgKzEwODAsOCBAQAogCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0Jc25kX2Fzc2VydChhc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoIWFzdWJzdHJlYW0pCisJCXJldHVybiAtRUlPOwogCWlmIChyX3N1YnN0cmVhbSkKIAkJKnJfc3Vic3RyZWFtID0gYXN1YnN0cmVhbTsKIAlyZXR1cm4gMDsKQEAgLTE3NjQsNyArMTc3Niw4IEBACiAJZXJyID0gc25kX3BjbV9od19yZWZpbmUoc3Vic3RyZWFtLCBwYXJhbXMpOwogCWZvcm1hdF9tYXNrID0gKmh3X3BhcmFtX21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFUKTsgCiAJa2ZyZWUocGFyYW1zKTsKLQlzbmRfYXNzZXJ0KGVyciA+PSAwLCByZXR1cm4gZXJyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAlmb3IgKGZtdCA9IDA7IGZtdCA8IDMyOyArK2ZtdCkgewogCQlpZiAoc25kX21hc2tfdGVzdCgmZm9ybWF0X21hc2ssIGZtdCkpIHsKIAkJCWludCBmID0gc25kX3BjbV9vc3NfZm9ybWF0X3RvKGZtdCk7CkBAIC0yMjUwLDcgKzIyNjMsOCBAQAogc3RhdGljIGludCBzbmRfcGNtX29zc19yZWxlYXNlX2ZpbGUoc3RydWN0IHNuZF9wY21fb3NzX2ZpbGUgKnBjbV9vc3NfZmlsZSkKIHsKIAlpbnQgY2lkeDsKLQlzbmRfYXNzZXJ0KHBjbV9vc3NfZmlsZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoIXBjbV9vc3NfZmlsZSkKKwkJcmV0dXJuIDA7CiAJZm9yIChjaWR4ID0gMDsgY2lkeCA8IDI7ICsrY2lkeCkgewogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tjaWR4XTsKIAkJaWYgKHN1YnN0cmVhbSkKQEAgLTIyNzEsOCArMjI4NSw4IEBACiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJdW5zaWduZWQgaW50IGZfbW9kZSA9IGZpbGUtPmZfbW9kZTsKIAotCXNuZF9hc3NlcnQocnBjbV9vc3NfZmlsZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0JKnJwY21fb3NzX2ZpbGUgPSBOVUxMOworCWlmIChycGNtX29zc19maWxlKQorCQkqcnBjbV9vc3NfZmlsZSA9IE5VTEw7CiAKIAlwY21fb3NzX2ZpbGUgPSBremFsbG9jKHNpemVvZigqcGNtX29zc19maWxlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBjbV9vc3NfZmlsZSA9PSBOVUxMKQpAQCAtMjMxMiw3ICsyMzI2LDggQEAKIAl9CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBwY21fb3NzX2ZpbGU7Ci0JKnJwY21fb3NzX2ZpbGUgPSBwY21fb3NzX2ZpbGU7CisJaWYgKHJwY21fb3NzX2ZpbGUpCisJCSpycGNtX29zc19maWxlID0gcGNtX29zc19maWxlOwogCXJldHVybiAwOwogfQogCkBAIC0yMzIxLDcgKzIzMzYsOCBAQAogewogCXVuc2lnbmVkIGludCBpZHg7CiAKLQlzbmRfYXNzZXJ0KHRhc2sgIT0gTlVMTCAmJiBuYW1lICE9IE5VTEwgJiYgc2l6ZSA+PSAyLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXRhc2sgfHwgIW5hbWUgfHwgc2l6ZSA8IDIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemVvZih0YXNrLT5jb21tKSAmJiBpZHggKyAxIDwgc2l6ZTsgaWR4KyspCiAJCW5hbWVbaWR4XSA9IHRhc2stPmNvbW1baWR4XTsKIAluYW1lW2lkeF0gPSAnXDAnOwpAQCAtMjQxNSw3ICsyNDMxLDggQEAKIAlzdWJzdHJlYW0gPSBwY21fb3NzX2ZpbGUtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107CiAJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKQogCQlzdWJzdHJlYW0gPSBwY21fb3NzX2ZpbGUtPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlwY20gPSBzdWJzdHJlYW0tPnBjbTsKIAlpZiAoIXBjbS0+Y2FyZC0+c2h1dGRvd24pCiAJCXNuZF9wY21fb3NzX3N5bmMocGNtX29zc19maWxlKTsKQEAgLTI0NDgsNyArMjQ2NSw4IEBACiAJCQlpZiAoc3Vic3RyZWFtICE9IE5VTEwpCiAJCQkJYnJlYWs7CiAJCX0KLQkJc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJCWlmIChzbmRfQlVHX09OKGlkeCA+PSAyKSkKKwkJCXJldHVybiAtRU5YSU87CiAJCXJldHVybiBzbmRfbWl4ZXJfb3NzX2lvY3RsX2NhcmQoc3Vic3RyZWFtLT5wY20tPmNhcmQsIGNtZCwgYXJnKTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9wbHVnaW4uYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9wbHVnaW4uYwppbmRleCBiZWM5NDEzLi42NzUxZGFhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9wY21fcGx1Z2luLmMKKysrIGIvc291bmQvY29yZS9vc3MvcGNtX3BsdWdpbi5jCkBAIC02Miw3ICs2Miw4IEBACiAJaWYgKCh3aWR0aCA9IHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKGZvcm1hdC0+Zm9ybWF0KSkgPCAwKQogCQlyZXR1cm4gd2lkdGg7CiAJc2l6ZSA9IGZyYW1lcyAqIGZvcm1hdC0+Y2hhbm5lbHMgKiB3aWR0aDsKLQlzbmRfYXNzZXJ0KChzaXplICUgOCkgPT0gMCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oc2l6ZSAlIDgpKQorCQlyZXR1cm4gLUVOWElPOwogCXNpemUgLz0gODsKIAlpZiAocGx1Z2luLT5idWZfZnJhbWVzIDwgZnJhbWVzKSB7CiAJCXZmcmVlKHBsdWdpbi0+YnVmKTsKQEAgLTg0LDcgKzg1LDggQEAKIAkJCWMtPmFyZWEuc3RlcCA9IGZvcm1hdC0+Y2hhbm5lbHMgKiB3aWR0aDsKIAkJfQogCX0gZWxzZSBpZiAocGx1Z2luLT5hY2Nlc3MgPT0gU05EUlZfUENNX0FDQ0VTU19SV19OT05JTlRFUkxFQVZFRCkgewotCQlzbmRfYXNzZXJ0KChzaXplICUgZm9ybWF0LT5jaGFubmVscykgPT0gMCwpOworCQlpZiAoc25kX0JVR19PTihzaXplICUgZm9ybWF0LT5jaGFubmVscykpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJc2l6ZSAvPSBmb3JtYXQtPmNoYW5uZWxzOwogCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgZm9ybWF0LT5jaGFubmVsczsgY2hhbm5lbCsrLCBjKyspIHsKIAkJCWMtPmZyYW1lcyA9IGZyYW1lczsKQEAgLTEwMiwxMyArMTA0LDE1IEBACiBpbnQgc25kX3BjbV9wbHVnX2FsbG9jKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGx1Zywgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQogewogCWludCBlcnI7Ci0Jc25kX2Fzc2VydChzbmRfcGNtX3BsdWdfZmlyc3QocGx1ZykgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXNuZF9wY21fcGx1Z19maXJzdChwbHVnKSkpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKHNuZF9wY21fcGx1Z19zdHJlYW0ocGx1ZykgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlzdHJ1Y3Qgc25kX3BjbV9wbHVnaW4gKnBsdWdpbiA9IHNuZF9wY21fcGx1Z19maXJzdChwbHVnKTsKIAkJd2hpbGUgKHBsdWdpbi0+bmV4dCkgewogCQkJaWYgKHBsdWdpbi0+ZHN0X2ZyYW1lcykKIAkJCQlmcmFtZXMgPSBwbHVnaW4tPmRzdF9mcmFtZXMocGx1Z2luLCBmcmFtZXMpOwotCQkJc25kX2Fzc2VydChmcmFtZXMgPiAwLCByZXR1cm4gLUVOWElPKTsKKwkJCWlmIChzbmRfQlVHX09OKGZyYW1lcyA8PSAwKSkKKwkJCQlyZXR1cm4gLUVOWElPOwogCQkJcGx1Z2luID0gcGx1Z2luLT5uZXh0OwogCQkJZXJyID0gc25kX3BjbV9wbHVnaW5fYWxsb2MocGx1Z2luLCBmcmFtZXMpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xMTksNyArMTIzLDggQEAKIAkJd2hpbGUgKHBsdWdpbi0+cHJldikgewogCQkJaWYgKHBsdWdpbi0+c3JjX2ZyYW1lcykKIAkJCQlmcmFtZXMgPSBwbHVnaW4tPnNyY19mcmFtZXMocGx1Z2luLCBmcmFtZXMpOwotCQkJc25kX2Fzc2VydChmcmFtZXMgPiAwLCByZXR1cm4gLUVOWElPKTsKKwkJCWlmIChzbmRfQlVHX09OKGZyYW1lcyA8PSAwKSkKKwkJCQlyZXR1cm4gLUVOWElPOwogCQkJcGx1Z2luID0gcGx1Z2luLT5wcmV2OwogCQkJZXJyID0gc25kX3BjbV9wbHVnaW5fYWxsb2MocGx1Z2luLCBmcmFtZXMpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNDgsOCArMTUzLDEwIEBACiAJc3RydWN0IHNuZF9wY21fcGx1Z2luICpwbHVnaW47CiAJdW5zaWduZWQgaW50IGNoYW5uZWxzOwogCQotCXNuZF9hc3NlcnQocGx1ZyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQgIT0gTlVMTCAmJiBkc3RfZm9ybWF0ICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTighc3JjX2Zvcm1hdCB8fCAhZHN0X2Zvcm1hdCkpCisJCXJldHVybiAtRU5YSU87CiAJcGx1Z2luID0ga3phbGxvYyhzaXplb2YoKnBsdWdpbikgKyBleHRyYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBsdWdpbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE1OSwxMCArMTY2LDEwIEBACiAJcGx1Z2luLT5hY2Nlc3MgPSBTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEOwogCXBsdWdpbi0+c3JjX2Zvcm1hdCA9ICpzcmNfZm9ybWF0OwogCXBsdWdpbi0+c3JjX3dpZHRoID0gc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoc3JjX2Zvcm1hdC0+Zm9ybWF0KTsKLQlzbmRfYXNzZXJ0KHBsdWdpbi0+c3JjX3dpZHRoID4gMCwgKTsKKwlzbmRfQlVHX09OKHBsdWdpbi0+c3JjX3dpZHRoIDw9IDApOwogCXBsdWdpbi0+ZHN0X2Zvcm1hdCA9ICpkc3RfZm9ybWF0OwogCXBsdWdpbi0+ZHN0X3dpZHRoID0gc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgoZHN0X2Zvcm1hdC0+Zm9ybWF0KTsKLQlzbmRfYXNzZXJ0KHBsdWdpbi0+ZHN0X3dpZHRoID4gMCwgKTsKKwlzbmRfQlVHX09OKHBsdWdpbi0+ZHN0X3dpZHRoIDw9IDApOwogCWlmIChwbHVnaW4tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQogCQljaGFubmVscyA9IHNyY19mb3JtYXQtPmNoYW5uZWxzOwogCWVsc2UKQEAgLTE5NCw3ICsyMDEsOCBAQAogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbiAqcGx1Z2luLCAqcGx1Z2luX3ByZXYsICpwbHVnaW5fbmV4dDsKIAlpbnQgc3RyZWFtID0gc25kX3BjbV9wbHVnX3N0cmVhbShwbHVnKTsKIAotCXNuZF9hc3NlcnQocGx1ZyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcGx1ZykpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKGRydl9mcmFtZXMgPT0gMCkKIAkJcmV0dXJuIDA7CiAJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CkBAIC0yMjQsNyArMjMyLDggQEAKIAlzbmRfcGNtX3NmcmFtZXNfdCBmcmFtZXM7CiAJaW50IHN0cmVhbSA9IHNuZF9wY21fcGx1Z19zdHJlYW0ocGx1Zyk7CiAJCi0Jc25kX2Fzc2VydChwbHVnICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoY2x0X2ZyYW1lcyA9PSAwKQogCQlyZXR1cm4gMDsKIAlmcmFtZXMgPSBjbHRfZnJhbWVzOwpAQCAtNTQwLDcgKzU0OSw4IEBACiAJaW50IHdpZHRoLCBuY2hhbm5lbHMsIGNoYW5uZWw7CiAJaW50IHN0cmVhbSA9IHNuZF9wY21fcGx1Z19zdHJlYW0ocGx1Zyk7CiAKLQlzbmRfYXNzZXJ0KGJ1ZiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighYnVmKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJcGx1Z2luID0gc25kX3BjbV9wbHVnX2ZpcnN0KHBsdWcpOwogCQlmb3JtYXQgPSAmcGx1Z2luLT5zcmNfZm9ybWF0OwpAQCAtNTUzLDcgKzU2Myw5IEBACiAJaWYgKCh3aWR0aCA9IHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKGZvcm1hdC0+Zm9ybWF0KSkgPCAwKQogCQlyZXR1cm4gd2lkdGg7CiAJbmNoYW5uZWxzID0gZm9ybWF0LT5jaGFubmVsczsKLQlzbmRfYXNzZXJ0KHBsdWdpbi0+YWNjZXNzID09IFNORFJWX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQgfHwgZm9ybWF0LT5jaGFubmVscyA8PSAxLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTihwbHVnaW4tPmFjY2VzcyAhPSBTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEICYmCisJCSAgICAgICBmb3JtYXQtPmNoYW5uZWxzID4gMSkpCisJCXJldHVybiAtRU5YSU87CiAJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IG5jaGFubmVsczsgY2hhbm5lbCsrLCB2KyspIHsKIAkJdi0+ZnJhbWVzID0gY291bnQ7CiAJCXYtPmVuYWJsZWQgPSAxOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvcmF0ZS5jIGIvc291bmQvY29yZS9vc3MvcmF0ZS5jCmluZGV4IDE0ZGZiMzEuLmE0NjY0NDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3JhdGUuYworKysgYi9zb3VuZC9jb3JlL29zcy9yYXRlLmMKQEAgLTE4NSw3ICsxODUsOCBAQAogCXN0cnVjdCByYXRlX3ByaXYgKmRhdGE7CiAJc25kX3BjbV9zZnJhbWVzX3QgcmVzOwogCi0Jc25kX2Fzc2VydChwbHVnaW4gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXBsdWdpbikpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKGZyYW1lcyA9PSAwKQogCQlyZXR1cm4gMDsKIAlkYXRhID0gKHN0cnVjdCByYXRlX3ByaXYgKilwbHVnaW4tPmV4dHJhX2RhdGE7CkBAIC0yMTcsNyArMjE4LDggQEAKIAlzdHJ1Y3QgcmF0ZV9wcml2ICpkYXRhOwogCXNuZF9wY21fc2ZyYW1lc190IHJlczsKIAotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCWlmIChmcmFtZXMgPT0gMCkKIAkJcmV0dXJuIDA7CiAJZGF0YSA9IChzdHJ1Y3QgcmF0ZV9wcml2ICopcGx1Z2luLT5leHRyYV9kYXRhOwpAQCAtMjUyLDE5ICsyNTQsMjAgQEAKIAlzbmRfcGNtX3VmcmFtZXNfdCBkc3RfZnJhbWVzOwogCXN0cnVjdCByYXRlX3ByaXYgKmRhdGE7CiAKLQlzbmRfYXNzZXJ0KHBsdWdpbiAhPSBOVUxMICYmIHNyY19jaGFubmVscyAhPSBOVUxMICYmIGRzdF9jaGFubmVscyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcGx1Z2luIHx8ICFzcmNfY2hhbm5lbHMgfHwgIWRzdF9jaGFubmVscykpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKGZyYW1lcyA9PSAwKQogCQlyZXR1cm4gMDsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJewogCQl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKIAkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHBsdWdpbi0+c3JjX2Zvcm1hdC5jaGFubmVsczsgY2hhbm5lbCsrKSB7Ci0JCQlzbmRfYXNzZXJ0KHNyY19jaGFubmVsc1tjaGFubmVsXS5hcmVhLmZpcnN0ICUgOCA9PSAwICYmCi0JCQkJICAgc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuc3RlcCAlIDggPT0gMCwKLQkJCQkgICByZXR1cm4gLUVOWElPKTsKLQkJCXNuZF9hc3NlcnQoZHN0X2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4ID09IDAgJiYKLQkJCQkgICBkc3RfY2hhbm5lbHNbY2hhbm5lbF0uYXJlYS5zdGVwICUgOCA9PSAwLAotCQkJCSAgIHJldHVybiAtRU5YSU8pOworCQkJaWYgKHNuZF9CVUdfT04oc3JjX2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4IHx8CisJCQkJICAgICAgIHNyY19jaGFubmVsc1tjaGFubmVsXS5hcmVhLnN0ZXAgJSA4KSkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKHNuZF9CVUdfT04oZHN0X2NoYW5uZWxzW2NoYW5uZWxdLmFyZWEuZmlyc3QgJSA4IHx8CisJCQkJICAgICAgIGRzdF9jaGFubmVsc1tjaGFubmVsXS5hcmVhLnN0ZXAgJSA4KSkKKwkJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQogI2VuZGlmCkBAIC0yODEsNyArMjg0LDggQEAKIAkJICAgICAgIGVudW0gc25kX3BjbV9wbHVnaW5fYWN0aW9uIGFjdGlvbiwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWRhdGEpCiB7Ci0Jc25kX2Fzc2VydChwbHVnaW4gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXBsdWdpbikpCisJCXJldHVybiAtRU5YSU87CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIElOSVQ6CiAJY2FzZSBQUkVQQVJFOgpAQCAtMzAyLDE0ICszMDYsMjAgQEAKIAlzdHJ1Y3QgcmF0ZV9wcml2ICpkYXRhOwogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbiAqcGx1Z2luOwogCi0Jc25kX2Fzc2VydChyX3BsdWdpbiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcl9wbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyX3BsdWdpbiA9IE5VTEw7CiAKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPmNoYW5uZWxzID09IGRzdF9mb3JtYXQtPmNoYW5uZWxzLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPmNoYW5uZWxzID4gMCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChzcmNfZm9ybWF0LT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTYsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoZHN0X2Zvcm1hdC0+Zm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2LCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHNyY19mb3JtYXQtPnJhdGUgIT0gZHN0X2Zvcm1hdC0+cmF0ZSwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oc3JjX2Zvcm1hdC0+Y2hhbm5lbHMgIT0gZHN0X2Zvcm1hdC0+Y2hhbm5lbHMpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHNyY19mb3JtYXQtPmNoYW5uZWxzIDw9IDApKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHNyY19mb3JtYXQtPmZvcm1hdCAhPSBTTkRSVl9QQ01fRk9STUFUX1MxNikpCisJCXJldHVybiAtRU5YSU87CisJaWYgKHNuZF9CVUdfT04oZHN0X2Zvcm1hdC0+Zm9ybWF0ICE9IFNORFJWX1BDTV9GT1JNQVRfUzE2KSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5yYXRlID09IGRzdF9mb3JtYXQtPnJhdGUpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJZXJyID0gc25kX3BjbV9wbHVnaW5fYnVpbGQocGx1ZywgInJhdGUgY29udmVyc2lvbiIsCiAJCQkJICAgc3JjX2Zvcm1hdCwgZHN0X2Zvcm1hdCwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3JvdXRlLmMgYi9zb3VuZC9jb3JlL29zcy9yb3V0ZS5jCmluZGV4IGRhN2FiN2EuLjBkY2MyODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3JvdXRlLmMKKysrIGIvc291bmQvY29yZS9vc3Mvcm91dGUuYwpAQCAtNTQsNyArNTQsOCBAQAogCXN0cnVjdCBzbmRfcGNtX3BsdWdpbl9jaGFubmVsICpkdnA7CiAJaW50IGZvcm1hdDsKIAotCXNuZF9hc3NlcnQocGx1Z2luICE9IE5VTEwgJiYgc3JjX2NoYW5uZWxzICE9IE5VTEwgJiYgZHN0X2NoYW5uZWxzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwbHVnaW4gfHwgIXNyY19jaGFubmVscyB8fCAhZHN0X2NoYW5uZWxzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlpZiAoZnJhbWVzID09IDApCiAJCXJldHVybiAwOwogCkBAIC05MCwxMCArOTEsMTMgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9wbHVnaW4gKnBsdWdpbjsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChyX3BsdWdpbiAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcl9wbHVnaW4pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyX3BsdWdpbiA9IE5VTEw7Ci0Jc25kX2Fzc2VydChzcmNfZm9ybWF0LT5yYXRlID09IGRzdF9mb3JtYXQtPnJhdGUsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3JjX2Zvcm1hdC0+Zm9ybWF0ID09IGRzdF9mb3JtYXQtPmZvcm1hdCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oc3JjX2Zvcm1hdC0+cmF0ZSAhPSBkc3RfZm9ybWF0LT5yYXRlKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihzcmNfZm9ybWF0LT5mb3JtYXQgIT0gZHN0X2Zvcm1hdC0+Zm9ybWF0KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWVyciA9IHNuZF9wY21fcGx1Z2luX2J1aWxkKHBsdWcsICJyb3V0ZSBjb252ZXJzaW9uIiwKIAkJCQkgICBzcmNfZm9ybWF0LCBkc3RfZm9ybWF0LCAwLCAmcGx1Z2luKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtLmMgYi9zb3VuZC9jb3JlL3BjbS5jCmluZGV4IDlkZDliYzcuLjE5MmE0MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtLmMKKysrIGIvc291bmQvY29yZS9wY20uYwpAQCAtNDIsNyArNDIsNyBAQAogc3RhdGljIGludCBzbmRfcGNtX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgc25kX3BjbV9kZXZfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtICpzbmRfcGNtX3NlYXJjaChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXZpY2UpCitzdGF0aWMgc3RydWN0IHNuZF9wY20gKnNuZF9wY21fZ2V0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCkBAIC01Myw2ICs1MywzNyBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IHNuZF9wY21fbmV4dChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXZpY2UpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNtLCAmc25kX3BjbV9kZXZpY2VzLCBsaXN0KSB7CisJCWlmIChwY20tPmNhcmQgPT0gY2FyZCAmJiBwY20tPmRldmljZSA+IGRldmljZSkKKwkJCXJldHVybiBwY20tPmRldmljZTsKKwkJZWxzZSBpZiAocGNtLT5jYXJkLT5udW1iZXIgPiBjYXJkLT5udW1iZXIpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzbmRfcGNtX2FkZChzdHJ1Y3Qgc25kX3BjbSAqbmV3cGNtKQoreworCXN0cnVjdCBzbmRfcGNtICpwY207CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgeworCQlpZiAocGNtLT5jYXJkID09IG5ld3BjbS0+Y2FyZCAmJiBwY20tPmRldmljZSA9PSBuZXdwY20tPmRldmljZSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChwY20tPmNhcmQtPm51bWJlciA+IG5ld3BjbS0+Y2FyZC0+bnVtYmVyIHx8CisJCQkJKHBjbS0+Y2FyZCA9PSBuZXdwY20tPmNhcmQgJiYKKwkJCQlwY20tPmRldmljZSA+IG5ld3BjbS0+ZGV2aWNlKSkgeworCQkJbGlzdF9hZGQoJm5ld3BjbS0+bGlzdCwgcGNtLT5saXN0LnByZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmbmV3cGNtLT5saXN0LCAmc25kX3BjbV9kZXZpY2VzKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzbmRfcGNtX2NvbnRyb2xfaW9jdGwoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCSBzdHJ1Y3Qgc25kX2N0bF9maWxlICpjb250cm9sLAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTY1LDE0ICs5Niw3IEBACiAJCQlpZiAoZ2V0X3VzZXIoZGV2aWNlLCAoaW50IF9fdXNlciAqKWFyZykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7Ci0JCQlkZXZpY2UgPSBkZXZpY2UgPCAwID8gMCA6IGRldmljZSArIDE7Ci0JCQl3aGlsZSAoZGV2aWNlIDwgU05EUlZfUENNX0RFVklDRVMpIHsKLQkJCQlpZiAoc25kX3BjbV9zZWFyY2goY2FyZCwgZGV2aWNlKSkKLQkJCQkJYnJlYWs7Ci0JCQkJZGV2aWNlKys7Ci0JCQl9Ci0JCQlpZiAoZGV2aWNlID09IFNORFJWX1BDTV9ERVZJQ0VTKQotCQkJCWRldmljZSA9IC0xOworCQkJZGV2aWNlID0gc25kX3BjbV9uZXh0KGNhcmQsIGRldmljZSk7CiAJCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJCWlmIChwdXRfdXNlcihkZXZpY2UsIChpbnQgX191c2VyICopYXJnKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTk4LDcgKzEyMiw3IEBACiAJCQlpZiAoZ2V0X3VzZXIoc3ViZGV2aWNlLCAmaW5mby0+c3ViZGV2aWNlKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQkJCXBjbSA9IHNuZF9wY21fc2VhcmNoKGNhcmQsIGRldmljZSk7CisJCQlwY20gPSBzbmRfcGNtX2dldChjYXJkLCBkZXZpY2UpOwogCQkJaWYgKHBjbSA9PSBOVUxMKSB7CiAJCQkJZXJyID0gLUVOWElPOwogCQkJCWdvdG8gX2Vycm9yOwpAQCAtMjMyLDcgKzI1Niw2IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbmRfcGNtX3N0cmVhbV9uYW1lKGludCBzdHJlYW0pCiB7Ci0Jc25kX2Fzc2VydChzdHJlYW0gPD0gU05EUlZfUENNX1NUUkVBTV9MQVNULCByZXR1cm4gTlVMTCk7CiAJcmV0dXJuIHNuZF9wY21fc3RyZWFtX25hbWVzW3N0cmVhbV07CiB9CiAKQEAgLTI0OCw3ICsyNzEsNiBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqc25kX3BjbV90c3RhbXBfbW9kZV9uYW1lKGludCBtb2RlKQogewotCXNuZF9hc3NlcnQobW9kZSA8PSBTTkRSVl9QQ01fVFNUQU1QX0xBU1QsIHJldHVybiBOVUxMKTsKIAlyZXR1cm4gc25kX3BjbV90c3RhbXBfbW9kZV9uYW1lc1ttb2RlXTsKIH0KIApAQCAtNjgyLDkgKzcwNCwxMCBAQAogCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfcGNtX2Rldl9kaXNjb25uZWN0LAogCX07CiAKLQlzbmRfYXNzZXJ0KHJwY20gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCSpycGNtID0gTlVMTDsKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChycGNtKQorCQkqcnBjbSA9IE5VTEw7CiAJcGNtID0ga3phbGxvYyhzaXplb2YoKnBjbSksIEdGUF9LRVJORUwpOwogCWlmIChwY20gPT0gTlVMTCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgUENNXG4iKTsKQEAgLTcwOCw3ICs3MzEsOCBAQAogCQlzbmRfcGNtX2ZyZWUocGNtKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JKnJwY20gPSBwY207CisJaWYgKHJwY20pCisJCSpycGNtID0gcGNtOwogCXJldHVybiAwOwogfQogCkBAIC03NDIsNyArNzY2LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeTsKIAotCXNuZF9hc3NlcnQocGNtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmICghcGNtKQorCQlyZXR1cm4gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmeSwgJnNuZF9wY21fbm90aWZ5X2xpc3QsIGxpc3QpIHsKIAkJbm90aWZ5LT5uX3VucmVnaXN0ZXIocGNtKTsKIAl9CkBAIC03NzMsMTUgKzc5OCwxNSBAQAogCWludCBwcmVmZXJfc3ViZGV2aWNlID0gLTE7CiAJc2l6ZV90IHNpemU7CiAKLQlzbmRfYXNzZXJ0KHJzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFwY20gfHwgIXJzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCSpyc3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfYXNzZXJ0KHBjbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAlwc3RyID0gJnBjbS0+c3RyZWFtc1tzdHJlYW1dOwogCWlmIChwc3RyLT5zdWJzdHJlYW0gPT0gTlVMTCB8fCBwc3RyLT5zdWJzdHJlYW1fY291bnQgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAljYXJkID0gcGNtLT5jYXJkOwotCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworCXJlYWRfbG9jaygmY2FyZC0+Y3RsX2ZpbGVzX3J3bG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShrY3RsLCAmY2FyZC0+Y3RsX2ZpbGVzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5waWQgPT0gY3VycmVudC0+cGlkKSB7CiAJCQlwcmVmZXJfc3ViZGV2aWNlID0ga2N0bC0+cHJlZmVyX3BjbV9zdWJkZXZpY2U7CkBAIC03ODksNyArODE0LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCX0KLQl1cF9yZWFkKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisJcmVhZF91bmxvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwogCiAJc3dpdGNoIChzdHJlYW0pIHsKIAljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6CkBAIC04ODMsOCArOTA4LDkgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybjsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9hc3NlcnQocnVudGltZSAhPSBOVUxMLCByZXR1cm4pOwogCWlmIChydW50aW1lLT5wcml2YXRlX2ZyZWUgIT0gTlVMTCkKIAkJcnVudGltZS0+cHJpdmF0ZV9mcmVlKHJ1bnRpbWUpOwogCXNuZF9mcmVlX3BhZ2VzKCh2b2lkKilydW50aW1lLT5zdGF0dXMsCkBAIC05MjksMTMgKzk1NSwxNCBAQAogCXN0cnVjdCBzbmRfcGNtICpwY20gPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCXNuZF9hc3NlcnQocGNtICE9IE5VTEwgJiYgZGV2aWNlICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwY20gfHwgIWRldmljZSkpCisJCXJldHVybiAtRU5YSU87CiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWlmIChzbmRfcGNtX3NlYXJjaChwY20tPmNhcmQsIHBjbS0+ZGV2aWNlKSkgeworCWVyciA9IHNuZF9wY21fYWRkKHBjbSk7CisJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIGVycjsKIAl9Ci0JbGlzdF9hZGRfdGFpbCgmcGNtLT5saXN0LCAmc25kX3BjbV9kZXZpY2VzKTsKIAlmb3IgKGNpZHggPSAwOyBjaWR4IDwgMjsgY2lkeCsrKSB7CiAJCWludCBkZXZ0eXBlID0gLTE7CiAJCWlmIChwY20tPnN0cmVhbXNbY2lkeF0uc3Vic3RyZWFtID09IE5VTEwpCkBAIC0xMDE5LDEwICsxMDQ2LDExIEBACiB7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAotCXNuZF9hc3NlcnQobm90aWZ5ICE9IE5VTEwgJiYKLQkJICAgbm90aWZ5LT5uX3JlZ2lzdGVyICE9IE5VTEwgJiYKLQkJICAgbm90aWZ5LT5uX3VucmVnaXN0ZXIgIT0gTlVMTCAmJgotCQkgICBub3RpZnktPm5fZGlzY29ubmVjdCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFub3RpZnkgfHwKKwkJICAgICAgICFub3RpZnktPm5fcmVnaXN0ZXIgfHwKKwkJICAgICAgICFub3RpZnktPm5fdW5yZWdpc3RlciB8fAorCQkgICAgICAgIW5vdGlmeS0+bl9kaXNjb25uZWN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCWlmIChuZnJlZSkgewogCQlsaXN0X2RlbCgmbm90aWZ5LT5saXN0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKaW5kZXggNDlhYTY5My4uMzZkN2E1OSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fY29tcGF0LmMKKysrIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKQEAgLTM5Nyw3ICszOTcsOCBAQAogCXNuZF9wY21fdWZyYW1lc190IGJvdW5kYXJ5OwogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcnVudGltZSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGdldF91c2VyKHNmbGFncywgJnNyYy0+ZmxhZ3MpIHx8CiAJICAgIGdldF91c2VyKHNjb250cm9sLmFwcGxfcHRyLCAmc3JjLT5jLmNvbnRyb2wuYXBwbF9wdHIpIHx8CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9saWIuYyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCmluZGV4IDE1MzNmMDMuLjZlYTVjZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCkBAIC04NSw3ICs4NSw4IEBACiAJCX0KIAkJZnJhbWVzID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBydW50aW1lLT5zaWxlbmNlX2ZpbGxlZDsKIAl9Ci0Jc25kX2Fzc2VydChmcmFtZXMgPD0gcnVudGltZS0+YnVmZmVyX3NpemUsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oZnJhbWVzID4gcnVudGltZS0+YnVmZmVyX3NpemUpKQorCQlyZXR1cm47CiAJaWYgKGZyYW1lcyA9PSAwKQogCQlyZXR1cm47CiAJb2ZzID0gcnVudGltZS0+c2lsZW5jZV9zdGFydCAlIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwpAQCAtOTYsNyArOTcsNyBAQAogCQkJaWYgKHN1YnN0cmVhbS0+b3BzLT5zaWxlbmNlKSB7CiAJCQkJaW50IGVycjsKIAkJCQllcnIgPSBzdWJzdHJlYW0tPm9wcy0+c2lsZW5jZShzdWJzdHJlYW0sIC0xLCBvZnMsIHRyYW5zZmVyKTsKLQkJCQlzbmRfYXNzZXJ0KGVyciA+PSAwLCApOworCQkJCXNuZF9CVUdfT04oZXJyIDwgMCk7CiAJCQl9IGVsc2UgewogCQkJCWNoYXIgKmh3YnVmID0gcnVudGltZS0+ZG1hX2FyZWEgKyBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgb2ZzKTsKIAkJCQlzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShydW50aW1lLT5mb3JtYXQsIGh3YnVmLCB0cmFuc2ZlciAqIHJ1bnRpbWUtPmNoYW5uZWxzKTsKQEAgLTEwOCw3ICsxMDksNyBAQAogCQkJCWZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgKytjKSB7CiAJCQkJCWludCBlcnI7CiAJCQkJCWVyciA9IHN1YnN0cmVhbS0+b3BzLT5zaWxlbmNlKHN1YnN0cmVhbSwgYywgb2ZzLCB0cmFuc2Zlcik7Ci0JCQkJCXNuZF9hc3NlcnQoZXJyID49IDAsICk7CisJCQkJCXNuZF9CVUdfT04oZXJyIDwgMCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzaXplX3QgZG1hX2NzaXplID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gY2hhbm5lbHM7CkBAIC0zNTQsNyArMzU1LDcgQEAKIHsKIAl1X2ludDY0X3QgbiA9ICh1X2ludDY0X3QpIGEgKiBiOwogCWlmIChjID09IDApIHsKLQkJc25kX2Fzc2VydChuID4gMCwgKTsKKwkJc25kX0JVR19PTighbik7CiAJCSpyID0gMDsKIAkJcmV0dXJuIFVJTlRfTUFYOwogCX0KQEAgLTM4MCw3ICszODEsOCBAQAogaW50IHNuZF9pbnRlcnZhbF9yZWZpbmUoc3RydWN0IHNuZF9pbnRlcnZhbCAqaSwgY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqdikKIHsKIAlpbnQgY2hhbmdlZCA9IDA7Ci0Jc25kX2Fzc2VydCghc25kX2ludGVydmFsX2VtcHR5KGkpLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oc25kX2ludGVydmFsX2VtcHR5KGkpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGktPm1pbiA8IHYtPm1pbikgewogCQlpLT5taW4gPSB2LT5taW47CiAJCWktPm9wZW5taW4gPSB2LT5vcGVubWluOwpAQCAtNDIzLDcgKzQyNSw4IEBACiAKIHN0YXRpYyBpbnQgc25kX2ludGVydmFsX3JlZmluZV9maXJzdChzdHJ1Y3Qgc25kX2ludGVydmFsICppKQogewotCXNuZF9hc3NlcnQoIXNuZF9pbnRlcnZhbF9lbXB0eShpKSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHNuZF9pbnRlcnZhbF9lbXB0eShpKSkpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChzbmRfaW50ZXJ2YWxfc2luZ2xlKGkpKQogCQlyZXR1cm4gMDsKIAlpLT5tYXggPSBpLT5taW47CkBAIC00MzUsNyArNDM4LDggQEAKIAogc3RhdGljIGludCBzbmRfaW50ZXJ2YWxfcmVmaW5lX2xhc3Qoc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKIHsKLQlzbmRfYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSksIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoc25kX2ludGVydmFsX3NpbmdsZShpKSkKIAkJcmV0dXJuIDA7CiAJaS0+bWluID0gaS0+bWF4OwpAQCAtODg5LDcgKzg5Myw4IEBACiAJYy0+cHJpdmF0ZSA9IHByaXZhdGU7CiAJayA9IDA7CiAJd2hpbGUgKDEpIHsKLQkJc25kX2Fzc2VydChrIDwgQVJSQVlfU0laRShjLT5kZXBzKSwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoc25kX0JVR19PTihrID49IEFSUkFZX1NJWkUoYy0+ZGVwcykpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWMtPmRlcHNbaysrXSA9IGRlcDsKIAkJaWYgKGRlcCA8IDApCiAJCQlicmVhazsKQEAgLTEyODUsNyArMTI5MCw4IEBACiAJCXJldHVybiBjaGFuZ2VkOwogCWlmIChwYXJhbXMtPnJtYXNrKSB7CiAJCWludCBlcnIgPSBzbmRfcGNtX2h3X3JlZmluZShwY20sIHBhcmFtcyk7Ci0JCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOworCQlpZiAoc25kX0JVR19PTihlcnIgPCAwKSkKKwkJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlKHBhcmFtcywgdmFyLCBkaXIpOwogfQpAQCAtMTMzMCw3ICsxMzM2LDggQEAKIAkJcmV0dXJuIGNoYW5nZWQ7CiAJaWYgKHBhcmFtcy0+cm1hc2spIHsKIAkJaW50IGVyciA9IHNuZF9wY21faHdfcmVmaW5lKHBjbSwgcGFyYW1zKTsKLQkJc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIGVycik7CisJCWlmIChzbmRfQlVHX09OKGVyciA8IDApKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIHNuZF9wY21faHdfcGFyYW1fdmFsdWUocGFyYW1zLCB2YXIsIGRpcik7CiB9CkBAIC0xMzY4LDcgKzEzNzUsOCBAQAogCQkJZXJyID0gc25kX3BjbV9od19wYXJhbV9maXJzdChwY20sIHBhcmFtcywgKnYsIE5VTEwpOwogCQllbHNlCiAJCQllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX2xhc3QocGNtLCBwYXJhbXMsICp2LCBOVUxMKTsKLQkJc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIGVycik7CisJCWlmIChzbmRfQlVHX09OKGVyciA8IDApKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDY2LDkgKzE0NzQsOSBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybik7CisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybjsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9hc3NlcnQocnVudGltZSAhPSBOVUxMLCByZXR1cm4pOwogCiAJaWYgKHJ1bnRpbWUtPnRyYW5zZmVyX2Fja19iZWdpbikKIAkJcnVudGltZS0+dHJhbnNmZXJfYWNrX2JlZ2luKHN1YnN0cmVhbSk7CkBAIC0xNTY3LDcgKzE1NzUsNiBAQAogCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgewogCQljaGFyICpod2J1ZiA9IHJ1bnRpbWUtPmRtYV9hcmVhICsgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGh3b2ZmKTsKLQkJc25kX2Fzc2VydChydW50aW1lLT5kbWFfYXJlYSwgcmV0dXJuIC1FRkFVTFQpOwogCQlpZiAoY29weV9mcm9tX3VzZXIoaHdidWYsIGJ1ZiwgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGZyYW1lcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMTYyOSw3ICsxNjM2LDEwIEBACiAJCWNvbnQgPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyICUgcnVudGltZS0+YnVmZmVyX3NpemU7CiAJCWlmIChmcmFtZXMgPiBjb250KQogCQkJZnJhbWVzID0gY29udDsKLQkJc25kX2Fzc2VydChmcmFtZXMgIT0gMCwgc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOyByZXR1cm4gLUVJTlZBTCk7CisJCWlmIChzbmRfQlVHX09OKCFmcmFtZXMpKSB7CisJCQlzbmRfcGNtX3N0cmVhbV91bmxvY2tfaXJxKHN1YnN0cmVhbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlhcHBsX3B0ciA9IHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyOwogCQlhcHBsX29mcyA9IGFwcGxfcHRyICUgcnVudGltZS0+YnVmZmVyX3NpemU7CiAJCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKQEAgLTE2NjksMTggKzE2NzksMzAgQEAKIAlyZXR1cm4geGZlciA+IDAgPyAoc25kX3BjbV9zZnJhbWVzX3QpeGZlciA6IGVycjsKIH0KIAorLyogc2FuaXR5LWNoZWNrIGZvciByZWFkL3dyaXRlIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgcGNtX3Nhbml0eV9jaGVjayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWYgKHNuZF9CVUdfT04oIXN1YnN0cmVhbS0+b3BzLT5jb3B5ICYmICFydW50aW1lLT5kbWFfYXJlYSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQorCQlyZXR1cm4gLUVCQURGRDsKKwlyZXR1cm4gMDsKK30KKwogc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9saWJfd3JpdGUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNuZF9wY21fdWZyYW1lc190IHNpemUpCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAlpbnQgbm9uYmxvY2s7CisJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWVyciA9IHBjbV9zYW5pdHlfY2hlY2soc3Vic3RyZWFtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9hc3NlcnQocnVudGltZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbS0+b3BzLT5jb3B5ICE9IE5VTEwgfHwgcnVudGltZS0+ZG1hX2FyZWEgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQotCQlyZXR1cm4gLUVCQURGRDsKLQogCW5vbmJsb2NrID0gISEoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAKIAlpZiAocnVudGltZS0+YWNjZXNzICE9IFNORFJWX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQgJiYKQEAgLTE3MDMsNyArMTcyNSw4IEBACiAJaW50IGNoYW5uZWxzID0gcnVudGltZS0+Y2hhbm5lbHM7CiAJaW50IGM7CiAJaWYgKHN1YnN0cmVhbS0+b3BzLT5jb3B5KSB7Ci0JCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5vcHMtPnNpbGVuY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtLT5vcHMtPnNpbGVuY2UpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgKytjLCArK2J1ZnMpIHsKIAkJCWlmICgqYnVmcyA9PSBOVUxMKSB7CiAJCQkJaWYgKChlcnIgPSBzdWJzdHJlYW0tPm9wcy0+c2lsZW5jZShzdWJzdHJlYW0sIGMsIGh3b2ZmLCBmcmFtZXMpKSA8IDApCkBAIC0xNzE3LDcgKzE3NDAsNiBAQAogCX0gZWxzZSB7CiAJCS8qIGRlZmF1bHQgdHJhbnNmZXIgYmVoYXZpb3VyICovCiAJCXNpemVfdCBkbWFfY3NpemUgPSBydW50aW1lLT5kbWFfYnl0ZXMgLyBjaGFubmVsczsKLQkJc25kX2Fzc2VydChydW50aW1lLT5kbWFfYXJlYSwgcmV0dXJuIC1FRkFVTFQpOwogCQlmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7ICsrYywgKytidWZzKSB7CiAJCQljaGFyICpod2J1ZiA9IHJ1bnRpbWUtPmRtYV9hcmVhICsgKGMgKiBkbWFfY3NpemUpICsgc2FtcGxlc190b19ieXRlcyhydW50aW1lLCBod29mZik7CiAJCQlpZiAoKmJ1ZnMgPT0gTlVMTCkgewpAQCAtMTczOCwxNCArMTc2MCwxMiBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAJaW50IG5vbmJsb2NrOworCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwllcnIgPSBwY21fc2FuaXR5X2NoZWNrKHN1YnN0cmVhbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0tPm9wcy0+Y29weSAhPSBOVUxMIHx8IHJ1bnRpbWUtPmRtYV9hcmVhICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKLQkJcmV0dXJuIC1FQkFERkQ7Ci0KIAlub25ibG9jayA9ICEhKHN1YnN0cmVhbS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogCiAJaWYgKHJ1bnRpbWUtPmFjY2VzcyAhPSBTTkRSVl9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVEKQpAQCAtMTc2OSw3ICsxNzg5LDYgQEAKIAkJCXJldHVybiBlcnI7CiAJfSBlbHNlIHsKIAkJY2hhciAqaHdidWYgPSBydW50aW1lLT5kbWFfYXJlYSArIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBod29mZik7Ci0JCXNuZF9hc3NlcnQocnVudGltZS0+ZG1hX2FyZWEsIHJldHVybiAtRUZBVUxUKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGh3YnVmLCBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0xODQxLDcgKzE4NjAsMTAgQEAKIAkJY29udCA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgJSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAkJaWYgKGZyYW1lcyA+IGNvbnQpCiAJCQlmcmFtZXMgPSBjb250OwotCQlzbmRfYXNzZXJ0KGZyYW1lcyAhPSAwLCBzbmRfcGNtX3N0cmVhbV91bmxvY2tfaXJxKHN1YnN0cmVhbSk7IHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWZyYW1lcykpIHsKKwkJCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWFwcGxfcHRyID0gcnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHI7CiAJCWFwcGxfb2ZzID0gYXBwbF9wdHIgJSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAkJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwpAQCAtMTg3OSwxNCArMTkwMSwxMiBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAJaW50IG5vbmJsb2NrOworCWludCBlcnI7CiAJCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJZXJyID0gcGNtX3Nhbml0eV9jaGVjayhzdWJzdHJlYW0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc25kX2Fzc2VydChydW50aW1lICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5vcHMtPmNvcHkgIT0gTlVMTCB8fCBydW50aW1lLT5kbWFfYXJlYSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0JaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCi0JCXJldHVybiAtRUJBREZEOwotCiAJbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAlpZiAocnVudGltZS0+YWNjZXNzICE9IFNORFJWX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTkxNiw3ICsxOTM2LDYgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXNuZF9wY21fdWZyYW1lc190IGRtYV9jc2l6ZSA9IHJ1bnRpbWUtPmRtYV9ieXRlcyAvIGNoYW5uZWxzOwotCQlzbmRfYXNzZXJ0KHJ1bnRpbWUtPmRtYV9hcmVhLCByZXR1cm4gLUVGQVVMVCk7CiAJCWZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgKytjLCArK2J1ZnMpIHsKIAkJCWNoYXIgKmh3YnVmOwogCQkJY2hhciBfX3VzZXIgKmJ1ZjsKQEAgLTE5MzgsMTEgKzE5NTcsMTIgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCWludCBub25ibG9jazsKKwlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJZXJyID0gcGNtX3Nhbml0eV9jaGVjayhzdWJzdHJlYW0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc25kX2Fzc2VydChydW50aW1lICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5vcHMtPmNvcHkgIT0gTlVMTCB8fCBydW50aW1lLT5kbWFfYXJlYSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCiAJCXJldHVybiAtRUJBREZEOwogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jCmluZGV4IGZmMDdiNGEuLmE2ZDQyODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jCkBAIC01MCw4ICs1MCw2IEBACiAJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChzaXplID4gMCwgcmV0dXJuIC1FSU5WQUwpOwotCiAJLyogYWxyZWFkeSByZXNlcnZlZD8gKi8KIAlpZiAoc25kX2RtYV9nZXRfcmVzZXJ2ZWRfYnVmKGRtYWIsIHN1YnN0cmVhbS0+ZG1hX2J1Zl9pZCkgPiAwKSB7CiAJCWlmIChkbWFiLT5ieXRlcyA+PSBzaXplKQpAQCAtMzI2LDYgKzMyNCwzMiBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF9wY21fc2didWZfb3BzX3BhZ2UpOwogCisvKgorICogY29tcHV0ZSB0aGUgbWF4IGNodW5rIHNpemUgd2l0aCBjb250aW51b3VzIHBhZ2VzIG9uIHNnLWJ1ZmZlcgorICovCit1bnNpZ25lZCBpbnQgc25kX3BjbV9zZ2J1Zl9nZXRfY2h1bmtfc2l6ZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgb2ZzLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2cgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOworCXVuc2lnbmVkIGludCBzdGFydCwgZW5kLCBwZzsKKworCXN0YXJ0ID0gb2ZzID4+IFBBR0VfU0hJRlQ7CisJZW5kID0gKG9mcyArIHNpemUgLSAxKSA+PiBQQUdFX1NISUZUOworCS8qIGNoZWNrIHBhZ2UgY29udGludWl0eSAqLworCXBnID0gc2ctPnRhYmxlW3N0YXJ0XS5hZGRyID4+IFBBR0VfU0hJRlQ7CisJZm9yICg7OykgeworCQlzdGFydCsrOworCQlpZiAoc3RhcnQgPiBlbmQpCisJCQlicmVhazsKKwkJcGcrKzsKKwkJaWYgKChzZy0+dGFibGVbc3RhcnRdLmFkZHIgPj4gUEFHRV9TSElGVCkgIT0gcGcpCisJCQlyZXR1cm4gKHN0YXJ0IDw8IFBBR0VfU0hJRlQpIC0gb2ZzOworCX0KKwkvKiBvaywgYWxsIG9uIGNvbnRpbnVvdXMgcGFnZXMgKi8KKwlyZXR1cm4gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woc25kX3BjbV9zZ2J1Zl9nZXRfY2h1bmtfc2l6ZSk7CisKIC8qKgogICogc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzIC0gYWxsb2NhdGUgdGhlIERNQSBidWZmZXIKICAqIEBzdWJzdHJlYW06IHRoZSBzdWJzdHJlYW0gdG8gYWxsb2NhdGUgdGhlIERNQSBidWZmZXIgdG8KQEAgLTM0MiwxMCArMzY2LDEyIEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIgPSBOVUxMOwogCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0tPmRtYV9idWZmZXIuZGV2LnR5cGUgIT0gU05EUlZfRE1BX1RZUEVfVU5LTk9XTiwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oc3Vic3RyZWFtLT5kbWFfYnVmZmVyLmRldi50eXBlID09CisJCSAgICAgICBTTkRSVl9ETUFfVFlQRV9VTktOT1dOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCiAJaWYgKHJ1bnRpbWUtPmRtYV9idWZmZXJfcCkgewogCQkvKiBwZXJwaGFwcywgd2UgbWlnaHQgZnJlZSB0aGUgbGFyZ2UgRE1BIG1lbW9yeSByZWdpb24KQEAgLTM5MSw5ICs0MTcsOSBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybiAtRUlOVkFMOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc25kX2Fzc2VydChydW50aW1lICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKIAlpZiAocnVudGltZS0+ZG1hX2FyZWEgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJaWYgKHJ1bnRpbWUtPmRtYV9idWZmZXJfcCAhPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IGM0OWI5ZDkuLmU2MWUxMjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC05NSw3ICs5NSw2IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHN1YnN0cmVhbS0+cGNtOwogCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9IHN1YnN0cmVhbS0+cHN0cjsKIAotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwogCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKIAlpbmZvLT5jYXJkID0gcGNtLT5jYXJkLT5udW1iZXI7CiAJaW5mby0+ZGV2aWNlID0gcGNtLT5kZXZpY2U7CkBAIC0zNzAsOSArMzY5LDkgQEAKIAl1bnNpZ25lZCBpbnQgYml0czsKIAlzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXM7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9hc3NlcnQocnVudGltZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrX2lycShzdWJzdHJlYW0pOwogCXN3aXRjaCAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSkgewogCWNhc2UgU05EUlZfUENNX1NUQVRFX09QRU46CkBAIC00OTAsOSArNDg5LDkgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCWludCByZXN1bHQgPSAwOwogCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybiAtRU5YSU87CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJc25kX3BjbV9zdHJlYW1fbG9ja19pcnEoc3Vic3RyZWFtKTsKIAlzd2l0Y2ggKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUpIHsKIAljYXNlIFNORFJWX1BDTV9TVEFURV9TRVRVUDoKQEAgLTUxOCw5ICs1MTcsOSBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXNuZF9hc3NlcnQocnVudGltZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrX2lycShzdWJzdHJlYW0pOwogCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKSB7CiAJCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKQEAgLTYyMiwxMSArNjIxLDggQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMgX191c2VyICogX3N0YXR1cykKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAJaW50IHJlczsKIAkKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CiAJcmVzID0gc25kX3BjbV9zdGF0dXMoc3Vic3RyZWFtLCAmc3RhdHVzKTsKIAlpZiAocmVzIDwgMCkKQEAgLTY0Miw3ICs2MzgsNiBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CiAJdW5zaWduZWQgaW50IGNoYW5uZWw7CiAJCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJY2hhbm5lbCA9IGluZm8tPmNoYW5uZWw7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzbmRfcGNtX3N0cmVhbV9sb2NrX2lycShzdWJzdHJlYW0pOwpAQCAtMTI1MCw3ICsxMjQ1LDYgQEAKIAlpbnQgZXJyID0gc3Vic3RyZWFtLT5vcHMtPmlvY3RsKHN1YnN0cmVhbSwgU05EUlZfUENNX0lPQ1RMMV9SRVNFVCwgTlVMTCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JLy8gc25kX2Fzc2VydChydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA8IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCApOwogCXJ1bnRpbWUtPmh3X3B0cl9iYXNlID0gMDsKIAlydW50aW1lLT5od19wdHJfaW50ZXJydXB0ID0gcnVudGltZS0+c3RhdHVzLT5od19wdHIgLQogCQlydW50aW1lLT5zdGF0dXMtPmh3X3B0ciAlIHJ1bnRpbWUtPnBlcmlvZF9zaXplOwpAQCAtMTQyMSw3ICsxNDE1LDYgQEAKIAlpbnQgaSwgbnVtX2RyZWNzOwogCXN0cnVjdCBkcmFpbl9yZWMgKmRyZWMsIGRyZWNfdG1wLCAqZDsKIAotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwogCWNhcmQgPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZDsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCkBAIC0xNTQxLDIxICsxNTM0LDE2IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCByZXN1bHQgPSAwOwogCQotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJY2FyZCA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkOwogCiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4gfHwKLQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfRElTQ09OTkVDVEVEKQorCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQgfHwKKwkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEKQogCQlyZXR1cm4gLUVCQURGRDsKIAotCXNuZF9wb3dlcl9sb2NrKGNhcmQpOwotCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQpIHsKLQkJcmVzdWx0ID0gc25kX3Bvd2VyX3dhaXQoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlnb3RvIF91bmxvY2s7Ci0JfQotCiAJc25kX3BjbV9zdHJlYW1fbG9ja19pcnEoc3Vic3RyZWFtKTsKIAkvKiByZXN1bWUgcGF1c2UgKi8KIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfUEFVU0VEKQpAQCAtMTU2NCw4ICsxNTUyLDcgQEAKIAlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfU0VUVVApOwogCS8qIHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyID0gcnVudGltZS0+c3RhdHVzLT5od19wdHI7ICovCiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwotIF91bmxvY2s6Ci0Jc25kX3Bvd2VyX3VubG9jayhjYXJkKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE5NDEsMzMgKzE5MjgsNDEgQEAKIAkJCW1hc2sgfD0gMSA8PCBTTkRSVl9QQ01fQUNDRVNTX01NQVBfQ09NUExFWDsKIAl9CiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X21hc2socnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUywgbWFzayk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X21hc2s2NChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULCBody0+Zm9ybWF0cyk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X21hc2socnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVCwgMSA8PCBTTkRSVl9QQ01fU1VCRk9STUFUX1NURCk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCiAJCQkJCSAgIGh3LT5jaGFubmVsc19taW4sIGh3LT5jaGFubmVsc19tYXgpOwotCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCiAJCQkJCSAgIGh3LT5yYXRlX21pbiwgaHctPnJhdGVfbWF4KTsKLQlzbmRfYXNzZXJ0KGVyciA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJIGlmIChlcnIgPCAwKQorCQkgcmV0dXJuIGVycjsKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKIAkJCQkJICAgaHctPnBlcmlvZF9ieXRlc19taW4sIGh3LT5wZXJpb2RfYnl0ZXNfbWF4KTsKLQlzbmRfYXNzZXJ0KGVyciA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJIGlmIChlcnIgPCAwKQorCQkgcmV0dXJuIGVycjsKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMsCiAJCQkJCSAgIGh3LT5wZXJpb2RzX21pbiwgaHctPnBlcmlvZHNfbWF4KTsKLQlzbmRfYXNzZXJ0KGVyciA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCiAJCQkJCSAgIGh3LT5wZXJpb2RfYnl0ZXNfbWluLCBody0+YnVmZmVyX2J5dGVzX21heCk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAKIAkJCQkgIHNuZF9wY21faHdfcnVsZV9idWZmZXJfYnl0ZXNfbWF4LCBzdWJzdHJlYW0sCkBAIC0xOTc4LDcgKzE5NzMsOCBAQAogCS8qIEZJWE1FOiByZW1vdmUgKi8KIAlpZiAocnVudGltZS0+ZG1hX2J5dGVzKSB7CiAJCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgMCwgcnVudGltZS0+ZG1hX2J5dGVzKTsKLQkJc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICghKGh3LT5yYXRlcyAmIChTTkRSVl9QQ01fUkFURV9LTk9UIHwgU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUykpKSB7CkBAIC0yMDc0LDggKzIwNzAsOCBAQAogCXN0cnVjdCBzbmRfcGNtX3N0ciAqc3RyOwogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KHJwY21fZmlsZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0JKnJwY21fZmlsZSA9IE5VTEw7CisJaWYgKHJwY21fZmlsZSkKKwkJKnJwY21fZmlsZSA9IE5VTEw7CiAKIAllcnIgPSBzbmRfcGNtX29wZW5fc3Vic3RyZWFtKHBjbSwgc3RyZWFtLCBmaWxlLCAmc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTIwOTMsNyArMjA4OSw4IEBACiAJCXN1YnN0cmVhbS0+cGNtX3JlbGVhc2UgPSBwY21fcmVsZWFzZV9wcml2YXRlOwogCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBwY21fZmlsZTsKLQkqcnBjbV9maWxlID0gcGNtX2ZpbGU7CisJaWYgKHJwY21fZmlsZSkKKwkJKnJwY21fZmlsZSA9IHBjbV9maWxlOwogCXJldHVybiAwOwogfQogCkBAIC0yMTc3LDcgKzIxNzQsOCBAQAogCiAJcGNtX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3Vic3RyZWFtID0gcGNtX2ZpbGUtPnN1YnN0cmVhbTsKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlwY20gPSBzdWJzdHJlYW0tPnBjbTsKIAlmYXN5bmNfaGVscGVyKC0xLCBmaWxlLCAwLCAmc3Vic3RyZWFtLT5ydW50aW1lLT5mYXN5bmMpOwogCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CkBAIC0yNTAwLDggKzI0OTgsNiBAQAogCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIHsKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fSU9DVExfUFZFUlNJT046CiAJCXJldHVybiBwdXRfdXNlcihTTkRSVl9QQ01fVkVSU0lPTiwgKGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7CkBAIC0yNTcwLDggKzI1NjYsMTAgQEAKIAkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQogewotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1dSSVRFSV9GUkFNRVM6CiAJewpAQCAtMjY1MCw4ICsyNjQ4LDEwIEBACiAJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTihzdWJzdHJlYW0tPnN0cmVhbSAhPSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1JFQURJX0ZSQU1FUzoKIAl7CkBAIC0yNzkwLDcgKzI3OTAsOCBAQAogCiAJcGNtX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3Vic3RyZWFtID0gcGNtX2ZpbGUtPnN1YnN0cmVhbTsKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQogCQlyZXR1cm4gLUVCQURGRDsKQEAgLTI4MTMsMjEgKzI4MTQsMTcgQEAKIAogCXBjbV9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN1YnN0cmVhbSA9IHBjbV9maWxlLT5zdWJzdHJlYW07Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmVzdWx0ID0gLUVOWElPOyBnb3RvIGVuZCk7CisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybiAtRU5YSU87CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikgewotCQlyZXN1bHQgPSAtRUJBREZEOwotCQlnb3RvIGVuZDsKLQl9Ci0JaWYgKCFmcmFtZV9hbGlnbmVkKHJ1bnRpbWUsIGNvdW50KSkgewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9CisJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCisJCXJldHVybiAtRUJBREZEOworCWlmICghZnJhbWVfYWxpZ25lZChydW50aW1lLCBjb3VudCkpCisJCXJldHVybiAtRUlOVkFMOwogCWNvdW50ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGNvdW50KTsKIAlyZXN1bHQgPSBzbmRfcGNtX2xpYl93cml0ZShzdWJzdHJlYW0sIGJ1ZiwgY291bnQpOwogCWlmIChyZXN1bHQgPiAwKQogCQlyZXN1bHQgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcmVzdWx0KTsKLSBlbmQ6CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjg0NSw3ICsyODQyLDggQEAKIAogCXBjbV9maWxlID0gaW9jYi0+a2lfZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN1YnN0cmVhbSA9IHBjbV9maWxlLT5zdWJzdHJlYW07Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKFBDTV9SVU5USU1FX0NIRUNLKHN1YnN0cmVhbSkpCisJCXJldHVybiAtRU5YSU87CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKIAkJcmV0dXJuIC1FQkFERkQ7CkBAIC0yODc5LDE3ICsyODc3LDE0IEBACiAKIAlwY21fZmlsZSA9IGlvY2ItPmtpX2ZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdWJzdHJlYW0gPSBwY21fZmlsZS0+c3Vic3RyZWFtOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJlc3VsdCA9IC1FTlhJTzsgZ290byBlbmQpOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pIHsKLQkJcmVzdWx0ID0gLUVCQURGRDsKLQkJZ290byBlbmQ7Ci0JfQorCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQorCQlyZXR1cm4gLUVCQURGRDsKIAlpZiAobnJfc2VncyA+IDEyOCB8fCBucl9zZWdzICE9IHJ1bnRpbWUtPmNoYW5uZWxzIHx8Ci0JICAgICFmcmFtZV9hbGlnbmVkKHJ1bnRpbWUsIGlvdi0+aW92X2xlbikpIHsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQorCSAgICAhZnJhbWVfYWxpZ25lZChydW50aW1lLCBpb3YtPmlvdl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlmcmFtZXMgPSBieXRlc190b19zYW1wbGVzKHJ1bnRpbWUsIGlvdi0+aW92X2xlbik7CiAJYnVmcyA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiBucl9zZWdzLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmcyA9PSBOVUxMKQpAQCAtMjkwMCw3ICsyODk1LDYgQEAKIAlpZiAocmVzdWx0ID4gMCkKIAkJcmVzdWx0ID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJlc3VsdCk7CiAJa2ZyZWUoYnVmcyk7Ci0gZW5kOgogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI5MTUsNyArMjkwOSw4IEBACiAJcGNtX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzdWJzdHJlYW0gPSBwY21fZmlsZS0+c3Vic3RyZWFtOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJnJ1bnRpbWUtPnNsZWVwLCB3YWl0KTsKQEAgLTI5NTMsNyArMjk0OCw4IEBACiAJcGNtX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzdWJzdHJlYW0gPSBwY21fZmlsZS0+c3Vic3RyZWFtOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJnJ1bnRpbWUtPnNsZWVwLCB3YWl0KTsKQEAgLTMwMjMsNyArMzAxOSw2IEBACiAJaWYgKCEoYXJlYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuIC1FQUdBSU4pOwogCXNpemUgPSBhcmVhLT52bV9lbmQgLSBhcmVhLT52bV9zdGFydDsKIAlpZiAoc2l6ZSAhPSBQQUdFX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc25kX3BjbV9tbWFwX3N0YXR1cykpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwNjMsNyArMzA1OCw2IEBACiAJaWYgKCEoYXJlYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuIC1FQUdBSU4pOwogCXNpemUgPSBhcmVhLT52bV9lbmQgLSBhcmVhLT52bV9zdGFydDsKIAlpZiAoc2l6ZSAhPSBQQUdFX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc25kX3BjbV9tbWFwX2NvbnRyb2wpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTk1LDcgKzMxODksNiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc25kX2Fzc2VydChydW50aW1lICE9IE5VTEwsIHJldHVybiAtRUFHQUlOKTsKIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKCEocnVudGltZS0+aW5mbyAmIFNORFJWX1BDTV9JTkZPX01NQVApKQpAQCAtMzIyNyw3ICszMjIwLDggQEAKIAkKIAlwY21fZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdWJzdHJlYW0gPSBwY21fZmlsZS0+c3Vic3RyZWFtOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVOWElPOwogCiAJb2Zmc2V0ID0gYXJlYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKIAlzd2l0Y2ggKG9mZnNldCkgewpAQCAtMzI1NSw5ICszMjQ5LDkgQEAKIAlsb2NrX2tlcm5lbCgpOwogCXBjbV9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN1YnN0cmVhbSA9IHBjbV9maWxlLT5zdWJzdHJlYW07Ci0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgZ290byBvdXQpOworCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKQorCQlnb3RvIG91dDsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCiAJZXJyID0gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZydW50aW1lLT5mYXN5bmMpOwogb3V0OgogCXVubG9ja19rZXJuZWwoKTsKQEAgLTMzOTEsNiArMzM4NSwxNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJICovCiAKKyNpZm5kZWYgQ09ORklHX01NVQordW5zaWduZWQgbG9uZyBkdW1teV9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorIyBkZWZpbmUgZHVtbXlfZ2V0X3VubWFwcGVkX2FyZWEgTlVMTAorI2VuZGlmCisKIC8qCiAgKiAgUmVnaXN0ZXIgc2VjdGlvbgogICovCkBAIC0zNDA3LDYgKzM0MTIsNyBAQAogCQkuY29tcGF0X2lvY3RsID0gCXNuZF9wY21faW9jdGxfY29tcGF0LAogCQkubW1hcCA9CQkJc25kX3BjbV9tbWFwLAogCQkuZmFzeW5jID0JCXNuZF9wY21fZmFzeW5jLAorCQkuZ2V0X3VubWFwcGVkX2FyZWEgPQlkdW1teV9nZXRfdW5tYXBwZWRfYXJlYSwKIAl9LAogCXsKIAkJLm93bmVyID0JCVRISVNfTU9EVUxFLApAQCAtMzQxOSw1ICszNDI1LDYgQEAKIAkJLmNvbXBhdF9pb2N0bCA9IAlzbmRfcGNtX2lvY3RsX2NvbXBhdCwKIAkJLm1tYXAgPQkJCXNuZF9wY21fbW1hcCwKIAkJLmZhc3luYyA9CQlzbmRfcGNtX2Zhc3luYywKKwkJLmdldF91bm1hcHBlZF9hcmVhID0JZHVtbXlfZ2V0X3VubWFwcGVkX2FyZWEsCiAJfQogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMgYi9zb3VuZC9jb3JlL3BjbV90aW1lci5jCmluZGV4IDAzM2EwMjQuLjJjODljMDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9wY21fdGltZXIuYwpAQCAtNTEsMTIgKzUxLDE0IEBACiAJCiAgICAgICAgIG11bHQgPSAxMDAwMDAwMDAwOwogCXJhdGUgPSBydW50aW1lLT5yYXRlOwotCXNuZF9hc3NlcnQocmF0ZSAhPSAwLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFyYXRlKSkKKwkJcmV0dXJuOwogCWwgPSBnY2QobXVsdCwgcmF0ZSk7CiAJbXVsdCAvPSBsOwogCXJhdGUgLz0gbDsKIAlmc2l6ZSA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCXNuZF9hc3NlcnQoZnNpemUgIT0gMCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighZnNpemUpKQorCQlyZXR1cm47CiAJbCA9IGdjZChyYXRlLCBmc2l6ZSk7CiAJcmF0ZSAvPSBsOwogCWZzaXplIC89IGw7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IGY3ZWE3MjguLmM0OTk1YzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC00MTgsNyArNDE4LDcgQEAKIAltdXRleF9sb2NrKCZybWlkaS0+b3Blbl9tdXRleCk7CiAJd2hpbGUgKDEpIHsKIAkJc3ViZGV2aWNlID0gLTE7Ci0JCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworCQlyZWFkX2xvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGtjdGwsICZjYXJkLT5jdGxfZmlsZXMsIGxpc3QpIHsKIAkJCWlmIChrY3RsLT5waWQgPT0gY3VycmVudC0+cGlkKSB7CiAJCQkJc3ViZGV2aWNlID0ga2N0bC0+cHJlZmVyX3Jhd21pZGlfc3ViZGV2aWNlOwpAQCAtNDI2LDcgKzQyNiw3IEBACiAJCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCXVwX3JlYWQoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwkJcmVhZF91bmxvY2soJmNhcmQtPmN0bF9maWxlc19yd2xvY2spOwogCQllcnIgPSBzbmRfcmF3bWlkaV9rZXJuZWxfb3BlbihybWlkaS0+Y2FyZCwgcm1pZGktPmRldmljZSwKIAkJCQkJICAgICAgc3ViZGV2aWNlLCBmZmxhZ3MsIHJhd21pZGlfZmlsZSk7CiAJCWlmIChlcnIgPj0gMCkKQEAgLTQ3MCw4ICs0NzAsOCBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfcnVudGltZSAqcnVudGltZTsKIAotCXNuZF9hc3NlcnQocmZpbGUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7Ci0Jc25kX2Fzc2VydChyZmlsZS0+aW5wdXQgIT0gTlVMTCB8fCByZmlsZS0+b3V0cHV0ICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFyZmlsZSkpCisJCXJldHVybiAtRU5YSU87CiAJcm1pZGkgPSByZmlsZS0+cm1pZGk7CiAJbXV0ZXhfbG9jaygmcm1pZGktPm9wZW5fbXV0ZXgpOwogCWlmIChyZmlsZS0+aW5wdXQgIT0gTlVMTCkgewpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7Ci0Jc25kX2Fzc2VydChydW50aW1lLT5hdmFpbCArIGNvdW50IDw9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCApOworCXNuZF9CVUdfT04ocnVudGltZS0+YXZhaWwgKyBjb3VudCA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKIAlydW50aW1lLT5od19wdHIgKz0gY291bnQ7CiAJcnVudGltZS0+aHdfcHRyICU9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCXJ1bnRpbWUtPmF2YWlsICs9IGNvdW50OwpAQCAtMTE0MSw4ICsxMTQxLDEwIEBACiAJbG9uZyBjb3VudDEsIHJlc3VsdDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXNuZF9hc3NlcnQoa2VybmVsYnVmICE9IE5VTEwgfHwgdXNlcmJ1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChydW50aW1lLT5idWZmZXIgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFrZXJuZWxidWYgJiYgIXVzZXJidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTighcnVudGltZS0+YnVmZmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXN1bHQgPSAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZydW50aW1lLT5sb2NrLCBmbGFncyk7CkBAIC0xNDIwLDkgKzE0MjIsMTAgQEAKIAkJLmRldl9kaXNjb25uZWN0ID0gc25kX3Jhd21pZGlfZGV2X2Rpc2Nvbm5lY3QsCiAJfTsKIAotCXNuZF9hc3NlcnQocnJhd21pZGkgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCSpycmF3bWlkaSA9IE5VTEw7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAocnJhd21pZGkpCisJCSpycmF3bWlkaSA9IE5VTEw7CiAJcm1pZGkgPSBremFsbG9jKHNpemVvZigqcm1pZGkpLCBHRlBfS0VSTkVMKTsKIAlpZiAocm1pZGkgPT0gTlVMTCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJyYXdtaWRpOiBjYW5ub3QgYWxsb2NhdGVcbiIpOwpAQCAtMTQ1NSw3ICsxNDU4LDggQEAKIAkJc25kX3Jhd21pZGlfZnJlZShybWlkaSk7CiAJCXJldHVybiBlcnI7CiAJfQotCSpycmF3bWlkaSA9IHJtaWRpOworCWlmIChycmF3bWlkaSkKKwkJKnJyYXdtaWRpID0gcm1pZGk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NzIsNyArMTQ3Niw4IEBACiAKIHN0YXRpYyBpbnQgc25kX3Jhd21pZGlfZnJlZShzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpKQogewotCXNuZF9hc3NlcnQocm1pZGkgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CQorCWlmICghcm1pZGkpCisJCXJldHVybiAwOwogCiAJc25kX2luZm9fZnJlZV9lbnRyeShybWlkaS0+cHJvY19lbnRyeSk7CiAJcm1pZGktPnByb2NfZW50cnkgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ydGN0aW1lci5jIGIvc291bmQvY29yZS9ydGN0aW1lci5jCmluZGV4IDk3YjMwZmIuLjUxZTY0ZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKQEAgLTkxLDcgKzkxLDggQEAKIHJ0Y3RpbWVyX3N0YXJ0KHN0cnVjdCBzbmRfdGltZXIgKnRpbWVyKQogewogCXJ0Y190YXNrX3QgKnJ0YyA9IHRpbWVyLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChydGMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFydGMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlydGNfY29udHJvbChydGMsIFJUQ19JUlFQX1NFVCwgcnRjdGltZXJfZnJlcSk7CiAJcnRjX2NvbnRyb2wocnRjLCBSVENfUElFX09OLCAwKTsKIAlyZXR1cm4gMDsKQEAgLTEwMSw3ICsxMDIsOCBAQAogcnRjdGltZXJfc3RvcChzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcikKIHsKIAlydGNfdGFza190ICpydGMgPSB0aW1lci0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQocnRjICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcnRjKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcnRjX2NvbnRyb2wocnRjLCBSVENfUElFX09GRiwgMCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYwppbmRleCA3Nzc3OTZlLi5mMjVlM2NjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKQEAgLTE2NCw3ICsxNjQsOCBAQAogewogCXN0cnVjdCBzZXFfb3NzX2RldmluZm8gKmRwOwogCWRwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQoZHAgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKCFkcCkpCisJCXJldHVybiAtRU5YSU87CiAJcmV0dXJuIHNuZF9zZXFfb3NzX3JlYWQoZHAsIGJ1ZiwgY291bnQpOwogfQogCkBAIC0xNzQsNyArMTc1LDggQEAKIHsKIAlzdHJ1Y3Qgc2VxX29zc19kZXZpbmZvICpkcDsKIAlkcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KGRwICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighZHApKQorCQlyZXR1cm4gLUVOWElPOwogCXJldHVybiBzbmRfc2VxX29zc193cml0ZShkcCwgYnVmLCBjb3VudCwgZmlsZSk7CiB9CiAKQEAgLTE4Myw3ICsxODUsOCBAQAogewogCXN0cnVjdCBzZXFfb3NzX2RldmluZm8gKmRwOwogCWRwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQoZHAgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKCFkcCkpCisJCXJldHVybiAtRU5YSU87CiAJcmV0dXJuIHNuZF9zZXFfb3NzX2lvY3RsKGRwLCBjbWQsIGFyZyk7CiB9CiAKQEAgLTE5OCw3ICsyMDEsOCBAQAogewogCXN0cnVjdCBzZXFfb3NzX2RldmluZm8gKmRwOwogCWRwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQoZHAgIT0gTlVMTCwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCFkcCkpCisJCXJldHVybiAtRU5YSU87CiAJcmV0dXJuIHNuZF9zZXFfb3NzX3BvbGwoZHAsIGZpbGUsIHdhaXQpOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwppbmRleCBlMDI0ZTQ1Li45NDVhMjdjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKQEAgLTMwOCw3ICszMDgsOCBAQAogCXN0cnVjdCBzZXFfb3NzX3N5bnRoICpyZWM7CiAJc3RydWN0IHNlcV9vc3Nfc3ludGhpbmZvICppbmZvOwogCi0Jc25kX2Fzc2VydChkcC0+bWF4X3N5bnRoZGV2IDw9IFNORFJWX1NFUV9PU1NfTUFYX1NZTlRIX0RFVlMsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oZHAtPm1heF9zeW50aGRldiA+PSBTTkRSVl9TRVFfT1NTX01BWF9TWU5USF9ERVZTKSkKKwkJcmV0dXJuOwogCWZvciAoaSA9IDA7IGkgPCBkcC0+bWF4X3N5bnRoZGV2OyBpKyspIHsKIAkJaW5mbyA9ICZkcC0+c3ludGhzW2ldOwogCQlpZiAoISBpbmZvLT5vcGVuZWQpCkBAIC00MDIsNyArNDAzLDggQEAKIAlzdHJ1Y3Qgc2VxX29zc19zeW50aCAqcmVjOwogCXN0cnVjdCBzZXFfb3NzX3N5bnRoaW5mbyAqaW5mbzsKIAotCXNuZF9hc3NlcnQoZGV2ID49IDAgJiYgZGV2IDwgZHAtPm1heF9zeW50aGRldiwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihkZXYgPCAwIHx8IGRldiA+PSBkcC0+bWF4X3N5bnRoZGV2KSkKKwkJcmV0dXJuOwogCWluZm8gPSAmZHAtPnN5bnRoc1tkZXZdOwogCWlmICghIGluZm8tPm9wZW5lZCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCmluZGV4IDdhMTU0NWQuLjhjYTJiZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKQEAgLTI2Niw3ICsyNjYsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KGNsaWVudCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKCFjbGllbnQpCisJCXJldHVybiAwOwogCXNuZF9zZXFfZGVsZXRlX2FsbF9wb3J0cyhjbGllbnQpOwogCXNuZF9zZXFfcXVldWVfY2xpZW50X2xlYXZlKGNsaWVudC0+bnVtYmVyKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50c19sb2NrLCBmbGFncyk7CkBAIC00MDMsNyArNDA0LDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBjaGVjayBjbGllbnQgc3RydWN0dXJlcyBhcmUgaW4gcGxhY2UgKi8KLQlzbmRfYXNzZXJ0KGNsaWVudCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY2xpZW50KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWlmICghY2xpZW50LT5hY2NlcHRfaW5wdXQgfHwgKGZpZm8gPSBjbGllbnQtPmRhdGEudXNlci5maWZvKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtODI1LDcgKzgyNyw4IEBACiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQ7CiAJaW50IHJlc3VsdDsKIAotCXNuZF9hc3NlcnQoY2VsbCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNlbGwpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNsaWVudCA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoY2VsbC0+ZXZlbnQuc291cmNlLmNsaWVudCk7CiAJaWYgKGNsaWVudCA9PSBOVUxMKSB7CkBAIC05OTQsNyArOTk3LDggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIGNoZWNrIGNsaWVudCBzdHJ1Y3R1cmVzIGFyZSBpbiBwbGFjZSAqLwotCXNuZF9hc3NlcnQoY2xpZW50ICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjbGllbnQpKQorCQlyZXR1cm4gLUVOWElPOwogCQkKIAlpZiAoIWNsaWVudC0+YWNjZXB0X291dHB1dCB8fCBjbGllbnQtPnBvb2wgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTEwNzYsNyArMTA4MCw4IEBACiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJLyogY2hlY2sgY2xpZW50IHN0cnVjdHVyZXMgYXJlIGluIHBsYWNlICovCi0Jc25kX2Fzc2VydChjbGllbnQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNsaWVudCkpCisJCXJldHVybiAtRU5YSU87CiAKIAlpZiAoKHNuZF9zZXFfZmlsZV9mbGFncyhmaWxlKSAmIFNORFJWX1NFUV9MRkxHX0lOUFVUKSAmJgogCSAgICBjbGllbnQtPmRhdGEudXNlci5maWZvKSB7CkBAIC0yMTk1LDcgKzIyMDAsOCBAQAogewogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0Jc25kX2Fzc2VydChjbGllbnQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNsaWVudCkpCisJCXJldHVybiAtRU5YSU87CiAJCQogCXJldHVybiBzbmRfc2VxX2RvX2lvY3RsKGNsaWVudCwgY21kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKIH0KQEAgLTIyMTYsNyArMjIyMiw4IEBACiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQ7CiAJdmFfbGlzdCBhcmdzOwogCi0Jc25kX2Fzc2VydCghIGluX2ludGVycnVwdCgpLCByZXR1cm4gLUVCVVNZKTsKKwlpZiAoc25kX0JVR19PTihpbl9pbnRlcnJ1cHQoKSkpCisJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoY2FyZCAmJiBjbGllbnRfaW5kZXggPj0gU05EUlZfU0VRX0NMSUVOVFNfUEVSX0NBUkQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI2NSw3ICsyMjcyLDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKnB0cjsKIAotCXNuZF9hc3NlcnQoISBpbl9pbnRlcnJ1cHQoKSwgcmV0dXJuIC1FQlVTWSk7CisJaWYgKHNuZF9CVUdfT04oaW5faW50ZXJydXB0KCkpKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJcHRyID0gY2xpZW50cHRyKGNsaWVudCk7CiAJaWYgKHB0ciA9PSBOVUxMKQpAQCAtMjI4OCw3ICsyMjk2LDggQEAKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7CiAJaW50IHJlc3VsdDsKIAotCXNuZF9hc3NlcnQoZXYgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFldikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGV2LT50eXBlID09IFNORFJWX1NFUV9FVkVOVF9OT05FKQogCQlyZXR1cm4gMDsgLyogaWdub3JlIHRoaXMgKi8KQEAgLTIzNTQsNyArMjM2Myw4IEBACiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwogCWludCByZXN1bHQ7CiAKLQlzbmRfYXNzZXJ0KGV2ICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGZpbGwgaW4gY2xpZW50IG51bWJlciAqLwogCWV2LT5xdWV1ZSA9IFNORFJWX1NFUV9RVUVVRV9ESVJFQ1Q7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMKaW5kZXggOTYyOGMwNi4uMzg2OTNmNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jb21wYXQuYwpAQCAtOTIsNyArOTIsOCBAQAogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gY29tcGF0X3B0cihhcmcpOwogCi0Jc25kX2Fzc2VydChjbGllbnQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNsaWVudCkpCisJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX1BWRVJTSU9OOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCmluZGV4IDA1NDEwZTUuLjFmOTk3NjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKQEAgLTE4Nyw3ICsxODcsOCBAQAogCWlmIChyZXN1bHQpCiAJCSpyZXN1bHQgPSBOVUxMOwogCi0Jc25kX2Fzc2VydChpZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlvcHMgPSBmaW5kX2RyaXZlcihpZCwgMSk7CiAJaWYgKG9wcyA9PSBOVUxMKQpAQCAtMjMyLDcgKzIzMyw4IEBACiB7CiAJc3RydWN0IG9wc19saXN0ICpvcHM7CiAKLQlzbmRfYXNzZXJ0KGRldiAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWRldikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJb3BzID0gZmluZF9kcml2ZXIoZGV2LT5pZCwgMCk7CiAJaWYgKG9wcyA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMKaW5kZXggM2E5NGVkMC4uMGQ3NWFmYSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jCkBAIC02NSw5ICs2NSwxMSBAQAogewogCXN0cnVjdCBzbmRfc2VxX2ZpZm8gKmY7CiAKLQlzbmRfYXNzZXJ0KGZpZm8gIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighZmlmbykpCisJCXJldHVybjsKIAlmID0gKmZpZm87Ci0Jc25kX2Fzc2VydChmICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWYpKQorCQlyZXR1cm47CiAJKmZpZm8gPSBOVUxMOwogCiAJc25kX3NlcV9maWZvX2NsZWFyKGYpOwpAQCAtMTE2LDcgKzExOCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChmICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc25kX3VzZV9sb2NrX3VzZSgmZi0+dXNlX2xvY2spOwogCWVyciA9IHNuZF9zZXFfZXZlbnRfZHVwKGYtPnBvb2wsIGV2ZW50LCAmY2VsbCwgMSwgTlVMTCk7IC8qIGFsd2F5cyBub24tYmxvY2tpbmcgKi8KQEAgLTE3NCw3ICsxNzcsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJd2FpdF9xdWV1ZV90IHdhaXQ7CiAKLQlzbmRfYXNzZXJ0KGYgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqY2VsbHAgPSBOVUxMOwogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKQEAgLTIzMyw3ICsyMzcsOCBAQAogCXN0cnVjdCBzbmRfc2VxX3Bvb2wgKm5ld3Bvb2wsICpvbGRwb29sOwogCXN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwgKmNlbGwsICpuZXh0LCAqb2xkaGVhZDsKIAotCXNuZF9hc3NlcnQoZiAhPSBOVUxMICYmIGYtPnBvb2wgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFmIHx8ICFmLT5wb29sKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBhbGxvY2F0ZSBuZXcgcG9vbCAqLwogCW5ld3Bvb2wgPSBzbmRfc2VxX3Bvb2xfbmV3KHBvb2xzaXplKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwppbmRleCAwY2Y2YWM0Li43ZmI1NTQzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCkBAIC0xODcsOSArMTg3LDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc25kX3NlcV9wb29sICpwb29sOwogCi0Jc25kX2Fzc2VydChjZWxsICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWNlbGwpKQorCQlyZXR1cm47CiAJcG9vbCA9IGNlbGwtPnBvb2w7Ci0Jc25kX2Fzc2VydChwb29sICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXBvb2wpKQorCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwogCWZyZWVfY2VsbChwb29sLCBjZWxsKTsKQEAgLTM3OCw3ICszODAsOCBAQAogCXN0cnVjdCBzbmRfc2VxX2V2ZW50X2NlbGwgKmNlbGxwdHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNuZF9hc3NlcnQocG9vbCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXBvb2wpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocG9vbC0+cHRyKQkJCS8qIHNob3VsZCBiZSBhdG9taWM/ICovCiAJCXJldHVybiAwOwogCkBAIC00MTQsNyArNDE3LDggQEAKIAlzdHJ1Y3Qgc25kX3NlcV9ldmVudF9jZWxsICpwdHI7CiAJaW50IG1heF9jb3VudCA9IDUgKiBIWjsKIAotCXNuZF9hc3NlcnQocG9vbCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXBvb2wpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHdhaXQgZm9yIGNsb3NpbmcgYWxsIHRocmVhZHMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKaW5kZXggOTliMzUzNi4uNGQyNjE0NiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCkBAIC0xMTYsNyArMTE2LDggQEAKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfcnVudGltZSAqcnVudGltZTsKIAlpbnQgdG1wOwogCi0Jc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCB8fCBidWYgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFzdWJzdHJlYW0gfHwgIWJ1ZikpCisJCXJldHVybiAtRUlOVkFMOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaWYgKCh0bXAgPSBydW50aW1lLT5hdmFpbCkgPCBjb3VudCkgewogCQlzbmRfcHJpbnRkKCJ3YXJuaW5nLCBvdXRwdXQgZXZlbnQgd2FzIGxvc3QgKGNvdW50ID0gJWksIGF2YWlsYWJsZSA9ICVpKVxuIiwgY291bnQsIHRtcCk7CkBAIC0xMzUsNyArMTM2LDggQEAKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJaW50IGxlbjsKIAotCXNuZF9hc3NlcnQobXN5bnRoICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighbXN5bnRoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJc3Vic3RyZWFtID0gbXN5bnRoLT5vdXRwdXRfcmZpbGUub3V0cHV0OwogCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMTAsNyArMjEyLDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBzZXFfbWlkaXN5bnRoICptc3ludGggPSBwcml2YXRlX2RhdGE7CiAKLQlzbmRfYXNzZXJ0KG1zeW50aC0+aW5wdXRfcmZpbGUuaW5wdXQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFtc3ludGgtPmlucHV0X3JmaWxlLmlucHV0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJZXJyID0gc25kX3Jhd21pZGlfa2VybmVsX3JlbGVhc2UoJm1zeW50aC0+aW5wdXRfcmZpbGUpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNDcsNyArMjUwLDggQEAKIAlzdHJ1Y3Qgc2VxX21pZGlzeW50aCAqbXN5bnRoID0gcHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGNoYXIgYnVmID0gMHhmZjsgLyogTUlESSByZXNldCAqLwogCi0Jc25kX2Fzc2VydChtc3ludGgtPm91dHB1dF9yZmlsZS5vdXRwdXQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFtc3ludGgtPm91dHB1dF9yZmlsZS5vdXRwdXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBzZW5kaW5nIHNpbmdsZSBNSURJIHJlc2V0IG1lc3NhZ2UgdG8gc2h1dCB0aGUgZGV2aWNlIHVwICovCiAJc25kX3Jhd21pZGlfa2VybmVsX3dyaXRlKG1zeW50aC0+b3V0cHV0X3JmaWxlLm91dHB1dCwgJmJ1ZiwgMSk7CiAJc25kX3Jhd21pZGlfZHJhaW5fb3V0cHV0KG1zeW50aC0+b3V0cHV0X3JmaWxlLm91dHB1dCk7CkBAIC0yODUsNyArMjg5LDggQEAKIAlpbnQgZGV2aWNlID0gZGV2LT5kZXZpY2U7CiAJdW5zaWduZWQgaW50IGlucHV0X2NvdW50ID0gMCwgb3V0cHV0X2NvdW50ID0gMDsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIGRldmljZSA+PSAwICYmIGRldmljZSA8IFNORFJWX1JBV01JRElfREVWSUNFUywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8IGRldmljZSA8IDAgfHwgZGV2aWNlID49IFNORFJWX1JBV01JRElfREVWSUNFUykpCisJCXJldHVybiAtRUlOVkFMOwogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghIGluZm8pCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwppbmRleCAxYzMyYTUzLi4zYmY3ZDczIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwpAQCAtMTMwLDcgKzEzMCw4IEBACiAJaW50IG51bSA9IC0xOwogCQogCS8qIHNhbml0eSBjaGVjayAqLwotCXNuZF9hc3NlcnQoY2xpZW50LCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04oIWNsaWVudCkpCisJCXJldHVybiBOVUxMOwogCiAJaWYgKGNsaWVudC0+bnVtX3BvcnRzID49IFNORFJWX1NFUV9NQVhfUE9SVFMgLSAxKSB7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0b28gbWFueSBwb3J0cyBmb3IgY2xpZW50ICVkXG4iLCBjbGllbnQtPm51bWJlcik7CkBAIC0yNjgsOCArMjY5LDggQEAKIAlpZiAocG9ydC0+cHJpdmF0ZV9mcmVlKQogCQlwb3J0LT5wcml2YXRlX2ZyZWUocG9ydC0+cHJpdmF0ZV9kYXRhKTsKIAotCXNuZF9hc3NlcnQocG9ydC0+Y19zcmMuY291bnQgPT0gMCwpOwotCXNuZF9hc3NlcnQocG9ydC0+Y19kZXN0LmNvdW50ID09IDAsKTsKKwlzbmRfQlVHX09OKHBvcnQtPmNfc3JjLmNvdW50ICE9IDApOworCXNuZF9CVUdfT04ocG9ydC0+Y19kZXN0LmNvdW50ICE9IDApOwogCiAJa2ZyZWUocG9ydCk7CiAJcmV0dXJuIDA7CkBAIC0zMzYsNyArMzM3LDggQEAKIGludCBzbmRfc2VxX3NldF9wb3J0X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKiBwb3J0LAogCQkJICBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKiBpbmZvKQogewotCXNuZF9hc3NlcnQocG9ydCAmJiBpbmZvLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXBvcnQgfHwgIWluZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHNldCBwb3J0IG5hbWUgKi8KIAlpZiAoaW5mby0+bmFtZVswXSkKQEAgLTM2NSw3ICszNjcsOCBAQAogaW50IHNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqIHBvcnQsCiAJCQkgIHN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqIGluZm8pCiB7Ci0Jc25kX2Fzc2VydChwb3J0ICYmIGluZm8sIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcG9ydCB8fCAhaW5mbykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogZ2V0IHBvcnQgbmFtZSAqLwogCXN0cmxjcHkoaW5mby0+bmFtZSwgcG9ydC0+bmFtZSwgc2l6ZW9mKGluZm8tPm5hbWUpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKaW5kZXggODU5NjlkYi4uMDEwMWE4YiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3ByaW9xLmMKQEAgLTE1Myw4ICsxNTMsOCBAQAogCWludCBjb3VudDsKIAlpbnQgcHJpb3I7CiAKLQlzbmRfYXNzZXJ0KGYsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KGNlbGwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZiB8fCAhY2VsbCkpCisJCXJldHVybiAtRUlOVkFMOwogCQogCS8qIGNoZWNrIGZsYWdzICovCiAJcHJpb3IgPSAoY2VsbC0+ZXZlbnQuZmxhZ3MgJiBTTkRSVl9TRVFfUFJJT1JJVFlfTUFTSyk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCmluZGV4IDRhNDhjNmUuLmU3YThlOWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCkBAIC0zMTUsNyArMzE1LDggQEAKIAlpbnQgZGVzdCwgZXJyOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0Jc25kX2Fzc2VydChjZWxsICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighY2VsbCkpCisJCXJldHVybiAtRUlOVkFMOwogCWRlc3QgPSBjZWxsLT5ldmVudC5xdWV1ZTsJLyogZGVzdGluYXRpb24gcXVldWUgKi8KIAlxID0gcXVldWVwdHIoZGVzdCk7CiAJaWYgKHEgPT0gTlVMTCkKQEAgLTczNCw3ICs3MzUsOCBAQAogewogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0Jc25kX2Fzc2VydChldiAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcSA9IHF1ZXVlcHRyKGV2LT5kYXRhLnF1ZXVlLnF1ZXVlKTsKIAogCWlmIChxID09IE5VTEwpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfdGltZXIuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV90aW1lci5jCmluZGV4IGQ4ZmNkNjIuLmY3NDVjMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV90aW1lci5jCkBAIC0xNzMsNyArMTczLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydCh0bXIsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighdG1yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHRlbXBvIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXItPmxvY2ssIGZsYWdzKTsKQEAgLTE5MCw3ICsxOTEsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHRtciwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0bXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocHBxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXItPmxvY2ssIGZsYWdzKTsKQEAgLTIxNCw3ICsyMTYsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHRtciwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0bXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXItPmxvY2ssIGZsYWdzKTsKIAl0bXItPnRpY2suY3VyX3RpY2sgPSBwb3NpdGlvbjsKQEAgLTIyOSw3ICsyMzIsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHRtciwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0bXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNuZF9zZXFfc2FuaXR5X3JlYWxfdGltZSgmcG9zaXRpb24pOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXItPmxvY2ssIGZsYWdzKTsKQEAgLTI0NCw3ICsyNDgsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHRtciwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0bXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEZJWE1FICovCiAJaWYgKGJhc2UgIT0gU0tFV19CQVNFKSB7CkBAIC0yNjUsNyArMjcwLDggQEAKIAlpbnQgZXJyOwogCiAJdG1yID0gcS0+dGltZXI7Ci0Jc25kX2Fzc2VydCh0bXIgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0bXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAodG1yLT50aW1lcmkpCiAJCXJldHVybiAtRUJVU1k7CiAJc3ByaW50ZihzdHIsICJzZXF1ZW5jZXIgcXVldWUgJWkiLCBxLT5xdWV1ZSk7CkBAIC0zMDIsNyArMzA4LDggQEAKIAlzdHJ1Y3Qgc25kX3NlcV90aW1lciAqdG1yOwogCQogCXRtciA9IHEtPnRpbWVyOwotCXNuZF9hc3NlcnQodG1yICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighdG1yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHRtci0+dGltZXJpKSB7CiAJCXNuZF90aW1lcl9zdG9wKHRtci0+dGltZXJpKTsKIAkJc25kX3RpbWVyX2Nsb3NlKHRtci0+dGltZXJpKTsKQEAgLTMyOCw3ICszMzUsOCBAQAogCXVuc2lnbmVkIGxvbmcgZnJlcTsKIAogCXQgPSB0bXItPnRpbWVyaS0+dGltZXI7Ci0Jc25kX2Fzc2VydCh0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZyZXEgPSB0bXItPnByZWZlcnJlZF9yZXNvbHV0aW9uOwogCWlmICghZnJlcSkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2didWYuYyBiL3NvdW5kL2NvcmUvc2didWYuYwppbmRleCBjZWZkMjI4Li5kNDU2NGVkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NnYnVmLmMKKysrIGIvc291bmQvY29yZS9zZ2J1Zi5jCkBAIC00MSw5ICs0MSwxMSBAQAogCXRtcGIuZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CiAJdG1wYi5kZXYuZGV2ID0gc2didWYtPmRldjsKIAlmb3IgKGkgPSAwOyBpIDwgc2didWYtPnBhZ2VzOyBpKyspIHsKKwkJaWYgKCEoc2didWYtPnRhYmxlW2ldLmFkZHIgJiB+UEFHRV9NQVNLKSkKKwkJCWNvbnRpbnVlOyAvKiBjb250aW51b3VzIHBhZ2VzICovCiAJCXRtcGIuYXJlYSA9IHNnYnVmLT50YWJsZVtpXS5idWY7Ci0JCXRtcGIuYWRkciA9IHNnYnVmLT50YWJsZVtpXS5hZGRyOwotCQl0bXBiLmJ5dGVzID0gUEFHRV9TSVpFOworCQl0bXBiLmFkZHIgPSBzZ2J1Zi0+dGFibGVbaV0uYWRkciAmIFBBR0VfTUFTSzsKKwkJdG1wYi5ieXRlcyA9IChzZ2J1Zi0+dGFibGVbaV0uYWRkciAmIH5QQUdFX01BU0spIDw8IFBBR0VfU0hJRlQ7CiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmdG1wYik7CiAJfQogCWlmIChkbWFiLT5hcmVhKQpAQCAtNTgsMTMgKzYwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgTUFYX0FMTE9DX1BBR0VTCQkzMgorCiB2b2lkICpzbmRfbWFsbG9jX3NnYnVmX3BhZ2VzKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKIAkJCSAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiwKIAkJCSAgICAgc2l6ZV90ICpyZXNfc2l6ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWY7Ci0JdW5zaWduZWQgaW50IGksIHBhZ2VzOworCXVuc2lnbmVkIGludCBpLCBwYWdlcywgY2h1bmssIG1heHBhZ2VzOwogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciB0bXBiOworCXN0cnVjdCBzbmRfc2dfcGFnZSAqdGFibGU7CisJc3RydWN0IHBhZ2UgKipwZ3RhYmxlOwogCiAJZG1hYi0+YXJlYSA9IE5VTEw7CiAJZG1hYi0+YWRkciA9IDA7CkBAIC03NCwzMSArODAsNTUgQEAKIAlzZ2J1Zi0+ZGV2ID0gZGV2aWNlOwogCXBhZ2VzID0gc25kX3NnYnVmX2FsaWduZWRfcGFnZXMoc2l6ZSk7CiAJc2didWYtPnRibHNpemUgPSBzZ2J1Zl9hbGlnbl90YWJsZShwYWdlcyk7Ci0Jc2didWYtPnRhYmxlID0ga2NhbGxvYyhzZ2J1Zi0+dGJsc2l6ZSwgc2l6ZW9mKCpzZ2J1Zi0+dGFibGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoISBzZ2J1Zi0+dGFibGUpCisJdGFibGUgPSBrY2FsbG9jKHNnYnVmLT50YmxzaXplLCBzaXplb2YoKnRhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YWJsZSkKIAkJZ290byBfZmFpbGVkOwotCXNnYnVmLT5wYWdlX3RhYmxlID0ga2NhbGxvYyhzZ2J1Zi0+dGJsc2l6ZSwgc2l6ZW9mKCpzZ2J1Zi0+cGFnZV90YWJsZSksIEdGUF9LRVJORUwpOwotCWlmICghIHNnYnVmLT5wYWdlX3RhYmxlKQorCXNnYnVmLT50YWJsZSA9IHRhYmxlOworCXBndGFibGUgPSBrY2FsbG9jKHNnYnVmLT50YmxzaXplLCBzaXplb2YoKnBndGFibGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBndGFibGUpCiAJCWdvdG8gX2ZhaWxlZDsKKwlzZ2J1Zi0+cGFnZV90YWJsZSA9IHBndGFibGU7CiAKLQkvKiBhbGxvY2F0ZSBlYWNoIHBhZ2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgewotCQlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGRldmljZSwgUEFHRV9TSVpFLCAmdG1wYikgPCAwKSB7Ci0JCQlpZiAocmVzX3NpemUgPT0gTlVMTCkKKwkvKiBhbGxvY2F0ZSBwYWdlcyAqLworCW1heHBhZ2VzID0gTUFYX0FMTE9DX1BBR0VTOworCXdoaWxlIChwYWdlcyA+IDApIHsKKwkJY2h1bmsgPSBwYWdlczsKKwkJLyogZG9uJ3QgYmUgdG9vIGVhZ2VyIHRvIHRha2UgYSBodWdlIGNodW5rICovCisJCWlmIChjaHVuayA+IG1heHBhZ2VzKQorCQkJY2h1bmsgPSBtYXhwYWdlczsKKwkJY2h1bmsgPDw9IFBBR0VfU0hJRlQ7CisJCWlmIChzbmRfZG1hX2FsbG9jX3BhZ2VzX2ZhbGxiYWNrKFNORFJWX0RNQV9UWVBFX0RFViwgZGV2aWNlLAorCQkJCQkJIGNodW5rLCAmdG1wYikgPCAwKSB7CisJCQlpZiAoIXNnYnVmLT5wYWdlcykKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmICghcmVzX3NpemUpCiAJCQkJZ290byBfZmFpbGVkOwotCQkJKnJlc19zaXplID0gc2l6ZSA9IHNnYnVmLT5wYWdlcyAqIFBBR0VfU0laRTsKKwkJCXNpemUgPSBzZ2J1Zi0+cGFnZXMgKiBQQUdFX1NJWkU7CiAJCQlicmVhazsKIAkJfQotCQlzZ2J1Zi0+dGFibGVbaV0uYnVmID0gdG1wYi5hcmVhOwotCQlzZ2J1Zi0+dGFibGVbaV0uYWRkciA9IHRtcGIuYWRkcjsKLQkJc2didWYtPnBhZ2VfdGFibGVbaV0gPSB2aXJ0X3RvX3BhZ2UodG1wYi5hcmVhKTsKLQkJc2didWYtPnBhZ2VzKys7CisJCWNodW5rID0gdG1wYi5ieXRlcyA+PiBQQUdFX1NISUZUOworCQlmb3IgKGkgPSAwOyBpIDwgY2h1bms7IGkrKykgeworCQkJdGFibGUtPmJ1ZiA9IHRtcGIuYXJlYTsKKwkJCXRhYmxlLT5hZGRyID0gdG1wYi5hZGRyOworCQkJaWYgKCFpKQorCQkJCXRhYmxlLT5hZGRyIHw9IGNodW5rOyAvKiBtYXJrIGhlYWQgKi8KKwkJCXRhYmxlKys7CisJCQkqcGd0YWJsZSsrID0gdmlydF90b19wYWdlKHRtcGIuYXJlYSk7CisJCQl0bXBiLmFyZWEgKz0gUEFHRV9TSVpFOworCQkJdG1wYi5hZGRyICs9IFBBR0VfU0laRTsKKwkJfQorCQlzZ2J1Zi0+cGFnZXMgKz0gY2h1bms7CisJCXBhZ2VzIC09IGNodW5rOworCQlpZiAoY2h1bmsgPCBtYXhwYWdlcykKKwkJCW1heHBhZ2VzID0gY2h1bms7CiAJfQogCiAJc2didWYtPnNpemUgPSBzaXplOwogCWRtYWItPmFyZWEgPSB2bWFwKHNnYnVmLT5wYWdlX3RhYmxlLCBzZ2J1Zi0+cGFnZXMsIFZNX01BUCwgUEFHRV9LRVJORUwpOwogCWlmICghIGRtYWItPmFyZWEpCiAJCWdvdG8gX2ZhaWxlZDsKKwlpZiAocmVzX3NpemUpCisJCSpyZXNfc2l6ZSA9IHNnYnVmLT5zaXplOwogCXJldHVybiBkbWFiLT5hcmVhOwogCiAgX2ZhaWxlZDoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCAxMDAzYWUzLi40NGE2OWJiIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0zNCw4ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNkZWZpbmUgU05EUlZfT1NfTUlOT1JTIDI1NgotCiBzdGF0aWMgaW50IG1ham9yID0gQ09ORklHX1NORF9NQUpPUjsKIGludCBzbmRfbWFqb3I7CiBFWFBPUlRfU1lNQk9MKHNuZF9tYWpvcik7CkBAIC0yMDgsMjAgKzIwNiwyMyBAQAogCQltaW5vciA9IHR5cGU7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfREVWSUNFX1RZUEVfQ09OVFJPTDoKLQkJc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1pbm9yID0gU05EUlZfTUlOT1IoY2FyZC0+bnVtYmVyLCB0eXBlKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9ERVZJQ0VfVFlQRV9IV0RFUDoKIAljYXNlIFNORFJWX0RFVklDRV9UWVBFX1JBV01JREk6CiAJY2FzZSBTTkRSVl9ERVZJQ0VfVFlQRV9QQ01fUExBWUJBQ0s6CiAJY2FzZSBTTkRSVl9ERVZJQ0VfVFlQRV9QQ01fQ0FQVFVSRToKLQkJc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1pbm9yID0gU05EUlZfTUlOT1IoY2FyZC0+bnVtYmVyLCB0eXBlICsgZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXNuZF9hc3NlcnQobWlub3IgPj0gMCAmJiBtaW5vciA8IFNORFJWX09TX01JTk9SUywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKG1pbm9yIDwgMCB8fCBtaW5vciA+PSBTTkRSVl9PU19NSU5PUlMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gbWlub3I7CiB9CiAjZW5kaWYKQEAgLTI0OSw3ICsyNTAsOCBAQAogCWludCBtaW5vcjsKIAlzdHJ1Y3Qgc25kX21pbm9yICpwcmVnOwogCi0Jc25kX2Fzc2VydChuYW1lLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIW5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlwcmVnID0ga21hbGxvYyhzaXplb2YgKnByZWcsIEdGUF9LRVJORUwpOwogCWlmIChwcmVnID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjcyLDkgKzI3NCw4IEBACiAJCXJldHVybiBtaW5vcjsKIAl9CiAJc25kX21pbm9yc1ttaW5vcl0gPSBwcmVnOwotCXByZWctPmRldiA9IGRldmljZV9jcmVhdGVfZHJ2ZGF0YShzb3VuZF9jbGFzcywgZGV2aWNlLAotCQkJCQkgIE1LREVWKG1ham9yLCBtaW5vciksCi0JCQkJCSAgcHJpdmF0ZV9kYXRhLCAiJXMiLCBuYW1lKTsKKwlwcmVnLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBkZXZpY2UsIE1LREVWKG1ham9yLCBtaW5vciksCisJCQkJICBwcml2YXRlX2RhdGEsICIlcyIsIG5hbWUpOwogCWlmIChJU19FUlIocHJlZy0+ZGV2KSkgewogCQlzbmRfbWlub3JzW21pbm9yXSA9IE5VTEw7CiAJCW11dGV4X3VubG9jaygmc291bmRfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggN2JlNTE1NC4uN2ZlMTIyNiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC02NCw3ICs2NCw4IEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNORFJWX09TU19ERVZJQ0VfVFlQRV9NSVhFUjoKLQkJc25kX2Fzc2VydChjYXJkICE9IE5VTEwgJiYgZGV2IDw9IDEsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgZGV2IDwgMCB8fCBkZXYgPiAxKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQltaW5vciA9IFNORFJWX01JTk9SX09TUyhjYXJkLT5udW1iZXIsIChkZXYgPyBTTkRSVl9NSU5PUl9PU1NfTUlYRVIxIDogU05EUlZfTUlOT1JfT1NTX01JWEVSKSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfT1NTX0RFVklDRV9UWVBFX1NFUVVFTkNFUjoKQEAgLTc0LDExICs3NSwxMyBAQAogCQltaW5vciA9IFNORFJWX01JTk9SX09TU19NVVNJQzsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9PU1NfREVWSUNFX1RZUEVfUENNOgotCQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCAmJiBkZXYgPD0gMSwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoc25kX0JVR19PTighY2FyZCB8fCBkZXYgPCAwIHx8IGRldiA+IDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1pbm9yID0gU05EUlZfTUlOT1JfT1NTKGNhcmQtPm51bWJlciwgKGRldiA/IFNORFJWX01JTk9SX09TU19QQ00xIDogU05EUlZfTUlOT1JfT1NTX1BDTSkpOwogCQlicmVhazsKIAljYXNlIFNORFJWX09TU19ERVZJQ0VfVFlQRV9NSURJOgotCQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCAmJiBkZXYgPD0gMSwgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoc25kX0JVR19PTighY2FyZCB8fCBkZXYgPCAwIHx8IGRldiA+IDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1pbm9yID0gU05EUlZfTUlOT1JfT1NTKGNhcmQtPm51bWJlciwgKGRldiA/IFNORFJWX01JTk9SX09TU19NSURJMSA6IFNORFJWX01JTk9SX09TU19NSURJKSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfT1NTX0RFVklDRV9UWVBFX0RNRk06CkBAIC05MCw3ICs5Myw4IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXNuZF9hc3NlcnQobWlub3IgPj0gMCAmJiBtaW5vciA8IFNORFJWX09TU19NSU5PUlMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihtaW5vciA8IDAgfHwgbWlub3IgPj0gU05EUlZfT1NTX01JTk9SUykpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBtaW5vcjsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IDBhZjMzN2UuLmU1ODJmYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3RpbWVyLmMKQEAgLTMwNiw3ICszMDYsOCBAQAogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICpzbGF2ZSwgKnRtcDsKIAotCXNuZF9hc3NlcnQodGltZXJpICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCF0aW1lcmkpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJLyogZm9yY2UgdG8gc3RvcCB0aGUgdGltZXIgKi8KIAlzbmRfdGltZXJfc3RvcCh0aW1lcmkpOwpAQCAtMzg1LDggKzM4Niw5IEBACiAJCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ0c3RhbXApOwogCWVsc2UKIAkJZ2V0bnN0aW1lb2ZkYXkoJnRzdGFtcCk7Ci0Jc25kX2Fzc2VydChldmVudCA+PSBTTkRSVl9USU1FUl9FVkVOVF9TVEFSVCAmJgotCQkgICBldmVudCA8PSBTTkRSVl9USU1FUl9FVkVOVF9QQVVTRSwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihldmVudCA8IFNORFJWX1RJTUVSX0VWRU5UX1NUQVJUIHx8CisJCSAgICAgICBldmVudCA+IFNORFJWX1RJTUVSX0VWRU5UX1BBVVNFKSkKKwkJcmV0dXJuOwogCWlmIChldmVudCA9PSBTTkRSVl9USU1FUl9FVkVOVF9TVEFSVCB8fAogCSAgICBldmVudCA9PSBTTkRSVl9USU1FUl9FVkVOVF9DT05USU5VRSkKIAkJcmVzb2x1dGlvbiA9IHNuZF90aW1lcl9yZXNvbHV0aW9uKHRpKTsKQEAgLTQ3NCw3ICs0NzYsOCBAQAogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KHRpbWVyaSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighdGltZXJpKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWlmICh0aW1lcmktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19TTEFWRSkgewogCQlpZiAoIWtlZXBfZmxhZykgewpAQCAtNzU4LDkgKzc2MSwxMCBAQAogCQkuZGV2X2Rpc2Nvbm5lY3QgPSBzbmRfdGltZXJfZGV2X2Rpc2Nvbm5lY3QsCiAJfTsKIAotCXNuZF9hc3NlcnQodGlkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KHJ0aW1lciAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0JKnJ0aW1lciA9IE5VTEw7CisJaWYgKHNuZF9CVUdfT04oIXRpZCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChydGltZXIpCisJCSpydGltZXIgPSBOVUxMOwogCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRpbWVyID09IE5VTEwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZXI6IGNhbm5vdCBhbGxvY2F0ZVxuIik7CkBAIC03ODgsMTMgKzc5MiwxNSBAQAogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KLQkqcnRpbWVyID0gdGltZXI7CisJaWYgKHJ0aW1lcikKKwkJKnJ0aW1lciA9IHRpbWVyOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF90aW1lcl9mcmVlKHN0cnVjdCBzbmRfdGltZXIgKnRpbWVyKQogewotCXNuZF9hc3NlcnQodGltZXIgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKCF0aW1lcikKKwkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJaWYgKCEgbGlzdF9lbXB0eSgmdGltZXItPm9wZW5fbGlzdF9oZWFkKSkgewpAQCAtODI3LDggKzgzMyw4IEBACiAJc3RydWN0IHNuZF90aW1lciAqdGltZXIgPSBkZXYtPmRldmljZV9kYXRhOwogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyMTsKIAotCXNuZF9hc3NlcnQodGltZXIgIT0gTlVMTCAmJiB0aW1lci0+aHcuc3RhcnQgIT0gTlVMTCAmJgotCQkgICB0aW1lci0+aHcuc3RvcCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighdGltZXIgfHwgIXRpbWVyLT5ody5zdGFydCB8fCAhdGltZXItPmh3LnN0b3ApKQorCQlyZXR1cm4gLUVOWElPOwogCWlmICghKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKSAmJgogCSAgICAhdGltZXItPmh3LnJlc29sdXRpb24gJiYgdGltZXItPmh3LmNfcmVzb2x1dGlvbiA9PSBOVUxMKQogCSAgICAJcmV0dXJuIC1FSU5WQUw7CkBAIC04NzksOCArODg1LDkgQEAKIAogCWlmICghICh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19TTEFWRSkpCiAJCXJldHVybjsKLQlzbmRfYXNzZXJ0KGV2ZW50ID49IFNORFJWX1RJTUVSX0VWRU5UX01TVEFSVCAmJgotCQkgICBldmVudCA8PSBTTkRSVl9USU1FUl9FVkVOVF9NUkVTVU1FLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKGV2ZW50IDwgU05EUlZfVElNRVJfRVZFTlRfTVNUQVJUIHx8CisJCSAgICAgICBldmVudCA+IFNORFJWX1RJTUVSX0VWRU5UX01SRVNVTUUpKQorCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyLT5sb2NrLCBmbGFncyk7CiAJaWYgKGV2ZW50ID09IFNORFJWX1RJTUVSX0VWRU5UX01TVEFSVCB8fAogCSAgICBldmVudCA9PSBTTkRSVl9USU1FUl9FVkVOVF9NQ09OVElOVUUgfHwKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdGltZXJfY29tcGF0LmMgYi9zb3VuZC9jb3JlL3RpbWVyX2NvbXBhdC5jCmluZGV4IDU1MTJmNTMuLmUwNTgwMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXJfY29tcGF0LmMKKysrIGIvc291bmQvY29yZS90aW1lcl9jb21wYXQuYwpAQCAtNDAsOSArNDAsMTEgQEAKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0OwogCiAJdHUgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydCh0dS0+dGltZXJpICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCF0dS0+dGltZXJpKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAl0ID0gdHUtPnRpbWVyaS0+dGltZXI7Ci0Jc25kX2Fzc2VydCh0ICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCF0KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CiAJaW5mby5jYXJkID0gdC0+Y2FyZCA/IHQtPmNhcmQtPm51bWJlciA6IC0xOwogCWlmICh0LT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKQpAQCAtNzEsNyArNzMsOCBAQAogCXN0cnVjdCBzbmRfdGltZXJfc3RhdHVzIHN0YXR1czsKIAkKIAl0dSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KHR1LT50aW1lcmkgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXR1LT50aW1lcmkpKQorCQlyZXR1cm4gLUVOWElPOwogCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RhdHVzKSk7CiAJc3RhdHVzLnRzdGFtcCA9IHR1LT50c3RhbXA7CiAJc3RhdHVzLnJlc29sdXRpb24gPSBzbmRfdGltZXJfcmVzb2x1dGlvbih0dS0+dGltZXJpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwppbmRleCA0ZTRjNjllLi5lNWU3NDlmIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMKKysrIGIvc291bmQvZHJpdmVycy9kdW1teS5jCkBAIC00Nyw5ICs0NywxMSBAQAogc3RhdGljIGludCBlbXUxMGsxX3BsYXliYWNrX2NvbnN0cmFpbnRzKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCiB7CiAJaW50IGVycjsKLQlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQorCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgMjU2LCBVSU5UX01BWCkpIDwgMCkKKwllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIDI1NiwgVUlOVF9NQVgpOworCWlmIChlcnIpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlyZXR1cm4gMDsKIH0KQEAgLTM1NCw2ICszNTYsNyBAQAogCWlmICgoZHBjbSA9IG5ld19wY21fc3RyZWFtKHN1YnN0cmVhbSkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGRwY207CisJLyogbWFrZXMgdGhlIGluZnJhc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGRwY20gKi8KIAlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9kdW1teV9ydW50aW1lX2ZyZWU7CiAJcnVudGltZS0+aHcgPSBzbmRfY2FyZF9kdW1teV9wbGF5YmFjazsKIAlpZiAoc3Vic3RyZWFtLT5wY20tPmRldmljZSAmIDEpIHsKQEAgLTM2MiwxMCArMzY1LDkgQEAKIAl9CiAJaWYgKHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UgJiAyKQogCQlydW50aW1lLT5ody5pbmZvICY9IH4oU05EUlZfUENNX0lORk9fTU1BUHxTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKTsKLQlpZiAoKGVyciA9IGFkZF9wbGF5YmFja19jb25zdHJhaW50cyhydW50aW1lKSkgPCAwKSB7Ci0JCWtmcmVlKGRwY20pOworCWVyciA9IGFkZF9wbGF5YmFja19jb25zdHJhaW50cyhydW50aW1lKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3OSw2ICszODEsNyBAQAogCWlmICgoZHBjbSA9IG5ld19wY21fc3RyZWFtKHN1YnN0cmVhbSkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGRwY207CisJLyogbWFrZXMgdGhlIGluZnJhc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGRwY20gKi8KIAlydW50aW1lLT5wcml2YXRlX2ZyZWUgPSBzbmRfY2FyZF9kdW1teV9ydW50aW1lX2ZyZWU7CiAJcnVudGltZS0+aHcgPSBzbmRfY2FyZF9kdW1teV9jYXB0dXJlOwogCWlmIChzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlID09IDEpIHsKQEAgLTM4NywxMCArMzkwLDkgQEAKIAl9CiAJaWYgKHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UgJiAyKQogCQlydW50aW1lLT5ody5pbmZvICY9IH4oU05EUlZfUENNX0lORk9fTU1BUHxTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKTsKLQlpZiAoKGVyciA9IGFkZF9jYXB0dXJlX2NvbnN0cmFpbnRzKHJ1bnRpbWUpKSA8IDApIHsKLQkJa2ZyZWUoZHBjbSk7CisJZXJyID0gYWRkX2NhcHR1cmVfY29uc3RyYWludHMocnVudGltZSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC00MzMsOCArNDM1LDkgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGR1bW15LT5jYXJkLCAiRHVtbXkgUENNIiwgZGV2aWNlLAotCQkJICAgICAgIHN1YnN0cmVhbXMsIHN1YnN0cmVhbXMsICZwY20pKSA8IDApCisJZXJyID0gc25kX3BjbV9uZXcoZHVtbXktPmNhcmQsICJEdW1teSBQQ00iLCBkZXZpY2UsCisJCQkgICAgICAgc3Vic3RyZWFtcywgc3Vic3RyZWFtcywgJnBjbSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZHVtbXktPnBjbSA9IHBjbTsKIAlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2NhcmRfZHVtbXlfcGxheWJhY2tfb3BzKTsKQEAgLTU2NSwxMiArNTY4LDE0IEBACiAJdW5zaWduZWQgaW50IGlkeDsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChkdW1teSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWR1bW15KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJc3Bpbl9sb2NrX2luaXQoJmR1bW15LT5taXhlcl9sb2NrKTsKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiRHVtbXkgTWl4ZXIiKTsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfZHVtbXlfY29udHJvbHMpOyBpZHgrKykgewotCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2R1bW15X2NvbnRyb2xzW2lkeF0sIGR1bW15KSkpIDwgMCkKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZHVtbXlfY29udHJvbHNbaWR4XSwgZHVtbXkpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gMDsKQEAgLTU5NCwxMCArNTk5LDEyIEBACiAJCQlwY21fc3Vic3RyZWFtc1tkZXZdID0gMTsKIAkJaWYgKHBjbV9zdWJzdHJlYW1zW2Rldl0gPiBNQVhfUENNX1NVQlNUUkVBTVMpCiAJCQlwY21fc3Vic3RyZWFtc1tkZXZdID0gTUFYX1BDTV9TVUJTVFJFQU1TOwotCQlpZiAoKGVyciA9IHNuZF9jYXJkX2R1bW15X3BjbShkdW1teSwgaWR4LCBwY21fc3Vic3RyZWFtc1tkZXZdKSkgPCAwKQorCQllcnIgPSBzbmRfY2FyZF9kdW1teV9wY20oZHVtbXksIGlkeCwgcGNtX3N1YnN0cmVhbXNbZGV2XSk7CisJCWlmIChlcnIgPCAwKQogCQkJZ290byBfX25vZGV2OwogCX0KLQlpZiAoKGVyciA9IHNuZF9jYXJkX2R1bW15X25ld19taXhlcihkdW1teSkpIDwgMCkKKwllcnIgPSBzbmRfY2FyZF9kdW1teV9uZXdfbWl4ZXIoZHVtbXkpOworCWlmIChlcnIgPCAwKQogCQlnb3RvIF9fbm9kZXY7CiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkR1bW15Iik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIkR1bW15Iik7CkBAIC02MDUsNyArNjEyLDggQEAKIAogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpID09IDApIHsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyID09IDApIHsKIAkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjY4LDcgKzY3Niw4IEBACiB7CiAJaW50IGksIGNhcmRzLCBlcnI7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX2R1bW15X2RyaXZlcikpIDwgMCkKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9kdW1teV9kcml2ZXIpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJY2FyZHMgPSAwOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tdHBhdi5jIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCmluZGV4IGI1ZTFhNzEuLjViODljMDg4IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210cGF2LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCkBAIC03MTUsNiArNzE1LDEwIEBACiAKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfbXRwYXZfZnJlZTsKIAorCWVyciA9IHNuZF9tdHBhdl9nZXRfUkFXTUlESShtdHBfY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX19lcnJvcjsKKwogCWVyciA9IHNuZF9tdHBhdl9nZXRfSVNBKG10cF9jYXJkKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBfX2Vycm9yOwpAQCAtNzI0LDEwICs3MjgsNiBAQAogCXNucHJpbnRmKGNhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+bG9uZ25hbWUpLAogCQkgIk1UUEFWIG9uIHBhcmFsbGVsIHBvcnQgYXQgMHglbHgiLCBwb3J0KTsKIAotCWVyciA9IHNuZF9tdHBhdl9nZXRfUkFXTUlESShtdHBfY2FyZCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gX19lcnJvcjsKLQogCXNuZF9tdHBhdl9wb3J0c2NhbihtdHBfY2FyZCk7CiAKIAlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPmRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCmluZGV4IGViZTQzNTkuLjc4MDU4MjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jCkBAIC0xMzksNyArMTM5LDggQEAKIAkJICogSWYgd2UgaGFkIGFuIE9QTDQgY2hpcCwgb3BsMy0+aGFyZHdhcmUgd291bGQgaGF2ZSBiZWVuIHNldAogCQkgKiBieSB0aGUgT1BMNCBkcml2ZXI7IHNvIHdlIGNhbiBhc3N1bWUgT1BMMyBoZXJlLgogCQkgKi8KLQkJc25kX2Fzc2VydChvcGwzLT5yX3BvcnQgIT0gMCwgcmV0dXJuIC1FTk9ERVYpOworCQlpZiAoc25kX0JVR19PTighb3BsMy0+cl9wb3J0KSkKKwkJCXJldHVybiAtRU5PREVWOwogCQlvcGwzLT5oYXJkd2FyZSA9IE9QTDNfSFdfT1BMMzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zMjQsNyArMzI1LDggQEAKIAogc3RhdGljIGludCBzbmRfb3BsM19mcmVlKHN0cnVjdCBzbmRfb3BsMyAqb3BsMykKIHsKLQlzbmRfYXNzZXJ0KG9wbDMgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIW9wbDMpKQorCQlyZXR1cm4gLUVOWElPOwogCWlmIChvcGwzLT5wcml2YXRlX2ZyZWUpCiAJCW9wbDMtPnByaXZhdGVfZnJlZShvcGwzKTsKIAlzbmRfb3BsM19jbGVhcl9wYXRjaGVzKG9wbDMpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbWlkaS5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbWlkaS5jCmluZGV4IGNlYmNiOGIuLjE2ZmVhZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX21pZGkuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19taWRpLmMKQEAgLTYxNyw3ICs2MTcsOCBAQAogCiAJc3RydWN0IHNuZF9vcGwzX3ZvaWNlICp2cCwgKnZwMjsKIAotCXNuZF9hc3NlcnQodm9pY2UgPCBNQVhfT1BMM19WT0lDRVMsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04odm9pY2UgPj0gTUFYX09QTDNfVk9JQ0VTKSkKKwkJcmV0dXJuOwogCiAJdnAgPSAmb3BsMy0+dm9pY2VzW3ZvaWNlXTsKIAlpZiAodm9pY2UgPCBNQVhfT1BMMl9WT0lDRVMpIHsKQEAgLTczNyw3ICs3MzgsOCBAQAogCiAJc3RydWN0IHNuZF9vcGwzX3ZvaWNlICp2cDsKIAotCXNuZF9hc3NlcnQodm9pY2UgPCBNQVhfT1BMM19WT0lDRVMsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04odm9pY2UgPj0gTUFYX09QTDNfVk9JQ0VTKSkKKwkJcmV0dXJuOwogCiAJdnAgPSAmb3BsMy0+dm9pY2VzW3ZvaWNlXTsKIAlpZiAodnAtPmNoYW4gPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKaW5kZXggMjM5MzQ3Zi4uOWEyMjcxZCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKQEAgLTE2Miw3ICsxNjIsOCBAQAogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMyA9IGNsb3N1cmU7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoYXJnICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFhcmcpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJaWYgKChlcnIgPSBzbmRfb3BsM19zeW50aF9zZXR1cChvcGwzKSkgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTg0LDcgKzE4NSw4IEBACiB7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCi0Jc25kX2Fzc2VydChhcmcgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWFyZykpCisJCXJldHVybiAtRU5YSU87CiAJb3BsMyA9IGFyZy0+cHJpdmF0ZV9kYXRhOwogCiAJc25kX29wbDNfc3ludGhfY2xlYW51cChvcGwzKTsKQEAgLTIwNiw3ICsyMDgsOCBAQAogCWNoYXIgbmFtZVszMl07CiAJaW50IGVyciwgdHlwZTsKIAotCXNuZF9hc3NlcnQoYXJnICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFhcmcpKQorCQlyZXR1cm4gLUVOWElPOwogCW9wbDMgPSBhcmctPnByaXZhdGVfZGF0YTsKIAogCWlmIChmb3JtYXQgPT0gRk1fUEFUQ0gpCkBAIC0yNDYsNyArMjQ5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKLQlzbmRfYXNzZXJ0KGFyZyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighYXJnKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlvcGwzID0gYXJnLT5wcml2YXRlX2RhdGE7CiAJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBTTkRDVExfRk1fTE9BRF9JTlNUUjoKQEAgLTI3MSw3ICsyNzUsOCBAQAogewogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAotCXNuZF9hc3NlcnQoYXJnICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFhcmcpKQorCQlyZXR1cm4gLUVOWElPOwogCW9wbDMgPSBhcmctPnByaXZhdGVfZGF0YTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKaW5kZXggZmI2NGM4OS4uOTYyYmI5YyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCkBAIC05Miw3ICs5Miw4IEBACiAJc3RydWN0IHNuZF9vcGwzICpvcGwzID0gaHctPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAotCXNuZF9hc3NlcnQob3BsMyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIW9wbDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN3aXRjaCAoY21kKSB7CiAJCS8qIGdldCBpbmZvcm1hdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc3ludGguYyBiL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3N5bnRoLmMKaW5kZXggNzRmNmU1My4uNDliOWUyNCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc3ludGguYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9zeW50aC5jCkBAIC00NjcsNyArNDY3LDcgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJm9wbDQtPm9mZl92b2ljZXMpKQogCQlyZXR1cm4gbGlzdF9lbnRyeShvcGw0LT5vZmZfdm9pY2VzLm5leHQsIHN0cnVjdCBvcGw0X3ZvaWNlLCBsaXN0KTsKIAkvKiB0aGVuIGdldCB0aGUgb2xkZXN0IGtleS1vbiB2b2ljZSAqLwotCXNuZF9hc3NlcnQoIWxpc3RfZW1wdHkoJm9wbDQtPm9uX3ZvaWNlcyksICk7CisJc25kX0JVR19PTihsaXN0X2VtcHR5KCZvcGw0LT5vbl92b2ljZXMpKTsKIAlyZXR1cm4gbGlzdF9lbnRyeShvcGw0LT5vbl92b2ljZXMubmV4dCwgc3RydWN0IG9wbDRfdm9pY2UsIGxpc3QpOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NtZC5jIGIvc291bmQvZHJpdmVycy92eC92eF9jbWQuYwppbmRleCA5NTI5ZTNiLi4yM2Y0ODU3IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NtZC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfY21kLmMKQEAgLTk5LDcgKzk5LDggQEAKICAqLwogdm9pZCB2eF9pbml0X3JtaChzdHJ1Y3Qgdnhfcm1oICpybWgsIHVuc2lnbmVkIGludCBjbWQpCiB7Ci0Jc25kX2Fzc2VydChjbWQgPCBDTURfTEFTVF9JTkRFWCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihjbWQgPj0gQ01EX0xBU1RfSU5ERVgpKQorCQlyZXR1cm47CiAJcm1oLT5MZ0NtZCA9IHZ4X2RzcF9jbWRzW2NtZF0ubGVuZ3RoOwogCXJtaC0+TGdTdGF0ID0gdnhfZHNwX2NtZHNbY21kXS5zdF9sZW5ndGg7CiAJcm1oLT5Ec3BTdGF0ID0gdnhfZHNwX2NtZHNbY21kXS5zdF90eXBlOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9jb3JlLmMgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NvcmUuYwppbmRleCA1ODVhZjJlLi40NzNiMDdmIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NvcmUuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NvcmUuYwpAQCAtMjA1LDcgKzIwNSw4IEBACiAKIAlpZiAoc2l6ZSA8IDEpCiAJCXJldHVybiAwOwotCXNuZF9hc3NlcnQoc2l6ZSA8PSBTSVpFX01BWF9TVEFUVVMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihzaXplID4gU0laRV9NQVhfU1RBVFVTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAxOyBpIDw9IHNpemU7IGkrKykgewogCQkvKiB0cmlnZ2VyIGFuIGlycSBNRVNTX1dSSVRFX05FWFQgKi8KQEAgLTQyNSwxMyArNDI2LDE2IEBACiAJaW50IG5vX2ZpbGx1cCA9IHZ4X2hhc19uZXdfZHNwKGNoaXApOwogCiAJLyogY2hlY2sgdGhlIGxlbmd0aCBvZiBib290IGltYWdlICovCi0Jc25kX2Fzc2VydChib290LT5zaXplID4gMCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoYm9vdC0+c2l6ZSAlIDMgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChib290LT5zaXplIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChib290LT5zaXplICUgMykKKwkJcmV0dXJuIC1FSU5WQUw7CiAjaWYgMAogCXsKIAkJLyogbW9yZSBzdHJpY3QgY2hlY2sgKi8KIAkJdW5zaWduZWQgaW50IGMgPSAoKHUzMilib290LT5kYXRhWzBdIDw8IDE2KSB8ICgodTMyKWJvb3QtPmRhdGFbMV0gPDwgOCkgfCBib290LT5kYXRhWzJdOwotCQlzbmRfYXNzZXJ0KGJvb3QtPnNpemUgPT0gKGMgKyAyKSAqIDMsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKGJvb3QtPnNpemUgIT0gKGMgKyAyKSAqIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAjZW5kaWYKIApAQCAtNTU0LDcgKzU1OCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHZ4X3Jlc2V0X2JvYXJkKHN0cnVjdCB2eF9jb3JlICpjaGlwLCBpbnQgY29sZF9yZXNldCkKIHsKLQlzbmRfYXNzZXJ0KGNoaXAtPm9wcy0+cmVzZXRfYm9hcmQsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAtPm9wcy0+cmVzZXRfYm9hcmQpKQorCQlyZXR1cm47CiAKIAkvKiBjdXJyZW50IHNvdXJjZSwgbGF0ZXIgc3luYydlZCB3aXRoIHRhcmdldCAqLwogCWNoaXAtPmF1ZGlvX3NvdXJjZSA9IFZYX0FVRElPX1NSQ19MSU5FOwpAQCAtNjczLDcgKzY3OCw4IEBACiAJdW5zaWduZWQgaW50IGNzdW0gPSAwOwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmltYWdlLCAqY3B0cjsKIAotCXNuZF9hc3NlcnQoZHNwLT5zaXplICUgMyA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKGRzcC0+c2l6ZSAlIDMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdnhfdG9nZ2xlX2RhY19tdXRlKGNoaXAsIDEpOwogCkBAIC03NzUsNyArNzgxLDggQEAKIHsKIAlzdHJ1Y3QgdnhfY29yZSAqY2hpcDsKIAotCXNuZF9hc3NlcnQoY2FyZCAmJiBodyAmJiBvcHMsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhaHcgfHwgIW9wcykpCisJCXJldHVybiBOVUxMOwogCiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSArIGV4dHJhX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghIGNoaXApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYwppbmRleCBlZmQyMmU5Li44ZDYzNjJlIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMKKysrIGIvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jCkBAIC0xNDEsNyArMTQxLDggQEAKIAl9OwogCXN0cnVjdCB2eF9jb3JlICp2eCA9IGh3LT5wcml2YXRlX2RhdGE7CiAKLQlzbmRfYXNzZXJ0KHR5cGVfaWRzW3Z4LT50eXBlXSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0eXBlX2lkc1t2eC0+dHlwZV0pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzdHJjcHkoaW5mby0+aWQsIHR5cGVfaWRzW3Z4LT50eXBlXSk7CiAJaWYgKHZ4X2lzX3BjbWNpYSh2eCkpCiAJCWluZm8tPm51bV9kc3BzID0gNDsKQEAgLTE2OCw3ICsxNjksOCBAQAogCWludCBpbmRleCwgZXJyOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAKLQlzbmRfYXNzZXJ0KHZ4LT5vcHMtPmxvYWRfZHNwLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighdngtPm9wcy0+bG9hZF9kc3ApKQorCQlyZXR1cm4gLUVOWElPOwogCiAJZncgPSBrbWFsbG9jKHNpemVvZigqZncpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISBmdykgewpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jIGIvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jCmluZGV4IDVhMzQ3MzIuLmM3MWI4ZDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfbWl4ZXIuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X21peGVyLmMKQEAgLTM0LDcgKzM0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChjaGlwLT5vcHMtPndyaXRlX2NvZGVjLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFjaGlwLT5vcHMtPndyaXRlX2NvZGVjKSkKKwkJcmV0dXJuOwogCiAJaWYgKGNoaXAtPmNoaXBfc3RhdHVzICYgVlhfU1RBVF9JU19TVEFMRSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9wY20uYyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfcGNtLmMKaW5kZXggZmRiZjg2NS4uMjdkZTU3NCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF9wY20uYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X3BjbS5jCkBAIC01ODcsNyArNTg3LDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWF1ZGlvID0gc3Vicy0+cGNtLT5kZXZpY2UgKiAyOwotCXNuZF9hc3NlcnQoYXVkaW8gPCBjaGlwLT5hdWRpb19vdXRzLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oYXVkaW8gPj0gY2hpcC0+YXVkaW9fb3V0cykpCisJCXJldHVybiAtRUlOVkFMOwogCQogCS8qIHBsYXliYWNrIHBpcGUgbWF5IGhhdmUgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCBmb3IgbW9uaXRvcmluZyAqLwogCXBpcGUgPSBjaGlwLT5wbGF5YmFja19waXBlc1thdWRpb107CkBAIC05OTYsNyArOTk3LDggQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWF1ZGlvID0gc3Vicy0+cGNtLT5kZXZpY2UgKiAyOwotCXNuZF9hc3NlcnQoYXVkaW8gPCBjaGlwLT5hdWRpb19pbnMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihhdWRpbyA+PSBjaGlwLT5hdWRpb19pbnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAllcnIgPSB2eF9hbGxvY19waXBlKGNoaXAsIDEsIGF1ZGlvLCAyLCAmcGlwZSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0xMjE0LDcgKzEyMTYsOCBAQAogCQkJfQogCQkJaWYgKGNhcHR1cmUpCiAJCQkJY29udGludWU7Ci0JCQlzbmRfYXNzZXJ0KHAgPj0gMCAmJiAodW5zaWduZWQgaW50KXAgPCBjaGlwLT5hdWRpb19vdXRzLCk7CisJCQlpZiAoc25kX0JVR19PTihwIDwgMCB8fCBwID49IGNoaXAtPmF1ZGlvX291dHMpKQorCQkJCWNvbnRpbnVlOwogCQkJcGlwZSA9IGNoaXAtPnBsYXliYWNrX3BpcGVzW3BdOwogCQkJaWYgKHBpcGUgJiYgcGlwZS0+c3Vic3RyZWFtKSB7CiAJCQkJdnhfcGNtX3BsYXliYWNrX3VwZGF0ZShjaGlwLCBwaXBlLT5zdWJzdHJlYW0sIHBpcGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF91ZXIuYyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfdWVyLmMKaW5kZXggZmI4OTMyYS4uMGUxYmE5YiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF91ZXIuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X3Vlci5jCkBAIC0xNjMsMTMgKzE2MywxNSBAQAogewogCWludCBoZXhmcmVxOwogCi0Jc25kX2Fzc2VydChmcmVxID4gMCwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKGZyZXEgPD0gMCkpCisJCXJldHVybiAwOwogCiAJaGV4ZnJlcSA9ICgyODIyNDAwMCAqIDEwKSAvIGZyZXE7CiAJaGV4ZnJlcSA9IChoZXhmcmVxICsgNSkgLyAxMDsKIAogCS8qIG1heCBmcmVxID0gNTUxMjUgSHogKi8KLQlzbmRfYXNzZXJ0KGhleGZyZXEgPiAweDAwMDAwMjAwLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oaGV4ZnJlcSA8PSAweDAwMDAwMjAwKSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAoaGV4ZnJlcSA8PSAweDAzZmYpCiAJCXJldHVybiBoZXhmcmVxIC0gMHgwMDAwMDIwMTsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9jczg0MjcuYyBiL3NvdW5kL2kyYy9jczg0MjcuYwppbmRleCA5YzNkMzYxLi4wMjBhNWQ1IDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvY3M4NDI3LmMKKysrIGIvc291bmQvaTJjL2NzODQyNy5jCkBAIC0zMTQsNyArMzE0LDggQEAKIAl1bnNpZ25lZCBsb25nIGVuZF90aW1lOwogCWludCBkYXRhLCBhZXMzaW5wdXQgPSAwOwogCi0Jc25kX2Fzc2VydChjczg0MjcsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWNzODQyNykpCisJCXJldHVybjsKIAljaGlwID0gY3M4NDI3LT5wcml2YXRlX2RhdGE7CiAJc25kX2kyY19sb2NrKGNzODQyNy0+YnVzKTsKIAlpZiAoKGNoaXAtPnJlZ21hcFtDUzg0MjdfUkVHX0NMT0NLU09VUkNFXSAmIENTODQyN19SWERBRVMzSU5QVVQpID09CkBAIC01MjYsNyArNTI3LDggQEAKIAl1bnNpZ25lZCBpbnQgaWR4OwogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KHBsYXlfc3Vic3RyZWFtICYmIGNhcF9zdWJzdHJlYW0sIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcGxheV9zdWJzdHJlYW0gfHwgIWNhcF9zdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NzODQyN19pZWM5NThfY29udHJvbHMpOyBpZHgrKykgewogCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfY3M4NDI3X2llYzk1OF9jb250cm9sc1tpZHhdLCBjczg0MjcpOwogCQlpZiAoa2N0bCA9PSBOVUxMKQpAQCAtNTQzLDcgKzU0NSw4IEBACiAKIAljaGlwLT5wbGF5YmFjay5zdWJzdHJlYW0gPSBwbGF5X3N1YnN0cmVhbTsKIAljaGlwLT5jYXB0dXJlLnN1YnN0cmVhbSA9IGNhcF9zdWJzdHJlYW07Ci0Jc25kX2Fzc2VydChjaGlwLT5wbGF5YmFjay5wY21fY3RsLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAtPnBsYXliYWNrLnBjbV9jdGwpKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTUzLDcgKzU1Niw4IEBACiB7CiAJc3RydWN0IGNzODQyNyAqY2hpcDsKIAotCXNuZF9hc3NlcnQoY3M4NDI3LCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY3M4NDI3KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAljaGlwID0gY3M4NDI3LT5wcml2YXRlX2RhdGE7CiAJaWYgKGFjdGl2ZSkKIAkJbWVtY3B5KGNoaXAtPnBsYXliYWNrLnBjbV9zdGF0dXMsCkBAIC01NzMsNyArNTc3LDggQEAKIAljaGFyICpzdGF0dXM7CiAJaW50IGVyciwgcmVzZXQ7CiAKLQlzbmRfYXNzZXJ0KGNzODQyNywgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNzODQyNykpCisJCXJldHVybiAtRU5YSU87CiAJY2hpcCA9IGNzODQyNy0+cHJpdmF0ZV9kYXRhOwogCXN0YXR1cyA9IGNoaXAtPnBsYXliYWNrLnBjbV9zdGF0dXM7CiAJc25kX2kyY19sb2NrKGNzODQyNy0+YnVzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9pMmMuYyBiL3NvdW5kL2kyYy9pMmMuYwppbmRleCBiMWU3NGU0Li41YzBjNzdkIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvaTJjLmMKKysrIGIvc291bmQvaTJjL2kyYy5jCkBAIC00OSw3ICs0OSw4IEBACiAJc3RydWN0IHNuZF9pMmNfYnVzICpzbGF2ZTsKIAlzdHJ1Y3Qgc25kX2kyY19kZXZpY2UgKmRldmljZTsKIAotCXNuZF9hc3NlcnQoYnVzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighYnVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZidXMtPmRldmljZXMpKSB7CiAJCWRldmljZSA9IHNuZF9pMmNfZGV2aWNlKGJ1cy0+ZGV2aWNlcy5uZXh0KTsKIAkJc25kX2kyY19kZXZpY2VfZnJlZShkZXZpY2UpOwpAQCAtMTEzLDcgKzExNCw4IEBACiAJc3RydWN0IHNuZF9pMmNfZGV2aWNlICpkZXZpY2U7CiAKIAkqcmRldmljZSA9IE5VTEw7Ci0Jc25kX2Fzc2VydChidXMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFidXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlkZXZpY2UgPSBremFsbG9jKHNpemVvZigqZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldmljZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9sMy91ZGExMzQxLmMgYi9zb3VuZC9pMmMvbDMvdWRhMTM0MS5jCmluZGV4IDFmNDk0MmUuLjk4NDBlYjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9sMy91ZGExMzQxLmMKKysrIGIvc291bmQvaTJjL2wzL3VkYTEzNDEuYwpAQCAtNzcxLDcgKzc3MSw4IEBACiAJc3RydWN0IGwzX2NsaWVudCAqY2xudDsKIAlpbnQgaWR4LCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljbG50ID0ga3phbGxvYyhzaXplb2YoKmNsbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xudCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCmluZGV4IGQyMGQ4OTNiLi4wMzQxNDUxIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCkBAIC00NzUsNyArNDc1LDggQEAKIAl1bnNpZ25lZCBpbnQgaWR4OwogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGNhcF9zdWJzdHJlYW0sIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighY2FwX3N1YnN0cmVhbSkpCisJCXJldHVybiAtRUlOVkFMOwogCWFrNDExNC0+cGxheWJhY2tfc3Vic3RyZWFtID0gcGx5X3N1YnN0cmVhbTsKIAlhazQxMTQtPmNhcHR1cmVfc3Vic3RyZWFtID0gY2FwX3N1YnN0cmVhbTsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFLNDExNF9DT05UUk9MUzsgaWR4KyspIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwppbmRleCBmMzUwODM1Li4yY2FkMmQ2IDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNy5jCkBAIC00MzEsNyArNDMxLDggQEAKIAl1bnNpZ25lZCBpbnQgaWR4OwogCWludCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGNhcF9zdWJzdHJlYW0sIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighY2FwX3N1YnN0cmVhbSkpCisJCXJldHVybiAtRUlOVkFMOwogCWFrNDExNy0+c3Vic3RyZWFtID0gY2FwX3N1YnN0cmVhbTsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFLNDExN19DT05UUk9MUzsgaWR4KyspIHsKIAkJa2N0bCA9IHNuZF9jdGxfbmV3MSgmc25kX2FrNDExN19pZWM5NThfY29udHJvbHNbaWR4XSwgYWs0MTE3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jIGIvc291bmQvaTJjL290aGVyL2FrNHh4eC1hZGRhLmMKaW5kZXggMjg4OTI2ZC4uZWU0N2FiYSAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNHh4eC1hZGRhLmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNHh4eC1hZGRhLmMKQEAgLTIzMyw4ICsyMzMsOCBAQAogCQkweDAxLCAweDAyLCAvKiAxOiByZXNldCBhbmQgc29mdC1tdXRlICovCiAJCTB4MDAsIDB4MDYsIC8qIDA6IG1vZGUzKGkycyksIGRpc2FibGUgYXV0by1jbG9jayBkZXRlY3QsCiAJCQkgICAgICogZGlzYWJsZSBEWkYsIHNoYXJwIHJvbGwtb2ZmLCBSU1ROIz0wICovCi0JCTB4MDIsIDB4MGUsIC8qIDI6IERBJ3MgcG93ZXIgdXAsIG5vcm1hbCBzcGVlZCwgUlNUTiM9MCAqLwotCQkvLyAweDAyLCAweDJlLCAvKiBxdWFkIHNwZWVkICovCisJCTB4MDIsIDB4NGUsIC8qIDI6IERBJ3MgcG93ZXIgdXAsIG5vcm1hbCBzcGVlZCwgUlNUTiM9MCAqLworCQkvKiAweDAyLCAweDZlLCovIC8qIHF1YWQgc3BlZWQgKi8KIAkJMHgwMywgMHgwMSwgLyogMzogZGUtZW1waGFzaXMgb2ZmICovCiAJCTB4MDQsIDB4MDAsIC8qIDQ6IExPVVQxIHZvbHVtZSBtdXRlZCAqLwogCQkweDA1LCAweDAwLCAvKiA1OiBST1VUMSB2b2x1bWUgbXV0ZWQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMgYi9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCmluZGV4IDgzZTkwMDUuLmMxM2ExNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKKysrIGIvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYwpAQCAtODcsOCArODcsNyBAQAogc3RhdGljIGludCBzbmRfdGVhNTc1eF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAl2b2lkIF9fdXNlciAqYXJnID0gKHZvaWQgX191c2VyICopZGF0YTsKIAkKIAlzd2l0Y2goY21kKSB7CkBAIC0xNzUsNiArMTc0LDIxIEBACiB7CiB9CiAKK3N0YXRpYyBpbnQgc25kX3RlYTU3NXhfZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnRlYS0+aW5fdXNlKSA/IC1FQlVTWSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3RlYTU3NXhfZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJY2xlYXJfYml0KDAsICZ0ZWEtPmluX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBpbml0aWFsaXplIGFsbCB0aGUgdGVhNTc1eCBjaGlwcwogICovCkBAIC0xOTMsOSArMjA3LDEwIEBACiAJdGVhLT52ZC5yZWxlYXNlID0gc25kX3RlYTU3NXhfcmVsZWFzZTsKIAl2aWRlb19zZXRfZHJ2ZGF0YSgmdGVhLT52ZCwgdGVhKTsKIAl0ZWEtPnZkLmZvcHMgPSAmdGVhLT5mb3BzOworCXRlYS0+aW5fdXNlID0gMDsKIAl0ZWEtPmZvcHMub3duZXIgPSB0ZWEtPmNhcmQtPm1vZHVsZTsKLQl0ZWEtPmZvcHMub3BlbiA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuOwotCXRlYS0+Zm9wcy5yZWxlYXNlID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2U7CisJdGVhLT5mb3BzLm9wZW4gPSBzbmRfdGVhNTc1eF9leGNsdXNpdmVfb3BlbjsKKwl0ZWEtPmZvcHMucmVsZWFzZSA9IHNuZF90ZWE1NzV4X2V4Y2x1c2l2ZV9yZWxlYXNlOwogCXRlYS0+Zm9wcy5pb2N0bCA9IHNuZF90ZWE1NzV4X2lvY3RsOwogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnRlYS0+dmQsIFZGTF9UWVBFX1JBRElPLCB0ZWEtPmRldl9uciAtIDEpIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgdGVhNTc1eCB0dW5lclxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvS2NvbmZpZyBiL3NvdW5kL2lzYS9LY29uZmlnCmluZGV4IDU3NjlhMTMuLjY2MGJlYjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9LY29uZmlnCisrKyBiL3NvdW5kL2lzYS9LY29uZmlnCkBAIC0xLDEwICsxLDYgQEAKICMgQUxTQSBJU0EgZHJpdmVycwogCi1jb25maWcgU05EX0FEMTg0OF9MSUIKLSAgICAgICAgdHJpc3RhdGUKLSAgICAgICAgc2VsZWN0IFNORF9QQ00KLQotY29uZmlnIFNORF9DUzQyMzFfTElCCitjb25maWcgU05EX1dTU19MSUIKICAgICAgICAgdHJpc3RhdGUKICAgICAgICAgc2VsZWN0IFNORF9QQ00KIApAQCAtNTUsNyArNTEsNyBAQAogCiBjb25maWcgU05EX0FEMTg0OAogCXRyaXN0YXRlICJHZW5lcmljIEFEMTg0OC9DUzQyNDggZHJpdmVyIgotCXNlbGVjdCBTTkRfQUQxODQ4X0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBRDE4NDggKEFuYWxvZyBEZXZpY2VzKSBvcgogCSAgQ1M0MjQ4IChDaXJydXMgTG9naWMgLSBDcnlzdGFsIFNlbWljb25kdWN0b3JzKSBjaGlwcy4KQEAgLTg2LDcgKzgyLDcgQEAKIAlzZWxlY3QgSVNBUE5QCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKLQlzZWxlY3QgU05EX0NTNDIzMV9MSUIKKwlzZWxlY3QgU05EX1dTU19MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiB0aGUKIAkgIEF6dGVjaCBTeXN0ZW1zIEFaVDIzMjAgY2hpcC4KQEAgLTk2LDcgKzkyLDcgQEAKIAogY29uZmlnIFNORF9DTUk4MzMwCiAJdHJpc3RhdGUgIkMtTWVkaWEgQ01JODMzMCIKLQlzZWxlY3QgU05EX0FEMTg0OF9MSUIKKwlzZWxlY3QgU05EX1dTU19MSUIKIAlzZWxlY3QgU05EX1NCMTZfRFNQCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gdGhlCkBAIC0xMDgsNyArMTA0LDcgQEAKIGNvbmZpZyBTTkRfQ1M0MjMxCiAJdHJpc3RhdGUgIkdlbmVyaWMgQ2lycnVzIExvZ2ljIENTNDIzMSBkcml2ZXIiCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAotCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBDUzQyMzEgY2hpcHMgZnJvbSBDaXJydXMKIAkgIExvZ2ljIC0gQ3J5c3RhbCBTZW1pY29uZHVjdG9ycy4KQEAgLTEyMCw3ICsxMTYsNyBAQAogCXRyaXN0YXRlICJHZW5lcmljIENpcnJ1cyBMb2dpYyBDUzQyMzIgZHJpdmVyIgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIENTNDIzMiBjaGlwcyBmcm9tIENpcnJ1cwogCSAgTG9naWMgLSBDcnlzdGFsIFNlbWljb25kdWN0b3JzLgpAQCAtMTMyLDcgKzEyOCw3IEBACiAJdHJpc3RhdGUgIkdlbmVyaWMgQ2lycnVzIExvZ2ljIENTNDIzNisgZHJpdmVyIgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJaGVscAogCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBDUzQyMzUsQ1M0MjM2LENTNDIzN0IsQ1M0MjM4QiwKIAkgIENTNDIzOSBjaGlwcyBmcm9tIENpcnJ1cyBMb2dpYyAtIENyeXN0YWwgU2VtaWNvbmR1Y3RvcnMuCkBAIC0xOTIsNyArMTg4LDcgQEAKIGNvbmZpZyBTTkRfU0M2MDAwCiAJdHJpc3RhdGUgIkdhbGxhbnQgU0MtNjAwMCwgQXVkaW8gRXhjZWwgRFNQIDE2IgogCWRlcGVuZHMgb24gSEFTX0lPUE9SVAotCXNlbGVjdCBTTkRfQUQxODQ4X0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJaGVscApAQCAtMjI4LDcgKzIyNCw3IEBACiBjb25maWcgU05EX0dVU01BWAogCXRyaXN0YXRlICJHcmF2aXMgVWx0cmFTb3VuZCBNQVgiCiAJc2VsZWN0IFNORF9SQVdNSURJCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEdyYXZpcyBVbHRyYVNvdW5kIE1BWAogCSAgc291bmRjYXJkcy4KQEAgLTI0MCw3ICsyMzYsNyBAQAogCXRyaXN0YXRlICJBTUQgSW50ZXJXYXZlLCBHcmF2aXMgVWx0cmFTb3VuZCBQblAiCiAJZGVwZW5kcyBvbiBQTlAKIAlzZWxlY3QgU05EX1JBV01JREkKLQlzZWxlY3QgU05EX0NTNDIzMV9MSUIKKwlzZWxlY3QgU05EX1dTU19MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQU1EIEludGVyV2F2ZSBiYXNlZAogCSAgc291bmRjYXJkcyAoR3JhdmlzIFVsdHJhU291bmQgUGx1ZyAmIFBsYXksIFNUQiBTb3VuZFJhZ2UzMiwKQEAgLTI1Myw3ICsyNDksNyBAQAogCXRyaXN0YXRlICJBTUQgSW50ZXJXYXZlICsgVEVBNjMzMFQgKFVsdHJhU291bmQgMzItUHJvKSIKIAlkZXBlbmRzIG9uIFBOUAogCXNlbGVjdCBTTkRfUkFXTUlESQotCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBTUQgSW50ZXJXYXZlIGJhc2VkCiAJICBzb3VuZGNhcmRzIHdpdGggYSBURUE2MzMwVCBiYXNzIGFuZCB0cmVibGUgcmVndWxhdG9yCkBAIC0yNjYsNyArMjYyLDcgQEAKIAl0cmlzdGF0ZSAiWWFtYWhhIE9QTDMtU0EyL1NBMyIKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAotCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBZYW1haGEgT1BMMy1TQTIgYW5kIE9QTDMtU0EzCiAJICBjaGlwcy4KQEAgLTI3OSw3ICsyNzUsNyBAQAogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX09QTDRfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAotCXNlbGVjdCBTTkRfQUQxODQ4X0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBzb3VuZGNhcmRzIGJhc2VkIG9uIE9wdGkKIAkgIDgyQzkyeCBvciBPVEktNjAxIGNoaXBzIGFuZCB1c2luZyBhbiBBRDE4NDggY29kZWMuCkBAIC0yOTIsNyArMjg4LDcgQEAKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9PUEw0X0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKLQlzZWxlY3QgU05EX0NTNDIzMV9MSUIKKwlzZWxlY3QgU05EX1dTU19MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiBPcHRpCiAJICA4MkM5MnggY2hpcHMgYW5kIHVzaW5nIGEgQ1M0MjMxIGNvZGVjLgpAQCAtMzA0LDcgKzMwMCw3IEBACiAJdHJpc3RhdGUgIk9QVGkgODJDOTN4IgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kY2FyZHMgYmFzZWQgb24gT3B0aQogCSAgODJDOTN4IGNoaXBzLgpAQCAtMzE1LDcgKzMxMSw3IEBACiBjb25maWcgU05EX01JUk8KIAl0cmlzdGF0ZSAiTWlybyBtaXJvU09VTkQgUENNMXByby9QQ00xMi9QQ00yMHJhZGlvIGRyaXZlciIKIAlzZWxlY3QgU05EX09QTDRfTElCCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfUENNCiAJaGVscApAQCAtMzY0LDcgKzM2MCw3IEBACiBjb25maWcgU05EX1NCMTZfQ1NQCiAJYm9vbCAiU291bmQgQmxhc3RlciAxNi9BV0UgQ1NQIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoU05EX1NCMTYgfHwgU05EX1NCQVdFKSAmJiAoQlJPS0VOIHx8ICFQUEMpCi0Jc2VsZWN0IEZXX0xPQURFUiBpZiAhU05EX1NCMTZfQ1NQX0ZJUk1XQVJFX0lOX0tFUk5FTAorCXNlbGVjdCBGV19MT0FERVIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIENTUCBjb3JlLiAgVGhpcyBzcGVjaWFsCiAJICBjb3Byb2Nlc3NvciBjYW4gZG8gdmFyaWFibGUgdGFza3MgbGlrZSB2YXJpb3VzIGNvbXByZXNzaW9uIGFuZApAQCAtMzcyLDcgKzM2OCw3IEBACiAKIGNvbmZpZyBTTkRfU0dBTEFYWQogCXRyaXN0YXRlICJBenRlY2ggU291bmQgR2FsYXh5IgotCXNlbGVjdCBTTkRfQUQxODQ4X0xJQgorCXNlbGVjdCBTTkRfV1NTX0xJQgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBenRlY2ggU291bmQgR2FsYXh5CiAJICBzb3VuZGNhcmRzLgpAQCAtMzg0LDcgKzM4MCw3IEBACiAJdHJpc3RhdGUgIkVuc29uaXEgU291bmRTY2FwZSBQblAgZHJpdmVyIgogCXNlbGVjdCBTTkRfSFdERVAKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCi0Jc2VsZWN0IFNORF9DUzQyMzFfTElCCisJc2VsZWN0IFNORF9XU1NfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVuc29uaXEgU291bmRTY2FwZSBQblAKIAkgIHNvdW5kY2FyZHMuCkBAIC0zOTcsNyArMzkzLDcgQEAKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKLQlzZWxlY3QgU05EX0NTNDIzMV9MSUIKKwlzZWxlY3QgU05EX1dTU19MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIE1hdWksIFRyb3BlegogCSAgYW5kIFRyb3Bleisgc291bmRjYXJkcyBiYXNlZCBvbiB0aGUgV2F2ZWZyb250IGNoaXAuCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvTWFrZWZpbGUgYi9zb3VuZC9pc2EvTWFrZWZpbGUKaW5kZXggYzBjZTdkYi4uNjNhZjEzZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL01ha2VmaWxlCisrKyBiL3NvdW5kL2lzYS9NYWtlZmlsZQpAQCAtMjcsNCArMjcsNCBAQAogb2JqLSQoQ09ORklHX1NORF9TU0NBUEUpICs9IHNuZC1zc2NhcGUubwogCiBvYmotJChDT05GSUdfU05EKSArPSBhZDE4MTZhLyBhZDE4NDgvIGNzNDIzeC8gZXMxNjg4LyBndXMvIG9wdGk5eHgvIFwKLQkJICAgICBzYi8gd2F2ZWZyb250LworCQkgICAgIHNiLyB3YXZlZnJvbnQvIHdzcy8KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCA2OGYxMjYwLi43NzUyNDI0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC04Myw4ICs4MywxMCBAQAogCXsgLmlkID0gIk1ESzE2MDUiLCAuZGV2cyA9IHsgeyAuaWQgPSAiQURTNzE4MCIgfSwgeyAuaWQgPSAiQURTNzE4MSIgfSB9IH0sCiAJLyogU2hhcmsgUHJlZGF0b3IgSVNBIC0gYWRkZWQgYnkgS2VuIEFycm9tZGVlICovCiAJeyAuaWQgPSAiU01NNzE4MCIsIC5kZXZzID0geyB7IC5pZCA9ICJBRFM3MTgwIiB9LCB7IC5pZCA9ICJBRFM3MTgxIiB9IH0gfSwKLQkvKiBBbmFsb2cgRGV2aWNlcyBBRDE4MTZBIC0gVGVycmF0ZWMgQXVkaW9TeXN0ZW0gRVdTNjRTICovCisJLyogQW5hbG9nIERldmljZXMgQUQxODE2QSAtIFRlcnJhdGVjIEF1ZGlvU3lzdGVtIEVXUzY0IFMgKi8KIAl7IC5pZCA9ICJURVIxMTEyIiwgLmRldnMgPSB7IHsgLmlkID0gIkFEUzcxODAiIH0sIHsgLmlkID0gIkFEUzcxODEiIH0gfSB9LAorCS8qIEFuYWxvZyBEZXZpY2VzIEFEMTgxNkEgLSBUZXJyYXRlYyBBdWRpb1N5c3RlbSBFV1M2NCBTICovCisJeyAuaWQgPSAiVEVSMTExMiIsIC5kZXZzID0geyB7IC5pZCA9ICJURVIxMTAwIiB9LCB7IC5pZCA9ICJURVIxMTAxIiB9IH0gfSwKIAkvKiBBbmFsb2cgRGV2aWNlcyBBRDE4MTZBIC0gVGVycmF0ZWMgQmFzZSA2NCAqLwogCXsgLmlkID0gIlRFUjE0MTEiLCAuZGV2cyA9IHsgeyAuaWQgPSAiQURTNzE4MCIgfSwgeyAuaWQgPSAiQURTNzE4MSIgfSB9IH0sCiAJLyogZW5kICovCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYwppbmRleCA0YjhkZmUyLi4zYmZjYTdjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCisrKyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKQEAgLTM5NCw3ICszOTQsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbmRfYWQxODE2YV90aW1lcl9yZXNvbHV0aW9uKHN0cnVjdCBzbmRfdGltZXIgKnRpbWVyKQogewotCXNuZF9hc3NlcnQodGltZXIgIT0gTlVMTCwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCF0aW1lcikpCisJCXJldHVybiAwOwogCiAJcmV0dXJuIDEwMDAwOwogfQpAQCAtOTYxLDcgKzk2Miw4IEBACiAJdW5zaWduZWQgaW50IGlkeDsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChjaGlwICE9IE5VTEwgJiYgY2hpcC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhcmQgPSBjaGlwLT5jYXJkOwogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODQ4L01ha2VmaWxlIGIvc291bmQvaXNhL2FkMTg0OC9NYWtlZmlsZQppbmRleCBhZTIzMzMxLi4zZDZkZWEzIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODQ4L01ha2VmaWxlCisrKyBiL3NvdW5kL2lzYS9hZDE4NDgvTWFrZWZpbGUKQEAgLTMsMTAgKzMsOCBAQAogIyBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KICMKIAotc25kLWFkMTg0OC1saWItb2JqcyA6PSBhZDE4NDhfbGliLm8KIHNuZC1hZDE4NDgtb2JqcyA6PSBhZDE4NDgubwogCiAjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CiBvYmotJChDT05GSUdfU05EX0FEMTg0OCkgKz0gc25kLWFkMTg0OC5vCi1vYmotJChDT05GSUdfU05EX0FEMTg0OF9MSUIpICs9IHNuZC1hZDE4NDgtbGliLm8KIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKaW5kZXggNWY1MjcxZS4uYjY4ZDIwZSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYworKysgYi9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2FkMTg0OC5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2RlZmluZSBDUkRfTkFNRSAiR2VuZXJpYyBBRDE4NDgvQUQxODQ3L0NTNDI0OCIKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hZDE4NDhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXA7CisJc3RydWN0IHNuZF93c3MgKmNoaXA7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgZXJyb3I7CiAKQEAgLTk1LDE4ICs5NSwxOSBAQAogCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnJvciA9IHNuZF9hZDE4NDhfY3JlYXRlKGNhcmQsIHBvcnRbbl0sIGlycVtuXSwgZG1hMVtuXSwKLQkJCXRoaW5rcGFkW25dID8gQUQxODQ4X0hXX1RISU5LUEFEIDogQUQxODQ4X0hXX0RFVEVDVCwgJmNoaXApOworCWVycm9yID0gc25kX3dzc19jcmVhdGUoY2FyZCwgcG9ydFtuXSwgLTEsIGlycVtuXSwgZG1hMVtuXSwgLTEsCisJCQl0aGlua3BhZFtuXSA/IFdTU19IV19USElOS1BBRCA6IFdTU19IV19ERVRFQ1QsCisJCQkwLCAmY2hpcCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0JZXJyb3IgPSBzbmRfYWQxODQ4X3BjbShjaGlwLCAwLCAmcGNtKTsKKwllcnJvciA9IHNuZF93c3NfcGNtKGNoaXAsIDAsICZwY20pOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBzbmRfYWQxODQ4X21peGVyKGNoaXApOworCWVycm9yID0gc25kX3dzc19taXhlcihjaGlwKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTQyLDcgKzE0Myw3IEBACiBzdGF0aWMgaW50IHNuZF9hZDE4NDhfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CiAJY2hpcC0+c3VzcGVuZChjaGlwKTsKQEAgLTE1Miw3ICsxNTMsNyBAQAogc3RhdGljIGludCBzbmRfYWQxODQ4X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJY2hpcC0+cmVzdW1lKGNoaXApOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMGM5MGYuLjAwMDAwMDAKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY3ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgotICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIEFEMTg0OC9BRDE4NDcvQ1M0MjQ4Ci0gKgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKi8KLQotI2RlZmluZSBTTkRSVl9NQUlOX09CSkVDVF9GSUxFCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9hZDE4NDguaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotCi1NT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBBRDE4NDgvQUQxODQ3L0NTNDI0OCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jaWYgMAotI2RlZmluZSBTTkRSVl9ERUJVR19NQ0UKLSNlbmRpZgotCi0vKgotICogIFNvbWUgdmFyaWFibGVzCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZnJlcV9iaXRzWzE0XSA9IHsKLQkvKiA1NTEwICovCTB4MDAgfCBBRDE4NDhfWFRBTDIsCi0JLyogNjYyMCAqLwkweDBFIHwgQUQxODQ4X1hUQUwyLAotCS8qIDgwMDAgKi8JMHgwMCB8IEFEMTg0OF9YVEFMMSwKLQkvKiA5NjAwICovCTB4MEUgfCBBRDE4NDhfWFRBTDEsCi0JLyogMTEwMjUgKi8JMHgwMiB8IEFEMTg0OF9YVEFMMiwKLQkvKiAxNjAwMCAqLwkweDAyIHwgQUQxODQ4X1hUQUwxLAotCS8qIDE4OTAwICovCTB4MDQgfCBBRDE4NDhfWFRBTDIsCi0JLyogMjIwNTAgKi8JMHgwNiB8IEFEMTg0OF9YVEFMMiwKLQkvKiAyNzA0MiAqLwkweDA0IHwgQUQxODQ4X1hUQUwxLAotCS8qIDMyMDAwICovCTB4MDYgfCBBRDE4NDhfWFRBTDEsCi0JLyogMzMwNzUgKi8JMHgwQyB8IEFEMTg0OF9YVEFMMiwKLQkvKiAzNzgwMCAqLwkweDA4IHwgQUQxODQ4X1hUQUwyLAotCS8qIDQ0MTAwICovCTB4MEEgfCBBRDE4NDhfWFRBTDIsCi0JLyogNDgwMDAgKi8JMHgwQyB8IEFEMTg0OF9YVEFMMQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1sxNF0gPSB7Ci0JNTUxMCwgNjYyMCwgODAwMCwgOTYwMCwgMTEwMjUsIDE2MDAwLCAxODkwMCwgMjIwNTAsCi0JMjcwNDIsIDMyMDAwLCAzMzA3NSwgMzc4MDAsIDQ0MTAwLCA0ODAwMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19yYXRlcyA9IHsKLQkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzKSwKLQkubGlzdCA9IHJhdGVzLAotCS5tYXNrID0gMCwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9hZDE4NDhfb3JpZ2luYWxfaW1hZ2VbMTZdID0KLXsKLQkweDAwLAkJCS8qIDAwIC0gbGljICovCi0JMHgwMCwJCQkvKiAwMSAtIHJpYyAqLwotCTB4OWYsCQkJLyogMDIgLSBsYTFpYyAqLwotCTB4OWYsCQkJLyogMDMgLSByYTFpYyAqLwotCTB4OWYsCQkJLyogMDQgLSBsYTJpYyAqLwotCTB4OWYsCQkJLyogMDUgLSByYTJpYyAqLwotCTB4YmYsCQkJLyogMDYgLSBsb2MgKi8KLQkweGJmLAkJCS8qIDA3IC0gcm9jICovCi0JMHgyMCwJCQkvKiAwOCAtIGRmciAqLwotCUFEMTg0OF9BVVRPQ0FMSUIsCS8qIDA5IC0gaWMgKi8KLQkweDAwLAkJCS8qIDBhIC0gcGMgKi8KLQkweDAwLAkJCS8qIDBiIC0gdGkgKi8KLQkweDAwLAkJCS8qIDBjIC0gbWkgKi8KLQkweDAwLAkJCS8qIDBkIC0gbGJjICovCi0JMHgwMCwJCQkvKiAwZSAtIGRydSAqLwotCTB4MDAsCQkJLyogMGYgLSBkcmwgKi8KLX07Ci0KLS8qCi0gKiAgQmFzaWMgSS9PIGZ1bmN0aW9ucwotICovCi0KLXN0YXRpYyB2b2lkIHNuZF9hZDE4NDhfd2FpdChzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQlpbnQgdGltZW91dDsKLQotCWZvciAodGltZW91dCA9IDI1MDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgewotCQlpZiAoKGluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpICYgQUQxODQ4X0lOSVQpID09IDApCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwMCk7Ci0JfQotfQotCi12b2lkIHNuZF9hZDE4NDhfb3V0KHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLAotCQkJICAgdW5zaWduZWQgY2hhciByZWcsCi0JCQkgICB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCXNuZF9hZDE4NDhfd2FpdChjaGlwKTsKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JaWYgKGluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpICYgQUQxODQ4X0lOSVQpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0IC0gIgotCQkJICAgInJlZyA9IDB4JXgsIHZhbHVlID0gMHgleFxuIiwgcmVnLCB2YWx1ZSk7Ci0jZW5kaWYKLQlvdXRiKGNoaXAtPm1jZV9iaXQgfCByZWcsIEFEMTg0OFAoY2hpcCwgUkVHU0VMKSk7Ci0Jb3V0YihjaGlwLT5pbWFnZVtyZWddID0gdmFsdWUsIEFEMTg0OFAoY2hpcCwgUkVHKSk7Ci0JbWIoKTsKLQlzbmRfcHJpbnRkZCgiY29kZWMgb3V0IC0gcmVnIDB4JXggPSAweCV4XG4iLAotCQkJY2hpcC0+bWNlX2JpdCB8IHJlZywgdmFsdWUpOwotfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9hZDE4NDhfb3V0KTsKLQotc3RhdGljIHZvaWQgc25kX2FkMTg0OF9kb3V0KHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCXNuZF9hZDE4NDhfd2FpdChjaGlwKTsKLQlvdXRiKGNoaXAtPm1jZV9iaXQgfCByZWcsIEFEMTg0OFAoY2hpcCwgUkVHU0VMKSk7Ci0Jb3V0Yih2YWx1ZSwgQUQxODQ4UChjaGlwLCBSRUcpKTsKLQltYigpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbmRfYWQxODQ4X2luKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZykKLXsKLQlzbmRfYWQxODQ4X3dhaXQoY2hpcCk7Ci0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCWlmIChpbmIoQUQxODQ4UChjaGlwLCBSRUdTRUwpKSAmIEFEMTg0OF9JTklUKQotCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYXV0byBjYWxpYnJhdGlvbiB0aW1lIG91dCAtICIKLQkJCSAgICJyZWcgPSAweCV4XG4iLCByZWcpOwotI2VuZGlmCi0Jb3V0YihjaGlwLT5tY2VfYml0IHwgcmVnLCBBRDE4NDhQKGNoaXAsIFJFR1NFTCkpOwotCW1iKCk7Ci0JcmV0dXJuIGluYihBRDE4NDhQKGNoaXAsIFJFRykpOwotfQotCi0jaWYgMAotCi1zdGF0aWMgdm9pZCBzbmRfYWQxODQ4X2RlYnVnKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQotewotCXByaW50aygiQUQxODQ4IFJFR1M6ICAgICAgSU5ERVggPSAweCUwMnggICIsIGluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpKTsKLQlwcmludGsoIiAgICAgICAgICAgICAgICAgU1RBVFVTID0gMHglMDJ4XG4iLCBpbmIoQUQxODQ4UChjaGlwLCBTVEFUVVMpKSk7Ci0JcHJpbnRrKCIgIDB4MDA6IGxlZnQgaW5wdXQgICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDAwKSk7Ci0JcHJpbnRrKCIgIDB4MDg6IHBsYXliYWNrIGZvcm1hdCA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA4KSk7Ci0JcHJpbnRrKCIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDAxKSk7Ci0JcHJpbnRrKCIgIDB4MDk6IGlmYWNlIChDRklHIDEpICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA5KSk7Ci0JcHJpbnRrKCIgIDB4MDI6IEFVWEEgbGVmdCAgICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDAyKSk7Ci0JcHJpbnRrKCIgIDB4MGE6IHBpbiBjb250cm9sICAgICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBhKSk7Ci0JcHJpbnRrKCIgIDB4MDM6IEFVWEEgcmlnaHQgICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDAzKSk7Ci0JcHJpbnRrKCIgIDB4MGI6IGluaXQgJiBzdGF0dXMgICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBiKSk7Ci0JcHJpbnRrKCIgIDB4MDQ6IEFVWEIgbGVmdCAgICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA0KSk7Ci0JcHJpbnRrKCIgIDB4MGM6IHJldmlzaW9uICYgbW9kZSA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBjKSk7Ci0JcHJpbnRrKCIgIDB4MDU6IEFVWEIgcmlnaHQgICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA1KSk7Ci0JcHJpbnRrKCIgIDB4MGQ6IGxvb3BiYWNrICAgICAgICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBkKSk7Ci0JcHJpbnRrKCIgIDB4MDY6IGxlZnQgb3V0cHV0ICAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA2KSk7Ci0JcHJpbnRrKCIgIDB4MGU6IGRhdGEgdXByIGNvdW50ICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBlKSk7Ci0JcHJpbnRrKCIgIDB4MDc6IHJpZ2h0IG91dHB1dCAgICA9IDB4JTAyeCAgIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDA3KSk7Ci0JcHJpbnRrKCIgIDB4MGY6IGRhdGEgbHdyIGNvdW50ICA9IDB4JTAyeFxuIiwgc25kX2FkMTg0OF9pbihjaGlwLCAweDBmKSk7Ci19Ci0KLSNlbmRpZgotCi0vKgotICogIEFEMTg0OCBkZXRlY3Rpb24gLyBNQ0Ugcm91dGluZXMKLSAqLwotCi1zdGF0aWMgdm9pZCBzbmRfYWQxODQ4X21jZV91cChzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB0aW1lb3V0OwotCi0Jc25kX2FkMTg0OF93YWl0KGNoaXApOwotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlpZiAoaW5iKEFEMTg0OFAoY2hpcCwgUkVHU0VMKSkgJiBBRDE4NDhfSU5JVCkKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm1jZV91cCAtIGF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgKDApXG4iKTsKLSNlbmRpZgotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWNoaXAtPm1jZV9iaXQgfD0gQUQxODQ4X01DRTsKLQl0aW1lb3V0ID0gaW5iKEFEMTg0OFAoY2hpcCwgUkVHU0VMKSk7Ci0JaWYgKHRpbWVvdXQgPT0gMHg4MCkKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm1jZV91cCBbMHglbHhdOiBzZXJpb3VzIGluaXQgcHJvYmxlbSAtIGNvZGVjIHN0aWxsIGJ1c3lcbiIsIGNoaXAtPnBvcnQpOwotCWlmICghKHRpbWVvdXQgJiBBRDE4NDhfTUNFKSkKLQkJb3V0YihjaGlwLT5tY2VfYml0IHwgKHRpbWVvdXQgJiAweDFmKSwgQUQxODQ4UChjaGlwLCBSRUdTRUwpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzbmRfYWQxODQ4X21jZV9kb3duKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRpbWVvdXQ7Ci0JaW50IHJlZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWZvciAodGltZW91dCA9IDU7IHRpbWVvdXQgPiAwOyB0aW1lb3V0LS0pCi0JCWluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpOwotCS8qIGVuZCBvZiBjbGVhbnVwIHNlcXVlbmNlICovCi0JZm9yICh0aW1lb3V0ID0gMTIwMDA7IHRpbWVvdXQgPiAwICYmIChpbmIoQUQxODQ4UChjaGlwLCBSRUdTRUwpKSAmIEFEMTg0OF9JTklUKTsgdGltZW91dC0tKQotCQl1ZGVsYXkoMTAwKTsKLQotCXNuZF9wcmludGRkKCIoMSkgdGltZW91dCA9ICVsZFxuIiwgdGltZW91dCk7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JaWYgKGluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpICYgQUQxODQ4X0lOSVQpCi0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJtY2VfZG93biBbMHglbHhdIC0gYXV0byBjYWxpYnJhdGlvbiB0aW1lIG91dCAoMClcbiIsIEFEMTg0OFAoY2hpcCwgUkVHU0VMKSk7Ci0jZW5kaWYKLQotCWNoaXAtPm1jZV9iaXQgJj0gfkFEMTg0OF9NQ0U7Ci0JcmVnID0gaW5iKEFEMTg0OFAoY2hpcCwgUkVHU0VMKSk7Ci0Jb3V0YihjaGlwLT5tY2VfYml0IHwgKHJlZyAmIDB4MWYpLCBBRDE4NDhQKGNoaXAsIFJFR1NFTCkpOwotCWlmIChyZWcgPT0gMHg4MCkKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm1jZV9kb3duIFsweCVseF06IHNlcmlvdXMgaW5pdCBwcm9ibGVtIC0gY29kZWMgc3RpbGwgYnVzeVxuIiwgY2hpcC0+cG9ydCk7Ci0JaWYgKChyZWcgJiBBRDE4NDhfTUNFKSA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFdhaXQgZm9yIGF1dG8tY2FsaWJyYXRpb24gKEFDKSBwcm9jZXNzIHRvIGZpbmlzaCwgaS5lLiBBQ0kgdG8gZ28gbG93LgotCSAqIEl0IG1heSB0YWtlIHVwIHRvIDUgc2FtcGxlIHBlcmlvZHMgKGF0IG1vc3QgOTA3IHVzIEAgNS41MTI1IGtIeikgZm9yCi0JICogdGhlIHByb2Nlc3MgdG8gX3N0YXJ0Xywgc28gaXQgaXMgaW1wb3J0YW50IHRvIHdhaXQgYXQgbGVhc3QgdGhhdCBsb25nCi0JICogYmVmb3JlIGNoZWNraW5nLiAgT3RoZXJ3aXNlIHdlIG1pZ2h0IHRoaW5rIEFDIGhhcyBmaW5pc2hlZCB3aGVuIGl0Ci0JICogaGFzIGluIGZhY3Qgbm90IGJlZ3VuLiAgSXQgY291bGQgdGFrZSAxMjggKG5vIEFDKSBvciAzODQgKEFDKSBjeWNsZXMKLQkgKiBmb3IgQUNJIHRvIGRyb3AuICBUaGlzIGdpdmVzIGEgd2FpdCBvZiBhdCBtb3N0IDcwIG1zIHdpdGggYSBtb3JlCi0JICogdHlwaWNhbCB2YWx1ZSBvZiAzLTkgbXMuCi0JICovCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCk7Ci0JZG8gewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQltc2xlZXAoMSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlyZWcgPSBzbmRfYWQxODQ4X2luKGNoaXAsIEFEMTg0OF9URVNUX0lOSVQpICYKLQkJICAgICAgQUQxODQ4X0NBTElCX0lOX1BST0dSRVNTOwotCX0gd2hpbGUgKHJlZyAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAocmVnKQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAibWNlX2Rvd24gLSBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgyKVxuIik7Ci0KLQlzbmRfcHJpbnRkZCgiKDQpIGppZmZpZXMgPSAlbHVcbiIsIGppZmZpZXMpOwotCXNuZF9wcmludGQoIm1jZV9kb3duIC0gZXhpdCA9IDB4JXhcbiIsIGluYihBRDE4NDhQKGNoaXAsIFJFR1NFTCkpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYWQxODQ4X2dldF9jb3VudCh1bnNpZ25lZCBjaGFyIGZvcm1hdCwKLQkJCQkgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzd2l0Y2ggKGZvcm1hdCAmIDB4ZTApIHsKLQljYXNlIEFEMTg0OF9MSU5FQVJfMTY6Ci0JCXNpemUgPj49IDE7Ci0JCWJyZWFrOwotCX0KLQlpZiAoZm9ybWF0ICYgQUQxODQ4X1NURVJFTykKLQkJc2l6ZSA+Pj0gMTsKLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3RyaWdnZXIoc3RydWN0IHNuZF9hZDE4NDggKmNoaXAsIHVuc2lnbmVkIGNoYXIgd2hhdCwKLQkJCSAgICAgIGludCBjaGFubmVsLCBpbnQgY21kKQotewotCWludCByZXN1bHQgPSAwOwotCi0jaWYgMAotCXByaW50aygiY29kZWMgdHJpZ2dlciEhISAtIHdoYXQgPSAlaSwgZW5hYmxlID0gJWksIHN0YXR1cyA9IDB4JXhcbiIsIHdoYXQsIGVuYWJsZSwgaW5iKEFEMTg0OFAoY2FyZCwgU1RBVFVTKSkpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkgewotCQlpZiAoY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdICYgd2hhdCkgewotCQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXNuZF9hZDE4NDhfb3V0KGNoaXAsIEFEMTg0OF9JRkFDRV9DVFJMLCBjaGlwLT5pbWFnZVtBRDE4NDhfSUZBQ0VfQ1RSTF0gfD0gd2hhdCk7Ci0JCWNoaXAtPm1vZGUgfD0gQUQxODQ4X01PREVfUlVOTklORzsKLQl9IGVsc2UgaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QKSB7Ci0JCWlmICghKGNoaXAtPmltYWdlW0FEMTg0OF9JRkFDRV9DVFJMXSAmIHdoYXQpKSB7Ci0JCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0FEMTg0OF9JRkFDRV9DVFJMXSAmPSB+d2hhdCk7Ci0JCWNoaXAtPm1vZGUgJj0gfkFEMTg0OF9NT0RFX1JVTk5JTkc7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogIENPREVDIEkvTwotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9hZDE4NDhfZ2V0X3JhdGUodW5zaWduZWQgaW50IHJhdGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykKLQkJaWYgKHJhdGUgPT0gcmF0ZXNbaV0pCi0JCQlyZXR1cm4gZnJlcV9iaXRzW2ldOwotCXNuZF9CVUcoKTsKLQlyZXR1cm4gZnJlcV9iaXRzW0FSUkFZX1NJWkUocmF0ZXMpIC0gMV07Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9pb2N0bChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbmRfYWQxODQ4X2dldF9mb3JtYXQoaW50IGZvcm1hdCwgaW50IGNoYW5uZWxzKQotewotCXVuc2lnbmVkIGNoYXIgcmZvcm1hdDsKLQotCXJmb3JtYXQgPSBBRDE4NDhfTElORUFSXzg7Ci0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfQV9MQVc6CXJmb3JtYXQgPSBBRDE4NDhfQUxBV184OyBicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfTVVfTEFXOglyZm9ybWF0ID0gQUQxODQ4X1VMQVdfODsgYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToJcmZvcm1hdCA9IEFEMTg0OF9MSU5FQVJfMTY7IGJyZWFrOwotCX0KLQlpZiAoY2hhbm5lbHMgPiAxKQotCQlyZm9ybWF0IHw9IEFEMTg0OF9TVEVSRU87Ci0jaWYgMAotCXNuZF9wcmludGsoImdldF9mb3JtYXQ6IDB4JXggKG1vZGU9MHgleClcbiIsIGZvcm1hdCwgbW9kZSk7Ci0jZW5kaWYKLQlyZXR1cm4gcmZvcm1hdDsKLX0KLQotc3RhdGljIHZvaWQgc25kX2FkMTg0OF9jYWxpYnJhdGVfbXV0ZShzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCwgaW50IG11dGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKLQltdXRlID0gbXV0ZSA/IDEgOiAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWlmIChjaGlwLT5jYWxpYnJhdGVfbXV0ZSA9PSBtdXRlKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFtdXRlKSB7Ci0JCXNuZF9hZDE4NDhfZG91dChjaGlwLCBBRDE4NDhfTEVGVF9JTlBVVCwgY2hpcC0+aW1hZ2VbQUQxODQ4X0xFRlRfSU5QVVRdKTsKLQkJc25kX2FkMTg0OF9kb3V0KGNoaXAsIEFEMTg0OF9SSUdIVF9JTlBVVCwgY2hpcC0+aW1hZ2VbQUQxODQ4X1JJR0hUX0lOUFVUXSk7Ci0JfQotCXNuZF9hZDE4NDhfZG91dChjaGlwLCBBRDE4NDhfQVVYMV9MRUZUX0lOUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0FEMTg0OF9BVVgxX0xFRlRfSU5QVVRdKTsKLQlzbmRfYWQxODQ4X2RvdXQoY2hpcCwgQUQxODQ4X0FVWDFfUklHSFRfSU5QVVQsIG11dGUgPyAweDgwIDogY2hpcC0+aW1hZ2VbQUQxODQ4X0FVWDFfUklHSFRfSU5QVVRdKTsKLQlzbmRfYWQxODQ4X2RvdXQoY2hpcCwgQUQxODQ4X0FVWDJfTEVGVF9JTlBVVCwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtBRDE4NDhfQVVYMl9MRUZUX0lOUFVUXSk7Ci0Jc25kX2FkMTg0OF9kb3V0KGNoaXAsIEFEMTg0OF9BVVgyX1JJR0hUX0lOUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0FEMTg0OF9BVVgyX1JJR0hUX0lOUFVUXSk7Ci0Jc25kX2FkMTg0OF9kb3V0KGNoaXAsIEFEMTg0OF9MRUZUX09VVFBVVCwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtBRDE4NDhfTEVGVF9PVVRQVVRdKTsKLQlzbmRfYWQxODQ4X2RvdXQoY2hpcCwgQUQxODQ4X1JJR0hUX09VVFBVVCwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtBRDE4NDhfUklHSFRfT1VUUFVUXSk7Ci0JY2hpcC0+Y2FsaWJyYXRlX211dGUgPSBtdXRlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9hZDE4NDhfc2V0X2RhdGFfZm9ybWF0KHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKLXsKLQlpZiAoaHdfcGFyYW1zID09IE5VTEwpIHsKLQkJY2hpcC0+aW1hZ2VbQUQxODQ4X0RBVEFfRk9STUFUXSA9IDB4MjA7Ci0JfSBlbHNlIHsKLQkJY2hpcC0+aW1hZ2VbQUQxODQ4X0RBVEFfRk9STUFUXSA9Ci0JCSAgICBzbmRfYWQxODQ4X2dldF9mb3JtYXQocGFyYW1zX2Zvcm1hdChod19wYXJhbXMpLCBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSkgfAotCQkgICAgc25kX2FkMTg0OF9nZXRfcmF0ZShwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKLQl9Ci0JLy8gc25kX3ByaW50aygiPj4+IHBtb2RlID0gMHgleCwgZGZyID0gMHgleFxuIiwgcHN0ci0+bW9kZSwgY2hpcC0+aW1hZ2VbQUQxODQ4X0RBVEFfRk9STUFUXSk7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9vcGVuKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoaXAtPm1vZGUgJiBBRDE4NDhfTU9ERV9PUEVOKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXNuZF9hZDE4NDhfbWNlX2Rvd24oY2hpcCk7Ci0KLSNpZmRlZiBTTkRSVl9ERUJVR19NQ0UKLQlzbmRfcHJpbnRrKCJvcGVuOiAoMSlcbiIpOwotI2VuZGlmCi0Jc25kX2FkMTg0OF9tY2VfdXAoY2hpcCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdICY9IH4oQUQxODQ4X1BMQVlCQUNLX0VOQUJMRSB8IEFEMTg0OF9QTEFZQkFDS19QSU8gfAotCQkJICAgICBBRDE4NDhfQ0FQVFVSRV9FTkFCTEUgfCBBRDE4NDhfQ0FQVFVSRV9QSU8gfAotCQkJICAgICBBRDE4NDhfQ0FMSUJfTU9ERSk7Ci0JY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdIHw9IEFEMTg0OF9BVVRPQ0FMSUI7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0FEMTg0OF9JRkFDRV9DVFJMXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYWQxODQ4X21jZV9kb3duKGNoaXApOwotCi0jaWZkZWYgU05EUlZfREVCVUdfTUNFCi0Jc25kX3ByaW50aygib3BlbjogKDIpXG4iKTsKLSNlbmRpZgotCi0Jc25kX2FkMTg0OF9zZXRfZGF0YV9mb3JtYXQoY2hpcCwgTlVMTCk7Ci0KLQlzbmRfYWQxODQ4X21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfREFUQV9GT1JNQVQsIGNoaXAtPmltYWdlW0FEMTg0OF9EQVRBX0ZPUk1BVF0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FkMTg0OF9tY2VfZG93bihjaGlwKTsKLQotI2lmZGVmIFNORFJWX0RFQlVHX01DRQotCXNuZF9wcmludGsoIm9wZW46ICgzKVxuIik7Ci0jZW5kaWYKLQotCS8qIG9rLiBub3cgZW5hYmxlIGFuZCBhY2sgQ09ERUMgSVJRICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jb3V0YigwLCBBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwkvKiBjbGVhciBJUlEgKi8KLQlvdXRiKDAsIEFEMTg0OFAoY2hpcCwgU1RBVFVTKSk7CS8qIGNsZWFyIElSUSAqLwotCWNoaXAtPmltYWdlW0FEMTg0OF9QSU5fQ1RSTF0gfD0gQUQxODQ4X0lSUV9FTkFCTEU7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X1BJTl9DVFJMLCBjaGlwLT5pbWFnZVtBRDE4NDhfUElOX0NUUkxdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCi0JY2hpcC0+bW9kZSA9IG1vZGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc25kX2FkMTg0OF9jbG9zZShzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFjaGlwLT5tb2RlKQotCQlyZXR1cm47Ci0JLyogZGlzYWJsZSBJUlEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlvdXRiKDAsIEFEMTg0OFAoY2hpcCwgU1RBVFVTKSk7CS8qIGNsZWFyIElSUSAqLwotCW91dGIoMCwgQUQxODQ4UChjaGlwLCBTVEFUVVMpKTsJLyogY2xlYXIgSVJRICovCi0JY2hpcC0+aW1hZ2VbQUQxODQ4X1BJTl9DVFJMXSAmPSB+QUQxODQ4X0lSUV9FTkFCTEU7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X1BJTl9DVFJMLCBjaGlwLT5pbWFnZVtBRDE4NDhfUElOX0NUUkxdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCi0JLyogbm93IGRpc2FibGUgY2FwdHVyZSAmIHBsYXliYWNrICovCi0KLQlzbmRfYWQxODQ4X21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQljaGlwLT5pbWFnZVtBRDE4NDhfSUZBQ0VfQ1RSTF0gJj0gfihBRDE4NDhfUExBWUJBQ0tfRU5BQkxFIHwgQUQxODQ4X1BMQVlCQUNLX1BJTyB8Ci0JCQkgICAgIEFEMTg0OF9DQVBUVVJFX0VOQUJMRSB8IEFEMTg0OF9DQVBUVVJFX1BJTyk7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0FEMTg0OF9JRkFDRV9DVFJMXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYWQxODQ4X21jZV9kb3duKGNoaXApOwotCi0JLyogY2xlYXIgSVJRIGFnYWluICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jb3V0YigwLCBBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwkvKiBjbGVhciBJUlEgKi8KLQlvdXRiKDAsIEFEMTg0OFAoY2hpcCwgU1RBVFVTKSk7CS8qIGNsZWFyIElSUSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0KLQljaGlwLT5tb2RlID0gMDsKLX0KLQotLyoKLSAqICBvay4uIGV4cG9ydGVkIGZ1bmN0aW9ucy4uCi0gKi8KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3BsYXliYWNrX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgICAgIGludCBjbWQpCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHNuZF9hZDE4NDhfdHJpZ2dlcihjaGlwLCBBRDE4NDhfUExBWUJBQ0tfRU5BQkxFLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCBjbWQpOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICAgIGludCBjbWQpCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHNuZF9hZDE4NDhfdHJpZ2dlcihjaGlwLCBBRDE4NDhfQ0FQVFVSRV9FTkFCTEUsIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgY21kKTsKLX0KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3BsYXliYWNrX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQotewotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCXNuZF9hZDE4NDhfY2FsaWJyYXRlX211dGUoY2hpcCwgMSk7Ci0Jc25kX2FkMTg0OF9zZXRfZGF0YV9mb3JtYXQoY2hpcCwgaHdfcGFyYW1zKTsKLQlzbmRfYWQxODQ4X21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfREFUQV9GT1JNQVQsIGNoaXAtPmltYWdlW0FEMTg0OF9EQVRBX0ZPUk1BVF0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FkMTg0OF9tY2VfZG93bihjaGlwKTsKLQlzbmRfYWQxODQ4X2NhbGlicmF0ZV9tdXRlKGNoaXAsIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfcGxheWJhY2tfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfcGxheWJhY2tfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCWNoaXAtPmRtYV9zaXplID0gc2l6ZTsKLQljaGlwLT5pbWFnZVtBRDE4NDhfSUZBQ0VfQ1RSTF0gJj0gfihBRDE4NDhfUExBWUJBQ0tfRU5BQkxFIHwgQUQxODQ4X1BMQVlCQUNLX1BJTyk7Ci0Jc25kX2RtYV9wcm9ncmFtKGNoaXAtPmRtYSwgcnVudGltZS0+ZG1hX2FkZHIsIHNpemUsIERNQV9NT0RFX1dSSVRFIHwgRE1BX0FVVE9JTklUKTsKLQljb3VudCA9IHNuZF9hZDE4NDhfZ2V0X2NvdW50KGNoaXAtPmltYWdlW0FEMTg0OF9EQVRBX0ZPUk1BVF0sIGNvdW50KSAtIDE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X0RBVEFfTFdSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIGNvdW50KTsKLQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfREFUQV9VUFJfQ05ULCAodW5zaWduZWQgY2hhcikgKGNvdW50ID4+IDgpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfY2FwdHVyZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQotewotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCXNuZF9hZDE4NDhfY2FsaWJyYXRlX211dGUoY2hpcCwgMSk7Ci0Jc25kX2FkMTg0OF9zZXRfZGF0YV9mb3JtYXQoY2hpcCwgaHdfcGFyYW1zKTsKLQlzbmRfYWQxODQ4X21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfREFUQV9GT1JNQVQsIGNoaXAtPmltYWdlW0FEMTg0OF9EQVRBX0ZPUk1BVF0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2FkMTg0OF9tY2VfZG93bihjaGlwKTsKLQlzbmRfYWQxODQ4X2NhbGlicmF0ZV9tdXRlKGNoaXAsIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfY2FwdHVyZV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0KLQljaGlwLT5kbWFfc2l6ZSA9IHNpemU7Ci0JY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdICY9IH4oQUQxODQ4X0NBUFRVUkVfRU5BQkxFIHwgQUQxODQ4X0NBUFRVUkVfUElPKTsKLQlzbmRfZG1hX3Byb2dyYW0oY2hpcC0+ZG1hLCBydW50aW1lLT5kbWFfYWRkciwgc2l6ZSwgRE1BX01PREVfUkVBRCB8IERNQV9BVVRPSU5JVCk7Ci0JY291bnQgPSBzbmRfYWQxODQ4X2dldF9jb3VudChjaGlwLT5pbWFnZVtBRDE4NDhfREFUQV9GT1JNQVRdLCBjb3VudCkgLSAxOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hZDE4NDhfb3V0KGNoaXAsIEFEMTg0OF9EQVRBX0xXUl9DTlQsICh1bnNpZ25lZCBjaGFyKSBjb3VudCk7Ci0Jc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X0RBVEFfVVBSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIChjb3VudCA+PiA4KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNuZF9hZDE4NDhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IGRldl9pZDsKLQotCWlmICgoY2hpcC0+bW9kZSAmIEFEMTg0OF9NT0RFX1BMQVkpICYmIGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSAmJgotCSAgICAoY2hpcC0+bW9kZSAmIEFEMTg0OF9NT0RFX1JVTk5JTkcpKQotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSk7Ci0JaWYgKChjaGlwLT5tb2RlICYgQUQxODQ4X01PREVfQ0FQVFVSRSkgJiYgY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gJiYKLQkgICAgKGNoaXAtPm1vZGUgJiBBRDE4NDhfTU9ERV9SVU5OSU5HKSkKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSk7Ci0Jb3V0YigwLCBBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwkvKiBjbGVhciBnbG9iYWwgaW50ZXJydXB0IGJpdCAqLwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hZDE4NDhfcGxheWJhY2tfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzaXplX3QgcHRyOwotCQotCWlmICghKGNoaXAtPmltYWdlW0FEMTg0OF9JRkFDRV9DVFJMXSAmIEFEMTg0OF9QTEFZQkFDS19FTkFCTEUpKQotCQlyZXR1cm4gMDsKLQlwdHIgPSBzbmRfZG1hX3BvaW50ZXIoY2hpcC0+ZG1hLCBjaGlwLT5kbWFfc2l6ZSk7Ci0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfYWQxODQ4X2NhcHR1cmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzaXplX3QgcHRyOwotCi0JaWYgKCEoY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdICYgQUQxODQ4X0NBUFRVUkVfRU5BQkxFKSkKLQkJcmV0dXJuIDA7Ci0JcHRyID0gc25kX2RtYV9wb2ludGVyKGNoaXAtPmRtYSwgY2hpcC0+ZG1hX3NpemUpOwotCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOwotfQotCi0vKgotCi0gKi8KLQotc3RhdGljIHZvaWQgc25kX2FkMTg0OF90aGlua3BhZF90d2lkZGxlKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwLCBpbnQgb24pIHsKLQotCWludCB0bXA7Ci0KLQlpZiAoIWNoaXAtPnRoaW5rcGFkX2ZsYWcpIHJldHVybjsKLQotCW91dGIoMHgxYywgQUQxODQ4X1RISU5LUEFEX0NUTF9QT1JUMSk7Ci0JdG1wID0gaW5iKEFEMTg0OF9USElOS1BBRF9DVExfUE9SVDIpOwotCi0JaWYgKG9uKQotCQkvKiB0dXJuIGl0IG9uICovCi0JCXRtcCB8PSBBRDE4NDhfVEhJTktQQURfQ1M0MjQ4X0VOQUJMRV9CSVQ7Ci0JZWxzZQotCQkvKiB0dXJuIGl0IG9mZiAqLwotCQl0bXAgJj0gfkFEMTg0OF9USElOS1BBRF9DUzQyNDhfRU5BQkxFX0JJVDsKLQkKLQlvdXRiKHRtcCwgQUQxODQ4X1RISU5LUEFEX0NUTF9QT1JUMik7Ci0KLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHZvaWQgc25kX2FkMTg0OF9zdXNwZW5kKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQotewotCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKLQlpZiAoY2hpcC0+dGhpbmtwYWRfZmxhZykKLQkJc25kX2FkMTg0OF90aGlua3BhZF90d2lkZGxlKGNoaXAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBzbmRfYWQxODQ4X3Jlc3VtZShzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQlpbnQgaTsKLQotCWlmIChjaGlwLT50aGlua3BhZF9mbGFnKQotCQlzbmRfYWQxODQ4X3RoaW5rcGFkX3R3aWRkbGUoY2hpcCwgMSk7Ci0KLQkvKiBjbGVhciBhbnkgcGVuZGluZ3MgSVJRICovCi0JaW5iKEFEMTg0OFAoY2hpcCwgU1RBVFVTKSk7Ci0Jb3V0YigwLCBBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwotCW1iKCk7Ci0KLQlzbmRfYWQxODQ4X21jZV9kb3duKGNoaXApOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlzbmRfYWQxODQ4X291dChjaGlwLCBpLCBjaGlwLT5pbWFnZVtpXSk7Ci0Jc25kX2FkMTg0OF9tY2VfdXAoY2hpcCk7Ci0Jc25kX2FkMTg0OF9tY2VfZG93bihjaGlwKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3Byb2JlKHN0cnVjdCBzbmRfYWQxODQ4ICogY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpLCBpZCwgcmV2LCBhZDE4NDc7Ci0JdW5zaWduZWQgY2hhciAqcHRyOwotCi0jaWYgMAotCXNuZF9hZDE4NDhfZGVidWcoY2hpcCk7Ci0jZW5kaWYKLQlpZCA9IGFkMTg0NyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgewotCQltYigpOwotCQlpZiAoaW5iKEFEMTg0OFAoY2hpcCwgUkVHU0VMKSkgJiBBRDE4NDhfSU5JVCkKLQkJCXVkZWxheSg1MDApOwotCQllbHNlIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQkJc25kX2FkMTg0OF9vdXQoY2hpcCwgQUQxODQ4X01JU0NfSU5GTywgMHgwMCk7Ci0JCQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfTEVGVF9JTlBVVCwgMHhhYSk7Ci0JCQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfUklHSFRfSU5QVVQsIDB4NDUpOwotCQkJcmV2ID0gc25kX2FkMTg0OF9pbihjaGlwLCBBRDE4NDhfUklHSFRfSU5QVVQpOwotCQkJaWYgKHJldiA9PSAweDY1KSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQkJCQlpZCA9IDE7Ci0JCQkJYWQxODQ3ID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzbmRfYWQxODQ4X2luKGNoaXAsIEFEMTg0OF9MRUZUX0lOUFVUKSA9PSAweGFhICYmIHJldiA9PSAweDQ1KSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQkJCQlpZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCWlmIChpZCAhPSAxKQotCQlyZXR1cm4gLUVOT0RFVjsJLyogbm8gdmFsaWQgZGV2aWNlIGZvdW5kICovCi0JaWYgKGNoaXAtPmhhcmR3YXJlID09IEFEMTg0OF9IV19ERVRFQ1QpIHsKLQkJaWYgKGFkMTg0NykgewotCQkJY2hpcC0+aGFyZHdhcmUgPSBBRDE4NDhfSFdfQUQxODQ3OwotCQl9IGVsc2UgewotCQkJY2hpcC0+aGFyZHdhcmUgPSBBRDE4NDhfSFdfQUQxODQ4OwotCQkJcmV2ID0gc25kX2FkMTg0OF9pbihjaGlwLCBBRDE4NDhfTUlTQ19JTkZPKTsKLQkJCWlmIChyZXYgJiAweDgwKSB7Ci0JCQkJY2hpcC0+aGFyZHdhcmUgPSBBRDE4NDhfSFdfQ1M0MjQ4OwotCQkJfSBlbHNlIGlmICgocmV2ICYgMHgwZikgPT0gMHgwYSkgewotCQkJCXNuZF9hZDE4NDhfb3V0KGNoaXAsIEFEMTg0OF9NSVNDX0lORk8sIDB4NDApOwotCQkJCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0JCQkJCWlmIChzbmRfYWQxODQ4X2luKGNoaXAsIGkpICE9IHNuZF9hZDE4NDhfaW4oY2hpcCwgaSArIDE2KSkgewotCQkJCQkJY2hpcC0+aGFyZHdhcmUgPSBBRDE4NDhfSFdfQ01JODMzMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNuZF9hZDE4NDhfb3V0KGNoaXAsIEFEMTg0OF9NSVNDX0lORk8sIDB4MDApOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWluYihBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwkvKiBjbGVhciBhbnkgcGVuZGluZ3MgSVJRICovCi0Jb3V0YigwLCBBRDE4NDhQKGNoaXAsIFNUQVRVUykpOwotCW1iKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQotCWNoaXAtPmltYWdlW0FEMTg0OF9NSVNDX0lORk9dID0gMHgwMDsKLQljaGlwLT5pbWFnZVtBRDE4NDhfSUZBQ0VfQ1RSTF0gPQotCSAgICAoY2hpcC0+aW1hZ2VbQUQxODQ4X0lGQUNFX0NUUkxdICYgfkFEMTg0OF9TSU5HTEVfRE1BKSB8IEFEMTg0OF9TSU5HTEVfRE1BOwotCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopICZjaGlwLT5pbWFnZTsKLQlzbmRfYWQxODQ4X21jZV9kb3duKGNoaXApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQkvKiBvay4uIGZpbGwgYWxsIEFEMTg0OCByZWdpc3RlcnMgKi8KLQkJc25kX2FkMTg0OF9vdXQoY2hpcCwgaSwgKnB0cisrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9hZDE4NDhfbWNlX3VwKGNoaXApOwotCXNuZF9hZDE4NDhfbWNlX2Rvd24oY2hpcCk7Ci0JcmV0dXJuIDA7CQkvKiBhbGwgdGhpbmdzIGFyZSBvay4uICovCi19Ci0KLS8qCi0KLSAqLwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2FkMTg0OF9wbGF5YmFjayA9Ci17Ci0JLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKLQkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9NVV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0FfTEFXIHwKLQkJCQkgU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFKSwKLQkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JLnJhdGVfbWluID0JCTU1MTAsCi0JLnJhdGVfbWF4ID0JCTQ4MDAwLAotCS5jaGFubmVsc19taW4gPQkJMSwKLQkuY2hhbm5lbHNfbWF4ID0JCTIsCi0JLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAotCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCi0JLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAotCS5wZXJpb2RzX21pbiA9CQkxLAotCS5wZXJpb2RzX21heCA9CQkxMDI0LAotCS5maWZvX3NpemUgPQkJMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfYWQxODQ4X2NhcHR1cmUgPQotewotCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCksCi0JLmZvcm1hdHMgPQkJKFNORFJWX1BDTV9GTVRCSVRfTVVfTEFXIHwgU05EUlZfUENNX0ZNVEJJVF9BX0xBVyB8Ci0JCQkJIFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSksCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCS5yYXRlX21pbiA9CQk1NTEwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTEsCi0JLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kc19taW4gPQkJMSwKLQkucGVyaW9kc19tYXggPQkJMTAyNCwKLQkuZmlmb19zaXplID0JCTAsCi19OwotCi0vKgotCi0gKi8KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpbnQgZXJyOwotCi0JaWYgKChlcnIgPSBzbmRfYWQxODQ4X29wZW4oY2hpcCwgQUQxODQ4X01PREVfUExBWSkpIDwgMCkKLQkJcmV0dXJuIGVycjsKLQljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JcnVudGltZS0+aHcgPSBzbmRfYWQxODQ4X3BsYXliYWNrOwotCXNuZF9wY21fbGltaXRfaXNhX2RtYV9zaXplKGNoaXAtPmRtYSwgJnJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOwotCXNuZF9wY21fbGltaXRfaXNhX2RtYV9zaXplKGNoaXAtPmRtYSwgJnJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXgpOwotCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmaHdfY29uc3RyYWludHNfcmF0ZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfY2FwdHVyZV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc25kX2FkMTg0OF9vcGVuKGNoaXAsIEFEMTg0OF9NT0RFX0NBUFRVUkUpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0JY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JcnVudGltZS0+aHcgPSBzbmRfYWQxODQ4X2NhcHR1cmU7Ci0Jc25kX3BjbV9saW1pdF9pc2FfZG1hX3NpemUoY2hpcC0+ZG1hLCAmcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCk7Ci0Jc25kX3BjbV9saW1pdF9pc2FfZG1hX3NpemUoY2hpcC0+ZG1hLCAmcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21heCk7Ci0Jc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsICZod19jb25zdHJhaW50c19yYXRlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCWNoaXAtPm1vZGUgJj0gfkFEMTg0OF9NT0RFX1BMQVk7Ci0JY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfYWQxODQ4X2Nsb3NlKGNoaXApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfY2FwdHVyZV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCWNoaXAtPm1vZGUgJj0gfkFEMTg0OF9NT0RFX0NBUFRVUkU7Ci0JY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBOVUxMOwotCXNuZF9hZDE4NDhfY2xvc2UoY2hpcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9mcmVlKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQotewotCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX3BvcnQpOwotCWlmIChjaGlwLT5pcnEgPj0gMCkKLQkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKSBjaGlwKTsKLQlpZiAoY2hpcC0+ZG1hID49IDApIHsKLQkJc25kX2RtYV9kaXNhYmxlKGNoaXAtPmRtYSk7Ci0JCWZyZWVfZG1hKGNoaXAtPmRtYSk7Ci0JfQotCWtmcmVlKGNoaXApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7Ci0JcmV0dXJuIHNuZF9hZDE4NDhfZnJlZShjaGlwKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNuZF9hZDE4NDhfY2hpcF9pZChzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7Ci0JY2FzZSBBRDE4NDhfSFdfQUQxODQ3OglyZXR1cm4gIkFEMTg0NyI7Ci0JY2FzZSBBRDE4NDhfSFdfQUQxODQ4OglyZXR1cm4gIkFEMTg0OCI7Ci0JY2FzZSBBRDE4NDhfSFdfQ1M0MjQ4OglyZXR1cm4gIkNTNDI0OCI7Ci0JY2FzZSBBRDE4NDhfSFdfQ01JODMzMDogcmV0dXJuICJDTUk4MzMwL0MzRCI7Ci0JZGVmYXVsdDoJCXJldHVybiAiPz8/IjsKLQl9Ci19Ci0KLWludCBzbmRfYWQxODQ4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcG9ydCwKLQkJICAgICAgaW50IGlycSwgaW50IGRtYSwKLQkJICAgICAgdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUsCi0JCSAgICAgIHN0cnVjdCBzbmRfYWQxODQ4ICoqIHJjaGlwKQotewotCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewotCQkuZGV2X2ZyZWUgPQlzbmRfYWQxODQ4X2Rldl9mcmVlLAotCX07Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXA7Ci0JaW50IGVycjsKLQotCSpyY2hpcCA9IE5VTEw7Ci0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNoaXAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKLQljaGlwLT5jYXJkID0gY2FyZDsKLQljaGlwLT5wb3J0ID0gcG9ydDsKLQljaGlwLT5pcnEgPSAtMTsKLQljaGlwLT5kbWEgPSAtMTsKLQljaGlwLT5oYXJkd2FyZSA9IGhhcmR3YXJlOwotCW1lbWNweSgmY2hpcC0+aW1hZ2UsICZzbmRfYWQxODQ4X29yaWdpbmFsX2ltYWdlLCBzaXplb2Yoc25kX2FkMTg0OF9vcmlnaW5hbF9pbWFnZSkpOwotCQotCWlmICgoY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCA0LCAiQUQxODQ4IikpID09IE5VTEwpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWQxODQ4OiBjYW4ndCBncmFiIHBvcnQgMHglbHhcbiIsIHBvcnQpOwotCQlzbmRfYWQxODQ4X2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9hZDE4NDhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiQUQxODQ4IiwgKHZvaWQgKikgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWQxODQ4OiBjYW4ndCBncmFiIElSUSAlZFxuIiwgaXJxKTsKLQkJc25kX2FkMTg0OF9mcmVlKGNoaXApOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQljaGlwLT5pcnEgPSBpcnE7Ci0JaWYgKHJlcXVlc3RfZG1hKGRtYSwgIkFEMTg0OCIpKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFkMTg0ODogY2FuJ3QgZ3JhYiBETUEgJWRcbiIsIGRtYSk7Ci0JCXNuZF9hZDE4NDhfZnJlZShjaGlwKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JY2hpcC0+ZG1hID0gZG1hOwotCi0JaWYgKGhhcmR3YXJlID09IEFEMTg0OF9IV19USElOS1BBRCkgewotCQljaGlwLT50aGlua3BhZF9mbGFnID0gMTsKLQkJY2hpcC0+aGFyZHdhcmUgPSBBRDE4NDhfSFdfREVURUNUOyAvKiByZXNldCAqLwotCQlzbmRfYWQxODQ4X3RoaW5rcGFkX3R3aWRkbGUoY2hpcCwgMSk7Ci0JfQotCi0JaWYgKHNuZF9hZDE4NDhfcHJvYmUoY2hpcCkgPCAwKSB7Ci0JCXNuZF9hZDE4NDhfZnJlZShjaGlwKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogUmVnaXN0ZXIgZGV2aWNlICovCi0JaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGNoaXAsICZvcHMpKSA8IDApIHsKLQkJc25kX2FkMTg0OF9mcmVlKGNoaXApOwotCQlyZXR1cm4gZXJyOwotCX0KLQotI2lmZGVmIENPTkZJR19QTQotCWNoaXAtPnN1c3BlbmQgPSBzbmRfYWQxODQ4X3N1c3BlbmQ7Ci0JY2hpcC0+cmVzdW1lID0gc25kX2FkMTg0OF9yZXN1bWU7Ci0jZW5kaWYKLQotCSpyY2hpcCA9IGNoaXA7Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woc25kX2FkMTg0OF9jcmVhdGUpOwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hZDE4NDhfcGxheWJhY2tfb3BzID0gewotCS5vcGVuID0JCXNuZF9hZDE4NDhfcGxheWJhY2tfb3BlbiwKLQkuY2xvc2UgPQlzbmRfYWQxODQ4X3BsYXliYWNrX2Nsb3NlLAotCS5pb2N0bCA9CXNuZF9hZDE4NDhfaW9jdGwsCi0JLmh3X3BhcmFtcyA9CXNuZF9hZDE4NDhfcGxheWJhY2tfaHdfcGFyYW1zLAotCS5od19mcmVlID0Jc25kX2FkMTg0OF9wbGF5YmFja19od19mcmVlLAotCS5wcmVwYXJlID0Jc25kX2FkMTg0OF9wbGF5YmFja19wcmVwYXJlLAotCS50cmlnZ2VyID0Jc25kX2FkMTg0OF9wbGF5YmFja190cmlnZ2VyLAotCS5wb2ludGVyID0Jc25kX2FkMTg0OF9wbGF5YmFja19wb2ludGVyLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWQxODQ4X2NhcHR1cmVfb3BzID0gewotCS5vcGVuID0JCXNuZF9hZDE4NDhfY2FwdHVyZV9vcGVuLAotCS5jbG9zZSA9CXNuZF9hZDE4NDhfY2FwdHVyZV9jbG9zZSwKLQkuaW9jdGwgPQlzbmRfYWQxODQ4X2lvY3RsLAotCS5od19wYXJhbXMgPQlzbmRfYWQxODQ4X2NhcHR1cmVfaHdfcGFyYW1zLAotCS5od19mcmVlID0Jc25kX2FkMTg0OF9jYXB0dXJlX2h3X2ZyZWUsCi0JLnByZXBhcmUgPQlzbmRfYWQxODQ4X2NhcHR1cmVfcHJlcGFyZSwKLQkudHJpZ2dlciA9CXNuZF9hZDE4NDhfY2FwdHVyZV90cmlnZ2VyLAotCS5wb2ludGVyID0Jc25kX2FkMTg0OF9jYXB0dXJlX3BvaW50ZXIsCi19OwotCi1pbnQgc25kX2FkMTg0OF9wY20oc3RydWN0IHNuZF9hZDE4NDggKmNoaXAsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfcGNtICoqcnBjbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWludCBlcnI7Ci0KLQlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBRDE4NDgiLCBkZXZpY2UsIDEsIDEsICZwY20pKSA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX2FkMTg0OF9wbGF5YmFja19vcHMpOwotCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9hZDE4NDhfY2FwdHVyZV9vcHMpOwotCi0JcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOwotCXBjbS0+aW5mb19mbGFncyA9IFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYOwotCXN0cmNweShwY20tPm5hbWUsIHNuZF9hZDE4NDhfY2hpcF9pZChjaGlwKSk7Ci0KLQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCQkgICAgICBzbmRfZG1hX2lzYV9kYXRhKCksCi0JCQkJCSAgICAgIDY0KjEwMjQsIGNoaXAtPmRtYSA+IDMgPyAxMjgqMTAyNCA6IDY0KjEwMjQpOwotCi0JY2hpcC0+cGNtID0gcGNtOwotCWlmIChycGNtKQotCQkqcnBjbSA9IHBjbTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChzbmRfYWQxODQ4X3BjbSk7Ci0KLWNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyAqc25kX2FkMTg0OF9nZXRfcGNtX29wcyhpbnQgZGlyZWN0aW9uKQotewotCXJldHVybiBkaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/Ci0JCSZzbmRfYWQxODQ4X3BsYXliYWNrX29wcyA6ICZzbmRfYWQxODQ4X2NhcHR1cmVfb3BzOwotfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9hZDE4NDhfZ2V0X3BjbV9vcHMpOwotCi0vKgotICogIE1JWEVSIHBhcnQKLSAqLwotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfaW5mb19tdXgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RhdGljIGNoYXIgKnRleHRzWzRdID0gewotCQkiTGluZSIsICJBdXgiLCAiTWljIiwgIk1peCIKLQl9OwotCi0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMjsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAzKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMzsKLQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfZ2V0X211eChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKGNoaXAtPmltYWdlW0FEMTg0OF9MRUZUX0lOUFVUXSAmIEFEMTg0OF9NSVhTX0FMTCkgPj4gNjsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gKGNoaXAtPmltYWdlW0FEMTg0OF9SSUdIVF9JTlBVVF0gJiBBRDE4NDhfTUlYU19BTEwpID4+IDY7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3B1dF9tdXgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgbGVmdCwgcmlnaHQ7Ci0JaW50IGNoYW5nZTsKLQkKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDMgfHwKLQkgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IDMpCi0JCXJldHVybiAtRUlOVkFMOwotCWxlZnQgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IDY7Ci0JcmlnaHQgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IDY7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JbGVmdCA9IChjaGlwLT5pbWFnZVtBRDE4NDhfTEVGVF9JTlBVVF0gJiB+QUQxODQ4X01JWFNfQUxMKSB8IGxlZnQ7Ci0JcmlnaHQgPSAoY2hpcC0+aW1hZ2VbQUQxODQ4X1JJR0hUX0lOUFVUXSAmIH5BRDE4NDhfTUlYU19BTEwpIHwgcmlnaHQ7Ci0JY2hhbmdlID0gbGVmdCAhPSBjaGlwLT5pbWFnZVtBRDE4NDhfTEVGVF9JTlBVVF0gfHwKLQkgICAgICAgICByaWdodCAhPSBjaGlwLT5pbWFnZVtBRDE4NDhfUklHSFRfSU5QVVRdOwotCXNuZF9hZDE4NDhfb3V0KGNoaXAsIEFEMTg0OF9MRUZUX0lOUFVULCBsZWZ0KTsKLQlzbmRfYWQxODQ4X291dChjaGlwLCBBRDE4NDhfUklHSFRfSU5QVVQsIHJpZ2h0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjaGFuZ2U7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9pbmZvX3NpbmdsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCi0JdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9nZXRfc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7Ci0JaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChjaGlwLT5pbWFnZVtyZWddID4+IHNoaWZ0KSAmIG1hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAoaW52ZXJ0KQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfYWQxODQ4X3B1dF9zaW5nbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwotCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCWludCBjaGFuZ2U7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCQotCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOwotCWlmIChpbnZlcnQpCi0JCXZhbCA9IG1hc2sgLSB2YWw7Ci0JdmFsIDw8PSBzaGlmdDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQl2YWwgPSAoY2hpcC0+aW1hZ2VbcmVnXSAmIH4obWFzayA8PCBzaGlmdCkpIHwgdmFsOwotCWNoYW5nZSA9IHZhbCAhPSBjaGlwLT5pbWFnZVtyZWddOwotCXNuZF9hZDE4NDhfb3V0KGNoaXAsIHJlZywgdmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjaGFuZ2U7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9pbmZvX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCi0JdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMjsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9nZXRfZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKLQlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OwotCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OwotCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGNoaXAtPmltYWdlW2xlZnRfcmVnXSA+PiBzaGlmdF9sZWZ0KSAmIG1hc2s7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAoY2hpcC0+aW1hZ2VbcmlnaHRfcmVnXSA+PiBzaGlmdF9yaWdodCkgJiBtYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JaWYgKGludmVydCkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBtYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfcHV0X2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbGVmdF9yZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7Ci0JaW50IHJpZ2h0X3JlZyA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7Ci0JaW50IHNoaWZ0X2xlZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHgwNzsKLQlpbnQgc2hpZnRfcmlnaHQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHgwNzsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjIpICYgMTsKLQlpbnQgY2hhbmdlOwotCXVuc2lnbmVkIHNob3J0IHZhbDEsIHZhbDI7Ci0JCi0JdmFsMSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzazsKLQl2YWwyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrOwotCWlmIChpbnZlcnQpIHsKLQkJdmFsMSA9IG1hc2sgLSB2YWwxOwotCQl2YWwyID0gbWFzayAtIHZhbDI7Ci0JfQotCXZhbDEgPDw9IHNoaWZ0X2xlZnQ7Ci0JdmFsMiA8PD0gc2hpZnRfcmlnaHQ7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JaWYgKGxlZnRfcmVnICE9IHJpZ2h0X3JlZykgewotCQl2YWwxID0gKGNoaXAtPmltYWdlW2xlZnRfcmVnXSAmIH4obWFzayA8PCBzaGlmdF9sZWZ0KSkgfCB2YWwxOwotCQl2YWwyID0gKGNoaXAtPmltYWdlW3JpZ2h0X3JlZ10gJiB+KG1hc2sgPDwgc2hpZnRfcmlnaHQpKSB8IHZhbDI7Ci0JCWNoYW5nZSA9IHZhbDEgIT0gY2hpcC0+aW1hZ2VbbGVmdF9yZWddIHx8IHZhbDIgIT0gY2hpcC0+aW1hZ2VbcmlnaHRfcmVnXTsKLQkJc25kX2FkMTg0OF9vdXQoY2hpcCwgbGVmdF9yZWcsIHZhbDEpOwotCQlzbmRfYWQxODQ4X291dChjaGlwLCByaWdodF9yZWcsIHZhbDIpOwotCX0gZWxzZSB7Ci0JCXZhbDEgPSAoY2hpcC0+aW1hZ2VbbGVmdF9yZWddICYgfigobWFzayA8PCBzaGlmdF9sZWZ0KSB8IChtYXNrIDw8IHNoaWZ0X3JpZ2h0KSkpIHwgdmFsMSB8IHZhbDI7Ci0JCWNoYW5nZSA9IHZhbDEgIT0gY2hpcC0+aW1hZ2VbbGVmdF9yZWddOwotCQlzbmRfYWQxODQ4X291dChjaGlwLCBsZWZ0X3JlZywgdmFsMSk7CQkKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gY2hhbmdlOwotfQotCi0vKgotICovCi1pbnQgc25kX2FkMTg0OF9hZGRfY3RsX2VsZW0oc3RydWN0IHNuZF9hZDE4NDggKmNoaXAsCi0JCQkgICAgY29uc3Qgc3RydWN0IGFkMTg0OF9taXhfZWxlbSAqYykKLXsKLQlzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmV3Y3Rsc1tdID0gewotCQlbQUQxODQ4X01JWF9TSU5HTEVdID0gewotCQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCQkuaW5mbyA9IHNuZF9hZDE4NDhfaW5mb19zaW5nbGUsCi0JCQkuZ2V0ID0gc25kX2FkMTg0OF9nZXRfc2luZ2xlLAotCQkJLnB1dCA9IHNuZF9hZDE4NDhfcHV0X3NpbmdsZSwKLQkJfSwKLQkJW0FEMTg0OF9NSVhfRE9VQkxFXSA9IHsKLQkJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkJLmluZm8gPSBzbmRfYWQxODQ4X2luZm9fZG91YmxlLAotCQkJLmdldCA9IHNuZF9hZDE4NDhfZ2V0X2RvdWJsZSwKLQkJCS5wdXQgPSBzbmRfYWQxODQ4X3B1dF9kb3VibGUsCi0JCX0sCi0JCVtBRDE4NDhfTUlYX0NBUFRVUkVdID0gewotCQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCQkuaW5mbyA9IHNuZF9hZDE4NDhfaW5mb19tdXgsCi0JCQkuZ2V0ID0gc25kX2FkMTg0OF9nZXRfbXV4LAotCQkJLnB1dCA9IHNuZF9hZDE4NDhfcHV0X211eCwKLQkJfSwKLQl9OwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bDsKLQlpbnQgZXJyOwotCi0JY3RsID0gc25kX2N0bF9uZXcxKCZuZXdjdGxzW2MtPnR5cGVdLCBjaGlwKTsKLQlpZiAoISBjdGwpCi0JCXJldHVybiAtRU5PTUVNOwotCXN0cmxjcHkoY3RsLT5pZC5uYW1lLCBjLT5uYW1lLCBzaXplb2YoY3RsLT5pZC5uYW1lKSk7Ci0JY3RsLT5pZC5pbmRleCA9IGMtPmluZGV4OwotCWN0bC0+cHJpdmF0ZV92YWx1ZSA9IGMtPnByaXZhdGVfdmFsdWU7Ci0JaWYgKGMtPnRsdikgewotCQljdGwtPnZkWzBdLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQ7Ci0JCWN0bC0+dGx2LnAgPSBjLT50bHY7Ci0JfQotCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgY3RsKSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHNuZF9hZDE4NDhfYWRkX2N0bF9lbGVtKTsKLQotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXQsIC05NDUwLCAxNTAsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3JlY19nYWluLCAwLCAxNTAsIDApOwotCi1zdGF0aWMgc3RydWN0IGFkMTg0OF9taXhfZWxlbSBzbmRfYWQxODQ4X2NvbnRyb2xzW10gPSB7Ci1BRDE4NDhfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMCwgQUQxODQ4X0xFRlRfT1VUUFVULCBBRDE4NDhfUklHSFRfT1VUUFVULCA3LCA3LCAxLCAxKSwKLUFEMTg0OF9ET1VCTEVfVExWKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwgQUQxODQ4X0xFRlRfT1VUUFVULCBBRDE4NDhfUklHSFRfT1VUUFVULCAwLCAwLCA2MywgMSwKLQkJICBkYl9zY2FsZV82Yml0KSwKLUFEMTg0OF9ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAwLCBBRDE4NDhfQVVYMV9MRUZUX0lOUFVULCBBRDE4NDhfQVVYMV9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCi1BRDE4NDhfRE9VQkxFX1RMVigiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDAsIEFEMTg0OF9BVVgxX0xFRlRfSU5QVVQsIEFEMTg0OF9BVVgxX1JJR0hUX0lOUFVULCAwLCAwLCAzMSwgMSwKLQkJICBkYl9zY2FsZV81Yml0XzEyZGJfbWF4KSwKLUFEMTg0OF9ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLCBBRDE4NDhfQVVYMl9MRUZUX0lOUFVULCBBRDE4NDhfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCi1BRDE4NDhfRE9VQkxFX1RMVigiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDEsIEFEMTg0OF9BVVgyX0xFRlRfSU5QVVQsIEFEMTg0OF9BVVgyX1JJR0hUX0lOUFVULCAwLCAwLCAzMSwgMSwKLQkJICBkYl9zY2FsZV81Yml0XzEyZGJfbWF4KSwKLUFEMTg0OF9ET1VCTEVfVExWKCJDYXB0dXJlIFZvbHVtZSIsIDAsIEFEMTg0OF9MRUZUX0lOUFVULCBBRDE4NDhfUklHSFRfSU5QVVQsIDAsIDAsIDE1LCAwLAotCQkgIGRiX3NjYWxlX3JlY19nYWluKSwKLXsKLQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCi0JLnR5cGUgPSBBRDE4NDhfTUlYX0NBUFRVUkUsCi19LAotQUQxODQ4X1NJTkdMRSgiTG9vcGJhY2sgQ2FwdHVyZSBTd2l0Y2giLCAwLCBBRDE4NDhfTE9PUEJBQ0ssIDAsIDEsIDApLAotQUQxODQ4X1NJTkdMRV9UTFYoIkxvb3BiYWNrIENhcHR1cmUgVm9sdW1lIiwgMCwgQUQxODQ4X0xPT1BCQUNLLCAxLCA2MywgMCwKLQkJICBkYl9zY2FsZV82Yml0KSwKLX07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbnQgc25kX2FkMTg0OF9taXhlcihzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCWludCBlcnI7Ci0KLQlzbmRfYXNzZXJ0KGNoaXAgIT0gTlVMTCAmJiBjaGlwLT5wY20gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCi0JcGNtID0gY2hpcC0+cGNtOwotCWNhcmQgPSBjaGlwLT5jYXJkOwotCi0Jc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgcGNtLT5uYW1lKTsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfYWQxODQ4X2NvbnRyb2xzKTsgaWR4KyspCi0JCWlmICgoZXJyID0gc25kX2FkMTg0OF9hZGRfY3RsX2VsZW0oY2hpcCwgJnNuZF9hZDE4NDhfY29udHJvbHNbaWR4XSkpIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChzbmRfYWQxODQ4X21peGVyKTsKLQotLyoKLSAqICBJTklUIHBhcnQKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhbHNhX2FkMTg0OF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2FkMTg0OF9leGl0KHZvaWQpCi17Ci19Ci0KLW1vZHVsZV9pbml0KGFsc2FfYWQxODQ4X2luaXQpCi1tb2R1bGVfZXhpdChhbHNhX2FkMTg0OF9leGl0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2F6dDIzMjAuYyBiL3NvdW5kL2lzYS9henQyMzIwLmMKaW5kZXggMTU0ZTcyOC4uM2U3NGQxYSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2F6dDIzMjAuYworKysgYi9zb3VuZC9pc2EvYXp0MjMyMC5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL2NzNDIzMS5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KIApAQCAtNzYsNyArNzYsNyBAQAogCWludCBkZXZfbm87CiAJc3RydWN0IHBucF9kZXYgKmRldjsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2bXB1OwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOworCXN0cnVjdCBzbmRfd3NzICpjaGlwOwogfTsKIAogc3RhdGljIHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgc25kX2F6dDIzMjBfcG5waWRzW10gPSB7CkBAIC0xODEsNyArMTgxLDcgQEAKIAlpbnQgZXJyb3I7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfY2FyZF9henQyMzIwICphY2FyZDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAKIAlpZiAoKGNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCkBAIC0yMDAsMTEgKzIwMCwxMSBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKChlcnJvciA9IHNuZF9jczQyMzFfY3JlYXRlKGNhcmQsIHdzc19wb3J0W2Rldl0sIC0xLAotCQkJCSAgICAgICBpcnFbZGV2XSwKLQkJCQkgICAgICAgZG1hMVtkZXZdLAotCQkJCSAgICAgICBkbWEyW2Rldl0sCi0JCQkJICAgICAgIENTNDIzMV9IV19ERVRFQ1QsIDAsICZjaGlwKSkgPCAwKSB7CisJZXJyb3IgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLCB3c3NfcG9ydFtkZXZdLCAtMSwKKwkJCSAgICAgICBpcnFbZGV2XSwKKwkJCSAgICAgICBkbWExW2Rldl0sIGRtYTJbZGV2XSwKKwkJCSAgICAgICBXU1NfSFdfREVURUNULCAwLCAmY2hpcCk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMjE0LDE1ICsyMTQsMTggQEAKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMsIFdTUyBhdCAweCVseCwgaXJxICVpLCBkbWEgJWkmJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPnBvcnQsIGlycVtkZXZdLCBkbWExW2Rldl0sIGRtYTJbZGV2XSk7CiAKLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV9wY20oY2hpcCwgMCwgTlVMTCkpIDwgMCkgeworCWVycm9yID0gc25kX3dzc19wY20oY2hpcCwgMCwgTlVMTCk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCWlmICgoZXJyb3IgPSBzbmRfY3M0MjMxX21peGVyKGNoaXApKSA8IDApIHsKKwllcnJvciA9IHNuZF93c3NfbWl4ZXIoY2hpcCk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCWlmICgoZXJyb3IgPSBzbmRfY3M0MjMxX3RpbWVyKGNoaXAsIDAsIE5VTEwpKSA8IDApIHsKKwllcnJvciA9IHNuZF93c3NfdGltZXIoY2hpcCwgMCwgTlVMTCk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMjkzLDcgKzI5Niw3IEBACiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcG5wX2dldF9jYXJkX2RydmRhdGEocGNhcmQpOwogCXN0cnVjdCBzbmRfY2FyZF9henQyMzIwICphY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IGFjYXJkLT5jaGlwOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gYWNhcmQtPmNoaXA7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CiAJY2hpcC0+c3VzcGVuZChjaGlwKTsKQEAgLTMwNCw3ICszMDcsNyBAQAogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBucF9nZXRfY2FyZF9kcnZkYXRhKHBjYXJkKTsKIAlzdHJ1Y3Qgc25kX2NhcmRfYXp0MjMyMCAqYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBhY2FyZC0+Y2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IGFjYXJkLT5jaGlwOwogCiAJY2hpcC0+cmVzdW1lKGNoaXApOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jbWk4MzMwLmMgYi9zb3VuZC9pc2EvY21pODMzMC5jCmluZGV4IDRkMTk4ZWMuLmU0OWFlYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jbWk4MzMwLmMKKysrIGIvc291bmQvaXNhL2NtaTgzMzAuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2FkMTg0OC5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCkBAIC0xNTEsNyArMTUxLDcgQEAKIAlzdHJ1Y3QgcG5wX2RldiAqcGxheTsKICNlbmRpZgogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2FkMTg0OCAqd3NzOworCXN0cnVjdCBzbmRfd3NzICp3c3M7CiAJc3RydWN0IHNuZF9zYiAqc2I7CiAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwpAQCAtMTc0LDMyICsxNzQsNTcgQEAKICNlbmRpZgogCiAKLXN0YXRpYyBzdHJ1Y3QgYWQxODQ4X21peF9lbGVtIHNuZF9jbWk4MzMwX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKLUFEMTg0OF9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAwLCBDTUk4MzMwX01BU1RWT0wsIENNSTgzMzBfTUFTVFZPTCwgNCwgMCwgMTUsIDApLAotQUQxODQ4X1NJTkdMRSgiTG91ZCBQbGF5YmFjayBTd2l0Y2giLCAwLCBDTUk4MzMwX01VVEVNVVgsIDYsIDEsIDEpLAotQUQxODQ4X0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsIEFEMTg0OF9MRUZUX09VVFBVVCwgQUQxODQ4X1JJR0hUX09VVFBVVCwgNywgNywgMSwgMSksCi1BRDE4NDhfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwgQUQxODQ4X0xFRlRfT1VUUFVULCBBRDE4NDhfUklHSFRfT1VUUFVULCAwLCAwLCA2MywgMSksCi1BRDE4NDhfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDAsIENNSTgzMzBfTVVURU1VWCwgQ01JODMzMF9NVVRFTVVYLCA0LCAzLCAxLCAwKSwKLUFEMTg0OF9ET1VCTEUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ01JODMzMF9MSU5WT0wsIENNSTgzMzBfTElOVk9MLCA0LCAwLCAxNSwgMCksCi1BRDE4NDhfRE9VQkxFKCJMaW5lIENhcHR1cmUgU3dpdGNoIiwgMCwgQ01JODMzMF9STVVYM0QsIENNSTgzMzBfUk1VWDNELCAyLCAxLCAxLCAwKSwKLUFEMTg0OF9ET1VCTEUoIkxpbmUgQ2FwdHVyZSBWb2x1bWUiLCAwLCBDTUk4MzMwX0xJTkdBSU4sIENNSTgzMzBfTElOR0FJTiwgNCwgMCwgMTUsIDApLAotQUQxODQ4X0RPVUJMRSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ01JODMzMF9NVVRFTVVYLCBDTUk4MzMwX01VVEVNVVgsIDIsIDEsIDEsIDApLAotQUQxODQ4X0RPVUJMRSgiQ0QgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDTUk4MzMwX1JNVVgzRCwgQ01JODMzMF9STVVYM0QsIDQsIDMsIDEsIDApLAotQUQxODQ4X0RPVUJMRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ01JODMzMF9DRElOVk9MLCBDTUk4MzMwX0NESU5WT0wsIDQsIDAsIDE1LCAwKSwKLUFEMTg0OF9ET1VCTEUoIkNEIENhcHR1cmUgVm9sdW1lIiwgMCwgQ01JODMzMF9DRElOR0FJTiwgQ01JODMzMF9DRElOR0FJTiwgNCwgMCwgMTUsIDApLAotQUQxODQ4X1NJTkdMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsIENNSTgzMzBfTVVURU1VWCwgMCwgMSwgMCksCi1BRDE4NDhfU0lOR0xFKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ01JODMzMF9PVVRQVVRWT0wsIDAsIDcsIDApLAotQUQxODQ4X1NJTkdMRSgiTWljIENhcHR1cmUgU3dpdGNoIiwgMCwgQ01JODMzMF9STVVYM0QsIDAsIDEsIDApLAotQUQxODQ4X1NJTkdMRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMCwgQ01JODMzMF9PVVRQVVRWT0wsIDUsIDcsIDApLAotQUQxODQ4X0RPVUJMRSgiV2F2ZXRhYmxlIFBsYXliYWNrIFN3aXRjaCIsIDAsIENNSTgzMzBfUkVDTVVYLCBDTUk4MzMwX1JFQ01VWCwgMSwgMCwgMSwgMCksCi1BRDE4NDhfRE9VQkxFKCJXYXZldGFibGUgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ01JODMzMF9XQVZWT0wsIENNSTgzMzBfV0FWVk9MLCA0LCAwLCAxNSwgMCksCi1BRDE4NDhfRE9VQkxFKCJXYXZldGFibGUgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDTUk4MzMwX1JFQ01VWCwgQ01JODMzMF9SRUNNVVgsIDUsIDQsIDEsIDApLAotQUQxODQ4X0RPVUJMRSgiV2F2ZXRhYmxlIENhcHR1cmUgVm9sdW1lIiwgMCwgQ01JODMzMF9XQVZHQUlOLCBDTUk4MzMwX1dBVkdBSU4sIDQsIDAsIDE1LCAwKSwKLUFEMTg0OF9TSU5HTEUoIjNEIENvbnRyb2wgLSBTd2l0Y2giLCAwLCBDTUk4MzMwX1JNVVgzRCwgNSwgMSwgMSksCi1BRDE4NDhfU0lOR0xFKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDAsIENNSTgzMzBfT1VUUFVUVk9MLCAzLCAzLCAwKSwKLUFEMTg0OF9TSU5HTEUoIkZNIFBsYXliYWNrIFN3aXRjaCIsIDAsIENNSTgzMzBfUkVDTVVYLCAzLCAxLCAxKSwKLUFEMTg0OF9TSU5HTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJJbnB1dCAiLENBUFRVUkUsU1dJVENIKSwgMCwgQ01JODMzMF9STVVYM0QsIDcsIDEsIDEpLAotQUQxODQ4X1NJTkdMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIklucHV0ICIsUExBWUJBQ0ssU1dJVENIKSwgMCwgQ01JODMzMF9NVVRFTVVYLCA3LCAxLCAxKSwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY21pODMzMF9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitXU1NfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ01JODMzMF9NQVNUVk9MLCBDTUk4MzMwX01BU1RWT0wsIDQsIDAsIDE1LCAwKSwKK1dTU19TSU5HTEUoIkxvdWQgUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJQ01JODMzMF9NVVRFTVVYLCA2LCAxLCAxKSwKK1dTU19ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiUENNIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgMCwgMCwgNjMsIDEpLAorV1NTX0RPVUJMRSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDTUk4MzMwX01VVEVNVVgsIENNSTgzMzBfTVVURU1VWCwgNCwgMywgMSwgMCksCitXU1NfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfTElOVk9MLCBDTUk4MzMwX0xJTlZPTCwgNCwgMCwgMTUsIDApLAorV1NTX0RPVUJMRSgiTGluZSBDYXB0dXJlIFN3aXRjaCIsIDAsCisJCUNNSTgzMzBfUk1VWDNELCBDTUk4MzMwX1JNVVgzRCwgMiwgMSwgMSwgMCksCitXU1NfRE9VQkxFKCJMaW5lIENhcHR1cmUgVm9sdW1lIiwgMCwKKwkJQ01JODMzMF9MSU5HQUlOLCBDTUk4MzMwX0xJTkdBSU4sIDQsIDAsIDE1LCAwKSwKK1dTU19ET1VCTEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNNSTgzMzBfTVVURU1VWCwgQ01JODMzMF9NVVRFTVVYLCAyLCAxLCAxLCAwKSwKK1dTU19ET1VCTEUoIkNEIENhcHR1cmUgU3dpdGNoIiwgMCwKKwkJQ01JODMzMF9STVVYM0QsIENNSTgzMzBfUk1VWDNELCA0LCAzLCAxLCAwKSwKK1dTU19ET1VCTEUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfQ0RJTlZPTCwgQ01JODMzMF9DRElOVk9MLCA0LCAwLCAxNSwgMCksCitXU1NfRE9VQkxFKCJDRCBDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfQ0RJTkdBSU4sIENNSTgzMzBfQ0RJTkdBSU4sIDQsIDAsIDE1LCAwKSwKK1dTU19TSU5HTEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDTUk4MzMwX01VVEVNVVgsIDAsIDEsIDApLAorV1NTX1NJTkdMRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfT1VUUFVUVk9MLCAwLCA3LCAwKSwKK1dTU19TSU5HTEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIDAsCisJCUNNSTgzMzBfUk1VWDNELCAwLCAxLCAwKSwKK1dTU19TSU5HTEUoIk1pYyBDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfT1VUUFVUVk9MLCA1LCA3LCAwKSwKK1dTU19ET1VCTEUoIldhdmV0YWJsZSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDTUk4MzMwX1JFQ01VWCwgQ01JODMzMF9SRUNNVVgsIDEsIDAsIDEsIDApLAorV1NTX0RPVUJMRSgiV2F2ZXRhYmxlIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfV0FWVk9MLCBDTUk4MzMwX1dBVlZPTCwgNCwgMCwgMTUsIDApLAorV1NTX0RPVUJMRSgiV2F2ZXRhYmxlIENhcHR1cmUgU3dpdGNoIiwgMCwKKwkJQ01JODMzMF9SRUNNVVgsIENNSTgzMzBfUkVDTVVYLCA1LCA0LCAxLCAwKSwKK1dTU19ET1VCTEUoIldhdmV0YWJsZSBDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNNSTgzMzBfV0FWR0FJTiwgQ01JODMzMF9XQVZHQUlOLCA0LCAwLCAxNSwgMCksCitXU1NfU0lOR0xFKCIzRCBDb250cm9sIC0gU3dpdGNoIiwgMCwKKwkJQ01JODMzMF9STVVYM0QsIDUsIDEsIDEpLAorV1NTX1NJTkdMRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlDTUk4MzMwX09VVFBVVFZPTCwgMywgMywgMCksCitXU1NfU0lOR0xFKCJGTSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDTUk4MzMwX1JFQ01VWCwgMywgMSwgMSksCitXU1NfU0lOR0xFKFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiSW5wdXQgIiwgQ0FQVFVSRSwgU1dJVENIKSwgMCwKKwkJQ01JODMzMF9STVVYM0QsIDcsIDEsIDEpLAorV1NTX1NJTkdMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIklucHV0ICIsIFBMQVlCQUNLLCBTV0lUQ0gpLCAwLAorCQlDTUk4MzMwX01VVEVNVVgsIDcsIDEsIDEpLAogfTsKIAogI2lmZGVmIEVOQUJMRV9TQl9NSVhFUgpAQCAtMjY4LDcgKzI5MywxMCBAQAogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJDTUk4MzMwL0MzRCIpOwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9jbWk4MzMwX2NvbnRyb2xzKTsgaWR4KyspIHsKLQkJaWYgKChlcnIgPSBzbmRfYWQxODQ4X2FkZF9jdGxfZWxlbShhY2FyZC0+d3NzLCAmc25kX2NtaTgzMzBfY29udHJvbHNbaWR4XSkpIDwgMCkKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCQlzbmRfY3RsX25ldzEoJnNuZF9jbWk4MzMwX2NvbnRyb2xzW2lkeF0sCisJCQkJCSAgICAgYWNhcmQtPndzcykpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zODUsNyArNDEzLDcgQEAKIAljaGlwLT5zdHJlYW1zW0NNSV9TQl9TVFJFQU1dLnByaXZhdGVfZGF0YSA9IGNoaXAtPnNiOwogCiAJLyogQUQxODQ4ICovCi0Jb3BzID0gc25kX2FkMTg0OF9nZXRfcGNtX29wcyhDTUlfQURfU1RSRUFNKTsKKwlvcHMgPSBzbmRfd3NzX2dldF9wY21fb3BzKENNSV9BRF9TVFJFQU0pOwogCWNoaXAtPnN0cmVhbXNbQ01JX0FEX1NUUkVBTV0ub3BzID0gKm9wczsKIAljaGlwLT5zdHJlYW1zW0NNSV9BRF9TVFJFQU1dLm9wZW4gPSBvcHMtPm9wZW47CiAJY2hpcC0+c3RyZWFtc1tDTUlfQURfU1RSRUFNXS5vcHMub3BlbiA9IGNtaV9vcGVuX2NhbGxiYWNrc1tDTUlfQURfU1RSRUFNXTsKQEAgLTQ2MSwxNiArNDg5LDE1IEBACiAJaW50IGksIGVycjsKIAogCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwotCWlmICgoZXJyID0gc25kX2FkMTg0OF9jcmVhdGUoY2FyZCwKLQkJCQkgICAgIHdzc3BvcnRbZGV2XSArIDQsCi0JCQkJICAgICB3c3NpcnFbZGV2XSwKLQkJCQkgICAgIHdzc2RtYVtkZXZdLAotCQkJCSAgICAgQUQxODQ4X0hXX0RFVEVDVCwKLQkJCQkgICAgICZhY2FyZC0+d3NzKSkgPCAwKSB7CisJZXJyID0gc25kX3dzc19jcmVhdGUoY2FyZCwgd3NzcG9ydFtkZXZdICsgNCwgLTEsCisJCQkgICAgIHdzc2lycVtkZXZdLAorCQkJICAgICB3c3NkbWFbZGV2XSwgLTEsCisJCQkgICAgIFdTU19IV19ERVRFQ1QsIDAsICZhY2FyZC0+d3NzKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiKEFEMTg0OCkgZGV2aWNlIGJ1c3k/P1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmIChhY2FyZC0+d3NzLT5oYXJkd2FyZSAhPSBBRDE4NDhfSFdfQ01JODMzMCkgeworCWlmIChhY2FyZC0+d3NzLT5oYXJkd2FyZSAhPSBXU1NfSFdfQ01JODMzMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiKEFEMTg0OCkgbm90IGZvdW5kIGR1cmluZyBwcm9iZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTQ4OSw5ICs1MTYsMTAgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzbmRfYWQxODQ4X291dChhY2FyZC0+d3NzLCBBRDE4NDhfTUlTQ19JTkZPLCAweDQwKTsgLyogc3dpdGNoIG9uIE1PREUyICovCisJc25kX3dzc19vdXQoYWNhcmQtPndzcywgQ1M0MjMxX01JU0NfSU5GTywgMHg0MCk7IC8qIHN3aXRjaCBvbiBNT0RFMiAqLwogCWZvciAoaSA9IENNSTgzMzBfUk1VWDNEOyBpIDw9IENNSTgzMzBfQ0RJTkdBSU47IGkrKykKLQkJc25kX2FkMTg0OF9vdXQoYWNhcmQtPndzcywgaSwgc25kX2NtaTgzMzBfaW1hZ2VbaSAtIENNSTgzMzBfUk1VWDNEXSk7CisJCXNuZF93c3Nfb3V0KGFjYXJkLT53c3MsIGksCisJCQkgICAgc25kX2NtaTgzMzBfaW1hZ2VbaSAtIENNSTgzMzBfUk1VWDNEXSk7CiAKIAlpZiAoKGVyciA9IHNuZF9jbWk4MzMwX21peGVyKGNhcmQsIGFjYXJkKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIG1peGVyc1xuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L01ha2VmaWxlIGIvc291bmQvaXNhL2NzNDIzeC9NYWtlZmlsZQppbmRleCA1MDY3ZWUwLi41ODcwY2EyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L01ha2VmaWxlCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvTWFrZWZpbGUKQEAgLTMsMTQgKzMsMTIgQEAKICMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CiAjCiAKLXNuZC1jczQyMzEtbGliLW9ianMgOj0gY3M0MjMxX2xpYi5vCiBzbmQtY3M0MjM2LWxpYi1vYmpzIDo9IGNzNDIzNl9saWIubwogc25kLWNzNDIzMS1vYmpzIDo9IGNzNDIzMS5vCiBzbmQtY3M0MjMyLW9ianMgOj0gY3M0MjMyLm8KIHNuZC1jczQyMzYtb2JqcyA6PSBjczQyMzYubwogCiAjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5Ci1vYmotJChDT05GSUdfU05EX0NTNDIzMV9MSUIpICs9IHNuZC1jczQyMzEtbGliLm8KIG9iai0kKENPTkZJR19TTkRfQ1M0MjMxKSArPSBzbmQtY3M0MjMxLm8KIG9iai0kKENPTkZJR19TTkRfQ1M0MjMyKSArPSBzbmQtY3M0MjMyLm8KIG9iai0kKENPTkZJR19TTkRfQ1M0MjM2KSArPSBzbmQtY3M0MjM2Lm8gc25kLWNzNDIzNi1saWIubwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKaW5kZXggZTk0NjJiOS4uZGRkMjg5MSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NzNDIzMS5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIApAQCAtOTEsNyArOTEsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2NzNDIzMV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnJvcjsKIApAQCAtOTksMTQgKzk5LDE0IEBACiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVycm9yID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwgcG9ydFtuXSwgLTEsIGlycVtuXSwgZG1hMVtuXSwgZG1hMltuXSwKLQkJCUNTNDIzMV9IV19ERVRFQ1QsIDAsICZjaGlwKTsKKwllcnJvciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsIHBvcnRbbl0sIC0xLCBpcnFbbl0sIGRtYTFbbl0sIGRtYTJbbl0sCisJCQlXU1NfSFdfREVURUNULCAwLCAmY2hpcCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0JZXJyb3IgPSBzbmRfY3M0MjMxX3BjbShjaGlwLCAwLCAmcGNtKTsKKwllcnJvciA9IHNuZF93c3NfcGNtKGNoaXAsIDAsICZwY20pOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0xMTgsMTEgKzExOCwxMSBAQAogCWlmIChkbWEyW25dID49IDApCiAJCXNwcmludGYoY2FyZC0+bG9uZ25hbWUgKyBzdHJsZW4oY2FyZC0+bG9uZ25hbWUpLCAiJiVkIiwgZG1hMltuXSk7CiAKLQllcnJvciA9IHNuZF9jczQyMzFfbWl4ZXIoY2hpcCk7CisJZXJyb3IgPSBzbmRfd3NzX21peGVyKGNoaXApOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBzbmRfY3M0MjMxX3RpbWVyKGNoaXAsIDAsIE5VTEwpOworCWVycm9yID0gc25kX3dzc190aW1lcihjaGlwLCAwLCBOVUxMKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTYwLDcgKzE2MCw3IEBACiBzdGF0aWMgaW50IHNuZF9jczQyMzFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CiAJY2hpcC0+c3VzcGVuZChjaGlwKTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIGludCBzbmRfY3M0MjMxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJY2hpcC0+cmVzdW1lKGNoaXApOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxX2xpYi5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzFfbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWRiNzAuLjAwMDAwMDAKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzFfbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ1ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgotICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIENTNDIzMShBKS9DUzQyMzIvSW50ZXJXYXZlICYgY29tcGF0aWJsZSBjaGlwcwotICoKLSAqICBCdWdzOgotICogICAgIC0gc29tZXRpbWVzIHJlY29yZCBicm9rZXMgcGxheWJhY2sgd2l0aCBXU1MgcG9ydGlvbiBvZiAKLSAqICAgICAgIFlhbWFoYSBPUEwzLVNBMyBjaGlwCi0gKiAgICAgLSBDUzQyMzEgKEdVUyBNQVgpIC0gc3RpbGwgdHJvdWJsZSB3aXRoIG9jY2FzaW9uYWwgbm9pc2VzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIC0gYnJva2VuIGluaXRpYWxpemF0aW9uPwotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9jczQyMzEuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1NT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBDUzQyMzEoQSkvQ1M0MjMyL0ludGVyV2F2ZSAmIGNvbXBhdGlibGUgY2hpcHMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2lmIDAKLSNkZWZpbmUgU05EUlZfREVCVUdfTUNFCi0jZW5kaWYKLQotLyoKLSAqICBTb21lIHZhcmlhYmxlcwotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGZyZXFfYml0c1sxNF0gPSB7Ci0JLyogNTUxMCAqLwkweDAwIHwgQ1M0MjMxX1hUQUwyLAotCS8qIDY2MjAgKi8JMHgwRSB8IENTNDIzMV9YVEFMMiwKLQkvKiA4MDAwICovCTB4MDAgfCBDUzQyMzFfWFRBTDEsCi0JLyogOTYwMCAqLwkweDBFIHwgQ1M0MjMxX1hUQUwxLAotCS8qIDExMDI1ICovCTB4MDIgfCBDUzQyMzFfWFRBTDIsCi0JLyogMTYwMDAgKi8JMHgwMiB8IENTNDIzMV9YVEFMMSwKLQkvKiAxODkwMCAqLwkweDA0IHwgQ1M0MjMxX1hUQUwyLAotCS8qIDIyMDUwICovCTB4MDYgfCBDUzQyMzFfWFRBTDIsCi0JLyogMjcwNDIgKi8JMHgwNCB8IENTNDIzMV9YVEFMMSwKLQkvKiAzMjAwMCAqLwkweDA2IHwgQ1M0MjMxX1hUQUwxLAotCS8qIDMzMDc1ICovCTB4MEMgfCBDUzQyMzFfWFRBTDIsCi0JLyogMzc4MDAgKi8JMHgwOCB8IENTNDIzMV9YVEFMMiwKLQkvKiA0NDEwMCAqLwkweDBBIHwgQ1M0MjMxX1hUQUwyLAotCS8qIDQ4MDAwICovCTB4MEMgfCBDUzQyMzFfWFRBTDEKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbMTRdID0gewotCTU1MTAsIDY2MjAsIDgwMDAsIDk2MDAsIDExMDI1LCAxNjAwMCwgMTg5MDAsIDIyMDUwLAotCTI3MDQyLCAzMjAwMCwgMzMwNzUsIDM3ODAwLCA0NDEwMCwgNDgwMDAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgaHdfY29uc3RyYWludHNfcmF0ZXMgPSB7Ci0JLmNvdW50ID0gQVJSQVlfU0laRShyYXRlcyksCi0JLmxpc3QgPSByYXRlcywKLQkubWFzayA9IDAsCi19OwotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfeHJhdGUoc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKLXsKLQlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsICZod19jb25zdHJhaW50c19yYXRlcyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jczQyMzFfb3JpZ2luYWxfaW1hZ2VbMzJdID0KLXsKLQkweDAwLAkJCS8qIDAwLzAwIC0gbGljICovCi0JMHgwMCwJCQkvKiAwMS8wMSAtIHJpYyAqLwotCTB4OWYsCQkJLyogMDIvMDIgLSBsYTFpYyAqLwotCTB4OWYsCQkJLyogMDMvMDMgLSByYTFpYyAqLwotCTB4OWYsCQkJLyogMDQvMDQgLSBsYTJpYyAqLwotCTB4OWYsCQkJLyogMDUvMDUgLSByYTJpYyAqLwotCTB4YmYsCQkJLyogMDYvMDYgLSBsb2MgKi8KLQkweGJmLAkJCS8qIDA3LzA3IC0gcm9jICovCi0JMHgyMCwJCQkvKiAwOC8wOCAtIHBkZnIgKi8KLQlDUzQyMzFfQVVUT0NBTElCLAkvKiAwOS8wOSAtIGljICovCi0JMHgwMCwJCQkvKiAwYS8xMCAtIHBjICovCi0JMHgwMCwJCQkvKiAwYi8xMSAtIHRpICovCi0JQ1M0MjMxX01PREUyLAkJLyogMGMvMTIgLSBtaSAqLwotCTB4ZmMsCQkJLyogMGQvMTMgLSBsYmMgKi8KLQkweDAwLAkJCS8qIDBlLzE0IC0gcGJydSAqLwotCTB4MDAsCQkJLyogMGYvMTUgLSBwYnJsICovCi0JMHg4MCwJCQkvKiAxMC8xNiAtIGFmZWkgKi8KLQkweDAxLAkJCS8qIDExLzE3IC0gYWZlaWkgKi8KLQkweDlmLAkJCS8qIDEyLzE4IC0gbGxpYyAqLwotCTB4OWYsCQkJLyogMTMvMTkgLSBybGljICovCi0JMHgwMCwJCQkvKiAxNC8yMCAtIHRsYiAqLwotCTB4MDAsCQkJLyogMTUvMjEgLSB0aGIgKi8KLQkweDAwLAkJCS8qIDE2LzIyIC0gbGEzbWljL3Jlc2VydmVkICovCi0JMHgwMCwJCQkvKiAxNy8yMyAtIHJhM21pYy9yZXNlcnZlZCAqLwotCTB4MDAsCQkJLyogMTgvMjQgLSBhZnMgKi8KLQkweDAwLAkJCS8qIDE5LzI1IC0gbGFtb2MvdmVyc2lvbiAqLwotCTB4Y2YsCQkJLyogMWEvMjYgLSBtaW9jICovCi0JMHgwMCwJCQkvKiAxYi8yNyAtIHJhbW9jL3Jlc2VydmVkICovCi0JMHgyMCwJCQkvKiAxYy8yOCAtIGNkZnIgKi8KLQkweDAwLAkJCS8qIDFkLzI5IC0gcmVzNCAqLwotCTB4MDAsCQkJLyogMWUvMzAgLSBjYnJ1ICovCi0JMHgwMCwJCQkvKiAxZi8zMSAtIGNicmwgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlWzMyXSA9Ci17Ci0JMHgwMCwJCS8qIDAwLzAwIC0gbF9taXhvdXRfb3V0Y3RybCAqLwotCTB4MDAsCQkvKiAwMS8wMSAtIHJfbWl4b3V0X291dGN0cmwgKi8KLQkweDg4LAkJLyogMDIvMDIgLSBsX2NkX2luY3RybCAqLwotCTB4ODgsCQkvKiAwMy8wMyAtIHJfY2RfaW5jdHJsICovCi0JMHg4OCwJCS8qIDA0LzA0IC0gbF9hMS9mbV9pbmN0cmwgKi8KLQkweDg4LAkJLyogMDUvMDUgLSByX2ExL2ZtX2luY3RybCAqLwotCTB4ODAsCQkvKiAwNi8wNiAtIGxfZGFjX2luY3RybCAqLwotCTB4ODAsCQkvKiAwNy8wNyAtIHJfZGFjX2luY3RybCAqLwotCTB4MDAsCQkvKiAwOC8wOCAtIHBseV9kYXRhZm9ybV9yZWcgKi8KLQkweDAwLAkJLyogMDkvMDkgLSBpZl9jb25mICovCi0JMHgwMCwJCS8qIDBhLzEwIC0gcGluX2N0cmwgKi8KLQkweDAwLAkJLyogMGIvMTEgLSBlcnJfaW5pdF9yZWcgKi8KLQkweDBhLAkJLyogMGMvMTIgLSBpZF9yZWcgKi8KLQkweDAwLAkJLyogMGQvMTMgLSByZXNlcnZlZCAqLwotCTB4MDAsCQkvKiAwZS8xNCAtIHBseV91cGNvdW50X3JlZyAqLwotCTB4MDAsCQkvKiAwZi8xNSAtIHBseV9sb3djb3VudF9yZWcgKi8KLQkweDg4LAkJLyogMTAvMTYgLSByZXNlcnZlZC9sX2ExX2luY3RybCAqLwotCTB4ODgsCQkvKiAxMS8xNyAtIHJlc2VydmVkL3JfYTFfaW5jdHJsICovCi0JMHg4OCwJCS8qIDEyLzE4IC0gbF9saW5lX2luY3RybCAqLwotCTB4ODgsCQkvKiAxMy8xOSAtIHJfbGluZV9pbmN0cmwgKi8KLQkweDg4LAkJLyogMTQvMjAgLSBsX21pY19pbmN0cmwgKi8KLQkweDg4LAkJLyogMTUvMjEgLSByX21pY19pbmN0cmwgKi8KLQkweDgwLAkJLyogMTYvMjIgLSBsX291dF9vdXRjdHJsICovCi0JMHg4MCwJCS8qIDE3LzIzIC0gcl9vdXRfb3V0Y3RybCAqLwotCTB4MDAsCQkvKiAxOC8yNCAtIHJlc2VydmVkICovCi0JMHgwMCwJCS8qIDE5LzI1IC0gcmVzZXJ2ZWQgKi8KLQkweDAwLAkJLyogMWEvMjYgLSByZXNlcnZlZCAqLwotCTB4MDAsCQkvKiAxYi8yNyAtIHJlc2VydmVkICovCi0JMHgwMCwJCS8qIDFjLzI4IC0gY2FwX2RhdGFmb3JtX3JlZyAqLwotCTB4MDAsCQkvKiAxZC8yOSAtIHJlc2VydmVkICovCi0JMHgwMCwJCS8qIDFlLzMwIC0gY2FwX3VwY291bnRfcmVnICovCi0JMHgwMAkJLyogMWYvMzEgLSBjYXBfbG93Y291bnRfcmVnICovCi19OwotCi0vKgotICogIEJhc2ljIEkvTyBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3M0MjMxX291dGIoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHU4IG9mZnNldCwgdTggdmFsKQotewotCW91dGIodmFsLCBjaGlwLT5wb3J0ICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGlubGluZSB1OCBjczQyMzFfaW5iKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1OCBvZmZzZXQpCi17Ci0JcmV0dXJuIGluYihjaGlwLT5wb3J0ICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgc25kX2NzNDIzMV93YWl0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQotewotCWludCB0aW1lb3V0OwotCi0JZm9yICh0aW1lb3V0ID0gMjUwOwotCSAgICAgdGltZW91dCA+IDAgJiYgKGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKTsKLQkgICAgIHRpbWVvdXQtLSkKLQkgICAgIAl1ZGVsYXkoMTAwKTsKLX0KLQotc3RhdGljIHZvaWQgc25kX2NzNDIzMV9vdXRtKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywKLQkJCSAgICB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciB0bXAgPSAoY2hpcC0+aW1hZ2VbcmVnXSAmIG1hc2spIHwgdmFsdWU7Ci0KLQlzbmRfY3M0MjMxX3dhaXQoY2hpcCk7Ci0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCWlmIChjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKLQkJc25kX3ByaW50aygib3V0bTogYXV0byBjYWxpYnJhdGlvbiB0aW1lIG91dCAtIHJlZyA9IDB4JXgsIHZhbHVlID0gMHgleFxuIiwgcmVnLCB2YWx1ZSk7Ci0jZW5kaWYKLQljaGlwLT5pbWFnZVtyZWddID0gdG1wOwotCWlmICghY2hpcC0+Y2FsaWJyYXRlX211dGUpIHsKLQkJY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpLCBjaGlwLT5tY2VfYml0IHwgcmVnKTsKLQkJd21iKCk7Ci0JCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwgdG1wKTsKLQkJbWIoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9jczQyMzFfZG91dChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCi17Ci0JaW50IHRpbWVvdXQ7Ci0KLQlmb3IgKHRpbWVvdXQgPSAyNTA7Ci0JICAgICB0aW1lb3V0ID4gMCAmJiAoY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpOwotCSAgICAgdGltZW91dC0tKQotCSAgICAgCXVkZWxheSgxMCk7Ci0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpLCBjaGlwLT5tY2VfYml0IHwgcmVnKTsKLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFJFRyksIHZhbHVlKTsKLQltYigpOwotfQotCi12b2lkIHNuZF9jczQyMzFfb3V0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKLXsKLQlzbmRfY3M0MjMxX3dhaXQoY2hpcCk7Ci0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCWlmIChjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKLQkJc25kX3ByaW50aygib3V0OiBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0IC0gcmVnID0gMHgleCwgdmFsdWUgPSAweCV4XG4iLCByZWcsIHZhbHVlKTsKLSNlbmRpZgotCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8IHJlZyk7Ci0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUcpLCB2YWx1ZSk7Ci0JY2hpcC0+aW1hZ2VbcmVnXSA9IHZhbHVlOwotCW1iKCk7Ci0Jc25kX3ByaW50ZGQoImNvZGVjIG91dCAtIHJlZyAweCV4ID0gMHgleFxuIiwKLQkJCWNoaXAtPm1jZV9iaXQgfCByZWcsIHZhbHVlKTsKLX0KLQotdW5zaWduZWQgY2hhciBzbmRfY3M0MjMxX2luKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZykKLXsKLQlzbmRfY3M0MjMxX3dhaXQoY2hpcCk7Ci0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCWlmIChjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKLQkJc25kX3ByaW50aygiaW46IGF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgLSByZWcgPSAweCV4XG4iLCByZWcpOwotI2VuZGlmCi0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpLCBjaGlwLT5tY2VfYml0IHwgcmVnKTsKLQltYigpOwotCXJldHVybiBjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHKSk7Ci19Ci0KLXZvaWQgc25kX2NzNDIzNl9leHRfb3V0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCi17Ci0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpLCBjaGlwLT5tY2VfYml0IHwgMHgxNyk7Ci0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChSRUcpLCByZWcgfCAoY2hpcC0+aW1hZ2VbQ1M0MjM2X0VYVF9SRUddICYgMHgwMSkpOwotCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwgdmFsKTsKLQljaGlwLT5laW1hZ2VbQ1M0MjM2X1JFRyhyZWcpXSA9IHZhbDsKLSNpZiAwCi0JcHJpbnRrKCJleHQgb3V0IDogcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpOwotI2VuZGlmCi19Ci0KLXVuc2lnbmVkIGNoYXIgc25kX2NzNDIzNl9leHRfaW4oc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnKQotewotCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8IDB4MTcpOwotCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwgcmVnIHwgKGNoaXAtPmltYWdlW0NTNDIzNl9FWFRfUkVHXSAmIDB4MDEpKTsKLSNpZiAxCi0JcmV0dXJuIGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUcpKTsKLSNlbHNlCi0JewotCQl1bnNpZ25lZCBjaGFyIHJlczsKLQkJcmVzID0gY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFRykpOwotCQlwcmludGsoImV4dCBpbiA6IHJlZyA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHJlZywgcmVzKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0jZW5kaWYKLX0KLQotI2lmIDAKLQotc3RhdGljIHZvaWQgc25kX2NzNDIzMV9kZWJ1ZyhzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCkKLXsKLQlwcmludGsoIkNTNDIzMSBSRUdTOiAgICAgIElOREVYID0gMHglMDJ4ICAiLCBjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkpOwotCXByaW50aygiICAgICAgICAgICAgICAgICBTVEFUVVMgPSAweCUwMnhcbiIsIGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChTVEFUVVMpKSk7Ci0JcHJpbnRrKCIgIDB4MDA6IGxlZnQgaW5wdXQgICAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDAwKSk7Ci0JcHJpbnRrKCIgIDB4MTA6IGFsdCAxIChDRklHIDIpICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDEwKSk7Ci0JcHJpbnRrKCIgIDB4MDE6IHJpZ2h0IGlucHV0ICAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDAxKSk7Ci0JcHJpbnRrKCIgIDB4MTE6IGFsdCAyIChDRklHIDMpICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDExKSk7Ci0JcHJpbnRrKCIgIDB4MDI6IEdGMSBsZWZ0IGlucHV0ICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDAyKSk7Ci0JcHJpbnRrKCIgIDB4MTI6IGxlZnQgbGluZSBpbiAgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDEyKSk7Ci0JcHJpbnRrKCIgIDB4MDM6IEdGMSByaWdodCBpbnB1dCA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDAzKSk7Ci0JcHJpbnRrKCIgIDB4MTM6IHJpZ2h0IGxpbmUgaW4gICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDEzKSk7Ci0JcHJpbnRrKCIgIDB4MDQ6IENEIGxlZnQgaW5wdXQgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA0KSk7Ci0JcHJpbnRrKCIgIDB4MTQ6IHRpbWVyIGxvdyAgICAgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE0KSk7Ci0JcHJpbnRrKCIgIDB4MDU6IENEIHJpZ2h0IGlucHV0ICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA1KSk7Ci0JcHJpbnRrKCIgIDB4MTU6IHRpbWVyIGhpZ2ggICAgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE1KSk7Ci0JcHJpbnRrKCIgIDB4MDY6IGxlZnQgb3V0cHV0ICAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA2KSk7Ci0JcHJpbnRrKCIgIDB4MTY6IGxlZnQgTUlDIChQblApICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE2KSk7Ci0JcHJpbnRrKCIgIDB4MDc6IHJpZ2h0IG91dHB1dCAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA3KSk7Ci0JcHJpbnRrKCIgIDB4MTc6IHJpZ2h0IE1JQyAoUG5QKSA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE3KSk7Ci0JcHJpbnRrKCIgIDB4MDg6IHBsYXliYWNrIGZvcm1hdCA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA4KSk7Ci0JcHJpbnRrKCIgIDB4MTg6IElSUSBzdGF0dXMgICAgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE4KSk7Ci0JcHJpbnRrKCIgIDB4MDk6IGlmYWNlIChDRklHIDEpICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDA5KSk7Ci0JcHJpbnRrKCIgIDB4MTk6IGxlZnQgbGluZSBvdXQgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDE5KSk7Ci0JcHJpbnRrKCIgIDB4MGE6IHBpbiBjb250cm9sICAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBhKSk7Ci0JcHJpbnRrKCIgIDB4MWE6IG1vbm8gY29udHJvbCAgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFhKSk7Ci0JcHJpbnRrKCIgIDB4MGI6IGluaXQgJiBzdGF0dXMgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBiKSk7Ci0JcHJpbnRrKCIgIDB4MWI6IHJpZ2h0IGxpbmUgb3V0ICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFiKSk7Ci0JcHJpbnRrKCIgIDB4MGM6IHJldmlzaW9uICYgbW9kZSA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBjKSk7Ci0JcHJpbnRrKCIgIDB4MWM6IHJlY29yZCBmb3JtYXQgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFjKSk7Ci0JcHJpbnRrKCIgIDB4MGQ6IGxvb3BiYWNrICAgICAgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBkKSk7Ci0JcHJpbnRrKCIgIDB4MWQ6IHZhciBmcmVxIChQblApICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFkKSk7Ci0JcHJpbnRrKCIgIDB4MGU6IHBseSB1cHIgY291bnQgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBlKSk7Ci0JcHJpbnRrKCIgIDB4MWU6IHBseSBsd3IgY291bnQgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFlKSk7Ci0JcHJpbnRrKCIgIDB4MGY6IHJlYyB1cHIgY291bnQgICA9IDB4JTAyeCAgIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDBmKSk7Ci0JcHJpbnRrKCIgIDB4MWY6IHJlYyBsd3IgY291bnQgICA9IDB4JTAyeFxuIiwgc25kX2NzNDIzMV9pbihjaGlwLCAweDFmKSk7Ci19Ci0KLSNlbmRpZgotCi0vKgotICogIENTNDIzMSBkZXRlY3Rpb24gLyBNQ0Ugcm91dGluZXMKLSAqLwotCi1zdGF0aWMgdm9pZCBzbmRfY3M0MjMxX2J1c3lfd2FpdChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCkKLXsKLQlpbnQgdGltZW91dDsKLQotCS8qIGh1aC4uIGxvb2tzIGxpa2UgdGhpcyBzZXF1ZW5jZSBpcyBwcm9wZXIgZm9yIENTNDIzMUEgY2hpcCAoR1VTIE1BWCkgKi8KLQlmb3IgKHRpbWVvdXQgPSA1OyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKQotCQljczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSk7Ci0JLyogZW5kIG9mIGNsZWFudXAgc2VxdWVuY2UgKi8KLQlmb3IgKHRpbWVvdXQgPSAyNTA7Ci0JICAgICB0aW1lb3V0ID4gMCAmJiAoY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpOwotCSAgICAgdGltZW91dC0tKQotCSAgICAgCXVkZWxheSgxMCk7Ci19Ci0KLXZvaWQgc25kX2NzNDIzMV9tY2VfdXAoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdGltZW91dDsKLQotCXNuZF9jczQyMzFfd2FpdChjaGlwKTsKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JaWYgKGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKQotCQlzbmRfcHJpbnRrKCJtY2VfdXAgLSBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgwKVxuIik7Ci0jZW5kaWYKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQljaGlwLT5tY2VfYml0IHw9IENTNDIzMV9NQ0U7Ci0JdGltZW91dCA9IGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKTsKLQlpZiAodGltZW91dCA9PSAweDgwKQotCQlzbmRfcHJpbnRrKCJtY2VfdXAgWzB4JWx4XTogc2VyaW91cyBpbml0IHByb2JsZW0gLSBjb2RlYyBzdGlsbCBidXN5XG4iLCBjaGlwLT5wb3J0KTsKLQlpZiAoISh0aW1lb3V0ICYgQ1M0MjMxX01DRSkpCi0JCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8ICh0aW1lb3V0ICYgMHgxZikpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc25kX2NzNDIzMV9tY2VfZG93bihzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7Ci0JaW50IHRpbWVvdXQ7Ci0KLQlzbmRfY3M0MjMxX2J1c3lfd2FpdChjaGlwKTsKLQotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQlpZiAoY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpCi0JCXNuZF9wcmludGsoIm1jZV9kb3duIFsweCVseF0gLSBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgwKVxuIiwgKGxvbmcpQ1M0MjMxUChSRUdTRUwpKTsKLSNlbmRpZgotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWNoaXAtPm1jZV9iaXQgJj0gfkNTNDIzMV9NQ0U7Ci0JdGltZW91dCA9IGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKTsKLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFJFR1NFTCksIGNoaXAtPm1jZV9iaXQgfCAodGltZW91dCAmIDB4MWYpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWlmICh0aW1lb3V0ID09IDB4ODApCi0JCXNuZF9wcmludGsoIm1jZV9kb3duIFsweCVseF06IHNlcmlvdXMgaW5pdCBwcm9ibGVtIC0gY29kZWMgc3RpbGwgYnVzeVxuIiwgY2hpcC0+cG9ydCk7Ci0JaWYgKCh0aW1lb3V0ICYgQ1M0MjMxX01DRSkgPT0gMCB8fAotCSAgICAhKGNoaXAtPmhhcmR3YXJlICYgKENTNDIzMV9IV19DUzQyMzFfTUFTSyB8IENTNDIzMV9IV19DUzQyMzJfTUFTSykpKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFdhaXQgZm9yIChwb3NzaWJsZSAtLSBkdXJpbmcgaW5pdCBhdXRvLWNhbGlicmF0aW9uIG1heSBub3QgYmUgc2V0KQotCSAqIGNhbGlicmF0aW9uIHByb2Nlc3MgdG8gc3RhcnQuIE5lZWRzIHVwdG8gNSBzYW1wbGUgcGVyaW9kcyBvbiBBRDE4NDgKLQkgKiB3aGljaCBhdCB0aGUgc2xvd2VzdCBwb3NzaWJsZSByYXRlIG9mIDUuNTEyNSBrSHogbWVhbnMgOTA3IHVzLgotCSAqLwotCW1zbGVlcCgxKTsKLQotCXNuZF9wcmludGRkKCIoMSkgamlmZmllcyA9ICVsdVxuIiwgamlmZmllcyk7Ci0KLQkvKiBjaGVjayBjb25kaXRpb24gdXAgdG8gMjUwIG1zICovCi0JZW5kX3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApOwotCXdoaWxlIChzbmRfY3M0MjMxX2luKGNoaXAsIENTNDIzMV9URVNUX0lOSVQpICYKLQkJQ1M0MjMxX0NBTElCX0lOX1BST0dSRVNTKSB7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtY2VfZG93biAtICIKLQkJCQkJImF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgKDIpXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQltc2xlZXAoMSk7Ci0JfQotCi0Jc25kX3ByaW50ZGQoIigyKSBqaWZmaWVzID0gJWx1XG4iLCBqaWZmaWVzKTsKLQotCS8qIGNoZWNrIGNvbmRpdGlvbiB1cCB0byAxMDAgbXMgKi8KLQllbmRfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0Jd2hpbGUgKGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVuZF90aW1lKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWNlX2Rvd24gLSBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgzKVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbXNsZWVwKDEpOwotCX0KLQotCXNuZF9wcmludGRkKCIoMykgamlmZmllcyA9ICVsdVxuIiwgamlmZmllcyk7Ci0Jc25kX3ByaW50ZCgibWNlX2Rvd24gLSBleGl0ID0gMHgleFxuIiwgY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfY3M0MjMxX2dldF9jb3VudCh1bnNpZ25lZCBjaGFyIGZvcm1hdCwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3dpdGNoIChmb3JtYXQgJiAweGUwKSB7Ci0JY2FzZSBDUzQyMzFfTElORUFSXzE2OgotCWNhc2UgQ1M0MjMxX0xJTkVBUl8xNl9CSUc6Ci0JCXNpemUgPj49IDE7Ci0JCWJyZWFrOwotCWNhc2UgQ1M0MjMxX0FEUENNXzE2OgotCQlyZXR1cm4gc2l6ZSA+PiAyOwotCX0KLQlpZiAoZm9ybWF0ICYgQ1M0MjMxX1NURVJFTykKLQkJc2l6ZSA+Pj0gMTsKLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCB3aGF0OwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQlpbnQgZG9fc3RhcnQ7Ci0KLSNpZiAwCi0JcHJpbnRrKCJjb2RlYyB0cmlnZ2VyISEhIC0gd2hhdCA9ICVpLCBlbmFibGUgPSAlaSwgc3RhdHVzID0gMHgleFxuIiwgd2hhdCwgZW5hYmxlLCBjczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoU1RBVFVTKSkpOwotI2VuZGlmCi0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCWRvX3N0YXJ0ID0gMTsgYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQkJZG9fc3RhcnQgPSAwOyBicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl3aGF0ID0gMDsKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewotCQlpZiAocyA9PSBjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pIHsKLQkJCXdoYXQgfD0gQ1M0MjMxX1BMQVlCQUNLX0VOQUJMRTsKLQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7Ci0JCX0gZWxzZSBpZiAocyA9PSBjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSkgewotCQkJd2hhdCB8PSBDUzQyMzFfUkVDT1JEX0VOQUJMRTsKLQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7Ci0JCX0KLQl9Ci0Jc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGRvX3N0YXJ0KSB7Ci0JCWNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSB8PSB3aGF0OwotCQlpZiAoY2hpcC0+dHJpZ2dlcikKLQkJCWNoaXAtPnRyaWdnZXIoY2hpcCwgd2hhdCwgMSk7Ci0JfSBlbHNlIHsKLQkJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICY9IH53aGF0OwotCQlpZiAoY2hpcC0+dHJpZ2dlcikKLQkJCWNoaXAtPnRyaWdnZXIoY2hpcCwgd2hhdCwgMCk7Ci0JfQotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9JRkFDRV9DVFJMLCBjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0pOwotCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0jaWYgMAotCXNuZF9jczQyMzFfZGVidWcoY2hpcCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICogIENPREVDIEkvTwotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jczQyMzFfZ2V0X3JhdGUodW5zaWduZWQgaW50IHJhdGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykKLQkJaWYgKHJhdGUgPT0gcmF0ZXNbaV0pCi0JCQlyZXR1cm4gZnJlcV9iaXRzW2ldOwotCS8vIHNuZF9CVUcoKTsKLQlyZXR1cm4gZnJlcV9iaXRzW0FSUkFZX1NJWkUocmF0ZXMpIC0gMV07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jczQyMzFfZ2V0X2Zvcm1hdChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwKLQkJCQkgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzKQotewotCXVuc2lnbmVkIGNoYXIgcmZvcm1hdDsKLQotCXJmb3JtYXQgPSBDUzQyMzFfTElORUFSXzg7Ci0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfTVVfTEFXOglyZm9ybWF0ID0gQ1M0MjMxX1VMQVdfODsgYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX0FfTEFXOglyZm9ybWF0ID0gQ1M0MjMxX0FMQVdfODsgYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToJcmZvcm1hdCA9IENTNDIzMV9MSU5FQVJfMTY7IGJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfQkU6CXJmb3JtYXQgPSBDUzQyMzFfTElORUFSXzE2X0JJRzsgYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX0lNQV9BRFBDTToJcmZvcm1hdCA9IENTNDIzMV9BRFBDTV8xNjsgYnJlYWs7Ci0JfQotCWlmIChjaGFubmVscyA+IDEpCi0JCXJmb3JtYXQgfD0gQ1M0MjMxX1NURVJFTzsKLSNpZiAwCi0Jc25kX3ByaW50aygiZ2V0X2Zvcm1hdDogMHgleCAobW9kZT0weCV4KVxuIiwgZm9ybWF0LCBtb2RlKTsKLSNlbmRpZgotCXJldHVybiByZm9ybWF0OwotfQotCi1zdGF0aWMgdm9pZCBzbmRfY3M0MjMxX2NhbGlicmF0ZV9tdXRlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBpbnQgbXV0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXV0ZSA9IG11dGUgPyAxIDogMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAoY2hpcC0+Y2FsaWJyYXRlX211dGUgPT0gbXV0ZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCWlmICghbXV0ZSkgewotCQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfSU5QVVQsIGNoaXAtPmltYWdlW0NTNDIzMV9MRUZUX0lOUFVUXSk7Ci0JCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfUklHSFRfSU5QVVQsIGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9JTlBVVF0pOwotCQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0xPT1BCQUNLLCBjaGlwLT5pbWFnZVtDUzQyMzFfTE9PUEJBQ0tdKTsKLQl9Ci0Jc25kX2NzNDIzMV9kb3V0KGNoaXAsIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIG11dGUgPyAweDgwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVF0pOwotCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVF0pOwotCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0NTNDIzMV9BVVgyX0xFRlRfSU5QVVRdKTsKLQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIG11dGUgPyAweDgwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVRdKTsKLQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfT1VUUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0NTNDIzMV9MRUZUX09VVFBVVF0pOwotCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfUklHSFRfT1VUUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9PVVRQVVRdKTsKLQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtDUzQyMzFfTEVGVF9MSU5FX0lOXSk7Ci0Jc25kX2NzNDIzMV9kb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9MSU5FX0lOLCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9MSU5FX0lOXSk7Ci0Jc25kX2NzNDIzMV9kb3V0KGNoaXAsIENTNDIzMV9NT05PX0NUUkwsIG11dGUgPyAweGMwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX01PTk9fQ1RSTF0pOwotCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfSU5URVJXQVZFKSB7Ci0JCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfTEVGVF9NSUNfSU5QVVQsIG11dGUgPyAweDgwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfTUlDX0lOUFVUXSk7Ci0JCXNuZF9jczQyMzFfZG91dChjaGlwLCBDUzQyMzFfUklHSFRfTUlDX0lOUFVULCBtdXRlID8gMHg4MCA6IGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9NSUNfSU5QVVRdKTsJCQotCQlzbmRfY3M0MjMxX2RvdXQoY2hpcCwgQ1M0MjMxX0xJTkVfTEVGVF9PVVRQVVQsIG11dGUgPyAweDgwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX0xJTkVfTEVGVF9PVVRQVVRdKTsKLQkJc25kX2NzNDIzMV9kb3V0KGNoaXAsIENTNDIzMV9MSU5FX1JJR0hUX09VVFBVVCwgbXV0ZSA/IDB4ODAgOiBjaGlwLT5pbWFnZVtDUzQyMzFfTElORV9SSUdIVF9PVVRQVVRdKTsKLQl9Ci0JY2hpcC0+Y2FsaWJyYXRlX211dGUgPSBtdXRlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9jczQyMzFfcGxheWJhY2tfZm9ybWF0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBwZGZyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGZ1bGxfY2FsaWIgPSAxOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bWNlX211dGV4KTsKLQlzbmRfY3M0MjMxX2NhbGlicmF0ZV9tdXRlKGNoaXAsIDEpOwotCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjMxQSB8fAotCSAgICAoY2hpcC0+aGFyZHdhcmUgJiBDUzQyMzFfSFdfQ1M0MjMyX01BU0spKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlpZiAoKGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSAmIDB4MGYpID09IChwZGZyICYgMHgwZikpIHsJLyogcmF0ZSBpcyBzYW1lPyAqLwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSB8IDB4MTApOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BMQVlCS19GT1JNQVQsIGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSA9IHBkZnIpOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSAmPSB+MHgxMCk7Ci0JCQl1ZGVsYXkoMTAwKTsgLyogRml4ZXMgYXVkaWJsZSBjbGlja3MgYXQgbGVhc3Qgb24gR1VTIE1BWCAqLwotCQkJZnVsbF9jYWxpYiA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQl9Ci0JaWYgKGZ1bGxfY2FsaWIpIHsKLQkJc25kX2NzNDIzMV9tY2VfdXAoY2hpcCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlpZiAoY2hpcC0+aGFyZHdhcmUgIT0gQ1M0MjMxX0hXX0lOVEVSV0FWRSAmJiAhY2hpcC0+c2luZ2xlX2RtYSkgewotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BMQVlCS19GT1JNQVQsCi0JCQkJCShjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiBDUzQyMzFfUkVDT1JEX0VOQUJMRSkgPwotCQkJCQkocGRmciAmIDB4ZjApIHwgKGNoaXAtPmltYWdlW0NTNDIzMV9SRUNfRk9STUFUXSAmIDB4MGYpIDoKLQkJCQkgICAgICAgIHBkZnIpOwotCQl9IGVsc2UgewotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BMQVlCS19GT1JNQVQsIGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSA9IHBkZnIpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfT1BMM1NBMikKLQkJCXVkZWxheSgxMDApOwkvKiB0aGlzIHNlZW1zIHRvIGhlbHAgKi8KLQkJc25kX2NzNDIzMV9tY2VfZG93bihjaGlwKTsKLQl9Ci0Jc25kX2NzNDIzMV9jYWxpYnJhdGVfbXV0ZShjaGlwLCAwKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm1jZV9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9jczQyMzFfY2FwdHVyZV9mb3JtYXQoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsCi0JCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2RmcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmdWxsX2NhbGliID0gMTsKLQotCW11dGV4X2xvY2soJmNoaXAtPm1jZV9tdXRleCk7Ci0Jc25kX2NzNDIzMV9jYWxpYnJhdGVfbXV0ZShjaGlwLCAxKTsKLQlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0NTNDIzMUEgfHwKLQkgICAgKGNoaXAtPmhhcmR3YXJlICYgQ1M0MjMxX0hXX0NTNDIzMl9NQVNLKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQkJaWYgKChjaGlwLT5pbWFnZVtDUzQyMzFfUExBWUJLX0ZPUk1BVF0gJiAweDBmKSA9PSAoY2RmciAmIDB4MGYpIHx8CS8qIHJhdGUgaXMgc2FtZT8gKi8KLQkJICAgIChjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFKSkgewotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSB8IDB4MjApOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1JFQ19GT1JNQVQsIGNoaXAtPmltYWdlW0NTNDIzMV9SRUNfRk9STUFUXSA9IGNkZnIpOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSAmPSB+MHgyMCk7Ci0JCQlmdWxsX2NhbGliID0gMDsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCX0KLQlpZiAoZnVsbF9jYWxpYikgewotCQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCWlmIChjaGlwLT5oYXJkd2FyZSAhPSBDUzQyMzFfSFdfSU5URVJXQVZFKSB7Ci0JCQlpZiAoIShjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFKSkgewotCQkJCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9QTEFZQktfRk9STUFULAotCQkJCQkgICAgICAgKChjaGlwLT5zaW5nbGVfZG1hID8gY2RmciA6IGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSkgJiAweGYwKSB8Ci0JCQkJCSAgICAgICAoY2RmciAmIDB4MGYpKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQkJCXNuZF9jczQyMzFfbWNlX2Rvd24oY2hpcCk7Ci0JCQkJc25kX2NzNDIzMV9tY2VfdXAoY2hpcCk7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCQl9Ci0JCX0KLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1JFQ19GT1JNQVQsIGNkZnIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOwotCX0KLQlzbmRfY3M0MjMxX2NhbGlicmF0ZV9tdXRlKGNoaXAsIDApOwotCW11dGV4X3VubG9jaygmY2hpcC0+bWNlX211dGV4KTsKLX0KLQotLyoKLSAqICBUaW1lciBpbnRlcmZhY2UKLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzbmRfY3M0MjMxX3RpbWVyX3Jlc29sdXRpb24oc3RydWN0IHNuZF90aW1lciAqIHRpbWVyKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwotCWlmIChjaGlwLT5oYXJkd2FyZSAmIENTNDIzMV9IV19DUzQyMzZCX01BU0spCi0JCXJldHVybiAxNDQ2NzsKLQllbHNlCi0JCXJldHVybiBjaGlwLT5pbWFnZVtDUzQyMzFfUExBWUJLX0ZPUk1BVF0gJiAxID8gOTk2OSA6IDk5MjA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV90aW1lcl9zdGFydChzdHJ1Y3Qgc25kX3RpbWVyICogdGltZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgdGlja3M7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfdGltZXJfY2hpcCh0aW1lcik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JdGlja3MgPSB0aW1lci0+c3RpY2tzOwotCWlmICgoY2hpcC0+aW1hZ2VbQ1M0MjMxX0FMVF9GRUFUVVJFXzFdICYgQ1M0MjMxX1RJTUVSX0VOQUJMRSkgPT0gMCB8fAotCSAgICAodW5zaWduZWQgY2hhcikodGlja3MgPj4gOCkgIT0gY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0hJR0hdIHx8Ci0JICAgICh1bnNpZ25lZCBjaGFyKXRpY2tzICE9IGNoaXAtPmltYWdlW0NTNDIzMV9USU1FUl9MT1ddKSB7Ci0JCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9USU1FUl9ISUdILCBjaGlwLT5pbWFnZVtDUzQyMzFfVElNRVJfSElHSF0gPSAodW5zaWduZWQgY2hhcikgKHRpY2tzID4+IDgpKTsKLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1RJTUVSX0xPVywgY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0xPV10gPSAodW5zaWduZWQgY2hhcikgdGlja3MpOwotCQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FMVF9GRUFUVVJFXzFdIHwgQ1M0MjMxX1RJTUVSX0VOQUJMRSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV90aW1lcl9zdG9wKHN0cnVjdCBzbmRfdGltZXIgKiB0aW1lcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJj0gfkNTNDIzMV9USU1FUl9FTkFCTEUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9jczQyMzFfaW5pdChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc25kX2NzNDIzMV9tY2VfZG93bihjaGlwKTsKLQotI2lmZGVmIFNORFJWX0RFQlVHX01DRQotCXNuZF9wcmludGsoImluaXQ6ICgxKVxuIik7Ci0jZW5kaWYKLQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQljaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJj0gfihDUzQyMzFfUExBWUJBQ0tfRU5BQkxFIHwgQ1M0MjMxX1BMQVlCQUNLX1BJTyB8Ci0JCQkgICAgIENTNDIzMV9SRUNPUkRfRU5BQkxFIHwgQ1M0MjMxX1JFQ09SRF9QSU8gfAotCQkJICAgICBDUzQyMzFfQ0FMSUJfTU9ERSk7Ci0JY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdIHw9IENTNDIzMV9BVVRPQ0FMSUI7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOwotCi0jaWZkZWYgU05EUlZfREVCVUdfTUNFCi0Jc25kX3ByaW50aygiaW5pdDogKDIpXG4iKTsKLSNlbmRpZgotCi0Jc25kX2NzNDIzMV9tY2VfdXAoY2hpcCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOwotCi0jaWZkZWYgU05EUlZfREVCVUdfTUNFCi0Jc25kX3ByaW50aygiaW5pdDogKDMpIC0gYWZlaSA9IDB4JXhcbiIsIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSk7Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8yLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMl0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0KLQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1BMQVlCS19GT1JNQVRdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9jczQyMzFfbWNlX2Rvd24oY2hpcCk7Ci0KLSNpZmRlZiBTTkRSVl9ERUJVR19NQ0UKLQlzbmRfcHJpbnRrKCJpbml0OiAoNClcbiIpOwotI2VuZGlmCi0KLQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUkVDX0ZPUk1BVCwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1JFQ19GT1JNQVRdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9jczQyMzFfbWNlX2Rvd24oY2hpcCk7Ci0KLSNpZmRlZiBTTkRSVl9ERUJVR19NQ0UKLQlzbmRfcHJpbnRrKCJpbml0OiAoNSlcbiIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9vcGVuKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JaWYgKChjaGlwLT5tb2RlICYgbW9kZSkgfHwKLQkgICAgKChjaGlwLT5tb2RlICYgQ1M0MjMxX01PREVfT1BFTikgJiYgY2hpcC0+c2luZ2xlX2RtYSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWlmIChjaGlwLT5tb2RlICYgQ1M0MjMxX01PREVfT1BFTikgewotCQljaGlwLT5tb2RlIHw9IG1vZGU7Ci0JCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBvay4gbm93IGVuYWJsZSBhbmQgYWNrIENPREVDIElSUSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCBDUzQyMzFfUExBWUJBQ0tfSVJRIHwKLQkJICAgICAgIENTNDIzMV9SRUNPUkRfSVJRIHwKLQkJICAgICAgIENTNDIzMV9USU1FUl9JUlEpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCAwKTsKLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KLQljaGlwLT5pbWFnZVtDUzQyMzFfUElOX0NUUkxdIHw9IENTNDIzMV9JUlFfRU5BQkxFOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9QSU5fQ1RSTCwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1BJTl9DVFJMXSk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0lSUV9TVEFUVVMsIENTNDIzMV9QTEFZQkFDS19JUlEgfAotCQkgICAgICAgQ1M0MjMxX1JFQ09SRF9JUlEgfAotCQkgICAgICAgQ1M0MjMxX1RJTUVSX0lSUSk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0lSUV9TVEFUVVMsIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0KLQljaGlwLT5tb2RlID0gbW9kZTsKLQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzbmRfY3M0MjMxX2Nsb3NlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci0JY2hpcC0+bW9kZSAmPSB+bW9kZTsKLQlpZiAoY2hpcC0+bW9kZSAmIENTNDIzMV9NT0RFX09QRU4pIHsKLQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKLQkJcmV0dXJuOwotCX0KLQlzbmRfY3M0MjMxX2NhbGlicmF0ZV9tdXRlKGNoaXAsIDEpOwotCi0JLyogZGlzYWJsZSBJUlEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfSVJRX1NUQVRVUywgMCk7Ci0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChTVEFUVVMpLCAwKTsJLyogY2xlYXIgSVJRICovCi0JY3M0MjMxX291dGIoY2hpcCwgQ1M0MjMxUChTVEFUVVMpLCAwKTsJLyogY2xlYXIgSVJRICovCi0JY2hpcC0+aW1hZ2VbQ1M0MjMxX1BJTl9DVFJMXSAmPSB+Q1M0MjMxX0lSUV9FTkFCTEU7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BJTl9DVFJMLCBjaGlwLT5pbWFnZVtDUzQyMzFfUElOX0NUUkxdKTsKLQotCS8qIG5vdyBkaXNhYmxlIHJlY29yZCAmIHBsYXliYWNrICovCi0KLQlpZiAoY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICYgKENTNDIzMV9QTEFZQkFDS19FTkFCTEUgfCBDUzQyMzFfUExBWUJBQ0tfUElPIHwKLQkJCQkJICAgICAgIENTNDIzMV9SRUNPUkRfRU5BQkxFIHwgQ1M0MjMxX1JFQ09SRF9QSU8pKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCXNuZF9jczQyMzFfbWNlX3VwKGNoaXApOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQkJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICY9IH4oQ1M0MjMxX1BMQVlCQUNLX0VOQUJMRSB8IENTNDIzMV9QTEFZQkFDS19QSU8gfAotCQkJCQkJICAgICBDUzQyMzFfUkVDT1JEX0VOQUJMRSB8IENTNDIzMV9SRUNPUkRfUElPKTsKLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCXNuZF9jczQyMzFfbWNlX2Rvd24oY2hpcCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCX0KLQotCS8qIGNsZWFyIElSUSBhZ2FpbiAqLwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCAwKTsKLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCi0Jc25kX2NzNDIzMV9jYWxpYnJhdGVfbXV0ZShjaGlwLCAwKTsKLQotCWNoaXAtPm1vZGUgPSAwOwotCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Ci19Ci0KLS8qCi0gKiAgdGltZXIgb3Blbi9jbG9zZQotICovCi0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV90aW1lcl9vcGVuKHN0cnVjdCBzbmRfdGltZXIgKiB0aW1lcikKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKLQlzbmRfY3M0MjMxX29wZW4oY2hpcCwgQ1M0MjMxX01PREVfVElNRVIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfdGltZXJfY2xvc2Uoc3RydWN0IHNuZF90aW1lciAqIHRpbWVyKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOwotCXNuZF9jczQyMzFfY2xvc2UoY2hpcCwgQ1M0MjMxX01PREVfVElNRVIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF90aW1lcl9oYXJkd2FyZSBzbmRfY3M0MjMxX3RpbWVyX3RhYmxlID0KLXsKLQkuZmxhZ3MgPQlTTkRSVl9USU1FUl9IV19BVVRPLAotCS5yZXNvbHV0aW9uID0JOTk0NSwKLQkudGlja3MgPQk2NTUzNSwKLQkub3BlbiA9CQlzbmRfY3M0MjMxX3RpbWVyX29wZW4sCi0JLmNsb3NlID0Jc25kX2NzNDIzMV90aW1lcl9jbG9zZSwKLQkuY19yZXNvbHV0aW9uID0gc25kX2NzNDIzMV90aW1lcl9yZXNvbHV0aW9uLAotCS5zdGFydCA9CXNuZF9jczQyMzFfdGltZXJfc3RhcnQsCi0JLnN0b3AgPQkJc25kX2NzNDIzMV90aW1lcl9zdG9wLAotfTsKLQotLyoKLSAqICBvay4uIGV4cG9ydGVkIGZ1bmN0aW9ucy4uCi0gKi8KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX3BsYXliYWNrX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGNoYXIgbmV3X3BkZnI7Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCW5ld19wZGZyID0gc25kX2NzNDIzMV9nZXRfZm9ybWF0KGNoaXAsIHBhcmFtc19mb3JtYXQoaHdfcGFyYW1zKSwgcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcykpIHwKLQkJICAgc25kX2NzNDIzMV9nZXRfcmF0ZShwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKLQljaGlwLT5zZXRfcGxheWJhY2tfZm9ybWF0KGNoaXAsIGh3X3BhcmFtcywgbmV3X3BkZnIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfcGxheWJhY2tfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfcGxheWJhY2tfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWNoaXAtPnBfZG1hX3NpemUgPSBzaXplOwotCWNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmPSB+KENTNDIzMV9QTEFZQkFDS19FTkFCTEUgfCBDUzQyMzFfUExBWUJBQ0tfUElPKTsKLQlzbmRfZG1hX3Byb2dyYW0oY2hpcC0+ZG1hMSwgcnVudGltZS0+ZG1hX2FkZHIsIHNpemUsIERNQV9NT0RFX1dSSVRFIHwgRE1BX0FVVE9JTklUKTsKLQljb3VudCA9IHNuZF9jczQyMzFfZ2V0X2NvdW50KGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSwgY291bnQpIC0gMTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUExZX0xXUl9DTlQsICh1bnNpZ25lZCBjaGFyKSBjb3VudCk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BMWV9VUFJfQ05ULCAodW5zaWduZWQgY2hhcikgKGNvdW50ID4+IDgpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotI2lmIDAKLQlzbmRfY3M0MjMxX2RlYnVnKGNoaXApOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9jYXB0dXJlX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JdW5zaWduZWQgY2hhciBuZXdfY2RmcjsKLQlpbnQgZXJyOwotCi0JaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0JbmV3X2NkZnIgPSBzbmRfY3M0MjMxX2dldF9mb3JtYXQoY2hpcCwgcGFyYW1zX2Zvcm1hdChod19wYXJhbXMpLCBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSkgfAotCQkgICBzbmRfY3M0MjMxX2dldF9yYXRlKHBhcmFtc19yYXRlKGh3X3BhcmFtcykpOwotCWNoaXAtPnNldF9jYXB0dXJlX2Zvcm1hdChjaGlwLCBod19wYXJhbXMsIG5ld19jZGZyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX2NhcHR1cmVfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JY2hpcC0+Y19kbWFfc2l6ZSA9IHNpemU7Ci0JY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICY9IH4oQ1M0MjMxX1JFQ09SRF9FTkFCTEUgfCBDUzQyMzFfUkVDT1JEX1BJTyk7Ci0Jc25kX2RtYV9wcm9ncmFtKGNoaXAtPmRtYTIsIHJ1bnRpbWUtPmRtYV9hZGRyLCBzaXplLCBETUFfTU9ERV9SRUFEIHwgRE1BX0FVVE9JTklUKTsKLQljb3VudCA9IHNuZF9jczQyMzFfZ2V0X2NvdW50KGNoaXAtPmltYWdlW0NTNDIzMV9SRUNfRk9STUFUXSwgY291bnQpIC0gMTsKLQlpZiAoY2hpcC0+c2luZ2xlX2RtYSAmJiBjaGlwLT5oYXJkd2FyZSAhPSBDUzQyMzFfSFdfSU5URVJXQVZFKSB7Ci0JCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9QTFlfTFdSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIGNvdW50KTsKLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1BMWV9VUFJfQ05ULCAodW5zaWduZWQgY2hhcikgKGNvdW50ID4+IDgpKTsKLQl9IGVsc2UgewotCQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUkVDX0xXUl9DTlQsICh1bnNpZ25lZCBjaGFyKSBjb3VudCk7Ci0JCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9SRUNfVVBSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIChjb3VudCA+PiA4KSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc25kX2NzNDIzMV9vdmVycmFuZ2Uoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIHJlczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXJlcyA9IHNuZF9jczQyMzFfaW4oY2hpcCwgQ1M0MjMxX1RFU1RfSU5JVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAocmVzICYgKDB4MDggfCAweDAyKSkJLyogZGV0ZWN0IG92ZXJyYW5nZSBvbmx5IGFib3ZlIDBkQjsgbWF5IGJlIHVzZXIgc2VsZWN0YWJsZT8gKi8KLQkJY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0tPnJ1bnRpbWUtPm92ZXJyYW5nZSsrOwotfQotCi1pcnFyZXR1cm5fdCBzbmRfY3M0MjMxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBkZXZfaWQ7Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBzbmRfY3M0MjMxX2luKGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTKTsKLQlpZiAoc3RhdHVzICYgQ1M0MjMxX1RJTUVSX0lSUSkgewotCQlpZiAoY2hpcC0+dGltZXIpCi0JCQlzbmRfdGltZXJfaW50ZXJydXB0KGNoaXAtPnRpbWVyLCBjaGlwLT50aW1lci0+c3RpY2tzKTsKLQl9CQkKLQlpZiAoY2hpcC0+c2luZ2xlX2RtYSAmJiBjaGlwLT5oYXJkd2FyZSAhPSBDUzQyMzFfSFdfSU5URVJXQVZFKSB7Ci0JCWlmIChzdGF0dXMgJiBDUzQyMzFfUExBWUJBQ0tfSVJRKSB7Ci0JCQlpZiAoY2hpcC0+bW9kZSAmIENTNDIzMV9NT0RFX1BMQVkpIHsKLQkJCQlpZiAoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKQotCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSk7Ci0JCQl9Ci0JCQlpZiAoY2hpcC0+bW9kZSAmIENTNDIzMV9NT0RFX1JFQ09SRCkgewotCQkJCWlmIChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSkgewotCQkJCQlzbmRfY3M0MjMxX292ZXJyYW5nZShjaGlwKTsKLQkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHN0YXR1cyAmIENTNDIzMV9QTEFZQkFDS19JUlEpIHsKLQkJCWlmIChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pCi0JCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pOwotCQl9Ci0JCWlmIChzdGF0dXMgJiBDUzQyMzFfUkVDT1JEX0lSUSkgewotCQkJaWYgKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKSB7Ci0JCQkJc25kX2NzNDIzMV9vdmVycmFuZ2UoY2hpcCk7Ci0JCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlzbmRfY3M0MjMxX291dG0oY2hpcCwgQ1M0MjMxX0lSUV9TVEFUVVMsIH5DUzQyMzFfQUxMX0lSUVMgfCB+c3RhdHVzLCAwKTsKLQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQyMzFfcGxheWJhY2tfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzaXplX3QgcHRyOwotCi0JaWYgKCEoY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICYgQ1M0MjMxX1BMQVlCQUNLX0VOQUJMRSkpCi0JCXJldHVybiAwOwotCXB0ciA9IHNuZF9kbWFfcG9pbnRlcihjaGlwLT5kbWExLCBjaGlwLT5wX2RtYV9zaXplKTsKLQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9jczQyMzFfY2FwdHVyZV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXNpemVfdCBwdHI7Ci0JCi0JaWYgKCEoY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICYgQ1M0MjMxX1JFQ09SRF9FTkFCTEUpKQotCQlyZXR1cm4gMDsKLQlwdHIgPSBzbmRfZG1hX3BvaW50ZXIoY2hpcC0+ZG1hMiwgY2hpcC0+Y19kbWFfc2l6ZSk7Ci0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Ci19Ci0KLS8qCi0KLSAqLwotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfcHJvYmUoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaSwgaWQsIHJldjsKLQl1bnNpZ25lZCBjaGFyICpwdHI7Ci0JdW5zaWduZWQgaW50IGh3OwotCi0jaWYgMAotCXNuZF9jczQyMzFfZGVidWcoY2hpcCk7Ci0jZW5kaWYKLQlpZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJbWIoKTsKLQkJaWYgKGNzNDIzMV9pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKQotCQkJdWRlbGF5KDIwMDApOwotCQllbHNlIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX01JU0NfSU5GTywgQ1M0MjMxX01PREUyKTsKLQkJCWlkID0gc25kX2NzNDIzMV9pbihjaGlwLCBDUzQyMzFfTUlTQ19JTkZPKSAmIDB4MGY7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGlkID09IDB4MGEpCi0JCQkJYnJlYWs7CS8qIHRoaXMgaXMgdmFsaWQgdmFsdWUgKi8KLQkJfQotCX0KLQlzbmRfcHJpbnRkZCgiY3M0MjMxOiBwb3J0ID0gMHglbHgsIGlkID0gMHgleFxuIiwgY2hpcC0+cG9ydCwgaWQpOwotCWlmIChpZCAhPSAweDBhKQotCQlyZXR1cm4gLUVOT0RFVjsJLyogbm8gdmFsaWQgZGV2aWNlIGZvdW5kICovCi0KLQlpZiAoKChodyA9IGNoaXAtPmhhcmR3YXJlKSAmIENTNDIzMV9IV19UWVBFX01BU0spID09IENTNDIzMV9IV19ERVRFQ1QpIHsKLQkJcmV2ID0gc25kX2NzNDIzMV9pbihjaGlwLCBDUzQyMzFfVkVSU0lPTikgJiAweGU3OwotCQlzbmRfcHJpbnRkZCgiQ1M0MjMxOiBWRVJTSU9OIChJMjUpID0gMHgleFxuIiwgcmV2KTsKLQkJaWYgKHJldiA9PSAweDgwKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIHRtcCA9IHNuZF9jczQyMzFfaW4oY2hpcCwgMjMpOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgMjMsIH50bXApOwotCQkJaWYgKHNuZF9jczQyMzFfaW4oY2hpcCwgMjMpICE9IHRtcCkKLQkJCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19BRDE4NDU7Ci0JCQllbHNlCi0JCQkJY2hpcC0+aGFyZHdhcmUgPSBDUzQyMzFfSFdfQ1M0MjMxOwotCQl9IGVsc2UgaWYgKHJldiA9PSAweGEwKSB7Ci0JCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzFBOwotCQl9IGVsc2UgaWYgKHJldiA9PSAweGEyKSB7Ci0JCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzI7Ci0JCX0gZWxzZSBpZiAocmV2ID09IDB4YjIpIHsKLQkJCWNoaXAtPmhhcmR3YXJlID0gQ1M0MjMxX0hXX0NTNDIzMkE7Ci0JCX0gZWxzZSBpZiAocmV2ID09IDB4ODMpIHsKLQkJCWNoaXAtPmhhcmR3YXJlID0gQ1M0MjMxX0hXX0NTNDIzNjsKLQkJfSBlbHNlIGlmIChyZXYgPT0gMHgwMykgewotCQkJY2hpcC0+aGFyZHdhcmUgPSBDUzQyMzFfSFdfQ1M0MjM2QjsKLQkJfSBlbHNlIHsKLQkJCXNuZF9wcmludGsoInVua25vd24gQ1MgY2hpcCB3aXRoIHZlcnNpb24gMHgleFxuIiwgcmV2KTsKLQkJCXJldHVybiAtRU5PREVWOwkJLyogdW5rbm93biBDUzQyMzEgY2hpcD8gKi8KLQkJfQotCX0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQljczQyMzFfaW5iKGNoaXAsIENTNDIzMVAoU1RBVFVTKSk7CS8qIGNsZWFyIGFueSBwZW5kaW5ncyBJUlEgKi8KLQljczQyMzFfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwotCW1iKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQotCWNoaXAtPmltYWdlW0NTNDIzMV9NSVNDX0lORk9dID0gQ1M0MjMxX01PREUyOwotCXN3aXRjaCAoY2hpcC0+aGFyZHdhcmUpIHsKLQljYXNlIENTNDIzMV9IV19JTlRFUldBVkU6Ci0JCWNoaXAtPmltYWdlW0NTNDIzMV9NSVNDX0lORk9dID0gQ1M0MjMxX0lXX01PREUzOwotCQlicmVhazsKLQljYXNlIENTNDIzMV9IV19DUzQyMzU6Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM2QjoKLQljYXNlIENTNDIzMV9IV19DUzQyMzdCOgotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzOEI6Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM5OgotCQlpZiAoaHcgPT0gQ1M0MjMxX0hXX0RFVEVDVDMpCi0JCQljaGlwLT5pbWFnZVtDUzQyMzFfTUlTQ19JTkZPXSA9IENTNDIzMV80MjM2X01PREUzOwotCQllbHNlCi0JCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzY7Ci0JCWJyZWFrOwotCX0KLQotCWNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSA9Ci0JICAgIChjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiB+Q1M0MjMxX1NJTkdMRV9ETUEpIHwKLQkgICAgKGNoaXAtPnNpbmdsZV9kbWEgPyBDUzQyMzFfU0lOR0xFX0RNQSA6IDApOwotCWlmIChjaGlwLT5oYXJkd2FyZSAhPSBDUzQyMzFfSFdfT1BUSTkzWCkgewotCQljaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gPSAweDgwOwotCQljaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMl0gPQotCQkJY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0lOVEVSV0FWRSA/IDB4YzIgOiAweDAxOwotCX0KLQlwdHIgPSAodW5zaWduZWQgY2hhciAqKSAmY2hpcC0+aW1hZ2U7Ci0Jc25kX2NzNDIzMV9tY2VfZG93bihjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykJLyogb2suLiBmaWxsIGFsbCBDUzQyMzEgcmVnaXN0ZXJzICovCi0JCXNuZF9jczQyMzFfb3V0KGNoaXAsIGksICpwdHIrKyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKLQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOwotCi0JbWRlbGF5KDIpOwotCi0JLyogb2suLiB0cnkgY2hlY2sgaGFyZHdhcmUgdmVyc2lvbiBmb3IgQ1M0MjM2KyBjaGlwcyAqLwotCWlmICgoaHcgJiBDUzQyMzFfSFdfVFlQRV9NQVNLKSA9PSBDUzQyMzFfSFdfREVURUNUKSB7Ci0JCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjM2QikgewotCQkJcmV2ID0gc25kX2NzNDIzNl9leHRfaW4oY2hpcCwgQ1M0MjM2X1ZFUlNJT04pOwotCQkJc25kX2NzNDIzNl9leHRfb3V0KGNoaXAsIENTNDIzNl9WRVJTSU9OLCAweGZmKTsKLQkJCWlkID0gc25kX2NzNDIzNl9leHRfaW4oY2hpcCwgQ1M0MjM2X1ZFUlNJT04pOwotCQkJc25kX2NzNDIzNl9leHRfb3V0KGNoaXAsIENTNDIzNl9WRVJTSU9OLCByZXYpOwotCQkJc25kX3ByaW50ZGQoIkNTNDIzMTogZXh0IHZlcnNpb247IHJldiA9IDB4JXgsIGlkID0gMHgleFxuIiwgcmV2LCBpZCk7Ci0JCQlpZiAoKGlkICYgMHgxZikgPT0gMHgxZCkgewkvKiBDUzQyMzUgKi8KLQkJCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzU7Ci0JCQkJc3dpdGNoIChpZCA+PiA1KSB7Ci0JCQkJY2FzZSA0OgotCQkJCWNhc2UgNToKLQkJCQljYXNlIDY6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNuZF9wcmludGsoInVua25vd24gQ1M0MjM1IGNoaXAgKGVuaGFuY2VkIHZlcnNpb24gPSAweCV4KVxuIiwgaWQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGlkICYgMHgxZikgPT0gMHgwYikgewkvKiBDUzQyMzYvQiAqLwotCQkJCXN3aXRjaCAoaWQgPj4gNSkgewotCQkJCWNhc2UgNDoKLQkJCQljYXNlIDU6Ci0JCQkJY2FzZSA2OgotCQkJCWNhc2UgNzoKLQkJCQkJY2hpcC0+aGFyZHdhcmUgPSBDUzQyMzFfSFdfQ1M0MjM2QjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzYgY2hpcCAoZW5oYW5jZWQgdmVyc2lvbiA9IDB4JXgpXG4iLCBpZCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoaWQgJiAweDFmKSA9PSAweDA4KSB7CS8qIENTNDIzN0IgKi8KLQkJCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzdCOwotCQkJCXN3aXRjaCAoaWQgPj4gNSkgewotCQkJCWNhc2UgNDoKLQkJCQljYXNlIDU6Ci0JCQkJY2FzZSA2OgotCQkJCWNhc2UgNzoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzdCIGNoaXAgKGVuaGFuY2VkIHZlcnNpb24gPSAweCV4KVxuIiwgaWQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGlkICYgMHgxZikgPT0gMHgwOSkgewkvKiBDUzQyMzhCICovCi0JCQkJY2hpcC0+aGFyZHdhcmUgPSBDUzQyMzFfSFdfQ1M0MjM4QjsKLQkJCQlzd2l0Y2ggKGlkID4+IDUpIHsKLQkJCQljYXNlIDU6Ci0JCQkJY2FzZSA2OgotCQkJCWNhc2UgNzoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzhCIGNoaXAgKGVuaGFuY2VkIHZlcnNpb24gPSAweCV4KVxuIiwgaWQpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGlkICYgMHgxZikgPT0gMHgxZSkgewkvKiBDUzQyMzkgKi8KLQkJCQljaGlwLT5oYXJkd2FyZSA9IENTNDIzMV9IV19DUzQyMzk7Ci0JCQkJc3dpdGNoIChpZCA+PiA1KSB7Ci0JCQkJY2FzZSA0OgotCQkJCWNhc2UgNToKLQkJCQljYXNlIDY6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNuZF9wcmludGsoInVua25vd24gQ1M0MjM5IGNoaXAgKGVuaGFuY2VkIHZlcnNpb24gPSAweCV4KVxuIiwgaWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzYvQ1M0MjN4QiBjaGlwIChlbmhhbmNlZCB2ZXJzaW9uID0gMHgleClcbiIsIGlkKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsJCS8qIGFsbCB0aGluZ3MgYXJlIG9rLi4gKi8KLX0KLQotLyoKLQotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfY3M0MjMxX3BsYXliYWNrID0KLXsKLQkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKLQkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9NVV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0FfTEFXIHwgU05EUlZfUENNX0ZNVEJJVF9JTUFfQURQQ00gfAotCQkJCSBTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSksCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCS5yYXRlX21pbiA9CQk1NTEwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTEsCi0JLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kc19taW4gPQkJMSwKLQkucGVyaW9kc19tYXggPQkJMTAyNCwKLQkuZmlmb19zaXplID0JCTAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2NzNDIzMV9jYXB0dXJlID0KLXsKLQkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKLQkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9NVV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0FfTEFXIHwgU05EUlZfUENNX0ZNVEJJVF9JTUFfQURQQ00gfAotCQkJCSBTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSksCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0tOT1QgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCS5yYXRlX21pbiA9CQk1NTEwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTEsCi0JLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CTY0LAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JKDEyOCoxMDI0KSwKLQkucGVyaW9kc19taW4gPQkJMSwKLQkucGVyaW9kc19tYXggPQkJMTAyNCwKLQkuZmlmb19zaXplID0JCTAsCi19OwotCi0vKgotCi0gKi8KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpbnQgZXJyOwotCi0JcnVudGltZS0+aHcgPSBzbmRfY3M0MjMxX3BsYXliYWNrOwotCi0JLyogaGFyZHdhcmUgYnVnIGluIEludGVyV2F2ZSBjaGlwc2V0ICovCi0JaWYgKGNoaXAtPmhhcmR3YXJlID09IENTNDIzMV9IV19JTlRFUldBVkUgJiYgY2hpcC0+ZG1hMSA+IDMpCi0JICAgIAlydW50aW1lLT5ody5mb3JtYXRzICY9IH5TTkRSVl9QQ01fRk1UQklUX01VX0xBVzsKLQkKLQkvKiBoYXJkd2FyZSBsaW1pdGF0aW9uIG9mIGNoZWFwIGNoaXBzICovCi0JaWYgKGNoaXAtPmhhcmR3YXJlID09IENTNDIzMV9IV19DUzQyMzUgfHwKLQkgICAgY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0NTNDIzOSkKLQkJcnVudGltZS0+aHcuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRTsKLQotCXNuZF9wY21fbGltaXRfaXNhX2RtYV9zaXplKGNoaXAtPmRtYTEsICZydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4KTsKLQlzbmRfcGNtX2xpbWl0X2lzYV9kbWFfc2l6ZShjaGlwLT5kbWExLCAmcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21heCk7Ci0KLQlpZiAoY2hpcC0+Y2xhaW1fZG1hKSB7Ci0JCWlmICgoZXJyID0gY2hpcC0+Y2xhaW1fZG1hKGNoaXAsIGNoaXAtPmRtYV9wcml2YXRlX2RhdGEsIGNoaXAtPmRtYTEpKSA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICgoZXJyID0gc25kX2NzNDIzMV9vcGVuKGNoaXAsIENTNDIzMV9NT0RFX1BMQVkpKSA8IDApIHsKLQkJaWYgKGNoaXAtPnJlbGVhc2VfZG1hKQotCQkJY2hpcC0+cmVsZWFzZV9kbWEoY2hpcCwgY2hpcC0+ZG1hX3ByaXZhdGVfZGF0YSwgY2hpcC0+ZG1hMSk7Ci0JCXNuZF9mcmVlX3BhZ2VzKHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYnl0ZXMpOwotCQlyZXR1cm4gZXJyOwotCX0KLQljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0Jc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOwotCWNoaXAtPnJhdGVfY29uc3RyYWludChydW50aW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWludCBlcnI7Ci0KLQlydW50aW1lLT5odyA9IHNuZF9jczQyMzFfY2FwdHVyZTsKLQotCS8qIGhhcmR3YXJlIGxpbWl0YXRpb24gb2YgY2hlYXAgY2hpcHMgKi8KLQlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0NTNDIzNSB8fAotCSAgICBjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjM5KQotCQlydW50aW1lLT5ody5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFOwotCi0Jc25kX3BjbV9saW1pdF9pc2FfZG1hX3NpemUoY2hpcC0+ZG1hMiwgJnJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOwotCXNuZF9wY21fbGltaXRfaXNhX2RtYV9zaXplKGNoaXAtPmRtYTIsICZydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4KTsKLQotCWlmIChjaGlwLT5jbGFpbV9kbWEpIHsKLQkJaWYgKChlcnIgPSBjaGlwLT5jbGFpbV9kbWEoY2hpcCwgY2hpcC0+ZG1hX3ByaXZhdGVfZGF0YSwgY2hpcC0+ZG1hMikpIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX29wZW4oY2hpcCwgQ1M0MjMxX01PREVfUkVDT1JEKSkgPCAwKSB7Ci0JCWlmIChjaGlwLT5yZWxlYXNlX2RtYSkKLQkJCWNoaXAtPnJlbGVhc2VfZG1hKGNoaXAsIGNoaXAtPmRtYV9wcml2YXRlX2RhdGEsIGNoaXAtPmRtYTIpOwotCQlzbmRfZnJlZV9wYWdlcyhydW50aW1lLT5kbWFfYXJlYSwgcnVudGltZS0+ZG1hX2J5dGVzKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0Jc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOwotCWNoaXAtPnJhdGVfY29uc3RyYWludChydW50aW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX3BsYXliYWNrX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCi0JY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfY3M0MjMxX2Nsb3NlKGNoaXAsIENTNDIzMV9NT0RFX1BMQVkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9jczQyMzFfY2FwdHVyZV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKLQlzbmRfY3M0MjMxX2Nsb3NlKGNoaXAsIENTNDIzMV9NT0RFX1JFQ09SRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotLyogbG93bGV2ZWwgc3VzcGVuZCBjYWxsYmFjayBmb3IgQ1M0MjMxICovCi1zdGF0aWMgdm9pZCBzbmRfY3M0MjMxX3N1c3BlbmQoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0JaW50IHJlZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQotCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyOyByZWcrKykKLQkJY2hpcC0+aW1hZ2VbcmVnXSA9IHNuZF9jczQyMzFfaW4oY2hpcCwgcmVnKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBsb3dsZXZlbCByZXN1bWUgY2FsbGJhY2sgZm9yIENTNDIzMSAqLwotc3RhdGljIHZvaWQgc25kX2NzNDIzMV9yZXN1bWUoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0JaW50IHJlZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCS8qIGludCB0aW1lb3V0OyAqLwotCQotCXNuZF9jczQyMzFfbWNlX3VwKGNoaXApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKSB7Ci0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgQ1M0MjMxX1ZFUlNJT046Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNuZF9jczQyMzFfb3V0KGNoaXAsIHJlZywgY2hpcC0+aW1hZ2VbcmVnXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotI2lmIDEKLQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOwotI2Vsc2UKLQkvKiBUaGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCB0byBhdm9pZCBmcmVlemUgYWZ0ZXIgcmVzdW1lIG9uIFRQNjAwRS4KLQkgICBUaGlzIGlzIHRoZSBmaXJzdCBoYWxmIG9mIGNvcHkgb2Ygc25kX2NzNDIzMV9tY2VfZG93bigpLCBidXQgZG9lc24ndAotCSAgIGluY2x1ZGUgcmVzY2hlZHVsaW5nLiAgLS0gaXdhaQotCSAgICovCi0Jc25kX2NzNDIzMV9idXN5X3dhaXQoY2hpcCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JY2hpcC0+bWNlX2JpdCAmPSB+Q1M0MjMxX01DRTsKLQl0aW1lb3V0ID0gY3M0MjMxX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpOwotCWNzNDIzMV9vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8ICh0aW1lb3V0ICYgMHgxZikpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JaWYgKHRpbWVvdXQgPT0gMHg4MCkKLQkJc25kX3ByaW50aygiZG93biBbMHglbHhdOiBzZXJpb3VzIGluaXQgcHJvYmxlbSAtIGNvZGVjIHN0aWxsIGJ1c3lcbiIsIGNoaXAtPnBvcnQpOwotCWlmICgodGltZW91dCAmIENTNDIzMV9NQ0UpID09IDAgfHwKLQkgICAgIShjaGlwLT5oYXJkd2FyZSAmIChDUzQyMzFfSFdfQ1M0MjMxX01BU0sgfCBDUzQyMzFfSFdfQ1M0MjMyX01BU0spKSkgewotCQlyZXR1cm47Ci0JfQotCXNuZF9jczQyMzFfYnVzeV93YWl0KGNoaXApOwotI2VuZGlmCi19Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9mcmVlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQotewotCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX3BvcnQpOwotCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX2Nwb3J0KTsKLQlpZiAoY2hpcC0+aXJxID49IDApIHsKLQkJZGlzYWJsZV9pcnEoY2hpcC0+aXJxKTsKLQkJaWYgKCEoY2hpcC0+aHdzaGFyZSAmIENTNDIzMV9IV1NIQVJFX0lSUSkpCi0JCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopIGNoaXApOwotCX0KLQlpZiAoIShjaGlwLT5od3NoYXJlICYgQ1M0MjMxX0hXU0hBUkVfRE1BMSkgJiYgY2hpcC0+ZG1hMSA+PSAwKSB7Ci0JCXNuZF9kbWFfZGlzYWJsZShjaGlwLT5kbWExKTsKLQkJZnJlZV9kbWEoY2hpcC0+ZG1hMSk7Ci0JfQotCWlmICghKGNoaXAtPmh3c2hhcmUgJiBDUzQyMzFfSFdTSEFSRV9ETUEyKSAmJiBjaGlwLT5kbWEyID49IDAgJiYgY2hpcC0+ZG1hMiAhPSBjaGlwLT5kbWExKSB7Ci0JCXNuZF9kbWFfZGlzYWJsZShjaGlwLT5kbWEyKTsKLQkJZnJlZV9kbWEoY2hpcC0+ZG1hMik7Ci0JfQotCWlmIChjaGlwLT50aW1lcikKLQkJc25kX2RldmljZV9mcmVlKGNoaXAtPmNhcmQsIGNoaXAtPnRpbWVyKTsKLQlrZnJlZShjaGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXJldHVybiBzbmRfY3M0MjMxX2ZyZWUoY2hpcCk7CQotfQotCi1jb25zdCBjaGFyICpzbmRfY3M0MjMxX2NoaXBfaWQoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0Jc3dpdGNoIChjaGlwLT5oYXJkd2FyZSkgewotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzMToJcmV0dXJuICJDUzQyMzEiOwotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzMUE6IHJldHVybiAiQ1M0MjMxQSI7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjMyOglyZXR1cm4gIkNTNDIzMiI7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjMyQToJcmV0dXJuICJDUzQyMzJBIjsKLQljYXNlIENTNDIzMV9IV19DUzQyMzU6CXJldHVybiAiQ1M0MjM1IjsKLQljYXNlIENTNDIzMV9IV19DUzQyMzY6ICByZXR1cm4gIkNTNDIzNiI7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM2QjogcmV0dXJuICJDUzQyMzZCIjsKLQljYXNlIENTNDIzMV9IV19DUzQyMzdCOiByZXR1cm4gIkNTNDIzN0IiOwotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzOEI6IHJldHVybiAiQ1M0MjM4QiI7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM5OglyZXR1cm4gIkNTNDIzOSI7Ci0JY2FzZSBDUzQyMzFfSFdfSU5URVJXQVZFOiByZXR1cm4gIkFNRCBJbnRlcldhdmUiOwotCWNhc2UgQ1M0MjMxX0hXX09QTDNTQTI6IHJldHVybiBjaGlwLT5jYXJkLT5zaG9ydG5hbWU7Ci0JY2FzZSBDUzQyMzFfSFdfQUQxODQ1OiByZXR1cm4gIkFEMTg0NSI7Ci0JY2FzZSBDUzQyMzFfSFdfT1BUSTkzWDogcmV0dXJuICJPUFRpIDkzeCI7Ci0JZGVmYXVsdDogcmV0dXJuICI/Pz8iOwotCX0KLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlLAotCQkJICB1bnNpZ25lZCBzaG9ydCBod3NoYXJlLAotCQkJICBzdHJ1Y3Qgc25kX2NzNDIzMSAqKiByY2hpcCkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKLQotCSpyY2hpcCA9IE5VTEw7Ci0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNoaXAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY2hpcC0+aGFyZHdhcmUgPSBoYXJkd2FyZTsKLQljaGlwLT5od3NoYXJlID0gaHdzaGFyZTsKLQotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmY2hpcC0+bWNlX211dGV4KTsKLQltdXRleF9pbml0KCZjaGlwLT5vcGVuX211dGV4KTsKLQljaGlwLT5jYXJkID0gY2FyZDsKLQljaGlwLT5yYXRlX2NvbnN0cmFpbnQgPSBzbmRfY3M0MjMxX3hyYXRlOwotCWNoaXAtPnNldF9wbGF5YmFja19mb3JtYXQgPSBzbmRfY3M0MjMxX3BsYXliYWNrX2Zvcm1hdDsKLQljaGlwLT5zZXRfY2FwdHVyZV9mb3JtYXQgPSBzbmRfY3M0MjMxX2NhcHR1cmVfZm9ybWF0OwotCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfT1BUSTkzWCkKLQkJbWVtY3B5KCZjaGlwLT5pbWFnZSwgJnNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlLAotCQkgICAgICAgc2l6ZW9mKHNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlKSk7Ci0JZWxzZQotCQltZW1jcHkoJmNoaXAtPmltYWdlLCAmc25kX2NzNDIzMV9vcmlnaW5hbF9pbWFnZSwKLQkJICAgICAgIHNpemVvZihzbmRfY3M0MjMxX29yaWdpbmFsX2ltYWdlKSk7Ci0KLSAgICAgICAgKnJjaGlwID0gY2hpcDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLWludCBzbmRfY3M0MjMxX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcnQsCi0JICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNwb3J0LAotCQkgICAgICBpbnQgaXJxLCBpbnQgZG1hMSwgaW50IGRtYTIsCi0JCSAgICAgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlLAotCQkgICAgICB1bnNpZ25lZCBzaG9ydCBod3NoYXJlLAotCQkgICAgICBzdHJ1Y3Qgc25kX2NzNDIzMSAqKiByY2hpcCkKLXsKLQlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKLQkJLmRldl9mcmVlID0Jc25kX2NzNDIzMV9kZXZfZnJlZSwKLQl9OwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOwotCWludCBlcnI7Ci0KLQllcnIgPSBzbmRfY3M0MjMxX25ldyhjYXJkLCBoYXJkd2FyZSwgaHdzaGFyZSwgJmNoaXApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCQotCWNoaXAtPmlycSA9IC0xOwotCWNoaXAtPmRtYTEgPSAtMTsKLQljaGlwLT5kbWEyID0gLTE7Ci0KLQlpZiAoKGNoaXAtPnJlc19wb3J0ID0gcmVxdWVzdF9yZWdpb24ocG9ydCwgNCwgIkNTNDIzMSIpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNzNDIzMTogY2FuJ3QgZ3JhYiBwb3J0IDB4JWx4XG4iLCBwb3J0KTsKLQkJc25kX2NzNDIzMV9mcmVlKGNoaXApOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQljaGlwLT5wb3J0ID0gcG9ydDsKLQlpZiAoKGxvbmcpY3BvcnQgPj0gMCAmJiAoY2hpcC0+cmVzX2Nwb3J0ID0gcmVxdWVzdF9yZWdpb24oY3BvcnQsIDgsICJDUzQyMzIgQ29udHJvbCIpKSA9PSBOVUxMKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNzNDIzMTogY2FuJ3QgZ3JhYiBjb250cm9sIHBvcnQgMHglbHhcbiIsIGNwb3J0KTsKLQkJc25kX2NzNDIzMV9mcmVlKGNoaXApOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JY2hpcC0+Y3BvcnQgPSBjcG9ydDsKLQlpZiAoIShod3NoYXJlICYgQ1M0MjMxX0hXU0hBUkVfSVJRKSAmJiByZXF1ZXN0X2lycShpcnEsIHNuZF9jczQyMzFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiQ1M0MjMxIiwgKHZvaWQgKikgY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0MjMxOiBjYW4ndCBncmFiIElSUSAlZFxuIiwgaXJxKTsKLQkJc25kX2NzNDIzMV9mcmVlKGNoaXApOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQljaGlwLT5pcnEgPSBpcnE7Ci0JaWYgKCEoaHdzaGFyZSAmIENTNDIzMV9IV1NIQVJFX0RNQTEpICYmIHJlcXVlc3RfZG1hKGRtYTEsICJDUzQyMzEgLSAxIikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0MjMxOiBjYW4ndCBncmFiIERNQTEgJWRcbiIsIGRtYTEpOwotCQlzbmRfY3M0MjMxX2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWNoaXAtPmRtYTEgPSBkbWExOwotCWlmICghKGh3c2hhcmUgJiBDUzQyMzFfSFdTSEFSRV9ETUEyKSAmJiBkbWExICE9IGRtYTIgJiYgZG1hMiA+PSAwICYmIHJlcXVlc3RfZG1hKGRtYTIsICJDUzQyMzEgLSAyIikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY3M0MjMxOiBjYW4ndCBncmFiIERNQTIgJWRcbiIsIGRtYTIpOwotCQlzbmRfY3M0MjMxX2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWlmIChkbWExID09IGRtYTIgfHwgZG1hMiA8IDApIHsKLQkJY2hpcC0+c2luZ2xlX2RtYSA9IDE7Ci0JCWNoaXAtPmRtYTIgPSBjaGlwLT5kbWExOwotCX0gZWxzZQotCQljaGlwLT5kbWEyID0gZG1hMjsKLQotCS8qIGdsb2JhbCBzZXR1cCAqLwotCWlmIChzbmRfY3M0MjMxX3Byb2JlKGNoaXApIDwgMCkgewotCQlzbmRfY3M0MjMxX2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlzbmRfY3M0MjMxX2luaXQoY2hpcCk7Ci0KLSNpZiAwCi0JaWYgKGNoaXAtPmhhcmR3YXJlICYgQ1M0MjMxX0hXX0NTNDIzMl9NQVNLKSB7Ci0JCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkKLQkJCXNuZF9wcmludGsoIkNTNDIzMiBjb250cm9sIHBvcnQgZmVhdHVyZXMgYXJlIG5vdCBhY2Nlc3NpYmxlXG4iKTsKLQl9Ci0jZW5kaWYKLQotCS8qIFJlZ2lzdGVyIGRldmljZSAqLwotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7Ci0JCXNuZF9jczQyMzFfZnJlZShjaGlwKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQkvKiBQb3dlciBNYW5hZ2VtZW50ICovCi0JY2hpcC0+c3VzcGVuZCA9IHNuZF9jczQyMzFfc3VzcGVuZDsKLQljaGlwLT5yZXN1bWUgPSBzbmRfY3M0MjMxX3Jlc3VtZTsKLSNlbmRpZgotCi0JKnJjaGlwID0gY2hpcDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M0MjMxX3BsYXliYWNrX29wcyA9IHsKLQkub3BlbiA9CQlzbmRfY3M0MjMxX3BsYXliYWNrX29wZW4sCi0JLmNsb3NlID0Jc25kX2NzNDIzMV9wbGF5YmFja19jbG9zZSwKLQkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0Jc25kX2NzNDIzMV9wbGF5YmFja19od19wYXJhbXMsCi0JLmh3X2ZyZWUgPQlzbmRfY3M0MjMxX3BsYXliYWNrX2h3X2ZyZWUsCi0JLnByZXBhcmUgPQlzbmRfY3M0MjMxX3BsYXliYWNrX3ByZXBhcmUsCi0JLnRyaWdnZXIgPQlzbmRfY3M0MjMxX3RyaWdnZXIsCi0JLnBvaW50ZXIgPQlzbmRfY3M0MjMxX3BsYXliYWNrX3BvaW50ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczQyMzFfY2FwdHVyZV9vcHMgPSB7Ci0JLm9wZW4gPQkJc25kX2NzNDIzMV9jYXB0dXJlX29wZW4sCi0JLmNsb3NlID0Jc25kX2NzNDIzMV9jYXB0dXJlX2Nsb3NlLAotCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPQlzbmRfY3M0MjMxX2NhcHR1cmVfaHdfcGFyYW1zLAotCS5od19mcmVlID0Jc25kX2NzNDIzMV9jYXB0dXJlX2h3X2ZyZWUsCi0JLnByZXBhcmUgPQlzbmRfY3M0MjMxX2NhcHR1cmVfcHJlcGFyZSwKLQkudHJpZ2dlciA9CXNuZF9jczQyMzFfdHJpZ2dlciwKLQkucG9pbnRlciA9CXNuZF9jczQyMzFfY2FwdHVyZV9wb2ludGVyLAotfTsKLQotaW50IHNuZF9jczQyMzFfcGNtKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKnJwY20pCi17Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlpbnQgZXJyOwotCi0JaWYgKChlcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQ1M0MjMxIiwgZGV2aWNlLCAxLCAxLCAmcGNtKSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKLQltdXRleF9pbml0KCZjaGlwLT5tY2VfbXV0ZXgpOwotCW11dGV4X2luaXQoJmNoaXAtPm9wZW5fbXV0ZXgpOwotCi0Jc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9jczQyMzFfcGxheWJhY2tfb3BzKTsKLQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY3M0MjMxX2NhcHR1cmVfb3BzKTsKLQkKLQkvKiBnbG9iYWwgc2V0dXAgKi8KLQlwY20tPnByaXZhdGVfZGF0YSA9IGNoaXA7Ci0JcGNtLT5pbmZvX2ZsYWdzID0gMDsKLQlpZiAoY2hpcC0+c2luZ2xlX2RtYSkKLQkJcGNtLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYOwotCWlmIChjaGlwLT5oYXJkd2FyZSAhPSBDUzQyMzFfSFdfSU5URVJXQVZFKQotCQlwY20tPmluZm9fZmxhZ3MgfD0gU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOwotCXN0cmNweShwY20tPm5hbWUsIHNuZF9jczQyMzFfY2hpcF9pZChjaGlwKSk7Ci0KLQlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCQkgICAgICBzbmRfZG1hX2lzYV9kYXRhKCksCi0JCQkJCSAgICAgIDY0KjEwMjQsIGNoaXAtPmRtYTEgPiAzIHx8IGNoaXAtPmRtYTIgPiAzID8gMTI4KjEwMjQgOiA2NCoxMDI0KTsKLQotCWNoaXAtPnBjbSA9IHBjbTsKLQlpZiAocnBjbSkKLQkJKnJwY20gPSBwY207Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNuZF9jczQyMzFfdGltZXJfZnJlZShzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHRpbWVyLT5wcml2YXRlX2RhdGE7Ci0JY2hpcC0+dGltZXIgPSBOVUxMOwotfQotCi1pbnQgc25kX2NzNDIzMV90aW1lcihzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF90aW1lciAqKnJ0aW1lcikKLXsKLQlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcjsKLQlzdHJ1Y3Qgc25kX3RpbWVyX2lkIHRpZDsKLQlpbnQgZXJyOwotCi0JLyogVGltZXIgaW5pdGlhbGl6YXRpb24gKi8KLQl0aWQuZGV2X2NsYXNzID0gU05EUlZfVElNRVJfQ0xBU1NfQ0FSRDsKLQl0aWQuZGV2X3NjbGFzcyA9IFNORFJWX1RJTUVSX1NDTEFTU19OT05FOwotCXRpZC5jYXJkID0gY2hpcC0+Y2FyZC0+bnVtYmVyOwotCXRpZC5kZXZpY2UgPSBkZXZpY2U7Ci0JdGlkLnN1YmRldmljZSA9IDA7Ci0JaWYgKChlcnIgPSBzbmRfdGltZXJfbmV3KGNoaXAtPmNhcmQsICJDUzQyMzEiLCAmdGlkLCAmdGltZXIpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0Jc3RyY3B5KHRpbWVyLT5uYW1lLCBzbmRfY3M0MjMxX2NoaXBfaWQoY2hpcCkpOwotCXRpbWVyLT5wcml2YXRlX2RhdGEgPSBjaGlwOwotCXRpbWVyLT5wcml2YXRlX2ZyZWUgPSBzbmRfY3M0MjMxX3RpbWVyX2ZyZWU7Ci0JdGltZXItPmh3ID0gc25kX2NzNDIzMV90aW1lcl90YWJsZTsKLQljaGlwLT50aW1lciA9IHRpbWVyOwotCWlmIChydGltZXIpCi0JCSpydGltZXIgPSB0aW1lcjsKLQlyZXR1cm4gMDsKLX0KLQkKLS8qCi0gKiAgTUlYRVIgcGFydAotICovCi0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9pbmZvX211eChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7Ci0JCSJMaW5lIiwgIkF1eCIsICJNaWMiLCAiTWl4IgotCX07Ci0Jc3RhdGljIGNoYXIgKm9wbDNzYV90ZXh0c1s0XSA9IHsKLQkJIkxpbmUiLCAiQ0QiLCAiTWljIiwgIk1peCIKLQl9OwotCXN0YXRpYyBjaGFyICpndXNtYXhfdGV4dHNbNF0gPSB7Ci0JCSJMaW5lIiwgIlN5bnRoIiwgIk1pYyIsICJNaXgiCi0JfTsKLQljaGFyICoqcHRleHRzID0gdGV4dHM7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0KLQlzbmRfYXNzZXJ0KGNoaXAtPmNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCXVpbmZvLT5jb3VudCA9IDI7Ci0JdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OwotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMykKLQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDM7Ci0JaWYgKCFzdHJjbXAoY2hpcC0+Y2FyZC0+ZHJpdmVyLCAiR1VTIE1BWCIpKQotCQlwdGV4dHMgPSBndXNtYXhfdGV4dHM7Ci0Jc3dpdGNoIChjaGlwLT5oYXJkd2FyZSkgewotCWNhc2UgQ1M0MjMxX0hXX0lOVEVSV0FWRTogcHRleHRzID0gZ3VzbWF4X3RleHRzOyBicmVhazsKLQljYXNlIENTNDIzMV9IV19PUEwzU0EyOiBwdGV4dHMgPSBvcGwzc2FfdGV4dHM7IGJyZWFrOwotCX0KLQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgcHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfY3M0MjMxX2dldF9tdXgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IChjaGlwLT5pbWFnZVtDUzQyMzFfTEVGVF9JTlBVVF0gJiBDUzQyMzFfTUlYU19BTEwpID4+IDY7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IChjaGlwLT5pbWFnZVtDUzQyMzFfUklHSFRfSU5QVVRdICYgQ1M0MjMxX01JWFNfQUxMKSA+PiA2OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9wdXRfbXV4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHNob3J0IGxlZnQsIHJpZ2h0OwotCWludCBjaGFuZ2U7Ci0JCi0JaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiAzIHx8Ci0JICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlsZWZ0ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCA2OwotCXJpZ2h0ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCA2OwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWxlZnQgPSAoY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfSU5QVVRdICYgfkNTNDIzMV9NSVhTX0FMTCkgfCBsZWZ0OwotCXJpZ2h0ID0gKGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9JTlBVVF0gJiB+Q1M0MjMxX01JWFNfQUxMKSB8IHJpZ2h0OwotCWNoYW5nZSA9IGxlZnQgIT0gY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfSU5QVVRdIHx8Ci0JICAgICAgICAgcmlnaHQgIT0gY2hpcC0+aW1hZ2VbQ1M0MjMxX1JJR0hUX0lOUFVUXTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfTEVGVF9JTlBVVCwgbGVmdCk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1JJR0hUX0lOUFVULCByaWdodCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gY2hhbmdlOwotfQotCi1pbnQgc25kX2NzNDIzMV9pbmZvX3NpbmdsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCi0JdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzbmRfY3M0MjMxX2dldF9zaW5nbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwotCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGNoaXAtPmltYWdlW3JlZ10gPj4gc2hpZnQpICYgbWFzazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCWlmIChpbnZlcnQpCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAwOwotfQotCi1pbnQgc25kX2NzNDIzMV9wdXRfc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7Ci0JaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKLQlpbnQgY2hhbmdlOwotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQkKLQl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKLQlpZiAoaW52ZXJ0KQotCQl2YWwgPSBtYXNrIC0gdmFsOwotCXZhbCA8PD0gc2hpZnQ7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JdmFsID0gKGNoaXAtPmltYWdlW3JlZ10gJiB+KG1hc2sgPDwgc2hpZnQpKSB8IHZhbDsKLQljaGFuZ2UgPSB2YWwgIT0gY2hpcC0+aW1hZ2VbcmVnXTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCByZWcsIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gY2hhbmdlOwotfQotCi1pbnQgc25kX2NzNDIzMV9pbmZvX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCi0JdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMjsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzbmRfY3M0MjMxX2dldF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxlZnRfcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCByaWdodF9yZWcgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwotCWludCBzaGlmdF9sZWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MDc7Ci0JaW50IHNoaWZ0X3JpZ2h0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE5KSAmIDB4MDc7Ci0JaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKLQlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIyKSAmIDE7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoY2hpcC0+aW1hZ2VbbGVmdF9yZWddID4+IHNoaWZ0X2xlZnQpICYgbWFzazsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChjaGlwLT5pbWFnZVtyaWdodF9yZWddID4+IHNoaWZ0X3JpZ2h0KSAmIG1hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAoaW52ZXJ0KSB7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzbmRfY3M0MjMxX3B1dF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxlZnRfcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCByaWdodF9yZWcgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwotCWludCBzaGlmdF9sZWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MDc7Ci0JaW50IHNoaWZ0X3JpZ2h0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE5KSAmIDB4MDc7Ci0JaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKLQlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIyKSAmIDE7Ci0JaW50IGNoYW5nZTsKLQl1bnNpZ25lZCBzaG9ydCB2YWwxLCB2YWwyOwotCQotCXZhbDEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2s7Ci0JdmFsMiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzazsKLQlpZiAoaW52ZXJ0KSB7Ci0JCXZhbDEgPSBtYXNrIC0gdmFsMTsKLQkJdmFsMiA9IG1hc2sgLSB2YWwyOwotCX0KLQl2YWwxIDw8PSBzaGlmdF9sZWZ0OwotCXZhbDIgPDw9IHNoaWZ0X3JpZ2h0OwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXZhbDEgPSAoY2hpcC0+aW1hZ2VbbGVmdF9yZWddICYgfihtYXNrIDw8IHNoaWZ0X2xlZnQpKSB8IHZhbDE7Ci0JdmFsMiA9IChjaGlwLT5pbWFnZVtyaWdodF9yZWddICYgfihtYXNrIDw8IHNoaWZ0X3JpZ2h0KSkgfCB2YWwyOwotCWNoYW5nZSA9IHZhbDEgIT0gY2hpcC0+aW1hZ2VbbGVmdF9yZWddIHx8IHZhbDIgIT0gY2hpcC0+aW1hZ2VbcmlnaHRfcmVnXTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBsZWZ0X3JlZywgdmFsMSk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgcmlnaHRfcmVnLCB2YWwyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjaGFuZ2U7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY3M0MjMxX2NvbnRyb2xzW10gPSB7Ci1DUzQyMzFfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDAsIDAsIDYzLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgMCwgMCwgMzEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfQVVYMV9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgMCwgMCwgMzEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIDEsIENTNDIzMV9BVVgyX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgyX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAxLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMCwgMCwgMzEsIDEpLAotQ1M0MjMxX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzFfTU9OT19DVFJMLCA3LCAxLCAxKSwKLUNTNDIzMV9TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMCwgQ1M0MjMxX01PTk9fQ1RSTCwgMCwgMTUsIDEpLAotQ1M0MjMxX1NJTkdMRSgiTW9ubyBPdXRwdXQgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX01PTk9fQ1RSTCwgNiwgMSwgMSksCi1DUzQyMzFfU0lOR0xFKCJNb25vIE91dHB1dCBQbGF5YmFjayBCeXBhc3MiLCAwLCBDUzQyMzFfTU9OT19DVFJMLCA1LCAxLCAwKSwKLUNTNDIzMV9ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgMCwgQ1M0MjMxX0xFRlRfSU5QVVQsIENTNDIzMV9SSUdIVF9JTlBVVCwgMCwgMCwgMTUsIDApLAotewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKLQkuaW5mbyA9IHNuZF9jczQyMzFfaW5mb19tdXgsCi0JLmdldCA9IHNuZF9jczQyMzFfZ2V0X211eCwKLQkucHV0ID0gc25kX2NzNDIzMV9wdXRfbXV4LAotfSwKLUNTNDIzMV9ET1VCTEUoIk1pYyBCb29zdCIsIDAsIENTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDUsIDUsIDEsIDApLAotQ1M0MjMxX1NJTkdMRSgiTG9vcGJhY2sgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzFfTE9PUEJBQ0ssIDAsIDEsIDApLAotQ1M0MjMxX1NJTkdMRSgiTG9vcGJhY2sgQ2FwdHVyZSBWb2x1bWUiLCAwLCBDUzQyMzFfTE9PUEJBQ0ssIDIsIDYzLCAxKQotfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfb3B0aTkzeF9jb250cm9sc1tdID0gewotQ1M0MjMxX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDAsCi0JICAgICAgT1BUaTkzWF9PVVRfTEVGVCwgT1BUaTkzWF9PVVRfUklHSFQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsCi0JICAgICAgT1BUaTkzWF9PVVRfTEVGVCwgT1BUaTkzWF9PVVRfUklHSFQsIDEsIDEsIDMxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAwLAotCSAgICAgIENTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgNywgNywgMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwKLQkgICAgICBDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDAsIDAsIDMxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkZNIFBsYXliYWNrIFN3aXRjaCIsIDAsCi0JICAgICAgQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiRk0gUGxheWJhY2sgVm9sdW1lIiwgMCwKLQkgICAgICBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMSwgMSwgMTUsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAwLAotCSAgICAgIENTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMCwKLQkgICAgICBDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgMCwgMCwgMTUsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsCi0JICAgICAgT1BUaTkzWF9NSUNfTEVGVF9JTlBVVCwgT1BUaTkzWF9NSUNfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDAsCi0JICAgICAgT1BUaTkzWF9NSUNfTEVGVF9JTlBVVCwgT1BUaTkzWF9NSUNfUklHSFRfSU5QVVQsIDEsIDEsIDE1LCAxKSwKLUNTNDIzMV9ET1VCTEUoIk1pYyBCb29zdCIsIDAsCi0JICAgICAgQ1M0MjMxX0xFRlRfSU5QVVQsIENTNDIzMV9SSUdIVF9JTlBVVCwgNSwgNSwgMSwgMCksCi1DUzQyMzFfRE9VQkxFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAwLAotCSAgICAgIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDAsCi0JICAgICAgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDEsIDEsIDE1LCAxKSwKLUNTNDIzMV9ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAwLAotCSAgICAgIE9QVGk5MzFfQVVYX0xFRlRfSU5QVVQsIE9QVGk5MzFfQVVYX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAwLAotCSAgICAgIE9QVGk5MzFfQVVYX0xFRlRfSU5QVVQsIE9QVGk5MzFfQVVYX1JJR0hUX0lOUFVULCAxLCAxLCAxNSwgMSksCi1DUzQyMzFfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIDAsCi0JICAgICAgQ1M0MjMxX0xFRlRfSU5QVVQsIENTNDIzMV9SSUdIVF9JTlBVVCwgMCwgMCwgMTUsIDApLAotewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKLQkuaW5mbyA9IHNuZF9jczQyMzFfaW5mb19tdXgsCi0JLmdldCA9IHNuZF9jczQyMzFfZ2V0X211eCwKLQkucHV0ID0gc25kX2NzNDIzMV9wdXRfbXV4LAotfQotfTsKLQotaW50IHNuZF9jczQyMzFfbWl4ZXIoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCi17Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXVuc2lnbmVkIGludCBpZHg7Ci0JaW50IGVycjsKLQotCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMICYmIGNoaXAtPnBjbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0KLQljYXJkID0gY2hpcC0+Y2FyZDsKLQotCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIGNoaXAtPnBjbS0+bmFtZSk7Ci0KLQlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX09QVEk5M1gpCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfb3B0aTkzeF9jb250cm9scyk7IGlkeCsrKSB7Ci0JCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLAotCQkJCQlzbmRfY3RsX25ldzEoJnNuZF9vcHRpOTN4X2NvbnRyb2xzW2lkeF0sCi0JCQkJCQkgICAgIGNoaXApKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQllbHNlCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfY3M0MjMxX2NvbnRyb2xzKTsgaWR4KyspIHsKLQkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCi0JCQkJCXNuZF9jdGxfbmV3MSgmc25kX2NzNDIzMV9jb250cm9sc1tpZHhdLAotCQkJCQkJICAgICBjaGlwKSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzMV9vdXQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX2luKTsKLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzNl9leHRfb3V0KTsKLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzNl9leHRfaW4pOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX21jZV91cCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfbWNlX2Rvd24pOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX292ZXJyYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzMV9jaGlwX2lkKTsKLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzMV9jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX3BjbSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfbWl4ZXIpOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX3RpbWVyKTsKLUVYUE9SVF9TWU1CT0woc25kX2NzNDIzMV9pbmZvX3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfZ2V0X3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfcHV0X3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jczQyMzFfaW5mb19kb3VibGUpOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX2dldF9kb3VibGUpOwotRVhQT1JUX1NZTUJPTChzbmRfY3M0MjMxX3B1dF9kb3VibGUpOwotCi0vKgotICogIElOSVQgcGFydAotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGFsc2FfY3M0MjMxX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY3M0MjMxX2V4aXQodm9pZCkKLXsKLX0KLQotbW9kdWxlX2luaXQoYWxzYV9jczQyMzFfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfY3M0MjMxX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYwppbmRleCA0ZDRiOGRkLi45MWY5YzE1IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9jczQyMzEuaD4KKyNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtMTM0LDcgKzEzNCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCiBzdHJ1Y3Qgc25kX2NhcmRfY3M0MjM2IHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19zYl9wb3J0OwogI2lmZGVmIENPTkZJR19QTlAKIAlzdHJ1Y3QgcG5wX2RldiAqd3NzOwpAQCAtMjM5LDYgKzIzOSw4IEBACiAJeyAuaWQgPSAiQ1NDOTgzNiIsIC5kZXZzID0geyB7ICJDU0MwMDAwIiB9LCB7ICJDU0MwMDEwIiB9LCB7ICJDU0MwMDAzIiB9IH0gfSwKIAkvKiBHYWxsYW50IFNDLTcwUCAqLwogCXsgLmlkID0gIkNTQzk4MzciLCAuZGV2cyA9IHsgeyAiQ1NDMDAwMCIgfSwgeyAiQ1NDMDAxMCIgfSwgeyAiQ1NDMDAwMyIgfSB9IH0sCisJLyogVGVjaG1ha2VycyBNRi00MjM2UFcgKi8KKwl7IC5pZCA9ICJDU0NhNzM2IiwgLmRldnMgPSB7IHsgIkNTQzAwMDAiIH0sIHsgIkNTQzAwMTAiIH0sIHsgIkNTQzAwMDMiIH0gfSB9LAogCS8qIFRlcnJhVGVjIEF1ZGlvU3lzdGVtIEVXUzY0WEwgLSBDUzQyMzZCICovCiAJeyAuaWQgPSAiQ1NDYTgzNiIsIC5kZXZzID0geyB7ICJDU0NhODAwIiB9LCB7ICJDU0NhODEwIiB9LCB7ICJDU0NhODAzIiB9IH0gfSwKIAkvKiBUZXJyYVRlYyBBdWRpb1N5c3RlbSBFV1M2NFhMIC0gQ1M0MjM2QiAqLwpAQCAtMzk2LDcgKzM5OCw3IEBACiB7CiAJc3RydWN0IHNuZF9jYXJkX2NzNDIzNiAqYWNhcmQ7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CiAJaW50IGVycjsKIApAQCAtNDA4LDQxICs0MTAsMzcgQEAKIAkJfQogCiAjaWZkZWYgQ1M0MjMyCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX2NyZWF0ZShjYXJkLAotCQkJCSAgICAgcG9ydFtkZXZdLAotCQkJCSAgICAgY3BvcnRbZGV2XSwKLQkJCQkgICAgIGlycVtkZXZdLAotCQkJCSAgICAgZG1hMVtkZXZdLAotCQkJCSAgICAgZG1hMltkZXZdLAotCQkJCSAgICAgQ1M0MjMxX0hXX0RFVEVDVCwKLQkJCQkgICAgIDAsCi0JCQkJICAgICAmY2hpcCkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLCBwb3J0W2Rldl0sIGNwb3J0W2Rldl0sCisJCQkgICAgIGlycVtkZXZdLAorCQkJICAgICBkbWExW2Rldl0sIGRtYTJbZGV2XSwKKwkJCSAgICAgV1NTX0hXX0RFVEVDVCwgMCwgJmNoaXApOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWFjYXJkLT5jaGlwID0gY2hpcDsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV9wY20oY2hpcCwgMCwgJnBjbSkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX3BjbShjaGlwLCAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV9taXhlcihjaGlwKSkgPCAwKQorCWVyciA9IHNuZF93c3NfbWl4ZXIoY2hpcCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKICNlbHNlIC8qIENTNDIzNiAqLwotCWlmICgoZXJyID0gc25kX2NzNDIzNl9jcmVhdGUoY2FyZCwKLQkJCQkgICAgIHBvcnRbZGV2XSwKLQkJCQkgICAgIGNwb3J0W2Rldl0sCi0JCQkJICAgICBpcnFbZGV2XSwKLQkJCQkgICAgIGRtYTFbZGV2XSwKLQkJCQkgICAgIGRtYTJbZGV2XSwKLQkJCQkgICAgIENTNDIzMV9IV19ERVRFQ1QsCi0JCQkJICAgICAwLAotCQkJCSAgICAgJmNoaXApKSA8IDApCisJZXJyID0gc25kX2NzNDIzNl9jcmVhdGUoY2FyZCwKKwkJCQlwb3J0W2Rldl0sIGNwb3J0W2Rldl0sCisJCQkJaXJxW2Rldl0sIGRtYTFbZGV2XSwgZG1hMltkZXZdLAorCQkJCVdTU19IV19ERVRFQ1QsIDAsICZjaGlwKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlhY2FyZC0+Y2hpcCA9IGNoaXA7CiAKLQlpZiAoKGVyciA9IHNuZF9jczQyMzZfcGNtKGNoaXAsIDAsICZwY20pKSA8IDApCisJZXJyID0gc25kX2NzNDIzNl9wY20oY2hpcCwgMCwgJnBjbSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoKGVyciA9IHNuZF9jczQyMzZfbWl4ZXIoY2hpcCkpIDwgMCkKKwllcnIgPSBzbmRfY3M0MjM2X21peGVyKGNoaXApOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogI2VuZGlmCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgcGNtLT5uYW1lKTsKQEAgLTQ1NSw3ICs0NTMsOCBAQAogCWlmIChkbWEyW2Rldl0gPj0gMCkKIAkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksICImJWQiLCBkbWEyW2Rldl0pOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3RpbWVyKGNoaXAsIDAsIE5VTEwpKSA8IDApCisJZXJyID0gc25kX3dzc190aW1lcihjaGlwLCAwLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCWlmIChmbV9wb3J0W2Rldl0gPiAwICYmIGZtX3BvcnRbZGV2XSAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2X2xpYi5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzZfbGliLmMKaW5kZXggZGU3MTkxMC4uNmE4NWZkYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzZfbGliLmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzZfbGliLmMKQEAgLTg1LDcgKzg1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9jczQyMzEuaD4KKyNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwpAQCAtMTIxLDEzICsxMjEsMTQgQEAKICAqCiAgKi8KIAotc3RhdGljIHZvaWQgc25kX2NzNDIzNl9jdHJsX291dChzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQorc3RhdGljIHZvaWQgc25kX2NzNDIzNl9jdHJsX291dChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwKKwkJCQl1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCiB7CiAJb3V0YihyZWcsIGNoaXAtPmNwb3J0ICsgMyk7CiAJb3V0YihjaGlwLT5jaW1hZ2VbcmVnXSA9IHZhbCwgY2hpcC0+Y3BvcnQgKyA0KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX2NzNDIzNl9jdHJsX2luKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9jczQyMzZfY3RybF9pbihzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJb3V0YihyZWcsIGNoaXAtPmNwb3J0ICsgMyk7CiAJcmV0dXJuIGluYihjaGlwLT5jcG9ydCArIDQpOwpAQCAtMTgwLDQ0ICsxODEsNTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9jczQyMzZfcGxheWJhY2tfZm9ybWF0KHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgdW5zaWduZWQgY2hhciBwZGZyKQorc3RhdGljIHZvaWQgc25kX2NzNDIzNl9wbGF5YmFja19mb3JtYXQoc3RydWN0IHNuZF93c3MgKmNoaXAsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHBkZnIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHJhdGUgPSBkaXZpc29yX3RvX3JhdGVfcmVnaXN0ZXIocGFyYW1zLT5yYXRlX2Rlbik7CiAJCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJLyogc2V0IGZhc3QgcGxheWJhY2sgZm9ybWF0IGNoYW5nZSBhbmQgY2xlYW4gcGxheWJhY2sgRklGTyAqLwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfCAweDEwKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgcGRmciAmIDB4ZjApOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJiB+MHgxMCk7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsCisJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfCAweDEwKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgcGRmciAmIDB4ZjApOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLAorCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FMVF9GRUFUVVJFXzFdICYgfjB4MTApOwogCXNuZF9jczQyMzZfZXh0X291dChjaGlwLCBDUzQyMzZfREFDX1JBVEUsIHJhdGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9jczQyMzZfY2FwdHVyZV9mb3JtYXQoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCB1bnNpZ25lZCBjaGFyIGNkZnIpCitzdGF0aWMgdm9pZCBzbmRfY3M0MjM2X2NhcHR1cmVfZm9ybWF0KHN0cnVjdCBzbmRfd3NzICpjaGlwLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgY2RmcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgcmF0ZSA9IGRpdmlzb3JfdG9fcmF0ZV9yZWdpc3RlcihwYXJhbXMtPnJhdGVfZGVuKTsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAkvKiBzZXQgZmFzdCBjYXB0dXJlIGZvcm1hdCBjaGFuZ2UgYW5kIGNsZWFuIGNhcHR1cmUgRklGTyAqLwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfCAweDIwKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUkVDX0ZPUk1BVCwgY2RmciAmIDB4ZjApOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJiB+MHgyMCk7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsCisJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfCAweDIwKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUkVDX0ZPUk1BVCwgY2RmciAmIDB4ZjApOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLAorCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FMVF9GRUFUVVJFXzFdICYgfjB4MjApOwogCXNuZF9jczQyMzZfZXh0X291dChjaGlwLCBDUzQyMzZfQURDX1JBVEUsIHJhdGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KIAotc3RhdGljIHZvaWQgc25kX2NzNDIzNl9zdXNwZW5kKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQorc3RhdGljIHZvaWQgc25kX2NzNDIzNl9zdXNwZW5kKHN0cnVjdCBzbmRfd3NzICpjaGlwKQogewogCWludCByZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyOyByZWcrKykKLQkJY2hpcC0+aW1hZ2VbcmVnXSA9IHNuZF9jczQyMzFfaW4oY2hpcCwgcmVnKTsKKwkJY2hpcC0+aW1hZ2VbcmVnXSA9IHNuZF93c3NfaW4oY2hpcCwgcmVnKTsKIAlmb3IgKHJlZyA9IDA7IHJlZyA8IDE4OyByZWcrKykKIAkJY2hpcC0+ZWltYWdlW3JlZ10gPSBzbmRfY3M0MjM2X2V4dF9pbihjaGlwLCBDUzQyMzZfSTIzVkFMKHJlZykpOwogCWZvciAocmVnID0gMjsgcmVnIDwgOTsgcmVnKyspCkBAIC0yMjUsMTIgKzIzNCwxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9jczQyMzZfcmVzdW1lKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQorc3RhdGljIHZvaWQgc25kX2NzNDIzNl9yZXN1bWUoc3RydWN0IHNuZF93c3MgKmNoaXApCiB7CiAJaW50IHJlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQotCXNuZF9jczQyMzFfbWNlX3VwKGNoaXApOworCXNuZF93c3NfbWNlX3VwKGNoaXApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKSB7CiAJCXN3aXRjaCAocmVnKSB7CkBAIC0yNDAsNyArMjQ5LDcgQEAKIAkJY2FzZSAyOToJLyogd2h5PyBDUzQyMzUgLSBtYXN0ZXIgcmlnaHQgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgcmVnLCBjaGlwLT5pbWFnZVtyZWddKTsKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIHJlZywgY2hpcC0+aW1hZ2VbcmVnXSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI1NSw3ICsyNjQsNyBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2NzNDIzMV9tY2VfZG93bihjaGlwKTsKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCkBAIC0yNjYsMjQgKzI3NSwyNiBAQAogCQkgICAgICBpbnQgaXJxLCBpbnQgZG1hMSwgaW50IGRtYTIsCiAJCSAgICAgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlLAogCQkgICAgICB1bnNpZ25lZCBzaG9ydCBod3NoYXJlLAotCQkgICAgICBzdHJ1Y3Qgc25kX2NzNDIzMSAqKiByY2hpcCkKKwkJICAgICAgc3RydWN0IHNuZF93c3MgKipyY2hpcCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKIAl1bnNpZ25lZCBjaGFyIHZlcjEsIHZlcjI7CiAJdW5zaWduZWQgaW50IHJlZzsKIAlpbnQgZXJyOwogCiAJKnJjaGlwID0gTlVMTDsKLQlpZiAoaGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0RFVEVDVCkKLQkJaGFyZHdhcmUgPSBDUzQyMzFfSFdfREVURUNUMzsKKwlpZiAoaGFyZHdhcmUgPT0gV1NTX0hXX0RFVEVDVCkKKwkJaGFyZHdhcmUgPSBXU1NfSFdfREVURUNUMzsKIAlpZiAoY3BvcnQgPCAweDEwMCkgewogCQlzbmRfcHJpbnRrKCJwbGVhc2UsIHNwZWNpZnkgY29udHJvbCBwb3J0IGZvciBDUzQyMzYrIGNoaXBzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmICgoZXJyID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwgcG9ydCwgY3BvcnQsIGlycSwgZG1hMSwgZG1hMiwgaGFyZHdhcmUsIGh3c2hhcmUsICZjaGlwKSkgPCAwKQorCWVyciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsIHBvcnQsIGNwb3J0LAorCQkJICAgICBpcnEsIGRtYTEsIGRtYTIsIGhhcmR3YXJlLCBod3NoYXJlLCAmY2hpcCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIENTNDIzMV9IV19DUzQyMzZCX01BU0spKSB7CisJaWYgKCEoY2hpcC0+aGFyZHdhcmUgJiBXU1NfSFdfQ1M0MjM2Ql9NQVNLKSkgewogCSAgICAgICAgc25kX3ByaW50aygiQ1M0MjM2KzogTU9ERTMgYW5kIGV4dGVuZGVkIHJlZ2lzdGVycyBub3QgYXZhaWxhYmxlLCBoYXJkd2FyZT0weCV4XG4iLGNoaXAtPmhhcmR3YXJlKTsKIAkJc25kX2RldmljZV9mcmVlKGNhcmQsIGNoaXApOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTMzMCwyMCArMzQxLDIwIEBACiAJCXNuZF9jczQyMzZfZXh0X291dChjaGlwLCBDUzQyMzZfSTIzVkFMKHJlZyksIHNuZF9jczQyMzZfZXh0X21hcFtyZWddKTsKIAogICAgICAgICAvKiBpbml0aWFsaXplIGNvbXBhdGlibGUgYnV0IG1vcmUgZmVhdHVyZWQgcmVnaXN0ZXJzICovCi0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0xFRlRfSU5QVVQsIDB4NDApOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9JTlBVVCwgMHg0MCk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgMHhmZik7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDB4ZmYpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BVVgyX0xFRlRfSU5QVVQsIDB4ZGYpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9BVVgyX1JJR0hUX0lOUFVULCAweGRmKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUklHSFRfTElORV9JTiwgMHhmZik7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgMHhmZik7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDB4ZmYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9MRUZUX0lOUFVULCAweDQwKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUklHSFRfSU5QVVQsIDB4NDApOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIDB4ZmYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCAweGZmKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCAweGRmKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMHhkZik7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDB4ZmYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9MRUZUX0xJTkVfSU4sIDB4ZmYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9MSU5FX0lOLCAweGZmKTsKIAlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM1OgotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzOToKLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjM1X0xFRlRfTUFTVEVSLCAweGZmKTsKLQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjM1X1JJR0hUX01BU1RFUiwgMHhmZik7CisJY2FzZSBXU1NfSFdfQ1M0MjM1OgorCWNhc2UgV1NTX0hXX0NTNDIzOToKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjM1X0xFRlRfTUFTVEVSLCAweGZmKTsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjM1X1JJR0hUX01BU1RFUiwgMHhmZik7CiAJCWJyZWFrOwogCX0KIApAQCAtMzUxLDEyICszNjIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNuZF9jczQyMzZfcGNtKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKnJwY20pCitpbnQgc25kX2NzNDIzNl9wY20oc3RydWN0IHNuZF93c3MgKmNoaXAsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfcGNtICoqcnBjbSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAJCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3BjbShjaGlwLCBkZXZpY2UsICZwY20pKSA8IDApCisJZXJyID0gc25kX3dzc19wY20oY2hpcCwgZGV2aWNlLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlwY20tPmluZm9fZmxhZ3MgJj0gflNORFJWX1BDTV9JTkZPX0pPSU5UX0RVUExFWDsKIAlpZiAocnBjbSkKQEAgLTM4Nyw3ICszOTksNyBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQyMzZfZ2V0X3NpbmdsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwogCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CkBAIC00MDQsNyArNDE2LDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9zaW5nbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKIAlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwpAQCAtNDMzLDcgKzQ0NSw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2NzNDIzNl9nZXRfc2luZ2xlYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwogCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CkBAIC00NTAsNyArNDYyLDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9zaW5nbGVjKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CiAJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKQEAgLTQ5MCw3ICs1MDIsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQyMzZfZ2V0X2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbGVmdF9yZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CiAJaW50IHJpZ2h0X3JlZyA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CkBAIC01MTIsNyArNTI0LDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxlZnRfcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwogCWludCByaWdodF9yZWcgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOwpAQCAtNTU1LDcgKzU2Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2NzNDIzNl9nZXRfZG91YmxlMShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbGVmdF9yZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CiAJaW50IHJpZ2h0X3JlZyA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CkBAIC01NzcsNyArNTg5LDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9kb3VibGUxKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKIAlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKQEAgLTYwMCw3ICs2MTIsNyBAQAogCXZhbDEgPSAoY2hpcC0+aW1hZ2VbbGVmdF9yZWddICYgfihtYXNrIDw8IHNoaWZ0X2xlZnQpKSB8IHZhbDE7CiAJdmFsMiA9IChjaGlwLT5laW1hZ2VbQ1M0MjM2X1JFRyhyaWdodF9yZWcpXSAmIH4obWFzayA8PCBzaGlmdF9yaWdodCkpIHwgdmFsMjsKIAljaGFuZ2UgPSB2YWwxICE9IGNoaXAtPmltYWdlW2xlZnRfcmVnXSB8fCB2YWwyICE9IGNoaXAtPmVpbWFnZVtDUzQyMzZfUkVHKHJpZ2h0X3JlZyldOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIGxlZnRfcmVnLCB2YWwxKTsKKwlzbmRfd3NzX291dChjaGlwLCBsZWZ0X3JlZywgdmFsMSk7CiAJc25kX2NzNDIzNl9leHRfb3V0KGNoaXAsIHJpZ2h0X3JlZywgdmFsMik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gY2hhbmdlOwpAQCAtNjE5LDcgKzYzMSw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2NzNDIzNl9nZXRfbWFzdGVyX2RpZ2l0YWwoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC02MzEsNyArNjQzLDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9tYXN0ZXJfZGlnaXRhbChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY2hhbmdlOwogCXVuc2lnbmVkIHNob3J0IHZhbDEsIHZhbDI7CkBAIC02NzgsNyArNjkwLDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM1X2dldF9vdXRwdXRfYWNjdShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTY5MCw3ICs3MDIsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQyMzVfcHV0X291dHB1dF9hY2N1KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjaGFuZ2U7CiAJdW5zaWduZWQgc2hvcnQgdmFsMSwgdmFsMjsKQEAgLTcwMSwxMDggKzcxMywxNjAgQEAKIAl2YWwxID0gKGNoaXAtPmltYWdlW0NTNDIzNV9MRUZUX01BU1RFUl0gJiB+KDMgPDwgNSkpIHwgdmFsMTsKIAl2YWwyID0gKGNoaXAtPmltYWdlW0NTNDIzNV9SSUdIVF9NQVNURVJdICYgfigzIDw8IDUpKSB8IHZhbDI7CiAJY2hhbmdlID0gdmFsMSAhPSBjaGlwLT5pbWFnZVtDUzQyMzVfTEVGVF9NQVNURVJdIHx8IHZhbDIgIT0gY2hpcC0+aW1hZ2VbQ1M0MjM1X1JJR0hUX01BU1RFUl07Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjM1X0xFRlRfTUFTVEVSLCB2YWwxKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzVfUklHSFRfTUFTVEVSLCB2YWwyKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzVfTEVGVF9NQVNURVIsIHZhbDEpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzNV9SSUdIVF9NQVNURVIsIHZhbDIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNoYW5nZTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9jczQyMzZfY29udHJvbHNbXSA9IHsKIAotQ1M0MjM2X0RPVUJMRSgiTWFzdGVyIERpZ2l0YWwgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjM2X0xFRlRfTUFTVEVSLCBDUzQyMzZfUklHSFRfTUFTVEVSLCA3LCA3LCAxLCAxKSwKLUNTNDIzNl9ET1VCTEUoIk1hc3RlciBEaWdpdGFsIENhcHR1cmUgU3dpdGNoIiwgMCwgQ1M0MjM2X0RBQ19NVVRFLCBDUzQyMzZfREFDX01VVEUsIDcsIDYsIDEsIDEpLAorQ1M0MjM2X0RPVUJMRSgiTWFzdGVyIERpZ2l0YWwgUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJQ1M0MjM2X0xFRlRfTUFTVEVSLCBDUzQyMzZfUklHSFRfTUFTVEVSLCA3LCA3LCAxLCAxKSwKK0NTNDIzNl9ET1VCTEUoIk1hc3RlciBEaWdpdGFsIENhcHR1cmUgU3dpdGNoIiwgMCwKKwkJQ1M0MjM2X0RBQ19NVVRFLCBDUzQyMzZfREFDX01VVEUsIDcsIDYsIDEsIDEpLAogQ1M0MjM2X01BU1RFUl9ESUdJVEFMKCJNYXN0ZXIgRGlnaXRhbCBWb2x1bWUiLCAwKSwKIAotQ1M0MjM2X0RPVUJMRSgiQ2FwdHVyZSBCb29zdCBWb2x1bWUiLCAwLCBDUzQyMzZfTEVGVF9NSVhfQ1RSTCwgQ1M0MjM2X1JJR0hUX01JWF9DVFJMLCA1LCA1LCAzLCAxKSwKK0NTNDIzNl9ET1VCTEUoIkNhcHR1cmUgQm9vc3QgVm9sdW1lIiwgMCwKKwkJQ1M0MjM2X0xFRlRfTUlYX0NUUkwsIENTNDIzNl9SSUdIVF9NSVhfQ1RSTCwgNSwgNSwgMywgMSksCiAKLUNTNDIzMV9ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiUENNIFBsYXliYWNrIFZvbHVtZSIsIDAsIENTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgMCwgMCwgNjMsIDEpLAorV1NTX0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULCAwLCAwLCA2MywgMSksCiAKLUNTNDIzNl9ET1VCTEUoIkRTUCBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9EU1AsIENTNDIzNl9SSUdIVF9EU1AsIDcsIDcsIDEsIDEpLAotQ1M0MjM2X0RPVUJMRSgiRFNQIFBsYXliYWNrIFZvbHVtZSIsIDAsIENTNDIzNl9MRUZUX0RTUCwgQ1M0MjM2X1JJR0hUX0RTUCwgMCwgMCwgNjMsIDEpLAorQ1M0MjM2X0RPVUJMRSgiRFNQIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzNl9MRUZUX0RTUCwgQ1M0MjM2X1JJR0hUX0RTUCwgNywgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJEU1AgUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjM2X0xFRlRfRFNQLCBDUzQyMzZfUklHSFRfRFNQLCAwLCAwLCA2MywgMSksCiAKLUNTNDIzNl9ET1VCTEUoIkZNIFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzNl9MRUZUX0ZNLCBDUzQyMzZfUklHSFRfRk0sIDcsIDcsIDEsIDEpLAotQ1M0MjM2X0RPVUJMRSgiRk0gUGxheWJhY2sgVm9sdW1lIiwgMCwgQ1M0MjM2X0xFRlRfRk0sIENTNDIzNl9SSUdIVF9GTSwgMCwgMCwgNjMsIDEpLAorQ1M0MjM2X0RPVUJMRSgiRk0gUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJQ1M0MjM2X0xFRlRfRk0sIENTNDIzNl9SSUdIVF9GTSwgNywgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJGTSBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlDUzQyMzZfTEVGVF9GTSwgQ1M0MjM2X1JJR0hUX0ZNLCAwLCAwLCA2MywgMSksCiAKLUNTNDIzNl9ET1VCTEUoIldhdmV0YWJsZSBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9XQVZFLCBDUzQyMzZfUklHSFRfV0FWRSwgNywgNywgMSwgMSksCi1DUzQyMzZfRE9VQkxFKCJXYXZldGFibGUgUGxheWJhY2sgVm9sdW1lIiwgMCwgQ1M0MjM2X0xFRlRfV0FWRSwgQ1M0MjM2X1JJR0hUX1dBVkUsIDAsIDAsIDYzLCAxKSwKK0NTNDIzNl9ET1VCTEUoIldhdmV0YWJsZSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzZfTEVGVF9XQVZFLCBDUzQyMzZfUklHSFRfV0FWRSwgNywgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJXYXZldGFibGUgUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjM2X0xFRlRfV0FWRSwgQ1M0MjM2X1JJR0hUX1dBVkUsIDAsIDAsIDYzLCAxKSwKIAotQ1M0MjMxX0RPVUJMRSgiU3ludGggUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiU3ludGggVm9sdW1lIiwgMCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDAsIDAsIDMxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIlN5bnRoIENhcHR1cmUgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfTElORV9JTiwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDYsIDYsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiU3ludGggQ2FwdHVyZSBCeXBhc3MiLCAwLCBDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNSwgNSwgMSwgMSksCitXU1NfRE9VQkxFKCJTeW50aCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJTeW50aCBWb2x1bWUiLCAwLAorCQlDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgMCwgMCwgMzEsIDEpLAorV1NTX0RPVUJMRSgiU3ludGggQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNiwgNiwgMSwgMSksCitXU1NfRE9VQkxFKCJTeW50aCBDYXB0dXJlIEJ5cGFzcyIsIDAsCisJCUNTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCA1LCA1LCAxLCAxKSwKIAotQ1M0MjM2X0RPVUJMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgNiwgNiwgMSwgMSksCi1DUzQyMzZfRE9VQkxFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9NSUMsIENTNDIzNl9SSUdIVF9NSUMsIDcsIDcsIDEsIDEpLAorQ1M0MjM2X0RPVUJMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgNiwgNiwgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzZfTEVGVF9NSUMsIENTNDIzNl9SSUdIVF9NSUMsIDcsIDcsIDEsIDEpLAogQ1M0MjM2X0RPVUJMRSgiTWljIFZvbHVtZSIsIDAsIENTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgMCwgMCwgMzEsIDEpLAotQ1M0MjM2X0RPVUJMRSgiTWljIFBsYXliYWNrIEJvb3N0IiwgMCwgQ1M0MjM2X0xFRlRfTUlDLCBDUzQyMzZfUklHSFRfTUlDLCA1LCA1LCAxLCAwKSwKK0NTNDIzNl9ET1VCTEUoIk1pYyBQbGF5YmFjayBCb29zdCIsIDAsCisJCUNTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgNSwgNSwgMSwgMCksCiAKLUNTNDIzMV9ET1VCTEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTGluZSBWb2x1bWUiLCAwLCBDUzQyMzFfQVVYMV9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgMCwgMCwgMzEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiTGluZSBDYXB0dXJlIFN3aXRjaCIsIDAsIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA2LCA2LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIkxpbmUgQ2FwdHVyZSBCeXBhc3MiLCAwLCBDUzQyMzFfQVVYMV9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgNSwgNSwgMSwgMSksCitXU1NfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEUoIkxpbmUgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIkxpbmUgQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzFfQVVYMV9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgNiwgNiwgMSwgMSksCitXU1NfRE9VQkxFKCJMaW5lIENhcHR1cmUgQnlwYXNzIiwgMCwKKwkJQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDUsIDUsIDEsIDEpLAogCi1DUzQyMzFfRE9VQkxFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJDRCBWb2x1bWUiLCAwLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMCwgMCwgMzEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiQ0QgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNiwgNiwgMSwgMSksCitXU1NfRE9VQkxFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJDRCBWb2x1bWUiLCAwLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMCwgMCwgMzEsIDEpLAorV1NTX0RPVUJMRSgiQ0QgQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNiwgNiwgMSwgMSksCiAKLUNTNDIzNl9ET1VCTEUxKCJNb25vIE91dHB1dCBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzFfTU9OT19DVFJMLCBDUzQyMzZfUklHSFRfTUlYX0NUUkwsIDYsIDcsIDEsIDEpLAotQ1M0MjM2X0RPVUJMRTEoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX01PTk9fQ1RSTCwgQ1M0MjM2X0xFRlRfTUlYX0NUUkwsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTU9OT19DVFJMLCAwLCAxNSwgMSksCi1DUzQyMzFfU0lOR0xFKCJNb25vIFBsYXliYWNrIEJ5cGFzcyIsIDAsIENTNDIzMV9NT05PX0NUUkwsIDUsIDEsIDApLAorQ1M0MjM2X0RPVUJMRTEoIk1vbm8gT3V0cHV0IFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9NT05PX0NUUkwsIENTNDIzNl9SSUdIVF9NSVhfQ1RSTCwgNiwgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFMSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTU9OT19DVFJMLCBDUzQyMzZfTEVGVF9NSVhfQ1RSTCwgNywgNywgMSwgMSksCitXU1NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDAsIENTNDIzMV9NT05PX0NUUkwsIDAsIDE1LCAxKSwKK1dTU19TSU5HTEUoIk1vbm8gUGxheWJhY2sgQnlwYXNzIiwgMCwgQ1M0MjMxX01PTk9fQ1RSTCwgNSwgMSwgMCksCiAKLUNTNDIzMV9ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgMCwgQ1M0MjMxX0xFRlRfSU5QVVQsIENTNDIzMV9SSUdIVF9JTlBVVCwgMCwgMCwgMTUsIDApLAotQ1M0MjMxX0RPVUJMRSgiQW5hbG9nIExvb3BiYWNrIENhcHR1cmUgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfSU5QVVQsIENTNDIzMV9SSUdIVF9JTlBVVCwgNywgNywgMSwgMCksCitXU1NfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDAsIDAsIDE1LCAwKSwKK1dTU19ET1VCTEUoIkFuYWxvZyBMb29wYmFjayBDYXB0dXJlIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDApLAogCi1DUzQyMzFfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzMV9MT09QQkFDSywgMCwgMSwgMCksCi1DUzQyMzZfRE9VQkxFMSgiRGlnaXRhbCBMb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTE9PUEJBQ0ssIENTNDIzNl9SSUdIVF9MT09QQkFDSywgMiwgMCwgNjMsIDEpCitXU1NfU0lOR0xFKCJEaWdpdGFsIExvb3BiYWNrIFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzMV9MT09QQkFDSywgMCwgMSwgMCksCitDUzQyMzZfRE9VQkxFMSgiRGlnaXRhbCBMb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlDUzQyMzFfTE9PUEJBQ0ssIENTNDIzNl9SSUdIVF9MT09QQkFDSywgMiwgMCwgNjMsIDEpCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2NzNDIzNV9jb250cm9sc1tdID0gewogCi1DUzQyMzFfRE9VQkxFKCJNYXN0ZXIgU3dpdGNoIiwgMCwgQ1M0MjM1X0xFRlRfTUFTVEVSLCBDUzQyMzVfUklHSFRfTUFTVEVSLCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIk1hc3RlciBWb2x1bWUiLCAwLCBDUzQyMzVfTEVGVF9NQVNURVIsIENTNDIzNV9SSUdIVF9NQVNURVIsIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIk1hc3RlciBTd2l0Y2giLCAwLAorCQlDUzQyMzVfTEVGVF9NQVNURVIsIENTNDIzNV9SSUdIVF9NQVNURVIsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiTWFzdGVyIFZvbHVtZSIsIDAsCisJCUNTNDIzNV9MRUZUX01BU1RFUiwgQ1M0MjM1X1JJR0hUX01BU1RFUiwgMCwgMCwgMzEsIDEpLAogCiBDUzQyMzVfT1VUUFVUX0FDQ1UoIlBsYXliYWNrIFZvbHVtZSIsIDApLAogCi1DUzQyMzZfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9NQVNURVIsIENTNDIzNl9SSUdIVF9NQVNURVIsIDcsIDcsIDEsIDEpLAotQ1M0MjM2X0RPVUJMRSgiTWFzdGVyIERpZ2l0YWwgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzZfREFDX01VVEUsIENTNDIzNl9EQUNfTVVURSwgNywgNiwgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzZfTEVGVF9NQVNURVIsIENTNDIzNl9SSUdIVF9NQVNURVIsIDcsIDcsIDEsIDEpLAorQ1M0MjM2X0RPVUJMRSgiTWFzdGVyIERpZ2l0YWwgQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzZfREFDX01VVEUsIENTNDIzNl9EQUNfTVVURSwgNywgNiwgMSwgMSksCiBDUzQyMzZfTUFTVEVSX0RJR0lUQUwoIk1hc3RlciBEaWdpdGFsIFZvbHVtZSIsIDApLAogCi1DUzQyMzFfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBQbGF5YmFjayBTd2l0Y2giLCAxLCBDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNywgNywgMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBDYXB0dXJlIFN3aXRjaCIsIDEsIENTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCA2LCA2LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIk1hc3RlciBEaWdpdGFsIFZvbHVtZSIsIDEsIENTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCAwLCAwLCAzMSwgMSksCitXU1NfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBQbGF5YmFjayBTd2l0Y2giLCAxLAorCQlDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJNYXN0ZXIgRGlnaXRhbCBDYXB0dXJlIFN3aXRjaCIsIDEsCisJCUNTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCA2LCA2LCAxLCAxKSwKK1dTU19ET1VCTEUoIk1hc3RlciBEaWdpdGFsIFZvbHVtZSIsIDEsCisJCUNTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCAwLCAwLCAzMSwgMSksCiAKLUNTNDIzNl9ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgMCwgQ1M0MjM2X0xFRlRfTUlYX0NUUkwsIENTNDIzNl9SSUdIVF9NSVhfQ1RSTCwgNSwgNSwgMywgMSksCitDUzQyMzZfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNTNDIzNl9MRUZUX01JWF9DVFJMLCBDUzQyMzZfUklHSFRfTUlYX0NUUkwsIDUsIDUsIDMsIDEpLAogCi1DUzQyMzFfRE9VQkxFKCJQQ00gU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIlBDTSBWb2x1bWUiLCAwLCBDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDAsIDAsIDYzLCAxKSwKK1dTU19ET1VCTEUoIlBDTSBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiUENNIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgMCwgMCwgNjMsIDEpLAogCiBDUzQyMzZfRE9VQkxFKCJEU1AgU3dpdGNoIiwgMCwgQ1M0MjM2X0xFRlRfRFNQLCBDUzQyMzZfUklHSFRfRFNQLCA3LCA3LCAxLCAxKSwKIAogQ1M0MjM2X0RPVUJMRSgiRk0gU3dpdGNoIiwgMCwgQ1M0MjM2X0xFRlRfRk0sIENTNDIzNl9SSUdIVF9GTSwgNywgNywgMSwgMSksCiAKLUNTNDIzNl9ET1VCTEUoIldhdmV0YWJsZSBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9XQVZFLCBDUzQyMzZfUklHSFRfV0FWRSwgNywgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJXYXZldGFibGUgU3dpdGNoIiwgMCwKKwkJQ1M0MjM2X0xFRlRfV0FWRSwgQ1M0MjM2X1JJR0hUX1dBVkUsIDcsIDcsIDEsIDEpLAogCi1DUzQyMzZfRE9VQkxFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzZfTEVGVF9NSUMsIENTNDIzNl9SSUdIVF9NSUMsIDcsIDcsIDEsIDEpLAotQ1M0MjM2X0RPVUJMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsIENTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgNiwgNiwgMSwgMSksCitDUzQyMzZfRE9VQkxFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAwLAorCQlDUzQyMzZfTEVGVF9NSUMsIENTNDIzNl9SSUdIVF9NSUMsIDcsIDcsIDEsIDEpLAorQ1M0MjM2X0RPVUJMRSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzNl9MRUZUX01JQywgQ1M0MjM2X1JJR0hUX01JQywgNiwgNiwgMSwgMSksCiBDUzQyMzZfU0lOR0xFKCJNaWMgVm9sdW1lIiwgMCwgQ1M0MjM2X0xFRlRfTUlDLCAwLCAzMSwgMSksCiBDUzQyMzZfU0lOR0xFKCJNaWMgUGxheWJhY2sgQm9vc3QiLCAwLCBDUzQyMzZfTEVGVF9NSUMsIDUsIDEsIDApLAogCi1DUzQyMzFfRE9VQkxFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiQXV4IENhcHR1cmUgU3dpdGNoIiwgMCwgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDYsIDYsIDEsIDEpLAotQ1M0MjMxX0RPVUJMRSgiQXV4IFZvbHVtZSIsIDAsIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCAwLCAwLCAzMSwgMSksCitXU1NfRE9VQkxFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiQXV4IENhcHR1cmUgU3dpdGNoIiwgMCwKKwkJQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDYsIDYsIDEsIDEpLAorV1NTX0RPVUJMRSgiQXV4IFZvbHVtZSIsIDAsCisJCUNTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCAwLCAwLCAzMSwgMSksCiAKLUNTNDIzMV9ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJBdXggQ2FwdHVyZSBTd2l0Y2giLCAxLCBDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNiwgNiwgMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJBdXggVm9sdW1lIiwgMSwgQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJBdXggQ2FwdHVyZSBTd2l0Y2giLCAxLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNiwgNiwgMSwgMSksCitXU1NfRE9VQkxFKCJBdXggVm9sdW1lIiwgMSwKKwkJQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxKSwKIAotQ1M0MjM2X0RPVUJMRTEoIk1hc3RlciBNb25vIFN3aXRjaCIsIDAsIENTNDIzMV9NT05PX0NUUkwsIENTNDIzNl9SSUdIVF9NSVhfQ1RSTCwgNiwgNywgMSwgMSksCitDUzQyMzZfRE9VQkxFMSgiTWFzdGVyIE1vbm8gU3dpdGNoIiwgMCwKKwkJQ1M0MjMxX01PTk9fQ1RSTCwgQ1M0MjM2X1JJR0hUX01JWF9DVFJMLCA2LCA3LCAxLCAxKSwKIAotQ1M0MjM2X0RPVUJMRTEoIk1vbm8gU3dpdGNoIiwgMCwgQ1M0MjMxX01PTk9fQ1RSTCwgQ1M0MjM2X0xFRlRfTUlYX0NUUkwsIDcsIDcsIDEsIDEpLAotQ1M0MjMxX1NJTkdMRSgiTW9ubyBWb2x1bWUiLCAwLCBDUzQyMzFfTU9OT19DVFJMLCAwLCAxNSwgMSksCitDUzQyMzZfRE9VQkxFMSgiTW9ubyBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTU9OT19DVFJMLCBDUzQyMzZfTEVGVF9NSVhfQ1RSTCwgNywgNywgMSwgMSksCitXU1NfU0lOR0xFKCJNb25vIFZvbHVtZSIsIDAsIENTNDIzMV9NT05PX0NUUkwsIDAsIDE1LCAxKSwKIAotQ1M0MjMxX0RPVUJMRSgiQW5hbG9nIExvb3BiYWNrIFN3aXRjaCIsIDAsIENTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDApLAorV1NTX0RPVUJMRSgiQW5hbG9nIExvb3BiYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDApLAogfTsKIAogI2RlZmluZSBDUzQyMzZfSUVDOTU4X0VOQUJMRSh4bmFtZSwgeGluZGV4KSBcCkBAIC04MTMsMTQgKzg3NywxNCBAQAogCiBzdGF0aWMgaW50IHNuZF9jczQyMzZfZ2V0X2llYzk1OF9zd2l0Y2goc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJiAweDAyID8gMSA6IDA7CiAjaWYgMAogCXByaW50aygiZ2V0IHZhbGlkOiBBTFQgPSAweCV4LCBDMyA9IDB4JXgsIEM0ID0gMHgleCwgQzUgPSAweCV4LCBDNiA9IDB4JXgsIEM4ID0gMHgleFxuIiwKLQkJCXNuZF9jczQyMzFfaW4oY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEpLAorCQkJc25kX3dzc19pbihjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSksCiAJCQlzbmRfY3M0MjM2X2N0cmxfaW4oY2hpcCwgMyksCiAJCQlzbmRfY3M0MjM2X2N0cmxfaW4oY2hpcCwgNCksCiAJCQlzbmRfY3M0MjM2X2N0cmxfaW4oY2hpcCwgNSksCkBAIC04MzMsNyArODk3LDcgQEAKIAogc3RhdGljIGludCBzbmRfY3M0MjM2X3B1dF9pZWM5NThfc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjaGFuZ2U7CiAJdW5zaWduZWQgc2hvcnQgZW5hYmxlLCB2YWw7CkBAIC04NDEsMjMgKzkwNSwyMyBAQAogCWVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKIAogCW11dGV4X2xvY2soJmNoaXAtPm1jZV9tdXRleCk7Ci0Jc25kX2NzNDIzMV9tY2VfdXAoY2hpcCk7CisJc25kX3dzc19tY2VfdXAoY2hpcCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJdmFsID0gKGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSAmIH4weDBlKSB8ICgwPDwyKSB8IChlbmFibGUgPDwgMSk7CiAJY2hhbmdlID0gdmFsICE9IGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSwgdmFsKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSwgdmFsKTsKIAl2YWwgPSBzbmRfY3M0MjM2X2N0cmxfaW4oY2hpcCwgNCkgfCAweGMwOwogCXNuZF9jczQyMzZfY3RybF9vdXQoY2hpcCwgNCwgdmFsKTsKIAl1ZGVsYXkoMTAwKTsKIAl2YWwgJj0gfjB4NDA7CiAJc25kX2NzNDIzNl9jdHJsX291dChjaGlwLCA0LCB2YWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jc25kX2NzNDIzMV9tY2VfZG93bihjaGlwKTsKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOwogCW11dGV4X3VubG9jaygmY2hpcC0+bWNlX211dGV4KTsKIAogI2lmIDAKIAlwcmludGsoInNldCB2YWxpZDogQUxUID0gMHgleCwgQzMgPSAweCV4LCBDNCA9IDB4JXgsIEM1ID0gMHgleCwgQzYgPSAweCV4LCBDOCA9IDB4JXhcbiIsCi0JCQlzbmRfY3M0MjMxX2luKGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xKSwKKwkJCXNuZF93c3NfaW4oY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEpLAogCQkJc25kX2NzNDIzNl9jdHJsX2luKGNoaXAsIDMpLAogCQkJc25kX2NzNDIzNl9jdHJsX2luKGNoaXAsIDQpLAogCQkJc25kX2NzNDIzNl9jdHJsX2luKGNoaXAsIDUpLApAQCAtODk2LDE5ICs5NjAsMjAgQEAKIENTNDIzNl9TSU5HTEVDKCIzRCBDb250cm9sIC0gSUVDOTU4IiwgMCwgMywgNSwgMSwgMCkKIH07CiAKLWludCBzbmRfY3M0MjM2X21peGVyKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQoraW50IHNuZF9jczQyMzZfbWl4ZXIoc3RydWN0IHNuZF93c3MgKmNoaXApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXVuc2lnbmVkIGludCBpZHgsIGNvdW50OwogCWludCBlcnI7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sOwogCi0Jc25kX2Fzc2VydChjaGlwICE9IE5VTEwgJiYgY2hpcC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAljYXJkID0gY2hpcC0+Y2FyZDsKLQlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCBzbmRfY3M0MjMxX2NoaXBfaWQoY2hpcCkpOworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIHNuZF93c3NfY2hpcF9pZChjaGlwKSk7CiAKLQlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gQ1M0MjMxX0hXX0NTNDIzNSB8fAotCSAgICBjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjM5KSB7CisJaWYgKGNoaXAtPmhhcmR3YXJlID09IFdTU19IV19DUzQyMzUgfHwKKwkgICAgY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX0NTNDIzOSkgewogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NzNDIzNV9jb250cm9scyk7IGlkeCsrKSB7CiAJCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2NzNDIzNV9jb250cm9sc1tpZHhdLCBjaGlwKSkpIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwpAQCAtOTIwLDE2ICs5ODUsMTYgQEAKIAkJfQogCX0KIAlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7Ci0JY2FzZSBDUzQyMzFfSFdfQ1M0MjM1OgotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzOToKKwljYXNlIFdTU19IV19DUzQyMzU6CisJY2FzZSBXU1NfSFdfQ1M0MjM5OgogCQljb3VudCA9IEFSUkFZX1NJWkUoc25kX2NzNDIzNl8zZF9jb250cm9sc19jczQyMzUpOwogCQlrY29udHJvbCA9IHNuZF9jczQyMzZfM2RfY29udHJvbHNfY3M0MjM1OwogCQlicmVhazsKLQljYXNlIENTNDIzMV9IV19DUzQyMzdCOgorCWNhc2UgV1NTX0hXX0NTNDIzN0I6CiAJCWNvdW50ID0gQVJSQVlfU0laRShzbmRfY3M0MjM2XzNkX2NvbnRyb2xzX2NzNDIzNyk7CiAJCWtjb250cm9sID0gc25kX2NzNDIzNl8zZF9jb250cm9sc19jczQyMzc7CiAJCWJyZWFrOwotCWNhc2UgQ1M0MjMxX0hXX0NTNDIzOEI6CisJY2FzZSBXU1NfSFdfQ1M0MjM4QjoKIAkJY291bnQgPSBBUlJBWV9TSVpFKHNuZF9jczQyMzZfM2RfY29udHJvbHNfY3M0MjM4KTsKIAkJa2NvbnRyb2wgPSBzbmRfY3M0MjM2XzNkX2NvbnRyb2xzX2NzNDIzODsKIAkJYnJlYWs7CkBAIC05NDEsOCArMTAwNiw4IEBACiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKGtjb250cm9sLCBjaGlwKSkpIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjM3QiB8fAotCSAgICBjaGlwLT5oYXJkd2FyZSA9PSBDUzQyMzFfSFdfQ1M0MjM4QikgeworCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfQ1M0MjM3QiB8fAorCSAgICBjaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfQ1M0MjM4QikgewogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2NzNDIzNl9pZWM5NThfY29udHJvbHMpOyBpZHgrKykgewogCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9jczQyMzZfaWVjOTU4X2NvbnRyb2xzW2lkeF0sIGNoaXApKSkgPCAwKQogCQkJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OF9saWIuYyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4X2xpYi5jCmluZGV4IDFlMWU1NzUuLjRmYmI1MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4X2xpYi5jCisrKyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4X2xpYi5jCkBAIC0xMDA5LDcgKzEwMDksOCBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgY2hhciByZWcsIHZhbDsKIAotCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMICYmIGNoaXAtPmNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjaGlwIHx8ICFjaGlwLT5jYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljYXJkID0gY2hpcC0+Y2FyZDsKIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jIGIvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jCmluZGV4IGNjY2MxNmMuLjEyZWI5OGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c19tYWluLmMKQEAgLTI3Niw5ICsyNzYsMTEgQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBkbWFzWzhdID0KIAkJezYsIDEsIDAsIDIsIDAsIDMsIDQsIDV9OwogCi0Jc25kX2Fzc2VydChndXMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFndXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAljYXJkID0gZ3VzLT5jYXJkOwotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWd1cy0+bWl4X2NudHJsX3JlZyAmPSAweGY4OwogCWd1cy0+bWl4X2NudHJsX3JlZyB8PSAweDAxOwkvKiBkaXNhYmxlIE1JQywgTElORSBJTiwgZW5hYmxlIExJTkUgT1VUICovCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c19taXhlci5jIGIvc291bmQvaXNhL2d1cy9ndXNfbWl4ZXIuYwppbmRleCBlYmRiMzM0Li4wZGQ0MzQxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c19taXhlci5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzX21peGVyLmMKQEAgLTE2MSw5ICsxNjEsMTEgQEAKIAl1bnNpZ25lZCBpbnQgaWR4LCBtYXg7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoZ3VzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZ3VzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJY2FyZCA9IGd1cy0+Y2FyZDsKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZ3VzLT5pY3NfZmxhZykKIAkJc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgIklDUzIxMDEiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX3BjbS5jIGIvc291bmQvaXNhL2d1cy9ndXNfcGNtLmMKaW5kZXggOTk3MzFkYy4uMzg1MTBhZSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNfcGNtLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfcGNtLmMKQEAgLTM1Miw4ICszNTIsMTAgQEAKIAkKIAlicG9zID0gc2FtcGxlc190b19ieXRlcyhydW50aW1lLCBwb3MpICsgKHZvaWNlICogKHBjbXAtPmRtYV9zaXplIC8gMikpOwogCWxlbiA9IHNhbXBsZXNfdG9fYnl0ZXMocnVudGltZSwgY291bnQpOwotCXNuZF9hc3NlcnQoYnBvcyA8PSBwY21wLT5kbWFfc2l6ZSwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoYnBvcyArIGxlbiA8PSBwY21wLT5kbWFfc2l6ZSwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKGJwb3MgPiBwY21wLT5kbWFfc2l6ZSkpCisJCXJldHVybiAtRUlPOworCWlmIChzbmRfQlVHX09OKGJwb3MgKyBsZW4gPiBwY21wLT5kbWFfc2l6ZSkpCisJCXJldHVybiAtRUlPOwogCWlmIChjb3B5X2Zyb21fdXNlcihydW50aW1lLT5kbWFfYXJlYSArIGJwb3MsIHNyYywgbGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKHNuZF9nZjFfcGNtX3VzZV9kbWEgJiYgbGVuID4gMzIpIHsKQEAgLTM4MSw4ICszODMsMTAgQEAKIAkKIAlicG9zID0gc2FtcGxlc190b19ieXRlcyhydW50aW1lLCBwb3MpICsgKHZvaWNlICogKHBjbXAtPmRtYV9zaXplIC8gMikpOwogCWxlbiA9IHNhbXBsZXNfdG9fYnl0ZXMocnVudGltZSwgY291bnQpOwotCXNuZF9hc3NlcnQoYnBvcyA8PSBwY21wLT5kbWFfc2l6ZSwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoYnBvcyArIGxlbiA8PSBwY21wLT5kbWFfc2l6ZSwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKGJwb3MgPiBwY21wLT5kbWFfc2l6ZSkpCisJCXJldHVybiAtRUlPOworCWlmIChzbmRfQlVHX09OKGJwb3MgKyBsZW4gPiBwY21wLT5kbWFfc2l6ZSkpCisJCXJldHVybiAtRUlPOwogCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKHJ1bnRpbWUtPmZvcm1hdCwgcnVudGltZS0+ZG1hX2FyZWEgKyBicG9zLCBjb3VudCk7CiAJaWYgKHNuZF9nZjFfcGNtX3VzZV9kbWEgJiYgbGVuID4gMzIpIHsKIAkJcmV0dXJuIHNuZF9nZjFfcGNtX2Jsb2NrX2NoYW5nZShzdWJzdHJlYW0sIGJwb3MsIHBjbXAtPm1lbW9yeSArIGJwb3MsIGxlbik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwppbmRleCBmODdjNjIzLi5mOTRjMTk3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2d1cy5oPgotI2luY2x1ZGUgPHNvdW5kL2NzNDIzMS5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2RlZmluZSBTTkRSVl9MRUdBQ1lfRklORF9GUkVFX0lSUQogI2RlZmluZSBTTkRSVl9MRUdBQ1lfRklORF9GUkVFX0RNQQogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KQEAgLTc1LDcgKzc1LDcgQEAKIAlpbnQgaXJxOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2d1c19jYXJkICpndXM7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNzNDIzMTsKKwlzdHJ1Y3Qgc25kX3dzcyAqd3NzOwogCXVuc2lnbmVkIHNob3J0IGd1c19zdGF0dXNfcmVnOwogCXVuc2lnbmVkIHNob3J0IHBjbV9zdGF0dXNfcmVnOwogfTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCQl9CiAJCWlmIChpbmIobWF4Y2FyZC0+cGNtX3N0YXR1c19yZWcpICYgMHgwMSkgeyAvKiBJUlEgYml0IGlzIHNldD8gKi8KIAkJCWhhbmRsZWQgPSAxOwotCQkJc25kX2NzNDIzMV9pbnRlcnJ1cHQoaXJxLCBtYXhjYXJkLT5jczQyMzEpOworCQkJc25kX3dzc19pbnRlcnJ1cHQoaXJxLCBtYXhjYXJkLT53c3MpOwogCQkJbG9vcCsrOwogCQl9CiAJfSB3aGlsZSAobG9vcCAmJiAtLW1heCA+IDApOwpAQCAtMTQwLDEwICsxNDAsNyBAQAogCW91dGIoZ3VzLT5tYXhfY250cmxfdmFsLCBHVVNQKGd1cywgTUFYQ05UUkxQT1JUKSk7CiB9CiAKLSNkZWZpbmUgQ1M0MjMxX1BSSVZBVEUoIGxlZnQsIHJpZ2h0LCBzaGlmdCwgbXV0ZSApIFwKLQkJCSgobGVmdCA8PCAyNCl8KHJpZ2h0IDw8IDE2KXwoc2hpZnQ8PDgpfG11dGUpCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNtYXhfbWl4ZXIoc3RydWN0IHNuZF9jczQyMzEgKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzbWF4X21peGVyKHN0cnVjdCBzbmRfd3NzICpjaGlwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDEsIGlkMjsKQEAgLTIxNCw3ICsyMTEsNyBAQAogCWludCB4aXJxLCB4ZG1hMSwgeGRtYTIsIGVycjsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9ndXNfY2FyZCAqZ3VzID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY3M0MjMxOworCXN0cnVjdCBzbmRfd3NzICp3c3M7CiAJc3RydWN0IHNuZF9ndXNtYXggKm1heGNhcmQ7CiAKIAljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLApAQCAtMzAxLDMzICsyOTgsMzkgQEAKIAl9CiAJbWF4Y2FyZC0+aXJxID0geGlycTsKIAkKLQlpZiAoKGVyciA9IHNuZF9jczQyMzFfY3JlYXRlKGNhcmQsCi0JCQkJICAgICBndXMtPmdmMS5wb3J0ICsgMHgxMGMsIC0xLCB4aXJxLAotCQkJCSAgICAgeGRtYTIgPCAwID8geGRtYTEgOiB4ZG1hMiwgeGRtYTEsCi0JCQkJICAgICBDUzQyMzFfSFdfREVURUNULAotCQkJCSAgICAgQ1M0MjMxX0hXU0hBUkVfSVJRIHwKLQkJCQkgICAgIENTNDIzMV9IV1NIQVJFX0RNQTEgfAotCQkJCSAgICAgQ1M0MjMxX0hXU0hBUkVfRE1BMiwKLQkJCQkgICAgICZjczQyMzEpKSA8IDApCisJZXJyID0gc25kX3dzc19jcmVhdGUoY2FyZCwKKwkJCSAgICAgZ3VzLT5nZjEucG9ydCArIDB4MTBjLCAtMSwgeGlycSwKKwkJCSAgICAgeGRtYTIgPCAwID8geGRtYTEgOiB4ZG1hMiwgeGRtYTEsCisJCQkgICAgIFdTU19IV19ERVRFQ1QsCisJCQkgICAgIFdTU19IV1NIQVJFX0lSUSB8CisJCQkgICAgIFdTU19IV1NIQVJFX0RNQTEgfAorCQkJICAgICBXU1NfSFdTSEFSRV9ETUEyLAorCQkJICAgICAmd3NzKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBfZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3BjbShjczQyMzEsIDAsIE5VTEwpKSA8IDApCisJZXJyID0gc25kX3dzc19wY20od3NzLCAwLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBfZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX21peGVyKGNzNDIzMSkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX21peGVyKHdzcyk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV90aW1lcihjczQyMzEsIDIsIE5VTEwpKSA8IDApCisJZXJyID0gc25kX3dzc190aW1lcih3c3MsIDIsIE5VTEwpOworCWlmIChlcnIgPCAwKQogCQlnb3RvIF9lcnI7CiAKIAlpZiAocGNtX2NoYW5uZWxzW2Rldl0gPiAwKSB7CiAJCWlmICgoZXJyID0gc25kX2dmMV9wY21fbmV3KGd1cywgMSwgMSwgTlVMTCkpIDwgMCkKIAkJCWdvdG8gX2VycjsKIAl9Ci0JaWYgKChlcnIgPSBzbmRfZ3VzbWF4X21peGVyKGNzNDIzMSkpIDwgMCkKKwllcnIgPSBzbmRfZ3VzbWF4X21peGVyKHdzcyk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKIAotCWlmICgoZXJyID0gc25kX2dmMV9yYXdtaWRpX25ldyhndXMsIDAsIE5VTEwpKSA8IDApCisJZXJyID0gc25kX2dmMV9yYXdtaWRpX25ldyhndXMsIDAsIE5VTEwpOworCWlmIChlcnIgPCAwKQogCQlnb3RvIF9lcnI7CiAKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiBhdCAweCVseCwgaXJxICVpLCBkbWEgJWkiLCBndXMtPmdmMS5wb3J0LCB4aXJxLCB4ZG1hMSk7CkBAIC0zMzYsMTEgKzMzOSwxMiBAQAogCiAJc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBfZXJyOwogCQkKIAltYXhjYXJkLT5ndXMgPSBndXM7Ci0JbWF4Y2FyZC0+Y3M0MjMxID0gY3M0MjMxOworCW1heGNhcmQtPndzcyA9IHdzczsKIAogCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMgYi9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCmluZGV4IGNhMGQ3YWMuLjVmYWVjZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKKysrIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZ3VzLmg+Ci0jaW5jbHVkZSA8c291bmQvY3M0MjMxLmg+CisjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaWZkZWYgU05EUlZfU1RCCiAjaW5jbHVkZSA8c291bmQvdGVhNjMzMHQuaD4KICNlbmRpZgpAQCAtMTE4LDcgKzExOCw3IEBACiAJaW50IGlycTsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9ndXNfY2FyZCAqZ3VzOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjczQyMzE7CisJc3RydWN0IHNuZF93c3MgKndzczsKICNpZmRlZiBTTkRSVl9TVEIKIAlzdHJ1Y3QgcmVzb3VyY2UgKmkyY19yZXM7CiAjZW5kaWYKQEAgLTMxMiw3ICszMTIsNyBAQAogCQl9CiAJCWlmIChpbmIoaXdjYXJkLT5wY21fc3RhdHVzX3JlZykgJiAweDAxKSB7CS8qIElSUSBiaXQgaXMgc2V0PyAqLwogCQkJaGFuZGxlZCA9IDE7Ci0JCQlzbmRfY3M0MjMxX2ludGVycnVwdChpcnEsIGl3Y2FyZC0+Y3M0MjMxKTsKKwkJCXNuZF93c3NfaW50ZXJydXB0KGlycSwgaXdjYXJkLT53c3MpOwogCQkJbG9vcCsrOwogCQl9CiAJfSB3aGlsZSAobG9vcCAmJiAtLW1heCA+IDApOwpAQCAtNDk4LDEzICs0OTgsMTcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pbnRlcndhdmVfY29udHJvbHNbXSA9IHsKLUNTNDIzMV9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAwLCBDUzQyMzFfTElORV9MRUZUX09VVFBVVCwgQ1M0MjMxX0xJTkVfUklHSFRfT1VUUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTElORV9MRUZUX09VVFBVVCwgQ1M0MjMxX0xJTkVfUklHSFRfT1VUUFVULCAwLCAwLCAzMSwgMSksCi1DUzQyMzFfRE9VQkxFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfTUlDX0lOUFVULCBDUzQyMzFfUklHSFRfTUlDX0lOUFVULCA3LCA3LCAxLCAxKSwKLUNTNDIzMV9ET1VCTEUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAwLCBDUzQyMzFfTEVGVF9NSUNfSU5QVVQsIENTNDIzMV9SSUdIVF9NSUNfSU5QVVQsIDAsIDAsIDMxLCAxKQorV1NTX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MSU5FX0xFRlRfT1VUUFVULCBDUzQyMzFfTElORV9SSUdIVF9PVVRQVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MSU5FX0xFRlRfT1VUUFVULCBDUzQyMzFfTElORV9SSUdIVF9PVVRQVVQsIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9NSUNfSU5QVVQsIENTNDIzMV9SSUdIVF9NSUNfSU5QVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX01JQ19JTlBVVCwgQ1M0MjMxX1JJR0hUX01JQ19JTlBVVCwgMCwgMCwgMzEsIDEpCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZXJ3YXZlX21peGVyKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVyd2F2ZV9taXhlcihzdHJ1Y3Qgc25kX3dzcyAqY2hpcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjaGlwLT5jYXJkOwogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQxLCBpZDI7CkBAIC01MjcsMTAgKzUzMSwxMCBAQAogCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfaW50ZXJ3YXZlX2NvbnRyb2xzKTsgaWR4KyspCiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfaW50ZXJ3YXZlX2NvbnRyb2xzW2lkeF0sIGNoaXApKSkgPCAwKQogCQkJcmV0dXJuIGVycjsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfTElORV9MRUZUX09VVFBVVCwgMHg5Zik7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX0xJTkVfUklHSFRfT1VUUFVULCAweDlmKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfTEVGVF9NSUNfSU5QVVQsIDB4OWYpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9NSUNfSU5QVVQsIDB4OWYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9MSU5FX0xFRlRfT1VUUFVULCAweDlmKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfTElORV9SSUdIVF9PVVRQVVQsIDB4OWYpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9MRUZUX01JQ19JTlBVVCwgMHg5Zik7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1JJR0hUX01JQ19JTlBVVCwgMHg5Zik7CiAJLyogcmVhc3NpZ24gQVVYQSB0byBTWU5USEVTSVpFUiAqLwogCXN0cmNweShpZDEubmFtZSwgIkF1eCBQbGF5YmFjayBTd2l0Y2giKTsKIAlzdHJjcHkoaWQyLm5hbWUsICJTeW50aCBQbGF5YmFjayBTd2l0Y2giKTsKQEAgLTY0Miw3ICs2NDYsNyBAQAogewogCWludCB4aXJxLCB4ZG1hMSwgeGRtYTI7CiAJc3RydWN0IHNuZF9pbnRlcndhdmUgKml3Y2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY3M0MjMxOworCXN0cnVjdCBzbmRfd3NzICp3c3M7CiAJc3RydWN0IHNuZF9ndXNfY2FyZCAqZ3VzOwogI2lmZGVmIFNORFJWX1NUQgogCXN0cnVjdCBzbmRfaTJjX2J1cyAqaTJjX2J1czsKQEAgLTY4NCwzMyArNjg4LDM5IEBACiAJfQogCWl3Y2FyZC0+aXJxID0geGlycTsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwKLQkJCQkgICAgIGd1cy0+Z2YxLnBvcnQgKyAweDEwYywgLTEsIHhpcnEsCi0JCQkJICAgICB4ZG1hMiA8IDAgPyB4ZG1hMSA6IHhkbWEyLCB4ZG1hMSwKLQkJCQkgICAgIENTNDIzMV9IV19JTlRFUldBVkUsCi0JCQkJICAgICBDUzQyMzFfSFdTSEFSRV9JUlEgfAotCQkJCSAgICAgQ1M0MjMxX0hXU0hBUkVfRE1BMSB8Ci0JCQkJICAgICBDUzQyMzFfSFdTSEFSRV9ETUEyLAotCQkJCSAgICAgJmNzNDIzMSkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLAorCQkJICAgICBndXMtPmdmMS5wb3J0ICsgMHgxMGMsIC0xLCB4aXJxLAorCQkJICAgICB4ZG1hMiA8IDAgPyB4ZG1hMSA6IHhkbWEyLCB4ZG1hMSwKKwkJCSAgICAgV1NTX0hXX0lOVEVSV0FWRSwKKwkJCSAgICAgV1NTX0hXU0hBUkVfSVJRIHwKKwkJCSAgICAgV1NTX0hXU0hBUkVfRE1BMSB8CisJCQkgICAgIFdTU19IV1NIQVJFX0RNQTIsCisJCQkgICAgICZ3c3MpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3BjbShjczQyMzEsIDAsICZwY20pKSA8IDApCisJZXJyID0gc25kX3dzc19wY20od3NzLCAwLCAmcGNtKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNwcmludGYocGNtLT5uYW1lICsgc3RybGVuKHBjbS0+bmFtZSksICIgcmV2ICVjIiwgZ3VzLT5yZXZpc2lvbiArICdBJyk7CiAJc3RyY2F0KHBjbS0+bmFtZSwgIiAoY29kZWMpIik7CiAKLQlpZiAoKGVyciA9IHNuZF9jczQyMzFfdGltZXIoY3M0MjMxLCAyLCBOVUxMKSkgPCAwKQorCWVyciA9IHNuZF93c3NfdGltZXIod3NzLCAyLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV9taXhlcihjczQyMzEpKSA8IDApCisJZXJyID0gc25kX3dzc19taXhlcih3c3MpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJaWYgKHBjbV9jaGFubmVsc1tkZXZdID4gMCkgewotCQlpZiAoKGVyciA9IHNuZF9nZjFfcGNtX25ldyhndXMsIDEsIDEsIE5VTEwpKSA8IDApCisJCWVyciA9IHNuZF9nZjFfcGNtX25ldyhndXMsIDEsIDEsIE5VTEwpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCWlmICgoZXJyID0gc25kX2ludGVyd2F2ZV9taXhlcihjczQyMzEpKSA8IDApCisJZXJyID0gc25kX2ludGVyd2F2ZV9taXhlcih3c3MpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAjaWZkZWYgU05EUlZfU1RCCkBAIC03NTQsMTAgKzc2NCwxMSBAQAogCWlmICh4ZG1hMiA+PSAwKQogCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiYlZCIsIHhkbWEyKTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAkKLQlpd2NhcmQtPmNzNDIzMSA9IGNzNDIzMTsKKwlpd2NhcmQtPndzcyA9IHdzczsKIAlpd2NhcmQtPmd1cyA9IGd1czsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IDg1NGE5ZjcuLjU4Yzk3MmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NzNDIzMS5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0xMjQsNyArMTI0LDYgQEAKICNkZWZpbmUgT1BMM1NBMl9QTV9EMwkoT1BMM1NBMl9QTV9BRE9XTnxPUEwzU0EyX1BNX1BTVnxPUEwzU0EyX1BNX1BETnxPUEwzU0EyX1BNX1BEWCkKIAogc3RydWN0IHNuZF9vcGwzc2EyIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IHZlcnNpb247CQkvKiAyIG9yIDMgKi8KIAl1bnNpZ25lZCBsb25nIHBvcnQ7CS8qIGNvbnRyb2wgcG9ydCAqLwogCXN0cnVjdCByZXNvdXJjZSAqcmVzX3BvcnQ7IC8qIGNvbnRyb2wgcG9ydCByZXNvdXJjZSAqLwpAQCAtMTMzLDcgKzEzMiw3IEBACiAJc3BpbmxvY2tfdCByZWdfbG9jazsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpzeW50aDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjczQyMzE7CisJc3RydWN0IHNuZF93c3MgKndzczsKIAl1bnNpZ25lZCBjaGFyIGN0bHJlZ3NbMHgyMF07CiAJaW50IHltb2RlOwkJLyogU0wgYWRkZWQgKi8KIAlzdHJ1Y3Qgc25kX2tjb250cm9sICptYXN0ZXJfc3dpdGNoOwpAQCAtMjIyLDE0ICsyMjEsMTMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9kZXRlY3Qoc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX29wbDNzYTJfZGV0ZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgcG9ydDsKIAl1bnNpZ25lZCBjaGFyIHRtcCwgdG1wMTsKIAljaGFyIHN0clsyXTsKIAotCWNhcmQgPSBjaGlwLT5jYXJkOwogCXBvcnQgPSBjaGlwLT5wb3J0OwogCWlmICgoY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCAyLCAiT1BMMy1TQSBjb250cm9sIikpID09IE5VTEwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggImNhbid0IGdyYWIgcG9ydCAweCVseFxuIiwgcG9ydCk7CkBAIC0yOTgsMTIgKzI5NiwxNCBAQAogc3RhdGljIGlycXJldHVybl90IHNuZF9vcGwzc2EyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotCXN0cnVjdCBzbmRfb3BsM3NhMiAqY2hpcCA9IGRldl9pZDsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfaWQ7CisJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwOwogCWludCBoYW5kbGVkID0gMDsKIAotCWlmIChjaGlwID09IE5VTEwgfHwgY2hpcC0+Y2FyZCA9PSBOVUxMKQorCWlmIChjYXJkID09IE5VTEwpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc3RhdHVzID0gc25kX29wbDNzYTJfcmVhZChjaGlwLCBPUEwzU0EyX0lSUV9TVEFUVVMpOwogCiAJaWYgKHN0YXR1cyAmIDB4MjApIHsKQEAgLTMxOCw3ICszMTgsNyBAQAogCiAJaWYgKHN0YXR1cyAmIDB4MDcpIHsJLyogVEksQ0ksUEkgKi8KIAkJaGFuZGxlZCA9IDE7Ci0JCXNuZF9jczQyMzFfaW50ZXJydXB0KGlycSwgY2hpcC0+Y3M0MjMxKTsKKwkJc25kX3dzc19pbnRlcnJ1cHQoaXJxLCBjaGlwLT53c3MpOwogCX0KIAogCWlmIChzdGF0dXMgJiAweDQwKSB7IC8qIGhhcmR3YXJlIHZvbHVtZSBjaGFuZ2UgKi8KQEAgLTMyNyw4ICszMjcsMTAgQEAKIAkJc25kX29wbDNzYTJfcmVhZChjaGlwLCBPUEwzU0EyX01BU1RFUl9SSUdIVCk7CiAJCXNuZF9vcGwzc2EyX3JlYWQoY2hpcCwgT1BMM1NBMl9NQVNURVJfTEVGVCk7CiAJCWlmIChjaGlwLT5tYXN0ZXJfc3dpdGNoICYmIGNoaXAtPm1hc3Rlcl92b2x1bWUpIHsKLQkJCXNuZF9jdGxfbm90aWZ5KGNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmY2hpcC0+bWFzdGVyX3N3aXRjaC0+aWQpOwotCQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZjaGlwLT5tYXN0ZXJfdm9sdW1lLT5pZCk7CisJCQlzbmRfY3RsX25vdGlmeShjYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCQkJJmNoaXAtPm1hc3Rlcl9zd2l0Y2gtPmlkKTsKKwkJCXNuZF9jdGxfbm90aWZ5KGNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJCQkmY2hpcC0+bWFzdGVyX3ZvbHVtZS0+aWQpOwogCQl9CiAJfQogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwpAQCAtMzM2LDI5ICszMzgsMTggQEAKIAogI2RlZmluZSBPUEwzU0EyX1NJTkdMRSh4bmFtZSwgeGluZGV4LCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKIHsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAotICAuaW5mbyA9IHNuZF9vcGwzc2EyX2luZm9fc2luZ2xlLCBcCisgIC5pbmZvID0gc25kX3dzc19pbmZvX3NpbmdsZSwgXAogICAuZ2V0ID0gc25kX29wbDNzYTJfZ2V0X3NpbmdsZSwgLnB1dCA9IHNuZF9vcGwzc2EyX3B1dF9zaW5nbGUsIFwKICAgLnByaXZhdGVfdmFsdWUgPSByZWcgfCAoc2hpZnQgPDwgOCkgfCAobWFzayA8PCAxNikgfCAoaW52ZXJ0IDw8IDI0KSB9CiAjZGVmaW5lIE9QTDNTQTJfU0lOR0xFX1RMVih4bmFtZSwgeGluZGV4LCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQsIHh0bHYpIFwKIHsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKICAgLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsIFwKICAgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCi0gIC5pbmZvID0gc25kX29wbDNzYTJfaW5mb19zaW5nbGUsIFwKKyAgLmluZm8gPSBzbmRfd3NzX2luZm9fc2luZ2xlLCBcCiAgIC5nZXQgPSBzbmRfb3BsM3NhMl9nZXRfc2luZ2xlLCAucHV0ID0gc25kX29wbDNzYTJfcHV0X3NpbmdsZSwgXAogICAucHJpdmF0ZV92YWx1ZSA9IHJlZyB8IChzaGlmdCA8PCA4KSB8IChtYXNrIDw8IDE2KSB8IChpbnZlcnQgPDwgMjQpLCBcCiAgIC50bHYgPSB7IC5wID0gKHh0bHYpIH0gfQogCi1zdGF0aWMgaW50IHNuZF9vcGwzc2EyX2luZm9fc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0KLQl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKLQl1aW5mby0+Y291bnQgPSAxOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzbmRfb3BsM3NhMl9nZXRfc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CkBAIC00MDIsMjkgKzM5MywxOCBAQAogCiAjZGVmaW5lIE9QTDNTQTJfRE9VQkxFKHhuYW1lLCB4aW5kZXgsIGxlZnRfcmVnLCByaWdodF9yZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXNrLCBpbnZlcnQpIFwKIHsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IHhpbmRleCwgXAotICAuaW5mbyA9IHNuZF9vcGwzc2EyX2luZm9fZG91YmxlLCBcCisgIC5pbmZvID0gc25kX3dzc19pbmZvX2RvdWJsZSwgXAogICAuZ2V0ID0gc25kX29wbDNzYTJfZ2V0X2RvdWJsZSwgLnB1dCA9IHNuZF9vcGwzc2EyX3B1dF9kb3VibGUsIFwKICAgLnByaXZhdGVfdmFsdWUgPSBsZWZ0X3JlZyB8IChyaWdodF9yZWcgPDwgOCkgfCAoc2hpZnRfbGVmdCA8PCAxNikgfCAoc2hpZnRfcmlnaHQgPDwgMTkpIHwgKG1hc2sgPDwgMjQpIHwgKGludmVydCA8PCAyMikgfQogI2RlZmluZSBPUEwzU0EyX0RPVUJMRV9UTFYoeG5hbWUsIHhpbmRleCwgbGVmdF9yZWcsIHJpZ2h0X3JlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1hc2ssIGludmVydCwgeHRsdikgXAogeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwgXAogICAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKLSAgLmluZm8gPSBzbmRfb3BsM3NhMl9pbmZvX2RvdWJsZSwgXAorICAuaW5mbyA9IHNuZF93c3NfaW5mb19kb3VibGUsIFwKICAgLmdldCA9IHNuZF9vcGwzc2EyX2dldF9kb3VibGUsIC5wdXQgPSBzbmRfb3BsM3NhMl9wdXRfZG91YmxlLCBcCiAgIC5wcml2YXRlX3ZhbHVlID0gbGVmdF9yZWcgfCAocmlnaHRfcmVnIDw8IDgpIHwgKHNoaWZ0X2xlZnQgPDwgMTYpIHwgKHNoaWZ0X3JpZ2h0IDw8IDE5KSB8IChtYXNrIDw8IDI0KSB8IChpbnZlcnQgPDwgMjIpLCBcCiAgIC50bHYgPSB7IC5wID0gKHh0bHYpIH0gfQogCi1zdGF0aWMgaW50IHNuZF9vcGwzc2EyX2luZm9fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7Ci0KLQl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKLQl1aW5mby0+Y291bnQgPSAyOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzbmRfb3BsM3NhMl9nZXRfZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CkBAIC01MTIsOSArNDkyLDkgQEAKIAljaGlwLT5tYXN0ZXJfdm9sdW1lID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX29wbDNzYTJfbWl4ZXIoc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX29wbDNzYTJfbWl4ZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CisJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQxLCBpZDI7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAl1bnNpZ25lZCBpbnQgaWR4OwpAQCAtNTczLDcgKzU1Myw3IEBACiAJc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwotCWNoaXAtPmNzNDIzMS0+c3VzcGVuZChjaGlwLT5jczQyMzEpOworCWNoaXAtPndzcy0+c3VzcGVuZChjaGlwLT53c3MpOwogCS8qIHBvd2VyIGRvd24gKi8KIAlzbmRfb3BsM3NhMl93cml0ZShjaGlwLCBPUEwzU0EyX1BNX0NUUkwsIE9QTDNTQTJfUE1fRDMpOwogCkBAIC01OTcsOCArNTc3LDggQEAKIAkJZm9yIChpID0gMHgxMjsgaSA8PSAweDE2OyBpKyspCiAJCQlzbmRfb3BsM3NhMl93cml0ZShjaGlwLCBpLCBjaGlwLT5jdGxyZWdzW2ldKTsKIAl9Ci0JLyogcmVzdG9yZSBjczQyMzEgKi8KLQljaGlwLT5jczQyMzEtPnJlc3VtZShjaGlwLT5jczQyMzEpOworCS8qIHJlc3RvcmUgd3NzICovCisJY2hpcC0+d3NzLT5yZXN1bWUoY2hpcC0+d3NzKTsKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKIAlyZXR1cm4gMDsKQEAgLTY1MCw3ICs2MzAsNiBAQAogCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKIAljaGlwLT5pcnEgPSAtMTsKLQljaGlwLT5jYXJkID0gY2FyZDsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfb3BsM3NhMl9mcmVlOwogCXJldHVybiBjYXJkOwogfQpAQCAtNjU5LDcgKzYzOCw3IEBACiB7CiAJaW50IHhpcnEsIHhkbWExLCB4ZG1hMjsKIAlzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXA7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNzNDIzMTsKKwlzdHJ1Y3Qgc25kX3dzcyAqd3NzOwogCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAlpbnQgZXJyOwogCkBAIC02NzIsMzAgKzY1MSwzNiBAQAogCXhkbWEyID0gZG1hMltkZXZdOwogCWlmICh4ZG1hMiA8IDApCiAJCWNoaXAtPnNpbmdsZV9kbWEgPSAxOwotCWlmICgoZXJyID0gc25kX29wbDNzYTJfZGV0ZWN0KGNoaXApKSA8IDApCisJZXJyID0gc25kX29wbDNzYTJfZGV0ZWN0KGNhcmQpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWlmIChyZXF1ZXN0X2lycSh4aXJxLCBzbmRfb3BsM3NhMl9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJPUEwzLVNBMiIsIGNoaXApKSB7CisJZXJyID0gcmVxdWVzdF9pcnEoeGlycSwgc25kX29wbDNzYTJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJICAiT1BMMy1TQTIiLCBjYXJkKTsKKwlpZiAoZXJyKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJjYW4ndCBncmFiIElSUSAlZFxuIiwgeGlycSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAljaGlwLT5pcnEgPSB4aXJxOwotCWlmICgoZXJyID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwKLQkJCQkgICAgIHdzc19wb3J0W2Rldl0gKyA0LCAtMSwKLQkJCQkgICAgIHhpcnEsIHhkbWExLCB4ZG1hMiwKLQkJCQkgICAgIENTNDIzMV9IV19PUEwzU0EyLAotCQkJCSAgICAgQ1M0MjMxX0hXU0hBUkVfSVJRLAotCQkJCSAgICAgJmNzNDIzMSkpIDwgMCkgeworCWVyciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsCisJCQkgICAgIHdzc19wb3J0W2Rldl0gKyA0LCAtMSwKKwkJCSAgICAgeGlycSwgeGRtYTEsIHhkbWEyLAorCQkJICAgICBXU1NfSFdfT1BMM1NBMiwgV1NTX0hXU0hBUkVfSVJRLCAmd3NzKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRkKCJPb3BzLCBXU1Mgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLCB3c3NfcG9ydFtkZXZdICsgNCk7CiAJCXJldHVybiBlcnI7CiAJfQotCWNoaXAtPmNzNDIzMSA9IGNzNDIzMTsKLQlpZiAoKGVyciA9IHNuZF9jczQyMzFfcGNtKGNzNDIzMSwgMCwgTlVMTCkpIDwgMCkKKwljaGlwLT53c3MgPSB3c3M7CisJZXJyID0gc25kX3dzc19wY20od3NzLCAwLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoKGVyciA9IHNuZF9jczQyMzFfbWl4ZXIoY3M0MjMxKSkgPCAwKQorCWVyciA9IHNuZF93c3NfbWl4ZXIod3NzKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoKGVyciA9IHNuZF9vcGwzc2EyX21peGVyKGNoaXApKSA8IDApCisJZXJyID0gc25kX29wbDNzYTJfbWl4ZXIoY2FyZCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3RpbWVyKGNzNDIzMSwgMCwgTlVMTCkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX3RpbWVyKHdzcywgMCwgTlVMTCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKGZtX3BvcnRbZGV2XSA+PSAweDM0MCAmJiBmbV9wb3J0W2Rldl0gPCAweDQwMCkgewogCQlpZiAoKGVyciA9IHNuZF9vcGwzX2NyZWF0ZShjYXJkLCBmbV9wb3J0W2Rldl0sCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKaW5kZXggMmExZTJmNS4uNDQwNzU1YyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCisrKyBiL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvY3M0MjMxLmg+CisjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAjaW5jbHVkZSA8c291bmQvb3BsNC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTY3NSw3ICs2NzUsOCBAQAogCXVuc2lnbmVkIGludCBpZHg7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQobWlybyAhPSBOVUxMICYmIG1pcm8tPmNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFtaXJvIHx8ICFtaXJvLT5jYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljYXJkID0gbWlyby0+Y2FyZDsKIApAQCAtMTIyMSw3ICsxMjIyLDcgQEAKIAogCWludCBlcnJvcjsKIAlzdHJ1Y3Qgc25kX21pcm8gKm1pcm87Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNvZGVjOworCXN0cnVjdCBzbmRfd3NzICpjb2RlYzsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcjsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKQEAgLTEzMTAsMjkgKzEzMTEsMzIgQEAKIAkJfQogCX0KIAotCWlmICgoZXJyb3IgPSBzbmRfbWlyb19jb25maWd1cmUobWlybykpKSB7CisJZXJyb3IgPSBzbmRfbWlyb19jb25maWd1cmUobWlybyk7CisJaWYgKGVycm9yKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwgbWlyby0+d3NzX2Jhc2UgKyA0LCAtMSwKLQkJCQkgICAgICAgbWlyby0+aXJxLCBtaXJvLT5kbWExLCBtaXJvLT5kbWEyLAotCQkJCSAgICAgICBDUzQyMzFfSFdfQUQxODQ1LAotCQkJCSAgICAgICAwLAotCQkJCSAgICAgICAmY29kZWMpKSA8IDApIHsKKwllcnJvciA9IHNuZF93c3NfY3JlYXRlKGNhcmQsIG1pcm8tPndzc19iYXNlICsgNCwgLTEsCisJCQkJbWlyby0+aXJxLCBtaXJvLT5kbWExLCBtaXJvLT5kbWEyLAorCQkJCVdTU19IV19BRDE4NDUsIDAsICZjb2RlYyk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKChlcnJvciA9IHNuZF9jczQyMzFfcGNtKGNvZGVjLCAwLCAmcGNtKSkgPCAwKSB7CisJZXJyb3IgPSBzbmRfd3NzX3BjbShjb2RlYywgMCwgJnBjbSk7CisJaWYgKGVycm9yIDwgMCkgIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV9taXhlcihjb2RlYykpIDwgMCkgeworCWVycm9yID0gc25kX3dzc19taXhlcihjb2RlYyk7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCWlmICgoZXJyb3IgPSBzbmRfY3M0MjMxX3RpbWVyKGNvZGVjLCAwLCAmdGltZXIpKSA8IDApIHsKKwllcnJvciA9IHNuZF93c3NfdGltZXIoY29kZWMsIDAsICZ0aW1lcik7CisJaWYgKGVycm9yIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKaW5kZXggMDc5N2NhNC4uMTk3MDZiMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCkBAIC0zMywxMSArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaWYgZGVmaW5lZChDUzQyMzEpIHx8IGRlZmluZWQoT1BUaTkzWCkKLSNpbmNsdWRlIDxzb3VuZC9jczQyMzEuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c291bmQvYWQxODQ4Lmg+Ci0jZW5kaWYJLyogQ1M0MjMxICovCisjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAjaW5jbHVkZSA8c291bmQvb3BsMy5oPgogI2lmbmRlZiBPUFRpOTNYCkBAIC0xMzksNyArMTM1LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1jX2Jhc2Vfc2l6ZTsKICNpZmRlZiBPUFRpOTNYCiAJdW5zaWduZWQgbG9uZyBtY19pbmRpcl9pbmRleDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY29kZWM7CisJc3RydWN0IHNuZF93c3MgKmNvZGVjOwogI2VuZGlmCS8qIE9QVGk5M1ggKi8KIAl1bnNpZ25lZCBsb25nIHB3ZF9yZWc7CiAKQEAgLTE0OCw5ICsxNDQsNyBAQAogCWxvbmcgd3NzX2Jhc2U7CiAJaW50IGlycTsKIAlpbnQgZG1hMTsKLSNpZiBkZWZpbmVkKENTNDIzMSkgfHwgZGVmaW5lZChPUFRpOTNYKQogCWludCBkbWEyOwotI2VuZGlmCS8qIENTNDIzMSB8fCBPUFRpOTNYICovCiAKIAlsb25nIGZtX3BvcnQ7CiAKQEAgLTIyNSw5ICsyMTksNyBAQAogCWNoaXAtPndzc19iYXNlID0gLTE7CiAJY2hpcC0+aXJxID0gLTE7CiAJY2hpcC0+ZG1hMSA9IC0xOwotI2lmIGRlZmluZWQoQ1M0MjMxKSB8fCBkZWZpbmVkIChPUFRpOTNYKQogCWNoaXAtPmRtYTIgPSAtMTsKLSNlbmRpZiAJLyogQ1M0MjMxIHx8IE9QVGk5M1ggKi8KIAljaGlwLT5mbV9wb3J0ID0gLTE7CiAJY2hpcC0+bXB1X3BvcnQgPSAtMTsKIAljaGlwLT5tcHVfaXJxID0gLTE7CkBAIC01NjIsNyArNTU0LDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IHNuZF9vcHRpOTN4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNvZGVjID0gZGV2X2lkOworCXN0cnVjdCBzbmRfd3NzICpjb2RlYyA9IGRldl9pZDsKIAlzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAgPSBjb2RlYy0+Y2FyZC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCkBAIC01NzAsNyArNTYyLDcgQEAKIAlpZiAoKHN0YXR1cyAmIE9QVGk5M1hfSVJRX1BMQVlCQUNLKSAmJiBjb2RlYy0+cGxheWJhY2tfc3Vic3RyZWFtKQogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNvZGVjLT5wbGF5YmFja19zdWJzdHJlYW0pOwogCWlmICgoc3RhdHVzICYgT1BUaTkzWF9JUlFfQ0FQVFVSRSkgJiYgY29kZWMtPmNhcHR1cmVfc3Vic3RyZWFtKSB7Ci0JCXNuZF9jczQyMzFfb3ZlcnJhbmdlKGNvZGVjKTsKKwkJc25kX3dzc19vdmVycmFuZ2UoY29kZWMpOwogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNvZGVjLT5jYXB0dXJlX3N1YnN0cmVhbSk7CiAJfQogCW91dGIoMHgwMCwgT1BUaTkzWF9QT1JUKGNvZGVjLCBTVEFUVVMpKTsKQEAgLTY5MSw3ICs2ODMsNyBAQAogICAgICAgICAKIAlpZiAoY2hpcCkgewogI2lmZGVmIE9QVGk5M1gKLQkJc3RydWN0IHNuZF9jczQyMzEgKmNvZGVjID0gY2hpcC0+Y29kZWM7CisJCXN0cnVjdCBzbmRfd3NzICpjb2RlYyA9IGNoaXAtPmNvZGVjOwogCQlpZiAoY29kZWMgJiYgY29kZWMtPmlycSA+IDApIHsKIAkJCWRpc2FibGVfaXJxKGNvZGVjLT5pcnEpOwogCQkJZnJlZV9pcnEoY29kZWMtPmlycSwgY29kZWMpOwpAQCAtNzA2LDE0ICs2OTgsMTAgQEAKIAlzdGF0aWMgbG9uZyBwb3NzaWJsZV9wb3J0c1tdID0gezB4NTMwLCAweGU4MCwgMHhmNDAsIDB4NjA0LCAtMX07CiAJaW50IGVycm9yOwogCXN0cnVjdCBzbmRfb3B0aTl4eCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLSNpZiBkZWZpbmVkKENTNDIzMSkgfHwgZGVmaW5lZChPUFRpOTNYKQotCXN0cnVjdCBzbmRfY3M0MjMxICpjb2RlYzsKKwlzdHJ1Y3Qgc25kX3dzcyAqY29kZWM7CiAjaWZkZWYgQ1M0MjMxCiAJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CiAjZW5kaWYKLSNlbHNlCi0Jc3RydWN0IHNuZF9hZDE4NDggKmNvZGVjOwotI2VuZGlmCiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwogCXN0cnVjdCBzbmRfaHdkZXAgKnN5bnRoOwpAQCAtNzMxLDM4ICs3MTksNDYgQEAKIAljaGlwLT5kbWExID0gZG1hMTsKICNpZiBkZWZpbmVkKENTNDIzMSkgfHwgZGVmaW5lZChPUFRpOTNYKQogCWNoaXAtPmRtYTIgPSBkbWEyOworI2Vsc2UKKwljaGlwLT5kbWEyID0gLTE7CiAjZW5kaWYKIAogCWlmIChjaGlwLT53c3NfYmFzZSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJaWYgKChjaGlwLT53c3NfYmFzZSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lvcG9ydChwb3NzaWJsZV9wb3J0cywgNCkpIDwgMCkgeworCQljaGlwLT53c3NfYmFzZSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lvcG9ydChwb3NzaWJsZV9wb3J0cywgNCk7CisJCWlmIChjaGlwLT53c3NfYmFzZSA8IDApIHsKIAkJCXNuZF9wcmludGsoInVuYWJsZSB0byBmaW5kIGEgZnJlZSBXU1MgcG9ydFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJfQotCWlmICgoZXJyb3IgPSBzbmRfb3B0aTl4eF9jb25maWd1cmUoY2hpcCkpKQorCWVycm9yID0gc25kX29wdGk5eHhfY29uZmlndXJlKGNoaXApOworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0jaWYgZGVmaW5lZChDUzQyMzEpIHx8IGRlZmluZWQoT1BUaTkzWCkKLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwgY2hpcC0+d3NzX2Jhc2UgKyA0LCAtMSwKLQkJCQkgICAgICAgY2hpcC0+aXJxLCBjaGlwLT5kbWExLCBjaGlwLT5kbWEyLAotI2lmZGVmIENTNDIzMQotCQkJCSAgICAgICBDUzQyMzFfSFdfREVURUNULCAwLAotI2Vsc2UgLyogT1BUaTkzeCAqLwotCQkJCSAgICAgICBDUzQyMzFfSFdfT1BUSTkzWCwgQ1M0MjMxX0hXU0hBUkVfSVJRLAorCWVycm9yID0gc25kX3dzc19jcmVhdGUoY2FyZCwgY2hpcC0+d3NzX2Jhc2UgKyA0LCAtMSwKKwkJCSAgICAgICBjaGlwLT5pcnEsIGNoaXAtPmRtYTEsIGNoaXAtPmRtYTIsCisjaWZkZWYgT1BUaTkzWAorCQkJICAgICAgIFdTU19IV19PUFRJOTNYLCBXU1NfSFdTSEFSRV9JUlEsCisjZWxzZQorCQkJICAgICAgIFdTU19IV19ERVRFQ1QsIDAsCiAjZW5kaWYKLQkJCQkgICAgICAgJmNvZGVjKSkgPCAwKQorCQkJICAgICAgICZjb2RlYyk7CisJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogI2lmZGVmIE9QVGk5M1gKIAljaGlwLT5jb2RlYyA9IGNvZGVjOwogI2VuZGlmCi0JaWYgKChlcnJvciA9IHNuZF9jczQyMzFfcGNtKGNvZGVjLCAwLCAmcGNtKSkgPCAwKQorCWVycm9yID0gc25kX3dzc19wY20oY29kZWMsIDAsICZwY20pOworCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV9taXhlcihjb2RlYykpIDwgMCkKKwllcnJvciA9IHNuZF93c3NfbWl4ZXIoY29kZWMpOworCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKICNpZmRlZiBDUzQyMzEKLQlpZiAoKGVycm9yID0gc25kX2NzNDIzMV90aW1lcihjb2RlYywgMCwgJnRpbWVyKSkgPCAwKQorCWVycm9yID0gc25kX3dzc190aW1lcihjb2RlYywgMCwgJnRpbWVyKTsKKwlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7Ci0jZWxzZSAvKiBPUFRJOTNYICovCisjZW5kaWYKKyNpZmRlZiBPUFRpOTNYCiAJZXJyb3IgPSByZXF1ZXN0X2lycShjaGlwLT5pcnEsIHNuZF9vcHRpOTN4X2ludGVycnVwdCwKIAkJCSAgICBJUlFGX0RJU0FCTEVELCBERVZfTkFNRSIgLSBXU1MiLCBjb2RlYyk7CiAJaWYgKGVycm9yIDwgMCkgewpAQCAtNzcwLDE2ICs3NjYsNiBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogI2VuZGlmCi0jZWxzZQotCWlmICgoZXJyb3IgPSBzbmRfYWQxODQ4X2NyZWF0ZShjYXJkLCBjaGlwLT53c3NfYmFzZSArIDQsCi0JCQkJICAgICAgIGNoaXAtPmlycSwgY2hpcC0+ZG1hMSwKLQkJCQkgICAgICAgQUQxODQ4X0hXX0RFVEVDVCwgJmNvZGVjKSkgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0JaWYgKChlcnJvciA9IHNuZF9hZDE4NDhfcGNtKGNvZGVjLCAwLCAmcGNtKSkgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0JaWYgKChlcnJvciA9IHNuZF9hZDE4NDhfbWl4ZXIoY29kZWMpKSA8IDApCi0JCXJldHVybiBlcnJvcjsKLSNlbmRpZgogCXN0cmNweShjYXJkLT5kcml2ZXIsIGNoaXAtPm5hbWUpOwogCXNwcmludGYoY2FyZC0+c2hvcnRuYW1lLCAiT1BUaSAlcyIsIGNhcmQtPmRyaXZlcik7CiAjaWYgZGVmaW5lZChDUzQyMzEpIHx8IGRlZmluZWQoT1BUaTkzWCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMgYi9zb3VuZC9pc2Evc2IvZW11ODAwMC5jCmluZGV4IGIzNWJlN2QuLjk2Njc4ZDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMKKysrIGIvc291bmQvaXNhL3NiL2VtdTgwMDAuYwpAQCAtMTAyMyw3ICsxMDIzLDggQEAKIHsKIAlpbnQgaSwgZXJyID0gMDsKIAotCXNuZF9hc3NlcnQoZW11ICE9IE5VTEwgJiYgY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSB8fCAhY2FyZCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2luaXQoJmVtdS0+Y29udHJvbF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3BhdGNoLmMKaW5kZXggMWJlMTZjOS4uYzk5YzYwNyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9wYXRjaC5jCkBAIC0xNTYsNyArMTU2LDggQEAKIAlzdHJ1Y3Qgc25kX2VtdTgwMDAgKmVtdTsKIAogCWVtdSA9IHJlYy0+aHc7Ci0Jc25kX2Fzc2VydChzcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXNwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc3AtPnYuc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKaW5kZXggMzVmM2Q3Yi4uNDkwMzdkMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKQEAgLTE5OCw3ICsxOTgsOCBAQAogCXN0cnVjdCBzbmRfc2JfY3NwX3N0YXJ0IHN0YXJ0X2luZm87CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzbmRfc2JfY3NwX2NoZWNrX3ZlcnNpb24ocCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTA0Niw3ICsxMDQ3LDggQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhcmQgPSBwLT5jaGlwLT5jYXJkOwogCXAtPnFwb3NfbGVmdCA9IHAtPnFwb3NfcmlnaHQgPSBTTkRSVl9TQl9DU1BfUVNPVU5EX01BWF9SSUdIVCAvIDI7CkBAIC0xMDcxLDcgKzEwNzMsOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChwICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXApKQorCQlyZXR1cm47CiAKIAljYXJkID0gcC0+Y2hpcC0+Y2FyZDsJCiAJCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2IxNl9tYWluLmMgYi9zb3VuZC9pc2Evc2Ivc2IxNl9tYWluLmMKaW5kZXggZjdlODE5Mi4uMmE2Y2MxYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTZfbWFpbi5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYwpAQCAtNjY5LDcgKzY2OSw4IEBACiBzdGF0aWMgaW50IHNuZF9zYjE2X3NldF9kbWFfbW9kZShzdHJ1Y3Qgc25kX3NiICpjaGlwLCBpbnQgd2hhdCkKIHsKIAlpZiAoY2hpcC0+ZG1hOCA8IDAgfHwgY2hpcC0+ZG1hMTYgPCAwKSB7Ci0JCXNuZF9hc3NlcnQod2hhdCA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJCWlmIChzbmRfQlVHX09OKHdoYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiAwOwogCX0KIAlpZiAod2hhdCA9PSAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2I4X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCmluZGV4IGZlMDNiYjguLjY1OGQ1NTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCkBAIC0xMTEsNyArMTExLDkgQEAKIAlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7CiAJY2FzZSBTQl9IV19QUk86CiAJCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpIHsKLQkJCXNuZF9hc3NlcnQocmF0ZSA9PSBTQjhfUkFURSgxMTAyNSkgfHwgcmF0ZSA9PSBTQjhfUkFURSgyMjA1MCksIHJldHVybiAtRUlOVkFMKTsKKwkJCWlmIChzbmRfQlVHX09OKHJhdGUgIT0gU0I4X1JBVEUoMTEwMjUpICYmCisJCQkJICAgICAgIHJhdGUgIT0gU0I4X1JBVEUoMjIwNTApKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNoaXAtPnBsYXliYWNrX2Zvcm1hdCA9IFNCX0RTUF9ISV9PVVRQVVRfQVVUTzsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMzcsNyArMjM5LDkgQEAKIAlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7CiAJY2FzZSBTQl9IV19QUk86CiAJCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpIHsKLQkJCXNuZF9hc3NlcnQocmF0ZSA9PSBTQjhfUkFURSgxMTAyNSkgfHwgcmF0ZSA9PSBTQjhfUkFURSgyMjA1MCksIHJldHVybiAtRUlOVkFMKTsKKwkJCWlmIChzbmRfQlVHX09OKHJhdGUgIT0gU0I4X1JBVEUoMTEwMjUpICYmCisJCQkJICAgICAgIHJhdGUgIT0gU0I4X1JBVEUoMjIwNTApKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNoaXAtPmNhcHR1cmVfZm9ybWF0ID0gU0JfRFNQX0hJX0lOUFVUX0FVVE87CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiX2NvbW1vbi5jIGIvc291bmQvaXNhL3NiL3NiX2NvbW1vbi5jCmluZGV4IGI0MzJkOWEuLjI3YTY1MTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYl9jb21tb24uYworKysgYi9zb3VuZC9pc2Evc2Ivc2JfY29tbW9uLmMKQEAgLTIxOSw3ICsyMTksOCBAQAogCQkuZGV2X2ZyZWUgPQlzbmRfc2Jkc3BfZGV2X2ZyZWUsCiAJfTsKIAotCXNuZF9hc3NlcnQocl9jaGlwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcl9jaGlwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJKnJfY2hpcCA9IE5VTEw7CiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNoaXAgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYl9taXhlci5jIGIvc291bmQvaXNhL3NiL3NiX21peGVyLmMKaW5kZXggNzNkNDU3Mi4uNDA2YTQzMSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiX21peGVyLmMKKysrIGIvc291bmQvaXNhL3NiL3NiX21peGVyLmMKQEAgLTc5Miw3ICs3OTIsOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChjaGlwICE9IE5VTEwgJiYgY2hpcC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhcmQgPSBjaGlwLT5jYXJkOwogCkBAIC05MjUsNyArOTI2LDggQEAKIHN0YXRpYyB2b2lkIHNhdmVfbWl4ZXIoc3RydWN0IHNuZF9zYiAqY2hpcCwgdW5zaWduZWQgY2hhciAqcmVncywgaW50IG51bV9yZWdzKQogewogCXVuc2lnbmVkIGNoYXIgKnZhbCA9IGNoaXAtPnNhdmVkX3JlZ3M7Ci0Jc25kX2Fzc2VydChudW1fcmVncyA8PSBBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3MpLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKG51bV9yZWdzID4gQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzKSkpCisJCXJldHVybjsKIAlmb3IgKDsgbnVtX3JlZ3M7IG51bV9yZWdzLS0pCiAJCSp2YWwrKyA9IHNuZF9zYm1peGVyX3JlYWQoY2hpcCwgKnJlZ3MrKyk7CiB9CkBAIC05MzMsNyArOTM1LDggQEAKIHN0YXRpYyB2b2lkIHJlc3RvcmVfbWl4ZXIoc3RydWN0IHNuZF9zYiAqY2hpcCwgdW5zaWduZWQgY2hhciAqcmVncywgaW50IG51bV9yZWdzKQogewogCXVuc2lnbmVkIGNoYXIgKnZhbCA9IGNoaXAtPnNhdmVkX3JlZ3M7Ci0Jc25kX2Fzc2VydChudW1fcmVncyA8PSBBUlJBWV9TSVpFKGNoaXAtPnNhdmVkX3JlZ3MpLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKG51bV9yZWdzID4gQVJSQVlfU0laRShjaGlwLT5zYXZlZF9yZWdzKSkpCisJCXJldHVybjsKIAlmb3IgKDsgbnVtX3JlZ3M7IG51bV9yZWdzLS0pCiAJCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsICpyZWdzKyssICp2YWwrKyk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2M2MDAwLmMgYi9zb3VuZC9pc2Evc2M2MDAwLmMKaW5kZXggZGEzZDE1Mi4uY2EzNTkyNCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NjNjAwMC5jCisrKyBiL3NvdW5kL2lzYS9zYzYwMDAuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9hZDE4NDguaD4KKyNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zYzYwMDBfbWl4ZXIoc3RydWN0IHNuZF9hZDE4NDggKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2M2MDAwX21peGVyKHN0cnVjdCBzbmRfd3NzICpjaGlwKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDEsIGlkMjsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCWludCB4aXJxID0gaXJxW2Rldl07CiAJaW50IHhkbWEgPSBkbWFbZGV2XTsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9hZDE4NDggKmNoaXA7CisJc3RydWN0IHNuZF93c3MgKmNoaXA7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWNoYXIgX19pb21lbSAqdnBvcnQ7CiAJY2hhciBfX2lvbWVtICp2bXNzX3BvcnQ7CkBAIC01NDgsMjEgKzU0OCwyMSBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl91bm1hcDI7CiAKLQllcnIgPSBzbmRfYWQxODQ4X2NyZWF0ZShjYXJkLCBtc3NfcG9ydFtkZXZdICsgNCwgeGlycSwgeGRtYSwKLQkJCQlBRDE4NDhfSFdfREVURUNULCAmY2hpcCk7CisJZXJyID0gc25kX3dzc19jcmVhdGUoY2FyZCwgbXNzX3BvcnRbZGV2XSArIDQsICAtMSwgeGlycSwgeGRtYSwgLTEsCisJCQkgICAgIFdTU19IV19ERVRFQ1QsIDAsICZjaGlwKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfdW5tYXAyOwogCWNhcmQtPnByaXZhdGVfZGF0YSA9IGNoaXA7CiAKLQllcnIgPSBzbmRfYWQxODQ4X3BjbShjaGlwLCAwLCBOVUxMKTsKKwllcnIgPSBzbmRfd3NzX3BjbShjaGlwLCAwLCBOVUxMKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJICAgImVycm9yIGNyZWF0aW5nIG5ldyBhZDE4NDggUENNIGRldmljZVxuIik7CisJCQkgICAiZXJyb3IgY3JlYXRpbmcgbmV3IFdTUyBQQ00gZGV2aWNlXG4iKTsKIAkJZ290byBlcnJfdW5tYXAyOwogCX0KLQllcnIgPSBzbmRfYWQxODQ4X21peGVyKGNoaXApOworCWVyciA9IHNuZF93c3NfbWl4ZXIoY2hpcCk7CiAJaWYgKGVyciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIGNyZWF0aW5nIG5ldyBhZDE4NDggbWl4ZXJcbiIpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyb3IgY3JlYXRpbmcgbmV3IFdTUyBtaXhlclxuIik7CiAJCWdvdG8gZXJyX3VubWFwMjsKIAl9CiAJZXJyID0gc25kX3NjNjAwMF9taXhlcihjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zZ2FsYXh5LmMgYi9zb3VuZC9pc2Evc2dhbGF4eS5jCmluZGV4IGEwNzI3NGUuLjJjNzUwM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zZ2FsYXh5LmMKKysrIGIvc291bmQvaXNhL3NnYWxheHkuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2IuaD4KLSNpbmNsdWRlIDxzb3VuZC9hZDE4NDguaD4KKyNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjZGVmaW5lIFNORFJWX0xFR0FDWV9GSU5EX0ZSRUVfSVJRCiAjZGVmaW5lIFNORFJWX0xFR0FDWV9GSU5EX0ZSRUVfRE1BCkBAIC0xNzUsMTIgKzE3NSwxNCBAQAogCXJldHVybiBzbmRfc2dhbGF4eV9zZXR1cF93c3Mod3NzcG9ydFtkZXZdLCBpcnEsIGRtYSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYWQxODQ4X21peF9lbGVtIHNuZF9zZ2FsYXh5X2NvbnRyb2xzW10gPSB7Ci1BRDE4NDhfRE9VQkxFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMCwgU0dBTEFYWV9BVVhDX0xFRlQsIFNHQUxBWFlfQVVYQ19SSUdIVCwgNywgNywgMSwgMSksCi1BRDE4NDhfRE9VQkxFKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMCwgU0dBTEFYWV9BVVhDX0xFRlQsIFNHQUxBWFlfQVVYQ19SSUdIVCwgMCwgMCwgMzEsIDApCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3NnYWxheHlfY29udHJvbHNbXSA9IHsKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlTR0FMQVhZX0FVWENfTEVGVCwgU0dBTEFYWV9BVVhDX1JJR0hULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlTR0FMQVhZX0FVWENfTEVGVCwgU0dBTEFYWV9BVVhDX1JJR0hULCAwLCAwLCAzMSwgMCkKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zZ2FsYXh5X21peGVyKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NnYWxheHlfbWl4ZXIoc3RydWN0IHNuZF93c3MgKmNoaXApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gY2hpcC0+Y2FyZDsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkMSwgaWQyOwpAQCAtMjEwLDcgKzIxMiw5IEBACiAJCXJldHVybiBlcnI7CiAJLyogYnVpbGQgQVVYMiBpbnB1dCAqLwogCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfc2dhbGF4eV9jb250cm9scyk7IGlkeCsrKSB7Ci0JCWlmICgoZXJyID0gc25kX2FkMTg0OF9hZGRfY3RsX2VsZW0oY2hpcCwgJnNuZF9zZ2FsYXh5X2NvbnRyb2xzW2lkeF0pKSA8IDApCisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCisJCQkJc25kX2N0bF9uZXcxKCZzbmRfc2dhbGF4eV9jb250cm9sc1tpZHhdLCBjaGlwKSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yMzcsNyArMjQxLDcgQEAKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2RtYXNbXSA9IHsxLCAzLCAwLCAtMX07CiAJaW50IGVyciwgeGlycSwgeGRtYTE7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwOworCXN0cnVjdCBzbmRfd3NzICpjaGlwOwogCiAJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkKQEAgLTI2MywxOCArMjY3LDIxIEBACiAJaWYgKChlcnIgPSBzbmRfc2dhbGF4eV9kZXRlY3QoZGV2LCB4aXJxLCB4ZG1hMSkpIDwgMCkKIAkJZ290byBfZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfYWQxODQ4X2NyZWF0ZShjYXJkLCB3c3Nwb3J0W2Rldl0gKyA0LAotCQkJCSAgICAgeGlycSwgeGRtYTEsCi0JCQkJICAgICBBRDE4NDhfSFdfREVURUNULCAmY2hpcCkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLCB3c3Nwb3J0W2Rldl0gKyA0LCAtMSwKKwkJCSAgICAgeGlycSwgeGRtYTEsIC0xLAorCQkJICAgICBXU1NfSFdfREVURUNULCAwLCAmY2hpcCk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0JaWYgKChlcnIgPSBzbmRfYWQxODQ4X3BjbShjaGlwLCAwLCBOVUxMKSkgPCAwKSB7Ci0JCXNuZF9wcmludGRkKFBGWCAiZXJyb3IgY3JlYXRpbmcgbmV3IGFkMTg0OCBQQ00gZGV2aWNlXG4iKTsKKwllcnIgPSBzbmRfd3NzX3BjbShjaGlwLCAwLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRkZChQRlggImVycm9yIGNyZWF0aW5nIG5ldyBXU1MgUENNIGRldmljZVxuIik7CiAJCWdvdG8gX2VycjsKIAl9Ci0JaWYgKChlcnIgPSBzbmRfYWQxODQ4X21peGVyKGNoaXApKSA8IDApIHsKLQkJc25kX3ByaW50ZGQoUEZYICJlcnJvciBjcmVhdGluZyBuZXcgYWQxODQ4IG1peGVyXG4iKTsKKwllcnIgPSBzbmRfd3NzX21peGVyKGNoaXApOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGRkKFBGWCAiZXJyb3IgY3JlYXRpbmcgbmV3IFdTUyBtaXhlclxuIik7CiAJCWdvdG8gX2VycjsKIAl9CiAJaWYgKChlcnIgPSBzbmRfc2dhbGF4eV9taXhlcihjaGlwKSkgPCAwKSB7CkBAIC0zMTIsNyArMzE5LDcgQEAKIAkJCSAgICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwogCWNoaXAtPnN1c3BlbmQoY2hpcCk7CkBAIC0zMjIsMTEgKzMyOSwxMSBAQAogc3RhdGljIGludCBzbmRfc2dhbGF4eV9yZXN1bWUoc3RydWN0IGRldmljZSAqcGRldiwgdW5zaWduZWQgaW50IG4pCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJY2hpcC0+cmVzdW1lKGNoaXApOwotCXNuZF9hZDE4NDhfb3V0KGNoaXAsIFNHQUxBWFlfQVVYQ19MRUZULCBjaGlwLT5pbWFnZVtTR0FMQVhZX0FVWENfTEVGVF0pOwotCXNuZF9hZDE4NDhfb3V0KGNoaXAsIFNHQUxBWFlfQVVYQ19SSUdIVCwgY2hpcC0+aW1hZ2VbU0dBTEFYWV9BVVhDX1JJR0hUXSk7CisJc25kX3dzc19vdXQoY2hpcCwgU0dBTEFYWV9BVVhDX0xFRlQsIGNoaXAtPmltYWdlW1NHQUxBWFlfQVVYQ19MRUZUXSk7CisJc25kX3dzc19vdXQoY2hpcCwgU0dBTEFYWV9BVVhDX1JJR0hULCBjaGlwLT5pbWFnZVtTR0FMQVhZX0FVWENfUklHSFRdKTsKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zc2NhcGUuYyBiL3NvdW5kL2lzYS9zc2NhcGUuYwppbmRleCAwNmFkNzg2Li40OGExNmQ4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc3NjYXBlLmMKKysrIGIvc291bmQvaXNhL3NzY2FwZS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgotI2luY2x1ZGUgPHNvdW5kL2NzNDIzMS5oPgorI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJZW51bSBjYXJkX3R5cGUgdHlwZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvX3JlczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKndzc19yZXM7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXA7CisJc3RydWN0IHNuZF93c3MgKmNoaXA7CiAJc3RydWN0IHNuZF9tcHU0MDEgKm1wdTsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpodzsKIApAQCAtNzI2LDcgKzcyNiw3IEBACiBzdGF0aWMgaW50IHNzY2FwZV9taWRpX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWN0bCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjdGwpOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2N0bCk7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gY2hpcC0+Y2FyZDsKIAlyZWdpc3RlciBzdHJ1Y3Qgc291bmRzY2FwZSAqcyA9IGdldF9jYXJkX3NvdW5kc2NhcGUoY2FyZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc0Niw3ICs3NDYsNyBAQAogc3RhdGljIGludCBzc2NhcGVfbWlkaV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjdGwpCiB7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY3RsKTsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjdGwpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CiAJcmVnaXN0ZXIgc3RydWN0IHNvdW5kc2NhcGUgKnMgPSBnZXRfY2FyZF9zb3VuZHNjYXBlKGNhcmQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05NTgsNyArOTU4LDkgQEAKICAqIE92ZXJyaWRlIGZvciB0aGUgQ1M0MjMxIHBsYXliYWNrIGZvcm1hdCBmdW5jdGlvbi4KICAqIFRoZSBBRDE4NDUgaGFzIG11Y2ggc2ltcGxlciBmb3JtYXQgYW5kIHJhdGUgc2VsZWN0aW9uLgogICovCi1zdGF0aWMgdm9pZCBhZDE4NDVfcGxheWJhY2tfZm9ybWF0KHN0cnVjdCBzbmRfY3M0MjMxICogY2hpcCwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHVuc2lnbmVkIGNoYXIgZm9ybWF0KQorc3RhdGljIHZvaWQgYWQxODQ1X3BsYXliYWNrX2Zvcm1hdChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwKKwkJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgICB1bnNpZ25lZCBjaGFyIGZvcm1hdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwpAQCAtOTgzLDkgKzk4NSw5IEBACiAJICogTk9URTogV2Ugc2VlbSB0byBuZWVkIHRvIHdyaXRlIHRvIHRoZSBNU0IgYmVmb3JlIHRoZSBMU0IKIAkgKiAgICAgICB0byBnZXQgdGhlIGNvcnJlY3Qgc2FtcGxlIGZyZXF1ZW5jeS4KIAkgKi8KLQlzbmRfY3M0MjMxX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgKGZvcm1hdCAmIDB4ZjApKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBBRDE4NDVfRlJFUV9TRUxfTVNCLCAodW5zaWduZWQgY2hhcikgKHJhdGUgPj4gOCkpOwotCXNuZF9jczQyMzFfb3V0KGNoaXAsIEFEMTg0NV9GUkVRX1NFTF9MU0IsICh1bnNpZ25lZCBjaGFyKSByYXRlKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgKGZvcm1hdCAmIDB4ZjApKTsKKwlzbmRfd3NzX291dChjaGlwLCBBRDE4NDVfRlJFUV9TRUxfTVNCLCAodW5zaWduZWQgY2hhcikgKHJhdGUgPj4gOCkpOworCXNuZF93c3Nfb3V0KGNoaXAsIEFEMTg0NV9GUkVRX1NFTF9MU0IsICh1bnNpZ25lZCBjaGFyKSByYXRlKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiB9CkBAIC05OTQsNyArOTk2LDkgQEAKICAqIE92ZXJyaWRlIGZvciB0aGUgQ1M0MjMxIGNhcHR1cmUgZm9ybWF0IGZ1bmN0aW9uLiAKICAqIFRoZSBBRDE4NDUgaGFzIG11Y2ggc2ltcGxlciBmb3JtYXQgYW5kIHJhdGUgc2VsZWN0aW9uLgogICovCi1zdGF0aWMgdm9pZCBhZDE4NDVfY2FwdHVyZV9mb3JtYXQoc3RydWN0IHNuZF9jczQyMzEgKiBjaGlwLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgdW5zaWduZWQgY2hhciBmb3JtYXQpCitzdGF0aWMgdm9pZCBhZDE4NDVfY2FwdHVyZV9mb3JtYXQoc3RydWN0IHNuZF93c3MgKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgZm9ybWF0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CkBAIC0xMDE5LDkgKzEwMjMsOSBAQAogCSAqIE5PVEU6IFdlIHNlZW0gdG8gbmVlZCB0byB3cml0ZSB0byB0aGUgTVNCIGJlZm9yZSB0aGUgTFNCCiAJICogICAgICAgdG8gZ2V0IHRoZSBjb3JyZWN0IHNhbXBsZSBmcmVxdWVuY3kuCiAJICovCi0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX1JFQ19GT1JNQVQsIChmb3JtYXQgJiAweGYwKSk7Ci0Jc25kX2NzNDIzMV9vdXQoY2hpcCwgQUQxODQ1X0ZSRVFfU0VMX01TQiwgKHVuc2lnbmVkIGNoYXIpIChyYXRlID4+IDgpKTsKLQlzbmRfY3M0MjMxX291dChjaGlwLCBBRDE4NDVfRlJFUV9TRUxfTFNCLCAodW5zaWduZWQgY2hhcikgcmF0ZSk7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1JFQ19GT1JNQVQsIChmb3JtYXQgJiAweGYwKSk7CisJc25kX3dzc19vdXQoY2hpcCwgQUQxODQ1X0ZSRVFfU0VMX01TQiwgKHVuc2lnbmVkIGNoYXIpIChyYXRlID4+IDgpKTsKKwlzbmRfd3NzX291dChjaGlwLCBBRDE4NDVfRlJFUV9TRUxfTFNCLCAodW5zaWduZWQgY2hhcikgcmF0ZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogfQpAQCAtMTAzNiw3ICsxMDQwLDcgQEAKIAkJCQkgICBpbnQgaXJxLCBpbnQgZG1hMSwgaW50IGRtYTIpCiB7CiAJcmVnaXN0ZXIgc3RydWN0IHNvdW5kc2NhcGUgKnNzY2FwZSA9IGdldF9jYXJkX3NvdW5kc2NhcGUoY2FyZCk7Ci0Jc3RydWN0IHNuZF9jczQyMzEgKmNoaXA7CisJc3RydWN0IHNuZF93c3MgKmNoaXA7CiAJaW50IGVycjsKIAogCWlmIChzc2NhcGUtPnR5cGUgPT0gU1NDQVBFX1ZJVk8pCkBAIC0xMDQ1LDkgKzEwNDksOCBAQAogCWlmIChkbWExID09IGRtYTIpCiAJCWRtYTIgPSAtMTsKIAotCWVyciA9IHNuZF9jczQyMzFfY3JlYXRlKGNhcmQsCi0JCQkJcG9ydCwgLTEsIGlycSwgZG1hMSwgZG1hMiwKLQkJCQlDUzQyMzFfSFdfREVURUNULCBDUzQyMzFfSFdTSEFSRV9ETUExLCAmY2hpcCk7CisJZXJyID0gc25kX3dzc19jcmVhdGUoY2FyZCwgcG9ydCwgLTEsIGlycSwgZG1hMSwgZG1hMiwKKwkJCSAgICAgV1NTX0hXX0RFVEVDVCwgV1NTX0hXU0hBUkVfRE1BMSwgJmNoaXApOwogCWlmICghZXJyKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXN0cnVjdCBzbmRfcGNtICpwY207CkBAIC0xMDYzLDExICsxMDY2LDExIEBACiAgKgogI2RlZmluZSBBRDE4NDVfSUZBQ0VfQ09ORklHICBcCiAgICAgICAgICAgIChDUzQyMzFfQVVUT0NBTElCIHwgQ1M0MjMxX1JFQ09SRF9FTkFCTEUgfCBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFKQotICAgIHNuZF9jczQyMzFfbWNlX3VwKGNoaXApOworICAgIHNuZF93c3NfbWNlX3VwKGNoaXApOwogICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotICAgIHNuZF9jczQyMzFfb3V0KGNoaXAsIENTNDIzMV9JRkFDRV9DVFJMLCBBRDE4NDVfSUZBQ0VfQ09ORklHKTsKKyAgICBzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfSUZBQ0VfQ1RSTCwgQUQxODQ1X0lGQUNFX0NPTkZJRyk7CiAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKLSAgICBzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOworICAgIHNuZF93c3NfbWNlX2Rvd24oY2hpcCk7CiAgKi8KIAogCQlpZiAoc3NjYXBlLT50eXBlICE9IFNTQ0FQRV9WSVZPKSB7CkBAIC0xMDc3LDExICsxMDgwLDExIEBACiAJCQkgKiBiZSAxNC4zMTgxOCBNSHosIGJlY2F1c2Ugd2UgbXVzdCBzZXQgdGhpcyByZWdpc3RlcgogCQkJICogdG8gZ2V0IHRoZSBwbGF5YmFjayB0byBzb3VuZCBjb3JyZWN0IC4uLgogCQkJICovCi0JCQlzbmRfY3M0MjMxX21jZV91cChjaGlwKTsKKwkJCXNuZF93c3NfbWNlX3VwKGNoaXApOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCQlzbmRfY3M0MjMxX291dChjaGlwLCBBRDE4NDVfQ1JZU19DTE9DS19TRUwsIDB4MjApOworCQkJc25kX3dzc19vdXQoY2hpcCwgQUQxODQ1X0NSWVNfQ0xPQ0tfU0VMLCAweDIwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCQlzbmRfY3M0MjMxX21jZV9kb3duKGNoaXApOworCQkJc25kX3dzc19tY2VfZG93bihjaGlwKTsKIAogCQkJLyoKIAkJCSAqIE1vcmUgY3VzdG9tIGNvbmZpZ3VyYXRpb246CkBAIC0xMDg5LDI4ICsxMDkyLDI4IEBACiAJCQkgKiBiKSBlbmFibGUgZnJlcXVlbmN5IHNlbGVjdGlvbiAoZm9yIGNhcHR1cmUvcGxheWJhY2spCiAJCQkgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwotCQkJc25kX2NzNDIzMV9vdXQoY2hpcCwgQ1M0MjMxX01JU0NfSU5GTywKLQkJCQkJQ1M0MjMxX01PREUyIHwgMHgxMCk7Ci0JCQl2YWwgPSBzbmRfY3M0MjMxX2luKGNoaXAsIEFEMTg0NV9QV1JfRE9XTl9DVFJMKTsKLQkJCXNuZF9jczQyMzFfb3V0KGNoaXAsIEFEMTg0NV9QV1JfRE9XTl9DVFJMLAotCQkJCQl2YWwgfCBBRDE4NDVfRlJFUV9TRUxfRU5BQkxFKTsKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9NSVNDX0lORk8sCisJCQkJICAgIENTNDIzMV9NT0RFMiB8IDB4MTApOworCQkJdmFsID0gc25kX3dzc19pbihjaGlwLCBBRDE4NDVfUFdSX0RPV05fQ1RSTCk7CisJCQlzbmRfd3NzX291dChjaGlwLCBBRDE4NDVfUFdSX0RPV05fQ1RSTCwKKwkJCQkgICAgdmFsIHwgQUQxODQ1X0ZSRVFfU0VMX0VOQUJMRSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCQl9CiAKLQkJZXJyID0gc25kX2NzNDIzMV9wY20oY2hpcCwgMCwgJnBjbSk7CisJCWVyciA9IHNuZF93c3NfcGNtKGNoaXAsIDAsICZwY20pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3NjYXBlOiBObyBQQ00gZGV2aWNlICIKIAkJCQkJICAgICJmb3IgQUQxODQ1IGNoaXBcbiIpOwogCQkJZ290byBfZXJyb3I7CiAJCX0KIAotCQllcnIgPSBzbmRfY3M0MjMxX21peGVyKGNoaXApOworCQllcnIgPSBzbmRfd3NzX21peGVyKGNoaXApOwogCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3NjYXBlOiBObyBtaXhlciBkZXZpY2UgIgogCQkJCQkgICAgImZvciBBRDE4NDUgY2hpcFxuIik7CiAJCQlnb3RvIF9lcnJvcjsKIAkJfQotCQllcnIgPSBzbmRfY3M0MjMxX3RpbWVyKGNoaXAsIDAsIE5VTEwpOworCQllcnIgPSBzbmRfd3NzX3RpbWVyKGNoaXAsIDAsIE5VTEwpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3NjYXBlOiBObyB0aW1lciBkZXZpY2UgIgogCQkJCQkgICAgImZvciBBRDE4NDUgY2hpcFxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCAzYTZjNmZlLi40YzA5NWJjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogIEFMU0EgY2FyZC1sZXZlbCBkcml2ZXIgZm9yIFR1cnRsZSBCZWFjaCBXYXZlZnJvbnQgY2FyZHMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWF1aSxUcm9wZXosVHJvcGV6KykKKyAqCQkJCQkJKE1hdWksVHJvcGV6LFRyb3BleispCiAgKgogICogIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IGJ5IFBhdWwgQmFydG9uLURhdmlzIDxwYmRAb3AubmV0PgogICoKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KKyNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9zbmRfd2F2ZWZyb250Lmg+CiAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgQmFydG9uLURhdmlzIDxwYmRAb3AubmV0PiIpOwpAQCAtMzE5LDggKzMyMCw4IEBACiAJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fSU5QVVQsICZzbmRfd2F2ZWZyb250X21pZGlfaW5wdXQpOwogCiAJcm1pZGktPmluZm9fZmxhZ3MgfD0gU05EUlZfUkFXTUlESV9JTkZPX09VVFBVVCB8Ci0JICAgICAgICAgICAgICAgICAgICAgU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUIHwKLQkgICAgICAgICAgICAgICAgICAgICBTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOworCQkJICAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAorCQkJICAgICBTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOwogCiAJcmV0dXJuIHJtaWRpOwogfQpAQCAtMzYzLDcgKzM2NCw3IEBACiBzbmRfd2F2ZWZyb250X3Byb2JlIChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpCiB7CiAJc25kX3dhdmVmcm9udF9jYXJkX3QgKmFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOworCXN0cnVjdCBzbmRfd3NzICpjaGlwOwogCXN0cnVjdCBzbmRfaHdkZXAgKndhdmVmcm9udF9zeW50aDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKmljczIxMTVfaW50ZXJuYWxfcm1pZGkgPSBOVUxMOwogCXN0cnVjdCBzbmRfcmF3bWlkaSAqaWNzMjExNV9leHRlcm5hbF9ybWlkaSA9IE5VTEw7CkBAIC0zNzIsMjEgKzM3MywyMCBAQAogCiAJLyogLS0tLS0tLS0tIFBDTSAtLS0tLS0tLS0tLS0tLS0gKi8KIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV9jcmVhdGUgKGNhcmQsCi0JCQkJICAgICAgY3M0MjMyX3BjbV9wb3J0W2Rldl0sCi0JCQkJICAgICAgLTEsCi0JCQkJICAgICAgY3M0MjMyX3BjbV9pcnFbZGV2XSwKLQkJCQkgICAgICBkbWExW2Rldl0sCi0JCQkJICAgICAgZG1hMltkZXZdLAotCQkJCSAgICAgIENTNDIzMV9IV19ERVRFQ1QsIDAsICZjaGlwKSkgPCAwKSB7Ci0JCXNuZF9wcmludGsgKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBDUzQyMzEgZGV2aWNlXG4iKTsKKwllcnIgPSBzbmRfd3NzX2NyZWF0ZShjYXJkLCBjczQyMzJfcGNtX3BvcnRbZGV2XSwgLTEsCisJCQkgICAgIGNzNDIzMl9wY21faXJxW2Rldl0sIGRtYTFbZGV2XSwgZG1hMltkZXZdLAorCQkJICAgICBXU1NfSFdfREVURUNULCAwLCAmY2hpcCk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgV1NTIGRldmljZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3BjbSAoY2hpcCwgMCwgTlVMTCkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX3BjbShjaGlwLCAwLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoZXJyID0gc25kX2NzNDIzMV90aW1lciAoY2hpcCwgMCwgTlVMTCkpIDwgMCkKKwllcnIgPSBzbmRfd3NzX3RpbWVyKGNoaXAsIDAsIE5VTEwpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJLyogLS0tLS0tLS0tLSBPUEwzIHN5bnRoIC0tLS0tLS0tLSAqLwpAQCAtMzk0LDI0ICszOTQsMjQgQEAKIAlpZiAoZm1fcG9ydFtkZXZdID4gMCAmJiBmbV9wb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCXN0cnVjdCBzbmRfb3BsMyAqb3BsMzsKIAotCSAgICAgICAgaWYgKChlcnIgPSBzbmRfb3BsM19jcmVhdGUoY2FyZCwKLQkJCQkJICAgZm1fcG9ydFtkZXZdLAotCQkJCQkgICBmbV9wb3J0W2Rldl0gKyAyLAotCQkJCQkgICBPUEwzX0hXX09QTDNfQ1MsCi0JCQkJCSAgIDAsICZvcGwzKSkgPCAwKSB7CisJCWVyciA9IHNuZF9vcGwzX2NyZWF0ZShjYXJkLCBmbV9wb3J0W2Rldl0sIGZtX3BvcnRbZGV2XSArIDIsCisJCQkJICAgICAgT1BMM19IV19PUEwzX0NTLCAwLCAmb3BsMyk7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgb3IgZGV0ZWN0IE9QTDMgc3ludGhcbiIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCi0JCWlmICgoZXJyID0gc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIGh3X2RldiwgMSwgTlVMTCkpIDwgMCkKKwkJZXJyID0gc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIGh3X2RldiwgMSwgTlVMTCk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaHdfZGV2Kys7CiAJfQogCiAJLyogLS0tLS0tLSBJQ1MyMTE1IFdhdmV0YWJsZSBzeW50aCAtLS0tLS0tICovCiAKLQlpZiAoKGFjYXJkLT53YXZlZnJvbnQucmVzX2Jhc2UgPSByZXF1ZXN0X3JlZ2lvbihpY3MyMTE1X3BvcnRbZGV2XSwgMTYsCi0JCQkJCQkJIklDUzIxMTUiKSkgPT0gTlVMTCkgeworCWFjYXJkLT53YXZlZnJvbnQucmVzX2Jhc2UgPSByZXF1ZXN0X3JlZ2lvbihpY3MyMTE1X3BvcnRbZGV2XSwgMTYsCisJCQkJCQkgICAiSUNTMjExNSIpOworCWlmIChhY2FyZC0+d2F2ZWZyb250LnJlc19iYXNlID09IE5VTEwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSUNTMjExNSBpL28gcmVnaW9uIDB4JWx4LTB4JWx4XG4iLAogCQkJICAgaWNzMjExNV9wb3J0W2Rldl0sIGljczIxMTVfcG9ydFtkZXZdICsgMTYgLSAxKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTQyNSw3ICs0MjUsOCBAQAogCWFjYXJkLT53YXZlZnJvbnQuaXJxID0gaWNzMjExNV9pcnFbZGV2XTsKIAlhY2FyZC0+d2F2ZWZyb250LmJhc2UgPSBpY3MyMTE1X3BvcnRbZGV2XTsKIAotCWlmICgod2F2ZWZyb250X3N5bnRoID0gc25kX3dhdmVmcm9udF9uZXdfc3ludGggKGNhcmQsIGh3X2RldiwgYWNhcmQpKSA9PSBOVUxMKSB7CisJd2F2ZWZyb250X3N5bnRoID0gc25kX3dhdmVmcm9udF9uZXdfc3ludGgoY2FyZCwgaHdfZGV2LCBhY2FyZCk7CisJaWYgKHdhdmVmcm9udF9zeW50aCA9PSBOVUxMKSB7CiAJCXNuZF9wcmludGsgKEtFUk5fRVJSICJjYW4ndCBjcmVhdGUgV2F2ZUZyb250IHN5bnRoIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTQzNiw3ICs0MzcsOCBAQAogCiAJLyogLS0tLS0tLS0tIE1peGVyIC0tLS0tLS0tLS0tLSAqLwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX21peGVyKGNoaXApKSA8IDApIHsKKwllcnIgPSBzbmRfd3NzX21peGVyKGNoaXApOworCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsgKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBtaXhlciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTQ0NCwxMSArNDQ2LDExIEBACiAJLyogLS0tLS0tLS0gQ1M0MjMyIE1QVS00MDEgaW50ZXJmYWNlIC0tLS0tLS0tICovCiAKIAlpZiAoY3M0MjMyX21wdV9wb3J0W2Rldl0gPiAwICYmIGNzNDIzMl9tcHVfcG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewotCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgbWlkaV9kZXYsIE1QVTQwMV9IV19DUzQyMzIsCi0JCQkJCSAgICAgICBjczQyMzJfbXB1X3BvcnRbZGV2XSwgMCwKLQkJCQkJICAgICAgIGNzNDIzMl9tcHVfaXJxW2Rldl0sCi0JCQkJCSAgICAgICBJUlFGX0RJU0FCTEVELAotCQkJCQkgICAgICAgTlVMTCkpIDwgMCkgeworCQllcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIG1pZGlfZGV2LCBNUFU0MDFfSFdfQ1M0MjMyLAorCQkJCQkgIGNzNDIzMl9tcHVfcG9ydFtkZXZdLCAwLAorCQkJCQkgIGNzNDIzMl9tcHVfaXJxW2Rldl0sIElSUUZfRElTQUJMRUQsCisJCQkJCSAgTlVMTCk7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlzbmRfcHJpbnRrIChLRVJOX0VSUiAiY2FuJ3QgYWxsb2NhdGUgQ1M0MjMyIE1QVS00MDEgZGV2aWNlXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTYwMSw3ICs2MDMsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BOUAogc3RhdGljIGludCBfX2RldmluaXQgc25kX3dhdmVmcm9udF9wbnBfZGV0ZWN0KHN0cnVjdCBwbnBfY2FyZF9saW5rICpwY2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpwaWQpCisJCQkJCWNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKnBpZCkKIHsKIAlzdGF0aWMgaW50IGRldjsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYwppbmRleCAyZWZhYTdmLi5kZmM0NDlhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKQEAgLTE4MCwxMSArMTgwLDExIEBACiAJdW5zaWduZWQgc2hvcnQgKnBkOwogCWludCBlcnIgPSAwOwogCi0Jc25kX2Fzc2VydChzZGV2LT5jYXJkICE9IE5VTEwsIHJldHVybiAtRU5PREVWKTsKLQkKIAljYXJkID0gc2Rldi0+Y2FyZDsKLQotCXNuZF9hc3NlcnQoY2FyZC0+cHJpdmF0ZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRU5PREVWKTsKKwlpZiAoc25kX0JVR19PTighY2FyZCkpCisJCXJldHVybiAtRU5PREVWOworCWlmIChzbmRfQlVHX09OKCFjYXJkLT5wcml2YXRlX2RhdGEpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWRldiA9ICZhY2FyZC0+d2F2ZWZyb250OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfbWlkaS5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfbWlkaS5jCmluZGV4IGEzMzM4NGEuLmYxNGE3YzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X21pZGkuYworKysgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9taWRpLmMKQEAgLTIzNSw4ICsyMzUsMTAgQEAKIAlzbmRfd2F2ZWZyb250X21pZGlfdCAqbWlkaTsKIAlzbmRfd2F2ZWZyb250X21wdV9pZCBtcHU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMICYmIHN1YnN0cmVhbS0+cm1pZGkgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJtaWRpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCW1wdSA9ICooKHNuZF93YXZlZnJvbnRfbXB1X2lkICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI1Nyw4ICsyNTksMTAgQEAKIAlzbmRfd2F2ZWZyb250X21pZGlfdCAqbWlkaTsKIAlzbmRfd2F2ZWZyb250X21wdV9pZCBtcHU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMICYmIHN1YnN0cmVhbS0+cm1pZGkgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJtaWRpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCW1wdSA9ICooKHNuZF93YXZlZnJvbnRfbXB1X2lkICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI3OSw4ICsyODMsMTAgQEAKIAlzbmRfd2F2ZWZyb250X21pZGlfdCAqbWlkaTsKIAlzbmRfd2F2ZWZyb250X21wdV9pZCBtcHU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMICYmIHN1YnN0cmVhbS0+cm1pZGkgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJtaWRpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCW1wdSA9ICooKHNuZF93YXZlZnJvbnRfbXB1X2lkICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YSk7CiAKQEAgLTMwMCw4ICszMDYsMTAgQEAKIAlzbmRfd2F2ZWZyb250X21pZGlfdCAqbWlkaTsKIAlzbmRfd2F2ZWZyb250X21wdV9pZCBtcHU7CiAKLQlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMICYmIHN1YnN0cmVhbS0+cm1pZGkgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJtaWRpKSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoc25kX0JVR19PTighc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCW1wdSA9ICooKHNuZF93YXZlZnJvbnRfbXB1X2lkICopIHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jCmluZGV4IDBiYjliOTIuLjRjNDEwODIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfc3ludGguYwpAQCAtMTY0OCw5ICsxNjQ4LDEwIEBACiAKIAljYXJkID0gKHN0cnVjdCBzbmRfY2FyZCAqKSBody0+Y2FyZDsKIAotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVik7Ci0KLQlzbmRfYXNzZXJ0KGNhcmQtPnByaXZhdGVfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVik7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoc25kX0JVR19PTighY2FyZC0+cHJpdmF0ZV9kYXRhKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlhY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlkZXYgPSAmYWNhcmQtPndhdmVmcm9udDsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93c3MvTWFrZWZpbGUgYi9zb3VuZC9pc2Evd3NzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGZlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9pc2Evd3NzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFMU0EKKyMgQ29weXJpZ2h0IChjKSAyMDA4IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisjCisKK3NuZC13c3MtbGliLW9ianMgOj0gd3NzX2xpYi5vCisKKyMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKK29iai0kKENPTkZJR19TTkRfV1NTX0xJQikgKz0gc25kLXdzcy1saWIubworCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd3NzL3dzc19saWIuYyBiL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmM1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9pc2Evd3NzL3dzc19saWIuYwpAQCAtMCwwICsxLDIzMjIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIENTNDIzMShBKS9DUzQyMzIvSW50ZXJXYXZlICYgY29tcGF0aWJsZSBjaGlwcworICoKKyAqICBCdWdzOgorICogICAgIC0gc29tZXRpbWVzIHJlY29yZCBicm9rZXMgcGxheWJhY2sgd2l0aCBXU1MgcG9ydGlvbiBvZgorICogICAgICAgWWFtYWhhIE9QTDMtU0EzIGNoaXAKKyAqICAgICAtIENTNDIzMSAoR1VTIE1BWCkgLSBzdGlsbCB0cm91YmxlIHdpdGggb2NjYXNpb25hbCBub2lzZXMKKyAqCQkJICAtIGJyb2tlbiBpbml0aWFsaXphdGlvbj8KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvd3NzLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgQ1M0MjMxKEEpL0NTNDIzMi9JbnRlcldhdmUgJiBjb21wYXRpYmxlIGNoaXBzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZiAwCisjZGVmaW5lIFNORFJWX0RFQlVHX01DRQorI2VuZGlmCisKKy8qCisgKiAgU29tZSB2YXJpYWJsZXMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBmcmVxX2JpdHNbMTRdID0geworCS8qIDU1MTAgKi8JMHgwMCB8IENTNDIzMV9YVEFMMiwKKwkvKiA2NjIwICovCTB4MEUgfCBDUzQyMzFfWFRBTDIsCisJLyogODAwMCAqLwkweDAwIHwgQ1M0MjMxX1hUQUwxLAorCS8qIDk2MDAgKi8JMHgwRSB8IENTNDIzMV9YVEFMMSwKKwkvKiAxMTAyNSAqLwkweDAyIHwgQ1M0MjMxX1hUQUwyLAorCS8qIDE2MDAwICovCTB4MDIgfCBDUzQyMzFfWFRBTDEsCisJLyogMTg5MDAgKi8JMHgwNCB8IENTNDIzMV9YVEFMMiwKKwkvKiAyMjA1MCAqLwkweDA2IHwgQ1M0MjMxX1hUQUwyLAorCS8qIDI3MDQyICovCTB4MDQgfCBDUzQyMzFfWFRBTDEsCisJLyogMzIwMDAgKi8JMHgwNiB8IENTNDIzMV9YVEFMMSwKKwkvKiAzMzA3NSAqLwkweDBDIHwgQ1M0MjMxX1hUQUwyLAorCS8qIDM3ODAwICovCTB4MDggfCBDUzQyMzFfWFRBTDIsCisJLyogNDQxMDAgKi8JMHgwQSB8IENTNDIzMV9YVEFMMiwKKwkvKiA0ODAwMCAqLwkweDBDIHwgQ1M0MjMxX1hUQUwxCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzWzE0XSA9IHsKKwk1NTEwLCA2NjIwLCA4MDAwLCA5NjAwLCAxMTAyNSwgMTYwMDAsIDE4OTAwLCAyMjA1MCwKKwkyNzA0MiwgMzIwMDAsIDMzMDc1LCAzNzgwMCwgNDQxMDAsIDQ4MDAwCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGh3X2NvbnN0cmFpbnRzX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXMpLAorCS5saXN0ID0gcmF0ZXMsCisJLm1hc2sgPSAwLAorfTsKKworc3RhdGljIGludCBzbmRfd3NzX3hyYXRlKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgICZod19jb25zdHJhaW50c19yYXRlcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF93c3Nfb3JpZ2luYWxfaW1hZ2VbMzJdID0KK3sKKwkweDAwLAkJCS8qIDAwLzAwIC0gbGljICovCisJMHgwMCwJCQkvKiAwMS8wMSAtIHJpYyAqLworCTB4OWYsCQkJLyogMDIvMDIgLSBsYTFpYyAqLworCTB4OWYsCQkJLyogMDMvMDMgLSByYTFpYyAqLworCTB4OWYsCQkJLyogMDQvMDQgLSBsYTJpYyAqLworCTB4OWYsCQkJLyogMDUvMDUgLSByYTJpYyAqLworCTB4YmYsCQkJLyogMDYvMDYgLSBsb2MgKi8KKwkweGJmLAkJCS8qIDA3LzA3IC0gcm9jICovCisJMHgyMCwJCQkvKiAwOC8wOCAtIHBkZnIgKi8KKwlDUzQyMzFfQVVUT0NBTElCLAkvKiAwOS8wOSAtIGljICovCisJMHgwMCwJCQkvKiAwYS8xMCAtIHBjICovCisJMHgwMCwJCQkvKiAwYi8xMSAtIHRpICovCisJQ1M0MjMxX01PREUyLAkJLyogMGMvMTIgLSBtaSAqLworCTB4ZmMsCQkJLyogMGQvMTMgLSBsYmMgKi8KKwkweDAwLAkJCS8qIDBlLzE0IC0gcGJydSAqLworCTB4MDAsCQkJLyogMGYvMTUgLSBwYnJsICovCisJMHg4MCwJCQkvKiAxMC8xNiAtIGFmZWkgKi8KKwkweDAxLAkJCS8qIDExLzE3IC0gYWZlaWkgKi8KKwkweDlmLAkJCS8qIDEyLzE4IC0gbGxpYyAqLworCTB4OWYsCQkJLyogMTMvMTkgLSBybGljICovCisJMHgwMCwJCQkvKiAxNC8yMCAtIHRsYiAqLworCTB4MDAsCQkJLyogMTUvMjEgLSB0aGIgKi8KKwkweDAwLAkJCS8qIDE2LzIyIC0gbGEzbWljL3Jlc2VydmVkICovCisJMHgwMCwJCQkvKiAxNy8yMyAtIHJhM21pYy9yZXNlcnZlZCAqLworCTB4MDAsCQkJLyogMTgvMjQgLSBhZnMgKi8KKwkweDAwLAkJCS8qIDE5LzI1IC0gbGFtb2MvdmVyc2lvbiAqLworCTB4Y2YsCQkJLyogMWEvMjYgLSBtaW9jICovCisJMHgwMCwJCQkvKiAxYi8yNyAtIHJhbW9jL3Jlc2VydmVkICovCisJMHgyMCwJCQkvKiAxYy8yOCAtIGNkZnIgKi8KKwkweDAwLAkJCS8qIDFkLzI5IC0gcmVzNCAqLworCTB4MDAsCQkJLyogMWUvMzAgLSBjYnJ1ICovCisJMHgwMCwJCQkvKiAxZi8zMSAtIGNicmwgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlWzMyXSA9Cit7CisJMHgwMCwJCS8qIDAwLzAwIC0gbF9taXhvdXRfb3V0Y3RybCAqLworCTB4MDAsCQkvKiAwMS8wMSAtIHJfbWl4b3V0X291dGN0cmwgKi8KKwkweDg4LAkJLyogMDIvMDIgLSBsX2NkX2luY3RybCAqLworCTB4ODgsCQkvKiAwMy8wMyAtIHJfY2RfaW5jdHJsICovCisJMHg4OCwJCS8qIDA0LzA0IC0gbF9hMS9mbV9pbmN0cmwgKi8KKwkweDg4LAkJLyogMDUvMDUgLSByX2ExL2ZtX2luY3RybCAqLworCTB4ODAsCQkvKiAwNi8wNiAtIGxfZGFjX2luY3RybCAqLworCTB4ODAsCQkvKiAwNy8wNyAtIHJfZGFjX2luY3RybCAqLworCTB4MDAsCQkvKiAwOC8wOCAtIHBseV9kYXRhZm9ybV9yZWcgKi8KKwkweDAwLAkJLyogMDkvMDkgLSBpZl9jb25mICovCisJMHgwMCwJCS8qIDBhLzEwIC0gcGluX2N0cmwgKi8KKwkweDAwLAkJLyogMGIvMTEgLSBlcnJfaW5pdF9yZWcgKi8KKwkweDBhLAkJLyogMGMvMTIgLSBpZF9yZWcgKi8KKwkweDAwLAkJLyogMGQvMTMgLSByZXNlcnZlZCAqLworCTB4MDAsCQkvKiAwZS8xNCAtIHBseV91cGNvdW50X3JlZyAqLworCTB4MDAsCQkvKiAwZi8xNSAtIHBseV9sb3djb3VudF9yZWcgKi8KKwkweDg4LAkJLyogMTAvMTYgLSByZXNlcnZlZC9sX2ExX2luY3RybCAqLworCTB4ODgsCQkvKiAxMS8xNyAtIHJlc2VydmVkL3JfYTFfaW5jdHJsICovCisJMHg4OCwJCS8qIDEyLzE4IC0gbF9saW5lX2luY3RybCAqLworCTB4ODgsCQkvKiAxMy8xOSAtIHJfbGluZV9pbmN0cmwgKi8KKwkweDg4LAkJLyogMTQvMjAgLSBsX21pY19pbmN0cmwgKi8KKwkweDg4LAkJLyogMTUvMjEgLSByX21pY19pbmN0cmwgKi8KKwkweDgwLAkJLyogMTYvMjIgLSBsX291dF9vdXRjdHJsICovCisJMHg4MCwJCS8qIDE3LzIzIC0gcl9vdXRfb3V0Y3RybCAqLworCTB4MDAsCQkvKiAxOC8yNCAtIHJlc2VydmVkICovCisJMHgwMCwJCS8qIDE5LzI1IC0gcmVzZXJ2ZWQgKi8KKwkweDAwLAkJLyogMWEvMjYgLSByZXNlcnZlZCAqLworCTB4MDAsCQkvKiAxYi8yNyAtIHJlc2VydmVkICovCisJMHgwMCwJCS8qIDFjLzI4IC0gY2FwX2RhdGFmb3JtX3JlZyAqLworCTB4MDAsCQkvKiAxZC8yOSAtIHJlc2VydmVkICovCisJMHgwMCwJCS8qIDFlLzMwIC0gY2FwX3VwY291bnRfcmVnICovCisJMHgwMAkJLyogMWYvMzEgLSBjYXBfbG93Y291bnRfcmVnICovCit9OworCisvKgorICogIEJhc2ljIEkvTyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgd3NzX291dGIoc3RydWN0IHNuZF93c3MgKmNoaXAsIHU4IG9mZnNldCwgdTggdmFsKQoreworCW91dGIodmFsLCBjaGlwLT5wb3J0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1OCB3c3NfaW5iKHN0cnVjdCBzbmRfd3NzICpjaGlwLCB1OCBvZmZzZXQpCit7CisJcmV0dXJuIGluYihjaGlwLT5wb3J0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgc25kX3dzc193YWl0KHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCWludCB0aW1lb3V0OworCisJZm9yICh0aW1lb3V0ID0gMjUwOworCSAgICAgdGltZW91dCA+IDAgJiYgKHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKTsKKwkgICAgIHRpbWVvdXQtLSkKKwkJdWRlbGF5KDEwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF93c3Nfb3V0bShzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgdG1wID0gKGNoaXAtPmltYWdlW3JlZ10gJiBtYXNrKSB8IHZhbHVlOworCisJc25kX3dzc193YWl0KGNoaXApOworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlpZiAod3NzX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpCisJCXNuZF9wcmludGsoIm91dG06IGF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgLSByZWcgPSAweCV4LCB2YWx1ZSA9IDB4JXhcbiIsIHJlZywgdmFsdWUpOworI2VuZGlmCisJY2hpcC0+aW1hZ2VbcmVnXSA9IHRtcDsKKwlpZiAoIWNoaXAtPmNhbGlicmF0ZV9tdXRlKSB7CisJCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8IHJlZyk7CisJCXdtYigpOworCQl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFJFRyksIHRtcCk7CisJCW1iKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbmRfd3NzX2RvdXQoc3RydWN0IHNuZF93c3MgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IHRpbWVvdXQ7CisKKwlmb3IgKHRpbWVvdXQgPSAyNTA7CisJICAgICB0aW1lb3V0ID4gMCAmJiAod3NzX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpOworCSAgICAgdGltZW91dC0tKQorCQl1ZGVsYXkoMTApOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8IHJlZyk7CisJd3NzX291dGIoY2hpcCwgQ1M0MjMxUChSRUcpLCB2YWx1ZSk7CisJbWIoKTsKK30KKwordm9pZCBzbmRfd3NzX291dChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJc25kX3dzc193YWl0KGNoaXApOworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlpZiAod3NzX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpICYgQ1M0MjMxX0lOSVQpCisJCXNuZF9wcmludGsoIm91dDogYXV0byBjYWxpYnJhdGlvbiB0aW1lIG91dCAtIHJlZyA9IDB4JXgsIHZhbHVlID0gMHgleFxuIiwgcmVnLCB2YWx1ZSk7CisjZW5kaWYKKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFJFR1NFTCksIGNoaXAtPm1jZV9iaXQgfCByZWcpOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwgdmFsdWUpOworCWNoaXAtPmltYWdlW3JlZ10gPSB2YWx1ZTsKKwltYigpOworCXNuZF9wcmludGRkKCJjb2RlYyBvdXQgLSByZWcgMHgleCA9IDB4JXhcbiIsCisJCQljaGlwLT5tY2VfYml0IHwgcmVnLCB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3Nfb3V0KTsKKwordW5zaWduZWQgY2hhciBzbmRfd3NzX2luKHN0cnVjdCBzbmRfd3NzICpjaGlwLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlzbmRfd3NzX3dhaXQoY2hpcCk7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCWlmICh3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKKwkJc25kX3ByaW50aygiaW46IGF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgLSByZWcgPSAweCV4XG4iLCByZWcpOworI2VuZGlmCisJd3NzX291dGIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpLCBjaGlwLT5tY2VfYml0IHwgcmVnKTsKKwltYigpOworCXJldHVybiB3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHKSk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfaW4pOworCit2b2lkIHNuZF9jczQyMzZfZXh0X291dChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgY2hhciByZWcsCisJCQl1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFJFR1NFTCksIGNoaXAtPm1jZV9iaXQgfCAweDE3KTsKKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFJFRyksCisJCSByZWcgfCAoY2hpcC0+aW1hZ2VbQ1M0MjM2X0VYVF9SRUddICYgMHgwMSkpOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwgdmFsKTsKKwljaGlwLT5laW1hZ2VbQ1M0MjM2X1JFRyhyZWcpXSA9IHZhbDsKKyNpZiAwCisJcHJpbnRrKCJleHQgb3V0IDogcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHNuZF9jczQyMzZfZXh0X291dCk7CisKK3Vuc2lnbmVkIGNoYXIgc25kX2NzNDIzNl9leHRfaW4oc3RydWN0IHNuZF93c3MgKmNoaXAsIHVuc2lnbmVkIGNoYXIgcmVnKQoreworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8IDB4MTcpOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHKSwKKwkJIHJlZyB8IChjaGlwLT5pbWFnZVtDUzQyMzZfRVhUX1JFR10gJiAweDAxKSk7CisjaWYgMQorCXJldHVybiB3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHKSk7CisjZWxzZQorCXsKKwkJdW5zaWduZWQgY2hhciByZXM7CisJCXJlcyA9IHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUcpKTsKKwkJcHJpbnRrKCJleHQgaW4gOiByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHNuZF9jczQyMzZfZXh0X2luKTsKKworI2lmIDAKKworc3RhdGljIHZvaWQgc25kX3dzc19kZWJ1ZyhzdHJ1Y3Qgc25kX3dzcyAqY2hpcCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRworCQkiQ1M0MjMxIFJFR1M6ICAgICAgSU5ERVggPSAweCUwMnggICIKKwkJIiAgICAgICAgICAgICAgICAgU1RBVFVTID0gMHglMDJ4XG4iLAorCQkJCQl3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSksCisJCQkJCXdzc19pbmIoY2hpcCwgQ1M0MjMxUChTVEFUVVMpKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwMDogbGVmdCBpbnB1dCAgICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MTA6IGFsdCAxIChDRklHIDIpICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDAwKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDEwKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwMTogcmlnaHQgaW5wdXQgICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MTE6IGFsdCAyIChDRklHIDMpICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDAxKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDExKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwMjogR0YxIGxlZnQgaW5wdXQgID0gMHglMDJ4ICAiCisJCSIgIDB4MTI6IGxlZnQgbGluZSBpbiAgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDAyKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDEyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwMzogR0YxIHJpZ2h0IGlucHV0ID0gMHglMDJ4ICAiCisJCSIgIDB4MTM6IHJpZ2h0IGxpbmUgaW4gICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDAzKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDEzKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwNDogQ0QgbGVmdCBpbnB1dCAgID0gMHglMDJ4ICAiCisJCSIgIDB4MTQ6IHRpbWVyIGxvdyAgICAgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA0KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE0KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwNTogQ0QgcmlnaHQgaW5wdXQgID0gMHglMDJ4ICAiCisJCSIgIDB4MTU6IHRpbWVyIGhpZ2ggICAgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA1KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE1KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwNjogbGVmdCBvdXRwdXQgICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MTY6IGxlZnQgTUlDIChQblApICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA2KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE2KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwNzogcmlnaHQgb3V0cHV0ICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MTc6IHJpZ2h0IE1JQyAoUG5QKSA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA3KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE3KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwODogcGxheWJhY2sgZm9ybWF0ID0gMHglMDJ4ICAiCisJCSIgIDB4MTg6IElSUSBzdGF0dXMgICAgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA4KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE4KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwOTogaWZhY2UgKENGSUcgMSkgID0gMHglMDJ4ICAiCisJCSIgIDB4MTk6IGxlZnQgbGluZSBvdXQgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDA5KSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDE5KSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwYTogcGluIGNvbnRyb2wgICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MWE6IG1vbm8gY29udHJvbCAgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBhKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFhKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwYjogaW5pdCAmIHN0YXR1cyAgID0gMHglMDJ4ICAiCisJCSIgIDB4MWI6IHJpZ2h0IGxpbmUgb3V0ICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBiKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFiKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwYzogcmV2aXNpb24gJiBtb2RlID0gMHglMDJ4ICAiCisJCSIgIDB4MWM6IHJlY29yZCBmb3JtYXQgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBjKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFjKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwZDogbG9vcGJhY2sgICAgICAgID0gMHglMDJ4ICAiCisJCSIgIDB4MWQ6IHZhciBmcmVxIChQblApICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBkKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFkKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwZTogcGx5IHVwciBjb3VudCAgID0gMHglMDJ4ICAiCisJCSIgIDB4MWU6IHBseSBsd3IgY291bnQgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBlKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFlKSk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkJIiAgMHgwZjogcmVjIHVwciBjb3VudCAgID0gMHglMDJ4ICAiCisJCSIgIDB4MWY6IHJlYyBsd3IgY291bnQgICA9IDB4JTAyeFxuIiwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDBmKSwKKwkJCQkJc25kX3dzc19pbihjaGlwLCAweDFmKSk7Cit9CisKKyNlbmRpZgorCisvKgorICogIENTNDIzMSBkZXRlY3Rpb24gLyBNQ0Ugcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZCBzbmRfd3NzX2J1c3lfd2FpdChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCkKK3sKKwlpbnQgdGltZW91dDsKKworCS8qIGh1aC4uIGxvb2tzIGxpa2UgdGhpcyBzZXF1ZW5jZSBpcyBwcm9wZXIgZm9yIENTNDIzMUEgY2hpcCAoR1VTIE1BWCkgKi8KKwlmb3IgKHRpbWVvdXQgPSA1OyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKQorCQl3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSk7CisJLyogZW5kIG9mIGNsZWFudXAgc2VxdWVuY2UgKi8KKwlmb3IgKHRpbWVvdXQgPSAyNTAwMDsKKwkgICAgIHRpbWVvdXQgPiAwICYmICh3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCk7CisJICAgICB0aW1lb3V0LS0pCisJCXVkZWxheSgxMCk7Cit9CisKK3ZvaWQgc25kX3dzc19tY2VfdXAoc3RydWN0IHNuZF93c3MgKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGltZW91dDsKKworCXNuZF93c3Nfd2FpdChjaGlwKTsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJaWYgKHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKQorCQlzbmRfcHJpbnRrKCJtY2VfdXAgLSBhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgwKVxuIik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwljaGlwLT5tY2VfYml0IHw9IENTNDIzMV9NQ0U7CisJdGltZW91dCA9IHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKTsKKwlpZiAodGltZW91dCA9PSAweDgwKQorCQlzbmRfcHJpbnRrKCJtY2VfdXAgWzB4JWx4XTogc2VyaW91cyBpbml0IHByb2JsZW0gLSBjb2RlYyBzdGlsbCBidXN5XG4iLCBjaGlwLT5wb3J0KTsKKwlpZiAoISh0aW1lb3V0ICYgQ1M0MjMxX01DRSkpCisJCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwKKwkJCSBjaGlwLT5tY2VfYml0IHwgKHRpbWVvdXQgJiAweDFmKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19tY2VfdXApOworCit2b2lkIHNuZF93c3NfbWNlX2Rvd24oc3RydWN0IHNuZF93c3MgKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lOworCWludCB0aW1lb3V0OworCWludCBod19tYXNrID0gV1NTX0hXX0NTNDIzMV9NQVNLIHwgV1NTX0hXX0NTNDIzMl9NQVNLIHwgV1NTX0hXX0FEMTg0ODsKKworCXNuZF93c3NfYnVzeV93YWl0KGNoaXApOworCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCWlmICh3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKKwkJc25kX3ByaW50aygibWNlX2Rvd24gWzB4JWx4XSAtIGF1dG8gY2FsaWJyYXRpb24gdGltZSBvdXQgKDApXG4iLCAobG9uZylDUzQyMzFQKFJFR1NFTCkpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJY2hpcC0+bWNlX2JpdCAmPSB+Q1M0MjMxX01DRTsKKwl0aW1lb3V0ID0gd3NzX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8ICh0aW1lb3V0ICYgMHgxZikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHRpbWVvdXQgPT0gMHg4MCkKKwkJc25kX3ByaW50aygibWNlX2Rvd24gWzB4JWx4XTogc2VyaW91cyBpbml0IHByb2JsZW0gLSBjb2RlYyBzdGlsbCBidXN5XG4iLCBjaGlwLT5wb3J0KTsKKwlpZiAoKHRpbWVvdXQgJiBDUzQyMzFfTUNFKSA9PSAwIHx8ICEoY2hpcC0+aGFyZHdhcmUgJiBod19tYXNrKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXYWl0IGZvciAocG9zc2libGUgLS0gZHVyaW5nIGluaXQgYXV0by1jYWxpYnJhdGlvbiBtYXkgbm90IGJlIHNldCkKKwkgKiBjYWxpYnJhdGlvbiBwcm9jZXNzIHRvIHN0YXJ0LiBOZWVkcyB1cHRvIDUgc2FtcGxlIHBlcmlvZHMgb24gQUQxODQ4CisJICogd2hpY2ggYXQgdGhlIHNsb3dlc3QgcG9zc2libGUgcmF0ZSBvZiA1LjUxMjUga0h6IG1lYW5zIDkwNyB1cy4KKwkgKi8KKwltc2xlZXAoMSk7CisKKwlzbmRfcHJpbnRkZCgiKDEpIGppZmZpZXMgPSAlbHVcbiIsIGppZmZpZXMpOworCisJLyogY2hlY2sgY29uZGl0aW9uIHVwIHRvIDI1MCBtcyAqLworCWVuZF90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKTsKKwl3aGlsZSAoc25kX3dzc19pbihjaGlwLCBDUzQyMzFfVEVTVF9JTklUKSAmCisJCUNTNDIzMV9DQUxJQl9JTl9QUk9HUkVTUykgeworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGVuZF90aW1lKSkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibWNlX2Rvd24gLSAiCisJCQkJCSJhdXRvIGNhbGlicmF0aW9uIHRpbWUgb3V0ICgyKVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbXNsZWVwKDEpOworCX0KKworCXNuZF9wcmludGRkKCIoMikgamlmZmllcyA9ICVsdVxuIiwgamlmZmllcyk7CisKKwkvKiBjaGVjayBjb25kaXRpb24gdXAgdG8gMTAwIG1zICovCisJZW5kX3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICh3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmRfdGltZSkpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1jZV9kb3duIC0gYXV0byBjYWxpYnJhdGlvbiB0aW1lIG91dCAoMylcbiIpOworCQkJcmV0dXJuOworCQl9CisJCW1zbGVlcCgxKTsKKwl9CisKKwlzbmRfcHJpbnRkZCgiKDMpIGppZmZpZXMgPSAlbHVcbiIsIGppZmZpZXMpOworCXNuZF9wcmludGQoIm1jZV9kb3duIC0gZXhpdCA9IDB4JXhcbiIsIHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfbWNlX2Rvd24pOworCitzdGF0aWMgdW5zaWduZWQgaW50IHNuZF93c3NfZ2V0X2NvdW50KHVuc2lnbmVkIGNoYXIgZm9ybWF0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKGZvcm1hdCAmIDB4ZTApIHsKKwljYXNlIENTNDIzMV9MSU5FQVJfMTY6CisJY2FzZSBDUzQyMzFfTElORUFSXzE2X0JJRzoKKwkJc2l6ZSA+Pj0gMTsKKwkJYnJlYWs7CisJY2FzZSBDUzQyMzFfQURQQ01fMTY6CisJCXJldHVybiBzaXplID4+IDI7CisJfQorCWlmIChmb3JtYXQgJiBDUzQyMzFfU1RFUkVPKQorCQlzaXplID4+PSAxOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IHNuZF93c3NfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIGludCBjbWQpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHdoYXQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOworCWludCBkb19zdGFydDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJZG9fc3RhcnQgPSAxOyBicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlkb19zdGFydCA9IDA7IGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdoYXQgPSAwOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CisJCWlmIChzID09IGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSkgeworCQkJd2hhdCB8PSBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFOworCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJfSBlbHNlIGlmIChzID09IGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKSB7CisJCQl3aGF0IHw9IENTNDIzMV9SRUNPUkRfRU5BQkxFOworCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKKwkJfQorCX0KKwlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAoZG9fc3RhcnQpIHsKKwkJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdIHw9IHdoYXQ7CisJCWlmIChjaGlwLT50cmlnZ2VyKQorCQkJY2hpcC0+dHJpZ2dlcihjaGlwLCB3aGF0LCAxKTsKKwl9IGVsc2UgeworCQljaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJj0gfndoYXQ7CisJCWlmIChjaGlwLT50cmlnZ2VyKQorCQkJY2hpcC0+dHJpZ2dlcihjaGlwLCB3aGF0LCAwKTsKKwl9CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSk7CisJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKyNpZiAwCisJc25kX3dzc19kZWJ1ZyhjaGlwKTsKKyNlbmRpZgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiAgQ09ERUMgSS9PCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX3dzc19nZXRfcmF0ZSh1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKTsgaSsrKQorCQlpZiAocmF0ZSA9PSByYXRlc1tpXSkKKwkJCXJldHVybiBmcmVxX2JpdHNbaV07CisJLy8gc25kX0JVRygpOworCXJldHVybiBmcmVxX2JpdHNbQVJSQVlfU0laRShyYXRlcykgLSAxXTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc25kX3dzc19nZXRfZm9ybWF0KHN0cnVjdCBzbmRfd3NzICpjaGlwLAorCQkJCQlpbnQgZm9ybWF0LAorCQkJCQlpbnQgY2hhbm5lbHMpCit7CisJdW5zaWduZWQgY2hhciByZm9ybWF0OworCisJcmZvcm1hdCA9IENTNDIzMV9MSU5FQVJfODsKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9NVV9MQVc6CXJmb3JtYXQgPSBDUzQyMzFfVUxBV184OyBicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfQV9MQVc6CXJmb3JtYXQgPSBDUzQyMzFfQUxBV184OyBicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOglyZm9ybWF0ID0gQ1M0MjMxX0xJTkVBUl8xNjsgYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9CRToJcmZvcm1hdCA9IENTNDIzMV9MSU5FQVJfMTZfQklHOyBicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfSU1BX0FEUENNOglyZm9ybWF0ID0gQ1M0MjMxX0FEUENNXzE2OyBicmVhazsKKwl9CisJaWYgKGNoYW5uZWxzID4gMSkKKwkJcmZvcm1hdCB8PSBDUzQyMzFfU1RFUkVPOworI2lmIDAKKwlzbmRfcHJpbnRrKCJnZXRfZm9ybWF0OiAweCV4IChtb2RlPTB4JXgpXG4iLCBmb3JtYXQsIG1vZGUpOworI2VuZGlmCisJcmV0dXJuIHJmb3JtYXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF93c3NfY2FsaWJyYXRlX211dGUoc3RydWN0IHNuZF93c3MgKmNoaXAsIGludCBtdXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRlID0gbXV0ZSA/IDB4ODAgOiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChjaGlwLT5jYWxpYnJhdGVfbXV0ZSA9PSBtdXRlKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKCFtdXRlKSB7CisJCXNuZF93c3NfZG91dChjaGlwLCBDUzQyMzFfTEVGVF9JTlBVVCwKKwkJCSAgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfSU5QVVRdKTsKKwkJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9JTlBVVCwKKwkJCSAgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX1JJR0hUX0lOUFVUXSk7CisJCXNuZF93c3NfZG91dChjaGlwLCBDUzQyMzFfTE9PUEJBQ0ssCisJCQkgICAgIGNoaXAtPmltYWdlW0NTNDIzMV9MT09QQkFDS10pOworCX0KKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwKKwkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVF0pOworCXNuZF93c3NfZG91dChjaGlwLCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwKKwkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVRdKTsKKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwKKwkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVF0pOworCXNuZF93c3NfZG91dChjaGlwLCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwKKwkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVRdKTsKKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfT1VUUFVULAorCQkgICAgIG11dGUgfCBjaGlwLT5pbWFnZVtDUzQyMzFfTEVGVF9PVVRQVVRdKTsKKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwKKwkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1JJR0hUX09VVFBVVF0pOworCWlmICghKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKSkgeworCQlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfTElORV9JTiwKKwkJCSAgICAgbXV0ZSB8IGNoaXAtPmltYWdlW0NTNDIzMV9MRUZUX0xJTkVfSU5dKTsKKwkJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9MSU5FX0lOLAorCQkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1JJR0hUX0xJTkVfSU5dKTsKKwkJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9NT05PX0NUUkwsCisJCQkgICAgIG11dGUgPyAweGMwIDogY2hpcC0+aW1hZ2VbQ1M0MjMxX01PTk9fQ1RSTF0pOworCX0KKwlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX0lOVEVSV0FWRSkgeworCQlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfTUlDX0lOUFVULAorCQkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfTUlDX0lOUFVUXSk7CisJCXNuZF93c3NfZG91dChjaGlwLCBDUzQyMzFfUklHSFRfTUlDX0lOUFVULAorCQkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX1JJR0hUX01JQ19JTlBVVF0pOworCQlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xJTkVfTEVGVF9PVVRQVVQsCisJCQkgICAgIG11dGUgfCBjaGlwLT5pbWFnZVtDUzQyMzFfTElORV9MRUZUX09VVFBVVF0pOworCQlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xJTkVfUklHSFRfT1VUUFVULAorCQkJICAgICBtdXRlIHwgY2hpcC0+aW1hZ2VbQ1M0MjMxX0xJTkVfUklHSFRfT1VUUFVUXSk7CisJfQorCWNoaXAtPmNhbGlicmF0ZV9tdXRlID0gbXV0ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzbmRfd3NzX3BsYXliYWNrX2Zvcm1hdChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgcGRmcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmdWxsX2NhbGliID0gMTsKKworCW11dGV4X2xvY2soJmNoaXAtPm1jZV9tdXRleCk7CisJc25kX3dzc19jYWxpYnJhdGVfbXV0ZShjaGlwLCAxKTsKKwlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX0NTNDIzMUEgfHwKKwkgICAgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0NTNDIzMl9NQVNLKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKChjaGlwLT5pbWFnZVtDUzQyMzFfUExBWUJLX0ZPUk1BVF0gJiAweDBmKSA9PSAocGRmciAmIDB4MGYpKSB7CS8qIHJhdGUgaXMgc2FtZT8gKi8KKwkJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLAorCQkJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfCAweDEwKTsKKwkJCWNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSA9IHBkZnI7CisJCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwKKwkJCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX1BMQVlCS19GT1JNQVRdKTsKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLAorCQkJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJj0gfjB4MTApOworCQkJdWRlbGF5KDEwMCk7IC8qIEZpeGVzIGF1ZGlibGUgY2xpY2tzIGF0IGxlYXN0IG9uIEdVUyBNQVggKi8KKwkJCWZ1bGxfY2FsaWIgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJfQorCWlmIChmdWxsX2NhbGliKSB7CisJCXNuZF93c3NfbWNlX3VwKGNoaXApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGNoaXAtPmhhcmR3YXJlICE9IFdTU19IV19JTlRFUldBVkUgJiYgIWNoaXAtPnNpbmdsZV9kbWEpIHsKKwkJCWlmIChjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiBDUzQyMzFfUkVDT1JEX0VOQUJMRSkKKwkJCQlwZGZyID0gKHBkZnIgJiAweGYwKSB8CisJCQkJICAgICAgIChjaGlwLT5pbWFnZVtDUzQyMzFfUkVDX0ZPUk1BVF0gJiAweDBmKTsKKwkJfSBlbHNlIHsKKwkJCWNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSA9IHBkZnI7CisJCX0KKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1BMQVlCS19GT1JNQVQsIHBkZnIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCQlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX09QTDNTQTIpCisJCQl1ZGVsYXkoMTAwKTsJLyogdGhpcyBzZWVtcyB0byBoZWxwICovCisJCXNuZF93c3NfbWNlX2Rvd24oY2hpcCk7CisJfQorCXNuZF93c3NfY2FsaWJyYXRlX211dGUoY2hpcCwgMCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tY2VfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBzbmRfd3NzX2NhcHR1cmVfZm9ybWF0KHN0cnVjdCBzbmRfd3NzICpjaGlwLAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgY2RmcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmdWxsX2NhbGliID0gMTsKKworCW11dGV4X2xvY2soJmNoaXAtPm1jZV9tdXRleCk7CisJc25kX3dzc19jYWxpYnJhdGVfbXV0ZShjaGlwLCAxKTsKKwlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX0NTNDIzMUEgfHwKKwkgICAgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0NTNDIzMl9NQVNLKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKChjaGlwLT5pbWFnZVtDUzQyMzFfUExBWUJLX0ZPUk1BVF0gJiAweDBmKSA9PSAoY2RmciAmIDB4MGYpIHx8CS8qIHJhdGUgaXMgc2FtZT8gKi8KKwkJICAgIChjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFKSkgeworCQkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0FMVF9GRUFUVVJFXzEsCisJCQkJY2hpcC0+aW1hZ2VbQ1M0MjMxX0FMVF9GRUFUVVJFXzFdIHwgMHgyMCk7CisJCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUkVDX0ZPUk1BVCwKKwkJCQljaGlwLT5pbWFnZVtDUzQyMzFfUkVDX0ZPUk1BVF0gPSBjZGZyKTsKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9BTFRfRkVBVFVSRV8xLAorCQkJCWNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSAmPSB+MHgyMCk7CisJCQlmdWxsX2NhbGliID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCX0KKwlpZiAoZnVsbF9jYWxpYikgeworCQlzbmRfd3NzX21jZV91cChjaGlwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmIChjaGlwLT5oYXJkd2FyZSAhPSBXU1NfSFdfSU5URVJXQVZFICYmCisJCSAgICAhKGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmIENTNDIzMV9QTEFZQkFDS19FTkFCTEUpKSB7CisJCQlpZiAoY2hpcC0+c2luZ2xlX2RtYSkKKwkJCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgY2Rmcik7CisJCQllbHNlCisJCQkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1BMQVlCS19GT1JNQVQsCisJCQkJICAgKGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSAmIDB4ZjApIHwKKwkJCQkgICAoY2RmciAmIDB4MGYpKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCQkJc25kX3dzc19tY2VfdXAoY2hpcCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlpZiAoY2hpcC0+aGFyZHdhcmUgJiBXU1NfSFdfQUQxODQ4X01BU0spCisJCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExBWUJLX0ZPUk1BVCwgY2Rmcik7CisJCWVsc2UKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9SRUNfRk9STUFULCBjZGZyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc25kX3dzc19tY2VfZG93bihjaGlwKTsKKwl9CisJc25kX3dzc19jYWxpYnJhdGVfbXV0ZShjaGlwLCAwKTsKKwltdXRleF91bmxvY2soJmNoaXAtPm1jZV9tdXRleCk7Cit9CisKKy8qCisgKiAgVGltZXIgaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc25kX3dzc190aW1lcl9yZXNvbHV0aW9uKHN0cnVjdCBzbmRfdGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOworCWlmIChjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19DUzQyMzZCX01BU0spCisJCXJldHVybiAxNDQ2NzsKKwllbHNlCisJCXJldHVybiBjaGlwLT5pbWFnZVtDUzQyMzFfUExBWUJLX0ZPUk1BVF0gJiAxID8gOTk2OSA6IDk5MjA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc190aW1lcl9zdGFydChzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB0aWNrczsKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl0aWNrcyA9IHRpbWVyLT5zdGlja3M7CisJaWYgKChjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gJiBDUzQyMzFfVElNRVJfRU5BQkxFKSA9PSAwIHx8CisJICAgICh1bnNpZ25lZCBjaGFyKSh0aWNrcyA+PiA4KSAhPSBjaGlwLT5pbWFnZVtDUzQyMzFfVElNRVJfSElHSF0gfHwKKwkgICAgKHVuc2lnbmVkIGNoYXIpdGlja3MgIT0gY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0xPV10pIHsKKwkJY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0hJR0hdID0gKHVuc2lnbmVkIGNoYXIpICh0aWNrcyA+PiA4KTsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1RJTUVSX0hJR0gsCisJCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0hJR0hdKTsKKwkJY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0xPV10gPSAodW5zaWduZWQgY2hhcikgdGlja3M7CisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9USU1FUl9MT1csCisJCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX1RJTUVSX0xPV10pOworCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSwKKwkJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0gfAorCQkJICAgIENTNDIzMV9USU1FUl9FTkFCTEUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF93c3NfdGltZXJfc3RvcChzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSAmPSB+Q1M0MjMxX1RJTUVSX0VOQUJMRTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMSwKKwkJICAgIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3dzc19pbml0KHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCisjaWZkZWYgU05EUlZfREVCVUdfTUNFCisJc25kX3ByaW50aygiaW5pdDogKDEpXG4iKTsKKyNlbmRpZgorCXNuZF93c3NfbWNlX3VwKGNoaXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmPSB+KENTNDIzMV9QTEFZQkFDS19FTkFCTEUgfAorCQkJCQkgICAgQ1M0MjMxX1BMQVlCQUNLX1BJTyB8CisJCQkJCSAgICBDUzQyMzFfUkVDT1JEX0VOQUJMRSB8CisJCQkJCSAgICBDUzQyMzFfUkVDT1JEX1BJTyB8CisJCQkJCSAgICBDUzQyMzFfQ0FMSUJfTU9ERSk7CisJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdIHw9IENTNDIzMV9BVVRPQ0FMSUI7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0lGQUNFX0NUUkwsIGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCisjaWZkZWYgU05EUlZfREVCVUdfTUNFCisJc25kX3ByaW50aygiaW5pdDogKDIpXG4iKTsKKyNlbmRpZgorCisJc25kX3dzc19tY2VfdXAoY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX3dzc19vdXQoY2hpcCwKKwkJICAgIENTNDIzMV9BTFRfRkVBVFVSRV8xLCBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJc25kX3dzc19tY2VfZG93bihjaGlwKTsKKworI2lmZGVmIFNORFJWX0RFQlVHX01DRQorCXNuZF9wcmludGsoImluaXQ6ICgzKSAtIGFmZWkgPSAweCV4XG4iLAorCQkgICBjaGlwLT5pbWFnZVtDUzQyMzFfQUxUX0ZFQVRVUkVfMV0pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfQUxUX0ZFQVRVUkVfMiwKKwkJICAgIGNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8yXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXNuZF93c3NfbWNlX3VwKGNoaXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9QTEFZQktfRk9STUFULAorCQkgICAgY2hpcC0+aW1hZ2VbQ1M0MjMxX1BMQVlCS19GT1JNQVRdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF93c3NfbWNlX2Rvd24oY2hpcCk7CisKKyNpZmRlZiBTTkRSVl9ERUJVR19NQ0UKKwlzbmRfcHJpbnRrKCJpbml0OiAoNClcbiIpOworI2VuZGlmCisKKwlzbmRfd3NzX21jZV91cChjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykpCisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9SRUNfRk9STUFULAorCQkJICAgIGNoaXAtPmltYWdlW0NTNDIzMV9SRUNfRk9STUFUXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCisjaWZkZWYgU05EUlZfREVCVUdfTUNFCisJc25kX3ByaW50aygiaW5pdDogKDUpXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHNuZF93c3Nfb3BlbihzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW11dGV4X2xvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCWlmICgoY2hpcC0+bW9kZSAmIG1vZGUpIHx8CisJICAgICgoY2hpcC0+bW9kZSAmIFdTU19NT0RFX09QRU4pICYmIGNoaXAtPnNpbmdsZV9kbWEpKSB7CisJCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAoY2hpcC0+bW9kZSAmIFdTU19NT0RFX09QRU4pIHsKKwkJY2hpcC0+bW9kZSB8PSBtb2RlOworCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisJLyogb2suIG5vdyBlbmFibGUgYW5kIGFjayBDT0RFQyBJUlEgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykpIHsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0lSUV9TVEFUVVMsCisJCQkgICAgQ1M0MjMxX1BMQVlCQUNLX0lSUSB8CisJCQkgICAgQ1M0MjMxX1JFQ09SRF9JUlEgfAorCQkJICAgIENTNDIzMV9USU1FUl9JUlEpOworCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfSVJRX1NUQVRVUywgMCk7CisJfQorCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoU1RBVFVTKSwgMCk7CS8qIGNsZWFyIElSUSAqLworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoU1RBVFVTKSwgMCk7CS8qIGNsZWFyIElSUSAqLworCWNoaXAtPmltYWdlW0NTNDIzMV9QSU5fQ1RSTF0gfD0gQ1M0MjMxX0lSUV9FTkFCTEU7CisJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1BJTl9DVFJMLCBjaGlwLT5pbWFnZVtDUzQyMzFfUElOX0NUUkxdKTsKKwlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykpIHsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX0lSUV9TVEFUVVMsCisJCQkgICAgQ1M0MjMxX1BMQVlCQUNLX0lSUSB8CisJCQkgICAgQ1M0MjMxX1JFQ09SRF9JUlEgfAorCQkJICAgIENTNDIzMV9USU1FUl9JUlEpOworCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfSVJRX1NUQVRVUywgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisKKwljaGlwLT5tb2RlID0gbW9kZTsKKwltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfd3NzX2Nsb3NlKHN0cnVjdCBzbmRfd3NzICpjaGlwLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJY2hpcC0+bW9kZSAmPSB+bW9kZTsKKwlpZiAoY2hpcC0+bW9kZSAmIFdTU19NT0RFX09QRU4pIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwkJcmV0dXJuOworCX0KKwlzbmRfd3NzX2NhbGlicmF0ZV9tdXRlKGNoaXAsIDEpOworCisJLyogZGlzYWJsZSBJUlEgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykpCisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCAwKTsKKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KKwljaGlwLT5pbWFnZVtDUzQyMzFfUElOX0NUUkxdICY9IH5DUzQyMzFfSVJRX0VOQUJMRTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUElOX0NUUkwsIGNoaXAtPmltYWdlW0NTNDIzMV9QSU5fQ1RSTF0pOworCisJLyogbm93IGRpc2FibGUgcmVjb3JkICYgcGxheWJhY2sgKi8KKworCWlmIChjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJiAoQ1M0MjMxX1BMQVlCQUNLX0VOQUJMRSB8IENTNDIzMV9QTEFZQkFDS19QSU8gfAorCQkJCQkgICAgICAgQ1M0MjMxX1JFQ09SRF9FTkFCTEUgfCBDUzQyMzFfUkVDT1JEX1BJTykpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc25kX3dzc19tY2VfdXAoY2hpcCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCQljaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0gJj0gfihDUzQyMzFfUExBWUJBQ0tfRU5BQkxFIHwgQ1M0MjMxX1BMQVlCQUNLX1BJTyB8CisJCQkJCQkgICAgIENTNDIzMV9SRUNPUkRfRU5BQkxFIHwgQ1M0MjMxX1JFQ09SRF9QSU8pOworCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfSUZBQ0VfQ1RSTCwKKwkJCSAgICBjaGlwLT5pbWFnZVtDUzQyMzFfSUZBQ0VfQ1RSTF0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCQlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBjbGVhciBJUlEgYWdhaW4gKi8KKwlpZiAoIShjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykpCisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCAwKTsKKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOwkvKiBjbGVhciBJUlEgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCisJc25kX3dzc19jYWxpYnJhdGVfbXV0ZShjaGlwLCAwKTsKKworCWNoaXAtPm1vZGUgPSAwOworCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7Cit9CisKKy8qCisgKiAgdGltZXIgb3Blbi9jbG9zZQorICovCisKK3N0YXRpYyBpbnQgc25kX3dzc190aW1lcl9vcGVuKHN0cnVjdCBzbmRfdGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX3RpbWVyX2NoaXAodGltZXIpOworCXNuZF93c3Nfb3BlbihjaGlwLCBXU1NfTU9ERV9USU1FUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc190aW1lcl9jbG9zZShzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKKwlzbmRfd3NzX2Nsb3NlKGNoaXAsIFdTU19NT0RFX1RJTUVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfdGltZXJfaGFyZHdhcmUgc25kX3dzc190aW1lcl90YWJsZSA9Cit7CisJLmZsYWdzID0JU05EUlZfVElNRVJfSFdfQVVUTywKKwkucmVzb2x1dGlvbiA9CTk5NDUsCisJLnRpY2tzID0JNjU1MzUsCisJLm9wZW4gPQkJc25kX3dzc190aW1lcl9vcGVuLAorCS5jbG9zZSA9CXNuZF93c3NfdGltZXJfY2xvc2UsCisJLmNfcmVzb2x1dGlvbiA9IHNuZF93c3NfdGltZXJfcmVzb2x1dGlvbiwKKwkuc3RhcnQgPQlzbmRfd3NzX3RpbWVyX3N0YXJ0LAorCS5zdG9wID0JCXNuZF93c3NfdGltZXJfc3RvcCwKK307CisKKy8qCisgKiAgb2suLiBleHBvcnRlZCBmdW5jdGlvbnMuLgorICovCisKK3N0YXRpYyBpbnQgc25kX3dzc19wbGF5YmFja19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBjaGFyIG5ld19wZGZyOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwluZXdfcGRmciA9IHNuZF93c3NfZ2V0X2Zvcm1hdChjaGlwLCBwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcyksCisJCQkJcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcykpIHwKKwkJCQlzbmRfd3NzX2dldF9yYXRlKHBhcmFtc19yYXRlKGh3X3BhcmFtcykpOworCWNoaXAtPnNldF9wbGF5YmFja19mb3JtYXQoY2hpcCwgaHdfcGFyYW1zLCBuZXdfcGRmcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc19wbGF5YmFja19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc19wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXVuc2lnbmVkIGludCBjb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJY2hpcC0+cF9kbWFfc2l6ZSA9IHNpemU7CisJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICY9IH4oQ1M0MjMxX1BMQVlCQUNLX0VOQUJMRSB8IENTNDIzMV9QTEFZQkFDS19QSU8pOworCXNuZF9kbWFfcHJvZ3JhbShjaGlwLT5kbWExLCBydW50aW1lLT5kbWFfYWRkciwgc2l6ZSwgRE1BX01PREVfV1JJVEUgfCBETUFfQVVUT0lOSVQpOworCWNvdW50ID0gc25kX3dzc19nZXRfY291bnQoY2hpcC0+aW1hZ2VbQ1M0MjMxX1BMQVlCS19GT1JNQVRdLCBjb3VudCkgLSAxOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9QTFlfTFdSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIGNvdW50KTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUExZX1VQUl9DTlQsICh1bnNpZ25lZCBjaGFyKSAoY291bnQgPj4gOCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisjaWYgMAorCXNuZF93c3NfZGVidWcoY2hpcCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfd3NzX2NhcHR1cmVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBjaGFyIG5ld19jZGZyOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwluZXdfY2RmciA9IHNuZF93c3NfZ2V0X2Zvcm1hdChjaGlwLCBwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcyksCisJCQkgICBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSkgfAorCQkJICAgc25kX3dzc19nZXRfcmF0ZShwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKKwljaGlwLT5zZXRfY2FwdHVyZV9mb3JtYXQoY2hpcCwgaHdfcGFyYW1zLCBuZXdfY2Rmcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc19jYXB0dXJlX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBzbmRfd3NzX2NhcHR1cmVfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHNpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWNoaXAtPmNfZG1hX3NpemUgPSBzaXplOworCWNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmPSB+KENTNDIzMV9SRUNPUkRfRU5BQkxFIHwgQ1M0MjMxX1JFQ09SRF9QSU8pOworCXNuZF9kbWFfcHJvZ3JhbShjaGlwLT5kbWEyLCBydW50aW1lLT5kbWFfYWRkciwgc2l6ZSwgRE1BX01PREVfUkVBRCB8IERNQV9BVVRPSU5JVCk7CisJaWYgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKQorCQljb3VudCA9IHNuZF93c3NfZ2V0X2NvdW50KGNoaXAtPmltYWdlW0NTNDIzMV9QTEFZQktfRk9STUFUXSwKKwkJCQkJICBjb3VudCk7CisJZWxzZQorCQljb3VudCA9IHNuZF93c3NfZ2V0X2NvdW50KGNoaXAtPmltYWdlW0NTNDIzMV9SRUNfRk9STUFUXSwKKwkJCQkJICBjb3VudCk7CisJY291bnQtLTsKKwlpZiAoY2hpcC0+c2luZ2xlX2RtYSAmJiBjaGlwLT5oYXJkd2FyZSAhPSBXU1NfSFdfSU5URVJXQVZFKSB7CisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9QTFlfTFdSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIGNvdW50KTsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1BMWV9VUFJfQ05ULAorCQkJICAgICh1bnNpZ25lZCBjaGFyKSAoY291bnQgPj4gOCkpOworCX0gZWxzZSB7CisJCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9SRUNfTFdSX0NOVCwgKHVuc2lnbmVkIGNoYXIpIGNvdW50KTsKKwkJc25kX3dzc19vdXQoY2hpcCwgQ1M0MjMxX1JFQ19VUFJfQ05ULAorCQkJICAgICh1bnNpZ25lZCBjaGFyKSAoY291bnQgPj4gOCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCit2b2lkIHNuZF93c3Nfb3ZlcnJhbmdlKHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciByZXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXMgPSBzbmRfd3NzX2luKGNoaXAsIENTNDIzMV9URVNUX0lOSVQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHJlcyAmICgweDA4IHwgMHgwMikpCS8qIGRldGVjdCBvdmVycmFuZ2Ugb25seSBhYm92ZSAwZEI7IG1heSBiZSB1c2VyIHNlbGVjdGFibGU/ICovCisJCWNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtLT5ydW50aW1lLT5vdmVycmFuZ2UrKzsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19vdmVycmFuZ2UpOworCitpcnFyZXR1cm5fdCBzbmRfd3NzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBkZXZfaWQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlpZiAoY2hpcC0+aGFyZHdhcmUgJiBXU1NfSFdfQUQxODQ4X01BU0spCisJCS8qIHByZXRlbmQgaXQgd2FzIHRoZSBvbmx5IHBvc3NpYmxlIGlycSBmb3IgQUQxODQ4ICovCisJCXN0YXR1cyA9IENTNDIzMV9QTEFZQkFDS19JUlE7CisJZWxzZQorCQlzdGF0dXMgPSBzbmRfd3NzX2luKGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgQ1M0MjMxX1RJTUVSX0lSUSkgeworCQlpZiAoY2hpcC0+dGltZXIpCisJCQlzbmRfdGltZXJfaW50ZXJydXB0KGNoaXAtPnRpbWVyLCBjaGlwLT50aW1lci0+c3RpY2tzKTsKKwl9CisJaWYgKGNoaXAtPnNpbmdsZV9kbWEgJiYgY2hpcC0+aGFyZHdhcmUgIT0gV1NTX0hXX0lOVEVSV0FWRSkgeworCQlpZiAoc3RhdHVzICYgQ1M0MjMxX1BMQVlCQUNLX0lSUSkgeworCQkJaWYgKGNoaXAtPm1vZGUgJiBXU1NfTU9ERV9QTEFZKSB7CisJCQkJaWYgKGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSkKKwkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pOworCQkJfQorCQkJaWYgKGNoaXAtPm1vZGUgJiBXU1NfTU9ERV9SRUNPUkQpIHsKKwkJCQlpZiAoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pIHsKKwkJCQkJc25kX3dzc19vdmVycmFuZ2UoY2hpcCk7CisJCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgJiBDUzQyMzFfUExBWUJBQ0tfSVJRKSB7CisJCQlpZiAoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKQorCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgQ1M0MjMxX1JFQ09SRF9JUlEpIHsKKwkJCWlmIChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSkgeworCQkJCXNuZF93c3Nfb3ZlcnJhbmdlKGNoaXApOworCQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pOworCQkJfQorCQl9CisJfQorCisJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJc3RhdHVzID0gfkNTNDIzMV9BTExfSVJRUyB8IH5zdGF0dXM7CisJaWYgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKQorCQl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOworCWVsc2UKKwkJc25kX3dzc19vdXRtKGNoaXAsIENTNDIzMV9JUlFfU1RBVFVTLCBzdGF0dXMsIDApOworCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTChzbmRfd3NzX2ludGVycnVwdCk7CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfd3NzX3BsYXliYWNrX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc2l6ZV90IHB0cjsKKworCWlmICghKGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmIENTNDIzMV9QTEFZQkFDS19FTkFCTEUpKQorCQlyZXR1cm4gMDsKKwlwdHIgPSBzbmRfZG1hX3BvaW50ZXIoY2hpcC0+ZG1hMSwgY2hpcC0+cF9kbWFfc2l6ZSk7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfd3NzX2NhcHR1cmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzaXplX3QgcHRyOworCisJaWYgKCEoY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdICYgQ1M0MjMxX1JFQ09SRF9FTkFCTEUpKQorCQlyZXR1cm4gMDsKKwlwdHIgPSBzbmRfZG1hX3BvaW50ZXIoY2hpcC0+ZG1hMiwgY2hpcC0+Y19kbWFfc2l6ZSk7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7Cit9CisKKy8qCisKKyAqLworCitzdGF0aWMgaW50IHNuZF9hZDE4NDhfcHJvYmUoc3RydWN0IHNuZF93c3MgKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHI7CisJdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUgPSAwOworCWludCBlcnIgPSAwOworCWludCBpOworCisJd2hpbGUgKHdzc19pbmIoY2hpcCwgQ1M0MjMxUChSRUdTRUwpKSAmIENTNDIzMV9JTklUKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCBDUzQyM3ggTU9ERSAxICovCisJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9NSVNDX0lORk8sIDApOworCisJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9SSUdIVF9JTlBVVCwgMHg0NSk7IC8qIDB4NTUgJiB+MHgxMCAqLworCXIgPSBzbmRfd3NzX2luKGNoaXAsIENTNDIzMV9SSUdIVF9JTlBVVCk7CisJaWYgKHIgIT0gMHg0NSkgeworCQkvKiBSTUdFIGFsd2F5cyBoaWdoIG9uIEFEMTg0NyAqLworCQlpZiAoKHIgJiB+Q1M0MjMxX0VOQUJMRV9NSUNfR0FJTikgIT0gMHg0NSkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWhhcmR3YXJlID0gV1NTX0hXX0FEMTg0NzsKKwl9IGVsc2UgeworCQlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX0xFRlRfSU5QVVQsICAweGFhKTsKKwkJciA9IHNuZF93c3NfaW4oY2hpcCwgQ1M0MjMxX0xFRlRfSU5QVVQpOworCQkvKiBML1JNR0UgYWx3YXlzIGxvdyBvbiBBVDIzMjAgKi8KKwkJaWYgKChyIHwgQ1M0MjMxX0VOQUJMRV9NSUNfR0FJTikgIT0gMHhhYSkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogY2xlYXIgcGVuZGluZyBJUlEgKi8KKwl3c3NfaW5iKGNoaXAsIENTNDIzMVAoU1RBVFVTKSk7CisJd3NzX291dGIoY2hpcCwgQ1M0MjMxUChTVEFUVVMpLCAwKTsKKwltYigpOworCisJaWYgKChjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19UWVBFX01BU0spICE9IFdTU19IV19ERVRFQ1QpCisJCWdvdG8gb3V0OworCisJaWYgKGhhcmR3YXJlKSB7CisJCWNoaXAtPmhhcmR3YXJlID0gaGFyZHdhcmU7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSBzbmRfd3NzX2luKGNoaXAsIENTNDIzMV9NSVNDX0lORk8pOworCisJLyogc2V0IENTNDIzeCBNT0RFIDIgKi8KKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX01JU0NfSU5GTywgQ1M0MjMxX01PREUyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoc25kX3dzc19pbihjaGlwLCBpKSAhPSBzbmRfd3NzX2luKGNoaXAsIDE2ICsgaSkpIHsKKwkJCS8qIHdlIGhhdmUgbW9yZSB0aGFuIDE2IHJlZ2lzdGVyczogY2hlY2sgSUQgKi8KKwkJCWlmICgociAmIDB4ZikgIT0gMHhhKQorCQkJCWdvdG8gb3V0X21vZGU7CisJCQkvKgorCQkJICogb24gQ01JODMzMCwgQ1M0MjMxX1ZFUlNJT04gaXMgdm9sdW1lIGNvbnRyb2wgYW5kCisJCQkgKiBjYW4gYmUgc2V0IHRvIDAKKwkJCSAqLworCQkJc25kX3dzc19kb3V0KGNoaXAsIENTNDIzMV9WRVJTSU9OLCAwKTsKKwkJCXIgPSBzbmRfd3NzX2luKGNoaXAsIENTNDIzMV9WRVJTSU9OKSAmIDB4ZTc7CisJCQlpZiAoIXIpCisJCQkJY2hpcC0+aGFyZHdhcmUgPSBXU1NfSFdfQ01JODMzMDsKKwkJCWdvdG8gb3V0X21vZGU7CisJCX0KKwl9CisJaWYgKHIgJiAweDgwKQorCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19DUzQyNDg7CisJZWxzZQorCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19BRDE4NDg7CitvdXRfbW9kZToKKwlzbmRfd3NzX2RvdXQoY2hpcCwgQ1M0MjMxX01JU0NfSU5GTywgMCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF93c3NfcHJvYmUoc3RydWN0IHNuZF93c3MgKmNoaXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgaWQsIHJldiwgcmVnbnVtOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBpbnQgaHc7CisKKwlpZCA9IHNuZF9hZDE4NDhfcHJvYmUoY2hpcCk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIGlkOworCisJaHcgPSBjaGlwLT5oYXJkd2FyZTsKKwlpZiAoKGh3ICYgV1NTX0hXX1RZUEVfTUFTSykgPT0gV1NTX0hXX0RFVEVDVCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQkJbWIoKTsKKwkJCWlmICh3c3NfaW5iKGNoaXAsIENTNDIzMVAoUkVHU0VMKSkgJiBDUzQyMzFfSU5JVCkKKwkJCQltc2xlZXAoMik7CisJCQllbHNlIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCQlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfTUlTQ19JTkZPLAorCQkJCQkgICAgQ1M0MjMxX01PREUyKTsKKwkJCQlpZCA9IHNuZF93c3NfaW4oY2hpcCwgQ1M0MjMxX01JU0NfSU5GTykgJiAweDBmOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJaWYgKGlkID09IDB4MGEpCisJCQkJCWJyZWFrOwkvKiB0aGlzIGlzIHZhbGlkIHZhbHVlICovCisJCQl9CisJCX0KKwkJc25kX3ByaW50ZGQoIndzczogcG9ydCA9IDB4JWx4LCBpZCA9IDB4JXhcbiIsIGNoaXAtPnBvcnQsIGlkKTsKKwkJaWYgKGlkICE9IDB4MGEpCisJCQlyZXR1cm4gLUVOT0RFVjsJLyogbm8gdmFsaWQgZGV2aWNlIGZvdW5kICovCisKKwkJcmV2ID0gc25kX3dzc19pbihjaGlwLCBDUzQyMzFfVkVSU0lPTikgJiAweGU3OworCQlzbmRfcHJpbnRkZCgiQ1M0MjMxOiBWRVJTSU9OIChJMjUpID0gMHgleFxuIiwgcmV2KTsKKwkJaWYgKHJldiA9PSAweDgwKSB7CisJCQl1bnNpZ25lZCBjaGFyIHRtcCA9IHNuZF93c3NfaW4oY2hpcCwgMjMpOworCQkJc25kX3dzc19vdXQoY2hpcCwgMjMsIH50bXApOworCQkJaWYgKHNuZF93c3NfaW4oY2hpcCwgMjMpICE9IHRtcCkKKwkJCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19BRDE4NDU7CisJCQllbHNlCisJCQkJY2hpcC0+aGFyZHdhcmUgPSBXU1NfSFdfQ1M0MjMxOworCQl9IGVsc2UgaWYgKHJldiA9PSAweGEwKSB7CisJCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19DUzQyMzFBOworCQl9IGVsc2UgaWYgKHJldiA9PSAweGEyKSB7CisJCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19DUzQyMzI7CisJCX0gZWxzZSBpZiAocmV2ID09IDB4YjIpIHsKKwkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzMkE7CisJCX0gZWxzZSBpZiAocmV2ID09IDB4ODMpIHsKKwkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzNjsKKwkJfSBlbHNlIGlmIChyZXYgPT0gMHgwMykgeworCQkJY2hpcC0+aGFyZHdhcmUgPSBXU1NfSFdfQ1M0MjM2QjsKKwkJfSBlbHNlIHsKKwkJCXNuZF9wcmludGsoInVua25vd24gQ1MgY2hpcCB3aXRoIHZlcnNpb24gMHgleFxuIiwgcmV2KTsKKwkJCXJldHVybiAtRU5PREVWOwkJLyogdW5rbm93biBDUzQyMzEgY2hpcD8gKi8KKwkJfQorCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl3c3NfaW5iKGNoaXAsIENTNDIzMVAoU1RBVFVTKSk7CS8qIGNsZWFyIGFueSBwZW5kaW5ncyBJUlEgKi8KKwl3c3Nfb3V0YihjaGlwLCBDUzQyMzFQKFNUQVRVUyksIDApOworCW1iKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCWlmICghKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKSkKKwkJY2hpcC0+aW1hZ2VbQ1M0MjMxX01JU0NfSU5GT10gPSBDUzQyMzFfTU9ERTI7CisJc3dpdGNoIChjaGlwLT5oYXJkd2FyZSkgeworCWNhc2UgV1NTX0hXX0lOVEVSV0FWRToKKwkJY2hpcC0+aW1hZ2VbQ1M0MjMxX01JU0NfSU5GT10gPSBDUzQyMzFfSVdfTU9ERTM7CisJCWJyZWFrOworCWNhc2UgV1NTX0hXX0NTNDIzNToKKwljYXNlIFdTU19IV19DUzQyMzZCOgorCWNhc2UgV1NTX0hXX0NTNDIzN0I6CisJY2FzZSBXU1NfSFdfQ1M0MjM4QjoKKwljYXNlIFdTU19IV19DUzQyMzk6CisJCWlmIChodyA9PSBXU1NfSFdfREVURUNUMykKKwkJCWNoaXAtPmltYWdlW0NTNDIzMV9NSVNDX0lORk9dID0gQ1M0MjMxXzQyMzZfTU9ERTM7CisJCWVsc2UKKwkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzNjsKKwkJYnJlYWs7CisJfQorCisJY2hpcC0+aW1hZ2VbQ1M0MjMxX0lGQUNFX0NUUkxdID0KKwkgICAgKGNoaXAtPmltYWdlW0NTNDIzMV9JRkFDRV9DVFJMXSAmIH5DUzQyMzFfU0lOR0xFX0RNQSkgfAorCSAgICAoY2hpcC0+c2luZ2xlX2RtYSA/IENTNDIzMV9TSU5HTEVfRE1BIDogMCk7CisJaWYgKGNoaXAtPmhhcmR3YXJlICE9IFdTU19IV19PUFRJOTNYKSB7CisJCWNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8xXSA9IDB4ODA7CisJCWNoaXAtPmltYWdlW0NTNDIzMV9BTFRfRkVBVFVSRV8yXSA9CisJCQljaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfSU5URVJXQVZFID8gMHhjMiA6IDB4MDE7CisJfQorCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopICZjaGlwLT5pbWFnZTsKKwlyZWdudW0gPSAoY2hpcC0+aGFyZHdhcmUgJiBXU1NfSFdfQUQxODQ4X01BU0spID8gMTYgOiAzMjsKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCByZWdudW07IGkrKykJLyogb2suLiBmaWxsIGFsbCByZWdpc3RlcnMgKi8KKwkJc25kX3dzc19vdXQoY2hpcCwgaSwgKnB0cisrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXNuZF93c3NfbWNlX3VwKGNoaXApOworCXNuZF93c3NfbWNlX2Rvd24oY2hpcCk7CisKKwltZGVsYXkoMik7CisKKwkvKiBvay4uIHRyeSBjaGVjayBoYXJkd2FyZSB2ZXJzaW9uIGZvciBDUzQyMzYrIGNoaXBzICovCisJaWYgKChodyAmIFdTU19IV19UWVBFX01BU0spID09IFdTU19IV19ERVRFQ1QpIHsKKwkJaWYgKGNoaXAtPmhhcmR3YXJlID09IFdTU19IV19DUzQyMzZCKSB7CisJCQlyZXYgPSBzbmRfY3M0MjM2X2V4dF9pbihjaGlwLCBDUzQyMzZfVkVSU0lPTik7CisJCQlzbmRfY3M0MjM2X2V4dF9vdXQoY2hpcCwgQ1M0MjM2X1ZFUlNJT04sIDB4ZmYpOworCQkJaWQgPSBzbmRfY3M0MjM2X2V4dF9pbihjaGlwLCBDUzQyMzZfVkVSU0lPTik7CisJCQlzbmRfY3M0MjM2X2V4dF9vdXQoY2hpcCwgQ1M0MjM2X1ZFUlNJT04sIHJldik7CisJCQlzbmRfcHJpbnRkZCgiQ1M0MjMxOiBleHQgdmVyc2lvbjsgcmV2ID0gMHgleCwgaWQgPSAweCV4XG4iLCByZXYsIGlkKTsKKwkJCWlmICgoaWQgJiAweDFmKSA9PSAweDFkKSB7CS8qIENTNDIzNSAqLworCQkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzNTsKKwkJCQlzd2l0Y2ggKGlkID4+IDUpIHsKKwkJCQljYXNlIDQ6CisJCQkJY2FzZSA1OgorCQkJCWNhc2UgNjoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzUgY2hpcCAoZW5oYW5jZWQgdmVyc2lvbiA9IDB4JXgpXG4iLCBpZCk7CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaWQgJiAweDFmKSA9PSAweDBiKSB7CS8qIENTNDIzNi9CICovCisJCQkJc3dpdGNoIChpZCA+PiA1KSB7CisJCQkJY2FzZSA0OgorCQkJCWNhc2UgNToKKwkJCQljYXNlIDY6CisJCQkJY2FzZSA3OgorCQkJCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19DUzQyMzZCOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzbmRfcHJpbnRrKCJ1bmtub3duIENTNDIzNiBjaGlwIChlbmhhbmNlZCB2ZXJzaW9uID0gMHgleClcbiIsIGlkKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKChpZCAmIDB4MWYpID09IDB4MDgpIHsJLyogQ1M0MjM3QiAqLworCQkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzN0I7CisJCQkJc3dpdGNoIChpZCA+PiA1KSB7CisJCQkJY2FzZSA0OgorCQkJCWNhc2UgNToKKwkJCQljYXNlIDY6CisJCQkJY2FzZSA3OgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzbmRfcHJpbnRrKCJ1bmtub3duIENTNDIzN0IgY2hpcCAoZW5oYW5jZWQgdmVyc2lvbiA9IDB4JXgpXG4iLCBpZCk7CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaWQgJiAweDFmKSA9PSAweDA5KSB7CS8qIENTNDIzOEIgKi8KKwkJCQljaGlwLT5oYXJkd2FyZSA9IFdTU19IV19DUzQyMzhCOworCQkJCXN3aXRjaCAoaWQgPj4gNSkgeworCQkJCWNhc2UgNToKKwkJCQljYXNlIDY6CisJCQkJY2FzZSA3OgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzbmRfcHJpbnRrKCJ1bmtub3duIENTNDIzOEIgY2hpcCAoZW5oYW5jZWQgdmVyc2lvbiA9IDB4JXgpXG4iLCBpZCk7CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaWQgJiAweDFmKSA9PSAweDFlKSB7CS8qIENTNDIzOSAqLworCQkJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0NTNDIzOTsKKwkJCQlzd2l0Y2ggKGlkID4+IDUpIHsKKwkJCQljYXNlIDQ6CisJCQkJY2FzZSA1OgorCQkJCWNhc2UgNjoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJc25kX3ByaW50aygidW5rbm93biBDUzQyMzkgY2hpcCAoZW5oYW5jZWQgdmVyc2lvbiA9IDB4JXgpXG4iLCBpZCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzbmRfcHJpbnRrKCJ1bmtub3duIENTNDIzNi9DUzQyM3hCIGNoaXAgKGVuaGFuY2VkIHZlcnNpb24gPSAweCV4KVxuIiwgaWQpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOwkJLyogYWxsIHRoaW5ncyBhcmUgb2suLiAqLworfQorCisvKgorCisgKi8KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF93c3NfcGxheWJhY2sgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JCShTTkRSVl9QQ01fRk1UQklUX01VX0xBVyB8IFNORFJWX1BDTV9GTVRCSVRfQV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0lNQV9BRFBDTSB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFKSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MTAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfd3NzX2NhcHR1cmUgPQoreworCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JCShTTkRSVl9QQ01fRk1UQklUX01VX0xBVyB8IFNORFJWX1BDTV9GTVRCSVRfQV9MQVcgfCBTTkRSVl9QQ01fRk1UQklUX0lNQV9BRFBDTSB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFKSwKKwkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLnJhdGVfbWluID0JCTU1MTAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPQkJMSwKKwkuY2hhbm5lbHNfbWF4ID0JCTIsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoMTI4KjEwMjQpLAorCS5wZXJpb2RzX21pbiA9CQkxLAorCS5wZXJpb2RzX21heCA9CQkxMDI0LAorCS5maWZvX3NpemUgPQkJMCwKK307CisKKy8qCisKKyAqLworCitzdGF0aWMgaW50IHNuZF93c3NfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlydW50aW1lLT5odyA9IHNuZF93c3NfcGxheWJhY2s7CisKKwkvKiBoYXJkd2FyZSBsaW1pdGF0aW9uIG9mIG9sZGVyIGNoaXBzZXRzICovCisJaWYgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKQorCQlydW50aW1lLT5ody5mb3JtYXRzICY9IH4oU05EUlZfUENNX0ZNVEJJVF9JTUFfQURQQ00gfAorCQkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUpOworCisJLyogaGFyZHdhcmUgYnVnIGluIEludGVyV2F2ZSBjaGlwc2V0ICovCisJaWYgKGNoaXAtPmhhcmR3YXJlID09IFdTU19IV19JTlRFUldBVkUgJiYgY2hpcC0+ZG1hMSA+IDMpCisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgJj0gflNORFJWX1BDTV9GTVRCSVRfTVVfTEFXOworCisJLyogaGFyZHdhcmUgbGltaXRhdGlvbiBvZiBjaGVhcCBjaGlwcyAqLworCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfQ1M0MjM1IHx8CisJICAgIGNoaXAtPmhhcmR3YXJlID09IFdTU19IV19DUzQyMzkpCisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1U4IHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEU7CisKKwlzbmRfcGNtX2xpbWl0X2lzYV9kbWFfc2l6ZShjaGlwLT5kbWExLCAmcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCk7CisJc25kX3BjbV9saW1pdF9pc2FfZG1hX3NpemUoY2hpcC0+ZG1hMSwgJnJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXgpOworCisJaWYgKGNoaXAtPmNsYWltX2RtYSkgeworCQlpZiAoKGVyciA9IGNoaXAtPmNsYWltX2RtYShjaGlwLCBjaGlwLT5kbWFfcHJpdmF0ZV9kYXRhLCBjaGlwLT5kbWExKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBzbmRfd3NzX29wZW4oY2hpcCwgV1NTX01PREVfUExBWSk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGNoaXAtPnJlbGVhc2VfZG1hKQorCQkJY2hpcC0+cmVsZWFzZV9kbWEoY2hpcCwgY2hpcC0+ZG1hX3ByaXZhdGVfZGF0YSwgY2hpcC0+ZG1hMSk7CisJCXNuZF9mcmVlX3BhZ2VzKHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCWNoaXAtPnJhdGVfY29uc3RyYWludChydW50aW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfd3NzX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCBlcnI7CisKKwlydW50aW1lLT5odyA9IHNuZF93c3NfY2FwdHVyZTsKKworCS8qIGhhcmR3YXJlIGxpbWl0YXRpb24gb2Ygb2xkZXIgY2hpcHNldHMgKi8KKwlpZiAoY2hpcC0+aGFyZHdhcmUgJiBXU1NfSFdfQUQxODQ4X01BU0spCisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgJj0gfihTTkRSVl9QQ01fRk1UQklUX0lNQV9BRFBDTSB8CisJCQkJCSBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSk7CisKKwkvKiBoYXJkd2FyZSBsaW1pdGF0aW9uIG9mIGNoZWFwIGNoaXBzICovCisJaWYgKGNoaXAtPmhhcmR3YXJlID09IFdTU19IV19DUzQyMzUgfHwKKwkgICAgY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX0NTNDIzOSB8fAorCSAgICBjaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfT1BUSTkzWCkKKwkJcnVudGltZS0+aHcuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfVTggfAorCQkJCSAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFOworCisJc25kX3BjbV9saW1pdF9pc2FfZG1hX3NpemUoY2hpcC0+ZG1hMiwgJnJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOworCXNuZF9wY21fbGltaXRfaXNhX2RtYV9zaXplKGNoaXAtPmRtYTIsICZydW50aW1lLT5ody5wZXJpb2RfYnl0ZXNfbWF4KTsKKworCWlmIChjaGlwLT5jbGFpbV9kbWEpIHsKKwkJaWYgKChlcnIgPSBjaGlwLT5jbGFpbV9kbWEoY2hpcCwgY2hpcC0+ZG1hX3ByaXZhdGVfZGF0YSwgY2hpcC0+ZG1hMikpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gc25kX3dzc19vcGVuKGNoaXAsIFdTU19NT0RFX1JFQ09SRCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGNoaXAtPnJlbGVhc2VfZG1hKQorCQkJY2hpcC0+cmVsZWFzZV9kbWEoY2hpcCwgY2hpcC0+ZG1hX3ByaXZhdGVfZGF0YSwgY2hpcC0+ZG1hMik7CisJCXNuZF9mcmVlX3BhZ2VzKHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCQlyZXR1cm4gZXJyOworCX0KKwljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CisJY2hpcC0+cmF0ZV9jb25zdHJhaW50KHJ1bnRpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF93c3NfcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwljaGlwLT5wbGF5YmFja19zdWJzdHJlYW0gPSBOVUxMOworCXNuZF93c3NfY2xvc2UoY2hpcCwgV1NTX01PREVfUExBWSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc19jYXB0dXJlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBOVUxMOworCXNuZF93c3NfY2xvc2UoY2hpcCwgV1NTX01PREVfUkVDT1JEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3dzc190aGlua3BhZF90d2lkZGxlKHN0cnVjdCBzbmRfd3NzICpjaGlwLCBpbnQgb24pCit7CisJaW50IHRtcDsKKworCWlmICghY2hpcC0+dGhpbmtwYWRfZmxhZykKKwkJcmV0dXJuOworCisJb3V0YigweDFjLCBBRDE4NDhfVEhJTktQQURfQ1RMX1BPUlQxKTsKKwl0bXAgPSBpbmIoQUQxODQ4X1RISU5LUEFEX0NUTF9QT1JUMik7CisKKwlpZiAob24pCisJCS8qIHR1cm4gaXQgb24gKi8KKwkJdG1wIHw9IEFEMTg0OF9USElOS1BBRF9DUzQyNDhfRU5BQkxFX0JJVDsKKwllbHNlCisJCS8qIHR1cm4gaXQgb2ZmICovCisJCXRtcCAmPSB+QUQxODQ4X1RISU5LUEFEX0NTNDI0OF9FTkFCTEVfQklUOworCisJb3V0Yih0bXAsIEFEMTg0OF9USElOS1BBRF9DVExfUE9SVDIpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIGxvd2xldmVsIHN1c3BlbmQgY2FsbGJhY2sgZm9yIENTNDIzMSAqLworc3RhdGljIHZvaWQgc25kX3dzc19zdXNwZW5kKHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCWludCByZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IDMyOyByZWcrKykKKwkJY2hpcC0+aW1hZ2VbcmVnXSA9IHNuZF93c3NfaW4oY2hpcCwgcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChjaGlwLT50aGlua3BhZF9mbGFnKQorCQlzbmRfd3NzX3RoaW5rcGFkX3R3aWRkbGUoY2hpcCwgMCk7Cit9CisKKy8qIGxvd2xldmVsIHJlc3VtZSBjYWxsYmFjayBmb3IgQ1M0MjMxICovCitzdGF0aWMgdm9pZCBzbmRfd3NzX3Jlc3VtZShzdHJ1Y3Qgc25kX3dzcyAqY2hpcCkKK3sKKwlpbnQgcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogaW50IHRpbWVvdXQ7ICovCisKKwlpZiAoY2hpcC0+dGhpbmtwYWRfZmxhZykKKwkJc25kX3dzc190aGlua3BhZF90d2lkZGxlKGNoaXAsIDEpOworCXNuZF93c3NfbWNlX3VwKGNoaXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWZvciAocmVnID0gMDsgcmVnIDwgMzI7IHJlZysrKSB7CisJCXN3aXRjaCAocmVnKSB7CisJCWNhc2UgQ1M0MjMxX1ZFUlNJT046CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNuZF93c3Nfb3V0KGNoaXAsIHJlZywgY2hpcC0+aW1hZ2VbcmVnXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworI2lmIDEKKwlzbmRfd3NzX21jZV9kb3duKGNoaXApOworI2Vsc2UKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGEgd29ya2Fyb3VuZCB0byBhdm9pZCBmcmVlemUgYWZ0ZXIgcmVzdW1lIG9uIFRQNjAwRS4KKwkgICBUaGlzIGlzIHRoZSBmaXJzdCBoYWxmIG9mIGNvcHkgb2Ygc25kX3dzc19tY2VfZG93bigpLCBidXQgZG9lc24ndAorCSAgIGluY2x1ZGUgcmVzY2hlZHVsaW5nLiAgLS0gaXdhaQorCSAgICovCisJc25kX3dzc19idXN5X3dhaXQoY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJY2hpcC0+bWNlX2JpdCAmPSB+Q1M0MjMxX01DRTsKKwl0aW1lb3V0ID0gd3NzX2luYihjaGlwLCBDUzQyMzFQKFJFR1NFTCkpOworCXdzc19vdXRiKGNoaXAsIENTNDIzMVAoUkVHU0VMKSwgY2hpcC0+bWNlX2JpdCB8ICh0aW1lb3V0ICYgMHgxZikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHRpbWVvdXQgPT0gMHg4MCkKKwkJc25kX3ByaW50aygiZG93biBbMHglbHhdOiBzZXJpb3VzIGluaXQgcHJvYmxlbSAtIGNvZGVjIHN0aWxsIGJ1c3lcbiIsIGNoaXAtPnBvcnQpOworCWlmICgodGltZW91dCAmIENTNDIzMV9NQ0UpID09IDAgfHwKKwkgICAgIShjaGlwLT5oYXJkd2FyZSAmIChXU1NfSFdfQ1M0MjMxX01BU0sgfCBXU1NfSFdfQ1M0MjMyX01BU0spKSkgeworCQlyZXR1cm47CisJfQorCXNuZF93c3NfYnVzeV93YWl0KGNoaXApOworI2VuZGlmCit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBpbnQgc25kX3dzc19mcmVlKHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX3BvcnQpOworCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX2Nwb3J0KTsKKwlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJZGlzYWJsZV9pcnEoY2hpcC0+aXJxKTsKKwkJaWYgKCEoY2hpcC0+aHdzaGFyZSAmIFdTU19IV1NIQVJFX0lSUSkpCisJCQlmcmVlX2lycShjaGlwLT5pcnEsICh2b2lkICopIGNoaXApOworCX0KKwlpZiAoIShjaGlwLT5od3NoYXJlICYgV1NTX0hXU0hBUkVfRE1BMSkgJiYgY2hpcC0+ZG1hMSA+PSAwKSB7CisJCXNuZF9kbWFfZGlzYWJsZShjaGlwLT5kbWExKTsKKwkJZnJlZV9kbWEoY2hpcC0+ZG1hMSk7CisJfQorCWlmICghKGNoaXAtPmh3c2hhcmUgJiBXU1NfSFdTSEFSRV9ETUEyKSAmJgorCSAgICBjaGlwLT5kbWEyID49IDAgJiYgY2hpcC0+ZG1hMiAhPSBjaGlwLT5kbWExKSB7CisJCXNuZF9kbWFfZGlzYWJsZShjaGlwLT5kbWEyKTsKKwkJZnJlZV9kbWEoY2hpcC0+ZG1hMik7CisJfQorCWlmIChjaGlwLT50aW1lcikKKwkJc25kX2RldmljZV9mcmVlKGNoaXAtPmNhcmQsIGNoaXAtPnRpbWVyKTsKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfd3NzX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCXJldHVybiBzbmRfd3NzX2ZyZWUoY2hpcCk7Cit9CisKK2NvbnN0IGNoYXIgKnNuZF93c3NfY2hpcF9pZChzdHJ1Y3Qgc25kX3dzcyAqY2hpcCkKK3sKKwlzd2l0Y2ggKGNoaXAtPmhhcmR3YXJlKSB7CisJY2FzZSBXU1NfSFdfQ1M0MjMxOgorCQlyZXR1cm4gIkNTNDIzMSI7CisJY2FzZSBXU1NfSFdfQ1M0MjMxQToKKwkJcmV0dXJuICJDUzQyMzFBIjsKKwljYXNlIFdTU19IV19DUzQyMzI6CisJCXJldHVybiAiQ1M0MjMyIjsKKwljYXNlIFdTU19IV19DUzQyMzJBOgorCQlyZXR1cm4gIkNTNDIzMkEiOworCWNhc2UgV1NTX0hXX0NTNDIzNToKKwkJcmV0dXJuICJDUzQyMzUiOworCWNhc2UgV1NTX0hXX0NTNDIzNjoKKwkJcmV0dXJuICJDUzQyMzYiOworCWNhc2UgV1NTX0hXX0NTNDIzNkI6CisJCXJldHVybiAiQ1M0MjM2QiI7CisJY2FzZSBXU1NfSFdfQ1M0MjM3QjoKKwkJcmV0dXJuICJDUzQyMzdCIjsKKwljYXNlIFdTU19IV19DUzQyMzhCOgorCQlyZXR1cm4gIkNTNDIzOEIiOworCWNhc2UgV1NTX0hXX0NTNDIzOToKKwkJcmV0dXJuICJDUzQyMzkiOworCWNhc2UgV1NTX0hXX0lOVEVSV0FWRToKKwkJcmV0dXJuICJBTUQgSW50ZXJXYXZlIjsKKwljYXNlIFdTU19IV19PUEwzU0EyOgorCQlyZXR1cm4gY2hpcC0+Y2FyZC0+c2hvcnRuYW1lOworCWNhc2UgV1NTX0hXX0FEMTg0NToKKwkJcmV0dXJuICJBRDE4NDUiOworCWNhc2UgV1NTX0hXX09QVEk5M1g6CisJCXJldHVybiAiT1BUaSA5M3giOworCWNhc2UgV1NTX0hXX0FEMTg0NzoKKwkJcmV0dXJuICJBRDE4NDciOworCWNhc2UgV1NTX0hXX0FEMTg0ODoKKwkJcmV0dXJuICJBRDE4NDgiOworCWNhc2UgV1NTX0hXX0NTNDI0ODoKKwkJcmV0dXJuICJDUzQyNDgiOworCWNhc2UgV1NTX0hXX0NNSTgzMzA6CisJCXJldHVybiAiQ01JODMzMC9DM0QiOworCWRlZmF1bHQ6CisJCXJldHVybiAiPz8/IjsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfY2hpcF9pZCk7CisKK3N0YXRpYyBpbnQgc25kX3dzc19uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkJICB1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSwKKwkJCSAgdW5zaWduZWQgc2hvcnQgaHdzaGFyZSwKKwkJCSAgc3RydWN0IHNuZF93c3MgKipyY2hpcCkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcDsKKworCSpyY2hpcCA9IE5VTEw7CisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2hpcC0+aGFyZHdhcmUgPSBoYXJkd2FyZTsKKwljaGlwLT5od3NoYXJlID0gaHdzaGFyZTsKKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7CisJbXV0ZXhfaW5pdCgmY2hpcC0+bWNlX211dGV4KTsKKwltdXRleF9pbml0KCZjaGlwLT5vcGVuX211dGV4KTsKKwljaGlwLT5jYXJkID0gY2FyZDsKKwljaGlwLT5yYXRlX2NvbnN0cmFpbnQgPSBzbmRfd3NzX3hyYXRlOworCWNoaXAtPnNldF9wbGF5YmFja19mb3JtYXQgPSBzbmRfd3NzX3BsYXliYWNrX2Zvcm1hdDsKKwljaGlwLT5zZXRfY2FwdHVyZV9mb3JtYXQgPSBzbmRfd3NzX2NhcHR1cmVfZm9ybWF0OworCWlmIChjaGlwLT5oYXJkd2FyZSA9PSBXU1NfSFdfT1BUSTkzWCkKKwkJbWVtY3B5KCZjaGlwLT5pbWFnZSwgJnNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlLAorCQkgICAgICAgc2l6ZW9mKHNuZF9vcHRpOTN4X29yaWdpbmFsX2ltYWdlKSk7CisJZWxzZQorCQltZW1jcHkoJmNoaXAtPmltYWdlLCAmc25kX3dzc19vcmlnaW5hbF9pbWFnZSwKKwkJICAgICAgIHNpemVvZihzbmRfd3NzX29yaWdpbmFsX2ltYWdlKSk7CisJaWYgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0FEMTg0OF9NQVNLKSB7CisJCWNoaXAtPmltYWdlW0NTNDIzMV9QSU5fQ1RSTF0gPSAwOworCQljaGlwLT5pbWFnZVtDUzQyMzFfVEVTVF9JTklUXSA9IDA7CisJfQorCisJKnJjaGlwID0gY2hpcDsKKwlyZXR1cm4gMDsKK30KKworaW50IHNuZF93c3NfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwb3J0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNwb3J0LAorCQkgICAgICBpbnQgaXJxLCBpbnQgZG1hMSwgaW50IGRtYTIsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBod3NoYXJlLAorCQkgICAgICBzdHJ1Y3Qgc25kX3dzcyAqKnJjaGlwKQoreworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0geworCQkuZGV2X2ZyZWUgPQlzbmRfd3NzX2Rldl9mcmVlLAorCX07CisJc3RydWN0IHNuZF93c3MgKmNoaXA7CisJaW50IGVycjsKKworCWVyciA9IHNuZF93c3NfbmV3KGNhcmQsIGhhcmR3YXJlLCBod3NoYXJlLCAmY2hpcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwljaGlwLT5pcnEgPSAtMTsKKwljaGlwLT5kbWExID0gLTE7CisJY2hpcC0+ZG1hMiA9IC0xOworCisJY2hpcC0+cmVzX3BvcnQgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCA0LCAiV1NTIik7CisJaWYgKCFjaGlwLT5yZXNfcG9ydCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3c3M6IGNhbid0IGdyYWIgcG9ydCAweCVseFxuIiwgcG9ydCk7CisJCXNuZF93c3NfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+cG9ydCA9IHBvcnQ7CisJaWYgKChsb25nKWNwb3J0ID49IDApIHsKKwkJY2hpcC0+cmVzX2Nwb3J0ID0gcmVxdWVzdF9yZWdpb24oY3BvcnQsIDgsICJDUzQyMzIgQ29udHJvbCIpOworCQlpZiAoIWNoaXAtPnJlc19jcG9ydCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQkJCSJ3c3M6IGNhbid0IGdyYWIgY29udHJvbCBwb3J0IDB4JWx4XG4iLCBjcG9ydCk7CisJCQlzbmRfd3NzX2ZyZWUoY2hpcCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwljaGlwLT5jcG9ydCA9IGNwb3J0OworCWlmICghKGh3c2hhcmUgJiBXU1NfSFdTSEFSRV9JUlEpKQorCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfd3NzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJCQkiV1NTIiwgKHZvaWQgKikgY2hpcCkpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIndzczogY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIGlycSk7CisJCQlzbmRfd3NzX2ZyZWUoY2hpcCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJY2hpcC0+aXJxID0gaXJxOworCWlmICghKGh3c2hhcmUgJiBXU1NfSFdTSEFSRV9ETUExKSAmJiByZXF1ZXN0X2RtYShkbWExLCAiV1NTIC0gMSIpKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIndzczogY2FuJ3QgZ3JhYiBETUExICVkXG4iLCBkbWExKTsKKwkJc25kX3dzc19mcmVlKGNoaXApOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGlwLT5kbWExID0gZG1hMTsKKwlpZiAoIShod3NoYXJlICYgV1NTX0hXU0hBUkVfRE1BMikgJiYgZG1hMSAhPSBkbWEyICYmCisJICAgICAgZG1hMiA+PSAwICYmIHJlcXVlc3RfZG1hKGRtYTIsICJXU1MgLSAyIikpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAid3NzOiBjYW4ndCBncmFiIERNQTIgJWRcbiIsIGRtYTIpOworCQlzbmRfd3NzX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChkbWExID09IGRtYTIgfHwgZG1hMiA8IDApIHsKKwkJY2hpcC0+c2luZ2xlX2RtYSA9IDE7CisJCWNoaXAtPmRtYTIgPSBjaGlwLT5kbWExOworCX0gZWxzZQorCQljaGlwLT5kbWEyID0gZG1hMjsKKworCWlmIChoYXJkd2FyZSA9PSBXU1NfSFdfVEhJTktQQUQpIHsKKwkJY2hpcC0+dGhpbmtwYWRfZmxhZyA9IDE7CisJCWNoaXAtPmhhcmR3YXJlID0gV1NTX0hXX0RFVEVDVDsgLyogcmVzZXQgKi8KKwkJc25kX3dzc190aGlua3BhZF90d2lkZGxlKGNoaXAsIDEpOworCX0KKworCS8qIGdsb2JhbCBzZXR1cCAqLworCWlmIChzbmRfd3NzX3Byb2JlKGNoaXApIDwgMCkgeworCQlzbmRfd3NzX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlzbmRfd3NzX2luaXQoY2hpcCk7CisKKyNpZiAwCisJaWYgKGNoaXAtPmhhcmR3YXJlICYgV1NTX0hXX0NTNDIzMl9NQVNLKSB7CisJCWlmIChjaGlwLT5yZXNfY3BvcnQgPT0gTlVMTCkKKwkJCXNuZF9wcmludGsoIkNTNDIzMiBjb250cm9sIHBvcnQgZmVhdHVyZXMgYXJlIG5vdCBhY2Nlc3NpYmxlXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIFJlZ2lzdGVyIGRldmljZSAqLworCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcyk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX3dzc19mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworI2lmZGVmIENPTkZJR19QTQorCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKwljaGlwLT5zdXNwZW5kID0gc25kX3dzc19zdXNwZW5kOworCWNoaXAtPnJlc3VtZSA9IHNuZF93c3NfcmVzdW1lOworI2VuZGlmCisKKwkqcmNoaXAgPSBjaGlwOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzbmRfd3NzX2NyZWF0ZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3dzc19wbGF5YmFja19vcHMgPSB7CisJLm9wZW4gPQkJc25kX3dzc19wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF93c3NfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF93c3NfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX3dzc19wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3dzc19wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3dzc190cmlnZ2VyLAorCS5wb2ludGVyID0Jc25kX3dzc19wbGF5YmFja19wb2ludGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfd3NzX2NhcHR1cmVfb3BzID0geworCS5vcGVuID0JCXNuZF93c3NfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9CXNuZF93c3NfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0Jc25kX3dzc19jYXB0dXJlX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF93c3NfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX3dzc19jYXB0dXJlX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfd3NzX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfd3NzX2NhcHR1cmVfcG9pbnRlciwKK307CisKK2ludCBzbmRfd3NzX3BjbShzdHJ1Y3Qgc25kX3dzcyAqY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF9wY20gKipycGNtKQoreworCXN0cnVjdCBzbmRfcGNtICpwY207CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJXU1MiLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF93c3NfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfd3NzX2NhcHR1cmVfb3BzKTsKKworCS8qIGdsb2JhbCBzZXR1cCAqLworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCWlmIChjaGlwLT5zaW5nbGVfZG1hKQorCQlwY20tPmluZm9fZmxhZ3MgfD0gU05EUlZfUENNX0lORk9fSEFMRl9EVVBMRVg7CisJaWYgKGNoaXAtPmhhcmR3YXJlICE9IFdTU19IV19JTlRFUldBVkUpCisJCXBjbS0+aW5mb19mbGFncyB8PSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CisJc3RyY3B5KHBjbS0+bmFtZSwgc25kX3dzc19jaGlwX2lkKGNoaXApKTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCQkJCSAgICAgIHNuZF9kbWFfaXNhX2RhdGEoKSwKKwkJCQkJICAgICAgNjQqMTAyNCwgY2hpcC0+ZG1hMSA+IDMgfHwgY2hpcC0+ZG1hMiA+IDMgPyAxMjgqMTAyNCA6IDY0KjEwMjQpOworCisJY2hpcC0+cGNtID0gcGNtOworCWlmIChycGNtKQorCQkqcnBjbSA9IHBjbTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19wY20pOworCitzdGF0aWMgdm9pZCBzbmRfd3NzX3RpbWVyX2ZyZWUoc3RydWN0IHNuZF90aW1lciAqdGltZXIpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSB0aW1lci0+cHJpdmF0ZV9kYXRhOworCWNoaXAtPnRpbWVyID0gTlVMTDsKK30KKworaW50IHNuZF93c3NfdGltZXIoc3RydWN0IHNuZF93c3MgKmNoaXAsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfdGltZXIgKipydGltZXIpCit7CisJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CisJc3RydWN0IHNuZF90aW1lcl9pZCB0aWQ7CisJaW50IGVycjsKKworCS8qIFRpbWVyIGluaXRpYWxpemF0aW9uICovCisJdGlkLmRldl9jbGFzcyA9IFNORFJWX1RJTUVSX0NMQVNTX0NBUkQ7CisJdGlkLmRldl9zY2xhc3MgPSBTTkRSVl9USU1FUl9TQ0xBU1NfTk9ORTsKKwl0aWQuY2FyZCA9IGNoaXAtPmNhcmQtPm51bWJlcjsKKwl0aWQuZGV2aWNlID0gZGV2aWNlOworCXRpZC5zdWJkZXZpY2UgPSAwOworCWlmICgoZXJyID0gc25kX3RpbWVyX25ldyhjaGlwLT5jYXJkLCAiQ1M0MjMxIiwgJnRpZCwgJnRpbWVyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXN0cmNweSh0aW1lci0+bmFtZSwgc25kX3dzc19jaGlwX2lkKGNoaXApKTsKKwl0aW1lci0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwl0aW1lci0+cHJpdmF0ZV9mcmVlID0gc25kX3dzc190aW1lcl9mcmVlOworCXRpbWVyLT5odyA9IHNuZF93c3NfdGltZXJfdGFibGU7CisJY2hpcC0+dGltZXIgPSB0aW1lcjsKKwlpZiAocnRpbWVyKQorCQkqcnRpbWVyID0gdGltZXI7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfdGltZXIpOworCisvKgorICogIE1JWEVSIHBhcnQKKyAqLworCitzdGF0aWMgaW50IHNuZF93c3NfaW5mb19tdXgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7CisJCSJMaW5lIiwgIkF1eCIsICJNaWMiLCAiTWl4IgorCX07CisJc3RhdGljIGNoYXIgKm9wbDNzYV90ZXh0c1s0XSA9IHsKKwkJIkxpbmUiLCAiQ0QiLCAiTWljIiwgIk1peCIKKwl9OworCXN0YXRpYyBjaGFyICpndXNtYXhfdGV4dHNbNF0gPSB7CisJCSJMaW5lIiwgIlN5bnRoIiwgIk1pYyIsICJNaXgiCisJfTsKKwljaGFyICoqcHRleHRzID0gdGV4dHM7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAoc25kX0JVR19PTighY2hpcC0+Y2FyZCkpCisJCXJldHVybiAtRUlOVkFMOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSA0OworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDM7CisJaWYgKCFzdHJjbXAoY2hpcC0+Y2FyZC0+ZHJpdmVyLCAiR1VTIE1BWCIpKQorCQlwdGV4dHMgPSBndXNtYXhfdGV4dHM7CisJc3dpdGNoIChjaGlwLT5oYXJkd2FyZSkgeworCWNhc2UgV1NTX0hXX0lOVEVSV0FWRToKKwkJcHRleHRzID0gZ3VzbWF4X3RleHRzOworCQlicmVhazsKKwljYXNlIFdTU19IV19PUEwzU0EyOgorCQlwdGV4dHMgPSBvcGwzc2FfdGV4dHM7CisJCWJyZWFrOworCX0KKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgcHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfd3NzX2dldF9tdXgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IChjaGlwLT5pbWFnZVtDUzQyMzFfTEVGVF9JTlBVVF0gJiBDUzQyMzFfTUlYU19BTEwpID4+IDY7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9IChjaGlwLT5pbWFnZVtDUzQyMzFfUklHSFRfSU5QVVRdICYgQ1M0MjMxX01JWFNfQUxMKSA+PiA2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3dzc19wdXRfbXV4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBsZWZ0LCByaWdodDsKKwlpbnQgY2hhbmdlOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiAzIHx8CisJICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsZWZ0ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCA2OworCXJpZ2h0ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA8PCA2OworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWxlZnQgPSAoY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfSU5QVVRdICYgfkNTNDIzMV9NSVhTX0FMTCkgfCBsZWZ0OworCXJpZ2h0ID0gKGNoaXAtPmltYWdlW0NTNDIzMV9SSUdIVF9JTlBVVF0gJiB+Q1M0MjMxX01JWFNfQUxMKSB8IHJpZ2h0OworCWNoYW5nZSA9IGxlZnQgIT0gY2hpcC0+aW1hZ2VbQ1M0MjMxX0xFRlRfSU5QVVRdIHx8CisJCSByaWdodCAhPSBjaGlwLT5pbWFnZVtDUzQyMzFfUklHSFRfSU5QVVRdOworCXNuZF93c3Nfb3V0KGNoaXAsIENTNDIzMV9MRUZUX0lOUFVULCBsZWZ0KTsKKwlzbmRfd3NzX291dChjaGlwLCBDUzQyMzFfUklHSFRfSU5QVVQsIHJpZ2h0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXJldHVybiBjaGFuZ2U7Cit9CisKK2ludCBzbmRfd3NzX2luZm9fc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCisJdWluZm8tPnR5cGUgPSBtYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IG1hc2s7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfaW5mb19zaW5nbGUpOworCitpbnQgc25kX3dzc19nZXRfc2luZ2xlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF93c3MgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChjaGlwLT5pbWFnZVtyZWddID4+IHNoaWZ0KSAmIG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW52ZXJ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19nZXRfc2luZ2xlKTsKKworaW50IHNuZF93c3NfcHV0X3NpbmdsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfd3NzICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweGZmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl2YWwgPDw9IHNoaWZ0OworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXZhbCA9IChjaGlwLT5pbWFnZVtyZWddICYgfihtYXNrIDw8IHNoaWZ0KSkgfCB2YWw7CisJY2hhbmdlID0gdmFsICE9IGNoaXAtPmltYWdlW3JlZ107CisJc25kX3dzc19vdXQoY2hpcCwgcmVnLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5nZTsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19wdXRfc2luZ2xlKTsKKworaW50IHNuZF93c3NfaW5mb19kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisKKwl1aW5mby0+dHlwZSA9IG1hc2sgPT0gMSA/IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTiA6IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gbWFzazsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19pbmZvX2RvdWJsZSk7CisKK2ludCBzbmRfd3NzX2dldF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAoY2hpcC0+aW1hZ2VbbGVmdF9yZWddID4+IHNoaWZ0X2xlZnQpICYgbWFzazsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChjaGlwLT5pbWFnZVtyaWdodF9yZWddID4+IHNoaWZ0X3JpZ2h0KSAmIG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW52ZXJ0KSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfZ2V0X2RvdWJsZSk7CisKK2ludCBzbmRfd3NzX3B1dF9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3dzcyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsZWZ0X3JlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmlnaHRfcmVnID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHhmZjsKKwlpbnQgc2hpZnRfbGVmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDA3OworCWludCBzaGlmdF9yaWdodCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxOSkgJiAweDA3OworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMikgJiAxOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgdmFsMSwgdmFsMjsKKworCXZhbDEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2s7CisJdmFsMiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzazsKKwlpZiAoaW52ZXJ0KSB7CisJCXZhbDEgPSBtYXNrIC0gdmFsMTsKKwkJdmFsMiA9IG1hc2sgLSB2YWwyOworCX0KKwl2YWwxIDw8PSBzaGlmdF9sZWZ0OworCXZhbDIgPDw9IHNoaWZ0X3JpZ2h0OworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChsZWZ0X3JlZyAhPSByaWdodF9yZWcpIHsKKwkJdmFsMSA9IChjaGlwLT5pbWFnZVtsZWZ0X3JlZ10gJiB+KG1hc2sgPDwgc2hpZnRfbGVmdCkpIHwgdmFsMTsKKwkJdmFsMiA9IChjaGlwLT5pbWFnZVtyaWdodF9yZWddICYgfihtYXNrIDw8IHNoaWZ0X3JpZ2h0KSkgfCB2YWwyOworCQljaGFuZ2UgPSB2YWwxICE9IGNoaXAtPmltYWdlW2xlZnRfcmVnXSB8fAorCQkJIHZhbDIgIT0gY2hpcC0+aW1hZ2VbcmlnaHRfcmVnXTsKKwkJc25kX3dzc19vdXQoY2hpcCwgbGVmdF9yZWcsIHZhbDEpOworCQlzbmRfd3NzX291dChjaGlwLCByaWdodF9yZWcsIHZhbDIpOworCX0gZWxzZSB7CisJCW1hc2sgPSAobWFzayA8PCBzaGlmdF9sZWZ0KSB8IChtYXNrIDw8IHNoaWZ0X3JpZ2h0KTsKKwkJdmFsMSA9IChjaGlwLT5pbWFnZVtsZWZ0X3JlZ10gJiB+bWFzaykgfCB2YWwxIHwgdmFsMjsKKwkJY2hhbmdlID0gdmFsMSAhPSBjaGlwLT5pbWFnZVtsZWZ0X3JlZ107CisJCXNuZF93c3Nfb3V0KGNoaXAsIGxlZnRfcmVnLCB2YWwxKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTChzbmRfd3NzX3B1dF9kb3VibGUpOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdCwgLTk0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcmVjX2dhaW4sIDAsIDE1MCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWQxODQ4X2NvbnRyb2xzW10gPSB7CitXU1NfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMCwgQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULAorCSAgIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRV9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAwLAorCSAgICAgICBDUzQyMzFfTEVGVF9PVVRQVVQsIENTNDIzMV9SSUdIVF9PVVRQVVQsIDAsIDAsIDYzLCAxLAorCSAgICAgICBkYl9zY2FsZV82Yml0KSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCSAgIENTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEVfVExWKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkgICAgICAgQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxLAorCSAgICAgICBkYl9zY2FsZV81Yml0XzEyZGJfbWF4KSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLAorCSAgIENTNDIzMV9BVVgyX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgyX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEVfVExWKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMSwKKwkgICAgICAgQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxLAorCSAgICAgICBkYl9zY2FsZV81Yml0XzEyZGJfbWF4KSwKK1dTU19ET1VCTEVfVExWKCJDYXB0dXJlIFZvbHVtZSIsIDAsIENTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsCisJCTAsIDAsIDE1LCAwLCBkYl9zY2FsZV9yZWNfZ2FpbiksCit7CisJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5pbmZvID0gc25kX3dzc19pbmZvX211eCwKKwkuZ2V0ID0gc25kX3dzc19nZXRfbXV4LAorCS5wdXQgPSBzbmRfd3NzX3B1dF9tdXgsCit9LAorV1NTX1NJTkdMRSgiTG9vcGJhY2sgQ2FwdHVyZSBTd2l0Y2giLCAwLCBDUzQyMzFfTE9PUEJBQ0ssIDAsIDEsIDApLAorV1NTX1NJTkdMRV9UTFYoIkxvb3BiYWNrIENhcHR1cmUgVm9sdW1lIiwgMCwgQ1M0MjMxX0xPT1BCQUNLLCAxLCA2MywgMCwKKwkgICAgICAgZGJfc2NhbGVfNmJpdCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3dzc19jb250cm9sc1tdID0geworV1NTX0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULCAwLCAwLCA2MywgMSksCitXU1NfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0xFRlRfTElORV9JTiwgQ1M0MjMxX1JJR0hUX0xJTkVfSU4sIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfQVVYMV9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMV9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0FVWDFfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDFfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxKSwKK1dTU19ET1VCTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAxLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJBdXggUGxheWJhY2sgVm9sdW1lIiwgMSwKKwkJQ1M0MjMxX0FVWDJfTEVGVF9JTlBVVCwgQ1M0MjMxX0FVWDJfUklHSFRfSU5QVVQsIDAsIDAsIDMxLCAxKSwKK1dTU19TSU5HTEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJQ1M0MjMxX01PTk9fQ1RSTCwgNywgMSwgMSksCitXU1NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9NT05PX0NUUkwsIDAsIDE1LCAxKSwKK1dTU19TSU5HTEUoIk1vbm8gT3V0cHV0IFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9NT05PX0NUUkwsIDYsIDEsIDEpLAorV1NTX1NJTkdMRSgiTW9ubyBPdXRwdXQgUGxheWJhY2sgQnlwYXNzIiwgMCwKKwkJQ1M0MjMxX01PTk9fQ1RSTCwgNSwgMSwgMCksCitXU1NfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDAsIDAsIDE1LCAwKSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJLmluZm8gPSBzbmRfd3NzX2luZm9fbXV4LAorCS5nZXQgPSBzbmRfd3NzX2dldF9tdXgsCisJLnB1dCA9IHNuZF93c3NfcHV0X211eCwKK30sCitXU1NfRE9VQkxFKCJNaWMgQm9vc3QiLCAwLAorCQlDUzQyMzFfTEVGVF9JTlBVVCwgQ1M0MjMxX1JJR0hUX0lOUFVULCA1LCA1LCAxLCAwKSwKK1dTU19TSU5HTEUoIkxvb3BiYWNrIENhcHR1cmUgU3dpdGNoIiwgMCwKKwkJQ1M0MjMxX0xPT1BCQUNLLCAwLCAxLCAwKSwKK1dTU19TSU5HTEUoIkxvb3BiYWNrIENhcHR1cmUgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0xPT1BCQUNLLCAyLCA2MywgMSkKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfb3B0aTkzeF9jb250cm9sc1tdID0geworV1NTX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCU9QVGk5M1hfT1VUX0xFRlQsIE9QVGk5M1hfT1VUX1JJR0hULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlPUFRpOTNYX09VVF9MRUZULCBPUFRpOTNYX09VVF9SSUdIVCwgMSwgMSwgMzEsIDEpLAorV1NTX0RPVUJMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9MRUZUX09VVFBVVCwgQ1M0MjMxX1JJR0hUX09VVFBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMCwKKwkJQ1M0MjMxX0xFRlRfT1VUUFVULCBDUzQyMzFfUklHSFRfT1VUUFVULCAwLCAwLCAzMSwgMSksCitXU1NfRE9VQkxFKCJGTSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJGTSBQbGF5YmFjayBWb2x1bWUiLCAwLAorCQlDUzQyMzFfQVVYMl9MRUZUX0lOUFVULCBDUzQyMzFfQVVYMl9SSUdIVF9JTlBVVCwgMSwgMSwgMTUsIDEpLAorV1NTX0RPVUJMRSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAwLAorCQlDUzQyMzFfTEVGVF9MSU5FX0lOLCBDUzQyMzFfUklHSFRfTElORV9JTiwgNywgNywgMSwgMSksCitXU1NfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX0xJTkVfSU4sIENTNDIzMV9SSUdIVF9MSU5FX0lOLCAwLCAwLCAxNSwgMSksCitXU1NfRE9VQkxFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJT1BUaTkzWF9NSUNfTEVGVF9JTlBVVCwgT1BUaTkzWF9NSUNfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCU9QVGk5M1hfTUlDX0xFRlRfSU5QVVQsIE9QVGk5M1hfTUlDX1JJR0hUX0lOUFVULCAxLCAxLCAxNSwgMSksCitXU1NfRE9VQkxFKCJNaWMgQm9vc3QiLCAwLAorCQlDUzQyMzFfTEVGVF9JTlBVVCwgQ1M0MjMxX1JJR0hUX0lOUFVULCA1LCA1LCAxLCAwKSwKK1dTU19ET1VCTEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDAsCisJCUNTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCA3LCA3LCAxLCAxKSwKK1dTU19ET1VCTEUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9BVVgxX0xFRlRfSU5QVVQsIENTNDIzMV9BVVgxX1JJR0hUX0lOUFVULCAxLCAxLCAxNSwgMSksCitXU1NfRE9VQkxFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMCwKKwkJT1BUaTkzMV9BVVhfTEVGVF9JTlBVVCwgT1BUaTkzMV9BVVhfUklHSFRfSU5QVVQsIDcsIDcsIDEsIDEpLAorV1NTX0RPVUJMRSgiQXV4IFBsYXliYWNrIFZvbHVtZSIsIDAsCisJCU9QVGk5MzFfQVVYX0xFRlRfSU5QVVQsIE9QVGk5MzFfQVVYX1JJR0hUX0lOUFVULCAxLCAxLCAxNSwgMSksCitXU1NfRE9VQkxFKCJDYXB0dXJlIFZvbHVtZSIsIDAsCisJCUNTNDIzMV9MRUZUX0lOUFVULCBDUzQyMzFfUklHSFRfSU5QVVQsIDAsIDAsIDE1LCAwKSwKK3sKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJLmluZm8gPSBzbmRfd3NzX2luZm9fbXV4LAorCS5nZXQgPSBzbmRfd3NzX2dldF9tdXgsCisJLnB1dCA9IHNuZF93c3NfcHV0X211eCwKK30KK307CisKK2ludCBzbmRfd3NzX21peGVyKHN0cnVjdCBzbmRfd3NzICpjaGlwKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBlcnI7CisKKwlpZiAoc25kX0JVR19PTighY2hpcCB8fCAhY2hpcC0+cGNtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXJkID0gY2hpcC0+Y2FyZDsKKworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIGNoaXAtPnBjbS0+bmFtZSk7CisKKwlpZiAoY2hpcC0+aGFyZHdhcmUgPT0gV1NTX0hXX09QVEk5M1gpCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfb3B0aTkzeF9jb250cm9scyk7IGlkeCsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLAorCQkJCQlzbmRfY3RsX25ldzEoJnNuZF9vcHRpOTN4X2NvbnRyb2xzW2lkeF0sCisJCQkJCQkgICAgIGNoaXApKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwllbHNlIGlmIChjaGlwLT5oYXJkd2FyZSAmIFdTU19IV19BRDE4NDhfTUFTSykKKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9hZDE4NDhfY29udHJvbHMpOyBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCQkJc25kX2N0bF9uZXcxKCZzbmRfYWQxODQ4X2NvbnRyb2xzW2lkeF0sCisJCQkJCQkgICAgIGNoaXApKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwllbHNlCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfd3NzX2NvbnRyb2xzKTsgaWR4KyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCisJCQkJCXNuZF9jdGxfbmV3MSgmc25kX3dzc19jb250cm9sc1tpZHhdLAorCQkJCQkJICAgICBjaGlwKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF93c3NfbWl4ZXIpOworCitjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgKnNuZF93c3NfZ2V0X3BjbV9vcHMoaW50IGRpcmVjdGlvbikKK3sKKwlyZXR1cm4gZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPworCQkmc25kX3dzc19wbGF5YmFja19vcHMgOiAmc25kX3dzc19jYXB0dXJlX29wczsKK30KK0VYUE9SVF9TWU1CT0woc25kX3dzc19nZXRfcGNtX29wcyk7CisKKy8qCisgKiAgSU5JVCBwYXJ0CisgKi8KKworc3RhdGljIGludCBfX2luaXQgYWxzYV93c3NfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV93c3NfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChhbHNhX3dzc19pbml0KTsKK21vZHVsZV9leGl0KGFsc2Ffd3NzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9hdTF4MDAuYyBiL3NvdW5kL21pcHMvYXUxeDAwLmMKaW5kZXggZmJlZjM4YS4uMTg4MWNlYyAxMDA2NDQKLS0tIGEvc291bmQvbWlwcy9hdTF4MDAuYworKysgYi9zb3VuZC9taXBzL2F1MXgwMC5jCkBAIC0xOTAsMTQgKzE5MCwxNiBAQAogc3RhdGljIHZvaWQKIGF1MTAwMF9kbWFfc3RvcChzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCiB7Ci0Jc25kX2Fzc2VydChzdHJlYW0tPmJ1ZmZlciwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighc3RyZWFtLT5idWZmZXIpKQorCQlyZXR1cm47CiAJZGlzYWJsZV9kbWEoc3RyZWFtLT5kbWEpOwogfQogCiBzdGF0aWMgdm9pZAogYXUxMDAwX2RtYV9zdGFydChzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCiB7Ci0Jc25kX2Fzc2VydChzdHJlYW0tPmJ1ZmZlciwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighc3RyZWFtLT5idWZmZXIpKQorCQlyZXR1cm47CiAKIAlpbml0X2RtYShzdHJlYW0tPmRtYSk7CiAJaWYgKGdldF9kbWFfYWN0aXZlX2J1ZmZlcihzdHJlYW0tPmRtYSkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL0tjb25maWcgYi9zb3VuZC9vc3MvS2NvbmZpZwppbmRleCBkNGZhZmI2Li4xY2E3NDI3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvS2NvbmZpZworKysgYi9zb3VuZC9vc3MvS2NvbmZpZwpAQCAtMjQsMTMgKzI0LDYgQEAKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3Z3c25kPiBmb3IgbW9yZSBpbmZvIG9uIHRoaXMgZHJpdmVyJ3MKIAkgIGNhcGFiaWxpdGllcy4KIAotY29uZmlnIFNPVU5EX0hBTDIKLQl0cmlzdGF0ZSAiU0dJIEhBTDIgc291bmQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTR0lfSVAyMiAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGFuIFNHSSBJbmR5IG9yIEluZGlnbzIgc3lzdGVtIGFuZCB3YW50IHRvIGJlIGFibGUgdG8KLQkgIHVzZSBpdHMgb24tYm9hcmQgQTIgYXVkaW8gc3lzdGVtLgotCiBjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKIAl0cmlzdGF0ZSAiQXUxNTUwL0F1MTIwMCBBQzk3IFNvdW5kIgogCWRlcGVuZHMgb24gU09DX0FVMTU1MCB8fCBTT0NfQVUxMjAwCkBAIC01NDYsMzQgKzUzOSw2IEBACiAJICBCYXNlIEkvTyBwb3J0IGFkZHJlc3MgZm9yIHRoZSBDRC1ST00gaW50ZXJmYWNlIG9mIHRoZSBBdWRpbyBFeGNlbAogCSAgRFNQIDE2IGNhcmQuCiAKLWNob2ljZQotCXByb21wdCAiQXVkaW8gRXhjZWwgRFNQIDE2IgotCW9wdGlvbmFsCi0JZGVwZW5kcyBvbiBTT1VORF9BRURTUDE2Ci0KLWNvbmZpZyBBRURTUDE2X01TUwotCWJvb2wgIk1TUyBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBTT1VORF9NU1MKLQloZWxwCi0JICBBbnN3ZXIgWSBpZiB5b3Ugd2FudCB5b3VyIGF1ZGlvIGNhcmQgdG8gZW11bGF0ZSBNaWNyb3NvZnQgU291bmQKLQkgIFN5c3RlbS4gWW91IHNob3VsZCB0aGVuIHNheSBZIHRvICJNaWNyb3NvZnQgU291bmQgU3lzdGVtIHN1cHBvcnQiCi0JICBhbmQgc2F5IE4gdG8gIkF1ZGlvIEV4Y2VsIERTUCAxNiAoU0JQcm8gZW11bGF0aW9uKSIuCi0KLWNvbmZpZyBBRURTUDE2X1NCUFJPCi0JYm9vbCAiU0JQcm8gZW11bGF0aW9uIgotCWRlcGVuZHMgb24gU09VTkRfU0IKLQloZWxwCi0JICBBbnN3ZXIgWSBpZiB5b3Ugd2FudCB5b3VyIGF1ZGlvIGNhcmQgdG8gZW11bGF0ZSBTb3VuZCBCbGFzdGVyIFByby4KLQkgIFlvdSBzaG91bGQgdGhlbiBzYXkgWSB0byAiMTAwJSBTb3VuZCBCbGFzdGVyIGNvbXBhdGlibGVzCi0JICAoU0IxNi8zMi82NCwgRVNTLCBKYXp6MTYpIHN1cHBvcnQiIGFuZCBOIHRvICJBdWRpbyBFeGNlbCBEU1AgMTYgKE1TUwotCSAgZW11bGF0aW9uKSIuCi0KLQkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKLQkgICJhZWRzcDE2PTxpbz4sPGlycT4sPGRtYT4sPG1zc2lvPiw8bXB1aW8+LDxtb3VpcnE+IiB0byB0aGUga2VybmVsCi0JICBjb21tYW5kIGxpbmUuCi0KLWVuZGNob2ljZQotCiBjb25maWcgU09VTkRfVklEQwogCXRyaXN0YXRlICJWSURDIDE2LWJpdCBzb3VuZCIKIAlkZXBlbmRzIG9uIEFSTSAmJiAoQVJDSF9BQ09STiB8fCBBUkNIX0NMUFM3NTAwKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL01ha2VmaWxlIGIvc291bmQvb3NzL01ha2VmaWxlCmluZGV4IGM2MTE1MTQuLmUwYWU0ZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9NYWtlZmlsZQorKysgYi9zb3VuZC9vc3MvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDYgQEAKICMgUGxlYXNlIGxlYXZlIGl0IGFzIGlzLCBjYXVzZSB0aGUgbGluayBvcmRlciBpcyBzaWduaWZpY2FudCAhCiAKIG9iai0kKENPTkZJR19TT1VORF9TSF9EQUNfQVVESU8pCSs9IHNoX2RhY19hdWRpby5vCi1vYmotJChDT05GSUdfU09VTkRfSEFMMikJKz0gaGFsMi5vCiBvYmotJChDT05GSUdfU09VTkRfQUVEU1AxNikJKz0gYWVkc3AxNi5vCiBvYmotJChDT05GSUdfU09VTkRfUFNTKQkJKz0gcHNzLm8gYWQxODQ4Lm8gbXB1NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9UUklYKQkrPSB0cml4Lm8gYWQxODQ4Lm8gc2JfbGliLm8gdWFydDQwMS5vCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWM5N19jb2RlYy5jIGIvc291bmQvb3NzL2FjOTdfY29kZWMuYwppbmRleCBiNjM4MzllLi40NTZhMWI0IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL29zcy9hYzk3X2NvZGVjLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhpc3RvcnkKLSAqIE1heSAwMiwgMjAwMyBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBNYXkgMDIsIDIwMDMgTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqCVJlbW92ZWQgbm9uIGV4aXN0YW50IFdNOTcwMAogICoJQWRkZWQgc3VwcG9ydCBmb3IgV005NzA1LCBXTTk3MDgsIFdNOTcwOSwgV005NzEwLCBXTTk3MTEKICAqCVdNOTcxMiBhbmQgV005NzE3CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWVkc3AxNi5jIGIvc291bmQvb3NzL2FlZHNwMTYuYwppbmRleCA1MWUxZmRlLi5hMDI3NGYzIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvYWVkc3AxNi5jCisrKyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKQEAgLTI5LDE0ICsyOSw2IEBACiAjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCiAKIC8qCi0gKiBTYW5pdHkgY2hlY2tzCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX0FFRFNQMTZfU0JQUk8pICYmIGRlZmluZWQoQ09ORklHX1NPVU5EX0FFRFNQMTZfTVNTKQotI2Vycm9yIFlvdSBoYXZlIHRvIGVuYWJsZSBvbmx5IG9uZSBvZiB0aGUgTVNTIGFuZCBTQlBSTyBlbXVsYXRpb25zLgotI2VuZGlmCi0KLS8qCiAKICAgIFJFQUQgVEhJUwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvS2NvbmZpZyBiL3NvdW5kL29zcy9kbWFzb3VuZC9LY29uZmlnCmluZGV4IDNlYjc4MjcuLmY0NTY1NzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9LY29uZmlnCkBAIC00MiwzICs0Miw0IEBACiAKIGNvbmZpZyBETUFTT1VORAogCXRyaXN0YXRlCisJc2VsZWN0IFNPVU5EX09TU19DT1JFCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaGFsMi5jIGIvc291bmQvb3NzL2hhbDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0YjlkZi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvaGFsMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1OCArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgQTIgYXVkaW8gc3lzdGVtIHVzZWQgaW4gU0dJIG1hY2hpbmVzCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KLSAqICAKLSAqICBCYXNlZCBvbiBVbGYgQ2FybHNzb24ncyBjb2RlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogIFN1cHBvcnRlZCBkZXZpY2VzOgotICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIGRzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCi0gKiAgL2Rldi9taXhlcglzdGFuZGFyZCBtaXhlciBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+Ci0jaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+Ci0KLSNpbmNsdWRlICJoYWwyLmgiCi0KLSNpZiAwCi0jZGVmaW5lIERFQlVHKGFyZ3MuLi4pCQlwcmludGsoYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHKGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIDAgCi0jZGVmaW5lIERFQlVHX01JWChhcmdzLi4uKQlwcmludGsoYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHX01JWChhcmdzLi4uKQotI2VuZGlmCi0KLS8qCi0gKiBCZWZvcmUgdG91Y2hpbmcgdGhlc2UgbG9vayBob3cgaXQgd29ya3MuIEl0IGlzIGEgYml0IHVudXN1YWwgSSBrbm93LAotICogYnV0IGl0IGhlbHBzIHRvIGtlZXAgdGhpbmdzIHNpbXBsZS4gVGhpcyBkcml2ZXIgaXMgY29uc2lkZXJlZCBjb21wbGV0ZQotICogYW5kIEkgd29uJ3QgYWRkIGFueSBuZXcgZmVhdHVyZXMgYWx0aG91Z2ggaGFyZHdhcmUgaGFzIG1hbnkgY29vbAotICogY2FwYWJpbGl0aWVzLgotICogKEhpc3RvcmljYWwgbm90ZTogSEFMMiBkcml2ZXIgd2FzIGZpcnN0IHdyaXR0ZW4gYnkgVWxmIENhcmxzc29uIC0gQUxTQQotICogMC4zIHJ1bm5pbmcgd2l0aCAyLjIueCBrZXJuZWwuIFRoZW4gQUxTQSBjaGFuZ2VkIGNvbXBsZXRlbHkgYW5kIGl0Ci0gKiBzZWVtZWQgZWFzaWVyIHRvIG1lIHRvIHdyaXRlIE9TUyBkcml2ZXIgZnJvbSBzY3JhdGNoIC0gdGhpcyBvbmUuIE5vdwotICogd2hlbiBBTFNBIGlzIG9mZmljaWFsIHBhcnQgb2YgMi42IGtlcm5lbCBpdCdzIHRpbWUgdG8gd3JpdGUgQUxTQSBkcml2ZXIKLSAqIHVzaW5nIChob3BlZnVsbHkpIGZpbmFsIHZlcnNpb24gb2YgQUxTQSBpbnRlcmZhY2UpCi0gKi8KLSNkZWZpbmUgSDJfQkxPQ0tfU0laRQkxMDI0Ci0jZGVmaW5lIEgyX0FEQ19CVUZTSVpFCTgxOTIKLSNkZWZpbmUgSDJfREFDX0JVRlNJWkUJMTY4MzQKLQotc3RydWN0IGhhbDJfcGJ1cyB7Ci0Jc3RydWN0IGhwYzNfcGJ1c19kbWFjcmVncyAqcGJ1czsKLQlpbnQgcGJ1c25yOwotCXVuc2lnbmVkIGludCBjdHJsOwkJLyogQ3VycmVudCBzdGF0ZSBvZiBwYnVzLT5wYmRtYV9jdHJsICovCi19OwotCi1zdHJ1Y3QgaGFsMl9kZXNjIHsKLQlzdHJ1Y3QgaHBjX2RtYV9kZXNjIGRlc2M7Ci0JdTMyIGNudDsJCQkvKiBkb24ndCB0b3VjaCwgaXQgaXMgYWxzbyBwYWRkaW5nICovCi19OwotCi1zdHJ1Y3QgaGFsMl9jb2RlYyB7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyOwotCXN0cnVjdCBoYWwyX2Rlc2MgKmRlc2M7Ci0JaW50IGRlc2NfY291bnQ7Ci0JaW50IHRhaWwsIGhlYWQ7CQkJLyogdGFpbCBpbmRleCwgaGVhZCBpbmRleCAqLwotCXN0cnVjdCBoYWwyX3BidXMgcGJ1czsKLQl1bnNpZ25lZCBpbnQgZm9ybWF0OwkJLyogQXVkaW8gZGF0YSBmb3JtYXQgKi8KLQlpbnQgdm9pY2VzOwkJCS8qIG1vbm8vc3RlcmVvICovCi0JdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOwotCXVuc2lnbmVkIGludCBtYXN0ZXI7CQkvKiBNYXN0ZXIgZnJlcXVlbmN5ICovCi0JdW5zaWduZWQgc2hvcnQgbW9kOwkJLyogTU9EIHZhbHVlICovCi0JdW5zaWduZWQgc2hvcnQgaW5jOwkJLyogSU5DIHZhbHVlICovCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBkbWFfd2FpdDsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHNlbTsKLQotCWludCB1c2Vjb3VudDsJCQkvKiByZWNvcmRpbmcgYW5kIHBsYXliYWNrIGFyZQotCQkJCQkgKiBpbmRlcGVuZGVudCAqLwotfTsKLQotI2RlZmluZSBIMl9NSVhfT1VUUFVUX0FUVAkwCi0jZGVmaW5lIEgyX01JWF9JTlBVVF9HQUlOCTEKLSNkZWZpbmUgSDJfTUlYRVJTCQkyCi1zdHJ1Y3QgaGFsMl9taXhlciB7Ci0JaW50IG1vZGNudDsKLQl1bnNpZ25lZCBpbnQgbWFzdGVyOwotCXVuc2lnbmVkIGludCB2b2x1bWVbSDJfTUlYRVJTXTsKLX07Ci0KLXN0cnVjdCBoYWwyX2NhcmQgewotCWludCBkZXZfZHNwOwkJCS8qIGF1ZGlvIGRldmljZSAqLwotCWludCBkZXZfbWl4ZXI7CQkJLyogbWl4ZXIgZGV2aWNlICovCi0JaW50IGRldl9taWRpOwkJCS8qIG1pZGkgZGV2aWNlICovCi0KLQlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqY3RsX3JlZ3M7CS8qIEhBTDIgY3RsIHJlZ2lzdGVycyAqLwotCXN0cnVjdCBoYWwyX2Flc19yZWdzICphZXNfcmVnczsJLyogSEFMMiBhZXMgcmVnaXN0ZXJzICovCi0Jc3RydWN0IGhhbDJfdm9sX3JlZ3MgKnZvbF9yZWdzOwkvKiBIQUwyIHZvbCByZWdpc3RlcnMgKi8KLQlzdHJ1Y3QgaGFsMl9zeW5fcmVncyAqc3luX3JlZ3M7CS8qIEhBTDIgc3luIHJlZ2lzdGVycyAqLwotCi0Jc3RydWN0IGhhbDJfY29kZWMgZGFjOwotCXN0cnVjdCBoYWwyX2NvZGVjIGFkYzsKLQlzdHJ1Y3QgaGFsMl9taXhlciBtaXhlcjsKLX07Ci0KLSNkZWZpbmUgSDJfSU5ESVJFQ1RfV0FJVChyZWdzKQl3aGlsZSAocmVncy0+aXNyICYgSDJfSVNSX1RTVEFUVVMpOwotCi0jZGVmaW5lIEgyX1JFQURfQUREUihhZGRyKQkoYWRkciB8ICgxPDw3KSkKLSNkZWZpbmUgSDJfV1JJVEVfQUREUihhZGRyKQkoYWRkcikKLQotc3RhdGljIGNoYXIgKmhhbDJzdHIgPSAiSEFMMiI7Ci0KLS8qCi0gKiBJIGRvdWJ0IGFueW9uZSBoYXMgYSBtYWNoaW5lIHdpdGggdHdvIEhBTDIgY2FyZHMuIEl0J3MgcG9zc2libGUgdG8KLSAqIGhhdmUgdHdvIEhQQydzLCBzbyBpdCBpcyBwcm9iYWJseSBwb3NzaWJsZSB0byBoYXZlIHR3byBIQUwyIGNhcmRzLgotICogVHJ5IHRvIGRlYWwgd2l0aCBpdCwgYnV0IG5vdGUgdGhhdCBpdCBpcyBub3QgdGVzdGVkLgotICovCi0jZGVmaW5lIE1BWENBUkRTCTIKLXN0YXRpYyBzdHJ1Y3QgaGFsMl9jYXJkKiBoYWwyX2NhcmRbTUFYQ0FSRFNdOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQl1bnNpZ25lZCBjaGFyIGlkeDo0LCBhdmFpbDoxOwotfSBtaXh0YWJsZVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gewotCVtTT1VORF9NSVhFUl9QQ01dCT0geyBIMl9NSVhfT1VUUFVUX0FUVCwgMSB9LAkvKiB2b2ljZSAqLwotCVtTT1VORF9NSVhFUl9NSUNdCT0geyBIMl9NSVhfSU5QVVRfR0FJTiwgMSB9LAkvKiBtaWMgKi8KLX07Ci0KLSNkZWZpbmUgSDJfU1VQUE9SVEVEX0ZPUk1BVFMJKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoYWwyX2lzcl93cml0ZShzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgdmFsKQotewotCWhhbDItPmN0bF9yZWdzLT5pc3IgPSB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGhhbDJfaXNyX2xvb2soc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQlyZXR1cm4gaGFsMi0+Y3RsX3JlZ3MtPmlzcjsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgaGFsMl9yZXZfbG9vayhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCXJldHVybiBoYWwyLT5jdGxfcmVncy0+cmV2OwotfQotCi0jaWZkZWYgSEFMMl9EVU1QX1JFR1MKLXN0YXRpYyB1MTYgaGFsMl9pX2xvb2sxNihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkcikKLXsKLQlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOwotCi0JcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci0JcmV0dXJuIHJlZ3MtPmlkcjA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHUzMiBoYWwyX2lfbG9vazMyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyKQotewotCXUzMiByZXQ7Ci0Jc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKLQotCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKLQlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOwotCXJldCA9IHJlZ3MtPmlkcjAgJiAweGZmZmY7Ci0JcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIgfCAweDEpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci0JcmV0IHw9IChyZWdzLT5pZHIwICYgMHhmZmZmKSA8PCAxNjsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2lfd3JpdGUxNihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTE2IHZhbCkKLXsKLQlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOwotCi0JcmVncy0+aWRyMCA9IHZhbDsKLQlyZWdzLT5pZHIxID0gMDsKLQlyZWdzLT5pZHIyID0gMDsKLQlyZWdzLT5pZHIzID0gMDsKLQlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbDJfaV93cml0ZTMyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MzIgdmFsKQotewotCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7Ci0KLQlyZWdzLT5pZHIwID0gdmFsICYgMHhmZmZmOwotCXJlZ3MtPmlkcjEgPSB2YWwgPj4gMTY7Ci0JcmVncy0+aWRyMiA9IDA7Ci0JcmVncy0+aWRyMyA9IDA7Ci0JcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKLQlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2lfc2V0Yml0MTYoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUxNiBiaXQpCi17Ci0Jc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKLQotCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKLQlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOwotCXJlZ3MtPmlkcjAgPSAocmVncy0+aWRyMCAmIDB4ZmZmZikgfCBiaXQ7Ci0JcmVncy0+aWRyMSA9IDA7Ci0JcmVncy0+aWRyMiA9IDA7Ci0JcmVncy0+aWRyMyA9IDA7Ci0JcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKLQlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2lfc2V0Yml0MzIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUzMiBiaXQpCi17Ci0JdTMyIHRtcDsKLQlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOwotCi0JcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci0JdG1wID0gKHJlZ3MtPmlkcjAgJiAweGZmZmYpIHwgKHJlZ3MtPmlkcjEgPDwgMTYpIHwgYml0OwotCXJlZ3MtPmlkcjAgPSB0bXAgJiAweGZmZmY7Ci0JcmVncy0+aWRyMSA9IHRtcCA+PiAxNjsKLQlyZWdzLT5pZHIyID0gMDsKLQlyZWdzLT5pZHIzID0gMDsKLQlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbDJfaV9jbGVhcmJpdDE2KHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MTYgYml0KQotewotCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7Ci0KLQlyZWdzLT5pYXIgPSBIMl9SRUFEX0FERFIoYWRkcik7Ci0JSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKLQlyZWdzLT5pZHIwID0gKHJlZ3MtPmlkcjAgJiAweGZmZmYpICYgfmJpdDsKLQlyZWdzLT5pZHIxID0gMDsKLQlyZWdzLT5pZHIyID0gMDsKLQlyZWdzLT5pZHIzID0gMDsKLQlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci19Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZCBoYWwyX2lfY2xlYXJiaXQzMihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTMyIGJpdCkKLXsKLQl1MzIgdG1wOwotCWhhbDJfY3RsX3JlZ3NfdCAqcmVncyA9IGhhbDItPmN0bF9yZWdzOwotCi0JcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci0JdG1wID0gKChyZWdzLT5pZHIwICYgMHhmZmZmKSB8IChyZWdzLT5pZHIxIDw8IDE2KSkgJiB+Yml0OwotCXJlZ3MtPmlkcjAgPSB0bXAgJiAweGZmZmY7Ci0JcmVncy0+aWRyMSA9IHRtcCA+PiAxNjsKLQlyZWdzLT5pZHIyID0gMDsKLQlyZWdzLT5pZHIzID0gMDsKLQlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOwotCUgyX0lORElSRUNUX1dBSVQocmVncyk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEhBTDJfRFVNUF9SRUdTCi1zdGF0aWMgdm9pZCBoYWwyX2R1bXBfcmVncyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCURFQlVHKCJpc3I6ICUwOGh4ICIsIGhhbDJfaXNyX2xvb2soaGFsMikpOwotCURFQlVHKCJyZXY6ICUwOGh4XG4iLCBoYWwyX3Jldl9sb29rKGhhbDIpKTsKLQlERUJVRygicmVsYXk6ICUwNGh4XG4iLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9SRUxBWV9DKSk7Ci0JREVCVUcoInBvcnQgZW46ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOKSk7Ci0JREVCVUcoImRtYSBlbmQ6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9FTkQpKTsKLQlERUJVRygiZG1hIGRydjogJTA0aHhcbiIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9EUlYpKTsKLQlERUJVRygic3luIGN0bDogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfU1lOVEhfQykpOwotCURFQlVHKCJhZXNyeCBjdGw6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0FFU1JYX0MpKTsKLQlERUJVRygiYWVzdHggY3RsOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9BRVNUWF9DKSk7Ci0JREVCVUcoImRhYyBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9BRENfQzEpKTsKLQlERUJVRygiZGFjIGN0bDI6ICUwOHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQURDX0MyKSk7Ci0JREVCVUcoImFkYyBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9EQUNfQzEpKTsKLQlERUJVRygiYWRjIGN0bDI6ICUwOHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfREFDX0MyKSk7Ci0JREVCVUcoInN5biBtYXA6ICUwNGh4XG4iLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9TWU5USF9NQVBfQykpOwotCURFQlVHKCJicmVzMSBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9CUkVTMV9DMSkpOwotCURFQlVHKCJicmVzMSBjdGwyOiAlMDR4ICIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0JSRVMxX0MyKSk7Ci0JREVCVUcoImJyZXMyIGN0bDE6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0JSRVMyX0MxKSk7Ci0JREVCVUcoImJyZXMyIGN0bDI6ICUwNHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQlJFUzJfQzIpKTsKLQlERUJVRygiYnJlczMgY3RsMTogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfQlJFUzNfQzEpKTsKLQlERUJVRygiYnJlczMgY3RsMjogJTA0eFxuIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQlJFUzNfQzIpKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGhhbDJfY2FyZCogaGFsMl9kc3BfZmluZF9jYXJkKGludCBtaW5vcikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQotCQlpZiAoaGFsMl9jYXJkW2ldICE9IE5VTEwgJiYgaGFsMl9jYXJkW2ldLT5kZXZfZHNwID09IG1pbm9yKQotCQkJcmV0dXJuIGhhbDJfY2FyZFtpXTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBoYWwyX2NhcmQqIGhhbDJfbWl4ZXJfZmluZF9jYXJkKGludCBtaW5vcikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQotCQlpZiAoaGFsMl9jYXJkW2ldICE9IE5VTEwgJiYgaGFsMl9jYXJkW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQlyZXR1cm4gaGFsMl9jYXJkW2ldOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2luY19oZWFkKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKLXsKLQljb2RlYy0+aGVhZCsrOwotCWlmIChjb2RlYy0+aGVhZCA9PSBjb2RlYy0+ZGVzY19jb3VudCkKLQkJY29kZWMtPmhlYWQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2luY190YWlsKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKLXsKLQljb2RlYy0+dGFpbCsrOwotCWlmIChjb2RlYy0+dGFpbCA9PSBjb2RlYy0+ZGVzY19jb3VudCkKLQkJY29kZWMtPnRhaWwgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2RhY19pbnRlcnJ1cHQoc3RydWN0IGhhbDJfY29kZWMgKmRhYykKLXsKLQlpbnQgcnVubmluZzsKLQotCXNwaW5fbG9jaygmZGFjLT5sb2NrKTsKLQkvKiBpZiB0YWlsIGJ1ZmZlciBjb250YWlucyB6ZXJvIHNhbXBsZXMgRE1BIHN0cmVhbSB3YXMgYWxyZWFkeQotCSAqIHN0b3BwZWQgKi8KLQlydW5uaW5nID0gZGFjLT5kZXNjW2RhYy0+dGFpbF0uY250OwotCWRhYy0+ZGVzY1tkYWMtPnRhaWxdLmNudCA9IDA7Ci0JZGFjLT5kZXNjW2RhYy0+dGFpbF0uZGVzYy5jbnRpbmZvID0gSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1g7Ci0JLyogd2UganVzdCBwcm9jY2Vzc2VkIGVtcHR5IGJ1ZmZlciwgZG9uJ3QgdXBkYXRlIHRhaWwgcG9pbnRlciAqLwotCWlmIChydW5uaW5nKQotCQloYWwyX2luY190YWlsKGRhYyk7Ci0Jc3Bpbl91bmxvY2soJmRhYy0+bG9jayk7Ci0KLQl3YWtlX3VwKCZkYWMtPmRtYV93YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgaGFsMl9hZGNfaW50ZXJydXB0KHN0cnVjdCBoYWwyX2NvZGVjICphZGMpCi17Ci0JaW50IHJ1bm5pbmc7Ci0KLQlzcGluX2xvY2soJmFkYy0+bG9jayk7Ci0JLyogaWYgaGVhZCBidWZmZXIgY29udGFpbnMgbm9uemVybyBzYW1wbGVzIERNQSBzdHJlYW0gd2FzIGFscmVhZHkKLQkgKiBzdG9wcGVkICovCi0JcnVubmluZyA9ICFhZGMtPmRlc2NbYWRjLT5oZWFkXS5jbnQ7Ci0JYWRjLT5kZXNjW2FkYy0+aGVhZF0uY250ID0gSDJfQkxPQ0tfU0laRTsKLQlhZGMtPmRlc2NbYWRjLT5oZWFkXS5kZXNjLmNudGluZm8gPSBIUENETUFfWElFIHwgSFBDRE1BX0VPUjsKLQkvKiB3ZSBqdXN0IHByb2NjZXNzZWQgZW1wdHkgYnVmZmVyLCBkb24ndCB1cGRhdGUgaGVhZCBwb2ludGVyICovCi0JaWYgKHJ1bm5pbmcpCi0JCWhhbDJfaW5jX2hlYWQoYWRjKTsKLQlzcGluX3VubG9jaygmYWRjLT5sb2NrKTsKLQotCXdha2VfdXAoJmFkYy0+ZG1hX3dhaXQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaGFsMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSBkZXZfaWQ7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0KLQkvKiBkZWNpZGUgd2hhdCBjYXVzZWQgdGhpcyBpbnRlcnJ1cHQgKi8KLQlpZiAoaGFsMi0+ZGFjLnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSU5UKSB7Ci0JCWhhbDJfZGFjX2ludGVycnVwdCgmaGFsMi0+ZGFjKTsKLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0JfQotCWlmIChoYWwyLT5hZGMucGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JTlQpIHsKLQkJaGFsMl9hZGNfaW50ZXJydXB0KCZoYWwyLT5hZGMpOwotCQlyZXQgPSBJUlFfSEFORExFRDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBoYWwyX2NvbXB1dGVfcmF0ZShzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByYXRlKQotewotCXVuc2lnbmVkIHNob3J0IG1vZDsKLQkKLQlERUJVRygicmF0ZTogJWRcbiIsIHJhdGUpOwotCQotCWlmIChyYXRlIDwgNDAwMCkgcmF0ZSA9IDQwMDA7Ci0JZWxzZSBpZiAocmF0ZSA+IDQ4MDAwKSByYXRlID0gNDgwMDA7Ci0KLQlpZiAoNDQxMDAgJSByYXRlIDwgNDgwMDAgJSByYXRlKSB7Ci0JCW1vZCA9IDQgKiA0NDEwMCAvIHJhdGU7Ci0JCWNvZGVjLT5tYXN0ZXIgPSA0NDEwMDsKLQl9IGVsc2UgewotCQltb2QgPSA0ICogNDgwMDAgLyByYXRlOwotCQljb2RlYy0+bWFzdGVyID0gNDgwMDA7Ci0JfQotCi0JY29kZWMtPmluYyA9IDQ7Ci0JY29kZWMtPm1vZCA9IG1vZDsKLQlyYXRlID0gNCAqIGNvZGVjLT5tYXN0ZXIgLyBtb2Q7Ci0KLQlERUJVRygicmVhbF9yYXRlOiAlZFxuIiwgcmF0ZSk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIHZvaWQgaGFsMl9zZXRfZGFjX3JhdGUoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQl1bnNpZ25lZCBpbnQgbWFzdGVyID0gaGFsMi0+ZGFjLm1hc3RlcjsKLQlpbnQgaW5jID0gaGFsMi0+ZGFjLmluYzsKLQlpbnQgbW9kID0gaGFsMi0+ZGFjLm1vZDsKLQotCURFQlVHKCJtYXN0ZXI6ICVkIGluYzogJWQgbW9kOiAlZFxuIiwgbWFzdGVyLCBpbmMsIG1vZCk7Ci0JCi0JaGFsMl9pX3dyaXRlMTYoaGFsMiwgSDJJX0JSRVMxX0MxLCAobWFzdGVyID09IDQ0MTAwKSA/IDEgOiAwKTsKLQloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfQlJFUzFfQzIsICgoMHhmZmZmICYgKGluYyAtIG1vZCAtIDEpKSA8PCAxNikgfCBpbmMpOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX3NldF9hZGNfcmF0ZShzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCXVuc2lnbmVkIGludCBtYXN0ZXIgPSBoYWwyLT5hZGMubWFzdGVyOwotCWludCBpbmMgPSBoYWwyLT5hZGMuaW5jOwotCWludCBtb2QgPSBoYWwyLT5hZGMubW9kOwotCi0JREVCVUcoIm1hc3RlcjogJWQgaW5jOiAlZCBtb2Q6ICVkXG4iLCBtYXN0ZXIsIGluYywgbW9kKTsKLQkKLQloYWwyX2lfd3JpdGUxNihoYWwyLCBIMklfQlJFUzJfQzEsIChtYXN0ZXIgPT0gNDQxMDApID8gMSA6IDApOwotCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9CUkVTMl9DMiwgKCgweGZmZmYgJiAoaW5jIC0gbW9kIC0gMSkpIDw8IDE2KSB8IGluYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbDJfc2V0dXBfZGFjKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCi17Ci0JdW5zaWduZWQgaW50IGZpZm9iZWcsIGZpZm9lbmQsIGhpZ2h3YXRlciwgc2FtcGxlX3NpemU7Ci0Jc3RydWN0IGhhbDJfcGJ1cyAqcGJ1cyA9ICZoYWwyLT5kYWMucGJ1czsKLQotCURFQlVHKCJoYWwyX3NldHVwX2RhY1xuIik7Ci0JCi0JLyogTm93IHdlIHNldCB1cCBzb21lIFBCVVMgaW5mb3JtYXRpb24uIFRoZSBQQlVTIG5lZWRzIGluZm9ybWF0aW9uIGFib3V0Ci0JICogd2hhdCBwb3J0aW9uIG9mIHRoZSBmaWZvIGl0IHdpbGwgdXNlLiBJZiBpdCdzIHJlY2VpdmluZyBvcgotCSAqIHRyYW5zbWl0dGluZywgYW5kIGZpbmFsbHkgd2hldGhlciB0aGUgc3RyZWFtIGlzIGxpdHRsZSBlbmRpYW4gb3IgYmlnCi0JICogZW5kaWFuLiBUaGUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBsYXRlciwgb24gdGhlIHN0YXJ0IGNhbGwuCi0JICovCi0Jc2FtcGxlX3NpemUgPSAyICogaGFsMi0+ZGFjLnZvaWNlczsKLQkvKiBGaWZvIHNob3VsZCBiZSBzZXQgdG8gaG9sZCBleGFjdGx5IGZvdXIgc2FtcGxlcy4gSGlnaHdhdGVyIG1hcmsKLQkgKiBzaG91bGQgYmUgc2V0IHRvIHR3byBzYW1wbGVzLiAqLwotCWhpZ2h3YXRlciA9IChzYW1wbGVfc2l6ZSAqIDIpID4+IDE7CS8qIGhhbGZ3b3JkcyAqLwotCWZpZm9iZWcgPSAwOwkJCQkvKiBwbGF5YmFjayBpcyBmaXJzdCAqLwotCWZpZm9lbmQgPSAoc2FtcGxlX3NpemUgKiA0KSA+PiAzOwkvKiBkb3VibGV3b3JkcyAqLwotCXBidXMtPmN0cmwgPSBIUEMzX1BETUFDVFJMX1JUIHwgSFBDM19QRE1BQ1RSTF9MRCB8Ci0JCSAgICAgKGhpZ2h3YXRlciA8PCA4KSB8IChmaWZvYmVnIDw8IDE2KSB8IChmaWZvZW5kIDw8IDI0KSB8Ci0JCSAgICAgKGhhbDItPmRhYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSA/IEhQQzNfUERNQUNUUkxfU0VMIDogMCk7Ci0JLyogV2UgZGlzYWJsZSBldmVyeXRoaW5nIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBhdCBhbGwgKi8KLQlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gSFBDM19QRE1BQ1RSTF9MRDsKLQloYWwyX2lfY2xlYXJiaXQxNihoYWwyLCBIMklfRE1BX1BPUlRfRU4sIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1RYKTsKLQkvKiBTZXR1cCB0aGUgSEFMMiBmb3IgcGxheWJhY2sgKi8KLQloYWwyX3NldF9kYWNfcmF0ZShoYWwyKTsKLQkvKiBTZXQgZW5kaWFuZXNzICovCi0JaWYgKGhhbDItPmRhYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSkKLQkJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1RYKTsKLQllbHNlCi0JCWhhbDJfaV9jbGVhcmJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1RYKTsKLQkvKiBTZXQgRE1BIGJ1cyAqLwotCWhhbDJfaV9zZXRiaXQxNihoYWwyLCBIMklfRE1BX0RSViwgKDEgPDwgcGJ1cy0+cGJ1c25yKSk7Ci0JLyogV2UgYXJlIHVzaW5nIDFzdCBCcmVzZW5oYW0gY2xvY2sgZ2VuZXJhdG9yIGZvciBwbGF5YmFjayAqLwotCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9EQUNfQzEsIChwYnVzLT5wYnVzbnIgPDwgSDJJX0MxX0RNQV9TSElGVCkKLQkJCXwgKDEgPDwgSDJJX0MxX0NMS0lEX1NISUZUKQotCQkJfCAoaGFsMi0+ZGFjLnZvaWNlcyA8PCBIMklfQzFfREFUQVRfU0hJRlQpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFsMl9zZXR1cF9hZGMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQl1bnNpZ25lZCBpbnQgZmlmb2JlZywgZmlmb2VuZCwgaGlnaHdhdGVyLCBzYW1wbGVfc2l6ZTsKLQlzdHJ1Y3QgaGFsMl9wYnVzICpwYnVzID0gJmhhbDItPmFkYy5wYnVzOwotCi0JREVCVUcoImhhbDJfc2V0dXBfYWRjXG4iKTsKLQotCXNhbXBsZV9zaXplID0gMiAqIGhhbDItPmFkYy52b2ljZXM7Ci0JaGlnaHdhdGVyID0gKHNhbXBsZV9zaXplICogMikgPj4gMTsJCS8qIGhhbGZ3b3JkcyAqLwotCWZpZm9iZWcgPSAoNCAqIDQpID4+IDM7CQkJCS8qIHJlY29yZCBpcyBzZWNvbmQgKi8KLQlmaWZvZW5kID0gKDQgKiA0ICsgc2FtcGxlX3NpemUgKiA0KSA+PiAzOwkvKiBkb3VibGV3b3JkcyAqLwotCXBidXMtPmN0cmwgPSBIUEMzX1BETUFDVFJMX1JUIHwgSFBDM19QRE1BQ1RSTF9SQ1YgfCBIUEMzX1BETUFDVFJMX0xEIHwgCi0JCSAgICAgKGhpZ2h3YXRlciA8PCA4KSB8IChmaWZvYmVnIDw8IDE2KSB8IChmaWZvZW5kIDw8IDI0KSB8Ci0JCSAgICAgKGhhbDItPmFkYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSA/IEhQQzNfUERNQUNUUkxfU0VMIDogMCk7Ci0JcGJ1cy0+cGJ1cy0+cGJkbWFfY3RybCA9IEhQQzNfUERNQUNUUkxfTEQ7Ci0JaGFsMl9pX2NsZWFyYml0MTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOLCBIMklfRE1BX1BPUlRfRU5fQ09ERUNSKTsKLQkvKiBTZXR1cCB0aGUgSEFMMiBmb3IgcmVjb3JkICovCi0JaGFsMl9zZXRfYWRjX3JhdGUoaGFsMik7Ci0JLyogU2V0IGVuZGlhbmVzcyAqLwotCWlmIChoYWwyLT5hZGMuZm9ybWF0ICYgQUZNVF9TMTZfTEUpCi0JCWhhbDJfaV9zZXRiaXQxNihoYWwyLCBIMklfRE1BX0VORCwgSDJJX0RNQV9FTkRfQ09ERUNSKTsKLQllbHNlCi0JCWhhbDJfaV9jbGVhcmJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1IpOwotCS8qIFNldCBETUEgYnVzICovCi0JaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRFJWLCAoMSA8PCBwYnVzLT5wYnVzbnIpKTsKLQkvKiBXZSBhcmUgdXNpbmcgMm5kIEJyZXNlbmhhbSBjbG9jayBnZW5lcmF0b3IgZm9yIHJlY29yZCAqLwotCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9BRENfQzEsIChwYnVzLT5wYnVzbnIgPDwgSDJJX0MxX0RNQV9TSElGVCkKLQkJCXwgKDIgPDwgSDJJX0MxX0NMS0lEX1NISUZUKQotCQkJfCAoaGFsMi0+YWRjLnZvaWNlcyA8PCBIMklfQzFfREFUQVRfU0hJRlQpKTsKLX0KLQotc3RhdGljIGRtYV9hZGRyX3QgaGFsMl9kZXNjX2FkZHIoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBpbnQgaSkKLXsKLQlpZiAoLS1pIDwgMCkKLQkJaSA9IGNvZGVjLT5kZXNjX2NvdW50IC0gMTsKLQlyZXR1cm4gY29kZWMtPmRlc2NbaV0uZGVzYy5wbmV4dDsKLX0KLQotc3RhdGljIHZvaWQgaGFsMl9zdGFydF9kYWMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKLQlzdHJ1Y3QgaGFsMl9wYnVzICpwYnVzID0gJmRhYy0+cGJ1czsKLQotCXBidXMtPnBidXMtPnBiZG1hX2RwdHIgPSBoYWwyX2Rlc2NfYWRkcihkYWMsIGRhYy0+dGFpbCk7Ci0JcGJ1cy0+cGJ1cy0+cGJkbWFfY3RybCA9IHBidXMtPmN0cmwgfCBIUEMzX1BETUFDVFJMX0FDVDsKLQkvKiBlbmFibGUgREFDICovCi0JaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfUE9SVF9FTiwgSDJJX0RNQV9QT1JUX0VOX0NPREVDVFgpOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX3N0YXJ0X2FkYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOwotCXN0cnVjdCBoYWwyX3BidXMgKnBidXMgPSAmYWRjLT5wYnVzOwotCi0JcGJ1cy0+cGJ1cy0+cGJkbWFfZHB0ciA9IGhhbDJfZGVzY19hZGRyKGFkYywgYWRjLT5oZWFkKTsKLQlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gcGJ1cy0+Y3RybCB8IEhQQzNfUERNQUNUUkxfQUNUOwotCS8qIGVuYWJsZSBBREMgKi8KLQloYWwyX2lfc2V0Yml0MTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOLCBIMklfRE1BX1BPUlRfRU5fQ09ERUNSKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhhbDJfc3RvcF9kYWMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQloYWwyLT5kYWMucGJ1cy5wYnVzLT5wYmRtYV9jdHJsID0gSFBDM19QRE1BQ1RSTF9MRDsKLQkvKiBUaGUgSEFMMiBpdHNlbGYgbWF5IHJlbWFpbiBlbmFibGVkIHNhZmVseSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFsMl9zdG9wX2FkYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCWhhbDItPmFkYy5wYnVzLnBidXMtPnBiZG1hX2N0cmwgPSBIUEMzX1BETUFDVFJMX0xEOwotfQotCi1zdGF0aWMgaW50IGhhbDJfYWxsb2NfZG1hYnVmKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYywgaW50IHNpemUsCi0JCQkgICAgIGludCBjb3VudCwgaW50IGNudGluZm8sIGludCBkaXIpCi17Ci0Jc3RydWN0IGhhbDJfZGVzYyAqZGVzYywgKmRtYV9hZGRyOwotCWludCBpOwotCi0JREVCVUcoImFsbG9jYXRpbmcgJWRrIERNQSBidWZmZXIuXG4iLCBzaXplIC8gMTAyNCk7Ci0KLQljb2RlYy0+YnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLAotCQkJCQkJCSAgZ2V0X29yZGVyKHNpemUpKTsKLQlpZiAoIWNvZGVjLT5idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCWRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgY291bnQgKiBzaXplb2Yoc3RydWN0IGhhbDJfZGVzYyksCi0JCQkJICAoZG1hX2FkZHJfdCAqKSZkbWFfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKSB7Ci0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpY29kZWMtPmJ1ZmZlciwgZ2V0X29yZGVyKHNpemUpKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWNvZGVjLT5kZXNjID0gZGVzYzsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlkZXNjLT5kZXNjLnBidWYgPSBkbWFfbWFwX3NpbmdsZShOVUxMLAotCQkJKHZvaWQgKikoY29kZWMtPmJ1ZmZlciArIGkgKiBIMl9CTE9DS19TSVpFKSwKLQkJCUgyX0JMT0NLX1NJWkUsIGRpcik7Ci0JCWRlc2MtPmRlc2MuY250aW5mbyA9IGNudGluZm87Ci0JCWRlc2MtPmRlc2MucG5leHQgPSAoaSA9PSBjb3VudCAtIDEpID8KLQkJCQkgICAodTMyKWRtYV9hZGRyIDogKHUzMikoZG1hX2FkZHIgKyBpICsgMSk7Ci0JCWRlc2MtPmNudCA9IDA7Ci0JCWRlc2MrKzsKLQl9Ci0JY29kZWMtPmRlc2NfY291bnQgPSBjb3VudDsKLQljb2RlYy0+aGVhZCA9IGNvZGVjLT50YWlsID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYWwyX2FsbG9jX2RhY19kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjKQotewotCXJldHVybiBoYWwyX2FsbG9jX2RtYWJ1Zihjb2RlYywgSDJfREFDX0JVRlNJWkUsCi0JCQkJIEgyX0RBQ19CVUZTSVpFIC8gSDJfQkxPQ0tfU0laRSwKLQkJCQkgSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1gsCi0JCQkJIERNQV9UT19ERVZJQ0UpOwotfQotCi1zdGF0aWMgaW50IGhhbDJfYWxsb2NfYWRjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCi17Ci0JcmV0dXJuIGhhbDJfYWxsb2NfZG1hYnVmKGNvZGVjLCBIMl9BRENfQlVGU0laRSwKLQkJCQkgSDJfQURDX0JVRlNJWkUgLyBIMl9CTE9DS19TSVpFLAotCQkJCSBIUENETUFfWElFIHwgSDJfQkxPQ0tfU0laRSwKLQkJCQkgRE1BX1RPX0RFVklDRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbDJfZnJlZV9kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBpbnQgc2l6ZSwgaW50IGRpcikKLXsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCWludCBpOwotCi0JZG1hX2FkZHIgPSBjb2RlYy0+ZGVzY1tjb2RlYy0+ZGVzY19jb3VudCAtIDFdLmRlc2MucG5leHQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5kZXNjX2NvdW50OyBpKyspCi0JCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgY29kZWMtPmRlc2NbaV0uZGVzYy5wYnVmLAotCQkJCSBIMl9CTE9DS19TSVpFLCBkaXIpOwotCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIGNvZGVjLT5kZXNjX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBoYWwyX2Rlc2MpLAotCQkJICAodm9pZCAqKWNvZGVjLT5kZXNjLCBkbWFfYWRkcik7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljb2RlYy0+YnVmZmVyLCBnZXRfb3JkZXIoc2l6ZSkpOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2ZyZWVfZGFjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCi17Ci0JcmV0dXJuIGhhbDJfZnJlZV9kbWFidWYoY29kZWMsIEgyX0RBQ19CVUZTSVpFLCBETUFfVE9fREVWSUNFKTsKLX0KLQotc3RhdGljIHZvaWQgaGFsMl9mcmVlX2FkY19kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjKQotewotCXJldHVybiBoYWwyX2ZyZWVfZG1hYnVmKGNvZGVjLCBIMl9BRENfQlVGU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLX0KLQotLyogCi0gKiBBZGQgJ2NvdW50JyBieXRlcyB0byAnYnVmZmVyJyBmcm9tIERNQSByaW5nIGJ1ZmZlcnMuIFJldHVybiBudW1iZXIgb2YKLSAqIGJ5dGVzIGFkZGVkIG9yIC1FRkFVTFQgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgotICovCi1zdGF0aWMgaW50IGhhbDJfZ2V0X2J1ZmZlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBjaGFyICpidWZmZXIsIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzaXplLCByZXQgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQlzdHJ1Y3QgaGFsMl9kZXNjICp0YWlsOwotCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOwotCi0JREVCVUcoImdldHRpbmcgJWQgYnl0ZXMgIiwgY291bnQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYy0+bG9jaywgZmxhZ3MpOwotCXRhaWwgPSAmYWRjLT5kZXNjW2FkYy0+dGFpbF07Ci0JLyogZW5hYmxlIERNQSBzdHJlYW0gaWYgdGhlcmUgYXJlIG5vIGRhdGEgKi8KLQlpZiAoIXRhaWwtPmNudCAmJiAhKGFkYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkpCi0JCWhhbDJfc3RhcnRfYWRjKGhhbDIpOwotCXdoaWxlICh0YWlsLT5jbnQgPiAwICYmIGNvdW50ID4gMCkgewotCQlzaXplID0gbWluKChpbnQpdGFpbC0+Y250LCBjb3VudCk7Ci0JCWJ1ZiA9ICZhZGMtPmJ1ZmZlclsoYWRjLT50YWlsICsgMSkgKiBIMl9CTE9DS19TSVpFIC0gdGFpbC0+Y250XTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0JCWRtYV9zeW5jX3NpbmdsZShOVUxMLCB0YWlsLT5kZXNjLnBidWYsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBidWYsIHNpemUpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYy0+bG9jaywgZmxhZ3MpOwotCQl0YWlsLT5jbnQgLT0gc2l6ZTsKLQkJLyogYnVmZmVyIGlzIGVtcHR5LCB1cGRhdGUgdGFpbCBwb2ludGVyICovCi0JCWlmICh0YWlsLT5jbnQgPT0gMCkgewotCQkJdGFpbC0+ZGVzYy5jbnRpbmZvID0gSFBDRE1BX1hJRSB8IEgyX0JMT0NLX1NJWkU7Ci0JCQloYWwyX2luY190YWlsKGFkYyk7Ci0JCQl0YWlsID0gJmFkYy0+ZGVzY1thZGMtPnRhaWxdOwotCQkJLyogZW5hYmxlIERNQSBzdHJlYW0gYWdhaW4gaWYgbmVlZGVkICovCi0JCQlpZiAoIShhZGMtPnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSVNBQ1QpKQotCQkJCWhhbDJfc3RhcnRfYWRjKGhhbDIpOwotCQl9Ci0JCWJ1ZmZlciArPSBzaXplOwotCQlyZXQgKz0gc2l6ZTsKLQkJY291bnQgLT0gc2l6ZTsKLQotCQlERUJVRygiKCVkKSAiLCBzaXplKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci1vdXQ6Ci0JREVCVUcoIlxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfSAKLQotLyogCi0gKiBBZGQgJ2NvdW50JyBieXRlcyBmcm9tICdidWZmZXInIHRvIERNQSByaW5nIGJ1ZmZlcnMuIFJldHVybiBudW1iZXIgb2YKLSAqIGJ5dGVzIGFkZGVkIG9yIC1FRkFVTFQgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgotICovCi1zdGF0aWMgaW50IGhhbDJfYWRkX2J1ZmZlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBjaGFyICpidWZmZXIsIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQlpbnQgc2l6ZSwgcmV0ID0gMDsKLQlzdHJ1Y3QgaGFsMl9kZXNjICpoZWFkOwotCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOwotCi0JREVCVUcoImFkZGluZyAlZCBieXRlcyAiLCBjb3VudCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci0JaGVhZCA9ICZkYWMtPmRlc2NbZGFjLT5oZWFkXTsKLQl3aGlsZSAoaGVhZC0+Y250ID09IDAgJiYgY291bnQgPiAwKSB7Ci0JCXNpemUgPSBtaW4oKGludClIMl9CTE9DS19TSVpFLCBjb3VudCk7Ci0JCWJ1ZiA9ICZkYWMtPmJ1ZmZlcltkYWMtPmhlYWQgKiBIMl9CTE9DS19TSVpFXTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgc2l6ZSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlkbWFfc3luY19zaW5nbGUoTlVMTCwgaGVhZC0+ZGVzYy5wYnVmLCBzaXplLCBETUFfVE9fREVWSUNFKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhYy0+bG9jaywgZmxhZ3MpOwotCQloZWFkLT5kZXNjLmNudGluZm8gPSBzaXplIHwgSFBDRE1BX1hJRTsKLQkJaGVhZC0+Y250ID0gc2l6ZTsKLQkJYnVmZmVyICs9IHNpemU7Ci0JCXJldCArPSBzaXplOwotCQljb3VudCAtPSBzaXplOwotCQloYWwyX2luY19oZWFkKGRhYyk7Ci0JCWhlYWQgPSAmZGFjLT5kZXNjW2RhYy0+aGVhZF07Ci0KLQkJREVCVUcoIiglZCkgIiwgc2l6ZSk7Ci0JfQotCWlmICghKGRhYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkgJiYgcmV0ID4gMCkKLQkJaGFsMl9zdGFydF9kYWMoaGFsMik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci1vdXQ6Ci0JREVCVUcoIlxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIGhhbDJfcmVzZXRfZGFjX3BvaW50ZXIoaGFsMikJaGFsMl9yZXNldF9wb2ludGVyKGhhbDIsIDEpCi0jZGVmaW5lIGhhbDJfcmVzZXRfYWRjX3BvaW50ZXIoaGFsMikJaGFsMl9yZXNldF9wb2ludGVyKGhhbDIsIDApCi1zdGF0aWMgdm9pZCBoYWwyX3Jlc2V0X3BvaW50ZXIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgaW50IGlzX2RhYykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMgPSAoaXNfZGFjKSA/ICZoYWwyLT5kYWMgOiAmaGFsMi0+YWRjOwotCi0JREVCVUcoImhhbDJfcmVzZXRfcG9pbnRlclxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmRlc2NfY291bnQ7IGkrKykgewotCQljb2RlYy0+ZGVzY1tpXS5jbnQgPSAwOwotCQljb2RlYy0+ZGVzY1tpXS5kZXNjLmNudGluZm8gPSBIUENETUFfWElFIHwgKGlzX2RhYykgPwotCQkJCQkgICAgICBIUENETUFfRU9YIDogSDJfQkxPQ0tfU0laRTsKLQl9Ci0JY29kZWMtPmhlYWQgPSBjb2RlYy0+dGFpbCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGFsMl9zeW5jX2RhYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2lnbmVkIGxvbmcgdGltZW91dCA9IDEwMDAgKiBIMl9CTE9DS19TSVpFICogMiAqIGRhYy0+dm9pY2VzICoKLQkJCSAgICAgIEhaIC8gZGFjLT5zYW1wbGVfcmF0ZSAvIDkwMDsKLQotCXdoaWxlIChkYWMtPnBidXMucGJ1cy0+cGJkbWFfY3RybCAmIEhQQzNfUERNQUNUUkxfSVNBQ1QpIHsKLQkJYWRkX3dhaXRfcXVldWUoJmRhYy0+ZG1hX3dhaXQsICZ3YWl0KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhYy0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZGFjLT5kZXNjW2RhYy0+dGFpbF0uY250KQotCQkJcmV0ID0gLUVUSU1FOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQlpZiAocmV0KSB7Ci0JCQloYWwyX3N0b3BfZGFjKGhhbDIpOwotCQkJaGFsMl9yZXNldF9kYWNfcG9pbnRlcihoYWwyKTsKLQkJfQotCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZGFjLT5kbWFfd2FpdCwgJndhaXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaGFsMl93cml0ZV9taXhlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBpbnQgaW5kZXgsIGludCB2b2wpCi17Ci0JdW5zaWduZWQgaW50IGwsIHIsIHRtcDsKLQotCURFQlVHX01JWCgibWl4ZXIgJWQgd3JpdGVcbiIsIGluZGV4KTsKLQotCWlmIChpbmRleCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2luZGV4XS5hdmFpbCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyID0gKHZvbCA+PiA4KSAmIDB4ZmY7Ci0JaWYgKHIgPiAxMDApCi0JCXIgPSAxMDA7Ci0JbCA9IHZvbCAmIDB4ZmY7Ci0JaWYgKGwgPiAxMDApCi0JCWwgPSAxMDA7Ci0KLQloYWwyLT5taXhlci52b2x1bWVbbWl4dGFibGVbaW5kZXhdLmlkeF0gPSBsIHwgKHIgPDwgOCk7Ci0KLQlzd2l0Y2ggKG1peHRhYmxlW2luZGV4XS5pZHgpIHsKLQljYXNlIEgyX01JWF9PVVRQVVRfQVRUOgotCi0JCURFQlVHX01JWCgib3V0cHV0IGF0dGVudWF0b3IgJWQsJWRcbiIsIGwsIHIpOwotCi0JCWlmIChyIHwgbCkgewotCQkJdG1wID0gaGFsMl9pX2xvb2szMihoYWwyLCBIMklfREFDX0MyKTsKLQkJCXRtcCAmPSB+KEgySV9DMl9MX0FUVF9NIHwgSDJJX0MyX1JfQVRUX00gfCBIMklfQzJfTVVURSk7Ci0KLQkJCS8qIEF0dGVudWF0b3IgaGFzIGZpdmUgYml0cyAqLwotCQkJbCA9IDMxICogKDEwMCAtIGwpIC8gOTk7Ci0JCQlyID0gMzEgKiAoMTAwIC0gcikgLyA5OTsKLQotCQkJREVCVUdfTUlYKCJsZWZ0OiAlZCwgcmlnaHQgJWRcbiIsIGwsIHIpOwotCi0JCQl0bXAgfD0gKGwgPDwgSDJJX0MyX0xfQVRUX1NISUZUKSAmIEgySV9DMl9MX0FUVF9NOwotCQkJdG1wIHw9IChyIDw8IEgySV9DMl9SX0FUVF9TSElGVCkgJiBIMklfQzJfUl9BVFRfTTsKLQkJCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9EQUNfQzIsIHRtcCk7Ci0JCX0gZWxzZSAKLQkJCWhhbDJfaV9zZXRiaXQzMihoYWwyLCBIMklfREFDX0MyLCBIMklfQzJfTVVURSk7Ci0JCWJyZWFrOwotCWNhc2UgSDJfTUlYX0lOUFVUX0dBSU46Ci0KLQkJREVCVUdfTUlYKCJpbnB1dCBnYWluICVkLCVkXG4iLCBsLCByKTsKLQotCQl0bXAgPSBoYWwyX2lfbG9vazMyKGhhbDIsIEgySV9BRENfQzIpOwotCQl0bXAgJj0gfihIMklfQzJfTF9HQUlOX00gfCBIMklfQzJfUl9HQUlOX00pOwotCi0JCS8qIEdhaW4gY29udHJvbCBoYXMgZm91ciBiaXRzICovCi0JCWwgPSAxNiAqIGwgLyAxMDA7Ci0JCXIgPSAxNiAqIHIgLyAxMDA7Ci0KLQkJREVCVUdfTUlYKCJsZWZ0OiAlZCwgcmlnaHQgJWRcbiIsIGwsIHIpOwotCi0JCXRtcCB8PSAobCA8PCBIMklfQzJfTF9HQUlOX1NISUZUKSAmIEgySV9DMl9MX0dBSU5fTTsKLQkJdG1wIHw9IChyIDw8IEgySV9DMl9SX0dBSU5fU0hJRlQpICYgSDJJX0MyX1JfR0FJTl9NOwotCQloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfQURDX0MyLCB0bXApOwotCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoYWwyX2luaXRfbWl4ZXIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKLQkJaWYgKG1peHRhYmxlW2ldLmF2YWlsKQotCQkJaGFsMi0+bWl4ZXIudm9sdW1lW21peHRhYmxlW2ldLmlkeF0gPSAxMDAgfCAoMTAwIDw8IDgpOwotCi0JLyogZGlzYWJsZSBhdHRlbnVhdG9yICovCi0JaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0RBQ19DMiwgMCk7Ci0JLyogc2V0IG1heCBpbnB1dCBnYWluICovCi0JaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0FEQ19DMiwgSDJJX0MyX01VVEUgfAotCQkJKEgySV9DMl9MX0dBSU5fTSA8PCBIMklfQzJfTF9HQUlOX1NISUZUKSB8Ci0JCQkoSDJJX0MyX1JfR0FJTl9NIDw8IEgySV9DMl9SX0dBSU5fU0hJRlQpKTsKLQkvKiBzZXQgbWF4IHZvbHVtZSAqLwotCWhhbDItPm1peGVyLm1hc3RlciA9IDB4ZmY7Ci0JaGFsMi0+dm9sX3JlZ3MtPmxlZnQgPSAweGZmOwotCWhhbDItPnZvbF9yZWdzLT5yaWdodCA9IDB4ZmY7Ci19Ci0KLS8qCi0gKiBYWFg6IGxhdGVyIGknbGwgaW1wbGVtZW50IG1peGVyIGZvciBtYWluIHZvbHVtZSB3aGljaCB3aWxsIGJlIGRpc2FibGVkCi0gKiBieSBkZWZhdWx0LiBlbmFibGluZyBpdCB1c2VycyB3aWxsIGJlIGFsbG93ZWQgdG8gaGF2ZSBtYXN0ZXIgdm9sdW1lIGxldmVsCi0gKiBjb250cm9sIG9uIHBhbmVsIGluIHRoZWlyIGZhdm91cml0ZSBYIGRlc2t0b3AKLSAqLwotc3RhdGljIHZvaWQgaGFsMl92b2x1bWVfY29udHJvbChpbnQgZGlyZWN0aW9uKQotewotCXVuc2lnbmVkIGludCBtYXN0ZXIgPSBoYWwyX2NhcmRbMF0tPm1peGVyLm1hc3RlcjsKLQlzdHJ1Y3QgaGFsMl92b2xfcmVncyAqdm9sID0gaGFsMl9jYXJkWzBdLT52b2xfcmVnczsKLQotCS8qIHZvbHVtZSB1cCAqLwotCWlmIChkaXJlY3Rpb24gPiAwICYmIG1hc3RlciA8IDB4ZmYpCi0JCW1hc3RlcisrOwotCS8qIHZvbHVtZSBkb3duICovCi0JZWxzZSBpZiAoZGlyZWN0aW9uIDwgMCAmJiBtYXN0ZXIgPiAwKQotCQltYXN0ZXItLTsKLQkvKiBUT0RPOiBtdXRlL3VubXV0ZSAqLwotCXZvbC0+bGVmdCA9IG1hc3RlcjsKLQl2b2wtPnJpZ2h0ID0gbWFzdGVyOwotCWhhbDJfY2FyZFswXS0+bWl4ZXIubWFzdGVyID0gbWFzdGVyOwotfQotCi1zdGF0aWMgaW50IGhhbDJfbWl4ZXJfaW9jdGwoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgdmFsOwotCi0gICAgICAgIGlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgewotCQltaXhlcl9pbmZvIGluZm87Ci0KLQkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotCQlzdHJsY3B5KGluZm8uaWQsIGhhbDJzdHIsIHNpemVvZihpbmZvLmlkKSk7Ci0JCXN0cmxjcHkoaW5mby5uYW1lLCBoYWwyc3RyLCBzaXplb2YoaW5mby5uYW1lKSk7Ci0JCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBoYWwyLT5taXhlci5tb2RjbnQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7Ci0JCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOwotCi0JCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQkJc3RybGNweShpbmZvLmlkLCBoYWwyc3RyLCBzaXplb2YoaW5mby5pZCkpOwotCQlzdHJsY3B5KGluZm8ubmFtZSwgaGFsMnN0ciwgc2l6ZW9mKGluZm8ubmFtZSkpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKLQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOwotCi0JaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICBpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1JFQUQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgewotCQkvKiBHaXZlIHRoZSBjdXJyZW50IHJlY29yZCBzb3VyY2UgKi8KLQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCQl2YWwgPSAwOwkvKiBGSVhNRSAqLwotCQkJYnJlYWs7Ci0JCS8qIEdpdmUgdGhlIHN1cHBvcnRlZCBtaXhlcnMsIGFsbCBvZiB0aGVtIHN1cHBvcnQgc3RlcmVvICovCi0gICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogewotCQkJaW50IGk7Ci0KLQkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKLQkJCQlpZiAobWl4dGFibGVbaV0uYXZhaWwpCi0JCQkJCXZhbCB8PSAxIDw8IGk7Ci0JCQlicmVhazsKLQkJCX0KLQkJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCi0gICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQkJdmFsID0gMDsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKLQkJCXZhbCA9IDA7Ci0JCQlicmVhazsKLQkJLyogUmVhZCBhIHNwZWNpZmljIG1peGVyICovCi0JCWRlZmF1bHQ6IHsKLQkJCWludCBpID0gX0lPQ19OUihjbWQpOwotCi0JCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2ldLmF2YWlsKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJdmFsID0gaGFsMi0+bWl4ZXIudm9sdW1lW21peHRhYmxlW2ldLmlkeF07Ci0JCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKLQl9Ci0KLSAgICAgICAgaWYgKF9JT0NfRElSKGNtZCkgIT0gKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQloYWwyLT5taXhlci5tb2RjbnQrKzsKLQotCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7Ci0JLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KLQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJcmV0dXJuIDA7CS8qIEZJWE1FICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIGhhbDJfd3JpdGVfbWl4ZXIoaGFsMiwgX0lPQ19OUihjbWQpLCB2YWwpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhhbDJfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IGhhbDJfbWl4ZXJfZmluZF9jYXJkKGltaW5vcihpbm9kZSkpOwotCi0JaWYgKGhhbDIpIHsKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaGFsMjsKLQkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBoYWwyX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhhbDJfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlyZXR1cm4gaGFsMl9taXhlcl9pb2N0bCgoc3RydWN0IGhhbDJfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YSwgY21kLCBhcmcpOwotfQotCi1zdGF0aWMgaW50IGhhbDJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAotCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgdmFsOwotCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50ICopYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQlyZXR1cm4gaGFsMl9zeW5jX2RhYyhoYWwyKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX01VTFRJLCAoaW50ICopYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCWhhbDJfc3RvcF9hZGMoaGFsMik7Ci0JCQloYWwyX3Jlc2V0X2FkY19wb2ludGVyKGhhbDIpOwotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKLQkJCWhhbDJfcmVzZXRfZGFjX3BvaW50ZXIoaGFsMik7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0KLSAJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKLQkJCXZhbCA9IGhhbDJfY29tcHV0ZV9yYXRlKCZoYWwyLT5hZGMsIHZhbCk7Ci0JCQloYWwyLT5hZGMuc2FtcGxlX3JhdGUgPSB2YWw7Ci0JCQloYWwyX3NldF9hZGNfcmF0ZShoYWwyKTsKLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCWhhbDJfc3RvcF9kYWMoaGFsMik7Ci0JCQl2YWwgPSBoYWwyX2NvbXB1dGVfcmF0ZSgmaGFsMi0+ZGFjLCB2YWwpOwotCQkJaGFsMi0+ZGFjLnNhbXBsZV9yYXRlID0gdmFsOwotCQkJaGFsMl9zZXRfZGFjX3JhdGUoaGFsMik7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgotCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKLQkJCWhhbDItPmFkYy52b2ljZXMgPSAodmFsKSA/IDIgOiAxOwotCQkJaGFsMl9zZXR1cF9hZGMoaGFsMik7Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQloYWwyX3N0b3BfZGFjKGhhbDIpOwotCQkJaGFsMi0+ZGFjLnZvaWNlcyA9ICh2YWwpID8gMiA6IDE7Ci0JCQloYWwyX3NldHVwX2RhYyhoYWwyKTsKLSAgICAgICAgICAgICAgICB9Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgotCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsICE9IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKLQkJCQloYWwyLT5hZGMudm9pY2VzID0gKHZhbCA9PSAxKSA/IDEgOiAyOwotCQkJCWhhbDJfc2V0dXBfYWRjKGhhbDIpOwotCQkJfQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKLQkJCQloYWwyLT5kYWMudm9pY2VzID0gKHZhbCA9PSAxKSA/IDEgOiAyOwotCQkJCWhhbDJfc2V0dXBfZGFjKGhhbDIpOwotCQkJfQotCQl9Ci0JCXZhbCA9IC1FSU5WQUw7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gaGFsMi0+YWRjLnZvaWNlczsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJdmFsID0gaGFsMi0+ZGFjLnZvaWNlczsKLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoSDJfU1VQUE9SVEVEX0ZPUk1BVFMsIChpbnQgKilhcmcpOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KLQkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7Ci0JCQlpZiAoISh2YWwgJiBIMl9TVVBQT1JURURfRk9STUFUUykpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCWhhbDJfc3RvcF9hZGMoaGFsMik7Ci0JCQkJaGFsMi0+YWRjLmZvcm1hdCA9IHZhbDsKLQkJCQloYWwyX3NldHVwX2FkYyhoYWwyKTsKLQkJCX0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCWhhbDJfc3RvcF9kYWMoaGFsMik7Ci0JCQkJaGFsMi0+ZGFjLmZvcm1hdCA9IHZhbDsKLQkJCQloYWwyX3NldHVwX2RhYyhoYWwyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXZhbCA9IC1FSU5WQUw7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSBoYWwyLT5hZGMuZm9ybWF0OwotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IGhhbDItPmRhYy5mb3JtYXQ7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7Ci0KLQljYXNlIFNORENUTF9EU1BfUE9TVDoKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOiB7Ci0JCWF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKLQotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaW5mby5mcmFnbWVudHMgPSAwOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBkYWMtPmRlc2NfY291bnQ7IGkrKykKLQkJCWlmIChkYWMtPmRlc2NbaV0uY250ID09IDApCi0JCQkJaW5mby5mcmFnbWVudHMrKzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci0JCWluZm8uZnJhZ3N0b3RhbCA9IGRhYy0+ZGVzY19jb3VudDsKLQkJaW5mby5mcmFnc2l6ZSA9IEgyX0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICAgICAgaW5mby5ieXRlcyA9IGluZm8uZnJhZ3NpemUgKiBpbmZvLmZyYWdtZW50czsKLQotCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSA/IC1FRkFVTFQgOiAwOwotCX0KLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6IHsKLQkJYXVkaW9fYnVmX2luZm8gaW5mbzsKLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOwotCi0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZm8uZnJhZ21lbnRzID0gMDsKLQkJaW5mby5ieXRlcyA9IDA7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZGMtPmxvY2ssIGZsYWdzKTsKLQkJZm9yIChpID0gMDsgaSA8IGFkYy0+ZGVzY19jb3VudDsgaSsrKQotCQkJaWYgKGFkYy0+ZGVzY1tpXS5jbnQgPiAwKSB7Ci0JCQkJaW5mby5mcmFnbWVudHMrKzsKLQkJCQlpbmZvLmJ5dGVzICs9IGFkYy0+ZGVzY1tpXS5jbnQ7Ci0JCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYy0+bG9jaywgZmxhZ3MpOwotCQlpbmZvLmZyYWdzdG90YWwgPSBhZGMtPmRlc2NfY291bnQ7Ci0JCWluZm8uZnJhZ3NpemUgPSBIMl9CTE9DS19TSVpFOwotCi0JCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JfQotCi0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCXJldHVybiBwdXRfdXNlcihIMl9CTE9DS19TSVpFLCAoaW50ICopYXJnKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JCXZhbCA9IC1FSU5WQUw7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gaGFsMi0+YWRjLnNhbXBsZV9yYXRlOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSBoYWwyLT5kYWMuc2FtcGxlX3JhdGU7Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJdmFsID0gLUVJTlZBTDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSBoYWwyLT5hZGMudm9pY2VzOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSBoYWwyLT5kYWMudm9pY2VzOwotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJcmV0dXJuIHB1dF91c2VyKDE2LCAoaW50ICopYXJnKTsKLQl9Ci0KLQlyZXR1cm4gaGFsMl9taXhlcl9pb2N0bChoYWwyLCBjbWQsIGFyZyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGhhbDJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmZmVyLAotCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXNzaXplX3QgZXJyOwotCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7Ci0KLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gMDsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGMtPnNlbSkpCi0JCXJldHVybiAtRUlOVFI7Ci0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCWVyciA9IGhhbDJfZ2V0X2J1ZmZlcihoYWwyLCBidWZmZXIsIGNvdW50KTsKLQkJZXJyID0gZXJyID09IDAgPyAtRUFHQUlOIDogZXJyOwotCX0gZWxzZSB7Ci0JCWRvIHsKLQkJCS8qIH4xMCUgbG9uZ2VyICovCi0JCQlzaWduZWQgbG9uZyB0aW1lb3V0ID0gMTAwMCAqIEgyX0JMT0NLX1NJWkUgKgotCQkJCTIgKiBhZGMtPnZvaWNlcyAqIEhaIC8gYWRjLT5zYW1wbGVfcmF0ZSAvIDkwMDsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCXNzaXplX3QgY250ID0gMDsKLQotCQkJZXJyID0gaGFsMl9nZXRfYnVmZmVyKGhhbDIsIGJ1ZmZlciwgY291bnQpOwotCQkJaWYgKGVyciA+IDApIHsKLQkJCQljb3VudCAtPSBlcnI7Ci0JCQkJY250ICs9IGVycjsKLQkJCQlidWZmZXIgKz0gZXJyOwotCQkJCWVyciA9IGNudDsKLQkJCX0KLQkJCWlmIChjb3VudCA+IDAgJiYgZXJyID49IDApIHsKLQkJCQlhZGRfd2FpdF9xdWV1ZSgmYWRjLT5kbWFfd2FpdCwgJndhaXQpOwotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKCFhZGMtPmRlc2NbYWRjLT50YWlsXS5jbnQpCi0JCQkJCWVyciA9IC1FQUdBSU47Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQllcnIgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmFkYy0+ZG1hX3dhaXQsICZ3YWl0KTsKLQkJCQlpZiAoZXJyIDwgMCkgewotCQkJCQloYWwyX3N0b3BfYWRjKGhhbDIpOwotCQkJCQloYWwyX3Jlc2V0X2FkY19wb2ludGVyKGhhbDIpOwotCQkJCX0KLQkJCX0KLQkJfSB3aGlsZSAoY291bnQgPiAwICYmIGVyciA+PSAwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGMtPnNlbSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCBoYWwyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXNzaXplX3QgZXJyOwotCWNoYXIgKmJ1ZiA9IChjaGFyKikgYnVmZmVyOwotCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDIgPSAoc3RydWN0IGhhbDJfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7Ci0KLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gMDsKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkYWMtPnNlbSkpCi0JCXJldHVybiAtRUlOVFI7Ci0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCWVyciA9IGhhbDJfYWRkX2J1ZmZlcihoYWwyLCBidWYsIGNvdW50KTsKLQkJZXJyID0gZXJyID09IDAgPyAtRUFHQUlOIDogZXJyOwotCX0gZWxzZSB7Ci0JCWRvIHsKLQkJCS8qIH4xMCUgbG9uZ2VyICovCi0JCQlzaWduZWQgbG9uZyB0aW1lb3V0ID0gMTAwMCAqIEgyX0JMT0NLX1NJWkUgKgotCQkJCTIgKiBkYWMtPnZvaWNlcyAqIEhaIC8gZGFjLT5zYW1wbGVfcmF0ZSAvIDkwMDsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCXNzaXplX3QgY250ID0gMDsKLQotCQkJZXJyID0gaGFsMl9hZGRfYnVmZmVyKGhhbDIsIGJ1ZiwgY291bnQpOwotCQkJaWYgKGVyciA+IDApIHsKLQkJCQljb3VudCAtPSBlcnI7Ci0JCQkJY250ICs9IGVycjsKLQkJCQlidWYgKz0gZXJyOwotCQkJCWVyciA9IGNudDsKLQkJCX0KLQkJCWlmIChjb3VudCA+IDAgJiYgZXJyID49IDApIHsKLQkJCQlhZGRfd2FpdF9xdWV1ZSgmZGFjLT5kbWFfd2FpdCwgJndhaXQpOwotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKGRhYy0+ZGVzY1tkYWMtPmhlYWRdLmNudCkKLQkJCQkJZXJyID0gLUVBR0FJTjsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKLQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJCWVyciA9IC1FUkVTVEFSVFNZUzsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZGFjLT5kbWFfd2FpdCwgJndhaXQpOwotCQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJCWhhbDJfc3RvcF9kYWMoaGFsMik7Ci0JCQkJCWhhbDJfcmVzZXRfZGFjX3BvaW50ZXIoaGFsMik7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlIChjb3VudCA+IDAgJiYgZXJyID49IDApOwotCX0KLQltdXRleF91bmxvY2soJmRhYy0+c2VtKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFsMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0Jc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOwotCi0JCXBvbGxfd2FpdChmaWxlLCAmYWRjLT5kbWFfd2FpdCwgd2FpdCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZGMtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGFkYy0+ZGVzY1thZGMtPnRhaWxdLmNudCA+IDApCi0JCQltYXNrIHw9IFBPTExJTjsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOwotCi0JCXBvbGxfd2FpdChmaWxlLCAmZGFjLT5kbWFfd2FpdCwgd2FpdCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkYWMtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGRhYy0+ZGVzY1tkYWMtPmhlYWRdLmNudCA9PSAwKQotCQkJbWFzayB8PSBQT0xMT1VUOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGludCBoYWwyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gaGFsMl9kc3BfZmluZF9jYXJkKGltaW5vcihpbm9kZSkpOwotCi0JaWYgKCFoYWwyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBoYWwyOwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOwotCi0JCWlmIChhZGMtPnVzZWNvdW50KQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJLyogT1NTIHNwZWMgd2FudGVkIHVzIHRvIHVzZSA4IGJpdCwgOCBrSHogbW9ubyBieSBkZWZhdWx0LAotCQkgKiBidXQgSEFMMiBjYW4ndCBkbyA4Yml0IGF1ZGlvICovCi0JCWFkYy0+Zm9ybWF0ID0gQUZNVF9TMTZfQkU7Ci0JCWFkYy0+dm9pY2VzID0gMTsKLQkJYWRjLT5zYW1wbGVfcmF0ZSA9IGhhbDJfY29tcHV0ZV9yYXRlKGFkYywgODAwMCk7Ci0JCWhhbDJfc2V0X2FkY19yYXRlKGhhbDIpOwotCQllcnIgPSBoYWwyX2FsbG9jX2FkY19kbWFidWYoYWRjKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWhhbDJfc2V0dXBfYWRjKGhhbDIpOwotCQlhZGMtPnVzZWNvdW50Kys7Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKLQotCQlpZiAoZGFjLT51c2Vjb3VudCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWRhYy0+Zm9ybWF0ID0gQUZNVF9TMTZfQkU7Ci0JCWRhYy0+dm9pY2VzID0gMTsKLQkJZGFjLT5zYW1wbGVfcmF0ZSA9IGhhbDJfY29tcHV0ZV9yYXRlKGRhYywgODAwMCk7Ci0JCWhhbDJfc2V0X2RhY19yYXRlKGhhbDIpOwotCQllcnIgPSBoYWwyX2FsbG9jX2RhY19kbWFidWYoZGFjKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWhhbDJfc2V0dXBfZGFjKGhhbDIpOwotCQlkYWMtPnVzZWNvdW50Kys7Ci0JfQotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGhhbDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gKHN0cnVjdCBoYWwyX2NhcmQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7Ci0KLQkJbXV0ZXhfbG9jaygmYWRjLT5zZW0pOwotCQloYWwyX3N0b3BfYWRjKGhhbDIpOwotCQloYWwyX2ZyZWVfYWRjX2RtYWJ1ZihhZGMpOwotCQlhZGMtPnVzZWNvdW50LS07Ci0JCW11dGV4X3VubG9jaygmYWRjLT5zZW0pOwotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7Ci0KLQkJbXV0ZXhfbG9jaygmZGFjLT5zZW0pOwotCQloYWwyX3N5bmNfZGFjKGhhbDIpOwotCQloYWwyX2ZyZWVfZGFjX2RtYWJ1ZihkYWMpOwotCQlkYWMtPnVzZWNvdW50LS07Ci0JCW11dGV4X3VubG9jaygmZGFjLT5zZW0pOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoYWwyX2F1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGhhbDJfcmVhZCwKLQkud3JpdGUJCT0gaGFsMl93cml0ZSwKLQkucG9sbAkJPSBoYWwyX3BvbGwsCi0JLmlvY3RsCQk9IGhhbDJfaW9jdGwsCi0JLm9wZW4JCT0gaGFsMl9vcGVuLAotCS5yZWxlYXNlCT0gaGFsMl9yZWxlYXNlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGFsMl9taXhlcl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gaGFsMl9pb2N0bF9taXhkZXYsCi0JLm9wZW4JCT0gaGFsMl9vcGVuX21peGRldiwKLQkucmVsZWFzZQk9IGhhbDJfcmVsZWFzZV9taXhkZXYsCi19OwotCi1zdGF0aWMgdm9pZCBoYWwyX2luaXRfY29kZWMoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaHBjM19yZWdzICpocGMzLAotCQkJICAgIGludCBpbmRleCkKLXsKLQljb2RlYy0+cGJ1cy5wYnVzbnIgPSBpbmRleDsKLQljb2RlYy0+cGJ1cy5wYnVzID0gJmhwYzMtPnBiZG1hW2luZGV4XTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb2RlYy0+ZG1hX3dhaXQpOwotCW11dGV4X2luaXQoJmNvZGVjLT5zZW0pOwotCXNwaW5fbG9ja19pbml0KCZjb2RlYy0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGFsMl9kZXRlY3Qoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKLXsKLQl1bnNpZ25lZCBzaG9ydCBib2FyZCwgbWFqb3IsIG1pbm9yOwotCXVuc2lnbmVkIHNob3J0IHJldjsKLQotCS8qIHJlc2V0IEhBTDIgKi8KLQloYWwyX2lzcl93cml0ZShoYWwyLCAwKTsKLQkvKiByZWxlYXNlIHJlc2V0ICovCi0JaGFsMl9pc3Jfd3JpdGUoaGFsMiwgSDJfSVNSX0dMT0JBTF9SRVNFVF9OIHwgSDJfSVNSX0NPREVDX1JFU0VUX04pOwotCi0JaGFsMl9pX3dyaXRlMTYoaGFsMiwgSDJJX1JFTEFZX0MsIEgySV9SRUxBWV9DX1NUQVRFKTsgCi0JaWYgKChyZXYgPSBoYWwyX3Jldl9sb29rKGhhbDIpKSAmIEgyX1JFVl9BVURJT19QUkVTRU5UKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWJvYXJkID0gKHJldiAmIEgyX1JFVl9CT0FSRF9NKSA+PiAxMjsKLQltYWpvciA9IChyZXYgJiBIMl9SRVZfTUFKT1JfQ0hJUF9NKSA+PiA0OwotCW1pbm9yID0gKHJldiAmIEgyX1JFVl9NSU5PUl9DSElQX00pOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiU0dJIEhBTDIgcmV2aXNpb24gJWkuJWkuJWlcbiIsCi0JICAgICAgIGJvYXJkLCBtYWpvciwgbWlub3IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGFsMl9pbml0X2NhcmQoc3RydWN0IGhhbDJfY2FyZCAqKnBoYWwyLCBzdHJ1Y3QgaHBjM19yZWdzICpocGMzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBoYWwyX2NhcmQgKmhhbDI7Ci0KLQloYWwyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhhbDJfY2FyZCksIEdGUF9LRVJORUwpOwotCWlmICghaGFsMikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQloYWwyLT5jdGxfcmVncyA9IChzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqKWhwYzMtPnBidXNfZXh0cmVnc1swXTsKLQloYWwyLT5hZXNfcmVncyA9IChzdHJ1Y3QgaGFsMl9hZXNfcmVncyAqKWhwYzMtPnBidXNfZXh0cmVnc1sxXTsKLQloYWwyLT52b2xfcmVncyA9IChzdHJ1Y3QgaGFsMl92b2xfcmVncyAqKWhwYzMtPnBidXNfZXh0cmVnc1syXTsKLQloYWwyLT5zeW5fcmVncyA9IChzdHJ1Y3QgaGFsMl9zeW5fcmVncyAqKWhwYzMtPnBidXNfZXh0cmVnc1szXTsKLQotCWlmIChoYWwyX2RldGVjdChoYWwyKSA8IDApIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX2NhcmQ7Ci0JfQotCi0JaGFsMl9pbml0X2NvZGVjKCZoYWwyLT5kYWMsIGhwYzMsIDApOwotCWhhbDJfaW5pdF9jb2RlYygmaGFsMi0+YWRjLCBocGMzLCAxKTsKLQotCS8qCi0JICogQWxsIERNQSBjaGFubmVsIGludGVyZmFjZXMgaW4gSEFMMiBhcmUgZGVzaWduZWQgdG8gb3BlcmF0ZSB3aXRoCi0JICogUEJVUyBwcm9ncmFtbWVkIGZvciAyIGN5Y2xlcyBpbiBEMywgMiBjeWNsZXMgaW4gRDQgYW5kIDIgY3ljbGVzCi0JICogaW4gRDUuIEhBTDIgaXMgYSAxNi1iaXQgZGV2aWNlIHdoaWNoIGNhbiBhY2NlcHQgYm90aCBiaWcgYW5kIGxpdHRsZQotCSAqIGVuZGlhbiBmb3JtYXQuIEl0IGFzc3VtZXMgdGhhdCBldmVuIGFkZHJlc3MgYnl0ZXMgYXJlIG9uIGhpZ2gKLQkgKiBwb3J0aW9uIG9mIFBCVVMgKDE1OjgpIGFuZCBhc3N1bWVzIHRoYXQgSFBDMyBpcyBwcm9ncmFtbWVkIHRvCi0JICogYWNjZXB0IGEgbGl2ZSAodW5zeW5jaHJvbml6ZWQpIHZlcnNpb24gb2YgUF9EUkVRX04gZnJvbSBIQUwyLgotCSAqLwotI2RlZmluZSBIQUwyX1BCVVNfRE1BQ0ZHICgoMCA8PCBIUEMzX0RNQUNGR19EM1JfU0hJRlQpIHwgXAotCQkJICAoMiA8PCBIUEMzX0RNQUNGR19ENFJfU0hJRlQpIHwgXAotCQkJICAoMiA8PCBIUEMzX0RNQUNGR19ENVJfU0hJRlQpIHwgXAotCQkJICAoMCA8PCBIUEMzX0RNQUNGR19EM1dfU0hJRlQpIHwgXAotCQkJICAoMiA8PCBIUEMzX0RNQUNGR19ENFdfU0hJRlQpIHwgXAotCQkJICAoMiA8PCBIUEMzX0RNQUNGR19ENVdfU0hJRlQpIHwgXAotCQkJCUhQQzNfRE1BQ0ZHX0RTMTYgfCBcCi0JCQkJSFBDM19ETUFDRkdfRVZFTkhJIHwgXAotCQkJCUhQQzNfRE1BQ0ZHX1JUSU1FIHwgXAotCQkJICAoOCA8PCBIUEMzX0RNQUNGR19CVVJTVF9TSElGVCkgfCBcCi0JCQkJSFBDM19ETUFDRkdfRFJRTElWRSkKLQkvKgotCSAqIElnbm9yZSB3aGF0J3MgbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uIGFuZCB3cml0ZSB2YWx1ZSB3aGljaAotCSAqIHdvcmtzIGluIFRoZSBSZWFsIFdvcmxkIChUTSkKLQkgKi8KLQlocGMzLT5wYnVzX2RtYWNmZ1toYWwyLT5kYWMucGJ1cy5wYnVzbnJdWzBdID0gMHg4MjA4ODQ0OwotCWhwYzMtPnBidXNfZG1hY2ZnW2hhbDItPmFkYy5wYnVzLnBidXNucl1bMF0gPSAweDgyMDg4NDQ7Ci0KLQlpZiAocmVxdWVzdF9pcnEoU0dJX0hQQ0RNQV9JUlEsIGhhbDJfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCWhhbDJzdHIsIGhhbDIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSEFMMjogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgU0dJX0hQQ0RNQV9JUlEpOwotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIGZyZWVfY2FyZDsKLQl9Ci0KLQloYWwyLT5kZXZfZHNwID0gcmVnaXN0ZXJfc291bmRfZHNwKCZoYWwyX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoaGFsMi0+ZGV2X2RzcCA8IDApIHsKLQkJcmV0ID0gaGFsMi0+ZGV2X2RzcDsKLQkJZ290byBmcmVlX2lycTsKLQl9Ci0KLQloYWwyLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmaGFsMl9taXhlcl9mb3BzLCAtMSk7Ci0JaWYgKGhhbDItPmRldl9taXhlciA8IDApIHsKLQkJcmV0ID0gaGFsMi0+ZGV2X21peGVyOwotCQlnb3RvIHVucmVnaXN0ZXJfZHNwOwotCX0KLQotCWhhbDJfaW5pdF9taXhlcihoYWwyKTsKLQotCSpwaGFsMiA9IGhhbDI7Ci0JcmV0dXJuIDA7Ci11bnJlZ2lzdGVyX2RzcDoKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChoYWwyLT5kZXZfZHNwKTsKLWZyZWVfaXJxOgotCWZyZWVfaXJxKFNHSV9IUENETUFfSVJRLCBoYWwyKTsKLWZyZWVfY2FyZDoKLQlrZnJlZShoYWwyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWV4dGVybiB2b2lkICgqaW5keV92b2x1bWVfYnV0dG9uKShpbnQpOwotCi0vKiAKLSAqIEFzc3VtaW5nIG9ubHkgb25lIEhBTDIgY2FyZC4gTWFpbCBtZSBpZiB5b3UgZXZlciBtZWV0IG1hY2hpbmUgd2l0aAotICogbW9yZSB0aGFuIG9uZS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9oYWwyKHZvaWQpCi17Ci0JaW50IGksIGVycm9yOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWENBUkRTOyBpKyspCi0JCWhhbDJfY2FyZFtpXSA9IE5VTEw7Ci0KLQllcnJvciA9IGhhbDJfaW5pdF9jYXJkKCZoYWwyX2NhcmRbMF0sIGhwYzNjMCk7Ci0KLQkvKiBsZXQgSW5keSdzIHZvbHVtZSBidXR0b25zIHdvcmsgKi8KLQlpZiAoIWVycm9yICYmICFpcDIyX2lzX2Z1bGxob3VzZSgpKQotCQlpbmR5X3ZvbHVtZV9idXR0b24gPSBoYWwyX3ZvbHVtZV9jb250cm9sOwotCi0JcmV0dXJuIGVycm9yOwotCi19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hhbDIodm9pZCkKLXsKLQlpbnQgaTsKLQotCS8qIHVucmVnaXN0ZXIgdm9sdW1lIGJ1dG9ucyBjYWxsYmFjayBmdW5jdGlvbiAqLwotCWluZHlfdm9sdW1lX2J1dHRvbiA9IE5VTEw7Ci0JCi0JZm9yIChpID0gMDsgaSA8IE1BWENBUkRTOyBpKyspCi0JCWlmIChoYWwyX2NhcmRbaV0pIHsKLQkJCWZyZWVfaXJxKFNHSV9IUENETUFfSVJRLCBoYWwyX2NhcmRbaV0pOwotCQkJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoaGFsMl9jYXJkW2ldLT5kZXZfZHNwKTsKLQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoaGFsMl9jYXJkW2ldLT5kZXZfbWl4ZXIpOwotCQkJa2ZyZWUoaGFsMl9jYXJkW2ldKTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfaGFsMik7Ci1tb2R1bGVfZXhpdChleGl0X2hhbDIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk9TUyBjb21wYXRpYmxlIGRyaXZlciBmb3IgU0dJIEhBTDIgYXVkaW8iKTsKLU1PRFVMRV9BVVRIT1IoIkxhZGlzbGF2IE1pY2hsIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaGFsMi5oIGIvc291bmQvb3NzL2hhbDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkM2I1Mi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvaGFsMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLSNpZm5kZWYgX19IQUwyX0gKLSNkZWZpbmUgX19IQUwyX0gKLQotLyoKLSAqICBEcml2ZXIgZm9yIEhBTDIgc291bmQgcHJvY2Vzc29ycwotICogIENvcHlyaWdodCAoYykgMTk5OSBVbGYgQ2FybHNzb24gPHVsZmNAYnVuLmZhbGtlbmJlcmcuc2U+Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyogSW5kaXJlY3Qgc3RhdHVzIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgSDJfSVNSX1RTVEFUVVMJCTB4MDEJLyogUk86IHRyYW5zYWN0aW9uIHN0YXR1cyAxPWJ1c3kgKi8KLSNkZWZpbmUgSDJfSVNSX1VTVEFUVVMJCTB4MDIJLyogUk86IHV0aW1lIHN0YXR1cyBiaXQgMT1hcm1lZCAqLwotI2RlZmluZSBIMl9JU1JfUVVBRF9NT0RFCTB4MDQJLyogY29kZWMgbW9kZSAwPWluZGlnbyAxPXF1YWQgKi8KLSNkZWZpbmUgSDJfSVNSX0dMT0JBTF9SRVNFVF9OCTB4MDgJLyogY2hpcCBnbG9iYWwgcmVzZXQgMD1yZXNldCAqLwotI2RlZmluZSBIMl9JU1JfQ09ERUNfUkVTRVRfTgkweDEwCS8qIGNvZGVjL3N5bnRoIHJlc2V0IDA9cmVzZXQgICovCi0KLS8qIFJldmlzaW9uIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgSDJfUkVWX0FVRElPX1BSRVNFTlQJMHg4MDAwCS8qIFJPOiBhdWRpbyBwcmVzZW50IDA9cHJlc2VudCAqLwotI2RlZmluZSBIMl9SRVZfQk9BUkRfTQkJMHg3MDAwCS8qIFJPOiBiaXRzIDE0OjEyLCBib2FyZCByZXZpc2lvbiAqLwotI2RlZmluZSBIMl9SRVZfTUFKT1JfQ0hJUF9NCTB4MDBGMAkvKiBSTzogYml0cyA3OjQsIG1ham9yIGNoaXAgcmV2aXNpb24gKi8KLSNkZWZpbmUgSDJfUkVWX01JTk9SX0NISVBfTQkweDAwMEYJLyogUk86IGJpdHMgMzowLCBtaW5vciBjaGlwIHJldmlzaW9uICovCi0KLS8qIEluZGlyZWN0IGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQotLyoKLSAqIEFkZHJlc3Mgb2YgaW5kaXJlY3QgaW50ZXJuYWwgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQuIEEgd3JpdGUgdG8gdGhpcwotICogcmVnaXN0ZXIgaW5pdGlhdGVzIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRvIHRoZSBpbmRpcmVjdCByZWdpc3RlcnMgaW4gdGhlCi0gKiBIQUwyLiBOb3RlIHRoYXQgdGhlcmUgYWYgZm91ciBpbmRpcmVjdCBkYXRhIHJlZ2lzdGVycyBmb3Igd3JpdGUgYWNjZXNzIHRvCi0gKiByZWdpc3RlcnMgbGFyZ2VyIHRoYW4gMTYgYnl0ZS4KLSAqLwotCi0jZGVmaW5lIEgyX0lBUl9UWVBFX00JCTB4RjAwMAkvKiBiaXRzIDE1OjEyLCB0eXBlIG9mIGZ1bmN0aW9uYWwgKi8KLQkJCQkJLyogYmxvY2sgdGhlIHJlZ2lzdGVyIHJlc2lkZXMgaW4gKi8KLQkJCQkJLyogMT1ETUEgUG9ydCAqLwotCQkJCQkvKiA5PUdsb2JhbCBETUEgQ29udHJvbCAqLwotCQkJCQkvKiAyPUJyZXNlbmhhbSAqLwotCQkJCQkvKiAzPVVuaXggVGltZXIgKi8KLSNkZWZpbmUgSDJfSUFSX05VTV9NCQkweDBGMDAJLyogYml0cyAxMTo4IGluc3RhbmNlIG9mIHRoZSAqLwotCQkJCQkvKiBibG9ja2luIHdoaWNoIHRoZSBpbmRpcmVjdCAqLwotCQkJCQkvKiByZWdpc3RlciByZXNpZGVzICovCi0JCQkJCS8qIElmIElBUl9UWVBFX009RE1BIFBvcnQ6ICovCi0JCQkJCS8qIDE9U3ludGggSW4gKi8KLQkJCQkJLyogMj1BRVMgSW4gKi8KLQkJCQkJLyogMz1BRVMgT3V0ICovCi0JCQkJCS8qIDQ9REFDIE91dCAqLwotCQkJCQkvKiA1PUFEQyBPdXQgKi8KLQkJCQkJLyogNj1TeW50aCBDb250cm9sICovCi0JCQkJCS8qIElmIElBUl9UWVBFX009R2xvYmFsIERNQSBDb250cm9sOiAqLwotCQkJCQkvKiAxPUNvbnRyb2wgKi8KLQkJCQkJLyogSWYgSUFSX1RZUEVfTT1CcmVzZW5oYW06ICovCi0JCQkJCS8qIDE9QnJlc2VuaGFtIENsb2NrIEdlbiAxICovCi0JCQkJCS8qIDI9QnJlc2VuaGFtIENsb2NrIEdlbiAyICovCi0JCQkJCS8qIDM9QnJlc2VuaGFtIENsb2NrIEdlbiAzICovCi0JCQkJCS8qIElmIElBUl9UWVBFX009VW5peCBUaW1lcjogKi8KLQkJCQkJLyogMT1Vbml4IFRpbWVyICovCi0jZGVmaW5lIEgyX0lBUl9BQ0NFU1NfU0VMRUNUCTB4MDA4MAkvKiAxPXJlYWQgMD13cml0ZSAqLwotI2RlZmluZSBIMl9JQVJfUEFSQU0JCTB4MDAwQwkvKiBQYXJhbWV0ZXIgU2VsZWN0ICovCi0jZGVmaW5lIEgyX0lBUl9SQl9JTkRFWF9NCTB4MDAwMwkvKiBSZWFkIEJhY2sgSW5kZXggKi8KLQkJCQkJLyogMDA6d29yZDAgKi8KLQkJCQkJLyogMDE6d29yZDEgKi8KLQkJCQkJLyogMTA6d29yZDIgKi8KLQkJCQkJLyogMTE6d29yZDMgKi8KLS8qCi0gKiBIQUwyIGludGVybmFsIGFkZHJlc3NpbmcKLSAqCi0gKiBUaGUgSEFMMiBoYXMgImluZGlyZWN0IHJlZ2lzdGVycyIgKGlkcikgd2hpY2ggYXJlIGFjY2Vzc2VkIGJ5IHdyaXRpbmcgdG8gdGhlCi0gKiBJbmRpcmVjdCBEYXRhIHJlZ2lzdGVycy4gV3JpdGUgdGhlIGFkZHJlc3MgdG8gdGhlIEluZGlyZWN0IEFkZHJlc3MgcmVnaXN0ZXIKLSAqIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgotICoKLSAqIFdlIGRlZmluZSB0aGUgSDJJUl8qIHRvIHRoZSByZWFkIGFkZHJlc3MgYW5kIEgySVdfKiB0byB0aGUgd3JpdGUgYWRkcmVzcyBhbmQKLSAqIEgySV8qIHRvIGJlIGZpZWxkcyBpbiB3aGF0ZXZlciByZWdpc3RlciBpcyByZWZlcnJlZCB0by4KLSAqCi0gKiBXaGVuIHdlIHdyaXRlIHRvIGluZGlyZWN0IHJlZ2lzdGVycyB3aGljaCBhcmUgbGFyZ2VyIHRoYW4gb25lIHdvcmQgKDE2IGJpdCkKLSAqIHdlIGhhdmUgdG8gZmlsbCBtb3JlIHRoYW4gb25lIGluZGlyZWN0IHJlZ2lzdGVyIGJlZm9yZSB3cml0aW5nLiBXaGVuIHdlIHJlYWQKLSAqIGJhY2sgaG93ZXZlciB3ZSBoYXZlIHRvIHJlYWQgc2V2ZXJhbCB0aW1lcywgZWFjaCB0aW1lIHdpdGggZGlmZmVyZW50IFJlYWQKLSAqIEJhY2sgSW5kZXhlcyAodGhlcmUgYXJlIGRlZnMgZm9yIGRvaW5nIHRoaXMgZWFzaWx5KS4KLSAqLwotCi0vKgotICogUmVsYXkgQ29udHJvbAotICovCi0jZGVmaW5lIEgySV9SRUxBWV9DCQkweDkxMDAKLSNkZWZpbmUgSDJJX1JFTEFZX0NfU1RBVEUJMHgwMQkJLyogc3RhdGUgb2YgUkVMQVkgcGluIHNpZ25hbCAqLwotCi0vKiBETUEgcG9ydCBlbmFibGUgKi8KLQotI2RlZmluZSBIMklfRE1BX1BPUlRfRU4JCTB4OTEwNAotI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fU1lfSU4JMHgwMQkJLyogU3ludGhfaW4gRE1BIHBvcnQgKi8KLSNkZWZpbmUgSDJJX0RNQV9QT1JUX0VOX0FFU1JYCTB4MDIJCS8qIEFFUyByZWNlaXZlciBETUEgcG9ydCAqLwotI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fQUVTVFgJMHgwNAkJLyogQUVTIHRyYW5zbWl0dGVyIERNQSBwb3J0ICovCi0jZGVmaW5lIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1RYCTB4MDgJCS8qIENPREVDIHRyYW5zbWl0IERNQSBwb3J0ICovCi0jZGVmaW5lIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1IJMHgxMAkJLyogQ09ERUMgcmVjZWl2ZSBETUEgcG9ydCAqLwotCi0jZGVmaW5lIEgySV9ETUFfRU5ECQkweDkxMDggCQkvKiBnbG9iYWwgZG1hIGVuZGlhbiBzZWxlY3QgKi8KLSNkZWZpbmUgSDJJX0RNQV9FTkRfU1lfSU4JMHgwMQkJLyogU3ludGhfaW4gRE1BIHBvcnQgKi8KLSNkZWZpbmUgSDJJX0RNQV9FTkRfQUVTUlgJMHgwMgkJLyogQUVTIHJlY2VpdmVyIERNQSBwb3J0ICovCi0jZGVmaW5lIEgySV9ETUFfRU5EX0FFU1RYCTB4MDQJCS8qIEFFUyB0cmFuc21pdHRlciBETUEgcG9ydCAqLwotI2RlZmluZSBIMklfRE1BX0VORF9DT0RFQ1RYCTB4MDgJCS8qIENPREVDIHRyYW5zbWl0IERNQSBwb3J0ICovCi0jZGVmaW5lIEgySV9ETUFfRU5EX0NPREVDUgkweDEwCQkvKiBDT0RFQyByZWNlaXZlIERNQSBwb3J0ICovCi0JCQkJCQkvKiAwPWJfZW5kIDE9bF9lbmQgKi8KLQotI2RlZmluZSBIMklfRE1BX0RSVgkJMHg5MTBDICAJLyogZ2xvYmFsIFBCVVMgRE1BIGVuYWJsZSAqLwotCi0jZGVmaW5lIEgySV9TWU5USF9DCQkweDExMDQJCS8qIFN5bnRoIERNQSBjb250cm9sICovCi0KLSNkZWZpbmUgSDJJX0FFU1JYX0MJCTB4MTIwNAkgCS8qIEFFUyBSWCBkbWEgY29udHJvbCAqLwotCi0jZGVmaW5lIEgySV9DX1RTX0VOCQkweDIwCQkvKiBUaW1lc3RhbXAgZW5hYmxlICovCi0jZGVmaW5lIEgySV9DX1RTX0ZSTVQJCTB4NDAJCS8qIFRpbWVzdGFtcCBmb3JtYXQgKi8KLSNkZWZpbmUgSDJJX0NfTkFVRElPCQkweDgwCQkvKiBTaWduIGV4dGVuZCAqLwotCi0vKiBBRVNSWCBDVEwsIDE2IGJpdCAqLwotCi0jZGVmaW5lIEgySV9BRVNUWF9DCQkweDEzMDQJCS8qIEFFUyBUWCBETUEgY29udHJvbCAqLwotI2RlZmluZSBIMklfQUVTVFhfQ19DTEtJRF9TSElGVAkzCQkvKiBCcmVzZW5oYW0gQ2xvY2sgR2VuIDEtMyAqLwotI2RlZmluZSBIMklfQUVTVFhfQ19DTEtJRF9NCTB4MTgKLSNkZWZpbmUgSDJJX0FFU1RYX0NfREFUQVRfU0hJRlQJOAkJLyogMT1tb25vIDI9c3RlcmVvICgzPXF1YWQpICovCi0jZGVmaW5lIEgySV9BRVNUWF9DX0RBVEFUX00JMHgzMDAKLQotLyogQ09ERUMgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgSDJJX0RBQ19DMQkJMHgxNDA0IAkJLyogREFDIERNQSBjb250cm9sLCAxNiBiaXQgKi8KLSNkZWZpbmUgSDJJX0RBQ19DMgkJMHgxNDA4CQkvKiBEQUMgRE1BIGNvbnRyb2wsIDMyIGJpdCAqLwotI2RlZmluZSBIMklfQURDX0MxCQkweDE1MDQgCQkvKiBBREMgRE1BIGNvbnRyb2wsIDE2IGJpdCAqLwotI2RlZmluZSBIMklfQURDX0MyCQkweDE1MDgJCS8qIEFEQyBETUEgY29udHJvbCwgMzIgYml0ICovCi0KLS8qIEJpdHMgaW4gQ1RMMSByZWdpc3RlciAqLwotCi0jZGVmaW5lIEgySV9DMV9ETUFfU0hJRlQJMAkJLyogRE1BIGNoYW5uZWwgKi8KLSNkZWZpbmUgSDJJX0MxX0RNQV9NCQkweDcKLSNkZWZpbmUgSDJJX0MxX0NMS0lEX1NISUZUCTMJCS8qIEJyZXNlbmhhbSBDbG9jayBHZW4gMS0zICovCi0jZGVmaW5lIEgySV9DMV9DTEtJRF9NCQkweDE4Ci0jZGVmaW5lIEgySV9DMV9EQVRBVF9TSElGVAk4CQkvKiAxPW1vbm8gMj1zdGVyZW8gKDM9cXVhZCkgKi8KLSNkZWZpbmUgSDJJX0MxX0RBVEFUX00JCTB4MzAwCi0KLS8qIEJpdHMgaW4gQ1RMMiByZWdpc3RlciAqLwotCi0jZGVmaW5lIEgySV9DMl9SX0dBSU5fU0hJRlQJMAkJLyogcmlnaHQgYS9kIGlucHV0IGdhaW4gKi8JCi0jZGVmaW5lIEgySV9DMl9SX0dBSU5fTQkJMHhmCQotI2RlZmluZSBIMklfQzJfTF9HQUlOX1NISUZUCTQJCS8qIGxlZnQgYS9kIGlucHV0IGdhaW4gKi8KLSNkZWZpbmUgSDJJX0MyX0xfR0FJTl9NCQkweGYwCi0jZGVmaW5lIEgySV9DMl9SX1NFTAkJMHgxMDAJCS8qIHJpZ2h0IGlucHV0IHNlbGVjdCAqLwotI2RlZmluZSBIMklfQzJfTF9TRUwJCTB4MjAwCQkvKiBsZWZ0IGlucHV0IHNlbGVjdCAqLwotI2RlZmluZSBIMklfQzJfTVVURQkJMHg0MDAJCS8qIG11dGUgKi8KLSNkZWZpbmUgSDJJX0MyX0RPMQkJMHgwMDAxMDAwMAkvKiBkaWdpdGFsIG91dHB1dCBwb3J0IGJpdCAwICovCi0jZGVmaW5lIEgySV9DMl9ETzIJCTB4MDAwMjAwMDAJLyogZGlnaXRhbCBvdXRwdXQgcG9ydCBiaXQgMSAqLwotI2RlZmluZSBIMklfQzJfUl9BVFRfU0hJRlQJMTgJCS8qIHJpZ2h0IGQvYSBvdXRwdXQgLSAqLwotI2RlZmluZSBIMklfQzJfUl9BVFRfTQkJMHgwMDdjMDAwMAkvKiBhdHRlbnVhdGlvbiAqLwotI2RlZmluZSBIMklfQzJfTF9BVFRfU0hJRlQJMjMJCS8qIGxlZnQgZC9hIG91dHB1dCAtICovCi0jZGVmaW5lIEgySV9DMl9MX0FUVF9NCQkweDBmODAwMDAwCS8qIGF0dGVudWF0aW9uICovCi0KLSNkZWZpbmUgSDJJX1NZTlRIX01BUF9DCQkweDExMDQJCS8qIHN5bnRoIGRtYSBoYW5kc2hha2UgY3RybCAqLwotCi0vKiBDbG9jayBnZW5lcmF0b3IgQ1RMIDEsIDE2IGJpdCAqLwotCi0jZGVmaW5lIEgySV9CUkVTMV9DMQkJMHgyMTA0Ci0jZGVmaW5lIEgySV9CUkVTMl9DMQkJMHgyMjA0Ci0jZGVmaW5lIEgySV9CUkVTM19DMQkJMHgyMzA0Ci0KLSNkZWZpbmUgSDJJX0JSRVNfQzFfU0hJRlQJMAkJLyogMD00OC4wIDE9NDQuMSAyPWFlc19yeCAqLwotI2RlZmluZSBIMklfQlJFU19DMV9NCQkweDAzCi0JCQkJCi0vKiBDbG9jayBnZW5lcmF0b3IgQ1RMIDIsIDMyIGJpdCAqLwotCi0jZGVmaW5lIEgySV9CUkVTMV9DMgkJMHgyMTA4Ci0jZGVmaW5lIEgySV9CUkVTMl9DMgkJMHgyMjA4Ci0jZGVmaW5lIEgySV9CUkVTM19DMgkJMHgyMzA4Ci0KLSNkZWZpbmUgSDJJX0JSRVNfQzJfSU5DX1NISUZUCTAJCS8qIGluY3JlbWVudCB2YWx1ZSAqLwotI2RlZmluZSBIMklfQlJFU19DMl9JTkNfTQkweGZmZmYKLSNkZWZpbmUgSDJJX0JSRVNfQzJfTU9EX1NISUZUCTE2CQkvKiBtb2Rjb250cm9sIHZhbHVlICovCi0jZGVmaW5lIEgySV9CUkVTX0MyX01PRF9NCTB4ZmZmZjAwMDAJLyogbW9kY3RybD0weGZmZmYmKG1vZGluYy0xKSAqLwotCi0vKiBVbml4IHRpbWVyLCA2NCBiaXQgKi8KLQotI2RlZmluZSBIMklfVVRJTUUJCTB4MzEwNAotI2RlZmluZSBIMklfVVRJTUVfMF9MRAkJMHhmZmZmCQkvKiBtaWNyb3NlY29uZHMsIExTQidzICovCi0jZGVmaW5lIEgySV9VVElNRV8xX0xEMAkJMHgwZgkJLyogbWljcm9zZWNvbmRzLCBNU0IncyAqLwotI2RlZmluZSBIMklfVVRJTUVfMV9MRDEJCTB4ZjAJCS8qIHRlbnRocyBvZiBtaWNyb3NlY29uZHMgKi8KLSNkZWZpbmUgSDJJX1VUSU1FXzJfTEQJCTB4ZmZmZgkJLyogc2Vjb25kcywgTFNCJ3MgKi8KLSNkZWZpbmUgSDJJX1VUSU1FXzNfTEQJCTB4ZmZmZgkJLyogc2Vjb25kcywgTVNCJ3MgKi8KLQotc3RydWN0IGhhbDJfY3RsX3JlZ3MgewotCXUzMiBfdW51c2VkMFs0XTsKLQl2b2xhdGlsZSB1MzIgaXNyOwkJLyogMHgxMCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQl1MzIgX3VudXNlZDFbM107Ci0Jdm9sYXRpbGUgdTMyIHJldjsJCS8qIDB4MjAgUmV2aXNpb24gUmVnaXN0ZXIgKi8KLQl1MzIgX3VudXNlZDJbM107Ci0Jdm9sYXRpbGUgdTMyIGlhcjsJCS8qIDB4MzAgSW5kaXJlY3QgQWRkcmVzcyBSZWdpc3RlciAqLwotCXUzMiBfdW51c2VkM1szXTsKLQl2b2xhdGlsZSB1MzIgaWRyMDsJCS8qIDB4NDAgSW5kaXJlY3QgRGF0YSBSZWdpc3RlciAwICovCi0JdTMyIF91bnVzZWQ0WzNdOwotCXZvbGF0aWxlIHUzMiBpZHIxOwkJLyogMHg1MCBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIDEgKi8KLQl1MzIgX3VudXNlZDVbM107Ci0Jdm9sYXRpbGUgdTMyIGlkcjI7CQkvKiAweDYwIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgMiAqLwotCXUzMiBfdW51c2VkNlszXTsKLQl2b2xhdGlsZSB1MzIgaWRyMzsJCS8qIDB4NzAgSW5kaXJlY3QgRGF0YSBSZWdpc3RlciAzICovCi19OwotCi1zdHJ1Y3QgaGFsMl9hZXNfcmVncyB7Ci0Jdm9sYXRpbGUgdTMyIHJ4X3N0YXRbMl07CS8qIFN0YXR1cyByZWdpc3RlcnMgKi8KLQl2b2xhdGlsZSB1MzIgcnhfY3JbMl07CQkvKiBDb250cm9sIHJlZ2lzdGVycyAqLwotCXZvbGF0aWxlIHUzMiByeF91ZFs0XTsJCS8qIFVzZXIgZGF0YSB3aW5kb3cgKi8KLQl2b2xhdGlsZSB1MzIgcnhfc3RbMjRdOwkJLyogQ2hhbm5lbCBzdGF0dXMgZGF0YSAqLwotCQotCXZvbGF0aWxlIHUzMiB0eF9zdGF0WzFdOwkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KLQl2b2xhdGlsZSB1MzIgdHhfY3JbM107CQkvKiBDb250cm9sIHJlZ2lzdGVycyAqLwotCXZvbGF0aWxlIHUzMiB0eF91ZFs0XTsJCS8qIFVzZXIgZGF0YSB3aW5kb3cgKi8KLQl2b2xhdGlsZSB1MzIgdHhfc3RbMjRdOwkJLyogQ2hhbm5lbCBzdGF0dXMgZGF0YSAqLwotfTsKLQotc3RydWN0IGhhbDJfdm9sX3JlZ3MgewotCXZvbGF0aWxlIHUzMiByaWdodDsJCS8qIFJpZ2h0IHZvbHVtZSAqLwotCXZvbGF0aWxlIHUzMiBsZWZ0OwkJLyogTGVmdCB2b2x1bWUgKi8KLX07Ci0KLXN0cnVjdCBoYWwyX3N5bl9yZWdzIHsKLQl1MzIgX3VudXNlZDBbMl07Ci0Jdm9sYXRpbGUgdTMyIHBhZ2U7CQkvKiBET0MgUGFnZSByZWdpc3RlciAqLwotCXZvbGF0aWxlIHUzMiByZWdzZWw7CQkvKiBET0MgUmVnaXN0ZXIgc2VsZWN0aW9uICovCi0Jdm9sYXRpbGUgdTMyIGRsb3c7CQkvKiBET0MgRGF0YSBsb3cgKi8KLQl2b2xhdGlsZSB1MzIgZGhpZ2g7CQkvKiBET0MgRGF0YSBoaWdoICovCi0Jdm9sYXRpbGUgdTMyIGlycTsJCS8qIElSUSBTdGF0dXMgKi8KLQl2b2xhdGlsZSB1MzIgZHJhbTsJCS8qIERSQU0gQWNjZXNzICovCi19OwotCi0jZW5kaWYJLyogX19IQUwyX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tcHU0MDEuYyBiL3NvdW5kL29zcy9tcHU0MDEuYwppbmRleCBhNjkwY2E1Li42YzBhNzcwIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvbXB1NDAxLmMKKysrIGIvc291bmQvb3NzL21wdTQwMS5jCkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogCQltcHU0MDFfY2hrX3ZlcnNpb24obSwgZGV2Yyk7CiAJCWlmIChkZXZjLT52ZXJzaW9uID09IDApCiAJCQltcHU0MDFfY2hrX3ZlcnNpb24obSwgZGV2Yyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwogCX0KIAogCWlmIChkZXZjLT52ZXJzaW9uICE9IDApCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRjYXJkLmMgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKaW5kZXggN2Q4OWMwOC4uNjFhYWVkYSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NvdW5kY2FyZC5jCisrKyBiL3NvdW5kL29zcy9zb3VuZGNhcmQuYwpAQCAtNTYwLDE5ICs1NjAsMTggQEAKIAlzb3VuZF9kbWFwX2ZsYWcgPSAoZG1hYnVmID4gMCA/IDEgOiAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldl9saXN0KTsgaSsrKSB7Ci0JCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShzb3VuZF9jbGFzcywgTlVMTCwKLQkJCQkgICAgICBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IpLAotCQkJCSAgICAgIE5VTEwsICIlcyIsIGRldl9saXN0W2ldLm5hbWUpOworCQlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAorCQkJICAgICAgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSwgTlVMTCwKKwkJCSAgICAgICIlcyIsIGRldl9saXN0W2ldLm5hbWUpOwogCiAJCWlmICghZGV2X2xpc3RbaV0ubnVtKQogCQkJY29udGludWU7CiAKIAkJZm9yIChqID0gMTsgaiA8ICpkZXZfbGlzdFtpXS5udW07IGorKykKLQkJCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShzb3VuZF9jbGFzcywgTlVMTCwKLQkJCQkJICAgICAgTUtERVYoU09VTkRfTUFKT1IsCi0JCQkJCQkgICAgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSksCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgICIlcyVkIiwgZGV2X2xpc3RbaV0ubmFtZSwgaik7CisJCQlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgIE1LREVWKFNPVU5EX01BSk9SLAorCQkJCQkgICAgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSksCisJCQkJICAgICAgTlVMTCwgIiVzJWQiLCBkZXZfbGlzdFtpXS5uYW1lLCBqKTsKIAl9CiAKIAlpZiAoc291bmRfbmJsb2NrcyA+PSAxMDI0KQpkaWZmIC0tZ2l0IGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYyBiL3NvdW5kL3BhcmlzYy9oYXJtb255LmMKaW5kZXggOTlmNTQ4My4uNDFmODcwZiAxMDA2NDQKLS0tIGEvc291bmQvcGFyaXNjL2hhcm1vbnkuYworKysgYi9zb3VuZC9wYXJpc2MvaGFybW9ueS5jCkBAIC04NjgsNyArODY4LDggQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBoLT5jYXJkOwogCWludCBpZHgsIGVycjsKIAotCXNuZF9hc3NlcnQoaCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWgpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiSGFybW9ueSBHYWluIGNvbnRyb2wgaW50ZXJmYWNlIik7CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEhBUk1PTllfQ09OVFJPTFM7IGlkeCsrKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvS2NvbmZpZyBiL3NvdW5kL3BjaS9LY29uZmlnCmluZGV4IDMxZjUyZDMuLjcwMDM3MTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC01MTcsNiArNTE3LDE0IEBACiAJICBUaGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCBmb3Igb3V0LW9mLWJhbmQgY29tbXVuaWNhdGlvbgogCSAgd2l0aCBjb2RlY3MgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KIAorY29uZmlnIFNORF9IREFfSU5QVVRfQkVFUAorCWJvb2wgIlN1cHBvcnQgZGlnaXRhbCBiZWVwIHZpYSBpbnB1dCBsYXllciIKKwlkZXBlbmRzIG9uIFNORF9IREFfSU5URUwKKwlkZXBlbmRzIG9uIElOUFVUPXkgfHwgSU5QVVQ9U05EX0hEQV9JTlRFTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYnVpbGQgYSBkaWdpdGFsIGJlZXAgaW50ZXJmYWNlIGZvciBIRC1hdWRpbworCSAgZHJpdmVyLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGdlbmVyYXRlIGRpZ2l0YWwgYmVlcHMuCisKIGNvbmZpZyBTTkRfSERBX0NPREVDX1JFQUxURUsKIAlib29sICJCdWlsZCBSZWFsdGVrIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMCkBAIC01NTcsNiArNTY1LDE0IEBACiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgQVRJIEhETUkgSEQtYXVkaW8gY29kZWMgc3VwcG9ydCBpbgogCSAgc25kLWhkYS1pbnRlbCBkcml2ZXIsIHN1Y2ggYXMgQVRJIFJTNjAwIEhETUkuCiAKK2NvbmZpZyBTTkRfSERBX0NPREVDX05WSERNSQorCWJvb2wgIkJ1aWxkIE5WSURJQSBIRE1JIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIE5WSURJQSBIRE1JIEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQgaW4KKwkgIHNuZC1oZGEtaW50ZWwgZHJpdmVyLCBzdWNoIGFzIE5WSURJQSBNQ1A3OCBIRE1JLgorCiBjb25maWcgU05EX0hEQV9DT0RFQ19DT05FWEFOVAogCWJvb2wgIkJ1aWxkIENvbmV4YW50IEhELWF1ZGlvIGNvZGVjIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTkRfSERBX0lOVEVMCkBAIC02NDksOCArNjY1LDkgQEAKIAogCSAgQ3VycmVudGx5IHN1cHBvcnRlZCBoYXJkd2FyZSBpczogTS1BdWRpbyBEZWx0YSAxMDEwKExUKSwKIAkgIERpTyAyNDk2LCA2NiwgNDQsIDQxMCwgQXVkaW9waGlsZSAyNC85NjsgRGlnaWdyYW0gVlg0NDI7Ci0JICBUZXJyYVRlYyBFV1ggMjQvOTYsIEVXUyA4OE1ULCA4OEQsIERNWCA2RmlyZSwgUGhhc2UgODg7Ci0JICBIb29udGVjaCBTb3VuZFRyYWNrIERTUCAyNC9WYWx1ZS9NZWRpYTcuMTsgRXZlbnQgRVo4LgorCSAgVGVycmFUZWMgRVdYIDI0Lzk2LCBFV1MgODhNVC9ELCBETVggNkZpcmUsIFBoYXNlIDg4OworCSAgSG9vbnRlY2ggU291bmRUcmFjayBEU1AgMjQvVmFsdWUvTWVkaWE3LjE7IEV2ZW50IEVaODsKKwkgIExpb25zdHJhY3MgTWVkaWFzdGF0aW9uLCBUZXJyYXNvbmlxIFRTIDg4LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtaWNlMTcxMi4KQEAgLTY2NSw5ICs2ODIsMTIgQEAKIAkgIElDRS9WVDE3MjQvMTcyMCAoRW52eTI0SFQvUFQpIGNoaXBzLgogCiAJICBDdXJyZW50bHkgc3VwcG9ydGVkIGhhcmR3YXJlIGlzOiBBTVAgQVVESU8yMDAwOyBNLUF1ZGlvCi0JICBSZXZvbHV0aW9uIDcuMTsgVGVycmFUZWMgQXVyZW9uIDUuMSBTa3ksIDcuMSBTcGFjZS9Vbml2ZXJzZTsKLQkgIEF1ZGlvVHJhayBQcm9kaWd5IDcuMTsgUG9udGlzIE1TMzAwOyBBbGJhdHJvbiBLOFg4MDAgUHJvIElJOwotCSAgQ2hhaW50ZWNoIFpORjMtMTUwLzI1MC4KKwkgIFJldm9sdXRpb24gNS4xLCA3LjEsIEF1ZGlvcGhpbGUgMTkyOyBUZXJyYVRlYyBBdXJlb24gNS4xIFNreSwKKwkgIDcuMSBTcGFjZS9Vbml2ZXJzZSwgUGhhc2UgMjIvMjg7IE9ua3lvIFNFLTkwUENJLCBTRS0yMDBQQ0k7CisJICBBdWRpb1RyYWsgUHJvZGlneSAxOTIsIDcuMSAoSElGSS9MVC9YVCksIEhEMjsgSGVyY3VsZXMKKwkgIEZvcnRpc3NpbW8gSVY7IEVTSSBKdWxpQDsgUG9udGlzIE1TMzAwOyBFR08tU1lTIFdhdmVUZXJtaW5hbAorCSAgMTkyTTsgQWxiYXRyb24gSzhYODAwIFBybyBJSTsgQ2hhaW50ZWNoIFpORjMtMTUwLzI1MCwgOUNKUywKKwkgIEFWLTcxMDsgU2h1dHRsZSBTTjI1UC4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLWljZTE3MjQuCkBAIC04NDUsNyArODY1LDggQEAKIAlzZWxlY3QgU05EX09YWUdFTl9MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmQgY2FyZHMgYmFzZWQgb24gdGhlCi0JICBBc3VzIEFWMTAwL0FWMjAwIGNoaXBzLCBpLmUuLCBYb25hciBEMSwgRFgsIEQyIGFuZCBEMlguCisJICBBc3VzIEFWMTAwL0FWMjAwIGNoaXBzLCBpLmUuLCBYb25hciBEMSwgRFgsIEQyLCBEMlggYW5kCisJICBIREFWMS4zIChEZWx1eGUpLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtdmlydHVvc28uCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggOGM0OWEwMC4uNjcwNGFjYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpAQCAtNjcsOCArNjcsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhYzk3X2NvZGVjX2lkIHNuZF9hYzk3X2NvZGVjX2lkX3ZlbmRvcnNbXSA9IHsKLXsgMHg0MTRiNGQwMCwgMHhmZmZmZmYwMCwgIkFzYWhpIEthc2VpIiwJTlVMTCwJTlVMTCB9LAogeyAweDQxNDQ1MzAwLCAweGZmZmZmZjAwLCAiQW5hbG9nIERldmljZXMiLAlOVUxMLAlOVUxMIH0sCit7IDB4NDE0YjRkMDAsIDB4ZmZmZmZmMDAsICJBc2FoaSBLYXNlaSIsCU5VTEwsCU5VTEwgfSwKIHsgMHg0MTRjNDMwMCwgMHhmZmZmZmYwMCwgIlJlYWx0ZWsiLAkJTlVMTCwJTlVMTCB9LAogeyAweDQxNGM0NzAwLCAweGZmZmZmZjAwLCAiUmVhbHRlayIsCQlOVUxMLAlOVUxMIH0sCiB7IDB4NDM0ZDQ5MDAsIDB4ZmZmZmZmMDAsICJDLU1lZGlhIEVsZWN0cm9uaWNzIiwgTlVMTCwJTlVMTCB9LApAQCAtOTQsMTEgKzk0LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWM5N19jb2RlY19pZCBzbmRfYWM5N19jb2RlY19pZHNbXSA9IHsKLXsgMHg0MTRiNGQwMCwgMHhmZmZmZmZmZiwgIkFLNDU0MCIsCQlOVUxMLAkJTlVMTCB9LAoteyAweDQxNGI0ZDAxLCAweGZmZmZmZmZmLCAiQUs0NTQyIiwJCU5VTEwsCQlOVUxMIH0sCi17IDB4NDE0YjRkMDIsIDB4ZmZmZmZmZmYsICJBSzQ1NDMiLAkJTlVMTCwJCU5VTEwgfSwKLXsgMHg0MTRiNGQwNiwgMHhmZmZmZmZmZiwgIkFLNDU0NEEiLAkJTlVMTCwJCU5VTEwgfSwKLXsgMHg0MTRiNGQwNywgMHhmZmZmZmZmZiwgIkFLNDU0NSIsCQlOVUxMLAkJTlVMTCB9LAogeyAweDQxNDQ1MzAzLCAweGZmZmZmZmZmLCAiQUQxODE5IiwJCXBhdGNoX2FkMTgxOSwJTlVMTCB9LAogeyAweDQxNDQ1MzQwLCAweGZmZmZmZmZmLCAiQUQxODgxIiwJCXBhdGNoX2FkMTg4MSwJTlVMTCB9LAogeyAweDQxNDQ1MzQ4LCAweGZmZmZmZmZmLCAiQUQxODgxQSIsCQlwYXRjaF9hZDE4ODEsCU5VTEwgfSwKQEAgLTExMiwyMCArMTA3LDI1IEBACiB7IDB4NDE0NDUzNzQsIDB4ZmZmZmZmZmYsICJBRDE5ODFCIiwJCXBhdGNoX2FkMTk4MWIsCU5VTEwgfSwKIHsgMHg0MTQ0NTM3NSwgMHhmZmZmZmZmZiwgIkFEMTk4NSIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKIHsgMHg0MTQ0NTM3OCwgMHhmZmZmZmZmZiwgIkFEMTk4NiIsCQlwYXRjaF9hZDE5ODYsCU5VTEwgfSwKK3sgMHg0MTRiNGQwMCwgMHhmZmZmZmZmZiwgIkFLNDU0MCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQxNGI0ZDAxLCAweGZmZmZmZmZmLCAiQUs0NTQyIiwJCU5VTEwsCQlOVUxMIH0sCit7IDB4NDE0YjRkMDIsIDB4ZmZmZmZmZmYsICJBSzQ1NDMiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MTRiNGQwNiwgMHhmZmZmZmZmZiwgIkFLNDU0NEEiLAkJTlVMTCwJCU5VTEwgfSwKK3sgMHg0MTRiNGQwNywgMHhmZmZmZmZmZiwgIkFLNDU0NSIsCQlOVUxMLAkJTlVMTCB9LAogeyAweDQxNGM0MzAwLCAweGZmZmZmZjAwLCAiQUxDMTAwLDEwMFAiLCAJTlVMTCwJCU5VTEwgfSwKIHsgMHg0MTRjNDcxMCwgMHhmZmZmZmZmMCwgIkFMQzIwMCwyMDBQIiwJTlVMTCwJCU5VTEwgfSwKIHsgMHg0MTRjNDcyMSwgMHhmZmZmZmZmZiwgIkFMQzY1MEQiLAkJTlVMTCwJTlVMTCB9LCAvKiBhbHJlYWR5IHBhdGNoZWQgKi8KIHsgMHg0MTRjNDcyMiwgMHhmZmZmZmZmZiwgIkFMQzY1MEUiLAkJTlVMTCwJTlVMTCB9LCAvKiBhbHJlYWR5IHBhdGNoZWQgKi8KIHsgMHg0MTRjNDcyMywgMHhmZmZmZmZmZiwgIkFMQzY1MEYiLAkJTlVMTCwJTlVMTCB9LCAvKiBhbHJlYWR5IHBhdGNoZWQgKi8KIHsgMHg0MTRjNDcyMCwgMHhmZmZmZmZmMCwgIkFMQzY1MCIsCQlwYXRjaF9hbGM2NTAsCU5VTEwgfSwKLXsgMHg0MTRjNDc2MCwgMHhmZmZmZmZmMCwgIkFMQzY1NSIsCQlwYXRjaF9hbGM2NTUsCU5VTEwgfSwKLXsgMHg0MTRjNDc4MSwgMHhmZmZmZmZmZiwgIkFMQzY1OEQiLAkJTlVMTCwJTlVMTCB9LCAvKiBhbHJlYWR5IHBhdGNoZWQgKi8KLXsgMHg0MTRjNDc4MCwgMHhmZmZmZmZmMCwgIkFMQzY1OCIsCQlwYXRjaF9hbGM2NTUsCU5VTEwgfSwKLXsgMHg0MTRjNDc5MCwgMHhmZmZmZmZmMCwgIkFMQzg1MCIsCQlwYXRjaF9hbGM4NTAsCU5VTEwgfSwKIHsgMHg0MTRjNDczMCwgMHhmZmZmZmZmZiwgIkFMQzEwMSIsCQlOVUxMLAkJTlVMTCB9LAogeyAweDQxNGM0NzQwLCAweGZmZmZmZmYwLCAiQUxDMjAyIiwJCU5VTEwsCQlOVUxMIH0sCiB7IDB4NDE0YzQ3NTAsIDB4ZmZmZmZmZjAsICJBTEMyNTAiLAkJTlVMTCwJCU5VTEwgfSwKLXsgMHg0MTRjNDc3MCwgMHhmZmZmZmZmMCwgIkFMQzIwMyIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDQxNGM0NzYwLCAweGZmZmZmZmYwLCAiQUxDNjU1IiwJCXBhdGNoX2FsYzY1NSwJTlVMTCB9LAoreyAweDQxNGM0NzcwLCAweGZmZmZmZmYwLCAiQUxDMjAzIiwJCXBhdGNoX2FsYzIwMywJTlVMTCB9LAoreyAweDQxNGM0NzgxLCAweGZmZmZmZmZmLCAiQUxDNjU4RCIsCQlOVUxMLAlOVUxMIH0sIC8qIGFscmVhZHkgcGF0Y2hlZCAqLworeyAweDQxNGM0NzgwLCAweGZmZmZmZmYwLCAiQUxDNjU4IiwJCXBhdGNoX2FsYzY1NSwJTlVMTCB9LAoreyAweDQxNGM0NzkwLCAweGZmZmZmZmYwLCAiQUxDODUwIiwJCXBhdGNoX2FsYzg1MCwJTlVMTCB9LAogeyAweDQzNGQ0OTQxLCAweGZmZmZmZmZmLCAiQ01JOTczOCIsCQlwYXRjaF9jbTk3MzgsCU5VTEwgfSwKIHsgMHg0MzRkNDk2MSwgMHhmZmZmZmZmZiwgIkNNSTk3MzkiLAkJcGF0Y2hfY205NzM5LAlOVUxMIH0sCiB7IDB4NDM0ZDQ5NjksIDB4ZmZmZmZmZmYsICJDTUk5NzgwIiwJCXBhdGNoX2NtOTc4MCwJTlVMTCB9LApAQCAtMTY4LDcgKzE2OCw3IEBACiB7IDB4NTQ1ODRlMjAsIDB4ZmZmZmZmZmYsICJUTEMzMjBBRDl4QyIsCU5VTEwsCQlOVUxMIH0sCiB7IDB4NTY0OTQxNjEsIDB4ZmZmZmZmZmYsICJWSUExNjEyQSIsCQlOVUxMLAkJTlVMTCB9LCAvLyBtb2RpZmllZCBJQ0UxMjMyIHdpdGggUy9QRElGCiB7IDB4NTY0OTQxNzAsIDB4ZmZmZmZmZmYsICJWSUExNjE3QSIsCQlwYXRjaF92dDE2MTdhLAlOVUxMIH0sIC8vIG1vZGlmaWVkIFZUMTYxNiB3aXRoIFMvUERJRgoteyAweDU2NDk0MTgyLCAweGZmZmZmZmZmLCAiVklBMTYxOCIsCQlOVUxMLAkJTlVMTCB9LAoreyAweDU2NDk0MTgyLCAweGZmZmZmZmZmLCAiVklBMTYxOCIsCQlwYXRjaF92dDE2MTgsICAgTlVMTCB9LAogeyAweDU3NDU0MzAxLCAweGZmZmZmZmZmLCAiVzgzOTcxRCIsCQlOVUxMLAkJTlVMTCB9LAogeyAweDU3NGQ0YzAwLCAweGZmZmZmZmZmLCAiV005NzAxLFdNOTcwMUEiLAlOVUxMLAkJTlVMTCB9LAogeyAweDU3NGQ0QzAzLCAweGZmZmZmZmZmLCAiV005NzAzLFdNOTcwNyxXTTk3MDgsV005NzE3IiwgcGF0Y2hfd29sZnNvbjAzLCBOVUxMfSwKQEAgLTE4OTAsOCArMTg5MCw4IEBACiAJCS5kZXZfZnJlZSA9CXNuZF9hYzk3X2J1c19kZXZfZnJlZSwKIAl9OwogCi0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KHJidXMgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJYnVzID0ga3phbGxvYyhzaXplb2YoKmJ1cyksIEdGUF9LRVJORUwpOwogCWlmIChidXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTA2LDcgKzE5MDYsOCBAQAogCQlzbmRfYWM5N19idXNfZnJlZShidXMpOwogCQlyZXR1cm4gZXJyOwogCX0KLQkqcmJ1cyA9IGJ1czsKKwlpZiAocmJ1cykKKwkJKnJidXMgPSBidXM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTEsMTAgKzE5OTIsMTQgQEAKIAkJLmRldl9kaXNjb25uZWN0ID0Jc25kX2FjOTdfZGV2X2Rpc2Nvbm5lY3QsCiAJfTsKIAotCXNuZF9hc3NlcnQocmFjOTcgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCSpyYWM5NyA9IE5VTEw7Ci0Jc25kX2Fzc2VydChidXMgIT0gTlVMTCAmJiB0ZW1wbGF0ZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCh0ZW1wbGF0ZS0+bnVtIDwgNCAmJiBidXMtPmNvZGVjW3RlbXBsYXRlLT5udW1dID09IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAocmFjOTcpCisJCSpyYWM5NyA9IE5VTEw7CisJaWYgKHNuZF9CVUdfT04oIWJ1cyB8fCAhdGVtcGxhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTih0ZW1wbGF0ZS0+bnVtID49IDQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYnVzLT5jb2RlY1t0ZW1wbGF0ZS0+bnVtXSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWNhcmQgPSBidXMtPmNhcmQ7CiAJYWM5NyA9IGt6YWxsb2Moc2l6ZW9mKCphYzk3KSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKaW5kZXggZjRmYmM3OS4uNmU4MzFhZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiB9CiAKIC8qCi0gKiBNYXkgMiwgMjAwMyBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBNYXkgMiwgMjAwMyBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogIHJlbW92ZWQgYnJva2VuIHdvbGZzb24wMCBwYXRjaC4KICAqICBhZGRlZCBzdXBwb3J0IGZvciBXTTk3MDUsV005NzA4LFdNOTcwOSxXTTk3MTAsV005NzExLFdNOTcxMiBhbmQgV005NzE3LgogICovCkBAIC0yNTYwLDYgKzI1NjAsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIHJlYWx0ZWsgQUxDMjAzOiB1c2UgbW9uby1vdXQgZm9yIHBpbiAzNworICovCitzdGF0aWMgaW50IHBhdGNoX2FsYzIwMyhzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgMHg3YSwgMHg0MDAsIDB4NDAwKTsKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIHJlYWx0ZWsgQUxDNjV4Lzg1MCBjb2RlY3MKQEAgLTM0NTcsNyArMzQ2NSw3IEBACiAKIC8qCiAgKiB1bmZvcnR1bmF0ZWx5LCB0aGUgdnQxNjE3YSBzdGFzaGVzIHRoZSB0d2lkZGxlcnMgcmVxdWlyZWQgZm9yCi0gKiBub29kaW5nIHRoZSBpL28gamFja3Mgb24gMiBkaWZmZXJlbnQgcmVncy4gKiB0aGFtZWFucyB0aGF0IHdlIGNhbnQKKyAqIG5vb2RsaW5nIHRoZSBpL28gamFja3Mgb24gMiBkaWZmZXJlbnQgcmVncy4gdGhhdCBtZWFucyB0aGF0IHdlIGNhbid0CiAgKiB1c2UgdGhlIGVhc3kgd2F5IHByb3ZpZGVkIGJ5IEFDOTdfRU5VTV9ET1VCTEUoKSB3ZSBoYXZlIHRvIHdyaXRlCiAgKiBhcmUgb3duIGZ1bmNzLgogICoKQEAgLTM0OTAsNyArMzQ5OCw3IEBACiAJCiAJcGFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7IC8qIGdyYWIgY29kZWMgaGFuZGxlICovCiAKLQkvKiBncmFiIG91ciBkZXNpcmVjIGJpdHMsIHRoZW4gbWFzaCB0aGVtIHRvZ2V0aGVyIGluIGEgbWFubmVyCisJLyogZ3JhYiBvdXIgZGVzaXJlZCBiaXRzLCB0aGVuIG1hc2ggdGhlbSB0b2dldGhlciBpbiBhIG1hbm5lcgogCSAqIGNvbnNpc3RlbnQgd2l0aCBUYWJsZSA2IG9uIHBhZ2UgMTcgaW4gdGhlIDE2MTdhIGRvY3MgKi8KICAKIAl1c1NNNTEgPSBzbmRfYWM5N19yZWFkKHBhYzk3LCAweDdhKSA+PiAxNDsKQEAgLTM1NDAsNyArMzU0OCw3IEBACiAJfSwKIH07CiAKLWludCBwYXRjaF92dDE2MTdhKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX3Z0MTYxN2Eoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAlpbnQgZXJyID0gMDsKIAlpbnQgdmFsOwpAQCAtMzU2OCw2ICszNTc2LDIwMCBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIFZJQSBWVDE2MTggOCBDSEFOTkVMIEFDOTcgQ09ERUMKKyAqCisgKiBWSUEgaW1wbGVtZW50cyAnU21hcnQgNS4xJyBjb21wbGV0ZWx5IGRpZmZlcmVudGx5IG9uIHRoZSAxNjE4IHRoYW4KKyAqIGl0IGRvZXMgb24gdGhlIDE2MTdhLiBhd2Vzb21lISBUaGV5IHNlZW0gdG8gaGF2ZSBzb3VyY2VkIHRoaXMKKyAqIHBhcnRpY3VsYXIgcmV2aXNpb24gb2YgdGhlIHRlY2hub2xvZ3kgZnJvbSBzb21lYm9keSBlbHNlLCBpdCdzCisgKiBjYWxsZWQgVW5pdmVyc2FsIEF1ZGlvIEphY2sgYW5kIGl0IHNob3dzIHVwIG9uIHNvbWUgb3RoZXIgZm9saydzIGNoaXBzCisgKiBhcyB3ZWxsLgorICoKKyAqIG9yZGVyaW5nIGluIHRoaXMgbGlzdCByZWZsZWN0cyB2dDE2MTggZG9jcyBmb3IgUmVnIDYwaCBhbmQKKyAqIHRoZSBibG9jayBkaWFncmFtLCBEQUNzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqICAgICAgICBPVVRfTyAtPiBGcm9udCwKKyAqCSAgT1VUXzEgLT4gU3Vycm91bmQsCisgKgkgIE9VVF8yIC0+IEMvTEZFCisgKgorICogVW5saWtlIHRoZSAxNjE3YSwgZWFjaCBPVVQgaGFzIGEgY29uc2lzdGVudCBzZXQgb2YgbWFwcGluZ3MKKyAqIGZvciBhbGwgYml0cGF0dGVybnMgb3RoZXIgdGhhbiAwMDoKKyAqCisgKiAgICAgICAgMDEgICAgICAgVW5taXhlZCBPdXRwdXQKKyAqICAgICAgICAxMCAgICAgICBMaW5lIEluCisgKiAgICAgICAgMTEgICAgICAgTWljICBJbgorICoKKyAqIFNwZWNpYWwgQ2FzZSBvZiAwMDoKKyAqCisgKiAgICAgICAgT1VUXzAgICAgTWl4ZWQgT3V0cHV0CisgKiAgICAgICAgT1VUXzEgICAgUmVzZXJ2ZWQKKyAqICAgICAgICBPVVRfMiAgICBSZXNlcnZlZAorICoKKyAqIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGhlbGwgUmVzZXJ2ZWQgZG9lcywgYnV0IG9uIGFuIE1TSQorICogQ043MDBULCBpIGhhdmUgdG8gc2V0IGl0IHRvIGdldCA1LjEgb3V0cHV0IC0gWU1NViwgYmFkCisgKiBzaGl0IG1heSBoYXBwZW4uCisgKgorICogSWYgb3RoZXIgY2hpcHMgdXNlIFVuaXZlcnNhbCBBdWRpbyBKYWNrLCB0aGVuIHRoaXMgY29kZSBtaWdodCBiZSBhcHBsaWNhYmxlCisgKiB0byB0aGVtLgorICovCisKK3N0cnVjdCB2dDE2MThfdWFqX2l0ZW0geworCXVuc2lnbmVkIHNob3J0IG1hc2s7CisJdW5zaWduZWQgc2hvcnQgc2hpZnQ7CisJY29uc3QgY2hhciAqaXRlbXNbNF07Cit9OworCisvKiBUaGlzIGxpc3QgcmVmbGVjdHMgdGhlIHZ0MTYxOCBkb2NzIGZvciBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlciAweDYwLiAqLworCitzdGF0aWMgc3RydWN0IHZ0MTYxOF91YWpfaXRlbSB2dDE2MThfdWFqWzNdID0geworCXsKKwkJLyogc3BlYWtlciBqYWNrICovCisJCS5tYXNrICA9IDB4MDMsCisJCS5zaGlmdCA9IDAsCisJCS5pdGVtcyA9IHsKKwkJCSJTcGVha2VyIE91dCIsICJEQUMgVW5taXhlZCBPdXQiLCAiTGluZSBJbiIsICJNaWMgSW4iCisJCX0KKwl9LAorCXsKKwkJLyogbGluZSBqYWNrICovCisJCS5tYXNrICA9IDB4MGMsCisJCS5zaGlmdCA9IDIsCisJCS5pdGVtcyA9IHsKKwkJCSJTdXJyb3VuZCBPdXQiLCAiREFDIFVubWl4ZWQgT3V0IiwgIkxpbmUgSW4iLCAiTWljIEluIgorCQl9CisJfSwKKwl7CisJCS8qIG1pYyBqYWNrICovCisJCS5tYXNrICA9IDB4MzAsCisJCS5zaGlmdCA9IDQsCisJCS5pdGVtcyA9IHsKKwkJCSJDZW50ZXIgTEZFIE91dCIsICJEQUMgVW5taXhlZCBPdXQiLCAiTGluZSBJbiIsICJNaWMgSW4iCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfdnQxNjE4X1VBSl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXJldHVybiBhYzk3X2VudW1fdGV4dF9pbmZvKGtjb250cm9sLCB1aW5mbywKKwkJCQkgICB2dDE2MThfdWFqW2tjb250cm9sLT5wcml2YXRlX3ZhbHVlXS5pdGVtcywKKwkJCQkgICA0KTsKK30KKworLyogQWxsIG9mIHRoZSB2dDE2MTggVW5pdmVyc2FsIEF1ZGlvIEphY2sgdHdpZGRsZXJzIGFyZSBvbgorICogVmVuZG9yIERlZmluZWQgUmVnaXN0ZXIgMHg2MCwgcGFnZSAwLiBUaGUgYml0cywgYW5kIHRodXMKKyAqIHRoZSBtYXNrLCBhcmUgdGhlIG9ubHkgdGhpbmcgdGhhdCBjaGFuZ2VzCisgKi8KK3N0YXRpYyBpbnQgc25kX2FjOTdfdnQxNjE4X1VBSl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdW5zaWduZWQgc2hvcnQgZGF0cGFnLCB1YWo7CisJc3RydWN0IHNuZF9hYzk3ICpwYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCW11dGV4X2xvY2soJnBhYzk3LT5wYWdlX211dGV4KTsKKworCWRhdHBhZyA9IHNuZF9hYzk3X3JlYWQocGFjOTcsIEFDOTdfSU5UX1BBR0lORykgJiBBQzk3X1BBR0VfTUFTSzsKKwlzbmRfYWM5N191cGRhdGVfYml0cyhwYWM5NywgQUM5N19JTlRfUEFHSU5HLCBBQzk3X1BBR0VfTUFTSywgMCk7CisKKwl1YWogPSBzbmRfYWM5N19yZWFkKHBhYzk3LCAweDYwKSAmCisJCXZ0MTYxOF91YWpba2NvbnRyb2wtPnByaXZhdGVfdmFsdWVdLm1hc2s7CisKKwlzbmRfYWM5N191cGRhdGVfYml0cyhwYWM5NywgQUM5N19JTlRfUEFHSU5HLCBBQzk3X1BBR0VfTUFTSywgZGF0cGFnKTsKKwltdXRleF91bmxvY2soJnBhYzk3LT5wYWdlX211dGV4KTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB1YWogPj4KKwkJdnQxNjE4X3VhaltrY29udHJvbC0+cHJpdmF0ZV92YWx1ZV0uc2hpZnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N192dDE2MThfVUFKX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlyZXR1cm4gYWM5N191cGRhdGVfYml0c19wYWdlKHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKSwgMHg2MCwKKwkJCQkgICAgIHZ0MTYxOF91YWpba2NvbnRyb2wtPnByaXZhdGVfdmFsdWVdLm1hc2ssCisJCQkJICAgICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdPDwKKwkJCQkgICAgIHZ0MTYxOF91YWpba2NvbnRyb2wtPnByaXZhdGVfdmFsdWVdLnNoaWZ0LAorCQkJCSAgICAgMCk7Cit9CisKKy8qIGNvbmZpZyBhdXggaW4gamFjayAtIG5vdCBmb3VuZCBvbiAzIGphY2sgbW90aGVyYm9hcmRzIG9yIHNvdW5kY2FyZHMgKi8KKworc3RhdGljIGludCBzbmRfYWM5N192dDE2MThfYXV4X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICp0eHRfYXV4W10gPSB7IkF1eCBJbiIsICJCYWNrIFN1cnIgT3V0In07CisKKwlyZXR1cm4gYWM5N19lbnVtX3RleHRfaW5mbyhrY29udHJvbCwgdWluZm8sIHR4dF9hdXgsIDIpOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X3Z0MTYxOF9hdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkoc25kX2FjOTdfcmVhZChzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCksIDB4NWMpICYgMHgwMDA4KT4+MzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N192dDE2MThfYXV4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwkvKiB0b2dnbGUgc3Vycm91bmQgcmVhciBkYWMgcG93ZXIgKi8KKworCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKSwgMHg1YywgMHgwMDA4LAorCQkJICAgICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IDMpOworCisJLyogdG9nZ2xlIGF1eCBpbiBzdXJyb3VuZCByZWFyIG91dCBqYWNrICovCisKKwlyZXR1cm4gc25kX2FjOTdfdXBkYXRlX2JpdHMoc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpLCAweDc2LCAweDAwMDgsCisJCQkJICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPDwgMyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19jb250cm9sc192dDE2MThbXSA9IHsKKwlBQzk3X1NJTkdMRSgiRXhjaGFuZ2UgQ2VudGVyL0xGRSIsIDB4NWEsICA4LCAxLCAgICAgMCksCisJQUM5N19TSU5HTEUoIkRDIE9mZnNldCIsICAgICAgICAgICAweDVhLCAxMCwgMSwgICAgIDApLAorCUFDOTdfU0lOR0xFKCJTb2Z0IE11dGUiLCAgICAgICAgICAgMHg1YywgIDAsIDEsICAgICAxKSwKKwlBQzk3X1NJTkdMRSgiSGVhZHBob25lIEFtcCIsICAgICAgIDB4NWMsICA1LCAxLCAgICAgMSksCisJQUM5N19ET1VCTEUoIkJhY2sgU3VyciBWb2x1bWUiLCAgICAweDVlLCAgOCwgMCwgMzEsIDEpLAorCUFDOTdfU0lOR0xFKCJCYWNrIFN1cnIgU3dpdGNoIiwgICAgMHg1ZSwgMTUsIDEsICAgICAxKSwKKwl7CisJCS5pZmFjZSAgICAgICAgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lICAgICAgICAgID0gIlNwZWFrZXIgSmFjayBNb2RlIiwKKwkJLmluZm8gICAgICAgICAgPSBzbmRfYWM5N192dDE2MThfVUFKX2luZm8sCisJCS5nZXQgICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE4X1VBSl9nZXQsCisJCS5wdXQgICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE4X1VBSl9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gMAorCX0sCisJeworCQkuaWZhY2UgICAgICAgICA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSAgICAgICAgICA9ICJMaW5lIEphY2sgTW9kZSIsCisJCS5pbmZvICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE4X1VBSl9pbmZvLAorCQkuZ2V0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9VQUpfZ2V0LAorCQkucHV0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9VQUpfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDEKKwl9LAorCXsKKwkJLmlmYWNlICAgICAgICAgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiTWljIEphY2sgTW9kZSIsCisJCS5pbmZvICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE4X1VBSl9pbmZvLAorCQkuZ2V0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9VQUpfZ2V0LAorCQkucHV0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9VQUpfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDIKKwl9LAorCXsKKwkJLmlmYWNlICAgICAgICAgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiQXV4IEphY2sgTW9kZSIsCisJCS5pbmZvICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE4X2F1eF9pbmZvLAorCQkuZ2V0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9hdXhfZ2V0LAorCQkucHV0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxOF9hdXhfcHV0LAorCX0KK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNjE4KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlyZXR1cm4gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfY29udHJvbHNfdnQxNjE4LAorCQkJCSAgICBBUlJBWV9TSVpFKHNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxOCkpOworfQorCiAvKgogICovCiBzdGF0aWMgdm9pZCBpdDI2NDZfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCAzOWVjNTViLi45MmYzYTk3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC01NDksNyArNTQ5LDggQEAKIAlwdHIgPSBhZDE4ODlfcmVhZGwoY2hpcCwgQURfRE1BX1dBVkNBKTsKIAlwdHIgLT0gY2hpcC0+d2F2ZS5hZGRyOwogCQotCXNuZF9hc3NlcnQoKHB0ciA+PSAwKSAmJiAocHRyIDwgY2hpcC0+d2F2ZS5zaXplKSwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKHB0ciA+PSBjaGlwLT53YXZlLnNpemUpKQorCQlyZXR1cm4gMDsKIAkKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHNzLT5ydW50aW1lLCBwdHIpOwogfQpAQCAtNTY3LDcgKzU2OCw4IEBACiAJcHRyID0gYWQxODg5X3JlYWRsKGNoaXAsIEFEX0RNQV9BRENDQSk7CiAJcHRyIC09IGNoaXAtPnJhbWMuYWRkcjsKIAotCXNuZF9hc3NlcnQoKHB0ciA+PSAwKSAmJiAocHRyIDwgY2hpcC0+cmFtYy5zaXplKSwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKHB0ciA+PSBjaGlwLT5yYW1jLnNpemUpKQorCQlyZXR1cm4gMDsKIAkKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHNzLT5ydW50aW1lLCBwdHIpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jIGIvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jCmluZGV4IDMzZDM3YjEuLjBmODE5ZGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hazQ1MzFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWs0NTMxX2NvZGVjLmMKQEAgLTM5Miw5ICszOTIsMTAgQEAKIAkJLmRldl9mcmVlID0Jc25kX2FrNDUzMV9kZXZfZnJlZSwKIAl9OwogCi0Jc25kX2Fzc2VydChyYWs0NTMxICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQkqcmFrNDUzMSA9IE5VTEw7Ci0Jc25kX2Fzc2VydChjYXJkICE9IE5VTEwgJiYgX2FrNDUzMSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNhcmQgfHwgIV9hazQ1MzEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmFrNDUzMSkKKwkJKnJhazQ1MzEgPSBOVUxMOwogCWFrNDUzMSA9IGt6YWxsb2Moc2l6ZW9mKCphazQ1MzEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYWs0NTMxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDI4LDcgKzQyOSw4IEBACiAjaWYgMAogCXNuZF9hazQ1MzFfZHVtcChhazQ1MzEpOwogI2VuZGlmCi0JKnJhazQ1MzEgPSBhazQ1MzE7CisJaWYgKHJhazQ1MzEpCisJCSpyYWs0NTMxID0gYWs0NTMxOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCAyN2NlNjEzLi5iYTU3MDA1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTIsNyArMiw3IEBACiAgKiAgY2FyZC1hbHM0MDAwLmMgLSBkcml2ZXIgZm9yIEF2YW5jZSBMb2dpYyBBTFM0MDAwIGJhc2VkIHNvdW5kY2FyZHMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPiwKICAqCQkJICBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgotICogIENvcHlyaWdodCAoQykgMjAwMiBieSBBbmRyZWFzIE1vaHIgPGh3N29zaHl1djMwMDFAc25lYWtlbWFpbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA4IGJ5IEFuZHJlYXMgTW9ociA8aHc3b3NoeXV2MzAwMUBzbmVha2VtYWlsLmNvbT4KICAqCiAgKiAgRnJhbWV3b3JrIGJvcnJvd2VkIGZyb20gTWFzc2ltbyBQaWNjaW9uaSdzIGNhcmQtYWxzMTAwLmMuCiAgKgpAQCAtMjcsOCArMjcsMTAgQEAKICAqICBib3VnaHQgYW4gQUxTNDAwMCBiYXNlZCBzb3VuZGNhcmQsIEkgd2FzIGZvcmNlZCB0byBiYXNlIHRoaXMgZHJpdmVyCiAgKiAgb24gcmV2ZXJzZSBlbmdpbmVlcmluZy4KICAqCi0gKiAgTm90ZTogdGhpcyBpcyBubyBsb25nZXIgdHJ1ZS4gUHJldHR5IHZlcmJvc2UgY2hpcCBkb2N1IChBTFM0MDAwYS5QREYpCi0gKiAgY2FuIGJlIGZvdW5kIG9uIHRoZSBBTFNBIHdlYiBzaXRlLgorICogIE5vdGU6IHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUgKHRoYW5rIHlvdSEpOgorICogIHByZXR0eSB2ZXJib3NlIGNoaXAgZG9jdSAoQUxTNDAwMGEuUERGKSBjYW4gYmUgZm91bmQgb24gdGhlIEFMU0Egd2ViIHNpdGUuCisgKiAgUGFnZSBudW1iZXJzIHN0YXRlZCBhbnl3aGVyZSBiZWxvdyB3aXRoIHRoZSAiU1BFQ1NfUEFHRToiIHRhZworICogIHJlZmVyIHRvOiBBTFM0MDAwYS5QREYgc3BlY3MgVmVyIDEuMCwgTWF5IDI4dGgsIDE5OTguCiAgKgogICogIFRoZSBBTFM0MDAwIHNlZW1zIHRvIGJlIHRoZSBQQ0ktY291c2luIG9mIHRoZSBBTFMxMDAuIEl0IGNvbnRhaW5zIGFuCiAgKiAgQUxTMTAwLWxpa2UgU0IgRFNQL21peGVyLCBhbiBPUEwzIHN5bnRoLCBhIE1QVTQwMSBhbmQgYSBnYW1lcG9ydCAKQEAgLTU5LDcgKzYxLDcgQEAKICAqIC0gdmFsdWUgLT4gc29tZSBwb3J0IDB4MGMwZAogICoKICAqIFRvRG86Ci0gKiAtIFByb3BlciBzaGFyZWQgSVJRIGhhbmRsaW5nPworICogLSBieSBkZWZhdWx0LCBkb24ndCBlbmFibGUgbGVnYWN5IGdhbWUgYW5kIHVzZSBQQ0kgZ2FtZSBJL08KICAqIC0gcG93ZXIgbWFuYWdlbWVudD8gKGNhcmQgY2FuIGRvIHZvaWNlIHdha2V1cCBhY2NvcmRpbmcgdG8gZGF0YXNoZWV0ISEpCiAgKi8KIApAQCAtNzgsNyArODAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCi1NT0RVTEVfQVVUSE9SKCJCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4iKTsKK01PRFVMRV9BVVRIT1IoIkJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPiwgQW5kcmVhcyBNb2hyIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkF2YW5jZSBMb2dpYyBBTFM0MDAwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tBdmFuY2UgTG9naWMsQUxTNDAwMH19Iik7CkBAIC0xMDcsNyArMTA5LDcgQEAKIAogc3RydWN0IHNuZF9jYXJkX2FsczQwMDAgewogCS8qIG1vc3QgZnJlcXVlbnQgYWNjZXNzIGZpcnN0ICovCi0JdW5zaWduZWQgbG9uZyBnY3I7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CiAJc3RydWN0IHBjaV9kZXYgKnBjaTsKIAlzdHJ1Y3Qgc25kX3NiICpjaGlwOwogI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKQEAgLTEyMiwyOCArMTI0LDE2OCBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2FsczQwMDBfaWRzKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHNuZF9hbHM0MDAwX2djcl93cml0ZV9hZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCwgdTMyIHJlZywgdTMyIHZhbCkKK2VudW0gYWxzNGtfaW9iYXNlX3QgeworCS8qIElPeDogQiA9PSBCeXRlLCBXID0gV29yZCwgRCA9IERXb3JkOyBTUEVDU19QQUdFOiAzNyAqLworCUFMUzRLX0lPRF8wMF9BQzk3X0FDQ0VTUyA9IDB4MDAsCisJQUxTNEtfSU9XXzA0X0FDOTdfUkVBRCA9IDB4MDQsCisJQUxTNEtfSU9CXzA2X0FDOTdfU1RBVFVTID0gMHgwNiwKKwlBTFM0S19JT0JfMDdfSVJRU1RBVFVTID0gMHgwNywKKwlBTFM0S19JT0RfMDhfR0NSX0RBVEEgPSAweDA4LAorCUFMUzRLX0lPQl8wQ19HQ1JfSU5ERVggPSAweDBjLAorCUFMUzRLX0lPQl8wRV9JUlFUWVBFX1NCX0NSMUVfTVBVID0gMHgwZSwKKwlBTFM0S19JT0JfMTBfQURMSUJfQUREUjAgPSAweDEwLAorCUFMUzRLX0lPQl8xMV9BRExJQl9BRERSMSA9IDB4MTEsCisJQUxTNEtfSU9CXzEyX0FETElCX0FERFIyID0gMHgxMiwKKwlBTFM0S19JT0JfMTNfQURMSUJfQUREUjMgPSAweDEzLAorCUFMUzRLX0lPQl8xNF9NSVhFUl9JTkRFWCA9IDB4MTQsCisJQUxTNEtfSU9CXzE1X01JWEVSX0RBVEEgPSAweDE1LAorCUFMUzRLX0lPQl8xNl9FU1BfUkVTRVQgPSAweDE2LAorCUFMUzRLX0lPQl8xNl9BQ0tfRk9SX0NSMUUgPSAweDE2LCAvKiAybmQgZnVuY3Rpb24gKi8KKwlBTFM0S19JT0JfMThfT1BMX0FERFIwID0gMHgxOCwKKwlBTFM0S19JT0JfMTlfT1BMX0FERFIxID0gMHgxOSwKKwlBTFM0S19JT0JfMUFfRVNQX1JEX0RBVEEgPSAweDFhLAorCUFMUzRLX0lPQl8xQ19FU1BfQ01EX0RBVEEgPSAweDFjLAorCUFMUzRLX0lPQl8xQ19FU1BfV1JfU1RBVFVTID0gMHgxYywgLyogMm5kIGZ1bmN0aW9uICovCisJQUxTNEtfSU9CXzFFX0VTUF9SRF9TVEFUVVM4ID0gMHgxZSwKKwlBTFM0S19JT0JfMUZfRVNQX1JEX1NUQVRVUzE2ID0gMHgxZiwKKwlBTFM0S19JT0JfMjBfRVNQX0dBTUVQT1JUXzIwMCA9IDB4MjAsCisJQUxTNEtfSU9CXzIxX0VTUF9HQU1FUE9SVF8yMDEgPSAweDIxLAorCUFMUzRLX0lPQl8zMF9NSURJX0RBVEEgPSAweDMwLAorCUFMUzRLX0lPQl8zMV9NSURJX1NUQVRVUyA9IDB4MzEsCisJQUxTNEtfSU9CXzMxX01JRElfQ09NTUFORCA9IDB4MzEsIC8qIDJuZCBmdW5jdGlvbiAqLworfTsKKworZW51bSBhbHM0a19pb2Jhc2VfMGVfdCB7CisJQUxTNEtfSU9CXzBFX01QVV9JUlEgPSAweDEwLAorCUFMUzRLX0lPQl8wRV9DUjFFX0lSUSA9IDB4NDAsCisJQUxTNEtfSU9CXzBFX1NCX0RNQV9JUlEgPSAweDgwLAorfTsKKworZW51bSBhbHM0a19nY3JfdCB7IC8qIGFsbCByZWdpc3RlcnMgMzJiaXQgd2lkZTsgU1BFQ1NfUEFHRTogMzggdG8gNDIgKi8KKwlBTFM0S19HQ1I4Q19NSVNDX0NUUkwgPSAweDhjLAorCUFMUzRLX0dDUjkwX1RFU1RfTU9ERV9SRUcgPSAweDkwLAorCUFMUzRLX0dDUjkxX0RNQTBfQUREUiA9IDB4OTEsCisJQUxTNEtfR0NSOTJfRE1BMF9NT0RFX0NPVU5UID0gMHg5MiwKKwlBTFM0S19HQ1I5M19ETUExX0FERFIgPSAweDkzLAorCUFMUzRLX0dDUjk0X0RNQTFfTU9ERV9DT1VOVCA9IDB4OTQsCisJQUxTNEtfR0NSOTVfRE1BM19BRERSID0gMHg5NSwKKwlBTFM0S19HQ1I5Nl9ETUEzX01PREVfQ09VTlQgPSAweDk2LAorCUFMUzRLX0dDUjk5X0RNQV9FTVVMQVRJT05fQ1RSTCA9IDB4OTksCisJQUxTNEtfR0NSQTBfRklGTzFfQ1VSUkVOVF9BRERSID0gMHhhMCwKKwlBTFM0S19HQ1JBMV9GSUZPMV9TVEFUVVNfQllURUNPVU5UID0gMHhhMSwKKwlBTFM0S19HQ1JBMl9GSUZPMl9QQ0lBRERSID0gMHhhMiwKKwlBTFM0S19HQ1JBM19GSUZPMl9DT1VOVCA9IDB4YTMsCisJQUxTNEtfR0NSQTRfRklGTzJfQ1VSUkVOVF9BRERSID0gMHhhNCwKKwlBTFM0S19HQ1JBNV9GSUZPMV9TVEFUVVNfQllURUNPVU5UID0gMHhhNSwKKwlBTFM0S19HQ1JBNl9QTV9DVFJMID0gMHhhNiwKKwlBTFM0S19HQ1JBN19QQ0lfQUNDRVNTX1NUT1JBR0UgPSAweGE3LAorCUFMUzRLX0dDUkE4X0xFR0FDWV9DRkcxID0gMHhhOCwKKwlBTFM0S19HQ1JBOV9MRUdBQ1lfQ0ZHMiA9IDB4YTksCisJQUxTNEtfR0NSRkZfRFVNTVlfU0NSQVRDSCA9IDB4ZmYsCit9OworCitlbnVtIGFsczRrX2djcjhjX3QgeworCUFMUzRLX0dDUjhDX0lSUV9NQVNLX0NUUkxfRU5BQkxFID0gMHg4MDAwLAorCUFMUzRLX0dDUjhDX0NISVBfUkVWX01BU0sgPSAweGYwMDAwCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsczRrX2lvYmFzZV93cml0ZWIodW5zaWduZWQgbG9uZyBpb2Jhc2UsCisJCQkJCQllbnVtIGFsczRrX2lvYmFzZV90IHJlZywKKwkJCQkJCXU4IHZhbCkKIHsKLQlvdXRiKHJlZywgcG9ydCsweDBjKTsKLQlvdXRsKHZhbCwgcG9ydCsweDA4KTsKKwlvdXRiKHZhbCwgaW9iYXNlICsgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNuZF9hbHM0MDAwX2djcl93cml0ZShzdHJ1Y3Qgc25kX3NiICpzYiwgdTMyIHJlZywgdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYWxzNGtfaW9iYXNlX3dyaXRlbCh1bnNpZ25lZCBsb25nIGlvYmFzZSwKKwkJCQkJCWVudW0gYWxzNGtfaW9iYXNlX3QgcmVnLAorCQkJCQkJdTMyIHZhbCkKIHsKLQlzbmRfYWxzNDAwMF9nY3Jfd3JpdGVfYWRkcihzYi0+YWx0X3BvcnQsIHJlZywgdmFsKTsKKwlvdXRsKHZhbCwgaW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCBzbmRfYWxzNGtfaW9iYXNlX3JlYWRiKHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCQkJZW51bSBhbHM0a19pb2Jhc2VfdCByZWcpCit7CisJcmV0dXJuIGluYihpb2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzbmRfYWxzNGtfaW9iYXNlX3JlYWRsKHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCQkJZW51bSBhbHM0a19pb2Jhc2VfdCByZWcpCit7CisJcmV0dXJuIGlubChpb2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsczRrX2djcl93cml0ZV9hZGRyKHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCQkJIGVudW0gYWxzNGtfZ2NyX3QgcmVnLAorCQkJCQkJIHUzMiB2YWwpCit7CisJc25kX2FsczRrX2lvYmFzZV93cml0ZWIoaW9iYXNlLCBBTFM0S19JT0JfMENfR0NSX0lOREVYLCByZWcpOworCXNuZF9hbHM0a19pb2Jhc2Vfd3JpdGVsKGlvYmFzZSwgQUxTNEtfSU9EXzA4X0dDUl9EQVRBLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsczRrX2djcl93cml0ZShzdHJ1Y3Qgc25kX3NiICpzYiwKKwkJCQkJIGVudW0gYWxzNGtfZ2NyX3QgcmVnLAorCQkJCQkgdTMyIHZhbCkKK3sKKwlzbmRfYWxzNGtfZ2NyX3dyaXRlX2FkZHIoc2ItPmFsdF9wb3J0LCByZWcsIHZhbCk7CiB9CQogCi1zdGF0aWMgaW5saW5lIHUzMiBzbmRfYWxzNDAwMF9nY3JfcmVhZF9hZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCwgdTMyIHJlZykKK3N0YXRpYyBpbmxpbmUgdTMyIHNuZF9hbHM0a19nY3JfcmVhZF9hZGRyKHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCQkJIGVudW0gYWxzNGtfZ2NyX3QgcmVnKQogewotCW91dGIocmVnLCBwb3J0KzB4MGMpOwotCXJldHVybiBpbmwocG9ydCsweDA4KTsKKwkvKiBTUEVDU19QQUdFOiAzNy8zOCAqLworCXNuZF9hbHM0a19pb2Jhc2Vfd3JpdGViKGlvYmFzZSwgQUxTNEtfSU9CXzBDX0dDUl9JTkRFWCwgcmVnKTsKKwlyZXR1cm4gc25kX2FsczRrX2lvYmFzZV9yZWFkbChpb2Jhc2UsIEFMUzRLX0lPRF8wOF9HQ1JfREFUQSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHNuZF9hbHM0MDAwX2djcl9yZWFkKHN0cnVjdCBzbmRfc2IgKnNiLCB1MzIgcmVnKQorc3RhdGljIGlubGluZSB1MzIgc25kX2FsczRrX2djcl9yZWFkKHN0cnVjdCBzbmRfc2IgKnNiLCBlbnVtIGFsczRrX2djcl90IHJlZykKIHsKLQlyZXR1cm4gc25kX2FsczQwMDBfZ2NyX3JlYWRfYWRkcihzYi0+YWx0X3BvcnQsIHJlZyk7CisJcmV0dXJuIHNuZF9hbHM0a19nY3JfcmVhZF9hZGRyKHNiLT5hbHRfcG9ydCwgcmVnKTsKIH0KIAorZW51bSBhbHM0a19jcl90IHsgLyogYWxsIHJlZ2lzdGVycyA4Yml0IHdpZGU7IFNQRUNTX1BBR0U6IDIwIHRvIDIzICovCisJQUxTNEtfQ1IwX1NCX0NPTkZJRyA9IDB4MDAsCisJQUxTNEtfQ1IyX01JU0NfQ09OVFJPTCA9IDB4MDIsCisJQUxTNEtfQ1IzX0NPTkZJR1VSQVRJT04gPSAweDAzLAorCUFMUzRLX0NSMTdfRklGT19TVEFUVVMgPSAweDE3LAorCUFMUzRLX0NSMThfRVNQX01BSk9SX1ZFUlNJT04gPSAweDE4LAorCUFMUzRLX0NSMTlfRVNQX01JTk9SX1ZFUlNJT04gPSAweDE5LAorCUFMUzRLX0NSMUFfTVBVNDAxX1VBUlRfTU9ERV9DT05UUk9MID0gMHgxYSwKKwlBTFM0S19DUjFDX0ZJRk8yX0JMT0NLX0xFTkdUSF9MTyA9IDB4MWMsCisJQUxTNEtfQ1IxRF9GSUZPMl9CTE9DS19MRU5HVEhfSEkgPSAweDFkLAorCUFMUzRLX0NSMUVfRklGTzJfQ09OVFJPTCA9IDB4MWUsIC8qIHNlY29uZGFyeSBQQ00gRklGTyAocmVjb3JkaW5nKSAqLworCUFMUzRLX0NSM0FfTUlTQ19DT05UUk9MID0gMHgzYSwKKwlBTFM0S19DUjNCX0NSQzMyX0JZVEUwID0gMHgzYiwgLyogZm9yIHRlc3RpbmcsIGFjdGl2YXRlIHZpYSBDUjNBICovCisJQUxTNEtfQ1IzQ19DUkMzMl9CWVRFMSA9IDB4M2MsCisJQUxTNEtfQ1IzRF9DUkMzMl9CWVRFMiA9IDB4M2QsCisJQUxTNEtfQ1IzRV9DUkMzMl9CWVRFMyA9IDB4M2UsCit9OworCitlbnVtIGFsczRrX2NyMF90IHsKKwlBTFM0S19DUjBfRE1BX0NPTlRJTl9NT0RFX0NUUkwgPSAweDAyLCAvKiBJUlEvRklGTyBjb250cm9sbGVkIGZvciAwLzEgKi8KKwlBTFM0S19DUjBfRE1BXzkwSF9NT0RFX0NUUkwgPSAweDA0LCAvKiBJUlEvRklGTyBjb250cm9sbGVkIGZvciAwLzEgKi8KKwlBTFM0S19DUjBfTVg4MF84MV9SRUdfV1JJVEVfRU5BQkxFID0gMHg4MCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYWxzNF9jcl93cml0ZShzdHJ1Y3Qgc25kX3NiICpjaGlwLAorCQkJCQllbnVtIGFsczRrX2NyX3QgcmVnLAorCQkJCQl1OCBkYXRhKQoreworCS8qIENvbnRyb2wgUmVnaXN0ZXIgaXMgcmVnIHwgMHhjMCAoYml0IDcsIDYgc2V0KSBvbiBzYm1peGVyX2luZGV4CisJICogTk9URTogYXNzdW1lcyBjaGlwLT5taXhlcl9sb2NrIHRvIGJlIGxvY2tlZCBleHRlcm5hbGx5IGFscmVhZHkhCisJICogU1BFQ1NfUEFHRTogNiAqLworCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsIHJlZyB8IDB4YzAsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNuZF9hbHM0X2NyX3JlYWQoc3RydWN0IHNuZF9zYiAqY2hpcCwKKwkJCQkJZW51bSBhbHM0a19jcl90IHJlZykKK3sKKwkvKiBOT1RFOiBhc3N1bWVzIGNoaXAtPm1peGVyX2xvY2sgdG8gYmUgbG9ja2VkIGV4dGVybmFsbHkgYWxyZWFkeSEgKi8KKwlyZXR1cm4gc25kX3NibWl4ZXJfcmVhZChjaGlwLCByZWcgfCAweGMwKTsKK30KKworCisKIHN0YXRpYyB2b2lkIHNuZF9hbHM0MDAwX3NldF9yYXRlKHN0cnVjdCBzbmRfc2IgKmNoaXAsIHVuc2lnbmVkIGludCByYXRlKQogewogCWlmICghKGNoaXAtPm1vZGUgJiBTQl9SQVRFX0xPQ0spKSB7CkBAIC0xNTYsMTUgKzI5OCwxOSBAQAogc3RhdGljIGlubGluZSB2b2lkIHNuZF9hbHM0MDAwX3NldF9jYXB0dXJlX2RtYShzdHJ1Y3Qgc25kX3NiICpjaGlwLAogCQkJCQkgICAgICAgZG1hX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBzaXplKQogewotCXNuZF9hbHM0MDAwX2djcl93cml0ZShjaGlwLCAweGEyLCBhZGRyKTsKLQlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHhhMywgKHNpemUtMSkpOworCS8qIFNQRUNTX1BBR0U6IDQwICovCisJc25kX2FsczRrX2djcl93cml0ZShjaGlwLCBBTFM0S19HQ1JBMl9GSUZPMl9QQ0lBRERSLCBhZGRyKTsKKwlzbmRfYWxzNGtfZ2NyX3dyaXRlKGNoaXAsIEFMUzRLX0dDUkEzX0ZJRk8yX0NPVU5ULCAoc2l6ZS0xKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYWxzNDAwMF9zZXRfcGxheWJhY2tfZG1hKHN0cnVjdCBzbmRfc2IgKmNoaXAsCi0JCQkJCQlkbWFfYWRkcl90IGFkZHIsIHVuc2lnbmVkIHNpemUpCisJCQkJCQlkbWFfYWRkcl90IGFkZHIsCisJCQkJCQl1bnNpZ25lZCBzaXplKQogewotCXNuZF9hbHM0MDAwX2djcl93cml0ZShjaGlwLCAweDkxLCBhZGRyKTsKLQlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHg5MiwgKHNpemUtMSl8MHgxODAwMDApOworCS8qIFNQRUNTX1BBR0U6IDM4ICovCisJc25kX2FsczRrX2djcl93cml0ZShjaGlwLCBBTFM0S19HQ1I5MV9ETUEwX0FERFIsIGFkZHIpOworCXNuZF9hbHM0a19nY3Jfd3JpdGUoY2hpcCwgQUxTNEtfR0NSOTJfRE1BMF9NT0RFX0NPVU5ULAorCQkJCQkJCShzaXplLTEpfDB4MTgwMDAwKTsKIH0KIAogI2RlZmluZSBBTFM0MDAwX0ZPUk1BVF9TSUdORUQJKDE8PDApCkBAIC0yNDgsNyArMzk0LDcgQEAKIAljb3VudCA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pOwogCQogCWlmIChjaGlwLT5jYXB0dXJlX2Zvcm1hdCAmIEFMUzQwMDBfRk9STUFUXzE2QklUKQotCQljb3VudCA+Pj0xOworCQljb3VudCA+Pj0gMTsKIAljb3VudC0tOwogCiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwpAQCAtMjU2LDggKzQwMiw4IEBACiAJc25kX2FsczQwMDBfc2V0X2NhcHR1cmVfZG1hKGNoaXAsIHJ1bnRpbWUtPmRtYV9hZGRyLCBzaXplKTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5taXhlcl9sb2NrKTsKLQlzbmRfc2JtaXhlcl93cml0ZShjaGlwLCAweGRjLCBjb3VudCk7Ci0Jc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhkZCwgY291bnQ+PjgpOworCXNuZF9hbHM0X2NyX3dyaXRlKGNoaXAsIEFMUzRLX0NSMUNfRklGTzJfQkxPQ0tfTEVOR1RIX0xPLCBjb3VudCAmIDB4ZmYpOworCXNuZF9hbHM0X2NyX3dyaXRlKGNoaXAsIEFMUzRLX0NSMURfRklGTzJfQkxPQ0tfTEVOR1RIX0hJLCBjb3VudCA+PiA4KTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPm1peGVyX2xvY2spOwogCXJldHVybiAwOwogfQpAQCAtMjc1LDcgKzQyMSw3IEBACiAJY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKIAkKIAlpZiAoY2hpcC0+cGxheWJhY2tfZm9ybWF0ICYgQUxTNDAwMF9GT1JNQVRfMTZCSVQpCi0JCWNvdW50ID4+PTE7CisJCWNvdW50ID4+PSAxOwogCWNvdW50LS07CiAJCiAJLyogRklYTUU6IGZyb20gc2Vjb25kIHBsYXliYWNrIG9uLCB0aGVyZSdzIGEgbG90IG1vcmUgY2xpY2tzIGFuZCBwb3BzCkBAIC0yOTIsOCArNDM4LDggQEAKIAkvKiBzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBTQl9EU1BfU1BFQUtFUl9PTik7ICovCiAJc25kX3NiZHNwX2NvbW1hbmQoY2hpcCwgcGxheWJhY2tfY21kKGNoaXApLmRzcF9jbWQpOwogCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIHBsYXliYWNrX2NtZChjaGlwKS5mb3JtYXQpOwotCXNuZF9zYmRzcF9jb21tYW5kKGNoaXAsIGNvdW50KTsKLQlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBjb3VudD4+OCk7CisJc25kX3NiZHNwX2NvbW1hbmQoY2hpcCwgY291bnQgJiAweGZmKTsKKwlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBjb3VudCA+PiA4KTsKIAlzbmRfc2Jkc3BfY29tbWFuZChjaGlwLCBwbGF5YmFja19jbWQoY2hpcCkuZG1hX29mZik7CQogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCQpAQCAtMzA1LDE3ICs0NTEsMjUgQEAKIAlzdHJ1Y3Qgc25kX3NiICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCWludCByZXN1bHQgPSAwOwogCQorCS8qIEZJWE1FIHJhY2UgY29uZGl0aW9uIGluIGhlcmUhISEKKwkgICBjaGlwLT5tb2RlIG5vbi1hdG9taWMgdXBkYXRlIGdldHMgY29uc2lzdGVudGx5IHByb3RlY3RlZAorCSAgIGJ5IHJlZ19sb2NrIGFsd2F5cywgX2V4Y2VwdF8gZm9yIHRoaXMgcGxhY2UhIQorCSAgIFByb2JhYmx5IG5lZWQgdG8gdGFrZSByZWdfbG9jayBhcyBvdXRlciAob3IgaW5uZXI/PykgbG9jaywgdG9vLgorCSAgIChvciBzZXJpYWxpemUgYm90aCBsb2NrIG9wZXJhdGlvbnM/IHByb2JhYmx5IG5vdCwgdGhvdWdoLi4uIC0gcmFjeT8pCisJKi8KIAlzcGluX2xvY2soJmNoaXAtPm1peGVyX2xvY2spOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAkJY2hpcC0+bW9kZSB8PSBTQl9SQVRFX0xPQ0tfQ0FQVFVSRTsKLQkJc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhkZSwgY2FwdHVyZV9jbWQoY2hpcCkpOworCQlzbmRfYWxzNF9jcl93cml0ZShjaGlwLCBBTFM0S19DUjFFX0ZJRk8yX0NPTlRST0wsCisJCQkJCQkJIGNhcHR1cmVfY21kKGNoaXApKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAkJY2hpcC0+bW9kZSAmPSB+U0JfUkFURV9MT0NLX0NBUFRVUkU7Ci0JCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsIDB4ZGUsIDApOworCQlzbmRfYWxzNF9jcl93cml0ZShjaGlwLCBBTFM0S19DUjFFX0ZJRk8yX0NPTlRST0wsCisJCQkJCQkJIGNhcHR1cmVfY21kKGNoaXApKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzdWx0ID0gLUVJTlZBTDsKQEAgLTM1Niw4ICs1MTAsOSBAQAogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsJCi0JcmVzdWx0ID0gc25kX2FsczQwMDBfZ2NyX3JlYWQoY2hpcCwgMHhhNCkgJiAweGZmZmY7CisJcmVzdWx0ID0gc25kX2FsczRrX2djcl9yZWFkKGNoaXAsIEFMUzRLX0dDUkE0X0ZJRk8yX0NVUlJFTlRfQUREUik7CiAJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXN1bHQgJj0gMHhmZmZmOwogCXJldHVybiBieXRlc190b19mcmFtZXMoIHN1YnN0cmVhbS0+cnVudGltZSwgcmVzdWx0ICk7CiB9CiAKQEAgLTM2Nyw4ICs1MjIsOSBAQAogCXVuc2lnbmVkIHJlc3VsdDsKIAogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwkKLQlyZXN1bHQgPSBzbmRfYWxzNDAwMF9nY3JfcmVhZChjaGlwLCAweGEwKSAmIDB4ZmZmZjsKKwlyZXN1bHQgPSBzbmRfYWxzNGtfZ2NyX3JlYWQoY2hpcCwgQUxTNEtfR0NSQTBfRklGTzFfQ1VSUkVOVF9BRERSKTsKIAlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJlc3VsdCAmPSAweGZmZmY7CiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyggc3Vic3RyZWFtLT5ydW50aW1lLCByZXN1bHQgKTsKIH0KIApAQCAtMzc2LDQ1ICs1MzIsNjMgQEAKICAqIHJldHVybiBJUlFfSEFORExFRCBubyBtYXR0ZXIgd2hldGhlciB3ZSBhY3R1YWxseSBoYWQgYW4gSVJRIGZsYWcgb3Igbm90KS4KICAqIEFMUzQwMDBhLlBERiB3cml0ZXMgdGhhdCB3aGlsZSBBQ0tpbmcgSVJRIGluIFBDSSBibG9jayB3aWxsICpub3QqIEFDSwogICogdGhlIElSUSBpbiB0aGUgU0IgY29yZSwgQUNLaW5nIElSUSBpbiBTQiBibG9jayAqd2lsbCogQUNLIHRoZSBQQ0kgSVJRCi0gKiByZWdpc3RlciAoYWx0X3BvcnQgKyAweDBlKS4gUHJvYmFibHkgc29tZXRoaW5nIGNvdWxkIGJlIG9wdGltaXplZCBoZXJlIHRvCi0gKiBxdWVyeS93cml0ZSBvbmUgcmVnaXN0ZXIgb25seS4uLgorICogcmVnaXN0ZXIgKGFsdF9wb3J0ICsgQUxTNEtfSU9CXzBFX0lSUVRZUEVfU0JfQ1IxRV9NUFUpLiBQcm9iYWJseSBzb21ldGhpbmcKKyAqIGNvdWxkIGJlIG9wdGltaXplZCBoZXJlIHRvIHF1ZXJ5L3dyaXRlIG9uZSByZWdpc3RlciBvbmx5Li4uCiAgKiBBbmQgZXZlbiBpZiBib3RoIHJlZ2lzdGVycyBuZWVkIHRvIGJlIHF1ZXJpZWQsIHRoZW4gdGhlcmUncyBzdGlsbCB0aGUKICAqIHF1ZXN0aW9uIG9mIHdoZXRoZXIgaXQncyBhY3R1YWxseSBjb3JyZWN0IHRvIEFDSyBQQ0kgSVJRIGJlZm9yZSByZWFkaW5nCiAgKiBTQiBJUlEgbGlrZSB3ZSBkbyBub3csIHNpbmNlIEFMUzQwMDBhLlBERiBtZW50aW9ucyB0aGF0IFBDSSBJUlEgd2lsbCAqY2xlYXIqCiAgKiBTQiBJUlEgc3RhdHVzLgorICogKGhtbSwgU1BFQ1NfUEFHRTogMzggbWVudGlvbnMgaXQgdGhlIG90aGVyIHdheSBhcm91bmQhKQogICogQW5kIGRvIHdlICpyZWFsbHkqIG5lZWQgdGhlIGxvY2sgaGVyZSBmb3IgKnJlYWRpbmcqIFNCX0RTUDRfSVJRU1RBVFVTPz8KICAqICovCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX2FsczQwMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc25kX3NiICpjaGlwID0gZGV2X2lkOwotCXVuc2lnbmVkIGdjcl9zdGF0dXM7Ci0JdW5zaWduZWQgc2Jfc3RhdHVzOworCXVuc2lnbmVkIHBjaV9pcnFzdGF0dXM7CisJdW5zaWduZWQgc2JfaXJxc3RhdHVzOwogCi0JLyogZmluZCBvdXQgd2hpY2ggYml0IG9mIHRoZSBBTFM0MDAwIHByb2R1Y2VkIHRoZSBpbnRlcnJ1cHQgKi8KLQlnY3Jfc3RhdHVzID0gaW5iKGNoaXAtPmFsdF9wb3J0ICsgMHhlKTsKLQotCWlmICgoZ2NyX3N0YXR1cyAmIDB4ODApICYmIChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pKSAvKiBwbGF5YmFjayAqLworCS8qIGZpbmQgb3V0IHdoaWNoIGJpdCBvZiB0aGUgQUxTNDAwMCBQQ0kgYmxvY2sgcHJvZHVjZWQgdGhlIGludGVycnVwdCwKKwkgICBTUEVDU19QQUdFOiAzOCwgNSAqLworCXBjaV9pcnFzdGF0dXMgPSBzbmRfYWxzNGtfaW9iYXNlX3JlYWRiKGNoaXAtPmFsdF9wb3J0LAorCQkJCSBBTFM0S19JT0JfMEVfSVJRVFlQRV9TQl9DUjFFX01QVSk7CisJaWYgKChwY2lfaXJxc3RhdHVzICYgQUxTNEtfSU9CXzBFX1NCX0RNQV9JUlEpCisJICYmIChjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pKSAvKiBwbGF5YmFjayAqLwogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnBsYXliYWNrX3N1YnN0cmVhbSk7Ci0JaWYgKChnY3Jfc3RhdHVzICYgMHg0MCkgJiYgKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKSkgLyogY2FwdHVyaW5nICovCisJaWYgKChwY2lfaXJxc3RhdHVzICYgQUxTNEtfSU9CXzBFX0NSMUVfSVJRKQorCSAmJiAoY2hpcC0+Y2FwdHVyZV9zdWJzdHJlYW0pKSAvKiBjYXB0dXJpbmcgKi8KIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSk7Ci0JaWYgKChnY3Jfc3RhdHVzICYgMHgxMCkgJiYgKGNoaXAtPnJtaWRpKSkgLyogTVBVNDAxIGludGVycnVwdCAqLworCWlmICgocGNpX2lycXN0YXR1cyAmIEFMUzRLX0lPQl8wRV9NUFVfSVJRKQorCSAmJiAoY2hpcC0+cm1pZGkpKSAvKiBNUFU0MDEgaW50ZXJydXB0ICovCiAJCXNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaXJxLCBjaGlwLT5ybWlkaS0+cHJpdmF0ZV9kYXRhKTsKLQkvKiByZWxlYXNlIHRoZSBnY3IgKi8KLQlvdXRiKGdjcl9zdGF0dXMsIGNoaXAtPmFsdF9wb3J0ICsgMHhlKTsKKwkvKiBBQ0sgdGhlIFBDSSBibG9jayBJUlEgKi8KKwlzbmRfYWxzNGtfaW9iYXNlX3dyaXRlYihjaGlwLT5hbHRfcG9ydCwKKwkJCSBBTFM0S19JT0JfMEVfSVJRVFlQRV9TQl9DUjFFX01QVSwgcGNpX2lycXN0YXR1cyk7CiAJCiAJc3Bpbl9sb2NrKCZjaGlwLT5taXhlcl9sb2NrKTsKLQlzYl9zdGF0dXMgPSBzbmRfc2JtaXhlcl9yZWFkKGNoaXAsIFNCX0RTUDRfSVJRU1RBVFVTKTsKKwkvKiBTUEVDU19QQUdFOiAyMCAqLworCXNiX2lycXN0YXR1cyA9IHNuZF9zYm1peGVyX3JlYWQoY2hpcCwgU0JfRFNQNF9JUlFTVEFUVVMpOwogCXNwaW5fdW5sb2NrKCZjaGlwLT5taXhlcl9sb2NrKTsKIAkKLQlpZiAoc2Jfc3RhdHVzICYgU0JfSVJRVFlQRV84QklUKSAKKwlpZiAoc2JfaXJxc3RhdHVzICYgU0JfSVJRVFlQRV84QklUKQogCQlzbmRfc2JfYWNrXzhiaXQoY2hpcCk7Ci0JaWYgKHNiX3N0YXR1cyAmIFNCX0lSUVRZUEVfMTZCSVQpIAorCWlmIChzYl9pcnFzdGF0dXMgJiBTQl9JUlFUWVBFXzE2QklUKQogCQlzbmRfc2JfYWNrXzE2Yml0KGNoaXApOwotCWlmIChzYl9zdGF0dXMgJiBTQl9JUlFUWVBFX01QVUlOKQorCWlmIChzYl9pcnFzdGF0dXMgJiBTQl9JUlFUWVBFX01QVUlOKQogCQlpbmIoY2hpcC0+bXB1X3BvcnQpOwotCWlmIChzYl9zdGF0dXMgJiAweDIwKQotCQlpbmIoU0JQKGNoaXAsIFJFU0VUKSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChzYl9pcnFzdGF0dXMgJiBBTFM0S19JUlFUWVBFX0NSMUVfRE1BKQorCQlzbmRfYWxzNGtfaW9iYXNlX3JlYWRiKGNoaXAtPmFsdF9wb3J0LAorCQkJCQlBTFM0S19JT0JfMTZfQUNLX0ZPUl9DUjFFKTsKKworCS8qIHByaW50ayhLRVJOX0lORk8gImFsczQwMDA6IGlycSAweCUwNHggMHglMDR4XG4iLAorCQkJCQkgcGNpX2lycXN0YXR1cywgc2JfaXJxc3RhdHVzKTsgKi8KKworCS8qIG9ubHkgYWNrIHRoZSB0aGluZ3Mgd2UgYWN0dWFsbHkgaGFuZGxlZCBhYm92ZSAqLworCXJldHVybiBJUlFfUkVUVkFMKAorCSAgICAgKHBjaV9pcnFzdGF0dXMgJiAoQUxTNEtfSU9CXzBFX1NCX0RNQV9JUlF8QUxTNEtfSU9CXzBFX0NSMUVfSVJRfAorCQkJCUFMUzRLX0lPQl8wRV9NUFVfSVJRKSkKKwkgIHx8IChzYl9pcnFzdGF0dXMgJiAoU0JfSVJRVFlQRV84QklUfFNCX0lSUVRZUEVfMTZCSVR8CisJCQkJU0JfSVJRVFlQRV9NUFVJTnxBTFM0S19JUlFUWVBFX0NSMUVfRE1BKSkKKwkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MjYsNyArNzAwLDggQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBTFM0MDAwIERTUCIsIGRldmljZSwgMSwgMSwgJnBjbSkpIDwgMCkKKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiQUxTNDAwMCBEU1AiLCBkZXZpY2UsIDEsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKIAlwY20tPmluZm9fZmxhZ3MgPSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CkBAIC01NDMsNDggKzcxOCw1NSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzbmRfYWxzNDAwMF9zZXRfYWRkcih1bnNpZ25lZCBsb25nIGdjciwKLQkJCQkJdW5zaWduZWQgaW50IHNiLAotCQkJCQl1bnNpZ25lZCBpbnQgbXB1LAotCQkJCQl1bnNpZ25lZCBpbnQgb3BsLAotCQkJCQl1bnNpZ25lZCBpbnQgZ2FtZSkKK3N0YXRpYyB2b2lkIHNuZF9hbHM0MDAwX3NldF9hZGRyKHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgc2JfaW8sCisJCQkJCXVuc2lnbmVkIGludCBtcHVfaW8sCisJCQkJCXVuc2lnbmVkIGludCBvcGxfaW8sCisJCQkJCXVuc2lnbmVkIGludCBnYW1lX2lvKQogewotCXUzMiBjb25mQSA9IDA7Ci0JdTMyIGNvbmZCID0gMDsKKwl1MzIgY2ZnMSA9IDA7CisJdTMyIGNmZzIgPSAwOwogCi0JaWYgKG1wdSA+IDApCi0JCWNvbmZCIHw9IChtcHUgfCAxKSA8PCAxNjsKLQlpZiAoc2IgPiAwKQotCQljb25mQiB8PSAoc2IgfCAxKTsKLQlpZiAoZ2FtZSA+IDApCi0JCWNvbmZBIHw9IChnYW1lIHwgMSkgPDwgMTY7Ci0JaWYgKG9wbCA+IDApCQotCQljb25mQSB8PSAob3BsIHwgMSk7Ci0Jc25kX2FsczQwMDBfZ2NyX3dyaXRlX2FkZHIoZ2NyLCAweGE4LCBjb25mQSk7Ci0Jc25kX2FsczQwMDBfZ2NyX3dyaXRlX2FkZHIoZ2NyLCAweGE5LCBjb25mQik7CisJaWYgKG1wdV9pbyA+IDApCisJCWNmZzIgfD0gKG1wdV9pbyB8IDEpIDw8IDE2OworCWlmIChzYl9pbyA+IDApCisJCWNmZzIgfD0gKHNiX2lvIHwgMSk7CisJaWYgKGdhbWVfaW8gPiAwKQorCQljZmcxIHw9IChnYW1lX2lvIHwgMSkgPDwgMTY7CisJaWYgKG9wbF9pbyA+IDApCisJCWNmZzEgfD0gKG9wbF9pbyB8IDEpOworCXNuZF9hbHM0a19nY3Jfd3JpdGVfYWRkcihpb2Jhc2UsIEFMUzRLX0dDUkE4X0xFR0FDWV9DRkcxLCBjZmcxKTsKKwlzbmRfYWxzNGtfZ2NyX3dyaXRlX2FkZHIoaW9iYXNlLCBBTFM0S19HQ1JBOV9MRUdBQ1lfQ0ZHMiwgY2ZnMik7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9hbHM0MDAwX2NvbmZpZ3VyZShzdHJ1Y3Qgc25kX3NiICpjaGlwKQogewotCXVuc2lnbmVkIHRtcDsKKwl1OCB0bXA7CiAJaW50IGk7CiAKIAkvKiBkbyBzb21lIG1vcmUgY29uZmlndXJhdGlvbiAqLwogCXNwaW5fbG9ja19pcnEoJmNoaXAtPm1peGVyX2xvY2spOwotCXRtcCA9IHNuZF9zYm1peGVyX3JlYWQoY2hpcCwgMHhjMCk7Ci0Jc25kX3NibWl4ZXJfd3JpdGUoY2hpcCwgMHhjMCwgdG1wfDB4ODApOwotCS8qIGFsd2F5cyBzZWxlY3QgRE1BIGNoYW5uZWwgMCwgc2luY2Ugd2UgZG8gbm90IGFjdHVhbGx5IHVzZSBETUEgKi8KKwl0bXAgPSBzbmRfYWxzNF9jcl9yZWFkKGNoaXAsIEFMUzRLX0NSMF9TQl9DT05GSUcpOworCXNuZF9hbHM0X2NyX3dyaXRlKGNoaXAsIEFMUzRLX0NSMF9TQl9DT05GSUcsCisJCQkJdG1wfEFMUzRLX0NSMF9NWDgwXzgxX1JFR19XUklURV9FTkFCTEUpOworCS8qIGFsd2F5cyBzZWxlY3QgRE1BIGNoYW5uZWwgMCwgc2luY2Ugd2UgZG8gbm90IGFjdHVhbGx5IHVzZSBETUEKKwkgKiBTUEVDU19QQUdFOiAxOS8yMCAqLwogCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsIFNCX0RTUDRfRE1BU0VUVVAsIFNCX0RNQVNFVFVQX0RNQTApOwotCXNuZF9zYm1peGVyX3dyaXRlKGNoaXAsIDB4YzAsIHRtcCYweDdmKTsKKwlzbmRfYWxzNF9jcl93cml0ZShjaGlwLCBBTFM0S19DUjBfU0JfQ09ORklHLAorCQkJCSB0bXAgJiB+QUxTNEtfQ1IwX01YODBfODFfUkVHX1dSSVRFX0VOQUJMRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5taXhlcl9sb2NrKTsKIAkKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JLyogbWFnaWMgbnVtYmVyLiBFbmFibGVzIGludGVycnVwdHMoPykgKi8KLQlzbmRfYWxzNDAwMF9nY3Jfd3JpdGUoY2hpcCwgMHg4YywgMHgyODAwMCk7Ci0JZm9yKGkgPSAweDkxOyBpIDw9IDB4OTY7ICsraSkKLQkJc25kX2FsczQwMDBfZ2NyX3dyaXRlKGNoaXAsIGksIDApOworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJc25kX2FsczRrX2djcl93cml0ZShjaGlwLCBBTFM0S19HQ1I4Q19NSVNDX0NUUkwsCisJCQkJCUFMUzRLX0dDUjhDX0lSUV9NQVNLX0NUUkxfRU5BQkxFKTsKKworCS8qIFNQRUNTX1BBR0U6IDM5ICovCisJZm9yIChpID0gQUxTNEtfR0NSOTFfRE1BMF9BRERSOyBpIDw9IEFMUzRLX0dDUjk2X0RNQTNfTU9ERV9DT1VOVDsgKytpKQorCQlzbmRfYWxzNGtfZ2NyX3dyaXRlKGNoaXAsIGksIDApOwogCQotCXNuZF9hbHM0MDAwX2djcl93cml0ZShjaGlwLCAweDk5LCBzbmRfYWxzNDAwMF9nY3JfcmVhZChjaGlwLCAweDk5KSk7CisJc25kX2FsczRrX2djcl93cml0ZShjaGlwLCBBTFM0S19HQ1I5OV9ETUFfRU1VTEFUSU9OX0NUUkwsCisJCXNuZF9hbHM0a19nY3JfcmVhZChjaGlwLCBBTFM0S19HQ1I5OV9ETUFfRU1VTEFUSU9OX0NUUkwpKTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIH0KIApAQCAtNjI4LDcgKzgxMCw3IEBACiAJZ2FtZXBvcnRfc2V0X3BvcnRfZGF0YShncCwgcik7CiAKIAkvKiBFbmFibGUgbGVnYWN5IGpveXN0aWNrIHBvcnQgKi8KLQlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+Z2NyLCAwLCAwLCAwLCAxKTsKKwlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+aW9iYXNlLCAwLCAwLCAwLCAxKTsKIAogCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQoYWNhcmQtPmdhbWVwb3J0KTsKIApAQCAtNjQzLDcgKzgyNSw5IEBACiAJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChhY2FyZC0+Z2FtZXBvcnQpOwogCQlhY2FyZC0+Z2FtZXBvcnQgPSBOVUxMOwogCi0JCXNuZF9hbHM0MDAwX3NldF9hZGRyKGFjYXJkLT5nY3IsIDAsIDAsIDAsIDApOyAvKiBkaXNhYmxlIGpveXN0aWNrICovCisJCS8qIGRpc2FibGUgam95c3RpY2sgKi8KKwkJc25kX2FsczQwMDBfc2V0X2FkZHIoYWNhcmQtPmlvYmFzZSwgMCwgMCwgMCwgMCk7CisKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyKTsKIAl9CiB9CkBAIC02NTQsMTAgKzgzOCwxMCBAQAogCiBzdGF0aWMgdm9pZCBzbmRfY2FyZF9hbHM0MDAwX2ZyZWUoIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCApCiB7Ci0Jc3RydWN0IHNuZF9jYXJkX2FsczQwMDAgKiBhY2FyZCA9IChzdHJ1Y3Qgc25kX2NhcmRfYWxzNDAwMCAqKWNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX2NhcmRfYWxzNDAwMCAqYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAkvKiBtYWtlIHN1cmUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwotCXNuZF9hbHM0MDAwX2djcl93cml0ZV9hZGRyKCBhY2FyZC0+Z2NyLCAweDhjLCAwKTsKKwlzbmRfYWxzNGtfZ2NyX3dyaXRlX2FkZHIoYWNhcmQtPmlvYmFzZSwgQUxTNEtfR0NSOENfTUlTQ19DVFJMLCAwKTsKIAkvKiBmcmVlIHJlc291cmNlcyAqLwogCXNuZF9hbHM0MDAwX2ZyZWVfZ2FtZXBvcnQoYWNhcmQpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoYWNhcmQtPnBjaSk7CkBAIC02NzAsNyArODU0LDcgQEAKIAlzdGF0aWMgaW50IGRldjsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9jYXJkX2FsczQwMDAgKmFjYXJkOwotCXVuc2lnbmVkIGxvbmcgZ2NyOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwogCXN0cnVjdCBzbmRfc2IgKmNoaXA7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCXVuc2lnbmVkIHNob3J0IHdvcmQ7CkBAIC02OTksMzEgKzg4MywzMiBAQAogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JZ2NyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9DT01NQU5ELCAmd29yZCk7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJX0NPTU1BTkQsIHdvcmQgfCBQQ0lfQ09NTUFORF9JTyk7CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAkKIAljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAKLQkJCSAgICBzaXplb2YoIHN0cnVjdCBzbmRfY2FyZF9hbHM0MDAwICkgKTsKKwkJCSAgICBzaXplb2YoKmFjYXJkKSAvKiBwcml2YXRlX2RhdGE6IGFjYXJkICovKTsKIAlpZiAoY2FyZCA9PSBOVUxMKSB7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWFjYXJkID0gKHN0cnVjdCBzbmRfY2FyZF9hbHM0MDAwICopY2FyZC0+cHJpdmF0ZV9kYXRhOworCWFjYXJkID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFjYXJkLT5wY2kgPSBwY2k7Ci0JYWNhcmQtPmdjciA9IGdjcjsKKwlhY2FyZC0+aW9iYXNlID0gaW9iYXNlOwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9jYXJkX2FsczQwMDBfZnJlZTsKIAogCS8qIGRpc2FibGUgYWxsIGxlZ2FjeSBJU0Egc3R1ZmYgKi8KLQlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+Z2NyLCAwLCAwLCAwLCAwKTsKKwlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+aW9iYXNlLCAwLCAwLCAwLCAwKTsKIAogCWlmICgoZXJyID0gc25kX3NiZHNwX2NyZWF0ZShjYXJkLAotCQkJCSAgICBnY3IgKyAweDEwLAorCQkJCSAgICBpb2Jhc2UgKyBBTFM0S19JT0JfMTBfQURMSUJfQUREUjAsCiAJCQkJICAgIHBjaS0+aXJxLAorCQkvKiBpbnRlcm5hbGx5IHJlZ2lzdGVyZWQgYXMgSVJRRl9TSEFSRUQgaW4gY2FzZSBvZiBBTFM0MDAwIFNCICovCiAJCQkJICAgIHNuZF9hbHM0MDAwX2ludGVycnVwdCwKIAkJCQkgICAgLTEsCiAJCQkJICAgIC0xLApAQCAtNzM0LDcgKzkxOSw3IEBACiAJYWNhcmQtPmNoaXAgPSBjaGlwOwogCiAJY2hpcC0+cGNpID0gcGNpOwotCWNoaXAtPmFsdF9wb3J0ID0gZ2NyOworCWNoaXAtPmFsdF9wb3J0ID0gaW9iYXNlOwogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCXNuZF9hbHM0MDAwX2NvbmZpZ3VyZShjaGlwKTsKQEAgLTc0NSwxMSArOTMwLDE4IEBACiAJCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+YWx0X3BvcnQsIGNoaXAtPmlycSk7CiAKIAlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoIGNhcmQsIDAsIE1QVTQwMV9IV19BTFM0MDAwLAotCQkJCSAgICAgICAgZ2NyKzB4MzAsIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCisJCQkJCWlvYmFzZSArIEFMUzRLX0lPQl8zMF9NSURJX0RBVEEsCisJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCiAJCQkJCXBjaS0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsIGdjcisweDMwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCisJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzMwX01JRElfREFUQSk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CisJLyogRklYTUU6IEFMUzQwMDAgaGFzIGludGVyZXN0aW5nIE1QVTQwMSBjb25maWd1cmF0aW9uIGZlYXR1cmVzCisJICogYXQgQUxTNEtfQ1IxQV9NUFU0MDFfVUFSVF9NT0RFX0NPTlRST0wKKwkgKiAocGFzcy10aHJ1IC8gVUFSVCBzd2l0Y2hpbmcsIGZhc3QgTUlESSBjbG9jaywgZXRjLiksCisJICogaG93ZXZlciB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW4gQUxTQSBBUEkgZm9yIHRoaXMuLi4KKwkgKiBTUEVDU19QQUdFOiAyMSAqLwogCiAJaWYgKChlcnIgPSBzbmRfYWxzNDAwMF9wY20oY2hpcCwgMCkpIDwgMCkgewogCQlnb3RvIG91dF9lcnI7CkBAIC03NTgsMTAgKzk1MCwxMyBAQAogCQlnb3RvIG91dF9lcnI7CiAJfQkgICAgCiAKLQlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGdjcisweDEwLCBnY3IrMHgxMiwKKwlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsCisJCQkJaW9iYXNlICsgQUxTNEtfSU9CXzEwX0FETElCX0FERFIwLAorCQkJCWlvYmFzZSArIEFMUzRLX0lPQl8xMl9BRExJQl9BRERSMiwKIAkJCSAgICBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbHM0MDAwOiBubyBPUEwgZGV2aWNlIGF0IDB4JWx4LTB4JWx4P1xuIiwKLQkJCSAgIGdjcisweDEwLCBnY3IrMHgxMiApOworCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEwX0FETElCX0FERFIwLAorCQkJICAgaW9iYXNlICsgQUxTNEtfSU9CXzEyX0FETElCX0FERFIyKTsKIAl9IGVsc2UgewogCQlpZiAoKGVyciA9IHNuZF9vcGwzX2h3ZGVwX25ldyhvcGwzLCAwLCAxLCBOVUxMKSkgPCAwKSB7CiAJCQlnb3RvIG91dF9lcnI7CkBAIC04MzEsMTMgKzEwMjYsMTMgQEAKIAogI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIAlpZiAoYWNhcmQtPmdhbWVwb3J0KQotCQlzbmRfYWxzNDAwMF9zZXRfYWRkcihhY2FyZC0+Z2NyLCAwLCAwLCAwLCAxKTsKKwkJc25kX2FsczQwMDBfc2V0X2FkZHIoYWNhcmQtPmlvYmFzZSwgMCwgMCwgMCwgMSk7CiAjZW5kaWYKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKaW5kZXggNDU3MjI4Zi4uMDg1YTUyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cC5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMzcsNyArMzcsNyBAQAogTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBVEkgSVhQIEFDOTcgY29udHJvbGxlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7QVRJLElYUDE1MC8yMDAvMjUwLzMwMC80MDB9fSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7QVRJLElYUDE1MC8yMDAvMjUwLzMwMC80MDAvNjAwfX0iKTsKIAogc3RhdGljIGludCBpbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsJLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwpAQCAtMjkwLDYgKzI5MCw3IEBACiAJeyAweDEwMDIsIDB4NDM0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBTQjIwMCAqLwogCXsgMHgxMDAyLCAweDQzNjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwgLyogU0IzMDAgKi8KIAl7IDB4MTAwMiwgMHg0MzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIFNCNDAwICovCisJeyAweDEwMDIsIDB4NDM4MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBTQjYwMCAqLwogCXsgMCwgfQogfTsKIApAQCAtNzIyLDcgKzcyMyw5IEBACiAJc3RydWN0IGF0aWl4cF9kbWEgKmRtYSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWludCBlcnIgPSAwOwogCi0Jc25kX2Fzc2VydChkbWEtPm9wcy0+ZW5hYmxlX3RyYW5zZmVyICYmIGRtYS0+b3BzLT5mbHVzaF9kbWEsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlciB8fAorCQkgICAgICAgIWRtYS0+b3BzLT5mbHVzaF9kbWEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCXN3aXRjaCAoY21kKSB7CkBAIC0xMDMyLDcgKzEwMzUsOCBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoZG1hLT5vcHMgJiYgZG1hLT5vcHMtPmVuYWJsZV9kbWEsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZG1hLT5vcHMgfHwgIWRtYS0+b3BzLT5lbmFibGVfZG1hKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZG1hLT5vcGVuZWQpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0xMDY0LDcgKzEwNjgsOCBAQAogewogCXN0cnVjdCBhdGlpeHAgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJLyogZGlzYWJsZSBETUEgYml0cyAqLwotCXNuZF9hc3NlcnQoZG1hLT5vcHMgJiYgZG1hLT5vcHMtPmVuYWJsZV9kbWEsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZG1hLT5vcHMgfHwgIWRtYS0+b3BzLT5lbmFibGVfZG1hKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNoaXAsIDApOwogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IGQ0NTdhMzIuLjJmMTA2MzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTY3NCw3ICs2NzQsOSBAQAogCXN0cnVjdCBhdGlpeHBfZG1hICpkbWEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyID0gMDsKIAotCXNuZF9hc3NlcnQoZG1hLT5vcHMtPmVuYWJsZV90cmFuc2ZlciAmJiBkbWEtPm9wcy0+Zmx1c2hfZG1hLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWRtYS0+b3BzLT5lbmFibGVfdHJhbnNmZXIgfHwKKwkJICAgICAgICFkbWEtPm9wcy0+Zmx1c2hfZG1hKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlzd2l0Y2goY21kKSB7CkBAIC04NjUsNyArODY3LDggQEAKIAkJLm1hc2sgPSAwLAogCX07CiAKLQlzbmRfYXNzZXJ0KGRtYS0+b3BzICYmIGRtYS0+b3BzLT5lbmFibGVfZG1hLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWRtYS0+b3BzIHx8ICFkbWEtPm9wcy0+ZW5hYmxlX2RtYSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGRtYS0+b3BlbmVkKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtODk1LDcgKzg5OCw4IEBACiB7CiAJc3RydWN0IGF0aWl4cF9tb2RlbSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAkvKiBkaXNhYmxlIERNQSBiaXRzICovCi0Jc25kX2Fzc2VydChkbWEtPm9wcyAmJiBkbWEtPm9wcy0+ZW5hYmxlX2RtYSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFkbWEtPm9wcyB8fCAhZG1hLT5vcHMtPmVuYWJsZV9kbWEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAJZG1hLT5vcHMtPmVuYWJsZV9kbWEoY2hpcCwgMCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5oIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuaAppbmRleCA0YWFkMzViLi5jZjQ2YmJhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5oCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmgKQEAgLTEyNSw3ICsxMjUsNiBAQAogCS8qIFZpcnR1YWwgcGFnZSBleHRlbmRlciBzdHVmZiAqLwogCWludCBucl9wZXJpb2RzOwogCWludCBwZXJpb2RfYnl0ZXM7Ci0Jc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmOwkvKiBETUEgU2NhdHRlciBHYXRoZXIgc3RydWN0ICovCiAJaW50IHBlcmlvZF9yZWFsOwogCWludCBwZXJpb2RfdmlydDsKIApAQCAtMTk1LDE2ICsxOTQsMTQgQEAKIAogLyogRE1BIEVuZ2luZXMuICovCiBzdGF0aWMgdm9pZCB2b3J0ZXhfYWRiZG1hX3NldGJ1ZmZlcnModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX3NnX2J1ZiAqIHNnYnVmLCBpbnQgc2l6ZSwKLQkJCQkgICAgIGludCBjb3VudCk7CisJCQkJICAgICBpbnQgc2l6ZSwgaW50IGNvdW50KTsKIHN0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc2V0bW9kZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IGFkYmRtYSwgaW50IGllLAogCQkJCSAgaW50IGRpciwgaW50IGZtdCwgaW50IGQsCiAJCQkJICB1MzIgb2Zmc2V0KTsKIHN0YXRpYyB2b2lkIHZvcnRleF9hZGJkbWFfc2V0c3RhcnRidWZmZXIodm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsIGludCBzYik7CiAjaWZuZGVmIENISVBfQVU4ODEwCiBzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfc2V0YnVmZmVycyh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3NnX2J1ZiAqIHNnYnVmLCBpbnQgc2l6ZSwKLQkJCQkgICAgaW50IGNvdW50KTsKKwkJCQkgICAgaW50IHNpemUsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCB2b3J0ZXhfd3RkbWFfc2V0bW9kZSh2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hLCBpbnQgaWUsIGludCBmbXQsIGludCBkLAkvKmludCBlLCAqLwogCQkJCSB1MzIgb2Zmc2V0KTsKIHN0YXRpYyB2b2lkIHZvcnRleF93dGRtYV9zZXRzdGFydGJ1ZmZlcih2b3J0ZXhfdCAqIHZvcnRleCwgaW50IHd0ZG1hLCBpbnQgc2IpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jCmluZGV4IDMzM2M2MmQuLmIwNzBlNTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCiAJLyogU2V0IGNsaXBwaW5nIGNlaWxpbmcgKHRoaXMgbWF5IGJlIGFsbCB3cm9uZykuICovCiAJLyoKLQlmb3IgKHggPSAwOyB4ID4gMHg4MDsgeCsrKSB7CisJZm9yICh4ID0gMDsgeCA8IDB4ODA7IHgrKykgewogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JWEVSX0NMSVAgKyAoeCA8PCAyKSwgMHgzZmZmZik7CiAJfQogCSovCkBAIC0xMDk3LDE5ICsxMDk3LDEyIEBACiAKIHN0YXRpYyB2b2lkCiB2b3J0ZXhfYWRiZG1hX3NldGJ1ZmZlcnModm9ydGV4X3QgKiB2b3J0ZXgsIGludCBhZGJkbWEsCi0JCQkgc3RydWN0IHNuZF9zZ19idWYgKiBzZ2J1ZiwgaW50IHBzaXplLCBpbnQgY291bnQpCisJCQkgaW50IHBzaXplLCBpbnQgY291bnQpCiB7CiAJc3RyZWFtX3QgKmRtYSA9ICZ2b3J0ZXgtPmRtYV9hZGJbYWRiZG1hXTsKIAotCWlmIChzZ2J1ZiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInZvcnRleDogRkFUQUw6IHNnYnVmIGlzIE5VTEwhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQkvL3ByaW50ayhLRVJOX0lORk8gInZvcnRleDogcGFnZSBjb3VudCA9ICVkLCB0Ymxjb3VudCA9ICVkXG4iLCBjb3VudCwgc2didWYtPnRibHNpemUpOwotCiAJZG1hLT5wZXJpb2RfYnl0ZXMgPSBwc2l6ZTsKIAlkbWEtPm5yX3BlcmlvZHMgPSBjb3VudDsKLQlkbWEtPnNnYnVmID0gc2didWY7CiAKIAlkbWEtPmNmZzAgPSAwOwogCWRtYS0+Y2ZnMSA9IDA7CkBAIC0xMTIwLDI2ICsxMTEzLDI2IEBACiAJCWRtYS0+Y2ZnMSB8PSAweDg4MDAwMDAwIHwgMHg0NDAwMDAwMCB8IDB4MzAwMDAwMDAgfCAocHNpemUgLSAxKTsKIAkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCiAJCQlWT1JURVhfQURCRE1BX0JVRkJBU0UgKyAoYWRiZG1hIDw8IDQpICsgMHhjLAotCQkJc25kX3NnYnVmX2dldF9hZGRyKHNnYnVmLCBwc2l6ZSAqIDMpKTsKKwkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sIHBzaXplICogMykpOwogCQkvKiAzIHBhZ2VzICovCiAJY2FzZSAzOgogCQlkbWEtPmNmZzAgfD0gMHgxMjAwMDAwMDsKIAkJZG1hLT5jZmcxIHw9IDB4ODAwMDAwMDAgfCAweDQwMDAwMDAwIHwgKChwc2l6ZSAtIDEpIDw8IDB4Yyk7CiAJCWh3d3JpdGUodm9ydGV4LT5tbWlvLAogCQkJVk9SVEVYX0FEQkRNQV9CVUZCQVNFICsgKGFkYmRtYSA8PCA0KSArIDB4OCwKLQkJCXNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1ZiwgcHNpemUgKiAyKSk7CisJCQlzbmRfcGNtX3NnYnVmX2dldF9hZGRyKGRtYS0+c3Vic3RyZWFtLCBwc2l6ZSAqIDIpKTsKIAkJLyogMiBwYWdlcyAqLwogCWNhc2UgMjoKIAkJZG1hLT5jZmcwIHw9IDB4ODgwMDAwMDAgfCAweDQ0MDAwMDAwIHwgMHgxMDAwMDAwMCB8IChwc2l6ZSAtIDEpOwogCQlod3dyaXRlKHZvcnRleC0+bW1pbywKIAkJCVZPUlRFWF9BREJETUFfQlVGQkFTRSArIChhZGJkbWEgPDwgNCkgKyAweDQsCi0JCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplKSk7CisJCQlzbmRfcGNtX3NnYnVmX2dldF9hZGRyKGRtYS0+c3Vic3RyZWFtLCBwc2l6ZSkpOwogCQkvKiAxIHBhZ2UgKi8KIAljYXNlIDE6CiAJCWRtYS0+Y2ZnMCB8PSAweDgwMDAwMDAwIHwgMHg0MDAwMDAwMCB8ICgocHNpemUgLSAxKSA8PCAweGMpOwogCQlod3dyaXRlKHZvcnRleC0+bW1pbywKIAkJCVZPUlRFWF9BREJETUFfQlVGQkFTRSArIChhZGJkbWEgPDwgNCksCi0JCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sIDApKTsKIAkJYnJlYWs7CiAJfQogCS8vcHJpbnRrKCJ2b3J0ZXg6IGNmZzAgPSAweCV4XG52b3J0ZXg6IGNmZzE9MHgleFxuIiwgZG1hLT5jZmcwLCBkbWEtPmNmZzEpOwpAQCAtMTIwNSw3ICsxMTk4LDcgQEAKIAkJCS8vaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQlVGQkFTRSsoKChhZGJkbWEgPDwgMikrcHApIDw8IDIpLCBkbWEtPnRhYmxlW3BdLmFkZHIpOwogCQkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCiAJCQkJVk9SVEVYX0FEQkRNQV9CVUZCQVNFICsgKCgoYWRiZG1hIDw8IDIpICsgcHApIDw8IDIpLAotCQkJCXNuZF9zZ2J1Zl9nZXRfYWRkcihkbWEtPnNnYnVmLAorCQkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sCiAJCQkJZG1hLT5wZXJpb2RfYnl0ZXMgKiBwKSk7CiAJCQkvKiBGb3JjZSB3cml0ZSB0aHJ1IGNhY2hlLiAqLwogCQkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZCQVNFICsKQEAgLTEyNDQsNyArMTIzNywxMCBAQAogCQkJaWYgKHBwID49IDQpCiAJCQkJcHAgLT0gNDsKIAkJfQotCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0FEQkRNQV9CVUZCQVNFKygoKGFkYmRtYSA8PCAyKStwcCkgPDwgMiksIHNuZF9zZ2J1Zl9nZXRfYWRkcihkbWEtPnNnYnVmLCBkbWEtPnBlcmlvZF9ieXRlcyAqIHApKTsKKwkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sCisJCQlWT1JURVhfQURCRE1BX0JVRkJBU0UgKyAoKChhZGJkbWEgPDwgMikgKyBwcCkgPDwgMiksCisJCQlzbmRfcGNtX3NnYnVmX2dldF9hZGRyKGRtYS0+c3Vic3RyZWFtLAorCQkJCQkgICAgICAgZG1hLT5wZXJpb2RfYnl0ZXMgKiBwKSk7CiAJCS8qIEZvcmNlIHdyaXRlIHRocnUgY2FjaGUuICovCiAJCWh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9BREJETUFfQlVGQkFTRSArICgoKGFkYmRtYSA8PCAyKStwcCkgPDwgMikpOwogCX0KQEAgLTEzNjcsMTMgKzEzNjMsMTIgQEAKIAogc3RhdGljIHZvaWQKIHZvcnRleF93dGRtYV9zZXRidWZmZXJzKHZvcnRleF90ICogdm9ydGV4LCBpbnQgd3RkbWEsCi0JCQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqIHNnYnVmLCBpbnQgcHNpemUsIGludCBjb3VudCkKKwkJCWludCBwc2l6ZSwgaW50IGNvdW50KQogewogCXN0cmVhbV90ICpkbWEgPSAmdm9ydGV4LT5kbWFfd3Rbd3RkbWFdOwogCiAJZG1hLT5wZXJpb2RfYnl0ZXMgPSBwc2l6ZTsKIAlkbWEtPm5yX3BlcmlvZHMgPSBjb3VudDsKLQlkbWEtPnNnYnVmID0gc2didWY7CiAKIAlkbWEtPmNmZzAgPSAwOwogCWRtYS0+Y2ZnMSA9IDA7CkBAIC0xMzgzLDIzICsxMzc4LDIzIEBACiAJY2FzZSA0OgogCQlkbWEtPmNmZzEgfD0gMHg4ODAwMDAwMCB8IDB4NDQwMDAwMDAgfCAweDMwMDAwMDAwIHwgKHBzaXplLTEpOwogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkJBU0UgKyAod3RkbWEgPDwgNCkgKyAweGMsCi0JCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplICogMykpOworCQkJc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihkbWEtPnN1YnN0cmVhbSwgcHNpemUgKiAzKSk7CiAJCS8qIDMgcGFnZXMgKi8KIAljYXNlIDM6CiAJCWRtYS0+Y2ZnMCB8PSAweDEyMDAwMDAwOwogCQlkbWEtPmNmZzEgfD0gMHg4MDAwMDAwMCB8IDB4NDAwMDAwMDAgfCAoKHBzaXplLTEpIDw8IDB4Yyk7CiAJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQkFTRSArICh3dGRtYSA8PCA0KSAgKyAweDgsCi0JCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIHBzaXplICogMikpOworCQkJc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihkbWEtPnN1YnN0cmVhbSwgcHNpemUgKiAyKSk7CiAJCS8qIDIgcGFnZXMgKi8KIAljYXNlIDI6CiAJCWRtYS0+Y2ZnMCB8PSAweDg4MDAwMDAwIHwgMHg0NDAwMDAwMCB8IDB4MTAwMDAwMDAgfCAocHNpemUtMSk7CiAJCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQkFTRSArICh3dGRtYSA8PCA0KSArIDB4NCwKLQkJCXNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1ZiwgcHNpemUpKTsKKwkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sIHBzaXplKSk7CiAJCS8qIDEgcGFnZSAqLwogCWNhc2UgMToKIAkJZG1hLT5jZmcwIHw9IDB4ODAwMDAwMDAgfCAweDQwMDAwMDAwIHwgKChwc2l6ZS0xKSA8PCAweGMpOwogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkJBU0UgKyAod3RkbWEgPDwgNCksCi0JCQlzbmRfc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sIDApKTsKIAkJYnJlYWs7CiAJfQogCWh3d3JpdGUodm9ydGV4LT5tbWlvLCBWT1JURVhfV1RETUFfQlVGQ0ZHMCArICh3dGRtYSA8PCAzKSwgZG1hLT5jZmcwKTsKQEAgLTE0NjUsNyArMTQ2MCw4IEBACiAJCQlod3dyaXRlKHZvcnRleC0+bW1pbywKIAkJCQlWT1JURVhfV1RETUFfQlVGQkFTRSArCiAJCQkJKCgod3RkbWEgPDwgMikgKyBwcCkgPDwgMiksCi0JCQkJc25kX3NnYnVmX2dldF9hZGRyKGRtYS0+c2didWYsIGRtYS0+cGVyaW9kX2J5dGVzICogcCkpOworCQkJCXNuZF9wY21fc2didWZfZ2V0X2FkZHIoZG1hLT5zdWJzdHJlYW0sCisJCQkJCQkgICAgICAgZG1hLT5wZXJpb2RfYnl0ZXMgKiBwKSk7CiAJCQkvKiBGb3JjZSB3cml0ZSB0aHJ1IGNhY2hlLiAqLwogCQkJaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX1dURE1BX0JVRkJBU0UgKwogCQkJICAgICAgICgoKHd0ZG1hIDw8IDIpICsgcHApIDw8IDIpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3BjbS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfcGNtLmMKaW5kZXggZjlhNThiNC4uYjlkMmYyMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfcGNtLmMKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfcGNtLmMKQEAgLTE4OSw3ICsxODksNiBAQAogewogCXZvcnRleF90ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cmVhbV90ICpzdHJlYW0gPSAoc3RyZWFtX3QgKikgKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKTsKLQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWY7CiAJaW50IGVycjsKIAogCS8vIEFsbG9jIGJ1ZmZlciBtZW1vcnkuCkBAIC0xOTksOCArMTk4LDYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJWb3J0ZXg6IHBjbSBwYWdlIGFsbG9jIGZhaWxlZCFcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQkvL3NnYnVmID0gKHN0cnVjdCBzbmRfc2dfYnVmICopIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX3ByaXZhdGU7Ci0Jc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwogCS8qCiAJICAgcHJpbnRrKEtFUk5fSU5GTyAiVm9ydGV4OiBwZXJpb2RzICVkLCBwZXJpb2RfYnl0ZXMgJWQsIGNoYW5uZWxzID0gJWRcbiIsIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyksCiAJICAgcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpLCBwYXJhbXNfY2hhbm5lbHMoaHdfcGFyYW1zKSk7CkBAIC0yMjYsNyArMjIzLDcgQEAKIAkJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPSAmY2hpcC0+ZG1hX2FkYltkbWFdOwogCQlzdHJlYW0tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAkJLyogU2V0dXAgQnVmZmVycy4gKi8KLQkJdm9ydGV4X2FkYmRtYV9zZXRidWZmZXJzKGNoaXAsIGRtYSwgc2didWYsCisJCXZvcnRleF9hZGJkbWFfc2V0YnVmZmVycyhjaGlwLCBkbWEsCiAJCQkJCSBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyksCiAJCQkJCSBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpKTsKIAl9CkBAIC0yNDAsNyArMjM3LDcgQEAKIAkJICAgICZjaGlwLT5kbWFfd3Rbc3Vic3RyZWFtLT5udW1iZXJdOwogCQlzdHJlYW0tPmRtYSA9IHN1YnN0cmVhbS0+bnVtYmVyOwogCQlzdHJlYW0tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQkJdm9ydGV4X3d0ZG1hX3NldGJ1ZmZlcnMoY2hpcCwgc3Vic3RyZWFtLT5udW1iZXIsIHNnYnVmLAorCQl2b3J0ZXhfd3RkbWFfc2V0YnVmZmVycyhjaGlwLCBzdWJzdHJlYW0tPm51bWJlciwKIAkJCQkJcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpLAogCQkJCQlwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpKTsKIAl9CkBAIC0zOTIsMTMgKzM4OSw2IEBACiAJcmV0dXJuIChieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJyZW50X3B0cikpOwogfQogCi0vKiBQYWdlIGNhbGxiYWNrLiAqLwotLyoKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpIHsKLQkKLQkKLX0KLSovCiAvKiBvcGVyYXRvcnMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZvcnRleF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPSBzbmRfdm9ydGV4X3BjbV9vcGVuLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggMjJmMThmMy4uMzMzMDA3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC04MTYsNyArODE2LDggQEAKIAlpbnQgZXJyOwogCiAJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7Ci0Jc25kX2Fzc2VydChjaGlwICE9IE5VTEwgJiYgY2hpcC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAgfHwgIWNoaXAtPmNhcmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNhcmQgPSBjaGlwLT5jYXJkOwogCkBAIC0xNDcxLDcgKzE0NzIsOCBAQAogCXU4IHZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHNuZF9hemYzMzI4X2dhbWVfaW5iKGNoaXAsIElEWF9HQU1FX0xFR0FDWV9DT01QQVRJQkxFKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggNGVjZGQ2My4uM2FhOGQ5NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTIyNyw3ICsyMjcsNiBAQAogc3RhdGljIGludCBzbmRfYnQ4N3hfY3JlYXRlX3Jpc2Moc3RydWN0IHNuZF9idDg3eCAqY2hpcCwgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgICAgCSB1bnNpZ25lZCBpbnQgcGVyaW9kcywgdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcykKIHsKLQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwogCXVuc2lnbmVkIGludCBpLCBvZmZzZXQ7CiAJdTMyICpyaXNjOwogCkBAIC0yNDYsNiArMjQ1LDcgQEAKIAkJcmVzdCA9IHBlcmlvZF9ieXRlczsKIAkJZG8gewogCQkJdTMyIGNtZCwgbGVuOworCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWxlbiA9IFBBR0VfU0laRSAtIChvZmZzZXQgJSBQQUdFX1NJWkUpOwogCQkJaWYgKGxlbiA+IHJlc3QpCkBAIC0yNjAsNyArMjYwLDggQEAKIAkJCWlmIChsZW4gPT0gcmVzdCkKIAkJCQljbWQgfD0gUklTQ19FT0wgfCBSSVNDX0lSUTsKIAkJCSpyaXNjKysgPSBjcHVfdG9fbGUzMihjbWQpOwotCQkJKnJpc2MrKyA9IGNwdV90b19sZTMyKCh1MzIpc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzZ2J1Ziwgb2Zmc2V0KSk7CisJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mZnNldCk7CisJCQkqcmlzYysrID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCQlvZmZzZXQgKz0gbGVuOwogCQkJcmVzdCAtPSBsZW47CiAJCX0gd2hpbGUgKHJlc3QgPiAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwppbmRleCA2YWJlOGEzLi5hN2Q4OTY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAkgICAubmFtZSAgID0gIk1TSSBLOE4gRGlhbW9uZCBNQiIsCiAJICAgLmdwaW9fdHlwZSA9IDIsCiAJICAgLmkyY19hZGMgPSAxLAotCSAgIC5zcGlfZGFjID0gMiB9LAorCSAgIC5zcGlfZGFjID0gMiB9ICwKIAkgLyogU2h1dHRsZSBYUEMgU0QzMVAgd2hpY2ggaGFzIGFuIG9uYm9hcmQgQ3JlYXRpdmUgTGFicwogCSAgKiBTb3VuZCBCbGFzdGVyIExpdmUhIDI0LWJpdCBFQVgKIAkgICogaGlnaC1kZWZpbml0aW9uIDcuMSBhdWRpbyBwcm9jZXNzb3IiLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYV9taWRpLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYwppbmRleCA4OTNlZTRmLi5jNzg4NTExIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhX21pZGkuYwpAQCAtMTI1LDcgKzEyNSw4IEBACiAJc3RydWN0IHNuZF9jYV9taWRpICptaWRpID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0Jc25kX2Fzc2VydChtaWRpLT5kZXZfaWQsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFtaWRpLT5kZXZfaWQpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAltaWRpLT5taWRpX21vZGUgfD0gQ0FfTUlESV9NT0RFX0lOUFVUOwogCW1pZGktPnN1YnN0cmVhbV9pbnB1dCA9IHN1YnN0cmVhbTsKQEAgLTE0NCw3ICsxNDUsOCBAQAogCXN0cnVjdCBzbmRfY2FfbWlkaSAqbWlkaSA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChtaWRpLT5kZXZfaWQsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFtaWRpLT5kZXZfaWQpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAltaWRpLT5taWRpX21vZGUgfD0gQ0FfTUlESV9NT0RFX09VVFBVVDsKIAltaWRpLT5zdWJzdHJlYW1fb3V0cHV0ID0gc3Vic3RyZWFtOwpAQCAtMTYzLDcgKzE2NSw4IEBACiAJc3RydWN0IHNuZF9jYV9taWRpICptaWRpID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0KG1pZGktPmRldl9pZCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIW1pZGktPmRldl9pZCkpCisJCXJldHVybiAtRU5YSU87CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOwogCW1pZGktPmludGVycnVwdF9kaXNhYmxlKG1pZGksbWlkaS0+cnhfZW5hYmxlKTsKIAltaWRpLT5taWRpX21vZGUgJj0gfkNBX01JRElfTU9ERV9JTlBVVDsKQEAgLTE4MSw3ICsxODQsOSBAQAogewogCXN0cnVjdCBzbmRfY2FfbWlkaSAqbWlkaSA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF9hc3NlcnQobWlkaS0+ZGV2X2lkLCByZXR1cm4gLUVOWElPKTsKKworCWlmIChzbmRfQlVHX09OKCFtaWRpLT5kZXZfaWQpKQorCQlyZXR1cm4gLUVOWElPOwogCQogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIApAQCAtMjAxLDcgKzIwNiw5IEBACiBzdGF0aWMgdm9pZCBjYV9taWRpX2lucHV0X3RyaWdnZXIoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgdXApCiB7CiAJc3RydWN0IHNuZF9jYV9taWRpICptaWRpID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQobWlkaS0+ZGV2X2lkLCByZXR1cm4pOworCisJaWYgKHNuZF9CVUdfT04oIW1pZGktPmRldl9pZCkpCisJCXJldHVybjsKIAogCWlmICh1cCkgewogCQltaWRpLT5pbnRlcnJ1cHRfZW5hYmxlKG1pZGksbWlkaS0+cnhfZW5hYmxlKTsKQEAgLTIxNSw3ICsyMjIsOCBAQAogCXN0cnVjdCBzbmRfY2FfbWlkaSAqbWlkaSA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChtaWRpLT5kZXZfaWQsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIW1pZGktPmRldl9pZCkpCisJCXJldHVybjsKIAogCWlmICh1cCkgewogCQlpbnQgbWF4ID0gNDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCA5OTcxYjViLi4xYTc0Y2E2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0yMzU3LDcgKzIzNTcsOCBAQAogewogCXN0cnVjdCBjbWlwY2lfc3dpdGNoX2FyZ3MgKmFyZ3M7CiAJYXJncyA9IChzdHJ1Y3QgY21pcGNpX3N3aXRjaF9hcmdzICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc25kX2Fzc2VydChhcmdzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighYXJncykpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBfc25kX2NtaXBjaV91c3dpdGNoX2dldChrY29udHJvbCwgdWNvbnRyb2wsIGFyZ3MpOwogfQogCkBAIC0yNDAxLDcgKzI0MDIsOCBAQAogewogCXN0cnVjdCBjbWlwY2lfc3dpdGNoX2FyZ3MgKmFyZ3M7CiAJYXJncyA9IChzdHJ1Y3QgY21pcGNpX3N3aXRjaF9hcmdzICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc25kX2Fzc2VydChhcmdzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighYXJncykpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBfc25kX2NtaXBjaV91c3dpdGNoX3B1dChrY29udHJvbCwgdWNvbnRyb2wsIGFyZ3MpOwogfQogCkBAIC0yNjYyLDcgKzI2NjQsOCBAQAogCXVuc2lnbmVkIGludCBpZHg7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoY20gIT0gTlVMTCAmJiBjbS0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNtIHx8ICFjbS0+Y2FyZCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2FyZCA9IGNtLT5jYXJkOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0MjgxLmMgYi9zb3VuZC9wY2kvY3M0MjgxLmMKaW5kZXggNzU1NmZkOS4uZWY5MzA4ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDI4MS5jCisrKyBiL3NvdW5kL3BjaS9jczQyODEuYwpAQCAtNzY2LDEzICs3NjYsMTMgQEAKIAlpZiAoIWNhcHR1cmUpIHsKIAkJaWYgKGRtYS0+bGVmdF9zbG90ID09IGNoaXAtPnNyY19sZWZ0X3BsYXlfc2xvdCkgewogCQkJdW5zaWduZWQgaW50IHZhbCA9IHNuZF9jczQyODFfcmF0ZShydW50aW1lLT5yYXRlLCBOVUxMKTsKLQkJCXNuZF9hc3NlcnQoZG1hLT5yaWdodF9zbG90ID09IGNoaXAtPnNyY19yaWdodF9wbGF5X3Nsb3QsICk7CisJCQlzbmRfQlVHX09OKGRtYS0+cmlnaHRfc2xvdCAhPSBjaGlwLT5zcmNfcmlnaHRfcGxheV9zbG90KTsKIAkJCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfREFDU1IsIHZhbCk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoZG1hLT5sZWZ0X3Nsb3QgPT0gY2hpcC0+c3JjX2xlZnRfcmVjX3Nsb3QpIHsKIAkJCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfY3M0MjgxX3JhdGUocnVudGltZS0+cmF0ZSwgTlVMTCk7Ci0JCQlzbmRfYXNzZXJ0KGRtYS0+cmlnaHRfc2xvdCA9PSBjaGlwLT5zcmNfcmlnaHRfcmVjX3Nsb3QsICk7CisJCQlzbmRfQlVHX09OKGRtYS0+cmlnaHRfc2xvdCAhPSBjaGlwLT5zcmNfcmlnaHRfcmVjX3Nsb3QpOwogCQkJc25kX2NzNDI4MV9wb2tlQkEwKGNoaXAsIEJBMF9BRENTUiwgdmFsKTsKIAkJfQogCX0KQEAgLTEyMDksNyArMTIwOSw4IEBACiB7CiAJc3RydWN0IGNzNDI4MSAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFjaGlwKSkKKwkJcmV0dXJuOwogCXNuZF9jczQyODFfcG9rZUJBMChjaGlwLCBCQTBfSlNQVCwgMHhmZik7CiB9CiAKQEAgLTEyMTcsNyArMTIxOCw4IEBACiB7CiAJc3RydWN0IGNzNDI4MSAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9KU1BUKTsKIH0KIApAQCAtMTIyOCw3ICsxMjMwLDggQEAKIAlzdHJ1Y3QgY3M0MjgxICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CiAJdW5zaWduZWQganMxLCBqczIsIGpzdDsKIAkKLQlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybiAwKTsKKwlpZiAoc25kX0JVR19PTighY2hpcCkpCisJCXJldHVybiAwOwogCiAJanMxID0gc25kX2NzNDI4MV9wZWVrQkEwKGNoaXAsIEJBMF9KU0MxKTsKIAlqczIgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0pTQzIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCBlMjE0ZTU2Li5mYjZkYzM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtOTAsOSArOTAsMTAgQEAKIAlpbnQgY291bnQ7CiAJdW5zaWduZWQgc2hvcnQgcmVzdWx0LHRtcDsKIAl1MzIgb2Zmc2V0ID0gMDsKLQlzbmRfYXNzZXJ0ICggKGNvZGVjX2luZGV4ID09IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKSB8fAotCQkgICAgIChjb2RlY19pbmRleCA9PSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSwKLQkJICAgICByZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoc25kX0JVR19PTihjb2RlY19pbmRleCAhPSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCAmJgorCQkgICAgICAgY29kZWNfaW5kZXggIT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CiAKQEAgLTIxMiw5ICsyMTMsOSBAQAogCXVuc2lnbmVkIHNob3J0IHZhbDsKIAlpbnQgY29kZWNfaW5kZXggPSBhYzk3LT5udW07CiAKLQlzbmRfYXNzZXJ0KGNvZGVjX2luZGV4ID09IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYIHx8Ci0JCSAgIGNvZGVjX2luZGV4ID09IENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgsCi0JCSAgIHJldHVybiAweGZmZmYpOworCWlmIChzbmRfQlVHX09OKGNvZGVjX2luZGV4ICE9IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYICYmCisJCSAgICAgICBjb2RlY19pbmRleCAhPSBDUzQ2WFhfU0VDT05EQVJZX0NPREVDX0lOREVYKSkKKwkJcmV0dXJuIDB4ZmZmZjsKIAogCXZhbCA9IHNuZF9jczQ2eHhfY29kZWNfcmVhZChjaGlwLCByZWcsIGNvZGVjX2luZGV4KTsKIApAQCAtMjI5LDkgKzIzMCw5IEBACiB7CiAJaW50IGNvdW50OwogCi0Jc25kX2Fzc2VydCAoKGNvZGVjX2luZGV4ID09IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYKSB8fAotCQkgICAgKGNvZGVjX2luZGV4ID09IENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpLAotCQkgICAgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihjb2RlY19pbmRleCAhPSBDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWCAmJgorCQkgICAgICAgY29kZWNfaW5kZXggIT0gQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCkpCisJCXJldHVybjsKIAogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOwogCkBAIC0yOTQsOSArMjk1LDkgQEAKIAlzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCA9IGFjOTctPnByaXZhdGVfZGF0YTsKIAlpbnQgY29kZWNfaW5kZXggPSBhYzk3LT5udW07CiAKLQlzbmRfYXNzZXJ0KGNvZGVjX2luZGV4ID09IENTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYIHx8Ci0JCSAgIGNvZGVjX2luZGV4ID09IENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgsCi0JCSAgIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oY29kZWNfaW5kZXggIT0gQ1M0NlhYX1BSSU1BUllfQ09ERUNfSU5ERVggJiYKKwkJICAgICAgIGNvZGVjX2luZGV4ICE9IENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpKQorCQlyZXR1cm47CiAKIAlzbmRfY3M0Nnh4X2NvZGVjX3dyaXRlKGNoaXAsIHJlZywgdmFsLCBjb2RlY19pbmRleCk7CiB9CkBAIC0zMTUsNyArMzE2LDggQEAKIAl1bnNpZ25lZCBpbnQgYmFuayA9IG9mZnNldCA+PiAxNjsKIAlvZmZzZXQgPSBvZmZzZXQgJiAweGZmZmY7CiAKLQlzbmRfYXNzZXJ0KCEob2Zmc2V0ICYgMykgJiYgIShsZW4gJiAzKSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKChvZmZzZXQgJiAzKSB8fCAobGVuICYgMykpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlkc3QgPSBjaGlwLT5yZWdpb24uaWR4W2JhbmsrMV0ucmVtYXBfYWRkciArIG9mZnNldDsKIAlsZW4gLz0gc2l6ZW9mKHUzMik7CiAKQEAgLTM0Myw3ICszNDUsOCBAQAogCXVuc2lnbmVkIGludCBiYW5rID0gb2Zmc2V0ID4+IDE2OwogCW9mZnNldCA9IG9mZnNldCAmIDB4ZmZmZjsKIAotCXNuZF9hc3NlcnQoIShvZmZzZXQgJiAzKSAmJiAhKGxlbiAmIDMpLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oKG9mZnNldCAmIDMpIHx8IChsZW4gJiAzKSkpCisJCXJldHVybiAtRUlOVkFMOwogCWRzdCA9IGNoaXAtPnJlZ2lvbi5pZHhbYmFuaysxXS5yZW1hcF9hZGRyICsgb2Zmc2V0OwogCWxlbiAvPSBzaXplb2YodTMyKTsKIApAQCAtNzIyLDcgKzcyNSw5IEBACiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc2l6ZV90IHB0cjsKIAlzdHJ1Y3Qgc25kX2NzNDZ4eF9wY20gKmNwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0IChjcGNtLT5wY21fY2hhbm5lbCxyZXR1cm4gLUVOWElPKTsKKworCWlmIChzbmRfQlVHX09OKCFjcGNtLT5wY21fY2hhbm5lbCkpCisJCXJldHVybiAtRU5YSU87CiAKICNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCiAJcHRyID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAyKSA8PCAyKTsKQEAgLTc0MCw3ICs3NDUsOCBAQAogCXN0cnVjdCBzbmRfY3M0Nnh4X3BjbSAqY3BjbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCiAjaWZkZWYgQ09ORklHX1NORF9DUzQ2WFhfTkVXX0RTUAotCXNuZF9hc3NlcnQgKGNwY20tPnBjbV9jaGFubmVsLHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFjcGNtLT5wY21fY2hhbm5lbCkpCisJCXJldHVybiAtRU5YSU87CiAJcHRyID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIChjcGNtLT5wY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPmFkZHJlc3MgKyAyKSA8PCAyKTsKICNlbHNlCiAJcHRyID0gc25kX2NzNDZ4eF9wZWVrKGNoaXAsIEJBMV9QQkEpOwpAQCAtOTA4LDcgKzkxNCw4IEBACiAJY3BjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQlzbmRfYXNzZXJ0IChzYW1wbGVfcmF0ZSAhPSAwLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighc2FtcGxlX3JhdGUpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAKQEAgLTkxNyw3ICs5MjQsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNuZF9hc3NlcnQgKGNwY20tPnBjbV9jaGFubmVsICE9IE5VTEwpOworCXNuZF9CVUdfT04oIWNwY20tPnBjbV9jaGFubmVsKTsKIAlpZiAoIWNwY20tPnBjbV9jaGFubmVsKSB7CiAJCW11dGV4X3VubG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAJCXJldHVybiAtRU5YSU87CkBAIC05NTIsNyArOTU5LDcgQEAKIAkJfSBlbHNlIGlmIChjcGNtLT5wY21fY2hhbm5lbF9pZCA9PSBEU1BfSUVDOTU4X0NIQU5ORUwpIHsKIAkJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfaWVjOTU4X29wczsKIAkJfSBlbHNlIHsKLQkJCXNuZF9hc3NlcnQoMCk7CisJCQlzbmRfQlVHKCk7CiAJCX0KICNlbHNlCiAJCXN1YnN0cmVhbS0+b3BzID0gJnNuZF9jczQ2eHhfcGxheWJhY2tfb3BzOwpAQCAtOTgxLDcgKzk4OCw3IEBACiAJCX0gZWxzZSBpZiAoY3BjbS0+cGNtX2NoYW5uZWxfaWQgPT0gRFNQX0lFQzk1OF9DSEFOTkVMKSB7CiAJCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X2llYzk1OF9vcHM7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfYXNzZXJ0KDApOworCQkJc25kX0JVRygpOwogCQl9CiAjZWxzZQogCQlzdWJzdHJlYW0tPm9wcyA9ICZzbmRfY3M0Nnh4X3BsYXliYWNrX2luZGlyZWN0X29wczsKQEAgLTEwMjksNyArMTAzNiw4IEBACiAJY3BjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLSAgICBzbmRfYXNzZXJ0IChjcGNtLT5wY21fY2hhbm5lbCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighY3BjbS0+cGNtX2NoYW5uZWwpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJcGZpZSA9IHNuZF9jczQ2eHhfcGVlayhjaGlwLCAoY3BjbS0+cGNtX2NoYW5uZWwtPnBjbV9yZWFkZXJfc2NiLT5hZGRyZXNzICsgMSkgPDwgMiApOwogCXBmaWUgJj0gfjB4MDAwMGYwM2Y7CkBAIC0xNzE0LDkgKzE3MjIsOSBAQAogewogCXN0cnVjdCBzbmRfY3M0Nnh4ICpjaGlwID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwogCi0Jc25kX2Fzc2VydCAoKGFjOTcgPT0gY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0pIHx8Ci0JCSAgICAoYWM5NyA9PSBjaGlwLT5hYzk3W0NTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVhdKSwKLQkJICAgIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oYWM5NyAhPSBjaGlwLT5hYzk3W0NTNDZYWF9QUklNQVJZX0NPREVDX0lOREVYXSAmJgorCQkgICAgICAgYWM5NyAhPSBjaGlwLT5hYzk3W0NTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVhdKSkKKwkJcmV0dXJuOwogCiAJaWYgKGFjOTcgPT0gY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0pIHsKIAkJY2hpcC0+YWM5N1tDUzQ2WFhfUFJJTUFSWV9DT0RFQ19JTkRFWF0gPSBOVUxMOwpAQCAtMTg2NCw3ICsxODcyLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzID0gLUVJTlZBTDsKLQkJc25kX2Fzc2VydCgwLCAodm9pZCkwKTsKKwkJc25kX0JVRygpOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiAqLwogCX0KIAogCXJldHVybiByZXM7CkBAIC0yMjM2LDcgKzIyNDQsNyBAQAogCQlzbmRfcHJpbnRkZCgiY3M0Nnh4OiBDT0RPRUMyIG1vZGUgJTA0eFxuIiwweDMpOwogCQlzbmRfY3M0Nnh4X2FjOTdfd3JpdGUoYWM5NyxBQzk3X0NTUl9BQ01PREUsMHgzKTsKIAl9IGVsc2UgewotCQlzbmRfYXNzZXJ0KDApOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiAqLworCQlzbmRfQlVHKCk7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gLi4uICovCiAJfQogCiAJdWRlbGF5KDUwKTsKQEAgLTI1NTMsNyArMjU2MSw4IEBACiB7CiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAotCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighY2hpcCkpCisJCXJldHVybjsKIAlzbmRfY3M0Nnh4X3Bva2VCQTAoY2hpcCwgQkEwX0pTUFQsIDB4RkYpOyAgLy9vdXRiKGdhbWVwb3J0LT5pbywgMHhGRik7CiB9CiAKQEAgLTI1NjEsNyArMjU3MCw4IEBACiB7CiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAotCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCFjaGlwKSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfSlNQVCk7IC8vaW5iKGdhbWVwb3J0LT5pbyk7CiB9CiAKQEAgLTI1NzAsNyArMjU4MCw4IEBACiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAl1bnNpZ25lZCBqczEsIGpzMiwganN0OwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gMDsKIAogCWpzMSA9IHNuZF9jczQ2eHhfcGVla0JBMChjaGlwLCBCQTBfSlNDMSk7CiAJanMyID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9KU0MyKTsKQEAgLTI3NTQsNyArMjc2NSw4IEBACiB7CiAJaW50IGlkeDsKIAotCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjaGlwLT5hY3RpdmVfY3RybCkKIAkJY2hpcC0+YWN0aXZlX2N0cmwoY2hpcCwgMSk7CkBAIC0zNDg5LDggKzM1MDEsOSBAQAogCQkubmFtZSA9ICJNaXRhYyBNSTYwMjAvMjEiLAogCQkuYW1wID0gYW1wX3ZveWV0cmEsCiAJfSwKKwkvKiBIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAgKi8KIAl7Ci0JCS52ZW5kb3IgPSAweDE0QUYsCisJCS52ZW5kb3IgPSAweDE0YWYsIC8qIEd1aWxsZW1vdCBDb3Jwb3JhdGlvbiAqLwogCQkuaWQgPSAweDAwNTAsCiAJCS5uYW1lID0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCiAJCS5hbXAgPSBhbXBfaGVyY3VsZXMsCkBAIC0zNTMyLDkgKzM1NDUsMjUgQEAKIAkJLmFtcCA9IGFtcF9oZXJjdWxlcywKIAkJLm1peGVyX2luaXQgPSBoZXJjdWxlc19taXhlcl9pbml0LAogCX0sCisJLyogSGVyY3VsZXNzIEZvcnRpc3NpbW8gKi8KKwl7CisJCS52ZW5kb3IgPSAweDE2ODEsCisJCS5pZCA9IDB4YTAxMCwKKwkJLm5hbWUgPSAiSGVyY3VsZXMgR2FtZXN1cnJvdW5kIEZvcnRpc3NpbW8gSUkiLAorCX0sCisJeworCQkudmVuZG9yID0gMHgxNjgxLAorCQkuaWQgPSAweGEwMTEsCisJCS5uYW1lID0gIkhlcmN1bGVzIEdhbWVzdXJyb3VuZCBGb3J0aXNzaW1vIElJSSA3LjEiLAorCX0sCiAJLyogVGVyYXRlYyAqLwogCXsKIAkJLnZlbmRvciA9IDB4MTUzYiwKKwkJLmlkID0gMHgxMTJlLAorCQkubmFtZSA9ICJUZXJyYXRlYyBETVggWEZpcmUgMTAyNCIsCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDE1M2IsCiAJCS5pZCA9IDB4MTEzNiwKIAkJLm5hbWUgPSAiVGVycmF0ZWMgU2lYUGFjayA1LjEiLAogCX0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKaW5kZXggY2NjOGJlZC4uZjRmMGM4ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwpAQCAtNjMsNyArNjMsOCBAQAogCXUzMiBtb3Bfb3BlcmFuZHMsbW9wX3R5cGUsd2lkZV9vcDsKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAotCXNuZF9hc3NlcnQoICgoc2l6ZSAlIDIpID09IDApLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oc2l6ZSAlMikpCisJCXJldHVybiAtRUlOVkFMOwogICAKIAl3aGlsZSAoaSA8IHNpemUpIHsKIAkJbG92YWwgPSBkYXRhW2krK107CkBAIC0yODksNyArMjkwLDggQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAotCXNuZF9hc3NlcnQoaW5zICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWlucykpCisJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBpbnMtPm5zY2I7ICsraSkgewpAQCAtNDA0LDcgKzQwNiw4IEBACiAKIAkJLyogaWYgbW9kdWxlIGhhcyBhIGNvZGUgc2VnbWVudCBpdCBtdXN0IGhhdmUKIAkJICAgc3ltYm9sIHRhYmxlICovCi0JCXNuZF9hc3NlcnQobW9kdWxlLT5zeW1ib2xfdGFibGUuc3ltYm9scyAhPSBOVUxMICxyZXR1cm4gLUVOT01FTSk7CisJCWlmIChzbmRfQlVHX09OKCFtb2R1bGUtPnN5bWJvbF90YWJsZS5zeW1ib2xzKSkKKwkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoYWRkX3N5bWJvbHMoY2hpcCxtb2R1bGUpKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJkc3Bfc3BvczogZmFpbGVkIHRvIGxvYWQgc3ltYm9sIHRhYmxlXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM2OSw3ICsxMzcyLDggQEAKIAogCXZhbGlkX3Nsb3RzID0gc25kX2NzNDZ4eF9wZWVrQkEwKGNoaXAsIEJBMF9BQ09TVik7CiAKLQlzbmRfYXNzZXJ0IChjaGlwLT5ucl9hYzk3X2NvZGVjcyA9PSAxIHx8IGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDIpOworCWlmIChzbmRfQlVHX09OKGNoaXAtPm5yX2FjOTdfY29kZWNzICE9IDEgJiYgY2hpcC0+bnJfYWM5N19jb2RlY3MgIT0gMikpCisJCWdvdG8gX2ZhaWxfZW5kOwogCiAJaWYgKGNoaXAtPm5yX2FjOTdfY29kZWNzID09IDEpIHsKIAkJLyogb3V0cHV0IG9uIHNsb3QgNSBhbmQgMTEgCkBAIC0xNjA5LDExICsxNjEzLDE0IEBACiAKIAkJc3BkaWZvX3NjYl9kZXNjID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsIlNQRElGT1NDQiIsKHUzMiAqKSZzcGRpZm9fc2NiLFNQRElGT19TQ0JfSU5TVCk7CiAKLQkJc25kX2Fzc2VydChzcGRpZm9fc2NiX2Rlc2MsIHJldHVybiAtRUlPKTsKKwkJaWYgKHNuZF9CVUdfT04oIXNwZGlmb19zY2JfZGVzYykpCisJCQlyZXR1cm4gLUVJTzsKIAkJc3BkaWZpX3NjYl9kZXNjID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsIlNQRElGSVNDQiIsKHUzMiAqKSZzcGRpZmlfc2NiLFNQRElGSV9TQ0JfSU5TVCk7Ci0JCXNuZF9hc3NlcnQoc3BkaWZpX3NjYl9kZXNjLCByZXR1cm4gLUVJTyk7CisJCWlmIChzbmRfQlVHX09OKCFzcGRpZmlfc2NiX2Rlc2MpKQorCQkJcmV0dXJuIC1FSU87CiAJCWFzeW5jX2NvZGVjX3NjYl9kZXNjID0gY3M0Nnh4X2RzcF9jcmVhdGVfc2NiKGNoaXAsIkFzeW5Db2RlY0lucHV0U0NCIiwodTMyICopJmFzeW5jX2NvZGVjX2lucHV0X3NjYiwgSEZHX1RSRUVfU0NCKTsKLQkJc25kX2Fzc2VydChhc3luY19jb2RlY19zY2JfZGVzYywgcmV0dXJuIC1FSU8pOworCQlpZiAoc25kX0JVR19PTighYXN5bmNfY29kZWNfc2NiX2Rlc2MpKQorCQkJcmV0dXJuIC1FSU87CiAKIAkJYXN5bmNfY29kZWNfc2NiX2Rlc2MtPnBhcmVudF9zY2JfcHRyID0gTlVMTDsKIAkJYXN5bmNfY29kZWNfc2NiX2Rlc2MtPm5leHRfc2NiX3B0ciA9IHNwZGlmaV9zY2JfZGVzYzsKQEAgLTE2OTgsOCArMTcwNSwxMCBAQAogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOwogCWNoaXAtPmFtcGxpZmllcl9jdHJsKGNoaXAsIDEpOwogCi0Jc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfcnhfc2NiID09IE5VTEwscmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQgKGlucy0+c3BkaWZfaW5fc3JjICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKGlucy0+YXN5bmNoX3J4X3NjYikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKCFpbnMtPnNwZGlmX2luX3NyYykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAKQEAgLTE3NTQsOCArMTc2MywxMCBAQAogewogCXN0cnVjdCBkc3Bfc3Bvc19pbnN0YW5jZSAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwogCi0Jc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfcnhfc2NiICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0IChpbnMtPnNwZGlmX2luX3NyYyAhPSBOVUxMLHJldHVybiAtRUlOVkFMKTsJCisJaWYgKHNuZF9CVUdfT04oIWlucy0+YXN5bmNoX3J4X3NjYikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKCFpbnMtPnNwZGlmX2luX3NyYykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAKQEAgLTE3ODAsOCArMTc5MSwxMCBAQAogewogCXN0cnVjdCBkc3Bfc3Bvc19pbnN0YW5jZSAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwogCi0Jc25kX2Fzc2VydCAoaW5zLT5wY21faW5wdXQgPT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCAoaW5zLT5yZWZfc25vb3Bfc2NiICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKGlucy0+cGNtX2lucHV0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oIWlucy0+cmVmX3Nub29wX3NjYikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAJaW5zLT5wY21faW5wdXQgPSBjczQ2eHhfYWRkX3JlY29yZF9zb3VyY2UoY2hpcCxpbnMtPnJlZl9zbm9vcF9zY2IsUENNU0VSSUFMSU5fUENNX1NDQl9BRERSLApAQCAtMTc5NSw3ICsxODA4LDggQEAKIHsKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAotCXNuZF9hc3NlcnQgKGlucy0+cGNtX2lucHV0ICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFpbnMtPnBjbV9pbnB1dCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+c3Bvc19tdXRleCk7CiAJY3M0Nnh4X2RzcF9yZW1vdmVfc2NiIChjaGlwLGlucy0+cGNtX2lucHV0KTsKQEAgLTE4MDksOCArMTgyMywxMCBAQAogewogCXN0cnVjdCBkc3Bfc3Bvc19pbnN0YW5jZSAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwogCi0Jc25kX2Fzc2VydCAoaW5zLT5hZGNfaW5wdXQgPT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCAoaW5zLT5jb2RlY19pbl9zY2IgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oaW5zLT5hZGNfaW5wdXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTighaW5zLT5jb2RlY19pbl9zY2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmNoaXAtPnNwb3NfbXV0ZXgpOwogCWlucy0+YWRjX2lucHV0ID0gY3M0Nnh4X2FkZF9yZWNvcmRfc291cmNlKGNoaXAsaW5zLT5jb2RlY19pbl9zY2IsUENNU0VSSUFMSU5fU0NCX0FERFIsCkBAIC0xODI0LDcgKzE4NDAsOCBAQAogewogCXN0cnVjdCBkc3Bfc3Bvc19pbnN0YW5jZSAqIGlucyA9IGNoaXAtPmRzcF9zcG9zX2luc3RhbmNlOwogCi0Jc25kX2Fzc2VydCAoaW5zLT5hZGNfaW5wdXQgIT0gTlVMTCxyZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWlucy0+YWRjX2lucHV0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5zcG9zX211dGV4KTsKIAljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAsaW5zLT5hZGNfaW5wdXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwppbmRleCAyODczY2ZlLi5kZDdjNDFiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zX3NjYl9saWIuYwpAQCAtNDYsOCArNDYsMTEgQEAKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAlpbnQgc3ltYm9sX2luZGV4ID0gKGludCkoc3ltYm9sIC0gaW5zLT5zeW1ib2xfdGFibGUuc3ltYm9scyk7CiAKLQlzbmRfYXNzZXJ0KGlucy0+c3ltYm9sX3RhYmxlLm5zeW1ib2xzID4gMCxyZXR1cm4pOwotCXNuZF9hc3NlcnQoc3ltYm9sX2luZGV4ID49IDAgJiYgc3ltYm9sX2luZGV4IDwgaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMgPD0gMCkpCisJCXJldHVybjsKKwlpZiAoc25kX0JVR19PTihzeW1ib2xfaW5kZXggPCAwIHx8CisJCSAgICAgICBzeW1ib2xfaW5kZXggPj0gaW5zLT5zeW1ib2xfdGFibGUubnN5bWJvbHMpKQorCQlyZXR1cm47CiAKIAlpbnMtPnN5bWJvbF90YWJsZS5zeW1ib2xzW3N5bWJvbF9pbmRleF0uZGVsZXRlZCA9IDE7CiAKQEAgLTExNiw4ICsxMTksOSBAQAogCiAJaWYgKCBzY2ItPnBhcmVudF9zY2JfcHRyICkgewogCQkvKiB1bmxpbmsgcGFyZW50IFNDQiAqLwotCQlzbmRfYXNzZXJ0ICgoc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID09IHNjYiB8fAotCQkJICAgICBzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPT0gc2NiKSxyZXR1cm4pOworCQlpZiAoc25kX0JVR19PTihzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgIT0gc2NiICYmCisJCQkgICAgICAgc2NiLT5wYXJlbnRfc2NiX3B0ci0+bmV4dF9zY2JfcHRyICE9IHNjYikpCisJCQlyZXR1cm47CiAgIAogCQlpZiAoc2NiLT5wYXJlbnRfc2NiX3B0ci0+c3ViX2xpc3RfcHRyID09IHNjYikgewogCkBAIC0xNDAsNyArMTQ0LDYgQEAKIAkJCQlzY2ItPm5leHRfc2NiX3B0ciA9IGlucy0+dGhlX251bGxfc2NiOwogCQkJfQogCQl9IGVsc2UgewotCQkJLyogc25kX2Fzc2VydCAoIChzY2ItPnN1Yl9saXN0X3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiksIHJldHVybik7ICovCiAJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSBzY2ItPm5leHRfc2NiX3B0cjsKIAogCQkJaWYgKHNjYi0+bmV4dF9zY2JfcHRyICE9IGlucy0+dGhlX251bGxfc2NiKSB7CkBAIC0xODEsMTYgKzE4NCwxNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBjaGVjayBpbnRlZ3JldHkgKi8KLQlzbmRfYXNzZXJ0ICggKHNjYi0+aW5kZXggPj0gMCAmJiAKLQkJICAgICAgc2NiLT5pbmRleCA8IGlucy0+bnNjYiAmJiAKLQkJICAgICAgKGlucy0+c2NicyArIHNjYi0+aW5kZXgpID09IHNjYiksIHJldHVybiApOworCWlmIChzbmRfQlVHX09OKHNjYi0+aW5kZXggPCAwIHx8CisJCSAgICAgICBzY2ItPmluZGV4ID49IGlucy0+bnNjYiB8fAorCQkgICAgICAgKGlucy0+c2NicyArIHNjYi0+aW5kZXgpICE9IHNjYikpCisJCXJldHVybjsKIAogI2lmIDAKIAkvKiBjYW4ndCByZW1vdmUgYSBTQ0Igd2l0aCBjaGlsZHMgYmVmb3JlIAogCSAgIHJlbW92aW5nIGNoaWxkcyBmaXJzdCAgKi8KLQlzbmRfYXNzZXJ0ICggKHNjYi0+c3ViX2xpc3RfcHRyID09IGlucy0+dGhlX251bGxfc2NiICYmCi0JCSAgICAgIHNjYi0+bmV4dF9zY2JfcHRyID09IGlucy0+dGhlX251bGxfc2NiKSwKLQkJICAgICBnb3RvIF9lbmQpOworCWlmIChzbmRfQlVHX09OKHNjYi0+c3ViX2xpc3RfcHRyICE9IGlucy0+dGhlX251bGxfc2NiIHx8CisJCSAgICAgICBzY2ItPm5leHRfc2NiX3B0ciAhPSBpbnMtPnRoZV9udWxsX3NjYikpCisJCWdvdG8gX2VuZDsKICNlbmRpZgogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYi0+bG9jaywgZmxhZ3MpOwpAQCAtMTk4LDcgKzIwMiw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NiLT5sb2NrLCBmbGFncyk7CiAKIAljczQ2eHhfZHNwX3Byb2NfZnJlZV9zY2JfZGVzYyhzY2IpOwotCXNuZF9hc3NlcnQgKHNjYi0+c2NiX3N5bWJvbCAhPSBOVUxMLCByZXR1cm4gKTsKKwlpZiAoc25kX0JVR19PTighc2NiLT5zY2Jfc3ltYm9sKSkKKwkJcmV0dXJuOwogCXJlbW92ZV9zeW1ib2wgKGNoaXAsc2NiLT5zY2Jfc3ltYm9sKTsKIAogCWlucy0+c2Nic1tzY2ItPmluZGV4XS5kZWxldGVkID0gMTsKQEAgLTIzNCw3ICsyMzksNiBAQAogCQlzbmRfaW5mb19mcmVlX2VudHJ5KHNjYi0+cHJvY19pbmZvKTsKIAkJc2NiLT5wcm9jX2luZm8gPSBOVUxMOwogCi0JCXNuZF9hc3NlcnQgKHNjYl9pbmZvICE9IE5VTEwsIHJldHVybik7CiAJCWtmcmVlIChzY2JfaW5mbyk7CiAJfQogfQpAQCAtMjkxLDcgKzI5NSw4IEBACiAgIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzbmRfYXNzZXJ0IChpbnMtPnRoZV9udWxsX3NjYiAhPSBOVUxMLHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaW5zLT50aGVfbnVsbF9zY2IpKQorCQlyZXR1cm4gTlVMTDsKIAogCS8qIGZpbGwgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHdyb3RlbiB0byBEU1AgKi8KIAlzY2JfZGF0YVtTQ0JzdWJMaXN0UHRyXSA9IApAQCAtMzIxLDE4ICszMjYsMjAgQEAKICNlbmRpZgogCQkvKiBsaW5rIHRvICBwYXJlbnQgU0NCICovCiAJCWlmIChzY2JfY2hpbGRfdHlwZSA9PSBTQ0JfT05fUEFSRU5UX05FWFRfU0NCKSB7Ci0JCQlzbmRfYXNzZXJ0ICggKHNjYi0+cGFyZW50X3NjYl9wdHItPm5leHRfc2NiX3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiksCi0JCQkJICAgICByZXR1cm4gTlVMTCk7CisJCQlpZiAoc25kX0JVR19PTihzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgIT0KKwkJCQkgICAgICAgaW5zLT50aGVfbnVsbF9zY2IpKQorCQkJCXJldHVybiBOVUxMOwogCiAJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5uZXh0X3NjYl9wdHIgPSBzY2I7CiAKIAkJfSBlbHNlIGlmIChzY2JfY2hpbGRfdHlwZSA9PSBTQ0JfT05fUEFSRU5UX1NVQkxJU1RfU0NCKSB7Ci0JCQlzbmRfYXNzZXJ0ICggKHNjYi0+cGFyZW50X3NjYl9wdHItPnN1Yl9saXN0X3B0ciA9PSBpbnMtPnRoZV9udWxsX3NjYiksCi0JCQkJICAgICByZXR1cm4gTlVMTCk7CisJCQlpZiAoc25kX0JVR19PTihzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgIT0KKwkJCQkgICAgICAgaW5zLT50aGVfbnVsbF9zY2IpKQorCQkJCXJldHVybiBOVUxMOwogCiAJCQlzY2ItPnBhcmVudF9zY2JfcHRyLT5zdWJfbGlzdF9wdHIgPSBzY2I7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfYXNzZXJ0ICgwLHJldHVybiBOVUxMKTsKKwkJCXNuZF9CVUcoKTsKIAkJfQogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOwpAQCAtNjc1LDcgKzY4Miw3IEBACiAJCWlmIChwYXNzX3Rocm91Z2gpIHsKIAkJCS8qIHdvbnQgd29yayB3aXRoIGFueSBvdGhlciByYXRlIHRoYW4KIAkJCSAgIHRoZSBuYXRpdmUgRFNQIHJhdGUgKi8KLQkJCXNuZF9hc3NlcnQgKHJhdGUgPT0gNDgwMDApOworCQkJc25kX0JVR19PTihyYXRlICE9IDQ4MDAwKTsKIAogCQkJc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfZ2VuZXJpY19zY2IoY2hpcCxzY2JfbmFtZSwodTMyICopJnNyY190YXNrX3NjYiwKIAkJCQkJCQkgICAgZGVzdCwiRE1BUkVBREVSIixwYXJlbnRfc2NiLApAQCAtMTE0Miw3ICsxMTQ5LDggQEAKIAlzdHJ1Y3QgZHNwX3NjYl9kZXNjcmlwdG9yICogc2NiID0gZnJvbTsKIAogCXdoaWxlIChzY2ItPm5leHRfc2NiX3B0ciAhPSBpbnMtPnRoZV9udWxsX3NjYikgewotCQlzbmRfYXNzZXJ0IChzY2ItPm5leHRfc2NiX3B0ciAhPSBOVUxMLCByZXR1cm4gTlVMTCk7CisJCWlmIChzbmRfQlVHX09OKCFzY2ItPm5leHRfc2NiX3B0cikpCisJCQlyZXR1cm4gTlVMTDsKIAogCQlzY2IgPSBzY2ItPm5leHRfc2NiX3B0cjsKIAl9CkBAIC0xMjQ2LDEwICsxMjU0LDExIEBACiAJCWJyZWFrOwogCWNhc2UgRFNQX1BDTV9TNzFfQ0hBTk5FTDoKIAkJLyogVE9ETyAqLwotCQlzbmRfYXNzZXJ0KDApOworCQlzbmRfQlVHKCk7CiAJCWJyZWFrOwogCWNhc2UgRFNQX0lFQzk1OF9DSEFOTkVMOgotCQlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2IgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOworCQlpZiAoc25kX0JVR19PTighaW5zLT5hc3luY2hfdHhfc2NiKSkKKwkJCXJldHVybiBOVUxMOwogCQltaXhlcl9zY2IgPSBpbnMtPmFzeW5jaF90eF9zY2I7CiAKIAkJLyogaWYgc2FtcGxlIHJhdGUgaXMgc2V0IHRvIDQ4a2h6IHdlIHBhc3MKQEAgLTEyNjIsNyArMTI3MSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX2Fzc2VydCAoMCk7CisJCXNuZF9CVUcoKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIGRlZmF1bHQgc2FtcGxlIHJhdGUgaXMgNDQxMDAgKi8KQEAgLTEzMDgsNyArMTMxNyw4IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJc25kX2Fzc2VydCAoc3JjX2luZGV4ICE9IC0xLHJldHVybiBOVUxMKTsKKwkJaWYgKHNuZF9CVUdfT04oc3JjX2luZGV4ID09IC0xKSkKKwkJCXJldHVybiBOVUxMOwogCiAJCS8qIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IFNSQyBTQ0IgKi8KIAkJaWYgKG1peGVyX3NjYi0+c3ViX2xpc3RfcHRyID09IGlucy0+dGhlX251bGxfc2NiKSB7CkBAIC0xNDYyLDkgKzE0NzIsMTAgQEAKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChwY21fY2hhbm5lbC0+YWN0aXZlLCByZXR1cm4gKTsKLQlzbmRfYXNzZXJ0KGlucy0+bnBjbV9jaGFubmVscyA+IDAsIHJldHVybiApOwotCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwtPnNyY19zY2ItPnJlZl9jb3VudCA+IDAsIHJldHVybiApOworCWlmIChzbmRfQlVHX09OKCFwY21fY2hhbm5lbC0+YWN0aXZlIHx8CisJCSAgICAgICBpbnMtPm5wY21fY2hhbm5lbHMgPD0gMCB8fAorCQkgICAgICAgcGNtX2NoYW5uZWwtPnNyY19zY2ItPnJlZl9jb3VudCA8PSAwKSkKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJcGNtX2NoYW5uZWwtPnVubGlua2VkID0gMTsKQEAgLTE0NzksOCArMTQ5MCw5IEBACiAJaWYgKCFwY21fY2hhbm5lbC0+c3JjX3NjYi0+cmVmX2NvdW50KSB7CiAJCWNzNDZ4eF9kc3BfcmVtb3ZlX3NjYihjaGlwLHBjbV9jaGFubmVsLT5zcmNfc2NiKTsKIAotCQlzbmRfYXNzZXJ0IChwY21fY2hhbm5lbC0+c3JjX3Nsb3QgPj0gMCAmJiBwY21fY2hhbm5lbC0+c3JjX3Nsb3QgPCBEU1BfTUFYX1NSQ19OUiwKLQkJCSAgICByZXR1cm4gKTsKKwkJaWYgKHNuZF9CVUdfT04ocGNtX2NoYW5uZWwtPnNyY19zbG90IDwgMCB8fAorCQkJICAgICAgIHBjbV9jaGFubmVsLT5zcmNfc2xvdCA+PSBEU1BfTUFYX1NSQ19OUikpCisJCQlyZXR1cm47CiAKIAkJaW5zLT5zcmNfc2NiX3Nsb3RzW3BjbV9jaGFubmVsLT5zcmNfc2xvdF0gPSAwOwogCQlpbnMtPm5zcmNfc2NiIC0tOwpAQCAtMTQ5MCwxMSArMTUwMiwxMSBAQAogaW50IGNzNDZ4eF9kc3BfcGNtX3VubGluayAoc3RydWN0IHNuZF9jczQ2eHggKiBjaGlwLAogCQkJICAgc3RydWN0IGRzcF9wY21fY2hhbm5lbF9kZXNjcmlwdG9yICogcGNtX2NoYW5uZWwpCiB7Ci0Jc3RydWN0IGRzcF9zcG9zX2luc3RhbmNlICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNuZF9hc3NlcnQocGNtX2NoYW5uZWwtPmFjdGl2ZSxyZXR1cm4gLUVJTyk7Ci0Jc25kX2Fzc2VydChpbnMtPm5wY21fY2hhbm5lbHMgPiAwLHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighcGNtX2NoYW5uZWwtPmFjdGl2ZSB8fAorCQkgICAgICAgY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2UtPm5wY21fY2hhbm5lbHMgPD0gMCkpCisJCXJldHVybiAtRUlPOwogCiAJc3Bpbl9sb2NrKCZwY21fY2hhbm5lbC0+c3JjX3NjYi0+bG9jayk7CiAKQEAgLTE1MzcsNyArMTU0OSw3IEBACiAKIAlzcmNfc2NiLT5zdWJfbGlzdF9wdHIgPSBwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2I7CiAKLQlzbmRfYXNzZXJ0IChwY21fY2hhbm5lbC0+cGNtX3JlYWRlcl9zY2ItPnBhcmVudF9zY2JfcHRyID09IE5VTEwsIDsgKTsKKwlzbmRfQlVHX09OKHBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIpOwogCXBjbV9jaGFubmVsLT5wY21fcmVhZGVyX3NjYi0+cGFyZW50X3NjYl9wdHIgPSBwYXJlbnRfc2NiOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC0xNTY0LDcgKzE1NzYsOCBAQAogCXN0cnVjdCBkc3Bfc2NiX2Rlc2NyaXB0b3IgKiBwY21faW5wdXQ7CiAJaW50IGluc2VydF9wb2ludDsKIAotCXNuZF9hc3NlcnQgKGlucy0+cmVjb3JkX21peGVyX3NjYiAhPSBOVUxMLHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaW5zLT5yZWNvcmRfbWl4ZXJfc2NiKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoaW5zLT5yZWNvcmRfbWl4ZXJfc2NiLT5zdWJfbGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKIAkJcGFyZW50ID0gZmluZF9uZXh0X2ZyZWVfc2NiIChjaGlwLGlucy0+cmVjb3JkX21peGVyX3NjYi0+c3ViX2xpc3RfcHRyKTsKQEAgLTE1ODMsNyArMTU5Niw4IEBACiAKIGludCBjczQ2eHhfc3JjX3VubGluayhzdHJ1Y3Qgc25kX2NzNDZ4eCAqY2hpcCwgc3RydWN0IGRzcF9zY2JfZGVzY3JpcHRvciAqIHNyYykKIHsKLQlzbmRfYXNzZXJ0IChzcmMtPnBhcmVudF9zY2JfcHRyICE9IE5VTEwsICByZXR1cm4gLUVJTlZBTCApOworCWlmIChzbmRfQlVHX09OKCFzcmMtPnBhcmVudF9zY2JfcHRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBtdXRlIFNDQiAqLwogCWNzNDZ4eF9kc3Bfc2NiX3NldF92b2x1bWUgKGNoaXAsc3JjLDAsMCk7CkBAIC0xNTk4LDggKzE2MTIsMTAgQEAKIAlzdHJ1Y3QgZHNwX3Nwb3NfaW5zdGFuY2UgKiBpbnMgPSBjaGlwLT5kc3Bfc3Bvc19pbnN0YW5jZTsKIAlzdHJ1Y3QgZHNwX3NjYl9kZXNjcmlwdG9yICogcGFyZW50X3NjYjsKIAotCXNuZF9hc3NlcnQgKHNyYy0+cGFyZW50X3NjYl9wdHIgPT0gTlVMTCwgICByZXR1cm4gLUVJTlZBTCApOwotCXNuZF9hc3NlcnQoaW5zLT5tYXN0ZXJfbWl4X3NjYiAhPU5VTEwsICAgcmV0dXJuIC1FSU5WQUwgKTsKKwlpZiAoc25kX0JVR19PTihzcmMtPnBhcmVudF9zY2JfcHRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oIWlucy0+bWFzdGVyX21peF9zY2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpbnMtPm1hc3Rlcl9taXhfc2NiLT5zdWJfbGlzdF9wdHIgIT0gaW5zLT50aGVfbnVsbF9zY2IpIHsKIAkJcGFyZW50X3NjYiA9IGZpbmRfbmV4dF9mcmVlX3NjYiAoY2hpcCxpbnMtPm1hc3Rlcl9taXhfc2NiLT5zdWJfbGlzdF9wdHIpOwpAQCAtMTYzNSw4ICsxNjUxLDExIEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc25kX2Fzc2VydCAoaW5zLT5hc3luY2hfdHhfc2NiID09IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0IChpbnMtPm1hc3Rlcl9taXhfc2NiLT5uZXh0X3NjYl9wdHIgPT0gaW5zLT50aGVfbnVsbF9zY2IsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihpbnMtPmFzeW5jaF90eF9zY2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTihpbnMtPm1hc3Rlcl9taXhfc2NiLT5uZXh0X3NjYl9wdHIgIT0KKwkJICAgICAgIGlucy0+dGhlX251bGxfc2NiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiByZXNldCBvdXRwdXQgc25vb3BlciBzYW1wbGUgYnVmZmVyIHBvaW50ZXIgKi8KIAlzbmRfY3M0Nnh4X3Bva2UgKGNoaXAsIChpbnMtPnJlZl9zbm9vcF9zY2ItPmFkZHJlc3MgKyAyKSA8PCAyLApAQCAtMTY3NiwxMCArMTY5NSwxNSBAQAogCX0KIAogCS8qIGNoZWNrIGludGVncmV0eSAqLwotCXNuZF9hc3NlcnQgKGlucy0+YXN5bmNoX3R4X3NjYiAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCAoaW5zLT5zcGRpZl9wY21faW5wdXRfc2NiICE9IE5VTEwscmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQgKGlucy0+bWFzdGVyX21peF9zY2ItPm5leHRfc2NiX3B0ciA9PSBpbnMtPmFzeW5jaF90eF9zY2IsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2ItPnBhcmVudF9zY2JfcHRyID09IGlucy0+bWFzdGVyX21peF9zY2IsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighaW5zLT5hc3luY2hfdHhfc2NiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oIWlucy0+c3BkaWZfcGNtX2lucHV0X3NjYikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKGlucy0+bWFzdGVyX21peF9zY2ItPm5leHRfc2NiX3B0ciAhPSBpbnMtPmFzeW5jaF90eF9zY2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTihpbnMtPmFzeW5jaF90eF9zY2ItPnBhcmVudF9zY2JfcHRyICE9CisJCSAgICAgICBpbnMtPm1hc3Rlcl9taXhfc2NiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAsaW5zLT5zcGRpZl9wY21faW5wdXRfc2NiKTsKIAljczQ2eHhfZHNwX3JlbW92ZV9zY2IgKGNoaXAsaW5zLT5hc3luY2hfdHhfc2NiKTsKQEAgLTE3MzQsNyArMTc1OCw4IEBACiB7CiAJc3RydWN0IGRzcF9zcG9zX2luc3RhbmNlICogaW5zID0gY2hpcC0+ZHNwX3Nwb3NfaW5zdGFuY2U7CiAKLQlzbmRfYXNzZXJ0IChpbnMtPmFzeW5jaF90eF9zY2IgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFpbnMtPmFzeW5jaF90eF9zY2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlucy0+c3BkaWZfc3RhdHVzX291dCAgJj0gfkRTUF9TUERJRl9TVEFUVVNfUExBWUJBQ0tfT1BFTjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwX2RzcC5jCmluZGV4IDQxNTllM2IuLjI5MDQzMzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMF9kc3AuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjBfZHNwLmMKQEAgLTM0LDcgKzM0LDggQEAKIAlpbnQgZXJyOwogCiAJREVfSU5JVCgoImluaXRfaHcoKSAtIERhcmxhMjBcbiIpKTsKLQlzbmRfYXNzZXJ0KChzdWJkZXZpY2VfaWQgJiAweGZmZjApID09IERBUkxBMjAsIHJldHVybiAtRU5PREVWKTsKKwlpZiAoc25kX0JVR19PTigoc3ViZGV2aWNlX2lkICYgMHhmZmYwKSAhPSBEQVJMQTIwKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGVyciA9IGluaXRfZHNwX2NvbW1fcGFnZShjaGlwKSkpIHsKIAkJREVfSU5JVCgoImluaXRfaHcgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBEU1AgY29tbSBwYWdlXG4iKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjRfZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjRfZHNwLmMKaW5kZXggNzk5MzhlZS4uNjAyMjg3MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTI0X2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyNF9kc3AuYwpAQCAtMzQsNyArMzQsOCBAQAogCWludCBlcnI7CiAKIAlERV9JTklUKCgiaW5pdF9odygpIC0gRGFybGEyNFxuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gREFSTEEyNCwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IERBUkxBMjQpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTE0OCw4ICsxNDksOSBAQAogCiBzdGF0aWMgaW50IHNldF9pbnB1dF9jbG9jayhzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwLCB1MTYgY2xvY2spCiB7Ci0Jc25kX2Fzc2VydChjbG9jayA9PSBFQ0hPX0NMT0NLX0lOVEVSTkFMIHx8Ci0JCSAgIGNsb2NrID09IEVDSE9fQ0xPQ0tfRVNZTkMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihjbG9jayAhPSBFQ0hPX0NMT0NLX0lOVEVSTkFMICYmCisJCSAgICAgICBjbG9jayAhPSBFQ0hPX0NMT0NLX0VTWU5DKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJY2hpcC0+aW5wdXRfY2xvY2sgPSBjbG9jazsKIAlyZXR1cm4gc2V0X3NhbXBsZV9yYXRlKGNoaXAsIGNoaXAtPnNhbXBsZV9yYXRlKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKaW5kZXggNDhlYjdjNS4uNDE3ZTI1YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKQEAgLTQ3LDcgKzQ3LDggQEAKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlERV9JTklUKCgiaW5pdF9odygpIC0gRWNobzNHXG4iKSk7Ci0Jc25kX2Fzc2VydCgoc3ViZGV2aWNlX2lkICYgMHhmZmYwKSA9PSBFQ0hPM0csIHJldHVybiAtRU5PREVWKTsKKwlpZiAoc25kX0JVR19PTigoc3ViZGV2aWNlX2lkICYgMHhmZmYwKSAhPSBFQ0hPM0cpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTEwNCw5ICsxMDUsMTEgQEAKIAlpZiAoKGVyciA9IGluaXRfbGluZV9sZXZlbHMoY2hpcCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBzZXRfZGlnaXRhbF9tb2RlKGNoaXAsIERJR0lUQUxfTU9ERV9TUERJRl9SQ0EpOwotCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCWVyciA9IHNldF9waGFudG9tX3Bvd2VyKGNoaXAsIDApOwotCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCWVyciA9IHNldF9wcm9mZXNzaW9uYWxfc3BkaWYoY2hpcCwgVFJVRSk7CiAKIAlERV9JTklUKCgiaW5pdF9odyBkb25lXG4iKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwppbmRleCBlMTZkYzkyLi44ZGJjNWM0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKQEAgLTQ5MCw3ICs0OTAsNiBAQAogewogCXN0cnVjdCBlY2hvYXVkaW8gKmNoaXA7CiAJaW50IGVyciwgcGVyLCByZXN0LCBwYWdlLCBlZGdlLCBvZmZzOwotCXN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1ZjsKIAlzdHJ1Y3QgYXVkaW9waXBlICpwaXBlOwogCiAJY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKQEAgLTUwMyw3ICs1MDIsNyBAQAogCWlmIChwaXBlLT5pbmRleCA+PSAwKSB7CiAJCURFX0hXUCgoImh3cF9pZSBmcmVlKCVkKVxuIiwgcGlwZS0+aW5kZXgpKTsKIAkJZXJyID0gZnJlZV9waXBlcyhjaGlwLCBwaXBlKTsKLQkJc25kX2Fzc2VydCghZXJyKTsKKwkJc25kX0JVR19PTihlcnIpOwogCQljaGlwLT5zdWJzdHJlYW1bcGlwZS0+aW5kZXhdID0gTlVMTDsKIAl9CiAKQEAgLTUzMSwxMCArNTMwLDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlzZ2J1ZiA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7Ci0KLQlERV9IV1AoKCJwY21faHdfcGFyYW1zIHRhYmxlIHNpemU9JWQgcGFnZXM9JWRcbiIsCi0JCXNnYnVmLT5zaXplLCBzZ2J1Zi0+cGFnZXMpKTsKIAlzZ2xpc3RfaW5pdChjaGlwLCBwaXBlKTsKIAllZGdlID0gUEFHRV9TSVpFOwogCWZvciAob2ZmcyA9IHBhZ2UgPSBwZXIgPSAwOyBvZmZzIDwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpOwpAQCAtNTQzLDE2ICs1MzgsMTUgQEAKIAkJaWYgKG9mZnMgKyByZXN0ID4gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKQogCQkJcmVzdCA9IHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSAtIG9mZnM7CiAJCXdoaWxlIChyZXN0KSB7CisJCQlkbWFfYWRkcl90IGFkZHI7CisJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mZnMpOwogCQkJaWYgKHJlc3QgPD0gZWRnZSAtIG9mZnMpIHsKLQkJCQlzZ2xpc3RfYWRkX21hcHBpbmcoY2hpcCwgcGlwZSwKLQkJCQkJCSAgIHNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1Ziwgb2ZmcyksCi0JCQkJCQkgICByZXN0KTsKKwkJCQlzZ2xpc3RfYWRkX21hcHBpbmcoY2hpcCwgcGlwZSwgYWRkciwgcmVzdCk7CiAJCQkJc2dsaXN0X2FkZF9pcnEoY2hpcCwgcGlwZSk7CiAJCQkJb2ZmcyArPSByZXN0OwogCQkJCXJlc3QgPSAwOwogCQkJfSBlbHNlIHsKLQkJCQlzZ2xpc3RfYWRkX21hcHBpbmcoY2hpcCwgcGlwZSwKLQkJCQkJCSAgIHNuZF9zZ2J1Zl9nZXRfYWRkcihzZ2J1Ziwgb2ZmcyksCisJCQkJc2dsaXN0X2FkZF9tYXBwaW5nKGNoaXAsIHBpcGUsIGFkZHIsCiAJCQkJCQkgICBlZGdlIC0gb2Zmcyk7CiAJCQkJcmVzdCAtPSBlZGdlIC0gb2ZmczsKIAkJCQlvZmZzID0gZWRnZTsKQEAgLTY5MCw4ICs2ODQsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc25kX2Fzc2VydChwaXBlX2luZGV4IDwgcHhfbnVtKGNoaXApLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChpc19waXBlX2FsbG9jYXRlZChjaGlwLCBwaXBlX2luZGV4KSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHBpcGVfaW5kZXggPj0gcHhfbnVtKGNoaXApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oIWlzX3BpcGVfYWxsb2NhdGVkKGNoaXAsIHBpcGVfaW5kZXgpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJc2V0X2F1ZGlvX2Zvcm1hdChjaGlwLCBwaXBlX2luZGV4LCAmZm9ybWF0KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvXzNnLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb18zZy5jCmluZGV4IDUyYTkzMzEuLmMzNzM2YmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvXzNnLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fM2cuYwpAQCAtMTAzLDkgKzEwMywxMSBAQAogCWludCBlcnIsIGksIG87CiAKIAkvKiBBbGwgYXVkaW8gY2hhbm5lbHMgbXVzdCBiZSBjbG9zZWQgYmVmb3JlIGNoYW5naW5nIHRoZSBkaWdpdGFsIG1vZGUgKi8KLQlzbmRfYXNzZXJ0KCFjaGlwLT5waXBlX2FsbG9jX21hc2ssIHJldHVybiAtRUFHQUlOKTsKKwlpZiAoc25kX0JVR19PTihjaGlwLT5waXBlX2FsbG9jX21hc2spKQorCQlyZXR1cm4gLUVBR0FJTjsKIAotCXNuZF9hc3NlcnQoY2hpcC0+ZGlnaXRhbF9tb2RlcyAmICgxIDw8IG1vZGUpLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIShjaGlwLT5kaWdpdGFsX21vZGVzICYgKDEgPDwgbW9kZSkpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcmV2aW91c19tb2RlID0gY2hpcC0+ZGlnaXRhbF9tb2RlOwogCWVyciA9IGRzcF9zZXRfZGlnaXRhbF9tb2RlKGNoaXAsIG1vZGUpOwpAQCAtMjY3LDggKzI2OSw5IEBACiAJCXJldHVybiAwOwogCX0KIAotCXNuZF9hc3NlcnQocmF0ZSA8IDUwMDAwIHx8IGNoaXAtPmRpZ2l0YWxfbW9kZSAhPSBESUdJVEFMX01PREVfQURBVCwKLQkJICAgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHJhdGUgPj0gNTAwMDAgJiYKKwkJICAgICAgIGNoaXAtPmRpZ2l0YWxfbW9kZSA9PSBESUdJVEFMX01PREVfQURBVCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2xvY2sgPSAwOwogCWNvbnRyb2xfcmVnID0gbGUzMl90b19jcHUoY2hpcC0+Y29tbV9wYWdlLT5jb250cm9sX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKaW5kZXggZTZjMTAwNy4uYmUwZTE4MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZHNwLmMKQEAgLTQ3NCw3ICs0NzQsOCBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJaW50IGJveF90eXBlLCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGNoaXAtPmRzcF9jb2RlX3RvX2xvYWQgJiYgY2hpcC0+Y29tbV9wYWdlLCByZXR1cm4gLUVQRVJNKTsKKwlpZiAoc25kX0JVR19PTighY2hpcC0+ZHNwX2NvZGVfdG9fbG9hZCB8fCAhY2hpcC0+Y29tbV9wYWdlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCS8qIFNlZSBpZiB0aGUgQVNJQyBpcyBwcmVzZW50IGFuZCB3b3JraW5nIC0gb25seSBpZiB0aGUgRFNQIGlzIGFscmVhZHkgbG9hZGVkICovCiAJaWYgKGNoaXAtPmRzcF9jb2RlKSB7CkBAIC01MTIsOCArNTEzLDggQEAKIC8qIFNldCB0aGUgbm9taW5hbCBsZXZlbCBmb3IgYW4gaW5wdXQgb3Igb3V0cHV0IGJ1cyAodHJ1ZSA9IC0xMGRCViwgZmFsc2UgPSArNGRCdSkgKi8KIHN0YXRpYyBpbnQgc2V0X25vbWluYWxfbGV2ZWwoc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTE2IGluZGV4LCBjaGFyIGNvbnN1bWVyKQogewotCXNuZF9hc3NlcnQoaW5kZXggPCBudW1fYnVzc2VzX291dChjaGlwKSArIG51bV9idXNzZXNfaW4oY2hpcCksCi0JCSAgIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihpbmRleCA+PSBudW1fYnVzc2VzX291dChjaGlwKSArIG51bV9idXNzZXNfaW4oY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFdhaXQgZm9yIHRoZSBoYW5kc2hha2UgKE9LIGV2ZW4gaWYgQVNJQyBpcyBub3QgbG9hZGVkKSAqLwogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKQEAgLTUzNiw3ICs1MzcsOCBAQAogLyogU2V0IHRoZSBnYWluIGZvciBhIHNpbmdsZSBwaHlzaWNhbCBvdXRwdXQgY2hhbm5lbCAoZEIpLiAqLwogc3RhdGljIGludCBzZXRfb3V0cHV0X2dhaW4oc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTE2IGNoYW5uZWwsIHM4IGdhaW4pCiB7Ci0Jc25kX2Fzc2VydChjaGFubmVsIDwgbnVtX2J1c3Nlc19vdXQoY2hpcCksIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihjaGFubmVsID49IG51bV9idXNzZXNfb3V0KGNoaXApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAod2FpdF9oYW5kc2hha2UoY2hpcCkpCiAJCXJldHVybiAtRUlPOwpAQCAtNTU0LDggKzU1Niw5IEBACiBzdGF0aWMgaW50IHNldF9tb25pdG9yX2dhaW4oc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTE2IG91dHB1dCwgdTE2IGlucHV0LAogCQkJICAgIHM4IGdhaW4pCiB7Ci0Jc25kX2Fzc2VydChvdXRwdXQgPCBudW1fYnVzc2VzX291dChjaGlwKSAmJgotCQkgICBpbnB1dCA8IG51bV9idXNzZXNfaW4oY2hpcCksIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihvdXRwdXQgPj0gbnVtX2J1c3Nlc19vdXQoY2hpcCkgfHwKKwkJICAgIGlucHV0ID49IG51bV9idXNzZXNfaW4oY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xMDY1LDggKzEwNjgsMTAgQEAKIAlpbnQgaTsKIAogCURFX0FDVCgoImZyZWVfcGlwZXM6IFBpcGUgJWRcbiIsIHBpcGUtPmluZGV4KSk7Ci0Jc25kX2Fzc2VydChpc19waXBlX2FsbG9jYXRlZChjaGlwLCBwaXBlLT5pbmRleCksIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KHBpcGUtPnN0YXRlID09IFBJUEVfU1RBVEVfU1RPUFBFRCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFpc19waXBlX2FsbG9jYXRlZChjaGlwLCBwaXBlLT5pbmRleCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTihwaXBlLT5zdGF0ZSAhPSBQSVBFX1NUQVRFX1NUT1BQRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoY2hhbm5lbF9tYXNrID0gaSA9IDA7IGkgPCBwaXBlLT5pbnRlcmxlYXZlOyBpKyspCiAJCWNoYW5uZWxfbWFzayB8PSAxIDw8IChwaXBlLT5pbmRleCArIGkpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fZ21sLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19nbWwuYwppbmRleCAzYWEzN2U3Li5hZmEyNzMzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19nbWwuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb19nbWwuYwpAQCAtMTEyLDkgKzExMiwxMSBAQAogCQlyZXR1cm4gLUVJTzsKIAogCS8qIEFsbCBhdWRpbyBjaGFubmVscyBtdXN0IGJlIGNsb3NlZCBiZWZvcmUgY2hhbmdpbmcgdGhlIGRpZ2l0YWwgbW9kZSAqLwotCXNuZF9hc3NlcnQoIWNoaXAtPnBpcGVfYWxsb2NfbWFzaywgcmV0dXJuIC1FQUdBSU4pOworCWlmIChzbmRfQlVHX09OKGNoaXAtPnBpcGVfYWxsb2NfbWFzaykpCisJCXJldHVybiAtRUFHQUlOOwogCi0Jc25kX2Fzc2VydChjaGlwLT5kaWdpdGFsX21vZGVzICYgKDEgPDwgbW9kZSksIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighKGNoaXAtPmRpZ2l0YWxfbW9kZXMgJiAoMSA8PCBtb2RlKSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByZXZpb3VzX21vZGUgPSBjaGlwLT5kaWdpdGFsX21vZGU7CiAJZXJyID0gZHNwX3NldF9kaWdpdGFsX21vZGUoY2hpcCwgbW9kZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMF9kc3AuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwX2RzcC5jCmluZGV4IDI3NTdjODkuLmRiNmM5NTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwX2RzcC5jCkBAIC0zOCw3ICszOCw4IEBACiAJaW50IGVycjsKIAogCURFX0lOSVQoKCJpbml0X2h3KCkgLSBHaW5hMjBcbiIpKTsKLQlzbmRfYXNzZXJ0KChzdWJkZXZpY2VfaWQgJiAweGZmZjApID09IEdJTkEyMCwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IEdJTkEyMCkpCisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKChlcnIgPSBpbml0X2RzcF9jb21tX3BhZ2UoY2hpcCkpKSB7CiAJCURFX0lOSVQoKCJpbml0X2h3IC0gY291bGQgbm90IGluaXRpYWxpemUgRFNQIGNvbW0gcGFnZVxuIikpOwpAQCAtMTc3LDcgKzE3OCw4IEBACiAvKiBTZXQgaW5wdXQgYnVzIGdhaW4gKG9uZSB1bml0IGlzIDAuNWRCICEpICovCiBzdGF0aWMgaW50IHNldF9pbnB1dF9nYWluKHN0cnVjdCBlY2hvYXVkaW8gKmNoaXAsIHUxNiBpbnB1dCwgaW50IGdhaW4pCiB7Ci0Jc25kX2Fzc2VydChpbnB1dCA8IG51bV9idXNzZXNfaW4oY2hpcCksIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihpbnB1dCA+PSBudW1fYnVzc2VzX2luKGNoaXApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAod2FpdF9oYW5kc2hha2UoY2hpcCkpCiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjRfZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNF9kc3AuYwppbmRleCAxNDRmYzU2Li4yZmVmMzdhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNF9kc3AuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNF9kc3AuYwpAQCAtNDMsNyArNDMsOCBAQAogCWludCBlcnI7CiAKIAlERV9JTklUKCgiaW5pdF9odygpIC0gR2luYTI0XG4iKSk7Ci0Jc25kX2Fzc2VydCgoc3ViZGV2aWNlX2lkICYgMHhmZmYwKSA9PSBHSU5BMjQsIHJldHVybiAtRU5PREVWKTsKKwlpZiAoc25kX0JVR19PTigoc3ViZGV2aWNlX2lkICYgMHhmZmYwKSAhPSBHSU5BMjQpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTg0LDcgKzg1LDggQEAKIAlpZiAoKGVyciA9IGluaXRfbGluZV9sZXZlbHMoY2hpcCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBzZXRfZGlnaXRhbF9tb2RlKGNoaXAsIERJR0lUQUxfTU9ERV9TUERJRl9SQ0EpOwotCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCWVyciA9IHNldF9wcm9mZXNzaW9uYWxfc3BkaWYoY2hpcCwgVFJVRSk7CiAKIAlERV9JTklUKCgiaW5pdF9odyBkb25lXG4iKSk7CkBAIC0xNjMsOCArMTY1LDkgQEAKIHsKIAl1MzIgY29udHJvbF9yZWcsIGNsb2NrOwogCi0Jc25kX2Fzc2VydChyYXRlIDwgNTAwMDAgfHwgY2hpcC0+ZGlnaXRhbF9tb2RlICE9IERJR0lUQUxfTU9ERV9BREFULAotCQkgICByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocmF0ZSA+PSA1MDAwMCAmJgorCQkgICAgICAgY2hpcC0+ZGlnaXRhbF9tb2RlID09IERJR0lUQUxfTU9ERV9BREFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBPbmx5IHNldCB0aGUgY2xvY2sgZm9yIGludGVybmFsIG1vZGUuICovCiAJaWYgKGNoaXAtPmlucHV0X2Nsb2NrICE9IEVDSE9fQ0xPQ0tfSU5URVJOQUwpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29fZHNwLmMKaW5kZXggZDZhYzc3My4uZjA1ZTM5ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29fZHNwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29fZHNwLmMKQEAgLTM5LDcgKzM5LDggQEAKIAlpbnQgZXJyOwogCiAJREVfSU5JVCgoImluaXRfaHcoKSAtIEluZGlnb1xuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gSU5ESUdPLCByZXR1cm4gLUVOT0RFVik7CisJaWYgKHNuZF9CVUdfT04oKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgIT0gSU5ESUdPKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGVyciA9IGluaXRfZHNwX2NvbW1fcGFnZShjaGlwKSkpIHsKIAkJREVfSU5JVCgoImluaXRfaHcgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBEU1AgY29tbSBwYWdlXG4iKSk7CkBAIC0xNDMsOCArMTQ0LDkgQEAKIHsKIAlpbnQgaW5kZXg7CiAKLQlzbmRfYXNzZXJ0KHBpcGUgPCBudW1fcGlwZXNfb3V0KGNoaXApICYmCi0JCSAgIG91dHB1dCA8IG51bV9idXNzZXNfb3V0KGNoaXApLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocGlwZSA+PSBudW1fcGlwZXNfb3V0KGNoaXApIHx8CisJCSAgICAgICBvdXRwdXQgPj0gbnVtX2J1c3Nlc19vdXQoY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kal9kc3AuYwppbmRleCA1MDBlMTUwLi45MDczMGE1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGpfZHNwLmMKQEAgLTM5LDcgKzM5LDggQEAKIAlpbnQgZXJyOwogCiAJREVfSU5JVCgoImluaXRfaHcoKSAtIEluZGlnbyBESlxuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gSU5ESUdPX0RKLCByZXR1cm4gLUVOT0RFVik7CisJaWYgKHNuZF9CVUdfT04oKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgIT0gSU5ESUdPX0RKKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGVyciA9IGluaXRfZHNwX2NvbW1fcGFnZShjaGlwKSkpIHsKIAkJREVfSU5JVCgoImluaXRfaHcgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBEU1AgY29tbSBwYWdlXG4iKSk7CkBAIC0xNDMsOCArMTQ0LDkgQEAKIHsKIAlpbnQgaW5kZXg7CiAKLQlzbmRfYXNzZXJ0KHBpcGUgPCBudW1fcGlwZXNfb3V0KGNoaXApICYmCi0JCSAgIG91dHB1dCA8IG51bV9idXNzZXNfb3V0KGNoaXApLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocGlwZSA+PSBudW1fcGlwZXNfb3V0KGNoaXApIHx8CisJCSAgICAgICBvdXRwdXQgPj0gbnVtX2J1c3Nlc19vdXQoY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pb19kc3AuYwppbmRleCBmM2FkMTNkLi5hN2UwOWVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW9fZHNwLmMKQEAgLTM5LDcgKzM5LDggQEAKIAlpbnQgZXJyOwogCiAJREVfSU5JVCgoImluaXRfaHcoKSAtIEluZGlnbyBJT1xuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gSU5ESUdPX0lPLCByZXR1cm4gLUVOT0RFVik7CisJaWYgKHNuZF9CVUdfT04oKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgIT0gSU5ESUdPX0lPKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGVyciA9IGluaXRfZHNwX2NvbW1fcGFnZShjaGlwKSkpIHsKIAkJREVfSU5JVCgoImluaXRfaHcgLSBjb3VsZCBub3QgaW5pdGlhbGl6ZSBEU1AgY29tbSBwYWdlXG4iKSk7CkBAIC0xMTQsOCArMTE1LDkgQEAKIHsKIAlpbnQgaW5kZXg7CiAKLQlzbmRfYXNzZXJ0KHBpcGUgPCBudW1fcGlwZXNfb3V0KGNoaXApICYmCi0JCSAgIG91dHB1dCA8IG51bV9idXNzZXNfb3V0KGNoaXApLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocGlwZSA+PSBudW1fcGlwZXNfb3V0KGNoaXApIHx8CisJCSAgICAgICBvdXRwdXQgPj0gbnVtX2J1c3Nlc19vdXQoY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjBfZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjBfZHNwLmMKaW5kZXggOTkwYzlhNi4uZWRlNzVjNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyMF9kc3AuYwpAQCAtNDIsNyArNDIsOCBAQAogCWludCBlcnI7CiAKIAlERV9JTklUKCgiaW5pdF9odygpIC0gTGF5bGEyMFxuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gTEFZTEEyMCwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IExBWUxBMjApKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTE1NSw3ICsxNTYsOCBAQAogCiBzdGF0aWMgaW50IHNldF9zYW1wbGVfcmF0ZShzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwLCB1MzIgcmF0ZSkKIHsKLQlzbmRfYXNzZXJ0KHJhdGUgPj0gODAwMCAmJiByYXRlIDw9IDUwMDAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocmF0ZSA8IDgwMDAgfHwgcmF0ZSA+IDUwMDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBPbmx5IHNldCB0aGUgY2xvY2sgZm9yIGludGVybmFsIG1vZGUuIERvIG5vdCByZXR1cm4gZmFpbHVyZSwKIAkgICBzaW1wbHkgdHJlYXQgaXQgYXMgYSBub24tZXZlbnQuICovCkBAIC0yNTIsNyArMjU0LDggQEAKIC8qIFNldCBpbnB1dCBidXMgZ2FpbiAob25lIHVuaXQgaXMgMC41ZEIgISkgKi8KIHN0YXRpYyBpbnQgc2V0X2lucHV0X2dhaW4oc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTE2IGlucHV0LCBpbnQgZ2FpbikKIHsKLQlzbmRfYXNzZXJ0KGlucHV0IDwgbnVtX2J1c3Nlc19pbihjaGlwKSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKGlucHV0ID49IG51bV9idXNzZXNfaW4oY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjRfZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjRfZHNwLmMKaW5kZXggOTdlNDJlMS4uZDYxYjVjYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTI0X2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNF9kc3AuYwpAQCAtNDIsNyArNDIsOCBAQAogCWludCBlcnI7CiAKIAlERV9JTklUKCgiaW5pdF9odygpIC0gTGF5bGEyNFxuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gTEFZTEEyNCwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IExBWUxBMjQpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTczLDcgKzc0LDggQEAKIAkJcmV0dXJuIGVycjsKIAogCWVyciA9IHNldF9kaWdpdGFsX21vZGUoY2hpcCwgRElHSVRBTF9NT0RFX1NQRElGX1JDQSk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIGVycik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAJZXJyID0gc2V0X3Byb2Zlc3Npb25hbF9zcGRpZihjaGlwLCBUUlVFKTsKIAogCURFX0lOSVQoKCJpbml0X2h3IGRvbmVcbiIpKTsKQEAgLTE1OCw4ICsxNjAsOSBAQAogewogCXUzMiBjb250cm9sX3JlZywgY2xvY2ssIGJhc2VfcmF0ZTsKIAotCXNuZF9hc3NlcnQocmF0ZSA8IDUwMDAwIHx8IGNoaXAtPmRpZ2l0YWxfbW9kZSAhPSBESUdJVEFMX01PREVfQURBVCwKLQkJICAgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHJhdGUgPj0gNTAwMDAgJiYKKwkJICAgICAgIGNoaXAtPmRpZ2l0YWxfbW9kZSA9PSBESUdJVEFMX01PREVfQURBVCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogT25seSBzZXQgdGhlIGNsb2NrIGZvciBpbnRlcm5hbCBtb2RlLiAqLwogCWlmIChjaGlwLT5pbnB1dF9jbG9jayAhPSBFQ0hPX0NMT0NLX0lOVEVSTkFMKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYV9kc3AuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhX2RzcC5jCmluZGV4IDg5MWM3MDUuLjIyNzM4NjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhX2RzcC5jCkBAIC00Miw3ICs0Miw4IEBACiAJaW50IGVycjsKIAogCURFX0lOSVQoKCJpbml0X2h3KCkgLSBNaWFcbiIpKTsKLQlzbmRfYXNzZXJ0KChzdWJkZXZpY2VfaWQgJiAweGZmZjApID09IE1JQSwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IE1JQSkpCisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKChlcnIgPSBpbml0X2RzcF9jb21tX3BhZ2UoY2hpcCkpKSB7CiAJCURFX0lOSVQoKCJpbml0X2h3IC0gY291bGQgbm90IGluaXRpYWxpemUgRFNQIGNvbW0gcGFnZVxuIikpOwpAQCAtMTYxLDggKzE2Miw5IEBACiBzdGF0aWMgaW50IHNldF9pbnB1dF9jbG9jayhzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwLCB1MTYgY2xvY2spCiB7CiAJREVfQUNUKCgic2V0X2lucHV0X2Nsb2NrKCVkKVxuIiwgY2xvY2spKTsKLQlzbmRfYXNzZXJ0KGNsb2NrID09IEVDSE9fQ0xPQ0tfSU5URVJOQUwgfHwgY2xvY2sgPT0gRUNIT19DTE9DS19TUERJRiwKLQkJICAgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKGNsb2NrICE9IEVDSE9fQ0xPQ0tfSU5URVJOQUwgJiYKKwkJICAgICAgIGNsb2NrICE9IEVDSE9fQ0xPQ0tfU1BESUYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoaXAtPmlucHV0X2Nsb2NrID0gY2xvY2s7CiAJcmV0dXJuIHNldF9zYW1wbGVfcmF0ZShjaGlwLCBjaGlwLT5zYW1wbGVfcmF0ZSk7CkBAIC0xNzYsOCArMTc4LDkgQEAKIHsKIAlpbnQgaW5kZXg7CiAKLQlzbmRfYXNzZXJ0KHBpcGUgPCBudW1fcGlwZXNfb3V0KGNoaXApICYmCi0JCSAgIG91dHB1dCA8IG51bV9idXNzZXNfb3V0KGNoaXApLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocGlwZSA+PSBudW1fcGlwZXNfb3V0KGNoaXApIHx8CisJCSAgICAgICBvdXRwdXQgPj0gbnVtX2J1c3Nlc19vdXQoY2hpcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3YWl0X2hhbmRzaGFrZShjaGlwKSkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21pZGkuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCmluZGV4IDkxZjViZmYuLjc3YmYyYTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlkaS5jCkBAIC01OSw3ICs1OSw4IEBACiBSZXR1cm5zIGhvdyBtYW55IGFjdHVhbGx5IHdyaXR0ZW4gb3IgPCAwIG9uIGVycm9yICovCiBzdGF0aWMgaW50IHdyaXRlX21pZGkoc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTggKmRhdGEsIGludCBieXRlcykKIHsKLQlzbmRfYXNzZXJ0KGJ5dGVzID4gMCAmJiBieXRlcyA8IE1JRElfT1VUX0JVRkZFUl9TSVpFLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oYnl0ZXMgPD0gMCB8fCBieXRlcyA+PSBNSURJX09VVF9CVUZGRVJfU0laRSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHdhaXRfaGFuZHNoYWtlKGNoaXApKQogCQlyZXR1cm4gLUVJTzsKQEAgLTExOSw3ICsxMjAsOCBAQAogCS8qIFRoZSBjb3VudCBpcyBhdCBpbmRleCAwLCBmb2xsb3dlZCBieSBhY3R1YWwgZGF0YSAqLwogCWNvdW50ID0gbGUxNl90b19jcHUoY2hpcC0+Y29tbV9wYWdlLT5taWRpX2lucHV0WzBdKTsKIAotCXNuZF9hc3NlcnQoY291bnQgPCBNSURJX0lOX0JVRkZFUl9TSVpFLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oY291bnQgPj0gTUlESV9JTl9CVUZGRVJfU0laRSkpCisJCXJldHVybiAwOwogCiAJLyogR2V0IHRoZSBNSURJIGRhdGEgZnJvbSB0aGUgY29tbSBwYWdlICovCiAJaSA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmFfZHNwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmFfZHNwLmMKaW5kZXggYzBiNGJmMC4uZWFhNjE5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9tb25hX2RzcC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbW9uYV9kc3AuYwpAQCAtNDMsNyArNDMsOCBAQAogCWludCBlcnI7CiAKIAlERV9JTklUKCgiaW5pdF9odygpIC0gTW9uYVxuIikpOwotCXNuZF9hc3NlcnQoKHN1YmRldmljZV9pZCAmIDB4ZmZmMCkgPT0gTU9OQSwgcmV0dXJuIC1FTk9ERVYpOworCWlmIChzbmRfQlVHX09OKChzdWJkZXZpY2VfaWQgJiAweGZmZjApICE9IE1PTkEpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgoZXJyID0gaW5pdF9kc3BfY29tbV9wYWdlKGNoaXApKSkgewogCQlERV9JTklUKCgiaW5pdF9odyAtIGNvdWxkIG5vdCBpbml0aWFsaXplIERTUCBjb21tIHBhZ2VcbiIpKTsKQEAgLTc5LDcgKzgwLDggQEAKIAkJcmV0dXJuIGVycjsKIAogCWVyciA9IHNldF9kaWdpdGFsX21vZGUoY2hpcCwgRElHSVRBTF9NT0RFX1NQRElGX1JDQSk7Ci0Jc25kX2Fzc2VydChlcnIgPj0gMCwgcmV0dXJuIGVycik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAJZXJyID0gc2V0X3Byb2Zlc3Npb25hbF9zcGRpZihjaGlwLCBUUlVFKTsKIAogCURFX0lOSVQoKCJpbml0X2h3IGRvbmVcbiIpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfY2FsbGJhY2suYwppbmRleCA0NTA4OGViLi4wZTY0OWRjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCkBAIC0xNDUsNyArMTQ1LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX2VtdTEwazEgKmh3OwogCQotCXNuZF9hc3NlcnQodnAsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXZwKSkKKwkJcmV0dXJuOwogCWh3ID0gdnAtPmh3OwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShodywgRENZU1VTViwgdnAtPmNoLCAweDgwN2YgfCBEQ1lTVVNWX0NIQU5ORUxFTkFCTEVfTUFTSyk7CiAJaWYgKHZwLT5ibG9jaykgewpAQCAtMzI1LDcgKzMyNiw4IEBACiAJCiAJaHcgPSB2cC0+aHc7CiAJY2ggPSB2cC0+Y2g7Ci0Jc25kX2Fzc2VydChjaCA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oY2ggPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJY2hhbiA9IHZwLT5jaGFuOwogCiAJZW1lbSA9IChzdHJ1Y3Qgc25kX2VtdTEwazFfbWVtYmxrICopdnAtPmJsb2NrOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9wYXRjaC5jCmluZGV4IDQyYmFlNmYuLmUxMGYwMjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3BhdGNoLmMKQEAgLTQ2LDggKzQ2LDggQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdTsKIAogCWVtdSA9IHJlYy0+aHc7Ci0Jc25kX2Fzc2VydChzcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChoZHIgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFzcCB8fCAhaGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc3AtPnYuc2l6ZSA9PSAwKSB7CiAJCXNuZF9wcmludGQoImVtdTogcm9tIGZvbnQgZm9yIHNhbXBsZSAlZFxuIiwgc3AtPnYuc2FtcGxlKTsKQEAgLTEwNCw3ICsxMDQsOCBAQAogCXNpemUgPSBCTEFOS19IRUFEX1NJWkU7CiAJaWYgKCEgKHNwLT52Lm1vZGVfZmxhZ3MgJiBTTkRSVl9TRk5UX1NBTVBMRV84QklUUykpCiAJCXNpemUgKj0gMjsKLQlzbmRfYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gYmxvY2tzaXplLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKG9mZnNldCArIHNpemUgPiBibG9ja3NpemUpCisJCXJldHVybiAtRUlOVkFMOwogCXNuZF9lbXUxMGsxX3N5bnRoX2J6ZXJvKGVtdSwgc3AtPmJsb2NrLCBvZmZzZXQsIHNpemUpOwogCW9mZnNldCArPSBzaXplOwogCkBAIC0xMTIsNyArMTEzLDggQEAKIAlzaXplID0gbG9vcGVuZDsKIAlpZiAoISAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKSkKIAkJc2l6ZSAqPSAyOwotCXNuZF9hc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSBibG9ja3NpemUsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAob2Zmc2V0ICsgc2l6ZSA+IGJsb2Nrc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHNuZF9lbXUxMGsxX3N5bnRoX2NvcHlfZnJvbV91c2VyKGVtdSwgc3AtPmJsb2NrLCBvZmZzZXQsIGRhdGEsIHNpemUpKSB7CiAJCXNuZF9lbXUxMGsxX3N5bnRoX2ZyZWUoZW11LCBzcC0+YmxvY2spOwogCQlzcC0+YmxvY2sgPSBOVUxMOwpAQCAtMTI5LDEyICsxMzEsMTQgQEAKIAkJCWludCB3b2Zmc2V0OwogCQkJdW5zaWduZWQgc2hvcnQgKndibG9jayA9ICh1bnNpZ25lZCBzaG9ydCopYmxvY2s7CiAJCQl3b2Zmc2V0ID0gb2Zmc2V0IC8gMjsKLQkJCXNuZF9hc3NlcnQob2Zmc2V0ICsgbG9vcHNpemUqMiA8PSBibG9ja3NpemUsIHJldHVybiAtRUlOVkFMKTsKKwkJCWlmIChvZmZzZXQgKyBsb29wc2l6ZSAqIDIgPiBibG9ja3NpemUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbG9vcHNpemU7IGkrKykKIAkJCQl3YmxvY2tbd29mZnNldCArIGldID0gd2Jsb2NrW3dvZmZzZXQgLSBpIC0xXTsKIAkJCW9mZnNldCArPSBsb29wc2l6ZSAqIDI7CiAJCX0gZWxzZSB7Ci0JCQlzbmRfYXNzZXJ0KG9mZnNldCArIGxvb3BzaXplIDw9IGJsb2Nrc2l6ZSwgcmV0dXJuIC1FSU5WQUwpOworCQkJaWYgKG9mZnNldCArIGxvb3BzaXplID4gYmxvY2tzaXplKQorCQkJCXJldHVybiAtRUlOVkFMOwogCQkJZm9yIChpID0gMDsgaSA8IGxvb3BzaXplOyBpKyspCiAJCQkJYmxvY2tbb2Zmc2V0ICsgaV0gPSBibG9ja1tvZmZzZXQgLSBpIC0xXTsKIAkJCW9mZnNldCArPSBsb29wc2l6ZTsKQEAgLTE1NCw3ICsxNTgsOCBAQAogCiAJLyogbG9vcGVuZCAtPiBzYW1wbGUgZW5kICovCiAJc2l6ZSA9IHNwLT52LnNpemUgLSBsb29wZW5kOwotCXNuZF9hc3NlcnQoc2l6ZSA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNpemUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoISAoc3AtPnYubW9kZV9mbGFncyAmIFNORFJWX1NGTlRfU0FNUExFXzhCSVRTKSkKIAkJc2l6ZSAqPSAyOwogCWlmIChzbmRfZW11MTBrMV9zeW50aF9jb3B5X2Zyb21fdXNlcihlbXUsIHNwLT5ibG9jaywgb2Zmc2V0LCBkYXRhLCBzaXplKSkgewpAQCAtMjEyLDggKzIxNyw4IEBACiAJc3RydWN0IHNuZF9lbXUxMGsxICplbXU7CiAKIAllbXUgPSByZWMtPmh3OwotCXNuZF9hc3NlcnQoc3AgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoaGRyICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighc3AgfHwgIWhkcikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHNwLT5ibG9jaykgewogCQlzbmRfZW11MTBrMV9zeW50aF9mcmVlKGVtdSwgc3AtPmJsb2NrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCmluZGV4IDQ5MWE0YTUuLjVmZjRkYmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtMTMxOSw3ICsxMzE5LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQogCWVtdSA9IG1pZGktPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRU5YSU87CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOwogCW1pZGktPm1pZGlfbW9kZSB8PSBFTVUxMEsxWF9NSURJX01PREVfSU5QVVQ7CiAJbWlkaS0+c3Vic3RyZWFtX2lucHV0ID0gc3Vic3RyZWFtOwpAQCAtMTM0NSw3ICsxMzQ2LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZW11ID0gbWlkaS0+ZW11OwotCXNuZF9hc3NlcnQoZW11LCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CiAJbWlkaS0+bWlkaV9tb2RlIHw9IEVNVTEwSzFYX01JRElfTU9ERV9PVVRQVVQ7CiAJbWlkaS0+c3Vic3RyZWFtX291dHB1dCA9IHN1YnN0cmVhbTsKQEAgLTEzNzIsNyArMTM3NCw4IEBACiAJaW50IGVyciA9IDA7CiAKIAllbXUgPSBtaWRpLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+cnhfZW5hYmxlKTsKIAltaWRpLT5taWRpX21vZGUgJj0gfkVNVTEwSzFYX01JRElfTU9ERV9JTlBVVDsKQEAgLTEzOTQsNyArMTM5Nyw4IEBACiAJaW50IGVyciA9IDA7CiAKIAllbXUgPSBtaWRpLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAlzbmRfZW11MTBrMXhfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+dHhfZW5hYmxlKTsKIAltaWRpLT5taWRpX21vZGUgJj0gfkVNVTEwSzFYX01JRElfTU9ERV9PVVRQVVQ7CkBAIC0xNDEzLDcgKzE0MTcsOCBAQAogCXN0cnVjdCBlbXUxMGsxeCAqZW11OwogCXN0cnVjdCBlbXUxMGsxeF9taWRpICptaWRpID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCWVtdSA9IG1pZGktPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKKwkJcmV0dXJuOwogCiAJaWYgKHVwKQogCQlzbmRfZW11MTBrMXhfaW50cl9lbmFibGUoZW11LCBtaWRpLT5yeF9lbmFibGUpOwpAQCAtMTQyOCw3ICsxNDMzLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZW11ID0gbWlkaS0+ZW11OwotCXNuZF9hc3NlcnQoZW11LCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm47CiAKIAlpZiAodXApIHsKIAkJaW50IG1heCA9IDQ7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwppbmRleCA3MWRjNGM4Li43ZGJhMDhmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKQEAgLTQ4Nyw3ICs0ODcsOCBAQAogCQkJCSB1MzIgb3AsIHUzMiByLCB1MzIgYSwgdTMyIHgsIHUzMiB5KQogewogCXVfaW50MzJfdCAqY29kZTsKLQlzbmRfYXNzZXJ0KCpwdHIgPCA1MTIsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oKnB0ciA+PSA1MTIpKQorCQlyZXR1cm47CiAJY29kZSA9ICh1X2ludDMyX3QgX19mb3JjZSAqKWljb2RlLT5jb2RlICsgKCpwdHIpICogMjsKIAlzZXRfYml0KCpwdHIsIGljb2RlLT5jb2RlX3ZhbGlkKTsKIAljb2RlWzBdID0gKCh4ICYgMHgzZmYpIDw8IDEwKSB8ICh5ICYgMHgzZmYpOwpAQCAtNTAzLDcgKzUwNCw4IEBACiAJCQkJCXUzMiBvcCwgdTMyIHIsIHUzMiBhLCB1MzIgeCwgdTMyIHkpCiB7CiAJdV9pbnQzMl90ICpjb2RlOwotCXNuZF9hc3NlcnQoKnB0ciA8IDEwMjQsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oKnB0ciA+PSAxMDI0KSkKKwkJcmV0dXJuOwogCWNvZGUgPSAodV9pbnQzMl90IF9fZm9yY2UgKilpY29kZS0+Y29kZSArICgqcHRyKSAqIDI7CiAJc2V0X2JpdCgqcHRyLCBpY29kZS0+Y29kZV92YWxpZCk7CiAJY29kZVswXSA9ICgoeCAmIDB4N2ZmKSA8PCAxMikgfCAoeSAmIDB4N2ZmKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1wdTQwMS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMKaW5kZXggYzRkNzZkMS4uODU3OGM3MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bXB1NDAxLmMKQEAgLTE1Nyw3ICsxNTcsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAllbXUgPSBtaWRpLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAltaWRpLT5taWRpX21vZGUgfD0gRU1VMTBLMV9NSURJX01PREVfSU5QVVQ7CiAJbWlkaS0+c3Vic3RyZWFtX2lucHV0ID0gc3Vic3RyZWFtOwpAQCAtMTgzLDcgKzE4NCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWVtdSA9IG1pZGktPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRU5YSU87CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGktPm9wZW5fbG9jaywgZmxhZ3MpOwogCW1pZGktPm1pZGlfbW9kZSB8PSBFTVUxMEsxX01JRElfTU9ERV9PVVRQVVQ7CiAJbWlkaS0+c3Vic3RyZWFtX291dHB1dCA9IHN1YnN0cmVhbTsKQEAgLTIxMCw3ICsyMTIsOCBAQAogCWludCBlcnIgPSAwOwogCiAJZW11ID0gbWlkaS0+ZW11OwotCXNuZF9hc3NlcnQoZW11LCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaS0+b3Blbl9sb2NrLCBmbGFncyk7CiAJc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKGVtdSwgbWlkaS0+cnhfZW5hYmxlKTsKIAltaWRpLT5taWRpX21vZGUgJj0gfkVNVTEwSzFfTUlESV9NT0RFX0lOUFVUOwpAQCAtMjMyLDcgKzIzNSw4IEBACiAJaW50IGVyciA9IDA7CiAKIAllbXUgPSBtaWRpLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm4gLUVOWElPOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpLT5vcGVuX2xvY2ssIGZsYWdzKTsKIAlzbmRfZW11MTBrMV9pbnRyX2Rpc2FibGUoZW11LCBtaWRpLT50eF9lbmFibGUpOwogCW1pZGktPm1pZGlfbW9kZSAmPSB+RU1VMTBLMV9NSURJX01PREVfT1VUUFVUOwpAQCAtMjUxLDcgKzI1NSw4IEBACiAJc3RydWN0IHNuZF9lbXUxMGsxICplbXU7CiAJc3RydWN0IHNuZF9lbXUxMGsxX21pZGkgKm1pZGkgPSAoc3RydWN0IHNuZF9lbXUxMGsxX21pZGkgKilzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CiAJZW11ID0gbWlkaS0+ZW11OwotCXNuZF9hc3NlcnQoZW11LCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm47CiAKIAlpZiAodXApCiAJCXNuZF9lbXUxMGsxX2ludHJfZW5hYmxlKGVtdSwgbWlkaS0+cnhfZW5hYmxlKTsKQEAgLTI2Niw3ICsyNzEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAllbXUgPSBtaWRpLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybjsKIAogCWlmICh1cCkgewogCQlpbnQgbWF4ID0gNDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKaW5kZXggN2QzNzlmNS4uNmE0NzY3MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKQEAgLTEwNyw3ICsxMDcsOCBAQAogCiAJbGlzdF9mb3JfZWFjaCAocG9zLCAmZW11LT5tYXBwZWRfbGlua19oZWFkKSB7CiAJCXN0cnVjdCBzbmRfZW11MTBrMV9tZW1ibGsgKmJsayA9IGdldF9lbXUxMGsxX21lbWJsayhwb3MsIG1hcHBlZF9saW5rKTsKLQkJc25kX2Fzc2VydChibGstPm1hcHBlZF9wYWdlID49IDAsIGNvbnRpbnVlKTsKKwkJaWYgKGJsay0+bWFwcGVkX3BhZ2UgPCAwKQorCQkJY29udGludWU7CiAJCXNpemUgPSBibGstPm1hcHBlZF9wYWdlIC0gcGFnZTsKIAkJaWYgKHNpemUgPT0gbnBhZ2VzKSB7CiAJCQkqbmV4dHAgPSBwb3M7CkBAIC0yOTUsMTUgKzI5NiwxOCBAQAogc25kX2VtdTEwazFfYWxsb2NfcGFnZXMoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmID0gc25kX3BjbV9zdWJzdHJlYW1fc2didWYoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3V0aWxfbWVtaGRyICpoZHI7CiAJc3RydWN0IHNuZF9lbXUxMGsxX21lbWJsayAqYmxrOwogCWludCBwYWdlLCBlcnIsIGlkeDsKIAotCXNuZF9hc3NlcnQoZW11LCByZXR1cm4gTlVMTCk7Ci0Jc25kX2Fzc2VydChydW50aW1lLT5kbWFfYnl0ZXMgPiAwICYmIHJ1bnRpbWUtPmRtYV9ieXRlcyA8IE1BWFBBR0VTICogRU1VUEFHRVNJWkUsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighZW11KSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNuZF9CVUdfT04ocnVudGltZS0+ZG1hX2J5dGVzIDw9IDAgfHwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyA+PSBNQVhQQUdFUyAqIEVNVVBBR0VTSVpFKSkKKwkJcmV0dXJuIE5VTEw7CiAJaGRyID0gZW11LT5tZW1oZHI7Ci0Jc25kX2Fzc2VydChoZHIsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaGRyKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAltdXRleF9sb2NrKCZoZHItPmJsb2NrX211dGV4KTsKIAlibGsgPSBzZWFyY2hfZW1wdHkoZW11LCBydW50aW1lLT5kbWFfYnl0ZXMpOwpAQCAtMzE2LDE2ICszMjAsOSBAQAogCSAqLwogCWlkeCA9IDA7CiAJZm9yIChwYWdlID0gYmxrLT5maXJzdF9wYWdlOyBwYWdlIDw9IGJsay0+bGFzdF9wYWdlOyBwYWdlKyssIGlkeCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgb2ZzID0gaWR4IDw8IFBBR0VfU0hJRlQ7CiAJCWRtYV9hZGRyX3QgYWRkcjsKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JCWlmIChpZHggPj0gc2didWYtPnBhZ2VzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTogcGFnZXMgb3ZlcmZsb3chICglZC0lZCkgZm9yICVkXG4iLAotCQkJICAgICAgIGJsay0+Zmlyc3RfcGFnZSwgYmxrLT5sYXN0X3BhZ2UsIHNnYnVmLT5wYWdlcyk7Ci0JCQltdXRleF91bmxvY2soJmhkci0+YmxvY2tfbXV0ZXgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLSNlbmRpZgotCQlhZGRyID0gc2didWYtPnRhYmxlW2lkeF0uYWRkcjsKKwkJYWRkciA9IHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc3Vic3RyZWFtLCBvZnMpOwogCQlpZiAoISBpc192YWxpZF9wYWdlKGVtdSwgYWRkcikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZW11OiBmYWlsdXJlIHBhZ2UgPSAlZFxuIiwgaWR4KTsKIAkJCW11dGV4X3VubG9jaygmaGRyLT5ibG9ja19tdXRleCk7CkBAIC0zNTMsNyArMzUwLDggQEAKICAqLwogaW50IHNuZF9lbXUxMGsxX2ZyZWVfcGFnZXMoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHN0cnVjdCBzbmRfdXRpbF9tZW1ibGsgKmJsaykKIHsKLQlzbmRfYXNzZXJ0KGVtdSAmJiBibGssIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZW11IHx8ICFibGspKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gc25kX2VtdTEwazFfc3ludGhfZnJlZShlbXUsIGJsayk7CiB9CiAKQEAgLTQ5OCw3ICs0OTYsOCBAQAogc3RhdGljIGlubGluZSB2b2lkICpvZmZzZXRfcHRyKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LCBpbnQgcGFnZSwgaW50IG9mZnNldCkKIHsKIAljaGFyICpwdHI7Ci0Jc25kX2Fzc2VydChwYWdlID49IDAgJiYgcGFnZSA8IGVtdS0+bWF4X2NhY2hlX3BhZ2VzLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04ocGFnZSA8IDAgfHwgcGFnZSA+PSBlbXUtPm1heF9jYWNoZV9wYWdlcykpCisJCXJldHVybiBOVUxMOwogCXB0ciA9IGVtdS0+cGFnZV9wdHJfdGFibGVbcGFnZV07CiAJaWYgKCEgcHRyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogYWNjZXNzIHRvIE5VTEwgcHRyOiBwYWdlID0gJWRcbiIsIHBhZ2UpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKaW5kZXggOTU4Y2IyYS4uZDczMDBhMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCkBAIC0xMTEsOCArMTExLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVzdWx0OwogCi0Jc25kX2Fzc2VydChydm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQobnVtYmVyLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXJ2b2ljZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKCFudW1iZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKDs7KSB7CkBAIC0xNDUsNyArMTQ3LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFwdm9pY2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CiAJcHZvaWNlLT5pbnRlcnJ1cHQgPSBOVUxMOwogCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gcHZvaWNlLT5lZnggPSAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTkzOC5jIGIvc291bmQvcGNpL2VzMTkzOC5jCmluZGV4IDg0ZmFjMWYuLjRjZDlhMWZhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC04NjAsNyArODYwLDggQEAKIAlzdHJ1Y3QgZXMxOTM4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXBvcyA8PD0gY2hpcC0+ZG1hMV9zaGlmdDsKIAljb3VudCA8PD0gY2hpcC0+ZG1hMV9zaGlmdDsKLQlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IGNoaXAtPmRtYTFfc2l6ZSwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHBvcyArIGNvdW50ID4gY2hpcC0+ZG1hMV9zaXplKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBvcyArIGNvdW50IDwgY2hpcC0+ZG1hMV9zaXplKSB7CiAJCWlmIChjb3B5X3RvX3VzZXIoZHN0LCBydW50aW1lLT5kbWFfYXJlYSArIHBvcyArIDEsIGNvdW50KSkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IDFiZjI5OGQuLjIwZWU3NTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5NjguYworKysgYi9zb3VuZC9wY2kvZXMxOTY4LmMKQEAgLTY5Miw3ICs2OTIsOCBAQAogLyogbm8gc3BpbmxvY2sgKi8KIHN0YXRpYyB2b2lkIF9fYXB1X3NldF9yZWdpc3RlcihzdHJ1Y3QgZXMxOTY4ICpjaGlwLCB1MTYgY2hhbm5lbCwgdTggcmVnLCB1MTYgZGF0YSkKIHsKLQlzbmRfYXNzZXJ0KGNoYW5uZWwgPCBOUl9BUFVTLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKGNoYW5uZWwgPj0gTlJfQVBVUykpCisJCXJldHVybjsKICNpZmRlZiBDT05GSUdfUE0KIAljaGlwLT5hcHVfbWFwW2NoYW5uZWxdW3JlZ10gPSBkYXRhOwogI2VuZGlmCkBAIC03MTEsNyArNzEyLDggQEAKIAogc3RhdGljIHUxNiBfX2FwdV9nZXRfcmVnaXN0ZXIoc3RydWN0IGVzMTk2OCAqY2hpcCwgdTE2IGNoYW5uZWwsIHU4IHJlZykKIHsKLQlzbmRfYXNzZXJ0KGNoYW5uZWwgPCBOUl9BUFVTLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oY2hhbm5lbCA+PSBOUl9BUFVTKSkKKwkJcmV0dXJuIDA7CiAJcmVnIHw9IChjaGFubmVsIDw8IDQpOwogCWFwdV9pbmRleF9zZXQoY2hpcCwgcmVnKTsKIAlyZXR1cm4gX19tYWVzdHJvX3JlYWQoY2hpcCwgSURSMF9EQVRBX1BPUlQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggYWIwYzcyNi4uMTk4MGM2ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogc25kLWhkYS1pbnRlbC15ICs9IGhkYV9jb2RlYy5vCiBzbmQtaGRhLWludGVsLSQoQ09ORklHX1BST0NfRlMpICs9IGhkYV9wcm9jLm8KIHNuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9IV0RFUCkgKz0gaGRhX2h3ZGVwLm8KK3NuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQKSArPSBoZGFfYmVlcC5vCiBzbmQtaGRhLWludGVsLSQoQ09ORklHX1NORF9IREFfR0VORVJJQykgKz0gaGRhX2dlbmVyaWMubwogc25kLWhkYS1pbnRlbC0kKENPTkZJR19TTkRfSERBX0NPREVDX1JFQUxURUspICs9IHBhdGNoX3JlYWx0ZWsubwogc25kLWhkYS1pbnRlbC0kKENPTkZJR19TTkRfSERBX0NPREVDX0NNRURJQSkgKz0gcGF0Y2hfY21lZGlhLm8KQEAgLTE0LDUgKzE1LDYgQEAKIHNuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9DT0RFQ19BVElIRE1JKSArPSBwYXRjaF9hdGloZG1pLm8KIHNuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9DT0RFQ19DT05FWEFOVCkgKz0gcGF0Y2hfY29uZXhhbnQubwogc25kLWhkYS1pbnRlbC0kKENPTkZJR19TTkRfSERBX0NPREVDX1ZJQSkgKz0gcGF0Y2hfdmlhLm8KK3NuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9DT0RFQ19OVkhETUkpICs9IHBhdGNoX252aGRtaS5vCiAKIG9iai0kKENPTkZJR19TTkRfSERBX0lOVEVMKSArPSBzbmQtaGRhLWludGVsLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc3YjNlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogRGlnaXRhbCBCZWVwIElucHV0IEludGVyZmFjZSBmb3IgSEQtYXVkaW8gY29kZWMKKyAqCisgKiBBdXRob3I6IE1hdHRoZXcgUmFub3N0YXkgPG1yYW5vc3RheUBlbWJlZGRlZGFsbGV5LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMgSW5jCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9iZWVwLmgiCisKK2VudW0geworCURJR0JFRVBfSFpfU1RFUCA9IDQ2ODc1LAkvKiA0Ni44NzUgSHogKi8KKwlESUdCRUVQX0haX01JTiA9IDkzNzUwLAkJLyogOTMuNzUwIEh6ICovCisJRElHQkVFUF9IWl9NQVggPSAxMjAwMDAwMCwJLyogMTIgS0h6ICovCit9OworCitzdGF0aWMgdm9pZCBzbmRfaGRhX2dlbmVyYXRlX2JlZXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZGFfYmVlcCAqYmVlcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGRhX2JlZXAsIGJlZXBfd29yayk7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBiZWVwLT5jb2RlYzsKKworCS8qIGdlbmVyYXRlIHRvbmUgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBiZWVwLT5uaWQsIDAsCisJCQlBQ19WRVJCX1NFVF9CRUVQX0NPTlRST0wsIGJlZXAtPnRvbmUpOworfQorCitzdGF0aWMgaW50IHNuZF9oZGFfYmVlcF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJCXVuc2lnbmVkIGludCBjb2RlLCBpbnQgaHopCit7CisJc3RydWN0IGhkYV9iZWVwICpiZWVwID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgU05EX0JFTEw6CisJCWlmIChoeikKKwkJCWh6ID0gMTAwMDsKKwljYXNlIFNORF9UT05FOgorCQloeiAqPSAxMDAwOyAvKiBmaXhlZCBwb2ludCAqLworCQloeiA9IGh6IC0gRElHQkVFUF9IWl9NSU47CisJCWlmIChoeiA8IDApCisJCQloeiA9IDA7IC8qIHR1cm4gb2ZmIFBDIGJlZXAqLworCQllbHNlIGlmIChoeiA+PSAoRElHQkVFUF9IWl9NQVggLSBESUdCRUVQX0haX01JTikpCisJCQloeiA9IDB4ZmY7CisJCWVsc2UgeworCQkJaHogLz0gRElHQkVFUF9IWl9TVEVQOworCQkJaHorKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCWJlZXAtPnRvbmUgPSBoejsKKworCS8qIHNjaGVkdWxlIGJlZXAgZXZlbnQgKi8KKwlzY2hlZHVsZV93b3JrKCZiZWVwLT5iZWVwX3dvcmspOworCXJldHVybiAwOworfQorCitpbnQgc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBuaWQpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBoZGFfYmVlcCAqYmVlcDsKKwlpbnQgZXJyOworCisJYmVlcCA9IGt6YWxsb2Moc2l6ZW9mKCpiZWVwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJlZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc25wcmludGYoYmVlcC0+cGh5cywgc2l6ZW9mKGJlZXAtPnBoeXMpLAorCQkiY2FyZCVkL2NvZGVjIyVkL2JlZXAwIiwgY29kZWMtPmJ1cy0+Y2FyZC0+bnVtYmVyLCBjb2RlYy0+YWRkcik7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisKKwkvKiBzZXR1cCBkaWdpdGFsIGJlZXAgZGV2aWNlICovCisJaW5wdXRfZGV2LT5uYW1lID0gIkhEQSBEaWdpdGFsIFBDQmVlcCI7CisJaW5wdXRfZGV2LT5waHlzID0gYmVlcC0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBjb2RlYy0+dmVuZG9yX2lkID4+IDE2OworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IGNvZGVjLT52ZW5kb3JfaWQgJiAweGZmZmY7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9TTkQpOworCWlucHV0X2Rldi0+c25kYml0WzBdID0gQklUX01BU0soU05EX0JFTEwpIHwgQklUX01BU0soU05EX1RPTkUpOworCWlucHV0X2Rldi0+ZXZlbnQgPSBzbmRfaGRhX2JlZXBfZXZlbnQ7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNvZGVjLT5idXMtPnBjaS0+ZGV2OworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgYmVlcCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCQlrZnJlZShiZWVwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBlbmFibGUgbGluZWFyIHNjYWxlICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQlBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMiwgMHgwMSk7CisKKwliZWVwLT5uaWQgPSBuaWQ7CisJYmVlcC0+ZGV2ID0gaW5wdXRfZGV2OworCWJlZXAtPmNvZGVjID0gY29kZWM7CisJY29kZWMtPmJlZXAgPSBiZWVwOworCisJSU5JVF9XT1JLKCZiZWVwLT5iZWVwX3dvcmssICZzbmRfaGRhX2dlbmVyYXRlX2JlZXApOworCXJldHVybiAwOworfQorCit2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZGFfYmVlcCAqYmVlcCA9IGNvZGVjLT5iZWVwOworCWlmIChiZWVwKSB7CisJCWNhbmNlbF93b3JrX3N5bmMoJmJlZXAtPmJlZXBfd29yayk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYmVlcC0+ZGV2KTsKKwkJa2ZyZWUoYmVlcCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDAzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIERpZ2l0YWwgQmVlcCBJbnB1dCBJbnRlcmZhY2UgZm9yIEhELWF1ZGlvIGNvZGVjCisgKgorICogQXV0aG9yOiBNYXR0aGV3IFJhbm9zdGF5IDxtcmFub3N0YXlAZW1iZWRkZWRhbGxleS5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zIEluYworICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19TT1VORF9IREFfQkVFUF9ICisjZGVmaW5lIF9fU09VTkRfSERBX0JFRVBfSAorCisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisKKy8qIGJlZXAgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBoZGFfYmVlcCB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCWNoYXIgcGh5c1szMl07CisJaW50IHRvbmU7CisJaW50IG5pZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmVlcF93b3JrOyAvKiBzY2hlZHVsZWQgdGFzayBmb3IgYmVlcCBldmVudCAqLworfTsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX0lOUFVUX0JFRVAKK2ludCBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG5pZCk7Cit2b2lkIHNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKKyNlbHNlCisjZGVmaW5lIHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKC4uLikKKyNkZWZpbmUgc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoLi4uKQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IGQyZTEwOTMuLjY0NDc3NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtOTQsNiArOTQsOSBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0NPREVDX1ZJQQogCXNuZF9oZGFfcHJlc2V0X3ZpYSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TTkRfSERBX0NPREVDX05WSERNSQorCXNuZF9oZGFfcHJlc2V0X252aGRtaSwKKyNlbmRpZgogCU5VTEwKIH07CiAKQEAgLTIxMSw3ICsyMTQsOCBAQAogCXVuc2lnbmVkIGludCBzaGlmdCwgbnVtX2VsZW1zLCBtYXNrOwogCWhkYV9uaWRfdCBwcmV2X25pZDsKIAotCXNuZF9hc3NlcnQoY29ubl9saXN0ICYmIG1heF9jb25ucyA+IDAsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighY29ubl9saXN0IHx8IG1heF9jb25ucyA8PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYXJtID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9DT05OTElTVF9MRU4pOwogCWlmIChwYXJtICYgQUNfQ0xJU1RfTE9ORykgewpAQCAtMzEzLDcgKzMxNyw3IEBACiB9CiAKIC8qCi0gKiBwcm9jZXNzIHF1ZXVldWQgdW5zb2xpY2l0ZWQgZXZlbnRzCisgKiBwcm9jZXNzIHF1ZXVlZCB1bnNvbGljaXRlZCBldmVudHMKICAqLwogc3RhdGljIHZvaWQgcHJvY2Vzc191bnNvbF9ldmVudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewpAQCAtNDA3LDggKzQxMSwxMCBAQAogCQkuZGV2X2ZyZWUgPSBzbmRfaGRhX2J1c19kZXZfZnJlZSwKIAl9OwogCi0Jc25kX2Fzc2VydCh0ZW1wLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCh0ZW1wLT5vcHMuY29tbWFuZCAmJiB0ZW1wLT5vcHMuZ2V0X3Jlc3BvbnNlLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXRlbXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc25kX0JVR19PTighdGVtcC0+b3BzLmNvbW1hbmQgfHwgIXRlbXAtPm9wcy5nZXRfcmVzcG9uc2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChidXNwKQogCQkqYnVzcCA9IE5VTEw7CkBAIC01ODUsMTEgKzU5MSwxMyBAQAogCQkJCXN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JY2hhciBjb21wb25lbnRbMTNdOworCWNoYXIgY29tcG9uZW50WzMxXTsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChidXMsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KGNvZGVjX2FkZHIgPD0gSERBX01BWF9DT0RFQ19BRERSRVNTLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWJ1cykpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKGNvZGVjX2FkZHIgPiBIREFfTUFYX0NPREVDX0FERFJFU1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChidXMtPmNhZGRyX3RibFtjb2RlY19hZGRyXSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKQEAgLTY4OCw3ICs2OTYsNyBAQAogCXNuZF9oZGFfY3JlYXRlX2h3ZGVwKGNvZGVjKTsKICNlbmRpZgogCi0Jc3ByaW50Zihjb21wb25lbnQsICJIREE6JTA4eCIsIGNvZGVjLT52ZW5kb3JfaWQpOworCXNwcmludGYoY29tcG9uZW50LCAiSERBOiUwOHgsJTA4eCwlMDh4IiwgY29kZWMtPnZlbmRvcl9pZCwgY29kZWMtPnN1YnN5c3RlbV9pZCwgY29kZWMtPnJldmlzaW9uX2lkKTsKIAlzbmRfY29tcG9uZW50X2FkZChjb2RlYy0+YnVzLT5jYXJkLCBjb21wb25lbnQpOwogCiAJaWYgKGNvZGVjcCkKQEAgLTk1NiwxNSArOTY0LDYgQEAKIH0KICNlbmRpZiAvKiBTTkRfSERBX05FRURTX1JFU1VNRSAqLwogCi0vKgotICogQU1QIGNvbnRyb2wgY2FsbGJhY2tzCi0gKi8KLS8qIHJldHJpZXZlIHBhcmFtZXRlcnMgZnJvbSBwcml2YXRlX3ZhbHVlICovCi0jZGVmaW5lIGdldF9hbXBfbmlkKGtjKQkJKChrYyktPnByaXZhdGVfdmFsdWUgJiAweGZmZmYpCi0jZGVmaW5lIGdldF9hbXBfY2hhbm5lbHMoa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDMpCi0jZGVmaW5lIGdldF9hbXBfZGlyZWN0aW9uKGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTgpICYgMHgxKQotI2RlZmluZSBnZXRfYW1wX2luZGV4KGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHhmKQotCiAvKiB2b2x1bWUgKi8KIGludCBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCkBAIC0xNDMwLDYgKzE0MjksMjkgQEAKIAlyZXR1cm4gc2JpdHM7CiB9CiAKKy8qIHNldCBkaWdpdGFsIGNvbnZlcnQgdmVyYnMgYm90aCBmb3IgdGhlIGdpdmVuIE5JRCBhbmQgaXRzIHNsYXZlcyAqLworc3RhdGljIHZvaWQgc2V0X2RpZ19vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQlpbnQgdmVyYiwgaW50IHZhbCkKK3sKKwloZGFfbmlkX3QgKmQ7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIHZlcmIsIHZhbCk7CisJZCA9IGNvZGVjLT5zbGF2ZV9kaWdfb3V0czsKKwlpZiAoIWQpCisJCXJldHVybjsKKwlmb3IgKDsgKmQ7IGQrKykKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgKmQsIDAsIHZlcmIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGlnX291dF9jb252ZXJ0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCSAgICAgICBpbnQgZGlnMSwgaW50IGRpZzIpCit7CisJaWYgKGRpZzEgIT0gLTEpCisJCXNldF9kaWdfb3V0KGNvZGVjLCBuaWQsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCBkaWcxKTsKKwlpZiAoZGlnMiAhPSAtMSkKKwkJc2V0X2RpZ19vdXQoY29kZWMsIG5pZCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzIsIGRpZzIpOworfQorCiBzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfZGVmYXVsdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKQEAgLTE0NDgsMTQgKzE0NzAsOCBAQAogCWNoYW5nZSA9IGNvZGVjLT5zcGRpZl9jdGxzICE9IHZhbDsKIAljb2RlYy0+c3BkaWZfY3RscyA9IHZhbDsKIAotCWlmIChjaGFuZ2UpIHsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCQkgIHZhbCAmIDB4ZmYpOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCSAgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzIsCi0JCQkJCSAgdmFsID4+IDgpOwotCX0KKwlpZiAoY2hhbmdlKQorCQlzZXRfZGlnX291dF9jb252ZXJ0KGNvZGVjLCBuaWQsIHZhbCAmIDB4ZmYsICh2YWwgPj4gOCkgJiAweGZmKTsKIAogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gY2hhbmdlOwpAQCAtMTQ4Nyw5ICsxNTAzLDcgQEAKIAljaGFuZ2UgPSBjb2RlYy0+c3BkaWZfY3RscyAhPSB2YWw7CiAJaWYgKGNoYW5nZSkgewogCQljb2RlYy0+c3BkaWZfY3RscyA9IHZhbDsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCQkgIHZhbCAmIDB4ZmYpOworCQlzZXRfZGlnX291dF9jb252ZXJ0KGNvZGVjLCBuaWQsIHZhbCAmIDB4ZmYsIC0xKTsKIAkJLyogdW5tdXRlIGFtcCBzd2l0Y2ggKGlmIGFueSkgKi8KIAkJaWYgKChnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX09VVF9BTVApICYmCiAJCSAgICAodmFsICYgQUNfRElHMV9FTkFCTEUpKQpAQCAtMjIzNiwxMSArMjI1MCwxMyBAQAogCWlmIChpbmZvLT5vcHMuY2xvc2UgPT0gTlVMTCkKIAkJaW5mby0+b3BzLmNsb3NlID0gaGRhX3BjbV9kZWZhdWx0X29wZW5fY2xvc2U7CiAJaWYgKGluZm8tPm9wcy5wcmVwYXJlID09IE5VTEwpIHsKLQkJc25kX2Fzc2VydChpbmZvLT5uaWQsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWluZm8tPm5pZCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaW5mby0+b3BzLnByZXBhcmUgPSBoZGFfcGNtX2RlZmF1bHRfcHJlcGFyZTsKIAl9CiAJaWYgKGluZm8tPm9wcy5jbGVhbnVwID09IE5VTEwpIHsKLQkJc25kX2Fzc2VydChpbmZvLT5uaWQsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIWluZm8tPm5pZCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaW5mby0+b3BzLmNsZWFudXAgPSBoZGFfcGNtX2RlZmF1bHRfY2xlYW51cDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yNTgzLDE0ICsyNTk5LDMxIEBACiAJCQkJIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLCB1bnNpZ25lZCBpbnQgZm9ybWF0KQogewogCS8qIHR1cm4gb2ZmIFNQRElGIG9uY2U7IG90aGVyd2lzZSB0aGUgSUVDOTU4IGJpdHMgd29uJ3QgYmUgdXBkYXRlZCAqLwotCWlmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCSAgICBjb2RlYy0+c3BkaWZfY3RscyAmIH5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYpOworCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKKwkJc2V0X2RpZ19vdXRfY29udmVydChjb2RlYywgbmlkLCAKKwkJCQkgICAgY29kZWMtPnNwZGlmX2N0bHMgJiB+QUNfRElHMV9FTkFCTEUgJiAweGZmLAorCQkJCSAgICAtMSk7CiAJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwlpZiAoY29kZWMtPnNsYXZlX2RpZ19vdXRzKSB7CisJCWhkYV9uaWRfdCAqZDsKKwkJZm9yIChkID0gY29kZWMtPnNsYXZlX2RpZ19vdXRzOyAqZDsgZCsrKQorCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsICpkLCBzdHJlYW1fdGFnLCAwLAorCQkJCQkJICAgZm9ybWF0KTsKKwl9CiAJLyogdHVybiBvbiBhZ2FpbiAoaWYgbmVlZGVkKSAqLwotCWlmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJCSAgICBjb2RlYy0+c3BkaWZfY3RscyAmIDB4ZmYpOworCWlmIChjb2RlYy0+c3BkaWZfc3RhdHVzX3Jlc2V0ICYmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKSkKKwkJc2V0X2RpZ19vdXRfY29udmVydChjb2RlYywgbmlkLAorCQkJCSAgICBjb2RlYy0+c3BkaWZfY3RscyAmIDB4ZmYsIC0xKTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9kaWdfb3V0X3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBuaWQpOworCWlmIChjb2RlYy0+c2xhdmVfZGlnX291dHMpIHsKKwkJaGRhX25pZF90ICpkOworCQlmb3IgKGQgPSBjb2RlYy0+c2xhdmVfZGlnX291dHM7ICpkOyBkKyspCisJCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCAqZCk7CisJfQogfQogCiAvKgpAQCAtMjYwMiw3ICsyNjM1LDcgQEAKIAltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwogCWlmIChtb3V0LT5kaWdfb3V0X3VzZWQgPT0gSERBX0RJR19BTkFMT0dfRFVQKQogCQkvKiBhbHJlYWR5IG9wZW5lZCBhcyBhbmFsb2cgZHVwOyByZXNldCBpdCBvbmNlICovCi0JCXNuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkKTsKKwkJY2xlYW51cF9kaWdfb3V0X3N0cmVhbShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQpOwogCW1vdXQtPmRpZ19vdXRfdXNlZCA9IEhEQV9ESUdfRVhDTFVTSVZFOwogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTI2OTcsNyArMjczMCw3IEBACiAJCQkJCSAgICAgc3RyZWFtX3RhZywgZm9ybWF0KTsKIAkJfSBlbHNlIHsKIAkJCW1vdXQtPmRpZ19vdXRfdXNlZCA9IDA7Ci0JCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCk7CisJCQljbGVhbnVwX2RpZ19vdXRfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCk7CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwpAQCAtMjc0OCw3ICsyNzgxLDcgQEAKIAkJCQkJCSAgICAgbW91dC0+ZXh0cmFfb3V0X25pZFtpXSk7CiAJbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlpZiAobW91dC0+ZGlnX291dF9uaWQgJiYgbW91dC0+ZGlnX291dF91c2VkID09IEhEQV9ESUdfQU5BTE9HX0RVUCkgewotCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCk7CisJCWNsZWFudXBfZGlnX291dF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkKTsKIAkJbW91dC0+ZGlnX291dF91c2VkID0gMDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwpAQCAtMjc1Niw3ICsyNzg5LDcgQEAKIH0KIAogLyoKLSAqIEhlbHBlciBmb3IgYXV0b21hdGljIHBpbmcgY29uZmlndXJhdGlvbgorICogSGVscGVyIGZvciBhdXRvbWF0aWMgcGluIGNvbmZpZ3VyYXRpb24KICAqLwogCiBzdGF0aWMgaW50IGlzX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGhkYV9uaWRfdCAqbGlzdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCmluZGV4IGVmYzY4MjguLjYwNDY4ZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaApAQCAtOTAsNiArOTAsMTQgQEAKICNkZWZpbmUgQUNfVkVSQl9HRVRfQ09ORklHX0RFRkFVTFQJCTB4MGYxYwogLyogZjIwOiBBRkcvTUZHICovCiAjZGVmaW5lIEFDX1ZFUkJfR0VUX1NVQlNZU1RFTV9JRAkJMHgwZjIwCisjZGVmaW5lIEFDX1ZFUkJfR0VUX0NWVF9DSEFOX0NPVU5UCQkweDBmMmQKKyNkZWZpbmUgQUNfVkVSQl9HRVRfSERNSV9ESVBfU0laRQkJMHgwZjJlCisjZGVmaW5lIEFDX1ZFUkJfR0VUX0hETUlfRUxERAkJCTB4MGYyZgorI2RlZmluZSBBQ19WRVJCX0dFVF9IRE1JX0RJUF9JTkRFWAkJMHgwZjMwCisjZGVmaW5lIEFDX1ZFUkJfR0VUX0hETUlfRElQX0RBVEEJCTB4MGYzMQorI2RlZmluZSBBQ19WRVJCX0dFVF9IRE1JX0RJUF9YTUlUCQkweDBmMzIKKyNkZWZpbmUgQUNfVkVSQl9HRVRfSERNSV9DUF9DVFJMCQkweDBmMzMKKyNkZWZpbmUgQUNfVkVSQl9HRVRfSERNSV9DSEFOX1NMT1QJCTB4MGYzNAogCiAvKgogICogU0VUIHZlcmJzCkBAIC0xMjEsNyArMTI5LDE0IEBACiAjZGVmaW5lIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzEJMHg3MWQKICNkZWZpbmUgQUNfVkVSQl9TRVRfQ09ORklHX0RFRkFVTFRfQllURVNfMgkweDcxZQogI2RlZmluZSBBQ19WRVJCX1NFVF9DT05GSUdfREVGQVVMVF9CWVRFU18zCTB4NzFmCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0VBUEQJCQkJMHg3ODgKICNkZWZpbmUgQUNfVkVSQl9TRVRfQ09ERUNfUkVTRVQJCQkweDdmZgorI2RlZmluZSBBQ19WRVJCX1NFVF9DVlRfQ0hBTl9DT1VOVAkJMHg3MmQKKyNkZWZpbmUgQUNfVkVSQl9TRVRfSERNSV9ESVBfSU5ERVgJCTB4NzMwCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0hETUlfRElQX0RBVEEJCTB4NzMxCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0hETUlfRElQX1hNSVQJCTB4NzMyCisjZGVmaW5lIEFDX1ZFUkJfU0VUX0hETUlfQ1BfQ1RSTAkJMHg3MzMKKyNkZWZpbmUgQUNfVkVSQl9TRVRfSERNSV9DSEFOX1NMT1QJCTB4NzM0CiAKIC8qCiAgKiBQYXJhbWV0ZXIgSURzCkBAIC0xNDMsNiArMTU4LDcgQEAKICNkZWZpbmUgQUNfUEFSX0dQSU9fQ0FQCQkJMHgxMQogI2RlZmluZSBBQ19QQVJfQU1QX09VVF9DQVAJCTB4MTIKICNkZWZpbmUgQUNfUEFSX1ZPTF9LTkJfQ0FQCQkweDEzCisjZGVmaW5lIEFDX1BBUl9IRE1JX0xQQ01fQ0FQCQkweDIwCiAKIC8qCiAgKiBBQ19WRVJCX1BBUkFNRVRFUlMgcmVzdWx0cyAoMzJiaXQpCkBAIC0xNzEsNiArMTg3LDggQEAKICNkZWZpbmUgQUNfV0NBUF9ESUdJVEFMCQkJKDE8PDkpCS8qIGRpZ2l0YWwgSS9PICovCiAjZGVmaW5lIEFDX1dDQVBfUE9XRVIJCQkoMTw8MTApCS8qIHBvd2VyIGNvbnRyb2wgKi8KICNkZWZpbmUgQUNfV0NBUF9MUl9TV0FQCQkJKDE8PDExKQkvKiBML1Igc3dhcCAqLworI2RlZmluZSBBQ19XQ0FQX0NQX0NBUFMJCQkoMTw8MTIpIC8qIGNvbnRlbnQgcHJvdGVjdGlvbiAqLworI2RlZmluZSBBQ19XQ0FQX0NIQU5fQ05UX0VYVAkJKDc8PDEzKQkvKiBjaGFubmVsIGNvdW50IGV4dCAqLwogI2RlZmluZSBBQ19XQ0FQX0RFTEFZCQkJKDB4Zjw8MTYpCiAjZGVmaW5lIEFDX1dDQVBfREVMQVlfU0hJRlQJCTE2CiAjZGVmaW5lIEFDX1dDQVBfVFlQRQkJCSgweGY8PDIwKQpAQCAtMjA2LDkgKzIyNCwyMCBAQAogLyogSW5wdXQgY29udmVydGVyIFNESSBzZWxlY3QgKi8KICNkZWZpbmUgQUNfU0RJX1NFTEVDVAkJCSgweGY8PDApCiAKLS8qIFVuc29saWNpdGVkIHJlc3BvbnNlICovCisvKiBVbnNvbGljaXRlZCByZXNwb25zZSBjb250cm9sICovCiAjZGVmaW5lIEFDX1VOU09MX1RBRwkJCSgweDNmPDwwKQogI2RlZmluZSBBQ19VTlNPTF9FTkFCTEVECQkoMTw8NykKKyNkZWZpbmUgQUNfVVNSU1BfRU4JCQlBQ19VTlNPTF9FTkFCTEVECisKKy8qIFVuc29saWNpdGVkIHJlc3BvbnNlcyAqLworI2RlZmluZSBBQ19VTlNPTF9SRVNfVEFHCQkoMHgzZjw8MjYpCisjZGVmaW5lIEFDX1VOU09MX1JFU19UQUdfU0hJRlQJCTI2CisjZGVmaW5lIEFDX1VOU09MX1JFU19TVUJUQUcJCSgweDFmPDwyMSkKKyNkZWZpbmUgQUNfVU5TT0xfUkVTX1NVQlRBR19TSElGVAkyMQorI2RlZmluZSBBQ19VTlNPTF9SRVNfRUxEVgkJKDE8PDEpCS8qIEVMRCBEYXRhIHZhbGlkIChmb3IgSERNSSkgKi8KKyNkZWZpbmUgQUNfVU5TT0xfUkVTX1BECQkJKDE8PDApCS8qIHBpbnNlbnNlIGRldGVjdCAqLworI2RlZmluZSBBQ19VTlNPTF9SRVNfQ1BfU1RBVEUJCSgxPDwxKQkvKiBjb250ZW50IHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQUNfVU5TT0xfUkVTX0NQX1JFQURZCQkoMTw8MCkJLyogY29udGVudCBwcm90ZWN0aW9uICovCiAKIC8qIFBpbiB3aWRnZXQgY2FwYWJpbGllcyAqLwogI2RlZmluZSBBQ19QSU5DQVBfSU1QX1NFTlNFCQkoMTw8MCkJLyogaW1wZWRhbmNlIHNlbnNlIGNhcGFibGUgKi8KQEAgLTIyMiw2ICsyNTEsMTAgQEAKICAqICAgICAgIGJ1dCBpcyBtYXJrZWQgcmVzZXJ2ZWQgaW4gdGhlIEludGVsIEhEQSBzcGVjaWZpY2F0aW9uLgogICovCiAjZGVmaW5lIEFDX1BJTkNBUF9MUl9TV0FQCQkoMTw8NykJLyogTC9SIHN3YXAgKi8KKy8qIE5vdGU6IFRoZSBzYW1lIGJpdCBhcyBMUl9TV0FQIGlzIG5ld2x5IGRlZmluZWQgYXMgSERNSSBjYXBhYmlsaXR5CisgKiAgICAgICBpbiBIRC1hdWRpbyBzcGVjaWZpY2F0aW9uCisgKi8KKyNkZWZpbmUgQUNfUElOQ0FQX0hETUkJCQkoMTw8NykJLyogSERNSSBwaW4gKi8KICNkZWZpbmUgQUNfUElOQ0FQX1ZSRUYJCQkoMHgzNzw8OCkKICNkZWZpbmUgQUNfUElOQ0FQX1ZSRUZfU0hJRlQJCTgKICNkZWZpbmUgQUNfUElOQ0FQX0VBUEQJCQkoMTw8MTYpCS8qIEVBUEQgY2FwYWJsZSAqLwpAQCAtMjcyLDYgKzMwNSwyMiBAQAogI2RlZmluZSBBQ19LTkJDQVBfTlVNX1NURVBTCQkoMHg3Zjw8MCkKICNkZWZpbmUgQUNfS05CQ0FQX0RFTFRBCQkJKDE8PDcpCiAKKy8qIEhETUkgTFBDTSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF80OEtfQ1BfQ0hOUwkJKDB4MGY8PDApIC8qIG1heCBjaGFubmVscyB3LyBDUC1vbiAqLwkKKyNkZWZpbmUgQUNfTFBDTUNBUF80OEtfTk9fQ0hOUwkJKDB4MGY8PDQpIC8qIG1heCBjaGFubmVscyB3L28gQ1Atb24gKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF80OEtfMjBCSVQJCSgxPDw4KQkvKiAyMGIgYml0cmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF80OEtfMjRCSVQJCSgxPDw5KQkvKiAyNGIgYml0cmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF85NktfQ1BfQ0hOUwkJKDB4MGY8PDEwKSAvKiBtYXggY2hhbm5lbHMgdy8gQ1Atb24gKi8JCisjZGVmaW5lIEFDX0xQQ01DQVBfOTZLX05PX0NITlMJCSgweDBmPDwxNCkgLyogbWF4IGNoYW5uZWxzIHcvbyBDUC1vbiAqLworI2RlZmluZSBBQ19MUENNQ0FQXzk2S18yMEJJVAkJKDE8PDE4KQkvKiAyMGIgYml0cmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF85NktfMjRCSVQJCSgxPDwxOSkJLyogMjRiIGJpdHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lIEFDX0xQQ01DQVBfMTkyS19DUF9DSE5TCQkoMHgwZjw8MjApIC8qIG1heCBjaGFubmVscyB3LyBDUC1vbiAqLwkKKyNkZWZpbmUgQUNfTFBDTUNBUF8xOTJLX05PX0NITlMJCSgweDBmPDwyNCkgLyogbWF4IGNoYW5uZWxzIHcvbyBDUC1vbiAqLworI2RlZmluZSBBQ19MUENNQ0FQXzE5MktfMjBCSVQJCSgxPDwyOCkJLyogMjBiIGJpdHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lIEFDX0xQQ01DQVBfMTkyS18yNEJJVAkJKDE8PDI5KQkvKiAyNGIgYml0cmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQUNfTFBDTUNBUF80NEsJCQkoMTw8MzApCS8qIDQ0LjFrSHogc3VwcG9ydCAqLworI2RlZmluZSBBQ19MUENNQ0FQXzQ0S19NUwkJKDE8PDMxKQkvKiA0NC4xa0h6LW11bHRpcGxpZXMgc3VwcG9ydCAqLworCiAvKgogICogQ29udHJvbCBQYXJhbWV0ZXJzCiAgKi8KQEAgLTMxNywxOCArMzY2LDQ0IEBACiAjZGVmaW5lIEFDX1BJTkNUTF9PVVRfRU4JCSgxPDw2KQogI2RlZmluZSBBQ19QSU5DVExfSFBfRU4JCQkoMTw8NykKIAotLyogVW5zb2xpY2l0ZWQgcmVzcG9uc2UgLSA4Yml0ICovCi0jZGVmaW5lIEFDX1VTUlNQX0VOCQkJKDE8PDcpCi0KIC8qIFBpbiBzZW5zZSAtIDMyYml0ICovCiAjZGVmaW5lIEFDX1BJTlNFTlNFX0lNUEVEQU5DRV9NQVNLCSgweDdmZmZmZmZmKQogI2RlZmluZSBBQ19QSU5TRU5TRV9QUkVTRU5DRQkJKDE8PDMxKQorI2RlZmluZSBBQ19QSU5TRU5TRV9FTERWCQkoMTw8MzApCS8qIEVMRCB2YWxpZCAoSERNSSkgKi8KIAogLyogRUFQRC9CVEwgZW5hYmxlIC0gMzJiaXQgKi8KICNkZWZpbmUgQUNfRUFQREJUTF9CQUxBTkNFRAkJKDE8PDApCiAjZGVmaW5lIEFDX0VBUERCVExfRUFQRAkJCSgxPDwxKQogI2RlZmluZSBBQ19FQVBEQlRMX0xSX1NXQVAJCSgxPDwyKQogCisvKiBIRE1JIEVMRCBkYXRhICovCisjZGVmaW5lIEFDX0VMRERfRUxEX1ZBTElECQkoMTw8MzEpCisjZGVmaW5lIEFDX0VMRERfRUxEX0RBVEEJCTB4ZmYKKworLyogSERNSSBESVAgc2l6ZSAqLworI2RlZmluZSBBQ19ESVBTSVpFX0VMRF9CVUYJCSgxPDwzKSAvKiBFTEQgYnVmIHNpemUgb2YgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgQUNfRElQU0laRV9QQUNLX0lEWAkJKDB4MDc8PDApIC8qIHBhY2tldCBpbmRleCAqLworCisvKiBIRE1JIERJUCBpbmRleCAqLworI2RlZmluZSBBQ19ESVBJRFhfUEFDS19JRFgJCSgweDA3PDw1KSAvKiBwYWNrZXQgaWRuZXggKi8KKyNkZWZpbmUgQUNfRElQSURYX0JZVEVfSURYCQkoMHgxZjw8MCkgLyogYnl0ZSBpbmRleCAqLworCisvKiBIRE1JIERJUCB4bWl0ICh0cmFuc21pdCkgY29udHJvbCAqLworI2RlZmluZSBBQ19ESVBYTUlUX01BU0sJCQkoMHgzPDw2KQorI2RlZmluZSBBQ19ESVBYTUlUX0RJU0FCTEUJCSgweDA8PDYpIC8qIGRpc2FibGUgeG1pdCAqLworI2RlZmluZSBBQ19ESVBYTUlUX09OQ0UJCQkoMHgyPDw2KSAvKiB4bWl0IG9uY2UgdGhlbiBkaXNhYmxlICovCisjZGVmaW5lIEFDX0RJUFhNSVRfQkVTVAkJCSgweDM8PDYpIC8qIGJlc3QgZWZmb3J0ICovCisKKy8qIEhETUkgY29udGVudCBwcm90ZWN0aW9uIChDUCkgY29udHJvbCAqLworI2RlZmluZSBBQ19DUENUUkxfQ0VTCQkJKDE8PDkpIC8qIGN1cnJlbnQgZW5jcnlwdGlvbiBzdGF0ZSAqLworI2RlZmluZSBBQ19DUENUUkxfUkVBRFkJCQkoMTw8OCkgLyogcmVhZHkgYml0ICovCisjZGVmaW5lIEFDX0NQQ1RSTF9TVUJUQUcJCSgweDFmPDwzKSAvKiBzdWJ0YWcgZm9yIHVuc29sLXJlc3AgKi8KKyNkZWZpbmUgQUNfQ1BDVFJMX1NUQVRFCQkJKDM8PDApIC8qIGN1cnJlbnQgQ1AgcmVxdWVzdCBzdGF0ZSAqLworCisvKiBDb252ZXJ0ZXIgY2hhbm5lbCA8LT4gSERNSSBzbG90IG1hcHBpbmcgKi8KKyNkZWZpbmUgQUNfQ1ZUTUFQX0hETUlfU0xPVAkJKDB4Zjw8MCkgLyogSERNSSBzbG90IG51bWJlciAqLworI2RlZmluZSBBQ19DVlRNQVBfQ0hBTgkJCSgweGY8PDQpIC8qIGNvbnZlcnRlciBjaGFubmVsIG51bWJlciAqLworCiAvKiBjb25maWd1cmF0aW9uIGRlZmF1bHQgLSAzMmJpdCAqLwogI2RlZmluZSBBQ19ERUZDRkdfU0VRVUVOQ0UJCSgweGY8PDApCiAjZGVmaW5lIEFDX0RFRkNGR19ERUZfQVNTT0MJCSgweGY8PDQpCkBAIC00NDksNiArNTI0LDcgQEAKICAqLwogCiBzdHJ1Y3QgaGRhX2J1czsKK3N0cnVjdCBoZGFfYmVlcDsKIHN0cnVjdCBoZGFfY29kZWM7CiBzdHJ1Y3QgaGRhX3BjbTsKIHN0cnVjdCBoZGFfcGNtX3N0cmVhbTsKQEAgLTYzNCw2ICs3MTAsOSBAQAogCS8qIGNvZGVjIHNwZWNpZmljIGluZm8gKi8KIAl2b2lkICpzcGVjOwogCisJLyogYmVlcCBkZXZpY2UgKi8KKwlzdHJ1Y3QgaGRhX2JlZXAgKmJlZXA7CisKIAkvKiB3aWRnZXQgY2FwYWJpbGl0aWVzIGNhY2hlICovCiAJdW5zaWduZWQgaW50IG51bV9ub2RlczsKIAloZGFfbmlkX3Qgc3RhcnRfbmlkOwpAQCAtNjQ2LDkgKzcyNSwxNSBAQAogCXVuc2lnbmVkIGludCBzcGRpZl9zdGF0dXM7CS8qIElFQzk1OCBzdGF0dXMgYml0cyAqLwogCXVuc2lnbmVkIHNob3J0IHNwZGlmX2N0bHM7CS8qIFNQRElGIGNvbnRyb2wgYml0cyAqLwogCXVuc2lnbmVkIGludCBzcGRpZl9pbl9lbmFibGU7CS8qIFNQRElGIGlucHV0IGVuYWJsZT8gKi8KKwloZGFfbmlkX3QgKnNsYXZlX2RpZ19vdXRzOyAvKiBvcHRpb25hbCBkaWdpdGFsIG91dCBzbGF2ZSB3aWRnZXRzICovCiAKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsJLyogYXNzaWduZWQgaHdkZXAgZGV2aWNlICovCiAKKwkvKiBtaXNjIGZsYWdzICovCisJdW5zaWduZWQgaW50IHNwZGlmX3N0YXR1c19yZXNldCA6MTsgLyogbmVlZHMgdG8gdG9nZ2xlIFNQRElGIGZvciBlYWNoCisJCQkJCSAgICAgKiBzdGF0dXMgY2hhbmdlCisJCQkJCSAgICAgKiAoZS5nLiBSZWFsdGVrIGNvZGVjcykKKwkJCQkJICAgICAqLwogI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIAl1bnNpZ25lZCBpbnQgcG93ZXJfb24gOjE7CS8qIGN1cnJlbnQgKGdsb2JhbCkgcG93ZXItc3RhdGUgKi8KIAl1bnNpZ25lZCBpbnQgcG93ZXJfdHJhbnNpdGlvbiA6MTsgLyogcG93ZXItc3RhdGUgaW4gdHJhbnNpdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCmluZGV4IDU5ZTQzODkuLjBjYTMwODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKQEAgLTE3NCw3ICsxNzQsOCBAQAogCWludCBpLCBub2RlcywgZXJyOwogCWhkYV9uaWRfdCBuaWQ7CiAKLQlzbmRfYXNzZXJ0KHNwZWMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighc3BlYykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc3BlYy0+ZGVmX2FtcF9vdXRfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX0FNUF9PVVRfQ0FQKTsKIAlzcGVjLT5kZWZfYW1wX2luX2NhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIEFDX1BBUl9BTVBfSU5fQ0FQKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IDFjNTNlMzMuLjlmMzE2YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMjIyLDkgKzIyMiw5IEBACiAjZGVmaW5lIFJJUkJfSU5UX09WRVJSVU4JMHgwNAogI2RlZmluZSBSSVJCX0lOVF9NQVNLCQkweDA1CiAKLS8qIFNUQVRFU1RTIGludCBtYXNrOiBTRDIsU0QxLFNEMCAqLwotI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJMwotI2RlZmluZSBTVEFURVNUU19JTlRfTUFTSwkweDA3CisvKiBTVEFURVNUUyBpbnQgbWFzazogUzMsU0QyLFNEMSxTRDAgKi8KKyNkZWZpbmUgQVpYX01BWF9DT0RFQ1MJCTQKKyNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJMHgwZgogCiAvKiBTRF9DVEwgYml0cyAqLwogI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLwpAQCAtMjg2LDYgKzI4NiwxMSBAQAogI2RlZmluZSBJTlRFTF9TQ0hfSERBX0RFVkMgICAgICAweDc4CiAjZGVmaW5lIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QICAgICAgICgweDE8PDExKQogCisvKiBEZWZpbmUgSU4gc3RyZWFtIDAgRklGTyBzaXplIG9mZnNldCBpbiBWSUEgY29udHJvbGxlciAqLworI2RlZmluZSBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUCTB4OTAKKy8qIERlZmluZSBWSUEgSEQgQXVkaW8gRGV2aWNlIElEKi8KKyNkZWZpbmUgVklBX0hEQUNfREVWSUNFX0lECQkweDMyODgKKwogCiAvKgogICovCkBAIC0zMTcsNiArMzIyLDEyIEBACiAJdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7CiAJdW5zaWduZWQgaW50IGlycV9wZW5kaW5nIDoxOwogCXVuc2lnbmVkIGludCBpcnFfaWdub3JlIDoxOworCS8qCisJICogRm9yIFZJQToKKwkgKiAgQSBmbGFnIHRvIGVuc3VyZSBETUEgcG9zaXRpb24gaXMgMAorCSAqICB3aGVuIGxpbmsgcG9zaXRpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiBGSUZPIHNpemUKKwkgKi8KKwl1bnNpZ25lZCBpbnQgaW5zdWZmaWNpZW50IDoxOwogfTsKIAogLyogQ09SQi9SSVJCICovCkBAIC0zNzksNiArMzkwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcG9sbGluZ19tb2RlIDoxOwogCXVuc2lnbmVkIGludCBtc2kgOjE7CiAJdW5zaWduZWQgaW50IGlycV9wZW5kaW5nX3dhcm5lZCA6MTsKKwl1bnNpZ25lZCBpbnQgdmlhX2RtYXBvc19wYXRjaCA6MTsgLyogZW5hYmxlIERNQS1wb3NpdGlvbiBmaXggZm9yIFZJQSAqLwogCiAJLyogZm9yIGRlYnVnZ2luZyAqLwogCXVuc2lnbmVkIGludCBsYXN0X2NtZDsJLyogbGFzdCBpc3N1ZWQgY29tbWFuZCAodG8gc3luYykgKi8KQEAgLTM5OCw2ICs0MTAsNyBAQAogCUFaWF9EUklWRVJfVUxJLAogCUFaWF9EUklWRVJfTlZJRElBLAogCUFaWF9EUklWRVJfVEVSQSwKKwlBWlhfTlVNX0RSSVZFUlMsIC8qIGtlZXAgdGhpcyBhcyBsYXN0IGVudHJ5ICovCiB9OwogCiBzdGF0aWMgY2hhciAqZHJpdmVyX3Nob3J0X25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKQEAgLTgxOCw2ICs4MzEsMTEgQEAKIC8qIHN0YXJ0IGEgc3RyZWFtICovCiBzdGF0aWMgdm9pZCBhenhfc3RyZWFtX3N0YXJ0KHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQogeworCS8qCisJICogQmVmb3JlIHN0cmVhbSBzdGFydCwgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIKKwkgKi8KKwlhenhfZGV2LT5pbnN1ZmZpY2llbnQgPSAxOworCiAJLyogZW5hYmxlIFNJRSAqLwogCWF6eF93cml0ZWIoY2hpcCwgSU5UQ1RMLAogCQkgICBhenhfcmVhZGIoY2hpcCwgSU5UQ1RMKSB8ICgxIDw8IGF6eF9kZXYtPmluZGV4KSk7CkBAIC05OTgsNyArMTAxNiw2IEBACiAJCSAgICAgIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LCB1MzIgKipiZGxwLAogCQkgICAgICBpbnQgb2ZzLCBpbnQgc2l6ZSwgaW50IHdpdGhfaW9jKQogewotCXN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1ZiA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7CiAJdTMyICpiZGwgPSAqYmRscDsKIAogCXdoaWxlIChzaXplID4gMCkgewpAQCAtMTAwOCwxNCArMTAyNSwxMiBAQAogCQlpZiAoYXp4X2Rldi0+ZnJhZ3MgPj0gQVpYX01BWF9CRExfRU5UUklFUykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWFkZHIgPSBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHNnYnVmLCBvZnMpOworCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CiAJCS8qIHByb2dyYW0gdGhlIGFkZHJlc3MgZmllbGQgb2YgdGhlIEJETCBlbnRyeSAqLwogCQliZGxbMF0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOwogCQliZGxbMV0gPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGFkZHIpKTsKIAkJLyogcHJvZ3JhbSB0aGUgc2l6ZSBmaWVsZCBvZiB0aGUgQkRMIGVudHJ5ICovCi0JCWNodW5rID0gUEFHRV9TSVpFIC0gKG9mcyAlIFBBR0VfU0laRSk7Ci0JCWlmIChzaXplIDwgY2h1bmspCi0JCQljaHVuayA9IHNpemU7CisJCWNodW5rID0gc25kX3BjbV9zZ2J1Zl9nZXRfY2h1bmtfc2l6ZShzdWJzdHJlYW0sIG9mcywgc2l6ZSk7CiAJCWJkbFsyXSA9IGNwdV90b19sZTMyKGNodW5rKTsKIAkJLyogcHJvZ3JhbSB0aGUgSU9DIHRvIGVuYWJsZSBpbnRlcnJ1cHQKIAkJICogb25seSB3aGVuIHRoZSB3aG9sZSBmcmFnbWVudCBpcyBwcm9jZXNzZWQKQEAgLTExNTEsNyArMTE2Niw4IEBACiAKIAkvKiBlbmFibGUgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwogCWlmIChjaGlwLT5wb3NpdGlvbl9maXggPT0gUE9TX0ZJWF9QT1NCVUYgfHwKLQkgICAgY2hpcC0+cG9zaXRpb25fZml4ID09IFBPU19GSVhfQVVUTykgeworCSAgICBjaGlwLT5wb3NpdGlvbl9maXggPT0gUE9TX0ZJWF9BVVRPIHx8CisJICAgIGNoaXAtPnZpYV9kbWFwb3NfcGF0Y2gpIHsKIAkJaWYgKCEoYXp4X3JlYWRsKGNoaXAsIERQTEJBU0UpICYgSUNINl9EUExCQVNFX0VOQUJMRSkpCiAJCQlhenhfd3JpdGVsKGNoaXAsIERQTEJBU0UsCiAJCQkJKHUzMiljaGlwLT5wb3NidWYuYWRkciB8IElDSDZfRFBMQkFTRV9FTkFCTEUpOwpAQCAtMTE2OSwyMyArMTE4NSwyNiBAQAogICogQ29kZWMgaW5pdGlhbGl6YXRpb24KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGF6eF9tYXhfY29kZWNzW10gX19kZXZpbml0ZGF0YSA9IHsKLQlbQVpYX0RSSVZFUl9JQ0hdID0gNCwJCS8qIFNvbWUgSUNIOSBib2FyZHMgdXNlIFNEMyAqLwotCVtBWlhfRFJJVkVSX1NDSF0gPSAzLAotCVtBWlhfRFJJVkVSX0FUSV0gPSA0LAotCVtBWlhfRFJJVkVSX0FUSUhETUldID0gNCwKLQlbQVpYX0RSSVZFUl9WSUFdID0gMywJCS8qIEZJWE1FOiBjb3JyZWN0PyAqLwotCVtBWlhfRFJJVkVSX1NJU10gPSAzLAkJLyogRklYTUU6IGNvcnJlY3Q/ICovCi0JW0FaWF9EUklWRVJfVUxJXSA9IDMsCQkvKiBGSVhNRTogY29ycmVjdD8gKi8KLQlbQVpYX0RSSVZFUl9OVklESUFdID0gMywJLyogRklYTUU6IGNvcnJlY3Q/ICovCisvKiBudW1iZXIgb2YgY29kZWMgc2xvdHMgZm9yIGVhY2ggY2hpcHNldDogMCA9IGRlZmF1bHQgc2xvdHMgKGkuZS4gNCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X21heF9jb2RlY3NbQVpYX05VTV9EUklWRVJTXSBfX2RldmluaXRkYXRhID0gewogCVtBWlhfRFJJVkVSX1RFUkFdID0gMSwKIH07CiAKKy8qIG51bWJlciBvZiBzbG90cyB0byBwcm9iZSBhcyBkZWZhdWx0CisgKiB0aGlzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBhenhfbWF4X2NvZGVjc1tdIC0tIGUuZy4gc29tZSBib2FyZHMKKyAqIHJlcG9ydCB3cm9uZ2x5IHRoZSBub24tZXhpc3RpbmcgNHRoIHNsb3QgYXZhaWxhYmlsaXR5CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2RlZmF1bHRfY29kZWNzW0FaWF9OVU1fRFJJVkVSU10gX19kZXZpbml0ZGF0YSA9IHsKKwlbQVpYX0RSSVZFUl9JQ0hdID0gMywKKwlbQVpYX0RSSVZFUl9BVEldID0gMywKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF6eF9jb2RlY19jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGNvZGVjX3Byb2JlX21hc2spCiB7CiAJc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgYnVzX3RlbXA7CiAJaW50IGMsIGNvZGVjcywgYXVkaW9fY29kZWNzLCBlcnI7CisJaW50IGRlZl9zbG90cywgbWF4X3Nsb3RzOwogCiAJbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7CiAJYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKQEAgLTEyMDEsOCArMTIyMCwxNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKGNoaXAtPmRyaXZlcl90eXBlID09IEFaWF9EUklWRVJfTlZJRElBKQorCQljaGlwLT5idXMtPm5lZWRzX2RhbW5fbG9uZ19kZWxheSA9IDE7CisKIAljb2RlY3MgPSBhdWRpb19jb2RlY3MgPSAwOwotCWZvciAoYyA9IDA7IGMgPCBBWlhfTUFYX0NPREVDUzsgYysrKSB7CisJbWF4X3Nsb3RzID0gYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdOworCWlmICghbWF4X3Nsb3RzKQorCQltYXhfc2xvdHMgPSBBWlhfTUFYX0NPREVDUzsKKwlkZWZfc2xvdHMgPSBhenhfZGVmYXVsdF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdOworCWlmICghZGVmX3Nsb3RzKQorCQlkZWZfc2xvdHMgPSBtYXhfc2xvdHM7CisJZm9yIChjID0gMDsgYyA8IGRlZl9zbG90czsgYysrKSB7CiAJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNvZGVjX3Byb2JlX21hc2spIHsKIAkJCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwogCQkJZXJyID0gc25kX2hkYV9jb2RlY19uZXcoY2hpcC0+YnVzLCBjLCAmY29kZWMpOwpAQCAtMTIxNSw3ICsxMjQzLDcgQEAKIAl9CiAJaWYgKCFhdWRpb19jb2RlY3MpIHsKIAkJLyogcHJvYmUgYWRkaXRpb25hbCBzbG90cyBpZiBubyBjb2RlYyBpcyBmb3VuZCAqLwotCQlmb3IgKDsgYyA8IGF6eF9tYXhfY29kZWNzW2NoaXAtPmRyaXZlcl90eXBlXTsgYysrKSB7CisJCWZvciAoOyBjIDwgbWF4X3Nsb3RzOyBjKyspIHsKIAkJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIGNvZGVjX3Byb2JlX21hc2spIHsKIAkJCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsIE5VTEwpOwogCQkJCWlmIChlcnIgPCAwKQpAQCAtMTUwNywxMyArMTUzNSw3MSBAQAogCXJldHVybiAwOwogfQogCisvKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdpdGggY29ycmVjdGlvbiBvbiBWSUEgY2hpcHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X3ZpYV9nZXRfcG9zaXRpb24oc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkJIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KQoreworCXVuc2lnbmVkIGludCBsaW5rX3BvcywgbWluaV9wb3MsIGJvdW5kX3BvczsKKwl1bnNpZ25lZCBpbnQgbW9kX2xpbmtfcG9zLCBtb2RfZG1hX3BvcywgbW9kX21pbmlfcG9zOworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CisKKwlsaW5rX3BvcyA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9MUElCKTsKKwlpZiAoYXp4X2Rldi0+aW5kZXggPj0gNCkgeworCQkvKiBQbGF5YmFjaywgbm8gcHJvYmxlbSB1c2luZyBsaW5rIHBvc2l0aW9uICovCisJCXJldHVybiBsaW5rX3BvczsKKwl9CisKKwkvKiBDYXB0dXJlICovCisJLyogRm9yIG5ldyBjaGlwc2V0LAorCSAqIHVzZSBtb2QgdG8gZ2V0IHRoZSBETUEgcG9zaXRpb24ganVzdCBsaWtlIG9sZCBjaGlwc2V0CisJICovCisJbW9kX2RtYV9wb3MgPSBsZTMyX3RvX2NwdSgqYXp4X2Rldi0+cG9zYnVmKTsKKwltb2RfZG1hX3BvcyAlPSBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisKKwkvKiBhenhfZGV2LT5maWZvX3NpemUgY2FuJ3QgZ2V0IEZJRk8gc2l6ZSBvZiBpbiBzdHJlYW0uCisJICogR2V0IGZyb20gYmFzZSBhZGRyZXNzICsgb2Zmc2V0LgorCSAqLworCWZpZm9fc2l6ZSA9IHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBWSUFfSU5fU1RSRUFNMF9GSUZPX1NJWkVfT0ZGU0VUKTsKKworCWlmIChhenhfZGV2LT5pbnN1ZmZpY2llbnQpIHsKKwkJLyogTGluayBwb3NpdGlvbiBuZXZlciBnYXRoZXIgdGhhbiBGSUZPIHNpemUgKi8KKwkJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJCXJldHVybiAwOworCisJCWF6eF9kZXYtPmluc3VmZmljaWVudCA9IDA7CisJfQorCisJaWYgKGxpbmtfcG9zIDw9IGZpZm9fc2l6ZSkKKwkJbWluaV9wb3MgPSBhenhfZGV2LT5idWZzaXplICsgbGlua19wb3MgLSBmaWZvX3NpemU7CisJZWxzZQorCQltaW5pX3BvcyA9IGxpbmtfcG9zIC0gZmlmb19zaXplOworCisJLyogRmluZCBuZWFyZXN0IHByZXZpb3VzIGJvdWRhcnkgKi8KKwltb2RfbWluaV9wb3MgPSBtaW5pX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwltb2RfbGlua19wb3MgPSBsaW5rX3BvcyAlIGF6eF9kZXYtPnBlcmlvZF9ieXRlczsKKwlpZiAobW9kX2xpbmtfcG9zID49IGZpZm9fc2l6ZSkKKwkJYm91bmRfcG9zID0gbGlua19wb3MgLSBtb2RfbGlua19wb3M7CisJZWxzZSBpZiAobW9kX2RtYV9wb3MgPj0gbW9kX21pbmlfcG9zKQorCQlib3VuZF9wb3MgPSBtaW5pX3BvcyAtIG1vZF9taW5pX3BvczsKKwllbHNlIHsKKwkJYm91bmRfcG9zID0gbWluaV9wb3MgLSBtb2RfbWluaV9wb3MgKyBhenhfZGV2LT5wZXJpb2RfYnl0ZXM7CisJCWlmIChib3VuZF9wb3MgPj0gYXp4X2Rldi0+YnVmc2l6ZSkKKwkJCWJvdW5kX3BvcyA9IDA7CisJfQorCisJLyogQ2FsY3VsYXRlIHJlYWwgRE1BIHBvc2l0aW9uIHdlIHdhbnQgKi8KKwlyZXR1cm4gYm91bmRfcG9zICsgbW9kX2RtYV9wb3M7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXp4X2dldF9wb3NpdGlvbihzdHJ1Y3QgYXp4ICpjaGlwLAogCQkJCSAgICAgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCiB7CiAJdW5zaWduZWQgaW50IHBvczsKIAotCWlmIChjaGlwLT5wb3NpdGlvbl9maXggPT0gUE9TX0ZJWF9QT1NCVUYgfHwKLQkgICAgY2hpcC0+cG9zaXRpb25fZml4ID09IFBPU19GSVhfQVVUTykgeworCWlmIChjaGlwLT52aWFfZG1hcG9zX3BhdGNoKQorCQlwb3MgPSBhenhfdmlhX2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KTsKKwllbHNlIGlmIChjaGlwLT5wb3NpdGlvbl9maXggPT0gUE9TX0ZJWF9QT1NCVUYgfHwKKwkJIGNoaXAtPnBvc2l0aW9uX2ZpeCA9PSBQT1NfRklYX0FVVE8pIHsKIAkJLyogdXNlIHRoZSBwb3NpdGlvbiBidWZmZXIgKi8KIAkJcG9zID0gbGUzMl90b19jcHUoKmF6eF9kZXYtPnBvc2J1Zik7CiAJfSBlbHNlIHsKQEAgLTE1NTksNiArMTY0NSw4IEBACiAJCQljaGlwLT5wb3NpdGlvbl9maXggPSBQT1NfRklYX1BPU0JVRjsKIAl9CiAKKwlpZiAoIWJkbF9wb3NfYWRqW2NoaXAtPmRldl9pbmRleF0pCisJCXJldHVybiAxOyAvKiBubyBkZWxheWVkIGFjayAqLwogCWlmIChwb3MgJSBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgPiBhenhfZGV2LT5wZXJpb2RfYnl0ZXMgLyAyKQogCQlyZXR1cm4gMDsgLyogTkcgLSBpdCdzIGJlbG93IHRoZSBwZXJpb2QgYm91bmRhcnkgKi8KIAlyZXR1cm4gMTsgLyogT0ssIGl0J3MgZmluZSAqLwpAQCAtMTY0Niw3ICsxNzM0LDggQEAKIAlpZiAoIWNwY20tPnN0cmVhbVswXS5zdWJzdHJlYW1zICYmICFjcGNtLT5zdHJlYW1bMV0uc3Vic3RyZWFtcykKIAkJcmV0dXJuIDA7CiAKLQlzbmRfYXNzZXJ0KGNwY20tPm5hbWUsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighY3BjbS0+bmFtZSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgY3BjbS0+bmFtZSwgY3BjbS0+ZGV2aWNlLAogCQkJICBjcGNtLT5zdHJlYW1bMF0uc3Vic3RyZWFtcywKQEAgLTE2NzAsNyArMTc1OSw3IEBACiAJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJmF6eF9wY21fb3BzKTsKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAogCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCSAgICAgIDEwMjQgKiA2NCwgMTAyNCAqIDEwMjQpOworCQkJCQkgICAgICAxMDI0ICogNjQsIDMyICogMTAyNCAqIDEwMjQpOwogCWNoaXAtPnBjbVtjcGNtLT5kZXZpY2VdID0gcGNtOwogCXJldHVybiAwOwogfQpAQCAtMTk0Niw2ICsyMDM1LDE1IEBACiB7CiAJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnE7CiAKKwkvKiBDaGVjayBWSUEgSEQgQXVkaW8gQ29udHJvbGxlciBleGlzdCAqLworCWlmIChjaGlwLT5wY2ktPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1ZJQSAmJgorCSAgICBjaGlwLT5wY2ktPmRldmljZSA9PSBWSUFfSERBQ19ERVZJQ0VfSUQpIHsKKwkJY2hpcC0+dmlhX2RtYXBvc19wYXRjaCA9IDE7CisJCS8qIFVzZSBsaW5rIHBvc2l0aW9uIGRpcmVjdGx5LCBhdm9pZCBhbnkgdHJhbnNmZXIgcHJvYmxlbS4gKi8KKwkJcmV0dXJuIFBPU19GSVhfTFBJQjsKKwl9CisJY2hpcC0+dmlhX2RtYXBvc19wYXRjaCA9IDA7CisKIAlpZiAoZml4ID09IFBPU19GSVhfQVVUTykgewogCQlxID0gc25kX3BjaV9xdWlya19sb29rdXAoY2hpcC0+cGNpLCBwb3NpdGlvbl9maXhfbGlzdCk7CiAJCWlmIChxKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAppbmRleCA1YzllNTc4Li43OTU3ZmVmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKQEAgLTM2OCwxMiArMzY4LDE1IEBACiAjZGVmaW5lIEFNUF9PVVRfVU5NVVRFCTB4YjAwMAogI2RlZmluZSBBTVBfT1VUX1pFUk8JMHhiMDAwCiAvKiBwaW5jdGwgdmFsdWVzICovCi0jZGVmaW5lIFBJTl9JTgkJMHgyMAotI2RlZmluZSBQSU5fVlJFRjgwCTB4MjQKLSNkZWZpbmUgUElOX1ZSRUY1MAkweDIxCi0jZGVmaW5lIFBJTl9PVVQJCTB4NDAKLSNkZWZpbmUgUElOX0hQCQkweGMwCi0jZGVmaW5lIFBJTl9IUF9BTVAJMHg4MAorI2RlZmluZSBQSU5fSU4JCQkoQUNfUElOQ1RMX0lOX0VOKQorI2RlZmluZSBQSU5fVlJFRkhJWgkoQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX1ZSRUZfSElaKQorI2RlZmluZSBQSU5fVlJFRjUwCQkoQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX1ZSRUZfNTApCisjZGVmaW5lIFBJTl9WUkVGR1JECShBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl9HUkQpCisjZGVmaW5lIFBJTl9WUkVGODAJCShBQ19QSU5DVExfSU5fRU4gfCBBQ19QSU5DVExfVlJFRl84MCkKKyNkZWZpbmUgUElOX1ZSRUYxMDAJKEFDX1BJTkNUTF9JTl9FTiB8IEFDX1BJTkNUTF9WUkVGXzEwMCkKKyNkZWZpbmUgUElOX09VVAkJKEFDX1BJTkNUTF9PVVRfRU4pCisjZGVmaW5lIFBJTl9IUAkJCShBQ19QSU5DVExfT1VUX0VOIHwgQUNfUElOQ1RMX0hQX0VOKQorI2RlZmluZSBQSU5fSFBfQU1QCQkoQUNfUElOQ1RMX0hQX0VOKQogCiAvKgogICogZ2V0IHdpZGdldCBjYXBhYmlsaXRpZXMKQEAgLTQxOCw0ICs0MjEsMTMgQEAKIAkJCQkgaGRhX25pZF90IG5pZCk7CiAjZW5kaWYgLyogQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRSAqLwogCisvKgorICogQU1QIGNvbnRyb2wgY2FsbGJhY2tzCisgKi8KKy8qIHJldHJpZXZlIHBhcmFtZXRlcnMgZnJvbSBwcml2YXRlX3ZhbHVlICovCisjZGVmaW5lIGdldF9hbXBfbmlkKGtjKQkJKChrYyktPnByaXZhdGVfdmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIGdldF9hbXBfY2hhbm5lbHMoa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweDMpCisjZGVmaW5lIGdldF9hbXBfZGlyZWN0aW9uKGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTgpICYgMHgxKQorI2RlZmluZSBnZXRfYW1wX2luZGV4KGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHhmKQorCiAjZW5kaWYgLyogX19TT1VORF9IREFfTE9DQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaCBiL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmgKaW5kZXggMmZkZjIzNS4uZGZiY2ZhOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oCkBAIC0xOCwzICsxOCw1IEBACiBleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfY29uZXhhbnRbXTsKIC8qIFZJQSBjb2RlY3MgKi8KIGV4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF92aWFbXTsKKy8qIE5WSURJQSBIRE1JIGNvZGVjcyAqLworZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X252aGRtaVtdOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCmluZGV4IDFlNWFmZjUuLjc0M2Q3NzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCXVuc2lnbmVkIGludCBjYXBzLCB2YWw7CiAKIAljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QSU5fQ0FQKTsKLQlzbmRfaXByaW50ZihidWZmZXIsICIgIFBpbmNhcCAweDA4JXg6IiwgY2Fwcyk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiICBQaW5jYXAgMHglMDh4OiIsIGNhcHMpOwogCWlmIChjYXBzICYgQUNfUElOQ0FQX0lOKQogCQlzbmRfaXByaW50ZihidWZmZXIsICIgSU4iKTsKIAlpZiAoY2FwcyAmIEFDX1BJTkNBUF9PVVQpCkBAIC0yMjksOCArMjI5LDEzIEBACiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBEZXRlY3QiKTsKIAlpZiAoY2FwcyAmIEFDX1BJTkNBUF9CQUxBTkNFKQogCQlzbmRfaXByaW50ZihidWZmZXIsICIgQmFsYW5jZWQiKTsKLQlpZiAoY2FwcyAmIEFDX1BJTkNBUF9MUl9TV0FQKQotCQlzbmRfaXByaW50ZihidWZmZXIsICIgUi9MIik7CisJaWYgKGNhcHMgJiBBQ19QSU5DQVBfSERNSSkgeworCQkvKiBSZWFsdGVrIHVzZXMgdGhpcyBiaXQgYXMgYSBkaWZmZXJlbnQgbWVhbmluZyAqLworCQlpZiAoKGNvZGVjLT52ZW5kb3JfaWQgPj4gMTYpID09IDB4MTBlYykKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBSL0wiKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIEhETUkiKTsKKwl9CiAJaWYgKGNhcHMgJiBBQ19QSU5DQVBfVFJJR19SRVEpCiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBUcmlnZ2VyIik7CiAJaWYgKGNhcHMgJiBBQ19QSU5DQVBfSU1QX1NFTlNFKQpAQCAtNTUyLDkgKzU1NywxNSBAQAogCiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk5vZGUgMHglMDJ4IFslc10gd2NhcHMgMHgleDoiLCBuaWQsCiAJCQkgICAgZ2V0X3dpZF90eXBlX25hbWUod2lkX3R5cGUpLCB3aWRfY2Fwcyk7Ci0JCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfU1RFUkVPKQotCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIFN0ZXJlbyIpOwotCQllbHNlCisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfU1RFUkVPKSB7CisJCQl1bnNpZ25lZCBpbnQgY2hhbnM7CisJCQljaGFucyA9ICh3aWRfY2FwcyAmIEFDX1dDQVBfQ0hBTl9DTlRfRVhUKSA+PiAxMzsKKwkJCWNoYW5zID0gKChjaGFucyA8PCAxKSB8IDEpICsgMTsKKwkJCWlmIChjaGFucyA9PSAyKQorCQkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBTdGVyZW8iKTsKKwkJCWVsc2UKKwkJCQlzbmRfaXByaW50ZihidWZmZXIsICIgJWQtQ2hhbm5lbHMiLCBjaGFucyk7CisJCX0gZWxzZQogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIE1vbm8iKTsKIAkJaWYgKHdpZF9jYXBzICYgQUNfV0NBUF9ESUdJVEFMKQogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIERpZ2l0YWwiKTsKQEAgLTU2Niw2ICs1NzcsOCBAQAogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIFN0cmlwZSIpOwogCQlpZiAod2lkX2NhcHMgJiBBQ19XQ0FQX0xSX1NXQVApCiAJCQlzbmRfaXByaW50ZihidWZmZXIsICIgUi9MIik7CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfQ1BfQ0FQUykKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBDUCIpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogCiAJCS8qIHZvbHVtZSBrbm9iIGlzIGEgc3BlY2lhbCB3aWRnZXQgdGhhdCBhbHdheXMgaGF2ZSBjb25uZWN0aW9uCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCBlODAwM2Q5Li4yYjAwYzRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKQEAgLTE4MjYsOSArMTgyNiwxNCBAQAogCTB4MGMsIDB4MGQsIDB4MGUKIH07CiAKLSNkZWZpbmUgQUQxOTg4X1NQRElGX09VVAkweDAyCisjZGVmaW5lIEFEMTk4OF9TUERJRl9PVVQJCTB4MDIKKyNkZWZpbmUgQUQxOTg4X1NQRElGX09VVF9IRE1JCTB4MGIKICNkZWZpbmUgQUQxOTg4X1NQRElGX0lOCQkweDA3CiAKK3N0YXRpYyBoZGFfbmlkX3QgYWQxOTg5Yl9zbGF2ZV9kaWdfb3V0c1syXSA9IHsKKwlBRDE5ODhfU1BESUZfT1VULCBBRDE5ODhfU1BESUZfT1VUX0hETUkKK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhZDE5ODhfNnN0YWNrX2NhcHR1cmVfc291cmNlID0gewogCS5udW1faXRlbXMgPSA1LAogCS5pdGVtcyA9IHsKQEAgLTIxNDMsNiArMjE0OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE5ODlfc3BkaWZfb3V0X21peGVyc1tdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIklFQzk1OCBQbGF5YmFjayBWb2x1bWUiLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhETUkgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0yMjA3LDYgKzIyMTMsOCBAQAogCXsweDM0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKIAkvKiBBbmFsb2cgQ0QgSW5wdXQgKi8KIAl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCS8qIEFuYWxvZyBNaXggb3V0cHV0IGFtcCAqLworCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB8IDB4MWZ9LCAvKiAwZEIgKi8KIAogCXsgfQogfTsKQEAgLTIyNDcsOCArMjI1NSwxMiBAQAogCiAvKiBBRDE5ODkgaGFzIG5vIEFEQyAtPiBTUERJRiByb3V0ZSAqLwogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhZDE5ODlfc3BkaWZfaW5pdF92ZXJic1tdID0gewotCS8qIFNQRElGIG91dCBwaW4gKi8KKwkvKiBTUERJRi0xIG91dCBwaW4gKi8KKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCiAJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIHwgMHgyN30sIC8qIDBkQiAqLworCS8qIFNQRElGLTIvSERNSSBvdXQgcGluICovCisJezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB8IDB4Mjd9LCAvKiAwZEIgKi8KIAl7IH0KIH07CiAKQEAgLTIzMzYsNiArMjM0OCw4IEBACiAJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCiAJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCiAJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogQW5hbG9nIE1peCBvdXRwdXQgYW1wICovCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIHwgMHgxZn0sIC8qIDBkQiAqLwogCXsgfQogfTsKIApAQCAtMjQwOSw2ICsyNDIzLDggQEAKIAl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBBbmFsb2cgTWl4IG91dHB1dCBhbXAgKi8KKwl7MHgyMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfCAweDFmfSwgLyogMGRCICovCiAJeyB9CiB9OwogCkBAIC0yODY4LDYgKzI4ODQsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZWMsICJBc3VzIFA1Qi1ETFgiLCBBRDE5ODhfNlNUQUNLX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFmNiwgIkFzdXMgTTJOLVNMSSIsIEFEMTk4OF82U1RBQ0tfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4Mjc3LCAiQXN1cyBQNUstRS9XSUZJLUFQIiwgQUQxOTg4XzZTVEFDS19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzMTEsICJBc3VzIFA1US1QcmVtaXVtL1BybyIsIEFEMTk4OF82U1RBQ0tfRElHKSwKIAl7fQogfTsKIApAQCAtMjk3NSw2ICsyOTkyLDcgQEAKIAkJCQlhZDE5ODlfc3BkaWZfb3V0X21peGVyczsKIAkJCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10gPQogCQkJCWFkMTk4OV9zcGRpZl9pbml0X3ZlcmJzOworCQkJY29kZWMtPnNsYXZlX2RpZ19vdXRzID0gYWQxOTg5Yl9zbGF2ZV9kaWdfb3V0czsKIAkJfSBlbHNlIHsKIAkJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0KIAkJCQlhZDE5ODhfc3BkaWZfb3V0X21peGVyczsKQEAgLTM5MTEsNyArMzkyOSw3IEBACiAKIAogLyoKLSAqIEFEMTg4MgorICogQUQxODgyIC8gQUQxODgyQQogICoKICAqIHBvcnQtQSAtIGZyb250IGhwLW91dAogICogcG9ydC1CIC0gZnJvbnQgbWljLWluCkBAIC0zOTQ4LDYgKzM5NjYsMTggQEAKIAl9LAogfTsKIAorLyogbGlzdDogMHgxMSwgMHgzOSwgMHgzYSwgMHgzYywgMHgxOCwgMHgxZiwgMHgxMiwgMHgyMCAqLworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFkMTg4MmFfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDUsCisJLml0ZW1zID0geworCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKKwkJeyAiTWljIiwgMHg0fSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCQl7ICJEaWdpdGFsIE1pYyIsIDB4MDYgfSwKKwkJeyAiTWl4IiwgMHg3IH0sCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE4ODJfYmFzZV9taXhlcnNbXSA9IHsKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCkBAIC0zOTU3LDE2ICszOTg3LDcgQEAKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FX01PTk8oIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMHgxMywgMSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURV9NT05PKCJNb25vIFBsYXliYWNrIFN3aXRjaCIsIDB4MTMsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwNywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDA3LCBIREFfSU5QVVQpLAorCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgzYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUtSW4gQm9vc3QiLCAweDNhLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtMzk5OSw2ICs0MDIwLDM1IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTg4Ml9sb29wYmFja19taXhlcnNbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDYsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDYsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQmVlcCBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDA3LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDcsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTg4MmFfbG9vcGJhY2tfbWl4ZXJzW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDA2LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwNywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDA3LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkRpZ2l0YWwgTWljIEJvb3N0IiwgMHgxZiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE4ODJfM3N0YWNrX21peGVyc1tdID0gewogCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAxLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtNDE2OCw5ICs0MjE4LDE2IEBACiAJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhZDE4ODJfYWRjX25pZHMpOwogCXNwZWMtPmFkY19uaWRzID0gYWQxODgyX2FkY19uaWRzOwogCXNwZWMtPmNhcHNyY19uaWRzID0gYWQxODgyX2NhcHNyY19uaWRzOwotCXNwZWMtPmlucHV0X211eCA9ICZhZDE4ODJfY2FwdHVyZV9zb3VyY2U7Ci0Jc3BlYy0+bnVtX21peGVycyA9IDE7CisJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMWQxODgyKQorCQlzcGVjLT5pbnB1dF9tdXggPSAmYWQxODgyX2NhcHR1cmVfc291cmNlOworCWVsc2UKKwkJc3BlYy0+aW5wdXRfbXV4ID0gJmFkMTg4MmFfY2FwdHVyZV9zb3VyY2U7CisJc3BlYy0+bnVtX21peGVycyA9IDI7CiAJc3BlYy0+bWl4ZXJzWzBdID0gYWQxODgyX2Jhc2VfbWl4ZXJzOworCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTFkMTg4MikKKwkJc3BlYy0+bWl4ZXJzWzFdID0gYWQxODgyX2xvb3BiYWNrX21peGVyczsKKwllbHNlCisJCXNwZWMtPm1peGVyc1sxXSA9IGFkMTg4MmFfbG9vcGJhY2tfbWl4ZXJzOwogCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMTsKIAlzcGVjLT5pbml0X3ZlcmJzWzBdID0gYWQxODgyX2luaXRfdmVyYnM7CiAJc3BlYy0+c3BkaWZfcm91dGUgPSAwOwpAQCAtNDE4Nyw4ICs0MjQ0LDggQEAKIAlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgewogCWRlZmF1bHQ6CiAJY2FzZSBBRDE4ODJfM1NUQUNLOgotCQlzcGVjLT5udW1fbWl4ZXJzID0gMjsKLQkJc3BlYy0+bWl4ZXJzWzFdID0gYWQxODgyXzNzdGFja19taXhlcnM7CisJCXNwZWMtPm51bV9taXhlcnMgPSAzOworCQlzcGVjLT5taXhlcnNbMl0gPSBhZDE4ODJfM3N0YWNrX21peGVyczsKIAkJc3BlYy0+Y2hhbm5lbF9tb2RlID0gYWQxODgyX21vZGVzOwogCQlzcGVjLT5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhZDE4ODJfbW9kZXMpOwogCQlzcGVjLT5uZWVkX2RhY19maXggPSAxOwpAQCAtNDE5Niw4ICs0MjUzLDggQEAKIAkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAxOwogCQlicmVhazsKIAljYXNlIEFEMTg4Ml82U1RBQ0s6Ci0JCXNwZWMtPm51bV9taXhlcnMgPSAyOwotCQlzcGVjLT5taXhlcnNbMV0gPSBhZDE4ODJfNnN0YWNrX21peGVyczsKKwkJc3BlYy0+bnVtX21peGVycyA9IDM7CisJCXNwZWMtPm1peGVyc1syXSA9IGFkMTg4Ml82c3RhY2tfbWl4ZXJzOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC00MjIwLDYgKzQyNzcsNyBAQAogCXsgLmlkID0gMHgxMWQ0MTk4NiwgLm5hbWUgPSAiQUQxOTg2QSIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4NmEgfSwKIAl7IC5pZCA9IDB4MTFkNDE5ODgsIC5uYW1lID0gIkFEMTk4OCIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4OCB9LAogCXsgLmlkID0gMHgxMWQ0MTk4YiwgLm5hbWUgPSAiQUQxOTg4QiIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4OCB9LAorCXsgLmlkID0gMHgxMWQ0ODgyYSwgLm5hbWUgPSAiQUQxODgyQSIsIC5wYXRjaCA9IHBhdGNoX2FkMTg4MiB9LAogCXsgLmlkID0gMHgxMWQ0OTg5YSwgLm5hbWUgPSAiQUQxOTg5QSIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4OCB9LAogCXsgLmlkID0gMHgxMWQ0OTg5YiwgLm5hbWUgPSAiQUQxOTg5QiIsIC5wYXRjaCA9IHBhdGNoX2FkMTk4OCB9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKaW5kZXggMTIyNzI1MC4uYmE2MTU3NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKQEAgLTM1LDYgKzM1LDkgQEAKIAlzdHJ1Y3QgaGRhX3BjbSBwY21fcmVjOwogfTsKIAorI2RlZmluZSBDVlRfTklECQkweDAyCS8qIGF1ZGlvIGNvbnZlcnRlciAqLworI2RlZmluZSBQSU5fTklECQkweDAzCS8qIEhETUkgb3V0cHV0IHBpbiAqLworCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGF0aWhkbWlfYmFzaWNfaW5pdFtdID0gewogCS8qIGVuYWJsZSBkaWdpdGFsIG91dHB1dCBvbiBwaW4gd2lkZ2V0ICovCiAJeyAweDAzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKQEAgLTYwLDggKzYzLDkgQEAKIHsKIAlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBhdGloZG1pX2Jhc2ljX2luaXQpOwogCS8qIFNJIGNvZGVjIHJlcXVpcmVzIHRvIHVubXV0ZSB0aGUgcGluICovCi0JaWYgKGdldF93Y2Fwcyhjb2RlYywgMHgwMykgJiBBQ19XQ0FQX09VVF9BTVApCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDMsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJaWYgKGdldF93Y2Fwcyhjb2RlYywgUElOX05JRCkgJiBBQ19XQ0FQX09VVF9BTVApCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIFBJTl9OSUQsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTkyLDE1ICs5NiwyOSBAQAogCQkJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGF0aWhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAotCQkJCQkgICAgIGZvcm1hdCwgc3Vic3RyZWFtKTsKKwlpbnQgY2hhbnMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWludCBpLCBlcnI7CisKKwllcnIgPSBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkgICAgZm9ybWF0LCBzdWJzdHJlYW0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIENWVF9OSUQsIDAsIEFDX1ZFUkJfU0VUX0NWVF9DSEFOX0NPVU5ULAorCQkJICAgIGNoYW5zIC0gMSk7CisJLyogRklYTUU6IFhYWCAqLworCWZvciAoaSA9IDA7IGkgPCBjaGFuczsgaSsrKSB7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIENWVF9OSUQsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX0hETUlfQ0hBTl9TTE9ULAorCQkJCSAgICAoaSA8PCA0KSB8IGkpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhdGloZG1pX3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKLQkubmlkID0gMHgyLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgYW5kIHNldHVwIHN0cmVhbXMgKi8KKwkubmlkID0gQ1ZUX05JRCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzIGFuZCBzZXR1cCBzdHJlYW1zICovCiAJLm9wcyA9IHsKIAkJLm9wZW4gPSBhdGloZG1pX2RpZ19wbGF5YmFja19wY21fb3BlbiwKIAkJLmNsb3NlID0gYXRpaGRtaV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLApAQCAtMTEyLDYgKzEzMCw3IEBACiB7CiAJc3RydWN0IGF0aWhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBoZGFfcGNtICppbmZvID0gJnNwZWMtPnBjbV9yZWM7CisJdW5zaWduZWQgaW50IGNoYW5zOwogCiAJY29kZWMtPm51bV9wY21zID0gMTsKIAljb2RlYy0+cGNtX2luZm8gPSBpbmZvOwpAQCAtMTIwLDYgKzEzOSwxMyBAQAogCWluZm8tPnBjbV90eXBlID0gSERBX1BDTV9UWVBFX0hETUk7CiAJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gYXRpaGRtaV9wY21fZGlnaXRhbF9wbGF5YmFjazsKIAorCS8qIEZJWE1FOiB3ZSBtdXN0IGNoZWNrIEVMRCBhbmQgY2hhbmdlIHRoZSBQQ00gcGFyYW1ldGVycyBkeW5hbWljYWxseQorCSAqLworCWNoYW5zID0gZ2V0X3djYXBzKGNvZGVjLCBDVlRfTklEKTsKKwljaGFucyA9IChjaGFucyAmIEFDX1dDQVBfQ0hBTl9DTlRfRVhUKSA+PiAxMzsKKwljaGFucyA9ICgoY2hhbnMgPDwgMSkgfCAxKSArIDE7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9IGNoYW5zOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0Nyw5ICsxNzMsMTEgQEAKIAogCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gMDsJICAvKiBubyBhbmFsb2cgKi8KIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOwotCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gMHgyOyAvKiBOSUQgZm9yIGNvcHlpbmcgYW5hbG9nIHRvIGRpZ2l0YWwsCi0JCQkJCSAgICogc2VlbXMgdG8gYmUgdW51c2VkIGluIHB1cmUtZGlnaXRhbAotCQkJCQkgICAqIGNhc2UuICovCisJLyogTklEIGZvciBjb3B5aW5nIGFuYWxvZyB0byBkaWdpdGFsLAorCSAqIHNlZW1zIHRvIGJlIHVudXNlZCBpbiBwdXJlLWRpZ2l0YWwKKwkgKiBjYXNlLgorCSAqLworCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQ1ZUX05JRDsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhdGloZG1pX3BhdGNoX29wczsKIApAQCAtMTY0LDYgKzE5Miw3IEBACiAJeyAuaWQgPSAweDEwMDI3OTE5LCAubmFtZSA9ICJBVEkgUlM2MDAgSERNSSIsIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIAl7IC5pZCA9IDB4MTAwMjc5MWEsIC5uYW1lID0gIkFUSSBSUzY5MC83ODAgSERNSSIsIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIAl7IC5pZCA9IDB4MTAwMmFhMDEsIC5uYW1lID0gIkFUSSBSNnh4IEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCisJeyAuaWQgPSAweDEwOTUxMzkwLCAubmFtZSA9ICJTaUkxMzkwIEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCiAJeyAuaWQgPSAweDEwOTUxMzkyLCAubmFtZSA9ICJTaUkxMzkyIEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCiAJeyAuaWQgPSAweDE3ZTgwMDQ3LCAubmFtZSA9ICJDaHJvbnRlbCBIRE1JIiwgIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX252aGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY1Nzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIFVuaXZlcnNhbCBJbnRlcmZhY2UgZm9yIEludGVsIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYworICoKKyAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgTlZJRElBIEhETUkgY29kZWNzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE5WSURJQSBDb3JwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBXZWkgTmkgPHduaUBudmlkaWEuY29tPgorICoKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKworc3RydWN0IG52aGRtaV9zcGVjIHsKKwlzdHJ1Y3QgaGRhX211bHRpX291dCBtdWx0aW91dDsKKworCXN0cnVjdCBoZGFfcGNtIHBjbV9yZWM7Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIG52aGRtaV9iYXNpY19pbml0W10gPSB7CisJLyogZW5hYmxlIGRpZ2l0YWwgb3V0cHV0IG9uIHBpbiB3aWRnZXQgKi8KKwl7IDB4MDUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKKy8qCisgKiBDb250cm9scworICovCitzdGF0aWMgaW50IG52aGRtaV9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgbnZoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoY29kZWMsIHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52aGRtaV9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIG52aGRtaV9iYXNpY19pbml0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpZ2l0YWwgb3V0CisgKi8KK3N0YXRpYyBpbnQgbnZoZG1pX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgbnZoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKK3N0YXRpYyBpbnQgbnZoZG1pX2RpZ19wbGF5YmFja19wY21fY2xvc2Uoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgbnZoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCitzdGF0aWMgaW50IG52aGRtaV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IG52aGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN0cmVhbV90YWcsCisJCQkJCSAgICAgZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIG52aGRtaV9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4NCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzIGFuZCBzZXR1cCBzdHJlYW1zICovCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLm1heGJwcyA9IDE2LAorCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLm9wcyA9IHsKKwkJLm9wZW4gPSBudmhkbWlfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAorCQkuY2xvc2UgPSBudmhkbWlfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSBudmhkbWlfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlCisJfSwKK307CisKK3N0YXRpYyBpbnQgbnZoZG1pX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG52aGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSAmc3BlYy0+cGNtX3JlYzsKKworCWNvZGVjLT5udW1fcGNtcyA9IDE7CisJY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKKworCWluZm8tPm5hbWUgPSAiTlZJRElBIEhETUkiOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IG52aGRtaV9wY21fZGlnaXRhbF9wbGF5YmFjazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudmhkbWlfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlrZnJlZShjb2RlYy0+c3BlYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBudmhkbWlfcGF0Y2hfb3BzID0geworCS5idWlsZF9jb250cm9scyA9IG52aGRtaV9idWlsZF9jb250cm9scywKKwkuYnVpbGRfcGNtcyA9IG52aGRtaV9idWlsZF9wY21zLAorCS5pbml0ID0gbnZoZG1pX2luaXQsCisJLmZyZWUgPSBudmhkbWlfZnJlZSwKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfbnZoZG1pKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBudmhkbWlfc3BlYyAqc3BlYzsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAwOwkgIC8qIG5vIGFuYWxvZyAqLworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7CisJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAweDQ7IC8qIE5JRCBmb3IgY29weWluZyBhbmFsb2cgdG8gZGlnaXRhbCwKKwkJCQkJICAgKiBzZWVtcyB0byBiZSB1bnVzZWQgaW4gcHVyZS1kaWdpdGFsCisJCQkJCSAgICogY2FzZS4gKi8KKworCWNvZGVjLT5wYXRjaF9vcHMgPSBudmhkbWlfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwYXRjaCBlbnRyaWVzCisgKi8KK3N0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X252aGRtaVtdID0geworCXsgLmlkID0gMHgxMGRlMDAwMiwgLm5hbWUgPSAiTlZJRElBIE1DUDc4IEhETUkiLCAucGF0Y2ggPSBwYXRjaF9udmhkbWkgfSwKKwl7IC5pZCA9IDB4MTBkZTAwMDcsIC5uYW1lID0gIk5WSURJQSBNQ1A3QSBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggNjYwMjUxNi4uZTcyNzA3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTcyLDYgKzcyLDcgQEAKIGVudW0gewogCUFMQzI2MF9CQVNJQywKIAlBTEMyNjBfSFAsCisJQUxDMjYwX0hQX0RDNzYwMCwKIAlBTEMyNjBfSFBfMzAxMywKIAlBTEMyNjBfRlVKSVRTVV9TNzAyWCwKIAlBTEMyNjBfQUNFUiwKQEAgLTEwMCw2ICsxMDEsOSBAQAogCUFMQzI2Ml9CRU5RX1QzMSwKIAlBTEMyNjJfVUxUUkEsCiAJQUxDMjYyX0xFTk9WT18zMDAwLAorCUFMQzI2Ml9ORUMsCisJQUxDMjYyX1RPU0hJQkFfUzA2LAorCUFMQzI2Ml9UT1NISUJBX1JYMSwKIAlBTEMyNjJfQVVUTywKIAlBTEMyNjJfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLwogfTsKQEAgLTExMCw2ICsxMTQsNyBAQAogCUFMQzI2OF8zU1QsCiAJQUxDMjY4X1RPU0hJQkEsCiAJQUxDMjY4X0FDRVIsCisJQUxDMjY4X0FDRVJfQVNQSVJFX09ORSwKIAlBTEMyNjhfREVMTCwKIAlBTEMyNjhfWkVQVE8sCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwpAQCAtMTIyLDYgKzEyNyw3IEBACiAvKiBBTEMyNjkgbW9kZWxzICovCiBlbnVtIHsKIAlBTEMyNjlfQkFTSUMsCisJQUxDMjY5X1FVQU5UQV9GTDEsCiAJQUxDMjY5X0FTVVNfRUVFUENfUDcwMywKIAlBTEMyNjlfQVNVU19FRUVQQ19QOTAxLAogCUFMQzI2OV9BVVRPLApAQCAtMTY5LDYgKzE3NSwxMyBAQAogCUFMQzY2M19BU1VTX0c3MVYsCiAJQUxDNjYzX0FTVVNfSDEzLAogCUFMQzY2M19BU1VTX0c1MFYsCisJQUxDNjYyX0VDUywKKwlBTEM2NjNfQVNVU19NT0RFMSwKKwlBTEM2NjJfQVNVU19NT0RFMiwKKwlBTEM2NjNfQVNVU19NT0RFMywKKwlBTEM2NjNfQVNVU19NT0RFNCwKKwlBTEM2NjNfQVNVU19NT0RFNSwKKwlBTEM2NjNfQVNVU19NT0RFNiwKIAlBTEM2NjJfQVVUTywKIAlBTEM2NjJfTU9ERUxfTEFTVCwKIH07CkBAIC0yMDAsMTggKzIxMywyMSBAQAogCUFMQzg4M19BQ0VSLAogCUFMQzg4M19BQ0VSX0FTUElSRSwKIAlBTEM4ODNfTUVESU9OLAotCUFMQzg4M19NRURJT05fTUQyLAkKKwlBTEM4ODNfTUVESU9OX01EMiwKIAlBTEM4ODNfTEFQVE9QX0VBUEQsCiAJQUxDODgzX0xFTk9WT18xMDFFXzJjaCwKIAlBTEM4ODNfTEVOT1ZPX05CMDc2MywKIAlBTEM4ODhfTEVOT1ZPX01TNzE5NV9ESUcsCi0JQUxDODgzX0hBSUVSX1c2NiwJCQorCUFMQzg4OF9MRU5PVk9fU0tZLAorCUFMQzg4M19IQUlFUl9XNjYsCiAJQUxDODg4XzNTVF9IUCwKIAlBTEM4ODhfNlNUX0RFTEwsCiAJQUxDODgzX01JVEFDLAogCUFMQzg4M19DTEVWT19NNzIwLAogCUFMQzg4M19GVUpJVFNVX1BJMjUxNSwKIAlBTEM4ODNfM1NUXzZjaF9JTlRFTCwKKwlBTEM4ODhfQVNVU19NOTBWLAorCUFMQzg4OF9BU1VTX0VFRTE2MDEsCiAJQUxDODgzX0FVVE8sCiAJQUxDODgzX01PREVMX0xBU1QsCiB9OwpAQCAtMzk4LDcgKzQxNCw3IEBACiAKIC8qCiAgKiBDb250cm9sIHRoZSBtb2RlIG9mIHBpbiB3aWRnZXQgc2V0dGluZ3MgdmlhIHRoZSBtaXhlci4gICJwYyIgaXMgdXNlZAotICogaW5zdGVhZCBvZiAiJSIgdG8gYXZvaWQgY29uc2VxdWVuY2VzIG9mIGFjY2lkZW50bHkgdHJlYXRpbmcgdGhlICUgYXMgCisgKiBpbnN0ZWFkIG9mICIlIiB0byBhdm9pZCBjb25zZXF1ZW5jZXMgb2YgYWNjaWRlbnRseSB0cmVhdGluZyB0aGUgJSBhcwogICogYmVpbmcgcGFydCBvZiBhIGZvcm1hdCBzcGVjaWZpZXIuICBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIGEgdmFsdWUgaXMKICAqIDYzIGNoYXJhY3RlcnMgcGx1cyBOVUxMIHRlcm1pbmF0b3IuCiAgKgpAQCAtNDI5LDcgKzQ0NSw3IEBACiAjZGVmaW5lIEFMQ19QSU5fRElSX0lOX05PTUlDQklBUyAgICAweDAzCiAjZGVmaW5lIEFMQ19QSU5fRElSX0lOT1VUX05PTUlDQklBUyAweDA0CiAKLS8qIEluZm8gYWJvdXQgdGhlIHBpbiBtb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGRpZmZlcmVudCBwaW4gZGlyZWN0aW9uIG1vZGVzLiAKKy8qIEluZm8gYWJvdXQgdGhlIHBpbiBtb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGRpZmZlcmVudCBwaW4gZGlyZWN0aW9uIG1vZGVzLgogICogRm9yIGVhY2ggZGlyZWN0aW9uIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhcmUgZ2l2ZW4uCiAgKi8KIHN0YXRpYyBzaWduZWQgY2hhciBhbGNfcGluX21vZGVfZGlyX2luZm9bNV1bMl0gPSB7CkBAIC01MDIsNyArNTE4LDcgQEAKIAkJCQkJICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCiAJCQkJCSAgYWxjX3Bpbl9tb2RlX3ZhbHVlc1t2YWxdKTsKIAotCQkvKiBBbHNvIGVuYWJsZSB0aGUgcmV0YXNraW5nIHBpbidzIGlucHV0L291dHB1dCBhcyByZXF1aXJlZCAKKwkJLyogQWxzbyBlbmFibGUgdGhlIHJldGFza2luZyBwaW4ncyBpbnB1dC9vdXRwdXQgYXMgcmVxdWlyZWQKIAkJICogZm9yIHRoZSByZXF1ZXN0ZWQgcGluIG1vZGUuICBFbnVtIHZhbHVlcyBvZiAyIG9yIGxlc3MgYXJlCiAJCSAqIGlucHV0IG1vZGVzLgogCQkgKgpAQCAtNzA3LDcgKzcyMyw3IEBACiAJICAgICBpKyspCiAJCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10gPQogCQkJcHJlc2V0LT5pbml0X3ZlcmJzW2ldOwotCQorCiAJc3BlYy0+Y2hhbm5lbF9tb2RlID0gcHJlc2V0LT5jaGFubmVsX21vZGU7CiAJc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSA9IHByZXNldC0+bnVtX2NoYW5uZWxfbW9kZTsKIAlzcGVjLT5uZWVkX2RhY19maXggPSBwcmVzZXQtPm5lZWRfZGFjX2ZpeDsKQEAgLTcxOCw3ICs3MzQsNyBAQAogCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gcHJlc2V0LT5kYWNfbmlkczsKIAlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IHByZXNldC0+ZGlnX291dF9uaWQ7CiAJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gcHJlc2V0LT5ocF9uaWQ7Ci0JCisKIAlzcGVjLT5udW1fbXV4X2RlZnMgPSBwcmVzZXQtPm51bV9tdXhfZGVmczsKIAlpZiAoIXNwZWMtPm51bV9tdXhfZGVmcykKIAkJc3BlYy0+bnVtX211eF9kZWZzID0gMTsKQEAgLTgwNiw2ICs4MjIsMjcgQEAKIAkJCSAgICBzcGVjLT5qYWNrX3ByZXNlbnQgPyAwIDogUElOX09VVCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsY19taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgaW50IG1pY19uaWQgPSBzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbQVVUT19QSU5fTUlDXTsKKwl1bnNpZ25lZCBpbnQgZm1pY19uaWQgPSBzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbQVVUT19QSU5fRlJPTlRfTUlDXTsKKwl1bnNpZ25lZCBpbnQgbWl4X25pZCA9IHNwZWMtPmNhcHNyY19uaWRzWzBdOworCXVuc2lnbmVkIGludCBjYXBzcmNfaWR4X21pYywgY2Fwc3JjX2lkeF9mbWljOworCisJY2Fwc3JjX2lkeF9taWMgPSBtaWNfbmlkIC0gMHgxODsKKwljYXBzcmNfaWR4X2ZtaWMgPSBmbWljX25pZCAtIDB4MTg7CisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbWljX25pZCwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG1peF9uaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCSAgICAweDcwMDAgfCAoY2Fwc3JjX2lkeF9taWMgPDwgOCkgfCAocHJlc2VudCA/IDAgOiAweDgwKSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbWl4X25pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJICAgIDB4NzAwMCB8IChjYXBzcmNfaWR4X2ZtaWMgPDwgOCkgfCAocHJlc2VudCA/IDB4ODAgOiAwKSk7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBiLCBIREFfSU5QVVQsIGNhcHNyY19pZHhfZm1pYywKKwkJCSBIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKK30KKwogLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLwogc3RhdGljIHZvaWQgYWxjX3NrdV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKIHsKQEAgLTgxMywxMCArODUwLDE3IEBACiAJCXJlcyA+Pj0gMjg7CiAJZWxzZQogCQlyZXMgPj49IDI2OwotCWlmIChyZXMgIT0gQUxDODgwX0hQX0VWRU5UKQotCQlyZXR1cm47CisJaWYgKHJlcyA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsY19za3VfYXV0b211dGUoY29kZWMpOwogCisJaWYgKHJlcyA9PSBBTEM4ODBfTUlDX0VWRU5UKQorCQlhbGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorewogCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCWFsY19taWNfYXV0b211dGUoY29kZWMpOwogfQogCiAvKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBBTEM4ODggdmFyaWFudHMgKi8KQEAgLTg1NSw3ICs4OTksNyBAQAogCWlmICgoYXNzICE9IGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgJiYgKGFzcyAmIDEpKQogCQlnb3RvIGRvX3NrdTsKIAotCS8qCQorCS8qCiAJICogMzF+MzAJOiBwb3J0IGNvbmV0Y2l2aXR5CiAJICogMjl+MjEJOiByZXNlcnZlCiAJICogMjAJCTogUENCRUVQIGlucHV0CkBAIC05NDYsNyArOTkwLDcgQEAKIAkJCXRtcCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMCwgMCwKIAkJCQkJCSBBQ19WRVJCX0dFVF9QUk9DX0NPRUYsIDApOwogCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKLQkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDcpOwkKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDcpOwogCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKIAkJCQkJICAgIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwKIAkJCQkJICAgIHRtcCB8IDB4MjAxMCk7CkBAIC05NjEsNyArMTAwNSw3IEBACiAJCQl0bXAgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MjAsIDAsCiAJCQkJCQkgQUNfVkVSQl9HRVRfUFJPQ19DT0VGLCAwKTsKIAkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCi0JCQkJCSAgICBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCA3KTsJCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCA3KTsKIAkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCiAJCQkJCSAgICBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsCiAJCQkJCSAgICB0bXAgfCAweDMwMDApOwpAQCAtOTcwLDcgKzEwMTQsNyBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQkKKwogCS8qIGlzIGxhcHRvcCBvciBEZXNrdG9wIGFuZCBlbmFibGUgdGhlIGZ1bmN0aW9uICJNdXRlIGludGVybmFsIHNwZWFrZXIKIAkgKiB3aGVuIHRoZSBleHRlcm5hbCBoZWFkcGhvbmUgb3V0IGphY2sgaXMgcGx1Z2dlZCIKIAkgKi8KQEAgLTEwMDIsMTAgKzEwNDYsMTggQEAKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KKwlpZiAoc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0sIDAsCisJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCisJCQlBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVCk7CiAKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0sIDAsCi0JCQkgICAgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAotCQkJICAgIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UKTsKKwlpZiAoc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW0FVVE9fUElOX01JQ10gJiYKKwkJc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW0FVVE9fUElOX0ZST05UX01JQ10pCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsCisJCQlzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbQVVUT19QSU5fTUlDXSwgMCwKKwkJCUFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwKKwkJCUFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVCk7CisKIAlzcGVjLT51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQ7CiB9CiAKQEAgLTEyOTYsNyArMTM0OCw3IEBACiAgKgogICogVGhlIHN5c3RlbSBhbHNvIGhhcyBhIHBhaXIgb2YgaW50ZXJuYWwgc3BlYWtlcnMsIGFuZCBhIGhlYWRwaG9uZSBqYWNrLgogICogVGhlc2UgYXJlIGJvdGggY29ubmVjdGVkIHRvIExpbmUyIG9uIHRoZSBjb2RlYywgaGVuY2UgdG8gREFDIDAyLgotICogCisgKgogICogVGhlcmUgaXMgYSB2YXJpYWJsZSByZXNpc3RvciB0byBjb250cm9sIHRoZSBzcGVha2VyIG9yIGhlYWRwaG9uZQogICogdm9sdW1lLiBUaGlzIGlzIGEgaGFyZHdhcmUtb25seSBkZXZpY2Ugd2l0aG91dCBhIHNvZnR3YXJlIEFQSS4KICAqCkBAIC0xODI0LDcgKzE4NzYsNyBAQAogCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCQorCiAJeyB9CiB9OwogCkBAIC0xODY5LDcgKzE5MjEsNyBAQAogCiAvKgogKiBVbml3aWxsIFA1MwotKiBIUCA9IDB4MTQsIEludGVybmFsU3BlYWtlciA9IDB4MTUsIG1pYyA9IDB4MTksIAorKiBIUCA9IDB4MTQsIEludGVybmFsU3BlYWtlciA9IDB4MTUsIG1pYyA9IDB4MTksCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnNbXSA9IHsKIAl7MHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwpAQCAtMTk2OCw3ICsyMDIwLDcgQEAKIHN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M19kY3ZvbF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQkKKwogCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MjEsIDAsCiAJCQkJICAgICBBQ19WRVJCX0dFVF9WT0xVTUVfS05PQl9DT05UUk9MLCAwKTsKIAlwcmVzZW50ICY9IEhEQV9BTVBfVk9MTUFTSzsKQEAgLTIwNTAsNyArMjEwMiw3IEBACiAJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCQorCiAJeyB9CiB9OwogCkBAIC0yNjMyLDEyICsyNjg0LDE0IEBACiAKIAlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOwogCWlmIChzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrKSB7Ci0JCXNuZF9hc3NlcnQoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKHNuZF9CVUdfT04oIXNwZWMtPm11bHRpb3V0LmRhY19uaWRzKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSAqKHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2spOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07CiAJfQogCWlmIChzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUpIHsKLQkJc25kX2Fzc2VydChzcGVjLT5hZGNfbmlkcywgcmV0dXJuIC1FSU5WQUwpOworCQlpZiAoc25kX0JVR19PTighc3BlYy0+YWRjX25pZHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKihzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUpOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5hZGNfbmlkc1swXTsKIAl9CkBAIC0yNjY3LDYgKzI3MjEsOCBAQAogCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSAqKHNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUpOwogCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+ZGlnX2luX25pZDsKIAkJfQorCQkvKiBGSVhNRTogZG8gd2UgbmVlZCB0aGlzIGZvciBhbGwgUmVhbHRlayBjb2RlYyBtb2RlbHM/ICovCisJCWNvZGVjLT5zcGRpZl9zdGF0dXNfcmVzZXQgPSAxOwogCX0KIAogCS8qIElmIHRoZSB1c2Ugb2YgbW9yZSB0aGFuIG9uZSBBREMgaXMgcmVxdWVzdGVkIGZvciB0aGUgY3VycmVudApAQCAtMzY4Myw3ICszNzM5LDcgQEAKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKLQkKKwogCWFsY19zdWJzeXN0ZW1faWQoY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQpOwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07CkBAIC0zNzg3LDcgKzM4NDMsNyBAQAogCWFsYzg4MF9hdXRvX2luaXRfZXh0cmFfb3V0KGNvZGVjKTsKIAlhbGM4ODBfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CiAJaWYgKHNwZWMtPnVuc29sX2V2ZW50KQotCQlhbGNfc2t1X2F1dG9tdXRlKGNvZGVjKTsKKwkJYWxjX2luaXRob29rKGNvZGVjKTsKIH0KIAogLyoKQEAgLTQxMjQsNiArNDE4MCwzMyBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjBfZGM3NjAwX2JpbmRfbWFzdGVyX3ZvbCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBhLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTEsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTUsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfZGM3NjAwX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2MF9kYzc2MDBfYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTGluZU91dCBQbGF5YmFjayBTd2l0Y2giLCAmYWxjMjYwX2RjNzYwMF9iaW5kX3N3aXRjaCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKwogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM191bnNvbF92ZXJic1tdID0gewogCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKIAl7fSwKQEAgLTQxNDcsNyArNDIzMCwzMCBAQAogCQlhbGMyNjBfaHBfMzAxM19hdXRvbXV0ZShjb2RlYyk7CiB9CiAKLS8qIEZ1aml0c3UgUzcwMnggc2VyaWVzIGxhcHRvcHMuICBBTEMyNjAgcGluIHVzYWdlOiBNaWMvTGluZSBqYWNrID0gMHgxMiwgCitzdGF0aWMgdm9pZCBhbGMyNjBfaHBfMzAxMl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudCwgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTAsIDAsCisJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisKKwliaXRzID0gcHJlc2VudCA/IDAgOiBQSU5fT1VUOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MGYsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDExLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkgICAgYml0cyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNSwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJICAgIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjBfaHBfMzAxMl91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGMyNjBfaHBfMzAxMl9hdXRvbXV0ZShjb2RlYyk7Cit9CisKKy8qIEZ1aml0c3UgUzcwMnggc2VyaWVzIGxhcHRvcHMuICBBTEMyNjAgcGluIHVzYWdlOiBNaWMvTGluZSBqYWNrID0gMHgxMiwKICAqIEhQIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBpbnRlcm5hbCBzcGVha2VyID0gMHgxMC4KICAqLwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9mdWppdHN1X21peGVyW10gPSB7CkBAIC00NDc4LDcgKzQ1ODQsNyBAQAogCXsweDAzLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCiAJezB4MDYsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCAwfSwKIAotCS8qIEVuc3VyZSBMaW5lMSBwaW4gd2lkZ2V0IHRha2VzIGl0cyBpbnB1dCBmcm9tIHRoZSBPVVQxIHN1bSBidXMgCisJLyogRW5zdXJlIExpbmUxIHBpbiB3aWRnZXQgdGFrZXMgaXRzIGlucHV0IGZyb20gdGhlIE9VVDEgc3VtIGJ1cwogCSAqIHdoZW4gYWN0aW5nIGFzIGFuIG91dHB1dC4KIAkgKi8KIAl7MHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LApAQCAtNDUwMywxNCArNDYwOSwxNCBAQAogCSAqIHN0YWdlLgogCSAqLwogCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogVW5tdXRlIGlucHV0IGJ1ZmZlciBvZiBwaW4gd2lkZ2V0IHVzZWQgZm9yIExpbmUtaW4gKG5vIGVxdWl2IAorCS8qIFVubXV0ZSBpbnB1dCBidWZmZXIgb2YgcGluIHdpZGdldCB1c2VkIGZvciBMaW5lLWluIChubyBlcXVpdgogCSAqIG1peGVyIGN0cmwpCiAJICovCiAJezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCiAJLyogTXV0ZSBjYXB0dXJlIGFtcCBsZWZ0IGFuZCByaWdodCAqLwogCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JLyogU2V0IEFEQyBjb25uZWN0aW9uIHNlbGVjdCB0byBtYXRjaCBkZWZhdWx0IG1peGVyIHNldHRpbmcgLSBsaW5lIAorCS8qIFNldCBBREMgY29ubmVjdGlvbiBzZWxlY3QgdG8gbWF0Y2ggZGVmYXVsdCBtaXhlciBzZXR0aW5nIC0gbGluZQogCSAqIGluIChvbiBtaWMxIHBpbikKIAkgKi8KIAl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LApAQCAtNDU2NCw3ICs0NjcwLDcgQEAKIAl7MHgwMywgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAogCXsweDA2LCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCiAKLQkvKiBFbnN1cmUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSBPVVQxIHN1bSAKKwkvKiBFbnN1cmUgTWljMSBhbmQgTGluZTEgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSBPVVQxIHN1bQogCSAqIGJ1cyB3aGVuIGFjdGluZyBhcyBvdXRwdXRzLgogCSAqLwogCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCkBAIC00Njc1LDYgKzQ3ODEsMjAgQEAKICAgICAgICAgICAgICAgICBhbGMyNjBfcmVwbGFjZXJfNjcydl9hdXRvbXV0ZShjb2RlYyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX2hwX2RjNzYwMF92ZXJic1tdID0geworCXsweDA1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDEwLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgxMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXt9Cit9OworCiAvKiBUZXN0IGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZywgbW9kZWxsZWQgYWZ0ZXIgdGhlIEFMQzg4MCB0ZXN0CiAgKiBjb25maWd1cmF0aW9uLgogICovCkBAIC00Njg2LDcgKzQ4MDYsNyBAQAogCTB4MDQsIDB4MDUsCiB9OwogLyogRm9yIHRlc3RpbmcgdGhlIEFMQzI2MCwgZWFjaCBpbnB1dCBNVVggbmVlZHMgaXRzIG93biBkZWZpbml0aW9uIHNpbmNlCi0gKiB0aGUgc2lnbmFsIGFzc2lnbm1lbnRzIGFyZSBkaWZmZXJlbnQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgQURDIAorICogdGhlIHNpZ25hbCBhc3NpZ25tZW50cyBhcmUgZGlmZmVyZW50LiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IEFEQwogICogaXMgTklEIDB4MDQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjBfdGVzdF9jYXB0dXJlX3NvdXJjZXNbMl0gPSB7CkBAIC00NzY5LDcgKzQ4ODksNyBAQAogCiAJLyogU3dpdGNoZXMgdG8gYWxsb3cgdGhlIGRpZ2l0YWwgSU8gcGlucyB0byBiZSBlbmFibGVkLiAgVGhlIGRhdGFzaGVldAogCSAqIGlzIGFtYmlnaW91cyBhcyB0byB3aGljaCBOSUQgaXMgd2hpY2g7IHRlc3Rpbmcgb24gbGFwdG9wcyB3aGljaAotCSAqIG1ha2UgdGhpcyBvdXRwdXQgYXZhaWxhYmxlIHNob3VsZCBwcm92aWRlIGNsYXJpZmljYXRpb24uIAorCSAqIG1ha2UgdGhpcyBvdXRwdXQgYXZhaWxhYmxlIHNob3VsZCBwcm92aWRlIGNsYXJpZmljYXRpb24uCiAJICovCiAJQUxDX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAxKSwKIAlBTENfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIENhcHR1cmUgU3dpdGNoIiwgMHgwNiwgMHgwMSksCkBAIC00ODA1LDcgKzQ5MjUsNyBAQAogCXsweDAzLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgMH0sCiAJezB4MDYsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCAwfSwKIAotCS8qIEVuc3VyZSBtaWMxLCBtaWMyLCBsaW5lMSBhbmQgbGluZTIgcGluIHdpZGdldHMgdGFrZSBpbnB1dCBmcm9tIHRoZSAKKwkvKiBFbnN1cmUgbWljMSwgbWljMiwgbGluZTEgYW5kIGxpbmUyIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUKIAkgKiBPVVQxIHN1bSBidXMgd2hlbiBhY3RpbmcgYXMgYW4gb3V0cHV0LgogCSAqLwogCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCkBAIC00ODk3LDcgKzUwMTcsNyBAQAogCQlzd192YWwgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCk7CiAJfSBlbHNlCiAJCXJldHVybiAwOyAvKiBOL0EgKi8KLQkKKwogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIHBmeCk7CiAJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLCB2b2xfdmFsKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTUwMDMsNyArNTEyMyw3IEBACiAJCWludCBwaW5fdHlwZSA9IGdldF9waW5fdHlwZShzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUpOwogCQlhbGMyNjBfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsIDApOwogCX0KLQkKKwogCW5pZCA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwogCWlmIChuaWQpCiAJCWFsYzI2MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBQSU5fT1VULCAwKTsKQEAgLTUwNDUsNyArNTE2NSw3IEBACiAJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDA1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCiAJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCQorCiAJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCiAJICogbWl4ZXIgd2lkZ2V0CiAJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKQEAgLTUwNzQsNyArNTE5NCw3IEBACiAJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAogCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JCisKIAl7IH0KIH07CiAKQEAgLTUxMzQsNyArNTI1NCw3IEBACiAJYWxjMjYwX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOwogCWFsYzI2MF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKIAlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCQlhbGNfaW5pdGhvb2soY29kZWMpOwogfQogCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQpAQCAtNTE1NSw2ICs1Mjc1LDcgQEAKIAlbQUxDMjYwX0JBU0lDXQkJPSAiYmFzaWMiLAogCVtBTEMyNjBfSFBdCQk9ICJocCIsCiAJW0FMQzI2MF9IUF8zMDEzXQk9ICJocC0zMDEzIiwKKwlbQUxDMjYwX0hQX0RDNzYwMF0JPSAiaHAtZGM3NjAwIiwKIAlbQUxDMjYwX0ZVSklUU1VfUzcwMlhdCT0gImZ1aml0c3UiLAogCVtBTEMyNjBfQUNFUl0JCT0gImFjZXIiLAogCVtBTEMyNjBfV0lMTF0JCT0gIndpbGwiLApAQCAtNTE3Miw3ICs1MjkzLDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBhLCAiSFAgZDU3NTAiLCBBTEMyNjBfSFBfMzAxMyksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMCwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTEsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEyLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMiwgIkhQIiwgQUxDMjYwX0hQX0RDNzYwMCksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMywgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTQsICJIUCIsIEFMQzI2MF9IUCksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNSwgIkhQIiwgQUxDMjYwX0hQKSwKQEAgLTUyMTgsNiArNTMzOSwyMiBAQAogCQkudW5zb2xfZXZlbnQgPSBhbGMyNjBfaHBfdW5zb2xfZXZlbnQsCiAJCS5pbml0X2hvb2sgPSBhbGMyNjBfaHBfYXV0b211dGUsCiAJfSwKKwlbQUxDMjYwX0hQX0RDNzYwMF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2MF9ocF9kYzc2MDBfbWl4ZXIsCisJCQkgICAgYWxjMjYwX2lucHV0X21peGVyLAorCQkJICAgIGFsYzI2MF9jYXB0dXJlX2FsdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX2luaXRfdmVyYnMsCisJCQkJYWxjMjYwX2hwX2RjNzYwMF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2MF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2hwX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjMjYwX2hwX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzI2MF9ocF8zMDEyX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjMjYwX2hwXzMwMTJfYXV0b211dGUsCisJfSwKIAlbQUxDMjYwX0hQXzMwMTNdID0gewogCQkubWl4ZXJzID0geyBhbGMyNjBfaHBfMzAxM19taXhlciwKIAkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIsCkBAIC01OTMzLDcgKzYwNzAsNyBAQAogCiAJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKIAl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQkKKwogCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sIC8qIG1pYy9jbGZlICovCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogbGluZS9zdXJyb3VuZCAqLwogCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCkBAIC01OTQ5LDcgKzYwODYsNyBAQAogc3RhdGljIHZvaWQgYWxjODgyX3RhcmdhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLSAKKwogIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAogCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CiAJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDFiLCBIREFfT1VUUFVULCAwLApAQCAtNTk3NSw3ICs2MTEyLDcgQEAKIAl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAogCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAogCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCQorCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogRnJvbnQgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwogCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCkBAIC01OTkzLDcgKzYxMzAsNyBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCiAJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0gICAgICAgIAorCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogRnJvbnQgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwogCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEZyb250ICovCkBAIC02MzE5LDcgKzY0NTYsNyBAQAogCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyXzNTVF82Y2hfbW9kZXMsCiAJCS5uZWVkX2RhY19maXggPSAxLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAkKKwl9LAogCVtBTEM4ODJfQVNVU19BN01dID0gewogCQkubWl4ZXJzID0geyBhbGM4ODJfYXN1c19hN21fbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9pbml0X3ZlcmJzLCBhbGM4ODJfZWFwZF92ZXJicywKQEAgLTYzMzIsMTQgKzY0NjksMTQgQEAKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAogCQkubmVlZF9kYWNfZml4ID0gMSwKIAkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCi0JfSwJCisJfSwKIH07CiAKIAogLyoKICAqIFBpbiBjb25maWcgZml4ZXMKICAqLwotZW51bSB7IAorZW51bSB7CiAJUElORklYX0FCSVRfQVc5RF9NQVgKIH07CiAKQEAgLTY1MjcsNyArNjY2NCw3IEBACiAJYWxjODgyX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOwogCWFsYzg4Ml9hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKIAlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCQlhbGNfaW5pdGhvb2soY29kZWMpOwogfQogCiBzdGF0aWMgaW50IHBhdGNoX2FsYzg4MyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7IC8qIGNhbGxlZCBpbiBwYXRjaF9hbGM4ODIoKSAqLwpAQCAtNjU1NCwxNiArNjY5MSwxOSBAQAogCQkJYm9hcmRfY29uZmlnID0gQUxDODg1X01BQ1BSTzsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA2YjEwMDA6IC8qIGlNYWMgMjQgKi8KKwkJY2FzZSAweDEwNmIyODAwOiAvKiBBcHBsZVRWICovCiAJCQlib2FyZF9jb25maWcgPSBBTEM4ODVfSU1BQzI0OwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMDZiMDBhMTogLyogTWFjYm9vayAobWlnaHQgYmUgd3JvbmcgLSBQQ0kgU1NJRD8pICovCisJCWNhc2UgMHgxMDZiMDBhNDogLyogTWFjYm9va1BybzQsMSAqLwogCQljYXNlIDB4MTA2YjJjMDA6IC8qIE1hY2Jvb2sgUHJvIHJldjMgKi8KIAkJY2FzZSAweDEwNmIzNjAwOiAvKiBNYWNib29rIDMuMSAqLwogCQkJYm9hcmRfY29uZmlnID0gQUxDODg1X01CUDM7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIEFMQzg4OUEgaXMgaGFuZGxlZCBiZXR0ZXIgYXMgQUxDODg4LWNvbXBhdGlibGUgKi8KLQkJCWlmIChjb2RlYy0+cmV2aXNpb25faWQgPT0gMHgxMDAxMDMpIHsKKwkJCWlmIChjb2RlYy0+cmV2aXNpb25faWQgPT0gMHgxMDAxMDEgfHwKKwkJCSAgICBjb2RlYy0+cmV2aXNpb25faWQgPT0gMHgxMDAxMDMpIHsKIAkJCQlhbGNfZnJlZShjb2RlYyk7CiAJCQkJcmV0dXJuIHBhdGNoX2FsYzg4Myhjb2RlYyk7CiAJCQl9CkBAIC02NzE4LDYgKzY4NTgsMjMgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4M19sZW5vdm9fc2t5X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHg0IH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4ODNfYXN1c19lZWUxNjAxX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkxpbmUiLCAweDIgfSwKKwl9LAorfTsKKwogI2RlZmluZSBhbGM4ODNfbXV4X2VudW1faW5mbyBhbGNfbXV4X2VudW1faW5mbwogI2RlZmluZSBhbGM4ODNfbXV4X2VudW1fZ2V0IGFsY19tdXhfZW51bV9nZXQKIC8qIEFMQzg4MyBoYXMgdGhlIEFMQzg4Mi10eXBlIGlucHV0IHNlbGVjdGlvbiAqLwpAQCAtNzAzMiwxMyArNzE4OSwxMSBAQAogCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KIAkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKLQkJLmNvdW50ID0gMiwKKwkJLmNvdW50ID0gMSwKIAkJLmluZm8gPSBhbGM4ODNfbXV4X2VudW1faW5mbywKIAkJLmdldCA9IGFsYzg4M19tdXhfZW51bV9nZXQsCiAJCS5wdXQgPSBhbGM4ODNfbXV4X2VudW1fcHV0LApAQCAtNzI1Niw3ICs3NDExLDcgQEAKIAkJLnB1dCA9IGFsYzg4M19tdXhfZW51bV9wdXQsCiAJfSwKIAl7IH0gLyogZW5kICovCi19OwkKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfYWNlcl9hc3BpcmVfbWl4ZXJbXSA9IHsKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtNzI4Myw2ICs3NDM4LDg3IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4OF9sZW5vdm9fc2t5X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkJMHgwZCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MGYsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiaVNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMiwKKwkJLmluZm8gPSBhbGM4ODNfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGFsYzg4M19tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBhbGM4ODNfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzg4M19iaW5kX2NhcF92b2wgPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOCwgMywgMCwgSERBX0lOUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfSU5QVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM4ODNfYmluZF9jYXBfc3dpdGNoID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOCwgMywgMCwgSERBX0lOUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA5LCAzLCAwLCBIREFfSU5QVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfYXN1c19lZWUxNjAxX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfVk9MKCJDYXB0dXJlIFZvbHVtZSIsICZhbGM4ODNfYmluZF9jYXBfdm9sKSwKKwlIREFfQklORF9TVygiQ2FwdHVyZSBTd2l0Y2giLCAmYWxjODgzX2JpbmRfY2FwX3N3aXRjaCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsYzg4M19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjODgzX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzg4M19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2NobW9kZV9taXhlcltdID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCkBAIC03Mjk2LDcgKzc1MzIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4M19pbml0X3ZlcmJzW10gPSB7CiAJLyogQURDMTogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCS8qIEFEQzI6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCiAJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKQEAgLTczNjEsMTQgKzc1OTcsMTQgQEAKIAkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KIAkvKiBJbnB1dCBtaXhlcjIgKi8KIAl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCiAJLyogSW5wdXQgbWl4ZXIzICovCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAogCXsgfQogfTsKIApAQCAtNzQ2OCw3ICs3NzA0LDcgQEAKIAogCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JCisKIAl7MHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LCAvKiBtaWMvY2xmZSAqLwogCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIGxpbmUvc3Vycm91bmQgKi8KIAl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBIUCAqLwpAQCAtNzUxOCw2ICs3NzU0LDE4IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfbGVub3ZvX3NreV92ZXJic1tdID0geworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKwogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfM3N0X2hwX3ZlcmJzW10gPSB7CiAJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogRnJvbnQ6IG91dHB1dCAwICgweDBjKSAqLwogCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIFJlYXIgOiBvdXRwdXQgMSAoMHgwZCkgKi8KQEAgLTc1NTUsNyArNzgwMyw3IEBACiBzdGF0aWMgdm9pZCBhbGM4ODhfbGVub3ZvX21zNzE5NV9mcm9udF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKICAJdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0gCisKICAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOwogCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNCwgSERBX09VVFBVVCwgMCwKQEAgLTc1NjgsNyArNzgxNiw3IEBACiBzdGF0aWMgdm9pZCBhbGM4ODhfbGVub3ZvX21zNzE5NV9yY2FfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAgCXVuc2lnbmVkIGludCBwcmVzZW50OwotIAorCiAgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTQsIDAsCiAJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKIAlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTUsIEhEQV9PVVRQVVQsIDAsCkBAIC03NTk4LDcgKzc4NDYsNyBAQAogc3RhdGljIHZvaWQgYWxjODgzX21lZGlvbl9tZDJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAgCXVuc2lnbmVkIGludCBwcmVzZW50OwotIAorCiAgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTQsIDAsCiAJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKIAlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTUsIEhEQV9PVVRQVVQsIDAsCkBAIC03NzUzLDcgKzgwMDEsNyBAQAogc3RhdGljIHZvaWQgYWxjODgzX2FjZXJfYXNwaXJlX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLSAKKwogIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAogCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CiAJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE1LCBIREFfT1VUUFVULCAwLApAQCAtNzc5MCw3ICs4MDM4LDcgQEAKIHN0YXRpYyB2b2lkIGFsYzg4OF82c3RfZGVsbF9mcm9udF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKICAJdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0gCisKICAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKIAkJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKIAlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTQsIEhEQV9PVVRQVVQsIDAsCkBAIC03ODE0LDYgKzgwNjIsNTAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzg4OF9sZW5vdm9fc2t5X2Zyb250X2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBtdXRlOworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFiLCAwLCBBQ19WRVJCX1NFVF9QSU5fU0VOU0UsIDApOworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApOworCXByZXNlbnQgPSAocHJlc2VudCAmIDB4ODAwMDAwMDApICE9IDA7CisJaWYgKHByZXNlbnQpIHsKKwkJLyogbXV0ZSBpbnRlcm5hbCBzcGVha2VyICovCisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKKwkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDE1LCBIREFfT1VUUFVULCAwLAorCQkJCQkgSERBX0FNUF9NVVRFLCBIREFfQU1QX01VVEUpOworCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTYsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSBIREFfQU1QX01VVEUsIEhEQV9BTVBfTVVURSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNywgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKKwkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDFhLCBIREFfT1VUUFVULCAwLAorCQkJCQkgSERBX0FNUF9NVVRFLCBIREFfQU1QX01VVEUpOworCX0gZWxzZSB7CisJCS8qIHVubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGlmIG5lY2Vzc2FyeSAqLworCQltdXRlID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgMHgxYiwgMCwgSERBX09VVFBVVCwgMCk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNSwgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNiwgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNywgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxYSwgSERBX09VVFBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfTVVURSwgbXV0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM4ODNfbGVub3ZvX3NreV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsYzg4OF9sZW5vdm9fc2t5X2Zyb250X2F1dG9tdXRlKGNvZGVjKTsKK30KKwogLyoKICAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKICAqLwpAQCAtNzg5OCw2ICs4MTkwLDEwNSBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODg4X2FzdXNfbTkwdl92ZXJic1tdID0geworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJLyogZW5hYmxlIHVuc29saWNpdGVkIGV2ZW50ICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHZvaWQgYWxjODgzX25iX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTgsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIDB4NzAwMCB8ICgweDAwIDw8IDgpIHwgKHByZXNlbnQgPyAwIDogMHg4MCkpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkgICAgMHg3MDAwIHwgKDB4MDEgPDwgOCkgfCAocHJlc2VudCA/IDB4ODAgOiAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M19NOTBWX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJJiBBQ19QSU5TRU5TRV9QUkVTRU5DRTsKKwliaXRzID0gcHJlc2VudCA/IDAgOiBQSU5fT1VUOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDE1LCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkgICAgYml0cyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNiwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJICAgIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODNfbW9kZTJfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCit7CisJc3dpdGNoIChyZXMgPj4gMjYpIHsKKwljYXNlIEFMQzg4MF9IUF9FVkVOVDoKKwkJYWxjODgzX005MFZfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKKwkJYWxjODgzX25iX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjODgzX21vZGUyX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzg4M19NOTBWX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzg4M19uYl9taWNfYXV0b211dGUoY29kZWMpOworfQorCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hc3VzX2VlZTE2MDFfdmVyYnNbXSA9IHsKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MGJ9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsICAweDA4Mzh9LAorCS8qIGVuYWJsZSB1bnNvbGljaXRlZCBldmVudCAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgdm9pZCBhbGM4ODNfZWVlMTYwMV9zcGVha2VyX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTQsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApCisJCSYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisJYml0cyA9IHByZXNlbnQgPyAwIDogUElOX09VVDsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFiLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkgICAgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M19lZWUxNjAxX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTEM4ODBfSFBfRVZFTlQ6CisJCWFsYzg4M19lZWUxNjAxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M19lZWUxNjAxX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzg4M19lZWUxNjAxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworfQorCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogI2RlZmluZSBhbGM4ODNfbG9vcGJhY2tzCWFsYzg4MF9sb29wYmFja3MKICNlbmRpZgpAQCAtNzkyNyw2ICs4MzE4LDcgQEAKIAlbQUxDODgzX0xFTk9WT18xMDFFXzJjaF0gPSAibGVub3ZvLTEwMWUiLAogCVtBTEM4ODNfTEVOT1ZPX05CMDc2M10JPSAibGVub3ZvLW5iMDc2MyIsCiAJW0FMQzg4OF9MRU5PVk9fTVM3MTk1X0RJR10gPSAibGVub3ZvLW1zNzE5NS1kaWciLAorCVtBTEM4ODhfTEVOT1ZPX1NLWV0gPSAibGVub3ZvLXNreSIsCiAJW0FMQzg4M19IQUlFUl9XNjZdIAk9ICJoYWllci13NjYiLAogCVtBTEM4ODhfM1NUX0hQXQkJPSAiM3N0YWNrLWhwIiwKIAlbQUxDODg4XzZTVF9ERUxMXQk9ICI2c3RhY2stZGVsbCIsCkBAIC03OTQyLDE4ICs4MzM0LDIxIEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA2YywgIkFjZXIgQXNwaXJlIDk4MTAiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMTAsICJBY2VyIEFzcGlyZSIsIEFMQzg4M19BQ0VSX0FTUElSRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDExMiwgIkFjZXIgQXNwaXJlIDkzMDMiLCBBTEM4ODNfQUNFUl9BU1BJUkUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMjEsICJBY2VyIEFzcGlyZSA1OTIwRyIsIEFMQzg4M19BQ0VSX0FTUElSRSksIAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMjEsICJBY2VyIEFzcGlyZSA1OTIwRyIsIEFMQzg4M19BQ0VSX0FTUElSRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDAsICJBY2VyIGxhcHRvcCIsIEFMQzg4M19BQ0VSKSwgLyogZGVmYXVsdCBBY2VyICovCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDIwZCwgIkRlbGwgSW5zcGlyb24gNTMwIiwgQUxDODg4XzZTVF9ERUxMKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTNkLCAiSFAgUGF2aWxsaW9uIiwgQUxDODgzXzZTVF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNGYsICJIUCBTYW1iYSIsIEFMQzg4OF8zU1RfSFApLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNjAsICJIUCBMdWNrbm93IiwgQUxDODg4XzNTVF9IUCksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE2MSwgIkhQIE5ldHRsZSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODczLCAiQXN1cyBNOTBWIiwgQUxDODg4X0FTVVNfTTkwViksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI0OSwgIkFzdXMgTTJBLVZNIEhETUkiLCBBTEM4ODNfM1NUXzZjaF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzNWYsICJBc3VzIEVlZSAxNjAxIiwgQUxDODg4X0FTVVNfRUVFMTYwMSksCiAJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4MGNlOCwgIkZveGNvbm4gUDM1QVgtUyIsIEFMQzg4M182U1RfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHg2NjY4LCAiRm94Y29ubiIsIEFMQzg4M182U1RfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA3MSwgMHg4MjUzLCAiTWl0YWMgODI1MmQiLCBBTEM4ODNfTUlUQUMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDcxLCAweDgyNTgsICJFdmVzaGFtIFZveWFlZ2VyIiwgQUxDODgzX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBmMSwgMHgyMzUwLCAiVFlBTi1TMjM1MCIsIEFMQzg4OF82U1RfREVMTCksCiAJU05EX1BDSV9RVUlSSygweDEwOGUsIDB4NTM0ZCwgTlVMTCwgQUxDODgzXzNTVF82Y2gpLAogCVNORF9QQ0lfUVVJUksoMHgxNDU4LCAweGEwMDIsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MDM0OSwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKQEAgLTc5ODksNiArODM4NCw3IEBACiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjA4NSwgIkxlbm92byBOQjA3NjMiLCBBTEM4ODNfTEVOT1ZPX05CMDc2MyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmYywgIkxlbm92byBOQjA3NjMiLCBBTEM4ODNfTEVOT1ZPX05CMDc2MyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmZCwgIkxlbm92byBOQjA3NjMiLCBBTEM4ODNfTEVOT1ZPX05CMDc2MyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MTAxZCwgIkxlbm92byBTa3kiLCBBTEM4ODhfTEVOT1ZPX1NLWSksCiAJU05EX1BDSV9RVUlSSygweDE3YzAsIDB4NDA3MSwgIk1FRElPTiBNRDIiLCBBTEM4ODNfTUVESU9OX01EMiksCiAJU05EX1BDSV9RVUlSSygweDE3ZjIsIDB4NTAwMCwgIkFsYmF0cm9uIEtJNjkwLUFNMiIsIEFMQzg4M182U1RfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTk5MSwgMHg1NjI1LCAiSGFpZXIgVzY2IiwgQUxDODgzX0hBSUVSX1c2NiksCkBAIC04MTI4LDcgKzg1MjQsNyBAQAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKIAkJLnVuc29sX2V2ZW50ID0gYWxjODgzX21lZGlvbl9tZDJfdW5zb2xfZXZlbnQsCiAJCS5pbml0X2hvb2sgPSBhbGM4ODNfbWVkaW9uX21kMl9hdXRvbXV0ZSwKLQl9LAkKKwl9LAogCVtBTEM4ODNfTEFQVE9QX0VBUERdID0gewogCQkubWl4ZXJzID0geyBhbGM4ODNfYmFzZV9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4Ml9lYXBkX3ZlcmJzIH0sCkBAIC04MjQ1LDYgKzg2NDEsNDkgQEAKIAkJLnVuc29sX2V2ZW50ID0gYWxjODgzXzJjaF9mdWppdHN1X3BpMjUxNV91bnNvbF9ldmVudCwKIAkJLmluaXRfaG9vayA9IGFsYzg4M18yY2hfZnVqaXRzdV9waTI1MTVfYXV0b211dGUsCiAJfSwKKwlbQUxDODg4X0xFTk9WT19TS1ldID0geworCQkubWl4ZXJzID0geyBhbGM4ODhfbGVub3ZvX3NreV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4OF9sZW5vdm9fc2t5X3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfc2l4c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzX3NpeHN0YWNrX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvX3NreV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgzX2xlbm92b19za3lfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODhfbGVub3ZvX3NreV9mcm9udF9hdXRvbXV0ZSwKKwl9LAorCVtBTEM4ODhfQVNVU19NOTBWXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODhfYXN1c19tOTB2X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODNfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19mdWppdHN1X3BpMjUxNV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgzX21vZGUyX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODgzX21vZGUyX2luaXRob29rLAorCX0sCisJW0FMQzg4OF9BU1VTX0VFRTE2MDFdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfYXN1c19lZWUxNjAxX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODg4X2FzdXNfZWVlMTYwMV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCisJCS5kaWdfaW5fbmlkID0gQUxDODgzX0RJR0lOX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfYXN1c19lZWUxNjAxX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4ODNfZWVlMTYwMV91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4M19lZWUxNjAxX2luaXRob29rLAorCX0sCiB9OwogCiAKQEAgLTgzNTQsNyArODc5Myw3IEBACiAJYWxjODgzX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOwogCWFsYzg4M19hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKIAlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCQlhbGNfaW5pdGhvb2soY29kZWMpOwogfQogCiBzdGF0aWMgaW50IHBhdGNoX2FsYzg4MyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTgzOTgsOCArODgzNywxMyBAQAogCiAJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJY2FzZSAweDEwZWMwODg4OgotCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDODg4IEFuYWxvZyI7Ci0JCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiQUxDODg4IERpZ2l0YWwiOworCQlpZiAoY29kZWMtPnJldmlzaW9uX2lkID09IDB4MTAwMTAxKSB7CisJCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDMTIwMCBBbmFsb2ciOworCQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJBTEMxMjAwIERpZ2l0YWwiOworCQl9IGVsc2UgeworCQkJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIkFMQzg4OCBBbmFsb2ciOworCQkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJBTEM4ODggRGlnaXRhbCI7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSAweDEwZWMwODg5OgogCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDODg5IEFuYWxvZyI7CkBAIC04NDUyLDYgKzg4OTYsMTMgQEAKICNkZWZpbmUgYWxjMjYyX21vZGVzCQlhbGMyNjBfbW9kZXMKICNkZWZpbmUgYWxjMjYyX2NhcHR1cmVfc291cmNlCWFsYzg4Ml9jYXB0dXJlX3NvdXJjZQogCitzdGF0aWMgaGRhX25pZF90IGFsYzI2Ml9kbWljX2FkY19uaWRzWzFdID0geworCS8qIEFEQzAgKi8KKwkweDA5Cit9OworCitzdGF0aWMgaGRhX25pZF90IGFsYzI2Ml9kbWljX2NhcHNyY19uaWRzWzFdID0geyAweDIyIH07CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfYmFzZV9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCkBAIC04ODMzLDEwICs5Mjg0LDEwIEBACiAJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCiAJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCi0JCisKIAl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JCisKIAkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KIAkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KIAkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KQEAgLTg4NTgsNiArOTMwOSwxMiBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfZWFwZF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX2hpcHBvX3Vuc29sX3ZlcmJzW10gPSB7CiAJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCkBAIC04ODg0LDYgKzkzNDEsOTEgQEAKIAl7fQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2Ml9kbWljX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiSW50IERNaWMiLCAweDkgfSwKKwkJeyAiTWljIiwgMHgwIH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfdG9zaGliYV9zMDZfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogVGhlIG11bHRpcGxlICJDYXB0dXJlIFNvdXJjZSIgY29udHJvbHMgY29uZnVzZSBhbHNhbWl4ZXIKKwkJICogU28gY2FsbCBzb21ld2hhdCBkaWZmZXJlbnQuLgorCQkgKi8KKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90b3NoaWJhX3MwNl92ZXJic1tdID0geworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwOX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIGFsYzI2Ml9kbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxOCwgMCwKKwkJCQkJQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMiwgMCwKKwkJCQlBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgcHJlc2VudCA/IDB4MCA6IDB4MDkpOworfQorCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjJfdG9zaGliYV9zMDZfc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLAorCQkJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IDAgOiBQSU5fT1VUOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MTQsIDAsCisJCQkJCUFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgYml0cyk7Cit9CisKKworCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjJfdG9zaGliYV9zMDZfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKKwkJYWxjMjYyX3Rvc2hpYmFfczA2X3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQorCQlhbGMyNjJfZG1pY19hdXRvbXV0ZShjb2RlYyk7CisKK30KKworc3RhdGljIHZvaWQgYWxjMjYyX3Rvc2hpYmFfczA2X2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGMyNjJfdG9zaGliYV9zMDZfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJYWxjMjYyX2RtaWNfYXV0b211dGUoY29kZWMpOworfQorCiAvKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwogc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtODk0OCw2ICs5NDkwLDQxIEBACiB9CiAKIC8qCisgKiBuZWMgbW9kZWwKKyAqICAweDE1ID0gaGVhZHBob25lCisgKiAgMHgxNiA9IGludGVybmFsIHNwZWFrZXIKKyAqICAweDE4ID0gZXh0ZXJuYWwgbWljCisgKi8KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9uZWNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDAsIDB4MCwgSERBX09VVFBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfbmVjX3ZlcmJzW10gPSB7CisJLyogVW5tdXRlIFNwZWFrZXIgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJLyogSGVhZHBob25lICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogRXh0ZXJuYWwgbWljIHRvIGhlYWRwaG9uZSAqLworCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwkvKiBFeHRlcm5hbCBtaWMgdG8gc3BlYWtlciAqLworCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7fQorfTsKKworLyoKICAqIGZ1aml0c3UgbW9kZWwKICAqICAweDE0ID0gaGVhZHBob25lL3NwZGlmLW91dCwgMHgxNSA9IGludGVybmFsIHNwZWFrZXIsCiAgKiAgMHgxYiA9IHBvcnQgcmVwbGljYXRvciBoZWFkcGhvbmUgb3V0CkBAIC05MTc5LDYgKzk3NTYsMjUgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX3Rvc2hpYmFfcngxX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2Ml9mdWppdHN1X2JpbmRfbWFzdGVyX3ZvbCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2luZm8sCisJCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfZ2V0LAorCQkucHV0ID0gYWxjMjYyX3NvbnlfbWFzdGVyX3N3X3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTUsIDMsIDAsIEhEQV9PVVRQVVQpLAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKIC8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyBmb3IgQmVucSBsYXB0b3BzICovCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9FQVBEX3ZlcmJzW10gPSB7CiAJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LApAQCAtOTQyNyw3ICsxMDAyMyw3IEBACiAJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCiAJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCiAJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JCisKIAkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCiAJLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwogCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKQEAgLTk0ODIsNyArMTAwNzgsNyBAQAogCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCiAJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKICAgICAgICAgezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDYpfSwKLQkKKwogCS8qCiAJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQogCSAqLwpAQCAtOTY0Myw2ICsxMDIzOSwyNCBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfdG9zaGliYV9yeDFfdW5zb2xfdmVyYnNbXSA9IHsKKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogRnJvbnQgU3BlYWtlciAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisKKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCS8qIE1JQyBqYWNrICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAkvKiBGcm9udCBNSUMgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKSB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIH0sCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFAgfSwJLyogSFAgIGphY2sgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7fQorfTsKKworCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogI2RlZmluZSBhbGMyNjJfbG9vcGJhY2tzCWFsYzg4MF9sb29wYmFja3MKICNlbmRpZgpAQCAtOTcxMSw3ICsxMDMyNSw3IEBACiAJYWxjMjYyX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOwogCWFsYzI2Ml9hdXRvX2luaXRfaW5wdXRfc3JjKGNvZGVjKTsKIAlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCQlhbGNfaW5pdGhvb2soY29kZWMpOwogfQogCiAvKgpAQCAtOTcyOSwxMyArMTAzNDMsMTcgQEAKIAlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKIAlbQUxDMjYyX0JFTlFfVDMxXQk9ICJiZW5xLXQzMSIsCiAJW0FMQzI2Ml9TT05ZX0FTU0FNRF0JPSAic29ueS1hc3NhbWQiLAorCVtBTEMyNjJfVE9TSElCQV9TMDZdCT0gInRvc2hpYmEtczA2IiwKKwlbQUxDMjYyX1RPU0hJQkFfUlgxXQk9ICJ0b3NoaWJhLXJ4MSIsCiAJW0FMQzI2Ml9VTFRSQV0JCT0gInVsdHJhIiwKIAlbQUxDMjYyX0xFTk9WT18zMDAwXQk9ICJsZW5vdm8tMzAwMCIsCisJW0FMQzI2Ml9ORUNdCQk9ICJuZWMiLAogCVtBTEMyNjJfQVVUT10JCT0gImF1dG8iLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2Ml9jZmdfdGJsW10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwMDIsIDB4NDM3YiwgIkhpcHBvIiwgQUxDMjYyX0hJUFBPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzMywgMHg4ODk1LCAiTkVDIFZlcnNhIFM5MTAwIiwgQUxDMjYyX05FQyksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MTJmZSwgIkhQIHh3OTQwMCIsIEFMQzI2Ml9IUF9CUEMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDEyZmYsICJIUCB4dzQ1NTAiLCBBTEMyNjJfSFBfQlBDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxMzA2LCAiSFAgeHc4NjAwIiwgQUxDMjYyX0hQX0JQQyksCkBAIC05NzY0LDcgKzEwMzgyLDggQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDBlLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMTUsICJTb255IDB4OTAxNSIsIEFMQzI2Ml9TT05ZX0FTU0FNRCksCiAJU05EX1BDSV9RVUlSSygweDExNzksIDB4MDAwMSwgIlRvc2hpYmEgZHluYWJvb2sgU1MgUlgxIiwKLQkJICAgICAgQUxDMjYyX1NPTllfQVNTQU1EKSwKKwkJICAgICAgQUxDMjYyX1RPU0hJQkFfUlgxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjdiLCAiVG9zaGliYSBTMDYiLCBBTEMyNjJfVE9TSElCQV9TMDYpLAogCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDEzOTcsICJGdWppdHN1IiwgQUxDMjYyX0ZVSklUU1UpLAogCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE0MmQsICJGdWppdHN1IExpZmVib29rIEU4NDEwIiwgQUxDMjYyX0ZVSklUU1UpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwMzIsICJTYW1zdW5nIFExIFVsdHJhIiwgQUxDMjYyX1VMVFJBKSwKQEAgLTk5MTgsNyArMTA1MzcsNyBAQAogCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKIAkJLnVuc29sX2V2ZW50ID0gYWxjMjYyX2hpcHBvX3Vuc29sX2V2ZW50LAogCQkuaW5pdF9ob29rID0gYWxjMjYyX2hpcHBvX2F1dG9tdXRlLAotCX0sCQorCX0sCiAJW0FMQzI2Ml9VTFRSQV0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml91bHRyYV9taXhlciwgYWxjMjYyX3VsdHJhX2NhcHR1cmVfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml91bHRyYV92ZXJicyB9LApAQCAtOTk0Niw2ICsxMDU2NSw0MyBAQAogCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9mdWppdHN1X2NhcHR1cmVfc291cmNlLAogCQkudW5zb2xfZXZlbnQgPSBhbGMyNjJfbGVub3ZvXzMwMDBfdW5zb2xfZXZlbnQsCiAJfSwKKwlbQUxDMjYyX05FQ10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9uZWNfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9uZWNfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDMjYyX1RPU0hJQkFfUzA2XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjYyX3Rvc2hpYmFfczA2X21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3Rvc2hpYmFfczA2X3ZlcmJzLAorCQkJCQkJCWFsYzI2Ml9lYXBkX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmNhcHNyY19uaWRzID0gYWxjMjYyX2RtaWNfY2Fwc3JjX25pZHMsCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmFkY19uaWRzID0gYWxjMjYyX2RtaWNfYWRjX25pZHMsIC8qIEFEQzAgKi8KKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9kbWljX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjJfdG9zaGliYV9zMDZfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGMyNjJfdG9zaGliYV9zMDZfaW5pdF9ob29rLAorCX0sCisJW0FMQzI2Ml9UT1NISUJBX1JYMV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml90b3NoaWJhX3J4MV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml90b3NoaWJhX3J4MV91bnNvbF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjMjYyX2hpcHBvX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjMjYyX2hpcHBvX2F1dG9tdXRlLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHBhdGNoX2FsYzI2MihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTEwMDA0LDcgKzEwNjYwLDcgQEAKIAlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDMjYyIEFuYWxvZyI7CiAJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGMyNjJfcGNtX2FuYWxvZ19wbGF5YmFjazsKIAlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjMjYyX3BjbV9hbmFsb2dfY2FwdHVyZTsKLQkJCisKIAlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIkFMQzI2MiBEaWdpdGFsIjsKIAlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGMyNjJfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CiAJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGMyNjJfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKQEAgLTEwMDQwLDcgKzEwNjk2LDcgQEAKIAlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCiAJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGMyNjJfbG9vcGJhY2tzOwogI2VuZGlmCi0JCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDQ5LDcgKzEwNzA1LDcgQEAKICAqLwogI2RlZmluZSBBTEMyNjhfRElHT1VUX05JRAlBTEM4ODBfRElHT1VUX05JRAogI2RlZmluZSBhbGMyNjhfbW9kZXMJCWFsYzI2MF9tb2RlcwotCQorCiBzdGF0aWMgaGRhX25pZF90IGFsYzI2OF9kYWNfbmlkc1syXSA9IHsKIAkvKiBmcm9udCwgaHAgKi8KIAkweDAyLCAweDAzCkBAIC0xMDEwOSw2ICsxMDc2NSwxNCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjhfYWNlcl9sY19jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgImktTWljIiwgMHg2IH0sCisJCXsgIkUtTWljIiwgMHgwIH0sCisJfSwKK307CisKIC8qIEFjZXIgc3BlY2lmaWMgKi8KIC8qIGJpbmQgdm9sdW1lcyBvZiBib3RoIE5JRCAweDAyIGFuZCAweDAzICovCiBzdGF0aWMgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjMjY4X2FjZXJfYmluZF9tYXN0ZXJfdm9sID0gewpAQCAtMTAxNjEsNiArMTA4MjUsMjEgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2FjZXJfYXNwaXJlX29uZV9taXhlcltdID0geworCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2luZm8sCisJCS5nZXQgPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfZ2V0LAorCQkucHV0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYWNlcl9taXhlcltdID0gewogCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCiAJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCkBAIC0xMDE3OCw2ICsxMDg1NywxNiBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfYWNlcl9hc3BpcmVfb25lX3ZlcmJzW10gPSB7CisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNn0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YTAxN30sCisJeyB9Cit9OworCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9hY2VyX3ZlcmJzW10gPSB7CiAJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwgLyogaW50ZXJuYWwgZG1pYz8gKi8KIAl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LApAQCAtMTAxODUsNyArMTA4NzQsNiBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAogCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAogCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCiAJezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDODgwX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAogCXsgfQogfTsKQEAgLTEwMjEyLDYgKzEwOTAwLDQ3IEBACiAJYWxjMjY4X2FjZXJfYXV0b211dGUoY29kZWMsIDEpOwogfQogCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjhfYXNwaXJlX29uZV9zcGVha2VyX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsCisJCQkJQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJYml0cyA9IHByZXNlbnQgPyBBTVBfSU5fTVVURSgwKSA6IDA7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBmLCBIREFfSU5QVVQsIDAsCisJCQkJQU1QX0lOX01VVEUoMCksIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwZiwgSERBX0lOUFVULCAxLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKK30KKworCitzdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE4LCAwLAorCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAorCQkJICAgIHByZXNlbnQgPyAweDAgOiAweDYpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9sY191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGMyNjhfYXNwaXJlX29uZV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX01JQ19FVkVOVCkKKwkJYWxjMjY4X2FjZXJfbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY4X2FjZXJfbGNfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzI2OF9hc3BpcmVfb25lX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzI2OF9hY2VyX21pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfZGVsbF9taXhlcltdID0gewogCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCiAJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtMTAzNjAsNyArMTEwODksNyBAQAogCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCiAKIAkvKiBVbm11dGUgU2VsZWN0b3IgMjNoLDI0aCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbiAqLwotCQorCiAJezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKIAl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDI0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCkBAIC0xMDU1OSw3ICsxMTI4OCw3IEBACiAKIAluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbMF07CiAJaWYgKG5pZCkKLQkJYWxjMjY4X25ld19hbmFsb2dfb3V0cHV0KHNwZWMsIG5pZCwgIkZyb250IiwgMCk7CQorCQlhbGMyNjhfbmV3X2FuYWxvZ19vdXRwdXQoc3BlYywgbmlkLCAiRnJvbnQiLCAwKTsKIAogCW5pZCA9IGNmZy0+c3BlYWtlcl9waW5zWzBdOwogCWlmIChuaWQgPT0gMHgxZCkgewpAQCAtMTA1ODEsNyArMTEzMTAsNyBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCXJldHVybiAwOwkKKwlyZXR1cm4gMDsKIH0KIAogLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KQEAgLTEwNjAyLDcgKzExMzMxLDcgQEAKIAkJY2FzZSAweDFhOgogCQkJaWR4MSA9IDI7CS8qIExpbmUgSW4gKi8KIAkJCWJyZWFrOwotCQljYXNlIDB4MWM6CQorCQljYXNlIDB4MWM6CiAJCQlpZHgxID0gMzsJLyogQ0QgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MTI6CkBAIC0xMDYxNCw3ICsxMTM0Myw3IEBACiAJCX0KIAkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IGF1dG9fcGluX2NmZ19sYWJlbHNbaV07CiAJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHgxOwotCQlpbXV4LT5udW1faXRlbXMrKzsJCisJCWltdXgtPm51bV9pdGVtcysrOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEwNjQ0LDExICsxMTM3MywxMSBAQAogCX0KIAogCWRhY192b2wxID0gZGFjX3ZvbDIgPSAweGIwMDAgfCAweDQwOwkvKiBzZXQgbWF4IHZvbHVtZSAgKi8KLQlpZiAobGluZV9uaWQgPT0gMHgxNCkJCisJaWYgKGxpbmVfbmlkID09IDB4MTQpCiAJCWRhY192b2wyID0gQU1QX09VVF9aRVJPOwogCWVsc2UgaWYgKGxpbmVfbmlkID09IDB4MTUpCiAJCWRhY192b2wxID0gQU1QX09VVF9aRVJPOwotCWlmIChocF9uaWQgPT0gMHgxNCkJCisJaWYgKGhwX25pZCA9PSAweDE0KQogCQlkYWNfdm9sMiA9IEFNUF9PVVRfWkVSTzsKIAllbHNlIGlmIChocF9uaWQgPT0gMHgxNSkKIAkJZGFjX3ZvbDEgPSBBTVBfT1VUX1pFUk87CkBAIC0xMDcyOCw3ICsxMTQ1Nyw3IEBACiAJYWxjMjY4X2F1dG9faW5pdF9tb25vX3NwZWFrZXJfb3V0KGNvZGVjKTsKIAlhbGMyNjhfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CiAJaWYgKHNwZWMtPnVuc29sX2V2ZW50KQotCQlhbGNfc2t1X2F1dG9tdXRlKGNvZGVjKTsKKwkJYWxjX2luaXRob29rKGNvZGVjKTsKIH0KIAogLyoKQEAgLTEwNzM5LDYgKzExNDY4LDcgQEAKIAlbQUxDMjY4XzNTVF0JCT0gIjNzdGFjayIsCiAJW0FMQzI2OF9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKIAlbQUxDMjY4X0FDRVJdCQk9ICJhY2VyIiwKKwlbQUxDMjY4X0FDRVJfQVNQSVJFX09ORV0JPSAiYWNlci1hc3BpcmUiLAogCVtBTEMyNjhfREVMTF0JCT0gImRlbGwiLAogCVtBTEMyNjhfWkVQVE9dCQk9ICJ6ZXB0byIsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwpAQCAtMTA3NTMsMTEgKzExNDgzLDE0IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyZSwgIkFjZXIgQXNwaXJlIDUzMTAiLCBBTEMyNjhfQUNFUiksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzMCwgIkFjZXIgRXh0ZW5zYSA1MjEwIiwgQUxDMjY4X0FDRVIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMzYsICJBY2VyIEFzcGlyZSA1MzE1IiwgQUxDMjY4X0FDRVIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWIsICJBY2VyIEFzcGlyZSBPbmUiLAorCQkJCQkJQUxDMjY4X0FDRVJfQVNQSVJFX09ORSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDI1MywgIkRlbGwgT0VNIiwgQUxDMjY4X0RFTEwpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwY2MsICJUT1NISUJBIiwgQUxDMjY4X1RPU0hJQkEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzI2OF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMTAsICJUT1NISUJBIEEyMDUiLCBBTEMyNjhfVE9TSElCQSksCiAJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY1MCwgIlRPU0hJQkEgQTMwNSIsIEFMQzI2OF9UT1NISUJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjY0LCAiVE9TSElCQSBMMzA1IiwgQUxDMjY4X1RPU0hJQkEpLAogCVNORF9QQ0lfUVVJUksoMHgxNGMwLCAweDAwMjUsICJDT01QQUwgSUZMOTAvSkZMLTkyIiwgQUxDMjY4X1RPU0hJQkEpLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3NjMsICJEaXZlcnNlIChDUFIyMDAwKSIsIEFMQzI2OF9BQ0VSKSwKIAlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwNzcxLCAiUXVhbnRhIElMMSIsIEFMQzI2N19RVUFOVEFfSUwxKSwKQEAgLTEwODMwLDYgKzExNTYzLDIzIEBACiAJCS51bnNvbF9ldmVudCA9IGFsYzI2OF9hY2VyX3Vuc29sX2V2ZW50LAogCQkuaW5pdF9ob29rID0gYWxjMjY4X2FjZXJfaW5pdF9ob29rLAogCX0sCisJW0FMQzI2OF9BQ0VSX0FTUElSRV9PTkVdID0geworCQkubWl4ZXJzID0geyBhbGMyNjhfYWNlcl9hc3BpcmVfb25lX21peGVyLAorCQkJCWFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCisJCQkJYWxjMjY4X2FjZXJfYXNwaXJlX29uZV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCisJCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCisJCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9hY2VyX2xjX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjhfYWNlcl9sY191bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzI2OF9hY2VyX2xjX2luaXRfaG9vaywKKwl9LAogCVtBTEMyNjhfREVMTF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2OF9kZWxsX21peGVyLCBhbGMyNjhfYmVlcF9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCkBAIC0xMDk3NCw3ICsxMTcyNCw3IEBACiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEMyNjhfQVVUTykKIAkJc3BlYy0+aW5pdF9ob29rID0gYWxjMjY4X2F1dG9faW5pdDsKLQkJCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5OTAsNiArMTE3NDAsMTQgQEAKIAkweDA4LAogfTsKIAorc3RhdGljIGhkYV9uaWRfdCBhbGMyNjlfY2Fwc3JjX25pZHNbMV0gPSB7CisJMHgyMywKK307CisKKy8qIE5PVEU6IEFEQzIgKDB4MDcpIGlzIGNvbm5lY3RlZCBmcm9tIGEgcmVjb3JkaW5nICpNSVhFUiogKDB4MjQpLAorICogICAgICAgbm90IGEgbXV4IQorICovCisKIHN0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjlfZWVlcGNfZG1pY19jYXB0dXJlX3NvdXJjZSA9IHsKIAkubnVtX2l0ZW1zID0gMiwKIAkuaXRlbXMgPSB7CkBAIC0xMTAxNiw2ICsxMTc3NCw4IEBACiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4NCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKQEAgLTExMDI1LDYgKzExNzg1LDI4IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OV9xdWFudGFfZmwxX21peGVyW10gPSB7CisJLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjY4X2FjZXJfYmluZF9tYXN0ZXJfdm9sKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCisJCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJeyB9Cit9OworCiAvKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwYyBhbmQgMHgwZCAqLwogc3RhdGljIHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2OV9lcGNfYmluZF92b2wgPSB7CiAJLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLApAQCAtMTEwNjgsNiArMTE4NTAsMTY1IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorLyogYmVlcCBjb250cm9sICovCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X2JlZXBfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJCZWVwIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4NCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDQsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfcXVhbnRhX2ZsMV92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJeyB9Cit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsCisJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IEFNUF9JTl9NVVRFKDApIDogMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMCwKKwkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMSwKKwkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCisJCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2ZsMV9taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE4LCAwLAorCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIHByZXNlbnQgPyAweDAgOiAweDEpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2ZsMV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX01JQ19FVkVOVCkKKwkJYWxjMjY5X3F1YW50YV9mbDFfbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzI2OV9xdWFudGFfZmwxX21pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2VlZXBjX2RtaWNfaW5pdF92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA1fSwKKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMTkgfCAoMHgwMCA8PCA4KSl9LAorCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2VlZXBjX2FtaWNfaW5pdF92ZXJic1tdID0geworCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXt9Cit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGMyNjlfc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLAorCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWJpdHMgPSBwcmVzZW50ID8gQU1QX0lOX01VVEUoMCkgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAwLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMSwKKwkJCQlBTVBfSU5fTVVURSgwKSwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2OV9lZWVwY19kbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxOCwgMCwKKwkJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLAorCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAgKHByZXNlbnQgPyAwIDogNSkpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfZWVlcGNfYW1pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTgsIDAsCisJCQkJQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyNCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkweDcwMDAgfCAoMHgwMCA8PCA4KSB8IChwcmVzZW50ID8gMCA6IDB4ODApKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDI0LCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCTB4NzAwMCB8ICgweDAxIDw8IDgpIHwgKHByZXNlbnQgPyAweDgwIDogMCkpOworfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCBhbGMyNjlfZWVlcGNfZG1pY191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKKwkJYWxjMjY5X3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCisJaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9NSUNfRVZFTlQpCisJCWFsYzI2OV9lZWVwY19kbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworc3RhdGljIHZvaWQgYWxjMjY5X2VlZXBjX2RtaWNfaW5pdGhvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjMjY5X3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzI2OV9lZWVwY19kbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKworLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLworc3RhdGljIHZvaWQgYWxjMjY5X2VlZXBjX2FtaWNfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCisJCWFsYzI2OV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKworCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQorCQlhbGMyNjlfZWVlcGNfYW1pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2OV9lZWVwY19hbWljX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzI2OV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlhbGMyNjlfZWVlcGNfYW1pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKIC8qCiAgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCiAgKi8KQEAgLTExMDc1LDcgKzEyMDE2LDcgQEAKIAkvKgogCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCiAJICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAogCS8qIE11dGUgaW5wdXQgYW1wcyAoUENCZWVwLCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUKIAkgKiBhbmFsb2ctbG9vcGJhY2sgbWl4ZXIgd2lkZ2V0CkBAIC0xMTEyNyw4ICsxMjA2OCw4IEBACiAJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCiAJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFkLCAwYiAqLwogCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAogCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCiAJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKIApAQCAtMTExMzgsOTggKzEyMDc5LDYgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2VlZXBjX2RtaWNfaW5pdF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA1fSwKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMTkgfCAoMHgwMCA8PCA4KSl9LAotCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2VlZXBjX2FtaWNfaW5pdF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAotCXt9Ci19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGMyNjlfc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQl1bnNpZ25lZCBpbnQgYml0czsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTUsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKLQliaXRzID0gcHJlc2VudCA/IEFNUF9JTl9NVVRFKDApIDogMDsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMCwKLQkJCQkgQU1QX0lOX01VVEUoMCksIGJpdHMpOwotCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAxLAotCQkJCSBBTVBfSU5fTVVURSgwKSwgYml0cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OV9lZWVwY19kbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCi0JcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxOCwgMCwgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKQotCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLAotCQkJICAgIHByZXNlbnQgPyAwIDogNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OV9lZWVwY19hbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCi0JcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxOCwgMCwgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKQotCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCi0JCQkgICAgcHJlc2VudCA/IEFNUF9JTl9VTk1VVEUoMCkgOiBBTVBfSU5fTVVURSgwKSk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyNCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCSAgICBwcmVzZW50ID8gQU1QX0lOX01VVEUoMSkgOiBBTVBfSU5fVU5NVVRFKDEpKTsKLX0KLQotLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLwotc3RhdGljIHZvaWQgYWxjMjY5X2VlZXBjX2RtaWNfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJCSAgdW5zaWduZWQgaW50IHJlcykKLXsKLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQotCQlhbGMyNjlfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7Ci0KLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX01JQ19FVkVOVCkKLQkJYWxjMjY5X2VlZXBjX2RtaWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfZWVlcGNfZG1pY19pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGMyNjlfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7Ci0JYWxjMjY5X2VlZXBjX2RtaWNfYXV0b211dGUoY29kZWMpOwotfQotCi0vKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCi1zdGF0aWMgdm9pZCBhbGMyNjlfZWVlcGNfYW1pY191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfSFBfRVZFTlQpCi0JCWFsYzI2OV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQotCWlmICgocmVzID4+IDI2KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQotCQlhbGMyNjlfZWVlcGNfYW1pY19hdXRvbXV0ZShjb2RlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OV9lZWVwY19hbWljX2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlhbGMyNjlfZWVlcGNfYW1pY19hdXRvbXV0ZShjb2RlYyk7Ci19Ci0KIC8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCiBzdGF0aWMgaW50IGFsYzI2OV9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCiAJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQpAQCAtMTEzMzAsNyArMTIxNzksNyBAQAogc3RhdGljIGludCBhbGMyNjlfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGVycjsKKwlpbnQgaSwgZXJyOwogCXN0YXRpYyBoZGFfbmlkX3QgYWxjMjY5X2lnbm9yZVtdID0geyAweDFkLCAwIH07CiAKIAllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKQEAgLTExMzUzLDkgKzEyMjAyLDIwIEBACiAJaWYgKHNwZWMtPmtjdGxfYWxsb2MpCiAJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKIAorCS8qIGNyZWF0ZSBhIGJlZXAgbWl4ZXIgY29udHJvbCBpZiB0aGUgcGluIDB4MWQgaXNuJ3QgYXNzaWduZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnMpOyBpKyspCisJCWlmIChzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbaV0gPT0gMHgxZCkKKwkJCWJyZWFrOworCWlmIChpID49IEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zKSkKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBhbGMyNjlfYmVlcF9taXhlcjsKKwogCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10gPSBhbGMyNjlfaW5pdF92ZXJiczsKIAlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwogCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJLyogc2V0IGRlZmF1bHQgaW5wdXQgc291cmNlICovCisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgYWxjMjY5X2NhcHNyY19uaWRzWzBdLAorCQkJCSAgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCisJCQkJICBzcGVjLT5pbnB1dF9tdXgtPml0ZW1zWzBdLmluZGV4KTsKIAogCWVyciA9IGFsY19hdXRvX2FkZF9taWNfYm9vc3QoY29kZWMpOwogCWlmIChlcnIgPCAwKQpAQCAtMTEzODAsMjEgKzEyMjQwLDI3IEBACiAJYWxjMjY5X2F1dG9faW5pdF9ocF9vdXQoY29kZWMpOwogCWFsYzI2OV9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKIAlpZiAoc3BlYy0+dW5zb2xfZXZlbnQpCi0JCWFsY19za3VfYXV0b211dGUoY29kZWMpOworCQlhbGNfaW5pdGhvb2soY29kZWMpOwogfQogCiAvKgogICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyICphbGMyNjlfbW9kZWxzW0FMQzI2OV9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDMjY5X0JBU0lDXQkJPSAiYmFzaWMiLAorCVtBTEMyNjlfQkFTSUNdCQkJPSAiYmFzaWMiLAorCVtBTEMyNjlfUVVBTlRBX0ZMMV0JCT0gInF1YW50YSIsCisJW0FMQzI2OV9BU1VTX0VFRVBDX1A3MDNdCT0gImVlZXBjLXA3MDMiLAorCVtBTEMyNjlfQVNVU19FRUVQQ19QOTAxXQk9ICJlZWVwYy1wOTAxIgogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmOCwgIlF1YW50YSBGTDEiLCBBTEMyNjlfUVVBTlRBX0ZMMSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMzMCwgIkFTVVMgRWVlcGMgUDcwMyBQOTAwQSIsCiAJCSAgICAgIEFMQzI2OV9BU1VTX0VFRVBDX1A3MDMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgzMWEsICJBU1VTIEVlZXBjIFA5MDEiLAogCQkgICAgICBBTEMyNjlfQVNVU19FRUVQQ19QOTAxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzRhLCAiQVNVUyBFZWVwYyBTMTAxIiwKKwkJICAgICAgQUxDMjY5X0FTVVNfRUVFUENfUDkwMSksCiAJe30KIH07CiAKQEAgLTExNDA5LDYgKzEyMjc1LDE4IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjY5X2NhcHR1cmVfc291cmNlLAogCX0sCisJW0FMQzI2OV9RVUFOVEFfRkwxXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjMjY5X3F1YW50YV9mbDFfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLCBhbGMyNjlfcXVhbnRhX2ZsMV92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjMjY5X3F1YW50YV9mbDFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGMyNjlfcXVhbnRhX2ZsMV9pbml0X2hvb2ssCisJfSwKIAlbQUxDMjY5X0FTVVNfRUVFUENfUDcwM10gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2OV9lZWVwY19taXhlciwgYWxjMjY5X2VwY19jYXB0dXJlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywKQEAgLTExNDg4LDYgKzEyMzY2LDcgQEAKIAogCXNwZWMtPmFkY19uaWRzID0gYWxjMjY5X2FkY19uaWRzOwogCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2FkY19uaWRzKTsKKwlzcGVjLT5jYXBzcmNfbmlkcyA9IGFsYzI2OV9jYXBzcmNfbmlkczsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwogCWlmIChib2FyZF9jb25maWcgPT0gQUxDMjY5X0FVVE8pCkBAIC0xMTY4OSw3ICsxMjU2OCw3IEBACiAJSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQkKKwogICAgICAgICAvKkNhcHR1cmUgbWl4ZXIgY29udHJvbCAqLwogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKQEAgLTExODMyLDIwICsxMjcxMSwyMCBAQAogCS8qIHJvdXRlIGZyb250IG1pYyB0byBBREMxKi8KIAl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQkKKwogCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLwogCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkKKwogCS8qIFVubXV0ZSBNaXhlciAxNCAobWljKSAxYyAoTGluZSBpbikqLwogCXsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKICAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkKKwogCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LApAQCAtMTE5MDEsMTMgKzEyNzgwLDEzIEBACiAJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JCisKIAkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KIAl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAogCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAgICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JCisKIAkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKQEAgLTExOTYzLDEzICsxMjg0MiwxMyBAQAogCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCQorCiAJLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCiAJezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKICAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCQorCiAJLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCkBAIC0xMjAzNCw3ICsxMjkxMyw3IEBACiAgICAgICAgIHsweDAxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKICAgICAgICAgezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkKKwogCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LApAQCAtMTIwNzEsMjAgKzEyOTUwLDIwIEBACiAJICovCiAJLyogezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgKi8KIAl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JCisKIAkvKiBVbm11dGUgREFDMH4zICYgc3BkaWYgb3V0Ki8KIAl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKIAl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCQorCiAJLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCiAJezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAogCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQkKKwogCS8qIFVubXV0ZSBTdGVyZW8gTWl4ZXIgMTUgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LApAQCAtMTI0NDIsNyArMTMzMjEsNyBAQAogCWFsYzg2MV9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKIAlhbGM4NjFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CiAJaWYgKHNwZWMtPnVuc29sX2V2ZW50KQotCQlhbGNfc2t1X2F1dG9tdXRlKGNvZGVjKTsKKwkJYWxjX2luaXRob29rKGNvZGVjKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKQEAgLTEyNjU5LDcgKzEzNTM4LDcgQEAKIAlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCiAJCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSBhbGM4NjFfbG9vcGJhY2tzOwogI2VuZGlmCi0JCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTEzLDcgKzEzNzkyLDcgQEAKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJBVEFQSSBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJBVEFQSSBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCQorCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTMwNTgsNyArMTM5MzcsNyBAQAogCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNSl9LAogCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAkKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAogCXt9CiB9OwogCkBAIC0xMzEyMCw3ICsxMzk5OSw3IEBACiAJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKIAl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JCisKIAl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKIAl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LApAQCAtMTMxNDUsNyArMTQwMjQsNyBAQAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCiAKIAl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCQorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAogCiAJeyB9IC8qIGVuZCAqLwpAQCAtMTMzMDQsNyArMTQxODMsNyBAQAogCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2hwX2NhcHR1cmVfc291cmNlLAogCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9kYWxsYXNfdW5zb2xfZXZlbnQsCiAJCS5pbml0X2hvb2sgPSBhbGM4NjF2ZF9kYWxsYXNfYXV0b211dGUsCi0JfSwJCQorCX0sCiB9OwogCiAvKgpAQCAtMTM1NTQsNyArMTQ0MzMsNyBAQAogCWFsYzg2MXZkX2F1dG9faW5pdF9hbmFsb2dfaW5wdXQoY29kZWMpOwogCWFsYzg2MXZkX2F1dG9faW5pdF9pbnB1dF9zcmMoY29kZWMpOwogCWlmIChzcGVjLT51bnNvbF9ldmVudCkKLQkJYWxjX3NrdV9hdXRvbXV0ZShjb2RlYyk7CisJCWFsY19pbml0aG9vayhjb2RlYyk7CiB9CiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWxjODYxdmQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0xMzg4MywxMyArMTQ3NjIsMTIwIEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAyLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAzLCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfb25lX2JpbmRfc3dpdGNoID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCisJCTAKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M19tNTF2YV9taXhlcltdID0geworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAorCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX29uZV9iaW5kX3N3aXRjaCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfdHJlZV9iaW5kX3N3aXRjaCA9IHsKKwkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTUsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjEsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfdHdvX2hwX20xX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCksCisJSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfdHJlZV9iaW5kX3N3aXRjaCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGLU1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkYtTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c19mb3VyX2JpbmRfc3dpdGNoID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAorCS52YWx1ZXMgPSB7CisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCisJCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxYiwgMywgMCwgSERBX09VVFBVVCksCisJCTAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M190d29faHBfbTJfbWl4ZXJbXSA9IHsKKwlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKKwlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19mb3VyX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfMWJqZF9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190d29fYmluZF9tYXN0ZXJfdm9sID0geworCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKKwkudmFsdWVzID0geworCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDQsIDMsIDAsIEhEQV9PVVRQVVQpLAorCQkwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2ggPSB7CisJLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCisJLnZhbHVlcyA9IHsKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLCBIREFfT1VUUFVUKSwKKwkJMAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX2FzdXNfMjFqZF9jbGZlX21peGVyW10gPSB7CisJSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkmYWxjNjYzX2FzdXNfdHdvX2JpbmRfbWFzdGVyX3ZvbCksCisJSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfdHdvX2JpbmRfc3dpdGNoKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDIzLCAweDksIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M19hc3VzXzE1amRfY2xmZV9taXhlcltdID0geworCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAorCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX3R3b19iaW5kX3N3aXRjaCksCisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTQwNzQsMTcgKzE1MDYwLDg0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tNTF2YV9pbml0X3ZlcmJzW10gPSB7CisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAogCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KLQotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQorCXsweDIxLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoOSl9LAogCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCiAJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAogCXt9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJic1tdID0geworCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfMWJqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfMTVqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfTUlDX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX3R3b19ocF9hbWljX20xX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCS8qIEhlYWRwaG9uZSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCS8qIEhlYWRwaG9uZSAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCisJezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfdHdvX2hwX2FtaWNfbTJfaW5pdF92ZXJic1tdID0geworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX2c3MXZfaW5pdF92ZXJic1tdID0gewogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJLyogezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwgKi8KQEAgLTE0MTEwLDYgKzE1MTYzLDE0IEBACiAJe30KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2Vjc19pbml0X3ZlcmJzW10gPSB7CisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAxZn0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7fQorfTsKKwogLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9jYXB0dXJlX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCkBAIC0xNDEyOSw2ICsxNTE5MCwxMiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKIHN0YXRpYyB2b2lkIGFsYzY2Ml9sZW5vdm9fMTAxZV9pc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKQEAgLTE0MjA5LDEyICsxNTI3NiwxMiBAQAogCWlmIChwcmVzZW50KSB7CiAJCS8qIG11dGUgaW50ZXJuYWwgc3BlYWtlciAqLwogCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MWIsIEhEQV9PVVRQVVQsIDAsCi0JCQkJCSBIREFfQU1QX01VVEUsIEhEQV9BTVBfTVVURSk7CisJCQkJCUhEQV9BTVBfTVVURSwgSERBX0FNUF9NVVRFKTsKIAl9IGVsc2UgewogCQkvKiB1bm11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBuZWNlc3NhcnkgKi8KIAkJbXV0ZSA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDApOwogCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MWIsIEhEQV9PVVRQVVQsIDAsCi0JCQkJCSBIREFfQU1QX01VVEUsIG11dGUpOworCQkJCQlIREFfQU1QX01VVEUsIG11dGUpOwogCX0KIH0KIApAQCAtMTQyMzcsMTEgKzE1MzA0LDEwOCBAQAogCXVuc2lnbmVkIGNoYXIgYml0czsKIAogCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MjEsIDAsCi0JCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApCi0JCSYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApCisJCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOwogCWJpdHMgPSBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMDsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MTQsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIEhEQV9BTVBfTVVURSwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBjLCBIREFfSU5QVVQsIDAsCisJCQkJQU1QX0lOX01VVEUoMCksIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAxLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgYWxjNjYzXzIxamRfdHdvX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgyMSwgMCwKKwkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJCSYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisJYml0cyA9IHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAwLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMSwKKwkJCQlBTVBfSU5fTVVURSgwKSwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBlLCBIREFfSU5QVVQsIDAsCisJCQkJQU1QX0lOX01VVEUoMCksIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwZSwgSERBX0lOUFVULCAxLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgYWxjNjYzXzE1amRfdHdvX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNSwgMCwKKwkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJCSYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisJYml0cyA9IHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAwLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMSwKKwkJCQlBTVBfSU5fTVVURSgwKSwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBlLCBIREFfSU5QVVQsIDAsCisJCQkJQU1QX0lOX01VVEUoMCksIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwZSwgSERBX0lOUFVULCAxLAorCQkJCUFNUF9JTl9NVVRFKDApLCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgYWxjNjYyX2Y1el9zcGVha2VyX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsCisJCQlBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApCisJCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOworCWJpdHMgPSBwcmVzZW50ID8gMCA6IFBJTl9PVVQ7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNCwgMCwKKwkJCSBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBhbGM2NjNfdHdvX2hwX20xX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQxLCBwcmVzZW50MjsKKworCXByZXNlbnQxID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDIxLCAwLAorCQkJQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKQorCQkJJiBBQ19QSU5TRU5TRV9QUkVTRU5DRTsKKwlwcmVzZW50MiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNSwgMCwKKwkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJCSYgQUNfUElOU0VOU0VfUFJFU0VOQ0U7CisKKwlpZiAocHJlc2VudDEgfHwgcHJlc2VudDIpIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgxNCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMCk7CisJfSBlbHNlIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgxNCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM2NjNfdHdvX2hwX20yX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQxLCBwcmVzZW50MjsKKworCXByZXNlbnQxID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFiLCAwLAorCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOworCXByZXNlbnQyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLAorCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkKKwkJCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOworCisJaWYgKHByZXNlbnQxIHx8IHByZXNlbnQyKSB7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAwLAorCQkJCUFNUF9JTl9NVVRFKDApLCBBTVBfSU5fTVVURSgwKSk7CisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgwYywgSERBX0lOUFVULCAxLAorCQkJCUFNUF9JTl9NVVRFKDApLCBBTVBfSU5fTVVURSgwKSk7CisJfSBlbHNlIHsKKwkJc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCAweDBjLCBIREFfSU5QVVQsIDAsCisJCQkJQU1QX0lOX01VVEUoMCksIDApOworCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGMsIEhEQV9JTlBVVCwgMSwKKwkJCQlBTVBfSU5fTVVURSgwKSwgMCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhbGM2NjNfbTUxdmFfbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTQyNDksMTYgKzE1NDEzLDE2IEBACiAJdW5zaWduZWQgaW50IHByZXNlbnQ7CiAKIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE4LCAwLAotCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKQotCQkmIEFDX1BJTlNFTlNFX1BSRVNFTkNFOworCQkJQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKQorCQkJJiBBQ19QSU5TRU5TRV9QUkVTRU5DRTsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDIyLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJICAgIDB4NzAwMCB8ICgweDAwIDw8IDgpIHwgKHByZXNlbnQgPyAwIDogMHg4MCkpOworCQkJMHg3MDAwIHwgKDB4MDAgPDwgOCkgfCAocHJlc2VudCA/IDAgOiAweDgwKSk7CiAJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMHgyMywgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKLQkJCSAgICAweDcwMDAgfCAoMHgwMCA8PCA4KSB8IChwcmVzZW50ID8gMCA6IDB4ODApKTsKKwkJCTB4NzAwMCB8ICgweDAwIDw8IDgpIHwgKHByZXNlbnQgPyAwIDogMHg4MCkpOwogCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4MjIsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCi0JCQkgICAgMHg3MDAwIHwgKDB4MDkgPDwgOCkgfCAocHJlc2VudCA/IDB4ODAgOiAwKSk7CisJCQkweDcwMDAgfCAoMHgwOSA8PCA4KSB8IChwcmVzZW50ID8gMHg4MCA6IDApKTsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDIzLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJICAgIDB4NzAwMCB8ICgweDA5IDw8IDgpIHwgKHByZXNlbnQgPyAweDgwIDogMCkpOworCQkJMHg3MDAwIHwgKDB4MDkgPDwgOCkgfCAocHJlc2VudCA/IDB4ODAgOiAwKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzY2M19tNTF2YV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKQEAgLTE0MjgwLDYgKzE1NDQ0LDEyMSBAQAogCWFsYzY2M19tNTF2YV9taWNfYXV0b211dGUoY29kZWMpOwogfQogCisvKiAqKioqKioqKioqKioqKioqKiBNb2RlMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCit7CisJc3dpdGNoIChyZXMgPj4gMjYpIHsKKwljYXNlIEFMQzg4MF9IUF9FVkVOVDoKKwkJYWxjNjYzX201MXZhX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwljYXNlIEFMQzg4MF9NSUNfRVZFTlQ6CisJCWFsYzY2Ml9lZWVwY19taWNfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlMV9pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM2NjNfbTUxdmFfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJYWxjNjYyX2VlZXBjX21pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisvKiAqKioqKioqKioqKioqKioqKiBNb2RlMiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhbGM2NjJfbW9kZTJfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgIHVuc2lnbmVkIGludCByZXMpCit7CisJc3dpdGNoIChyZXMgPj4gMjYpIHsKKwljYXNlIEFMQzg4MF9IUF9FVkVOVDoKKwkJYWxjNjYyX2Y1el9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgorCQlhbGM2NjJfZWVlcGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM2NjJfbW9kZTJfaW5pdGhvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjNjYyX2Y1el9zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwlhbGM2NjJfZWVlcGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKK30KKy8qICoqKioqKioqKioqKioqKioqIE1vZGUzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlM191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlzd2l0Y2ggKHJlcyA+PiAyNikgeworCWNhc2UgQUxDODgwX0hQX0VWRU5UOgorCQlhbGM2NjNfdHdvX2hwX20xX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwljYXNlIEFMQzg4MF9NSUNfRVZFTlQ6CisJCWFsYzY2Ml9lZWVwY19taWNfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2M19tb2RlM19pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM2NjNfdHdvX2hwX20xX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzY2Ml9lZWVwY19taWNfYXV0b211dGUoY29kZWMpOworfQorLyogKioqKioqKioqKioqKioqKiogTW9kZTQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYzX21vZGU0X3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTEM4ODBfSFBfRVZFTlQ6CisJCWFsYzY2M18yMWpkX3R3b19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgorCQlhbGM2NjJfZWVlcGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTRfaW5pdGhvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjNjYzXzIxamRfdHdvX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzY2Ml9lZWVwY19taWNfYXV0b211dGUoY29kZWMpOworfQorLyogKioqKioqKioqKioqKioqKiogTW9kZTUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYzX21vZGU1X3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTEM4ODBfSFBfRVZFTlQ6CisJCWFsYzY2M18xNWpkX3R3b19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgorCQlhbGM2NjJfZWVlcGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTVfaW5pdGhvb2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjNjYzXzE1amRfdHdvX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOworCWFsYzY2Ml9lZWVwY19taWNfYXV0b211dGUoY29kZWMpOworfQorLyogKioqKioqKioqKioqKioqKiogTW9kZTYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWxjNjYzX21vZGU2X3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXN3aXRjaCAocmVzID4+IDI2KSB7CisJY2FzZSBBTEM4ODBfSFBfRVZFTlQ6CisJCWFsYzY2M190d29faHBfbTJfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKKwkJYWxjNjYyX2VlZXBjX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjNjYzX21vZGU2X2luaXRob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWFsYzY2M190d29faHBfbTJfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7CisJYWxjNjYyX2VlZXBjX21pY19hdXRvbXV0ZShjb2RlYyk7Cit9CisKIHN0YXRpYyB2b2lkIGFsYzY2M19nNzF2X2hwX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXVuc2lnbmVkIGludCBwcmVzZW50OwpAQCAtMTQzNTAsNiArMTU2MjksNDYgQEAKIAlhbGM2NjJfZWVlcGNfbWljX2F1dG9tdXRlKGNvZGVjKTsKIH0KIAorLyogYmluZCBocCBhbmQgaW50ZXJuYWwgc3BlYWtlciBtdXRlICh3aXRoIHBsdWcgY2hlY2spICovCitzdGF0aWMgaW50IGFsYzY2Ml9lY3NfbWFzdGVyX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwlpbnQgY2hhbmdlOworCisJY2hhbmdlID0gc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFiLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCQkgIEhEQV9BTVBfTVVURSwKKwkJCQkJICB2YWxwWzBdID8gMCA6IEhEQV9BTVBfTVVURSk7CisJY2hhbmdlIHw9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYiwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAgSERBX0FNUF9NVVRFLAorCQkJCQkgICB2YWxwWzFdID8gMCA6IEhEQV9BTVBfTVVURSk7CisJaWYgKGNoYW5nZSkKKwkJYWxjMjYyX2hpcHBvMV9hdXRvbXV0ZShjb2RlYyk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lY3NfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCisJCS5wdXQgPSBhbGM2NjJfZWNzX21hc3Rlcl9zd19wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKKwl9LAorCisJSERBX0NPREVDX1ZPTFVNRSgiZS1NaWMvTGluZUluIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJlLU1pYy9MaW5lSW4gUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJlLU1pYy9MaW5lSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiaS1NaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoImktTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiaS1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAjZGVmaW5lIGFsYzY2Ml9sb29wYmFja3MJYWxjODgwX2xvb3BiYWNrcwogI2VuZGlmCkBAIC0xNDM3MiwyMSArMTU2OTEsNjggQEAKIAlbQUxDNjYyX0xFTk9WT18xMDFFXQk9ICJsZW5vdm8tMTAxZSIsCiAJW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gImVlZXBjLXA3MDEiLAogCVtBTEM2NjJfQVNVU19FRUVQQ19FUDIwXSA9ICJlZWVwYy1lcDIwIiwKKwlbQUxDNjYyX0VDU10gPSAiZWNzIiwKIAlbQUxDNjYzX0FTVVNfTTUxVkFdID0gIm01MXZhIiwKIAlbQUxDNjYzX0FTVVNfRzcxVl0gPSAiZzcxdiIsCiAJW0FMQzY2M19BU1VTX0gxM10gPSAiaDEzIiwKIAlbQUxDNjYzX0FTVVNfRzUwVl0gPSAiZzUwdiIsCisJW0FMQzY2M19BU1VTX01PREUxXSA9ICJhc3VzLW1vZGUxIiwKKwlbQUxDNjYyX0FTVVNfTU9ERTJdID0gImFzdXMtbW9kZTIiLAorCVtBTEM2NjNfQVNVU19NT0RFM10gPSAiYXN1cy1tb2RlMyIsCisJW0FMQzY2M19BU1VTX01PREU0XSA9ICJhc3VzLW1vZGU0IiwKKwlbQUxDNjYzX0FTVVNfTU9ERTVdID0gImFzdXMtbW9kZTUiLAorCVtBTEM2NjNfQVNVU19NT0RFNl0gPSAiYXN1cy1tb2RlNiIsCiAJW0FMQzY2Ml9BVVRPXQkJPSAiYXV0byIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjNjYyX2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWMzLCAiQVNVUyBHNzFWIiwgQUxDNjYzX0FTVVNfRzcxViksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3OCwgIkFTVVMgTTUxVkEiLCBBTEM2NjNfQVNVU19NNTFWQSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgTTUxVkEiLCBBTEM2NjNfQVNVU19HNTBWKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWEzLCAiQVNVUyBHNTBWIiwgQUxDNjYzX0FTVVNfRzUwViksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODI5MCwgIkFTVVMgUDVHQy1NWCIsIEFMQzY2Ml8zU1RfNmNoX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODJhMSwgIkFTVVMgRWVlcGMiLCBBTEM2NjJfQVNVU19FRUVQQ19QNzAxKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MmQxLCAiQVNVUyBFZWVwYyBFUDIwIiwgQUxDNjYyX0FTVVNfRUVFUENfRVAyMCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkwMywgIkFTVVMgRjVHTCIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODc4LCAiQVNVUyBNNTBWciIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDAwLCAiQVNVUyBONTBWbSIsIEFMQzY2M19BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyBGN1oiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk1MywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFkMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTllMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk5MywgIkFTVVMgTjIwIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YzMsICJBU1VTIEY1Wi9GNngiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkxMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg0MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTgxMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFmMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3NiwgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg2NCwgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc4MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc1MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZjMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkzMywgIkFTVVMgRjgwUSIsIEFMQzY2Ml9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODkzLCAiQVNVUyBNNTBWbSIsIEFMQzY2M19BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWMzLCAiQVNVUyBNNzBWIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NjMsICJBU1VTIFg3MUMiLCBBTEM2NjNfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5NCwgIkFTVVMgWDU1IiwgQUxDNjYzX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwOTIsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ZjMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MjMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MzMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjMsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjUsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBkNDcsICJGb3hjb25uIDQ1Q01YLzQ1R01YLzQ1Q01YLUsiLAorCQkgICAgICBBTEM2NjJfM1NUXzZjaF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDEwMWUsICJMZW5vdm8iLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRUNTKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwY2Q2LCAiRm94Y29ubiIsIEFMQzY2Ml9FQ1MpLAorCVNORF9QQ0lfUVVJUksoMHgxNDU4LCAweGEwMDIsICJHaWdhYnl0ZSA5NDVHQ00tUzJMIiwKKwkJICAgICAgQUxDNjYyXzNTVF82Y2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2NSwgMHg4MjBmLCAiQmlvc3RhciBUQTc4MEcgTTIrIiwgQUxDNjYyXzNTVF82Y2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgzNjYyLCAiQVNST0NLIEsxME43OEZ1bGxIRC1oU0xJIFIzLjAiLAorCQkJCQlBTEM2NjJfM1NUXzZjaF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDIwMDAsICJBU1VTIEgxMy0yMDAwIiwgQUxDNjYzX0FTVVNfSDEzKSwKIAlTTkRfUENJX1FVSVJLKDB4MTg1NCwgMHgyMDAxLCAiQVNVUyBIMTMtMjAwMSIsIEFMQzY2M19BU1VTX0gxMyksCiAJU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MjAwMiwgIkFTVVMgSDEzLTIwMDIiLCBBTEM2NjNfQVNVU19IMTMpLApAQCAtMTQ0NzcsNiArMTU4NDMsMTggQEAKIAkJLnVuc29sX2V2ZW50ID0gYWxjNjYyX2VlZXBjX2VwMjBfdW5zb2xfZXZlbnQsCiAJCS5pbml0X2hvb2sgPSBhbGM2NjJfZWVlcGNfZXAyMF9pbml0aG9vaywKIAl9LAorCVtBTEM2NjJfRUNTXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyX2Vjc19taXhlciwgYWxjNjYyX2NhcHR1cmVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2Ml9lY3NfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9lZWVwY19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjNjYyX2VlZXBjX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjNjYyX2VlZXBjX2luaXRob29rLAorCX0sCiAJW0FMQzY2M19BU1VTX001MVZBXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyLCBhbGM2NjJfY2FwdHVyZV9taXhlcn0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYzX201MXZhX2luaXRfdmVyYnMgfSwKQEAgLTE0NTI0LDYgKzE1OTAyLDkxIEBACiAJCS51bnNvbF9ldmVudCA9IGFsYzY2M19nNTB2X3Vuc29sX2V2ZW50LAogCQkuaW5pdF9ob29rID0gYWxjNjYzX2c1MHZfaW5pdGhvb2ssCiAJfSwKKwlbQUxDNjYzX0FTVVNfTU9ERTFdID0geworCQkubWl4ZXJzID0geyBhbGM2NjNfbTUxdmFfbWl4ZXIsIGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2VlZXBjX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM2NjNfbW9kZTFfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM2NjNfbW9kZTFfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYyX0FTVVNfTU9ERTJdID0geworCQkubWl4ZXJzID0geyBhbGM2NjJfMWJqZF9taXhlciwgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYyXzFiamRfYW1pY19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9lZWVwY19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjNjYyX21vZGUyX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjNjYyX21vZGUyX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX01PREUzXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX3R3b19ocF9tMV9taXhlciwgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzX3R3b19ocF9hbWljX20xX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9lZWVwY19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjNjYzX21vZGUzX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjNjYzX21vZGUzX2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX01PREU0XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMjFqZF9jbGZlX21peGVyLAorCQkJCWFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXJ9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCisJCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAorCQkuaHBfbmlkID0gMHgwMywKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9lZWVwY19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjNjYzX21vZGU0X3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjNjYzX21vZGU0X2luaXRob29rLAorCX0sCisJW0FMQzY2M19BU1VTX01PREU1XSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMTVqZF9jbGZlX21peGVyLAorCQkJCWFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAorCQkJCWFsYzY2M18xNWpkX2FtaWNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2VlZXBjX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM2NjNfbW9kZTVfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM2NjNfbW9kZTVfaW5pdGhvb2ssCisJfSwKKwlbQUxDNjYzX0FTVVNfTU9ERTZdID0geworCQkubWl4ZXJzID0geyBhbGM2NjNfdHdvX2hwX20yX21peGVyLCBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKKwkJCQlhbGM2NjNfdHdvX2hwX2FtaWNfbTJfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2VlZXBjX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM2NjNfbW9kZTZfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM2NjNfbW9kZTZfaW5pdGhvb2ssCisJfSwKIH07CiAKIApAQCAtMTQ1NjAsMTUgKzE2MDIzLDE1IEBACiAJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwKIAkJCQkJICAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAxLCAwLAogCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwKIAkJCQkJICAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLAogCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKQEAgLTE0NTgwLDkgKzE2MDQzLDkgQEAKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwotCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIG5hbWUsCi0JCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDIsCi0JCQkJCQkJICAgICAgSERBX0lOUFVUKSk7CisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwoYWxjODgwX2lkeF90b19taXhlcihpKSwKKwkJCQkJCSAgICAzLCAwLCBIREFfSU5QVVQpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTE0Nzc3LDcgKzE2MjQwLDcgQEAKIAogCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7CiAJc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eDsKLQkKKwogCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10gPSBhbGM2NjJfYXV0b19pbml0X3ZlcmJzOwogCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzA2NjMpCiAJCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10gPQpAQCAtMTQ4MDEsNyArMTYyNjQsNyBAQAogCWFsYzY2Ml9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKIAlhbGM2NjJfYXV0b19pbml0X2lucHV0X3NyYyhjb2RlYyk7CiAJaWYgKHNwZWMtPnVuc29sX2V2ZW50KQotCQlhbGNfc2t1X2F1dG9tdXRlKGNvZGVjKTsKKwkJYWxjX2luaXRob29rKGNvZGVjKTsKIH0KIAogc3RhdGljIGludCBwYXRjaF9hbGM2NjIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0xNDg0Niw2ICsxNjMwOSw5IEBACiAJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2MykgewogCQlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDNjYzIEFuYWxvZyI7CiAJCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiQUxDNjYzIERpZ2l0YWwiOworCX0gZWxzZSBpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwMjcyKSB7CisJCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJBTEMyNzIgQW5hbG9nIjsKKwkJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJBTEMyNzIgRGlnaXRhbCI7CiAJfSBlbHNlIHsKIAkJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIkFMQzY2MiBBbmFsb2ciOwogCQlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIkFMQzY2MiBEaWdpdGFsIjsKQEAgLTE0ODgzLDYgKzE2MzQ5LDcgQEAKIAl7IC5pZCA9IDB4MTBlYzAyNjcsIC5uYW1lID0gIkFMQzI2NyIsIC5wYXRjaCA9IHBhdGNoX2FsYzI2OCB9LAogCXsgLmlkID0gMHgxMGVjMDI2OCwgLm5hbWUgPSAiQUxDMjY4IiwgLnBhdGNoID0gcGF0Y2hfYWxjMjY4IH0sCiAJeyAuaWQgPSAweDEwZWMwMjY5LCAubmFtZSA9ICJBTEMyNjkiLCAucGF0Y2ggPSBwYXRjaF9hbGMyNjkgfSwKKwl7IC5pZCA9IDB4MTBlYzAyNzIsIC5uYW1lID0gIkFMQzI3MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAogCXsgLmlkID0gMHgxMGVjMDg2MSwgLnJldiA9IDB4MTAwMzQwLCAubmFtZSA9ICJBTEM2NjAiLAogCSAgLnBhdGNoID0gcGF0Y2hfYWxjODYxIH0sCiAJeyAuaWQgPSAweDEwZWMwNjYwLCAubmFtZSA9ICJBTEM2NjAtVkQiLCAucGF0Y2ggPSBwYXRjaF9hbGM4NjF2ZCB9LApAQCAtMTQ4OTYsMTAgKzE2MzYzLDE1IEBACiAJeyAuaWQgPSAweDEwZWMwODgwLCAubmFtZSA9ICJBTEM4ODAiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODAgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODIsIC5uYW1lID0gIkFMQzg4MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAogCXsgLmlkID0gMHgxMGVjMDg4MywgLm5hbWUgPSAiQUxDODgzIiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCisJeyAuaWQgPSAweDEwZWMwODg1LCAucmV2ID0gMHgxMDAxMDEsIC5uYW1lID0gIkFMQzg4OUEiLAorCSAgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sIC8qIHNob3VsZCBiZSBwYXRjaF9hbGM4ODMoKSBpbiBmdXR1cmUgKi8KIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5yZXYgPSAweDEwMDEwMywgLm5hbWUgPSAiQUxDODg5QSIsCiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwgLyogc2hvdWxkIGJlIHBhdGNoX2FsYzg4MygpIGluIGZ1dHVyZSAqLwogCXsgLmlkID0gMHgxMGVjMDg4NSwgLm5hbWUgPSAiQUxDODg1IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCisJeyAuaWQgPSAweDEwZWMwODg3LCAubmFtZSA9ICJBTEM4ODciLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODgsIC5uYW1lID0gIkFMQzg4OCIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAorCXsgLmlkID0gMHgxMGVjMDg4OCwgLnJldiA9IDB4MTAwMTAxLCAubmFtZSA9ICJBTEMxMjAwIiwKKwkgIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAogCXsgLmlkID0gMHgxMGVjMDg4OSwgLm5hbWUgPSAiQUxDODg5IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwppbmRleCBhZDk5NGZjLi5hMmFjNzIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCkBAIC0zMywxMCArMzMsMTIgQEAKICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKICNpbmNsdWRlICJoZGFfcGF0Y2guaCIKKyNpbmNsdWRlICJoZGFfYmVlcC5oIgogCiAjZGVmaW5lIE5VTV9DT05UUk9MX0FMTE9DCTMyCiAjZGVmaW5lIFNUQUNfUFdSX0VWRU5UCQkweDIwCiAjZGVmaW5lIFNUQUNfSFBfRVZFTlQJCTB4MzAKKyNkZWZpbmUgU1RBQ19WUkVGX0VWRU5UCQkweDQwCiAKIGVudW0gewogCVNUQUNfUkVGLApAQCAtNzEsOSArNzMsMTUgQEAKIH07CiAKIGVudW0geworCVNUQUNfOTJIRDgzWFhYX1JFRiwKKwlTVEFDXzkySEQ4M1hYWF9NT0RFTFMKK307CisKK2VudW0gewogCVNUQUNfOTJIRDcxQlhYX1JFRiwKIAlTVEFDX0RFTExfTTRfMSwKIAlTVEFDX0RFTExfTTRfMiwKKwlTVEFDX0hQX000LAogCVNUQUNfOTJIRDcxQlhYX01PREVMUwogfTsKIApAQCAtMTA0LDYgKzExMiw3IEBACiAJU1RBQ19NQUNCT09LX1BST19WMiwKIAlTVEFDX0lNQUNfSU5URUwsCiAJU1RBQ19JTUFDX0lOVEVMXzIwLAorCVNUQUNfRUNTXzIwMiwKIAlTVEFDXzkyMlhfREVMTF9EODEsCiAJU1RBQ185MjJYX0RFTExfRDgyLAogCVNUQUNfOTIyWF9ERUxMX004MSwKQEAgLTEzMCw2ICsxMzksNyBAQAogCXVuc2lnbmVkIGludCBtaWNfc3dpdGNoOiAxOwogCXVuc2lnbmVkIGludCBhbHRfc3dpdGNoOiAxOwogCXVuc2lnbmVkIGludCBocF9kZXRlY3Q6IDE7CisJdW5zaWduZWQgaW50IHNwZGlmX211dGU6IDE7CiAKIAkvKiBncGlvIGxpbmVzICovCiAJdW5zaWduZWQgaW50IGVhcGRfbWFzazsKQEAgLTEzOCwxNyArMTQ4LDIyIEBACiAJdW5zaWduZWQgaW50IGdwaW9fZGF0YTsKIAl1bnNpZ25lZCBpbnQgZ3Bpb19tdXRlOwogCisJLyogc3RyZWFtICovCisJdW5zaWduZWQgaW50IHN0cmVhbV9kZWxheTsKKwogCS8qIGFuYWxvZyBsb29wYmFjayAqLwogCXVuc2lnbmVkIGNoYXIgYWxvb3BiYWNrX21hc2s7CiAJdW5zaWduZWQgY2hhciBhbG9vcGJhY2tfc2hpZnQ7CiAKIAkvKiBwb3dlciBtYW5hZ2VtZW50ICovCiAJdW5zaWduZWQgaW50IG51bV9wd3JzOworCXVuc2lnbmVkIGludCAqcHdyX21hcHBpbmc7CiAJaGRhX25pZF90ICpwd3JfbmlkczsKIAloZGFfbmlkX3QgKmRhY19saXN0OwogCiAJLyogcGxheWJhY2sgKi8KIAlzdHJ1Y3QgaGRhX2lucHV0X211eCAqbW9ub19tdXg7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmFtcF9tdXg7CiAJdW5zaWduZWQgaW50IGN1cl9tbXV4OwogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwogCWhkYV9uaWRfdCBkYWNfbmlkc1s1XTsKQEAgLTE2Miw4ICsxNzcsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2RtaWNzOwogCWhkYV9uaWRfdCAqZG11eF9uaWRzOwogCXVuc2lnbmVkIGludCBudW1fZG11eGVzOworCWhkYV9uaWRfdCAqc211eF9uaWRzOworCXVuc2lnbmVkIGludCBudW1fc211eGVzOworCWNvbnN0IGNoYXIgKipzcGRpZl9sYWJlbHM7CisKIAloZGFfbmlkX3QgZGlnX2luX25pZDsKIAloZGFfbmlkX3QgbW9ub19uaWQ7CisJaGRhX25pZF90IGFuYWJlZXBfbmlkOworCWhkYV9uaWRfdCBkaWdiZWVwX25pZDsKIAogCS8qIHBpbiB3aWRnZXRzICovCiAJaGRhX25pZF90ICpwaW5fbmlkczsKQEAgLTE4MCw2ICsyMDEsMTIgQEAKIAl1bnNpZ25lZCBpbnQgY3VyX2RtdXhbMl07CiAJc3RydWN0IGhkYV9pbnB1dF9tdXggKmlucHV0X211eDsKIAl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqc2lucHV0X211eDsKKwl1bnNpZ25lZCBpbnQgY3VyX3NtdXhbMl07CisJdW5zaWduZWQgaW50IGN1cl9hbXV4OworCWhkYV9uaWRfdCAqYW1wX25pZHM7CisJdW5zaWduZWQgaW50IG51bV9hbXBzOworCXVuc2lnbmVkIGludCBwb3dlcmRvd25fYWRjczsKIAogCS8qIGkvbyBzd2l0Y2hlcyAqLwogCXVuc2lnbmVkIGludCBpb19zd2l0Y2hbMl07CkBAIC0xOTUsNiArMjIyLDggQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bF9hbGxvYzsKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCBwcml2YXRlX2RpbXV4OwogCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfaW11eDsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCBwcml2YXRlX3NtdXg7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9hbXBfbXV4OwogCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfbW9ub19tdXg7CiB9OwogCkBAIC0yMTUsMTAgKzI0NCwxOSBAQAogCTB4MGYsIDB4MTAsIDB4MTEKIH07CiAKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3M3h4X3NsYXZlX2RpZ19vdXRzWzJdID0geworCTB4MjYsIDAsCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkNzN4eF9hZGNfbmlkc1syXSA9IHsKIAkweDFhLCAweDFiCiB9OwogCisjZGVmaW5lIERFTExfTTZfQU1QIDIKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3M3h4X2FtcF9uaWRzWzNdID0geworCTB4MGIsIDB4MGMsIDB4MGUKK307CisKICNkZWZpbmUgU1RBQzkySEQ3M1hYX05VTV9ETUlDUwkyCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkNzN4eF9kbWljX25pZHNbU1RBQzkySEQ3M1hYX05VTV9ETUlDUyArIDFdID0gewogCTB4MTMsIDB4MTQsIDAKQEAgLTIzNyw2ICsyNzUsNDEgQEAKIAkweDIwLCAweDIxLAogfTsKIAorc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDczeHhfc211eF9uaWRzWzJdID0geworCTB4MjIsIDB4MjMsCit9OworCisjZGVmaW5lIFNUQUM5MkhEODNYWFhfTlVNX0RNSUNTCTIKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ4M3h4eF9kbWljX25pZHNbU1RBQzkySEQ4M1hYWF9OVU1fRE1JQ1MgKyAxXSA9IHsKKwkweDExLCAweDEyLCAwCit9OworCisjZGVmaW5lIFNUQUM5MkhEODFfREFDX0NPVU5UIDIKKyNkZWZpbmUgU1RBQzkySEQ4M19EQUNfQ09VTlQgMworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDgzeHh4X2RhY19uaWRzW1NUQUM5MkhENzNfREFDX0NPVU5UXSA9IHsKKwkweDEzLCAweDE0LCAweDIyLAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDgzeHh4X2RtdXhfbmlkc1syXSA9IHsKKwkweDE3LCAweDE4LAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDgzeHh4X2FkY19uaWRzWzJdID0geworCTB4MTUsIDB4MTYsCit9OworCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkODN4eHhfcHdyX25pZHNbNF0gPSB7CisJMHhhLCAweGIsIDB4ZCwgMHhlLAorfTsKKworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDgzeHh4X3NsYXZlX2RpZ19vdXRzWzJdID0geworCTB4MWUsIDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YWM5MmhkODN4eHhfcHdyX21hcHBpbmdbNF0gPSB7CisJMHgwMywgMHgwYywgMHgxMCwgMHg0MCwKK307CisKIHN0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9wd3Jfbmlkc1szXSA9IHsKIAkweDBhLCAweDBkLCAweDBmCiB9OwpAQCAtMjQ5LDggKzMyMiwxMiBAQAogCTB4MWEsIDB4MWIKIH07CiAKLXN0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9kbXV4X25pZHNbMV0gPSB7Ci0JMHgxYywKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9kbXV4X25pZHNbMl0gPSB7CisJMHgxYywgMHgxZCwKK307CisKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9zbXV4X25pZHNbMl0gPSB7CisJMHgyNCwgMHgyNSwKIH07CiAKIHN0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9kYWNfbmlkc1sxXSA9IHsKQEAgLTI2Miw2ICszMzksMTAgQEAKIAkweDE4LCAweDE5LCAwCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkNzFieHhfc2xhdmVfZGlnX291dHNbMl0gPSB7CisJMHgyMiwgMAorfTsKKwogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTI1eF9hZGNfbmlkc1sxXSA9IHsKICAgICAgICAgMHgwMywKIH07CkBAIC0yOTksNiArMzgwLDEwIEBACiAgICAgICAgIDB4MTUsIDB4MTYsIDB4MTcKIH07CiAKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyN3hfc211eF9uaWRzWzFdID0geworCTB4MjEsCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5Mjd4X2RhY19uaWRzWzZdID0gewogCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDAKIH07CkBAIC0zMTIsNiArMzk3LDExIEBACiAJMHgxMywgMHgxNCwgMAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5Mjd4X3NwZGlmX2xhYmVsc1s1XSA9IHsKKwkiRGlnaXRhbCBQbGF5YmFjayIsICJBREFUIiwgIkFuYWxvZyBNdXggMSIsCisJIkFuYWxvZyBNdXggMiIsICJBbmFsb2cgTXV4IDMiCit9OworCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MjA1X2FkY19uaWRzWzJdID0gewogICAgICAgICAweDEyLCAweDEzCiB9OwpAQCAtMzI0LDYgKzQxNCwxMCBAQAogCTB4MWQsCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MjA1X3NtdXhfbmlkc1sxXSA9IHsKKwkweDIxLAorfTsKKwogI2RlZmluZSBTVEFDOTIwNV9OVU1fRE1JQ1MJMgogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTIwNV9kbWljX25pZHNbU1RBQzkyMDVfTlVNX0RNSUNTICsgMV0gPSB7CiAgICAgICAgIDB4MTcsIDB4MTgsIDAKQEAgLTM0NywxMiArNDQxLDE4IEBACiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkNzN4eF9waW5fbmlkc1sxM10gPSB7CiAJMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwKIAkweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotCTB4MTQsIDB4MWUsIDB4MjIKKwkweDE0LCAweDIyLCAweDIzCiB9OwogCi1zdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkNzFieHhfcGluX25pZHNbMTBdID0geworc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDgzeHh4X3Bpbl9uaWRzWzE0XSA9IHsKKwkweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLAorCTB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCisJMHgxZCwgMHgxZSwgMHgxZiwgMHgyMAorfTsKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF9waW5fbmlkc1sxMV0gPSB7CiAJMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwKIAkweDBmLCAweDE0LCAweDE4LCAweDE5LCAweDFlLAorCTB4MWYsCiB9OwogCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5Mjd4X3Bpbl9uaWRzWzE0XSA9IHsKQEAgLTM2Nyw2ICs0NjcsMzQgQEAKIAkweDIxLCAweDIyLAogfTsKIAorI2RlZmluZSBzdGFjOTJ4eF9hbXBfdm9sdW1lX2luZm8gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8KKworc3RhdGljIGludCBzdGFjOTJ4eF9hbXBfdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkID0gc3BlYy0+YW1wX25pZHNbc3BlYy0+Y3VyX2FtdXhdOworCisJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgXj0gZ2V0X2FtcF9uaWQoa2NvbnRyb2wpOworCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlIHw9IG5pZDsKKworCXJldHVybiBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfZ2V0KGtjb250cm9sLCB1Y29udHJvbCk7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzkyeHhfYW1wX3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5pZCA9IHNwZWMtPmFtcF9uaWRzW3NwZWMtPmN1cl9hbXV4XTsKKworCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlIF49IGdldF9hbXBfbmlkKGtjb250cm9sKTsKKwlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSB8PSBuaWQ7CisKKwlyZXR1cm4gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChrY29udHJvbCwgdWNvbnRyb2wpOworfQorCiBzdGF0aWMgaW50IHN0YWM5Mnh4X2RtdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CkBAIC0zOTcsNiArNTI1LDU4IEBACiAJCQlzcGVjLT5kbXV4X25pZHNbZG11eF9pZHhdLCAmc3BlYy0+Y3VyX2RtdXhbZG11eF9pZHhdKTsKIH0KIAorc3RhdGljIGludCBzdGFjOTJ4eF9zbXV4X2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+c2lucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IHN0YWM5Mnh4X3NtdXhfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBzbXV4X2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9zbXV4W3NtdXhfaWR4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTJ4eF9zbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqc211eCA9ICZzcGVjLT5wcml2YXRlX3NtdXg7CisJdW5zaWduZWQgaW50IHNtdXhfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaW50IGVyciwgdmFsOworCWhkYV9uaWRfdCBuaWQ7CisKKwllcnIgPSBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPnNpbnB1dF9tdXgsIHVjb250cm9sLAorCQkJc3BlYy0+c211eF9uaWRzW3NtdXhfaWR4XSwgJnNwZWMtPmN1cl9zbXV4W3NtdXhfaWR4XSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoc3BlYy0+c3BkaWZfbXV0ZSkgeworCQlpZiAoc211eF9pZHggPT0gMCkKKwkJCW5pZCA9IHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOworCQllbHNlCisJCQluaWQgPSBjb2RlYy0+c2xhdmVfZGlnX291dHNbc211eF9pZHggLSAxXTsKKwkJaWYgKHNwZWMtPmN1cl9zbXV4W3NtdXhfaWR4XSA9PSBzbXV4LT5udW1faXRlbXMgLSAxKQorCQkJdmFsID0gQU1QX09VVF9NVVRFOworCQlpZiAoc211eF9pZHggPT0gMCkKKwkJCW5pZCA9IHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOworCQllbHNlCisJCQluaWQgPSBjb2RlYy0+c2xhdmVfZGlnX291dHNbc211eF9pZHggLSAxXTsKKwkJLyogdW4vbXV0ZSBTUERJRiBvdXQgKi8KKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgdmFsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3RhYzkyeHhfbXV4X2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKQEAgLTQ1Miw2ICs2MzIsNDEgQEAKIAkJCQkgICAgIHNwZWMtPm1vbm9fbmlkLCAmc3BlYy0+Y3VyX21tdXgpOwogfQogCitzdGF0aWMgaW50IHN0YWM5Mnh4X2FtcF9tdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfaW5mbyhzcGVjLT5hbXBfbXV4LCB1aW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzkyeHhfYW1wX211eF9lbnVtX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9hbXV4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5Mnh4X2FtcF9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwgPQorCQlzbmRfaGRhX2ZpbmRfbWl4ZXJfY3RsKGNvZGVjLCAiQW1wIENhcHR1cmUgVm9sdW1lIik7CisJaWYgKCFjdGwpCisJCXJldHVybiAtRUlOVkFMOworCisJc25kX2N0bF9ub3RpZnkoY29kZWMtPmJ1cy0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfAorCQlTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmY3RsLT5pZCk7CisKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5hbXBfbXV4LCB1Y29udHJvbCwKKwkJCQkgICAgIDAsICZzcGVjLT5jdXJfYW11eCk7Cit9CisKICNkZWZpbmUgc3RhYzkyeHhfYWxvb3BiYWNrX2luZm8gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbwogCiBzdGF0aWMgaW50IHN0YWM5Mnh4X2Fsb29wYmFja19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC01NDYsOCArNzYxLDggQEAKIAl7IDB4MWYsIEFDX1ZFUkJfU0VUX1ZPTFVNRV9LTk9CX0NPTlRST0wsIDB4ZWN9LAogCS8qIHNldHVwIGF1ZGlvIGNvbm5lY3Rpb25zICovCiAJeyAweDBkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JeyAweDBhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJeyAweDBhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCiAJLyogc2V0dXAgYWRjcyB0byBwb2ludCB0byBtaXhlciAqLwogCXsgMHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MGJ9LAogCXsgMHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MGJ9LApAQCAtNjI4LDI1ICs4NDMsMzYgQEAKIAl7fQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBzdGFjOTJoZDgzeHh4X2NvcmVfaW5pdFtdID0geworCS8qIHN0YXJ0IG9mIGNvbmZpZyAjMSAqLworCXsgMHhlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgzfSwKKworCS8qIHN0YXJ0IG9mIGNvbmZpZyAjMiAqLworCXsgMHhhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwl7IDB4YiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MH0sCisJeyAweGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAorCisJLyogcG93ZXIgc3RhdGUgY29udHJvbHMgYW1wcyAqLworCXsgMHgwMSwgQUNfVkVSQl9TRVRfRUFQRCwgMSA8PCAyfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyaGQ3MWJ4eF9jb3JlX2luaXRbXSA9IHsKIAkvKiBzZXQgbWFzdGVyIHZvbHVtZSBhbmQgZGlyZWN0IGNvbnRyb2wgKi8KIAl7IDB4MjgsIEFDX1ZFUkJfU0VUX1ZPTFVNRV9LTk9CX0NPTlRST0wsIDB4ZmZ9LAogCS8qIGNvbm5lY3QgaGVhZHBob25lIGphY2sgdG8gZGFjMSAqLwogCXsgMHgwYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwgLyogU3BlYWtlciAqLwogCS8qIHVubXV0ZSByaWdodCBhbmQgbGVmdCBjaGFubmVscyBmb3Igbm9kZXMgMHgwYSwgMHhkLCAweDBmICovCiAJeyAweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsgMHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiB9OwogCi0jZGVmaW5lIEhEX0RJU0FCTEVfUE9SVEYgMworI2RlZmluZSBIRF9ESVNBQkxFX1BPUlRGIDIKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyaGQ3MWJ4eF9hbmFsb2dfY29yZV9pbml0W10gPSB7CiAJLyogc3RhcnQgb2YgY29uZmlnICMxICovCiAKIAkvKiBjb25uZWN0IHBvcnQgMGYgdG8gYXVkaW8gbWl4ZXIgKi8KIAl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDJ9LAotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwgLyogU3BlYWtlciAqLwogCS8qIHVubXV0ZSByaWdodCBhbmQgbGVmdCBjaGFubmVscyBmb3Igbm9kZSAweDBmICovCiAJeyAweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAkvKiBzdGFydCBvZiBjb25maWcgIzIgKi8KQEAgLTY1NSwxMCArODgxLDYgQEAKIAl7IDB4MjgsIEFDX1ZFUkJfU0VUX1ZPTFVNRV9LTk9CX0NPTlRST0wsIDB4ZmZ9LAogCS8qIGNvbm5lY3QgaGVhZHBob25lIGphY2sgdG8gZGFjMSAqLwogCXsgMHgwYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCS8qIGNvbm5lY3QgcG9ydCAwZCB0byBhdWRpbyBtaXhlciAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Mn0sCi0JLyogdW5tdXRlIGRhYzAgaW5wdXQgaW4gYXVkaW8gbWl4ZXIgKi8KLQl7IDB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAxZn0sCiAJLyogdW5tdXRlIHJpZ2h0IGFuZCBsZWZ0IGNoYW5uZWxzIGZvciBub2RlcyAweDBhLCAweGQgKi8KIAl7IDB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsgMHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCkBAIC02OTAsMTIgKzkxMiwxNiBAQAogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBzdGFjOTI3eF9jb3JlX2luaXRbXSA9IHsKIAkvKiBzZXQgbWFzdGVyIHZvbHVtZSBhbmQgZGlyZWN0IGNvbnRyb2wgKi8JCiAJeyAweDI0LCBBQ19WRVJCX1NFVF9WT0xVTUVfS05PQl9DT05UUk9MLCAweGZmfSwKKwkvKiBlbmFibGUgYW5hbG9nIHBjIGJlZXAgcGF0aCAqLworCXsgMHgwMSwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzIsIDEgPDwgNX0sCiAJe30KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyMDVfY29yZV9pbml0W10gPSB7CiAJLyogc2V0IG1hc3RlciB2b2x1bWUgYW5kIGRpcmVjdCBjb250cm9sICovCQogCXsgMHgyNCwgQUNfVkVSQl9TRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMHhmZn0sCisJLyogZW5hYmxlIGFuYWxvZyBwYyBiZWVwIHBhdGggKi8KKwl7IDB4MDEsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8yLCAxIDw8IDV9LAogCXt9CiB9OwogCkBAIC03MDksNiArOTM1LDMxIEBACiAJCS5wdXQgPSBzdGFjOTJ4eF9tb25vX211eF9lbnVtX3B1dCwgXAogCX0KIAorI2RlZmluZSBTVEFDX0FNUF9NVVggXAorCXsgXAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorCQkubmFtZSA9ICJBbXAgU2VsZWN0b3IgQ2FwdHVyZSBTd2l0Y2giLCBcCisJCS5jb3VudCA9IDEsIFwKKwkJLmluZm8gPSBzdGFjOTJ4eF9hbXBfbXV4X2VudW1faW5mbywgXAorCQkuZ2V0ID0gc3RhYzkyeHhfYW1wX211eF9lbnVtX2dldCwgXAorCQkucHV0ID0gc3RhYzkyeHhfYW1wX211eF9lbnVtX3B1dCwgXAorCX0KKworI2RlZmluZSBTVEFDX0FNUF9WT0woeG5hbWUsIG5pZCwgY2hzLCBpZHgsIGRpcikgXAorCXsgXAorCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorCQkubmFtZSA9IHhuYW1lLCBcCisJCS5pbmRleCA9IDAsIFwKKwkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBcCisJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCisJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLLCBcCisJCS5pbmZvID0gc3RhYzkyeHhfYW1wX3ZvbHVtZV9pbmZvLCBcCisJCS5nZXQgPSBzdGFjOTJ4eF9hbXBfdm9sdW1lX2dldCwgXAorCQkucHV0ID0gc3RhYzkyeHhfYW1wX3ZvbHVtZV9wdXQsIFwKKwkJLnRsdiA9IHsgLmMgPSBzbmRfaGRhX21peGVyX2FtcF90bHYgfSwgXAorCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIGlkeCwgZGlyKSBcCisJfQorCiAjZGVmaW5lIFNUQUNfSU5QVVRfU09VUkNFKGNudCkgXAogCXsgXAogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXApAQCAtNzM2LDExICs5ODcsMjggQEAKIAlTVEFDX0lOUFVUX1NPVVJDRSgxKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MGEsIDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MGEsIDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgTXV4IFZvbHVtZSIsIDB4MGMsIDAsIEhEQV9PVVRQVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKKyNkZWZpbmUgREVMTF9NNl9NSVhFUiA2CiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzkyaGQ3M3h4XzZjaF9taXhlcltdID0geworCS8qIHN0YXJ0IG9mIGNvbmZpZyAjMSAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBNaXhlciBDYXB0dXJlIFZvbHVtZSIsIDB4MWQsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBNaXhlciBDYXB0dXJlIFN3aXRjaCIsIDB4MWQsIDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIE1peGVyIENhcHR1cmUgVm9sdW1lIiwgMHgxZCwgMHgyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIEluIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMHgyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgTWl4ZXIgQ2FwdHVyZSBWb2x1bWUiLCAweDFkLCAweDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMHg0LCBIREFfSU5QVVQpLAorCisJLyogc3RhcnQgb2YgY29uZmlnICMyICovCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIE1peGVyIENhcHR1cmUgVm9sdW1lIiwgMHgxZCwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgTWl4ZXIgQ2FwdHVyZSBTd2l0Y2giLCAweDFkLCAweDEsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJEQUMgTWl4ZXIgQ2FwdHVyZSBWb2x1bWUiLCAweDFkLCAweDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkRBQyBNaXhlciBDYXB0dXJlIFN3aXRjaCIsIDB4MWQsIDB4MywgSERBX0lOUFVUKSwKKwogCVNUQUNfQU5BTE9HX0xPT1BCQUNLKDB4RkEwLCAweDdBMSwgMyksCiAKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAweDAsIDB4MjAsIDB4MCwgSERBX09VVFBVVCksCkBAIC03NDksMjAgKzEwMTcsNiBAQAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMHgxLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIE1peGVyIENhcHR1cmUgVm9sdW1lIiwgMHgxZCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBNaXhlciBDYXB0dXJlIFZvbHVtZSIsIDB4MWQsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMHgxLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBNaXhlciBDYXB0dXJlIFZvbHVtZSIsIDB4MWQsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBJbiBNaXhlciBDYXB0dXJlIFN3aXRjaCIsIDB4MWQsIDB4MiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkRBQyBNaXhlciBDYXB0dXJlIFZvbHVtZSIsIDB4MWQsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiREFDIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMHgzLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgTWl4ZXIgQ2FwdHVyZSBWb2x1bWUiLCAweDFkLCAweDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIE1peGVyIENhcHR1cmUgU3dpdGNoIiwgMHgxZCwgMHg0LCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTgxOCwyMiArMTA3Miw1OSBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5MmhkODN4eHhfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAweDAsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDB4MCwgMHgxNywgMHgwLCBIREFfT1VUUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxOCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMHgxLCAweDE4LCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiREFDMCBDYXB0dXJlIFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkRBQzAgQ2FwdHVyZSBTd2l0Y2giLCAweDFiLCAwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiREFDMSBDYXB0dXJlIFZvbHVtZSIsIDB4MWIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiREFDMSBDYXB0dXJlIFN3aXRjaCIsIDB4MWIsIDB4MSwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBDYXB0dXJlIFZvbHVtZSIsIDB4MWIsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIENhcHR1cmUgU3dpdGNoIiwgMHgxYiwgMHgyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBDYXB0dXJlIFZvbHVtZSIsIDB4MWIsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBJbiBDYXB0dXJlIFN3aXRjaCIsIDB4MWIsIDB4MywgSERBX0lOUFVUKSwKKworCS8qCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxYiwgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDFiIDB4NCwgSERBX0lOUFVUKSwKKwkqLworCXsgfSAvKiBlbmQgKi8KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTJoZDcxYnh4X2FuYWxvZ19taXhlcltdID0gewogCVNUQUNfSU5QVVRfU09VUkNFKDIpLAorCVNUQUNfQU5BTE9HX0xPT1BCQUNLKDB4RkEwLCAweDdBMCwgMiksCiAKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAweDAsIDB4MWMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDB4MCwgMHgxYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBNdXggVm9sdW1lIiwgMHgwLCAweDFhLCAweDAsIEhEQV9PVVRQVVQpLAogCiAJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMHgxLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDEsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgTXV4IFZvbHVtZSIsIDB4MSwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQorCS8qIGFuYWxvZyBwYy1iZWVwIHJlcGxhY2VkIHdpdGggZGlnaXRhbCBiZWVwIHN1cHBvcnQgKi8KKwkvKgogCUhEQV9DT0RFQ19WT0xVTUUoIlBDIEJlZXAgVm9sdW1lIiwgMHgxNywgMHgyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQyBCZWVwIFN3aXRjaCIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKKwkqLwogCi0JSERBX0NPREVDX01VVEUoIkFuYWxvZyBMb29wYmFjayAxIiwgMHgxNywgMHgzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBbmFsb2cgTG9vcGJhY2sgMiIsIDB4MTcsIDB4NCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW1wb3J0MCBNdXggQ2FwdHVyZSBTd2l0Y2giLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW1wb3J0MCBNdXggQ2FwdHVyZSBWb2x1bWUiLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiSW1wb3J0MSBNdXggQ2FwdHVyZSBTd2l0Y2giLCAweDE3LCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW1wb3J0MSBNdXggQ2FwdHVyZSBWb2x1bWUiLCAweDE3LCAweDEsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfTVVURSgiREFDMCBDYXB0dXJlIFN3aXRjaCIsIDB4MTcsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJEQUMwIENhcHR1cmUgVm9sdW1lIiwgMHgxNywgMHgzLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX01VVEUoIkRBQzEgQ2FwdHVyZSBTd2l0Y2giLCAweDE3LCAweDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiREFDMSBDYXB0dXJlIFZvbHVtZSIsIDB4MTcsIDB4NCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC04NDMsMTEgKzExMzQsOSBAQAogCiAJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMHgwLCAweDFjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDAsIDB4MWMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgTXV4IFZvbHVtZSIsIDB4MCwgMHgxYSwgMHgwLCBIREFfT1VUUFVUKSwKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMHgxLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIE11eCBWb2x1bWUiLCAweDEsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtODU1LDcgKzExNDQsNiBAQAogCVNUQUNfSU5QVVRfU09VUkNFKDEpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNCwgMCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBNdXggVm9sdW1lIiwgMHgwZiwgMCwgSERBX09VVFBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtODY1LDEyICsxMTUzLDkgQEAKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MCwgMHgxYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDAsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MCwgMHgxOSwgMHgwLCBIREFfT1VUUFVUKSwKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxYywgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDEsIDB4MWUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxQSwgMHgwLCBIREFfT1VUUFVUKSwKLQogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTg3OSwxMSArMTE2NCw5IEBACiAJU1RBQ19JTlBVVF9TT1VSQ0UoMiksCiAJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMHgwLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDB4MCwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJNdXggQ2FwdHVyZSBWb2x1bWUiLCAweDAsIDB4MTIsIDB4MCwgSERBX09VVFBVVCksCiAKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAweDEsIDB4MTgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMHgxLCAweDE4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC04OTQsMTUgKzExNzcsMTIgQEAKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MCwgMHgxOCwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDAsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MCwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxOSwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDEsIDB4MWMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MSwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKIAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDB4MiwgMHgxQSwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAweDIsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIk11eCBDYXB0dXJlIFZvbHVtZSIsIDB4MiwgMHgxNywgMHgwLCBIREFfT1VUUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC05MTUsNiArMTE5NSwxNSBAQAogCS5wdXQgPSBzdGFjOTJ4eF9kbXV4X2VudW1fcHV0LAogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWNfc211eF9taXhlciA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJJRUM5NTggUGxheWJhY2sgU291cmNlIiwKKwkvKiBjb3VudCBzZXQgbGF0ZXIgKi8KKwkuaW5mbyA9IHN0YWM5Mnh4X3NtdXhfZW51bV9pbmZvLAorCS5nZXQgPSBzdGFjOTJ4eF9zbXV4X2VudW1fZ2V0LAorCS5wdXQgPSBzdGFjOTJ4eF9zbXV4X2VudW1fcHV0LAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKnNsYXZlX3ZvbHNbXSA9IHsKIAkiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKIAkiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwKQEAgLTk2Niw2ICsxMjU1LDIyIEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CisJaWYgKHNwZWMtPm51bV9zbXV4ZXMgPiAwKSB7CisJCWludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOworCQlzdHJ1Y3QgaGRhX2lucHV0X211eCAqc211eCA9ICZzcGVjLT5wcml2YXRlX3NtdXg7CisJCS8qIGNoZWNrIGZvciBtdXRlIHN1cHBvcnQgb24gU1BESUYgb3V0ICovCisJCWlmICh3Y2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgeworCQkJc211eC0+aXRlbXNbc211eC0+bnVtX2l0ZW1zXS5sYWJlbCA9ICJPZmYiOworCQkJc211eC0+aXRlbXNbc211eC0+bnVtX2l0ZW1zXS5pbmRleCA9IDA7CisJCQlzbXV4LT5udW1faXRlbXMrKzsKKwkJCXNwZWMtPnNwZGlmX211dGUgPSAxOworCQl9CisJCXN0YWNfc211eF9taXhlci5jb3VudCA9IHNwZWMtPm51bV9zbXV4ZXM7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5idXMtPmNhcmQsCisJCQkJICBzbmRfY3RsX25ldzEoJnN0YWNfc211eF9taXhlciwgY29kZWMpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KIAogCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgewogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOwpAQCAtOTc3LDcgKzEyODIsNyBAQAogCQkJcmV0dXJuIGVycjsKIAkJc3BlYy0+bXVsdGlvdXQuc2hhcmVfc3BkaWYgPSAxOwogCX0KLQlpZiAoc3BlYy0+ZGlnX2luX25pZCkgeworCWlmIChzcGVjLT5kaWdfaW5fbmlkICYmICghc3BlYy0+Z3Bpb19kaXIgJiAweDAxKSkgewogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9pbl9jdGxzKGNvZGVjLCBzcGVjLT5kaWdfaW5fbmlkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwpAQCAtMTMyNSw0MCArMTYzMCw2NSBAQAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVmOTJoZDcxYnh4X3Bpbl9jb25maWdzWzEwXSA9IHsKLQkweDAyMjE0MDMwLCAweDAyYTE5MDQwLCAweDAxYTE5MDIwLCAweDAxMDE0MDEwLAotCTB4MDE4MTMwMmUsIDB4MDExMTQwMTAsIDB4MDEwMTkwMjAsIDB4OTBhMDAwZjAsCi0JMHg5MGEwMDBmMCwgMHgwMTQ1MjA1MCwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVmOTJoZDgzeHh4X3Bpbl9jb25maWdzWzE0XSA9IHsKKwkweDAyMjE0MDMwLCAweDAyMjExMDEwLCAweDAyYTE5MDIwLCAweDAyMTcwMTMwLAorCTB4MDEwMTQwNTAsIDB4MDE4MTkwNDAsIDB4MDEwMTQwMjAsIDB4OTBhMzAxNGUsCisJMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwKKwkweDAxNDUxMTYwLCAweDk4NTYwMTcwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBkZWxsX200XzFfcGluX2NvbmZpZ3NbMTBdID0geworc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyaGQ4M3h4eF9icmRfdGJsW1NUQUNfOTJIRDgzWFhYX01PREVMU10gPSB7CisJW1NUQUNfOTJIRDgzWFhYX1JFRl0gPSByZWY5MmhkODN4eHhfcGluX2NvbmZpZ3MsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyaGQ4M3h4eF9tb2RlbHNbU1RBQ185MkhEODNYWFhfTU9ERUxTXSA9IHsKKwlbU1RBQ185MkhEODNYWFhfUkVGXSA9ICJyZWYiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5MmhkODN4eHhfY2ZnX3RibFtdID0geworCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LAorCQkgICAgICAiREZJIExhblBhcnR5IiwgU1RBQ185MkhENzFCWFhfUkVGKSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVmOTJoZDcxYnh4X3Bpbl9jb25maWdzWzExXSA9IHsKKwkweDAyMjE0MDMwLCAweDAyYTE5MDQwLCAweDAxYTE5MDIwLCAweDAxMDE0MDEwLAorCTB4MDE4MTMwMmUsIDB4MDEwMTQwMTAsIDB4MDEwMTkwMjAsIDB4OTBhMDAwZjAsCisJMHg5MGEwMDBmMCwgMHgwMTQ1MjA1MCwgMHgwMTQ1MjA1MCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVsbF9tNF8xX3Bpbl9jb25maWdzWzExXSA9IHsKIAkweDA0MjExMDFmLCAweDA0YTExMjIxLCAweDQwZjAwMGYwLCAweDkwMTcwMTEwLAogCTB4MjNhMTkwMmUsIDB4MjMwMTQyNTAsIDB4NDBmMDAwZjAsIDB4OTBhMDAwZjAsCi0JMHg0MGYwMDBmMCwgMHg0ZjAwMDBmMCwKKwkweDQwZjAwMGYwLCAweDRmMDAwMGYwLCAweDRmMDAwMGYwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBkZWxsX200XzJfcGluX2NvbmZpZ3NbMTBdID0geworc3RhdGljIHVuc2lnbmVkIGludCBkZWxsX200XzJfcGluX2NvbmZpZ3NbMTFdID0gewogCTB4MDQyMTEwMWYsIDB4MDRhMTEyMjEsIDB4OTBhNzAzMzAsIDB4OTAxNzAxMTAsCiAJMHgyM2ExOTAyZSwgMHgyMzAxNDI1MCwgMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwKLQkweDQwZjAwMGYwLCAweDA0NDQxM2IwLAorCTB4NDBmMDAwZjAsIDB4MDQ0NDEzYjAsIDB4MDQ0NDEzYjAsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTJoZDcxYnh4X2JyZF90YmxbU1RBQ185MkhENzFCWFhfTU9ERUxTXSA9IHsKIAlbU1RBQ185MkhENzFCWFhfUkVGXSA9IHJlZjkyaGQ3MWJ4eF9waW5fY29uZmlncywKIAlbU1RBQ19ERUxMX000XzFdCT0gZGVsbF9tNF8xX3Bpbl9jb25maWdzLAogCVtTVEFDX0RFTExfTTRfMl0JPSBkZWxsX200XzJfcGluX2NvbmZpZ3MsCisJW1NUQUNfSFBfTTRdCQk9IE5VTEwsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyaGQ3MWJ4eF9tb2RlbHNbU1RBQ185MkhENzFCWFhfTU9ERUxTXSA9IHsKIAlbU1RBQ185MkhENzFCWFhfUkVGXSA9ICJyZWYiLAogCVtTVEFDX0RFTExfTTRfMV0gPSAiZGVsbC1tNC0xIiwKIAlbU1RBQ19ERUxMX000XzJdID0gImRlbGwtbTQtMiIsCisJW1NUQUNfSFBfTTRdID0gImhwLW00IiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTJoZDcxYnh4X2NmZ190YmxbXSA9IHsKIAkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjY2OCwKIAkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfOTJIRDcxQlhYX1JFRiksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0hQLCAweDM2MWEsCisJCQkJInVua25vd24gSFAiLCBTVEFDX0hQX000KSwKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMjMzLAogCQkJCSJ1bmtub3duIERlbGwiLCBTVEFDX0RFTExfTTRfMSksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDIzNCwKQEAgLTE0NzcsNiArMTgwNywxMSBAQAogCTB4NDAwMDAwZmMsIDB4NDAwMDAwZmIsCiB9OwogCitzdGF0aWMgdW5zaWduZWQgaW50IGVjczIwMl9waW5fY29uZmlnc1sxMF0gPSB7CisJMHgwMjIxNDAxZiwgMHgwMmExOTAyMCwgMHgwMWExOTAyMCwgMHgwMTExNDAxMCwKKwkweDQwODAwMGYwLCAweDAxODEzMDIyLCAweDA3NDUxMGEwLCAweDQwYzQwMGYxLAorCTB4OTAzNzAxMmUsIDB4NDBlMDAwZjIsCit9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIyeF9icmRfdGJsW1NUQUNfOTIyWF9NT0RFTFNdID0gewogCVtTVEFDX0Q5NDVfUkVGXSA9IHJlZjkyMnhfcGluX2NvbmZpZ3MsCkBAIC0xNDk1LDYgKzE4MzAsNyBAQAogCVtTVEFDX01BQ0JPT0tfUFJPX1YyXSA9IGludGVsX21hY192M19waW5fY29uZmlncywKIAlbU1RBQ19JTUFDX0lOVEVMXSA9IGludGVsX21hY192Ml9waW5fY29uZmlncywKIAlbU1RBQ19JTUFDX0lOVEVMXzIwXSA9IGludGVsX21hY192M19waW5fY29uZmlncywKKwlbU1RBQ19FQ1NfMjAyXSA9IGVjczIwMl9waW5fY29uZmlncywKIAlbU1RBQ185MjJYX0RFTExfRDgxXSA9IGRlbGxfOTIyeF9kODFfcGluX2NvbmZpZ3MsCiAJW1NUQUNfOTIyWF9ERUxMX0Q4Ml0gPSBkZWxsXzkyMnhfZDgyX3Bpbl9jb25maWdzLAkKIAlbU1RBQ185MjJYX0RFTExfTTgxXSA9IGRlbGxfOTIyeF9tODFfcGluX2NvbmZpZ3MsCkBAIC0xNTE4LDYgKzE4NTQsNyBAQAogCVtTVEFDX01BQ0JPT0tfUFJPX1YyXQk9ICJtYWNib29rLXBybyIsCiAJW1NUQUNfSU1BQ19JTlRFTF0gPSAiaW1hYy1pbnRlbCIsCiAJW1NUQUNfSU1BQ19JTlRFTF8yMF0gPSAiaW1hYy1pbnRlbC0yMCIsCisJW1NUQUNfRUNTXzIwMl0gPSAiZWNzMjAyIiwKIAlbU1RBQ185MjJYX0RFTExfRDgxXSA9ICJkZWxsLWQ4MSIsCiAJW1NUQUNfOTIyWF9ERUxMX0Q4Ml0gPSAiZGVsbC1kODIiLAogCVtTVEFDXzkyMlhfREVMTF9NODFdID0gImRlbGwtbTgxIiwKQEAgLTE2MDQsNiArMTk0MSwzMyBAQAogCQkgICAgICAidW5rbm93biBEZWxsIiwgU1RBQ185MjJYX0RFTExfRDgxKSwKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMWQ3LAogCQkgICAgICAiRGVsbCBYUFMgTTEyMTAiLCBTVEFDXzkyMlhfREVMTF9NODIpLAorCS8qIEVDUy9QQyBDaGlwcyBib2FyZHMgKi8KKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgyMTQ0LAorCQkgICAgICAiRUNTL1BDIGNoaXBzIiwgU1RBQ19FQ1NfMjAyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgyNjA4LAorCQkgICAgICAiRUNTL1BDIGNoaXBzIiwgU1RBQ19FQ1NfMjAyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgyNjMzLAorCQkgICAgICAiRUNTL1BDIGNoaXBzIFAxN0cvMTMzMyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxMSwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxMiwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxMywKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxNCwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxNSwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxNiwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxNywKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxOCwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgxOSwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MjgyMCwKKwkJICAgICAgIkVDUy9QQyBjaGlwcyIsIFNUQUNfRUNTXzIwMiksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMTY4Myw4ICsyMDQ3LDggQEAKIAkvKiBEZWxsIDMgc3RhY2sgc3lzdGVtcyB3aXRoIHZlcmIgdGFibGUgaW4gQklPUyAqLwogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAgMHgwMWYzLCAiRGVsbCBJbnNwaXJvbiAxNDIwIiwgU1RBQ19ERUxMX0JJT1MpLAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAgMHgwMjI3LCAiRGVsbCBWb3N0cm8gMTQwMCAgIiwgU1RBQ19ERUxMX0JJT1MpLAotCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAgMHgwMjJmLCAiRGVsbCAgICAgIiwgU1RBQ19ERUxMX0JJT1MpLAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAgMHgwMjJlLCAiRGVsbCAgICAgIiwgU1RBQ19ERUxMX0JJT1MpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAgMHgwMjJmLCAiRGVsbCBJbnNwaXJvbiAxNTI1IiwgU1RBQ19ERUxMXzNTVCksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsICAweDAyNDIsICJEZWxsICAgICAiLCBTVEFDX0RFTExfQklPUyksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsICAweDAyNDMsICJEZWxsICAgICAiLCBTVEFDX0RFTExfQklPUyksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsICAweDAyZmYsICJEZWxsICAgICAiLCBTVEFDX0RFTExfQklPUyksCkBAIC0xODY3LDYgKzIyMzEsOCBAQAogCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPnN0cmVhbV9kZWxheSkKKwkJbXNsZWVwKHNwZWMtPnN0cmVhbV9kZWxheSk7CiAJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSwKIAkJCQkJICAgICBoaW5mbyk7CiB9CkBAIC0xOTMwLDkgKzIyOTYsMTQgQEAKIAkJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkID0gc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdOwogCi0Jc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwlpZiAoc3BlYy0+cG93ZXJkb3duX2FkY3MpIHsKKwkJbXNsZWVwKDQwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAorCQkJQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIEFDX1BXUlNUX0QwKTsKKwl9CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk0MSw4ICsyMzEyLDEyIEBACiAJCQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5pZCA9IHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXTsKIAotCXNuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSk7CisJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgbmlkKTsKKwlpZiAoc3BlYy0+cG93ZXJkb3duX2FkY3MpCisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIG5pZCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BPV0VSX1NUQVRFLCBBQ19QV1JTVF9EMyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOTMsNiArMjU2OCw4IEBACiAJU1RBQ19DVExfV0lER0VUX1ZPTCwKIAlTVEFDX0NUTF9XSURHRVRfTVVURSwKIAlTVEFDX0NUTF9XSURHRVRfTU9OT19NVVgsCisJU1RBQ19DVExfV0lER0VUX0FNUF9NVVgsCisJU1RBQ19DVExfV0lER0VUX0FNUF9WT0wsCiAJU1RBQ19DVExfV0lER0VUX0hQX1NXSVRDSCwKIAlTVEFDX0NUTF9XSURHRVRfSU9fU1dJVENILAogCVNUQUNfQ1RMX1dJREdFVF9DTEZFX1NXSVRDSApAQCAtMjIwMiwxMyArMjU3OSwxNiBAQAogCUhEQV9DT0RFQ19WT0xVTUUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0NPREVDX01VVEUoTlVMTCwgMCwgMCwgMCksCiAJU1RBQ19NT05PX01VWCwKKwlTVEFDX0FNUF9NVVgsCisJU1RBQ19BTVBfVk9MKE5VTEwsIDAsIDAsIDAsIDApLAogCVNUQUNfQ09ERUNfSFBfU1dJVENIKE5VTEwpLAogCVNUQUNfQ09ERUNfSU9fU1dJVENIKE5VTEwsIDApLAogCVNUQUNfQ09ERUNfQ0xGRV9TV0lUQ0goTlVMTCwgMCksCiB9OwogCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwotc3RhdGljIGludCBzdGFjOTJ4eF9hZGRfY29udHJvbChzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGludCBzdGFjOTJ4eF9hZGRfY29udHJvbF9pZHgoc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMsIGludCB0eXBlLAorCQlpbnQgaWR4LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKIApAQCAtMjIyOCw2ICsyNjA4LDcgQEAKIAogCWtuZXcgPSAmc3BlYy0+a2N0bF9hbGxvY1tzcGVjLT5udW1fa2N0bF91c2VkXTsKIAkqa25ldyA9IHN0YWM5Mnh4X2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdOworCWtuZXctPmluZGV4ID0gaWR4OwogCWtuZXctPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICghIGtuZXctPm5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjIzNiw2ICsyNjE3LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKworLyogYWRkIGR5bmFtaWMgY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgc3RhYzkyeHhfYWRkX2NvbnRyb2woc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMsIGludCB0eXBlLAorCQljb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlyZXR1cm4gc3RhYzkyeHhfYWRkX2NvbnRyb2xfaWR4KHNwZWMsIHR5cGUsIDAsIG5hbWUsIHZhbCk7Cit9CisKIC8qIGZsYWcgaW5wdXRzIGFzIGFkZGl0aW9uYWwgZHluYW1pYyBsaW5lb3V0cyAqLwogc3RhdGljIGludCBzdGFjOTJ4eF9hZGRfZHluX291dF9waW5zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CkBAIC0yNDI3LDcgKzI4MTYsNyBAQAogCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7CiAJCSJGcm9udCIsICJTdXJyb3VuZCIsIE5VTEwgLypDTEZFKi8sICJTaWRlIgogCX07Ci0JaGRhX25pZF90IG5pZDsKKwloZGFfbmlkX3QgbmlkID0gMDsKIAlpbnQgaSwgZXJyOwogCiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTI0NjcsNiArMjg1NiwxMCBAQAogCQl9CiAJfQogCisJaWYgKChzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAtIGNmZy0+bGluZV9vdXRzKSA+IDAgJiYKKwkJCWNmZy0+aHBfb3V0cyAmJiAhc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQorCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBuaWQ7CisKIAlpZiAoY2ZnLT5ocF9vdXRzID4gMSkgewogCQllcnIgPSBzdGFjOTJ4eF9hZGRfY29udHJvbChzcGVjLAogCQkJU1RBQ19DVExfV0lER0VUX0hQX1NXSVRDSCwKQEAgLTI1NzksOCArMjk3Miw4IEBACiB9CiAKIC8qIGxhYmVscyBmb3IgbW9ubyBtdXggb3V0cHV0cyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5Mnh4X21vbm9fbGFiZWxzWzNdID0gewotCSJEQUMwIiwgIkRBQzEiLCAiTWl4ZXIiCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyeHhfbW9ub19sYWJlbHNbNF0gPSB7CisJIkRBQzAiLCAiREFDMSIsICJNaXhlciIsICJEQUMyIgogfTsKIAogLyogY3JlYXRlIG1vbm8gbXV4IGZvciBtb25vIG91dCBvbiBjYXBhYmxlIGNvZGVjcyAqLwpAQCAtMjYwOSw2ICszMDAyLDExNiBAQAogCQkJCSJNb25vIE11eCIsIHNwZWMtPm1vbm9fbmlkKTsKIH0KIAorLyogbGFiZWxzIGZvciBhbXAgbXV4IG91dHB1dHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdGFjOTJ4eF9hbXBfbGFiZWxzWzNdID0geworCSJGcm9udCBNaWNyb3Bob25lIiwgIk1pY3JvcGhvbmUiLCAiTGluZSBJbiIsCit9OworCisvKiBjcmVhdGUgYW1wIG91dCBjb250cm9scyBtdXggb24gY2FwYWJsZSBjb2RlY3MgKi8KK3N0YXRpYyBpbnQgc3RhYzkyeHhfYXV0b19jcmVhdGVfYW1wX291dHB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmFtcF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9hbXBfbXV4OworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2FtcHM7IGkrKykgeworCQlhbXBfbXV4LT5pdGVtc1thbXBfbXV4LT5udW1faXRlbXNdLmxhYmVsID0KKwkJCQkJc3RhYzkyeHhfYW1wX2xhYmVsc1tpXTsKKwkJYW1wX211eC0+aXRlbXNbYW1wX211eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGk7CisJCWFtcF9tdXgtPm51bV9pdGVtcysrOworCX0KKworCWlmIChzcGVjLT5udW1fYW1wcyA+IDEpIHsKKwkJZXJyID0gc3RhYzkyeHhfYWRkX2NvbnRyb2woc3BlYywgU1RBQ19DVExfV0lER0VUX0FNUF9NVVgsCisJCQkiQW1wIFNlbGVjdG9yIENhcHR1cmUgU3dpdGNoIiwgMCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIHN0YWM5Mnh4X2FkZF9jb250cm9sKHNwZWMsIFNUQUNfQ1RMX1dJREdFVF9BTVBfVk9MLAorCQkiQW1wIENhcHR1cmUgVm9sdW1lIiwKKwkJSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hbXBfbmlkc1swXSwgMywgMCwgSERBX0lOUFVUKSk7Cit9CisKKworLyogY3JlYXRlIFBDIGJlZXAgdm9sdW1lIGNvbnRyb2xzICovCitzdGF0aWMgaW50IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX2JlZXBfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJCWhkYV9uaWRfdCBuaWQpCit7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1MzIgY2FwcyA9IHF1ZXJ5X2FtcF9jYXBzKGNvZGVjLCBuaWQsIEhEQV9PVVRQVVQpOworCWludCBlcnI7CisKKwkvKiBjaGVjayBmb3IgbXV0ZSBzdXBwb3J0IGZvciB0aGUgdGhlIGFtcCAqLworCWlmICgoY2FwcyAmIEFDX0FNUENBUF9NVVRFKSA+PiBBQ19BTVBDQVBfTVVURV9TSElGVCkgeworCQllcnIgPSBzdGFjOTJ4eF9hZGRfY29udHJvbChzcGVjLCBTVEFDX0NUTF9XSURHRVRfTVVURSwKKwkJCSJQQyBCZWVwIFBsYXliYWNrIFN3aXRjaCIsCisJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgdm9sdW1lIHN1cHBvcnQgZm9yIHRoZSBhbXAgKi8KKwlpZiAoKGNhcHMgJiBBQ19BTVBDQVBfTlVNX1NURVBTKSA+PiBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUKSB7CisJCWVyciA9IHN0YWM5Mnh4X2FkZF9jb250cm9sKHNwZWMsIFNUQUNfQ1RMX1dJREdFVF9WT0wsCisJCQkiUEMgQmVlcCBQbGF5YmFjayBWb2x1bWUiLAorCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX211eF9pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHdjYXBzLCBuaWQsIGksIGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX211eGVzOyBpKyspIHsKKwkJbmlkID0gc3BlYy0+bXV4X25pZHNbaV07CisJCXdjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOworCisJCWlmICh3Y2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgeworCQkJZXJyID0gc3RhYzkyeHhfYWRkX2NvbnRyb2xfaWR4KHNwZWMsCisJCQkJU1RBQ19DVExfV0lER0VUX1ZPTCwgaSwgIk11eCBDYXB0dXJlIFZvbHVtZSIsCisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyeHhfc3BkaWZfbGFiZWxzWzNdID0geworCSJEaWdpdGFsIFBsYXliYWNrIiwgIkFuYWxvZyBNdXggMSIsICJBbmFsb2cgTXV4IDIiLAorfTsKKworc3RhdGljIGludCBzdGFjOTJ4eF9hdXRvX2NyZWF0ZV9zcGRpZl9tdXhfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICpzcGRpZl9tdXggPSAmc3BlYy0+cHJpdmF0ZV9zbXV4OworCWNvbnN0IGNoYXIgKipsYWJlbHMgPSBzcGVjLT5zcGRpZl9sYWJlbHM7CisJaW50IGksIG51bV9jb25zOworCWhkYV9uaWRfdCBjb25fbHN0W0hEQV9NQVhfTlVNX0lOUFVUU107CisKKwludW1fY29ucyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLAorCQkJCXNwZWMtPnNtdXhfbmlkc1swXSwKKwkJCQljb25fbHN0LAorCQkJCUhEQV9NQVhfTlVNX0lOUFVUUyk7CisJaWYgKCFudW1fY29ucykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWxhYmVscykKKwkJbGFiZWxzID0gc3RhYzkyeHhfc3BkaWZfbGFiZWxzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jb25zOyBpKyspIHsKKwkJc3BkaWZfbXV4LT5pdGVtc1tzcGRpZl9tdXgtPm51bV9pdGVtc10ubGFiZWwgPSBsYWJlbHNbaV07CisJCXNwZGlmX211eC0+aXRlbXNbc3BkaWZfbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaTsKKwkJc3BkaWZfbXV4LT5udW1faXRlbXMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogbGFiZWxzIGZvciBkbWljIG11eCBpbnB1dHMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpzdGFjOTJ4eF9kbWljX2xhYmVsc1s1XSA9IHsKIAkiQW5hbG9nIElucHV0cyIsICJEaWdpdGFsIE1pYyAxIiwgIkRpZ2l0YWwgTWljIDIiLApAQCAtMjY1NiwxNiArMzE1OSwxOSBAQAogCQkJfQogCQljb250aW51ZTsKIGZvdW5kOgotCQl3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKKwkJd2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCkgJgorCQkJKEFDX1dDQVBfT1VUX0FNUCB8IEFDX1dDQVBfSU5fQU1QKTsKIAotCQlpZiAod2NhcHMgJiBBQ19XQ0FQX09VVF9BTVApIHsKKwkJaWYgKHdjYXBzKSB7CiAJCQlzcHJpbnRmKG5hbWUsICIlcyBDYXB0dXJlIFZvbHVtZSIsCiAJCQkJc3RhYzkyeHhfZG1pY19sYWJlbHNbZGltdXgtPm51bV9pdGVtc10pOwogCiAJCQllcnIgPSBzdGFjOTJ4eF9hZGRfY29udHJvbChzcGVjLAogCQkJCVNUQUNfQ1RMX1dJREdFVF9WT0wsCiAJCQkJbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLAorCQkJCSh3Y2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgPworCQkJCUhEQV9PVVRQVVQgOiBIREFfSU5QVVQpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTI3ODksOCArMzI5NSw4IEBACiAJCWhwX3NwZWFrZXJfc3dhcCA9IDE7CiAJfQogCWlmIChzcGVjLT5hdXRvY2ZnLm1vbm9fb3V0X3BpbikgewotCQlpbnQgZGlyID0gKGdldF93Y2Fwcyhjb2RlYywgc3BlYy0+YXV0b2NmZy5tb25vX291dF9waW4pCi0JCQkJJiBBQ19XQ0FQX09VVF9BTVApID8gSERBX09VVFBVVCA6IEhEQV9JTlBVVDsKKwkJaW50IGRpciA9IGdldF93Y2Fwcyhjb2RlYywgc3BlYy0+YXV0b2NmZy5tb25vX291dF9waW4pICYKKwkJCShBQ19XQ0FQX09VVF9BTVAgfCBBQ19XQ0FQX0lOX0FNUCk7CiAJCXUzMiBjYXBzID0gcXVlcnlfYW1wX2NhcHMoY29kZWMsCiAJCQkJc3BlYy0+YXV0b2NmZy5tb25vX291dF9waW4sIGRpcik7CiAJCWhkYV9uaWRfdCBjb25uX2xpc3RbMV07CkBAIC0yODEyLDIxICszMzE4LDI2IEBACiAJCQkJCQkhKHdjYXBzICYgQUNfV0NBUF9MUl9TV0FQKSkKIAkJCQkJc3BlYy0+bW9ub19uaWQgPSBjb25uX2xpc3RbMF07CiAJCX0KLQkJLyogYWxsIG1vbm8gb3V0cyBoYXZlIGEgbGVhc3QgYSBtdXRlL3VubXV0ZSBzd2l0Y2ggKi8KLQkJZXJyID0gc3RhYzkyeHhfYWRkX2NvbnRyb2woc3BlYywgU1RBQ19DVExfV0lER0VUX01VVEUsCi0JCQkiTW9ubyBQbGF5YmFjayBTd2l0Y2giLAotCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChzcGVjLT5hdXRvY2ZnLm1vbm9fb3V0X3BpbiwKLQkJCQkJMSwgMCwgZGlyKSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIHZvbHVtZSBzdXBwb3J0IGZvciB0aGUgYW1wICovCi0JCWlmICgoY2FwcyAmIEFDX0FNUENBUF9OVU1fU1RFUFMpID4+IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHsKLQkJCWVyciA9IHN0YWM5Mnh4X2FkZF9jb250cm9sKHNwZWMsIFNUQUNfQ1RMX1dJREdFVF9WT0wsCi0JCQkJIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmF1dG9jZmcubW9ub19vdXRfcGluLAotCQkJCQkxLCAwLCBkaXIpKTsKKwkJaWYgKGRpcikgeworCQkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubW9ub19vdXRfcGluOworCisJCQkvKiBtb3N0IG1vbm8gb3V0cyBoYXZlIGEgbGVhc3QgYSBtdXRlL3VubXV0ZSBzd2l0Y2ggKi8KKwkJCWRpciA9IChkaXIgJiBBQ19XQ0FQX09VVF9BTVApID8gSERBX09VVFBVVCA6IEhEQV9JTlBVVDsKKwkJCWVyciA9IHN0YWM5Mnh4X2FkZF9jb250cm9sKHNwZWMsIFNUQUNfQ1RMX1dJREdFVF9NVVRFLAorCQkJCSJNb25vIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsIGRpcikpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKKwkJCS8qIGNoZWNrIGZvciB2b2x1bWUgc3VwcG9ydCBmb3IgdGhlIGFtcCAqLworCQkJaWYgKChjYXBzICYgQUNfQU1QQ0FQX05VTV9TVEVQUykKKwkJCQkJPj4gQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVCkgeworCQkJCWVyciA9IHN0YWM5Mnh4X2FkZF9jb250cm9sKHNwZWMsCisJCQkJCVNUQUNfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSJNb25vIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsIGRpcikpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQogCQl9CiAKIAkJc3RhYzkyeHhfYXV0b19zZXRfcGluY3RsKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLm1vbm9fb3V0X3BpbiwKQEAgLTI4NDQsNiArMzM1NSwyOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJLyogc2V0dXAgYW5hbG9nIGJlZXAgY29udHJvbHMgKi8KKwlpZiAoc3BlYy0+YW5hYmVlcF9uaWQgPiAwKSB7CisJCWVyciA9IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX2JlZXBfY3Rscyhjb2RlYywKKwkJCXNwZWMtPmFuYWJlZXBfbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIHNldHVwIGRpZ2l0YWwgYmVlcCBjb250cm9scyBhbmQgaW5wdXQgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX1NORF9IREFfSU5QVVRfQkVFUAorCWlmIChzcGVjLT5kaWdiZWVwX25pZCA+IDApIHsKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmRpZ2JlZXBfbmlkOworCisJCWVyciA9IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX2JlZXBfY3Rscyhjb2RlYywgbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgbmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCiAJaWYgKGhwX3NwZWFrZXJfc3dhcCA9PSAxKSB7CiAJCS8qIFJlc3RvcmUgdGhlIGhwX291dHMgYW5kIGxpbmVfb3V0cyAqLwogCQltZW1jcHkoc3BlYy0+YXV0b2NmZy5ocF9waW5zLCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnMsCkBAIC0yODcyLDExICszNDA1LDI1IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9Ci0KLQlpZiAoc3BlYy0+bnVtX2RtaWNzID4gMCkKKwlpZiAoc3BlYy0+bnVtX2FtcHMgPiAwKSB7CisJCWVyciA9IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX2FtcF9vdXRwdXRfY3Rscyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNwZWMtPm51bV9kbWljcyA+IDAgJiYgIXNwZWMtPmRpbnB1dF9tdXgpCiAJCWlmICgoZXJyID0gc3RhYzkyeHhfYXV0b19jcmVhdGVfZG1pY19pbnB1dF9jdGxzKGNvZGVjLAogCQkJCQkJJnNwZWMtPmF1dG9jZmcpKSA8IDApCiAJCQlyZXR1cm4gZXJyOworCWlmIChzcGVjLT5udW1fbXV4ZXMgPiAwKSB7CisJCWVyciA9IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX211eF9pbnB1dF9jdGxzKGNvZGVjKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoc3BlYy0+bnVtX3NtdXhlcyA+IDApIHsKKwkJZXJyID0gc3RhYzkyeHhfYXV0b19jcmVhdGVfc3BkaWZfbXV4X2N0bHMoY29kZWMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQogCiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwogCWlmIChzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPiAyKQpAQCAtMjg4NCwxNyArMzQzMSwxNyBAQAogCiAJaWYgKHNwZWMtPmF1dG9jZmcuZGlnX291dF9waW4pCiAJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gZGlnX291dDsKLQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQorCWlmIChkaWdfaW4gJiYgc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQogCQlzcGVjLT5kaWdfaW5fbmlkID0gZGlnX2luOwogCiAJaWYgKHNwZWMtPmtjdGxfYWxsb2MpCiAJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKIAogCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7Ci0JaWYgKCFzcGVjLT5kaW5wdXRfbXV4KQotCQlzcGVjLT5kaW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CisJc3BlYy0+ZGlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2RpbXV4OworCXNwZWMtPnNpbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9zbXV4OwogCXNwZWMtPm1vbm9fbXV4ID0gJnNwZWMtPnByaXZhdGVfbW9ub19tdXg7Ci0KKwlzcGVjLT5hbXBfbXV4ID0gJnNwZWMtPnByaXZhdGVfYW1wX211eDsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMzA3NCw2ICszNjIxLDEyIEBACiAKIAlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBzcGVjLT5pbml0KTsKIAorCS8qIHBvd2VyIGRvd24gYWRjcyBpbml0aWFsbHkgKi8KKwlpZiAoc3BlYy0+cG93ZXJkb3duX2FkY3MpCisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fYWRjczsgaSsrKQorCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywKKwkJCQlzcGVjLT5hZGNfbmlkc1tpXSwgMCwKKwkJCQlBQ19WRVJCX1NFVF9QT1dFUl9TVEFURSwgQUNfUFdSU1RfRDMpOwogCS8qIHNldCB1cCBwaW5zICovCiAJaWYgKHNwZWMtPmhwX2RldGVjdCkgewogCQkvKiBFbmFibGUgdW5zb2xpY2l0ZWQgcmVzcG9uc2VzIG9uIHRoZSBIUCB3aWRnZXQgKi8KQEAgLTMwOTUsNyArMzY0OCwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKIAkJaGRhX25pZF90IG5pZCA9IGNmZy0+aW5wdXRfcGluc1tpXTsKIAkJaWYgKG5pZCkgewotCQkJdW5zaWduZWQgaW50IHBpbmN0bCA9IEFDX1BJTkNUTF9JTl9FTjsKKwkJCXVuc2lnbmVkIGludCBwaW5jdGwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwKKwkJCQkwLCBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDApOworCQkJLyogaWYgUElOQ1RMIGFscmVhZHkgc2V0IHRoZW4gc2tpcCAqLworCQkJaWYgKHBpbmN0bCAmIEFDX1BJTkNBUF9JTikKKwkJCQljb250aW51ZTsKKwkJCXBpbmN0bCA9IEFDX1BJTkNUTF9JTl9FTjsKIAkJCWlmIChpID09IEFVVE9fUElOX01JQyB8fCBpID09IEFVVE9fUElOX0ZST05UX01JQykKIAkJCQlwaW5jdGwgfD0gc3RhYzkyeHhfZ2V0X3ZyZWYoY29kZWMsIG5pZCk7CiAJCQlzdGFjOTJ4eF9hdXRvX3NldF9waW5jdGwoY29kZWMsIG5pZCwgcGluY3RsKTsKQEAgLTMxNTgsNiArMzcxNiw3IEBACiAJCWtmcmVlKHNwZWMtPmJpb3NfcGluX2NvbmZpZ3MpOwogCiAJa2ZyZWUoc3BlYyk7CisJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOwogfQogCiBzdGF0aWMgdm9pZCBzdGFjOTJ4eF9zZXRfcGluY3RsKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLApAQCAtMzI3OSw3ICszODM4LDEyIEBACiAJdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLCAweDBmZWMsIDB4MCkKIAkJCQkJCQkmIDB4MDAwMDAwZmY7CiAJcHJlc2VuY2UgPSBnZXRfaHBfcGluX3ByZXNlbmNlKGNvZGVjLCBuaWQpOwotCWlkeCA9IDEgPDwgaWR4OworCisJLyogc2V2ZXJhbCBjb2RlY3MgaGF2ZSB0d28gcG93ZXIgZG93biBiaXRzICovCisJaWYgKHNwZWMtPnB3cl9tYXBwaW5nKQorCQlpZHggPSBzcGVjLT5wd3JfbWFwcGluZ1tpZHhdOworCWVsc2UKKwkJaWR4ID0gMSA8PCBpZHg7CiAKIAlpZiAocHJlc2VuY2UpCiAJCXZhbCAmPSB+aWR4OwpAQCAtMzI5NSwxMyArMzg1OSwyMiBAQAogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGlkeCA9IHJlcyA+PiAyNiAmIDB4MGY7CiAKLQlzd2l0Y2ggKChyZXMgPj4gMjYpICYgMHgzMCkgeworCXN3aXRjaCAoKHJlcyA+PiAyNikgJiAweDcwKSB7CiAJY2FzZSBTVEFDX0hQX0VWRU5UOgogCQlzdGFjOTJ4eF9ocF9kZXRlY3QoY29kZWMsIHJlcyk7CiAJCS8qIGZhbGx0aHJ1ICovCiAJY2FzZSBTVEFDX1BXUl9FVkVOVDoKIAkJaWYgKHNwZWMtPm51bV9wd3JzID4gMCkKIAkJCXN0YWM5Mnh4X3Bpbl9zZW5zZShjb2RlYywgaWR4KTsKKwkJYnJlYWs7CisJY2FzZSBTVEFDX1ZSRUZfRVZFTlQ6IHsKKwkJaW50IGRhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQlBQ19WRVJCX0dFVF9HUElPX0RBVEEsIDApOworCQkvKiB0b2dnbGUgVlJFRiBzdGF0ZSBiYXNlZCBvbiBHUElPeCBzdGF0dXMgKi8KKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwgMHg3ZTAsCisJCQkhIShkYXRhICYgKDEgPDwgaWR4KSkpOworCQlicmVhazsKKwkJfQogCX0KIH0KIApAQCAtMzQ3OCw5ICs0MDUxLDkgQEAKIAkubnVtX2l0ZW1zID0gNCwKIAkuaXRlbXMgPSB7CiAJCXsgIkFuYWxvZyBJbnB1dHMiLCAweDBiIH0sCi0JCXsgIkNEIiwgMHgwOCB9LAogCQl7ICJEaWdpdGFsIE1pYyAxIiwgMHgwOSB9LAogCQl7ICJEaWdpdGFsIE1pYyAyIiwgMHgwYSB9LAorCQl7ICJDRCIsIDB4MDggfSwKIAl9CiB9OwogCkBAIC0zNDk1LDYgKzQwNjgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKKwljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBzdGFjOTJoZDczeHhfc2xhdmVfZGlnX291dHM7CiAJc3BlYy0+bnVtX3BpbnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzN4eF9waW5fbmlkcyk7CiAJc3BlYy0+cGluX25pZHMgPSBzdGFjOTJoZDczeHhfcGluX25pZHM7CiAJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsCkBAIC0zNTI3LDE3ICs0MTAxLDE0IEBACiAKIAlzd2l0Y2ggKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKSB7CiAJY2FzZSAweDM6IC8qIDYgQ2hhbm5lbCAqLwotCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSAweDE3OwogCQlzcGVjLT5taXhlciA9IHN0YWM5MmhkNzN4eF82Y2hfbWl4ZXI7CiAJCXNwZWMtPmluaXQgPSBzdGFjOTJoZDczeHhfNmNoX2NvcmVfaW5pdDsKIAkJYnJlYWs7CiAJY2FzZSAweDQ6IC8qIDggQ2hhbm5lbCAqLwotCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSAweDE4OwogCQlzcGVjLT5taXhlciA9IHN0YWM5MmhkNzN4eF84Y2hfbWl4ZXI7CiAJCXNwZWMtPmluaXQgPSBzdGFjOTJoZDczeHhfOGNoX2NvcmVfaW5pdDsKIAkJYnJlYWs7CiAJY2FzZSAweDU6IC8qIDEwIENoYW5uZWwgKi8KLQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMHgxOTsKIAkJc3BlYy0+bWl4ZXIgPSBzdGFjOTJoZDczeHhfMTBjaF9taXhlcjsKIAkJc3BlYy0+aW5pdCA9IHN0YWM5MmhkNzN4eF8xMGNoX2NvcmVfaW5pdDsKIAl9OwpAQCAtMzU0NiwyNyArNDExNywzNCBAQAogCXNwZWMtPmFsb29wYmFja19tYXNrID0gMHgwMTsKIAlzcGVjLT5hbG9vcGJhY2tfc2hpZnQgPSA4OwogCisJc3BlYy0+ZGlnYmVlcF9uaWQgPSAweDFjOwogCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyaGQ3M3h4X211eF9uaWRzOwogCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyaGQ3M3h4X2FkY19uaWRzOwogCXNwZWMtPmRtaWNfbmlkcyA9IHN0YWM5MmhkNzN4eF9kbWljX25pZHM7CiAJc3BlYy0+ZG11eF9uaWRzID0gc3RhYzkyaGQ3M3h4X2RtdXhfbmlkczsKKwlzcGVjLT5zbXV4X25pZHMgPSBzdGFjOTJoZDczeHhfc211eF9uaWRzOworCXNwZWMtPmFtcF9uaWRzID0gc3RhYzkyaGQ3M3h4X2FtcF9uaWRzOworCXNwZWMtPm51bV9hbXBzID0gQVJSQVlfU0laRShzdGFjOTJoZDczeHhfYW1wX25pZHMpOwogCiAJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTJoZDczeHhfbXV4X25pZHMpOwogCXNwZWMtPm51bV9hZGNzID0gQVJSQVlfU0laRShzdGFjOTJoZDczeHhfYWRjX25pZHMpOwogCXNwZWMtPm51bV9kbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzN4eF9kbXV4X25pZHMpOwotCXNwZWMtPmRpbnB1dF9tdXggPSAmc3RhYzkyaGQ3M3h4X2RtdXg7Ci0JLyogR1BJTzAgSGlnaCA9IEVuYWJsZSBFQVBEICovCi0Jc3BlYy0+ZWFwZF9tYXNrID0gc3BlYy0+Z3Bpb19tYXNrID0gc3BlYy0+Z3Bpb19kaXIgPSAweDE7Ci0Jc3BlYy0+Z3Bpb19kYXRhID0gMHgwMTsKKwltZW1jcHkoJnNwZWMtPnByaXZhdGVfZGltdXgsICZzdGFjOTJoZDczeHhfZG11eCwKKwkJCXNpemVvZihzdGFjOTJoZDczeHhfZG11eCkpOwogCiAJc3dpdGNoIChzcGVjLT5ib2FyZF9jb25maWcpIHsKIAljYXNlIFNUQUNfREVMTF9NNjoKIAkJc3BlYy0+aW5pdCA9IGRlbGxfZXFfY29yZV9pbml0OworCQlzcGVjLT5udW1fc211eGVzID0gMDsKKwkJc3BlYy0+bWl4ZXIgPSAmc3RhYzkyaGQ3M3h4XzZjaF9taXhlcltERUxMX002X01JWEVSXTsKKwkJc3BlYy0+YW1wX25pZHMgPSAmc3RhYzkyaGQ3M3h4X2FtcF9uaWRzW0RFTExfTTZfQU1QXTsKKwkJc3BlYy0+bnVtX2FtcHMgPSAxOwogCQlzd2l0Y2ggKGNvZGVjLT5zdWJzeXN0ZW1faWQpIHsKIAkJY2FzZSAweDEwMjgwMjVlOiAvKiBBbmFsb2cgTWljcyAqLwogCQljYXNlIDB4MTAyODAyNWY6CiAJCQlzdGFjOTJ4eF9zZXRfY29uZmlnX3JlZyhjb2RlYywgMHgwYiwgMHg5MEE3MDE3MCk7CiAJCQlzcGVjLT5udW1fZG1pY3MgPSAwOworCQkJc3BlYy0+cHJpdmF0ZV9kaW11eC5udW1faXRlbXMgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMDI4MDI3MTogLyogRGlnaXRhbCBNaWNzICovCiAJCWNhc2UgMHgxMDI4MDI3MjoKQEAgLTM1NzYsMjMgKzQxNTQsMzIgQEAKIAkJY2FzZSAweDEwMjgwMjU1OgogCQkJc3RhYzkyeHhfc2V0X2NvbmZpZ19yZWcoY29kZWMsIDB4MTMsIDB4OTBBNjAxNjApOwogCQkJc3BlYy0+bnVtX2RtaWNzID0gMTsKKwkJCXNwZWMtPnByaXZhdGVfZGltdXgubnVtX2l0ZW1zID0gMjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTAyODAyNTY6IC8qIEJvdGggKi8KIAkJY2FzZSAweDEwMjgwMDU3OgogCQkJc3RhYzkyeHhfc2V0X2NvbmZpZ19yZWcoY29kZWMsIDB4MGIsIDB4OTBBNzAxNzApOwogCQkJc3RhYzkyeHhfc2V0X2NvbmZpZ19yZWcoY29kZWMsIDB4MTMsIDB4OTBBNjAxNjApOwogCQkJc3BlYy0+bnVtX2RtaWNzID0gMTsKKwkJCXNwZWMtPnByaXZhdGVfZGltdXgubnVtX2l0ZW1zID0gMjsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNwZWMtPm51bV9kbWljcyA9IFNUQUM5MkhENzNYWF9OVU1fRE1JQ1M7CisJCXNwZWMtPm51bV9zbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzN4eF9zbXV4X25pZHMpOwogCX0KKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID4gU1RBQ185MkhENzNYWF9SRUYpIHsKKwkJLyogR1BJTzAgSGlnaCA9IEVuYWJsZSBFQVBEICovCisJCXNwZWMtPmVhcGRfbWFzayA9IHNwZWMtPmdwaW9fbWFzayA9IHNwZWMtPmdwaW9fZGlyID0gMHgxOworCQlzcGVjLT5ncGlvX2RhdGEgPSAweDAxOworCX0KKwlzcGVjLT5kaW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CiAKIAlzcGVjLT5udW1fcHdycyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ3M3h4X3B3cl9uaWRzKTsKIAlzcGVjLT5wd3JfbmlkcyA9IHN0YWM5MmhkNzN4eF9wd3JfbmlkczsKIAotCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDIyLCAweDI0KTsKKwllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgyNSwgMHgyNyk7CiAKIAlpZiAoIWVycikgewogCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewpAQCAtMzYxNCw2ICs0MjAxLDE0NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggc3RhYzkyaGQ4M3h4eF9kbXV4ID0geworCS5udW1faXRlbXMgPSAzLAorCS5pdGVtcyA9IHsKKwkJeyAiQW5hbG9nIElucHV0cyIsIDB4MDMgfSwKKwkJeyAiRGlnaXRhbCBNaWMgMSIsIDB4MDQgfSwKKwkJeyAiRGlnaXRhbCBNaWMgMiIsIDB4MDUgfSwKKwl9Cit9OworCitzdGF0aWMgaW50IHBhdGNoX3N0YWM5MmhkODN4eHgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWM7CisJaW50IGVycjsKKworCXNwZWMgID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKwljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBzdGFjOTJoZDgzeHh4X3NsYXZlX2RpZ19vdXRzOworCXNwZWMtPm1vbm9fbmlkID0gMHgxOTsKKwlzcGVjLT5kaWdiZWVwX25pZCA9IDB4MjE7CisJc3BlYy0+ZG1pY19uaWRzID0gc3RhYzkyaGQ4M3h4eF9kbWljX25pZHM7CisJc3BlYy0+ZG11eF9uaWRzID0gc3RhYzkyaGQ4M3h4eF9kbXV4X25pZHM7CisJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTJoZDgzeHh4X2FkY19uaWRzOworCXNwZWMtPnB3cl9uaWRzID0gc3RhYzkyaGQ4M3h4eF9wd3JfbmlkczsKKwlzcGVjLT5wd3JfbWFwcGluZyA9IHN0YWM5MmhkODN4eHhfcHdyX21hcHBpbmc7CisJc3BlYy0+bnVtX3B3cnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkODN4eHhfcHdyX25pZHMpOworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3RhYzkyaGQ4M3h4eF9kYWNfbmlkczsKKworCXNwZWMtPmluaXQgPSBzdGFjOTJoZDgzeHh4X2NvcmVfaW5pdDsKKwlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwljYXNlIDB4MTExZDc2MDU6CisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gU1RBQzkySEQ4MV9EQUNfQ09VTlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwZWMtPm51bV9wd3JzLS07CisJCXNwZWMtPmluaXQrKzsgLyogc3dpdGNoIHRvIGNvbmZpZyAjMiAqLworCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IFNUQUM5MkhEODNfREFDX0NPVU5UOworCX0KKworCXNwZWMtPm1peGVyID0gc3RhYzkyaGQ4M3h4eF9taXhlcjsKKwlzcGVjLT5udW1fcGlucyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ4M3h4eF9waW5fbmlkcyk7CisJc3BlYy0+bnVtX2RtdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ4M3h4eF9kbXV4X25pZHMpOworCXNwZWMtPm51bV9hZGNzID0gQVJSQVlfU0laRShzdGFjOTJoZDgzeHh4X2FkY19uaWRzKTsKKwlzcGVjLT5udW1fZG1pY3MgPSBTVEFDOTJIRDgzWFhYX05VTV9ETUlDUzsKKwlzcGVjLT5kaW5wdXRfbXV4ID0gJnN0YWM5MmhkODN4eHhfZG11eDsKKwlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MmhkODN4eHhfcGluX25pZHM7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsCisJCQkJCQkJU1RBQ185MkhEODNYWFhfTU9ERUxTLAorCQkJCQkJCXN0YWM5MmhkODN4eHhfbW9kZWxzLAorCQkJCQkJCXN0YWM5MmhkODN4eHhfY2ZnX3RibCk7CithZ2FpbjoKKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IiCisJCQkiIFNUQUM5MkhEODNYWFgsIHVzaW5nIEJJT1MgZGVmYXVsdHNcbiIpOworCQllcnIgPSBzdGFjOTJ4eF9zYXZlX2Jpb3NfY29uZmlnX3JlZ3MoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJc3RhYzkyeHhfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNwZWMtPnBpbl9jb25maWdzID0gc3BlYy0+Ymlvc19waW5fY29uZmlnczsKKwl9IGVsc2UgeworCQlzcGVjLT5waW5fY29uZmlncyA9IHN0YWM5MmhkODN4eHhfYnJkX3RibFtzcGVjLT5ib2FyZF9jb25maWddOworCQlzdGFjOTJ4eF9zZXRfY29uZmlnX3JlZ3MoY29kZWMpOworCX0KKworCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDFkLCAwKTsKKwlpZiAoIWVycikgeworCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBObyBhdXRvLWNvbmZpZyBpcyAiCisJCQkgICAgICAgImF2YWlsYWJsZSwgZGVmYXVsdCB0byBtb2RlbD1yZWZcbiIpOworCQkJc3BlYy0+Ym9hcmRfY29uZmlnID0gU1RBQ185MkhEODNYWFhfUkVGOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmIChlcnIgPCAwKSB7CisJCXN0YWM5Mnh4X2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWNvZGVjLT5wYXRjaF9vcHMgPSBzdGFjOTJ4eF9wYXRjaF9vcHM7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNORF9IREFfTkVFRFNfUkVTVU1FCitzdGF0aWMgdm9pZCBzdGFjOTJoZDcxeHhfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgcHdyKQoreworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIHB3cik7CisKKwltc2xlZXAoMSk7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9hZGNzOyBpKyspIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywKKwkJCXNwZWMtPmFkY19uaWRzW2ldLCAwLAorCQkJQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIHB3cik7CisJfQorfTsKKworc3RhdGljIGludCBzdGFjOTJoZDcxeHhfcmVzdW1lKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0YWM5MmhkNzF4eF9zZXRfcG93ZXJfc3RhdGUoY29kZWMsIEFDX1BXUlNUX0QwKTsKKwlyZXR1cm4gc3RhYzkyeHhfcmVzdW1lKGNvZGVjKTsKK30KKworc3RhdGljIGludCBzdGFjOTJoZDcxeHhfc3VzcGVuZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0YWM5MmhkNzF4eF9zZXRfcG93ZXJfc3RhdGUoY29kZWMsIEFDX1BXUlNUX0QzKTsKKwlyZXR1cm4gMDsKK307CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19vcHMgc3RhYzkyaGQ3MWJ4eF9wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gc3RhYzkyeHhfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBzdGFjOTJ4eF9idWlsZF9wY21zLAorCS5pbml0ID0gc3RhYzkyeHhfaW5pdCwKKwkuZnJlZSA9IHN0YWM5Mnh4X2ZyZWUsCisJLnVuc29sX2V2ZW50ID0gc3RhYzkyeHhfdW5zb2xfZXZlbnQsCisjaWZkZWYgU05EX0hEQV9ORUVEU19SRVNVTUUKKwkucmVzdW1lID0gc3RhYzkyaGQ3MXh4X3Jlc3VtZSwKKwkuc3VzcGVuZCA9IHN0YWM5MmhkNzF4eF9zdXNwZW5kLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggc3RhYzkyaGQ3MWJ4eF9kbXV4ID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiQW5hbG9nIElucHV0cyIsIDB4MDAgfSwKKwkJeyAiTWl4ZXIiLCAweDAxIH0sCisJCXsgIkRpZ2l0YWwgTWljIDEiLCAweDAyIH0sCisJCXsgIkRpZ2l0YWwgTWljIDIiLCAweDAzIH0sCisJfQorfTsKKwogc3RhdGljIGludCBwYXRjaF9zdGFjOTJoZDcxYnh4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjOwpAQCAtMzYyNCw5ICs0MzUxLDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29kZWMtPnNwZWMgPSBzcGVjOworCWNvZGVjLT5wYXRjaF9vcHMgPSBzdGFjOTJ4eF9wYXRjaF9vcHM7CiAJc3BlYy0+bnVtX3BpbnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzFieHhfcGluX25pZHMpOwogCXNwZWMtPm51bV9wd3JzID0gQVJSQVlfU0laRShzdGFjOTJoZDcxYnh4X3B3cl9uaWRzKTsKIAlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MmhkNzFieHhfcGluX25pZHM7CisJbWVtY3B5KCZzcGVjLT5wcml2YXRlX2RpbXV4LCAmc3RhYzkyaGQ3MWJ4eF9kbXV4LAorCQkJc2l6ZW9mKHN0YWM5MmhkNzFieHhfZG11eCkpOwogCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLAogCQkJCQkJCVNUQUNfOTJIRDcxQlhYX01PREVMUywKIAkJCQkJCQlzdGFjOTJoZDcxYnh4X21vZGVscywKQEAgLTM2NTMsNDcgKzQzODMsMTAxIEBACiAJY2FzZSAweDExMWQ3NmI1OgogCQlzcGVjLT5taXhlciA9IHN0YWM5MmhkNzFieHhfbWl4ZXI7CiAJCXNwZWMtPmluaXQgPSBzdGFjOTJoZDcxYnh4X2NvcmVfaW5pdDsKKwkJY29kZWMtPnNsYXZlX2RpZ19vdXRzID0gc3RhYzkyaGQ3MWJ4eF9zbGF2ZV9kaWdfb3V0czsKIAkJYnJlYWs7CiAJY2FzZSAweDExMWQ3NjA4OiAvKiA1IFBvcnQgd2l0aCBBbmFsb2cgTWl4ZXIgKi8KKwkJc3dpdGNoIChjb2RlYy0+c3Vic3lzdGVtX2lkKSB7CisJCWNhc2UgMHgxMDNjMzYxYToKKwkJCS8qIEVuYWJsZSBWUkVGIHBvd2VyIHNhdmluZyBvbiBHUElPMSBkZXRlY3QgKi8KKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkJQUNfVkVSQl9TRVRfR1BJT19VTlNPTElDSVRFRF9SU1BfTUFTSywgMHgwMik7CisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCisJCQkJCShBQ19VU1JTUF9FTiB8IFNUQUNfVlJFRl9FVkVOVCB8IDB4MDEpKTsKKwkJCXNwZWMtPmdwaW9fbWFzayB8PSAweDAyOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChjb2RlYy0+cmV2aXNpb25faWQgJiAweGYpID09IDAgfHwKKwkJCQkoY29kZWMtPnJldmlzaW9uX2lkICYgMHhmKSA9PSAxKSB7CisjaWZkZWYgU05EX0hEQV9ORUVEU19SRVNVTUUKKwkJCWNvZGVjLT5wYXRjaF9vcHMgPSBzdGFjOTJoZDcxYnh4X3BhdGNoX29wczsKKyNlbmRpZgorCQkJc3BlYy0+c3RyZWFtX2RlbGF5ID0gNDA7IC8qIDQwIG1pbGxpc2Vjb25kcyAqLworCQl9CisKIAkJLyogbm8gb3V0cHV0IGFtcHMgKi8KIAkJc3BlYy0+bnVtX3B3cnMgPSAwOwogCQlzcGVjLT5taXhlciA9IHN0YWM5MmhkNzFieHhfYW5hbG9nX21peGVyOworCQlzcGVjLT5kaW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CiAKIAkJLyogZGlzYWJsZSBWU1cgKi8KIAkJc3BlYy0+aW5pdCA9ICZzdGFjOTJoZDcxYnh4X2FuYWxvZ19jb3JlX2luaXRbSERfRElTQUJMRV9QT1JURl07CiAJCXN0YWM5Mnh4X3NldF9jb25maWdfcmVnKGNvZGVjLCAweGYsIDB4NDBmMDAwZjApOwogCQlicmVhazsKIAljYXNlIDB4MTExZDc2MDM6IC8qIDYgUG9ydCB3aXRoIEFuYWxvZyBNaXhlciAqLworCQlpZiAoKGNvZGVjLT5yZXZpc2lvbl9pZCAmIDB4ZikgPT0gMSkgeworI2lmZGVmIFNORF9IREFfTkVFRFNfUkVTVU1FCisJCQljb2RlYy0+cGF0Y2hfb3BzID0gc3RhYzkyaGQ3MWJ4eF9wYXRjaF9vcHM7CisjZW5kaWYKKwkJCXNwZWMtPnN0cmVhbV9kZWxheSA9IDQwOyAvKiA0MCBtaWxsaXNlY29uZHMgKi8KKwkJfQorCiAJCS8qIG5vIG91dHB1dCBhbXBzICovCiAJCXNwZWMtPm51bV9wd3JzID0gMDsKIAkJLyogZmFsbHRocnUgKi8KIAlkZWZhdWx0OgorCQlzcGVjLT5kaW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CiAJCXNwZWMtPm1peGVyID0gc3RhYzkyaGQ3MWJ4eF9hbmFsb2dfbWl4ZXI7CiAJCXNwZWMtPmluaXQgPSBzdGFjOTJoZDcxYnh4X2FuYWxvZ19jb3JlX2luaXQ7CisJCWNvZGVjLT5zbGF2ZV9kaWdfb3V0cyA9IHN0YWM5MmhkNzFieHhfc2xhdmVfZGlnX291dHM7CiAJfQogCi0Jc3BlYy0+YWxvb3BiYWNrX21hc2sgPSAweDIwOworCXNwZWMtPmFsb29wYmFja19tYXNrID0gMHg1MDsKIAlzcGVjLT5hbG9vcGJhY2tfc2hpZnQgPSAwOwogCi0JLyogR1BJTzAgSGlnaCA9IEVBUEQgKi8KLQlzcGVjLT5ncGlvX21hc2sgPSAweDAxOwotCXNwZWMtPmdwaW9fZGlyID0gMHgwMTsKLQlzcGVjLT5ncGlvX2RhdGEgPSAweDAxOworCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPiBTVEFDXzkySEQ3MUJYWF9SRUYpIHsKKwkJLyogR1BJTzAgPSBFQVBEICovCisJCXNwZWMtPmdwaW9fbWFzayA9IDB4MDE7CisJCXNwZWMtPmdwaW9fZGlyID0gMHgwMTsKKwkJc3BlYy0+Z3Bpb19kYXRhID0gMHgwMTsKKwl9CiAKKwlzcGVjLT5wb3dlcmRvd25fYWRjcyA9IDE7CisJc3BlYy0+ZGlnYmVlcF9uaWQgPSAweDI2OwogCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyaGQ3MWJ4eF9tdXhfbmlkczsKIAlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5MmhkNzFieHhfYWRjX25pZHM7CiAJc3BlYy0+ZG1pY19uaWRzID0gc3RhYzkyaGQ3MWJ4eF9kbWljX25pZHM7CiAJc3BlYy0+ZG11eF9uaWRzID0gc3RhYzkyaGQ3MWJ4eF9kbXV4X25pZHM7CisJc3BlYy0+c211eF9uaWRzID0gc3RhYzkyaGQ3MWJ4eF9zbXV4X25pZHM7CiAJc3BlYy0+cHdyX25pZHMgPSBzdGFjOTJoZDcxYnh4X3B3cl9uaWRzOwogCiAJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTJoZDcxYnh4X211eF9uaWRzKTsKIAlzcGVjLT5udW1fYWRjcyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ3MWJ4eF9hZGNfbmlkcyk7Ci0Jc3BlYy0+bnVtX2RtaWNzID0gU1RBQzkySEQ3MUJYWF9OVU1fRE1JQ1M7Ci0Jc3BlYy0+bnVtX2RtdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ3MWJ4eF9kbXV4X25pZHMpOworCisJc3dpdGNoIChzcGVjLT5ib2FyZF9jb25maWcpIHsKKwljYXNlIFNUQUNfSFBfTTQ6CisJCXNwZWMtPm51bV9kbWljcyA9IDA7CisJCXNwZWMtPm51bV9zbXV4ZXMgPSAwOworCQlzcGVjLT5udW1fZG11eGVzID0gMDsKKworCQkvKiBlbmFibGUgaW50ZXJuYWwgbWljcm9waG9uZSAqLworCQlzdGFjOTJ4eF9zZXRfY29uZmlnX3JlZyhjb2RlYywgMHgwZSwgMHgwMTgxMzA0MCk7CisJCXN0YWM5Mnh4X2F1dG9fc2V0X3BpbmN0bChjb2RlYywgMHgwZSwKKwkJCUFDX1BJTkNUTF9JTl9FTiB8IEFDX1BJTkNUTF9WUkVGXzgwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3BlYy0+bnVtX2RtaWNzID0gU1RBQzkySEQ3MUJYWF9OVU1fRE1JQ1M7CisJCXNwZWMtPm51bV9zbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzFieHhfc211eF9uaWRzKTsKKwkJc3BlYy0+bnVtX2RtdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ3MWJ4eF9kbXV4X25pZHMpOworCX07CiAKIAlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7CiAJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMHgxMTsKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHN0YWM5MmhkNzFieHhfZGFjX25pZHM7CisJaWYgKHNwZWMtPmRpbnB1dF9tdXgpCisJCXNwZWMtPnByaXZhdGVfZGltdXgubnVtX2l0ZW1zICs9CisJCQlzcGVjLT5udW1fZG1pY3MgLQorCQkJCShBUlJBWV9TSVpFKHN0YWM5MmhkNzFieHhfZG1pY19uaWRzKSAtIDEpOwogCiAJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIDB4MjEsIDB4MjMpOwogCWlmICghZXJyKSB7CkBAIC0zNzExLDggKzQ0OTUsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWNvZGVjLT5wYXRjaF9vcHMgPSBzdGFjOTJ4eF9wYXRjaF9vcHM7Ci0KIAlyZXR1cm4gMDsKIH07CiAKQEAgLTM4NTQsMTAgKzQ2MzYsMTQgQEAKIAkJc3RhYzkyeHhfc2V0X2NvbmZpZ19yZWdzKGNvZGVjKTsKIAl9CiAKKwlzcGVjLT5kaWdiZWVwX25pZCA9IDB4MjM7CiAJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTI3eF9hZGNfbmlkczsKIAlzcGVjLT5udW1fYWRjcyA9IEFSUkFZX1NJWkUoc3RhYzkyN3hfYWRjX25pZHMpOwogCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyN3hfbXV4X25pZHM7CiAJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTI3eF9tdXhfbmlkcyk7CisJc3BlYy0+c211eF9uaWRzID0gc3RhYzkyN3hfc211eF9uaWRzOworCXNwZWMtPm51bV9zbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5Mjd4X3NtdXhfbmlkcyk7CisJc3BlYy0+c3BkaWZfbGFiZWxzID0gc3RhYzkyN3hfc3BkaWZfbGFiZWxzOwogCXNwZWMtPmRhY19saXN0ID0gc3RhYzkyN3hfZGFjX25pZHM7CiAJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5kYWNfbmlkczsKIApAQCAtMzkwMCw5ICs0Njg2LDExIEBACiAJCXNwZWMtPm51bV9kbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5Mjd4X2RtdXhfbmlkcyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCS8qIEdQSU8wIEhpZ2ggPSBFbmFibGUgRUFQRCAqLwotCQlzcGVjLT5lYXBkX21hc2sgPSBzcGVjLT5ncGlvX21hc2sgPSBzcGVjLT5ncGlvX2RpciA9IDB4MTsKLQkJc3BlYy0+Z3Bpb19kYXRhID0gMHgwMTsKKwkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA+IFNUQUNfRDk2NV9SRUYpIHsKKwkJCS8qIEdQSU8wIEhpZ2ggPSBFbmFibGUgRUFQRCAqLworCQkJc3BlYy0+ZWFwZF9tYXNrID0gc3BlYy0+Z3Bpb19tYXNrID0gMHgwMTsKKwkJCXNwZWMtPmdwaW9fZGlyID0gc3BlYy0+Z3Bpb19kYXRhID0gMHgwMTsKKwkJfQogCQlzcGVjLT5udW1fZG1pY3MgPSAwOwogCiAJCXNwZWMtPmluaXQgPSBzdGFjOTI3eF9jb3JlX2luaXQ7CkBAIC0zOTc0LDEwICs0NzYyLDEzIEBACiAJCXN0YWM5Mnh4X3NldF9jb25maWdfcmVncyhjb2RlYyk7CiAJfQogCisJc3BlYy0+ZGlnYmVlcF9uaWQgPSAweDIzOwogCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyMDVfYWRjX25pZHM7CiAJc3BlYy0+bnVtX2FkY3MgPSBBUlJBWV9TSVpFKHN0YWM5MjA1X2FkY19uaWRzKTsKIAlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5MjA1X211eF9uaWRzOwogCXNwZWMtPm51bV9tdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyMDVfbXV4X25pZHMpOworCXNwZWMtPnNtdXhfbmlkcyA9IHN0YWM5MjA1X3NtdXhfbmlkczsKKwlzcGVjLT5udW1fc211eGVzID0gQVJSQVlfU0laRShzdGFjOTIwNV9zbXV4X25pZHMpOwogCXNwZWMtPmRtaWNfbmlkcyA9IHN0YWM5MjA1X2RtaWNfbmlkczsKIAlzcGVjLT5udW1fZG1pY3MgPSBTVEFDOTIwNV9OVU1fRE1JQ1M7CiAJc3BlYy0+ZG11eF9uaWRzID0gc3RhYzkyMDVfZG11eF9uaWRzOwpAQCAtNDAxMyw2ICs0ODA0LDkgQEAKIAkJICovCiAJCXNwZWMtPmdwaW9fZGF0YSA9IDB4MDE7CiAJCWJyZWFrOworCWNhc2UgU1RBQ185MjA1X1JFRjoKKwkJLyogU1BESUYtSW4gZW5hYmxlZCAqLworCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBHUElPMCBIaWdoID0gRUFQRCAqLwogCQlzcGVjLT5lYXBkX21hc2sgPSBzcGVjLT5ncGlvX21hc2sgPSBzcGVjLT5ncGlvX2RpciA9IDB4MTsKQEAgLTQzMzIsNiArNTEyNiw4IEBACiAgCXsgLmlkID0gMHg4Mzg0NzZhNiwgLm5hbWUgPSAiU1RBQzkyNTQiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTIwNSB9LAogIAl7IC5pZCA9IDB4ODM4NDc2YTcsIC5uYW1lID0gIlNUQUM5MjU0RCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjA1IH0sCiAJeyAuaWQgPSAweDExMWQ3NjAzLCAubmFtZSA9ICI5MkhENzVCM1g1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ3MWJ4eH0sCisJeyAuaWQgPSAweDExMWQ3NjA0LCAubmFtZSA9ICI5MkhEODNDMVg1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ4M3h4eH0sCisJeyAuaWQgPSAweDExMWQ3NjA1LCAubmFtZSA9ICI5MkhEODFCMVg1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ4M3h4eH0sCiAJeyAuaWQgPSAweDExMWQ3NjA4LCAubmFtZSA9ICI5MkhENzVCMlg1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ3MWJ4eH0sCiAJeyAuaWQgPSAweDExMWQ3Njc0LCAubmFtZSA9ICI5MkhENzNEMVg1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ3M3h4IH0sCiAJeyAuaWQgPSAweDExMWQ3Njc1LCAubmFtZSA9ICI5MkhENzNDMVg1IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ3M3h4IH0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCBlN2U0MzUyLi42M2U0ODcxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTEsMTAgKzEsMTAgQEAKIC8qCiAgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKICAqCi0gKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIFZJQSBWVDE3MDggY29kZWMKKyAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgVklBIFZUMTcwMi9WVDE3MDgvVlQxNzA5IGNvZGVjCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2IEx5ZGlhIFdhbmcgPGx5ZGlhd2FuZ0B2aWF0ZWNoLmNvbT4KLSAqICAgICAgICAgICAgICAgICAgICBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBMeWRpYSBXYW5nIDxseWRpYXdhbmdAdmlhdGVjaC5jb20+CisgKgkJCSAgIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KICAqCiAgKiAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yOSw2ICsyOSwxMyBAQAogLyogMjAwNi0wOS0wOCAgTHlkaWEgV2FuZyAgRml4IGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzb3VyY2Ugc2VsZWN0IGJ1ZyAqLwogLyogMjAwNy0wOS0xMiAgTHlkaWEgV2FuZyAgQWRkIEVBUEQgZW5hYmxlIGR1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24gICAgICAqLwogLyogMjAwNy0wOS0xNyAgTHlkaWEgV2FuZyAgQWRkIFZUMTcwOEIgY29kZWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAyMDA3LTExLTE0ICBMeWRpYSBXYW5nICBBZGQgVlQxNzA4QSBjb2RlYyBIUCBhbmQgQ0QgcGluIGNvbm5lY3QgY29uZmlnICAgICovCisvKiAyMDA4LTAyLTAzICBMeWRpYSBXYW5nICBGaXggUmVhciBjaGFubmVscyBhbmQgQmFjayBjaGFubmVscyBpbnZlcnNlIGlzc3VlICovCisvKiAyMDA4LTAzLTA2ICBMeWRpYSBXYW5nICBBZGQgVlQxNzAyIGNvZGVjIGFuZCBWVDE3MDhTIGNvZGVjIHN1cHBvcnQgICAgICAgICovCisvKiAyMDA4LTA0LTA5ICBMeWRpYSBXYW5nICBBZGQgbXV0ZSBmcm9udCBzcGVha2VyIHdoZW4gSFAgcGx1Z2luICAgICAgICAgICAgICovCisvKiAyMDA4LTA0LTA5ICBMeWRpYSBXYW5nICBBZGQgSW5kZXBlbmRlbnQgSFAgZmVhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAyMDA4LTA1LTI4ICBMeWRpYSBXYW5nICBBZGQgc2Vjb25kIFMvUERJRiBPdXQgc3VwcG9ydCBmb3IgVlQxNzAyCSAgICAgKi8KKy8qIDIwMDgtMDktMTUgIExvZ2FuIExpICAgIEFkZCBWVDE3MDhTIE1pYyBCb29zdCB3b3JrYXJvdW5kL2JhY2tkb29yCSAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KIApAQCAtMzcsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgogI2luY2x1ZGUgImhkYV9wYXRjaC5oIgpAQCAtNTMsNiArNjEsOCBAQAogI2RlZmluZSBWVDE3MDhfRElHT1VUX05JRAkweDE0CiAjZGVmaW5lIFZUMTcwOF9ESUdJTl9OSUQJMHgxNgogI2RlZmluZSBWVDE3MDhfRElHSU5fUElOCTB4MjYKKyNkZWZpbmUgVlQxNzA4X0hQX1BJTl9OSUQJMHgyMAorI2RlZmluZSBWVDE3MDhfQ0RfUElOX05JRAkweDI0CiAKICNkZWZpbmUgVlQxNzA5X0hQX0RBQ19OSUQJMHgyOAogI2RlZmluZSBWVDE3MDlfRElHT1VUX05JRAkweDEzCkBAIC02NCwxMiArNzQsNjQgQEAKICNkZWZpbmUgVlQxNzA4Ql9ESUdJTl9OSUQJMHgxNQogI2RlZmluZSBWVDE3MDhCX0RJR0lOX1BJTgkweDIxCiAKKyNkZWZpbmUgVlQxNzA4U19IUF9OSUQJCTB4MjUKKyNkZWZpbmUgVlQxNzA4U19ESUdPVVRfTklECTB4MTIKKworI2RlZmluZSBWVDE3MDJfSFBfTklECQkweDE3CisjZGVmaW5lIFZUMTcwMl9ESUdPVVRfTklECTB4MTEKKwogI2RlZmluZSBJU19WVDE3MDhfVkVORE9SSUQoeCkJCSgoeCkgPj0gMHgxMTA2MTcwOCAmJiAoeCkgPD0gMHgxMTA2MTcwYikKICNkZWZpbmUgSVNfVlQxNzA5XzEwQ0hfVkVORE9SSUQoeCkJKCh4KSA+PSAweDExMDZlNzEwICYmICh4KSA8PSAweDExMDZlNzEzKQogI2RlZmluZSBJU19WVDE3MDlfNkNIX1ZFTkRPUklEKHgpCSgoeCkgPj0gMHgxMTA2ZTcxNCAmJiAoeCkgPD0gMHgxMTA2ZTcxNykKICNkZWZpbmUgSVNfVlQxNzA4Ql84Q0hfVkVORE9SSUQoeCkJKCh4KSA+PSAweDExMDZlNzIwICYmICh4KSA8PSAweDExMDZlNzIzKQogI2RlZmluZSBJU19WVDE3MDhCXzRDSF9WRU5ET1JJRCh4KQkoKHgpID49IDB4MTEwNmU3MjQgJiYgKHgpIDw9IDB4MTEwNmU3MjcpCisjZGVmaW5lIElTX1ZUMTcwOFNfVkVORE9SSUQoeCkJCSgoeCkgPj0gMHgxMTA2MDM5NyAmJiAoeCkgPD0gMHgxMTA2NzM5NykKKyNkZWZpbmUgSVNfVlQxNzAyX1ZFTkRPUklEKHgpCQkoKHgpID49IDB4MTEwNjAzOTggJiYgKHgpIDw9IDB4MTEwNjczOTgpCiAKK2VudW0gVklBX0hEQV9DT0RFQyB7CisJVU5LTk9XTiA9IC0xLAorCVZUMTcwOCwKKwlWVDE3MDlfMTBDSCwKKwlWVDE3MDlfNkNILAorCVZUMTcwOEJfOENILAorCVZUMTcwOEJfNENILAorCVZUMTcwOFMsCisJVlQxNzAyLAorCUNPREVDX1RZUEVTLAorfTsKKworc3RhdGljIGVudW0gVklBX0hEQV9DT0RFQyBnZXRfY29kZWNfdHlwZSh1MzIgdmVuZG9yX2lkKQoreworCXUxNiB2ZW5faWQgPSB2ZW5kb3JfaWQgPj4gMTY7CisJdTE2IGRldl9pZCA9IHZlbmRvcl9pZCAmIDB4ZmZmZjsKKwllbnVtIFZJQV9IREFfQ09ERUMgY29kZWNfdHlwZTsKKworCS8qIGdldCBjb2RlYyB0eXBlICovCisJaWYgKHZlbl9pZCAhPSAweDExMDYpCisJCWNvZGVjX3R5cGUgPSBVTktOT1dOOworCWVsc2UgaWYgKGRldl9pZCA+PSAweDE3MDggJiYgZGV2X2lkIDw9IDB4MTcwYikKKwkJY29kZWNfdHlwZSA9IFZUMTcwODsKKwllbHNlIGlmIChkZXZfaWQgPj0gMHhlNzEwICYmIGRldl9pZCA8PSAweGU3MTMpCisJCWNvZGVjX3R5cGUgPSBWVDE3MDlfMTBDSDsKKwllbHNlIGlmIChkZXZfaWQgPj0gMHhlNzE0ICYmIGRldl9pZCA8PSAweGU3MTcpCisJCWNvZGVjX3R5cGUgPSBWVDE3MDlfNkNIOworCWVsc2UgaWYgKGRldl9pZCA+PSAweGU3MjAgJiYgZGV2X2lkIDw9IDB4ZTcyMykKKwkJY29kZWNfdHlwZSA9IFZUMTcwOEJfOENIOworCWVsc2UgaWYgKGRldl9pZCA+PSAweGU3MjQgJiYgZGV2X2lkIDw9IDB4ZTcyNykKKwkJY29kZWNfdHlwZSA9IFZUMTcwOEJfNENIOworCWVsc2UgaWYgKChkZXZfaWQgJiAweGZmZikgPT0gMHgzOTcKKwkJICYmIChkZXZfaWQgPj4gMTIpIDwgOCkKKwkJY29kZWNfdHlwZSA9IFZUMTcwOFM7CisJZWxzZSBpZiAoKGRldl9pZCAmIDB4ZmZmKSA9PSAweDM5OAorCQkgJiYgKGRldl9pZCA+PiAxMikgPCA4KQorCQljb2RlY190eXBlID0gVlQxNzAyOworCWVsc2UKKwkJY29kZWNfdHlwZSA9IFVOS05PV047CisJcmV0dXJuIGNvZGVjX3R5cGU7Cit9OworCisjZGVmaW5lIFZJQV9IUF9FVkVOVAkJMHgwMQorI2RlZmluZSBWSUFfR1BJT19FVkVOVAkJMHgwMgogCiBlbnVtIHsKIAlWSUFfQ1RMX1dJREdFVF9WT0wsCkBAIC03NywxMiArMTM5LDU0IEBACiB9OwogCiBlbnVtIHsKLQlBVVRPX1NFUV9GUk9OVCwKKwlBVVRPX1NFUV9GUk9OVCA9IDAsCiAJQVVUT19TRVFfU1VSUk9VTkQsCiAJQVVUT19TRVFfQ0VOTEZFLAogCUFVVE9fU0VRX1NJREUKIH07CiAKKyNkZWZpbmUgZ2V0X2FtcF9uaWQoa2MpCSgoa2MpLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmKQorCisvKiBTb21lIFZUMTcwOFMgYmFzZWQgYm9hcmRzIGdldHMgdGhlIG1pY2Jvb3N0IHNldHRpbmcgd3JvbmcsIHNvIHdlIGhhdmUKKyAqIHRvIGFwcGx5IHNvbWUgYnJ1dGUtZm9yY2UgYW5kIHJlLXdyaXRlIHRoZSBUTFYncyBieSBzb2Z0d2FyZS4gKi8KK3N0YXRpYyBpbnQgbWljX2Jvb3N0X3RsdihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IG9wX2ZsYWcsCisJCQkgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX3VzZXIgKl90bHYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKKworCWlmIChnZXRfY29kZWNfdHlwZShjb2RlYy0+dmVuZG9yX2lkKSA9PSBWVDE3MDhTCisJICAgICYmIChuaWQgPT0gMHgxYSB8fCBuaWQgPT0gMHgxZSkpIHsKKwkJaWYgKHNpemUgPCA0ICogc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKHB1dF91c2VyKDEsIF90bHYpKQkvKiBTTkRSVl9DVExfVExWVF9EQl9TQ0FMRSAqLworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcigyICogc2l6ZW9mKHVuc2lnbmVkIGludCksIF90bHYgKyAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoMCwgX3RsdiArIDIpKSAvKiBvZmZzZXQgPSAwICovCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKDEwMDAsIF90bHYgKyAzKSkgLyogc3RlcCBzaXplID0gMTAgZEIgKi8KKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaWNfYm9vc3Rfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKKworCWlmIChnZXRfY29kZWNfdHlwZShjb2RlYy0+dmVuZG9yX2lkKSA9PSBWVDE3MDhTCisJICAgICYmIChuaWQgPT0gMHgxYSB8fCBuaWQgPT0gMHgxZSkpIHsKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJCXVpbmZvLT5jb3VudCA9IDI7CisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDM7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzA4X2NvbnRyb2xfdGVtcGxhdGVzW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRShOVUxMLCAwLCAwLCAwKSwKIAlIREFfQ09ERUNfTVVURShOVUxMLCAwLCAwLCAwKSwKQEAgLTk0LDcgKzE5OCw4IEBACiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1szXTsKIAl1bnNpZ25lZCBpbnQgbnVtX21peGVyczsKIAotCXN0cnVjdCBoZGFfdmVyYiAqaW5pdF92ZXJiczsKKwlzdHJ1Y3QgaGRhX3ZlcmIgKmluaXRfdmVyYnNbNV07CisJdW5zaWduZWQgaW50IG51bV9pdmVyYnM7CiAKIAljaGFyICpzdHJlYW1fbmFtZV9hbmFsb2c7CiAJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fYW5hbG9nX3BsYXliYWNrOwpAQCAtMTA2LDYgKzIxMSw3IEBACiAKIAkvKiBwbGF5YmFjayAqLwogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OworCWhkYV9uaWRfdCBleHRyYV9kaWdfb3V0X25pZDsKIAogCS8qIGNhcHR1cmUgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX2FkY19uaWRzOwpAQCAtMTE3LDE1ICsyMjMsMTkgQEAKIAl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKIAogCS8qIFBDTSBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCBoZGFfcGNtIHBjbV9yZWNbMl07CisJc3RydWN0IGhkYV9wY20gcGNtX3JlY1szXTsKIAogCS8qIGR5bmFtaWMgY29udHJvbHMsIGluaXRfdmVyYnMgYW5kIGlucHV0X211eCAqLwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKIAl1bnNpZ25lZCBpbnQgbnVtX2tjdGxfYWxsb2MsIG51bV9rY3RsX3VzZWQ7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGxfYWxsb2M7Ci0Jc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9pbXV4OworCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfaW11eFsyXTsKIAloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1tBVVRPX0NGR19NQVhfT1VUU107CiAKKwkvKiBIUCBtb2RlIHNvdXJjZSAqLworCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICpocF9tdXg7CisJdW5zaWduZWQgaW50IGhwX2luZGVwZW5kZW50X21vZGU7CisKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJc3RydWN0IGhkYV9sb29wYmFja19jaGVjayBsb29wYmFjazsKICNlbmRpZgpAQCAtMTQ2LDYgKzI1NiwxNiBAQAogCTB4MTMsIDB4MTQKIH07CiAKK3N0YXRpYyBoZGFfbmlkX3QgdnQxNzA4U19hZGNfbmlkc1syXSA9IHsKKwkvKiBBREMxLTIgKi8KKwkweDEzLCAweDE0Cit9OworCitzdGF0aWMgaGRhX25pZF90IHZ0MTcwMl9hZGNfbmlkc1szXSA9IHsKKwkvKiBBREMxLTIgKi8KKwkweDEyLCAweDIwLCAweDFGCit9OworCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwogc3RhdGljIGludCB2aWFfYWRkX2NvbnRyb2woc3RydWN0IHZpYV9zcGVjICpzcGVjLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsKQpAQCAtMjgzLDE5ICs0MDMsMTA4IEBACiAJCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCiAJCQkJCSAgICAgMHgxOCwgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOwogCWVsc2UgaWYgKChJU19WVDE3MDlfMTBDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpIHx8Ci0JCSAgSVNfVlQxNzA5XzZDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpKSAmJiBhZGNfaWR4ID09IDApCisJCSAgSVNfVlQxNzA5XzZDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpKSAmJiAoYWRjX2lkeCA9PSAwKSkKIAkJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgc3BlYy0+aW5wdXRfbXV4LCB1Y29udHJvbCwKIAkJCQkJICAgICAweDE5LCAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7CiAJZWxzZSBpZiAoKElTX1ZUMTcwOEJfOENIX1ZFTkRPUklEKHZlbmRvcl9pZCkgfHwKLQkJICBJU19WVDE3MDhCXzRDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpKSAmJiBhZGNfaWR4ID09IDApCisJCSAgSVNfVlQxNzA4Ql80Q0hfVkVORE9SSUQodmVuZG9yX2lkKSkgJiYgKGFkY19pZHggPT0gMCkpCiAJCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCiAJCQkJCSAgICAgMHgxNywgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOworCWVsc2UgaWYgKElTX1ZUMTcwMl9WRU5ET1JJRCh2ZW5kb3JfaWQpICYmIChhZGNfaWR4ID09IDApKQorCQlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5pbnB1dF9tdXgsIHVjb250cm9sLAorCQkJCQkgICAgIDB4MTMsICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdKTsKIAllbHNlCiAJCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCiAJCQkJCSAgICAgc3BlYy0+YWRjX25pZHNbYWRjX2lkeF0sCiAJCQkJCSAgICAgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOwogfQogCitzdGF0aWMgaW50IHZpYV9pbmRlcGVuZGVudF9ocF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+aHBfbXV4LCB1aW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2luZGVwZW5kZW50X2hwX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07CisJdW5zaWduZWQgaW50IHBpbnNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkJIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLAorCQkJCQkJIDB4MDApOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHBpbnNlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9pbmRlcGVuZGVudF9ocF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOworCXVuc2lnbmVkIGludCBwaW5zZWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXVuc2lnbmVkIGludCBjb25fbmlkID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QsIDApICYgMHhmZjsKKworCWlmIChjb25fbmlkID09IHNwZWMtPm11bHRpb3V0LmhwX25pZCkgeworCQlpZiAocGluc2VsID09IDApIHsKKwkJCWlmICghc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSkgeworCQkJCWlmIChzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA+IDEpCisJCQkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzIC09IDE7CisJCQkJc3BlYy0+aHBfaW5kZXBlbmRlbnRfbW9kZSA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAocGluc2VsID09IDEpIHsKKwkJICAgICAgIGlmIChzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKSB7CisJCQkJaWYgKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID4gMSkKKwkJCQkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKz0gMTsKKwkJCQlzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlID0gMDsKKwkJICAgICAgIH0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChwaW5zZWwgPT0gMCkgeworCQkJaWYgKHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpIHsKKwkJCQlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPiAxKQorCQkJCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyArPSAxOworCQkJCXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBpbnNlbCA9PSAxKSB7CisJCSAgICAgICBpZiAoIXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpIHsKKwkJCQlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPiAxKQorCQkJCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAtPSAxOworCQkJCXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUgPSAxOworCQkgICAgICAgfQorCQl9CisJfQorCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCisJCQkgICAgcGluc2VsKTsKKworCWlmIChzcGVjLT5tdWx0aW91dC5ocF9uaWQgJiYKKwkgICAgc3BlYy0+bXVsdGlvdXQuaHBfbmlkICE9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW0hEQV9GUk9OVF0pCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgIHNwZWMtPm11bHRpb3V0LmhwX25pZCwKKwkJCQkJCSAgIDAsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWFfaHBfbWl4ZXJbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJJbmRlcGVuZGVudCBIUCIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gdmlhX2luZGVwZW5kZW50X2hwX2luZm8sCisJCS5nZXQgPSB2aWFfaW5kZXBlbmRlbnRfaHBfZ2V0LAorCQkucHV0ID0gdmlhX2luZGVwZW5kZW50X2hwX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKIC8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhfY2FwdHVyZV9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLApAQCAtMzgwLDYgKzU4OSwxMzggQEAKIAlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX2NsZWFudXAoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7CiB9CiAKKworc3RhdGljIHZvaWQgcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBfMChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0ID0gJnNwZWMtPm11bHRpb3V0OworCWhkYV9uaWRfdCAqbmlkcyA9IG1vdXQtPmRhY19uaWRzOworCWludCBjaHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWludCBpOworCisJbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKKwlpZiAobW91dC0+ZGlnX291dF9uaWQgJiYgbW91dC0+ZGlnX291dF91c2VkICE9IEhEQV9ESUdfRVhDTFVTSVZFKSB7CisJCWlmIChjaHMgPT0gMiAmJgorCQkgICAgc25kX2hkYV9pc19zdXBwb3J0ZWRfZm9ybWF0KGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCwKKwkJCQkJCWZvcm1hdCkgJiYKKwkJICAgICEoY29kZWMtPnNwZGlmX3N0YXR1cyAmIElFQzk1OF9BRVMwX05PTkFVRElPKSkgeworCQkJbW91dC0+ZGlnX291dF91c2VkID0gSERBX0RJR19BTkFMT0dfRFVQOworCQkJLyogdHVybiBvZmYgU1BESUYgb25jZTsgb3RoZXJ3aXNlIHRoZSBJRUM5NTggYml0cyB3b24ndAorCQkJICogYmUgdXBkYXRlZCAqLworCQkJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCisJCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsIDAsCisJCQkJCQkgICAgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJCQkgICAgY29kZWMtPnNwZGlmX2N0bHMgJgorCQkJCQkJCX5BQ19ESUcxX0VOQUJMRSAmIDB4ZmYpOworCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAorCQkJCQkJICAgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwkJCS8qIHR1cm4gb24gYWdhaW4gKGlmIG5lZWRlZCkgKi8KKwkJCWlmIChjb2RlYy0+c3BkaWZfY3RscyAmIEFDX0RJRzFfRU5BQkxFKQorCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCAwLAorCQkJCQkJICAgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAorCQkJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgMHhmZik7CisJCX0gZWxzZSB7CisJCQltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOworCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAorCQkJCQkJICAgMCwgMCwgMCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCisJLyogZnJvbnQgKi8KKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tIREFfRlJPTlRdLCBzdHJlYW1fdGFnLAorCQkJCSAgIDAsIGZvcm1hdCk7CisKKwlpZiAobW91dC0+aHBfbmlkICYmIG1vdXQtPmhwX25pZCAhPSBuaWRzW0hEQV9GUk9OVF0gJiYKKwkgICAgIXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCisJCS8qIGhlYWRwaG9uZSBvdXQgd2lsbCBqdXN0IGRlY29kZSBmcm9udCBsZWZ0L3JpZ2h0IChzdGVyZW8pICovCisJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQsIHN0cmVhbV90YWcsCisJCQkJCSAgIDAsIGZvcm1hdCk7CisKKwkvKiBleHRyYSBvdXRwdXRzIGNvcGllZCBmcm9tIGZyb250ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91dC0+ZXh0cmFfb3V0X25pZCk7IGkrKykKKwkJaWYgKG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgIG1vdXQtPmV4dHJhX291dF9uaWRbaV0sCisJCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCisJLyogc3Vycm91bmRzICovCisJZm9yIChpID0gMTsgaSA8IG1vdXQtPm51bV9kYWNzOyBpKyspIHsKKwkJaWYgKGNocyA+PSAoaSArIDEpICogMikgLyogaW5kZXBlbmRlbnQgb3V0ICovCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgc3RyZWFtX3RhZywKKwkJCQkJCSAgIGkgKiAyLCBmb3JtYXQpOworCQllbHNlIC8qIGNvcHkgZnJvbnQgKi8KKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLAorCQkJCQkJICAgMCwgZm9ybWF0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX211bHRpX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCA9ICZzcGVjLT5tdWx0aW91dDsKKwloZGFfbmlkX3QgKm5pZHMgPSBtb3V0LT5kYWNfbmlkczsKKworCWlmIChzdWJzdHJlYW0tPm51bWJlciA9PSAwKQorCQlwbGF5YmFja19tdWx0aV9wY21fcHJlcF8wKGNvZGVjLCBzdHJlYW1fdGFnLCBmb3JtYXQsCisJCQkJCSAgc3Vic3RyZWFtKTsKKwllbHNlIHsKKwkJaWYgKG1vdXQtPmhwX25pZCAmJiBtb3V0LT5ocF9uaWQgIT0gbmlkc1tIREFfRlJPTlRdICYmCisJCSAgICBzcGVjLT5ocF9pbmRlcGVuZGVudF9tb2RlKQorCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmhwX25pZCwKKwkJCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCA9ICZzcGVjLT5tdWx0aW91dDsKKwloZGFfbmlkX3QgKm5pZHMgPSBtb3V0LT5kYWNfbmlkczsKKwlpbnQgaTsKKworCWlmIChzdWJzdHJlYW0tPm51bWJlciA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtb3V0LT5udW1fZGFjczsgaSsrKQorCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZHNbaV0sIDAsIDAsIDApOworCisJCWlmIChtb3V0LT5ocF9uaWQgJiYgIXNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+aHBfbmlkLAorCQkJCQkJICAgMCwgMCwgMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91dC0+ZXh0cmFfb3V0X25pZCk7IGkrKykKKwkJCWlmIChtb3V0LT5leHRyYV9vdXRfbmlkW2ldKQorCQkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLAorCQkJCQkJCW1vdXQtPmV4dHJhX291dF9uaWRbaV0sCisJCQkJCQkJMCwgMCwgMCk7CisJCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJCWlmIChtb3V0LT5kaWdfb3V0X25pZCAmJgorCQkgICAgbW91dC0+ZGlnX291dF91c2VkID09IEhEQV9ESUdfQU5BTE9HX0RVUCkgeworCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAorCQkJCQkJICAgMCwgMCwgMCk7CisJCQltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOworCQl9CisJCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKKwl9IGVsc2UgeworCQlpZiAobW91dC0+aHBfbmlkICYmIG1vdXQtPmhwX25pZCAhPSBuaWRzW0hEQV9GUk9OVF0gJiYKKwkJICAgIHNwZWMtPmhwX2luZGVwZW5kZW50X21vZGUpCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+aHBfbmlkLAorCQkJCQkJICAgMCwgMCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBEaWdpdGFsIG91dAogICovCkBAIC0zOTksNiArNzQwLDIxIEBACiAJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAorLyogc2V0dXAgU1BESUYgb3V0cHV0IHN0cmVhbSAqLworc3RhdGljIHZvaWQgc2V0dXBfZGlnX3BsYXliYWNrX3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQkgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsIHVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJLyogdHVybiBvZmYgU1BESUYgb25jZTsgb3RoZXJ3aXNlIHRoZSBJRUM5NTggYml0cyB3b24ndCBiZSB1cGRhdGVkICovCisJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgfkFDX0RJRzFfRU5BQkxFICYgMHhmZik7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwkvKiB0dXJuIG9uIGFnYWluIChpZiBuZWVkZWQpICovCisJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgMHhmZik7Cit9CisKIHN0YXRpYyBpbnQgdmlhX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAogCQkJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCkBAIC00MDYsOCArNzYyLDIwIEBACiAJCQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LAotCQkJCQkgICAgIHN0cmVhbV90YWcsIGZvcm1hdCwgc3Vic3RyZWFtKTsKKwloZGFfbmlkX3QgbmlkOworCisJLyogMXN0IG9yIDJuZCBTL1BESUYgKi8KKwlpZiAoc3Vic3RyZWFtLT5udW1iZXIgPT0gMCkKKwkJbmlkID0gc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQ7CisJZWxzZSBpZiAoc3Vic3RyZWFtLT5udW1iZXIgPT0gMSkKKwkJbmlkID0gc3BlYy0+ZXh0cmFfZGlnX291dF9uaWQ7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXNldHVwX2RpZ19wbGF5YmFja19zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgZm9ybWF0KTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00MzYsMTQgKzgwNCwxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fYW5hbG9nX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMSwKKwkuc3Vic3RyZWFtcyA9IDIsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDgsCiAJLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwogCS5vcHMgPSB7CiAJCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAKKwkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwCiAJfSwKIH07CiAKQEAgLTUxNSw2ICs4ODMsMTMgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlzcGVjLT5tdWx0aW91dC5zaGFyZV9zcGRpZiA9IDE7CisKKwkJaWYgKHNwZWMtPmV4dHJhX2RpZ19vdXRfbmlkKSB7CisJCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5leHRyYV9kaWdfb3V0X25pZCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJfQogCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CiAJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX2luX2N0bHMoY29kZWMsIHNwZWMtPmRpZ19pbl9uaWQpOwpAQCAtNTgwLDEwICs5NTUsODkgQEAKIAlrZnJlZShjb2RlYy0+c3BlYyk7CiB9CiAKKy8qIG11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCitzdGF0aWMgdm9pZCB2aWFfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0sIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSwKKwkJCQkgSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLAorCQkJCSBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9ncGlvX2NvbnRyb2woc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IGdwaW9fZGF0YTsKKwl1bnNpZ25lZCBpbnQgdm9sX2NvdW50ZXI7CisJdW5zaWduZWQgaW50IHZvbDsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX3ZvbDsKKworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJZ3Bpb19kYXRhID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsIDApICYgMHgwMzsKKworCXZvbF9jb3VudGVyID0gKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCQkJICAweEY4NCwgMCkgJiAweDNGMDAwMCkgPj4gMTY7CisKKwl2b2wgPSB2b2xfY291bnRlciAmIDB4MUY7CisJbWFzdGVyX3ZvbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxQSwgMCwKKwkJCQkJQUNfVkVSQl9HRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkJQUNfQU1QX0dFVF9JTlBVVCk7CisKKwlpZiAoZ3Bpb19kYXRhID09IDB4MDIpIHsKKwkJLyogdW5tdXRlIGxpbmUgb3V0ICovCisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdLAorCQkJCQkgSERBX09VVFBVVCwgMCwgSERBX0FNUF9NVVRFLCAwKTsKKworCQlpZiAodm9sX2NvdW50ZXIgJiAweDIwKSB7CisJCQkvKiBkZWNyZWFzZSB2b2x1bWUgKi8KKwkJCWlmICh2b2wgPiBtYXN0ZXJfdm9sKQorCQkJCXZvbCA9IG1hc3Rlcl92b2w7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MUEsIEhEQV9JTlBVVCwKKwkJCQkJCSAwLCBIREFfQU1QX1ZPTE1BU0ssCisJCQkJCQkgbWFzdGVyX3ZvbC12b2wpOworCQl9IGVsc2UgeworCQkJLyogaW5jcmVhc2Ugdm9sdW1lICovCisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MUEsIEhEQV9JTlBVVCwgMCwKKwkJCQkJIEhEQV9BTVBfVk9MTUFTSywKKwkJCQkJICgobWFzdGVyX3ZvbCt2b2wpID4gMHgyQSkgPyAweDJBIDoKKwkJCQkJICAobWFzdGVyX3ZvbCt2b2wpKTsKKwkJfQorCX0gZWxzZSBpZiAoIShncGlvX2RhdGEgJiAweDAyKSkgeworCQkvKiBtdXRlIGxpbmUgb3V0ICovCisJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywKKwkJCQkJIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSwKKwkJCQkJIEhEQV9PVVRQVVQsIDAsIEhEQV9BTVBfTVVURSwKKwkJCQkJIEhEQV9BTVBfTVVURSk7CisJfQorfQorCisvKiB1bnNvbGljaXRlZCBldmVudCBmb3IgamFjayBzZW5zaW5nICovCitzdGF0aWMgdm9pZCB2aWFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXJlcyA+Pj0gMjY7CisJaWYgKHJlcyA9PSBWSUFfSFBfRVZFTlQpCisJCXZpYV9ocF9hdXRvbXV0ZShjb2RlYyk7CisJZWxzZSBpZiAocmVzID09IFZJQV9HUElPX0VWRU5UKQorCQl2aWFfZ3Bpb19jb250cm9sKGNvZGVjKTsKK30KKworc3RhdGljIGhkYV9uaWRfdCBzbGF2ZV9kaWdfb3V0c1tdID0geworCTAsCit9OworCiBzdGF0aWMgaW50IHZpYV9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnMpOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1faXZlcmJzOyBpKyspCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnNbaV0pOworCiAJLyogTHlkaWEgQWRkIGZvciBFQVBEIGVuYWJsZSAqLwogCWlmICghc3BlYy0+ZGlnX2luX25pZCkgeyAvKiBObyBEaWdpdGFsIEluIGNvbm5lY3Rpb24gKi8KIAkJaWYgKElTX1ZUMTcwOF9WRU5ET1JJRChjb2RlYy0+dmVuZG9yX2lkKSkgewpAQCAtNjExLDYgKzEwNjUsOSBAQAogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4sIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOKTsKIAorCS8qIG5vIHNsYXZlIG91dHMgKi8KKwljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBzbGF2ZV9kaWdfb3V0czsKKwogIAlyZXR1cm4gMDsKIH0KIApAQCAtNjU3LDEwICsxMTE0LDEwIEBACiAJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDEyOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKLQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTM7CisJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDExOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVVRPX1NFUV9TSURFOgotCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMTsKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTM7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY4NSw3ICsxMTQyLDcgQEAKIAkJCWNvbnRpbnVlOwogCQkKIAkJaWYgKGkgIT0gQVVUT19TRVFfRlJPTlQpCi0JCQluaWRfdm9sID0gMHgxYiAtIGkgKyAxOworCQkJbmlkX3ZvbCA9IDB4MTggKyBpOwogCiAJCWlmIChpID09IEFVVE9fU0VRX0NFTkxGRSkgewogCQkJLyogQ2VudGVyL0xGRSAqLwpAQCAtNzYwLDYgKzEyMTcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgY3JlYXRlX2hwX2ltdXgoc3RydWN0IHZpYV9zcGVjICpzcGVjKQoreworCWludCBpOworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFsxXTsKKwlzdGF0aWMgY29uc3QgY2hhciAqdGV4dHNbXSA9IHsgIk9GRiIsICJPTiIsIE5VTEx9OworCisJLyogZm9yIGhwIG1vZGUgc2VsZWN0ICovCisJaSA9IDA7CisJd2hpbGUgKHRleHRzW2ldICE9IE5VTEwpIHsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9ICB0ZXh0c1tpXTsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGk7CisJCWltdXgtPm51bV9pdGVtcysrOworCQlpKys7CisJfQorCisJc3BlYy0+aHBfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFsxXTsKK30KKwogc3RhdGljIGludCB2dDE3MDhfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCiB7CiAJaW50IGVycjsKQEAgLTc4MCw2ICsxMjU1LDggQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWNyZWF0ZV9ocF9pbXV4KHNwZWMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc5MCw3ICsxMjY3LDcgQEAKIAlzdGF0aWMgY2hhciAqbGFiZWxzW10gPSB7CiAJCSJNaWMiLCAiRnJvbnQgTWljIiwgIkxpbmUiLCAiRnJvbnQgTGluZSIsICJDRCIsICJBdXgiLCBOVUxMCiAJfTsKLQlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwogCWludCBpLCBlcnIsIGlkeCA9IDA7CiAKIAkvKiBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgcmVjb3JkaW5nIHNlbGVjdCAqLwpAQCAtODQwLDExICsxMzE3LDM2IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIHZ0MTcwOF9zZXRfcGluY29uZmlnX2Nvbm5lY3Qoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJdW5zaWduZWQgaW50IGRlZl9jb25mOworCXVuc2lnbmVkIGNoYXIgc2VxYXNzb2M7CisKKwlkZWZfY29uZiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxULCAwKTsKKwlzZXFhc3NvYyA9ICh1bnNpZ25lZCBjaGFyKSBnZXRfZGVmY2ZnX2Fzc29jaWF0aW9uKGRlZl9jb25mKTsKKwlzZXFhc3NvYyA9IChzZXFhc3NvYyA8PCA0KSB8IGdldF9kZWZjZmdfc2VxdWVuY2UoZGVmX2NvbmYpOworCWlmIChnZXRfZGVmY2ZnX2Nvbm5lY3QoZGVmX2NvbmYpID09IEFDX0pBQ0tfUE9SVF9OT05FKSB7CisJCWlmIChzZXFhc3NvYyA9PSAweGZmKSB7CisJCQlkZWZfY29uZiA9IGRlZl9jb25mICYgKH4oQUNfSkFDS19QT1JUX0JPVEggPDwgMzApKTsKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzMsCisJCQkJCSAgICBkZWZfY29uZiA+PiAyNCk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBpbnQgdnQxNzA4X3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBlcnI7CiAKKwkvKiBBZGQgSFAgYW5kIENEIHBpbiBjb25maWcgY29ubmVjdCBiaXQgcmUtY29uZmlnIGFjdGlvbiAqLworCXZ0MTcwOF9zZXRfcGluY29uZmlnX2Nvbm5lY3QoY29kZWMsIFZUMTcwOF9IUF9QSU5fTklEKTsKKwl2dDE3MDhfc2V0X3BpbmNvbmZpZ19jb25uZWN0KGNvZGVjLCBWVDE3MDhfQ0RfUElOX05JRCk7CisKIAllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC04NzQsOSArMTM3NiwxMiBAQAogCWlmIChzcGVjLT5rY3RsX2FsbG9jKQogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CiAKLQlzcGVjLT5pbml0X3ZlcmJzID0gdnQxNzA4X3ZvbHVtZV9pbml0X3ZlcmJzOwkKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhfdm9sdW1lX2luaXRfdmVyYnM7CiAKLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07CisKKwlpZiAoc3BlYy0+aHBfbXV4KQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHZpYV9ocF9taXhlcjsKIAogCXJldHVybiAxOwogfQpAQCAtODk3LDcgKzE0MDIsNyBAQAogCWludCBlcnI7CiAKIAkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KLQlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtOTY2LDYgKzE0NzEsMTEgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOV91bml3aWxsX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgyMCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IFZJQV9IUF9FVkVOVH0sCisJeyB9Cit9OworCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC0xMDkwLDExICsxNjAwLDExIEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6CiAJCQkJCS8qIEFPVzMgKi8KLQkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDI3OworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTE7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQVVUT19TRVFfU0lERToKIAkJCQkJLyogQU9XMSAqLwotCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTE7CisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgyNzsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJYnJlYWs7CkBAIC0xMjAzLDI2ICsxNzEzLDI2IEBACiAJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9TVVJST1VORCkgewogCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKIAkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyOSwgMywgMCwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLAogCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOwogCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyOSwgMywgMCwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLAogCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9TSURFKSB7CiAJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwogCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjksIDMsIDAsCiAJCQkJCQkJCSAgSERBX09VVFBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7CiAJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MjksIDMsIDAsCiAJCQkJCQkJCSAgSERBX09VVFBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKQEAgLTEyNjUsNyArMTc3NSw3IEBACiAJc3RhdGljIGNoYXIgKmxhYmVsc1tdID0gewogCQkiTWljIiwgIkZyb250IE1pYyIsICJMaW5lIiwgIkZyb250IExpbmUiLCAiQ0QiLCAiQXV4IiwgTlVMTAogCX07Ci0Jc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKIAlpbnQgaSwgZXJyLCBpZHggPSAwOwogCiAJLyogZm9yIGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzZWxlY3QgKi8KQEAgLTEzMzksNyArMTg0OSwxMCBAQAogCWlmIChzcGVjLT5rY3RsX2FsbG9jKQogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CiAKLQlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07CisKKwlpZiAoc3BlYy0+aHBfbXV4KQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHZpYV9ocF9taXhlcjsKIAogCXJldHVybiAxOwogfQpAQCAtMTM2MCw3ICsxODczLDcgQEAKIAlpbnQgZXJyOwogCiAJLyogY3JlYXRlIGEgY29kZWMgc3BlY2lmaWMgcmVjb3JkICovCi0Jc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEzNzUsNyArMTg4OCw4IEBACiAJCSAgICAgICAiVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKIAl9CiAKLQlzcGVjLT5pbml0X3ZlcmJzID0gdnQxNzA5XzEwY2hfdm9sdW1lX2luaXRfdmVyYnM7CQorCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV8xMGNoX3ZvbHVtZV9pbml0X3ZlcmJzOworCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV91bml3aWxsX2luaXRfdmVyYnM7CiAKIAlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA5IEFuYWxvZyI7CiAJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDlfMTBjaF9wY21fYW5hbG9nX3BsYXliYWNrOwpAQCAtMTM5Niw2ICsxOTEwLDcgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAogCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7CisJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOV9sb29wYmFja3M7CiAjZW5kaWYKQEAgLTE0NTEsNyArMTk2Niw3IEBACiAJaW50IGVycjsKIAogCS8qIGNyZWF0ZSBhIGNvZGVjIHNwZWNpZmljIHJlY29yZCAqLwotCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDY2LDcgKzE5ODEsOCBAQAogCQkgICAgICAgIlVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CiAJfQogCi0Jc3BlYy0+aW5pdF92ZXJicyA9IHZ0MTcwOV82Y2hfdm9sdW1lX2luaXRfdmVyYnM7CQorCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOV82Y2hfdm9sdW1lX2luaXRfdmVyYnM7CisJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzA5X3VuaXdpbGxfaW5pdF92ZXJiczsKIAogCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDkgQW5hbG9nIjsKIAlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwOV82Y2hfcGNtX2FuYWxvZ19wbGF5YmFjazsKQEAgLTE0ODcsNiArMjAwMyw3IEBACiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OworCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSB2aWFfdW5zb2xfZXZlbnQ7CiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSB2dDE3MDlfbG9vcGJhY2tzOwogI2VuZGlmCkBAIC0xNTg2LDI3ICsyMTAzLDMyIEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOEJfdW5pd2lsbF9pbml0X3ZlcmJzW10gPSB7CisJezB4MUQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBWSUFfSFBfRVZFTlR9LAorCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhCXzhjaF9wY21fYW5hbG9nX3BsYXliYWNrID0gewotCS5zdWJzdHJlYW1zID0gMSwKKwkuc3Vic3RyZWFtcyA9IDIsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDgsCiAJLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLwogCS5vcHMgPSB7CiAJCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAotCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAKKwkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwCiAJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4Ql80Y2hfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDEsCisJLnN1YnN0cmVhbXMgPSAyLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSA0LAogCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KIAkub3BzID0gewogCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX3BjbV9jbGVhbnVwCisJCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19tdWx0aV9wY21fY2xlYW51cAogCX0sCiB9OwogCkBAIC0xNjYyLDEwICsyMTg0LDEwIEBACiAJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDI0OwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKLQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MjU7CisJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDExOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVVRPX1NFUV9TSURFOgotCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMTsKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MjU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTE2ODAsNyArMjIwMiw3IEBACiB7CiAJY2hhciBuYW1lWzMyXTsKIAlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0geyAiRnJvbnQiLCAiU3Vycm91bmQiLCAiQy9MRkUiLCAiU2lkZSIgfTsKLQloZGFfbmlkX3QgbmlkX3ZvbHNbXSA9IHsweDE2LCAweDI3LCAweDI2LCAweDE4fTsKKwloZGFfbmlkX3QgbmlkX3ZvbHNbXSA9IHsweDE2LCAweDE4LCAweDI2LCAweDI3fTsKIAloZGFfbmlkX3QgbmlkLCBuaWRfdm9sID0gMDsKIAlpbnQgaSwgZXJyOwogCkBAIC0xNzg1LDYgKzIzMDcsOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJY3JlYXRlX2hwX2ltdXgoc3BlYyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5NSw3ICsyMzE5LDcgQEAKIAlzdGF0aWMgY2hhciAqbGFiZWxzW10gPSB7CiAJCSJNaWMiLCAiRnJvbnQgTWljIiwgIkxpbmUiLCAiRnJvbnQgTGluZSIsICJDRCIsICJBdXgiLCBOVUxMCiAJfTsKLQlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOwogCWludCBpLCBlcnIsIGlkeCA9IDA7CiAKIAkvKiBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgcmVjb3JkaW5nIHNlbGVjdCAqLwpAQCAtMTg2OSw3ICsyMzkzLDEwIEBACiAJaWYgKHNwZWMtPmtjdGxfYWxsb2MpCiAJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKIAotCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKKworCWlmIChzcGVjLT5ocF9tdXgpCisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gdmlhX2hwX21peGVyOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xODkwLDcgKzI0MTcsNyBAQAogCWludCBlcnI7CiAKIAkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KLQlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTkwNiw3ICsyNDMzLDggQEAKIAkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOwogCX0KIAotCXNwZWMtPmluaXRfdmVyYnMgPSB2dDE3MDhCXzhjaF92b2x1bWVfaW5pdF92ZXJiczsKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCXzhjaF92b2x1bWVfaW5pdF92ZXJiczsKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCX3VuaXdpbGxfaW5pdF92ZXJiczsKIAogCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDhCIEFuYWxvZyI7CiAJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDhCXzhjaF9wY21fYW5hbG9nX3BsYXliYWNrOwpAQCAtMTkyNiw2ICsyNDU0LDcgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAogCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7CisJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOEJfbG9vcGJhY2tzOwogI2VuZGlmCkBAIC0xOTM5LDcgKzI0NjgsNyBAQAogCWludCBlcnI7CiAKIAkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KLQlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTk1NSw3ICsyNDg0LDggQEAKIAkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOwogCX0KIAotCXNwZWMtPmluaXRfdmVyYnMgPSB2dDE3MDhCXzRjaF92b2x1bWVfaW5pdF92ZXJiczsKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCXzRjaF92b2x1bWVfaW5pdF92ZXJiczsKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhCX3VuaXdpbGxfaW5pdF92ZXJiczsKIAogCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDhCIEFuYWxvZyI7CiAJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDhCXzRjaF9wY21fYW5hbG9nX3BsYXliYWNrOwpAQCAtMTk3NSw2ICsyNTA1LDcgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKIAogCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7CisJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwOEJfbG9vcGJhY2tzOwogI2VuZGlmCkBAIC0xOTgyLDYgKzI1MTMsNzUyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFBhdGNoIGZvciBWVDE3MDhTICovCisKKy8qIFZUMTcwOFMgc29mdHdhcmUgYmFja2Rvb3IgYmFzZWQgb3ZlcnJpZGUgZm9yIGJ1Z2d5IGhhcmR3YXJlIG1pY2Jvb3N0CisgKiBzZXR0aW5nICovCisjZGVmaW5lIE1JQ19CT09TVF9WT0xVTUUoeG5hbWUsIG5pZCkgewkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCisJLm5hbWUgPSB4bmFtZSwJCQkJCVwKKwkuaW5kZXggPSAwLAkJCQkJXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwJXAorCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8CQlcCisJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSywJCVwKKwkuaW5mbyA9IG1pY19ib29zdF92b2x1bWVfaW5mbywJCQlcCisJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9nZXQsCQlcCisJLnB1dCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9wdXQsCQlcCisJLnRsdiA9IHsgLmMgPSBtaWNfYm9vc3RfdGx2IH0sCQkJXAorCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9JTlBVVCkgfQorCisvKiBjYXB0dXJlIG1peGVyIGVsZW1lbnRzICovCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdnQxNzA4U19jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDEzLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxMywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAorCU1JQ19CT09TVF9WT0xVTUUoIk1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MUEpLAorCU1JQ19CT09TVF9WT0xVTUUoIkZyb250IE1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MUUpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCisJCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkJICovCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiB2dDE3MDhTX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbiAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKwkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZQorCSAqIGFuYWxvZy1sb29wYmFjayBtaXhlciB3aWRnZXQgKi8KKwkvKiBBbXAgSW5kaWNlczogQ0QgPSAxLCBNaWMxID0gMiwgTGluZSA9IDMsIE1pYzIgPSA0ICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKKworCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgUFc0IHRvIE1XMCAqLworCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKKwkvKiBQVzksIFBXMTAgIE91dHB1dCBlbmFibGUgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwkvKiBFbmFibGUgTWljIEJvb3N0IFZvbHVtZSBiYWNrZG9vciAqLworCXsweDEsIDB4Zjk4LCAweDF9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiB2dDE3MDhTX3VuaXdpbGxfaW5pdF92ZXJic1tdID0geworCXsweDFELCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0hQX0VWRU5UfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA4U19wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMiwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gOCwKKwkubmlkID0gMHgxMCwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLm9wZW4gPSB2aWFfcGxheWJhY2tfcGNtX29wZW4sCisJCS5wcmVwYXJlID0gdmlhX3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IHZpYV9wbGF5YmFja19wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOFNfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMiwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMHgxMywgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOFNfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAyLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAorCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUKKwl9LAorfTsKKworLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHZ0MTcwOFNfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwlpbnQgaTsKKwloZGFfbmlkX3QgbmlkOworCisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBjZmctPmxpbmVfb3V0czsKKworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQlpZiAobmlkKSB7CisJCQkvKiBjb25maWcgZGFjIGxpc3QgKi8KKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSBBVVRPX1NFUV9GUk9OVDoKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTA7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MjQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVE9fU0VRX1NVUlJPVU5EOgorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUT19TRVFfU0lERToKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MjU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KK3N0YXRpYyBpbnQgdnQxNzA4U19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCWNoYXIgbmFtZVszMl07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNobmFtZVs0XSA9IHsgIkZyb250IiwgIlN1cnJvdW5kIiwgIkMvTEZFIiwgIlNpZGUiIH07CisJaGRhX25pZF90IG5pZF92b2xzW10gPSB7MHgxMCwgMHgxMSwgMHgyNCwgMHgyNX07CisJaGRhX25pZF90IG5pZF9tdXRlc1tdID0gezB4MUMsIDB4MTgsIDB4MjYsIDB4Mjd9OworCWhkYV9uaWRfdCBuaWQsIG5pZF92b2wsIG5pZF9tdXRlOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgeworCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisKKwkJaWYgKCFuaWQpCisJCQljb250aW51ZTsKKworCQluaWRfdm9sID0gbmlkX3ZvbHNbaV07CisJCW5pZF9tdXRlID0gbmlkX211dGVzW2ldOworCisJCWlmIChpID09IEFVVE9fU0VRX0NFTkxGRSkgeworCQkJLyogQ2VudGVyL0xGRSAqLworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDEsIDAsCisJCQkJCQkJCSAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLAorCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCQkJICAgICAgIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLAorCQkJCQkJCQkgIDEsIDAsCisJCQkJCQkJCSAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICAgICAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsCisJCQkJCQkJCSAgMiwgMCwKKwkJCQkJCQkJICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpIHsKKwkJCS8qIGFkZCBjb250cm9sIHRvIG1peGVyIGluZGV4IDAgKi8KKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLAorCQkJCQkJCQkgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNiwgMywgMCwKKwkJCQkJCQkJICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisKKwkJCS8qIEZyb250ICovCisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLAorCQkJCQkJCQkgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX211dGUsCisJCQkJCQkJCSAgMywgMCwKKwkJCQkJCQkJICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMywgMCwKKwkJCQkJCQkJICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9tdXRlLAorCQkJCQkJCQkgIDMsIDAsCisJCQkJCQkJCSAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0MTcwOFNfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJaW50IGVycjsKKworCWlmICghcGluKQorCQlyZXR1cm4gMDsKKworCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IFZUMTcwOFNfSFBfTklEOyAvKiBBT1czICovCisKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDI1LCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwljcmVhdGVfaHBfaW11eChzcGVjKTsKKworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLworc3RhdGljIGludCB2dDE3MDhTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkJCWNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwlzdGF0aWMgY2hhciAqbGFiZWxzW10gPSB7CisJCSJNaWMiLCAiRnJvbnQgTWljIiwgIkxpbmUiLCAiRnJvbnQgTGluZSIsICJDRCIsICJBdXgiLCBOVUxMCisJfTsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXhbMF07CisJaW50IGksIGVyciwgaWR4ID0gMDsKKworCS8qIGZvciBpbnRlcm5hbCBsb29wYmFjayByZWNvcmRpbmcgc2VsZWN0ICovCisJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9ICJTdGVyZW8gTWl4ZXIiOworCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSA1OworCWltdXgtPm51bV9pdGVtcysrOworCisJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgeworCQlpZiAoIWNmZy0+aW5wdXRfcGluc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoY2ZnLT5pbnB1dF9waW5zW2ldKSB7CisJCWNhc2UgMHgxYTogLyogTWljICovCisJCQlpZHggPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDFiOiAvKiBMaW5lIEluICovCisJCQlpZHggPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDFlOiAvKiBGcm9udCBNaWMgKi8KKwkJCWlkeCA9IDQ7CisJCQlicmVhazsKKworCQljYXNlIDB4MWY6IC8qIENEICovCisJCQlpZHggPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gdmlhX25ld19hbmFsb2dfaW5wdXQoc3BlYywgY2ZnLT5pbnB1dF9waW5zW2ldLCBsYWJlbHNbaV0sCisJCQkJCSAgIGlkeCwgMHgxNik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IGxhYmVsc1tpXTsKKwkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGlkeC0xOworCQlpbXV4LT5udW1faXRlbXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnQxNzA4U19wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCXN0YXRpYyBoZGFfbmlkX3QgdnQxNzA4c19pZ25vcmVbXSA9IHsweDIxLCAwfTsKKworCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAorCQkJCQkgICB2dDE3MDhzX2lnbm9yZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdnQxNzA4U19hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKKwkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCisKKwllcnIgPSB2dDE3MDhTX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDhTX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDhTX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKKworCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluKQorCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IFZUMTcwOFNfRElHT1VUX05JRDsKKworCXNwZWMtPmV4dHJhX2RpZ19vdXRfbmlkID0gMHgxNTsKKworCWlmIChzcGVjLT5rY3RsX2FsbG9jKQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CisKKwlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4WzBdOworCisJaWYgKHNwZWMtPmhwX211eCkKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSB2aWFfaHBfbWl4ZXI7CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKK3N0YXRpYyBzdHJ1Y3QgaGRhX2FtcF9saXN0IHZ0MTcwOFNfbG9vcGJhY2tzW10gPSB7CisJeyAweDE2LCBIREFfSU5QVVQsIDEgfSwKKwl7IDB4MTYsIEhEQV9JTlBVVCwgMiB9LAorCXsgMHgxNiwgSERBX0lOUFVULCAzIH0sCisJeyAweDE2LCBIREFfSU5QVVQsIDQgfSwKKwl7IH0gLyogZW5kICovCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNzA4UyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWM7CisJaW50IGVycjsKKworCS8qIGNyZWF0ZSBhIGNvZGVjIHNwZWNpZmljIHJlY29yZCAqLworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gdnQxNzA4U19wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJdmlhX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoIWVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKKwl9CisKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDhTX3ZvbHVtZV9pbml0X3ZlcmJzOworCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOFNfdW5pd2lsbF9pbml0X3ZlcmJzOworCisJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTcwOFMgQW5hbG9nIjsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwOFNfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmdnQxNzA4U19wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOFMgRGlnaXRhbCI7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA4U19wY21fZGlnaXRhbF9wbGF5YmFjazsKKworCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCXNwZWMtPmFkY19uaWRzID0gdnQxNzA4U19hZGNfbmlkczsKKwkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRSh2dDE3MDhTX2FkY19uaWRzKTsKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzA4U19jYXB0dXJlX21peGVyOworCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJfQorCisJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OworCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQgPSB2aWFfdW5zb2xfZXZlbnQ7CisjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQorCXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QgPSB2dDE3MDhTX2xvb3BiYWNrczsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qIFBhdGNoIGZvciBWVDE3MDIgKi8KKworLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ0MTcwMl9jYXB0dXJlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDEyLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxMiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MjAsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURV9JRFgoIkNhcHR1cmUgU3dpdGNoIiwgMSwgMHgyMCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkRpZ2l0YWwgTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxRiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJEaWdpdGFsIE1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MUYsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJEaWdpdGFsIE1pYyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIDB4MUUsIDB4MCwKKwkJCSBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIFRoZSBtdWx0aXBsZSAiQ2FwdHVyZSBTb3VyY2UiIGNvbnRyb2xzIGNvbmZ1c2UgYWxzYW1peGVyCisJCSAqIFNvIGNhbGwgc29tZXdoYXQgZGlmZmVyZW50Li4KKwkJICovCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSB2aWFfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IHZpYV9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSB2aWFfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiB2dDE3MDJfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwLTEgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MUYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAxLCBMaW5lID0gMSwgTWljMiA9IDMgKi8KKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKworCS8qIFNldHVwIGRlZmF1bHQgaW5wdXQgb2YgUFc0IHRvIE1XMCAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKKwkvKiBQVzYgUFc3IE91dHB1dCBlbmFibGUgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwl7MHgxQywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzAyX3VuaXdpbGxfaW5pdF92ZXJic1tdID0geworCXsweDAxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0dQSU9fRVZFTlR9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgVklBX0hQX0VWRU5UfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzAyX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAyLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKKwkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfbXVsdGlfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX211bHRpX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzAyX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDMsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4MTIsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDJfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAyLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAorCQkucHJlcGFyZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUKKwl9LAorfTsKKworLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHZ0MTcwMl9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gMTsKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CisKKwlpZiAoY2ZnLT5saW5lX291dF9waW5zWzBdKSB7CisJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLworCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXSA9IDB4MTA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCitzdGF0aWMgaW50IHZ0MTcwMl9hdXRvX2NyZWF0ZV9saW5lX291dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJaW50IGVycjsKKworCWlmICghY2ZnLT5saW5lX291dF9waW5zWzBdKQorCQlyZXR1cm4gLTE7CisKKwkvKiBhZGQgY29udHJvbCB0byBtaXhlciBpbmRleCAwICovCisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCSAgICAgICJNYXN0ZXIgRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxQSwgMywgMCwgSERBX0lOUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MUEsIDMsIDAsIEhEQV9JTlBVVCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogRnJvbnQgKi8KKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJICAgICAgIkZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTAsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCSAgICAgICJGcm9udCBQbGF5YmFjayBTd2l0Y2giLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE2LCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDE3MDJfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJaW50IGVycjsKKworCWlmICghcGluKQorCQlyZXR1cm4gMDsKKworCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IDB4MUQ7CisKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFELCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwKKwkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwljcmVhdGVfaHBfaW11eChzcGVjKTsKKworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLworc3RhdGljIGludCB2dDE3MDJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0YXRpYyBjaGFyICpsYWJlbHNbXSA9IHsKKwkJIk1pYyIsICJGcm9udCBNaWMiLCAiTGluZSIsICJGcm9udCBMaW5lIiwgIkNEIiwgIkF1eCIsIE5VTEwKKwl9OworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKKwlpbnQgaSwgZXJyLCBpZHggPSAwOworCisJLyogZm9yIGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzZWxlY3QgKi8KKwlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmxhYmVsID0gIlN0ZXJlbyBNaXhlciI7CisJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IDM7CisJaW11eC0+bnVtX2l0ZW1zKys7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVVUT19QSU5fTEFTVDsgaSsrKSB7CisJCWlmICghY2ZnLT5pbnB1dF9waW5zW2ldKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjZmctPmlucHV0X3BpbnNbaV0pIHsKKwkJY2FzZSAweDE0OiAvKiBNaWMgKi8KKwkJCWlkeCA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDB4MTU6IC8qIExpbmUgSW4gKi8KKwkJCWlkeCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIDB4MTg6IC8qIEZyb250IE1pYyAqLworCQkJaWR4ID0gMzsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsIGNmZy0+aW5wdXRfcGluc1tpXSwKKwkJCQkJICAgbGFiZWxzW2ldLCBpZHgsIDB4MUEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSBsYWJlbHNbaV07CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHgtMTsKKwkJaW11eC0+bnVtX2l0ZW1zKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0MTcwMl9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCXN0YXRpYyBoZGFfbmlkX3QgdnQxNzAyX2lnbm9yZVtdID0gezB4MUMsIDB9OworCisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCisJCQkJCSAgIHZ0MTcwMl9pZ25vcmUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZ0MTcwMl9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMgJiYgIXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkKKwkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCisKKwllcnIgPSB2dDE3MDJfYXV0b19jcmVhdGVfbGluZV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdnQxNzAyX2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOworCisJaWYgKHNwZWMtPmF1dG9jZmcuZGlnX291dF9waW4pCisJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gVlQxNzAyX0RJR09VVF9OSUQ7CisKKwlzcGVjLT5leHRyYV9kaWdfb3V0X25pZCA9IDB4MUI7CisKKwlpZiAoc3BlYy0+a2N0bF9hbGxvYykKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBzcGVjLT5rY3RsX2FsbG9jOworCisJc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKKworCWlmIChzcGVjLT5ocF9tdXgpCisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gdmlhX2hwX21peGVyOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCitzdGF0aWMgc3RydWN0IGhkYV9hbXBfbGlzdCB2dDE3MDJfbG9vcGJhY2tzW10gPSB7CisJeyAweDFBLCBIREFfSU5QVVQsIDEgfSwKKwl7IDB4MUEsIEhEQV9JTlBVVCwgMiB9LAorCXsgMHgxQSwgSERBX0lOUFVULCAzIH0sCisJeyAweDFBLCBIREFfSU5QVVQsIDQgfSwKKwl7IH0gLyogZW5kICovCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNzAyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCByZXNwb25zZTsKKwl1bnNpZ25lZCBjaGFyIGNvbnRyb2w7CisKKwkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IHZ0MTcwMl9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJdmlhX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoIWVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgZ2VuZW5pYyBtb2RlLi4uXG4iKTsKKwl9CisKKwlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MDJfdm9sdW1lX2luaXRfdmVyYnM7CisJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzAyX3VuaXdpbGxfaW5pdF92ZXJiczsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJWVDE3MDIgQW5hbG9nIjsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZ0MTcwMl9wY21fYW5hbG9nX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDJfcGNtX2FuYWxvZ19jYXB0dXJlOworCisJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDIgRGlnaXRhbCI7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzAyX3BjbV9kaWdpdGFsX3BsYXliYWNrOworCisJaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKKwkJc3BlYy0+YWRjX25pZHMgPSB2dDE3MDJfYWRjX25pZHM7CisJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUodnQxNzAyX2FkY19uaWRzKTsKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gdnQxNzAyX2NhcHR1cmVfbWl4ZXI7CisJCXNwZWMtPm51bV9taXhlcnMrKzsKKwl9CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKKworCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IHZpYV9hdXRvX2luaXQ7CisJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IHZpYV91bnNvbF9ldmVudDsKKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IHZ0MTcwMl9sb29wYmFja3M7CisjZW5kaWYKKworCS8qIE9wZW4gYmFja2Rvb3IgKi8KKwlyZXNwb25zZSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwgMHhGOEMsIDApOworCWNvbnRyb2wgPSAodW5zaWduZWQgY2hhcikocmVzcG9uc2UgJiAweGZmKTsKKwljb250cm9sIHw9IDB4MzsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAgY29kZWMtPmFmZywgMCwgMHhGODgsIGNvbnRyb2wpOworCisJLyogRW5hYmxlIEdQSU8gMCYxIGZvciB2b2x1bWUmbXV0ZSBjb250cm9sICovCisJLyogRW5hYmxlIEdQSU8gMiBmb3IgRE1JQy1EQVRBICovCisJcmVzcG9uc2UgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsIDB4Rjg0LCAwKTsKKwljb250cm9sID0gKHVuc2lnbmVkIGNoYXIpKChyZXNwb25zZSA+PiAxNikgJiAweDNmKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAgY29kZWMtPmFmZywgMCwgMHhGODIsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBwYXRjaCBlbnRyaWVzCiAgKi8KQEAgLTIwMjIsNSArMzI5OSwzNyBAQAogCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4Ql80Y2h9LAogCXsgLmlkID0gMHgxMTA2RTcyNywgLm5hbWUgPSAiVklBIFZUMTcwOEIgNC1DaCIsCiAJICAucGF0Y2ggPSBwYXRjaF92dDE3MDhCXzRjaH0sCisJeyAuaWQgPSAweDExMDYwMzk3LCAubmFtZSA9ICJWSUEgVlQxNzA4UyIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDhTfSwKKwl7IC5pZCA9IDB4MTEwNjEzOTcsIC5uYW1lID0gIlZJQSBWVDE3MDhTIiwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOFN9LAorCXsgLmlkID0gMHgxMTA2MjM5NywgLm5hbWUgPSAiVklBIFZUMTcwOFMiLAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4U30sCisJeyAuaWQgPSAweDExMDYzMzk3LCAubmFtZSA9ICJWSUEgVlQxNzA4UyIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDhTfSwKKwl7IC5pZCA9IDB4MTEwNjQzOTcsIC5uYW1lID0gIlZJQSBWVDE3MDhTIiwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOFN9LAorCXsgLmlkID0gMHgxMTA2NTM5NywgLm5hbWUgPSAiVklBIFZUMTcwOFMiLAorCSAgLnBhdGNoID0gcGF0Y2hfdnQxNzA4U30sCisJeyAuaWQgPSAweDExMDY2Mzk3LCAubmFtZSA9ICJWSUEgVlQxNzA4UyIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDhTfSwKKwl7IC5pZCA9IDB4MTEwNjczOTcsIC5uYW1lID0gIlZJQSBWVDE3MDhTIiwKKwkgIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOFN9LAorCXsgLmlkID0gMHgxMTA2MDM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2MTM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2MjM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2MzM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2NDM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2NTM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2NjM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAorCXsgLmlkID0gMHgxMTA2NzM5OCwgLm5hbWUgPSAiVklBIFZUMTcwMiIsCisJICAucGF0Y2ggPSBwYXRjaF92dDE3MDJ9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2FrNHh4eC5jCmluZGV4IGRhYjMxYjIuLjAzMzkxZGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2FrNHh4eC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2FrNHh4eC5jCkBAIC01OSw3ICs1OSw4IEBACiAJc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSAqcHJpdiA9ICh2b2lkICopYWstPnByaXZhdGVfdmFsdWVbMF07CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBhay0+cHJpdmF0ZV9kYXRhWzBdOwogCi0Jc25kX2Fzc2VydChjaGlwID49IDAgJiYgY2hpcCA8IDQsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oY2hpcCA8IDAgfHwgY2hpcCA+PSA0KSkKKwkJcmV0dXJuOwogCiAJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAJdG1wIHw9IHByaXYtPmFkZF9mbGFnczsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKaW5kZXggODY4YWUyOS4uMTEwZDE2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKQEAgLTQ0LDEwICs0NCw5IEBACiAgKiAgICAgICBub3Qgd29ya2luZzogcHJldHkgbXVjaCBldmVyeXRoaW5nIGVsc2UsIGF0IGxlYXN0IGkgY291bGQgdmVyaWZ5IHRoYXQKICAqICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIG5vIGRpZ2l0YWwgb3V0cHV0LCBubyBjYXB0dXJlLCBwcmV0dHkgYmFkIGNsaWNrcyBhbmQgcG9vcHMKICAqICAgICAgICAgICAgICAgICAgICBvbiBtaXhlciBzd2l0Y2ggYW5kIG90aGVyIGNvbGwgc3R1ZmYuCi0gKgotICovICAgICAgCisgKi8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMzEsNyArMTMwLDcgQEAKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoNTApOwogCi0JLyogCisJLyoKIAkgKiBzZW5kIGkyYyBzdG9wIGNvbmRpdGlvbiBhbmQgc3RhcnQgY29uZGl0aW9uCiAJICogdG8gb2J0YWluIHNhbmUgc3RhdGUKIAkgKi8KQEAgLTE1MiwxMCArMTUxLDE2IEBACiAJICogc2tpcHBpbmcgYWNrIGN5Y2xlcyBpbmJldHdlZW4KIAkgKi8KIAlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7Ci0JCXN3aXRjaChqKSB7Ci0JCWNhc2UgMDogdmFsID0gZGV2OyBicmVhazsKLQkJY2FzZSAxOiB2YWwgPSByZWc7IGJyZWFrOwotCQljYXNlIDI6IHZhbCA9IGRhdGE7IGJyZWFrOworCQlzd2l0Y2ggKGopIHsKKwkJY2FzZSAwOgorCQkJdmFsID0gZGV2OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZhbCA9IHJlZzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl2YWwgPSBkYXRhOworCQkJYnJlYWs7CiAJCX0KIAkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKIAkJCXRtcCAmPSB+QVVSRU9OX1NQSV9DTEs7CkBAIC0xNzEsNyArMTc2LDcgQEAKIAkJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwogCQkJdWRlbGF5KDQwKTsKIAkJfQotICAgICAgICAgICAgICAgIHRtcCAmPSB+QVVSRU9OX1NQSV9DTEs7CisJCXRtcCAmPSB+QVVSRU9OX1NQSV9DTEs7CiAJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwogCQl1ZGVsYXkoNDApOwogCQl0bXAgfD0gQVVSRU9OX1NQSV9DTEs7CkBAIC0yMDMsNyArMjA4LDcgQEAKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwogCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKLQlpZih1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQogCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOwogCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CiAJcmV0dXJuIDA7CkBAIC0yMzEsMTIgKzIzNiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CiAJb3ZhbCA9IHNwZWMtPnBjYTk1NTRfb3V0OwotCWlmICgoY2hhbmdlID0gKG92YWwgIT0gbnZhbCkpKSB7CisJY2hhbmdlID0gKG92YWwgIT0gbnZhbCk7CisJaWYgKGNoYW5nZSkgewogCQlhdXJlb25fcGNhOTU1NF93cml0ZShpY2UsIFBDQTk1NTRfT1VULCBudmFsKTsKIAkJc3BlYy0+cGNhOTU1NF9vdXQgPSBudmFsOwogCX0KIAlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7Ci0JCiAJcmV0dXJuIGNoYW5nZTsKIH0KIApAQCAtMjU2LDcgKzI2MSw3IEBACiAJdWRlbGF5KDEwKTsKIAl0bXAgJj0gfkFVUkVPTl9BQzk3X0FERFI7CiAJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7Ci0JdWRlbGF5KDEwKTsJCisJdWRlbGF5KDEwKTsKIAogCS8qIFNlbmQgbG93LW9yZGVyIGJ5dGUgdG8gWElMSU5YIGNoaXAgKi8KIAl0bXAgJj0gfkFVUkVPTl9BQzk3X0RBVEFfTUFTSzsKQEAgLTI2OSw3ICsyNzQsNyBAQAogCXRtcCAmPSB+QVVSRU9OX0FDOTdfREFUQV9MT1c7CiAJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CiAJdWRlbGF5KDEwKTsKLQkKKwogCS8qIFNlbmQgaGlnaC1vcmRlciBieXRlIHRvIFhJTElOWCBjaGlwICovCiAJdG1wICY9IH5BVVJFT05fQUM5N19EQVRBX01BU0s7CiAJdG1wIHw9ICh2YWwgPj4gOCkgJiBBVVJFT05fQUM5N19EQVRBX01BU0s7CkBAIC0yODIsNyArMjg3LDcgQEAKIAl0bXAgJj0gfkFVUkVPTl9BQzk3X0RBVEFfSElHSDsKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoMTApOwotCQorCiAJLyogSW5zdHJ1Y3QgWElMSU5YIGNoaXAgdG8gcGFyc2UgdGhlIGRhdGEgdG8gdGhlIFNUQUM5NzQ0IGNoaXAgKi8KIAl0bXAgfD0gQVVSRU9OX0FDOTdfQ09NTUlUOwogCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwpAQCAtMjkwLDcgKzI5NSw3IEBACiAJdG1wICY9IH5BVVJFT05fQUM5N19DT01NSVQ7CiAJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIHRtcCk7CiAJdWRlbGF5KDEwKTsKLQkKKwogCS8qIFN0b3JlIHRoZSBkYXRhIGluIG91dCBwcml2YXRlIGJ1ZmZlciAqLwogCXNwZWMtPnN0YWM5NzQ0WyhyZWcgJiAweDdGKSA+PiAxXSA9IHZhbDsKIH0KQEAgLTMwNCw3ICszMDksNyBAQAogLyoKICAqIEluaXRpYWxpemUgU1RBQzk3NDQgY2hpcAogICovCi1zdGF0aWMgaW50IGF1cmVvbl9hYzk3X2luaXQgKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQorc3RhdGljIGludCBhdXJlb25fYWM5N19pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXN0cnVjdCBhdXJlb25fc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKIAlpbnQgaTsKQEAgLTMzNSwyMCArMzQwLDIxIEBACiAJdG1wID0gKHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpIHwgQVVSRU9OX0FDOTdfUkVTRVQpICYgfkFVUkVPTl9BQzk3X0RBVEFfTUFTSzsKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoMyk7Ci0JCisKIAl0bXAgJj0gfkFVUkVPTl9BQzk3X1JFU0VUOwogCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwogCXVkZWxheSgzKTsKLQkKKwogCXRtcCB8PSBBVVJFT05fQUM5N19SRVNFVDsKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoMyk7Ci0JCisKIAltZW1zZXQoJnNwZWMtPnN0YWM5NzQ0LCAwLCBzaXplb2Yoc3BlYy0+c3RhYzk3NDQpKTsKLQlmb3IgKGk9MDsgYWM5N19kZWZhdWx0c1tpXSAhPSAodW5zaWduZWQgc2hvcnQpLTE7IGkrPTIpCisJZm9yIChpID0gMDsgYWM5N19kZWZhdWx0c1tpXSAhPSAodW5zaWduZWQgc2hvcnQpLTE7IGkgKz0gMikKIAkJc3BlYy0+c3RhYzk3NDRbKGFjOTdfZGVmYXVsdHNbaV0pID4+IDFdID0gYWM5N19kZWZhdWx0c1tpKzFdOwotCQkKLQlhdXJlb25fYWM5N193cml0ZShpY2UsIEFDOTdfTUFTVEVSLCAweDAwMDApOyAvLyBVbm11dGUgQUMnOTcgbWFzdGVyIHZvbHVtZSBwZXJtYW5lbnRseSAtIG11dGluZyBpcyBkb25lIGJ5IFdNODc3MAorCisJLyogVW5tdXRlIEFDJzk3IG1hc3RlciB2b2x1bWUgcGVybWFuZW50bHkgLSBtdXRpbmcgaXMgZG9uZSBieSBXTTg3NzAgKi8KKwlhdXJlb25fYWM5N193cml0ZShpY2UsIEFDOTdfTUFTVEVSLCAweDAwMDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODgsNyArMzk0LDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBzaG9ydCBvdm9sLCBudm9sOwogCWludCBjaGFuZ2U7Ci0JCisKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CiAKIAlvdm9sID0gYXVyZW9uX2FjOTdfcmVhZChpY2UsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHg3Rik7CkBAIC0zOTYsMTMgKzQwMiwxNCBAQAogCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIEFVUkVPTl9BQzk3X1NURVJFTykKIAkJbnZvbCB8PSAoKDB4MUYgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgPDwgOCkgJiAweDFGMDA7CiAJbnZvbCB8PSBvdm9sICYgfjB4MUYxRjsKLQkKLQlpZiAoKGNoYW5nZSA9IChvdm9sICE9IG52b2wpKSkKKworCWNoYW5nZSA9IChvdm9sICE9IG52b2wpOworCWlmIChjaGFuZ2UpCiAJCWF1cmVvbl9hYzk3X3dyaXRlKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGLCBudm9sKTsKIAogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAotCXJldHVybiBjaGFuZ2U7CQkKKwlyZXR1cm4gY2hhbmdlOwogfQogCiAvKgpAQCAtNDE2LDcgKzQyMyw4IEBACiAKIAltdXRleF9sb2NrKCZpY2UtPmdwaW9fbXV0ZXgpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhdXJlb25fYWM5N19yZWFkKGljZSwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweDdGKSAmIDB4ODAwMCA/IDAgOiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYXVyZW9uX2FjOTdfcmVhZChpY2UsCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4N0YpICYgMHg4MDAwID8gMCA6IDE7CiAKIAltdXRleF91bmxvY2soJmljZS0+Z3Bpb19tdXRleCk7CiAJcmV0dXJuIDA7CkBAIC00MjksMTMgKzQzNywxNCBAQAogCWludCBjaGFuZ2U7CiAKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7Ci0JCisKIAlvdm9sID0gYXVyZW9uX2FjOTdfcmVhZChpY2UsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHg3Rik7Ci0JbnZvbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDB4MDAwMCA6IDB4ODAwMCkgfCAob3ZvbCAmIH4JMHg4MDAwKTsKLQkKLQlpZiAoKGNoYW5nZSA9IChvdm9sICE9IG52b2wpKSkKKwludm9sID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMHgwMDAwIDogMHg4MDAwKSB8IChvdm9sICYgfjB4ODAwMCk7CisKKwljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKKwlpZiAoY2hhbmdlKQogCQlhdXJlb25fYWM5N193cml0ZShpY2UsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHg3RiwgbnZvbCk7Ci0JCQorCiAJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOwogCiAJcmV0dXJuIGNoYW5nZTsKQEAgLTQ2NSwxMyArNDc0LDE0IEBACiAJaW50IGNoYW5nZTsKIAogCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKLQkKKwogCW92b2wgPSBhdXJlb25fYWM5N19yZWFkKGljZSwgQUM5N19NSUMpOwogCW52b2wgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyAweDAwMDAgOiAweDAwMjApIHwgKG92b2wgJiB+MHgwMDIwKTsKLQkKLQlpZiAoKGNoYW5nZSA9IChvdm9sICE9IG52b2wpKSkKKworCWNoYW5nZSA9IChvdm9sICE9IG52b2wpOworCWlmIChjaGFuZ2UpCiAJCWF1cmVvbl9hYzk3X3dyaXRlKGljZSwgQUM5N19NSUMsIG52b2wpOwotCQkKKwogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAogCXJldHVybiBjaGFuZ2U7CkBAIC00OTMsMTYgKzUwMywxNSBAQAogCQlzbmRfaWNlMTcxMl9ncGlvX3NldF9tYXNrKGljZSwgfihQUk9ESUdZX1NQSV9NT1NJfFBST0RJR1lfU1BJX0NMS3xQUk9ESUdZX1dNX0NTKSk7CiAJCW1vc2kgPSBQUk9ESUdZX1NQSV9NT1NJOwogCQljbGsgPSBQUk9ESUdZX1NQSV9DTEs7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCB+KEFVUkVPTl9XTV9SV3xBVVJFT05fU1BJX01PU0l8QVVSRU9OX1NQSV9DTEt8CiAJCQkJCQkgQVVSRU9OX1dNX0NTfEFVUkVPTl9DUzg0MTVfQ1MpKTsKIAkJbW9zaSA9IEFVUkVPTl9TUElfTU9TSTsKIAkJY2xrID0gQVVSRU9OX1NQSV9DTEs7Ci0JCQorCiAJCXRtcCB8PSBBVVJFT05fV01fUlc7CiAJfQotCQorCiAJdG1wICY9IH5jczsKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoMSk7CkBAIC01MzQsNyArNTQzLDkgQEAKIC8qCiAgKiBSZWFkIGRhdGEgaW4gU1BJIG1vZGUKICAqLwotc3RhdGljIHZvaWQgYXVyZW9uX3NwaV9yZWFkKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgY3MsIHVuc2lnbmVkIGludCBkYXRhLCBpbnQgYml0cywgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkgeworc3RhdGljIHZvaWQgYXVyZW9uX3NwaV9yZWFkKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgY3MsCisJCXVuc2lnbmVkIGludCBkYXRhLCBpbnQgYml0cywgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKIAlpbnQgaSwgajsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCkBAIC01NDQsNyArNTU1LDcgQEAKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAl1ZGVsYXkoMSk7CiAKLQlmb3IgKGk9Yml0cy0xOyBpPj0wOyBpLS0pIHsKKwlmb3IgKGkgPSBiaXRzLTE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChkYXRhICYgKDEgPDwgaSkpCiAJCQl0bXAgfD0gQVVSRU9OX1NQSV9NT1NJOwogCQllbHNlCkBAIC01NjEsOSArNTcyLDkgQEAKIAkJdWRlbGF5KDEpOwogCX0KIAotCWZvciAoaj0wOyBqPHNpemU7IGorKykgeworCWZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKIAkJdW5zaWduZWQgY2hhciBvdXRkYXRhID0gMDsKLQkJZm9yIChpPTc7IGk+PTA7IGktLSkgeworCQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgewogCQkJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAJCQlvdXRkYXRhIDw8PSAxOwogCQkJb3V0ZGF0YSB8PSAodG1wICYgQVVSRU9OX1NQSV9NSVNPKSA/IDEgOiAwOwpAQCAtNTg0LDE5ICs1OTUsMjQgQEAKIAlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uX2NzODQxNV9nZXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCByZWcpIHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF1cmVvbl9jczg0MTVfZ2V0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgcmVnKQorewogCXVuc2lnbmVkIGNoYXIgdmFsOwogCWF1cmVvbl9zcGlfd3JpdGUoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAweDIwMDAgfCByZWcsIDE2KTsKIAlhdXJlb25fc3BpX3JlYWQoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAweDIxLCA4LCAmdmFsLCAxKTsKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdm9pZCBhdXJlb25fY3M4NDE1X3JlYWQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCByZWcsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpIHsKK3N0YXRpYyB2b2lkIGF1cmVvbl9jczg0MTVfcmVhZChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywKKwkJCQl1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKQorewogCWF1cmVvbl9zcGlfd3JpdGUoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAweDIwMDAgfCByZWcsIDE2KTsKIAlhdXJlb25fc3BpX3JlYWQoaWNlLCBBVVJFT05fQ1M4NDE1X0NTLCAweDIxLCA4LCBidWZmZXIsIHNpemUpOwogfQogCi1zdGF0aWMgdm9pZCBhdXJlb25fY3M4NDE1X3B1dChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywgdW5zaWduZWQgY2hhciB2YWwpIHsKK3N0YXRpYyB2b2lkIGF1cmVvbl9jczg0MTVfcHV0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgcmVnLAorCQkJCQkJdW5zaWduZWQgY2hhciB2YWwpCit7CiAJYXVyZW9uX3NwaV93cml0ZShpY2UsIEFVUkVPTl9DUzg0MTVfQ1MsIDB4MjAwMDAwIHwgKHJlZyA8PCA4KSB8IHZhbCwgMjQpOwogfQogCkBAIC02NTQsMTggKzY3MCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF1cmVvbl9hYzk3X21tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpIHsKK3N0YXRpYyBpbnQgYXVyZW9uX2FjOTdfbW11dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBzaG9ydCBvdm9sLCBudm9sOwogCWludCBjaGFuZ2U7Ci0JCisKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7Ci0JCisKIAlvdm9sID0gd21fZ2V0KGljZSwgV01fT1VUX01VWDEpOwogCW52b2wgPSAob3ZvbCAmIH4weDAyKSB8ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDB4MDIgOiAweDAwKTsKLQlpZiAoKGNoYW5nZSA9IChvdm9sICE9IG52b2wpKSkKKwljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKKwlpZiAoY2hhbmdlKQogCQl3bV9wdXQoaWNlLCBXTV9PVVRfTVVYMSwgbnZvbCk7Ci0JCQorCiAJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOwogCiAJcmV0dXJuIGNoYW5nZTsKQEAgLTcwMiwxMiArNzIwLDEyIEBACiBzdGF0aWMgdm9pZCB3bV9zZXRfdm9sKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIHNob3J0IHZvbCwgdW5zaWduZWQgc2hvcnQgbWFzdGVyKQogewogCXVuc2lnbmVkIGNoYXIgbnZvbDsKLQkKKwogCWlmICgobWFzdGVyICYgV01fVk9MX01VVEUpIHx8ICh2b2wgJiBXTV9WT0xfTVVURSkpCiAJCW52b2wgPSAwOwogCWVsc2UKIAkJbnZvbCA9IDEyNyAtIHdtX3ZvbFsoKCh2b2wgJiB+V01fVk9MX01VVEUpICogKG1hc3RlciAmIH5XTV9WT0xfTVVURSkpIC8gMTI3KSAmIFdNX1ZPTF9NQVhdOwotCQorCiAJd21fcHV0KGljZSwgaW5kZXgsIG52b2wpOwogCXdtX3B1dF9ub2NhY2hlKGljZSwgaW5kZXgsIDB4MTgwIHwgbnZvbCk7CiB9CkBAIC03MzYsNyArNzU0LDggQEAKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CiAJb3ZhbCA9IHdtX2dldChpY2UsIFdNX01VVEUpOwogCW52YWwgPSAob3ZhbCAmIH4weDEwKSB8ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IDAgOiAweDEwKTsKLQlpZiAoKGNoYW5nZSA9IChudmFsICE9IG92YWwpKSkKKwljaGFuZ2UgPSAob3ZhbCAhPSBudmFsKTsKKwlpZiAoY2hhbmdlKQogCQl3bV9wdXQoaWNlLCBXTV9NVVRFLCBudmFsKTsKIAlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CiAKQEAgLTc2MCw3ICs3NzksNyBAQAogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhdXJlb25fc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKIAlpbnQgaTsKLQlmb3IgKGk9MDsgaTwyOyBpKyspCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKIAkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPQogCQkJc3BlYy0+bWFzdGVyW2ldICYgfldNX1ZPTF9NVVRFOwogCXJldHVybiAwOwpAQCAtODQ5LDcgKzg2OCw4IEBACiAvKgogICogV004NzcwIG11dGUgY29udHJvbAogICovCi1zdGF0aWMgaW50IHdtX211dGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykgeworc3RhdGljIGludCB3bV9tdXRlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CiAJdWluZm8tPmNvdW50ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwpAQCAtODYyLDcgKzg4Miw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IGF1cmVvbl9zcGVjICpzcGVjID0gaWNlLT5zcGVjOwogCWludCB2b2ljZXMsIG9mcywgaTsKLQkKKwogCXZvaWNlcyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDg7CiAJb2ZzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweEZGOwogCkBAIC05MDcsNyArOTI3LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYXVyZW9uX3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7Ci0JCisKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCShzcGVjLT5tYXN0ZXJbMF0gJiBXTV9WT0xfTVVURSkgPyAwIDogMTsKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CkBAIC0xMDgzLDIxICsxMTAzLDIxIEBACiBzdGF0aWMgaW50IHdtX2FkY19tdXhfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7Ci0JCSJDRCIsCQkvL0FJTjEKLQkJIkF1eCIsCQkvL0FJTjIKLQkJIkxpbmUiLAkJLy9BSU4zCi0JCSJNaWMiLAkJLy9BSU40Ci0JCSJBQzk3IgkJLy9BSU41CisJCSJDRCIsCQkvKiBBSU4xICovCisJCSJBdXgiLAkJLyogQUlOMiAqLworCQkiTGluZSIsCQkvKiBBSU4zICovCisJCSJNaWMiLAkJLyogQUlONCAqLworCQkiQUM5NyIJCS8qIEFJTjUgKi8KIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdW5pdmVyc2VfdGV4dHNbXSA9IHsKLQkJIkF1eDEiLAkJLy9BSU4xCi0JCSJDRCIsCQkvL0FJTjIKLQkJIlBob25vIiwJLy9BSU4zCi0JCSJMaW5lIiwJCS8vQUlONAotCQkiQXV4MiIsCQkvL0FJTjUKLQkJIk1pYyIsCQkvL0FJTjYKLQkJIkF1eDMiLAkJLy9BSU43Ci0JCSJBQzk3IgkJLy9BSU44CisJCSJBdXgxIiwJCS8qIEFJTjEgKi8KKwkJIkNEIiwJCS8qIEFJTjIgKi8KKwkJIlBob25vIiwJLyogQUlOMyAqLworCQkiTGluZSIsCQkvKiBBSU40ICovCisJCSJBdXgyIiwJCS8qIEFJTjUgKi8KKwkJIk1pYyIsCQkvKiBBSU42ICovCisJCSJBdXgzIiwJCS8qIEFJTjcgKi8KKwkJIkFDOTciCQkvKiBBSU44ICovCiAJfTsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIApAQCAtMTEwOCw4ICsxMTI4LDcgQEAKIAkJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCiAJCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOwogCQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdW5pdmVyc2VfdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDU7CiAJCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQogCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKQEAgLTExNTYsOCArMTE3NSw4IEBACiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdXJlb25fdGV4dHNbXSA9IHsKLQkJIkNEIiwJCS8vUlhQMAotCQkiT3B0aWNhbCIJLy9SWFAxCisJCSJDRCIsCQkvKiBSWFAwICovCisJCSJPcHRpY2FsIgkvKiBSWFAxICovCiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByb2RpZ3lfdGV4dHNbXSA9IHsKIAkJIkNEIiwKQEAgLTExODAsMTAgKzExOTksMTAgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYXVyZW9uX3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7CiAKLQkvL3NuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKLQkvL3ZhbCA9IGF1cmVvbl9jczg0MTVfZ2V0KGljZSwgQ1M4NDE1X0NUUkwyKTsKKwkvKiBzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7ICovCisJLyogdmFsID0gYXVyZW9uX2NzODQxNV9nZXQoaWNlLCBDUzg0MTVfQ1RSTDIpOyAqLwogCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5jczg0MTVfbXV4OwotCS8vc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOworCS8qIHNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIwNiw3ICsxMjI1LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfcmF0ZV9pbmZvIChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3N0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9yYXRlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CiAJdWluZm8tPmNvdW50ID0gMTsKQEAgLTEyMTUsNyArMTIzNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9yYXRlX2dldCAoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCBhdXJlb25fY3M4NDE1X3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBjaGFyIHJhdGlvOwpAQCAtMTIyOSw3ICsxMjQ4LDcgQEAKICAqLwogI2RlZmluZSBhdXJlb25fY3M4NDE1X211dGVfaW5mbwkJc25kX2N0bF9ib29sZWFuX21vbm9faW5mbwogCi1zdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfbXV0ZV9nZXQgKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwpAQCAtMTIzOCw3ICsxMjU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdXJlb25fY3M4NDE1X211dGVfcHV0IChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGNoYXIgb3ZhbCwgbnZhbDsKQEAgLTEyNDksNyArMTI2OCw4IEBACiAJCW52YWwgPSBvdmFsICYgfjB4MjA7CiAJZWxzZQogCQludmFsID0gb3ZhbCB8IDB4MjA7Ci0JaWYgKChjaGFuZ2UgPSAob3ZhbCAhPSBudmFsKSkpCisJY2hhbmdlID0gKG92YWwgIT0gbnZhbCk7CisJaWYgKGNoYW5nZSkKIAkJYXVyZW9uX2NzODQxNV9wdXQoaWNlLCBDUzg0MTVfQ1RSTDEsIG52YWwpOwogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAlyZXR1cm4gY2hhbmdlOwpAQCAtMTI1OCwxNSArMTI3OCwxNyBAQAogLyoKICAqIENTODQxNUEgUS1TdWIgaW5mbwogICovCi1zdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfcXN1Yl9pbmZvIChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykgeworc3RhdGljIGludCBhdXJlb25fY3M4NDE1X3FzdWJfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7CiAJdWluZm8tPmNvdW50ID0gMTA7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9xc3ViX2dldCAoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKSB7CitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfcXN1Yl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCQorCiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwogCWF1cmVvbl9jczg0MTVfcmVhZChpY2UsIENTODQxNV9RU1VCLCB1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwgMTApOwogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKQEAgLTEyNzQsMTggKzEyOTYsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdXJlb25fY3M4NDE1X3NwZGlmX2luZm8gKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKSB7CitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfc3BkaWZfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OwogCXVpbmZvLT5jb3VudCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9tYXNrX2dldCAoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKSB7CitzdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfbWFza19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorewogCW1lbXNldCh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1cywgMHhGRiwgMjQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF1cmVvbl9jczg0MTVfc3BkaWZfZ2V0IChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpIHsKK3N0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9zcGRpZl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCiAJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOwpAQCAtMTMxMSw5ICsxMzM2LDkgQEAKIAllbHNlCiAJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCAmJgogCQkgICAgaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpCi0JCQl0bXAgJj0gfiBBVVJFT05fSFBfU0VMOworCQkJdG1wICY9IH5BVVJFT05fSFBfU0VMOwogCQllbHNlCi0JCQl0bXAgJj0gfiBQUk9ESUdZX0hQX1NFTDsKKwkJCXRtcCAmPSB+UFJPRElHWV9IUF9TRUw7CiAJaWYgKHRtcCAhPSB0bXAyKSB7CiAJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwogCQlyZXR1cm4gMTsKQEAgLTEzMjUsNyArMTM1MCw3IEBACiB7CiAJdW5zaWduZWQgaW50IHRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOwogCi0JcmV0dXJuICggdG1wICYgQVVSRU9OX0hQX1NFTCApIT0gMDsKKwlyZXR1cm4gKHRtcCAmIEFVUkVPTl9IUF9TRUwpICE9IDA7CiB9CiAKICNkZWZpbmUgYXVyZW9uX2hwYW1wX2luZm8Jc25kX2N0bF9ib29sZWFuX21vbm9faW5mbwpAQCAtMTM0Myw3ICsxMzY4LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAotCXJldHVybiBhdXJlb25fc2V0X2hlYWRwaG9uZV9hbXAoaWNlLHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwlyZXR1cm4gYXVyZW9uX3NldF9oZWFkcGhvbmVfYW1wKGljZSwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwogfQogCiAvKgpAQCAtMTM5MCw3ICsxNDE1LDcgQEAKIAkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKIAlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF1cmVvbl9vdmVyc2FtcGxpbmdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTE0MzQsNyArMTQ1OSw3IEBACiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCiAJCS5pbmZvID0gd21fbWFzdGVyX3ZvbF9pbmZvLAogCQkuZ2V0ID0gd21fbWFzdGVyX3ZvbF9nZXQsCkBAIC0xNDUyLDcgKzE0NzcsNyBAQAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCiAJCS5uYW1lID0gIkZyb250IFBsYXliYWNrIFZvbHVtZSIsCiAJCS5pbmZvID0gd21fdm9sX2luZm8sCiAJCS5nZXQgPSB3bV92b2xfZ2V0LApAQCAtMTQ3MSw3ICsxNDk2LDcgQEAKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAogCQkubmFtZSA9ICJSZWFyIFBsYXliYWNrIFZvbHVtZSIsCiAJCS5pbmZvID0gd21fdm9sX2luZm8sCiAJCS5nZXQgPSB3bV92b2xfZ2V0LApAQCAtMTQ5MCw3ICsxNTE1LDcgQEAKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAogCQkubmFtZSA9ICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKIAkJLmluZm8gPSB3bV92b2xfaW5mbywKIAkJLmdldCA9IHdtX3ZvbF9nZXQsCkBAIC0xNTA5LDcgKzE1MzQsNyBAQAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCiAJCS5uYW1lID0gIkxGRSBQbGF5YmFjayBWb2x1bWUiLAogCQkuaW5mbyA9IHdtX3ZvbF9pbmZvLAogCQkuZ2V0ID0gd21fdm9sX2dldCwKQEAgLTE1MjgsNyArMTU1Myw3IEBACiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKIAkJLm5hbWUgPSAiU2lkZSBQbGF5YmFjayBWb2x1bWUiLAogCQkuaW5mbyA9IHdtX3ZvbF9pbmZvLAogCQkuZ2V0ID0gd21fdm9sX2dldCwKQEAgLTE1MzksMjMgKzE1NjQsMjMgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIlBDTSBQbGF5YmFjayBTd2l0Y2giLAogCQkuaW5mbyA9IHdtX3BjbV9tdXRlX2luZm8sCiAJCS5nZXQgPSB3bV9wY21fbXV0ZV9nZXQsCiAJCS5wdXQgPSB3bV9wY21fbXV0ZV9wdXQKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAogCQkubmFtZSA9ICJQQ00gUGxheWJhY2sgVm9sdW1lIiwKIAkJLmluZm8gPSB3bV9wY21fdm9sX2luZm8sCiAJCS5nZXQgPSB3bV9wY21fdm9sX2dldCwKIAkJLnB1dCA9IHdtX3BjbV92b2xfcHV0LAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX3dtX3BjbSB9Ci0gCX0sCisJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJDYXB0dXJlIFN3aXRjaCIsCkBAIC0xNTY2LDcgKzE1OTEsNyBAQAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCiAJCS5uYW1lID0gIkNhcHR1cmUgVm9sdW1lIiwKIAkJLmluZm8gPSB3bV9hZGNfdm9sX2luZm8sCiAJCS5nZXQgPSB3bV9hZGNfdm9sX2dldCwKQEAgLTE2MDUsMjMyICsxNjMwLDIzMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFjOTdfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJBQzk3IFBsYXliYWNrIFN3aXRjaCIsCiAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbW11dGVfaW5mbywKIAkJLmdldCA9IGF1cmVvbl9hYzk3X21tdXRlX2dldCwKIAkJLnB1dCA9IGF1cmVvbl9hYzk3X21tdXRlX3B1dCwKIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01BU1RFUgotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAotIAkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBWb2x1bWUiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUFTVEVSfEFVUkVPTl9BQzk3X1NURVJFTywKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkubmFtZSA9ICJBQzk3IFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01BU1RFUnxBVVJFT05fQUM5N19TVEVSRU8sCiAJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWM5N19tYXN0ZXIgfQotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLSAJCS5uYW1lID0gIkNEIFBsYXliYWNrIFN3aXRjaCIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X211dGVfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19DRAotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNEIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0NECisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLSAJCS5uYW1lID0gIkNEIFBsYXliYWNrIFZvbHVtZSIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19DRHxBVVJFT05fQUM5N19TVEVSRU8sCisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJLm5hbWUgPSAiQ0QgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N192b2xfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQ0R8QVVSRU9OX0FDOTdfU1RFUkVPLAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2FjOTdfZ2FpbiB9Ci0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotIAkJLm5hbWUgPSAiQXV4IFBsYXliYWNrIFN3aXRjaCIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X211dGVfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19BVVgsCi0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQXV4IFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0FVWCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAotIAkJLm5hbWUgPSAiQXV4IFBsYXliYWNrIFZvbHVtZSIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19BVVh8QVVSRU9OX0FDOTdfU1RFUkVPLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19BVVh8QVVSRU9OX0FDOTdfU1RFUkVPLAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2FjOTdfZ2FpbiB9Ci0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotIAkJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBTd2l0Y2giLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTElORQotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTElORQorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCi0gCQkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFZvbHVtZSIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19MSU5FfEFVUkVPTl9BQzk3X1NURVJFTywKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0xJTkV8QVVSRU9OX0FDOTdfU1RFUkVPLAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2FjOTdfZ2FpbiB9Ci0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotIAkJLm5hbWUgPSAiTWljIFBsYXliYWNrIFN3aXRjaCIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X211dGVfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NSUMKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNaWMgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLSAJCS5uYW1lID0gIk1pYyBQbGF5YmFjayBWb2x1bWUiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCS5uYW1lID0gIk1pYyBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NSUMsCiAJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWM5N19nYWluIH0KLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0gCQkubmFtZSA9ICJNaWMgQm9vc3QgKCsyMGRCKSIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbWljYm9vc3RfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X3B1dAotIAl9CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNaWMgQm9vc3QgKCsyMGRCKSIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfbWljYm9vc3RfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X3B1dAorCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBTd2l0Y2giLAogCQkuaW5mbyA9IGF1cmVvbl9hYzk3X21tdXRlX2luZm8sCiAJCS5nZXQgPSBhdXJlb25fYWM5N19tbXV0ZV9nZXQsCiAJCS5wdXQgPSBhdXJlb25fYWM5N19tbXV0ZV9wdXQsCiAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVIKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLSAJCS5uYW1lID0gIkFDOTcgUGxheWJhY2sgVm9sdW1lIiwKLSAJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N192b2xfcHV0LAotIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01BU1RFUnxBVVJFT05fQUM5N19TVEVSRU8sCisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJLm5hbWUgPSAiQUM5NyBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19NQVNURVJ8QVVSRU9OX0FDOTdfU1RFUkVPLAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2FjOTdfbWFzdGVyIH0KLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0gCQkubmFtZSA9ICJDRCBQbGF5YmFjayBTd2l0Y2giLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQVVYCi0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ0QgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQVVYCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLSAJCS5uYW1lID0gIkNEIFBsYXliYWNrIFZvbHVtZSIsCi0gCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKLSAJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19BVVh8QVVSRU9OX0FDOTdfU1RFUkVPLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCS5uYW1lID0gIkNEIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0FVWHxBVVJFT05fQUM5N19TVEVSRU8sCiAJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWM5N19nYWluIH0KLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0gCQkubmFtZSA9ICJQaG9ubyBQbGF5YmFjayBTd2l0Y2giLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQ0QKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJQaG9ubyBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X211dGVfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19DRAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCi0gCQkubmFtZSA9ICJQaG9ubyBQbGF5YmFjayBWb2x1bWUiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfQ0R8QVVSRU9OX0FDOTdfU1RFUkVPLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCS5uYW1lID0gIlBob25vIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0NEfEFVUkVPTl9BQzk3X1NURVJFTywKIAkJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9hYzk3X2dhaW4gfQotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLSAJCS5uYW1lID0gIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwKLSAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAotIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0xJTkUKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X0xJTkUKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAotIAkJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBWb2x1bWUiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTElORXxBVVJFT05fQUM5N19TVEVSRU8sCisJCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwkJLm5hbWUgPSAiTGluZSBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19MSU5FfEFVUkVPTl9BQzk3X1NURVJFTywKIAkJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9hYzk3X2dhaW4gfQotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLSAJCS5uYW1lID0gIk1pYyBQbGF5YmFjayBTd2l0Y2giLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCi0gCQkucHV0ID0gYXVyZW9uX2FjOTdfbXV0ZV9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDCi0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWljIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbXV0ZV9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N19tdXRlX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01JQworCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCi0gCQkubmFtZSA9ICJNaWMgUGxheWJhY2sgVm9sdW1lIiwKLSAJCS5pbmZvID0gYXVyZW9uX2FjOTdfdm9sX2luZm8sCi0gCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N192b2xfcHV0LAotIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X01JQywKKwkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLAorCQkubmFtZSA9ICJNaWMgUGxheWJhY2sgVm9sdW1lIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKKwkJLmdldCA9IGF1cmVvbl9hYzk3X3ZvbF9nZXQsCisJCS5wdXQgPSBhdXJlb25fYWM5N192b2xfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfTUlDLAogCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2FjOTdfZ2FpbiB9Ci0gCX0sCi0gCXsKLSAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotIAkJLm5hbWUgPSAiTWljIEJvb3N0ICgrMjBkQikiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N19taWNib29zdF9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X21pY2Jvb3N0X2dldCwKLSAJCS5wdXQgPSBhdXJlb25fYWM5N19taWNib29zdF9wdXQKLSAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0gCQkubmFtZSA9ICJBdXggUGxheWJhY2sgU3dpdGNoIiwKLSAJCS5pbmZvID0gYXVyZW9uX2FjOTdfbXV0ZV9pbmZvLAotIAkJLmdldCA9IGF1cmVvbl9hYzk3X211dGVfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAotIAkJLnByaXZhdGVfdmFsdWUgPSBBQzk3X1ZJREVPLAotIAl9LAotIAl7Ci0gCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1pYyBCb29zdCAoKzIwZEIpIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N19taWNib29zdF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfbWljYm9vc3RfZ2V0LAorCQkucHV0ID0gYXVyZW9uX2FjOTdfbWljYm9vc3RfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBdXggUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBhdXJlb25fYWM5N19tdXRlX2luZm8sCisJCS5nZXQgPSBhdXJlb25fYWM5N19tdXRlX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X211dGVfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfVklERU8sCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAotCQkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLSAJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBWb2x1bWUiLAotIAkJLmluZm8gPSBhdXJlb25fYWM5N192b2xfaW5mbywKLSAJCS5nZXQgPSBhdXJlb25fYWM5N192b2xfZ2V0LAotIAkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCi0gCQkucHJpdmF0ZV92YWx1ZSA9IEFDOTdfVklERU98QVVSRU9OX0FDOTdfU1RFUkVPLAorCQkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCisJCS5uYW1lID0gIkF1eCBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IGF1cmVvbl9hYzk3X3ZvbF9pbmZvLAorCQkuZ2V0ID0gYXVyZW9uX2FjOTdfdm9sX2dldCwKKwkJLnB1dCA9IGF1cmVvbl9hYzk3X3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gQUM5N19WSURFT3xBVVJFT05fQUM5N19TVEVSRU8sCiAJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWM5N19nYWluIH0KLSAJfSwKKwl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkF1eCBTb3VyY2UiLApAQCAtMTg0NCw0MyArMTg2OSw0MyBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzODQxNV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxTV0lUQ0gpLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgQ0FQVFVSRSwgU1dJVENIKSwKIAkJLmluZm8gPSBhdXJlb25fY3M4NDE1X211dGVfaW5mbywKIAkJLmdldCA9IGF1cmVvbl9jczg0MTVfbXV0ZV9nZXQsCiAJCS5wdXQgPSBhdXJlb25fY3M4NDE1X211dGVfcHV0CiAJfSwKLSAJewotIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsTk9ORSkgIlNvdXJjZSIsCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIENBUFRVUkUsIE5PTkUpICJTb3VyY2UiLAogCQkuaW5mbyA9IGF1cmVvbl9jczg0MTVfbXV4X2luZm8sCiAJCS5nZXQgPSBhdXJlb25fY3M4NDE1X211eF9nZXQsCiAJCS5wdXQgPSBhdXJlb25fY3M4NDE1X211eF9wdXQsCiAJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIlEtc3ViY29kZSAiLENBUFRVUkUsREVGQVVMVCksCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJRLXN1YmNvZGUgIiwgQ0FQVFVSRSwgREVGQVVMVCksCiAJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKIAkJLmluZm8gPSBhdXJlb25fY3M4NDE1X3FzdWJfaW5mbywKIAkJLmdldCA9IGF1cmVvbl9jczg0MTVfcXN1Yl9nZXQsCiAJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxNQVNLKSwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIENBUFRVUkUsIE1BU0spLAogCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJCS5pbmZvID0gYXVyZW9uX2NzODQxNV9zcGRpZl9pbmZvLAogCQkuZ2V0ID0gYXVyZW9uX2NzODQxNV9tYXNrX2dldAogCX0sCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLENBUFRVUkUsREVGQVVMVCksCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBDQVBUVVJFLCBERUZBVUxUKSwKIAkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAogCQkuaW5mbyA9IGF1cmVvbl9jczg0MTVfc3BkaWZfaW5mbywKIAkJLmdldCA9IGF1cmVvbl9jczg0MTVfc3BkaWZfZ2V0CiAJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxOT05FKSAiUmF0ZSIsCi0JCS5hY2Nlc3MgPVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgQ0FQVFVSRSwgTk9ORSkgIlJhdGUiLAorCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCiAJCS5pbmZvID0gYXVyZW9uX2NzODQxNV9yYXRlX2luZm8sCiAJCS5nZXQgPSBhdXJlb25fY3M4NDE1X3JhdGVfZ2V0CiAJfQpAQCAtMTkwNSwxNSArMTkzMCwxNCBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCQorCiAJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjcxX1VOSVZFUlNFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVuaXZlcnNlX2FjOTdfY29udHJvbHMpOyBpKyspIHsKIAkJCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZ1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW2ldLCBpY2UpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KLQl9Ci0JZWxzZSBpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgJiYKKwl9IGVsc2UgaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCiAJCSBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVCkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYzk3X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmYWM5N19jb250cm9sc1tpXSwgaWNlKSk7CkBAIC0xOTMyLDcgKzE5NTYsNyBAQAogCQllbHNlIGlmICgoaWQgJiAweDBGKSAhPSAweDAxKQogCQkJc25kX3ByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkIHVuc3VwcG9ydGVkIENTODQxNSByZXYuICglYylcbiIsIChjaGFyKSgoaWQgJiAweDBGKSArICdBJyAtIDEpKTsKIAkJZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpPCBBUlJBWV9TSVpFKGNzODQxNV9jb250cm9scyk7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M4NDE1X2NvbnRyb2xzKTsgaSsrKSB7CiAJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAkJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIChrY3RsID0gc25kX2N0bF9uZXcxKCZjczg0MTVfY29udHJvbHNbaV0sIGljZSkpKTsKIAkJCQlpZiAoZXJyIDwgMCkKQEAgLTE5NDMsNyArMTk2Nyw3IEBACiAJCX0KIAkJc25kX2ljZTE3MTJfcmVzdG9yZV9ncGlvX3N0YXR1cyhpY2UpOwogCX0KLQkKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDU5LDExICsyMDgzLDEyIEBACiAKIAkvKiB0byByZW1lYmVyIHRoZSByZWdpc3RlciB2YWx1ZXMgb2YgQ1M4NDE1ICovCiAJaWNlLT5ha20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FrbTR4eHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoISBpY2UtPmFrbSkKKwlpZiAoIWljZS0+YWttKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpY2UtPmFrbV9jb2RlY3MgPSAxOwotCQotCWlmICgoZXJyID0gYXVyZW9uX2FjOTdfaW5pdChpY2UpKSAhPSAwKQorCisJZXJyID0gYXVyZW9uX2FjOTdfaW5pdChpY2UpOworCWlmIChlcnIgIT0gMCkKIAkJcmV0dXJuIGVycjsKIAogCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIDB4NWZmZmZmKTsgLyogZml4IHRoaXMgZm9yIHRoZSB0aW1lIGJlaW5nICovCkBAIC0yMDg2LDcgKzIxMTEsNyBAQAogCS8qIGluaXRpYWxpemUgV004NzcwIGNvZGVjICovCiAJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MSB8fAogCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCB8fAotCSAgICAgICAgaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpCisJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKQogCQlwID0gd21faW5pdHNfcHJvZGlneTsKIAllbHNlCiAJCXAgPSB3bV9pbml0c19hdXJlb247CkBAIC0yMTA1LDEwICsyMTMwLDEwIEBACiAKIAlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CiAKLSAgICAgICAgLyogaW5pdGlhbGl6ZSBQQ0E5NTU0IHBpbiBkaXJlY3Rpb25zICYgc2V0IGRlZmF1bHQgaW5wdXQqLworCS8qIGluaXRpYWxpemUgUENBOTU1NCBwaW4gZGlyZWN0aW9ucyAmIHNldCBkZWZhdWx0IGlucHV0ICovCiAJYXVyZW9uX3BjYTk1NTRfd3JpdGUoaWNlLCBQQ0E5NTU0X0RJUiwgMHgwMCk7CiAJYXVyZW9uX3BjYTk1NTRfd3JpdGUoaWNlLCBQQ0E5NTU0X09VVCwgMHgwMCk7ICAgLyogaW50ZXJuYWwgQVVYICovCi0JCisKIAlzcGVjLT5tYXN0ZXJbMF0gPSBXTV9WT0xfTVVURTsKIAlzcGVjLT5tYXN0ZXJbMV0gPSBXTV9WT0xfTVVURTsKIAlmb3IgKGkgPSAwOyBpIDwgaWNlLT5udW1fdG90YWxfZGFjczsgaSsrKSB7CkBAIC0yMTU4LDYgKzIxODMsMjQgQEAKIH07CiAjZGVmaW5lIHByb2RpZ3k3MV9lZXByb20gYXVyZW9uNzFfZWVwcm9tCiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF1cmVvbjcxX3VuaXZlcnNlX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MmIsCS8qIGNsb2NrIDUxMiwgbXB1NDAxLCBzcGRpZi1pbi9BREMsCisJCQkJCSAqIDREQUNzCisJCQkJCSAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmYywJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHg1ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwKK307CisKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MWx0X2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4NGIsCS8qIGNsb2NrIDM4NCwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwogCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KQEAgLTIxOTcsMTQgKzIyNDAsMTQgQEAKIAkJLmVlcHJvbV9kYXRhID0gYXVyZW9uNzFfZWVwcm9tLAogCQkuZHJpdmVyID0gIkF1cmVvbjcxIiwKIAl9LAotIAl7Ci0gCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9VTklWRVJTRSwKLSAJCS5uYW1lID0gIlRlcnJhdGVjIEF1cmVvbiA3LjEtVW5pdmVyc2UiLAorCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONzFfVU5JVkVSU0UsCisJCS5uYW1lID0gIlRlcnJhdGVjIEF1cmVvbiA3LjEtVW5pdmVyc2UiLAogCQkubW9kZWwgPSAidW5pdmVyc2UiLAotIAkJLmNoaXBfaW5pdCA9IGF1cmVvbl9pbml0LAotIAkJLmJ1aWxkX2NvbnRyb2xzID0gYXVyZW9uX2FkZF9jb250cm9scywKLSAJCS5lZXByb21fc2l6ZSA9IHNpemVvZihhdXJlb243MV9lZXByb20pLAotIAkJLmVlcHJvbV9kYXRhID0gYXVyZW9uNzFfZWVwcm9tLAorCQkuY2hpcF9pbml0ID0gYXVyZW9uX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IGF1cmVvbl9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZihhdXJlb243MV91bml2ZXJzZV9lZXByb20pLAorCQkuZWVwcm9tX2RhdGEgPSBhdXJlb243MV91bml2ZXJzZV9lZXByb20sCiAJCS5kcml2ZXIgPSAiQXVyZW9uNzFVbml2IiwgLyoga2VlcCBpbiAxNSBsZXR0ZXJzICovCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwppbmRleCAwZWQ5NmMxLi5kMjE2MzYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogc3RhdGljIGludCBzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc3RhdHVzX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQljaGFyIHJlZyA9IDB4MTA7IC8vIGNzODQyNyByZWNlaXZlciBlcnJvciByZWdpc3RlcgorCWNoYXIgcmVnID0gMHgxMDsgLyogQ1M4NDI3IHJlY2VpdmVyIGVycm9yIHJlZ2lzdGVyICovCiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsICZyZWcsIDEpICE9IDEpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaAppbmRleCBlYTcxMTZjLi5mN2YxNGRmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAkJIntNaWRpTWFuIE0gQXVkaW8sRGVsdGEgRGlPIDI0OTZ9LCJcCiAJCSJ7TWlkaU1hbiBNIEF1ZGlvLERlbHRhIDY2fSwiXAogCQkie01pZGlNYW4gTSBBdWRpbyxEZWx0YSA0NH0sIlwKKwkJIntNaWRpTWFuIE0gQXVkaW8sRGVsdGEgNDEwfSwiXAogCQkie01pZGlNYW4gTSBBdWRpbyxBdWRpb3BoaWxlIDI0Lzk2fSwiXAogCQkie0RpZ2lncmFtLFZYNDQyfSwiXAogCQkie0xpb25zdHJhY3MsTWVkaWFzdGF0aW9ufSwiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IDAxM2ZjNGYuLjZmZTM1YjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0xNDksNyArMTQ5LDggQEAKIAlzdHJ1Y3QgZXdzX3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7CiAJdW5zaWduZWQgY2hhciBkYXRhLCBuZGF0YTsKIAotCXNuZF9hc3NlcnQoY2hpcF9tYXNrID49IDAgJiYgY2hpcF9tYXNrIDw9IDB4MGYsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihjaGlwX21hc2sgPCAwIHx8IGNoaXBfbWFzayA+IDB4MGYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzbmRfaTJjX2xvY2soaWNlLT5pMmMpOwogCWlmIChzbmRfaTJjX3JlYWRieXRlcyhzcGVjLT5pMmNkZXZzW0VXU19JMkNfUENGMl0sICZkYXRhLCAxKSAhPSAxKQogCQlnb3RvIF9fZXJyb3I7CkBAIC02ODUsNyArNjg2LDggQEAKIAlpbnQgY2hhbm5lbCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCXVuc2lnbmVkIGNoYXIgZGF0YTsKIAotCXNuZF9hc3NlcnQoY2hhbm5lbCA+PSAwICYmIGNoYW5uZWwgPD0gNywgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPiA3KSkKKwkJcmV0dXJuIDA7CiAJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKIAlpZiAoc25kX2kyY19yZWFkYnl0ZXMoc3BlYy0+aTJjZGV2c1tFV1NfSTJDX1BDRjFdLCAmZGF0YSwgMSkgIT0gMSkgewogCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CkBAIC03MDUsNyArNzA3LDggQEAKIAlpbnQgY2hhbm5lbCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCXVuc2lnbmVkIGNoYXIgZGF0YSwgbmRhdGE7CiAKLQlzbmRfYXNzZXJ0KGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDw9IDcsIHJldHVybiAwKTsKKwlpZiAoc25kX0JVR19PTihjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gNykpCisJCXJldHVybiAwOwogCXNuZF9pMmNfbG9jayhpY2UtPmkyYyk7CiAJaWYgKHNuZF9pMmNfcmVhZGJ5dGVzKHNwZWMtPmkyY2RldnNbRVdTX0kyQ19QQ0YxXSwgJmRhdGEsIDEpICE9IDEpIHsKIAkJc25kX2kyY191bmxvY2soaWNlLT5pMmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDI5ZDQ0OWQuLjViNDQyMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKgotICovICAgICAgCisgKi8KIAogLyoKICAgTk9URVM6CkBAIC0zNSw3ICszNSw3IEBACiAgKgogICogIDIwMDIuMTEuMjYJSmFtZXMgU3RhZmZvcmQgPGpzdGFmZm9yZEBhbXBsdGQuY29tPgogICoJQWRkZWQgc3VwcG9ydCBmb3IgVlQxNzI0IChFbnZ5MjRIVCkKLSAqCUkgaGF2ZSBsZWZ0IG91dCBzdXBwb3J0IGZvciAxNzYuNCBhbmQgMTkyIEtIeiBmb3IgdGhlIG1vbWVudC4gCisgKglJIGhhdmUgbGVmdCBvdXQgc3VwcG9ydCBmb3IgMTc2LjQgYW5kIDE5MiBLSHogZm9yIHRoZSBtb21lbnQuCiAgKiAgSSBhbHNvIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB3aXRoIHRoZSBpbnRlcm5hbCBTL1BESUYgdHJhbnNtaXR0ZXIgb3IgdGhlIE1QVS00MDEKICAqCiAgKiAgMjAwMy4wMi4yMCAgVGFrc2FoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgpAQCAtNDcsNyArNDcsNyBAQAogICovCiAKIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMjMsNyArMTIzLDcgQEAKIC8qCiAgKiAgQmFzaWMgSS9PCiAgKi8KLSAKKwogLyogY2hlY2sgd2hldGhlciB0aGUgY2xvY2sgbW9kZSBpcyBzcGRpZi1pbiAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc3BkaWZfbWFzdGVyKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewpAQCAtMTM1LDEzICsxMzUsMTMgQEAKIAlyZXR1cm4gaXNfc3BkaWZfbWFzdGVyKGljZSkgfHwgUFJPX1JBVEVfTE9DS0VEOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX2ljZTE3MTJfZHNfd3JpdGUoc3RydWN0IHNuZF9pY2UxNzEyICogaWNlLCB1OCBjaGFubmVsLCB1OCBhZGRyLCB1MzIgZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaWNlMTcxMl9kc193cml0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdTggY2hhbm5lbCwgdTggYWRkciwgdTMyIGRhdGEpCiB7CiAJb3V0YigoY2hhbm5lbCA8PCA0KSB8IGFkZHIsIElDRURTKGljZSwgSU5ERVgpKTsKIAlvdXRsKGRhdGEsIElDRURTKGljZSwgREFUQSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBzbmRfaWNlMTcxMl9kc19yZWFkKHN0cnVjdCBzbmRfaWNlMTcxMiAqIGljZSwgdTggY2hhbm5lbCwgdTggYWRkcikKK3N0YXRpYyBpbmxpbmUgdTMyIHNuZF9pY2UxNzEyX2RzX3JlYWQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHU4IGNoYW5uZWwsIHU4IGFkZHIpCiB7CiAJb3V0YigoY2hhbm5lbCA8PCA0KSB8IGFkZHIsIElDRURTKGljZSwgSU5ERVgpKTsKIAlyZXR1cm4gaW5sKElDRURTKGljZSwgREFUQSkpOwpAQCAtMjYwLDcgKzI2MCw3IEBACiBzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JCisKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGluYihJQ0VNVChpY2UsIE1PTklUT1JfUk9VVEVDVFJMKSkgJiBJQ0UxNzEyX1JPVVRFX0FDOTcgPyAxIDogMDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2OSwxMSArMjY5LDEyIEBACiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgY2hhciB2YWwsIG52YWw7Ci0JCisKIAlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAl2YWwgPSBpbmIoSUNFTVQoaWNlLCBNT05JVE9SX1JPVVRFQ1RSTCkpOwogCW52YWwgPSB2YWwgJiB+SUNFMTcxMl9ST1VURV9BQzk3OwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgbnZhbCB8PSBJQ0UxNzEyX1JPVVRFX0FDOTc7CisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQludmFsIHw9IElDRTE3MTJfUk9VVEVfQUM5NzsKIAlvdXRiKG52YWwsIElDRU1UKGljZSwgTU9OSVRPUl9ST1VURUNUUkwpKTsKIAlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCXJldHVybiB2YWwgIT0gbnZhbDsKQEAgLTMyOSw3ICszMzAsNyBAQAogCXVuc2lnbmVkIGNoYXIgcmVnWzJdID0geyAweDgwIHwgNCwgMCB9OyAgIC8qIENTODQyNyBhdXRvIGluY3JlbWVudCB8IHJlZ2lzdGVyIG51bWJlciA0ICsgZGF0YSAqLwogCXVuc2lnbmVkIGNoYXIgdmFsLCBudmFsOwogCWludCByZXMgPSAwOwotCQorCiAJc25kX2kyY19sb2NrKGljZS0+aTJjKTsKIAlpZiAoc25kX2kyY19zZW5kYnl0ZXMoaWNlLT5jczg0MjcsIHJlZywgMSkgIT0gMSkgewogCQlzbmRfaTJjX3VubG9jayhpY2UtPmkyYyk7CkBAIC0zODEsOSArMzgyLDkgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfY3M4NDI3X2NyZWF0ZShpY2UtPmkyYywgYWRkciwKLQkJCQkgICAgIChpY2UtPmNzODQyN190aW1lb3V0ICogSFopIC8gMTAwMCwKLQkJCQkgICAgICZpY2UtPmNzODQyNykpIDwgMCkgeworCWVyciA9IHNuZF9jczg0MjdfY3JlYXRlKGljZS0+aTJjLCBhZGRyLAorCQkoaWNlLT5jczg0MjdfdGltZW91dCAqIEhaKSAvIDEwMDAsICZpY2UtPmNzODQyNyk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiQ1M4NDI3IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzk1LDkgKzM5Niw5IEBACiAKIHN0YXRpYyB2b2lkIHNuZF9pY2UxNzEyX3NldF9pbnB1dF9jbG9ja19zb3VyY2Uoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCBzcGRpZl9pc19tYXN0ZXIpCiB7Ci0gICAgICAgIC8qIGNoYW5nZSBDUzg0MjcgY2xvY2sgc291cmNlIHRvbyAqLwotICAgICAgICBpZiAoaWNlLT5jczg0MjcpCi0gICAgICAgICAgICAgICAgc25kX2ljZTE3MTJfY3M4NDI3X3NldF9pbnB1dF9jbG9jayhpY2UsIHNwZGlmX2lzX21hc3Rlcik7CisJLyogY2hhbmdlIENTODQyNyBjbG9jayBzb3VyY2UgdG9vICovCisJaWYgKGljZS0+Y3M4NDI3KQorCQlzbmRfaWNlMTcxMl9jczg0Mjdfc2V0X2lucHV0X2Nsb2NrKGljZSwgc3BkaWZfaXNfbWFzdGVyKTsKIAkvKiBub3RpZnkgYWs0NTI0IGNoaXAgYXMgd2VsbCAqLwogCWlmIChzcGRpZl9pc19tYXN0ZXIpIHsKIAkJdW5zaWduZWQgaW50IGk7CkBAIC00NTcsMTEgKzQ1OCwxMiBAQAogCQkJdTE2IHBia3N0YXR1czsKIAkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCQkJcGJrc3RhdHVzID0gaW53KElDRURTKGljZSwgSU5UU1RBVCkpOwotCQkJLy9wcmludGsoInBia3N0YXR1cyA9IDB4JXhcbiIsIHBia3N0YXR1cyk7CisJCQkvKiBwcmludGsoInBia3N0YXR1cyA9IDB4JXhcbiIsIHBia3N0YXR1cyk7ICovCiAJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7CiAJCQkJaWYgKChwYmtzdGF0dXMgJiAoMyA8PCAoaWR4ICogMikpKSA9PSAwKQogCQkJCQljb250aW51ZTsKLQkJCQlpZiAoKHN1YnN0cmVhbSA9IGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1tpZHhdKSAhPSBOVUxMKQorCQkJCXN1YnN0cmVhbSA9IGljZS0+cGxheWJhY2tfY29uX3N1YnN0cmVhbV9kc1tpZHhdOworCQkJCWlmIChzdWJzdHJlYW0gIT0gTlVMTCkKIAkJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCQkJCW91dHcoMyA8PCAoaWR4ICogMiksIElDRURTKGljZSwgSU5UU1RBVCkpOwogCQkJfQpAQCAtNTA3LDcgKzUwOSw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTMyIHRtcDsKLQkKKwogCXNwaW5fbG9jaygmaWNlLT5yZWdfbG9jayk7CiAJdG1wID0gc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19QQktfQ1RSTCk7CiAJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkgewpAQCAtNTMyLDcgKzUzNCw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTMyIHRtcDsKLQkKKwogCXNwaW5fbG9jaygmaWNlLT5yZWdfbG9jayk7CiAJdG1wID0gc25kX2ljZTE3MTJfZHNfcmVhZChpY2UsIHN1YnN0cmVhbS0+bnVtYmVyICogMiwgSUNFMTcxMl9EU0NfQ09OVFJPTCk7CiAJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkgewpAQCAtNTU3LDcgKzU1OSw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTggdG1wOwotCQorCiAJc3Bpbl9sb2NrKCZpY2UtPnJlZ19sb2NrKTsKIAl0bXAgPSBzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0NBUF9DVFJMKTsKIAlpZiAoY21kID09IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUKSB7CkBAIC03MTEsOCArNzEzLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrID0KLXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9wbGF5YmFjayA9IHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC03MzEsOCArNzMyLDcgQEAKIAkuZmlmb19zaXplID0JCTAsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfcGxheWJhY2tfZHMgPQoteworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzID0gewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKQEAgLTc1MSw4ICs3NTEsNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlID0KLXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlID0gewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKQEAgLTc4OCw3ICs3ODcsNyBAQAogCiAJaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtX2RzW3N1YnN0cmVhbS0+bnVtYmVyXSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzOwotCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOyAKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAl0bXAgPSBpbncoSUNFRFMoaWNlLCBJTlRNQVNLKSkgJiB+KDEgPDwgKHN1YnN0cmVhbS0+bnVtYmVyICogMikpOwogCW91dHcodG1wLCBJQ0VEUyhpY2UsIElOVE1BU0spKTsKIAlzcGluX3VubG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwpAQCAtODIxLDcgKzgyMCw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJdTMyIHRtcDsKIAotCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOyAKKwlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAl0bXAgPSBpbncoSUNFRFMoaWNlLCBJTlRNQVNLKSkgfCAoMyA8PCAoc3Vic3RyZWFtLT5udW1iZXIgKiAyKSk7CiAJb3V0dyh0bXAsIElDRURTKGljZSwgSU5UTUFTSykpOwogCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CkBAIC04NzAsNyArODY5LDcgQEAKIAkucG9pbnRlciA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3BjbShzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfcGNtICoqIHJwY20pCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9wY20oc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCBkZXZpY2UsIHN0cnVjdCBzbmRfcGNtICoqcnBjbSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CkBAIC05MDAsNyArODk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfcGNtX2RzKHN0cnVjdCBzbmRfaWNlMTcxMiAqIGljZSwgaW50IGRldmljZSwgc3RydWN0IHNuZF9wY20gKiogcnBjbSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3BjbV9kcyhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IGRldmljZSwgc3RydWN0IHNuZF9wY20gKipycGNtKQogewogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycjsKQEAgLTEwMjksMTQgKzEwMjgsMTQgQEAKIAlpZiAoaW5iKElDRU1UKGljZSwgUExBWUJBQ0tfQ09OVFJPTCkpICYgKElDRTE3MTJfQ0FQVFVSRV9TVEFSVF9TSEFET1d8CiAJCQkJCQkgSUNFMTcxMl9QTEFZQkFDS19QQVVTRXwKIAkJCQkJCSBJQ0UxNzEyX1BMQVlCQUNLX1NUQVJUKSkgewotCSAgICAgIF9fb3V0OgorX19vdXQ6CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljZS0+cmVnX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIWZvcmNlICYmIGlzX3Byb19yYXRlX2xvY2tlZChpY2UpKQogCQlnb3RvIF9fb3V0OwogCi0gICAgICAgIG9sZCA9IGluYihJQ0VNVChpY2UsIFJBVEUpKTsKKwlvbGQgPSBpbmIoSUNFTVQoaWNlLCBSQVRFKSk7CiAJaWYgKCFmb3JjZSAmJiBvbGQgPT0gdmFsKQogCQlnb3RvIF9fb3V0OwogCW91dGIodmFsLCBJQ0VNVChpY2UsIFJBVEUpKTsKQEAgLTExMjMsOCArMTEyMiw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm8gPQoteworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrX3BybyA9IHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC0xMTQzLDggKzExNDEsNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlX3BybyA9Ci17CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm8gPSB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfApAQCAtMTIzOCw3ICsxMjM1LDcgQEAKIAkucG9pbnRlciA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl9wY21fcHJvZmkoc3RydWN0IHNuZF9pY2UxNzEyICogaWNlLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKiBycGNtKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfcGNtX3Byb2ZpKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgZGV2aWNlLCBzdHJ1Y3Qgc25kX3BjbSAqKnJwY20pCiB7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgZXJyOwpAQCAtMTI2Miw3ICsxMjU5LDcgQEAKIAlpY2UtPnBjbV9wcm8gPSBwY207CiAJaWYgKHJwY20pCiAJCSpycGNtID0gcGNtOwotCQorCiAJaWYgKGljZS0+Y3M4NDI3KSB7CiAJCS8qIGFzc2lnbiBjaGFubmVscyB0byBpZWM5NTggKi8KIAkJZXJyID0gc25kX2NzODQyN19pZWM5NThfYnVpbGQoaWNlLT5jczg0MjcsCkBAIC0xMjcyLDcgKzEyNjksOCBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2J1aWxkX3Byb19taXhlcihpY2UpKSA8IDApCisJZXJyID0gc25kX2ljZTE3MTJfYnVpbGRfcHJvX21peGVyKGljZSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjk5LDcgKzEyOTcsNyBAQAogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCBwcml2X2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICsKIAkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JCisKIAlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCSEoKGljZS0+cHJvX3ZvbHVtZXNbcHJpdl9pZHhdID4+IDE1KSAmIDEpOwpAQCAtMTM0MSw3ICsxMzM5LDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgcHJpdl9pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKSArCiAJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCQorCiAJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQogCQkoaWNlLT5wcm9fdm9sdW1lc1twcml2X2lkeF0gPj4gMCkgJiAxMjc7CkBAIC0xNDA2LDcgKzE0MDQsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTXVsdGkgIixDQVBUVVJFLFNXSVRDSCksCisJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk11bHRpICIsIENBUFRVUkUsIFNXSVRDSCksCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCiAJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfZ2V0LAogCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX3B1dCwKQEAgLTE0MjgsNyArMTQyNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3ZvbHVtZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJNdWx0aSAiLENBUFRVUkUsVk9MVU1FKSwKKwkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTXVsdGkgIiwgQ0FQVFVSRSwgVk9MVU1FKSwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfaW5mbywKIAkuZ2V0ID0gc25kX2ljZTE3MTJfcHJvX21peGVyX3ZvbHVtZV9nZXQsCiAJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfcHV0LApAQCAtMTQ0OCw3ICsxNDQ2LDcgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KLQkKKwogCWlmIChpY2UtPm51bV90b3RhbF9hZGNzID4gMCkgewogCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0bXAgPSBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ19zd2l0Y2g7CiAJCXRtcC5jb3VudCA9IGljZS0+bnVtX3RvdGFsX2FkY3M7CkBAIC0xNDk1LDcgKzE0OTMsNyBAQAogCWljZS0+YWM5NyA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX2FjOTdfbWl4ZXIoc3RydWN0IHNuZF9pY2UxNzEyICogaWNlKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfYWM5N19taXhlcihzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKIAlpbnQgZXJyLCBidXNfbnVtID0gMDsKIAlzdHJ1Y3Qgc25kX2FjOTdfdGVtcGxhdGUgYWM5NzsKQEAgLTE1MTAsMjcgKzE1MDgsMzIgQEAKIAl9OwogCiAJaWYgKGljZV9oYXNfY29uX2FjOTcoaWNlKSkgewotCQlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhpY2UtPmNhcmQsIGJ1c19udW0rKywgJmNvbl9vcHMsIE5VTEwsICZwYnVzKSkgPCAwKQorCQllcnIgPSBzbmRfYWM5N19idXMoaWNlLT5jYXJkLCBidXNfbnVtKyssICZjb25fb3BzLCBOVUxMLCAmcGJ1cyk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCQlhYzk3LnByaXZhdGVfZGF0YSA9IGljZTsKIAkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpKSA8IDApCisJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKKwkJaWYgKGVyciA8IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBhYzk3IGZvciBjb25zdW1lciwgc2tpcHBlZFxuIik7CiAJCWVsc2UgewotCQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpKSA8IDApCisJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2ljZTE3MTJfbWl4ZXJfZGlnbWl4X3JvdXRlX2FjOTcsIGljZSkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0JaWYgKCEgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQUNMSU5LXSAmIElDRTE3MTJfQ0ZHX1BST19JMlMpKSB7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfYnVzKGljZS0+Y2FyZCwgYnVzX251bSwgJnByb19vcHMsIE5VTEwsICZwYnVzKSkgPCAwKQorCWlmICghKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQUNMSU5LXSAmIElDRTE3MTJfQ0ZHX1BST19JMlMpKSB7CisJCWVyciA9IHNuZF9hYzk3X2J1cyhpY2UtPmNhcmQsIGJ1c19udW0sICZwcm9fb3BzLCBOVUxMLCAmcGJ1cyk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCQlhYzk3LnByaXZhdGVfZGF0YSA9IGljZTsKIAkJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfaWNlMTcxMl9taXhlcl9mcmVlX2FjOTc7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpKSA8IDApCisJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKKwkJaWYgKGVyciA8IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CiAJCWVsc2UKIAkJCXJldHVybiAwOwpAQCAtMTU0OSw3ICsxNTUyLDcgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGludClpY2UtPmVlcHJvbS5kYXRhW2lkeF0gfCAoKHVuc2lnbmVkIGludClpY2UtPmVlcHJvbS5kYXRhW2lkeCArIDFdIDw8IDgpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfaWNlMTcxMl9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwgCitzdGF0aWMgdm9pZCBzbmRfaWNlMTcxMl9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQkgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CkBAIC0xNTg1LDE1ICsxNTg4LDE1IEBACiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBTUERPVVQgICAgICAgICAgIDogMHglMDR4XG4iLCAodW5zaWduZWQpaW53KElDRU1UKGljZSwgUk9VVEVfU1BET1VUKSkpOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgUkFURSAgICAgICAgICAgICA6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKWluYihJQ0VNVChpY2UsIFJBVEUpKSk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBHUElPX0RBVEEgICAgICAgIDogMHglMDJ4XG4iLCAodW5zaWduZWQpc25kX2ljZTE3MTJfZ2V0X2dwaW9fZGF0YShpY2UpKTsKLSAgICAgICAgc25kX2lwcmludGYoYnVmZmVyLCAiICBHUElPX1dSSVRFX01BU0sgIDogMHglMDJ4XG4iLCAodW5zaWduZWQpc25kX2ljZTE3MTJfcmVhZChpY2UsIElDRTE3MTJfSVJFR19HUElPX1dSSVRFX01BU0spKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIgIEdQSU9fV1JJVEVfTUFTSyAgOiAweCUwMnhcbiIsICh1bnNpZ25lZClzbmRfaWNlMTcxMl9yZWFkKGljZSwgSUNFMTcxMl9JUkVHX0dQSU9fV1JJVEVfTUFTSykpOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgR1BJT19ESVJFQ1RJT04gICA6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKXNuZF9pY2UxNzEyX3JlYWQoaWNlLCBJQ0UxNzEyX0lSRUdfR1BJT19ESVJFQ1RJT04pKTsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3Byb2NfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2ljZTE3MTJfcHJvY19pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKLQlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhpY2UtPmNhcmQsICJpY2UxNzEyIiwgJmVudHJ5KSkKKwlpZiAoIXNuZF9jYXJkX3Byb2NfbmV3KGljZS0+Y2FyZCwgImljZTE3MTIiLCAmZW50cnkpKQogCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGljZSwgc25kX2ljZTE3MTJfcHJvY19yZWFkKTsKIH0KIApAQCAtMTYxMyw3ICsxNjE2LDcgQEAKIAkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCQorCiAJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAmaWNlLT5lZXByb20sIHNpemVvZihpY2UtPmVlcHJvbSkpOwogCXJldHVybiAwOwogfQpAQCAtMTY0MSw3ICsxNjQ0LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpZiAoaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9nZXQpCi0JCWljZS0+c3BkaWYub3BzLmRlZmF1bHRfZ2V0KGljZSwgdWNvbnRyb2wpOyAKKwkJaWNlLT5zcGRpZi5vcHMuZGVmYXVsdF9nZXQoaWNlLCB1Y29udHJvbCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NTcsNyArMTY2MCw3IEBACiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgREVGQVVMVCksCiAJLmluZm8gPQkJc25kX2ljZTE3MTJfc3BkaWZfaW5mbywKIAkuZ2V0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX2RlZmF1bHRfZ2V0LAogCS5wdXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdF9wdXQKQEAgLTE3MDksNyArMTcxMiw3IEBACiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgQ09OX01BU0spLAogCS5pbmZvID0JCXNuZF9pY2UxNzEyX3NwZGlmX2luZm8sCiAJLmdldCA9CQlzbmRfaWNlMTcxMl9zcGRpZl9tYXNrY19nZXQsCiB9OwpAQCAtMTcxOCw3ICsxNzIxLDcgQEAKIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAotCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUFJPX01BU0spLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBQUk9fTUFTSyksCiAJLmluZm8gPQkJc25kX2ljZTE3MTJfc3BkaWZfaW5mbywKIAkuZ2V0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX21hc2twX2dldCwKIH07CkBAIC0xNzQ2LDcgKzE3NDksNyBAQAogCS5hY2Nlc3MgPQkoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CiAJCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFKSwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxQQ01fU1RSRUFNKSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgUENNX1NUUkVBTSksCiAJLmluZm8gPQkJc25kX2ljZTE3MTJfc3BkaWZfaW5mbywKIAkuZ2V0ID0JCXNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbV9nZXQsCiAJLnB1dCA9CQlzbmRfaWNlMTcxMl9zcGRpZl9zdHJlYW1fcHV0CkBAIC0xNzU4LDcgKzE3NjEsNyBAQAogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGNoYXIgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKIAlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgKDE8PDI0KSkgPyAxIDogMDsKLQkKKwogCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCShzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIG1hc2sgPyAxIDogMCkgXiBpbnZlcnQ7CkBAIC0xODI1LDcgKzE4MjgsNyBAQAogCQk5LCA2LCAzLCAxLCA3LCA0LCAwLCAxMiwgOCwgNSwgMiwgMTEsIDI1NSwgMjU1LCAyNTUsIDEwCiAJfTsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKLQkKKwogCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCWlmIChpc19zcGRpZl9tYXN0ZXIoaWNlKSkgewogCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTM7CkBAIC0xODY3LDcgKzE4NzAsNyBAQAogCiAJaWYgKChvdmFsICYgSUNFMTcxMl9TUERJRl9NQVNURVIpICE9CiAJICAgIChpbmIoSUNFTVQoaWNlLCBSQVRFKSkgJiBJQ0UxNzEyX1NQRElGX01BU1RFUikpCi0JICAgICAgICBzbmRfaWNlMTcxMl9zZXRfaW5wdXRfY2xvY2tfc291cmNlKGljZSwgaXNfc3BkaWZfbWFzdGVyKGljZSkpOworCQlzbmRfaWNlMTcxMl9zZXRfaW5wdXRfY2xvY2tfc291cmNlKGljZSwgaXNfc3BkaWZfbWFzdGVyKGljZSkpOwogCiAJcmV0dXJuIGNoYW5nZTsKIH0KQEAgLTE4OTcsNyArMTkwMCw3IEBACiAJCSI2NDAwMCIsCS8qIDEwOiAxNSAqLwogCQkiODgyMDAiLAkvKiAxMTogMTEgKi8KIAkJIjk2MDAwIiwJLyogMTI6IDcgKi8KLQkJLy8gIklFQzk1OCBJbnB1dCIsCS8qIDEzOiAtLSAqLworCQkvKiAiSUVDOTU4IElucHV0IiwJMTM6IC0tICovCiAJfTsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwpAQCAtMjAyNiw3ICsyMDI5LDcgQEAKIAkJIklFQzk1OCBJbiBMIiwgIklFQzk1OCBJbiBSIiwgLyogOS0xMCAqLwogCQkiRGlnaXRhbCBNaXhlciIsIC8qIDExIC0gb3B0aW9uYWwgKi8KIAl9OwotCQorCiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CiAJdWluZm8tPmNvdW50ID0gMTsKIAl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9CkBAIC0yMDcwLDcgKzIwNzMsNyBAQAogCWludCBjaGFuZ2UsIHNoaWZ0OwogCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKIAl1bnNpZ25lZCBpbnQgdmFsLCBvbGRfdmFsLCBudmFsOwotCQorCiAJLyogdXBkYXRlIFBTRE9VVCAqLwogCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID49IDExKQogCQludmFsID0gaWR4IDwgMiA/IDEgOiAwOyAvKiBkaWcgbWl4ZXIgKG9yIHBjbSkgKi8KQEAgLTIxNDAsNyArMjE0Myw3IEBACiAJaW50IGNoYW5nZSwgc2hpZnQ7CiAJaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCXVuc2lnbmVkIGludCB2YWwsIG9sZF92YWwsIG52YWw7Ci0JCisKIAkvKiB1cGRhdGUgU1BET1VUICovCiAJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CiAJdmFsID0gb2xkX3ZhbCA9IGludyhJQ0VNVChpY2UsIFJPVVRFX1NQRE9VVCkpOwpAQCAtMjE4Miw3ICsyMTg1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19zcGRpZl9yb3V0ZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCisJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBOT05FKSAiUm91dGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCiAJLmdldCA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9zcGRpZl9nZXQsCiAJLnB1dCA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9zcGRpZl9wdXQsCkBAIC0yMjA0LDcgKzIyMDcsNyBAQAogCQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQkKKwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaW5iKElDRU1UKGljZSwgTU9OSVRPUl9SQVRFKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjQ1LDcgKzIyNDgsNyBAQAogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCBpZHg7Ci0JCisKIAlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IDIyOyBpZHgrKykgewogCQlvdXRiKGlkeCwgSUNFTVQoaWNlLCBNT05JVE9SX1BFQUtJTkRFWCkpOwpAQCAtMjI5NiwxMiArMjI5OSwxMiBAQAogCXVuc2lnbmVkIGludCBpLCBzaXplOwogCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKiBjb25zdCAqdGJsLCAqYzsKIAotCWlmICghIG1vZGVsbmFtZSB8fCAhICptb2RlbG5hbWUpIHsKKwlpZiAoIW1vZGVsbmFtZSB8fCAhKm1vZGVsbmFtZSkgewogCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOwogCQlpZiAoKGluYihJQ0VSRUcoaWNlLCBJMkNfQ1RSTCkpICYgSUNFMTcxMl9JMkNfRUVQUk9NKSAhPSAwKQogCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAwKSA8PCAwKSB8Ci0JCQkJKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAxKSA8PCA4KSB8IAotCQkJCShzbmRfaWNlMTcxMl9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMikgPDwgMTYpIHwgCisJCQkJKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAxKSA8PCA4KSB8CisJCQkJKHNuZF9pY2UxNzEyX3JlYWRfaTJjKGljZSwgZGV2LCAweDAyKSA8PCAxNikgfAogCQkJCShzbmRfaWNlMTcxMl9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMykgPDwgMjQpOwogCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwKIAkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7CkBAIC0yMzE4LDEyICsyMzIxLDEyIEBACiAJfQogCWZvciAodGJsID0gY2FyZF90YWJsZXM7ICp0Ymw7IHRibCsrKSB7CiAJCWZvciAoYyA9ICp0Ymw7IGMtPnN1YnZlbmRvcjsgYysrKSB7Ci0JCQlpZiAobW9kZWxuYW1lICYmIGMtPm1vZGVsICYmICEgc3RyY21wKG1vZGVsbmFtZSwgYy0+bW9kZWwpKSB7CisJCQlpZiAobW9kZWxuYW1lICYmIGMtPm1vZGVsICYmICFzdHJjbXAobW9kZWxuYW1lLCBjLT5tb2RlbCkpIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJpY2UxNzEyOiBVc2luZyBib2FyZCBtb2RlbCAlc1xuIiwgYy0+bmFtZSk7CiAJCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gYy0+c3VidmVuZG9yOwogCQkJfSBlbHNlIGlmIChjLT5zdWJ2ZW5kb3IgIT0gaWNlLT5lZXByb20uc3VidmVuZG9yKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKCEgYy0+ZWVwcm9tX3NpemUgfHwgISBjLT5lZXByb21fZGF0YSkKKwkJCWlmICghYy0+ZWVwcm9tX3NpemUgfHwgIWMtPmVlcHJvbV9kYXRhKQogCQkJCWdvdG8gZm91bmQ7CiAJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLwogCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKQEAgLTI0MTYsNyArMjQxOSw4IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwogCi0Jc25kX2Fzc2VydChpY2UtPnBjbV9wcm8gIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKCFpY2UtPnBjbV9wcm8pKQorCQlyZXR1cm4gLUVJTzsKIAllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9pY2UxNzEyX3NwZGlmX2RlZmF1bHQsIGljZSkpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMjQ4MywxMyArMjQ4NywxMyBAQAogCiBzdGF0aWMgaW50IHNuZF9pY2UxNzEyX2ZyZWUoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7Ci0JaWYgKCEgaWNlLT5wb3J0KQorCWlmICghaWNlLT5wb3J0KQogCQlnb3RvIF9faHdfZW5kOwogCS8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KIAlvdXRiKDB4YzAsIElDRU1UKGljZSwgSVJRKSk7CiAJb3V0YigweGZmLCBJQ0VSRUcoaWNlLCBJUlFNQVNLKSk7CiAJLyogLS0tICovCi0gICAgICBfX2h3X2VuZDoKK19faHdfZW5kOgogCWlmIChpY2UtPmlycSA+PSAwKQogCQlmcmVlX2lycShpY2UtPmlycSwgaWNlKTsKIApAQCAtMjUxNCw3ICsyNTE4LDcgQEAKIAkJCQkJaW50IG9tbmksCiAJCQkJCWludCBjczg0MjdfdGltZW91dCwKIAkJCQkJaW50IGR4cl9lbmFibGUsCi0JCQkJCXN0cnVjdCBzbmRfaWNlMTcxMiAqKiByX2ljZTE3MTIpCisJCQkJCXN0cnVjdCBzbmRfaWNlMTcxMiAqKnJfaWNlMTcxMikKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZTsKIAlpbnQgZXJyOwpAQCAtMjUyNCw4ICsyNTI4LDkgQEAKIAogCSpyX2ljZTE3MTIgPSBOVUxMOwogCi0gICAgICAgIC8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCi0JaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMjggYml0cyAqLwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BXzI4QklUX01BU0spIDwgMCB8fApAQCAtMjU2OSw3ICsyNTc0LDggQEAKIAlzbmRfaWNlMTcxMl9wcm9jX2luaXQoaWNlKTsKIAlzeW5jaHJvbml6ZV9pcnEocGNpLT5pcnEpOwogCi0JaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIklDRTE3MTIiKSkgPCAwKSB7CisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksICJJQ0UxNzEyIik7CisJaWYgKGVyciA8IDApIHsKIAkJa2ZyZWUoaWNlKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiBlcnI7CkBAIC0yNTg1LDcgKzI1OTEsNyBAQAogCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7CiAJCXJldHVybiAtRUlPOwogCX0KLQkKKwogCWljZS0+aXJxID0gcGNpLT5pcnE7CiAKIAlpZiAoc25kX2ljZTE3MTJfcmVhZF9lZXByb20oaWNlLCBtb2RlbG5hbWUpIDwgMCkgewpAQCAtMjYwNSw5ICsyNjExLDEwIEBACiAJICAgICBJQ0VSRUcoaWNlLCBJUlFNQVNLKSk7CiAJb3V0YigweDAwLCBJQ0VNVChpY2UsIElSUSkpOwogCi0JaWYgKChlcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcykpIDwgMCkgeworCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgaWNlLCAmb3BzKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfaWNlMTcxMl9mcmVlKGljZSk7Ci0gCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCX0KIAogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKQEAgLTI2NDcsMTAgKzI2NTQsMTAgQEAKIAogCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0UxNzEyIik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIklDRW5zZW1ibGUgSUNFMTcxMiIpOwotCQotCWlmICgoZXJyID0gc25kX2ljZTE3MTJfY3JlYXRlKGNhcmQsIHBjaSwgbW9kZWxbZGV2XSwgb21uaVtkZXZdLAotCQkJCSAgICAgIGNzODQyN190aW1lb3V0W2Rldl0sIGR4cl9lbmFibGVbZGV2XSwKLQkJCQkgICAgICAmaWNlKSkgPCAwKSB7CisKKwllcnIgPSBzbmRfaWNlMTcxMl9jcmVhdGUoY2FyZCwgcGNpLCBtb2RlbFtkZXZdLCBvbW5pW2Rldl0sCisJCWNzODQyN190aW1lb3V0W2Rldl0sIGR4cl9lbmFibGVbZGV2XSwgJmljZSk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNjYyLDcgKzI2NjksOCBAQAogCQkJCWlmIChjLT5kcml2ZXIpIC8qIHNwZWNpZmljIGRyaXZlcj8gKi8KIAkJCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgYy0+ZHJpdmVyKTsKIAkJCQlpZiAoYy0+Y2hpcF9pbml0KSB7Ci0JCQkJCWlmICgoZXJyID0gYy0+Y2hpcF9pbml0KGljZSkpIDwgMCkgeworCQkJCQllcnIgPSBjLT5jaGlwX2luaXQoaWNlKTsKKwkJCQkJaWYgKGVyciA8IDApIHsKIAkJCQkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQkJCQlyZXR1cm4gZXJyOwogCQkJCQl9CkBAIC0yNjc0LDQ3ICsyNjgyLDUyIEBACiAJYyA9ICZub19tYXRjaGVkOwogIF9fZm91bmQ6CiAKLQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX3BjbV9wcm9maShpY2UsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCWVyciA9IHNuZF9pY2UxNzEyX3BjbV9wcm9maShpY2UsIHBjbV9kZXYrKywgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JCisKIAlpZiAoaWNlX2hhc19jb25fYWM5NyhpY2UpKQotCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX3BjbShpY2UsIHBjbV9kZXYrKywgTlVMTCkpIDwgMCkgeworCQllcnIgPSBzbmRfaWNlMTcxMl9wY20oaWNlLCBwY21fZGV2KyssIE5VTEwpOworCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAotCWlmICgoZXJyID0gc25kX2ljZTE3MTJfYWM5N19taXhlcihpY2UpKSA8IDApIHsKKwllcnIgPSBzbmRfaWNlMTcxMl9hYzk3X21peGVyKGljZSk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2J1aWxkX2NvbnRyb2xzKGljZSkpIDwgMCkgeworCWVyciA9IHNuZF9pY2UxNzEyX2J1aWxkX2NvbnRyb2xzKGljZSk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoYy0+YnVpbGRfY29udHJvbHMpIHsKLQkJaWYgKChlcnIgPSBjLT5idWlsZF9jb250cm9scyhpY2UpKSA8IDApIHsKKwkJZXJyID0gYy0+YnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJaWYgKGljZV9oYXNfY29uX2FjOTcoaWNlKSkKLQkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9wY21fZHMoaWNlLCBwY21fZGV2KyssIE5VTEwpKSA8IDApIHsKKwkJZXJyID0gc25kX2ljZTE3MTJfcGNtX2RzKGljZSwgcGNtX2RldisrLCBOVUxMKTsKKwkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQlpZiAoISBjLT5ub19tcHU0MDEpIHsKLQkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19JQ0UxNzEyLAotCQkJCQkgICAgICAgSUNFUkVHKGljZSwgTVBVMV9DVFJMKSwKLQkJCQkJICAgICAgIChjLT5tcHU0MDFfMV9pbmZvX2ZsYWdzIHwKLQkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQpLAotCQkJCQkgICAgICAgaWNlLT5pcnEsIDAsCi0JCQkJCSAgICAgICAmaWNlLT5ybWlkaVswXSkpIDwgMCkgeworCWlmICghYy0+bm9fbXB1NDAxKSB7CisJCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0lDRTE3MTIsCisJCQlJQ0VSRUcoaWNlLCBNUFUxX0NUUkwpLAorCQkJKGMtPm1wdTQwMV8xX2luZm9fZmxhZ3MgfCBNUFU0MDFfSU5GT19JTlRFR1JBVEVEKSwKKwkJCWljZS0+aXJxLCAwLCAmaWNlLT5ybWlkaVswXSk7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjcyNiwxMiArMjczOSwxMiBAQAogCiAJCWlmIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSB7CiAJCQkvKiAgMm5kIHBvcnQgdXNlZCAgKi8KLQkJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKLQkJCQkJCSAgICAgICBJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLAotCQkJCQkJICAgICAgIChjLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwKLQkJCQkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEKSwKLQkJCQkJCSAgICAgICBpY2UtPmlycSwgMCwKLQkJCQkJCSAgICAgICAmaWNlLT5ybWlkaVsxXSkpIDwgMCkgeworCQkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKKwkJCQlJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLAorCQkJCShjLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCksCisJCQkJaWNlLT5pcnEsIDAsICZpY2UtPnJtaWRpWzFdKTsKKworCQkJaWYgKGVyciA8IDApIHsKIAkJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CkBAIC0yNzQ5LDcgKzI3NjIsOCBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVpIiwKIAkJY2FyZC0+c2hvcnRuYW1lLCBpY2UtPnBvcnQsIGljZS0+aXJxKTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oCmluZGV4IDc2MmZiZDcuLmZkYWU2ZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKQEAgLTIwLDcgKzIwLDcgQEAKICAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKgotICovICAgICAgCisgKi8KIAogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CkBAIC0xMTIsNyArMTEyLDcgQEAKICAqLwogCiAjZGVmaW5lIElDRURTKGljZSwgeCkgKChpY2UpLT5kbWFwYXRoX3BvcnQgKyBJQ0UxNzEyX0RTXyMjeCkKLSAKKwogI2RlZmluZSBJQ0UxNzEyX0RTX0lOVE1BU0sJCTB4MDAJLyogd29yZCAtIGludGVycnVwdCBtYXNrICovCiAjZGVmaW5lIElDRTE3MTJfRFNfSU5UU1RBVAkJMHgwMgkvKiB3b3JkIC0gaW50ZXJydXB0IHN0YXR1cyAqLwogI2RlZmluZSBJQ0UxNzEyX0RTX0RBVEEJCQkweDA0CS8qIGR3b3JkIC0gY2hhbm5lbCBkYXRhICovCkBAIC0xMjEsNyArMTIxLDcgQEAKIC8qCiAgKiAgQ29uc3VtZXIgc2VjdGlvbiBjaGFubmVsIHJlZ2lzdGVycwogICovCi0gCisKICNkZWZpbmUgSUNFMTcxMl9EU0NfQUREUjAJCTB4MDAJLyogZHdvcmQgLSBiYXNlIGFkZHJlc3MgMCAqLwogI2RlZmluZSBJQ0UxNzEyX0RTQ19DT1VOVDAJCTB4MDEJLyogd29yZCAtIGNvdW50IDAgKi8KICNkZWZpbmUgSUNFMTcxMl9EU0NfQUREUjEJCTB4MDIJLyogZHdvcmQgLSBiYXNlIGFkZHJlc3MgMSAqLwpAQCAtMTM4LDcgKzEzOCw3IEBACiAjZGVmaW5lIElDRTE3MTJfRFNDX1JBVEUJCTB4MDUJLyogZHdvcmQgLSByYXRlICovCiAjZGVmaW5lIElDRTE3MTJfRFNDX1ZPTFVNRQkJMHgwNgkvKiB3b3JkIC0gdm9sdW1lIGNvbnRyb2wgKi8KIAotLyogCisvKgogICogIFByb2Zlc3Npb25hbCBtdWx0aS10cmFjayBkaXJlY3QgY29udHJvbCByZWdpc3RlcnMKICAqLwogCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogCiAvKgotICogIAorICoKICAqLwogCiBzdHJ1Y3Qgc25kX2ljZTE3MTI7CkBAIC0yNTMsMTIgKzI1MywxMiBAQAogCUlDRV9FRVAxX0FEQ19JRDIsCiAJSUNFX0VFUDFfQURDX0lEMwogfTsKLQkKKwogI2RlZmluZSBpY2VfaGFzX2Nvbl9hYzk3KGljZSkJKCEoKGljZSktPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHX05PX0NPTl9BQzk3KSkKIAogCiBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIHsKLQl1bnNpZ25lZCBpbnQgY2lmOiAxOwkJLyogQ0lGIG1vZGUgKi8KKwl1bnNpZ25lZCBpbnQgY2lmOjE7CQkvKiBDSUYgbW9kZSAqLwogCXVuc2lnbmVkIGNoYXIgY2FkZHI7CQkvKiBDMCBhbmQgQzEgYml0cyAqLwogCXVuc2lnbmVkIGludCBkYXRhX21hc2s7CQkvKiBEQVRBIGdwaW8gYml0ICovCiAJdW5zaWduZWQgaW50IGNsa19tYXNrOwkJLyogQ0xLIGdwaW8gYml0ICovCkBAIC0zMDYsMTEgKzMwNiwxMSBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJc3RydWN0IHNuZF9wY20gKnBjbV9kczsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtX3BybzsKLSAgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwbGF5YmFja19jb25fc3Vic3RyZWFtOwotICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbNl07Ci0gICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9jb25fc3Vic3RyZWFtOwotICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX3Byb19zdWJzdHJlYW07Ci0gICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9wcm9fc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGxheWJhY2tfY29uX3N1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX2Nvbl9zdWJzdHJlYW1fZHNbNl07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX2Nvbl9zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwbGF5YmFja19wcm9fc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9wcm9fc3Vic3RyZWFtOwogCXVuc2lnbmVkIGludCBwbGF5YmFja19wcm9fc2l6ZTsKIAl1bnNpZ25lZCBpbnQgY2FwdHVyZV9wcm9fc2l6ZTsKIAl1bnNpZ25lZCBpbnQgcGxheWJhY2tfY29uX3ZpcnRfYWRkcls2XTsKQEAgLTMyNiwxNSArMzI2LDE1IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyX2VlcHJvbSBlZXByb207CiAKIAl1bnNpZ25lZCBpbnQgcHJvX3ZvbHVtZXNbMjBdOwotCXVuc2lnbmVkIGludCBvbW5pOiAxOwkJLyogRGVsdGEgT21uaSBJL08gKi8KLQl1bnNpZ25lZCBpbnQgZHhyX2VuYWJsZTogMTsJLyogVGVycmF0ZWMgRFhSIGVuYWJsZSBmb3IgRE1YNkZJUkUgKi8KLQl1bnNpZ25lZCBpbnQgdnQxNzI0OiAxOwotCXVuc2lnbmVkIGludCB2dDE3MjA6IDE7Ci0JdW5zaWduZWQgaW50IGhhc19zcGRpZjogMTsJLyogVlQxNzIwLzQgLSBoYXMgU1BESUYgSS9PICovCi0JdW5zaWduZWQgaW50IGZvcmNlX3BkbWE0OiAxOwkvKiBWVDE3MjAvNCAtIFBETUE0IGFzIG5vbi1zcGRpZiAqLwotCXVuc2lnbmVkIGludCBmb3JjZV9yZG1hMTogMTsJLyogVlQxNzIwLzQgLSBSRE1BMSBhcyBub24tc3BkaWYgKi8KLQl1bnNpZ25lZCBpbnQgbWlkaV9vdXRwdXQ6IDE7CS8qIFZUMTcyMC80OiBNSURJIG91dHB1dCB0cmlnZ2VyZWQgKi8KLQl1bnNpZ25lZCBpbnQgbWlkaV9pbnB1dDogMTsJLyogVlQxNzIwLzQ6IE1JREkgaW5wdXQgdHJpZ2dlcmVkICovCisJdW5zaWduZWQgaW50IG9tbmk6MTsJCS8qIERlbHRhIE9tbmkgSS9PICovCisJdW5zaWduZWQgaW50IGR4cl9lbmFibGU6MTsJLyogVGVycmF0ZWMgRFhSIGVuYWJsZSBmb3IgRE1YNkZJUkUgKi8KKwl1bnNpZ25lZCBpbnQgdnQxNzI0OjE7CisJdW5zaWduZWQgaW50IHZ0MTcyMDoxOworCXVuc2lnbmVkIGludCBoYXNfc3BkaWY6MTsJLyogVlQxNzIwLzQgLSBoYXMgU1BESUYgSS9PICovCisJdW5zaWduZWQgaW50IGZvcmNlX3BkbWE0OjE7CS8qIFZUMTcyMC80IC0gUERNQTQgYXMgbm9uLXNwZGlmICovCisJdW5zaWduZWQgaW50IGZvcmNlX3JkbWExOjE7CS8qIFZUMTcyMC80IC0gUkRNQTEgYXMgbm9uLXNwZGlmICovCisJdW5zaWduZWQgaW50IG1pZGlfb3V0cHV0OjE7CS8qIFZUMTcyMC80OiBNSURJIG91dHB1dCB0cmlnZ2VyZWQgKi8KKwl1bnNpZ25lZCBpbnQgbWlkaV9pbnB1dDoxOwkvKiBWVDE3MjAvNDogTUlESSBpbnB1dCB0cmlnZ2VyZWQgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX3RvdGFsX2RhY3M7CS8qIHRvdGFsIERBQ3MgKi8KIAl1bnNpZ25lZCBpbnQgbnVtX3RvdGFsX2FkY3M7CS8qIHRvdGFsIEFEQ3MgKi8KIAl1bnNpZ25lZCBpbnQgY3VyX3JhdGU7CQkvKiBjdXJyZW50IHJhdGUgKi8KQEAgLTM1MSw3ICszNTEsNyBAQAogCXN0cnVjdCBzbmRfaTJjX2J1cyAqaTJjOwkJLyogSTJDIGJ1cyAqLwogCXN0cnVjdCBzbmRfaTJjX2RldmljZSAqY3M4NDI3OwkvKiBDUzg0MjcgSTJDIGRldmljZSAqLwogCXVuc2lnbmVkIGludCBjczg0MjdfdGltZW91dDsJLyogQ1M4NDI3IHJlc2V0IHRpbWVvdXQgaW4gSFovMTAwICovCi0JCisKIAlzdHJ1Y3QgaWNlMTcxMl9ncGlvIHsKIAkJdW5zaWduZWQgaW50IGRpcmVjdGlvbjsJCS8qIGN1cnJlbnQgZGlyZWN0aW9uIGJpdHMgKi8KIAkJdW5zaWduZWQgaW50IHdyaXRlX21hc2s7CS8qIGN1cnJlbnQgbWFzayBiaXRzICovCkBAIC00NTUsNyArNDU1LDcgQEAKIHsKIAlpY2UtPmdwaW8uZGlyZWN0aW9uICY9IH5tYXNrOwogCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIGljZS0+Z3Bpby5kaXJlY3Rpb24pOwotCXJldHVybiAgKHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpICYgbWFzayk7CisJcmV0dXJuICBzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIG1hc2s7CiB9CiAKIGludCBzbmRfaWNlMTcxMl9zcGRpZl9idWlsZF9jb250cm9scyhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSk7CkBAIC00NjcsMTMgKzQ2NywxMyBAQAogCiBpbnQgc25kX2ljZTE3MTJfaW5pdF9jczg0Mjcoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCBhZGRyKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHNuZF9pY2UxNzEyX3dyaXRlKHN0cnVjdCBzbmRfaWNlMTcxMiAqIGljZSwgdTggYWRkciwgdTggZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaWNlMTcxMl93cml0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdTggYWRkciwgdTggZGF0YSkKIHsKIAlvdXRiKGFkZHIsIElDRVJFRyhpY2UsIElOREVYKSk7CiAJb3V0YihkYXRhLCBJQ0VSRUcoaWNlLCBEQVRBKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggc25kX2ljZTE3MTJfcmVhZChzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UsIHU4IGFkZHIpCitzdGF0aWMgaW5saW5lIHU4IHNuZF9pY2UxNzEyX3JlYWQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHU4IGFkZHIpCiB7CiAJb3V0YihhZGRyLCBJQ0VSRUcoaWNlLCBJTkRFWCkpOwogCXJldHVybiBpbmIoSUNFUkVHKGljZSwgREFUQSkpOwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJY2hhciAqZHJpdmVyOwogCWludCAoKmNoaXBfaW5pdCkoc3RydWN0IHNuZF9pY2UxNzEyICopOwogCWludCAoKmJ1aWxkX2NvbnRyb2xzKShzdHJ1Y3Qgc25kX2ljZTE3MTIgKik7Ci0JdW5zaWduZWQgaW50IG5vX21wdTQwMTogMTsKKwl1bnNpZ25lZCBpbnQgbm9fbXB1NDAxOjE7CiAJdW5zaWduZWQgaW50IG1wdTQwMV8xX2luZm9fZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1wdTQwMV8yX2luZm9fZmxhZ3M7CiAJY29uc3QgY2hhciAqbXB1NDAxXzFfbmFtZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwppbmRleCBlNTk2ZDc3Li4xYjNmMTE3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCkBAIC0yMCw5ICsyMCw5IEBACiAgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICoKLSAqLyAgICAgIAorICovCiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTA1LDcgKzEwNSw3IEBACiAvKgogICogIEJhc2ljIEkvTwogICovCi0gCisKIC8qCiAgKiAgZGVmYXVsdCByYXRlcywgZGVmYXVsdCBjbG9jayByb3V0aW5lcwogICovCkBAIC0xOTgsNyArMTk4LDcgQEAKIHN0YXRpYyB2b2lkIHNuZF92dDE3MjRfc2V0X2dwaW9fbWFzayhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdW5zaWduZWQgaW50IGRhdGEpCiB7CiAJb3V0dyhkYXRhLCBJQ0VSRUcxNzI0KGljZSwgR1BJT19XUklURV9NQVNLKSk7Ci0JaWYgKCEgaWNlLT52dDE3MjApIC8qIFZUMTcyMCBzdXBwb3J0cyBvbmx5IDE2IEdQSU8gYml0cyAqLworCWlmICghaWNlLT52dDE3MjApIC8qIFZUMTcyMCBzdXBwb3J0cyBvbmx5IDE2IEdQSU8gYml0cyAqLwogCQlvdXRiKChkYXRhID4+IDE2KSAmIDB4ZmYsIElDRVJFRzE3MjQoaWNlLCBHUElPX1dSSVRFX01BU0tfMjIpKTsKIAlpbncoSUNFUkVHMTcyNChpY2UsIEdQSU9fV1JJVEVfTUFTSykpOyAvKiBkdW1teSByZWFkIGZvciBwY2ktcG9zdGluZyAqLwogfQpAQCAtMjA2LDcgKzIwNiw3IEBACiBzdGF0aWMgdm9pZCBzbmRfdnQxNzI0X3NldF9ncGlvX2RhdGEoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCBkYXRhKQogewogCW91dHcoZGF0YSwgSUNFUkVHMTcyNChpY2UsIEdQSU9fREFUQSkpOwotCWlmICghIGljZS0+dnQxNzIwKQorCWlmICghaWNlLT52dDE3MjApCiAJCW91dGIoZGF0YSA+PiAxNiwgSUNFUkVHMTcyNChpY2UsIEdQSU9fREFUQV8yMikpOwogCWludyhJQ0VSRUcxNzI0KGljZSwgR1BJT19EQVRBKSk7IC8qIGR1bW15IHJlYWQgZm9yIHBjaS1wb3N0aW5nICovCiB9CkBAIC0yMTQsNyArMjE0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3Z0MTcyNF9nZXRfZ3Bpb19kYXRhKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXVuc2lnbmVkIGludCBkYXRhOwotCWlmICghIGljZS0+dnQxNzIwKQorCWlmICghaWNlLT52dDE3MjApCiAJCWRhdGEgPSAodW5zaWduZWQgaW50KWluYihJQ0VSRUcxNzI0KGljZSwgR1BJT19EQVRBXzIyKSk7CiAJZWxzZQogCQlkYXRhID0gMDsKQEAgLTM5OSw3ICszOTksNyBAQAogCQkJYnJlYWs7CiAJCX0KICNlbmRpZgotCQloYW5kbGVkID0gMTsJCQorCQloYW5kbGVkID0gMTsKIAkJaWYgKHN0YXR1cyAmIFZUMTcyNF9JUlFfTVBVX1RYKSB7CiAJCQlzcGluX2xvY2soJmljZS0+cmVnX2xvY2spOwogCQkJaWYgKGljZS0+bWlkaV9vdXRwdXQpCkBAIC00NjgsOCArNDY4LDggQEAKIAkJCS8qIG91Z2h0IHRvIHJlYWxseSBoYW5kbGUgdGhpcyBwcm9wZXJseSAqLwogCQkJaWYgKG10c3RhdCAmIFZUMTcyNF9NVUxUSV9GSUZPX0VSUikgewogCQkJCXVuc2lnbmVkIGNoYXIgZnN0YXQgPSBpbmIoSUNFTVQxNzI0KGljZSwgRE1BX0ZJRk9fRVJSKSk7Ci0JCQkJb3V0Yihmc3RhdCwgSUNFTVQxNzI0KGljZSwgRE1BX0ZJRk9fRVJSKSk7CQotCQkJCW91dGIoVlQxNzI0X01VTFRJX0ZJRk9fRVJSIHwgaW5iKElDRU1UMTcyNChpY2UsIERNQV9JTlRfTUFTSykpLCBJQ0VNVDE3MjQoaWNlLCBETUFfSU5UX01BU0spKTsJCisJCQkJb3V0Yihmc3RhdCwgSUNFTVQxNzI0KGljZSwgRE1BX0ZJRk9fRVJSKSk7CisJCQkJb3V0YihWVDE3MjRfTVVMVElfRklGT19FUlIgfCBpbmIoSUNFTVQxNzI0KGljZSwgRE1BX0lOVF9NQVNLKSksIElDRU1UMTcyNChpY2UsIERNQV9JTlRfTUFTSykpOwogCQkJCS8qIElmIEkgZG9uJ3QgZG8gdGhpcywgSSBnZXQgbWFjaGluZSBsb2NrdXAgZHVlIHRvIGNvbnRpbnVhbCBpbnRlcnJ1cHRzICovCiAJCQl9CiAKQEAgLTczMywxNyArNzMzLDE3IEBACiAJb3V0bChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLCBJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19BRERSKSk7CiAKIAlzaXplID0gKHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pID4+IDIpIC0gMTsKLQkvLyBvdXRsKHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpKTsKKwkvKiBvdXRsKHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpKTsgKi8KIAlvdXR3KHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpKTsKIAlvdXRiKHNpemUgPj4gMTYsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX1NJWkUpICsgMik7CiAJc2l6ZSA9IChzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDE7Ci0JLy8gb3V0bChzaXplLCBJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19DT1VOVCkpOworCS8qIG91dGwoc2l6ZSwgSUNFTVQxNzI0KGljZSwgUExBWUJBQ0tfQ09VTlQpKTsgKi8KIAlvdXR3KHNpemUsIElDRU1UMTcyNChpY2UsIFBMQVlCQUNLX0NPVU5UKSk7CiAJb3V0YihzaXplID4+IDE2LCBJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19DT1VOVCkgKyAyKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CiAKLQkvLyBwcmludGsoInBybyBwcmVwYXJlOiBjaCA9ICVkLCBhZGRyID0gMHgleCwgYnVmZmVyID0gMHgleCwgcGVyaW9kID0gMHgleFxuIiwgc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscywgKHVuc2lnbmVkIGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLCBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSwgc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSkpOworCS8qIHByaW50aygicHJvIHByZXBhcmU6IGNoID0gJWQsIGFkZHIgPSAweCV4LCBidWZmZXIgPSAweCV4LCBwZXJpb2QgPSAweCV4XG4iLCBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzLCAodW5zaWduZWQgaW50KXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIsIHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pLCBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSk7ICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc3MSw3ICs3NzEsNyBAQAogCXB0ciA9IGlubChJQ0VNVDE3MjQoaWNlLCBQTEFZQkFDS19TSVpFKSkgJiAweGZmZmZmZjsKIAlwdHIgPSAocHRyICsgMSkgPDwgMjsKIAlwdHIgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwdHIpOwotCWlmICghIHB0cikKKwlpZiAoIXB0cikKIAkJOwogCWVsc2UgaWYgKHB0ciA8PSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQlwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gcHRyOwpAQCAtODE1LDcgKzgxNSw3IEBACiAJcHRyID0gaW53KGljZS0+cHJvZmlfcG9ydCArIHJlZy0+c2l6ZSk7CiAJcHRyID0gKHB0ciArIDEpIDw8IDI7CiAJcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKLQlpZiAoISBwdHIpCisJaWYgKCFwdHIpCiAJCTsKIAllbHNlIGlmIChwdHIgPD0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJcHRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSAtIHB0cjsKQEAgLTg0Miw4ICs4NDIsNyBAQAogCS5zdGFydCA9IFZUMTcyNF9SRE1BMF9TVEFSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdnQxNzI0X3BsYXliYWNrX3BybyA9Ci17CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9wbGF5YmFja19wcm8gPSB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfApAQCAtODYxLDggKzg2MCw3IEBACiAJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9zcGRpZiA9Ci17CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9zcGRpZiA9IHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC04ODMsOCArODgxLDcgQEAKIAkucGVyaW9kc19tYXggPQkJMTAyNCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdnQxNzI0XzJjaF9zdGVyZW8gPQoteworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF92dDE3MjRfMmNoX3N0ZXJlbyA9IHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC05NDIsNyArOTM5LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCWludCBjaHM7CisJaW50IGNocywgbnVtX2luZGVwczsKIAogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopJnZ0MTcyNF9wbGF5YmFja19wcm9fcmVnOwogCWljZS0+cGxheWJhY2tfcHJvX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKQEAgLTk1Miw3ICs5NDksOCBAQAogCXNldF9yYXRlX2NvbnN0cmFpbnRzKGljZSwgc3Vic3RyZWFtKTsKIAltdXRleF9sb2NrKCZpY2UtPm9wZW5fbXV0ZXgpOwogCS8qIGNhbGN1bGF0ZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBjaGFubmVscyAqLwotCWZvciAoY2hzID0gMDsgY2hzIDwgMzsgY2hzKyspIHsKKwludW1faW5kZXBzID0gaWNlLT5udW1fdG90YWxfZGFjcyAvIDIgLSAxOworCWZvciAoY2hzID0gMDsgY2hzIDwgbnVtX2luZGVwczsgY2hzKyspIHsKIAkJaWYgKGljZS0+cGNtX3Jlc2VydmVkW2Noc10pCiAJCQlicmVhazsKIAl9CkBAIC0xMDI5LDcgKzEwMjcsNyBAQAogCS5wb2ludGVyID0Jc25kX3Z0MTcyNF9wY21fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX3Byb2ZpKHN0cnVjdCBzbmRfaWNlMTcxMiAqIGljZSwgaW50IGRldmljZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX3Byb2ZpKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgZGV2aWNlKQogewogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycjsKQEAgLTExMTQsNyArMTExMiw3IEBACiBzdGF0aWMgaW50IHNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlpZiAoISBpY2UtPmZvcmNlX3BkbWE0KQorCWlmICghaWNlLT5mb3JjZV9wZG1hNCkKIAkJdXBkYXRlX3NwZGlmX3JhdGUoaWNlLCBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUpOwogCXJldHVybiBzbmRfdnQxNzI0X3BjbV9wcmVwYXJlKHN1YnN0cmVhbSk7CiB9CkBAIC0xMjE0LDcgKzEyMTIsNyBAQAogfTsKIAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X3BjbV9zcGRpZihzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UsIGludCBkZXZpY2UpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X3BjbV9zcGRpZihzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IGRldmljZSkKIHsKIAljaGFyICpuYW1lOwogCXN0cnVjdCBzbmRfcGNtICpwY207CkBAIC0xMjMzLDcgKzEyMzEsNyBAQAogCQlpY2UtPmhhc19zcGRpZiA9IDE7CiAJfSBlbHNlCiAJCWNhcHQgPSAwOwotCWlmICghIHBsYXkgJiYgISBjYXB0KQorCWlmICghcGxheSAmJiAhY2FwdCkKIAkJcmV0dXJuIDA7IC8qIG5vIHNwZGlmIGRldmljZSAqLwogCiAJaWYgKGljZS0+Zm9yY2VfcGRtYTQgfHwgaWNlLT5mb3JjZV9yZG1hMSkKQEAgLTEzNDgsNyArMTM0Niw3IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX2luZGVwKHN0cnVjdCBzbmRfaWNlMTcxMiAqIGljZSwgaW50IGRldmljZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfcGNtX2luZGVwKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgZGV2aWNlKQogewogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IHBsYXk7CkBAIC0xMzgzLDExICsxMzgxLDExIEBACiAgKiAgTWl4ZXIgc2VjdGlvbgogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF92dDE3MjRfYWM5N19taXhlcihzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfdnQxNzI0X2FjOTdfbWl4ZXIoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7CiAJaW50IGVycjsKIAotCWlmICghIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX0FDTElOS10gJiBWVDE3MjRfQ0ZHX1BST19JMlMpKSB7CisJaWYgKCEoaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMl9BQ0xJTktdICYgVlQxNzI0X0NGR19QUk9fSTJTKSkgewogCQlzdHJ1Y3Qgc25kX2FjOTdfYnVzICpwYnVzOwogCQlzdHJ1Y3Qgc25kX2FjOTdfdGVtcGxhdGUgYWM5NzsKIAkJc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIG9wcyA9IHsKQEAgLTE0MDAsMTEgKzEzOTgsMTMgQEAKIAkJbWRlbGF5KDUpOyAvKiBGSVhNRSAqLwogCQlvdXRiKGluYihJQ0VNVDE3MjQoaWNlLCBBQzk3X0NNRCkpICYgfjB4ODAsIElDRU1UMTcyNChpY2UsIEFDOTdfQ01EKSk7CiAKLQkJaWYgKChlcnIgPSBzbmRfYWM5N19idXMoaWNlLT5jYXJkLCAwLCAmb3BzLCBOVUxMLCAmcGJ1cykpIDwgMCkKKwkJZXJyID0gc25kX2FjOTdfYnVzKGljZS0+Y2FyZCwgMCwgJm9wcywgTlVMTCwgJnBidXMpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCW1lbXNldCgmYWM5NywgMCwgc2l6ZW9mKGFjOTcpKTsKIAkJYWM5Ny5wcml2YXRlX2RhdGEgPSBpY2U7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZpY2UtPmFjOTcpKSA8IDApCisJCWVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmaWNlLT5hYzk3KTsKKwkJaWYgKGVyciA8IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY2UxNzEyOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm8gYWM5Nywgc2tpcHBlZFxuIik7CiAJCWVsc2UKIAkJCXJldHVybiAwOwpAQCAtMTQyNSw3ICsxNDI1LDcgQEAKIAkJKCh1bnNpZ25lZCBpbnQpaWNlLT5lZXByb20uZGF0YVtpZHggKyAyXSA8PCAxNik7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF92dDE3MjRfcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksIAorc3RhdGljIHZvaWQgc25kX3Z0MTcyNF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQkgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gZW50cnktPnByaXZhdGVfZGF0YTsKQEAgLTE0NjcsMTEgKzE0NjcsMTEgQEAKIAkJCSAgICBpZHgsIGluYihpY2UtPnByb2ZpX3BvcnQraWR4KSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfdnQxNzI0X3Byb2NfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKiBpY2UpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3Z0MTcyNF9wcm9jX2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAotCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGljZS0+Y2FyZCwgImljZTE3MjQiLCAmZW50cnkpKQorCWlmICghc25kX2NhcmRfcHJvY19uZXcoaWNlLT5jYXJkLCAiaWNlMTcyNCIsICZlbnRyeSkpCiAJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgaWNlLCBzbmRfdnQxNzI0X3Byb2NfcmVhZCk7CiB9CiAKQEAgLTE0OTEsNyArMTQ5MSw3IEBACiAJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCQorCiAJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAmaWNlLT5lZXByb20sIHNpemVvZihpY2UtPmVlcHJvbSkpOwogCXJldHVybiAwOwogfQpAQCAtMTYwNiwxMyArMTYwNiwxMyBAQAogCWlmICh2YWwgIT0gb2xkKQogCQl1cGRhdGVfc3BkaWZfYml0cyhpY2UsIHZhbCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKLQlyZXR1cm4gKHZhbCAhPSBvbGQpOworCXJldHVybiB2YWwgIT0gb2xkOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQogewogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBERUZBVUxUKSwKIAkuaW5mbyA9CQlzbmRfdnQxNzI0X3NwZGlmX2luZm8sCiAJLmdldCA9CQlzbmRfdnQxNzI0X3NwZGlmX2RlZmF1bHRfZ2V0LAogCS5wdXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9kZWZhdWx0X3B1dApAQCAtMTY0NSw3ICsxNjQ1LDcgQEAKIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAotCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssQ09OX01BU0spLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBDT05fTUFTSyksCiAJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrY19nZXQsCiB9OwpAQCAtMTY1NCw3ICsxNjU0LDcgQEAKIHsKIAkuYWNjZXNzID0JU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAotCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssUFJPX01BU0spLAorCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBQUk9fTUFTSyksCiAJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9pbmZvLAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrcF9nZXQsCiB9OwpAQCAtMTY5MSw4ICsxNjkxLDggQEAKIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkvKiBGSVhNRTogdGhlIGZvbGxvd2luZyBjb25mbGljdCB3aXRoIElFQzk1OCBQbGF5YmFjayBSb3V0ZSAqLwotCS8vIC5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssU1dJVENIKSwKLQkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJPdXRwdXQgIixOT05FLFNXSVRDSCksCisJLyogLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIFNXSVRDSCksICovCisJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiT3V0cHV0ICIsIE5PTkUsIFNXSVRDSCksCiAJLmluZm8gPQkJc25kX3Z0MTcyNF9zcGRpZl9zd19pbmZvLAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9zd19nZXQsCiAJLnB1dCA9CQlzbmRfdnQxNzI0X3NwZGlmX3N3X3B1dApAQCAtMTcxMiw3ICsxNzEyLDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgc2hpZnQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CiAJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmICgxPDwyNCkpID8gMSA6IDA7Ci0JCisKIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQogCQkoc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSkgJiAoMSA8PCBzaGlmdCkgPyAxIDogMCkgXiBpbnZlcnQ7CkBAIC0xNzY3LDcgKzE3NjcsNyBAQAogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGludCBpLCByYXRlOwotCQorCiAJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CiAJaWYgKGljZS0+aXNfc3BkaWZfbWFzdGVyKGljZSkpIHsKIAkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGljZS0+aHdfcmF0ZXMtPmNvdW50OwpAQCAtMTkyMyw3ICsxOTIzLDcgQEAKIAkJIkgvVyBJbiAwIiwgIkgvVyBJbiAxIiwgLyogMS0yICovCiAJCSJJRUM5NTggSW4gTCIsICJJRUM5NTggSW4gUiIsIC8qIDMtNCAqLwogCX07Ci0JCisKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwogCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNTsKQEAgLTE5NTMsNyArMTk1Myw3IEBACiAKIAl2YWwgPSBpbmwoSUNFTVQxNzI0KGljZSwgUk9VVEVfUExBWUJBQ0spKTsKIAl2YWwgPj49IHNoaWZ0OwotCXZhbCAmPSA3OwkvL3dlIG5vdyBoYXZlIDMgYml0cyBwZXIgb3V0cHV0CisJdmFsICY9IDc7IC8qIHdlIG5vdyBoYXZlIDMgYml0cyBwZXIgb3V0cHV0ICovCiAJZWl0ZW0gPSB4bGF0ZVt2YWxdOwogCWlmIChlaXRlbSA9PSAyNTUpIHsKIAkJc25kX0JVRygpOwpAQCAtMjAzMiw3ICsyMDMyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3NwZGlmX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlJvdXRlIiwKKwkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIE5PTkUpICJSb3V0ZSIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9pbmZvLAogCS5nZXQgPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9zcGRpZl9nZXQsCiAJLnB1dCA9IHNuZF92dDE3MjRfcHJvX3JvdXRlX3NwZGlmX3B1dCwKQEAgLTIwNTUsNyArMjA1NSw3IEBACiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IGlkeDsKLQkKKwogCXNwaW5fbG9ja19pcnEoJmljZS0+cmVnX2xvY2spOwogCWZvciAoaWR4ID0gMDsgaWR4IDwgMjI7IGlkeCsrKSB7CiAJCW91dGIoaWR4LCBJQ0VNVDE3MjQoaWNlLCBNT05JVE9SX1BFQUtJTkRFWCkpOwpAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKmNhcmRfdGFibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKIAlzbmRfdnQxNzI0X3Jldm9fY2FyZHMsCi0Jc25kX3Z0MTcyNF9hbXBfY2FyZHMsIAorCXNuZF92dDE3MjRfYW1wX2NhcmRzLAogCXNuZF92dDE3MjRfYXVyZW9uX2NhcmRzLAogCXNuZF92dDE3MjBfbW9ib19jYXJkcywKIAlzbmRfdnQxNzIwX3BvbnRpc19jYXJkcywKQEAgLTIxMjAsNyArMjEyMCw3IEBACiAJd2FpdF9pMmNfYnVzeShpY2UpOwogCXZhbCA9IGluYihJQ0VSRUcxNzI0KGljZSwgSTJDX0RBVEEpKTsKIAltdXRleF91bmxvY2soJmljZS0+aTJjX211dGV4KTsKLQkvL3ByaW50aygiaTJjX3JlYWQ6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCB2YWwpOworCS8qIHByaW50aygiaTJjX3JlYWQ6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCB2YWwpOyAqLwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTIxMjksNyArMjEyOSw3IEBACiB7CiAJbXV0ZXhfbG9jaygmaWNlLT5pMmNfbXV0ZXgpOwogCXdhaXRfaTJjX2J1c3koaWNlKTsKLQkvL3ByaW50aygiaTJjX3dyaXRlOiBbMHgleCwweCV4XSA9IDB4JXhcbiIsIGRldiwgYWRkciwgZGF0YSk7CisJLyogcHJpbnRrKCJpMmNfd3JpdGU6IFsweCV4LDB4JXhdID0gMHgleFxuIiwgZGV2LCBhZGRyLCBkYXRhKTsgKi8KIAlvdXRiKGFkZHIsIElDRVJFRzE3MjQoaWNlLCBJMkNfQllURV9BRERSKSk7CiAJb3V0YihkYXRhLCBJQ0VSRUcxNzI0KGljZSwgSTJDX0RBVEEpKTsKIAlvdXRiKGRldiB8IFZUMTcyNF9JMkNfV1JJVEUsIElDRVJFRzE3MjQoaWNlLCBJMkNfREVWX0FERFIpKTsKQEAgLTIxNDQsMTMgKzIxNDQsMTMgQEAKIAl1bnNpZ25lZCBpbnQgaSwgc2l6ZTsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICogY29uc3QgKnRibCwgKmM7CiAKLQlpZiAoISBtb2RlbG5hbWUgfHwgISAqbW9kZWxuYW1lKSB7CisJaWYgKCFtb2RlbG5hbWUgfHwgISptb2RlbG5hbWUpIHsKIAkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gMDsKIAkJaWYgKChpbmIoSUNFUkVHMTcyNChpY2UsIEkyQ19DVFJMKSkgJiBWVDE3MjRfSTJDX0VFUFJPTSkgIT0gMCkKIAkJCWljZS0+ZWVwcm9tLnN1YnZlbmRvciA9CiAJCQkJKHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDApIDw8IDApIHwKLQkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMSkgPDwgOCkgfCAKLQkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMikgPDwgMTYpIHwgCisJCQkJKHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBkZXYsIDB4MDEpIDw8IDgpIHwKKwkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMikgPDwgMTYpIHwKIAkJCQkoc25kX3Z0MTcyNF9yZWFkX2kyYyhpY2UsIGRldiwgMHgwMykgPDwgMjQpOwogCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IDAgfHwKIAkJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSAodW5zaWduZWQgaW50KS0xKSB7CkBAIC0yMTczLDEzICsyMTczLDEzIEBACiAJZm9yICh0YmwgPSBjYXJkX3RhYmxlczsgKnRibDsgdGJsKyspIHsKIAkJZm9yIChjID0gKnRibDsgYy0+c3VidmVuZG9yOyBjKyspIHsKIAkJCWlmIChtb2RlbG5hbWUgJiYgYy0+bW9kZWwgJiYKLQkJCSAgICAhIHN0cmNtcChtb2RlbG5hbWUsIGMtPm1vZGVsKSkgeworCQkJICAgICFzdHJjbXAobW9kZWxuYW1lLCBjLT5tb2RlbCkpIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJpY2UxNzI0OiBVc2luZyBib2FyZCBtb2RlbCAlc1xuIiwKIAkJCQkgICAgICAgYy0+bmFtZSk7CiAJCQkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gYy0+c3VidmVuZG9yOwogCQkJfSBlbHNlIGlmIChjLT5zdWJ2ZW5kb3IgIT0gaWNlLT5lZXByb20uc3VidmVuZG9yKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKCEgYy0+ZWVwcm9tX3NpemUgfHwgISBjLT5lZXByb21fZGF0YSkKKwkJCWlmICghYy0+ZWVwcm9tX3NpemUgfHwgIWMtPmVlcHJvbV9kYXRhKQogCQkJCWdvdG8gZm91bmQ7CiAJCQkvKiBpZiB0aGUgRUVQUk9NIGlzIGdpdmVuIGJ5IHRoZSBkcml2ZXIsIHVzZSBpdCAqLwogCQkJc25kX3ByaW50ZGQoInVzaW5nIHRoZSBkZWZpbmVkIGVlcHJvbS4uXG4iKTsKQEAgLTIyNTAsNyArMjI1MCw4IEBACiAJaW50IGVycjsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwogCi0Jc25kX2Fzc2VydChpY2UtPnBjbSAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWljZS0+cGNtKSkKKwkJcmV0dXJuIC1FSU87CiAKIAllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX3Z0MTcyNF9taXhlcl9wcm9fc3BkaWZfcm91dGUsIGljZSkpOwogCWlmIChlcnIgPCAwKQpAQCAtMjMyMCwxMyArMjMyMSwxMyBAQAogCiBzdGF0aWMgaW50IHNuZF92dDE3MjRfZnJlZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlpZiAoISBpY2UtPnBvcnQpCisJaWYgKCFpY2UtPnBvcnQpCiAJCWdvdG8gX19od19lbmQ7CiAJLyogbWFzayBhbGwgaW50ZXJydXB0cyAqLwogCW91dGIoMHhmZiwgSUNFTVQxNzI0KGljZSwgRE1BX0lOVF9NQVNLKSk7CiAJb3V0YigweGZmLCBJQ0VSRUcxNzI0KGljZSwgSVJRTUFTSykpOwogCS8qIC0tLSAqLwotICAgICAgX19od19lbmQ6CitfX2h3X2VuZDoKIAlpZiAoaWNlLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoaWNlLT5pcnEsIGljZSk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhpY2UtPnBjaSk7CkBAIC0yMzQ2LDcgKzIzNDcsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgc25kX3Z0MTcyNF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCSAgICAgICBjb25zdCBjaGFyICptb2RlbG5hbWUsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfaWNlMTcxMiAqKiByX2ljZTE3MTIpCisJCQkJICAgICAgIHN0cnVjdCBzbmRfaWNlMTcxMiAqKnJfaWNlMTcxMikKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZTsKIAlpbnQgZXJyOwpAQCAtMjM1Nyw4ICsyMzU4LDkgQEAKIAogCSpyX2ljZTE3MTIgPSBOVUxMOwogCi0gICAgICAgIC8qIGVuYWJsZSBQQ0kgZGV2aWNlICovCi0JaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCisJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJaWNlID0ga3phbGxvYyhzaXplb2YoKmljZSksIEdGUF9LRVJORUwpOwpAQCAtMjM4Miw3ICsyMzg0LDggQEAKIAlzbmRfdnQxNzI0X3Byb2NfaW5pdChpY2UpOwogCXN5bmNocm9uaXplX2lycShwY2ktPmlycSk7CiAKLQlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCAiSUNFMTcyNCIpKSA8IDApIHsKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaSwgIklDRTE3MjQiKTsKKwlpZiAoZXJyIDwgMCkgewogCQlrZnJlZShpY2UpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIGVycjsKQEAgLTI0MTcsOSArMjQyMCwxMCBAQAogCSAqLwogCW91dGIoVlQxNzI0X01VTFRJX0ZJRk9fRVJSLCBJQ0VNVDE3MjQoaWNlLCBETUFfSU5UX01BU0spKTsKIAotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBpY2UsICZvcHMpKSA8IDApIHsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGljZSwgJm9wcyk7CisJaWYgKGVyciA8IDApIHsKIAkJc25kX3Z0MTcyNF9mcmVlKGljZSk7Ci0gCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCX0KIAogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKQEAgLTI0NTcsOCArMjQ2MSw5IEBACiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSUNFMTcyNCIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJJQ0Vuc2VtYmxlIElDRTE3MjQiKTsKLQkKLQlpZiAoKGVyciA9IHNuZF92dDE3MjRfY3JlYXRlKGNhcmQsIHBjaSwgbW9kZWxbZGV2XSwgJmljZSkpIDwgMCkgeworCisJZXJyID0gc25kX3Z0MTcyNF9jcmVhdGUoY2FyZCwgcGNpLCBtb2RlbFtkZXZdLCAmaWNlKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTI0NzAsNyArMjQ3NSw4IEBACiAJCQkJaWYgKGMtPmRyaXZlcikgLyogc3BlY2lmaWMgZHJpdmVyPyAqLwogCQkJCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBjLT5kcml2ZXIpOwogCQkJCWlmIChjLT5jaGlwX2luaXQpIHsKLQkJCQkJaWYgKChlcnIgPSBjLT5jaGlwX2luaXQoaWNlKSkgPCAwKSB7CisJCQkJCWVyciA9IGMtPmNoaXBfaW5pdChpY2UpOworCQkJCQlpZiAoZXJyIDwgMCkgewogCQkJCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCQkJCXJldHVybiBlcnI7CiAJCQkJCX0KQEAgLTI0ODAsMTUgKzI0ODYsMTUgQEAKIAkJfQogCX0KIAljID0gJm5vX21hdGNoZWQ7Ci0gX19mb3VuZDoKLSAgICAgICAvKgotICAgICAgICAqIFZUMTcyNCBoYXMgc2VwYXJhdGUgRE1BcyBmb3IgdGhlIGFuYWxvZyBhbmQgdGhlIFNQRElGIHN0cmVhbXMgd2hpbGUKLSAgICAgICAgKiBJQ0UxNzEyIGhhcyBvbmx5IG9uZSBmb3IgYm90aCAobWl4ZWQgdXApLgotICAgICAgICAqCi0gICAgICAgICogQ29uZnVzaW5nbHkgdGhlIGFuYWxvZyBQQ00gaXMgbmFtZWQgInByb2Zlc3Npb25hbCIgaGVyZSBiZWNhdXNlIGl0Ci0gICAgICAgICogd2FzIGNhbGxlZCBzbyBpbiBpY2UxNzEyIGRyaXZlciwgYW5kIHZ0MTcyNCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tCi0gICAgICAgICogaWNlMTcxMiBkcml2ZXIuCi0gICAgICAgICovCitfX2ZvdW5kOgorCS8qCisJKiBWVDE3MjQgaGFzIHNlcGFyYXRlIERNQXMgZm9yIHRoZSBhbmFsb2cgYW5kIHRoZSBTUERJRiBzdHJlYW1zIHdoaWxlCisJKiBJQ0UxNzEyIGhhcyBvbmx5IG9uZSBmb3IgYm90aCAobWl4ZWQgdXApLgorCSoKKwkqIENvbmZ1c2luZ2x5IHRoZSBhbmFsb2cgUENNIGlzIG5hbWVkICJwcm9mZXNzaW9uYWwiIGhlcmUgYmVjYXVzZSBpdAorCSogd2FzIGNhbGxlZCBzbyBpbiBpY2UxNzEyIGRyaXZlciwgYW5kIHZ0MTcyNCBkcml2ZXIgaXMgZGVyaXZlZCBmcm9tCisJKiBpY2UxNzEyIGRyaXZlci4KKwkqLwogCWljZS0+cHJvX3JhdGVfZGVmYXVsdCA9IFBST19SQVRFX0RFRkFVTFQ7CiAJaWYgKCFpY2UtPmlzX3NwZGlmX21hc3RlcikKIAkJaWNlLT5pc19zcGRpZl9tYXN0ZXIgPSBzdGRjbG9ja19pc19zcGRpZl9tYXN0ZXI7CkBAIC0yNTAzLDQ2ICsyNTA5LDUzIEBACiAJaWYgKCFpY2UtPmh3X3JhdGVzKQogCQlzZXRfc3RkX2h3X3JhdGVzKGljZSk7CiAKLQlpZiAoKGVyciA9IHNuZF92dDE3MjRfcGNtX3Byb2ZpKGljZSwgcGNtX2RldisrKSkgPCAwKSB7Ci0JCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCQotCWlmICgoZXJyID0gc25kX3Z0MTcyNF9wY21fc3BkaWYoaWNlLCBwY21fZGV2KyspKSA8IDApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JCi0JaWYgKChlcnIgPSBzbmRfdnQxNzI0X3BjbV9pbmRlcChpY2UsIHBjbV9kZXYrKykpIDwgMCkgeworCWVyciA9IHNuZF92dDE3MjRfcGNtX3Byb2ZpKGljZSwgcGNtX2RldisrKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmICgoZXJyID0gc25kX3Z0MTcyNF9hYzk3X21peGVyKGljZSkpIDwgMCkgeworCWVyciA9IHNuZF92dDE3MjRfcGNtX3NwZGlmKGljZSwgcGNtX2RldisrKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmICgoZXJyID0gc25kX3Z0MTcyNF9idWlsZF9jb250cm9scyhpY2UpKSA8IDApIHsKKwllcnIgPSBzbmRfdnQxNzI0X3BjbV9pbmRlcChpY2UsIHBjbV9kZXYrKyk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX2NhcmRfZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBzbmRfdnQxNzI0X2FjOTdfbWl4ZXIoaWNlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHNuZF92dDE3MjRfYnVpbGRfY29udHJvbHMoaWNlKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChpY2UtPnBjbSAmJiBpY2UtPmhhc19zcGRpZikgeyAvKiBoYXMgU1BESUYgSS9PICovCi0JCWlmICgoZXJyID0gc25kX3Z0MTcyNF9zcGRpZl9idWlsZF9jb250cm9scyhpY2UpKSA8IDApIHsKKwkJZXJyID0gc25kX3Z0MTcyNF9zcGRpZl9idWlsZF9jb250cm9scyhpY2UpOworCQlpZiAoZXJyIDwgMCkgewogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CiAKIAlpZiAoYy0+YnVpbGRfY29udHJvbHMpIHsKLQkJaWYgKChlcnIgPSBjLT5idWlsZF9jb250cm9scyhpY2UpKSA8IDApIHsKKwkJZXJyID0gYy0+YnVpbGRfY29udHJvbHMoaWNlKTsKKwkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCi0JaWYgKCEgYy0+bm9fbXB1NDAxKSB7CisJaWYgKCFjLT5ub19tcHU0MDEpIHsKIAkJaWYgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDJfU1lTQ09ORl0gJiBWVDE3MjRfQ0ZHX01QVTQwMSkgewogCQkJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIApAQCAtMjU3NCw3ICsyNTg3LDggQEAKIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlaSIsCiAJCWNhcmQtPnNob3J0bmFtZSwgaWNlLT5wb3J0LCBpY2UtPmlycSk7CiAKLQlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApIHsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwppbmRleCBiNGUwYzE2Li5jNTE2NTliIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCkBAIC0yMSw3ICsyMSw3IEBACiAgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICoKLSAqLyAgICAgIAorICovCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzQsOSArMzQsMTAgQEAKICNpbmNsdWRlICJpY2UxNzEyLmgiCiAjaW5jbHVkZSAiZW52eTI0aHQuaCIKICNpbmNsdWRlICJqdWxpLmgiCisKIHN0cnVjdCBqdWxpX3NwZWMgewogCXN0cnVjdCBhazQxMTQgKmFrNDExNDsKLQl1bnNpZ25lZCBpbnQgYW5hbG9nOiAxOworCXVuc2lnbmVkIGludCBhbmFsb2c6MTsKIH07CiAKIC8qCkBAIC0xNjAsMTQgKzE2MSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBqdWxpX2FrNDExNF93cml0ZSh2b2lkICpwcml2YXRlX2RhdGEsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3N0YXRpYyB2b2lkIGp1bGlfYWs0MTE0X3dyaXRlKHZvaWQgKnByaXZhdGVfZGF0YSwgdW5zaWduZWQgY2hhciByZWcsCisJCQkJdW5zaWduZWQgY2hhciB2YWwpCiB7Ci0Jc25kX3Z0MTcyNF93cml0ZV9pMmMoKHN0cnVjdCBzbmRfaWNlMTcxMiAqKXByaXZhdGVfZGF0YSwgQUs0MTE0X0FERFIsIHJlZywgdmFsKTsKKwlzbmRfdnQxNzI0X3dyaXRlX2kyYygoc3RydWN0IHNuZF9pY2UxNzEyICopcHJpdmF0ZV9kYXRhLCBBSzQxMTRfQUREUiwKKwkJCQlyZWcsIHZhbCk7CiB9Ci0gICAgICAgIAorCiBzdGF0aWMgdW5zaWduZWQgY2hhciBqdWxpX2FrNDExNF9yZWFkKHZvaWQgKnByaXZhdGVfZGF0YSwgdW5zaWduZWQgY2hhciByZWcpCiB7Ci0JcmV0dXJuIHNuZF92dDE3MjRfcmVhZF9pMmMoKHN0cnVjdCBzbmRfaWNlMTcxMiAqKXByaXZhdGVfZGF0YSwgQUs0MTE0X0FERFIsIHJlZyk7CisJcmV0dXJuIHNuZF92dDE3MjRfcmVhZF9pMmMoKHN0cnVjdCBzbmRfaWNlMTcxMiAqKXByaXZhdGVfZGF0YSwKKwkJCQkJQUs0MTE0X0FERFIsIHJlZyk7CiB9CiAKIC8qCkBAIC0xNzUsNyArMTc5LDcgQEAKICAqIHRvIHRoZSBleHRlcm5hbCByYXRlCiAgKi8KIHN0YXRpYyB2b2lkIGp1bGlfc3BkaWZfaW5fb3BlbihzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QganVsaV9zcGVjICpzcGVjID0gaWNlLT5zcGVjOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CkBAIC0yMDgsNyArMjEyLDggQEAKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGFrLT5wcml2YXRlX2RhdGFbMF07CiAJIAotCXNuZF9hc3NlcnQoY2hpcCA9PSAwLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKGNoaXApKQorCQlyZXR1cm47CiAJc25kX3Z0MTcyNF93cml0ZV9pMmMoaWNlLCBBSzQzNThfQUREUiwgYWRkciwgZGF0YSk7CiB9CiAKQEAgLTU3MSwxMCArNTc2LDEyIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBqdWxpX2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdmFsc1tdID0gewotCQkvKiBBSzQxMTdfUkVHX1BXUkROICovCUFLNDExNF9SU1QgfCBBSzQxMTRfUFdOIHwgQUs0MTE0X09DS1MwIHwgQUs0MTE0X09DS1MxLAorCQkvKiBBSzQxMTdfUkVHX1BXUkROICovCUFLNDExNF9SU1QgfCBBSzQxMTRfUFdOIHwKKwkJCQkJQUs0MTE0X09DS1MwIHwgQUs0MTE0X09DS1MxLAogCQkvKiBBSzQxMTRfUkVRX0ZPUk1BVCAqLwlBSzQxMTRfRElGX0kyNEkyUywKIAkJLyogQUs0MTE0X1JFR19JTzAgKi8JQUs0MTE0X1RYMUUsCi0JCS8qIEFLNDExNF9SRUdfSU8xICovCUFLNDExNF9FRkhfMTAyNCB8IEFLNDExNF9ESVQgfCBBSzQxMTRfSVBTKDEpLAorCQkvKiBBSzQxMTRfUkVHX0lPMSAqLwlBSzQxMTRfRUZIXzEwMjQgfCBBSzQxMTRfRElUIHwKKwkJCQkJQUs0MTE0X0lQUygxKSwKIAkJLyogQUs0MTE0X1JFR19JTlQwX01BU0sgKi8gMCwKIAkJLyogQUs0MTE0X1JFR19JTlQxX01BU0sgKi8gMAogCX07CkBAIC02MDQsMTIgKzYxMSwxNCBAQAogCXNwZWMtPmFrNDExNC0+Y2hlY2tfZmxhZ3MgPSAwOwogCiAjaWYgMAotICAgICAgICAvKiBpdCBzZWVtcyB0aGF0IHRoZSBhbmFsb2cgZG91Z2h0ZXIgYm9hcmQgZGV0ZWN0aW9uIGRvZXMgbm90IHdvcmsKLSAgICAgICAgICAgcmVsaWFibHksIHNvIGZvcmNlIHRoZSBhbmFsb2cgZmxhZzsgaXQgc2hvdWxkIGJlIHZlcnkgcmFyZQotICAgICAgICAgICB0byB1c2UgSnVsaUAgd2l0aG91dCB0aGUgYW5hbG9nIGRvdWdodGVyIGJvYXJkICovCisvKgorICogaXQgc2VlbXMgdGhhdCB0aGUgYW5hbG9nIGRvdWdodGVyIGJvYXJkIGRldGVjdGlvbiBkb2VzIG5vdCB3b3JrIHJlbGlhYmx5LCBzbworICogZm9yY2UgdGhlIGFuYWxvZyBmbGFnOyBpdCBzaG91bGQgYmUgdmVyeSByYXJlIChpZiBldmVyKSB0byBjb21lIGF0IEp1bGlACisgKiB1c2VkIHdpdGhvdXQgdGhlIGFuYWxvZyBkYXVnaHRlciBib2FyZAorICovCiAJc3BlYy0+YW5hbG9nID0gKGljZS0+Z3Bpby5nZXRfZGF0YShpY2UpICYgR1BJT19BTkFMT0dfUFJFU0VOVCkgPyAwIDogMTsKICNlbHNlCi0gICAgICAgIHNwZWMtPmFuYWxvZyA9IDE7CisJc3BlYy0+YW5hbG9nID0gMTsKICNlbmRpZgogCiAJaWYgKHNwZWMtPmFuYWxvZykgewpAQCAtNjE3LDE0ICs2MjYsMTYgQEAKIAkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDI7CiAJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOwogCi0JCWFrID0gaWNlLT5ha20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FrbTR4eHgpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCEgYWspCisJCWljZS0+YWttID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9ha200eHh4KSwgR0ZQX0tFUk5FTCk7CisJCWFrID0gaWNlLT5ha207CisJCWlmICghYWspCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWNlLT5ha21fY29kZWNzID0gMTsKLQkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fanVsaV9kYWMsIE5VTEwsIGljZSkpIDwgMCkKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2p1bGlfZGFjLCBOVUxMLCBpY2UpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCQorCiAJLyoganVsaSBpcyBjbG9ja2VkIGJ5IFhpbGlueCBhcnJheSAqLwogCWljZS0+aHdfcmF0ZXMgPSAmanVsaV9yYXRlc19pbmZvOwogCWljZS0+aXNfc3BkaWZfbWFzdGVyID0ganVsaV9pc19zcGRpZl9tYXN0ZXI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5jIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYwppbmRleCA1YTE1OGI3Li5kZTI5YmU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKQEAgLTIyLDE1ICsyMiwyNCBAQAogICovCiAKIC8qIFBIQVNFIDIyIG92ZXJ2aWV3OgotICogICBBdWRpbyBjb250cm9sbGVyOiBWSUEgRW52eTI0SFQtUyAoc2xpZ2h0bHkgdHJpbW1lZCBkb3duIHZlcnNpb24gb2YgRW52eTI0SFQpCisgKiAgIEF1ZGlvIGNvbnRyb2xsZXI6IFZJQSBFbnZ5MjRIVC1TIChzbGlnaHRseSB0cmltbWVkIGRvd24gRW52eTI0SFQsIDRpbi80b3V0KQogICogICBBbmFsb2cgY2hpcDogQUs0NTI0IChwYXJ0aWFsbHkgdmlhIFBoaWxpcCdzIDc0SENUMTI1KQotICogICBEaWdpdGFsIHJlY2VpdmVyOiBDUzg0MTQtQ1MgKG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZWxlYXNlKQorICogICBEaWdpdGFsIHJlY2VpdmVyOiBDUzg0MTQtQ1MgKHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UpCisgKgkJUEhBU0UgMjIgcmV2aXNpb24gMi4wIGFuZCBUZXJyYXNvbmlxL011c29uaWsgVFMyMlBDSSBoYXZlIENTODQxNgorICoJCShzdXBwb3J0IHN0YXR1cyB1bmtub3duLCBwbGVhc2UgdGVzdCBhbmQgcmVwb3J0KQogICoKICAqICAgRW52eSBjb25uZWN0cyB0byBBSzQ1MjQKICAqCS0gQ1MgZGlyZWN0bHkgZnJvbSBHUElPIDEwCiAgKgktIENDTEsgdmlhIDc0SENUMTI1J3MgZ2F0ZSAjNCBmcm9tIEdQSU8gNAogICoJLSBDRFRJIHZpYSA3NEhDVDEyNSdzIGdhdGUgIzIgZnJvbSBHUElPIDUKLSAqCQlDRFRJIG1heSBiZSBjb21wbGV0ZWx5IGJsb2NrZWQgYnkgNzRIQ1QxMjUncyBnYXRlICMxIGNvbnRyb2xsZWQgYnkgR1BJTyAzCisgKgkJQ0RUSSBtYXkgYmUgY29tcGxldGVseSBibG9ja2VkIGJ5IDc0SENUMTI1J3MgZ2F0ZSAjMQorICoJCWNvbnRyb2xsZWQgYnkgR1BJTyAzCisgKi8KKworLyogUEhBU0UgMjggb3ZlcnZpZXc6CisgKiAgIEF1ZGlvIGNvbnRyb2xsZXI6IFZJQSBFbnZ5MjRIVCAoZnVsbCB1bnRyaW1tZWQgdmVyc2lvbiwgNGluLzhvdXQpCisgKiAgIEFuYWxvZyBjaGlwOiBXTTg3NzAgKDggY2hhbm5lbCAxOTJrIERBQywgMiBjaGFubmVsIDk2ayBBREMpCisgKiAgIERpZ2l0YWwgcmVjZWl2ZXI6IENTODQxNC1DUyAoc3VwcG9ydGVkIGluIHRoaXMgcmVsZWFzZSkKICAqLwogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03NywxOCArODYsMTggQEAKICAqIENvbXB1dGVkIGFzIDIwICogTG9nMTAoMjU1IC8geCkKICAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd21fdm9sWzI1Nl0gPSB7Ci0JMTI3LCA0OCwgNDIsIDM5LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI3LCAyNiwgMjUsIDI1LCAyNCwgMjQsIDIzLAotCTIzLCAyMiwgMjIsIDIxLCAyMSwgMjEsIDIwLCAyMCwgMjAsIDE5LCAxOSwgMTksIDE4LCAxOCwgMTgsIDE4LCAxNywgMTcsIDE3LAotCTE3LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLAotCTEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotCTExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA4LCA4LAotCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDYsIDYsIDYsCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKLQk1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAzLAotCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0JMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAKKwkxMjcsIDQ4LCA0MiwgMzksIDM2LCAzNCwgMzMsIDMxLCAzMCwgMjksIDI4LCAyNywgMjcsIDI2LCAyNSwgMjUsIDI0LAorCTI0LCAyMywgMjMsIDIyLCAyMiwgMjEsIDIxLCAyMSwgMjAsIDIwLCAyMCwgMTksIDE5LCAxOSwgMTgsIDE4LCAxOCwgMTgsCisJMTcsIDE3LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwKKwkxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLAorCTExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDksIDksIDksIDksCisJOSwgOSwgOSwgOSwgOSwgOSwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNywgNywgNywgNywgNywgNywKKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LAorCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorCTIsIDIsIDIsIDIsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAogfTsKIAogI2RlZmluZSBXTV9WT0xfTUFYCShzaXplb2Yod21fdm9sKSAtIDEpCkBAIC0xMTcsMjYgKzEyNiwzMSBAQAogCXN0cnVjdCBzbmRfYWttNHh4eCAqYWs7CiAJaW50IGVycjsKIAotCS8vIENvbmZpZ3VyZSBEQUMvQURDIGRlc2NyaXB0aW9uIGZvciBnZW5lcmljIHBhcnQgb2YgaWNlMTcyNAorCS8qIENvbmZpZ3VyZSBEQUMvQURDIGRlc2NyaXB0aW9uIGZvciBnZW5lcmljIHBhcnQgb2YgaWNlMTcyNCAqLwogCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CiAJY2FzZSBWVDE3MjRfU1VCREVWSUNFX1BIQVNFMjI6CisJY2FzZSBWVDE3MjRfU1VCREVWSUNFX1RTMjI6CiAJCWljZS0+bnVtX3RvdGFsX2RhY3MgPSAyOwogCQlpY2UtPm51bV90b3RhbF9hZGNzID0gMjsKLQkJaWNlLT52dDE3MjAgPSAxOyAvLyBFbnZ5MjRIVC1TIGhhdmUgMTYgYml0IHdpZGUgR1BJTworCQlpY2UtPnZ0MTcyMCA9IDE7IC8qIEVudnkyNEhULVMgaGF2ZSAxNiBiaXQgd2lkZSBHUElPICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNuZF9CVUcoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLy8gSW5pdGlhbGl6ZSBhbmFsb2cgY2hpcHMKLQlhayA9IGljZS0+YWttID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9ha200eHh4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEgYWspCisJLyogSW5pdGlhbGl6ZSBhbmFsb2cgY2hpcHMgKi8KKwlpY2UtPmFrbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfYWttNHh4eCksIEdGUF9LRVJORUwpOworCWFrID0gaWNlLT5ha207CisJaWYgKCFhaykKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWNlLT5ha21fY29kZWNzID0gMTsKIAlzd2l0Y2ggKGljZS0+ZWVwcm9tLnN1YnZlbmRvcikgewogCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyOgotCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9waGFzZTIyLCAmYWttX3BoYXNlMjJfcHJpdiwgaWNlKSkgPCAwKQorCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9UUzIyOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fcGhhc2UyMiwKKwkJCQkJCSZha21fcGhhc2UyMl9wcml2LCBpY2UpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWJyZWFrOwogCX0KQEAgLTE1MCw2ICsxNjQsNyBAQAogCiAJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUEhBU0UyMjoKKwljYXNlIFZUMTcyNF9TVUJERVZJQ0VfVFMyMjoKIAkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0xNTgsOSArMTczLDEwIEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBoYXNlMjJfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwMCwJLyogMXhBREMsIDF4REFDcyAqLworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDI4LCAgLyogY2xvY2sgNTEyLCBtcHUgNDAxLAorCQkJCQlzcGRpZi1pbi8xeEFEQywgMXhEQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLwotCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGY4LAkvKiB2b2wsIDk2aywgMjRiaXQgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmMCwJLyogdm9sLCA5NmssIDI0Yml0ICovCiAJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KIAlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKIAlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKQEAgLTE3NCw3ICsxOTAsOCBAQAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcGhhc2UyOF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDBiLAkvKiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgyYiwgIC8qIGNsb2NrIDUxMiwgbXB1NDAxLAorCQkJCQlzcGRpZi1pbi8xeEFEQywgNHhEQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLwogCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KIAlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHhjMywJLyogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwpAQCAtMTkyLDE1ICsyMDksMTYgQEAKIC8qCiAgKiB3cml0ZSBkYXRhIGluIHRoZSBTUEkgbW9kZQogICovCi1zdGF0aWMgdm9pZCBwaGFzZTI4X3NwaV93cml0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdW5zaWduZWQgaW50IGNzLCB1bnNpZ25lZCBpbnQgZGF0YSwgaW50IGJpdHMpCitzdGF0aWMgdm9pZCBwaGFzZTI4X3NwaV93cml0ZShzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgdW5zaWduZWQgaW50IGNzLAorCQkJCXVuc2lnbmVkIGludCBkYXRhLCBpbnQgYml0cykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCWludCBpOwogCiAJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAKLQlzbmRfaWNlMTcxMl9ncGlvX3NldF9tYXNrKGljZSwgfihQSEFTRTI4X1dNX1JXfFBIQVNFMjhfU1BJX01PU0l8UEhBU0UyOF9TUElfQ0xLfAotCQkJCQkgUEhBU0UyOF9XTV9DUykpOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCB+KFBIQVNFMjhfV01fUld8UEhBU0UyOF9TUElfTU9TSXwKKwkJCQkJUEhBU0UyOF9TUElfQ0xLfFBIQVNFMjhfV01fQ1MpKTsKIAl0bXAgfD0gUEhBU0UyOF9XTV9SVzsKIAl0bXAgJj0gfmNzOwogCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOwpAQCAtMjU5LDE0ICsyNzcsMTYgQEAKIAlpY2UtPmFrbVswXS5pbWFnZXNbcmVnICsgMV0gPSB2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHdtX3NldF92b2woc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgc2hvcnQgdm9sLCB1bnNpZ25lZCBzaG9ydCBtYXN0ZXIpCitzdGF0aWMgdm9pZCB3bV9zZXRfdm9sKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQl1bnNpZ25lZCBzaG9ydCB2b2wsIHVuc2lnbmVkIHNob3J0IG1hc3RlcikKIHsKIAl1bnNpZ25lZCBjaGFyIG52b2w7CiAKIAlpZiAoKG1hc3RlciAmIFdNX1ZPTF9NVVRFKSB8fCAodm9sICYgV01fVk9MX01VVEUpKQogCQludm9sID0gMDsKIAllbHNlCi0JCW52b2wgPSAxMjcgLSB3bV92b2xbKCgodm9sICYgfldNX1ZPTF9NVVRFKSAqIChtYXN0ZXIgJiB+V01fVk9MX01VVEUpKSAvIDEyNykgJiBXTV9WT0xfTUFYXTsKKwkJbnZvbCA9IDEyNyAtIHdtX3ZvbFsoKCh2b2wgJiB+V01fVk9MX01VVEUpICoKKwkJCShtYXN0ZXIgJiB+V01fVk9MX01VVEUpKSAvIDEyNykgJiBXTV9WT0xfTUFYXTsKIAogCXdtX3B1dChpY2UsIGluZGV4LCBudm9sKTsKIAl3bV9wdXRfbm9jYWNoZShpY2UsIGluZGV4LCAweDE4MCB8IG52b2wpOwpAQCAtMjc3LDE3ICsyOTcsMjAgQEAKICAqLwogI2RlZmluZSB3bV9wY21fbXV0ZV9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KIAotc3RhdGljIGludCB3bV9wY21fbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB3bV9wY21fbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAltdXRleF9sb2NrKCZpY2UtPmdwaW9fbXV0ZXgpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHdtX2dldChpY2UsIFdNX01VVEUpICYgMHgxMCkgPyAwIDogMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9NVVRFKSAmIDB4MTApID8KKwkJCQkJCTAgOiAxOwogCW11dGV4X3VubG9jaygmaWNlLT5ncGlvX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bV9wY21fbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB3bV9wY21fbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgc2hvcnQgbnZhbCwgb3ZhbDsKQEAgLTI5Niw3ICszMTksOCBAQAogCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAlvdmFsID0gd21fZ2V0KGljZSwgV01fTVVURSk7CiAJbnZhbCA9IChvdmFsICYgfjB4MTApIHwgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IDB4MTApOwotCWlmICgoY2hhbmdlID0gKG52YWwgIT0gb3ZhbCkpKQorCWNoYW5nZSA9IChudmFsICE9IG92YWwpOworCWlmIChjaGFuZ2UpCiAJCXdtX3B1dChpY2UsIFdNX01VVEUsIG52YWwpOwogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKIApAQCAtMzA2LDcgKzMzMCw4IEBACiAvKgogICogTWFzdGVyIHZvbHVtZSBhdHRlbnVhdGlvbiBtaXhlciBjb250cm9sCiAgKi8KLXN0YXRpYyBpbnQgd21fbWFzdGVyX3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQorc3RhdGljIGludCB3bV9tYXN0ZXJfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKIAl1aW5mby0+Y291bnQgPSAyOwpAQCAtMzE1LDE3ICszNDAsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bV9tYXN0ZXJfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHdtX21hc3Rlcl92b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBwaGFzZTI4X3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7CiAJaW50IGk7Ci0JZm9yIChpPTA7IGk8MjsgaSsrKQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IHNwZWMtPm1hc3RlcltpXSAmIH5XTV9WT0xfTVVURTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IHNwZWMtPm1hc3RlcltpXSAmCisJCQkJCQkJfldNX1ZPTF9NVVRFOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtX21hc3Rlcl92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgd21fbWFzdGVyX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHBoYXNlMjhfc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKQEAgLTM1NSwzOCArMzgzLDM4IEBACiB7CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX3BoYXNlMjhbXSA9IHsKIAkJLyogVGhlc2UgY29tZSBmaXJzdCB0byByZWR1Y2UgaW5pdCBwb3Agbm9pc2UgKi8KLQkJMHgxYiwgMHgwNDQsCQkvKiBBREMgTXV4IChBQyc5NyBzb3VyY2UpICovCi0JCTB4MWMsIDB4MDBCLAkJLyogT3V0IE11eDEgKFZPVVQxID0gREFDK0FVWCwgVk9VVDIgPSBEQUMpICovCi0JCTB4MWQsIDB4MDA5LAkJLyogT3V0IE11eDIgKFZPVVQyID0gREFDLCBWT1VUMyA9IERBQykgKi8KKwkJMHgxYiwgMHgwNDQsCS8qIEFEQyBNdXggKEFDJzk3IHNvdXJjZSkgKi8KKwkJMHgxYywgMHgwMEIsCS8qIE91dCBNdXgxIChWT1VUMSA9IERBQytBVVgsIFZPVVQyID0gREFDKSAqLworCQkweDFkLCAweDAwOSwJLyogT3V0IE11eDIgKFZPVVQyID0gREFDLCBWT1VUMyA9IERBQykgKi8KIAotCQkweDE4LCAweDAwMCwJCS8qIEFsbCBwb3dlci11cCAqLworCQkweDE4LCAweDAwMCwJLyogQWxsIHBvd2VyLXVwICovCiAKLQkJMHgxNiwgMHgxMjIsCQkvKiBJMlMsIG5vcm1hbCBwb2xhcml0eSwgMjRiaXQgKi8KLQkJMHgxNywgMHgwMjIsCQkvKiAyNTZmcywgc2xhdmUgbW9kZSAqLwotCQkweDAwLCAwLAkJLyogREFDMSBhbmFsb2cgbXV0ZSAqLwotCQkweDAxLCAwLAkJLyogREFDMiBhbmFsb2cgbXV0ZSAqLwotCQkweDAyLCAwLAkJLyogREFDMyBhbmFsb2cgbXV0ZSAqLwotCQkweDAzLCAwLAkJLyogREFDNCBhbmFsb2cgbXV0ZSAqLwotCQkweDA0LCAwLAkJLyogREFDNSBhbmFsb2cgbXV0ZSAqLwotCQkweDA1LCAwLAkJLyogREFDNiBhbmFsb2cgbXV0ZSAqLwotCQkweDA2LCAwLAkJLyogREFDNyBhbmFsb2cgbXV0ZSAqLwotCQkweDA3LCAwLAkJLyogREFDOCBhbmFsb2cgbXV0ZSAqLwotCQkweDA4LCAweDEwMCwJCS8qIG1hc3RlciBhbmFsb2cgbXV0ZSAqLwotCQkweDA5LCAweGZmLAkJLyogREFDMSBkaWdpdGFsIGZ1bGwgKi8KLQkJMHgwYSwgMHhmZiwJCS8qIERBQzIgZGlnaXRhbCBmdWxsICovCi0JCTB4MGIsIDB4ZmYsCQkvKiBEQUMzIGRpZ2l0YWwgZnVsbCAqLwotCQkweDBjLCAweGZmLAkJLyogREFDNCBkaWdpdGFsIGZ1bGwgKi8KLQkJMHgwZCwgMHhmZiwJCS8qIERBQzUgZGlnaXRhbCBmdWxsICovCi0JCTB4MGUsIDB4ZmYsCQkvKiBEQUM2IGRpZ2l0YWwgZnVsbCAqLwotCQkweDBmLCAweGZmLAkJLyogREFDNyBkaWdpdGFsIGZ1bGwgKi8KLQkJMHgxMCwgMHhmZiwJCS8qIERBQzggZGlnaXRhbCBmdWxsICovCi0JCTB4MTEsIDB4MWZmLAkJLyogbWFzdGVyIGRpZ2l0YWwgZnVsbCAqLwotCQkweDEyLCAweDAwMCwJCS8qIHBoYXNlIG5vcm1hbCAqLwotCQkweDEzLCAweDA5MCwJCS8qIHVubXV0ZSBEQUMgTC9SICovCi0JCTB4MTQsIDB4MDAwLAkJLyogYWxsIHVubXV0ZSAqLwotCQkweDE1LCAweDAwMCwJCS8qIG5vIGRlZW1waGFzaXMsIG5vIFpGTEcgKi8KLQkJMHgxOSwgMHgwMDAsCQkvKiAtMTJkQiBBREMvTCAqLwotCQkweDFhLCAweDAwMCwJCS8qIC0xMmRCIEFEQy9SICovCisJCTB4MTYsIDB4MTIyLAkvKiBJMlMsIG5vcm1hbCBwb2xhcml0eSwgMjRiaXQgKi8KKwkJMHgxNywgMHgwMjIsCS8qIDI1NmZzLCBzbGF2ZSBtb2RlICovCisJCTB4MDAsIDAsCS8qIERBQzEgYW5hbG9nIG11dGUgKi8KKwkJMHgwMSwgMCwJLyogREFDMiBhbmFsb2cgbXV0ZSAqLworCQkweDAyLCAwLAkvKiBEQUMzIGFuYWxvZyBtdXRlICovCisJCTB4MDMsIDAsCS8qIERBQzQgYW5hbG9nIG11dGUgKi8KKwkJMHgwNCwgMCwJLyogREFDNSBhbmFsb2cgbXV0ZSAqLworCQkweDA1LCAwLAkvKiBEQUM2IGFuYWxvZyBtdXRlICovCisJCTB4MDYsIDAsCS8qIERBQzcgYW5hbG9nIG11dGUgKi8KKwkJMHgwNywgMCwJLyogREFDOCBhbmFsb2cgbXV0ZSAqLworCQkweDA4LCAweDEwMCwJLyogbWFzdGVyIGFuYWxvZyBtdXRlICovCisJCTB4MDksIDB4ZmYsCS8qIERBQzEgZGlnaXRhbCBmdWxsICovCisJCTB4MGEsIDB4ZmYsCS8qIERBQzIgZGlnaXRhbCBmdWxsICovCisJCTB4MGIsIDB4ZmYsCS8qIERBQzMgZGlnaXRhbCBmdWxsICovCisJCTB4MGMsIDB4ZmYsCS8qIERBQzQgZGlnaXRhbCBmdWxsICovCisJCTB4MGQsIDB4ZmYsCS8qIERBQzUgZGlnaXRhbCBmdWxsICovCisJCTB4MGUsIDB4ZmYsCS8qIERBQzYgZGlnaXRhbCBmdWxsICovCisJCTB4MGYsIDB4ZmYsCS8qIERBQzcgZGlnaXRhbCBmdWxsICovCisJCTB4MTAsIDB4ZmYsCS8qIERBQzggZGlnaXRhbCBmdWxsICovCisJCTB4MTEsIDB4MWZmLAkvKiBtYXN0ZXIgZGlnaXRhbCBmdWxsICovCisJCTB4MTIsIDB4MDAwLAkvKiBwaGFzZSBub3JtYWwgKi8KKwkJMHgxMywgMHgwOTAsCS8qIHVubXV0ZSBEQUMgTC9SICovCisJCTB4MTQsIDB4MDAwLAkvKiBhbGwgdW5tdXRlICovCisJCTB4MTUsIDB4MDAwLAkvKiBubyBkZWVtcGhhc2lzLCBubyBaRkxHICovCisJCTB4MTksIDB4MDAwLAkvKiAtMTJkQiBBREMvTCAqLworCQkweDFhLCAweDAwMCwJLyogLTEyZEIgQURDL1IgKi8KIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKIApAQCAtNDA0LDE3ICs0MzIsMTkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWNlLT5zcGVjID0gc3BlYzsKIAotCS8vIEluaXRpYWxpemUgYW5hbG9nIGNoaXBzCi0JYWsgPSBpY2UtPmFrbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfYWttNHh4eCksIEdGUF9LRVJORUwpOworCS8qIEluaXRpYWxpemUgYW5hbG9nIGNoaXBzICovCisJaWNlLT5ha20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FrbTR4eHgpLCBHRlBfS0VSTkVMKTsKKwlhayA9IGljZS0+YWttOwogCWlmICghYWspCiAJCXJldHVybiAtRU5PTUVNOwogCWljZS0+YWttX2NvZGVjcyA9IDE7CiAKLQlzbmRfaWNlMTcxMl9ncGlvX3NldF9kaXIoaWNlLCAweDVmZmZmZik7IC8qIGZpeCB0aGlzIGZvciB0aGUgdGltZSBiZWluZyAqLworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIDB4NWZmZmZmKTsgLyogZml4IHRoaXMgZm9yIHRpbWUgYmVpbmcgKi8KIAogCS8qIHJlc2V0IHRoZSB3bSBjb2RlYyBhcyB0aGUgU1BJIG1vZGUgKi8KIAlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7Ci0Jc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH4oUEhBU0UyOF9XTV9SRVNFVHxQSEFTRTI4X1dNX0NTfFBIQVNFMjhfSFBfU0VMKSk7CisJc25kX2ljZTE3MTJfZ3Bpb19zZXRfbWFzayhpY2UsIH4oUEhBU0UyOF9XTV9SRVNFVHxQSEFTRTI4X1dNX0NTfAorCQkJCQlQSEFTRTI4X0hQX1NFTCkpOwogCiAJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CiAJdG1wICY9IH5QSEFTRTI4X1dNX1JFU0VUOwpAQCAtNDQ2LDcgKzQ3Niw4IEBACiAvKgogICogREFDIHZvbHVtZSBhdHRlbnVhdGlvbiBtaXhlciBjb250cm9sCiAgKi8KLXN0YXRpYyBpbnQgd21fdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCitzdGF0aWMgaW50IHdtX3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlpbnQgdm9pY2VzID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gODsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKQEAgLTQ1Niw3ICs0ODcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtX3ZvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB3bV92b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHBoYXNlMjhfc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKQEAgLTQ3MCw3ICs1MDIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB3bV92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHBoYXNlMjhfc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKQEAgLTUwMSw3ICs1MzQsOCBAQAogLyoKICAqIFdNODc3MCBtdXRlIGNvbnRyb2wKICAqLwotc3RhdGljIGludCB3bV9tdXRlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pIHsKK3N0YXRpYyBpbnQgd21fbXV0ZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykgewogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOwogCXVpbmZvLT5jb3VudCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDg7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKQEAgLTUwOSw3ICs1NDMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgd21fbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgcGhhc2UyOF9zcGVjICpzcGVjID0gaWNlLT5zcGVjOwpAQCAtNTI0LDcgKzU1OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd21fbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB3bV9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBwaGFzZTI4X3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7CkBAIC01MzksOSArNTc1LDEwIEBACiAJCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSAhPSB2YWwpIHsKIAkJCXNwZWMtPnZvbFtvZnMgKyBpXSAmPSB+V01fVk9MX01VVEU7CiAJCQlzcGVjLT52b2xbb2ZzICsgaV0gfD0KLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA/IDAgOiBXTV9WT0xfTVVURTsKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA/IDAgOgorCQkJCVdNX1ZPTF9NVVRFOwogCQkJd21fc2V0X3ZvbChpY2UsIG9mcyArIGksIHNwZWMtPnZvbFtvZnMgKyBpXSwKLQkJCQkgICBzcGVjLT5tYXN0ZXJbaV0pOworCQkJCQlzcGVjLT5tYXN0ZXJbaV0pOwogCQkJY2hhbmdlID0gMTsKIAkJfQogCX0KQEAgLTU1NSw3ICs1OTIsOCBAQAogICovCiAjZGVmaW5lIHdtX21hc3Rlcl9tdXRlX2luZm8JCXNuZF9jdGxfYm9vbGVhbl9zdGVyZW9faW5mbwogCi1zdGF0aWMgaW50IHdtX21hc3Rlcl9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHdtX21hc3Rlcl9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgcGhhc2UyOF9zcGVjICpzcGVjID0gaWNlLT5zcGVjOwpAQCAtNTY3LDcgKzYwNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd21fbWFzdGVyX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgd21fbWFzdGVyX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBwaGFzZTI4X3NwZWMgKnNwZWMgPSBpY2UtPnNwZWM7CkBAIC01ODAsMTEgKzYxOSwxMiBAQAogCQkJaW50IGRhYzsKIAkJCXNwZWMtPm1hc3RlcltpXSAmPSB+V01fVk9MX01VVEU7CiAJCQlzcGVjLT5tYXN0ZXJbaV0gfD0KLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA/IDAgOiBXTV9WT0xfTVVURTsKKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA/IDAgOgorCQkJCVdNX1ZPTF9NVVRFOwogCQkJZm9yIChkYWMgPSAwOyBkYWMgPCBpY2UtPm51bV90b3RhbF9kYWNzOyBkYWMgKz0gMikKIAkJCQl3bV9zZXRfdm9sKGljZSwgV01fREFDX0FUVEVOICsgZGFjICsgaSwKLQkJCQkJICAgc3BlYy0+dm9sW2RhYyArIGldLAotCQkJCQkgICBzcGVjLT5tYXN0ZXJbaV0pOworCQkJCQkJc3BlYy0+dm9sW2RhYyArIGldLAorCQkJCQkJc3BlYy0+bWFzdGVyW2ldKTsKIAkJCWNoYW5nZSA9IDE7CiAJCX0KIAl9CkBAIC01OTcsNyArNjM3LDggQEAKICNkZWZpbmUgUENNXzBkQiAweGZmCiAjZGVmaW5lIFBDTV9SRVMgMTI4CS8qIC02NGRCICovCiAjZGVmaW5lIFBDTV9NSU4gKFBDTV8wZEIgLSBQQ01fUkVTKQotc3RhdGljIGludCB3bV9wY21fdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCitzdGF0aWMgaW50IHdtX3BjbV92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IDE7CkBAIC02MDYsNyArNjQ3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bV9wY21fdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHdtX3BjbV92b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIHNob3J0IHZhbDsKQEAgLTYxOSw3ICs2NjEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtX3BjbV92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgd21fcGNtX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgc2hvcnQgb3ZvbCwgbnZvbDsKQEAgLTYzMyw3ICs2NzYsOCBAQAogCW92b2wgPSB3bV9nZXQoaWNlLCBXTV9EQUNfRElHX01BU1RFUl9BVFRFTikgJiAweGZmOwogCWlmIChvdm9sICE9IG52b2wpIHsKIAkJd21fcHV0KGljZSwgV01fREFDX0RJR19NQVNURVJfQVRURU4sIG52b2wpOyAvKiBwcmVsYXRjaCAqLwotCQl3bV9wdXRfbm9jYWNoZShpY2UsIFdNX0RBQ19ESUdfTUFTVEVSX0FUVEVOLCBudm9sIHwgMHgxMDApOyAvKiB1cGRhdGUgKi8KKwkJLyogdXBkYXRlICovCisJCXdtX3B1dF9ub2NhY2hlKGljZSwgV01fREFDX0RJR19NQVNURVJfQVRURU4sIG52b2wgfCAweDEwMCk7CiAJCWNoYW5nZSA9IDE7CiAJfQogCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKQEAgLTY0NSwxOCArNjg5LDIyIEBACiAgKi8KICNkZWZpbmUgcGhhc2UyOF9kZWVtcF9pbmZvCXNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8KIAotc3RhdGljIGludCBwaGFzZTI4X2RlZW1wX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHBoYXNlMjhfZGVlbXBfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHdtX2dldChpY2UsIFdNX0RBQ19DVFJMMikgJiAweGYpID09IDB4ZjsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh3bV9nZXQoaWNlLCBXTV9EQUNfQ1RSTDIpICYgMHhmKSA9PQorCQkJCQkJMHhmOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoYXNlMjhfZGVlbXBfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgcGhhc2UyOF9kZWVtcF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IHRlbXAsIHRlbXAyOwotCXRlbXAyID0gdGVtcCA9IHdtX2dldChpY2UsIFdNX0RBQ19DVFJMMik7CisJdGVtcCA9IHdtX2dldChpY2UsIFdNX0RBQ19DVFJMMik7CisJdGVtcDIgPSB0ZW1wOwogCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJdGVtcCB8PSAweGY7CiAJZWxzZQpAQCAtNjcxLDcgKzcxOSw4IEBACiAvKgogICogQURDIE92ZXJzYW1wbGluZwogICovCi1zdGF0aWMgaW50IHBoYXNlMjhfb3ZlcnNhbXBsaW5nX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqaywgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3N0YXRpYyBpbnQgcGhhc2UyOF9vdmVyc2FtcGxpbmdfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0YXRpYyBjaGFyICp0ZXh0c1syXSA9IHsgIjEyOHgiLCAiNjR4Igl9OwogCkBAIC02ODAsMjUgKzcyOSwzMSBAQAogCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKIAogCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOwotCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtCisJCQkJCQkxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCQl0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CiAKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGhhc2UyOF9vdmVyc2FtcGxpbmdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHdtX2dldChpY2UsIFdNX01BU1RFUikgJiAweDgpID09IDB4ODsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGFzZTI4X292ZXJzYW1wbGluZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCBwaGFzZTI4X292ZXJzYW1wbGluZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAod21fZ2V0KGljZSwgV01fTUFTVEVSKSAmIDB4OCkgPT0KKwkJCQkJCTB4ODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaGFzZTI4X292ZXJzYW1wbGluZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCWludCB0ZW1wLCB0ZW1wMjsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAotCXRlbXAyID0gdGVtcCA9IHdtX2dldChpY2UsIFdNX01BU1RFUik7CisJdGVtcCA9IHdtX2dldChpY2UsIFdNX01BU1RFUik7CisJdGVtcDIgPSB0ZW1wOwogCiAJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pCiAJCXRlbXAgfD0gMHg4OwpAQCAtODcxLDEzICs5MjYsMTYgQEAKIAogCWNvdW50cyA9IEFSUkFZX1NJWkUocGhhc2UyOF9kYWNfY29udHJvbHMpOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudHM7IGkrKykgewotCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmcGhhc2UyOF9kYWNfY29udHJvbHNbaV0sIGljZSkpOworCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsCisJCQkJCXNuZF9jdGxfbmV3MSgmcGhhc2UyOF9kYWNfY29udHJvbHNbaV0sCisJCQkJCQkJaWNlKSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bV9jb250cm9scyk7IGkrKykgewotCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsIHNuZF9jdGxfbmV3MSgmd21fY29udHJvbHNbaV0sIGljZSkpOworCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsCisJCQkJCXNuZF9jdGxfbmV3MSgmd21fY29udHJvbHNbaV0sIGljZSkpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtOTA0LDUgKzk2MiwxNCBAQAogCQkuZWVwcm9tX3NpemUgPSBzaXplb2YocGhhc2UyOF9lZXByb20pLAogCQkuZWVwcm9tX2RhdGEgPSBwaGFzZTI4X2VlcHJvbSwKIAl9LAorCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfVFMyMiwKKwkJLm5hbWUgPSAiVGVycmFzb25pcSBUUzIyIFBDSSIsCisJCS5tb2RlbCA9ICJUUzIyIiwKKwkJLmNoaXBfaW5pdCA9IHBoYXNlMjJfaW5pdCwKKwkJLmJ1aWxkX2NvbnRyb2xzID0gcGhhc2UyMl9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZihwaGFzZTIyX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IHBoYXNlMjJfZWVwcm9tLAorCX0sCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaAppbmRleCAxM2U4NDFiLi43ZmMyMmQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmgKQEAgLTIyLDEzICsyMiwxNSBAQAogICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqCi0gKi8gICAgICAKKyAqLwogCi0jZGVmaW5lIFBIQVNFX0RFVklDRV9ERVNDICJ7VGVycmF0ZWMsUGhhc2UgMjJ9LCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ7VGVycmF0ZWMsUGhhc2UgMjh9LCIKKyNkZWZpbmUgUEhBU0VfREVWSUNFX0RFU0MJIntUZXJyYXRlYyxQaGFzZSAyMn0sIlwKKwkJCQkie1RlcnJhdGVjLFBoYXNlIDI4fSwiXAorCQkJCSJ7VGVycmFzb25pcSxUUzIyfSwiCiAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyCTB4M2IxNTUwMTEKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTI4CTB4M2IxNTQ5MTEKKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9UUzIyCQkweDNiMTU3YjExCiAKIC8qIGVudHJ5IHBvaW50ICovCiBleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3BoYXNlX2NhcmRzW107CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCmluZGV4IDIwM2NkYzFiZi4uNmJjM2Y5MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKQEAgLTQzLDcgKzQzLDggQEAKIC8qIFdNODc3NiByZWdpc3RlcnMgKi8KICNkZWZpbmUgV01fSFBfQVRURU5fTAkJMHgwMAkvKiBoZWFkcGhvbmUgbGVmdCBhdHRlbnVhdGlvbiAqLwogI2RlZmluZSBXTV9IUF9BVFRFTl9SCQkweDAxCS8qIGhlYWRwaG9uZSBsZWZ0IGF0dGVudWF0aW9uICovCi0jZGVmaW5lIFdNX0hQX01BU1RFUgkJMHgwMgkvKiBoZWFkcGhvbmUgbWFzdGVyIChib3RoIGNoYW5uZWxzKSwgb3ZlcnJpZGUgTExSICovCisjZGVmaW5lIFdNX0hQX01BU1RFUgkJMHgwMgkvKiBoZWFkcGhvbmUgbWFzdGVyIChib3RoIGNoYW5uZWxzKSAqLworCQkJCQkvKiBvdmVycmlkZSBMTFIgKi8KICNkZWZpbmUgV01fREFDX0FUVEVOX0wJCTB4MDMJLyogZGlnaXRhbCBsZWZ0IGF0dGVudWF0aW9uICovCiAjZGVmaW5lIFdNX0RBQ19BVFRFTl9SCQkweDA0CiAjZGVmaW5lIFdNX0RBQ19NQVNURVIJCTB4MDUKQEAgLTc0MCw3ICs3NDEsNyBAQAogCQlXTV9EQUNfQVRURU5fTCwJMHgwMTAwLAkvKiBEQUMgMGRCICovCiAJCVdNX0RBQ19BVFRFTl9SLAkweDAwMDAsCS8qIERBQyAwZEIgKi8KIAkJV01fREFDX0FUVEVOX1IsCTB4MDEwMCwJLyogREFDIDBkQiAqLwotCQkvLyBXTV9EQUNfTUFTVEVSLAkweDAxMDAsCS8qIERBQyBtYXN0ZXIgbXV0ZWQgKi8KKwkJLyogV01fREFDX01BU1RFUiwJMHgwMTAwLCAqLwkvKiBEQUMgbWFzdGVyIG11dGVkICovCiAJCVdNX1BIQVNFX1NXQVAsCTB4MDAwMCwJLyogcGhhc2Ugbm9ybWFsICovCiAJCVdNX0RBQ19DVFJMMiwJMHgwMDAwLAkvKiBubyBkZWVtcGhhc2lzLCBubyBaRkxHICovCiAJCVdNX0FEQ19BVFRFTl9MLAkweDAwMDAsCS8qIEFEQyBtdXRlZCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jCmluZGV4IDRkMjYzMTQuLmI1MDhiYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogICBBTFNBIGRyaXZlciBmb3IgSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpCiAgKgotICogICBMb3dsZXZlbCBmdW5jdGlvbnMgZm9yIE0tQXVkaW8gUmV2b2x1dGlvbiA3LjEKKyAqICAgTG93bGV2ZWwgZnVuY3Rpb25zIGZvciBNLUF1ZGlvIEF1ZGlvcGhpbGUgMTkyLCBSZXZvbHV0aW9uIDcuMSBhbmQgNS4xCiAgKgogICoJQ29weXJpZ2h0IChjKSAyMDAzIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KICAqCkBAIC00OCw3ICs0OCw3IEBACiB9CiAKIC8qCi0gKiBjaGFuZ2UgdGhlIHJhdGUgb2YgZW52eTI0SFQsIEFLNDM1NSBhbmQgQUs0MzgxCisgKiBjaGFuZ2UgdGhlIHJhdGUgb2YgRW52eTI0SFQsIEFLNDM1NSBhbmQgQUs0MzgxCiAgKi8KIHN0YXRpYyB2b2lkIHJldm9fc2V0X3JhdGVfdmFsKHN0cnVjdCBzbmRfYWttNHh4eCAqYWssIHVuc2lnbmVkIGludCByYXRlKQogewpAQCAtODMsOCArODMsOCBAQAogCXRtcCA9IHNuZF9ha200eHh4X2dldChhaywgMCwgcmVnKTsKIAl0bXAgJj0gfigweDAzIDw8IHNoaWZ0KTsKIAl0bXAgfD0gZGZzIDw8IHNoaWZ0OwotCS8vIHNuZF9ha200eHh4X3dyaXRlKGFrLCAwLCByZWcsIHRtcCk7Ci0Jc25kX2FrbTR4eHhfc2V0KGFrLCAwLCByZWcsIHRtcCk7IC8qIHRoZSB2YWx1ZSBpcyB3cml0dGVuIGluIHJlc2V0KDApICovCisJLyogc25kX2FrbTR4eHhfd3JpdGUoYWssIDAsIHJlZywgdG1wKTsgKi8KKwlzbmRfYWttNHh4eF9zZXQoYWssIDAsIHJlZywgdG1wKTsgLyogdmFsdWUgaXMgd3JpdHRlbiBpbiByZXNldCgwKSAqLwogCXNuZF9ha200eHh4X3Jlc2V0KGFrLCAwKTsKIH0KIApAQCAtMjE2LDYgKzIxNiw3IEBACiAJQUtfREFDKCJQQ00gQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDEpLAogCUFLX0RBQygiUENNIExGRSBQbGF5YmFjayBWb2x1bWUiLCAxKSwKIAlBS19EQUMoIlBDTSBSZWFyIFBsYXliYWNrIFZvbHVtZSIsIDIpLAorCUFLX0RBQygiUENNIEhlYWRwaG9uZSBWb2x1bWUiLCAyKSwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpyZXZvNTFfYWRjX2lucHV0X25hbWVzW10gPSB7CkBAIC0yNzksNyArMjgwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzU4LAotCS5udW1fZGFjcyA9IDYsCisJLm51bV9kYWNzID0gOCwKIAkub3BzID0gewogCQkuc2V0X3JhdGVfdmFsID0gcmV2b19zZXRfcmF0ZV92YWwKIAl9LApAQCAtNTA4LDcgKzUwOSw3IEBACiAJCWljZS0+Z3Bpby5pMnNfbWNsa19jaGFuZ2VkID0gcmV2b19pMnNfbWNsa19jaGFuZ2VkOwogCQlicmVhazsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjUxOgotCQlpY2UtPm51bV90b3RhbF9kYWNzID0gNjsKKwkJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CiAJCWljZS0+bnVtX3RvdGFsX2FkY3MgPSAyOwogCQlicmVhazsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfQVVESU9QSElMRTE5MjoKQEAgLTUyNCwxNiArNTI1LDIwIEBACiAJYWsgPSBpY2UtPmFrbSA9IGtjYWxsb2MoMiwgc2l6ZW9mKHN0cnVjdCBzbmRfYWttNHh4eCksIEdGUF9LRVJORUwpOwogCWlmICghIGFrKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpY2UtPmFrbV9jb2RlY3MgPSAyOwogCXN3aXRjaCAoaWNlLT5lZXByb20uc3VidmVuZG9yKSB7CiAJY2FzZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MToKIAkJaWNlLT5ha21fY29kZWNzID0gMjsKLQkJaWYgKChlcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fcmV2b19mcm9udCwgJmFrbV9yZXZvX2Zyb250X3ByaXYsIGljZSkpIDwgMCkKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX3Jldm9fZnJvbnQsCisJCQkJCQkmYWttX3Jldm9fZnJvbnRfcHJpdiwgaWNlKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhayArIDEsICZha21fcmV2b19zdXJyb3VuZCwgJmFrbV9yZXZvX3N1cnJvdW5kX3ByaXYsIGljZSkpIDwgMCkKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrKzEsICZha21fcmV2b19zdXJyb3VuZCwKKwkJCQkJCSZha21fcmV2b19zdXJyb3VuZF9wcml2LCBpY2UpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCS8qIHVubXV0ZSBhbGwgY29kZWNzICovCi0JCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGVfYml0cyhpY2UsIFZUMTcyNF9SRVZPX01VVEUsIFZUMTcyNF9SRVZPX01VVEUpOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlX2JpdHMoaWNlLCBWVDE3MjRfUkVWT19NVVRFLAorCQkJCQkJVlQxNzI0X1JFVk9fTVVURSk7CiAJCWJyZWFrOwogCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9SRVZPTFVUSU9ONTE6CiAJCWljZS0+YWttX2NvZGVjcyA9IDI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jCmluZGV4IGEwOGQxN2MuLjVhZjllODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jCkBAIC0xLDEyICsxLDEyIEBACiAvKgogICoJQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgVlQxNzI0IChFbnZ5MjRIVCkKLSAqCQorICoKICAqCUxvd2xldmVsIGZ1bmN0aW9ucyBmb3IgRWdvIFN5cyBXYXZldGVybWluYWwgMTkyTQogICoKICAqCQlDb3B5cmlnaHQgKGMpIDIwMDYgR3VlZGV6IENsZW1lbnQgPGtsZW0uZGV2QGdtYWlsLmNvbT4KICAqCQlTb21lIGZ1bmN0aW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgUHJvZGlneTE5MiBkcml2ZXIKICAqCQlzb3VyY2UKLSAqCQkKKyAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yMCwxMiArMjAsMTIgQEAKICAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqCQotICovCQorICoKKyAqLwogCiAKIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zOSw5ICszOSw5IEBACiAKIAogLyoKLSAqCTIqQURDIDYqREFDIG5vMSByaW5nYnVmZmVyIHIvdyBvbiBpMmMgYnVzIAorICoJMipBREMgNipEQUMgbm8xIHJpbmdidWZmZXIgci93IG9uIGkyYyBidXMKICAqLwotc3RhdGljIGlubGluZSB2b2lkIHN0YWM5NDYwX3B1dChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywgCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhYzk0NjBfcHV0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCBpbnQgcmVnLAogCQkJCQkJdW5zaWduZWQgY2hhciB2YWwpCiB7CiAJc25kX3Z0MTcyNF93cml0ZV9pMmMoaWNlLCBTVEFDOTQ2MF9JMkNfQUREUiwgcmVnLCB2YWwpOwpAQCAtNzMsNyArNzMsNyBAQAogI2RlZmluZSBzdGFjOTQ2MF9kYWNfbXV0ZV9pbmZvCQlzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvCiAKIHN0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKQEAgLTg4LDE0ICs4OCwxNCBAQAogCX0KIAlpZiAoaWQgPCA2KQogCQl2YWwgPSBzdGFjOTQ2MF9nZXQoaWNlLCBpZHgpOwotCWVsc2UgCi0JCXZhbCA9IHN0YWM5NDYwXzJfZ2V0KGljZSxpZHggLSA2KTsKKwllbHNlCisJCXZhbCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgaWR4IC0gNik7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAofnZhbCA+PiA3KSAmIDB4MTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CkBAIC0xMDUsOCArMTA1LDggQEAKIAlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKIAkJaWR4ID0gU1RBQzk0NlhfTUFTVEVSX1ZPTFVNRTsKIAkJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKLQkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTw8IDcgJiAweDgwKSB8Ci0JCSAgICAgICAJCQkJCShvbGQgJiB+MHg4MCk7CisJCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNyAmIDB4ODApIHwKKwkJCQkJCQkob2xkICYgfjB4ODApOwogCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJCWlmIChjaGFuZ2UpIHsKIAkJCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgbmV3KTsKQEAgLTExNywxNiArMTE3LDE2IEBACiAJCWlkeCA9IGlkICsgU1RBQzk0NlhfTEZfVk9MVU1FOwogCQlpZiAoaWQgPCA2KQogCQkJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKLQkJZWxzZSAKKwkJZWxzZQogCQkJb2xkID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBpZHggLSA2KTsKLQkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTw8IDcgJiAweDgwKSB8CisJCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNyAmIDB4ODApIHwKIAkJCQkJCQkob2xkICYgfjB4ODApOwogCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJCWlmIChjaGFuZ2UpIHsKIAkJCWlmIChpZCA8IDYpCi0JCQkgICAgICAgCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgbmV3KTsKKwkJCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsIG5ldyk7CiAJCQllbHNlCi0JCQkgICAgICAgCXN0YWM5NDYwXzJfcHV0KGljZSwgaWR4IC0gNiwgbmV3KTsKKwkJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeCAtIDYsIG5ldyk7CiAJCX0KIAl9CiAJcmV0dXJuIGNoYW5nZTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICogCURBQyB2b2x1bWUgYXR0ZW51YXRpb24gbWl4ZXIgY29udHJvbAogICovCiBzdGF0aWMgaW50IHN0YWM5NDYwX2RhY192b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IDE7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IGlkeCwgaWQ7CkBAIC0xNjEsMTQgKzE2MSwxNCBAQAogCX0KIAlpZiAoaWQgPCA2KQogCQl2b2wgPSBzdGFjOTQ2MF9nZXQoaWNlLCBpZHgpICYgMHg3ZjsKLQllbHNlIAorCWVsc2UKIAkJdm9sID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBpZHggLSA2KSAmIDB4N2Y7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAweDdmIC0gdm9sOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN0YWM5NDYwX2RhY192b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgaWR4LCBpZDsKQEAgLTE4Miw4ICsxODIsOCBAQAogCQlvdm9sID0gMHg3ZiAtICh0bXAgJiAweDdmKTsKIAkJY2hhbmdlID0gKG92b2wgIT0gbnZvbCk7CiAJCWlmIChjaGFuZ2UpIHsKLQkJCSBzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCkpOwotCQkJIHN0YWM5NDYwXzJfcHV0KGljZSwgaWR4LCAoMHg3ZiAtIG52b2wpIHwgKHRtcCAmIDB4ODApKTsKKwkJCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgKDB4N2YgLSBudm9sKSB8ICh0bXAgJiAweDgwKSk7CisJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIGlkeCwgKDB4N2YgLSBudm9sKSB8ICh0bXAgJiAweDgwKSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwpAQCAtMTkxLDE3ICsxOTEsMTcgQEAKIAkJbnZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMHg3ZjsKIAkJaWYgKGlkIDwgNikKIAkJCXRtcCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7Ci0JCWVsc2UgCisJCWVsc2UKIAkJCXRtcCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgaWR4IC0gNik7CiAJCW92b2wgPSAweDdmIC0gKHRtcCAmIDB4N2YpOwogCQljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKIAkJaWYgKGNoYW5nZSkgewogCQkJaWYgKGlkIDwgNikKIAkJCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfAotCQkJCQkgICAgICAgCQkodG1wICYgMHg4MCkpOwotCQkJZWxzZSAKKwkJCQkJCQkodG1wICYgMHg4MCkpOworCQkJZWxzZQogCQkJCXN0YWM5NDYwXzJfcHV0KGljZSwgaWR4LTYsICgweDdmIC0gbnZvbCkgfAotCQkJCQkgICAgICAgCQkJKHRtcCAmIDB4ODApKTsKKwkJCQkJCQkodG1wICYgMHg4MCkpOwogCQl9CiAJfQogCXJldHVybiBjaGFuZ2U7CkBAIC0yMTMsMTIgKzIxMywxMiBAQAogI2RlZmluZSBzdGFjOTQ2MF9hZGNfbXV0ZV9pbmZvCQlzbmRfY3RsX2Jvb2xlYW5fc3RlcmVvX2luZm8KIAogc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGNoYXIgdmFsOwogCWludCBpLCBpZDsKLQkKKwogCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CiAJaWYgKGlkID09IDApIHsKIAkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewpAQCAtMjM1LDIwICsyMzUsMjAgQEAKIH0KIAogc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CiAJaW50IGksIHJlZywgaWQ7CiAJaW50IGNoYW5nZTsKLQkKKwogCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CiAJaWYgKGlkID09IDApIHsKIAkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewogCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKIAkJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIHJlZyk7CiAJCQluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldPDw3JjB4ODApIHwKLQkJCSAgICAgICAJCQkJCShvbGQmfjB4ODApOworCQkJCQkJCQkob2xkJn4weDgwKTsKIAkJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKIAkJCWlmIChjaGFuZ2UpCiAJCQkJc3RhYzk0NjBfcHV0KGljZSwgcmVnLCBuZXcpOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOwogCQkJb2xkID0gc3RhYzk0NjBfMl9nZXQoaWNlLCByZWcpOwogCQkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTw8NyYweDgwKSB8Ci0JCQkgICAgICAgCQkJCQkob2xkJn4weDgwKTsKKwkJCQkJCQkJKG9sZCZ+MHg4MCk7CiAJCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CiAJCQlpZiAoY2hhbmdlKQogCQkJCXN0YWM5NDYwXzJfcHV0KGljZSwgcmVnLCBuZXcpOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAgKkFEQyBnYWluIG1peGVyIGNvbnRyb2wKICAqLwogc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKIAl1aW5mby0+Y291bnQgPSAyOwpAQCAtMjgxLDEyICsyODEsMTIgQEAKIH0KIAogc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IGksIHJlZywgaWQ7CiAJdW5zaWduZWQgY2hhciB2b2w7Ci0JCisKIAlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCWlmIChpZCA9PSAwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKQEAgLTMwNSwxMyArMzA1LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IGksIHJlZywgaWQ7CiAJdW5zaWduZWQgY2hhciBvdm9sLCBudm9sOwogCWludCBjaGFuZ2U7Ci0JCisKIAlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCWlmIChpZCA9PSAwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKQEAgLTMyMSw3ICszMjEsNyBAQAogCQkJY2hhbmdlID0gKChvdm9sICYgMHgwZikgIT0gbnZvbCk7CiAJCQlpZiAoY2hhbmdlKQogCQkJCXN0YWM5NDYwX3B1dChpY2UsIHJlZywgKDB4MGYgLSBudm9sKSB8Ci0JCQkJCSAgICAgICAJCShvdm9sICYgfjB4MGYpKTsKKwkJCQkJCQkob3ZvbCAmIH4weDBmKSk7CiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJCWNoYW5nZSA9ICgob3ZvbCAmIDB4MGYpICE9IG52b2wpOwogCQkJaWYgKGNoYW5nZSkKIAkJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIHJlZywgKDB4MGYgLSBudm9sKSB8Ci0JCQkJCSAgICAgICAJCShvdm9sICYgfjB4MGYpKTsKKwkJCQkJCQkob3ZvbCAmIH4weDBmKSk7CiAJCX0KIAl9CiAJcmV0dXJuIGNoYW5nZTsKQEAgLTM0NCwyMyArMzQ0LDIzIEBACiAjZGVmaW5lIHN0YWM5NDYwX21pY19zd19pbmZvCQlzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvCiAKIHN0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkgICAgICAgCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIAlpbnQgaWQ7Ci0JCQorCiAJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKIAlpZiAoaWQgPT0gMCkKLQkgICAgICAgCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CisJCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CiAJZWxzZQotCSAgICAgICAJdmFsID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOworCQl2YWwgPSBzdGFjOTQ2MF8yX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB+dmFsPj43ICYgMHgxOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN0YWM5NDYwX21pY19zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgY2hhciBuZXcsIG9sZDsKQEAgLTM2OCwxNiArMzY4LDE2IEBACiAKIAlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCWlmIChpZCA9PSAwKQotCSAgICAgICAJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwkJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKIAllbHNlCi0JICAgICAgIAlvbGQgPSBzdGFjOTQ2MF8yX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7Ci0JbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTw8IDcgJiAweDgwKSB8IChvbGQgJiB+MHg4MCk7CisJCW9sZCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIDw8IDcgJiAweDgwKSB8IChvbGQgJiB+MHg4MCk7CiAJY2hhbmdlID0gKG5ldyAhPSBvbGQpOwogCWlmIChjaGFuZ2UpIHsKIAkJaWYgKGlkID09IDApCi0JCSAgICAgICAJc3RhYzk0NjBfcHV0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFLCBuZXcpOworCQkJc3RhYzk0NjBfcHV0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFLCBuZXcpOwogCQllbHNlCi0JCSAgICAgICAJc3RhYzk0NjBfMl9wdXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UsIG5ldyk7CisJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSwgbmV3KTsKIAl9CiAJcmV0dXJuIGNoYW5nZTsKIH0KQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQkuZ2V0ID0gc3RhYzk0NjBfYWRjX3ZvbF9nZXQsCiAJCS5wdXQgPSBzdGFjOTQ2MF9hZGNfdm9sX3B1dCwKIAotCX0JCisJfQogfTsKIAogCkBAIC00NzAsNyArNDcwLDcgQEAKIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKIAl1bnNpZ25lZCBzaG9ydCAqcDsKLQkJCisKIAkvKldUTSAxOTJNKi8KIAlpY2UtPm51bV90b3RhbF9kYWNzID0gODsKIAlpY2UtPm51bV90b3RhbF9hZGNzID0gNDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5oIGIvc291bmQvcGNpL2ljZTE3MTIvd3RtLmgKaW5kZXggMDNhMzk0ZS4uNDIzYzFhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvd3RtLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvd3RtLmgKQEAgLTEwLDggKzEwLDggQEAKICAqLwogCiAjZGVmaW5lCUFLNDExNF9BRERSCQkweDIwCS8qUy9QRElGIHJlY2VpdmVyKi8KLSNkZWZpbmUgU1RBQzk0NjBfSTJDX0FERFIJMHg1NAkvKiBBREMqMiB8IERBQyo2ICovCQotI2RlZmluZSBTVEFDOTQ2MF8yX0kyQ19BRERSCTB4NTYJLyogQURDfERBQyAqMiAqLwkKKyNkZWZpbmUgU1RBQzk0NjBfSTJDX0FERFIJMHg1NAkvKiBBREMqMiB8IERBQyo2ICovCisjZGVmaW5lIFNUQUM5NDYwXzJfSTJDX0FERFIJMHg1NgkvKiBBREN8REFDICoyICovCiAKIAogZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF93dG1fY2FyZHNbXTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggMDQ4ZDk5ZS4uYzg4ZDFlYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTU5LDYgKzU5LDEyIEBACiAJCSJ7U2lTLFNJNzAxMn0sIgogCQkie05WaWRpYSxuRm9yY2UgQXVkaW99LCIKIAkJIntOVmlkaWEsbkZvcmNlMiBBdWRpb30sIgorCQkie05WaWRpYSxuRm9yY2UzIEF1ZGlvfSwiCisJCSJ7TlZpZGlhLE1DUDA0fSwiCisJCSJ7TlZpZGlhLE1DUDUwMX0sIgorCQkie05WaWRpYSxDSzgwNH0sIgorCQkie05WaWRpYSxDSzh9LCIKKwkJIntOVmlkaWEsQ0s4U30sIgogCQkie0FNRCxBTUQ3Njh9LCIKIAkJIntBTUQsQU1EODExMX0sIgogCSAgICAgICAgIntBTEksTTU0NTV9fSIpOwpAQCAtNzcsNyArODMsNyBAQAogbW9kdWxlX3BhcmFtKGlkLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBJbnRlbCBpOHgwIHNvdW5kY2FyZC4iKTsKIG1vZHVsZV9wYXJhbShhYzk3X2Nsb2NrLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhhYzk3X2Nsb2NrLCAiQUMnOTcgY29kZWMgY2xvY2sgKDAgPSBhdXRvLWRldGVjdCkuIik7CitNT0RVTEVfUEFSTV9ERVNDKGFjOTdfY2xvY2ssICJBQyc5NyBjb2RlYyBjbG9jayAoMCA9IHdoaXRlbGlzdCArIGF1dG8tZGV0ZWN0LCAxID0gZm9yY2UgYXV0b2RldGVjdCkuIik7CiBtb2R1bGVfcGFyYW0oYWM5N19xdWlyaywgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhYzk3X3F1aXJrLCAiQUMnOTcgd29ya2Fyb3VuZCBmb3Igc3RyYW5nZSBoYXJkd2FyZS4iKTsKIG1vZHVsZV9wYXJhbShidWdneV9zZW1hcGhvcmUsIGJvb2wsIDA0NDQpOwpAQCAtMTk1Nyw2ICsxOTYzLDEyIEBACiAJfSwKIAl7CiAJCS5zdWJ2ZW5kb3IgPSAweDEwY2YsCisJCS5zdWJkZXZpY2UgPSAweDEyN2QsCisJCS5uYW1lID0gIkZ1aml0c3UgTGlmZWJvb2sgUDcwMTAiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwY2YsCiAJCS5zdWJkZXZpY2UgPSAweDEyN2UsCiAJCS5uYW1lID0gIkZ1aml0c3UgTGlmZWJvb2sgQzEyMTFEIiwKIAkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQpAQCAtMjEzMiw4ICsyMTQ0LDggQEAKIAkJCQlzbmRfaW50ZWw4eDBfY29kZWNfcmVhZF90ZXN0KGNoaXAsIGNvZGVjcyk7CiAJCQkJY2hpcC0+YWM5N19zZGluW2NvZGVjc10gPQogCQkJCQlpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoU0RNKSkgJiBJQ0hfTERJX01BU0s7Ci0JCQkJc25kX2Fzc2VydChjaGlwLT5hYzk3X3NkaW5bY29kZWNzXSA8IDMsCi0JCQkJCSAgIGNoaXAtPmFjOTdfc2Rpbltjb2RlY3NdID0gMCk7CisJCQkJaWYgKHNuZF9CVUdfT04oY2hpcC0+YWM5N19zZGluW2NvZGVjc10gPj0gMykpCisJCQkJCWNoaXAtPmFjOTdfc2Rpbltjb2RlY3NdID0gMDsKIAkJCX0gZWxzZQogCQkJCWNoaXAtPmFjOTdfc2Rpbltjb2RlY3NdID0gaTsKIAkJCWNvZGVjcysrOwpAQCAtMjY4Niw2ICsyNjk4LDI4IEBACiAJc25kX2FjOTdfdXBkYXRlX3Bvd2VyKGNoaXAtPmFjOTdbMF0sIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCAwKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGludGVsOHgwX2Nsb2NrX2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgwZTExLCAweDAwOGEsICJBRDE4ODUiLCA0MTAwMCksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDBiZSwgIkFEMTg4NSIsIDQ0MTAwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMTc3LCAiQUQxOTgwIiwgNDgwMDApLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgwZjMsICJBRDE5ODUiLCA0ODAwMCksCisJeyB9CS8qIHRlcm1pbmF0b3IgKi8KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGludGVsOHgwX2luX2Nsb2NrX2xpc3Qoc3RydWN0IGludGVsOHgwICpjaGlwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSBjaGlwLT5wY2k7CisJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKndsOworCisJd2wgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIGludGVsOHgwX2Nsb2NrX2xpc3QpOworCWlmICghd2wpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX0lORk8gImludGVsOHgwOiB3aGl0ZSBsaXN0IHJhdGUgZm9yICUwNHg6JTA0eCBpcyAlaVxuIiwKKwkgICAgICAgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UsIHdsLT52YWx1ZSk7CisJY2hpcC0+YWM5N19idXMtPmNsb2NrID0gd2wtPnZhbHVlOworCXJldHVybiAxOworfQorCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyB2b2lkIHNuZF9pbnRlbDh4MF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICogZW50cnksCiAJCQkJICAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQpAQCAtMzA4MSw4ICszMTE1LDE0IEBACiAJCSAiJXMgd2l0aCAlcyBhdCBpcnEgJWkiLCBjYXJkLT5zaG9ydG5hbWUsCiAJCSBzbmRfYWM5N19nZXRfc2hvcnRfbmFtZShjaGlwLT5hYzk3WzBdKSwgY2hpcC0+aXJxKTsKIAotCWlmICghIGFjOTdfY2xvY2spCi0JCWludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhjaGlwKTsKKwlpZiAoYWM5N19jbG9jayA9PSAwIHx8IGFjOTdfY2xvY2sgPT0gMSkgeworCQlpZiAoYWM5N19jbG9jayA9PSAwKSB7CisJCQlpZiAoaW50ZWw4eDBfaW5fY2xvY2tfbGlzdChjaGlwKSA9PSAwKQorCQkJCWludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhjaGlwKTsKKwkJfSBlbHNlIHsKKwkJCWludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhjaGlwKTsKKwkJfQorCX0KIAogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwbS5jIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCmluZGV4IGZhZjY3NGUuLjkzNDQ5ZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKQEAgLTMwNiw3ICszMDYsOCBAQAogCXN0YXRpYyB1bnNpZ25lZCBpbnQgY29kZWNfYml0WzNdID0gewogCQlJQ0hfUENSLCBJQ0hfU0NSLCBJQ0hfVENSCiAJfTsKLQlzbmRfYXNzZXJ0KGNvZGVjIDwgMywgcmV0dXJuIElDSF9QQ1IpOworCWlmIChzbmRfQlVHX09OKGNvZGVjID49IDMpKQorCQlyZXR1cm4gSUNIX1BDUjsKIAlyZXR1cm4gY29kZWNfYml0W2NvZGVjXTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwppbmRleCA0YTQ0YzBmLi41ZjgwMDZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMTI4MSw3ICsxMjgxLDggQEAKIAogCUsxMjEyX0RFQlVHX1BSSU5US19WRVJCT1NFKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX3NpbGVuY2UgcG9zPSVkIG9mZnNldD0lZCBzaXplPSVkIGNvdW50PSVkXG4iLAogCQkJCSAgIHBvcywgb2Zmc2V0LCBzaXplLCBjb3VudCk7Ci0Jc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBLMTIxMl9NQVhfU0FNUExFUywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHBvcyArIGNvdW50ID4gSzEyMTJfTUFYX1NBTVBMRVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaT0wOyBpIDwgY291bnQ7IGkrKykgewogI2lmIEsxMjEyX0RFQlVHX0xFVkVMID4gMApAQCAtMTMwNiw3ICsxMzA3LDggQEAKIAogCUsxMjEyX0RFQlVHX1BSSU5US19WRVJCT1NFKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2NvcHlfdG8gcG9zPSVkIG9mZnNldD0lZCBzaXplPSVkXG4iLAogCQkJCSAgIHBvcywgb2Zmc2V0LCBzaXplKTsKLQlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IEsxMjEyX01BWF9TQU1QTEVTLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocG9zICsgY291bnQgPiBLMTIxMl9NQVhfU0FNUExFUykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7CiAjaWYgSzEyMTJfREVCVUdfTEVWRUwgPiAwCkBAIC0xMzM2LDcgKzEzMzgsOCBAQAogCUsxMjEyX0RFQlVHX1BSSU5US19WRVJCT1NFKCJLMTIxMl9ERUJVRzogc25kX2tvcmcxMjEyX2NvcHlfZnJvbSBwb3M9JWQgb2Zmc2V0PSVkIHNpemU9JWQgY291bnQ9JWRcbiIsCiAJCQkJICAgcG9zLCBvZmZzZXQsIHNpemUsIGNvdW50KTsKIAotCXNuZF9hc3NlcnQocG9zICsgY291bnQgPD0gSzEyMTJfTUFYX1NBTVBMRVMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihwb3MgKyBjb3VudCA+IEsxMjEyX01BWF9TQU1QTEVTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKICNpZiBLMTIxMl9ERUJVR19MRVZFTCA+IDAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jIGIvc291bmQvcGNpL21hZXN0cm8zLmMKaW5kZXggMDAzN2JlNy4uOWZmM2Y5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21hZXN0cm8zLmMKKysrIGIvc291bmQvcGNpL21hZXN0cm8zLmMKQEAgLTExNzUsNyArMTE3NSw4IEBACiAJc3RydWN0IG0zX2RtYSAqcyA9IHN1YnMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCXNuZF9hc3NlcnQocyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcykpCisJCXJldHVybiAtRU5YSU87CiAKIAlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMTQ4Nyw3ICsxNDg4LDggQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vicy0+cnVudGltZTsKIAlzdHJ1Y3QgbTNfZG1hICpzID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCi0Jc25kX2Fzc2VydChzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCWlmIChydW50aW1lLT5mb3JtYXQgIT0gU05EUlZfUENNX0ZPUk1BVF9VOCAmJgogCSAgICBydW50aW1lLT5mb3JtYXQgIT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCkBAIC0xNTQ2LDcgKzE1NDgsOSBAQAogCXN0cnVjdCBzbmRfbTMgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnMpOwogCXVuc2lnbmVkIGludCBwdHI7CiAJc3RydWN0IG0zX2RtYSAqcyA9IHN1YnMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzbmRfYXNzZXJ0KHMgIT0gTlVMTCwgcmV0dXJuIDApOworCisJaWYgKHNuZF9CVUdfT04oIXMpKQorCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCXB0ciA9IHNuZF9tM19nZXRfcG9pbnRlcihjaGlwLCBzLCBzdWJzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCmluZGV4IDNkZDBjNzkuLjJkMGRjZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnQuYwpAQCAtNzA4LDcgKzcwOCw3IEBACiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0FOQUxPRzsKIAkJcnVudGltZS0+aHcgPSBzbmRfbWl4YXJ0X2FuYWxvZ19jYXBzOwogCX0gZWxzZSB7Ci0JCXNuZF9hc3NlcnQgKCBwY20gPT0gY2hpcC0+cGNtX2RpZyApOyAKKwkJc25kX0JVR19PTihwY20gIT0gY2hpcC0+cGNtX2RpZyk7CiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CiAJfQpAQCAtNzgzLDcgKzc4Myw3IEBACiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0FOQUxPRzsKIAkJcnVudGltZS0+aHcgPSBzbmRfbWl4YXJ0X2FuYWxvZ19jYXBzOwogCX0gZWxzZSB7Ci0JCXNuZF9hc3NlcnQgKCBwY20gPT0gY2hpcC0+cGNtX2RpZyApOyAKKwkJc25kX0JVR19PTihwY20gIT0gY2hpcC0+cGNtX2RpZyk7CiAJCXBjbV9udW1iZXIgPSBNSVhBUlRfUENNX0RJR0lUQUw7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX21peGFydF9kaWdpdGFsX2NhcHM7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfY29yZS5jCmluZGV4IDc4NTA4NWUuLmI5YTA2YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2NvcmUuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9jb3JlLmMKQEAgLTU2LDggKzU2LDEwIEBACiAJaWYgKHRhaWxwdHIgPT0gaGVhZHB0cikKIAkJcmV0dXJuIDA7IC8qIG5vIG1lc3NhZ2UgcG9zdGVkICovCiAKLQlzbmRfYXNzZXJ0KCB0YWlscHRyID49IE1TR19PVVRCT1VORF9QT1NUX1NUQUNLLCByZXR1cm4gMCk7IC8qIGVycm9yICovCi0Jc25kX2Fzc2VydCggdGFpbHB0ciA8IChNU0dfT1VUQk9VTkRfUE9TVF9TVEFDSytNU0dfQk9VTkRfU1RBQ0tfU0laRSksIHJldHVybiAwKTsgLyogZXJyb3IgKi8KKwlpZiAodGFpbHB0ciA8IE1TR19PVVRCT1VORF9QT1NUX1NUQUNLKQorCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KKwlpZiAodGFpbHB0ciA+PSBNU0dfT1VUQk9VTkRfUE9TVF9TVEFDSyArIE1TR19CT1VORF9TVEFDS19TSVpFKQorCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KIAogCSptc2dfZnJhbWUgPSByZWFkbF9iZShNSVhBUlRfTUVNKG1nciwgdGFpbHB0cikpOwogCkBAIC0xNDksNyArMTUxLDggQEAKIAl1MzIgbXNnX2ZyYW1lX2FkZHJlc3M7CiAJaW50IGVyciwgaTsKIAotCXNuZF9hc3NlcnQobXNnLT5zaXplICUgNCA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04obXNnLT5zaXplICUgNCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyID0gMDsKIApAQCAtMjg5LDkgKzI5MiwxMiBAQAogCXdhaXRfcXVldWVfdCB3YWl0OwogCWxvbmcgdGltZW91dDsKIAotCXNuZF9hc3NlcnQobm90aWZfZXZlbnQgIT0gMCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoKG5vdGlmX2V2ZW50ICYgTVNHX1RZUEVfTUFTSykgPT0gTVNHX1RZUEVfTk9USUZZLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCgobm90aWZfZXZlbnQgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIW5vdGlmX2V2ZW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oKG5vdGlmX2V2ZW50ICYgTVNHX1RZUEVfTUFTSykgIT0gTVNHX1RZUEVfTk9USUZZKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04obm90aWZfZXZlbnQgJiBNU0dfQ0FOQ0VMX05PVElGWV9NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZtZ3ItPm1zZ19tdXRleCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCmluZGV4IGY5ODYwMzEuLjM3ODJiNTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwpAQCAtMjg4LDcgKzI4OCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9hc3NlcnQocGh5c19pby5uYl91aWQgPj0gKE1JWEFSVF9NQVhfQ0FSRFMgKiAyKSwgIHJldHVybiAtRUlOVkFMKTsgLyogbWluIDIgcGh5cyBpbyBwZXIgY2FyZCAoYW5hbG9nIGluICsgYW5hbG9nIG91dCkgKi8KKwkvKiBtaW4gMiBwaHlzIGlvIHBlciBjYXJkIChhbmFsb2cgaW4gKyBhbmFsb2cgb3V0KSAqLworCWlmIChwaHlzX2lvLm5iX3VpZCA8IE1JWEFSVF9NQVhfQ0FSRFMgKiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvcihrPTA7IGs8bWdyLT5udW1fY2FyZHM7IGsrKykgewogCQltZ3ItPmNoaXBba10tPnVpZF9pbl9hbmFsb2dfcGh5c2lvID0gcGh5c19pby51aWRba107CkBAIC0zNjMsOCArMzY1LDEwIEBACiAJCX0KIAogCQkvKiBjaGVjayB4aWxpbnggdmFsaWRpdHkgKi8KLQkJc25kX2Fzc2VydCgoKHUzMiopKGRzcC0+ZGF0YSkpWzBdPT0weEZGRkZGRkZGLCByZXR1cm4gLUVJTlZBTCk7Ci0JCXNuZF9hc3NlcnQoZHNwLT5zaXplICUgNCA9PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJCWlmICgoKHUzMiopKGRzcC0+ZGF0YSkpWzBdID09IDB4ZmZmZmZmZmYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRzcC0+c2l6ZSAlIDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkvKiBzZXQgeGlsaW54IHN0YXR1cyB0byBjb3B5aW5nICovCiAJCXdyaXRlbF9iZSggMSwgTUlYQVJUX01FTSggbWdyLCBNSVhBUlRfUFNFVURPUkVHX01YTFhfU1RBVFVTX09GRlNFVCApKTsKQEAgLTQ2Miw4ICs0NjYsMTAgQEAKIAkJfQogIAogCQkvKiBjaGVjayBkYXVnaHRlcmJvYXJkIHhpbGlueCB2YWxpZGl0eSAqLwotCQlzbmRfYXNzZXJ0KCgodTMyKikoZHNwLT5kYXRhKSlbMF09PTB4RkZGRkZGRkYsIHJldHVybiAtRUlOVkFMKTsKLQkJc25kX2Fzc2VydChkc3AtPnNpemUgJSA0ID09IDAsIHJldHVybiAtRUlOVkFMKTsKKwkJaWYgKCgodTMyKikoZHNwLT5kYXRhKSlbMF0gPT0gMHhmZmZmZmZmZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZHNwLT5zaXplICUgNCkKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJCS8qIGluZm9ybSBtaXhhcnQgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUgKi8KIAkJd3JpdGVsX2JlKCBkc3AtPnNpemUsIE1JWEFSVF9NRU0oIG1nciwgTUlYQVJUX1BTRVVET1JFR19EWExYX1NJWkVfT0ZGU0VUICkpOwpAQCAtNDgwLDcgKzQ4Niw4IEBACiAKIAkJLyogZ2V0IHRoZSBhZGRyZXNzIHdoZXJlIHRvIHdyaXRlIHRoZSBmaWxlICovCiAJCXZhbCA9IHJlYWRsX2JlKCBNSVhBUlRfTUVNKCBtZ3IsIE1JWEFSVF9QU0VVRE9SRUdfRFhMWF9CQVNFX0FERFJfT0ZGU0VUICkpOwotCQlzbmRfYXNzZXJ0KHZhbCAhPSAwLCByZXR1cm4gLUVJTlZBTCk7CisJCWlmICghdmFsKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJLyogY29weSBkYXVnaHRlcmJvYXJkIHhpbGlueCBjb2RlICovCiAJCW1lbWNweV90b2lvKCAgTUlYQVJUX01FTSggbWdyLCB2YWwpLCAgZHNwLT5kYXRhLCAgZHNwLT5zaXplKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCmluZGV4IDZmZGRhMWYuLjNiYTYxNzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwpAQCAtODM3LDcgKzgzNyw3IEBACiAJCWlmKGlzX2FlcykJc3RvcmVkX3ZvbHVtZSA9IGNoaXAtPmRpZ2l0YWxfY2FwdHVyZV92b2x1bWVbMV07CS8qIEFFUyBjYXB0dXJlICovCiAJCWVsc2UJCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX2NhcHR1cmVfdm9sdW1lWzBdOwkvKiBhbmFsb2cgY2FwdHVyZSAqLwogCX0gZWxzZSB7Ci0JCXNuZF9hc3NlcnQgKCBpZHggPCBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUyApOyAKKwkJc25kX0JVR19PTihpZHggPj0gTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMpOwogCQlpZihpc19hZXMpCXN0b3JlZF92b2x1bWUgPSBjaGlwLT5kaWdpdGFsX3BsYXliYWNrX3ZvbHVtZVtNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUyArIGlkeF07IC8qIEFFUyBwbGF5YmFjayAqLwogCQllbHNlCQlzdG9yZWRfdm9sdW1lID0gY2hpcC0+ZGlnaXRhbF9wbGF5YmFja192b2x1bWVbaWR4XTsJLyogYW5hbG9nIHBsYXliYWNrICovCiAJfQpAQCAtODYzLDcgKzg2Myw3IEBACiAJCWVsc2UJCS8qIGFuYWxvZyBjYXB0dXJlICovCiAJCQlzdG9yZWRfdm9sdW1lID0gY2hpcC0+ZGlnaXRhbF9jYXB0dXJlX3ZvbHVtZVswXTsKIAl9IGVsc2UgewotCQlzbmRfYXNzZXJ0ICggaWR4IDwgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKTsgCisJCXNuZF9CVUdfT04oaWR4ID49IE1JWEFSVF9QTEFZQkFDS19TVFJFQU1TKTsKIAkJaWYgKGlzX2FlcykJLyogQUVTIHBsYXliYWNrICovCiAJCQlzdG9yZWRfdm9sdW1lID0gY2hpcC0+ZGlnaXRhbF9wbGF5YmFja192b2x1bWVbTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKyBpZHhdOwogCQllbHNlCQkvKiBhbmFsb2cgcGxheWJhY2sgKi8KQEAgLTkwOSw3ICs5MDksNyBAQAogewogCXN0cnVjdCBzbmRfbWl4YXJ0ICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsgLyogaW5kZXggKi8KLQlzbmRfYXNzZXJ0ICggaWR4IDwgTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMgKTsgCisJc25kX0JVR19PTihpZHggPj0gTUlYQVJUX1BMQVlCQUNLX1NUUkVBTVMpOwogCW11dGV4X2xvY2soJmNoaXAtPm1nci0+bWl4ZXJfbXV0ZXgpOwogCWlmKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgTUlYQVJUX1ZPTF9BRVNfTUFTSykJLyogQUVTIHBsYXliYWNrICovCiAJCWlkeCArPSBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUzsKQEAgLTkyNiw3ICs5MjYsNyBAQAogCWludCBpc19hZXMgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIE1JWEFSVF9WT0xfQUVTX01BU0s7CiAJaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOyAvKiBpbmRleCAqLwogCWludCBpLCBqOwotCXNuZF9hc3NlcnQgKCBpZHggPCBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUyApOyAKKwlzbmRfQlVHX09OKGlkeCA+PSBNSVhBUlRfUExBWUJBQ0tfU1RSRUFNUyk7CiAJbXV0ZXhfbG9jaygmY2hpcC0+bWdyLT5taXhlcl9tdXRleCk7CiAJaiA9IGlkeDsKIAlpZiAoaXNfYWVzKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwppbmRleCAwNmQxM2U3Li41MGM5ZjhhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYworKysgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwpAQCAtNTYyLDcgKzU2Miw4IEBACiAJc3RydWN0IG5tMjU2X3N0cmVhbSAqcyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWludCBlcnIgPSAwOwogCi0Jc25kX2Fzc2VydChzICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFzKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCXN3aXRjaCAoY21kKSB7CkBAIC01OTksNyArNjAwLDggQEAKIAlzdHJ1Y3Qgbm0yNTZfc3RyZWFtICpzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJaW50IGVyciA9IDA7CiAKLQlzbmRfYXNzZXJ0KHMgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXMpKQorCQlyZXR1cm4gLUVOWElPOwogCiAJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJc3dpdGNoIChjbWQpIHsKQEAgLTYzNSw3ICs2MzcsOCBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IG5tMjU2X3N0cmVhbSAqcyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAotCXNuZF9hc3NlcnQocywgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIXMpKQorCQlyZXR1cm4gLUVOWElPOwogCXMtPmRtYV9zaXplID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemUpOwogCXMtPnBlcmlvZF9zaXplID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemUpOwogCXMtPnBlcmlvZHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7CkBAIC02NjAsNyArNjYzLDggQEAKIAlzdHJ1Y3Qgbm0yNTZfc3RyZWFtICpzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBjdXJwOwogCi0Jc25kX2Fzc2VydChzLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIXMpKQorCQlyZXR1cm4gMDsKIAljdXJwID0gc25kX25tMjU2X3JlYWRsKGNoaXAsIE5NX1BCVUZGRVJfQ1VSUlApIC0gKHVuc2lnbmVkIGxvbmcpcy0+YnVmOwogCWN1cnAgJT0gcy0+ZG1hX3NpemU7CiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGN1cnApOwpAQCAtNjczLDcgKzY3Nyw4IEBACiAJc3RydWN0IG5tMjU2X3N0cmVhbSAqcyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgY3VycDsKIAotCXNuZF9hc3NlcnQocyAhPSBOVUxMLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIXMpKQorCQlyZXR1cm4gMDsKIAljdXJwID0gc25kX25tMjU2X3JlYWRsKGNoaXAsIE5NX1JCVUZGRVJfQ1VSUlApIC0gKHVuc2lnbmVkIGxvbmcpcy0+YnVmOwogCWN1cnAgJT0gcy0+ZG1hX3NpemU7CQogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBjdXJwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vaGlmaWVyLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL2hpZmllci5jCmluZGV4IGRhZDM5M2EuLjFhYjgzM2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vaGlmaWVyLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9oaWZpZXIuYwpAQCAtOTQsNiArOTQsMTEgQEAKIHsKIH0KIAorc3RhdGljIHZvaWQgaGlmaWVyX3Jlc3VtZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCWhpZmllcl9yZWdpc3RlcnNfaW5pdChjaGlwKTsKK30KKwogc3RhdGljIHZvaWQgc2V0X2FrNDM5Nl9wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKIAkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTE1MCwxNiArMTU1LDE2IEBACiAJLmluaXQgPSBoaWZpZXJfaW5pdCwKIAkuY29udHJvbF9maWx0ZXIgPSBoaWZpZXJfY29udHJvbF9maWx0ZXIsCiAJLmNsZWFudXAgPSBoaWZpZXJfY2xlYW51cCwKLQkucmVzdW1lID0gaGlmaWVyX3JlZ2lzdGVyc19pbml0LAorCS5yZXN1bWUgPSBoaWZpZXJfcmVzdW1lLAogCS5zZXRfZGFjX3BhcmFtcyA9IHNldF9hazQzOTZfcGFyYW1zLAogCS5zZXRfYWRjX3BhcmFtcyA9IHNldF9jczUzNDBfcGFyYW1zLAogCS51cGRhdGVfZGFjX3ZvbHVtZSA9IHVwZGF0ZV9hazQzOTZfdm9sdW1lLAogCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfYWs0Mzk2X211dGUsCiAJLmRhY190bHYgPSBhazQzOTZfZGJfc2NhbGUsCiAJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGlmaWVyX2RhdGEpLAotCS5wY21fZGV2X2NmZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKLQkJICAgICAgIFBMQVlCQUNLXzFfVE9fU1BESUYgfAotCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzEsCisJLmRldmljZV9jb25maWcgPSBQTEFZQkFDS18wX1RPX0kyUyB8CisJCQkgUExBWUJBQ0tfMV9UT19TUERJRiB8CisJCQkgQ0FQVFVSRV8wX0ZST01fSTJTXzEsCiAJLmRhY19jaGFubmVscyA9IDIsCiAJLmRhY192b2x1bWVfbWluID0gMCwKIAkuZGFjX3ZvbHVtZV9tYXggPSAyNTUsCkBAIC0xODAsNyArMTg1LDcgQEAKIAkJKytkZXY7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQllcnIgPSBveHlnZW5fcGNpX3Byb2JlKHBjaSwgaW5kZXhbZGV2XSwgaWRbZGV2XSwgJm1vZGVsX2hpZmllcik7CisJZXJyID0gb3h5Z2VuX3BjaV9wcm9iZShwY2ksIGluZGV4W2Rldl0sIGlkW2Rldl0sICZtb2RlbF9oaWZpZXIsIDApOwogCWlmIChlcnIgPj0gMCkKIAkJKytkZXY7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jCmluZGV4IGM1ODI5ZDMuLmI2MGY2MjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW4uYwpAQCAtNTgsMTcgKzU4LDIyIEBACiBtb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiZW5hYmxlIGNhcmQiKTsKIAorZW51bSB7CisJTU9ERUxfQ01FRElBX1JFRiwJLyogQy1NZWRpYSdzIHJlZmVyZW5jZSBkZXNpZ24gKi8KKwlNT0RFTF9NRVJJRElBTiwJCS8qIEF1emVuVGVjaCBYLU1lcmlkaWFuICovCit9OworCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb3h5Z2VuX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JeyBPWFlHRU5fUENJX1NVQklEKDB4MTBiMCwgMHgwMjE2KSB9LAotCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEwYjAsIDB4MDIxOCkgfSwKLQl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMGIwLCAweDAyMTkpIH0sCi0JeyBPWFlHRU5fUENJX1NVQklEKDB4MTNmNiwgMHgwMDAxKSB9LAotCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEzZjYsIDB4MDAxMCkgfSwKLQl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxM2Y2LCAweDg3ODgpIH0sCi0JeyBPWFlHRU5fUENJX1NVQklEKDB4MTQ3YSwgMHhhMDE3KSB9LAotCXsgT1hZR0VOX1BDSV9TVUJJRCgweDFhNTgsIDB4MDkxMCkgfSwKLQl7IE9YWUdFTl9QQ0lfU1VCSUQoMHg0MTVhLCAweDU0MzEpLCAuZHJpdmVyX2RhdGEgPSAxIH0sCi0JeyBPWFlHRU5fUENJX1NVQklEKDB4NzI4NCwgMHg5NzYxKSB9LAorCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEwYjAsIDB4MDIxNiksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMGIwLCAweDAyMTgpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCisJeyBPWFlHRU5fUENJX1NVQklEKDB4MTBiMCwgMHgwMjE5KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAorCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEzZjYsIDB4MDAwMSksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxM2Y2LCAweDAwMTApLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCisJeyBPWFlHRU5fUENJX1NVQklEKDB4MTNmNiwgMHg4Nzg4KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAorCXsgT1hZR0VOX1BDSV9TVUJJRCgweDE0N2EsIDB4YTAxNyksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxYTU4LCAweDA5MTApLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCisJeyBPWFlHRU5fUENJX1NVQklEKDB4NDE1YSwgMHg1NDMxKSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfTUVSSURJQU4gfSwKKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHg3Mjg0LCAweDk3NjEpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG94eWdlbl9pZHMpOwpAQCAtMTk5LDYgKzIwNCwxMSBAQAogCXdtODc4NV9yZWdpc3RlcnNfaW5pdChjaGlwKTsKIH0KIAorc3RhdGljIHZvaWQgbWVyaWRpYW5fcmVzdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJYWs0Mzk2X3JlZ2lzdGVyc19pbml0KGNoaXApOworfQorCiBzdGF0aWMgdm9pZCBzZXRfYWs0Mzk2X3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC0yODEsMTEgKzI5MSwyOCBAQAogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGFrNDM5Nl9kYl9zY2FsZSwgVExWX0RCX0dBSU5fTVVURSwgMCk7CiAKK3N0YXRpYyBpbnQgZ2VuZXJpY19wcm9iZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBsb25nIGRyaXZlcl9kYXRhKQoreworCWlmIChkcml2ZXJfZGF0YSA9PSBNT0RFTF9NRVJJRElBTikgeworCQljaGlwLT5tb2RlbC5pbml0ID0gbWVyaWRpYW5faW5pdDsKKwkJY2hpcC0+bW9kZWwucmVzdW1lID0gbWVyaWRpYW5fcmVzdW1lOworCQljaGlwLT5tb2RlbC5zZXRfYWRjX3BhcmFtcyA9IHNldF9hazUzODVfcGFyYW1zOworCQljaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAorCQkJCQkgICAgUExBWUJBQ0tfMV9UT19TUERJRiB8CisJCQkJCSAgICBDQVBUVVJFXzBfRlJPTV9JMlNfMiB8CisJCQkJCSAgICBDQVBUVVJFXzFfRlJPTV9TUERJRjsKKwkJY2hpcC0+bW9kZWwubWlzY19mbGFncyA9IE9YWUdFTl9NSVNDX01JREk7CisJCWNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgfD0gTUlESV9PVVRQVVQgfCBNSURJX0lOUFVUOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfZ2VuZXJpYyA9IHsKIAkuc2hvcnRuYW1lID0gIkMtTWVkaWEgQ01JODc4OCIsCiAJLmxvbmduYW1lID0gIkMtTWVkaWEgT3h5Z2VuIEhEIEF1ZGlvIiwKIAkuY2hpcCA9ICJDTUk4Nzg4IiwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucHJvYmUgPSBnZW5lcmljX3Byb2JlLAogCS5pbml0ID0gZ2VuZXJpY19pbml0LAogCS5jbGVhbnVwID0gZ2VuZXJpY19jbGVhbnVwLAogCS5yZXN1bWUgPSBnZW5lcmljX3Jlc3VtZSwKQEAgLTI5NSwxMiArMzIyLDEyIEBACiAJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9hazQzOTZfbXV0ZSwKIAkuZGFjX3RsdiA9IGFrNDM5Nl9kYl9zY2FsZSwKIAkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZW5lcmljX2RhdGEpLAotCS5wY21fZGV2X2NmZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKLQkJICAgICAgIFBMQVlCQUNLXzFfVE9fU1BESUYgfAotCQkgICAgICAgUExBWUJBQ0tfMl9UT19BQzk3XzEgfAotCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzEgfAotCQkgICAgICAgQ0FQVFVSRV8xX0ZST01fU1BESUYgfAotCQkgICAgICAgQ0FQVFVSRV8yX0ZST01fQUM5N18xLAorCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAorCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAorCQkJIFBMQVlCQUNLXzJfVE9fQUM5N18xIHwKKwkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMSB8CisJCQkgQ0FQVFVSRV8xX0ZST01fU1BESUYgfAorCQkJIENBUFRVUkVfMl9GUk9NX0FDOTdfMSwKIAkuZGFjX2NoYW5uZWxzID0gOCwKIAkuZGFjX3ZvbHVtZV9taW4gPSAwLAogCS5kYWNfdm9sdW1lX21heCA9IDI1NSwKQEAgLTMwOSw0MSArMzM2LDExIEBACiAJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfbWVyaWRpYW4gPSB7Ci0JLnNob3J0bmFtZSA9ICJDLU1lZGlhIENNSTg3ODgiLAotCS5sb25nbmFtZSA9ICJDLU1lZGlhIE94eWdlbiBIRCBBdWRpbyIsCi0JLmNoaXAgPSAiQ01JODc4OCIsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmluaXQgPSBtZXJpZGlhbl9pbml0LAotCS5jbGVhbnVwID0gZ2VuZXJpY19jbGVhbnVwLAotCS5yZXN1bWUgPSBhazQzOTZfcmVnaXN0ZXJzX2luaXQsCi0JLnNldF9kYWNfcGFyYW1zID0gc2V0X2FrNDM5Nl9wYXJhbXMsCi0JLnNldF9hZGNfcGFyYW1zID0gc2V0X2FrNTM4NV9wYXJhbXMsCi0JLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2FrNDM5Nl92b2x1bWUsCi0JLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9hazQzOTZfbXV0ZSwKLQkuZGFjX3RsdiA9IGFrNDM5Nl9kYl9zY2FsZSwKLQkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZW5lcmljX2RhdGEpLAotCS5wY21fZGV2X2NmZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKLQkJICAgICAgIFBMQVlCQUNLXzFfVE9fU1BESUYgfAotCQkgICAgICAgUExBWUJBQ0tfMl9UT19BQzk3XzEgfAotCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAotCQkgICAgICAgQ0FQVFVSRV8xX0ZST01fU1BESUYgfAotCQkgICAgICAgQ0FQVFVSRV8yX0ZST01fQUM5N18xLAotCS5kYWNfY2hhbm5lbHMgPSA4LAotCS5kYWNfdm9sdW1lX21pbiA9IDAsCi0JLmRhY192b2x1bWVfbWF4ID0gMjU1LAotCS5taXNjX2ZsYWdzID0gT1hZR0VOX01JU0NfTUlESSwKLQkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fU1BJIHwKLQkJCSAgT1hZR0VOX0ZVTkNUSU9OX0VOQUJMRV9TUElfNF81LAotCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgZ2VuZXJpY19veHlnZW5fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQogewogCXN0YXRpYyBpbnQgZGV2OwotCWludCBpc19tZXJpZGlhbjsKIAlpbnQgZXJyOwogCiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKQEAgLTM1Miw5ICszNDksOCBAQAogCQkrK2RldjsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCWlzX21lcmlkaWFuID0gcGNpX2lkLT5kcml2ZXJfZGF0YTsKIAllcnIgPSBveHlnZW5fcGNpX3Byb2JlKHBjaSwgaW5kZXhbZGV2XSwgaWRbZGV2XSwKLQkJCSAgICAgICBpc19tZXJpZGlhbiA/ICZtb2RlbF9tZXJpZGlhbiA6ICZtb2RlbF9nZW5lcmljKTsKKwkJCSAgICAgICAmbW9kZWxfZ2VuZXJpYywgcGNpX2lkLT5kcml2ZXJfZGF0YSk7CiAJaWYgKGVyciA+PSAwKQogCQkrK2RldjsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uaCBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmgKaW5kZXggNzRhNjQ0OC4uMTkxMDdjNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uaAorKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5oCkBAIC0xOSwxNCArMTksMTkgQEAKICNkZWZpbmUgT1hZR0VOX0lPX1NJWkUJMHgxMDAKIAogLyogbW9kZWwtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvZiBvdXRwdXRzL2lucHV0cyAqLwotI2RlZmluZSBQTEFZQkFDS18wX1RPX0kyUwkweDAwMQotI2RlZmluZSBQTEFZQkFDS18xX1RPX1NQRElGCTB4MDA0Ci0jZGVmaW5lIFBMQVlCQUNLXzJfVE9fQUM5N18xCTB4MDA4Ci0jZGVmaW5lIENBUFRVUkVfMF9GUk9NX0kyU18xCTB4MDEwCi0jZGVmaW5lIENBUFRVUkVfMF9GUk9NX0kyU18yCTB4MDIwCi0jZGVmaW5lIENBUFRVUkVfMV9GUk9NX1NQRElGCTB4MDgwCi0jZGVmaW5lIENBUFRVUkVfMl9GUk9NX0kyU18yCTB4MTAwCi0jZGVmaW5lIENBUFRVUkVfMl9GUk9NX0FDOTdfMQkweDIwMAorI2RlZmluZSBQTEFZQkFDS18wX1RPX0kyUwkweDAwMDEKKyAgICAgLyogUExBWUJBQ0tfMF9UT19BQzk3XzAJCW5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBQTEFZQkFDS18xX1RPX1NQRElGCTB4MDAwNAorI2RlZmluZSBQTEFZQkFDS18yX1RPX0FDOTdfMQkweDAwMDgKKyNkZWZpbmUgQ0FQVFVSRV8wX0ZST01fSTJTXzEJMHgwMDEwCisjZGVmaW5lIENBUFRVUkVfMF9GUk9NX0kyU18yCTB4MDAyMAorICAgICAvKiBDQVBUVVJFXzBfRlJPTV9BQzk3XzAJCW5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBDQVBUVVJFXzFfRlJPTV9TUERJRgkweDAwODAKKyNkZWZpbmUgQ0FQVFVSRV8yX0ZST01fSTJTXzIJMHgwMTAwCisjZGVmaW5lIENBUFRVUkVfMl9GUk9NX0FDOTdfMQkweDAyMDAKKyAgICAgLyogQ0FQVFVSRV8zX0ZST01fSTJTXzMJCW5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBNSURJX09VVFBVVAkJMHgwODAwCisjZGVmaW5lIE1JRElfSU5QVVQJCTB4MTAwMAogCiBlbnVtIHsKIAlDT05UUk9MX1NQRElGX1BDTSwKQEAgLTUxLDcgKzU2LDQzIEBACiBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXM7CiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldzsKIHN0cnVjdCBzbmRfcmF3bWlkaTsKLXN0cnVjdCBveHlnZW5fbW9kZWw7CitzdHJ1Y3Qgb3h5Z2VuOworCitzdHJ1Y3Qgb3h5Z2VuX21vZGVsIHsKKwljb25zdCBjaGFyICpzaG9ydG5hbWU7CisJY29uc3QgY2hhciAqbG9uZ25hbWU7CisJY29uc3QgY2hhciAqY2hpcDsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YSk7CisJdm9pZCAoKmluaXQpKHN0cnVjdCBveHlnZW4gKmNoaXApOworCWludCAoKmNvbnRyb2xfZmlsdGVyKShzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqdGVtcGxhdGUpOworCWludCAoKm1peGVyX2luaXQpKHN0cnVjdCBveHlnZW4gKmNoaXApOworCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKKwl2b2lkICgqc3VzcGVuZCkoc3RydWN0IG94eWdlbiAqY2hpcCk7CisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IG94eWdlbiAqY2hpcCk7CisJdm9pZCAoKnBjbV9oYXJkd2FyZV9maWx0ZXIpKHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqaGFyZHdhcmUpOworCXZvaWQgKCpzZXRfZGFjX3BhcmFtcykoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CisJdm9pZCAoKnNldF9hZGNfcGFyYW1zKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKKwl2b2lkICgqdXBkYXRlX2RhY192b2x1bWUpKHN0cnVjdCBveHlnZW4gKmNoaXApOworCXZvaWQgKCp1cGRhdGVfZGFjX211dGUpKHN0cnVjdCBveHlnZW4gKmNoaXApOworCXZvaWQgKCpncGlvX2NoYW5nZWQpKHN0cnVjdCBveHlnZW4gKmNoaXApOworCXZvaWQgKCp1YXJ0X2lucHV0KShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKKwl2b2lkICgqYWM5N19zd2l0Y2gpKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG11dGUpOworCWNvbnN0IHVuc2lnbmVkIGludCAqZGFjX3RsdjsKKwlzaXplX3QgbW9kZWxfZGF0YV9zaXplOworCXVuc2lnbmVkIGludCBkZXZpY2VfY29uZmlnOworCXU4IGRhY19jaGFubmVsczsKKwl1OCBkYWNfdm9sdW1lX21pbjsKKwl1OCBkYWNfdm9sdW1lX21heDsKKwl1OCBtaXNjX2ZsYWdzOworCXU4IGZ1bmN0aW9uX2ZsYWdzOworCXUxNiBkYWNfaTJzX2Zvcm1hdDsKKwl1MTYgYWRjX2kyc19mb3JtYXQ7Cit9OwogCiBzdHJ1Y3Qgb3h5Z2VuIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC02MSw3ICsxMDIsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICpwY2k7CiAJc3RydWN0IHNuZF9yYXdtaWRpICptaWRpOwogCWludCBpcnE7Ci0JY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCAqbW9kZWw7CiAJdm9pZCAqbW9kZWxfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X21hc2s7CiAJdTggZGFjX3ZvbHVtZVs4XTsKQEAgLTg2LDQ2ICsxMjYsMTYgQEAKIAkJX19sZTMyIF8zMltPWFlHRU5fSU9fU0laRSAvIDRdOwogCX0gc2F2ZWRfcmVnaXN0ZXJzOwogCXUxNiBzYXZlZF9hYzk3X3JlZ2lzdGVyc1syXVsweDQwXTsKLX07Ci0KLXN0cnVjdCBveHlnZW5fbW9kZWwgewotCWNvbnN0IGNoYXIgKnNob3J0bmFtZTsKLQljb25zdCBjaGFyICpsb25nbmFtZTsKLQljb25zdCBjaGFyICpjaGlwOwotCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCXZvaWQgKCppbml0KShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLQlpbnQgKCpjb250cm9sX2ZpbHRlcikoc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKnRlbXBsYXRlKTsKLQlpbnQgKCptaXhlcl9pbml0KShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLQl2b2lkICgqY2xlYW51cCkoc3RydWN0IG94eWdlbiAqY2hpcCk7Ci0Jdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCBveHlnZW4gKmNoaXApOwotCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBveHlnZW4gKmNoaXApOwotCXZvaWQgKCpwY21faGFyZHdhcmVfZmlsdGVyKSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgKmhhcmR3YXJlKTsKLQl2b2lkICgqc2V0X2RhY19wYXJhbXMpKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwotCXZvaWQgKCpzZXRfYWRjX3BhcmFtcykoc3RydWN0IG94eWdlbiAqY2hpcCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci0Jdm9pZCAoKnVwZGF0ZV9kYWNfdm9sdW1lKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLQl2b2lkICgqdXBkYXRlX2RhY19tdXRlKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLQl2b2lkICgqZ3Bpb19jaGFuZ2VkKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLQl2b2lkICgqYWM5N19zd2l0Y2gpKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG11dGUpOwotCWNvbnN0IHVuc2lnbmVkIGludCAqZGFjX3RsdjsKLQlzaXplX3QgbW9kZWxfZGF0YV9zaXplOwotCXVuc2lnbmVkIGludCBwY21fZGV2X2NmZzsKLQl1OCBkYWNfY2hhbm5lbHM7Ci0JdTggZGFjX3ZvbHVtZV9taW47Ci0JdTggZGFjX3ZvbHVtZV9tYXg7Ci0JdTggbWlzY19mbGFnczsKLQl1OCBmdW5jdGlvbl9mbGFnczsKLQl1MTYgZGFjX2kyc19mb3JtYXQ7Ci0JdTE2IGFkY19pMnNfZm9ybWF0OworCXVuc2lnbmVkIGludCB1YXJ0X2lucHV0X2NvdW50OworCXU4IHVhcnRfaW5wdXRbMzJdOworCXN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWw7CiB9OwogCiAvKiBveHlnZW5fbGliLmMgKi8KIAogaW50IG94eWdlbl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwgaW50IGluZGV4LCBjaGFyICppZCwKLQkJICAgICBjb25zdCBzdHJ1Y3Qgb3h5Z2VuX21vZGVsICptb2RlbCk7CisJCSAgICAgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCAqbW9kZWwsCisJCSAgICAgdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YSk7CiB2b2lkIG94eWdlbl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpOwogI2lmZGVmIENPTkZJR19QTQogaW50IG94eWdlbl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpAQCAtMTY3LDYgKzE3Nyw5IEBACiB2b2lkIG94eWdlbl93cml0ZV9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggY29udHJvbCwgdW5zaWduZWQgaW50IGRhdGEpOwogdm9pZCBveHlnZW5fd3JpdGVfaTJjKHN0cnVjdCBveHlnZW4gKmNoaXAsIHU4IGRldmljZSwgdTggbWFwLCB1OCBkYXRhKTsKIAordm9pZCBveHlnZW5fcmVzZXRfdWFydChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKK3ZvaWQgb3h5Z2VuX3dyaXRlX3VhcnQoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggZGF0YSk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBveHlnZW5fc2V0X2JpdHM4KHN0cnVjdCBveHlnZW4gKmNoaXAsCiAJCQkJICAgIHVuc2lnbmVkIGludCByZWcsIHU4IHZhbHVlKQogewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKaW5kZXggODNmMTM1Zi4uMzEyNmM0YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJveHlnZW4uaCIKIApAQCAtMjMyLDMgKzIzMywyNCBAQAogCQkgICAgICBkZXZpY2UgfCBPWFlHRU5fMldJUkVfRElSX1dSSVRFKTsKIH0KIEVYUE9SVF9TWU1CT0wob3h5Z2VuX3dyaXRlX2kyYyk7CisKK3N0YXRpYyB2b2lkIF93cml0ZV91YXJ0KHN0cnVjdCBveHlnZW4gKmNoaXAsIHVuc2lnbmVkIGludCBwb3J0LCB1OCBkYXRhKQoreworCWlmIChveHlnZW5fcmVhZDgoY2hpcCwgT1hZR0VOX01QVTQwMSArIDEpICYgTVBVNDAxX1RYX0ZVTEwpCisJCW1zbGVlcCgxKTsKKwlveHlnZW5fd3JpdGU4KGNoaXAsIE9YWUdFTl9NUFU0MDEgKyBwb3J0LCBkYXRhKTsKK30KKwordm9pZCBveHlnZW5fcmVzZXRfdWFydChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCV93cml0ZV91YXJ0KGNoaXAsIDEsIE1QVTQwMV9SRVNFVCk7CisJbXNsZWVwKDEpOyAvKiB3YWl0IGZvciBBQ0sgKi8KKwlfd3JpdGVfdWFydChjaGlwLCAxLCBNUFU0MDFfRU5URVJfVUFSVCk7Cit9CitFWFBPUlRfU1lNQk9MKG94eWdlbl9yZXNldF91YXJ0KTsKKwordm9pZCBveHlnZW5fd3JpdGVfdWFydChzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1OCBkYXRhKQoreworCV93cml0ZV91YXJ0KGNoaXAsIDAsIGRhdGEpOworfQorRVhQT1JUX1NZTUJPTChveHlnZW5fd3JpdGVfdWFydCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2xpYi5jCmluZGV4IDIyZjM3ODUuLjg0ZjQ4MWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2xpYi5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2xpYi5jCkBAIC0zNSw2ICszNSwzMCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogCiAKK3N0YXRpYyBpbmxpbmUgaW50IG94eWdlbl91YXJ0X2lucHV0X3JlYWR5KHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJcmV0dXJuICEob3h5Z2VuX3JlYWQ4KGNoaXAsIE9YWUdFTl9NUFU0MDEgKyAxKSAmIE1QVTQwMV9SWF9FTVBUWSk7Cit9CisKK3N0YXRpYyB2b2lkIG94eWdlbl9yZWFkX3VhcnQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlpZiAodW5saWtlbHkoIW94eWdlbl91YXJ0X2lucHV0X3JlYWR5KGNoaXApKSkgeworCQkvKiBubyBkYXRhLCBidXQgcmVhZCBpdCBhbnl3YXkgdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLworCQlveHlnZW5fcmVhZDgoY2hpcCwgT1hZR0VOX01QVTQwMSk7CisJCXJldHVybjsKKwl9CisJZG8geworCQl1OCBkYXRhID0gb3h5Z2VuX3JlYWQ4KGNoaXAsIE9YWUdFTl9NUFU0MDEpOworCQlpZiAoZGF0YSA9PSBNUFU0MDFfQUNLKQorCQkJY29udGludWU7CisJCWlmIChjaGlwLT51YXJ0X2lucHV0X2NvdW50ID49IEFSUkFZX1NJWkUoY2hpcC0+dWFydF9pbnB1dCkpCisJCQljaGlwLT51YXJ0X2lucHV0X2NvdW50ID0gMDsKKwkJY2hpcC0+dWFydF9pbnB1dFtjaGlwLT51YXJ0X2lucHV0X2NvdW50KytdID0gZGF0YTsKKwl9IHdoaWxlIChveHlnZW5fdWFydF9pbnB1dF9yZWFkeShjaGlwKSk7CisJaWYgKGNoaXAtPm1vZGVsLnVhcnRfaW5wdXQpCisJCWNoaXAtPm1vZGVsLnVhcnRfaW5wdXQoY2hpcCk7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBveHlnZW5faW50ZXJydXB0KGludCBkdW1teSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBkZXZfaWQ7CkBAIC04Nyw4ICsxMTEsMTIgQEAKIAlpZiAoc3RhdHVzICYgT1hZR0VOX0lOVF9HUElPKQogCQlzY2hlZHVsZV93b3JrKCZjaGlwLT5ncGlvX3dvcmspOwogCi0JaWYgKChzdGF0dXMgJiBPWFlHRU5fSU5UX01JREkpICYmIGNoaXAtPm1pZGkpCi0JCXNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoMCwgY2hpcC0+bWlkaS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAoc3RhdHVzICYgT1hZR0VOX0lOVF9NSURJKSB7CisJCWlmIChjaGlwLT5taWRpKQorCQkJc25kX21wdTQwMV91YXJ0X2ludGVycnVwdCgwLCBjaGlwLT5taWRpLT5wcml2YXRlX2RhdGEpOworCQllbHNlCisJCQlveHlnZW5fcmVhZF91YXJ0KGNoaXApOworCX0KIAogCWlmIChzdGF0dXMgJiBPWFlHRU5fSU5UX0FDOTcpCiAJCXdha2VfdXAoJmNoaXAtPmFjOTdfd2FpdHF1ZXVlKTsKQEAgLTE2MSw4ICsxODksOCBAQAogewogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG94eWdlbiwgZ3Bpb193b3JrKTsKIAotCWlmIChjaGlwLT5tb2RlbC0+Z3Bpb19jaGFuZ2VkKQotCQljaGlwLT5tb2RlbC0+Z3Bpb19jaGFuZ2VkKGNoaXApOworCWlmIChjaGlwLT5tb2RlbC5ncGlvX2NoYW5nZWQpCisJCWNoaXAtPm1vZGVsLmdwaW9fY2hhbmdlZChjaGlwKTsKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC0yMjEsNyArMjQ5LDcgQEAKIAogCWNoaXAtPmRhY19yb3V0aW5nID0gMTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCQljaGlwLT5kYWNfdm9sdW1lW2ldID0gY2hpcC0+bW9kZWwtPmRhY192b2x1bWVfbWluOworCQljaGlwLT5kYWNfdm9sdW1lW2ldID0gY2hpcC0+bW9kZWwuZGFjX3ZvbHVtZV9taW47CiAJY2hpcC0+ZGFjX211dGUgPSAxOwogCWNoaXAtPnNwZGlmX3BsYXliYWNrX2VuYWJsZSA9IDE7CiAJY2hpcC0+c3BkaWZfYml0cyA9IE9YWUdFTl9TUERJRl9DIHwgT1hZR0VOX1NQRElGX09SSUdJTkFMIHwKQEAgLTI0Myw3ICsyNzEsNyBAQAogCiAJb3h5Z2VuX3dyaXRlOF9tYXNrZWQoY2hpcCwgT1hZR0VOX0ZVTkNUSU9OLAogCQkJICAgICBPWFlHRU5fRlVOQ1RJT05fUkVTRVRfQ09ERUMgfAotCQkJICAgICBjaGlwLT5tb2RlbC0+ZnVuY3Rpb25fZmxhZ3MsCisJCQkgICAgIGNoaXAtPm1vZGVsLmZ1bmN0aW9uX2ZsYWdzLAogCQkJICAgICBPWFlHRU5fRlVOQ1RJT05fUkVTRVRfQ09ERUMgfAogCQkJICAgICBPWFlHRU5fRlVOQ1RJT05fMldJUkVfU1BJX01BU0sgfAogCQkJICAgICBPWFlHRU5fRlVOQ1RJT05fRU5BQkxFX1NQSV80XzUpOwpAQCAtMjU1LDcgKzI4Myw3IEBACiAJCSAgICAgIE9YWUdFTl9ETUFfTVVMVElDSF9CVVJTVF84KTsKIAlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSU5URVJSVVBUX01BU0ssIDApOwogCW94eWdlbl93cml0ZThfbWFza2VkKGNoaXAsIE9YWUdFTl9NSVNDLAotCQkJICAgICBjaGlwLT5tb2RlbC0+bWlzY19mbGFncywKKwkJCSAgICAgY2hpcC0+bW9kZWwubWlzY19mbGFncywKIAkJCSAgICAgT1hZR0VOX01JU0NfV1JJVEVfUENJX1NVQklEIHwKIAkJCSAgICAgT1hZR0VOX01JU0NfUkVDX0NfRlJPTV9TUERJRiB8CiAJCQkgICAgIE9YWUdFTl9NSVNDX1JFQ19CX0ZST01fQUM5NyB8CkBAIC0yNzAsMjEgKzI5OCwyMSBAQAogCQkgICAgICAoT1hZR0VOX0ZPUk1BVF8xNiA8PCBPWFlHRU5fTVVMVElDSF9GT1JNQVRfU0hJRlQpKTsKIAlveHlnZW5fd3JpdGU4KGNoaXAsIE9YWUdFTl9SRUNfQ0hBTk5FTFMsIE9YWUdFTl9SRUNfQ0hBTk5FTFNfMl8yXzIpOwogCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9JMlNfTVVMVElDSF9GT1JNQVQsCi0JCSAgICAgICBPWFlHRU5fUkFURV80ODAwMCB8IGNoaXAtPm1vZGVsLT5kYWNfaTJzX2Zvcm1hdCB8CisJCSAgICAgICBPWFlHRU5fUkFURV80ODAwMCB8IGNoaXAtPm1vZGVsLmRhY19pMnNfZm9ybWF0IHwKIAkJICAgICAgIE9YWUdFTl9JMlNfTUNMS18yNTYgfCBPWFlHRU5fSTJTX0JJVFNfMTYgfAogCQkgICAgICAgT1hZR0VOX0kyU19NQVNURVIgfCBPWFlHRU5fSTJTX0JDTEtfNjQpOwotCWlmIChjaGlwLT5tb2RlbC0+cGNtX2Rldl9jZmcgJiBDQVBUVVJFXzBfRlJPTV9JMlNfMSkKKwlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIENBUFRVUkVfMF9GUk9NX0kyU18xKQogCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX0FfRk9STUFULAotCQkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwgY2hpcC0+bW9kZWwtPmFkY19pMnNfZm9ybWF0IHwKKwkJCSAgICAgICBPWFlHRU5fUkFURV80ODAwMCB8IGNoaXAtPm1vZGVsLmFkY19pMnNfZm9ybWF0IHwKIAkJCSAgICAgICBPWFlHRU5fSTJTX01DTEtfMjU2IHwgT1hZR0VOX0kyU19CSVRTXzE2IHwKIAkJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8IE9YWUdFTl9JMlNfQkNMS182NCk7CiAJZWxzZQogCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX0FfRk9STUFULAogCQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwgT1hZR0VOX0kyU19NVVRFX01DTEspOwotCWlmIChjaGlwLT5tb2RlbC0+cGNtX2Rldl9jZmcgJiAoQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAotCQkJCQlDQVBUVVJFXzJfRlJPTV9JMlNfMikpCisJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiAoQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAorCQkJCQkgQ0FQVFVSRV8yX0ZST01fSTJTXzIpKQogCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX0JfRk9STUFULAotCQkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwgY2hpcC0+bW9kZWwtPmFkY19pMnNfZm9ybWF0IHwKKwkJCSAgICAgICBPWFlHRU5fUkFURV80ODAwMCB8IGNoaXAtPm1vZGVsLmFkY19pMnNfZm9ybWF0IHwKIAkJCSAgICAgICBPWFlHRU5fSTJTX01DTEtfMjU2IHwgT1hZR0VOX0kyU19CSVRTXzE2IHwKIAkJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8IE9YWUdFTl9JMlNfQkNMS182NCk7CiAJZWxzZQpAQCAtMjk1LDcgKzMyMyw3IEBACiAJb3h5Z2VuX2NsZWFyX2JpdHMzMihjaGlwLCBPWFlHRU5fU1BESUZfQ09OVFJPTCwKIAkJCSAgICBPWFlHRU5fU1BESUZfT1VUX0VOQUJMRSB8CiAJCQkgICAgT1hZR0VOX1NQRElGX0xPT1BCQUNLKTsKLQlpZiAoY2hpcC0+bW9kZWwtPnBjbV9kZXZfY2ZnICYgQ0FQVFVSRV8xX0ZST01fU1BESUYpCisJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBDQVBUVVJFXzFfRlJPTV9TUERJRikKIAkJb3h5Z2VuX3dyaXRlMzJfbWFza2VkKGNoaXAsIE9YWUdFTl9TUERJRl9DT05UUk9MLAogCQkJCSAgICAgIE9YWUdFTl9TUERJRl9TRU5TRV9NQVNLIHwKIAkJCQkgICAgICBPWFlHRU5fU1BESUZfTE9DS19NQVNLIHwKQEAgLTQxNywxNCArNDQ1LDE1IEBACiAJaWYgKGNoaXAtPmlycSA+PSAwKQogCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JY2hpcC0+bW9kZWwtPmNsZWFudXAoY2hpcCk7CisJY2hpcC0+bW9kZWwuY2xlYW51cChjaGlwKTsKIAltdXRleF9kZXN0cm95KCZjaGlwLT5tdXRleCk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwogCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOwogfQogCiBpbnQgb3h5Z2VuX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBpbnQgaW5kZXgsIGNoYXIgKmlkLAotCQkgICAgIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgKm1vZGVsKQorCQkgICAgIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgKm1vZGVsLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGEpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBveHlnZW4gKmNoaXA7CkBAIC00MzksNyArNDY4LDcgQEAKIAljaGlwLT5jYXJkID0gY2FyZDsKIAljaGlwLT5wY2kgPSBwY2k7CiAJY2hpcC0+aXJxID0gLTE7Ci0JY2hpcC0+bW9kZWwgPSBtb2RlbDsKKwljaGlwLT5tb2RlbCA9ICptb2RlbDsKIAljaGlwLT5tb2RlbF9kYXRhID0gY2hpcCArIDE7CiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKIAltdXRleF9pbml0KCZjaGlwLT5tdXRleCk7CkBAIC00NzAsMjMgKzQ5OSwyOCBAQAogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBveHlnZW5fY2FyZF9mcmVlOwogCisJaWYgKGNoaXAtPm1vZGVsLnByb2JlKSB7CisJCWVyciA9IGNoaXAtPm1vZGVsLnByb2JlKGNoaXAsIGRyaXZlcl9kYXRhKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycl9jYXJkOworCX0KIAlveHlnZW5faW5pdChjaGlwKTsKLQltb2RlbC0+aW5pdChjaGlwKTsKKwljaGlwLT5tb2RlbC5pbml0KGNoaXApOwogCiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIG94eWdlbl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJICBtb2RlbC0+Y2hpcCwgY2hpcCk7CisJCQkgIGNoaXAtPm1vZGVsLmNoaXAsIGNoaXApOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBncmFiIGludGVycnVwdCAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGVycl9jYXJkOwogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKIAotCXN0cmNweShjYXJkLT5kcml2ZXIsIG1vZGVsLT5jaGlwKTsKLQlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBtb2RlbC0+c2hvcnRuYW1lKTsKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBjaGlwLT5tb2RlbC5jaGlwKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5tb2RlbC5zaG9ydG5hbWUpOwogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyAocmV2ICV1KSBhdCAlI2x4LCBpcnEgJWkiLAotCQltb2RlbC0+bG9uZ25hbWUsIGNoaXAtPnJldmlzaW9uLCBjaGlwLT5hZGRyLCBjaGlwLT5pcnEpOwotCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIG1vZGVsLT5jaGlwKTsKLQlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBtb2RlbC0+Y2hpcCk7CisJCWNoaXAtPm1vZGVsLmxvbmduYW1lLCBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+YWRkciwgY2hpcC0+aXJxKTsKKwlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCBjaGlwLT5tb2RlbC5jaGlwKTsKKwlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjaGlwLT5tb2RlbC5jaGlwKTsKIAogCWVyciA9IG94eWdlbl9wY21faW5pdChjaGlwKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTQ5NiwxMCArNTMwLDE1IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX2NhcmQ7CiAKLQlpZiAobW9kZWwtPm1pc2NfZmxhZ3MgJiBPWFlHRU5fTUlTQ19NSURJKSB7CisJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiAoTUlESV9PVVRQVVQgfCBNSURJX0lOUFVUKSkgeworCQl1bnNpZ25lZCBpbnQgaW5mb19mbGFncyA9IE1QVTQwMV9JTkZPX0lOVEVHUkFURUQ7CisJCWlmIChjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgTUlESV9PVVRQVVQpCisJCQlpbmZvX2ZsYWdzIHw9IE1QVTQwMV9JTkZPX09VVFBVVDsKKwkJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBNSURJX0lOUFVUKQorCQkJaW5mb19mbGFncyB8PSBNUFU0MDFfSU5GT19JTlBVVDsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfQ01JUENJLAogCQkJCQkgIGNoaXAtPmFkZHIgKyBPWFlHRU5fTVBVNDAxLAotCQkJCQkgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsIDAsIDAsCisJCQkJCSAgaW5mb19mbGFncywgMCwgMCwKIAkJCQkJICAmY2hpcC0+bWlkaSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBlcnJfY2FyZDsKQEAgLTUwOCw3ICs1NDcsNyBAQAogCW94eWdlbl9wcm9jX2luaXQoY2hpcCk7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0JaWYgKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIENBUFRVUkVfMV9GUk9NX1NQRElGKQorCWlmIChjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgQ0FQVFVSRV8xX0ZST01fU1BESUYpCiAJCWNoaXAtPmludGVycnVwdF9tYXNrIHw9IE9YWUdFTl9JTlRfU1BESUZfSU5fREVURUNUOwogCWlmIChjaGlwLT5oYXNfYWM5N18wIHwgY2hpcC0+aGFzX2FjOTdfMSkKIAkJY2hpcC0+aW50ZXJydXB0X21hc2sgfD0gT1hZR0VOX0lOVF9BQzk3OwpAQCAtNTUyLDggKzU5MSw4IEBACiAJCWlmIChjaGlwLT5zdHJlYW1zW2ldKQogCQkJc25kX3BjbV9zdXNwZW5kKGNoaXAtPnN0cmVhbXNbaV0pOwogCi0JaWYgKGNoaXAtPm1vZGVsLT5zdXNwZW5kKQotCQljaGlwLT5tb2RlbC0+c3VzcGVuZChjaGlwKTsKKwlpZiAoY2hpcC0+bW9kZWwuc3VzcGVuZCkKKwkJY2hpcC0+bW9kZWwuc3VzcGVuZChjaGlwKTsKIAogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlzYXZlZF9pbnRlcnJ1cHRfbWFzayA9IGNoaXAtPmludGVycnVwdF9tYXNrOwpAQCAtNjI0LDggKzY2Myw4IEBACiAJaWYgKGNoaXAtPmhhc19hYzk3XzEpCiAJCW94eWdlbl9yZXN0b3JlX2FjOTcoY2hpcCwgMSk7CiAKLQlpZiAoY2hpcC0+bW9kZWwtPnJlc3VtZSkKLQkJY2hpcC0+bW9kZWwtPnJlc3VtZShjaGlwKTsKKwlpZiAoY2hpcC0+bW9kZWwucmVzdW1lKQorCQljaGlwLT5tb2RlbC5yZXN1bWUoY2hpcCk7CiAKIAlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSU5URVJSVVBUX01BU0ssIGNoaXAtPmludGVycnVwdF9tYXNrKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbWl4ZXIuYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX21peGVyLmMKaW5kZXggMDVlYjg5OS4uMzA0ZGExNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9taXhlci5jCkBAIC0zMSw5ICszMSw5IEBACiAJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwogCiAJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKLQlpbmZvLT5jb3VudCA9IGNoaXAtPm1vZGVsLT5kYWNfY2hhbm5lbHM7Ci0JaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSBjaGlwLT5tb2RlbC0+ZGFjX3ZvbHVtZV9taW47Ci0JaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBjaGlwLT5tb2RlbC0+ZGFjX3ZvbHVtZV9tYXg7CisJaW5mby0+Y291bnQgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHM7CisJaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSBjaGlwLT5tb2RlbC5kYWNfdm9sdW1lX21pbjsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IGNoaXAtPm1vZGVsLmRhY192b2x1bWVfbWF4OwogCXJldHVybiAwOwogfQogCkBAIC00NCw3ICs0NCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IGNoaXAtPm1vZGVsLT5kYWNfY2hhbm5lbHM7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzOyArK2kpCiAJCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gY2hpcC0+ZGFjX3ZvbHVtZVtpXTsKIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTU5LDEzICs1OSwxMyBAQAogCiAJY2hhbmdlZCA9IDA7CiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5tb2RlbC0+ZGFjX2NoYW5uZWxzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm1vZGVsLmRhY19jaGFubmVsczsgKytpKQogCQlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gIT0gY2hpcC0+ZGFjX3ZvbHVtZVtpXSkgewogCQkJY2hpcC0+ZGFjX3ZvbHVtZVtpXSA9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOwogCQkJY2hhbmdlZCA9IDE7CiAJCX0KIAlpZiAoY2hhbmdlZCkKLQkJY2hpcC0+bW9kZWwtPnVwZGF0ZV9kYWNfdm9sdW1lKGNoaXApOworCQljaGlwLT5tb2RlbC51cGRhdGVfZGFjX3ZvbHVtZShjaGlwKTsKIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAlyZXR1cm4gY2hhbmdlZDsKIH0KQEAgLTkxLDcgKzkxLDcgQEAKIAljaGFuZ2VkID0gIXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IGNoaXAtPmRhY19tdXRlOwogCWlmIChjaGFuZ2VkKSB7CiAJCWNoaXAtPmRhY19tdXRlID0gIXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQljaGlwLT5tb2RlbC0+dXBkYXRlX2RhY19tdXRlKGNoaXApOworCQljaGlwLT5tb2RlbC51cGRhdGVfZGFjX211dGUoY2hpcCk7CiAJfQogCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwogCXJldHVybiBjaGFuZ2VkOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCSJGcm9udCIsICJGcm9udCtTdXJyb3VuZCIsICJGcm9udCtTdXJyb3VuZCtCYWNrIgogCX07CiAJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDIgKyAoY2hpcC0+bW9kZWwtPmRhY19jaGFubmVscyA9PSA4KTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAyICsgKGNoaXAtPm1vZGVsLmRhY19jaGFubmVscyA9PSA4KTsKIAogCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CiAJaW5mby0+Y291bnQgPSAxOwpAQCAtMTcyLDcgKzE3Miw3IEBACiBzdGF0aWMgaW50IHVwbWl4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQogewogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAyICsgKGNoaXAtPm1vZGVsLT5kYWNfY2hhbm5lbHMgPT0gOCk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMiArIChjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHMgPT0gOCk7CiAJaW50IGNoYW5nZWQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CkBAIC0yMTEsMTMgKzIxMSwxMyBAQAogCWNhc2UgT1hZR0VOX1JBVEVfNjQwMDA6CiAJCXJldHVybiAweGIgPDwgT1hZR0VOX1NQRElGX0NTX1JBVEVfU0hJRlQ7CiAJY2FzZSBPWFlHRU5fUkFURV84ODIwMDoKLQkJcmV0dXJuIDB4OCA8PCBPWFlHRU5fU1BESUZfQ1NfUkFURV9TSElGVDsKKwkJcmV0dXJuIElFQzk1OF9BRVMzX0NPTl9GU184ODIwMCA8PCBPWFlHRU5fU1BESUZfQ1NfUkFURV9TSElGVDsKIAljYXNlIE9YWUdFTl9SQVRFXzk2MDAwOgotCQlyZXR1cm4gMHhhIDw8IE9YWUdFTl9TUERJRl9DU19SQVRFX1NISUZUOworCQlyZXR1cm4gSUVDOTU4X0FFUzNfQ09OX0ZTXzk2MDAwIDw8IE9YWUdFTl9TUERJRl9DU19SQVRFX1NISUZUOwogCWNhc2UgT1hZR0VOX1JBVEVfMTc2NDAwOgotCQlyZXR1cm4gMHhjIDw8IE9YWUdFTl9TUERJRl9DU19SQVRFX1NISUZUOworCQlyZXR1cm4gSUVDOTU4X0FFUzNfQ09OX0ZTXzE3NjQwMCA8PCBPWFlHRU5fU1BESUZfQ1NfUkFURV9TSElGVDsKIAljYXNlIE9YWUdFTl9SQVRFXzE5MjAwMDoKLQkJcmV0dXJuIDB4ZSA8PCBPWFlHRU5fU1BESUZfQ1NfUkFURV9TSElGVDsKKwkJcmV0dXJuIElFQzk1OF9BRVMzX0NPTl9GU18xOTIwMDAgPDwgT1hZR0VOX1NQRElGX0NTX1JBVEVfU0hJRlQ7CiAJfQogfQogCkBAIC01MjEsOCArNTIxLDggQEAKIAl2YWx1ZSA9IG94eWdlbl9yZWFkX2FjOTcoY2hpcCwgMCwgcHJpdl9pZHgpOwogCWlmICghKHZhbHVlICYgMHg4MDAwKSkgewogCQlveHlnZW5fd3JpdGVfYWM5NyhjaGlwLCAwLCBwcml2X2lkeCwgdmFsdWUgfCAweDgwMDApOwotCQlpZiAoY2hpcC0+bW9kZWwtPmFjOTdfc3dpdGNoKQotCQkJY2hpcC0+bW9kZWwtPmFjOTdfc3dpdGNoKGNoaXAsIHByaXZfaWR4LCAweDgwMDApOworCQlpZiAoY2hpcC0+bW9kZWwuYWM5N19zd2l0Y2gpCisJCQljaGlwLT5tb2RlbC5hYzk3X3N3aXRjaChjaGlwLCBwcml2X2lkeCwgMHg4MDAwKTsKIAkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCiAJCQkgICAgICAgJmNoaXAtPmNvbnRyb2xzW2NvbnRyb2xdLT5pZCk7CiAJfQpAQCAtNTQ5LDggKzU0OSw4IEBACiAJY2hhbmdlID0gbmV3cmVnICE9IG9sZHJlZzsKIAlpZiAoY2hhbmdlKSB7CiAJCW94eWdlbl93cml0ZV9hYzk3KGNoaXAsIGNvZGVjLCBpbmRleCwgbmV3cmVnKTsKLQkJaWYgKGNvZGVjID09IDAgJiYgY2hpcC0+bW9kZWwtPmFjOTdfc3dpdGNoKQotCQkJY2hpcC0+bW9kZWwtPmFjOTdfc3dpdGNoKGNoaXAsIGluZGV4LCBuZXdyZWcgJiAweDgwMDApOworCQlpZiAoY29kZWMgPT0gMCAmJiBjaGlwLT5tb2RlbC5hYzk3X3N3aXRjaCkKKwkJCWNoaXAtPm1vZGVsLmFjOTdfc3dpdGNoKGNoaXAsIGluZGV4LCBuZXdyZWcgJiAweDgwMDApOwogCQlpZiAoaW5kZXggPT0gQUM5N19MSU5FKSB7CiAJCQlveHlnZW5fd3JpdGVfYWM5N19tYXNrZWQoY2hpcCwgMCwgQ005NzgwX0dQSU9fU1RBVFVTLAogCQkJCQkJIG5ld3JlZyAmIDB4ODAwMCA/CkBAIC05MzksMTYgKzkzOSwxNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKIAkJdGVtcGxhdGUgPSBjb250cm9sc1tpXTsKLQkJaWYgKGNoaXAtPm1vZGVsLT5jb250cm9sX2ZpbHRlcikgewotCQkJZXJyID0gY2hpcC0+bW9kZWwtPmNvbnRyb2xfZmlsdGVyKCZ0ZW1wbGF0ZSk7CisJCWlmIChjaGlwLT5tb2RlbC5jb250cm9sX2ZpbHRlcikgeworCQkJZXJyID0gY2hpcC0+bW9kZWwuY29udHJvbF9maWx0ZXIoJnRlbXBsYXRlKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCQlpZiAoZXJyID09IDEpCiAJCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCFzdHJjbXAodGVtcGxhdGUubmFtZSwgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiKSAmJgotCQkgICAgY2hpcC0+bW9kZWwtPmRhY190bHYpIHsKLQkJCXRlbXBsYXRlLnRsdi5wID0gY2hpcC0+bW9kZWwtPmRhY190bHY7CisJCSAgICBjaGlwLT5tb2RlbC5kYWNfdGx2KSB7CisJCQl0ZW1wbGF0ZS50bHYucCA9IGNoaXAtPm1vZGVsLmRhY190bHY7CiAJCQl0ZW1wbGF0ZS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEOwogCQl9CiAJCWN0bCA9IHNuZF9jdGxfbmV3MSgmdGVtcGxhdGUsIGNoaXApOwpAQCAtOTc0LDE0ICs5NzQsMTQgQEAKIAllcnIgPSBhZGRfY29udHJvbHMoY2hpcCwgY29udHJvbHMsIEFSUkFZX1NJWkUoY29udHJvbHMpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoY2hpcC0+bW9kZWwtPnBjbV9kZXZfY2ZnICYgQ0FQVFVSRV8xX0ZST01fU1BESUYpIHsKKwlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIENBUFRVUkVfMV9GUk9NX1NQRElGKSB7CiAJCWVyciA9IGFkZF9jb250cm9scyhjaGlwLCBzcGRpZl9pbnB1dF9jb250cm9scywKIAkJCQkgICBBUlJBWV9TSVpFKHNwZGlmX2lucHV0X2NvbnRyb2xzKSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9uaXRvcl9jb250cm9scyk7ICsraSkgewotCQlpZiAoIShjaGlwLT5tb2RlbC0+cGNtX2Rldl9jZmcgJiBtb25pdG9yX2NvbnRyb2xzW2ldLnBjbV9kZXYpKQorCQlpZiAoIShjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgbW9uaXRvcl9jb250cm9sc1tpXS5wY21fZGV2KSkKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBhZGRfY29udHJvbHMoY2hpcCwgbW9uaXRvcl9jb250cm9sc1tpXS5jb250cm9scywKIAkJCQkgICBBUlJBWV9TSVpFKG1vbml0b3JfY29udHJvbHNbaV0uY29udHJvbHMpKTsKQEAgLTEwMDAsNSArMTAwMCw1IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9Ci0JcmV0dXJuIGNoaXAtPm1vZGVsLT5taXhlcl9pbml0ID8gY2hpcC0+bW9kZWwtPm1peGVyX2luaXQoY2hpcCkgOiAwOworCXJldHVybiBjaGlwLT5tb2RlbC5taXhlcl9pbml0ID8gY2hpcC0+bW9kZWwubWl4ZXJfaW5pdChjaGlwKSA6IDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCmluZGV4IGM0YWQ2NWEuLmMyNjIwNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopKHVpbnRwdHJfdCljaGFubmVsOwogCWlmIChjaGFubmVsID09IFBDTV9CICYmIGNoaXAtPmhhc19hYzk3XzEgJiYKLQkgICAgKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIENBUFRVUkVfMl9GUk9NX0FDOTdfMSkpCisJICAgIChjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgQ0FQVFVSRV8yX0ZST01fQUM5N18xKSkKIAkJcnVudGltZS0+aHcgPSBveHlnZW5fYWM5N19oYXJkd2FyZTsKIAllbHNlCiAJCXJ1bnRpbWUtPmh3ID0gKm94eWdlbl9oYXJkd2FyZVtjaGFubmVsXTsKQEAgLTE0MCwxMSArMTQwLDExIEBACiAJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gNDQxMDA7CiAJCWJyZWFrOwogCWNhc2UgUENNX01VTFRJQ0g6Ci0JCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNoaXAtPm1vZGVsLT5kYWNfY2hhbm5lbHM7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNoaXAtPm1vZGVsLmRhY19jaGFubmVsczsKIAkJYnJlYWs7CiAJfQotCWlmIChjaGlwLT5tb2RlbC0+cGNtX2hhcmR3YXJlX2ZpbHRlcikKLQkJY2hpcC0+bW9kZWwtPnBjbV9oYXJkd2FyZV9maWx0ZXIoY2hhbm5lbCwgJnJ1bnRpbWUtPmh3KTsKKwlpZiAoY2hpcC0+bW9kZWwucGNtX2hhcmR3YXJlX2ZpbHRlcikKKwkJY2hpcC0+bW9kZWwucGNtX2hhcmR3YXJlX2ZpbHRlcihjaGFubmVsLCAmcnVudGltZS0+aHcpOwogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCiAJCQkJCSBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAzMik7CiAJaWYgKGVyciA8IDApCkBAIC0zNTUsNyArMzU1LDcgQEAKIAlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0kyU19BX0ZPUk1BVCwKIAkJCSAgICAgIG94eWdlbl9yYXRlKGh3X3BhcmFtcykgfAogCQkJICAgICAgb3h5Z2VuX2kyc19tY2xrKGh3X3BhcmFtcykgfAotCQkJICAgICAgY2hpcC0+bW9kZWwtPmFkY19pMnNfZm9ybWF0IHwKKwkJCSAgICAgIGNoaXAtPm1vZGVsLmFkY19pMnNfZm9ybWF0IHwKIAkJCSAgICAgIG94eWdlbl9pMnNfYml0cyhod19wYXJhbXMpLAogCQkJICAgICAgT1hZR0VOX0kyU19SQVRFX01BU0sgfAogCQkJICAgICAgT1hZR0VOX0kyU19GT1JNQVRfTUFTSyB8CkBAIC0zNjQsNyArMzY0LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQljaGlwLT5tb2RlbC0+c2V0X2FkY19wYXJhbXMoY2hpcCwgaHdfcGFyYW1zKTsKKwljaGlwLT5tb2RlbC5zZXRfYWRjX3BhcmFtcyhjaGlwLCBod19wYXJhbXMpOwogCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlpc19hYzk3ID0gY2hpcC0+aGFzX2FjOTdfMSAmJgotCQkoY2hpcC0+bW9kZWwtPnBjbV9kZXZfY2ZnICYgQ0FQVFVSRV8yX0ZST01fQUM5N18xKTsKKwkJKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBDQVBUVVJFXzJfRlJPTV9BQzk3XzEpOwogCiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCW94eWdlbl93cml0ZThfbWFza2VkKGNoaXAsIE9YWUdFTl9SRUNfRk9STUFULApAQCAtMzkxLDcgKzM5MSw3IEBACiAJCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fSTJTX0JfRk9STUFULAogCQkJCSAgICAgIG94eWdlbl9yYXRlKGh3X3BhcmFtcykgfAogCQkJCSAgICAgIG94eWdlbl9pMnNfbWNsayhod19wYXJhbXMpIHwKLQkJCQkgICAgICBjaGlwLT5tb2RlbC0+YWRjX2kyc19mb3JtYXQgfAorCQkJCSAgICAgIGNoaXAtPm1vZGVsLmFkY19pMnNfZm9ybWF0IHwKIAkJCQkgICAgICBveHlnZW5faTJzX2JpdHMoaHdfcGFyYW1zKSwKIAkJCQkgICAgICBPWFlHRU5fSTJTX1JBVEVfTUFTSyB8CiAJCQkJICAgICAgT1hZR0VOX0kyU19GT1JNQVRfTUFTSyB8CkBAIC00MDEsNyArNDAxLDcgQEAKIAogCWlmICghaXNfYWM5NykgewogCQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JCWNoaXAtPm1vZGVsLT5zZXRfYWRjX3BhcmFtcyhjaGlwLCBod19wYXJhbXMpOworCQljaGlwLT5tb2RlbC5zZXRfYWRjX3BhcmFtcyhjaGlwLCBod19wYXJhbXMpOwogCQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00NjgsNyArNDY4LDcgQEAKIAkJCSAgICAgT1hZR0VOX01VTFRJQ0hfRk9STUFUX01BU0spOwogCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fSTJTX01VTFRJQ0hfRk9STUFULAogCQkJICAgICAgb3h5Z2VuX3JhdGUoaHdfcGFyYW1zKSB8Ci0JCQkgICAgICBjaGlwLT5tb2RlbC0+ZGFjX2kyc19mb3JtYXQgfAorCQkJICAgICAgY2hpcC0+bW9kZWwuZGFjX2kyc19mb3JtYXQgfAogCQkJICAgICAgb3h5Z2VuX2kyc19iaXRzKGh3X3BhcmFtcyksCiAJCQkgICAgICBPWFlHRU5fSTJTX1JBVEVfTUFTSyB8CiAJCQkgICAgICBPWFlHRU5fSTJTX0ZPUk1BVF9NQVNLIHwKQEAgLTQ3OCw3ICs0NzgsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoaXAtPm1vZGVsLT5zZXRfZGFjX3BhcmFtcyhjaGlwLCBod19wYXJhbXMpOworCWNoaXAtPm1vZGVsLnNldF9kYWNfcGFyYW1zKGNoaXAsIGh3X3BhcmFtcyk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NTcsMjUgKzY1NywyNiBAQAogCWludCBvdXRzLCBpbnM7CiAJaW50IGVycjsKIAotCW91dHMgPSAhIShjaGlwLT5tb2RlbC0+cGNtX2Rldl9jZmcgJiBQTEFZQkFDS18wX1RPX0kyUyk7Ci0JaW5zID0gISEoY2hpcC0+bW9kZWwtPnBjbV9kZXZfY2ZnICYgKENBUFRVUkVfMF9GUk9NX0kyU18xIHwKLQkJCQkJICAgICBDQVBUVVJFXzBfRlJPTV9JMlNfMikpOworCW91dHMgPSAhIShjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgUExBWUJBQ0tfMF9UT19JMlMpOworCWlucyA9ICEhKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiAoQ0FQVFVSRV8wX0ZST01fSTJTXzEgfAorCQkJCQkgICAgICBDQVBUVVJFXzBfRlJPTV9JMlNfMikpOwogCWlmIChvdXRzIHwgaW5zKSB7Ci0JCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJBbmFsb2ciLCAwLCBvdXRzLCBpbnMsICZwY20pOworCQllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCAiTXVsdGljaGFubmVsIiwKKwkJCQkgIDAsIG91dHMsIGlucywgJnBjbSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKG91dHMpCiAJCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAogCQkJCQkmb3h5Z2VuX211bHRpY2hfb3BzKTsKLQkJaWYgKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIENBUFRVUkVfMF9GUk9NX0kyU18xKQorCQlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIENBUFRVUkVfMF9GUk9NX0kyU18xKQogCQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAogCQkJCQkmb3h5Z2VuX3JlY19hX29wcyk7Ci0JCWVsc2UgaWYgKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIENBUFRVUkVfMF9GUk9NX0kyU18yKQorCQllbHNlIGlmIChjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgQ0FQVFVSRV8wX0ZST01fSTJTXzIpCiAJCQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCiAJCQkJCSZveHlnZW5fcmVjX2Jfb3BzKTsKIAkJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCQlwY20tPnByaXZhdGVfZnJlZSA9IG94eWdlbl9wY21fZnJlZTsKLQkJc3RyY3B5KHBjbS0+bmFtZSwgIkFuYWxvZyIpOworCQlzdHJjcHkocGNtLT5uYW1lLCAiTXVsdGljaGFubmVsIik7CiAJCWlmIChvdXRzKQogCQkJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSwKIAkJCQkJCSAgICAgIFNORFJWX0RNQV9UWVBFX0RFViwKQEAgLTY5MCw4ICs2OTEsOCBAQAogCQkJCQkJICAgICAgQlVGRkVSX0JZVEVTX01BWCk7CiAJfQogCi0Jb3V0cyA9ICEhKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIFBMQVlCQUNLXzFfVE9fU1BESUYpOwotCWlucyA9ICEhKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIENBUFRVUkVfMV9GUk9NX1NQRElGKTsKKwlvdXRzID0gISEoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIFBMQVlCQUNLXzFfVE9fU1BESUYpOworCWlucyA9ICEhKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBDQVBUVVJFXzFfRlJPTV9TUERJRik7CiAJaWYgKG91dHMgfCBpbnMpIHsKIAkJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIkRpZ2l0YWwiLCAxLCBvdXRzLCBpbnMsICZwY20pOwogCQlpZiAoZXJyIDwgMCkKQEAgLTcxMiwxMSArNzEzLDExIEBACiAJfQogCiAJaWYgKGNoaXAtPmhhc19hYzk3XzEpIHsKLQkJb3V0cyA9ICEhKGNoaXAtPm1vZGVsLT5wY21fZGV2X2NmZyAmIFBMQVlCQUNLXzJfVE9fQUM5N18xKTsKLQkJaW5zID0gISEoY2hpcC0+bW9kZWwtPnBjbV9kZXZfY2ZnICYgQ0FQVFVSRV8yX0ZST01fQUM5N18xKTsKKwkJb3V0cyA9ICEhKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBQTEFZQkFDS18yX1RPX0FDOTdfMSk7CisJCWlucyA9ICEhKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBDQVBUVVJFXzJfRlJPTV9BQzk3XzEpOwogCX0gZWxzZSB7CiAJCW91dHMgPSAwOwotCQlpbnMgPSAhIShjaGlwLT5tb2RlbC0+cGNtX2Rldl9jZmcgJiBDQVBUVVJFXzJfRlJPTV9JMlNfMik7CisJCWlucyA9ICEhKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBDQVBUVVJFXzJfRlJPTV9JMlNfMik7CiAJfQogCWlmIChvdXRzIHwgaW5zKSB7CiAJCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIG91dHMgPyAiQUM5NyIgOiAiQW5hbG9nMiIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMKaW5kZXggMDFkN2I3NS4uOThjNmE4YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi92aXJ0dW9zby5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYwpAQCAtNjIsMTQgKzYyLDY2IEBACiAgKiBBRDAgPC0gMAogICovCiAKKy8qCisgKiBYb25hciBIREFWMS4zIChEZWx1eGUpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ01JODc4ODoKKyAqCisgKiBJwrJDIDwtPiBQQ00xNzk2IChmcm9udCkKKyAqCisgKiBHUEkgMCA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50CisgKgorICogR1BJTyAwIC0+IGVuYWJsZSBvdXRwdXQgdG8gc3BlYWtlcnMKKyAqIEdQSU8gMiAtPiBNMCBvZiBDUzUzODEKKyAqIEdQSU8gMyAtPiBNMSBvZiBDUzUzODEKKyAqIEdQSU8gOCAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIGxpbmUtaW4gKDApIG9yIG1pYy1pbiAoMSkKKyAqCisgKiBUWEQgLT4gSERNSSBjb250cm9sbGVyCisgKiBSWEQgPC0gSERNSSBjb250cm9sbGVyCisgKgorICogUENNMTc5NiBmcm9udDogQUQxLDAgPC0gMCwwCisgKgorICogbm8gZGF1Z2h0ZXJib2FyZAorICogLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEdQSU8gNCA8LSAxCisgKgorICogSDYgZGF1Z2h0ZXJib2FyZAorICogLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEdQSU8gNCA8LSAwCisgKiBHUElPIDUgPC0gMAorICoKKyAqIEnCskMgPC0+IFBDTTE3OTYgKHN1cnJvdW5kKQorICogICAgIDwtPiBQQ00xNzk2IChjZW50ZXIvTEZFKQorICogICAgIDwtPiBQQ00xNzk2IChiYWNrKQorICoKKyAqIFBDTTE3OTYgc3Vycm91bmQ6ICAgQUQxLDAgPC0gMCwxCisgKiBQQ00xNzk2IGNlbnRlci9MRkU6IEFEMSwwIDwtIDEsMAorICogUENNMTc5NiBiYWNrOiAgICAgICBBRDEsMCA8LSAxLDEKKyAqCisgKiB1bmtub3duIGRhdWdodGVyYm9hcmQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEdQSU8gNCA8LSAwCisgKiBHUElPIDUgPC0gMQorICoKKyAqIEnCskMgPC0+IENTNDM2MkEgKHN1cnJvdW5kLCBjZW50ZXIvTEZFLCBiYWNrKQorICoKKyAqIENTNDM2MkE6IEFEMCA8LSAwCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSAib3h5Z2VuLmgiCiAjaW5jbHVkZSAiY205NzgwLmgiCkBAIC05OCwxMiArMTUwLDE1IEBACiAJTU9ERUxfRDJYLAogCU1PREVMX0QxLAogCU1PREVMX0RYLAorCU1PREVMX0hEQVYsCS8qIHdpdGhvdXQgZGF1Z2h0ZXJib2FyZCAqLworCU1PREVMX0hEQVZfSDYsCS8qIHdpdGggSDYgZGF1Z2h0ZXJib2FyZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHhvbmFyX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBPWFlHRU5fUENJX1NVQklEKDB4MTA0MywgMHg4MjY5KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfRDIgfSwKIAl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMDQzLCAweDgyNzUpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9EWCB9LAogCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEwNDMsIDB4ODJiNyksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0QyWCB9LAorCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEwNDMsIDB4ODMxNCksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0hEQVYgfSwKIAl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMDQzLCAweDgzNGYpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9EMSB9LAogCXsgfQogfTsKQEAgLTEyNCwxMSArMTc5LDE4IEBACiAjZGVmaW5lIEdQSU9fRFhfRlJPTlRfUEFORUwJMHgwMDAyCiAjZGVmaW5lIEdQSU9fRFhfSU5QVVRfUk9VVEUJMHgwMTAwCiAKKyNkZWZpbmUgR1BJT19IREFWX0RCX01BU0sJMHgwMDMwCisjZGVmaW5lIEdQSU9fSERBVl9EQl9INgkJMHgwMDAwCisjZGVmaW5lIEdQSU9fSERBVl9EQl9YWAkJMHgwMDIwCisKKyNkZWZpbmUgSTJDX0RFVklDRV9QQ00xNzk2KGkpCSgweDk4ICsgKChpKSA8PCAxKSkJLyogMTAwMTEsIEFEeD1pLCAvVz0wICovCiAjZGVmaW5lIEkyQ19ERVZJQ0VfQ1M0Mzk4CTB4OWUJLyogMTAwMTEsIEFEMT0xLCBBRDA9MSwgL1c9MCAqLwogI2RlZmluZSBJMkNfREVWSUNFX0NTNDM2MkEJMHgzMAkvKiAwMDExMDAsIEFEMD0wLCAvVz0wICovCiAKIHN0cnVjdCB4b25hcl9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgbW9kZWw7CiAJdW5zaWduZWQgaW50IGFudGlfcG9wX2RlbGF5OworCXVuc2lnbmVkIGludCBkYWNzOwogCXUxNiBvdXRwdXRfZW5hYmxlX2JpdDsKIAl1OCBleHRfcG93ZXJfcmVnOwogCXU4IGV4dF9wb3dlcl9pbnRfcmVnOwpAQCAtMTM3LDEwICsxOTksMTMgQEAKIAl1OCBwY20xNzk2X292ZXJzYW1wbGluZzsKIAl1OCBjczQzOThfZm07CiAJdTggY3M0MzYyYV9mbTsKKwl1OCBoZG1pX3BhcmFtc1s1XTsKIH07CiAKLXN0YXRpYyB2b2lkIHBjbTE3OTZfd3JpdGUoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjLAotCQkJICB1OCByZWcsIHU4IHZhbHVlKQorc3RhdGljIHZvaWQgeG9uYXJfZ3Bpb19jaGFuZ2VkKHN0cnVjdCBveHlnZW4gKmNoaXApOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNtMTc5Nl93cml0ZV9zcGkoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjLAorCQkJCSAgICAgdTggcmVnLCB1OCB2YWx1ZSkKIHsKIAkvKiBtYXBzIEFMU0EgY2hhbm5lbCBwYWlyIG51bWJlciB0byBTUEkgb3V0cHV0ICovCiAJc3RhdGljIGNvbnN0IHU4IGNvZGVjX21hcFs0XSA9IHsKQEAgLTE1NCw2ICsyMTksMjIgQEAKIAkJCSAocmVnIDw8IDgpIHwgdmFsdWUpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgcGNtMTc5Nl93cml0ZV9pMmMoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjLAorCQkJCSAgICAgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlveHlnZW5fd3JpdGVfaTJjKGNoaXAsIEkyQ19ERVZJQ0VfUENNMTc5Nihjb2RlYyksIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBwY20xNzk2X3dyaXRlKHN0cnVjdCBveHlnZW4gKmNoaXAsIHVuc2lnbmVkIGludCBjb2RlYywKKwkJCSAgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlpZiAoKGNoaXAtPm1vZGVsLmZ1bmN0aW9uX2ZsYWdzICYgT1hZR0VOX0ZVTkNUSU9OXzJXSVJFX1NQSV9NQVNLKSA9PQorCSAgICBPWFlHRU5fRlVOQ1RJT05fU1BJKQorCQlwY20xNzk2X3dyaXRlX3NwaShjaGlwLCBjb2RlYywgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlwY20xNzk2X3dyaXRlX2kyYyhjaGlwLCBjb2RlYywgcmVnLCB2YWx1ZSk7Cit9CisKIHN0YXRpYyB2b2lkIGNzNDM5OF93cml0ZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1OCByZWcsIHU4IHZhbHVlKQogewogCW94eWdlbl93cml0ZV9pMmMoY2hpcCwgSTJDX0RFVklDRV9DUzQzOTgsIHJlZywgdmFsdWUpOwpAQCAtMTY0LDYgKzI0NSwyNCBAQAogCW94eWdlbl93cml0ZV9pMmMoY2hpcCwgSTJDX0RFVklDRV9DUzQzNjJBLCByZWcsIHZhbHVlKTsKIH0KIAorc3RhdGljIHZvaWQgaGRtaV93cml0ZV9jb21tYW5kKHN0cnVjdCBveHlnZW4gKmNoaXAsIHU4IGNvbW1hbmQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50LCBjb25zdCB1OCAqcGFyYW1zKQoreworCXVuc2lnbmVkIGludCBpOworCXU4IGNoZWNrc3VtOworCisJb3h5Z2VuX3dyaXRlX3VhcnQoY2hpcCwgMHhmYik7CisJb3h5Z2VuX3dyaXRlX3VhcnQoY2hpcCwgMHhlZik7CisJb3h5Z2VuX3dyaXRlX3VhcnQoY2hpcCwgY29tbWFuZCk7CisJb3h5Z2VuX3dyaXRlX3VhcnQoY2hpcCwgY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQlveHlnZW5fd3JpdGVfdWFydChjaGlwLCBwYXJhbXNbaV0pOworCWNoZWNrc3VtID0gMHhmYiArIDB4ZWYgKyBjb21tYW5kICsgY291bnQ7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCWNoZWNrc3VtICs9IHBhcmFtc1tpXTsKKwlveHlnZW5fd3JpdGVfdWFydChjaGlwLCBjaGVja3N1bSk7Cit9CisKIHN0YXRpYyB2b2lkIHhvbmFyX2VuYWJsZV9vdXRwdXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CkBAIC0xODAsNiArMjc5LDcgQEAKIAkJb3h5Z2VuX3NldF9iaXRzOChjaGlwLCBkYXRhLT5leHRfcG93ZXJfaW50X3JlZywKIAkJCQkgZGF0YS0+ZXh0X3Bvd2VyX2JpdCk7CiAJCWNoaXAtPmludGVycnVwdF9tYXNrIHw9IE9YWUdFTl9JTlRfR1BJTzsKKwkJY2hpcC0+bW9kZWwuZ3Bpb19jaGFuZ2VkID0geG9uYXJfZ3Bpb19jaGFuZ2VkOwogCQlkYXRhLT5oYXNfcG93ZXIgPSAhIShveHlnZW5fcmVhZDgoY2hpcCwgZGF0YS0+ZXh0X3Bvd2VyX3JlZykKIAkJCQkgICAgICYgZGF0YS0+ZXh0X3Bvd2VyX2JpdCk7CiAJfQpAQCAtMTkzLDkgKzI5MywxMCBAQAogCiBzdGF0aWMgdm9pZCB1cGRhdGVfcGNtMTc5Nl92b2x1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKKwlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRhY3M7ICsraSkgewogCQlwY20xNzk2X3dyaXRlKGNoaXAsIGksIDE2LCBjaGlwLT5kYWNfdm9sdW1lW2kgKiAyXSk7CiAJCXBjbTE3OTZfd3JpdGUoY2hpcCwgaSwgMTcsIGNoaXAtPmRhY192b2x1bWVbaSAqIDIgKyAxXSk7CiAJfQpAQCAtMjAzLDEzICszMDQsMTQgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX3BjbTE3OTZfbXV0ZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogeworCXN0cnVjdCB4b25hcl9kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1OCB2YWx1ZTsKIAogCXZhbHVlID0gUENNMTc5Nl9ETUZfRElTQUJMRUQgfCBQQ00xNzk2X0ZNVF8yNF9MSlVTVCB8IFBDTTE3OTZfQVRMRDsKIAlpZiAoY2hpcC0+ZGFjX211dGUpCiAJCXZhbHVlIHw9IFBDTTE3OTZfTVVURTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kYWNzOyArK2kpCiAJCXBjbTE3OTZfd3JpdGUoY2hpcCwgaSwgMTgsIHZhbHVlKTsKIH0KIApAQCAtMjE4LDcgKzMyMCw3IEBACiAJc3RydWN0IHhvbmFyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kYWNzOyArK2kpIHsKIAkJcGNtMTc5Nl93cml0ZShjaGlwLCBpLCAxOSwgUENNMTc5Nl9GTFRfU0hBUlAgfCBQQ00xNzk2X0FUU18xKTsKIAkJcGNtMTc5Nl93cml0ZShjaGlwLCBpLCAyMCwgZGF0YS0+cGNtMTc5Nl9vdmVyc2FtcGxpbmcpOwogCQlwY20xNzk2X3dyaXRlKGNoaXAsIGksIDIxLCAwKTsKQEAgLTIzNCw2ICszMzYsMTMgQEAKIAlkYXRhLT5hbnRpX3BvcF9kZWxheSA9IDMwMDsKIAlkYXRhLT5vdXRwdXRfZW5hYmxlX2JpdCA9IEdQSU9fRDJfT1VUUFVUX0VOQUJMRTsKIAlkYXRhLT5wY20xNzk2X292ZXJzYW1wbGluZyA9IFBDTTE3OTZfT1NfNjQ7CisJaWYgKGRhdGEtPm1vZGVsID09IE1PREVMX0QyWCkgeworCQlkYXRhLT5leHRfcG93ZXJfcmVnID0gT1hZR0VOX0dQSU9fREFUQTsKKwkJZGF0YS0+ZXh0X3Bvd2VyX2ludF9yZWcgPSBPWFlHRU5fR1BJT19JTlRFUlJVUFRfTUFTSzsKKwkJZGF0YS0+ZXh0X3Bvd2VyX2JpdCA9IEdQSU9fRDJYX0VYVF9QT1dFUjsKKwkJb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLAorCQkJCSAgICBHUElPX0QyWF9FWFRfUE9XRVIpOworCX0KIAogCXBjbTE3OTZfaW5pdChjaGlwKTsKIApAQCAtMjQ2LDE3ICszNTUsNiBAQAogCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJDUzUzODEiKTsKIH0KIAotc3RhdGljIHZvaWQgeG9uYXJfZDJ4X2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKLXsKLQlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0KLQlkYXRhLT5leHRfcG93ZXJfcmVnID0gT1hZR0VOX0dQSU9fREFUQTsKLQlkYXRhLT5leHRfcG93ZXJfaW50X3JlZyA9IE9YWUdFTl9HUElPX0lOVEVSUlVQVF9NQVNLOwotCWRhdGEtPmV4dF9wb3dlcl9iaXQgPSBHUElPX0QyWF9FWFRfUE9XRVI7Ci0Jb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLCBHUElPX0QyWF9FWFRfUE9XRVIpOwotCXhvbmFyX2QyX2luaXQoY2hpcCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVwZGF0ZV9jczQzNjJhX3ZvbHVtZXMoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAl1OCBtdXRlOwpAQCAtMzI0LDYgKzQyMiwxMSBAQAogCWRhdGEtPmNzNDM5OF9mbSA9IENTNDM5OF9GTV9TSU5HTEUgfCBDUzQzOThfREVNX05PTkUgfCBDUzQzOThfRElGX0xKVVNUOwogCWRhdGEtPmNzNDM2MmFfZm0gPSBDUzQzNjJBX0ZNX1NJTkdMRSB8CiAJCUNTNDM2MkFfQVRBUElfQl9SIHwgQ1M0MzYyQV9BVEFQSV9BX0w7CisJaWYgKGRhdGEtPm1vZGVsID09IE1PREVMX0RYKSB7CisJCWRhdGEtPmV4dF9wb3dlcl9yZWcgPSBPWFlHRU5fR1BJX0RBVEE7CisJCWRhdGEtPmV4dF9wb3dlcl9pbnRfcmVnID0gT1hZR0VOX0dQSV9JTlRFUlJVUFRfTUFTSzsKKwkJZGF0YS0+ZXh0X3Bvd2VyX2JpdCA9IEdQSV9EWF9FWFRfUE9XRVI7CisJfQogCiAJb3h5Z2VuX3dyaXRlMTYoY2hpcCwgT1hZR0VOXzJXSVJFX0JVU19TVEFUVVMsCiAJCSAgICAgICBPWFlHRU5fMldJUkVfTEVOR1RIXzggfApAQCAtMzQ0LDMwICs0NDcsODYgQEAKIAlzbmRfY29tcG9uZW50X2FkZChjaGlwLT5jYXJkLCAiQ1M1MzYxIik7CiB9CiAKLXN0YXRpYyB2b2lkIHhvbmFyX2R4X2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3N0YXRpYyB2b2lkIHhvbmFyX2hkYXZfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogewogCXN0cnVjdCB4b25hcl9kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1OCBwYXJhbTsKIAorCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl8yV0lSRV9CVVNfU1RBVFVTLAorCQkgICAgICAgT1hZR0VOXzJXSVJFX0xFTkdUSF84IHwKKwkJICAgICAgIE9YWUdFTl8yV0lSRV9JTlRFUlJVUFRfTUFTSyB8CisJCSAgICAgICBPWFlHRU5fMldJUkVfU1BFRURfRkFTVCk7CisKKwlkYXRhLT5hbnRpX3BvcF9kZWxheSA9IDEwMDsKKwlkYXRhLT5vdXRwdXRfZW5hYmxlX2JpdCA9IEdQSU9fRFhfT1VUUFVUX0VOQUJMRTsKIAlkYXRhLT5leHRfcG93ZXJfcmVnID0gT1hZR0VOX0dQSV9EQVRBOwogCWRhdGEtPmV4dF9wb3dlcl9pbnRfcmVnID0gT1hZR0VOX0dQSV9JTlRFUlJVUFRfTUFTSzsKIAlkYXRhLT5leHRfcG93ZXJfYml0ID0gR1BJX0RYX0VYVF9QT1dFUjsKLQl4b25hcl9kMV9pbml0KGNoaXApOworCWRhdGEtPnBjbTE3OTZfb3ZlcnNhbXBsaW5nID0gUENNMTc5Nl9PU182NDsKKworCXBjbTE3OTZfaW5pdChjaGlwKTsKKworCW94eWdlbl9zZXRfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsIEdQSU9fRFhfSU5QVVRfUk9VVEUpOworCW94eWdlbl9jbGVhcl9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwgR1BJT19EWF9JTlBVVF9ST1VURSk7CisKKwlveHlnZW5fcmVzZXRfdWFydChjaGlwKTsKKwlwYXJhbSA9IDA7CisJaGRtaV93cml0ZV9jb21tYW5kKGNoaXAsIDB4NjEsIDEsICZwYXJhbSk7CisJcGFyYW0gPSAxOworCWhkbWlfd3JpdGVfY29tbWFuZChjaGlwLCAweDc0LCAxLCAmcGFyYW0pOworCWRhdGEtPmhkbWlfcGFyYW1zWzFdID0gSUVDOTU4X0FFUzNfQ09OX0ZTXzQ4MDAwOworCWRhdGEtPmhkbWlfcGFyYW1zWzRdID0gMTsKKwloZG1pX3dyaXRlX2NvbW1hbmQoY2hpcCwgMHg1NCwgNSwgZGF0YS0+aGRtaV9wYXJhbXMpOworCisJeG9uYXJfY29tbW9uX2luaXQoY2hpcCk7CisKKwlzbmRfY29tcG9uZW50X2FkZChjaGlwLT5jYXJkLCAiUENNMTc5NiIpOworCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJDUzUzODEiKTsKIH0KIAotc3RhdGljIHZvaWQgeG9uYXJfY2xlYW51cChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQorc3RhdGljIHZvaWQgeG9uYXJfZGlzYWJsZV9vdXRwdXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAKIAlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIGRhdGEtPm91dHB1dF9lbmFibGVfYml0KTsKIH0KIAorc3RhdGljIHZvaWQgeG9uYXJfZDJfY2xlYW51cChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXhvbmFyX2Rpc2FibGVfb3V0cHV0KGNoaXApOworfQorCiBzdGF0aWMgdm9pZCB4b25hcl9kMV9jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7Ci0JeG9uYXJfY2xlYW51cChjaGlwKTsKKwl4b25hcl9kaXNhYmxlX291dHB1dChjaGlwKTsKIAljczQzNjJhX3dyaXRlKGNoaXAsIDB4MDEsIENTNDM2MkFfUEROIHwgQ1M0MzYyQV9DUEVOKTsKIAlveHlnZW5fY2xlYXJfYml0czgoY2hpcCwgT1hZR0VOX0ZVTkNUSU9OLCBPWFlHRU5fRlVOQ1RJT05fUkVTRVRfQ09ERUMpOwogfQogCitzdGF0aWMgdm9pZCB4b25hcl9oZGF2X2NsZWFudXAoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl1OCBwYXJhbSA9IDA7CisKKwloZG1pX3dyaXRlX2NvbW1hbmQoY2hpcCwgMHg3NCwgMSwgJnBhcmFtKTsKKwl4b25hcl9kaXNhYmxlX291dHB1dChjaGlwKTsKK30KKworc3RhdGljIHZvaWQgeG9uYXJfZDJfc3VzcGVuZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXhvbmFyX2QyX2NsZWFudXAoY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIHhvbmFyX2QxX3N1c3BlbmQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl4b25hcl9kMV9jbGVhbnVwKGNoaXApOworfQorCitzdGF0aWMgdm9pZCB4b25hcl9oZGF2X3N1c3BlbmQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl4b25hcl9oZGF2X2NsZWFudXAoY2hpcCk7CisJbXNsZWVwKDIpOworfQorCiBzdGF0aWMgdm9pZCB4b25hcl9kMl9yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlwY20xNzk2X2luaXQoY2hpcCk7CkBAIC0zODAsNiArNTM5LDMzIEBACiAJeG9uYXJfZW5hYmxlX291dHB1dChjaGlwKTsKIH0KIAorc3RhdGljIHZvaWQgeG9uYXJfaGRhdl9yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdTggcGFyYW07CisKKwlveHlnZW5fcmVzZXRfdWFydChjaGlwKTsKKwlwYXJhbSA9IDA7CisJaGRtaV93cml0ZV9jb21tYW5kKGNoaXAsIDB4NjEsIDEsICZwYXJhbSk7CisJcGFyYW0gPSAxOworCWhkbWlfd3JpdGVfY29tbWFuZChjaGlwLCAweDc0LCAxLCAmcGFyYW0pOworCWhkbWlfd3JpdGVfY29tbWFuZChjaGlwLCAweDU0LCA1LCBkYXRhLT5oZG1pX3BhcmFtcyk7CisJcGNtMTc5Nl9pbml0KGNoaXApOworCXhvbmFyX2VuYWJsZV9vdXRwdXQoY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIHhvbmFyX2hkYXZfcGNtX2hhcmR3YXJlX2ZpbHRlcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCQkJICAgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgKmhhcmR3YXJlKQoreworCWlmIChjaGFubmVsID09IFBDTV9NVUxUSUNIKSB7CisJCWhhcmR3YXJlLT5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJCQkgIFNORFJWX1BDTV9SQVRFXzE5MjAwMDsKKwkJaGFyZHdhcmUtPnJhdGVfbWluID0gNDQxMDA7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzZXRfcGNtMTc5Nl9wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKIAkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTM4OCw3ICs1NzQsNyBAQAogCiAJZGF0YS0+cGNtMTc5Nl9vdmVyc2FtcGxpbmcgPQogCQlwYXJhbXNfcmF0ZShwYXJhbXMpID49IDk2MDAwID8gUENNMTc5Nl9PU18zMiA6IFBDTTE3OTZfT1NfNjQ7Ci0JZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGFjczsgKytpKQogCQlwY20xNzk2X3dyaXRlKGNoaXAsIGksIDIwLCBkYXRhLT5wY20xNzk2X292ZXJzYW1wbGluZyk7CiB9CiAKQEAgLTQzMCw2ICs2MTYsNDIgQEAKIAljczQzNjJhX3dyaXRlKGNoaXAsIDB4MGMsIGRhdGEtPmNzNDM2MmFfZm0pOwogfQogCitzdGF0aWMgdm9pZCBzZXRfaGRtaV9wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgeG9uYXJfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwlkYXRhLT5oZG1pX3BhcmFtc1swXSA9IDA7IC8qIDEgPSBub24tYXVkaW8gKi8KKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDQ0MTAwOgorCQlkYXRhLT5oZG1pX3BhcmFtc1sxXSA9IElFQzk1OF9BRVMzX0NPTl9GU180NDEwMDsKKwkJYnJlYWs7CisJY2FzZSA0ODAwMDoKKwkJZGF0YS0+aGRtaV9wYXJhbXNbMV0gPSBJRUM5NThfQUVTM19DT05fRlNfNDgwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDk2MDAwICovCisJCWRhdGEtPmhkbWlfcGFyYW1zWzFdID0gSUVDOTU4X0FFUzNfQ09OX0ZTXzk2MDAwOworCQlicmVhazsKKwljYXNlIDE5MjAwMDoKKwkJZGF0YS0+aGRtaV9wYXJhbXNbMV0gPSBJRUM5NThfQUVTM19DT05fRlNfMTkyMDAwOworCQlicmVhazsKKwl9CisJZGF0YS0+aGRtaV9wYXJhbXNbMl0gPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSAvIDIgLSAxOworCWlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCisJCWRhdGEtPmhkbWlfcGFyYW1zWzNdID0gMDsKKwllbHNlCisJCWRhdGEtPmhkbWlfcGFyYW1zWzNdID0gMHhjMDsKKwlkYXRhLT5oZG1pX3BhcmFtc1s0XSA9IDE7IC8qID8gKi8KKwloZG1pX3dyaXRlX2NvbW1hbmQoY2hpcCwgMHg1NCwgNSwgZGF0YS0+aGRtaV9wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfaGRhdl9wYXJhbXMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzZXRfcGNtMTc5Nl9wYXJhbXMoY2hpcCwgcGFyYW1zKTsKKwlzZXRfaGRtaV9wYXJhbXMoY2hpcCwgcGFyYW1zKTsKK30KKwogc3RhdGljIHZvaWQgeG9uYXJfZ3Bpb19jaGFuZ2VkKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiAJc3RydWN0IHhvbmFyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwpAQCAtNDQ5LDI5ICs2NzEsNDMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYWx0X3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3N0YXRpYyB2b2lkIHhvbmFyX2hkYXZfdWFydF9pbnB1dChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCWlmIChjaGlwLT51YXJ0X2lucHV0X2NvdW50ID49IDIgJiYKKwkgICAgY2hpcC0+dWFydF9pbnB1dFtjaGlwLT51YXJ0X2lucHV0X2NvdW50IC0gMl0gPT0gJ08nICYmCisJICAgIGNoaXAtPnVhcnRfaW5wdXRbY2hpcC0+dWFydF9pbnB1dF9jb3VudCAtIDFdID09ICdLJykgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWVzc2FnZSBmcm9tIFhvbmFyIEhEQVYgSERNSSBjaGlwIHJlY2VpdmVkOiIpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJCSAgICAgY2hpcC0+dWFydF9pbnB1dCwgY2hpcC0+dWFydF9pbnB1dF9jb3VudCk7CisJCWNoaXAtPnVhcnRfaW5wdXRfY291bnQgPSAwOworCX0KK30KKworc3RhdGljIGludCBncGlvX2JpdF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJdTE2IGJpdCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKIAogCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJISEob3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKSAmIEdQSU9fRDJfQUxUKTsKKwkJISEob3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKSAmIGJpdCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWx0X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3N0YXRpYyBpbnQgZ3Bpb19iaXRfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCiB7CiAJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXUxNiBiaXQgPSBjdGwtPnByaXZhdGVfdmFsdWU7CiAJdTE2IG9sZF9iaXRzLCBuZXdfYml0czsKIAlpbnQgY2hhbmdlZDsKIAogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlvbGRfYml0cyA9IG94eWdlbl9yZWFkMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSk7CiAJaWYgKHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQluZXdfYml0cyA9IG9sZF9iaXRzIHwgR1BJT19EMl9BTFQ7CisJCW5ld19iaXRzID0gb2xkX2JpdHMgfCBiaXQ7CiAJZWxzZQotCQluZXdfYml0cyA9IG9sZF9iaXRzICYgfkdQSU9fRDJfQUxUOworCQluZXdfYml0cyA9IG9sZF9iaXRzICYgfmJpdDsKIAljaGFuZ2VkID0gbmV3X2JpdHMgIT0gb2xkX2JpdHM7CiAJaWYgKGNoYW5nZWQpCiAJCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIG5ld19iaXRzKTsKQEAgLTQ4Myw0NyArNzE5LDIyIEBACiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiQW5hbG9nIExvb3BiYWNrIFN3aXRjaCIsCiAJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCS5nZXQgPSBhbHRfc3dpdGNoX2dldCwKLQkucHV0ID0gYWx0X3N3aXRjaF9wdXQsCisJLmdldCA9IGdwaW9fYml0X3N3aXRjaF9nZXQsCisJLnB1dCA9IGdwaW9fYml0X3N3aXRjaF9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSBHUElPX0QyX0FMVCwKIH07CiAKLXN0YXRpYyBpbnQgZnJvbnRfcGFuZWxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQotCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJISEob3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKSAmIEdQSU9fRFhfRlJPTlRfUEFORUwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZyb250X3BhbmVsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7Ci0JdTE2IG9sZF9yZWcsIG5ld19yZWc7Ci0KLQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7Ci0Jb2xkX3JlZyA9IG94eWdlbl9yZWFkMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSk7Ci0JaWYgKHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQluZXdfcmVnID0gb2xkX3JlZyB8IEdQSU9fRFhfRlJPTlRfUEFORUw7Ci0JZWxzZQotCQluZXdfcmVnID0gb2xkX3JlZyAmIH5HUElPX0RYX0ZST05UX1BBTkVMOwotCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIG5ld19yZWcpOwotCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiBvbGRfcmVnICE9IG5ld19yZWc7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmcm9udF9wYW5lbF9zd2l0Y2ggPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiRnJvbnQgUGFuZWwgU3dpdGNoIiwKIAkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JLmdldCA9IGZyb250X3BhbmVsX2dldCwKLQkucHV0ID0gZnJvbnRfcGFuZWxfcHV0LAorCS5nZXQgPSBncGlvX2JpdF9zd2l0Y2hfZ2V0LAorCS5wdXQgPSBncGlvX2JpdF9zd2l0Y2hfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gR1BJT19EWF9GUk9OVF9QQU5FTCwKIH07CiAKLXN0YXRpYyB2b2lkIHhvbmFyX2QxX2FjOTdfc3dpdGNoKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkJIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBtdXRlKQorc3RhdGljIHZvaWQgeG9uYXJfbGluZV9taWNfYWM5N19zd2l0Y2goc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG11dGUpCiB7CiAJaWYgKHJlZyA9PSBBQzk3X0xJTkUpIHsKIAkJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwpAQCAtNTUyLDcgKzc2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeG9uYXJfbWl4ZXJfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQorc3RhdGljIGludCB4b25hcl9kMl9taXhlcl9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiAJcmV0dXJuIHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmYWx0X3N3aXRjaCwgY2hpcCkpOwogfQpAQCAtNTYyLDEzMCArNzczLDE0NyBAQAogCXJldHVybiBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJmZyb250X3BhbmVsX3N3aXRjaCwgY2hpcCkpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCB4b25hcl9tb2RlbHNbXSA9IHsKLQlbTU9ERUxfRDJdID0gewotCQkuc2hvcnRuYW1lID0gIlhvbmFyIEQyIiwKLQkJLmxvbmduYW1lID0gIkFzdXMgVmlydHVvc28gMjAwIiwKLQkJLmNoaXAgPSAiQVYyMDAiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLmluaXQgPSB4b25hcl9kMl9pbml0LAotCQkuY29udHJvbF9maWx0ZXIgPSB4b25hcl9kMl9jb250cm9sX2ZpbHRlciwKLQkJLm1peGVyX2luaXQgPSB4b25hcl9taXhlcl9pbml0LAotCQkuY2xlYW51cCA9IHhvbmFyX2NsZWFudXAsCi0JCS5zdXNwZW5kID0geG9uYXJfY2xlYW51cCwKLQkJLnJlc3VtZSA9IHhvbmFyX2QyX3Jlc3VtZSwKLQkJLnNldF9kYWNfcGFyYW1zID0gc2V0X3BjbTE3OTZfcGFyYW1zLAotCQkuc2V0X2FkY19wYXJhbXMgPSBzZXRfY3M1M3gxX3BhcmFtcywKLQkJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3BjbTE3OTZfdm9sdW1lLAotCQkudXBkYXRlX2RhY19tdXRlID0gdXBkYXRlX3BjbTE3OTZfbXV0ZSwKLQkJLmRhY190bHYgPSBwY20xNzk2X2RiX3NjYWxlLAotCQkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB4b25hcl9kYXRhKSwKLQkJLnBjbV9kZXZfY2ZnID0gUExBWUJBQ0tfMF9UT19JMlMgfAotCQkJICAgICAgIFBMQVlCQUNLXzFfVE9fU1BESUYgfAotCQkJICAgICAgIENBUFRVUkVfMF9GUk9NX0kyU18yIHwKLQkJCSAgICAgICBDQVBUVVJFXzFfRlJPTV9TUERJRiwKLQkJLmRhY19jaGFubmVscyA9IDgsCi0JCS5kYWNfdm9sdW1lX21pbiA9IDB4MGYsCi0JCS5kYWNfdm9sdW1lX21heCA9IDB4ZmYsCi0JCS5taXNjX2ZsYWdzID0gT1hZR0VOX01JU0NfTUlESSwKLQkJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSB8Ci0JCQkJICBPWFlHRU5fRlVOQ1RJT05fRU5BQkxFX1NQSV80XzUsCi0JCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCQkuYWRjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKLQl9LAotCVtNT0RFTF9EMlhdID0gewotCQkuc2hvcnRuYW1lID0gIlhvbmFyIEQyWCIsCi0JCS5sb25nbmFtZSA9ICJBc3VzIFZpcnR1b3NvIDIwMCIsCi0JCS5jaGlwID0gIkFWMjAwIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5pbml0ID0geG9uYXJfZDJ4X2luaXQsCi0JCS5jb250cm9sX2ZpbHRlciA9IHhvbmFyX2QyX2NvbnRyb2xfZmlsdGVyLAotCQkubWl4ZXJfaW5pdCA9IHhvbmFyX21peGVyX2luaXQsCi0JCS5jbGVhbnVwID0geG9uYXJfY2xlYW51cCwKLQkJLnN1c3BlbmQgPSB4b25hcl9jbGVhbnVwLAotCQkucmVzdW1lID0geG9uYXJfZDJfcmVzdW1lLAotCQkuc2V0X2RhY19wYXJhbXMgPSBzZXRfcGNtMTc5Nl9wYXJhbXMsCi0JCS5zZXRfYWRjX3BhcmFtcyA9IHNldF9jczUzeDFfcGFyYW1zLAotCQkudXBkYXRlX2RhY192b2x1bWUgPSB1cGRhdGVfcGNtMTc5Nl92b2x1bWUsCi0JCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfcGNtMTc5Nl9tdXRlLAotCQkuZ3Bpb19jaGFuZ2VkID0geG9uYXJfZ3Bpb19jaGFuZ2VkLAotCQkuZGFjX3RsdiA9IHBjbTE3OTZfZGJfc2NhbGUsCi0JCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX2RhdGEpLAotCQkucGNtX2Rldl9jZmcgPSBQTEFZQkFDS18wX1RPX0kyUyB8Ci0JCQkgICAgICAgUExBWUJBQ0tfMV9UT19TUERJRiB8Ci0JCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAotCQkJICAgICAgIENBUFRVUkVfMV9GUk9NX1NQRElGLAotCQkuZGFjX2NoYW5uZWxzID0gOCwKLQkJLmRhY192b2x1bWVfbWluID0gMHgwZiwKLQkJLmRhY192b2x1bWVfbWF4ID0gMHhmZiwKLQkJLm1pc2NfZmxhZ3MgPSBPWFlHRU5fTUlTQ19NSURJLAotCQkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fU1BJIHwKLQkJCQkgIE9YWUdFTl9GVU5DVElPTl9FTkFCTEVfU1BJXzRfNSwKLQkJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCi0JCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCX0sCi0JW01PREVMX0QxXSA9IHsKLQkJLnNob3J0bmFtZSA9ICJYb25hciBEMSIsCi0JCS5sb25nbmFtZSA9ICJBc3VzIFZpcnR1b3NvIDEwMCIsCi0JCS5jaGlwID0gIkFWMjAwIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5pbml0ID0geG9uYXJfZDFfaW5pdCwKLQkJLmNvbnRyb2xfZmlsdGVyID0geG9uYXJfZDFfY29udHJvbF9maWx0ZXIsCi0JCS5taXhlcl9pbml0ID0geG9uYXJfZDFfbWl4ZXJfaW5pdCwKLQkJLmNsZWFudXAgPSB4b25hcl9kMV9jbGVhbnVwLAotCQkuc3VzcGVuZCA9IHhvbmFyX2QxX2NsZWFudXAsCi0JCS5yZXN1bWUgPSB4b25hcl9kMV9yZXN1bWUsCi0JCS5zZXRfZGFjX3BhcmFtcyA9IHNldF9jczQzeHhfcGFyYW1zLAotCQkuc2V0X2FkY19wYXJhbXMgPSBzZXRfY3M1M3gxX3BhcmFtcywKLQkJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2NzNDN4eF92b2x1bWUsCi0JCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfY3M0M3h4X211dGUsCi0JCS5hYzk3X3N3aXRjaCA9IHhvbmFyX2QxX2FjOTdfc3dpdGNoLAotCQkuZGFjX3RsdiA9IGNzNDM2MmFfZGJfc2NhbGUsCi0JCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX2RhdGEpLAotCQkucGNtX2Rldl9jZmcgPSBQTEFZQkFDS18wX1RPX0kyUyB8Ci0JCQkgICAgICAgUExBWUJBQ0tfMV9UT19TUERJRiB8Ci0JCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzIsCi0JCS5kYWNfY2hhbm5lbHMgPSA4LAotCQkuZGFjX3ZvbHVtZV9taW4gPSAwLAotCQkuZGFjX3ZvbHVtZV9tYXggPSAxMjcsCi0JCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl8yV0lSRSwKLQkJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCi0JCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCX0sCi0JW01PREVMX0RYXSA9IHsKLQkJLnNob3J0bmFtZSA9ICJYb25hciBEWCIsCi0JCS5sb25nbmFtZSA9ICJBc3VzIFZpcnR1b3NvIDEwMCIsCi0JCS5jaGlwID0gIkFWMjAwIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5pbml0ID0geG9uYXJfZHhfaW5pdCwKLQkJLmNvbnRyb2xfZmlsdGVyID0geG9uYXJfZDFfY29udHJvbF9maWx0ZXIsCi0JCS5taXhlcl9pbml0ID0geG9uYXJfZDFfbWl4ZXJfaW5pdCwKLQkJLmNsZWFudXAgPSB4b25hcl9kMV9jbGVhbnVwLAotCQkuc3VzcGVuZCA9IHhvbmFyX2QxX2NsZWFudXAsCi0JCS5yZXN1bWUgPSB4b25hcl9kMV9yZXN1bWUsCi0JCS5zZXRfZGFjX3BhcmFtcyA9IHNldF9jczQzeHhfcGFyYW1zLAotCQkuc2V0X2FkY19wYXJhbXMgPSBzZXRfY3M1M3gxX3BhcmFtcywKLQkJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2NzNDN4eF92b2x1bWUsCi0JCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfY3M0M3h4X211dGUsCi0JCS5ncGlvX2NoYW5nZWQgPSB4b25hcl9ncGlvX2NoYW5nZWQsCi0JCS5hYzk3X3N3aXRjaCA9IHhvbmFyX2QxX2FjOTdfc3dpdGNoLAotCQkuZGFjX3RsdiA9IGNzNDM2MmFfZGJfc2NhbGUsCi0JCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX2RhdGEpLAotCQkucGNtX2Rldl9jZmcgPSBQTEFZQkFDS18wX1RPX0kyUyB8Ci0JCQkgICAgICAgUExBWUJBQ0tfMV9UT19TUERJRiB8Ci0JCQkgICAgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzIsCi0JCS5kYWNfY2hhbm5lbHMgPSA4LAotCQkuZGFjX3ZvbHVtZV9taW4gPSAwLAotCQkuZGFjX3ZvbHVtZV9tYXggPSAxMjcsCi0JCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl8yV0lSRSwKLQkJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCi0JCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAotCX0sCitzdGF0aWMgaW50IHhvbmFyX21vZGVsX3Byb2JlKHN0cnVjdCBveHlnZW4gKmNoaXAsIHVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7CisJCVtNT0RFTF9EMV0JPSAiWG9uYXIgRDEiLAorCQlbTU9ERUxfRFhdCT0gIlhvbmFyIERYIiwKKwkJW01PREVMX0QyXQk9ICJYb25hciBEMiIsCisJCVtNT0RFTF9EMlhdCT0gIlhvbmFyIEQyWCIsCisJCVtNT0RFTF9IREFWXQk9ICJYb25hciBIREFWMS4zIiwKKwkJW01PREVMX0hEQVZfSDZdCT0gIlhvbmFyIEhEQVYxLjMrSDYiLAorCX07CisJc3RhdGljIGNvbnN0IHU4IGRhY3NbXSA9IHsKKwkJW01PREVMX0QxXQk9IDIsCisJCVtNT0RFTF9EWF0JPSAyLAorCQlbTU9ERUxfRDJdCT0gNCwKKwkJW01PREVMX0QyWF0JPSA0LAorCQlbTU9ERUxfSERBVl0JPSAxLAorCQlbTU9ERUxfSERBVl9INl0JPSA0LAorCX07CisJc3RydWN0IHhvbmFyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJZGF0YS0+bW9kZWwgPSBkcml2ZXJfZGF0YTsKKwlpZiAoZGF0YS0+bW9kZWwgPT0gTU9ERUxfSERBVikgeworCQlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsCisJCQkJICAgIEdQSU9fSERBVl9EQl9NQVNLKTsKKwkJc3dpdGNoIChveHlnZW5fcmVhZDE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEpICYKKwkJCUdQSU9fSERBVl9EQl9NQVNLKSB7CisJCWNhc2UgR1BJT19IREFWX0RCX0g2OgorCQkJZGF0YS0+bW9kZWwgPSBNT0RFTF9IREFWX0g2OworCQkJYnJlYWs7CisJCWNhc2UgR1BJT19IREFWX0RCX1hYOgorCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5rbm93biBkYXVnaHRlcmJvYXJkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZGF0YS0+ZGFjcyA9IGRhY3NbZGF0YS0+bW9kZWxdOworCWNoaXAtPm1vZGVsLnNob3J0bmFtZSA9IG5hbWVzW2RhdGEtPm1vZGVsXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfeG9uYXJfZDIgPSB7CisJLmxvbmduYW1lID0gIkFzdXMgVmlydHVvc28gMjAwIiwKKwkuY2hpcCA9ICJBVjIwMCIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnByb2JlID0geG9uYXJfbW9kZWxfcHJvYmUsCisJLmluaXQgPSB4b25hcl9kMl9pbml0LAorCS5jb250cm9sX2ZpbHRlciA9IHhvbmFyX2QyX2NvbnRyb2xfZmlsdGVyLAorCS5taXhlcl9pbml0ID0geG9uYXJfZDJfbWl4ZXJfaW5pdCwKKwkuY2xlYW51cCA9IHhvbmFyX2QyX2NsZWFudXAsCisJLnN1c3BlbmQgPSB4b25hcl9kMl9zdXNwZW5kLAorCS5yZXN1bWUgPSB4b25hcl9kMl9yZXN1bWUsCisJLnNldF9kYWNfcGFyYW1zID0gc2V0X3BjbTE3OTZfcGFyYW1zLAorCS5zZXRfYWRjX3BhcmFtcyA9IHNldF9jczUzeDFfcGFyYW1zLAorCS51cGRhdGVfZGFjX3ZvbHVtZSA9IHVwZGF0ZV9wY20xNzk2X3ZvbHVtZSwKKwkudXBkYXRlX2RhY19tdXRlID0gdXBkYXRlX3BjbTE3OTZfbXV0ZSwKKwkuZGFjX3RsdiA9IHBjbTE3OTZfZGJfc2NhbGUsCisJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeG9uYXJfZGF0YSksCisJLmRldmljZV9jb25maWcgPSBQTEFZQkFDS18wX1RPX0kyUyB8CisJCQkgUExBWUJBQ0tfMV9UT19TUERJRiB8CisJCQkgQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAorCQkJIENBUFRVUkVfMV9GUk9NX1NQRElGIHwKKwkJCSBNSURJX09VVFBVVCB8CisJCQkgTUlESV9JTlBVVCwKKwkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX3ZvbHVtZV9taW4gPSAweDBmLAorCS5kYWNfdm9sdW1lX21heCA9IDB4ZmYsCisJLm1pc2NfZmxhZ3MgPSBPWFlHRU5fTUlTQ19NSURJLAorCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl9TUEkgfAorCQkJICBPWFlHRU5fRlVOQ1RJT05fRU5BQkxFX1NQSV80XzUsCisJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9kMSA9IHsKKwkubG9uZ25hbWUgPSAiQXN1cyBWaXJ0dW9zbyAxMDAiLAorCS5jaGlwID0gIkFWMjAwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucHJvYmUgPSB4b25hcl9tb2RlbF9wcm9iZSwKKwkuaW5pdCA9IHhvbmFyX2QxX2luaXQsCisJLmNvbnRyb2xfZmlsdGVyID0geG9uYXJfZDFfY29udHJvbF9maWx0ZXIsCisJLm1peGVyX2luaXQgPSB4b25hcl9kMV9taXhlcl9pbml0LAorCS5jbGVhbnVwID0geG9uYXJfZDFfY2xlYW51cCwKKwkuc3VzcGVuZCA9IHhvbmFyX2QxX3N1c3BlbmQsCisJLnJlc3VtZSA9IHhvbmFyX2QxX3Jlc3VtZSwKKwkuc2V0X2RhY19wYXJhbXMgPSBzZXRfY3M0M3h4X3BhcmFtcywKKwkuc2V0X2FkY19wYXJhbXMgPSBzZXRfY3M1M3gxX3BhcmFtcywKKwkudXBkYXRlX2RhY192b2x1bWUgPSB1cGRhdGVfY3M0M3h4X3ZvbHVtZSwKKwkudXBkYXRlX2RhY19tdXRlID0gdXBkYXRlX2NzNDN4eF9tdXRlLAorCS5hYzk3X3N3aXRjaCA9IHhvbmFyX2xpbmVfbWljX2FjOTdfc3dpdGNoLAorCS5kYWNfdGx2ID0gY3M0MzYyYV9kYl9zY2FsZSwKKwkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB4b25hcl9kYXRhKSwKKwkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKKwkJCSBQTEFZQkFDS18xX1RPX1NQRElGIHwKKwkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMiwKKwkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX3ZvbHVtZV9taW4gPSAwLAorCS5kYWNfdm9sdW1lX21heCA9IDEyNywKKwkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fMldJUkUsCisJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9oZGF2ID0geworCS5sb25nbmFtZSA9ICJBc3VzIFZpcnR1b3NvIDIwMCIsCisJLmNoaXAgPSAiQVYyMDAiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5wcm9iZSA9IHhvbmFyX21vZGVsX3Byb2JlLAorCS5pbml0ID0geG9uYXJfaGRhdl9pbml0LAorCS5jbGVhbnVwID0geG9uYXJfaGRhdl9jbGVhbnVwLAorCS5zdXNwZW5kID0geG9uYXJfaGRhdl9zdXNwZW5kLAorCS5yZXN1bWUgPSB4b25hcl9oZGF2X3Jlc3VtZSwKKwkucGNtX2hhcmR3YXJlX2ZpbHRlciA9IHhvbmFyX2hkYXZfcGNtX2hhcmR3YXJlX2ZpbHRlciwKKwkuc2V0X2RhY19wYXJhbXMgPSBzZXRfaGRhdl9wYXJhbXMsCisJLnNldF9hZGNfcGFyYW1zID0gc2V0X2NzNTN4MV9wYXJhbXMsCisJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3BjbTE3OTZfdm9sdW1lLAorCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfcGNtMTc5Nl9tdXRlLAorCS51YXJ0X2lucHV0ID0geG9uYXJfaGRhdl91YXJ0X2lucHV0LAorCS5hYzk3X3N3aXRjaCA9IHhvbmFyX2xpbmVfbWljX2FjOTdfc3dpdGNoLAorCS5kYWNfdGx2ID0gcGNtMTc5Nl9kYl9zY2FsZSwKKwkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB4b25hcl9kYXRhKSwKKwkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKKwkJCSBQTEFZQkFDS18xX1RPX1NQRElGIHwKKwkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMiwKKwkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX3ZvbHVtZV9taW4gPSAweDBmLAorCS5kYWNfdm9sdW1lX21heCA9IDB4ZmYsCisJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OXzJXSVJFLAorCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAorCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgeG9uYXJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKIHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCAqY29uc3QgbW9kZWxzW10gPSB7CisJCVtNT0RFTF9EMV0JPSAmbW9kZWxfeG9uYXJfZDEsCisJCVtNT0RFTF9EWF0JPSAmbW9kZWxfeG9uYXJfZDEsCisJCVtNT0RFTF9EMl0JPSAmbW9kZWxfeG9uYXJfZDIsCisJCVtNT0RFTF9EMlhdCT0gJm1vZGVsX3hvbmFyX2QyLAorCQlbTU9ERUxfSERBVl0JPSAmbW9kZWxfeG9uYXJfaGRhdiwKKwl9OwogCXN0YXRpYyBpbnQgZGV2OwogCWludCBlcnI7CiAKQEAgLTY5NSw4ICs5MjMsMTAgQEAKIAkJKytkZXY7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KKwlCVUdfT04ocGNpX2lkLT5kcml2ZXJfZGF0YSA+PSBBUlJBWV9TSVpFKG1vZGVscykpOwogCWVyciA9IG94eWdlbl9wY2lfcHJvYmUocGNpLCBpbmRleFtkZXZdLCBpZFtkZXZdLAotCQkJICAgICAgICZ4b25hcl9tb2RlbHNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pOworCQkJICAgICAgIG1vZGVsc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwKKwkJCSAgICAgICBwY2lfaWQtPmRyaXZlcl9kYXRhKTsKIAlpZiAoZXJyID49IDApCiAJCSsrZGV2OwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IDJjN2UyNTMuLjBlMDZjNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC00NjQsNyArNDY0LDggQEAKIAlwY3hocl9pbml0X3JtaCgmcm1oLCBDTURfVVBEQVRFX1JfQlVGRkVSUyk7CiAJcGN4aHJfc2V0X3BpcGVfY21kX3BhcmFtcygmcm1oLCBpc19jYXB0dXJlLCBzdHJlYW0tPnBpcGUtPmZpcnN0X2F1ZGlvLCBzdHJlYW1fbnVtLCAwKTsKIAotCXNuZF9hc3NlcnQoc3Vicy0+cnVudGltZS0+ZG1hX2J5dGVzIDwgMHgyMDAwMDApOwkvKiBtYXggYnVmZmVyIHNpemUgaXMgMiBNQnl0ZSAqLworCS8qIG1heCBidWZmZXIgc2l6ZSBpcyAyIE1CeXRlICovCisJc25kX0JVR19PTihzdWJzLT5ydW50aW1lLT5kbWFfYnl0ZXMgPj0gMHgyMDAwMDApOwogCXJtaC5jbWRbMV0gPSBzdWJzLT5ydW50aW1lLT5kbWFfYnl0ZXMgKiA4OwkJLyogc2l6ZSBpbiBiaXRzICovCiAJcm1oLmNtZFsyXSA9IHN1YnMtPnJ1bnRpbWUtPmRtYV9hZGRyID4+IDI0OwkJLyogbW9zdCBzaWduaWZpY2FudCBieXRlICovCiAJcm1oLmNtZFsyXSB8PSAxPDwxOTsJCQkJCS8qIHRoaXMgaXMgYSBjaXJjdWxhciBidWZmZXIgKi8KQEAgLTEyMjgsNyArMTIyOSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNuZF9hc3NlcnQocGNpX2lkLT5kcml2ZXJfZGF0YSA8IFBDSV9JRF9MQVNULCByZXR1cm4gLUVOT0RFVik7CisJaWYgKHNuZF9CVUdfT04ocGNpX2lkLT5kcml2ZXJfZGF0YSA+PSBQQ0lfSURfTEFTVCkpCisJCXJldHVybiAtRU5PREVWOwogCWNhcmRfbmFtZSA9IHBjeGhyX2JvYXJkX3BhcmFtc1twY2lfaWQtPmRyaXZlcl9kYXRhXS5ib2FyZF9uYW1lOwogCW1nci0+cGxheWJhY2tfY2hpcHMgPSBwY3hocl9ib2FyZF9wYXJhbXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0ucGxheWJhY2tfY2hpcHM7CiAJbWdyLT5jYXB0dXJlX2NoaXBzICA9IHBjeGhyX2JvYXJkX3BhcmFtc1twY2lfaWQtPmRyaXZlcl9kYXRhXS5jYXB0dXJlX2NoaXBzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2NvcmUuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hocl9jb3JlLmMKaW5kZXggMDAwZTZmZS4uNzE0MzI1OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2NvcmUuYworKysgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfY29yZS5jCkBAIC0zMTksMTYgKzMxOSwyMCBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJdW5zaWduZWQgY2hhciBkdW1teTsKIAkvKiBjaGVjayB0aGUgbGVuZ3RoIG9mIGJvb3QgaW1hZ2UgKi8KLQlzbmRfYXNzZXJ0KGRzcC0+c2l6ZSA+IDAsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KGRzcC0+c2l6ZSAlIDMgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoZHNwLT5kYXRhLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKGRzcC0+c2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZHNwLT5zaXplICUgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04oIWRzcC0+ZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOwogCS8qIHRyYW5zZmVydCBkYXRhIGJ1ZmZlciBmcm9tIFBDIHRvIERTUCAqLwogCWZvciAoaSA9IDA7IGkgPCBkc3AtPnNpemU7IGkgKz0gMykgewogCQlkYXRhID0gZHNwLT5kYXRhICsgaTsKIAkJaWYgKGkgPT0gMCkgewogCQkJLyogdGVzdCBkYXRhIGhlYWRlciBjb25zaXN0ZW5jeSAqLwogCQkJbGVuID0gKHVuc2lnbmVkIGludCkoKGRhdGFbMF08PDE2KSArIChkYXRhWzFdPDw4KSArIGRhdGFbMl0pOwotCQkJc25kX2Fzc2VydCgobGVuPT0wKSB8fCAoZHNwLT5zaXplID09IChsZW4rMikqMyksIHJldHVybiAtRUlOVkFMKTsKKwkJCWlmIChsZW4gJiYgZHNwLT5zaXplICE9IChsZW4gKyAyKSAqIDMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJLyogd2FpdCBEU1AgcmVhZHkgZm9yIG5ldyB0cmFuc2ZlciAqLwogCQllcnIgPSBwY3hocl9jaGVja19yZWdfYml0KG1nciwgUENYSFJfRFNQX0lTUiwgUENYSFJfSVNSX0hJMDhfVFJEWSwKQEAgLTM4OSw3ICszOTMsOCBAQAogCXVuc2lnbmVkIGNoYXIgZHVtbXk7CiAKIAkvKiBzZW5kIHRoZSBob3N0cG9ydCBhZGRyZXNzIHRvIHRoZSBEU1AgKG9ubHkgdGhlIHVwcGVyIDI0IGJpdCAhKSAqLwotCXNuZF9hc3NlcnQoKHBoeXNhZGRyICYgMHhmZikgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKHBoeXNhZGRyICYgMHhmZikpCisJCXJldHVybiAtRUlOVkFMOwogCVBDWEhSX09VVFBMKG1nciwgUENYSFJfUExYX01CT1gxLCAocGh5c2FkZHIgPj4gOCkpOwogCiAJZXJyID0gcGN4aHJfc2VuZF9pdF9kc3AobWdyLCBQQ1hIUl9JVF9ET1dOTE9BRF9CT09ULCAwKTsKQEAgLTU3MCw3ICs1NzUsOCBAQAogCXUzMiBkYXRhOwogCXVuc2lnbmVkIGNoYXIgcmVnOwogCi0Jc25kX2Fzc2VydChybWgtPmNtZF9sZW48UENYSFJfU0laRV9NQVhfQ01ELCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocm1oLT5jbWRfbGVuID49IFBDWEhSX1NJWkVfTUFYX0NNRCkpCisJCXJldHVybiAtRUlOVkFMOwogCWVyciA9IHBjeGhyX3NlbmRfaXRfZHNwKG1nciwgUENYSFJfSVRfTUVTU0FHRSwgMSk7CiAJaWYgKGVycikgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJwY3hocl9zZW5kX21lc3NhZ2UgOiBFRF9EU1BfQ1JBU0hFRFxuIik7CkBAIC02NzcsNyArNjgzLDggQEAKICAqLwogdm9pZCBwY3hocl9pbml0X3JtaChzdHJ1Y3QgcGN4aHJfcm1oICpybWgsIGludCBjbWQpCiB7Ci0Jc25kX2Fzc2VydChjbWQgPCBDTURfTEFTVF9JTkRFWCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihjbWQgPj0gQ01EX0xBU1RfSU5ERVgpKQorCQlyZXR1cm47CiAJcm1oLT5jbWRbMF0gPSBwY3hocl9kc3BfY21kc1tjbWRdLm9wY29kZTsKIAlybWgtPmNtZF9sZW4gPSAxOwogCXJtaC0+c3RhdF9sZW4gPSBwY3hocl9kc3BfY21kc1tjbWRdLnN0X2xlbmd0aDsKQEAgLTY5MCwxNyArNjk3LDE3IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IHBhcmFtMSwgdW5zaWduZWQgaW50IHBhcmFtMiwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGFyYW0zKQogewotCXNuZF9hc3NlcnQocGFyYW0xIDw9IE1BU0tfRklSU1RfRklFTEQpOworCXNuZF9CVUdfT04ocGFyYW0xID4gTUFTS19GSVJTVF9GSUVMRCk7CiAJaWYgKGNhcHR1cmUpCiAJCXJtaC0+Y21kWzBdIHw9IDB4ODAwOwkJLyogQ09NTUFORF9SRUNPUkRfTUFTSyAqLwogCWlmIChwYXJhbTEpCiAJCXJtaC0+Y21kWzBdIHw9IChwYXJhbTEgPDwgRklFTERfU0laRSk7CiAJaWYgKHBhcmFtMikgewotCQlzbmRfYXNzZXJ0KHBhcmFtMiA8PSBNQVNLX0ZJUlNUX0ZJRUxEKTsKKwkJc25kX0JVR19PTihwYXJhbTIgPiBNQVNLX0ZJUlNUX0ZJRUxEKTsKIAkJcm1oLT5jbWRbMF0gfD0gcGFyYW0yOwogCX0KIAlpZihwYXJhbTMpIHsKLQkJc25kX2Fzc2VydChwYXJhbTMgPD0gTUFTS19EU1BfV09SRCk7CisJCXNuZF9CVUdfT04ocGFyYW0zID4gTUFTS19EU1BfV09SRCk7CiAJCXJtaC0+Y21kWzFdID0gcGFyYW0zOwogCQlybWgtPmNtZF9sZW4gPSAyOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggZDJmMDQzMi4uOTY2NDBkOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTY1LDE1ICs2NSwxOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJLyogdGVzdCA4IG9yIDEyIHBoeXMgb3V0ICovCi0Jc25kX2Fzc2VydCgocm1oLnN0YXRbMF0gJiBNQVNLX0ZJUlNUX0ZJRUxEKSA9PSBtZ3ItPnBsYXliYWNrX2NoaXBzKjIsCi0JCSAgIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoKHJtaC5zdGF0WzBdICYgTUFTS19GSVJTVF9GSUVMRCkgIT0gbWdyLT5wbGF5YmFja19jaGlwcyAqIDIpCisJCXJldHVybiAtRUlOVkFMOwogCS8qIHRlc3QgOCBvciAyIHBoeXMgaW4gKi8KLQlzbmRfYXNzZXJ0KCgocm1oLnN0YXRbMF0gPj4gKDIqRklFTERfU0laRSkpICYgTUFTS19GSVJTVF9GSUVMRCkgPT0KLQkJICAgbWdyLT5jYXB0dXJlX2NoaXBzICogMiwgcmV0dXJuIC1FSU5WQUwpOworCWlmICgoKHJtaC5zdGF0WzBdID4+ICgyICogRklFTERfU0laRSkpICYgTUFTS19GSVJTVF9GSUVMRCkgIT0KKwkgICAgbWdyLT5jYXB0dXJlX2NoaXBzICogMikKKwkJcmV0dXJuIC1FSU5WQUw7CiAJLyogdGVzdCBtYXggbmIgc3Vic3RyZWFtIHBlciBib2FyZCAqLwotCXNuZF9hc3NlcnQoKHJtaC5zdGF0WzFdICYgMHg1RikgPj0gY2FyZF9zdHJlYW1zLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKChybWguc3RhdFsxXSAmIDB4NUYpIDwgY2FyZF9zdHJlYW1zKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiB0ZXN0IG1heCBuYiBzdWJzdHJlYW0gcGVyIHBpcGUgKi8KLQlzbmRfYXNzZXJ0KCgocm1oLnN0YXRbMV0+PjcpJjB4NUYpID49IFBDWEhSX1BMQVlCQUNLX1NUUkVBTVMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoKChybWguc3RhdFsxXSA+PiA3KSAmIDB4NUYpIDwgUENYSFJfUExBWUJBQ0tfU1RSRUFNUykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwY3hocl9pbml0X3JtaCgmcm1oLCBDTURfVkVSU0lPTik7CiAJLyogZmlybXdhcmUgbnVtIGZvciBEU1AgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCA2YTM1OTYyLi5lOWYwNzA2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC04NjUsNyArODY1LDggQEAKIAlzdHJ1Y3QgcmlwdGlkZXBvcnQgKmh3cG9ydDsKIAlzdHJ1Y3QgY21kcG9ydCAqY21kcG9ydCA9IE5VTEw7CiAKLQlzbmRfYXNzZXJ0KGNpZiwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjaWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWh3cG9ydCA9IGNpZi0+aHdwb3J0OwogCWlmIChjaWYtPmVycmNudCA+IE1BWF9FUlJPUl9DT1VOVCkgewpAQCAtMTQ4Miw3ICsxNDgzLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3JpcHRpZGUgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwogCXN0cnVjdCBwY21odyAqZGF0YSA9IGdldF9wY21od2RldihzdWJzdHJlYW0pOwogCXN0cnVjdCBjbWRpZiAqY2lmID0gY2hpcC0+Y2lmOwogCXVuc2lnbmVkIGNoYXIgKmxidXNwYXRoID0gTlVMTDsKQEAgLTE0OTAsNyArMTQ5MCw4IEBACiAJaW50IGVyciA9IDA7CiAJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQ7CiAKLQlzbmRfYXNzZXJ0KGNpZiAmJiBkYXRhLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNpZiB8fCAhZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc25kX3ByaW50ZGQoInByZXBhcmUgaWQgJWQgY2g6ICVkIGY6MHgleCByOiVkXG4iLCBkYXRhLT5pZCwKIAkJICAgIHJ1bnRpbWUtPmNoYW5uZWxzLCBydW50aW1lLT5mb3JtYXQsIHJ1bnRpbWUtPnJhdGUpOwpAQCAtMTUxMyw5ICsxNTE0LDkgQEAKIAkJCWxidXNwYXRoID0gZGF0YS0+cGF0aHMuc3RlcmVvOwogCQlicmVhazsKIAl9Ci0Jc25kX3ByaW50ZGQoInVzZSBzZ2RsaXN0IGF0IDB4JXAgYW5kIGJ1ZmZlciBhdCAweCVwXG4iLAotCQkgICAgZGF0YS0+c2dkbGlzdC5hcmVhLCBzZ2J1Zik7Ci0JaWYgKGRhdGEtPnNnZGxpc3QuYXJlYSAmJiBzZ2J1ZikgeworCXNuZF9wcmludGRkKCJ1c2Ugc2dkbGlzdCBhdCAweCVwXG4iLAorCQkgICAgZGF0YS0+c2dkbGlzdC5hcmVhKTsKKwlpZiAoZGF0YS0+c2dkbGlzdC5hcmVhKSB7CiAJCXVuc2lnbmVkIGludCBpLCBqLCBzaXplLCBwYWdlcywgZiwgcHQsIHBlcmlvZDsKIAkJc3RydWN0IHNnZCAqYywgKnAgPSBOVUxMOwogCkBAIC0xNTMzLDYgKzE1MzQsNyBAQAogCQlwdCA9IDA7CiAJCWogPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkJdW5zaWduZWQgaW50IG9mcywgYWRkcjsKIAkJCWMgPSAmZGF0YS0+c2dkYnVmW2ldOwogCQkJaWYgKHApCiAJCQkJcC0+ZHdOZXh0TGluayA9IGNwdV90b19sZTMyKGRhdGEtPnNnZGxpc3QuYWRkciArCkBAIC0xNTQwLDggKzE1NDIsOSBAQAogCQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAogCQkJCQkJCQkgICAgc2dkKSkpOwogCQkJYy0+ZHdOZXh0TGluayA9IGNwdV90b19sZTMyKGRhdGEtPnNnZGxpc3QuYWRkcik7Ci0JCQljLT5kd1NlZ1B0clBoeXMgPQotCQkJICAgIGNwdV90b19sZTMyKHNnYnVmLT50YWJsZVtqXS5hZGRyICsgcHQpOworCQkJb2ZzID0gaiA8PCBQQUdFX1NISUZUOworCQkJYWRkciA9IHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc3Vic3RyZWFtLCBvZnMpICsgcHQ7CisJCQljLT5kd1NlZ1B0clBoeXMgPSBjcHVfdG9fbGUzMihhZGRyKTsKIAkJCXB0ID0gKHB0ICsgZikgJSBQQUdFX1NJWkU7CiAJCQlpZiAocHQgPT0gMCkKIAkJCQlqKys7CkBAIC0xNzcyLDcgKzE3NzUsOCBAQAogCXVuaW9uIGNtZHJldCBycHRyID0gQ01EUkVUX1pFUk87CiAJaW50IGkgPSAwOwogCi0Jc25kX2Fzc2VydChjaWYsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWNpZikpCisJCXJldHVybjsKIAogCXNuZF9wcmludGRkKCJXcml0ZSBBQzk3IHJlZyAweCV4IDB4JXhcbiIsIHJlZywgdmFsKTsKIAlkbyB7CkBAIC0xNzkwLDcgKzE3OTQsOCBAQAogCXN0cnVjdCBjbWRpZiAqY2lmID0gY2hpcC0+Y2lmOwogCXVuaW9uIGNtZHJldCBycHRyID0gQ01EUkVUX1pFUk87CiAKLQlzbmRfYXNzZXJ0KGNpZiwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCFjaWYpKQorCQlyZXR1cm4gMDsKIAogCWlmIChTRU5EX1JBQ1IoY2lmLCByZWcsICZycHRyKSAhPSAwKQogCQlTRU5EX1JBQ1IoY2lmLCByZWcsICZycHRyKTsKQEAgLTE4MDQsNyArMTgwOSw4IEBACiAJdW5zaWduZWQgaW50IGRldmljZV9pZDsKIAlpbnQgZXJyOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNpZiA9IGNoaXAtPmNpZjsKIAlpZiAoIWNpZikgewpAQCAtMTgzNiw3ICsxODQyLDggQEAKIHsKIAlzdHJ1Y3QgY21kaWYgKmNpZjsKIAotCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuIDApOworCWlmICghY2hpcCkKKwkJcmV0dXJuIDA7CiAKIAlpZiAoKGNpZiA9IGNoaXAtPmNpZikpIHsKIAkJU0VUX0dSRVNFVChjaWYtPmh3cG9ydCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggNGQ2ZmJiMy4uZDcyMzU0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIAluID0gRERTX05VTUVSQVRPUjsKIAlkaXY2NF8zMigmbiwgcmF0ZSwgJnIpOwogCS8qIG4gc2hvdWxkIGJlIGxlc3MgdGhhbiAyXjMyIGZvciBiZWluZyB3cml0dGVuIHRvIEZSRVEgcmVnaXN0ZXIgKi8KLQlzbmRfYXNzZXJ0KChuID4+IDMyKSA9PSAwKTsKKwlzbmRfQlVHX09OKG4gPj4gMzIpOwogCS8qIEhEU1BfZnJlcVJlZyBhbmQgSERTUF9yZXNldFBvaW50ZXIgYXJlIHRoZSBzYW1lLCBzbyBrZWVwIHRoZSBERFMKIAkgICB2YWx1ZSB0byB3cml0ZSBpdCBhZnRlciBhIHJlc2V0ICovCiAJaGRzcC0+ZGRzX3ZhbHVlID0gbjsKQEAgLTMwNDMsNyArMzA0Myw3IEBACiAJc3RydWN0IGhkc3AgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKIAlvZmZzZXQgPSB1Y29udHJvbC0+aWQuaW5kZXggLSAxOwotCXNuZF9hc3NlcnQob2Zmc2V0ID49IDApOworCXNuZF9CVUdfT04ob2Zmc2V0IDwgMCk7CiAKIAlzd2l0Y2ggKGhkc3AtPmlvX3R5cGUpIHsKIAljYXNlIERpZ2lmYWNlOgpAQCAtMzc2Nyw3ICszNzY3LDggQEAKIHsKIAlpbnQgbWFwcGVkX2NoYW5uZWw7CiAKLSAgICAgICAgc25kX2Fzc2VydChjaGFubmVsID49IDAgJiYgY2hhbm5lbCA8IGhkc3AtPm1heF9jaGFubmVscywgcmV0dXJuIE5VTEwpOworICAgICAgICBpZiAoc25kX0JVR19PTihjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IGhkc3AtPm1heF9jaGFubmVscykpCisJCXJldHVybiBOVUxMOwogICAgICAgICAKIAlpZiAoKG1hcHBlZF9jaGFubmVsID0gaGRzcC0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0pIDwgMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0zNzg0LDEwICszNzg1LDEyIEBACiAJc3RydWN0IGhkc3AgKmhkc3AgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY2hhciAqY2hhbm5lbF9idWY7CiAKLQlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IEhEU1BfQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocG9zICsgY291bnQgPiBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hhbm5lbF9idWYgPSBoZHNwX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChoZHNwLCBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwgY2hhbm5lbCk7Ci0Jc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoYW5uZWxfYnVmKSkKKwkJcmV0dXJuIC1FSU87CiAJaWYgKGNvcHlfZnJvbV91c2VyKGNoYW5uZWxfYnVmICsgcG9zICogNCwgc3JjLCBjb3VudCAqIDQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gY291bnQ7CkBAIC0zNzk5LDEwICszODAyLDEyIEBACiAJc3RydWN0IGhkc3AgKmhkc3AgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY2hhciAqY2hhbm5lbF9idWY7CiAKLQlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IEhEU1BfQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocG9zICsgY291bnQgPiBIRFNQX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hhbm5lbF9idWYgPSBoZHNwX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChoZHNwLCBzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSwgY2hhbm5lbCk7Ci0Jc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoYW5uZWxfYnVmKSkKKwkJcmV0dXJuIC1FSU87CiAJaWYgKGNvcHlfdG9fdXNlcihkc3QsIGNoYW5uZWxfYnVmICsgcG9zICogNCwgY291bnQgKiA0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGNvdW50OwpAQCAtMzgxNSw3ICszODIwLDggQEAKIAljaGFyICpjaGFubmVsX2J1ZjsKIAogCWNoYW5uZWxfYnVmID0gaGRzcF9jaGFubmVsX2J1ZmZlcl9sb2NhdGlvbiAoaGRzcCwgc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0sIGNoYW5uZWwpOwotCXNuZF9hc3NlcnQoY2hhbm5lbF9idWYgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKCFjaGFubmVsX2J1ZikpCisJCXJldHVybiAtRUlPOwogCW1lbXNldChjaGFubmVsX2J1ZiArIHBvcyAqIDQsIDAsIGNvdW50ICogNCk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMzkyNyw3ICszOTMzLDggQEAKIAlzdHJ1Y3QgaGRzcCAqaGRzcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgbWFwcGVkX2NoYW5uZWw7CiAKLQlzbmRfYXNzZXJ0KGluZm8tPmNoYW5uZWwgPCBoZHNwLT5tYXhfY2hhbm5lbHMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihpbmZvLT5jaGFubmVsID49IGhkc3AtPm1heF9jaGFubmVscykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChtYXBwZWRfY2hhbm5lbCA9IGhkc3AtPmNoYW5uZWxfbWFwW2luZm8tPmNoYW5uZWxdKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggYWI0MjNiYy4uOTg3NjJmOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC01MzUsNyArNTM1LDggQEAKIHN0YXRpYyBpbnQgaGRzcG1fdXBkYXRlX3NpbXBsZV9taXhlcl9jb250cm9scyhzdHJ1Y3QgaGRzcG0gKiBoZHNwbSk7CiBzdGF0aWMgaW50IGhkc3BtX2F1dG9zeW5jX3JlZihzdHJ1Y3QgaGRzcG0gKiBoZHNwbSk7CiBzdGF0aWMgaW50IHNuZF9oZHNwbV9zZXRfZGVmYXVsdHMoc3RydWN0IGhkc3BtICogaGRzcG0pOwotc3RhdGljIHZvaWQgaGRzcG1fc2V0X3NnYnVmKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWYsCitzdGF0aWMgdm9pZCBoZHNwbV9zZXRfc2didWYoc3RydWN0IGhkc3BtICogaGRzcG0sCisJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHVuc2lnbmVkIGludCByZWcsIGludCBjaGFubmVscyk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IEhEU1BNX2JpdDJmcmVxKGludCBuKQpAQCAtODQ1LDcgKzg0Niw3IEBACiAJbiA9IDExMDEwMDQ4MDAwMDAwMFVMTDsgICAgLyogVmFsdWUgY2hlY2tlZCBmb3IgQUVTMzIgYW5kIE1BREkgKi8KIAlkaXY2NF8zMigmbiwgcmF0ZSwgJnIpOwogCS8qIG4gc2hvdWxkIGJlIGxlc3MgdGhhbiAyXjMyIGZvciBiZWluZyB3cml0dGVuIHRvIEZSRVEgcmVnaXN0ZXIgKi8KLQlzbmRfYXNzZXJ0KChuID4+IDMyKSA9PSAwKTsKKwlzbmRfQlVHX09OKG4gPj4gMzIpOwogCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9mcmVxUmVnLCAodTMyKW4pOwogfQogCkBAIC0yNjE3LDggKzI2MTgsOCBAQAogCiAJY2hhbm5lbCA9IHVjb250cm9sLT5pZC5pbmRleCAtIDE7CiAKLQlzbmRfYXNzZXJ0KGNoYW5uZWwgPj0gMAotCQkgICB8fCBjaGFubmVsIDwgSERTUE1fTUFYX0NIQU5ORUxTLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBIRFNQTV9NQVhfQ0hBTk5FTFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1hcHBlZF9jaGFubmVsID0gaGRzcG0tPmNoYW5uZWxfbWFwW2NoYW5uZWxdOwogCWlmIChtYXBwZWRfY2hhbm5lbCA8IDApCkBAIC0yNjUyLDggKzI2NTMsOCBAQAogCiAJY2hhbm5lbCA9IHVjb250cm9sLT5pZC5pbmRleCAtIDE7CiAKLQlzbmRfYXNzZXJ0KGNoYW5uZWwgPj0gMAotCQkgICB8fCBjaGFubmVsIDwgSERTUE1fTUFYX0NIQU5ORUxTLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBIRFNQTV9NQVhfQ0hBTk5FTFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1hcHBlZF9jaGFubmVsID0gaGRzcG0tPmNoYW5uZWxfbWFwW2NoYW5uZWxdOwogCWlmIChtYXBwZWRfY2hhbm5lbCA8IDApCkBAIC0zNDk2LDggKzM0OTcsOCBAQAogewogCWludCBtYXBwZWRfY2hhbm5lbDsKIAotCXNuZF9hc3NlcnQoY2hhbm5lbCA+PSAwCi0JCSAgIHx8IGNoYW5uZWwgPCBIRFNQTV9NQVhfQ0hBTk5FTFMsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTihjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IEhEU1BNX01BWF9DSEFOTkVMUykpCisJCXJldHVybiBOVUxMOwogCiAJbWFwcGVkX2NoYW5uZWwgPSBoZHNwbS0+Y2hhbm5lbF9tYXBbY2hhbm5lbF07CiAJaWYgKG1hcHBlZF9jaGFubmVsIDwgMCkKQEAgLTM1MjAsMTQgKzM1MjEsMTUgQEAKIAlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCWNoYXIgKmNoYW5uZWxfYnVmOwogCi0Jc25kX2Fzc2VydChwb3MgKyBjb3VudCA8PSBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAvIDQsCi0JCSAgIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihwb3MgKyBjb3VudCA+IEhEU1BNX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hhbm5lbF9idWYgPQogCQloZHNwbV9jaGFubmVsX2J1ZmZlcl9sb2NhdGlvbihoZHNwbSwgc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0sCiAJCQkJCSAgICAgIGNoYW5uZWwpOwogCi0Jc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoYW5uZWxfYnVmKSkKKwkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gY29weV9mcm9tX3VzZXIoY2hhbm5lbF9idWYgKyBwb3MgKiA0LCBzcmMsIGNvdW50ICogNCk7CiB9CkBAIC0zNTM5LDEzICszNTQxLDE0IEBACiAJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAljaGFyICpjaGFubmVsX2J1ZjsKIAotCXNuZF9hc3NlcnQocG9zICsgY291bnQgPD0gSERTUE1fQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0LAotCQkgICByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocG9zICsgY291bnQgPiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAvIDQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoYW5uZWxfYnVmID0KIAkJaGRzcG1fY2hhbm5lbF9idWZmZXJfbG9jYXRpb24oaGRzcG0sIHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtLAogCQkJCQkgICAgICBjaGFubmVsKTsKLQlzbmRfYXNzZXJ0KGNoYW5uZWxfYnVmICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighY2hhbm5lbF9idWYpKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gY29weV90b191c2VyKGRzdCwgY2hhbm5lbF9idWYgKyBwb3MgKiA0LCBjb3VudCAqIDQpOwogfQogCkBAIC0zNTU5LDcgKzM1NjIsOCBAQAogCWNoYW5uZWxfYnVmID0KIAkJaGRzcG1fY2hhbm5lbF9idWZmZXJfbG9jYXRpb24oaGRzcG0sIHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtLAogCQkJCQkgICAgICBjaGFubmVsKTsKLQlzbmRfYXNzZXJ0KGNoYW5uZWxfYnVmICE9IE5VTEwsIHJldHVybiAtRUlPKTsKKwlpZiAoc25kX0JVR19PTighY2hhbm5lbF9idWYpKQorCQlyZXR1cm4gLUVJTzsKIAltZW1zZXQoY2hhbm5lbF9idWYgKyBwb3MgKiA0LCAwLCBjb3VudCAqIDQpOwogCXJldHVybiAwOwogfQpAQCAtMzYwMSw4ICszNjA1LDYgQEAKIAlpbnQgaTsKIAlwaWRfdCB0aGlzX3BpZDsKIAlwaWRfdCBvdGhlcl9waWQ7Ci0Jc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmOwotCiAKIAlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CiAKQEAgLTM2NzAsMTEgKzM2NzIsOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0Jc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwotCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAotCQloZHNwbV9zZXRfc2didWYoaGRzcG0sIHNnYnVmLCBIRFNQTV9wYWdlQWRkcmVzc0J1ZmZlck91dCwKKwkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzdWJzdHJlYW0sIEhEU1BNX3BhZ2VBZGRyZXNzQnVmZmVyT3V0LAogCQkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7ICsraSkKQEAgLTM2ODUsNyArMzY4NSw3IEBACiAJCXNuZF9wcmludGRkKCJBbGxvY2F0ZWQgc2FtcGxlIGJ1ZmZlciBmb3IgcGxheWJhY2sgYXQgJXBcbiIsCiAJCQkJaGRzcG0tPnBsYXliYWNrX2J1ZmZlcik7CiAJfSBlbHNlIHsKLQkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzZ2J1ZiwgSERTUE1fcGFnZUFkZHJlc3NCdWZmZXJJbiwKKwkJaGRzcG1fc2V0X3NnYnVmKGhkc3BtLCBzdWJzdHJlYW0sIEhEU1BNX3BhZ2VBZGRyZXNzQnVmZmVySW4sCiAJCQkJcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsgKytpKQpAQCAtMzcwMCw3ICszNzAwLDcgQEAKIAkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKIAkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KIAkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAotCSAgIHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkgICBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgMCkpOwogCSAqLwogCS8qCiAJc25kX3ByaW50ZGQoInNldF9od3BhcmFtczogJXMgJWQgSHosICVkIGNoYW5uZWxzLCBicyA9ICVkXG4iLApAQCAtMzc0NCw3ICszNzQ0LDggQEAKIAlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCWludCBtYXBwZWRfY2hhbm5lbDsKIAotCXNuZF9hc3NlcnQoaW5mby0+Y2hhbm5lbCA8IEhEU1BNX01BWF9DSEFOTkVMUywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKGluZm8tPmNoYW5uZWwgPj0gSERTUE1fTUFYX0NIQU5ORUxTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltYXBwZWRfY2hhbm5lbCA9IGhkc3BtLT5jaGFubmVsX21hcFtpbmZvLT5jaGFubmVsXTsKIAlpZiAobWFwcGVkX2NoYW5uZWwgPCAwKQpAQCAtNDI0OSwxMyArNDI1MCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBoZHNwbV9zZXRfc2didWYoc3RydWN0IGhkc3BtICogaGRzcG0sIHN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1ZiwKK3N0YXRpYyB2b2lkIGhkc3BtX3NldF9zZ2J1ZihzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCSAgICAgdW5zaWduZWQgaW50IHJlZywgaW50IGNoYW5uZWxzKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCAoY2hhbm5lbHMgKiAxNik7IGkrKykKIAkJaGRzcG1fd3JpdGUoaGRzcG0sIHJlZyArIDQgKiBpLAotCQkJICAgIHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsIChzaXplX3QpIDQwOTYgKiBpKSk7CisJCQkgICAgc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIDQwOTYgKiBpKSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0gQUxTQSBEZXZpY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwppbmRleCBhMTIzZjBlLi4yNTcwOTA3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCkBAIC01OTUsOCArNTk1LDYgQEAKIAl9IGVsc2UgewogCQlpbnQgbWFwcGVkX2NoYW5uZWw7CiAKLQkJc25kX2Fzc2VydChjaGFubmVsID09IFJNRTk2NTJfTkNIQU5ORUxTLCByZXR1cm4pOwotCiAJCW1hcHBlZF9jaGFubmVsID0gcm1lOTY1Mi0+Y2hhbm5lbF9tYXBbY2hhbm5lbF07CiAKIAkJaWYgKGVuYWJsZSkgewpAQCAtMTg5Myw3ICsxODkxLDggQEAKIHsKIAlpbnQgbWFwcGVkX2NoYW5uZWw7CiAKLSAgICAgICAgc25kX2Fzc2VydChjaGFubmVsID49IDAgfHwgY2hhbm5lbCA8IFJNRTk2NTJfTkNIQU5ORUxTLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04oY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBSTUU5NjUyX05DSEFOTkVMUykpCisJCXJldHVybiBOVUxMOwogICAgICAgICAKIAlpZiAoKG1hcHBlZF9jaGFubmVsID0gcm1lOTY1Mi0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0pIDwgMCkgewogCQlyZXR1cm4gTlVMTDsKQEAgLTE5MTQsMTIgKzE5MTMsMTQgQEAKIAlzdHJ1Y3Qgc25kX3JtZTk2NTIgKnJtZTk2NTIgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY2hhciAqY2hhbm5lbF9idWY7CiAKLQlzbmRfYXNzZXJ0KHBvcyArIGNvdW50IDw9IFJNRTk2NTJfQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04ocG9zICsgY291bnQgPiBSTUU5NjUyX0NIQU5ORUxfQlVGRkVSX0JZVEVTIC8gNCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY2hhbm5lbF9idWYgPSBybWU5NjUyX2NoYW5uZWxfYnVmZmVyX2xvY2F0aW9uIChybWU5NjUyLAogCQkJCQkJICAgICAgIHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtLAogCQkJCQkJICAgICAgIGNoYW5uZWwpOwotCXNuZF9hc3NlcnQoY2hhbm5lbF9idWYgIT0gTlVMTCwgcmV0dXJuIC1FSU8pOworCWlmIChzbmRfQlVHX09OKCFjaGFubmVsX2J1ZikpCisJCXJldHVybiAtRUlPOwogCWlmIChjb3B5X2Zyb21fdXNlcihjaGFubmVsX2J1ZiArIHBvcyAqIDQsIHNyYywgY291bnQgKiA0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGNvdW50OwpAQCAtMTkzMSwxMiArMTkzMiwxNCBAQAogCXN0cnVjdCBzbmRfcm1lOTY1MiAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAljaGFyICpjaGFubmVsX2J1ZjsKIAotCXNuZF9hc3NlcnQocG9zICsgY291bnQgPD0gUk1FOTY1Ml9DSEFOTkVMX0JVRkZFUl9CWVRFUyAvIDQsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihwb3MgKyBjb3VudCA+IFJNRTk2NTJfQ0hBTk5FTF9CVUZGRVJfQllURVMgLyA0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljaGFubmVsX2J1ZiA9IHJtZTk2NTJfY2hhbm5lbF9idWZmZXJfbG9jYXRpb24gKHJtZTk2NTIsCiAJCQkJCQkgICAgICAgc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0sCiAJCQkJCQkgICAgICAgY2hhbm5lbCk7Ci0Jc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoYW5uZWxfYnVmKSkKKwkJcmV0dXJuIC1FSU87CiAJaWYgKGNvcHlfdG9fdXNlcihkc3QsIGNoYW5uZWxfYnVmICsgcG9zICogNCwgY291bnQgKiA0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGNvdW50OwpAQCAtMTk1MSw3ICsxOTU0LDggQEAKIAljaGFubmVsX2J1ZiA9IHJtZTk2NTJfY2hhbm5lbF9idWZmZXJfbG9jYXRpb24gKHJtZTk2NTIsCiAJCQkJCQkgICAgICAgc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0sCiAJCQkJCQkgICAgICAgY2hhbm5lbCk7Ci0Jc25kX2Fzc2VydChjaGFubmVsX2J1ZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoYW5uZWxfYnVmKSkKKwkJcmV0dXJuIC1FSU87CiAJbWVtc2V0KGNoYW5uZWxfYnVmICsgcG9zICogNCwgMCwgY291bnQgKiA0KTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yMDUzLDcgKzIwNTcsOCBAQAogCXN0cnVjdCBzbmRfcm1lOTY1MiAqcm1lOTY1MiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgY2huOwogCi0Jc25kX2Fzc2VydChpbmZvLT5jaGFubmVsIDwgUk1FOTY1Ml9OQ0hBTk5FTFMsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTihpbmZvLT5jaGFubmVsID49IFJNRTk2NTJfTkNIQU5ORUxTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKGNobiA9IHJtZTk2NTItPmNoYW5uZWxfbWFwW2luZm8tPmNoYW5uZWxdKSA8IDApIHsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwppbmRleCAwZDNkMzA1Li5jZDQwOGI4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCisrKyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKQEAgLTUzNCw4ICs1MzQsOCBAQAogCQkJcGFyYW1zLT5yYXRlX2RlbiA9IDE7CiAJCX0gZWxzZSB7CiAJCQlzbmRfc29uaWN2aWJlc19wbGwocmF0ZSwgJnIsICZtLCAmbik7Ci0JCQlzbmRfYXNzZXJ0KChTVl9SRUZGUkVRVUVOQ1kgJSAxNikgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOwotCQkJc25kX2Fzc2VydCgoU1ZfQURDTVVMVCAlIDUxMikgPT0gMCwgcmV0dXJuIC1FSU5WQUwpOworCQkJc25kX0JVR19PTihTVl9SRUZGUkVRVUVOQ1kgJSAxNik7CisJCQlzbmRfQlVHX09OKFNWX0FEQ01VTFQgJSA1MTIpOwogCQkJcGFyYW1zLT5yYXRlX251bSA9IChTVl9SRUZGUkVRVUVOQ1kvMTYpICogKG4rMikgKiByOwogCQkJcGFyYW1zLT5yYXRlX2RlbiA9IChTVl9BRENNVUxULzUxMikgKiAobSsyKTsKIAkJfQpAQCAtODQ5LDcgKzg0OSw4IEBACiAKIAlpZiAoKGVyciA9IHNuZF9wY21fbmV3KHNvbmljLT5jYXJkLCAiczNfODZjNjE3IiwgZGV2aWNlLCAxLCAxLCAmcGNtKSkgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9hc3NlcnQocGNtICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcGNtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BzKTsKIAlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wcyk7CkBAIC0xMDg5LDcgKzEwOTAsOCBAQAogCXVuc2lnbmVkIGludCBpZHg7CiAJaW50IGVycjsKIAotCXNuZF9hc3NlcnQoc29uaWMgIT0gTlVMTCAmJiBzb25pYy0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXNvbmljIHx8ICFzb25pYy0+Y2FyZCkpCisJCXJldHVybiAtRUlOVkFMOwogCWNhcmQgPSBzb25pYy0+Y2FyZDsKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiUzMgU29uaWNWaWJlcyIpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IGE2OWI0MjAuLmM2MTJiNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0yOTMxLDcgKzI5MzEsOCBAQAogewogCXN0cnVjdCBzbmRfdHJpZGVudF9wY21fbWl4ZXIgKnRtaXg7CiAKLQlzbmRfYXNzZXJ0KHRyaWRlbnQgIT0gTlVMTCAmJiB2b2ljZSAhPSBOVUxMICYmIHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXRyaWRlbnQgfHwgIXZvaWNlIHx8ICFzdWJzdHJlYW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAl0bWl4ID0gJnRyaWRlbnQtPnBjbV9taXhlcltzdWJzdHJlYW0tPm51bWJlcl07CiAJdG1peC0+dm9pY2UgPSB2b2ljZTsKIAl0bWl4LT52b2wgPSBUNERfREVGQVVMVF9QQ01fVk9MOwpAQCAtMjk0Niw3ICsyOTQ3LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3RyaWRlbnRfcGNtX21peGVyICp0bWl4OwogCi0Jc25kX2Fzc2VydCh0cmlkZW50ICE9IE5VTEwgJiYgc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighdHJpZGVudCB8fCAhc3Vic3RyZWFtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJdG1peCA9ICZ0cmlkZW50LT5wY21fbWl4ZXJbc3Vic3RyZWFtLT5udW1iZXJdOwogCXRtaXgtPnZvaWNlID0gTlVMTDsKIAlzbmRfdHJpZGVudF9ub3RpZnlfcGNtX2NoYW5nZSh0cmlkZW50LCB0bWl4LCBzdWJzdHJlYW0tPm51bWJlciwgMCk7CkBAIC0zMTMxLDcgKzMxMzMsOCBAQAogewogCXN0cnVjdCBzbmRfdHJpZGVudCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4gMCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gaW5iKFRSSURfUkVHKGNoaXAsIEdBTUVQT1JUX0xFR0FDWSkpOwogfQogCkBAIC0zMTM5LDcgKzMxNDIsOCBAQAogewogCXN0cnVjdCBzbmRfdHJpZGVudCAqY2hpcCA9IGdhbWVwb3J0X2dldF9wb3J0X2RhdGEoZ2FtZXBvcnQpOwogCi0Jc25kX2Fzc2VydChjaGlwLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFjaGlwKSkKKwkJcmV0dXJuOwogCW91dGIoMHhmZiwgVFJJRF9SRUcoY2hpcCwgR0FNRVBPUlRfTEVHQUNZKSk7CiB9CiAKQEAgLTMxNDgsNyArMzE1Miw4IEBACiAJc3RydWN0IHNuZF90cmlkZW50ICpjaGlwID0gZ2FtZXBvcnRfZ2V0X3BvcnRfZGF0YShnYW1lcG9ydCk7CiAJaW50IGk7CiAKLQlzbmRfYXNzZXJ0KGNoaXAsIHJldHVybiAwKTsKKwlpZiAoc25kX0JVR19PTighY2hpcCkpCisJCXJldHVybiAwOwogCiAJKmJ1dHRvbnMgPSAofmluYihUUklEX1JFRyhjaGlwLCBHQU1FUE9SVF9MRUdBQ1kpKSA+PiA0KSAmIDB4ZjsKIApAQCAtMzE2NCw3ICszMTY5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3RyaWRlbnQgKmNoaXAgPSBnYW1lcG9ydF9nZXRfcG9ydF9kYXRhKGdhbWVwb3J0KTsKIAotCXNuZF9hc3NlcnQoY2hpcCwgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCFjaGlwKSkKKwkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAkJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKQEAgLTM4OTEsOCArMzg5Nyw4IEBACiB7CiAJdW5zaWduZWQgaW50IGksIHZhbCwgbWFza1syXSA9IHsgMCwgMCB9OwogCi0Jc25kX2Fzc2VydCh2X21pbiA8PSA2MywgcmV0dXJuKTsKLQlzbmRfYXNzZXJ0KHZfbWF4IDw9IDYzLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKHZfbWluID4gNjMgfHwgdl9tYXggPiA2MykpCisJCXJldHVybjsKIAlmb3IgKGkgPSB2X21pbjsgaSA8PSB2X21heDsgaSsrKQogCQltYXNrW2kgPj4gNV0gfD0gMSA8PCAoaSAmIDB4MWYpOwogCWlmIChtYXNrWzBdKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21lbW9yeS5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tZW1vcnkuYwppbmRleCAzZmQ3ZjFiLi5mOTc3OWUyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21lbW9yeS5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWVtb3J5LmMKQEAgLTE5NCwxMSArMTk0LDE0IEBACiAJc3RydWN0IHNuZF91dGlsX21lbWJsayAqYmxrOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaW50IGlkeCwgcGFnZTsKLQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwogCi0Jc25kX2Fzc2VydChydW50aW1lLT5kbWFfYnl0ZXMgPiAwICYmIHJ1bnRpbWUtPmRtYV9ieXRlcyA8PSBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIFNORFJWX1RSSURFTlRfUEFHRV9TSVpFLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04ocnVudGltZS0+ZG1hX2J5dGVzIDw9IDAgfHwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyA+IFNORFJWX1RSSURFTlRfTUFYX1BBR0VTICoKKwkJCQkJU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpKQorCQlyZXR1cm4gTlVMTDsKIAloZHIgPSB0cmlkZW50LT50bGIubWVtaGRyOwotCXNuZF9hc3NlcnQoaGRyICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaGRyKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAkKIApAQCAtMjA4LDE4ICsyMTEsMTQgQEAKIAkJbXV0ZXhfdW5sb2NrKCZoZHItPmJsb2NrX211dGV4KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChsYXN0cGcoYmxrKSAtIGZpcnN0cGcoYmxrKSA+PSBzZ2J1Zi0+cGFnZXMpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGFnZSBjYWxjdWxhdGlvbiBkb2Vzbid0IG1hdGNoOiBhbGxvY2F0ZWQgcGFnZXMgPSAlZCwgdHJpZGVudCA9ICVkLyVkXG4iLCBzZ2J1Zi0+cGFnZXMsIGZpcnN0cGcoYmxrKSwgbGFzdHBnKGJsaykpOwotCQlfX3NuZF91dGlsX21lbV9mcmVlKGhkciwgYmxrKTsKLQkJbXV0ZXhfdW5sb2NrKCZoZHItPmJsb2NrX211dGV4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCQkJICAgCiAJLyogc2V0IFRMQiBlbnRyaWVzICovCiAJaWR4ID0gMDsKIAlmb3IgKHBhZ2UgPSBmaXJzdHBnKGJsayk7IHBhZ2UgPD0gbGFzdHBnKGJsayk7IHBhZ2UrKywgaWR4KyspIHsKLQkJZG1hX2FkZHJfdCBhZGRyID0gc2didWYtPnRhYmxlW2lkeF0uYWRkcjsKLQkJdW5zaWduZWQgbG9uZyBwdHIgPSAodW5zaWduZWQgbG9uZylzZ2J1Zi0+dGFibGVbaWR4XS5idWY7CisJCXVuc2lnbmVkIGxvbmcgb2ZzID0gaWR4IDw8IFBBR0VfU0hJRlQ7CisJCWRtYV9hZGRyX3QgYWRkciA9IHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc3Vic3RyZWFtLCBvZnMpOworCQl1bnNpZ25lZCBsb25nIHB0ciA9ICh1bnNpZ25lZCBsb25nKQorCQkJc25kX3BjbV9zZ2J1Zl9nZXRfcHRyKHN1YnN0cmVhbSwgb2ZzKTsKIAkJaWYgKCEgaXNfdmFsaWRfcGFnZShhZGRyKSkgewogCQkJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIGJsayk7CiAJCQltdXRleF91bmxvY2soJmhkci0+YmxvY2tfbXV0ZXgpOwpAQCAtMjQ1LDkgKzI0NCwxMyBAQAogCWRtYV9hZGRyX3QgYWRkcjsKIAl1bnNpZ25lZCBsb25nIHB0cjsKIAotCXNuZF9hc3NlcnQocnVudGltZS0+ZG1hX2J5dGVzPiAwICYmIHJ1bnRpbWUtPmRtYV9ieXRlcyA8PSBTTkRSVl9UUklERU5UX01BWF9QQUdFUyAqIFNORFJWX1RSSURFTlRfUEFHRV9TSVpFLCByZXR1cm4gTlVMTCk7CisJaWYgKHNuZF9CVUdfT04ocnVudGltZS0+ZG1hX2J5dGVzIDw9IDAgfHwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyA+IFNORFJWX1RSSURFTlRfTUFYX1BBR0VTICoKKwkJCQkJU05EUlZfVFJJREVOVF9QQUdFX1NJWkUpKQorCQlyZXR1cm4gTlVMTDsKIAloZHIgPSB0cmlkZW50LT50bGIubWVtaGRyOwotCXNuZF9hc3NlcnQoaGRyICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaGRyKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAltdXRleF9sb2NrKCZoZHItPmJsb2NrX211dGV4KTsKIAlibGsgPSBzZWFyY2hfZW1wdHkoaGRyLCBydW50aW1lLT5kbWFfYnl0ZXMpOwpAQCAtMjc5LDggKzI4Miw4IEBACiBzbmRfdHJpZGVudF9hbGxvY19wYWdlcyhzdHJ1Y3Qgc25kX3RyaWRlbnQgKnRyaWRlbnQsCiAJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzbmRfYXNzZXJ0KHRyaWRlbnQgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOwotCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighdHJpZGVudCB8fCAhc3Vic3RyZWFtKSkKKwkJcmV0dXJuIE5VTEw7CiAJaWYgKHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5kZXYudHlwZSA9PSBTTkRSVl9ETUFfVFlQRV9ERVZfU0cpCiAJCXJldHVybiBzbmRfdHJpZGVudF9hbGxvY19zZ19wYWdlcyh0cmlkZW50LCBzdWJzdHJlYW0pOwogCWVsc2UKQEAgLTI5Nyw4ICszMDAsOCBAQAogCXN0cnVjdCBzbmRfdXRpbF9tZW1oZHIgKmhkcjsKIAlpbnQgcGFnZTsKIAotCXNuZF9hc3NlcnQodHJpZGVudCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChibGsgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCF0cmlkZW50IHx8ICFibGspKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWhkciA9IHRyaWRlbnQtPnRsYi5tZW1oZHI7CiAJbXV0ZXhfbG9jaygmaGRyLT5ibG9ja19tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCA2NzgxYmU5Li4xYWFmZTk1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTMxMyw2ICszMTMsNyBAQAogfSA7CiAKICNkZWZpbmUgVklBX1RBQkxFX1NJWkUJMjU1CisjZGVmaW5lIFZJQV9NQVhfQlVGU0laRQkoMTw8MjQpCiAKIHN0cnVjdCB2aWFkZXYgewogCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OwpAQCAtNDIwLDcgKzQyMSw2IEBACiB7CiAJdW5zaWduZWQgaW50IGksIGlkeCwgb2ZzLCByZXN0OwogCXN0cnVjdCB2aWE4Mnh4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfc2dfYnVmICpzZ2J1ZiA9IHNuZF9wY21fc3Vic3RyZWFtX3NnYnVmKHN1YnN0cmVhbSk7CiAKIAlpZiAoZGV2LT50YWJsZS5hcmVhID09IE5VTEwpIHsKIAkJLyogdGhlIHN0YXJ0IG9mIGVhY2ggbGlzdHMgbXVzdCBiZSBhbGlnbmVkIHRvIDggYnl0ZXMsCkBAIC00NDksMTUgKzQ0OSwxNSBAQAogCQlkbyB7CiAJCQl1bnNpZ25lZCBpbnQgcjsKIAkJCXVuc2lnbmVkIGludCBmbGFnOworCQkJdW5zaWduZWQgaW50IGFkZHI7CiAKIAkJCWlmIChpZHggPj0gVklBX1RBQkxFX1NJWkUpIHsKIAkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ2aWE4Mnh4OiB0b28gbXVjaCB0YWJsZSBzaXplIVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbaWR4IDw8IDFdID0gY3B1X3RvX2xlMzIoKHUzMilzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHNnYnVmLCBvZnMpKTsKLQkJCXIgPSBQQUdFX1NJWkUgLSAob2ZzICUgUEFHRV9TSVpFKTsKLQkJCWlmIChyZXN0IDwgcikKLQkJCQlyID0gcmVzdDsKKwkJCWFkZHIgPSBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHN1YnN0cmVhbSwgb2ZzKTsKKwkJCSgodTMyICopZGV2LT50YWJsZS5hcmVhKVtpZHggPDwgMV0gPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJCXIgPSBzbmRfcGNtX3NnYnVmX2dldF9jaHVua19zaXplKHN1YnN0cmVhbSwgb2ZzLCByZXN0KTsKIAkJCXJlc3QgLT0gcjsKIAkJCWlmICghIHJlc3QpIHsKIAkJCQlpZiAoaSA9PSBwZXJpb2RzIC0gMSkKQEAgLTgyNCw3ICs4MjQsOCBAQAogCXN0cnVjdCB2aWFkZXYgKnZpYWRldiA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBpZHgsIHB0ciwgY291bnQsIHJlczsKIAotCXNuZF9hc3NlcnQodmlhZGV2LT50YmxfZW50cmllcywgcmV0dXJuIDApOworCWlmIChzbmRfQlVHX09OKCF2aWFkZXYtPnRibF9lbnRyaWVzKSkKKwkJcmV0dXJuIDA7CiAJaWYgKCEoaW5iKFZJQURFVl9SRUcodmlhZGV2LCBPRkZTRVRfU1RBVFVTKSkgJiBWSUFfUkVHX1NUQVRfQUNUSVZFKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTg1NSw3ICs4NTYsOCBAQAogCXVuc2lnbmVkIGludCBpZHgsIGNvdW50LCByZXM7CiAJaW50IHN0YXR1czsKIAkKLQlzbmRfYXNzZXJ0KHZpYWRldi0+dGJsX2VudHJpZXMsIHJldHVybiAwKTsKKwlpZiAoc25kX0JVR19PTighdmlhZGV2LT50YmxfZW50cmllcykpCisJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJY291bnQgPSBpbmwoVklBREVWX1JFRyh2aWFkZXYsIE9GRlNFVF9DVVJSX0NPVU5UKSk7CkBAIC0xMDM3LDcgKzEwMzksNyBAQAogCWVsc2UKIAkJcmJpdHMgPSAoMHgxMDAwMDAgLyA0ODAwMCkgKiBydW50aW1lLT5yYXRlICsKIAkJCSgoMHgxMDAwMDAgJSA0ODAwMCkgKiBydW50aW1lLT5yYXRlKSAvIDQ4MDAwOwotCXNuZF9hc3NlcnQoKHJiaXRzICYgfjB4ZmZmZmYpID09IDAsIHJldHVybiAtRUlOVkFMKTsKKwlzbmRfQlVHX09OKHJiaXRzICYgfjB4ZmZmZmYpOwogCXNuZF92aWE4Mnh4X2NoYW5uZWxfcmVzZXQoY2hpcCwgdmlhZGV2KTsKIAlzbmRfdmlhODJ4eF9zZXRfdGFibGVfcHRyKGNoaXAsIHZpYWRldik7CiAJb3V0YihjaGlwLT5wbGF5YmFja192b2x1bWVbdmlhZGV2LT5yZWdfb2Zmc2V0IC8gMHgxMF1bMF0sCkBAIC0xMTQ0LDkgKzExNDYsOSBAQAogCS5yYXRlX21heCA9CQk0ODAwMCwKIAkuY2hhbm5lbHNfbWluID0JCTEsCiAJLmNoYW5uZWxzX21heCA9CQkyLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkuYnVmZmVyX2J5dGVzX21heCA9CVZJQV9NQVhfQlVGU0laRSwKIAkucGVyaW9kX2J5dGVzX21pbiA9CTMyLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JMTI4ICogMTAyNCwKKwkucGVyaW9kX2J5dGVzX21heCA9CVZJQV9NQVhfQlVGU0laRSAvIDIsCiAJLnBlcmlvZHNfbWluID0JCTIsCiAJLnBlcmlvZHNfbWF4ID0JCVZJQV9UQUJMRV9TSVpFIC8gMiwKIAkuZmlmb19zaXplID0JCTAsCkBAIC0xMzk4LDEwICsxNDAwLDkgQEAKIAkvKiBjYXB0dXJlICovCiAJaW5pdF92aWFkZXYoY2hpcCwgY2hpcC0+Y2FwdHVyZV9kZXZubywgVklBX1JFR19DQVBUVVJFXzgyMzNfU1RBVFVTLCA2LCAxKTsKIAotCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKLQkJCQkJCQkgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkJCSA2NCoxMDI0LCAxMjgqMTAyNCkpIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCSAgICAgIDY0KjEwMjQsIFZJQV9NQVhfQlVGU0laRSk7CiAKIAkvKiBQQ00gIzE6ICBtdWx0aS1jaGFubmVsIHBsYXliYWNrIGFuZCAybmQgY2FwdHVyZSAqLwogCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsIGNoaXAtPmNhcmQtPnNob3J0bmFtZSwgMSwgMSwgMSwgJnBjbSk7CkBAIC0xNDE3LDExICsxNDE4LDkgQEAKIAkvKiBzZXQgdXAgY2FwdHVyZSAqLwogCWluaXRfdmlhZGV2KGNoaXAsIGNoaXAtPmNhcHR1cmVfZGV2bm8gKyAxLCBWSUFfUkVHX0NBUFRVUkVfODIzM19TVEFUVVMgKyAweDEwLCA3LCAxKTsKIAotCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKLQkJCQkJCSAgICAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkJCQkgNjQqMTAyNCwgMTI4KjEwMjQpKSA8IDApCi0JCXJldHVybiBlcnI7Ci0KKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCisJCQkJCSAgICAgIDY0KjEwMjQsIFZJQV9NQVhfQlVGU0laRSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NTMsMTAgKzE0NTIsOSBAQAogCS8qIGNhcHR1cmUgKi8KIAlpbml0X3ZpYWRldihjaGlwLCBjaGlwLT5jYXB0dXJlX2Rldm5vLCBWSUFfUkVHX0NBUFRVUkVfODIzM19TVEFUVVMsIDYsIDEpOwogCi0JaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAotCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCQkJIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQotCQlyZXR1cm4gZXJyOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJICAgICAgNjQqMTAyNCwgVklBX01BWF9CVUZTSVpFKTsKIAogCS8qIFNQRElGIHN1cHBvcnRlZD8gKi8KIAlpZiAoISBhYzk3X2Nhbl9zcGRpZihjaGlwLT5hYzk3KSkKQEAgLTE0NzMsMTEgKzE0NzEsOSBAQAogCS8qIHNldCB1cCBwbGF5YmFjayAqLwogCWluaXRfdmlhZGV2KGNoaXAsIGNoaXAtPnBsYXliYWNrX2Rldm5vLCAweDMwLCAzLCAwKTsKIAotCWlmICgoZXJyID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKLQkJCQkJCQkgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAotCQkJCQkJCSA2NCoxMDI0LCAxMjgqMTAyNCkpIDwgMCkKLQkJcmV0dXJuIGVycjsKLQorCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKKwkJCQkJICAgICAgNjQqMTAyNCwgVklBX01BWF9CVUZTSVpFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUwNSwxMSArMTUwMSw5IEBACiAJaW5pdF92aWFkZXYoY2hpcCwgMCwgVklBX1JFR19QTEFZQkFDS19TVEFUVVMsIDAsIDApOwogCWluaXRfdmlhZGV2KGNoaXAsIDEsIFZJQV9SRUdfQ0FQVFVSRV9TVEFUVVMsIDAsIDEpOwogCi0JaWYgKChlcnIgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWX1NHLAotCQkJCQkJCSBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPnBjaSksCi0JCQkJCQkJIDY0KjEwMjQsIDEyOCoxMDI0KSkgPCAwKQotCQlyZXR1cm4gZXJyOwotCisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFVl9TRywKKwkJCQkJICAgICAgc25kX2RtYV9wY2lfZGF0YShjaGlwLT5wY2kpLAorCQkJCQkgICAgICA2NCoxMDI0LCBWSUFfTUFYX0JVRlNJWkUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCAzMWY2NGVlLi41YmQ3OWQyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTI4MSw3ICsyODEsNiBAQAogewogCXVuc2lnbmVkIGludCBpLCBpZHgsIG9mcywgcmVzdDsKIAlzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgc25kX3NnX2J1ZiAqc2didWYgPSBzbmRfcGNtX3N1YnN0cmVhbV9zZ2J1ZihzdWJzdHJlYW0pOwogCiAJaWYgKGRldi0+dGFibGUuYXJlYSA9PSBOVUxMKSB7CiAJCS8qIHRoZSBzdGFydCBvZiBlYWNoIGxpc3RzIG11c3QgYmUgYWxpZ25lZCB0byA4IGJ5dGVzLApAQCAtMzEwLDEyICszMDksMTQgQEAKIAkJZG8gewogCQkJdW5zaWduZWQgaW50IHI7CiAJCQl1bnNpZ25lZCBpbnQgZmxhZzsKKwkJCXVuc2lnbmVkIGludCBhZGRyOwogCiAJCQlpZiAoaWR4ID49IFZJQV9UQUJMRV9TSVpFKSB7CiAJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAidmlhODJ4eDogdG9vIG11Y2ggdGFibGUgc2l6ZSFcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJKCh1MzIgKilkZXYtPnRhYmxlLmFyZWEpW2lkeCA8PCAxXSA9IGNwdV90b19sZTMyKCh1MzIpc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzZ2J1Ziwgb2ZzKSk7CisJCQlhZGRyID0gc25kX3BjbV9zZ2J1Zl9nZXRfYWRkcihzdWJzdHJlYW0sIG9mcyk7CisJCQkoKHUzMiAqKWRldi0+dGFibGUuYXJlYSlbaWR4IDw8IDFdID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCQlyID0gUEFHRV9TSVpFIC0gKG9mcyAlIFBBR0VfU0laRSk7CiAJCQlpZiAocmVzdCA8IHIpCiAJCQkJciA9IHJlc3Q7CkBAIC02MTIsNyArNjEzLDggQEAKIAlzdHJ1Y3QgdmlhZGV2ICp2aWFkZXYgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaWR4LCBwdHIsIGNvdW50LCByZXM7CiAKLQlzbmRfYXNzZXJ0KHZpYWRldi0+dGJsX2VudHJpZXMsIHJldHVybiAwKTsKKwlpZiAoc25kX0JVR19PTighdmlhZGV2LT50YmxfZW50cmllcykpCisJCXJldHVybiAwOwogCWlmICghKGluYihWSUFERVZfUkVHKHZpYWRldiwgT0ZGU0VUX1NUQVRVUykpICYgVklBX1JFR19TVEFUX0FDVElWRSkpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKaW5kZXggNjMxZjNhNi4uN2U4N2YzOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCisrKyBiL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYwpAQCAtMjUzLDcgKzI1Myw4IEBACiAJaW50IG9mZnNldCA9IHBpcGUtPmh3X3B0cjsKIAl1MzIgKmFkZHIgPSAodTMyICopKHJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0KTsKIAotCXNuZF9hc3NlcnQoY291bnQgJSA0ID09IDAsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oY291bnQgJSA0KSkKKwkJcmV0dXJuOwogCiAJdngyX3NldHVwX3BzZXVkb19kbWEoY2hpcCwgMSk7CiAKQEAgLTI5MSw3ICsyOTIsOCBAQAogCXUzMiAqYWRkciA9ICh1MzIgKikocnVudGltZS0+ZG1hX2FyZWEgKyBvZmZzZXQpOwogCXVuc2lnbmVkIGxvbmcgcG9ydCA9IHZ4Ml9yZWdfYWRkcihjaGlwLCBWWF9ETUEpOwogCi0Jc25kX2Fzc2VydChjb3VudCAlIDQgPT0gMCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihjb3VudCAlIDQpKQorCQlyZXR1cm47CiAKIAl2eDJfc2V0dXBfcHNldWRvX2RtYShjaGlwLCAwKTsKIAkvKiBUcmFuc2ZlciB1c2luZyBwc2V1ZG8tZG1hLgpAQCAtNjc1LDcgKzY3Nyw4IEBACiAJICAgYSBsb29rIHVwIHRhYmxlLCBhcyB0aGVyZSBpcyBubyBsaW5lYXIgbWF0Y2hpbmcgYmV0d2VlbiB0aGUgZHJpdmVyIGNvZGVjIHZhbHVlcwogCSAgIGFuZCB0aGUgcmVhbCBkQnUgdmFsdWUKIAkqLwotCXNuZF9hc3NlcnQoZGF0YSA8IHNpemVvZih2eDJfYWttX2dhaW5zX2x1dCksIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oZGF0YSA+PSBzaXplb2YodngyX2FrbV9nYWluc19sdXQpKSkKKwkJcmV0dXJuOwogCiAJc3dpdGNoIChyZWcpIHsKIAljYXNlIFhYX0NPREVDX0xFVkVMX0xFRlRfUkVHSVNURVI6CkBAIC04MjMsNyArODI2LDggQEAKIAkJcHJlYW1wKys7CS8qIHJhaXNlIHByZSBhbXBsaSArIDE4ZEIgKi8KIAkJbWljbGV2ZWwgLT0gKDE4ICogMik7ICAgLyogbG93ZXIgbGV2ZWwgMTggZEIgKCoyIGJlY2F1c2Ugb2YgMC41IGRCIHN0ZXBzICEpICovCiAgICAgICAgIH0KLQlzbmRfYXNzZXJ0KHByZWFtcCA8IDQsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04ocHJlYW1wID49IDQpKQorCQlyZXR1cm47CiAKIAkvKiBzZXQgcHJlLWFtcCBsZXZlbCAqLwogCWNoaXAtPnJlZ1NFTE1JQyAmPSB+TUlDUk9fU0VMRUNUX1BSRUFNUExJX01BU0s7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggOTJkNDlhYS4uOTBkMGQ2MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMjU5LDggKzI1OSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKIAkKLQlzbmRfYXNzZXJ0KHJ2b2ljZSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydCghcGFpciB8fCB0eXBlID09IFlNRlBDSV9QQ00sIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcnZvaWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9CVUdfT04ocGFpciAmJiB0eXBlICE9IFlNRlBDSV9QQ00pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwogCWZvciAoOzspIHsKQEAgLTI3OCw3ICsyODAsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCi0Jc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFwdm9pY2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlzbmRfeW1mcGNpX2h3X3N0b3AoY2hpcCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlpZiAocHZvaWNlLT5udW1iZXIgPT0gY2hpcC0+c3JjNDQxX3VzZWQpIHsKQEAgLTQ5NCw3ICs0OTcsOCBAQAogCXU4IHVzZV9sZWZ0LCB1c2VfcmlnaHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNuZF9hc3NlcnQodm9pY2UgIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighdm9pY2UpKQorCQlyZXR1cm47CiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDEpIHsKIAkJdXNlX2xlZnQgPSAxOwogCQl1c2VfcmlnaHQgPSAxOwpAQCAtMTgxMyw3ICsxODE3LDggQEAKIAl9CiAKIAkvKiBhZGQgUy9QRElGIGNvbnRyb2wgKi8KLQlzbmRfYXNzZXJ0KGNoaXAtPnBjbV9zcGRpZiAhPSBOVUxMLCByZXR1cm4gLUVJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAtPnBjbV9zcGRpZikpCisJCXJldHVybiAtRU5YSU87CiAJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfeW1mcGNpX3NwZGlmX2RlZmF1bHQsIGNoaXApKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCWtjdGwtPmlkLmRldmljZSA9IGNoaXAtPnBjbV9zcGRpZi0+ZGV2aWNlOwpAQCAtMjEzMyw3ICsyMTM4LDggQEAKIAljaGlwLT53b3JrX2Jhc2UgPSBwdHI7CiAJY2hpcC0+d29ya19iYXNlX2FkZHIgPSBwdHJfYWRkcjsKIAkKLQlzbmRfYXNzZXJ0KHB0ciArIGNoaXAtPndvcmtfc2l6ZSA9PSBjaGlwLT53b3JrX3B0ci5hcmVhICsgY2hpcC0+d29ya19wdHIuYnl0ZXMsICk7CisJc25kX0JVR19PTihwdHIgKyBjaGlwLT53b3JrX3NpemUgIT0KKwkJICAgY2hpcC0+d29ya19wdHIuYXJlYSArIGNoaXAtPndvcmtfcHRyLmJ5dGVzKTsKIAogCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9QTEFZQ1RSTEJBU0UsIGNoaXAtPmJhbmtfYmFzZV9wbGF5YmFja19hZGRyKTsKIAlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfUkVDQ1RSTEJBU0UsIGNoaXAtPmJhbmtfYmFzZV9jYXB0dXJlX2FkZHIpOwpAQCAtMjE2OCw3ICsyMTc0LDggQEAKIHsKIAl1MTYgY3RybDsKIAotCXNuZF9hc3NlcnQoY2hpcCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjaGlwLT5yZXNfcmVnX2FyZWEpIHsJLyogZG9uJ3QgdG91Y2ggYnVzeSBoYXJkd2FyZSAqLwogCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfTkFUSVZFREFDT1VUVk9MLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS92eC92eHBfb3BzLmMgYi9zb3VuZC9wY21jaWEvdngvdnhwX29wcy5jCmluZGV4IDk5YmYyYTYuLjk4OWUwNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBfb3BzLmMKKysrIGIvc291bmQvcGNtY2lhL3Z4L3Z4cF9vcHMuYwpAQCAtNDA4LDcgKzQwOCw4IEBACiAJaW50IG9mZnNldCA9IHBpcGUtPmh3X3B0cjsKIAl1bnNpZ25lZCBzaG9ydCAqYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKShydW50aW1lLT5kbWFfYXJlYSArIG9mZnNldCk7CiAKLQlzbmRfYXNzZXJ0KGNvdW50ICUgMiA9PSAwLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKGNvdW50ICUgMikpCisJCXJldHVybjsKIAl2eF9zZXR1cF9wc2V1ZG9fZG1hKGNoaXAsIDApOwogCWlmIChvZmZzZXQgKyBjb3VudCA+IHBpcGUtPmJ1ZmZlcl9ieXRlcykgewogCQlpbnQgbGVuZ3RoID0gcGlwZS0+YnVmZmVyX2J5dGVzIC0gb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL2F3YWNzLmMgYi9zb3VuZC9wcGMvYXdhY3MuYwppbmRleCA1NjZhNmQwLi43YmQzM2U2IDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvYXdhY3MuYworKysgYi9zb3VuZC9wcGMvYXdhY3MuYwpAQCAtMzE5LDcgKzMxOSw4IEBACiBzdGF0aWMgdm9pZCBhd2Fjc19hbXBfZnJlZShzdHJ1Y3Qgc25kX3BtYWMgKmNoaXApCiB7CiAJc3RydWN0IGF3YWNzX2FtcCAqYW1wID0gY2hpcC0+bWl4ZXJfZGF0YTsKLQlzbmRfYXNzZXJ0KGFtcCwgcmV0dXJuKTsKKwlpZiAoIWFtcCkKKwkJcmV0dXJuOwogCWtmcmVlKGFtcCk7CiAJY2hpcC0+bWl4ZXJfZGF0YSA9IE5VTEw7CiAJY2hpcC0+bWl4ZXJfZnJlZSA9IE5VTEw7CkBAIC0zNDUsOCArMzQ2LDcgQEAKIAlzdHJ1Y3Qgc25kX3BtYWMgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaW50IGluZGV4ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJc3RydWN0IGF3YWNzX2FtcCAqYW1wID0gY2hpcC0+bWl4ZXJfZGF0YTsKLQlzbmRfYXNzZXJ0KGFtcCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8PSAxLCByZXR1cm4gLUVJTlZBTCk7CisKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDMxIC0gKGFtcC0+YW1wX3ZvbFtpbmRleF1bMF0gJiAzMSk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAzMSAtIChhbXAtPmFtcF92b2xbaW5kZXhdWzFdICYgMzEpOwogCXJldHVybiAwOwpAQCAtMzU5LDggKzM1OSw2IEBACiAJaW50IGluZGV4ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJaW50IHZvbFsyXTsKIAlzdHJ1Y3QgYXdhY3NfYW1wICphbXAgPSBjaGlwLT5taXhlcl9kYXRhOwotCXNuZF9hc3NlcnQoYW1wLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDw9IDEsIHJldHVybiAtRUlOVkFMKTsKIAogCXZvbFswXSA9ICgzMSAtICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDMxKSkKIAkJfCAoYW1wLT5hbXBfdm9sW2luZGV4XVswXSAmIDMyKTsKQEAgLTM3NSw4ICszNzMsNyBAQAogCXN0cnVjdCBzbmRfcG1hYyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgaW5kZXggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlzdHJ1Y3QgYXdhY3NfYW1wICphbXAgPSBjaGlwLT5taXhlcl9kYXRhOwotCXNuZF9hc3NlcnQoYW1wLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDw9IDEsIHJldHVybiAtRUlOVkFMKTsKKwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGFtcC0+YW1wX3ZvbFtpbmRleF1bMF0gJiAzMikKIAkJCQkJPyAwIDogMTsKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IChhbXAtPmFtcF92b2xbaW5kZXhdWzFdICYgMzIpCkBAIC0zOTEsOCArMzg4LDYgQEAKIAlpbnQgaW5kZXggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgdm9sWzJdOwogCXN0cnVjdCBhd2Fjc19hbXAgKmFtcCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc25kX2Fzc2VydChhbXAsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPD0gMSwgcmV0dXJuIC1FSU5WQUwpOwogCiAJdm9sWzBdID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMCA6IDMyKQogCQl8IChhbXAtPmFtcF92b2xbaW5kZXhdWzBdICYgMzEpOwpAQCAtNDE3LDggKzQxMiw3IEBACiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCBpbmRleCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBhd2Fjc19hbXAgKmFtcCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc25kX2Fzc2VydChhbXAsIHJldHVybiAtRUlOVkFMKTsKLQlzbmRfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPD0gMSwgcmV0dXJuIC1FSU5WQUwpOworCiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhbXAtPmFtcF90b25lW2luZGV4XTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQzMCw4ICs0MjQsNyBAQAogCWludCBpbmRleCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBhd2Fjc19hbXAgKmFtcCA9IGNoaXAtPm1peGVyX2RhdGE7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlzbmRfYXNzZXJ0KGFtcCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8PSAxLCByZXR1cm4gLUVJTlZBTCk7CisKIAl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlpZiAodmFsID4gMTQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU4LDcgKzQ1MSw3IEBACiB7CiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhd2Fjc19hbXAgKmFtcCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc25kX2Fzc2VydChhbXAsIHJldHVybiAtRUlOVkFMKTsKKwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gYW1wLT5hbXBfbWFzdGVyOwogCXJldHVybiAwOwogfQpAQCAtNDY5LDcgKzQ2Miw3IEBACiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhd2Fjc19hbXAgKmFtcCA9IGNoaXAtPm1peGVyX2RhdGE7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlzbmRfYXNzZXJ0KGFtcCwgcmV0dXJuIC1FSU5WQUwpOworCiAJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CiAJaWYgKHZhbCA+IDk5KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYyMSw2ICs2MTQsMTMgQEAKIAlBV0FDU19TV0lUQ0goIkNEIENhcHR1cmUgU3dpdGNoIiwgMCwgU0hJRlRfTVVYX0NELCAwKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfcG1hY19zY3JlYW1lcl9taXhlcnNfZzRhZ3BbXSBfX2luaXRkYXRhID0geworCUFXQUNTX1ZPTFVNRSgiTGluZSBvdXQgUGxheWJhY2sgVm9sdW1lIiwgMiwgNiwgMSksCisJQVdBQ1NfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgNSwgNiwgMSksCisJQVdBQ1NfU1dJVENIKCJDRCBDYXB0dXJlIFN3aXRjaCIsIDAsIFNISUZUX01VWF9DRCwgMCksCisJQVdBQ1NfU1dJVENIKCJMaW5lIENhcHR1cmUgU3dpdGNoIiwgMCwgU0hJRlRfTVVYX01JQywgMCksCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3BtYWNfYXdhY3NfbWl4ZXJzX3BtYWM3NTAwW10gX19pbml0ZGF0YSA9IHsKIAlBV0FDU19WT0xVTUUoIkxpbmUgb3V0IFBsYXliYWNrIFZvbHVtZSIsIDIsIDYsIDEpLAogCUFXQUNTX1NXSVRDSCgiQ0QgQ2FwdHVyZSBTd2l0Y2giLCAwLCBTSElGVF9NVVhfQ0QsIDApLApAQCAtNjg4LDcgKzY4OCwxMCBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9wbWFjX2F3YWNzX3NwZWFrZXJfc3cgX19pbml0ZGF0YSA9CiBBV0FDU19TV0lUQ0goIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMSwgU0hJRlRfU1BLTVVURSwgMSk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfcG1hY19hd2Fjc19zcGVha2VyX3N3X2ltYWMgX19pbml0ZGF0YSA9CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3BtYWNfYXdhY3Nfc3BlYWtlcl9zd19pbWFjMSBfX2luaXRkYXRhID0KK0FXQUNTX1NXSVRDSCgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAxLCBTSElGVF9QQVJPVVQxLCAxKTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9wbWFjX2F3YWNzX3NwZWFrZXJfc3dfaW1hYzIgX19pbml0ZGF0YSA9CiBBV0FDU19TV0lUQ0goIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMSwgU0hJRlRfUEFST1VUMSwgMCk7CiAKIApAQCAtNzY1LDExICs3NjgsMTIgQEAKIAogI2RlZmluZSBJU19QTTc1MDAgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCw3NTAwIikpCiAjZGVmaW5lIElTX0JFSUdFIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsR29zc2FtZXIiKSkKLSNkZWZpbmUgSVNfSU1BQyAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzIsMSIpIFwKLQkJfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzIsMiIpIFwKKyNkZWZpbmUgSVNfSU1BQzEgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWMyLDEiKSkKKyNkZWZpbmUgSVNfSU1BQzIgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWMyLDIiKSBcCiAJCXx8IG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM0LDEiKSkKKyNkZWZpbmUgSVNfRzRBR1AgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWMzLDEiKSkKIAotc3RhdGljIGludCBpbWFjOworc3RhdGljIGludCBpbWFjMSwgaW1hYzI7CiAKICNpZmRlZiBQTUFDX1NVUFBPUlRfQVVUT01VVEUKIC8qCkBAIC04MTUsMTMgKzgxOSwxOCBAQAogCQl7CiAJCQlpbnQgcmVnID0gY2hpcC0+YXdhY3NfcmVnWzFdCiAJCQkJfCAoTUFTS19IRE1VVEUgfCBNQVNLX1NQS01VVEUpOwotCQkJaWYgKGltYWMpIHsKKwkJCWlmIChpbWFjMSkgeworCQkJCXJlZyAmPSB+TUFTS19TUEtNVVRFOworCQkJCXJlZyB8PSBNQVNLX1BBUk9VVDE7CisJCQl9IGVsc2UgaWYgKGltYWMyKSB7CiAJCQkJcmVnICY9IH5NQVNLX1NQS01VVEU7CiAJCQkJcmVnICY9IH5NQVNLX1BBUk9VVDE7CiAJCQl9CiAJCQlpZiAoc25kX3BtYWNfYXdhY3NfZGV0ZWN0X2hlYWRwaG9uZShjaGlwKSkKIAkJCQlyZWcgJj0gfk1BU0tfSERNVVRFOwotCQkJZWxzZSBpZiAoaW1hYykKKwkJCWVsc2UgaWYgKGltYWMxKQorCQkJCXJlZyAmPSB+TUFTS19QQVJPVVQxOworCQkJZWxzZSBpZiAoaW1hYzIpCiAJCQkJcmVnIHw9IE1BU0tfUEFST1VUMTsKIAkJCWVsc2UKIAkJCQlyZWcgJj0gfk1BU0tfU1BLTVVURTsKQEAgLTg1MCw5ICs4NTksMTMgQEAKIHsKIAlpbnQgcG03NTAwID0gSVNfUE03NTAwOwogCWludCBiZWlnZSA9IElTX0JFSUdFOworCWludCBnNGFncCA9IElTX0c0QUdQOworCWludCBpbWFjOwogCWludCBlcnIsIHZvbDsKIAotCWltYWMgPSBJU19JTUFDOworCWltYWMxID0gSVNfSU1BQzE7CisJaW1hYzIgPSBJU19JTUFDMjsKKwlpbWFjID0gaW1hYzEgfHwgaW1hYzI7CiAJLyogbG9va3MgbGlrZSBNQVNLX0dBSU5MSU5FIHRyaWdnZXJzIHNvbWV0aGluZywgc28gd2Ugc2V0IGhlcmUKIAkgKiBhcyBzdGFydC11cAogCSAqLwpAQCAtOTM5LDcgKzk1Miw3IEBACiAJCQkJc25kX3BtYWNfYXdhY3NfbWl4ZXJzKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoYmVpZ2UpCisJaWYgKGJlaWdlIHx8IGc0YWdwKQogCQk7CiAJZWxzZSBpZiAoY2hpcC0+bW9kZWwgPT0gUE1BQ19TQ1JFQU1FUikKIAkJZXJyID0gYnVpbGRfbWl4ZXJzKGNoaXAsIEFSUkFZX1NJWkUoc25kX3BtYWNfc2NyZWFtZXJfbWl4ZXJzMiksCkBAIC05NjEsMTMgKzk3NCwxNyBAQAogCQllcnIgPSBidWlsZF9taXhlcnMoY2hpcCwKIAkJCQkgICBBUlJBWV9TSVpFKHNuZF9wbWFjX3NjcmVhbWVyX21peGVyc19pbWFjKSwKIAkJCQkgICBzbmRfcG1hY19zY3JlYW1lcl9taXhlcnNfaW1hYyk7CisJZWxzZSBpZiAoZzRhZ3ApCisJCWVyciA9IGJ1aWxkX21peGVycyhjaGlwLAorCQkJCSAgIEFSUkFZX1NJWkUoc25kX3BtYWNfc2NyZWFtZXJfbWl4ZXJzX2c0YWdwKSwKKwkJCQkgICBzbmRfcG1hY19zY3JlYW1lcl9taXhlcnNfZzRhZ3ApOwogCWVsc2UKIAkJZXJyID0gYnVpbGRfbWl4ZXJzKGNoaXAsCiAJCQkJICAgQVJSQVlfU0laRShzbmRfcG1hY19hd2Fjc19taXhlcnNfcG1hYyksCiAJCQkJICAgc25kX3BtYWNfYXdhY3NfbWl4ZXJzX3BtYWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWNoaXAtPm1hc3Rlcl9zd19jdGwgPSBzbmRfY3RsX25ldzEoKHBtNzUwMCB8fCBpbWFjKQorCWNoaXAtPm1hc3Rlcl9zd19jdGwgPSBzbmRfY3RsX25ldzEoKHBtNzUwMCB8fCBpbWFjIHx8IGc0YWdwKQogCQkJPyAmc25kX3BtYWNfYXdhY3NfbWFzdGVyX3N3X2ltYWMKIAkJCTogJnNuZF9wbWFjX2F3YWNzX21hc3Rlcl9zdywgY2hpcCk7CiAJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwgY2hpcC0+bWFzdGVyX3N3X2N0bCk7CkBAIC0xMDA0LDE1ICsxMDIxLDE3IEBACiAJCQkJCXNuZF9wbWFjX2F3YWNzX3NwZWFrZXJfdm9sKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQljaGlwLT5zcGVha2VyX3N3X2N0bCA9IHNuZF9jdGxfbmV3MShpbWFjCi0JCQkJPyAmc25kX3BtYWNfYXdhY3Nfc3BlYWtlcl9zd19pbWFjCisJCWNoaXAtPnNwZWFrZXJfc3dfY3RsID0gc25kX2N0bF9uZXcxKGltYWMxCisJCQkJPyAmc25kX3BtYWNfYXdhY3Nfc3BlYWtlcl9zd19pbWFjMQorCQkJCTogaW1hYzIKKwkJCQk/ICZzbmRfcG1hY19hd2Fjc19zcGVha2VyX3N3X2ltYWMyCiAJCQkJOiAmc25kX3BtYWNfYXdhY3Nfc3BlYWtlcl9zdywgY2hpcCk7CiAJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGNoaXAtPnNwZWFrZXJfc3dfY3RsKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChiZWlnZSkKKwlpZiAoYmVpZ2UgfHwgZzRhZ3ApCiAJCWVyciA9IGJ1aWxkX21peGVycyhjaGlwLAogCQkJCUFSUkFZX1NJWkUoc25kX3BtYWNfc2NyZWFtZXJfbWljX2Jvb3N0X2JlaWdlKSwKIAkJCQlzbmRfcG1hY19zY3JlYW1lcl9taWNfYm9vc3RfYmVpZ2UpOwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL2JlZXAuYyBiL3NvdW5kL3BwYy9iZWVwLmMKaW5kZXggYmFhMmE3Mi4uODlmNWMzMiAxMDA2NDQKLS0tIGEvc291bmQvcHBjL2JlZXAuYworKysgYi9zb3VuZC9wcGMvYmVlcC5jCkBAIC0xODUsNyArMTg1LDggQEAKIAkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXNuZF9hc3NlcnQoY2hpcC0+YmVlcCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAtPmJlZXApKQorCQlyZXR1cm4gLUVOWElPOwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hpcC0+YmVlcC0+dm9sdW1lOwogCXJldHVybiAwOwogfQpAQCAtMTk1LDcgKzE5Niw4IEBACiB7CiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGludCBvdmFsLCBudmFsOwotCXNuZF9hc3NlcnQoY2hpcC0+YmVlcCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWNoaXAtPmJlZXApKQorCQlyZXR1cm4gLUVOWElPOwogCW92YWwgPSBjaGlwLT5iZWVwLT52b2x1bWU7CiAJbnZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCWlmIChudmFsID4gMTAwKQpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3R1bWJsZXIuYyBiL3NvdW5kL3BwYy90dW1ibGVyLmMKaW5kZXggMDA5ZGY4ZC4uZjc0NmUxNSAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3R1bWJsZXIuYworKysgYi9zb3VuZC9wcGMvdHVtYmxlci5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3BtYWMgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IHBtYWNfdHVtYmxlciAqbWl4ID0gY2hpcC0+bWl4ZXJfZGF0YTsKLQlzbmRfYXNzZXJ0KG1peCwgcmV0dXJuIC1FTk9ERVYpOworCiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtaXgtPm1hc3Rlcl92b2xbMF07CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBtaXgtPm1hc3Rlcl92b2xbMV07CiAJcmV0dXJuIDA7CkBAIC0yNzcsNyArMjc3LDYgQEAKIAl1bnNpZ25lZCBpbnQgdm9sWzJdOwogCWludCBjaGFuZ2U7CiAKLQlzbmRfYXNzZXJ0KG1peCwgcmV0dXJuIC1FTk9ERVYpOwogCXZvbFswXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCXZvbFsxXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwogCWlmICh2b2xbMF0gPj0gQVJSQVlfU0laRShtYXN0ZXJfdm9sdW1lX3RhYmxlKSB8fApAQCAtMjk5LDcgKzI5OCw3IEBACiB7CiAJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBwbWFjX3R1bWJsZXIgKm1peCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc25kX2Fzc2VydChtaXgsIHJldHVybiAtRU5PREVWKTsKKwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWl4LT5tYXN0ZXJfc3dpdGNoWzBdOwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gbWl4LT5tYXN0ZXJfc3dpdGNoWzFdOwogCXJldHVybiAwOwpAQCAtMzEyLDcgKzMxMSw2IEBACiAJc3RydWN0IHBtYWNfdHVtYmxlciAqbWl4ID0gY2hpcC0+bWl4ZXJfZGF0YTsKIAlpbnQgY2hhbmdlOwogCi0Jc25kX2Fzc2VydChtaXgsIHJldHVybiAtRU5PREVWKTsKIAljaGFuZ2UgPSBtaXgtPm1hc3Rlcl9zd2l0Y2hbMF0gIT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gfHwKIAkJbWl4LT5tYXN0ZXJfc3dpdGNoWzFdICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwogCWlmIChjaGFuZ2UpIHsKQEAgLTgwNyw3ICs4MDUsNiBAQAogCXN0cnVjdCBzbmRfcG1hYyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgcG1hY190dW1ibGVyICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwogCi0Jc25kX2Fzc2VydChtaXgsIHJldHVybiAtRU5PREVWKTsKIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWl4LT5jYXB0dXJlX3NvdXJjZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgxOSw3ICs4MTYsNiBAQAogCXN0cnVjdCBwbWFjX3R1bWJsZXIgKm1peCA9IGNoaXAtPm1peGVyX2RhdGE7CiAJaW50IGNoYW5nZTsKIAotCXNuZF9hc3NlcnQobWl4LCByZXR1cm4gLUVOT0RFVik7CiAJY2hhbmdlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAhPSBtaXgtPmNhcHR1cmVfc291cmNlOwogCWlmIChjaGFuZ2UpIHsKIAkJbWl4LT5jYXB0dXJlX3NvdXJjZSA9ICEhdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKQEAgLTk3OCw3ICs5NzQsOCBAQAogCQlyZXR1cm47CiAKIAltaXggPSBjaGlwLT5taXhlcl9kYXRhOwotCXNuZF9hc3NlcnQobWl4LCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFtaXgpKQorCQlyZXR1cm47CiAKIAloZWFkcGhvbmUgPSB0dW1ibGVyX2RldGVjdF9oZWFkcGhvbmUoY2hpcCk7CiAJbGluZW91dCA9IHR1bWJsZXJfZGV0ZWN0X2xpbmVvdXQoY2hpcCk7CkBAIC0xMDMzLDcgKzEwMzAsOCBAQAogCWlmIChjaGlwLT5hdXRvX211dGUpIHsKIAkJc3RydWN0IHBtYWNfdHVtYmxlciAqbWl4OwogCQltaXggPSBjaGlwLT5taXhlcl9kYXRhOwotCQlzbmRfYXNzZXJ0KG1peCwgcmV0dXJuKTsKKwkJaWYgKHNuZF9CVUdfT04oIW1peCkpCisJCQlyZXR1cm47CiAJCW1peC0+YXV0b19tdXRlX25vdGlmeSA9IGRvX25vdGlmeTsKIAkJc2NoZWR1bGVfd29yaygmZGV2aWNlX2NoYW5nZSk7CiAJfQpAQCAtMTIyNyw4ICsxMjI1LDYgQEAKIHsKIAlzdHJ1Y3QgcG1hY190dW1ibGVyICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwogCi0Jc25kX2Fzc2VydChtaXgsIHJldHVybik7Ci0KIAltaXgtPmFjcyAmPSB+MTsKIAltaXgtPm1hc3Rlcl9zd2l0Y2hbMF0gPSBtaXgtPnNhdmVfbWFzdGVyX3N3aXRjaFswXTsKIAltaXgtPm1hc3Rlcl9zd2l0Y2hbMV0gPSBtaXgtPnNhdmVfbWFzdGVyX3N3aXRjaFsxXTsKQEAgLTEyNzUsNyArMTI3MSw2IEBACiB7CiAJaW50IGlycTsKIAlzdHJ1Y3QgcG1hY190dW1ibGVyICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwotCXNuZF9hc3NlcnQobWl4LCByZXR1cm4gLUVJTlZBTCk7CiAKIAlpZiAodHVtYmxlcl9maW5kX2RldmljZSgiYXVkaW8taHctcmVzZXQiLAogCQkJCSJwbGF0Zm9ybS1kby1ody1yZXNldCIsCmRpZmYgLS1naXQgYS9zb3VuZC9zaC9haWNhLmMgYi9zb3VuZC9zaC9haWNhLmMKaW5kZXggNTRkZjhiYS4uN2M5MjBmMyAxMDA2NDQKLS0tIGEvc291bmQvc2gvYWljYS5jCisrKyBiL3NvdW5kL3NoL2FpY2EuYwpAQCAtMTA2LDcgKzEwNiw4IEBACiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfYXNzZXJ0KGxlbmd0aCAlIDQgPT0gMCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTihsZW5ndGggJSA0KSkKKwkJcmV0dXJuOwogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAoIShpICUgOCkpCiAJCQlzcHVfd3JpdGVfd2FpdCgpOwpAQCAtNTg5LDcgKzU5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2FpY2FfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9haWNhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCiB7CiAJc3RydWN0IHNuZF9jYXJkX2FpY2EgKmRyZWFtY2FzdGNhcmQ7CiAJZHJlYW1jYXN0Y2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldnB0cik7CkBAIC02MDEsNyArNjAyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX2FpY2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2FpY2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQogewogCWludCBlcnI7CiAJc3RydWN0IHNuZF9jYXJkX2FpY2EgKmRyZWFtY2FzdGNhcmQ7CkBAIC02NTAsNyArNjUxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2FpY2FfZHJpdmVyID0gewogCS5wcm9iZSA9IHNuZF9haWNhX3Byb2JlLAotCS5yZW1vdmUgPSBzbmRfYWljYV9yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNuZF9haWNhX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJICAgLm5hbWUgPSBTTkRfQUlDQV9EUklWRVJ9LAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKaW5kZXggZjc0MzUzMC4uNGRmZGE2NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL0tjb25maWcKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTUsNiArNSw3IEBACiBtZW51Y29uZmlnIFNORF9TT0MKIAl0cmlzdGF0ZSAiQUxTQSBmb3IgU29DIGF1ZGlvIHN1cHBvcnQiCiAJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgQUM5N19CVVMgaWYgU05EX1NPQ19BQzk3X0JVUwogCS0tLWhlbHAtLS0KIAogCSAgSWYgeW91IHdhbnQgQVNvQyBzdXBwb3J0LCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gdGhlCkBAIC0zMSw2ICszMiw3IEBACiBzb3VyY2UgInNvdW5kL3NvYy9mc2wvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL2RhdmluY2kvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL29tYXAvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL2JsYWNrZmluL0tjb25maWciCiAKICMgU3VwcG9ydGVkIGNvZGVjcwogc291cmNlICJzb3VuZC9zb2MvY29kZWNzL0tjb25maWciCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvTWFrZWZpbGUKaW5kZXggOTMzYTY2ZC4uZDg0OTM0OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKIAogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNuZC1zb2MtY29yZS5vCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gY29kZWNzLyBhdDMyLyBhdDkxLyBweGEvIHMzYzI0eHgvIHNoLyBmc2wvIGRhdmluY2kvCi1vYmotJChDT05GSUdfU05EX1NPQykJKz0gb21hcC8gYXUxeC8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBvbWFwLyBhdTF4LyBibGFja2Zpbi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDMyL2F0MzItcGNtLmMgYi9zb3VuZC9zb2MvYXQzMi9hdDMyLXBjbS5jCmluZGV4IDQzNWYxZGEuLmM4MzU4NGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdDMyL2F0MzItcGNtLmMKKysrIGIvc291bmQvc29jL2F0MzIvYXQzMi1wY20uYwpAQCAtNDM0LDcgKzQzNCw4IEBACiAJcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOwogCiAJLyogRGlzYWJsZSB0aGUgUERDIGFuZCBzYXZlIHRoZSBQREMgcmVnaXN0ZXJzICovCi0Jc3NjX3dyaXRleChwYXJhbXMtPnNzYy0+cmVncywgUERDX1BUQ1IsIHBhcmFtcy0+bWFzay0+cGRjX2Rpc2FibGUpOworCXNzY193cml0ZXgocGFyYW1zLT5zc2MtPnJlZ3MsIEFUTUVMX1BEQ19QVENSLAorCQkgICBwYXJhbXMtPm1hc2stPnBkY19kaXNhYmxlKTsKIAogCXBydGQtPnBkY194cHJfc2F2ZSA9IHNzY19yZWFkeChwYXJhbXMtPnNzYy0+cmVncywgcGFyYW1zLT5wZGMtPnhwcik7CiAJcHJ0ZC0+cGRjX3hjcl9zYXZlID0gc3NjX3JlYWR4KHBhcmFtcy0+c3NjLT5yZWdzLCBwYXJhbXMtPnBkYy0+eGNyKTsKQEAgLTQ2NCw3ICs0NjUsNyBAQAogCXNzY193cml0ZXgocGFyYW1zLT5zc2MtPnJlZ3MsIHBhcmFtcy0+cGRjLT54bnByLCBwcnRkLT5wZGNfeG5wcl9zYXZlKTsKIAlzc2Nfd3JpdGV4KHBhcmFtcy0+c3NjLT5yZWdzLCBwYXJhbXMtPnBkYy0+eG5jciwgcHJ0ZC0+cGRjX3huY3Jfc2F2ZSk7CiAKLQlzc2Nfd3JpdGV4KHBhcmFtcy0+c3NjLT5yZWdzLCBQRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZW5hYmxlKTsKKwlzc2Nfd3JpdGV4KHBhcmFtcy0+c3NjLT5yZWdzLCBBVE1FTF9QRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZW5hYmxlKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0MzIvcGxheXBhcV93bTg1MTAuYyBiL3NvdW5kL3NvYy9hdDMyL3BsYXlwYXFfd204NTEwLmMKaW5kZXggM2YzMjYyMS4uOThhMmQ1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0MzIvcGxheXBhcV93bTg1MTAuYworKysgYi9zb3VuZC9zb2MvYXQzMi9wbGF5cGFxX3dtODUxMC5jCkBAIC0zNzcsNiArMzc3LDcgQEAKIAogCiBzdGF0aWMgc3RydWN0IHdtODUxMF9zZXR1cF9kYXRhIHBsYXlwYXFfd204NTEwX3NldHVwID0geworCS5pMmNfYnVzID0gMCwKIAkuaTJjX2FkZHJlc3MgPSAweDFhLAogfTsKIApAQCAtNDA1LDcgKzQwNiw2IEBACiAJc3NjID0gc3NjX3JlcXVlc3QoMCk7CiAJaWYgKElTX0VSUihzc2MpKSB7CiAJCXJldCA9IFBUUl9FUlIoc3NjKTsKLQkJc3NjID0gTlVMTDsKIAkJZ290byBlcnJfc3NjOwogCX0KIAlzc2NfcC0+c3NjID0gc3NjOwpAQCAtNDc2LDEwICs0NzYsNyBAQAogCQlfZ2NsazAgPSBOVUxMOwogCX0KIGVycl9nY2xrMDoKLQlpZiAoc3NjICE9IE5VTEwpIHsKLQkJc3NjX2ZyZWUoc3NjKTsKLQkJc3NjID0gTlVMTDsKLQl9CisJc3NjX2ZyZWUoc3NjKTsKIGVycl9zc2M6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCmluZGV4IDkwNTE4NjUuLjg1YTg4MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcKKysrIGIvc291bmQvc29jL2F0OTEvS2NvbmZpZwpAQCAtOCwyMCArOCwzIEBACiAKIGNvbmZpZyBTTkRfQVQ5MV9TT0NfU1NDCiAJdHJpc3RhdGUKLQotY29uZmlnIFNORF9BVDkxX1NPQ19FVElfQjFfV004NzMxCi0JdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBXTTg3MzEtYmFzZWQgRW5kcmVsaWEgRVRJLUIxIGJvYXJkcyIKLQlkZXBlbmRzIG9uIFNORF9BVDkxX1NPQyAmJiAoTUFDSF9FVElfQjEgfHwgTUFDSF9FVElfQzEpCi0Jc2VsZWN0IFNORF9BVDkxX1NPQ19TU0MKLQlzZWxlY3QgU05EX1NPQ19XTTg3MzEKLQloZWxwCi0JICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFdNODczMS1iYXNlZAotCSAgRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYyBFVEktQjEgb3IgRVRJLUMxIGJvYXJkcy4KLQotY29uZmlnIFNORF9BVDkxX1NPQ19FVElfU0xBVkUKLQlib29sICJSdW4gY29kZWMgaW4gc2xhdmUgTW9kZSBvbiBFbmRyZWxpYSBib2FyZHMiCi0JZGVwZW5kcyBvbiBTTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMQotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHJ1biB3aXRoIHRoZSBBVDkxIFNTQyBnZW5lcmF0aW5nIHRoZSBCQ0xLCi0JICBhbmQgTFJDIHNpZ25hbHMgb24gRW5kcmVsaWEgYm9hcmRzLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0OTEvTWFrZWZpbGUgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQppbmRleCBmMjNkYTE3Li5iODE3ZjExIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQpAQCAtNCw4ICs0LDMgQEAKIAogb2JqLSQoQ09ORklHX1NORF9BVDkxX1NPQykgKz0gc25kLXNvYy1hdDkxLm8KIG9iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfU1NDKSArPSBzbmQtc29jLWF0OTEtc3NjLm8KLQotIyBBVDkxIE1hY2hpbmUgU3VwcG9ydAotc25kLXNvYy1ldGktYjEtd204NzMxLW9ianMgOj0gZXRpX2IxX3dtODczMS5vCi0KLW9iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMSkgKz0gc25kLXNvYy1ldGktYjEtd204NzMxLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtc3NjLmMgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXNzYy5jCmluZGV4IDVkNDQ1MTUuLjFiNjFjYzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtc3NjLmMKKysrIGIvc291bmQvc29jL2F0OTEvYXQ5MS1zc2MuYwpAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KICAqCiAgKiBCYXNlZCBvbiBweGEyeHggUGxhdGZvcm0gZHJpdmVycyBieQotICogTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPgorICogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC00MDgsNyArNDA4LDcgQEAKIAkJZG1hX3BhcmFtcy0+cGRjX3hmZXJfc2l6ZSA9IDQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImF0OTEtc3NjOiB1bnN1cHBvcnRlZCBQQ00gZm9ybWF0Iik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0OTEtc3NjOiB1bnN1cHBvcnRlZCBQQ00gZm9ybWF0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMgYi9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWQ2YjIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBldGlfYjFfd204NzMxICAtLSAgU29DIGF1ZGlvIGZvciBBVDkxUk05MjAwLWJhc2VkIEVuZHJlbGlhIEVUSV9CMSBib2FyZC4KLSAqCi0gKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+Ci0gKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KLSAqIENyZWF0ZWQ6CU1hciAyOSwgMjAwNgotICoKLSAqIEJhc2VkIG9uIGNvcmdpLmMgYnk6Ci0gKgotICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgotICoKLSAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KLSAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCi0jaW5jbHVkZSAiLi4vY29kZWNzL3dtODczMS5oIgotI2luY2x1ZGUgImF0OTEtcGNtLmgiCi0jaW5jbHVkZSAiYXQ5MS1zc2MuaCIKLQotI2lmIDAKLSNkZWZpbmUJREJHKHguLi4pCXByaW50ayhLRVJOX0lORk8gImV0aV9iMV93bTg3MzE6ICIgeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpwY2sxX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpwbGxiX2NsazsKLQotCi1zdGF0aWMgaW50IGV0aV9iMV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7Ci0JaW50IHJldDsKLQotCS8qIGNwdSBjbG9jayBpcyB0aGUgQVQ5MSBtYXN0ZXIgY2xvY2sgc2VudCB0byB0aGUgU1NDICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBBVDkxX1NZU0NMS19NQ0ssCi0JCTYwMDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGNvZGVjIHN5c3RlbSBjbG9jayBpcyBzdXBwbGllZCBieSBQQ0sxLCBzZXQgdG8gMTJNSHogKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgV004NzMxX1NZU0NMSywKLQkJMTIwMDAwMDAsIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogU3RhcnQgUENLMSBjbG9jay4gKi8KLQljbGtfZW5hYmxlKHBjazFfY2xrKTsKLQlEQkcoInBjazEgc3RhcnRlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXRpX2IxX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCS8qIFN0b3AgUENLMSBjbG9jay4gKi8KLQljbGtfZGlzYWJsZShwY2sxX2Nsayk7Ci0JREJHKCJwY2sxIHN0b3BwZWRcbiIpOwotfQotCi1zdGF0aWMgaW50IGV0aV9iMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5kYWktPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKLQlpbnQgcmV0OwotCi0jaWZkZWYgQ09ORklHX1NORF9BVDkxX1NPQ19FVElfU0xBVkUKLQl1bnNpZ25lZCBpbnQgcmF0ZTsKLQlpbnQgY21yX2RpdiwgcGVyaW9kOwotCi0JLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAotCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBUaGUgU1NDIGNsb2NrIGRpdmlkZXJzIGRlcGVuZCBvbiB0aGUgc2FtcGxlIHJhdGUuICBUaGUgQ01SLkRJVgotCSAqIGZpZWxkIGRpdmlkZXMgdGhlIHN5c3RlbSBtYXN0ZXIgY2xvY2sgTUNLIHRvIGRyaXZlIHRoZSBTU0MgVEsKLQkgKiBzaWduYWwgd2hpY2ggcHJvdmlkZXMgdGhlIGNvZGVjIEJDTEsuICBUaGUgVENNUi5QRVJJT0QgYW5kCi0JICogUkNNUi5QRVJJT0QgZmllbGRzIGZ1cnRoZXIgZGl2aWRlIHRoZSBCQ0xLIHNpZ25hbCB0byBkcml2ZQotCSAqIHRoZSBTU0MgVEYgYW5kIFJGIHNpZ25hbHMgd2hpY2ggcHJvdmlkZSB0aGUgY29kZWMgREFDTFJDIGFuZAotCSAqIEFEQ0xSQyBjbG9ja3MuCi0JICoKLQkgKiBUaGUgZGl2aWRlcnMgd2VyZSBkZXRlcm1pbmVkIHRocm91Z2ggdHJpYWwgYW5kIGVycm9yLCB3aGVyZSBhCi0JICogQ01SLkRJViB2YWx1ZSBpcyBjaG9zZW4gc3VjaCB0aGF0IHRoZSByZXN1bHRpbmcgQkNMSyB2YWx1ZSBpcwotCSAqIGRpdmlzaWJsZSwgb3IgYWxtb3N0IGRpdmlzaWJsZSwgYnkgKDIgKiBzYW1wbGUgcmF0ZSksIGFuZCB0aGVuCi0JICogdGhlIFRDTVIuUEVSSU9EIG9yIFJDTVIuUEVSSU9EIGlzIEJDTEsgLyAoMiAqIHNhbXBsZSByYXRlKSAtIDEuCi0JICovCi0JcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDgwMDA6Ci0JCWNtcl9kaXYgPSAyNTsJLyogQkNMSyA9IDYwTUh6LygyKjI1KSA9IDEuMk1IeiAqLwotCQlwZXJpb2QgPSA3NDsJLyogTFJDID0gQkNMSy8oMiooNzQrMSkpID0gODAwMEh6ICovCi0JCWJyZWFrOwotCWNhc2UgMzIwMDA6Ci0JCWNtcl9kaXYgPSA3OwkvKiBCQ0xLID0gNjBNSHovKDIqNykgfj0gNC4yODU3MTQyOE1IeiAqLwotCQlwZXJpb2QgPSA2NjsJLyogTFJDID0gQkNMSy8oMiooNjYrMSkpID0gMzE5ODIuOTQySHogKi8KLQkJYnJlYWs7Ci0JY2FzZSA0ODAwMDoKLQkJY21yX2RpdiA9IDEzOwkvKiBCQ0xLID0gNjBNSHovKDIqMTMpIH49IDIuMzA3NjkyM01IeiAqLwotCQlwZXJpb2QgPSAyMzsJLyogTFJDID0gQkNMSy8oMiooMjMrMSkpID0gNDgwNzYuOTIzSHogKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5zdXBwb3J0ZWQgcmF0ZSAlZCBvbiBFVEktQjEgYm9hcmRcbiIsIHJhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBzZXQgdGhlIE1DSyBkaXZpZGVyIGZvciBCQ0xLICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2Nsa2RpdihjcHVfZGFpLCBBVDkxU1NDX0NNUl9ESVYsIGNtcl9kaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJLyogc2V0IHRoZSBCQ0xLIGRpdmlkZXIgZm9yIERBQ0xSQyAqLwotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2xrZGl2KGNwdV9kYWksCi0JCQkJCQlBVDkxU1NDX1RDTVJfUEVSSU9ELCBwZXJpb2QpOwotCX0gZWxzZSB7Ci0JCS8qIHNldCB0aGUgQkNMSyBkaXZpZGVyIGZvciBBRENMUkMgKi8KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2Nsa2RpdihjcHVfZGFpLAotCQkJCQkJQVQ5MVNTQ19SQ01SX1BFUklPRCwgcGVyaW9kKTsKLQl9Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLSNlbHNlIC8qIENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX1NMQVZFICovCi0JLyoKLQkgKiBDb2RlYyBpbiBNYXN0ZXIgTW9kZS4KLQkgKi8KLQotCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAotCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotI2VuZGlmIC8qIENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX1NMQVZFICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBldGlfYjFfb3BzID0gewotCS5zdGFydHVwID0gZXRpX2IxX3N0YXJ0dXAsCi0JLmh3X3BhcmFtcyA9IGV0aV9iMV9od19wYXJhbXMsCi0JLnNodXRkb3duID0gZXRpX2IxX3NodXRkb3duLAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgZXRpX2IxX2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgTlVMTCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0gewotCi0JLyogc3BlYWtlciBjb25uZWN0ZWQgdG8gTEhQT1VUICovCi0JeyJFeHQgU3BrIiwgTlVMTCwgIkxIUE9VVCJ9LAotCi0JLyogbWljIGlzIGNvbm5lY3RlZCB0byBNaWMgSmFjaywgd2l0aCBXTTg3MzEgTWljIEJpYXMgKi8KLQl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBCaWFzIn0sCi0JeyJNaWMgQmlhcyIsIE5VTEwsICJJbnQgTWljIn0sCi19OwotCi0vKgotICogTG9naWMgZm9yIGEgd204NzMxIGFzIGNvbm5lY3RlZCBvbiBhIEVuZHJlbGlhIEVUSS1CMSBib2FyZC4KLSAqLwotc3RhdGljIGludCBldGlfYjFfd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCURCRygiZXRpX2IxX3dtODczMV9pbml0KCkgY2FsbGVkXG4iKTsKLQotCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgZXRpX2IxX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZXRpX2IxX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIHNwZWNpZmljIGF1ZGlvIHBhdGggaW50ZXJjb25uZWN0cyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGUoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7Ci0KLQkvKiBub3QgY29ubmVjdGVkICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUkxJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxMSU5FSU4iKTsKLQotCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkludCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKLQotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZXRpX2IxX2RhaSA9IHsKLQkubmFtZSA9ICJXTTg3MzEiLAotCS5zdHJlYW1fbmFtZSA9ICJXTTg3MzEgUENNIiwKLQkuY3B1X2RhaSA9ICZhdDkxX3NzY19kYWlbMV0sCi0JLmNvZGVjX2RhaSA9ICZ3bTg3MzFfZGFpLAotCS5pbml0ID0gZXRpX2IxX3dtODczMV9pbml0LAotCS5vcHMgPSAmZXRpX2IxX29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9ldGlfYjEgPSB7Ci0JLm5hbWUgPSAiRVRJX0IxX1dNODczMSIsCi0JLmRhaV9saW5rID0gJmV0aV9iMV9kYWksCi0JLm51bV9saW5rcyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIGV0aV9iMV93bTg3MzFfc2V0dXAgPSB7Ci0JLmkyY19hZGRyZXNzID0gMHgxYSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgZXRpX2IxX3NuZF9kZXZkYXRhID0gewotCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9ldGlfYjEsCi0JLnBsYXRmb3JtID0gJmF0OTFfc29jX3BsYXRmb3JtLAotCS5jb2RlY19kZXYgPSAmc29jX2NvZGVjX2Rldl93bTg3MzEsCi0JLmNvZGVjX2RhdGEgPSAmZXRpX2IxX3dtODczMV9zZXR1cCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpldGlfYjFfc25kX2RldmljZTsKLQotc3RhdGljIGludCBfX2luaXQgZXRpX2IxX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhdDkxX3NzY19wZXJpcGggKnNzYyA9IGV0aV9iMV9kYWkuY3B1X2RhaS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2SywgInNvYy1hdWRpbyIpKSB7Ci0JCURCRygiU1NDMSBtZW1vcnkgcmVnaW9uIGlzIGJ1c3lcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXNzYy0+YmFzZSA9IGlvcmVtYXAoQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7Ci0JaWYgKCFzc2MtPmJhc2UpIHsKLQkJREJHKCJTU0MxIG1lbW9yeSBpb3JlbWFwIGZhaWxlZFxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9yZWxlYXNlX21lbTsKLQl9Ci0KLQlzc2MtPnBpZCA9IEFUOTFSTTkyMDBfSURfU1NDMTsKLQotCWV0aV9iMV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7Ci0JaWYgKCFldGlfYjFfc25kX2RldmljZSkgewotCQlEQkcoInBsYXRmb3JtIGRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9pb191bm1hcDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShldGlfYjFfc25kX2RldmljZSwgJmV0aV9iMV9zbmRfZGV2ZGF0YSk7Ci0JZXRpX2IxX3NuZF9kZXZkYXRhLmRldiA9ICZldGlfYjFfc25kX2RldmljZS0+ZGV2OwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChldGlfYjFfc25kX2RldmljZSk7Ci0JaWYgKHJldCkgewotCQlEQkcoInBsYXRmb3JtIGRldmljZSBhZGQgZmFpbGVkXG4iKTsKLQkJcGxhdGZvcm1fZGV2aWNlX3B1dChldGlfYjFfc25kX2RldmljZSk7Ci0JCWdvdG8gZmFpbF9pb191bm1hcDsKLQl9Ci0KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjYsIDApOwkvKiBURjEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjcsIDApOwkvKiBUSzEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjgsIDApOwkvKiBURDEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjksIDApOwkvKiBSRDEgKi8KLS8qCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTAsIDApOyovCS8qIFJLMSAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTEsIDApOwkvKiBSRjEgKi8KLQotCS8qCi0JICogU2V0IFBDSzEgcGFyZW50IHRvIFBMTEIgYW5kIGl0cyByYXRlIHRvIDEyIE1oei4KLQkgKi8KLQlwbGxiX2NsayA9IGNsa19nZXQoTlVMTCwgInBsbGIiKTsKLQlwY2sxX2NsayA9IGNsa19nZXQoTlVMTCwgInBjazEiKTsKLQotCWNsa19zZXRfcGFyZW50KHBjazFfY2xrLCBwbGxiX2Nsayk7Ci0JY2xrX3NldF9yYXRlKHBjazFfY2xrLCAxMjAwMDAwMCk7Ci0KLQlEQkcoIk1DTEsgcmF0ZSAlbHVIelxuIiwgY2xrX2dldF9yYXRlKHBjazFfY2xrKSk7Ci0KLQkvKiBhc3NpZ24gdGhlIEdQSU8gcGluIHRvIFBDSzEgKi8KLQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTI0LCAwKTsKLQotI2lmZGVmIENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX1NMQVZFCi0JcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogQ29kZWMgaW4gU2xhdmUgTW9kZVxuIik7Ci0jZWxzZQotCXByaW50ayhLRVJOX0lORk8gImV0aV9iMV93bTg3MzE6IENvZGVjIGluIE1hc3RlciBNb2RlXG4iKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci0KLWZhaWxfaW9fdW5tYXA6Ci0JaW91bm1hcChzc2MtPmJhc2UpOwotZmFpbF9yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGV0aV9iMV9leGl0KHZvaWQpCi17Ci0Jc3RydWN0IGF0OTFfc3NjX3BlcmlwaCAqc3NjID0gZXRpX2IxX2RhaS5jcHVfZGFpLT5wcml2YXRlX2RhdGE7Ci0KLQljbGtfcHV0KHBjazFfY2xrKTsKLQljbGtfcHV0KHBsbGJfY2xrKTsKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV0aV9iMV9zbmRfZGV2aWNlKTsKLQotCWlvdW5tYXAoc3NjLT5iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7Ci19Ci0KLW1vZHVsZV9pbml0KGV0aV9iMV9pbml0KTsKLW1vZHVsZV9leGl0KGV0aV9iMV9leGl0KTsKLQotLyogTW9kdWxlIGluZm9ybWF0aW9uICovCi1NT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBFVEktQjEtV004NzMxIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDA2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vS2NvbmZpZwpAQCAtMCwwICsxLDEwMSBAQAorY29uZmlnIFNORF9CRjVYWF9JMlMKKwl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBmb3IgdGhlIEFESSBCRjV4eCBjaGlwIgorCWRlcGVuZHMgb24gQkxBQ0tGSU4gJiYgU05EX1NPQworCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bworCSAgdGhlIEJsYWNrZmluIFNQT1JUIChzeW5jaHJvbm91cyBzZXJpYWwgcG9ydHMpIGludGVyZmFjZSBpbiBJMlMKKwkgIG1vZGUgKHN1cHBvcnRzIHNpbmdsZSBzdGVyZW8gSW4vT3V0KS4KKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgdGhlIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KKworY29uZmlnIFNORF9CRjVYWF9TT0NfU1NNMjYwMgorCXRyaXN0YXRlICJTb0MgU1NNMjYwMiBBdWRpbyBzdXBwb3J0IGZvciBCRjUyeCBlemtpdCIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMKKwlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyCisJc2VsZWN0IEkyQworCXNlbGVjdCBJMkNfQkxBQ0tGSU5fVFdJCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBCRjUyNy1FWktJVC4KKworY29uZmlnIFNORF9CRjVYWF9TT0NfQUQ3MzMxMQorCXRyaXN0YXRlICJTb0MgQUQ3MzMxMSBBdWRpbyBzdXBwb3J0IGZvciBCbGFja2ZpbiIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMKKwlzZWxlY3QgU05EX0JGNVhYX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19BRDczMzExCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIEFENzMzMTEgY29kZWMgb24gQmxhY2tmaW4uCisKK2NvbmZpZyBTTkRfQkZJTl9BRDczMzExX1NFCisJaW50ICJQRiBwaW4gZm9yIEFENzMzMTFMIENoaXAgU2VsZWN0IgorCWRlcGVuZHMgb24gU05EX0JGNVhYX1NPQ19BRDczMzExCisJZGVmYXVsdCA0CisJaGVscAorCSAgRW50ZXIgdGhlIEdQSU8gdXNlZCB0byBjb250cm9sIEFENzMzMTEncyBTRSBwaW4uIEFjY2VwdGFibGUKKwkgIHZhbHVlcyBhcmUgMCB0byA3CisKK2NvbmZpZyBTTkRfQkY1WFhfQUM5NworCXRyaXN0YXRlICJTb0MgQUM5NyBBdWRpbyBmb3IgdGhlIEFESSBCRjV4eCBjaGlwIgorCWRlcGVuZHMgb24gQkxBQ0tGSU4gJiYgU05EX1NPQworCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bworCSAgdGhlIEJsYWNrZmluIFNQT1JUIChzeW5jaHJvbm91cyBzZXJpYWwgcG9ydHMpIGludGVyZmFjZSBpbiBzbG90IDE2CisJICBtb2RlIChwc2V1ZG8gQUM5NyBpbnRlcmZhY2UpLgorCSAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgorCisJICBOb3RlOgorCSAgQUM5NyBjb2RlY3Mgd2hpY2ggZG8gbm90IGltcGxtZW50IHRoZSBzbG90LTE2IG1vZGUgd2lsbCBub3QgZnVuY3Rpb24KKwkgIHByb3Blcmx5IHdpdGggdGhpcyBkcml2ZXIuIFRoaXMgZHJpdmVyIGlzIGtub3duIHRvIHdvcmsgd2l0aCB0aGUKKwkgIEFuYWxvZyBEZXZpY2VzIGxpbmUgb2YgQUM5NyBjb2RlY3MuCisKK2NvbmZpZyBTTkRfTU1BUF9TVVBQT1JUCisJYm9vbCAiRW5hYmxlIE1NQVAgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9BQzk3CisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IHkgaWYgeW91IHdhbnQgQUM5NyBkcml2ZXIgdG8gc3VwcG9ydCBtbWFwIG1vZGUuCisJICBXZSBpbnRyb2R1Y2UgYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byBzaW11bGF0ZSBtbWFwLgorCitjb25maWcgU05EX0JGNVhYX1NPQ19TUE9SVAorCXRyaXN0YXRlCisJCitjb25maWcgU05EX0JGNVhYX1NPQ19JMlMKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfQkY1WFhfU09DX1NQT1JUCisKK2NvbmZpZyBTTkRfQkY1WFhfU09DX0FDOTcKKwl0cmlzdGF0ZQorCXNlbGVjdCBBQzk3X0JVUworCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfU1BPUlQKKworY29uZmlnIFNORF9CRjVYWF9TT0NfQUQxOTgwCisJdHJpc3RhdGUgIlNvQyBBRDE5ODAvMSBBdWRpbyBzdXBwb3J0IGZvciBCRjV4eCIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9BQzk3CisJc2VsZWN0IFNORF9CRjVYWF9TT0NfQUM5NworCXNlbGVjdCBTTkRfU09DX0FEMTk4MAorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gQkY1eHggU1RBTVAvRVpLSVQuCisKK2NvbmZpZyBTTkRfQkY1WFhfU1BPUlRfTlVNCisJaW50ICJTZXQgYSBTUE9SVCBmb3IgU291bmQgY2hpcCIKKwlkZXBlbmRzIG9uIChTTkRfQkY1WFhfSTJTIHx8IFNORF9CRjVYWF9BQzk3KQorCXJhbmdlIDAgMyBpZiBCRjU0eAorCXJhbmdlIDAgMSBpZiAoQkY1M3ggfHwgQkY1NjEpCisJZGVmYXVsdCAwCisJaGVscAorCSAgU2V0IHRoZSBjb3JyZWN0IFNQT1JUIGZvciBzb3VuZCBjaGlwLgorCitjb25maWcgU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAorCWJvb2wgIkJPQVJEIGhhcyBDT0xEIFJlc2V0IEdQSU8iCisJZGVwZW5kcyBvbiBTTkRfQkY1WFhfQUM5NworCWRlZmF1bHQgeSBpZiBCRklONTQ4X0VaS0lUCisJZGVmYXVsdCBuIGlmICFCRklONTQ4X0VaS0lUCisJCitjb25maWcgU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNCisJaW50ICJTZXQgYSBHUElPIGZvciBjb2xkIHJlc2V0IgorCWRlcGVuZHMgb24gU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAorCXJhbmdlIDAgMTU5CisJZGVmYXVsdCAxOSBpZiBCRklONTQ4X0VaS0lUCisJZGVmYXVsdCA1IGlmIEJGSU41MzdfU1RBTVAKKwloZWxwCisJICBTZXQgdGhlIGNvcnJlY3QgR1BJTyBmb3IgUkVTRVQgdGhlIHNvdW5kIGNoaXAuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vTWFrZWZpbGUgYi9zb3VuZC9zb2MvYmxhY2tmaW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYjM3YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDIxIEBACisjIEJsYWNrZmluIFBsYXRmb3JtIFN1cHBvcnQKK3NuZC1iZjV4eC1hYzk3LW9ianMgOj0gYmY1eHgtYWM5Ny1wY20ubworc25kLWJmNXh4LWkycy1vYmpzIDo9IGJmNXh4LWkycy1wY20ubworc25kLXNvYy1iZjV4eC1zcG9ydC1vYmpzIDo9IGJmNXh4LXNwb3J0Lm8KK3NuZC1zb2MtYmY1eHgtYWM5Ny1vYmpzIDo9IGJmNXh4LWFjOTcubworc25kLXNvYy1iZjV4eC1pMnMtb2JqcyA6PSBiZjV4eC1pMnMubworCitvYmotJChDT05GSUdfU05EX0JGNVhYX0FDOTcpICs9IHNuZC1iZjV4eC1hYzk3Lm8KK29iai0kKENPTkZJR19TTkRfQkY1WFhfSTJTKSArPSBzbmQtYmY1eHgtaTJzLm8KK29iai0kKENPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUKSArPSBzbmQtc29jLWJmNXh4LXNwb3J0Lm8KK29iai0kKENPTkZJR19TTkRfQkY1WFhfU09DX0FDOTcpICs9IHNuZC1zb2MtYmY1eHgtYWM5Ny5vCitvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19JMlMpICs9IHNuZC1zb2MtYmY1eHgtaTJzLm8KKworIyBCbGFja2ZpbiBNYWNoaW5lIFN1cHBvcnQKK3NuZC1hZDE5ODAtb2JqcyA6PSBiZjV4eC1hZDE5ODAubworc25kLXNzbTI2MDItb2JqcyA6PSBiZjV4eC1zc20yNjAyLm8KK3NuZC1hZDczMzExLW9ianMgOj0gYmY1eHgtYWQ3MzMxMS5vCisKK29iai0kKENPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MCkgKz0gc25kLWFkMTk4MC5vCitvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyKSArPSBzbmQtc3NtMjYwMi5vCitvYmotJChDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExKSArPSBzbmQtYWQ3MzMxMS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTUwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uYwpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFjOTctcGNtLmMKKyAqIEF1dGhvcjogICAgICAgQ2xpZmYgQ2FpIDxDbGlmZi5DYWlAYW5hbG9nLmNvbT4KKyAqCisgKiBDcmVhdGVkOiAgICAgIFR1ZSBKdW5lIDA2IDIwMDgKKyAqIERlc2NyaXB0aW9uOiAgRE1BIERyaXZlciBmb3IgQUM5NyBzb3VuZCBjaGlwCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgImJmNXh4LWFjOTctcGNtLmgiCisjaW5jbHVkZSAiYmY1eHgtYWM5Ny5oIgorI2luY2x1ZGUgImJmNXh4LXNwb3J0LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfTU1BUF9TVVBQT1JUKQorc3RhdGljIHZvaWQgYmY1eHhfbW1hcF9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCSBzbmRfcGNtX3VmcmFtZXNfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCWJmNXh4X3BjbV90b19hYzk3KAorCQkJKHN0cnVjdCBhYzk3X2ZyYW1lICopc3BvcnQtPnR4X2RtYV9idWYgKyBzcG9ydC0+dHhfcG9zLAorCQkJKF9fdTMyICopcnVudGltZS0+ZG1hX2FyZWEgKyBzcG9ydC0+dHhfcG9zLCBjb3VudCk7CisJCXNwb3J0LT50eF9wb3MgKz0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCWlmIChzcG9ydC0+dHhfcG9zID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQkJc3BvcnQtPnR4X3BvcyAlPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKwkJc3BvcnQtPnR4X2RlbGF5X3BvcyA9IHNwb3J0LT50eF9wb3M7CisJfSBlbHNlIHsKKwkJYmY1eHhfYWM5N190b19wY20oCisJCQkoc3RydWN0IGFjOTdfZnJhbWUgKilzcG9ydC0+cnhfZG1hX2J1ZiArIHNwb3J0LT5yeF9wb3MsCisJCQkoX191MzIgKilydW50aW1lLT5kbWFfYXJlYSArIHNwb3J0LT5yeF9wb3MsIGNvdW50KTsKKwkJc3BvcnQtPnJ4X3BvcyArPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJaWYgKHNwb3J0LT5yeF9wb3MgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCQlzcG9ydC0+cnhfcG9zICU9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBiZjV4eF9kbWFfaXJxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20gPSBkYXRhOworI2lmIGRlZmluZWQoQ09ORklHX1NORF9NTUFQX1NVUFBPUlQpCisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHBjbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwliZjV4eF9tbWFwX2NvcHkocGNtLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJaWYgKHBjbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJaWYgKHNwb3J0LT5vbmNlID09IDApIHsKKwkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNtKTsKKwkJCWJmNXh4X21tYXBfY29weShwY20sIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwkJCXNwb3J0LT5vbmNlID0gMTsKKwkJfQorCX0KKyNlbmRpZgorCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNtKTsKK30KKworLyogVGhlIG1lbW9yeSBzaXplIGZvciBwdXJlIHBjbSBkYXRhIGlzIDEyOCoxMDI0ID0gMHgyMDAwMCBieXRlcy4KKyAqIFRoZSB0b3RhbCByeC90eCBidWZmZXIgaXMgZm9yIGFjOTcgZnJhbWUgdG8gaG9sZCBhbGwgcGNtIGRhdGEKKyAqIGlzICAweDIwMDAwICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSAvIDQuCisgKi8KKyNpZmRlZiBDT05GSUdfU05EX01NQVBfU1VQUE9SVAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGJmNXh4X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSLAorI2Vsc2UKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBiZjV4eF9wY21faGFyZHdhcmUgPSB7CisJLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSLAorI2VuZGlmCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDB4MTAwMDAsCisJLnBlcmlvZHNfbWluCQk9IDEsCisJLnBlcmlvZHNfbWF4CQk9IFBBR0VfU0laRS8zMiwKKwkuYnVmZmVyX2J5dGVzX21heAk9IDB4MjAwMDAsIC8qIDEyOCBrYnl0ZXMgKi8KKwkuZmlmb19zaXplCQk9IDE2LAorfTsKKworc3RhdGljIGludCBiZjV4eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXNpemVfdCBzaXplID0gYmY1eHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgKKwkJCSogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSAvIDQ7CisKKwlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBzaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmNXh4X3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwltZW1zZXQocnVudGltZS0+ZG1hX2FyZWEsIDAsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCS8qIEFuIGludGVybWVkaWF0ZSBidWZmZXIgaXMgaW50cm9kdWNlZCBmb3IgaW1wbGVtZW50aW5nIG1tYXAgZm9yCisJICogU1BPUlQgd29ya2luZyBpbiBUTUQgbW9kZShpbmNsdWRlIEFDOTcpLgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NORF9NTUFQX1NVUFBPUlQpCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJc3BvcnRfc2V0X3R4X2NhbGxiYWNrKHNwb3J0LCBiZjV4eF9kbWFfaXJxLCBzdWJzdHJlYW0pOworCQlzcG9ydF9jb25maWdfdHhfZG1hKHNwb3J0LCBzcG9ydC0+dHhfZG1hX2J1ZiwgcnVudGltZS0+cGVyaW9kcywKKwkJCXJ1bnRpbWUtPnBlcmlvZF9zaXplICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSk7CisJfSBlbHNlIHsKKwkJc3BvcnRfc2V0X3J4X2NhbGxiYWNrKHNwb3J0LCBiZjV4eF9kbWFfaXJxLCBzdWJzdHJlYW0pOworCQlzcG9ydF9jb25maWdfcnhfZG1hKHNwb3J0LCBzcG9ydC0+cnhfZG1hX2J1ZiwgcnVudGltZS0+cGVyaW9kcywKKwkJCXJ1bnRpbWUtPnBlcmlvZF9zaXplICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSk7CisJfQorI2Vsc2UKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlzcG9ydF9zZXRfdHhfY2FsbGJhY2soc3BvcnQsIGJmNXh4X2RtYV9pcnEsIHN1YnN0cmVhbSk7CisJCXNwb3J0X2NvbmZpZ190eF9kbWEoc3BvcnQsIHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5wZXJpb2RzLAorCQkJcnVudGltZS0+cGVyaW9kX3NpemUgKiBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpKTsKKwl9IGVsc2UgeworCQlzcG9ydF9zZXRfcnhfY2FsbGJhY2soc3BvcnQsIGJmNXh4X2RtYV9pcnEsIHN1YnN0cmVhbSk7CisJCXNwb3J0X2NvbmZpZ19yeF9kbWEoc3BvcnQsIHJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5wZXJpb2RzLAorCQkJcnVudGltZS0+cGVyaW9kX3NpemUgKiBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZjV4eF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJYmY1eHhfbW1hcF9jb3B5KHN1YnN0cmVhbSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCQkJc3BvcnQtPnR4X2RlbGF5X3BvcyA9IDA7CisJCQlzcG9ydF90eF9zdGFydChzcG9ydCk7CisJCX0KKwkJZWxzZQorCQkJc3BvcnRfcnhfc3RhcnQoc3BvcnQpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfTU1BUF9TVVBQT1JUKQorCQkJc3BvcnQtPnR4X3BvcyA9IDA7CisjZW5kaWYKKwkJCXNwb3J0X3R4X3N0b3Aoc3BvcnQpOworCQl9IGVsc2UgeworI2lmIGRlZmluZWQoQ09ORklHX1NORF9NTUFQX1NVUFBPUlQpCisJCQlzcG9ydC0+cnhfcG9zID0gMDsKKyNlbmRpZgorCQkJc3BvcnRfcnhfc3RvcChzcG9ydCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGJmNXh4X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGN1cnI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfTU1BUF9TVVBQT1JUKQorCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQljdXJyID0gc3BvcnQtPnR4X2RlbGF5X3BvczsKKwllbHNlCisJCWN1cnIgPSBzcG9ydC0+cnhfcG9zOworI2Vsc2UKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQljdXJyID0gc3BvcnRfY3Vycl9vZmZzZXRfdHgoc3BvcnQpIC8gc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKTsKKwllbHNlCisJCWN1cnIgPSBzcG9ydF9jdXJyX29mZnNldF9yeChzcG9ydCkgLyBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpOworCisjZW5kaWYKKwlyZXR1cm4gY3VycjsKK30KKworc3RhdGljIGludCBiZjV4eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmJmNXh4X3BjbV9oYXJkd2FyZSk7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChzcG9ydF9oYW5kbGUgIT0gTlVMTCkKKwkJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3BvcnRfaGFuZGxlOworCWVsc2UgeworCQlwcl9lcnIoInNwb3J0X2hhbmRsZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJmNXh4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJc3BvcnQtPm9uY2UgPSAwOworCQltZW1zZXQoc3BvcnQtPnR4X2RtYV9idWYsIDAsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSk7CisJfSBlbHNlCisJCW1lbXNldChzcG9ydC0+cnhfZG1hX2J1ZiwgMCwgcnVudGltZS0+YnVmZmVyX3NpemUgKiBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NORF9NTUFQX1NVUFBPUlQKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzaXplX3Qgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwl2bWEtPnZtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcnVudGltZS0+ZG1hX2FyZWE7CisJdm1hLT52bV9lbmQgPSB2bWEtPnZtX3N0YXJ0ICsgc2l6ZTsKKwl2bWEtPnZtX2ZsYWdzIHw9ICBWTV9TSEFSRUQ7CisJcmV0dXJuIDAgOworfQorI2Vsc2UKK3N0YXRpYwlpbnQgYmY1eHhfcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjaGFubmVsLAorCQkgICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zLAorCQkgICAgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXByX2RlYnVnKCIlcyBjb3B5IHBvczoweCVseCBjb3VudDoweCVseFxuIiwKKwkJCXN1YnN0cmVhbS0+c3RyZWFtID8gIkNhcHR1cmUiIDogIlBsYXliYWNrIiwgcG9zLCBjb3VudCk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJYmY1eHhfcGNtX3RvX2FjOTcoCisJCQkJKHN0cnVjdCBhYzk3X2ZyYW1lICopcnVudGltZS0+ZG1hX2FyZWEgKyBwb3MsCisJCQkJYnVmLCBjb3VudCk7CisJZWxzZQorCQliZjV4eF9hYzk3X3RvX3BjbSgKKwkJCQkoc3RydWN0IGFjOTdfZnJhbWUgKilydW50aW1lLT5kbWFfYXJlYSArIHBvcywKKwkJCQlidWYsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdHJ1Y3Qgc25kX3BjbV9vcHMgYmY1eHhfcGNtX2FjOTdfb3BzID0geworCS5vcGVuCQk9IGJmNXh4X3BjbV9vcGVuLAorCS5jbG9zZQkJPSBiZjV4eF9wY21fY2xvc2UsCisJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMJPSBiZjV4eF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gYmY1eHhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBiZjV4eF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlcgk9IGJmNXh4X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyCT0gYmY1eHhfcGNtX3BvaW50ZXIsCisjaWZkZWYgQ09ORklHX1NORF9NTUFQX1NVUFBPUlQKKwkubW1hcAkJPSBiZjV4eF9wY21fbW1hcCwKKyNlbHNlCisJLmNvcHkJCT0gYmY1eHhfcGNtX2NvcHksCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBiZjV4eF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heAorCQkJKiBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpIC8gNDsKKworCWJ1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJYnVmLT5kZXYuZGV2ID0gcGNtLT5jYXJkLT5kZXY7CisJYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWJ1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChwY20tPmNhcmQtPmRldiwgc2l6ZSwKKwkJCSZidWYtPmFkZHIsIEdGUF9LRVJORUwpOworCWlmICghYnVmLT5hcmVhKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBtZW1vcnlcbiIpOworCQlwcl9lcnIoIlBsZWFzZSBpbmNyZWFzZSB1bmNhY2hlZCBETUEgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWYtPmJ5dGVzID0gc2l6ZTsKKworCXByX2RlYnVnKCIlcywgYXJlYTolcCwgc2l6ZToweCUwOGx4XG4iLCBfX2Z1bmNfXywKKwkJCWJ1Zi0+YXJlYSwgYnVmLT5ieXRlcyk7CisKKwlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXNwb3J0X2hhbmRsZS0+dHhfYnVmID0gYnVmLT5hcmVhOworCWVsc2UKKwkJc3BvcnRfaGFuZGxlLT5yeF9idWYgPSBidWYtPmFyZWE7CisKKy8qCisgKiBOZWVkIHRvIGFsbG9jYXRlIGxvY2FsIGJ1ZmZlciB3aGVuIGVuYWJsZQorICogTU1BUCBmb3IgU1BPUlQgd29ya2luZyBpbiBUTUQgbW9kZSAoaW5jbHVkZSBBQzk3KS4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NORF9NTUFQX1NVUFBPUlQpCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJaWYgKCFzcG9ydF9oYW5kbGUtPnR4X2RtYV9idWYpIHsKKwkJCXNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBcCisJCQkJc2l6ZSwgJnNwb3J0X2hhbmRsZS0+dHhfZG1hX3BoeSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZikgeworCQkJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdHggZG1hIFwKKwkJCQkJYnVmIC0gUGxlYXNlIGluY3JlYXNlIHVuY2FjaGVkIERNQSBcCisJCQkJCW1lbW9yeSByZWdpb25cbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfSBlbHNlCisJCQkJbWVtc2V0KHNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZiwgMCwgc2l6ZSk7CisJCX0gZWxzZQorCQkJbWVtc2V0KHNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZiwgMCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJaWYgKCFzcG9ydF9oYW5kbGUtPnJ4X2RtYV9idWYpIHsKKwkJCXNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBcCisJCQkJc2l6ZSwgJnNwb3J0X2hhbmRsZS0+cnhfZG1hX3BoeSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZikgeworCQkJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnggZG1hIFwKKwkJCQkJYnVmIC0gUGxlYXNlIGluY3JlYXNlIHVuY2FjaGVkIERNQSBcCisJCQkJCW1lbW9yeSByZWdpb25cbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfSBlbHNlCisJCQkJbWVtc2V0KHNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZiwgMCwgc2l6ZSk7CisJCX0gZWxzZQorCQkJbWVtc2V0KHNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZiwgMCwgc2l6ZSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJmNXh4X3BjbV9mcmVlX2RtYV9idWZmZXJzKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWY7CisJaW50IHN0cmVhbTsKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfTU1BUF9TVVBQT1JUKQorCXNpemVfdCBzaXplID0gYmY1eHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXggKgorCQlzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpIC8gNDsKKyNlbmRpZgorCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKKwkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCQlpZiAoIXN1YnN0cmVhbSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJCWlmICghYnVmLT5hcmVhKQorCQkJY29udGludWU7CisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIGJ1Zi0+Ynl0ZXMsIGJ1Zi0+YXJlYSwgMCk7CisJCWJ1Zi0+YXJlYSA9IE5VTEw7CisjaWYgZGVmaW5lZChDT05GSUdfU05EX01NQVBfU1VQUE9SVCkKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlpZiAoc3BvcnRfaGFuZGxlLT50eF9kbWFfYnVmKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZSwgXAorCQkJCXNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZiwgMCk7CisJCXNwb3J0X2hhbmRsZS0+dHhfZG1hX2J1ZiA9IE5VTEw7CisJfSBlbHNlIHsKKworCQlpZiAoc3BvcnRfaGFuZGxlLT5yeF9kbWFfYnVmKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZSwgXAorCQkJCXNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZiwgMCk7CisJCXNwb3J0X2hhbmRsZS0+cnhfZG1hX2J1ZiA9IE5VTEw7CisJfQorI2VuZGlmCisJfQorCWlmIChzcG9ydF9oYW5kbGUpCisJCXNwb3J0X2RvbmUoc3BvcnRfaGFuZGxlKTsKK30KKworc3RhdGljIHU2NCBiZjV4eF9wY21fZG1hbWFzayA9IERNQV8zMkJJVF9NQVNLOworCitpbnQgYmY1eHhfcGNtX2FjOTdfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZiZjV4eF9wY21fZG1hbWFzazsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSzsKKworCWlmIChkYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbikgeworCQlyZXQgPSBiZjV4eF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCisJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChkYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7CisJCXJldCA9IGJmNXh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIGJmNXh4X2FjOTdfc29jX3BsYXRmb3JtID0geworCS5uYW1lCQk9ICJiZjV4eC1hdWRpbyIsCisJLnBjbV9vcHMgCT0gJmJmNXh4X3BjbV9hYzk3X29wcywKKwkucGNtX25ldwk9IGJmNXh4X3BjbV9hYzk3X25ldywKKwkucGNtX2ZyZWUJPSBiZjV4eF9wY21fZnJlZV9kbWFfYnVmZmVycywKK307CitFWFBPUlRfU1lNQk9MX0dQTChiZjV4eF9hYzk3X3NvY19wbGF0Zm9ybSk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBREkgQmxhY2tmaW4gQUM5NyBQQ00gRE1BIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFjOTctcGNtLmggYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAxMjVhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFjOTctcGNtLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2FybS9iZjV4eC1hYzk3LXBjbS5oIC0tIEFMU0EgUENNIGludGVyZmFjZSBmb3IgdGhlIEJsYWNrZmluCisgKgorICogQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9CRjVYWF9BQzk3X1BDTV9ICisjZGVmaW5lIF9CRjVYWF9BQzk3X1BDTV9ICisKK3N0cnVjdCBiZjV4eF9wY21fZG1hX3BhcmFtcyB7CisJY2hhciAqbmFtZTsJCQkvKiBzdHJlYW0gaWRlbnRpZmllciAqLworfTsKKworc3RydWN0IGJmNXh4X2dwaW8geworCXUzMiBzeXM7CisJdTMyIHJ4OworCXUzMiB0eDsKKwl1MzIgY2xrOworCXUzMiBmcm07Cit9OworCisvKiBwbGF0Zm9ybSBkYXRhICovCitleHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gYmY1eHhfYWM5N19zb2NfcGxhdGZvcm07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFjOTcuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1YWFmYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBiZjV4eC1hYzk3LmMgLS0gQUM5NyBzdXBwb3J0IGZvciB0aGUgQURJIGJsYWNrZmluIGNoaXAuCisgKgorICogQXV0aG9yOglSb3kgSHVhbmcKKyAqIENyZWF0ZWQ6CTExdGguIEp1bmUgMjAwNworICogQ29weXJpZ2h0OglBbmFsb2cgRGV2aWNlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSAiYmY1eHgtc3BvcnQuaCIKKyNpbmNsdWRlICJiZjV4eC1hYzk3LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkKKyNkZWZpbmUgUElOX1JFUV9TUE9SVF8wIHtQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgXAorCQlQX1NQT1JUMF9SRlMsIFBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMH0KKworI2RlZmluZSBQSU5fUkVRX1NQT1JUXzEge1BfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBcCisJCVBfU1BPUlQxX1JGUywgUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwfQorCisjZGVmaW5lIFBJTl9SRVFfU1BPUlRfMiB7UF9TUE9SVDJfVEZTLCBQX1NQT1JUMl9EVFBSSSwgUF9TUE9SVDJfVFNDTEssIFwKKwkJUF9TUE9SVDJfUkZTLCBQX1NQT1JUMl9EUlBSSSwgUF9TUE9SVDJfUlNDTEssIDB9CisKKyNkZWZpbmUgUElOX1JFUV9TUE9SVF8zIHtQX1NQT1JUM19URlMsIFBfU1BPUlQzX0RUUFJJLCBQX1NQT1JUM19UU0NMSywgXAorCQlQX1NQT1JUM19SRlMsIFBfU1BPUlQzX0RSUFJJLCBQX1NQT1JUM19SU0NMSywgMH0KKyNlbHNlCisjZGVmaW5lIFBJTl9SRVFfU1BPUlRfMCB7UF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsIFwKKwkJIFBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMH0KKworI2RlZmluZSBQSU5fUkVRX1NQT1JUXzEge1BfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLCBcCisJCSBQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDB9CisjZW5kaWYKKworc3RhdGljIGludCAqY21kX2NvdW50Oworc3RhdGljIGludCBzcG9ydF9udW0gPSBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorc3RhdGljIHN0cnVjdCBzcG9ydF9wYXJhbSBzcG9ydF9wYXJhbXNbNF0gPSB7CisJeworCQkuZG1hX3J4X2NoYW4JPSBDSF9TUE9SVDBfUlgsCisJCS5kbWFfdHhfY2hhbgk9IENIX1NQT1JUMF9UWCwKKwkJLmVycl9pcnEJPSBJUlFfU1BPUlQwX0VSUiwKKwkJLnJlZ3MJCT0gKHN0cnVjdCBzcG9ydF9yZWdpc3RlciAqKVNQT1JUMF9UQ1IxLAorCX0sCisJeworCQkuZG1hX3J4X2NoYW4JPSBDSF9TUE9SVDFfUlgsCisJCS5kbWFfdHhfY2hhbgk9IENIX1NQT1JUMV9UWCwKKwkJLmVycl9pcnEJPSBJUlFfU1BPUlQxX0VSUiwKKwkJLnJlZ3MJCT0gKHN0cnVjdCBzcG9ydF9yZWdpc3RlciAqKVNQT1JUMV9UQ1IxLAorCX0sCisJeworCQkuZG1hX3J4X2NoYW4JPSBDSF9TUE9SVDJfUlgsCisJCS5kbWFfdHhfY2hhbgk9IENIX1NQT1JUMl9UWCwKKwkJLmVycl9pcnEJPSBJUlFfU1BPUlQyX0VSUiwKKwkJLnJlZ3MJCT0gKHN0cnVjdCBzcG9ydF9yZWdpc3RlciAqKVNQT1JUMl9UQ1IxLAorCX0sCisJeworCQkuZG1hX3J4X2NoYW4JPSBDSF9TUE9SVDNfUlgsCisJCS5kbWFfdHhfY2hhbgk9IENIX1NQT1JUM19UWCwKKwkJLmVycl9pcnEJPSBJUlFfU1BPUlQzX0VSUiwKKwkJLnJlZ3MJCT0gKHN0cnVjdCBzcG9ydF9yZWdpc3RlciAqKVNQT1JUM19UQ1IxLAorCX0KK307CisjZWxzZQorc3RhdGljIHN0cnVjdCBzcG9ydF9wYXJhbSBzcG9ydF9wYXJhbXNbMl0gPSB7CisJeworCQkuZG1hX3J4X2NoYW4JPSBDSF9TUE9SVDBfUlgsCisJCS5kbWFfdHhfY2hhbgk9IENIX1NQT1JUMF9UWCwKKwkJLmVycl9pcnEJPSBJUlFfU1BPUlQwX0VSUk9SLAorCQkucmVncwkJPSAoc3RydWN0IHNwb3J0X3JlZ2lzdGVyICopU1BPUlQwX1RDUjEsCisJfSwKKwl7CisJCS5kbWFfcnhfY2hhbgk9IENIX1NQT1JUMV9SWCwKKwkJLmRtYV90eF9jaGFuCT0gQ0hfU1BPUlQxX1RYLAorCQkuZXJyX2lycQk9IElSUV9TUE9SVDFfRVJST1IsCisJCS5yZWdzCQk9IChzdHJ1Y3Qgc3BvcnRfcmVnaXN0ZXIgKilTUE9SVDFfVENSMSwKKwl9Cit9OworI2VuZGlmCisKK3ZvaWQgYmY1eHhfcGNtX3RvX2FjOTcoc3RydWN0IGFjOTdfZnJhbWUgKmRzdCwgY29uc3QgX191MzIgKnNyYywgXAorCQlzaXplX3QgY291bnQpCit7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJZHN0LT5hYzk3X3RhZyA9IFRBR19WQUxJRCB8IFRBR19QQ007CisJCShkc3QrKyktPmFjOTdfcGNtID0gKnNyYysrOworCX0KK30KK0VYUE9SVF9TWU1CT0woYmY1eHhfcGNtX3RvX2FjOTcpOworCit2b2lkIGJmNXh4X2FjOTdfdG9fcGNtKGNvbnN0IHN0cnVjdCBhYzk3X2ZyYW1lICpzcmMsIF9fdTMyICpkc3QsIFwKKwkJc2l6ZV90IGNvdW50KQoreworCXdoaWxlIChjb3VudC0tKQorCQkqKGRzdCsrKSA9IChzcmMrKyktPmFjOTdfcGNtOworfQorRVhQT1JUX1NZTUJPTChiZjV4eF9hYzk3X3RvX3BjbSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3BvcnRfdHhfY3Vycl9mcmFnKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXJldHVybiBzcG9ydC0+dHhfY3Vycl9mcmFnID0gc3BvcnRfY3Vycl9vZmZzZXRfdHgoc3BvcnQpIC8gXAorCQkJc3BvcnQtPnR4X2ZyYWdzaXplOworfQorCitzdGF0aWMgdm9pZCBlbnF1ZXVlX2NtZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIF9fdTE2IGFkZHIsIF9fdTE2IGRhdGEpCit7CisJc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQgPSBzcG9ydF9oYW5kbGU7CisJaW50IG5leHRmcmFnID0gc3BvcnRfdHhfY3Vycl9mcmFnKHNwb3J0KTsKKwlzdHJ1Y3QgYWM5N19mcmFtZSAqbmV4dHdyaXRlOworCisJc3BvcnRfaW5jZnJhZyhzcG9ydCwgJm5leHRmcmFnLCAxKTsKKworCW5leHR3cml0ZSA9IChzdHJ1Y3QgYWM5N19mcmFtZSAqKShzcG9ydC0+dHhfYnVmICsgXAorCQkJbmV4dGZyYWcgKiBzcG9ydC0+dHhfZnJhZ3NpemUpOworCXByX2RlYnVnKCJzcG9ydC0+dHhfYnVmOiVwLCBuZXh0ZnJhZzoweCV4IG5leHR3cml0ZTolcCwgY21kX2NvdW50OiVkXG4iLAorCQlzcG9ydC0+dHhfYnVmLCBuZXh0ZnJhZywgbmV4dHdyaXRlLCBjbWRfY291bnRbbmV4dGZyYWddKTsKKwluZXh0d3JpdGVbY21kX2NvdW50W25leHRmcmFnXV0uYWM5N190YWcgfD0gVEFHX0NNRDsKKwluZXh0d3JpdGVbY21kX2NvdW50W25leHRmcmFnXV0uYWM5N19hZGRyID0gYWRkcjsKKwluZXh0d3JpdGVbY21kX2NvdW50W25leHRmcmFnXV0uYWM5N19kYXRhID0gZGF0YTsKKwkrK2NtZF9jb3VudFtuZXh0ZnJhZ107CisJcHJfZGVidWcoImFjOTdfc3BvcnQ6IEluc2VydGluZyAlMDJ4LyUwNHggaW50byBmcmFnbWVudCAlZFxuIiwKKwkJCWFkZHIgPj4gOCwgZGF0YSwgbmV4dGZyYWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmY1eHhfYWM5N19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywKKwl1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJc3RydWN0IGFjOTdfZnJhbWUgb3V0X2ZyYW1lWzJdLCBpbl9mcmFtZVsyXTsKKworCXByX2RlYnVnKCIlcyBlbnRlciAweCV4XG4iLCBfX2Z1bmNfXywgcmVnKTsKKworCS8qIFdoZW4gZG1hIGRlc2NyaXB0b3IgaXMgZW5hYmxlZCwgdGhlIHJlZ2lzdGVyIHNob3VsZCBub3QgYmUgcmVhZCAqLworCWlmIChzcG9ydF9oYW5kbGUtPnR4X3J1biB8fCBzcG9ydF9oYW5kbGUtPnJ4X3J1bikgeworCQlwcl9lcnIoIkNvdWxkIHlvdSBzZW5kIGEgbWFpbCB0byBjbGlmZi5jYWlAYW5hbG9nLmNvbSAiCisJCQkJInRvIHJlcG9ydCB0aGlzP1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1lbXNldCgmb3V0X2ZyYW1lLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSk7CisJbWVtc2V0KCZpbl9mcmFtZSwgMCwgMiAqIHNpemVvZihzdHJ1Y3QgYWM5N19mcmFtZSkpOworCW91dF9mcmFtZVswXS5hYzk3X3RhZyA9IFRBR19WQUxJRCB8IFRBR19DTUQ7CisJb3V0X2ZyYW1lWzBdLmFjOTdfYWRkciA9ICgocmVnIDw8IDgpIHwgMHg4MDAwKTsKKwlzcG9ydF9zZW5kX2FuZF9yZWN2KHNwb3J0X2hhbmRsZSwgKHVuc2lnbmVkIGNoYXIgKikmb3V0X2ZyYW1lLAorCQkJKHVuc2lnbmVkIGNoYXIgKikmaW5fZnJhbWUsCisJCQkyICogc2l6ZW9mKHN0cnVjdCBhYzk3X2ZyYW1lKSk7CisJcmV0dXJuIGluX2ZyYW1lWzFdLmFjOTdfZGF0YTsKK30KKwordm9pZCBiZjV4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCXVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlwcl9kZWJ1ZygiJXMgZW50ZXIgMHgleDoweCUwNHhcbiIsIF9fZnVuY19fLCByZWcsIHZhbCk7CisKKwlpZiAoc3BvcnRfaGFuZGxlLT50eF9ydW4pIHsKKwkJZW5xdWV1ZV9jbWQoYWM5NywgKHJlZyA8PCA4KSwgdmFsKTsgLyogd3JpdGUgKi8KKwkJZW5xdWV1ZV9jbWQoYWM5NywgKHJlZyA8PCA4KSB8IDB4ODAwMCwgMCk7IC8qIHJlYWQgYmFjayAqLworCX0gZWxzZSB7CisJCXN0cnVjdCBhYzk3X2ZyYW1lIGZyYW1lOworCQltZW1zZXQoJmZyYW1lLCAwLCBzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpKTsKKwkJZnJhbWUuYWM5N190YWcgPSBUQUdfVkFMSUQgfCBUQUdfQ01EOworCQlmcmFtZS5hYzk3X2FkZHIgPSAocmVnIDw8IDgpOworCQlmcmFtZS5hYzk3X2RhdGEgPSB2YWw7CisJCXNwb3J0X3NlbmRfYW5kX3JlY3Yoc3BvcnRfaGFuZGxlLCAodW5zaWduZWQgY2hhciAqKSZmcmFtZSwgXAorCQkJCU5VTEwsIHNpemVvZihzdHJ1Y3QgYWM5N19mcmFtZSkpOworCX0KK30KKworc3RhdGljIHZvaWQgYmY1eHhfYWM5N193YXJtX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIHx8IFwKKyAoZGVmaW5lZChCRjUzN19GQU1JTFkpICYmIChDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTSA9PSAxKSkKKworI2RlZmluZSBDT05DQVQoYSwgYiwgYykgYSAjIyBiICMjIGMKKyNkZWZpbmUgQkZJTl9TUE9SVF9SRlMoeCkgQ09OQ0FUKFBfU1BPUlQsIHgsIF9SRlMpCisKKwl1MTYgcGVyID0gQkZJTl9TUE9SVF9SRlMoQ09ORklHX1NORF9CRjVYWF9TUE9SVF9OVU0pOworCXUxNiBncGlvID0gUF9JREVOVChCRklOX1NQT1JUX1JGUyhDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTSkpOworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlwZXJpcGhlcmFsX2ZyZWUocGVyKTsKKwlncGlvX3JlcXVlc3QoZ3BpbywgImJmNXh4LWFjOTciKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMSk7CisJdWRlbGF5KDIpOworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIDApOworCXVkZWxheSgxKTsKKwlncGlvX2ZyZWUoZ3Bpbyk7CisJcGVyaXBoZXJhbF9yZXF1ZXN0KHBlciwgInNvYy1hdWRpbyIpOworI2Vsc2UKKwlwcl9pbmZvKCIlczogTm90IGltcGxlbWVudGVkXG4iLCBfX2Z1bmNfXyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYmY1eHhfYWM5N19jb2xkX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKyNpZmRlZiBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAorCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCisJLyogSXQgaXMgc3BlY2lmaWVkIGZvciBiZjU0OC1lemtpdCAqLworCWdwaW9fc2V0X3ZhbHVlKENPTkZJR19TTkRfQkY1WFhfUkVTRVRfR1BJT19OVU0sIDApOworCS8qIEtlZXAgcmVzZXQgcGluIGxvdyBmb3IgMSBtcyAqLworCW1kZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNLCAxKTsKKwkvKiBXYWl0IGZvciBiaXQgY2xvY2sgcmVjb3ZlciAqLworCW1kZWxheSgxKTsKKyNlbHNlCisJcHJfaW5mbygiJXM6IE5vdCBpbXBsZW1lbnRlZFxuIiwgX19mdW5jX18pOworI2VuZGlmCit9CisKK3N0cnVjdCBzbmRfYWM5N19idXNfb3BzIHNvY19hYzk3X29wcyA9IHsKKwkucmVhZAk9IGJmNXh4X2FjOTdfcmVhZCwKKwkud3JpdGUJPSBiZjV4eF9hYzk3X3dyaXRlLAorCS53YXJtX3Jlc2V0CT0gYmY1eHhfYWM5N193YXJtX3Jlc2V0LAorCS5yZXNldAk9IGJmNXh4X2FjOTdfY29sZF9yZXNldCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzb2NfYWM5N19vcHMpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJmNXh4X2FjOTdfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0KKwkJKHN0cnVjdCBzcG9ydF9kZXZpY2UgKilkYWktPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlcyA6IHNwb3J0ICVkXG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJaWYgKCFkYWktPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGRhaS0+Y2FwdHVyZS5hY3RpdmUpCisJCXNwb3J0X3J4X3N0b3Aoc3BvcnQpOworCWlmIChkYWktPnBsYXliYWNrLmFjdGl2ZSkKKwkJc3BvcnRfdHhfc3RvcChzcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfYWM5N19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0KKwkJKHN0cnVjdCBzcG9ydF9kZXZpY2UgKilkYWktPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlcyA6IHNwb3J0ICVkXG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJaWYgKCFkYWktPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBzcG9ydF9zZXRfbXVsdGljaGFubmVsKHNwb3J0X2hhbmRsZSwgMTYsIDB4MUYsIDEpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJTUE9SVCBpcyBidXN5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0ID0gc3BvcnRfY29uZmlnX3J4KHNwb3J0X2hhbmRsZSwgSVJGUywgMHhGLCAwLCAoMTYqMTYtMSkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJTUE9SVCBpcyBidXN5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0ID0gc3BvcnRfY29uZmlnX3R4KHNwb3J0X2hhbmRsZSwgSVRGUywgMHhGLCAwLCAoMTYqMTYtMSkpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJTUE9SVCBpcyBidXN5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5hY3RpdmUpCisJCXNwb3J0X3J4X3N0YXJ0KHNwb3J0KTsKKwlpZiAoZGFpLT5wbGF5YmFjay5hY3RpdmUpCisJCXNwb3J0X3R4X3N0YXJ0KHNwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgYmY1eHhfYWM5N19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgYmY1eHhfYWM5N19yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYmY1eHhfYWM5N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByZXQ7CisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpCisJdTE2IHNwb3J0X3JlcVtdWzddID0ge1BJTl9SRVFfU1BPUlRfMCwgUElOX1JFUV9TUE9SVF8xLAorCQkJCSBQSU5fUkVRX1NQT1JUXzIsIFBJTl9SRVFfU1BPUlRfM307CisjZWxzZQorCXUxNiBzcG9ydF9yZXFbXVs3XSA9IHtQSU5fUkVRX1NQT1JUXzAsIFBJTl9SRVFfU1BPUlRfMX07CisjZW5kaWYKKwljbWRfY291bnQgPSAoaW50ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmIChjbWRfY291bnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoJnNwb3J0X3JlcVtzcG9ydF9udW1dWzBdLCAic29jLWF1ZGlvIikpIHsKKwkJcHJfZXJyKCJSZXF1ZXN0aW5nIFBlcmlwaGVyYWxzIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCQl9CisKKyNpZmRlZiBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVAorCS8qIFJlcXVlc3QgUEIzIGFzIHJlc2V0IHBpbiAqLworCWlmIChncGlvX3JlcXVlc3QoQ09ORklHX1NORF9CRjVYWF9SRVNFVF9HUElPX05VTSwgIlNORF9BRDE5OHggUkVTRVQiKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IEdQSU9fJWQgZm9yIHJlc2V0XG4iLAorCQkJCUNPTkZJR19TTkRfQkY1WFhfUkVTRVRfR1BJT19OVU0pOworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworCQlyZXR1cm4gLTE7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNLCAxKTsKKyNlbmRpZgorCXNwb3J0X2hhbmRsZSA9IHNwb3J0X2luaXQoJnNwb3J0X3BhcmFtc1tzcG9ydF9udW1dLCAyLCBcCisJCQlzaXplb2Yoc3RydWN0IGFjOTdfZnJhbWUpLCBOVUxMKTsKKwlpZiAoIXNwb3J0X2hhbmRsZSkgeworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworI2lmZGVmIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUCisJCWdwaW9fZnJlZShDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLypTUE9SVCB3b3JrcyBpbiBURE0gbW9kZSB0byBzaW11bGF0ZSBBQzk3IHRyYW5zZmVycyovCisJcmV0ID0gc3BvcnRfc2V0X211bHRpY2hhbm5lbChzcG9ydF9oYW5kbGUsIDE2LCAweDFGLCAxKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiU1BPUlQgaXMgYnVzeSFcbiIpOworCQlrZnJlZShzcG9ydF9oYW5kbGUpOworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworI2lmZGVmIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUCisJCWdwaW9fZnJlZShDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldCA9IHNwb3J0X2NvbmZpZ19yeChzcG9ydF9oYW5kbGUsIElSRlMsIDB4RiwgMCwgKDE2KjE2LTEpKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiU1BPUlQgaXMgYnVzeSFcbiIpOworCQlrZnJlZShzcG9ydF9oYW5kbGUpOworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworI2lmZGVmIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUCisJCWdwaW9fZnJlZShDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldCA9IHNwb3J0X2NvbmZpZ190eChzcG9ydF9oYW5kbGUsIElURlMsIDB4RiwgMCwgKDE2KjE2LTEpKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiU1BPUlQgaXMgYnVzeSFcbiIpOworCQlrZnJlZShzcG9ydF9oYW5kbGUpOworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworI2lmZGVmIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUCisJCWdwaW9fZnJlZShDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmY1eHhfYWM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljbWRfY291bnQpOworCWNtZF9jb3VudCA9IE5VTEw7CisjaWZkZWYgQ09ORklHX1NORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQKKwlncGlvX2ZyZWUoQ09ORklHX1NORF9CRjVYWF9SRVNFVF9HUElPX05VTSk7CisjZW5kaWYKK30KKworc3RydWN0IHNuZF9zb2NfZGFpIGJmaW5fYWM5N19kYWkgPSB7CisJLm5hbWUgPSAiYmY1eHgtYWM5NyIsCisJLmlkID0gMCwKKwkudHlwZSA9IFNORF9TT0NfREFJX0FDOTcsCisJLnByb2JlID0gYmY1eHhfYWM5N19wcm9iZSwKKwkucmVtb3ZlID0gYmY1eHhfYWM5N19yZW1vdmUsCisJLnN1c3BlbmQgPSBiZjV4eF9hYzk3X3N1c3BlbmQsCisJLnJlc3VtZSA9IGJmNXh4X2FjOTdfcmVzdW1lLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkFDOTcgUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLCB9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQUM5NyBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwgfSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChiZmluX2FjOTdfZGFpKTsKKworTU9EVUxFX0FVVEhPUigiUm95IEh1YW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDOTcgZHJpdmVyIGZvciBBREkgQmxhY2tmaW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LmggYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9hcm0vYmY1eHgtYWM5Ny5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9CRjVYWF9BQzk3X0gKKyNkZWZpbmUgX0JGNVhYX0FDOTdfSAorCitleHRlcm4gc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgYmY1eHhfYWM5N19vcHM7CitleHRlcm4gc3RydWN0IHNuZF9hYzk3ICphYzk3OworLyogRnJhbWUgZm9ybWF0IGluIG1lbW9yeSwgb25seSBzdXBwb3J0IHN0ZXJlbyBjdXJyZW50bHkgKi8KK3N0cnVjdCBhYzk3X2ZyYW1lIHsKKwl1MTYgYWM5N190YWc7CQkvKiBzbG90IDAgKi8KKwl1MTYgYWM5N19hZGRyOwkJLyogc2xvdCAxICovCisJdTE2IGFjOTdfZGF0YTsJCS8qIHNsb3QgMiAqLworCXUzMiBhYzk3X3BjbTsJCS8qIHNsb3QgMyBhbmQgNDogbGVmdCBhbmQgcmlnaHQgcGNtIGRhdGEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFRBR19WQUxJRAkJMHg4MDAwCisjZGVmaW5lIFRBR19DTUQJCQkweDYwMDAKKyNkZWZpbmUgVEFHX1BDTV9MRUZUCQkweDEwMDAKKyNkZWZpbmUgVEFHX1BDTV9SSUdIVAkJMHgwODAwCisjZGVmaW5lIFRBR19QQ00JCQkoVEFHX1BDTV9MRUZUIHwgVEFHX1BDTV9SSUdIVCkKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSBiZmluX2FjOTdfZGFpOworCit2b2lkIGJmNXh4X3BjbV90b19hYzk3KHN0cnVjdCBhYzk3X2ZyYW1lICpkc3QsIGNvbnN0IF9fdTMyICpzcmMsIFwKKwkJc2l6ZV90IGNvdW50KTsKKwordm9pZCBiZjV4eF9hYzk3X3RvX3BjbShjb25zdCBzdHJ1Y3QgYWM5N19mcmFtZSAqc3JjLCBfX3UzMiAqZHN0LCBcCisJCXNpemVfdCBjb3VudCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTk4MC5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTk4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDQyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxOTgwLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIHNvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE5ODAuYworICogQXV0aG9yOiAgICAgICBDbGlmZiBDYWkgPENsaWZmLkNhaUBhbmFsb2cuY29tPgorICoKKyAqIENyZWF0ZWQ6ICAgICAgVHVlIEp1bmUgMDYgMjAwOAorICogRGVzY3JpcHRpb246ICBCb2FyZCBkcml2ZXIgZm9yIEFEMTk4MC8xIGF1ZGlvIGNvZGVjCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy9hZDE5ODAuaCIKKyNpbmNsdWRlICJiZjV4eC1zcG9ydC5oIgorI2luY2x1ZGUgImJmNXh4LWFjOTctcGNtLmgiCisjaW5jbHVkZSAiYmY1eHgtYWM5Ny5oIgorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfbWFjaGluZSBiZjV4eF9ib2FyZDsKKworc3RhdGljIGludCBiZjV4eF9ib2FyZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCWNwdV9kYWktPnByaXZhdGVfZGF0YSA9IHNwb3J0X2hhbmRsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBiZjV4eF9ib2FyZF9vcHMgPSB7CisJLnN0YXJ0dXAgPSBiZjV4eF9ib2FyZF9zdGFydHVwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJmNXh4X2JvYXJkX2RhaSA9IHsKKwkubmFtZSA9ICJBQzk3IiwKKwkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKKwkuY3B1X2RhaSA9ICZiZmluX2FjOTdfZGFpLAorCS5jb2RlY19kYWkgPSAmYWQxOTgwX2RhaSwKKwkub3BzID0gJmJmNXh4X2JvYXJkX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIGJmNXh4X2JvYXJkID0geworCS5uYW1lID0gImJmNXh4LWJvYXJkIiwKKwkuZGFpX2xpbmsgPSAmYmY1eHhfYm9hcmRfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSBiZjV4eF9ib2FyZF9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZiZjV4eF9ib2FyZCwKKwkucGxhdGZvcm0gPSAmYmY1eHhfYWM5N19zb2NfcGxhdGZvcm0sCisJLmNvZGVjX2RldiA9ICZzb2NfY29kZWNfZGV2X2FkMTk4MCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZjV4eF9ib2FyZF9zbmRfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBiZjV4eF9ib2FyZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWJmNXh4X2JvYXJkX3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKKwlpZiAoIWJmNXh4X2JvYXJkX3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoYmY1eHhfYm9hcmRfc25kX2RldmljZSwgJmJmNXh4X2JvYXJkX3NuZF9kZXZkYXRhKTsKKwliZjV4eF9ib2FyZF9zbmRfZGV2ZGF0YS5kZXYgPSAmYmY1eHhfYm9hcmRfc25kX2RldmljZS0+ZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoYmY1eHhfYm9hcmRfc25kX2RldmljZSk7CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGJmNXh4X2JvYXJkX3NuZF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJmNXh4X2JvYXJkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihiZjV4eF9ib2FyZF9zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoYmY1eHhfYm9hcmRfaW5pdCk7Cittb2R1bGVfZXhpdChiZjV4eF9ib2FyZF9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgQUQxOTgwLzEgQkY1eHggYm9hcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDczMzExLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQ3MzMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmM5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQ3MzMxMS5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogRmlsZTogICAgICAgICBzb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQ3MzMxMS5jCisgKiBBdXRob3I6ICAgICAgIENsaWZmIENhaSA8Q2xpZmYuQ2FpQGFuYWxvZy5jb20+CisgKgorICogQ3JlYXRlZDogICAgICBUaHVyIFNlcCAyNSAyMDA4CisgKiBEZXNjcmlwdGlvbjogIEJvYXJkIGRyaXZlciBmb3IgYWQ3MzMxMSBzb3VuZCBjaGlwCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL2FkNzMzMTEuaCIKKyNpbmNsdWRlICJiZjV4eC1zcG9ydC5oIgorI2luY2x1ZGUgImJmNXh4LWkycy1wY20uaCIKKyNpbmNsdWRlICJiZjV4eC1pMnMuaCIKKworI2lmIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNID09IDAKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVF9UQ1IxCWJmaW5fd3JpdGVfU1BPUlQwX1RDUjEKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUX1RDUjEJYmZpbl9yZWFkX1NQT1JUMF9UQ1IxCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlRfVENSMgliZmluX3dyaXRlX1NQT1JUMF9UQ1IyCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlRfVFgxNgliZmluX3dyaXRlX1NQT1JUMF9UWDE2CisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVF9TVEFUCWJmaW5fcmVhZF9TUE9SVDBfU1RBVAorI2Vsc2UKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVF9UQ1IxCWJmaW5fd3JpdGVfU1BPUlQxX1RDUjEKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUX1RDUjEJYmZpbl9yZWFkX1NQT1JUMV9UQ1IxCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlRfVENSMgliZmluX3dyaXRlX1NQT1JUMV9UQ1IyCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlRfVFgxNgliZmluX3dyaXRlX1NQT1JUMV9UWDE2CisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVF9TVEFUCWJmaW5fcmVhZF9TUE9SVDFfU1RBVAorI2VuZGlmCisKKyNkZWZpbmUgR1BJT19TRSBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMV9TRQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfbWFjaGluZSBiZjV4eF9hZDczMzExOworCitzdGF0aWMgaW50IHNuZF9hZDczMzExX3N0YXJ0dXAodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCS8qIFB1bGwgdXAgU0UgcGluIG9uIEFENzMzMTFMICovCisJZ3Bpb19zZXRfdmFsdWUoR1BJT19TRSwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FkNzMzMTFfY29uZmlndXJlKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgY3RybF9yZWdzWzZdOworCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IDA7CisJaW50IGNvdW50ID0gMDsKKworCS8qIERNQ0xLID0gTUNMSyA9IDE2LjM4NCBNSHoKKwkgKiBTQ0xLID0gRE1DTEsvOCA9IDIuMDQ4IE1IegorCSAqIFNhbXBsZSBSYXRlID0gRE1DTEsvMjA0OCAgPSA4IEtIegorCSAqLworCWN0cmxfcmVnc1swXSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0IgfCBSRUdCX01DRElWKDApIHwgXAorCQkJUkVHQl9TQ0RJVigwKSB8IFJFR0JfRElSQVRFKDApOworCWN0cmxfcmVnc1sxXSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0MgfCBSRUdDX1BVREVWIHwgXAorCQkJUkVHQ19QVUFEQyB8IFJFR0NfUFVEQUMgfCBSRUdDX1BVUkVGIHwgUkVHQ19SRUZVU0UgOworCWN0cmxfcmVnc1syXSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0QgfCBSRUdEX09HUygyKSB8IFwKKwkJCVJFR0RfSUdTKDIpOworCWN0cmxfcmVnc1szXSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0UgfCBSRUdFX0RBKDB4MWYpOworCWN0cmxfcmVnc1s0XSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0YgfCBSRUdGX1NFRU4gOworCWN0cmxfcmVnc1s1XSA9IEFEX0NPTlRST0wgfCBBRF9XUklURSB8IENUUkxfUkVHX0EgfCBSRUdBX01PREVfREFUQTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJc25kX2FkNzMzMTFfc3RhcnR1cCgpOworCXVkZWxheSgxKTsKKworCWJmaW5fd3JpdGVfU1BPUlRfVENSMShURlNSKTsKKwliZmluX3dyaXRlX1NQT1JUX1RDUjIoMHhGKTsKKwlTU1lOQygpOworCisJLyogU1BPUlQgVHggUmVnaXN0ZXIgaXMgYSA4IHggMTYgRklGTywgYWxsIHRoZSBkYXRhIGNhbiBiZSBwdXQgdG8KKwkgKiBGSUZPIGJlZm9yZSBlbmFibGUgU1BPUlQgdG8gdHJhbnNmZXIgdGhlIGRhdGEKKwkgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA2OyBjb3VudCsrKQorCQliZmluX3dyaXRlX1NQT1JUX1RYMTYoY3RybF9yZWdzW2NvdW50XSk7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NQT1JUX1RDUjEoYmZpbl9yZWFkX1NQT1JUX1RDUjEoKSB8IFRTUEVOKTsKKwlTU1lOQygpOworCisJLyogV2hlbiBUVVZGIGlzIHNldCwgdGhlIGRhdGEgaXMgYWxyZWFkeSBzZW5kIG91dCAqLworCXdoaWxlICghKHN0YXR1cyAmIFRVVkYpICYmIGNvdW50KysgPCAxMDAwMCkgeworCQl1ZGVsYXkoMSk7CisJCXN0YXR1cyA9IGJmaW5fcmVhZF9TUE9SVF9TVEFUKCk7CisJCVNTWU5DKCk7CisJfQorCWJmaW5fd3JpdGVfU1BPUlRfVENSMShiZmluX3JlYWRfU1BPUlRfVENSMSgpICYgflRTUEVOKTsKKwlTU1lOQygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWlmIChjb3VudCA9PSAxMDAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFkNzMzMTE6IGZhaWxlZCB0byBjb25maWd1cmUgY29kZWNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmNXh4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVycjsKKwlpZiAoZ3Bpb19yZXF1ZXN0KEdQSU9fU0UsICJBRDczMzExX1NFIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHJvIHJlcXVlc3QgR1BJT18lZFxuIiwgX19mdW5jX18sIEdQSU9fU0UpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1NFLCAwKTsKKworCWVyciA9IHNuZF9hZDczMzExX2NvbmZpZ3VyZSgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJmNXh4X2FkNzMzMTFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwljcHVfZGFpLT5wcml2YXRlX2RhdGEgPSBzcG9ydF9oYW5kbGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfYWQ3MzMxMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzIHJhdGUgJWQgZm9ybWF0ICV4XG4iLCBfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSwKKwkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKworCS8qIHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBjcHVfZGFpLT5kYWlfb3BzLnNldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfRFNQX0EgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBiZjV4eF9hZDczMzExX29wcyA9IHsKKwkuc3RhcnR1cCA9IGJmNXh4X2FkNzMzMTFfc3RhcnR1cCwKKwkuaHdfcGFyYW1zID0gYmY1eHhfYWQ3MzMxMV9od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYmY1eHhfYWQ3MzMxMV9kYWkgPSB7CisJLm5hbWUgPSAiYWQ3MzMxMSIsCisJLnN0cmVhbV9uYW1lID0gIkFENzMzMTEiLAorCS5jcHVfZGFpID0gJmJmNXh4X2kyc19kYWksCisJLmNvZGVjX2RhaSA9ICZhZDczMzExX2RhaSwKKwkub3BzID0gJmJmNXh4X2FkNzMzMTFfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgYmY1eHhfYWQ3MzMxMSA9IHsKKwkubmFtZSA9ICJiZjV4eF9hZDczMzExIiwKKwkucHJvYmUgPSBiZjV4eF9wcm9iZSwKKwkuZGFpX2xpbmsgPSAmYmY1eHhfYWQ3MzMxMV9kYWksCisJLm51bV9saW5rcyA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGJmNXh4X2FkNzMzMTFfc25kX2RldmRhdGEgPSB7CisJLm1hY2hpbmUgPSAmYmY1eHhfYWQ3MzMxMSwKKwkucGxhdGZvcm0gPSAmYmY1eHhfaTJzX3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfYWQ3MzMxMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZjUyeF9hZDczMzExX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IGJmNXh4X2FkNzMzMTFfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwliZjUyeF9hZDczMzExX3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKKwlpZiAoIWJmNTJ4X2FkNzMzMTFfc25kX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShiZjUyeF9hZDczMzExX3NuZF9kZXZpY2UsICZiZjV4eF9hZDczMzExX3NuZF9kZXZkYXRhKTsKKwliZjV4eF9hZDczMzExX3NuZF9kZXZkYXRhLmRldiA9ICZiZjUyeF9hZDczMzExX3NuZF9kZXZpY2UtPmRldjsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGJmNTJ4X2FkNzMzMTFfc25kX2RldmljZSk7CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGJmNTJ4X2FkNzMzMTFfc25kX2RldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmY1eHhfYWQ3MzMxMV9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYmY1MnhfYWQ3MzMxMV9zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoYmY1eHhfYWQ3MzMxMV9pbml0KTsKK21vZHVsZV9leGl0KGJmNXh4X2FkNzMzMTFfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIEFENzMzMTEgQmxhY2tmaW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmY2NmOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKQEAgLTAsMCArMSwyODggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIHNvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKKyAqIEF1dGhvcjogICAgICAgQ2xpZmYgQ2FpIDxDbGlmZi5DYWlAYW5hbG9nLmNvbT4KKyAqCisgKiBDcmVhdGVkOiAgICAgIFR1ZSBKdW5lIDA2IDIwMDgKKyAqIERlc2NyaXB0aW9uOiAgRE1BIGRyaXZlciBmb3IgaTJzIGNvZGVjCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgImJmNXh4LWkycy1wY20uaCIKKyNpbmNsdWRlICJiZjV4eC1pMnMuaCIKKyNpbmNsdWRlICJiZjV4eC1zcG9ydC5oIgorCitzdGF0aWMgdm9pZCBiZjV4eF9kbWFfaXJxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20gPSBkYXRhOworCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGNtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGJmNXh4X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSLAorCS5mb3JtYXRzCQk9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDB4MTAwMDAsCisJLnBlcmlvZHNfbWluCQk9IDEsCisJLnBlcmlvZHNfbWF4CQk9IFBBR0VfU0laRS8zMiwKKwkuYnVmZmVyX2J5dGVzX21heAk9IDB4MjAwMDAsIC8qIDEyOCBrYnl0ZXMgKi8KKwkuZmlmb19zaXplCQk9IDE2LAorfTsKKworc3RhdGljIGludCBiZjV4eF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXNpemVfdCBzaXplID0gYmY1eHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisJc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZjV4eF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZjV4eF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBwZXJpb2RfYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpOworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJc3BvcnRfc2V0X3R4X2NhbGxiYWNrKHNwb3J0LCBiZjV4eF9kbWFfaXJxLCBzdWJzdHJlYW0pOworCQlzcG9ydF9jb25maWdfdHhfZG1hKHNwb3J0LCBydW50aW1lLT5kbWFfYXJlYSwKKwkJCXJ1bnRpbWUtPnBlcmlvZHMsIHBlcmlvZF9ieXRlcyk7CisJfSBlbHNlIHsKKwkJc3BvcnRfc2V0X3J4X2NhbGxiYWNrKHNwb3J0LCBiZjV4eF9kbWFfaXJxLCBzdWJzdHJlYW0pOworCQlzcG9ydF9jb25maWdfcnhfZG1hKHNwb3J0LCBydW50aW1lLT5kbWFfYXJlYSwKKwkJCXJ1bnRpbWUtPnBlcmlvZHMsIHBlcmlvZF9ieXRlcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQlzcG9ydF90eF9zdGFydChzcG9ydCk7CisJCWVsc2UKKwkJCXNwb3J0X3J4X3N0YXJ0KHNwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQkJc3BvcnRfdHhfc3RvcChzcG9ydCk7CisJCWVsc2UKKwkJCXNwb3J0X3J4X3N0b3Aoc3BvcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBiZjV4eF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBkaWZmOworCXNuZF9wY21fdWZyYW1lc190IGZyYW1lczsKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlkaWZmID0gc3BvcnRfY3Vycl9vZmZzZXRfdHgoc3BvcnQpOworCQlmcmFtZXMgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkaWZmKTsKKwl9IGVsc2UgeworCQlkaWZmID0gc3BvcnRfY3Vycl9vZmZzZXRfcngoc3BvcnQpOworCQlmcmFtZXMgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkaWZmKTsKKwl9CisJcmV0dXJuIGZyYW1lczsKK30KKworc3RhdGljIGludCBiZjV4eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmJmNXh4X3BjbV9oYXJkd2FyZSk7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBcCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHNwb3J0X2hhbmRsZSAhPSBOVUxMKQorCQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzcG9ydF9oYW5kbGU7CisJZWxzZSB7CisJCXByX2Vycigic3BvcnRfaGFuZGxlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzaXplX3Qgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwl2bWEtPnZtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcnVudGltZS0+ZG1hX2FyZWE7CisJdm1hLT52bV9lbmQgPSB2bWEtPnZtX3N0YXJ0ICsgc2l6ZTsKKwl2bWEtPnZtX2ZsYWdzIHw9ICBWTV9TSEFSRUQ7CisKKwlyZXR1cm4gMCA7Cit9CisKK3N0cnVjdCBzbmRfcGNtX29wcyBiZjV4eF9wY21faTJzX29wcyA9IHsKKwkub3BlbgkJPSBiZjV4eF9wY21fb3BlbiwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IGJmNXh4X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBiZjV4eF9wY21faHdfZnJlZSwKKwkucHJlcGFyZQk9IGJmNXh4X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gYmY1eHhfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBiZjV4eF9wY21fcG9pbnRlciwKKwkubW1hcAkJPSBiZjV4eF9wY21fbW1hcCwKK307CisKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBiZjV4eF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKworCWJ1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJYnVmLT5kZXYuZGV2ID0gcGNtLT5jYXJkLT5kZXY7CisJYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWJ1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChwY20tPmNhcmQtPmRldiwgc2l6ZSwKKwkJCSZidWYtPmFkZHIsIEdGUF9LRVJORUwpOworCWlmICghYnVmLT5hcmVhKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBtZW1vcnkgXAorCQkJUGxlYXNlIGluY3JlYXNlIHVuY2FjaGVkIERNQSBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1Zi0+Ynl0ZXMgPSBzaXplOworCisJcHJfZGVidWcoIiVzLCBhcmVhOiVwLCBzaXplOjB4JTA4bHhcbiIsIF9fZnVuY19fLAorCQlidWYtPmFyZWEsIGJ1Zi0+Ynl0ZXMpOworCisJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlzcG9ydF9oYW5kbGUtPnR4X2J1ZiA9IGJ1Zi0+YXJlYTsKKwllbHNlCisJCXNwb3J0X2hhbmRsZS0+cnhfYnVmID0gYnVmLT5hcmVhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJmNXh4X3BjbV9mcmVlX2RtYV9idWZmZXJzKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWY7CisJaW50IHN0cmVhbTsKKworCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKKwkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCQlpZiAoIXN1YnN0cmVhbSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJCWlmICghYnVmLT5hcmVhKQorCQkJY29udGludWU7CisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIGJ1Zi0+Ynl0ZXMsIGJ1Zi0+YXJlYSwgMCk7CisJCWJ1Zi0+YXJlYSA9IE5VTEw7CisJfQorCWlmIChzcG9ydF9oYW5kbGUpCisJCXNwb3J0X2RvbmUoc3BvcnRfaGFuZGxlKTsKK30KKworc3RhdGljIHU2NCBiZjV4eF9wY21fZG1hbWFzayA9IERNQV8zMkJJVF9NQVNLOworCitpbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQorCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJmJmNXh4X3BjbV9kbWFtYXNrOworCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOworCisJaWYgKGRhaS0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJCXJldCA9IGJmNXh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gYmY1eHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gYmY1eHhfaTJzX3NvY19wbGF0Zm9ybSA9IHsKKwkubmFtZQkJPSAiYmY1eHgtYXVkaW8iLAorCS5wY21fb3BzIAk9ICZiZjV4eF9wY21faTJzX29wcywKKwkucGNtX25ldwk9IGJmNXh4X3BjbV9pMnNfbmV3LAorCS5wY21fZnJlZQk9IGJmNXh4X3BjbV9mcmVlX2RtYV9idWZmZXJzLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJmNXh4X2kyc19zb2NfcGxhdGZvcm0pOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURJIEJsYWNrZmluIEkyUyBQQ00gRE1BIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uaCBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0NjA5YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2FybS9iZjV4eC1pMnMtcGNtLmggLS0gQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgQmxhY2tmaW4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0JGNVhYX0kyU19QQ01fSAorI2RlZmluZSBfQkY1WFhfSTJTX1BDTV9ICisKK3N0cnVjdCBiZjV4eF9wY21fZG1hX3BhcmFtcyB7CisJY2hhciAqbmFtZTsJCQkvKiBzdHJlYW0gaWRlbnRpZmllciAqLworfTsKKworc3RydWN0IGJmNXh4X2dwaW8geworCXUzMiBzeXM7CisJdTMyIHJ4OworCXUzMiB0eDsKKwl1MzIgY2xrOworCXUzMiBmcm07Cit9OworCisvKiBwbGF0Zm9ybSBkYXRhICovCitleHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gYmY1eHhfaTJzX3NvY19wbGF0Zm9ybTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy5jCisgKiBBdXRob3I6ICAgICAgIENsaWZmIENhaSA8Q2xpZmYuQ2FpQGFuYWxvZy5jb20+CisgKgorICogQ3JlYXRlZDogICAgICBUdWUgSnVuZSAwNiAyMDA4CisgKiBEZXNjcmlwdGlvbjogIEJsYWNrZmluIEkyUyBDUFUgREFJIGRyaXZlcgorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICJiZjV4eC1zcG9ydC5oIgorI2luY2x1ZGUgImJmNXh4LWkycy5oIgorCitzdHJ1Y3QgYmY1eHhfaTJzX3BvcnQgeworCXUxNiB0Y3IxOworCXUxNiByY3IxOworCXUxNiB0Y3IyOworCXUxNiByY3IyOworCWludCBjb3VudGVyOworfTsKKworc3RhdGljIHN0cnVjdCBiZjV4eF9pMnNfcG9ydCBiZjV4eF9pMnM7CitzdGF0aWMgaW50IHNwb3J0X251bSA9IENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNOworCitzdGF0aWMgc3RydWN0IHNwb3J0X3BhcmFtIHNwb3J0X3BhcmFtc1syXSA9IHsKKwl7CisJCS5kbWFfcnhfY2hhbgk9IENIX1NQT1JUMF9SWCwKKwkJLmRtYV90eF9jaGFuCT0gQ0hfU1BPUlQwX1RYLAorCQkuZXJyX2lycQk9IElSUV9TUE9SVDBfRVJST1IsCisJCS5yZWdzCQk9IChzdHJ1Y3Qgc3BvcnRfcmVnaXN0ZXIgKilTUE9SVDBfVENSMSwKKwl9LAorCXsKKwkJLmRtYV9yeF9jaGFuCT0gQ0hfU1BPUlQxX1JYLAorCQkuZG1hX3R4X2NoYW4JPSBDSF9TUE9SVDFfVFgsCisJCS5lcnJfaXJxCT0gSVJRX1NQT1JUMV9FUlJPUiwKKwkJLnJlZ3MJCT0gKHN0cnVjdCBzcG9ydF9yZWdpc3RlciAqKVNQT1JUMV9UQ1IxLAorCX0KK307CisKK3N0YXRpYyB1MTYgc3BvcnRfcmVxW11bN10gPSB7CisJCXsgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCisJCSAgUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwfSwKKwkJeyBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKKwkJICBQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDB9LAorfTsKKworc3RhdGljIGludCBiZjV4eF9pMnNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCWludCByZXQgPSAwOworCisJLyogaW50ZXJmYWNlIGZvcm1hdDpzdXBwb3J0IEkyUyxzbGF2ZSBtb2RlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQliZjV4eF9pMnMudGNyMSB8PSBURlNSIHwgVENLRkU7CisJCWJmNXh4X2kycy5yY3IxIHw9IFJGU1IgfCBSQ0tGRTsKKwkJYmY1eHhfaTJzLnRjcjIgfD0gVFNGU0U7CisJCWJmNXh4X2kycy5yY3IyIHw9IFJTRlNFOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQliZjV4eF9pMnMudGNyMSB8PSBURlNSOworCQliZjV4eF9pMnMucmNyMSB8PSBSRlNSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiZjV4eF9pMnNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCS8qdGhpcyBjb3VudGVyIGlzIHVzZWQgZm9yIGNvdW50aW5nIGhvdyBtYW55IHBjbSBzdHJlYW1zIGFyZSBvcGVuZWQqLworCWJmNXh4X2kycy5jb3VudGVyKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfaTJzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWJmNXh4X2kycy50Y3IyICY9IH4weDFmOworCWJmNXh4X2kycy5yY3IyICY9IH4weDFmOworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYmY1eHhfaTJzLnRjcjIgfD0gMTU7CisJCWJmNXh4X2kycy5yY3IyIHw9IDE1OworCQlzcG9ydF9oYW5kbGUtPndkc2l6ZSA9IDI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWJmNXh4X2kycy50Y3IyIHw9IDIzOworCQliZjV4eF9pMnMucmNyMiB8PSAyMzsKKwkJc3BvcnRfaGFuZGxlLT53ZHNpemUgPSAzOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQliZjV4eF9pMnMudGNyMiB8PSAzMTsKKwkJYmY1eHhfaTJzLnJjcjIgfD0gMzE7CisJCXNwb3J0X2hhbmRsZS0+d2RzaXplID0gNDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGJmNXh4X2kycy5jb3VudGVyID09IDEpIHsKKwkJLyoKKwkJICogVFggYW5kIFJYIGFyZSBub3QgaW5kZXBlbmRlbnQsdGhleSBhcmUgZW5hYmxlZCBhdCB0aGUKKwkJICogc2FtZSB0aW1lLCBldmVuIGlmIG9ubHkgb25lIHNpZGUgaXMgcnVubmluZy4gU28sIHdlCisJCSAqIG5lZWQgdG8gY29uZmlndXJlIGJvdGggb2YgdGhlbSBhdCB0aGUgdGltZSB3aGVuIHRoZSBmaXJzdAorCQkgKiBzdHJlYW0gaXMgb3BlbmVkLgorCQkgKgorCQkgKiBDUFUgREFJOnNsYXZlIG1vZGUuCisJCSAqLworCQlyZXQgPSBzcG9ydF9jb25maWdfcngoc3BvcnRfaGFuZGxlLCBiZjV4eF9pMnMucmNyMSwKKwkJCQkgICAgICBiZjV4eF9pMnMucmNyMiwgMCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiU1BPUlQgaXMgYnVzeSFcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXJldCA9IHNwb3J0X2NvbmZpZ190eChzcG9ydF9oYW5kbGUsIGJmNXh4X2kycy50Y3IxLAorCQkJCSAgICAgIGJmNXh4X2kycy50Y3IyLCAwLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJTUE9SVCBpcyBidXN5IVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJmNXh4X2kyc19zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwliZjV4eF9pMnMuY291bnRlci0tOworfQorCitzdGF0aWMgaW50IGJmNXh4X2kyc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KCZzcG9ydF9yZXFbc3BvcnRfbnVtXVswXSwgInNvYy1hdWRpbyIpKSB7CisJCXByX2VycigiUmVxdWVzdGluZyBQZXJpcGhlcmFscyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiByZXF1ZXN0IERNQSBmb3IgU1BPUlQgKi8KKwlzcG9ydF9oYW5kbGUgPSBzcG9ydF9pbml0KCZzcG9ydF9wYXJhbXNbc3BvcnRfbnVtXSwgNCwgXAorCQkJMiAqIHNpemVvZih1MzIpLCBOVUxMKTsKKwlpZiAoIXNwb3J0X2hhbmRsZSkgeworCQlwZXJpcGhlcmFsX2ZyZWVfbGlzdCgmc3BvcnRfcmVxW3Nwb3J0X251bV1bMF0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmY1eHhfaTJzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJcGVyaXBoZXJhbF9mcmVlX2xpc3QoJnNwb3J0X3JlcVtzcG9ydF9udW1dWzBdKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBiZjV4eF9pMnNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0KKwkJKHN0cnVjdCBzcG9ydF9kZXZpY2UgKilkYWktPnByaXZhdGVfZGF0YTsKKworCXByX2RlYnVnKCIlcyA6IHNwb3J0ICVkXG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7CisJaWYgKCFkYWktPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGRhaS0+Y2FwdHVyZS5hY3RpdmUpCisJCXNwb3J0X3J4X3N0b3Aoc3BvcnQpOworCWlmIChkYWktPnBsYXliYWNrLmFjdGl2ZSkKKwkJc3BvcnRfdHhfc3RvcChzcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmY1eHhfaTJzX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCByZXQ7CisJc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQgPQorCQkoc3RydWN0IHNwb3J0X2RldmljZSAqKWRhaS0+cHJpdmF0ZV9kYXRhOworCisJcHJfZGVidWcoIiVzIDogc3BvcnQgJWRcbiIsIF9fZnVuY19fLCBkYWktPmlkKTsKKwlpZiAoIWRhaS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNwb3J0X2NvbmZpZ19yeChzcG9ydF9oYW5kbGUsIFJGU1IgfCBSQ0tGRSwgUlNGU0V8MHgxZiwgMCwgMCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIlNQT1JUIGlzIGJ1c3khXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSBzcG9ydF9jb25maWdfdHgoc3BvcnRfaGFuZGxlLCBURlNSIHwgVENLRkUsIFRTRlNFfDB4MWYsIDAsIDApOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJTUE9SVCBpcyBidXN5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5hY3RpdmUpCisJCXNwb3J0X3J4X3N0YXJ0KHNwb3J0KTsKKwlpZiAoZGFpLT5wbGF5YmFjay5hY3RpdmUpCisJCXNwb3J0X3R4X3N0YXJ0KHNwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgYmY1eHhfaTJzX3N1c3BlbmQJTlVMTAorI2RlZmluZSBiZjV4eF9pMnNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisjZGVmaW5lIEJGNVhYX0kyU19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfCBcCisJCVNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBcCisJCVNORFJWX1BDTV9SQVRFXzk2MDAwKQorCisjZGVmaW5lIEJGNVhYX0kyU19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKK3N0cnVjdCBzbmRfc29jX2RhaSBiZjV4eF9pMnNfZGFpID0geworCS5uYW1lID0gImJmNXh4LWkycyIsCisJLmlkID0gMCwKKwkudHlwZSA9IFNORF9TT0NfREFJX0kyUywKKwkucHJvYmUgPSBiZjV4eF9pMnNfcHJvYmUsCisJLnJlbW92ZSA9IGJmNXh4X2kyc19yZW1vdmUsCisJLnN1c3BlbmQgPSBiZjV4eF9pMnNfc3VzcGVuZCwKKwkucmVzdW1lID0gYmY1eHhfaTJzX3Jlc3VtZSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gQkY1WFhfSTJTX1JBVEVTLAorCQkuZm9ybWF0cyA9IEJGNVhYX0kyU19GT1JNQVRTLH0sCisJLmNhcHR1cmUgPSB7CisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gQkY1WFhfSTJTX1JBVEVTLAorCQkuZm9ybWF0cyA9IEJGNVhYX0kyU19GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLnN0YXJ0dXAgICA9IGJmNXh4X2kyc19zdGFydHVwLAorCQkuc2h1dGRvd24gID0gYmY1eHhfaTJzX3NodXRkb3duLAorCQkuaHdfcGFyYW1zID0gYmY1eHhfaTJzX2h3X3BhcmFtcyx9LAorCS5kYWlfb3BzID0geworCQkuc2V0X2ZtdCA9IGJmNXh4X2kyc19zZXRfZGFpX2ZtdCwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJmNXh4X2kyc19kYWkpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMlMgZHJpdmVyIGZvciBBREkgQmxhY2tmaW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy5oIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDdkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2FybS9iZjV4eC1pMnMuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQkY1WFhfSTJTX0gKKyNkZWZpbmUgX0JGNVhYX0kyU19ICisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWkgYmY1eHhfaTJzX2RhaTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTllNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYwpAQCAtMCwwICsxLDEwMzIgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGJmNXh4X3Nwb3J0LmMKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOiAgICAgICBSb3kgSHVhbmcgPHJveS5odWFuZ0BhbmFsb2cuY29tPgorICoKKyAqIENyZWF0ZWQ6ICAgICAgVHVlIFNlcCAyMSAxMDo1Mjo0MiBDRVNUIDIwMDQKKyAqIERlc2NyaXB0aW9uOgorICogICAgICAgICAgICAgICBCbGFja2ZpbiBTUE9SVCBEcml2ZXIKKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAiYmY1eHgtc3BvcnQuaCIKKy8qIGRlbGF5IGJldHdlZW4gZnJhbWUgc3luYyBwdWxzZSBhbmQgZmlyc3QgZGF0YSBiaXQgaW4gbXVsdGljaGFubmVsIG1vZGUgKi8KKyNkZWZpbmUgRlJBTUVfREVMQVkgKDE8PDEyKQorCitzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydF9oYW5kbGU7CitFWFBPUlRfU1lNQk9MKHNwb3J0X2hhbmRsZSk7CisvKiBub3RlOiBtdWx0aWNoYW5uZWwgaXMgaW4gdW5pdHMgb2YgOCBjaGFubmVscywKKyAqIHRkbV9jb3VudCBpcyAjIGNoYW5uZWxzIE5PVCAvIDggISAqLworaW50IHNwb3J0X3NldF9tdWx0aWNoYW5uZWwoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsCisJCWludCB0ZG1fY291bnQsIHUzMiBtYXNrLCBpbnQgcGFja2VkKQoreworCXByX2RlYnVnKCIlcyB0ZG1fY291bnQ9JWQgbWFzazoweCUwOHggcGFja2VkPSVkXG4iLCBfX2Z1bmNfXywKKwkJCXRkbV9jb3VudCwgbWFzaywgcGFja2VkKTsKKworCWlmICgoc3BvcnQtPnJlZ3MtPnRjcjEgJiBUU1BFTikgfHwgKHNwb3J0LT5yZWdzLT5yY3IxICYgUlNQRU4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHRkbV9jb3VudCAmIDB4NykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGRtX2NvdW50ID4gMzIpCisJCXJldHVybiAtRUlOVkFMOyAvKiBPbmx5IHN1cHBvcnQgbGVzcyB0aGFuIDMyIGNoYW5uZWxzIG5vdyAqLworCisJaWYgKHRkbV9jb3VudCkgeworCQlzcG9ydC0+cmVncy0+bWNtYzEgPSAoKHRkbV9jb3VudD4+MyktMSkgPDwgMTI7CisJCXNwb3J0LT5yZWdzLT5tY21jMiA9IEZSQU1FX0RFTEFZIHwgTUNNRU4gfCBcCisJCQkJKHBhY2tlZCA/IChNQ0RUWFBFfE1DRFJYUEUpIDogMCk7CisKKwkJc3BvcnQtPnJlZ3MtPm10Y3MwID0gbWFzazsKKwkJc3BvcnQtPnJlZ3MtPm1yY3MwID0gbWFzazsKKwkJc3BvcnQtPnJlZ3MtPm10Y3MxID0gMDsKKwkJc3BvcnQtPnJlZ3MtPm1yY3MxID0gMDsKKwkJc3BvcnQtPnJlZ3MtPm10Y3MyID0gMDsKKwkJc3BvcnQtPnJlZ3MtPm1yY3MyID0gMDsKKwkJc3BvcnQtPnJlZ3MtPm10Y3MzID0gMDsKKwkJc3BvcnQtPnJlZ3MtPm1yY3MzID0gMDsKKwl9IGVsc2UgeworCQlzcG9ydC0+cmVncy0+bWNtYzEgPSAwOworCQlzcG9ydC0+cmVncy0+bWNtYzIgPSAwOworCisJCXNwb3J0LT5yZWdzLT5tdGNzMCA9IDA7CisJCXNwb3J0LT5yZWdzLT5tcmNzMCA9IDA7CisJfQorCisJc3BvcnQtPnJlZ3MtPm10Y3MxID0gMDsgc3BvcnQtPnJlZ3MtPm10Y3MyID0gMDsgc3BvcnQtPnJlZ3MtPm10Y3MzID0gMDsKKwlzcG9ydC0+cmVncy0+bXJjczEgPSAwOyBzcG9ydC0+cmVncy0+bXJjczIgPSAwOyBzcG9ydC0+cmVncy0+bXJjczMgPSAwOworCisJU1NZTkMoKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzcG9ydF9zZXRfbXVsdGljaGFubmVsKTsKKworaW50IHNwb3J0X2NvbmZpZ19yeChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgdW5zaWduZWQgaW50IHJjcjEsCisJCXVuc2lnbmVkIGludCByY3IyLCB1bnNpZ25lZCBpbnQgY2xrZGl2LCB1bnNpZ25lZCBpbnQgZnNkaXYpCit7CisJaWYgKChzcG9ydC0+cmVncy0+dGNyMSAmIFRTUEVOKSB8fCAoc3BvcnQtPnJlZ3MtPnJjcjEgJiBSU1BFTikpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcG9ydC0+cmVncy0+cmNyMSA9IHJjcjE7CisJc3BvcnQtPnJlZ3MtPnJjcjIgPSByY3IyOworCXNwb3J0LT5yZWdzLT5yY2xrZGl2ID0gY2xrZGl2OworCXNwb3J0LT5yZWdzLT5yZnNkaXYgPSBmc2RpdjsKKworCVNTWU5DKCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfY29uZmlnX3J4KTsKKworaW50IHNwb3J0X2NvbmZpZ190eChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgdW5zaWduZWQgaW50IHRjcjEsCisJCXVuc2lnbmVkIGludCB0Y3IyLCB1bnNpZ25lZCBpbnQgY2xrZGl2LCB1bnNpZ25lZCBpbnQgZnNkaXYpCit7CisJaWYgKChzcG9ydC0+cmVncy0+dGNyMSAmIFRTUEVOKSB8fCAoc3BvcnQtPnJlZ3MtPnJjcjEgJiBSU1BFTikpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcG9ydC0+cmVncy0+dGNyMSA9IHRjcjE7CisJc3BvcnQtPnJlZ3MtPnRjcjIgPSB0Y3IyOworCXNwb3J0LT5yZWdzLT50Y2xrZGl2ID0gY2xrZGl2OworCXNwb3J0LT5yZWdzLT50ZnNkaXYgPSBmc2RpdjsKKworCVNTWU5DKCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfY29uZmlnX3R4KTsKKworc3RhdGljIHZvaWQgc2V0dXBfZGVzYyhzdHJ1Y3QgZG1hc2cgKmRlc2MsIHZvaWQgKmJ1ZiwgaW50IGZyYWdjb3VudCwKKwkJc2l6ZV90IGZyYWdzaXplLCB1bnNpZ25lZCBpbnQgY2ZnLAorCQl1bnNpZ25lZCBpbnQgeF9jb3VudCwgdW5zaWduZWQgaW50IHljb3VudCwgc2l6ZV90IHdkc2l6ZSkKK3sKKworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZyYWdjb3VudDsgKytpKSB7CisJCWRlc2NbaV0ubmV4dF9kZXNjX2FkZHIgID0gKHVuc2lnbmVkIGxvbmcpJihkZXNjW2kgKyAxXSk7CisJCWRlc2NbaV0uc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWJ1ZiArIGkqZnJhZ3NpemU7CisJCWRlc2NbaV0uY2ZnID0gY2ZnOworCQlkZXNjW2ldLnhfY291bnQgPSB4X2NvdW50OworCQlkZXNjW2ldLnhfbW9kaWZ5ID0gd2RzaXplOworCQlkZXNjW2ldLnlfY291bnQgPSB5Y291bnQ7CisJCWRlc2NbaV0ueV9tb2RpZnkgPSB3ZHNpemU7CisJfQorCisJLyogbWFrZSBjaXJjdWxhciAqLworCWRlc2NbZnJhZ2NvdW50LTFdLm5leHRfZGVzY19hZGRyID0gKHVuc2lnbmVkIGxvbmcpZGVzYzsKKworCXByX2RlYnVnKCJzZXR1cCBkZXNjOiBkZXNjMD0lcCwgbmV4dDA9JWx4LCBkZXNjMT0lcCwiCisJCSJuZXh0MT0lbHhcbnhfY291bnQ9JXgseV9jb3VudD0leCxhZGRyPTB4JWx4LGNmcz0weCV4XG4iLAorCQkmKGRlc2NbMF0pLCBkZXNjWzBdLm5leHRfZGVzY19hZGRyLAorCQkmKGRlc2NbMV0pLCBkZXNjWzFdLm5leHRfZGVzY19hZGRyLAorCQlkZXNjWzBdLnhfY291bnQsIGRlc2NbMF0ueV9jb3VudCwKKwkJZGVzY1swXS5zdGFydF9hZGRyLCBkZXNjWzBdLmNmZyk7Cit9CisKK3N0YXRpYyBpbnQgc3BvcnRfc3RhcnQoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJZW5hYmxlX2RtYShzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWVuYWJsZV9kbWEoc3BvcnQtPmRtYV90eF9jaGFuKTsKKwlzcG9ydC0+cmVncy0+cmNyMSB8PSBSU1BFTjsKKwlzcG9ydC0+cmVncy0+dGNyMSB8PSBUU1BFTjsKKwlTU1lOQygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BvcnRfc3RvcChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCkKK3sKKwlzcG9ydC0+cmVncy0+dGNyMSAmPSB+VFNQRU47CisJc3BvcnQtPnJlZ3MtPnJjcjEgJj0gflJTUEVOOworCVNTWU5DKCk7CisKKwlkaXNhYmxlX2RtYShzcG9ydC0+ZG1hX3J4X2NoYW4pOworCWRpc2FibGVfZG1hKHNwb3J0LT5kbWFfdHhfY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwb3J0X2hvb2tfcnhfZHVtbXkoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJc3RydWN0IGRtYXNnICpkZXNjLCB0ZW1wX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUJVR19PTihzcG9ydC0+ZHVtbXlfcnhfZGVzYyA9PSBOVUxMKTsKKwlCVUdfT04oc3BvcnQtPmN1cnJfcnhfZGVzYyA9PSBzcG9ydC0+ZHVtbXlfcnhfZGVzYyk7CisKKwkvKiBNYXliZSB0aGUgZHVtbXkgYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBpcyBkYW1hZ2VkICovCisJc3BvcnQtPmR1bW15X3J4X2Rlc2MtPm5leHRfZGVzY19hZGRyID0gXAorCQkJKHVuc2lnbmVkIGxvbmcpKHNwb3J0LT5kdW1teV9yeF9kZXNjKzEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWRlc2MgPSAoc3RydWN0IGRtYXNnICopZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHNwb3J0LT5kbWFfcnhfY2hhbik7CisJLyogQ29weSB0aGUgZGVzY3JpcHRvciB3aGljaCB3aWxsIGJlIGRhbWFnZWQgdG8gYmFja3VwICovCisJdGVtcF9kZXNjID0gKmRlc2M7CisJZGVzYy0+eF9jb3VudCA9IDB4YTsKKwlkZXNjLT55X2NvdW50ID0gMDsKKwlkZXNjLT5uZXh0X2Rlc2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKShzcG9ydC0+ZHVtbXlfcnhfZGVzYyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIFdhaXRpbmcgZm9yIGR1bW15IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGFscmVhZHkgaG9va2VkKi8KKwl3aGlsZSAoKGdldF9kbWFfY3Vycl9kZXNjX3B0cihzcG9ydC0+ZG1hX3J4X2NoYW4pIC0KKwkJCXNpemVvZihzdHJ1Y3QgZG1hc2cpKSAhPQorCQkJKHVuc2lnbmVkIGxvbmcpc3BvcnQtPmR1bW15X3J4X2Rlc2MpCisJCTsKKwlzcG9ydC0+Y3Vycl9yeF9kZXNjID0gc3BvcnQtPmR1bW15X3J4X2Rlc2M7CisJLyogUmVzdG9yZSB0aGUgZGFtYWdlZCBkZXNjcmlwdG9yICovCisJKmRlc2MgPSB0ZW1wX2Rlc2M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3BvcnRfcnhfZG1hX3N0YXJ0KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCBpbnQgZHVtbXkpCit7CisJaWYgKGR1bW15KSB7CisJCXNwb3J0LT5kdW1teV9yeF9kZXNjLT5uZXh0X2Rlc2NfYWRkciA9IFwKKwkJCQkodW5zaWduZWQgbG9uZykgc3BvcnQtPmR1bW15X3J4X2Rlc2M7CisJCXNwb3J0LT5jdXJyX3J4X2Rlc2MgPSBzcG9ydC0+ZHVtbXlfcnhfZGVzYzsKKwl9IGVsc2UKKwkJc3BvcnQtPmN1cnJfcnhfZGVzYyA9IHNwb3J0LT5kbWFfcnhfZGVzYzsKKworCXNldF9kbWFfbmV4dF9kZXNjX2FkZHIoc3BvcnQtPmRtYV9yeF9jaGFuLCBcCisJCQkodW5zaWduZWQgbG9uZykoc3BvcnQtPmN1cnJfcnhfZGVzYykpOworCXNldF9kbWFfeF9jb3VudChzcG9ydC0+ZG1hX3J4X2NoYW4sIDApOworCXNldF9kbWFfeF9tb2RpZnkoc3BvcnQtPmRtYV9yeF9jaGFuLCAwKTsKKwlzZXRfZG1hX2NvbmZpZyhzcG9ydC0+ZG1hX3J4X2NoYW4sIChETUFGTE9XX0xBUkdFIHwgTkRTSVpFXzkgfCBcCisJCQkJV0RTSVpFXzMyIHwgV05SKSk7CisJc2V0X2RtYV9jdXJyX2FkZHIoc3BvcnQtPmRtYV9yeF9jaGFuLCBzcG9ydC0+Y3Vycl9yeF9kZXNjLT5zdGFydF9hZGRyKTsKKwlTU1lOQygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwb3J0X3R4X2RtYV9zdGFydChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgaW50IGR1bW15KQoreworCWlmIChkdW1teSkgeworCQlzcG9ydC0+ZHVtbXlfdHhfZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBcCisJCQkJKHVuc2lnbmVkIGxvbmcpIHNwb3J0LT5kdW1teV90eF9kZXNjOworCQlzcG9ydC0+Y3Vycl90eF9kZXNjID0gc3BvcnQtPmR1bW15X3R4X2Rlc2M7CisJfSBlbHNlCisJCXNwb3J0LT5jdXJyX3R4X2Rlc2MgPSBzcG9ydC0+ZG1hX3R4X2Rlc2M7CisKKwlzZXRfZG1hX25leHRfZGVzY19hZGRyKHNwb3J0LT5kbWFfdHhfY2hhbiwgXAorCQkJKHVuc2lnbmVkIGxvbmcpKHNwb3J0LT5jdXJyX3R4X2Rlc2MpKTsKKwlzZXRfZG1hX3hfY291bnQoc3BvcnQtPmRtYV90eF9jaGFuLCAwKTsKKwlzZXRfZG1hX3hfbW9kaWZ5KHNwb3J0LT5kbWFfdHhfY2hhbiwgMCk7CisJc2V0X2RtYV9jb25maWcoc3BvcnQtPmRtYV90eF9jaGFuLAorCQkJKERNQUZMT1dfTEFSR0UgfCBORFNJWkVfOSB8IFdEU0laRV8zMikpOworCXNldF9kbWFfY3Vycl9hZGRyKHNwb3J0LT5kbWFfdHhfY2hhbiwgc3BvcnQtPmN1cnJfdHhfZGVzYy0+c3RhcnRfYWRkcik7CisJU1NZTkMoKTsKKworCXJldHVybiAwOworfQorCitpbnQgc3BvcnRfcnhfc3RhcnQoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoc3BvcnQtPnJ4X3J1bikKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoc3BvcnQtPnR4X3J1bikgeworCQkvKiB0eCBpcyBydW5uaW5nLCByeCBpcyBub3QgcnVubmluZyAqLworCQlCVUdfT04oc3BvcnQtPmRtYV9yeF9kZXNjID09IE5VTEwpOworCQlCVUdfT04oc3BvcnQtPmN1cnJfcnhfZGVzYyAhPSBzcG9ydC0+ZHVtbXlfcnhfZGVzYyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJd2hpbGUgKChnZXRfZG1hX2N1cnJfZGVzY19wdHIoc3BvcnQtPmRtYV9yeF9jaGFuKSAtCisJCQlzaXplb2Yoc3RydWN0IGRtYXNnKSkgIT0KKwkJCSh1bnNpZ25lZCBsb25nKXNwb3J0LT5kdW1teV9yeF9kZXNjKQorCQkJOworCQlzcG9ydC0+ZHVtbXlfcnhfZGVzYy0+bmV4dF9kZXNjX2FkZHIgPQorCQkJCSh1bnNpZ25lZCBsb25nKShzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwb3J0LT5jdXJyX3J4X2Rlc2MgPSBzcG9ydC0+ZG1hX3J4X2Rlc2M7CisJfSBlbHNlIHsKKwkJc3BvcnRfdHhfZG1hX3N0YXJ0KHNwb3J0LCAxKTsKKwkJc3BvcnRfcnhfZG1hX3N0YXJ0KHNwb3J0LCAwKTsKKwkJc3BvcnRfc3RhcnQoc3BvcnQpOworCX0KKworCXNwb3J0LT5yeF9ydW4gPSAxOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNwb3J0X3J4X3N0YXJ0KTsKKworaW50IHNwb3J0X3J4X3N0b3Aoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXNwb3J0LT5yeF9ydW4pCisJCXJldHVybiAwOworCWlmIChzcG9ydC0+dHhfcnVuKSB7CisJCS8qIFRYIGRtYSBpcyBzdGlsbCBydW5uaW5nLCBob29rIHRoZSBkdW1teSBidWZmZXIgKi8KKwkJc3BvcnRfaG9va19yeF9kdW1teShzcG9ydCk7CisJfSBlbHNlIHsKKwkJLyogQm90aCByeCBhbmQgdHggZG1hIHdpbGwgYmUgc3RvcHBlZCAqLworCQlzcG9ydF9zdG9wKHNwb3J0KTsKKwkJc3BvcnQtPmN1cnJfcnhfZGVzYyA9IE5VTEw7CisJCXNwb3J0LT5jdXJyX3R4X2Rlc2MgPSBOVUxMOworCX0KKworCXNwb3J0LT5yeF9ydW4gPSAwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNwb3J0X3J4X3N0b3ApOworCitzdGF0aWMgaW5saW5lIGludCBzcG9ydF9ob29rX3R4X2R1bW15KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXN0cnVjdCBkbWFzZyAqZGVzYywgdGVtcF9kZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlCVUdfT04oc3BvcnQtPmR1bW15X3R4X2Rlc2MgPT0gTlVMTCk7CisJQlVHX09OKHNwb3J0LT5jdXJyX3R4X2Rlc2MgPT0gc3BvcnQtPmR1bW15X3R4X2Rlc2MpOworCisJc3BvcnQtPmR1bW15X3R4X2Rlc2MtPm5leHRfZGVzY19hZGRyID0gXAorCQkJKHVuc2lnbmVkIGxvbmcpKHNwb3J0LT5kdW1teV90eF9kZXNjKzEpOworCisJLyogU2hvcnRlbiB0aGUgdGltZSBvbiBsYXN0IG5vcm1hbCBkZXNjcmlwdG9yICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWRlc2MgPSAoc3RydWN0IGRtYXNnICopZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHNwb3J0LT5kbWFfdHhfY2hhbik7CisJLyogU3RvcmUgdGhlIGRlc2NyaXB0b3Igd2hpY2ggd2lsbCBiZSBkYW1hZ2VkICovCisJdGVtcF9kZXNjID0gKmRlc2M7CisJZGVzYy0+eF9jb3VudCA9IDB4YTsKKwlkZXNjLT55X2NvdW50ID0gMDsKKwlkZXNjLT5uZXh0X2Rlc2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKShzcG9ydC0+ZHVtbXlfdHhfZGVzYyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIFdhaXRpbmcgZm9yIGR1bW15IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGFscmVhZHkgaG9va2VkKi8KKwl3aGlsZSAoKGdldF9kbWFfY3Vycl9kZXNjX3B0cihzcG9ydC0+ZG1hX3R4X2NoYW4pIC0gXAorCQkJc2l6ZW9mKHN0cnVjdCBkbWFzZykpICE9IFwKKwkJCSh1bnNpZ25lZCBsb25nKXNwb3J0LT5kdW1teV90eF9kZXNjKQorCQk7CisJc3BvcnQtPmN1cnJfdHhfZGVzYyA9IHNwb3J0LT5kdW1teV90eF9kZXNjOworCS8qIFJlc3RvcmUgdGhlIGRhbWFnZWQgZGVzY3JpcHRvciAqLworCSpkZXNjID0gdGVtcF9kZXNjOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzcG9ydF90eF9zdGFydChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCkKK3sKKwl1bnNpZ25lZCBmbGFnczsKKwlwcl9kZWJ1ZygiJXM6IHR4X3J1bjolZCwgcnhfcnVuOiVkXG4iLCBfX2Z1bmNfXywKKwkJCXNwb3J0LT50eF9ydW4sIHNwb3J0LT5yeF9ydW4pOworCWlmIChzcG9ydC0+dHhfcnVuKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChzcG9ydC0+cnhfcnVuKSB7CisJCUJVR19PTihzcG9ydC0+ZG1hX3R4X2Rlc2MgPT0gTlVMTCk7CisJCUJVR19PTihzcG9ydC0+Y3Vycl90eF9kZXNjICE9IHNwb3J0LT5kdW1teV90eF9kZXNjKTsKKwkJLyogSG9vayB0aGUgbm9ybWFsIGJ1ZmZlciBkZXNjcmlwdG9yICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJd2hpbGUgKChnZXRfZG1hX2N1cnJfZGVzY19wdHIoc3BvcnQtPmRtYV90eF9jaGFuKSAtCisJCQlzaXplb2Yoc3RydWN0IGRtYXNnKSkgIT0KKwkJCSh1bnNpZ25lZCBsb25nKXNwb3J0LT5kdW1teV90eF9kZXNjKQorCQkJOworCQlzcG9ydC0+ZHVtbXlfdHhfZGVzYy0+bmV4dF9kZXNjX2FkZHIgPQorCQkJCSh1bnNpZ25lZCBsb25nKShzcG9ydC0+ZG1hX3R4X2Rlc2MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXNwb3J0LT5jdXJyX3R4X2Rlc2MgPSBzcG9ydC0+ZG1hX3R4X2Rlc2M7CisJfSBlbHNlIHsKKworCQlzcG9ydF90eF9kbWFfc3RhcnQoc3BvcnQsIDApOworCQkvKiBMZXQgcnggZG1hIHJ1biB0aGUgZHVtbXkgYnVmZmVyICovCisJCXNwb3J0X3J4X2RtYV9zdGFydChzcG9ydCwgMSk7CisJCXNwb3J0X3N0YXJ0KHNwb3J0KTsKKwl9CisJc3BvcnQtPnR4X3J1biA9IDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNwb3J0X3R4X3N0YXJ0KTsKKworaW50IHNwb3J0X3R4X3N0b3Aoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJaWYgKCFzcG9ydC0+dHhfcnVuKQorCQlyZXR1cm4gMDsKKwlpZiAoc3BvcnQtPnJ4X3J1bikgeworCQkvKiBSWCBpcyBzdGlsbCBydW5uaW5nLCBob29rIHRoZSBkdW1teSBidWZmZXIgKi8KKwkJc3BvcnRfaG9va190eF9kdW1teShzcG9ydCk7CisJfSBlbHNlIHsKKwkJLyogQm90aCByeCBhbmQgdHggZG1hIHN0b3BwZWQgKi8KKwkJc3BvcnRfc3RvcChzcG9ydCk7CisJCXNwb3J0LT5jdXJyX3J4X2Rlc2MgPSBOVUxMOworCQlzcG9ydC0+Y3Vycl90eF9kZXNjID0gTlVMTDsKKwl9CisKKwlzcG9ydC0+dHhfcnVuID0gMDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzcG9ydF90eF9zdG9wKTsKKworc3RhdGljIGlubGluZSBpbnQgY29tcHV0ZV93ZHNpemUoc2l6ZV90IHdkc2l6ZSkKK3sKKwlzd2l0Y2ggKHdkc2l6ZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIFdEU0laRV84OworCWNhc2UgMjoKKwkJcmV0dXJuIFdEU0laRV8xNjsKKwljYXNlIDQ6CisJZGVmYXVsdDoKKwkJcmV0dXJuIFdEU0laRV8zMjsKKwl9Cit9CisKK2ludCBzcG9ydF9jb25maWdfcnhfZG1hKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCB2b2lkICpidWYsCisJCWludCBmcmFnY291bnQsIHNpemVfdCBmcmFnc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgeF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgeV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgY2ZnOworCWRtYV9hZGRyX3QgYWRkcjsKKworCXByX2RlYnVnKCIlcyBidWY6JXAsIGZyYWc6JWQsIGZyYWdzaXplOjB4JWx4XG4iLCBfX2Z1bmNfXywgXAorCQkJYnVmLCBmcmFnY291bnQsIGZyYWdzaXplKTsKKworCXhfY291bnQgPSBmcmFnc2l6ZSAvIHNwb3J0LT53ZHNpemU7CisJeV9jb3VudCA9IDA7CisKKwkvKiBmb3IgZnJhZ21lbnRzIGxhcmdlciB0aGFuIDY0ayB3b3JkcyB3ZSB1c2UgMmQgZG1hLAorCSAqIGRlbm90ZSBmcmFnZWNvdW50IGFzIHR3byBudW1iZXJzJyBtdXRsaXBseSBhbmQgYm90aCBvZiB0aGVtCisJICogYXJlIGxlc3MgdGhhbiA2NGsuKi8KKwlpZiAoeF9jb3VudCA+PSAweDEwMDAwKSB7CisJCWludCBpLCBjb3VudCA9IHhfY291bnQ7CisKKwkJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJCXhfY291bnQgPSAxIDw8IGk7CisJCQlpZiAoKGNvdW50ICYgKHhfY291bnQgLSAxKSkgPT0gMCkgeworCQkJCXlfY291bnQgPSBjb3VudCA+PiBpOworCQkJCWlmICh5X2NvdW50IDwgMHgxMDAwMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9kZWJ1ZygiJXMoeF9jb3VudDoweCV4LCB5X2NvdW50OjB4JXgpXG4iLCBfX2Z1bmNfXywKKwkJCXhfY291bnQsIHlfY291bnQpOworCisJaWYgKHNwb3J0LT5kbWFfcnhfZGVzYykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc3BvcnQtPnJ4X2Rlc2NfYnl0ZXMsCisJCQkJCXNwb3J0LT5kbWFfcnhfZGVzYywgMCk7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcml0b3IgcmluZyBhcyBjdXJyZW50IG9uZS4gKi8KKwlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgXAorCQkJZnJhZ2NvdW50ICogc2l6ZW9mKHN0cnVjdCBkbWFzZyksICZhZGRyLCAwKTsKKwlzcG9ydC0+cnhfZGVzY19ieXRlcyA9IGZyYWdjb3VudCAqIHNpemVvZihzdHJ1Y3QgZG1hc2cpOworCisJaWYgKCFzcG9ydC0+ZG1hX3J4X2Rlc2MpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByeCBkZXNjXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3BvcnQtPnJ4X2J1ZiA9IGJ1ZjsKKwlzcG9ydC0+cnhfZnJhZ3NpemUgPSBmcmFnc2l6ZTsKKwlzcG9ydC0+cnhfZnJhZ3MgPSBmcmFnY291bnQ7CisKKwljZmcgICAgID0gMHg3MDAwIHwgRElfRU4gfCBjb21wdXRlX3dkc2l6ZShzcG9ydC0+d2RzaXplKSB8IFdOUiB8IFwKKwkJICAoREVTQ19FTEVNRU5UX0NPVU5UIDw8IDgpOyAvKiBsYXJnZSBkZXNjcmlwdG9yIG1vZGUgKi8KKworCWlmICh5X2NvdW50ICE9IDApCisJCWNmZyB8PSBETUEyRDsKKworCXNldHVwX2Rlc2Moc3BvcnQtPmRtYV9yeF9kZXNjLCBidWYsIGZyYWdjb3VudCwgZnJhZ3NpemUsCisJCQljZmd8RE1BRU4sIHhfY291bnQsIHlfY291bnQsIHNwb3J0LT53ZHNpemUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNwb3J0X2NvbmZpZ19yeF9kbWEpOworCitpbnQgc3BvcnRfY29uZmlnX3R4X2RtYShzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgdm9pZCAqYnVmLCBcCisJCWludCBmcmFnY291bnQsIHNpemVfdCBmcmFnc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgeF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgeV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgY2ZnOworCWRtYV9hZGRyX3QgYWRkcjsKKworCXByX2RlYnVnKCIlcyBidWY6JXAsIGZyYWdjb3VudDolZCwgZnJhZ3NpemU6MHglbHhcbiIsCisJCQlfX2Z1bmNfXywgYnVmLCBmcmFnY291bnQsIGZyYWdzaXplKTsKKworCXhfY291bnQgPSBmcmFnc2l6ZS9zcG9ydC0+d2RzaXplOworCXlfY291bnQgPSAwOworCisJLyogZm9yIGZyYWdtZW50cyBsYXJnZXIgdGhhbiA2NGsgd29yZHMgd2UgdXNlIDJkIGRtYSwKKwkgKiBkZW5vdGUgZnJhZ2Vjb3VudCBhcyB0d28gbnVtYmVycycgbXV0bGlwbHkgYW5kIGJvdGggb2YgdGhlbQorCSAqIGFyZSBsZXNzIHRoYW4gNjRrLiovCisJaWYgKHhfY291bnQgPj0gMHgxMDAwMCkgeworCQlpbnQgaSwgY291bnQgPSB4X2NvdW50OworCisJCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCQl4X2NvdW50ID0gMSA8PCBpOworCQkJaWYgKChjb3VudCAmICh4X2NvdW50IC0gMSkpID09IDApIHsKKwkJCQl5X2NvdW50ID0gY291bnQgPj4gaTsKKwkJCQlpZiAoeV9jb3VudCA8IDB4MTAwMDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJfZGVidWcoIiVzIHhfY291bnQ6MHgleCwgeV9jb3VudDoweCV4XG4iLCBfX2Z1bmNfXywKKwkJCXhfY291bnQsIHlfY291bnQpOworCisKKwlpZiAoc3BvcnQtPmRtYV90eF9kZXNjKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNwb3J0LT50eF9kZXNjX2J5dGVzLCBcCisJCQkJc3BvcnQtPmRtYV90eF9kZXNjLCAwKTsKKwl9CisKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgXAorCQkJZnJhZ2NvdW50ICogc2l6ZW9mKHN0cnVjdCBkbWFzZyksICZhZGRyLCAwKTsKKwlzcG9ydC0+dHhfZGVzY19ieXRlcyA9IGZyYWdjb3VudCAqIHNpemVvZihzdHJ1Y3QgZG1hc2cpOworCWlmICghc3BvcnQtPmRtYV90eF9kZXNjKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdHggZGVzY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwb3J0LT50eF9idWYgPSBidWY7CisJc3BvcnQtPnR4X2ZyYWdzaXplID0gZnJhZ3NpemU7CisJc3BvcnQtPnR4X2ZyYWdzID0gZnJhZ2NvdW50OworCWNmZyAgICAgPSAweDcwMDAgfCBESV9FTiB8IGNvbXB1dGVfd2RzaXplKHNwb3J0LT53ZHNpemUpIHwgXAorCQkgIChERVNDX0VMRU1FTlRfQ09VTlQgPDwgOCk7IC8qIGxhcmdlIGRlc2NyaXB0b3IgbW9kZSAqLworCisJaWYgKHlfY291bnQgIT0gMCkKKwkJY2ZnIHw9IERNQTJEOworCisJc2V0dXBfZGVzYyhzcG9ydC0+ZG1hX3R4X2Rlc2MsIGJ1ZiwgZnJhZ2NvdW50LCBmcmFnc2l6ZSwKKwkJCWNmZ3xETUFFTiwgeF9jb3VudCwgeV9jb3VudCwgc3BvcnQtPndkc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfY29uZmlnX3R4X2RtYSk7CisKKy8qIHNldHVwIGR1bW15IGRtYSBkZXNjcmlwdG9yIHJpbmcsIHdoaWNoIGRvbid0IGdlbmVyYXRlIGludGVycnVwdHMsCisgKiB0aGUgeF9tb2RpZnkgaXMgc2V0IHRvIDAgKi8KK3N0YXRpYyBpbnQgc3BvcnRfY29uZmlnX3J4X2R1bW15KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXN0cnVjdCBkbWFzZyAqZGVzYzsKKwl1bnNpZ25lZCBjb25maWc7CisKKwlwcl9kZWJ1ZygiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAorCWRlc2MgPSAoc3RydWN0IGRtYXNnICopIGwxX2RhdGFfc3JhbV9hbGxvYygyICogc2l6ZW9mKCpkZXNjKSk7CisjZWxzZQorCXsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlkZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIDIgKiBzaXplb2YoKmRlc2MpLCAmYWRkciwgMCk7CisJfQorI2VuZGlmCisJaWYgKGRlc2MgPT0gTlVMTCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGR1bW15IHJ4IGRlc2NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRlc2MsIDAsIDIgKiBzaXplb2YoKmRlc2MpKTsKKwlzcG9ydC0+ZHVtbXlfcnhfZGVzYyA9IGRlc2M7CisJZGVzYy0+c3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNwb3J0LT5kdW1teV9idWY7CisJY29uZmlnID0gRE1BRkxPV19MQVJHRSB8IE5EU0laRV85IHwgY29tcHV0ZV93ZHNpemUoc3BvcnQtPndkc2l6ZSkKKwkJIHwgV05SIHwgRE1BRU47CisJZGVzYy0+Y2ZnID0gY29uZmlnOworCWRlc2MtPnhfY291bnQgPSBzcG9ydC0+ZHVtbXlfY291bnQvc3BvcnQtPndkc2l6ZTsKKwlkZXNjLT54X21vZGlmeSA9IHNwb3J0LT53ZHNpemU7CisJZGVzYy0+eV9jb3VudCA9IDA7CisJZGVzYy0+eV9tb2RpZnkgPSAwOworCW1lbWNweShkZXNjKzEsIGRlc2MsIHNpemVvZigqZGVzYykpOworCWRlc2MtPm5leHRfZGVzY19hZGRyID0gKHVuc2lnbmVkIGxvbmcpKGRlc2MrMSk7CisJZGVzY1sxXS5uZXh0X2Rlc2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRlc2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BvcnRfY29uZmlnX3R4X2R1bW15KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXN0cnVjdCBkbWFzZyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgY29uZmlnOworCisJcHJfZGVidWcoIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAorCWRlc2MgPSAoc3RydWN0IGRtYXNnICopIGwxX2RhdGFfc3JhbV9hbGxvYygyICogc2l6ZW9mKCpkZXNjKSk7CisjZWxzZQorCXsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlkZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIDIgKiBzaXplb2YoKmRlc2MpLCAmYWRkciwgMCk7CisJfQorI2VuZGlmCisJaWYgKCFkZXNjKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHVtbXkgdHggZGVzY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoZGVzYywgMCwgMiAqIHNpemVvZigqZGVzYykpOworCXNwb3J0LT5kdW1teV90eF9kZXNjID0gZGVzYzsKKwlkZXNjLT5zdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpc3BvcnQtPmR1bW15X2J1ZiArIFwKKwkJc3BvcnQtPmR1bW15X2NvdW50OworCWNvbmZpZyA9IERNQUZMT1dfTEFSR0UgfCBORFNJWkVfOSB8CisJCSBjb21wdXRlX3dkc2l6ZShzcG9ydC0+d2RzaXplKSB8IERNQUVOOworCWRlc2MtPmNmZyA9IGNvbmZpZzsKKwlkZXNjLT54X2NvdW50ID0gc3BvcnQtPmR1bW15X2NvdW50L3Nwb3J0LT53ZHNpemU7CisJZGVzYy0+eF9tb2RpZnkgPSBzcG9ydC0+d2RzaXplOworCWRlc2MtPnlfY291bnQgPSAwOworCWRlc2MtPnlfbW9kaWZ5ID0gMDsKKwltZW1jcHkoZGVzYysxLCBkZXNjLCBzaXplb2YoKmRlc2MpKTsKKwlkZXNjLT5uZXh0X2Rlc2NfYWRkciA9ICh1bnNpZ25lZCBsb25nKShkZXNjKzEpOworCWRlc2NbMV0ubmV4dF9kZXNjX2FkZHIgPSAodW5zaWduZWQgbG9uZylkZXNjOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHNwb3J0X2N1cnJfb2Zmc2V0X3J4KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgY3VyciA9IGdldF9kbWFfY3Vycl9hZGRyKHNwb3J0LT5kbWFfcnhfY2hhbik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKiljdXJyIC0gc3BvcnQtPnJ4X2J1ZjsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfY3Vycl9vZmZzZXRfcngpOworCit1bnNpZ25lZCBsb25nIHNwb3J0X2N1cnJfb2Zmc2V0X3R4KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgY3VyciA9IGdldF9kbWFfY3Vycl9hZGRyKHNwb3J0LT5kbWFfdHhfY2hhbik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKiljdXJyIC0gc3BvcnQtPnR4X2J1ZjsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfY3Vycl9vZmZzZXRfdHgpOworCit2b2lkIHNwb3J0X2luY2ZyYWcoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsIGludCAqZnJhZywgaW50IHR4KQoreworCSsrKCpmcmFnKTsKKwlpZiAodHggPT0gMSAmJiAqZnJhZyA9PSBzcG9ydC0+dHhfZnJhZ3MpCisJCSpmcmFnID0gMDsKKworCWlmICh0eCA9PSAwICYmICpmcmFnID09IHNwb3J0LT5yeF9mcmFncykKKwkJKmZyYWcgPSAwOworfQorRVhQT1JUX1NZTUJPTChzcG9ydF9pbmNmcmFnKTsKKwordm9pZCBzcG9ydF9kZWNmcmFnKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCBpbnQgKmZyYWcsIGludCB0eCkKK3sKKwktLSgqZnJhZyk7CisJaWYgKHR4ID09IDEgJiYgKmZyYWcgPT0gMCkKKwkJKmZyYWcgPSBzcG9ydC0+dHhfZnJhZ3M7CisKKwlpZiAodHggPT0gMCAmJiAqZnJhZyA9PSAwKQorCQkqZnJhZyA9IHNwb3J0LT5yeF9mcmFnczsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfZGVjZnJhZyk7CisKK3N0YXRpYyBpbnQgc3BvcnRfY2hlY2tfc3RhdHVzKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LAorCQl1bnNpZ25lZCBpbnQgKnNwb3J0X3N0YXQsCisJCXVuc2lnbmVkIGludCAqcnhfc3RhdCwKKwkJdW5zaWduZWQgaW50ICp0eF9zdGF0KQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKHNwb3J0X3N0YXQpIHsKKwkJU1NZTkMoKTsKKwkJc3RhdHVzID0gc3BvcnQtPnJlZ3MtPnN0YXQ7CisJCWlmIChzdGF0dXMgJiAoVE9WRnxUVVZGfFJPVkZ8UlVWRikpCisJCQlzcG9ydC0+cmVncy0+c3RhdCA9IChzdGF0dXMgJiAoVE9WRnxUVVZGfFJPVkZ8UlVWRikpOworCQlTU1lOQygpOworCQkqc3BvcnRfc3RhdCA9IHN0YXR1czsKKwl9CisKKwlpZiAocnhfc3RhdCkgeworCQlTU1lOQygpOworCQlzdGF0dXMgPSBnZXRfZG1hX2N1cnJfaXJxc3RhdChzcG9ydC0+ZG1hX3J4X2NoYW4pOworCQlpZiAoc3RhdHVzICYgKERNQV9ET05FfERNQV9FUlIpKQorCQkJY2xlYXJfZG1hX2lycXN0YXQoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwkJU1NZTkMoKTsKKwkJKnJ4X3N0YXQgPSBzdGF0dXM7CisJfQorCisJaWYgKHR4X3N0YXQpIHsKKwkJU1NZTkMoKTsKKwkJc3RhdHVzID0gZ2V0X2RtYV9jdXJyX2lycXN0YXQoc3BvcnQtPmRtYV90eF9jaGFuKTsKKwkJaWYgKHN0YXR1cyAmIChETUFfRE9ORXxETUFfRVJSKSkKKwkJCWNsZWFyX2RtYV9pcnFzdGF0KHNwb3J0LT5kbWFfdHhfY2hhbik7CisJCVNTWU5DKCk7CisJCSp0eF9zdGF0ID0gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgIHNwb3J0X2R1bXBfc3RhdChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzbnByaW50ZihidWYsIGxlbiwKKwkJCSJzdHM6IDB4JTA0eFxuIgorCQkJInJ4IGRtYSAlZCBzdHM6IDB4JTA0eCB0eCBkbWEgJWQgc3RzOiAweCUwNHhcbiIsCisJCQlzcG9ydC0+cmVncy0+c3RhdCwKKwkJCXNwb3J0LT5kbWFfcnhfY2hhbiwKKwkJCWdldF9kbWFfY3Vycl9pcnFzdGF0KHNwb3J0LT5kbWFfcnhfY2hhbiksCisJCQlzcG9ydC0+ZG1hX3R4X2NoYW4sCisJCQlnZXRfZG1hX2N1cnJfaXJxc3RhdChzcG9ydC0+ZG1hX3R4X2NoYW4pKTsKKwlidWYgKz0gcmV0OworCWxlbiAtPSByZXQ7CisKKwlyZXQgKz0gc25wcmludGYoYnVmLCBsZW4sCisJCQkiY3Vycl9yeF9kZXNjOjB4JXAsIGN1cnJfdHhfZGVzYzoweCVwXG4iCisJCQkiZG1hX3J4X2Rlc2M6MHglcCwgZG1hX3R4X2Rlc2M6MHglcFxuIgorCQkJImR1bW15X3J4X2Rlc2M6MHglcCwgZHVtbXlfdHhfZGVzYzoweCVwXG4iLAorCQkJc3BvcnQtPmN1cnJfcnhfZGVzYywgc3BvcnQtPmN1cnJfdHhfZGVzYywKKwkJCXNwb3J0LT5kbWFfcnhfZGVzYywgc3BvcnQtPmRtYV90eF9kZXNjLAorCQkJc3BvcnQtPmR1bW15X3J4X2Rlc2MsIHNwb3J0LT5kdW1teV90eF9kZXNjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByeF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcnhfc3RhdDsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCA9IGRldl9pZDsKKworCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXNwb3J0X2NoZWNrX3N0YXR1cyhzcG9ydCwgTlVMTCwgJnJ4X3N0YXQsIE5VTEwpOworCWlmICghKHJ4X3N0YXQgJiBETUFfRE9ORSkpCisJCXByX2VycigicnggZG1hIGlzIGFscmVhZHkgc3RvcHBlZFxuIik7CisKKwlpZiAoc3BvcnQtPnJ4X2NhbGxiYWNrKSB7CisJCXNwb3J0LT5yeF9jYWxsYmFjayhzcG9ydC0+cnhfZGF0YSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdHhfc3RhdDsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCA9IGRldl9pZDsKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlzcG9ydF9jaGVja19zdGF0dXMoc3BvcnQsIE5VTEwsIE5VTEwsICZ0eF9zdGF0KTsKKwlpZiAoISh0eF9zdGF0ICYgRE1BX0RPTkUpKSB7CisJCXByX2VycigidHggZG1hIGlzIGFscmVhZHkgc3RvcHBlZFxuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHNwb3J0LT50eF9jYWxsYmFjaykgeworCQlzcG9ydC0+dHhfY2FsbGJhY2soc3BvcnQtPnR4X2RhdGEpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXJyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0ID0gZGV2X2lkOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHNwb3J0X2NoZWNrX3N0YXR1cyhzcG9ydCwgJnN0YXR1cywgTlVMTCwgTlVMTCkpIHsKKwkJcHJfZXJyKCJlcnJvciBjaGVja2luZyBzdGF0dXMgPz8iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChzdGF0dXMgJiAoVE9WRnxUVVZGfFJPVkZ8UlVWRikpIHsKKwkJcHJfaW5mbygic3BvcnQgc3RhdHVzIGVycm9yOiVzJXMlcyVzXG4iLAorCQkJCXN0YXR1cyAmIFRPVkYgPyAiIFRPVkYiIDogIiIsCisJCQkJc3RhdHVzICYgVFVWRiA/ICIgVFVWRiIgOiAiIiwKKwkJCQlzdGF0dXMgJiBST1ZGID8gIiBST1ZGIiA6ICIiLAorCQkJCXN0YXR1cyAmIFJVVkYgPyAiIFJVVkYiIDogIiIpOworCQlpZiAoc3RhdHVzICYgVE9WRiB8fCBzdGF0dXMgJiBUVVZGKSB7CisJCQlkaXNhYmxlX2RtYShzcG9ydC0+ZG1hX3R4X2NoYW4pOworCQkJaWYgKHNwb3J0LT50eF9ydW4pCisJCQkJc3BvcnRfdHhfZG1hX3N0YXJ0KHNwb3J0LCAwKTsKKwkJCWVsc2UKKwkJCQlzcG9ydF90eF9kbWFfc3RhcnQoc3BvcnQsIDEpOworCQkJZW5hYmxlX2RtYShzcG9ydC0+ZG1hX3R4X2NoYW4pOworCQl9IGVsc2UgeworCQkJZGlzYWJsZV9kbWEoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwkJCWlmIChzcG9ydC0+cnhfcnVuKQorCQkJCXNwb3J0X3J4X2RtYV9zdGFydChzcG9ydCwgMCk7CisJCQllbHNlCisJCQkJc3BvcnRfcnhfZG1hX3N0YXJ0KHNwb3J0LCAxKTsKKwkJCWVuYWJsZV9kbWEoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwkJfQorCX0KKwlzdGF0dXMgPSBzcG9ydC0+cmVncy0+c3RhdDsKKwlpZiAoc3RhdHVzICYgKFRPVkZ8VFVWRnxST1ZGfFJVVkYpKQorCQlzcG9ydC0+cmVncy0+c3RhdCA9IChzdGF0dXMgJiAoVE9WRnxUVVZGfFJPVkZ8UlVWRikpOworCVNTWU5DKCk7CisKKwlpZiAoc3BvcnQtPmVycl9jYWxsYmFjaykKKwkJc3BvcnQtPmVycl9jYWxsYmFjayhzcG9ydC0+ZXJyX2RhdGEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgc3BvcnRfc2V0X3J4X2NhbGxiYWNrKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LAorCQkgICAgICAgdm9pZCAoKnJ4X2NhbGxiYWNrKSh2b2lkICopLCB2b2lkICpyeF9kYXRhKQoreworCUJVR19PTihyeF9jYWxsYmFjayA9PSBOVUxMKTsKKwlzcG9ydC0+cnhfY2FsbGJhY2sgPSByeF9jYWxsYmFjazsKKwlzcG9ydC0+cnhfZGF0YSA9IHJ4X2RhdGE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfc2V0X3J4X2NhbGxiYWNrKTsKKworaW50IHNwb3J0X3NldF90eF9jYWxsYmFjayhzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwKKwkJdm9pZCAoKnR4X2NhbGxiYWNrKSh2b2lkICopLCB2b2lkICp0eF9kYXRhKQoreworCUJVR19PTih0eF9jYWxsYmFjayA9PSBOVUxMKTsKKwlzcG9ydC0+dHhfY2FsbGJhY2sgPSB0eF9jYWxsYmFjazsKKwlzcG9ydC0+dHhfZGF0YSA9IHR4X2RhdGE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfc2V0X3R4X2NhbGxiYWNrKTsKKworaW50IHNwb3J0X3NldF9lcnJfY2FsbGJhY2soc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsCisJCXZvaWQgKCplcnJfY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKmVycl9kYXRhKQoreworCUJVR19PTihlcnJfY2FsbGJhY2sgPT0gTlVMTCk7CisJc3BvcnQtPmVycl9jYWxsYmFjayA9IGVycl9jYWxsYmFjazsKKwlzcG9ydC0+ZXJyX2RhdGEgPSBlcnJfZGF0YTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzcG9ydF9zZXRfZXJyX2NhbGxiYWNrKTsKKworc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnRfaW5pdChzdHJ1Y3Qgc3BvcnRfcGFyYW0gKnBhcmFtLCB1bnNpZ25lZCB3ZHNpemUsCisJCXVuc2lnbmVkIGR1bW15X2NvdW50LCB2b2lkICpwcml2YXRlX2RhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydDsKKwlwcl9kZWJ1ZygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlCVUdfT04ocGFyYW0gPT0gTlVMTCk7CisJQlVHX09OKHdkc2l6ZSA9PSAwIHx8IGR1bW15X2NvdW50ID09IDApOworCXNwb3J0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNwb3J0X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghc3BvcnQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZm9yIHNwb3J0IGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBzcG9ydF9kZXZpY2UpKTsKKwlzcG9ydC0+ZG1hX3J4X2NoYW4gPSBwYXJhbS0+ZG1hX3J4X2NoYW47CisJc3BvcnQtPmRtYV90eF9jaGFuID0gcGFyYW0tPmRtYV90eF9jaGFuOworCXNwb3J0LT5lcnJfaXJxID0gcGFyYW0tPmVycl9pcnE7CisJc3BvcnQtPnJlZ3MgPSBwYXJhbS0+cmVnczsKKwlzcG9ydC0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCisJaWYgKHJlcXVlc3RfZG1hKHNwb3J0LT5kbWFfcnhfY2hhbiwgIlNQT1JUIFJYIERhdGEiKSA9PSAtRUJVU1kpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVxdWVzdCBSWCBkbWEgJWRcbiIsIFwKKwkJCQlzcG9ydC0+ZG1hX3J4X2NoYW4pOworCQlnb3RvIF9faW5pdF9lcnIxOworCX0KKwlpZiAoc2V0X2RtYV9jYWxsYmFjayhzcG9ydC0+ZG1hX3J4X2NoYW4sIHJ4X2hhbmRsZXIsIHNwb3J0KSAhPSAwKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHJlcXVlc3QgUlggaXJxICVkXG4iLCBcCisJCQkJc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwkJZ290byBfX2luaXRfZXJyMjsKKwl9CisKKwlpZiAocmVxdWVzdF9kbWEoc3BvcnQtPmRtYV90eF9jaGFuLCAiU1BPUlQgVFggRGF0YSIpID09IC1FQlVTWSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IFRYIGRtYSAlZFxuIiwgXAorCQkJCXNwb3J0LT5kbWFfdHhfY2hhbik7CisJCWdvdG8gX19pbml0X2VycjI7CisJfQorCisJaWYgKHNldF9kbWFfY2FsbGJhY2soc3BvcnQtPmRtYV90eF9jaGFuLCB0eF9oYW5kbGVyLCBzcG9ydCkgIT0gMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IFRYIGlycSAlZFxuIiwgXAorCQkJCXNwb3J0LT5kbWFfdHhfY2hhbik7CisJCWdvdG8gX19pbml0X2VycjM7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHNwb3J0LT5lcnJfaXJxLCBlcnJfaGFuZGxlciwgSVJRRl9TSEFSRUQsICJTUE9SVCBlcnIiLAorCQkJc3BvcnQpIDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZXF1ZXN0IGVyciBpcnE6JWRcbiIsIFwKKwkJCQlzcG9ydC0+ZXJyX2lycSk7CisJCWdvdG8gX19pbml0X2VycjM7CisJfQorCisJcHJfZXJyKCJkbWEgcng6JWQgdHg6JWQsIGVyciBpcnE6JWQsIHJlZ3M6JXBcbiIsCisJCQlzcG9ydC0+ZG1hX3J4X2NoYW4sIHNwb3J0LT5kbWFfdHhfY2hhbiwKKwkJCXNwb3J0LT5lcnJfaXJxLCBzcG9ydC0+cmVncyk7CisKKwlzcG9ydC0+d2RzaXplID0gd2RzaXplOworCXNwb3J0LT5kdW1teV9jb3VudCA9IGR1bW15X2NvdW50OworCisjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCisJc3BvcnQtPmR1bW15X2J1ZiA9IGwxX2RhdGFfc3JhbV9hbGxvYyhkdW1teV9jb3VudCAqIDIpOworI2Vsc2UKKwlzcG9ydC0+ZHVtbXlfYnVmID0ga21hbGxvYyhkdW1teV9jb3VudCAqIDIsIEdGUF9LRVJORUwpOworI2VuZGlmCisJaWYgKHNwb3J0LT5kdW1teV9idWYgPT0gTlVMTCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBkdW1teSBidWZmZXJcbiIpOworCQlnb3RvIF9fZXJyb3I7CisJfQorCisJbWVtc2V0KHNwb3J0LT5kdW1teV9idWYsIDAsIGR1bW15X2NvdW50ICogMik7CisJcmV0ID0gc3BvcnRfY29uZmlnX3J4X2R1bW15KHNwb3J0KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGNvbmZpZyByeCBkdW1teSByaW5nXG4iKTsKKwkJZ290byBfX2Vycm9yOworCX0KKwlyZXQgPSBzcG9ydF9jb25maWdfdHhfZHVtbXkoc3BvcnQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY29uZmlnIHR4IGR1bW15IHJpbmdcbiIpOworCQlnb3RvIF9fZXJyb3I7CisJfQorCisJcmV0dXJuIHNwb3J0OworX19lcnJvcjoKKwlmcmVlX2lycShzcG9ydC0+ZXJyX2lycSwgc3BvcnQpOworX19pbml0X2VycjM6CisJZnJlZV9kbWEoc3BvcnQtPmRtYV90eF9jaGFuKTsKK19faW5pdF9lcnIyOgorCWZyZWVfZG1hKHNwb3J0LT5kbWFfcnhfY2hhbik7CitfX2luaXRfZXJyMToKKwlrZnJlZShzcG9ydCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHNwb3J0X2luaXQpOworCit2b2lkIHNwb3J0X2RvbmUoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpCit7CisJaWYgKHNwb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCXNwb3J0X3N0b3Aoc3BvcnQpOworCWlmIChzcG9ydC0+ZG1hX3J4X2Rlc2MpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNwb3J0LT5yeF9kZXNjX2J5dGVzLAorCQkJc3BvcnQtPmRtYV9yeF9kZXNjLCAwKTsKKwlpZiAoc3BvcnQtPmRtYV90eF9kZXNjKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzcG9ydC0+dHhfZGVzY19ieXRlcywKKwkJCXNwb3J0LT5kbWFfdHhfZGVzYywgMCk7CisKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKKwlsMV9kYXRhX3NyYW1fZnJlZShzcG9ydC0+ZHVtbXlfcnhfZGVzYyk7CisJbDFfZGF0YV9zcmFtX2ZyZWUoc3BvcnQtPmR1bW15X3R4X2Rlc2MpOworCWwxX2RhdGFfc3JhbV9mcmVlKHNwb3J0LT5kdW1teV9idWYpOworI2Vsc2UKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCAyKnNpemVvZihzdHJ1Y3QgZG1hc2cpLAorCQlzcG9ydC0+ZHVtbXlfcnhfZGVzYywgMCk7CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgMipzaXplb2Yoc3RydWN0IGRtYXNnKSwKKwkJc3BvcnQtPmR1bW15X3R4X2Rlc2MsIDApOworCWtmcmVlKHNwb3J0LT5kdW1teV9idWYpOworI2VuZGlmCisJZnJlZV9kbWEoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwlmcmVlX2RtYShzcG9ydC0+ZG1hX3R4X2NoYW4pOworCWZyZWVfaXJxKHNwb3J0LT5lcnJfaXJxLCBzcG9ydCk7CisKKwlrZnJlZShzcG9ydCk7CisJCXNwb3J0ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfZG9uZSk7CisvKgorKiBJdCBpcyBvbmx5IHVzZWQgdG8gc2VuZCBzZXZlcmFsIGJ5dGVzIHdoZW4gZG1hIGlzIG5vdCBlbmFibGVkCisgKiBzcG9ydCBjb250cm9sbGVyIGlzIGNvbmZpZ3VyZWQgYnV0IG5vdCBlbmFibGVkLgorICogTXVsdGljaGFubmVsIGNhbm5vdCB3b3JrcyB3aXRoIHBpbyBtb2RlICovCisvKiBVc2VkIGJ5IGFjOTcgdG8gd3JpdGUgYW5kIHJlYWQgY29kZWMgcmVnaXN0ZXIgKi8KK2ludCBzcG9ydF9zZW5kX2FuZF9yZWN2KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCB1OCAqb3V0X2RhdGEsIFwKKwkJdTggKmluX2RhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgZG1hX2NvbmZpZzsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHdhaXQgPSAwOworCisJcHJfZGVidWcoIiVzIGVudGVyLCBvdXRfZGF0YTolcCwgaW5fZGF0YTolcCBsZW46JWRcbiIsIFwKKwkJCV9fZnVuY19fLCBvdXRfZGF0YSwgaW5fZGF0YSwgbGVuKTsKKwlwcl9kZWJ1ZygidGNyMToweCUwNHgsIHRjcjI6MHglMDR4LCB0Y2xrZGl2OjB4JTA0eCwgdGZzZGl2OjB4JTA0eFxuIgorCQkJIm1jbWMxOjB4JTA0eCwgbWNtYzI6MHglMDR4XG4iLAorCQkJc3BvcnQtPnJlZ3MtPnRjcjEsIHNwb3J0LT5yZWdzLT50Y3IyLAorCQkJc3BvcnQtPnJlZ3MtPnRjbGtkaXYsIHNwb3J0LT5yZWdzLT50ZnNkaXYsCisJCQlzcG9ydC0+cmVncy0+bWNtYzEsIHNwb3J0LT5yZWdzLT5tY21jMik7CisJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZClvdXRfZGF0YSwgKHVuc2lnbmVkKShvdXRfZGF0YSArIGxlbikpOworCisJLyogRW5hYmxlIHR4IGRtYSAqLworCWRtYV9jb25maWcgPSAoUkVTVEFSVCB8IFdEU0laRV8xNiB8IERJX0VOKTsKKwlzZXRfZG1hX3N0YXJ0X2FkZHIoc3BvcnQtPmRtYV90eF9jaGFuLCAodW5zaWduZWQgbG9uZylvdXRfZGF0YSk7CisJc2V0X2RtYV94X2NvdW50KHNwb3J0LT5kbWFfdHhfY2hhbiwgbGVuLzIpOworCXNldF9kbWFfeF9tb2RpZnkoc3BvcnQtPmRtYV90eF9jaGFuLCAyKTsKKwlzZXRfZG1hX2NvbmZpZyhzcG9ydC0+ZG1hX3R4X2NoYW4sIGRtYV9jb25maWcpOworCWVuYWJsZV9kbWEoc3BvcnQtPmRtYV90eF9jaGFuKTsKKworCWlmIChpbl9kYXRhICE9IE5VTEwpIHsKKwkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKWluX2RhdGEsIFwKKwkJCQkodW5zaWduZWQpKGluX2RhdGEgKyBsZW4pKTsKKwkJLyogRW5hYmxlIHJ4IGRtYSAqLworCQlkbWFfY29uZmlnID0gKFJFU1RBUlQgfCBXRFNJWkVfMTYgfCBXTlIgfCBESV9FTik7CisJCXNldF9kbWFfc3RhcnRfYWRkcihzcG9ydC0+ZG1hX3J4X2NoYW4sICh1bnNpZ25lZCBsb25nKWluX2RhdGEpOworCQlzZXRfZG1hX3hfY291bnQoc3BvcnQtPmRtYV9yeF9jaGFuLCBsZW4vMik7CisJCXNldF9kbWFfeF9tb2RpZnkoc3BvcnQtPmRtYV9yeF9jaGFuLCAyKTsKKwkJc2V0X2RtYV9jb25maWcoc3BvcnQtPmRtYV9yeF9jaGFuLCBkbWFfY29uZmlnKTsKKwkJZW5hYmxlX2RtYShzcG9ydC0+ZG1hX3J4X2NoYW4pOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzcG9ydC0+cmVncy0+dGNyMSB8PSBUU1BFTjsKKwlzcG9ydC0+cmVncy0+cmNyMSB8PSBSU1BFTjsKKwlTU1lOQygpOworCisJc3RhdHVzID0gZ2V0X2RtYV9jdXJyX2lycXN0YXQoc3BvcnQtPmRtYV90eF9jaGFuKTsKKwl3aGlsZSAoc3RhdHVzICYgRE1BX1JVTikgeworCQl1ZGVsYXkoMSk7CisJCXN0YXR1cyA9IGdldF9kbWFfY3Vycl9pcnFzdGF0KHNwb3J0LT5kbWFfdHhfY2hhbik7CisJCXByX2RlYnVnKCJETUEgc3RhdHVzOjB4JTA0eFxuIiwgc3RhdHVzKTsKKwkJaWYgKHdhaXQrKyA+IDEwMCkKKwkJCWdvdG8gX19vdmVyOworCX0KKwlzdGF0dXMgPSBzcG9ydC0+cmVncy0+c3RhdDsKKwl3YWl0ID0gMDsKKworCXdoaWxlICghKHN0YXR1cyAmIFRYSFJFKSkgeworCQlwcl9kZWJ1Zygic3BvcnQgc3RhdHVzOjB4JTA0eFxuIiwgc3RhdHVzKTsKKwkJdWRlbGF5KDEpOworCQlzdGF0dXMgPSAqKHVuc2lnbmVkIHNob3J0ICopJnNwb3J0LT5yZWdzLT5zdGF0OworCQlpZiAod2FpdCsrID4gMTAwMCkKKwkJCWdvdG8gX19vdmVyOworCX0KKwkvKiBXYWl0IGZvciB0aGUgbGFzdCBieXRlIHNlbnQgb3V0ICovCisJdWRlbGF5KDIwKTsKKwlwcl9kZWJ1Zygic3BvcnQgc3RhdHVzOjB4JTA0eFxuIiwgc3RhdHVzKTsKKworX19vdmVyOgorCXNwb3J0LT5yZWdzLT50Y3IxICY9IH5UU1BFTjsKKwlzcG9ydC0+cmVncy0+cmNyMSAmPSB+UlNQRU47CisJU1NZTkMoKTsKKwlkaXNhYmxlX2RtYShzcG9ydC0+ZG1hX3R4X2NoYW4pOworCS8qIENsZWFyIHRoZSBzdGF0dXMgKi8KKwljbGVhcl9kbWFfaXJxc3RhdChzcG9ydC0+ZG1hX3R4X2NoYW4pOworCWlmIChpbl9kYXRhICE9IE5VTEwpIHsKKwkJZGlzYWJsZV9kbWEoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwkJY2xlYXJfZG1hX2lycXN0YXQoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKwl9CisJU1NZTkMoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc3BvcnRfc2VuZF9hbmRfcmVjdik7CisKK01PRFVMRV9BVVRIT1IoIlJveSBIdWFuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUE9SVCBkcml2ZXIgZm9yIEFESSBCbGFja2ZpbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuaCBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWRjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYmY1eHhfYWM5N19zcG9ydC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjogICAgICAgUm95IEh1YW5nIDxyb3kuaHVhbmdAYW5hbG9nLmNvbT4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisKKyNpZm5kZWYgX19CRjVYWF9TUE9SVF9IX18KKyNkZWZpbmUgX19CRjVYWF9TUE9SVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RydWN0IHNwb3J0X3JlZ2lzdGVyIHsKKwl1MTYgdGNyMTsJdTE2IHJlc2VydmVkMDsKKwl1MTYgdGNyMjsJdTE2IHJlc2VydmVkMTsKKwl1MTYgdGNsa2RpdjsJdTE2IHJlc2VydmVkMjsKKwl1MTYgdGZzZGl2Owl1MTYgcmVzZXJ2ZWQzOworCXUzMiB0eDsKKwl1MzIgcmVzZXJ2ZWRfbDA7CisJdTMyIHJ4OworCXUzMiByZXNlcnZlZF9sMTsKKwl1MTYgcmNyMTsJdTE2IHJlc2VydmVkNDsKKwl1MTYgcmNyMjsJdTE2IHJlc2VydmVkNTsKKwl1MTYgcmNsa2RpdjsJdTE2IHJlc2VydmVkNjsKKwl1MTYgcmZzZGl2Owl1MTYgcmVzZXJ2ZWQ3OworCXUxNiBzdGF0Owl1MTYgcmVzZXJ2ZWQ4OworCXUxNiBjaG5sOwl1MTYgcmVzZXJ2ZWQ5OworCXUxNiBtY21jMTsJdTE2IHJlc2VydmVkMTA7CisJdTE2IG1jbWMyOwl1MTYgcmVzZXJ2ZWQxMTsKKwl1MzIgbXRjczA7CisJdTMyIG10Y3MxOworCXUzMiBtdGNzMjsKKwl1MzIgbXRjczM7CisJdTMyIG1yY3MwOworCXUzMiBtcmNzMTsKKwl1MzIgbXJjczI7CisJdTMyIG1yY3MzOworfTsKKworI2RlZmluZSBERVNDX0VMRU1FTlRfQ09VTlQgOQorCitzdHJ1Y3Qgc3BvcnRfZGV2aWNlIHsKKwlpbnQgZG1hX3J4X2NoYW47CisJaW50IGRtYV90eF9jaGFuOworCWludCBlcnJfaXJxOworCXN0cnVjdCBzcG9ydF9yZWdpc3RlciAqcmVnczsKKworCXVuc2lnbmVkIGNoYXIgKnJ4X2J1ZjsKKwl1bnNpZ25lZCBjaGFyICp0eF9idWY7CisJdW5zaWduZWQgaW50IHJ4X2ZyYWdzaXplOworCXVuc2lnbmVkIGludCB0eF9mcmFnc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ3M7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdzOworCXVuc2lnbmVkIGludCB3ZHNpemU7CisKKwkvKiBmb3IgZHVtbXkgZG1hIHRyYW5zZmVyICovCisJdm9pZCAqZHVtbXlfYnVmOworCXVuc2lnbmVkIGludCBkdW1teV9jb3VudDsKKworCS8qIERNQSBkZXNjcmlwdG9yIHJpbmcgaGVhZCBvZiBjdXJyZW50IGF1ZGlvIHN0cmVhbSovCisJc3RydWN0IGRtYXNnICpkbWFfcnhfZGVzYzsKKwlzdHJ1Y3QgZG1hc2cgKmRtYV90eF9kZXNjOworCXVuc2lnbmVkIGludCByeF9kZXNjX2J5dGVzOworCXVuc2lnbmVkIGludCB0eF9kZXNjX2J5dGVzOworCisJdW5zaWduZWQgaW50IHJ4X3J1bjoxOyAvKiByeCBpcyBydW5uaW5nICovCisJdW5zaWduZWQgaW50IHR4X3J1bjoxOyAvKiB0eCBpcyBydW5uaW5nICovCisKKwlzdHJ1Y3QgZG1hc2cgKmR1bW15X3J4X2Rlc2M7CisJc3RydWN0IGRtYXNnICpkdW1teV90eF9kZXNjOworCisJc3RydWN0IGRtYXNnICpjdXJyX3J4X2Rlc2M7CisJc3RydWN0IGRtYXNnICpjdXJyX3R4X2Rlc2M7CisKKwlpbnQgcnhfY3Vycl9mcmFnOworCWludCB0eF9jdXJyX2ZyYWc7CisKKwl1bnNpZ25lZCBpbnQgcmNyMTsKKwl1bnNpZ25lZCBpbnQgcmNyMjsKKwlpbnQgcnhfdGRtX2NvdW50OworCisJdW5zaWduZWQgaW50IHRjcjE7CisJdW5zaWduZWQgaW50IHRjcjI7CisJaW50IHR4X3RkbV9jb3VudDsKKworCXZvaWQgKCpyeF9jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZCAqcnhfZGF0YTsKKwl2b2lkICgqdHhfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQgKnR4X2RhdGE7CisJdm9pZCAoKmVycl9jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZCAqZXJyX2RhdGE7CisJdW5zaWduZWQgY2hhciAqdHhfZG1hX2J1ZjsKKwl1bnNpZ25lZCBjaGFyICpyeF9kbWFfYnVmOworI2lmZGVmIENPTkZJR19TTkRfTU1BUF9TVVBQT1JUCisJZG1hX2FkZHJfdCB0eF9kbWFfcGh5OworCWRtYV9hZGRyX3QgcnhfZG1hX3BoeTsKKwlpbnQgdHhfcG9zOy8qcGNtIHNhbXBsZSBjb3VudCovCisJaW50IHJ4X3BvczsKKwl1bnNpZ25lZCBpbnQgdHhfYnVmZmVyX3NpemU7CisJdW5zaWduZWQgaW50IHJ4X2J1ZmZlcl9zaXplOworCWludCB0eF9kZWxheV9wb3M7CisJaW50IG9uY2U7CisjZW5kaWYKKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9OworCitleHRlcm4gc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnRfaGFuZGxlOworCitzdHJ1Y3Qgc3BvcnRfcGFyYW0geworCWludCBkbWFfcnhfY2hhbjsKKwlpbnQgZG1hX3R4X2NoYW47CisJaW50IGVycl9pcnE7CisJc3RydWN0IHNwb3J0X3JlZ2lzdGVyICpyZWdzOworfTsKKworc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnRfaW5pdChzdHJ1Y3Qgc3BvcnRfcGFyYW0gKnBhcmFtLCB1bnNpZ25lZCB3ZHNpemUsCisJCXVuc2lnbmVkIGR1bW15X2NvdW50LCB2b2lkICpwcml2YXRlX2RhdGEpOworCit2b2lkIHNwb3J0X2RvbmUoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpOworCisvKiBmaXJzdCB1c2UgdGhlc2UgLi4uKi8KKworLyogbm90ZTogbXVsdGljaGFubmVsIGlzIGluIHVuaXRzIG9mIDggY2hhbm5lbHMsIHRkbV9jb3VudCBpcyBudW1iZXIgb2YgY2hhbm5lbHMKKyAqICBOT1QgLyA4ICEgYWxsIGNoYW5uZWxzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KK2ludCBzcG9ydF9zZXRfbXVsdGljaGFubmVsKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCBpbnQgdGRtX2NvdW50LAorCQl1MzIgbWFzaywgaW50IHBhY2tlZCk7CisKK2ludCBzcG9ydF9jb25maWdfcngoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsCisJCXVuc2lnbmVkIGludCByY3IxLCB1bnNpZ25lZCBpbnQgcmNyMiwKKwkJdW5zaWduZWQgaW50IGNsa2RpdiwgdW5zaWduZWQgaW50IGZzZGl2KTsKKworaW50IHNwb3J0X2NvbmZpZ190eChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwKKwkJdW5zaWduZWQgaW50IHRjcjEsIHVuc2lnbmVkIGludCB0Y3IyLAorCQl1bnNpZ25lZCBpbnQgY2xrZGl2LCB1bnNpZ25lZCBpbnQgZnNkaXYpOworCisvKiAuLi4gdGhlbiB0aGVzZTogKi8KKworLyogYnVmZmVyIHNpemUgKGluIGJ5dGVzKSA9PSBmcmFnY291bnQgKiBmcmFnc2l6ZV9ieXRlcyAqLworCisvKiB0aGlzIGlzIG5vdCBhIHZlcnkgZ2VuZXJhbCBhcGksIGl0IHNldHMgdGhlIGRtYSB0byAyZCBhdXRvYnVmZmVyIG1vZGUgKi8KKworaW50IHNwb3J0X2NvbmZpZ19yeF9kbWEoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsIHZvaWQgKmJ1ZiwKKwkJaW50IGZyYWdjb3VudCwgc2l6ZV90IGZyYWdzaXplX2J5dGVzKTsKKworaW50IHNwb3J0X2NvbmZpZ190eF9kbWEoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsIHZvaWQgKmJ1ZiwKKwkJaW50IGZyYWdjb3VudCwgc2l6ZV90IGZyYWdzaXplX2J5dGVzKTsKKworaW50IHNwb3J0X3R4X3N0YXJ0KHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KTsKK2ludCBzcG9ydF90eF9zdG9wKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0KTsKK2ludCBzcG9ydF9yeF9zdGFydChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCk7CitpbnQgc3BvcnRfcnhfc3RvcChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCk7CisKKy8qIGZvciB1c2UgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KK3Vuc2lnbmVkIGxvbmcgc3BvcnRfY3Vycl9vZmZzZXRfcngoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQpOwordW5zaWduZWQgbG9uZyBzcG9ydF9jdXJyX29mZnNldF90eChzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCk7CisKK3ZvaWQgc3BvcnRfaW5jZnJhZyhzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwgaW50ICpmcmFnLCBpbnQgdHgpOwordm9pZCBzcG9ydF9kZWNmcmFnKHN0cnVjdCBzcG9ydF9kZXZpY2UgKnNwb3J0LCBpbnQgKmZyYWcsIGludCB0eCk7CisKK2ludCBzcG9ydF9zZXRfcnhfY2FsbGJhY2soc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsCisJCSAgICAgICB2b2lkICgqcnhfY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKnJ4X2RhdGEpOworaW50IHNwb3J0X3NldF90eF9jYWxsYmFjayhzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwKKwkJICAgICAgIHZvaWQgKCp0eF9jYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqdHhfZGF0YSk7CitpbnQgc3BvcnRfc2V0X2Vycl9jYWxsYmFjayhzdHJ1Y3Qgc3BvcnRfZGV2aWNlICpzcG9ydCwKKwkJICAgICAgIHZvaWQgKCplcnJfY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKmVycl9kYXRhKTsKKworaW50IHNwb3J0X3NlbmRfYW5kX3JlY3Yoc3RydWN0IHNwb3J0X2RldmljZSAqc3BvcnQsIHU4ICpvdXRfZGF0YSwgXAorCQl1OCAqaW5fZGF0YSwgaW50IGxlbik7CisjZW5kaWYgLyogQkY1M1hfU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXNzbTI2MDIuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zc20yNjAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1ZjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zc20yNjAyLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIHNvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zc20yNjAyLmMKKyAqIEF1dGhvcjogICAgICAgQ2xpZmYgQ2FpIDxDbGlmZi5DYWlAYW5hbG9nLmNvbT4KKyAqCisgKiBDcmVhdGVkOiAgICAgIFR1ZSBKdW5lIDA2IDIwMDgKKyAqIERlc2NyaXB0aW9uOiAgYm9hcmQgZHJpdmVyIGZvciBTU00yNjAyIHNvdW5kIGNoaXAKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgIi4uL2NvZGVjcy9zc20yNjAyLmgiCisjaW5jbHVkZSAiYmY1eHgtc3BvcnQuaCIKKyNpbmNsdWRlICJiZjV4eC1pMnMtcGNtLmgiCisjaW5jbHVkZSAiYmY1eHgtaTJzLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIGJmNXh4X3NzbTI2MDI7CisKK3N0YXRpYyBpbnQgYmY1eHhfc3NtMjYwMl9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCXByX2RlYnVnKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCWNwdV9kYWktPnByaXZhdGVfZGF0YSA9IHNwb3J0X2hhbmRsZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZjV4eF9zc20yNjAyX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCXVuc2lnbmVkIGludCBjbGsgPSAwOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzIHJhdGUgJWQgZm9ybWF0ICV4XG4iLCBfX2Z1bmNfXywgcGFyYW1zX3JhdGUocGFyYW1zKSwKKwkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkvKgorCSAqIElmIHlvdSBhcmUgdXNpbmcgYSBjcnlzdGFsIHNvdXJjZSB3aGljaCBmcmVxdWVuY3kgaXMgbm90IDEyTUh6CisJICogdGhlbiBtb2RpZnkgdGhlIGJlbG93IGNhc2Ugc3RhdGVtZW50IHdpdGggZnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsLgorCSAqCisJICogSWYgeW91IGFyZSB1c2luZyB0aGUgU1BPUlQgdG8gZ2VuZXJhdGUgY2xvY2tpbmcgdGhlbiB0aGlzIGlzCisJICogd2hlcmUgdG8gZG8gaXQuCisJICovCisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDQ4MDAwOgorCWNhc2UgOTYwMDA6CisJY2FzZSAxMTAyNToKKwljYXNlIDIyMDUwOgorCWNhc2UgNDQxMDA6CisJCWNsayA9IDEyMDAwMDAwOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIENPREVDIGlzIG1hc3RlciBmb3IgQkNMSyBhbmQgTFJDIGluIHRoaXMgY29uZmlndXJhdGlvbi4KKwkgKi8KKworCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNvZGVjX2RhaS0+ZGFpX29wcy5zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjb2RlY19kYWktPmRhaV9vcHMuc2V0X3N5c2Nsayhjb2RlY19kYWksIFNTTTI2MDJfU1lTQ0xLLCBjbGssCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYmY1eHhfc3NtMjYwMl9vcHMgPSB7CisJLnN0YXJ0dXAgPSBiZjV4eF9zc20yNjAyX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IGJmNXh4X3NzbTI2MDJfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJmNXh4X3NzbTI2MDJfZGFpID0geworCS5uYW1lID0gInNzbTI2MDIiLAorCS5zdHJlYW1fbmFtZSA9ICJTU00yNjAyIiwKKwkuY3B1X2RhaSA9ICZiZjV4eF9pMnNfZGFpLAorCS5jb2RlY19kYWkgPSAmc3NtMjYwMl9kYWksCisJLm9wcyA9ICZiZjV4eF9zc20yNjAyX29wcywKK307CisKKy8qCisgKiBTU00yNjAyIDIgd2lyZSBhZGRyZXNzIGlzIGRldGVybWluZWQgYnkgQ1NCCisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3NtMjYwMl9zZXR1cF9kYXRhIGJmNXh4X3NzbTI2MDJfc2V0dXAgPSB7CisJLmkyY19idXMgPSAwLAorCS5pMmNfYWRkcmVzcyA9IDB4MWIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfbWFjaGluZSBiZjV4eF9zc20yNjAyID0geworCS5uYW1lID0gImJmNXh4X3NzbTI2MDIiLAorCS5kYWlfbGluayA9ICZiZjV4eF9zc20yNjAyX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgYmY1eHhfc3NtMjYwMl9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZiZjV4eF9zc20yNjAyLAorCS5wbGF0Zm9ybSA9ICZiZjV4eF9pMnNfc29jX3BsYXRmb3JtLAorCS5jb2RlY19kZXYgPSAmc29jX2NvZGVjX2Rldl9zc20yNjAyLAorCS5jb2RlY19kYXRhID0gJmJmNXh4X3NzbTI2MDJfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmY1Mnhfc3NtMjYwMl9zbmRfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBiZjV4eF9zc20yNjAyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJYmY1Mnhfc3NtMjYwMl9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFiZjUyeF9zc20yNjAyX3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoYmY1Mnhfc3NtMjYwMl9zbmRfZGV2aWNlLAorCQkJCSZiZjV4eF9zc20yNjAyX3NuZF9kZXZkYXRhKTsKKwliZjV4eF9zc20yNjAyX3NuZF9kZXZkYXRhLmRldiA9ICZiZjUyeF9zc20yNjAyX3NuZF9kZXZpY2UtPmRldjsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGJmNTJ4X3NzbTI2MDJfc25kX2RldmljZSk7CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGJmNTJ4X3NzbTI2MDJfc25kX2RldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmY1eHhfc3NtMjYwMl9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYmY1Mnhfc3NtMjYwMl9zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoYmY1eHhfc3NtMjYwMl9pbml0KTsKK21vZHVsZV9leGl0KGJmNXh4X3NzbTI2MDJfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNTTTI2MDIgQkY1MjctRVpLSVQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IDFkYjA0YTIuLjM4YTBlM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTEsMzQgKzEsNDcgQEAKK2NvbmZpZyBTTkRfU09DX0FMTF9DT0RFQ1MKKwl0cmlzdGF0ZSAiQnVpbGQgYWxsIEFTb0MgQ09ERUMgZHJpdmVycyIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBTUEkKKwlzZWxlY3QgU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX0FENzMzMTEKKwlzZWxlY3QgU05EX1NPQ19BSzQ1MzUKKwlzZWxlY3QgU05EX1NPQ19DUzQyNzAKKwlzZWxlY3QgU05EX1NPQ19TU00yNjAyCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyNgorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzNYCisJc2VsZWN0IFNORF9TT0NfVURBMTM4MAorCXNlbGVjdCBTTkRfU09DX1dNODUxMAorCXNlbGVjdCBTTkRfU09DX1dNODU4MAorCXNlbGVjdCBTTkRfU09DX1dNODczMQorCXNlbGVjdCBTTkRfU09DX1dNODc1MAorCXNlbGVjdCBTTkRfU09DX1dNODc1MworCXNlbGVjdCBTTkRfU09DX1dNODkwMAorCXNlbGVjdCBTTkRfU09DX1dNODkwMworCXNlbGVjdCBTTkRfU09DX1dNODk3MQorCXNlbGVjdCBTTkRfU09DX1dNODk5MAorICAgICAgICBoZWxwCisgICAgICAgICAgTm9ybWFsbHkgQVNvQyBjb2RlYyBkcml2ZXJzIGFyZSBvbmx5IGJ1aWx0IGlmIGEgbWFjaGluZSBkcml2ZXIgd2hpY2gKKyAgICAgICAgICB1c2VzIHRoZW0gaXMgYWxzbyBidWlsdCBzaW5jZSB0aGV5IGFyZSBvbmx5IHVzYWJsZSB3aXRoIGEgbWFjaGluZQorICAgICAgICAgIGRyaXZlci4gIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGFsbG93IHRoZXNlIGRyaXZlcnMgdG8gYmUgYnVpbHQKKyAgICAgICAgICB3aXRob3V0IGFuIGV4cGxpY2l0IG1hY2hpbmUgZHJpdmVyIGZvciB0ZXN0IGFuZCBkZXZlbG9wbWVudCBwdXJwb3Nlcy4KKworICAgICAgICAgIElmIHVuc3VyZSBzZWxlY3QgIk4iLgorCisKIGNvbmZpZyBTTkRfU09DX0FDOTdfQ09ERUMKIAl0cmlzdGF0ZQogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCitjb25maWcgU05EX1NPQ19BRDE5ODAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19BRDczMzExCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfQUs0NTM1CiAJdHJpc3RhdGUKIAotY29uZmlnIFNORF9TT0NfVURBMTM4MAotICAgICAgICB0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTg1MTAKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTg3MzEKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTg3NTAKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTg3NTMKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTg5OTAKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTk3MTIKLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1NPQ19XTTk3MTMKLQl0cmlzdGF0ZQotCiAjIENpcnJ1cyBMb2dpYyBDUzQyNzAgQ29kZWMKIGNvbmZpZyBTTkRfU09DX0NTNDI3MAogCXRyaXN0YXRlCkBAIC00Nyw2ICs2MCw1MyBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIFNORF9TT0NfQ1M0MjcwCiAKK2NvbmZpZyBTTkRfU09DX1NTTTI2MDIKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19UTFYzMjBBSUMyMworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJMkMKKworY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMjYKKwl0cmlzdGF0ZSAiVEkgVExWMzIwQUlDMjYgQ29kZWMgc3VwcG9ydCIgaWYgU05EX1NPQ19PRl9TSU1QTEUKKwlkZXBlbmRzIG9uIFNQSQorCiBjb25maWcgU05EX1NPQ19UTFYzMjBBSUMzWAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJMkMKKworY29uZmlnIFNORF9TT0NfVURBMTM4MAorICAgICAgICB0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg1MTAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg1ODAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg3MzEKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg3NTAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg3NTMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg5MDAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg5MDMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg5NzEKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg5OTAKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTk3MTIKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTk3MTMKKwl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKaW5kZXggZDdiOTdhYi4uOTBmMGE1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC0xLDI1ICsxLDQzIEBACiBzbmQtc29jLWFjOTctb2JqcyA6PSBhYzk3Lm8KK3NuZC1zb2MtYWQxOTgwLW9ianMgOj0gYWQxOTgwLm8KK3NuZC1zb2MtYWQ3MzMxMS1vYmpzIDo9IGFkNzMzMTEubwogc25kLXNvYy1hazQ1MzUtb2JqcyA6PSBhazQ1MzUubworc25kLXNvYy1jczQyNzAtb2JqcyA6PSBjczQyNzAubworc25kLXNvYy1zc20yNjAyLW9ianMgOj0gc3NtMjYwMi5vCitzbmQtc29jLXRsdjMyMGFpYzIzLW9ianMgOj0gdGx2MzIwYWljMjMubworc25kLXNvYy10bHYzMjBhaWMyNi1vYmpzIDo9IHRsdjMyMGFpYzI2Lm8KK3NuZC1zb2MtdGx2MzIwYWljM3gtb2JqcyA6PSB0bHYzMjBhaWMzeC5vCiBzbmQtc29jLXVkYTEzODAtb2JqcyA6PSB1ZGExMzgwLm8KIHNuZC1zb2Mtd204NTEwLW9ianMgOj0gd204NTEwLm8KK3NuZC1zb2Mtd204NTgwLW9ianMgOj0gd204NTgwLm8KIHNuZC1zb2Mtd204NzMxLW9ianMgOj0gd204NzMxLm8KIHNuZC1zb2Mtd204NzUwLW9ianMgOj0gd204NzUwLm8KIHNuZC1zb2Mtd204NzUzLW9ianMgOj0gd204NzUzLm8KK3NuZC1zb2Mtd204OTAwLW9ianMgOj0gd204OTAwLm8KK3NuZC1zb2Mtd204OTAzLW9ianMgOj0gd204OTAzLm8KK3NuZC1zb2Mtd204OTcxLW9ianMgOj0gd204OTcxLm8KIHNuZC1zb2Mtd204OTkwLW9ianMgOj0gd204OTkwLm8KIHNuZC1zb2Mtd205NzEyLW9ianMgOj0gd205NzEyLm8KIHNuZC1zb2Mtd205NzEzLW9ianMgOj0gd205NzEzLm8KLXNuZC1zb2MtY3M0MjcwLW9ianMgOj0gY3M0MjcwLm8KLXNuZC1zb2MtdGx2MzIwYWljM3gtb2JqcyA6PSB0bHYzMjBhaWMzeC5vCiAKIG9iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCitvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BSzQ1MzUpCSs9IHNuZC1zb2MtYWs0NTM1Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0NTNDI3MCkJKz0gc25kLXNvYy1jczQyNzAubworb2JqLSQoQ09ORklHX1NORF9TT0NfU1NNMjYwMikJKz0gc25kLXNvYy1zc20yNjAyLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzIzKQkrPSBzbmQtc29jLXRsdjMyMGFpYzIzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzI2KQkrPSBzbmQtc29jLXRsdjMyMGFpYzI2Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzNYKQkrPSBzbmQtc29jLXRsdjMyMGFpYzN4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1VEQTEzODApCSs9IHNuZC1zb2MtdWRhMTM4MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg1MTApCSs9IHNuZC1zb2Mtd204NTEwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dNODU4MCkJKz0gc25kLXNvYy13bTg1ODAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzMxKQkrPSBzbmQtc29jLXdtODczMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg3NTApCSs9IHNuZC1zb2Mtd204NzUwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc1MykJKz0gc25kLXNvYy13bTg3NTMubworb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTAwKQkrPSBzbmQtc29jLXdtODkwMC5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg5MDMpCSs9IHNuZC1zb2Mtd204OTAzLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dNODk3MSkJKz0gc25kLXNvYy13bTg5NzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTkwKQkrPSBzbmQtc29jLXdtODk5MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTk3MTIpCSs9IHNuZC1zb2Mtd205NzEyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNOTcxMykJKz0gc25kLXNvYy13bTk3MTMubwotb2JqLSQoQ09ORklHX1NORF9TT0NfQ1M0MjcwKQkrPSBzbmQtc29jLWNzNDI3MC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzWCkJKz0gc25kLXNvYy10bHYzMjBhaWMzeC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCmluZGV4IDYxZmQ5NmMuLmJkMWViZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCkBAIC0yLDggKzIsNyBAQAogICogYWM5Ny5jICAtLSAgQUxTQSBTb2MgQUM5NyBjb2RlYyBzdXBwb3J0CiAgKgogICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTdiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogYWQxOTgwLmMgIC0tICBBTFNBIFNvYyBBRDE5ODAgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodDoJQW5hbG9nIERldmljZSBJbmMuCisgKiBBdXRob3I6CVJveSBIdWFuZyA8cm95Lmh1YW5nQGFuYWxvZy5jb20+CisgKiAJCUNsaWZmIENhaSA8Y2xpZmYuY2FpQGFuYWxvZy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorCisjaW5jbHVkZSAiYWQxOTgwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWM5N19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKTsKK3N0YXRpYyBpbnQgYWM5N193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7CisKKy8qCisgKiBBRDE5ODAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGNvbnN0IHUxNiBhZDE5ODBfcmVnW10gPSB7CisJMHgwMDkwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAvKiAwIC0gNiAgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHg4MDA4LCAweDgwMDgsIC8qIDggLSBlICAqLworCTB4ODgwOCwgMHg4ODA4LCAweDAwMDAsIDB4ODgwOCwgLyogMTAgLSAxNiAqLworCTB4ODgwOCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgLyogMTggLSAxZSAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgLyogMjAgLSAyNiAqLworCTB4MDNjNywgMHgwMDAwLCAweGJiODAsIDB4YmI4MCwgLyogMjggLSAyZSAqLworCTB4YmI4MCwgMHhiYjgwLCAweDAwMDAsIDB4ODA4MCwgLyogMzAgLSAzNiAqLworCTB4ODA4MCwgMHgyMDAwLCAweDAwMDAsIDB4MDAwMCwgLyogMzggLSAzZSAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgLyogcmVzZXJ2ZWQgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8qIHJlc2VydmVkICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAvKiByZXNlcnZlZCAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgLyogcmVzZXJ2ZWQgKi8KKwkweDgwODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8qIDYwIC0gNjYgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8qIHJlc2VydmVkICovCisJMHgwMDAwLCAweDAwMDAsIDB4MTAwMSwgMHgwMDAwLCAvKiA3MCAtIDc2ICovCisJMHgwMDAwLCAweDAwMDAsIDB4NDE0NCwgMHg1MzcwICAvKiA3OCAtIDdlICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWQxOTgwX3JlY19zZWxbXSA9IHsiTWljIiwgIkNEIiwgIk5DIiwgIkFVWCIsICJMaW5lIiwKKwkJIlN0ZXJlbyBNaXgiLCAiTW9ubyBNaXgiLCAiUGhvbmUifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZDE5ODBfY2FwX3NyYyA9CisJU09DX0VOVU1fRE9VQkxFKEFDOTdfUkVDX1NFTCwgOCwgMCwgNywgYWQxOTgwX3JlY19zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzW10gPSB7CitTT0NfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVIsIDgsIDAsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X01BU1RFUiwgMTUsIDEsIDEpLAorCitTT0NfRE9VQkxFKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19IRUFEUEhPTkUsIDgsIDAsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X0hFQURQSE9ORSwgMTUsIDEsIDEpLAorCitTT0NfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19QQ00sIDgsIDAsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDTSwgMTUsIDEsIDEpLAorCitTT0NfRE9VQkxFKCJQQ00gQ2FwdHVyZSBWb2x1bWUiLCBBQzk3X1JFQ19HQUlOLCA4LCAwLCAzMSwgMCksCitTT0NfU0lOR0xFKCJQQ00gQ2FwdHVyZSBTd2l0Y2giLCBBQzk3X1JFQ19HQUlOLCAxNSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVJfTU9OTywgMCwgMzEsIDEpLAorU09DX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X01BU1RFUl9NT05PLCAxNSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIlBob25lIENhcHR1cmUgVm9sdW1lIiwgQUM5N19QSE9ORSwgMCwgMzEsIDEpLAorU09DX1NJTkdMRSgiUGhvbmUgQ2FwdHVyZSBTd2l0Y2giLCBBQzk3X1BIT05FLCAxNSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIk1pYyBWb2x1bWUiLCBBQzk3X01JQywgMCwgMzEsIDEpLAorU09DX1NJTkdMRSgiTWljIFN3aXRjaCIsIEFDOTdfTUlDLCAxNSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIlN0ZXJlbyBNaWMgU3dpdGNoIiwgQUM5N19BRF9NSVNDLCA2LCAxLCAwKSwKK1NPQ19ET1VCTEUoIkxpbmUgSFAgU3dhcCBTd2l0Y2giLCBBQzk3X0FEX01JU0MsIDEwLCA1LCAxLCAwKSwKKworU09DX0RPVUJMRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19TVVJST1VORF9NQVNURVIsIDgsIDAsIDMxLCAxKSwKK1NPQ19ET1VCTEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAxNSwgNywgMSwgMSksCisKK1NPQ19FTlVNKCJDYXB0dXJlIFNvdXJjZSIsIGFkMTk4MF9jYXBfc3JjKSwKKworU09DX1NJTkdMRSgiTWljIEJvb3N0IFN3aXRjaCIsIEFDOTdfTUlDLCA2LCAxLCAwKSwKK307CisKKy8qIGFkZCBub24gZGFwbSBjb250cm9scyAqLworc3RhdGljIGludCBhZDE5ODBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLCBzbmRfc29jX2NuZXcoCisJCQkJJmFkMTk4MF9zbmRfYWM5N19jb250cm9sc1tpXSwgY29kZWMsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQUM5N19SRVNFVDoKKwljYXNlIEFDOTdfSU5UX1BBR0lORzoKKwljYXNlIEFDOTdfUE9XRVJET1dOOgorCWNhc2UgQUM5N19FWFRFTkRFRF9TVEFUVVM6CisJY2FzZSBBQzk3X1ZFTkRPUl9JRDE6CisJY2FzZSBBQzk3X1ZFTkRPUl9JRDI6CisJCXJldHVybiBzb2NfYWM5N19vcHMucmVhZChjb2RlYy0+YWM5NywgcmVnKTsKKwlkZWZhdWx0OgorCQlyZWcgPSByZWcgPj4gMTsKKworCQlpZiAocmVnID49IChBUlJBWV9TSVpFKGFkMTk4MF9yZWcpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBjYWNoZVtyZWddOworCX0KK30KKworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJc29jX2FjOTdfb3BzLndyaXRlKGNvZGVjLT5hYzk3LCByZWcsIHZhbCk7CisJcmVnID0gcmVnID4+IDE7CisJaWYgKHJlZyA8IChBUlJBWV9TSVpFKGFkMTk4MF9yZWcpKSkKKwkJY2FjaGVbcmVnXSA9IHZhbDsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19kYWkgYWQxOTgwX2RhaSA9IHsKKwkubmFtZSA9ICJBQzk3IiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsIH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwgfSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhZDE5ODBfZGFpKTsKKworc3RhdGljIGludCBhZDE5ODBfcmVzZXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdHJ5X3dhcm0pCit7CisJdTE2IHJldHJ5X2NudCA9IDA7CisKK3JldHJ5OgorCWlmICh0cnlfd2FybSAmJiBzb2NfYWM5N19vcHMud2FybV9yZXNldCkgeworCQlzb2NfYWM5N19vcHMud2FybV9yZXNldChjb2RlYy0+YWM5Nyk7CisJCWlmIChhYzk3X3JlYWQoY29kZWMsIEFDOTdfUkVTRVQpID09IDB4MDA5MCkKKwkJCXJldHVybiAxOworCX0KKworCXNvY19hYzk3X29wcy5yZXNldChjb2RlYy0+YWM5Nyk7CisJLyogU2V0IGJpdCAxNnNsb3QgaW4gcmVnaXN0ZXIgNzRoLCB0aGVuIGV2ZXJ5IHNsb3Qgd2lsbCBoYXMgb25seSAxNgorCSAqIGJpdHMuIFRoaXMgY29tbWFuZCBpcyBzZW50IG91dCBpbiAyMGJpdCBtb2RlLCBpbiB3aGljaCBjYXNlIHRoZQorCSAqIGZpcnN0IG5pYmJsZSBvZiBkYXRhIGlzIGVhdGVuIGJ5IHRoZSBhZGRyLiAoVGFnIGlzIGFsd2F5cyAxNiBiaXQpKi8KKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X0FEX1NFUklBTF9DRkcsIDB4OTkwMCk7CisKKwlpZiAoYWM5N19yZWFkKGNvZGVjLCBBQzk3X1JFU0VUKSAgIT0gMHgwMDkwKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMDsKKworZXJyOgorCXdoaWxlIChyZXRyeV9jbnQrKyA8IDEwKQorCQlnb3RvIHJldHJ5OworCisJcHJpbnRrKEtFUk5fRVJSICJBRDE5ODAgQUM5NyByZXNldCBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFkMTk4MF9zb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmVuZG9yX2lkMjsKKworCXByaW50ayhLRVJOX0lORk8gIkFEMTk4MCBTb0MgQXVkaW8gQ29kZWNcbiIpOworCisJc29jZGV2LT5jb2RlYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNvY2Rldi0+Y29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisKKwljb2RlYy0+cmVnX2NhY2hlID0KKwkJa3phbGxvYyhzaXplb2YodTE2KSAqIEFSUkFZX1NJWkUoYWQxOTgwX3JlZyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjYWNoZV9lcnI7CisJfQorCW1lbWNweShjb2RlYy0+cmVnX2NhY2hlLCBhZDE5ODBfcmVnLCBzaXplb2YodTE2KSAqIFwKKwkJCUFSUkFZX1NJWkUoYWQxOTgwX3JlZykpOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IHNpemVvZih1MTYpICogQVJSQVlfU0laRShhZDE5ODBfcmVnKTsKKwljb2RlYy0+cmVnX2NhY2hlX3N0ZXAgPSAyOworCWNvZGVjLT5uYW1lID0gIkFEMTk4MCI7CisJY29kZWMtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY29kZWMtPmRhaSA9ICZhZDE5ODBfZGFpOworCWNvZGVjLT5udW1fZGFpID0gMTsKKwljb2RlYy0+d3JpdGUgPSBhYzk3X3dyaXRlOworCWNvZGVjLT5yZWFkID0gYWM5N19yZWFkOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCisJcmV0ID0gc25kX3NvY19uZXdfYWM5N19jb2RlYyhjb2RlYywgJnNvY19hYzk3X29wcywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDE5ODA6IGZhaWxlZCB0byByZWdpc3RlciBBQzk3IGNvZGVjXG4iKTsKKwkJZ290byBjb2RlY19lcnI7CisJfQorCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcGNtX2VycjsKKworCisJcmV0ID0gYWQxOTgwX3Jlc2V0KGNvZGVjLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDOTcgbGluayBlcnJvclxuIik7CisJCWdvdG8gcmVzZXRfZXJyOworCX0KKworCS8qIFJlYWQgb3V0IHZlbmRvciBJRCB0byBtYWtlIHN1cmUgaXQgaXMgYWQxOTgwICovCisJaWYgKGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSAhPSAweDQxNDQpCisJCWdvdG8gcmVzZXRfZXJyOworCisJdmVuZG9yX2lkMiA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQyKTsKKworCWlmICh2ZW5kb3JfaWQyICE9IDB4NTM3MCkgeworCQlpZiAodmVuZG9yX2lkMiAhPSAweDUzNzQpCisJCQlnb3RvIHJlc2V0X2VycjsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxOTgwOiAiCisJCQkJIkZvdW5kIEFEMTk4MSAtIG9ubHkgMi8yIElOL09VVCBDaGFubmVscyAiCisJCQkJInN1cHBvcnRlZFxuIik7CisJfQorCisJYWM5N193cml0ZShjb2RlYywgQUM5N19NQVNURVIsIDB4MDAwMCk7IC8qIHVubXV0ZSBsaW5lIG91dCB2b2x1bWUgKi8KKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X1BDTSwgMHgwMDAwKTsJLyogdW5tdXRlIFBDTSBvdXQgdm9sdW1lICovCisJYWM5N193cml0ZShjb2RlYywgQUM5N19SRUNfR0FJTiwgMHgwMDAwKTsvKiB1bm11dGUgcmVjb3JkIHZvbHVtZSAqLworCisJYWQxOTgwX2FkZF9jb250cm9scyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDE5ODA6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byByZXNldF9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK3Jlc2V0X2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCitwY21fZXJyOgorCXNuZF9zb2NfZnJlZV9hYzk3X2NvZGVjKGNvZGVjKTsKKworY29kZWNfZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCitjYWNoZV9lcnI6CisJa2ZyZWUoc29jZGV2LT5jb2RlYyk7CisJc29jZGV2LT5jb2RlYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDE5ODBfc29jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyhjb2RlYyk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoY29kZWMpOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl9hZDE5ODAgPSB7CisJLnByb2JlID0gCWFkMTk4MF9zb2NfcHJvYmUsCisJLnJlbW92ZSA9IAlhZDE5ODBfc29jX3JlbW92ZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X2FkMTk4MCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBhZDE5ODAgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSb3kgSHVhbmcsIENsaWZmIENhaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2Yzg1MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGFkMTk4MC5oICAtLSAgYWQxOTgwIFNvYyBBdWRpbyBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9BRDE5ODBfSAorI2RlZmluZSBfQUQxOTgwX0gKKy8qIEJpdCBkZWZpbml0aW9uIG9mIFBvd2VyLURvd24gQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURDCQkweDAwMDEKKyNkZWZpbmUgREFDCQkweDAwMDIKKyNkZWZpbmUgQU5MCQkweDAwMDQKKyNkZWZpbmUgUkVGCQkweDAwMDgKKyNkZWZpbmUgUFIwCQkweDAxMDAKKyNkZWZpbmUgUFIxCQkweDAyMDAKKyNkZWZpbmUgUFIyCQkweDA0MDAKKyNkZWZpbmUgUFIzCQkweDA4MDAKKyNkZWZpbmUgUFI0CQkweDEwMDAKKyNkZWZpbmUgUFI1CQkweDIwMDAKKyNkZWZpbmUgUFI2CQkweDQwMDAKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSBhZDE5ODBfZGFpOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X2FkMTk4MDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWY4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIGFkNzMzMTEuYyAgLS0gIEFMU0EgU29jIEFENzMzMTEgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodDoJQW5hbG9nIERldmljZSBJbmMuCisgKiBBdXRob3I6CUNsaWZmIENhaSA8Y2xpZmYuY2FpQGFuYWxvZy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDI1dGggU2VwIDIwMDggICBJbml0aWFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlICJhZDczMzExLmgiCisKK3N0cnVjdCBzbmRfc29jX2RhaSBhZDczMzExX2RhaSA9IHsKKwkubmFtZSA9ICJBRDczMzExIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMSwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwgfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDEsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsIH0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYWQ3MzMxMV9kYWkpOworCitzdGF0aWMgaW50IGFkNzMzMTFfc29jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IHJldCA9IDA7CisKKwljb2RlYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisJY29kZWMtPm5hbWUgPSAiQUQ3MzMxMSI7CisJY29kZWMtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY29kZWMtPmRhaSA9ICZhZDczMzExX2RhaTsKKwljb2RlYy0+bnVtX2RhaSA9IDE7CisJc29jZGV2LT5jb2RlYyA9IGNvZGVjOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDczMzExOiBmYWlsZWQgdG8gY3JlYXRlIHBjbXNcbiIpOworCQlnb3RvIHBjbV9lcnI7CisJfQorCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDczMzExOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gcmVnaXN0ZXJfZXJyOworCX0KKworCXJldHVybiByZXQ7CisKK3JlZ2lzdGVyX2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworcGNtX2VycjoKKwlrZnJlZShzb2NkZXYtPmNvZGVjKTsKKwlzb2NkZXYtPmNvZGVjID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzMzMTFfc29jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCWtmcmVlKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfYWQ3MzMxMSA9IHsKKwkucHJvYmUgPSAJYWQ3MzMxMV9zb2NfcHJvYmUsCisJLnJlbW92ZSA9IAlhZDczMzExX3NvY19yZW1vdmUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl9hZDczMzExKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIGFkNzMzMTEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkgIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2NlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogRmlsZTogICAgICAgICBzb3VuZC9zb2MvY29kZWMvYWQ3MzMxMS5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjogICAgICAgQ2xpZmYgQ2FpIDxjbGlmZi5jYWlAYW5hbG9nLmNvbT4KKyAqCisgKiBDcmVhdGVkOiAgICAgIFRodXIgU2VwIDI1LCAyMDA4CisgKiBEZXNjcmlwdGlvbjogIGRlZmluaXRpb25zIGZvciBBRDczMzExIHJlZ2lzdGVycworICoKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDYgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19BRDczMzExX0hfXworI2RlZmluZSBfX0FENzMzMTFfSF9fCisKKyNkZWZpbmUgQURfQ09OVFJPTAkweDgwMDAKKyNkZWZpbmUgQURfREFUQQkJMHgwMDAwCisjZGVmaW5lIEFEX1JFQUQJCTB4NDAwMAorI2RlZmluZSBBRF9XUklURQkweDAwMDAKKworLyogQ29udHJvbCByZWdpc3RlciBBICovCisjZGVmaW5lIENUUkxfUkVHX0EJKDAgPDwgOCkKKworI2RlZmluZSBSRUdBX01PREVfUFJPCTB4MDAKKyNkZWZpbmUgUkVHQV9NT0RFX0RBVEEJMHgwMQorI2RlZmluZSBSRUdBX01PREVfTUlYRUQJMHgwMworI2RlZmluZSBSRUdBX0RMQgkJMHgwNAorI2RlZmluZSBSRUdBX1NMQgkJMHgwOAorI2RlZmluZSBSRUdBX0RFVkMoeCkJCSgoeCAmIDB4NykgPDwgNCkKKyNkZWZpbmUgUkVHQV9SRVNFVAkJMHg4MAorCisvKiBDb250cm9sIHJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgQ1RSTF9SRUdfQgkoMSA8PCA4KQorCisjZGVmaW5lIFJFR0JfRElSQVRFKHgpCSh4ICYgMHgzKQorI2RlZmluZSBSRUdCX1NDRElWKHgpCSgoeCAmIDB4MykgPDwgMikKKyNkZWZpbmUgUkVHQl9NQ0RJVih4KQkoKHggJiAweDcpIDw8IDQpCisjZGVmaW5lIFJFR0JfQ0VFCQkoMSA8PCA3KQorCisvKiBDb250cm9sIHJlZ2lzdGVyIEMgKi8KKyNkZWZpbmUgQ1RSTF9SRUdfQwkoMiA8PCA4KQorCisjZGVmaW5lIFJFR0NfUFVERVYJCSgxIDw8IDApCisjZGVmaW5lIFJFR0NfUFVBREMJCSgxIDw8IDMpCisjZGVmaW5lIFJFR0NfUFVEQUMJCSgxIDw8IDQpCisjZGVmaW5lIFJFR0NfUFVSRUYJCSgxIDw8IDUpCisjZGVmaW5lIFJFR0NfUkVGVVNFCQkoMSA8PCA2KQorCisvKiBDb250cm9sIHJlZ2lzdGVyIEQgKi8KKyNkZWZpbmUgQ1RSTF9SRUdfRAkoMyA8PCA4KQorCisjZGVmaW5lIFJFR0RfSUdTKHgpCQkoeCAmIDB4NykKKyNkZWZpbmUgUkVHRF9STU9ECQkoMSA8PCAzKQorI2RlZmluZSBSRUdEX09HUyh4KQkJKCh4ICYgMHg3KSA8PCA0KQorI2RlZmluZSBSRUdEX01VVEUJCSh4IDw8IDcpCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgRSAqLworI2RlZmluZSBDVFJMX1JFR19FCSg0IDw8IDgpCisKKyNkZWZpbmUgUkVHRV9EQSh4KQkJKHggJiAweDFmKQorI2RlZmluZSBSRUdFX0lCWVAJCSgxIDw8IDUpCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgRiAqLworI2RlZmluZSBDVFJMX1JFR19GCSg1IDw8IDgpCisKKyNkZWZpbmUgUkVHRl9TRUVOCQkoMSA8PCA1KQorI2RlZmluZSBSRUdGX0lOVgkJKDEgPDwgNikKKyNkZWZpbmUgUkVHRl9BTEIJCSgxIDw8IDcpCisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWkgYWQ3MzMxMV9kYWk7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfYWQ3MzMxMTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKaW5kZXggN2RhOWY0NjcuLjJhODliNTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAiYWs0NTM1LmgiCiAKLSNkZWZpbmUgQVVESU9fTkFNRSAiYWs0NTM1IgogI2RlZmluZSBBSzQ1MzVfVkVSU0lPTiAiMC4zIgogCiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl9hazQ1MzU7CkBAIC01MzUsODcgKzUzNCw4NSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9BSzQ1MzUgMHhmZWZlIC8qIGxpYW0gLSAgbmVlZCBhIHByb3BlciBpZCAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLwotSTJDX0NMSUVOVF9JTlNNT0Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhazQ1MzVfaTJjX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KLS8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAgIGFyb3VuZCAqLwotc3RhdGljIGludCBhazQ1MzVfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCitzdGF0aWMgaW50IGFrNDUzNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBhazQ1MzVfc29jZGV2OwotCXN0cnVjdCBhazQ1MzVfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwogCWludCByZXQ7CiAKLQlpZiAoYWRkciAhPSBzZXR1cC0+aTJjX2FkZHJlc3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwotCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQotCWkyYyA9IGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChpMmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAotCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gYXR0YWNoIGNvZGVjIGF0IGFkZHIgJXhcbiIsIGFkZHIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlyZXQgPSBhazQ1MzVfaW5pdChzb2NkZXYpOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpc2UgQUs0NTM1XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCXJldHVybiByZXQ7CiAKLWVycjoKLQlrZnJlZShpMmMpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYWs0NTM1X2kyY19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgYWs0NTM1X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWs0NTM1X2kyY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgYWs0NTM1X2NvZGVjX3Byb2JlKTsKLX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhazQ1MzVfaTJjX2lkW10gPSB7CisJeyAiYWs0NTM1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhazQ1MzVfaTJjX2lkKTsKIAotLyogY29yZ2kgaTJjIGNvZGVjIGNvbnRyb2wgbGF5ZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhazQ1MzVfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJBSzQ1MzUgSTJDIENvZGVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkuaWQgPSAgICAgICAgICAgICBJMkNfRFJJVkVSSURfQUs0NTM1LAotCS5hdHRhY2hfYWRhcHRlciA9IGFrNDUzNV9pMmNfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50ID0gIGFrNDUzNV9pMmNfZGV0YWNoLAotCS5jb21tYW5kID0gICAgICAgIE5VTEwsCisJLnByb2JlID0gICAgYWs0NTM1X2kyY19wcm9iZSwKKwkucmVtb3ZlID0gICBhazQ1MzVfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBhazQ1MzVfaTJjX2lkLAogfTsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICAgIkFLNDUzNSIsCi0JLmRyaXZlciA9ICZhazQ1MzVfaTJjX2RyaXZlciwKLX07CitzdGF0aWMgaW50IGFrNDUzNV9hZGRfaTJjX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgYWs0NTM1X3NldHVwX2RhdGEgKnNldHVwKQoreworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmYWs0NTM1X2kyY19kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRyaXZlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisJaW5mby5hZGRyID0gc2V0dXAtPmkyY19hZGRyZXNzOworCXN0cmxjcHkoaW5mby50eXBlLCAiYWs0NTM1IiwgSTJDX05BTUVfU0laRSk7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHNldHVwLT5pMmNfYnVzKTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGkyYyBhZGFwdGVyICVkXG4iLAorCQkJc2V0dXAtPmkyY19idXMpOworCQlnb3RvIGVycl9kcml2ZXI7CisJfQorCisJY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmluZm8pOworCWkyY19wdXRfYWRhcHRlcihhZGFwdGVyKTsKKwlpZiAoIWNsaWVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRldmljZSBhdCAweCV4XG4iLAorCQkJKHVuc2lnbmVkIGludClpbmZvLmFkZHIpOworCQlnb3RvIGVycl9kcml2ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kcml2ZXI6CisJaTJjX2RlbF9kcml2ZXIoJmFrNDUzNV9pMmNfZHJpdmVyKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IGFrNDUzNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNjI0LDcgKzYyMSw3IEBACiAJc3RydWN0IGFrNDUzNV9zZXR1cF9kYXRhICpzZXR1cDsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJc3RydWN0IGFrNDUzNV9wcml2ICphazQ1MzU7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCXByaW50ayhLRVJOX0lORk8gIkFLNDUzNSBBdWRpbyBDb2RlYyAlcyIsIEFLNDUzNV9WRVJTSU9OKTsKIApAQCAtNjQ2LDE3ICs2NDMsMTQgQEAKIAlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOwogCiAJYWs0NTM1X3NvY2RldiA9IHNvY2RldjsKKwlyZXQgPSAtRU5PREVWOworCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKLQkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKIAkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwogCQljb2RlYy0+aHdfcmVhZCA9IChod19yZWFkX3QpaTJjX21hc3Rlcl9yZWN2OwotCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmYWs0NTM1X2kyY19kcml2ZXIpOwotCQlpZiAocmV0ICE9IDApCi0JCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJCXJldCA9IGFrNDUzNV9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CiAJfQotI2Vsc2UKLQkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCiAjZW5kaWYKIAogCWlmIChyZXQgIT0gMCkgewpAQCAtNjc4LDYgKzY3Miw3IEBACiAJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKIAlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY29kZWMtPmNvbnRyb2xfZGF0YSk7CiAJaTJjX2RlbF9kcml2ZXIoJmFrNDUzNV9pMmNfZHJpdmVyKTsKICNlbmRpZgogCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmgKaW5kZXggZTlmZTMwZS4uYzdhNTg3MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5oCkBAIC0zNyw2ICszNyw3IEBACiAjZGVmaW5lIEFLNDUzNV9DQUNIRVJFR05VTSAJMHgxMAogCiBzdHJ1Y3QgYWs0NTM1X3NldHVwX2RhdGEgeworCWludCAgICAgICAgICAgIGkyY19idXM7CiAJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwppbmRleCA5ZGViOGM3Li4wYmJkOTQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKQEAgLTQ5MCwzNCArNDkwLDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBpbnQgY3M0MjcwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCk7Ci0KLS8qCi0gKiBOb3RpZnkgdGhlIGRyaXZlciB0aGF0IGEgbmV3IEkyQyBidXMgaGFzIGJlZW4gZm91bmQuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggSTJDIGJ1cyBpbiB0aGUgc3lzdGVtLiAgVGhlIGZ1bmN0aW9uCi0gKiB0aGVuIGFza3MgdGhlIEkyQyBzdWJzeXN0ZW0gdG8gcHJvYmUgdGhhdCBidXMgYXQgdGhlIGFkZHJlc3NlcyBvbiB3aGljaAotICogb3VyIGRldmljZSAodGhlIENTNDI3MCkgY291bGQgZXhpc3QuICBJZiBhIGRldmljZSBpcyBmb3VuZCBhdCBvbmUgb2YKLSAqIHRob3NlIGFkZHJlc3NlcywgdGhlbiBvdXIgcHJvYmUgZnVuY3Rpb24gKGNzNDI3MF9pMmNfcHJvYmUpIGlzIGNhbGxlZC4KLSAqLwotc3RhdGljIGludCBjczQyNzBfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBjczQyNzBfaTJjX3Byb2JlKTsKLX0KLQotc3RhdGljIGludCBjczQyNzBfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gTlVMTDsKLQotCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWNvZGVjLT5yZWdfY2FjaGUgPSBOVUxMOwotCi0Ja2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbnQgY3M0MjcwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqLCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqKTsKIAogLyogQSBsaXN0IG9mIG5vbi1EQVBNIGNvbnRyb2xzIHRoYXQgdGhlIENTNDI3MCBzdXBwb3J0cyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzNDI3MF9zbmRfY29udHJvbHNbXSA9IHsKQEAgLTUyNSwxNCArNDk4LDE5IEBACiAJCUNTNDI3MF9WT0xBLCBDUzQyNzBfVk9MQiwgMCwgMHhGRiwgMSkKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjczQyNzBfaWRbXSA9IHsKKwl7ImNzNDI3MCIsIDB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNzNDI3MF9pZCk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjczQyNzBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJDUzQyNzAgSTJDIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkuaWQgPSAgICAgICAgICAgICBJMkNfRFJJVkVSSURfQ1M0MjcwLAotCS5hdHRhY2hfYWRhcHRlciA9IGNzNDI3MF9pMmNfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50ID0gIGNzNDI3MF9pMmNfZGV0YWNoLAorCS5pZF90YWJsZSA9IGNzNDI3MF9pZCwKKwkucHJvYmUgPSBjczQyNzBfaTJjX3Byb2JlLAogfTsKIAogLyoKQEAgLTU2MSwxMSArNTM5LDExIEBACiAgKiBOb3RlOiBzbmRfc29jX25ld19wY21zKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCwKICAqIGJlY2F1c2Ugb2Ygc25kX2N0bF9hZGQoKS4KICAqLwotc3RhdGljIGludCBjczQyNzBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kKQorc3RhdGljIGludCBjczQyNzBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IGNzNDI3MF9zb2NkZXY7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCA9IE5VTEw7CiAJaW50IGk7CiAJaW50IHJldCA9IDA7CiAKQEAgLTU3OCwxMiArNTU2LDYgQEAKIAogCS8qIE5vdGU6IGNvZGVjX2RhaS0+Y29kZWMgaXMgTlVMTCBoZXJlICovCiAKLQlpMmNfY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWkyY19jbGllbnQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQyNzA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJMkMgY2xpZW50XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJY29kZWMtPnJlZ19jYWNoZSA9IGt6YWxsb2MoQ1M0MjcwX05VTVJFR1MsIEdGUF9LRVJORUwpOwogCWlmICghY29kZWMtPnJlZ19jYWNoZSkgewogCQlwcmludGsoS0VSTl9FUlIgImNzNDI3MDogY291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGNhY2hlXG4iKTsKQEAgLTU5MSwxMyArNTYzLDYgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY29kZWMpOwotCXN0cmNweShpMmNfY2xpZW50LT5uYW1lLCAiQ1M0MjcwIik7Ci0KLQlpMmNfY2xpZW50LT5kcml2ZXIgPSAmY3M0MjcwX2kyY19kcml2ZXI7Ci0JaTJjX2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JaTJjX2NsaWVudC0+YWRkciA9IGFkZHI7Ci0KIAkvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgQ1M0MjcwICovCiAKIAlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoaTJjX2NsaWVudCwgQ1M0MjcwX0NISVBJRCk7CkBAIC02MTIsMTggKzU3NywxMCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gImNzNDI3MDogZm91bmQgZGV2aWNlIGF0IEkyQyBhZGRyZXNzICVYXG4iLCBhZGRyKTsKKwlwcmludGsoS0VSTl9JTkZPICJjczQyNzA6IGZvdW5kIGRldmljZSBhdCBJMkMgYWRkcmVzcyAlWFxuIiwKKwkJaTJjX2NsaWVudC0+YWRkcik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjcwOiBoYXJkd2FyZSByZXZpc2lvbiAlWFxuIiwgcmV0ICYgMHhGKTsKIAotCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KLQotCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyY19jbGllbnQpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQyNzA6IGNvdWxkIG5vdCBhdHRhY2ggY29kZWMsICIKLQkJCSJJMkMgYWRkcmVzcyAleCwgZXJyb3IgY29kZSAlaVxuIiwgYWRkciwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjX2NsaWVudDsKIAljb2RlYy0+cmVhZCA9IGNzNDI3MF9yZWFkX3JlZ19jYWNoZTsKIAljb2RlYy0+d3JpdGUgPSBjczQyNzBfaTJjX3dyaXRlOwpAQCAtNjQ4LDIwICs2MDUsMTcgQEAKIAkJCWdvdG8gZXJyb3I7CiAJfQogCisJaTJjX3NldF9jbGllbnRkYXRhKGkyY19jbGllbnQsIGNvZGVjKTsKKwogCXJldHVybiAwOwogCiBlcnJvcjoKLQlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkgewotCQlpMmNfZGV0YWNoX2NsaWVudChpMmNfY2xpZW50KTsKLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IE5VTEw7Ci0JfQorCWNvZGVjLT5jb250cm9sX2RhdGEgPSBOVUxMOwogCiAJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CiAJY29kZWMtPnJlZ19jYWNoZSA9IE5VTEw7CiAJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gMDsKIAotCWtmcmVlKGkyY19jbGllbnQpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzI3LDcgKzY4MSw3IEBACiAJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImNzNDI3MDogZmFpbGVkIHRvIGNyZWF0ZSBQQ01zXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9mcmVlX2NvZGVjOwogCX0KIAogI2lmZGVmIFVTRV9JMkMKQEAgLTczNiw4ICs2OTAsNyBAQAogCXJldCA9IGkyY19hZGRfZHJpdmVyKCZjczQyNzBfaTJjX2RyaXZlcik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImNzNDI3MDogZmFpbGVkIHRvIGF0dGFjaCBkcml2ZXIiKTsKLQkJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9mcmVlX3BjbXM7CiAJfQogCiAJLyogRGlkIHdlIGZpbmQgYSBDUzQyNzAgb24gdGhlIEkyQyBidXM/ICovCkBAIC03NTksMTAgKzcxMiwyMyBAQAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY3M0MjcwOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7Ci0JCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfZGVsX2RyaXZlcjsKIAl9CiAKKwlyZXR1cm4gMDsKKworZXJyb3JfZGVsX2RyaXZlcjoKKyNpZmRlZiBVU0VfSTJDCisJaTJjX2RlbF9kcml2ZXIoJmNzNDI3MF9pMmNfZHJpdmVyKTsKKworZXJyb3JfZnJlZV9wY21zOgorI2VuZGlmCisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKworZXJyb3JfZnJlZV9jb2RlYzoKKwlrZnJlZShzb2NkZXYtPmNvZGVjKTsKKwlzb2NkZXYtPmNvZGVjID0gTlVMTDsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc3Myw4ICs3MzksNyBAQAogCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CiAKICNpZmRlZiBVU0VfSTJDCi0JaWYgKHNvY2Rldi0+Y29kZWMtPmNvbnRyb2xfZGF0YSkKLQkJaTJjX2RlbF9kcml2ZXIoJmNzNDI3MF9pMmNfZHJpdmVyKTsKKwlpMmNfZGVsX2RyaXZlcigmY3M0MjcwX2kyY19kcml2ZXIpOwogI2VuZGlmCiAKIAlrZnJlZShzb2NkZXYtPmNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlZjBkYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jCkBAIC0wLDAgKzEsNzc1IEBACisvKgorICogRmlsZTogICAgICAgICBzb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYworICogQXV0aG9yOiAgICAgICBDbGlmZiBDYWkgPENsaWZmLkNhaUBhbmFsb2cuY29tPgorICoKKyAqIENyZWF0ZWQ6ICAgICAgVHVlIEp1bmUgMDYgMjAwOAorICogRGVzY3JpcHRpb246ICBEcml2ZXIgZm9yIHNzbTI2MDIgc291bmQgY2hpcAorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaW5jbHVkZSAic3NtMjYwMi5oIgorCisjZGVmaW5lIFNTTTI2MDJfVkVSU0lPTiAiMC4xIgorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl9zc20yNjAyOworCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBzc20yNjAyX3ByaXYgeworCXVuc2lnbmVkIGludCBzeXNjbGs7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICptYXN0ZXJfc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2xhdmVfc3Vic3RyZWFtOworfTsKKworLyoKKyAqIHNzbTI2MDIgcmVnaXN0ZXIgY2FjaGUKKyAqIFdlIGNhbid0IHJlYWQgdGhlIHNzbTI2MDIgcmVnaXN0ZXIgc3BhY2Ugd2hlbiB3ZSBhcmUKKyAqIHVzaW5nIDIgd2lyZSBmb3IgZGV2aWNlIGNvbnRyb2wsIHNvIHdlIGNhY2hlIHRoZW0gaW5zdGVhZC4KKyAqIFRoZXJlIGlzIG5vIHBvaW50IGluIGNhY2hpbmcgdGhlIHJlc2V0IHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBjb25zdCB1MTYgc3NtMjYwMl9yZWdbU1NNMjYwMl9DQUNIRVJFR05VTV0gPSB7CisJMHgwMDE3LCAweDAwMTcsIDB4MDA3OSwgMHgwMDc5LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwYSwKKwkweDAwMDAsIDB4MDAwMAorfTsKKworLyoKKyAqIHJlYWQgc3NtMjYwMiByZWdpc3RlciBjYWNoZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzc20yNjAyX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPT0gU1NNMjYwMl9SRVNFVCkKKwkJcmV0dXJuIDA7CisJaWYgKHJlZyA+PSBTU00yNjAyX0NBQ0hFUkVHTlVNKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKKy8qCisgKiB3cml0ZSBzc20yNjAyIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzc20yNjAyX3dyaXRlX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdTE2IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPj0gU1NNMjYwMl9DQUNIRVJFR05VTSkKKwkJcmV0dXJuOworCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworLyoKKyAqIHdyaXRlIHRvIHRoZSBzc20yNjAyIHJlZ2lzdGVyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgc3NtMjYwMl93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJdW5zaWduZWQgaW50IHZhbHVlKQoreworCXU4IGRhdGFbMl07CisKKwkvKiBkYXRhIGlzCisJICogICBEMTUuLkQ5IHNzbTI2MDIgcmVnaXN0ZXIgb2Zmc2V0CisJICogICBEOC4uLkQwIHJlZ2lzdGVyIGRhdGEKKwkgKi8KKwlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICgodmFsdWUgPj4gOCkgJiAweDAwMDEpOworCWRhdGFbMV0gPSB2YWx1ZSAmIDB4MDBmZjsKKworCXNzbTI2MDJfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgc3NtMjYwMl9yZXNldChjKQlzc20yNjAyX3dyaXRlKGMsIFNTTTI2MDJfUkVTRVQsIDApCisKKy8qQXBwZW5kaW5nIHNldmVyYWwgIk5vbmUicyBqdXN0IGZvciBPU1MgbWl4ZXIgdXNlKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzc20yNjAyX2lucHV0X3NlbGVjdFtdID0geworCSJMaW5lIiwgIk1pYyIsICJOb25lIiwgIk5vbmUiLCAiTm9uZSIsCisJIk5vbmUiLCAiTm9uZSIsICJOb25lIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzc20yNjAyX2RlZW1waFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzc20yNjAyX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEUoU1NNMjYwMl9BUEFOQSwgMiwgMiwgc3NtMjYwMl9pbnB1dF9zZWxlY3QpLAorCVNPQ19FTlVNX1NJTkdMRShTU00yNjAyX0FQRElHSSwgMSwgNCwgc3NtMjYwMl9kZWVtcGgpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNzbTI2MDJfc25kX2NvbnRyb2xzW10gPSB7CisKK1NPQ19ET1VCTEVfUigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIFNTTTI2MDJfTE9VVDFWLCBTU00yNjAyX1JPVVQxViwKKwkwLCAxMjcsIDApLAorU09DX0RPVUJMRV9SKCJNYXN0ZXIgUGxheWJhY2sgWkMgU3dpdGNoIiwgU1NNMjYwMl9MT1VUMVYsIFNTTTI2MDJfUk9VVDFWLAorCTcsIDEsIDApLAorCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgVm9sdW1lIiwgU1NNMjYwMl9MSU5WT0wsIFNTTTI2MDJfUklOVk9MLCAwLCAzMSwgMCksCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgU3dpdGNoIiwgU1NNMjYwMl9MSU5WT0wsIFNTTTI2MDJfUklOVk9MLCA3LCAxLCAxKSwKKworU09DX1NJTkdMRSgiTWljIEJvb3N0ICgrMjBkQikiLCBTU00yNjAyX0FQQU5BLCAwLCAxLCAwKSwKK1NPQ19TSU5HTEUoIk1pYyBTd2l0Y2giLCBTU00yNjAyX0FQQU5BLCAxLCAxLCAxKSwKKworU09DX1NJTkdMRSgiU2lkZXRvbmUgUGxheWJhY2sgVm9sdW1lIiwgU1NNMjYwMl9BUEFOQSwgNiwgMywgMSksCisKK1NPQ19TSU5HTEUoIkFEQyBIaWdoIFBhc3MgRmlsdGVyIFN3aXRjaCIsIFNTTTI2MDJfQVBESUdJLCAwLCAxLCAxKSwKK1NPQ19TSU5HTEUoIlN0b3JlIERDIE9mZnNldCBTd2l0Y2giLCBTU00yNjAyX0FQRElHSSwgNCwgMSwgMCksCisKK1NPQ19FTlVNKCJDYXB0dXJlIFNvdXJjZSIsIHNzbTI2MDJfZW51bVswXSksCisKK1NPQ19FTlVNKCJQbGF5YmFjayBEZS1lbXBoYXNpcyIsIHNzbTI2MDJfZW51bVsxXSksCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgc3NtMjYwMl9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBlcnIsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzc20yNjAyX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCXNuZF9zb2NfY25ldygmc3NtMjYwMl9zbmRfY29udHJvbHNbaV0sIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3NtMjYwMl9vdXRwdXRfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgU1NNMjYwMl9BUEFOQSwgMywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIk1pYyBTaWRldG9uZSBTd2l0Y2giLCBTU00yNjAyX0FQQU5BLCA1LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiSGlGaSBQbGF5YmFjayBTd2l0Y2giLCBTU00yNjAyX0FQQU5BLCA0LCAxLCAwKSwKK307CisKKy8qIElucHV0IG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNzbTI2MDJfaW5wdXRfbXV4X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIklucHV0IFNlbGVjdCIsIHNzbTI2MDJfZW51bVswXSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBzc20yNjAyX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgTWl4ZXIiLCBTU00yNjAyX1BXUiwgNCwgMSwKKwkmc3NtMjYwMl9vdXRwdXRfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRShzc20yNjAyX291dHB1dF9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX0RBQygiREFDIiwgIkhpRmkgUGxheWJhY2siLCBTU00yNjAyX1BXUiwgMywgMSksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMSFBPVVQiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlJPVVQiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlJIUE9VVCIpLAorU05EX1NPQ19EQVBNX0FEQygiQURDIiwgIkhpRmkgQ2FwdHVyZSIsIFNTTTI2MDJfUFdSLCAyLCAxKSwKK1NORF9TT0NfREFQTV9NVVgoIklucHV0IE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnNzbTI2MDJfaW5wdXRfbXV4X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9QR0EoIkxpbmUgSW5wdXQiLCBTU00yNjAyX1BXUiwgMCwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBTU00yNjAyX1BXUiwgMSwgMSksCitTTkRfU09DX0RBUE1fSU5QVVQoIk1JQ0lOIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlJMSU5FSU4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTExJTkVJTiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXVkaW9fY29ubltdID0geworCS8qIG91dHB1dCBtaXhlciAqLworCXsiT3V0cHV0IE1peGVyIiwgIkxpbmUgQnlwYXNzIFN3aXRjaCIsICJMaW5lIElucHV0In0sCisJeyJPdXRwdXQgTWl4ZXIiLCAiSGlGaSBQbGF5YmFjayBTd2l0Y2giLCAiREFDIn0sCisJeyJPdXRwdXQgTWl4ZXIiLCAiTWljIFNpZGV0b25lIFN3aXRjaCIsICJNaWMgQmlhcyJ9LAorCisJLyogb3V0cHV0cyAqLworCXsiUkhQT1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCXsiUk9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKwl7IkxIUE9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKwl7IkxPVVQiLCBOVUxMLCAiT3V0cHV0IE1peGVyIn0sCisKKwkvKiBpbnB1dCBtdXggKi8KKwl7IklucHV0IE11eCIsICJMaW5lIiwgIkxpbmUgSW5wdXQifSwKKwl7IklucHV0IE11eCIsICJNaWMiLCAiTWljIEJpYXMifSwKKwl7IkFEQyIsIE5VTEwsICJJbnB1dCBNdXgifSwKKworCS8qIGlucHV0cyAqLworCXsiTGluZSBJbnB1dCIsIE5VTEwsICJMTElORUlOIn0sCisJeyJMaW5lIElucHV0IiwgTlVMTCwgIlJMSU5FSU4ifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIk1JQ0lOIn0sCit9OworCitzdGF0aWMgaW50IHNzbTI2MDJfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHNzbTI2MDJfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRShzc20yNjAyX2RhcG1fd2lkZ2V0cykpOworCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX2Nvbm4sIEFSUkFZX1NJWkUoYXVkaW9fY29ubikpOworCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IF9jb2VmZl9kaXYgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXUxNiBmczsKKwl1OCBzcjo0OworCXU4IGJvc3I6MTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIG1jbGsgY2xvY2sgZGl2aWRlciBjb2VmZmljaWVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX2NvZWZmX2RpdiBjb2VmZl9kaXZbXSA9IHsKKwkvKiA0OGsgKi8KKwl7MTIyODgwMDAsIDQ4MDAwLCAyNTYsIDB4MCwgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgNDgwMDAsIDM4NCwgMHgwLCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA0ODAwMCwgMjUwLCAweDAsIDB4MCwgMHgxfSwKKworCS8qIDMyayAqLworCXsxMjI4ODAwMCwgMzIwMDAsIDM4NCwgMHg2LCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgNTc2LCAweDYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDMyMDAwLCAzNzUsIDB4NiwgMHgwLCAweDF9LAorCisJLyogOGsgKi8KKwl7MTIyODgwMDAsIDgwMDAsIDE1MzYsIDB4MywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMjMwNCwgMHgzLCAweDEsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAxNDA4LCAweGIsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDgwMDAsIDIxMTIsIDB4YiwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgODAwMCwgMTUwMCwgMHgzLCAweDAsIDB4MX0sCisKKwkvKiA5NmsgKi8KKwl7MTIyODgwMDAsIDk2MDAwLCAxMjgsIDB4NywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgOTYwMDAsIDE5MiwgMHg3LCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA5NjAwMCwgMTI1LCAweDcsIDB4MCwgMHgxfSwKKworCS8qIDQ0LjFrICovCisJezExMjg5NjAwLCA0NDEwMCwgMjU2LCAweDgsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAzODQsIDB4OCwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgNDQxMDAsIDI3MiwgMHg4LCAweDEsIDB4MX0sCisKKwkvKiA4OC4yayAqLworCXsxMTI4OTYwMCwgODgyMDAsIDEyOCwgMHhmLCAweDAsIDB4MH0sCisJezE2OTM0NDAwLCA4ODIwMCwgMTkyLCAweGYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDg4MjAwLCAxMzYsIDB4ZiwgMHgxLCAweDF9LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2NvZWZmKGludCBtY2xrLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLnJhdGUgPT0gcmF0ZSAmJiBjb2VmZl9kaXZbaV0ubWNsayA9PSBtY2xrKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXUxNiBzcmF0ZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXUxNiBpZmFjZSA9IHNzbTI2MDJfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFNTTTI2MDJfSUZBQ0UpICYgMHhmZmYzOworCWludCBpID0gZ2V0X2NvZWZmKHNzbTI2MDItPnN5c2NsaywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisKKwkvKm5vIG1hdGNoIGlzIGZvdW5kKi8KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGNvZWZmX2RpdikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKKwkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKKworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfQUNUSVZFLCAwKTsKKwlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX1NSQVRFLCBzcmF0ZSk7CisKKwkvKiBiaXQgc2l6ZSAqLworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IDB4MDAwNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJaWZhY2UgfD0gMHgwMDA4OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlpZmFjZSB8PSAweDAwMGM7CisJCWJyZWFrOworCX0KKwlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX0lGQUNFLCBpZmFjZSk7CisJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9BQ1RJVkUsIEFDVElWRV9BQ1RJVkFURV9DT0RFQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMiA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqbWFzdGVyX3J1bnRpbWU7CisKKwkvKiBUaGUgREFJIGhhcyBzaGFyZWQgY2xvY2tzIHNvIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBsYXliYWNrIG9yCisJICogY2FwdHVyZSBnb2luZyB0aGVuIGNvbnN0cmFpbiB0aGlzIHN1YnN0cmVhbSB0byBtYXRjaCBpdC4KKwkgKi8KKwlpZiAoc3NtMjYwMi0+bWFzdGVyX3N1YnN0cmVhbSkgeworCQltYXN0ZXJfcnVudGltZSA9IHNzbTI2MDItPm1hc3Rlcl9zdWJzdHJlYW0tPnJ1bnRpbWU7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgICAgIG1hc3Rlcl9ydW50aW1lLT5yYXRlLAorCQkJCQkgICAgIG1hc3Rlcl9ydW50aW1lLT5yYXRlKTsKKworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fU0FNUExFX0JJVFMsCisJCQkJCSAgICAgbWFzdGVyX3J1bnRpbWUtPnNhbXBsZV9iaXRzLAorCQkJCQkgICAgIG1hc3Rlcl9ydW50aW1lLT5zYW1wbGVfYml0cyk7CisKKwkJc3NtMjYwMi0+c2xhdmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCX0gZWxzZQorCQlzc20yNjAyLT5tYXN0ZXJfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCS8qIHNldCBhY3RpdmUgKi8KKwlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX0FDVElWRSwgQUNUSVZFX0FDVElWQVRFX0NPREVDKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc20yNjAyX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJLyogZGVhY3RpdmF0ZSAqLworCWlmICghY29kZWMtPmFjdGl2ZSkKKwkJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9BQ1RJVkUsIDApOworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSBzc20yNjAyX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBTU00yNjAyX0FQRElHSSkgJiB+QVBESUdJX0VOQUJMRV9EQUNfTVVURTsKKwlpZiAobXV0ZSkKKwkJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9BUERJR0ksCisJCQkJbXV0ZV9yZWcgfCBBUERJR0lfRU5BQkxFX0RBQ19NVVRFKTsKKwllbHNlCisJCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBESUdJLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMTIwMDAwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2OTM0NDAwOgorCWNhc2UgMTg0MzIwMDA6CisJCXNzbTI2MDItPnN5c2NsayA9IGZyZXE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzc20yNjAyX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IGlmYWNlID0gMDsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWZhY2UgfD0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWlmYWNlIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2UgfD0gMHgwMDAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlpZmFjZSB8PSAweDAwMDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWlmYWNlIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IDB4MDA5MDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJaWZhY2UgfD0gMHgwMDgwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZmFjZSB8PSAweDAwMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCBpZmFjZSAqLworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfSUZBQ0UsIGlmYWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc20yNjAyX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJdTE2IHJlZyA9IHNzbTI2MDJfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFNTTTI2MDJfUFdSKSAmIDB4ZmY3ZjsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJLyogdnJlZi9taWQsIG9zYyBvbiwgZGFjIHVubXV0ZSAqLworCQlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX1BXUiwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJLyogZXZlcnl0aGluZyBvZmYgZXhjZXB0IHZyZWYvdm1pZCwgKi8KKwkJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9QV1IsIHJlZyB8IFBXUl9DTEtfT1VUX1BETik7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLworCQlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX0FDVElWRSwgMCk7CisJCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfUFdSLCAweGZmZmYpOworCQlicmVhazsKKworCX0KKwljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNTTTI2MDJfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8XAorCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHxcCisJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfFwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8XAorCQlTTkRSVl9QQ01fUkFURV85NjAwMCkKKworc3RydWN0IHNuZF9zb2NfZGFpIHNzbTI2MDJfZGFpID0geworCS5uYW1lID0gIlNTTTI2MDIiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTU00yNjAyX1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTU00yNjAyX1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLH0sCisJLm9wcyA9IHsKKwkJLnN0YXJ0dXAgPSBzc20yNjAyX3N0YXJ0dXAsCisJCS5wcmVwYXJlID0gc3NtMjYwMl9wY21fcHJlcGFyZSwKKwkJLmh3X3BhcmFtcyA9IHNzbTI2MDJfaHdfcGFyYW1zLAorCQkuc2h1dGRvd24gPSBzc20yNjAyX3NodXRkb3duLAorCX0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSBzc20yNjAyX211dGUsCisJCS5zZXRfc3lzY2xrID0gc3NtMjYwMl9zZXRfZGFpX3N5c2NsaywKKwkJLnNldF9mbXQgPSBzc20yNjAyX3NldF9kYWlfZm10LAorCX0KK307CitFWFBPUlRfU1lNQk9MX0dQTChzc20yNjAyX2RhaSk7CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlzc20yNjAyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc20yNjAyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgaTsKKwl1OCBkYXRhWzJdOworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzc20yNjAyX3JlZyk7IGkrKykgeworCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKKwkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOworCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7CisJfQorCXNzbTI2MDJfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlzc20yNjAyX3NldF9iaWFzX2xldmVsKGNvZGVjLCBjb2RlYy0+c3VzcGVuZF9iaWFzX2xldmVsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIHNzbTI2MDIgZHJpdmVyCisgKiByZWdpc3RlciB0aGUgbWl4ZXIgYW5kIGRzcCBpbnRlcmZhY2VzIHdpdGggdGhlIGtlcm5lbAorICovCitzdGF0aWMgaW50IHNzbTI2MDJfaW5pdChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWcsIHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJTU00yNjAyIjsKKwljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljb2RlYy0+cmVhZCA9IHNzbTI2MDJfcmVhZF9yZWdfY2FjaGU7CisJY29kZWMtPndyaXRlID0gc3NtMjYwMl93cml0ZTsKKwljb2RlYy0+c2V0X2JpYXNfbGV2ZWwgPSBzc20yNjAyX3NldF9iaWFzX2xldmVsOworCWNvZGVjLT5kYWkgPSAmc3NtMjYwMl9kYWk7CisJY29kZWMtPm51bV9kYWkgPSAxOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IHNpemVvZihzc20yNjAyX3JlZyk7CisJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAoc3NtMjYwMl9yZWcsIHNpemVvZihzc20yNjAyX3JlZyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3NtMjYwMl9yZXNldChjb2RlYyk7CisKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoInNzbTI2MDI6IGZhaWxlZCB0byBjcmVhdGUgcGNtc1xuIik7CisJCWdvdG8gcGNtX2VycjsKKwl9CisJLypwb3dlciBvbiBkZXZpY2UqLworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfQUNUSVZFLCAwKTsKKwkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCisJcmVnID0gc3NtMjYwMl9yZWFkX3JlZ19jYWNoZShjb2RlYywgU1NNMjYwMl9MSU5WT0wpOworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfTElOVk9MLCByZWcgfCBMSU5WT0xfTFJJTl9CT1RIKTsKKwlyZWcgPSBzc20yNjAyX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBTU00yNjAyX1JJTlZPTCk7CisJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9SSU5WT0wsIHJlZyB8IFJJTlZPTF9STElOX0JPVEgpOworCXJlZyA9IHNzbTI2MDJfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFNTTTI2MDJfTE9VVDFWKTsKKwlzc20yNjAyX3dyaXRlKGNvZGVjLCBTU00yNjAyX0xPVVQxViwgcmVnIHwgTE9VVDFWX0xSSFBfQk9USCk7CisJcmVnID0gc3NtMjYwMl9yZWFkX3JlZ19jYWNoZShjb2RlYywgU1NNMjYwMl9ST1VUMVYpOworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfUk9VVDFWLCByZWcgfCBST1VUMVZfUkxIUF9CT1RIKTsKKwkvKnNlbGVjdCBMaW5lIGluIGFzIGRlZmF1bHQgaW5wdXQqLworCXNzbTI2MDJfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBBTkEsCisJCQlBUEFOQV9FTkFCTEVfTUlDX0JPT1NUMiB8IEFQQU5BX1NFTEVDVF9EQUMgfAorCQkJQVBBTkFfRU5BQkxFX01JQ19CT09TVCk7CisJc3NtMjYwMl93cml0ZShjb2RlYywgU1NNMjYwMl9QV1IsIDApOworCisJc3NtMjYwMl9hZGRfY29udHJvbHMoY29kZWMpOworCXNzbTI2MDJfYWRkX3dpZGdldHMoY29kZWMpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2Vycigic3NtMjYwMjogZmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmRcbiIpOworCQlnb3RvIGNhcmRfZXJyOworCX0KKworCXJldHVybiByZXQ7CisKK2NhcmRfZXJyOgorCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKK3BjbV9lcnI6CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSAqc3NtMjYwMl9zb2NkZXY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisvKgorICogc3NtMjYwMiAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgaW50IHNzbTI2MDJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHNzbTI2MDJfc29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOworCisJcmV0ID0gc3NtMjYwMl9pbml0KHNvY2Rldik7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgU1NNMjYwMlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzbTI2MDJfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3NtMjYwMl9pMmNfaWRbXSA9IHsKKwl7ICJzc20yNjAyIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzc20yNjAyX2kyY19pZCk7CisvKiBjb3JnaSBpMmMgY29kZWMgY29udHJvbCBsYXllciAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNzbTI2MDJfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJTU00yNjAyIEkyQyBDb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gc3NtMjYwMl9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IHNzbTI2MDJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzc20yNjAyX2kyY19pZCwKK307CisKK3N0YXRpYyBpbnQgc3NtMjYwMl9hZGRfaTJjX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHNzbTI2MDJfc2V0dXBfZGF0YSAqc2V0dXApCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19hZGRfZHJpdmVyKCZzc20yNjAyX2kyY19kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRyaXZlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCWluZm8uYWRkciA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwlzdHJsY3B5KGluZm8udHlwZSwgInNzbTI2MDIiLCBJMkNfTkFNRV9TSVpFKTsKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHNldHVwLT5pMmNfYnVzKTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGkyYyBhZGFwdGVyICVkXG4iLAorCQlzZXR1cC0+aTJjX2J1cyk7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisJY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmluZm8pOworCWkyY19wdXRfYWRhcHRlcihhZGFwdGVyKTsKKwlpZiAoIWNsaWVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRldmljZSBhdCAweCV4XG4iLAorCQkodW5zaWduZWQgaW50KWluZm8uYWRkcik7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisJcmV0dXJuIDA7CitlcnJfZHJpdmVyOgorCWkyY19kZWxfZHJpdmVyKCZzc20yNjAyX2kyY19kcml2ZXIpOworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3NtMjYwMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNzbTI2MDJfc2V0dXBfZGF0YSAqc2V0dXA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDI7CisJaW50IHJldCA9IDA7CisKKwlwcl9pbmZvKCJzc20yNjAyIEF1ZGlvIENvZGVjICVzIiwgU1NNMjYwMl9WRVJTSU9OKTsKKworCXNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzc20yNjAyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNzbTI2MDJfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChzc20yNjAyID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gc3NtMjYwMjsKKwlzb2NkZXYtPmNvZGVjID0gY29kZWM7CisJbXV0ZXhfaW5pdCgmY29kZWMtPm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3BhdGhzKTsKKworCXNzbTI2MDJfc29jZGV2ID0gc29jZGV2OworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKKwkJcmV0ID0gc3NtMjYwMl9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CisJfQorI2Vsc2UKKwkvKiBvdGhlciBpbnRlcmZhY2VzICovCisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiByZW1vdmUgZXZlcnl0aGluZyBoZXJlICovCitzdGF0aWMgaW50IHNzbTI2MDJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJaWYgKGNvZGVjLT5jb250cm9sX2RhdGEpCisJCXNzbTI2MDJfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY29kZWMtPmNvbnRyb2xfZGF0YSk7CisJaTJjX2RlbF9kcml2ZXIoJnNzbTI2MDJfaTJjX2RyaXZlcik7CisjZW5kaWYKKwlrZnJlZShjb2RlYy0+cHJpdmF0ZV9kYXRhKTsKKwlrZnJlZShjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfc3NtMjYwMiA9IHsKKwkucHJvYmUgPSAJc3NtMjYwMl9wcm9iZSwKKwkucmVtb3ZlID0gCXNzbTI2MDJfcmVtb3ZlLAorCS5zdXNwZW5kID0gCXNzbTI2MDJfc3VzcGVuZCwKKwkucmVzdW1lID0Jc3NtMjYwMl9yZXN1bWUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl9zc20yNjAyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIHNzbTI2MDIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0NGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogRmlsZTogICAgICAgICBzb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuaAorICogQXV0aG9yOiAgICAgICBDbGlmZiBDYWkgPENsaWZmLkNhaUBhbmFsb2cuY29tPgorICoKKyAqIENyZWF0ZWQ6ICAgICAgVHVlIEp1bmUgMDYgMjAwOAorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfU1NNMjYwMl9ICisjZGVmaW5lIF9TU00yNjAyX0gKKworLyogU1NNMjYwMiBDb2RlYyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFNTTTI2MDJfTElOVk9MICAgMHgwMAorI2RlZmluZSBTU00yNjAyX1JJTlZPTCAgIDB4MDEKKyNkZWZpbmUgU1NNMjYwMl9MT1VUMVYgICAweDAyCisjZGVmaW5lIFNTTTI2MDJfUk9VVDFWICAgMHgwMworI2RlZmluZSBTU00yNjAyX0FQQU5BICAgIDB4MDQKKyNkZWZpbmUgU1NNMjYwMl9BUERJR0kgICAweDA1CisjZGVmaW5lIFNTTTI2MDJfUFdSICAgICAgMHgwNgorI2RlZmluZSBTU00yNjAyX0lGQUNFICAgIDB4MDcKKyNkZWZpbmUgU1NNMjYwMl9TUkFURSAgICAweDA4CisjZGVmaW5lIFNTTTI2MDJfQUNUSVZFICAgMHgwOQorI2RlZmluZSBTU00yNjAyX1JFU0VUCSAweDBmCisKKy8qU1NNMjYwMiBDb2RlYyBSZWdpc3RlciBGaWVsZCBkZWZpbml0aW9ucworICooTWFzayB2YWx1ZSB0byBleHRyYWN0IHRoZSBjb3JyZXNwb25kaW5nIFJlZ2lzdGVyIGZpZWxkKQorICovCisKKy8qTGVmdCBBREMgVm9sdW1lIENvbnRyb2wgKFNTTTI2MDJfUkVHX0xFRlRfQURDX1ZPTCkqLworI2RlZmluZSAgICAgTElOVk9MX0xJTl9WT0wgICAgICAgICAgICAgICAgMHgwMUYgICAvKiBMZWZ0IENoYW5uZWwgUEdBIFZvbHVtZSBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBMSU5WT0xfTElOX0VOQUJMRV9NVVRFICAgICAgICAweDA4MCAgIC8qIExlZnQgQ2hhbm5lbCBJbnB1dCBNdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIExJTlZPTF9MUklOX0JPVEggICAgICAgICAgICAgIDB4MTAwICAgLyogTGVmdCBDaGFubmVsIExpbmUgSW5wdXQgVm9sdW1lIHVwZGF0ZSAgICAgICAgICAgICAgICAqLworCisvKlJpZ2h0IEFEQyBWb2x1bWUgQ29udHJvbCAoU1NNMjYwMl9SRUdfUklHSFRfQURDX1ZPTCkqLworI2RlZmluZSAgICAgUklOVk9MX1JJTl9WT0wgICAgICAgICAgICAgICAgMHgwMUYgICAvKiBSaWdodCBDaGFubmVsIFBHQSBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBSSU5WT0xfUklOX0VOQUJMRV9NVVRFICAgICAgICAweDA4MCAgIC8qIFJpZ2h0IENoYW5uZWwgSW5wdXQgTXV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIFJJTlZPTF9STElOX0JPVEggICAgICAgICAgICAgIDB4MTAwICAgLyogUmlnaHQgQ2hhbm5lbCBMaW5lIElucHV0IFZvbHVtZSB1cGRhdGUgICAgICAgICAgICAgICAqLworCisvKkxlZnQgREFDIFZvbHVtZSBDb250cm9sIChTU00yNjAyX1JFR19MRUZUX0RBQ19WT0wpKi8KKyNkZWZpbmUgICAgIExPVVQxVl9MSFBfVk9MICAgICAgICAgICAgICAgIDB4MDdGICAgLyogTGVmdCBDaGFubmVsIEhlYWRwaG9uZSB2b2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgTE9VVDFWX0VOQUJMRV9MWkMgICAgICAgICAgICAgMHgwODAgICAvKiBMZWZ0IENoYW5uZWwgWmVybyBjcm9zcyBkZXRlY3QgZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBMT1VUMVZfTFJIUF9CT1RIICAgICAgICAgICAgICAweDEwMCAgIC8qIExlZnQgQ2hhbm5lbCBIZWFkcGhvbmUgdm9sdW1lIHVwZGF0ZSAgICAgICAgICAgICAgICAgKi8KKworLypSaWdodCBEQUMgVm9sdW1lIENvbnRyb2wgKFNTTTI2MDJfUkVHX1JJR0hUX0RBQ19WT0wpKi8KKyNkZWZpbmUgICAgIFJPVVQxVl9SSFBfVk9MICAgICAgICAgICAgICAgIDB4MDdGICAgLyogUmlnaHQgQ2hhbm5lbCBIZWFkcGhvbmUgdm9sdW1lIGNvbnRyb2wgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgUk9VVDFWX0VOQUJMRV9SWkMgICAgICAgICAgICAgMHgwODAgICAvKiBSaWdodCBDaGFubmVsIFplcm8gY3Jvc3MgZGV0ZWN0IGVuYWJsZSAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBST1VUMVZfUkxIUF9CT1RIICAgICAgICAgICAgICAweDEwMCAgIC8qIFJpZ2h0IENoYW5uZWwgSGVhZHBob25lIHZvbHVtZSB1cGRhdGUgICAgICAgICAgICAgICAgKi8KKworLypBbmFsb2d1ZSBBdWRpbyBQYXRoIENvbnRyb2wgKFNTTTI2MDJfUkVHX0FOQUxPR1VFX1BBVEgpKi8KKyNkZWZpbmUgICAgIEFQQU5BX0VOQUJMRV9NSUNfQk9PU1QgICAgICAgMHgwMDEgICAvKiBQcmltYXJ5IE1pY3JvcGhvbmUgQW1wbGlmaWVyIGdhaW4gYm9vc3RlciBjb250cm9sICAgICovCisjZGVmaW5lICAgICBBUEFOQV9FTkFCTEVfTUlDX01VVEUgICAgICAgIDB4MDAyICAgLyogTWljcm9waG9uZSBNdXRlIENvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgQVBBTkFfQURDX0lOX1NFTEVDVCAgICAgICAgICAweDAwNCAgIC8qIE1pY3JvcGhvbmUvTGluZSBJTiBzZWxlY3QgdG8gQURDICgxPU1JQywgMD1MaW5lIEluKSAgKi8KKyNkZWZpbmUgICAgIEFQQU5BX0VOQUJMRV9CWVBBU1MgICAgICAgICAgMHgwMDggICAvKiBMaW5lIGlucHV0IGJ5cGFzcyB0byBsaW5lIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBBUEFOQV9TRUxFQ1RfREFDICAgICAgICAgICAgIDB4MDEwICAgLyogU2VsZWN0IERBQyAoMT1TZWxlY3QgREFDLCAwPURvbid0IFNlbGVjdCBEQUMpICAgICAgICAqLworI2RlZmluZSAgICAgQVBBTkFfRU5BQkxFX1NJREVUT05FICAgICAgICAweDAyMCAgIC8qIEVuYWJsZS9EaXNhYmxlIFNpZGUgVG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIEFQQU5BX1NJREVUT05FX0FUVE4gICAgICAgICAgMHgwQzAgICAvKiBTaWRlIFRvbmUgQXR0ZW51YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBBUEFOQV9FTkFCTEVfTUlDX0JPT1NUMiAgICAgIDB4MTAwICAgLyogU2Vjb25kYXJ5IE1pY3JvcGhvbmUgQW1wbGlmaWVyIGdhaW4gYm9vc3RlciBjb250cm9sICAqLworCisvKkRpZ2l0YWwgQXVkaW8gUGF0aCBDb250cm9sIChTU00yNjAyX1JFR19ESUdJVEFMX1BBVEgpKi8KKyNkZWZpbmUgICAgIEFQRElHSV9FTkFCTEVfQURDX0hQRiAgICAgICAgIDB4MDAxICAgLyogRW5hYmxlL0Rpc2FibGUgQURDIEhpZ2hwYXNzIEZpbHRlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgQVBESUdJX0RFX0VNUEhBU0lTICAgICAgICAgICAgMHgwMDYgICAvKiBEZS1FbXBoYXNpcyBDb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFICAgICAgICAweDAwOCAgIC8qIERBQyBNdXRlIENvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIEFQRElHSV9TVE9SRV9PRkZTRVQgICAgICAgICAgIDB4MDEwICAgLyogU3RvcmUvQ2xlYXIgREMgb2Zmc2V0IHdoZW4gSFBGIGlzIGRpc2FibGVkICAgICAgICAgICAqLworCisvKlBvd2VyIERvd24gQ29udHJvbCAoU1NNMjYwMl9SRUdfUE9XRVIpCisgKigxPUVuYWJsZSBQb3dlckRvd24sIDA9RGlzYWJsZSBQb3dlckRvd24pCisgKi8KKyNkZWZpbmUgICAgIFBXUl9MSU5FX0lOX1BETiAgICAgICAgICAgIDB4MDAxICAgLyogTGluZSBJbnB1dCBQb3dlciBEb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgUFdSX01JQ19QRE4gICAgICAgICAgICAgICAgMHgwMDIgICAvKiBNaWNyb3Bob25lIElucHV0ICYgQmlhcyBQb3dlciBEb3duICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBQV1JfQURDX1BETiAgICAgICAgICAgICAgICAweDAwNCAgIC8qIEFEQyBQb3dlciBEb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIFBXUl9EQUNfUEROICAgICAgICAgICAgICAgIDB4MDA4ICAgLyogREFDIFBvd2VyIERvd24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgUFdSX09VVF9QRE4gICAgICAgICAgICAgICAgMHgwMTAgICAvKiBPdXRwdXRzIFBvd2VyIERvd24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBQV1JfT1NDX1BETiAgICAgICAgICAgICAgICAweDAyMCAgIC8qIE9zY2lsbGF0b3IgUG93ZXIgRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIFBXUl9DTEtfT1VUX1BETiAgICAgICAgICAgIDB4MDQwICAgLyogQ0xLT1VUIFBvd2VyIERvd24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgUFdSX1BPV0VSX09GRiAgICAgICAgICAgICAgMHgwODAgICAvKiBQT1dFUk9GRiBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qRGlnaXRhbCBBdWRpbyBJbnRlcmZhY2UgRm9ybWF0IChTU00yNjAyX1JFR19ESUdJVEFMX0lGQUNFKSovCisjZGVmaW5lICAgICBJRkFDRV9JRkFDRV9GT1JNQVQgICAgICAgICAgIDB4MDAzICAgLyogRGlnaXRhbCBBdWRpbyBpbnB1dCBmb3JtYXQgY29udHJvbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgSUZBQ0VfQVVESU9fREFUQV9MRU4gICAgICAgICAweDAwQyAgIC8qIEF1ZGlvIERhdGEgd29yZCBsZW5ndGggY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIElGQUNFX0RBQ19MUl9QT0xBUklUWSAgICAgICAgMHgwMTAgICAvKiBQb2xhcml0eSBDb250cm9sIGZvciBjbG9ja3MgaW4gUkosTEogYW5kIEkyUyBtb2RlcyAgICovCisjZGVmaW5lICAgICBJRkFDRV9EQUNfTFJfU1dBUCAgICAgICAgICAgIDB4MDIwICAgLyogU3dhcCBEQUMgZGF0YSBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSAgICAgSUZBQ0VfRU5BQkxFX01BU1RFUiAgICAgICAgICAweDA0MCAgIC8qIEVuYWJsZS9EaXNhYmxlIE1hc3RlciBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIElGQUNFX0JDTEtfSU5WRVJUICAgICAgICAgICAgMHgwODAgICAvKiBCaXQgQ2xvY2sgSW52ZXJzaW9uIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qU2FtcGxpbmcgQ29udHJvbCAoU1NNMjYwMl9SRUdfU0FNUExJTkdfQ1RSTCkqLworI2RlZmluZSAgICAgU1JBVEVfRU5BQkxFX1VTQl9NT0RFICAgICAgICAweDAwMSAgIC8qIEVuYWJsZS9EaXNhYmxlIFVTQiBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIFNSQVRFX0JPU19SQVRFICAgICAgICAgICAgICAgMHgwMDIgICAvKiBCYXNlIE92ZXItU2FtcGxpbmcgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lICAgICBTUkFURV9TQU1QTEVfUkFURSAgICAgICAgICAgIDB4MDNDICAgLyogQ2xvY2sgc2V0dGluZyBjb25kaXRpb24gKFNhbXBsaW5nIHJhdGUgY29udHJvbCkgICAgICAqLworI2RlZmluZSAgICAgU1JBVEVfQ09SRUNMS19ESVYyICAgICAgICAgICAweDA0MCAgIC8qIENvcmUgQ2xvY2sgZGl2aWRlciBzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICAgIFNSQVRFX0NMS09VVF9ESVYyICAgICAgICAgICAgMHgwODAgICAvKiBDbG9jayBPdXQgZGl2aWRlciBzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qQWN0aXZlIENvbnRyb2wgKFNTTTI2MDJfUkVHX0FDVElWRV9DVFJMKSovCisjZGVmaW5lICAgICBBQ1RJVkVfQUNUSVZBVEVfQ09ERUMgICAgICAgICAweDAwMSAgIC8qIEFjdGl2YXRlIENvZGVjIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTU00yNjAyX0NBQ0hFUkVHTlVNIAkxMAorCisjZGVmaW5lIFNTTTI2MDJfU1lTQ0xLCTAKKyNkZWZpbmUgU1NNMjYwMl9EQUkJCTAKKworc3RydWN0IHNzbTI2MDJfc2V0dXBfZGF0YSB7CisJaW50IGkyY19idXM7CisJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7Cit9OworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfZGFpIHNzbTI2MDJfZGFpOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3NzbTI2MDI7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzA4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTAsMCArMSw3MTQgQEAKKy8qCisgKiBBTFNBIFNvQyBUTFYzMjBBSUMyMyBjb2RlYyBkcml2ZXIKKyAqCisgKiBBdXRob3I6ICAgICAgQXJ1biBLUywgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4KKyAqIENvcHlyaWdodDogICAoQykgMjAwOCBNaXN0cmFsIFNvbHV0aW9ucyBQdnQgTHRkLiwKKyAqCisgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODczMS5jIGJ5IFJpY2hhcmQgUHVyZGllCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOb3RlczoKKyAqICBUaGUgQUlDMjMgaXMgYSBkcml2ZXIgZm9yIGEgbG93IHBvd2VyIHN0ZXJlbyBhdWRpbworICogIGNvZGVjIHRsdjMyMGFpYzIzCisgKgorICogIFRoZSBtYWNoaW5lIGxheWVyIHNob3VsZCBkaXNhYmxlIHVuc3VwcG9ydGVkIGlucHV0cy9vdXRwdXRzIGJ5CisgKiAgc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTEhQT1VUIiksIGV0Yy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNpbmNsdWRlICJ0bHYzMjBhaWMyMy5oIgorCisjZGVmaW5lIEFJQzIzX1ZFUlNJT04gIjAuMSIKKworc3RydWN0IHRsdjMyMGFpYzIzX3NyYXRlX3JlZ19pbmZvIHsKKwl1MzIgc2FtcGxlX3JhdGU7CisJdTggY29udHJvbDsJCS8qIFNSMywgU1IyLCBTUjEsIFNSMCBhbmQgQk9TUiAqLworCXU4IGRpdmlkZXI7CQkvKiBpZiAwIENMS0lOID0gTUNMSywgaWYgMSBDTEtJTiA9IE1DTEsvMiAqLworfTsKKworLyoKKyAqIEFJQzIzIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBjb25zdCB1MTYgdGx2MzIwYWljMjNfcmVnW10gPSB7CisJMHgwMDk3LCAweDAwOTcsIDB4MDBGOSwgMHgwMEY5LAkvKiAwICovCisJMHgwMDFBLCAweDAwMDQsIDB4MDAwNywgMHgwMDAxLAkvKiA0ICovCisJMHgwMDIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAkvKiA4ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAkvKiAxMiAqLworfTsKKworLyoKKyAqIHJlYWQgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMKKwkJCQkJCSAgICAgICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBjYWNoZVtyZWddOworfQorCisvKgorICogd3JpdGUgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCSAgICAgICB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKKwkJcmV0dXJuOworCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworLyoKKyAqIHdyaXRlIHRvIHRoZSB0bHYzMjBhaWMyMyByZWdpc3RlciBzcGFjZQorICovCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCisJdTggZGF0YVsyXTsKKworCS8qIFRMVjMyMEFJQzIzIGhhcyA3IGJpdCBhZGRyZXNzIGFuZCA5IGJpdHMgb2YgZGF0YQorCSAqIHNvIHdlIG5lZWQgdG8gc3dpdGNoIG9uZSBkYXRhIGJpdCBpbnRvIHJlZyBhbmQgcmVzdAorCSAqIG9mIGRhdGEgaW50byB2YWwKKwkgKi8KKworCWlmICgocmVnIDwgMCB8fCByZWcgPiA5KSAmJiAocmVnICE9IDE1KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBJbnZhbGlkIHJlZ2lzdGVyIFIlZFxuIiwgX19mdW5jX18sIHJlZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICh2YWx1ZSA+PiA4ICYgMHgwMSk7CisJZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKKworCXRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7CisKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJWRcbiIsIF9fZnVuY19fLAorCSAgICAgICB2YWx1ZSwgcmVnKTsKKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByZWNfc3JjX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUTFYzMjBBSUMyM19BTkxHLCAyLCAyLCByZWNfc3JjX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfcmVjX3NyY19tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiSW5wdXQgU2VsZWN0IiwgcmVjX3NyY19lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0bHYzMjBhaWMyM19yZWNfc3JjID0KKwlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfQU5MRywgMiwgMiwgcmVjX3NyY190ZXh0KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdGx2MzIwYWljMjNfZGVlbXBoID0KKwlTT0NfRU5VTV9TSU5HTEUoVExWMzIwQUlDMjNfRElHVCwgMSwgNCwgZGVlbXBoX3RleHQpOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X2dhaW5fdGx2LCAtMTIxMDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaW5wdXRfZ2Fpbl90bHYsIC0xNzI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc2lkZXRvbmVfdm9sX3RsdiwgLTE4MDAsIDMwMCwgMCk7CisKK3N0YXRpYyBpbnQgc25kX3NvY190bHYzMjBhaWMyM19wdXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiB2YWwsIHJlZzsKKworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4MDcpOworCisJLyogbGluZWFyIGNvbnZlcnNpb24gdG8gdXNlcnNwYWNlCisJKiAwMDAJPQktNmRiCisJKiAwMDEJPQktOWRiCisJKiAwMTAJPQktMTJkYgorCSogMDExCT0JLTE4ZGIgKE1pbikKKwkqIDEwMAk9CTBkYiAoTWF4KQorCSovCisJdmFsID0gKHZhbCA+PSA0KSA/IDQgIDogKDMgLSB2YWwpOworCisJcmVnID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0FOTEcpICYgKH4weDFDMCk7CisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FOTEcsIHJlZyB8ICh2YWwgPDwgNikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY190bHYzMjBhaWMyM19nZXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiB2YWw7CisKKwl2YWwgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRykgJiAoMHgxQzApOworCXZhbCA9IHZhbCA+PiA2OworCXZhbCA9ICh2YWwgPj0gNCkgPyA0ICA6ICgzIC0gIHZhbCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CisJcmV0dXJuIDA7CisKK30KKworI2RlZmluZSBTT0NfVExWMzIwQUlDMjNfU0lOR0xFX1RMVih4bmFtZSwgcmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQsIHRsdl9hcnJheSkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKKwkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAorCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX3RsdjMyMGFpYzIzX2dldF92b2xzdyxcCisJLnB1dCA9IHNuZF9zb2NfdGx2MzIwYWljMjNfcHV0X3ZvbHN3LCBcCisJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBUTFYzMjBBSUMyM19MQ0hOVk9MLAorCQkJIFRMVjMyMEFJQzIzX1JDSE5WT0wsIDAsIDEyNywgMCwgb3V0X2dhaW5fdGx2KSwKKwlTT0NfU0lOR0xFKCJEaWdpdGFsIFBsYXliYWNrIFN3aXRjaCIsIFRMVjMyMEFJQzIzX0RJR1QsIDMsIDEsIDEpLAorCVNPQ19ET1VCTEVfUigiTGluZSBJbnB1dCBTd2l0Y2giLCBUTFYzMjBBSUMyM19MSU5WT0wsCisJCSAgICAgVExWMzIwQUlDMjNfUklOVk9MLCA3LCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJMaW5lIElucHV0IFZvbHVtZSIsIFRMVjMyMEFJQzIzX0xJTlZPTCwKKwkJCSBUTFYzMjBBSUMyM19SSU5WT0wsIDAsIDMxLCAwLCBpbnB1dF9nYWluX3RsdiksCisJU09DX1NJTkdMRSgiTWljIElucHV0IFN3aXRjaCIsIFRMVjMyMEFJQzIzX0FOTEcsIDEsIDEsIDEpLAorCVNPQ19TSU5HTEUoIk1pYyBCb29zdGVyIFN3aXRjaCIsIFRMVjMyMEFJQzIzX0FOTEcsIDAsIDEsIDApLAorCVNPQ19UTFYzMjBBSUMyM19TSU5HTEVfVExWKCJTaWRldG9uZSBWb2x1bWUiLCBUTFYzMjBBSUMyM19BTkxHLAorCQkJCSAgNiwgNCwgMCwgc2lkZXRvbmVfdm9sX3RsdiksCisJU09DX0VOVU0oIlBsYXliYWNrIERlLWVtcGhhc2lzIiwgdGx2MzIwYWljMjNfZGVlbXBoKSwKK307CisKKy8qIGFkZCBub24gZGFwbSBjb250cm9scyAqLworc3RhdGljIGludCB0bHYzMjBhaWMyM19hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQkgIHNuZF9zb2NfY25ldygmdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzW2ldLAorCQkJCQkgICAgICAgY29kZWMsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qIFBHQSBNaXhlciBjb250cm9scyBmb3IgTGluZSBhbmQgTWljIHN3aXRjaCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRsdjMyMGFpYzIzX291dHB1dF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQbGF5YmFjayBTd2l0Y2giLCBUTFYzMjBBSUMyM19BTkxHLCA0LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMiLCAiUGxheWJhY2siLCBUTFYzMjBBSUMyM19QV1IsIDMsIDEpLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyIsICJDYXB0dXJlIiwgVExWMzIwQUlDMjNfUFdSLCAyLCAxKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJDYXB0dXJlIFNvdXJjZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAmdGx2MzIwYWljMjNfcmVjX3NyY19tdXhfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IE1peGVyIiwgVExWMzIwQUlDMjNfUFdSLCA0LCAxLAorCQkJICAgJnRsdjMyMGFpYzIzX291dHB1dF9taXhlcl9jb250cm9sc1swXSwKKwkJCSAgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfb3V0cHV0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX1BHQSgiTGluZSBJbnB1dCIsIFRMVjMyMEFJQzIzX1BXUiwgMCwgMSwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTWljIElucHV0IiwgVExWMzIwQUlDMjNfUFdSLCAxLCAxLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIkxIUE9VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlJIUE9VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkxPVVQiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUIiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxMSU5FSU4iKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJMSU5FSU4iKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDSU4iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uW10gPSB7CisJLyogT3V0cHV0IE1peGVyICovCisJeyJPdXRwdXQgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIkxpbmUgSW5wdXQifSwKKwl7Ik91dHB1dCBNaXhlciIsICJQbGF5YmFjayBTd2l0Y2giLCAiREFDIn0sCisJeyJPdXRwdXQgTWl4ZXIiLCAiTWljIFNpZGV0b25lIFN3aXRjaCIsICJNaWMgSW5wdXQifSwKKworCS8qIE91dHB1dHMgKi8KKwl7IlJIUE9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKwl7IkxIUE9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKwl7IkxPVVQiLCBOVUxMLCAiT3V0cHV0IE1peGVyIn0sCisJeyJST1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCisJLyogSW5wdXRzICovCisJeyJMaW5lIElucHV0IiwgIk5VTEwiLCAiTExJTkVJTiJ9LAorCXsiTGluZSBJbnB1dCIsICJOVUxMIiwgIlJMSU5FSU4ifSwKKworCXsiTWljIElucHV0IiwgIk5VTEwiLCAiTUlDSU4ifSwKKworCS8qIGlucHV0IG11eCAqLworCXsiQ2FwdHVyZSBTb3VyY2UiLCAiTGluZSIsICJMaW5lIElucHV0In0sCisJeyJDYXB0dXJlIFNvdXJjZSIsICJNaWMiLCAiTWljIElucHV0In0sCisJeyJBREMiLCBOVUxMLCAiQ2FwdHVyZSBTb3VyY2UifSwKKworfTsKKworLyogdGx2MzIwYWljMjMgcmVsYXRlZCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0bHYzMjBhaWMyM19zcmF0ZV9yZWdfaW5mbyBzcmF0ZV9yZWdfaW5mb1tdID0geworCXs0MDAwLCAweDA2LCAxfSwJLyogIDQwMDAgKi8KKwl7ODAwMCwgMHgwNiwgMH0sCS8qICA4MDAwICovCisJezE2MDAwLCAweDBDLCAxfSwJLyogMTYwMDAgKi8KKwl7MjIwNTAsIDB4MTEsIDF9LAkvKiAyMjA1MCAqLworCXsyNDAwMCwgMHgwMCwgMX0sCS8qIDI0MDAwICovCisJezMyMDAwLCAweDBDLCAwfSwJLyogMzIwMDAgKi8KKwl7NDQxMDAsIDB4MTEsIDB9LAkvKiA0NDEwMCAqLworCXs0ODAwMCwgMHgwMCwgMH0sCS8qIDQ4MDAwICovCisJezg4MjAwLCAweDFGLCAwfSwJLyogODgyMDAgKi8KKwl7OTYwMDAsIDB4MEUsIDB9LAkvKiA5NjAwMCAqLworfTsKKworc3RhdGljIGludCB0bHYzMjBhaWMyM19hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpKTsKKworCS8qIHNldCB1cCBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXUxNiBpZmFjZV9yZWcsIGRhdGE7CisJdTggY291bnQgPSAwOworCisJaWZhY2VfcmVnID0KKwkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsCisJCQkJICAgICAgIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmIH4oMHgwMyA8PCAyKTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIHJpZ2h0IHNhbXBsZSByYXRlICovCisJLyogVmVyaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgcmF0ZSBpcyBub3Qgc3VwcG9ydGVkCisJICogbm93IGl0IGdvZXMgdG8gOTZLaHogKi8KKwl3aGlsZSAoKHNyYXRlX3JlZ19pbmZvW2NvdW50XS5zYW1wbGVfcmF0ZSAhPSBwYXJhbXNfcmF0ZShwYXJhbXMpKSAmJgorCSAgICAgICAoY291bnQgPCBBUlJBWV9TSVpFKHNyYXRlX3JlZ19pbmZvKSkpIHsKKwkJY291bnQrKzsKKwl9CisKKwlkYXRhID0gIChzcmF0ZV9yZWdfaW5mb1tjb3VudF0uZGl2aWRlciA8PCBUTFYzMjBBSUMyM19DTEtJTl9TSElGVCkgfAorCQkoc3JhdGVfcmVnX2luZm9bY291bnRdLiBjb250cm9sIDw8IFRMVjMyMEFJQzIzX0JPU1JfU0hJRlQpIHwKKwkJVExWMzIwQUlDMjNfVVNCX0NMS19PTjsKKworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19TUkFURSwgZGF0YSk7CisKKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQlpZmFjZV9yZWcgfD0gKDB4MDEgPDwgMik7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWlmYWNlX3JlZyB8PSAoMHgwMiA8PCAyKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJaWZhY2VfcmVnIHw9ICgweDAzIDw8IDIpOworCQlicmVhazsKKwl9CisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCS8qIHNldCBhY3RpdmUgKi8KKwl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDAwMDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRsdjMyMGFpYzIzX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwkvKiBkZWFjdGl2YXRlICovCisJaWYgKCFjb2RlYy0+YWN0aXZlKSB7CisJCXVkZWxheSg1MCk7CisJCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MCk7CisJfQorfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJdTE2IHJlZzsKKworCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUKTsKKwlpZiAobXV0ZSkKKwkJcmVnIHw9IFRMVjMyMEFJQzIzX0RBQ01fTVVURTsKKworCWVsc2UKKwkJcmVnICY9IH5UTFYzMjBBSUMyM19EQUNNX01VVEU7CisKKwl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfRElHVCwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1MTYgaWZhY2VfcmVnOworCisJaWZhY2VfcmVnID0KKwkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmICh+MHgwMyk7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlmYWNlX3JlZyB8PSBUTFYzMjBBSUMyM19NU19NQVNURVI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwkvKiBpbnRlcmZhY2UgZm9ybWF0ICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlpZmFjZV9yZWcgfD0gVExWMzIwQUlDMjNfRk9SX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJaWZhY2VfcmVnIHw9IFRMVjMyMEFJQzIzX0ZPUl9EU1A7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWlmYWNlX3JlZyB8PSBUTFYzMjBBSUMyM19GT1JfTEpVU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJICAgICAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgMTIwMDAwMDA6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB0bHYzMjBhaWMyM19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJdTE2IHJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IpICYgMHhmZjdmOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiB2cmVmL21pZCwgb3NjIG9uLCBkYWMgdW5tdXRlICovCisJCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCisJCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyB8IDB4MDA0MCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLworCQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDApOworCQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUFdSLCAweGZmZmYpOworCQlicmVhazsKKwl9CisJY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBSUMyM19SQVRFUwlTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCisjZGVmaW5lIEFJQzIzX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdHJ1Y3Qgc25kX3NvY19kYWkgdGx2MzIwYWljMjNfZGFpID0geworCS5uYW1lID0gInRsdjMyMGFpYzIzIiwKKwkucGxheWJhY2sgPSB7CisJCSAgICAgLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJICAgICAuY2hhbm5lbHNfbWluID0gMiwKKwkJICAgICAuY2hhbm5lbHNfbWF4ID0gMiwKKwkJICAgICAucmF0ZXMgPSBBSUMyM19SQVRFUywKKwkJICAgICAuZm9ybWF0cyA9IEFJQzIzX0ZPUk1BVFMsfSwKKwkuY2FwdHVyZSA9IHsKKwkJICAgIC5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJICAgIC5jaGFubmVsc19taW4gPSAyLAorCQkgICAgLmNoYW5uZWxzX21heCA9IDIsCisJCSAgICAucmF0ZXMgPSBBSUMyM19SQVRFUywKKwkJICAgIC5mb3JtYXRzID0gQUlDMjNfRk9STUFUUyx9LAorCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gdGx2MzIwYWljMjNfcGNtX3ByZXBhcmUsCisJCS5od19wYXJhbXMgPSB0bHYzMjBhaWMyM19od19wYXJhbXMsCisJCS5zaHV0ZG93biA9IHRsdjMyMGFpYzIzX3NodXRkb3duLAorCQl9LAorCS5kYWlfb3BzID0geworCQkgICAgLmRpZ2l0YWxfbXV0ZSA9IHRsdjMyMGFpYzIzX211dGUsCisJCSAgICAuc2V0X2ZtdCA9IHRsdjMyMGFpYzIzX3NldF9kYWlfZm10LAorCQkgICAgLnNldF9zeXNjbGsgPSB0bHYzMjBhaWMyM19zZXRfZGFpX3N5c2NsaywKKwkJICAgIH0KK307CitFWFBPUlRfU1lNQk9MX0dQTCh0bHYzMjBhaWMyM19kYWkpOworCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSAgICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgwKTsKKwl0bHYzMjBhaWMyM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bHYzMjBhaWMyM19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisJdTE2IHJlZzsKKworCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCisJZm9yIChyZWcgPSAwOyByZWcgPCBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3JlZyk7IGkrKykgeworCQl1MTYgdmFsID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7CisJCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisJfQorCisJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwl0bHYzMjBhaWMyM19zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPnN1c3BlbmRfYmlhc19sZXZlbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIEFJQzIzIGRyaXZlcgorICogcmVnaXN0ZXIgdGhlIG1peGVyIGFuZCBkc3AgaW50ZXJmYWNlcyB3aXRoIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIGludCB0bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldCA9IDA7CisJdTE2IHJlZzsKKworCWNvZGVjLT5uYW1lID0gInRsdjMyMGFpYzIzIjsKKwljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljb2RlYy0+cmVhZCA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHRsdjMyMGFpYzIzX3dyaXRlOworCWNvZGVjLT5zZXRfYmlhc19sZXZlbCA9IHRsdjMyMGFpYzIzX3NldF9iaWFzX2xldmVsOworCWNvZGVjLT5kYWkgPSAmdGx2MzIwYWljMjNfZGFpOworCWNvZGVjLT5udW1fZGFpID0gMTsKKwljb2RlYy0+cmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3JlZyk7CisJY29kZWMtPnJlZ19jYWNoZSA9CisJICAgIGttZW1kdXAodGx2MzIwYWljMjNfcmVnLCBzaXplb2YodGx2MzIwYWljMjNfcmVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBSZXNldCBjb2RlYyAqLworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SRVNFVCwgMCk7CisKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRsdjMyMGFpYzIzOiBmYWlsZWQgdG8gY3JlYXRlIHBjbXNcbiIpOworCQlnb3RvIHBjbV9lcnI7CisJfQorCisJLyogcG93ZXIgb24gZGV2aWNlICovCisJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdULCBUTFYzMjBBSUMyM19ERUVNUF80NEspOworCisJLyogVW5tdXRlIGlucHV0ICovCisJcmVnID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0xJTlZPTCk7CisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0xJTlZPTCwKKwkJCSAgKHJlZyAmICh+VExWMzIwQUlDMjNfTElNX01VVEVEKSkgfAorCQkJICAoVExWMzIwQUlDMjNfTFJTX0VOQUJMRUQpKTsKKworCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wpOworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wsCisJCQkgIChyZWcgJiAoflRMVjMyMEFJQzIzX0xJTV9NVVRFRCkpIHwKKwkJCSAgVExWMzIwQUlDMjNfTFJTX0VOQUJMRUQpOworCisJcmVnID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0FOTEcpOworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHLAorCQkJIChyZWcpICYgKH5UTFYzMjBBSUMyM19CWVBBU1NfT04pICYKKwkJCSAoflRMVjMyMEFJQzIzX01JQ01fTVVURUQpKTsKKworCS8qIERlZmF1bHQgb3V0cHV0IHZvbHVtZSAqLworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19MQ0hOVk9MLAorCQkJICBUTFYzMjBBSUMyM19ERUZBVUxUX09VVF9WT0wgJgorCQkJICBUTFYzMjBBSUMyM19PVVRfVk9MX01BU0spOworCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SQ0hOVk9MLAorCQkJICBUTFYzMjBBSUMyM19ERUZBVUxUX09VVF9WT0wgJgorCQkJICBUTFYzMjBBSUMyM19PVVRfVk9MX01BU0spOworCisJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgxKTsKKworCXRsdjMyMGFpYzIzX2FkZF9jb250cm9scyhjb2RlYyk7CisJdGx2MzIwYWljMjNfYWRkX3dpZGdldHMoY29kZWMpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGx2MzIwYWljMjM6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byBjYXJkX2VycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitjYXJkX2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CitwY21fZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlICp0bHYzMjBhaWMyM19zb2NkZXY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisvKgorICogSWYgdGhlIGkyYyBsYXllciB3ZXJlbid0IHNvIGJyb2tlbiwgd2UgY291bGQgcGFzcyB0aGlzIGtpbmQgb2YgZGF0YQorICogYXJvdW5kCisgKi8KK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNfY29kZWNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gdGx2MzIwYWljMjNfc29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjLT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOworCisJcmV0ID0gdGx2MzIwYWljMjNfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGx2MzIwYWljMjM6IGZhaWxlZCB0byBpbml0aWFsaXNlIEFJQzIzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCBfX2V4aXQgdGx2MzIwYWljMjNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXB1dF9kZXZpY2UoJmkyYy0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRsdjMyMGFpYzIzX2lkW10gPSB7CisJeyJ0bHYzMjBhaWMyMyIsIDB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdGx2MzIwYWljMjNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdGx2MzIwYWljMjNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJ0bHYzMjBhaWMyMyIsCisJCSAgIH0sCisJLnByb2JlID0gdGx2MzIwYWljMjNfY29kZWNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKHRsdjMyMGFpYzIzX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHRsdjMyMGFpYzIzX2lkLAorfTsKKworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIkFJQzIzIEF1ZGlvIENvZGVjICVzXG4iLCBBSUMyM19WRVJTSU9OKTsKKworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NkZXYtPmNvZGVjID0gY29kZWM7CisJbXV0ZXhfaW5pdCgmY29kZWMtPm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3BhdGhzKTsKKworCXRsdjMyMGFpYzIzX3NvY2RldiA9IHNvY2RldjsKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpIGkyY19tYXN0ZXJfc2VuZDsKKwljb2RlYy0+aHdfcmVhZCA9IE5VTEw7CisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJnRsdjMyMGFpYzIzX2kyY19kcml2ZXIpOworCWlmIChyZXQgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0bHYzMjBhaWMyM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkKKwkJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfZGVsX2RyaXZlcigmdGx2MzIwYWljMjNfaTJjX2RyaXZlcik7CisjZW5kaWYKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3RsdjMyMGFpYzIzID0geworCS5wcm9iZSA9IHRsdjMyMGFpYzIzX3Byb2JlLAorCS5yZW1vdmUgPSB0bHYzMjBhaWMyM19yZW1vdmUsCisJLnN1c3BlbmQgPSB0bHYzMjBhaWMyM19zdXNwZW5kLAorCS5yZXN1bWUgPSB0bHYzMjBhaWMyM19yZXN1bWUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl90bHYzMjBhaWMyMyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBUTFYzMjBBSUMyMyBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkFydW4gS1MgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQxZmFmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQUxTQSBTb0MgVExWMzIwQUlDMjMgY29kZWMgZHJpdmVyCisgKgorICogQXV0aG9yOiAgICAgIEFydW4gS1MsIDxhcnVua3NAbWlzdHJhbHNvbHV0aW9ucy5jb20+CisgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDggTWlzdHJhbCBTb2x1dGlvbnMgUHZ0IEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfVExWMzIwQUlDMjNfSAorI2RlZmluZSBfVExWMzIwQUlDMjNfSAorCisvKiBDb2RlYyBUTFYzMjBBSUMyMyAqLworI2RlZmluZSBUTFYzMjBBSUMyM19MSU5WT0wJCTB4MDAKKyNkZWZpbmUgVExWMzIwQUlDMjNfUklOVk9MCQkweDAxCisjZGVmaW5lIFRMVjMyMEFJQzIzX0xDSE5WT0wJCTB4MDIKKyNkZWZpbmUgVExWMzIwQUlDMjNfUkNITlZPTAkJMHgwMworI2RlZmluZSBUTFYzMjBBSUMyM19BTkxHCQkweDA0CisjZGVmaW5lIFRMVjMyMEFJQzIzX0RJR1QJCTB4MDUKKyNkZWZpbmUgVExWMzIwQUlDMjNfUFdSCQkJMHgwNgorI2RlZmluZSBUTFYzMjBBSUMyM19ESUdUX0ZNVAkJMHgwNworI2RlZmluZSBUTFYzMjBBSUMyM19TUkFURQkJMHgwOAorI2RlZmluZSBUTFYzMjBBSUMyM19BQ1RJVkUJCTB4MDkKKyNkZWZpbmUgVExWMzIwQUlDMjNfUkVTRVQJCTB4MEYKKworLyogTGVmdCAocmlnaHQpIGxpbmUgaW5wdXQgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVExWMzIwQUlDMjNfTFJTX0VOQUJMRUQJCTB4MDEwMAorI2RlZmluZSBUTFYzMjBBSUMyM19MSU1fTVVURUQJCTB4MDA4MAorI2RlZmluZSBUTFYzMjBBSUMyM19MSVZfREVGQVVMVAkJMHgwMDE3CisjZGVmaW5lIFRMVjMyMEFJQzIzX0xJVl9NQVgJCTB4MDAxZgorI2RlZmluZSBUTFYzMjBBSUMyM19MSVZfTUlOCQkweDAwMDAKKworLyogTGVmdCAocmlnaHQpIGNoYW5uZWwgaGVhZHBob25lIHZvbHVtZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFRMVjMyMEFJQzIzX0xaQ19PTgkJMHgwMDgwCisjZGVmaW5lIFRMVjMyMEFJQzIzX0xIVl9ERUZBVUxUCQkweDAwNzkKKyNkZWZpbmUgVExWMzIwQUlDMjNfTEhWX01BWAkJMHgwMDdmCisjZGVmaW5lIFRMVjMyMEFJQzIzX0xIVl9NSU4JCTB4MDAwMAorCisvKiBBbmFsb2cgYXVkaW8gcGF0aCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NUQV9SRUcoeCkJCSgoeCk8PDYpCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NURV9FTkFCTEVECQkweDAwMjAKKyNkZWZpbmUgVExWMzIwQUlDMjNfREFDX1NFTEVDVEVECTB4MDAxMAorI2RlZmluZSBUTFYzMjBBSUMyM19CWVBBU1NfT04JCTB4MDAwOAorI2RlZmluZSBUTFYzMjBBSUMyM19JTlNFTF9NSUMJCTB4MDAwNAorI2RlZmluZSBUTFYzMjBBSUMyM19NSUNNX01VVEVECQkweDAwMDIKKyNkZWZpbmUgVExWMzIwQUlDMjNfTUlDQl8yMERCCQkweDAwMDEKKworLyogRGlnaXRhbCBhdWRpbyBwYXRoIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVExWMzIwQUlDMjNfREFDTV9NVVRFCQkweDAwMDgKKyNkZWZpbmUgVExWMzIwQUlDMjNfREVFTVBfMzJLCQkweDAwMDIKKyNkZWZpbmUgVExWMzIwQUlDMjNfREVFTVBfNDRLCQkweDAwMDQKKyNkZWZpbmUgVExWMzIwQUlDMjNfREVFTVBfNDhLCQkweDAwMDYKKyNkZWZpbmUgVExWMzIwQUlDMjNfQURDSFBfT04JCTB4MDAwMQorCisvKiBQb3dlciBjb250cm9sIGRvd24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVExWMzIwQUlDMjNfREVWSUNFX1BXUl9PRkYgIAkweDAwODAKKyNkZWZpbmUgVExWMzIwQUlDMjNfQ0xLX09GRgkJMHgwMDQwCisjZGVmaW5lIFRMVjMyMEFJQzIzX09TQ19PRkYJCTB4MDAyMAorI2RlZmluZSBUTFYzMjBBSUMyM19PVVRfT0ZGCQkweDAwMTAKKyNkZWZpbmUgVExWMzIwQUlDMjNfREFDX09GRgkJMHgwMDA4CisjZGVmaW5lIFRMVjMyMEFJQzIzX0FEQ19PRkYJCTB4MDAwNAorI2RlZmluZSBUTFYzMjBBSUMyM19NSUNfT0ZGCQkweDAwMDIKKyNkZWZpbmUgVExWMzIwQUlDMjNfTElORV9PRkYJCTB4MDAwMQorCisvKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSByZWdpc3RlciAqLworI2RlZmluZSBUTFYzMjBBSUMyM19NU19NQVNURVIJCTB4MDA0MAorI2RlZmluZSBUTFYzMjBBSUMyM19MUlNXQVBfT04JCTB4MDAyMAorI2RlZmluZSBUTFYzMjBBSUMyM19MUlBfT04JCTB4MDAxMAorI2RlZmluZSBUTFYzMjBBSUMyM19JV0xfMTYJCTB4MDAwMAorI2RlZmluZSBUTFYzMjBBSUMyM19JV0xfMjAJCTB4MDAwNAorI2RlZmluZSBUTFYzMjBBSUMyM19JV0xfMjQJCTB4MDAwOAorI2RlZmluZSBUTFYzMjBBSUMyM19JV0xfMzIJCTB4MDAwQworI2RlZmluZSBUTFYzMjBBSUMyM19GT1JfSTJTCQkweDAwMDIKKyNkZWZpbmUgVExWMzIwQUlDMjNfRk9SX0RTUAkJMHgwMDAzCisjZGVmaW5lIFRMVjMyMEFJQzIzX0ZPUl9MSlVTVAkJMHgwMDAxCisKKy8qIFNhbXBsZSByYXRlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVExWMzIwQUlDMjNfQ0xLT1VUX0hBTEYJCTB4MDA4MAorI2RlZmluZSBUTFYzMjBBSUMyM19DTEtJTl9IQUxGCQkweDAwNDAKKyNkZWZpbmUgVExWMzIwQUlDMjNfQk9TUl8zODRmcwkJMHgwMDAyCS8qIEJPU1JfMjcyZnMgaW4gVVNCIG1vZGUgKi8KKyNkZWZpbmUgVExWMzIwQUlDMjNfVVNCX0NMS19PTgkJMHgwMDAxCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NSX01BU0sgICAgICAgICAgICAgMHhmCisjZGVmaW5lIFRMVjMyMEFJQzIzX0NMS09VVF9TSElGVCAgICAgICAgNworI2RlZmluZSBUTFYzMjBBSUMyM19DTEtJTl9TSElGVCAgICAgICAgIDYKKyNkZWZpbmUgVExWMzIwQUlDMjNfU1JfU0hJRlQgICAgICAgICAgICAyCisjZGVmaW5lIFRMVjMyMEFJQzIzX0JPU1JfU0hJRlQgICAgICAgICAgMQorCisvKiBEaWdpdGFsIGludGVyZmFjZSByZWdpc3RlciAqLworI2RlZmluZSBUTFYzMjBBSUMyM19BQ1RfT04JCTB4MDAwMQorCisvKgorICogQVVESU8gcmVsYXRlZCBNQUNST1MKKyAqLworCisjZGVmaW5lIFRMVjMyMEFJQzIzX0RFRkFVTFRfT1VUX1ZPTAkweDcwCisjZGVmaW5lIFRMVjMyMEFJQzIzX0RFRkFVTFRfSU5fVk9MVU1FCTB4MTAKKworI2RlZmluZSBUTFYzMjBBSUMyM19PVVRfVk9MX01JTgkJVExWMzIwQUlDMjNfTEhWX01JTgorI2RlZmluZSBUTFYzMjBBSUMyM19PVVRfVk9MX01BWAkJVExWMzIwQUlDMjNfTEhWX01BWAorI2RlZmluZSBUTFYzMjBBSUMyM19PVVRfVk9fUkFOR0UJKFRMVjMyMEFJQzIzX09VVF9WT0xfTUFYIC0gXAorCQkJCQlUTFYzMjBBSUMyM19PVVRfVk9MX01JTikKKyNkZWZpbmUgVExWMzIwQUlDMjNfT1VUX1ZPTF9NQVNLCVRMVjMyMEFJQzIzX09VVF9WT0xfTUFYCisKKyNkZWZpbmUgVExWMzIwQUlDMjNfSU5fVk9MX01JTgkJVExWMzIwQUlDMjNfTElWX01JTgorI2RlZmluZSBUTFYzMjBBSUMyM19JTl9WT0xfTUFYCQlUTFYzMjBBSUMyM19MSVZfTUFYCisjZGVmaW5lIFRMVjMyMEFJQzIzX0lOX1ZPTF9SQU5HRQkoVExWMzIwQUlDMjNfSU5fVk9MX01BWCAtIFwKKwkJCQkJVExWMzIwQUlDMjNfSU5fVk9MX01JTikKKyNkZWZpbmUgVExWMzIwQUlDMjNfSU5fVk9MX01BU0sJCVRMVjMyMEFJQzIzX0lOX1ZPTF9NQVgKKworI2RlZmluZSBUTFYzMjBBSUMyM19TSURFVE9ORV9NQVNLCTB4MWMwCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NJREVUT05FXzAJCTB4MTAwCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NJREVUT05FXzYJCTB4MDAwCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NJREVUT05FXzkJCTB4MDQwCisjZGVmaW5lIFRMVjMyMEFJQzIzX1NJREVUT05FXzEyCQkweDA4MAorI2RlZmluZSBUTFYzMjBBSUMyM19TSURFVE9ORV8xOAkJMHgwYzAKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSB0bHYzMjBhaWMyM19kYWk7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfdGx2MzIwYWljMjM7CisKKyNlbmRpZiAvKiBfVExWMzIwQUlDMjNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDhhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBUZXhhcyBJbnN0cnVtZW50cyBUTFYzMjBBSUMyNiBsb3cgcG93ZXIgYXVkaW8gQ09ERUMKKyAqIEFMU0EgU29DIENPREVDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLW9mLXNpbXBsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgInRsdjMyMGFpYzI2LmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBUTFYzMjBBSUMyNiBjb2RlYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogQUlDMjYgZHJpdmVyIHByaXZhdGUgZGF0YSAqLworc3RydWN0IGFpYzI2IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjIGNvZGVjOworCXUxNiByZWdfY2FjaGVbQUlDMjZfTlVNX1JFR1NdOwkvKiBzaGFkb3cgcmVnaXN0ZXJzICovCisJaW50IG1hc3RlcjsKKwlpbnQgZGF0Zm07CisJaW50IG1jbGs7CisKKwkvKiBLZXljbGljayBwYXJhbWV0ZXJzICovCisJaW50IGtleWNsaWNrX2FtcGxpdHVkZTsKKwlpbnQga2V5Y2xpY2tfZnJlcTsKKwlpbnQga2V5Y2xpY2tfbGVuOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdpc3RlciBhY2Nlc3Mgcm91dGluZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhaWMyNl9yZWdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgYWljMjYgKmFpYzI2ID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwl1MTYgY21kLCB2YWx1ZTsKKwl1OCBidWZmZXJbMl07CisJaW50IHJjOworCisJaWYgKHJlZyA+PSBBSUMyNl9OVU1fUkVHUykgeworCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIERvIFNQSSB0cmFuc2ZlcjsgZmlyc3QgMTZiaXRzIGFyZSBjb21tYW5kOyByZW1haW5pbmcgaXMKKwkgKiByZWdpc3RlciBjb250ZW50cyAqLworCWNtZCA9IEFJQzI2X1JFQURfQ09NTUFORF9XT1JEKHJlZyk7CisJYnVmZmVyWzBdID0gKGNtZCA+PiA4KSAmIDB4ZmY7CisJYnVmZmVyWzFdID0gY21kICYgMHhmZjsKKwlyYyA9IHNwaV93cml0ZV90aGVuX3JlYWQoYWljMjYtPnNwaSwgYnVmZmVyLCAyLCBidWZmZXIsIDIpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZhaWMyNi0+c3BpLT5kZXYsICJBSUMyNiByZWcgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwl2YWx1ZSA9IChidWZmZXJbMF0gPDwgOCkgfCBidWZmZXJbMV07CisKKwkvKiBVcGRhdGUgdGhlIGNhY2hlIGJlZm9yZSByZXR1cm5pbmcgd2l0aCB0aGUgdmFsdWUgKi8KKwljYWNoZVtyZWddID0gdmFsdWU7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFpYzI2X3JlZ19yZWFkX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkJIHVuc2lnbmVkIGludCByZWcpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisKKwlpZiAocmVnID49IEFJQzI2X05VTV9SRUdTKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKK3N0YXRpYyBpbnQgYWljMjZfcmVnX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYWljMjYgKmFpYzI2ID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwl1MTYgY21kOworCXU4IGJ1ZmZlcls0XTsKKwlpbnQgcmM7CisKKwlpZiAocmVnID49IEFJQzI2X05VTV9SRUdTKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRG8gU1BJIHRyYW5zZmVyOyBmaXJzdCAxNmJpdHMgYXJlIGNvbW1hbmQ7IHJlbWFpbmluZyBpcyBkYXRhCisJICogdG8gd3JpdGUgaW50byByZWdpc3RlciAqLworCWNtZCA9IEFJQzI2X1dSSVRFX0NPTU1BTkRfV09SRChyZWcpOworCWJ1ZmZlclswXSA9IChjbWQgPj4gOCkgJiAweGZmOworCWJ1ZmZlclsxXSA9IGNtZCAmIDB4ZmY7CisJYnVmZmVyWzJdID0gdmFsdWUgPj4gODsKKwlidWZmZXJbM10gPSB2YWx1ZTsKKwlyYyA9IHNwaV93cml0ZShhaWMyNi0+c3BpLCBidWZmZXIsIDQpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZhaWMyNi0+c3BpLT5kZXYsICJBSUMyNiByZWcgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHVwZGF0ZSBjYWNoZSBiZWZvcmUgcmV0dXJuaW5nICovCisJY2FjaGVbcmVnXSA9IHZhbHVlOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIE9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCBhaWMyNl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCWludCBmc3JlZiwgZGl2aXNvciwgd2xlbiwgcHZhbCwganZhbCwgZHZhbCwgcXZhbDsKKwl1MTYgcmVnOworCisJZGV2X2RiZygmYWljMjYtPnNwaS0+ZGV2LCAiYWljMjZfaHdfcGFyYW1zKHN1YnN0cmVhbT0lcCwgcGFyYW1zPSVwKVxuIiwKKwkJc3Vic3RyZWFtLCBwYXJhbXMpOworCWRldl9kYmcoJmFpYzI2LT5zcGktPmRldiwgInJhdGU9JWkgZm9ybWF0PSVpXG4iLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAorCQlwYXJhbXNfZm9ybWF0KHBhcmFtcykpOworCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA4MDAwOiAgZnNyZWYgPSA0ODAwMDsgZGl2aXNvciA9IEFJQzI2X0RJVl82OyBicmVhazsKKwljYXNlIDExMDI1OiBmc3JlZiA9IDQ0MTAwOyBkaXZpc29yID0gQUlDMjZfRElWXzQ7IGJyZWFrOworCWNhc2UgMTIwMDA6IGZzcmVmID0gNDgwMDA7IGRpdmlzb3IgPSBBSUMyNl9ESVZfNDsgYnJlYWs7CisJY2FzZSAxNjAwMDogZnNyZWYgPSA0ODAwMDsgZGl2aXNvciA9IEFJQzI2X0RJVl8zOyBicmVhazsKKwljYXNlIDIyMDUwOiBmc3JlZiA9IDQ0MTAwOyBkaXZpc29yID0gQUlDMjZfRElWXzI7IGJyZWFrOworCWNhc2UgMjQwMDA6IGZzcmVmID0gNDgwMDA7IGRpdmlzb3IgPSBBSUMyNl9ESVZfMjsgYnJlYWs7CisJY2FzZSAzMjAwMDogZnNyZWYgPSA0ODAwMDsgZGl2aXNvciA9IEFJQzI2X0RJVl8xXzU7IGJyZWFrOworCWNhc2UgNDQxMDA6IGZzcmVmID0gNDQxMDA7IGRpdmlzb3IgPSBBSUMyNl9ESVZfMTsgYnJlYWs7CisJY2FzZSA0ODAwMDogZnNyZWYgPSA0ODAwMDsgZGl2aXNvciA9IEFJQzI2X0RJVl8xOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJiYWQgcmF0ZVxuIik7IHJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNlbGVjdCBkYXRhIHdvcmQgbGVuZ3RoICovCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6ICAgICB3bGVuID0gQUlDMjZfV0xFTl8xNjsgYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9CRTogd2xlbiA9IEFJQzI2X1dMRU5fMTY7IGJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfQkU6IHdsZW4gPSBBSUMyNl9XTEVOXzI0OyBicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0JFOiB3bGVuID0gQUlDMjZfV0xFTl8zMjsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmYWljMjYtPnNwaS0+ZGV2LCAiYmFkIGZvcm1hdFxuIik7IHJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvbmZpZ3VyZSBQTEwgKi8KKwlwdmFsID0gMTsKKwlqdmFsID0gKGZzcmVmID09IDQ0MTAwKSA/IDcgOiA4OworCWR2YWwgPSAoZnNyZWYgPT0gNDQxMDApID8gNTI2NCA6IDE5MjA7CisJcXZhbCA9IDA7CisJcmVnID0gMHg4MDAwIHwgcXZhbCA8PCAxMSB8IHB2YWwgPDwgOCB8IGp2YWwgPDwgMjsKKwlhaWMyNl9yZWdfd3JpdGUoY29kZWMsIEFJQzI2X1JFR19QTExfUFJPRzEsIHJlZyk7CisJcmVnID0gZHZhbCA8PCAyOworCWFpYzI2X3JlZ193cml0ZShjb2RlYywgQUlDMjZfUkVHX1BMTF9QUk9HMiwgcmVnKTsKKworCS8qIEF1ZGlvIENvbnRyb2wgMyAobWFzdGVyIG1vZGUsIGZzcmVmIHJhdGUpICovCisJcmVnID0gYWljMjZfcmVnX3JlYWRfY2FjaGUoY29kZWMsIEFJQzI2X1JFR19BVURJT19DVFJMMyk7CisJcmVnICY9IH4weGY4MDA7CisJaWYgKGFpYzI2LT5tYXN0ZXIpCisJCXJlZyB8PSAweDA4MDA7CisJaWYgKGZzcmVmID09IDQ4MDAwKQorCQlyZWcgfD0gMHgyMDAwOworCWFpYzI2X3JlZ193cml0ZShjb2RlYywgQUlDMjZfUkVHX0FVRElPX0NUUkwzLCByZWcpOworCisJLyogQXVkaW8gQ29udHJvbCAxIChGU3JlZiBkaXZpc29yKSAqLworCXJlZyA9IGFpYzI2X3JlZ19yZWFkX2NhY2hlKGNvZGVjLCBBSUMyNl9SRUdfQVVESU9fQ1RSTDEpOworCXJlZyAmPSB+MHgwZmZmOworCXJlZyB8PSB3bGVuIHwgYWljMjYtPmRhdGZtIHwgKGRpdmlzb3IgPDwgMykgfCBkaXZpc29yOworCWFpYzI2X3JlZ193cml0ZShjb2RlYywgQUlDMjZfUkVHX0FVRElPX0NUUkwxLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWljMjZfbXV0ZSAtIE11dGUgY29udHJvbCB0byByZWR1Y2Ugbm9pc2Ugd2hlbiBjaGFuZ2luZyBhdWRpbyBmb3JtYXQKKyAqLworc3RhdGljIGludCBhaWMyNl9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXUxNiByZWcgPSBhaWMyNl9yZWdfcmVhZF9jYWNoZShjb2RlYywgQUlDMjZfUkVHX0RBQ19HQUlOKTsKKworCWRldl9kYmcoJmFpYzI2LT5zcGktPmRldiwgImFpYzI2X211dGUoZGFpPSVwLCBtdXRlPSVpKVxuIiwKKwkJZGFpLCBtdXRlKTsKKworCWlmIChtdXRlKQorCQlyZWcgfD0gMHg4MDgwOworCWVsc2UKKwkJcmVnICY9IH4weDgwODA7CisJYWljMjZfcmVnX3dyaXRlKGNvZGVjLCBBSUMyNl9SRUdfREFDX0dBSU4sIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMyNl9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJICAgIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IGFpYzI2ICphaWMyNiA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJhaWMyNl9zZXRfc3lzY2xrKGRhaT0lcCwgY2xrX2lkPT0laSwiCisJCSIgZnJlcT0laSwgZGlyPSVpKVxuIiwKKwkJY29kZWNfZGFpLCBjbGtfaWQsIGZyZXEsIGRpcik7CisKKwkvKiBNQ0xLIG5lZWRzIHRvIGZhbGwgYmV0d2VlbiAyTUh6IGFuZCA1MCBNSHogKi8KKwlpZiAoKGZyZXEgPCAyMDAwMDAwKSB8fCAoZnJlcSA+IDUwMDAwMDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhaWMyNi0+bWNsayA9IGZyZXE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWljMjZfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmYWljMjYtPnNwaS0+ZGV2LCAiYWljMjZfc2V0X2ZtdChkYWk9JXAsIGZtdD09JWkpXG4iLAorCQljb2RlY19kYWksIGZtdCk7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06IGFpYzI2LT5tYXN0ZXIgPSAxOyBicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6IGFpYzI2LT5tYXN0ZXIgPSAwOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJiYWQgbWFzdGVyXG4iKTsgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzogICAgIGFpYzI2LT5kYXRmbSA9IEFJQzI2X0RBVEZNX0kyUzsgYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQTogICBhaWMyNi0+ZGF0Zm0gPSBBSUMyNl9EQVRGTV9EU1A7IGJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjogYWljMjYtPmRhdGZtID0gQUlDMjZfREFURk1fUklHSFRKOyBicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjogIGFpYzI2LT5kYXRmbSA9IEFJQzI2X0RBVEZNX0xFRlRKOyBicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZhaWMyNi0+c3BpLT5kZXYsICJiYWQgZm9ybWF0XG4iKTsgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGlnaXRhbCBBdWRpbyBJbnRlcmZhY2UgRGVmaW5pdGlvbgorICovCisjZGVmaW5lIEFJQzI2X1JBVEVTCShTTkRSVl9QQ01fUkFURV84MDAwICB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8XAorCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfFwKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCkKKyNkZWZpbmUgQUlDMjZfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TOCAgICAgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8XAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfQkUpCisKK3N0cnVjdCBzbmRfc29jX2RhaSBhaWMyNl9kYWkgPSB7CisJLm5hbWUgPSAidGx2MzIwYWljMjYiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBBSUMyNl9SQVRFUywKKwkJLmZvcm1hdHMgPSBBSUMyNl9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBBSUMyNl9SQVRFUywKKwkJLmZvcm1hdHMgPSBBSUMyNl9GT1JNQVRTLAorCX0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IGFpYzI2X2h3X3BhcmFtcywKKwl9LAorCS5kYWlfb3BzID0geworCQkuZGlnaXRhbF9tdXRlID0gYWljMjZfbXV0ZSwKKwkJLnNldF9zeXNjbGsgPSBhaWMyNl9zZXRfc3lzY2xrLAorCQkuc2V0X2ZtdCA9IGFpYzI2X3NldF9mbXQsCisJfSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhaWMyNl9kYWkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFMU0EgY29udHJvbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFpYzI2X2NhcHR1cmVfc3JjX3RleHRbXSA9IHsiTWljIiwgIkF1eCJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWMyNl9jYXB0dXJlX3NyY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQUlDMjZfUkVHX0FVRElPX0NUUkwxLCAxMiwgMiwgYWljMjZfY2FwdHVyZV9zcmNfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMyNl9zbmRfY29udHJvbHNbXSA9IHsKKwkvKiBPdXRwdXQgKi8KKwlTT0NfRE9VQkxFKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgQUlDMjZfUkVHX0RBQ19HQUlOLCA4LCAwLCAweDdmLCAxKSwKKwlTT0NfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgQUlDMjZfUkVHX0RBQ19HQUlOLCAxNSwgNywgMSwgMSksCisJU09DX1NJTkdMRSgiUENNIENhcHR1cmUgVm9sdW1lIiwgQUlDMjZfUkVHX0FEQ19HQUlOLCA4LCAweDdmLCAwKSwKKwlTT0NfU0lOR0xFKCJQQ00gQ2FwdHVyZSBNdXRlIiwgQUlDMjZfUkVHX0FEQ19HQUlOLCAxNSwgMSwgMSksCisJU09DX1NJTkdMRSgiS2V5Y2xpY2sgYWN0aXZhdGUiLCBBSUMyNl9SRUdfQVVESU9fQ1RSTDIsIDE1LCAweDEsIDApLAorCVNPQ19TSU5HTEUoIktleWNsaWNrIGFtcGxpdHVkZSIsIEFJQzI2X1JFR19BVURJT19DVFJMMiwgMTIsIDB4NywgMCksCisJU09DX1NJTkdMRSgiS2V5Y2xpY2sgZnJlcXVlbmN5IiwgQUlDMjZfUkVHX0FVRElPX0NUUkwyLCA4LCAweDcsIDApLAorCVNPQ19TSU5HTEUoIktleWNsaWNrIHBlcmlvZCIsIEFJQzI2X1JFR19BVURJT19DVFJMMiwgNCwgMHhmLCAwKSwKKwlTT0NfRU5VTSgiQ2FwdHVyZSBTb3VyY2UiLCBhaWMyNl9jYXB0dXJlX3NyY19lbnVtKSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU29DIENPREVDIHBvcnRpb24gb2YgZHJpdmVyOiBwcm9iZSBhbmQgcmVsZWFzZSByb3V0aW5lcworICovCitzdGF0aWMgaW50IGFpYzI2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJc3RydWN0IGFpYzI2ICphaWMyNjsKKwlpbnQgaSwgcmV0LCBlcnI7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUHJvYmluZyBBSUMyNiBTb0MgQ09ERUMgZHJpdmVyXG4iKTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJzb2NkZXY9JXBcbiIsIHNvY2Rldik7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiY29kZWNfZGF0YT0lcFxuIiwgc29jZGV2LT5jb2RlY19kYXRhKTsKKworCS8qIEZldGNoIHRoZSByZWxldmFudCBhaWMyNiBwcml2YXRlIGRhdGEgaGVyZSAoaXQncyBhbHJlYWR5IGJlZW4KKwkgKiBzdG9yZWQgaW4gdGhlIC5jb2RlYyBwb2ludGVyKSAqLworCWFpYzI2ID0gc29jZGV2LT5jb2RlY19kYXRhOworCWlmIChhaWMyNiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFpYzI2OiBtaXNzaW5nIGNvZGVjIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY29kZWMgPSAmYWljMjYtPmNvZGVjOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIlJlZ2lzdGVyaW5nIFBDTXMsIGRldj0lcCwgc29jZGV2LT5kZXY9JXBcbiIsCisJCSZwZGV2LT5kZXYsIHNvY2Rldi0+ZGV2KTsKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhaWMyNjogZmFpbGVkIHRvIGNyZWF0ZSBwY21zXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogcmVnaXN0ZXIgY29udHJvbHMgKi8KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJSZWdpc3RlcmluZyBjb250cm9sc1xuIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWljMjZfc25kX2NvbnRyb2xzKTsgaSsrKSB7CisJCWtjb250cm9sID0gc25kX3NvY19jbmV3KCZhaWMyNl9zbmRfY29udHJvbHNbaV0sIGNvZGVjLCBOVUxMKTsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIGtjb250cm9sKTsKKwkJV0FSTl9PTihlcnIgPCAwKTsKKwl9CisKKwkvKiBDT0RFQyBpcyBzZXR1cCwgd2UgY2FuIHJlZ2lzdGVyIHRoZSBjYXJkIG5vdyAqLworCWRldl9kYmcoJnBkZXYtPmRldiwgIlJlZ2lzdGVyaW5nIGNhcmRcbiIpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFpYzI2OiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gY2FyZF9lcnI7CisJfQorCXJldHVybiAwOworCisgY2FyZF9lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFpYzI2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIGFpYzI2X3NvY19jb2RlY19kZXYgPSB7CisJLnByb2JlID0gYWljMjZfcHJvYmUsCisJLnJlbW92ZSA9IGFpYzI2X3JlbW92ZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhaWMyNl9zb2NfY29kZWNfZGV2KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTUEkgZGV2aWNlIHBvcnRpb24gb2YgZHJpdmVyOiBzeXNmcyBmaWxlcyBmb3IgZGVidWdnaW5nCisgKi8KKworc3RhdGljIHNzaXplX3QgYWljMjZfa2V5Y2xpY2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWljMjYgKmFpYzI2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHZhbCwgYW1wLCBmcmVxLCBsZW47CisKKwl2YWwgPSBhaWMyNl9yZWdfcmVhZF9jYWNoZSgmYWljMjYtPmNvZGVjLCBBSUMyNl9SRUdfQVVESU9fQ1RSTDIpOworCWFtcCA9ICh2YWwgPj4gMTIpICYgMHg3OworCWZyZXEgPSAoMTI1IDw8ICgodmFsID4+IDgpICYgMHg3KSkgPj4gMTsKKwlsZW4gPSAyICogKDEgKyAoKHZhbCA+PiA0KSAmIDB4ZikpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiYW1wPSV4IGZyZXE9JWlIeiBsZW49JWljbGtzXG4iLCBhbXAsIGZyZXEsIGxlbik7Cit9CisKKy8qIEFueSB3cml0ZSB0byB0aGUga2V5Y2xpY2sgYXR0cmlidXRlIHdpbGwgdHJpZ2dlciB0aGUga2V5Y2xpY2sgZXZlbnQgKi8KK3N0YXRpYyBzc2l6ZV90IGFpYzI2X2tleWNsaWNrX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhaWMyNiAqYWljMjYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdmFsOworCisJdmFsID0gYWljMjZfcmVnX3JlYWRfY2FjaGUoJmFpYzI2LT5jb2RlYywgQUlDMjZfUkVHX0FVRElPX0NUUkwyKTsKKwl2YWwgfD0gMHg4MDAwOworCWFpYzI2X3JlZ193cml0ZSgmYWljMjYtPmNvZGVjLCBBSUMyNl9SRUdfQVVESU9fQ1RSTDIsIHZhbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihrZXljbGljaywgMDY0NCwgYWljMjZfa2V5Y2xpY2tfc2hvdywgYWljMjZfa2V5Y2xpY2tfc2V0KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTUEkgZGV2aWNlIHBvcnRpb24gb2YgZHJpdmVyOiBwcm9iZSBhbmQgcmVsZWFzZSByb3V0aW5lcyBhbmQgU1BJCisgKiAJCQkJIGRyaXZlciByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgYWljMjZfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFpYzI2ICphaWMyNjsKKwlpbnQgcmMsIGksIHJlZzsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAicHJvYmluZyB0bHYzMjBhaWMyNiBzcGkgZGV2aWNlXG4iKTsKKworCS8qIEFsbG9jYXRlIGRyaXZlciBkYXRhICovCisJYWljMjYgPSBremFsbG9jKHNpemVvZiAqYWljMjYsIEdGUF9LRVJORUwpOworCWlmICghYWljMjYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZHJpdmVyIGRhdGEgKi8KKwlhaWMyNi0+c3BpID0gc3BpOworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGFpYzI2KTsKKworCS8qIFNldHVwIHdoYXQgd2UgY2FuIGluIHRoZSBjb2RlYyBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgcmVnaXN0ZXIKKwkgKiBhY2Nlc3MgZnVuY3Rpb25zIHdpbGwgd29yayBhcyBleHBlY3RlZC4gIE1vcmUgd2lsbCBiZSBmaWxsZWQKKwkgKiBvdXQgd2hlbiBpdCBpcyBwcm9iZWQgYnkgdGhlIFNvQyBDT0RFQyBwYXJ0IG9mIHRoaXMgZHJpdmVyICovCisJYWljMjYtPmNvZGVjLnByaXZhdGVfZGF0YSA9IGFpYzI2OworCWFpYzI2LT5jb2RlYy5uYW1lID0gImFpYzI2IjsKKwlhaWMyNi0+Y29kZWMub3duZXIgPSBUSElTX01PRFVMRTsKKwlhaWMyNi0+Y29kZWMuZGFpID0gJmFpYzI2X2RhaTsKKwlhaWMyNi0+Y29kZWMubnVtX2RhaSA9IDE7CisJYWljMjYtPmNvZGVjLnJlYWQgPSBhaWMyNl9yZWdfcmVhZDsKKwlhaWMyNi0+Y29kZWMud3JpdGUgPSBhaWMyNl9yZWdfd3JpdGU7CisJYWljMjYtPm1hc3RlciA9IDE7CisJbXV0ZXhfaW5pdCgmYWljMjYtPmNvZGVjLm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmYWljMjYtPmNvZGVjLmRhcG1fd2lkZ2V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmFpYzI2LT5jb2RlYy5kYXBtX3BhdGhzKTsKKwlhaWMyNi0+Y29kZWMucmVnX2NhY2hlX3NpemUgPSBBSUMyNl9OVU1fUkVHUzsKKwlhaWMyNi0+Y29kZWMucmVnX2NhY2hlID0gYWljMjYtPnJlZ19jYWNoZTsKKworCS8qIFJlc2V0IHRoZSBjb2RlYyB0byBwb3dlciBvbiBkZWZhdWx0cyAqLworCWFpYzI2X3JlZ193cml0ZSgmYWljMjYtPmNvZGVjLCBBSUMyNl9SRUdfUkVTRVQsIDB4QkIwMCk7CisKKwkvKiBQb3dlciB1cCBDT0RFQyAqLworCWFpYzI2X3JlZ193cml0ZSgmYWljMjYtPmNvZGVjLCBBSUMyNl9SRUdfUE9XRVJfQ1RSTCwgMCk7CisKKwkvKiBBdWRpbyBDb250cm9sIDMgKG1hc3RlciBtb2RlLCBmc3JlZiByYXRlKSAqLworCXJlZyA9IGFpYzI2X3JlZ19yZWFkKCZhaWMyNi0+Y29kZWMsIEFJQzI2X1JFR19BVURJT19DVFJMMyk7CisJcmVnICY9IH4weGY4MDA7CisJcmVnIHw9IDB4MDgwMDsgLyogc2V0IG1hc3RlciBtb2RlICovCisJYWljMjZfcmVnX3dyaXRlKCZhaWMyNi0+Y29kZWMsIEFJQzI2X1JFR19BVURJT19DVFJMMywgcmVnKTsKKworCS8qIEZpbGwgcmVnaXN0ZXIgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWMyNi0+cmVnX2NhY2hlKTsgaSsrKQorCQlhaWMyNl9yZWdfcmVhZCgmYWljMjYtPmNvZGVjLCBpKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBzeXNmcyBmaWxlcyBmb3IgZGVidWdnaW5nICovCisJLyogQ3JlYXRlIFN5c0ZTIGZpbGVzICovCisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfa2V5Y2xpY2spOworCWlmIChyYykKKwkJZGV2X2luZm8oJnNwaS0+ZGV2LCAiZXJyb3IgY3JlYXRpbmcgc3lzZnMgZmlsZXNcbiIpOworCisjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19PRl9TSU1QTEUpCisJLyogVGVsbCB0aGUgb2Zfc29jIGhlbHBlciBhYm91dCB0aGlzIGNvZGVjICovCisJb2Zfc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmYWljMjZfc29jX2NvZGVjX2RldiwgYWljMjYsICZhaWMyNl9kYWksCisJCQkJICBzcGktPmRldi5hcmNoZGF0YS5vZl9ub2RlKTsKKyNlbmRpZgorCisJZGV2X2RiZygmc3BpLT5kZXYsICJTUEkgZGV2aWNlIGluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaWMyNl9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFpYzI2ICphaWMyNiA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJa2ZyZWUoYWljMjYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhaWMyNl9zcGkgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGx2MzIwYWljMjYiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFpYzI2X3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gYWljMjZfc3BpX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFpYzI2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWljMjZfc3BpKTsKK30KK21vZHVsZV9pbml0KGFpYzI2X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWljMjZfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWljMjZfc3BpKTsKK30KK21vZHVsZV9leGl0KGFpYzI2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5oIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmJhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIFRleGFzIEluc3RydW1lbnRzIFRMVjMyMEFJQzI2IGxvdyBwb3dlciBhdWRpbyBDT0RFQworICogcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICovCisKKyNpZm5kZWYgX1RMVjMyMEFJQzE2X0hfCisjZGVmaW5lIF9UTFYzMjBBSUMxNl9IXworCisvKiBBSUMyNiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUlDMjZfUkVBRF9DT01NQU5EX1dPUkQoYWRkcikJKCgxIDw8IDE1KSB8IChhZGRyIDw8IDUpKQorI2RlZmluZSBBSUMyNl9XUklURV9DT01NQU5EX1dPUkQoYWRkcikJKCgwIDw8IDE1KSB8IChhZGRyIDw8IDUpKQorI2RlZmluZSBBSUMyNl9QQUdFX0FERFIocGFnZSwgb2Zmc2V0KQkoKHBhZ2UgPDwgNikgfCBvZmZzZXQpCisjZGVmaW5lIEFJQzI2X05VTV9SRUdTCQkJQUlDMjZfUEFHRV9BRERSKDMsIDApCisKKy8qIFBhZ2UgMDogQXV4aWxsYXJ5IGRhdGEgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFJQzI2X1JFR19CQVQxCQkJQUlDMjZfUEFHRV9BRERSKDAsIDB4MDUpCisjZGVmaW5lIEFJQzI2X1JFR19CQVQyCQkJQUlDMjZfUEFHRV9BRERSKDAsIDB4MDYpCisjZGVmaW5lIEFJQzI2X1JFR19BVVgJCQlBSUMyNl9QQUdFX0FERFIoMCwgMHgwNykKKyNkZWZpbmUgQUlDMjZfUkVHX1RFTVAxCQkJQUlDMjZfUEFHRV9BRERSKDAsIDB4MDkpCisjZGVmaW5lIEFJQzI2X1JFR19URU1QMgkJCUFJQzI2X1BBR0VfQUREUigwLCAweDBBKQorCisvKiBQYWdlIDE6IEF1eGlsbGFyeSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBBSUMyNl9SRUdfQVVYX0FEQwkJQUlDMjZfUEFHRV9BRERSKDEsIDB4MDApCisjZGVmaW5lIEFJQzI2X1JFR19TVEFUVVMJCUFJQzI2X1BBR0VfQUREUigxLCAweDAxKQorI2RlZmluZSBBSUMyNl9SRUdfUkVGRVJFTkNFCQlBSUMyNl9QQUdFX0FERFIoMSwgMHgwMykKKyNkZWZpbmUgQUlDMjZfUkVHX1JFU0VUCQkJQUlDMjZfUEFHRV9BRERSKDEsIDB4MDQpCisKKy8qIFBhZ2UgMjogQXVkaW8gY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUlDMjZfUkVHX0FVRElPX0NUUkwxCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwMCkKKyNkZWZpbmUgQUlDMjZfUkVHX0FEQ19HQUlOCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwMSkKKyNkZWZpbmUgQUlDMjZfUkVHX0RBQ19HQUlOCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwMikKKyNkZWZpbmUgQUlDMjZfUkVHX1NJREVUT05FCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwMykKKyNkZWZpbmUgQUlDMjZfUkVHX0FVRElPX0NUUkwyCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwNCkKKyNkZWZpbmUgQUlDMjZfUkVHX1BPV0VSX0NUUkwJCUFJQzI2X1BBR0VfQUREUigyLCAweDA1KQorI2RlZmluZSBBSUMyNl9SRUdfQVVESU9fQ1RSTDMJCUFJQzI2X1BBR0VfQUREUigyLCAweDA2KQorCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfTF9OMAlBSUMyNl9QQUdFX0FERFIoMiwgMHgwNykKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9MX04xCUFJQzI2X1BBR0VfQUREUigyLCAweDA4KQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX0xfTjIJQUlDMjZfUEFHRV9BRERSKDIsIDB4MDkpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfTF9OMwlBSUMyNl9QQUdFX0FERFIoMiwgMHgwQSkKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9MX040CUFJQzI2X1BBR0VfQUREUigyLCAweDBCKQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX0xfTjUJQUlDMjZfUEFHRV9BRERSKDIsIDB4MEMpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfTF9EMQlBSUMyNl9QQUdFX0FERFIoMiwgMHgwRCkKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9MX0QyCUFJQzI2X1BBR0VfQUREUigyLCAweDBFKQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX0xfRDQJQUlDMjZfUEFHRV9BRERSKDIsIDB4MEYpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfTF9ENQlBSUMyNl9QQUdFX0FERFIoMiwgMHgxMCkKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9SX04wCUFJQzI2X1BBR0VfQUREUigyLCAweDExKQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX1JfTjEJQUlDMjZfUEFHRV9BRERSKDIsIDB4MTIpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfUl9OMglBSUMyNl9QQUdFX0FERFIoMiwgMHgxMykKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9SX04zCUFJQzI2X1BBR0VfQUREUigyLCAweDE0KQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX1JfTjQJQUlDMjZfUEFHRV9BRERSKDIsIDB4MTUpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfUl9ONQlBSUMyNl9QQUdFX0FERFIoMiwgMHgxNikKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9SX0QxCUFJQzI2X1BBR0VfQUREUigyLCAweDE3KQorI2RlZmluZSBBSUMyNl9SRUdfRklMVEVSX0NPRUZGX1JfRDIJQUlDMjZfUEFHRV9BRERSKDIsIDB4MTgpCisjZGVmaW5lIEFJQzI2X1JFR19GSUxURVJfQ09FRkZfUl9ENAlBSUMyNl9QQUdFX0FERFIoMiwgMHgxOSkKKyNkZWZpbmUgQUlDMjZfUkVHX0ZJTFRFUl9DT0VGRl9SX0Q1CUFJQzI2X1BBR0VfQUREUigyLCAweDFBKQorCisjZGVmaW5lIEFJQzI2X1JFR19QTExfUFJPRzEJCUFJQzI2X1BBR0VfQUREUigyLCAweDFCKQorI2RlZmluZSBBSUMyNl9SRUdfUExMX1BST0cyCQlBSUMyNl9QQUdFX0FERFIoMiwgMHgxQykKKyNkZWZpbmUgQUlDMjZfUkVHX0FVRElPX0NUUkw0CQlBSUMyNl9QQUdFX0FERFIoMiwgMHgxRCkKKyNkZWZpbmUgQUlDMjZfUkVHX0FVRElPX0NUUkw1CQlBSUMyNl9QQUdFX0FERFIoMiwgMHgxRSkKKworLyogZnNyZWYgZGl2aWRlcnM7IHVzZWQgaW4gcmVnaXN0ZXIgJ0F1ZGlvIENvbnRyb2wgMScgKi8KK2VudW0gYWljMjZfZGl2aXNvcnMgeworCUFJQzI2X0RJVl8xCT0gMCwKKwlBSUMyNl9ESVZfMV81CT0gMSwKKwlBSUMyNl9ESVZfMgk9IDIsCisJQUlDMjZfRElWXzMJPSAzLAorCUFJQzI2X0RJVl80CT0gNCwKKwlBSUMyNl9ESVZfNQk9IDUsCisJQUlDMjZfRElWXzVfNQk9IDYsCisJQUlDMjZfRElWXzYJPSA3LAorfTsKKworLyogRGlnaXRhbCBkYXRhIGZvcm1hdCAqLworZW51bSBhaWMyNl9kYXRmbSB7CisJQUlDMjZfREFURk1fSTJTCQk9IDAgPDwgOCwKKwlBSUMyNl9EQVRGTV9EU1AJCT0gMSA8PCA4LAorCUFJQzI2X0RBVEZNX1JJR0hUSgk9IDIgPDwgOCwgLyogcmlnaHQganVzdGlmaWVkICovCisJQUlDMjZfREFURk1fTEVGVEoJPSAzIDw8IDgsIC8qIGxlZnQganVzdGlmaWVkICovCit9OworCisvKiBTYW1wbGUgd29yZCBsZW5ndGggaW4gYml0czsgdXNlZCBpbiByZWdpc3RlciAnQXVkaW8gQ29udHJvbCAxJyAqLworZW51bSBhaWMyNl93bGVuIHsKKwlBSUMyNl9XTEVOXzE2CT0gMCA8PCAxMCwKKwlBSUMyNl9XTEVOXzIwCT0gMSA8PCAxMCwKKwlBSUMyNl9XTEVOXzI0CT0gMiA8PCAxMCwKKwlBSUMyNl9XTEVOXzMyCT0gMyA8PCAxMCwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWkgYWljMjZfZGFpOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBhaWMyNl9zb2NfY29kZWNfZGV2OworCisjZW5kaWYgLyogX1RMVjMyMEFJQzE2X0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKaW5kZXggNWY5YWJiMS4uMDUzMzZlZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBTFNBIFNvQyBUTFYzMjBBSUMzWCBjb2RlYyBkcml2ZXIKICAqCi0gKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QGVtYmVkZGVkYWxsZXkuY29tPgogICogQ29weXJpZ2h0OiAgIChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4sIDxzb3VyY2VAbXZpc3RhLmNvbT4KICAqCiAgKiBCYXNlZCBvbiBzb3VuZC9zb2MvY29kZWNzL3dtODc1My5jIGJ5IExpYW0gR2lyZHdvb2QKQEAgLTQ4LDcgKzQ4LDYgQEAKIAogI2luY2x1ZGUgInRsdjMyMGFpYzN4LmgiCiAKLSNkZWZpbmUgQVVESU9fTkFNRSAiYWljM3giCiAjZGVmaW5lIEFJQzNYX1ZFUlNJT04gIjAuMiIKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCkBAIC05OTEsNyArOTkwLDcgQEAKIAkJCSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKIAogc3RydWN0IHNuZF9zb2NfZGFpIGFpYzN4X2RhaSA9IHsKLQkubmFtZSA9ICJhaWMzeCIsCisJLm5hbWUgPSAidGx2MzIwYWljM3giLAogCS5wbGF5YmFjayA9IHsKIAkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJLmNoYW5uZWxzX21pbiA9IDEsCkBAIC0xMDU1LDcgKzEwNTQsNyBAQAogCXN0cnVjdCBhaWMzeF9zZXR1cF9kYXRhICpzZXR1cCA9IHNvY2Rldi0+Y29kZWNfZGF0YTsKIAlpbnQgcmVnLCByZXQgPSAwOwogCi0JY29kZWMtPm5hbWUgPSAiYWljM3giOworCWNvZGVjLT5uYW1lID0gInRsdjMyMGFpYzN4IjsKIAljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAljb2RlYy0+cmVhZCA9IGFpYzN4X3JlYWRfcmVnX2NhY2hlOwogCWNvZGVjLT53cml0ZSA9IGFpYzN4X3dyaXRlOwpAQCAtMTE3Miw3MSArMTE3MSwzOSBAQAogICogQUlDM1ggMiB3aXJlIGFkZHJlc3MgY2FuIGJlIHVwIHRvIDQgZGV2aWNlcyB3aXRoIGRldmljZSBhZGRyZXNzZXMKICAqIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIKICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKLQotLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KLUkyQ19DTElFTlRfSU5TTU9EOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWljM3hfaTJjX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CiAKIC8qCiAgKiBJZiB0aGUgaTJjIGxheWVyIHdlcmVuJ3Qgc28gYnJva2VuLCB3ZSBjb3VsZCBwYXNzIHRoaXMga2luZCBvZiBkYXRhCiAgKiBhcm91bmQKICAqLwotc3RhdGljIGludCBhaWMzeF9jb2RlY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgYWljM3hfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBhaWMzeF9zb2NkZXY7Ci0Jc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyYzsKIAlpbnQgcmV0OwogCi0JaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLQljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7Ci0KLQlpMmMgPSBrbWVtZHVwKCZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihjbGllbnRfdGVtcGxhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaTJjID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOwogCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKLQlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWljM3g6IGZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwKLQkJICAgICAgIGFkZHIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlyZXQgPSBhaWMzeF9pbml0KHNvY2Rldik7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJhaWMzeDogZmFpbGVkIHRvIGluaXRpYWxpc2UgQUlDM1hcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0JcmV0dXJuIHJldDsKLQotZXJyOgotCWtmcmVlKGkyYyk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhaWMzeF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGFpYzN4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWljM3hfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBhaWMzeF9jb2RlY19wcm9iZSk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljM3hfaTJjX2lkW10gPSB7CisJeyAidGx2MzIwYWljM3giLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFpYzN4X2kyY19pZCk7CiAKIC8qIG1hY2hpbmUgaTJjIGNvZGVjIGNvbnRyb2wgbGF5ZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhaWMzeF9pMmNfZHJpdmVyID0gewpAQCAtMTI0NCwxMyArMTIxMSw5IEBACiAJCS5uYW1lID0gImFpYzN4IEkyQyBDb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyID0gYWljM3hfaTJjX2F0dGFjaCwKLQkuZGV0YWNoX2NsaWVudCA9IGFpYzN4X2kyY19kZXRhY2gsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewotCS5uYW1lID0gIkFJQzNYIiwKLQkuZHJpdmVyID0gJmFpYzN4X2kyY19kcml2ZXIsCisJLnByb2JlID0gYWljM3hfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBhaWMzeF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFpYzN4X2kyY19pZCwKIH07CiAKIHN0YXRpYyBpbnQgYWljM3hfaTJjX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKnZhbHVlLCBpbnQgbGVuKQpAQCAtMTI1OCw2ICsxMjIxLDQ2IEBACiAJdmFsdWVbMF0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCB2YWx1ZVswXSk7CiAJcmV0dXJuIChsZW4gPT0gMSk7CiB9CisKK3N0YXRpYyBpbnQgYWljM3hfYWRkX2kyY19kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgKnNldHVwKQoreworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmYWljM3hfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwlpbmZvLmFkZHIgPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJc3RybGNweShpbmZvLnR5cGUsICJ0bHYzMjBhaWMzeCIsIEkyQ19OQU1FX1NJWkUpOworCisJYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihzZXR1cC0+aTJjX2J1cyk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpMmMgYWRhcHRlciAlZFxuIiwKKwkJCXNldHVwLT5pMmNfYnVzKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCWNsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsICZpbmZvKTsKKwlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKCFjbGllbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpaW5mby5hZGRyKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCXJldHVybiAwOworCitlcnJfZHJpdmVyOgorCWkyY19kZWxfZHJpdmVyKCZhaWMzeF9pMmNfZHJpdmVyKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IGFpYzN4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMjkwLDEyICsxMjkzLDkgQEAKIAlhaWMzeF9zb2NkZXYgPSBzb2NkZXY7CiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKLQkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKIAkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpIGkyY19tYXN0ZXJfc2VuZDsKIAkJY29kZWMtPmh3X3JlYWQgPSAoaHdfcmVhZF90KSBhaWMzeF9pMmNfcmVhZDsKLQkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJmFpYzN4X2kyY19kcml2ZXIpOwotCQlpZiAocmV0ICE9IDApCi0JCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJCXJldCA9IGFpYzN4X2FkZF9pMmNfZGV2aWNlKHBkZXYsIHNldHVwKTsKIAl9CiAjZWxzZQogCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KQEAgLTEzMjAsNiArMTMyMCw3IEBACiAJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKIAlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY29kZWMtPmNvbnRyb2xfZGF0YSk7CiAJaTJjX2RlbF9kcml2ZXIoJmFpYzN4X2kyY19kcml2ZXIpOwogI2VuZGlmCiAJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmgKaW5kZXggZDc2YzA3OS4uMDBhMTk1YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBTFNBIFNvQyBUTFYzMjBBSUMzWCBjb2RlYyBkcml2ZXIKICAqCi0gKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QGVtYmVkZGVkYWxsZXkuY29tPgogICogQ29weXJpZ2h0OiAgIChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4sIDxzb3VyY2VAbXZpc3RhLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjI0LDYgKzIyNCw3IEBACiBpbnQgYWljM3hfaGVhZHNldF9kZXRlY3RlZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogCiBzdHJ1Y3QgYWljM3hfc2V0dXBfZGF0YSB7CisJaW50IGkyY19idXM7CiAJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7CiAJdW5zaWduZWQgaW50IGdwaW9fZnVuY1syXTsKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCmluZGV4IDgwNzMxOGYuLmE2OWVlNzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAidWRhMTM4MC5oIgogCiAjZGVmaW5lIFVEQTEzODBfVkVSU0lPTiAiMC42IgotI2RlZmluZSBBVURJT19OQU1FICJ1ZGExMzgwIgogCiAvKgogICogdWRhMTM4MCByZWdpc3RlciBjYWNoZQpAQCAtNzAxLDg3ICs3MDAsODYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIAotI2RlZmluZSBJMkNfRFJJVkVSSURfVURBMTM4MCAweGZlZmUgLyogbGlhbSAtICBuZWVkIGEgcHJvcGVyIGlkICovCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDAsIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIE1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHVkYTEzODBfaTJjX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KLS8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAgIGFyb3VuZCAqLwotCi1zdGF0aWMgaW50IHVkYTEzODBfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCitzdGF0aWMgaW50IHVkYTEzODBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHVkYTEzODBfc29jZGV2OwogCXN0cnVjdCB1ZGExMzgwX3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyYzsKIAlpbnQgcmV0OwogCi0JaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLQljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7Ci0KLQlpMmMgPSBrbWVtZHVwKCZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihjbGllbnRfdGVtcGxhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaTJjID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOwogCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKLQlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigidWRhMTM4MDogZmFpbGVkIHRvIGF0dGFjaCBjb2RlYyBhdCBhZGRyICV4XG4iLCBhZGRyKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJcmV0ID0gdWRhMTM4MF9pbml0KHNvY2Rldiwgc2V0dXAtPmRhY19jbGspOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCA8IDApCiAJCXByX2VycigidWRhMTM4MDogZmFpbGVkIHRvIGluaXRpYWxpc2UgVURBMTM4MFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXR1cm4gcmV0OwogCi1lcnI6Ci0Ja2ZyZWUoaTJjKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHVkYTEzODBfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCB1ZGExMzgwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWRhMTM4MF9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHVkYTEzODBfY29kZWNfcHJvYmUpOwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHVkYTEzODBfaTJjX2lkW10gPSB7CisJeyAidWRhMTM4MCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdWRhMTM4MF9pMmNfaWQpOwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdWRhMTM4MF9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gICJVREExMzgwIEkyQyBDb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1VEQTEzODAsCi0JLmF0dGFjaF9hZGFwdGVyID0gdWRhMTM4MF9pMmNfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50ID0gIHVkYTEzODBfaTJjX2RldGFjaCwKLQkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorCS5wcm9iZSA9ICAgIHVkYTEzODBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIHVkYTEzODBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB1ZGExMzgwX2kyY19pZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAgICJVREExMzgwIiwKLQkuZHJpdmVyID0gJnVkYTEzODBfaTJjX2RyaXZlciwKLX07CitzdGF0aWMgaW50IHVkYTEzODBfYWRkX2kyY19kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCB1ZGExMzgwX3NldHVwX2RhdGEgKnNldHVwKQoreworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmdWRhMTM4MF9pMmNfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCWluZm8uYWRkciA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwlzdHJsY3B5KGluZm8udHlwZSwgInVkYTEzODAiLCBJMkNfTkFNRV9TSVpFKTsKKworCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoc2V0dXAtPmkyY19idXMpOworCWlmICghYWRhcHRlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaTJjIGFkYXB0ZXIgJWRcbiIsCisJCQlzZXR1cC0+aTJjX2J1cyk7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwljbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CisJaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmICghY2xpZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlIGF0IDB4JXhcbiIsCisJCQkodW5zaWduZWQgaW50KWluZm8uYWRkcik7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RyaXZlcjoKKwlpMmNfZGVsX2RyaXZlcigmdWRhMTM4MF9pMmNfZHJpdmVyKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IHVkYTEzODBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTc4OSw3ICs3ODcsNyBAQAogCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHVkYTEzODBfc2V0dXBfZGF0YSAqc2V0dXA7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlwcl9pbmZvKCJVREExMzgwIEF1ZGlvIENvZGVjICVzIiwgVURBMTM4MF9WRVJTSU9OKTsKIApAQCAtODA0LDE2ICs4MDIsMTMgQEAKIAlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOwogCiAJdWRhMTM4MF9zb2NkZXYgPSBzb2NkZXY7CisJcmV0ID0gLUVOT0RFVjsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIAlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7Ci0JCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CiAJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKLQkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJnVkYTEzODBfaTJjX2RyaXZlcik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWRkIGkyYyBkcml2ZXIiKTsKKwkJcmV0ID0gdWRhMTM4MF9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CiAJfQotI2Vsc2UKLQkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCiAjZW5kaWYKIAogCWlmIChyZXQgIT0gMCkKQEAgLTgzMyw2ICs4MjgsNyBAQAogCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CiAJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNvZGVjLT5jb250cm9sX2RhdGEpOwogCWkyY19kZWxfZHJpdmVyKCZ1ZGExMzgwX2kyY19kcml2ZXIpOwogI2VuZGlmCiAJa2ZyZWUoY29kZWMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmggYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuaAppbmRleCA1MGM2MDNlLi5jNTVjMTdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuaApAQCAtNzMsNiArNzMsNyBAQAogI2RlZmluZSBSMjNfQUdDX0VOCTB4MDAwMQogCiBzdHJ1Y3QgdWRhMTM4MF9zZXR1cF9kYXRhIHsKKwlpbnQgICAgICAgICAgICBpMmNfYnVzOwogCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyZXNzOwogCWludCAgICAgICAgICAgIGRhY19jbGs7CiAjZGVmaW5lIFVEQTEzODBfREFDX0NMS19TWVNDTEsgMApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKaW5kZXggM2Q5OThlNi4uZDhjYTJkYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA2IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKgotICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTI3LDcgKzI4LDYgQEAKIAogI2luY2x1ZGUgIndtODUxMC5oIgogCi0jZGVmaW5lIEFVRElPX05BTUUgIndtODUxMCIKICNkZWZpbmUgV004NTEwX1ZFUlNJT04gIjAuNiIKIAogc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204NTEwOwpAQCAtNTUsNiArNTUsOSBAQAogCTB4MDAwMSwKIH07CiAKKyNkZWZpbmUgV004NTEwX1BPV0VSMV9CSUFTRU4gIDB4MDgKKyNkZWZpbmUgV004NTEwX1BPV0VSMV9CVUZJT0VOIDB4MTAKKwogLyoKICAqIHJlYWQgd204NTEwIHJlZ2lzdGVyIGNhY2hlCiAgKi8KQEAgLTE5OSw3ICsyMDIsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODUxMF9ib29zdF9jb250cm9sc1tdID0gewotU09DX0RBUE1fU0lOR0xFKCJNaWMgUEdBIFN3aXRjaCIsIFdNODUxMF9JTlBQR0EsICA2LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTWljIFBHQSBTd2l0Y2giLCBXTTg1MTBfSU5QUEdBLCAgNiwgMSwgMSksCiBTT0NfREFQTV9TSU5HTEUoIkF1eCBWb2x1bWUiLCBXTTg1MTBfQURDQk9PU1QsIDAsIDcsIDApLAogU09DX0RBUE1fU0lOR0xFKCJNaWMgVm9sdW1lIiwgV004NTEwX0FEQ0JPT1NULCA0LCA3LCAwKSwKIH07CkBAIC0yMjQsOSArMjI3LDkgQEAKIFNORF9TT0NfREFQTV9QR0EoIlNwa1AgT3V0IiwgV004NTEwX1BPV0VSMywgNiwgMCwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fUEdBKCJNb25vIE91dCIsIFdNODUxMF9QT1dFUjMsIDcsIDAsIE5VTEwsIDApLAogCi1TTkRfU09DX0RBUE1fUEdBKCJNaWMgUEdBIiwgV004NTEwX1BPV0VSMiwgMiwgMCwKLQkJICZ3bTg1MTBfbWljcGdhX2NvbnRyb2xzWzBdLAotCQkgQVJSQVlfU0laRSh3bTg1MTBfbWljcGdhX2NvbnRyb2xzKSksCitTTkRfU09DX0RBUE1fTUlYRVIoIk1pYyBQR0EiLCBXTTg1MTBfUE9XRVIyLCAyLCAwLAorCQkgICAmd204NTEwX21pY3BnYV9jb250cm9sc1swXSwKKwkJICAgQVJSQVlfU0laRSh3bTg1MTBfbWljcGdhX2NvbnRyb2xzKSksCiBTTkRfU09DX0RBUE1fTUlYRVIoIkJvb3N0IE1peGVyIiwgV004NTEwX1BPV0VSMiwgNCwgMCwKIAkmd204NTEwX2Jvb3N0X2NvbnRyb2xzWzBdLAogCUFSUkFZX1NJWkUod204NTEwX2Jvb3N0X2NvbnRyb2xzKSksCkBAIC01MjYsMjMgKzUyOSwzNSBAQAogc3RhdGljIGludCB3bTg1MTBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXUxNiBwb3dlcjEgPSB3bTg1MTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODUxMF9QT1dFUjEpICYgfjB4MzsKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKLQkJd204NTEwX3dyaXRlKGNvZGVjLCBXTTg1MTBfUE9XRVIxLCAweDFmZik7Ci0JCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMiwgMHgxZmYpOwotCQl3bTg1MTBfd3JpdGUoY29kZWMsIFdNODUxMF9QT1dFUjMsIDB4MWZmKTsKLQkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKLQljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlwb3dlcjEgfD0gMHgxOyAgLyogVk1JRCA1MGsgKi8KKwkJd204NTEwX3dyaXRlKGNvZGVjLCBXTTg1MTBfUE9XRVIxLCBwb3dlcjEpOwogCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXBvd2VyMSB8PSBXTTg1MTBfUE9XRVIxX0JJQVNFTiB8IFdNODUxMF9QT1dFUjFfQlVGSU9FTjsKKworCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJLyogSW5pdGlhbCBjYXAgY2hhcmdlIGF0IFZNSUQgNWsgKi8KKwkJCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMSwgcG93ZXIxIHwgMHgzKTsKKwkJCW1kZWxheSgxMDApOworCQl9CisKKwkJcG93ZXIxIHw9IDB4MjsgIC8qIFZNSUQgNTAwayAqLworCQl3bTg1MTBfd3JpdGUoY29kZWMsIFdNODUxMF9QT1dFUjEsIHBvd2VyMSk7CisJCWJyZWFrOworCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQkvKiBldmVyeXRoaW5nIG9mZiwgZGFjIG11dGUsIGluYWN0aXZlICovCi0JCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMSwgMHgwKTsKLQkJd204NTEwX3dyaXRlKGNvZGVjLCBXTTg1MTBfUE9XRVIyLCAweDApOwotCQl3bTg1MTBfd3JpdGUoY29kZWMsIFdNODUxMF9QT1dFUjMsIDB4MCk7CisJCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMSwgMCk7CisJCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMiwgMCk7CisJCXdtODUxMF93cml0ZShjb2RlYywgV004NTEwX1BPV0VSMywgMCk7CiAJCWJyZWFrOwogCX0KKwogCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CkBAIC02NDAsNiArNjU1LDcgQEAKIAl9CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KKwljb2RlYy0+Ymlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJd204NTEwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAJd204NTEwX2FkZF9jb250cm9scyhjb2RlYyk7CiAJd204NTEwX2FkZF93aWRnZXRzKGNvZGVjKTsKQEAgLTY2NSw5MCArNjgxLDE0NCBAQAogLyoKICAqIFdNODUxMCAyIHdpcmUgYWRkcmVzcyBpcyAweDFhCiAgKi8KLSNkZWZpbmUgSTJDX0RSSVZFUklEX1dNODUxMCAweGZlZmUgLyogbGlhbSAtICBuZWVkIGEgcHJvcGVyIGlkICovCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDAsIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIE1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODUxMF9pMmNfZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQotLyogSWYgdGhlIGkyYyBsYXllciB3ZXJlbid0IHNvIGJyb2tlbiwgd2UgY291bGQgcGFzcyB0aGlzIGtpbmQgb2YgZGF0YQotICAgYXJvdW5kICovCi0KLXN0YXRpYyBpbnQgd204NTEwX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQorc3RhdGljIGludCB3bTg1MTBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NTEwX3NvY2RldjsKLQlzdHJ1Y3Qgd204NTEwX3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyYzsKIAlpbnQgcmV0OwogCi0JaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKLQljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7Ci0KLQlpMmMgPSBrbWVtZHVwKCZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihjbGllbnRfdGVtcGxhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaTJjID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOwogCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKLQlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIGF0dGFjaCBjb2RlYyBhdCBhZGRyICV4XG4iLCBhZGRyKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJcmV0ID0gd204NTEwX2luaXQoc29jZGV2KTsKLQlpZiAocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKQogCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXNlIFdNODUxMFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXR1cm4gcmV0OwogCi1lcnI6Ci0Ja2ZyZWUoaTJjKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdtODUxMF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHdtODUxMF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKLQlrZnJlZShjbGllbnQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtODUxMF9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODUxMF9jb2RlY19wcm9iZSk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd204NTEwX2kyY19pZFtdID0geworCXsgIndtODUxMCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204NTEwX2kyY19pZCk7CiAKLS8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NTEwX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiV004NTEwIEkyQyBDb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODUxMCwKLQkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg1MTBfaTJjX2F0dGFjaCwKLQkuZGV0YWNoX2NsaWVudCA9ICB3bTg1MTBfaTJjX2RldGFjaCwKLQkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorCS5wcm9iZSA9ICAgIHdtODUxMF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9ICAgd204NTEwX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gd204NTEwX2kyY19pZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAgICJXTTg1MTAiLAotCS5kcml2ZXIgPSAmd204NTEwX2kyY19kcml2ZXIsCi19Oworc3RhdGljIGludCB3bTg1MTBfYWRkX2kyY19kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHdtODUxMF9zZXR1cF9kYXRhICpzZXR1cCkKK3sKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODUxMF9pMmNfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCWluZm8uYWRkciA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwlzdHJsY3B5KGluZm8udHlwZSwgIndtODUxMCIsIEkyQ19OQU1FX1NJWkUpOworCisJYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihzZXR1cC0+aTJjX2J1cyk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpMmMgYWRhcHRlciAlZFxuIiwKKwkJCXNldHVwLT5pMmNfYnVzKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCWNsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsICZpbmZvKTsKKwlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKCFjbGllbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpaW5mby5hZGRyKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCXJldHVybiAwOworCitlcnJfZHJpdmVyOgorCWkyY19kZWxfZHJpdmVyKCZ3bTg1MTBfaTJjX2RyaXZlcik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg1MTBfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg1MTBfc29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldDsKKworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzcGk7CisKKwlyZXQgPSB3bTg1MTBfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXNlIFdNODUxMFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTg1MTBfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd204NTEwX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAid204NTEwIiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHdtODUxMF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg1MTBfc3BpX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IHdtODUxMF9zcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJdTggbXNnWzJdOworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gMDsKKworCW1zZ1swXSA9IGRhdGFbMF07CisJbXNnWzFdID0gZGF0YVsxXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCW1lbXNldCgmdCwgMCwgKHNpemVvZiB0KSk7CisKKwl0LnR4X2J1ZiA9ICZtc2dbMF07CisJdC5sZW4gPSBsZW47CisKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdCwgJm0pOworCXNwaV9zeW5jKHNwaSwgJm0pOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1BJX01BU1RFUiAqLworCiBzdGF0aWMgaW50IHdtODUxMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC03NzEsMTQgKzg0MSwxNyBAQAogCXdtODUxMF9zb2NkZXYgPSBzb2NkZXY7CiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKLQkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKIAkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NTEwX2kyY19kcml2ZXIpOwotCQlpZiAocmV0ICE9IDApCi0JCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJCXJldCA9IHdtODUxMF9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CiAJfQotI2Vsc2UKLQkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCWlmIChzZXR1cC0+c3BpKSB7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KXdtODUxMF9zcGlfd3JpdGU7CisJCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJndtODUxMF9zcGlfZHJpdmVyKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgc3BpIGRyaXZlciIpOworCX0KICNlbmRpZgogCiAJaWYgKHJldCAhPSAwKQpAQCAtNzk4LDggKzg3MSwxMiBAQAogCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CiAJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNvZGVjLT5jb250cm9sX2RhdGEpOwogCWkyY19kZWxfZHJpdmVyKCZ3bTg1MTBfaTJjX2RyaXZlcik7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NTEwX3NwaV9kcml2ZXIpOworI2VuZGlmCiAJa2ZyZWUoY29kZWMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuaAppbmRleCBmNWQyZTQyLi5iZGVmY2Y1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmgKQEAgLTk0LDYgKzk0LDggQEAKICNkZWZpbmUgV004NTEwX01DTEtESVZfMTIJKDcgPDwgNSkKIAogc3RydWN0IHdtODUxMF9zZXR1cF9kYXRhIHsKKwlpbnQgc3BpOworCWludCBpMmNfYnVzOwogCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyZXNzOwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ZWJmYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKQEAgLTAsMCArMSwxMDUzIEBACisvKgorICogd204NTgwLmMgIC0tICBXTTg1ODAgQUxTQSBTb2MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBOb3RlczoKKyAqICBUaGUgV004NTgwIGlzIGEgbXVsdGljaGFubmVsIGNvZGVjIHdpdGggUy9QRElGIHN1cHBvcnQsIGZlYXR1cmluZyBzaXgKKyAqICBEQUMgY2hhbm5lbHMgYW5kIHR3byBBREMgY2hhbm5lbHMuCisgKgorICogIEN1cnJlbnRseSBvbmx5IHRoZSBwcmltYXJ5IGF1ZGlvIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQgLSBTL1BESUYgYW5kCisgKiAgdGhlIHNlY29uZGFyeSBhdWRpbyBpbnRlcmZhY2VzIGFyZSBub3QuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAid204NTgwLmgiCisKKyNkZWZpbmUgV004NTgwX1ZFUlNJT04gIjAuMSIKKworc3RydWN0IHBsbF9zdGF0ZSB7CisJdW5zaWduZWQgaW50IGluOworCXVuc2lnbmVkIGludCBvdXQ7Cit9OworCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTg1ODBfcHJpdiB7CisJc3RydWN0IHBsbF9zdGF0ZSBhOworCXN0cnVjdCBwbGxfc3RhdGUgYjsKK307CisKKy8qIFdNODU4MCByZWdpc3RlciBzcGFjZSAqLworI2RlZmluZSBXTTg1ODBfUExMQTEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTg1ODBfUExMQTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTg1ODBfUExMQTMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBXTTg1ODBfUExMQTQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBXTTg1ODBfUExMQjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTg1ODBfUExMQjIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTg1ODBfUExMQjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTg1ODBfUExMQjQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBXTTg1ODBfQ0xLU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTg1ODBfUEFJRjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBXTTg1ODBfUEFJRjIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBXTTg1ODBfU0FJRjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBXTTg1ODBfUEFJRjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBXTTg1ODBfUEFJRjQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBXTTg1ODBfU0FJRjIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBXTTg1ODBfREFDX0NPTlRST0wxICAgICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBXTTg1ODBfREFDX0NPTlRST0wyICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTg1ODBfREFDX0NPTlRST0wzICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBXTTg1ODBfREFDX0NPTlRST0w0ICAgICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBXTTg1ODBfREFDX0NPTlRST0w1ICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMSAgICAgMHgxNAorI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMSAgICAgMHgxNQorI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMiAgICAgMHgxNgorI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMiAgICAgMHgxNworI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMyAgICAgMHgxOAorI2RlZmluZSBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMyAgICAgMHgxOQorI2RlZmluZSBXTTg1ODBfTUFTVEVSX0RJR0lUQUxfQVRURU5VQVRJT04gICAgMHgxQworI2RlZmluZSBXTTg1ODBfQURDX0NPTlRST0wxICAgICAgICAgICAgICAgICAgMHgxRAorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFOMCAgICAgICAgICAgICAgICAgICAgMHgxRQorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFOMSAgICAgICAgICAgICAgICAgICAgMHgxRgorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFOMiAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFOMyAgICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFONCAgICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBXTTg1ODBfU1BEVFhDSEFONSAgICAgICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBXTTg1ODBfU1BETU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBXTTg1ODBfSU5UTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBXTTg1ODBfR1BPMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBXTTg1ODBfR1BPMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBXTTg1ODBfR1BPMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXTTg1ODBfR1BPNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBXTTg1ODBfR1BPNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBXTTg1ODBfSU5UU1RBVCAgICAgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBXTTg1ODBfU1BEUlhDSEFOMSAgICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBXTTg1ODBfU1BEUlhDSEFOMiAgICAgICAgICAgICAgICAgICAgMHgyRAorI2RlZmluZSBXTTg1ODBfU1BEUlhDSEFOMyAgICAgICAgICAgICAgICAgICAgMHgyRQorI2RlZmluZSBXTTg1ODBfU1BEUlhDSEFONCAgICAgICAgICAgICAgICAgICAgMHgyRgorI2RlZmluZSBXTTg1ODBfU1BEUlhDSEFONSAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTg1ODBfU1BEU1RBVCAgICAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBXTTg1ODBfUFdSRE4xICAgICAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTg1ODBfUFdSRE4yICAgICAgICAgICAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBXTTg1ODBfUkVBREJBQ0sgICAgICAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBXTTg1ODBfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNQorCisvKiBQTExCNCAocmVnaXN0ZXIgN2gpICovCisjZGVmaW5lIFdNODU4MF9QTExCNF9NQ0xLT1VUU1JDX01BU0sgICAweDYwCisjZGVmaW5lIFdNODU4MF9QTExCNF9NQ0xLT1VUU1JDX1BMTEEgICAweDIwCisjZGVmaW5lIFdNODU4MF9QTExCNF9NQ0xLT1VUU1JDX1BMTEIgICAweDQwCisjZGVmaW5lIFdNODU4MF9QTExCNF9NQ0xLT1VUU1JDX09TQyAgICAweDYwCisKKyNkZWZpbmUgV004NTgwX1BMTEI0X0NMS09VVFNSQ19NQVNLICAgIDB4MTgwCisjZGVmaW5lIFdNODU4MF9QTExCNF9DTEtPVVRTUkNfUExMQUNMSyAweDA4MAorI2RlZmluZSBXTTg1ODBfUExMQjRfQ0xLT1VUU1JDX1BMTEJDTEsgMHgxMDAKKyNkZWZpbmUgV004NTgwX1BMTEI0X0NMS09VVFNSQ19PU0NDTEsgIDB4MTgwCisKKy8qIENMS1NFTCAocmVnaXN0ZXIgOGgpICovCisjZGVmaW5lIFdNODU4MF9DTEtTRUxfREFDX0NMS1NFTF9NQVNLIDB4MDMKKyNkZWZpbmUgV004NTgwX0NMS1NFTF9EQUNfQ0xLU0VMX1BMTEEgMHgwMQorI2RlZmluZSBXTTg1ODBfQ0xLU0VMX0RBQ19DTEtTRUxfUExMQiAweDAyCisKKy8qIEFJRiBjb250cm9sIDEgKHJlZ2lzdGVycyA5aC1iaCkgKi8KKyNkZWZpbmUgV004NTgwX0FJRl9SQVRFX01BU0sgICAgICAgMHg3CisjZGVmaW5lIFdNODU4MF9BSUZfUkFURV8xMjggICAgICAgIDB4MAorI2RlZmluZSBXTTg1ODBfQUlGX1JBVEVfMTkyICAgICAgICAweDEKKyNkZWZpbmUgV004NTgwX0FJRl9SQVRFXzI1NiAgICAgICAgMHgyCisjZGVmaW5lIFdNODU4MF9BSUZfUkFURV8zODQgICAgICAgIDB4MworI2RlZmluZSBXTTg1ODBfQUlGX1JBVEVfNTEyICAgICAgICAweDQKKyNkZWZpbmUgV004NTgwX0FJRl9SQVRFXzc2OCAgICAgICAgMHg1CisjZGVmaW5lIFdNODU4MF9BSUZfUkFURV8xMTUyICAgICAgIDB4NgorCisjZGVmaW5lIFdNODU4MF9BSUZfQkNMS1NFTF9NQVNLICAgMHgxOAorI2RlZmluZSBXTTg1ODBfQUlGX0JDTEtTRUxfNjQgICAgIDB4MDAKKyNkZWZpbmUgV004NTgwX0FJRl9CQ0xLU0VMXzEyOCAgICAweDA4CisjZGVmaW5lIFdNODU4MF9BSUZfQkNMS1NFTF8yNTYgICAgMHgxMAorI2RlZmluZSBXTTg1ODBfQUlGX0JDTEtTRUxfU1lTQ0xLIDB4MTgKKworI2RlZmluZSBXTTg1ODBfQUlGX01TICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBXTTg1ODBfQUlGX0NMS1NSQ19NQVNLICAgIDB4YzAKKyNkZWZpbmUgV004NTgwX0FJRl9DTEtTUkNfUExMQSAgICAweDQwCisjZGVmaW5lIFdNODU4MF9BSUZfQ0xLU1JDX1BMTEIgICAgMHg0MAorI2RlZmluZSBXTTg1ODBfQUlGX0NMS1NSQ19NQ0xLICAgIDB4YzAKKworLyogQUlGIGNvbnRyb2wgMiAocmVnaXN0ZXJzIGNoLWVoKSAqLworI2RlZmluZSBXTTg1ODBfQUlGX0ZNVF9NQVNLICAgIDB4MDMKKyNkZWZpbmUgV004NTgwX0FJRl9GTVRfUklHSFRKICAweDAwCisjZGVmaW5lIFdNODU4MF9BSUZfRk1UX0xFRlRKICAgMHgwMQorI2RlZmluZSBXTTg1ODBfQUlGX0ZNVF9JMlMgICAgIDB4MDIKKyNkZWZpbmUgV004NTgwX0FJRl9GTVRfRFNQICAgICAweDAzCisKKyNkZWZpbmUgV004NTgwX0FJRl9MRU5HVEhfTUFTSyAgIDB4MGMKKyNkZWZpbmUgV004NTgwX0FJRl9MRU5HVEhfMTYgICAgIDB4MDAKKyNkZWZpbmUgV004NTgwX0FJRl9MRU5HVEhfMjAgICAgIDB4MDQKKyNkZWZpbmUgV004NTgwX0FJRl9MRU5HVEhfMjQgICAgIDB4MDgKKyNkZWZpbmUgV004NTgwX0FJRl9MRU5HVEhfMzIgICAgIDB4MGMKKworI2RlZmluZSBXTTg1ODBfQUlGX0xSUCAgICAgICAgIDB4MTAKKyNkZWZpbmUgV004NTgwX0FJRl9CQ1AgICAgICAgICAweDIwCisKKy8qIFBvd2VyZG93biBSZWdpc3RlciAxIChyZWdpc3RlciAzMmgpICovCisjZGVmaW5lIFdNODU4MF9QV1JETjFfUFdETiAgICAgMHgwMDEKKyNkZWZpbmUgV004NTgwX1BXUkROMV9BTExEQUNQRCAweDA0MAorCisvKiBQb3dlcmRvd24gUmVnaXN0ZXIgMiAocmVnaXN0ZXIgMzNoKSAqLworI2RlZmluZSBXTTg1ODBfUFdSRE4yX09TU0NQRCAgIDB4MDAxCisjZGVmaW5lIFdNODU4MF9QV1JETjJfUExMQVBEICAgMHgwMDIKKyNkZWZpbmUgV004NTgwX1BXUkROMl9QTExCUEQgICAweDAwNAorI2RlZmluZSBXTTg1ODBfUFdSRE4yX1NQRElGUEQgIDB4MDA4CisjZGVmaW5lIFdNODU4MF9QV1JETjJfU1BESUZUWEQgMHgwMTAKKyNkZWZpbmUgV004NTgwX1BXUkROMl9TUERJRlJYRCAweDAyMAorCisjZGVmaW5lIFdNODU4MF9EQUNfQ09OVFJPTDVfTVVURUFMTCAweDEwCisKKy8qCisgKiB3bTg1ODAgcmVnaXN0ZXIgY2FjaGUKKyAqIFdlIGNhbid0IHJlYWQgdGhlIFdNODU4MCByZWdpc3RlciBzcGFjZSB3aGVuIHdlCisgKiBhcmUgdXNpbmcgMiB3aXJlIGZvciBkZXZpY2UgY29udHJvbCwgc28gd2UgY2FjaGUgdGhlbSBpbnN0ZWFkLgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODU4MF9yZWdbXSA9IHsKKwkweDAxMjEsIDB4MDE3ZSwgMHgwMDdkLCAweDAwMTQsIC8qUjMqLworCTB4MDEyMSwgMHgwMTdlLCAweDAwN2QsIDB4MDE5NCwgLypSNyovCisJMHgwMDFjLCAweDAwMDIsIDB4MDAwMiwgMHgwMGMyLCAvKlIxMSovCisJMHgwMTgyLCAweDAwODIsIDB4MDAwYSwgMHgwMDI0LCAvKlIxNSovCisJMHgwMDA5LCAweDAwMDAsIDB4MDBmZiwgMHgwMDAwLCAvKlIxOSovCisJMHgwMGZmLCAweDAwZmYsIDB4MDBmZiwgMHgwMGZmLCAvKlIyMyovCisJMHgwMGZmLCAweDAwZmYsIDB4MDBmZiwgMHgwMGZmLCAvKlIyNyovCisJMHgwMWYwLCAweDAwNDAsIDB4MDAwMCwgMHgwMDAwLCAvKlIzMSgweDFGKSovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDBiLCAvKlIzNSovCisJMHgwMDM5LCAweDAwMDAsIDB4MDAxMCwgMHgwMDMyLCAvKlIzOSovCisJMHgwMDU0LCAweDAwNzYsIDB4MDA5OCwgMHgwMDAwLCAvKlI0MygweDJCKSovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAvKlI0NyovCisJMHgwMDAwLCAweDAwMDAsIDB4MDA1ZSwgMHgwMDNlLCAvKlI1MSgweDMzKSovCisJMHgwMDAwLCAweDAwMDAgLypSNTMqLworfTsKKworLyoKKyAqIHJlYWQgd204NTgwIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdtODU4MF9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlCVUdfT04ocmVnID4gQVJSQVlfU0laRSh3bTg1ODBfcmVnKSk7CisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKKy8qCisgKiB3cml0ZSB3bTg1ODAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdtODU4MF93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworLyoKKyAqIHdyaXRlIHRvIHRoZSBXTTg1ODAgcmVnaXN0ZXIgc3BhY2UKKyAqLworc3RhdGljIGludCB3bTg1ODBfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzJdOworCisJQlVHX09OKHJlZyA+IEFSUkFZX1NJWkUod204NTgwX3JlZykpOworCisJLyogUmVnaXN0ZXJzIGFyZSA5IGJpdHMgd2lkZSAqLworCXZhbHVlICY9IDB4MWZmOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFdNODU4MF9SRVNFVDoKKwkJLyogVW5jYWNoZWQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHZhbHVlID09IHdtODU4MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIGRhdGEgaXMKKwkgKiAgIEQxNS4uRDkgV004NTgwIHJlZ2lzdGVyIG9mZnNldAorCSAqICAgRDguLi5EMCByZWdpc3RlciBkYXRhCisJICovCisJZGF0YVswXSA9IChyZWcgPDwgMSkgfCAoKHZhbHVlID4+IDgpICYgMHgwMDAxKTsKKwlkYXRhWzFdID0gdmFsdWUgJiAweDAwZmY7CisKKwl3bTg1ODBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdtODU4MF9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWRlZmF1bHQ6CisJCXJldHVybiB3bTg1ODBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7CisJfQorfQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGFjX3RsdiwgLTEyNzUwLCA1MCwgMSk7CisKK3N0YXRpYyBpbnQgd204NTgwX291dF92dShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCByZXQ7CisJdTE2IHZhbDsKKworCS8qIENsZWFyIHRoZSByZWdpc3RlciBjYWNoZSBzbyB3ZSB3cml0ZSB3aXRob3V0IFZVIHNldCAqLworCXdtODU4MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgMCk7CisJd204NTgwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnMiwgMCk7CisKKwlyZXQgPSBzbmRfc29jX3B1dF92b2xzd18ycihrY29udHJvbCwgdWNvbnRyb2wpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTm93IHdyaXRlIGFnYWluIHdpdGggdGhlIHZvbHVtZSB1cGRhdGUgYml0IHNldCAqLworCXZhbCA9IHdtODU4MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKTsKKwl3bTg1ODBfd3JpdGUoY29kZWMsIHJlZywgdmFsIHwgMHgwMTAwKTsKKworCXZhbCA9IHdtODU4MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnMik7CisJd204NTgwX3dyaXRlKGNvZGVjLCByZWcyLCB2YWwgfCAweDAxMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU09DX1dNODU4MF9PVVRfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCBzaGlmdCwgbWF4LCBpbnZlcnQsIHRsdl9hcnJheSkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLCBcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAorCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLCAgXAorCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsIFwKKwkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3dfMnIsIC5wdXQgPSB3bTg1ODBfb3V0X3Z1LCBcCisJLnByaXZhdGVfdmFsdWUgPSAocmVnX2xlZnQpIHwgKChzaGlmdCkgPDwgOCkgIHwJCVwKKwkJKChtYXgpIDw8IDEyKSB8ICgoaW52ZXJ0KSA8PCAyMCkgfCAoKHJlZ19yaWdodCkgPDwgMjQpIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODU4MF9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19XTTg1ODBfT1VUX0RPVUJMRV9SX1RMVigiREFDMSBQbGF5YmFjayBWb2x1bWUiLAorCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ0wxLAorCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ1IxLAorCQkJICAgIDAsIDB4ZmYsIDAsIGRhY190bHYpLAorU09DX1dNODU4MF9PVVRfRE9VQkxFX1JfVExWKCJEQUMyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDTDIsCisJCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDUjIsCisJCQkgICAgMCwgMHhmZiwgMCwgZGFjX3RsdiksCitTT0NfV004NTgwX09VVF9ET1VCTEVfUl9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwKKwkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMywKKwkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMywKKwkJCSAgICAwLCAweGZmLCAwLCBkYWNfdGx2KSwKKworU09DX1NJTkdMRSgiREFDMSBEZWVtcGhhc2lzIFN3aXRjaCIsIFdNODU4MF9EQUNfQ09OVFJPTDMsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiREFDMiBEZWVtcGhhc2lzIFN3aXRjaCIsIFdNODU4MF9EQUNfQ09OVFJPTDMsIDEsIDEsIDApLAorU09DX1NJTkdMRSgiREFDMyBEZWVtcGhhc2lzIFN3aXRjaCIsIFdNODU4MF9EQUNfQ09OVFJPTDMsIDIsIDEsIDApLAorCitTT0NfRE9VQkxFKCJEQUMxIEludmVydCBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0w0LCAgMCwgMSwgMSwgMCksCitTT0NfRE9VQkxFKCJEQUMyIEludmVydCBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0w0LCAgMiwgMywgMSwgMCksCitTT0NfRE9VQkxFKCJEQUMzIEludmVydCBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0w0LCAgNCwgNSwgMSwgMCksCisKK1NPQ19TSU5HTEUoIkRBQyBaQyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0w1LCA1LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRBQzEgU3dpdGNoIiwgV004NTgwX0RBQ19DT05UUk9MNSwgMCwgMSwgMCksCitTT0NfU0lOR0xFKCJEQUMyIFN3aXRjaCIsIFdNODU4MF9EQUNfQ09OVFJPTDUsIDEsIDEsIDApLAorU09DX1NJTkdMRSgiREFDMyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0w1LCAyLCAxLCAwKSwKKworU09DX0RPVUJMRSgiQURDIE11dGUgU3dpdGNoIiwgV004NTgwX0FEQ19DT05UUk9MMSwgMCwgMSwgMSwgMCksCitTT0NfU0lOR0xFKCJBREMgSGlnaC1QYXNzIEZpbHRlciBTd2l0Y2giLCBXTTg1ODBfQURDX0NPTlRST0wxLCA0LCAxLCAwKSwKK307CisKKy8qIEFkZCBub24tREFQTSBjb250cm9scyAqLworc3RhdGljIGludCB3bTg1ODBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NTgwX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQkgIHNuZF9zb2NfY25ldygmd204NTgwX3NuZF9jb250cm9sc1tpXSwKKwkJCQkJICAgICAgIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NTgwX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0RBQygiREFDMSIsICJQbGF5YmFjayIsIFdNODU4MF9QV1JETjEsIDIsIDEpLAorU05EX1NPQ19EQVBNX0RBQygiREFDMiIsICJQbGF5YmFjayIsIFdNODU4MF9QV1JETjEsIDMsIDEpLAorU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIFdNODU4MF9QV1JETjEsIDQsIDEpLAorCitTTkRfU09DX0RBUE1fT1VUUFVUKCJWT1VUMUwiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlZPVVQxUiIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiVk9VVDJMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJWT1VUMlIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlZPVVQzTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiVk9VVDNSIiksCisKK1NORF9TT0NfREFQTV9BREMoIkFEQyIsICJDYXB0dXJlIiwgV004NTgwX1BXUkROMSwgMSwgMSksCisKK1NORF9TT0NfREFQTV9JTlBVVCgiQUlOTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJBSU5SIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKKwl7ICJWT1VUMUwiLCBOVUxMLCAiREFDMSIgfSwKKwl7ICJWT1VUMVIiLCBOVUxMLCAiREFDMSIgfSwKKworCXsgIlZPVVQyTCIsIE5VTEwsICJEQUMyIiB9LAorCXsgIlZPVVQyUiIsIE5VTEwsICJEQUMyIiB9LAorCisJeyAiVk9VVDNMIiwgTlVMTCwgIkRBQzMiIH0sCisJeyAiVk9VVDNSIiwgTlVMTCwgIkRBQzMiIH0sCisKKwl7ICJBREMiLCBOVUxMLCAiQUlOTCIgfSwKKwl7ICJBREMiLCBOVUxMLCAiQUlOUiIgfSwKK307CisKK3N0YXRpYyBpbnQgd204NTgwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg1ODBfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzKSk7CisKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworLyogUExMIGRpdmlzb3JzICovCitzdHJ1Y3QgX3BsbF9kaXYgeworCXUzMiBwcmVzY2FsZToxOworCXUzMiBwb3N0c2NhbGU6MTsKKwl1MzIgZnJlcW1vZGU6MjsKKwl1MzIgbjo0OworCXUzMiBrOjI0OworfTsKKworLyogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgcGxsIGRpdmlkZSAqLworI2RlZmluZSBGSVhFRF9QTExfU0laRSAoMSA8PCAyMikKKworLyogUExMIHJhdGUgdG8gb3V0cHV0IHJhdGUgZGl2aXNpb25zICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBmcmVxbW9kZTsKKwl1bnNpZ25lZCBpbnQgcG9zdHNjYWxlOworfSBwb3N0X3RhYmxlW10gPSB7CisJeyAgMiwgIDAsIDAgfSwKKwl7ICA0LCAgMCwgMSB9LAorCXsgIDQsICAxLCAwIH0sCisJeyAgOCwgIDEsIDEgfSwKKwl7ICA4LCAgMiwgMCB9LAorCXsgMTYsICAyLCAxIH0sCisJeyAxMiwgIDMsIDAgfSwKKwl7IDI0LCAgMywgMSB9Cit9OworCitzdGF0aWMgaW50IHBsbF9mYWN0b3JzKHN0cnVjdCBfcGxsX2RpdiAqcGxsX2RpdiwgdW5zaWduZWQgaW50IHRhcmdldCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzb3VyY2UpCit7CisJdTY0IEtwYXJ0OworCXVuc2lnbmVkIGludCBLLCBOZGl2LCBObW9kOworCWludCBpOworCisJcHJfZGVidWcoIndtODU4MDogUExMICVkSHotPiVkSHpcbiIsIHNvdXJjZSwgdGFyZ2V0KTsKKworCS8qIFNjYWxlIHRoZSBvdXRwdXQgZnJlcXVlbmN5IHVwOyB0aGUgUExMIHNob3VsZCBydW4gaW4gdGhlCisJICogcmVnaW9uIG9mIDkwLTEwME1Iei4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3N0X3RhYmxlKTsgaSsrKSB7CisJCWlmICh0YXJnZXQgKiBwb3N0X3RhYmxlW2ldLmRpdiA+PSAgOTAwMDAwMDAgJiYKKwkJICAgIHRhcmdldCAqIHBvc3RfdGFibGVbaV0uZGl2IDw9IDEwMDAwMDAwMCkgeworCQkJcGxsX2Rpdi0+ZnJlcW1vZGUgPSBwb3N0X3RhYmxlW2ldLmZyZXFtb2RlOworCQkJcGxsX2Rpdi0+cG9zdHNjYWxlID0gcG9zdF90YWJsZVtpXS5wb3N0c2NhbGU7CisJCQl0YXJnZXQgKj0gcG9zdF90YWJsZVtpXS5kaXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IEFSUkFZX1NJWkUocG9zdF90YWJsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg1ODA6IFVuYWJsZSB0byBzY2FsZSBvdXRwdXQgZnJlcXVlbmN5ICIKKwkJICAgICAgICIldVxuIiwgdGFyZ2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJTmRpdiA9IHRhcmdldCAvIHNvdXJjZTsKKworCWlmIChOZGl2IDwgNSkgeworCQlzb3VyY2UgLz0gMjsKKwkJcGxsX2Rpdi0+cHJlc2NhbGUgPSAxOworCQlOZGl2ID0gdGFyZ2V0IC8gc291cmNlOworCX0gZWxzZQorCQlwbGxfZGl2LT5wcmVzY2FsZSA9IDA7CisKKwlpZiAoKE5kaXYgPCA1KSB8fCAoTmRpdiA+IDEzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJXTTg1ODAgTj0lZCBvdXRzaWRlIHN1cHBvcnRlZCByYW5nZVxuIiwgTmRpdik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBsbF9kaXYtPm4gPSBOZGl2OworCU5tb2QgPSB0YXJnZXQgJSBzb3VyY2U7CisJS3BhcnQgPSBGSVhFRF9QTExfU0laRSAqIChsb25nIGxvbmcpTm1vZDsKKworCWRvX2RpdihLcGFydCwgc291cmNlKTsKKworCUsgPSBLcGFydCAmIDB4RkZGRkZGRkY7CisKKwlwbGxfZGl2LT5rID0gSzsKKworCXByX2RlYnVnKCJQTEwgJXguJXggcHJlc2NhbGUgJWQgZnJlcW1vZGUgJWQgcG9zdHNjYWxlICVkXG4iLAorCQkgcGxsX2Rpdi0+biwgcGxsX2Rpdi0+aywgcGxsX2Rpdi0+cHJlc2NhbGUsIHBsbF9kaXYtPmZyZXFtb2RlLAorCQkgcGxsX2Rpdi0+cG9zdHNjYWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODU4MF9zZXRfZGFpX3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IHBsbF9pZCwgdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKK3sKKwlpbnQgb2Zmc2V0OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODAgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwbGxfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBfcGxsX2RpdiBwbGxfZGl2OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IHB3cl9tYXNrOworCWludCByZXQ7CisKKwkvKiBHQ0MgaXNuJ3QgYWJsZSB0byB3b3JrIG91dCB0aGUgaWZzIGJlbG93IGZvciBpbml0aWFsaXNpbmcvdXNpbmcKKwkgKiBwbGxfZGl2IHNvIHN1cHByZXNzIHdhcm5pbmdzLgorCSAqLworCW1lbXNldCgmcGxsX2RpdiwgMCwgc2l6ZW9mKHBsbF9kaXYpKTsKKworCXN3aXRjaCAocGxsX2lkKSB7CisJY2FzZSBXTTg1ODBfUExMQToKKwkJc3RhdGUgPSAmd204NTgwLT5hOworCQlvZmZzZXQgPSAwOworCQlwd3JfbWFzayA9IFdNODU4MF9QV1JETjJfUExMQVBEOworCQlicmVhazsKKwljYXNlIFdNODU4MF9QTExCOgorCQlzdGF0ZSA9ICZ3bTg1ODAtPmI7CisJCW9mZnNldCA9IDQ7CisJCXB3cl9tYXNrID0gV004NTgwX1BXUkROMl9QTExCUEQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChmcmVxX2luICYmIGZyZXFfb3V0KSB7CisJCXJldCA9IHBsbF9mYWN0b3JzKCZwbGxfZGl2LCBmcmVxX291dCwgZnJlcV9pbik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc3RhdGUtPmluID0gZnJlcV9pbjsKKwlzdGF0ZS0+b3V0ID0gZnJlcV9vdXQ7CisKKwkvKiBBbHdheXMgZGlzYWJsZSB0aGUgUExMIC0gaXQgaXMgbm90IHNhZmUgdG8gbGVhdmUgaXQgcnVubmluZworCSAqIHdoaWxlIHJlcHJvZ3JhbW1pbmcgaXQuCisJICovCisJcmVnID0gd204NTgwX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjIpOworCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1BXUkROMiwgcmVnIHwgcHdyX21hc2spOworCisJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkKKwkJcmV0dXJuIDA7CisKKwl3bTg1ODBfd3JpdGUoY29kZWMsIFdNODU4MF9QTExBMSArIG9mZnNldCwgcGxsX2Rpdi5rICYgMHgxZmYpOworCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1BMTEEyICsgb2Zmc2V0LCAocGxsX2Rpdi5rID4+IDkpICYgMHhmZik7CisJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfUExMQTMgKyBvZmZzZXQsCisJCSAgICAgKHBsbF9kaXYuayA+PiAxOCAmIDB4ZikgfCAocGxsX2Rpdi5uIDw8IDQpKTsKKworCXJlZyA9IHdtODU4MF9yZWFkKGNvZGVjLCBXTTg1ODBfUExMQTQgKyBvZmZzZXQpOworCXJlZyAmPSB+MHgzZjsKKwlyZWcgfD0gcGxsX2Rpdi5wcmVzY2FsZSB8IHBsbF9kaXYucG9zdHNjYWxlIDw8IDEgfAorCQlwbGxfZGl2LmZyZXFtb2RlIDw8IDQ7CisKKwl3bTg1ODBfd3JpdGUoY29kZWMsIFdNODU4MF9QTExBNCArIG9mZnNldCwgcmVnKTsKKworCS8qIEFsbCBkb25lLCB0dXJuIGl0IG9uICovCisJcmVnID0gd204NTgwX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjIpOworCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1BXUkROMiwgcmVnICYgfnB3cl9tYXNrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IFBDTSBEQUkgYml0IHNpemUgYW5kIHNhbXBsZSByYXRlLgorICovCitzdGF0aWMgaW50IHdtODU4MF9wYWlmX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaSA9IHJ0ZC0+ZGFpOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwl1MTYgcGFpZmIgPSB3bTg1ODBfcmVhZChjb2RlYywgV004NTgwX1BBSUYzICsgZGFpLT5jb2RlY19kYWktPmlkKTsKKworCXBhaWZiICY9IH5XTTg1ODBfQUlGX0xFTkdUSF9NQVNLOworCS8qIGJpdCBzaXplICovCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJcGFpZmIgfD0gV004NTgwX0FJRl9MRU5HVEhfMjA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXBhaWZiIHw9IFdNODU4MF9BSUZfTEVOR1RIXzI0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlwYWlmYiB8PSBXTTg1ODBfQUlGX0xFTkdUSF8yNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfUEFJRjMgKyBkYWktPmNvZGVjX2RhaS0+aWQsIHBhaWZiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg1ODBfc2V0X3BhaWZfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdW5zaWduZWQgaW50IGFpZmE7CisJdW5zaWduZWQgaW50IGFpZmI7CisJaW50IGNhbl9pbnZlcnRfbHJjbGs7CisKKwlhaWZhID0gd204NTgwX3JlYWQoY29kZWMsIFdNODU4MF9QQUlGMSArIGNvZGVjX2RhaS0+aWQpOworCWFpZmIgPSB3bTg1ODBfcmVhZChjb2RlYywgV004NTgwX1BBSUYzICsgY29kZWNfZGFpLT5pZCk7CisKKwlhaWZiICY9IH4oV004NTgwX0FJRl9GTVRfTUFTSyB8IFdNODU4MF9BSUZfTFJQIHwgV004NTgwX0FJRl9CQ1ApOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYWlmYSAmPSB+V004NTgwX0FJRl9NUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlhaWZhIHw9IFdNODU4MF9BSUZfTVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY2FuX2ludmVydF9scmNsayA9IDE7CisJCWFpZmIgfD0gV004NTgwX0FJRl9GTVRfSTJTOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWNhbl9pbnZlcnRfbHJjbGsgPSAxOworCQlhaWZiIHw9IFdNODU4MF9BSUZfRk1UX1JJR0hUSjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWNhbl9pbnZlcnRfbHJjbGsgPSAxOworCQlhaWZiIHw9IFdNODU4MF9BSUZfRk1UX0xFRlRKOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQljYW5faW52ZXJ0X2xyY2xrID0gMDsKKwkJYWlmYiB8PSBXTTg1ODBfQUlGX0ZNVF9EU1A7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWNhbl9pbnZlcnRfbHJjbGsgPSAwOworCQlhaWZiIHw9IFdNODU4MF9BSUZfRk1UX0RTUDsKKwkJYWlmYiB8PSBXTTg1ODBfQUlGX0xSUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJaWYgKCFjYW5faW52ZXJ0X2xyY2xrKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFpZmIgfD0gV004NTgwX0FJRl9CQ1A7CisJCWFpZmIgfD0gV004NTgwX0FJRl9MUlA7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJYWlmYiB8PSBXTTg1ODBfQUlGX0JDUDsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZiAoIWNhbl9pbnZlcnRfbHJjbGspCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWlmYiB8PSBXTTg1ODBfQUlGX0xSUDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3bTg1ODBfd3JpdGUoY29kZWMsIFdNODU4MF9QQUlGMSArIGNvZGVjX2RhaS0+aWQsIGFpZmEpOworCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1BBSUYzICsgY29kZWNfZGFpLT5pZCwgYWlmYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg1ODBfc2V0X2RhaV9jbGtkaXYoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJIGludCBkaXZfaWQsIGludCBkaXYpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJc3dpdGNoIChkaXZfaWQpIHsKKwljYXNlIFdNODU4MF9NQ0xLOgorCQlyZWcgPSB3bTg1ODBfcmVhZChjb2RlYywgV004NTgwX1BMTEI0KTsKKwkJcmVnICY9IH5XTTg1ODBfUExMQjRfTUNMS09VVFNSQ19NQVNLOworCisJCXN3aXRjaCAoZGl2KSB7CisJCWNhc2UgV004NTgwX0NMS1NSQ19NQ0xLOgorCQkJLyogSW5wdXQgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgV004NTgwX0NMS1NSQ19QTExBOgorCQkJcmVnIHw9IFdNODU4MF9QTExCNF9NQ0xLT1VUU1JDX1BMTEE7CisJCQlicmVhazsKKwkJY2FzZSBXTTg1ODBfQ0xLU1JDX1BMTEI6CisJCQlyZWcgfD0gV004NTgwX1BMTEI0X01DTEtPVVRTUkNfUExMQjsKKwkJCWJyZWFrOworCisJCWNhc2UgV004NTgwX0NMS1NSQ19PU0M6CisJCQlyZWcgfD0gV004NTgwX1BMTEI0X01DTEtPVVRTUkNfT1NDOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1BMTEI0LCByZWcpOworCQlicmVhazsKKworCWNhc2UgV004NTgwX0RBQ19DTEtTRUw6CisJCXJlZyA9IHdtODU4MF9yZWFkKGNvZGVjLCBXTTg1ODBfQ0xLU0VMKTsKKwkJcmVnICY9IH5XTTg1ODBfQ0xLU0VMX0RBQ19DTEtTRUxfTUFTSzsKKworCQlzd2l0Y2ggKGRpdikgeworCQljYXNlIFdNODU4MF9DTEtTUkNfTUNMSzoKKwkJCWJyZWFrOworCisJCWNhc2UgV004NTgwX0NMS1NSQ19QTExBOgorCQkJcmVnIHw9IFdNODU4MF9DTEtTRUxfREFDX0NMS1NFTF9QTExBOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTTg1ODBfQ0xLU1JDX1BMTEI6CisJCQlyZWcgfD0gV004NTgwX0NMS1NFTF9EQUNfQ0xLU0VMX1BMTEI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfQ0xLU0VMLCByZWcpOworCQlicmVhazsKKworCWNhc2UgV004NTgwX0NMS09VVFNSQzoKKwkJcmVnID0gd204NTgwX3JlYWQoY29kZWMsIFdNODU4MF9QTExCNCk7CisJCXJlZyAmPSB+V004NTgwX1BMTEI0X0NMS09VVFNSQ19NQVNLOworCisJCXN3aXRjaCAoZGl2KSB7CisJCWNhc2UgV004NTgwX0NMS1NSQ19OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBXTTg1ODBfQ0xLU1JDX1BMTEE6CisJCQlyZWcgfD0gV004NTgwX1BMTEI0X0NMS09VVFNSQ19QTExBQ0xLOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTTg1ODBfQ0xLU1JDX1BMTEI6CisJCQlyZWcgfD0gV004NTgwX1BMTEI0X0NMS09VVFNSQ19QTExCQ0xLOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTTg1ODBfQ0xLU1JDX09TQzoKKwkJCXJlZyB8PSBXTTg1ODBfUExMQjRfQ0xLT1VUU1JDX09TQ0NMSzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl3bTg1ODBfd3JpdGUoY29kZWMsIFdNODU4MF9QTExCNCwgcmVnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg1ODBfZGlnaXRhbF9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSB3bTg1ODBfcmVhZChjb2RlYywgV004NTgwX0RBQ19DT05UUk9MNSk7CisKKwlpZiAobXV0ZSkKKwkJcmVnIHw9IFdNODU4MF9EQUNfQ09OVFJPTDVfTVVURUFMTDsKKwllbHNlCisJCXJlZyAmPSB+V004NTgwX0RBQ19DT05UUk9MNV9NVVRFQUxMOworCisJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfREFDX0NPTlRST0w1LCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NTgwX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwl1MTYgcmVnOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJcmVnID0gd204NTgwX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjEpOworCQl3bTg1ODBfd3JpdGUoY29kZWMsIFdNODU4MF9QV1JETjEsIHJlZyB8IFdNODU4MF9QV1JETjFfUFdETik7CisJCWJyZWFrOworCX0KKwljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdNODU4MF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RydWN0IHNuZF9zb2NfZGFpIHdtODU4MF9kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gIldNODU4MCBQQUlGUlgiLAorCQkuaWQgPSAwLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gNiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAorCQkJLmZvcm1hdHMgPSBXTTg1ODBfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9IHsKKwkJCSAuaHdfcGFyYW1zID0gd204NTgwX3BhaWZfaHdfcGFyYW1zLAorCQkgfSwKKwkJLmRhaV9vcHMgPSB7CisJCQkgLnNldF9mbXQgPSB3bTg1ODBfc2V0X3BhaWZfZGFpX2ZtdCwKKwkJCSAuc2V0X2Nsa2RpdiA9IHdtODU4MF9zZXRfZGFpX2Nsa2RpdiwKKwkJCSAuc2V0X3BsbCA9IHdtODU4MF9zZXRfZGFpX3BsbCwKKwkJCSAuZGlnaXRhbF9tdXRlID0gd204NTgwX2RpZ2l0YWxfbXV0ZSwKKwkJIH0sCisJfSwKKwl7CisJCS5uYW1lID0gIldNODU4MCBQQUlGVFgiLAorCQkuaWQgPSAxLAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gV004NTgwX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSB7CisJCQkgLmh3X3BhcmFtcyA9IHdtODU4MF9wYWlmX2h3X3BhcmFtcywKKwkJIH0sCisJCS5kYWlfb3BzID0geworCQkJIC5zZXRfZm10ID0gd204NTgwX3NldF9wYWlmX2RhaV9mbXQsCisJCQkgLnNldF9jbGtkaXYgPSB3bTg1ODBfc2V0X2RhaV9jbGtkaXYsCisJCQkgLnNldF9wbGwgPSB3bTg1ODBfc2V0X2RhaV9wbGwsCisJCSB9LAorCX0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwod204NTgwX2RhaSk7CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBXTTg1ODAgZHJpdmVyCisgKiByZWdpc3RlciB0aGUgbWl4ZXIgYW5kIGRzcCBpbnRlcmZhY2VzIHdpdGggdGhlIGtlcm5lbAorICovCitzdGF0aWMgaW50IHdtODU4MF9pbml0KHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJXTTg1ODAiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204NTgwX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHdtODU4MF93cml0ZTsKKwljb2RlYy0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg1ODBfc2V0X2JpYXNfbGV2ZWw7CisJY29kZWMtPmRhaSA9IHdtODU4MF9kYWk7CisJY29kZWMtPm51bV9kYWkgPSBBUlJBWV9TSVpFKHdtODU4MF9kYWkpOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUod204NTgwX3JlZyk7CisJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAod204NTgwX3JlZywgc2l6ZW9mKHdtODU4MF9yZWcpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBHZXQgdGhlIGNvZGVjIGludG8gYSBrbm93biBzdGF0ZSAqLworCXdtODU4MF93cml0ZShjb2RlYywgV004NTgwX1JFU0VULCAwKTsKKworCS8qIFBvd2VyIHVwIGFuZCBnZXQgaW5kaXZpZHVhbCBjb250cm9sIG9mIHRoZSBEQUNzICovCisJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfUFdSRE4xLCB3bTg1ODBfcmVhZChjb2RlYywgV004NTgwX1BXUkROMSkgJgorCQkgICAgIH4oV004NTgwX1BXUkROMV9QV0ROIHwgV004NTgwX1BXUkROMV9BTExEQUNQRCkpOworCisJLyogTWFrZSBWTUlEIGhpZ2ggaW1wZWRlbmNlICovCisJd204NTgwX3dyaXRlKGNvZGVjLCBXTTg1ODBfQURDX0NPTlRST0wxLAorCQkgICAgIHdtODU4MF9yZWFkKGNvZGVjLCAgV004NTgwX0FEQ19DT05UUk9MMSkgJiB+MHgxMDApOworCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsCisJCQkgICAgICAgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtODU4MDogZmFpbGVkIHRvIGNyZWF0ZSBwY21zXG4iKTsKKwkJZ290byBwY21fZXJyOworCX0KKworCXdtODU4MF9hZGRfY29udHJvbHMoY29kZWMpOworCXdtODU4MF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtODU4MDogZmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmRcbiIpOworCQlnb3RvIGNhcmRfZXJyOworCX0KKwlyZXR1cm4gcmV0OworCitjYXJkX2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CitwY21fZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKKyAgIGFyb3VuZCAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSAqd204NTgwX3NvY2RldjsKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKworLyoKKyAqIFdNODU4MCAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg1ODBfaTJjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgd204NTgwX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NTgwX3NvY2RldjsKKwlzdHJ1Y3Qgd204NTgwX3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKwljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisKKwlpMmMgPSAga21lbWR1cCgmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoY2xpZW50X3RlbXBsYXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGkyYyA9PSBOVUxMKSB7CisJCWtmcmVlKGNvZGVjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOworCisJcmV0ID0gaTJjX2F0dGFjaF9jbGllbnQoaTJjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwgYWRkcik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHdtODU4MF9pbml0KHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg1ODBcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUoY29kZWMpOworCWtmcmVlKGkyYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTg1ODBfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg1ODBfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB3bTg1ODBfY29kZWNfcHJvYmUpOworfQorCisvKiBjb3JnaSBpMmMgY29kZWMgY29udHJvbCBsYXllciAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODU4MF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIldNODU4MCBJMkMgQ29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5hdHRhY2hfYWRhcHRlciA9IHdtODU4MF9pMmNfYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50ID0gIHdtODU4MF9pMmNfZGV0YWNoLAorCS5jb21tYW5kID0gICAgICAgIE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0geworCS5uYW1lID0gICAiV004NTgwIiwKKwkuZHJpdmVyID0gJndtODU4MF9pMmNfZHJpdmVyLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHdtODU4MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHdtODU4MF9zZXR1cF9kYXRhICpzZXR1cDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHdtODU4MF9wcml2ICp3bTg1ODA7CisJaW50IHJldCA9IDA7CisKKwlwcl9pbmZvKCJXTTg1ODAgQXVkaW8gQ29kZWMgJXNcbiIsIFdNODU4MF9WRVJTSU9OKTsKKworCXNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg1ODAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NTgwX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NTgwID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gd204NTgwOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCXdtODU4MF9zb2NkZXYgPSBzb2NkZXY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaWYgKHNldHVwLT5pMmNfYWRkcmVzcykgeworCQlub3JtYWxfaTJjWzBdID0gc2V0dXAtPmkyY19hZGRyZXNzOworCQljb2RlYy0+aHdfd3JpdGUgPSAoaHdfd3JpdGVfdClpMmNfbWFzdGVyX3NlbmQ7CisJCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg1ODBfaTJjX2RyaXZlcik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgYWRkIGkyYyBkcml2ZXIiKTsKKwl9CisjZWxzZQorCQkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgd204NTgwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKQorCQl3bTg1ODBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJndtODU4MF9pMmNfZHJpdmVyKTsKKyNlbmRpZgorCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOworCWtmcmVlKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg1ODAgPSB7CisJLnByb2JlID0gCXdtODU4MF9wcm9iZSwKKwkucmVtb3ZlID0gCXdtODU4MF9yZW1vdmUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl93bTg1ODApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgV004NTgwIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODlkZGFiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogd204NTgwLmggIC0tICBhdWRpbyBkcml2ZXIgZm9yIFdNODU4MAorICoKKyAqIENvcHlyaWdodCAyMDA4IFNhbXN1bmcgRWxlY3Ryb25pY3MuCisgKiBBdXRob3I6IFJ5dSBFdWl5b3VsCisgKiAgICAgICAgIHJ5dS5yZWFsQGdtYWlsLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9XTTg1ODBfSAorI2RlZmluZSBfV004NTgwX0gKKworI2RlZmluZSBXTTg1ODBfUExMQSAgMQorI2RlZmluZSBXTTg1ODBfUExMQiAgMgorCisjZGVmaW5lIFdNODU4MF9NQ0xLICAgICAgIDEKKyNkZWZpbmUgV004NTgwX0RBQ19DTEtTRUwgMgorI2RlZmluZSBXTTg1ODBfQ0xLT1VUU1JDICAzCisKKyNkZWZpbmUgV004NTgwX0NMS1NSQ19NQ0xLIDEKKyNkZWZpbmUgV004NTgwX0NMS1NSQ19QTExBIDIKKyNkZWZpbmUgV004NTgwX0NMS1NSQ19QTExCIDMKKyNkZWZpbmUgV004NTgwX0NMS1NSQ19PU0MgIDQKKyNkZWZpbmUgV004NTgwX0NMS1NSQ19OT05FIDUKKworc3RydWN0IHdtODU4MF9zZXR1cF9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpMmNfYWRkcmVzczsKK307CisKKyNkZWZpbmUgV004NTgwX0RBSV9QQUlGUlggMAorI2RlZmluZSBXTTg1ODBfREFJX1BBSUZUWCAxCisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWkgd204NTgwX2RhaVtdOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODU4MDsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IDk0MDJmY2EuLjdmOGE3ZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0yOCw3ICsyOSw2IEBACiAKICNpbmNsdWRlICJ3bTg3MzEuaCIKIAotI2RlZmluZSBBVURJT19OQU1FICJ3bTg3MzEiCiAjZGVmaW5lIFdNODczMV9WRVJTSU9OICIwLjEzIgogCiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzE7CkBAIC01NzAsODggKzU3MCwxNDQgQEAKICAqICAgIGxvdyAgPSAweDFhCiAgKiAgICBoaWdoID0gMHgxYgogICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OwogCi0vKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLwotSTJDX0NMSUVOVF9JTlNNT0Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3MzFfaTJjX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7Ci0KLS8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKLSAgIGFyb3VuZCAqLwotCi1zdGF0aWMgaW50IHdtODczMV9jb2RlY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgd204NzMxX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHdtODczMV9zb2NkZXY7Ci0Jc3RydWN0IHdtODczMV9zZXR1cF9kYXRhICpzZXR1cCA9IHNvY2Rldi0+Y29kZWNfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CiAJaW50IHJldDsKIAotCWlmIChhZGRyICE9IHNldHVwLT5pMmNfYWRkcmVzcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwotCi0JaTJjID0ga21lbWR1cCgmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoY2xpZW50X3RlbXBsYXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGkyYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKIAljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOwogCi0JcmV0ID0gaTJjX2F0dGFjaF9jbGllbnQoaTJjKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwgYWRkcik7Ci0JCWdvdG8gZXJyOwotCX0KLQogCXJldCA9IHdtODczMV9pbml0KHNvY2Rldik7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkKIAkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg3MzFcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0JcmV0dXJuIHJldDsKIAotZXJyOgotCWtmcmVlKGkyYyk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bTg3MzFfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCB3bTg3MzFfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiAJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7Ci0Ja2ZyZWUoY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTg3MzFfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB3bTg3MzFfY29kZWNfcHJvYmUpOwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODczMV9pMmNfaWRbXSA9IHsKKwl7ICJ3bTg3MzEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODczMV9pMmNfaWQpOwogCi0vKiBjb3JnaSBpMmMgY29kZWMgY29udHJvbCBsYXllciAqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODczMV9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIldNODczMSBJMkMgQ29kZWMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAotCS5pZCA9ICAgICAgICAgICAgIEkyQ19EUklWRVJJRF9XTTg3MzEsCi0JLmF0dGFjaF9hZGFwdGVyID0gd204NzMxX2kyY19hdHRhY2gsCi0JLmRldGFjaF9jbGllbnQgPSAgd204NzMxX2kyY19kZXRhY2gsCi0JLmNvbW1hbmQgPSAgICAgICAgTlVMTCwKKwkucHJvYmUgPSAgICB3bTg3MzFfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIHdtODczMV9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHdtODczMV9pMmNfaWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlID0gewotCS5uYW1lID0gICAiV004NzMxIiwKLQkuZHJpdmVyID0gJndtODczMV9pMmNfZHJpdmVyLAotfTsKK3N0YXRpYyBpbnQgd204NzMxX2FkZF9pMmNfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSAqc2V0dXApCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg3MzFfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwlpbmZvLmFkZHIgPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJc3RybGNweShpbmZvLnR5cGUsICJ3bTg3MzEiLCBJMkNfTkFNRV9TSVpFKTsKKworCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoc2V0dXAtPmkyY19idXMpOworCWlmICghYWRhcHRlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaTJjIGFkYXB0ZXIgJWRcbiIsCisJCQlzZXR1cC0+aTJjX2J1cyk7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwljbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CisJaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmICghY2xpZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlIGF0IDB4JXhcbiIsCisJCQkodW5zaWduZWQgaW50KWluZm8uYWRkcik7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RyaXZlcjoKKwlpMmNfZGVsX2RyaXZlcigmd204NzMxX2kyY19kcml2ZXIpOworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorc3RhdGljIGludCBfX2RldmluaXQgd204NzMxX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NzMxX3NvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZXQ7CisKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gc3BpOworCisJcmV0ID0gd204NzMxX2luaXQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg3MzFcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204NzMxX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODczMV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIndtODczMSIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB3bTg3MzFfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod204NzMxX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCB3bTg3MzFfc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCXU4IG1zZ1syXTsKKworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIDA7CisKKwltc2dbMF0gPSBkYXRhWzBdOworCW1zZ1sxXSA9IGRhdGFbMV07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwltZW1zZXQoJnQsIDAsIChzaXplb2YgdCkpOworCisJdC50eF9idWYgPSAmbXNnWzBdOworCXQubGVuID0gbGVuOworCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKwlzcGlfc3luYyhzcGksICZtKTsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYgLyogQ09ORklHX1NQSV9NQVNURVIgKi8KKwogc3RhdGljIGludCB3bTg3MzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtNjgwLDE2ICs3MzYsMjEgQEAKIAlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOwogCiAJd204NzMxX3NvY2RldiA9IHNvY2RldjsKKwlyZXQgPSAtRU5PREVWOworCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKLQkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKIAkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzMxX2kyY19kcml2ZXIpOwotCQlpZiAocmV0ICE9IDApCi0JCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJCXJldCA9IHdtODczMV9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CiAJfQotI2Vsc2UKLQkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCWlmIChzZXR1cC0+c3BpKSB7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KXdtODczMV9zcGlfd3JpdGU7CisJCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJndtODczMV9zcGlfZHJpdmVyKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgc3BpIGRyaXZlciIpOworCX0KICNlbmRpZgogCiAJaWYgKHJldCAhPSAwKSB7CkBAIC03MTEsOCArNzcyLDEyIEBACiAJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKIAlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY29kZWMtPmNvbnRyb2xfZGF0YSk7CiAJaTJjX2RlbF9kcml2ZXIoJndtODczMV9pMmNfZHJpdmVyKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bTg3MzFfc3BpX2RyaXZlcik7CisjZW5kaWYKIAlrZnJlZShjb2RlYy0+cHJpdmF0ZV9kYXRhKTsKIAlrZnJlZShjb2RlYyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5oCmluZGV4IDk5ZjJlM2MuLjk1MTkwZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuaApAQCAtMzUsNiArMzUsOCBAQAogI2RlZmluZSBXTTg3MzFfREFJCQkwCiAKIHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSB7CisJaW50ICAgICAgICAgICAgc3BpOworCWludCAgICAgICAgICAgIGkyY19idXM7CiAJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwppbmRleCBkZDFmNTU0Li45YjcyOTZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMjgsNyArMjksNiBAQAogCiAjaW5jbHVkZSAid204NzUwLmgiCiAKLSNkZWZpbmUgQVVESU9fTkFNRSAiV004NzUwIgogI2RlZmluZSBXTTg3NTBfVkVSU0lPTiAiMC4xMiIKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCkBAIC04NDEsODggKzg0MSwxNDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCiAKIC8qCi0gKiBXTTg3MzEgMiB3aXJlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lZCBieSBHUElPNQorICogV004NzUwIDIgd2lyZSBhZGRyZXNzIGlzIGRldGVybWluZWQgYnkgR1BJTzUKICAqIHN0YXRlIGR1cmluZyBwb3dlcnVwLgogICogICAgbG93ICA9IDB4MWEKICAqICAgIGhpZ2ggPSAweDFiCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDAsIEkyQ19DTElFTlRfRU5EIH07CiAKLS8qIE1hZ2ljIGRlZmluaXRpb24gb2YgYWxsIG90aGVyIHZhcmlhYmxlcyBhbmQgdGhpbmdzICovCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODc1MF9pMmNfZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQotc3RhdGljIGludCB3bTg3NTBfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCitzdGF0aWMgaW50IHdtODc1MF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg3NTBfc29jZGV2OwotCXN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwogCWludCByZXQ7CiAKLQlpZiAoYWRkciAhPSBzZXR1cC0+aTJjX2FkZHJlc3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOwotCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQotCWkyYyA9IGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChpMmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAotCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gYXR0YWNoIGNvZGVjIGF0IGFkZHIgJXhcbiIsIGFkZHIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlyZXQgPSB3bTg3NTBfaW5pdChzb2NkZXYpOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCA8IDApCiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004NzUwXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCXJldHVybiByZXQ7CiAKLWVycjoKLQlrZnJlZShpMmMpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204NzUwX2kyY19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgd204NzUwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd204NzUwX2kyY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgd204NzUwX2NvZGVjX3Byb2JlKTsKLX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTg3NTBfaTJjX2lkW10gPSB7CisJeyAid204NzUwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTg3NTBfaTJjX2lkKTsKIAotLyogY29yZ2kgaTJjIGNvZGVjIGNvbnRyb2wgbGF5ZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJXTTg3NTAgSTJDIENvZGVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkuaWQgPSAgICAgICAgICAgICBJMkNfRFJJVkVSSURfV004NzUwLAotCS5hdHRhY2hfYWRhcHRlciA9IHdtODc1MF9pMmNfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50ID0gIHdtODc1MF9pMmNfZGV0YWNoLAotCS5jb21tYW5kID0gICAgICAgIE5VTEwsCisJLnByb2JlID0gICAgd204NzUwX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gICB3bTg3NTBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3bTg3NTBfaTJjX2lkLAogfTsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICAgIldNODc1MCIsCi0JLmRyaXZlciA9ICZ3bTg3NTBfaTJjX2RyaXZlciwKK3N0YXRpYyBpbnQgd204NzUwX2FkZF9pMmNfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSAqc2V0dXApCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg3NTBfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwlpbmZvLmFkZHIgPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJc3RybGNweShpbmZvLnR5cGUsICJ3bTg3NTAiLCBJMkNfTkFNRV9TSVpFKTsKKworCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoc2V0dXAtPmkyY19idXMpOworCWlmICghYWRhcHRlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaTJjIGFkYXB0ZXIgJWRcbiIsCisJCQlzZXR1cC0+aTJjX2J1cyk7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwljbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CisJaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmICghY2xpZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlIGF0IDB4JXhcbiIsCisJCQkodW5zaWduZWQgaW50KWluZm8uYWRkcik7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RyaXZlcjoKKwlpMmNfZGVsX2RyaXZlcigmd204NzUwX2kyY19kcml2ZXIpOworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorc3RhdGljIGludCBfX2RldmluaXQgd204NzUwX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NzUwX3NvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZXQ7CisKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gc3BpOworCisJcmV0ID0gd204NzUwX2luaXQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg3NTBcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204NzUwX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODc1MF9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIndtODc1MCIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB3bTg3NTBfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod204NzUwX3NwaV9yZW1vdmUpLAogfTsKKworc3RhdGljIGludCB3bTg3NTBfc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCXU4IG1zZ1syXTsKKworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIDA7CisKKwltc2dbMF0gPSBkYXRhWzBdOworCW1zZ1sxXSA9IGRhdGFbMV07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwltZW1zZXQoJnQsIDAsIChzaXplb2YgdCkpOworCisJdC50eF9idWYgPSAmbXNnWzBdOworCXQubGVuID0gbGVuOworCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKwlzcGlfc3luYyhzcGksICZtKTsKKworCXJldHVybiBsZW47Cit9CiAjZW5kaWYKIAogc3RhdGljIGludCB3bTg3NTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTkzMSw3ICs5OTAsNyBAQAogCXN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCXN0cnVjdCB3bTg3NTBfcHJpdiAqd204NzUwOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlwcl9pbmZvKCJXTTg3NTAgQXVkaW8gQ29kZWMgJXMiLCBXTTg3NTBfVkVSU0lPTik7CiAJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOwpAQCAtOTUyLDE2ICsxMDExLDIxIEBACiAJd204NzUwX3NvY2RldiA9IHNvY2RldjsKIAlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRlbGF5ZWRfd29yaywgd204NzUwX3dvcmspOwogCisJcmV0ID0gLUVOT0RFVjsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIAlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7Ci0JCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CiAJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKLQkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODc1MF9pMmNfZHJpdmVyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCQlyZXQgPSB3bTg3NTBfYWRkX2kyY19kZXZpY2UocGRldiwgc2V0dXApOwogCX0KLSNlbHNlCi0JCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJaWYgKHNldHVwLT5zcGkpIHsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3Qpd204NzUwX3NwaV93cml0ZTsKKwkJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd204NzUwX3NwaV9kcml2ZXIpOworCQlpZiAocmV0ICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBzcGkgZHJpdmVyIik7CisJfQogI2VuZGlmCiAKIAlpZiAocmV0ICE9IDApIHsKQEAgLTEwMDIsOCArMTA2NiwxMiBAQAogCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CiAJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNvZGVjLT5jb250cm9sX2RhdGEpOwogCWkyY19kZWxfZHJpdmVyKCZ3bTg3NTBfaTJjX2RyaXZlcik7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzUwX3NwaV9kcml2ZXIpOworI2VuZGlmCiAJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CiAJa2ZyZWUoY29kZWMpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuaAppbmRleCA4ZWYzMGU2Li4xZGMxMDBlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmgKQEAgLTU4LDYgKzU4LDggQEAKICNkZWZpbmUgV004NzUwX1NZU0NMSwkwCiAKIHN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSB7CisJaW50IHNwaTsKKwlpbnQgaTJjX2J1czsKIAl1bnNpZ25lZCBzaG9ydCBpMmNfYWRkcmVzczsKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCmluZGV4IDU3NjExNjQuLmQ0MjZlYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwpAQCAtMiw4ICsyLDcgQEAKICAqIHdtODc1My5jICAtLSAgV004NzUzIEFMU0EgU29jIEF1ZGlvIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAyMDAzIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCi0gKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKLSAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTUxLDcgKzUxLDYgQEAKIAogI2luY2x1ZGUgIndtODc1My5oIgogCi0jZGVmaW5lIEFVRElPX05BTUUgIndtODc1MyIKICNkZWZpbmUgV004NzUzX1ZFUlNJT04gIjAuMTYiCiAKIHN0YXRpYyBpbnQgY2Fwc19jaGFyZ2UgPSAyMDAwOwpAQCAtNTgzLDcgKzU4Miw3IEBACiAKIAkvKiBvdXQgNCAqLwogCXsiT3V0NCBNdXgiLCAiVlJFRiIsICJWUkVGIn0sCi0JeyJPdXQ0IE11eCIsICJDYXB0dXJlIFNUIiwgIkNhcHR1cmUgU1QgTWl4ZXIifSwKKwl7Ik91dDQgTXV4IiwgIkNhcHR1cmUgU1QiLCAiUGxheWJhY2sgTWl4ZXIifSwKIAl7Ik91dDQgTXV4IiwgIkxPVVQyIiwgIkxPVVQyIn0sCiAJeyJPdXQgNCIsIE5VTEwsICJPdXQ0IE11eCJ9LAogCXsiT1VUNCIsIE5VTEwsICJPdXQgNCJ9LApAQCAtNjA3LDcgKzYwNiw3IEBACiAJLyogQ2FwdHVyZSBSaWdodCBNdXggKi8KIAl7IkNhcHR1cmUgUmlnaHQgTXV4IiwgIlBHQSIsICJSaWdodCBDYXB0dXJlIFZvbHVtZSJ9LAogCXsiQ2FwdHVyZSBSaWdodCBNdXgiLCAiTGluZSBvciBSWFAtUlhOIiwgIkxpbmUgUmlnaHQgTXV4In0sCi0JeyJDYXB0dXJlIFJpZ2h0IE11eCIsICJTaWRldG9uZSIsICJDYXB0dXJlIFNUIE1peGVyIn0sCisJeyJDYXB0dXJlIFJpZ2h0IE11eCIsICJTaWRldG9uZSIsICJQbGF5YmFjayBNaXhlciJ9LAogCiAJLyogTW9ubyBDYXB0dXJlIG1peGVyLW11eCAqLwogCXsiQ2FwdHVyZSBSaWdodCBNaXhlciIsICJTdGVyZW8iLCAiQ2FwdHVyZSBSaWdodCBNdXgifSwKQEAgLTE2MzcsODYgKzE2MzYsMTQ1IEBACiAgKiAgICBsb3cgID0gMHgxYQogICogICAgaGlnaCA9IDB4MWIKICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKIAotLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KLUkyQ19DTElFTlRfSU5TTU9EOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzUzX2kyY19kcml2ZXI7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCi1zdGF0aWMgaW50IHdtODc1M19jb2RlY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgd204NzUzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHdtODc1M19zb2NkZXY7Ci0Jc3RydWN0IHdtODc1M19zZXR1cF9kYXRhICpzZXR1cCA9IHNvY2Rldi0+Y29kZWNfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CiAJaW50IHJldDsKIAotCWlmIChhZGRyICE9IHNldHVwLT5pMmNfYWRkcmVzcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwotCi0JaTJjID0gIGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOwotCWlmICghaTJjKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKIAljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOwogCi0JcmV0ID0gaTJjX2F0dGFjaF9jbGllbnQoaTJjKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwgYWRkcik7Ci0JCWdvdG8gZXJyOwotCX0KLQogCXJldCA9IHdtODc1M19pbml0KHNvY2Rldik7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkKIAkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg3NTNcbiIpOwotCQlnb3RvIGVycjsKLQl9CiAKIAlyZXR1cm4gcmV0OwotCi1lcnI6Ci0Ja2ZyZWUoaTJjKTsKLQlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdtODc1M19pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHdtODc1M19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKLQlrZnJlZShjbGllbnQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtODc1M19pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODc1M19jb2RlY19wcm9iZSk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd204NzUzX2kyY19pZFtdID0geworCXsgIndtODc1MyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204NzUzX2kyY19pZCk7CiAKLS8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzUzX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiV004NzUzIEkyQyBDb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCi0JLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODc1MywKLQkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg3NTNfaTJjX2F0dGFjaCwKLQkuZGV0YWNoX2NsaWVudCA9ICB3bTg3NTNfaTJjX2RldGFjaCwKLQkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorCS5wcm9iZSA9ICAgIHdtODc1M19pMmNfcHJvYmUsCisJLnJlbW92ZSA9ICAgd204NzUzX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gd204NzUzX2kyY19pZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAgICJXTTg3NTMiLAotCS5kcml2ZXIgPSAmd204NzUzX2kyY19kcml2ZXIsCi19Oworc3RhdGljIGludCB3bTg3NTNfYWRkX2kyY19kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHdtODc1M19zZXR1cF9kYXRhICpzZXR1cCkKK3sKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODc1M19pMmNfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCWluZm8uYWRkciA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwlzdHJsY3B5KGluZm8udHlwZSwgIndtODc1MyIsIEkyQ19OQU1FX1NJWkUpOworCisJYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihzZXR1cC0+aTJjX2J1cyk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpMmMgYWRhcHRlciAlZFxuIiwKKwkJCXNldHVwLT5pMmNfYnVzKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCWNsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsICZpbmZvKTsKKwlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKCFjbGllbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGkyYyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpaW5mby5hZGRyKTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCXJldHVybiAwOworCitlcnJfZHJpdmVyOgorCWkyY19kZWxfZHJpdmVyKCZ3bTg3NTNfaTJjX2RyaXZlcik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3NTNfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg3NTNfc29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldDsKKworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBzcGk7CisKKwlyZXQgPSB3bTg3NTNfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXNlIFdNODc1M1xuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTg3NTNfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd204NzUzX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAid204NzUzIiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHdtODc1M19zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3NTNfc3BpX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IHdtODc1M19zcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3QgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJdTggbXNnWzJdOworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gMDsKKworCW1zZ1swXSA9IGRhdGFbMF07CisJbXNnWzFdID0gZGF0YVsxXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCW1lbXNldCgmdCwgMCwgKHNpemVvZiB0KSk7CisKKwl0LnR4X2J1ZiA9ICZtc2dbMF07CisJdC5sZW4gPSBsZW47CisKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdCwgJm0pOworCXNwaV9zeW5jKHNwaSwgJm0pOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCisKIHN0YXRpYyBpbnQgd204NzUzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTE3NDgsMTQgKzE4MDYsMTcgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIAlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7Ci0JCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CiAJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKLQkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODc1M19pMmNfZHJpdmVyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCQlyZXQgPSB3bTg3NTNfYWRkX2kyY19kZXZpY2UocGRldiwgc2V0dXApOwogCX0KLSNlbHNlCi0JCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJaWYgKHNldHVwLT5zcGkpIHsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3Qpd204NzUzX3NwaV93cml0ZTsKKwkJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd204NzUzX3NwaV9kcml2ZXIpOworCQlpZiAocmV0ICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBzcGkgZHJpdmVyIik7CisJfQogI2VuZGlmCiAKIAlpZiAocmV0ICE9IDApIHsKQEAgLTE3OTYsOCArMTg1NywxMiBAQAogCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CiAJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNvZGVjLT5jb250cm9sX2RhdGEpOwogCWkyY19kZWxfZHJpdmVyKCZ3bTg3NTNfaTJjX2RyaXZlcik7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzUzX3NwaV9kcml2ZXIpOworI2VuZGlmCiAJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CiAJa2ZyZWUoY29kZWMpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5oIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuaAppbmRleCA0NGY1ZjFmLi5mNTU3MDRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmgKQEAgLTIsOCArMiw3IEBACiAgKiB3bTg3NTMuaCAgLS0gIGF1ZGlvIGRyaXZlciBmb3IgV004NzUzCiAgKgogICogQ29weXJpZ2h0IDIwMDMgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTc5LDYgKzc4LDggQEAKICNkZWZpbmUgV004NzUzX0FEQ1RMMgkJMHgzZgogCiBzdHJ1Y3Qgd204NzUzX3NldHVwX2RhdGEgeworCWludCBzcGk7CisJaW50IGkyY19idXM7CiAJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMyNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMCwwICsxLDE1NDEgQEAKKy8qCisgKiB3bTg5MDAuYyAgLS0gIFdNODkwMCBBTFNBIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUT0RPOgorICogIC0gVHJpc3RhdGluZy4KKyAqICAtIFRETS4KKyAqICAtIEphY2sgZGV0ZWN0LgorICogIC0gRkxMIHNvdXJjZSBjb25maWd1cmF0aW9uLCBjdXJyZW50bHkgb25seSBNQ0xLIGlzIHN1cHBvcnRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJ3bTg5MDAuaCIKKworLyogV004OTAwIHJlZ2lzdGVyIHNwYWNlICovCisjZGVmaW5lIFdNODkwMF9SRUdfUkVTRVQJMHgwCisjZGVmaW5lIFdNODkwMF9SRUdfSUQJCTB4MAorI2RlZmluZSBXTTg5MDBfUkVHX1BPV0VSMQkweDEKKyNkZWZpbmUgV004OTAwX1JFR19QT1dFUjIJMHgyCisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIzCTB4MworI2RlZmluZSBXTTg5MDBfUkVHX0FVRElPMQkweDQKKyNkZWZpbmUgV004OTAwX1JFR19BVURJTzIJMHg1CisjZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxICAgIDB4NgorI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMiAgICAweDcKKyNkZWZpbmUgV004OTAwX1JFR19BVURJTzMgICAgICAgMHg4CisjZGVmaW5lIFdNODkwMF9SRUdfQVVESU80ICAgICAgIDB4OQorI2RlZmluZSBXTTg5MDBfUkVHX0RBQ0NUUkwgICAgICAweGEKKyNkZWZpbmUgV004OTAwX1JFR19MREFDX0RWICAgICAgMHhiCisjZGVmaW5lIFdNODkwMF9SRUdfUkRBQ19EViAgICAgIDB4YworI2RlZmluZSBXTTg5MDBfUkVHX1NJREVUT05FICAgICAweGQKKyNkZWZpbmUgV004OTAwX1JFR19BRENDVFJMICAgICAgMHhlCisjZGVmaW5lIFdNODkwMF9SRUdfTEFEQ19EVgkweGYKKyNkZWZpbmUgV004OTAwX1JFR19SQURDX0RWICAgICAgMHgxMAorI2RlZmluZSBXTTg5MDBfUkVHX0dQSU8gICAgICAgICAweDEyCisjZGVmaW5lIFdNODkwMF9SRUdfSU5DVEwJMHgxNQorI2RlZmluZSBXTTg5MDBfUkVHX0xJTlZPTAkweDE2CisjZGVmaW5lIFdNODkwMF9SRUdfUklOVk9MCTB4MTcKKyNkZWZpbmUgV004OTAwX1JFR19JTkJPT1NUTUlYMSAgMHgxOAorI2RlZmluZSBXTTg5MDBfUkVHX0lOQk9PU1RNSVgyICAweDE5CisjZGVmaW5lIFdNODkwMF9SRUdfQURDUEFUSAkweDFhCisjZGVmaW5lIFdNODkwMF9SRUdfQVVYQk9PU1QJMHgxYgorI2RlZmluZSBXTTg5MDBfUkVHX0FERENUTCAgICAgICAweDFlCisjZGVmaW5lIFdNODkwMF9SRUdfRkxMQ1RMMSAgICAgIDB4MjQKKyNkZWZpbmUgV004OTAwX1JFR19GTExDVEwyICAgICAgMHgyNQorI2RlZmluZSBXTTg5MDBfUkVHX0ZMTENUTDMgICAgICAweDI2CisjZGVmaW5lIFdNODkwMF9SRUdfRkxMQ1RMNCAgICAgIDB4MjcKKyNkZWZpbmUgV004OTAwX1JFR19GTExDVEw1ICAgICAgMHgyOAorI2RlZmluZSBXTTg5MDBfUkVHX0ZMTENUTDYgICAgICAweDI5CisjZGVmaW5lIFdNODkwMF9SRUdfTE9VVE1JWENUTDEgIDB4MmMKKyNkZWZpbmUgV004OTAwX1JFR19ST1VUTUlYQ1RMMSAgMHgyZAorI2RlZmluZSBXTTg5MDBfUkVHX0JZUEFTUzEJMHgyZQorI2RlZmluZSBXTTg5MDBfUkVHX0JZUEFTUzIJMHgyZgorI2RlZmluZSBXTTg5MDBfUkVHX0FVWE9VVF9DVEwgICAweDMwCisjZGVmaW5lIFdNODkwMF9SRUdfTE9VVDFDVEwgICAgIDB4MzMKKyNkZWZpbmUgV004OTAwX1JFR19ST1VUMUNUTCAgICAgMHgzNAorI2RlZmluZSBXTTg5MDBfUkVHX0xPVVQyQ1RMCTB4MzUKKyNkZWZpbmUgV004OTAwX1JFR19ST1VUMkNUTAkweDM2CisjZGVmaW5lIFdNODkwMF9SRUdfSFBDVEwxCTB4M2EKKyNkZWZpbmUgV004OTAwX1JFR19PVVRCSUFTQ1RMICAgMHg3MworCisjZGVmaW5lIFdNODkwMF9NQVhSRUcJCTB4ODAKKworI2RlZmluZSBXTTg5MDBfUkVHX0FERENUTF9PVVQxX0RJUyAgICAweDgwCisjZGVmaW5lIFdNODkwMF9SRUdfQUREQ1RMX09VVDJfRElTICAgIDB4NDAKKyNkZWZpbmUgV004OTAwX1JFR19BRERDVExfVk1JRF9ESVMgICAgMHgyMAorI2RlZmluZSBXTTg5MDBfUkVHX0FERENUTF9CSUFTX1NSQyAgICAweDEwCisjZGVmaW5lIFdNODkwMF9SRUdfQUREQ1RMX1ZNSURfU09GVFNUIDB4MDQKKyNkZWZpbmUgV004OTAwX1JFR19BRERDVExfVEVNUF9TRCAgICAgMHgwMgorCisjZGVmaW5lIFdNODkwMF9SRUdfR1BJT19URU1QX0VOQSAgIDB4MgorCisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIxX1NUQVJUVVBfQklBU19FTkEgMHgwMTAwCisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIxX0JJQVNfRU5BICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIxX1ZNSURfQlVGX0VOQSAgICAgMHgwMDA0CisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIxX0ZMTF9FTkEgICAgICAgICAgMHgwMDQwCisKKyNkZWZpbmUgV004OTAwX1JFR19QT1dFUjJfU1lTQ0xLX0VOQSAgMHg4MDAwCisjZGVmaW5lIFdNODkwMF9SRUdfUE9XRVIyX0FEQ0xfRU5BICAgIDB4MDAwMgorI2RlZmluZSBXTTg5MDBfUkVHX1BPV0VSMl9BRENSX0VOQSAgICAweDAwMDEKKworI2RlZmluZSBXTTg5MDBfUkVHX1BPV0VSM19EQUNMX0VOQSAgICAweDAwMDIKKyNkZWZpbmUgV004OTAwX1JFR19QT1dFUjNfREFDUl9FTkEgICAgMHgwMDAxCisKKyNkZWZpbmUgV004OTAwX1JFR19BVURJTzFfQUlGX0ZNVF9NQVNLIDB4MDAxOAorI2RlZmluZSBXTTg5MDBfUkVHX0FVRElPMV9MUkNMS19JTlYgICAgMHgwMDgwCisjZGVmaW5lIFdNODkwMF9SRUdfQVVESU8xX0JDTEtfSU5WICAgICAweDAxMDAKKworI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMV9CQ0xLX0RJUiAgIDB4MQorI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMV9NQ0xLX1NSQyAgIDB4MTAwCisjZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSyAgKH4weDAxZSkKKyNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfT1BDTEtfTUFTSyAofjB4NzAwMCkKKworI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMl9BRENfQ0xLRElWIDB4ZTAKKyNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzJfREFDX0NMS0RJViAweDFjCisKKyNkZWZpbmUgV004OTAwX1JFR19EQUNDVFJMX01VVEUgICAgICAgICAgMHgwMDQKKyNkZWZpbmUgV004OTAwX1JFR19EQUNDVFJMX0FJRl9MUkNMS1JBVEUgMHg0MDAKKworI2RlZmluZSBXTTg5MDBfUkVHX0FVRElPM19BRENMUkNfRElSICAgIDB4MDgwMAorCisjZGVmaW5lIFdNODkwMF9SRUdfQVVESU80X0RBQ0xSQ19ESVIgICAgMHgwODAwCisKKyNkZWZpbmUgV004OTAwX1JFR19GTExDVEwxX09TQ19FTkEgICAgMHgxMDAKKworI2RlZmluZSBXTTg5MDBfUkVHX0ZMTENUTDZfRkxMX1NMT1dfTE9DS19SRUYgMHgxMDAKKworI2RlZmluZSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9JUFNUQUdFX0VOQSAweDgwCisjZGVmaW5lIFdNODkwMF9SRUdfSFBDVEwxX0hQX09QU1RBR0VfRU5BIDB4NDAKKyNkZWZpbmUgV004OTAwX1JFR19IUENUTDFfSFBfQ0xBTVBfSVAgICAgMHgyMAorI2RlZmluZSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9DTEFNUF9PUCAgICAweDEwCisjZGVmaW5lIFdNODkwMF9SRUdfSFBDVEwxX0hQX1NIT1JUICAgICAgIDB4MDgKKyNkZWZpbmUgV004OTAwX1JFR19IUENUTDFfSFBfU0hPUlQyICAgICAgMHgwNAorCisjZGVmaW5lIFdNODkwMF9MUkNfTUFTSyAweGZjMDAKKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204OTAwOworCitzdHJ1Y3Qgd204OTAwX3ByaXYgeworCXUzMiBmbGxfaW47IC8qIEZMTCBpbnB1dCBmcmVxdWVuY3kgKi8KKwl1MzIgZmxsX291dDsgLyogRkxMIG91dHB1dCBmcmVxdWVuY3kgKi8KK307CisKKy8qCisgKiB3bTg5MDAgcmVnaXN0ZXIgY2FjaGUuICBXZSBjYW4ndCByZWFkIHRoZSBlbnRpcmUgcmVnaXN0ZXIgc3BhY2UgYW5kIHdlCisgKiBoYXZlIHNsb3cgY29udHJvbCBidXNlcyBzbyB3ZSBjYWNoZSB0aGUgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODkwMF9yZWdfZGVmYXVsdHNbV004OTAwX01BWFJFR10gPSB7CisJMHg4OTAwLCAweDAwMDAsCisJMHhjMDAwLCAweDAwMDAsCisJMHg0MDUwLCAweDQwMDAsCisJMHgwMDA4LCAweDAwMDAsCisJMHgwMDQwLCAweDAwNDAsCisJMHgxMDA0LCAweDAwYzAsCisJMHgwMGMwLCAweDAwMDAsCisJMHgwMTAwLCAweDAwYzAsCisJMHgwMGMwLCAweDAwMDAsCisJMHhiMDAxLCAweDAwMDAsCisJMHgwMDAwLCAweDAwNDQsCisJMHgwMDRjLCAweDAwNGMsCisJMHgwMDQ0LCAweDAwNDQsCisJMHgwMDAwLCAweDAwNDQsCisJMHgwMDAwLCAweDAwMDAsCisJMHgwMDAyLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsCisJMHgwMDA4LCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDgsCisJMHgwMDk3LCAweDAxMDAsCisJMHgwMDAwLCAweDAwMDAsCisJMHgwMDUwLCAweDAwNTAsCisJMHgwMDU1LCAweDAwNTUsCisJMHgwMDU1LCAweDAwMDAsCisJMHgwMDAwLCAweDAwNzksCisJMHgwMDc5LCAweDAwNzksCisJMHgwMDc5LCAweDAwMDAsCisJLyogUmVtYWluaW5nIHJlZ2lzdGVycyBhbGwgemVybyAqLworfTsKKworLyoKKyAqIHJlYWQgd204OTAwIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdtODkwMF9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCUJVR19PTihyZWcgPj0gV004OTAwX01BWFJFRyk7CisKKwlpZiAocmVnID09IFdNODkwMF9SRUdfSUQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKKy8qCisgKiB3cml0ZSB3bTg5MDAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdtODkwMF93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXUxNiByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCUJVR19PTihyZWcgPj0gV004OTAwX01BWFJFRyk7CisKKwljYWNoZVtyZWddID0gdmFsdWU7Cit9CisKKy8qCisgKiB3cml0ZSB0byB0aGUgV004OTAwIHJlZ2lzdGVyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgd204OTAwX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzNdOworCisJaWYgKHZhbHVlID09IHdtODkwMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBkYXRhIGlzCisJICogICBEMTUuLkQ5IFdNODkwMCByZWdpc3RlciBvZmZzZXQKKwkgKiAgIEQ4Li4uRDAgcmVnaXN0ZXIgZGF0YQorCSAqLworCWRhdGFbMF0gPSByZWc7CisJZGF0YVsxXSA9IHZhbHVlID4+IDg7CisJZGF0YVsyXSA9IHZhbHVlICYgMHgwMGZmOworCisJd204OTAwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7CisJaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAzKSA9PSAzKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisvKgorICogUmVhZCBmcm9tIHRoZSB3bTg5MDAuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204OTAwX2NoaXBfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCXUxNiBkYXRhOworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisKKwlCVUdfT04ocmVnICE9IFdNODkwMF9SRUdfSUQgJiYgcmVnICE9IFdNODkwMF9SRUdfUE9XRVIxKTsKKworCS8qIFdyaXRlIHJlZ2lzdGVyICovCisJeGZlclswXS5hZGRyID0gY2xpZW50LT5hZGRyOworCXhmZXJbMF0uZmxhZ3MgPSAwOworCXhmZXJbMF0ubGVuID0gMTsKKwl4ZmVyWzBdLmJ1ZiA9ICZyZWc7CisKKwkvKiBSZWFkIGRhdGEgKi8KKwl4ZmVyWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJeGZlclsxXS5mbGFncyA9IEkyQ19NX1JEOworCXhmZXJbMV0ubGVuID0gMjsKKwl4ZmVyWzFdLmJ1ZiA9ICh1OCAqKSZkYXRhOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgeGZlciwgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImkyY190cmFuc2ZlciByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIChkYXRhID4+IDgpIHwgKChkYXRhICYgMHhmZikgPDwgOCk7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gdGhlIFdNODkwMCByZWdpc3RlciBzcGFjZS4gIE1vc3QgcmVnaXN0ZXJzIGNhbid0IGJlIHJlYWQKKyAqIGFuZCBhcmUgdGhlcmVmb3JlIHN1cHBsaWVkIGZyb20gY2FjaGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204OTAwX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBXTTg5MDBfUkVHX0lEOgorCQlyZXR1cm4gd204OTAwX2NoaXBfcmVhZChjb2RlYywgcmVnKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gd204OTAwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCByZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgd204OTAwX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUkVTRVQsIDApOworCisJbWVtY3B5KGNvZGVjLT5yZWdfY2FjaGUsIHdtODkwMF9yZWdfZGVmYXVsdHMsCisJICAgICAgIHNpemVvZihjb2RlYy0+cmVnX2NhY2hlKSk7Cit9CisKK3N0YXRpYyBpbnQgd204OTAwX2hwX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwl1MTYgaHBjdGwxID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfSFBDVEwxKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQkvKiBDbGFtcCBoZWFkcGhvbmUgb3V0cHV0cyAqLworCQlocGN0bDEgPSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9DTEFNUF9JUCB8CisJCQlXTTg5MDBfUkVHX0hQQ1RMMV9IUF9DTEFNUF9PUDsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogRW5hYmxlIHRoZSBpbnB1dCBzdGFnZSAqLworCQlocGN0bDEgJj0gfldNODkwMF9SRUdfSFBDVEwxX0hQX0NMQU1QX0lQOworCQlocGN0bDEgfD0gV004OTAwX1JFR19IUENUTDFfSFBfU0hPUlQgfAorCQkJV004OTAwX1JFR19IUENUTDFfSFBfU0hPUlQyIHwKKwkJCVdNODkwMF9SRUdfSFBDVEwxX0hQX0lQU1RBR0VfRU5BOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfSFBDVEwxLCBocGN0bDEpOworCisJCW1zbGVlcCg0MDApOworCisJCS8qIEVuYWJsZSB0aGUgb3V0cHV0IHN0YWdlICovCisJCWhwY3RsMSAmPSB+V004OTAwX1JFR19IUENUTDFfSFBfQ0xBTVBfT1A7CisJCWhwY3RsMSB8PSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9PUFNUQUdFX0VOQTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKworCQkvKiBSZW1vdmUgdGhlIHNob3J0cyAqLworCQlocGN0bDEgJj0gfldNODkwMF9SRUdfSFBDVEwxX0hQX1NIT1JUMjsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKwkJaHBjdGwxICY9IH5XTTg5MDBfUkVHX0hQQ1RMMV9IUF9TSE9SVDsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQkvKiBTaG9ydCB0aGUgb3V0cHV0ICovCisJCWhwY3RsMSB8PSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9TSE9SVDsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKworCQkvKiBEaXNhYmxlIHRoZSBvdXRwdXQgc3RhZ2UgKi8KKwkJaHBjdGwxICY9IH5XTTg5MDBfUkVHX0hQQ1RMMV9IUF9PUFNUQUdFX0VOQTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0hQQ1RMMSwgaHBjdGwxKTsKKworCQkvKiBDbGFtcCB0aGUgb3V0cHV0cyBhbmQgcG93ZXIgZG93biBpbnB1dCAqLworCQlocGN0bDEgfD0gV004OTAwX1JFR19IUENUTDFfSFBfQ0xBTVBfSVAgfAorCQkJV004OTAwX1JFR19IUENUTDFfSFBfQ0xBTVBfT1A7CisJCWhwY3RsMSAmPSB+V004OTAwX1JFR19IUENUTDFfSFBfSVBTVEFHRV9FTkE7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19IUENUTDEsIGhwY3RsMSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qIERpc2FibGUgZXZlcnl0aGluZyAqLworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfSFBDVEwxLCAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF9wZ2FfdGx2LCAtNTcwMCwgMTAwLCAwKTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF9taXhfdGx2LCAtMTUwMCwgMzAwLCAwKTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX2Jvb3N0X3RsdiwgLTEyMDAsIDYwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShpbl9wZ2FfdGx2LCAtMTIwMCwgMTAwLCAwKTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY19ib29zdF90bHYsIDAsIDYwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdGx2LCAtNzIwMCwgNzUsIDEpOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3N2b2xfdGx2LCAtMzYwMCwgMzAwLCAwKTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY190bHYsIC03MjAwLCA3NSwgMSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfYmlhc19sZXZlbF90eHRbXSA9IHsgIjAuOSpBVkREIiwgIjAuNjUqQVZERCIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtaWNfYmlhc19sZXZlbCA9CitTT0NfRU5VTV9TSU5HTEUoV004OTAwX1JFR19JTkNUTCwgOCwgMiwgbWljX2JpYXNfbGV2ZWxfdHh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRhY19tdXRlX3JhdGVfdHh0W10gPSB7ICJGYXN0IiwgIlNsb3ciIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX211dGVfcmF0ZSA9CitTT0NfRU5VTV9TSU5HTEUoV004OTAwX1JFR19EQUNDVFJMLCA3LCAyLCBkYWNfbXV0ZV9yYXRlX3R4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkYWNfZGVlbXBoYXNpc190eHRbXSA9IHsKKwkiRGlzYWJsZWQiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waGFzaXMgPQorU09DX0VOVU1fU0lOR0xFKFdNODkwMF9SRUdfREFDQ1RSTCwgNCwgNCwgZGFjX2RlZW1waGFzaXNfdHh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkY19ocGZfY3V0X3R4dFtdID0geworCSJIaS1maSBtb2RlIiwgIlZvaWNlIG1vZGUgMSIsICJWb2ljZSBtb2RlIDIiLCAiVm9pY2UgbW9kZSAzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfaHBmX2N1dCA9CitTT0NfRU5VTV9TSU5HTEUoV004OTAwX1JFR19BRENDVFJMLCA1LCA0LCBhZGNfaHBmX2N1dF90eHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqbHJfdHh0W10gPSB7CisJIkxlZnQiLCAiUmlnaHQiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZmxfc3JjID0KK1NPQ19FTlVNX1NJTkdMRShXTTg5MDBfUkVHX0FVRElPMSwgMTUsIDIsIGxyX3R4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmcl9zcmMgPQorU09DX0VOVU1fU0lOR0xFKFdNODkwMF9SRUdfQVVESU8xLCAxNCwgMiwgbHJfdHh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNsX3NyYyA9CitTT0NfRU5VTV9TSU5HTEUoV004OTAwX1JFR19BVURJTzIsIDE1LCAyLCBscl90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc3JjID0KK1NPQ19FTlVNX1NJTkdMRShXTTg5MDBfUkVHX0FVRElPMiwgMTQsIDIsIGxyX3R4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzaWRldG9uZV90eHRbXSA9IHsKKwkiRGlzYWJsZWQiLCAiTGVmdCBBREMiLCAiUmlnaHQgQURDIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNsX3NpZGV0b25lID0KK1NPQ19FTlVNX1NJTkdMRShXTTg5MDBfUkVHX1NJREVUT05FLCAyLCAzLCBzaWRldG9uZV90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY3Jfc2lkZXRvbmUgPQorU09DX0VOVU1fU0lOR0xFKFdNODkwMF9SRUdfU0lERVRPTkUsIDAsIDMsIHNpZGV0b25lX3R4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5MDBfc25kX2NvbnRyb2xzW10gPSB7CitTT0NfRU5VTSgiTWljIEJpYXMgTGV2ZWwiLCBtaWNfYmlhc19sZXZlbCksCisKK1NPQ19TSU5HTEVfVExWKCJMZWZ0IElucHV0IFBHQSBWb2x1bWUiLCBXTTg5MDBfUkVHX0xJTlZPTCwgMCwgMzEsIDAsCisJICAgICAgIGluX3BnYV90bHYpLAorU09DX1NJTkdMRSgiTGVmdCBJbnB1dCBQR0EgU3dpdGNoIiwgV004OTAwX1JFR19MSU5WT0wsIDYsIDEsIDEpLAorU09DX1NJTkdMRSgiTGVmdCBJbnB1dCBQR0EgWkMgU3dpdGNoIiwgV004OTAwX1JFR19MSU5WT0wsIDcsIDEsIDApLAorCitTT0NfU0lOR0xFX1RMVigiUmlnaHQgSW5wdXQgUEdBIFZvbHVtZSIsIFdNODkwMF9SRUdfUklOVk9MLCAwLCAzMSwgMCwKKwkgICAgICAgaW5fcGdhX3RsdiksCitTT0NfU0lOR0xFKCJSaWdodCBJbnB1dCBQR0EgU3dpdGNoIiwgV004OTAwX1JFR19SSU5WT0wsIDYsIDEsIDEpLAorU09DX1NJTkdMRSgiUmlnaHQgSW5wdXQgUEdBIFpDIFN3aXRjaCIsIFdNODkwMF9SRUdfUklOVk9MLCA3LCAxLCAwKSwKKworU09DX1NJTkdMRSgiREFDIFNvZnQgTXV0ZSBTd2l0Y2giLCBXTTg5MDBfUkVHX0RBQ0NUUkwsIDYsIDEsIDEpLAorU09DX0VOVU0oIkRBQyBNdXRlIFJhdGUiLCBkYWNfbXV0ZV9yYXRlKSwKK1NPQ19TSU5HTEUoIkRBQyBNb25vIFN3aXRjaCIsIFdNODkwMF9SRUdfREFDQ1RSTCwgOSwgMSwgMCksCitTT0NfRU5VTSgiREFDIERlZW1waGFzaXMiLCBkYWNfZGVlbXBoYXNpcyksCitTT0NfU0lOR0xFKCJEQUMgU2xvcGluZyBTdG9wYmFuZCBGaWx0ZXIgU3dpdGNoIiwgV004OTAwX1JFR19EQUNDVFJMLCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRBQyBTaWdtYS1EZWx0YSBNb2R1bGF0b3IgQ2xvY2sgU3dpdGNoIiwgV004OTAwX1JFR19EQUNDVFJMLAorCSAgIDEyLCAxLCAwKSwKKworU09DX1NJTkdMRSgiQURDIEhQRiBTd2l0Y2giLCBXTTg5MDBfUkVHX0FEQ0NUUkwsIDgsIDEsIDApLAorU09DX0VOVU0oIkFEQyBIUEYgQ3V0LU9mZiIsIGFkY19ocGZfY3V0KSwKK1NPQ19ET1VCTEUoIkFEQyBJbnZlcnQgU3dpdGNoIiwgV004OTAwX1JFR19BRENDVFJMLCAxLCAwLCAxLCAwKSwKK1NPQ19TSU5HTEVfVExWKCJMZWZ0IEFEQyBTaWRldG9uZSBWb2x1bWUiLCBXTTg5MDBfUkVHX1NJREVUT05FLCA5LCAxMiwgMCwKKwkgICAgICAgYWRjX3N2b2xfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJSaWdodCBBREMgU2lkZXRvbmUgVm9sdW1lIiwgV004OTAwX1JFR19TSURFVE9ORSwgNSwgMTIsIDAsCisJICAgICAgIGFkY19zdm9sX3RsdiksCitTT0NfRU5VTSgiTGVmdCBEaWdpdGFsIEF1ZGlvIFNvdXJjZSIsIGFpZmxfc3JjKSwKK1NPQ19FTlVNKCJSaWdodCBEaWdpdGFsIEF1ZGlvIFNvdXJjZSIsIGFpZnJfc3JjKSwKKworU09DX1NJTkdMRV9UTFYoIkRBQyBJbnB1dCBCb29zdCBWb2x1bWUiLCBXTTg5MDBfUkVHX0FVRElPMiwgMTAsIDQsIDAsCisJICAgICAgIGRhY19ib29zdF90bHYpLAorU09DX0VOVU0oIkxlZnQgREFDIFNvdXJjZSIsIGRhY2xfc3JjKSwKK1NPQ19FTlVNKCJSaWdodCBEQUMgU291cmNlIiwgZGFjcl9zcmMpLAorU09DX0VOVU0oIkxlZnQgREFDIFNpZGV0b25lIiwgZGFjbF9zaWRldG9uZSksCitTT0NfRU5VTSgiUmlnaHQgREFDIFNpZGV0b25lIiwgZGFjcl9zaWRldG9uZSksCitTT0NfRE9VQkxFKCJEQUMgSW52ZXJ0IFN3aXRjaCIsIFdNODkwMF9SRUdfREFDQ1RSTCwgMSwgMCwgMSwgMCksCisKK1NPQ19ET1VCTEVfUl9UTFYoIkRpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIiwKKwkJIFdNODkwMF9SRUdfTERBQ19EViwgV004OTAwX1JFR19SREFDX0RWLAorCQkgMSwgOTYsIDAsIGRhY190bHYpLAorU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIsCisJCSBXTTg5MDBfUkVHX0xBRENfRFYsIFdNODkwMF9SRUdfUkFEQ19EViwgMSwgMTE5LCAwLCBhZGNfdGx2KSwKKworU09DX1NJTkdMRV9UTFYoIkxJTlBVVDMgQnlwYXNzIFZvbHVtZSIsIFdNODkwMF9SRUdfTE9VVE1JWENUTDEsIDQsIDcsIDAsCisJICAgICAgIG91dF9taXhfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJSSU5QVVQzIEJ5cGFzcyBWb2x1bWUiLCBXTTg5MDBfUkVHX1JPVVRNSVhDVEwxLCA0LCA3LCAwLAorCSAgICAgICBvdXRfbWl4X3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGVmdCBBVVggQnlwYXNzIFZvbHVtZSIsIFdNODkwMF9SRUdfQVVYT1VUX0NUTCwgNCwgNywgMCwKKwkgICAgICAgb3V0X21peF90bHYpLAorU09DX1NJTkdMRV9UTFYoIlJpZ2h0IEFVWCBCeXBhc3MgVm9sdW1lIiwgV004OTAwX1JFR19BVVhPVVRfQ1RMLCAwLCA3LCAwLAorCSAgICAgICBvdXRfbWl4X3RsdiksCisKK1NPQ19TSU5HTEVfVExWKCJMZWZ0SW4gdG8gUmlnaHRPdXQgTWl4ZXIgVm9sdW1lIiwgV004OTAwX1JFR19CWVBBU1MxLCAwLCA3LCAwLAorCSAgICAgICBvdXRfbWl4X3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGVmdEluIHRvIExlZnRPdXQgTWl4ZXIgVm9sdW1lIiwgV004OTAwX1JFR19CWVBBU1MxLCA0LCA3LCAwLAorCSAgICAgICBvdXRfbWl4X3RsdiksCitTT0NfU0lOR0xFX1RMVigiUmlnaHRJbiB0byBMZWZ0T3V0IE1peGVyIFZvbHVtZSIsIFdNODkwMF9SRUdfQllQQVNTMiwgMCwgNywgMCwKKwkgICAgICAgb3V0X21peF90bHYpLAorU09DX1NJTkdMRV9UTFYoIlJpZ2h0SW4gdG8gUmlnaHRPdXQgTWl4ZXIgVm9sdW1lIiwgV004OTAwX1JFR19CWVBBU1MyLCA0LCA3LCAwLAorCSAgICAgICBvdXRfbWl4X3RsdiksCisKK1NPQ19TSU5HTEVfVExWKCJJTjJMIEJvb3N0IFZvbHVtZSIsIFdNODkwMF9SRUdfSU5CT09TVE1JWDEsIDAsIDMsIDAsCisJICAgICAgIGluX2Jvb3N0X3RsdiksCitTT0NfU0lOR0xFX1RMVigiSU4zTCBCb29zdCBWb2x1bWUiLCBXTTg5MDBfUkVHX0lOQk9PU1RNSVgxLCA0LCAzLCAwLAorCSAgICAgICBpbl9ib29zdF90bHYpLAorU09DX1NJTkdMRV9UTFYoIklOMlIgQm9vc3QgVm9sdW1lIiwgV004OTAwX1JFR19JTkJPT1NUTUlYMiwgMCwgMywgMCwKKwkgICAgICAgaW5fYm9vc3RfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJJTjNSIEJvb3N0IFZvbHVtZSIsIFdNODkwMF9SRUdfSU5CT09TVE1JWDIsIDQsIDMsIDAsCisJICAgICAgIGluX2Jvb3N0X3RsdiksCitTT0NfU0lOR0xFX1RMVigiTGVmdCBBVVggQm9vc3QgVm9sdW1lIiwgV004OTAwX1JFR19BVVhCT09TVCwgNCwgMywgMCwKKwkgICAgICAgaW5fYm9vc3RfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJSaWdodCBBVVggQm9vc3QgVm9sdW1lIiwgV004OTAwX1JFR19BVVhCT09TVCwgMCwgMywgMCwKKwkgICAgICAgaW5fYm9vc3RfdGx2KSwKKworU09DX0RPVUJMRV9SX1RMVigiTElORU9VVDEgVm9sdW1lIiwgV004OTAwX1JFR19MT1VUMUNUTCwgV004OTAwX1JFR19ST1VUMUNUTCwKKwkgICAgICAgMCwgNjMsIDAsIG91dF9wZ2FfdGx2KSwKK1NPQ19ET1VCTEVfUigiTElORU9VVDEgU3dpdGNoIiwgV004OTAwX1JFR19MT1VUMUNUTCwgV004OTAwX1JFR19ST1VUMUNUTCwKKwkgICAgIDYsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJMSU5FT1VUMSBaQyBTd2l0Y2giLCBXTTg5MDBfUkVHX0xPVVQxQ1RMLCBXTTg5MDBfUkVHX1JPVVQxQ1RMLAorCSAgICAgNywgMSwgMCksCisKK1NPQ19ET1VCTEVfUl9UTFYoIkxJTkVPVVQyIFZvbHVtZSIsCisJCSBXTTg5MDBfUkVHX0xPVVQyQ1RMLCBXTTg5MDBfUkVHX1JPVVQyQ1RMLAorCQkgMCwgNjMsIDAsIG91dF9wZ2FfdGx2KSwKK1NPQ19ET1VCTEVfUigiTElORU9VVDIgU3dpdGNoIiwKKwkgICAgIFdNODkwMF9SRUdfTE9VVDJDVEwsIFdNODkwMF9SRUdfUk9VVDJDVEwsIDYsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJMSU5FT1VUMiBaQyBTd2l0Y2giLAorCSAgICAgV004OTAwX1JFR19MT1VUMkNUTCwgV004OTAwX1JFR19ST1VUMkNUTCwgNywgMSwgMCksCitTT0NfU0lOR0xFKCJMSU5FT1VUMiBMUCAtMTJkQiIsIFdNODkwMF9SRUdfTE9VVE1JWENUTDEsCisJICAgMCwgMSwgMSksCisKK307CisKKy8qIGFkZCBub24gZGFwbSBjb250cm9scyAqLworc3RhdGljIGludCB3bTg5MDBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTAwX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQkgIHNuZF9zb2NfY25ldygmd204OTAwX3NuZF9jb250cm9sc1tpXSwKKwkJCQkJICAgICAgIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwMF9kYXBtX2xvdXRwdXQyX2NvbnRyb2wgPQorU09DX0RBUE1fU0lOR0xFKCJMSU5FT1VUMkwgU3dpdGNoIiwgV004OTAwX1JFR19QT1dFUjMsIDYsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTAwX2RhcG1fcm91dHB1dDJfY29udHJvbCA9CitTT0NfREFQTV9TSU5HTEUoIkxJTkVPVVQyUiBTd2l0Y2giLCBXTTg5MDBfUkVHX1BPV0VSMywgNSwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5MDBfbG91dG1peF9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMSU5QVVQzIEJ5cGFzcyBTd2l0Y2giLCBXTTg5MDBfUkVHX0xPVVRNSVhDVEwxLCA3LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiQVVYIEJ5cGFzcyBTd2l0Y2giLCBXTTg5MDBfUkVHX0FVWE9VVF9DVEwsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMZWZ0IElucHV0IE1peGVyIFN3aXRjaCIsIFdNODkwMF9SRUdfQllQQVNTMSwgNywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IElucHV0IE1peGVyIFN3aXRjaCIsIFdNODkwMF9SRUdfQllQQVNTMiwgMywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgV004OTAwX1JFR19MT1VUTUlYQ1RMMSwgOCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTAwX3JvdXRtaXhfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiUklOUFVUMyBCeXBhc3MgU3dpdGNoIiwgV004OTAwX1JFR19ST1VUTUlYQ1RMMSwgNywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkFVWCBCeXBhc3MgU3dpdGNoIiwgV004OTAwX1JFR19BVVhPVVRfQ1RMLCAzLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTGVmdCBJbnB1dCBNaXhlciBTd2l0Y2giLCBXTTg5MDBfUkVHX0JZUEFTUzEsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJSaWdodCBJbnB1dCBNaXhlciBTd2l0Y2giLCBXTTg5MDBfUkVHX0JZUEFTUzIsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFdNODkwMF9SRUdfUk9VVE1JWENUTDEsIDgsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwMF9saW5taXhfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTElOUFVUMiBTd2l0Y2giLCBXTTg5MDBfUkVHX0lOQk9PU1RNSVgxLCAyLCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTElOUFVUMyBTd2l0Y2giLCBXTTg5MDBfUkVHX0lOQk9PU1RNSVgxLCA2LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiQVVYIFN3aXRjaCIsIFdNODkwMF9SRUdfQVVYQk9PU1QsIDYsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJJbnB1dCBQR0EgU3dpdGNoIiwgV004OTAwX1JFR19BRENQQVRILCA2LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5MDBfcmlubWl4X2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIlJJTlBVVDIgU3dpdGNoIiwgV004OTAwX1JFR19JTkJPT1NUTUlYMiwgMiwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIlJJTlBVVDMgU3dpdGNoIiwgV004OTAwX1JFR19JTkJPT1NUTUlYMiwgNiwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkFVWCBTd2l0Y2giLCBXTTg5MDBfUkVHX0FVWEJPT1NULCAyLCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiSW5wdXQgUEdBIFN3aXRjaCIsIFdNODkwMF9SRUdfQURDUEFUSCwgMiwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTAwX2xpbnBnYV9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMSU5QVVQxIFN3aXRjaCIsIFdNODkwMF9SRUdfSU5DVEwsIDYsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMSU5QVVQyIFN3aXRjaCIsIFdNODkwMF9SRUdfSU5DVEwsIDUsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMSU5QVVQzIFN3aXRjaCIsIFdNODkwMF9SRUdfSU5DVEwsIDQsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODkwMF9yaW5wZ2FfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiUklOUFVUMSBTd2l0Y2giLCBXTTg5MDBfUkVHX0lOQ1RMLCAyLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUklOUFVUMiBTd2l0Y2giLCBXTTg5MDBfUkVHX0lOQ1RMLCAxLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUklOUFVUMyBTd2l0Y2giLCBXTTg5MDBfUkVHX0lOQ1RMLCAwLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MDBfbHBfbXV4W10gPSB7ICJEaXNhYmxlZCIsICJFbmFibGVkIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODkwMF9saW5lb3V0Ml9scF9tdXggPQorU09DX0VOVU1fU0lOR0xFKFdNODkwMF9SRUdfTE9VVE1JWENUTDEsIDEsIDIsIHdtOTcwMF9scF9tdXgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTAwX2xpbmVvdXQyX2xwID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTAwX2xpbmVvdXQyX2xwX211eCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg5MDBfZGFwbV93aWRnZXRzW10gPSB7CisKKy8qIEV4dGVybmFsbHkgdmlzaWJsZSBwaW5zICovCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMUwiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQxUiIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTElORU9VVDJMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMlIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQX0wiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQX1IiKSwKKworU05EX1NPQ19EQVBNX0lOUFVUKCJSSU5QVVQxIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDEiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiUklOUFVUMiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5QVVQyIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDMiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTElOUFVUMyIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJBVVgiKSwKKworU05EX1NPQ19EQVBNX1ZNSUQoIlZNSUQiKSwKKworLyogSW5wdXQgKi8KK1NORF9TT0NfREFQTV9NSVhFUigiTGVmdCBJbnB1dCBQR0EiLCBXTTg5MDBfUkVHX1BPV0VSMiwgMywgMCwKKwkJICAgd204OTAwX2xpbnBnYV9jb250cm9scywKKwkJICAgQVJSQVlfU0laRSh3bTg5MDBfbGlucGdhX2NvbnRyb2xzKSksCitTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IElucHV0IFBHQSIsIFdNODkwMF9SRUdfUE9XRVIyLCAyLCAwLAorCQkgICB3bTg5MDBfcmlucGdhX2NvbnRyb2xzLAorCQkgICBBUlJBWV9TSVpFKHdtODkwMF9yaW5wZ2FfY29udHJvbHMpKSwKKworU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IElucHV0IE1peGVyIiwgV004OTAwX1JFR19QT1dFUjIsIDUsIDAsCisJCSAgIHdtODkwMF9saW5taXhfY29udHJvbHMsCisJCSAgIEFSUkFZX1NJWkUod204OTAwX2xpbm1peF9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBJbnB1dCBNaXhlciIsIFdNODkwMF9SRUdfUE9XRVIyLCA0LCAwLAorCQkgICB3bTg5MDBfcmlubWl4X2NvbnRyb2xzLAorCQkgICBBUlJBWV9TSVpFKHdtODkwMF9yaW5taXhfY29udHJvbHMpKSwKKworU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1pYyBCaWFzIiwgV004OTAwX1JFR19QT1dFUjEsIDQsIDApLAorCitTTkRfU09DX0RBUE1fQURDKCJBRENMIiwgIkxlZnQgSGlGaSBDYXB0dXJlIiwgV004OTAwX1JFR19QT1dFUjIsIDEsIDApLAorU05EX1NPQ19EQVBNX0FEQygiQURDUiIsICJSaWdodCBIaUZpIENhcHR1cmUiLCBXTTg5MDBfUkVHX1BPV0VSMiwgMCwgMCksCisKKy8qIE91dHB1dCAqLworU05EX1NPQ19EQVBNX0RBQygiREFDTCIsICJMZWZ0IEhpRmkgUGxheWJhY2siLCBXTTg5MDBfUkVHX1BPV0VSMywgMSwgMCksCitTTkRfU09DX0RBUE1fREFDKCJEQUNSIiwgIlJpZ2h0IEhpRmkgUGxheWJhY2siLCBXTTg5MDBfUkVHX1BPV0VSMywgMCwgMCksCisKK1NORF9TT0NfREFQTV9QR0FfRSgiSGVhZHBob25lIEFtcGxpZmllciIsIFdNODkwMF9SRUdfUE9XRVIzLCA3LCAwLCBOVUxMLCAwLAorCQkgICB3bTg5MDBfaHBfZXZlbnQsCisJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCitTTkRfU09DX0RBUE1fUEdBKCJMSU5FT1VUMUwgUEdBIiwgV004OTAwX1JFR19QT1dFUjIsIDgsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTElORU9VVDFSIFBHQSIsIFdNODkwMF9SRUdfUE9XRVIyLCA3LCAwLCBOVUxMLCAwKSwKKworU05EX1NPQ19EQVBNX01VWCgiTElORU9VVDIgTFAiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg5MDBfbGluZW91dDJfbHApLAorU05EX1NPQ19EQVBNX1BHQSgiTElORU9VVDJMIFBHQSIsIFdNODkwMF9SRUdfUE9XRVIzLCA2LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkxJTkVPVVQyUiBQR0EiLCBXTTg5MDBfUkVHX1BPV0VSMywgNSwgMCwgTlVMTCwgMCksCisKK1NORF9TT0NfREFQTV9NSVhFUigiTGVmdCBPdXRwdXQgTWl4ZXIiLCBXTTg5MDBfUkVHX1BPV0VSMywgMywgMCwKKwkJICAgd204OTAwX2xvdXRtaXhfY29udHJvbHMsCisJCSAgIEFSUkFZX1NJWkUod204OTAwX2xvdXRtaXhfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9NSVhFUigiUmlnaHQgT3V0cHV0IE1peGVyIiwgV004OTAwX1JFR19QT1dFUjMsIDIsIDAsCisJCSAgIHdtODkwMF9yb3V0bWl4X2NvbnRyb2xzLAorCQkgICBBUlJBWV9TSVpFKHdtODkwMF9yb3V0bWl4X2NvbnRyb2xzKSksCit9OworCisvKiBUYXJnZXQsIFBhdGgsIFNvdXJjZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXVkaW9fbWFwW10gPSB7CisvKiBJbnB1dHMgKi8KK3siTGVmdCBJbnB1dCBQR0EiLCAiTElOUFVUMSBTd2l0Y2giLCAiTElOUFVUMSJ9LAoreyJMZWZ0IElucHV0IFBHQSIsICJMSU5QVVQyIFN3aXRjaCIsICJMSU5QVVQyIn0sCit7IkxlZnQgSW5wdXQgUEdBIiwgIkxJTlBVVDMgU3dpdGNoIiwgIkxJTlBVVDMifSwKKworeyJSaWdodCBJbnB1dCBQR0EiLCAiUklOUFVUMSBTd2l0Y2giLCAiUklOUFVUMSJ9LAoreyJSaWdodCBJbnB1dCBQR0EiLCAiUklOUFVUMiBTd2l0Y2giLCAiUklOUFVUMiJ9LAoreyJSaWdodCBJbnB1dCBQR0EiLCAiUklOUFVUMyBTd2l0Y2giLCAiUklOUFVUMyJ9LAorCit7IkxlZnQgSW5wdXQgTWl4ZXIiLCAiTElOUFVUMiBTd2l0Y2giLCAiTElOUFVUMiJ9LAoreyJMZWZ0IElucHV0IE1peGVyIiwgIkxJTlBVVDMgU3dpdGNoIiwgIkxJTlBVVDMifSwKK3siTGVmdCBJbnB1dCBNaXhlciIsICJBVVggU3dpdGNoIiwgIkFVWCJ9LAoreyJMZWZ0IElucHV0IE1peGVyIiwgIklucHV0IFBHQSBTd2l0Y2giLCAiTGVmdCBJbnB1dCBQR0EifSwKKworeyJSaWdodCBJbnB1dCBNaXhlciIsICJSSU5QVVQyIFN3aXRjaCIsICJSSU5QVVQyIn0sCit7IlJpZ2h0IElucHV0IE1peGVyIiwgIlJJTlBVVDMgU3dpdGNoIiwgIlJJTlBVVDMifSwKK3siUmlnaHQgSW5wdXQgTWl4ZXIiLCAiQVVYIFN3aXRjaCIsICJBVVgifSwKK3siUmlnaHQgSW5wdXQgTWl4ZXIiLCAiSW5wdXQgUEdBIFN3aXRjaCIsICJSaWdodCBJbnB1dCBQR0EifSwKKworeyJBRENMIiwgTlVMTCwgIkxlZnQgSW5wdXQgTWl4ZXIifSwKK3siQURDUiIsIE5VTEwsICJSaWdodCBJbnB1dCBNaXhlciJ9LAorCisvKiBPdXRwdXRzICovCit7IkxJTkVPVVQxTCIsIE5VTEwsICJMSU5FT1VUMUwgUEdBIn0sCit7IkxJTkVPVVQxTCBQR0EiLCBOVUxMLCAiTGVmdCBPdXRwdXQgTWl4ZXIifSwKK3siTElORU9VVDFSIiwgTlVMTCwgIkxJTkVPVVQxUiBQR0EifSwKK3siTElORU9VVDFSIFBHQSIsIE5VTEwsICJSaWdodCBPdXRwdXQgTWl4ZXIifSwKKworeyJMSU5FT1VUMkwgUEdBIiwgTlVMTCwgIkxlZnQgT3V0cHV0IE1peGVyIn0sCit7IkxJTkVPVVQyIExQIiwgIkRpc2FibGVkIiwgIkxJTkVPVVQyTCBQR0EifSwKK3siTElORU9VVDIgTFAiLCAiRW5hYmxlZCIsICJMZWZ0IE91dHB1dCBNaXhlciJ9LAoreyJMSU5FT1VUMkwiLCBOVUxMLCAiTElORU9VVDIgTFAifSwKKworeyJMSU5FT1VUMlIgUEdBIiwgTlVMTCwgIlJpZ2h0IE91dHB1dCBNaXhlciJ9LAoreyJMSU5FT1VUMiBMUCIsICJEaXNhYmxlZCIsICJMSU5FT1VUMlIgUEdBIn0sCit7IkxJTkVPVVQyIExQIiwgIkVuYWJsZWQiLCAiUmlnaHQgT3V0cHV0IE1peGVyIn0sCit7IkxJTkVPVVQyUiIsIE5VTEwsICJMSU5FT1VUMiBMUCJ9LAorCit7IkxlZnQgT3V0cHV0IE1peGVyIiwgIkxJTlBVVDMgQnlwYXNzIFN3aXRjaCIsICJMSU5QVVQzIn0sCit7IkxlZnQgT3V0cHV0IE1peGVyIiwgIkFVWCBCeXBhc3MgU3dpdGNoIiwgIkFVWCJ9LAoreyJMZWZ0IE91dHB1dCBNaXhlciIsICJMZWZ0IElucHV0IE1peGVyIFN3aXRjaCIsICJMZWZ0IElucHV0IE1peGVyIn0sCit7IkxlZnQgT3V0cHV0IE1peGVyIiwgIlJpZ2h0IElucHV0IE1peGVyIFN3aXRjaCIsICJSaWdodCBJbnB1dCBNaXhlciJ9LAoreyJMZWZ0IE91dHB1dCBNaXhlciIsICJEQUNMIFN3aXRjaCIsICJEQUNMIn0sCisKK3siUmlnaHQgT3V0cHV0IE1peGVyIiwgIlJJTlBVVDMgQnlwYXNzIFN3aXRjaCIsICJSSU5QVVQzIn0sCit7IlJpZ2h0IE91dHB1dCBNaXhlciIsICJBVVggQnlwYXNzIFN3aXRjaCIsICJBVVgifSwKK3siUmlnaHQgT3V0cHV0IE1peGVyIiwgIkxlZnQgSW5wdXQgTWl4ZXIgU3dpdGNoIiwgIkxlZnQgSW5wdXQgTWl4ZXIifSwKK3siUmlnaHQgT3V0cHV0IE1peGVyIiwgIlJpZ2h0IElucHV0IE1peGVyIFN3aXRjaCIsICJSaWdodCBJbnB1dCBNaXhlciJ9LAoreyJSaWdodCBPdXRwdXQgTWl4ZXIiLCAiREFDUiBTd2l0Y2giLCAiREFDUiJ9LAorCisvKiBOb3RlIHRoYXQgdGhlIGhlYWRwaG9uZSBvdXRwdXQgc3RhZ2UgbmVlZHMgdG8gYmUgY29ubmVjdGVkCisgKiBleHRlcm5hbGx5IHRvIExJTkVPVVQyIHZpYSBEQyBibG9ja2luZyBjYXBhY2l0b3JzLiAgT3RoZXIKKyAqIGNvbmZpZ3VyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIE5vdGUgYWxzbyB0aGF0IGxlZnQgYW5kIHJpZ2h0IGhlYWRwaG9uZSBwYXRocyBhcmUgdHJlYXRlZCBhcyBhCisgKiBtb25vIHBhdGguCisgKi8KK3siSGVhZHBob25lIEFtcGxpZmllciIsIE5VTEwsICJMSU5FT1VUMiBMUCJ9LAoreyJIZWFkcGhvbmUgQW1wbGlmaWVyIiwgTlVMTCwgIkxJTkVPVVQyIExQIn0sCit7IkhQX0wiLCBOVUxMLCAiSGVhZHBob25lIEFtcGxpZmllciJ9LAoreyJIUF9SIiwgTlVMTCwgIkhlYWRwaG9uZSBBbXBsaWZpZXIifSwKK307CisKK3N0YXRpYyBpbnQgd204OTAwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5MDBfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg5MDBfZGFwbV93aWRnZXRzKSk7CisKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODkwMF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwl1MTYgcmVnOworCisJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQVVESU8xKSAmIH4weDYwOworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJcmVnIHw9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXJlZyB8PSAweDQwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlyZWcgfD0gMHg2MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMSwgcmVnKTsKKworCXJldHVybiAwOworfQorCisvKiBGTEwgZGl2aXNvcnMgKi8KK3N0cnVjdCBfZmxsX2RpdiB7CisJdTE2IGZsbF9yYXRpbzsKKwl1MTYgZmxsY2xrX2RpdjsKKwl1MTYgZmxsX3Nsb3dfbG9ja19yZWY7CisJdTE2IG47CisJdTE2IGs7Cit9OworCisvKiBUaGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBGTEwgZGl2aWRlIG11bHRpcGxpZWQgYnkgMTAKKyAqIHRvIGFsbG93IHJvdW5kaW5nIGxhdGVyICovCisjZGVmaW5lIEZJWEVEX0ZMTF9TSVpFICgoMSA8PCAxNikgKiAxMCkKKworc3RhdGljIGludCBmbGxfZmFjdG9ycyhzdHJ1Y3QgX2ZsbF9kaXYgKmZsbF9kaXYsIHVuc2lnbmVkIGludCBGcmVmLAorCQkgICAgICAgdW5zaWduZWQgaW50IEZvdXQpCit7CisJdTY0IEtwYXJ0OworCXVuc2lnbmVkIGludCBLLCBOZGl2LCBObW9kLCB0YXJnZXQ7CisJdW5zaWduZWQgaW50IGRpdjsKKworCUJVR19PTighRm91dCk7CisKKwkvKiBUaGUgRkxMIG11c3QgcnVuIGF0IDkwLTEwME1IeiB3aGljaCBpcyB0aGVuIHNjYWxlZCBkb3duIHRvCisJICogdGhlIG91dHB1dCB2YWx1ZSBieSBGTExDTEtfRElWLiAqLworCXRhcmdldCA9IEZvdXQ7CisJZGl2ID0gMTsKKwl3aGlsZSAodGFyZ2V0IDwgOTAwMDAwMDApIHsKKwkJZGl2ICo9IDI7CisJCXRhcmdldCAqPSAyOworCX0KKworCWlmICh0YXJnZXQgPiAxMDAwMDAwMDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndtODkwMDogRkxMIHJhdGUgJWQgb3V0IG9mIHJhbmdlLCBGcmVmPSVkIgorCQkgICAgICAgIiBGb3V0PSVkXG4iLCB0YXJnZXQsIEZyZWYsIEZvdXQpOworCWlmIChkaXYgPiAzMikgeworCQlwcmludGsoS0VSTl9FUlIgIndtODkwMDogSW52YWxpZCBGTEwgZGl2aXNpb24gcmF0ZSAldSwgIgorCQkgICAgICAgIkZyZWY9JWQsIEZvdXQ9JWQsIHRhcmdldD0lZFxuIiwKKwkJICAgICAgIGRpdiwgRnJlZiwgRm91dCwgdGFyZ2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmxsX2Rpdi0+ZmxsY2xrX2RpdiA9IGRpdiA+PiAyOworCisJaWYgKEZyZWYgPCA0ODAwMCkKKwkJZmxsX2Rpdi0+ZmxsX3Nsb3dfbG9ja19yZWYgPSAxOworCWVsc2UKKwkJZmxsX2Rpdi0+ZmxsX3Nsb3dfbG9ja19yZWYgPSAwOworCisJTmRpdiA9IHRhcmdldCAvIEZyZWY7CisKKwlpZiAoRnJlZiA8IDEwMDAwMDApCisJCWZsbF9kaXYtPmZsbF9yYXRpbyA9IDg7CisJZWxzZQorCQlmbGxfZGl2LT5mbGxfcmF0aW8gPSAxOworCisJZmxsX2Rpdi0+biA9IE5kaXYgLyBmbGxfZGl2LT5mbGxfcmF0aW87CisJTm1vZCA9ICh0YXJnZXQgLyBmbGxfZGl2LT5mbGxfcmF0aW8pICUgRnJlZjsKKworCS8qIENhbGN1bGF0ZSBmcmFjdGlvbmFsIHBhcnQgLSBzY2FsZSB1cCBzbyB3ZSBjYW4gcm91bmQuICovCisJS3BhcnQgPSBGSVhFRF9GTExfU0laRSAqIChsb25nIGxvbmcpTm1vZDsKKworCWRvX2RpdihLcGFydCwgRnJlZik7CisKKwlLID0gS3BhcnQgJiAweEZGRkZGRkZGOworCisJaWYgKChLICUgMTApID49IDUpCisJCUsgKz0gNTsKKworCS8qIE1vdmUgZG93biB0byBwcm9wZXIgcmFuZ2Ugbm93IHJvdW5kaW5nIGlzIGRvbmUgKi8KKwlmbGxfZGl2LT5rID0gSyAvIDEwOworCisJQlVHX09OKHRhcmdldCAhPSBGb3V0ICogKGZsbF9kaXYtPmZsbGNsa19kaXYgPDwgMikpOworCUJVR19PTighSyAmJiB0YXJnZXQgIT0gRnJlZiAqIGZsbF9kaXYtPmZsbF9yYXRpbyAqIGZsbF9kaXYtPm4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAwX3NldF9mbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWludCBmbGxfaWQsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHdtODkwMF9wcml2ICp3bTg5MDAgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBfZmxsX2RpdiBmbGxfZGl2OworCXVuc2lnbmVkIGludCByZWc7CisKKwlpZiAod204OTAwLT5mbGxfaW4gPT0gZnJlcV9pbiAmJiB3bTg5MDAtPmZsbF9vdXQgPT0gZnJlcV9vdXQpCisJCXJldHVybiAwOworCisJLyogVGhlIGRpZ2l0YWwgc2lkZSBzaG91bGQgYmUgZGlzYWJsZWQgZHVyaW5nIGFueSBjaGFuZ2UuICovCisJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxLAorCQkgICAgIHJlZyAmICh+V004OTAwX1JFR19QT1dFUjFfRkxMX0VOQSkpOworCisJLyogRGlzYWJsZSB0aGUgRkxMPyAqLworCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQ0xPQ0tJTkcxKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKKwkJCSAgICAgcmVnICYgKH5XTTg5MDBfUkVHX0NMT0NLSU5HMV9NQ0xLX1NSQykpOworCisJCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDEpOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfRkxMQ1RMMSwKKwkJCSAgICAgcmVnICYgKH5XTTg5MDBfUkVHX0ZMTENUTDFfT1NDX0VOQSkpOworCisJCXdtODkwMC0+ZmxsX2luID0gZnJlcV9pbjsKKwkJd204OTAwLT5mbGxfb3V0ID0gZnJlcV9vdXQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZsbF9mYWN0b3JzKCZmbGxfZGl2LCBmcmVxX2luLCBmcmVxX291dCkgIT0gMCkKKwkJZ290byByZWVuYWJsZTsKKworCXdtODkwMC0+ZmxsX2luID0gZnJlcV9pbjsKKwl3bTg5MDAtPmZsbF9vdXQgPSBmcmVxX291dDsKKworCS8qIFRoZSBvc2NsaWxhdG9yICpNVVNUKiBiZSBlbmFibGVkIGJlZm9yZSB3ZSBlbmFibGUgdGhlCisJICogZGlnaXRhbCBjaXJjdWl0LiAqLworCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19GTExDVEwxLAorCQkgICAgIGZsbF9kaXYuZmxsX3JhdGlvIHwgV004OTAwX1JFR19GTExDVEwxX09TQ19FTkEpOworCisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDQsIGZsbF9kaXYubiA+PiA1KTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfRkxMQ1RMNSwKKwkJICAgICAoZmxsX2Rpdi5mbGxjbGtfZGl2IDw8IDYpIHwgKGZsbF9kaXYubiAmIDB4MWYpKTsKKworCWlmIChmbGxfZGl2LmspIHsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDIsCisJCQkgICAgIChmbGxfZGl2LmsgPj4gOCkgfCAweDEwMCk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19GTExDVEwzLCBmbGxfZGl2LmsgJiAweGZmKTsKKwl9IGVsc2UKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDIsIDApOworCisJaWYgKGZsbF9kaXYuZmxsX3Nsb3dfbG9ja19yZWYpCisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19GTExDVEw2LAorCQkJICAgICBXTTg5MDBfUkVHX0ZMTENUTDZfRkxMX1NMT1dfTE9DS19SRUYpOworCWVsc2UKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDYsIDApOworCisJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxLAorCQkgICAgIHJlZyB8IFdNODkwMF9SRUdfUE9XRVIxX0ZMTF9FTkEpOworCityZWVuYWJsZToKKwlyZWcgPSB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOworCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCSAgICAgcmVnIHwgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAwX3NldF9kYWlfcGxsKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgcGxsX2lkLCB1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQoreworCXJldHVybiB3bTg5MDBfc2V0X2ZsbChjb2RlY19kYWktPmNvZGVjLCBwbGxfaWQsIGZyZXFfaW4sIGZyZXFfb3V0KTsKK30KKworc3RhdGljIGludCB3bTg5MDBfc2V0X2RhaV9jbGtkaXYoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJIGludCBkaXZfaWQsIGludCBkaXYpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJc3dpdGNoIChkaXZfaWQpIHsKKwljYXNlIFdNODkwMF9CQ0xLX0RJVjoKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQ0xPQ0tJTkcxKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKKwkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSykpOworCQlicmVhazsKKwljYXNlIFdNODkwMF9PUENMS19ESVY6CisJCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkgICAgIGRpdiB8IChyZWcgJiBXTTg5MDBfUkVHX0NMT0NLSU5HMV9PUENMS19NQVNLKSk7CisJCWJyZWFrOworCWNhc2UgV004OTAwX0RBQ19MUkNMSzoKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQVVESU80KTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPNCwKKwkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9MUkNfTUFTSykpOworCQlicmVhazsKKwljYXNlIFdNODkwMF9BRENfTFJDTEs6CisJCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMyk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19BVURJTzMsCisJCQkgICAgIGRpdiB8IChyZWcgJiBXTTg5MDBfTFJDX01BU0spKTsKKwkJYnJlYWs7CisJY2FzZSBXTTg5MDBfREFDX0NMS0RJVjoKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQ0xPQ0tJTkcyKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKKwkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0RBQ19DTEtESVYpKTsKKwkJYnJlYWs7CisJY2FzZSBXTTg5MDBfQURDX0NMS0RJVjoKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfQ0xPQ0tJTkcyKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKKwkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0FEQ19DTEtESVYpKTsKKwkJYnJlYWs7CisJY2FzZSBXTTg5MDBfTFJDTEtfTU9ERToKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfREFDQ1RSTCk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19EQUNDVFJMLAorCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX1JFR19EQUNDVFJMX0FJRl9MUkNMS1JBVEUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3bTg5MDBfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdW5zaWduZWQgaW50IGNsb2NraW5nMSwgYWlmMSwgYWlmMywgYWlmNDsKKworCWNsb2NraW5nMSA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSk7CisJYWlmMSA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMSk7CisJYWlmMyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMyk7CisJYWlmNCA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPNCk7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWNsb2NraW5nMSAmPSB+V004OTAwX1JFR19DTE9DS0lORzFfQkNMS19ESVI7CisJCWFpZjMgJj0gfldNODkwMF9SRUdfQVVESU8zX0FEQ0xSQ19ESVI7CisJCWFpZjQgJj0gfldNODkwMF9SRUdfQVVESU80X0RBQ0xSQ19ESVI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJY2xvY2tpbmcxICY9IH5XTTg5MDBfUkVHX0NMT0NLSU5HMV9CQ0xLX0RJUjsKKwkJYWlmMyB8PSBXTTg5MDBfUkVHX0FVRElPM19BRENMUkNfRElSOworCQlhaWY0IHw9IFdNODkwMF9SRUdfQVVESU80X0RBQ0xSQ19ESVI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJY2xvY2tpbmcxIHw9IFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfRElSOworCQlhaWYzIHw9IFdNODkwMF9SRUdfQVVESU8zX0FEQ0xSQ19ESVI7CisJCWFpZjQgfD0gV004OTAwX1JFR19BVURJTzRfREFDTFJDX0RJUjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgorCQljbG9ja2luZzEgfD0gV004OTAwX1JFR19DTE9DS0lORzFfQkNMS19ESVI7CisJCWFpZjMgJj0gfldNODkwMF9SRUdfQVVESU8zX0FEQ0xSQ19ESVI7CisJCWFpZjQgJj0gfldNODkwMF9SRUdfQVVESU80X0RBQ0xSQ19ESVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlhaWYxIHw9IFdNODkwMF9SRUdfQVVESU8xX0FJRl9GTVRfTUFTSzsKKwkJYWlmMSAmPSB+V004OTAwX1JFR19BVURJTzFfTFJDTEtfSU5WOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlhaWYxIHw9IFdNODkwMF9SRUdfQVVESU8xX0FJRl9GTVRfTUFTSzsKKwkJYWlmMSB8PSBXTTg5MDBfUkVHX0FVRElPMV9MUkNMS19JTlY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlhaWYxICY9IH5XTTg5MDBfUkVHX0FVRElPMV9BSUZfRk1UX01BU0s7CisJCWFpZjEgfD0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlhaWYxICY9IH5XTTg5MDBfUkVHX0FVRElPMV9BSUZfRk1UX01BU0s7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlhaWYxICY9IH5XTTg5MDBfUkVHX0FVRElPMV9BSUZfRk1UX01BU0s7CisJCWFpZjEgfD0gMHg4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDbG9jayBpbnZlcnNpb24gKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQkvKiBmcmFtZSBpbnZlcnNpb24gbm90IHZhbGlkIGZvciBEU1AgbW9kZXMgKi8KKwkJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCQljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQkJYWlmMSAmPSB+V004OTAwX1JFR19BVURJTzFfQkNMS19JTlY7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWFpZjEgfD0gV004OTAwX1JFR19BVURJTzFfQkNMS19JTlY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCQljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQkJYWlmMSAmPSB+V004OTAwX1JFR19BVURJTzFfQkNMS19JTlY7CisJCQlhaWYxICY9IH5XTTg5MDBfUkVHX0FVRElPMV9MUkNMS19JTlY7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJCWFpZjEgfD0gV004OTAwX1JFR19BVURJTzFfQkNMS19JTlY7CisJCQlhaWYxIHw9IFdNODkwMF9SRUdfQVVESU8xX0xSQ0xLX0lOVjsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQkJYWlmMSB8PSBXTTg5MDBfUkVHX0FVRElPMV9CQ0xLX0lOVjsKKwkJCWFpZjEgJj0gfldNODkwMF9SRUdfQVVESU8xX0xSQ0xLX0lOVjsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQkJYWlmMSAmPSB+V004OTAwX1JFR19BVURJTzFfQkNMS19JTlY7CisJCQlhaWYxIHw9IFdNODkwMF9SRUdfQVVESU8xX0xSQ0xLX0lOVjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwgY2xvY2tpbmcxKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU8xLCBhaWYxKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU8zLCBhaWYzKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU80LCBhaWY0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODkwMF9kaWdpdGFsX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBtdXRlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IHJlZzsKKworCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0RBQ0NUUkwpOworCisJaWYgKG11dGUpCisJCXJlZyB8PSBXTTg5MDBfUkVHX0RBQ0NUUkxfTVVURTsKKwllbHNlCisJCXJlZyAmPSB+V004OTAwX1JFR19EQUNDVFJMX01VVEU7CisKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfREFDQ1RSTCwgcmVnKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdNODkwMF9SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCSAgICAgIFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfFwKKwkJICAgICAgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKKworI2RlZmluZSBXTTg5MDBfUENNX0ZPUk1BVFMgXAorCShTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSB8IFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRSB8IFwKKwkgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2RhaSB3bTg5MDBfZGFpID0geworCS5uYW1lID0gIldNODkwMCBIaUZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJIaUZpIFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg5MDBfUkFURVMsCisJCS5mb3JtYXRzID0gV004OTAwX1BDTV9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJIaUZpIENhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODkwMF9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg5MDBfUENNX0ZPUk1BVFMsCisJIH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODkwMF9od19wYXJhbXMsCisJIH0sCisJLmRhaV9vcHMgPSB7CisJCSAuc2V0X2Nsa2RpdiA9IHdtODkwMF9zZXRfZGFpX2Nsa2RpdiwKKwkJIC5zZXRfcGxsID0gd204OTAwX3NldF9kYWlfcGxsLAorCQkgLnNldF9mbXQgPSB3bTg5MDBfc2V0X2RhaV9mbXQsCisJCSAuZGlnaXRhbF9tdXRlID0gd204OTAwX2RpZ2l0YWxfbXV0ZSwKKwkgfSwKK307CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg5MDBfZGFpKTsKKworc3RhdGljIGludCB3bTg5MDBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwl1MTYgcmVnOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiBFbmFibGUgdGhlcm1hbCBzaHV0ZG93biAqLworCQlyZWcgPSB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19HUElPKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0dQSU8sCisJCQkgICAgIHJlZyB8IFdNODkwMF9SRUdfR1BJT19URU1QX0VOQSk7CisJCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FERENUTCk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19BRERDVEwsCisJCQkgICAgIHJlZyB8IFdNODkwMF9SRUdfQUREQ1RMX1RFTVBfU0QpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJLyogQ2hhcmdlIGNhcGFjaXRvcnMgaWYgaW5pdGlhbCBwb3dlciB1cCAqLworCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJLyogU1RBUlRVUF9CSUFTX0VOQSBvbiAqLworCQkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKKwkJCQkgICAgIFdNODkwMF9SRUdfUE9XRVIxX1NUQVJUVVBfQklBU19FTkEpOworCisJCQkvKiBTdGFydHVwIGJpYXMgbW9kZSAqLworCQkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0FERENUTCwKKwkJCQkgICAgIFdNODkwMF9SRUdfQUREQ1RMX0JJQVNfU1JDIHwKKwkJCQkgICAgIFdNODkwMF9SRUdfQUREQ1RMX1ZNSURfU09GVFNUKTsKKworCQkJLyogVk1JRCAyeDUwayAqLworCQkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKKwkJCQkgICAgIFdNODkwMF9SRUdfUE9XRVIxX1NUQVJUVVBfQklBU19FTkEgfCAweDEpOworCisJCQkvKiBBbGxvdyBjYXBhY2l0b3JzIHRvIGNoYXJnZSAqLworCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoNDAwKSk7CisKKwkJCS8qIEVuYWJsZSBiaWFzICovCisJCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxLAorCQkJCSAgICAgV004OTAwX1JFR19QT1dFUjFfU1RBUlRVUF9CSUFTX0VOQSB8CisJCQkJICAgICBXTTg5MDBfUkVHX1BPV0VSMV9CSUFTX0VOQSB8IDB4MSk7CisKKwkJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19BRERDVEwsIDApOworCisJCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxLAorCQkJCSAgICAgV004OTAwX1JFR19QT1dFUjFfQklBU19FTkEgfCAweDEpOworCQl9CisKKwkJcmVnID0gd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKKwkJCSAgICAgKHJlZyAmIFdNODkwMF9SRUdfUE9XRVIxX0ZMTF9FTkEpIHwKKwkJCSAgICAgV004OTAwX1JFR19QT1dFUjFfQklBU19FTkEgfCAweDEpOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIyLAorCQkJICAgICBXTTg5MDBfUkVHX1BPV0VSMl9TWVNDTEtfRU5BKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMywgMCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQkvKiBTdGFydHVwIGJpYXMgZW5hYmxlICovCisJCXJlZyA9IHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCisJCQkgICAgIHJlZyAmIFdNODkwMF9SRUdfUE9XRVIxX1NUQVJUVVBfQklBU19FTkEpOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQUREQ1RMLAorCQkJICAgICBXTTg5MDBfUkVHX0FERENUTF9CSUFTX1NSQyB8CisJCQkgICAgIFdNODkwMF9SRUdfQUREQ1RMX1ZNSURfU09GVFNUKTsKKworCQkvKiBEaXNjaGFyZ2UgY2FwcyAqLworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxLAorCQkJICAgICBXTTg5MDBfUkVHX1BPV0VSMV9TVEFSVFVQX0JJQVNfRU5BKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CisKKwkJLyogUmVtb3ZlIGNsYW1wICovCisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19IUENUTDEsIDApOworCisJCS8qIFBvd2VyIGRvd24gKi8KKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0FERENUTCwgMCk7CisJCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19QT1dFUjEsIDApOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIyLCAwKTsKKwkJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMywgMCk7CisKKwkJLyogTmVlZCB0byBsZXQgdGhpbmdzIHNldHRsZSBiZWZvcmUgc3RvcHBpbmcgdGhlIGNsb2NrCisJCSAqIHRvIGVuc3VyZSB0aGF0IHJlc3RhcnQgd29ya3MsIHNlZSAiU3RvcHBpbmcgdGhlCisJCSAqIG1hc3RlciBjbG9jayIgaW4gdGhlIGRhdGFzaGVldC4gKi8KKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMSkpOworCQl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIyLAorCQkJICAgICBXTTg5MDBfUkVHX1BPV0VSMl9TWVNDTEtfRU5BKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTAwX3ByaXYgKndtODkwMCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJaW50IGZsbF9vdXQgPSB3bTg5MDAtPmZsbF9vdXQ7CisJaW50IGZsbF9pbiAgPSB3bTg5MDAtPmZsbF9pbjsKKwlpbnQgcmV0OworCisJLyogU3RvcCB0aGUgRkxMIGluIGFuIG9yZGVybHkgZmFzaGlvbiAqLworCXJldCA9IHdtODkwMF9zZXRfZmxsKGNvZGVjLCAwLCAwLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHN0b3AgRkxMXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTg5MDAtPmZsbF9vdXQgPSBmbGxfb3V0OworCXdtODkwMC0+ZmxsX2luID0gZmxsX2luOworCisJd204OTAwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODkwMF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IHdtODkwMF9wcml2ICp3bTg5MDAgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXUxNiAqY2FjaGU7CisJaW50IGksIHJldDsKKworCWNhY2hlID0ga21lbWR1cChjb2RlYy0+cmVnX2NhY2hlLCBzaXplb2Yod204OTAwX3JlZ19kZWZhdWx0cyksCisJCQlHRlBfS0VSTkVMKTsKKworCXdtODkwMF9yZXNldChjb2RlYyk7CisJd204OTAwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisKKwkvKiBSZXN0YXJ0IHRoZSBGTEw/ICovCisJaWYgKHdtODkwMC0+ZmxsX291dCkgeworCQlpbnQgZmxsX291dCA9IHdtODkwMC0+ZmxsX291dDsKKwkJaW50IGZsbF9pbiAgPSB3bTg5MDAtPmZsbF9pbjsKKworCQl3bTg5MDAtPmZsbF9pbiA9IDA7CisJCXdtODkwMC0+ZmxsX291dCA9IDA7CisKKwkJcmV0ID0gd204OTAwX3NldF9mbGwoY29kZWMsIDAsIGZsbF9pbiwgZmxsX291dCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlc3RhcnQgRkxMXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoY2FjaGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IFdNODkwMF9NQVhSRUc7IGkrKykKKwkJCXdtODkwMF93cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOworCQlrZnJlZShjYWNoZSk7CisJfSBlbHNlCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSByZWdpc3RlciBjYWNoZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIFdNODkwMCBkcml2ZXIKKyAqIHJlZ2lzdGVyIHRoZSBtaXhlciBhbmQgZHNwIGludGVyZmFjZXMgd2l0aCB0aGUga2VybmVsCisgKi8KK3N0YXRpYyBpbnQgd204OTAwX2luaXQoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gc29jZGV2LT5jb2RlYy0+Y29udHJvbF9kYXRhOworCisJY29kZWMtPm5hbWUgPSAiV004OTAwIjsKKwljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljb2RlYy0+cmVhZCA9IHdtODkwMF9yZWFkOworCWNvZGVjLT53cml0ZSA9IHdtODkwMF93cml0ZTsKKwljb2RlYy0+ZGFpID0gJndtODkwMF9kYWk7CisJY29kZWMtPm51bV9kYWkgPSAxOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IFdNODkwMF9NQVhSRUc7CisJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAod204OTAwX3JlZ19kZWZhdWx0cywKKwkJCQkgICBzaXplb2Yod204OTAwX3JlZ19kZWZhdWx0cyksIEdGUF9LRVJORUwpOworCisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWcgPSB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19JRCk7CisJaWYgKHJlZyAhPSAweDg5MDApIHsKKwkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiRGV2aWNlIGlzIG5vdCBhIFdNODkwMCAtIElEICV4XG4iLAorCQkJcmVnKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29kZWMtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg5MDBfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBwcml2X2VycjsKKwl9CisKKwkvKiBSZWFkIGJhY2sgZnJvbSB0aGUgY2hpcCAqLworCXJlZyA9IHdtODkwMF9jaGlwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKKwlyZWcgPSAocmVnID4+IDEyKSAmIDB4ZjsKKwlkZXZfaW5mbygmaTJjX2NsaWVudC0+ZGV2LCAiV004OTAwIHJldmlzaW9uICVkXG4iLCByZWcpOworCisJd204OTAwX3Jlc2V0KGNvZGVjKTsKKworCS8qIExhdGNoIHRoZSB2b2x1bWUgdXBkYXRlIGJpdHMgKi8KKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTElOVk9MLAorCQkgICAgIHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0xJTlZPTCkgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCwKKwkJICAgICB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19SSU5WT0wpIHwgMHgxMDApOworCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19MT1VUMUNUTCwKKwkJICAgICB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19MT1VUMUNUTCkgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQxQ1RMLAorCQkgICAgIHdtODkwMF9yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQxQ1RMKSB8IDB4MTAwKTsKKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTE9VVDJDVEwsCisJCSAgICAgd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfTE9VVDJDVEwpIHwgMHgxMDApOworCXdtODkwMF93cml0ZShjb2RlYywgV004OTAwX1JFR19ST1VUMkNUTCwKKwkJICAgICB3bTg5MDBfcmVhZChjb2RlYywgV004OTAwX1JFR19ST1VUMkNUTCkgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xEQUNfRFYsCisJCSAgICAgd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfTERBQ19EVikgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JEQUNfRFYsCisJCSAgICAgd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUkRBQ19EVikgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xBRENfRFYsCisJCSAgICAgd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfTEFEQ19EVikgfCAweDEwMCk7CisJd204OTAwX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JBRENfRFYsCisJCSAgICAgd204OTAwX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUkFEQ19EVikgfCAweDEwMCk7CisKKwkvKiBTZXQgdGhlIERBQyBhbmQgbWl4ZXIgb3V0cHV0IGJpYXMgKi8KKwl3bTg5MDBfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfT1VUQklBU0NUTCwgMHg4MSk7CisKKwkvKiBSZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV3IFBDTXNcbiIpOworCQlnb3RvIHBjbV9lcnI7CisJfQorCisJLyogVHVybiB0aGUgY2hpcCBvbiAqLworCWNvZGVjLT5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09GRjsKKwl3bTg5MDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKworCXdtODkwMF9hZGRfY29udHJvbHMoY29kZWMpOworCXdtODkwMF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gY2FyZF9lcnI7CisJfQorCXJldHVybiByZXQ7CisKK2NhcmRfZXJyOgorCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKK3BjbV9lcnI6CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7Citwcml2X2VycjoKKwlrZnJlZShjb2RlYy0+cHJpdmF0ZV9kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlICp3bTg5MDBfc29jZGV2OworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg5MDBfaTJjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKKy8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKKyAgIGFyb3VuZCAqLworc3RhdGljIGludCB3bTg5MDBfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg5MDBfc29jZGV2OworCXN0cnVjdCB3bTg5MDBfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCWludCByZXQ7CisKKwlpZiAoYWRkciAhPSBzZXR1cC0+aTJjX2FkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2VycigmYWRhcC0+ZGV2LCAiUHJvYmUgb24gJXhcbiIsIGFkZHIpOworCisJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKKworCWkyYyA9IGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChpMmMgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKKworCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmYWRhcC0+ZGV2LAorCQkJImZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwgYWRkcik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHdtODkwMF9pbml0KHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmYWRhcC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004OTAwXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODkwMF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODkwMF9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODkwMF9jb2RlY19wcm9iZSk7Cit9CisKKy8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204OTAwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004OTAwIEkyQyBjb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmF0dGFjaF9hZGFwdGVyID0gd204OTAwX2kyY19hdHRhY2gsCisJLmRldGFjaF9jbGllbnQgPSAgd204OTAwX2kyY19kZXRhY2gsCisJLmNvbW1hbmQgPSAgICAgICAgTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAgICJXTTg5MDAiLAorCS5kcml2ZXIgPSAmd204OTAwX2kyY19kcml2ZXIsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgd204OTAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204OTAwX3NldHVwX2RhdGEgKnNldHVwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJXTTg5MDAgQXVkaW8gQ29kZWNcbiIpOworCisJc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwlzb2NkZXYtPmNvZGVjID0gY29kZWM7CisKKwljb2RlYy0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg5MDBfc2V0X2JpYXNfbGV2ZWw7CisKKwl3bTg5MDBfc29jZGV2ID0gc29jZGV2OworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7CisJCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKKwkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODkwMF9pMmNfZHJpdmVyKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCX0KKyNlbHNlCisjZXJyb3IgTm9uLUkyQyBpbnRlcmZhY2VzIG5vdCB5ZXQgc3VwcG9ydGVkCisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgd204OTAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKQorCQl3bTg5MDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfZGVsX2RyaXZlcigmd204OTAwX2kyY19kcml2ZXIpOworI2VuZGlmCisJa2ZyZWUoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODkwMCA9IHsKKwkucHJvYmUgPSAJd204OTAwX3Byb2JlLAorCS5yZW1vdmUgPSAJd204OTAwX3JlbW92ZSwKKwkuc3VzcGVuZCA9IAl3bTg5MDBfc3VzcGVuZCwKKwkucmVzdW1lID0Jd204OTAwX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtODkwMCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg5MDAgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZm9ubWljcm8uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NTBkOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIHdtODkwMC5oICAtLSAgV004OTAgU29jIEF1ZGlvIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfV004OTAwX0gKKyNkZWZpbmUgX1dNODkwMF9ICisKKyNkZWZpbmUgV004OTAwX0ZMTCAxCisKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWICAgMQorI2RlZmluZSBXTTg5MDBfQURDX0NMS0RJViAyCisjZGVmaW5lIFdNODkwMF9EQUNfQ0xLRElWIDMKKyNkZWZpbmUgV004OTAwX0FEQ19MUkNMSyAgNAorI2RlZmluZSBXTTg5MDBfREFDX0xSQ0xLICA1CisjZGVmaW5lIFdNODkwMF9PUENMS19ESVYgIDYKKyNkZWZpbmUgV004OTAwX0xSQ0xLX01PREUgNworCisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl8xICAgMHgwMAorI2RlZmluZSBXTTg5MDBfQkNMS19ESVZfMV81IDB4MDIKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWXzIgICAweDA0CisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl8zICAgMHgwNgorI2RlZmluZSBXTTg5MDBfQkNMS19ESVZfNCAgIDB4MDgKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWXzVfNSAweDBhCisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl82ICAgMHgwYworI2RlZmluZSBXTTg5MDBfQkNMS19ESVZfOCAgIDB4MGUKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWXzExICAweDEwCisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl8xMiAgMHgxMgorI2RlZmluZSBXTTg5MDBfQkNMS19ESVZfMTYgIDB4MTQKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWXzIyICAweDE2CisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl8yNCAgMHgxOAorI2RlZmluZSBXTTg5MDBfQkNMS19ESVZfMzIgIDB4MWEKKyNkZWZpbmUgV004OTAwX0JDTEtfRElWXzQ0ICAweDFjCisjZGVmaW5lIFdNODkwMF9CQ0xLX0RJVl80OCAgMHgxZQorCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzEgICAweDAwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzFfNSAweDIwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzIgICAweDQwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzMgICAweDYwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzQgICAweDgwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzVfNSAweGEwCisjZGVmaW5lIFdNODkwMF9BRENfQ0xLRElWXzYgICAweGMwCisKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfMSAgIDB4MDAKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfMV81IDB4MDQKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfMiAgIDB4MDgKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfMyAgIDB4MGMKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfNCAgIDB4MTAKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfNV81IDB4MTQKKyNkZWZpbmUgV004OTAwX0RBQ19DTEtESVZfNiAgIDB4MTgKKworI2RlZmluZSBXTTg5MDBfCisKK3N0cnVjdCB3bTg5MDBfc2V0dXBfZGF0YSB7CisJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7Cit9OworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfZGFpIHdtODkwMF9kYWk7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204OTAwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCkBAIC0wLDAgKzEsMTgxMyBAQAorLyoKKyAqIHdtODkwMy5jICAtLSAgV004OTAzIEFMU0EgU29DIEF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUT0RPOgorICogIC0gVERNIG1vZGUgY29uZmlndXJhdGlvbi4KKyAqICAtIE1pYyBkZXRlY3QuCisgKiAgLSBEaWdpdGFsIG1pY3JvcGhvbmUgc3VwcG9ydC4KKyAqICAtIEludGVycnVwdCBzdXBwb3J0IChtaWMgZGV0ZWN0IGFuZCBzZXF1ZW5jZXIpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgIndtODkwMy5oIgorCitzdHJ1Y3Qgd204OTAzX3ByaXYgeworCWludCBzeXNjbGs7CisKKwkvKiBSZWZlcmVuY2UgY291bnRzICovCisJaW50IGNoYXJnZV9wdW1wX3VzZXJzOworCWludCBjbGFzc193X3VzZXJzOworCWludCBwbGF5YmFja19hY3RpdmU7CisJaW50IGNhcHR1cmVfYWN0aXZlOworCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICptYXN0ZXJfc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2xhdmVfc3Vic3RyZWFtOworfTsKKworLyogUmVnaXN0ZXIgZGVmYXVsdHMgYXQgcmVzZXQgKi8KK3N0YXRpYyB1MTYgd204OTAzX3JlZ19kZWZhdWx0c1tdID0geworCTB4ODkwMywgICAgIC8qIFIwICAgLSBTVyBSZXNldCBhbmQgSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gUmV2aXNpb24gTnVtYmVyICovCisJMHgwMDAwLCAgICAgLyogUjIgKi8KKwkweDAwMDAsICAgICAvKiBSMyAqLworCTB4MDAxOCwgICAgIC8qIFI0ICAgLSBCaWFzIENvbnRyb2wgMCAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAgLSBWTUlEIENvbnRyb2wgMCAqLworCTB4MDAwMCwgICAgIC8qIFI2ICAgLSBNaWMgQmlhcyBDb250cm9sIDAgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4MDAwMSwgICAgIC8qIFI4ICAgLSBBbmFsb2d1ZSBEQUMgMCAqLworCTB4MDAwMCwgICAgIC8qIFI5ICovCisJMHgwMDAxLCAgICAgLyogUjEwICAtIEFuYWxvZ3VlIEFEQyAwICovCisJMHgwMDAwLCAgICAgLyogUjExICovCisJMHgwMDAwLCAgICAgLyogUjEyICAtIFBvd2VyIE1hbmFnZW1lbnQgMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBNYW5hZ2VtZW50IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQgIC0gUG93ZXIgTWFuYWdlbWVudCAyICovCisJMHgwMDAwLCAgICAgLyogUjE1ICAtIFBvd2VyIE1hbmFnZW1lbnQgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBQb3dlciBNYW5hZ2VtZW50IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTcgIC0gUG93ZXIgTWFuYWdlbWVudCA1ICovCisJMHgwMDAwLCAgICAgLyogUjE4ICAtIFBvd2VyIE1hbmFnZW1lbnQgNiAqLworCTB4MDAwMCwgICAgIC8qIFIxOSAqLworCTB4MDQwMCwgICAgIC8qIFIyMCAgLSBDbG9jayBSYXRlcyAwICovCisJMHgwRDA3LCAgICAgLyogUjIxICAtIENsb2NrIFJhdGVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIgIC0gQ2xvY2sgUmF0ZXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMyAqLworCTB4MDA1MCwgICAgIC8qIFIyNCAgLSBBdWRpbyBJbnRlcmZhY2UgMCAqLworCTB4MDI0MiwgICAgIC8qIFIyNSAgLSBBdWRpbyBJbnRlcmZhY2UgMSAqLworCTB4MDAwOCwgICAgIC8qIFIyNiAgLSBBdWRpbyBJbnRlcmZhY2UgMiAqLworCTB4MDAyMiwgICAgIC8qIFIyNyAgLSBBdWRpbyBJbnRlcmZhY2UgMyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAqLworCTB4MDBDMCwgICAgIC8qIFIzMCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTGVmdCAqLworCTB4MDBDMCwgICAgIC8qIFIzMSAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUmlnaHQgKi8KKwkweDAwMDAsICAgICAvKiBSMzIgIC0gREFDIERpZ2l0YWwgMCAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBEQUMgRGlnaXRhbCAxICovCisJMHgwMDAwLCAgICAgLyogUjM0ICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMEMwLCAgICAgLyogUjM2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMZWZ0ICovCisJMHgwMEMwLCAgICAgLyogUjM3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSaWdodCAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBBREMgRGlnaXRhbCAwICovCisJMHgwMDczLCAgICAgLyogUjM5ICAtIERpZ2l0YWwgTWljcm9waG9uZSAwICovCisJMHgwOUJGLCAgICAgLyogUjQwICAtIERSQyAwICovCisJMHgzMjQxLCAgICAgLyogUjQxICAtIERSQyAxICovCisJMHgwMDIwLCAgICAgLyogUjQyICAtIERSQyAyICovCisJMHgwMDAwLCAgICAgLyogUjQzICAtIERSQyAzICovCisJMHgwMDg1LCAgICAgLyogUjQ0ICAtIEFuYWxvZ3VlIExlZnQgSW5wdXQgMCAqLworCTB4MDA4NSwgICAgIC8qIFI0NSAgLSBBbmFsb2d1ZSBSaWdodCBJbnB1dCAwICovCisJMHgwMDQ0LCAgICAgLyogUjQ2ICAtIEFuYWxvZ3VlIExlZnQgSW5wdXQgMSAqLworCTB4MDA0NCwgICAgIC8qIFI0NyAgLSBBbmFsb2d1ZSBSaWdodCBJbnB1dCAxICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMDA4LCAgICAgLyogUjUwICAtIEFuYWxvZ3VlIExlZnQgTWl4IDAgKi8KKwkweDAwMDQsICAgICAvKiBSNTEgIC0gQW5hbG9ndWUgUmlnaHQgTWl4IDAgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgIC0gQW5hbG9ndWUgU3BrIE1peCBMZWZ0IDAgKi8KKwkweDAwMDAsICAgICAvKiBSNTMgIC0gQW5hbG9ndWUgU3BrIE1peCBMZWZ0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gQW5hbG9ndWUgU3BrIE1peCBSaWdodCAwICovCisJMHgwMDAwLCAgICAgLyogUjU1ICAtIEFuYWxvZ3VlIFNwayBNaXggUmlnaHQgMSAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAqLworCTB4MDAyRCwgICAgIC8qIFI1NyAgLSBBbmFsb2d1ZSBPVVQxIExlZnQgKi8KKwkweDAwMkQsICAgICAvKiBSNTggIC0gQW5hbG9ndWUgT1VUMSBSaWdodCAqLworCTB4MDAzOSwgICAgIC8qIFI1OSAgLSBBbmFsb2d1ZSBPVVQyIExlZnQgKi8KKwkweDAwMzksICAgICAvKiBSNjAgIC0gQW5hbG9ndWUgT1VUMiBSaWdodCAqLworCTB4MDEwMCwgICAgIC8qIFI2MSAqLworCTB4MDEzOSwgICAgIC8qIFI2MiAgLSBBbmFsb2d1ZSBPVVQzIExlZnQgKi8KKwkweDAxMzksICAgICAvKiBSNjMgIC0gQW5hbG9ndWUgT1VUMyBSaWdodCAqLworCTB4MDAwMCwgICAgIC8qIFI2NCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAgLSBBbmFsb2d1ZSBTUEsgT3V0cHV0IENvbnRyb2wgMCAqLworCTB4MDAwMCwgICAgIC8qIFI2NiAqLworCTB4MDAxMCwgICAgIC8qIFI2NyAgLSBEQyBTZXJ2byAwICovCisJMHgwMTAwLCAgICAgLyogUjY4ICovCisJMHgwMEE0LCAgICAgLyogUjY5ICAtIERDIFNlcnZvIDIgKi8KKwkweDA4MDcsICAgICAvKiBSNzAgKi8KKwkweDAwMDAsICAgICAvKiBSNzEgKi8KKwkweDAwMDAsICAgICAvKiBSNzIgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgKi8KKwkweDAwMDAsICAgICAvKiBSNzggKi8KKwkweDAwMEUsICAgICAvKiBSNzkgKi8KKwkweDAwMDAsICAgICAvKiBSODAgKi8KKwkweDAwMDAsICAgICAvKiBSODEgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDYsICAgICAvKiBSODcgKi8KKwkweDAwMDAsICAgICAvKiBSODggKi8KKwkweDAwMDAsICAgICAvKiBSODkgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgIC0gQW5hbG9ndWUgSFAgMCAqLworCTB4MDA2MCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAqLworCTB4MDAwMCwgICAgIC8qIFI5MyAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAgLSBBbmFsb2d1ZSBMaW5lb3V0IDAgKi8KKwkweDAwNjAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgKi8KKwkweDAwMDAsICAgICAvKiBSOTggIC0gQ2hhcmdlIFB1bXAgMCAqLworCTB4MUYyNSwgICAgIC8qIFI5OSAqLworCTB4MkIxOSwgICAgIC8qIFIxMDAgKi8KKwkweDAxQzAsICAgICAvKiBSMTAxICovCisJMHgwMUVGLCAgICAgLyogUjEwMiAqLworCTB4MkIwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTA0IC0gQ2xhc3MgVyAwICovCisJMHgwMUMwLCAgICAgLyogUjEwNSAqLworCTB4MUMxMCwgICAgIC8qIFIxMDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTA3ICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAtIFdyaXRlIFNlcXVlbmNlciAwICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAtIFdyaXRlIFNlcXVlbmNlciAxICovCisJMHgwMDAwLCAgICAgLyogUjExMCAtIFdyaXRlIFNlcXVlbmNlciAyICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIFdyaXRlIFNlcXVlbmNlciAzICovCisJMHgwMDAwLCAgICAgLyogUjExMiAtIFdyaXRlIFNlcXVlbmNlciA0ICovCisJMHgwMDAwLCAgICAgLyogUjExMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTQgLSBDb250cm9sIEludGVyZmFjZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTUgKi8KKwkweDAwQTgsICAgICAvKiBSMTE2IC0gR1BJTyBDb250cm9sIDEgKi8KKwkweDAwQTgsICAgICAvKiBSMTE3IC0gR1BJTyBDb250cm9sIDIgKi8KKwkweDAwQTgsICAgICAvKiBSMTE4IC0gR1BJTyBDb250cm9sIDMgKi8KKwkweDAyMjAsICAgICAvKiBSMTE5IC0gR1BJTyBDb250cm9sIDQgKi8KKwkweDAxQTAsICAgICAvKiBSMTIwIC0gR1BJTyBDb250cm9sIDUgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHhGRkZGLCAgICAgLyogUjEyMiAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAtIEludGVycnVwdCBQb2xhcml0eSAxICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMywgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2IC0gSW50ZXJydXB0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgwMDA1LCAgICAgLyogUjEyOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBDb250cm9sIEludGVyZmFjZSBUZXN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzICovCisJMHgwMDAwLCAgICAgLyogUjEzNCAqLworCTB4MDNGRiwgICAgIC8qIFIxMzUgKi8KKwkweDAwMDcsICAgICAvKiBSMTM2ICovCisJMHgwMDQwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgwMDAwLCAgICAgLyogUjE0MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQyICovCisJMHgwMDAwLCAgICAgLyogUjE0MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ1ICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDQwMDAsICAgICAvKiBSMTQ4ICovCisJMHg2ODEwLCAgICAgLyogUjE0OSAtIENoYXJnZSBQdW1wIFRlc3QgMSAqLworCTB4MDAwNCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHgwMDAwLCAgICAgLyogUjE1MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0ICovCisJMHgwMDAwLCAgICAgLyogUjE1NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3ICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzICovCisJMHgwMDI4LCAgICAgLyogUjE2NCAtIENsb2NrIFJhdGUgVGVzdCA0ICovCisJMHgwMDA0LCAgICAgLyogUjE2NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgKi8KKwkweDAwNjAsICAgICAvKiBSMTY3ICovCisJMHgwMDAwLCAgICAgLyogUjE2OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjkgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBBbmFsb2d1ZSBPdXRwdXQgQmlhcyAwICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHdtODkwM19yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJCQkgdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCUJVR19PTihyZWcgPj0gQVJSQVlfU0laRSh3bTg5MDNfcmVnX2RlZmF1bHRzKSk7CisKKwlyZXR1cm4gY2FjaGVbcmVnXTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB3bTg5MDNfaHdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCXUxNiBkYXRhOworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisKKwkvKiBXcml0ZSByZWdpc3RlciAqLworCXhmZXJbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwl4ZmVyWzBdLmZsYWdzID0gMDsKKwl4ZmVyWzBdLmxlbiA9IDE7CisJeGZlclswXS5idWYgPSAmcmVnOworCisJLyogUmVhZCBkYXRhICovCisJeGZlclsxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwl4ZmVyWzFdLmxlbiA9IDI7CisJeGZlclsxXS5idWYgPSAodTggKikmZGF0YTsKKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIHhmZXIsIDIpOworCWlmIChyZXQgIT0gMikgeworCQlwcl9lcnIoImkyY190cmFuc2ZlciByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIChkYXRhID4+IDgpIHwgKChkYXRhICYgMHhmZikgPDwgOCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd204OTAzX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCXVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFdNODkwM19TV19SRVNFVF9BTkRfSUQ6CisJY2FzZSBXTTg5MDNfUkVWSVNJT05fTlVNQkVSOgorCWNhc2UgV004OTAzX0lOVEVSUlVQVF9TVEFUVVNfMToKKwljYXNlIFdNODkwM19XUklURV9TRVFVRU5DRVJfNDoKKwkJcmV0dXJuIHdtODkwM19od19yZWFkKGNvZGVjLCByZWcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIHdtODkwM19yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdtODkwM193cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIHUxNiByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCUJVR19PTihyZWcgPj0gQVJSQVlfU0laRSh3bTg5MDNfcmVnX2RlZmF1bHRzKSk7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTAzX1NXX1JFU0VUX0FORF9JRDoKKwljYXNlIFdNODkwM19SRVZJU0lPTl9OVU1CRVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJY2FjaGVbcmVnXSA9IHZhbHVlOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzNdOworCisJd204OTAzX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7CisKKwkvKiBEYXRhIGZvcm1hdCBpcyAxIGJ5dGUgb2YgYWRkcmVzcyBmb2xsb3dlZCBieSAyIGJ5dGVzIG9mIGRhdGEgKi8KKwlkYXRhWzBdID0gcmVnOworCWRhdGFbMV0gPSAodmFsdWUgPj4gOCkgJiAweGZmOworCWRhdGFbMl0gPSB2YWx1ZSAmIDB4ZmY7CisKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDMpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX3J1bl9zZXF1ZW5jZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKwl1MTYgcmVnWzVdOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCisJQlVHX09OKHN0YXJ0ID4gNDgpOworCisJLyogRW5hYmxlIHRoZSBzZXF1ZW5jZXIgKi8KKwlyZWdbMF0gPSB3bTg5MDNfcmVhZChjb2RlYywgV004OTAzX1dSSVRFX1NFUVVFTkNFUl8wKTsKKwlyZWdbMF0gfD0gV004OTAzX1dTRVFfRU5BOworCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX1dSSVRFX1NFUVVFTkNFUl8wLCByZWdbMF0pOworCisJZGV2X2RiZygmaTJjLT5kZXYsICJTdGFydGluZyBzZXF1ZW5jZSBhdCAlZFxuIiwgc3RhcnQpOworCisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzMsCisJCSAgICAgc3RhcnQgfCBXTTg5MDNfV1NFUV9TVEFSVCk7CisKKwkvKiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZS4gIElmIHdlIGhhdmUgdGhlIGludGVycnVwdCB3aXJlZCB1cCB0aGVuCisJICogd2UgY291bGQgYmxvY2sgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LCB0aG91Z2ggcG9sbGluZyBtYXkgc3RpbGwKKwkgKiBiZSBkZXNpcmFibGUgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCisJICovCisJZG8geworCQltc2xlZXAoMTApOworCisJCXJlZ1s0XSA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzQpOworCX0gd2hpbGUgKHJlZ1s0XSAmIFdNODkwM19XU0VRX0JVU1kpOworCisJZGV2X2RiZygmaTJjLT5kZXYsICJTZXF1ZW5jZSBjb21wbGV0ZVxuIik7CisKKwkvKiBEaXNhYmxlIHRoZSBzZXF1ZW5jZXIgYWdhaW4gKi8KKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19XUklURV9TRVFVRU5DRVJfMCwKKwkJICAgICByZWdbMF0gJiB+V004OTAzX1dTRVFfRU5BKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTg5MDNfc3luY19yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1MTYgKmNhY2hlKQoreworCWludCBpOworCisJLyogVGhlcmUgcmVhbGx5IG91Z2h0IHRvIGJlIHNvbWV0aGluZyBiZXR0ZXIgd2UgY2FuIGRvIGhlcmUgOi8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5MDNfcmVnX2RlZmF1bHRzKTsgaSsrKQorCQljYWNoZVtpXSA9IHdtODkwM19od19yZWFkKGNvZGVjLCBpKTsKK30KKworc3RhdGljIHZvaWQgd204OTAzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19TV19SRVNFVF9BTkRfSUQsIDApOworfQorCisjZGVmaW5lIFdNODkwM19PVVRQVVRfU0hPUlQgMHg4CisjZGVmaW5lIFdNODkwM19PVVRQVVRfT1VUICAgMHg0CisjZGVmaW5lIFdNODkwM19PVVRQVVRfSU5UICAgMHgyCisjZGVmaW5lIFdNODkwM19PVVRQVVRfSU4gICAgMHgxCisKKy8qCisgKiBFdmVudCBmb3IgaGVhZHBob25lIGFuZCBsaW5lIG91dCBhbXBsaWZpZXIgcG93ZXIgY2hhbmdlcy4gIFNwZWNpYWwKKyAqIHBvd2VyIHVwL2Rvd24gc2VxdWVuY2VzIGFyZSByZXF1aXJlZCBpbiBvcmRlciB0byBtYXhpbWlzZSBwb3AvY2xpY2sKKyAqIHBlcmZvcm1hbmNlLgorICovCitzdGF0aWMgaW50IHdtODkwM19vdXRwdXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJdTE2IHZhbDsKKwl1MTYgcmVnOworCWludCBzaGlmdDsKKwl1MTYgY3BfcmVnID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19DSEFSR0VfUFVNUF8wKTsKKworCXN3aXRjaCAody0+cmVnKSB7CisJY2FzZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8yOgorCQlyZWcgPSBXTTg5MDNfQU5BTE9HVUVfSFBfMDsKKwkJYnJlYWs7CisJY2FzZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8zOgorCQlyZWcgPSBXTTg5MDNfQU5BTE9HVUVfTElORU9VVF8wOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJY2FzZSAwOgorCQlzaGlmdCA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2hpZnQgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAoZXZlbnQgJiBTTkRfU09DX0RBUE1fUFJFX1BNVSkgeworCQl2YWwgPSB3bTg5MDNfcmVhZChjb2RlYywgcmVnKTsKKworCQkvKiBTaG9ydCB0aGUgb3V0cHV0ICovCisJCXZhbCAmPSB+KFdNODkwM19PVVRQVVRfU0hPUlQgPDwgc2hpZnQpOworCQl3bTg5MDNfd3JpdGUoY29kZWMsIHJlZywgdmFsKTsKKworCQl3bTg5MDMtPmNoYXJnZV9wdW1wX3VzZXJzKys7CisKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJDaGFyZ2UgcHVtcCB1c2UgY291bnQgbm93ICVkXG4iLAorCQkJd204OTAzLT5jaGFyZ2VfcHVtcF91c2Vycyk7CisKKwkJaWYgKHdtODkwMy0+Y2hhcmdlX3B1bXBfdXNlcnMgPT0gMSkgeworCQkJZGV2X2RiZygmaTJjLT5kZXYsICJFbmFibGluZyBjaGFyZ2UgcHVtcFxuIik7CisJCQl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19DSEFSR0VfUFVNUF8wLAorCQkJCSAgICAgY3BfcmVnIHwgV004OTAzX0NQX0VOQSk7CisJCQltZGVsYXkoNCk7CisJCX0KKwl9CisKKwlpZiAoZXZlbnQgJiBTTkRfU09DX0RBUE1fUE9TVF9QTVUpIHsKKwkJdmFsID0gd204OTAzX3JlYWQoY29kZWMsIHJlZyk7CisKKwkJdmFsIHw9IChXTTg5MDNfT1VUUFVUX0lOIDw8IHNoaWZ0KTsKKwkJd204OTAzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisKKwkJdmFsIHw9IChXTTg5MDNfT1VUUFVUX0lOVCA8PCBzaGlmdCk7CisJCXdtODkwM193cml0ZShjb2RlYywgcmVnLCB2YWwpOworCisJCS8qIFR1cm4gb24gdGhlIG91dHB1dCBFTkFfT1VUUCAqLworCQl2YWwgfD0gKFdNODkwM19PVVRQVVRfT1VUIDw8IHNoaWZ0KTsKKwkJd204OTAzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisKKwkJLyogUmVtb3ZlIHRoZSBzaG9ydCAqLworCQl2YWwgfD0gKFdNODkwM19PVVRQVVRfU0hPUlQgPDwgc2hpZnQpOworCQl3bTg5MDNfd3JpdGUoY29kZWMsIHJlZywgdmFsKTsKKwl9CisKKwlpZiAoZXZlbnQgJiBTTkRfU09DX0RBUE1fUFJFX1BNRCkgeworCQl2YWwgPSB3bTg5MDNfcmVhZChjb2RlYywgcmVnKTsKKworCQkvKiBTaG9ydCB0aGUgb3V0cHV0ICovCisJCXZhbCAmPSB+KFdNODkwM19PVVRQVVRfU0hPUlQgPDwgc2hpZnQpOworCQl3bTg5MDNfd3JpdGUoY29kZWMsIHJlZywgdmFsKTsKKworCQkvKiBUaGVuIGRpc2FibGUgdGhlIGludGVybWVkaWF0ZSBhbmQgb3V0cHV0IHN0YWdlcyAqLworCQl2YWwgJj0gfigoV004OTAzX09VVFBVVF9PVVQgfCBXTTg5MDNfT1VUUFVUX0lOVCB8CisJCQkgIFdNODkwM19PVVRQVVRfSU4pIDw8IHNoaWZ0KTsKKwkJd204OTAzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisJfQorCisJaWYgKGV2ZW50ICYgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSB7CisJCXdtODkwMy0+Y2hhcmdlX3B1bXBfdXNlcnMtLTsKKworCQlkZXZfZGJnKCZpMmMtPmRldiwgIkNoYXJnZSBwdW1wIHVzZSBjb3VudCBub3cgJWRcbiIsCisJCQl3bTg5MDMtPmNoYXJnZV9wdW1wX3VzZXJzKTsKKworCQlpZiAod204OTAzLT5jaGFyZ2VfcHVtcF91c2VycyA9PSAwKSB7CisJCQlkZXZfZGJnKCZpMmMtPmRldiwgIkRpc2FibGluZyBjaGFyZ2UgcHVtcFxuIik7CisJCQl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19DSEFSR0VfUFVNUF8wLAorCQkJCSAgICAgY3BfcmVnICYgfldNODkwM19DUF9FTkEpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaGVuIHVzZWQgd2l0aCBEQUMgb3V0cHV0cyBvbmx5IHRoZSBXTTg5MDMgY2hhcmdlIHB1bXAgc3VwcG9ydHMKKyAqIG9wZXJhdGlvbiBpbiBjbGFzcyBXIG1vZGUsIHByb3ZpZGluZyB2ZXJ5IGxvdyBwb3dlciBjb25zdW1wdGlvbgorICogd2hlbiB1c2VkIHdpdGggZGlnaXRhbCBzb3VyY2VzLiAgRW5hYmxlIGFuZCBkaXNhYmxlIHRoaXMgbW9kZQorICogYXV0b21hdGljYWxseSBkZXBlbmRpbmcgb24gdGhlIG1peGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogQWxsIHRoZSByZWxldmFudCBjb250cm9scyBhcmUgc2ltcGxlIHN3aXRjaGVzLgorICovCitzdGF0aWMgaW50IHdtODkwM19jbGFzc193X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gd2lkZ2V0LT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJdTE2IHJlZzsKKwlpbnQgcmV0OworCisJcmVnID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19DTEFTU19XXzApOworCisJLyogVHVybiBpdCBvZmYgaWYgd2UncmUgYWJvdXQgdG8gZW5hYmxlIGJ5cGFzcyAqLworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQlpZiAod204OTAzLT5jbGFzc193X3VzZXJzID09IDApIHsKKwkJCWRldl9kYmcoJmkyYy0+ZGV2LCAiRGlzYWJsaW5nIENsYXNzIFdcbiIpOworCQkJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0xBU1NfV18wLCByZWcgJgorCQkJCSAgICAgfihXTTg5MDNfQ1BfRFlOX0ZSRVEgfCBXTTg5MDNfQ1BfRFlOX1YpKTsKKwkJfQorCQl3bTg5MDMtPmNsYXNzX3dfdXNlcnMrKzsKKwl9CisKKwkvKiBJbXBsZW1lbnQgdGhlIGNoYW5nZSAqLworCXJldCA9IHNuZF9zb2NfZGFwbV9wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKKworCS8qIElmIHdlJ3ZlIGp1c3QgZGlzYWJsZWQgdGhlIGxhc3QgYnlwYXNzIHBhdGggdHVybiBDbGFzcyBXIG9uICovCisJaWYgKCF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQlpZiAod204OTAzLT5jbGFzc193X3VzZXJzID09IDEpIHsKKwkJCWRldl9kYmcoJmkyYy0+ZGV2LCAiRW5hYmxpbmcgQ2xhc3MgV1xuIik7CisJCQl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19DTEFTU19XXzAsIHJlZyB8CisJCQkJICAgICBXTTg5MDNfQ1BfRFlOX0ZSRVEgfCBXTTg5MDNfQ1BfRFlOX1YpOworCQl9CisJCXdtODkwMy0+Y2xhc3Nfd191c2Vycy0tOworCX0KKworCWRldl9kYmcoJmkyYy0+ZGV2LCAiQnlwYXNzIHVzZSBjb3VudCBub3cgJWRcbiIsCisJCXdtODkwMy0+Y2xhc3Nfd191c2Vycyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNPQ19EQVBNX1NJTkdMRV9XKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdm9sc3csIC5wdXQgPSB3bTg5MDNfY2xhc3Nfd19wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICBTT0NfU0lOR0xFX1ZBTFVFKHJlZywgc2hpZnQsIG1heCwgaW52ZXJ0KSB9CisKKworLyogQUxTQSBjYW4gb25seSBkbyBzdGVwcyBvZiAuMDFkQiAqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtNzIwMCwgNzUsIDEpOworCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X3RsdiwgLTU3MDAsIDEwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkcmNfdGx2X3RocmVzaCwgMCwgNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRyY190bHZfYW1wLCAtMjI1MCwgNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRyY190bHZfbWluLCAwLCA2MDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRyY190bHZfbWF4LCAxMjAwLCA2MDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRyY190bHZfc3RhcnR1cCwgLTMwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqZHJjX3Nsb3BlX3RleHRbXSA9IHsKKwkiMSIsICIxLzIiLCAiMS80IiwgIjEvOCIsICIxLzE2IiwgIjAiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbG9wZV9yMCA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMiwgMywgNiwgZHJjX3Nsb3BlX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbG9wZV9yMSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMiwgMCwgNiwgZHJjX3Nsb3BlX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqZHJjX2F0dGFja190ZXh0W10gPSB7CisJImluc3RhbnRhbmVvdXMiLAorCSIzNjN1cyIsICI3NjJ1cyIsICIxLjQ1bXMiLCAiMi45bXMiLCAiNS44bXMiLCAiMTEuNm1zIiwgIjIzLjJtcyIsCisJIjQ2LjRtcyIsICI5Mi44bXMiLCAiMTg1LjZtcyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2F0dGFjayA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19EUkNfMSwgMTIsIDExLCBkcmNfYXR0YWNrX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqZHJjX2RlY2F5X3RleHRbXSA9IHsKKwkiMTg2bXMiLCAiMzcybXMiLCAiNzQzbXMiLCAiMS40OXMiLCAiMi45N3MiLCAiNS45NHMiLCAiMTEuODlzIiwKKwkiMjMuODdzIiwgIjQ3LjU2cyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHJjX2RlY2F5ID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RSQ18xLCA4LCA5LCBkcmNfZGVjYXlfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkcmNfZmZfZGVsYXlfdGV4dFtdID0geworCSI1IHNhbXBsZXMiLCAiOSBzYW1wbGVzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfZmZfZGVsYXkgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzAsIDUsIDIsIGRyY19mZl9kZWxheV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRyY19xcl9kZWNheV90ZXh0W10gPSB7CisJIjAuNzI1bXMiLCAiMS40NW1zIiwgIjUuOG1zIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkcmNfcXJfZGVjYXkgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzEsIDQsIDMsIGRyY19xcl9kZWNheV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbW9vdGhpbmdfdGV4dFtdID0geworCSJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRyY19zbW9vdGhpbmcgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfRFJDXzAsIDExLCAzLCBkcmNfc21vb3RoaW5nX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqc29mdF9tdXRlX3RleHRbXSA9IHsKKwkiRmFzdCAoZnMvMikiLCAiU2xvdyAoZnMvMzIpIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzb2Z0X211dGUgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgMTAsIDIsIHNvZnRfbXV0ZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm11dGVfbW9kZV90ZXh0W10gPSB7CisJIkhhcmQiLCAiU29mdCIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXV0ZV9tb2RlID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDksIDIsIG11dGVfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRhY19kZWVtcGhhc2lzX3RleHRbXSA9IHsKKwkiRGlzYWJsZWQiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waGFzaXMgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgMSwgNCwgZGFjX2RlZW1waGFzaXNfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb21wYW5kaW5nX3RleHRbXSA9IHsKKwkidWxhdyIsICJhbGF3IgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfY29tcGFuZGluZyA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMCwgMiwgY29tcGFuZGluZ190ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfY29tcGFuZGluZyA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMiwgMiwgY29tcGFuZGluZ190ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0X21vZGVfdGV4dFtdID0geworCSJTaW5nbGUtRW5kZWQiLCAiRGlmZmVyZW50aWFsIExpbmUiLCAiRGlmZmVyZW50aWFsIE1pYyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlucHV0X21vZGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDAsIDMsIGlucHV0X21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmlucHV0X21vZGVfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLCAwLCAzLCBpbnB1dF9tb2RlX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqbGlucHV0X211eF90ZXh0W10gPSB7CisJIklOMUwiLCAiSU4yTCIsICJJTjNMIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsaW5wdXRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODkwM19BTkFMT0dVRV9MRUZUX0lOUFVUXzEsIDIsIDMsIGxpbnB1dF9tdXhfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbGlucHV0X2ludl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FOQUxPR1VFX0xFRlRfSU5QVVRfMSwgNCwgMywgbGlucHV0X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJpbnB1dF9tdXhfdGV4dFtdID0geworCSJJTjFSIiwgIklOMlIiLCAiSU4zUiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmlucHV0X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgMiwgMywgcmlucHV0X211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByaW5wdXRfaW52X2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSwgNCwgMywgcmlucHV0X211eF90ZXh0KTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTAzX3NuZF9jb250cm9sc1tdID0geworCisvKiBJbnB1dCBQR0FzIC0gTm8gVExWIHNpbmNlIHRoZSBzY2FsZSBkZXBlbmRzIG9uIFBHQSBtb2RlICovCitTT0NfU0lOR0xFKCJMZWZ0IElucHV0IFBHQSBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8wLAorCSAgIDcsIDEsIDEpLAorU09DX1NJTkdMRSgiTGVmdCBJbnB1dCBQR0EgVm9sdW1lIiwgV004OTAzX0FOQUxPR1VFX0xFRlRfSU5QVVRfMCwKKwkgICAwLCAzMSwgMCksCitTT0NfU0lOR0xFKCJMZWZ0IElucHV0IFBHQSBDb21tb24gTW9kZSBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xLAorCSAgIDYsIDEsIDApLAorCitTT0NfU0lOR0xFKCJSaWdodCBJbnB1dCBQR0EgU3dpdGNoIiwgV004OTAzX0FOQUxPR1VFX1JJR0hUX0lOUFVUXzAsCisJICAgNywgMSwgMSksCitTT0NfU0lOR0xFKCJSaWdodCBJbnB1dCBQR0EgVm9sdW1lIiwgV004OTAzX0FOQUxPR1VFX1JJR0hUX0lOUFVUXzAsCisJICAgMCwgMzEsIDApLAorU09DX1NJTkdMRSgiUmlnaHQgSW5wdXQgUEdBIENvbW1vbiBNb2RlIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9SSUdIVF9JTlBVVF8xLAorCSAgIDYsIDEsIDApLAorCisvKiBBRENzICovCitTT0NfU0lOR0xFKCJEUkMgU3dpdGNoIiwgV004OTAzX0RSQ18wLCAxNSwgMSwgMCksCitTT0NfRU5VTSgiRFJDIENvbXByZXNzb3IgU2xvcGUgUjAiLCBkcmNfc2xvcGVfcjApLAorU09DX0VOVU0oIkRSQyBDb21wcmVzc29yIFNsb3BlIFIxIiwgZHJjX3Nsb3BlX3IxKSwKK1NPQ19TSU5HTEVfVExWKCJEUkMgQ29tcHJlc3NvciBUaHJlYXNob2xkIFZvbHVtZSIsIFdNODkwM19EUkNfMywgNSwgMTI0LCAxLAorCSAgICAgICBkcmNfdGx2X3RocmVzaCksCitTT0NfU0lOR0xFX1RMVigiRFJDIFZvbHVtZSIsIFdNODkwM19EUkNfMywgMCwgMzAsIDEsIGRyY190bHZfYW1wKSwKK1NPQ19TSU5HTEVfVExWKCJEUkMgTWluaW11bSBHYWluIFZvbHVtZSIsIFdNODkwM19EUkNfMSwgMiwgMywgMSwgZHJjX3Rsdl9taW4pLAorU09DX1NJTkdMRV9UTFYoIkRSQyBNYXhpbXVtIEdhaW4gVm9sdW1lIiwgV004OTAzX0RSQ18xLCAwLCAzLCAwLCBkcmNfdGx2X21heCksCitTT0NfRU5VTSgiRFJDIEF0dGFjayBSYXRlIiwgZHJjX2F0dGFjayksCitTT0NfRU5VTSgiRFJDIERlY2F5IFJhdGUiLCBkcmNfZGVjYXkpLAorU09DX0VOVU0oIkRSQyBGRiBEZWxheSIsIGRyY19mZl9kZWxheSksCitTT0NfU0lOR0xFKCJEUkMgQW50aWNsaXAgU3dpdGNoIiwgV004OTAzX0RSQ18wLCAxLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRSQyBRUiBTd2l0Y2giLCBXTTg5MDNfRFJDXzAsIDIsIDEsIDApLAorU09DX1NJTkdMRV9UTFYoIkRSQyBRUiBUaHJlYXNob2xkIFZvbHVtZSIsIFdNODkwM19EUkNfMCwgNiwgMywgMCwgZHJjX3Rsdl9tYXgpLAorU09DX0VOVU0oIkRSQyBRUiBEZWNheSBSYXRlIiwgZHJjX3FyX2RlY2F5KSwKK1NPQ19TSU5HTEUoIkRSQyBTbW9vdGhpbmcgU3dpdGNoIiwgV004OTAzX0RSQ18wLCAzLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRSQyBTbW9vdGhpbmcgSHlzdGVyZXNpcyBTd2l0Y2giLCBXTTg5MDNfRFJDXzAsIDAsIDEsIDApLAorU09DX0VOVU0oIkRSQyBTbW9vdGhpbmcgVGhyZWFzaG9sZCIsIGRyY19zbW9vdGhpbmcpLAorU09DX1NJTkdMRV9UTFYoIkRSQyBTdGFydHVwIFZvbHVtZSIsIFdNODkwM19EUkNfMCwgNiwgMTgsIDAsIGRyY190bHZfc3RhcnR1cCksCisKK1NPQ19ET1VCTEVfUl9UTFYoIkRpZ2l0YWwgQ2FwdHVyZSBWb2x1bWUiLCBXTTg5MDNfQURDX0RJR0lUQUxfVk9MVU1FX0xFRlQsCisJCSBXTTg5MDNfQURDX0RJR0lUQUxfVk9MVU1FX1JJR0hULCAxLCA5NiwgMCwgZGlnaXRhbF90bHYpLAorU09DX0VOVU0oIkFEQyBDb21wYW5kaW5nIE1vZGUiLCBhZGNfY29tcGFuZGluZyksCitTT0NfU0lOR0xFKCJBREMgQ29tcGFuZGluZyBTd2l0Y2giLCBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAsIDMsIDEsIDApLAorCisvKiBEQUMgKi8KK1NPQ19ET1VCTEVfUl9UTFYoIkRpZ2l0YWwgUGxheWJhY2sgVm9sdW1lIiwgV004OTAzX0RBQ19ESUdJVEFMX1ZPTFVNRV9MRUZULAorCQkgV004OTAzX0RBQ19ESUdJVEFMX1ZPTFVNRV9SSUdIVCwgMSwgMTIwLCAwLCBkaWdpdGFsX3RsdiksCitTT0NfRU5VTSgiREFDIFNvZnQgTXV0ZSBSYXRlIiwgc29mdF9tdXRlKSwKK1NPQ19FTlVNKCJEQUMgTXV0ZSBNb2RlIiwgbXV0ZV9tb2RlKSwKK1NPQ19TSU5HTEUoIkRBQyBNb25vIFN3aXRjaCIsIFdNODkwM19EQUNfRElHSVRBTF8xLCAxMiwgMSwgMCksCitTT0NfRU5VTSgiREFDIERlLWVtcGhhc2lzIiwgZGFjX2RlZW1waGFzaXMpLAorU09DX1NJTkdMRSgiREFDIFNsb3BpbmcgU3RvcGJhbmQgRmlsdGVyIFN3aXRjaCIsCisJICAgV004OTAzX0RBQ19ESUdJVEFMXzEsIDExLCAxLCAwKSwKK1NPQ19FTlVNKCJEQUMgQ29tcGFuZGluZyBNb2RlIiwgZGFjX2NvbXBhbmRpbmcpLAorU09DX1NJTkdMRSgiREFDIENvbXBhbmRpbmcgU3dpdGNoIiwgV004OTAzX0FVRElPX0lOVEVSRkFDRV8wLCAxLCAxLCAwKSwKKworLyogSGVhZHBob25lcyAqLworU09DX0RPVUJMRV9SKCJIZWFkcGhvbmUgU3dpdGNoIiwKKwkgICAgIFdNODkwM19BTkFMT0dVRV9PVVQxX0xFRlQsIFdNODkwM19BTkFMT0dVRV9PVVQxX1JJR0hULAorCSAgICAgOCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBaQyBTd2l0Y2giLAorCSAgICAgV004OTAzX0FOQUxPR1VFX09VVDFfTEVGVCwgV004OTAzX0FOQUxPR1VFX09VVDFfUklHSFQsCisJICAgICA2LCAxLCAwKSwKK1NPQ19ET1VCTEVfUl9UTFYoIkhlYWRwaG9uZSBWb2x1bWUiLAorCQkgV004OTAzX0FOQUxPR1VFX09VVDFfTEVGVCwgV004OTAzX0FOQUxPR1VFX09VVDFfUklHSFQsCisJCSAwLCA2MywgMCwgb3V0X3RsdiksCisKKy8qIExpbmUgb3V0ICovCitTT0NfRE9VQkxFX1IoIkxpbmUgT3V0IFN3aXRjaCIsCisJICAgICBXTTg5MDNfQU5BTE9HVUVfT1VUMl9MRUZULCBXTTg5MDNfQU5BTE9HVUVfT1VUMl9SSUdIVCwKKwkgICAgIDgsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJMaW5lIE91dCBaQyBTd2l0Y2giLAorCSAgICAgV004OTAzX0FOQUxPR1VFX09VVDJfTEVGVCwgV004OTAzX0FOQUxPR1VFX09VVDJfUklHSFQsCisJICAgICA2LCAxLCAwKSwKK1NPQ19ET1VCTEVfUl9UTFYoIkxpbmUgT3V0IFZvbHVtZSIsCisJCSBXTTg5MDNfQU5BTE9HVUVfT1VUMl9MRUZULCBXTTg5MDNfQU5BTE9HVUVfT1VUMl9SSUdIVCwKKwkJIDAsIDYzLCAwLCBvdXRfdGx2KSwKKworLyogU3BlYWtlciAqLworU09DX0RPVUJMRV9SKCJTcGVha2VyIFN3aXRjaCIsCisJICAgICBXTTg5MDNfQU5BTE9HVUVfT1VUM19MRUZULCBXTTg5MDNfQU5BTE9HVUVfT1VUM19SSUdIVCwgOCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIlNwZWFrZXIgWkMgU3dpdGNoIiwKKwkgICAgIFdNODkwM19BTkFMT0dVRV9PVVQzX0xFRlQsIFdNODkwM19BTkFMT0dVRV9PVVQzX1JJR0hULCA2LCAxLCAwKSwKK1NPQ19ET1VCTEVfUl9UTFYoIlNwZWFrZXIgVm9sdW1lIiwKKwkJIFdNODkwM19BTkFMT0dVRV9PVVQzX0xFRlQsIFdNODkwM19BTkFMT0dVRV9PVVQzX1JJR0hULAorCQkgMCwgNjMsIDAsIG91dF90bHYpLAorfTsKKworc3RhdGljIGludCB3bTg5MDNfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTAzX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQkgIHNuZF9zb2NfY25ldygmd204OTAzX3NuZF9jb250cm9sc1tpXSwKKwkJCQkJICAgICAgIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbnB1dF9tb2RlX211eCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBJbnB1dCBNb2RlIE11eCIsIGxpbnB1dF9tb2RlX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlucHV0X21vZGVfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBJbnB1dCBNb2RlIE11eCIsIHJpbnB1dF9tb2RlX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGlucHV0X211eCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBJbnB1dCBNdXgiLCBsaW5wdXRfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5wdXRfaW52X211eCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBJbnZlcnRpbmcgSW5wdXQgTXV4IiwgbGlucHV0X2ludl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbnB1dF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJpZ2h0IElucHV0IE11eCIsIHJpbnB1dF9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpbnB1dF9pbnZfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBJbnZlcnRpbmcgSW5wdXQgTXV4IiwgcmlucHV0X2ludl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfb3V0cHV0X21peGVyW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgV004OTAzX0FOQUxPR1VFX0xFRlRfTUlYXzAsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9MRUZUX01JWF8wLCAyLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRV9XKCJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfTEVGVF9NSVhfMCwgMSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEVfVygiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9MRUZUX01JWF8wLCAxLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaWdodF9vdXRwdXRfbWl4ZXJbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfUklHSFRfTUlYXzAsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9SSUdIVF9NSVhfMCwgMiwgMSwgMCksCitTT0NfREFQTV9TSU5HTEVfVygiTGVmdCBCeXBhc3MgU3dpdGNoIiwgV004OTAzX0FOQUxPR1VFX1JJR0hUX01JWF8wLCAxLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRV9XKCJSaWdodCBCeXBhc3MgU3dpdGNoIiwgV004OTAzX0FOQUxPR1VFX1JJR0hUX01JWF8wLCAxLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X3NwZWFrZXJfbWl4ZXJbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9MRUZUXzAsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9TUEtfTUlYX0xFRlRfMCwgMiwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODkwM19BTkFMT0dVRV9TUEtfTUlYX0xFRlRfMCwgMSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9MRUZUXzAsCisJCTEsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X3NwZWFrZXJfbWl4ZXJbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9SSUdIVF8wLCAzLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiREFDUiBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9SSUdIVF8wLCAyLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTGVmdCBCeXBhc3MgU3dpdGNoIiwgV004OTAzX0FOQUxPR1VFX1NQS19NSVhfUklHSFRfMCwKKwkJMSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9SSUdIVF8wLAorCQkxLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg5MDNfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fSU5QVVQoIklOMUwiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4xUiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJMIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklOMlIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4zTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjNSIiksCisKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPVVRSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTElORU9VVFIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkxPUCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTE9OIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJST1AiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlJPTiIpLAorCitTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBXTTg5MDNfTUlDX0JJQVNfQ09OVFJPTF8wLCAwLCAwKSwKKworU05EX1NPQ19EQVBNX01VWCgiTGVmdCBJbnB1dCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZsaW5wdXRfbXV4KSwKK1NORF9TT0NfREFQTV9NVVgoIkxlZnQgSW5wdXQgSW52ZXJ0aW5nIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJICZsaW5wdXRfaW52X211eCksCitTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IElucHV0IE1vZGUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbGlucHV0X21vZGVfbXV4KSwKKworU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgSW5wdXQgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmlucHV0X211eCksCitTTkRfU09DX0RBUE1fTVVYKCJSaWdodCBJbnB1dCBJbnZlcnRpbmcgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkgJnJpbnB1dF9pbnZfbXV4KSwKK1NORF9TT0NfREFQTV9NVVgoIlJpZ2h0IElucHV0IE1vZGUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmcmlucHV0X21vZGVfbXV4KSwKKworU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBJbnB1dCBQR0EiLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8wLCAxLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlJpZ2h0IElucHV0IFBHQSIsIFdNODkwM19QT1dFUl9NQU5BR0VNRU5UXzAsIDAsIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fQURDKCJBRENMIiwgIkxlZnQgSGlGaSBDYXB0dXJlIiwgV004OTAzX1BPV0VSX01BTkFHRU1FTlRfNiwgMSwgMCksCitTTkRfU09DX0RBUE1fQURDKCJBRENSIiwgIlJpZ2h0IEhpRmkgQ2FwdHVyZSIsIFdNODkwM19QT1dFUl9NQU5BR0VNRU5UXzYsIDAsIDApLAorCitTTkRfU09DX0RBUE1fREFDKCJEQUNMIiwgIkxlZnQgUGxheWJhY2siLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF82LCAzLCAwKSwKK1NORF9TT0NfREFQTV9EQUMoIkRBQ1IiLCAiUmlnaHQgUGxheWJhY2siLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF82LCAyLCAwKSwKKworU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IE91dHB1dCBNaXhlciIsIFdNODkwM19QT1dFUl9NQU5BR0VNRU5UXzEsIDEsIDAsCisJCSAgIGxlZnRfb3V0cHV0X21peGVyLCBBUlJBWV9TSVpFKGxlZnRfb3V0cHV0X21peGVyKSksCitTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IE91dHB1dCBNaXhlciIsIFdNODkwM19QT1dFUl9NQU5BR0VNRU5UXzEsIDAsIDAsCisJCSAgIHJpZ2h0X291dHB1dF9taXhlciwgQVJSQVlfU0laRShyaWdodF9vdXRwdXRfbWl4ZXIpKSwKKworU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF80LCAxLCAwLAorCQkgICBsZWZ0X3NwZWFrZXJfbWl4ZXIsIEFSUkFZX1NJWkUobGVmdF9zcGVha2VyX21peGVyKSksCitTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF80LCAwLCAwLAorCQkgICByaWdodF9zcGVha2VyX21peGVyLCBBUlJBWV9TSVpFKHJpZ2h0X3NwZWFrZXJfbWl4ZXIpKSwKKworU05EX1NPQ19EQVBNX1BHQV9FKCJMZWZ0IEhlYWRwaG9uZSBPdXRwdXQgUEdBIiwgV004OTAzX1BPV0VSX01BTkFHRU1FTlRfMiwKKwkJICAgMSwgMCwgTlVMTCwgMCwgd204OTAzX291dHB1dF9ldmVudCwKKwkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCitTTkRfU09DX0RBUE1fUEdBX0UoIlJpZ2h0IEhlYWRwaG9uZSBPdXRwdXQgUEdBIiwgV004OTAzX1BPV0VSX01BTkFHRU1FTlRfMiwKKwkJICAgMCwgMCwgTlVMTCwgMCwgd204OTAzX291dHB1dF9ldmVudCwKKwkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKK1NORF9TT0NfREFQTV9QR0FfRSgiTGVmdCBMaW5lIE91dHB1dCBQR0EiLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8zLCAxLCAwLAorCQkgICBOVUxMLCAwLCB3bTg5MDNfb3V0cHV0X2V2ZW50LAorCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiUmlnaHQgTGluZSBPdXRwdXQgUEdBIiwgV004OTAzX1BPV0VSX01BTkFHRU1FTlRfMywgMCwgMCwKKwkJICAgTlVMTCwgMCwgd204OTAzX291dHB1dF9ldmVudCwKKwkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKK1NORF9TT0NfREFQTV9QR0EoIkxlZnQgU3BlYWtlciBQR0EiLCBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF81LCAxLCAwLAorCQkgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBTcGVha2VyIFBHQSIsIFdNODkwM19QT1dFUl9NQU5BR0VNRU5UXzUsIDAsIDAsCisJCSBOVUxMLCAwKSwKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKKworCXsgIkxlZnQgSW5wdXQgTXV4IiwgIklOMUwiLCAiSU4xTCIgfSwKKwl7ICJMZWZ0IElucHV0IE11eCIsICJJTjJMIiwgIklOMkwiIH0sCisJeyAiTGVmdCBJbnB1dCBNdXgiLCAiSU4zTCIsICJJTjNMIiB9LAorCisJeyAiTGVmdCBJbnB1dCBJbnZlcnRpbmcgTXV4IiwgIklOMUwiLCAiSU4xTCIgfSwKKwl7ICJMZWZ0IElucHV0IEludmVydGluZyBNdXgiLCAiSU4yTCIsICJJTjJMIiB9LAorCXsgIkxlZnQgSW5wdXQgSW52ZXJ0aW5nIE11eCIsICJJTjNMIiwgIklOM0wiIH0sCisKKwl7ICJSaWdodCBJbnB1dCBNdXgiLCAiSU4xUiIsICJJTjFSIiB9LAorCXsgIlJpZ2h0IElucHV0IE11eCIsICJJTjJSIiwgIklOMlIiIH0sCisJeyAiUmlnaHQgSW5wdXQgTXV4IiwgIklOM1IiLCAiSU4zUiIgfSwKKworCXsgIlJpZ2h0IElucHV0IEludmVydGluZyBNdXgiLCAiSU4xUiIsICJJTjFSIiB9LAorCXsgIlJpZ2h0IElucHV0IEludmVydGluZyBNdXgiLCAiSU4yUiIsICJJTjJSIiB9LAorCXsgIlJpZ2h0IElucHV0IEludmVydGluZyBNdXgiLCAiSU4zUiIsICJJTjNSIiB9LAorCisJeyAiTGVmdCBJbnB1dCBNb2RlIE11eCIsICJTaW5nbGUtRW5kZWQiLCAiTGVmdCBJbnB1dCBJbnZlcnRpbmcgTXV4IiB9LAorCXsgIkxlZnQgSW5wdXQgTW9kZSBNdXgiLCAiRGlmZmVyZW50aWFsIExpbmUiLAorCSAgIkxlZnQgSW5wdXQgTXV4IiB9LAorCXsgIkxlZnQgSW5wdXQgTW9kZSBNdXgiLCAiRGlmZmVyZW50aWFsIExpbmUiLAorCSAgIkxlZnQgSW5wdXQgSW52ZXJ0aW5nIE11eCIgfSwKKwl7ICJMZWZ0IElucHV0IE1vZGUgTXV4IiwgIkRpZmZlcmVudGlhbCBNaWMiLAorCSAgIkxlZnQgSW5wdXQgTXV4IiB9LAorCXsgIkxlZnQgSW5wdXQgTW9kZSBNdXgiLCAiRGlmZmVyZW50aWFsIE1pYyIsCisJICAiTGVmdCBJbnB1dCBJbnZlcnRpbmcgTXV4IiB9LAorCisJeyAiUmlnaHQgSW5wdXQgTW9kZSBNdXgiLCAiU2luZ2xlLUVuZGVkIiwKKwkgICJSaWdodCBJbnB1dCBJbnZlcnRpbmcgTXV4IiB9LAorCXsgIlJpZ2h0IElucHV0IE1vZGUgTXV4IiwgIkRpZmZlcmVudGlhbCBMaW5lIiwKKwkgICJSaWdodCBJbnB1dCBNdXgiIH0sCisJeyAiUmlnaHQgSW5wdXQgTW9kZSBNdXgiLCAiRGlmZmVyZW50aWFsIExpbmUiLAorCSAgIlJpZ2h0IElucHV0IEludmVydGluZyBNdXgiIH0sCisJeyAiUmlnaHQgSW5wdXQgTW9kZSBNdXgiLCAiRGlmZmVyZW50aWFsIE1pYyIsCisJICAiUmlnaHQgSW5wdXQgTXV4IiB9LAorCXsgIlJpZ2h0IElucHV0IE1vZGUgTXV4IiwgIkRpZmZlcmVudGlhbCBNaWMiLAorCSAgIlJpZ2h0IElucHV0IEludmVydGluZyBNdXgiIH0sCisKKwl7ICJMZWZ0IElucHV0IFBHQSIsIE5VTEwsICJMZWZ0IElucHV0IE1vZGUgTXV4IiB9LAorCXsgIlJpZ2h0IElucHV0IFBHQSIsIE5VTEwsICJSaWdodCBJbnB1dCBNb2RlIE11eCIgfSwKKworCXsgIkFEQ0wiLCBOVUxMLCAiTGVmdCBJbnB1dCBQR0EiIH0sCisJeyAiQURDUiIsIE5VTEwsICJSaWdodCBJbnB1dCBQR0EiIH0sCisKKwl7ICJMZWZ0IE91dHB1dCBNaXhlciIsICJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCAiTGVmdCBJbnB1dCBQR0EiIH0sCisJeyAiTGVmdCBPdXRwdXQgTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBJbnB1dCBQR0EiIH0sCisJeyAiTGVmdCBPdXRwdXQgTWl4ZXIiLCAiREFDTCBTd2l0Y2giLCAiREFDTCIgfSwKKwl7ICJMZWZ0IE91dHB1dCBNaXhlciIsICJEQUNSIFN3aXRjaCIsICJEQUNSIiB9LAorCisJeyAiUmlnaHQgT3V0cHV0IE1peGVyIiwgIkxlZnQgQnlwYXNzIFN3aXRjaCIsICJMZWZ0IElucHV0IFBHQSIgfSwKKwl7ICJSaWdodCBPdXRwdXQgTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBJbnB1dCBQR0EiIH0sCisJeyAiUmlnaHQgT3V0cHV0IE1peGVyIiwgIkRBQ0wgU3dpdGNoIiwgIkRBQ0wiIH0sCisJeyAiUmlnaHQgT3V0cHV0IE1peGVyIiwgIkRBQ1IgU3dpdGNoIiwgIkRBQ1IiIH0sCisKKwl7ICJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCAiTGVmdCBCeXBhc3MgU3dpdGNoIiwgIkxlZnQgSW5wdXQgUEdBIiB9LAorCXsgIkxlZnQgU3BlYWtlciBNaXhlciIsICJSaWdodCBCeXBhc3MgU3dpdGNoIiwgIlJpZ2h0IElucHV0IFBHQSIgfSwKKwl7ICJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCAiREFDTCBTd2l0Y2giLCAiREFDTCIgfSwKKwl7ICJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCAiREFDUiBTd2l0Y2giLCAiREFDUiIgfSwKKworCXsgIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiLCAiTGVmdCBCeXBhc3MgU3dpdGNoIiwgIkxlZnQgSW5wdXQgUEdBIiB9LAorCXsgIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBJbnB1dCBQR0EiIH0sCisJeyAiUmlnaHQgU3BlYWtlciBNaXhlciIsICJEQUNMIFN3aXRjaCIsICJEQUNMIiB9LAorCXsgIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiLCAiREFDUiBTd2l0Y2giLCAiREFDUiIgfSwKKworCXsgIkxlZnQgTGluZSBPdXRwdXQgUEdBIiwgTlVMTCwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIlJpZ2h0IExpbmUgT3V0cHV0IFBHQSIsIE5VTEwsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisKKwl7ICJMZWZ0IEhlYWRwaG9uZSBPdXRwdXQgUEdBIiwgTlVMTCwgIkxlZnQgT3V0cHV0IE1peGVyIiB9LAorCXsgIlJpZ2h0IEhlYWRwaG9uZSBPdXRwdXQgUEdBIiwgTlVMTCwgIlJpZ2h0IE91dHB1dCBNaXhlciIgfSwKKworCXsgIkxlZnQgU3BlYWtlciBQR0EiLCBOVUxMLCAiTGVmdCBTcGVha2VyIE1peGVyIiB9LAorCXsgIlJpZ2h0IFNwZWFrZXIgUEdBIiwgTlVMTCwgIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiIH0sCisKKwl7ICJIUE9VVEwiLCBOVUxMLCAiTGVmdCBIZWFkcGhvbmUgT3V0cHV0IFBHQSIgfSwKKwl7ICJIUE9VVFIiLCBOVUxMLCAiUmlnaHQgSGVhZHBob25lIE91dHB1dCBQR0EiIH0sCisKKwl7ICJMSU5FT1VUTCIsIE5VTEwsICJMZWZ0IExpbmUgT3V0cHV0IFBHQSIgfSwKKwl7ICJMSU5FT1VUUiIsIE5VTEwsICJSaWdodCBMaW5lIE91dHB1dCBQR0EiIH0sCisKKwl7ICJMT1AiLCBOVUxMLCAiTGVmdCBTcGVha2VyIFBHQSIgfSwKKwl7ICJMT04iLCBOVUxMLCAiTGVmdCBTcGVha2VyIFBHQSIgfSwKKworCXsgIlJPUCIsIE5VTEwsICJSaWdodCBTcGVha2VyIFBHQSIgfSwKKwl7ICJST04iLCBOVUxMLCAiUmlnaHQgU3BlYWtlciBQR0EiIH0sCit9OworCitzdGF0aWMgaW50IHdtODkwM19hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTAzX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204OTAzX2RhcG1fd2lkZ2V0cykpOworCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJdTE2IHJlZywgcmVnMjsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlyZWcgPSB3bTg5MDNfcmVhZChjb2RlYywgV004OTAzX1ZNSURfQ09OVFJPTF8wKTsKKwkJcmVnICY9IH4oV004OTAzX1ZNSURfUkVTX01BU0spOworCQlyZWcgfD0gV004OTAzX1ZNSURfUkVTXzUwSzsKKwkJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfVk1JRF9DT05UUk9MXzAsIHJlZyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXdtODkwM19ydW5fc2VxdWVuY2UoY29kZWMsIDApOworCQkJd204OTAzX3N5bmNfcmVnX2NhY2hlKGNvZGVjLCBjb2RlYy0+cmVnX2NhY2hlKTsKKworCQkJLyogRW5hYmxlIGxvdyBpbXBlZGVuY2UgY2hhcmdlIHB1bXAgb3V0cHV0ICovCisJCQlyZWcgPSB3bTg5MDNfcmVhZChjb2RlYywKKwkJCQkJICBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0VfVEVTVF8xKTsKKwkJCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0NPTlRST0xfSU5URVJGQUNFX1RFU1RfMSwKKwkJCQkgICAgIHJlZyB8IFdNODkwM19URVNUX0tFWSk7CisJCQlyZWcyID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19DSEFSR0VfUFVNUF9URVNUXzEpOworCQkJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0hBUkdFX1BVTVBfVEVTVF8xLAorCQkJCSAgICAgcmVnMiB8IFdNODkwM19DUF9TV19LRUxWSU5fTU9ERV9NQVNLKTsKKwkJCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0NPTlRST0xfSU5URVJGQUNFX1RFU1RfMSwKKwkJCQkgICAgIHJlZyk7CisKKwkJCS8qIEJ5IGRlZmF1bHQgbm8gYnlwYXNzIHBhdGhzIGFyZSBlbmFibGVkIHNvCisJCQkgKiBlbmFibGUgQ2xhc3MgVyBzdXBwb3J0LgorCQkJICovCisJCQlkZXZfZGJnKCZpMmMtPmRldiwgIkVuYWJsaW5nIENsYXNzIFdcbiIpOworCQkJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0xBU1NfV18wLCByZWcgfAorCQkJCSAgICAgV004OTAzX0NQX0RZTl9GUkVRIHwgV004OTAzX0NQX0RZTl9WKTsKKwkJfQorCisJCXJlZyA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfVk1JRF9DT05UUk9MXzApOworCQlyZWcgJj0gfihXTTg5MDNfVk1JRF9SRVNfTUFTSyk7CisJCXJlZyB8PSBXTTg5MDNfVk1JRF9SRVNfMjUwSzsKKwkJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfVk1JRF9DT05UUk9MXzAsIHJlZyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQl3bTg5MDNfcnVuX3NlcXVlbmNlKGNvZGVjLCAzMik7CisJCWJyZWFrOworCX0KKworCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5MDNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHdtODkwM19wcml2ICp3bTg5MDMgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJd204OTAzLT5zeXNjbGsgPSBmcmVxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBhaWYxID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMSk7CisKKwlhaWYxICY9IH4oV004OTAzX0xSQ0xLX0RJUiB8IFdNODkwM19CQ0xLX0RJUiB8IFdNODkwM19BSUZfRk1UX01BU0sgfAorCQkgIFdNODkwM19BSUZfTFJDTEtfSU5WIHwgV004OTAzX0FJRl9CQ0xLX0lOVik7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRk06CisJCWFpZjEgfD0gV004OTAzX0xSQ0xLX0RJUjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlhaWYxIHw9IFdNODkwM19MUkNMS19ESVIgfCBXTTg5MDNfQkNMS19ESVI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwkJYWlmMSB8PSBXTTg5MDNfQkNMS19ESVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlhaWYxIHw9IDB4MzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJYWlmMSB8PSAweDMgfCBXTTg5MDNfQUlGX0xSQ0xLX0lOVjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWFpZjEgfD0gMHgyOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWFpZjEgfD0gMHgxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJLyogZnJhbWUgaW52ZXJzaW9uIG5vdCB2YWxpZCBmb3IgRFNQIG1vZGVzICovCisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQkJYWlmMSB8PSBXTTg5MDNfQUlGX0JDTEtfSU5WOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQkJYWlmMSB8PSBXTTg5MDNfQUlGX0JDTEtfSU5WIHwgV004OTAzX0FJRl9MUkNMS19JTlY7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWFpZjEgfD0gV004OTAzX0FJRl9CQ0xLX0lOVjsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQkJYWlmMSB8PSBXTTg5MDNfQUlGX0xSQ0xLX0lOVjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzEsIGFpZjEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1MTYgcmVnOworCisJcmVnID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19EQUNfRElHSVRBTF8xKTsKKworCWlmIChtdXRlKQorCQlyZWcgfD0gV004OTAzX0RBQ19NVVRFOworCWVsc2UKKwkJcmVnICY9IH5XTTg5MDNfREFDX01VVEU7CisKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19EQUNfRElHSVRBTF8xLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIExvb2t1cCB0YWJsZSBmb3IgQ0xLX1NZUy9mcyByYXRpby4gIDI1NmZzIG9yIG1vcmUgaXMgcmVjb21tZW5kZWQKKyAqIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlIHNvIHdlIGxpc3QgdGhlIGxvd2VyIHJhdGVzIGZpcnN0IGFuZCBtYXRjaAorICogb24gdGhlIGxhc3QgbWF0Y2ggd2UgZmluZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBkaXY7CisJaW50IHJhdGU7CisJaW50IG1vZGU7CisJaW50IG1jbGtfZGl2OworfSBjbGtfc3lzX3JhdGlvc1tdID0geworCXsgICA2NCwgMHgwLCAweDAsIDEgfSwKKwl7ICAgNjgsIDB4MCwgMHgxLCAxIH0sCisJeyAgMTI1LCAweDAsIDB4MiwgMSB9LAorCXsgIDEyOCwgMHgxLCAweDAsIDEgfSwKKwl7ICAxMzYsIDB4MSwgMHgxLCAxIH0sCisJeyAgMTkyLCAweDIsIDB4MCwgMSB9LAorCXsgIDIwNCwgMHgyLCAweDEsIDEgfSwKKworCXsgICA2NCwgMHgwLCAweDAsIDIgfSwKKwl7ICAgNjgsIDB4MCwgMHgxLCAyIH0sCisJeyAgMTI1LCAweDAsIDB4MiwgMiB9LAorCXsgIDEyOCwgMHgxLCAweDAsIDIgfSwKKwl7ICAxMzYsIDB4MSwgMHgxLCAyIH0sCisJeyAgMTkyLCAweDIsIDB4MCwgMiB9LAorCXsgIDIwNCwgMHgyLCAweDEsIDIgfSwKKworCXsgIDI1MCwgMHgyLCAweDIsIDEgfSwKKwl7ICAyNTYsIDB4MywgMHgwLCAxIH0sCisJeyAgMjcyLCAweDMsIDB4MSwgMSB9LAorCXsgIDM4NCwgMHg0LCAweDAsIDEgfSwKKwl7ICA0MDgsIDB4NCwgMHgxLCAxIH0sCisJeyAgMzc1LCAweDQsIDB4MiwgMSB9LAorCXsgIDUxMiwgMHg1LCAweDAsIDEgfSwKKwl7ICA1NDQsIDB4NSwgMHgxLCAxIH0sCisJeyAgNTAwLCAweDUsIDB4MiwgMSB9LAorCXsgIDc2OCwgMHg2LCAweDAsIDEgfSwKKwl7ICA4MTYsIDB4NiwgMHgxLCAxIH0sCisJeyAgNzUwLCAweDYsIDB4MiwgMSB9LAorCXsgMTAyNCwgMHg3LCAweDAsIDEgfSwKKwl7IDEwODgsIDB4NywgMHgxLCAxIH0sCisJeyAxMDAwLCAweDcsIDB4MiwgMSB9LAorCXsgMTQwOCwgMHg4LCAweDAsIDEgfSwKKwl7IDE0OTYsIDB4OCwgMHgxLCAxIH0sCisJeyAxNTM2LCAweDksIDB4MCwgMSB9LAorCXsgMTYzMiwgMHg5LCAweDEsIDEgfSwKKwl7IDE1MDAsIDB4OSwgMHgyLCAxIH0sCisKKwl7ICAyNTAsIDB4MiwgMHgyLCAyIH0sCisJeyAgMjU2LCAweDMsIDB4MCwgMiB9LAorCXsgIDI3MiwgMHgzLCAweDEsIDIgfSwKKwl7ICAzODQsIDB4NCwgMHgwLCAyIH0sCisJeyAgNDA4LCAweDQsIDB4MSwgMiB9LAorCXsgIDM3NSwgMHg0LCAweDIsIDIgfSwKKwl7ICA1MTIsIDB4NSwgMHgwLCAyIH0sCisJeyAgNTQ0LCAweDUsIDB4MSwgMiB9LAorCXsgIDUwMCwgMHg1LCAweDIsIDIgfSwKKwl7ICA3NjgsIDB4NiwgMHgwLCAyIH0sCisJeyAgODE2LCAweDYsIDB4MSwgMiB9LAorCXsgIDc1MCwgMHg2LCAweDIsIDIgfSwKKwl7IDEwMjQsIDB4NywgMHgwLCAyIH0sCisJeyAxMDg4LCAweDcsIDB4MSwgMiB9LAorCXsgMTAwMCwgMHg3LCAweDIsIDIgfSwKKwl7IDE0MDgsIDB4OCwgMHgwLCAyIH0sCisJeyAxNDk2LCAweDgsIDB4MSwgMiB9LAorCXsgMTUzNiwgMHg5LCAweDAsIDIgfSwKKwl7IDE2MzIsIDB4OSwgMHgxLCAyIH0sCisJeyAxNTAwLCAweDksIDB4MiwgMiB9LAorfTsKKworLyogQ0xLX1NZUy9CQ0xLIHJhdGlvcyAtIG11bHRpcGxpZWQgYnkgMTAgZHVlIHRvIC41cyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IHJhdGlvOworCWludCBkaXY7Cit9IGJjbGtfZGl2c1tdID0geworCXsgIDEwLCAgMCB9LAorCXsgIDE1LCAgMSB9LAorCXsgIDIwLCAgMiB9LAorCXsgIDMwLCAgMyB9LAorCXsgIDQwLCAgNCB9LAorCXsgIDUwLCAgNSB9LAorCXsgIDU1LCAgNiB9LAorCXsgIDYwLCAgNyB9LAorCXsgIDgwLCAgOCB9LAorCXsgMTAwLCAgOSB9LAorCXsgMTEwLCAxMCB9LAorCXsgMTIwLCAxMSB9LAorCXsgMTYwLCAxMiB9LAorCXsgMjAwLCAxMyB9LAorCXsgMjIwLCAxNCB9LAorCXsgMjQwLCAxNSB9LAorCXsgMjUwLCAxNiB9LAorCXsgMzAwLCAxNyB9LAorCXsgMzIwLCAxOCB9LAorCXsgNDQwLCAxOSB9LAorCXsgNDgwLCAyMCB9LAorfTsKKworLyogU2FtcGxlIHJhdGVzIGZvciBEU1AgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCByYXRlOworCWludCB2YWx1ZTsKK30gc2FtcGxlX3JhdGVzW10gPSB7CisJeyAgODAwMCwgIDAgfSwKKwl7IDExMDI1LCAgMSB9LAorCXsgMTIwMDAsICAyIH0sCisJeyAxNjAwMCwgIDMgfSwKKwl7IDIyMDUwLCAgNCB9LAorCXsgMjQwMDAsICA1IH0sCisJeyAzMjAwMCwgIDYgfSwKKwl7IDQ0MTAwLCAgNyB9LAorCXsgNDgwMDAsICA4IH0sCisJeyA4ODIwMCwgIDkgfSwKKwl7IDk2MDAwLCAxMCB9LAorCXsgMCwgICAgICAwIH0sCit9OworCitzdGF0aWMgaW50IHdtODkwM19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IHdtODkwM19wcml2ICp3bTg5MDMgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKm1hc3Rlcl9ydW50aW1lOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXdtODkwMy0+cGxheWJhY2tfYWN0aXZlKys7CisJZWxzZQorCQl3bTg5MDMtPmNhcHR1cmVfYWN0aXZlKys7CisKKwkvKiBUaGUgREFJIGhhcyBzaGFyZWQgY2xvY2tzIHNvIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBsYXliYWNrIG9yCisJICogY2FwdHVyZSBnb2luZyB0aGVuIGNvbnN0cmFpbiB0aGlzIHN1YnN0cmVhbSB0byBtYXRjaCBpdC4KKwkgKi8KKwlpZiAod204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtKSB7CisJCW1hc3Rlcl9ydW50aW1lID0gd204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtLT5ydW50aW1lOworCisJCWRldl9kYmcoJmkyYy0+ZGV2LCAiQ29uc3RyYWluaW5nIHRvICVkIGJpdHMgYXQgJWRIelxuIiwKKwkJCW1hc3Rlcl9ydW50aW1lLT5zYW1wbGVfYml0cywKKwkJCW1hc3Rlcl9ydW50aW1lLT5yYXRlKTsKKworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkJICAgICBtYXN0ZXJfcnVudGltZS0+cmF0ZSwKKwkJCQkJICAgICBtYXN0ZXJfcnVudGltZS0+cmF0ZSk7CisKKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1NBTVBMRV9CSVRTLAorCQkJCQkgICAgIG1hc3Rlcl9ydW50aW1lLT5zYW1wbGVfYml0cywKKwkJCQkJICAgICBtYXN0ZXJfcnVudGltZS0+c2FtcGxlX2JpdHMpOworCisJCXdtODkwMy0+c2xhdmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCX0gZWxzZQorCQl3bTg5MDMtPm1hc3Rlcl9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd204OTAzX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IHdtODkwM19wcml2ICp3bTg5MDMgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXdtODkwMy0+cGxheWJhY2tfYWN0aXZlLS07CisJZWxzZQorCQl3bTg5MDMtPmNhcHR1cmVfYWN0aXZlLS07CisKKwlpZiAod204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtID09IHN1YnN0cmVhbSkKKwkJd204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtID0gd204OTAzLT5zbGF2ZV9zdWJzdHJlYW07CisKKwl3bTg5MDMtPnNsYXZlX3N1YnN0cmVhbSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKKwlpbnQgZnMgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWludCBiY2xrOworCWludCBiY2xrX2RpdjsKKwlpbnQgaTsKKwlpbnQgZHNwX2NvbmZpZzsKKwlpbnQgY2xrX2NvbmZpZzsKKwlpbnQgYmVzdF92YWw7CisJaW50IGN1cl92YWw7CisJaW50IGNsa19zeXM7CisKKwl1MTYgYWlmMSA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzEpOworCXUxNiBhaWYyID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMik7CisJdTE2IGFpZjMgPSB3bTg5MDNfcmVhZChjb2RlYywgV004OTAzX0FVRElPX0lOVEVSRkFDRV8zKTsKKwl1MTYgY2xvY2swID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19DTE9DS19SQVRFU18wKTsKKwl1MTYgY2xvY2sxID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19DTE9DS19SQVRFU18xKTsKKworCWlmIChzdWJzdHJlYW0gPT0gd204OTAzLT5zbGF2ZV9zdWJzdHJlYW0pIHsKKwkJZGV2X2RiZygmaTJjLT5kZXYsICJJZ25vcmluZyBod19wYXJhbXMgZm9yIHNsYXZlIHN1YnN0cmVhbVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBsb2dpYyBmb3IgRFNQIC0gY2hvb3NlIG5lYXJlc3QgcmF0ZSAqLworCWRzcF9jb25maWcgPSAwOworCWJlc3RfdmFsID0gYWJzKHNhbXBsZV9yYXRlc1tkc3BfY29uZmlnXS5yYXRlIC0gZnMpOworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHNhbXBsZV9yYXRlcyk7IGkrKykgeworCQljdXJfdmFsID0gYWJzKHNhbXBsZV9yYXRlc1tpXS5yYXRlIC0gZnMpOworCQlpZiAoY3VyX3ZhbCA8PSBiZXN0X3ZhbCkgeworCQkJZHNwX2NvbmZpZyA9IGk7CisJCQliZXN0X3ZhbCA9IGN1cl92YWw7CisJCX0KKwl9CisKKwkvKiBDb25zdHJhaW50cyBzaG91bGQgc3RvcCB1cyBoaXR0aW5nIHRoaXMgYnV0IGxldCdzIG1ha2Ugc3VyZSAqLworCWlmICh3bTg5MDMtPmNhcHR1cmVfYWN0aXZlKQorCQlzd2l0Y2ggKHNhbXBsZV9yYXRlc1tkc3BfY29uZmlnXS5yYXRlKSB7CisJCWNhc2UgODgyMDA6CisJCWNhc2UgOTYwMDA6CisJCQlkZXZfZXJyKCZpMmMtPmRldiwgIiVkSHogdW5zdXBwb3J0ZWQgYnkgQURDXG4iLAorCQkJCWZzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJZGV2X2RiZygmaTJjLT5kZXYsICJEU1AgZnMgPSAlZEh6XG4iLCBzYW1wbGVfcmF0ZXNbZHNwX2NvbmZpZ10ucmF0ZSk7CisJY2xvY2sxICY9IH5XTTg5MDNfU0FNUExFX1JBVEVfTUFTSzsKKwljbG9jazEgfD0gc2FtcGxlX3JhdGVzW2RzcF9jb25maWddLnZhbHVlOworCisJYWlmMSAmPSB+V004OTAzX0FJRl9XTF9NQVNLOworCWJjbGsgPSAyICogZnM7CisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQliY2xrICo9IDE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJYmNsayAqPSAyMDsKKwkJYWlmMSB8PSAweDQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWJjbGsgKj0gMjQ7CisJCWFpZjEgfD0gMHg4OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQliY2xrICo9IDMyOworCQlhaWYxIHw9IDB4YzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZygmaTJjLT5kZXYsICJNQ0xLID0gJWRIeiwgdGFyZ2V0IHNhbXBsZSByYXRlID0gJWRIelxuIiwKKwkJd204OTAzLT5zeXNjbGssIGZzKTsKKworCS8qIFdlIG1heSBub3QgaGF2ZSBhbiBNQ0xLIHdoaWNoIGFsbG93cyB1cyB0byBnZW5lcmF0ZSBleGFjdGx5CisJICogdGhlIGNsb2NrIHdlIHdhbnQsIHBhcnRpY3VsYXJseSB3aXRoIFVTQiBkZXJpdmVkIGlucHV0cywgc28KKwkgKiBhcHByb3hpbWF0ZS4KKwkgKi8KKwljbGtfY29uZmlnID0gMDsKKwliZXN0X3ZhbCA9IGFicygod204OTAzLT5zeXNjbGsgLworCQkJKGNsa19zeXNfcmF0aW9zWzBdLm1jbGtfZGl2ICoKKwkJCSBjbGtfc3lzX3JhdGlvc1swXS5kaXYpKSAtIGZzKTsKKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShjbGtfc3lzX3JhdGlvcyk7IGkrKykgeworCQljdXJfdmFsID0gYWJzKCh3bTg5MDMtPnN5c2NsayAvCisJCQkgICAgICAgKGNsa19zeXNfcmF0aW9zW2ldLm1jbGtfZGl2ICoKKwkJCQljbGtfc3lzX3JhdGlvc1tpXS5kaXYpKSAtIGZzKTsKKworCQlpZiAoY3VyX3ZhbCA8PSBiZXN0X3ZhbCkgeworCQkJY2xrX2NvbmZpZyA9IGk7CisJCQliZXN0X3ZhbCA9IGN1cl92YWw7CisJCX0KKwl9CisKKwlpZiAoY2xrX3N5c19yYXRpb3NbY2xrX2NvbmZpZ10ubWNsa19kaXYgPT0gMikgeworCQljbG9jazAgfD0gV004OTAzX01DTEtESVYyOworCQljbGtfc3lzID0gd204OTAzLT5zeXNjbGsgLyAyOworCX0gZWxzZSB7CisJCWNsb2NrMCAmPSB+V004OTAzX01DTEtESVYyOworCQljbGtfc3lzID0gd204OTAzLT5zeXNjbGs7CisJfQorCisJY2xvY2sxICY9IH4oV004OTAzX0NMS19TWVNfUkFURV9NQVNLIHwKKwkJICAgIFdNODkwM19DTEtfU1lTX01PREVfTUFTSyk7CisJY2xvY2sxIHw9IGNsa19zeXNfcmF0aW9zW2Nsa19jb25maWddLnJhdGUgPDwgV004OTAzX0NMS19TWVNfUkFURV9TSElGVDsKKwljbG9jazEgfD0gY2xrX3N5c19yYXRpb3NbY2xrX2NvbmZpZ10ubW9kZSA8PCBXTTg5MDNfQ0xLX1NZU19NT0RFX1NISUZUOworCisJZGV2X2RiZygmaTJjLT5kZXYsICJDTEtfU1lTX1JBVEU9JXgsIENMS19TWVNfTU9ERT0leCBkaXY9JWRcbiIsCisJCWNsa19zeXNfcmF0aW9zW2Nsa19jb25maWddLnJhdGUsCisJCWNsa19zeXNfcmF0aW9zW2Nsa19jb25maWddLm1vZGUsCisJCWNsa19zeXNfcmF0aW9zW2Nsa19jb25maWddLmRpdik7CisKKwlkZXZfZGJnKCZpMmMtPmRldiwgIkFjdHVhbCBDTEtfU1lTID0gJWRIelxuIiwgY2xrX3N5cyk7CisKKwkvKiBXZSBtYXkgbm90IGdldCBxdWl0ZSB0aGUgcmlnaHQgZnJlcXVlbmN5IGlmIHVzaW5nCisJICogYXBwcm94aW1hdGUgY2xvY2tzIHNvIGxvb2sgZm9yIHRoZSBjbG9zZXN0IG1hdGNoIHRoYXQgaXMKKwkgKiBoaWdoZXIgdGhhbiB0aGUgdGFyZ2V0ICh3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGVub3VnaAorCSAqIEJDTEtzIHRvIGNsb2NrIG91dCB0aGUgc2FtcGxlcykuCisJICovCisJYmNsa19kaXYgPSAwOworCWJlc3RfdmFsID0gKChjbGtfc3lzICogMTApIC8gYmNsa19kaXZzWzBdLnJhdGlvKSAtIGJjbGs7CisJaSA9IDE7CisJd2hpbGUgKGkgPCBBUlJBWV9TSVpFKGJjbGtfZGl2cykpIHsKKwkJY3VyX3ZhbCA9ICgoY2xrX3N5cyAqIDEwKSAvIGJjbGtfZGl2c1tpXS5yYXRpbykgLSBiY2xrOworCQlpZiAoY3VyX3ZhbCA8IDApIC8qIEJDTEsgdGFibGUgaXMgc29ydGVkICovCisJCQlicmVhazsKKwkJYmNsa19kaXYgPSBpOworCQliZXN0X3ZhbCA9IGN1cl92YWw7CisJCWkrKzsKKwl9CisKKwlhaWYyICY9IH5XTTg5MDNfQkNMS19ESVZfTUFTSzsKKwlhaWYzICY9IH5XTTg5MDNfTFJDTEtfUkFURV9NQVNLOworCisJZGV2X2RiZygmaTJjLT5kZXYsICJCQ0xLIHJhdGlvICVkIGZvciAlZEh6IC0gYWN0dWFsIEJDTEsgPSAlZEh6XG4iLAorCQliY2xrX2RpdnNbYmNsa19kaXZdLnJhdGlvIC8gMTAsIGJjbGssCisJCShjbGtfc3lzICogMTApIC8gYmNsa19kaXZzW2JjbGtfZGl2XS5yYXRpbyk7CisKKwlhaWYyIHw9IGJjbGtfZGl2c1tiY2xrX2Rpdl0uZGl2OworCWFpZjMgfD0gYmNsayAvIGZzOworCisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0xPQ0tfUkFURVNfMCwgY2xvY2swKTsKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19DTE9DS19SQVRFU18xLCBjbG9jazEpOworCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0FVRElPX0lOVEVSRkFDRV8xLCBhaWYxKTsKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMiwgYWlmMik7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzMsIGFpZjMpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004OTAzX1BMQVlCQUNLX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHxcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfMTEwMjUgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfMTYwMDAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfMjIwNTAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfMzIwMDAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfNDgwMDAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfODgyMDAgfAlcCisJCQkgICAgICAgU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgV004OTAzX0NBUFRVUkVfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfFwKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzExMDI1IHwJXAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfMTYwMDAgfAlcCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV8yMjA1MCB8CVwKKwkJCSAgICAgIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwJXAorCQkJICAgICAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAlcCisJCQkgICAgICBTTkRSVl9QQ01fUkFURV80ODAwMCkKKworI2RlZmluZSBXTTg5MDNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2RhaSB3bTg5MDNfZGFpID0geworCS5uYW1lID0gIldNODkwMyIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODkwM19QTEFZQkFDS19SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg5MDNfRk9STUFUUywKKwl9LAorCS5jYXB0dXJlID0geworCQkgLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkgLmNoYW5uZWxzX21pbiA9IDIsCisJCSAuY2hhbm5lbHNfbWF4ID0gMiwKKwkJIC5yYXRlcyA9IFdNODkwM19DQVBUVVJFX1JBVEVTLAorCQkgLmZvcm1hdHMgPSBXTTg5MDNfRk9STUFUUywKKwkgfSwKKwkub3BzID0geworCQkgLnN0YXJ0dXAgPSB3bTg5MDNfc3RhcnR1cCwKKwkJIC5zaHV0ZG93biA9IHdtODkwM19zaHV0ZG93biwKKwkJIC5od19wYXJhbXMgPSB3bTg5MDNfaHdfcGFyYW1zLAorCX0sCisJLmRhaV9vcHMgPSB7CisJCSAuZGlnaXRhbF9tdXRlID0gd204OTAzX2RpZ2l0YWxfbXV0ZSwKKwkJIC5zZXRfZm10ID0gd204OTAzX3NldF9kYWlfZm10LAorCQkgLnNldF9zeXNjbGsgPSB3bTg5MDNfc2V0X2RhaV9zeXNjbGsKKwl9Cit9OworRVhQT1JUX1NZTUJPTF9HUEwod204OTAzX2RhaSk7CisKK3N0YXRpYyBpbnQgd204OTAzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5MDNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCWludCBpOworCXUxNiAqcmVnX2NhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwl1MTYgKnRtcF9jYWNoZSA9IGttZW1kdXAoY29kZWMtPnJlZ19jYWNoZSwgc2l6ZW9mKHdtODkwM19yZWdfZGVmYXVsdHMpLAorCQkJCSBHRlBfS0VSTkVMKTsKKworCS8qIEJyaW5nIHRoZSBjb2RlYyBiYWNrIHVwIHRvIHN0YW5kYnkgZmlyc3QgdG8gbWluaW1pc2UgcG9wL2NsaWNrcyAqLworCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCXdtODkwM19zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPnN1c3BlbmRfYmlhc19sZXZlbCk7CisKKwkvKiBTeW5jIGJhY2sgZXZlcnl0aGluZyBlbHNlICovCisJaWYgKHRtcF9jYWNoZSkgeworCQlmb3IgKGkgPSAyOyBpIDwgQVJSQVlfU0laRSh3bTg5MDNfcmVnX2RlZmF1bHRzKTsgaSsrKQorCQkJaWYgKHRtcF9jYWNoZVtpXSAhPSByZWdfY2FjaGVbaV0pCisJCQkJd204OTAzX3dyaXRlKGNvZGVjLCBpLCB0bXBfY2FjaGVbaV0pOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBjYWNoZVxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBXTTg5MDMgZHJpdmVyCisgKiByZWdpc3RlciB0aGUgbWl4ZXIgYW5kIGRzcCBpbnRlcmZhY2VzIHdpdGggdGhlIGtlcm5lbAorICovCitzdGF0aWMgaW50IHdtODkwM19pbml0KHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJaW50IHJldCA9IDA7CisJdTE2IHZhbDsKKworCXZhbCA9IHdtODkwM19od19yZWFkKGNvZGVjLCBXTTg5MDNfU1dfUkVTRVRfQU5EX0lEKTsKKwlpZiAodmFsICE9IHdtODkwM19yZWdfZGVmYXVsdHNbV004OTAzX1NXX1JFU0VUX0FORF9JRF0pIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkiRGV2aWNlIHdpdGggSUQgcmVnaXN0ZXIgJXggaXMgbm90IGEgV004OTAzXG4iLCB2YWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb2RlYy0+bmFtZSA9ICJXTTg5MDMiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204OTAzX3JlYWQ7CisJY29kZWMtPndyaXRlID0gd204OTAzX3dyaXRlOworCWNvZGVjLT5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09GRjsKKwljb2RlYy0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg5MDNfc2V0X2JpYXNfbGV2ZWw7CisJY29kZWMtPmRhaSA9ICZ3bTg5MDNfZGFpOworCWNvZGVjLT5udW1fZGFpID0gMTsKKwljb2RlYy0+cmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODkwM19yZWdfZGVmYXVsdHMpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKHdtODkwM19yZWdfZGVmYXVsdHMsCisJCQkJICAgc2l6ZW9mKHdtODkwM19yZWdfZGVmYXVsdHMpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2YWwgPSB3bTg5MDNfcmVhZChjb2RlYywgV004OTAzX1JFVklTSU9OX05VTUJFUik7CisJZGV2X2luZm8oJmkyYy0+ZGV2LCAiV004OTAzIHJldmlzaW9uICVkXG4iLAorCQkgdmFsICYgV004OTAzX0NISVBfUkVWX01BU0spOworCisJd204OTAzX3Jlc2V0KGNvZGVjKTsKKworCS8qIHJlZ2lzdGVyIHBjbXMgKi8KKwlyZXQgPSBzbmRfc29jX25ld19wY21zKHNvY2RldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBwY21zXG4iKTsKKwkJZ290byBwY21fZXJyOworCX0KKworCS8qIFNZU0NMSyBpcyByZXF1aXJlZCBmb3IgcHJldHR5IG11Y2ggYW55dGhpbmcgKi8KKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19DTE9DS19SQVRFU18yLCBXTTg5MDNfQ0xLX1NZU19FTkEpOworCisJLyogcG93ZXIgb24gZGV2aWNlICovCisJd204OTAzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisKKwkvKiBMYXRjaCB2b2x1bWUgdXBkYXRlIGJpdHMgKi8KKwl2YWwgPSB3bTg5MDNfcmVhZChjb2RlYywgV004OTAzX0FEQ19ESUdJVEFMX1ZPTFVNRV9MRUZUKTsKKwl2YWwgfD0gV004OTAzX0FEQ1ZVOworCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0FEQ19ESUdJVEFMX1ZPTFVNRV9MRUZULCB2YWwpOworCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0FEQ19ESUdJVEFMX1ZPTFVNRV9SSUdIVCwgdmFsKTsKKworCXZhbCA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX0xFRlQpOworCXZhbCB8PSBXTTg5MDNfREFDVlU7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX0xFRlQsIHZhbCk7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX1JJR0hULCB2YWwpOworCisJdmFsID0gd204OTAzX3JlYWQoY29kZWMsIFdNODkwM19BTkFMT0dVRV9PVVQxX0xFRlQpOworCXZhbCB8PSBXTTg5MDNfSFBPVVRWVTsKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19BTkFMT0dVRV9PVVQxX0xFRlQsIHZhbCk7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQU5BTE9HVUVfT1VUMV9SSUdIVCwgdmFsKTsKKworCXZhbCA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfQU5BTE9HVUVfT1VUMl9MRUZUKTsKKwl2YWwgfD0gV004OTAzX0xJTkVPVVRWVTsKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19BTkFMT0dVRV9PVVQyX0xFRlQsIHZhbCk7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfQU5BTE9HVUVfT1VUMl9SSUdIVCwgdmFsKTsKKworCXZhbCA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfQU5BTE9HVUVfT1VUM19MRUZUKTsKKwl2YWwgfD0gV004OTAzX1NQS1ZVOworCXdtODkwM193cml0ZShjb2RlYywgV004OTAzX0FOQUxPR1VFX09VVDNfTEVGVCwgdmFsKTsKKwl3bTg5MDNfd3JpdGUoY29kZWMsIFdNODkwM19BTkFMT0dVRV9PVVQzX1JJR0hULCB2YWwpOworCisJLyogRW5hYmxlIERBQyBzb2Z0IG11dGUgYnkgZGVmYXVsdCAqLworCXZhbCA9IHdtODkwM19yZWFkKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfMSk7CisJdmFsIHw9IFdNODkwM19EQUNfTVVURU1PREU7CisJd204OTAzX3dyaXRlKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfMSwgdmFsKTsKKworCXdtODkwM19hZGRfY29udHJvbHMoY29kZWMpOworCXdtODkwM19hZGRfd2lkZ2V0cyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJ3bTg5MDM6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byBjYXJkX2VycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitjYXJkX2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CitwY21fZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKndtODkwM19zb2NkZXY7CisKK3N0YXRpYyBpbnQgd204OTAzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHdtODkwM19zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmV0OworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CisKKwlyZXQgPSB3bTg5MDNfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpMmMtPmRldiwgIkRldmljZSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTg5MDNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiAwOworfQorCisvKiBpMmMgY29kZWMgY29udHJvbCBsYXllciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODkwM19pMmNfaWRbXSA9IHsKKyAgICAgICB7ICJ3bTg5MDMiLCAwIH0sCisgICAgICAgeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODkwM19pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204OTAzX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004OTAzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgICAgPSB3bTg5MDNfaTJjX3Byb2JlLAorCS5yZW1vdmUgICA9IHdtODkwM19pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHdtODkwM19pMmNfaWQsCit9OworCitzdGF0aWMgaW50IHdtODkwM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHdtODkwM19zZXR1cF9kYXRhICpzZXR1cDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHdtODkwM19wcml2ICp3bTg5MDM7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGJvYXJkX2luZm87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50OworCWludCByZXQgPSAwOworCisJc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisKKwlpZiAoIXNldHVwLT5pMmNfYWRkcmVzcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjb2RlYyBhZGRyZXNzIHByb3ZpZGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODkwMyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg5MDNfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh3bTg5MDMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jb2RlYzsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gd204OTAzOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCisJd204OTAzX3NvY2RldiA9IHNvY2RldjsKKworCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTAzX2kyY19kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRyaXZlclxuIik7CisJCWdvdG8gZXJyX3ByaXY7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZib2FyZF9pbmZvLCAwLCBzaXplb2YoYm9hcmRfaW5mbykpOworCQlzdHJsY3B5KGJvYXJkX2luZm8udHlwZSwgIndtODkwMyIsIEkyQ19OQU1FX1NJWkUpOworCQlib2FyZF9pbmZvLmFkZHIgPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisKKwkJYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihzZXR1cC0+aTJjX2J1cyk7CisJCWlmICghYWRhcHRlcikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IEkyQyBidXMgJWRcbiIsCisJCQkJc2V0dXAtPmkyY19idXMpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX2FkYXB0ZXI7CisJCX0KKworCQlpMmNfY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmJvYXJkX2luZm8pOworCQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7CisJCWlmIChpMmNfY2xpZW50ID09IE5VTEwpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiSTJDIGRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9hZGFwdGVyOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKKworZXJyX2FkYXB0ZXI6CisJaTJjX2RlbF9kcml2ZXIoJndtODkwM19pMmNfZHJpdmVyKTsKK2Vycl9wcml2OgorCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOworZXJyX2NvZGVjOgorCWtmcmVlKGNvZGVjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgd204OTAzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKQorCQl3bTg5MDNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworCWkyY191bnJlZ2lzdGVyX2RldmljZShzb2NkZXYtPmNvZGVjLT5jb250cm9sX2RhdGEpOworCWkyY19kZWxfZHJpdmVyKCZ3bTg5MDNfaTJjX2RyaXZlcik7CisJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CisJa2ZyZWUoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODkwMyA9IHsKKwkucHJvYmUgPSAJd204OTAzX3Byb2JlLAorCS5yZW1vdmUgPSAJd204OTAzX3JlbW92ZSwKKwkuc3VzcGVuZCA9IAl3bTg5MDNfc3VzcGVuZCwKKwkucmVzdW1lID0Jd204OTAzX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtODkwMyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg5MDMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNtPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjNjIyZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmgKQEAgLTAsMCArMSwxNDYzIEBACisvKgorICogd204OTAzLmggLSBXTTg5MDMgYXVkaW8gY29kZWMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfV004OTAzX0gKKyNkZWZpbmUgX1dNODkwM19ICisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSB3bTg5MDNfZGFpOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODkwMzsKKworc3RydWN0IHdtODkwM19zZXR1cF9kYXRhIHsKKwlpbnQgaTJjX2J1czsKKwlpbnQgaTJjX2FkZHJlc3M7Cit9OworCisjZGVmaW5lIFdNODkwM19NQ0xLX0RJVl8yIDEKKyNkZWZpbmUgV004OTAzX0NMS19TWVMgICAgMgorI2RlZmluZSBXTTg5MDNfQkNMSyAgICAgICAzCisjZGVmaW5lIFdNODkwM19MUkNMSyAgICAgIDQKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTg5MDNfU1dfUkVTRVRfQU5EX0lEICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTg5MDNfUkVWSVNJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTg5MDNfQklBU19DT05UUk9MXzAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBXTTg5MDNfVk1JRF9DT05UUk9MXzAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBXTTg5MDNfTUlDX0JJQVNfQ09OVFJPTF8wICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfREFDXzAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfQURDXzAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8wICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8xICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8yICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF8zICAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF80ICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF81ICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBXTTg5MDNfUE9XRVJfTUFOQUdFTUVOVF82ICAgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBXTTg5MDNfQ0xPQ0tfUkFURVNfMCAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBXTTg5MDNfQ0xPQ0tfUkFURVNfMSAgICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBXTTg5MDNfQ0xPQ0tfUkFURVNfMiAgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzEgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzIgICAgICAgICAgICAgICAgMHgxQQorI2RlZmluZSBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzMgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX0xFRlQgICAgICAgICAgMHgxRQorI2RlZmluZSBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX1JJR0hUICAgICAgICAgMHgxRgorI2RlZmluZSBXTTg5MDNfREFDX0RJR0lUQUxfMCAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTg5MDNfREFDX0RJR0lUQUxfMSAgICAgICAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBXTTg5MDNfQURDX0RJR0lUQUxfVk9MVU1FX0xFRlQgICAgICAgICAgMHgyNAorI2RlZmluZSBXTTg5MDNfQURDX0RJR0lUQUxfVk9MVU1FX1JJR0hUICAgICAgICAgMHgyNQorI2RlZmluZSBXTTg5MDNfQURDX0RJR0lUQUxfMCAgICAgICAgICAgICAgICAgICAgMHgyNgorI2RlZmluZSBXTTg5MDNfRElHSVRBTF9NSUNST1BIT05FXzAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBXTTg5MDNfRFJDXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXTTg5MDNfRFJDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBXTTg5MDNfRFJDXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBXTTg5MDNfRFJDXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8wICAgICAgICAgICAgMHgyQworI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCAgICAgICAgICAgMHgyRAorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfTEVGVF9JTlBVVF8xICAgICAgICAgICAgMHgyRQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfUklHSFRfSU5QVVRfMSAgICAgICAgICAgMHgyRgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfTEVGVF9NSVhfMCAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfUklHSFRfTUlYXzAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9MRUZUXzAgICAgICAgICAgMHgzNAorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9MRUZUXzEgICAgICAgICAgMHgzNQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9SSUdIVF8wICAgICAgICAgMHgzNgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfU1BLX01JWF9SSUdIVF8xICAgICAgICAgMHgzNworI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUMV9MRUZUICAgICAgICAgICAgICAgMHgzOQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUMV9SSUdIVCAgICAgICAgICAgICAgMHgzQQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUMl9MRUZUICAgICAgICAgICAgICAgMHgzQgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUMl9SSUdIVCAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUM19MRUZUICAgICAgICAgICAgICAgMHgzRQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUM19SSUdIVCAgICAgICAgICAgICAgMHgzRgorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfU1BLX09VVFBVVF9DT05UUk9MXzAgICAgMHg0MQorI2RlZmluZSBXTTg5MDNfRENfU0VSVk9fMCAgICAgICAgICAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBXTTg5MDNfRENfU0VSVk9fMiAgICAgICAgICAgICAgICAgICAgICAgMHg0NQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfSFBfMCAgICAgICAgICAgICAgICAgICAgMHg1QQorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfTElORU9VVF8wICAgICAgICAgICAgICAgMHg1RQorI2RlZmluZSBXTTg5MDNfQ0hBUkdFX1BVTVBfMCAgICAgICAgICAgICAgICAgICAgMHg2MgorI2RlZmluZSBXTTg5MDNfQ0xBU1NfV18wICAgICAgICAgICAgICAgICAgICAgICAgMHg2OAorI2RlZmluZSBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzAgICAgICAgICAgICAgICAgMHg2QworI2RlZmluZSBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzEgICAgICAgICAgICAgICAgMHg2RAorI2RlZmluZSBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzIgICAgICAgICAgICAgICAgMHg2RQorI2RlZmluZSBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzMgICAgICAgICAgICAgICAgMHg2RgorI2RlZmluZSBXTTg5MDNfV1JJVEVfU0VRVUVOQ0VSXzQgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAgMHg3MgorI2RlZmluZSBXTTg5MDNfR1BJT19DT05UUk9MXzEgICAgICAgICAgICAgICAgICAgMHg3NAorI2RlZmluZSBXTTg5MDNfR1BJT19DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHg3NQorI2RlZmluZSBXTTg5MDNfR1BJT19DT05UUk9MXzMgICAgICAgICAgICAgICAgICAgMHg3NgorI2RlZmluZSBXTTg5MDNfR1BJT19DT05UUk9MXzQgICAgICAgICAgICAgICAgICAgMHg3NworI2RlZmluZSBXTTg5MDNfR1BJT19DT05UUk9MXzUgICAgICAgICAgICAgICAgICAgMHg3OAorI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX1NUQVRVU18xICAgICAgICAgICAgICAgMHg3OQorI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX1NUQVRVU18xX01BU0sgICAgICAgICAgMHg3QQorI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX1BPTEFSSVRZXzEgICAgICAgICAgICAgMHg3QgorI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX0NPTlRST0wgICAgICAgICAgICAgICAgMHg3RQorI2RlZmluZSBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0VfVEVTVF8xICAgICAgICAgMHg4MQorI2RlZmluZSBXTTg5MDNfQ0hBUkdFX1BVTVBfVEVTVF8xICAgICAgICAgICAgICAgMHg5NQorI2RlZmluZSBXTTg5MDNfQ0xPQ0tfUkFURV9URVNUXzQgICAgICAgICAgICAgICAgMHhBNAorI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUUFVUX0JJQVNfMCAgICAgICAgICAgMHhBQworCisjZGVmaW5lIFdNODkwM19SRUdJU1RFUl9DT1VOVCAgICAgICAgICAgICAgICAgICA3NQorI2RlZmluZSBXTTg5MDNfTUFYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHhBQworCisvKgorICogRmllbGQgRGVmaW5pdGlvbnMuCisgKi8KKworLyoKKyAqIFIwICgweDAwKSAtIFNXIFJlc2V0IGFuZCBJRAorICovCisjZGVmaW5lIFdNODkwM19TV19SRVNFVF9ERVZfSUQxX01BU0sgICAgICAgICAgICAweEZGRkYgIC8qIFNXX1JFU0VUX0RFVl9JRDEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTAzX1NXX1JFU0VUX0RFVl9JRDFfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogU1dfUkVTRVRfREVWX0lEMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5MDNfU1dfUkVTRVRfREVWX0lEMV9XSURUSCAgICAgICAgICAgICAgIDE2ICAvKiBTV19SRVNFVF9ERVZfSUQxIC0gWzE1OjBdICovCisKKy8qCisgKiBSMSAoMHgwMSkgLSBSZXZpc2lvbiBOdW1iZXIKKyAqLworI2RlZmluZSBXTTg5MDNfQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBDSElQX1JFViAtIFszOjBdICovCisjZGVmaW5lIFdNODkwM19DSElQX1JFVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENISVBfUkVWIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTAzX0NISVBfUkVWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQ0hJUF9SRVYgLSBbMzowXSAqLworCisvKgorICogUjQgKDB4MDQpIC0gQmlhcyBDb250cm9sIDAKKyAqLworI2RlZmluZSBXTTg5MDNfUE9CQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODkwM19QT0JDVFJMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBPQkNUUkwgKi8KKyNkZWZpbmUgV004OTAzX1BPQkNUUkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUE9CQ1RSTCAqLworI2RlZmluZSBXTTg5MDNfUE9CQ1RSTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBQT0JDVFJMICovCisjZGVmaW5lIFdNODkwM19JU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIElTRUwgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfSVNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU0VMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX0lTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSVNFTCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19TVEFSVFVQX0JJQVNfRU5BICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFNUQVJUVVBfQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX1NUQVJUVVBfQklBU19FTkFfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogU1RBUlRVUF9CSUFTX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1RBUlRVUF9CSUFTX0VOQV9TSElGVCAgICAgICAgICAgICAgICAxICAvKiBTVEFSVFVQX0JJQVNfRU5BICovCisjZGVmaW5lIFdNODkwM19TVEFSVFVQX0JJQVNfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIFNUQVJUVVBfQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0JJQVNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0JJQVNfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0JJQVNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0JJQVNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQklBU19FTkEgKi8KKworLyoKKyAqIFI1ICgweDA1KSAtIFZNSUQgQ29udHJvbCAwCisgKi8KKyNkZWZpbmUgV004OTAzX1ZNSURfVElFX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogVk1JRF9USUVfRU5BICovCisjZGVmaW5lIFdNODkwM19WTUlEX1RJRV9FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwODAgIC8qIFZNSURfVElFX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9USUVfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICA3ICAvKiBWTUlEX1RJRV9FTkEgKi8KKyNkZWZpbmUgV004OTAzX1ZNSURfVElFX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogVk1JRF9USUVfRU5BICovCisjZGVmaW5lIFdNODkwM19CVUZJT19FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEJVRklPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQlVGSU9fRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBCVUZJT19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0JVRklPX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQlVGSU9fRU5BICovCisjZGVmaW5lIFdNODkwM19CVUZJT19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEJVRklPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9JT19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBWTUlEX0lPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9JT19FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBWTUlEX0lPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9JT19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBWTUlEX0lPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9JT19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBWTUlEX0lPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9TT0ZUX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDE4ICAvKiBWTUlEX1NPRlQgLSBbNDozXSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9TT0ZUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBWTUlEX1NPRlQgLSBbNDozXSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9TT0ZUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBWTUlEX1NPRlQgLSBbNDozXSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9SRVNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA2ICAvKiBWTUlEX1JFUyAtIFsyOjFdICovCisjZGVmaW5lIFdNODkwM19WTUlEX1JFU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZNSURfUkVTIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTAzX1ZNSURfUkVTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogVk1JRF9SRVMgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9CVUZfRU5BICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBWTUlEX0JVRl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX1ZNSURfQlVGX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVk1JRF9CVUZfRU5BICovCisjZGVmaW5lIFdNODkwM19WTUlEX0JVRl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIFZNSURfQlVGX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVk1JRF9CVUZfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBWTUlEX0JVRl9FTkEgKi8KKworI2RlZmluZSBXTTg5MDNfVk1JRF9SRVNfNTBLICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODkwM19WTUlEX1JFU18yNTBLICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgV004OTAzX1ZNSURfUkVTXzVLICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorCisvKgorICogUjYgKDB4MDYpIC0gTWljIEJpYXMgQ29udHJvbCAwCisgKi8KKyNkZWZpbmUgV004OTAzX01JQ0RFVF9IWVNUX0VOQSAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTUlDREVUX0hZU1RfRU5BICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfSFlTVF9FTkFfTUFTSyAgICAgICAgICAgICAweDAwODAgIC8qIE1JQ0RFVF9IWVNUX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0hZU1RfRU5BX1NISUZUICAgICAgICAgICAgICAgICA3ICAvKiBNSUNERVRfSFlTVF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0RFVF9IWVNUX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogTUlDREVUX0hZU1RfRU5BICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfVEhSX01BU0sgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIE1JQ0RFVF9USFIgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX1RIUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBNSUNERVRfVEhSIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTAzX01JQ0RFVF9USFJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUlDREVUX1RIUiAtIFs2OjRdICovCisjZGVmaW5lIFdNODkwM19NSUNTSE9SVF9USFJfTUFTSyAgICAgICAgICAgICAgICAweDAwMEMgIC8qIE1JQ1NIT1JUX1RIUiAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19NSUNTSE9SVF9USFJfU0hJRlQgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1JQ1NIT1JUX1RIUiAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19NSUNTSE9SVF9USFJfV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIE1JQ1NIT1JUX1RIUiAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0RFVF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0RFVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDREVUX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNERVRfRU5BICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RFVF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0JJQVNfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0JJQVNfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0JJQVNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDQklBU19FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JQ0JJQVNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQklBU19FTkEgKi8KKworLyoKKyAqIFI4ICgweDA4KSAtIEFuYWxvZ3VlIERBQyAwCisgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0JJQVNfU0VMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxOCAgLyogREFDQklBU19TRUwgLSBbNDozXSAqLworI2RlZmluZSBXTTg5MDNfREFDQklBU19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQUNCSUFTX1NFTCAtIFs0OjNdICovCisjZGVmaW5lIFdNODkwM19EQUNCSUFTX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERBQ0JJQVNfU0VMIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTAzX0RBQ1ZNSURfQklBU19TRUxfTUFTSyAgICAgICAgICAgIDB4MDAwNiAgLyogREFDVk1JRF9CSUFTX1NFTCAtIFsyOjFdICovCisjZGVmaW5lIFdNODkwM19EQUNWTUlEX0JJQVNfU0VMX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIERBQ1ZNSURfQklBU19TRUwgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5MDNfREFDVk1JRF9CSUFTX1NFTF9XSURUSCAgICAgICAgICAgICAgICAyICAvKiBEQUNWTUlEX0JJQVNfU0VMIC0gWzI6MV0gKi8KKworLyoKKyAqIFIxMCAoMHgwQSkgLSBBbmFsb2d1ZSBBREMgMAorICovCisjZGVmaW5lIFdNODkwM19BRENfT1NSMTI4ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ19PU1IxMjggKi8KKyNkZWZpbmUgV004OTAzX0FEQ19PU1IxMjhfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDX09TUjEyOCAqLworI2RlZmluZSBXTTg5MDNfQURDX09TUjEyOF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENfT1NSMTI4ICovCisjZGVmaW5lIFdNODkwM19BRENfT1NSMTI4X1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ19PU1IxMjggKi8KKworLyoKKyAqIFIxMiAoMHgwQykgLSBQb3dlciBNYW5hZ2VtZW50IDAKKyAqLworI2RlZmluZSBXTTg5MDNfSU5MX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTkxfRU5BICovCisjZGVmaW5lIFdNODkwM19JTkxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElOTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0lOTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5MX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSU5MX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTkxfRU5BICovCisjZGVmaW5lIFdNODkwM19JTlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElOUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0lOUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU5SX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSU5SX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTlJfRU5BICovCisjZGVmaW5lIFdNODkwM19JTlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOUl9FTkEgKi8KKworLyoKKyAqIFIxMyAoMHgwRCkgLSBQb3dlciBNYW5hZ2VtZW50IDEKKyAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUTF9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSVhPVVRMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSVhPVVRMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSVhPVVRMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSVhPVVRMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUUl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSVhPVVRSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSVhPVVRSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSVhPVVRSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUlYT1VUUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSVhPVVRSX0VOQSAqLworCisvKgorICogUjE0ICgweDBFKSAtIFBvd2VyIE1hbmFnZW1lbnQgMgorICovCisjZGVmaW5lIFdNODkwM19IUExfUEdBX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQTF9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUExfUEdBX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQTF9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUExfUEdBX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQTF9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUExfUEdBX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQTF9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUFJfUEdBX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQUl9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUFJfUEdBX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQUl9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUFJfUEdBX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEhQUl9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19IUFJfUEdBX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQUl9QR0FfRU5BICovCisKKy8qCisgKiBSMTUgKDB4MEYpIC0gUG93ZXIgTWFuYWdlbWVudCAzCisgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX1BHQV9FTkEgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTElORU9VVExfUEdBX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfUEdBX0VOQV9NQVNLICAgICAgICAgICAgMHgwMDAyICAvKiBMSU5FT1VUTF9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9QR0FfRU5BX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRMX1BHQV9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX1BHQV9FTkFfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogTElORU9VVExfUEdBX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfUEdBX0VOQSAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSU5FT1VUUl9QR0FfRU5BICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9QR0FfRU5BX01BU0sgICAgICAgICAgICAweDAwMDEgIC8qIExJTkVPVVRSX1BHQV9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSX1BHQV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogTElORU9VVFJfUEdBX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfUEdBX0VOQV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUUl9QR0FfRU5BICovCisKKy8qCisgKiBSMTYgKDB4MTApIC0gUG93ZXIgTWFuYWdlbWVudCA0CisgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS0xfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlYU1BLTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS0xfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlYU1BLTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlYU1BLTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlYU1BLTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS1JfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlYU1BLUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS1JfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlYU1BLUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlYU1BLUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX01JWFNQS1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlYU1BLUl9FTkEgKi8KKworLyoKKyAqIFIxNyAoMHgxMSkgLSBQb3dlciBNYW5hZ2VtZW50IDUKKyAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTUEtMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTUEtMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEtSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEtSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBTUEtSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtSX0VOQSAqLworCisvKgorICogUjE4ICgweDEyKSAtIFBvd2VyIE1hbmFnZW1lbnQgNgorICovCisjZGVmaW5lIFdNODkwM19EQUNMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERBQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERBQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19EQUNSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ0xfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFEQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ1JfRU5BICovCisjZGVmaW5lIFdNODkwM19BRENSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFEQ1JfRU5BICovCisKKy8qCisgKiBSMjAgKDB4MTQpIC0gQ2xvY2sgUmF0ZXMgMAorICovCisjZGVmaW5lIFdNODkwM19NQ0xLRElWMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1DTEtESVYyICovCisjZGVmaW5lIFdNODkwM19NQ0xLRElWMl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1DTEtESVYyICovCisjZGVmaW5lIFdNODkwM19NQ0xLRElWMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1DTEtESVYyICovCisjZGVmaW5lIFdNODkwM19NQ0xLRElWMl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1DTEtESVYyICovCisKKy8qCisgKiBSMjEgKDB4MTUpIC0gQ2xvY2sgUmF0ZXMgMQorICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDNDMDAgIC8qIENMS19TWVNfUkFURSAtIFsxMzoxMF0gKi8KKyNkZWZpbmUgV004OTAzX0NMS19TWVNfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAxMCAgLyogQ0xLX1NZU19SQVRFIC0gWzEzOjEwXSAqLworI2RlZmluZSBXTTg5MDNfQ0xLX1NZU19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICA0ICAvKiBDTEtfU1lTX1JBVEUgLSBbMTM6MTBdICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX01PREVfTUFTSyAgICAgICAgICAgICAgICAweDAzMDAgIC8qIENMS19TWVNfTU9ERSAtIFs5OjhdICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDggIC8qIENMS19TWVNfTU9ERSAtIFs5OjhdICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIENMS19TWVNfTU9ERSAtIFs5OjhdICovCisjZGVmaW5lIFdNODkwM19TQU1QTEVfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIFNBTVBMRV9SQVRFIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTAzX1NBTVBMRV9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogU0FNUExFX1JBVEUgLSBbMzowXSAqLworI2RlZmluZSBXTTg5MDNfU0FNUExFX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICA0ICAvKiBTQU1QTEVfUkFURSAtIFszOjBdICovCisKKy8qCisgKiBSMjIgKDB4MTYpIC0gQ2xvY2sgUmF0ZXMgMgorICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIENMS19TWVNfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIENMS19TWVNfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIENMS19TWVNfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfU1lTX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS19TWVNfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfRFNQX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIENMS19EU1BfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfRFNQX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIENMS19EU1BfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfRFNQX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS19EU1BfRU5BICovCisjZGVmaW5lIFdNODkwM19DTEtfRFNQX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS19EU1BfRU5BICovCisjZGVmaW5lIFdNODkwM19UT19FTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFRPX0VOQSAqLworI2RlZmluZSBXTTg5MDNfVE9fRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBUT19FTkEgKi8KKyNkZWZpbmUgV004OTAzX1RPX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogVE9fRU5BICovCisjZGVmaW5lIFdNODkwM19UT19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRPX0VOQSAqLworCisvKgorICogUjI0ICgweDE4KSAtIEF1ZGlvIEludGVyZmFjZSAwCisgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfREFUSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfREFUSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAxMiAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfREFUSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfREFUSU5WICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfREFUSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfREFUSU5WX1NISUZUICAgICAgICAgICAgICAgICAgICAxMSAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfREFUSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDUl9EQVRJTlYgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19CT09TVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDYwMCAgLyogREFDX0JPT1NUIC0gWzEwOjldICovCisjZGVmaW5lIFdNODkwM19EQUNfQk9PU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIERBQ19CT09TVCAtIFsxMDo5XSAqLworI2RlZmluZSBXTTg5MDNfREFDX0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEQUNfQk9PU1QgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTAzX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTAzX0xPT1BCQUNLX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTAzX0xPT1BCQUNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTAzX0xPT1BCQUNLX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGQURDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ0xfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGQURDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ0xfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgNyAgLyogQUlGQURDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ0xfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGQURDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ1JfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGQURDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ1JfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGQURDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ1JfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGQURDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ1JfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGQURDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGREFDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ0xfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGREFDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ0xfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgNSAgLyogQUlGREFDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ0xfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGREFDTF9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ1JfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGREFDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ1JfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGREFDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ1JfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUlGREFDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ1JfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGREFDUl9TUkMgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODkwM19BRENfQ09NUE1PREVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5MDNfQURDX0NPTVBNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19DT01QICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUE1PREUgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5MDNfREFDX0NPTVBNT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19DT01QTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODkwM19EQUNfQ09NUE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19DT01QTU9ERSAqLworCisvKgorICogUjI1ICgweDE5KSAtIEF1ZGlvIEludGVyZmFjZSAxCisgKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ19URE0gICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGREFDX1RETSAqLworI2RlZmluZSBXTTg5MDNfQUlGREFDX1RETV9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBSUZEQUNfVERNICovCisjZGVmaW5lIFdNODkwM19BSUZEQUNfVERNX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRkRBQ19URE0gKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ19URE1fV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGREFDX1RETSAqLworI2RlZmluZSBXTTg5MDNfQUlGREFDX1RETV9DSEFOICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUZEQUNfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTAzX0FJRkRBQ19URE1fQ0hBTl9NQVNLICAgICAgICAgICAgIDB4MTAwMCAgLyogQUlGREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODkwM19BSUZEQUNfVERNX0NIQU5fU0hJRlQgICAgICAgICAgICAgICAgMTIgIC8qIEFJRkRBQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg5MDNfQUlGREFDX1RETV9DSEFOX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBSUZEQUNfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ19URE0gICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQUlGQURDX1RETSAqLworI2RlZmluZSBXTTg5MDNfQUlGQURDX1RETV9NQVNLICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBSUZBRENfVERNICovCisjZGVmaW5lIFdNODkwM19BSUZBRENfVERNX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIEFJRkFEQ19URE0gKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ19URE1fV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGQURDX1RETSAqLworI2RlZmluZSBXTTg5MDNfQUlGQURDX1RETV9DSEFOICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBBSUZBRENfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTAzX0FJRkFEQ19URE1fQ0hBTl9NQVNLICAgICAgICAgICAgIDB4MDQwMCAgLyogQUlGQURDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODkwM19BSUZBRENfVERNX0NIQU5fU0hJRlQgICAgICAgICAgICAgICAgMTAgIC8qIEFJRkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg5MDNfQUlGQURDX1RETV9DSEFOX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBSUZBRENfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTAzX0xSQ0xLX0RJUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogTFJDTEtfRElSICovCisjZGVmaW5lIFdNODkwM19MUkNMS19ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIExSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5MDNfTFJDTEtfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBMUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTAzX0xSQ0xLX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFJDTEtfRElSICovCisjZGVmaW5lIFdNODkwM19BSUZfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg5MDNfQUlGX0JDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUZfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTAzX0FJRl9CQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgNyAgLyogQUlGX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODkwM19BSUZfQkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg5MDNfQkNMS19ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBCQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5MDNfQkNMS19ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBCQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5MDNfQkNMS19ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBCQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5MDNfQkNMS19ESVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBCQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5MDNfQUlGX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUZfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODkwM19BSUZfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRl9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTAzX0FJRl9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgNCAgLyogQUlGX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5MDNfQUlGX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUZfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODkwM19BSUZfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIEFJRl9XTCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19BSUZfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRl9XTCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19BSUZfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRl9XTCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19BSUZfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFJRl9GTVQgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfQUlGX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUZfRk1UIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTAzX0FJRl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGX0ZNVCAtIFsxOjBdICovCisKKy8qCisgKiBSMjYgKDB4MUEpIC0gQXVkaW8gSW50ZXJmYWNlIDIKKyAqLworI2RlZmluZSBXTTg5MDNfQkNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBCQ0xLX0RJViAtIFs0OjBdICovCisjZGVmaW5lIFdNODkwM19CQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEJDTEtfRElWIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTAzX0JDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQkNMS19ESVYgLSBbNDowXSAqLworCisvKgorICogUjI3ICgweDFCKSAtIEF1ZGlvIEludGVyZmFjZSAzCisgKi8KKyNkZWZpbmUgV004OTAzX0xSQ0xLX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDdGRiAgLyogTFJDTEtfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg5MDNfTFJDTEtfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMUkNMS19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODkwM19MUkNMS19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIExSQ0xLX1JBVEUgLSBbMTA6MF0gKi8KKworLyoKKyAqIFIzMCAoMHgxRSkgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTGVmdAorICovCisjZGVmaW5lIFdNODkwM19EQUNWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ1ZVICovCisjZGVmaW5lIFdNODkwM19EQUNWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIERBQ1ZVICovCisjZGVmaW5lIFdNODkwM19EQUNWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ1ZVICovCisjZGVmaW5lIFdNODkwM19EQUNWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ1ZVICovCisjZGVmaW5lIFdNODkwM19EQUNMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERBQ0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogREFDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5MDNfREFDTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBEQUNMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMzEgKDB4MUYpIC0gREFDIERpZ2l0YWwgVm9sdW1lIFJpZ2h0CisgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDVlUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogREFDUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5MDNfREFDUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQUNSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODkwM19EQUNSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERBQ1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzMiAoMHgyMCkgLSBEQUMgRGlnaXRhbCAwCisgKi8KKyNkZWZpbmUgV004OTAzX0FEQ0xfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MEYwMCAgLyogQURDTF9EQUNfU1ZPTCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfQURDTF9EQUNfU1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENMX0RBQ19TVk9MIC0gWzExOjhdICovCisjZGVmaW5lIFdNODkwM19BRENMX0RBQ19TVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDQgIC8qIEFEQ0xfREFDX1NWT0wgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTAzX0FEQ1JfREFDX1NWT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGMCAgLyogQURDUl9EQUNfU1ZPTCAtIFs3OjRdICovCisjZGVmaW5lIFdNODkwM19BRENSX0RBQ19TVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDQgIC8qIEFEQ1JfREFDX1NWT0wgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5MDNfQURDUl9EQUNfU1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA0ICAvKiBBRENSX0RBQ19TVk9MIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004OTAzX0FEQ19UT19EQUNMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwQyAgLyogQURDX1RPX0RBQ0wgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfQURDX1RPX0RBQ0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBBRENfVE9fREFDTCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19BRENfVE9fREFDTF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFEQ19UT19EQUNMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX0FEQ19UT19EQUNSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQURDX1RPX0RBQ1IgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfQURDX1RPX0RBQ1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENfVE9fREFDUiAtIFsxOjBdICovCisjZGVmaW5lIFdNODkwM19BRENfVE9fREFDUl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFEQ19UT19EQUNSIC0gWzE6MF0gKi8KKworLyoKKyAqIFIzMyAoMHgyMSkgLSBEQUMgRGlnaXRhbCAxCisgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NT05PICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NT05PX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NT05PX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NT05PX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTAzX0RBQ19TQl9GSUxUICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREFDX1NCX0ZJTFQgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19TQl9GSUxUX01BU0sgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogREFDX1NCX0ZJTFQgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19TQl9GSUxUX1NISUZUICAgICAgICAgICAgICAgICAgICAxMSAgLyogREFDX1NCX0ZJTFQgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19TQl9GSUxUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDX1NCX0ZJTFQgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NVVRFUkFURSAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODkwM19EQUNfTVVURVJBVEVfTUFTSyAgICAgICAgICAgICAgICAweDA0MDAgIC8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEVSQVRFX1NISUZUICAgICAgICAgICAgICAgICAgIDEwICAvKiBEQUNfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NVVRFUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODkwM19EQUNfTVVURU1PREUgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIERBQ19NVVRFTU9ERSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEVNT0RFX01BU0sgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBEQUNfTVVURU1PREUgKi8KKyNkZWZpbmUgV004OTAzX0RBQ19NVVRFTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgOSAgLyogREFDX01VVEVNT0RFICovCisjZGVmaW5lIFdNODkwM19EQUNfTVVURU1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERBQ19NVVRFTU9ERSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNfTVVURSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNfTVVURSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEQUNfTVVURSAqLworI2RlZmluZSBXTTg5MDNfREFDX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEQUNfTVVURSAqLworI2RlZmluZSBXTTg5MDNfREVFTVBIX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA2ICAvKiBERUVNUEggLSBbMjoxXSAqLworI2RlZmluZSBXTTg5MDNfREVFTVBIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBERUVNUEggLSBbMjoxXSAqLworI2RlZmluZSBXTTg5MDNfREVFTVBIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBERUVNUEggLSBbMjoxXSAqLworCisvKgorICogUjM2ICgweDI0KSAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMZWZ0CisgKi8KKyNkZWZpbmUgV004OTAzX0FEQ1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTAzX0FEQ1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTAzX0FEQ1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTAzX0FEQ1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDVlUgKi8KKyNkZWZpbmUgV004OTAzX0FEQ0xfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogQURDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5MDNfQURDTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODkwM19BRENMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFEQ0xfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNyAoMHgyNSkgLSBBREMgRGlnaXRhbCBWb2x1bWUgUmlnaHQKKyAqLworI2RlZmluZSBXTTg5MDNfQURDVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5MDNfQURDVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5MDNfQURDVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5MDNfQURDVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENWVSAqLworI2RlZmluZSBXTTg5MDNfQURDUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBBRENSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODkwM19BRENSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTAzX0FEQ1JfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQURDUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjM4ICgweDI2KSAtIEFEQyBEaWdpdGFsIDAKKyAqLworI2RlZmluZSBXTTg5MDNfQURDX0hQRl9DVVRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBBRENfSFBGX0NVVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODkwM19BRENfSFBGX0NVVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFEQ19IUEZfQ1VUIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTAzX0FEQ19IUEZfQ1VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogQURDX0hQRl9DVVQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5MDNfQURDX0hQRl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQURDX0hQRl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQURDX0hQRl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQURDX0hQRl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENfSFBGX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQURDTF9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDTF9EQVRJTlZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDTF9EQVRJTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDTF9EQVRJTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENMX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDUl9EQVRJTlYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDUl9EQVRJTlZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDUl9EQVRJTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBRENSX0RBVElOViAqLworI2RlZmluZSBXTTg5MDNfQURDUl9EQVRJTlZfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENSX0RBVElOViAqLworCisvKgorICogUjM5ICgweDI3KSAtIERpZ2l0YWwgTWljcm9waG9uZSAwCisgKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19NT0RFX1NFTCAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRElHTUlDX01PREVfU0VMICovCisjZGVmaW5lIFdNODkwM19ESUdNSUNfTU9ERV9TRUxfTUFTSyAgICAgICAgICAgICAweDAxMDAgIC8qIERJR01JQ19NT0RFX1NFTCAqLworI2RlZmluZSBXTTg5MDNfRElHTUlDX01PREVfU0VMX1NISUZUICAgICAgICAgICAgICAgICA4ICAvKiBESUdNSUNfTU9ERV9TRUwgKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19NT0RFX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogRElHTUlDX01PREVfU0VMICovCisjZGVmaW5lIFdNODkwM19ESUdNSUNfQ0xLX1NFTF9MX01BU0sgICAgICAgICAgICAweDAwQzAgIC8qIERJR01JQ19DTEtfU0VMX0wgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5MDNfRElHTUlDX0NMS19TRUxfTF9TSElGVCAgICAgICAgICAgICAgICA2ICAvKiBESUdNSUNfQ0xLX1NFTF9MIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19DTEtfU0VMX0xfV0lEVEggICAgICAgICAgICAgICAgMiAgLyogRElHTUlDX0NMS19TRUxfTCAtIFs3OjZdICovCisjZGVmaW5lIFdNODkwM19ESUdNSUNfQ0xLX1NFTF9SX01BU0sgICAgICAgICAgICAweDAwMzAgIC8qIERJR01JQ19DTEtfU0VMX1IgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5MDNfRElHTUlDX0NMS19TRUxfUl9TSElGVCAgICAgICAgICAgICAgICA0ICAvKiBESUdNSUNfQ0xLX1NFTF9SIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19DTEtfU0VMX1JfV0lEVEggICAgICAgICAgICAgICAgMiAgLyogRElHTUlDX0NMS19TRUxfUiAtIFs1OjRdICovCisjZGVmaW5lIFdNODkwM19ESUdNSUNfQ0xLX1NFTF9SVF9NQVNLICAgICAgICAgICAweDAwMEMgIC8qIERJR01JQ19DTEtfU0VMX1JUIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19DTEtfU0VMX1JUX1NISUZUICAgICAgICAgICAgICAgMiAgLyogRElHTUlDX0NMS19TRUxfUlQgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfRElHTUlDX0NMS19TRUxfUlRfV0lEVEggICAgICAgICAgICAgICAyICAvKiBESUdNSUNfQ0xLX1NFTF9SVCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19ESUdNSUNfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAweDAwMDMgIC8qIERJR01JQ19DTEtfU0VMIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTAzX0RJR01JQ19DTEtfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgMCAgLyogRElHTUlDX0NMS19TRUwgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfRElHTUlDX0NMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAyICAvKiBESUdNSUNfQ0xLX1NFTCAtIFsxOjBdICovCisKKy8qCisgKiBSNDAgKDB4MjgpIC0gRFJDIDAKKyAqLworI2RlZmluZSBXTTg5MDNfRFJDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBEUkNfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIERSQ19FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogRFJDX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfVEhSRVNIX0hZU1RfTUFTSyAgICAgICAgICAgICAweDE4MDAgIC8qIERSQ19USFJFU0hfSFlTVCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19USFJFU0hfSFlTVF9TSElGVCAgICAgICAgICAgICAgICAxMSAgLyogRFJDX1RIUkVTSF9IWVNUIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1RIUkVTSF9IWVNUX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBEUkNfVEhSRVNIX0hZU1QgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNODkwM19EUkNfU1RBUlRVUF9HQUlOX01BU0sgICAgICAgICAgICAweDA3QzAgIC8qIERSQ19TVEFSVFVQX0dBSU4gLSBbMTA6Nl0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19TVEFSVFVQX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgNiAgLyogRFJDX1NUQVJUVVBfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1NUQVJUVVBfR0FJTl9XSURUSCAgICAgICAgICAgICAgICA1ICAvKiBEUkNfU1RBUlRVUF9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNODkwM19EUkNfRkZfREVMQVkgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERSQ19GRl9ERUxBWSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0ZGX0RFTEFZX01BU0sgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEUkNfRkZfREVMQVkgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19GRl9ERUxBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgNSAgLyogRFJDX0ZGX0RFTEFZICovCisjZGVmaW5lIFdNODkwM19EUkNfRkZfREVMQVlfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERSQ19GRl9ERUxBWSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1NNT09USF9FTkEgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEUkNfU01PT1RIX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1NNT09USF9FTkFfTUFTSyAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEUkNfU01PT1RIX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1NNT09USF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAzICAvKiBEUkNfU01PT1RIX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1NNT09USF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBEUkNfU01PT1RIX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1FSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBEUkNfUVJfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfUVJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERSQ19RUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19RUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX1FSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1FSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNfUVJfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfQU5USUNMSVBfRU5BICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERSQ19BTlRJQ0xJUF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19BTlRJQ0xJUF9FTkFfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogRFJDX0FOVElDTElQX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0FOVElDTElQX0VOQV9TSElGVCAgICAgICAgICAgICAgICAxICAvKiBEUkNfQU5USUNMSVBfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfQU5USUNMSVBfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIERSQ19BTlRJQ0xJUF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19IWVNUX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRFJDX0hZU1RfRU5BICovCisjZGVmaW5lIFdNODkwM19EUkNfSFlTVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERSQ19IWVNUX0VOQSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0hZU1RfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBEUkNfSFlTVF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19IWVNUX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFJDX0hZU1RfRU5BICovCisKKy8qCisgKiBSNDEgKDB4MjkpIC0gRFJDIDEKKyAqLworI2RlZmluZSBXTTg5MDNfRFJDX0FUVEFDS19SQVRFX01BU0sgICAgICAgICAgICAgMHhGMDAwICAvKiBEUkNfQVRUQUNLX1JBVEUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODkwM19EUkNfQVRUQUNLX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgMTIgIC8qIERSQ19BVFRBQ0tfUkFURSAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19BVFRBQ0tfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgNCAgLyogRFJDX0FUVEFDS19SQVRFIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0RFQ0FZX1JBVEVfTUFTSyAgICAgICAgICAgICAgMHgwRjAwICAvKiBEUkNfREVDQVlfUkFURSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0RFQ0FZX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBEUkNfREVDQVlfUkFURSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX0RFQ0FZX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICA0ICAvKiBEUkNfREVDQVlfUkFURSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1RIUkVTSF9RUl9NQVNLICAgICAgICAgICAgICAgMHgwMEMwICAvKiBEUkNfVEhSRVNIX1FSIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19USFJFU0hfUVJfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogRFJDX1RIUkVTSF9RUiAtIFs3OjZdICovCisjZGVmaW5lIFdNODkwM19EUkNfVEhSRVNIX1FSX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19USFJFU0hfUVIgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1JBVEVfUVJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBEUkNfUkFURV9RUiAtIFs1OjRdICovCisjZGVmaW5lIFdNODkwM19EUkNfUkFURV9RUl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERSQ19SQVRFX1FSIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19SQVRFX1FSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX1JBVEVfUVIgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBEUkNfTUlOR0FJTiAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19EUkNfTUlOR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19NSU5HQUlOIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX01JTkdBSU4gLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfRFJDX01BWEdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBEUkNfTUFYR0FJTiAtIFsxOjBdICovCisjZGVmaW5lIFdNODkwM19EUkNfTUFYR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19NQVhHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX01BWEdBSU4gLSBbMTowXSAqLworCisvKgorICogUjQyICgweDJBKSAtIERSQyAyCisgKi8KKyNkZWZpbmUgV004OTAzX0RSQ19SMF9TTE9QRV9DT01QX01BU0sgICAgICAgICAgIDB4MDAzOCAgLyogRFJDX1IwX1NMT1BFX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1IwX1NMT1BFX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAzICAvKiBEUkNfUjBfU0xPUEVfQ09NUCAtIFs1OjNdICovCisjZGVmaW5lIFdNODkwM19EUkNfUjBfU0xPUEVfQ09NUF9XSURUSCAgICAgICAgICAgICAgIDMgIC8qIERSQ19SMF9TTE9QRV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19SMV9TTE9QRV9DT01QX01BU0sgICAgICAgICAgIDB4MDAwNyAgLyogRFJDX1IxX1NMT1BFX0NPTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1IxX1NMT1BFX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBEUkNfUjFfU0xPUEVfQ09NUCAtIFsyOjBdICovCisjZGVmaW5lIFdNODkwM19EUkNfUjFfU0xPUEVfQ09NUF9XSURUSCAgICAgICAgICAgICAgIDMgIC8qIERSQ19SMV9TTE9QRV9DT01QIC0gWzI6MF0gKi8KKworLyoKKyAqIFI0MyAoMHgyQikgLSBEUkMgMworICovCisjZGVmaW5lIFdNODkwM19EUkNfVEhSRVNIX0NPTVBfTUFTSyAgICAgICAgICAgICAweDA3RTAgIC8qIERSQ19USFJFU0hfQ09NUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5MDNfRFJDX1RIUkVTSF9DT01QX1NISUZUICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfVEhSRVNIX0NPTVAgLSBbMTA6NV0gKi8KKyNkZWZpbmUgV004OTAzX0RSQ19USFJFU0hfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgNiAgLyogRFJDX1RIUkVTSF9DT01QIC0gWzEwOjVdICovCisjZGVmaW5lIFdNODkwM19EUkNfQU1QX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMUYgIC8qIERSQ19BTVBfQ09NUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODkwM19EUkNfQU1QX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19BTVBfQ09NUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODkwM19EUkNfQU1QX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDUgIC8qIERSQ19BTVBfQ09NUCAtIFs0OjBdICovCisKKy8qCisgKiBSNDQgKDB4MkMpIC0gQW5hbG9ndWUgTGVmdCBJbnB1dCAwCisgKi8KKyNkZWZpbmUgV004OTAzX0xJTk1VVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElOTVVURSAqLworI2RlZmluZSBXTTg5MDNfTElOTVVURV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5NVVRFICovCisjZGVmaW5lIFdNODkwM19MSU5NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTk1VVEUgKi8KKyNkZWZpbmUgV004OTAzX0xJTk1VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTElOTVVURSAqLworI2RlZmluZSBXTTg5MDNfTElOX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBMSU5fVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTAzX0xJTl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTElOX1ZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODkwM19MSU5fVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExJTl9WT0wgLSBbNDowXSAqLworCisvKgorICogUjQ1ICgweDJEKSAtIEFuYWxvZ3VlIFJpZ2h0IElucHV0IDAKKyAqLworI2RlZmluZSBXTTg5MDNfUklOTVVURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBSSU5NVVRFICovCisjZGVmaW5lIFdNODkwM19SSU5NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFJJTk1VVEUgKi8KKyNkZWZpbmUgV004OTAzX1JJTk1VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogUklOTVVURSAqLworI2RlZmluZSBXTTg5MDNfUklOTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSSU5NVVRFICovCisjZGVmaW5lIFdNODkwM19SSU5fVk9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMUYgIC8qIFJJTl9WT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg5MDNfUklOX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBSSU5fVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTAzX1JJTl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogUklOX1ZPTCAtIFs0OjBdICovCisKKy8qCisgKiBSNDYgKDB4MkUpIC0gQW5hbG9ndWUgTGVmdCBJbnB1dCAxCisgKi8KKyNkZWZpbmUgV004OTAzX0lOTF9DTV9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU5MX0NNX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSU5MX0NNX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBJTkxfQ01fRU5BICovCisjZGVmaW5lIFdNODkwM19JTkxfQ01fRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIElOTF9DTV9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0lOTF9DTV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5MX0NNX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTF9JUF9TRUxfTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBMX0lQX1NFTF9OIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTAzX0xfSVBfU0VMX05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTF9JUF9TRUxfTiAtIFs1OjRdICovCisjZGVmaW5lIFdNODkwM19MX0lQX1NFTF9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExfSVBfU0VMX04gLSBbNTo0XSAqLworI2RlZmluZSBXTTg5MDNfTF9JUF9TRUxfUF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBMX0lQX1NFTF9QIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX0xfSVBfU0VMX1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTF9JUF9TRUxfUCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19MX0lQX1NFTF9QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExfSVBfU0VMX1AgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfTF9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBMX01PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfTF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMX01PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfTF9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBMX01PREUgLSBbMTowXSAqLworCisvKgorICogUjQ3ICgweDJGKSAtIEFuYWxvZ3VlIFJpZ2h0IElucHV0IDEKKyAqLworI2RlZmluZSBXTTg5MDNfSU5SX0NNX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBJTlJfQ01fRU5BICovCisjZGVmaW5lIFdNODkwM19JTlJfQ01fRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElOUl9DTV9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0lOUl9DTV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNiAgLyogSU5SX0NNX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSU5SX0NNX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTlJfQ01fRU5BICovCisjZGVmaW5lIFdNODkwM19SX0lQX1NFTF9OX01BU0sgICAgICAgICAgICAgICAgICAweDAwMzAgIC8qIFJfSVBfU0VMX04gLSBbNTo0XSAqLworI2RlZmluZSBXTTg5MDNfUl9JUF9TRUxfTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBSX0lQX1NFTF9OIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTAzX1JfSVBfU0VMX05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgMiAgLyogUl9JUF9TRUxfTiAtIFs1OjRdICovCisjZGVmaW5lIFdNODkwM19SX0lQX1NFTF9QX01BU0sgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIFJfSVBfU0VMX1AgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5MDNfUl9JUF9TRUxfUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBSX0lQX1NFTF9QIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTAzX1JfSVBfU0VMX1BfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMiAgLyogUl9JUF9TRUxfUCAtIFszOjJdICovCisjZGVmaW5lIFdNODkwM19SX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIFJfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODkwM19SX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODkwM19SX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFJfTU9ERSAtIFsxOjBdICovCisKKy8qCisgKiBSNTAgKDB4MzIpIC0gQW5hbG9ndWUgTGVmdCBNaXggMAorICovCisjZGVmaW5lIFdNODkwM19EQUNMX1RPX01JWE9VVEwgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfVE9fTUlYT1VUTCAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhPVVRMX01BU0sgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNMX1RPX01JWE9VVEwgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVE9fTUlYT1VUTF9TSElGVCAgICAgICAgICAgICAgICAgMyAgLyogREFDTF9UT19NSVhPVVRMICovCisjZGVmaW5lIFdNODkwM19EQUNMX1RPX01JWE9VVExfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfVE9fTUlYT1VUTCAqLworI2RlZmluZSBXTTg5MDNfREFDUl9UT19NSVhPVVRMICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBEQUNSX1RPX01JWE9VVEwgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYT1VUTF9NQVNLICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDUl9UT19NSVhPVVRMICovCisjZGVmaW5lIFdNODkwM19EQUNSX1RPX01JWE9VVExfU0hJRlQgICAgICAgICAgICAgICAgIDIgIC8qIERBQ1JfVE9fTUlYT1VUTCAqLworI2RlZmluZSBXTTg5MDNfREFDUl9UT19NSVhPVVRMX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBEQUNSX1RPX01JWE9VVEwgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfVE9fTUlYT1VUTCAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQllQQVNTTF9UT19NSVhPVVRMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWE9VVExfTUFTSyAgICAgICAgICAweDAwMDIgIC8qIEJZUEFTU0xfVE9fTUlYT1VUTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9UT19NSVhPVVRMX1NISUZUICAgICAgICAgICAgICAxICAvKiBCWVBBU1NMX1RPX01JWE9VVEwgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfVE9fTUlYT1VUTF9XSURUSCAgICAgICAgICAgICAgMSAgLyogQllQQVNTTF9UT19NSVhPVVRMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX1RPX01JWE9VVEwgICAgICAgICAgICAgICAweDAwMDEgIC8qIEJZUEFTU1JfVE9fTUlYT1VUTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhPVVRMX01BU0sgICAgICAgICAgMHgwMDAxICAvKiBCWVBBU1NSX1RPX01JWE9VVEwgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfVE9fTUlYT1VUTF9TSElGVCAgICAgICAgICAgICAgMCAgLyogQllQQVNTUl9UT19NSVhPVVRMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX1RPX01JWE9VVExfV0lEVEggICAgICAgICAgICAgIDEgIC8qIEJZUEFTU1JfVE9fTUlYT1VUTCAqLworCisvKgorICogUjUxICgweDMzKSAtIEFuYWxvZ3VlIFJpZ2h0IE1peCAwCisgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVE9fTUlYT1VUUiAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogREFDTF9UT19NSVhPVVRSICovCisjZGVmaW5lIFdNODkwM19EQUNMX1RPX01JWE9VVFJfTUFTSyAgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfVE9fTUlYT1VUUiAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhPVVRSX1NISUZUICAgICAgICAgICAgICAgICAzICAvKiBEQUNMX1RPX01JWE9VVFIgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVE9fTUlYT1VUUl9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogREFDTF9UT19NSVhPVVRSICovCisjZGVmaW5lIFdNODkwM19EQUNSX1RPX01JWE9VVFIgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfVE9fTUlYT1VUUiAqLworI2RlZmluZSBXTTg5MDNfREFDUl9UT19NSVhPVVRSX01BU0sgICAgICAgICAgICAgMHgwMDA0ICAvKiBEQUNSX1RPX01JWE9VVFIgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYT1VUUl9TSElGVCAgICAgICAgICAgICAgICAgMiAgLyogREFDUl9UT19NSVhPVVRSICovCisjZGVmaW5lIFdNODkwM19EQUNSX1RPX01JWE9VVFJfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JfVE9fTUlYT1VUUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9UT19NSVhPVVRSICAgICAgICAgICAgICAgMHgwMDAyICAvKiBCWVBBU1NMX1RPX01JWE9VVFIgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfVE9fTUlYT1VUUl9NQVNLICAgICAgICAgIDB4MDAwMiAgLyogQllQQVNTTF9UT19NSVhPVVRSICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWE9VVFJfU0hJRlQgICAgICAgICAgICAgIDEgIC8qIEJZUEFTU0xfVE9fTUlYT1VUUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9UT19NSVhPVVRSX1dJRFRIICAgICAgICAgICAgICAxICAvKiBCWVBBU1NMX1RPX01JWE9VVFIgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfVE9fTUlYT1VUUiAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQllQQVNTUl9UT19NSVhPVVRSICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX1RPX01JWE9VVFJfTUFTSyAgICAgICAgICAweDAwMDEgIC8qIEJZUEFTU1JfVE9fTUlYT1VUUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhPVVRSX1NISUZUICAgICAgICAgICAgICAwICAvKiBCWVBBU1NSX1RPX01JWE9VVFIgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfVE9fTUlYT1VUUl9XSURUSCAgICAgICAgICAgICAgMSAgLyogQllQQVNTUl9UT19NSVhPVVRSICovCisKKy8qCisgKiBSNTIgKDB4MzQpIC0gQW5hbG9ndWUgU3BrIE1peCBMZWZ0IDAKKyAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhTUEtMICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNMX1RPX01JWFNQS0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVE9fTUlYU1BLTF9NQVNLICAgICAgICAgICAgIDB4MDAwOCAgLyogREFDTF9UT19NSVhTUEtMICovCisjZGVmaW5lIFdNODkwM19EQUNMX1RPX01JWFNQS0xfU0hJRlQgICAgICAgICAgICAgICAgIDMgIC8qIERBQ0xfVE9fTUlYU1BLTCAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhTUEtMX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBEQUNMX1RPX01JWFNQS0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYU1BLTCAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDUl9UT19NSVhTUEtMICovCisjZGVmaW5lIFdNODkwM19EQUNSX1RPX01JWFNQS0xfTUFTSyAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfVE9fTUlYU1BLTCAqLworI2RlZmluZSBXTTg5MDNfREFDUl9UT19NSVhTUEtMX1NISUZUICAgICAgICAgICAgICAgICAyICAvKiBEQUNSX1RPX01JWFNQS0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYU1BLTF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogREFDUl9UT19NSVhTUEtMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWFNQS0wgICAgICAgICAgICAgICAweDAwMDIgIC8qIEJZUEFTU0xfVE9fTUlYU1BLTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9UT19NSVhTUEtMX01BU0sgICAgICAgICAgMHgwMDAyICAvKiBCWVBBU1NMX1RPX01JWFNQS0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfVE9fTUlYU1BLTF9TSElGVCAgICAgICAgICAgICAgMSAgLyogQllQQVNTTF9UT19NSVhTUEtMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWFNQS0xfV0lEVEggICAgICAgICAgICAgIDEgIC8qIEJZUEFTU0xfVE9fTUlYU1BLTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhTUEtMICAgICAgICAgICAgICAgMHgwMDAxICAvKiBCWVBBU1NSX1RPX01JWFNQS0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfVE9fTUlYU1BLTF9NQVNLICAgICAgICAgIDB4MDAwMSAgLyogQllQQVNTUl9UT19NSVhTUEtMICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX1RPX01JWFNQS0xfU0hJRlQgICAgICAgICAgICAgIDAgIC8qIEJZUEFTU1JfVE9fTUlYU1BLTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhTUEtMX1dJRFRIICAgICAgICAgICAgICAxICAvKiBCWVBBU1NSX1RPX01JWFNQS0wgKi8KKworLyoKKyAqIFI1MyAoMHgzNSkgLSBBbmFsb2d1ZSBTcGsgTWl4IExlZnQgMQorICovCisjZGVmaW5lIFdNODkwM19EQUNMX01JWFNQS0xfVk9MICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfTUlYU1BLTF9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfTUlYU1BLTF9WT0xfTUFTSyAgICAgICAgICAgIDB4MDAwOCAgLyogREFDTF9NSVhTUEtMX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfREFDTF9NSVhTUEtMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAzICAvKiBEQUNMX01JWFNQS0xfVk9MICovCisjZGVmaW5lIFdNODkwM19EQUNMX01JWFNQS0xfVk9MX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIERBQ0xfTUlYU1BLTF9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfTUlYU1BLTF9WT0wgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDUl9NSVhTUEtMX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfREFDUl9NSVhTUEtMX1ZPTF9NQVNLICAgICAgICAgICAgMHgwMDA0ICAvKiBEQUNSX01JWFNQS0xfVk9MICovCisjZGVmaW5lIFdNODkwM19EQUNSX01JWFNQS0xfVk9MX1NISUZUICAgICAgICAgICAgICAgIDIgIC8qIERBQ1JfTUlYU1BLTF9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfTUlYU1BLTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogREFDUl9NSVhTUEtMX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9NSVhTUEtMX1ZPTCAgICAgICAgICAgICAgMHgwMDAyICAvKiBCWVBBU1NMX01JWFNQS0xfVk9MICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX01JWFNQS0xfVk9MX01BU0sgICAgICAgICAweDAwMDIgIC8qIEJZUEFTU0xfTUlYU1BLTF9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfTUlYU1BLTF9WT0xfU0hJRlQgICAgICAgICAgICAgMSAgLyogQllQQVNTTF9NSVhTUEtMX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9NSVhTUEtMX1ZPTF9XSURUSCAgICAgICAgICAgICAxICAvKiBCWVBBU1NMX01JWFNQS0xfVk9MICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX01JWFNQS0xfVk9MICAgICAgICAgICAgICAweDAwMDEgIC8qIEJZUEFTU1JfTUlYU1BLTF9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfTUlYU1BLTF9WT0xfTUFTSyAgICAgICAgIDB4MDAwMSAgLyogQllQQVNTUl9NSVhTUEtMX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9NSVhTUEtMX1ZPTF9TSElGVCAgICAgICAgICAgICAwICAvKiBCWVBBU1NSX01JWFNQS0xfVk9MICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX01JWFNQS0xfVk9MX1dJRFRIICAgICAgICAgICAgIDEgIC8qIEJZUEFTU1JfTUlYU1BLTF9WT0wgKi8KKworLyoKKyAqIFI1NCAoMHgzNikgLSBBbmFsb2d1ZSBTcGsgTWl4IFJpZ2h0IDAKKyAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhTUEtSICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNMX1RPX01JWFNQS1IgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfVE9fTUlYU1BLUl9NQVNLICAgICAgICAgICAgIDB4MDAwOCAgLyogREFDTF9UT19NSVhTUEtSICovCisjZGVmaW5lIFdNODkwM19EQUNMX1RPX01JWFNQS1JfU0hJRlQgICAgICAgICAgICAgICAgIDMgIC8qIERBQ0xfVE9fTUlYU1BLUiAqLworI2RlZmluZSBXTTg5MDNfREFDTF9UT19NSVhTUEtSX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBEQUNMX1RPX01JWFNQS1IgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYU1BLUiAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogREFDUl9UT19NSVhTUEtSICovCisjZGVmaW5lIFdNODkwM19EQUNSX1RPX01JWFNQS1JfTUFTSyAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfVE9fTUlYU1BLUiAqLworI2RlZmluZSBXTTg5MDNfREFDUl9UT19NSVhTUEtSX1NISUZUICAgICAgICAgICAgICAgICAyICAvKiBEQUNSX1RPX01JWFNQS1IgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfVE9fTUlYU1BLUl9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogREFDUl9UT19NSVhTUEtSICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWFNQS1IgICAgICAgICAgICAgICAweDAwMDIgIC8qIEJZUEFTU0xfVE9fTUlYU1BLUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9UT19NSVhTUEtSX01BU0sgICAgICAgICAgMHgwMDAyICAvKiBCWVBBU1NMX1RPX01JWFNQS1IgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfVE9fTUlYU1BLUl9TSElGVCAgICAgICAgICAgICAgMSAgLyogQllQQVNTTF9UT19NSVhTUEtSICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX1RPX01JWFNQS1JfV0lEVEggICAgICAgICAgICAgIDEgIC8qIEJZUEFTU0xfVE9fTUlYU1BLUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhTUEtSICAgICAgICAgICAgICAgMHgwMDAxICAvKiBCWVBBU1NSX1RPX01JWFNQS1IgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfVE9fTUlYU1BLUl9NQVNLICAgICAgICAgIDB4MDAwMSAgLyogQllQQVNTUl9UT19NSVhTUEtSICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX1RPX01JWFNQS1JfU0hJRlQgICAgICAgICAgICAgIDAgIC8qIEJZUEFTU1JfVE9fTUlYU1BLUiAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9UT19NSVhTUEtSX1dJRFRIICAgICAgICAgICAgICAxICAvKiBCWVBBU1NSX1RPX01JWFNQS1IgKi8KKworLyoKKyAqIFI1NSAoMHgzNykgLSBBbmFsb2d1ZSBTcGsgTWl4IFJpZ2h0IDEKKyAqLworI2RlZmluZSBXTTg5MDNfREFDTF9NSVhTUEtSX1ZPTCAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEQUNMX01JWFNQS1JfVk9MICovCisjZGVmaW5lIFdNODkwM19EQUNMX01JWFNQS1JfVk9MX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIERBQ0xfTUlYU1BLUl9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ0xfTUlYU1BLUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogREFDTF9NSVhTUEtSX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfREFDTF9NSVhTUEtSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBEQUNMX01JWFNQS1JfVk9MICovCisjZGVmaW5lIFdNODkwM19EQUNSX01JWFNQS1JfVk9MICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ1JfTUlYU1BLUl9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0RBQ1JfTUlYU1BLUl9WT0xfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogREFDUl9NSVhTUEtSX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfREFDUl9NSVhTUEtSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBEQUNSX01JWFNQS1JfVk9MICovCisjZGVmaW5lIFdNODkwM19EQUNSX01JWFNQS1JfVk9MX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIERBQ1JfTUlYU1BLUl9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfTUlYU1BLUl9WT0wgICAgICAgICAgICAgIDB4MDAwMiAgLyogQllQQVNTTF9NSVhTUEtSX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTTF9NSVhTUEtSX1ZPTF9NQVNLICAgICAgICAgMHgwMDAyICAvKiBCWVBBU1NMX01JWFNQS1JfVk9MICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NMX01JWFNQS1JfVk9MX1NISUZUICAgICAgICAgICAgIDEgIC8qIEJZUEFTU0xfTUlYU1BLUl9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU0xfTUlYU1BLUl9WT0xfV0lEVEggICAgICAgICAgICAgMSAgLyogQllQQVNTTF9NSVhTUEtSX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9NSVhTUEtSX1ZPTCAgICAgICAgICAgICAgMHgwMDAxICAvKiBCWVBBU1NSX01JWFNQS1JfVk9MICovCisjZGVmaW5lIFdNODkwM19CWVBBU1NSX01JWFNQS1JfVk9MX01BU0sgICAgICAgICAweDAwMDEgIC8qIEJZUEFTU1JfTUlYU1BLUl9WT0wgKi8KKyNkZWZpbmUgV004OTAzX0JZUEFTU1JfTUlYU1BLUl9WT0xfU0hJRlQgICAgICAgICAgICAgMCAgLyogQllQQVNTUl9NSVhTUEtSX1ZPTCAqLworI2RlZmluZSBXTTg5MDNfQllQQVNTUl9NSVhTUEtSX1ZPTF9XSURUSCAgICAgICAgICAgICAxICAvKiBCWVBBU1NSX01JWFNQS1JfVk9MICovCisKKy8qCisgKiBSNTcgKDB4MzkpIC0gQW5hbG9ndWUgT1VUMSBMZWZ0CisgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSFBMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSFBMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSFBMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0hQT1VUVlUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSFBPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBIUE9VVFZVICovCisjZGVmaW5lIFdNODkwM19IUE9VVFZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEhQT1VUVlUgKi8KKyNkZWZpbmUgV004OTAzX0hQT1VUVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRMWkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBIUE9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRMWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBIUE9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRMWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBIUE9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRMWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUE9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBIUE9VVExfVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTAzX0hQT1VUTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSFBPVVRMX1ZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODkwM19IUE9VVExfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEhQT1VUTF9WT0wgLSBbNTowXSAqLworCisvKgorICogUjU4ICgweDNBKSAtIEFuYWxvZ3VlIE9VVDEgUmlnaHQKKyAqLworI2RlZmluZSBXTTg5MDNfSFBSX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBIUFJfTVVURSAqLworI2RlZmluZSBXTTg5MDNfSFBSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBIUFJfTVVURSAqLworI2RlZmluZSBXTTg5MDNfSFBSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBIUFJfTVVURSAqLworI2RlZmluZSBXTTg5MDNfSFBSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUFJfTVVURSAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRWVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBIUE9VVFZVICovCisjZGVmaW5lIFdNODkwM19IUE9VVFZVX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhQT1VUVlUgKi8KKyNkZWZpbmUgV004OTAzX0hQT1VUVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSFBPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUE9VVFZVICovCisjZGVmaW5lIFdNODkwM19IUE9VVFJaQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEhQT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19IUE9VVFJaQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEhQT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19IUE9VVFJaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEhQT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19IUE9VVFJaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19IUE9VVFJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEhQT1VUUl9WT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5MDNfSFBPVVRSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBIUE9VVFJfVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTAzX0hQT1VUUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgNiAgLyogSFBPVVRSX1ZPTCAtIFs1OjBdICovCisKKy8qCisgKiBSNTkgKDB4M0IpIC0gQW5hbG9ndWUgT1VUMiBMZWZ0CisgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX01VVEUgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTElORU9VVExfTVVURSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfTVVURV9NQVNLICAgICAgICAgICAgICAgMHgwMTAwICAvKiBMSU5FT1VUTF9NVVRFICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgIDggIC8qIExJTkVPVVRMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogTElORU9VVExfTVVURSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFZVICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FT1VUVlUgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRWVV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElORU9VVFZVICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTkVPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUVlUgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMWkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTElORU9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExaQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSU5FT1VUTFpDICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTFpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIExJTkVPVVRMWkMgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTElORU9VVExaQyAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBMSU5FT1VUTF9WT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBMSU5FT1VUTF9WT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBMSU5FT1VUTF9WT0wgLSBbNTowXSAqLworCisvKgorICogUjYwICgweDNDKSAtIEFuYWxvZ3VlIE9VVDIgUmlnaHQKKyAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfTVVURSAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBMSU5FT1VUUl9NVVRFICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9NVVRFX01BU0sgICAgICAgICAgICAgICAweDAxMDAgIC8qIExJTkVPVVRSX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgOCAgLyogTElORU9VVFJfTVVURSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUUl9NVVRFICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUVlUgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIExJTkVPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFZVX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBMSU5FT1VUVlUgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTElORU9VVFZVICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRWVSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJaQyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBMSU5FT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUlpDX01BU0sgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJTkVPVVRSWkMgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTElORU9VVFJaQyAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUUlpDICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIExJTkVPVVRSX1ZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIExJTkVPVVRSX1ZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIExJTkVPVVRSX1ZPTCAtIFs1OjBdICovCisKKy8qCisgKiBSNjIgKDB4M0UpIC0gQW5hbG9ndWUgT1VUMyBMZWZ0CisgKi8KKyNkZWZpbmUgV004OTAzX1NQS0xfTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLTF9NVVRFICovCisjZGVmaW5lIFdNODkwM19TUEtMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNQS0xfTVVURSAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBTUEtMX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX1NQS0xfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLTF9NVVRFICovCisjZGVmaW5lIFdNODkwM19TUEtWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFNQS1ZVICovCisjZGVmaW5lIFdNODkwM19TUEtWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFNQS1ZVICovCisjZGVmaW5lIFdNODkwM19TUEtWVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFNQS1ZVICovCisjZGVmaW5lIFdNODkwM19TUEtWVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQS1ZVICovCisjZGVmaW5lIFdNODkwM19TUEtMWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNQS0xaQyAqLworI2RlZmluZSBXTTg5MDNfU1BLTFpDX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBTUEtMWkMgKi8KKyNkZWZpbmUgV004OTAzX1NQS0xaQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogU1BLTFpDICovCisjZGVmaW5lIFdNODkwM19TUEtMWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQS0xaQyAqLworI2RlZmluZSBXTTg5MDNfU1BLTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBTUEtMX1ZPTCAtIFs1OjBdICovCisjZGVmaW5lIFdNODkwM19TUEtMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNQS0xfVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTAzX1NQS0xfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogU1BLTF9WT0wgLSBbNTowXSAqLworCisvKgorICogUjYzICgweDNGKSAtIEFuYWxvZ3VlIE9VVDMgUmlnaHQKKyAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBTUEtSX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1JfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLUl9NVVRFICovCisjZGVmaW5lIFdNODkwM19TUEtSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIFNQS1JfTVVURSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtSX01VVEUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogU1BLVlUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogU1BLVlUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogU1BLVlUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLVlUgKi8KKyNkZWZpbmUgV004OTAzX1NQS1JaQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU1BLUlpDICovCisjZGVmaW5lIFdNODkwM19TUEtSWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNQS1JaQyAqLworI2RlZmluZSBXTTg5MDNfU1BLUlpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBTUEtSWkMgKi8KKyNkZWZpbmUgV004OTAzX1NQS1JaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLUlpDICovCisjZGVmaW5lIFdNODkwM19TUEtSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIFNQS1JfVk9MIC0gWzU6MF0gKi8KKyNkZWZpbmUgV004OTAzX1NQS1JfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogU1BLUl9WT0wgLSBbNTowXSAqLworI2RlZmluZSBXTTg5MDNfU1BLUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBTUEtSX1ZPTCAtIFs1OjBdICovCisKKy8qCisgKiBSNjUgKDB4NDEpIC0gQW5hbG9ndWUgU1BLIE91dHB1dCBDb250cm9sIDAKKyAqLworI2RlZmluZSBXTTg5MDNfU1BLX0RJU0NIQVJHRSAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBTUEtfRElTQ0hBUkdFICovCisjZGVmaW5lIFdNODkwM19TUEtfRElTQ0hBUkdFX01BU0sgICAgICAgICAgICAgICAweDAwMDIgIC8qIFNQS19ESVNDSEFSR0UgKi8KKyNkZWZpbmUgV004OTAzX1NQS19ESVNDSEFSR0VfU0hJRlQgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLX0RJU0NIQVJHRSAqLworI2RlZmluZSBXTTg5MDNfU1BLX0RJU0NIQVJHRV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBTUEtfRElTQ0hBUkdFICovCisjZGVmaW5lIFdNODkwM19WUk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFZST0kgKi8KKyNkZWZpbmUgV004OTAzX1ZST0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVlJPSSAqLworI2RlZmluZSBXTTg5MDNfVlJPSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBWUk9JICovCisjZGVmaW5lIFdNODkwM19WUk9JX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZST0kgKi8KKworLyoKKyAqIFI2NyAoMHg0MykgLSBEQyBTZXJ2byAwCisgKi8KKyNkZWZpbmUgV004OTAzX0RDU19NQVNURVJfRU5BICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRENTX01BU1RFUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RDU19NQVNURVJfRU5BX01BU0sgICAgICAgICAgICAgIDB4MDAxMCAgLyogRENTX01BU1RFUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RDU19NQVNURVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgNCAgLyogRENTX01BU1RFUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RDU19NQVNURVJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogRENTX01BU1RFUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0RDU19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogRENTX0VOQSAtIFszOjBdICovCisjZGVmaW5lIFdNODkwM19EQ1NfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERDU19FTkEgLSBbMzowXSAqLworI2RlZmluZSBXTTg5MDNfRENTX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEQ1NfRU5BIC0gWzM6MF0gKi8KKworLyoKKyAqIFI2OSAoMHg0NSkgLSBEQyBTZXJ2byAyCisgKi8KKyNkZWZpbmUgV004OTAzX0RDU19NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogRENTX01PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg5MDNfRENTX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEQ1NfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODkwM19EQ1NfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERDU19NT0RFIC0gWzE6MF0gKi8KKworLyoKKyAqIFI5MCAoMHg1QSkgLSBBbmFsb2d1ZSBIUCAwCisgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9STVZfU0hPUlQgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSFBMX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfSFBMX1JNVl9TSE9SVF9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBIUExfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19IUExfUk1WX1NIT1JUX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEhQTF9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9STVZfU0hPUlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogSFBMX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfSFBMX0VOQV9PVVRQICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBIUExfRU5BX09VVFAgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfT1VUUF9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSFBMX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19IUExfRU5BX09VVFBfU0hJRlQgICAgICAgICAgICAgICAgICAgIDYgIC8qIEhQTF9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfSFBMX0VOQV9PVVRQX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBIUExfRU5BX09VVFAgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfRExZICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSFBMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfRExZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSFBMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfRExZX1NISUZUICAgICAgICAgICAgICAgICAgICAgNSAgLyogSFBMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfRExZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSFBMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSFBMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBIUExfRU5BICovCisjZGVmaW5lIFdNODkwM19IUExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEhQTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0hQTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSFBSX1JNVl9TSE9SVCAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBIUFJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19IUFJfUk1WX1NIT1JUX01BU0sgICAgICAgICAgICAgICAweDAwMDggIC8qIEhQUl9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTAzX0hQUl9STVZfU0hPUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMyAgLyogSFBSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfSFBSX1JNVl9TSE9SVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBIUFJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19IUFJfRU5BX09VVFAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhQUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9PVVRQX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBIUFJfRU5BX09VVFAgKi8KKyNkZWZpbmUgV004OTAzX0hQUl9FTkFfT1VUUF9TSElGVCAgICAgICAgICAgICAgICAgICAgMiAgLyogSFBSX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19IUFJfRU5BX09VVFBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9ETFkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBIUFJfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9ETFlfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBIUFJfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9ETFlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUFJfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9ETFlfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBIUFJfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBIUFJfRU5BICovCisjZGVmaW5lIFdNODkwM19IUFJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0hQUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSFBSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfSFBSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUFJfRU5BICovCisKKy8qCisgKiBSOTQgKDB4NUUpIC0gQW5hbG9ndWUgTGluZW91dCAwCisgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX1JNVl9TSE9SVCAgICAgICAgICAgICAgIDB4MDA4MCAgLyogTElORU9VVExfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9STVZfU0hPUlRfTUFTSyAgICAgICAgICAweDAwODAgIC8qIExJTkVPVVRMX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfUk1WX1NIT1JUX1NISUZUICAgICAgICAgICAgICA3ICAvKiBMSU5FT1VUTF9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX1JNVl9TSE9SVF9XSURUSCAgICAgICAgICAgICAgMSAgLyogTElORU9VVExfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfT1VUUCAgICAgICAgICAgICAgICAweDAwNDAgIC8qIExJTkVPVVRMX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfT1VUUF9NQVNLICAgICAgICAgICAweDAwNDAgIC8qIExJTkVPVVRMX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfT1VUUF9TSElGVCAgICAgICAgICAgICAgIDYgIC8qIExJTkVPVVRMX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfT1VUUF9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRMX0VOQV9PVVRQICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfRExZICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIExJTkVPVVRMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX0VOQV9ETFlfTUFTSyAgICAgICAgICAgIDB4MDAyMCAgLyogTElORU9VVExfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfRU5BX0RMWV9TSElGVCAgICAgICAgICAgICAgICA1ICAvKiBMSU5FT1VUTF9FTkFfRExZICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfRExZX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRMX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTElORU9VVExfRU5BICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExJTkVPVVRMX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBMSU5FT1VUTF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTElORU9VVExfRU5BICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9STVZfU0hPUlQgICAgICAgICAgICAgICAweDAwMDggIC8qIExJTkVPVVRSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfUk1WX1NIT1JUX01BU0sgICAgICAgICAgMHgwMDA4ICAvKiBMSU5FT1VUUl9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSX1JNVl9TSE9SVF9TSElGVCAgICAgICAgICAgICAgMyAgLyogTElORU9VVFJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9STVZfU0hPUlRfV0lEVEggICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX09VVFAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMSU5FT1VUUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX09VVFBfTUFTSyAgICAgICAgICAgMHgwMDA0ICAvKiBMSU5FT1VUUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX09VVFBfU0hJRlQgICAgICAgICAgICAgICAyICAvKiBMSU5FT1VUUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX09VVFBfV0lEVEggICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUUl9FTkFfT1VUUCAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX0RMWSAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSU5FT1VUUl9FTkFfRExZICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9FTkFfRExZX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIExJTkVPVVRSX0VOQV9ETFkgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSX0VOQV9ETFlfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogTElORU9VVFJfRU5BX0RMWSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX0RMWV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBMSU5FT1VUUl9FTkFfRExZICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExJTkVPVVRSX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTElORU9VVFJfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSU5FT1VUUl9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0xJTkVPVVRSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogTElORU9VVFJfRU5BICovCisjZGVmaW5lIFdNODkwM19MSU5FT1VUUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIExJTkVPVVRSX0VOQSAqLworCisvKgorICogUjk4ICgweDYyKSAtIENoYXJnZSBQdW1wIDAKKyAqLworI2RlZmluZSBXTTg5MDNfQ1BfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDUF9FTkEgKi8KKyNkZWZpbmUgV004OTAzX0NQX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ1BfRU5BICovCisjZGVmaW5lIFdNODkwM19DUF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENQX0VOQSAqLworI2RlZmluZSBXTTg5MDNfQ1BfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDUF9FTkEgKi8KKworLyoKKyAqIFIxMDQgKDB4NjgpIC0gQ2xhc3MgVyAwCisgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9GUkVRICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ1BfRFlOX0ZSRVEgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9GUkVRX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ1BfRFlOX0ZSRVEgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9GUkVRX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1BfRFlOX0ZSRVEgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9GUkVRX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1BfRFlOX0ZSRVEgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9WICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ1BfRFlOX1YgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9WX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ1BfRFlOX1YgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9WX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQ1BfRFlOX1YgKi8KKyNkZWZpbmUgV004OTAzX0NQX0RZTl9WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1BfRFlOX1YgKi8KKworLyoKKyAqIFIxMDggKDB4NkMpIC0gV3JpdGUgU2VxdWVuY2VyIDAKKyAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBXU0VRX0VOQSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBXU0VRX0VOQSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBXU0VRX0VOQSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBXU0VRX0VOQSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9XUklURV9JTkRFWF9NQVNLICAgICAgICAgICAgMHgwMDFGICAvKiBXU0VRX1dSSVRFX0lOREVYIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfV1JJVEVfSU5ERVhfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogV1NFUV9XUklURV9JTkRFWCAtIFs0OjBdICovCisjZGVmaW5lIFdNODkwM19XU0VRX1dSSVRFX0lOREVYX1dJRFRIICAgICAgICAgICAgICAgIDUgIC8qIFdTRVFfV1JJVEVfSU5ERVggLSBbNDowXSAqLworCisvKgorICogUjEwOSAoMHg2RCkgLSBXcml0ZSBTZXF1ZW5jZXIgMQorICovCisjZGVmaW5lIFdNODkwM19XU0VRX0RBVEFfV0lEVEhfTUFTSyAgICAgICAgICAgICAweDcwMDAgIC8qIFdTRVFfREFUQV9XSURUSCAtIFsxNDoxMl0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREFUQV9XSURUSF9TSElGVCAgICAgICAgICAgICAgICAxMiAgLyogV1NFUV9EQVRBX1dJRFRIIC0gWzE0OjEyXSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9EQVRBX1dJRFRIX1dJRFRIICAgICAgICAgICAgICAgICAzICAvKiBXU0VRX0RBVEFfV0lEVEggLSBbMTQ6MTJdICovCisjZGVmaW5lIFdNODkwM19XU0VRX0RBVEFfU1RBUlRfTUFTSyAgICAgICAgICAgICAweDBGMDAgIC8qIFdTRVFfREFUQV9TVEFSVCAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9EQVRBX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICA4ICAvKiBXU0VRX0RBVEFfU1RBUlQgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREFUQV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgNCAgLyogV1NFUV9EQVRBX1NUQVJUIC0gWzExOjhdICovCisjZGVmaW5lIFdNODkwM19XU0VRX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIFdTRVFfQUREUiAtIFs3OjBdICovCisjZGVmaW5lIFdNODkwM19XU0VRX0FERFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFdTRVFfQUREUiAtIFs3OjBdICovCisjZGVmaW5lIFdNODkwM19XU0VRX0FERFJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIFdTRVFfQUREUiAtIFs3OjBdICovCisKKy8qCisgKiBSMTEwICgweDZFKSAtIFdyaXRlIFNlcXVlbmNlciAyCisgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfRU9TICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogV1NFUV9FT1MgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfRU9TX01BU0sgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogV1NFUV9FT1MgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfRU9TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogV1NFUV9FT1MgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfRU9TX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogV1NFUV9FT1MgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREVMQVlfTUFTSyAgICAgICAgICAgICAgICAgIDB4MEYwMCAgLyogV1NFUV9ERUxBWSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9ERUxBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBXU0VRX0RFTEFZIC0gWzExOjhdICovCisjZGVmaW5lIFdNODkwM19XU0VRX0RFTEFZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFdTRVFfREVMQVkgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREFUQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogV1NFUV9EQVRBIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREFUQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogV1NFUV9EQVRBIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfREFUQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogV1NFUV9EQVRBIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTEgKDB4NkYpIC0gV3JpdGUgU2VxdWVuY2VyIDMKKyAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBXU0VRX0FCT1JUICovCisjZGVmaW5lIFdNODkwM19XU0VRX0FCT1JUX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIFdTRVFfQUJPUlQgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfQUJPUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogV1NFUV9BQk9SVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9BQk9SVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBXU0VRX0FCT1JUICovCisjZGVmaW5lIFdNODkwM19XU0VRX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFdTRVFfU1RBUlQgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogV1NFUV9TVEFSVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBXU0VRX1NUQVJUICovCisjZGVmaW5lIFdNODkwM19XU0VRX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFdTRVFfU1RBUlQgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfU1RBUlRfSU5ERVhfTUFTSyAgICAgICAgICAgIDB4MDAzRiAgLyogV1NFUV9TVEFSVF9JTkRFWCAtIFs1OjBdICovCisjZGVmaW5lIFdNODkwM19XU0VRX1NUQVJUX0lOREVYX1NISUZUICAgICAgICAgICAgICAgIDAgIC8qIFdTRVFfU1RBUlRfSU5ERVggLSBbNTowXSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9TVEFSVF9JTkRFWF9XSURUSCAgICAgICAgICAgICAgICA2ICAvKiBXU0VRX1NUQVJUX0lOREVYIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMTIgKDB4NzApIC0gV3JpdGUgU2VxdWVuY2VyIDQKKyAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9DVVJSRU5UX0lOREVYX01BU0sgICAgICAgICAgMHgwM0YwICAvKiBXU0VRX0NVUlJFTlRfSU5ERVggLSBbOTo0XSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9DVVJSRU5UX0lOREVYX1NISUZUICAgICAgICAgICAgICA0ICAvKiBXU0VRX0NVUlJFTlRfSU5ERVggLSBbOTo0XSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9DVVJSRU5UX0lOREVYX1dJRFRIICAgICAgICAgICAgICA2ICAvKiBXU0VRX0NVUlJFTlRfSU5ERVggLSBbOTo0XSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBXU0VRX0JVU1kgKi8KKyNkZWZpbmUgV004OTAzX1dTRVFfQlVTWV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogV1NFUV9CVVNZICovCisjZGVmaW5lIFdNODkwM19XU0VRX0JVU1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFdTRVFfQlVTWSAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBXU0VRX0JVU1kgKi8KKworLyoKKyAqIFIxMTQgKDB4NzIpIC0gQ29udHJvbCBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBXTTg5MDNfTUFTS19XUklURV9FTkEgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQVNLX1dSSVRFX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUFTS19XUklURV9FTkFfTUFTSyAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQVNLX1dSSVRFX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUFTS19XUklURV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBNQVNLX1dSSVRFX0VOQSAqLworI2RlZmluZSBXTTg5MDNfTUFTS19XUklURV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBNQVNLX1dSSVRFX0VOQSAqLworCisvKgorICogUjExNiAoMHg3NCkgLSBHUElPIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODkwM19HUDFfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDFGMDAgIC8qIEdQMV9GTiAtIFsxMjo4XSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBHUDFfRk4gLSBbMTI6OF0gKi8KKyNkZWZpbmUgV004OTAzX0dQMV9GTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1AxX0ZOIC0gWzEyOjhdICovCisjZGVmaW5lIFdNODkwM19HUDFfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1AxX0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1AxX0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBHUDFfRElSICovCisjZGVmaW5lIFdNODkwM19HUDFfRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AxX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDFfT1BfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQMV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9PUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lQX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUDFfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDFfSVBfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQMV9JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9JUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1AxX0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lQX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDFfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1AxX0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1AxX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDFfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1AxX1BEICovCisjZGVmaW5lIFdNODkwM19HUDFfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQMV9QRCAqLworI2RlZmluZSBXTTg5MDNfR1AxX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX1BEICovCisjZGVmaW5lIFdNODkwM19HUDFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTg5MDNfR1AxX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogR1AxX1BVICovCisjZGVmaW5lIFdNODkwM19HUDFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDFfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lOVE1PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDFfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lOVE1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0lOVE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1AxX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUDFfREIgKi8KKyNkZWZpbmUgV004OTAzX0dQMV9EQl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AxX0RCICovCisjZGVmaW5lIFdNODkwM19HUDFfREJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQMV9EQiAqLworI2RlZmluZSBXTTg5MDNfR1AxX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfREIgKi8KKworLyoKKyAqIFIxMTcgKDB4NzUpIC0gR1BJTyBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTg5MDNfR1AyX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwICAvKiBHUDJfRk4gLSBbMTI6OF0gKi8KKyNkZWZpbmUgV004OTAzX0dQMl9GTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AyX0ZOIC0gWzEyOjhdICovCisjZGVmaW5lIFdNODkwM19HUDJfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQMl9GTiAtIFsxMjo4XSAqLworI2RlZmluZSBXTTg5MDNfR1AyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNODkwM19HUDJfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQMl9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogR1AyX0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1AyX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNODkwM19HUDJfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQMl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9PUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1AyX09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AyX09QX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDJfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1AyX0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AyX0lQX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUDJfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDJfSVBfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQMl9JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQMl9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1AyX0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1AyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDJfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQMl9QRCAqLworI2RlZmluZSBXTTg5MDNfR1AyX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogR1AyX1BEICovCisjZGVmaW5lIFdNODkwM19HUDJfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9QRCAqLworI2RlZmluZSBXTTg5MDNfR1AyX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AyX1BVICovCisjZGVmaW5lIFdNODkwM19HUDJfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEdQMl9QVSAqLworI2RlZmluZSBXTTg5MDNfR1AyX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JTlRNT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JTlRNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9JTlRNT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AyX0RCICovCisjZGVmaW5lIFdNODkwM19HUDJfREJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEdQMl9EQiAqLworI2RlZmluZSBXTTg5MDNfR1AyX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUDJfREIgKi8KKyNkZWZpbmUgV004OTAzX0dQMl9EQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0RCICovCisKKy8qCisgKiBSMTE4ICgweDc2KSAtIEdQSU8gQ29udHJvbCAzCisgKi8KKyNkZWZpbmUgV004OTAzX0dQM19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMCAgLyogR1AzX0ZOIC0gWzEyOjhdICovCisjZGVmaW5lIFdNODkwM19HUDNfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQM19GTiAtIFsxMjo4XSAqLworI2RlZmluZSBXTTg5MDNfR1AzX0ZOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBHUDNfRk4gLSBbMTI6OF0gKi8KKyNkZWZpbmUgV004OTAzX0dQM19ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1AzX0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1AzX0RJUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUDNfRElSICovCisjZGVmaW5lIFdNODkwM19HUDNfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEdQM19ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQM19ESVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1AzX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDNfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQM19PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQM19PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AzX09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AzX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDNfSVBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQM19JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQM19JUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1AzX0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1AzX0lQX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBHUDNfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDNfSVBfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQM19MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1AzX0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1AzX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDNfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEdQM19MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQM19MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1AzX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQM19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1AzX1BEICovCisjZGVmaW5lIFdNODkwM19HUDNfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEdQM19QRCAqLworI2RlZmluZSBXTTg5MDNfR1AzX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQM19QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AzX1BVICovCisjZGVmaW5lIFdNODkwM19HUDNfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEdQM19QVSAqLworI2RlZmluZSBXTTg5MDNfR1AzX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQM19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX1BVICovCisjZGVmaW5lIFdNODkwM19HUDNfSU5UTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEdQM19JTlRNT0RFICovCisjZGVmaW5lIFdNODkwM19HUDNfSU5UTU9ERV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEdQM19JTlRNT0RFICovCisjZGVmaW5lIFdNODkwM19HUDNfSU5UTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19JTlRNT0RFICovCisjZGVmaW5lIFdNODkwM19HUDNfSU5UTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19JTlRNT0RFICovCisjZGVmaW5lIFdNODkwM19HUDNfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEdQM19EQiAqLworI2RlZmluZSBXTTg5MDNfR1AzX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUDNfREIgKi8KKyNkZWZpbmUgV004OTAzX0dQM19EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1AzX0RCICovCisjZGVmaW5lIFdNODkwM19HUDNfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19EQiAqLworCisvKgorICogUjExOSAoMHg3NykgLSBHUElPIENvbnRyb2wgNAorICovCisjZGVmaW5lIFdNODkwM19HUDRfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDFGMDAgIC8qIEdQNF9GTiAtIFsxMjo4XSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBHUDRfRk4gLSBbMTI6OF0gKi8KKyNkZWZpbmUgV004OTAzX0dQNF9GTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1A0X0ZOIC0gWzEyOjhdICovCisjZGVmaW5lIFdNODkwM19HUDRfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogR1A0X0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1A0X0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBHUDRfRElSICovCisjZGVmaW5lIFdNODkwM19HUDRfRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A0X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDRfT1BfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNF9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9PUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lQX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUDRfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDRfSVBfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEdQNF9JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9JUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1A0X0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lQX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDRfTFZMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1A0X0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1A0X0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDRfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1A0X1BEICovCisjZGVmaW5lIFdNODkwM19HUDRfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQNF9QRCAqLworI2RlZmluZSBXTTg5MDNfR1A0X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X1BEICovCisjZGVmaW5lIFdNODkwM19HUDRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTg5MDNfR1A0X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogR1A0X1BVICovCisjZGVmaW5lIFdNODkwM19HUDRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lOVE1PREUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDRfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lOVE1PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDRfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lOVE1PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0lOVE1PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfSU5UTU9ERSAqLworI2RlZmluZSBXTTg5MDNfR1A0X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUDRfREIgKi8KKyNkZWZpbmUgV004OTAzX0dQNF9EQl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1A0X0RCICovCisjZGVmaW5lIFdNODkwM19HUDRfREJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNF9EQiAqLworI2RlZmluZSBXTTg5MDNfR1A0X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfREIgKi8KKworLyoKKyAqIFIxMjAgKDB4NzgpIC0gR1BJTyBDb250cm9sIDUKKyAqLworI2RlZmluZSBXTTg5MDNfR1A1X0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwICAvKiBHUDVfRk4gLSBbMTI6OF0gKi8KKyNkZWZpbmUgV004OTAzX0dQNV9GTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A1X0ZOIC0gWzEyOjhdICovCisjZGVmaW5lIFdNODkwM19HUDVfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQNV9GTiAtIFsxMjo4XSAqLworI2RlZmluZSBXTTg5MDNfR1A1X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNODkwM19HUDVfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEdQNV9ESVIgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogR1A1X0RJUiAqLworI2RlZmluZSBXTTg5MDNfR1A1X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNODkwM19HUDVfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9PUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogR1A1X09QX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A1X09QX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDVfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1A1X0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A1X0lQX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBHUDVfSVBfQ0ZHICovCisjZGVmaW5lIFdNODkwM19HUDVfSVBfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEdQNV9JUF9DRkcgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0lQX0NGRyAqLworI2RlZmluZSBXTTg5MDNfR1A1X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDVfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEdQNV9MVkwgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1A1X0xWTCAqLworI2RlZmluZSBXTTg5MDNfR1A1X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNODkwM19HUDVfUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEdQNV9QRCAqLworI2RlZmluZSBXTTg5MDNfR1A1X1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogR1A1X1BEICovCisjZGVmaW5lIFdNODkwM19HUDVfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9QRCAqLworI2RlZmluZSBXTTg5MDNfR1A1X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1A1X1BVICovCisjZGVmaW5lIFdNODkwM19HUDVfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEdQNV9QVSAqLworI2RlZmluZSBXTTg5MDNfR1A1X1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JTlRNT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1A1X0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JTlRNT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1A1X0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JTlRNT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9JTlRNT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0lOVE1PREUgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1A1X0RCICovCisjZGVmaW5lIFdNODkwM19HUDVfREJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEdQNV9EQiAqLworI2RlZmluZSBXTTg5MDNfR1A1X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUDVfREIgKi8KKyNkZWZpbmUgV004OTAzX0dQNV9EQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0RCICovCisKKy8qCisgKiBSMTIxICgweDc5KSAtIEludGVycnVwdCBTdGF0dXMgMQorICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ1NIUlRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfTUlDU0hSVF9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBNSUNTSFJUX0VJTlQgKi8KKyNkZWZpbmUgV004OTAzX01JQ1NIUlRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAxNSAgLyogTUlDU0hSVF9FSU5UICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ1NIUlRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBNSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBNSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBNSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZX0VJTlQgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBXU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZX0VJTlRfTUFTSyAgICAgICAgICAgICAgMHgyMDAwICAvKiBXU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDEzICAvKiBXU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfV1NFUV9CVVNZX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBXU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A1X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBHUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A1X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBHUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A1X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A0X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A0X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A0X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1A0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AzX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBHUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AzX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AyX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBHUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AyX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AyX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AxX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AxX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBHUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AxX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBHUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfR1AxX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfRUlOVCAqLworCisvKgorICogUjEyMiAoMHg3QSkgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzaworICovCisjZGVmaW5lIFdNODkwM19JTV9NSUNTSFJUX0VJTlQgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElNX01JQ1NIUlRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fTUlDU0hSVF9FSU5UX01BU0sgICAgICAgICAgICAgMHg4MDAwICAvKiBJTV9NSUNTSFJUX0VJTlQgKi8KKyNkZWZpbmUgV004OTAzX0lNX01JQ1NIUlRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxNSAgLyogSU1fTUlDU0hSVF9FSU5UICovCisjZGVmaW5lIFdNODkwM19JTV9NSUNTSFJUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElNX01JQ1NIUlRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fTUlDREVUX0VJTlQgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9NSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fTUlDREVUX0VJTlRfTUFTSyAgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9NSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fTUlDREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDE0ICAvKiBJTV9NSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fTUlDREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBJTV9NSUNERVRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fV1NFUV9CVVNZX0VJTlQgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9XU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fV1NFUV9CVVNZX0VJTlRfTUFTSyAgICAgICAgICAgMHgyMDAwICAvKiBJTV9XU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fV1NFUV9CVVNZX0VJTlRfU0hJRlQgICAgICAgICAgICAgIDEzICAvKiBJTV9XU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fV1NFUV9CVVNZX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxICAvKiBJTV9XU0VRX0JVU1lfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBJTV9HUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A1X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBJTV9HUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A1X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0ICAvKiBJTV9HUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A1X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDVfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A0X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A0X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A0X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzICAvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1A0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9HUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AzX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9HUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBJTV9HUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AzX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDNfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTV9HUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AyX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTV9HUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AyX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AyX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDJfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AxX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9HUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AxX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9HUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AxX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTV9HUDFfRUlOVCAqLworI2RlZmluZSBXTTg5MDNfSU1fR1AxX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9HUDFfRUlOVCAqLworCisvKgorICogUjEyMyAoMHg3QikgLSBJbnRlcnJ1cHQgUG9sYXJpdHkgMQorICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0lOViAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ1NIUlRfSU5WICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0lOVl9NQVNLICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIE1JQ1NIUlRfSU5WICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgMTUgIC8qIE1JQ1NIUlRfSU5WICovCisjZGVmaW5lIFdNODkwM19NSUNTSFJUX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ1NIUlRfSU5WICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfSU5WICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIE1JQ0RFVF9JTlYgKi8KKyNkZWZpbmUgV004OTAzX01JQ0RFVF9JTlZfTUFTSyAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogTUlDREVUX0lOViAqLworI2RlZmluZSBXTTg5MDNfTUlDREVUX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBNSUNERVRfSU5WICovCisjZGVmaW5lIFdNODkwM19NSUNERVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RFVF9JTlYgKi8KKworLyoKKyAqIFIxMjYgKDB4N0UpIC0gSW50ZXJydXB0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5MDNfSVJRX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJUlFfUE9MICovCisjZGVmaW5lIFdNODkwM19JUlFfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElSUV9QT0wgKi8KKyNkZWZpbmUgV004OTAzX0lSUV9QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSVJRX1BPTCAqLworI2RlZmluZSBXTTg5MDNfSVJRX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJUlFfUE9MICovCisKKy8qCisgKiBSMTI5ICgweDgxKSAtIENvbnRyb2wgSW50ZXJmYWNlIFRlc3QgMQorICovCisjZGVmaW5lIFdNODkwM19VU0VSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFVTRVJfS0VZICovCisjZGVmaW5lIFdNODkwM19VU0VSX0tFWV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFVTRVJfS0VZICovCisjZGVmaW5lIFdNODkwM19VU0VSX0tFWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFVTRVJfS0VZICovCisjZGVmaW5lIFdNODkwM19VU0VSX0tFWV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFVTRVJfS0VZICovCisjZGVmaW5lIFdNODkwM19URVNUX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFRFU1RfS0VZICovCisjZGVmaW5lIFdNODkwM19URVNUX0tFWV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFRFU1RfS0VZICovCisjZGVmaW5lIFdNODkwM19URVNUX0tFWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFRFU1RfS0VZICovCisjZGVmaW5lIFdNODkwM19URVNUX0tFWV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRFU1RfS0VZICovCisKKy8qCisgKiBSMTQ5ICgweDk1KSAtIENoYXJnZSBQdW1wIFRlc3QgMQorICovCisjZGVmaW5lIFdNODkwM19DUF9TV19LRUxWSU5fTU9ERV9NQVNLICAgICAgICAgICAweDAwMDYgIC8qIENQX1NXX0tFTFZJTl9NT0RFIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTAzX0NQX1NXX0tFTFZJTl9NT0RFX1NISUZUICAgICAgICAgICAgICAgMSAgLyogQ1BfU1dfS0VMVklOX01PREUgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5MDNfQ1BfU1dfS0VMVklOX01PREVfV0lEVEggICAgICAgICAgICAgICAyICAvKiBDUF9TV19LRUxWSU5fTU9ERSAtIFsyOjFdICovCisKKy8qCisgKiBSMTY0ICgweEE0KSAtIENsb2NrIFJhdGUgVGVzdCA0CisgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19ESUdfTUlDICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogQURDX0RJR19NSUMgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19ESUdfTUlDX01BU0sgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogQURDX0RJR19NSUMgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19ESUdfTUlDX1NISUZUICAgICAgICAgICAgICAgICAgICAgOSAgLyogQURDX0RJR19NSUMgKi8KKyNkZWZpbmUgV004OTAzX0FEQ19ESUdfTUlDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURDX0RJR19NSUMgKi8KKworLyoKKyAqIFIxNzIgKDB4QUMpIC0gQW5hbG9ndWUgT3V0cHV0IEJpYXMgMAorICovCisjZGVmaW5lIFdNODkwM19QR0FfQklBU19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIFBHQV9CSUFTIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTAzX1BHQV9CSUFTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUEdBX0JJQVMgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5MDNfUEdBX0JJQVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBQR0FfQklBUyAtIFs2OjRdICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxYTU3OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiB3bTg5NzEuYyAgLS0gIFdNODk3MSBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBMYWIxMjYsIEluYy4KKyAqCisgKiBBdXRob3I6IEtlbm5ldGggS2lyYWx5IDxraXJhbHlAbGFiMTI2LmNvbT4KKyAqCisgKiBCYXNlZCBvbiB3bTg3NTMuYyBieSBMaWFtIEdpcmR3b29kCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisjaW5jbHVkZSAid204OTcxLmgiCisKKyNkZWZpbmUgV004OTcxX1ZFUlNJT04gIjAuOSIKKworI2RlZmluZQlXTTg5NzFfUkVHX0NPVU5UCQk0MworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndtODk3MV93b3JrcSA9IE5VTEw7CisKKy8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLworc3RydWN0IHdtODk3MV9wcml2IHsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworfTsKKworLyoKKyAqIHdtODk3MSByZWdpc3RlciBjYWNoZQorICogV2UgY2FuJ3QgcmVhZCB0aGUgV004OTcxIHJlZ2lzdGVyIHNwYWNlIHdoZW4gd2UKKyAqIGFyZSB1c2luZyAyIHdpcmUgZm9yIGRldmljZSBjb250cm9sLCBzbyB3ZSBjYWNoZSB0aGVtIGluc3RlYWQuCisgKi8KK3N0YXRpYyBjb25zdCB1MTYgd204OTcxX3JlZ1tdID0geworCTB4MDA5NywgMHgwMDk3LCAweDAwNzksIDB4MDA3OSwgIC8qICAwICovCisJMHgwMDAwLCAweDAwMDgsIDB4MDAwMCwgMHgwMDBhLCAgLyogIDQgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMGZmLCAweDAwZmYsICAvKiAgOCAqLworCTB4MDAwZiwgMHgwMDBmLCAweDAwMDAsIDB4MDAwMCwgIC8qIDEyICovCisJMHgwMDAwLCAweDAwN2IsIDB4MDAwMCwgMHgwMDMyLCAgLyogMTYgKi8KKwkweDAwMDAsIDB4MDBjMywgMHgwMGMzLCAweDAwYzAsICAvKiAyMCAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgIC8qIDI0ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAgLyogMjggKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDUwLCAweDAwNTAsICAvKiAzMiAqLworCTB4MDA1MCwgMHgwMDUwLCAweDAwNTAsIDB4MDA1MCwgIC8qIDM2ICovCisJMHgwMDc5LCAweDAwNzksIDB4MDA3OSwgICAgICAgICAgLyogNDAgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHdtODk3MV9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAocmVnIDwgV004OTcxX1JFR19DT1VOVCkKKwkJcmV0dXJuIGNhY2hlW3JlZ107CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bTg5NzFfd3JpdGVfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaWYgKHJlZyA8IFdNODk3MV9SRUdfQ09VTlQpCisJCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworc3RhdGljIGludCB3bTg5NzFfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzJdOworCisJLyogZGF0YSBpcworCSAqICAgRDE1Li5EOSBXTTg3NTMgcmVnaXN0ZXIgb2Zmc2V0CisJICogICBEOC4uLkQwIHJlZ2lzdGVyIGRhdGEKKwkgKi8KKwlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICgodmFsdWUgPj4gOCkgJiAweDAwMDEpOworCWRhdGFbMV0gPSB2YWx1ZSAmIDB4MDBmZjsKKworCXdtODk3MV93cml0ZV9yZWdfY2FjaGUgKGNvZGVjLCByZWcsIHZhbHVlKTsKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgd204OTcxX3Jlc2V0KGMpCXdtODk3MV93cml0ZShjLCBXTTg5NzFfUkVTRVQsIDApCisKKy8qIFdNODk3MSBDb250cm9scyAqLworc3RhdGljIGNvbnN0IGNoYXIgKndtODk3MV9iYXNzW10gPSB7ICJMaW5lYXIgQ29udHJvbCIsICJBZGFwdGl2ZSBCb29zdCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg5NzFfYmFzc19maWx0ZXJbXSA9IHsgIjEzMEh6IEAgNDhrSHoiLAorCSIyMDBIeiBAIDQ4a0h6IiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODk3MV90cmVibGVbXSA9IHsgIjhrSHoiLCAiNGtIeiIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg5NzFfYWxjX2Z1bmNbXSA9IHsgIk9mZiIsICJSaWdodCIsICJMZWZ0IiwgIlN0ZXJlbyIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg5NzFfbmdfdHlwZVtdID0geyAiQ29uc3RhbnQgUEdBIEdhaW4iLAorCSJNdXRlIEFEQyBPdXRwdXQiIH07CitzdGF0aWMgY29uc3QgY2hhciAqd204OTcxX2RlZW1wW10gPSB7ICJOb25lIiwgIjMya0h6IiwgIjQ0LjFrSHoiLCAiNDhrSHoiIH07CitzdGF0aWMgY29uc3QgY2hhciAqd204OTcxX21vbm9fbXV4W10gPSB7IlN0ZXJlbyIsICJNb25vIChMZWZ0KSIsCisJIk1vbm8gKFJpZ2h0KSIsICJEaWdpdGFsIE1vbm8ifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg5NzFfZGFjX3BoYXNlW10gPSB7ICJOb24gSW52ZXJ0ZWQiLCAiSW52ZXJ0ZWQiIH07CitzdGF0aWMgY29uc3QgY2hhciAqd204OTcxX2xsaW5lX211eFtdID0geyJMaW5lIiwgIk5DIiwgIk5DIiwgIlBHQSIsCisJIkRpZmZlcmVudGlhbCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODk3MV9ybGluZV9tdXhbXSA9IHsiTGluZSIsICJNaWMiLCAiTkMiLCAiUEdBIiwKKwkiRGlmZmVyZW50aWFsIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204OTcxX2xwZ2Ffc2VsW10gPSB7IkxpbmUiLCAiTkMiLCAiTkMiLCAiRGlmZmVyZW50aWFsIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204OTcxX3JwZ2Ffc2VsW10gPSB7IkxpbmUiLCAiTWljIiwgIk5DIiwgIkRpZmZlcmVudGlhbCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODk3MV9hZGNwb2xbXSA9IHsiTm9ybWFsIiwgIkwgSW52ZXJ0IiwgIlIgSW52ZXJ0IiwKKwkiTCArIFIgSW52ZXJ0In07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204OTcxX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEUoV004OTcxX0JBU1MsIDcsIDIsIHdtODk3MV9iYXNzKSwJLyogMCAqLworCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfQkFTUywgNiwgMiwgd204OTcxX2Jhc3NfZmlsdGVyKSwKKwlTT0NfRU5VTV9TSU5HTEUoV004OTcxX1RSRUJMRSwgNiwgMiwgd204OTcxX3RyZWJsZSksCisJU09DX0VOVU1fU0lOR0xFKFdNODk3MV9BTEMxLCA3LCA0LCB3bTg5NzFfYWxjX2Z1bmMpLAorCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfTkdBVEUsIDEsIDIsIHdtODk3MV9uZ190eXBlKSwgICAgLyogNCAqLworCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfQURDREFDLCAxLCA0LCB3bTg5NzFfZGVlbXApLAorCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfQURDVEwxLCA0LCA0LCB3bTg5NzFfbW9ub19tdXgpLAorCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfQURDVEwxLCAxLCAyLCB3bTg5NzFfZGFjX3BoYXNlKSwKKwlTT0NfRU5VTV9TSU5HTEUoV004OTcxX0xPVVRNMSwgMCwgNSwgd204OTcxX2xsaW5lX211eCksIC8qIDggKi8KKwlTT0NfRU5VTV9TSU5HTEUoV004OTcxX1JPVVRNMSwgMCwgNSwgd204OTcxX3JsaW5lX211eCksCisJU09DX0VOVU1fU0lOR0xFKFdNODk3MV9MQURDSU4sIDYsIDQsIHdtODk3MV9scGdhX3NlbCksCisJU09DX0VOVU1fU0lOR0xFKFdNODk3MV9SQURDSU4sIDYsIDQsIHdtODk3MV9ycGdhX3NlbCksCisJU09DX0VOVU1fU0lOR0xFKFdNODk3MV9BRENEQUMsIDUsIDQsIHdtODk3MV9hZGNwb2wpLCAgICAvKiAxMiAqLworCVNPQ19FTlVNX1NJTkdMRShXTTg5NzFfQURDSU4sIDYsIDQsIHdtODk3MV9tb25vX211eCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTcxX3NuZF9jb250cm9sc1tdID0geworCVNPQ19ET1VCTEVfUigiQ2FwdHVyZSBWb2x1bWUiLCBXTTg5NzFfTElOVk9MLCBXTTg5NzFfUklOVk9MLCAwLCA2MywgMCksCisJU09DX0RPVUJMRV9SKCJDYXB0dXJlIFpDIFN3aXRjaCIsIFdNODk3MV9MSU5WT0wsIFdNODk3MV9SSU5WT0wsCisJCSAgICAgNiwgMSwgMCksCisJU09DX0RPVUJMRV9SKCJDYXB0dXJlIFN3aXRjaCIsIFdNODk3MV9MSU5WT0wsIFdNODk3MV9SSU5WT0wsIDcsIDEsIDEpLAorCisJU09DX0RPVUJMRV9SKCJIZWFkcGhvbmUgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004OTcxX0xPVVQxViwKKwkJV004OTcxX1JPVVQxViwgNywgMSwgMCksCisJU09DX0RPVUJMRV9SKCJTcGVha2VyIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODk3MV9MT1VUMlYsCisJCVdNODk3MV9ST1VUMlYsIDcsIDEsIDApLAorCVNPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgWkMgU3dpdGNoIiwgV004OTcxX01PVVRWLCA3LCAxLCAwKSwKKworCVNPQ19ET1VCTEVfUigiUENNIFZvbHVtZSIsIFdNODk3MV9MREFDLCBXTTg5NzFfUkRBQywgMCwgMjU1LCAwKSwKKworCVNPQ19ET1VCTEVfUigiQnlwYXNzIExlZnQgUGxheWJhY2sgVm9sdW1lIiwgV004OTcxX0xPVVRNMSwKKwkJV004OTcxX0xPVVRNMiwgNCwgNywgMSksCisJU09DX0RPVUJMRV9SKCJCeXBhc3MgUmlnaHQgUGxheWJhY2sgVm9sdW1lIiwgV004OTcxX1JPVVRNMSwKKwkJV004OTcxX1JPVVRNMiwgNCwgNywgMSksCisJU09DX0RPVUJMRV9SKCJCeXBhc3MgTW9ubyBQbGF5YmFjayBWb2x1bWUiLCBXTTg5NzFfTU9VVE0xLAorCQlXTTg5NzFfTU9VVE0yLCA0LCA3LCAxKSwKKworCVNPQ19ET1VCTEVfUigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODk3MV9MT1VUMVYsCisJCVdNODk3MV9ST1VUMVYsIDAsIDEyNywgMCksCisJU09DX0RPVUJMRV9SKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIFdNODk3MV9MT1VUMlYsCisJCVdNODk3MV9ST1VUMlYsIDAsIDEyNywgMCksCisKKwlTT0NfRU5VTSgiQmFzcyBCb29zdCIsIHdtODk3MV9lbnVtWzBdKSwKKwlTT0NfRU5VTSgiQmFzcyBGaWx0ZXIiLCB3bTg5NzFfZW51bVsxXSksCisJU09DX1NJTkdMRSgiQmFzcyBWb2x1bWUiLCBXTTg5NzFfQkFTUywgMCwgNywgMSksCisKKwlTT0NfU0lOR0xFKCJUcmVibGUgVm9sdW1lIiwgV004OTcxX1RSRUJMRSwgMCwgNywgMCksCisJU09DX0VOVU0oIlRyZWJsZSBDdXQtb2ZmIiwgd204OTcxX2VudW1bMl0pLAorCisJU09DX1NJTkdMRSgiQ2FwdHVyZSBGaWx0ZXIgU3dpdGNoIiwgV004OTcxX0FEQ0RBQywgMCwgMSwgMSksCisKKwlTT0NfU0lOR0xFKCJBTEMgVGFyZ2V0IFZvbHVtZSIsIFdNODk3MV9BTEMxLCAwLCA3LCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgTWF4IFZvbHVtZSIsIFdNODk3MV9BTEMxLCA0LCA3LCAwKSwKKworCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIFRhcmdldCBWb2x1bWUiLCBXTTg5NzFfQUxDMSwgMCwgNywgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTWF4IFZvbHVtZSIsIFdNODk3MV9BTEMxLCA0LCA3LCAwKSwKKwlTT0NfRU5VTSgiQUxDIENhcHR1cmUgRnVuY3Rpb24iLCB3bTg5NzFfZW51bVszXSksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgWkMgU3dpdGNoIiwgV004OTcxX0FMQzIsIDcsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIEhvbGQgVGltZSIsIFdNODk3MV9BTEMyLCAwLCAxNSwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgRGVjYXkgVGltZSIsIFdNODk3MV9BTEMzLCA0LCAxNSwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgQXR0YWNrIFRpbWUiLCBXTTg5NzFfQUxDMywgMCwgMTUsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE5HIFRocmVzaG9sZCIsIFdNODk3MV9OR0FURSwgMywgMzEsIDApLAorCVNPQ19FTlVNKCJBTEMgQ2FwdHVyZSBORyBUeXBlIiwgd204OTcxX2VudW1bNF0pLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE5HIFN3aXRjaCIsIFdNODk3MV9OR0FURSwgMCwgMSwgMCksCisKKwlTT0NfU0lOR0xFKCJDYXB0dXJlIDZkQiBBdHRlbnVhdGUiLCBXTTg5NzFfQURDREFDLCA4LCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJQbGF5YmFjayA2ZEIgQXR0ZW51YXRlIiwgV004OTcxX0FEQ0RBQywgNywgMSwgMCksCisKKwlTT0NfRU5VTSgiUGxheWJhY2sgRGUtZW1waGFzaXMiLCB3bTg5NzFfZW51bVs1XSksCisJU09DX0VOVU0oIlBsYXliYWNrIEZ1bmN0aW9uIiwgd204OTcxX2VudW1bNl0pLAorCVNPQ19FTlVNKCJQbGF5YmFjayBQaGFzZSIsIHdtODk3MV9lbnVtWzddKSwKKworCVNPQ19ET1VCTEVfUigiTWljIEJvb3N0IiwgV004OTcxX0xBRENJTiwgV004OTcxX1JBRENJTiwgNCwgMywgMCksCit9OworCisvKiBhZGQgbm9uLURBUE0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd204OTcxX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk3MV9zbmRfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQkJc25kX3NvY19jbmV3KCZ3bTg5NzFfc25kX2NvbnRyb2xzW2ldLAorCQkJCQkgICAgIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEQVBNIENvbnRyb2xzCisgKi8KKworLyogTGVmdCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk3MV9sZWZ0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIlBsYXliYWNrIFN3aXRjaCIsIFdNODk3MV9MT1VUTTEsIDgsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCBXTTg5NzFfTE9VVE0xLCA3LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgUGxheWJhY2sgU3dpdGNoIiwgV004OTcxX0xPVVRNMiwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCBXTTg5NzFfTE9VVE0yLCA3LCAxLCAwKSwKK307CisKKy8qIFJpZ2h0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTcxX3JpZ2h0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004OTcxX1JPVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODk3MV9ST1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJQbGF5YmFjayBTd2l0Y2giLCBXTTg5NzFfUk9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODk3MV9ST1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTW9ubyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk3MV9tb25vX21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004OTcxX01PVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODk3MV9NT1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCBXTTg5NzFfTU9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODk3MV9NT1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTGVmdCBMaW5lIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk3MV9sZWZ0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg5NzFfZW51bVs4XSk7CisKKy8qIFJpZ2h0IExpbmUgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTcxX3JpZ2h0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg5NzFfZW51bVs5XSk7CisKKy8qIExlZnQgUEdBIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk3MV9sZWZ0X3BnYV9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODk3MV9lbnVtWzEwXSk7CisKKy8qIFJpZ2h0IFBHQSBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5NzFfcmlnaHRfcGdhX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204OTcxX2VudW1bMTFdKTsKKworLyogTW9ubyBBREMgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTcxX21vbm9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg5NzFfZW51bVsxM10pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204OTcxX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9NSVhFUigiTGVmdCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJndtODk3MV9sZWZ0X21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHdtODk3MV9sZWZ0X21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSaWdodCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJndtODk3MV9yaWdodF9taXhlcl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRSh3bTg5NzFfcmlnaHRfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1vbm8gTWl4ZXIiLCBXTTg5NzFfUFdSMiwgMiwgMCwKKwkJJndtODk3MV9tb25vX21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHdtODk3MV9tb25vX21peGVyX2NvbnRyb2xzKSksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBPdXQgMiIsIFdNODk3MV9QV1IyLCAzLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IE91dCAyIiwgV004OTcxX1BXUjIsIDQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlJpZ2h0IE91dCAxIiwgV004OTcxX1BXUjIsIDUsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgT3V0IDEiLCBXTTg5NzFfUFdSMiwgNiwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIlJpZ2h0IFBsYXliYWNrIiwgV004OTcxX1BXUjIsIDcsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDIiwgIkxlZnQgUGxheWJhY2siLCBXTTg5NzFfUFdSMiwgOCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTW9ubyBPdXQgMSIsIFdNODk3MV9QV1IyLCAyLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyIsIFdNODk3MV9QV1IxLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgQ2FwdHVyZSIsIFdNODk3MV9QV1IxLCAyLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEFEQyIsICJMZWZ0IENhcHR1cmUiLCBXTTg5NzFfUFdSMSwgMywgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IFBHQSBNdXgiLCBXTTg5NzFfUFdSMSwgNSwgMCwKKwkJJndtODk3MV9sZWZ0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgUEdBIE11eCIsIFdNODk3MV9QV1IxLCA0LCAwLAorCQkmd204OTcxX3JpZ2h0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBMaW5lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJndtODk3MV9sZWZ0X2xpbmVfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204OTcxX3JpZ2h0X2xpbmVfY29udHJvbHMpLAorCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204OTcxX21vbm9tdXhfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IEFEQyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ3bTg5NzFfbW9ub211eF9jb250cm9scyksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlJPVVQxIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVDIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUMiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk1PTk8iKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiTElOUFVUMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiUklOUFVUMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKKwkvKiBsZWZ0IG1peGVyICovCisJeyJMZWZ0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiTGVmdCBNaXhlciIsICJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCAiTGVmdCBMaW5lIE11eCJ9LAorCXsiTGVmdCBNaXhlciIsICJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJMZWZ0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIHJpZ2h0IG1peGVyICovCisJeyJSaWdodCBNaXhlciIsICJMZWZ0IFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiUmlnaHQgTWl4ZXIiLCAiTGVmdCBCeXBhc3MgU3dpdGNoIiwgIkxlZnQgTGluZSBNdXgifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIGxlZnQgb3V0IDEgKi8KKwl7IkxlZnQgT3V0IDEiLCBOVUxMLCAiTGVmdCBNaXhlciJ9LAorCXsiTE9VVDEiLCBOVUxMLCAiTGVmdCBPdXQgMSJ9LAorCisJLyogbGVmdCBvdXQgMiAqLworCXsiTGVmdCBPdXQgMiIsIE5VTEwsICJMZWZ0IE1peGVyIn0sCisJeyJMT1VUMiIsIE5VTEwsICJMZWZ0IE91dCAyIn0sCisKKwkvKiByaWdodCBvdXQgMSAqLworCXsiUmlnaHQgT3V0IDEiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQxIiwgTlVMTCwgIlJpZ2h0IE91dCAxIn0sCisKKwkvKiByaWdodCBvdXQgMiAqLworCXsiUmlnaHQgT3V0IDIiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlJpZ2h0IE91dCAyIn0sCisKKwkvKiBtb25vIG1peGVyICovCisJeyJNb25vIE1peGVyIiwgIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxlZnQgQnlwYXNzIFN3aXRjaCIsICJMZWZ0IExpbmUgTXV4In0sCisJeyJNb25vIE1peGVyIiwgIlJpZ2h0IFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBMaW5lIE11eCJ9LAorCisJLyogbW9ubyBvdXQgKi8KKwl7Ik1vbm8gT3V0IiwgTlVMTCwgIk1vbm8gTWl4ZXIifSwKKwl7Ik1PTk8xIiwgTlVMTCwgIk1vbm8gT3V0In0sCisKKwkvKiBMZWZ0IExpbmUgTXV4ICovCisJeyJMZWZ0IExpbmUgTXV4IiwgIkxpbmUiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJQR0EiLCAiTGVmdCBQR0EgTXV4In0sCisJeyJMZWZ0IExpbmUgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBSaWdodCBMaW5lIE11eCAqLworCXsiUmlnaHQgTGluZSBNdXgiLCAiTGluZSIsICJSSU5QVVQxIn0sCisJeyJSaWdodCBMaW5lIE11eCIsICJNaWMiLCAiTUlDIn0sCisJeyJSaWdodCBMaW5lIE11eCIsICJQR0EiLCAiUmlnaHQgUEdBIE11eCJ9LAorCXsiUmlnaHQgTGluZSBNdXgiLCAiRGlmZmVyZW50aWFsIiwgIkRpZmZlcmVudGlhbCBNdXgifSwKKworCS8qIExlZnQgUEdBIE11eCAqLworCXsiTGVmdCBQR0EgTXV4IiwgIkxpbmUiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBQR0EgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBSaWdodCBQR0EgTXV4ICovCisJeyJSaWdodCBQR0EgTXV4IiwgIkxpbmUiLCAiUklOUFVUMSJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJEaWZmZXJlbnRpYWwiLCAiRGlmZmVyZW50aWFsIE11eCJ9LAorCisJLyogRGlmZmVyZW50aWFsIE11eCAqLworCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIiwgIkxJTlBVVDEifSwKKwl7IkRpZmZlcmVudGlhbCBNdXgiLCAiTGluZSIsICJSSU5QVVQxIn0sCisKKwkvKiBMZWZ0IEFEQyBNdXggKi8KKwl7IkxlZnQgQURDIE11eCIsICJTdGVyZW8iLCAiTGVmdCBQR0EgTXV4In0sCisJeyJMZWZ0IEFEQyBNdXgiLCAiTW9ubyAoTGVmdCkiLCAiTGVmdCBQR0EgTXV4In0sCisJeyJMZWZ0IEFEQyBNdXgiLCAiRGlnaXRhbCBNb25vIiwgIkxlZnQgUEdBIE11eCJ9LAorCisJLyogUmlnaHQgQURDIE11eCAqLworCXsiUmlnaHQgQURDIE11eCIsICJTdGVyZW8iLCAiUmlnaHQgUEdBIE11eCJ9LAorCXsiUmlnaHQgQURDIE11eCIsICJNb25vIChSaWdodCkiLCAiUmlnaHQgUEdBIE11eCJ9LAorCXsiUmlnaHQgQURDIE11eCIsICJEaWdpdGFsIE1vbm8iLCAiUmlnaHQgUEdBIE11eCJ9LAorCisJLyogQURDICovCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IEFEQyBNdXgifSwKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBBREMgTXV4In0sCit9OworCitzdGF0aWMgaW50IHdtODk3MV9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTcxX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204OTcxX2RhcG1fd2lkZ2V0cykpOworCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IF9jb2VmZl9kaXYgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXUxNiBmczsKKwl1OCBzcjo1OworCXU4IHVzYjoxOworfTsKKworLyogY29kZWMgaGlmaSBtY2xrIGNsb2NrIGRpdmlkZXIgY29lZmZpY2llbnRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IF9jb2VmZl9kaXYgY29lZmZfZGl2W10gPSB7CisJLyogOGsgKi8KKwl7MTIyODgwMDAsIDgwMDAsIDE1MzYsIDB4NiwgMHgwfSwKKwl7MTEyODk2MDAsIDgwMDAsIDE0MDgsIDB4MTYsIDB4MH0sCisJezE4NDMyMDAwLCA4MDAwLCAyMzA0LCAweDcsIDB4MH0sCisJezE2OTM0NDAwLCA4MDAwLCAyMTEyLCAweDE3LCAweDB9LAorCXsxMjAwMDAwMCwgODAwMCwgMTUwMCwgMHg2LCAweDF9LAorCisJLyogMTEuMDI1ayAqLworCXsxMTI4OTYwMCwgMTEwMjUsIDEwMjQsIDB4MTgsIDB4MH0sCisJezE2OTM0NDAwLCAxMTAyNSwgMTUzNiwgMHgxOSwgMHgwfSwKKwl7MTIwMDAwMDAsIDExMDI1LCAxMDg4LCAweDE5LCAweDF9LAorCisJLyogMTZrICovCisJezEyMjg4MDAwLCAxNjAwMCwgNzY4LCAweGEsIDB4MH0sCisJezE4NDMyMDAwLCAxNjAwMCwgMTE1MiwgMHhiLCAweDB9LAorCXsxMjAwMDAwMCwgMTYwMDAsIDc1MCwgMHhhLCAweDF9LAorCisJLyogMjIuMDVrICovCisJezExMjg5NjAwLCAyMjA1MCwgNTEyLCAweDFhLCAweDB9LAorCXsxNjkzNDQwMCwgMjIwNTAsIDc2OCwgMHgxYiwgMHgwfSwKKwl7MTIwMDAwMDAsIDIyMDUwLCA1NDQsIDB4MWIsIDB4MX0sCisKKwkvKiAzMmsgKi8KKwl7MTIyODgwMDAsIDMyMDAwLCAzODQsIDB4YywgMHgwfSwKKwl7MTg0MzIwMDAsIDMyMDAwLCA1NzYsIDB4ZCwgMHgwfSwKKwl7MTIwMDAwMDAsIDMyMDAwLCAzNzUsIDB4YSwgMHgxfSwKKworCS8qIDQ0LjFrICovCisJezExMjg5NjAwLCA0NDEwMCwgMjU2LCAweDEwLCAweDB9LAorCXsxNjkzNDQwMCwgNDQxMDAsIDM4NCwgMHgxMSwgMHgwfSwKKwl7MTIwMDAwMDAsIDQ0MTAwLCAyNzIsIDB4MTEsIDB4MX0sCisKKwkvKiA0OGsgKi8KKwl7MTIyODgwMDAsIDQ4MDAwLCAyNTYsIDB4MCwgMHgwfSwKKwl7MTg0MzIwMDAsIDQ4MDAwLCAzODQsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDQ4MDAwLCAyNTAsIDB4MCwgMHgxfSwKKworCS8qIDg4LjJrICovCisJezExMjg5NjAwLCA4ODIwMCwgMTI4LCAweDFlLCAweDB9LAorCXsxNjkzNDQwMCwgODgyMDAsIDE5MiwgMHgxZiwgMHgwfSwKKwl7MTIwMDAwMDAsIDg4MjAwLCAxMzYsIDB4MWYsIDB4MX0sCisKKwkvKiA5NmsgKi8KKwl7MTIyODgwMDAsIDk2MDAwLCAxMjgsIDB4ZSwgMHgwfSwKKwl7MTg0MzIwMDAsIDk2MDAwLCAxOTIsIDB4ZiwgMHgwfSwKKwl7MTIwMDAwMDAsIDk2MDAwLCAxMjUsIDB4ZSwgMHgxfSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2NvZWZmKGludCBtY2xrLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLnJhdGUgPT0gcmF0ZSAmJiBjb2VmZl9kaXZbaV0ubWNsayA9PSBtY2xrKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODk3MV9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTcxX3ByaXYgKndtODk3MSA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMTIwMDAwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2OTM0NDAwOgorCWNhc2UgMTg0MzIwMDA6CisJCXdtODk3MS0+c3lzY2xrID0gZnJlcTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODk3MV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBpZmFjZSA9IDA7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlmYWNlID0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWlmYWNlIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2UgfD0gMHgwMDAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlpZmFjZSB8PSAweDAwMDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWlmYWNlIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IDB4MDA5MDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJaWZhY2UgfD0gMHgwMDgwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZmFjZSB8PSAweDAwMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODk3MV93cml0ZShjb2RlYywgV004OTcxX0lGQUNFLCBpZmFjZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTcxX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204OTcxX3ByaXYgKndtODk3MSA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGlmYWNlID0gd204OTcxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzFfSUZBQ0UpICYgMHgxZjM7CisJdTE2IHNyYXRlID0gd204OTcxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzFfU1JBVEUpICYgMHgxYzA7CisJaW50IGNvZWZmID0gZ2V0X2NvZWZmKHdtODk3MS0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCS8qIGJpdCBzaXplICovCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJaWZhY2UgfD0gMHgwMDA0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlpZmFjZSB8PSAweDAwMDg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWlmYWNlIHw9IDB4MDAwYzsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGlmYWNlICYgc3JhdGUgKi8KKwl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9JRkFDRSwgaWZhY2UpOworCWlmIChjb2VmZiA+PSAwKQorCQl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9TUkFURSwgc3JhdGUgfAorCQkJKGNvZWZmX2Rpdltjb2VmZl0uc3IgPDwgMSkgfCBjb2VmZl9kaXZbY29lZmZdLnVzYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NzFfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSB3bTg5NzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODk3MV9BRENEQUMpICYgMHhmZmY3OworCisJaWYgKG11dGUpCisJCXdtODk3MV93cml0ZShjb2RlYywgV004OTcxX0FEQ0RBQywgbXV0ZV9yZWcgfCAweDgpOworCWVsc2UKKwkJd204OTcxX3dyaXRlKGNvZGVjLCBXTTg5NzFfQURDREFDLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTcxX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwl1MTYgcHdyX3JlZyA9IHdtODk3MV9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004OTcxX1BXUjEpICYgMHhmZTNlOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQkvKiBzZXQgdm1pZCB0byA1MGsgYW5kIHVubXV0ZSBkYWMgKi8KKwkJd204OTcxX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDBjMSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLworCQl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCBwd3JfcmVnIHwgMHgwMTQwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCAweDAwMDEpOworCQlicmVhazsKKwl9CisJY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBXTTg5NzFfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8XAorCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBcCisJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKworI2RlZmluZSBXTTg5NzFfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKKworc3RydWN0IHNuZF9zb2NfZGFpIHdtODk3MV9kYWkgPSB7CisJLm5hbWUgPSAiV004OTcxIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004OTcxX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODk3MV9GT1JNQVRTLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg5NzFfUkFURVMsCisJCS5mb3JtYXRzID0gV004OTcxX0ZPUk1BVFMsfSwKKwkub3BzID0geworCQkuaHdfcGFyYW1zID0gd204OTcxX3BjbV9od19wYXJhbXMsCisJfSwKKwkuZGFpX29wcyA9IHsKKwkJLmRpZ2l0YWxfbXV0ZSA9IHdtODk3MV9tdXRlLAorCQkuc2V0X2ZtdCA9IHdtODk3MV9zZXRfZGFpX2ZtdCwKKwkJLnNldF9zeXNjbGsgPSB3bTg5NzFfc2V0X2RhaV9zeXNjbGssCisJfSwKK307CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg5NzFfZGFpKTsKKworc3RhdGljIHZvaWQgd204OTcxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYywgZGVsYXllZF93b3JrLndvcmspOworCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPmJpYXNfbGV2ZWwpOworfQorCitzdGF0aWMgaW50IHdtODk3MV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTg5NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk3MV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisJdTggZGF0YVsyXTsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwl1MTYgcmVnOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5NzFfcmVnKTsgaSsrKSB7CisJCWlmIChpICsgMSA9PSBXTTg5NzFfUkVTRVQpCisJCQljb250aW51ZTsKKwkJZGF0YVswXSA9IChpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7CisJCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKKwkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOworCX0KKworCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCisJLyogY2hhcmdlIHdtODk3MSBjYXBzICovCisJaWYgKGNvZGVjLT5zdXNwZW5kX2JpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09OKSB7CisJCXJlZyA9IHdtODk3MV9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004OTcxX1BXUjEpICYgMHhmZTNlOworCQl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCByZWcgfCAweDAxYzApOworCQljb2RlYy0+Ymlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PTjsKKwkJcXVldWVfZGVsYXllZF93b3JrKHdtODk3MV93b3JrcSwgJmNvZGVjLT5kZWxheWVkX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NzFfaW5pdChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWcsIHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJXTTg5NzEiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204OTcxX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHdtODk3MV93cml0ZTsKKwljb2RlYy0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg5NzFfc2V0X2JpYXNfbGV2ZWw7CisJY29kZWMtPmRhaSA9ICZ3bTg5NzFfZGFpOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUod204OTcxX3JlZyk7CisJY29kZWMtPm51bV9kYWkgPSAxOworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKHdtODk3MV9yZWcsIHNpemVvZih3bTg5NzFfcmVnKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY29kZWMtPnJlZ19jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODk3MV9yZXNldChjb2RlYyk7CisKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtODk3MTogZmFpbGVkIHRvIGNyZWF0ZSBwY21zXG4iKTsKKwkJZ290byBwY21fZXJyOworCX0KKworCS8qIGNoYXJnZSBvdXRwdXQgY2FwcyAtIHNldCB2bWlkIHRvIDVrIGZvciBxdWljayBwb3dlciB1cCAqLworCXJlZyA9IHdtODk3MV9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004OTcxX1BXUjEpICYgMHhmZTNlOworCXdtODk3MV93cml0ZShjb2RlYywgV004OTcxX1BXUjEsIHJlZyB8IDB4MDFjMCk7CisJY29kZWMtPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfU1RBTkRCWTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsod204OTcxX3dvcmtxLCAmY29kZWMtPmRlbGF5ZWRfd29yaywKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCisJcmVnID0gd204OTcxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzFfTERBQyk7CisJd204OTcxX3dyaXRlKGNvZGVjLCBXTTg5NzFfTERBQywgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg5NzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODk3MV9SREFDKTsKKwl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9SREFDLCByZWcgfCAweDAxMDApOworCisJcmVnID0gd204OTcxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzFfTE9VVDFWKTsKKwl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204OTcxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzFfUk9VVDFWKTsKKwl3bTg5NzFfd3JpdGUoY29kZWMsIFdNODk3MV9ST1VUMVYsIHJlZyB8IDB4MDEwMCk7CisKKwlyZWcgPSB3bTg5NzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODk3MV9MT1VUMlYpOworCXdtODk3MV93cml0ZShjb2RlYywgV004OTcxX0xPVVQyViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg5NzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODk3MV9ST1VUMlYpOworCXdtODk3MV93cml0ZShjb2RlYywgV004OTcxX1JPVVQyViwgcmVnIHwgMHgwMTAwKTsKKworCXJlZyA9IHdtODk3MV9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004OTcxX0xJTlZPTCk7CisJd204OTcxX3dyaXRlKGNvZGVjLCBXTTg5NzFfTElOVk9MLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODk3MV9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004OTcxX1JJTlZPTCk7CisJd204OTcxX3dyaXRlKGNvZGVjLCBXTTg5NzFfUklOVk9MLCByZWcgfCAweDAxMDApOworCisJd204OTcxX2FkZF9jb250cm9scyhjb2RlYyk7CisJd204OTcxX2FkZF93aWRnZXRzKGNvZGVjKTsKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtODk3MTogZmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmRcbiIpOworCQlnb3RvIGNhcmRfZXJyOworCX0KKwlyZXR1cm4gcmV0OworCitjYXJkX2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CitwY21fZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qIElmIHRoZSBpMmMgbGF5ZXIgd2VyZW4ndCBzbyBicm9rZW4sIHdlIGNvdWxkIHBhc3MgdGhpcyBraW5kIG9mIGRhdGEKKyAgIGFyb3VuZCAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSAqd204OTcxX3NvY2RldjsKKworI2lmIGRlZmluZWQgKENPTkZJR19JMkMpIHx8IGRlZmluZWQgKENPTkZJR19JMkNfTU9EVUxFKQorCitzdGF0aWMgaW50IHdtODk3MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg5NzFfc29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IHJldDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKKworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CisKKwlyZXQgPSB3bTg5NzFfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXNlIFdNODk3MVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODk3MV9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTg5NzFfaTJjX2lkW10gPSB7CisJeyAid204OTcxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTg5NzFfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODk3MV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIldNODk3MSBJMkMgQ29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSAgICA9IHdtODk3MV9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gd204OTcxX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gd204OTcxX2kyY19pZCwKK307CisKK3N0YXRpYyBpbnQgd204OTcxX2FkZF9pMmNfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCB3bTg5NzFfc2V0dXBfZGF0YSAqc2V0dXApCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg5NzFfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwlpbmZvLmFkZHIgPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJc3RybGNweShpbmZvLnR5cGUsICJ3bTg5NzEiLCBJMkNfTkFNRV9TSVpFKTsKKworCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoc2V0dXAtPmkyY19idXMpOworCWlmICghYWRhcHRlcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaTJjIGFkYXB0ZXIgJWRcbiIsCisJCQlzZXR1cC0+aTJjX2J1cyk7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwljbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCAmaW5mbyk7CisJaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmICghY2xpZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlIGF0IDB4JXhcbiIsCisJCQkodW5zaWduZWQgaW50KWluZm8uYWRkcik7CisJCWdvdG8gZXJyX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RyaXZlcjoKKwlpMmNfZGVsX2RyaXZlcigmd204OTcxX2kyY19kcml2ZXIpOworCXJldHVybiAtRU5PREVWOworfQorCisjZW5kaWYKKworc3RhdGljIGludCB3bTg5NzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTg5NzFfc2V0dXBfZGF0YSAqc2V0dXA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg5NzFfcHJpdiAqd204OTcxOworCWludCByZXQgPSAwOworCisJcHJfaW5mbygiV004OTcxIEF1ZGlvIENvZGVjICVzIiwgV004OTcxX1ZFUlNJT04pOworCisJc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODk3MSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg5NzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh3bTg5NzEgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5wcml2YXRlX2RhdGEgPSB3bTg5NzE7CisJc29jZGV2LT5jb2RlYyA9IGNvZGVjOworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisJd204OTcxX3NvY2RldiA9IHNvY2RldjsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZjb2RlYy0+ZGVsYXllZF93b3JrLCB3bTg5NzFfd29yayk7CisJd204OTcxX3dvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZSgid204OTcxIik7CisJaWYgKHdtODk3MV93b3JrcSA9PSBOVUxMKSB7CisJCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworI2lmIGRlZmluZWQgKENPTkZJR19JMkMpIHx8IGRlZmluZWQgKENPTkZJR19JMkNfTU9EVUxFKQorCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOworCQlyZXQgPSB3bTg5NzFfYWRkX2kyY19kZXZpY2UocGRldiwgc2V0dXApOworCX0KKyNlbmRpZgorCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KKworCWlmIChyZXQgIT0gMCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZSh3bTg5NzFfd29ya3EpOworCQlrZnJlZShjb2RlYy0+cHJpdmF0ZV9kYXRhKTsKKwkJa2ZyZWUoY29kZWMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHBvd2VyIGRvd24gY2hpcCAqLworc3RhdGljIGludCB3bTg5NzFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJaWYgKGNvZGVjLT5jb250cm9sX2RhdGEpCisJCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJaWYgKHdtODk3MV93b3JrcSkKKwkJZGVzdHJveV93b3JrcXVldWUod204OTcxX3dvcmtxKTsKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNvZGVjLT5jb250cm9sX2RhdGEpOworCWkyY19kZWxfZHJpdmVyKCZ3bTg5NzFfaTJjX2RyaXZlcik7CisjZW5kaWYKKwlrZnJlZShjb2RlYy0+cHJpdmF0ZV9kYXRhKTsKKwlrZnJlZShjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204OTcxID0geworCS5wcm9iZSA9IAl3bTg5NzFfcHJvYmUsCisJLnJlbW92ZSA9IAl3bTg5NzFfcmVtb3ZlLAorCS5zdXNwZW5kID0gCXdtODk3MV9zdXNwZW5kLAorCS5yZXN1bWUgPQl3bTg5NzFfcmVzdW1lLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl93bTg5NzEpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgV004OTcxIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGFiMTI2Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5oIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRmMDhmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogd204OTcxLmggIC0tICBhdWRpbyBkcml2ZXIgZm9yIFdNODk3MQorICoKKyAqIENvcHlyaWdodCAyMDA1IExhYjEyNiwgSW5jLgorICoKKyAqIEF1dGhvcjogS2VubmV0aCBLaXJhbHkgPGtpcmFseUBsYWIxMjYuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX1dNODk3MV9ICisjZGVmaW5lIF9XTTg5NzFfSAorCisjZGVmaW5lIFdNODk3MV9MSU5WT0wJMHgwMAorI2RlZmluZSBXTTg5NzFfUklOVk9MCTB4MDEKKyNkZWZpbmUgV004OTcxX0xPVVQxVgkweDAyCisjZGVmaW5lIFdNODk3MV9ST1VUMVYJMHgwMworI2RlZmluZSBXTTg5NzFfQURDREFDCTB4MDUKKyNkZWZpbmUgV004OTcxX0lGQUNFCTB4MDcKKyNkZWZpbmUgV004OTcxX1NSQVRFCTB4MDgKKyNkZWZpbmUgV004OTcxX0xEQUMJCTB4MGEKKyNkZWZpbmUgV004OTcxX1JEQUMJCTB4MGIKKyNkZWZpbmUgV004OTcxX0JBU1MJCTB4MGMKKyNkZWZpbmUgV004OTcxX1RSRUJMRQkweDBkCisjZGVmaW5lIFdNODk3MV9SRVNFVAkweDBmCisjZGVmaW5lIFdNODk3MV9BTEMxCQkweDExCisjZGVmaW5lCVdNODk3MV9BTEMyCQkweDEyCisjZGVmaW5lCVdNODk3MV9BTEMzCQkweDEzCisjZGVmaW5lIFdNODk3MV9OR0FURQkweDE0CisjZGVmaW5lIFdNODk3MV9MQURDCQkweDE1CisjZGVmaW5lIFdNODk3MV9SQURDCQkweDE2CisjZGVmaW5lCVdNODk3MV9BRENUTDEJMHgxNworI2RlZmluZQlXTTg5NzFfQURDVEwyCTB4MTgKKyNkZWZpbmUgV004OTcxX1BXUjEJCTB4MTkKKyNkZWZpbmUgV004OTcxX1BXUjIJCTB4MWEKKyNkZWZpbmUJV004OTcxX0FEQ1RMMwkweDFiCisjZGVmaW5lIFdNODk3MV9BRENJTgkweDFmCisjZGVmaW5lCVdNODk3MV9MQURDSU4JMHgyMAorI2RlZmluZQlXTTg5NzFfUkFEQ0lOCTB4MjEKKyNkZWZpbmUgV004OTcxX0xPVVRNMQkweDIyCisjZGVmaW5lIFdNODk3MV9MT1VUTTIJMHgyMworI2RlZmluZSBXTTg5NzFfUk9VVE0xCTB4MjQKKyNkZWZpbmUgV004OTcxX1JPVVRNMgkweDI1CisjZGVmaW5lIFdNODk3MV9NT1VUTTEJMHgyNgorI2RlZmluZSBXTTg5NzFfTU9VVE0yCTB4MjcKKyNkZWZpbmUgV004OTcxX0xPVVQyVgkweDI4CisjZGVmaW5lIFdNODk3MV9ST1VUMlYJMHgyOQorI2RlZmluZSBXTTg5NzFfTU9VVFYJMHgyQQorCisjZGVmaW5lIFdNODk3MV9TWVNDTEsJMAorCitzdHJ1Y3Qgd204OTcxX3NldHVwX2RhdGEgeworCWludCBpMmNfYnVzOworCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyZXNzOworfTsKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSB3bTg5NzFfZGFpOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODk3MTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCBkZDk5NWVmLi41NzJkMjJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTMwLDcgKzMwLDYgQEAKIAogI2luY2x1ZGUgIndtODk5MC5oIgogCi0jZGVmaW5lIEFVRElPX05BTUUgIndtODk5MCIKICNkZWZpbmUgV004OTkwX1ZFUlNJT04gIjAuMiIKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCkBAIC0xNDc3LDgxICsxNDc2LDg2IEBACiAgKiAgICBsb3cgID0gMHgzNAogICogICAgaGlnaCA9IDB4MzYKICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKIAotLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KLUkyQ19DTElFTlRfSU5TTU9EOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204OTkwX2kyY19kcml2ZXI7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCi1zdGF0aWMgaW50IHdtODk5MF9jb2RlY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgd204OTkwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHdtODk5MF9zb2NkZXY7Ci0Jc3RydWN0IHdtODk5MF9zZXR1cF9kYXRhICpzZXR1cCA9IHNvY2Rldi0+Y29kZWNfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CiAJaW50IHJldDsKIAotCWlmIChhZGRyICE9IHNldHVwLT5pMmNfYWRkcmVzcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwotCi0JaTJjID0gIGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChpMmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAotCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gYXR0YWNoIGNvZGVjIGF0IGFkZHIgJXhcbiIsIGFkZHIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlyZXQgPSB3bTg5OTBfaW5pdChzb2NkZXYpOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCA8IDApCiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004OTkwXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCXJldHVybiByZXQ7CiAKLWVycjoKLQlrZnJlZShpMmMpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204OTkwX2kyY19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgd204OTkwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOwotCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd204OTkwX2kyY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgd204OTkwX2NvZGVjX3Byb2JlKTsKLX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTg5OTBfaTJjX2lkW10gPSB7CisJeyAid204OTkwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTg5OTBfaTJjX2lkKTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODk5MF9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIldNODk5MCBJMkMgQ29kZWMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAotCS5hdHRhY2hfYWRhcHRlciA9IHdtODk5MF9pMmNfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50ID0gIHdtODk5MF9pMmNfZGV0YWNoLAotCS5jb21tYW5kID0gICAgICAgIE5VTEwsCisJLnByb2JlID0gICAgd204OTkwX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gICB3bTg5OTBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3bTg5OTBfaTJjX2lkLAogfTsKIAotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICAgIldNODk5MCIsCi0JLmRyaXZlciA9ICZ3bTg5OTBfaTJjX2RyaXZlciwKLX07CitzdGF0aWMgaW50IHdtODk5MF9hZGRfaTJjX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3Qgd204OTkwX3NldHVwX2RhdGEgKnNldHVwKQoreworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTkwX2kyY19kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRyaXZlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisJaW5mby5hZGRyID0gc2V0dXAtPmkyY19hZGRyZXNzOworCXN0cmxjcHkoaW5mby50eXBlLCAid204OTkwIiwgSTJDX05BTUVfU0laRSk7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHNldHVwLT5pMmNfYnVzKTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGkyYyBhZGFwdGVyICVkXG4iLAorCQkJc2V0dXAtPmkyY19idXMpOworCQlnb3RvIGVycl9kcml2ZXI7CisJfQorCisJY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgJmluZm8pOworCWkyY19wdXRfYWRhcHRlcihhZGFwdGVyKTsKKwlpZiAoIWNsaWVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaTJjIGRldmljZSBhdCAweCV4XG4iLAorCQkJKHVuc2lnbmVkIGludClpbmZvLmFkZHIpOworCQlnb3RvIGVycl9kcml2ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kcml2ZXI6CisJaTJjX2RlbF9kcml2ZXIoJndtODk5MF9pMmNfZHJpdmVyKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IHdtODk5MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTU2MCw3ICsxNTY0LDcgQEAKIAlzdHJ1Y3Qgd204OTkwX3NldHVwX2RhdGEgKnNldHVwOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3Qgd204OTkwX3ByaXYgKndtODk5MDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJcHJfaW5mbygiV004OTkwIEF1ZGlvIENvZGVjICVzXG4iLCBXTTg5OTBfVkVSU0lPTik7CiAKQEAgLTE1ODIsMTYgKzE1ODYsMTMgQEAKIAlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOwogCXdtODk5MF9zb2NkZXYgPSBzb2NkZXY7CiAKKwlyZXQgPSAtRU5PREVWOworCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKLQkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKIAkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204OTkwX2kyY19kcml2ZXIpOwotCQlpZiAocmV0ICE9IDApCi0JCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJCXJldCA9IHdtODk5MF9hZGRfaTJjX2RldmljZShwZGV2LCBzZXR1cCk7CiAJfQotI2Vsc2UKLQkJLyogQWRkIG90aGVyIGludGVyZmFjZXMgaGVyZSAqLwogI2VuZGlmCiAKIAlpZiAocmV0ICE9IDApIHsKQEAgLTE2MTIsNiArMTYxMyw3IEBACiAJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKIAlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY29kZWMtPmNvbnRyb2xfZGF0YSk7CiAJaTJjX2RlbF9kcml2ZXIoJndtODk5MF9pMmNfZHJpdmVyKTsKICNlbmRpZgogCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmgKaW5kZXggMGEwODMyNS4uMGUxOTJmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5oCkBAIC04MjcsNiArODI3LDcgQEAKICNkZWZpbmUgV004OTkwX0FJTlJNVVhfUFdSX0JJVAkJCTMKIAogc3RydWN0IHdtODk5MF9zZXR1cF9kYXRhIHsKKwl1bnNpZ25lZCBpMmNfYnVzOwogCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyZXNzOwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKaW5kZXggMmYxYzkxYi4uZmZiNDcxZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCkBAIC0yLDggKzIsNyBAQAogICogd205NzEyLmMgIC0tICBBTFNBIFNvYyBXTTk3MTIgY29kZWMgc3VwcG9ydAogICoKICAqIENvcHlyaWdodCAyMDA2IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCi0gKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKLSAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYwppbmRleCAzOGQxZmUwLi5hYmE0MDJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKQEAgLTIsOCArMiw3IEBACiAgKiB3bTk3MTMuYyAgLS0gIEFMU0EgU29jIFdNOTcxMyBjb2RlYyBzdXBwb3J0CiAgKgogICogQ29weXJpZ2h0IDIwMDYgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTQxOSw4ICs0MTgsMTIgQEAKIFNORF9TT0NfREFQTV9NSVhFUigiQ2FwdHVyZSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fREFDKCJWb2ljZSBEQUMiLCAiVm9pY2UgUGxheWJhY2siLCBBQzk3X0VYVEVOREVEX01JRCwgMTIsIDEpLAogU05EX1NPQ19EQVBNX0RBQygiQXV4IERBQyIsICJBdXggUGxheWJhY2siLCBBQzk3X0VYVEVOREVEX01JRCwgMTEsIDEpLAotU05EX1NPQ19EQVBNX0FEQygiTGVmdCBBREMiLCAiTGVmdCBIaUZpIENhcHR1cmUiLCBBQzk3X0VYVEVOREVEX01JRCwgNSwgMSksCi1TTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgSGlGaSBDYXB0dXJlIiwgQUM5N19FWFRFTkRFRF9NSUQsIDQsIDEpLAorU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBBREMiLCBBQzk3X0VYVEVOREVEX01JRCwgNSwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBBREMiLCBBQzk3X0VYVEVOREVEX01JRCwgNCwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEhpRmkgQURDIiwgIkxlZnQgSGlGaSBDYXB0dXJlIiwgU05EX1NPQ19OT1BNLCAwLCAwKSwKK1NORF9TT0NfREFQTV9BREMoIlJpZ2h0IEhpRmkgQURDIiwgIlJpZ2h0IEhpRmkgQ2FwdHVyZSIsIFNORF9TT0NfTk9QTSwgMCwgMCksCitTTkRfU09DX0RBUE1fQURDKCJMZWZ0IFZvaWNlIEFEQyIsICJMZWZ0IFZvaWNlIENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLAorU05EX1NPQ19EQVBNX0FEQygiUmlnaHQgVm9pY2UgQURDIiwgIlJpZ2h0IFZvaWNlIENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLAogU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBIZWFkcGhvbmUiLCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDEwLCAxLCBOVUxMLCAwKSwKIFNORF9TT0NfREFQTV9QR0EoIlJpZ2h0IEhlYWRwaG9uZSIsIEFDOTdfRVhURU5ERURfTVNUQVRVUywgOSwgMSwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IFNwZWFrZXIiLCBBQzk3X0VYVEVOREVEX01TVEFUVVMsIDgsIDEsIE5VTEwsIDApLApAQCAtNTgzLDkgKzU4NiwxMyBAQAogCiAJLyogbGVmdCBBREMgKi8KIAl7IkxlZnQgQURDIiwgTlVMTCwgIkxlZnQgQ2FwdHVyZSBTb3VyY2UifSwKKwl7IkxlZnQgVm9pY2UgQURDIiwgTlVMTCwgIkxlZnQgQURDIn0sCisJeyJMZWZ0IEhpRmkgQURDIiwgTlVMTCwgIkxlZnQgQURDIn0sCiAKIAkvKiByaWdodCBBREMgKi8KIAl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBDYXB0dXJlIFNvdXJjZSJ9LAorCXsiUmlnaHQgVm9pY2UgQURDIiwgTlVMTCwgIlJpZ2h0IEFEQyJ9LAorCXsiUmlnaHQgSGlGaSBBREMiLCBOVUxMLCAiUmlnaHQgQURDIn0sCiAKIAkvKiBtaWMgKi8KIAl7Ik1pYyBBIFByZSBBbXAiLCBOVUxMLCAiTWljIEEgU291cmNlIn0sCkBAIC05NDksMTcgKzk1NiwxNyBAQAogCiBzdGF0aWMgdm9pZCB3bTk3MTNfdm9pY2VzaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLSAgICBzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0gICAgc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKLSAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOwotICAgIHUxNiBzdGF0dXM7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwl1MTYgc3RhdHVzOwogCi0gICAgLyogR3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIHZvaWNlIGludGVyZmFjZS4gKi8KLSAgICBzdGF0dXMgPSBhYzk3X3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSB8IDB4MTAwMDsKLSAgICBhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X0hBTkRTRVRfUkFURSwgMHgwMjgwKTsKLSAgICBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxKSk7Ci0gICAgYWM5N193cml0ZShjb2RlYywgQUM5N19IQU5EU0VUX1JBVEUsIDB4MEY4MCk7Ci0gICAgYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIHN0YXR1cyk7CisJLyogR3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIHZvaWNlIGludGVyZmFjZS4gKi8KKwlzdGF0dXMgPSBhYzk3X3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSB8IDB4MTAwMDsKKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X0hBTkRTRVRfUkFURSwgMHgwMjgwKTsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxKSk7CisJYWM5N193cml0ZShjb2RlYywgQUM5N19IQU5EU0VUX1JBVEUsIDB4MEY4MCk7CisJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQgYWM5N19oaWZpX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwppbmRleCA2NWZkYmQ4Li45ZTYwNjJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogQVNvQyBkcml2ZXIgZm9yIFRJIERBVklOQ0kgRVZNIHBsYXRmb3JtCiAgKgotICogQXV0aG9yOiAgICAgIFZsYWRpbWlyIEJhcmlub3YsIDx2YmFyaW5vdkBydS5tdmlzdGEuY29tPgorICogQXV0aG9yOiAgICAgIFZsYWRpbWlyIEJhcmlub3YsIDx2YmFyaW5vdkBlbWJlZGRlZGFsbGV5LmNvbT4KICAqIENvcHlyaWdodDogICAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuLCA8c291cmNlQG12aXN0YS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTEzNiw2ICsxMzYsNyBAQAogCiAvKiBldm0gYXVkaW8gcHJpdmF0ZSBkYXRhICovCiBzdGF0aWMgc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgZXZtX2FpYzN4X3NldHVwID0geworCS5pMmNfYnVzID0gMCwKIAkuaTJjX2FkZHJlc3MgPSAweDFiLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMKaW5kZXggNWViZjFmZi4uYWJiNWZlZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEFMU0EgU29DIEkyUyAoTWNCU1ApIEF1ZGlvIExheWVyIGZvciBUSSBEQVZJTkNJIHByb2Nlc3NvcgogICoKLSAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAcnUubXZpc3RhLmNvbT4KKyAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAZW1iZWRkZWRhbGxleS5jb20+CiAgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiwgPHNvdXJjZUBtdmlzdGEuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJbWNic3Bfd29yZF9sZW5ndGggPSBEQVZJTkNJX01DQlNQX1dPUkRfMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImRhdmluY2ktaTJzOiB1bnN1cHBvcnRlZCBQQ00gZm9ybWF0Iik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRhdmluY2ktaTJzOiB1bnN1cHBvcnRlZCBQQ00gZm9ybWF0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5oIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuaAppbmRleCBjNWIwOTE4Li4yNDE2NDhjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5oCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogQUxTQSBTb0MgSTJTIChNY0JTUCkgQXVkaW8gTGF5ZXIgZm9yIFRJIERBVklOQ0kgcHJvY2Vzc29yCiAgKgotICogQXV0aG9yOiAgICAgIFZsYWRpbWlyIEJhcmlub3YsIDx2YmFyaW5vdkBydS5tdmlzdGEuY29tPgorICogQXV0aG9yOiAgICAgIFZsYWRpbWlyIEJhcmlub3YsIDx2YmFyaW5vdkBlbWJlZGRlZGFsbGV5LmNvbT4KICAqIENvcHlyaWdodDogICAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuLCA8c291cmNlQG12aXN0YS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCmluZGV4IDZhNWU1NmEuLjc2ZmVhYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBUSSBEQVZJTkNJIHByb2Nlc3NvcgogICoKLSAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAcnUubXZpc3RhLmNvbT4KKyAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAZW1iZWRkZWRhbGxleS5jb20+CiAgKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiwgPHNvdXJjZUBtdmlzdGEuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5oIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uaAppbmRleCA4ZDZhNDVlLi42MmNiNGViIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5oCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgVEkgREFWSU5DSSBwcm9jZXNzb3IKICAqCi0gKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QHJ1Lm12aXN0YS5jb20+CisgKiBBdXRob3I6ICAgICAgVmxhZGltaXIgQmFyaW5vdiwgPHZiYXJpbm92QGVtYmVkZGVkYWxsZXkuY29tPgogICogQ29weXJpZ2h0OiAgIChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4sIDxzb3VyY2VAbXZpc3RhLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9LY29uZmlnIGIvc291bmQvc29jL2ZzbC9LY29uZmlnCmluZGV4IDMzNjhhY2UuLmJiYTk1NDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvZnNsL0tjb25maWcKQEAgLTEsMyArMSw2IEBACitjb25maWcgU05EX1NPQ19PRl9TSU1QTEUKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19NUEM4NjEwCiAJYm9vbCAiQUxTQSBTb0Mgc3VwcG9ydCBmb3IgdGhlIE1QQzg2MTAgU09DIgogCWRlcGVuZHMgb24gTVBDODYxMF9IUENECkBAIC0xNCwzICsxNywxMCBAQAogCWRlZmF1bHQgeSBpZiBNUEM4NjEwX0hQQ0QKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgYXVkaW8gb24gdGhlIEZyZWVzY2FsZSBNUEM4NjEwIEhQQ0QuCisKK2NvbmZpZyBTTkRfU09DX01QQzUyMDBfSTJTCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBNUEM1MjAwIFBTQyBpbiBJMlMgbW9kZSBkcml2ZXIiCisJc2VsZWN0IFNORF9TT0NfT0ZfU0lNUExFCisJZGVwZW5kcyBvbiBTTkRfU09DICYmIFBQQ19NUEM1Mnh4CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNUEM1MjAwIFBTQ3MgaW4gSTJTIG1vZGUuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL01ha2VmaWxlIGIvc291bmQvc29jL2ZzbC9NYWtlZmlsZQppbmRleCA2MmY2ODBhLi4wMzVkYTRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9mc2wvTWFrZWZpbGUKQEAgLTEsNiArMSwxMSBAQAorIyBTaW1wbGUgbWFjaGluZSBkcml2ZXIgdGhhdCBleHRyYWN0cyBjb25maWd1cmF0aW9uIGZyb20gdGhlIE9GIGRldmljZSB0cmVlCitvYmotJChDT05GSUdfU05EX1NPQ19PRl9TSU1QTEUpICs9IHNvYy1vZi1zaW1wbGUubworCiAjIE1QQzg2MTAgSFBDRCBNYWNoaW5lIFN1cHBvcnQKIG9iai0kKENPTkZJR19TTkRfU09DX01QQzg2MTBfSFBDRCkgKz0gbXBjODYxMF9ocGNkLm8KIAogIyBNUEM4NjEwIFBsYXRmb3JtIFN1cHBvcnQKIG9iai0kKENPTkZJR19TTkRfU09DX01QQzg2MTApICs9IGZzbF9zc2kubyBmc2xfZG1hLm8KIAorb2JqLSQoQ09ORklHX1NORF9TT0NfTVBDNTIwMF9JMlMpICs9IG1wYzUyMDBfcHNjX2kycy5vCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjNTIwMF9wc2NfaTJzLmMgYi9zb3VuZC9zb2MvZnNsL21wYzUyMDBfcHNjX2kycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTIzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZnNsL21wYzUyMDBfcHNjX2kycy5jCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogRnJlZXNjYWxlIE1QQzUyMDAgUFNDIGluIEkyUyBtb2RlCisgKiBBTFNBIFNvQyBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZSAoREFJKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2Mtb2Ytc2ltcGxlLmg+CisKKyNpbmNsdWRlIDxzeXNkZXYvYmVzdGNvbW0vYmVzdGNvbW0uaD4KKyNpbmNsdWRlIDxzeXNkZXYvYmVzdGNvbW0vZ2VuX2JkLmg+CisjaW5jbHVkZSA8YXNtL21wYzUyeHhfcHNjLmg+CisKK01PRFVMRV9BVVRIT1IoIkdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1QQzUyMDAgUFNDIGluIEkyUyBtb2RlIEFTb0MgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKgorICogUFNDX0kyU19SQVRFUzogc2FtcGxlIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgSTJTCisgKgorICogVGhpcyBkcml2ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdGhlIFBTQyBydW5uaW5nIGluIEkyUyBzbGF2ZSBtb2RlLAorICogd2hpY2ggbWVhbnMgdGhlIGNvZGVjIGRldGVybWluZXMgdGhlIHNhbXBsZSByYXRlLiAgVGhlcmVmb3JlLCB3ZSB0ZWxsCisgKiBBTFNBIHRoYXQgd2Ugc3VwcG9ydCBhbGwgcmF0ZXMgYW5kIGxldCB0aGUgY29kZWMgZHJpdmVyIGRlY2lkZSB3aGF0IHJhdGVzCisgKiBhcmUgcmVhbGx5IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBQU0NfSTJTX1JBVEVTIChTTkRSVl9QQ01fUkFURV81NTEyIHwgU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAgfCBcCisJCQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKQorCisvKioKKyAqIFBTQ19JMlNfRk9STUFUUzogYXVkaW8gZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIFBTQyBJMlMgbW9kZQorICovCisjZGVmaW5lIFBTQ19JMlNfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwgXAorCQkJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgfCBcCisJCQkgU05EUlZfUENNX0ZNVEJJVF9TMzJfQkUpCisKKy8qKgorICogcHNjX2kyc19zdHJlYW0gLSBEYXRhIHNwZWNpZmljIHRvIGEgc2luZ2xlIHN0cmVhbSAocGxheWJhY2sgb3IgY2FwdHVyZSkKKyAqIEBhY3RpdmU6CQlmbGFnIGluZGljYXRpbmcgaWYgdGhlIHN0cmVhbSBpcyBhY3RpdmUKKyAqIEBwc2NfaTJzOgkJcG9pbnRlciBiYWNrIHRvIHBhcmVudCBwc2NfaTJzIGRhdGEgc3RydWN0dXJlCisgKiBAYmNvbV90YXNrOgkJYmVzdGNvbW0gdGFzayBzdHJ1Y3R1cmUKKyAqIEBpcnE6CQlpcnEgbnVtYmVyIGZvciBiZXN0Y29tbSB0YXNrCisgKiBAcGVyaW9kX3N0YXJ0OglwaHlzaWNhbCBhZGRyZXNzIG9mIHN0YXJ0IG9mIERNQSByZWdpb24KKyAqIEBwZXJpb2RfZW5kOgkJcGh5c2ljYWwgYWRkcmVzcyBvZiBlbmQgb2YgRE1BIHJlZ2lvbgorICogQHBlcmlvZF9uZXh0X3B0OglwaHlzaWNhbCBhZGRyZXNzIG9mIG5leHQgRE1BIGJ1ZmZlciB0byBlbnF1ZXVlCisgKiBAcGVyaW9kX2J5dGVzOglzaXplIG9mIERNQSBwZXJpb2QgaW4gYnl0ZXMKKyAqLworc3RydWN0IHBzY19pMnNfc3RyZWFtIHsKKwlpbnQgYWN0aXZlOworCXN0cnVjdCBwc2NfaTJzICpwc2NfaTJzOworCXN0cnVjdCBiY29tX3Rhc2sgKmJjb21fdGFzazsKKwlpbnQgaXJxOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3RyZWFtOworCWRtYV9hZGRyX3QgcGVyaW9kX3N0YXJ0OworCWRtYV9hZGRyX3QgcGVyaW9kX2VuZDsKKwlkbWFfYWRkcl90IHBlcmlvZF9uZXh0X3B0OworCWRtYV9hZGRyX3QgcGVyaW9kX2N1cnJlbnRfcHQ7CisJaW50IHBlcmlvZF9ieXRlczsKK307CisKKy8qKgorICogcHNjX2kycyAtIFByaXZhdGUgZHJpdmVyIGRhdGEKKyAqIEBuYW1lOiBzaG9ydCBuYW1lIGZvciB0aGlzIGRldmljZSAoIlBTQzAiLCAiUFNDMSIsIGV0YykKKyAqIEBwc2NfcmVnczogcG9pbnRlciB0byB0aGUgUFNDJ3MgcmVnaXN0ZXJzCisgKiBAZmlmb19yZWdzOiBwb2ludGVyIHRvIHRoZSBQU0MncyBGSUZPIHJlZ2lzdGVycworICogQGlycTogSVJRIG9mIHRoaXMgUFNDCisgKiBAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKKyAqIEBkYWk6IHRoZSBDUFUgREFJIGZvciB0aGlzIGRldmljZQorICogQHNpY3I6IEJhc2UgdmFsdWUgdXNlZCBpbiBzZXJpYWwgaW50ZXJmYWNlIGNvbnRyb2wgcmVnaXN0ZXI7IG1vZGUgaXMgT1JlZAorICogICAgICAgIHdpdGggdGhpcyB2YWx1ZS4KKyAqIEBwbGF5YmFjazogUGxheWJhY2sgc3RyZWFtIGNvbnRleHQgZGF0YQorICogQGNhcHR1cmU6IENhcHR1cmUgc3RyZWFtIGNvbnRleHQgZGF0YQorICovCitzdHJ1Y3QgcHNjX2kycyB7CisJY2hhciBuYW1lWzMyXTsKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjX3JlZ3M7CisJc3RydWN0IG1wYzUyeHhfcHNjX2ZpZm8gX19pb21lbSAqZmlmb19yZWdzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaSBkYWk7CisJc3BpbmxvY2tfdCBsb2NrOworCXUzMiBzaWNyOworCisJLyogcGVyLXN0cmVhbSBkYXRhICovCisJc3RydWN0IHBzY19pMnNfc3RyZWFtIHBsYXliYWNrOworCXN0cnVjdCBwc2NfaTJzX3N0cmVhbSBjYXB0dXJlOworCisJLyogU3RhdGlzdGljcyAqLworCXN0cnVjdCB7CisJCWludCBvdmVycnVuX2NvdW50OworCQlpbnQgdW5kZXJydW5fY291bnQ7CisJfSBzdGF0czsKK307CisKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlcnMKKyAqLworc3RhdGljIGlycXJldHVybl90IHBzY19pMnNfc3RhdHVzX2lycShpbnQgaXJxLCB2b2lkICpfcHNjX2kycykKK3sKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycyA9IF9wc2NfaTJzOworCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpyZWdzID0gcHNjX2kycy0+cHNjX3JlZ3M7CisJdTE2IGlzcjsKKworCWlzciA9IGluX2JlMTYoJnJlZ3MtPm1wYzUyeHhfcHNjX2lzcik7CisKKwkvKiBQbGF5YmFjayB1bmRlcnJ1biBlcnJvciAqLworCWlmIChwc2NfaTJzLT5wbGF5YmFjay5hY3RpdmUgJiYgKGlzciAmIE1QQzUyeHhfUFNDX0lNUl9UWEVNUCkpCisJCXBzY19pMnMtPnN0YXRzLnVuZGVycnVuX2NvdW50Kys7CisKKwkvKiBDYXB0dXJlIG92ZXJydW4gZXJyb3IgKi8KKwlpZiAocHNjX2kycy0+Y2FwdHVyZS5hY3RpdmUgJiYgKGlzciAmIE1QQzUyeHhfUFNDX0lNUl9PUkVSUikpCisJCXBzY19pMnMtPnN0YXRzLm92ZXJydW5fY291bnQrKzsKKworCW91dF84KCZyZWdzLT5jb21tYW5kLCA0IDw8IDQpOwkvKiByZXNldCB0aGUgZXJyb3Igc3RhdHVzICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogcHNjX2kyc19iY29tX2VucXVldWVfbmV4dF9idWZmZXIgLSBFbnF1ZXVlIGFub3RoZXIgYXVkaW8gYnVmZmVyCisgKiBAczogcG9pbnRlciB0byBzdHJlYW0gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIEVucXVldWVzIGFub3RoZXIgYXVkaW8gcGVyaW9kIGJ1ZmZlciBpbnRvIHRoZSBiZXN0Y29tbSBxdWV1ZS4KKyAqCisgKiBOb3RlOiBUaGUgcm91dGluZSBtdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgc3BhY2UgYXZhaWxhYmxlIGluCisgKiB0aGUgcXVldWUuICBPdGhlcndpc2UgdGhlIGVucXVldWUgd2lsbCBmYWlsIGFuZCB0aGUgYXVkaW8gcmluZyBidWZmZXIKKyAqIHdpbGwgZ2V0IG91dCBvZiBzeW5jCisgKi8KK3N0YXRpYyB2b2lkIHBzY19pMnNfYmNvbV9lbnF1ZXVlX25leHRfYnVmZmVyKHN0cnVjdCBwc2NfaTJzX3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgYmNvbV9iZCAqYmQ7CisKKwkvKiBQcmVwYXJlIGFuZCBlbnF1ZXVlIHRoZSBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisJYmQgPSBiY29tX3ByZXBhcmVfbmV4dF9idWZmZXIocy0+YmNvbV90YXNrKTsKKwliZC0+c3RhdHVzID0gcy0+cGVyaW9kX2J5dGVzOworCWJkLT5kYXRhWzBdID0gcy0+cGVyaW9kX25leHRfcHQ7CisJYmNvbV9zdWJtaXRfbmV4dF9idWZmZXIocy0+YmNvbV90YXNrLCBOVUxMKTsKKworCS8qIFVwZGF0ZSBmb3IgbmV4dCBwZXJpb2QgKi8KKwlzLT5wZXJpb2RfbmV4dF9wdCArPSBzLT5wZXJpb2RfYnl0ZXM7CisJaWYgKHMtPnBlcmlvZF9uZXh0X3B0ID49IHMtPnBlcmlvZF9lbmQpCisJCXMtPnBlcmlvZF9uZXh0X3B0ID0gcy0+cGVyaW9kX3N0YXJ0OworfQorCisvKiBCZXN0Y29tbSBETUEgaXJxIGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwc2NfaTJzX2Jjb21faXJxKGludCBpcnEsIHZvaWQgKl9wc2NfaTJzX3N0cmVhbSkKK3sKKwlzdHJ1Y3QgcHNjX2kyc19zdHJlYW0gKnMgPSBfcHNjX2kyc19zdHJlYW07CisKKwkvKiBGb3IgZWFjaCBmaW5pc2hlZCBwZXJpb2QsIGRlcXVldWUgdGhlIGNvbXBsZXRlZCBwZXJpb2QgYnVmZmVyCisJICogYW5kIGVucXVldWUgYSBuZXcgb25lIGluIGl0J3MgcGxhY2UuICovCisJd2hpbGUgKGJjb21fYnVmZmVyX2RvbmUocy0+YmNvbV90YXNrKSkgeworCQliY29tX3JldHJpZXZlX2J1ZmZlcihzLT5iY29tX3Rhc2ssIE5VTEwsIE5VTEwpOworCQlzLT5wZXJpb2RfY3VycmVudF9wdCArPSBzLT5wZXJpb2RfYnl0ZXM7CisJCWlmIChzLT5wZXJpb2RfY3VycmVudF9wdCA+PSBzLT5wZXJpb2RfZW5kKQorCQkJcy0+cGVyaW9kX2N1cnJlbnRfcHQgPSBzLT5wZXJpb2Rfc3RhcnQ7CisJCXBzY19pMnNfYmNvbV9lbnF1ZXVlX25leHRfYnVmZmVyKHMpOworCQliY29tX2VuYWJsZShzLT5iY29tX3Rhc2spOworCX0KKworCS8qIElmIHRoZSBzdHJlYW0gaXMgYWN0aXZlLCB0aGVuIGFsc28gaW5mb3JtIHRoZSBQQ00gbWlkZGxlIGxheWVyCisJICogb2YgdGhlIHBlcmlvZCBmaW5pc2hlZCBldmVudC4gKi8KKwlpZiAocy0+YWN0aXZlKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHMtPnN0cmVhbSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogcHNjX2kyc19zdGFydHVwOiBjcmVhdGUgYSBuZXcgc3Vic3RyZWFtCisgKgorICogVGhpcyBpcyB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgb3BlbmVkLgorICoKKyAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN0cmVhbSBvcGVuLCB0aGVuIGdyYWIgdGhlIElSUSBhbmQgcHJvZ3JhbSBtb3N0IG9mCisgKiB0aGUgUFNDIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCBwc2NfaTJzX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwc2NfaTJzICpwc2NfaTJzID0gcnRkLT5kYWktPmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKwlpbnQgcmM7CisKKwlkZXZfZGJnKHBzY19pMnMtPmRldiwgInBzY19pMnNfc3RhcnR1cChzdWJzdHJlYW09JXApXG4iLCBzdWJzdHJlYW0pOworCisJaWYgKCFwc2NfaTJzLT5wbGF5YmFjay5hY3RpdmUgJiYKKwkgICAgIXBzY19pMnMtPmNhcHR1cmUuYWN0aXZlKSB7CisJCS8qIFNldHVwIHRoZSBJUlFzICovCisJCXJjID0gcmVxdWVzdF9pcnEocHNjX2kycy0+aXJxLCAmcHNjX2kyc19zdGF0dXNfaXJxLCBJUlFGX1NIQVJFRCwKKwkJCQkgInBzYy1pMnMtc3RhdHVzIiwgcHNjX2kycyk7CisJCXJjIHw9IHJlcXVlc3RfaXJxKHBzY19pMnMtPmNhcHR1cmUuaXJxLAorCQkJCSAgJnBzY19pMnNfYmNvbV9pcnEsIElSUUZfU0hBUkVELAorCQkJCSAgInBzYy1pMnMtY2FwdHVyZSIsICZwc2NfaTJzLT5jYXB0dXJlKTsKKwkJcmMgfD0gcmVxdWVzdF9pcnEocHNjX2kycy0+cGxheWJhY2suaXJxLAorCQkJCSAgJnBzY19pMnNfYmNvbV9pcnEsIElSUUZfU0hBUkVELAorCQkJCSAgInBzYy1pMnMtcGxheWJhY2siLCAmcHNjX2kycy0+cGxheWJhY2spOworCQlpZiAocmMpIHsKKwkJCWZyZWVfaXJxKHBzY19pMnMtPmlycSwgcHNjX2kycyk7CisJCQlmcmVlX2lycShwc2NfaTJzLT5jYXB0dXJlLmlycSwKKwkJCQkgJnBzY19pMnMtPmNhcHR1cmUpOworCQkJZnJlZV9pcnEocHNjX2kycy0+cGxheWJhY2suaXJxLAorCQkJCSAmcHNjX2kycy0+cGxheWJhY2spOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwc2NfaTJzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwc2NfaTJzICpwc2NfaTJzID0gcnRkLT5kYWktPmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKwl1MzIgbW9kZTsKKworCWRldl9kYmcocHNjX2kycy0+ZGV2LCAiJXMoc3Vic3RyZWFtPSVwKSBwX3NpemU9JWkgcF9ieXRlcz0laSIKKwkJIiBwZXJpb2RzPSVpIGJ1ZmZlcl9zaXplPSVpICBidWZmZXJfYnl0ZXM9JWlcbiIsCisJCV9fZnVuY19fLCBzdWJzdHJlYW0sIHBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpLAorCQlwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyksIHBhcmFtc19wZXJpb2RzKHBhcmFtcyksCisJCXBhcmFtc19idWZmZXJfc2l6ZShwYXJhbXMpLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6CisJCW1vZGUgPSBNUEM1Mnh4X1BTQ19TSUNSX1NJTV9DT0RFQ184OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0JFOgorCQltb2RlID0gTVBDNTJ4eF9QU0NfU0lDUl9TSU1fQ09ERUNfMTY7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfQkU6CisJCW1vZGUgPSBNUEM1Mnh4X1BTQ19TSUNSX1NJTV9DT0RFQ18yNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9CRToKKwkJbW9kZSA9IE1QQzUyeHhfUFNDX1NJQ1JfU0lNX0NPREVDXzMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHBzY19pMnMtPmRldiwgImludmFsaWQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW91dF9iZTMyKCZwc2NfaTJzLT5wc2NfcmVncy0+c2ljciwgcHNjX2kycy0+c2ljciB8IG1vZGUpOworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzY19pMnNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sIE5VTEwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzY19pMnNfdHJpZ2dlcjogc3RhcnQgYW5kIHN0b3AgdGhlIERNQSB0cmFuc2Zlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBTFNBIHRvIHN0YXJ0LCBzdG9wLCBwYXVzZSwgYW5kIHJlc3VtZSB0aGUgRE1BCisgKiB0cmFuc2ZlciBvZiBkYXRhLgorICovCitzdGF0aWMgaW50IHBzY19pMnNfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBzY19pMnMgKnBzY19pMnMgPSBydGQtPmRhaS0+Y3B1X2RhaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHBzY19pMnNfc3RyZWFtICpzOworCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpyZWdzID0gcHNjX2kycy0+cHNjX3JlZ3M7CisJdTE2IGltcjsKKwl1OCBwc2NfY21kOworCWxvbmcgZmxhZ3M7CisKKwlpZiAoc3Vic3RyZWFtLT5wc3RyLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQlzID0gJnBzY19pMnMtPmNhcHR1cmU7CisJZWxzZQorCQlzID0gJnBzY19pMnMtPnBsYXliYWNrOworCisJZGV2X2RiZyhwc2NfaTJzLT5kZXYsICJwc2NfaTJzX3RyaWdnZXIoc3Vic3RyZWFtPSVwLCBjbWQ9JWkpIgorCQkiIHN0cmVhbV9pZD0laVxuIiwKKwkJc3Vic3RyZWFtLCBjbWQsIHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcy0+cGVyaW9kX2J5dGVzID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsCisJCQkJCQkgIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwkJcy0+cGVyaW9kX3N0YXJ0ID0gdmlydF90b19waHlzKHJ1bnRpbWUtPmRtYV9hcmVhKTsKKwkJcy0+cGVyaW9kX2VuZCA9IHMtPnBlcmlvZF9zdGFydCArCisJCQkJKHMtPnBlcmlvZF9ieXRlcyAqIHJ1bnRpbWUtPnBlcmlvZHMpOworCQlzLT5wZXJpb2RfbmV4dF9wdCA9IHMtPnBlcmlvZF9zdGFydDsKKwkJcy0+cGVyaW9kX2N1cnJlbnRfcHQgPSBzLT5wZXJpb2Rfc3RhcnQ7CisJCXMtPmFjdGl2ZSA9IDE7CisKKwkJLyogRmlyc3Q7IHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwkJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQkJb3V0XzgoJnJlZ3MtPmNvbW1hbmQsIE1QQzUyeHhfUFNDX1JTVF9SWCk7CisJCQlvdXRfOCgmcmVncy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfUlNUX0VSUl9TVEFUKTsKKwkJfSBlbHNlIHsKKwkJCW91dF84KCZyZWdzLT5jb21tYW5kLCBNUEM1Mnh4X1BTQ19SU1RfVFgpOworCQkJb3V0XzgoJnJlZ3MtPmNvbW1hbmQsIE1QQzUyeHhfUFNDX1JTVF9FUlJfU1RBVCk7CisJCX0KKworCQkvKiBOZXh0LCBmaWxsIHVwIHRoZSBiZXN0Y29tbSBiZCBxdWV1ZSBhbmQgZW5hYmxlIERNQS4KKwkJICogVGhpcyB3aWxsIGJlZ2luIGZpbGxpbmcgdGhlIFBTQydzIGZpZm8uICovCisJCWlmIChzdWJzdHJlYW0tPnBzdHItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQliY29tX2dlbl9iZF9yeF9yZXNldChzLT5iY29tX3Rhc2spOworCQllbHNlCisJCQliY29tX2dlbl9iZF90eF9yZXNldChzLT5iY29tX3Rhc2spOworCQl3aGlsZSAoIWJjb21fcXVldWVfZnVsbChzLT5iY29tX3Rhc2spKQorCQkJcHNjX2kyc19iY29tX2VucXVldWVfbmV4dF9idWZmZXIocyk7CisJCWJjb21fZW5hYmxlKHMtPmJjb21fdGFzayk7CisKKwkJLyogRHVlIHRvIGVycmF0YSBpbiB0aGUgaTJzIG1vZGU7IG5lZWQgdG8gbGluZSB1cCBlbmFibGluZworCQkgKiB0aGUgdHJhbnNtaXR0ZXIgd2l0aCBhIHRyYW5zaXRpb24gb24gdGhlIGZyYW1lIHN5bmMKKwkJICogbGluZSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwc2NfaTJzLT5sb2NrLCBmbGFncyk7CisJCS8qIGZpcnN0IG1ha2Ugc3VyZSBpdCBpcyBsb3cgKi8KKwkJd2hpbGUgKChpbl84KCZyZWdzLT5pcGNyX2Fjci5pcGNyKSAmIDB4ODApICE9IDApCisJCQk7CisJCS8qIHRoZW4gd2FpdCBmb3IgdGhlIHRyYW5zaXRpb24gdG8gaGlnaCAqLworCQl3aGlsZSAoKGluXzgoJnJlZ3MtPmlwY3JfYWNyLmlwY3IpICYgMHg4MCkgPT0gMCkKKwkJCTsKKwkJLyogRmluYWxseSwgZW5hYmxlIHRoZSBQU0MuCisJCSAqIFJlY2VpdmVyIG11c3QgYWx3YXlzIGJlIGVuYWJsZWQ7IGV2ZW4gd2hlbiB3ZSBvbmx5IHdhbnQKKwkJICogdHJhbnNtaXQuICAoc2VlIDE1LjMuMi4zIG9mIE1QQzUyMDBCIFVzZXIncyBHdWlkZSkgKi8KKwkJcHNjX2NtZCA9IE1QQzUyeHhfUFNDX1JYX0VOQUJMRTsKKwkJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQlwc2NfY21kIHw9IE1QQzUyeHhfUFNDX1RYX0VOQUJMRTsKKwkJb3V0XzgoJnJlZ3MtPmNvbW1hbmQsIHBzY19jbWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc2NfaTJzLT5sb2NrLCBmbGFncyk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCS8qIFR1cm4gb2ZmIHRoZSBQU0MgKi8KKwkJcy0+YWN0aXZlID0gMDsKKwkJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgeworCQkJaWYgKCFwc2NfaTJzLT5wbGF5YmFjay5hY3RpdmUpIHsKKwkJCQlvdXRfOCgmcmVncy0+Y29tbWFuZCwgMiA8PCA0KTsJLyogcmVzZXQgcnggKi8KKwkJCQlvdXRfOCgmcmVncy0+Y29tbWFuZCwgMyA8PCA0KTsJLyogcmVzZXQgdHggKi8KKwkJCQlvdXRfOCgmcmVncy0+Y29tbWFuZCwgNCA8PCA0KTsJLyogcmVzZXQgZXJyICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRfOCgmcmVncy0+Y29tbWFuZCwgMyA8PCA0KTsJLyogcmVzZXQgdHggKi8KKwkJCW91dF84KCZyZWdzLT5jb21tYW5kLCA0IDw8IDQpOwkvKiByZXNldCBlcnIgKi8KKwkJCWlmICghcHNjX2kycy0+Y2FwdHVyZS5hY3RpdmUpCisJCQkJb3V0XzgoJnJlZ3MtPmNvbW1hbmQsIDIgPDwgNCk7CS8qIHJlc2V0IHJ4ICovCisJCX0KKworCQliY29tX2Rpc2FibGUocy0+YmNvbV90YXNrKTsKKwkJd2hpbGUgKCFiY29tX3F1ZXVlX2VtcHR5KHMtPmJjb21fdGFzaykpCisJCQliY29tX3JldHJpZXZlX2J1ZmZlcihzLT5iY29tX3Rhc2ssIE5VTEwsIE5VTEwpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2RiZyhwc2NfaTJzLT5kZXYsICJpbnZhbGlkIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBVcGRhdGUgaW50ZXJydXB0IGVuYWJsZSBzZXR0aW5ncyAqLworCWltciA9IDA7CisJaWYgKHBzY19pMnMtPnBsYXliYWNrLmFjdGl2ZSkKKwkJaW1yIHw9IE1QQzUyeHhfUFNDX0lNUl9UWEVNUDsKKwlpZiAocHNjX2kycy0+Y2FwdHVyZS5hY3RpdmUpCisJCWltciB8PSBNUEM1Mnh4X1BTQ19JTVJfT1JFUlI7CisJb3V0X2JlMTYoJnJlZ3MtPmlzcl9pbXIuaW1yLCBpbXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHNjX2kyc19zaHV0ZG93bjogc2h1dGRvd24gdGhlIGRhdGEgdHJhbnNmZXIgb24gYSBzdHJlYW0KKyAqCisgKiBTaHV0ZG93biB0aGUgUFNDIGlmIHRoZXJlIGFyZSBubyBvdGhlciBzdWJzdHJlYW1zIG9wZW4uCisgKi8KK3N0YXRpYyB2b2lkIHBzY19pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwc2NfaTJzICpwc2NfaTJzID0gcnRkLT5kYWktPmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcocHNjX2kycy0+ZGV2LCAicHNjX2kyc19zaHV0ZG93bihzdWJzdHJlYW09JXApXG4iLCBzdWJzdHJlYW0pOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBzdWJzdHJlYW0sIGRpc2FibGUgdGhlIFBTQyBhbmQgcmVsZWFzZQorCSAqIHRoZSBJUlEuCisJICovCisJaWYgKCFwc2NfaTJzLT5wbGF5YmFjay5hY3RpdmUgJiYKKwkgICAgIXBzY19pMnMtPmNhcHR1cmUuYWN0aXZlKSB7CisKKwkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgcmVzZXQgdGhlIFBTQyAqLworCQlvdXRfYmUxNigmcHNjX2kycy0+cHNjX3JlZ3MtPmlzcl9pbXIuaW1yLCAwKTsKKwkJb3V0XzgoJnBzY19pMnMtPnBzY19yZWdzLT5jb21tYW5kLCAzIDw8IDQpOyAvKiByZXNldCB0eCAqLworCQlvdXRfOCgmcHNjX2kycy0+cHNjX3JlZ3MtPmNvbW1hbmQsIDIgPDwgNCk7IC8qIHJlc2V0IHJ4ICovCisJCW91dF84KCZwc2NfaTJzLT5wc2NfcmVncy0+Y29tbWFuZCwgMSA8PCA0KTsgLyogcmVzZXQgbW9kZSAqLworCQlvdXRfOCgmcHNjX2kycy0+cHNjX3JlZ3MtPmNvbW1hbmQsIDQgPDwgNCk7IC8qIHJlc2V0IGVycm9yICovCisKKwkJLyogUmVsZWFzZSBpcnFzICovCisJCWZyZWVfaXJxKHBzY19pMnMtPmlycSwgcHNjX2kycyk7CisJCWZyZWVfaXJxKHBzY19pMnMtPmNhcHR1cmUuaXJxLCAmcHNjX2kycy0+Y2FwdHVyZSk7CisJCWZyZWVfaXJxKHBzY19pMnMtPnBsYXliYWNrLmlycSwgJnBzY19pMnMtPnBsYXliYWNrKTsKKwl9Cit9CisKKy8qKgorICogcHNjX2kyc19zZXRfc3lzY2xrOiBzZXQgdGhlIGNsb2NrIGZyZXF1ZW5jeSBhbmQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIG1hY2hpbmUgZHJpdmVyIHRvIHRlbGwgdXMgd2hhdCB0aGUgY2xvY2sKKyAqIGZyZXF1ZW5jeSBhbmQgZGlyZWN0aW9uIGFyZS4KKyAqCisgKiBDdXJyZW50bHksIHdlIG9ubHkgc3VwcG9ydCBvcGVyYXRpbmcgYXMgYSBjbG9jayBzbGF2ZSAoU05EX1NPQ19DTE9DS19JTiksCisgKiBhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZnJlcXVlbmN5LiAgUmV0dXJuIGFuIGVycm9yIGlmIHRoZSBkaXJlY3Rpb24KKyAqIGlzIG5vdCBTTkRfU09DX0NMT0NLX0lOLgorICoKKyAqIEBjbGtfaWQ6IHJlc2VydmVkLCBzaG91bGQgYmUgemVybworICogQGZyZXE6IHRoZSBmcmVxdWVuY3kgb2YgdGhlIGdpdmVuIGNsb2NrIElELCBjdXJyZW50bHkgaWdub3JlZAorICogQGRpcjogU05EX1NPQ19DTE9DS19JTiAoY2xvY2sgc2xhdmUpIG9yIFNORF9TT0NfQ0xPQ0tfT1VUIChjbG9jayBtYXN0ZXIpCisgKi8KK3N0YXRpYyBpbnQgcHNjX2kyc19zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSwKKwkJCSAgICAgIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBwc2NfaTJzICpwc2NfaTJzID0gY3B1X2RhaS0+cHJpdmF0ZV9kYXRhOworCWRldl9kYmcocHNjX2kycy0+ZGV2LCAicHNjX2kyc19zZXRfc3lzY2xrKGNwdV9kYWk9JXAsIGRpcj0laSlcbiIsCisJCQkJY3B1X2RhaSwgZGlyKTsKKwlyZXR1cm4gKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKSA/IDAgOiAtRUlOVkFMOworfQorCisvKioKKyAqIHBzY19pMnNfc2V0X2ZtdDogc2V0IHRoZSBzZXJpYWwgZm9ybWF0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBtYWNoaW5lIGRyaXZlciB0byB0ZWxsIHVzIHdoYXQgc2VyaWFsCisgKiBmb3JtYXQgdG8gdXNlLgorICoKKyAqIFRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgSTJTIG1vZGUuICBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGZvcm1hdCBpcworICogbm90IFNORF9TT0NfREFJRk1UX0kyUy4KKyAqCisgKiBAZm9ybWF0OiBvbmUgb2YgU05EX1NPQ19EQUlGTVRfeHh4CisgKi8KK3N0YXRpYyBpbnQgcHNjX2kyc19zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSwgdW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycyA9IGNwdV9kYWktPnByaXZhdGVfZGF0YTsKKwlkZXZfZGJnKHBzY19pMnMtPmRldiwgInBzY19pMnNfc2V0X2ZtdChjcHVfZGFpPSVwLCBmb3JtYXQ9JWkpXG4iLAorCQkJCWNwdV9kYWksIGZvcm1hdCk7CisJcmV0dXJuIChmb3JtYXQgPT0gU05EX1NPQ19EQUlGTVRfSTJTKSA/IDAgOiAtRUlOVkFMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFMU0EgU29DIEJpbmRpbmdzCisgKgorICogLSBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZSAoREFJKSB0ZW1wbGF0ZQorICogLSBjcmVhdGUvZGVzdHJveSBkYWkgaG9va3MKKyAqLworCisvKioKKyAqIHBzY19pMnNfZGFpX3RlbXBsYXRlOiB0ZW1wbGF0ZSBDUFUgRGlnaXRhbCBBdWRpbyBJbnRlcmZhY2UKKyAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaSBwc2NfaTJzX2RhaV90ZW1wbGF0ZSA9IHsKKwkudHlwZSA9IFNORF9TT0NfREFJX0kyUywKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFNDX0kyU19SQVRFUywKKwkJLmZvcm1hdHMgPSBQU0NfSTJTX0ZPUk1BVFMsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBQU0NfSTJTX1JBVEVTLAorCQkuZm9ybWF0cyA9IFBTQ19JMlNfRk9STUFUUywKKwl9LAorCS5vcHMgPSB7CisJCS5zdGFydHVwID0gcHNjX2kyc19zdGFydHVwLAorCQkuaHdfcGFyYW1zID0gcHNjX2kyc19od19wYXJhbXMsCisJCS5od19mcmVlID0gcHNjX2kyc19od19mcmVlLAorCQkuc2h1dGRvd24gPSBwc2NfaTJzX3NodXRkb3duLAorCQkudHJpZ2dlciA9IHBzY19pMnNfdHJpZ2dlciwKKwl9LAorCS5kYWlfb3BzID0geworCQkuc2V0X3N5c2NsayA9IHBzY19pMnNfc2V0X3N5c2NsaywKKwkJLnNldF9mbXQgPSBwc2NfaTJzX3NldF9mbXQsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlIFBTQyBJMlMgJ0FTb0MgcGxhdGZvcm0nIGRyaXZlcgorICoKKyAqIENhbiBiZSByZWZlcmVuY2VkIGJ5IGFuICdBU29DIG1hY2hpbmUnIGRyaXZlcgorICogVGhpcyBkcml2ZXIgb25seSBkZWFscyB3aXRoIHRoZSBhdWRpbyBidXM7IGl0IGRvZXNuJ3QgaGF2ZSBhbnkKKyAqIGludGVyYWN0aW9uIHdpdGggdGhlIGF0dGFjaGVkIGNvZGVjCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBzY19pMnNfcGNtX2hhcmR3YXJlID0geworCS5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8IFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSLAorCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSwKKwkucmF0ZV9taW4gPSA4MDAwLAorCS5yYXRlX21heCA9IDQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gMTAyNCAqIDEwMjQsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kc19taW4JCT0gMiwKKwkucGVyaW9kc19tYXgJCT0gMjU2LAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gMiAqIDEwMjQgKiAxMDI0LAorCS5maWZvX3NpemUJCT0gMCwKK307CisKK3N0YXRpYyBpbnQgcHNjX2kyc19wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBzY19pMnMgKnBzY19pMnMgPSBydGQtPmRhaS0+Y3B1X2RhaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwc2NfaTJzX3N0cmVhbSAqczsKKworCWRldl9kYmcocHNjX2kycy0+ZGV2LCAicHNjX2kyc19wY21fb3BlbihzdWJzdHJlYW09JXApXG4iLCBzdWJzdHJlYW0pOworCisJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcyA9ICZwc2NfaTJzLT5jYXB0dXJlOworCWVsc2UKKwkJcyA9ICZwc2NfaTJzLT5wbGF5YmFjazsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmcHNjX2kyc19wY21faGFyZHdhcmUpOworCisJcy0+c3RyZWFtID0gc3Vic3RyZWFtOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzY19pMnNfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycyA9IHJ0ZC0+ZGFpLT5jcHVfZGFpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBzY19pMnNfc3RyZWFtICpzOworCisJZGV2X2RiZyhwc2NfaTJzLT5kZXYsICJwc2NfaTJzX3BjbV9jbG9zZShzdWJzdHJlYW09JXApXG4iLCBzdWJzdHJlYW0pOworCisJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcyA9ICZwc2NfaTJzLT5jYXB0dXJlOworCWVsc2UKKwkJcyA9ICZwc2NfaTJzLT5wbGF5YmFjazsKKworCXMtPnN0cmVhbSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAorcHNjX2kyc19wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBzY19pMnMgKnBzY19pMnMgPSBydGQtPmRhaS0+Y3B1X2RhaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwc2NfaTJzX3N0cmVhbSAqczsKKwlkbWFfYWRkcl90IGNvdW50OworCisJaWYgKHN1YnN0cmVhbS0+cHN0ci0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcyA9ICZwc2NfaTJzLT5jYXB0dXJlOworCWVsc2UKKwkJcyA9ICZwc2NfaTJzLT5wbGF5YmFjazsKKworCWNvdW50ID0gcy0+cGVyaW9kX2N1cnJlbnRfcHQgLSBzLT5wZXJpb2Rfc3RhcnQ7CisKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgY291bnQpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBzY19pMnNfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBwc2NfaTJzX3BjbV9vcGVuLAorCS5jbG9zZQkJPSBwc2NfaTJzX3BjbV9jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLnBvaW50ZXIJPSBwc2NfaTJzX3BjbV9wb2ludGVyLAorfTsKKworc3RhdGljIHU2NCBwc2NfaTJzX3BjbV9kbWFtYXNrID0gMHhmZmZmZmZmZjsKK3N0YXRpYyBpbnQgcHNjX2kyc19wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkgICBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBwY20tPnByaXZhdGVfZGF0YTsKKwlzaXplX3Qgc2l6ZSA9IHBzY19pMnNfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisJaW50IHJjID0gMDsKKworCWRldl9kYmcocnRkLT5zb2NkZXYtPmRldiwgInBzY19pMnNfcGNtX25ldyhjYXJkPSVwLCBkYWk9JXAsIHBjbT0lcClcbiIsCisJCWNhcmQsIGRhaSwgcGNtKTsKKworCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZwc2NfaTJzX3BjbV9kbWFtYXNrOworCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisKKwlpZiAocGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbSkgeworCQlyYyA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBwY20tPmRldiwgc2l6ZSwKKwkJCQkJJnBjbS0+c3RyZWFtc1swXS5zdWJzdHJlYW0tPmRtYV9idWZmZXIpOworCQlpZiAocmMpCisJCQlnb3RvIHBsYXliYWNrX2FsbG9jX2VycjsKKwl9CisKKwlpZiAocGNtLT5zdHJlYW1zWzFdLnN1YnN0cmVhbSkgeworCQlyYyA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBwY20tPmRldiwgc2l6ZSwKKwkJCQkJJnBjbS0+c3RyZWFtc1sxXS5zdWJzdHJlYW0tPmRtYV9idWZmZXIpOworCQlpZiAocmMpCisJCQlnb3RvIGNhcHR1cmVfYWxsb2NfZXJyOworCX0KKworCXJldHVybiAwOworCisgY2FwdHVyZV9hbGxvY19lcnI6CisJaWYgKHBjbS0+c3RyZWFtc1swXS5zdWJzdHJlYW0pCisJCXNuZF9kbWFfZnJlZV9wYWdlcygmcGNtLT5zdHJlYW1zWzBdLnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisgcGxheWJhY2tfYWxsb2NfZXJyOgorCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlcihzKVxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHBzY19pMnNfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gcGNtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJaW50IHN0cmVhbTsKKworCWRldl9kYmcocnRkLT5zb2NkZXYtPmRldiwgInBzY19pMnNfcGNtX2ZyZWUocGNtPSVwKVxuIiwgcGNtKTsKKworCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKKwkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCQlpZiAoc3Vic3RyZWFtKSB7CisJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisJCQlzdWJzdHJlYW0tPmRtYV9idWZmZXIuYXJlYSA9IE5VTEw7CisJCQlzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA9IDA7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHBzY19pMnNfcGNtX3NvY19wbGF0Zm9ybSA9IHsKKwkubmFtZQkJPSAibXBjNTIwMC1wc2MtYXVkaW8iLAorCS5wY21fb3BzCT0gJnBzY19pMnNfcGNtX29wcywKKwkucGNtX25ldwk9ICZwc2NfaTJzX3BjbV9uZXcsCisJLnBjbV9mcmVlCT0gJnBzY19pMnNfcGNtX2ZyZWUsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN5c2ZzIGF0dHJpYnV0ZXMgZm9yIGRlYnVnZ2luZworICovCisKK3N0YXRpYyBzc2l6ZV90IHBzY19pMnNfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAic3RhdHVzPSUuNHggc2ljcj0lLjh4IHJmbnVtPSVpIHJmc3RhdD0weCUuNHggIgorCQkJInRmbnVtPSVpIHRmc3RhdD0weCUuNHhcbiIsCisJCQlpbl9iZTE2KCZwc2NfaTJzLT5wc2NfcmVncy0+c3JfY3NyLnN0YXR1cyksCisJCQlpbl9iZTMyKCZwc2NfaTJzLT5wc2NfcmVncy0+c2ljciksCisJCQlpbl9iZTE2KCZwc2NfaTJzLT5maWZvX3JlZ3MtPnJmbnVtKSAmIDB4MWZmLAorCQkJaW5fYmUxNigmcHNjX2kycy0+Zmlmb19yZWdzLT5yZnN0YXQpLAorCQkJaW5fYmUxNigmcHNjX2kycy0+Zmlmb19yZWdzLT50Zm51bSkgJiAweDFmZiwKKwkJCWluX2JlMTYoJnBzY19pMnMtPmZpZm9fcmVncy0+dGZzdGF0KSk7Cit9CisKK3N0YXRpYyBpbnQgKnBzY19pMnNfZ2V0X3N0YXRfYXR0cihzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICJwbGF5YmFja191bmRlcnJ1biIpID09IDApCisJCXJldHVybiAmcHNjX2kycy0+c3RhdHMudW5kZXJydW5fY291bnQ7CisJaWYgKHN0cmNtcChuYW1lLCAiY2FwdHVyZV9vdmVycnVuIikgPT0gMCkKKwkJcmV0dXJuICZwc2NfaTJzLT5zdGF0cy5vdmVycnVuX2NvdW50OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBzY19pMnNfc3RhdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kycyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCAqYXR0cmliOworCisJYXR0cmliID0gcHNjX2kyc19nZXRfc3RhdF9hdHRyKHBzY19pMnMsIGF0dHItPmF0dHIubmFtZSk7CisJaWYgKCFhdHRyaWIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsICphdHRyaWIpOworfQorCitzdGF0aWMgc3NpemVfdCBwc2NfaTJzX3N0YXRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsCisJCQkJICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBzY19pMnMgKnBzY19pMnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgKmF0dHJpYjsKKworCWF0dHJpYiA9IHBzY19pMnNfZ2V0X3N0YXRfYXR0cihwc2NfaTJzLCBhdHRyLT5hdHRyLm5hbWUpOworCWlmICghYXR0cmliKQorCQlyZXR1cm4gMDsKKworCSphdHRyaWIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCXJldHVybiBjb3VudDsKK30KKworREVWSUNFX0FUVFIoc3RhdHVzLCAwNjQ0LCBwc2NfaTJzX3N0YXR1c19zaG93LCBOVUxMKTsKK0RFVklDRV9BVFRSKHBsYXliYWNrX3VuZGVycnVuLCAwNjQ0LCBwc2NfaTJzX3N0YXRfc2hvdywgcHNjX2kyc19zdGF0X3N0b3JlKTsKK0RFVklDRV9BVFRSKGNhcHR1cmVfb3ZlcnJ1biwgMDY0NCwgcHNjX2kyc19zdGF0X3Nob3csIHBzY19pMnNfc3RhdF9zdG9yZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT0YgcGxhdGZvcm0gYnVzIGJpbmRpbmcgY29kZToKKyAqIC0gUHJvYmUvcmVtb3ZlIG9wZXJhdGlvbnMKKyAqIC0gT0YgZGV2aWNlIG1hdGNoIHRhYmxlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBzY19pMnNfb2ZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJcGh5c19hZGRyX3QgZmlmbzsKKwlzdHJ1Y3QgcHNjX2kycyAqcHNjX2kyczsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCWludCBzaXplLCBwc2NfaWQsIGlycSwgcmM7CisJY29uc3QgX19iZTMyICpwcm9wOworCXZvaWQgX19pb21lbSAqcmVnczsKKworCWRldl9kYmcoJm9wLT5kZXYsICJwcm9iaW5nIHBzYyBpMnMgZGV2aWNlXG4iKTsKKworCS8qIEdldCB0aGUgUFNDIElEICovCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgImNlbGwtaW5kZXgiLCAmc2l6ZSk7CisJaWYgKCFwcm9wIHx8IHNpemUgPCBzaXplb2YgKnByb3ApCisJCXJldHVybiAtRU5PREVWOworCXBzY19pZCA9IGJlMzJfdG9fY3B1KCpwcm9wKTsKKworCS8qIEZldGNoIHRoZSByZWdpc3RlcnMgYW5kIElSUSBvZiB0aGUgUFNDICovCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDApOworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5ub2RlLCAwLCAmcmVzKSkgeworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiTWlzc2luZyByZWcgcHJvcGVydHlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCAxICsgcmVzLmVuZCAtIHJlcy5zdGFydCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9lcnIoJm9wLT5kZXYsICJDb3VsZCBub3QgbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCisJcHNjX2kycyA9IGt6YWxsb2Moc2l6ZW9mICpwc2NfaTJzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzY19pMnMpIHsKKwkJaW91bm1hcChyZWdzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZwc2NfaTJzLT5sb2NrKTsKKwlwc2NfaTJzLT5pcnEgPSBpcnE7CisJcHNjX2kycy0+cHNjX3JlZ3MgPSByZWdzOworCXBzY19pMnMtPmZpZm9fcmVncyA9IHJlZ3MgKyBzaXplb2YgKnBzY19pMnMtPnBzY19yZWdzOworCXBzY19pMnMtPmRldiA9ICZvcC0+ZGV2OworCXBzY19pMnMtPnBsYXliYWNrLnBzY19pMnMgPSBwc2NfaTJzOworCXBzY19pMnMtPmNhcHR1cmUucHNjX2kycyA9IHBzY19pMnM7CisJc25wcmludGYocHNjX2kycy0+bmFtZSwgc2l6ZW9mIHBzY19pMnMtPm5hbWUsICJQU0MldSIsIHBzY19pZCsxKTsKKworCS8qIEZpbGwgb3V0IHRoZSBDUFUgREFJIHN0cnVjdHVyZSAqLworCW1lbWNweSgmcHNjX2kycy0+ZGFpLCAmcHNjX2kyc19kYWlfdGVtcGxhdGUsIHNpemVvZiBwc2NfaTJzLT5kYWkpOworCXBzY19pMnMtPmRhaS5wcml2YXRlX2RhdGEgPSBwc2NfaTJzOworCXBzY19pMnMtPmRhaS5uYW1lID0gcHNjX2kycy0+bmFtZTsKKwlwc2NfaTJzLT5kYWkuaWQgPSBwc2NfaWQ7CisKKwkvKiBGaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBmaWZvIGRhdGEgcmVnaXN0ZXJzIGFuZCBzZXR1cCB0aGUKKwkgKiBETUEgdGFza3MgKi8KKwlmaWZvID0gcmVzLnN0YXJ0ICsgb2Zmc2V0b2Yoc3RydWN0IG1wYzUyeHhfcHNjLCBidWZmZXIuYnVmZmVyXzMyKTsKKwlwc2NfaTJzLT5jYXB0dXJlLmJjb21fdGFzayA9CisJCWJjb21fcHNjX2dlbl9iZF9yeF9pbml0KHBzY19pZCwgMTAsIGZpZm8sIDUxMik7CisJcHNjX2kycy0+cGxheWJhY2suYmNvbV90YXNrID0KKwkJYmNvbV9wc2NfZ2VuX2JkX3R4X2luaXQocHNjX2lkLCAxMCwgZmlmbyk7CisJaWYgKCFwc2NfaTJzLT5jYXB0dXJlLmJjb21fdGFzayB8fAorCSAgICAhcHNjX2kycy0+cGxheWJhY2suYmNvbV90YXNrKSB7CisJCWRldl9lcnIoJm9wLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgYmVzdGNvbW0gdGFza3NcbiIpOworCQlpb3VubWFwKHJlZ3MpOworCQlrZnJlZShwc2NfaTJzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgcmVzZXQgdGhlIFBTQyAqLworCW91dF9iZTE2KCZwc2NfaTJzLT5wc2NfcmVncy0+aXNyX2ltci5pbXIsIDApOworCW91dF84KCZwc2NfaTJzLT5wc2NfcmVncy0+Y29tbWFuZCwgMyA8PCA0KTsgLyogcmVzZXQgdHJhbnNtaXR0ZXIgKi8KKwlvdXRfOCgmcHNjX2kycy0+cHNjX3JlZ3MtPmNvbW1hbmQsIDIgPDwgNCk7IC8qIHJlc2V0IHJlY2VpdmVyICovCisJb3V0XzgoJnBzY19pMnMtPnBzY19yZWdzLT5jb21tYW5kLCAxIDw8IDQpOyAvKiByZXNldCBtb2RlICovCisJb3V0XzgoJnBzY19pMnMtPnBzY19yZWdzLT5jb21tYW5kLCA0IDw8IDQpOyAvKiByZXNldCBlcnJvciAqLworCisJLyogQ29uZmlndXJlIHRoZSBzZXJpYWwgaW50ZXJmYWNlIG1vZGU7IGRlZmF1bHRpbmcgdG8gQ09ERUM4IG1vZGUgKi8KKwlwc2NfaTJzLT5zaWNyID0gTVBDNTJ4eF9QU0NfU0lDUl9EVFMxIHwgTVBDNTJ4eF9QU0NfU0lDUl9JMlMgfAorCQkJTVBDNTJ4eF9QU0NfU0lDUl9DTEtQT0w7CisJaWYgKG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgImZzbCxjZWxsc2xhdmUiLCBOVUxMKSkKKwkJcHNjX2kycy0+c2ljciB8PSBNUEM1Mnh4X1BTQ19TSUNSX0NFTExTTEFWRSB8CisJCQkJIE1QQzUyeHhfUFNDX1NJQ1JfR0VOQ0xLOworCW91dF9iZTMyKCZwc2NfaTJzLT5wc2NfcmVncy0+c2ljciwKKwkJIHBzY19pMnMtPnNpY3IgfCBNUEM1Mnh4X1BTQ19TSUNSX1NJTV9DT0RFQ184KTsKKworCS8qIENoZWNrIGZvciB0aGUgY29kZWMgaGFuZGxlLiAgSWYgaXQgaXMgbm90IHByZXNlbnQgdGhlbiB3ZQorCSAqIGFyZSBkb25lICovCisJaWYgKCFvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJjb2RlYy1oYW5kbGUiLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZXQgdXAgbW9kZSByZWdpc3RlcjsKKwkgKiBGaXJzdCB3cml0ZTogUnhSZHkgKEZJRk8gQWxhcm0pIGdlbmVyYXRlcyByeCBGSUZPIGlycQorCSAqIFNlY29uZCB3cml0ZTogcmVnaXN0ZXIgTm9ybWFsIG1vZGUgZm9yIG5vbiBsb29wYmFjaworCSAqLworCW91dF84KCZwc2NfaTJzLT5wc2NfcmVncy0+bW9kZSwgMCk7CisJb3V0XzgoJnBzY19pMnMtPnBzY19yZWdzLT5tb2RlLCAwKTsKKworCS8qIFNldCB0aGUgVFggYW5kIFJYIGZpZm8gYWxhcm0gdGhyZXNob2xkcyAqLworCW91dF9iZTE2KCZwc2NfaTJzLT5maWZvX3JlZ3MtPnJmYWxhcm0sIDB4MTAwKTsKKwlvdXRfOCgmcHNjX2kycy0+Zmlmb19yZWdzLT5yZmNudGwsIDB4NCk7CisJb3V0X2JlMTYoJnBzY19pMnMtPmZpZm9fcmVncy0+dGZhbGFybSwgMHgxMDApOworCW91dF84KCZwc2NfaTJzLT5maWZvX3JlZ3MtPnRmY250bCwgMHg3KTsKKworCS8qIExvb2t1cCB0aGUgSVJRIG51bWJlcnMgKi8KKwlwc2NfaTJzLT5wbGF5YmFjay5pcnEgPQorCQliY29tX2dldF90YXNrX2lycShwc2NfaTJzLT5wbGF5YmFjay5iY29tX3Rhc2spOworCXBzY19pMnMtPmNhcHR1cmUuaXJxID0KKwkJYmNvbV9nZXRfdGFza19pcnEocHNjX2kycy0+Y2FwdHVyZS5iY29tX3Rhc2spOworCisJLyogU2F2ZSB3aGF0IHdlJ3ZlIGRvbmUgc28gaXQgY2FuIGJlIGZvdW5kIGFnYWluIGxhdGVyICovCisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBwc2NfaTJzKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBTWVNGUyBmaWxlcyAqLworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKHBzY19pMnMtPmRldiwgJmRldl9hdHRyX3N0YXR1cyk7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUocHNjX2kycy0+ZGV2LCAmZGV2X2F0dHJfY2FwdHVyZV9vdmVycnVuKTsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShwc2NfaTJzLT5kZXYsICZkZXZfYXR0cl9wbGF5YmFja191bmRlcnJ1bik7CisJaWYgKHJjKQorCQlkZXZfaW5mbyhwc2NfaTJzLT5kZXYsICJlcnJvciBjcmVhdGluZyBzeXNmcyBmaWxlc1xuIik7CisKKwkvKiBUZWxsIHRoZSBBU29DIE9GIGhlbHBlcnMgYWJvdXQgaXQgKi8KKwlvZl9zbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwc2NfaTJzX3BjbV9zb2NfcGxhdGZvcm0sIG9wLT5ub2RlLAorCQkJCSAgICAgJnBzY19pMnMtPmRhaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcHNjX2kyc19vZl9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJc3RydWN0IHBzY19pMnMgKnBzY19pMnMgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCisJZGV2X2RiZygmb3AtPmRldiwgInBzY19pMnNfcmVtb3ZlKClcbiIpOworCisJYmNvbV9nZW5fYmRfcnhfcmVsZWFzZShwc2NfaTJzLT5jYXB0dXJlLmJjb21fdGFzayk7CisJYmNvbV9nZW5fYmRfdHhfcmVsZWFzZShwc2NfaTJzLT5wbGF5YmFjay5iY29tX3Rhc2spOworCisJaW91bm1hcChwc2NfaTJzLT5wc2NfcmVncyk7CisJaW91bm1hcChwc2NfaTJzLT5maWZvX3JlZ3MpOworCWtmcmVlKHBzY19pMnMpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBzY19pMnNfbWF0Y2hbXSBfX2RldmluaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcHNjLWkycyIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwc2NfaTJzX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgcHNjX2kyc19kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlID0gcHNjX2kyc19tYXRjaCwKKwkucHJvYmUgPSBwc2NfaTJzX29mX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwc2NfaTJzX29mX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXBjNTIwMC1wc2MtaTJzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTW9kdWxlIHNldHVwIGFuZCB0ZWFyZG93bjsgc2ltcGx5IHJlZ2lzdGVyIHRoZSBvZl9wbGF0Zm9ybSBkcml2ZXIKKyAqIGZvciB0aGUgUFNDIGluIEkyUyBtb2RlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwc2NfaTJzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZwc2NfaTJzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwc2NfaTJzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHNjX2kyc19leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnBzY19pMnNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBzY19pMnNfZXhpdCk7CisKKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYyBiL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKaW5kZXggNGJkYzlkOC4uOTRmODlkZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYworKysgYi9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCkBAIC02OCwxMCArNjgsNiBAQAogCWd1dHNfc2V0X3BtdXhjcl9kbWEobWFjaGluZV9kYXRhLT5ndXRzLCBtYWNoaW5lX2RhdGEtPmRtYV9pZCwKIAkJbWFjaGluZV9kYXRhLT5kbWFfY2hhbm5lbF9pZFsxXSwgMCk7CiAKLQlndXRzX3NldF9wbXV4Y3JfZG1hKG1hY2hpbmVfZGF0YS0+Z3V0cywgMSwgMCwgMCk7Ci0JZ3V0c19zZXRfcG11eGNyX2RtYShtYWNoaW5lX2RhdGEtPmd1dHMsIDEsIDMsIDApOwotCWd1dHNfc2V0X3BtdXhjcl9kbWEobWFjaGluZV9kYXRhLT5ndXRzLCAwLCAzLCAwKTsKLQogCXN3aXRjaCAobWFjaGluZV9kYXRhLT5zc2lfaWQpIHsKIAljYXNlIDA6CiAJCWNscnNldGJpdHNfYmUzMigmbWFjaGluZV9kYXRhLT5ndXRzLT5wbXV4Y3IsCkBAIC0yMzAsNiArMjI2LDggQEAKIAlzdHJ1Y3QgZnNsX3NzaV9pbmZvIHNzaV9pbmZvOwogCXN0cnVjdCBmc2xfZG1hX2luZm8gZG1hX2luZm87CiAJaW50IHJldCA9IC1FTk9ERVY7CisJdW5zaWduZWQgaW50IHBsYXliYWNrX2RtYV9jaGFubmVsOworCXVuc2lnbmVkIGludCBjYXB0dXJlX2RtYV9jaGFubmVsOwogCiAJbWFjaGluZV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1wYzg2MTBfaHBjZF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYWNoaW5lX2RhdGEpCkBAIC0zODEsOCArMzc5LDkgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQkvKiBGaW5kIHRoZSBETUEgY2hhbm5lbHMgdG8gdXNlLiAgRm9yIG5vdywgd2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgRE1BCi0JICAgY29udHJvbGxlci4gKi8KKwkvKiBGaW5kIHRoZSBETUEgY2hhbm5lbHMgdG8gdXNlLiAgQm90aCBTU0lzIG5lZWQgdG8gdXNlIHRoZSBzYW1lIERNQQorCSAqIGNvbnRyb2xsZXIsIHNvIGxldCdzIHVzZSBETUEjMS4KKwkgKi8KIAlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUoZG1hX25wLCBOVUxMLCAiZnNsLG1wYzg2MTAtZG1hIikgewogCQlpcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkbWFfbnAsICJjZWxsLWluZGV4IiwgTlVMTCk7CiAJCWlmIChpcHJvcCAmJiAoKmlwcm9wID09IDApKSB7CkBAIC0zOTcsMTQgKzM5NiwxOSBAQAogCX0KIAltYWNoaW5lX2RhdGEtPmRtYV9pZCA9ICppcHJvcDsKIAorCS8qIFNTSTEgbmVlZHMgdG8gdXNlIERNQSBDaGFubmVscyAwIGFuZCAxLCBhbmQgU1NJMiBuZWVkcyB0byB1c2UgRE1BCisJICogY2hhbm5lbHMgMiBhbmQgMy4gIFRoaXMgaXMganVzdCBob3cgdGhlIE1QQzg2MTAgaXMgd2lyZWQKKwkgKiBpbnRlcm5hbGx5LgorCSAqLworCXBsYXliYWNrX2RtYV9jaGFubmVsID0gKG1hY2hpbmVfZGF0YS0+c3NpX2lkID09IDApID8gMCA6IDI7CisJY2FwdHVyZV9kbWFfY2hhbm5lbCA9IChtYWNoaW5lX2RhdGEtPnNzaV9pZCA9PSAwKSA/IDEgOiAzOworCiAJLyoKLQkgKiBGaW5kIHRoZSBETUEgY2hhbm5lbHMgdG8gdXNlLiAgRm9yIG5vdywgd2UgYWx3YXlzIHVzZSBETUEgY2hhbm5lbCAwCi0JICogZm9yIHBsYXliYWNrLCBhbmQgRE1BIGNoYW5uZWwgMSBmb3IgY2FwdHVyZS4KKwkgKiBGaW5kIHRoZSBETUEgY2hhbm5lbHMgdG8gdXNlLgogCSAqLwogCXdoaWxlICgoZG1hX2NoYW5uZWxfbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChkbWFfbnAsIGRtYV9jaGFubmVsX25wKSkpIHsKIAkJaXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZG1hX2NoYW5uZWxfbnAsICJjZWxsLWluZGV4IiwgTlVMTCk7Ci0JCS8qIElzIGl0IERNQSBjaGFubmVsIDA/ICovCi0JCWlmIChpcHJvcCAmJiAoKmlwcm9wID09IDApKSB7CisJCWlmIChpcHJvcCAmJiAoKmlwcm9wID09IHBsYXliYWNrX2RtYV9jaGFubmVsKSkgewogCQkJLyogZG1hX2NoYW5uZWxbMF0gYW5kIGRtYV9pcnFbMF0gYXJlIGZvciBwbGF5YmFjayAqLwogCQkJZG1hX2luZm8uZG1hX2NoYW5uZWxbMF0gPSBvZl9pb21hcChkbWFfY2hhbm5lbF9ucCwgMCk7CiAJCQlkbWFfaW5mby5kbWFfaXJxWzBdID0KQEAgLTQxMiw3ICs0MTYsNyBAQAogCQkJbWFjaGluZV9kYXRhLT5kbWFfY2hhbm5lbF9pZFswXSA9ICppcHJvcDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChpcHJvcCAmJiAoKmlwcm9wID09IDEpKSB7CisJCWlmIChpcHJvcCAmJiAoKmlwcm9wID09IGNhcHR1cmVfZG1hX2NoYW5uZWwpKSB7CiAJCQkvKiBkbWFfY2hhbm5lbFsxXSBhbmQgZG1hX2lycVsxXSBhcmUgZm9yIGNhcHR1cmUgKi8KIAkJCWRtYV9pbmZvLmRtYV9jaGFubmVsWzFdID0gb2ZfaW9tYXAoZG1hX2NoYW5uZWxfbnAsIDApOwogCQkJZG1hX2luZm8uZG1hX2lycVsxXSA9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL3NvYy1vZi1zaW1wbGUuYyBiL3NvdW5kL3NvYy9mc2wvc29jLW9mLXNpbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODJmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZnNsL3NvYy1vZi1zaW1wbGUuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIE9GIGhlbHBlcnMgZm9yIEFMU0EgU29DIExheWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLW9mLXNpbXBsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworTU9EVUxFX0FVVEhPUigiR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBPcGVuRmlybXdhcmUgYmluZGluZ3MiKTsKKworc3RhdGljIERFRklORV9NVVRFWChvZl9zbmRfc29jX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQob2Zfc25kX3NvY19kZXZpY2VfbGlzdCk7CitzdGF0aWMgaW50IG9mX3NuZF9zb2NfbmV4dF9pbmRleDsKKworc3RydWN0IG9mX3NuZF9zb2NfZGV2aWNlIHsKKwlpbnQgaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzbmRfc29jX2RldmljZSBkZXZpY2U7CisJc3RydWN0IHNuZF9zb2NfbWFjaGluZSBtYWNoaW5lOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRhaV9saW5rOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpwbGF0Zm9ybV9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29kZWNfbm9kZTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgb2Zfc25kX3NvY19vcHMgPSB7Cit9OworCitzdGF0aWMgc3RydWN0IG9mX3NuZF9zb2NfZGV2aWNlICoKK29mX3NuZF9zb2NfZ2V0X2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvZGVjX25vZGUpCit7CisJc3RydWN0IG9mX3NuZF9zb2NfZGV2aWNlICpvZl9zb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9mX3NvYywgJm9mX3NuZF9zb2NfZGV2aWNlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG9mX3NvYy0+Y29kZWNfbm9kZSA9PSBjb2RlY19ub2RlKQorCQkJcmV0dXJuIG9mX3NvYzsKKwl9CisKKwlvZl9zb2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb2Zfc25kX3NvY19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9mX3NvYykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCB0byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlvZl9zb2MtPmNvZGVjX25vZGUgPSBjb2RlY19ub2RlOworCW9mX3NvYy0+aWQgPSBvZl9zbmRfc29jX25leHRfaW5kZXgrKzsKKwlvZl9zb2MtPm1hY2hpbmUuZGFpX2xpbmsgPSAmb2Zfc29jLT5kYWlfbGluazsKKwlvZl9zb2MtPm1hY2hpbmUubnVtX2xpbmtzID0gMTsKKwlvZl9zb2MtPmRldmljZS5tYWNoaW5lID0gJm9mX3NvYy0+bWFjaGluZTsKKwlvZl9zb2MtPmRhaV9saW5rLm9wcyA9ICZvZl9zbmRfc29jX29wczsKKwlsaXN0X2FkZCgmb2Zfc29jLT5saXN0LCAmb2Zfc25kX3NvY19kZXZpY2VfbGlzdCk7CisKKwlyZXR1cm4gb2Zfc29jOworfQorCitzdGF0aWMgdm9pZCBvZl9zbmRfc29jX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgb2Zfc25kX3NvY19kZXZpY2UgKm9mX3NvYykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCByYzsKKworCS8qIE9ubHkgcmVnaXN0ZXIgdGhlIGRldmljZSBpZiBib3RoIHRoZSBjb2RlYyBhbmQgcGxhdGZvcm0gaGF2ZQorCSAqIGJlZW4gcmVnaXN0ZXJlZCAqLworCWlmICgoIW9mX3NvYy0+ZGV2aWNlLmNvZGVjX2RhdGEpIHx8ICghb2Zfc29jLT5wbGF0Zm9ybV9ub2RlKSkKKwkJcmV0dXJuOworCisJcHJfaW5mbygicGxhdGZvcm08LS0+Y29kZWMgbWF0Y2ggYWNoaWV2ZWQ7IHJlZ2lzdGVyaW5nIG1hY2hpbmVcbiIpOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgb2Zfc29jLT5pZCk7CisJaWYgKCFwZGV2KSB7CisJCXByX2Vycigib2Zfc29jOiBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoKSBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBvZl9zb2M7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm9mX3NvYy0+ZGV2aWNlKTsKKwlvZl9zb2MtPmRldmljZS5kZXYgPSAmcGRldi0+ZGV2OworCisJLyogVGhlIEFTb0MgZGV2aWNlIGlzIGNvbXBsZXRlOyByZWdpc3RlciBpdCAqLworCXJjID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJvZl9zb2M6IHBsYXRmb3JtX2RldmljZV9hZGQoKSBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCit9CisKK2ludCBvZl9zbmRfc29jX3JlZ2lzdGVyX2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSAqY29kZWNfZGV2LAorCQkJICAgICAgdm9pZCAqY29kZWNfZGF0YSwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IG9mX3NuZF9zb2NfZGV2aWNlICpvZl9zb2M7CisJaW50IHJjID0gMDsKKworCXByX2luZm8oInJlZ2lzdGVyaW5nIEFTb0MgY29kZWMgZHJpdmVyOiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKworCW11dGV4X2xvY2soJm9mX3NuZF9zb2NfbXV0ZXgpOworCW9mX3NvYyA9IG9mX3NuZF9zb2NfZ2V0X2RldmljZShub2RlKTsKKwlpZiAoIW9mX3NvYykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIFN0b3JlIHRoZSBjb2RlYyBkYXRhICovCisJb2Zfc29jLT5kZXZpY2UuY29kZWNfZGF0YSA9IGNvZGVjX2RhdGE7CisJb2Zfc29jLT5kZXZpY2UuY29kZWNfZGV2ID0gY29kZWNfZGV2OworCW9mX3NvYy0+ZGFpX2xpbmsubmFtZSA9IChjaGFyICopbm9kZS0+bmFtZTsKKwlvZl9zb2MtPmRhaV9saW5rLnN0cmVhbV9uYW1lID0gKGNoYXIgKilub2RlLT5uYW1lOworCW9mX3NvYy0+ZGFpX2xpbmsuY29kZWNfZGFpID0gZGFpOworCisJLyogTm93IHRyeSB0byByZWdpc3RlciB0aGUgU29DIGRldmljZSAqLworCW9mX3NuZF9zb2NfcmVnaXN0ZXJfZGV2aWNlKG9mX3NvYyk7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZvZl9zbmRfc29jX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9zbmRfc29jX3JlZ2lzdGVyX2NvZGVjKTsKKworaW50IG9mX3NuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtLAorCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSkKK3sKKwlzdHJ1Y3Qgb2Zfc25kX3NvY19kZXZpY2UgKm9mX3NvYzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvZGVjX25vZGU7CisJY29uc3QgcGhhbmRsZSAqaGFuZGxlOworCWludCBsZW4sIHJjID0gMDsKKworCXByX2luZm8oInJlZ2lzdGVyaW5nIEFTb0MgcGxhdGZvcm0gZHJpdmVyOiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKworCWhhbmRsZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiY29kZWMtaGFuZGxlIiwgJmxlbik7CisJaWYgKCFoYW5kbGUgfHwgbGVuIDwgc2l6ZW9mKGhhbmRsZSkpCisJCXJldHVybiAtRU5PREVWOworCWNvZGVjX25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqaGFuZGxlKTsKKwlpZiAoIWNvZGVjX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCXByX2luZm8oImxvb2tpbmcgZm9yIGNvZGVjOiAlc1xuIiwgY29kZWNfbm9kZS0+ZnVsbF9uYW1lKTsKKworCW11dGV4X2xvY2soJm9mX3NuZF9zb2NfbXV0ZXgpOworCW9mX3NvYyA9IG9mX3NuZF9zb2NfZ2V0X2RldmljZShjb2RlY19ub2RlKTsKKwlpZiAoIW9mX3NvYykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCW9mX3NvYy0+cGxhdGZvcm1fbm9kZSA9IG5vZGU7CisJb2Zfc29jLT5kYWlfbGluay5jcHVfZGFpID0gY3B1X2RhaTsKKwlvZl9zb2MtPmRldmljZS5wbGF0Zm9ybSA9IHBsYXRmb3JtOworCW9mX3NvYy0+bWFjaGluZS5uYW1lID0gb2Zfc29jLT5kYWlfbGluay5jcHVfZGFpLT5uYW1lOworCisJLyogTm93IHRyeSB0byByZWdpc3RlciB0aGUgU29DIGRldmljZSAqLworCW9mX3NuZF9zb2NfcmVnaXN0ZXJfZGV2aWNlKG9mX3NvYyk7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZvZl9zbmRfc29jX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9zbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IGFlYTI3ZTcuLjhiNzc2NmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtMTMsMyArMTMsMTEgQEAKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzWAogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTm9raWEgTjgxMC4KKworY29uZmlnIFNORF9PTUFQX1NPQ19PU0s1OTEyCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBvbWFwIG9zazU5MTIiCisJZGVwZW5kcyBvbiBTTkRfT01BUF9TT0MgJiYgTUFDSF9PTUFQX09TSworCXNlbGVjdCBTTkRfT01BUF9TT0NfTUNCU1AKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMworCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gb3NrNTkxMi4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL01ha2VmaWxlIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKaW5kZXggZDhkOGQ1OC4uZTA5ZDFmMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKQEAgLTcsNSArNyw3IEBACiAKICMgT01BUCBNYWNoaW5lIFN1cHBvcnQKIHNuZC1zb2MtbjgxMC1vYmpzIDo9IG44MTAubworc25kLXNvYy1vc2s1OTEyLW9ianMgOj0gb3NrNTkxMi5vCiAKIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0NfTjgxMCkgKz0gc25kLXNvYy1uODEwLm8KK29iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT1NLNTkxMikgKz0gc25kLXNvYy1vc2s1OTEyLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL244MTAuYyBiL3NvdW5kL3NvYy9vbWFwL244MTAuYwppbmRleCA4N2QwZWQwLi5mYWUzYWQzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9uODEwLmMKKysrIGIvc291bmQvc29jL29tYXAvbjgxMC5jCkBAIC0yNDcsOSArMjQ3LDkgQEAKIAlpbnQgaSwgZXJyOwogCiAJLyogTm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1PTk9fTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhQTENPTSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhQUkNPTSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJNT05PX0xPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSFBMQ09NIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkhQUkNPTSIpOwogCiAJLyogQWRkIE44MTAgc3BlY2lmaWMgY29udHJvbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhaWMzM19uODEwX2NvbnRyb2xzKTsgaSsrKSB7CkBAIC0yOTAsNiArMjkwLDcgQEAKIAogLyogQXVkaW8gcHJpdmF0ZSBkYXRhICovCiBzdGF0aWMgc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgbjgxMF9haWMzM19zZXR1cCA9IHsKKwkuaTJjX2J1cyA9IDIsCiAJLmkyY19hZGRyZXNzID0gMHgxOCwKIAkuZ3Bpb19mdW5jWzBdID0gQUlDM1hfR1BJTzFfRlVOQ19ESVNBQkxFRCwKIAkuZ3Bpb19mdW5jWzFdID0gQUlDM1hfR1BJTzJfRlVOQ19ESUdJVEFMX01JQ19JTlBVVCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuYwppbmRleCAzNTMxMGUxLi4wYTA2M2E5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5jCkBAIC01OSwxMiArNTksNyBAQAogICogU3RyZWFtIERNQSBwYXJhbWV0ZXJzLiBETUEgcmVxdWVzdCBsaW5lIGFuZCBwb3J0IGFkZHJlc3MgYXJlIHNldCBydW50aW1lCiAgKiBzaW5jZSB0aGV5IGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBPTUFQMSBhbmQgbGF0ZXIgT01BUHMKICAqLwotc3RhdGljIHN0cnVjdCBvbWFwX3BjbV9kbWFfZGF0YSBvbWFwX21jYnNwX2RhaV9kbWFfcGFyYW1zW05VTV9MSU5LU11bMl0gPSB7Ci17Ci0JeyAubmFtZQkJPSAiSTJTIFBDTSBTdGVyZW8gb3V0IiwgfSwKLQl7IC5uYW1lCQk9ICJJMlMgUENNIFN0ZXJlbyBpbiIsIH0sCi19LAotfTsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9wY21fZG1hX2RhdGEgb21hcF9tY2JzcF9kYWlfZG1hX3BhcmFtc1tOVU1fTElOS1NdWzJdOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTVYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKIHN0YXRpYyBjb25zdCBpbnQgb21hcDFfZG1hX3JlcXNbXVsyXSA9IHsKQEAgLTg0LDExICs3OSwyMiBAQAogc3RhdGljIGNvbnN0IGludCBvbWFwMV9kbWFfcmVxc1tdWzJdID0ge307CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBvbWFwMV9tY2JzcF9wb3J0W11bMl0gPSB7fTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MjApCi1zdGF0aWMgY29uc3QgaW50IG9tYXAyNDIwX2RtYV9yZXFzW11bMl0gPSB7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQorc3RhdGljIGNvbnN0IGludCBvbWFwMjR4eF9kbWFfcmVxc1tdWzJdID0gewogCXsgT01BUDI0WFhfRE1BX01DQlNQMV9UWCwgT01BUDI0WFhfRE1BX01DQlNQMV9SWCB9LAogCXsgT01BUDI0WFhfRE1BX01DQlNQMl9UWCwgT01BUDI0WFhfRE1BX01DQlNQMl9SWCB9LAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCisJeyBPTUFQMjRYWF9ETUFfTUNCU1AzX1RYLCBPTUFQMjRYWF9ETUFfTUNCU1AzX1JYIH0sCisJeyBPTUFQMjRYWF9ETUFfTUNCU1A0X1RYLCBPTUFQMjRYWF9ETUFfTUNCU1A0X1JYIH0sCisJeyBPTUFQMjRYWF9ETUFfTUNCU1A1X1RYLCBPTUFQMjRYWF9ETUFfTUNCU1A1X1JYIH0sCisjZW5kaWYKIH07CisjZWxzZQorc3RhdGljIGNvbnN0IGludCBvbWFwMjR4eF9kbWFfcmVxc1tdWzJdID0ge307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MjApCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBvbWFwMjQyMF9tY2JzcF9wb3J0W11bMl0gPSB7CiAJeyBPTUFQMjRYWF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RYUjEsCiAJICBPTUFQMjRYWF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUjEgfSwKQEAgLTk2LDEwICsxMDIsNDMgQEAKIAkgIE9NQVAyNFhYX01DQlNQMl9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFJSMSB9LAogfTsKICNlbHNlCi1zdGF0aWMgY29uc3QgaW50IG9tYXAyNDIwX2RtYV9yZXFzW11bMl0gPSB7fTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG9tYXAyNDIwX21jYnNwX3BvcnRbXVsyXSA9IHt9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgb21hcDI0MzBfbWNic3BfcG9ydFtdWzJdID0geworCXsgT01BUDI0WFhfTUNCU1AxX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQMjRYWF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDI0WFhfTUNCU1AyX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQMjRYWF9NQ0JTUDJfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDI0MzBfTUNCU1AzX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQMjQzMF9NQ0JTUDNfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDI0MzBfTUNCU1A0X0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQMjQzMF9NQ0JTUDRfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDI0MzBfTUNCU1A1X0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQMjQzMF9NQ0JTUDVfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBvbWFwMjQzMF9tY2JzcF9wb3J0W11bMl0gPSB7fTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG9tYXAzNHh4X21jYnNwX3BvcnRbXVsyXSA9IHsKKwl7IE9NQVAzNFhYX01DQlNQMV9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSLAorCSAgT01BUDM0WFhfTUNCU1AxX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIgfSwKKwl7IE9NQVAzNFhYX01DQlNQMl9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSLAorCSAgT01BUDM0WFhfTUNCU1AyX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIgfSwKKwl7IE9NQVAzNFhYX01DQlNQM19CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSLAorCSAgT01BUDM0WFhfTUNCU1AzX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIgfSwKKwl7IE9NQVAzNFhYX01DQlNQNF9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSLAorCSAgT01BUDM0WFhfTUNCU1A0X0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIgfSwKKwl7IE9NQVAzNFhYX01DQlNQNV9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSLAorCSAgT01BUDM0WFhfTUNCU1A1X0JBU0UgKyBPTUFQX01DQlNQX1JFR19EUlIgfSwKK307CisjZWxzZQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgb21hcDM0eHhfbWNic3BfcG9ydFtdWzJdID0ge307CisjZW5kaWYKKwogc3RhdGljIGludCBvbWFwX21jYnNwX2RhaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKQEAgLTE2NywxNCArMjA2LDE5IEBACiAJCWRtYSA9IG9tYXAxX2RtYV9yZXFzW2J1c19pZF1bc3Vic3RyZWFtLT5zdHJlYW1dOwogCQlwb3J0ID0gb21hcDFfbWNic3BfcG9ydFtidXNfaWRdW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjQyMCgpKSB7Ci0JCWRtYSA9IG9tYXAyNDIwX2RtYV9yZXFzW2J1c19pZF1bc3Vic3RyZWFtLT5zdHJlYW1dOworCQlkbWEgPSBvbWFwMjR4eF9kbWFfcmVxc1tidXNfaWRdW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAkJcG9ydCA9IG9tYXAyNDIwX21jYnNwX3BvcnRbYnVzX2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0MzAoKSkgeworCQlkbWEgPSBvbWFwMjR4eF9kbWFfcmVxc1tidXNfaWRdW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwkJcG9ydCA9IG9tYXAyNDMwX21jYnNwX3BvcnRbYnVzX2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0M3goKSkgeworCQlkbWEgPSBvbWFwMjR4eF9kbWFfcmVxc1tidXNfaWRdW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwkJcG9ydCA9IG9tYXAzNHh4X21jYnNwX3BvcnRbYnVzX2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CiAJfSBlbHNlIHsKLQkJLyoKLQkJICogVE9ETzogQWRkIHN1cHBvcnQgZm9yIDI0MzAgYW5kIDM0MzAKLQkJICovCiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlvbWFwX21jYnNwX2RhaV9kbWFfcGFyYW1zW2lkXVtzdWJzdHJlYW0tPnN0cmVhbV0ubmFtZSA9CisJCXN1YnN0cmVhbS0+c3RyZWFtID8gIkF1ZGlvIENhcHR1cmUiIDogIkF1ZGlvIFBsYXliYWNrIjsKIAlvbWFwX21jYnNwX2RhaV9kbWFfcGFyYW1zW2lkXVtzdWJzdHJlYW0tPnN0cmVhbV0uZG1hX3JlcSA9IGRtYTsKIAlvbWFwX21jYnNwX2RhaV9kbWFfcGFyYW1zW2lkXVtzdWJzdHJlYW0tPnN0cmVhbV0ucG9ydF9hZGRyID0gcG9ydDsKIAljcHVfZGFpLT5kbWFfZGF0YSA9ICZvbWFwX21jYnNwX2RhaV9kbWFfcGFyYW1zW2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CkBAIC0yNDUsNiArMjg5LDExIEBACiAJCXJlZ3MtPnJjcjIJfD0gUkRBVERMWSgxKTsKIAkJcmVncy0+eGNyMgl8PSBYREFURExZKDEpOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQkvKiAwLWJpdCBkYXRhIGRlbGF5ICovCisJCXJlZ3MtPnJjcjIgICAgICB8PSBSREFURExZKDApOworCQlyZWdzLT54Y3IyICAgICAgfD0gWERBVERMWSgwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogVW5zdXBwb3J0ZWQgZGF0YSBmb3JtYXQgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTAsNyArMzU5LDcgQEAKIAkJCQkgICAgICAgaW50IGNsa19pZCkKIHsKIAlpbnQgc2VsX2JpdDsKLQl1MTYgcmVnOworCXUxNiByZWcsIHJlZ19kZXZjb25mMSA9IE9NQVAyNDNYX0NPTlRST0xfREVWQ09ORjE7CiAKIAlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpIHsKIAkJLyogT01BUDEncyBjYW4gdXNlIG9ubHkgZXh0ZXJuYWwgc291cmNlIGNsb2NrICovCkBAIC0zMjAsNiArMzY5LDEyIEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoY3B1X2lzX29tYXAyNDIwKCkgJiYgbWNic3BfZGF0YS0+YnVzX2lkID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY3B1X2lzX29tYXAzNDN4KCkpCisJCXJlZ19kZXZjb25mMSA9IE9NQVAzNDNYX0NPTlRST0xfREVWQ09ORjE7CisKIAlzd2l0Y2ggKG1jYnNwX2RhdGEtPmJ1c19pZCkgewogCWNhc2UgMDoKIAkJcmVnID0gT01BUDJfQ09OVFJPTF9ERVZDT05GMDsKQEAgLTMyOSwyMCArMzg0LDI2IEBACiAJCXJlZyA9IE9NQVAyX0NPTlRST0xfREVWQ09ORjA7CiAJCXNlbF9iaXQgPSA2OwogCQlicmVhazsKLQkvKiBUT0RPOiBTdXBwb3J0IGZvciBwb3J0cyAzIC0gNSBpbiBPTUFQMjQzMCBhbmQgT01BUDM0eHggKi8KKwljYXNlIDI6CisJCXJlZyA9IHJlZ19kZXZjb25mMTsKKwkJc2VsX2JpdCA9IDA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcmVnID0gcmVnX2RldmNvbmYxOworCQlzZWxfYml0ID0gMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyZWcgPSByZWdfZGV2Y29uZjE7CisJCXNlbF9iaXQgPSA0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKLQkJaWYgKGNsa19pZCA9PSBPTUFQX01DQlNQX1NZU0NMS19DTEtTX0ZDTEspIHsKLQkJCW9tYXBfY3RybF93cml0ZWwob21hcF9jdHJsX3JlYWRsKHJlZykgJgotCQkJCQkgfigxIDw8IHNlbF9iaXQpLCByZWcpOwotCQl9IGVsc2UgewotCQkJb21hcF9jdHJsX3dyaXRlbChvbWFwX2N0cmxfcmVhZGwocmVnKSB8Ci0JCQkJCSAoMSA8PCBzZWxfYml0KSwgcmVnKTsKLQkJfQotCX0KKwlpZiAoY2xrX2lkID09IE9NQVBfTUNCU1BfU1lTQ0xLX0NMS1NfRkNMSykKKwkJb21hcF9jdHJsX3dyaXRlbChvbWFwX2N0cmxfcmVhZGwocmVnKSAmIH4oMSA8PCBzZWxfYml0KSwgcmVnKTsKKwllbHNlCisJCW9tYXBfY3RybF93cml0ZWwob21hcF9jdHJsX3JlYWRsKHJlZykgfCAoMSA8PCBzZWxfYml0KSwgcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzc2LDM3ICs0MzcsNDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdHJ1Y3Qgc25kX3NvY19kYWkgb21hcF9tY2JzcF9kYWlbTlVNX0xJTktTXSA9IHsKLXsKLQkubmFtZSA9ICJvbWFwLW1jYnNwLWRhaSIsCi0JLmlkID0gMCwKLQkudHlwZSA9IFNORF9TT0NfREFJX0kyUywKLQkucGxheWJhY2sgPSB7Ci0JCS5jaGFubmVsc19taW4gPSAyLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJLnJhdGVzID0gT01BUF9NQ0JTUF9SQVRFUywKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotCS5jYXB0dXJlID0gewotCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IE9NQVBfTUNCU1BfUkFURVMsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JfSwKLQkub3BzID0gewotCQkuc3RhcnR1cCA9IG9tYXBfbWNic3BfZGFpX3N0YXJ0dXAsCi0JCS5zaHV0ZG93biA9IG9tYXBfbWNic3BfZGFpX3NodXRkb3duLAotCQkudHJpZ2dlciA9IG9tYXBfbWNic3BfZGFpX3RyaWdnZXIsCi0JCS5od19wYXJhbXMgPSBvbWFwX21jYnNwX2RhaV9od19wYXJhbXMsCi0JfSwKLQkuZGFpX29wcyA9IHsKLQkJLnNldF9mbXQgPSBvbWFwX21jYnNwX2RhaV9zZXRfZGFpX2ZtdCwKLQkJLnNldF9jbGtkaXYgPSBvbWFwX21jYnNwX2RhaV9zZXRfY2xrZGl2LAotCQkuc2V0X3N5c2NsayA9IG9tYXBfbWNic3BfZGFpX3NldF9kYWlfc3lzY2xrLAotCX0sCi0JLnByaXZhdGVfZGF0YSA9ICZtY2JzcF9kYXRhWzBdLmJ1c19pZCwKLX0sCisjZGVmaW5lIE9NQVBfTUNCU1BfREFJX0JVSUxERVIobGlua19pZCkJCQkJXAorewkJCQkJCQkJXAorCS5uYW1lID0gIm9tYXAtbWNic3AtZGFpLShsaW5rX2lkKSIsCQkJXAorCS5pZCA9IChsaW5rX2lkKSwJCQkJCVwKKwkudHlwZSA9IFNORF9TT0NfREFJX0kyUywJCQkJXAorCS5wbGF5YmFjayA9IHsJCQkJCQlcCisJCS5jaGFubmVsc19taW4gPSAyLAkJCQlcCisJCS5jaGFubmVsc19tYXggPSAyLAkJCQlcCisJCS5yYXRlcyA9IE9NQVBfTUNCU1BfUkFURVMsCQkJXAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAkJXAorCX0sCQkJCQkJCVwKKwkuY2FwdHVyZSA9IHsJCQkJCQlcCisJCS5jaGFubmVsc19taW4gPSAyLAkJCQlcCisJCS5jaGFubmVsc19tYXggPSAyLAkJCQlcCisJCS5yYXRlcyA9IE9NQVBfTUNCU1BfUkFURVMsCQkJXAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAkJXAorCX0sCQkJCQkJCVwKKwkub3BzID0gewkJCQkJCVwKKwkJLnN0YXJ0dXAgPSBvbWFwX21jYnNwX2RhaV9zdGFydHVwLAkJXAorCQkuc2h1dGRvd24gPSBvbWFwX21jYnNwX2RhaV9zaHV0ZG93biwJCVwKKwkJLnRyaWdnZXIgPSBvbWFwX21jYnNwX2RhaV90cmlnZ2VyLAkJXAorCQkuaHdfcGFyYW1zID0gb21hcF9tY2JzcF9kYWlfaHdfcGFyYW1zLAkJXAorCX0sCQkJCQkJCVwKKwkuZGFpX29wcyA9IHsJCQkJCQlcCisJCS5zZXRfZm10ID0gb21hcF9tY2JzcF9kYWlfc2V0X2RhaV9mbXQsCQlcCisJCS5zZXRfY2xrZGl2ID0gb21hcF9tY2JzcF9kYWlfc2V0X2Nsa2RpdiwJXAorCQkuc2V0X3N5c2NsayA9IG9tYXBfbWNic3BfZGFpX3NldF9kYWlfc3lzY2xrLAlcCisJfSwJCQkJCQkJXAorCS5wcml2YXRlX2RhdGEgPSAmbWNic3BfZGF0YVsobGlua19pZCldLmJ1c19pZCwJCVwKK30KKworc3RydWN0IHNuZF9zb2NfZGFpIG9tYXBfbWNic3BfZGFpW10gPSB7CisJT01BUF9NQ0JTUF9EQUlfQlVJTERFUigwKSwKKwlPTUFQX01DQlNQX0RBSV9CVUlMREVSKDEpLAorI2lmIE5VTV9MSU5LUyA+PSAzCisJT01BUF9NQ0JTUF9EQUlfQlVJTERFUigyKSwKKyNlbmRpZgorI2lmIE5VTV9MSU5LUyA9PSA1CisJT01BUF9NQ0JTUF9EQUlfQlVJTERFUigzKSwKKwlPTUFQX01DQlNQX0RBSV9CVUlMREVSKDQpLAorI2VuZGlmCiB9OworCiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX21jYnNwX2RhaSk7CiAKIE1PRFVMRV9BVVRIT1IoIkphcmtrbyBOaWt1bGEgPGphcmtrby5uaWt1bGFAbm9raWEuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5oIGIvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5oCmluZGV4IGVkOGFmYjUuLmRmN2FkMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuaAorKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmgKQEAgLTM4LDExICszOCwxNyBAQAogCU9NQVBfTUNCU1BfQ0xLR0RWLAkJLyogU2FtcGxlIHJhdGUgZ2VuZXJhdG9yIGRpdmlkZXIgKi8KIH07CiAKLS8qCi0gKiBSRVZJU0lUOiBQcmVwYXJhdGlvbiBmb3IgdGhlIEFTb0MgdjIuIExldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBsaW5rcyB0bwotICogYmUgc2FtZSB0aGFuIG51bWJlciBvZiBNY0JTUCBwb3J0cyBmb3VuZCBpbiBPTUFQKHMpIHdlIGFyZSBjb21waWxpbmcgZm9yLgotICovCi0jZGVmaW5lIE5VTV9MSU5LUwkxCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKKyNkZWZpbmUgTlVNX0xJTktTCTIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisjdW5kZWYgIE5VTV9MSU5LUworI2RlZmluZSBOVU1fTElOS1MJMworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKKyN1bmRlZiAgTlVNX0xJTktTCisjZGVmaW5lIE5VTV9MSU5LUwk1CisjZW5kaWYKIAogZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2RhaSBvbWFwX21jYnNwX2RhaVtOVU1fTElOS1NdOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwppbmRleCA2OTBiZmVhLi5lOTA4NGZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAlwcnRkLT5kbWFfZGF0YSA9IGRtYV9kYXRhOwogCWVyciA9IG9tYXBfcmVxdWVzdF9kbWEoZG1hX2RhdGEtPmRtYV9yZXEsIGRtYV9kYXRhLT5uYW1lLAogCQkJICAgICAgIG9tYXBfcGNtX2RtYV9pcnEsIHN1YnN0cmVhbSwgJnBydGQtPmRtYV9jaCk7Ci0JaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCWlmICghZXJyICYgIWNwdV9pc19vbWFwMTUxMCgpKSB7CiAJCS8qCiAJCSAqIExpbmsgY2hhbm5lbCB3aXRoIGl0c2VsZiBzbyBETUEgZG9lc24ndCBuZWVkIGFueQogCQkgKiByZXByb2dyYW1taW5nIHdoaWxlIGxvb3BpbmcgdGhlIGJ1ZmZlcgpAQCAtMTQ3LDEyICsxNDcsMTQgQEAKIAkJZG1hX3BhcmFtcy5zcmNfb3JfZHN0X3N5bmNoCT0gT01BUF9ETUFfRFNUX1NZTkM7CiAJCWRtYV9wYXJhbXMuc3JjX3N0YXJ0CQk9IHJ1bnRpbWUtPmRtYV9hZGRyOwogCQlkbWFfcGFyYW1zLmRzdF9zdGFydAkJPSBkbWFfZGF0YS0+cG9ydF9hZGRyOworCQlkbWFfcGFyYW1zLmRzdF9wb3J0CQk9IE9NQVBfRE1BX1BPUlRfTVBVSTsKIAl9IGVsc2UgewogCQlkbWFfcGFyYW1zLnNyY19hbW9kZQkJPSBPTUFQX0RNQV9BTU9ERV9DT05TVEFOVDsKIAkJZG1hX3BhcmFtcy5kc3RfYW1vZGUJCT0gT01BUF9ETUFfQU1PREVfUE9TVF9JTkM7CiAJCWRtYV9wYXJhbXMuc3JjX29yX2RzdF9zeW5jaAk9IE9NQVBfRE1BX1NSQ19TWU5DOwogCQlkbWFfcGFyYW1zLnNyY19zdGFydAkJPSBkbWFfZGF0YS0+cG9ydF9hZGRyOwogCQlkbWFfcGFyYW1zLmRzdF9zdGFydAkJPSBydW50aW1lLT5kbWFfYWRkcjsKKwkJZG1hX3BhcmFtcy5zcmNfcG9ydAkJPSBPTUFQX0RNQV9QT1JUX01QVUk7CiAJfQogCS8qCiAJICogU2V0IERNQSB0cmFuc2ZlciBmcmFtZSBzaXplIGVxdWFsIHRvIEFMU0EgcGVyaW9kIHNpemUgYW5kIGZyYW1lCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vc2s1OTEyLmMgYi9zb3VuZC9zb2Mvb21hcC9vc2s1OTEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlNzMzNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9vbWFwL29zazU5MTIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIG9zazU5MTIuYyAgLS0gIFNvQyBhdWRpbyBmb3IgT1NLIDU5MTIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWlzdHJhbCBTb2x1dGlvbnMKKyAqCisgKiBDb250YWN0OiBBcnVuIEtTICA8YXJ1bmtzQG1pc3RyYWxzb2x1dGlvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvbWNic3AuaD4KKworI2luY2x1ZGUgIm9tYXAtbWNic3AuaCIKKyNpbmNsdWRlICJvbWFwLXBjbS5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy90bHYzMjBhaWMyMy5oIgorCisjZGVmaW5lIENPREVDX0NMT0NLIAkxMjAwMDAwMAorCitzdGF0aWMgc3RydWN0IGNsayAqdGx2MzIwYWljMjNfbWNsazsKKworc3RhdGljIGludCBvc2tfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gY2xrX2VuYWJsZSh0bHYzMjBhaWMyM19tY2xrKTsKK30KKworc3RhdGljIHZvaWQgb3NrX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWNsa19kaXNhYmxlKHRsdjMyMGFpYzIzX21jbGspOworfQorCitzdGF0aWMgaW50IG9za19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5kYWktPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKwlpbnQgZXJyOworCisJLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJZXJyID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCisJCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQSB8CisJCQkJICBTTkRfU09DX0RBSUZNVF9OQl9JRiB8CisJCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCWVyciA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwKKwkJCQkgIFNORF9TT0NfREFJRk1UX0RTUF9BIHwKKwkJCQkgIFNORF9TT0NfREFJRk1UX05CX0lGIHwKKwkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCisJZXJyID0KKwkgICAgc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIENPREVDX0NMT0NLLCBTTkRfU09DX0NMT0NLX0lOKTsKKworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIHN5c3RlbSBjbG9ja1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBvc2tfb3BzID0geworCS5zdGFydHVwID0gb3NrX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IG9za19od19wYXJhbXMsCisJLnNodXRkb3duID0gb3NrX3NodXRkb3duLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIEphY2siLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiTGluZSBJbiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkxIUE9VVCJ9LAorCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiUkhQT1VUIn0sCisKKwl7IkxMSU5FSU4iLCBOVUxMLCAiTGluZSBJbiJ9LAorCXsiUkxJTkVJTiIsIE5VTEwsICJMaW5lIEluIn0sCisKKwl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBKYWNrIn0sCit9OworCitzdGF0aWMgaW50IG9za190bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKworCS8qIEFkZCBvc2s1OTEyIHNwZWNpZmljIHdpZGdldHMgKi8KKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cykpOworCisJLyogU2V0IHVwIG9zazU5MTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKKworCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCisvKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBvc2tfZGFpID0geworCS5uYW1lID0gIlRMVjMyMEFJQzIzIiwKKwkuc3RyZWFtX25hbWUgPSAiQUlDMjMiLAorCS5jcHVfZGFpID0gJm9tYXBfbWNic3BfZGFpWzBdLAorCS5jb2RlY19kYWkgPSAmdGx2MzIwYWljMjNfZGFpLAorCS5pbml0ID0gb3NrX3RsdjMyMGFpYzIzX2luaXQsCisJLm9wcyA9ICZvc2tfb3BzLAorfTsKKworLyogQXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9vc2sgPSB7CisJLm5hbWUgPSAiT1NLNTkxMiIsCisJLmRhaV9saW5rID0gJm9za19kYWksCisJLm51bV9saW5rcyA9IDEsCit9OworCisvKiBBdWRpbyBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2Ugb3NrX3NuZF9kZXZkYXRhID0geworCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9vc2ssCisJLnBsYXRmb3JtID0gJm9tYXBfc29jX3BsYXRmb3JtLAorCS5jb2RlY19kZXYgPSAmc29jX2NvZGVjX2Rldl90bHYzMjBhaWMyMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvc2tfc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgb3NrX3NvY19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwl1MzIgY3VyUmF0ZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAoIShtYWNoaW5lX2lzX29tYXBfb3NrKCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9za19zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFvc2tfc25kX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShvc2tfc25kX2RldmljZSwgJm9za19zbmRfZGV2ZGF0YSk7CisJb3NrX3NuZF9kZXZkYXRhLmRldiA9ICZvc2tfc25kX2RldmljZS0+ZGV2OworCSoodW5zaWduZWQgaW50ICopb3NrX2RhaS5jcHVfZGFpLT5wcml2YXRlX2RhdGEgPSAwOwkvKiBNY0JTUDEgKi8KKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG9za19zbmRfZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwlkZXYgPSAmb3NrX3NuZF9kZXZpY2UtPmRldjsKKworCXRsdjMyMGFpYzIzX21jbGsgPSBjbGtfZ2V0KGRldiwgIm1jbGsiKTsKKwlpZiAoSVNfRVJSKHRsdjMyMGFpYzIzX21jbGspKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGdldCBtY2xrIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNsa19nZXRfdXNlY291bnQodGx2MzIwYWljMjNfbWNsaykgPiAwKSB7CisJCS8qIE1DTEsgaXMgYWxyZWFkeSBpbiB1c2UgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIk1DTEsgaW4gdXNlIGF0ICVkIEh6LiBXZSBjaGFuZ2UgaXQgdG8gJWQgSHpcbiIsCisJCSAgICAgICAodWludCkgY2xrX2dldF9yYXRlKHRsdjMyMGFpYzIzX21jbGspLCBDT0RFQ19DTE9DSyk7CisJfQorCisJLyoKKwkgKiBDb25maWd1cmUgMTIgTUh6IG91dHB1dCBvbiBNQ0xLLgorCSAqLworCWN1clJhdGUgPSAodWludCkgY2xrX2dldF9yYXRlKHRsdjMyMGFpYzIzX21jbGspOworCWlmIChjdXJSYXRlICE9IENPREVDX0NMT0NLKSB7CisJCWlmIChjbGtfc2V0X3JhdGUodGx2MzIwYWljMjNfbWNsaywgQ09ERUNfQ0xPQ0spKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBzZXQgTUNMSyBmb3IgQUlDMjMgQ09ERUNcbiIpOworCQkJZXJyID0gLUVDQU5DRUxFRDsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gIk1DTEsgPSAlZCBbJWRdLCB1c2Vjb3VudCA9ICVkXG4iLAorCSAgICAgICAodWludCkgY2xrX2dldF9yYXRlKHRsdjMyMGFpYzIzX21jbGspLCBDT0RFQ19DTE9DSywKKwkgICAgICAgY2xrX2dldF91c2Vjb3VudCh0bHYzMjBhaWMyM19tY2xrKSk7CisKKwlyZXR1cm4gMDsKK2VycjE6CisJY2xrX3B1dCh0bHYzMjBhaWMyM19tY2xrKTsKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKG9za19zbmRfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KG9za19zbmRfZGV2aWNlKTsKKworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9za19zb2NfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG9za19zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQob3NrX3NvY19pbml0KTsKK21vZHVsZV9leGl0KG9za19zb2NfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFydW4gS1MgPGFydW5rc0BtaXN0cmFsc29sdXRpb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgT1NLIDU5MTIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZyBiL3NvdW5kL3NvYy9weGEvS2NvbmZpZwppbmRleCA5MjEyYzM3Li5mOGMxY2RkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL0tjb25maWcKKysrIGIvc291bmQvc29jL3B4YS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFNORF9QWEEyWFhfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIEludGVsIFBYQTJ4eCBjaGlwIgogCWRlcGVuZHMgb24gQVJDSF9QWEEKKwlzZWxlY3QgU05EX1BYQTJYWF9MSUIKIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KIAkgIHRoZSBQWEEyeHggQUM5NywgSTJTIG9yIFNTUCBpbnRlcmZhY2UuIFlvdSB3aWxsIGFsc28gbmVlZApAQCAtMTMsNiArMTQsOCBAQAogY29uZmlnIFNORF9QWEEyWFhfU09DX0FDOTcKIAl0cmlzdGF0ZQogCXNlbGVjdCBBQzk3X0JVUworCXNlbGVjdCBTTkRfQVJNCisJc2VsZWN0IFNORF9QWEEyWFhfTElCX0FDOTcKIAlzZWxlY3QgU05EX1NPQ19BQzk3X0JVUwogCiBjb25maWcgU05EX1BYQTJYWF9TT0NfSTJTCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2NvcmdpLmMgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKaW5kZXggMGE1M2Y3Mi4uMjcxOGVhZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9jb3JnaS5jCisrKyBiL3NvdW5kL3NvYy9weGEvY29yZ2kuYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KICAqCi0gKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogICAgICAgICAgUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTgsMTMgKzE4LDEzIEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9jb3JnaS5oPgpAQCAtNTQsOCArNTQsOCBAQAogCXN3aXRjaCAoY29yZ2lfamFja19mdW5jKSB7CiAJY2FzZSBDT1JHSV9IUDoKIAkJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLwotCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9MKTsKLQkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDEpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwpAQCAtNjMsMjQgKzYzLDI0IEBACiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfTUlDOgogCQkvKiByZXNldCA9IG11dGUgaGVhZHBob25lICovCi0JCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfTCk7Ci0JCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDApOwogCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBDT1JHSV9MSU5FOgotCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOwotCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX1IpOworCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfTCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9SLCAwKTsKIAkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgQ09SR0lfSEVBRFNFVDoKLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9MKTsKLQkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDEpOwogCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwpAQCAtMTE0LDggKzExNCw4IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOwogCiAJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLwotCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOwotCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX1IpOworCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAxKTsKKwlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOCwyMiArMjE4LDE0IEBACiBzdGF0aWMgaW50IGNvcmdpX2FtcF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCiB7Ci0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCi0JCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9BUE1fT04pOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfQVBNX09OKTsKLQorCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fQVBNX09OLCBTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjb3JnaV9taWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCiAJc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50IGV2ZW50KQogewotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQotCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTUlDX0JJQVMpOwotCWVsc2UKLQkJcmVzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTUlDX0JJQVMpOwotCisJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NSUNfQklBUywgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4OSw4ICsyODEsOCBAQAogewogCWludCBpLCBlcnI7CiAKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMTElORUlOIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJMSU5FSU4iKTsKIAogCS8qIEFkZCBjb3JnaSBzcGVjaWZpYyBjb250cm9scyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9jb3JnaV9jb250cm9scyk7IGkrKykgewpAQCAtMzMwLDYgKzMyMiw3IEBACiAKIC8qIGNvcmdpIGF1ZGlvIHByaXZhdGUgZGF0YSAqLwogc3RhdGljIHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSBjb3JnaV93bTg3MzFfc2V0dXAgPSB7CisJLmkyY19idXMgPSAwLAogCS5pMmNfYWRkcmVzcyA9IDB4MWIsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2VtLXgyNzAuYyBiL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCmluZGV4IGQ5YzNmN2IuLmU2ZmY2OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCisrKyBiL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCkBAIC05LDcgKzksNyBAQAogICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgogICoKLSAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiAgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jIGIvc291bmQvc29jL3B4YS9wb29kbGUuYwppbmRleCBhNDY5N2Y3Li40ZDk5MzBjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCisrKyBiL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgMjAwNSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgogICogQ29weXJpZ2h0IDIwMDUgT3BlbmVkaGFuZCBMdGQuCiAgKgotICogQXV0aG9yczogTGlhbSBHaXJkd29vZCA8bGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tPgorICogQXV0aG9yczogTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KICAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI0Miw4ICsyNDIsOCBAQAogewogCWludCBpLCBlcnI7CiAKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMTElORUlOIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJMSU5FSU4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1JQ0lOIik7CiAKIAkvKiBBZGQgcG9vZGxlIHNwZWNpZmljIGNvbnRyb2xzICovCkBAIC0yODQsNiArMjg0LDcgQEAKIAogLyogcG9vZGxlIGF1ZGlvIHByaXZhdGUgZGF0YSAqLwogc3RhdGljIHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSBwb29kbGVfd204NzMxX3NldHVwID0geworCS5pMmNfYnVzID0gMCwKIAkuaTJjX2FkZHJlc3MgPSAweDFiLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jCmluZGV4IGQ5NGE0OTUuLmE3YTNhOWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmMKQEAgLTEzLDIyNSArMTMsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9weGEyeHgtbGliLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgotI2luY2x1ZGUgPG1hY2gvcHhhMnh4LWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJweGEyeHgtcGNtLmgiCiAjaW5jbHVkZSAicHhhMnh4LWFjOTcuaCIKIAotc3RhdGljIERFRklORV9NVVRFWChjYXJfbXV0ZXgpOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGdzcl93cSk7Ci1zdGF0aWMgdm9sYXRpbGUgbG9uZyBnc3JfYml0czsKLXN0YXRpYyBzdHJ1Y3QgY2xrICphYzk3X2NsazsKLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci1zdGF0aWMgc3RydWN0IGNsayAqYWM5N2NvbmZfY2xrOwotI2VuZGlmCi0KLS8qCi0gKiBCZXdhcmUgUFhBMjd4IGJ1Z3M6Ci0gKgotICogICBvIFNsb3QgMTIgcmVhZCBmcm9tIG1vZGVtIHNwYWNlIHdpbGwgaGFuZyBjb250cm9sbGVyLgotICogICBvIENET05FLCBTRE9ORSBpbnRlcnJ1cHQgZmFpbHMgYWZ0ZXIgYW55IHNsb3QgMTIgSU8uCi0gKgotICogV2UgdGhlcmVmb3JlIGhhdmUgYW4gaHlicmlkIGFwcHJvYWNoIGZvciB3YWl0aW5nIG9uIFNET05FIChpbnRlcnJ1cHQgb3IKLSAqIDEgamlmZnkgdGltZW91dCBpZiBpbnRlcnJ1cHQgbmV2ZXIgY29tZXMpLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBweGEyeHhfYWM5N19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywKLQl1bnNpZ25lZCBzaG9ydCByZWcpCi17Ci0JdW5zaWduZWQgc2hvcnQgdmFsID0gLTE7Ci0Jdm9sYXRpbGUgdTMyICpyZWdfYWRkcjsKLQotCW11dGV4X2xvY2soJmNhcl9tdXRleCk7Ci0KLQkvKiBzZXQgdXAgcHJpbWFyeSBvciBzZWNvbmRhcnkgY29kZWMvbW9kZW0gc3BhY2UgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QWEEyN3gpIHx8IGRlZmluZWQoQ09ORklHX1BYQTN4eCkKLQlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOwotI2Vsc2UKLQlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpCi0JCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNNQ19SRUdfQkFTRSA6ICZQTUNfUkVHX0JBU0U7Ci0JZWxzZQotCQlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOwotI2VuZGlmCi0JcmVnX2FkZHIgKz0gKHJlZyA+PiAxKTsKLQotI2lmbmRlZiBDT05GSUdfUFhBMjd4Ci0JaWYgKHJlZyA9PSBBQzk3X0dQSU9fU1RBVFVTKSB7Ci0JCS8qIHJlYWQgZnJvbSBjb250cm9sbGVyIGNhY2hlICovCi0JCXZhbCA9ICpyZWdfYWRkcjsKLQkJZ290byBvdXQ7Ci0JfQotI2VuZGlmCi0KLQkvKiBzdGFydCByZWFkIGFjY2VzcyBhY3Jvc3MgdGhlIGFjOTcgbGluayAqLwotCUdTUiA9IEdTUl9DRE9ORSB8IEdTUl9TRE9ORTsKLQlnc3JfYml0cyA9IDA7Ci0JdmFsID0gKnJlZ19hZGRyOwotCi0Jd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSwgMSk7Ci0JaWYgKCEoKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVhZCBlcnJvciAoYWM5N19yZWc9JXggR1NSPSUjbHgpXG4iLAotCQkJCV9fZnVuY19fLCByZWcsIEdTUiB8IGdzcl9iaXRzKTsKLQkJdmFsID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIHZhbGlkIGRhdGEgbm93ICovCi0JR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOwotCWdzcl9iaXRzID0gMDsKLQl2YWwgPSAqcmVnX2FkZHI7Ci0JLyogYnV0IHdlJ3ZlIGp1c3Qgc3RhcnRlZCBhbm90aGVyIGN5Y2xlLi4uICovCi0Jd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSwgMSk7Ci0KLW91dDoJbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAotCXVuc2lnbmVkIHNob3J0IHZhbCkKLXsKLQl2b2xhdGlsZSB1MzIgKnJlZ19hZGRyOwotCi0JbXV0ZXhfbG9jaygmY2FyX211dGV4KTsKLQotCS8qIHNldCB1cCBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2RlYy9tb2RlbSBzcGFjZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3eCkgfHwgZGVmaW5lZChDT05GSUdfUFhBM3h4KQotCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7Ci0jZWxzZQotCWlmIChyZWcgPT0gQUM5N19HUElPX1NUQVRVUykKLQkJcmVnX2FkZHIgPSBhYzk3LT5udW0gPyAmU01DX1JFR19CQVNFIDogJlBNQ19SRUdfQkFTRTsKLQllbHNlCi0JCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7Ci0jZW5kaWYKLQlyZWdfYWRkciArPSAocmVnID4+IDEpOwotCi0JR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOwotCWdzcl9iaXRzID0gMDsKLQkqcmVnX2FkZHIgPSB2YWw7Ci0Jd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9DRE9ORSwgMSk7Ci0JaWYgKCEoKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9DRE9ORSkpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHdyaXRlIGVycm9yIChhYzk3X3JlZz0leCBHU1I9JSNseClcbiIsCi0JCQkJX19mdW5jX18sIHJlZywgR1NSIHwgZ3NyX2JpdHMpOwotCi0JbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOwotfQotCiBzdGF0aWMgdm9pZCBweGEyeHhfYWM5N193YXJtX3Jlc2V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLSNpZmRlZiBDT05GSUdfUFhBM3h4Ci0JaW50IHRpbWVvdXQgPSAxMDA7Ci0jZW5kaWYKLQlnc3JfYml0cyA9IDA7CisJcHhhMnh4X2FjOTdfdHJ5X3dhcm1fcmVzZXQoYWM5Nyk7CiAKLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JLyogd2FybSByZXNldCBicm9rZW4gb24gQnVsdmVyZGUsCi0JICAgc28gbWFudWFsbHkga2VlcCBBQzk3IHJlc2V0IGhpZ2ggKi8KLQlweGFfZ3Bpb19tb2RlKDExMyB8IEdQSU9fT1VUIHwgR1BJT19ERkxUX0hJR0gpOwotCXVkZWxheSgxMCk7Ci0JR0NSIHw9IEdDUl9XQVJNX1JTVDsKLQlweGFfZ3Bpb19tb2RlKDExMyB8IEdQSU9fQUxUX0ZOXzJfT1VUKTsKLQl1ZGVsYXkoNTAwKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BYQTN4eCkKLQkvKiBDYW4ndCB1c2UgaW50ZXJydXB0cyAqLwotCUdDUiB8PSBHQ1JfV0FSTV9SU1Q7Ci0Jd2hpbGUgKCEoKEdTUiB8IGdzcl9iaXRzKSAmIChHU1JfUENSIHwgR1NSX1NDUikpICYmIHRpbWVvdXQtLSkKLQkJbWRlbGF5KDEpOwotI2Vsc2UKLQlHQ1IgfD0gR0NSX1dBUk1fUlNUIHwgR0NSX1BSSVJEWV9JRU4gfCBHQ1JfU0VDUkRZX0lFTjsKLQl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOwotI2VuZGlmCi0KLQlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YXJtIHJlc2V0IHRpbWVvdXQgKEdTUj0lI2x4KVxuIiwKLQkJCQkgX19mdW5jX18sIGdzcl9iaXRzKTsKLQotCUdDUiAmPSB+KEdDUl9QUklSRFlfSUVOfEdDUl9TRUNSRFlfSUVOKTsKLQlHQ1IgfD0gR0NSX1NET05FX0lFfEdDUl9DRE9ORV9JRTsKKwlweGEyeHhfYWM5N19maW5pc2hfcmVzZXQoYWM5Nyk7CiB9CiAKIHN0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X2NvbGRfcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewotI2lmZGVmIENPTkZJR19QWEEzeHgKLQlpbnQgdGltZW91dCA9IDEwMDA7CisJcHhhMnh4X2FjOTdfdHJ5X2NvbGRfcmVzZXQoYWM5Nyk7CiAKLQkvKiBIb2xkIENMS0JQQiBmb3IgMTAwdXMgKi8KLQlHQ1IgPSAwOwotCUdDUiA9IEdDUl9DTEtCUEI7Ci0JdWRlbGF5KDEwMCk7Ci0JR0NSID0gMDsKLSNlbmRpZgotCi0JR0NSICY9ICBHQ1JfQ09MRF9SU1Q7ICAvKiBjbGVhciBldmVyeXRoaW5nIGJ1dCBuQ1JTVCAqLwotCUdDUiAmPSB+R0NSX0NPTERfUlNUOyAgLyogdGhlbiBhc3NlcnQgbkNSU1QgKi8KLQotCWdzcl9iaXRzID0gMDsKLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JLyogUFhBMjd4IERldmVsb3BlcnMgTWFudWFsIHNlY3Rpb24gMTMuNS4yLjIuMSAqLwotCWNsa19lbmFibGUoYWM5N2NvbmZfY2xrKTsKLQl1ZGVsYXkoNSk7Ci0JY2xrX2Rpc2FibGUoYWM5N2NvbmZfY2xrKTsKLQlHQ1IgPSBHQ1JfQ09MRF9SU1Q7Ci0JdWRlbGF5KDUwKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BYQTN4eCkKLQkvKiBDYW4ndCB1c2UgaW50ZXJydXB0cyBvbiBQWEEzeHggKi8KLQlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7Ci0KLQlHQ1IgPSBHQ1JfV0FSTV9SU1QgfCBHQ1JfQ09MRF9SU1Q7Ci0Jd2hpbGUgKCEoR1NSICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkgJiYgdGltZW91dC0tKQotCQltZGVsYXkoMTApOwotI2Vsc2UKLQlHQ1IgPSBHQ1JfQ09MRF9SU1Q7Ci0JR0NSIHw9IEdDUl9DRE9ORV9JRXxHQ1JfU0RPTkVfSUU7Ci0Jd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgZ3NyX2JpdHMgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpLCAxKTsKLSNlbmRpZgotCi0JaWYgKCEoKEdTUiB8IGdzcl9iaXRzKSAmIChHU1JfUENSIHwgR1NSX1NDUikpKQotCQlwcmludGsoS0VSTl9JTkZPICIlczogY29sZCByZXNldCB0aW1lb3V0IChHU1I9JSNseClcbiIsCi0JCQkJIF9fZnVuY19fLCBnc3JfYml0cyk7Ci0KLQlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7Ci0JR0NSIHw9IEdDUl9TRE9ORV9JRXxHQ1JfQ0RPTkVfSUU7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBweGEyeHhfYWM5N19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWxvbmcgc3RhdHVzOwotCi0Jc3RhdHVzID0gR1NSOwotCWlmIChzdGF0dXMpIHsKLQkJR1NSID0gc3RhdHVzOwotCQlnc3JfYml0cyB8PSBzdGF0dXM7Ci0JCXdha2VfdXAoJmdzcl93cSk7Ci0KLSNpZmRlZiBDT05GSUdfUFhBMjd4Ci0JCS8qIEFsdGhvdWdoIHdlIGRvbid0IHVzZSB0aG9zZSB3ZSBzdGlsbCBuZWVkIHRvIGNsZWFyIHRoZW0KLQkJICAgc2luY2UgdGhleSB0ZW5kIHRvIHNwdXJpb3VzbHkgdHJpZ2dlciB3aGVuIE1NQyBpcyB1c2VkCi0JCSAgIChoYXJkd2FyZSBidWc/IGdvIGZpZ3VyZSkuLi4gKi8KLQkJTUlTUiA9IE1JU1JfRU9DOwotCQlQSVNSID0gUElTUl9FT0M7Ci0JCU1DU1IgPSBNQ1NSX0VPQzsKLSNlbmRpZgotCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlyZXR1cm4gSVJRX05PTkU7CisJcHhhMnh4X2FjOTdfZmluaXNoX3Jlc2V0KGFjOTcpOwogfQogCiBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBzb2NfYWM5N19vcHMgPSB7CkBAIC0yNDQsNyArNDksNyBAQAogc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX3N0ZXJlb19vdXQgPSB7CiAJLm5hbWUJCQk9ICJBQzk3IFBDTSBTdGVyZW8gb3V0IiwKIAkuZGV2X2FkZHIJCT0gX19QUkVHKFBDRFIpLAotCS5kcmNtcgkJCT0gJkRSQ01SVFhQQ0RSLAorCS5kcmNtcgkJCT0gJkRSQ01SKDEyKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKIAkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAogfTsKQEAgLTI1Miw3ICs1Nyw3IEBACiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyBweGEyeHhfYWM5N19wY21fc3RlcmVvX2luID0gewogCS5uYW1lCQkJPSAiQUM5NyBQQ00gU3RlcmVvIGluIiwKIAkuZGV2X2FkZHIJCT0gX19QUkVHKFBDRFIpLAotCS5kcmNtcgkJCT0gJkRSQ01SUlhQQ0RSLAorCS5kcmNtcgkJCT0gJkRSQ01SKDExKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKIAkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAogfTsKQEAgLTI2MCw3ICs2NSw3IEBACiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyBweGEyeHhfYWM5N19wY21fYXV4X21vbm9fb3V0ID0gewogCS5uYW1lCQkJPSAiQUM5NyBBdXggUENNIChTbG90IDUpIE1vbm8gb3V0IiwKIAkuZGV2X2FkZHIJCT0gX19QUkVHKE1PRFIpLAotCS5kcmNtcgkJCT0gJkRSQ01SVFhNT0RSLAorCS5kcmNtcgkJCT0gJkRSQ01SKDEwKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKIAkJCQkgIERDTURfQlVSU1QxNiB8IERDTURfV0lEVEgyLAogfTsKQEAgLTI2OCw3ICs3Myw3IEBACiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyBweGEyeHhfYWM5N19wY21fYXV4X21vbm9faW4gPSB7CiAJLm5hbWUJCQk9ICJBQzk3IEF1eCBQQ00gKFNsb3QgNSkgTW9ubyBpbiIsCiAJLmRldl9hZGRyCQk9IF9fUFJFRyhNT0RSKSwKLQkuZHJjbXIJCQk9ICZEUkNNUlJYTU9EUiwKKwkuZHJjbXIJCQk9ICZEUkNNUig5KSwKIAkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKIAkJCQkgIERDTURfQlVSU1QxNiB8IERDTURfV0lEVEgyLAogfTsKQEAgLTI3Niw3ICs4MSw3IEBACiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyBweGEyeHhfYWM5N19wY21fbWljX21vbm9faW4gPSB7CiAJLm5hbWUJCQk9ICJBQzk3IE1pYyBQQ00gKFNsb3QgNikgTW9ubyBpbiIsCiAJLmRldl9hZGRyCQk9IF9fUFJFRyhNQ0RSKSwKLQkuZHJjbXIJCQk9ICZEUkNNUlJYTUNEUiwKKwkuZHJjbXIJCQk9ICZEUkNNUig4KSwKIAkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKIAkJCQkgIERDTURfQlVSU1QxNiB8IERDTURfV0lEVEgyLAogfTsKQEAgLTI4NSwyNCArOTAsMTMgQEAKIHN0YXRpYyBpbnQgcHhhMnh4X2FjOTdfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCUdDUiB8PSBHQ1JfQUNMSU5LX09GRjsKLQljbGtfZGlzYWJsZShhYzk3X2Nsayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHB4YTJ4eF9hYzk3X2h3X3N1c3BlbmQoKTsKIH0KIAogc3RhdGljIGludCBweGEyeHhfYWM5N19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlweGFfZ3Bpb19tb2RlKEdQSU8zMV9TWU5DX0FDOTdfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzMwX1NEQVRBX09VVF9BQzk3X01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8yOF9CSVRDTEtfQUM5N19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMjlfU0RBVEFfSU5fQUM5N19NRCk7Ci0jaWZkZWYgQ09ORklHX1BYQTI3eAotCS8qIFVzZSBHUElPIDExMyBhcyBBQzk3IFJlc2V0IG9uIEJ1bHZlcmRlICovCi0JcHhhX2dwaW9fbW9kZSgxMTMgfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0jZW5kaWYKLQljbGtfZW5hYmxlKGFjOTdfY2xrKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcHhhMnh4X2FjOTdfaHdfcmVzdW1lKCk7CiB9CiAKICNlbHNlCkBAIC0zMTMsNjEgKzEwNywxMyBAQAogc3RhdGljIGludCBweGEyeHhfYWM5N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVxdWVzdF9pcnEoSVJRX0FDOTcsIHB4YTJ4eF9hYzk3X2lycSwgSVJRRl9ESVNBQkxFRCwgIkFDOTciLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7Ci0KLQlweGFfZ3Bpb19tb2RlKEdQSU8zMV9TWU5DX0FDOTdfTUQpOwotCXB4YV9ncGlvX21vZGUoR1BJTzMwX1NEQVRBX09VVF9BQzk3X01EKTsKLQlweGFfZ3Bpb19tb2RlKEdQSU8yOF9CSVRDTEtfQUM5N19NRCk7Ci0JcHhhX2dwaW9fbW9kZShHUElPMjlfU0RBVEFfSU5fQUM5N19NRCk7Ci0jaWZkZWYgQ09ORklHX1BYQTI3eAotCS8qIFVzZSBHUElPIDExMyBhcyBBQzk3IFJlc2V0IG9uIEJ1bHZlcmRlICovCi0JcHhhX2dwaW9fbW9kZSgxMTMgfCBHUElPX0FMVF9GTl8yX09VVCk7Ci0KLQlhYzk3Y29uZl9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJBQzk3Q09ORkNMSyIpOwotCWlmIChJU19FUlIoYWM5N2NvbmZfY2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGFjOTdjb25mX2Nsayk7Ci0JCWFjOTdjb25mX2NsayA9IE5VTEw7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0jZW5kaWYKLQlhYzk3X2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIkFDOTdDTEsiKTsKLQlpZiAoSVNfRVJSKGFjOTdfY2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGFjOTdfY2xrKTsKLQkJYWM5N19jbGsgPSBOVUxMOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCWNsa19lbmFibGUoYWM5N19jbGspOwotCXJldHVybiAwOwotCi0gZXJyX2lycToKLQlHQ1IgfD0gR0NSX0FDTElOS19PRkY7Ci0jaWZkZWYgQ09ORklHX1BYQTI3eAotCWlmIChhYzk3Y29uZl9jbGspIHsKLQkJY2xrX3B1dChhYzk3Y29uZl9jbGspOwotCQlhYzk3Y29uZl9jbGsgPSBOVUxMOwotCX0KLSNlbmRpZgotCWZyZWVfaXJxKElSUV9BQzk3LCBOVUxMKTsKLSBlcnI6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcHhhMnh4X2FjOTdfaHdfcHJvYmUocGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCUdDUiB8PSBHQ1JfQUNMSU5LX09GRjsKLQlmcmVlX2lycShJUlFfQUM5NywgTlVMTCk7Ci0jaWZkZWYgQ09ORklHX1BYQTI3eAotCWNsa19wdXQoYWM5N2NvbmZfY2xrKTsKLQlhYzk3Y29uZl9jbGsgPSBOVUxMOwotI2VuZGlmCi0JY2xrX2Rpc2FibGUoYWM5N19jbGspOwotCWNsa19wdXQoYWM5N19jbGspOwotCWFjOTdfY2xrID0gTlVMTDsKKwlweGEyeHhfYWM5N19od19yZW1vdmUocGRldik7CiB9CiAKIHN0YXRpYyBpbnQgcHhhMnh4X2FjOTdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYwppbmRleCBjNzk2YjE4Li5lNzU4MDM0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYworKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAwNSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgogICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCi0gKiAgICAgICAgIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKiAgICAgICAgIGxyZ0BzbGltbG9naWMuY28udWsKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CkBAIC0zMCw2ICszMSw1NCBAQAogI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKICNpbmNsdWRlICJweGEyeHgtaTJzLmgiCiAKK3N0cnVjdCBweGEyeHhfZ3BpbyB7CisJdTMyIHN5czsKKwl1MzIJcng7CisJdTMyIHR4OworCXUzMiBjbGs7CisJdTMyIGZybTsKK307CisKKy8qCisgKiBJMlMgQ29udHJvbGxlciBSZWdpc3RlciBhbmQgQml0IERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgU0FDUjAJCV9fUkVHKDB4NDA0MDAwMDApICAvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQUNSMQkJX19SRUcoMHg0MDQwMDAwNCkgIC8qIFNlcmlhbCBBdWRpbyBJIDIgUy9NU0ItSnVzdGlmaWVkIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0FTUjAJCV9fUkVHKDB4NDA0MDAwMEMpICAvKiBTZXJpYWwgQXVkaW8gSSAyIFMvTVNCLUp1c3RpZmllZCBJbnRlcmZhY2UgYW5kIEZJRk8gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBSU1SCQlfX1JFRygweDQwNDAwMDE0KSAgLyogU2VyaWFsIEF1ZGlvIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFNBSUNSCQlfX1JFRygweDQwNDAwMDE4KSAgLyogU2VyaWFsIEF1ZGlvIEludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBTQURJVgkJX19SRUcoMHg0MDQwMDA2MCkgIC8qIEF1ZGlvIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIuICovCisjZGVmaW5lIFNBRFIJCV9fUkVHKDB4NDA0MDAwODApICAvKiBTZXJpYWwgQXVkaW8gRGF0YSBSZWdpc3RlciAoVFggYW5kIFJYIEZJRk8gYWNjZXNzIFJlZ2lzdGVyKS4gKi8KKworI2RlZmluZSBTQUNSMF9SRlRIKHgpCSgoeCkgPDwgMTIpCS8qIFJ4IEZJRk8gSW50ZXJydXB0IG9yIERNQSBUcmlnZ2VyIFRocmVzaG9sZCAqLworI2RlZmluZSBTQUNSMF9URlRIKHgpCSgoeCkgPDwgOCkJLyogVHggRklGTyBJbnRlcnJ1cHQgb3IgRE1BIFRyaWdnZXIgVGhyZXNob2xkICovCisjZGVmaW5lIFNBQ1IwX1NUUkYJKDEgPDwgNSkJLyogRklGTyBTZWxlY3QgZm9yIEVGV1IgU3BlY2lhbCBGdW5jdGlvbiAqLworI2RlZmluZSBTQUNSMF9FRldSCSgxIDw8IDQpCS8qIEVuYWJsZSBFRldSIEZ1bmN0aW9uICAqLworI2RlZmluZSBTQUNSMF9SU1QJKDEgPDwgMykJLyogRklGTywgaTJzIFJlZ2lzdGVyIFJlc2V0ICovCisjZGVmaW5lIFNBQ1IwX0JDS0QJKDEgPDwgMikgCS8qIEJpdCBDbG9jayBEaXJlY3Rpb24gKi8KKyNkZWZpbmUgU0FDUjBfRU5CCSgxIDw8IDApCS8qIEVuYWJsZSBJMlMgTGluayAqLworI2RlZmluZSBTQUNSMV9FTkxCRgkoMSA8PCA1KQkvKiBFbmFibGUgTG9vcGJhY2sgKi8KKyNkZWZpbmUgU0FDUjFfRFJQTAkoMSA8PCA0KSAJLyogRGlzYWJsZSBSZXBsYXlpbmcgRnVuY3Rpb24gKi8KKyNkZWZpbmUgU0FDUjFfRFJFQwkoMSA8PCAzKQkvKiBEaXNhYmxlIFJlY29yZGluZyBGdW5jdGlvbiAqLworI2RlZmluZSBTQUNSMV9BTVNMCSgxIDw8IDApCS8qIFNwZWNpZnkgQWx0ZXJuYXRlIE1vZGUgKi8KKworI2RlZmluZSBTQVNSMF9JMlNPRkYJKDEgPDwgNykJLyogQ29udHJvbGxlciBTdGF0dXMgKi8KKyNkZWZpbmUgU0FTUjBfUk9SCSgxIDw8IDYpCS8qIFJ4IEZJRk8gT3ZlcnJ1biAqLworI2RlZmluZSBTQVNSMF9UVVIJKDEgPDwgNSkJLyogVHggRklGTyBVbmRlcnJ1biAqLworI2RlZmluZSBTQVNSMF9SRlMJKDEgPDwgNCkJLyogUnggRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KKyNkZWZpbmUgU0FTUjBfVEZTCSgxIDw8IDMpCS8qIFR4IEZJRk8gU2VydmljZSBSZXF1ZXN0ICovCisjZGVmaW5lIFNBU1IwX0JTWQkoMSA8PCAyKQkvKiBJMlMgQnVzeSAqLworI2RlZmluZSBTQVNSMF9STkUJKDEgPDwgMSkJLyogUnggRklGTyBOb3QgRW1wdHkgKi8KKyNkZWZpbmUgU0FTUjBfVE5GCSgxIDw8IDApIAkvKiBUeCBGSUZPIE5vdCBFbXB0eSAqLworCisjZGVmaW5lIFNBSUNSX1JPUgkoMSA8PCA2KQkvKiBDbGVhciBSeCBGSUZPIE92ZXJydW4gSW50ZXJydXB0ICovCisjZGVmaW5lIFNBSUNSX1RVUgkoMSA8PCA1KQkvKiBDbGVhciBUeCBGSUZPIFVuZGVycnVuIEludGVycnVwdCAqLworCisjZGVmaW5lIFNBSU1SX1JPUgkoMSA8PCA2KQkvKiBFbmFibGUgUnggRklGTyBPdmVycnVuIENvbmRpdGlvbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0FJTVJfVFVSCSgxIDw8IDUpCS8qIEVuYWJsZSBUeCBGSUZPIFVuZGVycnVuIENvbmRpdGlvbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0FJTVJfUkZTCSgxIDw8IDQpCS8qIEVuYWJsZSBSeCBGSUZPIFNlcnZpY2UgSW50ZXJydXB0ICovCisjZGVmaW5lIFNBSU1SX1RGUwkoMSA8PCAzKQkvKiBFbmFibGUgVHggRklGTyBTZXJ2aWNlIEludGVycnVwdCAqLworCiBzdHJ1Y3QgcHhhX2kyc19wb3J0IHsKIAl1MzIgc2FkaXY7CiAJdTMyIHNhY3IwOwpAQCAtNDQsNyArOTMsNyBAQAogc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2kyc19wY21fc3RlcmVvX291dCA9IHsKIAkubmFtZQkJCT0gIkkyUyBQQ00gU3RlcmVvIG91dCIsCiAJLmRldl9hZGRyCQk9IF9fUFJFRyhTQURSKSwKLQkuZHJjbXIJCQk9ICZEUkNNUlRYU0FEUiwKKwkuZHJjbXIJCQk9ICZEUkNNUigzKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKIAkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAogfTsKQEAgLTUyLDcgKzEwMSw3IEBACiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyBweGEyeHhfaTJzX3BjbV9zdGVyZW9faW4gPSB7CiAJLm5hbWUJCQk9ICJJMlMgUENNIFN0ZXJlbyBpbiIsCiAJLmRldl9hZGRyCQk9IF9fUFJFRyhTQURSKSwKLQkuZHJjbXIJCQk9ICZEUkNNUlJYU0FEUiwKKwkuZHJjbXIJCQk9ICZEUkNNUigyKSwKIAkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKIAkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAogfTsKQEAgLTY1LDExICsxMTQsNiBAQAogCQkuZnJtID0gR1BJTzMxX1NZTkNfSTJTX01ELAogCX0sCiAJeyAvKiBJMlMgU29DIE1hc3RlciAqLwotI2lmZGVmIENPTkZJR19QWEEyN3gKLQkJLnN5cyA9IEdQSU8xMTNfSTJTX1NZU0NMS19NRCwKLSNlbHNlCi0JCS5zeXMgPSBHUElPMzJfU1lTQ0xLX0kyU19NRCwKLSNlbmRpZgogCQkucnggPSBHUElPMjlfU0RBVEFfSU5fSTJTX01ELAogCQkudHggPSBHUElPMzBfU0RBVEFfT1VUX0kyU19NRCwKIAkJLmNsayA9IEdQSU8yOF9CSVRDTEtfT1VUX0kyU19NRCwKQEAgLTM0Myw2ICszODcsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgcHhhMnh4X2kyc19pbml0KHZvaWQpCiB7CisJaWYgKGNwdV9pc19weGEyN3goKSkKKwkJZ3Bpb19idXNbMV0uc3lzID0gR1BJTzExM19JMlNfU1lTQ0xLX01EOworCWVsc2UKKwkJZ3Bpb19idXNbMV0uc3lzID0gR1BJTzMyX1NZU0NMS19JMlNfTUQ7CisKIAljbGtfaTJzID0gRVJSX1BUUigtRU5PRU5UKTsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGEyeHhfaTJzX2RyaXZlcik7CiB9CkBAIC0zNTYsNiArNDA1LDYgQEAKIG1vZHVsZV9leGl0KHB4YTJ4eF9pMnNfZXhpdCk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tLCB3d3cud29sZnNvbm1pY3JvLmNvbSIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbHJnQHNsaW1sb2dpYy5jby51ayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJweGEyeHggSTJTIFNvQyBJbnRlcmZhY2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKaW5kZXggNDM0NWYzOC4uYWZjZDg5MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKQEAgLTEwLDY0ICsxMCwxNCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KLSNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CisjaW5jbHVkZSA8c291bmQvcHhhMnh4LWxpYi5oPgogCiAjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcHhhMnh4X3BjbV9oYXJkd2FyZSA9IHsKLQkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKLQkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKLQkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIgLSAzMiwKLQkucGVyaW9kc19taW4JCT0gMSwKLQkucGVyaW9kc19tYXgJCT0gUEFHRV9TSVpFL3NpemVvZihweGFfZG1hX2Rlc2MpLAotCS5idWZmZXJfYnl0ZXNfbWF4CT0gMTI4ICogMTAyNCwKLQkuZmlmb19zaXplCQk9IDMyLAotfTsKLQotc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgewotCWludCBkbWFfY2g7Ci0Jc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOwotCXB4YV9kbWFfZGVzYyAqZG1hX2Rlc2NfYXJyYXk7Ci0JZG1hX2FkZHJfdCBkbWFfZGVzY19hcnJheV9waHlzOwotfTsKLQotc3RhdGljIHZvaWQgcHhhMnh4X3BjbV9kbWFfaXJxKGludCBkbWFfY2gsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldl9pZDsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWludCBkY3NyOwotCi0JZGNzciA9IERDU1IoZG1hX2NoKTsKLQlEQ1NSKGRtYV9jaCkgPSBkY3NyICYgfkRDU1JfU1RPUElSUUVOOwotCi0JaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpIHsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBlcnJvciBvbiBjaGFubmVsICVkIChEQ1NSPSUjeClcbiIsCi0JCQlwcnRkLT5wYXJhbXMtPm5hbWUsIGRtYV9jaCwgZGNzcik7Ci0JfQotfQorI2luY2x1ZGUgIi4uLy4uL2FybS9weGEyeHgtcGNtLmgiCiAKIHN0YXRpYyBpbnQgcHhhMnh4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCkBAIC03NiwxMCArMjYsNiBAQAogCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zICpkbWEgPSBydGQtPmRhaS0+Y3B1X2RhaS0+ZG1hX2RhdGE7Ci0Jc2l6ZV90IHRvdHNpemUgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7Ci0Jc2l6ZV90IHBlcmlvZCA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKLQlweGFfZG1hX2Rlc2MgKmRtYV9kZXNjOwotCWRtYV9hZGRyX3QgZG1hX2J1ZmZfcGh5cywgbmV4dF9kZXNjX3BoeXM7CiAJaW50IHJldDsKIAogCS8qIHJldHVybiBpZiB0aGlzIGlzIGEgYnVmZmVybGVzcyB0cmFuc2ZlciBlLmcuCkBAIC0xMDYsNDIgKzUyLDE2IEBACiAJCXBydGQtPmRtYV9jaCA9IHJldDsKIAl9CiAKLQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwotCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IHRvdHNpemU7Ci0KLQlkbWFfZGVzYyA9IHBydGQtPmRtYV9kZXNjX2FycmF5OwotCW5leHRfZGVzY19waHlzID0gcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKLQlkbWFfYnVmZl9waHlzID0gcnVudGltZS0+ZG1hX2FkZHI7Ci0JZG8gewotCQluZXh0X2Rlc2NfcGh5cyArPSBzaXplb2YocHhhX2RtYV9kZXNjKTsKLQkJZG1hX2Rlc2MtPmRkYWRyID0gbmV4dF9kZXNjX3BoeXM7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCQlkbWFfZGVzYy0+ZHNhZHIgPSBkbWFfYnVmZl9waHlzOwotCQkJZG1hX2Rlc2MtPmR0YWRyID0gcHJ0ZC0+cGFyYW1zLT5kZXZfYWRkcjsKLQkJfSBlbHNlIHsKLQkJCWRtYV9kZXNjLT5kc2FkciA9IHBydGQtPnBhcmFtcy0+ZGV2X2FkZHI7Ci0JCQlkbWFfZGVzYy0+ZHRhZHIgPSBkbWFfYnVmZl9waHlzOwotCQl9Ci0JCWlmIChwZXJpb2QgPiB0b3RzaXplKQotCQkJcGVyaW9kID0gdG90c2l6ZTsKLQkJZG1hX2Rlc2MtPmRjbWQgPSBwcnRkLT5wYXJhbXMtPmRjbWQgfCBwZXJpb2QgfCBEQ01EX0VORElSUUVOOwotCQlkbWFfZGVzYysrOwotCQlkbWFfYnVmZl9waHlzICs9IHBlcmlvZDsKLQl9IHdoaWxlICh0b3RzaXplIC09IHBlcmlvZCk7Ci0JZG1hX2Rlc2NbLTFdLmRkYWRyID0gcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKLQotCXJldHVybiAwOworCXJldHVybiBfX3B4YTJ4eF9wY21faHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zKTsKIH0KIAogc3RhdGljIGludCBweGEyeHhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAotCWlmIChwcnRkICYmIHBydGQtPnBhcmFtcykKLQkJKnBydGQtPnBhcmFtcy0+ZHJjbXIgPSAwOworCV9fcHhhMnh4X3BjbV9od19mcmVlKHN1YnN0cmVhbSk7CiAKIAlpZiAocHJ0ZC0+ZG1hX2NoKSB7Ci0JCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7CiAJCXB4YV9mcmVlX2RtYShwcnRkLT5kbWFfY2gpOwogCQlwcnRkLT5kbWFfY2ggPSAwOwogCX0KQEAgLTE0OSwxODggKzY5LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHhhMnh4X3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlEQ1NSKHBydGQtPmRtYV9jaCkgJj0gfkRDU1JfUlVOOwotCURDU1IocHJ0ZC0+ZG1hX2NoKSA9IDA7Ci0JRENNRChwcnRkLT5kbWFfY2gpID0gMDsKLQkqcHJ0ZC0+cGFyYW1zLT5kcmNtciA9IHBydGQtPmRtYV9jaCB8IERSQ01SX01BUFZMRDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB4YTJ4eF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlEREFEUihwcnRkLT5kbWFfY2gpID0gcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKLQkJRENTUihwcnRkLT5kbWFfY2gpID0gRENTUl9SVU47Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCURDU1IocHJ0ZC0+ZG1hX2NoKSAmPSB+RENTUl9SVU47Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCURDU1IocHJ0ZC0+ZG1hX2NoKSB8PSBEQ1NSX1JVTjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlEREFEUihwcnRkLT5kbWFfY2gpID0gcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5czsKLQkJRENTUihwcnRkLT5kbWFfY2gpIHw9IERDU1JfUlVOOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190Ci1weGEyeHhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCWRtYV9hZGRyX3QgcHRyID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8KLQkJCSBEU0FEUihwcnRkLT5kbWFfY2gpIDogRFRBRFIocHJ0ZC0+ZG1hX2NoKTsKLQlzbmRfcGNtX3VmcmFtZXNfdCB4ID0gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHB0ciAtIHJ1bnRpbWUtPmRtYV9hZGRyKTsKLQotCWlmICh4ID09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQl4ID0gMDsKLQlyZXR1cm4geDsKLX0KLQotc3RhdGljIGludCBweGEyeHhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZDsKLQlpbnQgcmV0OwotCi0Jc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZweGEyeHhfcGNtX2hhcmR3YXJlKTsKLQotCS8qCi0JICogRm9yIG15c3RlcmlvdXMgcmVhc29ucyAoYW5kIGRlc3BpdGUgd2hhdCB0aGUgbWFudWFsIHNheXMpCi0JICogcGxheWJhY2sgc2FtcGxlcyBhcmUgbG9zdCBpZiB0aGUgRE1BIGNvdW50IGlzIG5vdCBhIG11bHRpcGxlCi0JICogb2YgdGhlIERNQSBidXJzdCBzaXplLiAgTGV0J3MgYWRkIGEgcnVsZSB0byBlbmZvcmNlIHRoYXQuCi0JICovCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgMzIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmIChwcnRkID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXkgPQotCQlkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKLQkJCQkgICAgICAgJnBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXMsIEdGUF9LRVJORUwpOwotCWlmICghcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnIxOwotCX0KLQotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci0JcmV0dXJuIDA7Ci0KLSBlcnIxOgotCWtmcmVlKHBydGQpOwotIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHB4YTJ4eF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCWRtYV9mcmVlX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCBQQUdFX1NJWkUsCi0JCQkgICAgICBwcnRkLT5kbWFfZGVzY19hcnJheSwgcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cyk7Ci0Ja2ZyZWUocHJ0ZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHhhMnh4X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcmV0dXJuIGRtYV9tbWFwX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCB2bWEsCi0JCQkJICAgICBydW50aW1lLT5kbWFfYXJlYSwKLQkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hZGRyLAotCQkJCSAgICAgcnVudGltZS0+ZG1hX2J5dGVzKTsKLX0KLQogc3RydWN0IHNuZF9wY21fb3BzIHB4YTJ4eF9wY21fb3BzID0gewotCS5vcGVuCQk9IHB4YTJ4eF9wY21fb3BlbiwKLQkuY2xvc2UJCT0gcHhhMnh4X3BjbV9jbG9zZSwKKwkub3BlbgkJPSBfX3B4YTJ4eF9wY21fb3BlbiwKKwkuY2xvc2UJCT0gX19weGEyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKIAkuaHdfcGFyYW1zCT0gcHhhMnh4X3BjbV9od19wYXJhbXMsCiAJLmh3X2ZyZWUJPSBweGEyeHhfcGNtX2h3X2ZyZWUsCi0JLnByZXBhcmUJPSBweGEyeHhfcGNtX3ByZXBhcmUsCisJLnByZXBhcmUJPSBfX3B4YTJ4eF9wY21fcHJlcGFyZSwKIAkudHJpZ2dlcgk9IHB4YTJ4eF9wY21fdHJpZ2dlciwKIAkucG9pbnRlcgk9IHB4YTJ4eF9wY21fcG9pbnRlciwKIAkubW1hcAkJPSBweGEyeHhfcGNtX21tYXAsCiB9OwogCi1zdGF0aWMgaW50IHB4YTJ4eF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQlzaXplX3Qgc2l6ZSA9IHB4YTJ4eF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKLQlidWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOwotCWJ1Zi0+ZGV2LmRldiA9IHBjbS0+Y2FyZC0+ZGV2OwotCWJ1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlidWYtPmFyZWEgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBzaXplLAotCQkJCQkgICAmYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1Zi0+YXJlYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYnVmLT5ieXRlcyA9IHNpemU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YTJ4eF9wY21fZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3Qgc25kX3BjbSAqcGNtKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmOwotCWludCBzdHJlYW07Ci0KLQlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7Ci0JCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKLQkJaWYgKCFzdWJzdHJlYW0pCi0JCQljb250aW51ZTsKLQotCQlidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCQlpZiAoIWJ1Zi0+YXJlYSkKLQkJCWNvbnRpbnVlOwotCi0JCWRtYV9mcmVlX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgYnVmLT5ieXRlcywKLQkJCQkgICAgICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7Ci0JCWJ1Zi0+YXJlYSA9IE5VTEw7Ci0JfQotfQotCiBzdGF0aWMgdTY0IHB4YTJ4eF9wY21fZG1hbWFzayA9IERNQV8zMkJJVF9NQVNLOwogCi1pbnQgcHhhMnh4X3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKK3N0YXRpYyBpbnQgcHhhMnh4X3NvY19wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCiAJc3RydWN0IHNuZF9wY20gKnBjbSkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTM2MCw3ICsxMTMsNyBAQAogc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gcHhhMnh4X3NvY19wbGF0Zm9ybSA9IHsKIAkubmFtZQkJPSAicHhhMnh4LWF1ZGlvIiwKIAkucGNtX29wcyAJPSAmcHhhMnh4X3BjbV9vcHMsCi0JLnBjbV9uZXcJPSBweGEyeHhfcGNtX25ldywKKwkucGNtX25ldwk9IHB4YTJ4eF9zb2NfcGNtX25ldywKIAkucGNtX2ZyZWUJPSBweGEyeHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X3NvY19wbGF0Zm9ybSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uaCBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5oCmluZGV4IDU0YzljNzUuLjYwYzNiMjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5oCisrKyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5oCkBAIC0xMywyMSArMTMsNiBAQAogI2lmbmRlZiBfUFhBMlhYX1BDTV9ICiAjZGVmaW5lIF9QWEEyWFhfUENNX0gKIAotc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyB7Ci0JY2hhciAqbmFtZTsJCQkvKiBzdHJlYW0gaWRlbnRpZmllciAqLwotCXUzMiBkY21kOwkJCS8qIERNQSBkZXNjcmlwdG9yIGRjbWQgZmllbGQgKi8KLQl2b2xhdGlsZSB1MzIgKmRyY21yOwkJLyogdGhlIERNQSByZXF1ZXN0IGNoYW5uZWwgdG8gdXNlICovCi0JdTMyIGRldl9hZGRyOwkJCS8qIGRldmljZSBwaHlzaWNhbCBhZGRyZXNzIGZvciBETUEgKi8KLX07Ci0KLXN0cnVjdCBweGEyeHhfZ3BpbyB7Ci0JdTMyIHN5czsKLQl1MzIJcng7Ci0JdTMyIHR4OwotCXUzMiBjbGs7Ci0JdTMyIGZybTsKLX07Ci0KIC8qIHBsYXRmb3JtIGRhdGEgKi8KIGV4dGVybiBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSBweGEyeHhfc29jX3BsYXRmb3JtOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NwaXR6LmMgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKaW5kZXggMzdjYjc2OC4uZDMwN2I2NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9zcGl0ei5jCisrKyBiL3NvdW5kL3NvYy9weGEvc3BpdHouYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KICAqCi0gKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogICAgICAgICAgUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTksMTYgKzE5LDE1IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhLXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ha2l0YS5oPgogI2luY2x1ZGUgPG1hY2gvc3BpdHouaD4KICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzUwLmgiCiAjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgpAQCAtNjMsOCArNjIsOCBAQAogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKLQkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX01VVEVfUik7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDEpOwogCQlicmVhazsKIAljYXNlIFNQSVRaX01JQzoKIAkJLyogZW5hYmxlIG1pYyBqYWNrIGFuZCBiaWFzLCBtdXRlIGhwICovCkBAIC03Miw4ICs3MSw4IEBACiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX1IpOworCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9MSU5FOgogCQkvKiBlbmFibGUgbGluZSBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzIGFuZCBtdXRlIGhwICovCkBAIC04MSw4ICs4MCw4IEBACiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX1IpOworCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9IRUFEU0VUOgogCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBoZWFkc2V0IGphY2sgZW5hYmxlIG1pYyBiaWFzLCBtdXRlIEwgaHAgKi8KQEAgLTkwLDggKzg5LDggQEAKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKIAkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKLQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKLQkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX01VVEVfUik7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9MLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX1IsIDEpOwogCQlicmVhazsKIAljYXNlIFNQSVRaX0hQX09GRjoKIApAQCAtMTAwLDggKzk5LDggQEAKIAkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBKYWNrIik7CiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CiAJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOwotCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX1IpOworCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAwKTsKIAkJYnJlYWs7CiAJfQogCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKQEAgLTIxNSwyMyArMjE0LDE0IEBACiBzdGF0aWMgaW50IHNwaXR6X21pY19iaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKIHsKLQlpZiAobWFjaGluZV9pc19ib3J6b2koKSB8fCBtYWNoaW5lX2lzX3NwaXR6KCkpIHsKLQkJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCi0JCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwKLQkJCQlTUElUWl9TQ1AyX01JQ19CSUFTKTsKLQkJZWxzZQotCQkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcDJfZGV2aWNlLmRldiwKLQkJCQlTUElUWl9TQ1AyX01JQ19CSUFTKTsKLQl9CisJaWYgKG1hY2hpbmVfaXNfYm9yem9pKCkgfHwgbWFjaGluZV9pc19zcGl0eigpKQorCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01JQ19CSUFTLAorCQkJCVNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpOwogCi0JaWYgKG1hY2hpbmVfaXNfYWtpdGEoKSkgewotCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKLQkJCWFraXRhX3NldF9pb2V4cCgmYWtpdGFpb2V4cF9kZXZpY2UuZGV2LAotCQkJCUFLSVRBX0lPRVhQX01JQ19CSUFTKTsKLQkJZWxzZQotCQkJYWtpdGFfcmVzZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwKLQkJCQlBS0lUQV9JT0VYUF9NSUNfQklBUyk7Ci0JfQorCWlmIChtYWNoaW5lX2lzX2FraXRhKCkpCisJCWdwaW9fc2V0X3ZhbHVlKEFLSVRBX0dQSU9fTUlDX0JJQVMsCisJCQkJU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjkxLDEzICsyODEsMTMgQEAKIAlpbnQgaSwgZXJyOwogCiAJLyogTkMgY29kZWMgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIlJJTlBVVDEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMSU5QVVQyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUklOUFVUMiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxJTlBVVDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJSSU5QVVQzIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiT1VUMyIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1PTk8xIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJJTlBVVDEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElOUFVUMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSSU5QVVQyIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTlBVVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUklOUFVUMyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1PTk8xIik7CiAKIAkvKiBBZGQgc3BpdHogc3BlY2lmaWMgY29udHJvbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NTBfc3BpdHpfY29udHJvbHMpOyBpKyspIHsKQEAgLTMzNyw2ICszMjcsNyBAQAogCiAvKiBzcGl0eiBhdWRpbyBwcml2YXRlIGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgd204NzUwX3NldHVwX2RhdGEgc3BpdHpfd204NzUwX3NldHVwID0geworCS5pMmNfYnVzID0gMCwKIAkuaTJjX2FkZHJlc3MgPSAweDFiLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS90b3NhLmMgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwppbmRleCAyYmFhYTc1Li5hZmVmZTQxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Rvc2EuYworKysgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KICAqCi0gKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogICAgICAgICAgUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTkwLDggKzE5MCw4IEBACiB7CiAJaW50IGksIGVycjsKIAotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNT05PT1VUIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTU9OT09VVCIpOwogCiAJLyogYWRkIHRvc2Egc3BlY2lmaWMgY29udHJvbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9uZW8xOTczX3dtODc1My5jIGIvc291bmQvc29jL3MzYzI0eHgvbmVvMTk3M193bTg3NTMuYwppbmRleCA4MDg5ZjhlLi44N2RkZmVmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9uZW8xOTczX3dtODc1My5jCisrKyBiL3NvdW5kL3NvYy9zM2MyNHh4L25lbzE5NzNfd204NzUzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2Nvb3AuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgpAQCAtNTEwLDIxICs1MTEsMjAgQEAKIAlEQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIHNldCB1cCBOQyBjb2RlYyBwaW5zICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTE9VVDIiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJST1VUMiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJPVVQ0Iik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTElORTEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMSU5FMiIpOwotCi0KLQkvKiBzZXQgZW5kcG9pbnRzIHRvIGRlZmF1bHQgbW9kZSAqLwotCXNldF9zY2VuYXJpb19lbmRwb2ludHMoY29kZWMsIE5FT19BVURJT19PRkYpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMT1VUMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJST1VUMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORTEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORTIiKTsKIAogCS8qIEFkZCBuZW8xOTczIHNwZWNpZmljIHdpZGdldHMgKi8KIAlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg3NTNfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg3NTNfZGFwbV93aWRnZXRzKSk7CiAKKwkvKiBzZXQgZW5kcG9pbnRzIHRvIGRlZmF1bHQgbW9kZSAqLworCXNldF9zY2VuYXJpb19lbmRwb2ludHMoY29kZWMsIE5FT19BVURJT19PRkYpOworCiAJLyogYWRkIG5lbzE5NzMgc3BlY2lmaWMgY29udHJvbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NTNfbmVvMTk3M19jb250cm9scyk7IGkrKykgewogCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKQEAgLTU4Niw2ICs1ODYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB3bTg3NTNfc2V0dXBfZGF0YSBuZW8xOTczX3dtODc1M19zZXR1cCA9IHsKKwkuaTJjX2J1cyA9IDAsCiAJLmkyY19hZGRyZXNzID0gMHgxYSwKIH07CiAKQEAgLTU5Niw1NCArNTk3LDI0IEBACiAJLmNvZGVjX2RhdGEgPSAmbmVvMTk3M193bTg3NTNfc2V0dXAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDdDLCBJMkNfQ0xJRU5UX0VORCB9OwotCi0vKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLwotSTJDX0NMSUVOVF9JTlNNT0Q7Ci0KLXN0YXRpYyBpbnQgbG00ODU3X2FtcF9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgbG00ODU3X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmV0OwotCiAJREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOwotCi0JaTJjID0ga21lbWR1cCgmY2xpZW50X3RlbXBsYXRlLCBzaXplb2YoY2xpZW50X3RlbXBsYXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGkyYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJMTTQ4NTcgZmFpbGVkIHRvIGF0dGFjaCBhdCBhZGRyICV4XG4iLCBhZGRyKTsKLQkJZ290byBleGl0X2VycjsKLQl9CisJaTJjID0gY2xpZW50OwogCiAJbG00ODU3X3dyaXRlX3JlZ3MoKTsKLQlyZXR1cm4gcmV0OwotCi1leGl0X2VycjoKLQlrZnJlZShpMmMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbG00ODU3X2kyY19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlEQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKLQotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0Ja2ZyZWUoY2xpZW50KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsbTQ4NTdfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCitzdGF0aWMgaW50IGxtNDg1N19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGxtNDg1N19hbXBfcHJvYmUpOworCWkyYyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHU4IGxtNDg1N19zdGF0ZTsKQEAgLTY4MSwyNCArNjUyLDIyIEBACiAJbG00ODU3X3dyaXRlX3JlZ3MoKTsKIH0KIAotLyogY29yZ2kgaTJjIGNvZGVjIGNvbnRyb2wgbGF5ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTQ4NTdfaTJjX2lkW10gPSB7CisJeyAibmVvMTk3M19sbTQ4NTciLCAwIH0sCisJeyB9Cit9OworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG00ODU3X2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiTE00ODU3IEkyQyBBbXAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAotCS5pZCA9ICAgICAgICAgICAgIEkyQ19EUklWRVJJRF9MTTQ4NTcsCiAJLnN1c3BlbmQgPSAgICAgICAgbG00ODU3X3N1c3BlbmQsCiAJLnJlc3VtZQk9ICAgICAgICAgbG00ODU3X3Jlc3VtZSwKIAkuc2h1dGRvd24gPSAgICAgICBsbTQ4NTdfc2h1dGRvd24sCi0JLmF0dGFjaF9hZGFwdGVyID0gbG00ODU3X2kyY19hdHRhY2gsCi0JLmRldGFjaF9jbGllbnQgPSAgbG00ODU3X2kyY19kZXRhY2gsCi0JLmNvbW1hbmQgPSAgICAgICAgTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAgICJMTTQ4NTciLAotCS5kcml2ZXIgPSAmbG00ODU3X2kyY19kcml2ZXIsCisJLnByb2JlID0gICAgICAgICAgbG00ODU3X2kyY19wcm9iZSwKKwkucmVtb3ZlID0gICAgICAgICBsbTQ4NTdfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSAgICAgICBsbTQ4NTdfaTJjX2lkLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm5lbzE5NzNfc25kX2RldmljZTsKQEAgLTcwOSw2ICs2NzgsMTIgQEAKIAogCURCRygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCisJaWYgKCFtYWNoaW5lX2lzX25lbzE5NzNfZ3RhMDEoKSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiT25seSBHVEEwMSBoYXJkd2FyZSBzdXBwb3J0ZWQgYnkgQVNvQyBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAluZW8xOTczX3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKIAlpZiAoIW5lbzE5NzNfc25kX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03MTcsMTIgKzY5MiwxNSBAQAogCW5lbzE5NzNfc25kX2RldmRhdGEuZGV2ID0gJm5lbzE5NzNfc25kX2RldmljZS0+ZGV2OwogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobmVvMTk3M19zbmRfZGV2aWNlKTsKIAotCWlmIChyZXQpCisJaWYgKHJldCkgewogCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KG5lbzE5NzNfc25kX2RldmljZSk7CisJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJmxtNDg1N19pMmNfZHJpdmVyKTsKKwogCWlmIChyZXQgIT0gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihuZW8xOTczX3NuZF9kZXZpY2UpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKaW5kZXggODNmMTE5MC4uNDYyZTYzNWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC00LDggKzQsNyBAQAogICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgogICoKLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAotICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogICogICAgICAgICB3aXRoIGNvZGUsIGNvbW1lbnRzIGFuZCBpZGVhcyBmcm9tIDotCiAgKiAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgogICoKQEAgLTM0MCw2ICszMzksMTIgQEAKIAl9CiAJY29kZWMtPmFjdGl2ZS0tOwogCisJLyogTXV0aW5nIHRoZSBEQUMgc3VwcHJlc3NlcyBhcnRpZmFjdHMgY2F1c2VkIGR1cmluZyBkaWdpdGFsCisJICogc2h1dGRvd24sIGZvciBleGFtcGxlIGZyb20gc3RvcHBpbmcgY2xvY2tzLgorCSAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlzbmRfc29jX2RhaV9kaWdpdGFsX211dGUoY29kZWNfZGFpLCAxKTsKKwogCWlmIChjcHVfZGFpLT5vcHMuc2h1dGRvd24pCiAJCWNwdV9kYWktPm9wcy5zaHV0ZG93bihzdWJzdHJlYW0pOwogCkBAIC05NzAsOSArOTc1LDI5IEBACiAJCXN0ZXAgPSBjb2RlYy0+cmVnX2NhY2hlX3N0ZXA7CiAKIAljb3VudCArPSBzcHJpbnRmKGJ1ZiwgIiVzIHJlZ2lzdGVyc1xuIiwgY29kZWMtPm5hbWUpOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+cmVnX2NhY2hlX3NpemU7IGkgKz0gc3RlcCkKLQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiUyeDogJTR4XG4iLCBpLAotCQkJY29kZWMtPnJlYWQoY29kZWMsIGkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPnJlZ19jYWNoZV9zaXplOyBpICs9IHN0ZXApIHsKKwkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiUyeDogIiwgaSk7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUgLSAxKQorCQkJYnJlYWs7CisKKwkJaWYgKGNvZGVjLT5kaXNwbGF5X3JlZ2lzdGVyKQorCQkJY291bnQgKz0gY29kZWMtPmRpc3BsYXlfcmVnaXN0ZXIoY29kZWMsIGJ1ZiArIGNvdW50LAorCQkJCQkJCSBQQUdFX1NJWkUgLSBjb3VudCwgaSk7CisJCWVsc2UKKwkJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwKKwkJCQkJICAiJTR4IiwgY29kZWMtPnJlYWQoY29kZWMsIGkpKTsKKworCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFIC0gMSkKKwkJCWJyZWFrOworCisJCWNvdW50ICs9IHNucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIlxuIik7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUgLSAxKQorCQkJYnJlYWs7CisJfQorCisJLyogVHJ1bmNhdGUgY291bnQ7IG1pbigpIHdvdWxkIGNhdXNlIGEgd2FybmluZyAqLworCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9TSVpFIC0gMTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTEyOTYsMTAgKzEzMjEsMTAgQEAKIAogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwogCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOwotCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWFzazsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPm1heDsKIAotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWFzayAtIDEpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXNrIC0gMTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IGUtPm1heCAtIDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXggLSAxOwogCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAogCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CiAJcmV0dXJuIDA7CkBAIC0xMzIyLDcgKzEzNDcsNyBAQAogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAl1bnNpZ25lZCBzaG9ydCB2YWwsIGJpdG1hc2s7CiAKLQlmb3IgKGJpdG1hc2sgPSAxOyBiaXRtYXNrIDwgZS0+bWFzazsgYml0bWFzayA8PD0gMSkKKwlmb3IgKGJpdG1hc2sgPSAxOyBiaXRtYXNrIDwgZS0+bWF4OyBiaXRtYXNrIDw8PSAxKQogCQk7CiAJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOwogCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0KQEAgLTEzNTIsMTQgKzEzNzcsMTQgQEAKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAJdW5zaWduZWQgc2hvcnQgbWFzaywgYml0bWFzazsKIAotCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXg7IGJpdG1hc2sgPDw9IDEpCiAJCTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1hc2sgLSAxKQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOwogCW1hc2sgPSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X2w7CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1hc2sgLSAxKQorCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJdmFsIHw9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgZS0+c2hpZnRfcjsKIAkJbWFzayB8PSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X3I7CkBAIC0xMzg2LDEwICsxNDExLDEwIEBACiAKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwotCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWFzazsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPm1heDsKIAotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWFzayAtIDEpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXNrIC0gMTsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IGUtPm1heCAtIDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXggLSAxOwogCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAogCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CiAJcmV0dXJuIDA7CkBAIC0xNDM0LDkgKzE0NTksMTEgQEAKIGludCBzbmRfc29jX2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlpbnQgbWF4ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKLQlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+bWluOworCXVuc2lnbmVkIGludCByc2hpZnQgPSBtYy0+cnNoaWZ0OwogCiAJaWYgKG1heCA9PSAxKQogCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKQEAgLTE0NjIsMTMgKzE0ODksMTUgQEAKIGludCBzbmRfc29jX2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7Ci0JaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOwotCWludCBtYXggPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKLQlpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CisJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKQEAgLTE0OTksMTMgKzE1MjgsMTUgQEAKIGludCBzbmRfc29jX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7Ci0JaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOwotCWludCBtYXggPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKLQlpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CisJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CiAJdW5zaWduZWQgc2hvcnQgdmFsLCB2YWwyLCB2YWxfbWFzazsKIAogCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOwpAQCAtMTUzNyw3ICsxNTY4LDkgQEAKIGludCBzbmRfc29jX2luZm9fdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlpbnQgbWF4ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4ZmY7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgbWF4ID0gbWMtPm1heDsKIAogCWlmIChtYXggPT0gMSkKIAkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CkBAIC0xNTYzLDEzICsxNTk2LDE1IEBACiBpbnQgc25kX3NvY19nZXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOwotCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7Ci0JaW50IG1heCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweGZmOwotCWludCBtYXNrID0gKDE8PGZscyhtYXgpKS0xOwotCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjApICYgMHgwMTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKwl1bnNpZ25lZCBpbnQgcmVnMiA9IG1jLT5ycmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxPDxmbHMobWF4KSktMTsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKIAogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KIAkJKHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSA+PiBzaGlmdCkgJiBtYXNrOwpAQCAtMTU5OCwxMyArMTYzMywxNSBAQAogaW50IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogeworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7Ci0JaW50IHJlZzIgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZjsKLQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweDBmOwotCWludCBtYXggPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKLQlpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyMCkgJiAweDAxOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCByZWcyID0gbWMtPnJyZWc7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWMtPnNoaWZ0OworCWludCBtYXggPSBtYy0+bWF4OworCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIHNob3J0IHZhbCwgdmFsMiwgdmFsX21hc2s7CiAKQEAgLTE2NDEsOCArMTY3OCwxMCBAQAogaW50IHNuZF9zb2NfaW5mb192b2xzd19zOChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCWludCBtYXggPSAoc2lnbmVkIGNoYXIpKChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmKTsKLQlpbnQgbWluID0gKHNpZ25lZCBjaGFyKSgoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZik7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwlpbnQgbWluID0gbWMtPm1pbjsKIAogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IDI7CkBAIC0xNjY0LDkgKzE3MDMsMTEgQEAKIGludCBzbmRfc29jX2dldF92b2xzd19zOChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCBtaW4gPSAoc2lnbmVkIGNoYXIpKChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmKTsKKwl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKwlpbnQgbWluID0gbWMtPm1pbjsKIAlpbnQgdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOwogCiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQpAQCAtMTY4OSw5ICsxNzMwLDExIEBACiBpbnQgc25kX3NvY19wdXRfdm9sc3dfczgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgbWluID0gKHNpZ25lZCBjaGFyKSgoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHhmZik7CisJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJaW50IG1pbiA9IG1jLT5taW47CiAJdW5zaWduZWQgc2hvcnQgdmFsOwogCiAJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdK21pbikgJiAweGZmOwpAQCAtMTg0Miw3ICsxODg1LDcgQEAKIG1vZHVsZV9leGl0KHNuZF9zb2NfZXhpdCk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tLCB3d3cud29sZnNvbm1pY3JvLmNvbSIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbHJnQHNsaW1sb2dpYy5jby51ayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBDb3JlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNvYy1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBmOWQxMDBiLi5lZmJkMGIzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtMiw4ICsyLDcgQEAKICAqIHNvYy1kYXBtLmMgIC0tICBBTFNBIFNvQyBEeW5hbWljIEF1ZGlvIFBvd2VyIE1hbmFnZW1lbnQKICAqCiAgKiBDb3B5cmlnaHQgMjAwNSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgotICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCi0gKiAgICAgICAgIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTY3LDcgKzY3LDkgQEAKIG1vZHVsZV9wYXJhbShkYXBtX3N0YXR1cywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGFwbV9zdGF0dXMsICJlbmFibGUgRFBNIHN5c2ZzIGVudHJpZXMiKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBwb3BfdGltZTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphc29jX2RlYnVnZnM7CisKK3N0YXRpYyB1MzIgcG9wX3RpbWU7CiAKIHN0YXRpYyB2b2lkIHBvcF93YWl0KHZvaWQpCiB7CkBAIC0xMDQsMTAgKzEwNiwxMyBAQAogCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKIAljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjogewogCQlpbnQgdmFsOwotCQlpbnQgcmVnID0gdy0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWUgJiAweGZmOwotCQlpbnQgc2hpZnQgPSAody0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweDBmOwotCQlpbnQgbWFzayA9ICh3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCQlpbnQgaW52ZXJ0ID0gKHctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPSAoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopCisJCQl3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZTsKKwkJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwkJaW50IG1heCA9IG1jLT5tYXg7CisJCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwkJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CiAKIAkJdmFsID0gc25kX3NvY19yZWFkKHctPmNvZGVjLCByZWcpOwogCQl2YWwgPSAodmFsID4+IHNoaWZ0KSAmIG1hc2s7CkBAIC0xMjIsMTMgKzEyNywxMyBAQAogCQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopdy0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWU7CiAJCWludCB2YWwsIGl0ZW0sIGJpdG1hc2s7CiAKLQkJZm9yIChiaXRtYXNrID0gMTsgYml0bWFzayA8IGUtPm1hc2s7IGJpdG1hc2sgPDw9IDEpCisJCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXg7IGJpdG1hc2sgPDw9IDEpCiAJCTsKIAkJdmFsID0gc25kX3NvY19yZWFkKHctPmNvZGVjLCBlLT5yZWcpOwogCQlpdGVtID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIChiaXRtYXNrIC0gMSk7CiAKIAkJcC0+Y29ubmVjdCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBlLT5tYXNrOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGUtPm1heDsgaSsrKSB7CiAJCQlpZiAoIShzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbaV0pKSAmJiBpdGVtID09IGkpCiAJCQkJcC0+Y29ubmVjdCA9IDE7CiAJCX0KQEAgLTE2NSw3ICsxNzAsNyBAQAogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlLT5tYXNrOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZS0+bWF4OyBpKyspIHsKIAkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgewogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CiAJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CkBAIC0yNDcsMTYgKzI1MiwxOSBAQAogCQlyZXR1cm4gMDsKIAogCWlmICh3aWRnZXQtPm51bV9rY29udHJvbHMgJiYgaykgewotCQlpbnQgcmVnID0gay0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7Ci0JCWludCBzaGlmdCA9IChrLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKLQkJaW50IG1hc2sgPSAoay0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCQlpbnQgaW52ZXJ0ID0gKGstPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwMTsKKwkJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopay0+cHJpdmF0ZV92YWx1ZTsKKwkJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwkJaW50IG1heCA9IG1jLT5tYXg7CisJCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwkJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7CiAKIAkJaWYgKHBvd2VyKSB7CiAJCQlpbnQgaTsKIAkJCS8qIHBvd2VyIHVwIGhhcyBoYXBwZW5kZWQsIGluY3JlYXNlIHZvbHVtZSB0byBsYXN0IGxldmVsICovCiAJCQlpZiAoaW52ZXJ0KSB7Ci0JCQkJZm9yIChpID0gbWFzazsgaSA+IHdpZGdldC0+c2F2ZWRfdmFsdWU7IGktLSkKKwkJCQlmb3IgKGkgPSBtYXg7IGkgPiB3aWRnZXQtPnNhdmVkX3ZhbHVlOyBpLS0pCiAJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCBtYXNrLCBpKTsKIAkJCX0gZWxzZSB7CiAJCQkJZm9yIChpID0gMDsgaSA8IHdpZGdldC0+c2F2ZWRfdmFsdWU7IGkrKykKQEAgLTY4NCw3ICs2OTIsNyBAQAogLyogdGVzdCBhbmQgdXBkYXRlIHRoZSBwb3dlciBzdGF0dXMgb2YgYSBtdXggd2lkZ2V0ICovCiBzdGF0aWMgaW50IGRhcG1fbXV4X3VwZGF0ZV9wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LAogCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IG1hc2ssCi0JCQkJIGludCB2YWwsIHN0cnVjdCBzb2NfZW51bSogZSkKKwkJCQkgaW50IG11eCwgaW50IHZhbCwgc3RydWN0IHNvY19lbnVtICplKQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKIAlpbnQgZm91bmQgPSAwOwpAQCAtNzAwLDEyICs3MDgsMTIgQEAKIAkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFwYXRoLT5uYW1lIHx8ICEgZS0+dGV4dHNbdmFsXSkKKwkJaWYgKCFwYXRoLT5uYW1lIHx8ICFlLT50ZXh0c1ttdXhdKQogCQkJY29udGludWU7CiAKIAkJZm91bmQgPSAxOwogCQkvKiB3ZSBub3cgbmVlZCB0byBtYXRjaCB0aGUgc3RyaW5nIGluIHRoZSBlbnVtIHRvIHRoZSBwYXRoICovCi0JCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1t2YWxdKSkpCisJCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1ttdXhdKSkpCiAJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KIAkJZWxzZQogCQkJcGF0aC0+Y29ubmVjdCA9IDA7IC8qIG9sZCBjb25uZWN0aW9uIG11c3QgYmUgcG93ZXJlZCBkb3duICovCkBAIC04MTEsNTEgKzgxOSwzNSBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoZGFwbV93aWRnZXQsIDA0NDQsIGRhcG1fd2lkZ2V0X3Nob3csIE5VTEwpOwogCi0vKiBwb3AvY2xpY2sgZGVsYXkgdGltZXMgKi8KLXN0YXRpYyBzc2l6ZV90IGRhcG1fcG9wX3RpbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9wX3RpbWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkYXBtX3BvcF90aW1lX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpID49IDApCi0JCXBvcF90aW1lID0gdmFsOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcGFyc2UgcG9wX3RpbWUgc2V0dGluZ1xuIik7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihkYXBtX3BvcF90aW1lLCAwNzQ0LCBkYXBtX3BvcF90aW1lX3Nob3csCi0JCSAgIGRhcG1fcG9wX3RpbWVfc3RvcmUpOwotCiBpbnQgc25kX3NvY19kYXBtX3N5c19hZGQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXQgPSAwOwogCi0JaWYgKGRhcG1fc3RhdHVzKSB7Ci0JCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kYXBtX3dpZGdldCk7CisJaWYgKCFkYXBtX3N0YXR1cykKKwkJcmV0dXJuIDA7CiAKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RhcG1fcG9wX3RpbWUpOwotCX0KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGFwbV93aWRnZXQpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZXQ7CisJYXNvY19kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKCJhc29jIiwgTlVMTCk7CisJaWYgKCFJU19FUlIoYXNvY19kZWJ1Z2ZzKSkKKwkJZGVidWdmc19jcmVhdGVfdTMyKCJkYXBtX3BvcF90aW1lIiwgMDc0NCwgYXNvY19kZWJ1Z2ZzLAorCQkJCSAgICZwb3BfdGltZSk7CisJZWxzZQorCQlhc29jX2RlYnVnZnMgPSBOVUxMOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9zb2NfZGFwbV9zeXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZiAoZGFwbV9zdGF0dXMpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RhcG1fcG9wX3RpbWUpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGFwbV93aWRnZXQpOwogCX0KKworCWlmIChhc29jX2RlYnVnZnMpCisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShhc29jX2RlYnVnZnMpOwogfQogCiAvKiBmcmVlIGFsbCBkYXBtIHdpZGdldHMgYW5kIHJlc291cmNlcyAqLwpAQCAtMTEzMywxMiArMTEyNSwxNCBAQAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKLQlpbnQgc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAweDBmOwotCWludCByc2hpZnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHgwZjsKLQlpbnQgbWF4ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOwotCWludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKKwl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKKwlpbnQgbWF4ID0gbWMtPm1heDsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CiAKIAkvKiByZXR1cm4gdGhlIHNhdmVkIHZhbHVlIGlmIHdlIGFyZSBwb3dlcmVkIGRvd24gKi8KIAlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fcGdhICYmICF3aWRnZXQtPnBvd2VyKSB7CkBAIC0xMTc2LDEyICsxMTcwLDE0IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwotCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7Ci0JaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOwotCWludCBtYXggPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKLQlpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gbWMtPnNoaWZ0OworCXVuc2lnbmVkIGludCByc2hpZnQgPSBtYy0+cnNoaWZ0OworCWludCBtYXggPSBtYy0+bWF4OworCXVuc2lnbmVkIGludCBtYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0ID0gbWMtPmludmVydDsKIAl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOwogCWludCByZXQ7CiAKQEAgLTEyNDgsNyArMTI0NCw3IEBACiAJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIHNob3J0IHZhbCwgYml0bWFzazsKIAotCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXg7IGJpdG1hc2sgPDw9IDEpCiAJCTsKIAl2YWwgPSBzbmRfc29jX3JlYWQod2lkZ2V0LT5jb2RlYywgZS0+cmVnKTsKIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIChiaXRtYXNrIC0gMSk7CkBAIC0xMjc4LDE1ICsxMjc0LDE1IEBACiAJdW5zaWduZWQgc2hvcnQgbWFzaywgYml0bWFzazsKIAlpbnQgcmV0ID0gMDsKIAotCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXg7IGJpdG1hc2sgPDw9IDEpCiAJCTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1hc2sgLSAxKQorCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKIAl2YWwgPSBtdXggPDwgZS0+c2hpZnRfbDsKIAltYXNrID0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9sOwogCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXNrIC0gMSkKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CiAJCW1hc2sgfD0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9yOwpAQCAtMTI5NCw3ICsxMjkwLDcgQEAKIAogCW11dGV4X2xvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKIAl3aWRnZXQtPnZhbHVlID0gdmFsOwotCWRhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtYXNrLCBtdXgsIGUpOworCWRhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtYXNrLCBtdXgsIHZhbCwgZSk7CiAJaWYgKHdpZGdldC0+ZXZlbnQpIHsKIAkJaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUFJFX1JFRykgewogCQkJcmV0ID0gd2lkZ2V0LT5ldmVudCh3aWRnZXQsCkBAIC0xNDg3LDYgKzE0ODMsMjYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbik7CiAKIC8qKgorICogc25kX3NvY19kYXBtX25jX3BpbiAtIHBlcm1hbmVudGx5IGRpc2FibGUgcGluLgorICogQGNvZGVjOiBTb0MgY29kZWMKKyAqIEBwaW46IHBpbiBuYW1lCisgKgorICogTWFya3MgdGhlIHNwZWNpZmllZCBwaW4gYXMgYmVpbmcgbm90IGNvbm5lY3RlZCwgZGlzYWJsaW5nIGl0IGFsb25nCisgKiBhbnkgcGFyZW50IG9yIGNoaWxkIHdpZGdldHMuICBBdCBwcmVzZW50IHRoaXMgaXMgaWRlbnRpY2FsIHRvCisgKiBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oKSBidXQgaW4gZnV0dXJlIGl0IHdpbGwgYmUgZXh0ZW5kZWQgdG8gZG8KKyAqIGFkZGl0aW9uYWwgdGhpbmdzIHN1Y2ggYXMgZGlzYWJsaW5nIGNvbnRyb2xzIHdoaWNoIG9ubHkgYWZmZWN0CisgKiBwYXRocyB0aHJvdWdoIHRoZSBwaW4uCisgKgorICogTk9URTogc25kX3NvY19kYXBtX3N5bmMoKSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmb3IgREFQTSB0bworICogZG8gYW55IHdpZGdldCBwb3dlciBzd2l0Y2hpbmcuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fbmNfcGluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY2hhciAqcGluKQoreworCXJldHVybiBzbmRfc29jX2RhcG1fc2V0X3Bpbihjb2RlYywgcGluLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9uY19waW4pOworCisvKioKICAqIHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyAtIGdldCBhdWRpbyBwaW4gc3RhdHVzCiAgKiBAY29kZWM6IGF1ZGlvIGNvZGVjCiAgKiBAcGluOiBhdWRpbyBzaWduYWwgcGluIGVuZHBvaW50IChvciBzdGFydCBwb2ludCkKQEAgLTE1MjQsNiArMTU0MCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fZnJlZSk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tLCB3d3cud29sZnNvbm1pY3JvLmNvbSIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbHJnQHNsaW1sb2dpYy5jby51ayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEeW5hbWljIEF1ZGlvIFBvd2VyIE1hbmFnZW1lbnQgY29yZSBmb3IgQUxTQSBTb0MiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvdW5kX2NvcmUuYyBiL3NvdW5kL3NvdW5kX2NvcmUuYwppbmRleCAxYjA0MjU5Li5mYWVmODdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb3VuZF9jb3JlLmMKKysrIGIvc291bmQvc291bmRfY29yZS5jCkBAIC0xLDUgKzEsNjEgQEAKIC8qCi0gKglTb3VuZCBjb3JlIGhhbmRsaW5nLiBCcmVha3Mgb3V0IHNvdW5kIGZ1bmN0aW9ucyB0byBzdWJtb2R1bGVzCisgKglTb3VuZCBjb3JlLiAgVGhpcyBmaWxlIGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0cy4gIHNvdW5kX2NsYXNzCisgKgl3aGljaCBpcyBjb21tb24gdG8gYm90aCBPU1MgYW5kIEFMU0EgYW5kIE9TUyBzb3VuZCBjb3JlIHdoaWNoCisgKglpcyB1c2VkIE9TUyBvciBlbXVsYXRpb24gb2YgaXQuCisgKi8KKworLyoKKyAqIEZpcnN0LCB0aGUgY29tbW9uIHBhcnQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2lmZGVmIENPTkZJR19TT1VORF9PU1NfQ09SRQorc3RhdGljIGludCBfX2luaXQgaW5pdF9vc3Nfc291bmRjb3JlKHZvaWQpOworc3RhdGljIHZvaWQgY2xlYW51cF9vc3Nfc291bmRjb3JlKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfb3NzX3NvdW5kY29yZSh2b2lkKQl7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9vc3Nfc291bmRjb3JlKHZvaWQpCXsgfQorI2VuZGlmCisKK3N0cnVjdCBjbGFzcyAqc291bmRfY2xhc3M7CitFWFBPUlRfU1lNQk9MKHNvdW5kX2NsYXNzKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JlIHNvdW5kIG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zb3VuZGNvcmUodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGluaXRfb3NzX3NvdW5kY29yZSgpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc291bmRfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzb3VuZCIpOworCWlmIChJU19FUlIoc291bmRfY2xhc3MpKSB7CisJCWNsZWFudXBfb3NzX3NvdW5kY29yZSgpOworCQlyZXR1cm4gUFRSX0VSUihzb3VuZF9jbGFzcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3NvdW5kY29yZSh2b2lkKQoreworCWNsZWFudXBfb3NzX3NvdW5kY29yZSgpOworCWNsYXNzX2Rlc3Ryb3koc291bmRfY2xhc3MpOworfQorCittb2R1bGVfaW5pdChpbml0X3NvdW5kY29yZSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3NvdW5kY29yZSk7CisKKworI2lmZGVmIENPTkZJR19TT1VORF9PU1NfQ09SRQorLyoKKyAqCU9TUyBzb3VuZCBjb3JlIGhhbmRsaW5nLiBCcmVha3Mgb3V0IHNvdW5kIGZ1bmN0aW9ucyB0byBzdWJtb2R1bGVzCiAgKgkKICAqCUF1dGhvcjoJCUFsYW4gQ294IDxhbGFuLmNveEBsaW51eC5vcmc+CiAgKgpAQCAtMzQsMjEgKzkwLDE3IEBACiAgKglsb2NraW5nIGF0IHNvbWUgcG9pbnQgaW4gMi4zLnguCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc291bmQuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogI2RlZmluZSBTT1VORF9TVEVQIDE2CiAKLQogc3RydWN0IHNvdW5kX3VuaXQKIHsKIAlpbnQgdW5pdF9taW5vcjsKQEAgLTY0LDkgKzExNiw2IEBACiBleHRlcm4gaW50IG1zbmRfcGlubmFjbGVfaW5pdCh2b2lkKTsKICNlbmRpZgogCi1zdHJ1Y3QgY2xhc3MgKnNvdW5kX2NsYXNzOwotRVhQT1JUX1NZTUJPTChzb3VuZF9jbGFzcyk7Ci0KIC8qCiAgKglMb3cgbGV2ZWwgbGlzdCBvcGVyYXRvci4gU2NhbiB0aGUgb3JkZXJlZCBsaXN0LCBmaW5kIGEgaG9sZSBhbmQKICAqCWpvaW4gaW50byBpdC4gQ2FsbGVkIHdpdGggdGhlIGxvY2sgYXNzZXJ0ZWQKQEAgLTE3MSw5ICsyMjAsOCBAQAogCWVsc2UKIAkJc3ByaW50ZihzLT5uYW1lLCAic291bmQvJXMlZCIsIG5hbWUsIHIgLyBTT1VORF9TVEVQKTsKIAotCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShzb3VuZF9jbGFzcywgZGV2LAotCQkJICAgICAgTUtERVYoU09VTkRfTUFKT1IsIHMtPnVuaXRfbWlub3IpLAotCQkJICAgICAgTlVMTCwgcy0+bmFtZSs2KTsKKwlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBkZXYsIE1LREVWKFNPVU5EX01BSk9SLCBzLT51bml0X21pbm9yKSwKKwkJICAgICAgTlVMTCwgcy0+bmFtZSs2KTsKIAlyZXR1cm4gcjsKIAogIGZhaWw6CkBAIC01MjMsMzEgKzU3MSwyMyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUgc291bmQgbW9kdWxlIik7Ci1NT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoU09VTkRfTUFKT1IpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zb3VuZGNvcmUodm9pZCkKK3N0YXRpYyB2b2lkIGNsZWFudXBfb3NzX3NvdW5kY29yZSh2b2lkKQogewogCS8qIFdlIGhhdmUgbm90aGluZyB0byByZWFsbHkgZG8gaGVyZSAtIHdlIGtub3cgdGhlIGxpc3RzIG11c3QgYmUKIAkgICBlbXB0eSAqLwogCXVucmVnaXN0ZXJfY2hyZGV2KFNPVU5EX01BSk9SLCAic291bmQiKTsKLQljbGFzc19kZXN0cm95KHNvdW5kX2NsYXNzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9zb3VuZGNvcmUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3NzX3NvdW5kY29yZSh2b2lkKQogewogCWlmIChyZWdpc3Rlcl9jaHJkZXYoU09VTkRfTUFKT1IsICJzb3VuZCIsICZzb3VuZGNvcmVfZm9wcyk9PS0xKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic291bmRjb3JlOiBzb3VuZCBkZXZpY2UgYWxyZWFkeSBpbiB1c2UuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jc291bmRfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzb3VuZCIpOwotCWlmIChJU19FUlIoc291bmRfY2xhc3MpKQotCQlyZXR1cm4gUFRSX0VSUihzb3VuZF9jbGFzcyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotbW9kdWxlX2luaXQoaW5pdF9zb3VuZGNvcmUpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9zb3VuZGNvcmUpOworI2VuZGlmIC8qIENPTkZJR19TT1VORF9PU1NfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IDBjNjNlMDUuLmY4NzkzM2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogRHJpdmVyIGZvciBBTUQ3OTMwIHNvdW5kIGNoaXBzIGZvdW5kIG9uIFNwYXJjcy4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDggRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgogICoKICAqIEJhc2VkIGVudGlyZWx5IHVwb24gZHJpdmVycy9zYnVzL2F1ZGlvL2FtZDc5MzAuYyB3aGljaCBpczoKICAqIENvcHlyaWdodCAoQykgMTk5NiwxOTk3IFRob21hcyBLLiBEeWFzICh0ZHlhc0BlZGVuLnJ1dGdlcnMuZWR1KQpAQCAtMzUsNiArMzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC00NCw3ICs0Niw2IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLwpAQCAtMzM1LDggKzMzNiw4IEBACiAJaW50CQkJcGdhaW47CiAJaW50CQkJbWdhaW47CiAKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCSpvcDsKIAl1bnNpZ25lZCBpbnQJCWlycTsKLQl1bnNpZ25lZCBpbnQJCXJlZ3Nfc2l6ZTsKIAlzdHJ1Y3Qgc25kX2FtZDc5MzAJKm5leHQ7CiB9OwogCkBAIC03NjUsNyArNzY2LDYgQEAKIAkJCSAgICAgICAvKiBwbGF5YmFjayBjb3VudCAqLyAxLAogCQkJICAgICAgIC8qIGNhcHR1cmUgY291bnQgKi8gIDEsICZwY20pKSA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2Fzc2VydChwY20gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9hbWQ3OTMwX3BsYXliYWNrX29wcyk7CiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2FtZDc5MzBfY2FwdHVyZV9vcHMpOwpAQCAtNzg4LDEzICs3ODgsNiBAQAogCiBzdGF0aWMgaW50IHNuZF9hbWQ3OTMwX2luZm9fdm9sdW1lKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0JaW50IHR5cGUgPSBrY3RsLT5wcml2YXRlX3ZhbHVlOwotCi0Jc25kX2Fzc2VydCh0eXBlID09IFZPTFVNRV9NT05JVE9SIHx8Ci0JCSAgIHR5cGUgPT0gVk9MVU1FX0NBUFRVUkUgfHwKLQkJICAgdHlwZSA9PSBWT0xVTUVfUExBWUJBQ0ssIHJldHVybiAtRUlOVkFMKTsKLQkodm9pZCkgdHlwZTsKLQogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCXVpbmZvLT5jb3VudCA9IDE7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKQEAgLTgwOSwxMCArODAyLDYgQEAKIAlpbnQgdHlwZSA9IGtjdGwtPnByaXZhdGVfdmFsdWU7CiAJaW50ICpzd3ZhbDsKIAotCXNuZF9hc3NlcnQodHlwZSA9PSBWT0xVTUVfTU9OSVRPUiB8fAotCQkgICB0eXBlID09IFZPTFVNRV9DQVBUVVJFIHx8Ci0JCSAgIHR5cGUgPT0gVk9MVU1FX1BMQVlCQUNLLCByZXR1cm4gLUVJTlZBTCk7Ci0KIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFZPTFVNRV9NT05JVE9SOgogCQlzd3ZhbCA9ICZhbWQtPm1nYWluOwpAQCAtODM4LDEwICs4MjcsNiBAQAogCWludCB0eXBlID0ga2N0bC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgKnN3dmFsLCBjaGFuZ2U7CiAKLQlzbmRfYXNzZXJ0KHR5cGUgPT0gVk9MVU1FX01PTklUT1IgfHwKLQkJICAgdHlwZSA9PSBWT0xVTUVfQ0FQVFVSRSB8fAotCQkgICB0eXBlID09IFZPTFVNRV9QTEFZQkFDSywgcmV0dXJuIC1FSU5WQUwpOwotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBWT0xVTUVfTU9OSVRPUjoKIAkJc3d2YWwgPSAmYW1kLT5tZ2FpbjsKQEAgLTkwNCw3ICs4ODksOCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgaWR4LCBlcnI7CiAKLQlzbmRfYXNzZXJ0KGFtZCAhPSBOVUxMICYmIGFtZC0+Y2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWFtZCB8fCAhYW1kLT5jYXJkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAljYXJkID0gYW1kLT5jYXJkOwogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIGNhcmQtPnNob3J0bmFtZSk7CkBAIC05MjAsMTMgKzkwNiwxNiBAQAogCiBzdGF0aWMgaW50IHNuZF9hbWQ3OTMwX2ZyZWUoc3RydWN0IHNuZF9hbWQ3OTMwICphbWQpCiB7CisJc3RydWN0IG9mX2RldmljZSAqb3AgPSBhbWQtPm9wOworCiAJYW1kNzkzMF9pZGxlKGFtZCk7CiAKIAlpZiAoYW1kLT5pcnEpCiAJCWZyZWVfaXJxKGFtZC0+aXJxLCBhbWQpOwogCiAJaWYgKGFtZC0+cmVncykKLQkJc2J1c19pb3VubWFwKGFtZC0+cmVncywgYW1kLT5yZWdzX3NpemUpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGFtZC0+cmVncywKKwkJCSAgIHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSkpOwogCiAJa2ZyZWUoYW1kKTsKIApAQCAtOTQ1LDEzICs5MzQsMTIgQEAKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hbWQ3OTMwX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkJCXN0cnVjdCByZXNvdXJjZSAqcnAsCi0JCQkJCXVuc2lnbmVkIGludCByZWdfc2l6ZSwKKwkJCQkJc3RydWN0IG9mX2RldmljZSAqb3AsCiAJCQkJCWludCBpcnEsIGludCBkZXYsCiAJCQkJCXN0cnVjdCBzbmRfYW1kNzkzMCAqKnJhbWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc25kX2FtZDc5MzAgKmFtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAKIAkqcmFtZCA9IE5VTEw7CkBAIC05NjEsOSArOTQ5LDEwIEBACiAKIAlzcGluX2xvY2tfaW5pdCgmYW1kLT5sb2NrKTsKIAlhbWQtPmNhcmQgPSBjYXJkOwotCWFtZC0+cmVnc19zaXplID0gcmVnX3NpemU7CisJYW1kLT5vcCA9IG9wOwogCi0JYW1kLT5yZWdzID0gc2J1c19pb3JlbWFwKHJwLCAwLCBhbWQtPnJlZ3Nfc2l6ZSwgImFtZDc5MzAiKTsKKwlhbWQtPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKSwgImFtZDc5MzAiKTsKIAlpZiAoIWFtZC0+cmVncykgewogCQlzbmRfcHJpbnRrKCJhbWQ3OTMwLSVkOiBVbmFibGUgdG8gbWFwIGNoaXAgcmVnaXN0ZXJzLlxuIiwgZGV2KTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMDEyLDEyICsxMDAxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc5MzBfYXR0YWNoX2NvbW1vbihzdHJ1Y3QgcmVzb3VyY2UgKnJwLCBpbnQgaXJxKQorc3RhdGljIGludCBfX2RldmluaXQgYW1kNzkzMF9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJm9wLT5yZXNvdXJjZVswXTsKIAlzdGF0aWMgaW50IGRldl9udW07CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfYW1kNzkzMCAqYW1kOwotCWludCBlcnI7CisJaW50IGVyciwgaXJxOworCisJaXJxID0gb3AtPmlycXNbMF07CiAKIAlpZiAoZGV2X251bSA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMDM4LDggKzEwMzAsNyBAQAogCQkodW5zaWduZWQgbG9uZyBsb25nKXJwLT5zdGFydCwKIAkJaXJxKTsKIAotCWlmICgoZXJyID0gc25kX2FtZDc5MzBfY3JlYXRlKGNhcmQsIHJwLAotCQkJCSAgICAgIChycC0+ZW5kIC0gcnAtPnN0YXJ0KSArIDEsCisJaWYgKChlcnIgPSBzbmRfYW1kNzkzMF9jcmVhdGUoY2FyZCwgb3AsCiAJCQkJICAgICAgaXJxLCBkZXZfbnVtLCAmYW1kKSkgPCAwKQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTEwNjQsNDMgKzEwNTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc5MzBfb2Jpb19hdHRhY2goc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7Ci0JY29uc3Qgc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzLCAqcnA7Ci0JaW50IGxlbjsKLQotCWlycXAgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRyIiwgJmxlbik7Ci0JaWYgKCFpcnFwKSB7Ci0JCXNuZF9wcmludGsoIiVzOiBGaXJtd2FyZSBub2RlIGxhY2tzIElSUSBwcm9wZXJ0eS5cbiIsCi0JCQkgICBkcC0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOwotCWlmICghcmVncykgewotCQlzbmRfcHJpbnRrKCIlczogRmlybXdhcmUgbm9kZSBsYWNrcyByZWdpc3RlciBwcm9wZXJ0eS5cbiIsCi0JCQkgICBkcC0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcnAgPSAmcmVzOwotCXJwLT5zdGFydCA9IHJlZ3MtPnBoeXNfYWRkcjsKLQlycC0+ZW5kID0gcnAtPnN0YXJ0ICsgcmVncy0+cmVnX3NpemUgLSAxOwotCXJwLT5mbGFncyA9IElPUkVTT1VSQ0VfSU8gfCAocmVncy0+d2hpY2hfaW8gJiAweGZmKTsKLQotCXJldHVybiBhbWQ3OTMwX2F0dGFjaF9jb21tb24ocnAsIGlycXAtPnByaSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc5MzBfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQotewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7Ci0KLQlyZXR1cm4gYW1kNzkzMF9hdHRhY2hfY29tbW9uKCZzZGV2LT5yZXNvdXJjZVswXSwgc2Rldi0+aXJxc1swXSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFtZDc5MzBfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFtZDc5MzBfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lID0gImF1ZGlvIiwKIAl9LApAQCAtMTExNSwyMCArMTA3MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFtZDc5MzBfaW5pdCh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0KLQkvKiBUcnkgdG8gZmluZCB0aGUgc3VuNGMgImF1ZGlvIiBub2RlIGZpcnN0LiAqLwotCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKLQlkcCA9IGRwLT5jaGlsZDsKLQl3aGlsZSAoZHApIHsKLQkJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJhdWRpbyIpKQotCQkJYW1kNzkzMF9vYmlvX2F0dGFjaChkcCk7Ci0KLQkJZHAgPSBkcC0+c2libGluZzsKLQl9Ci0KLQkvKiBQcm9iZSBlYWNoIFNCVVMgZm9yIGFtZDc5MzAgY2hpcHMuICovCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmYW1kNzkzMF9zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmFtZDc5MzBfc2J1c19kcml2ZXIsICZvZl9idXNfdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbWQ3OTMwX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKaW5kZXggMWM0Nzk3Yi4uZDQ0YmY5OCAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvY3M0MjMxLmMKKysrIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogRHJpdmVyIGZvciBDUzQyMzEgc291bmQgY2hpcHMgZm91bmQgb24gU3BhcmNzLgotICogQ29weXJpZ2h0IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwOCBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKgogICogQmFzZWQgZW50aXJlbHkgdXBvbiBkcml2ZXJzL3NidXMvYXVkaW8vY3M0MjMxLmMgd2hpY2ggaXM6CiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRGVycmljayBKIEJyYXNoZWFyIChzaGFkb3dAYW5kcmV3LmNtdS5lZHUpCkBAIC0xNyw3ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KQEAgLTI5LDEzICszMCwxMiBAQAogCiAjaWZkZWYgQ09ORklHX1NCVVMKICNkZWZpbmUgU0JVU19TVVBQT1JUCi0jaW5jbHVkZSA8YXNtL3NidXMuaD4KICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR19TUEFSQzY0KQogI2RlZmluZSBFQlVTX1NVUFBPUlQKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vZWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9lYnVzX2RtYS5oPgogI2VuZGlmCiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCkBAIC03MCw4ICs3MCw2IEBACiAJaW50CQkoKnJlcXVlc3QpKHN0cnVjdCBjczQyMzFfZG1hX2NvbnRyb2wgKmRtYV9jb250LAogCQkJCSAgIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBsZW4pOwogCXVuc2lnbmVkIGludAkoKmFkZHJlc3MpKHN0cnVjdCBjczQyMzFfZG1hX2NvbnRyb2wgKmRtYV9jb250KTsKLQl2b2lkCQkoKnByZWFsbG9jYXRlKShzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9wY20gKnBjbSk7CiAjaWZkZWYgRUJVU19TVVBQT1JUCiAJc3RydWN0CQllYnVzX2RtYV9pbmZvCWVidXNfaW5mbzsKICNlbmRpZgpAQCAtMTE0LDIxICsxMTIsMTIgQEAKIAlzdHJ1Y3QgbXV0ZXgJCW1jZV9tdXRleDsJLyogbXV0ZXggZm9yIG1jZSByZWdpc3RlciAqLwogCXN0cnVjdCBtdXRleAkJb3Blbl9tdXRleDsJLyogbXV0ZXggZm9yIEFMU0Egb3Blbi9jbG9zZSAqLwogCi0JdW5pb24gewotI2lmZGVmIFNCVVNfU1VQUE9SVAotCQlzdHJ1Y3Qgc2J1c19kZXYJCSpzZGV2OwotI2VuZGlmCi0jaWZkZWYgRUJVU19TVVBQT1JUCi0JCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKLSNlbmRpZgotCX0gZGV2X3U7CisJc3RydWN0IG9mX2RldmljZQkqb3A7CiAJdW5zaWduZWQgaW50CQlpcnFbMl07CiAJdW5zaWduZWQgaW50CQlyZWdzX3NpemU7CiAJc3RydWN0IHNuZF9jczQyMzEJKm5leHQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9jczQyMzEgKmNzNDIzMV9saXN0OwotCiAvKiBFdmVudHVhbGx5IHdlIGNhbiB1c2Ugc291bmQvaXNhL2NzNDIzeC9jczQyMzFfbGliLmMgZGlyZWN0bHksIGJ1dCBmb3IKICAqIG5vdy4uLi4gIC1EYXZlTQogICovCkBAIC0yNjcsMjcgKzI1NiwxOSBAQAogCiBzdGF0aWMgdTggX19jczQyMzFfcmVhZGIoc3RydWN0IHNuZF9jczQyMzEgKmNwLCB2b2lkIF9faW9tZW0gKnJlZ19hZGRyKQogewotI2lmZGVmIEVCVVNfU1VQUE9SVAogCWlmIChjcC0+ZmxhZ3MgJiBDUzQyMzFfRkxBR19FQlVTKQogCQlyZXR1cm4gcmVhZGIocmVnX2FkZHIpOwogCWVsc2UKLSNlbmRpZgotI2lmZGVmIFNCVVNfU1VQUE9SVAogCQlyZXR1cm4gc2J1c19yZWFkYihyZWdfYWRkcik7Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19jczQyMzFfd3JpdGViKHN0cnVjdCBzbmRfY3M0MjMxICpjcCwgdTggdmFsLAogCQkJICAgIHZvaWQgX19pb21lbSAqcmVnX2FkZHIpCiB7Ci0jaWZkZWYgRUJVU19TVVBQT1JUCiAJaWYgKGNwLT5mbGFncyAmIENTNDIzMV9GTEFHX0VCVVMpCiAJCXJldHVybiB3cml0ZWIodmFsLCByZWdfYWRkcik7CiAJZWxzZQotI2VuZGlmCi0jaWZkZWYgU0JVU19TVVBQT1JUCiAJCXJldHVybiBzYnVzX3dyaXRlYih2YWwsIHJlZ19hZGRyKTsKLSNlbmRpZgogfQogCiAvKgpAQCAtMTI1OCw3ICsxMjM5LDkgQEAKIAlwY20tPmluZm9fZmxhZ3MgPSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CiAJc3RyY3B5KHBjbS0+bmFtZSwgIkNTNDIzMSIpOwogCi0JY2hpcC0+cF9kbWEucHJlYWxsb2NhdGUoY2hpcCwgcGNtKTsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgICAgICAmY2hpcC0+b3AtPmRldiwKKwkJCQkJICAgICAgNjQgKiAxMDI0LCAxMjggKiAxMDI0KTsKIAogCWNoaXAtPnBjbSA9IHBjbTsKIApAQCAtMTU2MCw3ICsxNTQzLDggQEAKIAlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyLCBpZHg7CiAKLQlzbmRfYXNzZXJ0KGNoaXAgIT0gTlVMTCAmJiBjaGlwLT5wY20gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjaGlwIHx8ICFjaGlwLT5wY20pKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN0cmNweShjYXJkLT5taXhlcm5hbWUsIGNoaXAtPnBjbS0+bmFtZSk7CiAKQEAgLTE2MjYsOCArMTYxMCw3IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2VycjsKIAotCWNoaXAtPm5leHQgPSBjczQyMzFfbGlzdDsKLQljczQyMzFfbGlzdCA9IGNoaXA7CisJZGV2X3NldF9kcnZkYXRhKCZjaGlwLT5vcC0+ZGV2LCBjaGlwKTsKIAogCWRldisrOwogCXJldHVybiAwOwpAQCAtMTc4MiwyNCArMTc2NSwxOSBAQAogCXJldHVybiBzYnVzX3JlYWRsKGJhc2UtPnJlZ3MgKyBiYXNlLT5kaXIgKyBBUENWQSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNidXNfZG1hX3ByZWFsbG9jYXRlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQotewotCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9TQlVTLAotCQkJCQlzbmRfZG1hX3NidXNfZGF0YShjaGlwLT5kZXZfdS5zZGV2KSwKLQkJCQkJNjQgKiAxMDI0LCAxMjggKiAxMDI0KTsKLX0KLQogLyoKICAqIEluaXQgYW5kIGV4aXQgcm91dGluZXMKICAqLwogCiBzdGF0aWMgaW50IHNuZF9jczQyMzFfc2J1c19mcmVlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQogeworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gY2hpcC0+b3A7CisKIAlpZiAoY2hpcC0+aXJxWzBdKQogCQlmcmVlX2lycShjaGlwLT5pcnFbMF0sIGNoaXApOwogCiAJaWYgKGNoaXAtPnBvcnQpCi0JCXNidXNfaW91bm1hcChjaGlwLT5wb3J0LCBjaGlwLT5yZWdzX3NpemUpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGNoaXAtPnBvcnQsIGNoaXAtPnJlZ3Nfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MTYsNyArMTc5NCw3IEBACiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzbmRfY3M0MjMxX3NidXNfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQkJCQkJIHN0cnVjdCBzYnVzX2RldiAqc2RldiwKKwkJCQkJIHN0cnVjdCBvZl9kZXZpY2UgKm9wLAogCQkJCQkgaW50IGRldikKIHsKIAlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKQEAgLTE4MjcsMTMgKzE4MDUsMTMgQEAKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cF9kbWEuc2J1c19pbmZvLmxvY2spOwogCW11dGV4X2luaXQoJmNoaXAtPm1jZV9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmY2hpcC0+b3Blbl9tdXRleCk7Ci0JY2hpcC0+ZGV2X3Uuc2RldiA9IHNkZXY7Ci0JY2hpcC0+cmVnc19zaXplID0gc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplOworCWNoaXAtPm9wID0gb3A7CisJY2hpcC0+cmVnc19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmb3AtPnJlc291cmNlWzBdKTsKIAltZW1jcHkoJmNoaXAtPmltYWdlLCAmc25kX2NzNDIzMV9vcmlnaW5hbF9pbWFnZSwKIAkgICAgICAgc2l6ZW9mKHNuZF9jczQyMzFfb3JpZ2luYWxfaW1hZ2UpKTsKIAotCWNoaXAtPnBvcnQgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJCSAgY2hpcC0+cmVnc19zaXplLCAiY3M0MjMxIik7CisJY2hpcC0+cG9ydCA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQljaGlwLT5yZWdzX3NpemUsICJjczQyMzEiKTsKIAlpZiAoIWNoaXAtPnBvcnQpIHsKIAkJc25kX3ByaW50ZGQoImNzNDIzMS0lZDogVW5hYmxlIHRvIG1hcCBjaGlwIHJlZ2lzdGVycy5cbiIsIGRldik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTg0OCwyMiArMTgyNiwyMCBAQAogCWNoaXAtPnBfZG1hLmVuYWJsZSA9IHNidXNfZG1hX2VuYWJsZTsKIAljaGlwLT5wX2RtYS5yZXF1ZXN0ID0gc2J1c19kbWFfcmVxdWVzdDsKIAljaGlwLT5wX2RtYS5hZGRyZXNzID0gc2J1c19kbWFfYWRkcjsKLQljaGlwLT5wX2RtYS5wcmVhbGxvY2F0ZSA9IHNidXNfZG1hX3ByZWFsbG9jYXRlOwogCiAJY2hpcC0+Y19kbWEucHJlcGFyZSA9IHNidXNfZG1hX3ByZXBhcmU7CiAJY2hpcC0+Y19kbWEuZW5hYmxlID0gc2J1c19kbWFfZW5hYmxlOwogCWNoaXAtPmNfZG1hLnJlcXVlc3QgPSBzYnVzX2RtYV9yZXF1ZXN0OwogCWNoaXAtPmNfZG1hLmFkZHJlc3MgPSBzYnVzX2RtYV9hZGRyOwotCWNoaXAtPmNfZG1hLnByZWFsbG9jYXRlID0gc2J1c19kbWFfcHJlYWxsb2NhdGU7CiAKLQlpZiAocmVxdWVzdF9pcnEoc2Rldi0+aXJxc1swXSwgc25kX2NzNDIzMV9zYnVzX2ludGVycnVwdCwKKwlpZiAocmVxdWVzdF9pcnEob3AtPmlycXNbMF0sIHNuZF9jczQyMzFfc2J1c19pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgImNzNDIzMSIsIGNoaXApKSB7CiAJCXNuZF9wcmludGRkKCJjczQyMzEtJWQ6IFVuYWJsZSB0byBncmFiIFNCVVMgSVJRICVkXG4iLAotCQkJICAgIGRldiwgc2Rldi0+aXJxc1swXSk7CisJCQkgICAgZGV2LCBvcC0+aXJxc1swXSk7CiAJCXNuZF9jczQyMzFfc2J1c19mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KLQljaGlwLT5pcnFbMF0gPSBzZGV2LT5pcnFzWzBdOworCWNoaXAtPmlycVswXSA9IG9wLT5pcnFzWzBdOwogCiAJaWYgKHNuZF9jczQyMzFfcHJvYmUoY2hpcCkgPCAwKSB7CiAJCXNuZF9jczQyMzFfc2J1c19mcmVlKGNoaXApOwpAQCAtMTg4MCw5ICsxODU2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY3M0MjMxX3NidXNfYXR0YWNoKHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNDIzMV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJnNkZXYtPnJlc291cmNlWzBdOworCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmb3AtPnJlc291cmNlWzBdOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyOwogCkBAIC0xODk0LDkgKzE4NzAsOSBAQAogCQljYXJkLT5zaG9ydG5hbWUsCiAJCXJwLT5mbGFncyAmIDB4ZmZMLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXJwLT5zdGFydCwKLQkJc2Rldi0+aXJxc1swXSk7CisJCW9wLT5pcnFzWzBdKTsKIAotCWVyciA9IHNuZF9jczQyMzFfc2J1c19jcmVhdGUoY2FyZCwgc2RldiwgZGV2KTsKKwllcnIgPSBzbmRfY3M0MjMxX3NidXNfY3JlYXRlKGNhcmQsIG9wLCBkZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CkBAIC0xOTQ5LDMwICsxOTI1LDI1IEBACiAJcmV0dXJuIGVidXNfZG1hX2FkZHIoJmRtYV9jb250LT5lYnVzX2luZm8pOwogfQogCi1zdGF0aWMgdm9pZCBfZWJ1c19kbWFfcHJlYWxsb2NhdGUoc3RydWN0IHNuZF9jczQyMzEgKmNoaXAsIHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNoaXAtPmRldl91LnBkZXYpLAotCQkJCSAgICAgIDY0KjEwMjQsIDEyOCoxMDI0KTsKLX0KLQogLyoKICAqIEluaXQgYW5kIGV4aXQgcm91dGluZXMKICAqLwogCiBzdGF0aWMgaW50IHNuZF9jczQyMzFfZWJ1c19mcmVlKHN0cnVjdCBzbmRfY3M0MjMxICpjaGlwKQogeworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gY2hpcC0+b3A7CisKIAlpZiAoY2hpcC0+Y19kbWEuZWJ1c19pbmZvLnJlZ3MpIHsKIAkJZWJ1c19kbWFfdW5yZWdpc3RlcigmY2hpcC0+Y19kbWEuZWJ1c19pbmZvKTsKLQkJaW91bm1hcChjaGlwLT5jX2RtYS5lYnVzX2luZm8ucmVncyk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwgY2hpcC0+Y19kbWEuZWJ1c19pbmZvLnJlZ3MsIDB4MTApOwogCX0KIAlpZiAoY2hpcC0+cF9kbWEuZWJ1c19pbmZvLnJlZ3MpIHsKIAkJZWJ1c19kbWFfdW5yZWdpc3RlcigmY2hpcC0+cF9kbWEuZWJ1c19pbmZvKTsKLQkJaW91bm1hcChjaGlwLT5wX2RtYS5lYnVzX2luZm8ucmVncyk7CisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwgY2hpcC0+cF9kbWEuZWJ1c19pbmZvLnJlZ3MsIDB4MTApOwogCX0KIAogCWlmIChjaGlwLT5wb3J0KQotCQlpb3VubWFwKGNoaXAtPnBvcnQpOworCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGNoaXAtPnBvcnQsIDB4MTApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTg5LDcgKzE5NjAsNyBAQAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc25kX2NzNDIzMV9lYnVzX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkJCSBzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYsCisJCQkJCSBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKIAkJCQkJIGludCBkZXYpCiB7CiAJc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CkBAIC0yMDAxLDM1ICsxOTcyLDM1IEBACiAJbXV0ZXhfaW5pdCgmY2hpcC0+bWNlX211dGV4KTsKIAltdXRleF9pbml0KCZjaGlwLT5vcGVuX211dGV4KTsKIAljaGlwLT5mbGFncyB8PSBDUzQyMzFfRkxBR19FQlVTOwotCWNoaXAtPmRldl91LnBkZXYgPSBlZGV2LT5idXMtPnNlbGY7CisJY2hpcC0+b3AgPSBvcDsKIAltZW1jcHkoJmNoaXAtPmltYWdlLCAmc25kX2NzNDIzMV9vcmlnaW5hbF9pbWFnZSwKIAkgICAgICAgc2l6ZW9mKHNuZF9jczQyMzFfb3JpZ2luYWxfaW1hZ2UpKTsKIAlzdHJjcHkoY2hpcC0+Y19kbWEuZWJ1c19pbmZvLm5hbWUsICJjczQyMzEoY2FwdHVyZSkiKTsKIAljaGlwLT5jX2RtYS5lYnVzX2luZm8uZmxhZ3MgPSBFQlVTX0RNQV9GTEFHX1VTRV9FQkRNQV9IQU5ETEVSOwogCWNoaXAtPmNfZG1hLmVidXNfaW5mby5jYWxsYmFjayA9IHNuZF9jczQyMzFfZWJ1c19jYXB0dXJlX2NhbGxiYWNrOwogCWNoaXAtPmNfZG1hLmVidXNfaW5mby5jbGllbnRfY29va2llID0gY2hpcDsKLQljaGlwLT5jX2RtYS5lYnVzX2luZm8uaXJxID0gZWRldi0+aXJxc1swXTsKKwljaGlwLT5jX2RtYS5lYnVzX2luZm8uaXJxID0gb3AtPmlycXNbMF07CiAJc3RyY3B5KGNoaXAtPnBfZG1hLmVidXNfaW5mby5uYW1lLCAiY3M0MjMxKHBsYXkpIik7CiAJY2hpcC0+cF9kbWEuZWJ1c19pbmZvLmZsYWdzID0gRUJVU19ETUFfRkxBR19VU0VfRUJETUFfSEFORExFUjsKIAljaGlwLT5wX2RtYS5lYnVzX2luZm8uY2FsbGJhY2sgPSBzbmRfY3M0MjMxX2VidXNfcGxheV9jYWxsYmFjazsKIAljaGlwLT5wX2RtYS5lYnVzX2luZm8uY2xpZW50X2Nvb2tpZSA9IGNoaXA7Ci0JY2hpcC0+cF9kbWEuZWJ1c19pbmZvLmlycSA9IGVkZXYtPmlycXNbMV07CisJY2hpcC0+cF9kbWEuZWJ1c19pbmZvLmlycSA9IG9wLT5pcnFzWzFdOwogCiAJY2hpcC0+cF9kbWEucHJlcGFyZSA9IF9lYnVzX2RtYV9wcmVwYXJlOwogCWNoaXAtPnBfZG1hLmVuYWJsZSA9IF9lYnVzX2RtYV9lbmFibGU7CiAJY2hpcC0+cF9kbWEucmVxdWVzdCA9IF9lYnVzX2RtYV9yZXF1ZXN0OwogCWNoaXAtPnBfZG1hLmFkZHJlc3MgPSBfZWJ1c19kbWFfYWRkcjsKLQljaGlwLT5wX2RtYS5wcmVhbGxvY2F0ZSA9IF9lYnVzX2RtYV9wcmVhbGxvY2F0ZTsKIAogCWNoaXAtPmNfZG1hLnByZXBhcmUgPSBfZWJ1c19kbWFfcHJlcGFyZTsKIAljaGlwLT5jX2RtYS5lbmFibGUgPSBfZWJ1c19kbWFfZW5hYmxlOwogCWNoaXAtPmNfZG1hLnJlcXVlc3QgPSBfZWJ1c19kbWFfcmVxdWVzdDsKIAljaGlwLT5jX2RtYS5hZGRyZXNzID0gX2VidXNfZG1hX2FkZHI7Ci0JY2hpcC0+Y19kbWEucHJlYWxsb2NhdGUgPSBfZWJ1c19kbWFfcHJlYWxsb2NhdGU7CiAKLQljaGlwLT5wb3J0ID0gaW9yZW1hcChlZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgMHgxMCk7Ci0JY2hpcC0+cF9kbWEuZWJ1c19pbmZvLnJlZ3MgPSBpb3JlbWFwKGVkZXYtPnJlc291cmNlWzFdLnN0YXJ0LCAweDEwKTsKLQljaGlwLT5jX2RtYS5lYnVzX2luZm8ucmVncyA9IGlvcmVtYXAoZWRldi0+cmVzb3VyY2VbMl0uc3RhcnQsIDB4MTApOworCWNoaXAtPnBvcnQgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIDB4MTAsICJjczQyMzEiKTsKKwljaGlwLT5wX2RtYS5lYnVzX2luZm8ucmVncyA9CisJCW9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsxXSwgMCwgMHgxMCwgImNzNDIzMV9wZG1hIik7CisJY2hpcC0+Y19kbWEuZWJ1c19pbmZvLnJlZ3MgPQorCQlvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMl0sIDAsIDB4MTAsICJjczQyMzFfY2RtYSIpOwogCWlmICghY2hpcC0+cG9ydCB8fCAhY2hpcC0+cF9kbWEuZWJ1c19pbmZvLnJlZ3MgfHwKIAkgICAgIWNoaXAtPmNfZG1hLmVidXNfaW5mby5yZWdzKSB7CiAJCXNuZF9jczQyMzFfZWJ1c19mcmVlKGNoaXApOwpAQCAtMjA3Nyw3ICsyMDQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY3M0MjMxX2VidXNfYXR0YWNoKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNDIzMV9lYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKQEAgLTIwODgsMTAgKzIwNTksMTAgQEAKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkIiwKIAkJY2FyZC0+c2hvcnRuYW1lLAotCQllZGV2LT5yZXNvdXJjZVswXS5zdGFydCwKLQkJZWRldi0+aXJxc1swXSk7CisJCW9wLT5yZXNvdXJjZVswXS5zdGFydCwKKwkJb3AtPmlycXNbMF0pOwogCi0JZXJyID0gc25kX2NzNDIzMV9lYnVzX2NyZWF0ZShjYXJkLCBlZGV2LCBkZXYpOworCWVyciA9IHNuZF9jczQyMzFfZWJ1c19jcmVhdGUoY2FyZCwgb3AsIGRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKQEAgLTIxMDEsNjggKzIwNzIsNTcgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjczQyMzFfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworI2lmZGVmIEVCVVNfU1VQUE9SVAorCWlmICghc3RyY21wKG9wLT5ub2RlLT5wYXJlbnQtPm5hbWUsICJlYnVzIikpCisJCXJldHVybiBjczQyMzFfZWJ1c19wcm9iZShvcCwgbWF0Y2gpOworI2VuZGlmCisjaWZkZWYgU0JVU19TVVBQT1JUCisJaWYgKCFzdHJjbXAob3AtPm5vZGUtPnBhcmVudC0+bmFtZSwgInNidXMiKSB8fAorCSAgICAhc3RyY21wKG9wLT5ub2RlLT5wYXJlbnQtPm5hbWUsICJzYmkiKSkKKwkJcmV0dXJuIGNzNDIzMV9zYnVzX3Byb2JlKG9wLCBtYXRjaCk7CisjZW5kaWYKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY3M0MjMxX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisKKwlzbmRfY2FyZF9mcmVlKGNoaXAtPmNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNzNDIzMV9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiU1VOVyxDUzQyMzEiLAorCX0sCisJeworCQkubmFtZSA9ICJhdWRpbyIsCisJCS5jb21wYXRpYmxlID0gIlNVTlcsQ1M0MjMxIiwKKwl9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY3M0MjMxX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgY3M0MjMxX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYXVkaW8iLAorCS5tYXRjaF90YWJsZQk9IGNzNDIzMV9tYXRjaCwKKwkucHJvYmUJCT0gY3M0MjMxX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3M0MjMxX3JlbW92ZSksCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBjczQyMzFfaW5pdCh2b2lkKQogewotI2lmZGVmIFNCVVNfU1VQUE9SVAotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7Ci0jZW5kaWYKLSNpZmRlZiBFQlVTX1NVUFBPUlQKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXY7Ci0jZW5kaWYKLQlpbnQgZm91bmQ7Ci0KLQlmb3VuZCA9IDA7Ci0KLSNpZmRlZiBTQlVTX1NVUFBPUlQKLQlmb3JfYWxsX3NidXNkZXYoc2Rldiwgc2J1cykgewotCQlpZiAoIXN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJTVU5XLENTNDIzMSIpKSB7Ci0JCQlpZiAoY3M0MjMxX3NidXNfYXR0YWNoKHNkZXYpID09IDApCi0JCQkJZm91bmQrKzsKLQkJfQotCX0KLSNlbmRpZgotI2lmZGVmIEVCVVNfU1VQUE9SVAotCWZvcl9lYWNoX2VidXMoZWJ1cykgewotCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKLQkJCWludCBtYXRjaCA9IDA7Ci0KLQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgIlNVTlcsQ1M0MjMxIikpIHsKLQkJCQltYXRjaCA9IDE7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiYXVkaW8iKSkgewotCQkJCWNvbnN0IGNoYXIgKmNvbXBhdDsKLQotCQkJCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCi0JCQkJCQkJICJjb21wYXRpYmxlIiwgTlVMTCk7Ci0JCQkJaWYgKGNvbXBhdCAmJiAhc3RyY21wKGNvbXBhdCwgIlNVTlcsQ1M0MjMxIikpCi0JCQkJCW1hdGNoID0gMTsKLQkJCX0KLQotCQkJaWYgKG1hdGNoICYmCi0JCQkgICAgY3M0MjMxX2VidXNfYXR0YWNoKGVkZXYpID09IDApCi0JCQkJZm91bmQrKzsKLQkJfQotCX0KLSNlbmRpZgotCi0KLQlyZXR1cm4gKGZvdW5kID4gMCkgPyAwIDogLUVJTzsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZjczQyMzFfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3M0MjMxX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqcCA9IGNzNDIzMV9saXN0OwotCi0Jd2hpbGUgKHAgIT0gTlVMTCkgewotCQlzdHJ1Y3Qgc25kX2NzNDIzMSAqbmV4dCA9IHAtPm5leHQ7Ci0KLQkJc25kX2NhcmRfZnJlZShwLT5jYXJkKTsKLQotCQlwID0gbmV4dDsKLQl9Ci0KLQljczQyMzFfbGlzdCA9IE5VTEw7CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzMV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChjczQyMzFfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9kYnJpLmMgYi9zb3VuZC9zcGFyYy9kYnJpLmMKaW5kZXggZWUyZTFiNC4uYzI1N2FkOCAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvZGJyaS5jCisrKyBiL3NvdW5kL3NwYXJjL2RicmkuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtNjYsNyArNjcsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlJ1ZG9sZiBLb2VuaWcsIEJyZW50IEJhY2NhbGEgYW5kIE1hcnRpbiBIYWJldHMiKTsKQEAgLTI5Nyw3ICsyOTgsNyBAQAogLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGZvciBib3RoIGNoaXBzIChEQlJJICYgQ1M0MjE1KSAqLwogc3RydWN0IHNuZF9kYnJpIHsKIAlpbnQgcmVnc19zaXplLCBpcnE7CS8qIE5lZWRlZCBmb3IgdW5sb2FkICovCi0Jc3RydWN0IHNidXNfZGV2ICpzZGV2OwkvKiBTQlVTIGRldmljZSBpbmZvICovCisJc3RydWN0IG9mX2RldmljZSAqb3A7CS8qIE9GIGRldmljZSBpbmZvICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCiAJc3RydWN0IGRicmlfZG1hICpkbWE7CS8qIFBvaW50ZXIgdG8gb3VyIERNQSBibG9jayAqLwpAQCAtMjA5MywxNCArMjA5NCwxNSBAQAogCSAqLwogCWlmIChpbmZvLT5kdm1hX2J1ZmZlciA9PSAwKSB7CiAJCWlmIChEQlJJX1NUUkVBTU5PKHN1YnN0cmVhbSkgPT0gREJSSV9QTEFZKQotCQkJZGlyZWN0aW9uID0gU0JVU19ETUFfVE9ERVZJQ0U7CisJCQlkaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwogCQllbHNlCi0JCQlkaXJlY3Rpb24gPSBTQlVTX0RNQV9GUk9NREVWSUNFOworCQkJZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCi0JCWluZm8tPmR2bWFfYnVmZmVyID0gc2J1c19tYXBfc2luZ2xlKGRicmktPnNkZXYsCi0JCQkJCXJ1bnRpbWUtPmRtYV9hcmVhLAotCQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcyksCi0JCQkJCWRpcmVjdGlvbik7CisJCWluZm8tPmR2bWFfYnVmZmVyID0KKwkJCWRtYV9tYXBfc2luZ2xlKCZkYnJpLT5vcC0+ZGV2LAorCQkJCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSwKKwkJCQkgICAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpLAorCQkJCSAgICAgICBkaXJlY3Rpb24pOwogCX0KIAogCWRpcmVjdGlvbiA9IHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKTsKQEAgLTIxMjEsMTIgKzIxMjMsMTIgQEAKIAkgKi8KIAlpZiAoaW5mby0+ZHZtYV9idWZmZXIpIHsKIAkJaWYgKERCUklfU1RSRUFNTk8oc3Vic3RyZWFtKSA9PSBEQlJJX1BMQVkpCi0JCQlkaXJlY3Rpb24gPSBTQlVTX0RNQV9UT0RFVklDRTsKKwkJCWRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CiAJCWVsc2UKLQkJCWRpcmVjdGlvbiA9IFNCVVNfRE1BX0ZST01ERVZJQ0U7CisJCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAKLQkJc2J1c191bm1hcF9zaW5nbGUoZGJyaS0+c2RldiwgaW5mby0+ZHZtYV9idWZmZXIsCi0JCQkJICBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBkaXJlY3Rpb24pOworCQlkbWFfdW5tYXBfc2luZ2xlKCZkYnJpLT5vcC0+ZGV2LCBpbmZvLT5kdm1hX2J1ZmZlciwKKwkJCQkgc3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSwgZGlyZWN0aW9uKTsKIAkJaW5mby0+ZHZtYV9idWZmZXIgPSAwOwogCX0KIAlpZiAoaW5mby0+cGlwZSAhPSAtMSkgewpAQCAtMjIyMyw3ICsyMjI1LDYgQEAKIAkJCSAgICAgICAvKiBwbGF5YmFjayBjb3VudCAqLyAxLAogCQkJICAgICAgIC8qIGNhcHR1cmUgY291bnQgKi8gIDEsICZwY20pKSA8IDApCiAJCXJldHVybiBlcnI7Ci0Jc25kX2Fzc2VydChwY20gIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9kYnJpX29wcyk7CiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2Ricmlfb3BzKTsKQEAgLTIyNjMsOSArMjI2NCwxMCBAQAogewogCXN0cnVjdCBzbmRfZGJyaSAqZGJyaSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgZGJyaV9zdHJlYW1pbmZvICppbmZvOwotCXNuZF9hc3NlcnQoZGJyaSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisKKwlpZiAoc25kX0JVR19PTighZGJyaSkpCisJCXJldHVybiAtRUlOVkFMOwogCWluZm8gPSAmZGJyaS0+c3RyZWFtX2luZm9ba2NvbnRyb2wtPnByaXZhdGVfdmFsdWVdOwotCXNuZF9hc3NlcnQoaW5mbyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGluZm8tPmxlZnRfZ2FpbjsKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGluZm8tPnJpZ2h0X2dhaW47CkBAIC0yMzMxLDcgKzIzMzMsOSBAQAogCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4ZmY7CiAJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKIAlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDE7Ci0Jc25kX2Fzc2VydChkYnJpICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChzbmRfQlVHX09OKCFkYnJpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZWxlbSA8IDQpCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KQEAgLTIzNTYsNyArMjM2MCw5IEBACiAJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAxOwogCWludCBjaGFuZ2VkID0gMDsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7Ci0Jc25kX2Fzc2VydChkYnJpICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKworCWlmIChzbmRfQlVHX09OKCFkYnJpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKIAlpZiAoaW52ZXJ0ID09IDEpCkBAIC0yNDMyLDcgKzI0MzgsOCBAQAogCWludCBpZHgsIGVycjsKIAlzdHJ1Y3Qgc25kX2RicmkgKmRicmk7CiAKLQlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCAmJiBjYXJkLT5wcml2YXRlX2RhdGEgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFjYXJkLT5wcml2YXRlX2RhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlkYnJpID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKQEAgLTI1MTQsMzEgKzI1MjEsMzIgQEAKIHN0YXRpYyB2b2lkIHNuZF9kYnJpX2ZyZWUoc3RydWN0IHNuZF9kYnJpICpkYnJpKTsKIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2RicmlfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQkJCQkgIHN0cnVjdCBzYnVzX2RldiAqc2RldiwKLQkJCQkgIGludCBpcnEsIGludCBkZXYpCisJCQkJICAgICBzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwkJCQkgICAgIGludCBpcnEsIGludCBkZXYpCiB7CiAJc3RydWN0IHNuZF9kYnJpICpkYnJpID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWludCBlcnI7CiAKIAlzcGluX2xvY2tfaW5pdCgmZGJyaS0+bG9jayk7Ci0JZGJyaS0+c2RldiA9IHNkZXY7CisJZGJyaS0+b3AgPSBvcDsKIAlkYnJpLT5pcnEgPSBpcnE7CiAKLQlkYnJpLT5kbWEgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2Rldiwgc2l6ZW9mKHN0cnVjdCBkYnJpX2RtYSksCi0JCQkJCSAgJmRicmktPmRtYV9kdm1hKTsKKwlkYnJpLT5kbWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm9wLT5kZXYsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGJyaV9kbWEpLAorCQkJCSAgICAgICAmZGJyaS0+ZG1hX2R2bWEsIEdGUF9BVE9NSUMpOwogCW1lbXNldCgodm9pZCAqKWRicmktPmRtYSwgMCwgc2l6ZW9mKHN0cnVjdCBkYnJpX2RtYSkpOwogCiAJZHByaW50ayhEX0dFTiwgIkRNQSBDbWQgQmxvY2sgMHglcCAoMHglMDh4KVxuIiwKIAkJZGJyaS0+ZG1hLCBkYnJpLT5kbWFfZHZtYSk7CiAKIAkvKiBNYXAgdGhlIHJlZ2lzdGVycyBpbnRvIG1lbW9yeS4gKi8KLQlkYnJpLT5yZWdzX3NpemUgPSBzZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemU7Ci0JZGJyaS0+cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJICBkYnJpLT5yZWdzX3NpemUsICJEQlJJIFJlZ2lzdGVycyIpOworCWRicmktPnJlZ3Nfc2l6ZSA9IHJlc291cmNlX3NpemUoJm9wLT5yZXNvdXJjZVswXSk7CisJZGJyaS0+cmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQlkYnJpLT5yZWdzX3NpemUsICJEQlJJIFJlZ2lzdGVycyIpOwogCWlmICghZGJyaS0+cmVncykgewogCQlwcmludGsoS0VSTl9FUlIgIkRCUkk6IGNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3RlcnNcbiIpOwotCQlzYnVzX2ZyZWVfY29uc2lzdGVudChzZGV2LCBzaXplb2Yoc3RydWN0IGRicmlfZG1hKSwKLQkJCQkgICAgICh2b2lkICopZGJyaS0+ZG1hLCBkYnJpLT5kbWFfZHZtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZvcC0+ZGV2LCBzaXplb2Yoc3RydWN0IGRicmlfZG1hKSwKKwkJCQkgICh2b2lkICopZGJyaS0+ZG1hLCBkYnJpLT5kbWFfZHZtYSk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjU0Niw5ICsyNTU0LDkgQEAKIAkJCSAgIkRCUkkgYXVkaW8iLCBkYnJpKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiREJSSTogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGJyaS0+aXJxKTsKLQkJc2J1c19pb3VubWFwKGRicmktPnJlZ3MsIGRicmktPnJlZ3Nfc2l6ZSk7Ci0JCXNidXNfZnJlZV9jb25zaXN0ZW50KHNkZXYsIHNpemVvZihzdHJ1Y3QgZGJyaV9kbWEpLAotCQkJCSAgICAgKHZvaWQgKilkYnJpLT5kbWEsIGRicmktPmRtYV9kdm1hKTsKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBkYnJpLT5yZWdzLCBkYnJpLT5yZWdzX3NpemUpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmb3AtPmRldiwgc2l6ZW9mKHN0cnVjdCBkYnJpX2RtYSksCisJCQkJICAodm9pZCAqKWRicmktPmRtYSwgZGJyaS0+ZG1hX2R2bWEpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjU3MiwyNyArMjU4MCwyMyBAQAogCQlmcmVlX2lycShkYnJpLT5pcnEsIGRicmkpOwogCiAJaWYgKGRicmktPnJlZ3MpCi0JCXNidXNfaW91bm1hcChkYnJpLT5yZWdzLCBkYnJpLT5yZWdzX3NpemUpOworCQlvZl9pb3VubWFwKCZkYnJpLT5vcC0+cmVzb3VyY2VbMF0sIGRicmktPnJlZ3MsIGRicmktPnJlZ3Nfc2l6ZSk7CiAKIAlpZiAoZGJyaS0+ZG1hKQotCQlzYnVzX2ZyZWVfY29uc2lzdGVudChkYnJpLT5zZGV2LCBzaXplb2Yoc3RydWN0IGRicmlfZG1hKSwKLQkJCQkgICAgICh2b2lkICopZGJyaS0+ZG1hLCBkYnJpLT5kbWFfZHZtYSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZkYnJpLT5vcC0+ZGV2LAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBkYnJpX2RtYSksCisJCQkJICAodm9pZCAqKWRicmktPmRtYSwgZGJyaS0+ZG1hX2R2bWEpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkYnJpX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldiwKLQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRicmlfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZvZl9kZXYtPmRldik7CiAJc3RydWN0IHNuZF9kYnJpICpkYnJpOwotCWludCBpcnE7CiAJc3RydWN0IHJlc291cmNlICpycDsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RhdGljIGludCBkZXYgPSAwOworCWludCBpcnE7CiAJaW50IGVycjsKIAotCWRwcmludGsoRF9HRU4sICJEQlJJOiBGb3VuZCAlcyBpbiBTQlVTIHNsb3QgJWRcbiIsCi0JCXNkZXYtPnByb21fbmFtZSwgc2Rldi0+c2xvdCk7Ci0KIAlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoIWVuYWJsZVtkZXZdKSB7CkBAIC0yNjAwLDcgKzI2MDQsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpcnEgPSBzZGV2LT5pcnFzWzBdOworCWlycSA9IG9wLT5pcnFzWzBdOwogCWlmIChpcnEgPD0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkRCUkktJWQ6IE5vIElSUS5cbiIsIGRldik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjYxMywxMiArMjYxNywxMiBAQAogCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkRCUkkiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCAiU3VuIERCUkkiKTsKLQlycCA9ICZzZGV2LT5yZXNvdXJjZVswXTsKKwlycCA9ICZvcC0+cmVzb3VyY2VbMF07CiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JTAybHg6MHglMDE2THgsIGlycSAlZCIsCiAJCWNhcmQtPnNob3J0bmFtZSwKIAkJcnAtPmZsYWdzICYgMHhmZkwsICh1bnNpZ25lZCBsb25nIGxvbmcpcnAtPnN0YXJ0LCBpcnEpOwogCi0JZXJyID0gc25kX2RicmlfY3JlYXRlKGNhcmQsIHNkZXYsIGlycSwgZGV2KTsKKwllcnIgPSBzbmRfZGJyaV9jcmVhdGUoY2FyZCwgb3AsIGlycSwgZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjYzNSw3ICsyNjM5LDcgQEAKIAogCS8qIC9wcm9jIGZpbGUgaGFuZGxpbmcgKi8KIAlzbmRfZGJyaV9wcm9jKGNhcmQpOwotCWRldl9zZXRfZHJ2ZGF0YSgmb2ZfZGV2LT5kZXYsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgY2FyZCk7CiAKIAllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTI2NDMsNyArMjY0Nyw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJhdWRpbyVkIGF0ICVwIChpcnEgJWQpIGlzIERCUkkoJWMpK0NTNDIxNSglZClcbiIsCiAJICAgICAgIGRldiwgZGJyaS0+cmVncywKLQkgICAgICAgZGJyaS0+aXJxLCBzZGV2LT5wcm9tX25hbWVbOV0sIGRicmktPm1tLnZlcnNpb24pOworCSAgICAgICBkYnJpLT5pcnEsIG9wLT5ub2RlLT5uYW1lWzldLCBkYnJpLT5tbS52ZXJzaW9uKTsKIAlkZXYrKzsKIAogCXJldHVybiAwOwpAQCAtMjY1NCwxOSArMjY1OCwxOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGRicmlfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRicmlfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CiAKIAlzbmRfZGJyaV9mcmVlKGNhcmQtPnByaXZhdGVfZGF0YSk7CiAJc25kX2NhcmRfZnJlZShjYXJkKTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZGJyaV9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGJyaV9tYXRjaFtdID0gewogCXsKIAkJLm5hbWUgPSAiU1VOVyxEQlJJZSIsCiAJfSwKQEAgLTI2ODgsNyArMjY5Miw3IEBACiAvKiBQcm9iZSBmb3IgdGhlIGRicmkgY2hpcCBhbmQgdGhlbiBhdHRhY2ggdGhlIGRyaXZlci4gKi8KIHN0YXRpYyBpbnQgX19pbml0IGRicmlfaW5pdCh2b2lkKQogewotCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmRicmlfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZkYnJpX3NidXNfZHJpdmVyLCAmb2ZfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGJyaV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC9lbXV4L2VtdXguYyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jCmluZGV4IGM4OWQyZWEuLmYxNmEzZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jCisrKyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jCkBAIC05MywxMCArOTMsMTAgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBzbmRfc2ZfY2FsbGJhY2sgc2ZfY2I7CiAKLQlzbmRfYXNzZXJ0KGVtdS0+aHcgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoZW11LT5tYXhfdm9pY2VzID4gMCwgcmV0dXJuIC1FSU5WQUwpOwotCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7Ci0Jc25kX2Fzc2VydChuYW1lICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighZW11LT5odyB8fCBlbXUtPm1heF92b2ljZXMgPD0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzbmRfQlVHX09OKCFjYXJkIHx8ICFuYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAllbXUtPmNhcmQgPSBjYXJkOwogCWVtdS0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfbnJwbi5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X25ycG4uYwppbmRleCBjNjkxN2JhLi4wMGZjMDA1IDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfbnJwbi5jCisrKyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9ucnBuLmMKQEAgLTI4OSw4ICsyODksOCBAQAogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwb3J0OwogCiAJcG9ydCA9IHA7Ci0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwsIHJldHVybik7Ci0Jc25kX2Fzc2VydChjaGFuICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXBvcnQgfHwgIWNoYW4pKQorCQlyZXR1cm47CiAKIAlpZiAoY2hhbi0+Y29udHJvbFtNSURJX0NUTF9OT05SRUdfUEFSTV9OVU1fTVNCXSA9PSAxMjcgJiYKIAkgICAgY2hhbi0+Y29udHJvbFtNSURJX0NUTF9OT05SRUdfUEFSTV9OVU1fTFNCXSA8PSAyNikgewpAQCAtMzc5LDggKzM3OSw4IEBACiAJc3RydWN0IHNuZF9lbXV4ICplbXU7CiAKIAlwb3J0ID0gcDsKLQlzbmRfYXNzZXJ0KHBvcnQgIT0gTlVMTCwgcmV0dXJuKTsKLQlzbmRfYXNzZXJ0KGNoc2V0ICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXBvcnQgfHwgIWNoc2V0KSkKKwkJcmV0dXJuOwogCWVtdSA9IHBvcnQtPmVtdTsKIAogCXN3aXRjaCAocGFyc2VkKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfb3NzLmMgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfb3NzLmMKaW5kZXggZjYwYTk4ZS4uNWM0N2I2YyAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4X29zcy5jCisrKyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9vc3MuYwpAQCAtMTE0LDcgKzExNCw4IEBACiAJY2hhciB0bXBuYW1lWzY0XTsKIAogCWVtdSA9IGNsb3N1cmU7Ci0Jc25kX2Fzc2VydChhcmcgIT0gTlVMTCAmJiBlbXUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWFyZyB8fCAhZW11KSkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCW11dGV4X2xvY2soJmVtdS0+cmVnaXN0ZXJfbXV0ZXgpOwogCkBAIC0xODMsMTIgKzE4NCwxNSBAQAogCXN0cnVjdCBzbmRfZW11eCAqZW11OwogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwOwogCi0Jc25kX2Fzc2VydChhcmcgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWFyZykpCisJCXJldHVybiAtRU5YSU87CiAJcCA9IGFyZy0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcCkpCisJCXJldHVybiAtRU5YSU87CiAKIAllbXUgPSBwLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRU5YSU87CiAKIAltdXRleF9sb2NrKCZlbXUtPnJlZ2lzdGVyX211dGV4KTsKIAlzbmRfZW11eF9zb3VuZHNfb2ZmX2FsbChwKTsKQEAgLTIxMiwxMiArMjE2LDE1IEBACiAJc3RydWN0IHNuZF9lbXV4X3BvcnQgKnA7CiAJaW50IHJjOwogCi0Jc25kX2Fzc2VydChhcmcgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWFyZykpCisJCXJldHVybiAtRU5YSU87CiAJcCA9IGFyZy0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcCkpCisJCXJldHVybiAtRU5YSU87CiAKIAllbXUgPSBwLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRU5YSU87CiAKIAlpZiAoZm9ybWF0ID09IEdVU19QQVRDSCkKIAkJcmMgPSBzbmRfc291bmRmb250X2xvYWRfZ3VzcGF0Y2goZW11LT5zZmxpc3QsIGJ1ZiwgY291bnQsCkBAIC0yNTIsMTIgKzI1OSwxNSBAQAogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwOwogCXN0cnVjdCBzbmRfZW11eCAqZW11OwogCi0Jc25kX2Fzc2VydChhcmcgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWFyZykpCisJCXJldHVybiAtRU5YSU87CiAJcCA9IGFyZy0+cHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighcCkpCisJCXJldHVybiAtRU5YSU87CiAKIAllbXUgPSBwLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVM6CkBAIC0yODIsOSArMjkyLDExIEBACiB7CiAJc3RydWN0IHNuZF9lbXV4X3BvcnQgKnA7CiAKLQlzbmRfYXNzZXJ0KGFyZyAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKKwlpZiAoc25kX0JVR19PTighYXJnKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlwID0gYXJnLT5wcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChwICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOworCWlmIChzbmRfQlVHX09OKCFwKSkKKwkJcmV0dXJuIC1FTlhJTzsKIAlzbmRfZW11eF9yZXNldF9wb3J0KHApOwogCXJldHVybiAwOwogfQpAQCAtMzAyLDkgKzMxNCwxMSBAQAogCXVuc2lnbmVkIGNoYXIgY21kLCAqZGF0YTsKIAogCXAgPSBwcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcCkpCisJCXJldHVybiAtRUlOVkFMOwogCWVtdSA9IHAtPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChldi0+dHlwZSAhPSBTTkRSVl9TRVFfRVZFTlRfT1NTKQogCQlyZXR1cm4gc25kX2VtdXhfZXZlbnRfaW5wdXQoZXYsIGRpcmVjdCwgcHJpdmF0ZV9kYXRhLCBhdG9taWMsIGhvcCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYwppbmRleCBkMTc2Y2MwLi4zMzVhYTJjIDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc2VxLmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jCkBAIC0yNTcsNyArMjU3LDggQEAKIAlzdHJ1Y3Qgc25kX2VtdXhfcG9ydCAqcG9ydDsKIAogCXBvcnQgPSBwcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwgJiYgZXYgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFwb3J0IHx8ICFldikpCisJCXJldHVybiAtRUlOVkFMOwogCiAJc25kX21pZGlfcHJvY2Vzc19ldmVudCgmZW11eF9vcHMsIGV2LCAmcG9ydC0+Y2hzZXQpOwogCkBAIC0zMDgsOSArMzA5LDExIEBACiAJc3RydWN0IHNuZF9lbXV4ICplbXU7CiAKIAlwID0gcHJpdmF0ZV9kYXRhOwotCXNuZF9hc3NlcnQocCAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIXApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAllbXUgPSBwLT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFlbXUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmVtdS0+cmVnaXN0ZXJfbXV0ZXgpOwogCXNuZF9lbXV4X2luaXRfcG9ydChwKTsKQEAgLTMyOSw5ICszMzIsMTEgQEAKIAlzdHJ1Y3Qgc25kX2VtdXggKmVtdTsKIAogCXAgPSBwcml2YXRlX2RhdGE7Ci0Jc25kX2Fzc2VydChwICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoc25kX0JVR19PTighcCkpCisJCXJldHVybiAtRUlOVkFMOwogCWVtdSA9IHAtPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWVtdSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmZW11LT5yZWdpc3Rlcl9tdXRleCk7CiAJc25kX2VtdXhfc291bmRzX29mZl9hbGwocCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zeW50aC5jCmluZGV4IGIzNDM4MTguLjJjYzZmNmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zeW50aC5jCisrKyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zeW50aC5jCkBAIC02NiwxMiArNjYsMTIgQEAKIAlzdHJ1Y3Qgc25kX2VtdXhfcG9ydCAqcG9ydDsKIAogCXBvcnQgPSBwOwotCXNuZF9hc3NlcnQocG9ydCAhPSBOVUxMICYmIGNoYW4gIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighcG9ydCB8fCAhY2hhbikpCisJCXJldHVybjsKIAogCWVtdSA9IHBvcnQtPmVtdTsKLQlzbmRfYXNzZXJ0KGVtdSAhPSBOVUxMLCByZXR1cm4pOwotCXNuZF9hc3NlcnQoZW11LT5vcHMuZ2V0X3ZvaWNlICE9IE5VTEwsIHJldHVybik7Ci0Jc25kX2Fzc2VydChlbXUtPm9wcy50cmlnZ2VyICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWVtdSB8fCAhZW11LT5vcHMuZ2V0X3ZvaWNlIHx8ICFlbXUtPm9wcy50cmlnZ2VyKSkKKwkJcmV0dXJuOwogCiAJa2V5ID0gbm90ZTsgLyogcmVtZW1iZXIgdGhlIG9yaWdpbmFsIG5vdGUgKi8KIAludm9pY2VzID0gZ2V0X3pvbmUoZW11LCBwb3J0LCAmbm90ZSwgdmVsLCBjaGFuLCB0YWJsZSk7CkBAIC0xNjQsMTEgKzE2NCwxMiBAQAogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwb3J0OwogCiAJcG9ydCA9IHA7Ci0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwgJiYgY2hhbiAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFwb3J0IHx8ICFjaGFuKSkKKwkJcmV0dXJuOwogCiAJZW11ID0gcG9ydC0+ZW11OwotCXNuZF9hc3NlcnQoZW11ICE9IE5VTEwsIHJldHVybik7Ci0Jc25kX2Fzc2VydChlbXUtPm9wcy5yZWxlYXNlICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIWVtdSB8fCAhZW11LT5vcHMucmVsZWFzZSkpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGNoID0gMDsgY2ggPCBlbXUtPm1heF92b2ljZXM7IGNoKyspIHsKQEAgLTI0MiwxMSArMjQzLDEyIEBACiAJc3RydWN0IHNuZF9lbXV4X3BvcnQgKnBvcnQ7CiAKIAlwb3J0ID0gcDsKLQlzbmRfYXNzZXJ0KHBvcnQgIT0gTlVMTCAmJiBjaGFuICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXBvcnQgfHwgIWNoYW4pKQorCQlyZXR1cm47CiAKIAllbXUgPSBwb3J0LT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuKTsKLQlzbmRfYXNzZXJ0KGVtdS0+b3BzLnVwZGF0ZSAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFlbXUgfHwgIWVtdS0+b3BzLnVwZGF0ZSkpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGNoID0gMDsgY2ggPCBlbXUtPm1heF92b2ljZXM7IGNoKyspIHsKQEAgLTI3Niw4ICsyNzgsOCBAQAogCQlyZXR1cm47CiAKIAllbXUgPSBwb3J0LT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuKTsKLQlzbmRfYXNzZXJ0KGVtdS0+b3BzLnVwZGF0ZSAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFlbXUgfHwgIWVtdS0+b3BzLnVwZGF0ZSkpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgZW11LT5tYXhfdm9pY2VzOyBpKyspIHsKQEAgLTMwMyw4ICszMDUsOCBAQAogCQlyZXR1cm47CiAKIAllbXUgPSBwb3J0LT5lbXU7Ci0Jc25kX2Fzc2VydChlbXUgIT0gTlVMTCwgcmV0dXJuKTsKLQlzbmRfYXNzZXJ0KGVtdS0+b3BzLnVwZGF0ZSAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFlbXUgfHwgIWVtdS0+b3BzLnVwZGF0ZSkpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAwOyBpIDwgZW11LT5tYXhfdm9pY2VzOyBpKyspIHsKQEAgLTMyNiw3ICszMjgsOCBAQAogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwb3J0OwogCiAJcG9ydCA9IHA7Ci0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwgJiYgY2hhbiAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFwb3J0IHx8ICFjaGFuKSkKKwkJcmV0dXJuOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBNSURJX0NUTF9NU0JfTUFJTl9WT0xVTUU6CkBAIC00MDAsMTEgKzQwMywxMiBAQAogCXN0cnVjdCBzbmRfZW11eF9wb3J0ICpwb3J0OwogCiAJcG9ydCA9IHA7Ci0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwgJiYgY2hhbiAhPSBOVUxMLCByZXR1cm4pOworCWlmIChzbmRfQlVHX09OKCFwb3J0IHx8ICFjaGFuKSkKKwkJcmV0dXJuOwogCiAJZW11ID0gcG9ydC0+ZW11OwotCXNuZF9hc3NlcnQoZW11ICE9IE5VTEwsIHJldHVybik7Ci0Jc25kX2Fzc2VydChlbXUtPm9wcy50ZXJtaW5hdGUgIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighZW11IHx8ICFlbXUtPm9wcy50ZXJtaW5hdGUpKQorCQlyZXR1cm47CiAKIAl0ZXJtaW5hdGVfbm90ZTEoZW11LCBub3RlLCBjaGFuLCAxKTsKIH0KQEAgLTQ1MSwxMCArNDU1LDExIEBACiAJc3RydWN0IHNuZF9lbXV4X3ZvaWNlICp2cDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc25kX2Fzc2VydChwb3J0ICE9IE5VTEwsIHJldHVybik7CisJaWYgKHNuZF9CVUdfT04oIXBvcnQpKQorCQlyZXR1cm47CiAJZW11ID0gcG9ydC0+ZW11OwotCXNuZF9hc3NlcnQoZW11ICE9IE5VTEwsIHJldHVybik7Ci0Jc25kX2Fzc2VydChlbXUtPm9wcy50ZXJtaW5hdGUgIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoc25kX0JVR19PTighZW11IHx8ICFlbXUtPm9wcy50ZXJtaW5hdGUpKQorCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IGVtdS0+bWF4X3ZvaWNlczsgaSsrKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC91dGlsX21lbS5jIGIvc291bmQvc3ludGgvdXRpbF9tZW0uYwppbmRleCBkZWFiZTVmLi5jODU1MjJlIDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC91dGlsX21lbS5jCisrKyBiL3NvdW5kL3N5bnRoL3V0aWxfbWVtLmMKQEAgLTU1LDcgKzU1LDggQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0Jc25kX2Fzc2VydChoZHIgIT0gTlVMTCwgcmV0dXJuKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuOwogCS8qIHJlbGVhc2UgYWxsIGJsb2NrcyAqLwogCXdoaWxlICgocCA9IGhkci0+YmxvY2submV4dCkgIT0gJmhkci0+YmxvY2spIHsKIAkJbGlzdF9kZWwocCk7CkBAIC03NCw4ICs3NSw4IEBACiAJdW5zaWduZWQgaW50IHVuaXRzLCBwcmV2X29mZnNldDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0Jc25kX2Fzc2VydChoZHIgIT0gTlVMTCwgcmV0dXJuIE5VTEwpOwotCXNuZF9hc3NlcnQoc2l6ZSA+IDAsIHJldHVybiBOVUxMKTsKKwlpZiAoc25kX0JVR19PTighaGRyIHx8IHNpemUgPD0gMCkpCisJCXJldHVybiBOVUxMOwogCiAJLyogd29yZCBhbGlnbm1lbnQgKi8KIAl1bml0cyA9IHNpemU7CkBAIC0xNjEsNyArMTYyLDggQEAKICAqLwogaW50IHNuZF91dGlsX21lbV9mcmVlKHN0cnVjdCBzbmRfdXRpbF9tZW1oZHIgKmhkciwgc3RydWN0IHNuZF91dGlsX21lbWJsayAqYmxrKQogewotCXNuZF9hc3NlcnQoaGRyICYmIGJsaywgcmV0dXJuIC1FSU5WQUwpOworCWlmIChzbmRfQlVHX09OKCFoZHIgfHwgIWJsaykpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmaGRyLT5ibG9ja19tdXRleCk7CiAJX19zbmRfdXRpbF9tZW1fZnJlZShoZHIsIGJsayk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvS2NvbmZpZyBiL3NvdW5kL3VzYi9LY29uZmlnCmluZGV4IGZmY2RjOGYuLjRmMGVhYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9LY29uZmlnCisrKyBiL3NvdW5kL3VzYi9LY29uZmlnCkBAIC02Nyw1ICs2NywxNyBAQAogCSAgICogTmF0aXZlIEluc3RydW1lbnRzIEtvcmUgQ29udHJvbGxlciAyCiAJICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgQXVkaW8gS29udHJvbCAxCiAKK2NvbmZpZyBTTkRfVVNCX1VTMTIyTAorCXRyaXN0YXRlICJUYXNjYW0gVVMtMTIyTCBVU0IgZHJpdmVyIgorCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTTkRfSFdERVAKKwlzZWxlY3QgU05EX1JBV01JREkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgVGFzY2FtIFVTLTEyMkwgVVNCIEF1ZGlvL01JREkKKwkgIGludGVyZmFjZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNuZC11c2ItdXMxMjJsLgorCiBlbmRpZgkjIFNORF9VU0IKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL01ha2VmaWxlIGIvc291bmQvdXNiL01ha2VmaWxlCmluZGV4IGFhMjUyZWYuLmFiYjI4OGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9NYWtlZmlsZQorKysgYi9zb3VuZC91c2IvTWFrZWZpbGUKQEAgLTgsNSArOCw2IEBACiAjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CiBvYmotJChDT05GSUdfU05EX1VTQl9BVURJTykgKz0gc25kLXVzYi1hdWRpby5vIHNuZC11c2ItbGliLm8KIG9iai0kKENPTkZJR19TTkRfVVNCX1VTWDJZKSArPSBzbmQtdXNiLWxpYi5vCitvYmotJChDT05GSUdfU05EX1VTQl9VUzEyMkwpICs9IHNuZC11c2ItbGliLm8KIAogb2JqLSQoQ09ORklHX1NORCkgKz0gdXN4MnkvIGNhaWFxLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCBiOGNmYjdjLi5iYmQ3MGQ1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtNzEsNiArNzEsNyBAQAogc3RhdGljIGludCBucnBhY2tzID0gODsJCS8qIG1heC4gbnVtYmVyIG9mIHBhY2tldHMgcGVyIHVyYiAqLwogc3RhdGljIGludCBhc3luY191bmxpbmsgPSAxOwogc3RhdGljIGludCBkZXZpY2Vfc2V0dXBbU05EUlZfQ0FSRFNdOyAvKiBkZXZpY2UgcGFyYW1ldGVyIGZvciB0aGlzIGNhcmQqLworc3RhdGljIGludCBpZ25vcmVfY3RsX2Vycm9yOwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIHRoZSBVU0IgYXVkaW8gYWRhcHRlci4iKTsKQEAgLTg4LDcgKzg5LDkgQEAKIE1PRFVMRV9QQVJNX0RFU0MoYXN5bmNfdW5saW5rLCAiVXNlIGFzeW5jIHVubGluayBtb2RlLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGRldmljZV9zZXR1cCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2aWNlX3NldHVwLCAiU3BlY2lmaWMgZGV2aWNlIHNldHVwIChpZiBuZWVkZWQpLiIpOwotCittb2R1bGVfcGFyYW0oaWdub3JlX2N0bF9lcnJvciwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9jdGxfZXJyb3IsCisJCSAiSWdub3JlIGVycm9ycyBmcm9tIFVTQiBjb250cm9sbGVyIGZvciBtaXhlciBpbnRlcmZhY2VzLiIpOwogCiAvKgogICogZGVidWcgdGhlIGgvdyBjb25zdHJhaW50cwpAQCAtNDgxLDcgKzQ4NCw3IEBACiB9CiAKIC8qCi0gKiBwcm9jZXNzIGFmdGVyIEUtTXUgMDIwMi8wNDA0IGhpZ2ggc3BlZWQgcGxheWJhY2sgc3luYyBjb21wbGV0ZQorICogcHJvY2VzcyBhZnRlciBFLU11IDAyMDIvMDQwNC9UcmFja2VyIFByZSBoaWdoIHNwZWVkIHBsYXliYWNrIHN5bmMgY29tcGxldGUKICAqCiAgKiBUaGVzZSBkZXZpY2VzIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBhY2tldCBpbnN0ZWFkIG9mIHRoZSBudW1iZXIKICAqIG9mIHNhbXBsZXMgcGVyIG1pY3JvZnJhbWUuCkBAIC04NDEsNyArODQ0LDggQEAKIAkJcmV0dXJuIC1FQkFERkQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgewotCQlzbmRfYXNzZXJ0KHN1YnMtPmRhdGF1cmJbaV0udXJiLCByZXR1cm4gLUVJTlZBTCk7CisJCWlmIChzbmRfQlVHX09OKCFzdWJzLT5kYXRhdXJiW2ldLnVyYikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHN1YnMtPm9wcy5wcmVwYXJlKHN1YnMsIHJ1bnRpbWUsIHN1YnMtPmRhdGF1cmJbaV0udXJiKSA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBwcmVwYXJlIGRhdGFwaXBlIGZvciB1cmIgJWRcbiIsIGkpOwogCQkJZ290byBfX2Vycm9yOwpAQCAtODQ5LDcgKzg1Myw4IEBACiAJfQogCWlmIChzdWJzLT5zeW5jcGlwZSkgewogCQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspIHsKLQkJCXNuZF9hc3NlcnQoc3Vicy0+c3luY3VyYltpXS51cmIsIHJldHVybiAtRUlOVkFMKTsKKwkJCWlmIChzbmRfQlVHX09OKCFzdWJzLT5zeW5jdXJiW2ldLnVyYikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAoc3Vicy0+b3BzLnByZXBhcmVfc3luYyhzdWJzLCBydW50aW1lLCBzdWJzLT5zeW5jdXJiW2ldLnVyYikgPCAwKSB7CiAJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHByZXBhcmUgc3luY3BpcGUgZm9yIHVyYiAlZFxuIiwgaSk7CiAJCQkJZ290byBfX2Vycm9yOwpAQCAtMTMyMSwxMCArMTMyNiwxMiBAQAogCWludCBlcnI7CiAKIAlpZmFjZSA9IHVzYl9pZm51bV90b19pZihkZXYsIGZtdC0+aWZhY2UpOwotCXNuZF9hc3NlcnQoaWZhY2UsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoV0FSTl9PTighaWZhY2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlhbHRzID0gJmlmYWNlLT5hbHRzZXR0aW5nW2ZtdC0+YWx0c2V0X2lkeF07CiAJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKLQlzbmRfYXNzZXJ0KGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyA9PSBmbXQtPmFsdHNldHRpbmcsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoV0FSTl9PTihhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmcgIT0gZm10LT5hbHRzZXR0aW5nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZm10ID09IHN1YnMtPmN1cl9hdWRpb2ZtdCkKIAkJcmV0dXJuIDA7CkBAIC0yMjU3LDYgKzIyNjQsNyBAQAogCQlzd2l0Y2ggKGFzLT5jaGlwLT51c2JfaWQpIHsKIAkJY2FzZSBVU0JfSUQoMHgwNDFlLCAweDNmMDIpOiAvKiBFLU11IDAyMDIgVVNCICovCiAJCWNhc2UgVVNCX0lEKDB4MDQxZSwgMHgzZjA0KTogLyogRS1NdSAwNDA0IFVTQiAqLworCQljYXNlIFVTQl9JRCgweDA0MWUsIDB4M2YwYSk6IC8qIEUtTXUgVHJhY2tlciBQcmUgKi8KIAkJCXN1YnMtPm9wcy5yZXRpcmVfc3luYyA9IHJldGlyZV9wbGF5YmFja19zeW5jX3VyYl9oc19lbXU7CiAJCQlicmVhazsKIAkJfQpAQCAtMjk4OSwxMiArMjk5NywxMiBAQAogfQogCiAvKgotICogQ3JlYXRlIGEgc3RyZWFtIGZvciBhbiBFZGlyb2wgVUEtNzAwL1VBLTI1IGludGVyZmFjZS4gIFRoZSBvbmx5IHdheQotICogdG8gZGV0ZWN0IHRoZSBzYW1wbGUgcmF0ZSBpcyBieSBsb29raW5nIGF0IHdNYXhQYWNrZXRTaXplLgorICogQ3JlYXRlIGEgc3RyZWFtIGZvciBhbiBFZGlyb2wgVUEtNzAwL1VBLTI1L1VBLTRGWCBpbnRlcmZhY2UuICAKKyAqIFRoZSBvbmx5IHdheSB0byBkZXRlY3QgdGhlIHNhbXBsZSByYXRlIGlzIGJ5IGxvb2tpbmcgYXQgd01heFBhY2tldFNpemUuCiAgKi8KLXN0YXRpYyBpbnQgY3JlYXRlX3VhNzAwX3VhMjVfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCi0JCQkJICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrICpxdWlyaykKK3N0YXRpYyBpbnQgY3JlYXRlX3VheHhfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyayAqcXVpcmspCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdWRpb2Zvcm1hdCB1YV9mb3JtYXQgPSB7CiAJCS5mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEUsCkBAIC0zMDA5LDggKzMwMTcsOCBAQAogCXN0cnVjdCBhdWRpb2Zvcm1hdCAqZnA7CiAJaW50IHN0cmVhbSwgZXJyOwogCi0JLyogYm90aCBQQ00gYW5kIE1JREkgaW50ZXJmYWNlcyBoYXZlIDIgYWx0c2V0dGluZ3MgKi8KLQlpZiAoaWZhY2UtPm51bV9hbHRzZXR0aW5nICE9IDIpCisJLyogYm90aCBQQ00gYW5kIE1JREkgaW50ZXJmYWNlcyBoYXZlIDIgb3IgbW9yZSBhbHRzZXR0aW5ncyAqLworCWlmIChpZmFjZS0+bnVtX2FsdHNldHRpbmcgPCAyKQogCQlyZXR1cm4gLUVOWElPOwogCWFsdHMgPSAmaWZhY2UtPmFsdHNldHRpbmdbMV07CiAJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKQEAgLTMwMjQsMjAgKzMwMzIsMjAgQEAKIAkJCS50eXBlID0gUVVJUktfTUlESV9GSVhFRF9FTkRQT0lOVCwKIAkJCS5kYXRhID0gJnVhNzAwX2VwCiAJCX07Ci0JCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8gdWEyNV9lcCA9IHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfdXNiX21pZGlfZW5kcG9pbnRfaW5mbyB1YXh4X2VwID0gewogCQkJLm91dF9jYWJsZXMgPSAweDAwMDEsCiAJCQkuaW5fY2FibGVzICA9IDB4MDAwMQogCQl9OwotCQlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgdWEyNV9xdWlyayA9IHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrIHVheHhfcXVpcmsgPSB7CiAJCQkudHlwZSA9IFFVSVJLX01JRElfRklYRURfRU5EUE9JTlQsCi0JCQkuZGF0YSA9ICZ1YTI1X2VwCisJCQkuZGF0YSA9ICZ1YXh4X2VwCiAJCX07CiAJCWlmIChjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MDU4MiwgMHgwMDJiKSkKIAkJCXJldHVybiBzbmRfdXNiX2NyZWF0ZV9taWRpX2ludGVyZmFjZShjaGlwLCBpZmFjZSwKIAkJCQkJCQkgICAgICZ1YTcwMF9xdWlyayk7CiAJCWVsc2UKIAkJCXJldHVybiBzbmRfdXNiX2NyZWF0ZV9taWRpX2ludGVyZmFjZShjaGlwLCBpZmFjZSwKLQkJCQkJCQkgICAgICZ1YTI1X3F1aXJrKTsKKwkJCQkJCQkgICAgICZ1YXh4X3F1aXJrKTsKIAl9CiAKIAlpZiAoYWx0c2QtPmJOdW1FbmRwb2ludHMgIT0gMSkKQEAgLTMzNjksOSArMzM3Nyw5IEBACiAJCVtRVUlSS19NSURJX0NNRV0gPSBzbmRfdXNiX2NyZWF0ZV9taWRpX2ludGVyZmFjZSwKIAkJW1FVSVJLX0FVRElPX1NUQU5EQVJEX0lOVEVSRkFDRV0gPSBjcmVhdGVfc3RhbmRhcmRfYXVkaW9fcXVpcmssCiAJCVtRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVF0gPSBjcmVhdGVfZml4ZWRfc3RyZWFtX3F1aXJrLAotCQlbUVVJUktfQVVESU9fRURJUk9MX1VBNzAwX1VBMjVdID0gY3JlYXRlX3VhNzAwX3VhMjVfcXVpcmssCiAJCVtRVUlSS19BVURJT19FRElST0xfVUExMDAwXSA9IGNyZWF0ZV91YTEwMDBfcXVpcmssCiAJCVtRVUlSS19BVURJT19FRElST0xfVUExMDFdID0gY3JlYXRlX3VhMTAxX3F1aXJrLAorCQlbUVVJUktfQVVESU9fRURJUk9MX1VBWFhdID0gY3JlYXRlX3VheHhfcXVpcmsKIAl9OwogCiAJaWYgKHF1aXJrLT50eXBlIDwgUVVJUktfVFlQRV9DT1VOVCkgewpAQCAtMzYyOSw3ICszNjM3LDcgQEAKIAlpZiAoZXJyID4gMCkgewogCQkvKiBjcmVhdGUgbm9ybWFsIFVTQiBhdWRpbyBpbnRlcmZhY2VzICovCiAJCWlmIChzbmRfdXNiX2NyZWF0ZV9zdHJlYW1zKGNoaXAsIGlmbnVtKSA8IDAgfHwKLQkJICAgIHNuZF91c2JfY3JlYXRlX21peGVyKGNoaXAsIGlmbnVtKSA8IDApIHsKKwkJICAgIHNuZF91c2JfY3JlYXRlX21peGVyKGNoaXAsIGlmbnVtLCBpZ25vcmVfY3RsX2Vycm9yKSA8IDApIHsKIAkJCWdvdG8gX19lcnJvcjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JhdWRpby5oIGIvc291bmQvdXNiL3VzYmF1ZGlvLmgKaW5kZXggN2NmMThjMy4uMzZlNGY3YTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JhdWRpby5oCisrKyBiL3NvdW5kL3VzYi91c2JhdWRpby5oCkBAIC0xNTYsMTEgKzE1NiwxMiBAQAogCVFVSVJLX01JRElfUkFXLAogCVFVSVJLX01JRElfRU1BR0lDLAogCVFVSVJLX01JRElfQ01FLAorCVFVSVJLX01JRElfVVMxMjJMLAogCVFVSVJLX0FVRElPX1NUQU5EQVJEX0lOVEVSRkFDRSwKIAlRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVCwKLQlRVUlSS19BVURJT19FRElST0xfVUE3MDBfVUEyNSwKIAlRVUlSS19BVURJT19FRElST0xfVUExMDAwLAogCVFVSVJLX0FVRElPX0VESVJPTF9VQTEwMSwKKwlRVUlSS19BVURJT19FRElST0xfVUFYWCwKIAogCVFVSVJLX1RZUEVfQ09VTlQKIH07CkBAIC0yMjIsNyArMjIzLDggQEAKIAkJICAgIF9fdTggcmVxdWVzdCwgX191OCByZXF1ZXN0dHlwZSwgX191MTYgdmFsdWUsIF9fdTE2IGluZGV4LAogCQkgICAgdm9pZCAqZGF0YSwgX191MTYgc2l6ZSwgaW50IHRpbWVvdXQpOwogCi1pbnQgc25kX3VzYl9jcmVhdGVfbWl4ZXIoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsIGludCBjdHJsaWYpOworaW50IHNuZF91c2JfY3JlYXRlX21peGVyKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgY3RybGlmLAorCQkJIGludCBpZ25vcmVfZXJyb3IpOwogdm9pZCBzbmRfdXNiX21peGVyX2Rpc2Nvbm5lY3Qoc3RydWN0IGxpc3RfaGVhZCAqcCk7CiAKIGludCBzbmRfdXNiX2NyZWF0ZV9taWRpX2ludGVyZmFjZShzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYm1pZGkuYyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKaW5kZXggNjY3NmExNzcuLjU5NjJlNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaWRpLmMKKysrIGIvc291bmQvdXNiL3VzYm1pZGkuYwpAQCAtNjY5LDYgKzY2OSw0MiBAQAogCS5vdXRwdXQgPSBzbmRfdXNibWlkaV9yYXdfb3V0cHV0LAogfTsKIAorc3RhdGljIHZvaWQgc25kX3VzYm1pZGlfdXMxMjJsX2lucHV0KHN0cnVjdCBzbmRfdXNiX21pZGlfaW5fZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgdWludDhfdCAqYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCkKK3sKKwlpZiAoYnVmZmVyX2xlbmd0aCAhPSA5KQorCQlyZXR1cm47CisJYnVmZmVyX2xlbmd0aCA9IDg7CisJd2hpbGUgKGJ1ZmZlcl9sZW5ndGggJiYgYnVmZmVyW2J1ZmZlcl9sZW5ndGggLSAxXSA9PSAweEZEKQorCQlidWZmZXJfbGVuZ3RoLS07CisJaWYgKGJ1ZmZlcl9sZW5ndGgpCisJCXNuZF91c2JtaWRpX2lucHV0X2RhdGEoZXAsIDAsIGJ1ZmZlciwgYnVmZmVyX2xlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF91c2JtaWRpX3VzMTIybF9vdXRwdXQoc3RydWN0IHNuZF91c2JfbWlkaV9vdXRfZW5kcG9pbnQgKmVwKQoreworCWludCBjb3VudDsKKworCWlmICghZXAtPnBvcnRzWzBdLmFjdGl2ZSkKKwkJcmV0dXJuOworCWNvdW50ID0gZXAtPnVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCA/IDEgOiAyOworCWNvdW50ID0gc25kX3Jhd21pZGlfdHJhbnNtaXQoZXAtPnBvcnRzWzBdLnN1YnN0cmVhbSwKKwkJCQkgICAgIGVwLT51cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkgICAgIGNvdW50KTsKKwlpZiAoY291bnQgPCAxKSB7CisJCWVwLT5wb3J0c1swXS5hY3RpdmUgPSAwOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KGVwLT51cmItPnRyYW5zZmVyX2J1ZmZlciArIGNvdW50LCAweEZELCA5IC0gY291bnQpOworCWVwLT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfcHJvdG9jb2xfb3BzIHNuZF91c2JtaWRpXzEyMmxfb3BzID0geworCS5pbnB1dCA9IHNuZF91c2JtaWRpX3VzMTIybF9pbnB1dCwKKwkub3V0cHV0ID0gc25kX3VzYm1pZGlfdXMxMjJsX291dHB1dCwKK307CisKIC8qCiAgKiBFbWFnaWMgVVNCIE1JREkgcHJvdG9jb2w6IHJhdyBNSURJIHdpdGggIkY1IHh4IiBwb3J0IHN3aXRjaGluZy4KICAqLwpAQCAtMTA3Niw2ICsxMTEyLDE1IEBACiAJCX0KIAkJaWYgKGVwLT5pbikKIAkJCXVzYl9raWxsX3VyYihlcC0+aW4tPnVyYik7CisJCS8qIGZyZWUgZW5kcG9pbnRzIGhlcmU7IGxhdGVyIGNhbGwgY2FuIHJlc3VsdCBpbiBPb3BzICovCisJCWlmIChlcC0+b3V0KSB7CisJCQlzbmRfdXNibWlkaV9vdXRfZW5kcG9pbnRfZGVsZXRlKGVwLT5vdXQpOworCQkJZXAtPm91dCA9IE5VTEw7CisJCX0KKwkJaWYgKGVwLT5pbikgeworCQkJc25kX3VzYm1pZGlfaW5fZW5kcG9pbnRfZGVsZXRlKGVwLT5pbik7CisJCQllcC0+aW4gPSBOVUxMOworCQl9CiAJfQogCWRlbF90aW1lcl9zeW5jKCZ1bWlkaS0+ZXJyb3JfdGltZXIpOwogfQpAQCAtMTcxNCw2ICsxNzU5LDkgQEAKIAkJCXVtaWRpLT51c2JfcHJvdG9jb2xfb3BzID0KIAkJCQkmc25kX3VzYm1pZGlfbWF1ZGlvX2Jyb2tlbl9ydW5uaW5nX3N0YXR1c19vcHM7CiAJCWJyZWFrOworCWNhc2UgUVVJUktfTUlESV9VUzEyMkw6CisJCXVtaWRpLT51c2JfcHJvdG9jb2xfb3BzID0gJnNuZF91c2JtaWRpXzEyMmxfb3BzOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFFVSVJLX01JRElfRklYRURfRU5EUE9JTlQ6CiAJCW1lbWNweSgmZW5kcG9pbnRzWzBdLCBxdWlyay0+ZGF0YSwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8pKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaXhlci5jIGIvc291bmQvdXNiL3VzYm1peGVyLmMKaW5kZXggODljNjNkMC4uYTQ5MjQ2MSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1peGVyLmMKKysrIGIvc291bmQvdXNiL3VzYm1peGVyLmMKQEAgLTU5LDEyICs1OSwxMyBAQAogCXU4ICBvZmZzZXQ7CiAJdTggIGxlbmd0aDsKIAl1OCAgcGFja2V0X2xlbmd0aDsKKwl1OCAgbWluX3BhY2tldF9sZW5ndGg7IC8qIG1pbmltdW0gYWNjZXB0ZWQgbGVuZ3RoIG9mIHRoZSBVUkIgcmVzdWx0ICovCiAJdTggIG11dGVfbWl4ZXJfaWQ7CiAJdTMyIG11dGVfY29kZTsKIH0gcmNfY29uZmlnc1tdID0gewotCXsgVVNCX0lEKDB4MDQxZSwgMHgzMDAwKSwgMCwgMSwgMiwgIDE4LCAweDAwMTMgfSwgLyogRXh0aWd5ICAgICAgICovCi0JeyBVU0JfSUQoMHgwNDFlLCAweDMwMjApLCAyLCAxLCA2LCAgMTgsIDB4MDAxMyB9LCAvKiBBdWRpZ3kgMiBOWCAgKi8KLQl7IFVTQl9JRCgweDA0MWUsIDB4MzA0MCksIDIsIDIsIDYsICAyLCAgMHg2ZTkxIH0sIC8qIExpdmUhIDI0LWJpdCAqLworCXsgVVNCX0lEKDB4MDQxZSwgMHgzMDAwKSwgMCwgMSwgMiwgMSwgIDE4LCAweDAwMTMgfSwgLyogRXh0aWd5ICAgICAgICovCisJeyBVU0JfSUQoMHgwNDFlLCAweDMwMjApLCAyLCAxLCA2LCA2LCAgMTgsIDB4MDAxMyB9LCAvKiBBdWRpZ3kgMiBOWCAgKi8KKwl7IFVTQl9JRCgweDA0MWUsIDB4MzA0MCksIDIsIDIsIDYsIDYsICAyLCAgMHg2ZTkxIH0sIC8qIExpdmUhIDI0LWJpdCAqLwogfTsKIAogc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgewpAQCAtMTM4OCw3ICsxMzg5LDggQEAKIAlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqY3ZhbCA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CiAJY2hhciAqKml0ZW1saXN0ID0gKGNoYXIgKiopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAKLQlzbmRfYXNzZXJ0KGl0ZW1saXN0LCByZXR1cm4gLUVJTlZBTCk7CisJaWYgKHNuZF9CVUdfT04oIWl0ZW1saXN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CiAJdWluZm8tPmNvdW50ID0gMTsKIAl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGN2YWwtPm1heDsKQEAgLTE3ODEsNyArMTc4Myw3IEBACiAJY29uc3Qgc3RydWN0IHJjX2NvbmZpZyAqcmMgPSBtaXhlci0+cmNfY2ZnOwogCXUzMiBjb2RlOwogCi0JaWYgKHVyYi0+c3RhdHVzIDwgMCB8fCB1cmItPmFjdHVhbF9sZW5ndGggPCByYy0+cGFja2V0X2xlbmd0aCkKKwlpZiAodXJiLT5zdGF0dXMgPCAwIHx8IHVyYi0+YWN0dWFsX2xlbmd0aCA8IHJjLT5taW5fcGFja2V0X2xlbmd0aCkKIAkJcmV0dXJuOwogCiAJY29kZSA9IG1peGVyLT5yY19idWZmZXJbcmMtPm9mZnNldF07CkBAIC0yMDEyLDcgKzIwMTQsOCBAQAogCX0KIH0KIAotaW50IHNuZF91c2JfY3JlYXRlX21peGVyKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgY3RybGlmKQoraW50IHNuZF91c2JfY3JlYXRlX21peGVyKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgY3RybGlmLAorCQkJIGludCBpZ25vcmVfZXJyb3IpCiB7CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBkZXZfb3BzID0gewogCQkuZGV2X2ZyZWUgPSBzbmRfdXNiX21peGVyX2Rldl9mcmVlCkBAIC0yMDI3LDkgKzIwMzAsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAltaXhlci0+Y2hpcCA9IGNoaXA7CiAJbWl4ZXItPmN0cmxpZiA9IGN0cmxpZjsKLSNpZmRlZiBJR05PUkVfQ1RMX0VSUk9SCi0JbWl4ZXItPmlnbm9yZV9jdGxfZXJyb3IgPSAxOwotI2VuZGlmCisJbWl4ZXItPmlnbm9yZV9jdGxfZXJyb3IgPSBpZ25vcmVfZXJyb3I7CiAJbWl4ZXItPmlkX2VsZW1zID0ga2NhbGxvYygyNTYsIHNpemVvZigqbWl4ZXItPmlkX2VsZW1zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtaXhlci0+aWRfZWxlbXMpIHsKIAkJa2ZyZWUobWl4ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYnF1aXJrcy5oIGIvc291bmQvdXNiL3VzYnF1aXJrcy5oCmluZGV4IDllYTcyNmMuLjY5Njg5ZTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JxdWlya3MuaAorKysgYi9zb3VuZC91c2IvdXNicXVpcmtzLmgKQEAgLTYyLDYgKzYyLDEzIEBACiAJLmlkUHJvZHVjdCA9IDB4M2YwNCwKIAkuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX0FVRElPLAogfSwKK3sKKwkvKiBFLU11IFRyYWNrZXIgUHJlICovCisJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJLmlkVmVuZG9yID0gMHgwNDFlLAorCS5pZFByb2R1Y3QgPSAweDNmMGEsCisJLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19BVURJTywKK30sCiAKIC8qCiAgKiBMb2dpdGVjaCBRdWlja0NhbTogYkRldmljZUNsYXNzIGlzIHZlbmRvci1zcGVjaWZpYywgc28gZ2VuZXJpYyBpbnRlcmZhY2UKQEAgLTg1NSwxNSArODYyLDE1IEBACiAJCS5kYXRhID0gKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrW10pIHsKIAkJCXsKIAkJCQkuaWZudW0gPSAxLAotCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBNzAwX1VBMjUKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQVhYCiAJCQl9LAogCQkJewogCQkJCS5pZm51bSA9IDIsCi0JCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUE3MDBfVUEyNQorCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBWFgKIAkJCX0sCiAJCQl7CiAJCQkJLmlmbnVtID0gMywKLQkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQTcwMF9VQTI1CisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUFYWAogCQkJfSwKIAkJCXsKIAkJCQkuaWZudW0gPSAtMQpAQCAtMTE5NywxNSArMTIwNCwxNSBAQAogCQkuZGF0YSA9IChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlya1tdKSB7CiAJCQl7CiAJCQkJLmlmbnVtID0gMCwKLQkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQTcwMF9VQTI1CisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUFYWAogCQkJfSwKIAkJCXsKIAkJCQkuaWZudW0gPSAxLAotCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBNzAwX1VBMjUKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQVhYCiAJCQl9LAogCQkJewogCQkJCS5pZm51bSA9IDIsCi0JCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUE3MDBfVUEyNQorCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBWFgKIAkJCX0sCiAJCQl7CiAJCQkJLmlmbnVtID0gLTEKQEAgLTEzMzgsNiArMTM0NSwzNiBAQAogCQl9CiAJfQogfSwKK3sKKwkvKgorCSAqIFRoaXMgcXVpcmsgaXMgZm9yIHRoZSAiQWR2YW5jZWQgRHJpdmVyIiBtb2RlLiBJZiBvZmYsIHRoZSBVQS00RlgKKwkgKiBpcyBzdGFuZGFyZCBjb21wbGlhbnQsIGJ1dCBoYXMgb25seSAxNi1iaXQgUENNIGFuZCBubyBNSURJLgorCSAqLworCVVTQl9ERVZJQ0UoMHgwNTgyLCAweDAwYTMpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyaykgeworCQkudmVuZG9yX25hbWUgPSAiRURJUk9MIiwKKwkJLnByb2R1Y3RfbmFtZSA9ICJVQS00RlgiLAorCQkuaWZudW0gPSBRVUlSS19BTllfSU5URVJGQUNFLAorCQkudHlwZSA9IFFVSVJLX0NPTVBPU0lURSwKKwkJLmRhdGEgPSAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmtbXSkgeworCQkJeworCQkJCS5pZm51bSA9IDAsCisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUFYWAorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAxLAorCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBWFgKKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gMiwKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX0VESVJPTF9VQVhYCisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IC0xCisJCQl9CisJCX0KKwl9Cit9LAogCS8qIFRPRE86IGFkZCBFZGlyb2wgTUQtUDEgc3VwcG9ydCAqLwogewogCVVTQl9ERVZJQ0UoMHg1ODIsIDB4MDBhNiksCkBAIC0xMzgzLDcgKzE0MjAsNiBAQAogCQl9CiAJfQogfSwKLQogewogCS8qIFJvbGFuZCBTb25pY0NlbGwgKi8KIAlVU0JfREVWSUNFKDB4MDU4MiwgMHgwMGMyKSwKQEAgLTE0MTUsNyArMTQ1MSwzNSBAQAogCQl9CiAJfQogfSwKLQoreworCS8qIEJPU1MgR1QtMTAgKi8KKwlVU0JfREVWSUNFKDB4MDU4MiwgMHgwMGRhKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJiAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmspIHsKKwkJLmlmbnVtID0gUVVJUktfQU5ZX0lOVEVSRkFDRSwKKwkJLnR5cGUgPSBRVUlSS19DT01QT1NJVEUsCisJCS5kYXRhID0gKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrW10pIHsKKwkJCXsKKwkJCQkuaWZudW0gPSAwLAorCQkJCS50eXBlID0gUVVJUktfQVVESU9fU1RBTkRBUkRfSU5URVJGQUNFCisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IDEsCisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19TVEFOREFSRF9JTlRFUkZBQ0UKKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gMiwKKwkJCQkudHlwZSA9IFFVSVJLX01JRElfRklYRURfRU5EUE9JTlQsCisJCQkJLmRhdGEgPSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8pIHsKKwkJCQkJLm91dF9jYWJsZXMgPSAweDAwMDEsCisJCQkJCS5pbl9jYWJsZXMgID0gMHgwMDAxCisJCQkJfQorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAtMQorCQkJfQorCQl9CisJfQorfSwKIAogLyogR3VpbGxlbW90IGRldmljZXMgKi8KIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS9NYWtlZmlsZSBiL3NvdW5kL3VzYi91c3gyeS9NYWtlZmlsZQppbmRleCA5YWMyMmJjLi43NDg5MzMwIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvTWFrZWZpbGUKKysrIGIvc291bmQvdXNiL3VzeDJ5L01ha2VmaWxlCkBAIC0xLDMgKzEsNSBAQAogc25kLXVzYi11c3gyeS1vYmpzIDo9IHVzYnVzeDJ5Lm8gdXNYMllod2RlcC5vIHVzeDJ5aHdkZXBwY20ubworc25kLXVzYi11czEyMmwtb2JqcyA6PSB1czEyMmwubwogCiBvYmotJChDT05GSUdfU05EX1VTQl9VU1gyWSkgKz0gc25kLXVzYi11c3gyeS5vCitvYmotJChDT05GSUdfU05EX1VTQl9VUzEyMkwpICs9IHNuZC11c2ItdXMxMjJsLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjUxNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCkBAIC0wLDAgKzEsNjkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEthcnN0ZW4gV2llc2UgPGZ6dUB3ZW1nZWhvZXJ0ZGVyc3RhYXQuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNkZWZpbmUgTU9ETkFNRSAiVVMxMjJMIgorI2luY2x1ZGUgInVzYl9zdHJlYW0uYyIKKyNpbmNsdWRlICIuLi91c2JhdWRpby5oIgorI2luY2x1ZGUgInVzMTIybC5oIgorCitNT0RVTEVfQVVUSE9SKCJLYXJzdGVuIFdpZXNlIDxmenVAd2VtZ2Vob2VydGRlcnN0YWF0LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQVNDQU0gIk5BTUVfQUxMQ0FQUyIgVmVyc2lvbiAwLjUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1tYXggKi8KK3N0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSWQgZm9yIHRoaXMgY2FyZCAqLworCQkJCQkJCS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KK3N0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiTkFNRV9BTExDQVBTIi4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIk5BTUVfQUxMQ0FQUyIuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICJOQU1FX0FMTENBUFMiLiIpOworCitzdGF0aWMgaW50IHNuZF91czEyMmxfY2FyZF91c2VkW1NORFJWX0NBUkRTXTsKKworCitzdGF0aWMgaW50IHVzMTIybF9jcmVhdGVfdXNibWlkaShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit7CisJc3RhdGljIHN0cnVjdCBzbmRfdXNiX21pZGlfZW5kcG9pbnRfaW5mbyBxdWlya19kYXRhID0geworCQkub3V0X2VwID0gNCwKKwkJLmluX2VwID0gMywKKwkJLm91dF9jYWJsZXMgPQkweDAwMSwKKwkJLmluX2NhYmxlcyA9CTB4MDAxCisJfTsKKwlzdGF0aWMgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgcXVpcmsgPSB7CisJCS52ZW5kb3JfbmFtZSA9CSJVUzEyMkwiLAorCQkucHJvZHVjdF9uYW1lID0JTkFNRV9BTExDQVBTLAorCQkuaWZudW0gPSAJMSwKKwkJLnR5cGUgPSBRVUlSS19NSURJX1VTMTIyTCwKKwkJLmRhdGEgPSAmcXVpcmtfZGF0YQorCX07CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IFVTMTIyTChjYXJkKS0+Y2hpcC5kZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKGRldiwgMSk7CisKKwlyZXR1cm4gc25kX3VzYl9jcmVhdGVfbWlkaV9pbnRlcmZhY2UoJlVTMTIyTChjYXJkKS0+Y2hpcCwKKwkJCQkJICAgICBpZmFjZSwgJnF1aXJrKTsKK30KKworLyoKKyAqIFdyYXBwZXIgZm9yIHVzYl9jb250cm9sX21zZygpLgorICogQWxsb2NhdGVzIGEgdGVtcCBidWZmZXIgdG8gcHJldmVudCBkbWFpbmcgZnJvbS90byB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyBpbnQgdXMxMjJsX2N0bF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkgIF9fdTggcmVxdWVzdCwgX191OCByZXF1ZXN0dHlwZSwKKwkJCSAgX191MTYgdmFsdWUsIF9fdTE2IGluZGV4LCB2b2lkICpkYXRhLAorCQkJICBfX3UxNiBzaXplLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgZXJyOworCXZvaWQgKmJ1ZiA9IE5VTEw7CisKKwlpZiAoc2l6ZSA+IDApIHsKKwkJYnVmID0ga21lbWR1cChkYXRhLCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCisJCQkgICAgICB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgdGltZW91dCk7CisJaWYgKHNpemUgPiAwKSB7CisJCW1lbWNweShkYXRhLCBidWYsIHNpemUpOworCQlrZnJlZShidWYpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBwdF9pbmZvX3NldChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1OCB2KQoreworCWludCByZXQ7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgICdJJywKKwkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIHYsIDAsIE5VTEwsIDAsIDEwMDApOworCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVpXG4iLCByZXQpOworfQorCitzdGF0aWMgdm9pZCB1c2Jfc3RyZWFtX2h3ZGVwX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCXN0cnVjdCB1czEyMmwgKnVzMTIybCA9IGFyZWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlhdG9taWNfaW5jKCZ1czEyMmwtPm1tYXBfY291bnQpOworCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVpXG4iLCBhdG9taWNfcmVhZCgmdXMxMjJsLT5tbWFwX2NvdW50KSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3N0cmVhbV9od2RlcF92bV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEsCisJCQkJICAgICBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICp2YWRkcjsKKwlzdHJ1Y3QgdXMxMjJsICp1czEyMmwgPSBhcmVhLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zdHJlYW0gKnM7CisKKwltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwlzID0gdXMxMjJsLT5zay5zOworCWlmICghcykKKwkJZ290byB1bmxvY2s7CisKKwlvZmZzZXQgPSB2bWYtPnBnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJaWYgKG9mZnNldCA8IFBBR0VfQUxJR04ocy0+cmVhZF9zaXplKSkKKwkJdmFkZHIgPSAoY2hhciAqKXMgKyBvZmZzZXQ7CisJZWxzZSB7CisJCW9mZnNldCAtPSBQQUdFX0FMSUdOKHMtPnJlYWRfc2l6ZSk7CisJCWlmIChvZmZzZXQgPj0gUEFHRV9BTElHTihzLT53cml0ZV9zaXplKSkKKwkJCWdvdG8gdW5sb2NrOworCisJCXZhZGRyID0gdXMxMjJsLT5zay53cml0ZV9wYWdlICsgb2Zmc2V0OworCX0KKwlwYWdlID0gdmlydF90b19wYWdlKHZhZGRyKTsKKworCWdldF9wYWdlKHBhZ2UpOworCW11dGV4X3VubG9jaygmdXMxMjJsLT5tdXRleCk7CisKKwl2bWYtPnBhZ2UgPSBwYWdlOworCisJcmV0dXJuIDA7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworfQorCitzdGF0aWMgdm9pZCB1c2Jfc3RyZWFtX2h3ZGVwX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlzdHJ1Y3QgdXMxMjJsICp1czEyMmwgPSBhcmVhLT52bV9wcml2YXRlX2RhdGE7CisJYXRvbWljX2RlYygmdXMxMjJsLT5tbWFwX2NvdW50KTsKKwlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICIlaVxuIiwgYXRvbWljX3JlYWQoJnVzMTIybC0+bW1hcF9jb3VudCkpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHVzYl9zdHJlYW1faHdkZXBfdm1fb3BzID0geworCS5vcGVuID0gdXNiX3N0cmVhbV9od2RlcF92bV9vcGVuLAorCS5mYXVsdCA9IHVzYl9zdHJlYW1faHdkZXBfdm1fZmF1bHQsCisJLmNsb3NlID0gdXNiX3N0cmVhbV9od2RlcF92bV9jbG9zZSwKK307CisKKworc3RhdGljIGludCB1c2Jfc3RyZWFtX2h3ZGVwX29wZW4oc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1czEyMmwJKnVzMTIybCA9IGh3LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOworCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVwICVwXG4iLCBodywgZmlsZSk7CisJaWYgKGh3LT51c2VkID49IDIpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXVzMTIybC0+Zmlyc3QpCisJCXVzMTIybC0+Zmlyc3QgPSBmaWxlOworCWlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzMTIybC0+Y2hpcC5kZXYsIDEpOworCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpZmFjZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3N0cmVhbV9od2RlcF9yZWxlYXNlKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXMxMjJsCSp1czEyMmwgPSBody0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9IHVzYl9pZm51bV90b19pZih1czEyMmwtPmNoaXAuZGV2LCAxKTsKKwlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICIlcCAlcFxuIiwgaHcsIGZpbGUpOworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpZmFjZSk7CisJaWYgKHVzMTIybC0+Zmlyc3QgPT0gZmlsZSkKKwkJdXMxMjJsLT5maXJzdCA9IE5VTEw7CisJbXV0ZXhfbG9jaygmdXMxMjJsLT5tdXRleCk7CisJaWYgKHVzMTIybC0+bWFzdGVyID09IGZpbGUpCisJCXVzMTIybC0+bWFzdGVyID0gdXMxMjJsLT5zbGF2ZTsKKworCXVzMTIybC0+c2xhdmUgPSBOVUxMOworCW11dGV4X3VubG9jaygmdXMxMjJsLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3N0cmVhbV9od2RlcF9tbWFwKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCXVuc2lnbmVkIGxvbmcJc2l6ZSA9IGFyZWEtPnZtX2VuZCAtIGFyZWEtPnZtX3N0YXJ0OworCXN0cnVjdCB1czEyMmwJKnVzMTIybCA9IGh3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IHVzYl9zdHJlYW0gKnM7CisJaW50IGVyciA9IDA7CisJYm9vbCByZWFkOworCisJb2Zmc2V0ID0gYXJlYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwlzID0gdXMxMjJsLT5zay5zOworCXJlYWQgPSBvZmZzZXQgPCBzLT5yZWFkX3NpemU7CisJaWYgKHJlYWQgJiYgYXJlYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQllcnIgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKwlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICIlbHUgJXVcbiIsIHNpemUsCisJCSAgICByZWFkID8gcy0+cmVhZF9zaXplIDogcy0+d3JpdGVfc2l6ZSk7CisJLyogaWYgdXNlcnNwYWNlIHRyaWVzIHRvIG1tYXAgYmV5b25kIGVuZCBvZiBvdXIgYnVmZmVyLCBmYWlsICovCisJaWYgKHNpemUgPiBQQUdFX0FMSUdOKHJlYWQgPyBzLT5yZWFkX3NpemUgOiBzLT53cml0ZV9zaXplKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1ID4gJXVcbiIsIHNpemUsCisJCQkgICByZWFkID8gcy0+cmVhZF9zaXplIDogcy0+d3JpdGVfc2l6ZSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWFyZWEtPnZtX29wcyA9ICZ1c2Jfc3RyZWFtX2h3ZGVwX3ZtX29wczsKKwlhcmVhLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwlhcmVhLT52bV9wcml2YXRlX2RhdGEgPSB1czEyMmw7CisJYXRvbWljX2luYygmdXMxMjJsLT5tbWFwX2NvdW50KTsKK291dDoKKwltdXRleF91bmxvY2soJnVzMTIybC0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNiX3N0cmVhbV9od2RlcF9wb2xsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB1czEyMmwJKnVzMTIybCA9IGh3LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9zdHJlYW0gKnMgPSB1czEyMmwtPnNrLnM7CisJdW5zaWduZWQJKnBvbGxlZDsKKwl1bnNpZ25lZCBpbnQJbWFzazsKKworCXBvbGxfd2FpdChmaWxlLCAmdXMxMjJsLT5zay5zbGVlcCwgd2FpdCk7CisKKwlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJY2FzZSB1c2Jfc3RyZWFtX3JlYWR5OgorCQlpZiAodXMxMjJsLT5maXJzdCA9PSBmaWxlKQorCQkJcG9sbGVkID0gJnMtPnBlcmlvZHNfcG9sbGVkOworCQllbHNlCisJCQlwb2xsZWQgPSAmdXMxMjJsLT5zZWNvbmRfcGVyaW9kc19wb2xsZWQ7CisJCWlmICgqcG9sbGVkICE9IHMtPnBlcmlvZHNfZG9uZSkgeworCQkJKnBvbGxlZCA9IHMtPnBlcmlvZHNfZG9uZTsKKwkJCW1hc2sgPSBQT0xMSU4gfCBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCQltYXNrID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWFzayA9IFBPTExJTiB8IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTEVSUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCB1czEyMmxfc3RvcChzdHJ1Y3QgdXMxMjJsICp1czEyMmwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1czEyMmwtPmNoaXAubWlkaV9saXN0KQorCQlzbmRfdXNibWlkaV9pbnB1dF9zdG9wKHApOworCisJdXNiX3N0cmVhbV9zdG9wKCZ1czEyMmwtPnNrKTsKKwl1c2Jfc3RyZWFtX2ZyZWUoJnVzMTIybC0+c2spOworfQorCitzdGF0aWMgaW50IHVzMTIybF9zZXRfc2FtcGxlX3JhdGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGVwID0gMHg4MTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbM107CisJaW50IGVycjsKKworCWRhdGFbMF0gPSByYXRlOworCWRhdGFbMV0gPSByYXRlID4+IDg7CisJZGF0YVsyXSA9IHJhdGUgPj4gMTY7CisJZXJyID0gdXMxMjJsX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgU0VUX0NVUiwKKwkJCSAgICAgVVNCX1RZUEVfQ0xBU1N8VVNCX1JFQ0lQX0VORFBPSU5UfFVTQl9ESVJfT1VULAorCQkJICAgICBTQU1QTElOR19GUkVRX0NPTlRST0wgPDwgOCwgZXAsIGRhdGEsIDMsIDEwMDApOworCWlmIChlcnIgPCAwKQorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwIDB4JXhcbiIsCisJCQkgICBkZXYtPmRldm51bSwgcmF0ZSwgZXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIHVzMTIybF9zdGFydChzdHJ1Y3QgdXMxMjJsICp1czEyMmwsCisJCQkgdW5zaWduZWQgcmF0ZSwgdW5zaWduZWQgcGVyaW9kX2ZyYW1lcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBlcnI7CisJdW5zaWduZWQgdXNlX3BhY2tzaXplID0gMDsKKwlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworCWlmICh1czEyMmwtPmNoaXAuZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgeworCQkvKiBUaGUgdXMtMTIybCdzIGRlc2NyaXB0b3IgZGVmYXVsdHMgdG8gaXNvIG1heF9wYWNrc2l6ZSA3OCwKKwkJICAgd2hpY2ggaXNuJ3QgbmVlZGVkIGZvciBzYW1wbGVyYXRlcyA8PSA0ODAwMC4KKwkJICAgTGV0cyBzYXZlIHNvbWUgbWVtb3J5OgorCQkqLworCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSA0NDEwMDoKKwkJCXVzZV9wYWNrc2l6ZSA9IDM2OworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDA6CisJCQl1c2VfcGFja3NpemUgPSA0MjsKKwkJCWJyZWFrOworCQljYXNlIDg4MjAwOgorCQkJdXNlX3BhY2tzaXplID0gNzI7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXVzYl9zdHJlYW1fbmV3KCZ1czEyMmwtPnNrLCB1czEyMmwtPmNoaXAuZGV2LCAxLCAyLAorCQkJICAgIHJhdGUsIHVzZV9wYWNrc2l6ZSwgcGVyaW9kX2ZyYW1lcywgNikpCisJCWdvdG8gb3V0OworCisJZXJyID0gdXMxMjJsX3NldF9zYW1wbGVfcmF0ZSh1czEyMmwtPmNoaXAuZGV2LCByYXRlKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1czEyMmxfc3RvcCh1czEyMmwpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1czEyMmxfc2V0X3NhbXBsZV9yYXRlIGVycm9yIFxuIik7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSB1c2Jfc3RyZWFtX3N0YXJ0KCZ1czEyMmwtPnNrKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1czEyMmxfc3RvcCh1czEyMmwpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1czEyMmxfc3RhcnQgZXJyb3IgJWkgXG4iLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisJbGlzdF9mb3JfZWFjaChwLCAmdXMxMjJsLT5jaGlwLm1pZGlfbGlzdCkKKwkJc25kX3VzYm1pZGlfaW5wdXRfc3RhcnQocCk7CisJc3VjY2VzcyA9IHRydWU7CitvdXQ6CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3N0cmVhbV9od2RlcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtX2NvbmZpZyAqY2ZnOworCXN0cnVjdCB1czEyMmwgKnVzMTIybCA9IGh3LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbWluX3BlcmlvZF9mcmFtZXM7CisJaW50IGVyciA9IDA7CisJYm9vbCBoaWdoX3NwZWVkOworCisJaWYgKGNtZCAhPSBTTkRSVl9VU0JfU1RSRUFNX0lPQ1RMX1NFVF9QQVJBTVMpCisJCXJldHVybiAtRU5PVFRZOworCisJY2ZnID0ga21hbGxvYyhzaXplb2YoKmNmZyksIEdGUF9LRVJORUwpOworCWlmICghY2ZnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjZmcsICh2b2lkICopYXJnLCBzaXplb2YoKmNmZykpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZnJlZTsKKwl9CisJaWYgKGNmZy0+dmVyc2lvbiAhPSBVU0JfU1RSRUFNX0lOVEVSRkFDRV9WRVJTSU9OKSB7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBmcmVlOworCX0KKwloaWdoX3NwZWVkID0gdXMxMjJsLT5jaGlwLmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0g7CisJaWYgKChjZmctPnNhbXBsZV9yYXRlICE9IDQ0MTAwICYmIGNmZy0+c2FtcGxlX3JhdGUgIT0gNDgwMDAgICYmCisJICAgICAoIWhpZ2hfc3BlZWQgfHwKKwkgICAgICAoY2ZnLT5zYW1wbGVfcmF0ZSAhPSA4ODIwMCAmJiBjZmctPnNhbXBsZV9yYXRlICE9IDk2MDAwKSkpIHx8CisJICAgIGNmZy0+ZnJhbWVfc2l6ZSAhPSA2IHx8CisJICAgIGNmZy0+cGVyaW9kX2ZyYW1lcyA+IDB4MzAwMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZyZWU7CisJfQorCXN3aXRjaCAoY2ZnLT5zYW1wbGVfcmF0ZSkgeworCWNhc2UgNDQxMDA6CisJCW1pbl9wZXJpb2RfZnJhbWVzID0gNDg7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCW1pbl9wZXJpb2RfZnJhbWVzID0gNTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1pbl9wZXJpb2RfZnJhbWVzID0gMTA0OworCQlicmVhazsKKwl9CisJaWYgKCFoaWdoX3NwZWVkKQorCQltaW5fcGVyaW9kX2ZyYW1lcyA8PD0gMTsKKwlpZiAoY2ZnLT5wZXJpb2RfZnJhbWVzIDwgbWluX3BlcmlvZF9mcmFtZXMpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmcmVlOworCX0KKworCXNuZF9wb3dlcl93YWl0KGh3LT5jYXJkLCBTTkRSVl9DVExfUE9XRVJfRDApOworCisJbXV0ZXhfbG9jaygmdXMxMjJsLT5tdXRleCk7CisJaWYgKCF1czEyMmwtPm1hc3RlcikKKwkJdXMxMjJsLT5tYXN0ZXIgPSBmaWxlOworCWVsc2UgaWYgKHVzMTIybC0+bWFzdGVyICE9IGZpbGUpIHsKKwkJaWYgKG1lbWNtcChjZmcsICZ1czEyMmwtPnNrLnMtPmNmZywgc2l6ZW9mKCpjZmcpKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJCXVzMTIybC0+c2xhdmUgPSBmaWxlOworCX0KKwlpZiAoIXVzMTIybC0+c2sucyB8fAorCSAgICBtZW1jbXAoY2ZnLCAmdXMxMjJsLT5zay5zLT5jZmcsIHNpemVvZigqY2ZnKSkgfHwKKwkgICAgdXMxMjJsLT5zay5zLT5zdGF0ZSA9PSB1c2Jfc3RyZWFtX3hydW4pIHsKKwkJdXMxMjJsX3N0b3AodXMxMjJsKTsKKwkJaWYgKCF1czEyMmxfc3RhcnQodXMxMjJsLCBjZmctPnNhbXBsZV9yYXRlLCBjZmctPnBlcmlvZF9mcmFtZXMpKQorCQkJZXJyID0gLUVJTzsKKwkJZWxzZQorCQkJZXJyID0gMTsKKwl9Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ1czEyMmwtPm11dGV4KTsKK2ZyZWU6CisJa2ZyZWUoY2ZnKTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIFNORF9VU0JfU1RSRUFNX0lEICJVU0IgU1RSRUFNIgorc3RhdGljIGludCB1c2Jfc3RyZWFtX2h3ZGVwX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc25kX2h3ZGVwICpodzsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gVVMxMjJMKGNhcmQpLT5jaGlwLmRldjsKKworCWVyciA9IHNuZF9od2RlcF9uZXcoY2FyZCwgU05EX1VTQl9TVFJFQU1fSUQsIDAsICZodyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlody0+aWZhY2UgPSBTTkRSVl9IV0RFUF9JRkFDRV9VU0JfU1RSRUFNOworCWh3LT5wcml2YXRlX2RhdGEgPSBVUzEyMkwoY2FyZCk7CisJaHctPm9wcy5vcGVuID0gdXNiX3N0cmVhbV9od2RlcF9vcGVuOworCWh3LT5vcHMucmVsZWFzZSA9IHVzYl9zdHJlYW1faHdkZXBfcmVsZWFzZTsKKwlody0+b3BzLmlvY3RsID0gdXNiX3N0cmVhbV9od2RlcF9pb2N0bDsKKwlody0+b3BzLmlvY3RsX2NvbXBhdCA9IHVzYl9zdHJlYW1faHdkZXBfaW9jdGw7CisJaHctPm9wcy5tbWFwID0gdXNiX3N0cmVhbV9od2RlcF9tbWFwOworCWh3LT5vcHMucG9sbCA9IHVzYl9zdHJlYW1faHdkZXBfcG9sbDsKKworCXNwcmludGYoaHctPm5hbWUsICIvcHJvYy9idXMvdXNiLyUwM2QvJTAzZC9od2RlcHBjbSIsCisJCWRldi0+YnVzLT5idXNudW0sIGRldi0+ZGV2bnVtKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgYm9vbCB1czEyMmxfY3JlYXRlX2NhcmQoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCWludCBlcnI7CisJc3RydWN0IHVzMTIybCAqdXMxMjJsID0gVVMxMjJMKGNhcmQpOworCisJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UodXMxMjJsLT5jaGlwLmRldiwgMSwgMSk7CisJaWYgKGVycikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciBcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHRfaW5mb19zZXQodXMxMjJsLT5jaGlwLmRldiwgMHgxMSk7CisJcHRfaW5mb19zZXQodXMxMjJsLT5jaGlwLmRldiwgMHgxMCk7CisKKwlpZiAoIXVzMTIybF9zdGFydCh1czEyMmwsIDQ0MTAwLCAyNTYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwllcnIgPSB1czEyMmxfY3JlYXRlX3VzYm1pZGkoY2FyZCk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidXMxMjJsX2NyZWF0ZV91c2JtaWRpIGVycm9yICVpIFxuIiwgZXJyKTsKKwkJdXMxMjJsX3N0b3AodXMxMjJsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwllcnIgPSB1c2Jfc3RyZWFtX2h3ZGVwX25ldyhjYXJkKTsKKwlpZiAoZXJyIDwgMCkgeworLyogcmVsZWFzZSB0aGUgbWlkaSByZXNvdXJjZXMgKi8KKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJbGlzdF9mb3JfZWFjaChwLCAmdXMxMjJsLT5jaGlwLm1pZGlfbGlzdCkKKwkJCXNuZF91c2JtaWRpX2Rpc2Nvbm5lY3QocCk7CisKKwkJdXMxMjJsX3N0b3AodXMxMjJsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfY2FyZCAqdXN4MnlfY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQJCWRldjsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJZm9yIChkZXYgPSAwOyBkZXYgPCBTTkRSVl9DQVJEUzsgKytkZXYpCisJCWlmIChlbmFibGVbZGV2XSAmJiAhc25kX3VzMTIybF9jYXJkX3VzZWRbZGV2XSkKKwkJCWJyZWFrOworCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCisJCXJldHVybiBOVUxMOworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCB1czEyMmwpKTsKKwlpZiAoIWNhcmQpCisJCXJldHVybiBOVUxMOworCXNuZF91czEyMmxfY2FyZF91c2VkW1VTMTIyTChjYXJkKS0+Y2hpcC5pbmRleCA9IGRldl0gPSAxOworCisJVVMxMjJMKGNhcmQpLT5jaGlwLmRldiA9IGRldmljZTsKKwlVUzEyMkwoY2FyZCktPmNoaXAuY2FyZCA9IGNhcmQ7CisJbXV0ZXhfaW5pdCgmVVMxMjJMKGNhcmQpLT5tdXRleCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmVVMxMjJMKGNhcmQpLT5zay5zbGVlcCk7CisJSU5JVF9MSVNUX0hFQUQoJlVTMTIyTChjYXJkKS0+Y2hpcC5taWRpX2xpc3QpOworCXN0cmNweShjYXJkLT5kcml2ZXIsICJVU0IgIk5BTUVfQUxMQ0FQUyIiKTsKKwlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIlRBU0NBTSAiTkFNRV9BTExDQVBTIiIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyAoJXg6JXggaWYgJWQgYXQgJTAzZC8lMDNkKSIsCisJCWNhcmQtPnNob3J0bmFtZSwKKwkJbGUxNl90b19jcHUoZGV2aWNlLT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJbGUxNl90b19jcHUoZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCTAsCisJCVVTMTIyTChjYXJkKS0+Y2hpcC5kZXYtPmJ1cy0+YnVzbnVtLAorCQlVUzEyMkwoY2FyZCktPmNoaXAuZGV2LT5kZXZudW0KKwkJKTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZpY2UtPmRldik7CisJcmV0dXJuIGNhcmQ7Cit9CisKK3N0YXRpYyB2b2lkICp1czEyMmxfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmljZV9pZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSB1c3gyeV9jcmVhdGVfY2FyZChkZXZpY2UpOworCisJaWYgKCFjYXJkKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghdXMxMjJsX2NyZWF0ZV9jYXJkKGNhcmQpIHx8CisJICAgIHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpIDwgMCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl1c2JfZ2V0X2RldihkZXZpY2UpOworCXJldHVybiBjYXJkOworfQorCitzdGF0aWMgaW50IHNuZF91czEyMmxfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzbmRfcHJpbnRkZChLRVJOX0RFQlVHIiVwOiVpXG4iLAorCQkgICAgaW50ZiwgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwljYXJkID0gdXMxMjJsX3VzYl9wcm9iZSh1c2JfZ2V0X2ludGYoaW50ZiksIGlkKTsKKworCWlmIChjYXJkKSB7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FyZCk7CisJCXJldHVybiAwOworCX0KKworCXVzYl9wdXRfaW50ZihpbnRmKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgc25kX3VzMTIybF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgdXMxMjJsICp1czEyMmw7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWNhcmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWlmICghY2FyZCkKKwkJcmV0dXJuOworCisJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKworCXVzMTIybCA9IFVTMTIyTChjYXJkKTsKKwltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwl1czEyMmxfc3RvcCh1czEyMmwpOworCW11dGV4X3VubG9jaygmdXMxMjJsLT5tdXRleCk7CisJdXMxMjJsLT5jaGlwLnNodXRkb3duID0gMTsKKworLyogcmVsZWFzZSB0aGUgbWlkaSByZXNvdXJjZXMgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZ1czEyMmwtPmNoaXAubWlkaV9saXN0KSB7CisJCXNuZF91c2JtaWRpX2Rpc2Nvbm5lY3QocCk7CisJfQorCisJdXNiX3B1dF9pbnRmKGludGYpOworCXVzYl9wdXRfZGV2KFVTMTIyTChjYXJkKS0+Y2hpcC5kZXYpOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZ1czEyMmwtPm1tYXBfY291bnQpKQorCQltc2xlZXAoNTAwKTsKKworCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3VzMTIybF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHVzMTIybCAqdXMxMjJsOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwljYXJkID0gZGV2X2dldF9kcnZkYXRhKCZpbnRmLT5kZXYpOworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CisJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCisJdXMxMjJsID0gVVMxMjJMKGNhcmQpOworCWlmICghdXMxMjJsKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2gocCwgJnVzMTIybC0+Y2hpcC5taWRpX2xpc3QpCisJCXNuZF91c2JtaWRpX2lucHV0X3N0b3AocCk7CisKKwltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwl1c2Jfc3RyZWFtX3N0b3AoJnVzMTIybC0+c2spOworCW11dGV4X3VubG9jaygmdXMxMjJsLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdXMxMjJsX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHVzMTIybCAqdXMxMjJsOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVycjsKKworCWNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisJaWYgKCFjYXJkKQorCQlyZXR1cm4gMDsKKworCXVzMTIybCA9IFVTMTIyTChjYXJkKTsKKwlpZiAoIXVzMTIybCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwkvKiBuZWVkZWQsIGRvZXNuJ3QgcmVzdGFydCB3aXRob3V0OiAqLworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzMTIybC0+Y2hpcC5kZXYsIDEsIDEpOworCWlmIChlcnIpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidXNiX3NldF9pbnRlcmZhY2UgZXJyb3IgXG4iKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcHRfaW5mb19zZXQodXMxMjJsLT5jaGlwLmRldiwgMHgxMSk7CisJcHRfaW5mb19zZXQodXMxMjJsLT5jaGlwLmRldiwgMHgxMCk7CisKKwllcnIgPSB1czEyMmxfc2V0X3NhbXBsZV9yYXRlKHVzMTIybC0+Y2hpcC5kZXYsCisJCQkJICAgICB1czEyMmwtPnNrLnMtPmNmZy5zYW1wbGVfcmF0ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidXMxMjJsX3NldF9zYW1wbGVfcmF0ZSBlcnJvciBcbiIpOworCQlnb3RvIHVubG9jazsKKwl9CisJZXJyID0gdXNiX3N0cmVhbV9zdGFydCgmdXMxMjJsLT5zayk7CisJaWYgKGVycikKKwkJZ290byB1bmxvY2s7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1czEyMmwtPmNoaXAubWlkaV9saXN0KQorCQlzbmRfdXNibWlkaV9pbnB1dF9zdGFydChwKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJnVzMTIybC0+bXV0ZXgpOworCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc25kX3VzMTIybF91c2JfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5tYXRjaF9mbGFncyA9CVVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCQkuaWRWZW5kb3IgPQkweDA2NDQsCisJCS5pZFByb2R1Y3QgPQlVU0JfSURfVVMxMjJMCisJfSwKKy8qICAJeyAqLwkJLyogVVMtMTQ0IG1heWJlIHdvcmtzIHdoZW4gQFVTQjEuMS4gVW50ZXN0ZWQuICovCisvKiAJCS5tYXRjaF9mbGFncyA9CVVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLCAqLworLyogCQkuaWRWZW5kb3IgPQkweDA2NDQsICovCisvKiAJCS5pZFByb2R1Y3QgPQlVU0JfSURfVVMxNDQgKi8KKy8qIAl9LCAqLworCXsgLyogdGVybWluYXRvciAqLyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc25kX3VzMTIybF91c2JfaWRfdGFibGUpOworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNuZF91czEyMmxfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9CQkic25kLXVzYi11czEyMmwiLAorCS5wcm9iZSA9CXNuZF91czEyMmxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlzbmRfdXMxMjJsX2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQlzbmRfdXMxMjJsX3N1c3BlbmQsCisJLnJlc3VtZSA9CXNuZF91czEyMmxfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPQlzbmRfdXMxMjJsX3Jlc3VtZSwKKwkuaWRfdGFibGUgPQlzbmRfdXMxMjJsX3VzYl9pZF90YWJsZSwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHNuZF91czEyMmxfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZzbmRfdXMxMjJsX3VzYl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc25kX3VzMTIybF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzbmRfdXMxMjJsX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzbmRfdXMxMjJsX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoc25kX3VzMTIybF9tb2R1bGVfZXhpdCkKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuaCBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDEwYzRiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgVVMxMjJMX0gKKyNkZWZpbmUgVVMxMjJMX0gKKworCitzdHJ1Y3QgdXMxMjJsIHsKKwlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAJY2hpcDsKKwlpbnQJCQlzdHJpZGU7CisJc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsIHNrOworCisJc3RydWN0IG11dGV4CQltdXRleDsKKwlzdHJ1Y3QgZmlsZQkJKmZpcnN0OworCXVuc2lnbmVkCQlzZWNvbmRfcGVyaW9kc19wb2xsZWQ7CisJc3RydWN0IGZpbGUJCSptYXN0ZXI7CisJc3RydWN0IGZpbGUJCSpzbGF2ZTsKKworCWF0b21pY190CQltbWFwX2NvdW50OworfTsKKworCisjZGVmaW5lIFVTMTIyTChjKSAoKHN0cnVjdCB1czEyMmwgKikoYyktPnByaXZhdGVfZGF0YSkKKworI2RlZmluZSBOQU1FX0FMTENBUFMgIlVTLTEyMkwiCisKKyNkZWZpbmUgVVNCX0lEX1VTMTIyTCAweDgwMEUKKyNkZWZpbmUgVVNCX0lEX1VTMTQ0IDB4ODAwRgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2Jfc3RyZWFtLmMgYi9zb3VuZC91c2IvdXN4MnkvdXNiX3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjNjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvdXN4MnkvdXNiX3N0cmVhbS5jCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEthcnN0ZW4gV2llc2UgPGZ6dUB3ZW1nZWhvZXJ0ZGVyc3RhYXQuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNiX3N0cmVhbS5oIgorCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdGF0aWMgdW5zaWduZWQgdXNiX3N0cmVhbV9uZXh0X3BhY2tldF9zaXplKHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2spCit7CisJc3RydWN0IHVzYl9zdHJlYW0gKnMgPSBzay0+czsKKwlzay0+b3V0X3BoYXNlX3BlZWtlZCA9IChzay0+b3V0X3BoYXNlICYgMHhmZmZmKSArIHNrLT5mcmVxbjsKKwlyZXR1cm4gKHNrLT5vdXRfcGhhc2VfcGVla2VkID4+IDE2KSAqIHMtPmNmZy5mcmFtZV9zaXplOworfQorCitzdGF0aWMgdm9pZCBwbGF5YmFja19wcmVwX2ZyZXFuKHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2ssIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3N0cmVhbSAqcyA9IHNrLT5zOworCXVuc2lnbmVkIGwgPSAwOworCWludCBwYWNrOworCisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0JdXNiX3N0cmVhbV9uZXh0X3BhY2tldF9zaXplKHNrKTsKKwlzay0+b3V0X3BoYXNlID0gc2stPm91dF9waGFzZV9wZWVrZWQ7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGg7CisKKwlmb3IgKHBhY2sgPSAxOyBwYWNrIDwgc2stPm5fb19wczsgcGFjaysrKSB7CisJCWwgPSB1c2Jfc3RyZWFtX25leHRfcGFja2V0X3NpemUoc2spOworCQlpZiAocy0+aWRsZV9vdXRzaXplICsgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICsgbCA+CisJCSAgICBzLT5wZXJpb2Rfc2l6ZSkKKwkJCWdvdG8gY2hlY2s7CisKKwkJc2stPm91dF9waGFzZSA9IHNrLT5vdXRfcGhhc2VfcGVla2VkOworCQl1cmItPmlzb19mcmFtZV9kZXNjW3BhY2tdLm9mZnNldCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1twYWNrXS5sZW5ndGggPSBsOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggKz0gbDsKKwl9CisJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiJWlcbiIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisKK2NoZWNrOgorCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBwYWNrOworCXMtPmlkbGVfb3V0c2l6ZSArPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggLSBzLT5wZXJpb2Rfc2l6ZTsKKwlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJpZGxlPSVpIHVsPSVpIHBzPSVpXG4iLCBzLT5pZGxlX291dHNpemUsCisJCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHMtPnBlcmlvZF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9waXBlX3VyYnMoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzaywgdW5zaWduZWQgdXNlX3BhY2tzaXplLAorCQkJICAgc3RydWN0IHVyYiAqKnVyYnMsIGNoYXIgKnRyYW5zZmVyLAorCQkJICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IHBpcGUpCit7CisJaW50IHUsIHA7CisJaW50IG1heHBhY2tldCA9IHVzZV9wYWNrc2l6ZSA/CisJCXVzZV9wYWNrc2l6ZSA6IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJaW50IHRyYW5zZmVyX2xlbmd0aCA9IG1heHBhY2tldCAqIHNrLT5uX29fcHM7CisKKwlmb3IgKHUgPSAwOyB1IDwgVVNCX1NUUkVBTV9OVVJCUzsKKwkgICAgICsrdSwgdHJhbnNmZXIgKz0gdHJhbnNmZXJfbGVuZ3RoKSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHVyYnNbdV07CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpkZXNjOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyOworCQl1cmItPmRldiA9IGRldjsKKwkJdXJiLT5waXBlID0gcGlwZTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHNrLT5uX29fcHM7CisJCXVyYi0+Y29udGV4dCA9IHNrOworCQl1cmItPmludGVydmFsID0gMTsKKwkJaWYgKHVzYl9waXBlb3V0KHBpcGUpKQorCQkJY29udGludWU7CisKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdHJhbnNmZXJfbGVuZ3RoOworCQlkZXNjID0gdXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJZGVzYy0+b2Zmc2V0ID0gMDsKKwkJZGVzYy0+bGVuZ3RoID0gbWF4cGFja2V0OworCQlmb3IgKHAgPSAxOyBwIDwgc2stPm5fb19wczsgKytwKSB7CisJCQlkZXNjW3BdLm9mZnNldCA9IGRlc2NbcCAtIDFdLm9mZnNldCArIG1heHBhY2tldDsKKwkJCWRlc2NbcF0ubGVuZ3RoID0gbWF4cGFja2V0OworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X3VyYnMoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzaywgdW5zaWduZWQgdXNlX3BhY2tzaXplLAorCQkgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaW5fcGlwZSwgaW50IG91dF9waXBlKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtCSpzID0gc2stPnM7CisJY2hhcgkJCSppbmRhdGEgPSAoY2hhciAqKXMgKyBzaXplb2YoKnMpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2Jfc3RyZWFtX3BhY2tldCkgKgorCQkJCQlzLT5pbnBhY2tldHM7CisJaW50CQkJdTsKKworCWZvciAodSA9IDA7IHUgPCBVU0JfU1RSRUFNX05VUkJTOyArK3UpIHsKKwkJc2stPmludXJiW3VdID0gdXNiX2FsbG9jX3VyYihzay0+bl9vX3BzLCBHRlBfS0VSTkVMKTsKKwkJc2stPm91dHVyYlt1XSA9IHVzYl9hbGxvY191cmIoc2stPm5fb19wcywgR0ZQX0tFUk5FTCk7CisJfQorCisJaW5pdF9waXBlX3VyYnMoc2ssIHVzZV9wYWNrc2l6ZSwgc2stPmludXJiLCBpbmRhdGEsIGRldiwgaW5fcGlwZSk7CisJaW5pdF9waXBlX3VyYnMoc2ssIHVzZV9wYWNrc2l6ZSwgc2stPm91dHVyYiwgc2stPndyaXRlX3BhZ2UsIGRldiwKKwkJICAgICAgIG91dF9waXBlKTsKK30KKworCisvKgorICogY29udmVydCBhIHNhbXBsaW5nIHJhdGUgaW50byBvdXIgZnVsbCBzcGVlZCBmb3JtYXQgKGZzLzEwMDAgaW4gUTE2LjE2KQorICogdGhpcyB3aWxsIG92ZXJmbG93IGF0IGFwcHJveCA1MjQga0h6CisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X3VzYl9mdWxsX3NwZWVkX3JhdGUodW5zaWduZWQgcmF0ZSkKK3sKKwlyZXR1cm4gKChyYXRlIDw8IDEzKSArIDYyKSAvIDEyNTsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gVVNCIGhpZ2ggc3BlZWQgZm9ybWF0IChmcy84MDAwIGluIFExNi4xNikKKyAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3ggNCBNSHoKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfdXNiX2hpZ2hfc3BlZWRfcmF0ZSh1bnNpZ25lZCByYXRlKQoreworCXJldHVybiAoKHJhdGUgPDwgMTApICsgNjIpIC8gMTI1OworfQorCit2b2lkIHVzYl9zdHJlYW1fZnJlZShzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtICpzOworCXVuc2lnbmVkIHU7CisKKwlmb3IgKHUgPSAwOyB1IDwgVVNCX1NUUkVBTV9OVVJCUzsgKyt1KSB7CisJCXVzYl9mcmVlX3VyYihzay0+aW51cmJbdV0pOworCQlzay0+aW51cmJbdV0gPSBOVUxMOworCQl1c2JfZnJlZV91cmIoc2stPm91dHVyYlt1XSk7CisJCXNrLT5vdXR1cmJbdV0gPSBOVUxMOworCX0KKworCXMgPSBzay0+czsKKwlpZiAoIXMpCisJCXJldHVybjsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc2stPndyaXRlX3BhZ2UsIGdldF9vcmRlcihzLT53cml0ZV9zaXplKSk7CisJc2stPndyaXRlX3BhZ2UgPSBOVUxMOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcywgZ2V0X29yZGVyKHMtPnJlYWRfc2l6ZSkpOworCXNrLT5zID0gTlVMTDsKK30KKworc3RydWN0IHVzYl9zdHJlYW0gKnVzYl9zdHJlYW1fbmV3KHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2ssCisJCQkJICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW5fZW5kcG9pbnQsIHVuc2lnbmVkIG91dF9lbmRwb2ludCwKKwkJCQkgIHVuc2lnbmVkIHNhbXBsZV9yYXRlLCB1bnNpZ25lZCB1c2VfcGFja3NpemUsCisJCQkJICB1bnNpZ25lZCBwZXJpb2RfZnJhbWVzLCB1bnNpZ25lZCBmcmFtZV9zaXplKQoreworCWludCBwYWNrZXRzLCBtYXhfcGFja3NpemU7CisJaW50IGluX3BpcGUsIG91dF9waXBlOworCWludCByZWFkX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzYl9zdHJlYW0pOworCWludCB3cml0ZV9zaXplOworCWludCB1c2JfZnJhbWVzID0gZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCA/IDgwMDAgOiAxMDAwOworCWludCBwZzsKKworCWluX3BpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZGV2LCBpbl9lbmRwb2ludCk7CisJb3V0X3BpcGUgPSB1c2Jfc25kaXNvY3BpcGUoZGV2LCBvdXRfZW5kcG9pbnQpOworCisJbWF4X3BhY2tzaXplID0gdXNlX3BhY2tzaXplID8KKwkJdXNlX3BhY2tzaXplIDogdXNiX21heHBhY2tldChkZXYsIGluX3BpcGUsIDApOworCisJLyoKKwkJdF9wZXJpb2QgPSBwZXJpb2RfZnJhbWVzIC8gc2FtcGxlX3JhdGUKKwkJaXNvX3BhY2tzID0gdF9wZXJpb2QgLyB0X2lzb19mcmFtZQorCQkJPSAocGVyaW9kX2ZyYW1lcyAvIHNhbXBsZV9yYXRlKSAqICgxIC8gdF9pc29fZnJhbWUpCisJKi8KKworCXBhY2tldHMgPSBwZXJpb2RfZnJhbWVzICogdXNiX2ZyYW1lcyAvIHNhbXBsZV9yYXRlICsgMTsKKworCWlmIChkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlwYWNrZXRzID0gKHBhY2tldHMgKyA3KSAmIH43OworCisJcmVhZF9zaXplICs9IHBhY2tldHMgKiBVU0JfU1RSRUFNX1VSQkRFUFRIICoKKwkJKG1heF9wYWNrc2l6ZSArIHNpemVvZihzdHJ1Y3QgdXNiX3N0cmVhbV9wYWNrZXQpKTsKKworCW1heF9wYWNrc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBvdXRfcGlwZSwgMSk7CisJd3JpdGVfc2l6ZSA9IG1heF9wYWNrc2l6ZSAqIHBhY2tldHMgKiBVU0JfU1RSRUFNX1VSQkRFUFRIOworCisJaWYgKHJlYWRfc2l6ZSA+PSAyNTYqUEFHRV9TSVpFIHx8IHdyaXRlX3NpemUgPj0gMjU2KlBBR0VfU0laRSkgeworCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiYSBzaXplIGV4Y2VlZHMgMTI4KlBBR0VfU0laRVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXBnID0gZ2V0X29yZGVyKHJlYWRfc2l6ZSk7CisJc2stPnMgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfQ09NUHxfX0dGUF9aRVJPLCBwZyk7CisJaWYgKCFzay0+cykgeworCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY291bGRuJ3QgX19nZXRfZnJlZV9wYWdlcygpXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXNrLT5zLT5jZmcudmVyc2lvbiA9IFVTQl9TVFJFQU1fSU5URVJGQUNFX1ZFUlNJT047CisKKwlzay0+cy0+cmVhZF9zaXplID0gcmVhZF9zaXplOworCisJc2stPnMtPmNmZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworCXNrLT5zLT5jZmcuZnJhbWVfc2l6ZSA9IGZyYW1lX3NpemU7CisJc2stPm5fb19wcyA9IHBhY2tldHM7CisJc2stPnMtPmlucGFja2V0cyA9IHBhY2tldHMgKiBVU0JfU1RSRUFNX1VSQkRFUFRIOworCXNrLT5zLT5jZmcucGVyaW9kX2ZyYW1lcyA9IHBlcmlvZF9mcmFtZXM7CisJc2stPnMtPnBlcmlvZF9zaXplID0gZnJhbWVfc2l6ZSAqIHBlcmlvZF9mcmFtZXM7CisKKwlzay0+cy0+d3JpdGVfc2l6ZSA9IHdyaXRlX3NpemU7CisJcGcgPSBnZXRfb3JkZXIod3JpdGVfc2l6ZSk7CisKKwlzay0+d3JpdGVfcGFnZSA9CisJCSh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX0NPTVB8X19HRlBfWkVSTywgcGcpOworCWlmICghc2stPndyaXRlX3BhZ2UpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImNvdWxkbid0IF9fZ2V0X2ZyZWVfcGFnZXMoKVxuIik7CisJCXVzYl9zdHJlYW1fZnJlZShzayk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IGluIDE2LjE2IGZvcm1hdCAqLworCWlmIChkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMKQorCQlzay0+ZnJlcW4gPSBnZXRfdXNiX2Z1bGxfc3BlZWRfcmF0ZShzYW1wbGVfcmF0ZSk7CisJZWxzZQorCQlzay0+ZnJlcW4gPSBnZXRfdXNiX2hpZ2hfc3BlZWRfcmF0ZShzYW1wbGVfcmF0ZSk7CisKKwlpbml0X3VyYnMoc2ssIHVzZV9wYWNrc2l6ZSwgZGV2LCBpbl9waXBlLCBvdXRfcGlwZSk7CisJc2stPnMtPnN0YXRlID0gdXNiX3N0cmVhbV9zdG9wcGVkOworb3V0OgorCXJldHVybiBzay0+czsKK30KKworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGljIGJvb2wgYmFsYW5jZV9jaGVjayhzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJYm9vbCByOworCWlmICh1bmxpa2VseSh1cmItPnN0YXR1cykpIHsKKwkJaWYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04gJiYgdXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkKKwkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJzdGF0dXM9JWlcbiIsIHVyYi0+c3RhdHVzKTsKKwkJc2stPmlzb19mcmFtZV9iYWxhbmNlID0gMHg3RkZGRkZGRjsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyID0gc2stPmlzb19mcmFtZV9iYWxhbmNlID09IDA7CisJaWYgKCFyKQorCQlzay0+aV91cmIgPSB1cmI7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBib29sIGJhbGFuY2VfcGxheWJhY2soc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzaywgc3RydWN0IHVyYiAqdXJiKQoreworCXNrLT5pc29fZnJhbWVfYmFsYW5jZSArPSB1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCXJldHVybiBiYWxhbmNlX2NoZWNrKHNrLCB1cmIpOworfQorCitzdGF0aWMgYm9vbCBiYWxhbmNlX2NhcHR1cmUoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzaywgc3RydWN0IHVyYiAqdXJiKQoreworCXNrLT5pc29fZnJhbWVfYmFsYW5jZSAtPSB1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCXJldHVybiBiYWxhbmNlX2NoZWNrKHNrLCB1cmIpOworfQorCitzdGF0aWMgdm9pZCBzdWJzX3NldF9jb21wbGV0ZShzdHJ1Y3QgdXJiICoqdXJicywgdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgdXJiICopKQoreworCWludCB1OworCisJZm9yICh1ID0gMDsgdSA8IFVTQl9TVFJFQU1fTlVSQlM7IHUrKykgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSB1cmJzW3VdOworCQl1cmItPmNvbXBsZXRlID0gY29tcGxldGU7CisJfQorfQorCitpbnQgdXNiX3N0cmVhbV9wcmVwYXJlX3BsYXliYWNrKHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2ssIHN0cnVjdCB1cmIgKmludXJiKQoreworCXN0cnVjdCB1c2Jfc3RyZWFtICpzID0gc2stPnM7CisJc3RydWN0IHVyYiAqaW87CisJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlkLCAqb2Q7CisJaW50IHAsIGwgPSAwOworCisJaW8gPSBzay0+aWRsZV9vdXR1cmI7CisJb2QgPSBpby0+aXNvX2ZyYW1lX2Rlc2M7CisJaW8tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAwOworCisJZm9yIChwID0gMDsgcy0+c3luY19wYWNrZXQgPCAwOyArK3AsICsrcy0+c3luY19wYWNrZXQpIHsKKwkJc3RydWN0IHVyYiAqaWkgPSBzay0+Y29tcGxldGVkX2ludXJiOworCQlpZCA9IGlpLT5pc29fZnJhbWVfZGVzYyArCisJCQlpaS0+bnVtYmVyX29mX3BhY2tldHMgKyBzLT5zeW5jX3BhY2tldDsKKwkJbCA9IGlkLT5hY3R1YWxfbGVuZ3RoOworCisJCW9kW3BdLmxlbmd0aCA9IGw7CisJCW9kW3BdLm9mZnNldCA9IGlvLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCQlpby0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCArPSBsOworCX0KKworCWZvciAoOworCSAgICAgcy0+c3luY19wYWNrZXQgPCBpbnVyYi0+bnVtYmVyX29mX3BhY2tldHMgJiYgcCA8IHNrLT5uX29fcHM7CisJICAgICArK3AsICsrcy0+c3luY19wYWNrZXQpIHsKKwkJbCA9IGludXJiLT5pc29fZnJhbWVfZGVzY1tzLT5zeW5jX3BhY2tldF0uYWN0dWFsX2xlbmd0aDsKKworCQlpZiAocy0+aWRsZV9vdXRzaXplICsgaW8tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggKyBsID4KKwkJICAgIHMtPnBlcmlvZF9zaXplKQorCQkJZ290byBjaGVja19vazsKKworCQlvZFtwXS5sZW5ndGggPSBsOworCQlvZFtwXS5vZmZzZXQgPSBpby0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJaW8tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggKz0gbDsKKwl9CisKK2NoZWNrX29rOgorCXMtPnN5bmNfcGFja2V0IC09IGludXJiLT5udW1iZXJfb2ZfcGFja2V0czsKKwlpZiAocy0+c3luY19wYWNrZXQgPCAtMiB8fCBzLT5zeW5jX3BhY2tldCA+IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImludmFsaWQgc3luY19wYWNrZXQgPSAlaTsiCisJCQkgICAiIHA9JWkgbm9wPSVpICVpICV4ICV4ICV4ID4gJXhcbiIsCisJCQkgICBzLT5zeW5jX3BhY2tldCwgcCwgaW51cmItPm51bWJlcl9vZl9wYWNrZXRzLAorCQkJICAgcy0+aWRsZV9vdXRzaXplICsgaW8tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggKyBsLAorCQkJICAgcy0+aWRsZV9vdXRzaXplLCBpby0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgIGwsCisJCQkgICBzLT5wZXJpb2Rfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGlvLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICUgcy0+Y2ZnLmZyYW1lX3NpemUpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkciaW52YWxpZCBvdXRzaXplID0gJWlcbiIsCisJCQkgICBpby0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJCXJldHVybiAtMTsKKwl9CisJcy0+aWRsZV9vdXRzaXplICs9IGlvLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0gcy0+cGVyaW9kX3NpemU7CisJaW8tPm51bWJlcl9vZl9wYWNrZXRzID0gcDsKKwlpZiAocy0+aWRsZV9vdXRzaXplID4gMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiaWRsZT0laVxuIiwgcy0+aWRsZV9vdXRzaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9pbnVyYihpbnQgbnVtYmVyX29mX3BhY2tldHMsIHN0cnVjdCB1cmIgKml1KQoreworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppZDsKKwlpbnQgcDsKKworCWl1LT5udW1iZXJfb2ZfcGFja2V0cyA9IG51bWJlcl9vZl9wYWNrZXRzOworCWlkID0gaXUtPmlzb19mcmFtZV9kZXNjOworCWlkLT5vZmZzZXQgPSAwOworCWZvciAocCA9IDA7IHAgPCBpdS0+bnVtYmVyX29mX3BhY2tldHMgLSAxOyArK3ApCisJCWlkW3AgKyAxXS5vZmZzZXQgPSBpZFtwXS5vZmZzZXQgKyBpZFtwXS5sZW5ndGg7CisKKwlpdS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCWlkWzBdLmxlbmd0aCAqIGl1LT5udW1iZXJfb2ZfcGFja2V0czsKK30KKworc3RhdGljIGludCBzdWJtaXRfdXJicyhzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrLAorCQkgICAgICAgc3RydWN0IHVyYiAqaW51cmIsIHN0cnVjdCB1cmIgKm91dHVyYikKK3sKKwlpbnQgZXJyOworCXByZXBhcmVfaW51cmIoc2stPmlkbGVfb3V0dXJiLT5udW1iZXJfb2ZfcGFja2V0cywgc2stPmlkbGVfaW51cmIpOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHNrLT5pZGxlX2ludXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlaVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJc2stPmlkbGVfaW51cmIgPSBzay0+Y29tcGxldGVkX2ludXJiOworCXNrLT5jb21wbGV0ZWRfaW51cmIgPSBpbnVyYjsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYihzay0+aWRsZV9vdXR1cmIsIEdGUF9BVE9NSUMpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVpXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlzay0+aWRsZV9vdXR1cmIgPSBzay0+Y29tcGxldGVkX291dHVyYjsKKwlzay0+Y29tcGxldGVkX291dHVyYiA9IG91dHVyYjsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHX0xPT1BfQkFDSworLyoKKyAgVGhpcyBsb29wX2JhY2soKSBzaG93cyBob3cgdG8gcmVhZC93cml0ZSB0aGUgcGVyaW9kIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGxvb3BfYmFjayhzdHJ1Y3QgdXNiX3N0cmVhbSAqcykKK3sKKwljaGFyICppLCAqbzsKKwlpbnQgaWwsIG9sLCBsLCBwOworCXN0cnVjdCB1cmIgKml1OworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppZDsKKworCW8gPSBzLT5wbGF5YmFjazFzdF90bzsKKwlvbCA9IHMtPnBsYXliYWNrMXN0X3NpemU7CisJbCA9IDA7CisKKwlpZiAocy0+aW5zcGxpdF9wYWNrID49IDApIHsKKwkJaXUgPSBzay0+aWRsZV9pbnVyYjsKKwkJaWQgPSBpdS0+aXNvX2ZyYW1lX2Rlc2M7CisJCXAgPSBzLT5pbnNwbGl0X3BhY2s7CisJfSBlbHNlCisJCWdvdG8gc2Vjb25kOworbG9vcDoKKwlmb3IgKDsgcCA8IGl1LT5udW1iZXJfb2ZfcGFja2V0cyAmJiBsIDwgcy0+cGVyaW9kX3NpemU7ICsrcCkgeworCQlpID0gaXUtPnRyYW5zZmVyX2J1ZmZlciArIGlkW3BdLm9mZnNldDsKKwkJaWwgPSBpZFtwXS5hY3R1YWxfbGVuZ3RoOworCQlpZiAobCArIGlsID4gcy0+cGVyaW9kX3NpemUpCisJCQlpbCA9IHMtPnBlcmlvZF9zaXplIC0gbDsKKwkJaWYgKGlsIDw9IG9sKSB7CisJCQltZW1jcHkobywgaSwgaWwpOworCQkJbyArPSBpbDsKKwkJCW9sIC09IGlsOworCQl9IGVsc2UgeworCQkJbWVtY3B5KG8sIGksIG9sKTsKKwkJCXNpbmdlbl82cGFjayhvLCBvbCk7CisJCQlvID0gcy0+cGxheWJhY2tfdG87CisJCQltZW1jcHkobywgaSArIG9sLCBpbCAtIG9sKTsKKwkJCW8gKz0gaWwgLSBvbDsKKwkJCW9sID0gcy0+cGVyaW9kX3NpemUgLSBzLT5wbGF5YmFjazFzdF9zaXplOworCQl9CisJCWwgKz0gaWw7CisJfQorCWlmIChpdSA9PSBzay0+Y29tcGxldGVkX2ludXJiKSB7CisJCWlmIChsICE9IHMtPnBlcmlvZF9zaXplKQorCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6JWkgJWlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSAgICAgICBsLyhpbnQpcy0+Y2ZnLmZyYW1lX3NpemUpOworCisJCXJldHVybjsKKwl9CitzZWNvbmQ6CisJaXUgPSBzay0+Y29tcGxldGVkX2ludXJiOworCWlkID0gaXUtPmlzb19mcmFtZV9kZXNjOworCXAgPSAwOworCWdvdG8gbG9vcDsKKworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGxvb3BfYmFjayhzdHJ1Y3QgdXNiX3N0cmVhbSAqcykKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdHJlYW1faWRsZShzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrLAorCQkJc3RydWN0IHVyYiAqaW51cmIsIHN0cnVjdCB1cmIgKm91dHVyYikKK3sKKwlzdHJ1Y3QgdXNiX3N0cmVhbSAqcyA9IHNrLT5zOworCWludCBsLCBwOworCWludCBpbnNpemUgPSBzLT5pZGxlX2luc2l6ZTsKKwlpbnQgdXJiX3NpemUgPSAwOworCisJcy0+aW5wYWNrZXRfc3BsaXQgPSBzLT5uZXh0X2lucGFja2V0X3NwbGl0OworCXMtPmlucGFja2V0X3NwbGl0X2F0ID0gcy0+bmV4dF9pbnBhY2tldF9zcGxpdF9hdDsKKwlzLT5uZXh0X2lucGFja2V0X3NwbGl0ID0gLTE7CisJcy0+bmV4dF9pbnBhY2tldF9zcGxpdF9hdCA9IDA7CisKKwlmb3IgKHAgPSAwOyBwIDwgaW51cmItPm51bWJlcl9vZl9wYWNrZXRzOyArK3ApIHsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlkID0gaW51cmItPmlzb19mcmFtZV9kZXNjOworCQlsID0gaWRbcF0uYWN0dWFsX2xlbmd0aDsKKwkJaWYgKHVubGlrZWx5KGwgPT0gMCB8fCBpZFtwXS5zdGF0dXMpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAidW5kZXJydW4sIHN0YXR1cz0ldVxuIiwKKwkJCQkgICBpZFtwXS5zdGF0dXMpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCXMtPmlucGFja2V0X2hlYWQrKzsKKwkJcy0+aW5wYWNrZXRfaGVhZCAlPSBzLT5pbnBhY2tldHM7CisJCWlmIChzLT5pbnBhY2tldF9zcGxpdCA9PSAtMSkKKwkJCXMtPmlucGFja2V0X3NwbGl0ID0gcy0+aW5wYWNrZXRfaGVhZDsKKworCQlzLT5pbnBhY2tldFtzLT5pbnBhY2tldF9oZWFkXS5vZmZzZXQgPQorCQkJaWRbcF0ub2Zmc2V0ICsgKGludXJiLT50cmFuc2Zlcl9idWZmZXIgLSAodm9pZCAqKXMpOworCQlzLT5pbnBhY2tldFtzLT5pbnBhY2tldF9oZWFkXS5sZW5ndGggPSBsOworCQlpZiAoaW5zaXplICsgbCA+IHMtPnBlcmlvZF9zaXplICYmCisJCSAgICBzLT5uZXh0X2lucGFja2V0X3NwbGl0ID09IC0xKSB7CisJCQlzLT5uZXh0X2lucGFja2V0X3NwbGl0ID0gcy0+aW5wYWNrZXRfaGVhZDsKKwkJCXMtPm5leHRfaW5wYWNrZXRfc3BsaXRfYXQgPSBzLT5wZXJpb2Rfc2l6ZSAtIGluc2l6ZTsKKwkJfQorCQlpbnNpemUgKz0gbDsKKwkJdXJiX3NpemUgKz0gbDsKKwl9CisJcy0+aWRsZV9pbnNpemUgKz0gdXJiX3NpemUgLSBzLT5wZXJpb2Rfc2l6ZTsKKwlpZiAocy0+aWRsZV9pbnNpemUgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlaVxuIiwKKwkJCSAgIChzLT5pZGxlX2luc2l6ZSkvKGludClzLT5jZmcuZnJhbWVfc2l6ZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcy0+aW5zaXplX2RvbmUgKz0gdXJiX3NpemU7CisKKwlsID0gcy0+aWRsZV9vdXRzaXplOworCXMtPm91dHBhY2tldFswXS5vZmZzZXQgPSAoc2stPmlkbGVfb3V0dXJiLT50cmFuc2Zlcl9idWZmZXIgLQorCQkJCSAgc2stPndyaXRlX3BhZ2UpIC0gbDsKKworCWlmICh1c2Jfc3RyZWFtX3ByZXBhcmVfcGxheWJhY2soc2ssIGludXJiKSA8IDApCisJCWdvdG8gZXJyX291dDsKKworCXMtPm91dHBhY2tldFswXS5sZW5ndGggPSBzay0+aWRsZV9vdXR1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggKyBsOworCXMtPm91dHBhY2tldFsxXS5vZmZzZXQgPSBzay0+Y29tcGxldGVkX291dHVyYi0+dHJhbnNmZXJfYnVmZmVyIC0KKwkJc2stPndyaXRlX3BhZ2U7CisKKwlpZiAoc3VibWl0X3VyYnMoc2ssIGludXJiLCBvdXR1cmIpIDwgMCkKKwkJZ290byBlcnJfb3V0OworCisJbG9vcF9iYWNrKHMpOworCXMtPnBlcmlvZHNfZG9uZSsrOworCXdha2VfdXBfYWxsKCZzay0+c2xlZXApOworCXJldHVybjsKK2Vycl9vdXQ6CisJcy0+c3RhdGUgPSB1c2Jfc3RyZWFtX3hydW47CisJd2FrZV91cF9hbGwoJnNrLT5zbGVlcCk7Cit9CisKK3N0YXRpYyB2b2lkIGlfY2FwdHVyZV9pZGxlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrID0gdXJiLT5jb250ZXh0OworCWlmIChiYWxhbmNlX2NhcHR1cmUoc2ssIHVyYikpCisJCXN0cmVhbV9pZGxlKHNrLCB1cmIsIHNrLT5pX3VyYik7Cit9CisKK3N0YXRpYyB2b2lkIGlfcGxheWJhY2tfaWRsZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzayA9IHVyYi0+Y29udGV4dDsKKwlpZiAoYmFsYW5jZV9wbGF5YmFjayhzaywgdXJiKSkKKwkJc3RyZWFtX2lkbGUoc2ssIHNrLT5pX3VyYiwgdXJiKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtX3N0YXJ0KHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2ssCisJCQkgc3RydWN0IHVyYiAqaW51cmIsIHN0cnVjdCB1cmIgKm91dHVyYikKK3sKKwlzdHJ1Y3QgdXNiX3N0cmVhbSAqcyA9IHNrLT5zOworCWlmIChzLT5zdGF0ZSA+PSB1c2Jfc3RyZWFtX3N5bmMxKSB7CisJCWludCBsLCBwLCBtYXhfZGlmZiwgbWF4X2RpZmZfMDsKKwkJaW50IHVyYl9zaXplID0gMDsKKwkJdW5zaWduZWQgZnJhbWVzX3Blcl9wYWNrZXQsIG1pbl9mcmFtZXMgPSAwOworCQlmcmFtZXNfcGVyX3BhY2tldCA9IChzLT5wZXJpb2Rfc2l6ZSAtIHMtPmlkbGVfaW5zaXplKTsKKwkJZnJhbWVzX3Blcl9wYWNrZXQgPDw9IDg7CisJCWZyYW1lc19wZXJfcGFja2V0IC89CisJCQlzLT5jZmcuZnJhbWVfc2l6ZSAqIGludXJiLT5udW1iZXJfb2ZfcGFja2V0czsKKwkJZnJhbWVzX3Blcl9wYWNrZXQrKzsKKworCQltYXhfZGlmZl8wID0gcy0+Y2ZnLmZyYW1lX3NpemU7CisJCWlmIChzLT5jZmcucGVyaW9kX2ZyYW1lcyA+PSAyNTYpCisJCQltYXhfZGlmZl8wIDw8PSAxOworCQlpZiAocy0+Y2ZnLnBlcmlvZF9mcmFtZXMgPj0gMTAyNCkKKwkJCW1heF9kaWZmXzAgPDw9IDE7CisJCW1heF9kaWZmID0gbWF4X2RpZmZfMDsKKwkJZm9yIChwID0gMDsgcCA8IGludXJiLT5udW1iZXJfb2ZfcGFja2V0czsgKytwKSB7CisJCQlpbnQgZGlmZjsKKwkJCWwgPSBpbnVyYi0+aXNvX2ZyYW1lX2Rlc2NbcF0uYWN0dWFsX2xlbmd0aDsKKwkJCXVyYl9zaXplICs9IGw7CisKKwkJCW1pbl9mcmFtZXMgKz0gZnJhbWVzX3Blcl9wYWNrZXQ7CisJCQlkaWZmID0gdXJiX3NpemUgLQorCQkJCShtaW5fZnJhbWVzID4+IDgpICogcy0+Y2ZnLmZyYW1lX3NpemU7CisJCQlpZiAoZGlmZiA8IG1heF9kaWZmKSB7CisJCQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiJWkgJWkgJWkgJWlcbiIsCisJCQkJCSAgICBzLT5pbnNpemVfZG9uZSwKKwkJCQkJICAgIHVyYl9zaXplIC8gKGludClzLT5jZmcuZnJhbWVfc2l6ZSwKKwkJCQkJICAgIGludXJiLT5udW1iZXJfb2ZfcGFja2V0cywgZGlmZik7CisJCQkJbWF4X2RpZmYgPSBkaWZmOworCQkJfQorCQl9CisJCXMtPmlkbGVfaW5zaXplIC09IG1heF9kaWZmIC0gbWF4X2RpZmZfMDsKKwkJcy0+aWRsZV9pbnNpemUgKz0gdXJiX3NpemUgLSBzLT5wZXJpb2Rfc2l6ZTsKKwkJaWYgKHMtPmlkbGVfaW5zaXplIDwgMCkgeworCQkJc25kX3ByaW50aygiJWkgJWkgJWlcbiIsCisJCQkJICAgcy0+aWRsZV9pbnNpemUsIHVyYl9zaXplLCBzLT5wZXJpb2Rfc2l6ZSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAocy0+aWRsZV9pbnNpemUgPT0gMCkgeworCQkJcy0+bmV4dF9pbnBhY2tldF9zcGxpdCA9CisJCQkJKHMtPmlucGFja2V0X2hlYWQgKyAxKSAlIHMtPmlucGFja2V0czsKKwkJCXMtPm5leHRfaW5wYWNrZXRfc3BsaXRfYXQgPSAwOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgc3BsaXQgPSBzLT5pbnBhY2tldF9oZWFkOworCQkJbCA9IHMtPmlkbGVfaW5zaXplOworCQkJd2hpbGUgKGwgPiBzLT5pbnBhY2tldFtzcGxpdF0ubGVuZ3RoKSB7CisJCQkJbCAtPSBzLT5pbnBhY2tldFtzcGxpdF0ubGVuZ3RoOworCQkJCWlmIChzcGxpdCA9PSAwKQorCQkJCQlzcGxpdCA9IHMtPmlucGFja2V0cyAtIDE7CisJCQkJZWxzZQorCQkJCQlzcGxpdC0tOworCQkJfQorCQkJcy0+bmV4dF9pbnBhY2tldF9zcGxpdCA9IHNwbGl0OworCQkJcy0+bmV4dF9pbnBhY2tldF9zcGxpdF9hdCA9CisJCQkJcy0+aW5wYWNrZXRbc3BsaXRdLmxlbmd0aCAtIGw7CisJCX0KKworCQlzLT5pbnNpemVfZG9uZSArPSB1cmJfc2l6ZTsKKworCQlpZiAodXNiX3N0cmVhbV9wcmVwYXJlX3BsYXliYWNrKHNrLCBpbnVyYikgPCAwKQorCQkJcmV0dXJuOworCisJfSBlbHNlCisJCXBsYXliYWNrX3ByZXBfZnJlcW4oc2ssIHNrLT5pZGxlX291dHVyYik7CisKKwlpZiAoc3VibWl0X3VyYnMoc2ssIGludXJiLCBvdXR1cmIpIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKHMtPnN0YXRlID09IHVzYl9zdHJlYW1fc3luYzEgJiYgcy0+aW5zaXplX2RvbmUgPiAzNjAwMDApIHsKKwkJLyoganVzdCBndWVzc3dvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eICovCisJCXMtPnN0YXRlID0gdXNiX3N0cmVhbV9yZWFkeTsKKwkJc3Vic19zZXRfY29tcGxldGUoc2stPmludXJiLCBpX2NhcHR1cmVfaWRsZSk7CisJCXN1YnNfc2V0X2NvbXBsZXRlKHNrLT5vdXR1cmIsIGlfcGxheWJhY2tfaWRsZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpX2NhcHR1cmVfc3RhcnQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppZCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2M7CisJc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzayA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiX3N0cmVhbSAqcyA9IHNrLT5zOworCWludCBwOworCWludCBlbXB0eSA9IDA7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgInN0YXR1cz0laVxuIiwgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJZm9yIChwID0gMDsgcCA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7ICsrcCkgeworCQlpbnQgbCA9IGlkW3BdLmFjdHVhbF9sZW5ndGg7CisJCWlmIChsIDwgcy0+Y2ZnLmZyYW1lX3NpemUpIHsKKwkJCSsrZW1wdHk7CisJCQlpZiAocy0+c3RhdGUgPj0gdXNiX3N0cmVhbV9zeW5jMCkgeworCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlaVxuIiwgbCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXMtPmlucGFja2V0X2hlYWQrKzsKKwkJcy0+aW5wYWNrZXRfaGVhZCAlPSBzLT5pbnBhY2tldHM7CisJCXMtPmlucGFja2V0W3MtPmlucGFja2V0X2hlYWRdLm9mZnNldCA9CisJCQlpZFtwXS5vZmZzZXQgKyAodXJiLT50cmFuc2Zlcl9idWZmZXIgLSAodm9pZCAqKXMpOworCQlzLT5pbnBhY2tldFtzLT5pbnBhY2tldF9oZWFkXS5sZW5ndGggPSBsOworCX0KKyNpZmRlZiBTSE9XX0VNUFRZCisJaWYgKGVtcHR5KSB7CisJCXByaW50ayhLRVJOX0RFQlVHIiVzOiVpOiAlaSIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJICAgICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCk7CisJCWZvciAocGFjayA9IDE7IHBhY2sgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyArK3BhY2spIHsKKwkJCWludCBsID0gdXJiLT5pc29fZnJhbWVfZGVzY1twYWNrXS5hY3R1YWxfbGVuZ3RoOworCQkJcHJpbnRrKCIgJWkiLCBsKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJaWYgKCFlbXB0eSAmJiBzLT5zdGF0ZSA8IHVzYl9zdHJlYW1fc3luYzEpCisJCSsrcy0+c3RhdGU7CisKKwlpZiAoYmFsYW5jZV9jYXB0dXJlKHNrLCB1cmIpKQorCQlzdHJlYW1fc3RhcnQoc2ssIHVyYiwgc2stPmlfdXJiKTsKK30KKworc3RhdGljIHZvaWQgaV9wbGF5YmFja19zdGFydChzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzayA9IHVyYi0+Y29udGV4dDsKKwlpZiAoYmFsYW5jZV9wbGF5YmFjayhzaywgdXJiKSkKKwkJc3RyZWFtX3N0YXJ0KHNrLCBzay0+aV91cmIsIHVyYik7Cit9CisKK2ludCB1c2Jfc3RyZWFtX3N0YXJ0KHN0cnVjdCB1c2Jfc3RyZWFtX2tlcm5lbCAqc2spCit7CisJc3RydWN0IHVzYl9zdHJlYW0gKnMgPSBzay0+czsKKwlpbnQgZnJhbWUgPSAwLCBpdGVycyA9IDA7CisJaW50IHUsIGVycjsKKwlpbnQgdHJ5ID0gMDsKKworCWlmIChzLT5zdGF0ZSAhPSB1c2Jfc3RyZWFtX3N0b3BwZWQpCisJCXJldHVybiAtRUFHQUlOOworCisJc3Vic19zZXRfY29tcGxldGUoc2stPmludXJiLCBpX2NhcHR1cmVfc3RhcnQpOworCXN1YnNfc2V0X2NvbXBsZXRlKHNrLT5vdXR1cmIsIGlfcGxheWJhY2tfc3RhcnQpOworCW1lbXNldChzay0+d3JpdGVfcGFnZSwgMCwgcy0+d3JpdGVfc2l6ZSk7Citkb3RyeToKKwlzLT5pbnNpemVfZG9uZSA9IDA7CisJcy0+aWRsZV9pbnNpemUgPSAwOworCXMtPmlkbGVfb3V0c2l6ZSA9IDA7CisJcy0+c3luY19wYWNrZXQgPSAtMTsKKwlzLT5pbnBhY2tldF9oZWFkID0gLTE7CisJc2stPmlzb19mcmFtZV9iYWxhbmNlID0gMDsKKwkrK3RyeTsKKwlmb3IgKHUgPSAwOyB1IDwgMjsgdSsrKSB7CisJCXN0cnVjdCB1cmIgKmludXJiID0gc2stPmludXJiW3VdOworCQlzdHJ1Y3QgdXJiICpvdXR1cmIgPSBzay0+b3V0dXJiW3VdOworCQlwbGF5YmFja19wcmVwX2ZyZXFuKHNrLCBvdXR1cmIpOworCQlpbnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBvdXR1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCQlpbnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQlpbnVyYi0+bnVtYmVyX29mX3BhY2tldHMgKgorCQkJaW51cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aDsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCWlmICh1ID09IDApIHsKKwkJCWludCBub3c7CisJCQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW51cmItPmRldjsKKwkJCWZyYW1lID0gdXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihkZXYpOworCQkJZG8geworCQkJCW5vdyA9IHVzYl9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIoZGV2KTsKKwkJCQkrK2l0ZXJzOworCQkJfSB3aGlsZSAobm93ID4gLTEgJiYgbm93ID09IGZyYW1lKTsKKwkJfQorCQllcnIgPSB1c2Jfc3VibWl0X3VyYihpbnVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJc25kX3ByaW50ayhLRVJOX0VSUiJ1c2Jfc3VibWl0X3VyYihzay0+aW51cmJbJWldKSIKKwkJCQkgICAiIHJldHVybmVkICVpXG4iLCB1LCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSB1c2Jfc3VibWl0X3VyYihvdXR1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIidXNiX3N1Ym1pdF91cmIoc2stPm91dHVyYlslaV0pIgorCQkJCSAgICIgcmV0dXJuZWQgJWlcbiIsIHUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCWlmIChpbnVyYi0+c3RhcnRfZnJhbWUgIT0gb3V0dXJiLT5zdGFydF9mcmFtZSkgeworCQkJc25kX3ByaW50ZChLRVJOX0RFQlVHCisJCQkJICAgInVbJWldIHN0YXJ0X2ZyYW1lcyBkaWZmZXIgaW46JXUgb3V0OiV1XG4iLAorCQkJCSAgIHUsIGludXJiLT5zdGFydF9mcmFtZSwgb3V0dXJiLT5zdGFydF9mcmFtZSk7CisJCQlnb3RvIGNoZWNrX3JldHJ5OworCQl9CisJfQorCXNuZF9wcmludGRkKEtFUk5fREVCVUcgIiVpICVpXG4iLCBmcmFtZSwgaXRlcnMpOworCXRyeSA9IDA7CitjaGVja19yZXRyeToKKwlpZiAodHJ5KSB7CisJCXVzYl9zdHJlYW1fc3RvcChzayk7CisJCWlmICh0cnkgPCA1KSB7CisJCQltc2xlZXAoMTUwMCk7CisJCQlzbmRfcHJpbnRkKEtFUk5fREVCVUcgImdvdG8gZG90cnk7XG4iKTsKKwkJCWdvdG8gZG90cnk7CisJCX0KKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkciY291bGRuJ3Qgc3RhcnQiCisJCQkgICAiIGFsbCB1cmJzIG9uIHRoZSBzYW1lIHN0YXJ0X2ZyYW1lLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNrLT5pZGxlX2ludXJiID0gc2stPmludXJiW1VTQl9TVFJFQU1fTlVSQlMgLSAyXTsKKwlzay0+aWRsZV9vdXR1cmIgPSBzay0+b3V0dXJiW1VTQl9TVFJFQU1fTlVSQlMgLSAyXTsKKwlzay0+Y29tcGxldGVkX2ludXJiID0gc2stPmludXJiW1VTQl9TVFJFQU1fTlVSQlMgLSAxXTsKKwlzay0+Y29tcGxldGVkX291dHVyYiA9IHNrLT5vdXR1cmJbVVNCX1NUUkVBTV9OVVJCUyAtIDFdOworCisvKiB3YWl0LCBjaGVjayAqLworCXsKKwkJaW50IHdhaXRfbXMgPSAzMDAwOworCQl3aGlsZSAocy0+c3RhdGUgIT0gdXNiX3N0cmVhbV9yZWFkeSAmJiB3YWl0X21zID4gMCkgeworCQkJc25kX3ByaW50ZGQoS0VSTl9ERUJVRyAiJWlcbiIsIHMtPnN0YXRlKTsKKwkJCW1zbGVlcCgyMDApOworCQkJd2FpdF9tcyAtPSAyMDA7CisJCX0KKwl9CisKKwlyZXR1cm4gcy0+c3RhdGUgPT0gdXNiX3N0cmVhbV9yZWFkeSA/IDAgOiAtRUZBVUxUOworfQorCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIHVzYl9zdHJlYW1fc3RvcChzdHJ1Y3QgdXNiX3N0cmVhbV9rZXJuZWwgKnNrKQoreworCWludCB1OworCWlmICghc2stPnMpCisJCXJldHVybjsKKwlmb3IgKHUgPSAwOyB1IDwgVVNCX1NUUkVBTV9OVVJCUzsgKyt1KSB7CisJCXVzYl9raWxsX3VyYihzay0+aW51cmJbdV0pOworCQl1c2Jfa2lsbF91cmIoc2stPm91dHVyYlt1XSk7CisJfQorCXNrLT5zLT5zdGF0ZSA9IHVzYl9zdHJlYW1fc3RvcHBlZDsKKwltc2xlZXAoNDAwKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2Jfc3RyZWFtLmggYi9zb3VuZC91c2IvdXN4MnkvdXNiX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDc0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvdXN4MnkvdXNiX3N0cmVhbS5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEthcnN0ZW4gV2llc2UgPGZ6dUB3ZW1nZWhvZXJ0ZGVyc3RhYXQuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBVU0JfU1RSRUFNX0lOVEVSRkFDRV9WRVJTSU9OIDIKKworI2RlZmluZSBTTkRSVl9VU0JfU1RSRUFNX0lPQ1RMX1NFVF9QQVJBTVMgXAorCV9JT1coJ0gnLCAweDkwLCBzdHJ1Y3QgdXNiX3N0cmVhbV9jb25maWcpCisKK3N0cnVjdCB1c2Jfc3RyZWFtX3BhY2tldCB7CisJdW5zaWduZWQgb2Zmc2V0OworCXVuc2lnbmVkIGxlbmd0aDsKK307CisKKworc3RydWN0IHVzYl9zdHJlYW1fY29uZmlnIHsKKwl1bnNpZ25lZCB2ZXJzaW9uOworCXVuc2lnbmVkIHNhbXBsZV9yYXRlOworCXVuc2lnbmVkIHBlcmlvZF9mcmFtZXM7CisJdW5zaWduZWQgZnJhbWVfc2l6ZTsKK307CisKK3N0cnVjdCB1c2Jfc3RyZWFtIHsKKwlzdHJ1Y3QgdXNiX3N0cmVhbV9jb25maWcgY2ZnOworCXVuc2lnbmVkIHJlYWRfc2l6ZTsKKwl1bnNpZ25lZCB3cml0ZV9zaXplOworCisJaW50IHBlcmlvZF9zaXplOworCisJdW5zaWduZWQgc3RhdGU7CisKKwlpbnQgaWRsZV9pbnNpemU7CisJaW50IGlkbGVfb3V0c2l6ZTsKKwlpbnQgc3luY19wYWNrZXQ7CisJdW5zaWduZWQgaW5zaXplX2RvbmU7CisJdW5zaWduZWQgcGVyaW9kc19kb25lOworCXVuc2lnbmVkIHBlcmlvZHNfcG9sbGVkOworCisJc3RydWN0IHVzYl9zdHJlYW1fcGFja2V0IG91dHBhY2tldFsyXTsKKwl1bnNpZ25lZAkJIGlucGFja2V0czsKKwl1bnNpZ25lZAkJIGlucGFja2V0X2hlYWQ7CisJdW5zaWduZWQJCSBpbnBhY2tldF9zcGxpdDsKKwl1bnNpZ25lZAkJIGlucGFja2V0X3NwbGl0X2F0OworCXVuc2lnbmVkCQkgbmV4dF9pbnBhY2tldF9zcGxpdDsKKwl1bnNpZ25lZAkJIG5leHRfaW5wYWNrZXRfc3BsaXRfYXQ7CisJc3RydWN0IHVzYl9zdHJlYW1fcGFja2V0IGlucGFja2V0WzBdOworfTsKKworZW51bSB1c2Jfc3RyZWFtX3N0YXRlIHsKKwl1c2Jfc3RyZWFtX2ludmFsaWQsCisJdXNiX3N0cmVhbV9zdG9wcGVkLAorCXVzYl9zdHJlYW1fc3luYzAsCisJdXNiX3N0cmVhbV9zeW5jMSwKKwl1c2Jfc3RyZWFtX3JlYWR5LAorCXVzYl9zdHJlYW1fcnVubmluZywKKwl1c2Jfc3RyZWFtX3hydW4sCit9OworCisjaWYgX19LRVJORUxfXworCisjZGVmaW5lIFVTQl9TVFJFQU1fTlVSQlMgNAorI2RlZmluZSBVU0JfU1RSRUFNX1VSQkRFUFRIIDQKKworc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsIHsKKwlzdHJ1Y3QgdXNiX3N0cmVhbSAqczsKKworCXZvaWQgKndyaXRlX3BhZ2U7CisKKwl1bnNpZ25lZCBuX29fcHM7CisKKwlzdHJ1Y3QgdXJiICppbnVyYltVU0JfU1RSRUFNX05VUkJTXTsKKwlzdHJ1Y3QgdXJiICppZGxlX2ludXJiOworCXN0cnVjdCB1cmIgKmNvbXBsZXRlZF9pbnVyYjsKKwlzdHJ1Y3QgdXJiICpvdXR1cmJbVVNCX1NUUkVBTV9OVVJCU107CisJc3RydWN0IHVyYiAqaWRsZV9vdXR1cmI7CisJc3RydWN0IHVyYiAqY29tcGxldGVkX291dHVyYjsKKwlzdHJ1Y3QgdXJiICppX3VyYjsKKworCWludCBpc29fZnJhbWVfYmFsYW5jZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHNsZWVwOworCisJdW5zaWduZWQgb3V0X3BoYXNlOworCXVuc2lnbmVkIG91dF9waGFzZV9wZWVrZWQ7CisJdW5zaWduZWQgZnJlcW47Cit9OworCitzdHJ1Y3QgdXNiX3N0cmVhbSAqdXNiX3N0cmVhbV9uZXcoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICpzaywKKwkJCQkgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCQkJICB1bnNpZ25lZCBpbl9lbmRwb2ludCwgdW5zaWduZWQgb3V0X2VuZHBvaW50LAorCQkJCSAgdW5zaWduZWQgc2FtcGxlX3JhdGUsIHVuc2lnbmVkIHVzZV9wYWNrc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIHBlcmlvZF9mcmFtZXMsIHVuc2lnbmVkIGZyYW1lX3NpemUpOwordm9pZCB1c2Jfc3RyZWFtX2ZyZWUoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICopOworaW50IHVzYl9zdHJlYW1fc3RhcnQoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICopOwordm9pZCB1c2Jfc3RyZWFtX3N0b3Aoc3RydWN0IHVzYl9zdHJlYW1fa2VybmVsICopOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9hcGljLmMgYi92aXJ0L2t2bS9pb2FwaWMuYwppbmRleCBjMGQyMjg3Li41Mzc3MmJiIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb2FwaWMuYworKysgYi92aXJ0L2t2bS9pb2FwaWMuYwpAQCAtMzksNiArMzksNyBAQAogCiAjaW5jbHVkZSAiaW9hcGljLmgiCiAjaW5jbHVkZSAibGFwaWMuaCIKKyNpbmNsdWRlICJpcnEuaCIKIAogI2lmIDAKICNkZWZpbmUgaW9hcGljX2RlYnVnKGZtdCxhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgZm10LCMjYXJnKQpAQCAtMjg1LDI2ICsyODYsMzEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fa3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm1faW9hcGljICppb2FwaWMsIGludCBnc2kpCitzdGF0aWMgdm9pZCBfX2t2bV9pb2FwaWNfdXBkYXRlX2VvaShzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCBpbnQgZ3NpLAorCQkJCSAgICBpbnQgdHJpZ2dlcl9tb2RlKQogewogCXVuaW9uIGlvYXBpY19yZWRpcl9lbnRyeSAqZW50OwogCiAJZW50ID0gJmlvYXBpYy0+cmVkaXJ0YmxbZ3NpXTsKLQlBU1NFUlQoZW50LT5maWVsZHMudHJpZ19tb2RlID09IElPQVBJQ19MRVZFTF9UUklHKTsKIAotCWVudC0+ZmllbGRzLnJlbW90ZV9pcnIgPSAwOwotCWlmICghZW50LT5maWVsZHMubWFzayAmJiAoaW9hcGljLT5pcnIgJiAoMSA8PCBnc2kpKSkKLQkJaW9hcGljX3NlcnZpY2UoaW9hcGljLCBnc2kpOworCWt2bV9ub3RpZnlfYWNrZWRfaXJxKGlvYXBpYy0+a3ZtLCBnc2kpOworCisJaWYgKHRyaWdnZXJfbW9kZSA9PSBJT0FQSUNfTEVWRUxfVFJJRykgeworCQlBU1NFUlQoZW50LT5maWVsZHMudHJpZ19tb2RlID09IElPQVBJQ19MRVZFTF9UUklHKTsKKwkJZW50LT5maWVsZHMucmVtb3RlX2lyciA9IDA7CisJCWlmICghZW50LT5maWVsZHMubWFzayAmJiAoaW9hcGljLT5pcnIgJiAoMSA8PCBnc2kpKSkKKwkJCWlvYXBpY19zZXJ2aWNlKGlvYXBpYywgZ3NpKTsKKwl9CiB9CiAKLXZvaWQga3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3RvcikKK3ZvaWQga3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3RvciwgaW50IHRyaWdnZXJfbW9kZSkKIHsKIAlzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljID0ga3ZtLT5hcmNoLnZpb2FwaWM7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSU9BUElDX05VTV9QSU5TOyBpKyspCiAJCWlmIChpb2FwaWMtPnJlZGlydGJsW2ldLmZpZWxkcy52ZWN0b3IgPT0gdmVjdG9yKQotCQkJX19rdm1faW9hcGljX3VwZGF0ZV9lb2koaW9hcGljLCBpKTsKKwkJCV9fa3ZtX2lvYXBpY191cGRhdGVfZW9pKGlvYXBpYywgaSwgdHJpZ2dlcl9tb2RlKTsKIH0KIAogc3RhdGljIGludCBpb2FwaWNfaW5fcmFuZ2Uoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsIGdwYV90IGFkZHIsCkBAIC0zODAsNyArMzg2LDcgQEAKIAkJYnJlYWs7CiAjaWZkZWYJQ09ORklHX0lBNjQKIAljYXNlIElPQVBJQ19SRUdfRU9JOgotCQlrdm1faW9hcGljX3VwZGF0ZV9lb2koaW9hcGljLT5rdm0sIGRhdGEpOworCQlrdm1faW9hcGljX3VwZGF0ZV9lb2koaW9hcGljLT5rdm0sIGRhdGEsIElPQVBJQ19MRVZFTF9UUklHKTsKIAkJYnJlYWs7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9hcGljLmggYi92aXJ0L2t2bS9pb2FwaWMuaAppbmRleCA3ZjE2Njc1Li5jZDdhZTc2IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb2FwaWMuaAorKysgYi92aXJ0L2t2bS9pb2FwaWMuaApAQCAtNTgsNiArNTgsNyBAQAogCX0gcmVkaXJ0YmxbSU9BUElDX05VTV9QSU5TXTsKIAlzdHJ1Y3Qga3ZtX2lvX2RldmljZSBkZXY7CiAJc3RydWN0IGt2bSAqa3ZtOworCXZvaWQgKCphY2tfbm90aWZpZXIpKHZvaWQgKm9wYXF1ZSwgaW50IGlycSk7CiB9OwogCiAjaWZkZWYgREVCVUcKQEAgLTc4LDE2ICs3OSw5IEBACiAJcmV0dXJuIGt2bS0+YXJjaC52aW9hcGljOwogfQogCi0jaWZkZWYgQ09ORklHX0lBNjQKLXN0YXRpYyBpbmxpbmUgaW50IGlycWNoaXBfaW5fa2VybmVsKHN0cnVjdCBrdm0gKmt2bSkKLXsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCiBzdHJ1Y3Qga3ZtX3ZjcHUgKmt2bV9nZXRfbG93ZXN0X3ByaW9fdmNwdShzdHJ1Y3Qga3ZtICprdm0sIHU4IHZlY3RvciwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBiaXRtYXApOwotdm9pZCBrdm1faW9hcGljX3VwZGF0ZV9lb2koc3RydWN0IGt2bSAqa3ZtLCBpbnQgdmVjdG9yKTsKK3ZvaWQga3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3RvciwgaW50IHRyaWdnZXJfbW9kZSk7CiBpbnQga3ZtX2lvYXBpY19pbml0KHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9pb2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCBpbnQgaXJxLCBpbnQgbGV2ZWwpOwogdm9pZCBrdm1faW9hcGljX3Jlc2V0KHN0cnVjdCBrdm1faW9hcGljICppb2FwaWMpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaXJxX2NvbW0uYyBiL3ZpcnQva3ZtL2lycV9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNjlmNQotLS0gL2Rldi9udWxsCisrKyBiL3ZpcnQva3ZtL2lycV9jb21tLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIGlycV9jb21tLmM6IENvbW1vbiBBUEkgZm9yIGluIGtlcm5lbCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogQ29weXJpZ2h0IChjKSAyMDA3LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKiBBdXRob3JzOgorICogICBZYW96dSAoRWRkaWUpIERvbmcgPEVkZGllLmRvbmdAaW50ZWwuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlICJpcnEuaCIKKworI2luY2x1ZGUgImlvYXBpYy5oIgorCisvKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUga3ZtLT5sb2NrIG11dGV4IGhlbGQgKi8KK3ZvaWQga3ZtX3NldF9pcnEoc3RydWN0IGt2bSAqa3ZtLCBpbnQgaXJxLCBpbnQgbGV2ZWwpCit7CisJLyogTm90IHBvc3NpYmxlIHRvIGRldGVjdCBpZiB0aGUgZ3Vlc3QgdXNlcyB0aGUgUElDIG9yIHRoZQorCSAqIElPQVBJQy4gIFNvIHNldCB0aGUgYml0IGluIGJvdGguIFRoZSBndWVzdCB3aWxsIGlnbm9yZQorCSAqIHdyaXRlcyB0byB0aGUgdW51c2VkIG9uZS4KKwkgKi8KKwlrdm1faW9hcGljX3NldF9pcnEoa3ZtLT5hcmNoLnZpb2FwaWMsIGlycSwgbGV2ZWwpOworI2lmZGVmIENPTkZJR19YODYKKwlrdm1fcGljX3NldF9pcnEocGljX2lycWNoaXAoa3ZtKSwgaXJxLCBsZXZlbCk7CisjZW5kaWYKK30KKwordm9pZCBrdm1fbm90aWZ5X2Fja2VkX2lycShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGdzaSkKK3sKKwlzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW47CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShraWFuLCBuLCAma3ZtLT5hcmNoLmlycV9hY2tfbm90aWZpZXJfbGlzdCwgbGluaykKKwkJaWYgKGtpYW4tPmdzaSA9PSBnc2kpCisJCQlraWFuLT5pcnFfYWNrZWQoa2lhbik7Cit9CisKK3ZvaWQga3ZtX3JlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgIHN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciAqa2lhbikKK3sKKwlobGlzdF9hZGRfaGVhZCgma2lhbi0+bGluaywgJmt2bS0+YXJjaC5pcnFfYWNrX25vdGlmaWVyX2xpc3QpOworfQorCit2b2lkIGt2bV91bnJlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICAgc3RydWN0IGt2bV9pcnFfYWNrX25vdGlmaWVyICpraWFuKQoreworCWhsaXN0X2RlbCgma2lhbi0+bGluayk7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCA3ZGQ5YjBiLi5jZjBhYjhlIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTUxLDYgKzUxLDEyIEBACiAjaW5jbHVkZSAiY29hbGVzY2VkX21taW8uaCIKICNlbmRpZgogCisjaWZkZWYgS1ZNX0NBUF9ERVZJQ0VfQVNTSUdOTUVOVAorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgImlycS5oIgorI2VuZGlmCisKIE1PRFVMRV9BVVRIT1IoIlF1bXJhbmV0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTcxLDExICs3NywyNTMgQEAKIAogYm9vbCBrdm1fcmVib290aW5nOwogCisjaWZkZWYgS1ZNX0NBUF9ERVZJQ0VfQVNTSUdOTUVOVAorc3RhdGljIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqa3ZtX2ZpbmRfYXNzaWduZWRfZGV2KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCQkgICAgICBpbnQgYXNzaWduZWRfZGV2X2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOworCisJbGlzdF9mb3JfZWFjaChwdHIsIGhlYWQpIHsKKwkJbWF0Y2ggPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsLCBsaXN0KTsKKwkJaWYgKG1hdGNoLT5hc3NpZ25lZF9kZXZfaWQgPT0gYXNzaWduZWRfZGV2X2lkKQorCQkJcmV0dXJuIG1hdGNoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQga3ZtX2Fzc2lnbmVkX2Rldl9pbnRlcnJ1cHRfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldjsKKworCWFzc2lnbmVkX2RldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwsCisJCQkJICAgIGludGVycnVwdF93b3JrKTsKKworCS8qIFRoaXMgaXMgdGFrZW4gdG8gc2FmZWx5IGluamVjdCBpcnEgaW5zaWRlIHRoZSBndWVzdC4gV2hlbgorCSAqIHRoZSBpbnRlcnJ1cHQgaW5qZWN0aW9uIChvciB0aGUgaW9hcGljIGNvZGUpIHVzZXMgYQorCSAqIGZpbmVyLWdyYWluZWQgbG9jaywgdXBkYXRlIHRoaXMKKwkgKi8KKwltdXRleF9sb2NrKCZhc3NpZ25lZF9kZXYtPmt2bS0+bG9jayk7CisJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sCisJCSAgICBhc3NpZ25lZF9kZXYtPmd1ZXN0X2lycSwgMSk7CisJbXV0ZXhfdW5sb2NrKCZhc3NpZ25lZF9kZXYtPmt2bS0+bG9jayk7CisJa3ZtX3B1dF9rdm0oYXNzaWduZWRfZGV2LT5rdm0pOworfQorCisvKiBGSVhNRTogSW1wbGVtZW50IHRoZSBPUiBsb2dpYyBuZWVkZWQgdG8gbWFrZSBzaGFyZWQgaW50ZXJydXB0cyBvbgorICogdGhpcyBsaW5lIGJlaGF2ZSBwcm9wZXJseQorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qga3ZtX2Fzc2lnbmVkX2Rldl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldiA9CisJCShzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKikgZGV2X2lkOworCisJa3ZtX2dldF9rdm0oYXNzaWduZWRfZGV2LT5rdm0pOworCXNjaGVkdWxlX3dvcmsoJmFzc2lnbmVkX2Rldi0+aW50ZXJydXB0X3dvcmspOworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogQWNrIHRoZSBpcnEgbGluZSBmb3IgYW4gYXNzaWduZWQgZGV2aWNlICovCitzdGF0aWMgdm9pZCBrdm1fYXNzaWduZWRfZGV2X2Fja19pcnEoc3RydWN0IGt2bV9pcnFfYWNrX25vdGlmaWVyICpraWFuKQoreworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZGV2OworCisJaWYgKGtpYW4tPmdzaSA9PSAtMSkKKwkJcmV0dXJuOworCisJZGV2ID0gY29udGFpbmVyX29mKGtpYW4sIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKKwkJCSAgIGFja19ub3RpZmllcik7CisJa3ZtX3NldF9pcnEoZGV2LT5rdm0sIGRldi0+Z3Vlc3RfaXJxLCAwKTsKKwllbmFibGVfaXJxKGRldi0+aG9zdF9pcnEpOworfQorCitzdGF0aWMgdm9pZCBrdm1fZnJlZV9hc3NpZ25lZF9kZXZpY2Uoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsCisJCQkJICAgICAqYXNzaWduZWRfZGV2KQoreworCWlmIChpcnFjaGlwX2luX2tlcm5lbChrdm0pICYmIGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZCkKKwkJZnJlZV9pcnEoYXNzaWduZWRfZGV2LT5ob3N0X2lycSwgKHZvaWQgKilhc3NpZ25lZF9kZXYpOworCisJa3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sICZhc3NpZ25lZF9kZXYtPmFja19ub3RpZmllcik7CisKKwlpZiAoY2FuY2VsX3dvcmtfc3luYygmYXNzaWduZWRfZGV2LT5pbnRlcnJ1cHRfd29yaykpCisJCS8qIFdlIGhhZCBwZW5kaW5nIHdvcmsuIFRoYXQgbWVhbnMgd2Ugd2lsbCBoYXZlIHRvIHRha2UKKwkJICogY2FyZSBvZiBrdm1fcHV0X2t2bS4KKwkJICovCisJCWt2bV9wdXRfa3ZtKGt2bSk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGFzc2lnbmVkX2Rldi0+ZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYXNzaWduZWRfZGV2LT5kZXYpOworCXBjaV9kZXZfcHV0KGFzc2lnbmVkX2Rldi0+ZGV2KTsKKworCWxpc3RfZGVsKCZhc3NpZ25lZF9kZXYtPmxpc3QpOworCWtmcmVlKGFzc2lnbmVkX2Rldik7Cit9CisKK3ZvaWQga3ZtX2ZyZWVfYWxsX2Fzc2lnbmVkX2RldmljZXMoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKnB0cjI7CisJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXY7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBwdHIyLCAma3ZtLT5hcmNoLmFzc2lnbmVkX2Rldl9oZWFkKSB7CisJCWFzc2lnbmVkX2RldiA9IGxpc3RfZW50cnkocHRyLAorCQkJCQkgIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKKwkJCQkJICBsaXN0KTsKKworCQlrdm1fZnJlZV9hc3NpZ25lZF9kZXZpY2Uoa3ZtLCBhc3NpZ25lZF9kZXYpOworCX0KK30KKworc3RhdGljIGludCBrdm1fdm1faW9jdGxfYXNzaWduX2lycShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEKKwkJCQkgICAqYXNzaWduZWRfaXJxKQoreworCWludCByID0gMDsKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOworCisJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKKworCW1hdGNoID0ga3ZtX2ZpbmRfYXNzaWduZWRfZGV2KCZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQsCisJCQkJICAgICAgYXNzaWduZWRfaXJxLT5hc3NpZ25lZF9kZXZfaWQpOworCWlmICghbWF0Y2gpIHsKKwkJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWF0Y2gtPmlycV9yZXF1ZXN0ZWQpIHsKKwkJbWF0Y2gtPmd1ZXN0X2lycSA9IGFzc2lnbmVkX2lycS0+Z3Vlc3RfaXJxOworCQltYXRjaC0+YWNrX25vdGlmaWVyLmdzaSA9IGFzc2lnbmVkX2lycS0+Z3Vlc3RfaXJxOworCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCUlOSVRfV09SSygmbWF0Y2gtPmludGVycnVwdF93b3JrLAorCQkgIGt2bV9hc3NpZ25lZF9kZXZfaW50ZXJydXB0X3dvcmtfaGFuZGxlcik7CisKKwlpZiAoaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkgeworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHsKKwkJCXIgPSAtRVBFUk07CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisKKwkJaWYgKGFzc2lnbmVkX2lycS0+aG9zdF9pcnEpCisJCQltYXRjaC0+aG9zdF9pcnEgPSBhc3NpZ25lZF9pcnEtPmhvc3RfaXJxOworCQllbHNlCisJCQltYXRjaC0+aG9zdF9pcnEgPSBtYXRjaC0+ZGV2LT5pcnE7CisJCW1hdGNoLT5ndWVzdF9pcnEgPSBhc3NpZ25lZF9pcnEtPmd1ZXN0X2lycTsKKwkJbWF0Y2gtPmFja19ub3RpZmllci5nc2kgPSBhc3NpZ25lZF9pcnEtPmd1ZXN0X2lycTsKKwkJbWF0Y2gtPmFja19ub3RpZmllci5pcnFfYWNrZWQgPSBrdm1fYXNzaWduZWRfZGV2X2Fja19pcnE7CisJCWt2bV9yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKGt2bSwgJm1hdGNoLT5hY2tfbm90aWZpZXIpOworCisJCS8qIEV2ZW4gdGhvdWdoIHRoaXMgaXMgUENJLCB3ZSBkb24ndCB3YW50IHRvIHVzZSBzaGFyZWQKKwkJICogaW50ZXJydXB0cy4gU2hhcmluZyBob3N0IGRldmljZXMgd2l0aCBndWVzdC1hc3NpZ25lZCBkZXZpY2VzCisJCSAqIG9uIHRoZSBzYW1lIGludGVycnVwdCBsaW5lIGlzIG5vdCBhIGhhcHB5IHNpdHVhdGlvbjogdGhlcmUKKwkJICogYXJlIGdvaW5nIHRvIGJlIGxvbmcgZGVsYXlzIGluIGFjY2VwdGluZywgYWNraW5nLCBldGMuCisJCSAqLworCQlpZiAocmVxdWVzdF9pcnEobWF0Y2gtPmhvc3RfaXJxLCBrdm1fYXNzaWduZWRfZGV2X2ludHIsIDAsCisJCQkJImt2bV9hc3NpZ25lZF9kZXZpY2UiLCAodm9pZCAqKW1hdGNoKSkgeworCQkJciA9IC1FSU87CisJCQlnb3RvIG91dF9yZWxlYXNlOworCQl9CisJfQorCisJbWF0Y2gtPmlycV9yZXF1ZXN0ZWQgPSB0cnVlOworCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwlyZXR1cm4gcjsKK291dF9yZWxlYXNlOgorCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwlrdm1fZnJlZV9hc3NpZ25lZF9kZXZpY2Uoa3ZtLCBtYXRjaCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3ZtX2lvY3RsX2Fzc2lnbl9kZXZpY2Uoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiAqYXNzaWduZWRfZGV2KQoreworCWludCByID0gMDsKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCisJbWF0Y2ggPSBrdm1fZmluZF9hc3NpZ25lZF9kZXYoJmt2bS0+YXJjaC5hc3NpZ25lZF9kZXZfaGVhZCwKKwkJCQkgICAgICBhc3NpZ25lZF9kZXYtPmFzc2lnbmVkX2Rldl9pZCk7CisJaWYgKG1hdGNoKSB7CisJCS8qIGRldmljZSBhbHJlYWR5IGFzc2lnbmVkICovCisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltYXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCksIEdGUF9LRVJORUwpOworCWlmIChtYXRjaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoYXNzaWduZWRfZGV2LT5idXNuciwKKwkJCQkgICBhc3NpZ25lZF9kZXYtPmRldmZuKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaG9zdCBkZXZpY2Ugbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bGQgbm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisJciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCAia3ZtX2Fzc2lnbmVkX2RldmljZSIpOworCWlmIChyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZCBub3QgZ2V0IGFjY2VzcyB0byBkZXZpY2UgcmVnaW9uc1xuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisJbWF0Y2gtPmFzc2lnbmVkX2Rldl9pZCA9IGFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2lkOworCW1hdGNoLT5ob3N0X2J1c25yID0gYXNzaWduZWRfZGV2LT5idXNucjsKKwltYXRjaC0+aG9zdF9kZXZmbiA9IGFzc2lnbmVkX2Rldi0+ZGV2Zm47CisJbWF0Y2gtPmRldiA9IGRldjsKKworCW1hdGNoLT5rdm0gPSBrdm07CisKKwlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQpOworCisJaWYgKGFzc2lnbmVkX2Rldi0+ZmxhZ3MgJiBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUpIHsKKwkJciA9IGt2bV9pb21tdV9tYXBfZ3Vlc3Qoa3ZtLCBtYXRjaCk7CisJCWlmIChyKQorCQkJZ290byBvdXRfbGlzdF9kZWw7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCXJldHVybiByOworb3V0X2xpc3RfZGVsOgorCWxpc3RfZGVsKCZtYXRjaC0+bGlzdCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CitvdXRfcHV0OgorCXBjaV9kZXZfcHV0KGRldik7CitvdXRfZnJlZToKKwlrZnJlZShtYXRjaCk7CisJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCXJldHVybiByOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3ZjcHUoaW50IG4pCiB7CiAJcmV0dXJuIGxpa2VseShuID49IDAgJiYgbiA8IEtWTV9NQVhfVkNQVVMpOwogfQogCitpbmxpbmUgaW50IGt2bV9pc19tbWlvX3BmbihwZm5fdCBwZm4pCit7CisJaWYgKHBmbl92YWxpZChwZm4pKQorCQlyZXR1cm4gUGFnZVJlc2VydmVkKHBmbl90b19wYWdlKHBmbikpOworCisJcmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBTd2l0Y2hlcyB0byBzcGVjaWZpZWQgdmNwdSwgdW50aWwgYSBtYXRjaGluZyB2Y3B1X3B1dCgpCiAgKi8KQEAgLTU3MCw2ICs4MTgsMTIgQEAKIAl9CiAKIAlrdm1fZnJlZV9waHlzbWVtX3Nsb3QoJm9sZCwgJm5ldyk7CisjaWZkZWYgQ09ORklHX0RNQVIKKwkvKiBtYXAgdGhlIHBhZ2VzIGluIGlvbW11IHBhZ2UgdGFibGUgKi8KKwlyID0ga3ZtX2lvbW11X21hcF9wYWdlcyhrdm0sIGJhc2VfZ2ZuLCBucGFnZXMpOworCWlmIChyKQorCQlnb3RvIG91dDsKKyNlbmRpZgogCXJldHVybiAwOwogCiBvdXRfZnJlZToKQEAgLTcwOCw5ICs5NjIsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX2h2YSk7CiAKLS8qCi0gKiBSZXF1aXJlcyBjdXJyZW50LT5tbS0+bW1hcF9zZW0gdG8gYmUgaGVsZAotICovCiBwZm5fdCBnZm5fdG9fcGZuKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQogewogCXN0cnVjdCBwYWdlICpwYWdlWzFdOwpAQCAtNzI2LDIxICs5NzcsMjQgQEAKIAkJcmV0dXJuIHBhZ2VfdG9fcGZuKGJhZF9wYWdlKTsKIAl9CiAKLQlucGFnZXMgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgYWRkciwgMSwgMSwgMSwgcGFnZSwKLQkJCQlOVUxMKTsKKwlucGFnZXMgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIDEsIDEsIHBhZ2UpOwogCiAJaWYgKHVubGlrZWx5KG5wYWdlcyAhPSAxKSkgewogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAorCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsKKwogCQlpZiAodm1hID09IE5VTEwgfHwgYWRkciA8IHZtYS0+dm1fc3RhcnQgfHwKIAkJICAgICEodm1hLT52bV9mbGFncyAmIFZNX1BGTk1BUCkpIHsKKwkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJCQlnZXRfcGFnZShiYWRfcGFnZSk7CiAJCQlyZXR1cm4gcGFnZV90b19wZm4oYmFkX3BhZ2UpOwogCQl9CiAKIAkJcGZuID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKyB2bWEtPnZtX3Bnb2ZmOwotCQlCVUdfT04ocGZuX3ZhbGlkKHBmbikpOworCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlCVUdfT04oIWt2bV9pc19tbWlvX3BmbihwZm4pKTsKIAl9IGVsc2UKIAkJcGZuID0gcGFnZV90b19wZm4ocGFnZVswXSk7CiAKQEAgLTc1NCwxMCArMTAwOCwxMCBAQAogCXBmbl90IHBmbjsKIAogCXBmbiA9IGdmbl90b19wZm4oa3ZtLCBnZm4pOwotCWlmIChwZm5fdmFsaWQocGZuKSkKKwlpZiAoIWt2bV9pc19tbWlvX3BmbihwZm4pKQogCQlyZXR1cm4gcGZuX3RvX3BhZ2UocGZuKTsKIAotCVdBUk5fT04oIXBmbl92YWxpZChwZm4pKTsKKwlXQVJOX09OKGt2bV9pc19tbWlvX3BmbihwZm4pKTsKIAogCWdldF9wYWdlKGJhZF9wYWdlKTsKIAlyZXR1cm4gYmFkX3BhZ2U7CkBAIC03NzMsNyArMTAyNyw3IEBACiAKIHZvaWQga3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbl90IHBmbikKIHsKLQlpZiAocGZuX3ZhbGlkKHBmbikpCisJaWYgKCFrdm1faXNfbW1pb19wZm4ocGZuKSkKIAkJcHV0X3BhZ2UocGZuX3RvX3BhZ2UocGZuKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fcmVsZWFzZV9wZm5fY2xlYW4pOwpAQCAtNzk5LDcgKzEwNTMsNyBAQAogCiB2b2lkIGt2bV9zZXRfcGZuX2RpcnR5KHBmbl90IHBmbikKIHsKLQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKKwlpZiAoIWt2bV9pc19tbWlvX3BmbihwZm4pKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAkJaWYgKCFQYWdlUmVzZXJ2ZWQocGFnZSkpCiAJCQlTZXRQYWdlRGlydHkocGFnZSk7CkBAIC04MDksMTQgKzEwNjMsMTQgQEAKIAogdm9pZCBrdm1fc2V0X3Bmbl9hY2Nlc3NlZChwZm5fdCBwZm4pCiB7Ci0JaWYgKHBmbl92YWxpZChwZm4pKQorCWlmICgha3ZtX2lzX21taW9fcGZuKHBmbikpCiAJCW1hcmtfcGFnZV9hY2Nlc3NlZChwZm5fdG9fcGFnZShwZm4pKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9zZXRfcGZuX2FjY2Vzc2VkKTsKIAogdm9pZCBrdm1fZ2V0X3BmbihwZm5fdCBwZm4pCiB7Ci0JaWYgKHBmbl92YWxpZChwZm4pKQorCWlmICgha3ZtX2lzX21taW9fcGZuKHBmbikpCiAJCWdldF9wYWdlKHBmbl90b19wYWdlKHBmbikpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2dldF9wZm4pOwpAQCAtOTcyLDEyICsxMjI2LDEyIEBACiAJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXQoJnZjcHUtPndxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAotCQlpZiAoa3ZtX2NwdV9oYXNfaW50ZXJydXB0KHZjcHUpKQorCQlpZiAoa3ZtX2NwdV9oYXNfaW50ZXJydXB0KHZjcHUpIHx8CisJCSAgICBrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpIHx8CisJCSAgICBrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHZjcHUpKSB7CisJCQlzZXRfYml0KEtWTV9SRVFfVU5IQUxULCAmdmNwdS0+cmVxdWVzdHMpOwogCQkJYnJlYWs7Ci0JCWlmIChrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpKQotCQkJYnJlYWs7Ci0JCWlmIChrdm1fYXJjaF92Y3B1X3J1bm5hYmxlKHZjcHUpKQotCQkJYnJlYWs7CisJCX0KIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CiAKQEAgLTEwNzQsMTIgKzEzMjgsMTEgQEAKIAogCXIgPSBrdm1fYXJjaF92Y3B1X3NldHVwKHZjcHUpOwogCWlmIChyKQotCQlnb3RvIHZjcHVfZGVzdHJveTsKKwkJcmV0dXJuIHI7CiAKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCWlmIChrdm0tPnZjcHVzW25dKSB7CiAJCXIgPSAtRUVYSVNUOwotCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiAJCWdvdG8gdmNwdV9kZXN0cm95OwogCX0KIAlrdm0tPnZjcHVzW25dID0gdmNwdTsKQEAgLTEwOTUsOCArMTM0OCw4IEBACiB1bmxpbms6CiAJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKIAlrdm0tPnZjcHVzW25dID0gTlVMTDsKLQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiB2Y3B1X2Rlc3Ryb3k6CisJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOwogCWt2bV9hcmNoX3ZjcHVfZGVzdHJveSh2Y3B1KTsKIAlyZXR1cm4gcjsKIH0KQEAgLTExMTgsNiArMTM3MSw4IEBACiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByOworCXN0cnVjdCBrdm1fZnB1ICpmcHUgPSBOVUxMOworCXN0cnVjdCBrdm1fc3JlZ3MgKmt2bV9zcmVncyA9IE5VTEw7CiAKIAlpZiAodmNwdS0+a3ZtLT5tbSAhPSBjdXJyZW50LT5tbSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xMTY1LDI1ICsxNDIwLDI4IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9HRVRfU1JFR1M6IHsKLQkJc3RydWN0IGt2bV9zcmVncyBrdm1fc3JlZ3M7Ci0KLQkJbWVtc2V0KCZrdm1fc3JlZ3MsIDAsIHNpemVvZiBrdm1fc3JlZ3MpOwotCQlyID0ga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfc3JlZ3ModmNwdSwgJmt2bV9zcmVncyk7CisJCWt2bV9zcmVncyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fc3JlZ3MpLCBHRlBfS0VSTkVMKTsKKwkJciA9IC1FTk9NRU07CisJCWlmICgha3ZtX3NyZWdzKQorCQkJZ290byBvdXQ7CisJCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9zcmVncyh2Y3B1LCBrdm1fc3JlZ3MpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAma3ZtX3NyZWdzLCBzaXplb2Yga3ZtX3NyZWdzKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBrdm1fc3JlZ3MsIHNpemVvZihzdHJ1Y3Qga3ZtX3NyZWdzKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9TRVRfU1JFR1M6IHsKLQkJc3RydWN0IGt2bV9zcmVncyBrdm1fc3JlZ3M7Ci0KLQkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NyZWdzLCBhcmdwLCBzaXplb2Yga3ZtX3NyZWdzKSkKKwkJa3ZtX3NyZWdzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9zcmVncyksIEdGUF9LRVJORUwpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKCFrdm1fc3JlZ3MpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X3NyZWdzKHZjcHUsICZrdm1fc3JlZ3MpOworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGt2bV9zcmVncywgYXJncCwgc2l6ZW9mKHN0cnVjdCBrdm1fc3JlZ3MpKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfc3JlZ3ModmNwdSwga3ZtX3NyZWdzKTsKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CkBAIC0xMjY0LDI1ICsxNTIyLDI4IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9HRVRfRlBVOiB7Ci0JCXN0cnVjdCBrdm1fZnB1IGZwdTsKLQotCQltZW1zZXQoJmZwdSwgMCwgc2l6ZW9mIGZwdSk7Ci0JCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9mcHUodmNwdSwgJmZwdSk7CisJCWZwdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fZnB1KSwgR0ZQX0tFUk5FTCk7CisJCXIgPSAtRU5PTUVNOworCQlpZiAoIWZwdSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2FyY2hfdmNwdV9pb2N0bF9nZXRfZnB1KHZjcHUsIGZwdSk7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZmcHUsIHNpemVvZiBmcHUpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGZwdSwgc2l6ZW9mKHN0cnVjdCBrdm1fZnB1KSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwogCX0KIAljYXNlIEtWTV9TRVRfRlBVOiB7Ci0JCXN0cnVjdCBrdm1fZnB1IGZwdTsKLQotCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHUsIGFyZ3AsIHNpemVvZiBmcHUpKQorCQlmcHUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX2ZwdSksIEdGUF9LRVJORUwpOworCQlyID0gLUVOT01FTTsKKwkJaWYgKCFmcHUpCiAJCQlnb3RvIG91dDsKLQkJciA9IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2ZwdSh2Y3B1LCAmZnB1KTsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihmcHUsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qga3ZtX2ZwdSkpKQorCQkJZ290byBvdXQ7CisJCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9mcHUodmNwdSwgZnB1KTsKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CkBAIC0xMjkyLDYgKzE1NTMsOCBAQAogCQlyID0ga3ZtX2FyY2hfdmNwdV9pb2N0bChmaWxwLCBpb2N0bCwgYXJnKTsKIAl9CiBvdXQ6CisJa2ZyZWUoZnB1KTsKKwlrZnJlZShrdm1fc3JlZ3MpOwogCXJldHVybiByOwogfQogCkBAIC0xMzYwLDYgKzE2MjMsMzAgQEAKIAkJYnJlYWs7CiAJfQogI2VuZGlmCisjaWZkZWYgS1ZNX0NBUF9ERVZJQ0VfQVNTSUdOTUVOVAorCWNhc2UgS1ZNX0FTU0lHTl9QQ0lfREVWSUNFOiB7CisJCXN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiBhc3NpZ25lZF9kZXY7CisKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXNzaWduZWRfZGV2LCBhcmdwLCBzaXplb2YgYXNzaWduZWRfZGV2KSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX3ZtX2lvY3RsX2Fzc2lnbl9kZXZpY2Uoa3ZtLCAmYXNzaWduZWRfZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX0FTU0lHTl9JUlE6IHsKKwkJc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgYXNzaWduZWRfaXJxOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFzc2lnbmVkX2lycSwgYXJncCwgc2l6ZW9mIGFzc2lnbmVkX2lycSkpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV92bV9pb2N0bF9hc3NpZ25faXJxKGt2bSwgJmFzc2lnbmVkX2lycSk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXIgPSBrdm1fYXJjaF92bV9pb2N0bChmaWxwLCBpb2N0bCwgYXJnKTsKIAl9CkBAIC0xMzY5LDE3ICsxNjU2LDIyIEBACiAKIHN0YXRpYyBpbnQga3ZtX3ZtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZVsxXTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IG5wYWdlczsKKwlnZm5fdCBnZm4gPSB2bWYtPnBnb2ZmOwogCXN0cnVjdCBrdm0gKmt2bSA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JaWYgKCFrdm1faXNfdmlzaWJsZV9nZm4oa3ZtLCB2bWYtPnBnb2ZmKSkKKwlhZGRyID0gZ2ZuX3RvX2h2YShrdm0sIGdmbik7CisJaWYgKGt2bV9pc19lcnJvcl9odmEoYWRkcikpCiAJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0JcGFnZSA9IGdmbl90b19wYWdlKGt2bSwgdm1mLT5wZ29mZik7Ci0JaWYgKGlzX2Vycm9yX3BhZ2UocGFnZSkpIHsKLQkJa3ZtX3JlbGVhc2VfcGFnZV9jbGVhbihwYWdlKTsKKworCW5wYWdlcyA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBhZGRyLCAxLCAxLCAwLCBwYWdlLAorCQkJCU5VTEwpOworCWlmICh1bmxpa2VseShucGFnZXMgIT0gMSkpCiAJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0JfQotCXZtZi0+cGFnZSA9IHBhZ2U7CisKKwl2bWYtPnBhZ2UgPSBwYWdlWzBdOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fdHJhY2UuYyBiL3ZpcnQva3ZtL2t2bV90cmFjZS5jCmluZGV4IDU4MTQxZjMuLjQxZGNjODQgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2t2bV90cmFjZS5jCisrKyBiL3ZpcnQva3ZtL2t2bV90cmFjZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAKQEAgLTM1LDE2ICszNiwxNiBAQAogc3RydWN0IGt2bV90cmFjZV9wcm9iZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBjaGFyICpmb3JtYXQ7Ci0JdTMyIGN5Y2xlX2luOworCXUzMiB0aW1lc3RhbXBfaW47CiAJbWFya2VyX3Byb2JlX2Z1bmMgKnByb2JlX2Z1bmM7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBjYWxjX3JlY19zaXplKGludCBjeWNsZSwgaW50IGV4dHJhKQorc3RhdGljIGlubGluZSBpbnQgY2FsY19yZWNfc2l6ZShpbnQgdGltZXN0YW1wLCBpbnQgZXh0cmEpCiB7CiAJaW50IHJlY19zaXplID0gS1ZNX1RSQ19IRUFEX1NJWkU7CiAKIAlyZWNfc2l6ZSArPSBleHRyYTsKLQlyZXR1cm4gY3ljbGUgPyByZWNfc2l6ZSArPSBLVk1fVFJDX0NZQ0xFX1NJWkUgOiByZWNfc2l6ZTsKKwlyZXR1cm4gdGltZXN0YW1wID8gcmVjX3NpemUgKz0gS1ZNX1RSQ19DWUNMRV9TSVpFIDogcmVjX3NpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9hZGRfdHJhY2Uodm9pZCAqcHJvYmVfcHJpdmF0ZSwgdm9pZCAqY2FsbF9kYXRhLApAQCAtNTQsMTIgKzU1LDEzIEBACiAJc3RydWN0IGt2bV90cmFjZSAqa3QgPSBrdm1fdHJhY2U7CiAJc3RydWN0IGt2bV90cmFjZV9yZWMgcmVjOwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKLQlpbnQgICAgaSwgZXh0cmEsIHNpemU7CisJaW50ICAgIGksIHNpemU7CisJdTMyICAgIGV4dHJhOwogCiAJaWYgKHVubGlrZWx5KGt0LT50cmFjZV9zdGF0ZSAhPSBLVk1fVFJBQ0VfU1RBVEVfUlVOTklORykpCiAJCXJldHVybjsKIAotCXJlYy5ldmVudAk9IHZhX2FyZygqYXJncywgdTMyKTsKKwlyZWMucmVjX3ZhbAk9IFRSQUNFX1JFQ19FVkVOVF9JRCh2YV9hcmcoKmFyZ3MsIHUzMikpOwogCXZjcHUJCT0gdmFfYXJnKCphcmdzLCBzdHJ1Y3Qga3ZtX3ZjcHUgKik7CiAJcmVjLnBpZAkJPSBjdXJyZW50LT50Z2lkOwogCXJlYy52Y3B1X2lkCT0gdmNwdS0+dmNwdV9pZDsKQEAgLTY3LDIxICs2OSwyMSBAQAogCWV4dHJhICAgCT0gdmFfYXJnKCphcmdzLCB1MzIpOwogCVdBUk5fT04oIShleHRyYSA8PSBLVk1fVFJDX0VYVFJBX01BWCkpOwogCWV4dHJhIAkJPSBtaW5fdCh1MzIsIGV4dHJhLCBLVk1fVFJDX0VYVFJBX01BWCk7Ci0JcmVjLmV4dHJhX3UzMiAgID0gZXh0cmE7CiAKLQlyZWMuY3ljbGVfaW4gCT0gcC0+Y3ljbGVfaW47CisJcmVjLnJlY192YWwgfD0gVFJBQ0VfUkVDX1RDUyhwLT50aW1lc3RhbXBfaW4pCisJCQl8IFRSQUNFX1JFQ19OVU1fREFUQV9BUkdTKGV4dHJhKTsKIAotCWlmIChyZWMuY3ljbGVfaW4pIHsKLQkJcmVjLnUuY3ljbGUuY3ljbGVfdTY0ID0gZ2V0X2N5Y2xlcygpOworCWlmIChwLT50aW1lc3RhbXBfaW4pIHsKKwkJcmVjLnUudGltZXN0YW1wLnRpbWVzdGFtcCA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcmVjLmV4dHJhX3UzMjsgaSsrKQotCQkJcmVjLnUuY3ljbGUuZXh0cmFfdTMyW2ldID0gdmFfYXJnKCphcmdzLCB1MzIpOworCQlmb3IgKGkgPSAwOyBpIDwgZXh0cmE7IGkrKykKKwkJCXJlYy51LnRpbWVzdGFtcC5leHRyYV91MzJbaV0gPSB2YV9hcmcoKmFyZ3MsIHUzMik7CiAJfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IHJlYy5leHRyYV91MzI7IGkrKykKLQkJCXJlYy51Lm5vY3ljbGUuZXh0cmFfdTMyW2ldID0gdmFfYXJnKCphcmdzLCB1MzIpOworCQlmb3IgKGkgPSAwOyBpIDwgZXh0cmE7IGkrKykKKwkJCXJlYy51Lm5vdGltZXN0YW1wLmV4dHJhX3UzMltpXSA9IHZhX2FyZygqYXJncywgdTMyKTsKIAl9CiAKLQlzaXplID0gY2FsY19yZWNfc2l6ZShyZWMuY3ljbGVfaW4sIHJlYy5leHRyYV91MzIgKiBzaXplb2YodTMyKSk7CisJc2l6ZSA9IGNhbGNfcmVjX3NpemUocC0+dGltZXN0YW1wX2luLCBleHRyYSAqIHNpemVvZih1MzIpKTsKIAlyZWxheV93cml0ZShrdC0+cmNoYW4sICZyZWMsIHNpemUpOwogfQogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS92dGQuYyBiL3ZpcnQva3ZtL3Z0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzA4NzQKLS0tIC9kZXYvbnVsbAorKysgYi92aXJ0L2t2bS92dGQuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA4CisgKiBBdXRob3I6IEFsbGVuIE0uIEtheSA8YWxsZW4ubS5rYXlAaW50ZWwuY29tPgorICogQXV0aG9yOiBXZWlkb25nIEhhbiA8d2VpZG9uZy5oYW5AaW50ZWwuY29tPgorICogQXV0aG9yOiBCZW4tQW1pIFlhc3NvdXIgPGJlbmFtaUBpbC5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZWwtaW9tbXUuaD4KKworc3RhdGljIGludCBrdm1faW9tbXVfdW5tYXBfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtKTsKK3N0YXRpYyB2b2lkIGt2bV9pb21tdV9wdXRfcGFnZXMoc3RydWN0IGt2bSAqa3ZtLAorCQkJCWdmbl90IGJhc2VfZ2ZuLCB1bnNpZ25lZCBsb25nIG5wYWdlcyk7CisKK2ludCBrdm1faW9tbXVfbWFwX3BhZ2VzKHN0cnVjdCBrdm0gKmt2bSwKKwkJCWdmbl90IGJhc2VfZ2ZuLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3sKKwlnZm5fdCBnZm4gPSBiYXNlX2dmbjsKKwlwZm5fdCBwZm47CisJaW50IGksIHIgPSAwOworCXN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluID0ga3ZtLT5hcmNoLmludGVsX2lvbW11X2RvbWFpbjsKKworCS8qIGNoZWNrIGlmIGlvbW11IGV4aXN0cyBhbmQgaW4gdXNlICovCisJaWYgKCFkb21haW4pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCS8qIGNoZWNrIGlmIGFscmVhZHkgbWFwcGVkICovCisJCXBmbiA9IChwZm5fdClpbnRlbF9pb21tdV9pb3ZhX3RvX3Bmbihkb21haW4sCisJCQkJCQkgICAgIGdmbl90b19ncGEoZ2ZuKSk7CisJCWlmIChwZm4pCisJCQljb250aW51ZTsKKworCQlwZm4gPSBnZm5fdG9fcGZuKGt2bSwgZ2ZuKTsKKwkJciA9IGludGVsX2lvbW11X3BhZ2VfbWFwcGluZyhkb21haW4sCisJCQkJCSAgICAgZ2ZuX3RvX2dwYShnZm4pLAorCQkJCQkgICAgIHBmbl90b19ocGEocGZuKSwKKwkJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgRE1BX1BURV9SRUFEIHwKKwkJCQkJICAgICBETUFfUFRFX1dSSVRFKTsKKwkJaWYgKHIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAia3ZtX2lvbW11X21hcF9wYWdlczoiCisJCQkgICAgICAgImlvbW11IGZhaWxlZCB0byBtYXAgcGZuPSVseFxuIiwgcGZuKTsKKwkJCWdvdG8gdW5tYXBfcGFnZXM7CisJCX0KKwkJZ2ZuKys7CisJfQorCXJldHVybiAwOworCit1bm1hcF9wYWdlczoKKwlrdm1faW9tbXVfcHV0X3BhZ2VzKGt2bSwgYmFzZV9nZm4sIGkpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGt2bV9pb21tdV9tYXBfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtKQoreworCWludCBpLCByOworCisJZG93bl9yZWFkKCZrdm0tPnNsb3RzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBrdm0tPm5tZW1zbG90czsgaSsrKSB7CisJCXIgPSBrdm1faW9tbXVfbWFwX3BhZ2VzKGt2bSwga3ZtLT5tZW1zbG90c1tpXS5iYXNlX2dmbiwKKwkJCQkJa3ZtLT5tZW1zbG90c1tpXS5ucGFnZXMpOworCQlpZiAocikKKwkJCWJyZWFrOworCX0KKwl1cF9yZWFkKCZrdm0tPnNsb3RzX2xvY2spOworCXJldHVybiByOworfQorCitpbnQga3ZtX2lvbW11X21hcF9ndWVzdChzdHJ1Y3Qga3ZtICprdm0sCisJCQlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IHI7CisKKwlpZiAoIWludGVsX2lvbW11X2ZvdW5kKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZWwgaW9tbXUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJWVC1kIGRpcmVjdCBtYXA6IGhvc3QgYmRmID0gJXg6JXg6JXhcbiIsCisJICAgICAgIGFzc2lnbmVkX2Rldi0+aG9zdF9idXNuciwKKwkgICAgICAgUENJX1NMT1QoYXNzaWduZWRfZGV2LT5ob3N0X2RldmZuKSwKKwkgICAgICAgUENJX0ZVTkMoYXNzaWduZWRfZGV2LT5ob3N0X2RldmZuKSk7CisKKwlwZGV2ID0gYXNzaWduZWRfZGV2LT5kZXY7CisKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCWlmIChrdm0tPmFyY2guaW50ZWxfaW9tbXVfZG9tYWluKSB7CisJCQlpbnRlbF9pb21tdV9kb21haW5fZXhpdChrdm0tPmFyY2guaW50ZWxfaW9tbXVfZG9tYWluKTsKKwkJCWt2bS0+YXJjaC5pbnRlbF9pb21tdV9kb21haW4gPSBOVUxMOworCQl9CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWt2bS0+YXJjaC5pbnRlbF9pb21tdV9kb21haW4gPSBpbnRlbF9pb21tdV9kb21haW5fYWxsb2MocGRldik7CisJaWYgKCFrdm0tPmFyY2guaW50ZWxfaW9tbXVfZG9tYWluKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXIgPSBrdm1faW9tbXVfbWFwX21lbXNsb3RzKGt2bSk7CisJaWYgKHIpCisJCWdvdG8gb3V0X3VubWFwOworCisJaW50ZWxfaW9tbXVfZGV0YWNoX2Rldihrdm0tPmFyY2guaW50ZWxfaW9tbXVfZG9tYWluLAorCQkJICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisKKwlyID0gaW50ZWxfaW9tbXVfY29udGV4dF9tYXBwaW5nKGt2bS0+YXJjaC5pbnRlbF9pb21tdV9kb21haW4sCisJCQkJCXBkZXYpOworCWlmIChyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRG9tYWluIGNvbnRleHQgbWFwIGZvciAlcyBmYWlsZWQiLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlrdm1faW9tbXVfdW5tYXBfbWVtc2xvdHMoa3ZtKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQga3ZtX2lvbW11X3B1dF9wYWdlcyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgICAgZ2ZuX3QgYmFzZV9nZm4sIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCWdmbl90IGdmbiA9IGJhc2VfZ2ZuOworCXBmbl90IHBmbjsKKwlzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiA9IGt2bS0+YXJjaC5pbnRlbF9pb21tdV9kb21haW47CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJcGZuID0gKHBmbl90KWludGVsX2lvbW11X2lvdmFfdG9fcGZuKGRvbWFpbiwKKwkJCQkJCSAgICAgZ2ZuX3RvX2dwYShnZm4pKTsKKwkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CisJCWdmbisrOworCX0KK30KKworc3RhdGljIGludCBrdm1faW9tbXVfdW5tYXBfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtKQoreworCWludCBpOworCWRvd25fcmVhZCgma3ZtLT5zbG90c19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwga3ZtLT5ubWVtc2xvdHM7IGkrKykgeworCQlrdm1faW9tbXVfcHV0X3BhZ2VzKGt2bSwga3ZtLT5tZW1zbG90c1tpXS5iYXNlX2dmbiwKKwkJCQkgICAga3ZtLT5tZW1zbG90c1tpXS5ucGFnZXMpOworCX0KKwl1cF9yZWFkKCZrdm0tPnNsb3RzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1faW9tbXVfdW5tYXBfZ3Vlc3Qoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZW50cnk7CisJc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4gPSBrdm0tPmFyY2guaW50ZWxfaW9tbXVfZG9tYWluOworCisJLyogY2hlY2sgaWYgaW9tbXUgZXhpc3RzIGFuZCBpbiB1c2UgKi8KKwlpZiAoIWRvbWFpbikKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAma3ZtLT5hcmNoLmFzc2lnbmVkX2Rldl9oZWFkLCBsaXN0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJWVC1kIHVubWFwOiBob3N0IGJkZiA9ICV4OiV4OiV4XG4iLAorCQkgICAgICAgZW50cnktPmhvc3RfYnVzbnIsCisJCSAgICAgICBQQ0lfU0xPVChlbnRyeS0+aG9zdF9kZXZmbiksCisJCSAgICAgICBQQ0lfRlVOQyhlbnRyeS0+aG9zdF9kZXZmbikpOworCisJCS8qIGRldGFjaCBrdm0gZG1hciBkb21haW4gKi8KKwkJaW50ZWxfaW9tbXVfZGV0YWNoX2Rldihkb21haW4sIGVudHJ5LT5ob3N0X2J1c25yLAorCQkJCSAgICAgICBlbnRyeS0+aG9zdF9kZXZmbik7CisJfQorCWt2bV9pb21tdV91bm1hcF9tZW1zbG90cyhrdm0pOworCWludGVsX2lvbW11X2RvbWFpbl9leGl0KGRvbWFpbik7CisJcmV0dXJuIDA7Cit9Cg==